diff --git a/.gitignore b/.gitignore index 722d5e71d9..255f7bad16 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .vscode +opa diff --git a/.travis.yml b/.travis.yml index 54bfe39c1f..1887341e4b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,4 @@ language: go - -install: ./install-deps-gen-code.sh - +go: + - 1.5 + - 1.6 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000..5b9f103eaf --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,6 @@ +# Change Log + +All notable changes to this project will be documented in this file. This +project adheres to [Semantic Versioning](http://semver.org/). + +## Unreleased diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..7c9f6390d5 --- /dev/null +++ b/Makefile @@ -0,0 +1,35 @@ +# Copyright 2015 The OPA Authors. All rights reserved. +# Use of this source code is governed by an Apache2 +# license that can be found in the LICENSE file. + +PACKAGES := github.com/open-policy-agent/opa/jsonlog/.../ \ + github.com/open-policy-agent/opa/cmd/.../ + +BUILD_COMMIT := $(shell ./build/get-build-commit.sh) +BUILD_TIMESTAMP := $(shell ./build/get-build-timestamp.sh) +BUILD_HOSTNAME := $(shell ./build/get-build-hostname.sh) + +LDFLAGS := -ldflags "-X github.com/open-policy-agent/opa/version.Vcs=$(BUILD_COMMIT) \ + -X github.com/open-policy-agent/opa/version.Timestamp=$(BUILD_TIMESTAMP) \ + -X github.com/open-policy-agent/opa/version.Hostname=$(BUILD_HOSTNAME)" + +GO := go + +GO15VENDOREXPERIMENT := 1 +export GO15VENDOREXPERIMENT + +.PHONY: all generate build test clean + +all: build test + +generate: + $(GO) generate + +build: + $(GO) build -o opa $(LDFLAGS) + +test: + $(GO) test -v $(PACKAGES) + +clean: + rm -f ./opa diff --git a/build/get-build-commit.sh b/build/get-build-commit.sh new file mode 100755 index 0000000000..5c386553cf --- /dev/null +++ b/build/get-build-commit.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +GIT_SHA=$(git rev-parse --short HEAD) + +if [ -z "$(git status --porcelain 2>/dev/null)" ]; then + echo $GIT_SHA +else + echo "$GIT_SHA-dirty" +fi diff --git a/build/get-build-hostname.sh b/build/get-build-hostname.sh new file mode 100755 index 0000000000..0ed5c926ce --- /dev/null +++ b/build/get-build-hostname.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +hostname -f diff --git a/build/get-build-timestamp.sh b/build/get-build-timestamp.sh new file mode 100755 index 0000000000..8ba5567b6d --- /dev/null +++ b/build/get-build-timestamp.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +date -u +"%Y-%m-%dT%H:%M:%SZ" diff --git a/cmd/commands.go b/cmd/commands.go new file mode 100644 index 0000000000..f043c9048b --- /dev/null +++ b/cmd/commands.go @@ -0,0 +1,15 @@ +// Copyright 2016 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +package cmd + +import "github.com/spf13/cobra" +import "path" +import "os" + +var RootCommand = &cobra.Command{ + Use: path.Base(os.Args[0]), + Short: "Open Policy Agent (OPA)", + Long: "An open source project to policy enable any application.", +} diff --git a/cmd/version.go b/cmd/version.go new file mode 100644 index 0000000000..956157d7d9 --- /dev/null +++ b/cmd/version.go @@ -0,0 +1,25 @@ +// Copyright 2016 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +package cmd + +import "fmt" +import "github.com/spf13/cobra" +import "github.com/open-policy-agent/opa/version" + +var versionCommand = &cobra.Command{ + Use: "version", + Short: "Print the version of OPA", + Long: "Show version and build information for OPA.", + Run: func(cmd *cobra.Command, args []string) { + fmt.Println("Version: " + version.Version) + fmt.Println("Build Commit: " + version.Vcs) + fmt.Println("Build Timestamp: " + version.Timestamp) + fmt.Println("Build Hostname: " + version.Hostname) + }, +} + +func init() { + RootCommand.AddCommand(versionCommand) +} diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md new file mode 100644 index 0000000000..a24c705359 --- /dev/null +++ b/docs/DEVELOPMENT.md @@ -0,0 +1,112 @@ +# Development + +## Environment + +OPA is written in the [Go](https://golang.org) programming language. + +If you are not familiar with Go we recommend you read through the [How to Write Go +Code](https://golang.org/doc/code.html) article to familiarize yourself with the standard Go development environment. + +Requirements: + +- Git +- GitHub account (if you are contributing) +- Go (version 1.5.x and 1.6.x are supported) +- GNU Make + +## Getting Started + +After cloning the repository, you can run `make all` to build the project and +execute all of the tests. If this succeeds, there should be a binary +in the top directory (opa). + +Verify the build was successful by running `opa version`. + +You can re-build the project with `make build` and execute all of the tests +with `make test`. + +## Workflow + +1. Go to [https://github.com/open-policy-agent/opa](https://github.com/open-policy-agent/opa) and fork the repository + into your account by clicking the "Fork" button. + +1. Clone the fork to your local machine. + + ``` + cd $GOPATH + mkdir -p src/github.com/open-policy-agent + cd src/github.com/open-policy-agent + git clone git@github.com//opa.git opa + cd opa + git remote add upstream https://github.com/open-policy-agent/opa.git + ``` + +1. Create a branch for your changes. + + ``` + git checkout -b somefeature + ``` + +1. Update your local branch with upstream. + + ``` + git fetch upstream + git rebase upstream/master + ``` + +1. Develop your changes and regularly update your local branch against upstream. + + - Make sure you run `go fmt` on your code before submitting a Pull Request. + +1. Commit changes and push to your fork. + + ``` + git commit + git push origin somefeature + ``` + +1. Submit a Pull Request via https://github.com/\/opa. You + should be prompted to with a "Compare and Pull Request" button that + mentions your branch. + +1. Once your Pull Request has been reviewed and signed off please squash your + commits. If you have a specific reason to leave multiple commits in the + Pull Request, please mention it in the discussion. + + > If you are not familiar with squashing commits, see [the following blog post for a good overview](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html). + +## Dependencies + +[Glide](https://github.com/Masterminds/glide) is a command line tool used for +dependency management. You must have Glide installed in order to add new +dependencies or update existing dependencies. If you are not changing +dependencies you do not have to install Glide, all of the dependencies are +contained in the vendor directory. + +If you need to add a dependency to the project: + +1. Run `glide get ` to download the package. + - This command should be used instead of `go get `. + - The package will be stored under the vendor directory. + - The glide.yaml file will be updated. +1. Manually remove the VCS directories (e.g., .git, .hg, etc.) from the new + vendor directories. +1. Commit the changes in glide.yaml, glide.lock, and new vendor directories. + +If you need to update the dependencies: + +1. Run `glide update --update-vendored`. +1. Commit the changes to the glide.lock file and any files under the vendor + directory. + +## Opalog + +If you need to modify the Opalog syntax you must update jsonlog/parser.peg +and run `make generate` to re-generate the parser code. + +> If you encounter an error because "pigeon" is not installed, run `glide +> rebuild` to build and install the vendored dependencies (which include the +> parser generator). Note, you will need to have [Glide](https://github.com/Masterminds/glide) +> installed for this. + +Commit the changes to the parser.peg and parser.go files. diff --git a/docs/RELEASE.md b/docs/RELEASE.md new file mode 100644 index 0000000000..e1b641e036 --- /dev/null +++ b/docs/RELEASE.md @@ -0,0 +1,80 @@ +# Release Process + +## Overview + +The release process consists of three phases: versioning, building, and +publishing. + +Versioning involves maintaining the CHANGELOG.md and version.go files inside +the repository and tagging the repository to identify specific releases. + +Building involves obtaining a copy of the repository, checking out the release +tag, and building the packages. + +Publishing involves creating a new *Release* on GitHub with the relevant +CHANGELOG.md snippet and uploading the packages from the build phase. + +## Versioning + +1. Obtain copy of remote repository. + + ``` + git clone git@github.com/open-policy-agent/opa.git + ``` + +1. Edit CHANGELOG.md to update the Unreleased header (e.g., s/Unreleased/0.12.8/) and add any missing items to prepare for release. + +1. Edit version/version.go to set Version variable to prepare for release (e.g., s/Version = “0.12.8-dev”/Version = "0.12.8”/). + +1. Commit the changes and push to remote repository. + + ``` + git commit -a -m “Prepare v release” + git push origin master + ``` + +1. Tag repository with release version and push tags to remote repository. + + ``` + git tag v + git push origin --tags + ``` + +1. Edit CHANGELOG.md to add back the Unreleased header to prepare for development. + +1. Edit version/version.go to set Version variable to prepare for development (e.g., s/Version = “0.12.8”/Version = “0.12.9-dev”/). + +1. Commit the changes and push to remote repository. + + ``` + git commit -a -m “Prepare v development” + git push origin master + ``` + +## Building + +1. Obtain copy of remote repository. + + ``` + git clone git@github.com/open-policy-agent/opa.git + ``` + +1. Checkout release tag. + + ``` + git checkout v + ``` + +1. Run command to build packages. This will produce a bunch of binaries (e.g., amd64/linux, i386/linux, amd64/darwin, etc.) that can be published (“distributions”). + + ``` + make dist + ``` + +## Publishing + +1. Open browser and go to https://github.com/open-policy-agent/opa/releases + +1. Create a new release for the version. + - Copy the changelog content into the message. + - Upload the distributions packages. diff --git a/glide.lock b/glide.lock new file mode 100644 index 0000000000..95a8dfa3b0 --- /dev/null +++ b/glide.lock @@ -0,0 +1,77 @@ +hash: 60660dbeea966624ef47c09512b10812b4fd5e9e82876d915ca69d72dbc3157c +updated: 2016-03-29T17:05:39.985980976-07:00 +imports: +- name: github.com/armon/consul-api + version: dcfedd50ed5334f96adee43fc88518a4f095e15c + repo: https://github.com/armon/consul-api +- name: github.com/BurntSushi/toml + version: bbd5bb678321a0d6e58f1099321dfa73391c1b6f + repo: https://github.com/BurntSushi/toml +- name: github.com/coreos/go-etcd + version: 003851be7bb0694fe3cc457a49529a19388ee7cf + repo: https://github.com/coreos/go-etcd +- name: github.com/cpuguy83/go-md2man + version: 2724a9c9051aa62e9cca11304e7dd518e9e41599 + repo: https://github.com/cpuguy83/go-md2man +- name: github.com/hashicorp/hcl + version: 2604f3bda7e8960c1be1063709e7d7f0765048d0 + repo: https://github.com/hashicorp/hcl +- name: github.com/kr/pretty + version: add1dbc86daf0f983cd4a48ceb39deb95c729b67 + repo: https://github.com/kr/pretty +- name: github.com/kr/pty + version: f7ee69f31298ecbe5d2b349c711e2547a617d398 + repo: https://github.com/kr/pty +- name: github.com/kr/text + version: bb797dc4fb8320488f47bf11de07a733d7233e1f + repo: https://github.com/kr/text +- name: github.com/magiconair/properties + version: c265cfa48dda6474e208715ca93e987829f572f8 + repo: https://github.com/magiconair/properties +- name: github.com/mitchellh/mapstructure + version: d2dd0262208475919e1a362f675cfc0e7c10e905 + repo: https://github.com/mitchellh/mapstructure +- name: github.com/PuerkitoBio/pigeon + version: a5221784523de14130c00a8c389148a1b2ad260c +- name: github.com/russross/blackfriday + version: b43df972fb5fdf3af8d2e90f38a69d374fe26dd0 + repo: https://github.com/russross/blackfriday +- name: github.com/shurcooL/sanitized_anchor_name + version: 10ef21a441db47d8b13ebcc5fd2310f636973c77 + repo: https://github.com/shurcooL/sanitized_anchor_name +- name: github.com/spf13/cast + version: 27b586b42e29bec072fe7379259cc719e1289da6 + repo: https://github.com/spf13/cast +- name: github.com/spf13/cobra + version: c678ff029ee250b65714e518f4f5c5cb934955de +- name: github.com/spf13/jwalterweatherman + version: 33c24e77fb80341fe7130ee7c594256ff08ccc46 + repo: https://github.com/spf13/jwalterweatherman +- name: github.com/spf13/pflag + version: 7f60f83a2c81bc3c3c0d5297f61ddfa68da9d3b7 +- name: github.com/spf13/viper + version: c975dc1b4eacf4ec7fdbf0873638de5d090ba323 + repo: https://github.com/spf13/viper +- name: github.com/ugorji/go + version: a396ed22fc049df733440d90efe17475e3929ccb + repo: https://github.com/ugorji/go +- name: github.com/xordataexchange/crypt + version: 749e360c8f236773f28fc6d3ddfce4a470795227 + repo: https://github.com/xordataexchange/crypt +- name: golang.org/x/crypto + version: 9e7f5dc375abeb9619ea3c5c58502c428f457aa2 +- name: golang.org/x/net + version: 31df19d69da8728e9220def59b80ee577c3e48bf +- name: golang.org/x/text + version: 1b466db55e0ba5d56ef5315c728216b42f796491 +- name: golang.org/x/tools + version: 84e7bc0dd39bab24b696dde4d714641fa738f945 + subpackages: + - cmd/goimports +- name: gopkg.in/fsnotify.v1 + version: 875cf421b32f8f1b31bd43776297876d01542279 + repo: https://gopkg.in/fsnotify.v1 +- name: gopkg.in/yaml.v2 + version: a83829b6f1293c91addabc89d0571c246397bbf4 + repo: https://gopkg.in/yaml.v2 +devImports: [] diff --git a/glide.yaml b/glide.yaml new file mode 100644 index 0000000000..daa416d80d --- /dev/null +++ b/glide.yaml @@ -0,0 +1,7 @@ +package: github.com/open-policy-agent/opa +import: + - package: github.com/PuerkitoBio/pigeon + - package: golang.org/x/tools + subpackages: + - cmd/goimports + - package: github.com/spf13/cobra diff --git a/install-deps-gen-code.sh b/install-deps-gen-code.sh deleted file mode 100755 index f0d8b64f51..0000000000 --- a/install-deps-gen-code.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env sh - -# install dependencies -go get -u github.com/PuerkitoBio/pigeon -go get golang.org/x/tools/cmd/goimports - -# generate source code for parser. Delete first so no silent errors. -rm src/jsonlog/parser.go -pigeon src/jsonlog/jsonlog.peg | goimports > src/jsonlog/parser.go - - diff --git a/src/jsonlog/jsonlog.peg b/jsonlog/jsonlog.peg similarity index 100% rename from src/jsonlog/jsonlog.peg rename to jsonlog/jsonlog.peg diff --git a/src/jsonlog/parser.go b/jsonlog/parser.go similarity index 100% rename from src/jsonlog/parser.go rename to jsonlog/parser.go diff --git a/src/jsonlog/parser_test.go b/jsonlog/parser_test.go similarity index 100% rename from src/jsonlog/parser_test.go rename to jsonlog/parser_test.go diff --git a/src/jsonlog/syntax.go b/jsonlog/syntax.go similarity index 100% rename from src/jsonlog/syntax.go rename to jsonlog/syntax.go diff --git a/src/jsonlog/syntax_test.go b/jsonlog/syntax_test.go similarity index 100% rename from src/jsonlog/syntax_test.go rename to jsonlog/syntax_test.go diff --git a/main.go b/main.go new file mode 100644 index 0000000000..28db270ed8 --- /dev/null +++ b/main.go @@ -0,0 +1,21 @@ +// Copyright 2016 The OPA Authors. All rights reserved. +// Use of this source code is governed by an Apache2 +// license that can be found in the LICENSE file. + +package main + +import "fmt" +import "os" +import "github.com/open-policy-agent/opa/cmd" + +func main() { + if err := cmd.RootCommand.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} + +// Opalog parser generation: +// +//go:generate pigeon -o jsonlog/parser.go jsonlog/jsonlog.peg +//go:generate goimports -w jsonlog/parser.go diff --git a/src/main.go b/src/main.go deleted file mode 100644 index a1c70da90b..0000000000 --- a/src/main.go +++ /dev/null @@ -1,8 +0,0 @@ -package main - -import "fmt" - -func main() { - fmt.Println("Hello world") -} - diff --git a/vendor/github.com/BurntSushi/toml/.gitignore b/vendor/github.com/BurntSushi/toml/.gitignore new file mode 100644 index 0000000000..0cd3800377 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/.gitignore @@ -0,0 +1,5 @@ +TAGS +tags +.*.swp +tomlcheck/tomlcheck +toml.test diff --git a/vendor/github.com/BurntSushi/toml/.travis.yml b/vendor/github.com/BurntSushi/toml/.travis.yml new file mode 100644 index 0000000000..43caf6d021 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/.travis.yml @@ -0,0 +1,12 @@ +language: go +go: + - 1.1 + - 1.2 + - tip +install: + - go install ./... + - go get github.com/BurntSushi/toml-test +script: + - export PATH="$PATH:$HOME/gopath/bin" + - make test + diff --git a/vendor/github.com/BurntSushi/toml/COMPATIBLE b/vendor/github.com/BurntSushi/toml/COMPATIBLE new file mode 100644 index 0000000000..21e0938cae --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/COMPATIBLE @@ -0,0 +1,3 @@ +Compatible with TOML version +[v0.2.0](https://github.com/mojombo/toml/blob/master/versions/toml-v0.2.0.md) + diff --git a/vendor/github.com/BurntSushi/toml/COPYING b/vendor/github.com/BurntSushi/toml/COPYING new file mode 100644 index 0000000000..5a8e332545 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/COPYING @@ -0,0 +1,14 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + diff --git a/vendor/github.com/BurntSushi/toml/Makefile b/vendor/github.com/BurntSushi/toml/Makefile new file mode 100644 index 0000000000..3600848d33 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/Makefile @@ -0,0 +1,19 @@ +install: + go install ./... + +test: install + go test -v + toml-test toml-test-decoder + toml-test -encoder toml-test-encoder + +fmt: + gofmt -w *.go */*.go + colcheck *.go */*.go + +tags: + find ./ -name '*.go' -print0 | xargs -0 gotags > TAGS + +push: + git push origin master + git push github master + diff --git a/vendor/github.com/BurntSushi/toml/README.md b/vendor/github.com/BurntSushi/toml/README.md new file mode 100644 index 0000000000..5a5df63709 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/README.md @@ -0,0 +1,220 @@ +## TOML parser and encoder for Go with reflection + +TOML stands for Tom's Obvious, Minimal Language. This Go package provides a +reflection interface similar to Go's standard library `json` and `xml` +packages. This package also supports the `encoding.TextUnmarshaler` and +`encoding.TextMarshaler` interfaces so that you can define custom data +representations. (There is an example of this below.) + +Spec: https://github.com/mojombo/toml + +Compatible with TOML version +[v0.2.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.2.0.md) + +Documentation: http://godoc.org/github.com/BurntSushi/toml + +Installation: + +```bash +go get github.com/BurntSushi/toml +``` + +Try the toml validator: + +```bash +go get github.com/BurntSushi/toml/cmd/tomlv +tomlv some-toml-file.toml +``` + +[![Build status](https://api.travis-ci.org/BurntSushi/toml.png)](https://travis-ci.org/BurntSushi/toml) + + +### Testing + +This package passes all tests in +[toml-test](https://github.com/BurntSushi/toml-test) for both the decoder +and the encoder. + +### Examples + +This package works similarly to how the Go standard library handles `XML` +and `JSON`. Namely, data is loaded into Go values via reflection. + +For the simplest example, consider some TOML file as just a list of keys +and values: + +```toml +Age = 25 +Cats = [ "Cauchy", "Plato" ] +Pi = 3.14 +Perfection = [ 6, 28, 496, 8128 ] +DOB = 1987-07-05T05:45:00Z +``` + +Which could be defined in Go as: + +```go +type Config struct { + Age int + Cats []string + Pi float64 + Perfection []int + DOB time.Time // requires `import time` +} +``` + +And then decoded with: + +```go +var conf Config +if _, err := toml.Decode(tomlData, &conf); err != nil { + // handle error +} +``` + +You can also use struct tags if your struct field name doesn't map to a TOML +key value directly: + +```toml +some_key_NAME = "wat" +``` + +```go +type TOML struct { + ObscureKey string `toml:"some_key_NAME"` +} +``` + +### Using the `encoding.TextUnmarshaler` interface + +Here's an example that automatically parses duration strings into +`time.Duration` values: + +```toml +[[song]] +name = "Thunder Road" +duration = "4m49s" + +[[song]] +name = "Stairway to Heaven" +duration = "8m03s" +``` + +Which can be decoded with: + +```go +type song struct { + Name string + Duration duration +} +type songs struct { + Song []song +} +var favorites songs +if _, err := toml.Decode(blob, &favorites); err != nil { + log.Fatal(err) +} + +for _, s := range favorites.Song { + fmt.Printf("%s (%s)\n", s.Name, s.Duration) +} +``` + +And you'll also need a `duration` type that satisfies the +`encoding.TextUnmarshaler` interface: + +```go +type duration struct { + time.Duration +} + +func (d *duration) UnmarshalText(text []byte) error { + var err error + d.Duration, err = time.ParseDuration(string(text)) + return err +} +``` + +### More complex usage + +Here's an example of how to load the example from the official spec page: + +```toml +# This is a TOML document. Boom. + +title = "TOML Example" + +[owner] +name = "Tom Preston-Werner" +organization = "GitHub" +bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." +dob = 1979-05-27T07:32:00Z # First class dates? Why not? + +[database] +server = "192.168.1.1" +ports = [ 8001, 8001, 8002 ] +connection_max = 5000 +enabled = true + +[servers] + + # You can indent as you please. Tabs or spaces. TOML don't care. + [servers.alpha] + ip = "10.0.0.1" + dc = "eqdc10" + + [servers.beta] + ip = "10.0.0.2" + dc = "eqdc10" + +[clients] +data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it + +# Line breaks are OK when inside arrays +hosts = [ + "alpha", + "omega" +] +``` + +And the corresponding Go types are: + +```go +type tomlConfig struct { + Title string + Owner ownerInfo + DB database `toml:"database"` + Servers map[string]server + Clients clients +} + +type ownerInfo struct { + Name string + Org string `toml:"organization"` + Bio string + DOB time.Time +} + +type database struct { + Server string + Ports []int + ConnMax int `toml:"connection_max"` + Enabled bool +} + +type server struct { + IP string + DC string +} + +type clients struct { + Data [][]interface{} + Hosts []string +} +``` + +Note that a case insensitive match will be tried if an exact match can't be +found. + +A working example of the above can be found in `_examples/example.{go,toml}`. + diff --git a/vendor/github.com/BurntSushi/toml/_examples/example.go b/vendor/github.com/BurntSushi/toml/_examples/example.go new file mode 100644 index 0000000000..79f31f2758 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/_examples/example.go @@ -0,0 +1,61 @@ +package main + +import ( + "fmt" + "time" + + "github.com/BurntSushi/toml" +) + +type tomlConfig struct { + Title string + Owner ownerInfo + DB database `toml:"database"` + Servers map[string]server + Clients clients +} + +type ownerInfo struct { + Name string + Org string `toml:"organization"` + Bio string + DOB time.Time +} + +type database struct { + Server string + Ports []int + ConnMax int `toml:"connection_max"` + Enabled bool +} + +type server struct { + IP string + DC string +} + +type clients struct { + Data [][]interface{} + Hosts []string +} + +func main() { + var config tomlConfig + if _, err := toml.DecodeFile("example.toml", &config); err != nil { + fmt.Println(err) + return + } + + fmt.Printf("Title: %s\n", config.Title) + fmt.Printf("Owner: %s (%s, %s), Born: %s\n", + config.Owner.Name, config.Owner.Org, config.Owner.Bio, + config.Owner.DOB) + fmt.Printf("Database: %s %v (Max conn. %d), Enabled? %v\n", + config.DB.Server, config.DB.Ports, config.DB.ConnMax, + config.DB.Enabled) + for serverName, server := range config.Servers { + fmt.Printf("Server: %s (%s, %s)\n", serverName, server.IP, server.DC) + } + fmt.Printf("Client data: %v\n", config.Clients.Data) + fmt.Printf("Client hosts: %v\n", config.Clients.Hosts) +} diff --git a/vendor/github.com/BurntSushi/toml/_examples/example.toml b/vendor/github.com/BurntSushi/toml/_examples/example.toml new file mode 100644 index 0000000000..32c7a4faa4 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/_examples/example.toml @@ -0,0 +1,35 @@ +# This is a TOML document. Boom. + +title = "TOML Example" + +[owner] +name = "Tom Preston-Werner" +organization = "GitHub" +bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." +dob = 1979-05-27T07:32:00Z # First class dates? Why not? + +[database] +server = "192.168.1.1" +ports = [ 8001, 8001, 8002 ] +connection_max = 5000 +enabled = true + +[servers] + + # You can indent as you please. Tabs or spaces. TOML don't care. + [servers.alpha] + ip = "10.0.0.1" + dc = "eqdc10" + + [servers.beta] + ip = "10.0.0.2" + dc = "eqdc10" + +[clients] +data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it + +# Line breaks are OK when inside arrays +hosts = [ + "alpha", + "omega" +] diff --git a/vendor/github.com/BurntSushi/toml/_examples/hard.toml b/vendor/github.com/BurntSushi/toml/_examples/hard.toml new file mode 100644 index 0000000000..26145d2b42 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/_examples/hard.toml @@ -0,0 +1,22 @@ +# Test file for TOML +# Only this one tries to emulate a TOML file written by a user of the kind of parser writers probably hate +# This part you'll really hate + +[the] +test_string = "You'll hate me after this - #" # " Annoying, isn't it? + + [the.hard] + test_array = [ "] ", " # "] # ] There you go, parse this! + test_array2 = [ "Test #11 ]proved that", "Experiment #9 was a success" ] + # You didn't think it'd as easy as chucking out the last #, did you? + another_test_string = " Same thing, but with a string #" + harder_test_string = " And when \"'s are in the string, along with # \"" # "and comments are there too" + # Things will get harder + + [the.hard.bit#] + what? = "You don't think some user won't do that?" + multi_line_array = [ + "]", + # ] Oh yes I did + ] + diff --git a/vendor/github.com/BurntSushi/toml/_examples/implicit.toml b/vendor/github.com/BurntSushi/toml/_examples/implicit.toml new file mode 100644 index 0000000000..1dea5ceb44 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/_examples/implicit.toml @@ -0,0 +1,4 @@ +# [x] you +# [x.y] don't +# [x.y.z] need these +[x.y.z.w] # for this to work diff --git a/vendor/github.com/BurntSushi/toml/_examples/invalid-apples.toml b/vendor/github.com/BurntSushi/toml/_examples/invalid-apples.toml new file mode 100644 index 0000000000..74e9e337ed --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/_examples/invalid-apples.toml @@ -0,0 +1,6 @@ +# DO NOT WANT +[fruit] +type = "apple" + +[fruit.type] +apple = "yes" diff --git a/vendor/github.com/BurntSushi/toml/_examples/invalid.toml b/vendor/github.com/BurntSushi/toml/_examples/invalid.toml new file mode 100644 index 0000000000..beb1dba54d --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/_examples/invalid.toml @@ -0,0 +1,35 @@ +# This is an INVALID TOML document. Boom. +# Can you spot the error without help? + +title = "TOML Example" + +[owner] +name = "Tom Preston-Werner" +organization = "GitHub" +bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." +dob = 1979-05-27T7:32:00Z # First class dates? Why not? + +[database] +server = "192.168.1.1" +ports = [ 8001, 8001, 8002 ] +connection_max = 5000 +enabled = true + +[servers] + # You can indent as you please. Tabs or spaces. TOML don't care. + [servers.alpha] + ip = "10.0.0.1" + dc = "eqdc10" + + [servers.beta] + ip = "10.0.0.2" + dc = "eqdc10" + +[clients] +data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it + +# Line breaks are OK when inside arrays +hosts = [ + "alpha", + "omega" +] diff --git a/vendor/github.com/BurntSushi/toml/_examples/readme1.toml b/vendor/github.com/BurntSushi/toml/_examples/readme1.toml new file mode 100644 index 0000000000..3e1261d4c2 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/_examples/readme1.toml @@ -0,0 +1,5 @@ +Age = 25 +Cats = [ "Cauchy", "Plato" ] +Pi = 3.14 +Perfection = [ 6, 28, 496, 8128 ] +DOB = 1987-07-05T05:45:00Z diff --git a/vendor/github.com/BurntSushi/toml/_examples/readme2.toml b/vendor/github.com/BurntSushi/toml/_examples/readme2.toml new file mode 100644 index 0000000000..b51cd93408 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/_examples/readme2.toml @@ -0,0 +1 @@ +some_key_NAME = "wat" diff --git a/vendor/github.com/BurntSushi/toml/cmd/toml-test-decoder/COPYING b/vendor/github.com/BurntSushi/toml/cmd/toml-test-decoder/COPYING new file mode 100644 index 0000000000..5a8e332545 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/cmd/toml-test-decoder/COPYING @@ -0,0 +1,14 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + diff --git a/vendor/github.com/BurntSushi/toml/cmd/toml-test-decoder/README.md b/vendor/github.com/BurntSushi/toml/cmd/toml-test-decoder/README.md new file mode 100644 index 0000000000..24421eb703 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/cmd/toml-test-decoder/README.md @@ -0,0 +1,14 @@ +# Implements the TOML test suite interface + +This is an implementation of the interface expected by +[toml-test](https://github.com/BurntSushi/toml-test) for my +[toml parser written in Go](https://github.com/BurntSushi/toml). +In particular, it maps TOML data on `stdin` to a JSON format on `stdout`. + + +Compatible with TOML version +[v0.2.0](https://github.com/mojombo/toml/blob/master/versions/toml-v0.2.0.md) + +Compatible with `toml-test` version +[v0.2.0](https://github.com/BurntSushi/toml-test/tree/v0.2.0) + diff --git a/vendor/github.com/BurntSushi/toml/cmd/toml-test-decoder/main.go b/vendor/github.com/BurntSushi/toml/cmd/toml-test-decoder/main.go new file mode 100644 index 0000000000..14e7557005 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/cmd/toml-test-decoder/main.go @@ -0,0 +1,90 @@ +// Command toml-test-decoder satisfies the toml-test interface for testing +// TOML decoders. Namely, it accepts TOML on stdin and outputs JSON on stdout. +package main + +import ( + "encoding/json" + "flag" + "fmt" + "log" + "os" + "path" + "time" + + "github.com/BurntSushi/toml" +) + +func init() { + log.SetFlags(0) + + flag.Usage = usage + flag.Parse() +} + +func usage() { + log.Printf("Usage: %s < toml-file\n", path.Base(os.Args[0])) + flag.PrintDefaults() + + os.Exit(1) +} + +func main() { + if flag.NArg() != 0 { + flag.Usage() + } + + var tmp interface{} + if _, err := toml.DecodeReader(os.Stdin, &tmp); err != nil { + log.Fatalf("Error decoding TOML: %s", err) + } + + typedTmp := translate(tmp) + if err := json.NewEncoder(os.Stdout).Encode(typedTmp); err != nil { + log.Fatalf("Error encoding JSON: %s", err) + } +} + +func translate(tomlData interface{}) interface{} { + switch orig := tomlData.(type) { + case map[string]interface{}: + typed := make(map[string]interface{}, len(orig)) + for k, v := range orig { + typed[k] = translate(v) + } + return typed + case []map[string]interface{}: + typed := make([]map[string]interface{}, len(orig)) + for i, v := range orig { + typed[i] = translate(v).(map[string]interface{}) + } + return typed + case []interface{}: + typed := make([]interface{}, len(orig)) + for i, v := range orig { + typed[i] = translate(v) + } + + // We don't really need to tag arrays, but let's be future proof. + // (If TOML ever supports tuples, we'll need this.) + return tag("array", typed) + case time.Time: + return tag("datetime", orig.Format("2006-01-02T15:04:05Z")) + case bool: + return tag("bool", fmt.Sprintf("%v", orig)) + case int64: + return tag("integer", fmt.Sprintf("%d", orig)) + case float64: + return tag("float", fmt.Sprintf("%v", orig)) + case string: + return tag("string", orig) + } + + panic(fmt.Sprintf("Unknown type: %T", tomlData)) +} + +func tag(typeName string, data interface{}) map[string]interface{} { + return map[string]interface{}{ + "type": typeName, + "value": data, + } +} diff --git a/vendor/github.com/BurntSushi/toml/cmd/toml-test-encoder/COPYING b/vendor/github.com/BurntSushi/toml/cmd/toml-test-encoder/COPYING new file mode 100644 index 0000000000..5a8e332545 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/cmd/toml-test-encoder/COPYING @@ -0,0 +1,14 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + diff --git a/vendor/github.com/BurntSushi/toml/cmd/toml-test-encoder/README.md b/vendor/github.com/BurntSushi/toml/cmd/toml-test-encoder/README.md new file mode 100644 index 0000000000..45a603f298 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/cmd/toml-test-encoder/README.md @@ -0,0 +1,14 @@ +# Implements the TOML test suite interface for TOML encoders + +This is an implementation of the interface expected by +[toml-test](https://github.com/BurntSushi/toml-test) for the +[TOML encoder](https://github.com/BurntSushi/toml). +In particular, it maps JSON data on `stdin` to a TOML format on `stdout`. + + +Compatible with TOML version +[v0.2.0](https://github.com/mojombo/toml/blob/master/versions/toml-v0.2.0.md) + +Compatible with `toml-test` version +[v0.2.0](https://github.com/BurntSushi/toml-test/tree/v0.2.0) + diff --git a/vendor/github.com/BurntSushi/toml/cmd/toml-test-encoder/main.go b/vendor/github.com/BurntSushi/toml/cmd/toml-test-encoder/main.go new file mode 100644 index 0000000000..092cc68449 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/cmd/toml-test-encoder/main.go @@ -0,0 +1,131 @@ +// Command toml-test-encoder satisfies the toml-test interface for testing +// TOML encoders. Namely, it accepts JSON on stdin and outputs TOML on stdout. +package main + +import ( + "encoding/json" + "flag" + "log" + "os" + "path" + "strconv" + "time" + + "github.com/BurntSushi/toml" +) + +func init() { + log.SetFlags(0) + + flag.Usage = usage + flag.Parse() +} + +func usage() { + log.Printf("Usage: %s < json-file\n", path.Base(os.Args[0])) + flag.PrintDefaults() + + os.Exit(1) +} + +func main() { + if flag.NArg() != 0 { + flag.Usage() + } + + var tmp interface{} + if err := json.NewDecoder(os.Stdin).Decode(&tmp); err != nil { + log.Fatalf("Error decoding JSON: %s", err) + } + + tomlData := translate(tmp) + if err := toml.NewEncoder(os.Stdout).Encode(tomlData); err != nil { + log.Fatalf("Error encoding TOML: %s", err) + } +} + +func translate(typedJson interface{}) interface{} { + switch v := typedJson.(type) { + case map[string]interface{}: + if len(v) == 2 && in("type", v) && in("value", v) { + return untag(v) + } + m := make(map[string]interface{}, len(v)) + for k, v2 := range v { + m[k] = translate(v2) + } + return m + case []interface{}: + tabArray := make([]map[string]interface{}, len(v)) + for i := range v { + if m, ok := translate(v[i]).(map[string]interface{}); ok { + tabArray[i] = m + } else { + log.Fatalf("JSON arrays may only contain objects. This " + + "corresponds to only tables being allowed in " + + "TOML table arrays.") + } + } + return tabArray + } + log.Fatalf("Unrecognized JSON format '%T'.", typedJson) + panic("unreachable") +} + +func untag(typed map[string]interface{}) interface{} { + t := typed["type"].(string) + v := typed["value"] + switch t { + case "string": + return v.(string) + case "integer": + v := v.(string) + n, err := strconv.Atoi(v) + if err != nil { + log.Fatalf("Could not parse '%s' as integer: %s", v, err) + } + return n + case "float": + v := v.(string) + f, err := strconv.ParseFloat(v, 64) + if err != nil { + log.Fatalf("Could not parse '%s' as float64: %s", v, err) + } + return f + case "datetime": + v := v.(string) + t, err := time.Parse("2006-01-02T15:04:05Z", v) + if err != nil { + log.Fatalf("Could not parse '%s' as a datetime: %s", v, err) + } + return t + case "bool": + v := v.(string) + switch v { + case "true": + return true + case "false": + return false + } + log.Fatalf("Could not parse '%s' as a boolean.", v) + case "array": + v := v.([]interface{}) + array := make([]interface{}, len(v)) + for i := range v { + if m, ok := v[i].(map[string]interface{}); ok { + array[i] = untag(m) + } else { + log.Fatalf("Arrays may only contain other arrays or "+ + "primitive values, but found a '%T'.", m) + } + } + return array + } + log.Fatalf("Unrecognized tag type '%s'.", t) + panic("unreachable") +} + +func in(key string, m map[string]interface{}) bool { + _, ok := m[key] + return ok +} diff --git a/vendor/github.com/BurntSushi/toml/cmd/tomlv/COPYING b/vendor/github.com/BurntSushi/toml/cmd/tomlv/COPYING new file mode 100644 index 0000000000..5a8e332545 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/cmd/tomlv/COPYING @@ -0,0 +1,14 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + diff --git a/vendor/github.com/BurntSushi/toml/cmd/tomlv/README.md b/vendor/github.com/BurntSushi/toml/cmd/tomlv/README.md new file mode 100644 index 0000000000..5df0dc32bb --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/cmd/tomlv/README.md @@ -0,0 +1,22 @@ +# TOML Validator + +If Go is installed, it's simple to try it out: + +```bash +go get github.com/BurntSushi/toml/cmd/tomlv +tomlv some-toml-file.toml +``` + +You can see the types of every key in a TOML file with: + +```bash +tomlv -types some-toml-file.toml +``` + +At the moment, only one error message is reported at a time. Error messages +include line numbers. No output means that the files given are valid TOML, or +there is a bug in `tomlv`. + +Compatible with TOML version +[v0.1.0](https://github.com/mojombo/toml/blob/master/versions/toml-v0.1.0.md) + diff --git a/vendor/github.com/BurntSushi/toml/cmd/tomlv/main.go b/vendor/github.com/BurntSushi/toml/cmd/tomlv/main.go new file mode 100644 index 0000000000..c7d689a7e9 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/cmd/tomlv/main.go @@ -0,0 +1,61 @@ +// Command tomlv validates TOML documents and prints each key's type. +package main + +import ( + "flag" + "fmt" + "log" + "os" + "path" + "strings" + "text/tabwriter" + + "github.com/BurntSushi/toml" +) + +var ( + flagTypes = false +) + +func init() { + log.SetFlags(0) + + flag.BoolVar(&flagTypes, "types", flagTypes, + "When set, the types of every defined key will be shown.") + + flag.Usage = usage + flag.Parse() +} + +func usage() { + log.Printf("Usage: %s toml-file [ toml-file ... ]\n", + path.Base(os.Args[0])) + flag.PrintDefaults() + + os.Exit(1) +} + +func main() { + if flag.NArg() < 1 { + flag.Usage() + } + for _, f := range flag.Args() { + var tmp interface{} + md, err := toml.DecodeFile(f, &tmp) + if err != nil { + log.Fatalf("Error in '%s': %s", f, err) + } + if flagTypes { + printTypes(md) + } + } +} + +func printTypes(md toml.MetaData) { + tabw := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0) + for _, key := range md.Keys() { + fmt.Fprintf(tabw, "%s%s\t%s\n", + strings.Repeat(" ", len(key)-1), key, md.Type(key...)) + } + tabw.Flush() +} diff --git a/vendor/github.com/BurntSushi/toml/decode.go b/vendor/github.com/BurntSushi/toml/decode.go new file mode 100644 index 0000000000..c26b00c014 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/decode.go @@ -0,0 +1,505 @@ +package toml + +import ( + "fmt" + "io" + "io/ioutil" + "math" + "reflect" + "strings" + "time" +) + +var e = fmt.Errorf + +// Unmarshaler is the interface implemented by objects that can unmarshal a +// TOML description of themselves. +type Unmarshaler interface { + UnmarshalTOML(interface{}) error +} + +// Unmarshal decodes the contents of `p` in TOML format into a pointer `v`. +func Unmarshal(p []byte, v interface{}) error { + _, err := Decode(string(p), v) + return err +} + +// Primitive is a TOML value that hasn't been decoded into a Go value. +// When using the various `Decode*` functions, the type `Primitive` may +// be given to any value, and its decoding will be delayed. +// +// A `Primitive` value can be decoded using the `PrimitiveDecode` function. +// +// The underlying representation of a `Primitive` value is subject to change. +// Do not rely on it. +// +// N.B. Primitive values are still parsed, so using them will only avoid +// the overhead of reflection. They can be useful when you don't know the +// exact type of TOML data until run time. +type Primitive struct { + undecoded interface{} + context Key +} + +// DEPRECATED! +// +// Use MetaData.PrimitiveDecode instead. +func PrimitiveDecode(primValue Primitive, v interface{}) error { + md := MetaData{decoded: make(map[string]bool)} + return md.unify(primValue.undecoded, rvalue(v)) +} + +// PrimitiveDecode is just like the other `Decode*` functions, except it +// decodes a TOML value that has already been parsed. Valid primitive values +// can *only* be obtained from values filled by the decoder functions, +// including this method. (i.e., `v` may contain more `Primitive` +// values.) +// +// Meta data for primitive values is included in the meta data returned by +// the `Decode*` functions with one exception: keys returned by the Undecoded +// method will only reflect keys that were decoded. Namely, any keys hidden +// behind a Primitive will be considered undecoded. Executing this method will +// update the undecoded keys in the meta data. (See the example.) +func (md *MetaData) PrimitiveDecode(primValue Primitive, v interface{}) error { + md.context = primValue.context + defer func() { md.context = nil }() + return md.unify(primValue.undecoded, rvalue(v)) +} + +// Decode will decode the contents of `data` in TOML format into a pointer +// `v`. +// +// TOML hashes correspond to Go structs or maps. (Dealer's choice. They can be +// used interchangeably.) +// +// TOML arrays of tables correspond to either a slice of structs or a slice +// of maps. +// +// TOML datetimes correspond to Go `time.Time` values. +// +// All other TOML types (float, string, int, bool and array) correspond +// to the obvious Go types. +// +// An exception to the above rules is if a type implements the +// encoding.TextUnmarshaler interface. In this case, any primitive TOML value +// (floats, strings, integers, booleans and datetimes) will be converted to +// a byte string and given to the value's UnmarshalText method. See the +// Unmarshaler example for a demonstration with time duration strings. +// +// Key mapping +// +// TOML keys can map to either keys in a Go map or field names in a Go +// struct. The special `toml` struct tag may be used to map TOML keys to +// struct fields that don't match the key name exactly. (See the example.) +// A case insensitive match to struct names will be tried if an exact match +// can't be found. +// +// The mapping between TOML values and Go values is loose. That is, there +// may exist TOML values that cannot be placed into your representation, and +// there may be parts of your representation that do not correspond to +// TOML values. This loose mapping can be made stricter by using the IsDefined +// and/or Undecoded methods on the MetaData returned. +// +// This decoder will not handle cyclic types. If a cyclic type is passed, +// `Decode` will not terminate. +func Decode(data string, v interface{}) (MetaData, error) { + p, err := parse(data) + if err != nil { + return MetaData{}, err + } + md := MetaData{ + p.mapping, p.types, p.ordered, + make(map[string]bool, len(p.ordered)), nil, + } + return md, md.unify(p.mapping, rvalue(v)) +} + +// DecodeFile is just like Decode, except it will automatically read the +// contents of the file at `fpath` and decode it for you. +func DecodeFile(fpath string, v interface{}) (MetaData, error) { + bs, err := ioutil.ReadFile(fpath) + if err != nil { + return MetaData{}, err + } + return Decode(string(bs), v) +} + +// DecodeReader is just like Decode, except it will consume all bytes +// from the reader and decode it for you. +func DecodeReader(r io.Reader, v interface{}) (MetaData, error) { + bs, err := ioutil.ReadAll(r) + if err != nil { + return MetaData{}, err + } + return Decode(string(bs), v) +} + +// unify performs a sort of type unification based on the structure of `rv`, +// which is the client representation. +// +// Any type mismatch produces an error. Finding a type that we don't know +// how to handle produces an unsupported type error. +func (md *MetaData) unify(data interface{}, rv reflect.Value) error { + + // Special case. Look for a `Primitive` value. + if rv.Type() == reflect.TypeOf((*Primitive)(nil)).Elem() { + // Save the undecoded data and the key context into the primitive + // value. + context := make(Key, len(md.context)) + copy(context, md.context) + rv.Set(reflect.ValueOf(Primitive{ + undecoded: data, + context: context, + })) + return nil + } + + // Special case. Unmarshaler Interface support. + if rv.CanAddr() { + if v, ok := rv.Addr().Interface().(Unmarshaler); ok { + return v.UnmarshalTOML(data) + } + } + + // Special case. Handle time.Time values specifically. + // TODO: Remove this code when we decide to drop support for Go 1.1. + // This isn't necessary in Go 1.2 because time.Time satisfies the encoding + // interfaces. + if rv.Type().AssignableTo(rvalue(time.Time{}).Type()) { + return md.unifyDatetime(data, rv) + } + + // Special case. Look for a value satisfying the TextUnmarshaler interface. + if v, ok := rv.Interface().(TextUnmarshaler); ok { + return md.unifyText(data, v) + } + // BUG(burntsushi) + // The behavior here is incorrect whenever a Go type satisfies the + // encoding.TextUnmarshaler interface but also corresponds to a TOML + // hash or array. In particular, the unmarshaler should only be applied + // to primitive TOML values. But at this point, it will be applied to + // all kinds of values and produce an incorrect error whenever those values + // are hashes or arrays (including arrays of tables). + + k := rv.Kind() + + // laziness + if k >= reflect.Int && k <= reflect.Uint64 { + return md.unifyInt(data, rv) + } + switch k { + case reflect.Ptr: + elem := reflect.New(rv.Type().Elem()) + err := md.unify(data, reflect.Indirect(elem)) + if err != nil { + return err + } + rv.Set(elem) + return nil + case reflect.Struct: + return md.unifyStruct(data, rv) + case reflect.Map: + return md.unifyMap(data, rv) + case reflect.Array: + return md.unifyArray(data, rv) + case reflect.Slice: + return md.unifySlice(data, rv) + case reflect.String: + return md.unifyString(data, rv) + case reflect.Bool: + return md.unifyBool(data, rv) + case reflect.Interface: + // we only support empty interfaces. + if rv.NumMethod() > 0 { + return e("Unsupported type '%s'.", rv.Kind()) + } + return md.unifyAnything(data, rv) + case reflect.Float32: + fallthrough + case reflect.Float64: + return md.unifyFloat64(data, rv) + } + return e("Unsupported type '%s'.", rv.Kind()) +} + +func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error { + tmap, ok := mapping.(map[string]interface{}) + if !ok { + if mapping == nil { + return nil + } + return mismatch(rv, "map", mapping) + } + + for key, datum := range tmap { + var f *field + fields := cachedTypeFields(rv.Type()) + for i := range fields { + ff := &fields[i] + if ff.name == key { + f = ff + break + } + if f == nil && strings.EqualFold(ff.name, key) { + f = ff + } + } + if f != nil { + subv := rv + for _, i := range f.index { + subv = indirect(subv.Field(i)) + } + if isUnifiable(subv) { + md.decoded[md.context.add(key).String()] = true + md.context = append(md.context, key) + if err := md.unify(datum, subv); err != nil { + return e("Type mismatch for '%s.%s': %s", + rv.Type().String(), f.name, err) + } + md.context = md.context[0 : len(md.context)-1] + } else if f.name != "" { + // Bad user! No soup for you! + return e("Field '%s.%s' is unexported, and therefore cannot "+ + "be loaded with reflection.", rv.Type().String(), f.name) + } + } + } + return nil +} + +func (md *MetaData) unifyMap(mapping interface{}, rv reflect.Value) error { + tmap, ok := mapping.(map[string]interface{}) + if !ok { + if tmap == nil { + return nil + } + return badtype("map", mapping) + } + if rv.IsNil() { + rv.Set(reflect.MakeMap(rv.Type())) + } + for k, v := range tmap { + md.decoded[md.context.add(k).String()] = true + md.context = append(md.context, k) + + rvkey := indirect(reflect.New(rv.Type().Key())) + rvval := reflect.Indirect(reflect.New(rv.Type().Elem())) + if err := md.unify(v, rvval); err != nil { + return err + } + md.context = md.context[0 : len(md.context)-1] + + rvkey.SetString(k) + rv.SetMapIndex(rvkey, rvval) + } + return nil +} + +func (md *MetaData) unifyArray(data interface{}, rv reflect.Value) error { + datav := reflect.ValueOf(data) + if datav.Kind() != reflect.Slice { + if !datav.IsValid() { + return nil + } + return badtype("slice", data) + } + sliceLen := datav.Len() + if sliceLen != rv.Len() { + return e("expected array length %d; got TOML array of length %d", + rv.Len(), sliceLen) + } + return md.unifySliceArray(datav, rv) +} + +func (md *MetaData) unifySlice(data interface{}, rv reflect.Value) error { + datav := reflect.ValueOf(data) + if datav.Kind() != reflect.Slice { + if !datav.IsValid() { + return nil + } + return badtype("slice", data) + } + n := datav.Len() + if rv.IsNil() || rv.Cap() < n { + rv.Set(reflect.MakeSlice(rv.Type(), n, n)) + } + rv.SetLen(n) + return md.unifySliceArray(datav, rv) +} + +func (md *MetaData) unifySliceArray(data, rv reflect.Value) error { + sliceLen := data.Len() + for i := 0; i < sliceLen; i++ { + v := data.Index(i).Interface() + sliceval := indirect(rv.Index(i)) + if err := md.unify(v, sliceval); err != nil { + return err + } + } + return nil +} + +func (md *MetaData) unifyDatetime(data interface{}, rv reflect.Value) error { + if _, ok := data.(time.Time); ok { + rv.Set(reflect.ValueOf(data)) + return nil + } + return badtype("time.Time", data) +} + +func (md *MetaData) unifyString(data interface{}, rv reflect.Value) error { + if s, ok := data.(string); ok { + rv.SetString(s) + return nil + } + return badtype("string", data) +} + +func (md *MetaData) unifyFloat64(data interface{}, rv reflect.Value) error { + if num, ok := data.(float64); ok { + switch rv.Kind() { + case reflect.Float32: + fallthrough + case reflect.Float64: + rv.SetFloat(num) + default: + panic("bug") + } + return nil + } + return badtype("float", data) +} + +func (md *MetaData) unifyInt(data interface{}, rv reflect.Value) error { + if num, ok := data.(int64); ok { + if rv.Kind() >= reflect.Int && rv.Kind() <= reflect.Int64 { + switch rv.Kind() { + case reflect.Int, reflect.Int64: + // No bounds checking necessary. + case reflect.Int8: + if num < math.MinInt8 || num > math.MaxInt8 { + return e("Value '%d' is out of range for int8.", num) + } + case reflect.Int16: + if num < math.MinInt16 || num > math.MaxInt16 { + return e("Value '%d' is out of range for int16.", num) + } + case reflect.Int32: + if num < math.MinInt32 || num > math.MaxInt32 { + return e("Value '%d' is out of range for int32.", num) + } + } + rv.SetInt(num) + } else if rv.Kind() >= reflect.Uint && rv.Kind() <= reflect.Uint64 { + unum := uint64(num) + switch rv.Kind() { + case reflect.Uint, reflect.Uint64: + // No bounds checking necessary. + case reflect.Uint8: + if num < 0 || unum > math.MaxUint8 { + return e("Value '%d' is out of range for uint8.", num) + } + case reflect.Uint16: + if num < 0 || unum > math.MaxUint16 { + return e("Value '%d' is out of range for uint16.", num) + } + case reflect.Uint32: + if num < 0 || unum > math.MaxUint32 { + return e("Value '%d' is out of range for uint32.", num) + } + } + rv.SetUint(unum) + } else { + panic("unreachable") + } + return nil + } + return badtype("integer", data) +} + +func (md *MetaData) unifyBool(data interface{}, rv reflect.Value) error { + if b, ok := data.(bool); ok { + rv.SetBool(b) + return nil + } + return badtype("boolean", data) +} + +func (md *MetaData) unifyAnything(data interface{}, rv reflect.Value) error { + rv.Set(reflect.ValueOf(data)) + return nil +} + +func (md *MetaData) unifyText(data interface{}, v TextUnmarshaler) error { + var s string + switch sdata := data.(type) { + case TextMarshaler: + text, err := sdata.MarshalText() + if err != nil { + return err + } + s = string(text) + case fmt.Stringer: + s = sdata.String() + case string: + s = sdata + case bool: + s = fmt.Sprintf("%v", sdata) + case int64: + s = fmt.Sprintf("%d", sdata) + case float64: + s = fmt.Sprintf("%f", sdata) + default: + return badtype("primitive (string-like)", data) + } + if err := v.UnmarshalText([]byte(s)); err != nil { + return err + } + return nil +} + +// rvalue returns a reflect.Value of `v`. All pointers are resolved. +func rvalue(v interface{}) reflect.Value { + return indirect(reflect.ValueOf(v)) +} + +// indirect returns the value pointed to by a pointer. +// Pointers are followed until the value is not a pointer. +// New values are allocated for each nil pointer. +// +// An exception to this rule is if the value satisfies an interface of +// interest to us (like encoding.TextUnmarshaler). +func indirect(v reflect.Value) reflect.Value { + if v.Kind() != reflect.Ptr { + if v.CanAddr() { + pv := v.Addr() + if _, ok := pv.Interface().(TextUnmarshaler); ok { + return pv + } + } + return v + } + if v.IsNil() { + v.Set(reflect.New(v.Type().Elem())) + } + return indirect(reflect.Indirect(v)) +} + +func isUnifiable(rv reflect.Value) bool { + if rv.CanSet() { + return true + } + if _, ok := rv.Interface().(TextUnmarshaler); ok { + return true + } + return false +} + +func badtype(expected string, data interface{}) error { + return e("Expected %s but found '%T'.", expected, data) +} + +func mismatch(user reflect.Value, expected string, data interface{}) error { + return e("Type mismatch for %s. Expected %s but found '%T'.", + user.Type().String(), expected, data) +} diff --git a/vendor/github.com/BurntSushi/toml/decode_meta.go b/vendor/github.com/BurntSushi/toml/decode_meta.go new file mode 100644 index 0000000000..ef6f545fa1 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/decode_meta.go @@ -0,0 +1,122 @@ +package toml + +import "strings" + +// MetaData allows access to meta information about TOML data that may not +// be inferrable via reflection. In particular, whether a key has been defined +// and the TOML type of a key. +type MetaData struct { + mapping map[string]interface{} + types map[string]tomlType + keys []Key + decoded map[string]bool + context Key // Used only during decoding. +} + +// IsDefined returns true if the key given exists in the TOML data. The key +// should be specified hierarchially. e.g., +// +// // access the TOML key 'a.b.c' +// IsDefined("a", "b", "c") +// +// IsDefined will return false if an empty key given. Keys are case sensitive. +func (md *MetaData) IsDefined(key ...string) bool { + if len(key) == 0 { + return false + } + + var hash map[string]interface{} + var ok bool + var hashOrVal interface{} = md.mapping + for _, k := range key { + if hash, ok = hashOrVal.(map[string]interface{}); !ok { + return false + } + if hashOrVal, ok = hash[k]; !ok { + return false + } + } + return true +} + +// Type returns a string representation of the type of the key specified. +// +// Type will return the empty string if given an empty key or a key that +// does not exist. Keys are case sensitive. +func (md *MetaData) Type(key ...string) string { + fullkey := strings.Join(key, ".") + if typ, ok := md.types[fullkey]; ok { + return typ.typeString() + } + return "" +} + +// Key is the type of any TOML key, including key groups. Use (MetaData).Keys +// to get values of this type. +type Key []string + +func (k Key) String() string { + return strings.Join(k, ".") +} + +func (k Key) maybeQuotedAll() string { + var ss []string + for i := range k { + ss = append(ss, k.maybeQuoted(i)) + } + return strings.Join(ss, ".") +} + +func (k Key) maybeQuoted(i int) string { + quote := false + for _, c := range k[i] { + if !isBareKeyChar(c) { + quote = true + break + } + } + if quote { + return "\"" + strings.Replace(k[i], "\"", "\\\"", -1) + "\"" + } else { + return k[i] + } +} + +func (k Key) add(piece string) Key { + newKey := make(Key, len(k)+1) + copy(newKey, k) + newKey[len(k)] = piece + return newKey +} + +// Keys returns a slice of every key in the TOML data, including key groups. +// Each key is itself a slice, where the first element is the top of the +// hierarchy and the last is the most specific. +// +// The list will have the same order as the keys appeared in the TOML data. +// +// All keys returned are non-empty. +func (md *MetaData) Keys() []Key { + return md.keys +} + +// Undecoded returns all keys that have not been decoded in the order in which +// they appear in the original TOML document. +// +// This includes keys that haven't been decoded because of a Primitive value. +// Once the Primitive value is decoded, the keys will be considered decoded. +// +// Also note that decoding into an empty interface will result in no decoding, +// and so no keys will be considered decoded. +// +// In this sense, the Undecoded keys correspond to keys in the TOML document +// that do not have a concrete type in your representation. +func (md *MetaData) Undecoded() []Key { + undecoded := make([]Key, 0, len(md.keys)) + for _, key := range md.keys { + if !md.decoded[key.String()] { + undecoded = append(undecoded, key) + } + } + return undecoded +} diff --git a/vendor/github.com/BurntSushi/toml/decode_test.go b/vendor/github.com/BurntSushi/toml/decode_test.go new file mode 100644 index 0000000000..213e70dcaf --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/decode_test.go @@ -0,0 +1,1092 @@ +package toml + +import ( + "fmt" + "log" + "reflect" + "testing" + "time" +) + +func init() { + log.SetFlags(0) +} + +func TestDecodeSimple(t *testing.T) { + var testSimple = ` +age = 250 +andrew = "gallant" +kait = "brady" +now = 1987-07-05T05:45:00Z +yesOrNo = true +pi = 3.14 +colors = [ + ["red", "green", "blue"], + ["cyan", "magenta", "yellow", "black"], +] + +[My.Cats] +plato = "cat 1" +cauchy = "cat 2" +` + + type cats struct { + Plato string + Cauchy string + } + type simple struct { + Age int + Colors [][]string + Pi float64 + YesOrNo bool + Now time.Time + Andrew string + Kait string + My map[string]cats + } + + var val simple + _, err := Decode(testSimple, &val) + if err != nil { + t.Fatal(err) + } + + now, err := time.Parse("2006-01-02T15:04:05", "1987-07-05T05:45:00") + if err != nil { + panic(err) + } + var answer = simple{ + Age: 250, + Andrew: "gallant", + Kait: "brady", + Now: now, + YesOrNo: true, + Pi: 3.14, + Colors: [][]string{ + {"red", "green", "blue"}, + {"cyan", "magenta", "yellow", "black"}, + }, + My: map[string]cats{ + "Cats": {Plato: "cat 1", Cauchy: "cat 2"}, + }, + } + if !reflect.DeepEqual(val, answer) { + t.Fatalf("Expected\n-----\n%#v\n-----\nbut got\n-----\n%#v\n", + answer, val) + } +} + +func TestDecodeEmbedded(t *testing.T) { + type Dog struct{ Name string } + type Age int + + tests := map[string]struct { + input string + decodeInto interface{} + wantDecoded interface{} + }{ + "embedded struct": { + input: `Name = "milton"`, + decodeInto: &struct{ Dog }{}, + wantDecoded: &struct{ Dog }{Dog{"milton"}}, + }, + "embedded non-nil pointer to struct": { + input: `Name = "milton"`, + decodeInto: &struct{ *Dog }{}, + wantDecoded: &struct{ *Dog }{&Dog{"milton"}}, + }, + "embedded nil pointer to struct": { + input: ``, + decodeInto: &struct{ *Dog }{}, + wantDecoded: &struct{ *Dog }{nil}, + }, + "embedded int": { + input: `Age = -5`, + decodeInto: &struct{ Age }{}, + wantDecoded: &struct{ Age }{-5}, + }, + } + + for label, test := range tests { + _, err := Decode(test.input, test.decodeInto) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(test.wantDecoded, test.decodeInto) { + t.Errorf("%s: want decoded == %+v, got %+v", + label, test.wantDecoded, test.decodeInto) + } + } +} + +func TestDecodeIgnoredFields(t *testing.T) { + type simple struct { + Number int `toml:"-"` + } + const input = ` +Number = 123 +- = 234 +` + var s simple + if _, err := Decode(input, &s); err != nil { + t.Fatal(err) + } + if s.Number != 0 { + t.Errorf("got: %d; want 0", s.Number) + } +} + +func TestTableArrays(t *testing.T) { + var tomlTableArrays = ` +[[albums]] +name = "Born to Run" + + [[albums.songs]] + name = "Jungleland" + + [[albums.songs]] + name = "Meeting Across the River" + +[[albums]] +name = "Born in the USA" + + [[albums.songs]] + name = "Glory Days" + + [[albums.songs]] + name = "Dancing in the Dark" +` + + type Song struct { + Name string + } + + type Album struct { + Name string + Songs []Song + } + + type Music struct { + Albums []Album + } + + expected := Music{[]Album{ + {"Born to Run", []Song{{"Jungleland"}, {"Meeting Across the River"}}}, + {"Born in the USA", []Song{{"Glory Days"}, {"Dancing in the Dark"}}}, + }} + var got Music + if _, err := Decode(tomlTableArrays, &got); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(expected, got) { + t.Fatalf("\n%#v\n!=\n%#v\n", expected, got) + } +} + +// Case insensitive matching tests. +// A bit more comprehensive than needed given the current implementation, +// but implementations change. +// Probably still missing demonstrations of some ugly corner cases regarding +// case insensitive matching and multiple fields. +func TestCase(t *testing.T) { + var caseToml = ` +tOpString = "string" +tOpInt = 1 +tOpFloat = 1.1 +tOpBool = true +tOpdate = 2006-01-02T15:04:05Z +tOparray = [ "array" ] +Match = "i should be in Match only" +MatcH = "i should be in MatcH only" +once = "just once" +[nEst.eD] +nEstedString = "another string" +` + + type InsensitiveEd struct { + NestedString string + } + + type InsensitiveNest struct { + Ed InsensitiveEd + } + + type Insensitive struct { + TopString string + TopInt int + TopFloat float64 + TopBool bool + TopDate time.Time + TopArray []string + Match string + MatcH string + Once string + OncE string + Nest InsensitiveNest + } + + tme, err := time.Parse(time.RFC3339, time.RFC3339[:len(time.RFC3339)-5]) + if err != nil { + panic(err) + } + expected := Insensitive{ + TopString: "string", + TopInt: 1, + TopFloat: 1.1, + TopBool: true, + TopDate: tme, + TopArray: []string{"array"}, + MatcH: "i should be in MatcH only", + Match: "i should be in Match only", + Once: "just once", + OncE: "", + Nest: InsensitiveNest{ + Ed: InsensitiveEd{NestedString: "another string"}, + }, + } + var got Insensitive + if _, err := Decode(caseToml, &got); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(expected, got) { + t.Fatalf("\n%#v\n!=\n%#v\n", expected, got) + } +} + +func TestPointers(t *testing.T) { + type Object struct { + Type string + Description string + } + + type Dict struct { + NamedObject map[string]*Object + BaseObject *Object + Strptr *string + Strptrs []*string + } + s1, s2, s3 := "blah", "abc", "def" + expected := &Dict{ + Strptr: &s1, + Strptrs: []*string{&s2, &s3}, + NamedObject: map[string]*Object{ + "foo": {"FOO", "fooooo!!!"}, + "bar": {"BAR", "ba-ba-ba-ba-barrrr!!!"}, + }, + BaseObject: &Object{"BASE", "da base"}, + } + + ex1 := ` +Strptr = "blah" +Strptrs = ["abc", "def"] + +[NamedObject.foo] +Type = "FOO" +Description = "fooooo!!!" + +[NamedObject.bar] +Type = "BAR" +Description = "ba-ba-ba-ba-barrrr!!!" + +[BaseObject] +Type = "BASE" +Description = "da base" +` + dict := new(Dict) + _, err := Decode(ex1, dict) + if err != nil { + t.Errorf("Decode error: %v", err) + } + if !reflect.DeepEqual(expected, dict) { + t.Fatalf("\n%#v\n!=\n%#v\n", expected, dict) + } +} + +func TestDecodeBadTimestamp(t *testing.T) { + var x struct { + T time.Time + } + for _, s := range []string{ + "T = 123", "T = 2006-01-50T00:00:00Z", "T = 2006-01-30T00:00:00", + } { + if _, err := Decode(s, &x); err == nil { + t.Errorf("Expected invalid DateTime error for %q", s) + } + } +} + +func TestDecodeMultilineStrings(t *testing.T) { + var x struct { + S string + } + const s0 = `s = """ +a b \n c +d e f +"""` + if _, err := Decode(s0, &x); err != nil { + t.Fatal(err) + } + if want := "a b \n c\nd e f\n"; x.S != want { + t.Errorf("got: %q; want: %q", x.S, want) + } + const s1 = `s = """a b c\ +"""` + if _, err := Decode(s1, &x); err != nil { + t.Fatal(err) + } + if want := "a b c"; x.S != want { + t.Errorf("got: %q; want: %q", x.S, want) + } +} + +type sphere struct { + Center [3]float64 + Radius float64 +} + +func TestDecodeSimpleArray(t *testing.T) { + var s1 sphere + if _, err := Decode(`center = [0.0, 1.5, 0.0]`, &s1); err != nil { + t.Fatal(err) + } +} + +func TestDecodeArrayWrongSize(t *testing.T) { + var s1 sphere + if _, err := Decode(`center = [0.1, 2.3]`, &s1); err == nil { + t.Fatal("Expected array type mismatch error") + } +} + +func TestDecodeLargeIntoSmallInt(t *testing.T) { + type table struct { + Value int8 + } + var tab table + if _, err := Decode(`value = 500`, &tab); err == nil { + t.Fatal("Expected integer out-of-bounds error.") + } +} + +func TestDecodeSizedInts(t *testing.T) { + type table struct { + U8 uint8 + U16 uint16 + U32 uint32 + U64 uint64 + U uint + I8 int8 + I16 int16 + I32 int32 + I64 int64 + I int + } + answer := table{1, 1, 1, 1, 1, -1, -1, -1, -1, -1} + toml := ` + u8 = 1 + u16 = 1 + u32 = 1 + u64 = 1 + u = 1 + i8 = -1 + i16 = -1 + i32 = -1 + i64 = -1 + i = -1 + ` + var tab table + if _, err := Decode(toml, &tab); err != nil { + t.Fatal(err.Error()) + } + if answer != tab { + t.Fatalf("Expected %#v but got %#v", answer, tab) + } +} + +func TestUnmarshaler(t *testing.T) { + + var tomlBlob = ` +[dishes.hamboogie] +name = "Hamboogie with fries" +price = 10.99 + +[[dishes.hamboogie.ingredients]] +name = "Bread Bun" + +[[dishes.hamboogie.ingredients]] +name = "Lettuce" + +[[dishes.hamboogie.ingredients]] +name = "Real Beef Patty" + +[[dishes.hamboogie.ingredients]] +name = "Tomato" + +[dishes.eggsalad] +name = "Egg Salad with rice" +price = 3.99 + +[[dishes.eggsalad.ingredients]] +name = "Egg" + +[[dishes.eggsalad.ingredients]] +name = "Mayo" + +[[dishes.eggsalad.ingredients]] +name = "Rice" +` + m := &menu{} + if _, err := Decode(tomlBlob, m); err != nil { + log.Fatal(err) + } + + if len(m.Dishes) != 2 { + t.Log("two dishes should be loaded with UnmarshalTOML()") + t.Errorf("expected %d but got %d", 2, len(m.Dishes)) + } + + eggSalad := m.Dishes["eggsalad"] + if _, ok := interface{}(eggSalad).(dish); !ok { + t.Errorf("expected a dish") + } + + if eggSalad.Name != "Egg Salad with rice" { + t.Errorf("expected the dish to be named 'Egg Salad with rice'") + } + + if len(eggSalad.Ingredients) != 3 { + t.Log("dish should be loaded with UnmarshalTOML()") + t.Errorf("expected %d but got %d", 3, len(eggSalad.Ingredients)) + } + + found := false + for _, i := range eggSalad.Ingredients { + if i.Name == "Rice" { + found = true + break + } + } + if !found { + t.Error("Rice was not loaded in UnmarshalTOML()") + } + + // test on a value - must be passed as * + o := menu{} + if _, err := Decode(tomlBlob, &o); err != nil { + log.Fatal(err) + } + +} + +type menu struct { + Dishes map[string]dish +} + +func (m *menu) UnmarshalTOML(p interface{}) error { + m.Dishes = make(map[string]dish) + data, _ := p.(map[string]interface{}) + dishes := data["dishes"].(map[string]interface{}) + for n, v := range dishes { + if d, ok := v.(map[string]interface{}); ok { + nd := dish{} + nd.UnmarshalTOML(d) + m.Dishes[n] = nd + } else { + return fmt.Errorf("not a dish") + } + } + return nil +} + +type dish struct { + Name string + Price float32 + Ingredients []ingredient +} + +func (d *dish) UnmarshalTOML(p interface{}) error { + data, _ := p.(map[string]interface{}) + d.Name, _ = data["name"].(string) + d.Price, _ = data["price"].(float32) + ingredients, _ := data["ingredients"].([]map[string]interface{}) + for _, e := range ingredients { + n, _ := interface{}(e).(map[string]interface{}) + name, _ := n["name"].(string) + i := ingredient{name} + d.Ingredients = append(d.Ingredients, i) + } + return nil +} + +type ingredient struct { + Name string +} + +func TestDecodeSlices(t *testing.T) { + type T struct { + S []string + } + for i, tt := range []struct { + v T + input string + want T + }{ + {T{}, "", T{}}, + {T{[]string{}}, "", T{[]string{}}}, + {T{[]string{"a", "b"}}, "", T{[]string{"a", "b"}}}, + {T{}, "S = []", T{[]string{}}}, + {T{[]string{}}, "S = []", T{[]string{}}}, + {T{[]string{"a", "b"}}, "S = []", T{[]string{}}}, + {T{}, `S = ["x"]`, T{[]string{"x"}}}, + {T{[]string{}}, `S = ["x"]`, T{[]string{"x"}}}, + {T{[]string{"a", "b"}}, `S = ["x"]`, T{[]string{"x"}}}, + } { + if _, err := Decode(tt.input, &tt.v); err != nil { + t.Errorf("[%d] %s", i, err) + continue + } + if !reflect.DeepEqual(tt.v, tt.want) { + t.Errorf("[%d] got %#v; want %#v", i, tt.v, tt.want) + } + } +} + +func TestDecodePrimitive(t *testing.T) { + type S struct { + P Primitive + } + type T struct { + S []int + } + slicep := func(s []int) *[]int { return &s } + arrayp := func(a [2]int) *[2]int { return &a } + mapp := func(m map[string]int) *map[string]int { return &m } + for i, tt := range []struct { + v interface{} + input string + want interface{} + }{ + // slices + {slicep(nil), "", slicep(nil)}, + {slicep([]int{}), "", slicep([]int{})}, + {slicep([]int{1, 2, 3}), "", slicep([]int{1, 2, 3})}, + {slicep(nil), "P = [1,2]", slicep([]int{1, 2})}, + {slicep([]int{}), "P = [1,2]", slicep([]int{1, 2})}, + {slicep([]int{1, 2, 3}), "P = [1,2]", slicep([]int{1, 2})}, + + // arrays + {arrayp([2]int{2, 3}), "", arrayp([2]int{2, 3})}, + {arrayp([2]int{2, 3}), "P = [3,4]", arrayp([2]int{3, 4})}, + + // maps + {mapp(nil), "", mapp(nil)}, + {mapp(map[string]int{}), "", mapp(map[string]int{})}, + {mapp(map[string]int{"a": 1}), "", mapp(map[string]int{"a": 1})}, + {mapp(nil), "[P]\na = 2", mapp(map[string]int{"a": 2})}, + {mapp(map[string]int{}), "[P]\na = 2", mapp(map[string]int{"a": 2})}, + {mapp(map[string]int{"a": 1, "b": 3}), "[P]\na = 2", mapp(map[string]int{"a": 2, "b": 3})}, + + // structs + {&T{nil}, "[P]", &T{nil}}, + {&T{[]int{}}, "[P]", &T{[]int{}}}, + {&T{[]int{1, 2, 3}}, "[P]", &T{[]int{1, 2, 3}}}, + {&T{nil}, "[P]\nS = [1,2]", &T{[]int{1, 2}}}, + {&T{[]int{}}, "[P]\nS = [1,2]", &T{[]int{1, 2}}}, + {&T{[]int{1, 2, 3}}, "[P]\nS = [1,2]", &T{[]int{1, 2}}}, + } { + var s S + md, err := Decode(tt.input, &s) + if err != nil { + t.Errorf("[%d] Decode error: %s", i, err) + continue + } + if err := md.PrimitiveDecode(s.P, tt.v); err != nil { + t.Errorf("[%d] PrimitiveDecode error: %s", i, err) + continue + } + if !reflect.DeepEqual(tt.v, tt.want) { + t.Errorf("[%d] got %#v; want %#v", i, tt.v, tt.want) + } + } +} + +func ExampleMetaData_PrimitiveDecode() { + var md MetaData + var err error + + var tomlBlob = ` +ranking = ["Springsteen", "J Geils"] + +[bands.Springsteen] +started = 1973 +albums = ["Greetings", "WIESS", "Born to Run", "Darkness"] + +[bands."J Geils"] +started = 1970 +albums = ["The J. Geils Band", "Full House", "Blow Your Face Out"] +` + + type band struct { + Started int + Albums []string + } + type classics struct { + Ranking []string + Bands map[string]Primitive + } + + // Do the initial decode. Reflection is delayed on Primitive values. + var music classics + if md, err = Decode(tomlBlob, &music); err != nil { + log.Fatal(err) + } + + // MetaData still includes information on Primitive values. + fmt.Printf("Is `bands.Springsteen` defined? %v\n", + md.IsDefined("bands", "Springsteen")) + + // Decode primitive data into Go values. + for _, artist := range music.Ranking { + // A band is a primitive value, so we need to decode it to get a + // real `band` value. + primValue := music.Bands[artist] + + var aBand band + if err = md.PrimitiveDecode(primValue, &aBand); err != nil { + log.Fatal(err) + } + fmt.Printf("%s started in %d.\n", artist, aBand.Started) + } + // Check to see if there were any fields left undecoded. + // Note that this won't be empty before decoding the Primitive value! + fmt.Printf("Undecoded: %q\n", md.Undecoded()) + + // Output: + // Is `bands.Springsteen` defined? true + // Springsteen started in 1973. + // J Geils started in 1970. + // Undecoded: [] +} + +func ExampleDecode() { + var tomlBlob = ` +# Some comments. +[alpha] +ip = "10.0.0.1" + + [alpha.config] + Ports = [ 8001, 8002 ] + Location = "Toronto" + Created = 1987-07-05T05:45:00Z + +[beta] +ip = "10.0.0.2" + + [beta.config] + Ports = [ 9001, 9002 ] + Location = "New Jersey" + Created = 1887-01-05T05:55:00Z +` + + type serverConfig struct { + Ports []int + Location string + Created time.Time + } + + type server struct { + IP string `toml:"ip,omitempty"` + Config serverConfig `toml:"config"` + } + + type servers map[string]server + + var config servers + if _, err := Decode(tomlBlob, &config); err != nil { + log.Fatal(err) + } + + for _, name := range []string{"alpha", "beta"} { + s := config[name] + fmt.Printf("Server: %s (ip: %s) in %s created on %s\n", + name, s.IP, s.Config.Location, + s.Config.Created.Format("2006-01-02")) + fmt.Printf("Ports: %v\n", s.Config.Ports) + } + + // Output: + // Server: alpha (ip: 10.0.0.1) in Toronto created on 1987-07-05 + // Ports: [8001 8002] + // Server: beta (ip: 10.0.0.2) in New Jersey created on 1887-01-05 + // Ports: [9001 9002] +} + +type duration struct { + time.Duration +} + +func (d *duration) UnmarshalText(text []byte) error { + var err error + d.Duration, err = time.ParseDuration(string(text)) + return err +} + +// Example Unmarshaler shows how to decode TOML strings into your own +// custom data type. +func Example_unmarshaler() { + blob := ` +[[song]] +name = "Thunder Road" +duration = "4m49s" + +[[song]] +name = "Stairway to Heaven" +duration = "8m03s" +` + type song struct { + Name string + Duration duration + } + type songs struct { + Song []song + } + var favorites songs + if _, err := Decode(blob, &favorites); err != nil { + log.Fatal(err) + } + + // Code to implement the TextUnmarshaler interface for `duration`: + // + // type duration struct { + // time.Duration + // } + // + // func (d *duration) UnmarshalText(text []byte) error { + // var err error + // d.Duration, err = time.ParseDuration(string(text)) + // return err + // } + + for _, s := range favorites.Song { + fmt.Printf("%s (%s)\n", s.Name, s.Duration) + } + // Output: + // Thunder Road (4m49s) + // Stairway to Heaven (8m3s) +} + +// Example StrictDecoding shows how to detect whether there are keys in the +// TOML document that weren't decoded into the value given. This is useful +// for returning an error to the user if they've included extraneous fields +// in their configuration. +func Example_strictDecoding() { + var blob = ` +key1 = "value1" +key2 = "value2" +key3 = "value3" +` + type config struct { + Key1 string + Key3 string + } + + var conf config + md, err := Decode(blob, &conf) + if err != nil { + log.Fatal(err) + } + fmt.Printf("Undecoded keys: %q\n", md.Undecoded()) + // Output: + // Undecoded keys: ["key2"] +} + +// Example UnmarshalTOML shows how to implement a struct type that knows how to +// unmarshal itself. The struct must take full responsibility for mapping the +// values passed into the struct. The method may be used with interfaces in a +// struct in cases where the actual type is not known until the data is +// examined. +func Example_unmarshalTOML() { + + var blob = ` +[[parts]] +type = "valve" +id = "valve-1" +size = 1.2 +rating = 4 + +[[parts]] +type = "valve" +id = "valve-2" +size = 2.1 +rating = 5 + +[[parts]] +type = "pipe" +id = "pipe-1" +length = 2.1 +diameter = 12 + +[[parts]] +type = "cable" +id = "cable-1" +length = 12 +rating = 3.1 +` + o := &order{} + err := Unmarshal([]byte(blob), o) + if err != nil { + log.Fatal(err) + } + + fmt.Println(len(o.parts)) + + for _, part := range o.parts { + fmt.Println(part.Name()) + } + + // Code to implement UmarshalJSON. + + // type order struct { + // // NOTE `order.parts` is a private slice of type `part` which is an + // // interface and may only be loaded from toml using the + // // UnmarshalTOML() method of the Umarshaler interface. + // parts parts + // } + + // func (o *order) UnmarshalTOML(data interface{}) error { + + // // NOTE the example below contains detailed type casting to show how + // // the 'data' is retrieved. In operational use, a type cast wrapper + // // may be prefered e.g. + // // + // // func AsMap(v interface{}) (map[string]interface{}, error) { + // // return v.(map[string]interface{}) + // // } + // // + // // resulting in: + // // d, _ := AsMap(data) + // // + + // d, _ := data.(map[string]interface{}) + // parts, _ := d["parts"].([]map[string]interface{}) + + // for _, p := range parts { + + // typ, _ := p["type"].(string) + // id, _ := p["id"].(string) + + // // detect the type of part and handle each case + // switch p["type"] { + // case "valve": + + // size := float32(p["size"].(float64)) + // rating := int(p["rating"].(int64)) + + // valve := &valve{ + // Type: typ, + // ID: id, + // Size: size, + // Rating: rating, + // } + + // o.parts = append(o.parts, valve) + + // case "pipe": + + // length := float32(p["length"].(float64)) + // diameter := int(p["diameter"].(int64)) + + // pipe := &pipe{ + // Type: typ, + // ID: id, + // Length: length, + // Diameter: diameter, + // } + + // o.parts = append(o.parts, pipe) + + // case "cable": + + // length := int(p["length"].(int64)) + // rating := float32(p["rating"].(float64)) + + // cable := &cable{ + // Type: typ, + // ID: id, + // Length: length, + // Rating: rating, + // } + + // o.parts = append(o.parts, cable) + + // } + // } + + // return nil + // } + + // type parts []part + + // type part interface { + // Name() string + // } + + // type valve struct { + // Type string + // ID string + // Size float32 + // Rating int + // } + + // func (v *valve) Name() string { + // return fmt.Sprintf("VALVE: %s", v.ID) + // } + + // type pipe struct { + // Type string + // ID string + // Length float32 + // Diameter int + // } + + // func (p *pipe) Name() string { + // return fmt.Sprintf("PIPE: %s", p.ID) + // } + + // type cable struct { + // Type string + // ID string + // Length int + // Rating float32 + // } + + // func (c *cable) Name() string { + // return fmt.Sprintf("CABLE: %s", c.ID) + // } + + // Output: + // 4 + // VALVE: valve-1 + // VALVE: valve-2 + // PIPE: pipe-1 + // CABLE: cable-1 + +} + +type order struct { + // NOTE `order.parts` is a private slice of type `part` which is an + // interface and may only be loaded from toml using the UnmarshalTOML() + // method of the Umarshaler interface. + parts parts +} + +func (o *order) UnmarshalTOML(data interface{}) error { + + // NOTE the example below contains detailed type casting to show how + // the 'data' is retrieved. In operational use, a type cast wrapper + // may be prefered e.g. + // + // func AsMap(v interface{}) (map[string]interface{}, error) { + // return v.(map[string]interface{}) + // } + // + // resulting in: + // d, _ := AsMap(data) + // + + d, _ := data.(map[string]interface{}) + parts, _ := d["parts"].([]map[string]interface{}) + + for _, p := range parts { + + typ, _ := p["type"].(string) + id, _ := p["id"].(string) + + // detect the type of part and handle each case + switch p["type"] { + case "valve": + + size := float32(p["size"].(float64)) + rating := int(p["rating"].(int64)) + + valve := &valve{ + Type: typ, + ID: id, + Size: size, + Rating: rating, + } + + o.parts = append(o.parts, valve) + + case "pipe": + + length := float32(p["length"].(float64)) + diameter := int(p["diameter"].(int64)) + + pipe := &pipe{ + Type: typ, + ID: id, + Length: length, + Diameter: diameter, + } + + o.parts = append(o.parts, pipe) + + case "cable": + + length := int(p["length"].(int64)) + rating := float32(p["rating"].(float64)) + + cable := &cable{ + Type: typ, + ID: id, + Length: length, + Rating: rating, + } + + o.parts = append(o.parts, cable) + + } + } + + return nil +} + +type parts []part + +type part interface { + Name() string +} + +type valve struct { + Type string + ID string + Size float32 + Rating int +} + +func (v *valve) Name() string { + return fmt.Sprintf("VALVE: %s", v.ID) +} + +type pipe struct { + Type string + ID string + Length float32 + Diameter int +} + +func (p *pipe) Name() string { + return fmt.Sprintf("PIPE: %s", p.ID) +} + +type cable struct { + Type string + ID string + Length int + Rating float32 +} + +func (c *cable) Name() string { + return fmt.Sprintf("CABLE: %s", c.ID) +} diff --git a/vendor/github.com/BurntSushi/toml/doc.go b/vendor/github.com/BurntSushi/toml/doc.go new file mode 100644 index 0000000000..fe26800041 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/doc.go @@ -0,0 +1,27 @@ +/* +Package toml provides facilities for decoding and encoding TOML configuration +files via reflection. There is also support for delaying decoding with +the Primitive type, and querying the set of keys in a TOML document with the +MetaData type. + +The specification implemented: https://github.com/mojombo/toml + +The sub-command github.com/BurntSushi/toml/cmd/tomlv can be used to verify +whether a file is a valid TOML document. It can also be used to print the +type of each key in a TOML document. + +Testing + +There are two important types of tests used for this package. The first is +contained inside '*_test.go' files and uses the standard Go unit testing +framework. These tests are primarily devoted to holistically testing the +decoder and encoder. + +The second type of testing is used to verify the implementation's adherence +to the TOML specification. These tests have been factored into their own +project: https://github.com/BurntSushi/toml-test + +The reason the tests are in a separate project is so that they can be used by +any implementation of TOML. Namely, it is language agnostic. +*/ +package toml diff --git a/vendor/github.com/BurntSushi/toml/encode.go b/vendor/github.com/BurntSushi/toml/encode.go new file mode 100644 index 0000000000..4e4c97aed6 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/encode.go @@ -0,0 +1,549 @@ +package toml + +import ( + "bufio" + "errors" + "fmt" + "io" + "reflect" + "sort" + "strconv" + "strings" + "time" +) + +type tomlEncodeError struct{ error } + +var ( + errArrayMixedElementTypes = errors.New( + "can't encode array with mixed element types") + errArrayNilElement = errors.New( + "can't encode array with nil element") + errNonString = errors.New( + "can't encode a map with non-string key type") + errAnonNonStruct = errors.New( + "can't encode an anonymous field that is not a struct") + errArrayNoTable = errors.New( + "TOML array element can't contain a table") + errNoKey = errors.New( + "top-level values must be a Go map or struct") + errAnything = errors.New("") // used in testing +) + +var quotedReplacer = strings.NewReplacer( + "\t", "\\t", + "\n", "\\n", + "\r", "\\r", + "\"", "\\\"", + "\\", "\\\\", +) + +// Encoder controls the encoding of Go values to a TOML document to some +// io.Writer. +// +// The indentation level can be controlled with the Indent field. +type Encoder struct { + // A single indentation level. By default it is two spaces. + Indent string + + // hasWritten is whether we have written any output to w yet. + hasWritten bool + w *bufio.Writer +} + +// NewEncoder returns a TOML encoder that encodes Go values to the io.Writer +// given. By default, a single indentation level is 2 spaces. +func NewEncoder(w io.Writer) *Encoder { + return &Encoder{ + w: bufio.NewWriter(w), + Indent: " ", + } +} + +// Encode writes a TOML representation of the Go value to the underlying +// io.Writer. If the value given cannot be encoded to a valid TOML document, +// then an error is returned. +// +// The mapping between Go values and TOML values should be precisely the same +// as for the Decode* functions. Similarly, the TextMarshaler interface is +// supported by encoding the resulting bytes as strings. (If you want to write +// arbitrary binary data then you will need to use something like base64 since +// TOML does not have any binary types.) +// +// When encoding TOML hashes (i.e., Go maps or structs), keys without any +// sub-hashes are encoded first. +// +// If a Go map is encoded, then its keys are sorted alphabetically for +// deterministic output. More control over this behavior may be provided if +// there is demand for it. +// +// Encoding Go values without a corresponding TOML representation---like map +// types with non-string keys---will cause an error to be returned. Similarly +// for mixed arrays/slices, arrays/slices with nil elements, embedded +// non-struct types and nested slices containing maps or structs. +// (e.g., [][]map[string]string is not allowed but []map[string]string is OK +// and so is []map[string][]string.) +func (enc *Encoder) Encode(v interface{}) error { + rv := eindirect(reflect.ValueOf(v)) + if err := enc.safeEncode(Key([]string{}), rv); err != nil { + return err + } + return enc.w.Flush() +} + +func (enc *Encoder) safeEncode(key Key, rv reflect.Value) (err error) { + defer func() { + if r := recover(); r != nil { + if terr, ok := r.(tomlEncodeError); ok { + err = terr.error + return + } + panic(r) + } + }() + enc.encode(key, rv) + return nil +} + +func (enc *Encoder) encode(key Key, rv reflect.Value) { + // Special case. Time needs to be in ISO8601 format. + // Special case. If we can marshal the type to text, then we used that. + // Basically, this prevents the encoder for handling these types as + // generic structs (or whatever the underlying type of a TextMarshaler is). + switch rv.Interface().(type) { + case time.Time, TextMarshaler: + enc.keyEqElement(key, rv) + return + } + + k := rv.Kind() + switch k { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, + reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, + reflect.Uint64, + reflect.Float32, reflect.Float64, reflect.String, reflect.Bool: + enc.keyEqElement(key, rv) + case reflect.Array, reflect.Slice: + if typeEqual(tomlArrayHash, tomlTypeOfGo(rv)) { + enc.eArrayOfTables(key, rv) + } else { + enc.keyEqElement(key, rv) + } + case reflect.Interface: + if rv.IsNil() { + return + } + enc.encode(key, rv.Elem()) + case reflect.Map: + if rv.IsNil() { + return + } + enc.eTable(key, rv) + case reflect.Ptr: + if rv.IsNil() { + return + } + enc.encode(key, rv.Elem()) + case reflect.Struct: + enc.eTable(key, rv) + default: + panic(e("Unsupported type for key '%s': %s", key, k)) + } +} + +// eElement encodes any value that can be an array element (primitives and +// arrays). +func (enc *Encoder) eElement(rv reflect.Value) { + switch v := rv.Interface().(type) { + case time.Time: + // Special case time.Time as a primitive. Has to come before + // TextMarshaler below because time.Time implements + // encoding.TextMarshaler, but we need to always use UTC. + enc.wf(v.In(time.FixedZone("UTC", 0)).Format("2006-01-02T15:04:05Z")) + return + case TextMarshaler: + // Special case. Use text marshaler if it's available for this value. + if s, err := v.MarshalText(); err != nil { + encPanic(err) + } else { + enc.writeQuoted(string(s)) + } + return + } + switch rv.Kind() { + case reflect.Bool: + enc.wf(strconv.FormatBool(rv.Bool())) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, + reflect.Int64: + enc.wf(strconv.FormatInt(rv.Int(), 10)) + case reflect.Uint, reflect.Uint8, reflect.Uint16, + reflect.Uint32, reflect.Uint64: + enc.wf(strconv.FormatUint(rv.Uint(), 10)) + case reflect.Float32: + enc.wf(floatAddDecimal(strconv.FormatFloat(rv.Float(), 'f', -1, 32))) + case reflect.Float64: + enc.wf(floatAddDecimal(strconv.FormatFloat(rv.Float(), 'f', -1, 64))) + case reflect.Array, reflect.Slice: + enc.eArrayOrSliceElement(rv) + case reflect.Interface: + enc.eElement(rv.Elem()) + case reflect.String: + enc.writeQuoted(rv.String()) + default: + panic(e("Unexpected primitive type: %s", rv.Kind())) + } +} + +// By the TOML spec, all floats must have a decimal with at least one +// number on either side. +func floatAddDecimal(fstr string) string { + if !strings.Contains(fstr, ".") { + return fstr + ".0" + } + return fstr +} + +func (enc *Encoder) writeQuoted(s string) { + enc.wf("\"%s\"", quotedReplacer.Replace(s)) +} + +func (enc *Encoder) eArrayOrSliceElement(rv reflect.Value) { + length := rv.Len() + enc.wf("[") + for i := 0; i < length; i++ { + elem := rv.Index(i) + enc.eElement(elem) + if i != length-1 { + enc.wf(", ") + } + } + enc.wf("]") +} + +func (enc *Encoder) eArrayOfTables(key Key, rv reflect.Value) { + if len(key) == 0 { + encPanic(errNoKey) + } + for i := 0; i < rv.Len(); i++ { + trv := rv.Index(i) + if isNil(trv) { + continue + } + panicIfInvalidKey(key) + enc.newline() + enc.wf("%s[[%s]]", enc.indentStr(key), key.maybeQuotedAll()) + enc.newline() + enc.eMapOrStruct(key, trv) + } +} + +func (enc *Encoder) eTable(key Key, rv reflect.Value) { + panicIfInvalidKey(key) + if len(key) == 1 { + // Output an extra new line between top-level tables. + // (The newline isn't written if nothing else has been written though.) + enc.newline() + } + if len(key) > 0 { + enc.wf("%s[%s]", enc.indentStr(key), key.maybeQuotedAll()) + enc.newline() + } + enc.eMapOrStruct(key, rv) +} + +func (enc *Encoder) eMapOrStruct(key Key, rv reflect.Value) { + switch rv := eindirect(rv); rv.Kind() { + case reflect.Map: + enc.eMap(key, rv) + case reflect.Struct: + enc.eStruct(key, rv) + default: + panic("eTable: unhandled reflect.Value Kind: " + rv.Kind().String()) + } +} + +func (enc *Encoder) eMap(key Key, rv reflect.Value) { + rt := rv.Type() + if rt.Key().Kind() != reflect.String { + encPanic(errNonString) + } + + // Sort keys so that we have deterministic output. And write keys directly + // underneath this key first, before writing sub-structs or sub-maps. + var mapKeysDirect, mapKeysSub []string + for _, mapKey := range rv.MapKeys() { + k := mapKey.String() + if typeIsHash(tomlTypeOfGo(rv.MapIndex(mapKey))) { + mapKeysSub = append(mapKeysSub, k) + } else { + mapKeysDirect = append(mapKeysDirect, k) + } + } + + var writeMapKeys = func(mapKeys []string) { + sort.Strings(mapKeys) + for _, mapKey := range mapKeys { + mrv := rv.MapIndex(reflect.ValueOf(mapKey)) + if isNil(mrv) { + // Don't write anything for nil fields. + continue + } + enc.encode(key.add(mapKey), mrv) + } + } + writeMapKeys(mapKeysDirect) + writeMapKeys(mapKeysSub) +} + +func (enc *Encoder) eStruct(key Key, rv reflect.Value) { + // Write keys for fields directly under this key first, because if we write + // a field that creates a new table, then all keys under it will be in that + // table (not the one we're writing here). + rt := rv.Type() + var fieldsDirect, fieldsSub [][]int + var addFields func(rt reflect.Type, rv reflect.Value, start []int) + addFields = func(rt reflect.Type, rv reflect.Value, start []int) { + for i := 0; i < rt.NumField(); i++ { + f := rt.Field(i) + // skip unexported fields + if f.PkgPath != "" && !f.Anonymous { + continue + } + frv := rv.Field(i) + if f.Anonymous { + t := f.Type + switch t.Kind() { + case reflect.Struct: + addFields(t, frv, f.Index) + continue + case reflect.Ptr: + if t.Elem().Kind() == reflect.Struct { + if !frv.IsNil() { + addFields(t.Elem(), frv.Elem(), f.Index) + } + continue + } + // Fall through to the normal field encoding logic below + // for non-struct anonymous fields. + } + } + + if typeIsHash(tomlTypeOfGo(frv)) { + fieldsSub = append(fieldsSub, append(start, f.Index...)) + } else { + fieldsDirect = append(fieldsDirect, append(start, f.Index...)) + } + } + } + addFields(rt, rv, nil) + + var writeFields = func(fields [][]int) { + for _, fieldIndex := range fields { + sft := rt.FieldByIndex(fieldIndex) + sf := rv.FieldByIndex(fieldIndex) + if isNil(sf) { + // Don't write anything for nil fields. + continue + } + + tag := sft.Tag.Get("toml") + if tag == "-" { + continue + } + keyName, opts := getOptions(tag) + if keyName == "" { + keyName = sft.Name + } + if _, ok := opts["omitempty"]; ok && isEmpty(sf) { + continue + } else if _, ok := opts["omitzero"]; ok && isZero(sf) { + continue + } + + enc.encode(key.add(keyName), sf) + } + } + writeFields(fieldsDirect) + writeFields(fieldsSub) +} + +// tomlTypeName returns the TOML type name of the Go value's type. It is +// used to determine whether the types of array elements are mixed (which is +// forbidden). If the Go value is nil, then it is illegal for it to be an array +// element, and valueIsNil is returned as true. + +// Returns the TOML type of a Go value. The type may be `nil`, which means +// no concrete TOML type could be found. +func tomlTypeOfGo(rv reflect.Value) tomlType { + if isNil(rv) || !rv.IsValid() { + return nil + } + switch rv.Kind() { + case reflect.Bool: + return tomlBool + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, + reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, + reflect.Uint64: + return tomlInteger + case reflect.Float32, reflect.Float64: + return tomlFloat + case reflect.Array, reflect.Slice: + if typeEqual(tomlHash, tomlArrayType(rv)) { + return tomlArrayHash + } else { + return tomlArray + } + case reflect.Ptr, reflect.Interface: + return tomlTypeOfGo(rv.Elem()) + case reflect.String: + return tomlString + case reflect.Map: + return tomlHash + case reflect.Struct: + switch rv.Interface().(type) { + case time.Time: + return tomlDatetime + case TextMarshaler: + return tomlString + default: + return tomlHash + } + default: + panic("unexpected reflect.Kind: " + rv.Kind().String()) + } +} + +// tomlArrayType returns the element type of a TOML array. The type returned +// may be nil if it cannot be determined (e.g., a nil slice or a zero length +// slize). This function may also panic if it finds a type that cannot be +// expressed in TOML (such as nil elements, heterogeneous arrays or directly +// nested arrays of tables). +func tomlArrayType(rv reflect.Value) tomlType { + if isNil(rv) || !rv.IsValid() || rv.Len() == 0 { + return nil + } + firstType := tomlTypeOfGo(rv.Index(0)) + if firstType == nil { + encPanic(errArrayNilElement) + } + + rvlen := rv.Len() + for i := 1; i < rvlen; i++ { + elem := rv.Index(i) + switch elemType := tomlTypeOfGo(elem); { + case elemType == nil: + encPanic(errArrayNilElement) + case !typeEqual(firstType, elemType): + encPanic(errArrayMixedElementTypes) + } + } + // If we have a nested array, then we must make sure that the nested + // array contains ONLY primitives. + // This checks arbitrarily nested arrays. + if typeEqual(firstType, tomlArray) || typeEqual(firstType, tomlArrayHash) { + nest := tomlArrayType(eindirect(rv.Index(0))) + if typeEqual(nest, tomlHash) || typeEqual(nest, tomlArrayHash) { + encPanic(errArrayNoTable) + } + } + return firstType +} + +func getOptions(keyName string) (string, map[string]struct{}) { + opts := make(map[string]struct{}) + ss := strings.Split(keyName, ",") + name := ss[0] + if len(ss) > 1 { + for _, opt := range ss { + opts[opt] = struct{}{} + } + } + + return name, opts +} + +func isZero(rv reflect.Value) bool { + switch rv.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return rv.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return rv.Uint() == 0 + case reflect.Float32, reflect.Float64: + return rv.Float() == 0.0 + } + return false +} + +func isEmpty(rv reflect.Value) bool { + switch rv.Kind() { + case reflect.Array, reflect.Slice, reflect.Map, reflect.String: + return rv.Len() == 0 + case reflect.Bool: + return !rv.Bool() + } + return false +} + +func (enc *Encoder) newline() { + if enc.hasWritten { + enc.wf("\n") + } +} + +func (enc *Encoder) keyEqElement(key Key, val reflect.Value) { + if len(key) == 0 { + encPanic(errNoKey) + } + panicIfInvalidKey(key) + enc.wf("%s%s = ", enc.indentStr(key), key.maybeQuoted(len(key)-1)) + enc.eElement(val) + enc.newline() +} + +func (enc *Encoder) wf(format string, v ...interface{}) { + if _, err := fmt.Fprintf(enc.w, format, v...); err != nil { + encPanic(err) + } + enc.hasWritten = true +} + +func (enc *Encoder) indentStr(key Key) string { + return strings.Repeat(enc.Indent, len(key)-1) +} + +func encPanic(err error) { + panic(tomlEncodeError{err}) +} + +func eindirect(v reflect.Value) reflect.Value { + switch v.Kind() { + case reflect.Ptr, reflect.Interface: + return eindirect(v.Elem()) + default: + return v + } +} + +func isNil(rv reflect.Value) bool { + switch rv.Kind() { + case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return rv.IsNil() + default: + return false + } +} + +func panicIfInvalidKey(key Key) { + for _, k := range key { + if len(k) == 0 { + encPanic(e("Key '%s' is not a valid table name. Key names "+ + "cannot be empty.", key.maybeQuotedAll())) + } + } +} + +func isValidKeyName(s string) bool { + return len(s) != 0 +} diff --git a/vendor/github.com/BurntSushi/toml/encode_test.go b/vendor/github.com/BurntSushi/toml/encode_test.go new file mode 100644 index 0000000000..ef7acdd74b --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/encode_test.go @@ -0,0 +1,590 @@ +package toml + +import ( + "bytes" + "fmt" + "log" + "net" + "testing" + "time" +) + +func TestEncodeRoundTrip(t *testing.T) { + type Config struct { + Age int + Cats []string + Pi float64 + Perfection []int + DOB time.Time + Ipaddress net.IP + } + + var inputs = Config{ + 13, + []string{"one", "two", "three"}, + 3.145, + []int{11, 2, 3, 4}, + time.Now(), + net.ParseIP("192.168.59.254"), + } + + var firstBuffer bytes.Buffer + e := NewEncoder(&firstBuffer) + err := e.Encode(inputs) + if err != nil { + t.Fatal(err) + } + var outputs Config + if _, err := Decode(firstBuffer.String(), &outputs); err != nil { + log.Printf("Could not decode:\n-----\n%s\n-----\n", + firstBuffer.String()) + t.Fatal(err) + } + + // could test each value individually, but I'm lazy + var secondBuffer bytes.Buffer + e2 := NewEncoder(&secondBuffer) + err = e2.Encode(outputs) + if err != nil { + t.Fatal(err) + } + if firstBuffer.String() != secondBuffer.String() { + t.Error( + firstBuffer.String(), + "\n\n is not identical to\n\n", + secondBuffer.String()) + } +} + +// XXX(burntsushi) +// I think these tests probably should be removed. They are good, but they +// ought to be obsolete by toml-test. +func TestEncode(t *testing.T) { + type Embedded struct { + Int int `toml:"_int"` + } + type NonStruct int + + date := time.Date(2014, 5, 11, 20, 30, 40, 0, time.FixedZone("IST", 3600)) + dateStr := "2014-05-11T19:30:40Z" + + tests := map[string]struct { + input interface{} + wantOutput string + wantError error + }{ + "bool field": { + input: struct { + BoolTrue bool + BoolFalse bool + }{true, false}, + wantOutput: "BoolTrue = true\nBoolFalse = false\n", + }, + "int fields": { + input: struct { + Int int + Int8 int8 + Int16 int16 + Int32 int32 + Int64 int64 + }{1, 2, 3, 4, 5}, + wantOutput: "Int = 1\nInt8 = 2\nInt16 = 3\nInt32 = 4\nInt64 = 5\n", + }, + "uint fields": { + input: struct { + Uint uint + Uint8 uint8 + Uint16 uint16 + Uint32 uint32 + Uint64 uint64 + }{1, 2, 3, 4, 5}, + wantOutput: "Uint = 1\nUint8 = 2\nUint16 = 3\nUint32 = 4" + + "\nUint64 = 5\n", + }, + "float fields": { + input: struct { + Float32 float32 + Float64 float64 + }{1.5, 2.5}, + wantOutput: "Float32 = 1.5\nFloat64 = 2.5\n", + }, + "string field": { + input: struct{ String string }{"foo"}, + wantOutput: "String = \"foo\"\n", + }, + "string field and unexported field": { + input: struct { + String string + unexported int + }{"foo", 0}, + wantOutput: "String = \"foo\"\n", + }, + "datetime field in UTC": { + input: struct{ Date time.Time }{date}, + wantOutput: fmt.Sprintf("Date = %s\n", dateStr), + }, + "datetime field as primitive": { + // Using a map here to fail if isStructOrMap() returns true for + // time.Time. + input: map[string]interface{}{ + "Date": date, + "Int": 1, + }, + wantOutput: fmt.Sprintf("Date = %s\nInt = 1\n", dateStr), + }, + "array fields": { + input: struct { + IntArray0 [0]int + IntArray3 [3]int + }{[0]int{}, [3]int{1, 2, 3}}, + wantOutput: "IntArray0 = []\nIntArray3 = [1, 2, 3]\n", + }, + "slice fields": { + input: struct{ IntSliceNil, IntSlice0, IntSlice3 []int }{ + nil, []int{}, []int{1, 2, 3}, + }, + wantOutput: "IntSlice0 = []\nIntSlice3 = [1, 2, 3]\n", + }, + "datetime slices": { + input: struct{ DatetimeSlice []time.Time }{ + []time.Time{date, date}, + }, + wantOutput: fmt.Sprintf("DatetimeSlice = [%s, %s]\n", + dateStr, dateStr), + }, + "nested arrays and slices": { + input: struct { + SliceOfArrays [][2]int + ArrayOfSlices [2][]int + SliceOfArraysOfSlices [][2][]int + ArrayOfSlicesOfArrays [2][][2]int + SliceOfMixedArrays [][2]interface{} + ArrayOfMixedSlices [2][]interface{} + }{ + [][2]int{{1, 2}, {3, 4}}, + [2][]int{{1, 2}, {3, 4}}, + [][2][]int{ + { + {1, 2}, {3, 4}, + }, + { + {5, 6}, {7, 8}, + }, + }, + [2][][2]int{ + { + {1, 2}, {3, 4}, + }, + { + {5, 6}, {7, 8}, + }, + }, + [][2]interface{}{ + {1, 2}, {"a", "b"}, + }, + [2][]interface{}{ + {1, 2}, {"a", "b"}, + }, + }, + wantOutput: `SliceOfArrays = [[1, 2], [3, 4]] +ArrayOfSlices = [[1, 2], [3, 4]] +SliceOfArraysOfSlices = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]] +ArrayOfSlicesOfArrays = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]] +SliceOfMixedArrays = [[1, 2], ["a", "b"]] +ArrayOfMixedSlices = [[1, 2], ["a", "b"]] +`, + }, + "empty slice": { + input: struct{ Empty []interface{} }{[]interface{}{}}, + wantOutput: "Empty = []\n", + }, + "(error) slice with element type mismatch (string and integer)": { + input: struct{ Mixed []interface{} }{[]interface{}{1, "a"}}, + wantError: errArrayMixedElementTypes, + }, + "(error) slice with element type mismatch (integer and float)": { + input: struct{ Mixed []interface{} }{[]interface{}{1, 2.5}}, + wantError: errArrayMixedElementTypes, + }, + "slice with elems of differing Go types, same TOML types": { + input: struct { + MixedInts []interface{} + MixedFloats []interface{} + }{ + []interface{}{ + int(1), int8(2), int16(3), int32(4), int64(5), + uint(1), uint8(2), uint16(3), uint32(4), uint64(5), + }, + []interface{}{float32(1.5), float64(2.5)}, + }, + wantOutput: "MixedInts = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]\n" + + "MixedFloats = [1.5, 2.5]\n", + }, + "(error) slice w/ element type mismatch (one is nested array)": { + input: struct{ Mixed []interface{} }{ + []interface{}{1, []interface{}{2}}, + }, + wantError: errArrayMixedElementTypes, + }, + "(error) slice with 1 nil element": { + input: struct{ NilElement1 []interface{} }{[]interface{}{nil}}, + wantError: errArrayNilElement, + }, + "(error) slice with 1 nil element (and other non-nil elements)": { + input: struct{ NilElement []interface{} }{ + []interface{}{1, nil}, + }, + wantError: errArrayNilElement, + }, + "simple map": { + input: map[string]int{"a": 1, "b": 2}, + wantOutput: "a = 1\nb = 2\n", + }, + "map with interface{} value type": { + input: map[string]interface{}{"a": 1, "b": "c"}, + wantOutput: "a = 1\nb = \"c\"\n", + }, + "map with interface{} value type, some of which are structs": { + input: map[string]interface{}{ + "a": struct{ Int int }{2}, + "b": 1, + }, + wantOutput: "b = 1\n\n[a]\n Int = 2\n", + }, + "nested map": { + input: map[string]map[string]int{ + "a": {"b": 1}, + "c": {"d": 2}, + }, + wantOutput: "[a]\n b = 1\n\n[c]\n d = 2\n", + }, + "nested struct": { + input: struct{ Struct struct{ Int int } }{ + struct{ Int int }{1}, + }, + wantOutput: "[Struct]\n Int = 1\n", + }, + "nested struct and non-struct field": { + input: struct { + Struct struct{ Int int } + Bool bool + }{struct{ Int int }{1}, true}, + wantOutput: "Bool = true\n\n[Struct]\n Int = 1\n", + }, + "2 nested structs": { + input: struct{ Struct1, Struct2 struct{ Int int } }{ + struct{ Int int }{1}, struct{ Int int }{2}, + }, + wantOutput: "[Struct1]\n Int = 1\n\n[Struct2]\n Int = 2\n", + }, + "deeply nested structs": { + input: struct { + Struct1, Struct2 struct{ Struct3 *struct{ Int int } } + }{ + struct{ Struct3 *struct{ Int int } }{&struct{ Int int }{1}}, + struct{ Struct3 *struct{ Int int } }{nil}, + }, + wantOutput: "[Struct1]\n [Struct1.Struct3]\n Int = 1" + + "\n\n[Struct2]\n", + }, + "nested struct with nil struct elem": { + input: struct { + Struct struct{ Inner *struct{ Int int } } + }{ + struct{ Inner *struct{ Int int } }{nil}, + }, + wantOutput: "[Struct]\n", + }, + "nested struct with no fields": { + input: struct { + Struct struct{ Inner struct{} } + }{ + struct{ Inner struct{} }{struct{}{}}, + }, + wantOutput: "[Struct]\n [Struct.Inner]\n", + }, + "struct with tags": { + input: struct { + Struct struct { + Int int `toml:"_int"` + } `toml:"_struct"` + Bool bool `toml:"_bool"` + }{ + struct { + Int int `toml:"_int"` + }{1}, true, + }, + wantOutput: "_bool = true\n\n[_struct]\n _int = 1\n", + }, + "embedded struct": { + input: struct{ Embedded }{Embedded{1}}, + wantOutput: "_int = 1\n", + }, + "embedded *struct": { + input: struct{ *Embedded }{&Embedded{1}}, + wantOutput: "_int = 1\n", + }, + "nested embedded struct": { + input: struct { + Struct struct{ Embedded } `toml:"_struct"` + }{struct{ Embedded }{Embedded{1}}}, + wantOutput: "[_struct]\n _int = 1\n", + }, + "nested embedded *struct": { + input: struct { + Struct struct{ *Embedded } `toml:"_struct"` + }{struct{ *Embedded }{&Embedded{1}}}, + wantOutput: "[_struct]\n _int = 1\n", + }, + "embedded non-struct": { + input: struct{ NonStruct }{5}, + wantOutput: "NonStruct = 5\n", + }, + "array of tables": { + input: struct { + Structs []*struct{ Int int } `toml:"struct"` + }{ + []*struct{ Int int }{{1}, {3}}, + }, + wantOutput: "[[struct]]\n Int = 1\n\n[[struct]]\n Int = 3\n", + }, + "array of tables order": { + input: map[string]interface{}{ + "map": map[string]interface{}{ + "zero": 5, + "arr": []map[string]int{ + { + "friend": 5, + }, + }, + }, + }, + wantOutput: "[map]\n zero = 5\n\n [[map.arr]]\n friend = 5\n", + }, + "(error) top-level slice": { + input: []struct{ Int int }{{1}, {2}, {3}}, + wantError: errNoKey, + }, + "(error) slice of slice": { + input: struct { + Slices [][]struct{ Int int } + }{ + [][]struct{ Int int }{{{1}}, {{2}}, {{3}}}, + }, + wantError: errArrayNoTable, + }, + "(error) map no string key": { + input: map[int]string{1: ""}, + wantError: errNonString, + }, + "(error) empty key name": { + input: map[string]int{"": 1}, + wantError: errAnything, + }, + "(error) empty map name": { + input: map[string]interface{}{ + "": map[string]int{"v": 1}, + }, + wantError: errAnything, + }, + } + for label, test := range tests { + encodeExpected(t, label, test.input, test.wantOutput, test.wantError) + } +} + +func TestEncodeNestedTableArrays(t *testing.T) { + type song struct { + Name string `toml:"name"` + } + type album struct { + Name string `toml:"name"` + Songs []song `toml:"songs"` + } + type springsteen struct { + Albums []album `toml:"albums"` + } + value := springsteen{ + []album{ + {"Born to Run", + []song{{"Jungleland"}, {"Meeting Across the River"}}}, + {"Born in the USA", + []song{{"Glory Days"}, {"Dancing in the Dark"}}}, + }, + } + expected := `[[albums]] + name = "Born to Run" + + [[albums.songs]] + name = "Jungleland" + + [[albums.songs]] + name = "Meeting Across the River" + +[[albums]] + name = "Born in the USA" + + [[albums.songs]] + name = "Glory Days" + + [[albums.songs]] + name = "Dancing in the Dark" +` + encodeExpected(t, "nested table arrays", value, expected, nil) +} + +func TestEncodeArrayHashWithNormalHashOrder(t *testing.T) { + type Alpha struct { + V int + } + type Beta struct { + V int + } + type Conf struct { + V int + A Alpha + B []Beta + } + + val := Conf{ + V: 1, + A: Alpha{2}, + B: []Beta{{3}}, + } + expected := "V = 1\n\n[A]\n V = 2\n\n[[B]]\n V = 3\n" + encodeExpected(t, "array hash with normal hash order", val, expected, nil) +} + +func TestEncodeWithOmitEmpty(t *testing.T) { + type simple struct { + Bool bool `toml:"bool,omitempty"` + String string `toml:"string,omitempty"` + Array [0]byte `toml:"array,omitempty"` + Slice []int `toml:"slice,omitempty"` + Map map[string]string `toml:"map,omitempty"` + } + + var v simple + encodeExpected(t, "fields with omitempty are omitted when empty", v, "", nil) + v = simple{ + Bool: true, + String: " ", + Slice: []int{2, 3, 4}, + Map: map[string]string{"foo": "bar"}, + } + expected := `bool = true +string = " " +slice = [2, 3, 4] + +[map] + foo = "bar" +` + encodeExpected(t, "fields with omitempty are not omitted when non-empty", + v, expected, nil) +} + +func TestEncodeWithOmitZero(t *testing.T) { + type simple struct { + Number int `toml:"number,omitzero"` + Real float64 `toml:"real,omitzero"` + Unsigned uint `toml:"unsigned,omitzero"` + } + + value := simple{0, 0.0, uint(0)} + expected := "" + + encodeExpected(t, "simple with omitzero, all zero", value, expected, nil) + + value.Number = 10 + value.Real = 20 + value.Unsigned = 5 + expected = `number = 10 +real = 20.0 +unsigned = 5 +` + encodeExpected(t, "simple with omitzero, non-zero", value, expected, nil) +} + +func TestEncodeOmitemptyWithEmptyName(t *testing.T) { + type simple struct { + S []int `toml:",omitempty"` + } + v := simple{[]int{1, 2, 3}} + expected := "S = [1, 2, 3]\n" + encodeExpected(t, "simple with omitempty, no name, non-empty field", + v, expected, nil) +} + +func TestEncodeAnonymousStructPointerField(t *testing.T) { + type Sub struct{} + type simple struct { + *Sub + } + + value := simple{} + expected := "" + encodeExpected(t, "nil anonymous struct pointer field", value, expected, nil) + + value = simple{Sub: &Sub{}} + expected = "" + encodeExpected(t, "non-nil anonymous struct pointer field", value, expected, nil) +} + +func TestEncodeIgnoredFields(t *testing.T) { + type simple struct { + Number int `toml:"-"` + } + value := simple{} + expected := "" + encodeExpected(t, "ignored field", value, expected, nil) +} + +func encodeExpected( + t *testing.T, label string, val interface{}, wantStr string, wantErr error, +) { + var buf bytes.Buffer + enc := NewEncoder(&buf) + err := enc.Encode(val) + if err != wantErr { + if wantErr != nil { + if wantErr == errAnything && err != nil { + return + } + t.Errorf("%s: want Encode error %v, got %v", label, wantErr, err) + } else { + t.Errorf("%s: Encode failed: %s", label, err) + } + } + if err != nil { + return + } + if got := buf.String(); wantStr != got { + t.Errorf("%s: want\n-----\n%q\n-----\nbut got\n-----\n%q\n-----\n", + label, wantStr, got) + } +} + +func ExampleEncoder_Encode() { + date, _ := time.Parse(time.RFC822, "14 Mar 10 18:00 UTC") + var config = map[string]interface{}{ + "date": date, + "counts": []int{1, 1, 2, 3, 5, 8}, + "hash": map[string]string{ + "key1": "val1", + "key2": "val2", + }, + } + buf := new(bytes.Buffer) + if err := NewEncoder(buf).Encode(config); err != nil { + log.Fatal(err) + } + fmt.Println(buf.String()) + + // Output: + // counts = [1, 1, 2, 3, 5, 8] + // date = 2010-03-14T18:00:00Z + // + // [hash] + // key1 = "val1" + // key2 = "val2" +} diff --git a/vendor/github.com/BurntSushi/toml/encoding_types.go b/vendor/github.com/BurntSushi/toml/encoding_types.go new file mode 100644 index 0000000000..d36e1dd600 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/encoding_types.go @@ -0,0 +1,19 @@ +// +build go1.2 + +package toml + +// In order to support Go 1.1, we define our own TextMarshaler and +// TextUnmarshaler types. For Go 1.2+, we just alias them with the +// standard library interfaces. + +import ( + "encoding" +) + +// TextMarshaler is a synonym for encoding.TextMarshaler. It is defined here +// so that Go 1.1 can be supported. +type TextMarshaler encoding.TextMarshaler + +// TextUnmarshaler is a synonym for encoding.TextUnmarshaler. It is defined +// here so that Go 1.1 can be supported. +type TextUnmarshaler encoding.TextUnmarshaler diff --git a/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go b/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go new file mode 100644 index 0000000000..e8d503d046 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go @@ -0,0 +1,18 @@ +// +build !go1.2 + +package toml + +// These interfaces were introduced in Go 1.2, so we add them manually when +// compiling for Go 1.1. + +// TextMarshaler is a synonym for encoding.TextMarshaler. It is defined here +// so that Go 1.1 can be supported. +type TextMarshaler interface { + MarshalText() (text []byte, err error) +} + +// TextUnmarshaler is a synonym for encoding.TextUnmarshaler. It is defined +// here so that Go 1.1 can be supported. +type TextUnmarshaler interface { + UnmarshalText(text []byte) error +} diff --git a/vendor/github.com/BurntSushi/toml/lex.go b/vendor/github.com/BurntSushi/toml/lex.go new file mode 100644 index 0000000000..9b20b3a815 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/lex.go @@ -0,0 +1,871 @@ +package toml + +import ( + "fmt" + "strings" + "unicode/utf8" +) + +type itemType int + +const ( + itemError itemType = iota + itemNIL // used in the parser to indicate no type + itemEOF + itemText + itemString + itemRawString + itemMultilineString + itemRawMultilineString + itemBool + itemInteger + itemFloat + itemDatetime + itemArray // the start of an array + itemArrayEnd + itemTableStart + itemTableEnd + itemArrayTableStart + itemArrayTableEnd + itemKeyStart + itemCommentStart +) + +const ( + eof = 0 + tableStart = '[' + tableEnd = ']' + arrayTableStart = '[' + arrayTableEnd = ']' + tableSep = '.' + keySep = '=' + arrayStart = '[' + arrayEnd = ']' + arrayValTerm = ',' + commentStart = '#' + stringStart = '"' + stringEnd = '"' + rawStringStart = '\'' + rawStringEnd = '\'' +) + +type stateFn func(lx *lexer) stateFn + +type lexer struct { + input string + start int + pos int + width int + line int + state stateFn + items chan item + + // A stack of state functions used to maintain context. + // The idea is to reuse parts of the state machine in various places. + // For example, values can appear at the top level or within arbitrarily + // nested arrays. The last state on the stack is used after a value has + // been lexed. Similarly for comments. + stack []stateFn +} + +type item struct { + typ itemType + val string + line int +} + +func (lx *lexer) nextItem() item { + for { + select { + case item := <-lx.items: + return item + default: + lx.state = lx.state(lx) + } + } +} + +func lex(input string) *lexer { + lx := &lexer{ + input: input + "\n", + state: lexTop, + line: 1, + items: make(chan item, 10), + stack: make([]stateFn, 0, 10), + } + return lx +} + +func (lx *lexer) push(state stateFn) { + lx.stack = append(lx.stack, state) +} + +func (lx *lexer) pop() stateFn { + if len(lx.stack) == 0 { + return lx.errorf("BUG in lexer: no states to pop.") + } + last := lx.stack[len(lx.stack)-1] + lx.stack = lx.stack[0 : len(lx.stack)-1] + return last +} + +func (lx *lexer) current() string { + return lx.input[lx.start:lx.pos] +} + +func (lx *lexer) emit(typ itemType) { + lx.items <- item{typ, lx.current(), lx.line} + lx.start = lx.pos +} + +func (lx *lexer) emitTrim(typ itemType) { + lx.items <- item{typ, strings.TrimSpace(lx.current()), lx.line} + lx.start = lx.pos +} + +func (lx *lexer) next() (r rune) { + if lx.pos >= len(lx.input) { + lx.width = 0 + return eof + } + + if lx.input[lx.pos] == '\n' { + lx.line++ + } + r, lx.width = utf8.DecodeRuneInString(lx.input[lx.pos:]) + lx.pos += lx.width + return r +} + +// ignore skips over the pending input before this point. +func (lx *lexer) ignore() { + lx.start = lx.pos +} + +// backup steps back one rune. Can be called only once per call of next. +func (lx *lexer) backup() { + lx.pos -= lx.width + if lx.pos < len(lx.input) && lx.input[lx.pos] == '\n' { + lx.line-- + } +} + +// accept consumes the next rune if it's equal to `valid`. +func (lx *lexer) accept(valid rune) bool { + if lx.next() == valid { + return true + } + lx.backup() + return false +} + +// peek returns but does not consume the next rune in the input. +func (lx *lexer) peek() rune { + r := lx.next() + lx.backup() + return r +} + +// errorf stops all lexing by emitting an error and returning `nil`. +// Note that any value that is a character is escaped if it's a special +// character (new lines, tabs, etc.). +func (lx *lexer) errorf(format string, values ...interface{}) stateFn { + lx.items <- item{ + itemError, + fmt.Sprintf(format, values...), + lx.line, + } + return nil +} + +// lexTop consumes elements at the top level of TOML data. +func lexTop(lx *lexer) stateFn { + r := lx.next() + if isWhitespace(r) || isNL(r) { + return lexSkip(lx, lexTop) + } + + switch r { + case commentStart: + lx.push(lexTop) + return lexCommentStart + case tableStart: + return lexTableStart + case eof: + if lx.pos > lx.start { + return lx.errorf("Unexpected EOF.") + } + lx.emit(itemEOF) + return nil + } + + // At this point, the only valid item can be a key, so we back up + // and let the key lexer do the rest. + lx.backup() + lx.push(lexTopEnd) + return lexKeyStart +} + +// lexTopEnd is entered whenever a top-level item has been consumed. (A value +// or a table.) It must see only whitespace, and will turn back to lexTop +// upon a new line. If it sees EOF, it will quit the lexer successfully. +func lexTopEnd(lx *lexer) stateFn { + r := lx.next() + switch { + case r == commentStart: + // a comment will read to a new line for us. + lx.push(lexTop) + return lexCommentStart + case isWhitespace(r): + return lexTopEnd + case isNL(r): + lx.ignore() + return lexTop + case r == eof: + lx.ignore() + return lexTop + } + return lx.errorf("Expected a top-level item to end with a new line, "+ + "comment or EOF, but got %q instead.", r) +} + +// lexTable lexes the beginning of a table. Namely, it makes sure that +// it starts with a character other than '.' and ']'. +// It assumes that '[' has already been consumed. +// It also handles the case that this is an item in an array of tables. +// e.g., '[[name]]'. +func lexTableStart(lx *lexer) stateFn { + if lx.peek() == arrayTableStart { + lx.next() + lx.emit(itemArrayTableStart) + lx.push(lexArrayTableEnd) + } else { + lx.emit(itemTableStart) + lx.push(lexTableEnd) + } + return lexTableNameStart +} + +func lexTableEnd(lx *lexer) stateFn { + lx.emit(itemTableEnd) + return lexTopEnd +} + +func lexArrayTableEnd(lx *lexer) stateFn { + if r := lx.next(); r != arrayTableEnd { + return lx.errorf("Expected end of table array name delimiter %q, "+ + "but got %q instead.", arrayTableEnd, r) + } + lx.emit(itemArrayTableEnd) + return lexTopEnd +} + +func lexTableNameStart(lx *lexer) stateFn { + switch r := lx.peek(); { + case r == tableEnd || r == eof: + return lx.errorf("Unexpected end of table name. (Table names cannot " + + "be empty.)") + case r == tableSep: + return lx.errorf("Unexpected table separator. (Table names cannot " + + "be empty.)") + case r == stringStart || r == rawStringStart: + lx.ignore() + lx.push(lexTableNameEnd) + return lexValue // reuse string lexing + default: + return lexBareTableName + } +} + +// lexTableName lexes the name of a table. It assumes that at least one +// valid character for the table has already been read. +func lexBareTableName(lx *lexer) stateFn { + switch r := lx.next(); { + case isBareKeyChar(r): + return lexBareTableName + case r == tableSep || r == tableEnd: + lx.backup() + lx.emitTrim(itemText) + return lexTableNameEnd + default: + return lx.errorf("Bare keys cannot contain %q.", r) + } +} + +// lexTableNameEnd reads the end of a piece of a table name, optionally +// consuming whitespace. +func lexTableNameEnd(lx *lexer) stateFn { + switch r := lx.next(); { + case isWhitespace(r): + return lexTableNameEnd + case r == tableSep: + lx.ignore() + return lexTableNameStart + case r == tableEnd: + return lx.pop() + default: + return lx.errorf("Expected '.' or ']' to end table name, but got %q "+ + "instead.", r) + } +} + +// lexKeyStart consumes a key name up until the first non-whitespace character. +// lexKeyStart will ignore whitespace. +func lexKeyStart(lx *lexer) stateFn { + r := lx.peek() + switch { + case r == keySep: + return lx.errorf("Unexpected key separator %q.", keySep) + case isWhitespace(r) || isNL(r): + lx.next() + return lexSkip(lx, lexKeyStart) + case r == stringStart || r == rawStringStart: + lx.ignore() + lx.emit(itemKeyStart) + lx.push(lexKeyEnd) + return lexValue // reuse string lexing + default: + lx.ignore() + lx.emit(itemKeyStart) + return lexBareKey + } +} + +// lexBareKey consumes the text of a bare key. Assumes that the first character +// (which is not whitespace) has not yet been consumed. +func lexBareKey(lx *lexer) stateFn { + switch r := lx.next(); { + case isBareKeyChar(r): + return lexBareKey + case isWhitespace(r): + lx.emitTrim(itemText) + return lexKeyEnd + case r == keySep: + lx.backup() + lx.emitTrim(itemText) + return lexKeyEnd + default: + return lx.errorf("Bare keys cannot contain %q.", r) + } +} + +// lexKeyEnd consumes the end of a key and trims whitespace (up to the key +// separator). +func lexKeyEnd(lx *lexer) stateFn { + switch r := lx.next(); { + case r == keySep: + return lexSkip(lx, lexValue) + case isWhitespace(r): + return lexSkip(lx, lexKeyEnd) + default: + return lx.errorf("Expected key separator %q, but got %q instead.", + keySep, r) + } +} + +// lexValue starts the consumption of a value anywhere a value is expected. +// lexValue will ignore whitespace. +// After a value is lexed, the last state on the next is popped and returned. +func lexValue(lx *lexer) stateFn { + // We allow whitespace to precede a value, but NOT new lines. + // In array syntax, the array states are responsible for ignoring new + // lines. + r := lx.next() + if isWhitespace(r) { + return lexSkip(lx, lexValue) + } + + switch { + case r == arrayStart: + lx.ignore() + lx.emit(itemArray) + return lexArrayValue + case r == stringStart: + if lx.accept(stringStart) { + if lx.accept(stringStart) { + lx.ignore() // Ignore """ + return lexMultilineString + } + lx.backup() + } + lx.ignore() // ignore the '"' + return lexString + case r == rawStringStart: + if lx.accept(rawStringStart) { + if lx.accept(rawStringStart) { + lx.ignore() // Ignore """ + return lexMultilineRawString + } + lx.backup() + } + lx.ignore() // ignore the "'" + return lexRawString + case r == 't': + return lexTrue + case r == 'f': + return lexFalse + case r == '-': + return lexNumberStart + case isDigit(r): + lx.backup() // avoid an extra state and use the same as above + return lexNumberOrDateStart + case r == '.': // special error case, be kind to users + return lx.errorf("Floats must start with a digit, not '.'.") + } + return lx.errorf("Expected value but found %q instead.", r) +} + +// lexArrayValue consumes one value in an array. It assumes that '[' or ',' +// have already been consumed. All whitespace and new lines are ignored. +func lexArrayValue(lx *lexer) stateFn { + r := lx.next() + switch { + case isWhitespace(r) || isNL(r): + return lexSkip(lx, lexArrayValue) + case r == commentStart: + lx.push(lexArrayValue) + return lexCommentStart + case r == arrayValTerm: + return lx.errorf("Unexpected array value terminator %q.", + arrayValTerm) + case r == arrayEnd: + return lexArrayEnd + } + + lx.backup() + lx.push(lexArrayValueEnd) + return lexValue +} + +// lexArrayValueEnd consumes the cruft between values of an array. Namely, +// it ignores whitespace and expects either a ',' or a ']'. +func lexArrayValueEnd(lx *lexer) stateFn { + r := lx.next() + switch { + case isWhitespace(r) || isNL(r): + return lexSkip(lx, lexArrayValueEnd) + case r == commentStart: + lx.push(lexArrayValueEnd) + return lexCommentStart + case r == arrayValTerm: + lx.ignore() + return lexArrayValue // move on to the next value + case r == arrayEnd: + return lexArrayEnd + } + return lx.errorf("Expected an array value terminator %q or an array "+ + "terminator %q, but got %q instead.", arrayValTerm, arrayEnd, r) +} + +// lexArrayEnd finishes the lexing of an array. It assumes that a ']' has +// just been consumed. +func lexArrayEnd(lx *lexer) stateFn { + lx.ignore() + lx.emit(itemArrayEnd) + return lx.pop() +} + +// lexString consumes the inner contents of a string. It assumes that the +// beginning '"' has already been consumed and ignored. +func lexString(lx *lexer) stateFn { + r := lx.next() + switch { + case isNL(r): + return lx.errorf("Strings cannot contain new lines.") + case r == '\\': + lx.push(lexString) + return lexStringEscape + case r == stringEnd: + lx.backup() + lx.emit(itemString) + lx.next() + lx.ignore() + return lx.pop() + } + return lexString +} + +// lexMultilineString consumes the inner contents of a string. It assumes that +// the beginning '"""' has already been consumed and ignored. +func lexMultilineString(lx *lexer) stateFn { + r := lx.next() + switch { + case r == '\\': + return lexMultilineStringEscape + case r == stringEnd: + if lx.accept(stringEnd) { + if lx.accept(stringEnd) { + lx.backup() + lx.backup() + lx.backup() + lx.emit(itemMultilineString) + lx.next() + lx.next() + lx.next() + lx.ignore() + return lx.pop() + } + lx.backup() + } + } + return lexMultilineString +} + +// lexRawString consumes a raw string. Nothing can be escaped in such a string. +// It assumes that the beginning "'" has already been consumed and ignored. +func lexRawString(lx *lexer) stateFn { + r := lx.next() + switch { + case isNL(r): + return lx.errorf("Strings cannot contain new lines.") + case r == rawStringEnd: + lx.backup() + lx.emit(itemRawString) + lx.next() + lx.ignore() + return lx.pop() + } + return lexRawString +} + +// lexMultilineRawString consumes a raw string. Nothing can be escaped in such +// a string. It assumes that the beginning "'" has already been consumed and +// ignored. +func lexMultilineRawString(lx *lexer) stateFn { + r := lx.next() + switch { + case r == rawStringEnd: + if lx.accept(rawStringEnd) { + if lx.accept(rawStringEnd) { + lx.backup() + lx.backup() + lx.backup() + lx.emit(itemRawMultilineString) + lx.next() + lx.next() + lx.next() + lx.ignore() + return lx.pop() + } + lx.backup() + } + } + return lexMultilineRawString +} + +// lexMultilineStringEscape consumes an escaped character. It assumes that the +// preceding '\\' has already been consumed. +func lexMultilineStringEscape(lx *lexer) stateFn { + // Handle the special case first: + if isNL(lx.next()) { + return lexMultilineString + } else { + lx.backup() + lx.push(lexMultilineString) + return lexStringEscape(lx) + } +} + +func lexStringEscape(lx *lexer) stateFn { + r := lx.next() + switch r { + case 'b': + fallthrough + case 't': + fallthrough + case 'n': + fallthrough + case 'f': + fallthrough + case 'r': + fallthrough + case '"': + fallthrough + case '\\': + return lx.pop() + case 'u': + return lexShortUnicodeEscape + case 'U': + return lexLongUnicodeEscape + } + return lx.errorf("Invalid escape character %q. Only the following "+ + "escape characters are allowed: "+ + "\\b, \\t, \\n, \\f, \\r, \\\", \\/, \\\\, "+ + "\\uXXXX and \\UXXXXXXXX.", r) +} + +func lexShortUnicodeEscape(lx *lexer) stateFn { + var r rune + for i := 0; i < 4; i++ { + r = lx.next() + if !isHexadecimal(r) { + return lx.errorf("Expected four hexadecimal digits after '\\u', "+ + "but got '%s' instead.", lx.current()) + } + } + return lx.pop() +} + +func lexLongUnicodeEscape(lx *lexer) stateFn { + var r rune + for i := 0; i < 8; i++ { + r = lx.next() + if !isHexadecimal(r) { + return lx.errorf("Expected eight hexadecimal digits after '\\U', "+ + "but got '%s' instead.", lx.current()) + } + } + return lx.pop() +} + +// lexNumberOrDateStart consumes either a (positive) integer, float or +// datetime. It assumes that NO negative sign has been consumed. +func lexNumberOrDateStart(lx *lexer) stateFn { + r := lx.next() + if !isDigit(r) { + if r == '.' { + return lx.errorf("Floats must start with a digit, not '.'.") + } else { + return lx.errorf("Expected a digit but got %q.", r) + } + } + return lexNumberOrDate +} + +// lexNumberOrDate consumes either a (positive) integer, float or datetime. +func lexNumberOrDate(lx *lexer) stateFn { + r := lx.next() + switch { + case r == '-': + if lx.pos-lx.start != 5 { + return lx.errorf("All ISO8601 dates must be in full Zulu form.") + } + return lexDateAfterYear + case isDigit(r): + return lexNumberOrDate + case r == '.': + return lexFloatStart + } + + lx.backup() + lx.emit(itemInteger) + return lx.pop() +} + +// lexDateAfterYear consumes a full Zulu Datetime in ISO8601 format. +// It assumes that "YYYY-" has already been consumed. +func lexDateAfterYear(lx *lexer) stateFn { + formats := []rune{ + // digits are '0'. + // everything else is direct equality. + '0', '0', '-', '0', '0', + 'T', + '0', '0', ':', '0', '0', ':', '0', '0', + 'Z', + } + for _, f := range formats { + r := lx.next() + if f == '0' { + if !isDigit(r) { + return lx.errorf("Expected digit in ISO8601 datetime, "+ + "but found %q instead.", r) + } + } else if f != r { + return lx.errorf("Expected %q in ISO8601 datetime, "+ + "but found %q instead.", f, r) + } + } + lx.emit(itemDatetime) + return lx.pop() +} + +// lexNumberStart consumes either an integer or a float. It assumes that +// a negative sign has already been read, but that *no* digits have been +// consumed. lexNumberStart will move to the appropriate integer or float +// states. +func lexNumberStart(lx *lexer) stateFn { + // we MUST see a digit. Even floats have to start with a digit. + r := lx.next() + if !isDigit(r) { + if r == '.' { + return lx.errorf("Floats must start with a digit, not '.'.") + } else { + return lx.errorf("Expected a digit but got %q.", r) + } + } + return lexNumber +} + +// lexNumber consumes an integer or a float after seeing the first digit. +func lexNumber(lx *lexer) stateFn { + r := lx.next() + switch { + case isDigit(r): + return lexNumber + case r == '.': + return lexFloatStart + } + + lx.backup() + lx.emit(itemInteger) + return lx.pop() +} + +// lexFloatStart starts the consumption of digits of a float after a '.'. +// Namely, at least one digit is required. +func lexFloatStart(lx *lexer) stateFn { + r := lx.next() + if !isDigit(r) { + return lx.errorf("Floats must have a digit after the '.', but got "+ + "%q instead.", r) + } + return lexFloat +} + +// lexFloat consumes the digits of a float after a '.'. +// Assumes that one digit has been consumed after a '.' already. +func lexFloat(lx *lexer) stateFn { + r := lx.next() + if isDigit(r) { + return lexFloat + } + + lx.backup() + lx.emit(itemFloat) + return lx.pop() +} + +// lexConst consumes the s[1:] in s. It assumes that s[0] has already been +// consumed. +func lexConst(lx *lexer, s string) stateFn { + for i := range s[1:] { + if r := lx.next(); r != rune(s[i+1]) { + return lx.errorf("Expected %q, but found %q instead.", s[:i+1], + s[:i]+string(r)) + } + } + return nil +} + +// lexTrue consumes the "rue" in "true". It assumes that 't' has already +// been consumed. +func lexTrue(lx *lexer) stateFn { + if fn := lexConst(lx, "true"); fn != nil { + return fn + } + lx.emit(itemBool) + return lx.pop() +} + +// lexFalse consumes the "alse" in "false". It assumes that 'f' has already +// been consumed. +func lexFalse(lx *lexer) stateFn { + if fn := lexConst(lx, "false"); fn != nil { + return fn + } + lx.emit(itemBool) + return lx.pop() +} + +// lexCommentStart begins the lexing of a comment. It will emit +// itemCommentStart and consume no characters, passing control to lexComment. +func lexCommentStart(lx *lexer) stateFn { + lx.ignore() + lx.emit(itemCommentStart) + return lexComment +} + +// lexComment lexes an entire comment. It assumes that '#' has been consumed. +// It will consume *up to* the first new line character, and pass control +// back to the last state on the stack. +func lexComment(lx *lexer) stateFn { + r := lx.peek() + if isNL(r) || r == eof { + lx.emit(itemText) + return lx.pop() + } + lx.next() + return lexComment +} + +// lexSkip ignores all slurped input and moves on to the next state. +func lexSkip(lx *lexer, nextState stateFn) stateFn { + return func(lx *lexer) stateFn { + lx.ignore() + return nextState + } +} + +// isWhitespace returns true if `r` is a whitespace character according +// to the spec. +func isWhitespace(r rune) bool { + return r == '\t' || r == ' ' +} + +func isNL(r rune) bool { + return r == '\n' || r == '\r' +} + +func isDigit(r rune) bool { + return r >= '0' && r <= '9' +} + +func isHexadecimal(r rune) bool { + return (r >= '0' && r <= '9') || + (r >= 'a' && r <= 'f') || + (r >= 'A' && r <= 'F') +} + +func isBareKeyChar(r rune) bool { + return (r >= 'A' && r <= 'Z') || + (r >= 'a' && r <= 'z') || + (r >= '0' && r <= '9') || + r == '_' || + r == '-' +} + +func (itype itemType) String() string { + switch itype { + case itemError: + return "Error" + case itemNIL: + return "NIL" + case itemEOF: + return "EOF" + case itemText: + return "Text" + case itemString: + return "String" + case itemRawString: + return "String" + case itemMultilineString: + return "String" + case itemRawMultilineString: + return "String" + case itemBool: + return "Bool" + case itemInteger: + return "Integer" + case itemFloat: + return "Float" + case itemDatetime: + return "DateTime" + case itemTableStart: + return "TableStart" + case itemTableEnd: + return "TableEnd" + case itemKeyStart: + return "KeyStart" + case itemArray: + return "Array" + case itemArrayEnd: + return "ArrayEnd" + case itemCommentStart: + return "CommentStart" + } + panic(fmt.Sprintf("BUG: Unknown type '%d'.", int(itype))) +} + +func (item item) String() string { + return fmt.Sprintf("(%s, %s)", item.typ.String(), item.val) +} diff --git a/vendor/github.com/BurntSushi/toml/parse.go b/vendor/github.com/BurntSushi/toml/parse.go new file mode 100644 index 0000000000..6a82e84f64 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/parse.go @@ -0,0 +1,493 @@ +package toml + +import ( + "fmt" + "log" + "strconv" + "strings" + "time" + "unicode" + "unicode/utf8" +) + +type parser struct { + mapping map[string]interface{} + types map[string]tomlType + lx *lexer + + // A list of keys in the order that they appear in the TOML data. + ordered []Key + + // the full key for the current hash in scope + context Key + + // the base key name for everything except hashes + currentKey string + + // rough approximation of line number + approxLine int + + // A map of 'key.group.names' to whether they were created implicitly. + implicits map[string]bool +} + +type parseError string + +func (pe parseError) Error() string { + return string(pe) +} + +func parse(data string) (p *parser, err error) { + defer func() { + if r := recover(); r != nil { + var ok bool + if err, ok = r.(parseError); ok { + return + } + panic(r) + } + }() + + p = &parser{ + mapping: make(map[string]interface{}), + types: make(map[string]tomlType), + lx: lex(data), + ordered: make([]Key, 0), + implicits: make(map[string]bool), + } + for { + item := p.next() + if item.typ == itemEOF { + break + } + p.topLevel(item) + } + + return p, nil +} + +func (p *parser) panicf(format string, v ...interface{}) { + msg := fmt.Sprintf("Near line %d (last key parsed '%s'): %s", + p.approxLine, p.current(), fmt.Sprintf(format, v...)) + panic(parseError(msg)) +} + +func (p *parser) next() item { + it := p.lx.nextItem() + if it.typ == itemError { + p.panicf("%s", it.val) + } + return it +} + +func (p *parser) bug(format string, v ...interface{}) { + log.Panicf("BUG: %s\n\n", fmt.Sprintf(format, v...)) +} + +func (p *parser) expect(typ itemType) item { + it := p.next() + p.assertEqual(typ, it.typ) + return it +} + +func (p *parser) assertEqual(expected, got itemType) { + if expected != got { + p.bug("Expected '%s' but got '%s'.", expected, got) + } +} + +func (p *parser) topLevel(item item) { + switch item.typ { + case itemCommentStart: + p.approxLine = item.line + p.expect(itemText) + case itemTableStart: + kg := p.next() + p.approxLine = kg.line + + var key Key + for ; kg.typ != itemTableEnd && kg.typ != itemEOF; kg = p.next() { + key = append(key, p.keyString(kg)) + } + p.assertEqual(itemTableEnd, kg.typ) + + p.establishContext(key, false) + p.setType("", tomlHash) + p.ordered = append(p.ordered, key) + case itemArrayTableStart: + kg := p.next() + p.approxLine = kg.line + + var key Key + for ; kg.typ != itemArrayTableEnd && kg.typ != itemEOF; kg = p.next() { + key = append(key, p.keyString(kg)) + } + p.assertEqual(itemArrayTableEnd, kg.typ) + + p.establishContext(key, true) + p.setType("", tomlArrayHash) + p.ordered = append(p.ordered, key) + case itemKeyStart: + kname := p.next() + p.approxLine = kname.line + p.currentKey = p.keyString(kname) + + val, typ := p.value(p.next()) + p.setValue(p.currentKey, val) + p.setType(p.currentKey, typ) + p.ordered = append(p.ordered, p.context.add(p.currentKey)) + p.currentKey = "" + default: + p.bug("Unexpected type at top level: %s", item.typ) + } +} + +// Gets a string for a key (or part of a key in a table name). +func (p *parser) keyString(it item) string { + switch it.typ { + case itemText: + return it.val + case itemString, itemMultilineString, + itemRawString, itemRawMultilineString: + s, _ := p.value(it) + return s.(string) + default: + p.bug("Unexpected key type: %s", it.typ) + panic("unreachable") + } +} + +// value translates an expected value from the lexer into a Go value wrapped +// as an empty interface. +func (p *parser) value(it item) (interface{}, tomlType) { + switch it.typ { + case itemString: + return p.replaceEscapes(it.val), p.typeOfPrimitive(it) + case itemMultilineString: + trimmed := stripFirstNewline(stripEscapedWhitespace(it.val)) + return p.replaceEscapes(trimmed), p.typeOfPrimitive(it) + case itemRawString: + return it.val, p.typeOfPrimitive(it) + case itemRawMultilineString: + return stripFirstNewline(it.val), p.typeOfPrimitive(it) + case itemBool: + switch it.val { + case "true": + return true, p.typeOfPrimitive(it) + case "false": + return false, p.typeOfPrimitive(it) + } + p.bug("Expected boolean value, but got '%s'.", it.val) + case itemInteger: + num, err := strconv.ParseInt(it.val, 10, 64) + if err != nil { + // See comment below for floats describing why we make a + // distinction between a bug and a user error. + if e, ok := err.(*strconv.NumError); ok && + e.Err == strconv.ErrRange { + + p.panicf("Integer '%s' is out of the range of 64-bit "+ + "signed integers.", it.val) + } else { + p.bug("Expected integer value, but got '%s'.", it.val) + } + } + return num, p.typeOfPrimitive(it) + case itemFloat: + num, err := strconv.ParseFloat(it.val, 64) + if err != nil { + // Distinguish float values. Normally, it'd be a bug if the lexer + // provides an invalid float, but it's possible that the float is + // out of range of valid values (which the lexer cannot determine). + // So mark the former as a bug but the latter as a legitimate user + // error. + // + // This is also true for integers. + if e, ok := err.(*strconv.NumError); ok && + e.Err == strconv.ErrRange { + + p.panicf("Float '%s' is out of the range of 64-bit "+ + "IEEE-754 floating-point numbers.", it.val) + } else { + p.bug("Expected float value, but got '%s'.", it.val) + } + } + return num, p.typeOfPrimitive(it) + case itemDatetime: + t, err := time.Parse("2006-01-02T15:04:05Z", it.val) + if err != nil { + p.panicf("Invalid RFC3339 Zulu DateTime: '%s'.", it.val) + } + return t, p.typeOfPrimitive(it) + case itemArray: + array := make([]interface{}, 0) + types := make([]tomlType, 0) + + for it = p.next(); it.typ != itemArrayEnd; it = p.next() { + if it.typ == itemCommentStart { + p.expect(itemText) + continue + } + + val, typ := p.value(it) + array = append(array, val) + types = append(types, typ) + } + return array, p.typeOfArray(types) + } + p.bug("Unexpected value type: %s", it.typ) + panic("unreachable") +} + +// establishContext sets the current context of the parser, +// where the context is either a hash or an array of hashes. Which one is +// set depends on the value of the `array` parameter. +// +// Establishing the context also makes sure that the key isn't a duplicate, and +// will create implicit hashes automatically. +func (p *parser) establishContext(key Key, array bool) { + var ok bool + + // Always start at the top level and drill down for our context. + hashContext := p.mapping + keyContext := make(Key, 0) + + // We only need implicit hashes for key[0:-1] + for _, k := range key[0 : len(key)-1] { + _, ok = hashContext[k] + keyContext = append(keyContext, k) + + // No key? Make an implicit hash and move on. + if !ok { + p.addImplicit(keyContext) + hashContext[k] = make(map[string]interface{}) + } + + // If the hash context is actually an array of tables, then set + // the hash context to the last element in that array. + // + // Otherwise, it better be a table, since this MUST be a key group (by + // virtue of it not being the last element in a key). + switch t := hashContext[k].(type) { + case []map[string]interface{}: + hashContext = t[len(t)-1] + case map[string]interface{}: + hashContext = t + default: + p.panicf("Key '%s' was already created as a hash.", keyContext) + } + } + + p.context = keyContext + if array { + // If this is the first element for this array, then allocate a new + // list of tables for it. + k := key[len(key)-1] + if _, ok := hashContext[k]; !ok { + hashContext[k] = make([]map[string]interface{}, 0, 5) + } + + // Add a new table. But make sure the key hasn't already been used + // for something else. + if hash, ok := hashContext[k].([]map[string]interface{}); ok { + hashContext[k] = append(hash, make(map[string]interface{})) + } else { + p.panicf("Key '%s' was already created and cannot be used as "+ + "an array.", keyContext) + } + } else { + p.setValue(key[len(key)-1], make(map[string]interface{})) + } + p.context = append(p.context, key[len(key)-1]) +} + +// setValue sets the given key to the given value in the current context. +// It will make sure that the key hasn't already been defined, account for +// implicit key groups. +func (p *parser) setValue(key string, value interface{}) { + var tmpHash interface{} + var ok bool + + hash := p.mapping + keyContext := make(Key, 0) + for _, k := range p.context { + keyContext = append(keyContext, k) + if tmpHash, ok = hash[k]; !ok { + p.bug("Context for key '%s' has not been established.", keyContext) + } + switch t := tmpHash.(type) { + case []map[string]interface{}: + // The context is a table of hashes. Pick the most recent table + // defined as the current hash. + hash = t[len(t)-1] + case map[string]interface{}: + hash = t + default: + p.bug("Expected hash to have type 'map[string]interface{}', but "+ + "it has '%T' instead.", tmpHash) + } + } + keyContext = append(keyContext, key) + + if _, ok := hash[key]; ok { + // Typically, if the given key has already been set, then we have + // to raise an error since duplicate keys are disallowed. However, + // it's possible that a key was previously defined implicitly. In this + // case, it is allowed to be redefined concretely. (See the + // `tests/valid/implicit-and-explicit-after.toml` test in `toml-test`.) + // + // But we have to make sure to stop marking it as an implicit. (So that + // another redefinition provokes an error.) + // + // Note that since it has already been defined (as a hash), we don't + // want to overwrite it. So our business is done. + if p.isImplicit(keyContext) { + p.removeImplicit(keyContext) + return + } + + // Otherwise, we have a concrete key trying to override a previous + // key, which is *always* wrong. + p.panicf("Key '%s' has already been defined.", keyContext) + } + hash[key] = value +} + +// setType sets the type of a particular value at a given key. +// It should be called immediately AFTER setValue. +// +// Note that if `key` is empty, then the type given will be applied to the +// current context (which is either a table or an array of tables). +func (p *parser) setType(key string, typ tomlType) { + keyContext := make(Key, 0, len(p.context)+1) + for _, k := range p.context { + keyContext = append(keyContext, k) + } + if len(key) > 0 { // allow type setting for hashes + keyContext = append(keyContext, key) + } + p.types[keyContext.String()] = typ +} + +// addImplicit sets the given Key as having been created implicitly. +func (p *parser) addImplicit(key Key) { + p.implicits[key.String()] = true +} + +// removeImplicit stops tagging the given key as having been implicitly +// created. +func (p *parser) removeImplicit(key Key) { + p.implicits[key.String()] = false +} + +// isImplicit returns true if the key group pointed to by the key was created +// implicitly. +func (p *parser) isImplicit(key Key) bool { + return p.implicits[key.String()] +} + +// current returns the full key name of the current context. +func (p *parser) current() string { + if len(p.currentKey) == 0 { + return p.context.String() + } + if len(p.context) == 0 { + return p.currentKey + } + return fmt.Sprintf("%s.%s", p.context, p.currentKey) +} + +func stripFirstNewline(s string) string { + if len(s) == 0 || s[0] != '\n' { + return s + } + return s[1:] +} + +func stripEscapedWhitespace(s string) string { + esc := strings.Split(s, "\\\n") + if len(esc) > 1 { + for i := 1; i < len(esc); i++ { + esc[i] = strings.TrimLeftFunc(esc[i], unicode.IsSpace) + } + } + return strings.Join(esc, "") +} + +func (p *parser) replaceEscapes(str string) string { + var replaced []rune + s := []byte(str) + r := 0 + for r < len(s) { + if s[r] != '\\' { + c, size := utf8.DecodeRune(s[r:]) + r += size + replaced = append(replaced, c) + continue + } + r += 1 + if r >= len(s) { + p.bug("Escape sequence at end of string.") + return "" + } + switch s[r] { + default: + p.bug("Expected valid escape code after \\, but got %q.", s[r]) + return "" + case 'b': + replaced = append(replaced, rune(0x0008)) + r += 1 + case 't': + replaced = append(replaced, rune(0x0009)) + r += 1 + case 'n': + replaced = append(replaced, rune(0x000A)) + r += 1 + case 'f': + replaced = append(replaced, rune(0x000C)) + r += 1 + case 'r': + replaced = append(replaced, rune(0x000D)) + r += 1 + case '"': + replaced = append(replaced, rune(0x0022)) + r += 1 + case '\\': + replaced = append(replaced, rune(0x005C)) + r += 1 + case 'u': + // At this point, we know we have a Unicode escape of the form + // `uXXXX` at [r, r+5). (Because the lexer guarantees this + // for us.) + escaped := p.asciiEscapeToUnicode(s[r+1 : r+5]) + replaced = append(replaced, escaped) + r += 5 + case 'U': + // At this point, we know we have a Unicode escape of the form + // `uXXXX` at [r, r+9). (Because the lexer guarantees this + // for us.) + escaped := p.asciiEscapeToUnicode(s[r+1 : r+9]) + replaced = append(replaced, escaped) + r += 9 + } + } + return string(replaced) +} + +func (p *parser) asciiEscapeToUnicode(bs []byte) rune { + s := string(bs) + hex, err := strconv.ParseUint(strings.ToLower(s), 16, 32) + if err != nil { + p.bug("Could not parse '%s' as a hexadecimal number, but the "+ + "lexer claims it's OK: %s", s, err) + } + if !utf8.ValidRune(rune(hex)) { + p.panicf("Escaped character '\\u%s' is not valid UTF-8.", s) + } + return rune(hex) +} + +func isStringType(ty itemType) bool { + return ty == itemString || ty == itemMultilineString || + ty == itemRawString || ty == itemRawMultilineString +} diff --git a/vendor/github.com/BurntSushi/toml/session.vim b/vendor/github.com/BurntSushi/toml/session.vim new file mode 100644 index 0000000000..562164be06 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/session.vim @@ -0,0 +1 @@ +au BufWritePost *.go silent!make tags > /dev/null 2>&1 diff --git a/vendor/github.com/BurntSushi/toml/type_check.go b/vendor/github.com/BurntSushi/toml/type_check.go new file mode 100644 index 0000000000..c73f8afc1a --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/type_check.go @@ -0,0 +1,91 @@ +package toml + +// tomlType represents any Go type that corresponds to a TOML type. +// While the first draft of the TOML spec has a simplistic type system that +// probably doesn't need this level of sophistication, we seem to be militating +// toward adding real composite types. +type tomlType interface { + typeString() string +} + +// typeEqual accepts any two types and returns true if they are equal. +func typeEqual(t1, t2 tomlType) bool { + if t1 == nil || t2 == nil { + return false + } + return t1.typeString() == t2.typeString() +} + +func typeIsHash(t tomlType) bool { + return typeEqual(t, tomlHash) || typeEqual(t, tomlArrayHash) +} + +type tomlBaseType string + +func (btype tomlBaseType) typeString() string { + return string(btype) +} + +func (btype tomlBaseType) String() string { + return btype.typeString() +} + +var ( + tomlInteger tomlBaseType = "Integer" + tomlFloat tomlBaseType = "Float" + tomlDatetime tomlBaseType = "Datetime" + tomlString tomlBaseType = "String" + tomlBool tomlBaseType = "Bool" + tomlArray tomlBaseType = "Array" + tomlHash tomlBaseType = "Hash" + tomlArrayHash tomlBaseType = "ArrayHash" +) + +// typeOfPrimitive returns a tomlType of any primitive value in TOML. +// Primitive values are: Integer, Float, Datetime, String and Bool. +// +// Passing a lexer item other than the following will cause a BUG message +// to occur: itemString, itemBool, itemInteger, itemFloat, itemDatetime. +func (p *parser) typeOfPrimitive(lexItem item) tomlType { + switch lexItem.typ { + case itemInteger: + return tomlInteger + case itemFloat: + return tomlFloat + case itemDatetime: + return tomlDatetime + case itemString: + return tomlString + case itemMultilineString: + return tomlString + case itemRawString: + return tomlString + case itemRawMultilineString: + return tomlString + case itemBool: + return tomlBool + } + p.bug("Cannot infer primitive type of lex item '%s'.", lexItem) + panic("unreachable") +} + +// typeOfArray returns a tomlType for an array given a list of types of its +// values. +// +// In the current spec, if an array is homogeneous, then its type is always +// "Array". If the array is not homogeneous, an error is generated. +func (p *parser) typeOfArray(types []tomlType) tomlType { + // Empty arrays are cool. + if len(types) == 0 { + return tomlArray + } + + theType := types[0] + for _, t := range types[1:] { + if !typeEqual(theType, t) { + p.panicf("Array contains values of type '%s' and '%s', but "+ + "arrays must be homogeneous.", theType, t) + } + } + return tomlArray +} diff --git a/vendor/github.com/BurntSushi/toml/type_fields.go b/vendor/github.com/BurntSushi/toml/type_fields.go new file mode 100644 index 0000000000..6da608af46 --- /dev/null +++ b/vendor/github.com/BurntSushi/toml/type_fields.go @@ -0,0 +1,241 @@ +package toml + +// Struct field handling is adapted from code in encoding/json: +// +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the Go distribution. + +import ( + "reflect" + "sort" + "sync" +) + +// A field represents a single field found in a struct. +type field struct { + name string // the name of the field (`toml` tag included) + tag bool // whether field has a `toml` tag + index []int // represents the depth of an anonymous field + typ reflect.Type // the type of the field +} + +// byName sorts field by name, breaking ties with depth, +// then breaking ties with "name came from toml tag", then +// breaking ties with index sequence. +type byName []field + +func (x byName) Len() int { return len(x) } + +func (x byName) Swap(i, j int) { x[i], x[j] = x[j], x[i] } + +func (x byName) Less(i, j int) bool { + if x[i].name != x[j].name { + return x[i].name < x[j].name + } + if len(x[i].index) != len(x[j].index) { + return len(x[i].index) < len(x[j].index) + } + if x[i].tag != x[j].tag { + return x[i].tag + } + return byIndex(x).Less(i, j) +} + +// byIndex sorts field by index sequence. +type byIndex []field + +func (x byIndex) Len() int { return len(x) } + +func (x byIndex) Swap(i, j int) { x[i], x[j] = x[j], x[i] } + +func (x byIndex) Less(i, j int) bool { + for k, xik := range x[i].index { + if k >= len(x[j].index) { + return false + } + if xik != x[j].index[k] { + return xik < x[j].index[k] + } + } + return len(x[i].index) < len(x[j].index) +} + +// typeFields returns a list of fields that TOML should recognize for the given +// type. The algorithm is breadth-first search over the set of structs to +// include - the top struct and then any reachable anonymous structs. +func typeFields(t reflect.Type) []field { + // Anonymous fields to explore at the current level and the next. + current := []field{} + next := []field{{typ: t}} + + // Count of queued names for current level and the next. + count := map[reflect.Type]int{} + nextCount := map[reflect.Type]int{} + + // Types already visited at an earlier level. + visited := map[reflect.Type]bool{} + + // Fields found. + var fields []field + + for len(next) > 0 { + current, next = next, current[:0] + count, nextCount = nextCount, map[reflect.Type]int{} + + for _, f := range current { + if visited[f.typ] { + continue + } + visited[f.typ] = true + + // Scan f.typ for fields to include. + for i := 0; i < f.typ.NumField(); i++ { + sf := f.typ.Field(i) + if sf.PkgPath != "" && !sf.Anonymous { // unexported + continue + } + name, _ := getOptions(sf.Tag.Get("toml")) + if name == "-" { + continue + } + index := make([]int, len(f.index)+1) + copy(index, f.index) + index[len(f.index)] = i + + ft := sf.Type + if ft.Name() == "" && ft.Kind() == reflect.Ptr { + // Follow pointer. + ft = ft.Elem() + } + + // Record found field and index sequence. + if name != "" || !sf.Anonymous || ft.Kind() != reflect.Struct { + tagged := name != "" + if name == "" { + name = sf.Name + } + fields = append(fields, field{name, tagged, index, ft}) + if count[f.typ] > 1 { + // If there were multiple instances, add a second, + // so that the annihilation code will see a duplicate. + // It only cares about the distinction between 1 or 2, + // so don't bother generating any more copies. + fields = append(fields, fields[len(fields)-1]) + } + continue + } + + // Record new anonymous struct to explore in next round. + nextCount[ft]++ + if nextCount[ft] == 1 { + f := field{name: ft.Name(), index: index, typ: ft} + next = append(next, f) + } + } + } + } + + sort.Sort(byName(fields)) + + // Delete all fields that are hidden by the Go rules for embedded fields, + // except that fields with TOML tags are promoted. + + // The fields are sorted in primary order of name, secondary order + // of field index length. Loop over names; for each name, delete + // hidden fields by choosing the one dominant field that survives. + out := fields[:0] + for advance, i := 0, 0; i < len(fields); i += advance { + // One iteration per name. + // Find the sequence of fields with the name of this first field. + fi := fields[i] + name := fi.name + for advance = 1; i+advance < len(fields); advance++ { + fj := fields[i+advance] + if fj.name != name { + break + } + } + if advance == 1 { // Only one field with this name + out = append(out, fi) + continue + } + dominant, ok := dominantField(fields[i : i+advance]) + if ok { + out = append(out, dominant) + } + } + + fields = out + sort.Sort(byIndex(fields)) + + return fields +} + +// dominantField looks through the fields, all of which are known to +// have the same name, to find the single field that dominates the +// others using Go's embedding rules, modified by the presence of +// TOML tags. If there are multiple top-level fields, the boolean +// will be false: This condition is an error in Go and we skip all +// the fields. +func dominantField(fields []field) (field, bool) { + // The fields are sorted in increasing index-length order. The winner + // must therefore be one with the shortest index length. Drop all + // longer entries, which is easy: just truncate the slice. + length := len(fields[0].index) + tagged := -1 // Index of first tagged field. + for i, f := range fields { + if len(f.index) > length { + fields = fields[:i] + break + } + if f.tag { + if tagged >= 0 { + // Multiple tagged fields at the same level: conflict. + // Return no field. + return field{}, false + } + tagged = i + } + } + if tagged >= 0 { + return fields[tagged], true + } + // All remaining fields have the same length. If there's more than one, + // we have a conflict (two fields named "X" at the same level) and we + // return no field. + if len(fields) > 1 { + return field{}, false + } + return fields[0], true +} + +var fieldCache struct { + sync.RWMutex + m map[reflect.Type][]field +} + +// cachedTypeFields is like typeFields but uses a cache to avoid repeated work. +func cachedTypeFields(t reflect.Type) []field { + fieldCache.RLock() + f := fieldCache.m[t] + fieldCache.RUnlock() + if f != nil { + return f + } + + // Compute fields without lock. + // Might duplicate effort but won't hold other computations back. + f = typeFields(t) + if f == nil { + f = []field{} + } + + fieldCache.Lock() + if fieldCache.m == nil { + fieldCache.m = map[reflect.Type][]field{} + } + fieldCache.m[t] = f + fieldCache.Unlock() + return f +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/.gitignore b/vendor/github.com/PuerkitoBio/pigeon/.gitignore new file mode 100644 index 0000000000..568f126036 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/.gitignore @@ -0,0 +1,10 @@ +.*.swp +.*.swo +.swp +*.test +bootstrap/cmd/bootstrap-pigeon/bootstrap-pigeon +bootstrap/cmd/bootstrap-build/bootstrap-build +bootstrap/cmd/pegscan/pegscan +bootstrap/cmd/pegparse/pegparse +bin/ +pigeon diff --git a/vendor/github.com/PuerkitoBio/pigeon/.travis.yml b/vendor/github.com/PuerkitoBio/pigeon/.travis.yml new file mode 100644 index 0000000000..9720079803 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/.travis.yml @@ -0,0 +1,8 @@ +language: go + +script: go test -v ./... + +go: + - 1.1 + - 1.4 + - tip diff --git a/vendor/github.com/PuerkitoBio/pigeon/CONTRIBUTING.md b/vendor/github.com/PuerkitoBio/pigeon/CONTRIBUTING.md new file mode 100644 index 0000000000..d272ac517d --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/CONTRIBUTING.md @@ -0,0 +1,33 @@ +# Contributing to pigeon + +There are various ways to help support this open source project: + +* if you use pigeon and find it useful, talk about it - that's probably the most basic way to help any open-source project: getting the word out that it exists and that it can be useful +* if you use pigeon and find bugs, please [file an issue][0] +* if something is poorly documented, or doesn't work as documented, this is also a bug, please [file an issue][0] +* if you can fix the issue (whether it is documentation- or code-related), then [submit a pull-request][1] - but read on to see what should be done to get it merged +* if you would like to see some new feature/behaviour being implemented, please first [open an issue][0] to discuss it because features are less likely to get merged compared to bug fixes + +## Submitting a pull request + +Assuming you already have a copy of the repository (either via `go get`, a github fork, a clone, etc.), you will also need `make` to regenerate all tools and files generated when a dependency changes. I use GNU make version 4.1, other versions of make may work too but haven't been tested. + +Run `make` in the root directory of the repository. That will create the bootstrap builder, the bootstrap parser, and the final parser, along with some generated Go files. Once `make` is run successfully, run `go test ./...` in the root directory to make sure all tests pass. + +Once this is done and tests pass, you can start implementing the bug fix (or the new feature provided **it has already been discussed and agreed in a github issue** first). + +For a bug fix, the best way to proceed is to first write a test that proves the bug, then write the code that fixes the bug and makes the test pass. All other tests should still pass too (unless it relied on the buggy behaviour, in which case existing tests must be fixed). + +For a new feature, it must be thoroughly tested. New code without new test(s) is unlikely to get merged. + +Respect the coding style of the repository, which means essentially to respect the [coding guidelines of the Go community][2]. Use `gofmt` to format your code, and `goimports` to add and format the list of imported packages (or do it manually, but in a `goimports`-style). + +Once all code is done and tests pass, regenerate the whole tree with `make`, run `make lint` to make sure the code is correct, and run tests again. You are now ready to submit the pull request. + +## Licensing + +All pull requests that get merged will be made available under the BSD 3-Clause license (see the LICENSE file for details), as the rest of the pigeon repository. Do not submit pull requests if you do not want your contributions to be made available under those terms. + +[0]: https://github.com/PuerkitoBio/pigeon/issues/new +[1]: https://github.com/PuerkitoBio/pigeon/pulls +[2]: https://github.com/golang/go/wiki/CodeReviewComments diff --git a/vendor/github.com/PuerkitoBio/pigeon/LICENSE b/vendor/github.com/PuerkitoBio/pigeon/LICENSE new file mode 100644 index 0000000000..2c684aaf65 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/LICENSE @@ -0,0 +1,12 @@ +Copyright (c) 2015, Martin Angers & Contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/PuerkitoBio/pigeon/Makefile b/vendor/github.com/PuerkitoBio/pigeon/Makefile new file mode 100644 index 0000000000..86a4e62f4f --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/Makefile @@ -0,0 +1,92 @@ +SHELL = /bin/sh + +# directories and source code lists +ROOT = . +ROOT_SRC = $(ROOT)/*.go +BINDIR = ./bin +EXAMPLES_DIR = $(ROOT)/examples +TEST_DIR = $(ROOT)/test + +# builder and ast packages +BUILDER_DIR = $(ROOT)/builder +BUILDER_SRC = $(BUILDER_DIR)/*.go +AST_DIR = $(ROOT)/ast +AST_SRC = $(AST_DIR)/*.go + +# bootstrap tools variables +BOOTSTRAP_DIR = $(ROOT)/bootstrap +BOOTSTRAP_SRC = $(BOOTSTRAP_DIR)/*.go +BOOTSTRAPBUILD_DIR = $(BOOTSTRAP_DIR)/cmd/bootstrap-build +BOOTSTRAPBUILD_SRC = $(BOOTSTRAPBUILD_DIR)/*.go +BOOTSTRAPPIGEON_DIR = $(BOOTSTRAP_DIR)/cmd/bootstrap-pigeon +BOOTSTRAPPIGEON_SRC = $(BOOTSTRAPPIGEON_DIR)/*.go + +# grammar variables +GRAMMAR_DIR = $(ROOT)/grammar +BOOTSTRAP_GRAMMAR = $(GRAMMAR_DIR)/bootstrap.peg +PIGEON_GRAMMAR = $(GRAMMAR_DIR)/pigeon.peg + +TEST_GENERATED_SRC = $(patsubst %.peg,%.go,$(shell echo ./{examples,test}/**/*.peg)) + +all: $(BINDIR)/bootstrap-build $(BOOTSTRAPPIGEON_DIR)/bootstrap_pigeon.go \ + $(BINDIR)/bootstrap-pigeon $(ROOT)/pigeon.go $(BINDIR)/pigeon \ + $(TEST_GENERATED_SRC) + +$(BINDIR)/bootstrap-build: $(BOOTSTRAPBUILD_SRC) $(BOOTSTRAP_SRC) $(BUILDER_SRC) \ + $(AST_SRC) + go build -o $@ $(BOOTSTRAPBUILD_DIR) + +$(BOOTSTRAPPIGEON_DIR)/bootstrap_pigeon.go: $(BINDIR)/bootstrap-build \ + $(BOOTSTRAP_GRAMMAR) + $(BINDIR)/bootstrap-build $(BOOTSTRAP_GRAMMAR) | goimports > $@ + +$(BINDIR)/bootstrap-pigeon: $(BOOTSTRAPPIGEON_SRC) \ + $(BOOTSTRAPPIGEON_DIR)/bootstrap_pigeon.go + go build -o $@ $(BOOTSTRAPPIGEON_DIR) + +$(ROOT)/pigeon.go: $(BINDIR)/bootstrap-pigeon $(PIGEON_GRAMMAR) + $(BINDIR)/bootstrap-pigeon $(PIGEON_GRAMMAR) | goimports > $@ + +$(BINDIR)/pigeon: $(ROOT_SRC) $(ROOT)/pigeon.go + go build -o $@ $(ROOT) + +$(BOOTSTRAP_GRAMMAR): +$(PIGEON_GRAMMAR): + +# surely there's a better way to define the examples and test targets + +$(EXAMPLES_DIR)/json/json.go: $(EXAMPLES_DIR)/json/json.peg $(BINDIR)/pigeon + $(BINDIR)/pigeon $< | goimports > $@ + +$(EXAMPLES_DIR)/calculator/calculator.go: $(EXAMPLES_DIR)/calculator/calculator.peg $(BINDIR)/pigeon + $(BINDIR)/pigeon $< | goimports > $@ + +$(TEST_DIR)/andnot/andnot.go: $(TEST_DIR)/andnot/andnot.peg $(BINDIR)/pigeon + $(BINDIR)/pigeon $< | goimports > $@ + +$(TEST_DIR)/predicates/predicates.go: $(TEST_DIR)/predicates/predicates.peg $(BINDIR)/pigeon + $(BINDIR)/pigeon $< | goimports > $@ + +$(TEST_DIR)/issue_1/issue_1.go: $(TEST_DIR)/issue_1/issue_1.peg $(BINDIR)/pigeon + $(BINDIR)/pigeon $< | goimports > $@ + +$(TEST_DIR)/linear/linear.go: $(TEST_DIR)/linear/linear.peg $(BINDIR)/pigeon + $(BINDIR)/pigeon $< | goimports > $@ + +lint: + golint ./... + go vet ./... + +cmp: + @boot=$$(mktemp) && $(BINDIR)/bootstrap-pigeon $(PIGEON_GRAMMAR) | goimports > $$boot && \ + official=$$(mktemp) && $(BINDIR)/pigeon $(PIGEON_GRAMMAR) | goimports > $$official && \ + cmp $$boot $$official && \ + unlink $$boot && \ + unlink $$official + +clean: + rm $(BOOTSTRAPPIGEON_DIR)/bootstrap_pigeon.go $(ROOT)/pigeon.go $(TEST_GENERATED_SRC) + rm -rf $(BINDIR) + +.PHONY: all clean lint cmp + diff --git a/vendor/github.com/PuerkitoBio/pigeon/README.md b/vendor/github.com/PuerkitoBio/pigeon/README.md new file mode 100644 index 0000000000..d1ea91bcd3 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/README.md @@ -0,0 +1,144 @@ +# pigeon - a PEG parser generator for Go + +[![GoDoc](https://godoc.org/github.com/PuerkitoBio/pigeon?status.png)](https://godoc.org/github.com/PuerkitoBio/pigeon) +[![build status](https://secure.travis-ci.org/PuerkitoBio/pigeon.png?branch=master)](http://travis-ci.org/PuerkitoBio/pigeon) +[![Software License](https://img.shields.io/badge/license-BSD-blue.svg)](LICENSE) + +The pigeon command generates parsers based on a [parsing expression grammar (PEG)][0]. Its grammar and syntax is inspired by the [PEG.js project][1], while the implementation is loosely based on the [parsing expression grammar for C# 3.0][2] article. It parses Unicode text encoded in UTF-8. + +See the [godoc page][3] for detailed usage. + +## Installation + +Provided you have Go correctly installed with the $GOPATH and $GOBIN environment variables set, run: + +``` +$ go get -u github.com/PuerkitoBio/pigeon +``` + +This will install or update the package, and the `pigeon` command will be installed in your $GOBIN directory. Neither this package nor the parsers generated by this command require any third-party dependency, unless such a dependency is used in the code blocks of the grammar. + +## Basic usage + +``` +$ pigeon [options] [PEG_GRAMMAR_FILE] +``` + +By default, the input grammar is read from `stdin` and the generated code is printed to `stdout`. You may save it in a file using the `-o` flag, but pigeon makes no attempt to format the generated code, nor does it try to generate the required imports, because such a tool already exists. The recommended way to generate a properly formatted and working parser is to pipe the output of pigeon through the `goimports` tool: + +``` +$ pigeon my_revolutionary_programming_language.peg | goimports > main.go +``` + +This way, the generated code has all the necessary imports and is properly formatted. You can install `goimports` using: + +``` +$ go get golang.org/x/tools/cmd/goimports +``` + +See the [godoc page][3] for detailed usage. + +## Example + +Given the following grammar: + +``` +{ +// part of the initializer code block omitted for brevity + +var ops = map[string]func(int, int) int { + "+": func(l, r int) int { + return l + r + }, + "-": func(l, r int) int { + return l - r + }, + "*": func(l, r int) int { + return l * r + }, + "/": func(l, r int) int { + return l / r + }, +} + +func toIfaceSlice(v interface{}) []interface{} { + if v == nil { + return nil + } + return v.([]interface{}) +} + +func eval(first, rest interface{}) int { + l := first.(int) + restSl := toIfaceSlice(rest) + for _, v := range restSl { + restExpr := toIfaceSlice(v) + r := restExpr[3].(int) + op := restExpr[1].(string) + l = ops[op](l, r) + } + return l +} +} + + +Input <- expr:Expr EOF { + return expr, nil +} + +Expr <- _ first:Term rest:( _ AddOp _ Term )* _ { + return eval(first, rest), nil +} + +Term <- first:Factor rest:( _ MulOp _ Factor )* { + return eval(first, rest), nil +} + +Factor <- '(' expr:Expr ')' { + return expr, nil +} / integer:Integer { + return integer, nil +} + +AddOp <- ( '+' / '-' ) { + return string(c.text), nil +} + +MulOp <- ( '*' / '/' ) { + return string(c.text), nil +} + +Integer <- '-'? [0-9]+ { + return strconv.Atoi(string(c.text)) +} + +_ "whitespace" <- [ \n\t\r]* + +EOF <- !. +``` + +The generated parser can parse simple arithmetic operations, e.g.: + +``` +18 + 3 - 27 * (-18 / -3) + +=> -141 +``` + +More examples can be found in the `examples/` subdirectory. + +See the [godoc page][3] for detailed usage. + +## Contributing + +See the CONTRIBUTING.md file. + +## License + +The [BSD 3-Clause license][4]. See the LICENSE file. + +[0]: http://en.wikipedia.org/wiki/Parsing_expression_grammar +[1]: http://pegjs.org/ +[2]: http://www.codeproject.com/Articles/29713/Parsing-Expression-Grammar-Support-for-C-Part +[3]: https://godoc.org/github.com/PuerkitoBio/pigeon +[4]: http://opensource.org/licenses/BSD-3-Clause diff --git a/vendor/github.com/PuerkitoBio/pigeon/TODO b/vendor/github.com/PuerkitoBio/pigeon/TODO new file mode 100644 index 0000000000..75a1f2145f --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/TODO @@ -0,0 +1,3 @@ +- refactor implementation as a VM to avoid stack overflow in pathological cases (and maybe better performance): in branch wip-vm +? options like current receiver name read directly from the grammar file +? type annotations for generated code functions diff --git a/vendor/github.com/PuerkitoBio/pigeon/ast/ast.go b/vendor/github.com/PuerkitoBio/pigeon/ast/ast.go new file mode 100644 index 0000000000..33845bb9aa --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/ast/ast.go @@ -0,0 +1,587 @@ +// Package ast defines the abstract syntax tree for the PEG grammar. +// +// The parser generator's PEG grammar generates a tree using this package +// that is then converted by the builder to the simplified AST used in +// the generated parser. +package ast + +import ( + "bytes" + "fmt" + "strconv" + "strings" +) + +// Pos represents a position in a source file. +type Pos struct { + Filename string + Line int + Col int + Off int +} + +// String returns the textual representation of a position. +func (p Pos) String() string { + if p.Filename != "" { + return fmt.Sprintf("%s:%d:%d (%d)", p.Filename, p.Line, p.Col, p.Off) + } + return fmt.Sprintf("%d:%d (%d)", p.Line, p.Col, p.Off) +} + +// Grammar is the top-level node of the AST for the PEG grammar. +type Grammar struct { + p Pos + Init *CodeBlock + Rules []*Rule +} + +// NewGrammar creates a new grammar at the specified position. +func NewGrammar(p Pos) *Grammar { + return &Grammar{p: p} +} + +// Pos returns the starting position of the node. +func (g *Grammar) Pos() Pos { return g.p } + +// String returns the textual representation of a node. +func (g *Grammar) String() string { + var buf bytes.Buffer + + buf.WriteString(fmt.Sprintf("%s: %T{Init: %v, Rules: [\n", + g.p, g, g.Init)) + for _, r := range g.Rules { + buf.WriteString(fmt.Sprintf("%s,\n", r)) + } + buf.WriteString("]}") + return buf.String() +} + +// Rule represents a rule in the PEG grammar. It has a name, an optional +// display name to be used in error messages, and an expression. +type Rule struct { + p Pos + Name *Identifier + DisplayName *StringLit + Expr Expression +} + +// NewRule creates a rule with at the specified position and with the +// specified name as identifier. +func NewRule(p Pos, name *Identifier) *Rule { + return &Rule{p: p, Name: name} +} + +// Pos returns the starting position of the node. +func (r *Rule) Pos() Pos { return r.p } + +// String returns the textual representation of a node. +func (r *Rule) String() string { + return fmt.Sprintf("%s: %T{Name: %v, DisplayName: %v, Expr: %v}", + r.p, r, r.Name, r.DisplayName, r.Expr) +} + +// Expression is the interface implemented by all expression types. +type Expression interface { + Pos() Pos +} + +// ChoiceExpr is an ordered sequence of expressions. The parser tries to +// match any of the alternatives in sequence and stops at the first one +// that matches. +type ChoiceExpr struct { + p Pos + Alternatives []Expression +} + +// NewChoiceExpr creates a choice expression at the specified position. +func NewChoiceExpr(p Pos) *ChoiceExpr { + return &ChoiceExpr{p: p} +} + +// Pos returns the starting position of the node. +func (c *ChoiceExpr) Pos() Pos { return c.p } + +// String returns the textual representation of a node. +func (c *ChoiceExpr) String() string { + var buf bytes.Buffer + + buf.WriteString(fmt.Sprintf("%s: %T{Alternatives: [\n", c.p, c)) + for _, e := range c.Alternatives { + buf.WriteString(fmt.Sprintf("%s,\n", e)) + } + buf.WriteString("]}") + return buf.String() +} + +// ActionExpr is an expression that has an associated block of code to +// execute when the expression matches. +type ActionExpr struct { + p Pos + Expr Expression + Code *CodeBlock + FuncIx int +} + +// NewActionExpr creates a new action expression at the specified position. +func NewActionExpr(p Pos) *ActionExpr { + return &ActionExpr{p: p} +} + +// Pos returns the starting position of the node. +func (a *ActionExpr) Pos() Pos { return a.p } + +// String returns the textual representation of a node. +func (a *ActionExpr) String() string { + return fmt.Sprintf("%s: %T{Expr: %v, Code: %v}", a.p, a, a.Expr, a.Code) +} + +// SeqExpr is an ordered sequence of expressions, all of which must match +// if the SeqExpr is to be a match itself. +type SeqExpr struct { + p Pos + Exprs []Expression +} + +// NewSeqExpr creates a new sequence expression at the specified position. +func NewSeqExpr(p Pos) *SeqExpr { + return &SeqExpr{p: p} +} + +// Pos returns the starting position of the node. +func (s *SeqExpr) Pos() Pos { return s.p } + +// String returns the textual representation of a node. +func (s *SeqExpr) String() string { + var buf bytes.Buffer + + buf.WriteString(fmt.Sprintf("%s: %T{Exprs: [\n", s.p, s)) + for _, e := range s.Exprs { + buf.WriteString(fmt.Sprintf("%s,\n", e)) + } + buf.WriteString("]}") + return buf.String() +} + +// LabeledExpr is an expression that has an associated label. Code blocks +// can access the value of the expression using that label, that becomes +// a local variable in the code. +type LabeledExpr struct { + p Pos + Label *Identifier + Expr Expression +} + +// NewLabeledExpr creates a new labeled expression at the specified position. +func NewLabeledExpr(p Pos) *LabeledExpr { + return &LabeledExpr{p: p} +} + +// Pos returns the starting position of the node. +func (l *LabeledExpr) Pos() Pos { return l.p } + +// String returns the textual representation of a node. +func (l *LabeledExpr) String() string { + return fmt.Sprintf("%s: %T{Label: %v, Expr: %v}", l.p, l, l.Label, l.Expr) +} + +// AndExpr is a zero-length matcher that is considered a match if the +// expression it contains is a match. +type AndExpr struct { + p Pos + Expr Expression +} + +// NewAndExpr creates a new and (&) expression at the specified position. +func NewAndExpr(p Pos) *AndExpr { + return &AndExpr{p: p} +} + +// Pos returns the starting position of the node. +func (a *AndExpr) Pos() Pos { return a.p } + +// String returns the textual representation of a node. +func (a *AndExpr) String() string { + return fmt.Sprintf("%s: %T{Expr: %v}", a.p, a, a.Expr) +} + +// NotExpr is a zero-length matcher that is considered a match if the +// expression it contains is not a match. +type NotExpr struct { + p Pos + Expr Expression +} + +// NewNotExpr creates a new not (!) expression at the specified position. +func NewNotExpr(p Pos) *NotExpr { + return &NotExpr{p: p} +} + +// Pos returns the starting position of the node. +func (n *NotExpr) Pos() Pos { return n.p } + +// String returns the textual representation of a node. +func (n *NotExpr) String() string { + return fmt.Sprintf("%s: %T{Expr: %v}", n.p, n, n.Expr) +} + +// ZeroOrOneExpr is an expression that can be matched zero or one time. +type ZeroOrOneExpr struct { + p Pos + Expr Expression +} + +// NewZeroOrOneExpr creates a new zero or one expression at the specified +// position. +func NewZeroOrOneExpr(p Pos) *ZeroOrOneExpr { + return &ZeroOrOneExpr{p: p} +} + +// Pos returns the starting position of the node. +func (z *ZeroOrOneExpr) Pos() Pos { return z.p } + +// String returns the textual representation of a node. +func (z *ZeroOrOneExpr) String() string { + return fmt.Sprintf("%s: %T{Expr: %v}", z.p, z, z.Expr) +} + +// ZeroOrMoreExpr is an expression that can be matched zero or more times. +type ZeroOrMoreExpr struct { + p Pos + Expr Expression +} + +// NewZeroOrMoreExpr creates a new zero or more expression at the specified +// position. +func NewZeroOrMoreExpr(p Pos) *ZeroOrMoreExpr { + return &ZeroOrMoreExpr{p: p} +} + +// Pos returns the starting position of the node. +func (z *ZeroOrMoreExpr) Pos() Pos { return z.p } + +// String returns the textual representation of a node. +func (z *ZeroOrMoreExpr) String() string { + return fmt.Sprintf("%s: %T{Expr: %v}", z.p, z, z.Expr) +} + +// OneOrMoreExpr is an expression that can be matched one or more times. +type OneOrMoreExpr struct { + p Pos + Expr Expression +} + +// NewOneOrMoreExpr creates a new one or more expression at the specified +// position. +func NewOneOrMoreExpr(p Pos) *OneOrMoreExpr { + return &OneOrMoreExpr{p: p} +} + +// Pos returns the starting position of the node. +func (o *OneOrMoreExpr) Pos() Pos { return o.p } + +// String returns the textual representation of a node. +func (o *OneOrMoreExpr) String() string { + return fmt.Sprintf("%s: %T{Expr: %v}", o.p, o, o.Expr) +} + +// RuleRefExpr is an expression that references a rule by name. +type RuleRefExpr struct { + p Pos + Name *Identifier +} + +// NewRuleRefExpr creates a new rule reference expression at the specified +// position. +func NewRuleRefExpr(p Pos) *RuleRefExpr { + return &RuleRefExpr{p: p} +} + +// Pos returns the starting position of the node. +func (r *RuleRefExpr) Pos() Pos { return r.p } + +// String returns the textual representation of a node. +func (r *RuleRefExpr) String() string { + return fmt.Sprintf("%s: %T{Name: %v}", r.p, r, r.Name) +} + +// AndCodeExpr is a zero-length matcher that is considered a match if the +// code block returns true. +type AndCodeExpr struct { + p Pos + Code *CodeBlock + FuncIx int +} + +// NewAndCodeExpr creates a new and (&) code expression at the specified +// position. +func NewAndCodeExpr(p Pos) *AndCodeExpr { + return &AndCodeExpr{p: p} +} + +// Pos returns the starting position of the node. +func (a *AndCodeExpr) Pos() Pos { return a.p } + +// String returns the textual representation of a node. +func (a *AndCodeExpr) String() string { + return fmt.Sprintf("%s: %T{Code: %v}", a.p, a, a.Code) +} + +// NotCodeExpr is a zero-length matcher that is considered a match if the +// code block returns false. +type NotCodeExpr struct { + p Pos + Code *CodeBlock + FuncIx int +} + +// NewNotCodeExpr creates a new not (!) code expression at the specified +// position. +func NewNotCodeExpr(p Pos) *NotCodeExpr { + return &NotCodeExpr{p: p} +} + +// Pos returns the starting position of the node. +func (n *NotCodeExpr) Pos() Pos { return n.p } + +// String returns the textual representation of a node. +func (n *NotCodeExpr) String() string { + return fmt.Sprintf("%s: %T{Code: %v}", n.p, n, n.Code) +} + +// LitMatcher is a string literal matcher. The value to match may be a +// double-quoted string, a single-quoted single character, or a back-tick +// quoted raw string. +type LitMatcher struct { + posValue // can be str, rstr or char + IgnoreCase bool +} + +// NewLitMatcher creates a new literal matcher at the specified position and +// with the specified value. +func NewLitMatcher(p Pos, v string) *LitMatcher { + return &LitMatcher{posValue: posValue{p: p, Val: v}} +} + +// Pos returns the starting position of the node. +func (l *LitMatcher) Pos() Pos { return l.p } + +// String returns the textual representation of a node. +func (l *LitMatcher) String() string { + return fmt.Sprintf("%s: %T{Val: %q, IgnoreCase: %t}", l.p, l, l.Val, l.IgnoreCase) +} + +// CharClassMatcher is a character class matcher. The value to match must +// be one of the specified characters, in a range of characters, or in the +// Unicode classes of characters. +type CharClassMatcher struct { + posValue + IgnoreCase bool + Inverted bool + Chars []rune + Ranges []rune // pairs of low/high range + UnicodeClasses []string +} + +// NewCharClassMatcher creates a new character class matcher at the specified +// position and with the specified raw value. It parses the raw value into +// the list of characters, ranges and Unicode classes. +func NewCharClassMatcher(p Pos, raw string) *CharClassMatcher { + c := &CharClassMatcher{posValue: posValue{p: p, Val: raw}} + c.parse() + return c +} + +func (c *CharClassMatcher) parse() { + raw := c.Val + c.IgnoreCase = strings.HasSuffix(raw, "i") + if c.IgnoreCase { + raw = raw[:len(raw)-1] + } + + // "unquote" the character classes + raw = raw[1 : len(raw)-1] + if len(raw) == 0 { + return + } + + c.Inverted = raw[0] == '^' + if c.Inverted { + raw = raw[1:] + if len(raw) == 0 { + return + } + } + + // content of char class is necessarily valid, so escapes are correct + r := strings.NewReader(raw) + var chars []rune + var buf bytes.Buffer +outer: + for { + rn, _, err := r.ReadRune() + if err != nil { + break outer + } + + consumeN := 0 + switch rn { + case '\\': + rn, _, _ := r.ReadRune() + switch rn { + case ']': + chars = append(chars, rn) + continue + + case 'p': + rn, _, _ := r.ReadRune() + if rn == '{' { + buf.Reset() + for { + rn, _, _ := r.ReadRune() + if rn == '}' { + break + } + buf.WriteRune(rn) + } + c.UnicodeClasses = append(c.UnicodeClasses, buf.String()) + } else { + c.UnicodeClasses = append(c.UnicodeClasses, string(rn)) + } + continue + + case 'x': + consumeN = 2 + case 'u': + consumeN = 4 + case 'U': + consumeN = 8 + case '0', '1', '2', '3', '4', '5', '6', '7': + consumeN = 2 + } + + buf.Reset() + buf.WriteRune(rn) + for i := 0; i < consumeN; i++ { + rn, _, _ := r.ReadRune() + buf.WriteRune(rn) + } + rn, _, _, _ = strconv.UnquoteChar("\\"+buf.String(), 0) + chars = append(chars, rn) + + default: + chars = append(chars, rn) + } + } + + // extract ranges and chars + inRange, wasRange := false, false + for i, r := range chars { + if inRange { + c.Ranges = append(c.Ranges, r) + inRange = false + wasRange = true + continue + } + + if r == '-' && !wasRange && len(c.Chars) > 0 && i < len(chars)-1 { + inRange = true + wasRange = false + // start of range is the last Char added + c.Ranges = append(c.Ranges, c.Chars[len(c.Chars)-1]) + c.Chars = c.Chars[:len(c.Chars)-1] + continue + } + wasRange = false + c.Chars = append(c.Chars, r) + } +} + +// Pos returns the starting position of the node. +func (c *CharClassMatcher) Pos() Pos { return c.p } + +// String returns the textual representation of a node. +func (c *CharClassMatcher) String() string { + return fmt.Sprintf("%s: %T{Val: %q, IgnoreCase: %t, Inverted: %t}", + c.p, c, c.Val, c.IgnoreCase, c.Inverted) +} + +// AnyMatcher is a matcher that matches any character except end-of-file. +type AnyMatcher struct { + posValue +} + +// NewAnyMatcher creates a new any matcher at the specified position. The +// value is provided for completeness' sake, but it is always the dot. +func NewAnyMatcher(p Pos, v string) *AnyMatcher { + return &AnyMatcher{posValue{p, v}} +} + +// Pos returns the starting position of the node. +func (a *AnyMatcher) Pos() Pos { return a.p } + +// String returns the textual representation of a node. +func (a *AnyMatcher) String() string { + return fmt.Sprintf("%s: %T{Val: %q}", a.p, a, a.Val) +} + +// CodeBlock represents a code block. +type CodeBlock struct { + posValue +} + +// NewCodeBlock creates a new code block at the specified position and with +// the specified value. The value includes the outer braces. +func NewCodeBlock(p Pos, code string) *CodeBlock { + return &CodeBlock{posValue{p, code}} +} + +// Pos returns the starting position of the node. +func (c *CodeBlock) Pos() Pos { return c.p } + +// String returns the textual representation of a node. +func (c *CodeBlock) String() string { + return fmt.Sprintf("%s: %T{Val: %q}", c.p, c, c.Val) +} + +// Identifier represents an identifier. +type Identifier struct { + posValue +} + +// NewIdentifier creates a new identifier at the specified position and +// with the specified name. +func NewIdentifier(p Pos, name string) *Identifier { + return &Identifier{posValue{p: p, Val: name}} +} + +// Pos returns the starting position of the node. +func (i *Identifier) Pos() Pos { return i.p } + +// String returns the textual representation of a node. +func (i *Identifier) String() string { + return fmt.Sprintf("%s: %T{Val: %q}", i.p, i, i.Val) +} + +// StringLit represents a string literal. +type StringLit struct { + posValue +} + +// NewStringLit creates a new string literal at the specified position and +// with the specified value. +func NewStringLit(p Pos, val string) *StringLit { + return &StringLit{posValue{p: p, Val: val}} +} + +// Pos returns the starting position of the node. +func (s *StringLit) Pos() Pos { return s.p } + +// String returns the textual representation of a node. +func (s *StringLit) String() string { + return fmt.Sprintf("%s: %T{Val: %q}", s.p, s, s.Val) +} + +type posValue struct { + p Pos + Val string +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/ast/ast_test.go b/vendor/github.com/PuerkitoBio/pigeon/ast/ast_test.go new file mode 100644 index 0000000000..767e9a1da8 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/ast/ast_test.go @@ -0,0 +1,107 @@ +package ast + +import ( + "strings" + "testing" + "unicode/utf8" +) + +var charClasses = []string{ + "[]", + "[]i", + "[^]", + "[^]i", + "[a]", + "[ab]i", + "[^abc]i", + `[\a]`, + `[\b\nt]`, + `[\b\nt\pL]`, + `[\p{Greek}\tz\\\pN]`, + `[-]`, + `[--]`, + `[---]`, + `[a-z]`, + `[a-zB0-9]`, + `[A-Z]i`, + `[a-]`, + `[----]`, + `[\x00-\x05]`, +} + +var expChars = []string{ + "", + "", + "", + "", + "a", + "ab", + "abc", + "\a", + "\b\nt", + "\b\nt", + "\tz\\", + "-", + "--", + "", + "", + "B", + "", + "a-", + "-", + "", +} + +var expUnicodeClasses = [][]string{ + 9: {"L"}, + 10: {"Greek", "N"}, + 19: nil, +} + +var expRanges = []string{ + 13: "--", + 14: "az", + 15: "az09", + 16: "AZ", + 18: "--", + 19: "\x00\x05", +} + +func TestCharClassParse(t *testing.T) { + for i, c := range charClasses { + m := NewCharClassMatcher(Pos{}, c) + + ic := strings.HasSuffix(c, "i") + if m.IgnoreCase != ic { + t.Errorf("%q: want ignore case: %t, got %t", c, ic, m.IgnoreCase) + } + iv := c[1] == '^' + if m.Inverted != iv { + t.Errorf("%q: want inverted: %t, got %t", c, iv, m.Inverted) + } + + if n := utf8.RuneCountInString(expChars[i]); len(m.Chars) != n { + t.Errorf("%q: want %d chars, got %d", c, n, len(m.Chars)) + } else if string(m.Chars) != expChars[i] { + t.Errorf("%q: want %q, got %q", c, expChars[i], string(m.Chars)) + } + + if n := utf8.RuneCountInString(expRanges[i]); len(m.Ranges) != n { + t.Errorf("%q: want %d chars, got %d", c, n, len(m.Ranges)) + } else if string(m.Ranges) != expRanges[i] { + t.Errorf("%q: want %q, got %q", c, expRanges[i], string(m.Ranges)) + } + + if n := len(expUnicodeClasses[i]); len(m.UnicodeClasses) != n { + t.Errorf("%q: want %d Unicode classes, got %d", c, n, len(m.UnicodeClasses)) + } else if n > 0 { + want := expUnicodeClasses[i] + got := m.UnicodeClasses + for j, wantClass := range want { + if wantClass != got[j] { + t.Errorf("%q: range table %d: want %v, got %v", c, j, wantClass, got[j]) + } + } + } + } +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/benchparse_test.go b/vendor/github.com/PuerkitoBio/pigeon/benchparse_test.go new file mode 100644 index 0000000000..4b307ec90f --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/benchparse_test.go @@ -0,0 +1,36 @@ +package main + +import "testing" + +// With Unicode classes in the grammar: +// BenchmarkParseUnicodeClass 2000 548233 ns/op 96615 B/op 978 allocs/op +// +// With Unicode classes in a go map: +// BenchmarkParseUnicodeClass 5000 272224 ns/op 37990 B/op 482 allocs/op +func BenchmarkParseUnicodeClass(b *testing.B) { + input := []byte("a = [\\p{Latin}]") + b.ResetTimer() + + for i := 0; i < b.N; i++ { + if _, err := Parse("", input); err != nil { + b.Fatal(err) + } + } +} + +// With keywords in the grammar: +// BenchmarkParseKeyword 5000 315189 ns/op 50175 B/op 530 allocs/op +// +// With keywords in a go map: +// BenchmarkParseKeyword 10000 201175 ns/op 27017 B/op 331 allocs/op +func BenchmarkParseKeyword(b *testing.B) { + input := []byte("a = uint32:'a'") + b.ResetTimer() + + for i := 0; i < b.N; i++ { + if _, err := Parse("", input); err == nil { + // error IS expected, fatal if none + b.Fatal(err) + } + } +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/bootstrap/cmd/bootstrap-build/main.go b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/cmd/bootstrap-build/main.go new file mode 100644 index 0000000000..0a931eb3c9 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/cmd/bootstrap-build/main.go @@ -0,0 +1,52 @@ +// Command bootstrap-build bootstraps the PEG parser generator by +// parsing the bootstrap grammar and creating a basic parser generator +// sufficiently complete to parse the pigeon PEG grammar. +package main + +import ( + "flag" + "fmt" + "log" + "os" + + "github.com/PuerkitoBio/pigeon/bootstrap" + "github.com/PuerkitoBio/pigeon/builder" +) + +func main() { + outFlag := flag.String("o", "", "output file, defaults to stdout") + flag.Parse() + + if flag.NArg() != 1 { + fmt.Fprintln(os.Stderr, "USAGE: bootstrap-build [-o OUTPUT] FILE") + os.Exit(1) + } + + outw := os.Stdout + if *outFlag != "" { + outf, err := os.Create(*outFlag) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(2) + } + defer outf.Close() + outw = outf + } + + f, err := os.Open(os.Args[1]) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(2) + } + defer f.Close() + + p := bootstrap.NewParser() + g, err := p.Parse(os.Args[1], f) + if err != nil { + log.Fatal(err) + } + + if err := builder.BuildParser(outw, g); err != nil { + log.Fatal(err) + } +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/bootstrap/cmd/bootstrap-pigeon/bench_test.go b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/cmd/bootstrap-pigeon/bench_test.go new file mode 100644 index 0000000000..c5b2c19925 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/cmd/bootstrap-pigeon/bench_test.go @@ -0,0 +1,34 @@ +package main + +import ( + "io/ioutil" + "testing" +) + +func BenchmarkParsePigeonNoMemo(b *testing.B) { + d, err := ioutil.ReadFile("../../../grammar/pigeon.peg") + if err != nil { + b.Fatal(err) + } + b.ResetTimer() + + for i := 0; i < b.N; i++ { + if _, err := Parse("", d, Memoize(false)); err != nil { + b.Fatal(err) + } + } +} + +func BenchmarkParsePigeonMemo(b *testing.B) { + d, err := ioutil.ReadFile("../../../grammar/pigeon.peg") + if err != nil { + b.Fatal(err) + } + b.ResetTimer() + + for i := 0; i < b.N; i++ { + if _, err := Parse("", d, Memoize(true)); err != nil { + b.Fatal(err) + } + } +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/bootstrap/cmd/bootstrap-pigeon/bootstrap_pigeon.go b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/cmd/bootstrap-pigeon/bootstrap_pigeon.go new file mode 100644 index 0000000000..b43152a421 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/cmd/bootstrap-pigeon/bootstrap_pigeon.go @@ -0,0 +1,3031 @@ +package main + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "strconv" + "strings" + "unicode" + "unicode/utf8" + + "github.com/PuerkitoBio/pigeon/ast" +) + +var g = &grammar{ + rules: []*rule{ + { + name: "Grammar", + pos: position{line: 5, col: 1, offset: 18}, + expr: &actionExpr{ + pos: position{line: 5, col: 11, offset: 30}, + run: (*parser).callonGrammar1, + expr: &seqExpr{ + pos: position{line: 5, col: 11, offset: 30}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 5, col: 11, offset: 30}, + name: "__", + }, + &labeledExpr{ + pos: position{line: 5, col: 14, offset: 33}, + label: "initializer", + expr: &zeroOrOneExpr{ + pos: position{line: 5, col: 28, offset: 47}, + expr: &seqExpr{ + pos: position{line: 5, col: 28, offset: 47}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 5, col: 28, offset: 47}, + name: "Initializer", + }, + &ruleRefExpr{ + pos: position{line: 5, col: 40, offset: 59}, + name: "__", + }, + }, + }, + }, + }, + &labeledExpr{ + pos: position{line: 5, col: 46, offset: 65}, + label: "rules", + expr: &oneOrMoreExpr{ + pos: position{line: 5, col: 54, offset: 73}, + expr: &seqExpr{ + pos: position{line: 5, col: 54, offset: 73}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 5, col: 54, offset: 73}, + name: "Rule", + }, + &ruleRefExpr{ + pos: position{line: 5, col: 59, offset: 78}, + name: "__", + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Initializer", + pos: position{line: 24, col: 1, offset: 521}, + expr: &actionExpr{ + pos: position{line: 24, col: 15, offset: 537}, + run: (*parser).callonInitializer1, + expr: &seqExpr{ + pos: position{line: 24, col: 15, offset: 537}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 24, col: 15, offset: 537}, + label: "code", + expr: &ruleRefExpr{ + pos: position{line: 24, col: 20, offset: 542}, + name: "CodeBlock", + }, + }, + &ruleRefExpr{ + pos: position{line: 24, col: 30, offset: 552}, + name: "EOS", + }, + }, + }, + }, + }, + { + name: "Rule", + pos: position{line: 28, col: 1, offset: 582}, + expr: &actionExpr{ + pos: position{line: 28, col: 8, offset: 591}, + run: (*parser).callonRule1, + expr: &seqExpr{ + pos: position{line: 28, col: 8, offset: 591}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 28, col: 8, offset: 591}, + label: "name", + expr: &ruleRefExpr{ + pos: position{line: 28, col: 13, offset: 596}, + name: "IdentifierName", + }, + }, + &ruleRefExpr{ + pos: position{line: 28, col: 28, offset: 611}, + name: "__", + }, + &labeledExpr{ + pos: position{line: 28, col: 31, offset: 614}, + label: "display", + expr: &zeroOrOneExpr{ + pos: position{line: 28, col: 41, offset: 624}, + expr: &seqExpr{ + pos: position{line: 28, col: 41, offset: 624}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 28, col: 41, offset: 624}, + name: "StringLiteral", + }, + &ruleRefExpr{ + pos: position{line: 28, col: 55, offset: 638}, + name: "__", + }, + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 28, col: 61, offset: 644}, + name: "RuleDefOp", + }, + &ruleRefExpr{ + pos: position{line: 28, col: 71, offset: 654}, + name: "__", + }, + &labeledExpr{ + pos: position{line: 28, col: 74, offset: 657}, + label: "expr", + expr: &ruleRefExpr{ + pos: position{line: 28, col: 79, offset: 662}, + name: "Expression", + }, + }, + &ruleRefExpr{ + pos: position{line: 28, col: 90, offset: 673}, + name: "EOS", + }, + }, + }, + }, + }, + { + name: "Expression", + pos: position{line: 41, col: 1, offset: 957}, + expr: &ruleRefExpr{ + pos: position{line: 41, col: 14, offset: 972}, + name: "ChoiceExpr", + }, + }, + { + name: "ChoiceExpr", + pos: position{line: 43, col: 1, offset: 984}, + expr: &actionExpr{ + pos: position{line: 43, col: 14, offset: 999}, + run: (*parser).callonChoiceExpr1, + expr: &seqExpr{ + pos: position{line: 43, col: 14, offset: 999}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 43, col: 14, offset: 999}, + label: "first", + expr: &ruleRefExpr{ + pos: position{line: 43, col: 20, offset: 1005}, + name: "ActionExpr", + }, + }, + &labeledExpr{ + pos: position{line: 43, col: 31, offset: 1016}, + label: "rest", + expr: &zeroOrMoreExpr{ + pos: position{line: 43, col: 38, offset: 1023}, + expr: &seqExpr{ + pos: position{line: 43, col: 38, offset: 1023}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 43, col: 38, offset: 1023}, + name: "__", + }, + &litMatcher{ + pos: position{line: 43, col: 41, offset: 1026}, + val: "/", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 43, col: 45, offset: 1030}, + name: "__", + }, + &ruleRefExpr{ + pos: position{line: 43, col: 48, offset: 1033}, + name: "ActionExpr", + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "ActionExpr", + pos: position{line: 58, col: 1, offset: 1438}, + expr: &actionExpr{ + pos: position{line: 58, col: 14, offset: 1453}, + run: (*parser).callonActionExpr1, + expr: &seqExpr{ + pos: position{line: 58, col: 14, offset: 1453}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 58, col: 14, offset: 1453}, + label: "expr", + expr: &ruleRefExpr{ + pos: position{line: 58, col: 19, offset: 1458}, + name: "SeqExpr", + }, + }, + &labeledExpr{ + pos: position{line: 58, col: 27, offset: 1466}, + label: "code", + expr: &zeroOrOneExpr{ + pos: position{line: 58, col: 34, offset: 1473}, + expr: &seqExpr{ + pos: position{line: 58, col: 34, offset: 1473}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 58, col: 34, offset: 1473}, + name: "__", + }, + &ruleRefExpr{ + pos: position{line: 58, col: 37, offset: 1476}, + name: "CodeBlock", + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "SeqExpr", + pos: position{line: 72, col: 1, offset: 1742}, + expr: &actionExpr{ + pos: position{line: 72, col: 11, offset: 1754}, + run: (*parser).callonSeqExpr1, + expr: &seqExpr{ + pos: position{line: 72, col: 11, offset: 1754}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 72, col: 11, offset: 1754}, + label: "first", + expr: &ruleRefExpr{ + pos: position{line: 72, col: 17, offset: 1760}, + name: "LabeledExpr", + }, + }, + &labeledExpr{ + pos: position{line: 72, col: 29, offset: 1772}, + label: "rest", + expr: &zeroOrMoreExpr{ + pos: position{line: 72, col: 36, offset: 1779}, + expr: &seqExpr{ + pos: position{line: 72, col: 36, offset: 1779}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 72, col: 36, offset: 1779}, + name: "__", + }, + &ruleRefExpr{ + pos: position{line: 72, col: 39, offset: 1782}, + name: "LabeledExpr", + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "LabeledExpr", + pos: position{line: 85, col: 1, offset: 2133}, + expr: &choiceExpr{ + pos: position{line: 85, col: 15, offset: 2149}, + alternatives: []interface{}{ + &actionExpr{ + pos: position{line: 85, col: 15, offset: 2149}, + run: (*parser).callonLabeledExpr2, + expr: &seqExpr{ + pos: position{line: 85, col: 15, offset: 2149}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 85, col: 15, offset: 2149}, + label: "label", + expr: &ruleRefExpr{ + pos: position{line: 85, col: 21, offset: 2155}, + name: "Identifier", + }, + }, + &ruleRefExpr{ + pos: position{line: 85, col: 32, offset: 2166}, + name: "__", + }, + &litMatcher{ + pos: position{line: 85, col: 35, offset: 2169}, + val: ":", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 85, col: 39, offset: 2173}, + name: "__", + }, + &labeledExpr{ + pos: position{line: 85, col: 42, offset: 2176}, + label: "expr", + expr: &ruleRefExpr{ + pos: position{line: 85, col: 47, offset: 2181}, + name: "PrefixedExpr", + }, + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 91, col: 5, offset: 2354}, + name: "PrefixedExpr", + }, + }, + }, + }, + { + name: "PrefixedExpr", + pos: position{line: 93, col: 1, offset: 2368}, + expr: &choiceExpr{ + pos: position{line: 93, col: 16, offset: 2385}, + alternatives: []interface{}{ + &actionExpr{ + pos: position{line: 93, col: 16, offset: 2385}, + run: (*parser).callonPrefixedExpr2, + expr: &seqExpr{ + pos: position{line: 93, col: 16, offset: 2385}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 93, col: 16, offset: 2385}, + label: "op", + expr: &ruleRefExpr{ + pos: position{line: 93, col: 19, offset: 2388}, + name: "PrefixedOp", + }, + }, + &ruleRefExpr{ + pos: position{line: 93, col: 30, offset: 2399}, + name: "__", + }, + &labeledExpr{ + pos: position{line: 93, col: 33, offset: 2402}, + label: "expr", + expr: &ruleRefExpr{ + pos: position{line: 93, col: 38, offset: 2407}, + name: "SuffixedExpr", + }, + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 104, col: 5, offset: 2689}, + name: "SuffixedExpr", + }, + }, + }, + }, + { + name: "PrefixedOp", + pos: position{line: 106, col: 1, offset: 2703}, + expr: &actionExpr{ + pos: position{line: 106, col: 14, offset: 2718}, + run: (*parser).callonPrefixedOp1, + expr: &choiceExpr{ + pos: position{line: 106, col: 16, offset: 2720}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 106, col: 16, offset: 2720}, + val: "&", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 106, col: 22, offset: 2726}, + val: "!", + ignoreCase: false, + }, + }, + }, + }, + }, + { + name: "SuffixedExpr", + pos: position{line: 110, col: 1, offset: 2768}, + expr: &choiceExpr{ + pos: position{line: 110, col: 16, offset: 2785}, + alternatives: []interface{}{ + &actionExpr{ + pos: position{line: 110, col: 16, offset: 2785}, + run: (*parser).callonSuffixedExpr2, + expr: &seqExpr{ + pos: position{line: 110, col: 16, offset: 2785}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 110, col: 16, offset: 2785}, + label: "expr", + expr: &ruleRefExpr{ + pos: position{line: 110, col: 21, offset: 2790}, + name: "PrimaryExpr", + }, + }, + &ruleRefExpr{ + pos: position{line: 110, col: 33, offset: 2802}, + name: "__", + }, + &labeledExpr{ + pos: position{line: 110, col: 36, offset: 2805}, + label: "op", + expr: &ruleRefExpr{ + pos: position{line: 110, col: 39, offset: 2808}, + name: "SuffixedOp", + }, + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 129, col: 5, offset: 3338}, + name: "PrimaryExpr", + }, + }, + }, + }, + { + name: "SuffixedOp", + pos: position{line: 131, col: 1, offset: 3352}, + expr: &actionExpr{ + pos: position{line: 131, col: 14, offset: 3367}, + run: (*parser).callonSuffixedOp1, + expr: &choiceExpr{ + pos: position{line: 131, col: 16, offset: 3369}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 131, col: 16, offset: 3369}, + val: "?", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 131, col: 22, offset: 3375}, + val: "*", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 131, col: 28, offset: 3381}, + val: "+", + ignoreCase: false, + }, + }, + }, + }, + }, + { + name: "PrimaryExpr", + pos: position{line: 135, col: 1, offset: 3423}, + expr: &choiceExpr{ + pos: position{line: 135, col: 15, offset: 3439}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 135, col: 15, offset: 3439}, + name: "LitMatcher", + }, + &ruleRefExpr{ + pos: position{line: 135, col: 28, offset: 3452}, + name: "CharClassMatcher", + }, + &ruleRefExpr{ + pos: position{line: 135, col: 47, offset: 3471}, + name: "AnyMatcher", + }, + &ruleRefExpr{ + pos: position{line: 135, col: 60, offset: 3484}, + name: "RuleRefExpr", + }, + &ruleRefExpr{ + pos: position{line: 135, col: 74, offset: 3498}, + name: "SemanticPredExpr", + }, + &actionExpr{ + pos: position{line: 135, col: 93, offset: 3517}, + run: (*parser).callonPrimaryExpr7, + expr: &seqExpr{ + pos: position{line: 135, col: 93, offset: 3517}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 135, col: 93, offset: 3517}, + val: "(", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 135, col: 97, offset: 3521}, + name: "__", + }, + &labeledExpr{ + pos: position{line: 135, col: 100, offset: 3524}, + label: "expr", + expr: &ruleRefExpr{ + pos: position{line: 135, col: 105, offset: 3529}, + name: "Expression", + }, + }, + &ruleRefExpr{ + pos: position{line: 135, col: 116, offset: 3540}, + name: "__", + }, + &litMatcher{ + pos: position{line: 135, col: 119, offset: 3543}, + val: ")", + ignoreCase: false, + }, + }, + }, + }, + }, + }, + }, + { + name: "RuleRefExpr", + pos: position{line: 138, col: 1, offset: 3572}, + expr: &actionExpr{ + pos: position{line: 138, col: 15, offset: 3588}, + run: (*parser).callonRuleRefExpr1, + expr: &seqExpr{ + pos: position{line: 138, col: 15, offset: 3588}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 138, col: 15, offset: 3588}, + label: "name", + expr: &ruleRefExpr{ + pos: position{line: 138, col: 20, offset: 3593}, + name: "IdentifierName", + }, + }, + ¬Expr{ + pos: position{line: 138, col: 35, offset: 3608}, + expr: &seqExpr{ + pos: position{line: 138, col: 38, offset: 3611}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 138, col: 38, offset: 3611}, + name: "__", + }, + &zeroOrOneExpr{ + pos: position{line: 138, col: 43, offset: 3616}, + expr: &seqExpr{ + pos: position{line: 138, col: 43, offset: 3616}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 138, col: 43, offset: 3616}, + name: "StringLiteral", + }, + &ruleRefExpr{ + pos: position{line: 138, col: 57, offset: 3630}, + name: "__", + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 138, col: 63, offset: 3636}, + name: "RuleDefOp", + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "SemanticPredExpr", + pos: position{line: 143, col: 1, offset: 3752}, + expr: &actionExpr{ + pos: position{line: 143, col: 20, offset: 3773}, + run: (*parser).callonSemanticPredExpr1, + expr: &seqExpr{ + pos: position{line: 143, col: 20, offset: 3773}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 143, col: 20, offset: 3773}, + label: "op", + expr: &ruleRefExpr{ + pos: position{line: 143, col: 23, offset: 3776}, + name: "SemanticPredOp", + }, + }, + &ruleRefExpr{ + pos: position{line: 143, col: 38, offset: 3791}, + name: "__", + }, + &labeledExpr{ + pos: position{line: 143, col: 41, offset: 3794}, + label: "code", + expr: &ruleRefExpr{ + pos: position{line: 143, col: 46, offset: 3799}, + name: "CodeBlock", + }, + }, + }, + }, + }, + }, + { + name: "SemanticPredOp", + pos: position{line: 154, col: 1, offset: 4076}, + expr: &actionExpr{ + pos: position{line: 154, col: 18, offset: 4095}, + run: (*parser).callonSemanticPredOp1, + expr: &choiceExpr{ + pos: position{line: 154, col: 20, offset: 4097}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 154, col: 20, offset: 4097}, + val: "&", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 154, col: 26, offset: 4103}, + val: "!", + ignoreCase: false, + }, + }, + }, + }, + }, + { + name: "RuleDefOp", + pos: position{line: 158, col: 1, offset: 4145}, + expr: &choiceExpr{ + pos: position{line: 158, col: 13, offset: 4159}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 158, col: 13, offset: 4159}, + val: "=", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 158, col: 19, offset: 4165}, + val: "<-", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 158, col: 26, offset: 4172}, + val: "←", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 158, col: 37, offset: 4183}, + val: "⟵", + ignoreCase: false, + }, + }, + }, + }, + { + name: "SourceChar", + pos: position{line: 160, col: 1, offset: 4193}, + expr: &anyMatcher{ + line: 160, col: 14, offset: 4208, + }, + }, + { + name: "Comment", + pos: position{line: 161, col: 1, offset: 4210}, + expr: &choiceExpr{ + pos: position{line: 161, col: 11, offset: 4222}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 161, col: 11, offset: 4222}, + name: "MultiLineComment", + }, + &ruleRefExpr{ + pos: position{line: 161, col: 30, offset: 4241}, + name: "SingleLineComment", + }, + }, + }, + }, + { + name: "MultiLineComment", + pos: position{line: 162, col: 1, offset: 4259}, + expr: &seqExpr{ + pos: position{line: 162, col: 20, offset: 4280}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 162, col: 20, offset: 4280}, + val: "/*", + ignoreCase: false, + }, + &zeroOrMoreExpr{ + pos: position{line: 162, col: 27, offset: 4287}, + expr: &seqExpr{ + pos: position{line: 162, col: 27, offset: 4287}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 162, col: 27, offset: 4287}, + expr: &litMatcher{ + pos: position{line: 162, col: 28, offset: 4288}, + val: "*/", + ignoreCase: false, + }, + }, + &ruleRefExpr{ + pos: position{line: 162, col: 33, offset: 4293}, + name: "SourceChar", + }, + }, + }, + }, + &litMatcher{ + pos: position{line: 162, col: 47, offset: 4307}, + val: "*/", + ignoreCase: false, + }, + }, + }, + }, + { + name: "MultiLineCommentNoLineTerminator", + pos: position{line: 163, col: 1, offset: 4312}, + expr: &seqExpr{ + pos: position{line: 163, col: 36, offset: 4349}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 163, col: 36, offset: 4349}, + val: "/*", + ignoreCase: false, + }, + &zeroOrMoreExpr{ + pos: position{line: 163, col: 43, offset: 4356}, + expr: &seqExpr{ + pos: position{line: 163, col: 43, offset: 4356}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 163, col: 43, offset: 4356}, + expr: &choiceExpr{ + pos: position{line: 163, col: 46, offset: 4359}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 163, col: 46, offset: 4359}, + val: "*/", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 163, col: 53, offset: 4366}, + name: "EOL", + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 163, col: 59, offset: 4372}, + name: "SourceChar", + }, + }, + }, + }, + &litMatcher{ + pos: position{line: 163, col: 73, offset: 4386}, + val: "*/", + ignoreCase: false, + }, + }, + }, + }, + { + name: "SingleLineComment", + pos: position{line: 164, col: 1, offset: 4391}, + expr: &seqExpr{ + pos: position{line: 164, col: 21, offset: 4413}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 164, col: 21, offset: 4413}, + val: "//", + ignoreCase: false, + }, + &zeroOrMoreExpr{ + pos: position{line: 164, col: 28, offset: 4420}, + expr: &seqExpr{ + pos: position{line: 164, col: 28, offset: 4420}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 164, col: 28, offset: 4420}, + expr: &ruleRefExpr{ + pos: position{line: 164, col: 29, offset: 4421}, + name: "EOL", + }, + }, + &ruleRefExpr{ + pos: position{line: 164, col: 33, offset: 4425}, + name: "SourceChar", + }, + }, + }, + }, + }, + }, + }, + { + name: "Identifier", + pos: position{line: 166, col: 1, offset: 4440}, + expr: &ruleRefExpr{ + pos: position{line: 166, col: 14, offset: 4455}, + name: "IdentifierName", + }, + }, + { + name: "IdentifierName", + pos: position{line: 167, col: 1, offset: 4470}, + expr: &actionExpr{ + pos: position{line: 167, col: 18, offset: 4489}, + run: (*parser).callonIdentifierName1, + expr: &seqExpr{ + pos: position{line: 167, col: 18, offset: 4489}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 167, col: 18, offset: 4489}, + name: "IdentifierStart", + }, + &zeroOrMoreExpr{ + pos: position{line: 167, col: 34, offset: 4505}, + expr: &ruleRefExpr{ + pos: position{line: 167, col: 34, offset: 4505}, + name: "IdentifierPart", + }, + }, + }, + }, + }, + }, + { + name: "IdentifierStart", + pos: position{line: 170, col: 1, offset: 4587}, + expr: &charClassMatcher{ + pos: position{line: 170, col: 19, offset: 4607}, + val: "[a-z_]i", + chars: []rune{'_'}, + ranges: []rune{'a', 'z'}, + ignoreCase: true, + inverted: false, + }, + }, + { + name: "IdentifierPart", + pos: position{line: 171, col: 1, offset: 4615}, + expr: &choiceExpr{ + pos: position{line: 171, col: 18, offset: 4634}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 171, col: 18, offset: 4634}, + name: "IdentifierStart", + }, + &charClassMatcher{ + pos: position{line: 171, col: 36, offset: 4652}, + val: "[0-9]", + ranges: []rune{'0', '9'}, + ignoreCase: false, + inverted: false, + }, + }, + }, + }, + { + name: "LitMatcher", + pos: position{line: 173, col: 1, offset: 4659}, + expr: &actionExpr{ + pos: position{line: 173, col: 14, offset: 4674}, + run: (*parser).callonLitMatcher1, + expr: &seqExpr{ + pos: position{line: 173, col: 14, offset: 4674}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 173, col: 14, offset: 4674}, + label: "lit", + expr: &ruleRefExpr{ + pos: position{line: 173, col: 18, offset: 4678}, + name: "StringLiteral", + }, + }, + &labeledExpr{ + pos: position{line: 173, col: 32, offset: 4692}, + label: "ignore", + expr: &zeroOrOneExpr{ + pos: position{line: 173, col: 39, offset: 4699}, + expr: &litMatcher{ + pos: position{line: 173, col: 39, offset: 4699}, + val: "i", + ignoreCase: false, + }, + }, + }, + }, + }, + }, + }, + { + name: "StringLiteral", + pos: position{line: 183, col: 1, offset: 4925}, + expr: &actionExpr{ + pos: position{line: 183, col: 17, offset: 4943}, + run: (*parser).callonStringLiteral1, + expr: &choiceExpr{ + pos: position{line: 183, col: 19, offset: 4945}, + alternatives: []interface{}{ + &seqExpr{ + pos: position{line: 183, col: 19, offset: 4945}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 183, col: 19, offset: 4945}, + val: "\"", + ignoreCase: false, + }, + &zeroOrMoreExpr{ + pos: position{line: 183, col: 23, offset: 4949}, + expr: &ruleRefExpr{ + pos: position{line: 183, col: 23, offset: 4949}, + name: "DoubleStringChar", + }, + }, + &litMatcher{ + pos: position{line: 183, col: 41, offset: 4967}, + val: "\"", + ignoreCase: false, + }, + }, + }, + &seqExpr{ + pos: position{line: 183, col: 47, offset: 4973}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 183, col: 47, offset: 4973}, + val: "'", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 183, col: 51, offset: 4977}, + name: "SingleStringChar", + }, + &litMatcher{ + pos: position{line: 183, col: 68, offset: 4994}, + val: "'", + ignoreCase: false, + }, + }, + }, + &seqExpr{ + pos: position{line: 183, col: 74, offset: 5000}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 183, col: 74, offset: 5000}, + val: "`", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 183, col: 78, offset: 5004}, + name: "RawStringChar", + }, + &litMatcher{ + pos: position{line: 183, col: 92, offset: 5018}, + val: "`", + ignoreCase: false, + }, + }, + }, + }, + }, + }, + }, + { + name: "DoubleStringChar", + pos: position{line: 186, col: 1, offset: 5089}, + expr: &choiceExpr{ + pos: position{line: 186, col: 20, offset: 5110}, + alternatives: []interface{}{ + &seqExpr{ + pos: position{line: 186, col: 20, offset: 5110}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 186, col: 20, offset: 5110}, + expr: &choiceExpr{ + pos: position{line: 186, col: 23, offset: 5113}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 186, col: 23, offset: 5113}, + val: "\"", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 186, col: 29, offset: 5119}, + val: "\\", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 186, col: 36, offset: 5126}, + name: "EOL", + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 186, col: 42, offset: 5132}, + name: "SourceChar", + }, + }, + }, + &seqExpr{ + pos: position{line: 186, col: 55, offset: 5145}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 186, col: 55, offset: 5145}, + val: "\\", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 186, col: 60, offset: 5150}, + name: "DoubleStringEscape", + }, + }, + }, + }, + }, + }, + { + name: "SingleStringChar", + pos: position{line: 187, col: 1, offset: 5169}, + expr: &choiceExpr{ + pos: position{line: 187, col: 20, offset: 5190}, + alternatives: []interface{}{ + &seqExpr{ + pos: position{line: 187, col: 20, offset: 5190}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 187, col: 20, offset: 5190}, + expr: &choiceExpr{ + pos: position{line: 187, col: 23, offset: 5193}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 187, col: 23, offset: 5193}, + val: "'", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 187, col: 29, offset: 5199}, + val: "\\", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 187, col: 36, offset: 5206}, + name: "EOL", + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 187, col: 42, offset: 5212}, + name: "SourceChar", + }, + }, + }, + &seqExpr{ + pos: position{line: 187, col: 55, offset: 5225}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 187, col: 55, offset: 5225}, + val: "\\", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 187, col: 60, offset: 5230}, + name: "SingleStringEscape", + }, + }, + }, + }, + }, + }, + { + name: "RawStringChar", + pos: position{line: 188, col: 1, offset: 5249}, + expr: &seqExpr{ + pos: position{line: 188, col: 17, offset: 5267}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 188, col: 17, offset: 5267}, + expr: &litMatcher{ + pos: position{line: 188, col: 18, offset: 5268}, + val: "`", + ignoreCase: false, + }, + }, + &ruleRefExpr{ + pos: position{line: 188, col: 22, offset: 5272}, + name: "SourceChar", + }, + }, + }, + }, + { + name: "DoubleStringEscape", + pos: position{line: 190, col: 1, offset: 5284}, + expr: &choiceExpr{ + pos: position{line: 190, col: 22, offset: 5307}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 190, col: 22, offset: 5307}, + val: "'", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 190, col: 28, offset: 5313}, + name: "CommonEscapeSequence", + }, + }, + }, + }, + { + name: "SingleStringEscape", + pos: position{line: 191, col: 1, offset: 5334}, + expr: &choiceExpr{ + pos: position{line: 191, col: 22, offset: 5357}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 191, col: 22, offset: 5357}, + val: "\"", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 191, col: 28, offset: 5363}, + name: "CommonEscapeSequence", + }, + }, + }, + }, + { + name: "CommonEscapeSequence", + pos: position{line: 193, col: 1, offset: 5385}, + expr: &choiceExpr{ + pos: position{line: 193, col: 24, offset: 5410}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 193, col: 24, offset: 5410}, + name: "SingleCharEscape", + }, + &ruleRefExpr{ + pos: position{line: 193, col: 43, offset: 5429}, + name: "OctalEscape", + }, + &ruleRefExpr{ + pos: position{line: 193, col: 57, offset: 5443}, + name: "HexEscape", + }, + &ruleRefExpr{ + pos: position{line: 193, col: 69, offset: 5455}, + name: "LongUnicodeEscape", + }, + &ruleRefExpr{ + pos: position{line: 193, col: 89, offset: 5475}, + name: "ShortUnicodeEscape", + }, + }, + }, + }, + { + name: "SingleCharEscape", + pos: position{line: 194, col: 1, offset: 5494}, + expr: &choiceExpr{ + pos: position{line: 194, col: 20, offset: 5515}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 194, col: 20, offset: 5515}, + val: "a", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 194, col: 26, offset: 5521}, + val: "b", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 194, col: 32, offset: 5527}, + val: "n", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 194, col: 38, offset: 5533}, + val: "f", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 194, col: 44, offset: 5539}, + val: "r", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 194, col: 50, offset: 5545}, + val: "t", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 194, col: 56, offset: 5551}, + val: "v", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 194, col: 62, offset: 5557}, + val: "\\", + ignoreCase: false, + }, + }, + }, + }, + { + name: "OctalEscape", + pos: position{line: 195, col: 1, offset: 5562}, + expr: &seqExpr{ + pos: position{line: 195, col: 15, offset: 5578}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 195, col: 15, offset: 5578}, + name: "OctalDigit", + }, + &ruleRefExpr{ + pos: position{line: 195, col: 26, offset: 5589}, + name: "OctalDigit", + }, + &ruleRefExpr{ + pos: position{line: 195, col: 37, offset: 5600}, + name: "OctalDigit", + }, + }, + }, + }, + { + name: "HexEscape", + pos: position{line: 196, col: 1, offset: 5611}, + expr: &seqExpr{ + pos: position{line: 196, col: 13, offset: 5625}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 196, col: 13, offset: 5625}, + val: "x", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 196, col: 17, offset: 5629}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 196, col: 26, offset: 5638}, + name: "HexDigit", + }, + }, + }, + }, + { + name: "LongUnicodeEscape", + pos: position{line: 197, col: 1, offset: 5647}, + expr: &seqExpr{ + pos: position{line: 197, col: 21, offset: 5669}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 197, col: 21, offset: 5669}, + val: "U", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 197, col: 25, offset: 5673}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 197, col: 34, offset: 5682}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 197, col: 43, offset: 5691}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 197, col: 52, offset: 5700}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 197, col: 61, offset: 5709}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 197, col: 70, offset: 5718}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 197, col: 79, offset: 5727}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 197, col: 88, offset: 5736}, + name: "HexDigit", + }, + }, + }, + }, + { + name: "ShortUnicodeEscape", + pos: position{line: 198, col: 1, offset: 5745}, + expr: &seqExpr{ + pos: position{line: 198, col: 22, offset: 5768}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 198, col: 22, offset: 5768}, + val: "u", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 198, col: 26, offset: 5772}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 198, col: 35, offset: 5781}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 198, col: 44, offset: 5790}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 198, col: 53, offset: 5799}, + name: "HexDigit", + }, + }, + }, + }, + { + name: "OctalDigit", + pos: position{line: 200, col: 1, offset: 5809}, + expr: &charClassMatcher{ + pos: position{line: 200, col: 14, offset: 5824}, + val: "[0-7]", + ranges: []rune{'0', '7'}, + ignoreCase: false, + inverted: false, + }, + }, + { + name: "DecimalDigit", + pos: position{line: 201, col: 1, offset: 5830}, + expr: &charClassMatcher{ + pos: position{line: 201, col: 16, offset: 5847}, + val: "[0-9]", + ranges: []rune{'0', '9'}, + ignoreCase: false, + inverted: false, + }, + }, + { + name: "HexDigit", + pos: position{line: 202, col: 1, offset: 5853}, + expr: &charClassMatcher{ + pos: position{line: 202, col: 12, offset: 5866}, + val: "[0-9a-f]i", + ranges: []rune{'0', '9', 'a', 'f'}, + ignoreCase: true, + inverted: false, + }, + }, + { + name: "CharClassMatcher", + pos: position{line: 204, col: 1, offset: 5877}, + expr: &actionExpr{ + pos: position{line: 204, col: 20, offset: 5898}, + run: (*parser).callonCharClassMatcher1, + expr: &seqExpr{ + pos: position{line: 204, col: 20, offset: 5898}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 204, col: 20, offset: 5898}, + val: "[", + ignoreCase: false, + }, + &zeroOrMoreExpr{ + pos: position{line: 204, col: 26, offset: 5904}, + expr: &choiceExpr{ + pos: position{line: 204, col: 26, offset: 5904}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 204, col: 26, offset: 5904}, + name: "ClassCharRange", + }, + &ruleRefExpr{ + pos: position{line: 204, col: 43, offset: 5921}, + name: "ClassChar", + }, + &seqExpr{ + pos: position{line: 204, col: 55, offset: 5933}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 204, col: 55, offset: 5933}, + val: "\\", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 204, col: 60, offset: 5938}, + name: "UnicodeClassEscape", + }, + }, + }, + }, + }, + }, + &litMatcher{ + pos: position{line: 204, col: 82, offset: 5960}, + val: "]", + ignoreCase: false, + }, + &zeroOrOneExpr{ + pos: position{line: 204, col: 86, offset: 5964}, + expr: &litMatcher{ + pos: position{line: 204, col: 86, offset: 5964}, + val: "i", + ignoreCase: false, + }, + }, + }, + }, + }, + }, + { + name: "ClassCharRange", + pos: position{line: 209, col: 1, offset: 6069}, + expr: &seqExpr{ + pos: position{line: 209, col: 18, offset: 6088}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 209, col: 18, offset: 6088}, + name: "ClassChar", + }, + &litMatcher{ + pos: position{line: 209, col: 28, offset: 6098}, + val: "-", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 209, col: 32, offset: 6102}, + name: "ClassChar", + }, + }, + }, + }, + { + name: "ClassChar", + pos: position{line: 210, col: 1, offset: 6112}, + expr: &choiceExpr{ + pos: position{line: 210, col: 13, offset: 6126}, + alternatives: []interface{}{ + &seqExpr{ + pos: position{line: 210, col: 13, offset: 6126}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 210, col: 13, offset: 6126}, + expr: &choiceExpr{ + pos: position{line: 210, col: 16, offset: 6129}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 210, col: 16, offset: 6129}, + val: "]", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 210, col: 22, offset: 6135}, + val: "\\", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 210, col: 29, offset: 6142}, + name: "EOL", + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 210, col: 35, offset: 6148}, + name: "SourceChar", + }, + }, + }, + &seqExpr{ + pos: position{line: 210, col: 48, offset: 6161}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 210, col: 48, offset: 6161}, + val: "\\", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 210, col: 53, offset: 6166}, + name: "CharClassEscape", + }, + }, + }, + }, + }, + }, + { + name: "CharClassEscape", + pos: position{line: 211, col: 1, offset: 6182}, + expr: &choiceExpr{ + pos: position{line: 211, col: 19, offset: 6202}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 211, col: 19, offset: 6202}, + val: "]", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 211, col: 25, offset: 6208}, + name: "CommonEscapeSequence", + }, + }, + }, + }, + { + name: "UnicodeClassEscape", + pos: position{line: 213, col: 1, offset: 6230}, + expr: &seqExpr{ + pos: position{line: 213, col: 22, offset: 6253}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 213, col: 22, offset: 6253}, + val: "p", + ignoreCase: false, + }, + &choiceExpr{ + pos: position{line: 213, col: 28, offset: 6259}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 213, col: 28, offset: 6259}, + name: "SingleCharUnicodeClass", + }, + &seqExpr{ + pos: position{line: 213, col: 53, offset: 6284}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 213, col: 53, offset: 6284}, + val: "{", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 213, col: 57, offset: 6288}, + name: "UnicodeClass", + }, + &litMatcher{ + pos: position{line: 213, col: 70, offset: 6301}, + val: "}", + ignoreCase: false, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "SingleCharUnicodeClass", + pos: position{line: 214, col: 1, offset: 6307}, + expr: &charClassMatcher{ + pos: position{line: 214, col: 26, offset: 6334}, + val: "[LMNCPZS]", + chars: []rune{'L', 'M', 'N', 'C', 'P', 'Z', 'S'}, + ignoreCase: false, + inverted: false, + }, + }, + { + name: "UnicodeClass", + pos: position{line: 215, col: 1, offset: 6344}, + expr: &oneOrMoreExpr{ + pos: position{line: 215, col: 16, offset: 6361}, + expr: &charClassMatcher{ + pos: position{line: 215, col: 16, offset: 6361}, + val: "[a-z_]i", + chars: []rune{'_'}, + ranges: []rune{'a', 'z'}, + ignoreCase: true, + inverted: false, + }, + }, + }, + { + name: "AnyMatcher", + pos: position{line: 217, col: 1, offset: 6371}, + expr: &actionExpr{ + pos: position{line: 217, col: 14, offset: 6386}, + run: (*parser).callonAnyMatcher1, + expr: &litMatcher{ + pos: position{line: 217, col: 14, offset: 6386}, + val: ".", + ignoreCase: false, + }, + }, + }, + { + name: "CodeBlock", + pos: position{line: 222, col: 1, offset: 6461}, + expr: &actionExpr{ + pos: position{line: 222, col: 13, offset: 6475}, + run: (*parser).callonCodeBlock1, + expr: &seqExpr{ + pos: position{line: 222, col: 13, offset: 6475}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 222, col: 13, offset: 6475}, + val: "{", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 222, col: 17, offset: 6479}, + name: "Code", + }, + &litMatcher{ + pos: position{line: 222, col: 22, offset: 6484}, + val: "}", + ignoreCase: false, + }, + }, + }, + }, + }, + { + name: "Code", + pos: position{line: 228, col: 1, offset: 6582}, + expr: &zeroOrMoreExpr{ + pos: position{line: 228, col: 10, offset: 6593}, + expr: &choiceExpr{ + pos: position{line: 228, col: 10, offset: 6593}, + alternatives: []interface{}{ + &oneOrMoreExpr{ + pos: position{line: 228, col: 12, offset: 6595}, + expr: &seqExpr{ + pos: position{line: 228, col: 12, offset: 6595}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 228, col: 12, offset: 6595}, + expr: &charClassMatcher{ + pos: position{line: 228, col: 13, offset: 6596}, + val: "[{}]", + chars: []rune{'{', '}'}, + ignoreCase: false, + inverted: false, + }, + }, + &ruleRefExpr{ + pos: position{line: 228, col: 18, offset: 6601}, + name: "SourceChar", + }, + }, + }, + }, + &seqExpr{ + pos: position{line: 228, col: 34, offset: 6617}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 228, col: 34, offset: 6617}, + val: "{", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 228, col: 38, offset: 6621}, + name: "Code", + }, + &litMatcher{ + pos: position{line: 228, col: 43, offset: 6626}, + val: "}", + ignoreCase: false, + }, + }, + }, + }, + }, + }, + }, + { + name: "__", + pos: position{line: 230, col: 1, offset: 6634}, + expr: &zeroOrMoreExpr{ + pos: position{line: 230, col: 8, offset: 6643}, + expr: &choiceExpr{ + pos: position{line: 230, col: 8, offset: 6643}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 230, col: 8, offset: 6643}, + name: "Whitespace", + }, + &ruleRefExpr{ + pos: position{line: 230, col: 21, offset: 6656}, + name: "EOL", + }, + &ruleRefExpr{ + pos: position{line: 230, col: 27, offset: 6662}, + name: "Comment", + }, + }, + }, + }, + }, + { + name: "_", + pos: position{line: 231, col: 1, offset: 6673}, + expr: &zeroOrMoreExpr{ + pos: position{line: 231, col: 7, offset: 6681}, + expr: &choiceExpr{ + pos: position{line: 231, col: 7, offset: 6681}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 231, col: 7, offset: 6681}, + name: "Whitespace", + }, + &ruleRefExpr{ + pos: position{line: 231, col: 20, offset: 6694}, + name: "MultiLineCommentNoLineTerminator", + }, + }, + }, + }, + }, + { + name: "Whitespace", + pos: position{line: 233, col: 1, offset: 6731}, + expr: &charClassMatcher{ + pos: position{line: 233, col: 14, offset: 6746}, + val: "[ \\t\\r]", + chars: []rune{' ', '\t', '\r'}, + ignoreCase: false, + inverted: false, + }, + }, + { + name: "EOL", + pos: position{line: 234, col: 1, offset: 6754}, + expr: &litMatcher{ + pos: position{line: 234, col: 7, offset: 6762}, + val: "\n", + ignoreCase: false, + }, + }, + { + name: "EOS", + pos: position{line: 235, col: 1, offset: 6767}, + expr: &choiceExpr{ + pos: position{line: 235, col: 7, offset: 6775}, + alternatives: []interface{}{ + &seqExpr{ + pos: position{line: 235, col: 7, offset: 6775}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 235, col: 7, offset: 6775}, + name: "__", + }, + &litMatcher{ + pos: position{line: 235, col: 10, offset: 6778}, + val: ";", + ignoreCase: false, + }, + }, + }, + &seqExpr{ + pos: position{line: 235, col: 16, offset: 6784}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 235, col: 16, offset: 6784}, + name: "_", + }, + &zeroOrOneExpr{ + pos: position{line: 235, col: 18, offset: 6786}, + expr: &ruleRefExpr{ + pos: position{line: 235, col: 18, offset: 6786}, + name: "SingleLineComment", + }, + }, + &ruleRefExpr{ + pos: position{line: 235, col: 37, offset: 6805}, + name: "EOL", + }, + }, + }, + &seqExpr{ + pos: position{line: 235, col: 43, offset: 6811}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 235, col: 43, offset: 6811}, + name: "__", + }, + &ruleRefExpr{ + pos: position{line: 235, col: 46, offset: 6814}, + name: "EOF", + }, + }, + }, + }, + }, + }, + { + name: "EOF", + pos: position{line: 237, col: 1, offset: 6819}, + expr: ¬Expr{ + pos: position{line: 237, col: 7, offset: 6827}, + expr: &anyMatcher{ + line: 237, col: 8, offset: 6828, + }, + }, + }, + }, +} + +func (c *current) onGrammar1(initializer, rules interface{}) (interface{}, error) { + pos := c.astPos() + + // create the grammar, assign its initializer + g := ast.NewGrammar(pos) + initSlice := toIfaceSlice(initializer) + if len(initSlice) > 0 { + g.Init = initSlice[0].(*ast.CodeBlock) + } + + rulesSlice := toIfaceSlice(rules) + g.Rules = make([]*ast.Rule, len(rulesSlice)) + for i, duo := range rulesSlice { + g.Rules[i] = duo.([]interface{})[0].(*ast.Rule) + } + + return g, nil +} + +func (p *parser) callonGrammar1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onGrammar1(stack["initializer"], stack["rules"]) +} + +func (c *current) onInitializer1(code interface{}) (interface{}, error) { + return code, nil +} + +func (p *parser) callonInitializer1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onInitializer1(stack["code"]) +} + +func (c *current) onRule1(name, display, expr interface{}) (interface{}, error) { + pos := c.astPos() + + rule := ast.NewRule(pos, name.(*ast.Identifier)) + displaySlice := toIfaceSlice(display) + if len(displaySlice) > 0 { + rule.DisplayName = displaySlice[0].(*ast.StringLit) + } + rule.Expr = expr.(ast.Expression) + + return rule, nil +} + +func (p *parser) callonRule1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onRule1(stack["name"], stack["display"], stack["expr"]) +} + +func (c *current) onChoiceExpr1(first, rest interface{}) (interface{}, error) { + restSlice := toIfaceSlice(rest) + if len(restSlice) == 0 { + return first, nil + } + + pos := c.astPos() + choice := ast.NewChoiceExpr(pos) + choice.Alternatives = []ast.Expression{first.(ast.Expression)} + for _, sl := range restSlice { + choice.Alternatives = append(choice.Alternatives, sl.([]interface{})[3].(ast.Expression)) + } + return choice, nil +} + +func (p *parser) callonChoiceExpr1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onChoiceExpr1(stack["first"], stack["rest"]) +} + +func (c *current) onActionExpr1(expr, code interface{}) (interface{}, error) { + if code == nil { + return expr, nil + } + + pos := c.astPos() + act := ast.NewActionExpr(pos) + act.Expr = expr.(ast.Expression) + codeSlice := toIfaceSlice(code) + act.Code = codeSlice[1].(*ast.CodeBlock) + + return act, nil +} + +func (p *parser) callonActionExpr1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onActionExpr1(stack["expr"], stack["code"]) +} + +func (c *current) onSeqExpr1(first, rest interface{}) (interface{}, error) { + restSlice := toIfaceSlice(rest) + if len(restSlice) == 0 { + return first, nil + } + seq := ast.NewSeqExpr(c.astPos()) + seq.Exprs = []ast.Expression{first.(ast.Expression)} + for _, sl := range restSlice { + seq.Exprs = append(seq.Exprs, sl.([]interface{})[1].(ast.Expression)) + } + return seq, nil +} + +func (p *parser) callonSeqExpr1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onSeqExpr1(stack["first"], stack["rest"]) +} + +func (c *current) onLabeledExpr2(label, expr interface{}) (interface{}, error) { + pos := c.astPos() + lab := ast.NewLabeledExpr(pos) + lab.Label = label.(*ast.Identifier) + lab.Expr = expr.(ast.Expression) + return lab, nil +} + +func (p *parser) callonLabeledExpr2() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onLabeledExpr2(stack["label"], stack["expr"]) +} + +func (c *current) onPrefixedExpr2(op, expr interface{}) (interface{}, error) { + pos := c.astPos() + opStr := op.(string) + if opStr == "&" { + and := ast.NewAndExpr(pos) + and.Expr = expr.(ast.Expression) + return and, nil + } + not := ast.NewNotExpr(pos) + not.Expr = expr.(ast.Expression) + return not, nil +} + +func (p *parser) callonPrefixedExpr2() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onPrefixedExpr2(stack["op"], stack["expr"]) +} + +func (c *current) onPrefixedOp1() (interface{}, error) { + return string(c.text), nil +} + +func (p *parser) callonPrefixedOp1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onPrefixedOp1() +} + +func (c *current) onSuffixedExpr2(expr, op interface{}) (interface{}, error) { + pos := c.astPos() + opStr := op.(string) + switch opStr { + case "?": + zero := ast.NewZeroOrOneExpr(pos) + zero.Expr = expr.(ast.Expression) + return zero, nil + case "*": + zero := ast.NewZeroOrMoreExpr(pos) + zero.Expr = expr.(ast.Expression) + return zero, nil + case "+": + one := ast.NewOneOrMoreExpr(pos) + one.Expr = expr.(ast.Expression) + return one, nil + default: + return nil, errors.New("unknown operator: " + opStr) + } +} + +func (p *parser) callonSuffixedExpr2() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onSuffixedExpr2(stack["expr"], stack["op"]) +} + +func (c *current) onSuffixedOp1() (interface{}, error) { + return string(c.text), nil +} + +func (p *parser) callonSuffixedOp1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onSuffixedOp1() +} + +func (c *current) onPrimaryExpr7(expr interface{}) (interface{}, error) { + return expr, nil +} + +func (p *parser) callonPrimaryExpr7() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onPrimaryExpr7(stack["expr"]) +} + +func (c *current) onRuleRefExpr1(name interface{}) (interface{}, error) { + ref := ast.NewRuleRefExpr(c.astPos()) + ref.Name = name.(*ast.Identifier) + return ref, nil +} + +func (p *parser) callonRuleRefExpr1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onRuleRefExpr1(stack["name"]) +} + +func (c *current) onSemanticPredExpr1(op, code interface{}) (interface{}, error) { + opStr := op.(string) + if opStr == "&" { + and := ast.NewAndCodeExpr(c.astPos()) + and.Code = code.(*ast.CodeBlock) + return and, nil + } + not := ast.NewNotCodeExpr(c.astPos()) + not.Code = code.(*ast.CodeBlock) + return not, nil +} + +func (p *parser) callonSemanticPredExpr1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onSemanticPredExpr1(stack["op"], stack["code"]) +} + +func (c *current) onSemanticPredOp1() (interface{}, error) { + return string(c.text), nil +} + +func (p *parser) callonSemanticPredOp1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onSemanticPredOp1() +} + +func (c *current) onIdentifierName1() (interface{}, error) { + return ast.NewIdentifier(c.astPos(), string(c.text)), nil +} + +func (p *parser) callonIdentifierName1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onIdentifierName1() +} + +func (c *current) onLitMatcher1(lit, ignore interface{}) (interface{}, error) { + rawStr := lit.(*ast.StringLit).Val + s, err := strconv.Unquote(rawStr) + if err != nil { + return nil, err + } + m := ast.NewLitMatcher(c.astPos(), s) + m.IgnoreCase = ignore != nil + return m, nil +} + +func (p *parser) callonLitMatcher1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onLitMatcher1(stack["lit"], stack["ignore"]) +} + +func (c *current) onStringLiteral1() (interface{}, error) { + return ast.NewStringLit(c.astPos(), string(c.text)), nil +} + +func (p *parser) callonStringLiteral1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onStringLiteral1() +} + +func (c *current) onCharClassMatcher1() (interface{}, error) { + pos := c.astPos() + cc := ast.NewCharClassMatcher(pos, string(c.text)) + return cc, nil +} + +func (p *parser) callonCharClassMatcher1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onCharClassMatcher1() +} + +func (c *current) onAnyMatcher1() (interface{}, error) { + any := ast.NewAnyMatcher(c.astPos(), ".") + return any, nil +} + +func (p *parser) callonAnyMatcher1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onAnyMatcher1() +} + +func (c *current) onCodeBlock1() (interface{}, error) { + pos := c.astPos() + cb := ast.NewCodeBlock(pos, string(c.text)) + return cb, nil +} + +func (p *parser) callonCodeBlock1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onCodeBlock1() +} + +var ( + // errNoRule is returned when the grammar to parse has no rule. + errNoRule = errors.New("grammar has no rule") + + // errInvalidEncoding is returned when the source is not properly + // utf8-encoded. + errInvalidEncoding = errors.New("invalid encoding") + + // errNoMatch is returned if no match could be found. + errNoMatch = errors.New("no match found") +) + +// Option is a function that can set an option on the parser. It returns +// the previous setting as an Option. +type Option func(*parser) Option + +// Debug creates an Option to set the debug flag to b. When set to true, +// debugging information is printed to stdout while parsing. +// +// The default is false. +func Debug(b bool) Option { + return func(p *parser) Option { + old := p.debug + p.debug = b + return Debug(old) + } +} + +// Memoize creates an Option to set the memoize flag to b. When set to true, +// the parser will cache all results so each expression is evaluated only +// once. This guarantees linear parsing time even for pathological cases, +// at the expense of more memory and slower times for typical cases. +// +// The default is false. +func Memoize(b bool) Option { + return func(p *parser) Option { + old := p.memoize + p.memoize = b + return Memoize(old) + } +} + +// Recover creates an Option to set the recover flag to b. When set to +// true, this causes the parser to recover from panics and convert it +// to an error. Setting it to false can be useful while debugging to +// access the full stack trace. +// +// The default is true. +func Recover(b bool) Option { + return func(p *parser) Option { + old := p.recover + p.recover = b + return Recover(old) + } +} + +// ParseFile parses the file identified by filename. +func ParseFile(filename string, opts ...Option) (interface{}, error) { + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + return ParseReader(filename, f, opts...) +} + +// ParseReader parses the data from r using filename as information in the +// error messages. +func ParseReader(filename string, r io.Reader, opts ...Option) (interface{}, error) { + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + + return Parse(filename, b, opts...) +} + +// Parse parses the data from b using filename as information in the +// error messages. +func Parse(filename string, b []byte, opts ...Option) (interface{}, error) { + return newParser(filename, b, opts...).parse(g) +} + +// position records a position in the text. +type position struct { + line, col, offset int +} + +func (p position) String() string { + return fmt.Sprintf("%d:%d [%d]", p.line, p.col, p.offset) +} + +// savepoint stores all state required to go back to this point in the +// parser. +type savepoint struct { + position + rn rune + w int +} + +type current struct { + pos position // start position of the match + text []byte // raw text of the match +} + +// the AST types... + +type grammar struct { + pos position + rules []*rule +} + +type rule struct { + pos position + name string + displayName string + expr interface{} +} + +type choiceExpr struct { + pos position + alternatives []interface{} +} + +type actionExpr struct { + pos position + expr interface{} + run func(*parser) (interface{}, error) +} + +type seqExpr struct { + pos position + exprs []interface{} +} + +type labeledExpr struct { + pos position + label string + expr interface{} +} + +type expr struct { + pos position + expr interface{} +} + +type andExpr expr +type notExpr expr +type zeroOrOneExpr expr +type zeroOrMoreExpr expr +type oneOrMoreExpr expr + +type ruleRefExpr struct { + pos position + name string +} + +type andCodeExpr struct { + pos position + run func(*parser) (bool, error) +} + +type notCodeExpr struct { + pos position + run func(*parser) (bool, error) +} + +type litMatcher struct { + pos position + val string + ignoreCase bool +} + +type charClassMatcher struct { + pos position + val string + chars []rune + ranges []rune + classes []*unicode.RangeTable + ignoreCase bool + inverted bool +} + +type anyMatcher position + +// errList cumulates the errors found by the parser. +type errList []error + +func (e *errList) add(err error) { + *e = append(*e, err) +} + +func (e errList) err() error { + if len(e) == 0 { + return nil + } + e.dedupe() + return e +} + +func (e *errList) dedupe() { + var cleaned []error + set := make(map[string]bool) + for _, err := range *e { + if msg := err.Error(); !set[msg] { + set[msg] = true + cleaned = append(cleaned, err) + } + } + *e = cleaned +} + +func (e errList) Error() string { + switch len(e) { + case 0: + return "" + case 1: + return e[0].Error() + default: + var buf bytes.Buffer + + for i, err := range e { + if i > 0 { + buf.WriteRune('\n') + } + buf.WriteString(err.Error()) + } + return buf.String() + } +} + +// parserError wraps an error with a prefix indicating the rule in which +// the error occurred. The original error is stored in the Inner field. +type parserError struct { + Inner error + pos position + prefix string +} + +// Error returns the error message. +func (p *parserError) Error() string { + return p.prefix + ": " + p.Inner.Error() +} + +// newParser creates a parser with the specified input source and options. +func newParser(filename string, b []byte, opts ...Option) *parser { + p := &parser{ + filename: filename, + errs: new(errList), + data: b, + pt: savepoint{position: position{line: 1}}, + recover: true, + } + p.setOptions(opts) + return p +} + +// setOptions applies the options to the parser. +func (p *parser) setOptions(opts []Option) { + for _, opt := range opts { + opt(p) + } +} + +type resultTuple struct { + v interface{} + b bool + end savepoint +} + +type parser struct { + filename string + pt savepoint + cur current + + data []byte + errs *errList + + recover bool + debug bool + depth int + + memoize bool + // memoization table for the packrat algorithm: + // map[offset in source] map[expression or rule] {value, match} + memo map[int]map[interface{}]resultTuple + + // rules table, maps the rule identifier to the rule node + rules map[string]*rule + // variables stack, map of label to value + vstack []map[string]interface{} + // rule stack, allows identification of the current rule in errors + rstack []*rule + + // stats + exprCnt int +} + +// push a variable set on the vstack. +func (p *parser) pushV() { + if cap(p.vstack) == len(p.vstack) { + // create new empty slot in the stack + p.vstack = append(p.vstack, nil) + } else { + // slice to 1 more + p.vstack = p.vstack[:len(p.vstack)+1] + } + + // get the last args set + m := p.vstack[len(p.vstack)-1] + if m != nil && len(m) == 0 { + // empty map, all good + return + } + + m = make(map[string]interface{}) + p.vstack[len(p.vstack)-1] = m +} + +// pop a variable set from the vstack. +func (p *parser) popV() { + // if the map is not empty, clear it + m := p.vstack[len(p.vstack)-1] + if len(m) > 0 { + // GC that map + p.vstack[len(p.vstack)-1] = nil + } + p.vstack = p.vstack[:len(p.vstack)-1] +} + +func (p *parser) print(prefix, s string) string { + if !p.debug { + return s + } + + fmt.Printf("%s %d:%d:%d: %s [%#U]\n", + prefix, p.pt.line, p.pt.col, p.pt.offset, s, p.pt.rn) + return s +} + +func (p *parser) in(s string) string { + p.depth++ + return p.print(strings.Repeat(" ", p.depth)+">", s) +} + +func (p *parser) out(s string) string { + p.depth-- + return p.print(strings.Repeat(" ", p.depth)+"<", s) +} + +func (p *parser) addErr(err error) { + p.addErrAt(err, p.pt.position) +} + +func (p *parser) addErrAt(err error, pos position) { + var buf bytes.Buffer + if p.filename != "" { + buf.WriteString(p.filename) + } + if buf.Len() > 0 { + buf.WriteString(":") + } + buf.WriteString(fmt.Sprintf("%d:%d (%d)", pos.line, pos.col, pos.offset)) + if len(p.rstack) > 0 { + if buf.Len() > 0 { + buf.WriteString(": ") + } + rule := p.rstack[len(p.rstack)-1] + if rule.displayName != "" { + buf.WriteString("rule " + rule.displayName) + } else { + buf.WriteString("rule " + rule.name) + } + } + pe := &parserError{Inner: err, prefix: buf.String()} + p.errs.add(pe) +} + +// read advances the parser to the next rune. +func (p *parser) read() { + p.pt.offset += p.pt.w + rn, n := utf8.DecodeRune(p.data[p.pt.offset:]) + p.pt.rn = rn + p.pt.w = n + p.pt.col++ + if rn == '\n' { + p.pt.line++ + p.pt.col = 0 + } + + if rn == utf8.RuneError { + if n > 0 { + p.addErr(errInvalidEncoding) + } + } +} + +// restore parser position to the savepoint pt. +func (p *parser) restore(pt savepoint) { + if p.debug { + defer p.out(p.in("restore")) + } + if pt.offset == p.pt.offset { + return + } + p.pt = pt +} + +// get the slice of bytes from the savepoint start to the current position. +func (p *parser) sliceFrom(start savepoint) []byte { + return p.data[start.position.offset:p.pt.position.offset] +} + +func (p *parser) getMemoized(node interface{}) (resultTuple, bool) { + if len(p.memo) == 0 { + return resultTuple{}, false + } + m := p.memo[p.pt.offset] + if len(m) == 0 { + return resultTuple{}, false + } + res, ok := m[node] + return res, ok +} + +func (p *parser) setMemoized(pt savepoint, node interface{}, tuple resultTuple) { + if p.memo == nil { + p.memo = make(map[int]map[interface{}]resultTuple) + } + m := p.memo[pt.offset] + if m == nil { + m = make(map[interface{}]resultTuple) + p.memo[pt.offset] = m + } + m[node] = tuple +} + +func (p *parser) buildRulesTable(g *grammar) { + p.rules = make(map[string]*rule, len(g.rules)) + for _, r := range g.rules { + p.rules[r.name] = r + } +} + +func (p *parser) parse(g *grammar) (val interface{}, err error) { + if len(g.rules) == 0 { + p.addErr(errNoRule) + return nil, p.errs.err() + } + + // TODO : not super critical but this could be generated + p.buildRulesTable(g) + + if p.recover { + // panic can be used in action code to stop parsing immediately + // and return the panic as an error. + defer func() { + if e := recover(); e != nil { + if p.debug { + defer p.out(p.in("panic handler")) + } + val = nil + switch e := e.(type) { + case error: + p.addErr(e) + default: + p.addErr(fmt.Errorf("%v", e)) + } + err = p.errs.err() + } + }() + } + + // start rule is rule [0] + p.read() // advance to first rune + val, ok := p.parseRule(g.rules[0]) + if !ok { + if len(*p.errs) == 0 { + // make sure this doesn't go out silently + p.addErr(errNoMatch) + } + return nil, p.errs.err() + } + return val, p.errs.err() +} + +func (p *parser) parseRule(rule *rule) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseRule " + rule.name)) + } + + if p.memoize { + res, ok := p.getMemoized(rule) + if ok { + p.restore(res.end) + return res.v, res.b + } + } + + start := p.pt + p.rstack = append(p.rstack, rule) + p.pushV() + val, ok := p.parseExpr(rule.expr) + p.popV() + p.rstack = p.rstack[:len(p.rstack)-1] + if ok && p.debug { + p.print(strings.Repeat(" ", p.depth)+"MATCH", string(p.sliceFrom(start))) + } + + if p.memoize { + p.setMemoized(start, rule, resultTuple{val, ok, p.pt}) + } + return val, ok +} + +func (p *parser) parseExpr(expr interface{}) (interface{}, bool) { + var pt savepoint + var ok bool + + if p.memoize { + res, ok := p.getMemoized(expr) + if ok { + p.restore(res.end) + return res.v, res.b + } + pt = p.pt + } + + p.exprCnt++ + var val interface{} + switch expr := expr.(type) { + case *actionExpr: + val, ok = p.parseActionExpr(expr) + case *andCodeExpr: + val, ok = p.parseAndCodeExpr(expr) + case *andExpr: + val, ok = p.parseAndExpr(expr) + case *anyMatcher: + val, ok = p.parseAnyMatcher(expr) + case *charClassMatcher: + val, ok = p.parseCharClassMatcher(expr) + case *choiceExpr: + val, ok = p.parseChoiceExpr(expr) + case *labeledExpr: + val, ok = p.parseLabeledExpr(expr) + case *litMatcher: + val, ok = p.parseLitMatcher(expr) + case *notCodeExpr: + val, ok = p.parseNotCodeExpr(expr) + case *notExpr: + val, ok = p.parseNotExpr(expr) + case *oneOrMoreExpr: + val, ok = p.parseOneOrMoreExpr(expr) + case *ruleRefExpr: + val, ok = p.parseRuleRefExpr(expr) + case *seqExpr: + val, ok = p.parseSeqExpr(expr) + case *zeroOrMoreExpr: + val, ok = p.parseZeroOrMoreExpr(expr) + case *zeroOrOneExpr: + val, ok = p.parseZeroOrOneExpr(expr) + default: + panic(fmt.Sprintf("unknown expression type %T", expr)) + } + if p.memoize { + p.setMemoized(pt, expr, resultTuple{val, ok, p.pt}) + } + return val, ok +} + +func (p *parser) parseActionExpr(act *actionExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseActionExpr")) + } + + start := p.pt + val, ok := p.parseExpr(act.expr) + if ok { + p.cur.pos = start.position + p.cur.text = p.sliceFrom(start) + actVal, err := act.run(p) + if err != nil { + p.addErrAt(err, start.position) + } + val = actVal + } + if ok && p.debug { + p.print(strings.Repeat(" ", p.depth)+"MATCH", string(p.sliceFrom(start))) + } + return val, ok +} + +func (p *parser) parseAndCodeExpr(and *andCodeExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAndCodeExpr")) + } + + ok, err := and.run(p) + if err != nil { + p.addErr(err) + } + return nil, ok +} + +func (p *parser) parseAndExpr(and *andExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAndExpr")) + } + + pt := p.pt + p.pushV() + _, ok := p.parseExpr(and.expr) + p.popV() + p.restore(pt) + return nil, ok +} + +func (p *parser) parseAnyMatcher(any *anyMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAnyMatcher")) + } + + if p.pt.rn != utf8.RuneError { + start := p.pt + p.read() + return p.sliceFrom(start), true + } + return nil, false +} + +func (p *parser) parseCharClassMatcher(chr *charClassMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseCharClassMatcher")) + } + + cur := p.pt.rn + // can't match EOF + if cur == utf8.RuneError { + return nil, false + } + start := p.pt + if chr.ignoreCase { + cur = unicode.ToLower(cur) + } + + // try to match in the list of available chars + for _, rn := range chr.chars { + if rn == cur { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + // try to match in the list of ranges + for i := 0; i < len(chr.ranges); i += 2 { + if cur >= chr.ranges[i] && cur <= chr.ranges[i+1] { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + // try to match in the list of Unicode classes + for _, cl := range chr.classes { + if unicode.Is(cl, cur) { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + if chr.inverted { + p.read() + return p.sliceFrom(start), true + } + return nil, false +} + +func (p *parser) parseChoiceExpr(ch *choiceExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseChoiceExpr")) + } + + for _, alt := range ch.alternatives { + p.pushV() + val, ok := p.parseExpr(alt) + p.popV() + if ok { + return val, ok + } + } + return nil, false +} + +func (p *parser) parseLabeledExpr(lab *labeledExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseLabeledExpr")) + } + + p.pushV() + val, ok := p.parseExpr(lab.expr) + p.popV() + if ok && lab.label != "" { + m := p.vstack[len(p.vstack)-1] + m[lab.label] = val + } + return val, ok +} + +func (p *parser) parseLitMatcher(lit *litMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseLitMatcher")) + } + + start := p.pt + for _, want := range lit.val { + cur := p.pt.rn + if lit.ignoreCase { + cur = unicode.ToLower(cur) + } + if cur != want { + p.restore(start) + return nil, false + } + p.read() + } + return p.sliceFrom(start), true +} + +func (p *parser) parseNotCodeExpr(not *notCodeExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseNotCodeExpr")) + } + + ok, err := not.run(p) + if err != nil { + p.addErr(err) + } + return nil, !ok +} + +func (p *parser) parseNotExpr(not *notExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseNotExpr")) + } + + pt := p.pt + p.pushV() + _, ok := p.parseExpr(not.expr) + p.popV() + p.restore(pt) + return nil, !ok +} + +func (p *parser) parseOneOrMoreExpr(expr *oneOrMoreExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseOneOrMoreExpr")) + } + + var vals []interface{} + + for { + p.pushV() + val, ok := p.parseExpr(expr.expr) + p.popV() + if !ok { + if len(vals) == 0 { + // did not match once, no match + return nil, false + } + return vals, true + } + vals = append(vals, val) + } +} + +func (p *parser) parseRuleRefExpr(ref *ruleRefExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseRuleRefExpr " + ref.name)) + } + + if ref.name == "" { + panic(fmt.Sprintf("%s: invalid rule: missing name", ref.pos)) + } + + rule := p.rules[ref.name] + if rule == nil { + p.addErr(fmt.Errorf("undefined rule: %s", ref.name)) + return nil, false + } + return p.parseRule(rule) +} + +func (p *parser) parseSeqExpr(seq *seqExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseSeqExpr")) + } + + var vals []interface{} + + pt := p.pt + for _, expr := range seq.exprs { + val, ok := p.parseExpr(expr) + if !ok { + p.restore(pt) + return nil, false + } + vals = append(vals, val) + } + return vals, true +} + +func (p *parser) parseZeroOrMoreExpr(expr *zeroOrMoreExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseZeroOrMoreExpr")) + } + + var vals []interface{} + + for { + p.pushV() + val, ok := p.parseExpr(expr.expr) + p.popV() + if !ok { + return vals, true + } + vals = append(vals, val) + } +} + +func (p *parser) parseZeroOrOneExpr(expr *zeroOrOneExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseZeroOrOneExpr")) + } + + p.pushV() + val, _ := p.parseExpr(expr.expr) + p.popV() + // whether it matched or not, consider it a match + return val, true +} + +func rangeTable(class string) *unicode.RangeTable { + if rt, ok := unicode.Categories[class]; ok { + return rt + } + if rt, ok := unicode.Properties[class]; ok { + return rt + } + if rt, ok := unicode.Scripts[class]; ok { + return rt + } + + // cannot happen + panic(fmt.Sprintf("invalid Unicode class: %s", class)) +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/bootstrap/cmd/bootstrap-pigeon/main.go b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/cmd/bootstrap-pigeon/main.go new file mode 100644 index 0000000000..e6260e45ee --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/cmd/bootstrap-pigeon/main.go @@ -0,0 +1,76 @@ +// Command bootstrap-pigeon generates a PEG parser from a PEG grammar +// to bootstrap the pigeon command-line tool, as it is built using +// a simplified bootstrapping grammar that understands just enough of the +// pigeon grammar to parse it and build the tool. +package main + +import ( + "bufio" + "flag" + "fmt" + "os" + + "github.com/PuerkitoBio/pigeon/ast" + "github.com/PuerkitoBio/pigeon/builder" +) + +func main() { + dbgFlag := flag.Bool("debug", false, "set debug mode") + noBuildFlag := flag.Bool("x", false, "do not build, only parse") + outputFlag := flag.String("o", "", "output file, defaults to stdout") + flag.Parse() + + if flag.NArg() > 1 { + fmt.Fprintf(os.Stderr, "USAGE: %s [options] [FILE]\n", os.Args[0]) + os.Exit(1) + } + + nm := "stdin" + inf := os.Stdin + if flag.NArg() == 1 { + f, err := os.Open(flag.Arg(0)) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(2) + } + defer f.Close() + inf = f + nm = flag.Arg(0) + } + in := bufio.NewReader(inf) + + g, err := ParseReader(nm, in, Debug(*dbgFlag)) + if err != nil { + fmt.Fprintln(os.Stderr, "parse error: ", err) + os.Exit(3) + } + + if !*noBuildFlag { + outw := os.Stdout + if *outputFlag != "" { + f, err := os.Create(*outputFlag) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(4) + } + defer f.Close() + outw = f + } + + if err := builder.BuildParser(outw, g.(*ast.Grammar)); err != nil { + fmt.Fprintln(os.Stderr, "build error: ", err) + os.Exit(5) + } + } +} + +func (c *current) astPos() ast.Pos { + return ast.Pos{Line: c.pos.line, Col: c.pos.col, Off: c.pos.offset} +} + +func toIfaceSlice(v interface{}) []interface{} { + if v == nil { + return nil + } + return v.([]interface{}) +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/bootstrap/cmd/pegparse/main.go b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/cmd/pegparse/main.go new file mode 100644 index 0000000000..8a2fce7451 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/cmd/pegparse/main.go @@ -0,0 +1,41 @@ +// Command pegparse is a helper command-line tool to test the bootstrap +// parser. +package main + +import ( + "bufio" + "fmt" + "io" + "log" + "os" + + "github.com/PuerkitoBio/pigeon/bootstrap" +) + +func main() { + if len(os.Args) > 2 { + fmt.Fprintln(os.Stderr, "USAGE: pegparse FILE") + os.Exit(1) + } + + var in io.Reader + + nm := "stdin" + if len(os.Args) == 2 { + f, err := os.Open(os.Args[1]) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(2) + } + defer f.Close() + in = f + nm = os.Args[1] + } else { + in = bufio.NewReader(os.Stdin) + } + + p := bootstrap.NewParser() + if _, err := p.Parse(nm, in); err != nil { + log.Fatal(err) + } +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/bootstrap/cmd/pegscan/main.go b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/cmd/pegscan/main.go new file mode 100644 index 0000000000..6dd2638d77 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/cmd/pegscan/main.go @@ -0,0 +1,45 @@ +// Command pegscan is a helper command-line tool to test the bootstrap +// scanner. +package main + +import ( + "bufio" + "fmt" + "io" + "os" + + "github.com/PuerkitoBio/pigeon/bootstrap" +) + +func main() { + if len(os.Args) > 2 { + fmt.Fprintln(os.Stderr, "USAGE: pegscan FILE") + os.Exit(1) + } + + var in io.Reader + + nm := "stdin" + if len(os.Args) == 2 { + f, err := os.Open(os.Args[1]) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(2) + } + defer f.Close() + in = f + nm = os.Args[1] + } else { + in = bufio.NewReader(os.Stdin) + } + + var s bootstrap.Scanner + s.Init(nm, in, nil) + for { + tok, ok := s.Scan() + fmt.Println(tok) + if !ok { + break + } + } +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/bootstrap/doc.go b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/doc.go new file mode 100644 index 0000000000..d36ddb1175 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/doc.go @@ -0,0 +1,7 @@ +// Package bootstrap implements the scanner and parser to bootstrap the +// PEG parser generator. +// +// It parses the PEG grammar into an ast that is then used to generate +// a parser generator based on this PEG grammar. The generated parser +// can then parse the grammar again, without the bootstrap package. +package bootstrap diff --git a/vendor/github.com/PuerkitoBio/pigeon/bootstrap/parser.go b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/parser.go new file mode 100644 index 0000000000..381809832a --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/parser.go @@ -0,0 +1,438 @@ +package bootstrap + +import ( + "bytes" + "errors" + "fmt" + "io" + "strconv" + "strings" + + "github.com/PuerkitoBio/pigeon/ast" +) + +type errList []error + +func (e *errList) reset() { + *e = (*e)[:0] +} + +func (e *errList) add(p ast.Pos, err error) { + *e = append(*e, fmt.Errorf("%s: %v", p, err)) +} + +func (e *errList) err() error { + if len(*e) == 0 { + return nil + } + return e +} + +func (e *errList) Error() string { + switch len(*e) { + case 0: + return "" + case 1: + return (*e)[0].Error() + default: + var buf bytes.Buffer + + for i, err := range *e { + if i > 0 { + buf.WriteRune('\n') + } + buf.WriteString(err.Error()) + } + return buf.String() + } +} + +// Parser holds the state to parse the PEG grammar into +// an abstract syntax tree (AST). +type Parser struct { + s Scanner + tok Token + + errs *errList + dbg bool + pk Token +} + +func (p *Parser) in(s string) string { + if p.dbg { + fmt.Println("IN "+s, p.tok.id, p.tok.lit) + } + return s +} + +func (p *Parser) out(s string) { + if p.dbg { + fmt.Println("OUT "+s, p.tok.id, p.tok.lit) + } +} + +// NewParser creates a new Parser. +func NewParser() *Parser { + return &Parser{errs: new(errList)} +} + +// Parse parses the data from the reader r and generates the AST +// or returns an error if it fails. The filename is used as information +// in the error messages. +func (p *Parser) Parse(filename string, r io.Reader) (*ast.Grammar, error) { + p.errs.reset() + p.s.Init(filename, r, p.errs.add) + + g := p.grammar() + return g, p.errs.err() +} + +func (p *Parser) read() { + if p.pk.pos.Line != 0 { + p.tok = p.pk + p.pk = Token{} + return + } + tok, _ := p.s.Scan() + p.tok = tok +} + +func (p *Parser) peek() Token { + if p.pk.pos.Line == 0 { + p.pk, _ = p.s.Scan() + } + return p.pk +} + +func (p *Parser) skip(ids ...tid) { +outer: + for { + for _, id := range ids { + if p.tok.id == id { + p.read() + continue outer + } + } + return + } +} + +func (p *Parser) grammar() *ast.Grammar { + defer p.out(p.in("grammar")) + + // advance to the first token + p.read() + g := ast.NewGrammar(p.tok.pos) + + p.skip(eol, semicolon) + if p.tok.id == code { + g.Init = ast.NewCodeBlock(p.tok.pos, p.tok.lit) + p.read() + p.skip(eol, semicolon) + } + + for { + if p.tok.id == eof { + return g + } + r := p.rule() + if r != nil { + g.Rules = append(g.Rules, r) + } + p.read() + p.skip(eol, semicolon) + } +} + +func (p *Parser) expect(ids ...tid) bool { + if len(ids) == 0 { + return true + } + + for _, id := range ids { + if p.tok.id == id { + return true + } + } + if len(ids) == 1 { + p.errs.add(p.tok.pos, fmt.Errorf("expected %s, got %s", ids[0], p.tok.id)) + } else { + p.errs.add(p.tok.pos, fmt.Errorf("expected any of %v, got %s", ids, p.tok.id)) + } + return false +} + +func (p *Parser) rule() *ast.Rule { + defer p.out(p.in("rule")) + + if !p.expect(ident) { + return nil + } + r := ast.NewRule(p.tok.pos, ast.NewIdentifier(p.tok.pos, p.tok.lit)) + p.read() + + if p.tok.id == str || p.tok.id == rstr || p.tok.id == char { + if strings.HasSuffix(p.tok.lit, "i") { + p.errs.add(p.tok.pos, errors.New("invalid suffix 'i'")) + return nil + } + s, err := strconv.Unquote(p.tok.lit) + if err != nil { + p.errs.add(p.tok.pos, err) + return nil + } + r.DisplayName = ast.NewStringLit(p.tok.pos, s) + p.read() + } + + if !p.expect(ruledef) { + return nil + } + p.read() + p.skip(eol) + + expr := p.expression() + if expr == nil { + p.errs.add(p.tok.pos, errors.New("missing expression")) + return nil + } + r.Expr = expr + + if !p.expect(eol, eof, semicolon) { + p.errs.add(p.tok.pos, errors.New("rule not terminated")) + return nil + } + return r +} + +func (p *Parser) expression() ast.Expression { + defer p.out(p.in("expression")) + + choice := ast.NewChoiceExpr(p.tok.pos) + for { + expr := p.actionExpr() + if expr != nil { + choice.Alternatives = append(choice.Alternatives, expr) + } + if p.tok.id != slash { + switch len(choice.Alternatives) { + case 0: + p.errs.add(p.tok.pos, errors.New("no expression in choice")) + return nil + case 1: + return choice.Alternatives[0] + default: + return choice + } + } + // move after the slash + p.read() + } +} + +func (p *Parser) actionExpr() ast.Expression { + defer p.out(p.in("actionExpr")) + + act := ast.NewActionExpr(p.tok.pos) + expr := p.seqExpr() + if expr == nil { + return nil + } + act.Expr = expr + + if p.tok.id == code { + act.Code = ast.NewCodeBlock(p.tok.pos, p.tok.lit) + p.read() + } + + if act.Code == nil { + return expr + } + return act +} + +func (p *Parser) seqExpr() ast.Expression { + defer p.out(p.in("seqExpr")) + + seq := ast.NewSeqExpr(p.tok.pos) + for { + expr := p.labeledExpr() + if expr == nil { + switch len(seq.Exprs) { + case 0: + p.errs.add(p.tok.pos, errors.New("no expression in sequence")) + return nil + case 1: + return seq.Exprs[0] + default: + return seq + } + } + seq.Exprs = append(seq.Exprs, expr) + } +} + +func (p *Parser) labeledExpr() ast.Expression { + defer p.out(p.in("labeledExpr")) + + lab := ast.NewLabeledExpr(p.tok.pos) + if p.tok.id == ident { + peek := p.peek() + if peek.id == colon { + label := ast.NewIdentifier(p.tok.pos, p.tok.lit) + lab.Label = label + p.read() + if !p.expect(colon) { + return nil + } + p.read() + } + } + + expr := p.prefixedExpr() + if expr == nil { + if lab.Label != nil { + p.errs.add(p.tok.pos, errors.New("label without expression")) + } + return nil + } + + if lab.Label != nil { + lab.Expr = expr + return lab + } + return expr +} + +func (p *Parser) prefixedExpr() ast.Expression { + defer p.out(p.in("prefixedExpr")) + + var pref ast.Expression + switch p.tok.id { + case ampersand: + pref = ast.NewAndExpr(p.tok.pos) + p.read() + case exclamation: + pref = ast.NewNotExpr(p.tok.pos) + p.read() + } + + expr := p.suffixedExpr() + if expr == nil { + if pref != nil { + p.errs.add(p.tok.pos, errors.New("prefix operator without expression")) + } + return nil + } + switch p := pref.(type) { + case *ast.AndExpr: + p.Expr = expr + return p + case *ast.NotExpr: + p.Expr = expr + return p + default: + return expr + } +} + +func (p *Parser) suffixedExpr() ast.Expression { + defer p.out(p.in("suffixedExpr")) + + expr := p.primaryExpr() + if expr == nil { + if p.tok.id == question || p.tok.id == star || p.tok.id == plus { + p.errs.add(p.tok.pos, errors.New("suffix operator without expression")) + } + return nil + } + + switch p.tok.id { + case question: + q := ast.NewZeroOrOneExpr(expr.Pos()) + q.Expr = expr + p.read() + return q + case star: + s := ast.NewZeroOrMoreExpr(expr.Pos()) + s.Expr = expr + p.read() + return s + case plus: + l := ast.NewOneOrMoreExpr(expr.Pos()) + l.Expr = expr + p.read() + return l + default: + return expr + } +} + +func (p *Parser) primaryExpr() ast.Expression { + defer p.out(p.in("primaryExpr")) + + switch p.tok.id { + case str, rstr, char: + // literal matcher + ignore := strings.HasSuffix(p.tok.lit, "i") + if ignore { + p.tok.lit = p.tok.lit[:len(p.tok.lit)-1] + } + s, err := strconv.Unquote(p.tok.lit) + if err != nil { + p.errs.add(p.tok.pos, err) + } + lit := ast.NewLitMatcher(p.tok.pos, s) + lit.IgnoreCase = ignore + p.read() + return lit + + case class: + // character class matcher + cl := ast.NewCharClassMatcher(p.tok.pos, p.tok.lit) + p.read() + return cl + + case dot: + // any matcher + any := ast.NewAnyMatcher(p.tok.pos, p.tok.lit) + p.read() + return any + + case ident: + // rule reference expression + return p.ruleRefExpr() + + case lparen: + // expression in parenthesis + p.read() + expr := p.expression() + if expr == nil { + p.errs.add(p.tok.pos, errors.New("missing expression inside parenthesis")) + return nil + } + if !p.expect(rparen) { + return nil + } + p.read() + return expr + + default: + // if p.tok.id != eof && p.tok.id != eol && p.tok.id != semicolon { + // p.errs.add(p.tok.pos, fmt.Errorf("invalid token %s (%q) for primary expression", p.tok.id, p.tok.lit)) + // } + return nil + } +} + +func (p *Parser) ruleRefExpr() ast.Expression { + defer p.out(p.in("ruleRefExpr")) + + if !p.expect(ident) { + return nil + } + expr := ast.NewRuleRefExpr(p.tok.pos) + expr.Name = ast.NewIdentifier(p.tok.pos, p.tok.lit) + p.read() + return expr +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/bootstrap/parser_test.go b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/parser_test.go new file mode 100644 index 0000000000..07b94db85e --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/parser_test.go @@ -0,0 +1,97 @@ +package bootstrap + +import ( + "strings" + "testing" +) + +var parseValidCases = []string{ + "", + "\n", + "\n{code}", + "\nR <- 'c'", + "\n\nR <- 'c'\n\n", + ` +A = ident:B / C+ / D?;`, + `{ code } + +R "name" <- "abc"i +R2 = 'd'i +R3 = ( R2+ ![;] )`, +} + +var parseExpRes = []string{ + `1:0 (0): *ast.Grammar{Init: , Rules: [ +]}`, + `2:0 (0): *ast.Grammar{Init: , Rules: [ +]}`, + `2:0 (0): *ast.Grammar{Init: 2:1 (1): *ast.CodeBlock{Val: "{code}"}, Rules: [ +]}`, + `2:0 (0): *ast.Grammar{Init: , Rules: [ +2:1 (1): *ast.Rule{Name: 2:1 (1): *ast.Identifier{Val: "R"}, DisplayName: , Expr: 2:6 (6): *ast.LitMatcher{Val: "c", IgnoreCase: false}}, +]}`, + `2:0 (0): *ast.Grammar{Init: , Rules: [ +3:1 (2): *ast.Rule{Name: 3:1 (2): *ast.Identifier{Val: "R"}, DisplayName: , Expr: 3:6 (7): *ast.LitMatcher{Val: "c", IgnoreCase: false}}, +]}`, + `2:0 (0): *ast.Grammar{Init: , Rules: [ +2:1 (1): *ast.Rule{Name: 2:1 (1): *ast.Identifier{Val: "A"}, DisplayName: , Expr: 2:5 (5): *ast.ChoiceExpr{Alternatives: [ +2:5 (5): *ast.LabeledExpr{Label: 2:5 (5): *ast.Identifier{Val: "ident"}, Expr: 2:11 (11): *ast.RuleRefExpr{Name: 2:11 (11): *ast.Identifier{Val: "B"}}}, +2:15 (15): *ast.OneOrMoreExpr{Expr: 2:15 (15): *ast.RuleRefExpr{Name: 2:15 (15): *ast.Identifier{Val: "C"}}}, +2:20 (20): *ast.ZeroOrOneExpr{Expr: 2:20 (20): *ast.RuleRefExpr{Name: 2:20 (20): *ast.Identifier{Val: "D"}}}, +]}}, +]}`, + `1:1 (0): *ast.Grammar{Init: 1:1 (0): *ast.CodeBlock{Val: "{ code }"}, Rules: [ +3:1 (10): *ast.Rule{Name: 3:1 (10): *ast.Identifier{Val: "R"}, DisplayName: 3:3 (12): *ast.StringLit{Val: "name"}, Expr: 3:13 (22): *ast.LitMatcher{Val: "abc", IgnoreCase: true}}, +4:1 (29): *ast.Rule{Name: 4:1 (29): *ast.Identifier{Val: "R2"}, DisplayName: , Expr: 4:6 (34): *ast.LitMatcher{Val: "d", IgnoreCase: true}}, +5:1 (39): *ast.Rule{Name: 5:1 (39): *ast.Identifier{Val: "R3"}, DisplayName: , Expr: 5:8 (46): *ast.SeqExpr{Exprs: [ +5:8 (46): *ast.OneOrMoreExpr{Expr: 5:8 (46): *ast.RuleRefExpr{Name: 5:8 (46): *ast.Identifier{Val: "R2"}}}, +5:12 (50): *ast.NotExpr{Expr: 5:13 (51): *ast.CharClassMatcher{Val: "[;]", IgnoreCase: false, Inverted: false}}, +]}}, +]}`, +} + +func TestParseValid(t *testing.T) { + p := NewParser() + for i, c := range parseValidCases { + g, err := p.Parse("", strings.NewReader(c)) + if err != nil { + t.Errorf("%d: got error %v", i, err) + continue + } + + want := parseExpRes[i] + got := g.String() + if want != got { + t.Errorf("%d: want \n%s\n, got \n%s\n", i, want, got) + } + } +} + +var parseInvalidCases = []string{ + "a", + `R = )`, +} + +var parseExpErrs = [][]string{ + {"1:1 (0): expected ruledef, got eof"}, + {"1:5 (4): no expression in sequence", "1:5 (4): no expression in choice", "1:5 (4): missing expression"}, +} + +func TestParseInvalid(t *testing.T) { + p := NewParser() + for i, c := range parseInvalidCases { + _, err := p.Parse("", strings.NewReader(c)) + el := *(err.(*errList)) + if len(el) != len(parseExpErrs[i]) { + t.Errorf("%d: want %d errors, got %d", i, len(parseExpErrs[i]), len(el)) + continue + } + for j, err := range el { + want := parseExpErrs[i][j] + got := err.Error() + if want != got { + t.Errorf("%d: error %d: want %q, got %q", i, j, want, got) + } + } + } +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/bootstrap/peg.ebnf b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/peg.ebnf new file mode 100644 index 0000000000..1d9386d728 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/peg.ebnf @@ -0,0 +1,25 @@ +// PEG grammar in EBNF form, to help implement the bootstrapping +// parser. Terminals are tokens as defined in token.go and +// returned by the Scanner implemented in scan.go. + +Grammar = [ code ] [ RuleList ] . +RuleList = Rule { Rule } . +Rule = ident [ str | rstr | char ] ruledef Expression ( eol | eof | semicolon ) . + +Expression = ChoiceExpr . +ChoiceExpr = ActionExpr { "/" ActionExpr } . +ActionExpr = SeqExpr [ code ] . +SeqExpr = LabeledExpr { LabeledExpr } . +LabeledExpr = [ ident colon ] PrefixedExpr . +PrefixedExpr = [ PrefixedOp ] SuffixedExpr . +PrefixedOp = ampersand | exclamation . +SuffixedExpr = PrimaryExpr [ SuffixedOp ] . +SuffixedOp = question | star | plus . +PrimaryExpr = LiteralMatcher | CharClassMatcher | AnyMatcher | RuleRefExpr | + lparen Expression rparen . + +RuleRefExpr = ident . + +LiteralMatcher = [ str | rstr | char ] . +CharClassMatcher = class . +AnyMatcher = dot . diff --git a/vendor/github.com/PuerkitoBio/pigeon/bootstrap/scan.go b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/scan.go new file mode 100644 index 0000000000..3f071bd23a --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/scan.go @@ -0,0 +1,559 @@ +package bootstrap + +import ( + "bufio" + "bytes" + "fmt" + "io" + "os" + "unicode" + + "github.com/PuerkitoBio/pigeon/ast" +) + +// Scanner tokenizes an input source for the PEG grammar. +type Scanner struct { + r io.RuneReader + errh func(ast.Pos, error) + + eof bool + cpos ast.Pos + cur rune + cw int + + tok bytes.Buffer +} + +// Init initializes the scanner to read and tokenize text from r. +func (s *Scanner) Init(filename string, r io.Reader, errh func(ast.Pos, error)) { + s.r = runeReader(r) + s.errh = errh + + s.eof = false + s.cpos = ast.Pos{ + Filename: filename, + Line: 1, + } + + s.cur, s.cw = -1, 0 + s.tok.Reset() +} + +// Scan returns the next token, along with a boolean indicating if EOF was +// reached (false means no more tokens). +func (s *Scanner) Scan() (Token, bool) { + var tok Token + + if !s.eof && s.cur == -1 { + // move to first rune + s.read() + } + + s.skipWhitespace() + tok.pos = s.cpos + + // the first switch cases all position the scanner on the next rune + // by their calls to scan* + switch { + case s.eof: + tok.id = eof + case isLetter(s.cur): + tok.id = ident + tok.lit = s.scanIdentifier() + if _, ok := blacklistedIdents[tok.lit]; ok { + s.errorpf(tok.pos, "illegal identifier %q", tok.lit) + } + case isRuleDefStart(s.cur): + tok.id = ruledef + tok.lit = s.scanRuleDef() + case s.cur == '\'': + tok.id = char + tok.lit = s.scanChar() + case s.cur == '"': + tok.id = str + tok.lit = s.scanString() + case s.cur == '`': + tok.id = rstr + tok.lit = s.scanRawString() + case s.cur == '[': + tok.id = class + tok.lit = s.scanClass() + case s.cur == '{': + tok.id = code + tok.lit = s.scanCode() + + default: + r := s.cur + s.read() + switch r { + case '/': + if s.cur == '*' || s.cur == '/' { + tok.id, tok.lit = s.scanComment() + break + } + fallthrough + case ':', ';', '(', ')', '.', '&', '!', '?', '+', '*', '\n': + tok.id = tid(r) + tok.lit = string(r) + default: + s.errorf("invalid character %#U", r) + tok.id = invalid + tok.lit = string(r) + } + } + + return tok, tok.id != eof +} + +func (s *Scanner) scanIdentifier() string { + s.tok.Reset() + for isLetter(s.cur) || isDigit(s.cur) { + s.tok.WriteRune(s.cur) + s.read() + } + return s.tok.String() +} + +func (s *Scanner) scanComment() (tid, string) { + s.tok.Reset() + s.tok.WriteRune('/') // initial '/' already consumed + + var multiline bool + switch s.cur { + case '*': + multiline = true + case '\n', -1: + s.errorf("comment not terminated") + return lcomment, s.tok.String() + } + + var closing bool + for { + s.tok.WriteRune(s.cur) + s.read() + switch s.cur { + case '\n': + if !multiline { + return lcomment, s.tok.String() + } + case -1: + if multiline { + s.errorf("comment not terminated") + return mlcomment, s.tok.String() + } + return lcomment, s.tok.String() + case '*': + if multiline { + closing = true + } + case '/': + if closing { + s.tok.WriteRune(s.cur) + s.read() + return mlcomment, s.tok.String() + } + } + } +} + +func (s *Scanner) scanCode() string { + s.tok.Reset() + s.tok.WriteRune(s.cur) + depth := 1 + for { + s.read() + s.tok.WriteRune(s.cur) + switch s.cur { + case -1: + s.errorf("code block not terminated") + return s.tok.String() + case '{': + depth++ + case '}': + depth-- + if depth == 0 { + s.read() + return s.tok.String() + } + } + } +} + +func (s *Scanner) scanEscape(quote rune) bool { + // scanEscape is always called as part of a greater token, so do not + // reset s.tok, and write s.cur before calling s.read. + s.tok.WriteRune(s.cur) + + var n int + var base, max uint32 + var unicodeClass bool + + s.read() + switch s.cur { + case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', quote: + s.tok.WriteRune(s.cur) + return true + case '0', '1', '2', '3', '4', '5', '6', '7': + n, base, max = 3, 8, 255 + case 'x': + s.tok.WriteRune(s.cur) + s.read() + n, base, max = 2, 16, 255 + case 'u': + s.tok.WriteRune(s.cur) + s.read() + n, base, max = 4, 16, unicode.MaxRune + case 'U': + s.tok.WriteRune(s.cur) + s.read() + n, base, max = 8, 16, unicode.MaxRune + case 'p': + // unicode character class, only valid if quote is ']' + if quote == ']' { + s.tok.WriteRune(s.cur) + unicodeClass = true + s.read() + break + } + fallthrough + default: + s.tok.WriteRune(s.cur) + msg := "unknown escape sequence" + if s.cur == -1 || s.cur == '\n' { + msg = "escape sequence not terminated" + s.errorf(msg) + } else { + s.errorf(msg) + s.read() + } + return false + } + + if unicodeClass { + switch s.cur { + case '\n', -1: + s.errorf("escape sequence not terminated") + return false + case '{': + // unicode class name, read until '}' + cnt := 0 + for { + s.tok.WriteRune(s.cur) + s.read() + cnt++ + switch s.cur { + case '\n', -1: + s.errorf("escape sequence not terminated") + return false + case '}': + if cnt < 2 { + s.errorf("empty Unicode character class escape sequence") + } + s.tok.WriteRune(s.cur) + return true + } + } + default: + // single letter class + s.tok.WriteRune(s.cur) + return true + } + } + + var x uint32 + for n > 0 { + s.tok.WriteRune(s.cur) + d := uint32(digitVal(s.cur)) + if d >= base { + msg := fmt.Sprintf("illegal character %#U in escape sequence", s.cur) + if s.cur == -1 || s.cur == '\n' { + msg = "escape sequence not terminated" + s.errorf(msg) + return false + } + s.errorf(msg) + s.read() + return false + } + x = x*base + d + n-- + + if n > 0 { + s.read() + } + } + + if x > max || 0xd800 <= x && x <= 0xe000 { + s.errorf("escape sequence is invalid Unicode code point") + s.read() + return false + } + return true +} + +func (s *Scanner) scanClass() string { + s.tok.Reset() + s.tok.WriteRune(s.cur) // opening '[' + + var noread bool + for { + if !noread { + s.read() + } + noread = false + switch s.cur { + case '\\': + noread = !s.scanEscape(']') + case '\n', -1: + // \n not consumed + s.errorf("character class not terminated") + return s.tok.String() + case ']': + s.tok.WriteRune(s.cur) + s.read() + // can have an optional "i" ignore case suffix + if s.cur == 'i' { + s.tok.WriteRune(s.cur) + s.read() + } + return s.tok.String() + default: + s.tok.WriteRune(s.cur) + } + } +} + +func (s *Scanner) scanRawString() string { + s.tok.Reset() + s.tok.WriteRune(s.cur) // opening '`' + + var hasCR bool +loop: + for { + s.read() + switch s.cur { + case -1: + s.errorf("raw string literal not terminated") + break loop + case '`': + s.tok.WriteRune(s.cur) + s.read() + // can have an optional "i" ignore case suffix + if s.cur == 'i' { + s.tok.WriteRune(s.cur) + s.read() + } + break loop + case '\r': + hasCR = true + fallthrough + default: + s.tok.WriteRune(s.cur) + } + } + + b := s.tok.Bytes() + if hasCR { + b = stripCR(b) + } + return string(b) +} + +func stripCR(b []byte) []byte { + c := make([]byte, len(b)) + i := 0 + for _, ch := range b { + if ch != '\r' { + c[i] = ch + i++ + } + } + return c[:i] +} + +func (s *Scanner) scanString() string { + s.tok.Reset() + s.tok.WriteRune(s.cur) // opening '"' + + var noread bool + for { + if !noread { + s.read() + } + noread = false + switch s.cur { + case '\\': + noread = !s.scanEscape('"') + case '\n', -1: + // \n not consumed + s.errorf("string literal not terminated") + return s.tok.String() + case '"': + s.tok.WriteRune(s.cur) + s.read() + // can have an optional "i" ignore case suffix + if s.cur == 'i' { + s.tok.WriteRune(s.cur) + s.read() + } + return s.tok.String() + default: + s.tok.WriteRune(s.cur) + } + } +} + +func (s *Scanner) scanChar() string { + s.tok.Reset() + s.tok.WriteRune(s.cur) // opening "'" + + // must be followed by one char (which may be an escape) and a single + // quote, but read until we find that closing quote. + cnt := 0 + var noread bool + for { + if !noread { + s.read() + } + noread = false + switch s.cur { + case '\\': + cnt++ + noread = !s.scanEscape('\'') + case '\n', -1: + // \n not consumed + s.errorf("rune literal not terminated") + return s.tok.String() + case '\'': + s.tok.WriteRune(s.cur) + s.read() + if cnt != 1 { + s.errorf("rune literal is not a single rune") + } + // can have an optional "i" ignore case suffix + if s.cur == 'i' { + s.tok.WriteRune(s.cur) + s.read() + } + return s.tok.String() + default: + cnt++ + s.tok.WriteRune(s.cur) + } + } +} + +func (s *Scanner) scanRuleDef() string { + s.tok.Reset() + s.tok.WriteRune(s.cur) + r := s.cur + s.read() + if r == '<' { + if s.cur != -1 { + s.tok.WriteRune(s.cur) + } + if s.cur != '-' { + s.errorf("rule definition not terminated") + } + s.read() + } + + return s.tok.String() +} + +// read advances the Scanner to the next rune. +func (s *Scanner) read() { + if s.eof { + return + } + + r, w, err := s.r.ReadRune() + if err != nil { + s.fatalError(err) + return + } + + s.cur = r + s.cpos.Off += s.cw + s.cw = w + + // newline is '\n' as in Go + if r == '\n' { + s.cpos.Line++ + s.cpos.Col = 0 + } else { + s.cpos.Col++ + } +} + +// whitespace is the same as Go, except that it doesn't skip newlines, +// those are returned as tokens. +func (s *Scanner) skipWhitespace() { + for s.cur == ' ' || s.cur == '\t' || s.cur == '\r' { + s.read() + } +} + +func isRuleDefStart(r rune) bool { + return r == '=' || r == '<' || r == '\u2190' /* leftwards arrow */ || + r == '\u27f5' /* long leftwards arrow */ +} + +// isLetter has the same definition as Go. +func isLetter(r rune) bool { + return 'a' <= r && r <= 'z' || 'A' <= r && r <= 'Z' || r == '_' || + r >= 0x80 && unicode.IsLetter(r) +} + +// isDigit has the same definition as Go. +func isDigit(r rune) bool { + return '0' <= r && r <= '9' || r >= 0x80 && unicode.IsDigit(r) +} + +func digitVal(r rune) int { + switch { + case '0' <= r && r <= '9': + return int(r - '0') + case 'a' <= r && r <= 'f': + return int(r - 'a' + 10) + case 'A' <= r && r <= 'F': + return int(r - 'A' + 10) + } + return 16 +} + +// notify the handler of an error. +func (s *Scanner) error(p ast.Pos, err error) { + if s.errh != nil { + s.errh(p, err) + return + } + fmt.Fprintf(os.Stderr, "%s: %v\n", p, err) +} + +// helper to generate and notify of an error. +func (s *Scanner) errorf(f string, args ...interface{}) { + s.errorpf(s.cpos, f, args...) +} + +// helper to generate and notify of an error at a specific position. +func (s *Scanner) errorpf(p ast.Pos, f string, args ...interface{}) { + s.error(p, fmt.Errorf(f, args...)) +} + +// notify a non-recoverable error that terminates the scanning. +func (s *Scanner) fatalError(err error) { + s.cur = -1 + s.eof = true + if err != io.EOF { + s.error(s.cpos, err) + } +} + +// convert the reader to a rune reader if required. +func runeReader(r io.Reader) io.RuneReader { + if rr, ok := r.(io.RuneReader); ok { + return rr + } + return bufio.NewReader(r) +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/bootstrap/scan_test.go b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/scan_test.go new file mode 100644 index 0000000000..d5c1af1a74 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/scan_test.go @@ -0,0 +1,358 @@ +package bootstrap + +import ( + "fmt" + "strings" + "testing" + + "github.com/PuerkitoBio/pigeon/ast" +) + +var scanValidCases = []string{ + "", + "a", + "ab", + "abc", + "_", + "_0", + "abc_012", + `=`, + `<-`, + "\u2190", + "\u27f5", + "' '", + "'*'", + "'a'", + "'a'i", + "'a'b", + `'\n'`, + `'\t'`, + `'\''`, + `'\\'`, + `'\xab'`, + `'\x1F'`, + `'\u1234'`, + `'\U000B1234'`, + `""`, + `"a"`, + `"a"i`, + `"a"b`, + `"a\b"`, + `"a\b \n 1"`, + `"\xAbc\u1234d\U000011FF"`, + "``", + "`a`", + "`a`i", + "`a`b", + "`a \\n `", // `a \n ` + "`a \n `", // `a ` + "`a \r\n `", + "[]", + "[[]", + "[[\\]]", + "[a]", + "[a]i", + "[a]b", + "[ab]", + "[a-b0-9]", + "[\\a]", + "[\\a\\pL_]", + "[\\a\\p{Greek}]", + "{}", + "{a}", + "{a}i", + "{\nif something {\n\tdoSomething()\n}\n}", + "// a", + "// a\nb", + "/a", + "/\n", + "/**/", + "/*a*/", + "/*a\nb*/", + ":", + ";", + "(", + ")", + ".", + "&", + "!", + "?", + "+", + "*", + "\n", + "pockage = a", + `Rule <- + E / ( 'a'? "bcd"i )+ / [efg-j]* { println() } // comment + / &'\xff' /* and +some +comment +*/`, +} + +var scanExpTokens = [][]string{ + {"1:0 (0): eof \"\""}, + {"1:1 (0): ident \"a\"", "1:1 (0): eof \"\""}, + {"1:1 (0): ident \"ab\"", "1:2 (1): eof \"\""}, + {"1:1 (0): ident \"abc\"", "1:3 (2): eof \"\""}, + {"1:1 (0): ident \"_\"", "1:1 (0): eof \"\""}, + {"1:1 (0): ident \"_0\"", "1:2 (1): eof \"\""}, + {"1:1 (0): ident \"abc_012\"", "1:7 (6): eof \"\""}, + {"1:1 (0): ruledef \"=\"", "1:1 (0): eof \"\""}, + {"1:1 (0): ruledef \"<-\"", "1:2 (1): eof \"\""}, + {"1:1 (0): ruledef \"\u2190\"", "1:1 (0): eof \"\""}, + {"1:1 (0): ruledef \"\u27f5\"", "1:1 (0): eof \"\""}, + {"1:1 (0): char \"' '\"", "1:3 (2): eof \"\""}, + {"1:1 (0): char \"'*'\"", "1:3 (2): eof \"\""}, + {"1:1 (0): char \"'a'\"", "1:3 (2): eof \"\""}, + {"1:1 (0): char \"'a'i\"", "1:4 (3): eof \"\""}, + {"1:1 (0): char \"'a'\"", "1:4 (3): ident \"b\"", "1:4 (3): eof \"\""}, + {`1:1 (0): char "'\\n'"`, `1:4 (3): eof ""`}, + {`1:1 (0): char "'\\t'"`, `1:4 (3): eof ""`}, + {`1:1 (0): char "'\\''"`, `1:4 (3): eof ""`}, + {`1:1 (0): char "'\\\\'"`, `1:4 (3): eof ""`}, + {`1:1 (0): char "'\\xab'"`, `1:6 (5): eof ""`}, + {`1:1 (0): char "'\\x1F'"`, `1:6 (5): eof ""`}, + {`1:1 (0): char "'\\u1234'"`, `1:8 (7): eof ""`}, + {`1:1 (0): char "'\\U000B1234'"`, `1:12 (11): eof ""`}, + {`1:1 (0): str "\"\""`, `1:2 (1): eof ""`}, + {`1:1 (0): str "\"a\""`, `1:3 (2): eof ""`}, + {`1:1 (0): str "\"a\"i"`, `1:4 (3): eof ""`}, + {`1:1 (0): str "\"a\""`, `1:4 (3): ident "b"`, `1:4 (3): eof ""`}, + {`1:1 (0): str "\"a\\b\""`, `1:5 (4): eof ""`}, + {`1:1 (0): str "\"a\\b \\n 1\""`, `1:10 (9): eof ""`}, + {`1:1 (0): str "\"\\xAbc\\u1234d\\U000011FF\""`, `1:24 (23): eof ""`}, + {"1:1 (0): rstr \"``\"", `1:2 (1): eof ""`}, + {"1:1 (0): rstr \"`a`\"", `1:3 (2): eof ""`}, + {"1:1 (0): rstr \"`a`i\"", `1:4 (3): eof ""`}, + {"1:1 (0): rstr \"`a`\"", "1:4 (3): ident \"b\"", `1:4 (3): eof ""`}, + {"1:1 (0): rstr \"`a \\\\n `\"", `1:7 (6): eof ""`}, + {"1:1 (0): rstr \"`a \\n `\"", `2:2 (5): eof ""`}, + {"1:1 (0): rstr \"`a \\n `\"", `2:2 (6): eof ""`}, + {"1:1 (0): class \"[]\"", `1:2 (1): eof ""`}, + {"1:1 (0): class \"[[]\"", `1:3 (2): eof ""`}, + {"1:1 (0): class \"[[\\\\]]\"", `1:5 (4): eof ""`}, + {"1:1 (0): class \"[a]\"", `1:3 (2): eof ""`}, + {"1:1 (0): class \"[a]i\"", `1:4 (3): eof ""`}, + {"1:1 (0): class \"[a]\"", `1:4 (3): ident "b"`, `1:4 (3): eof ""`}, + {"1:1 (0): class \"[ab]\"", `1:4 (3): eof ""`}, + {"1:1 (0): class \"[a-b0-9]\"", `1:8 (7): eof ""`}, + {"1:1 (0): class \"[\\\\a]\"", `1:4 (3): eof ""`}, + {"1:1 (0): class \"[\\\\a\\\\pL_]\"", `1:8 (7): eof ""`}, + {"1:1 (0): class \"[\\\\a\\\\p{Greek}]\"", `1:13 (12): eof ""`}, + {"1:1 (0): code \"{}\"", `1:2 (1): eof ""`}, + {"1:1 (0): code \"{a}\"", `1:3 (2): eof ""`}, + {"1:1 (0): code \"{a}\"", "1:4 (3): ident \"i\"", `1:4 (3): eof ""`}, + {"1:1 (0): code \"{\\nif something {\\n\\tdoSomething()\\n}\\n}\"", `5:1 (34): eof ""`}, + {"1:1 (0): lcomment \"// a\"", `1:4 (3): eof ""`}, + {"1:1 (0): lcomment \"// a\"", `2:0 (4): eol "\n"`, `2:1 (5): ident "b"`, `2:1 (5): eof ""`}, + {"1:1 (0): slash \"/\"", `1:2 (1): ident "a"`, `1:2 (1): eof ""`}, + {"1:1 (0): slash \"/\"", `2:0 (1): eol "\n"`, `2:0 (1): eof ""`}, + {"1:1 (0): mlcomment \"/**/\"", `1:4 (3): eof ""`}, + {"1:1 (0): mlcomment \"/*a*/\"", `1:5 (4): eof ""`}, + {"1:1 (0): mlcomment \"/*a\\nb*/\"", `2:3 (6): eof ""`}, + {"1:1 (0): colon \":\"", `1:1 (0): eof ""`}, + {"1:1 (0): semicolon \";\"", `1:1 (0): eof ""`}, + {"1:1 (0): lparen \"(\"", `1:1 (0): eof ""`}, + {"1:1 (0): rparen \")\"", `1:1 (0): eof ""`}, + {"1:1 (0): dot \".\"", `1:1 (0): eof ""`}, + {"1:1 (0): ampersand \"&\"", `1:1 (0): eof ""`}, + {"1:1 (0): exclamation \"!\"", `1:1 (0): eof ""`}, + {"1:1 (0): question \"?\"", `1:1 (0): eof ""`}, + {"1:1 (0): plus \"+\"", `1:1 (0): eof ""`}, + {"1:1 (0): star \"*\"", `1:1 (0): eof ""`}, + {"2:0 (0): eol \"\\n\"", `2:0 (0): eof ""`}, + {"1:1 (0): ident \"pockage\"", `1:9 (8): ruledef "="`, `1:11 (10): ident "a"`, `1:11 (10): eof ""`}, + { + `1:1 (0): ident "Rule"`, + `1:6 (5): ruledef "<-"`, + `2:0 (7): eol "\n"`, + `2:2 (9): ident "E"`, + `2:4 (11): slash "/"`, + `2:6 (13): lparen "("`, + `2:8 (15): char "'a'"`, + `2:11 (18): question "?"`, + `2:13 (20): str "\"bcd\"i"`, + `2:20 (27): rparen ")"`, + `2:21 (28): plus "+"`, + `2:23 (30): slash "/"`, + `2:25 (32): class "[efg-j]"`, + `2:32 (39): star "*"`, + `2:34 (41): code "{ println() }"`, + `2:48 (55): lcomment "// comment"`, + `3:0 (65): eol "\n"`, + `3:2 (67): slash "/"`, + `3:4 (69): ampersand "&"`, + `3:5 (70): char "'\\xff'"`, + `3:12 (77): mlcomment "/* and\nsome\ncomment\n*/"`, + `6:2 (98): eof ""`, + }, +} + +type errsink struct { + errs []error + pos []ast.Pos +} + +func (e *errsink) add(p ast.Pos, err error) { + e.errs = append(e.errs, err) + e.pos = append(e.pos, p) +} + +func (e *errsink) reset() { + e.errs = e.errs[:0] + e.pos = e.pos[:0] +} + +func (e *errsink) StringAt(i int) string { + if i < 0 || i >= len(e.errs) { + return "" + } + return fmt.Sprintf("%s: %s", e.pos[i], e.errs[i]) +} + +func TestScanValid(t *testing.T) { + old := tokenStringLen + tokenStringLen = 100 + defer func() { tokenStringLen = old }() + + var s Scanner + var errh errsink + for i, c := range scanValidCases { + errh.reset() + s.Init("", strings.NewReader(c), errh.add) + + j := 0 + for { + tok, ok := s.Scan() + if j < len(scanExpTokens[i]) { + got := tok.String() + want := scanExpTokens[i][j] + if got != want { + t.Errorf("%d: token %d: want %q, got %q", i, j, want, got) + } + } else { + t.Errorf("%d: want %d tokens, got #%d", i, len(scanExpTokens[i]), j+1) + } + if !ok { + if j < len(scanExpTokens[i])-1 { + t.Errorf("%d: wand %d tokens, got only %d", i, len(scanExpTokens[i]), j+1) + } + break + } + j++ + } + if len(errh.errs) != 0 { + t.Errorf("%d: want no error, got %d", i, len(errh.errs)) + t.Log(errh.errs) + } + } +} + +var scanInvalidCases = []string{ + "|", + "<", + "'", + "''", + "'ab'", + `'\xff\U00001234'`, + `'\pA'`, + `'\z'`, + "'\\\n", + `'\xg'`, + `'\129'`, + `'\12`, + `'\xa`, + `'\u123z'`, + `'\u12`, + `'\UFFFFffff'`, + `'\uD800'`, + `'\ue000'`, + `'\ud901'`, + `'\"'`, + "\"\n", + "\"", + "\"\\'\"", + "`", + "[", + "[\\\"", + `[\[]`, + `[\p]`, + `[\p{]`, + `[\p{`, + `[\p{}]`, + `{code{}`, + `/*a*`, + `/*a`, + `func`, +} + +var scanExpErrs = [][]string{ + {"1:1 (0): invalid character U+007C '|'"}, + {"1:1 (0): rule definition not terminated"}, + {"1:1 (0): rune literal not terminated"}, + {"1:2 (1): rune literal is not a single rune"}, + {"1:4 (3): rune literal is not a single rune"}, + {"1:16 (15): rune literal is not a single rune"}, + {"1:3 (2): unknown escape sequence", + "1:5 (4): rune literal is not a single rune"}, + {"1:3 (2): unknown escape sequence"}, + {"2:0 (2): escape sequence not terminated", + "2:0 (2): rune literal not terminated"}, + {"1:4 (3): illegal character U+0067 'g' in escape sequence"}, + {"1:5 (4): illegal character U+0039 '9' in escape sequence"}, + {"1:4 (3): escape sequence not terminated", + "1:4 (3): rune literal not terminated"}, + {"1:4 (3): escape sequence not terminated", + "1:4 (3): rune literal not terminated"}, + {"1:7 (6): illegal character U+007A 'z' in escape sequence"}, + {"1:5 (4): escape sequence not terminated", + "1:5 (4): rune literal not terminated"}, + {"1:11 (10): escape sequence is invalid Unicode code point"}, + {"1:7 (6): escape sequence is invalid Unicode code point"}, + {"1:7 (6): escape sequence is invalid Unicode code point"}, + {"1:7 (6): escape sequence is invalid Unicode code point"}, + {"1:3 (2): unknown escape sequence"}, + {"2:0 (1): string literal not terminated"}, + {"1:1 (0): string literal not terminated"}, + {"1:3 (2): unknown escape sequence"}, + {"1:1 (0): raw string literal not terminated"}, + {"1:1 (0): character class not terminated"}, + {"1:3 (2): unknown escape sequence", + "1:3 (2): character class not terminated"}, + {"1:3 (2): unknown escape sequence"}, + {"1:4 (3): character class not terminated"}, + {"1:5 (4): escape sequence not terminated", + "1:5 (4): character class not terminated"}, + {"1:4 (3): escape sequence not terminated", + "1:4 (3): character class not terminated"}, + {"1:5 (4): empty Unicode character class escape sequence"}, + {"1:7 (6): code block not terminated"}, + {"1:4 (3): comment not terminated"}, + {"1:3 (2): comment not terminated"}, + {"1:1 (0): illegal identifier \"func\""}, +} + +func TestScanInvalid(t *testing.T) { + var s Scanner + var errh errsink + for i, c := range scanInvalidCases { + errh.reset() + s.Init("", strings.NewReader(c), errh.add) + for { + if _, ok := s.Scan(); !ok { + break + } + } + if len(errh.errs) != len(scanExpErrs[i]) { + t.Errorf("%d: want %d errors, got %d", i, len(scanExpErrs[i]), len(errh.errs)) + continue + } + for j := range errh.errs { + want := scanExpErrs[i][j] + got := errh.StringAt(j) + if want != got { + t.Errorf("%d: error %d: want %q, got %q", i, j, want, got) + } + } + } +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/bootstrap/token.go b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/token.go new file mode 100644 index 0000000000..982d5181ce --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/bootstrap/token.go @@ -0,0 +1,161 @@ +package bootstrap + +import ( + "fmt" + + "github.com/PuerkitoBio/pigeon/ast" +) + +type tid int + +const ( + invalid tid = iota - 1 + eof // end-of-file token, id 0 + + ident tid = iota + 127 // identifiers follow the same rules as Go + ruledef // rule definition token + + // literals + char // character literal, as in Go ('a'i?) + str // double-quoted string literal, as in Go ("string"i?) + rstr // back-tick quoted raw string literal, as in Go (`string`i?) + class // square-brackets character classes ([a\n\t]i?) + lcomment // line comment as in Go (// comment or /* comment */ with no newline) + mlcomment // multi-line comment as in Go (/* comment */) + code // code blocks between '{' and '}' + + // operators and delimiters have the value of their char + // smallest value in that category is 10, for '\n' + eol tid = '\n' // end-of-line token, required in the parser + colon tid = ':' // separate variable name from expression ':' + semicolon tid = ';' // optional ';' to terminate rules + lparen tid = '(' // parenthesis to group expressions '(' + rparen tid = ')' // ')' + dot tid = '.' // any matcher '.' + ampersand tid = '&' // and-predicate '&' + exclamation tid = '!' // not-predicate '!' + question tid = '?' // zero-or-one '?' + plus tid = '+' // one-or-more '+' + star tid = '*' // zero-or-more '*' + slash tid = '/' // ordered choice '/' +) + +var lookup = map[tid]string{ + invalid: "invalid", + eof: "eof", + ident: "ident", + ruledef: "ruledef", + char: "char", + str: "str", + rstr: "rstr", + class: "class", + lcomment: "lcomment", + mlcomment: "mlcomment", + code: "code", + eol: "eol", + colon: "colon", + semicolon: "semicolon", + lparen: "lparen", + rparen: "rparen", + dot: "dot", + ampersand: "ampersand", + exclamation: "exclamation", + question: "question", + plus: "plus", + star: "star", + slash: "slash", +} + +func (t tid) String() string { + if s, ok := lookup[t]; ok { + return s + } + return fmt.Sprintf("tid(%d)", t) +} + +var blacklistedIdents = map[string]struct{}{ + // Go keywords http://golang.org/ref/spec#Keywords + "break": struct{}{}, + "case": struct{}{}, + "chan": struct{}{}, + "const": struct{}{}, + "continue": struct{}{}, + "default": struct{}{}, + "defer": struct{}{}, + "else": struct{}{}, + "fallthrough": struct{}{}, + "for": struct{}{}, + "func": struct{}{}, + "go": struct{}{}, + "goto": struct{}{}, + "if": struct{}{}, + "import": struct{}{}, + "interface": struct{}{}, + "map": struct{}{}, + "package": struct{}{}, + "range": struct{}{}, + "return": struct{}{}, + "select": struct{}{}, + "struct": struct{}{}, + "switch": struct{}{}, + "type": struct{}{}, + "var": struct{}{}, + + // predeclared identifiers http://golang.org/ref/spec#Predeclared_identifiers + "bool": struct{}{}, + "byte": struct{}{}, + "complex64": struct{}{}, + "complex128": struct{}{}, + "error": struct{}{}, + "float32": struct{}{}, + "float64": struct{}{}, + "int": struct{}{}, + "int8": struct{}{}, + "int16": struct{}{}, + "int32": struct{}{}, + "int64": struct{}{}, + "rune": struct{}{}, + "string": struct{}{}, + "uint": struct{}{}, + "uint8": struct{}{}, + "uint16": struct{}{}, + "uint32": struct{}{}, + "uint64": struct{}{}, + "uintptr": struct{}{}, + "true": struct{}{}, + "false": struct{}{}, + "iota": struct{}{}, + "nil": struct{}{}, + "append": struct{}{}, + "cap": struct{}{}, + "close": struct{}{}, + "complex": struct{}{}, + "copy": struct{}{}, + "delete": struct{}{}, + "imag": struct{}{}, + "len": struct{}{}, + "make": struct{}{}, + "new": struct{}{}, + "panic": struct{}{}, + "print": struct{}{}, + "println": struct{}{}, + "real": struct{}{}, + "recover": struct{}{}, +} + +// Token is a syntactic token generated by the scanner. +type Token struct { + id tid + lit string + pos ast.Pos +} + +var tokenStringLen = 50 + +func (t Token) String() string { + v := t.lit + if len(v) > tokenStringLen { + v = v[:tokenStringLen/2] + "[...]" + v[len(v)-(tokenStringLen/2):len(v)] + } + return fmt.Sprintf("%s: %s %q", t.pos, t.id, v) +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/builder/builder.go b/vendor/github.com/PuerkitoBio/pigeon/builder/builder.go new file mode 100644 index 0000000000..4fccadbc4d --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/builder/builder.go @@ -0,0 +1,573 @@ +// Package builder generates the parser code for a given grammar. It makes +// no attempt to verify the correctness of the grammar. +package builder + +import ( + "bytes" + "fmt" + "io" + "strconv" + "strings" + "unicode" + + "github.com/PuerkitoBio/pigeon/ast" +) + +// generated function templates +var ( + onFuncTemplate = `func (%s *current) %s(%s) (interface{}, error) { +%s +} +` + onPredFuncTemplate = `func (%s *current) %s(%s) (bool, error) { +%s +} +` + callFuncTemplate = `func (p *parser) call%s() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.%[1]s(%s) +} +` + callPredFuncTemplate = `func (p *parser) call%s() (bool, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.%[1]s(%s) +} +` +) + +// Option is a function that can set an option on the builder. It returns +// the previous setting as an Option. +type Option func(*builder) Option + +// ReceiverName returns an option that specifies the receiver name to +// use for the current struct (which is the struct on which all code blocks +// except the initializer are generated). +func ReceiverName(nm string) Option { + return func(b *builder) Option { + prev := b.recvName + b.recvName = nm + return ReceiverName(prev) + } +} + +// BuildParser builds the PEG parser using the provider grammar. The code is +// written to the specified w. +func BuildParser(w io.Writer, g *ast.Grammar, opts ...Option) error { + b := &builder{w: w, recvName: "c"} + b.setOptions(opts) + return b.buildParser(g) +} + +type builder struct { + w io.Writer + err error + + // options + recvName string + + ruleName string + exprIndex int + argsStack [][]string +} + +func (b *builder) setOptions(opts []Option) { + for _, opt := range opts { + opt(b) + } +} + +func (b *builder) buildParser(g *ast.Grammar) error { + b.writeInit(g.Init) + b.writeGrammar(g) + + for _, rule := range g.Rules { + b.writeRuleCode(rule) + } + b.writeStaticCode() + + return b.err +} + +func (b *builder) writeInit(init *ast.CodeBlock) { + if init == nil { + return + } + + // remove opening and closing braces + val := init.Val[1 : len(init.Val)-1] + b.writelnf("%s", val) +} + +func (b *builder) writeGrammar(g *ast.Grammar) { + // transform the ast grammar to the self-contained, no dependency version + // of the parser-generator grammar. + b.writelnf("var g = &grammar {") + b.writelnf("\trules: []*rule{") + for _, r := range g.Rules { + b.writeRule(r) + } + b.writelnf("\t},") + b.writelnf("}") +} + +func (b *builder) writeRule(r *ast.Rule) { + if r == nil || r.Name == nil { + return + } + + b.exprIndex = 0 + b.ruleName = r.Name.Val + + b.writelnf("{") + b.writelnf("\tname: %q,", r.Name.Val) + if r.DisplayName != nil && r.DisplayName.Val != "" { + b.writelnf("\tdisplayName: %q,", r.DisplayName.Val) + } + pos := r.Pos() + b.writelnf("\tpos: position{line: %d, col: %d, offset: %d},", pos.Line, pos.Col, pos.Off) + b.writef("\texpr: ") + b.writeExpr(r.Expr) + b.writelnf("},") +} + +func (b *builder) writeExpr(expr ast.Expression) { + b.exprIndex++ + switch expr := expr.(type) { + case *ast.ActionExpr: + b.writeActionExpr(expr) + case *ast.AndCodeExpr: + b.writeAndCodeExpr(expr) + case *ast.AndExpr: + b.writeAndExpr(expr) + case *ast.AnyMatcher: + b.writeAnyMatcher(expr) + case *ast.CharClassMatcher: + b.writeCharClassMatcher(expr) + case *ast.ChoiceExpr: + b.writeChoiceExpr(expr) + case *ast.LabeledExpr: + b.writeLabeledExpr(expr) + case *ast.LitMatcher: + b.writeLitMatcher(expr) + case *ast.NotCodeExpr: + b.writeNotCodeExpr(expr) + case *ast.NotExpr: + b.writeNotExpr(expr) + case *ast.OneOrMoreExpr: + b.writeOneOrMoreExpr(expr) + case *ast.RuleRefExpr: + b.writeRuleRefExpr(expr) + case *ast.SeqExpr: + b.writeSeqExpr(expr) + case *ast.ZeroOrMoreExpr: + b.writeZeroOrMoreExpr(expr) + case *ast.ZeroOrOneExpr: + b.writeZeroOrOneExpr(expr) + default: + b.err = fmt.Errorf("builder: unknown expression type %T", expr) + } +} + +func (b *builder) writeActionExpr(act *ast.ActionExpr) { + if act == nil { + b.writelnf("nil,") + return + } + act.FuncIx = b.exprIndex + b.writelnf("&actionExpr{") + pos := act.Pos() + b.writelnf("\tpos: position{line: %d, col: %d, offset: %d},", pos.Line, pos.Col, pos.Off) + b.writelnf("\trun: (*parser).call%s,", b.funcName(act.FuncIx)) + b.writef("\texpr: ") + b.writeExpr(act.Expr) + b.writelnf("},") +} + +func (b *builder) writeAndCodeExpr(and *ast.AndCodeExpr) { + if and == nil { + b.writelnf("nil,") + return + } + b.writelnf("&andCodeExpr{") + pos := and.Pos() + and.FuncIx = b.exprIndex + b.writelnf("\tpos: position{line: %d, col: %d, offset: %d},", pos.Line, pos.Col, pos.Off) + b.writelnf("\trun: (*parser).call%s,", b.funcName(and.FuncIx)) + b.writelnf("},") +} + +func (b *builder) writeAndExpr(and *ast.AndExpr) { + if and == nil { + b.writelnf("nil,") + return + } + b.writelnf("&andExpr{") + pos := and.Pos() + b.writelnf("\tpos: position{line: %d, col: %d, offset: %d},", pos.Line, pos.Col, pos.Off) + b.writef("\texpr: ") + b.writeExpr(and.Expr) + b.writelnf("},") +} + +func (b *builder) writeAnyMatcher(any *ast.AnyMatcher) { + if any == nil { + b.writelnf("nil,") + return + } + b.writelnf("&anyMatcher{") + pos := any.Pos() + b.writelnf("\tline: %d, col: %d, offset: %d,", pos.Line, pos.Col, pos.Off) + b.writelnf("},") +} + +func (b *builder) writeCharClassMatcher(ch *ast.CharClassMatcher) { + if ch == nil { + b.writelnf("nil,") + return + } + b.writelnf("&charClassMatcher{") + pos := ch.Pos() + b.writelnf("\tpos: position{line: %d, col: %d, offset: %d},", pos.Line, pos.Col, pos.Off) + b.writelnf("\tval: %q,", ch.Val) + if len(ch.Chars) > 0 { + b.writef("\tchars: []rune{") + for _, rn := range ch.Chars { + if ch.IgnoreCase { + b.writef("%q,", unicode.ToLower(rn)) + } else { + b.writef("%q,", rn) + } + } + b.writelnf("},") + } + if len(ch.Ranges) > 0 { + b.writef("\tranges: []rune{") + for _, rn := range ch.Ranges { + if ch.IgnoreCase { + b.writef("%q,", unicode.ToLower(rn)) + } else { + b.writef("%q,", rn) + } + } + b.writelnf("},") + } + if len(ch.UnicodeClasses) > 0 { + b.writef("\tclasses: []*unicode.RangeTable{") + for _, cl := range ch.UnicodeClasses { + b.writef("rangeTable(%q),", cl) + } + b.writelnf("},") + } + b.writelnf("\tignoreCase: %t,", ch.IgnoreCase) + b.writelnf("\tinverted: %t,", ch.Inverted) + b.writelnf("},") +} + +func (b *builder) writeChoiceExpr(ch *ast.ChoiceExpr) { + if ch == nil { + b.writelnf("nil,") + return + } + b.writelnf("&choiceExpr{") + pos := ch.Pos() + b.writelnf("\tpos: position{line: %d, col: %d, offset: %d},", pos.Line, pos.Col, pos.Off) + if len(ch.Alternatives) > 0 { + b.writelnf("\talternatives: []interface{}{") + for _, alt := range ch.Alternatives { + b.writeExpr(alt) + } + b.writelnf("\t},") + } + b.writelnf("},") +} + +func (b *builder) writeLabeledExpr(lab *ast.LabeledExpr) { + if lab == nil { + b.writelnf("nil,") + return + } + b.writelnf("&labeledExpr{") + pos := lab.Pos() + b.writelnf("\tpos: position{line: %d, col: %d, offset: %d},", pos.Line, pos.Col, pos.Off) + if lab.Label != nil && lab.Label.Val != "" { + b.writelnf("\tlabel: %q,", lab.Label.Val) + } + b.writef("\texpr: ") + b.writeExpr(lab.Expr) + b.writelnf("},") +} + +func (b *builder) writeLitMatcher(lit *ast.LitMatcher) { + if lit == nil { + b.writelnf("nil,") + return + } + b.writelnf("&litMatcher{") + pos := lit.Pos() + b.writelnf("\tpos: position{line: %d, col: %d, offset: %d},", pos.Line, pos.Col, pos.Off) + if lit.IgnoreCase { + b.writelnf("\tval: %q,", strings.ToLower(lit.Val)) + } else { + b.writelnf("\tval: %q,", lit.Val) + } + b.writelnf("\tignoreCase: %t,", lit.IgnoreCase) + b.writelnf("},") +} + +func (b *builder) writeNotCodeExpr(not *ast.NotCodeExpr) { + if not == nil { + b.writelnf("nil,") + return + } + b.writelnf("¬CodeExpr{") + pos := not.Pos() + not.FuncIx = b.exprIndex + b.writelnf("\tpos: position{line: %d, col: %d, offset: %d},", pos.Line, pos.Col, pos.Off) + b.writelnf("\trun: (*parser).call%s,", b.funcName(not.FuncIx)) + b.writelnf("},") +} + +func (b *builder) writeNotExpr(not *ast.NotExpr) { + if not == nil { + b.writelnf("nil,") + return + } + b.writelnf("¬Expr{") + pos := not.Pos() + b.writelnf("\tpos: position{line: %d, col: %d, offset: %d},", pos.Line, pos.Col, pos.Off) + b.writef("\texpr: ") + b.writeExpr(not.Expr) + b.writelnf("},") +} + +func (b *builder) writeOneOrMoreExpr(one *ast.OneOrMoreExpr) { + if one == nil { + b.writelnf("nil,") + return + } + b.writelnf("&oneOrMoreExpr{") + pos := one.Pos() + b.writelnf("\tpos: position{line: %d, col: %d, offset: %d},", pos.Line, pos.Col, pos.Off) + b.writef("\texpr: ") + b.writeExpr(one.Expr) + b.writelnf("},") +} + +func (b *builder) writeRuleRefExpr(ref *ast.RuleRefExpr) { + if ref == nil { + b.writelnf("nil,") + return + } + b.writelnf("&ruleRefExpr{") + pos := ref.Pos() + b.writelnf("\tpos: position{line: %d, col: %d, offset: %d},", pos.Line, pos.Col, pos.Off) + if ref.Name != nil && ref.Name.Val != "" { + b.writelnf("\tname: %q,", ref.Name.Val) + } + b.writelnf("},") +} + +func (b *builder) writeSeqExpr(seq *ast.SeqExpr) { + if seq == nil { + b.writelnf("nil,") + return + } + b.writelnf("&seqExpr{") + pos := seq.Pos() + b.writelnf("\tpos: position{line: %d, col: %d, offset: %d},", pos.Line, pos.Col, pos.Off) + if len(seq.Exprs) > 0 { + b.writelnf("\texprs: []interface{}{") + for _, e := range seq.Exprs { + b.writeExpr(e) + } + b.writelnf("\t},") + } + b.writelnf("},") +} + +func (b *builder) writeZeroOrMoreExpr(zero *ast.ZeroOrMoreExpr) { + if zero == nil { + b.writelnf("nil,") + return + } + b.writelnf("&zeroOrMoreExpr{") + pos := zero.Pos() + b.writelnf("\tpos: position{line: %d, col: %d, offset: %d},", pos.Line, pos.Col, pos.Off) + b.writef("\texpr: ") + b.writeExpr(zero.Expr) + b.writelnf("},") +} + +func (b *builder) writeZeroOrOneExpr(zero *ast.ZeroOrOneExpr) { + if zero == nil { + b.writelnf("nil,") + return + } + b.writelnf("&zeroOrOneExpr{") + pos := zero.Pos() + b.writelnf("\tpos: position{line: %d, col: %d, offset: %d},", pos.Line, pos.Col, pos.Off) + b.writef("\texpr: ") + b.writeExpr(zero.Expr) + b.writelnf("},") +} + +func (b *builder) writeRuleCode(rule *ast.Rule) { + if rule == nil || rule.Name == nil { + return + } + + // keep trace of the current rule, as the code blocks are created + // in functions named "on<#ExprIndex>". + b.ruleName = rule.Name.Val + b.pushArgsSet() + b.writeExprCode(rule.Expr) + b.popArgsSet() +} + +func (b *builder) pushArgsSet() { + b.argsStack = append(b.argsStack, nil) +} + +func (b *builder) popArgsSet() { + b.argsStack = b.argsStack[:len(b.argsStack)-1] +} + +func (b *builder) addArg(arg *ast.Identifier) { + if arg == nil { + return + } + ix := len(b.argsStack) - 1 + b.argsStack[ix] = append(b.argsStack[ix], arg.Val) +} + +func (b *builder) writeExprCode(expr ast.Expression) { + switch expr := expr.(type) { + case *ast.ActionExpr: + b.writeExprCode(expr.Expr) + b.writeActionExprCode(expr) + + case *ast.AndCodeExpr: + b.writeAndCodeExprCode(expr) + + case *ast.LabeledExpr: + b.addArg(expr.Label) + b.pushArgsSet() + b.writeExprCode(expr.Expr) + b.popArgsSet() + + case *ast.NotCodeExpr: + b.writeNotCodeExprCode(expr) + + case *ast.AndExpr: + b.pushArgsSet() + b.writeExprCode(expr.Expr) + b.popArgsSet() + case *ast.ChoiceExpr: + for _, alt := range expr.Alternatives { + b.pushArgsSet() + b.writeExprCode(alt) + b.popArgsSet() + } + case *ast.NotExpr: + b.pushArgsSet() + b.writeExprCode(expr.Expr) + b.popArgsSet() + case *ast.OneOrMoreExpr: + b.pushArgsSet() + b.writeExprCode(expr.Expr) + b.popArgsSet() + case *ast.SeqExpr: + for _, sub := range expr.Exprs { + b.writeExprCode(sub) + } + case *ast.ZeroOrMoreExpr: + b.pushArgsSet() + b.writeExprCode(expr.Expr) + b.popArgsSet() + case *ast.ZeroOrOneExpr: + b.pushArgsSet() + b.writeExprCode(expr.Expr) + b.popArgsSet() + } +} + +func (b *builder) writeActionExprCode(act *ast.ActionExpr) { + if act == nil { + return + } + b.writeFunc(act.FuncIx, act.Code, callFuncTemplate, onFuncTemplate) +} + +func (b *builder) writeAndCodeExprCode(and *ast.AndCodeExpr) { + if and == nil { + return + } + b.writeFunc(and.FuncIx, and.Code, callPredFuncTemplate, onPredFuncTemplate) +} + +func (b *builder) writeNotCodeExprCode(not *ast.NotCodeExpr) { + if not == nil { + return + } + b.writeFunc(not.FuncIx, not.Code, callPredFuncTemplate, onPredFuncTemplate) +} + +func (b *builder) writeFunc(funcIx int, code *ast.CodeBlock, callTpl, funcTpl string) { + if code == nil { + return + } + val := strings.TrimSpace(code.Val)[1 : len(code.Val)-1] + if len(val) > 0 && val[0] == '\n' { + val = val[1:] + } + if len(val) > 0 && val[len(val)-1] == '\n' { + val = val[:len(val)-1] + } + var args bytes.Buffer + ix := len(b.argsStack) - 1 + if ix >= 0 { + for i, arg := range b.argsStack[ix] { + if i > 0 { + args.WriteString(", ") + } + args.WriteString(arg) + } + } + if args.Len() > 0 { + args.WriteString(" interface{}") + } + + fnNm := b.funcName(funcIx) + b.writelnf(funcTpl, b.recvName, fnNm, args.String(), val) + + args.Reset() + if ix >= 0 { + for i, arg := range b.argsStack[ix] { + if i > 0 { + args.WriteString(", ") + } + args.WriteString(fmt.Sprintf(`stack[%q]`, arg)) + } + } + b.writelnf(callTpl, fnNm, args.String()) +} + +func (b *builder) writeStaticCode() { + b.writelnf(staticCode) +} + +func (b *builder) funcName(ix int) string { + return "on" + b.ruleName + strconv.Itoa(ix) +} + +func (b *builder) writef(f string, args ...interface{}) { + if b.err == nil { + _, b.err = fmt.Fprintf(b.w, f, args...) + } +} + +func (b *builder) writelnf(f string, args ...interface{}) { + b.writef(f+"\n", args...) +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/builder/builder_test.go b/vendor/github.com/PuerkitoBio/pigeon/builder/builder_test.go new file mode 100644 index 0000000000..c119886af1 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/builder/builder_test.go @@ -0,0 +1,40 @@ +package builder + +import ( + "io/ioutil" + "strings" + "testing" + + "github.com/PuerkitoBio/pigeon/bootstrap" +) + +var grammar = ` +{ +var test = "some string" + +func init() { + fmt.Println("this is inside the init") +} +} + +start = additive eof +additive = left:multiplicative "+" space right:additive { + fmt.Println(left, right) +} / mul:multiplicative { fmt.Println(mul) } +multiplicative = left:primary op:"*" space right:multiplicative { fmt.Println(left, right, op) } / primary +primary = integer / "(" space additive:additive ")" space { fmt.Println(additive) } +integer "integer" = digits:[0123456789]+ space { fmt.Println(digits) } +space = ' '* +eof = !. { fmt.Println("eof") } +` + +func TestBuildParser(t *testing.T) { + p := bootstrap.NewParser() + g, err := p.Parse("", strings.NewReader(grammar)) + if err != nil { + t.Fatal(err) + } + if err := BuildParser(ioutil.Discard, g); err != nil { + t.Fatal(err) + } +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/builder/static_code.go b/vendor/github.com/PuerkitoBio/pigeon/builder/static_code.go new file mode 100644 index 0000000000..d81b592204 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/builder/static_code.go @@ -0,0 +1,867 @@ +package builder + +var staticCode = ` +var ( + // errNoRule is returned when the grammar to parse has no rule. + errNoRule = errors.New("grammar has no rule") + + // errInvalidEncoding is returned when the source is not properly + // utf8-encoded. + errInvalidEncoding = errors.New("invalid encoding") + + // errNoMatch is returned if no match could be found. + errNoMatch = errors.New("no match found") +) + +// Option is a function that can set an option on the parser. It returns +// the previous setting as an Option. +type Option func(*parser) Option + +// Debug creates an Option to set the debug flag to b. When set to true, +// debugging information is printed to stdout while parsing. +// +// The default is false. +func Debug(b bool) Option { + return func(p *parser) Option { + old := p.debug + p.debug = b + return Debug(old) + } +} + +// Memoize creates an Option to set the memoize flag to b. When set to true, +// the parser will cache all results so each expression is evaluated only +// once. This guarantees linear parsing time even for pathological cases, +// at the expense of more memory and slower times for typical cases. +// +// The default is false. +func Memoize(b bool) Option { + return func(p *parser) Option { + old := p.memoize + p.memoize = b + return Memoize(old) + } +} + +// Recover creates an Option to set the recover flag to b. When set to +// true, this causes the parser to recover from panics and convert it +// to an error. Setting it to false can be useful while debugging to +// access the full stack trace. +// +// The default is true. +func Recover(b bool) Option { + return func(p *parser) Option { + old := p.recover + p.recover = b + return Recover(old) + } +} + +// ParseFile parses the file identified by filename. +func ParseFile(filename string, opts ...Option) (interface{}, error) { + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + return ParseReader(filename, f, opts...) +} + +// ParseReader parses the data from r using filename as information in the +// error messages. +func ParseReader(filename string, r io.Reader, opts ...Option) (interface{}, error) { + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + + return Parse(filename, b, opts...) +} + +// Parse parses the data from b using filename as information in the +// error messages. +func Parse(filename string, b []byte, opts ...Option) (interface{}, error) { + return newParser(filename, b, opts...).parse(g) +} + +// position records a position in the text. +type position struct { + line, col, offset int +} + +func (p position) String() string { + return fmt.Sprintf("%%d:%%d [%%d]", p.line, p.col, p.offset) +} + +// savepoint stores all state required to go back to this point in the +// parser. +type savepoint struct { + position + rn rune + w int +} + +type current struct { + pos position // start position of the match + text []byte // raw text of the match +} + +// the AST types... + +type grammar struct { + pos position + rules []*rule +} + +type rule struct { + pos position + name string + displayName string + expr interface{} +} + +type choiceExpr struct { + pos position + alternatives []interface{} +} + +type actionExpr struct { + pos position + expr interface{} + run func(*parser) (interface{}, error) +} + +type seqExpr struct { + pos position + exprs []interface{} +} + +type labeledExpr struct { + pos position + label string + expr interface{} +} + +type expr struct { + pos position + expr interface{} +} + +type andExpr expr +type notExpr expr +type zeroOrOneExpr expr +type zeroOrMoreExpr expr +type oneOrMoreExpr expr + +type ruleRefExpr struct { + pos position + name string +} + +type andCodeExpr struct { + pos position + run func(*parser) (bool, error) +} + +type notCodeExpr struct { + pos position + run func(*parser) (bool, error) +} + +type litMatcher struct { + pos position + val string + ignoreCase bool +} + +type charClassMatcher struct { + pos position + val string + chars []rune + ranges []rune + classes []*unicode.RangeTable + ignoreCase bool + inverted bool +} + +type anyMatcher position + +// errList cumulates the errors found by the parser. +type errList []error + +func (e *errList) add(err error) { + *e = append(*e, err) +} + +func (e errList) err() error { + if len(e) == 0 { + return nil + } + e.dedupe() + return e +} + +func (e *errList) dedupe() { + var cleaned []error + set := make(map[string]bool) + for _, err := range *e { + if msg := err.Error(); !set[msg] { + set[msg] = true + cleaned = append(cleaned, err) + } + } + *e = cleaned +} + +func (e errList) Error() string { + switch len(e) { + case 0: + return "" + case 1: + return e[0].Error() + default: + var buf bytes.Buffer + + for i, err := range e { + if i > 0 { + buf.WriteRune('\n') + } + buf.WriteString(err.Error()) + } + return buf.String() + } +} + +// parserError wraps an error with a prefix indicating the rule in which +// the error occurred. The original error is stored in the Inner field. +type parserError struct { + Inner error + pos position + prefix string +} + +// Error returns the error message. +func (p *parserError) Error() string { + return p.prefix + ": " + p.Inner.Error() +} + +// newParser creates a parser with the specified input source and options. +func newParser(filename string, b []byte, opts ...Option) *parser { + p := &parser{ + filename: filename, + errs: new(errList), + data: b, + pt: savepoint{position: position{line: 1}}, + recover: true, + } + p.setOptions(opts) + return p +} + +// setOptions applies the options to the parser. +func (p *parser) setOptions(opts []Option) { + for _, opt := range opts { + opt(p) + } +} + +type resultTuple struct { + v interface{} + b bool + end savepoint +} + +type parser struct { + filename string + pt savepoint + cur current + + data []byte + errs *errList + + recover bool + debug bool + depth int + + memoize bool + // memoization table for the packrat algorithm: + // map[offset in source] map[expression or rule] {value, match} + memo map[int]map[interface{}]resultTuple + + // rules table, maps the rule identifier to the rule node + rules map[string]*rule + // variables stack, map of label to value + vstack []map[string]interface{} + // rule stack, allows identification of the current rule in errors + rstack []*rule + + // stats + exprCnt int +} + +// push a variable set on the vstack. +func (p *parser) pushV() { + if cap(p.vstack) == len(p.vstack) { + // create new empty slot in the stack + p.vstack = append(p.vstack, nil) + } else { + // slice to 1 more + p.vstack = p.vstack[:len(p.vstack)+1] + } + + // get the last args set + m := p.vstack[len(p.vstack)-1] + if m != nil && len(m) == 0 { + // empty map, all good + return + } + + m = make(map[string]interface{}) + p.vstack[len(p.vstack)-1] = m +} + +// pop a variable set from the vstack. +func (p *parser) popV() { + // if the map is not empty, clear it + m := p.vstack[len(p.vstack)-1] + if len(m) > 0 { + // GC that map + p.vstack[len(p.vstack)-1] = nil + } + p.vstack = p.vstack[:len(p.vstack)-1] +} + +func (p *parser) print(prefix, s string) string { + if !p.debug { + return s + } + + fmt.Printf("%%s %%d:%%d:%%d: %%s [%%#U]\n", + prefix, p.pt.line, p.pt.col, p.pt.offset, s, p.pt.rn) + return s +} + +func (p *parser) in(s string) string { + p.depth++ + return p.print(strings.Repeat(" ", p.depth) + ">", s) +} + +func (p *parser) out(s string) string { + p.depth-- + return p.print(strings.Repeat(" ", p.depth) + "<", s) +} + +func (p *parser) addErr(err error) { + p.addErrAt(err, p.pt.position) +} + +func (p *parser) addErrAt(err error, pos position) { + var buf bytes.Buffer + if p.filename != "" { + buf.WriteString(p.filename) + } + if buf.Len() > 0 { + buf.WriteString(":") + } + buf.WriteString(fmt.Sprintf("%%d:%%d (%%d)", pos.line, pos.col, pos.offset)) + if len(p.rstack) > 0 { + if buf.Len() > 0 { + buf.WriteString(": ") + } + rule := p.rstack[len(p.rstack)-1] + if rule.displayName != "" { + buf.WriteString("rule " + rule.displayName) + } else { + buf.WriteString("rule " + rule.name) + } + } + pe := &parserError{Inner: err, prefix: buf.String()} + p.errs.add(pe) +} + +// read advances the parser to the next rune. +func (p *parser) read() { + p.pt.offset += p.pt.w + rn, n := utf8.DecodeRune(p.data[p.pt.offset:]) + p.pt.rn = rn + p.pt.w = n + p.pt.col++ + if rn == '\n' { + p.pt.line++ + p.pt.col = 0 + } + + if rn == utf8.RuneError { + if n > 0 { + p.addErr(errInvalidEncoding) + } + } +} + +// restore parser position to the savepoint pt. +func (p *parser) restore(pt savepoint) { + if p.debug { + defer p.out(p.in("restore")) + } + if pt.offset == p.pt.offset { + return + } + p.pt = pt +} + +// get the slice of bytes from the savepoint start to the current position. +func (p *parser) sliceFrom(start savepoint) []byte { + return p.data[start.position.offset:p.pt.position.offset] +} + +func (p *parser) getMemoized(node interface{}) (resultTuple, bool) { + if len(p.memo) == 0 { + return resultTuple{}, false + } + m := p.memo[p.pt.offset] + if len(m) == 0 { + return resultTuple{}, false + } + res, ok := m[node] + return res, ok +} + +func (p *parser) setMemoized(pt savepoint, node interface{}, tuple resultTuple) { + if p.memo == nil { + p.memo = make(map[int]map[interface{}]resultTuple) + } + m := p.memo[pt.offset] + if m == nil { + m = make(map[interface{}]resultTuple) + p.memo[pt.offset] = m + } + m[node] = tuple +} + +func (p *parser) buildRulesTable(g *grammar) { + p.rules = make(map[string]*rule, len(g.rules)) + for _, r := range g.rules { + p.rules[r.name] = r + } +} + +func (p *parser) parse(g *grammar) (val interface{}, err error) { + if len(g.rules) == 0 { + p.addErr(errNoRule) + return nil, p.errs.err() + } + + // TODO : not super critical but this could be generated + p.buildRulesTable(g) + + if p.recover { + // panic can be used in action code to stop parsing immediately + // and return the panic as an error. + defer func() { + if e := recover(); e != nil { + if p.debug { + defer p.out(p.in("panic handler")) + } + val = nil + switch e := e.(type) { + case error: + p.addErr(e) + default: + p.addErr(fmt.Errorf("%%v", e)) + } + err = p.errs.err() + } + }() + } + + // start rule is rule [0] + p.read() // advance to first rune + val, ok := p.parseRule(g.rules[0]) + if !ok { + if len(*p.errs) == 0 { + // make sure this doesn't go out silently + p.addErr(errNoMatch) + } + return nil, p.errs.err() + } + return val, p.errs.err() +} + +func (p *parser) parseRule(rule *rule) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseRule " + rule.name)) + } + + if p.memoize { + res, ok := p.getMemoized(rule) + if ok { + p.restore(res.end) + return res.v, res.b + } + } + + start := p.pt + p.rstack = append(p.rstack, rule) + p.pushV() + val, ok := p.parseExpr(rule.expr) + p.popV() + p.rstack = p.rstack[:len(p.rstack)-1] + if ok && p.debug { + p.print(strings.Repeat(" ", p.depth) + "MATCH", string(p.sliceFrom(start))) + } + + if p.memoize { + p.setMemoized(start, rule, resultTuple{val, ok, p.pt}) + } + return val, ok +} + +func (p *parser) parseExpr(expr interface{}) (interface{}, bool) { + var pt savepoint + var ok bool + + if p.memoize { + res, ok := p.getMemoized(expr) + if ok { + p.restore(res.end) + return res.v, res.b + } + pt = p.pt + } + + p.exprCnt++ + var val interface{} + switch expr := expr.(type) { + case *actionExpr: + val, ok = p.parseActionExpr(expr) + case *andCodeExpr: + val, ok = p.parseAndCodeExpr(expr) + case *andExpr: + val, ok = p.parseAndExpr(expr) + case *anyMatcher: + val, ok = p.parseAnyMatcher(expr) + case *charClassMatcher: + val, ok = p.parseCharClassMatcher(expr) + case *choiceExpr: + val, ok = p.parseChoiceExpr(expr) + case *labeledExpr: + val, ok = p.parseLabeledExpr(expr) + case *litMatcher: + val, ok = p.parseLitMatcher(expr) + case *notCodeExpr: + val, ok = p.parseNotCodeExpr(expr) + case *notExpr: + val, ok = p.parseNotExpr(expr) + case *oneOrMoreExpr: + val, ok = p.parseOneOrMoreExpr(expr) + case *ruleRefExpr: + val, ok = p.parseRuleRefExpr(expr) + case *seqExpr: + val, ok = p.parseSeqExpr(expr) + case *zeroOrMoreExpr: + val, ok = p.parseZeroOrMoreExpr(expr) + case *zeroOrOneExpr: + val, ok = p.parseZeroOrOneExpr(expr) + default: + panic(fmt.Sprintf("unknown expression type %%T", expr)) + } + if p.memoize { + p.setMemoized(pt, expr, resultTuple{val, ok, p.pt}) + } + return val, ok +} + +func (p *parser) parseActionExpr(act *actionExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseActionExpr")) + } + + start := p.pt + val, ok := p.parseExpr(act.expr) + if ok { + p.cur.pos = start.position + p.cur.text = p.sliceFrom(start) + actVal, err := act.run(p) + if err != nil { + p.addErrAt(err, start.position) + } + val = actVal + } + if ok && p.debug { + p.print(strings.Repeat(" ", p.depth) + "MATCH", string(p.sliceFrom(start))) + } + return val, ok +} + +func (p *parser) parseAndCodeExpr(and *andCodeExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAndCodeExpr")) + } + + ok, err := and.run(p) + if err != nil { + p.addErr(err) + } + return nil, ok +} + +func (p *parser) parseAndExpr(and *andExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAndExpr")) + } + + pt := p.pt + p.pushV() + _, ok := p.parseExpr(and.expr) + p.popV() + p.restore(pt) + return nil, ok +} + +func (p *parser) parseAnyMatcher(any *anyMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAnyMatcher")) + } + + if p.pt.rn != utf8.RuneError { + start := p.pt + p.read() + return p.sliceFrom(start), true + } + return nil, false +} + +func (p *parser) parseCharClassMatcher(chr *charClassMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseCharClassMatcher")) + } + + cur := p.pt.rn + // can't match EOF + if cur == utf8.RuneError { + return nil, false + } + start := p.pt + if chr.ignoreCase { + cur = unicode.ToLower(cur) + } + + // try to match in the list of available chars + for _, rn := range chr.chars { + if rn == cur { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + // try to match in the list of ranges + for i := 0; i < len(chr.ranges); i += 2 { + if cur >= chr.ranges[i] && cur <= chr.ranges[i+1] { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + // try to match in the list of Unicode classes + for _, cl := range chr.classes { + if unicode.Is(cl, cur) { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + if chr.inverted { + p.read() + return p.sliceFrom(start), true + } + return nil, false +} + +func (p *parser) parseChoiceExpr(ch *choiceExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseChoiceExpr")) + } + + for _, alt := range ch.alternatives { + p.pushV() + val, ok := p.parseExpr(alt) + p.popV() + if ok { + return val, ok + } + } + return nil, false +} + +func (p *parser) parseLabeledExpr(lab *labeledExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseLabeledExpr")) + } + + p.pushV() + val, ok := p.parseExpr(lab.expr) + p.popV() + if ok && lab.label != "" { + m := p.vstack[len(p.vstack)-1] + m[lab.label] = val + } + return val, ok +} + +func (p *parser) parseLitMatcher(lit *litMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseLitMatcher")) + } + + start := p.pt + for _, want := range lit.val { + cur := p.pt.rn + if lit.ignoreCase { + cur = unicode.ToLower(cur) + } + if cur != want { + p.restore(start) + return nil, false + } + p.read() + } + return p.sliceFrom(start), true +} + +func (p *parser) parseNotCodeExpr(not *notCodeExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseNotCodeExpr")) + } + + ok, err := not.run(p) + if err != nil { + p.addErr(err) + } + return nil, !ok +} + +func (p *parser) parseNotExpr(not *notExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseNotExpr")) + } + + pt := p.pt + p.pushV() + _, ok := p.parseExpr(not.expr) + p.popV() + p.restore(pt) + return nil, !ok +} + +func (p *parser) parseOneOrMoreExpr(expr *oneOrMoreExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseOneOrMoreExpr")) + } + + var vals []interface{} + + for { + p.pushV() + val, ok := p.parseExpr(expr.expr) + p.popV() + if !ok { + if len(vals) == 0 { + // did not match once, no match + return nil, false + } + return vals, true + } + vals = append(vals, val) + } +} + +func (p *parser) parseRuleRefExpr(ref *ruleRefExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseRuleRefExpr " + ref.name)) + } + + if ref.name == "" { + panic(fmt.Sprintf("%%s: invalid rule: missing name", ref.pos)) + } + + rule := p.rules[ref.name] + if rule == nil { + p.addErr(fmt.Errorf("undefined rule: %%s", ref.name)) + return nil, false + } + return p.parseRule(rule) +} + +func (p *parser) parseSeqExpr(seq *seqExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseSeqExpr")) + } + + var vals []interface{} + + pt := p.pt + for _, expr := range seq.exprs { + val, ok := p.parseExpr(expr) + if !ok { + p.restore(pt) + return nil, false + } + vals = append(vals, val) + } + return vals, true +} + +func (p *parser) parseZeroOrMoreExpr(expr *zeroOrMoreExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseZeroOrMoreExpr")) + } + + var vals []interface{} + + for { + p.pushV() + val, ok := p.parseExpr(expr.expr) + p.popV() + if !ok { + return vals, true + } + vals = append(vals, val) + } +} + +func (p *parser) parseZeroOrOneExpr(expr *zeroOrOneExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseZeroOrOneExpr")) + } + + p.pushV() + val, _ := p.parseExpr(expr.expr) + p.popV() + // whether it matched or not, consider it a match + return val, true +} + +func rangeTable(class string) *unicode.RangeTable { + if rt, ok := unicode.Categories[class]; ok { + return rt + } + if rt, ok := unicode.Properties[class]; ok { + return rt + } + if rt, ok := unicode.Scripts[class]; ok { + return rt + } + + // cannot happen + panic(fmt.Sprintf("invalid Unicode class: %%s", class)) +} +` diff --git a/vendor/github.com/PuerkitoBio/pigeon/cmpast_test.go b/vendor/github.com/PuerkitoBio/pigeon/cmpast_test.go new file mode 100644 index 0000000000..d381a4ca8e --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/cmpast_test.go @@ -0,0 +1,304 @@ +package main + +import ( + "strconv" + "testing" + + "github.com/PuerkitoBio/pigeon/ast" +) + +func compareGrammars(t *testing.T, src string, exp, got *ast.Grammar) bool { + if (exp.Init != nil) != (got.Init != nil) { + t.Errorf("%q: want Init? %t, got %t", src, exp.Init != nil, got.Init != nil) + return false + } + if exp.Init != nil { + if exp.Init.Val != got.Init.Val { + t.Errorf("%q: want Init %q, got %q", src, exp.Init.Val, got.Init.Val) + return false + } + } + + rn, rm := len(exp.Rules), len(got.Rules) + if rn != rm { + t.Errorf("%q: want %d rules, got %d", src, rn, rm) + return false + } + + for i, r := range got.Rules { + if !compareRule(t, src+": "+exp.Rules[i].Name.Val, exp.Rules[i], r) { + return false + } + } + + return true +} + +func compareRule(t *testing.T, prefix string, exp, got *ast.Rule) bool { + if exp.Name.Val != got.Name.Val { + t.Errorf("%q: want rule name %q, got %q", prefix, exp.Name.Val, got.Name.Val) + return false + } + if (exp.DisplayName != nil) != (got.DisplayName != nil) { + t.Errorf("%q: want DisplayName? %t, got %t", prefix, exp.DisplayName != nil, got.DisplayName != nil) + return false + } + if exp.DisplayName != nil { + if exp.DisplayName.Val != got.DisplayName.Val { + t.Errorf("%q: want DisplayName %q, got %q", prefix, exp.DisplayName.Val, got.DisplayName.Val) + return false + } + } + return compareExpr(t, prefix, 0, exp.Expr, got.Expr) +} + +func compareExpr(t *testing.T, prefix string, ix int, exp, got ast.Expression) bool { + ixPrefix := prefix + " (" + strconv.Itoa(ix) + ")" + + switch exp := exp.(type) { + case *ast.ActionExpr: + got, ok := got.(*ast.ActionExpr) + if !ok { + t.Errorf("%q: want expression type %T, got %T", ixPrefix, exp, got) + return false + } + if (exp.Code != nil) != (got.Code != nil) { + t.Errorf("%q: want Code?: %t, got %t", ixPrefix, exp.Code != nil, got.Code != nil) + return false + } + if exp.Code != nil { + if exp.Code.Val != got.Code.Val { + t.Errorf("%q: want code %q, got %q", ixPrefix, exp.Code.Val, got.Code.Val) + return false + } + } + return compareExpr(t, prefix, ix+1, exp.Expr, got.Expr) + + case *ast.AndCodeExpr: + got, ok := got.(*ast.AndCodeExpr) + if !ok { + t.Errorf("%q: want expression type %T, got %T", ixPrefix, exp, got) + return false + } + if (exp.Code != nil) != (got.Code != nil) { + t.Errorf("%q: want Code?: %t, got %t", ixPrefix, exp.Code != nil, got.Code != nil) + return false + } + if exp.Code != nil { + if exp.Code.Val != got.Code.Val { + t.Errorf("%q: want code %q, got %q", ixPrefix, exp.Code.Val, got.Code.Val) + return false + } + } + + case *ast.AndExpr: + got, ok := got.(*ast.AndExpr) + if !ok { + t.Errorf("%q: want expression type %T, got %T", ixPrefix, exp, got) + return false + } + return compareExpr(t, prefix, ix+1, exp.Expr, got.Expr) + + case *ast.AnyMatcher: + got, ok := got.(*ast.AnyMatcher) + if !ok { + t.Errorf("%q: want expression type %T, got %T", ixPrefix, exp, got) + return false + } + // for completion's sake... + if exp.Val != got.Val { + t.Errorf("%q: want value %q, got %q", ixPrefix, exp.Val, got.Val) + } + + case *ast.CharClassMatcher: + got, ok := got.(*ast.CharClassMatcher) + if !ok { + t.Errorf("%q: want expression type %T, got %T", ixPrefix, exp, got) + return false + } + if exp.IgnoreCase != got.IgnoreCase { + t.Errorf("%q: want IgnoreCase %t, got %t", ixPrefix, exp.IgnoreCase, got.IgnoreCase) + return false + } + if exp.Inverted != got.Inverted { + t.Errorf("%q: want Inverted %t, got %t", ixPrefix, exp.Inverted, got.Inverted) + return false + } + + ne, ng := len(exp.Chars), len(got.Chars) + if ne != ng { + t.Errorf("%q: want %d Chars, got %d (%v)", ixPrefix, ne, ng, got.Chars) + return false + } + for i, r := range exp.Chars { + if r != got.Chars[i] { + t.Errorf("%q: want Chars[%d] %#U, got %#U", ixPrefix, i, r, got.Chars[i]) + return false + } + } + + ne, ng = len(exp.Ranges), len(got.Ranges) + if ne != ng { + t.Errorf("%q: want %d Ranges, got %d", ixPrefix, ne, ng) + return false + } + for i, r := range exp.Ranges { + if r != got.Ranges[i] { + t.Errorf("%q: want Ranges[%d] %#U, got %#U", ixPrefix, i, r, got.Ranges[i]) + return false + } + } + + ne, ng = len(exp.UnicodeClasses), len(got.UnicodeClasses) + if ne != ng { + t.Errorf("%q: want %d UnicodeClasses, got %d", ixPrefix, ne, ng) + return false + } + for i, s := range exp.UnicodeClasses { + if s != got.UnicodeClasses[i] { + t.Errorf("%q: want UnicodeClasses[%d] %q, got %q", ixPrefix, i, s, got.UnicodeClasses[i]) + return false + } + } + + case *ast.ChoiceExpr: + got, ok := got.(*ast.ChoiceExpr) + if !ok { + t.Errorf("%q: want expression type %T, got %T", ixPrefix, exp, got) + return false + } + ne, ng := len(exp.Alternatives), len(got.Alternatives) + if ne != ng { + t.Errorf("%q: want %d Alternatives, got %d", ixPrefix, ne, ng) + return false + } + + for i, alt := range exp.Alternatives { + if !compareExpr(t, prefix, ix+1, alt, got.Alternatives[i]) { + return false + } + } + + case *ast.LabeledExpr: + got, ok := got.(*ast.LabeledExpr) + if !ok { + t.Errorf("%q: want expression type %T, got %T", ixPrefix, exp, got) + return false + } + if (exp.Label != nil) != (got.Label != nil) { + t.Errorf("%q: want Label?: %t, got %t", ixPrefix, exp.Label != nil, got.Label != nil) + return false + } + if exp.Label != nil { + if exp.Label.Val != got.Label.Val { + t.Errorf("%q: want label %q, got %q", ixPrefix, exp.Label.Val, got.Label.Val) + return false + } + } + + return compareExpr(t, prefix, ix+1, exp.Expr, got.Expr) + + case *ast.LitMatcher: + got, ok := got.(*ast.LitMatcher) + if !ok { + t.Errorf("%q: want expression type %T, got %T", ixPrefix, exp, got) + return false + } + if exp.IgnoreCase != got.IgnoreCase { + t.Errorf("%q: want IgnoreCase %t, got %t", ixPrefix, exp.IgnoreCase, got.IgnoreCase) + return false + } + if exp.Val != got.Val { + t.Errorf("%q: want value %q, got %q", ixPrefix, exp.Val, got.Val) + return false + } + + case *ast.NotCodeExpr: + got, ok := got.(*ast.NotCodeExpr) + if !ok { + t.Errorf("%q: want expression type %T, got %T", ixPrefix, exp, got) + return false + } + if (exp.Code != nil) != (got.Code != nil) { + t.Errorf("%q: want Code?: %t, got %t", ixPrefix, exp.Code != nil, got.Code != nil) + return false + } + if exp.Code != nil { + if exp.Code.Val != got.Code.Val { + t.Errorf("%q: want code %q, got %q", ixPrefix, exp.Code.Val, got.Code.Val) + return false + } + } + + case *ast.NotExpr: + got, ok := got.(*ast.NotExpr) + if !ok { + t.Errorf("%q: want expression type %T, got %T", ixPrefix, exp, got) + return false + } + return compareExpr(t, prefix, ix+1, exp.Expr, got.Expr) + + case *ast.OneOrMoreExpr: + got, ok := got.(*ast.OneOrMoreExpr) + if !ok { + t.Errorf("%q: want expression type %T, got %T", ixPrefix, exp, got) + return false + } + return compareExpr(t, prefix, ix+1, exp.Expr, got.Expr) + + case *ast.RuleRefExpr: + got, ok := got.(*ast.RuleRefExpr) + if !ok { + t.Errorf("%q: want expression type %T, got %T", ixPrefix, exp, got) + return false + } + if (exp.Name != nil) != (got.Name != nil) { + t.Errorf("%q: want Name?: %t, got %t", ixPrefix, exp.Name != nil, got.Name != nil) + return false + } + if exp.Name != nil { + if exp.Name.Val != got.Name.Val { + t.Errorf("%q: want name %q, got %q", ixPrefix, exp.Name.Val, got.Name.Val) + return false + } + } + + case *ast.SeqExpr: + got, ok := got.(*ast.SeqExpr) + if !ok { + t.Errorf("%q: want expression type %T, got %T", ixPrefix, exp, got) + return false + } + ne, ng := len(exp.Exprs), len(got.Exprs) + if ne != ng { + t.Errorf("%q: want %d Exprs, got %d", ixPrefix, ne, ng) + return false + } + + for i, expr := range exp.Exprs { + if !compareExpr(t, prefix, ix+1, expr, got.Exprs[i]) { + return false + } + } + + case *ast.ZeroOrMoreExpr: + got, ok := got.(*ast.ZeroOrMoreExpr) + if !ok { + t.Errorf("%q: want expression type %T, got %T", ixPrefix, exp, got) + return false + } + return compareExpr(t, prefix, ix+1, exp.Expr, got.Expr) + + case *ast.ZeroOrOneExpr: + got, ok := got.(*ast.ZeroOrOneExpr) + if !ok { + t.Errorf("%q: want expression type %T, got %T", ixPrefix, exp, got) + return false + } + return compareExpr(t, prefix, ix+1, exp.Expr, got.Expr) + + default: + t.Fatalf("unexpected expression type %T", exp) + } + return true +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/doc.go b/vendor/github.com/PuerkitoBio/pigeon/doc.go new file mode 100644 index 0000000000..448acbd0f4 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/doc.go @@ -0,0 +1,438 @@ +/* +Command pigeon generates parsers in Go from a PEG grammar. + +From Wikipedia [0]: + + A parsing expression grammar is a type of analytic formal grammar, i.e. + it describes a formal language in terms of a set of rules for recognizing + strings in the language. + +Its features and syntax are inspired by the PEG.js project [1], while +the implementation is loosely based on [2]. Formal presentation of the +PEG theory by Bryan Ford is also an important reference [3]. An introductory +blog post can be found at [4]. + + [0]: http://en.wikipedia.org/wiki/Parsing_expression_grammar + [1]: http://pegjs.org/ + [2]: http://www.codeproject.com/Articles/29713/Parsing-Expression-Grammar-Support-for-C-Part + [3]: http://pdos.csail.mit.edu/~baford/packrat/popl04/peg-popl04.pdf + [4]: http://0value.com/A-PEG-parser-generator-for-Go + +Command-line usage + +The pigeon tool must be called with PEG input as defined +by the accepted PEG syntax below. The grammar may be provided by a +file or read from stdin. The generated parser is written to stdout +by default. + + pigeon [options] [GRAMMAR_FILE] + +The following options can be specified: + + -cache : cache parser results to avoid exponential parsing time in + pathological cases. Can make the parsing slower for typical + cases and uses more memory (default: false). + + -debug : boolean, print debugging info to stdout (default: false). + + -no-recover : boolean, if set, do not recover from a panic. Useful + to access the panic stack when debugging, otherwise the panic + is converted to an error (default: false). + + -o=FILE : string, output file where the generated parser will be + written (default: stdout). + + -x : boolean, if set, do not build the parser, just parse the input grammar + (default: false). + + -receiver-name=NAME : string, name of the receiver variable for the generated + code blocks. Non-initializer code blocks in the grammar end up as methods on the + *current type, and this option sets the name of the receiver (default: c). + +The tool makes no attempt to format the code, nor to detect the +required imports. It is recommended to use goimports to properly generate +the output code: + pigeon GRAMMAR_FILE | goimports > output_file.go + +The goimports tool can be installed with: + go get golang.org/x/tools/cmd/goimports + +If the code blocks in the grammar (see below, section "Code block") are golint- +and go vet-compliant, then the resulting generated code will also be golint- +and go vet-compliant. + +The generated code doesn't use any third-party dependency unless code blocks +in the grammar require such a dependency. + +PEG syntax + +The accepted syntax for the grammar is formally defined in the +grammar/pigeon.peg file, using the PEG syntax. What follows is an informal +description of this syntax. + +Identifiers, whitespace, comments and literals follow the same +notation as the Go language, as defined in the language specification +(http://golang.org/ref/spec#Source_code_representation): + + // single line comment*/ +// /* multi-line comment */ +/* 'x' (single quotes for single char literal) + "double quotes for string literal" + `backtick quotes for raw string literal` + RuleName (a valid identifier) + +The grammar must be Unicode text encoded in UTF-8. New lines are identified +by the \n character (U+000A). Space (U+0020), horizontal tabs (U+0009) and +carriage returns (U+000D) are considered whitespace and are ignored except +to separate tokens. + +Rules + +A PEG grammar consists of a set of rules. A rule is an identifier followed +by a rule definition operator and an expression. An optional display name - +a string literal used in error messages instead of the rule identifier - can +be specified after the rule identifier. E.g.: + RuleA "friendly name" = 'a'+ // RuleA is one or more lowercase 'a's + +The rule definition operator can be any one of those: + =, <-, ← (U+2190), ⟵ (U+27F5) + +Expressions + +A rule is defined by an expression. The following sections describe the +various expression types. Expressions can be grouped by using parentheses, +and a rule can be referenced by its identifier in place of an expression. + +Choice expression + +The choice expression is a list of expressions that will be tested in the +order they are defined. The first one that matches will be used. Expressions +are separated by the forward slash character "/". E.g.: + ChoiceExpr = A / B / C // A, B and C should be rules declared in the grammar + +Because the first match is used, it is important to think about the order +of expressions. For example, in this rule, "<=" would never be used because +the "<" expression comes first: + BadChoiceExpr = "<" / "<=" + +Sequence expression + +The sequence expression is a list of expressions that must all match in +that same order for the sequence expression to be considered a match. +Expressions are separated by whitespace. E.g.: + SeqExpr = "A" "b" "c" // matches "Abc", but not "Acb" + +Labeled expression + +A labeled expression consists of an identifier followed by a colon ":" +and an expression. A labeled expression introduces a variable named with +the label that can be referenced in the code blocks in the same scope. +The variable will have the value of the expression that follows the colon. +E.g.: + LabeledExpr = value:[a-z]+ { + fmt.Println(value) + return value, nil + } + +The variable is typed as an empty interface, and the underlying type depends +on the following: + +For terminals (character and string literals, character classes and +the any matcher), the value is []byte. E.g.: + Rule = label:'a' { // label is []byte } + +For predicates (& and !), the value is always nil. E.g.: + Rule = label:&'a' { // label is nil } + +For a sequence, the value is a slice of empty interfaces, one for each +expression value in the sequence. The underlying types of each value +in the slice follow the same rules described here, recursively. E.g.: + Rule = label:('a' 'b') { // label is []interface{} } + +For a repetition (+ and *), the value is a slice of empty interfaces, one for +each repetition. The underlying types of each value in the slice follow +the same rules described here, recursively. E.g.: + Rule = label:[a-z]+ { // label is []interface{} } + +For a choice expression, the value is that of the matching choice. E.g.: + Rule = label:('a' / 'b') { // label is []byte } + +For the optional expression (?), the value is nil or the value of the +expression. E.g.: + Rule = label:'a'? { // label is nil or []byte } + +Of course, the type of the value can be anything once an action code block +is used. E.g.: + RuleA = label:'3' { + return 3, nil + } + RuleB = label:RuleA { // label is int } + +And and not expressions + +An expression prefixed with the ampersand "&" is the "and" predicate +expression: it is considered a match if the following expression is a match, +but it does not consume any input. + +An expression prefixed with the exclamation point "!" is the "not" predicate +expression: it is considered a match if the following expression is not +a match, but it does not consume any input. E.g.: + AndExpr = "A" &"B" // matches "A" if followed by a "B" (does not consume "B") + NotExpr = "A" !"B" // matches "A" if not followed by a "B" (does not consume "B") + +The expression following the & and ! operators can be a code block. In that +case, the code block must return a bool and an error. The operator's semantic +is the same, & is a match if the code block returns true, ! is a match if the +code block returns false. The code block has access to any labeled value +defined in its scope. E.g.: + CodeAndExpr = value:[a-z] &{ + // can access the value local variable... + return true, nil + } + +Repeating expressions + +An expression followed by "*", "?" or "+" is a match if the expression +occurs zero or more times ("*"), zero or one time "?" or one or more times +("+") respectively. The match is greedy, it will match as many times as +possible. E.g. + ZeroOrMoreAs = "A"* + +Literal matcher + +A literal matcher tries to match the input against a single character or a +string literal. The literal may be a single-quoted single character, a +double-quoted string or a backtick-quoted raw string. The same rules as in Go +apply regarding the allowed characters and escapes. + +The literal may be followed by a lowercase "i" (outside the ending quote) +to indicate that the match is case-insensitive. E.g.: + LiteralMatch = "Awesome\n"i // matches "awesome" followed by a newline + +Character class matcher + +A character class matcher tries to match the input against a class of characters +inside square brackets "[...]". Inside the brackets, characters represent +themselves and the same escapes as in string literals are available, except +that the single- and double-quote escape is not valid, instead the closing +square bracket "]" must be escaped to be used. + +Character ranges can be specified using the "[a-z]" notation. Unicode +classes can be specified using the "[\pL]" notation, where L is a +single-letter Unicode class of characters, or using the "[\p{Class}]" +notation where Class is a valid Unicode class (e.g. "Latin"). + +As for string literals, a lowercase "i" may follow the matcher (outside +the ending square bracket) to indicate that the match is case-insensitive. +A "^" as first character inside the square brackets indicates that the match +is inverted (it is a match if the input does not match the character class +matcher). E.g.: + NotAZ = [^a-z]i + +Any matcher + +The any matcher is represented by the dot ".". It matches any character +except the end of file, thus the "!." expression is used to indicate "match +the end of file". E.g.: + AnyChar = . // match a single character + EOF = !. + +Code block + +Code blocks can be added to generate custom Go code. There are three kinds +of code blocks: the initializer, the action and the predicate. All code blocks +appear inside curly braces "{...}". + +The initializer must appear first in the grammar, before any rule. It is +copied as-is (minus the wrapping curly braces) at the top of the generated +parser. It may contain function declarations, types, variables, etc. just +like any Go file. Every symbol declared here will be available to all other +code blocks. Although the initializer is optional in a valid grammar, it is +usually required to generate a valid Go source code file (for the package +clause). E.g.: + { + package main + + func someHelper() { + // ... + } + } + +Action code blocks are code blocks declared after an expression in a rule. +Those code blocks are turned into a method on the "*current" type in the +generated source code. The method receives any labeled expression's value +as argument (as interface{}) and must return two values, the first being +the value of the expression (an interface{}), and the second an error. +If a non-nil error is returned, it is added to the list of errors that the +parser will return. E.g.: + RuleA = "A"+ { + // return the matched string, "c" is the default name for + // the *current receiver variable. + return string(c.text), nil + } + +Predicate code blocks are code blocks declared immediately after the and "&" +or the not "!" operators. Like action code blocks, predicate code blocks +are turned into a method on the "*current" type in the generated source code. +The method receives any labeled expression's value as argument (as interface{}) +and must return two values, the first being a bool and the second an error. +If a non-nil error is returned, it is added to the list of errors that the +parser will return. E.g.: + RuleAB = [ab]i+ &{ + return true, nil + } + +The current type is a struct that provides two useful fields that can be +accessed in action and predicate code blocks: "pos" and "text". + +The "pos" field indicates the current position of the parser in the source +input. It is itself a struct with three fields: "line", "col" and "offset". +Line is a 1-based line number, col is a 1-based column number that counts +runes from the start of the line, and offset is a 0-based byte offset. + +The "text" field is the slice of bytes of the current match. It is empty +in a predicate code block. + +Using the generated parser + +The parser generated by pigeon exports a few symbols so that it can be used +as a package with public functions to parse input text. The exported API is: + - Parse(string, []byte, ...Option) (interface{}, error) + - ParseFile(string, ...Option) (interface{}, error) + - ParseReader(string, io.Reader, ...Option) (interface{}, error) + - Debug(bool) Option + - Memoize(bool) Option + - Recover(bool) Option + +See the godoc page of the generated parser for the test/predicates grammar +for an example documentation page of the exported API: +http://godoc.org/github.com/PuerkitoBio/pigeon/test/predicates. + +Like the grammar used to generate the parser, the input text must be +UTF-8-encoded Unicode. + +The start rule of the parser is the first rule in the PEG grammar used +to generate the parser. A call to any of the Parse* functions returns +the value generated by executing the grammar on the provided input text, +and an optional error. + +Typically, the grammar should generate some kind of abstract syntax tree (AST), +but for simple grammars it may evaluate the result immediately, such as in +the examples/calculator example. There are no constraints imposed on the +author of the grammar, it can return whatever is needed. + +Error reporting + +When the parser returns a non-nil error, the error is always of type errList, +which is defined as a slice of errors ([]error). Each error in the list is +of type *parserError. This is a struct that has an "Inner" field that can be +used to access the original error. + +So if a code block returns some well-known error like: + { + return nil, io.EOF + } + +The original error can be accessed this way: + _, err := ParseFile("some_file") + if err != nil { + list := err.(errList) + for _, err := range list { + pe := err.(*parserError) + if pe.Inner == io.EOF { + // ... + } + } + } + +By defaut the parser will continue after an error is returned and will +cumulate all errors found during parsing. If the grammar reaches a point +where it shouldn't continue, a panic statement can be used to terminate +parsing. The panic will be caught at the top-level of the Parse* call +and will be converted into a *parserError like any error, and an errList +will still be returned to the caller. + +The divide by zero error in the examples/calculator grammar leverages this +feature (no special code is needed to handle division by zero, if it +happens, the runtime panics and it is recovered and returned as a parsing +error). + +Providing good error reporting in a parser is not a trivial task. Part +of it is provided by the pigeon tool, by offering features such as +filename, position and rule name in the error message, but an +important part of good error reporting needs to be done by the grammar +author. + +For example, many programming languages use double-quotes for string literals. +Usually, if the opening quote is found, the closing quote is expected, and if +none is found, there won't be any other rule that will match, there's no need +to backtrack and try other choices, an error should be added to the list +and the match should be consumed. + +In order to do this, the grammar can look something like this: + + StringLiteral = '"' ValidStringChar* '"' { + // this is the valid case, build string literal node + // node = ... + return node, nil + } / '"' ValidStringChar* !'"' { + // invalid case, build a replacement string literal node or build a BadNode + // node = ... + return node, errors.New("string literal not terminated") + } + +This is just one example, but it illustrates the idea that error reporting +needs to be thought out when designing the grammar. + +API stability + +Generated parsers have user-provided code mixed with pigeon code +in the same package, so there is no package +boundary in the resulting code to prevent access to unexported symbols. +What is meant to be implementation +details in pigeon is also available to user code - which doesn't mean +it should be used. + +For this reason, it is important to precisely define what is intended to be +the supported API of pigeon, the parts that will be stable +in future versions. + +The "stability" of the API attempts to make a similar guarantee as the +Go 1 compatibility [5]. The following lists what part of the +current pigeon code falls under that guarantee (features may be added in +the future): + + - The pigeon command-line flags and arguments: those will not be removed + and will maintain the same semantics. + + - The explicitly exported API generated by pigeon. See [6] for the + documentation of this API on a generated parser. + + - The PEG syntax, as documented above. + + - The code blocks (except the initializer) will always be generated as + methods on the *current type, and this type is guaranteed to have + the fields pos (type position) and text (type []byte). There are no + guarantees on other fields and methods of this type. + + - The position type will always have the fields line, col and offset, + all defined as int. There are no guarantees on other fields and methods + of this type. + + - The type of the error value returned by the Parse* functions, when + not nil, will always be errList defined as a []error. There are no + guarantees on methods of this type, other than the fact it implements the + error interface. + + - Individual errors in the errList will always be of type *parserError, + and this type is guaranteed to have an Inner field that contains the + original error value. There are no guarantees on other fields and methods + of this type. + +References: + + [5]: https://golang.org/doc/go1compat + [6]: http://godoc.org/github.com/PuerkitoBio/pigeon/test/predicates + +*/ +package main diff --git a/vendor/github.com/PuerkitoBio/pigeon/examples/calculator/calculator.go b/vendor/github.com/PuerkitoBio/pigeon/examples/calculator/calculator.go new file mode 100644 index 0000000000..69e81fe046 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/examples/calculator/calculator.go @@ -0,0 +1,1309 @@ +// Command calculator is a small PEG-generated parser that computes +// simple math using integers. +// +// Example usage: $ calculator "3 + (2 - 5 * 12)" +// +// Inspired by pegjs arithmetic example: +// https://github.com/pegjs/pegjs/blob/master/examples/arithmetics.pegjs +// +package main + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "log" + "os" + "strconv" + "strings" + "unicode" + "unicode/utf8" +) + +var ops = map[string]func(int, int) int{ + "+": func(l, r int) int { + return l + r + }, + "-": func(l, r int) int { + return l - r + }, + "*": func(l, r int) int { + return l * r + }, + "/": func(l, r int) int { + return l / r + }, +} + +// for testing purpose +var cntCodeBlocks int + +func main() { + if len(os.Args) != 2 { + log.Fatal("Usage: calculator 'EXPR'") + } + got, err := ParseReader("", strings.NewReader(os.Args[1])) + if err != nil { + log.Fatal(err) + } + fmt.Println("=", got) +} + +func toIfaceSlice(v interface{}) []interface{} { + if v == nil { + return nil + } + return v.([]interface{}) +} + +func eval(first, rest interface{}) int { + l := first.(int) + restSl := toIfaceSlice(rest) + for _, v := range restSl { + restExpr := toIfaceSlice(v) + r := restExpr[3].(int) + op := restExpr[1].(string) + l = ops[op](l, r) + } + return l +} + +var g = &grammar{ + rules: []*rule{ + { + name: "Input", + pos: position{line: 61, col: 1, offset: 1247}, + expr: &actionExpr{ + pos: position{line: 61, col: 10, offset: 1256}, + run: (*parser).callonInput1, + expr: &seqExpr{ + pos: position{line: 61, col: 10, offset: 1256}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 61, col: 10, offset: 1256}, + label: "expr", + expr: &ruleRefExpr{ + pos: position{line: 61, col: 15, offset: 1261}, + name: "Expr", + }, + }, + &ruleRefExpr{ + pos: position{line: 61, col: 20, offset: 1266}, + name: "EOF", + }, + }, + }, + }, + }, + { + name: "Expr", + pos: position{line: 66, col: 1, offset: 1316}, + expr: &actionExpr{ + pos: position{line: 66, col: 9, offset: 1324}, + run: (*parser).callonExpr1, + expr: &seqExpr{ + pos: position{line: 66, col: 9, offset: 1324}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 66, col: 9, offset: 1324}, + name: "_", + }, + &labeledExpr{ + pos: position{line: 66, col: 11, offset: 1326}, + label: "first", + expr: &ruleRefExpr{ + pos: position{line: 66, col: 17, offset: 1332}, + name: "Term", + }, + }, + &labeledExpr{ + pos: position{line: 66, col: 22, offset: 1337}, + label: "rest", + expr: &zeroOrMoreExpr{ + pos: position{line: 66, col: 27, offset: 1342}, + expr: &seqExpr{ + pos: position{line: 66, col: 29, offset: 1344}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 66, col: 29, offset: 1344}, + name: "_", + }, + &ruleRefExpr{ + pos: position{line: 66, col: 31, offset: 1346}, + name: "AddOp", + }, + &ruleRefExpr{ + pos: position{line: 66, col: 37, offset: 1352}, + name: "_", + }, + &ruleRefExpr{ + pos: position{line: 66, col: 39, offset: 1354}, + name: "Term", + }, + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 66, col: 47, offset: 1362}, + name: "_", + }, + }, + }, + }, + }, + { + name: "Term", + pos: position{line: 71, col: 1, offset: 1423}, + expr: &actionExpr{ + pos: position{line: 71, col: 9, offset: 1431}, + run: (*parser).callonTerm1, + expr: &seqExpr{ + pos: position{line: 71, col: 9, offset: 1431}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 71, col: 9, offset: 1431}, + label: "first", + expr: &ruleRefExpr{ + pos: position{line: 71, col: 15, offset: 1437}, + name: "Factor", + }, + }, + &labeledExpr{ + pos: position{line: 71, col: 22, offset: 1444}, + label: "rest", + expr: &zeroOrMoreExpr{ + pos: position{line: 71, col: 27, offset: 1449}, + expr: &seqExpr{ + pos: position{line: 71, col: 29, offset: 1451}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 71, col: 29, offset: 1451}, + name: "_", + }, + &ruleRefExpr{ + pos: position{line: 71, col: 31, offset: 1453}, + name: "MulOp", + }, + &ruleRefExpr{ + pos: position{line: 71, col: 37, offset: 1459}, + name: "_", + }, + &ruleRefExpr{ + pos: position{line: 71, col: 39, offset: 1461}, + name: "Factor", + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "Factor", + pos: position{line: 76, col: 1, offset: 1530}, + expr: &choiceExpr{ + pos: position{line: 76, col: 11, offset: 1540}, + alternatives: []interface{}{ + &actionExpr{ + pos: position{line: 76, col: 11, offset: 1540}, + run: (*parser).callonFactor2, + expr: &seqExpr{ + pos: position{line: 76, col: 11, offset: 1540}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 76, col: 11, offset: 1540}, + val: "(", + ignoreCase: false, + }, + &labeledExpr{ + pos: position{line: 76, col: 15, offset: 1544}, + label: "expr", + expr: &ruleRefExpr{ + pos: position{line: 76, col: 20, offset: 1549}, + name: "Expr", + }, + }, + &litMatcher{ + pos: position{line: 76, col: 25, offset: 1554}, + val: ")", + ignoreCase: false, + }, + }, + }, + }, + &actionExpr{ + pos: position{line: 79, col: 5, offset: 1605}, + run: (*parser).callonFactor8, + expr: &labeledExpr{ + pos: position{line: 79, col: 5, offset: 1605}, + label: "integer", + expr: &ruleRefExpr{ + pos: position{line: 79, col: 13, offset: 1613}, + name: "Integer", + }, + }, + }, + }, + }, + }, + { + name: "AddOp", + pos: position{line: 84, col: 1, offset: 1670}, + expr: &actionExpr{ + pos: position{line: 84, col: 10, offset: 1679}, + run: (*parser).callonAddOp1, + expr: &choiceExpr{ + pos: position{line: 84, col: 12, offset: 1681}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 84, col: 12, offset: 1681}, + val: "+", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 84, col: 18, offset: 1687}, + val: "-", + ignoreCase: false, + }, + }, + }, + }, + }, + { + name: "MulOp", + pos: position{line: 89, col: 1, offset: 1749}, + expr: &actionExpr{ + pos: position{line: 89, col: 10, offset: 1758}, + run: (*parser).callonMulOp1, + expr: &choiceExpr{ + pos: position{line: 89, col: 12, offset: 1760}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 89, col: 12, offset: 1760}, + val: "*", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 89, col: 18, offset: 1766}, + val: "/", + ignoreCase: false, + }, + }, + }, + }, + }, + { + name: "Integer", + pos: position{line: 94, col: 1, offset: 1828}, + expr: &actionExpr{ + pos: position{line: 94, col: 12, offset: 1839}, + run: (*parser).callonInteger1, + expr: &seqExpr{ + pos: position{line: 94, col: 12, offset: 1839}, + exprs: []interface{}{ + &zeroOrOneExpr{ + pos: position{line: 94, col: 12, offset: 1839}, + expr: &litMatcher{ + pos: position{line: 94, col: 12, offset: 1839}, + val: "-", + ignoreCase: false, + }, + }, + &oneOrMoreExpr{ + pos: position{line: 94, col: 17, offset: 1844}, + expr: &charClassMatcher{ + pos: position{line: 94, col: 17, offset: 1844}, + val: "[0-9]", + ranges: []rune{'0', '9'}, + ignoreCase: false, + inverted: false, + }, + }, + }, + }, + }, + }, + { + name: "_", + displayName: "\"whitespace\"", + pos: position{line: 99, col: 1, offset: 1916}, + expr: &zeroOrMoreExpr{ + pos: position{line: 99, col: 19, offset: 1934}, + expr: &charClassMatcher{ + pos: position{line: 99, col: 19, offset: 1934}, + val: "[ \\n\\t\\r]", + chars: []rune{' ', '\n', '\t', '\r'}, + ignoreCase: false, + inverted: false, + }, + }, + }, + { + name: "EOF", + pos: position{line: 101, col: 1, offset: 1946}, + expr: ¬Expr{ + pos: position{line: 101, col: 8, offset: 1953}, + expr: &anyMatcher{ + line: 101, col: 9, offset: 1954, + }, + }, + }, + }, +} + +func (c *current) onInput1(expr interface{}) (interface{}, error) { + cntCodeBlocks++ + return expr, nil +} + +func (p *parser) callonInput1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onInput1(stack["expr"]) +} + +func (c *current) onExpr1(first, rest interface{}) (interface{}, error) { + cntCodeBlocks++ + return eval(first, rest), nil +} + +func (p *parser) callonExpr1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onExpr1(stack["first"], stack["rest"]) +} + +func (c *current) onTerm1(first, rest interface{}) (interface{}, error) { + cntCodeBlocks++ + return eval(first, rest), nil +} + +func (p *parser) callonTerm1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onTerm1(stack["first"], stack["rest"]) +} + +func (c *current) onFactor2(expr interface{}) (interface{}, error) { + cntCodeBlocks++ + return expr, nil +} + +func (p *parser) callonFactor2() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onFactor2(stack["expr"]) +} + +func (c *current) onFactor8(integer interface{}) (interface{}, error) { + cntCodeBlocks++ + return integer, nil +} + +func (p *parser) callonFactor8() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onFactor8(stack["integer"]) +} + +func (c *current) onAddOp1() (interface{}, error) { + cntCodeBlocks++ + return string(c.text), nil +} + +func (p *parser) callonAddOp1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onAddOp1() +} + +func (c *current) onMulOp1() (interface{}, error) { + cntCodeBlocks++ + return string(c.text), nil +} + +func (p *parser) callonMulOp1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onMulOp1() +} + +func (c *current) onInteger1() (interface{}, error) { + cntCodeBlocks++ + return strconv.Atoi(string(c.text)) +} + +func (p *parser) callonInteger1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onInteger1() +} + +var ( + // errNoRule is returned when the grammar to parse has no rule. + errNoRule = errors.New("grammar has no rule") + + // errInvalidEncoding is returned when the source is not properly + // utf8-encoded. + errInvalidEncoding = errors.New("invalid encoding") + + // errNoMatch is returned if no match could be found. + errNoMatch = errors.New("no match found") +) + +// Option is a function that can set an option on the parser. It returns +// the previous setting as an Option. +type Option func(*parser) Option + +// Debug creates an Option to set the debug flag to b. When set to true, +// debugging information is printed to stdout while parsing. +// +// The default is false. +func Debug(b bool) Option { + return func(p *parser) Option { + old := p.debug + p.debug = b + return Debug(old) + } +} + +// Memoize creates an Option to set the memoize flag to b. When set to true, +// the parser will cache all results so each expression is evaluated only +// once. This guarantees linear parsing time even for pathological cases, +// at the expense of more memory and slower times for typical cases. +// +// The default is false. +func Memoize(b bool) Option { + return func(p *parser) Option { + old := p.memoize + p.memoize = b + return Memoize(old) + } +} + +// Recover creates an Option to set the recover flag to b. When set to +// true, this causes the parser to recover from panics and convert it +// to an error. Setting it to false can be useful while debugging to +// access the full stack trace. +// +// The default is true. +func Recover(b bool) Option { + return func(p *parser) Option { + old := p.recover + p.recover = b + return Recover(old) + } +} + +// ParseFile parses the file identified by filename. +func ParseFile(filename string, opts ...Option) (interface{}, error) { + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + return ParseReader(filename, f, opts...) +} + +// ParseReader parses the data from r using filename as information in the +// error messages. +func ParseReader(filename string, r io.Reader, opts ...Option) (interface{}, error) { + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + + return Parse(filename, b, opts...) +} + +// Parse parses the data from b using filename as information in the +// error messages. +func Parse(filename string, b []byte, opts ...Option) (interface{}, error) { + return newParser(filename, b, opts...).parse(g) +} + +// position records a position in the text. +type position struct { + line, col, offset int +} + +func (p position) String() string { + return fmt.Sprintf("%d:%d [%d]", p.line, p.col, p.offset) +} + +// savepoint stores all state required to go back to this point in the +// parser. +type savepoint struct { + position + rn rune + w int +} + +type current struct { + pos position // start position of the match + text []byte // raw text of the match +} + +// the AST types... + +type grammar struct { + pos position + rules []*rule +} + +type rule struct { + pos position + name string + displayName string + expr interface{} +} + +type choiceExpr struct { + pos position + alternatives []interface{} +} + +type actionExpr struct { + pos position + expr interface{} + run func(*parser) (interface{}, error) +} + +type seqExpr struct { + pos position + exprs []interface{} +} + +type labeledExpr struct { + pos position + label string + expr interface{} +} + +type expr struct { + pos position + expr interface{} +} + +type andExpr expr +type notExpr expr +type zeroOrOneExpr expr +type zeroOrMoreExpr expr +type oneOrMoreExpr expr + +type ruleRefExpr struct { + pos position + name string +} + +type andCodeExpr struct { + pos position + run func(*parser) (bool, error) +} + +type notCodeExpr struct { + pos position + run func(*parser) (bool, error) +} + +type litMatcher struct { + pos position + val string + ignoreCase bool +} + +type charClassMatcher struct { + pos position + val string + chars []rune + ranges []rune + classes []*unicode.RangeTable + ignoreCase bool + inverted bool +} + +type anyMatcher position + +// errList cumulates the errors found by the parser. +type errList []error + +func (e *errList) add(err error) { + *e = append(*e, err) +} + +func (e errList) err() error { + if len(e) == 0 { + return nil + } + e.dedupe() + return e +} + +func (e *errList) dedupe() { + var cleaned []error + set := make(map[string]bool) + for _, err := range *e { + if msg := err.Error(); !set[msg] { + set[msg] = true + cleaned = append(cleaned, err) + } + } + *e = cleaned +} + +func (e errList) Error() string { + switch len(e) { + case 0: + return "" + case 1: + return e[0].Error() + default: + var buf bytes.Buffer + + for i, err := range e { + if i > 0 { + buf.WriteRune('\n') + } + buf.WriteString(err.Error()) + } + return buf.String() + } +} + +// parserError wraps an error with a prefix indicating the rule in which +// the error occurred. The original error is stored in the Inner field. +type parserError struct { + Inner error + pos position + prefix string +} + +// Error returns the error message. +func (p *parserError) Error() string { + return p.prefix + ": " + p.Inner.Error() +} + +// newParser creates a parser with the specified input source and options. +func newParser(filename string, b []byte, opts ...Option) *parser { + p := &parser{ + filename: filename, + errs: new(errList), + data: b, + pt: savepoint{position: position{line: 1}}, + recover: true, + } + p.setOptions(opts) + return p +} + +// setOptions applies the options to the parser. +func (p *parser) setOptions(opts []Option) { + for _, opt := range opts { + opt(p) + } +} + +type resultTuple struct { + v interface{} + b bool + end savepoint +} + +type parser struct { + filename string + pt savepoint + cur current + + data []byte + errs *errList + + recover bool + debug bool + depth int + + memoize bool + // memoization table for the packrat algorithm: + // map[offset in source] map[expression or rule] {value, match} + memo map[int]map[interface{}]resultTuple + + // rules table, maps the rule identifier to the rule node + rules map[string]*rule + // variables stack, map of label to value + vstack []map[string]interface{} + // rule stack, allows identification of the current rule in errors + rstack []*rule + + // stats + exprCnt int +} + +// push a variable set on the vstack. +func (p *parser) pushV() { + if cap(p.vstack) == len(p.vstack) { + // create new empty slot in the stack + p.vstack = append(p.vstack, nil) + } else { + // slice to 1 more + p.vstack = p.vstack[:len(p.vstack)+1] + } + + // get the last args set + m := p.vstack[len(p.vstack)-1] + if m != nil && len(m) == 0 { + // empty map, all good + return + } + + m = make(map[string]interface{}) + p.vstack[len(p.vstack)-1] = m +} + +// pop a variable set from the vstack. +func (p *parser) popV() { + // if the map is not empty, clear it + m := p.vstack[len(p.vstack)-1] + if len(m) > 0 { + // GC that map + p.vstack[len(p.vstack)-1] = nil + } + p.vstack = p.vstack[:len(p.vstack)-1] +} + +func (p *parser) print(prefix, s string) string { + if !p.debug { + return s + } + + fmt.Printf("%s %d:%d:%d: %s [%#U]\n", + prefix, p.pt.line, p.pt.col, p.pt.offset, s, p.pt.rn) + return s +} + +func (p *parser) in(s string) string { + p.depth++ + return p.print(strings.Repeat(" ", p.depth)+">", s) +} + +func (p *parser) out(s string) string { + p.depth-- + return p.print(strings.Repeat(" ", p.depth)+"<", s) +} + +func (p *parser) addErr(err error) { + p.addErrAt(err, p.pt.position) +} + +func (p *parser) addErrAt(err error, pos position) { + var buf bytes.Buffer + if p.filename != "" { + buf.WriteString(p.filename) + } + if buf.Len() > 0 { + buf.WriteString(":") + } + buf.WriteString(fmt.Sprintf("%d:%d (%d)", pos.line, pos.col, pos.offset)) + if len(p.rstack) > 0 { + if buf.Len() > 0 { + buf.WriteString(": ") + } + rule := p.rstack[len(p.rstack)-1] + if rule.displayName != "" { + buf.WriteString("rule " + rule.displayName) + } else { + buf.WriteString("rule " + rule.name) + } + } + pe := &parserError{Inner: err, prefix: buf.String()} + p.errs.add(pe) +} + +// read advances the parser to the next rune. +func (p *parser) read() { + p.pt.offset += p.pt.w + rn, n := utf8.DecodeRune(p.data[p.pt.offset:]) + p.pt.rn = rn + p.pt.w = n + p.pt.col++ + if rn == '\n' { + p.pt.line++ + p.pt.col = 0 + } + + if rn == utf8.RuneError { + if n > 0 { + p.addErr(errInvalidEncoding) + } + } +} + +// restore parser position to the savepoint pt. +func (p *parser) restore(pt savepoint) { + if p.debug { + defer p.out(p.in("restore")) + } + if pt.offset == p.pt.offset { + return + } + p.pt = pt +} + +// get the slice of bytes from the savepoint start to the current position. +func (p *parser) sliceFrom(start savepoint) []byte { + return p.data[start.position.offset:p.pt.position.offset] +} + +func (p *parser) getMemoized(node interface{}) (resultTuple, bool) { + if len(p.memo) == 0 { + return resultTuple{}, false + } + m := p.memo[p.pt.offset] + if len(m) == 0 { + return resultTuple{}, false + } + res, ok := m[node] + return res, ok +} + +func (p *parser) setMemoized(pt savepoint, node interface{}, tuple resultTuple) { + if p.memo == nil { + p.memo = make(map[int]map[interface{}]resultTuple) + } + m := p.memo[pt.offset] + if m == nil { + m = make(map[interface{}]resultTuple) + p.memo[pt.offset] = m + } + m[node] = tuple +} + +func (p *parser) buildRulesTable(g *grammar) { + p.rules = make(map[string]*rule, len(g.rules)) + for _, r := range g.rules { + p.rules[r.name] = r + } +} + +func (p *parser) parse(g *grammar) (val interface{}, err error) { + if len(g.rules) == 0 { + p.addErr(errNoRule) + return nil, p.errs.err() + } + + // TODO : not super critical but this could be generated + p.buildRulesTable(g) + + if p.recover { + // panic can be used in action code to stop parsing immediately + // and return the panic as an error. + defer func() { + if e := recover(); e != nil { + if p.debug { + defer p.out(p.in("panic handler")) + } + val = nil + switch e := e.(type) { + case error: + p.addErr(e) + default: + p.addErr(fmt.Errorf("%v", e)) + } + err = p.errs.err() + } + }() + } + + // start rule is rule [0] + p.read() // advance to first rune + val, ok := p.parseRule(g.rules[0]) + if !ok { + if len(*p.errs) == 0 { + // make sure this doesn't go out silently + p.addErr(errNoMatch) + } + return nil, p.errs.err() + } + return val, p.errs.err() +} + +func (p *parser) parseRule(rule *rule) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseRule " + rule.name)) + } + + if p.memoize { + res, ok := p.getMemoized(rule) + if ok { + p.restore(res.end) + return res.v, res.b + } + } + + start := p.pt + p.rstack = append(p.rstack, rule) + p.pushV() + val, ok := p.parseExpr(rule.expr) + p.popV() + p.rstack = p.rstack[:len(p.rstack)-1] + if ok && p.debug { + p.print(strings.Repeat(" ", p.depth)+"MATCH", string(p.sliceFrom(start))) + } + + if p.memoize { + p.setMemoized(start, rule, resultTuple{val, ok, p.pt}) + } + return val, ok +} + +func (p *parser) parseExpr(expr interface{}) (interface{}, bool) { + var pt savepoint + var ok bool + + if p.memoize { + res, ok := p.getMemoized(expr) + if ok { + p.restore(res.end) + return res.v, res.b + } + pt = p.pt + } + + p.exprCnt++ + var val interface{} + switch expr := expr.(type) { + case *actionExpr: + val, ok = p.parseActionExpr(expr) + case *andCodeExpr: + val, ok = p.parseAndCodeExpr(expr) + case *andExpr: + val, ok = p.parseAndExpr(expr) + case *anyMatcher: + val, ok = p.parseAnyMatcher(expr) + case *charClassMatcher: + val, ok = p.parseCharClassMatcher(expr) + case *choiceExpr: + val, ok = p.parseChoiceExpr(expr) + case *labeledExpr: + val, ok = p.parseLabeledExpr(expr) + case *litMatcher: + val, ok = p.parseLitMatcher(expr) + case *notCodeExpr: + val, ok = p.parseNotCodeExpr(expr) + case *notExpr: + val, ok = p.parseNotExpr(expr) + case *oneOrMoreExpr: + val, ok = p.parseOneOrMoreExpr(expr) + case *ruleRefExpr: + val, ok = p.parseRuleRefExpr(expr) + case *seqExpr: + val, ok = p.parseSeqExpr(expr) + case *zeroOrMoreExpr: + val, ok = p.parseZeroOrMoreExpr(expr) + case *zeroOrOneExpr: + val, ok = p.parseZeroOrOneExpr(expr) + default: + panic(fmt.Sprintf("unknown expression type %T", expr)) + } + if p.memoize { + p.setMemoized(pt, expr, resultTuple{val, ok, p.pt}) + } + return val, ok +} + +func (p *parser) parseActionExpr(act *actionExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseActionExpr")) + } + + start := p.pt + val, ok := p.parseExpr(act.expr) + if ok { + p.cur.pos = start.position + p.cur.text = p.sliceFrom(start) + actVal, err := act.run(p) + if err != nil { + p.addErrAt(err, start.position) + } + val = actVal + } + if ok && p.debug { + p.print(strings.Repeat(" ", p.depth)+"MATCH", string(p.sliceFrom(start))) + } + return val, ok +} + +func (p *parser) parseAndCodeExpr(and *andCodeExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAndCodeExpr")) + } + + ok, err := and.run(p) + if err != nil { + p.addErr(err) + } + return nil, ok +} + +func (p *parser) parseAndExpr(and *andExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAndExpr")) + } + + pt := p.pt + p.pushV() + _, ok := p.parseExpr(and.expr) + p.popV() + p.restore(pt) + return nil, ok +} + +func (p *parser) parseAnyMatcher(any *anyMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAnyMatcher")) + } + + if p.pt.rn != utf8.RuneError { + start := p.pt + p.read() + return p.sliceFrom(start), true + } + return nil, false +} + +func (p *parser) parseCharClassMatcher(chr *charClassMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseCharClassMatcher")) + } + + cur := p.pt.rn + // can't match EOF + if cur == utf8.RuneError { + return nil, false + } + start := p.pt + if chr.ignoreCase { + cur = unicode.ToLower(cur) + } + + // try to match in the list of available chars + for _, rn := range chr.chars { + if rn == cur { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + // try to match in the list of ranges + for i := 0; i < len(chr.ranges); i += 2 { + if cur >= chr.ranges[i] && cur <= chr.ranges[i+1] { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + // try to match in the list of Unicode classes + for _, cl := range chr.classes { + if unicode.Is(cl, cur) { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + if chr.inverted { + p.read() + return p.sliceFrom(start), true + } + return nil, false +} + +func (p *parser) parseChoiceExpr(ch *choiceExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseChoiceExpr")) + } + + for _, alt := range ch.alternatives { + p.pushV() + val, ok := p.parseExpr(alt) + p.popV() + if ok { + return val, ok + } + } + return nil, false +} + +func (p *parser) parseLabeledExpr(lab *labeledExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseLabeledExpr")) + } + + p.pushV() + val, ok := p.parseExpr(lab.expr) + p.popV() + if ok && lab.label != "" { + m := p.vstack[len(p.vstack)-1] + m[lab.label] = val + } + return val, ok +} + +func (p *parser) parseLitMatcher(lit *litMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseLitMatcher")) + } + + start := p.pt + for _, want := range lit.val { + cur := p.pt.rn + if lit.ignoreCase { + cur = unicode.ToLower(cur) + } + if cur != want { + p.restore(start) + return nil, false + } + p.read() + } + return p.sliceFrom(start), true +} + +func (p *parser) parseNotCodeExpr(not *notCodeExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseNotCodeExpr")) + } + + ok, err := not.run(p) + if err != nil { + p.addErr(err) + } + return nil, !ok +} + +func (p *parser) parseNotExpr(not *notExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseNotExpr")) + } + + pt := p.pt + p.pushV() + _, ok := p.parseExpr(not.expr) + p.popV() + p.restore(pt) + return nil, !ok +} + +func (p *parser) parseOneOrMoreExpr(expr *oneOrMoreExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseOneOrMoreExpr")) + } + + var vals []interface{} + + for { + p.pushV() + val, ok := p.parseExpr(expr.expr) + p.popV() + if !ok { + if len(vals) == 0 { + // did not match once, no match + return nil, false + } + return vals, true + } + vals = append(vals, val) + } +} + +func (p *parser) parseRuleRefExpr(ref *ruleRefExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseRuleRefExpr " + ref.name)) + } + + if ref.name == "" { + panic(fmt.Sprintf("%s: invalid rule: missing name", ref.pos)) + } + + rule := p.rules[ref.name] + if rule == nil { + p.addErr(fmt.Errorf("undefined rule: %s", ref.name)) + return nil, false + } + return p.parseRule(rule) +} + +func (p *parser) parseSeqExpr(seq *seqExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseSeqExpr")) + } + + var vals []interface{} + + pt := p.pt + for _, expr := range seq.exprs { + val, ok := p.parseExpr(expr) + if !ok { + p.restore(pt) + return nil, false + } + vals = append(vals, val) + } + return vals, true +} + +func (p *parser) parseZeroOrMoreExpr(expr *zeroOrMoreExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseZeroOrMoreExpr")) + } + + var vals []interface{} + + for { + p.pushV() + val, ok := p.parseExpr(expr.expr) + p.popV() + if !ok { + return vals, true + } + vals = append(vals, val) + } +} + +func (p *parser) parseZeroOrOneExpr(expr *zeroOrOneExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseZeroOrOneExpr")) + } + + p.pushV() + val, _ := p.parseExpr(expr.expr) + p.popV() + // whether it matched or not, consider it a match + return val, true +} + +func rangeTable(class string) *unicode.RangeTable { + if rt, ok := unicode.Categories[class]; ok { + return rt + } + if rt, ok := unicode.Properties[class]; ok { + return rt + } + if rt, ok := unicode.Scripts[class]; ok { + return rt + } + + // cannot happen + panic(fmt.Sprintf("invalid Unicode class: %s", class)) +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/examples/calculator/calculator.peg b/vendor/github.com/PuerkitoBio/pigeon/examples/calculator/calculator.peg new file mode 100644 index 0000000000..63ddf85aed --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/examples/calculator/calculator.peg @@ -0,0 +1,101 @@ +{ +// Command calculator is a small PEG-generated parser that computes +// simple math using integers. +// +// Example usage: $ calculator "3 + (2 - 5 * 12)" +// +// Inspired by pegjs arithmetic example: +// https://github.com/pegjs/pegjs/blob/master/examples/arithmetics.pegjs +// +package main + +var ops = map[string]func(int, int) int { + "+": func(l, r int) int { + return l + r + }, + "-": func(l, r int) int { + return l - r + }, + "*": func(l, r int) int { + return l * r + }, + "/": func(l, r int) int { + return l / r + }, +} + +// for testing purpose +var cntCodeBlocks int + +func main() { + if len(os.Args) != 2 { + log.Fatal("Usage: calculator 'EXPR'") + } + got, err := ParseReader("", strings.NewReader(os.Args[1])) + if err != nil { + log.Fatal(err) + } + fmt.Println("=", got) +} + +func toIfaceSlice(v interface{}) []interface{} { + if v == nil { + return nil + } + return v.([]interface{}) +} + +func eval(first, rest interface{}) int { + l := first.(int) + restSl := toIfaceSlice(rest) + for _, v := range restSl { + restExpr := toIfaceSlice(v) + r := restExpr[3].(int) + op := restExpr[1].(string) + l = ops[op](l, r) + } + return l +} +} + +Input <- expr:Expr EOF { + cntCodeBlocks++ + return expr, nil +} + +Expr <- _ first:Term rest:( _ AddOp _ Term )* _ { + cntCodeBlocks++ + return eval(first, rest), nil +} + +Term <- first:Factor rest:( _ MulOp _ Factor )* { + cntCodeBlocks++ + return eval(first, rest), nil +} + +Factor <- '(' expr:Expr ')' { + cntCodeBlocks++ + return expr, nil +} / integer:Integer { + cntCodeBlocks++ + return integer, nil +} + +AddOp <- ( '+' / '-' ) { + cntCodeBlocks++ + return string(c.text), nil +} + +MulOp <- ( '*' / '/' ) { + cntCodeBlocks++ + return string(c.text), nil +} + +Integer <- '-'? [0-9]+ { + cntCodeBlocks++ + return strconv.Atoi(string(c.text)) +} + +_ "whitespace" <- [ \n\t\r]* + +EOF <- !. diff --git a/vendor/github.com/PuerkitoBio/pigeon/examples/calculator/calculator_test.go b/vendor/github.com/PuerkitoBio/pigeon/examples/calculator/calculator_test.go new file mode 100644 index 0000000000..70a0767389 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/examples/calculator/calculator_test.go @@ -0,0 +1,176 @@ +package main + +import "testing" + +var longishExpr = ` +18 + 3 - 27012 * ( (1234 - 43) / 7 ) + -4 * 8129 +` + +var validCases = map[string]int{ + "0": 0, + "1": 1, + "-1": -1, + "10": 10, + "-10": -10, + + "(0)": 0, + "(1)": 1, + "(-1)": -1, + "(10)": 10, + "(-10)": -10, + + "1+1": 2, + "1-1": 0, + "1*1": 1, + "1/1": 1, + "1 + 1": 2, + "1 - 1": 0, + "1 * 1": 1, + "1 / 1": 1, + + "1+0": 1, + "1-0": 1, + "1*0": 0, + "1 + 0": 1, + "1 - 0": 1, + "1 * 0": 0, + + "1\n+\t2\r\n +\n3\n": 6, + "(2) * 3": 6, + + " 1 + 2 - 3 * 4 / 5 ": 1, + " 1 + (2 - 3) * 4 / 5 ": 1, + " (1 + 2 - 3) * 4 / 5 ": 0, + " 1 + 2 - (3 * 4) / 5 ": 1, + " 18 + 3 - 27 * (-18 / -3)": -141, + longishExpr: -4624535, +} + +func TestValidCases(t *testing.T) { + for tc, exp := range validCases { + got, err := Parse("", []byte(tc)) + if err != nil { + t.Errorf("%q: want no error, got %v", tc, err) + continue + } + goti, ok := got.(int) + if !ok { + t.Errorf("%q: want type %T, got %T", tc, exp, got) + continue + } + if exp != goti { + t.Errorf("%q: want %d, got %d", tc, exp, goti) + } + } +} + +var invalidCases = map[string]string{ + "": "1:1 (0): no match found", + "(": "1:1 (0): no match found", + ")": "1:1 (0): no match found", + "()": "1:1 (0): no match found", + "+": "1:1 (0): no match found", + "-": "1:1 (0): no match found", + "*": "1:1 (0): no match found", + "/": "1:1 (0): no match found", + "+1": "1:1 (0): no match found", + "*1": "1:1 (0): no match found", + "/1": "1:1 (0): no match found", + "1/0": "1:4 (3): rule Term: runtime error: integer divide by zero", + "1+": "1:1 (0): no match found", + "1-": "1:1 (0): no match found", + "1*": "1:1 (0): no match found", + "1/": "1:1 (0): no match found", + "1 (+ 2)": "1:1 (0): no match found", + "1 (2)": "1:1 (0): no match found", + "\xfe": "1:1 (0): invalid encoding", +} + +func TestInvalidCases(t *testing.T) { + for tc, exp := range invalidCases { + got, err := Parse("", []byte(tc)) + if err == nil { + t.Errorf("%q: want error, got none (%v)", tc, got) + continue + } + el, ok := err.(errList) + if !ok { + t.Errorf("%q: want error type %T, got %T", tc, &errList{}, err) + continue + } + for _, e := range el { + if _, ok := e.(*parserError); !ok { + t.Errorf("%q: want all individual errors to be %T, got %T (%[3]v)", tc, &parserError{}, e) + } + } + if exp != err.Error() { + t.Errorf("%q: want \n%s\n, got \n%s\n", tc, exp, err) + } + } +} + +func TestPanicNoRecover(t *testing.T) { + defer func() { + if e := recover(); e != nil { + // all good + return + } + t.Fatal("want panic, got none") + }() + + // should panic + Parse("", []byte("1 / 0"), Recover(false)) +} + +func TestMemoization(t *testing.T) { + in := " 2 + 35 * ( 18 - -4 / ( 5 + 1) ) * 456 + -1" + want := 287281 + + p := newParser("", []byte(in), Memoize(false)) + got, err := p.parse(g) + if err != nil { + t.Fatal(err) + } + goti := got.(int) + if goti != want { + t.Errorf("want %d, got %d", want, goti) + } + if p.exprCnt != 415 { + t.Errorf("with Memoize=false, want %d expressions evaluated, got %d", 415, p.exprCnt) + } + + p = newParser("", []byte(in), Memoize(true)) + got, err = p.parse(g) + if err != nil { + t.Fatal(err) + } + goti = got.(int) + if goti != want { + t.Errorf("want %d, got %d", want, goti) + } + if p.exprCnt != 389 { + t.Errorf("with Memoize=true, want %d expressions evaluated, got %d", 389, p.exprCnt) + } +} + +func BenchmarkPigeonCalculatorNoMemo(b *testing.B) { + d := []byte(longishExpr) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + if _, err := Parse("", d, Memoize(false)); err != nil { + b.Fatal(err) + } + } +} + +func BenchmarkPigeonCalculatorMemo(b *testing.B) { + d := []byte(longishExpr) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + if _, err := Parse("", d, Memoize(true)); err != nil { + b.Fatal(err) + } + } +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/examples/json/json.go b/vendor/github.com/PuerkitoBio/pigeon/examples/json/json.go new file mode 100644 index 0000000000..c06cb29ce6 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/examples/json/json.go @@ -0,0 +1,1624 @@ +// Command json parses JSON as defined by [1]. +// +// BUGS: the escaped forward solidus (`\/`) is not currently handled. +// +// [1]: http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf +package main + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "log" + "os" + "strconv" + "strings" + "unicode" + "unicode/utf8" +) + +func main() { + in := os.Stdin + nm := "stdin" + if len(os.Args) > 1 { + f, err := os.Open(os.Args[1]) + if err != nil { + log.Fatal(err) + } + defer f.Close() + in = f + nm = os.Args[1] + } + + got, err := ParseReader(nm, in) + if err != nil { + log.Fatal(err) + } + fmt.Println(got) +} + +func toIfaceSlice(v interface{}) []interface{} { + if v == nil { + return nil + } + return v.([]interface{}) +} + +var g = &grammar{ + rules: []*rule{ + { + name: "JSON", + pos: position{line: 37, col: 1, offset: 702}, + expr: &actionExpr{ + pos: position{line: 37, col: 8, offset: 711}, + run: (*parser).callonJSON1, + expr: &seqExpr{ + pos: position{line: 37, col: 8, offset: 711}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 37, col: 8, offset: 711}, + name: "_", + }, + &labeledExpr{ + pos: position{line: 37, col: 10, offset: 713}, + label: "vals", + expr: &oneOrMoreExpr{ + pos: position{line: 37, col: 15, offset: 718}, + expr: &ruleRefExpr{ + pos: position{line: 37, col: 15, offset: 718}, + name: "Value", + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 37, col: 22, offset: 725}, + name: "EOF", + }, + }, + }, + }, + }, + { + name: "Value", + pos: position{line: 49, col: 1, offset: 916}, + expr: &actionExpr{ + pos: position{line: 49, col: 9, offset: 926}, + run: (*parser).callonValue1, + expr: &seqExpr{ + pos: position{line: 49, col: 9, offset: 926}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 49, col: 9, offset: 926}, + label: "val", + expr: &choiceExpr{ + pos: position{line: 49, col: 15, offset: 932}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 49, col: 15, offset: 932}, + name: "Object", + }, + &ruleRefExpr{ + pos: position{line: 49, col: 24, offset: 941}, + name: "Array", + }, + &ruleRefExpr{ + pos: position{line: 49, col: 32, offset: 949}, + name: "Number", + }, + &ruleRefExpr{ + pos: position{line: 49, col: 41, offset: 958}, + name: "String", + }, + &ruleRefExpr{ + pos: position{line: 49, col: 50, offset: 967}, + name: "Bool", + }, + &ruleRefExpr{ + pos: position{line: 49, col: 57, offset: 974}, + name: "Null", + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 49, col: 64, offset: 981}, + name: "_", + }, + }, + }, + }, + }, + { + name: "Object", + pos: position{line: 53, col: 1, offset: 1008}, + expr: &actionExpr{ + pos: position{line: 53, col: 10, offset: 1019}, + run: (*parser).callonObject1, + expr: &seqExpr{ + pos: position{line: 53, col: 10, offset: 1019}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 53, col: 10, offset: 1019}, + val: "{", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 53, col: 14, offset: 1023}, + name: "_", + }, + &labeledExpr{ + pos: position{line: 53, col: 16, offset: 1025}, + label: "vals", + expr: &zeroOrOneExpr{ + pos: position{line: 53, col: 21, offset: 1030}, + expr: &seqExpr{ + pos: position{line: 53, col: 23, offset: 1032}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 53, col: 23, offset: 1032}, + name: "String", + }, + &ruleRefExpr{ + pos: position{line: 53, col: 30, offset: 1039}, + name: "_", + }, + &litMatcher{ + pos: position{line: 53, col: 32, offset: 1041}, + val: ":", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 53, col: 36, offset: 1045}, + name: "_", + }, + &ruleRefExpr{ + pos: position{line: 53, col: 38, offset: 1047}, + name: "Value", + }, + &zeroOrMoreExpr{ + pos: position{line: 53, col: 44, offset: 1053}, + expr: &seqExpr{ + pos: position{line: 53, col: 46, offset: 1055}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 53, col: 46, offset: 1055}, + val: ",", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 53, col: 50, offset: 1059}, + name: "_", + }, + &ruleRefExpr{ + pos: position{line: 53, col: 52, offset: 1061}, + name: "String", + }, + &ruleRefExpr{ + pos: position{line: 53, col: 59, offset: 1068}, + name: "_", + }, + &litMatcher{ + pos: position{line: 53, col: 61, offset: 1070}, + val: ":", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 53, col: 65, offset: 1074}, + name: "_", + }, + &ruleRefExpr{ + pos: position{line: 53, col: 67, offset: 1076}, + name: "Value", + }, + }, + }, + }, + }, + }, + }, + }, + &litMatcher{ + pos: position{line: 53, col: 79, offset: 1088}, + val: "}", + ignoreCase: false, + }, + }, + }, + }, + }, + { + name: "Array", + pos: position{line: 68, col: 1, offset: 1430}, + expr: &actionExpr{ + pos: position{line: 68, col: 9, offset: 1440}, + run: (*parser).callonArray1, + expr: &seqExpr{ + pos: position{line: 68, col: 9, offset: 1440}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 68, col: 9, offset: 1440}, + val: "[", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 68, col: 13, offset: 1444}, + name: "_", + }, + &labeledExpr{ + pos: position{line: 68, col: 15, offset: 1446}, + label: "vals", + expr: &zeroOrOneExpr{ + pos: position{line: 68, col: 20, offset: 1451}, + expr: &seqExpr{ + pos: position{line: 68, col: 22, offset: 1453}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 68, col: 22, offset: 1453}, + name: "Value", + }, + &zeroOrMoreExpr{ + pos: position{line: 68, col: 28, offset: 1459}, + expr: &seqExpr{ + pos: position{line: 68, col: 30, offset: 1461}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 68, col: 30, offset: 1461}, + val: ",", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 68, col: 34, offset: 1465}, + name: "_", + }, + &ruleRefExpr{ + pos: position{line: 68, col: 36, offset: 1467}, + name: "Value", + }, + }, + }, + }, + }, + }, + }, + }, + &litMatcher{ + pos: position{line: 68, col: 48, offset: 1479}, + val: "]", + ignoreCase: false, + }, + }, + }, + }, + }, + { + name: "Number", + pos: position{line: 82, col: 1, offset: 1785}, + expr: &actionExpr{ + pos: position{line: 82, col: 10, offset: 1796}, + run: (*parser).callonNumber1, + expr: &seqExpr{ + pos: position{line: 82, col: 10, offset: 1796}, + exprs: []interface{}{ + &zeroOrOneExpr{ + pos: position{line: 82, col: 10, offset: 1796}, + expr: &litMatcher{ + pos: position{line: 82, col: 10, offset: 1796}, + val: "-", + ignoreCase: false, + }, + }, + &ruleRefExpr{ + pos: position{line: 82, col: 15, offset: 1801}, + name: "Integer", + }, + &zeroOrOneExpr{ + pos: position{line: 82, col: 23, offset: 1809}, + expr: &seqExpr{ + pos: position{line: 82, col: 25, offset: 1811}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 82, col: 25, offset: 1811}, + val: ".", + ignoreCase: false, + }, + &oneOrMoreExpr{ + pos: position{line: 82, col: 29, offset: 1815}, + expr: &ruleRefExpr{ + pos: position{line: 82, col: 29, offset: 1815}, + name: "DecimalDigit", + }, + }, + }, + }, + }, + &zeroOrOneExpr{ + pos: position{line: 82, col: 46, offset: 1832}, + expr: &ruleRefExpr{ + pos: position{line: 82, col: 46, offset: 1832}, + name: "Exponent", + }, + }, + }, + }, + }, + }, + { + name: "Integer", + pos: position{line: 88, col: 1, offset: 1987}, + expr: &choiceExpr{ + pos: position{line: 88, col: 11, offset: 1999}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 88, col: 11, offset: 1999}, + val: "0", + ignoreCase: false, + }, + &seqExpr{ + pos: position{line: 88, col: 17, offset: 2005}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 88, col: 17, offset: 2005}, + name: "NonZeroDecimalDigit", + }, + &zeroOrMoreExpr{ + pos: position{line: 88, col: 37, offset: 2025}, + expr: &ruleRefExpr{ + pos: position{line: 88, col: 37, offset: 2025}, + name: "DecimalDigit", + }, + }, + }, + }, + }, + }, + }, + { + name: "Exponent", + pos: position{line: 90, col: 1, offset: 2040}, + expr: &seqExpr{ + pos: position{line: 90, col: 12, offset: 2053}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 90, col: 12, offset: 2053}, + val: "e", + ignoreCase: true, + }, + &zeroOrOneExpr{ + pos: position{line: 90, col: 17, offset: 2058}, + expr: &charClassMatcher{ + pos: position{line: 90, col: 17, offset: 2058}, + val: "[+-]", + chars: []rune{'+', '-'}, + ignoreCase: false, + inverted: false, + }, + }, + &oneOrMoreExpr{ + pos: position{line: 90, col: 23, offset: 2064}, + expr: &ruleRefExpr{ + pos: position{line: 90, col: 23, offset: 2064}, + name: "DecimalDigit", + }, + }, + }, + }, + }, + { + name: "String", + pos: position{line: 92, col: 1, offset: 2079}, + expr: &actionExpr{ + pos: position{line: 92, col: 10, offset: 2090}, + run: (*parser).callonString1, + expr: &seqExpr{ + pos: position{line: 92, col: 10, offset: 2090}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 92, col: 10, offset: 2090}, + val: "\"", + ignoreCase: false, + }, + &zeroOrMoreExpr{ + pos: position{line: 92, col: 14, offset: 2094}, + expr: &choiceExpr{ + pos: position{line: 92, col: 16, offset: 2096}, + alternatives: []interface{}{ + &seqExpr{ + pos: position{line: 92, col: 16, offset: 2096}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 92, col: 16, offset: 2096}, + expr: &ruleRefExpr{ + pos: position{line: 92, col: 17, offset: 2097}, + name: "EscapedChar", + }, + }, + &anyMatcher{ + line: 92, col: 29, offset: 2109, + }, + }, + }, + &seqExpr{ + pos: position{line: 92, col: 33, offset: 2113}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 92, col: 33, offset: 2113}, + val: "\\", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 92, col: 38, offset: 2118}, + name: "EscapeSequence", + }, + }, + }, + }, + }, + }, + &litMatcher{ + pos: position{line: 92, col: 56, offset: 2136}, + val: "\"", + ignoreCase: false, + }, + }, + }, + }, + }, + { + name: "EscapedChar", + pos: position{line: 98, col: 1, offset: 2308}, + expr: &charClassMatcher{ + pos: position{line: 98, col: 15, offset: 2324}, + val: "[\\x00-\\x1f\"\\\\]", + chars: []rune{'"', '\\'}, + ranges: []rune{'\x00', '\x1f'}, + ignoreCase: false, + inverted: false, + }, + }, + { + name: "EscapeSequence", + pos: position{line: 100, col: 1, offset: 2340}, + expr: &choiceExpr{ + pos: position{line: 100, col: 18, offset: 2359}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 100, col: 18, offset: 2359}, + name: "SingleCharEscape", + }, + &ruleRefExpr{ + pos: position{line: 100, col: 37, offset: 2378}, + name: "UnicodeEscape", + }, + }, + }, + }, + { + name: "SingleCharEscape", + pos: position{line: 102, col: 1, offset: 2393}, + expr: &charClassMatcher{ + pos: position{line: 102, col: 20, offset: 2414}, + val: "[\"\\\\/bfnrt]", + chars: []rune{'"', '\\', '/', 'b', 'f', 'n', 'r', 't'}, + ignoreCase: false, + inverted: false, + }, + }, + { + name: "UnicodeEscape", + pos: position{line: 104, col: 1, offset: 2427}, + expr: &seqExpr{ + pos: position{line: 104, col: 17, offset: 2445}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 104, col: 17, offset: 2445}, + val: "u", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 104, col: 21, offset: 2449}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 104, col: 30, offset: 2458}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 104, col: 39, offset: 2467}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 104, col: 48, offset: 2476}, + name: "HexDigit", + }, + }, + }, + }, + { + name: "DecimalDigit", + pos: position{line: 106, col: 1, offset: 2486}, + expr: &charClassMatcher{ + pos: position{line: 106, col: 16, offset: 2503}, + val: "[0-9]", + ranges: []rune{'0', '9'}, + ignoreCase: false, + inverted: false, + }, + }, + { + name: "NonZeroDecimalDigit", + pos: position{line: 108, col: 1, offset: 2510}, + expr: &charClassMatcher{ + pos: position{line: 108, col: 23, offset: 2534}, + val: "[1-9]", + ranges: []rune{'1', '9'}, + ignoreCase: false, + inverted: false, + }, + }, + { + name: "HexDigit", + pos: position{line: 110, col: 1, offset: 2541}, + expr: &charClassMatcher{ + pos: position{line: 110, col: 12, offset: 2554}, + val: "[0-9a-f]i", + ranges: []rune{'0', '9', 'a', 'f'}, + ignoreCase: true, + inverted: false, + }, + }, + { + name: "Bool", + pos: position{line: 112, col: 1, offset: 2565}, + expr: &choiceExpr{ + pos: position{line: 112, col: 8, offset: 2574}, + alternatives: []interface{}{ + &actionExpr{ + pos: position{line: 112, col: 8, offset: 2574}, + run: (*parser).callonBool2, + expr: &litMatcher{ + pos: position{line: 112, col: 8, offset: 2574}, + val: "true", + ignoreCase: false, + }, + }, + &actionExpr{ + pos: position{line: 112, col: 38, offset: 2604}, + run: (*parser).callonBool4, + expr: &litMatcher{ + pos: position{line: 112, col: 38, offset: 2604}, + val: "false", + ignoreCase: false, + }, + }, + }, + }, + }, + { + name: "Null", + pos: position{line: 114, col: 1, offset: 2635}, + expr: &actionExpr{ + pos: position{line: 114, col: 8, offset: 2644}, + run: (*parser).callonNull1, + expr: &litMatcher{ + pos: position{line: 114, col: 8, offset: 2644}, + val: "null", + ignoreCase: false, + }, + }, + }, + { + name: "_", + displayName: "\"whitespace\"", + pos: position{line: 116, col: 1, offset: 2672}, + expr: &zeroOrMoreExpr{ + pos: position{line: 116, col: 18, offset: 2691}, + expr: &charClassMatcher{ + pos: position{line: 116, col: 18, offset: 2691}, + val: "[ \\t\\r\\n]", + chars: []rune{' ', '\t', '\r', '\n'}, + ignoreCase: false, + inverted: false, + }, + }, + }, + { + name: "EOF", + pos: position{line: 118, col: 1, offset: 2703}, + expr: ¬Expr{ + pos: position{line: 118, col: 7, offset: 2711}, + expr: &anyMatcher{ + line: 118, col: 8, offset: 2712, + }, + }, + }, + }, +} + +func (c *current) onJSON1(vals interface{}) (interface{}, error) { + valsSl := toIfaceSlice(vals) + switch len(valsSl) { + case 0: + return nil, nil + case 1: + return valsSl[0], nil + default: + return valsSl, nil + } +} + +func (p *parser) callonJSON1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onJSON1(stack["vals"]) +} + +func (c *current) onValue1(val interface{}) (interface{}, error) { + return val, nil +} + +func (p *parser) callonValue1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onValue1(stack["val"]) +} + +func (c *current) onObject1(vals interface{}) (interface{}, error) { + res := make(map[string]interface{}) + valsSl := toIfaceSlice(vals) + if len(valsSl) == 0 { + return res, nil + } + res[valsSl[0].(string)] = valsSl[4] + restSl := toIfaceSlice(valsSl[5]) + for _, v := range restSl { + vSl := toIfaceSlice(v) + res[vSl[2].(string)] = vSl[6] + } + return res, nil +} + +func (p *parser) callonObject1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onObject1(stack["vals"]) +} + +func (c *current) onArray1(vals interface{}) (interface{}, error) { + valsSl := toIfaceSlice(vals) + if len(valsSl) == 0 { + return []interface{}{}, nil + } + res := []interface{}{valsSl[0]} + restSl := toIfaceSlice(valsSl[1]) + for _, v := range restSl { + vSl := toIfaceSlice(v) + res = append(res, vSl[2]) + } + return res, nil +} + +func (p *parser) callonArray1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onArray1(stack["vals"]) +} + +func (c *current) onNumber1() (interface{}, error) { + // JSON numbers have the same syntax as Go's, and are parseable using + // strconv. + return strconv.ParseFloat(string(c.text), 64) +} + +func (p *parser) callonNumber1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onNumber1() +} + +func (c *current) onString1() (interface{}, error) { + // TODO : the forward slash (solidus) is not a valid escape in Go, it will + // fail if there's one in the string + return strconv.Unquote(string(c.text)) +} + +func (p *parser) callonString1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onString1() +} + +func (c *current) onBool2() (interface{}, error) { + return true, nil +} + +func (p *parser) callonBool2() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onBool2() +} + +func (c *current) onBool4() (interface{}, error) { + return false, nil +} + +func (p *parser) callonBool4() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onBool4() +} + +func (c *current) onNull1() (interface{}, error) { + return nil, nil +} + +func (p *parser) callonNull1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onNull1() +} + +var ( + // errNoRule is returned when the grammar to parse has no rule. + errNoRule = errors.New("grammar has no rule") + + // errInvalidEncoding is returned when the source is not properly + // utf8-encoded. + errInvalidEncoding = errors.New("invalid encoding") + + // errNoMatch is returned if no match could be found. + errNoMatch = errors.New("no match found") +) + +// Option is a function that can set an option on the parser. It returns +// the previous setting as an Option. +type Option func(*parser) Option + +// Debug creates an Option to set the debug flag to b. When set to true, +// debugging information is printed to stdout while parsing. +// +// The default is false. +func Debug(b bool) Option { + return func(p *parser) Option { + old := p.debug + p.debug = b + return Debug(old) + } +} + +// Memoize creates an Option to set the memoize flag to b. When set to true, +// the parser will cache all results so each expression is evaluated only +// once. This guarantees linear parsing time even for pathological cases, +// at the expense of more memory and slower times for typical cases. +// +// The default is false. +func Memoize(b bool) Option { + return func(p *parser) Option { + old := p.memoize + p.memoize = b + return Memoize(old) + } +} + +// Recover creates an Option to set the recover flag to b. When set to +// true, this causes the parser to recover from panics and convert it +// to an error. Setting it to false can be useful while debugging to +// access the full stack trace. +// +// The default is true. +func Recover(b bool) Option { + return func(p *parser) Option { + old := p.recover + p.recover = b + return Recover(old) + } +} + +// ParseFile parses the file identified by filename. +func ParseFile(filename string, opts ...Option) (interface{}, error) { + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + return ParseReader(filename, f, opts...) +} + +// ParseReader parses the data from r using filename as information in the +// error messages. +func ParseReader(filename string, r io.Reader, opts ...Option) (interface{}, error) { + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + + return Parse(filename, b, opts...) +} + +// Parse parses the data from b using filename as information in the +// error messages. +func Parse(filename string, b []byte, opts ...Option) (interface{}, error) { + return newParser(filename, b, opts...).parse(g) +} + +// position records a position in the text. +type position struct { + line, col, offset int +} + +func (p position) String() string { + return fmt.Sprintf("%d:%d [%d]", p.line, p.col, p.offset) +} + +// savepoint stores all state required to go back to this point in the +// parser. +type savepoint struct { + position + rn rune + w int +} + +type current struct { + pos position // start position of the match + text []byte // raw text of the match +} + +// the AST types... + +type grammar struct { + pos position + rules []*rule +} + +type rule struct { + pos position + name string + displayName string + expr interface{} +} + +type choiceExpr struct { + pos position + alternatives []interface{} +} + +type actionExpr struct { + pos position + expr interface{} + run func(*parser) (interface{}, error) +} + +type seqExpr struct { + pos position + exprs []interface{} +} + +type labeledExpr struct { + pos position + label string + expr interface{} +} + +type expr struct { + pos position + expr interface{} +} + +type andExpr expr +type notExpr expr +type zeroOrOneExpr expr +type zeroOrMoreExpr expr +type oneOrMoreExpr expr + +type ruleRefExpr struct { + pos position + name string +} + +type andCodeExpr struct { + pos position + run func(*parser) (bool, error) +} + +type notCodeExpr struct { + pos position + run func(*parser) (bool, error) +} + +type litMatcher struct { + pos position + val string + ignoreCase bool +} + +type charClassMatcher struct { + pos position + val string + chars []rune + ranges []rune + classes []*unicode.RangeTable + ignoreCase bool + inverted bool +} + +type anyMatcher position + +// errList cumulates the errors found by the parser. +type errList []error + +func (e *errList) add(err error) { + *e = append(*e, err) +} + +func (e errList) err() error { + if len(e) == 0 { + return nil + } + e.dedupe() + return e +} + +func (e *errList) dedupe() { + var cleaned []error + set := make(map[string]bool) + for _, err := range *e { + if msg := err.Error(); !set[msg] { + set[msg] = true + cleaned = append(cleaned, err) + } + } + *e = cleaned +} + +func (e errList) Error() string { + switch len(e) { + case 0: + return "" + case 1: + return e[0].Error() + default: + var buf bytes.Buffer + + for i, err := range e { + if i > 0 { + buf.WriteRune('\n') + } + buf.WriteString(err.Error()) + } + return buf.String() + } +} + +// parserError wraps an error with a prefix indicating the rule in which +// the error occurred. The original error is stored in the Inner field. +type parserError struct { + Inner error + pos position + prefix string +} + +// Error returns the error message. +func (p *parserError) Error() string { + return p.prefix + ": " + p.Inner.Error() +} + +// newParser creates a parser with the specified input source and options. +func newParser(filename string, b []byte, opts ...Option) *parser { + p := &parser{ + filename: filename, + errs: new(errList), + data: b, + pt: savepoint{position: position{line: 1}}, + recover: true, + } + p.setOptions(opts) + return p +} + +// setOptions applies the options to the parser. +func (p *parser) setOptions(opts []Option) { + for _, opt := range opts { + opt(p) + } +} + +type resultTuple struct { + v interface{} + b bool + end savepoint +} + +type parser struct { + filename string + pt savepoint + cur current + + data []byte + errs *errList + + recover bool + debug bool + depth int + + memoize bool + // memoization table for the packrat algorithm: + // map[offset in source] map[expression or rule] {value, match} + memo map[int]map[interface{}]resultTuple + + // rules table, maps the rule identifier to the rule node + rules map[string]*rule + // variables stack, map of label to value + vstack []map[string]interface{} + // rule stack, allows identification of the current rule in errors + rstack []*rule + + // stats + exprCnt int +} + +// push a variable set on the vstack. +func (p *parser) pushV() { + if cap(p.vstack) == len(p.vstack) { + // create new empty slot in the stack + p.vstack = append(p.vstack, nil) + } else { + // slice to 1 more + p.vstack = p.vstack[:len(p.vstack)+1] + } + + // get the last args set + m := p.vstack[len(p.vstack)-1] + if m != nil && len(m) == 0 { + // empty map, all good + return + } + + m = make(map[string]interface{}) + p.vstack[len(p.vstack)-1] = m +} + +// pop a variable set from the vstack. +func (p *parser) popV() { + // if the map is not empty, clear it + m := p.vstack[len(p.vstack)-1] + if len(m) > 0 { + // GC that map + p.vstack[len(p.vstack)-1] = nil + } + p.vstack = p.vstack[:len(p.vstack)-1] +} + +func (p *parser) print(prefix, s string) string { + if !p.debug { + return s + } + + fmt.Printf("%s %d:%d:%d: %s [%#U]\n", + prefix, p.pt.line, p.pt.col, p.pt.offset, s, p.pt.rn) + return s +} + +func (p *parser) in(s string) string { + p.depth++ + return p.print(strings.Repeat(" ", p.depth)+">", s) +} + +func (p *parser) out(s string) string { + p.depth-- + return p.print(strings.Repeat(" ", p.depth)+"<", s) +} + +func (p *parser) addErr(err error) { + p.addErrAt(err, p.pt.position) +} + +func (p *parser) addErrAt(err error, pos position) { + var buf bytes.Buffer + if p.filename != "" { + buf.WriteString(p.filename) + } + if buf.Len() > 0 { + buf.WriteString(":") + } + buf.WriteString(fmt.Sprintf("%d:%d (%d)", pos.line, pos.col, pos.offset)) + if len(p.rstack) > 0 { + if buf.Len() > 0 { + buf.WriteString(": ") + } + rule := p.rstack[len(p.rstack)-1] + if rule.displayName != "" { + buf.WriteString("rule " + rule.displayName) + } else { + buf.WriteString("rule " + rule.name) + } + } + pe := &parserError{Inner: err, prefix: buf.String()} + p.errs.add(pe) +} + +// read advances the parser to the next rune. +func (p *parser) read() { + p.pt.offset += p.pt.w + rn, n := utf8.DecodeRune(p.data[p.pt.offset:]) + p.pt.rn = rn + p.pt.w = n + p.pt.col++ + if rn == '\n' { + p.pt.line++ + p.pt.col = 0 + } + + if rn == utf8.RuneError { + if n > 0 { + p.addErr(errInvalidEncoding) + } + } +} + +// restore parser position to the savepoint pt. +func (p *parser) restore(pt savepoint) { + if p.debug { + defer p.out(p.in("restore")) + } + if pt.offset == p.pt.offset { + return + } + p.pt = pt +} + +// get the slice of bytes from the savepoint start to the current position. +func (p *parser) sliceFrom(start savepoint) []byte { + return p.data[start.position.offset:p.pt.position.offset] +} + +func (p *parser) getMemoized(node interface{}) (resultTuple, bool) { + if len(p.memo) == 0 { + return resultTuple{}, false + } + m := p.memo[p.pt.offset] + if len(m) == 0 { + return resultTuple{}, false + } + res, ok := m[node] + return res, ok +} + +func (p *parser) setMemoized(pt savepoint, node interface{}, tuple resultTuple) { + if p.memo == nil { + p.memo = make(map[int]map[interface{}]resultTuple) + } + m := p.memo[pt.offset] + if m == nil { + m = make(map[interface{}]resultTuple) + p.memo[pt.offset] = m + } + m[node] = tuple +} + +func (p *parser) buildRulesTable(g *grammar) { + p.rules = make(map[string]*rule, len(g.rules)) + for _, r := range g.rules { + p.rules[r.name] = r + } +} + +func (p *parser) parse(g *grammar) (val interface{}, err error) { + if len(g.rules) == 0 { + p.addErr(errNoRule) + return nil, p.errs.err() + } + + // TODO : not super critical but this could be generated + p.buildRulesTable(g) + + if p.recover { + // panic can be used in action code to stop parsing immediately + // and return the panic as an error. + defer func() { + if e := recover(); e != nil { + if p.debug { + defer p.out(p.in("panic handler")) + } + val = nil + switch e := e.(type) { + case error: + p.addErr(e) + default: + p.addErr(fmt.Errorf("%v", e)) + } + err = p.errs.err() + } + }() + } + + // start rule is rule [0] + p.read() // advance to first rune + val, ok := p.parseRule(g.rules[0]) + if !ok { + if len(*p.errs) == 0 { + // make sure this doesn't go out silently + p.addErr(errNoMatch) + } + return nil, p.errs.err() + } + return val, p.errs.err() +} + +func (p *parser) parseRule(rule *rule) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseRule " + rule.name)) + } + + if p.memoize { + res, ok := p.getMemoized(rule) + if ok { + p.restore(res.end) + return res.v, res.b + } + } + + start := p.pt + p.rstack = append(p.rstack, rule) + p.pushV() + val, ok := p.parseExpr(rule.expr) + p.popV() + p.rstack = p.rstack[:len(p.rstack)-1] + if ok && p.debug { + p.print(strings.Repeat(" ", p.depth)+"MATCH", string(p.sliceFrom(start))) + } + + if p.memoize { + p.setMemoized(start, rule, resultTuple{val, ok, p.pt}) + } + return val, ok +} + +func (p *parser) parseExpr(expr interface{}) (interface{}, bool) { + var pt savepoint + var ok bool + + if p.memoize { + res, ok := p.getMemoized(expr) + if ok { + p.restore(res.end) + return res.v, res.b + } + pt = p.pt + } + + p.exprCnt++ + var val interface{} + switch expr := expr.(type) { + case *actionExpr: + val, ok = p.parseActionExpr(expr) + case *andCodeExpr: + val, ok = p.parseAndCodeExpr(expr) + case *andExpr: + val, ok = p.parseAndExpr(expr) + case *anyMatcher: + val, ok = p.parseAnyMatcher(expr) + case *charClassMatcher: + val, ok = p.parseCharClassMatcher(expr) + case *choiceExpr: + val, ok = p.parseChoiceExpr(expr) + case *labeledExpr: + val, ok = p.parseLabeledExpr(expr) + case *litMatcher: + val, ok = p.parseLitMatcher(expr) + case *notCodeExpr: + val, ok = p.parseNotCodeExpr(expr) + case *notExpr: + val, ok = p.parseNotExpr(expr) + case *oneOrMoreExpr: + val, ok = p.parseOneOrMoreExpr(expr) + case *ruleRefExpr: + val, ok = p.parseRuleRefExpr(expr) + case *seqExpr: + val, ok = p.parseSeqExpr(expr) + case *zeroOrMoreExpr: + val, ok = p.parseZeroOrMoreExpr(expr) + case *zeroOrOneExpr: + val, ok = p.parseZeroOrOneExpr(expr) + default: + panic(fmt.Sprintf("unknown expression type %T", expr)) + } + if p.memoize { + p.setMemoized(pt, expr, resultTuple{val, ok, p.pt}) + } + return val, ok +} + +func (p *parser) parseActionExpr(act *actionExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseActionExpr")) + } + + start := p.pt + val, ok := p.parseExpr(act.expr) + if ok { + p.cur.pos = start.position + p.cur.text = p.sliceFrom(start) + actVal, err := act.run(p) + if err != nil { + p.addErrAt(err, start.position) + } + val = actVal + } + if ok && p.debug { + p.print(strings.Repeat(" ", p.depth)+"MATCH", string(p.sliceFrom(start))) + } + return val, ok +} + +func (p *parser) parseAndCodeExpr(and *andCodeExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAndCodeExpr")) + } + + ok, err := and.run(p) + if err != nil { + p.addErr(err) + } + return nil, ok +} + +func (p *parser) parseAndExpr(and *andExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAndExpr")) + } + + pt := p.pt + p.pushV() + _, ok := p.parseExpr(and.expr) + p.popV() + p.restore(pt) + return nil, ok +} + +func (p *parser) parseAnyMatcher(any *anyMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAnyMatcher")) + } + + if p.pt.rn != utf8.RuneError { + start := p.pt + p.read() + return p.sliceFrom(start), true + } + return nil, false +} + +func (p *parser) parseCharClassMatcher(chr *charClassMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseCharClassMatcher")) + } + + cur := p.pt.rn + // can't match EOF + if cur == utf8.RuneError { + return nil, false + } + start := p.pt + if chr.ignoreCase { + cur = unicode.ToLower(cur) + } + + // try to match in the list of available chars + for _, rn := range chr.chars { + if rn == cur { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + // try to match in the list of ranges + for i := 0; i < len(chr.ranges); i += 2 { + if cur >= chr.ranges[i] && cur <= chr.ranges[i+1] { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + // try to match in the list of Unicode classes + for _, cl := range chr.classes { + if unicode.Is(cl, cur) { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + if chr.inverted { + p.read() + return p.sliceFrom(start), true + } + return nil, false +} + +func (p *parser) parseChoiceExpr(ch *choiceExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseChoiceExpr")) + } + + for _, alt := range ch.alternatives { + p.pushV() + val, ok := p.parseExpr(alt) + p.popV() + if ok { + return val, ok + } + } + return nil, false +} + +func (p *parser) parseLabeledExpr(lab *labeledExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseLabeledExpr")) + } + + p.pushV() + val, ok := p.parseExpr(lab.expr) + p.popV() + if ok && lab.label != "" { + m := p.vstack[len(p.vstack)-1] + m[lab.label] = val + } + return val, ok +} + +func (p *parser) parseLitMatcher(lit *litMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseLitMatcher")) + } + + start := p.pt + for _, want := range lit.val { + cur := p.pt.rn + if lit.ignoreCase { + cur = unicode.ToLower(cur) + } + if cur != want { + p.restore(start) + return nil, false + } + p.read() + } + return p.sliceFrom(start), true +} + +func (p *parser) parseNotCodeExpr(not *notCodeExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseNotCodeExpr")) + } + + ok, err := not.run(p) + if err != nil { + p.addErr(err) + } + return nil, !ok +} + +func (p *parser) parseNotExpr(not *notExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseNotExpr")) + } + + pt := p.pt + p.pushV() + _, ok := p.parseExpr(not.expr) + p.popV() + p.restore(pt) + return nil, !ok +} + +func (p *parser) parseOneOrMoreExpr(expr *oneOrMoreExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseOneOrMoreExpr")) + } + + var vals []interface{} + + for { + p.pushV() + val, ok := p.parseExpr(expr.expr) + p.popV() + if !ok { + if len(vals) == 0 { + // did not match once, no match + return nil, false + } + return vals, true + } + vals = append(vals, val) + } +} + +func (p *parser) parseRuleRefExpr(ref *ruleRefExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseRuleRefExpr " + ref.name)) + } + + if ref.name == "" { + panic(fmt.Sprintf("%s: invalid rule: missing name", ref.pos)) + } + + rule := p.rules[ref.name] + if rule == nil { + p.addErr(fmt.Errorf("undefined rule: %s", ref.name)) + return nil, false + } + return p.parseRule(rule) +} + +func (p *parser) parseSeqExpr(seq *seqExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseSeqExpr")) + } + + var vals []interface{} + + pt := p.pt + for _, expr := range seq.exprs { + val, ok := p.parseExpr(expr) + if !ok { + p.restore(pt) + return nil, false + } + vals = append(vals, val) + } + return vals, true +} + +func (p *parser) parseZeroOrMoreExpr(expr *zeroOrMoreExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseZeroOrMoreExpr")) + } + + var vals []interface{} + + for { + p.pushV() + val, ok := p.parseExpr(expr.expr) + p.popV() + if !ok { + return vals, true + } + vals = append(vals, val) + } +} + +func (p *parser) parseZeroOrOneExpr(expr *zeroOrOneExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseZeroOrOneExpr")) + } + + p.pushV() + val, _ := p.parseExpr(expr.expr) + p.popV() + // whether it matched or not, consider it a match + return val, true +} + +func rangeTable(class string) *unicode.RangeTable { + if rt, ok := unicode.Categories[class]; ok { + return rt + } + if rt, ok := unicode.Properties[class]; ok { + return rt + } + if rt, ok := unicode.Scripts[class]; ok { + return rt + } + + // cannot happen + panic(fmt.Sprintf("invalid Unicode class: %s", class)) +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/examples/json/json.peg b/vendor/github.com/PuerkitoBio/pigeon/examples/json/json.peg new file mode 100644 index 0000000000..ecb80f49fc --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/examples/json/json.peg @@ -0,0 +1,118 @@ +{ +// Command json parses JSON as defined by [1]. +// +// BUGS: the escaped forward solidus (`\/`) is not currently handled. +// +// [1]: http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf +package main + +func main() { + in := os.Stdin + nm := "stdin" + if len(os.Args) > 1 { + f, err := os.Open(os.Args[1]) + if err != nil { + log.Fatal(err) + } + defer f.Close() + in = f + nm = os.Args[1] + } + + got, err := ParseReader(nm, in) + if err != nil { + log.Fatal(err) + } + fmt.Println(got) +} + +func toIfaceSlice(v interface{}) []interface{} { + if v == nil { + return nil + } + return v.([]interface{}) +} +} + +JSON ← _ vals:Value+ EOF { + valsSl := toIfaceSlice(vals) + switch len(valsSl) { + case 0: + return nil, nil + case 1: + return valsSl[0], nil + default: + return valsSl, nil + } +} + +Value ← val:( Object / Array / Number / String / Bool / Null ) _ { + return val, nil +} + +Object ← '{' _ vals:( String _ ':' _ Value ( ',' _ String _ ':' _ Value )* )? '}' { + res := make(map[string]interface{}) + valsSl := toIfaceSlice(vals) + if len(valsSl) == 0 { + return res, nil + } + res[valsSl[0].(string)] = valsSl[4] + restSl := toIfaceSlice(valsSl[5]) + for _, v := range restSl { + vSl := toIfaceSlice(v) + res[vSl[2].(string)] = vSl[6] + } + return res, nil +} + +Array ← '[' _ vals:( Value ( ',' _ Value )* )? ']' { + valsSl := toIfaceSlice(vals) + if len(valsSl) == 0 { + return []interface{}{}, nil + } + res := []interface{}{valsSl[0]} + restSl := toIfaceSlice(valsSl[1]) + for _, v := range restSl { + vSl := toIfaceSlice(v) + res = append(res, vSl[2]) + } + return res, nil +} + +Number ← '-'? Integer ( '.' DecimalDigit+ )? Exponent? { + // JSON numbers have the same syntax as Go's, and are parseable using + // strconv. + return strconv.ParseFloat(string(c.text), 64) +} + +Integer ← '0' / NonZeroDecimalDigit DecimalDigit* + +Exponent ← 'e'i [+-]? DecimalDigit+ + +String ← '"' ( !EscapedChar . / '\\' EscapeSequence )* '"' { + // TODO : the forward slash (solidus) is not a valid escape in Go, it will + // fail if there's one in the string + return strconv.Unquote(string(c.text)) +} + +EscapedChar ← [\x00-\x1f"\\] + +EscapeSequence ← SingleCharEscape / UnicodeEscape + +SingleCharEscape ← ["\\/bfnrt] + +UnicodeEscape ← 'u' HexDigit HexDigit HexDigit HexDigit + +DecimalDigit ← [0-9] + +NonZeroDecimalDigit ← [1-9] + +HexDigit ← [0-9a-f]i + +Bool ← "true" { return true, nil } / "false" { return false, nil } + +Null ← "null" { return nil, nil } + +_ "whitespace" ← [ \t\r\n]* + +EOF ← !. diff --git a/vendor/github.com/PuerkitoBio/pigeon/examples/json/json_test.go b/vendor/github.com/PuerkitoBio/pigeon/examples/json/json_test.go new file mode 100644 index 0000000000..f7bd662f15 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/examples/json/json_test.go @@ -0,0 +1,95 @@ +package main + +import ( + "encoding/json" + "io/ioutil" + "path/filepath" + "reflect" + "testing" +) + +func TestCmpStdlib(t *testing.T) { + files := testJSONFiles(t) + for _, file := range files { + pgot, err := ParseFile(file) + if err != nil { + t.Errorf("%s: pigeon.ParseFile: %v", file, err) + continue + } + + b, err := ioutil.ReadFile(file) + if err != nil { + t.Errorf("%s: ioutil.ReadAll: %v", file, err) + continue + } + var jgot interface{} + if err := json.Unmarshal(b, &jgot); err != nil { + t.Errorf("%s: json.Unmarshal: %v", file, err) + continue + } + + if !reflect.DeepEqual(pgot, jgot) { + t.Errorf("%s: not equal", file) + continue + } + } +} + +func testJSONFiles(t *testing.T) []string { + const rootDir = "testdata" + + fis, err := ioutil.ReadDir(rootDir) + if err != nil { + t.Fatal(err) + } + files := make([]string, 0, len(fis)) + for _, fi := range fis { + if filepath.Ext(fi.Name()) == ".json" { + files = append(files, filepath.Join(rootDir, fi.Name())) + } + } + return files +} + +func BenchmarkPigeonJSONNoMemo(b *testing.B) { + d, err := ioutil.ReadFile("testdata/github-octokit-repos.json") + if err != nil { + b.Fatal(err) + } + b.ResetTimer() + + for i := 0; i < b.N; i++ { + if _, err := Parse("", d, Memoize(false)); err != nil { + b.Fatal(err) + } + } +} + +func BenchmarkPigeonJSONMemo(b *testing.B) { + d, err := ioutil.ReadFile("testdata/github-octokit-repos.json") + if err != nil { + b.Fatal(err) + } + b.ResetTimer() + + for i := 0; i < b.N; i++ { + if _, err := Parse("", d, Memoize(true)); err != nil { + b.Fatal(err) + } + } +} + +func BenchmarkStdlibJSON(b *testing.B) { + d, err := ioutil.ReadFile("testdata/github-octokit-repos.json") + if err != nil { + b.Fatal(err) + } + b.ResetTimer() + + for i := 0; i < b.N; i++ { + var iface interface{} + if err := json.Unmarshal(d, &iface); err != nil { + b.Fatal(err) + } + } +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/examples/json/testdata/github-octocat-status1.json b/vendor/github.com/PuerkitoBio/pigeon/examples/json/testdata/github-octocat-status1.json new file mode 100644 index 0000000000..41b42e677b --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/examples/json/testdata/github-octocat-status1.json @@ -0,0 +1,3 @@ +[ + +] diff --git a/vendor/github.com/PuerkitoBio/pigeon/examples/json/testdata/github-octokit-repos.json b/vendor/github.com/PuerkitoBio/pigeon/examples/json/testdata/github-octokit-repos.json new file mode 100644 index 0000000000..0a5916fa4b --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/examples/json/testdata/github-octokit-repos.json @@ -0,0 +1,370 @@ +[ + { + "id": 417862, + "name": "octokit.rb", + "full_name": "octokit/octokit.rb", + "owner": { + "login": "octokit", + "id": 3430433, + "avatar_url": "https://avatars.githubusercontent.com/u/3430433?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/octokit", + "html_url": "https://github.com/octokit", + "followers_url": "https://api.github.com/users/octokit/followers", + "following_url": "https://api.github.com/users/octokit/following{/other_user}", + "gists_url": "https://api.github.com/users/octokit/gists{/gist_id}", + "starred_url": "https://api.github.com/users/octokit/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/octokit/subscriptions", + "organizations_url": "https://api.github.com/users/octokit/orgs", + "repos_url": "https://api.github.com/users/octokit/repos", + "events_url": "https://api.github.com/users/octokit/events{/privacy}", + "received_events_url": "https://api.github.com/users/octokit/received_events", + "type": "Organization", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/octokit/octokit.rb", + "description": "Ruby toolkit for the GitHub API", + "fork": false, + "url": "https://api.github.com/repos/octokit/octokit.rb", + "forks_url": "https://api.github.com/repos/octokit/octokit.rb/forks", + "keys_url": "https://api.github.com/repos/octokit/octokit.rb/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/octokit/octokit.rb/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/octokit/octokit.rb/teams", + "hooks_url": "https://api.github.com/repos/octokit/octokit.rb/hooks", + "issue_events_url": "https://api.github.com/repos/octokit/octokit.rb/issues/events{/number}", + "events_url": "https://api.github.com/repos/octokit/octokit.rb/events", + "assignees_url": "https://api.github.com/repos/octokit/octokit.rb/assignees{/user}", + "branches_url": "https://api.github.com/repos/octokit/octokit.rb/branches{/branch}", + "tags_url": "https://api.github.com/repos/octokit/octokit.rb/tags", + "blobs_url": "https://api.github.com/repos/octokit/octokit.rb/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/octokit/octokit.rb/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/octokit/octokit.rb/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/octokit/octokit.rb/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/octokit/octokit.rb/statuses/{sha}", + "languages_url": "https://api.github.com/repos/octokit/octokit.rb/languages", + "stargazers_url": "https://api.github.com/repos/octokit/octokit.rb/stargazers", + "contributors_url": "https://api.github.com/repos/octokit/octokit.rb/contributors", + "subscribers_url": "https://api.github.com/repos/octokit/octokit.rb/subscribers", + "subscription_url": "https://api.github.com/repos/octokit/octokit.rb/subscription", + "commits_url": "https://api.github.com/repos/octokit/octokit.rb/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/octokit/octokit.rb/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/octokit/octokit.rb/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/octokit/octokit.rb/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/octokit/octokit.rb/contents/{+path}", + "compare_url": "https://api.github.com/repos/octokit/octokit.rb/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/octokit/octokit.rb/merges", + "archive_url": "https://api.github.com/repos/octokit/octokit.rb/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/octokit/octokit.rb/downloads", + "issues_url": "https://api.github.com/repos/octokit/octokit.rb/issues{/number}", + "pulls_url": "https://api.github.com/repos/octokit/octokit.rb/pulls{/number}", + "milestones_url": "https://api.github.com/repos/octokit/octokit.rb/milestones{/number}", + "notifications_url": "https://api.github.com/repos/octokit/octokit.rb/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/octokit/octokit.rb/labels{/name}", + "releases_url": "https://api.github.com/repos/octokit/octokit.rb/releases{/id}", + "created_at": "2009-12-10T21:41:49Z", + "updated_at": "2015-04-02T15:26:33Z", + "pushed_at": "2015-03-25T01:12:36Z", + "git_url": "git://github.com/octokit/octokit.rb.git", + "ssh_url": "git@github.com:octokit/octokit.rb.git", + "clone_url": "https://github.com/octokit/octokit.rb.git", + "svn_url": "https://github.com/octokit/octokit.rb", + "homepage": "http://octokit.github.io/octokit.rb/", + "size": 16088, + "stargazers_count": 1845, + "watchers_count": 1845, + "language": "Ruby", + "has_issues": true, + "has_downloads": true, + "has_wiki": false, + "has_pages": true, + "forks_count": 401, + "mirror_url": null, + "open_issues_count": 5, + "forks": 401, + "open_issues": 5, + "watchers": 1845, + "default_branch": "master", + "permissions": { + "admin": false, + "push": false, + "pull": true + } + }, + { + "id": 7528679, + "name": "octokit.net", + "full_name": "octokit/octokit.net", + "owner": { + "login": "octokit", + "id": 3430433, + "avatar_url": "https://avatars.githubusercontent.com/u/3430433?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/octokit", + "html_url": "https://github.com/octokit", + "followers_url": "https://api.github.com/users/octokit/followers", + "following_url": "https://api.github.com/users/octokit/following{/other_user}", + "gists_url": "https://api.github.com/users/octokit/gists{/gist_id}", + "starred_url": "https://api.github.com/users/octokit/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/octokit/subscriptions", + "organizations_url": "https://api.github.com/users/octokit/orgs", + "repos_url": "https://api.github.com/users/octokit/repos", + "events_url": "https://api.github.com/users/octokit/events{/privacy}", + "received_events_url": "https://api.github.com/users/octokit/received_events", + "type": "Organization", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/octokit/octokit.net", + "description": "A GitHub API client library for .NET ", + "fork": false, + "url": "https://api.github.com/repos/octokit/octokit.net", + "forks_url": "https://api.github.com/repos/octokit/octokit.net/forks", + "keys_url": "https://api.github.com/repos/octokit/octokit.net/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/octokit/octokit.net/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/octokit/octokit.net/teams", + "hooks_url": "https://api.github.com/repos/octokit/octokit.net/hooks", + "issue_events_url": "https://api.github.com/repos/octokit/octokit.net/issues/events{/number}", + "events_url": "https://api.github.com/repos/octokit/octokit.net/events", + "assignees_url": "https://api.github.com/repos/octokit/octokit.net/assignees{/user}", + "branches_url": "https://api.github.com/repos/octokit/octokit.net/branches{/branch}", + "tags_url": "https://api.github.com/repos/octokit/octokit.net/tags", + "blobs_url": "https://api.github.com/repos/octokit/octokit.net/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/octokit/octokit.net/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/octokit/octokit.net/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/octokit/octokit.net/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/octokit/octokit.net/statuses/{sha}", + "languages_url": "https://api.github.com/repos/octokit/octokit.net/languages", + "stargazers_url": "https://api.github.com/repos/octokit/octokit.net/stargazers", + "contributors_url": "https://api.github.com/repos/octokit/octokit.net/contributors", + "subscribers_url": "https://api.github.com/repos/octokit/octokit.net/subscribers", + "subscription_url": "https://api.github.com/repos/octokit/octokit.net/subscription", + "commits_url": "https://api.github.com/repos/octokit/octokit.net/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/octokit/octokit.net/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/octokit/octokit.net/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/octokit/octokit.net/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/octokit/octokit.net/contents/{+path}", + "compare_url": "https://api.github.com/repos/octokit/octokit.net/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/octokit/octokit.net/merges", + "archive_url": "https://api.github.com/repos/octokit/octokit.net/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/octokit/octokit.net/downloads", + "issues_url": "https://api.github.com/repos/octokit/octokit.net/issues{/number}", + "pulls_url": "https://api.github.com/repos/octokit/octokit.net/pulls{/number}", + "milestones_url": "https://api.github.com/repos/octokit/octokit.net/milestones{/number}", + "notifications_url": "https://api.github.com/repos/octokit/octokit.net/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/octokit/octokit.net/labels{/name}", + "releases_url": "https://api.github.com/repos/octokit/octokit.net/releases{/id}", + "created_at": "2013-01-09T20:48:45Z", + "updated_at": "2015-04-02T18:10:11Z", + "pushed_at": "2015-04-03T11:47:52Z", + "git_url": "git://github.com/octokit/octokit.net.git", + "ssh_url": "git@github.com:octokit/octokit.net.git", + "clone_url": "https://github.com/octokit/octokit.net.git", + "svn_url": "https://github.com/octokit/octokit.net", + "homepage": null, + "size": 70529, + "stargazers_count": 637, + "watchers_count": 637, + "language": "C#", + "has_issues": true, + "has_downloads": true, + "has_wiki": false, + "has_pages": false, + "forks_count": 270, + "mirror_url": null, + "open_issues_count": 63, + "forks": 270, + "open_issues": 63, + "watchers": 637, + "default_branch": "master", + "permissions": { + "admin": false, + "push": false, + "pull": true + } + }, + { + "id": 7530454, + "name": "octokit.objc", + "full_name": "octokit/octokit.objc", + "owner": { + "login": "octokit", + "id": 3430433, + "avatar_url": "https://avatars.githubusercontent.com/u/3430433?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/octokit", + "html_url": "https://github.com/octokit", + "followers_url": "https://api.github.com/users/octokit/followers", + "following_url": "https://api.github.com/users/octokit/following{/other_user}", + "gists_url": "https://api.github.com/users/octokit/gists{/gist_id}", + "starred_url": "https://api.github.com/users/octokit/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/octokit/subscriptions", + "organizations_url": "https://api.github.com/users/octokit/orgs", + "repos_url": "https://api.github.com/users/octokit/repos", + "events_url": "https://api.github.com/users/octokit/events{/privacy}", + "received_events_url": "https://api.github.com/users/octokit/received_events", + "type": "Organization", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/octokit/octokit.objc", + "description": "GitHub API client for Objective-C", + "fork": false, + "url": "https://api.github.com/repos/octokit/octokit.objc", + "forks_url": "https://api.github.com/repos/octokit/octokit.objc/forks", + "keys_url": "https://api.github.com/repos/octokit/octokit.objc/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/octokit/octokit.objc/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/octokit/octokit.objc/teams", + "hooks_url": "https://api.github.com/repos/octokit/octokit.objc/hooks", + "issue_events_url": "https://api.github.com/repos/octokit/octokit.objc/issues/events{/number}", + "events_url": "https://api.github.com/repos/octokit/octokit.objc/events", + "assignees_url": "https://api.github.com/repos/octokit/octokit.objc/assignees{/user}", + "branches_url": "https://api.github.com/repos/octokit/octokit.objc/branches{/branch}", + "tags_url": "https://api.github.com/repos/octokit/octokit.objc/tags", + "blobs_url": "https://api.github.com/repos/octokit/octokit.objc/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/octokit/octokit.objc/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/octokit/octokit.objc/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/octokit/octokit.objc/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/octokit/octokit.objc/statuses/{sha}", + "languages_url": "https://api.github.com/repos/octokit/octokit.objc/languages", + "stargazers_url": "https://api.github.com/repos/octokit/octokit.objc/stargazers", + "contributors_url": "https://api.github.com/repos/octokit/octokit.objc/contributors", + "subscribers_url": "https://api.github.com/repos/octokit/octokit.objc/subscribers", + "subscription_url": "https://api.github.com/repos/octokit/octokit.objc/subscription", + "commits_url": "https://api.github.com/repos/octokit/octokit.objc/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/octokit/octokit.objc/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/octokit/octokit.objc/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/octokit/octokit.objc/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/octokit/octokit.objc/contents/{+path}", + "compare_url": "https://api.github.com/repos/octokit/octokit.objc/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/octokit/octokit.objc/merges", + "archive_url": "https://api.github.com/repos/octokit/octokit.objc/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/octokit/octokit.objc/downloads", + "issues_url": "https://api.github.com/repos/octokit/octokit.objc/issues{/number}", + "pulls_url": "https://api.github.com/repos/octokit/octokit.objc/pulls{/number}", + "milestones_url": "https://api.github.com/repos/octokit/octokit.objc/milestones{/number}", + "notifications_url": "https://api.github.com/repos/octokit/octokit.objc/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/octokit/octokit.objc/labels{/name}", + "releases_url": "https://api.github.com/repos/octokit/octokit.objc/releases{/id}", + "created_at": "2013-01-09T22:42:53Z", + "updated_at": "2015-04-03T06:16:41Z", + "pushed_at": "2015-03-21T17:10:20Z", + "git_url": "git://github.com/octokit/octokit.objc.git", + "ssh_url": "git@github.com:octokit/octokit.objc.git", + "clone_url": "https://github.com/octokit/octokit.objc.git", + "svn_url": "https://github.com/octokit/octokit.objc", + "homepage": "", + "size": 3779, + "stargazers_count": 1131, + "watchers_count": 1131, + "language": "Objective-C", + "has_issues": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "forks_count": 170, + "mirror_url": null, + "open_issues_count": 26, + "forks": 170, + "open_issues": 26, + "watchers": 1131, + "default_branch": "master", + "permissions": { + "admin": false, + "push": false, + "pull": true + } + }, + { + "id": 10575811, + "name": "go-octokit", + "full_name": "octokit/go-octokit", + "owner": { + "login": "octokit", + "id": 3430433, + "avatar_url": "https://avatars.githubusercontent.com/u/3430433?v=3", + "gravatar_id": "", + "url": "https://api.github.com/users/octokit", + "html_url": "https://github.com/octokit", + "followers_url": "https://api.github.com/users/octokit/followers", + "following_url": "https://api.github.com/users/octokit/following{/other_user}", + "gists_url": "https://api.github.com/users/octokit/gists{/gist_id}", + "starred_url": "https://api.github.com/users/octokit/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/octokit/subscriptions", + "organizations_url": "https://api.github.com/users/octokit/orgs", + "repos_url": "https://api.github.com/users/octokit/repos", + "events_url": "https://api.github.com/users/octokit/events{/privacy}", + "received_events_url": "https://api.github.com/users/octokit/received_events", + "type": "Organization", + "site_admin": false + }, + "private": false, + "html_url": "https://github.com/octokit/go-octokit", + "description": "Simple Go wrapper for the GitHub API", + "fork": false, + "url": "https://api.github.com/repos/octokit/go-octokit", + "forks_url": "https://api.github.com/repos/octokit/go-octokit/forks", + "keys_url": "https://api.github.com/repos/octokit/go-octokit/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/octokit/go-octokit/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/octokit/go-octokit/teams", + "hooks_url": "https://api.github.com/repos/octokit/go-octokit/hooks", + "issue_events_url": "https://api.github.com/repos/octokit/go-octokit/issues/events{/number}", + "events_url": "https://api.github.com/repos/octokit/go-octokit/events", + "assignees_url": "https://api.github.com/repos/octokit/go-octokit/assignees{/user}", + "branches_url": "https://api.github.com/repos/octokit/go-octokit/branches{/branch}", + "tags_url": "https://api.github.com/repos/octokit/go-octokit/tags", + "blobs_url": "https://api.github.com/repos/octokit/go-octokit/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/octokit/go-octokit/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/octokit/go-octokit/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/octokit/go-octokit/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/octokit/go-octokit/statuses/{sha}", + "languages_url": "https://api.github.com/repos/octokit/go-octokit/languages", + "stargazers_url": "https://api.github.com/repos/octokit/go-octokit/stargazers", + "contributors_url": "https://api.github.com/repos/octokit/go-octokit/contributors", + "subscribers_url": "https://api.github.com/repos/octokit/go-octokit/subscribers", + "subscription_url": "https://api.github.com/repos/octokit/go-octokit/subscription", + "commits_url": "https://api.github.com/repos/octokit/go-octokit/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/octokit/go-octokit/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/octokit/go-octokit/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/octokit/go-octokit/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/octokit/go-octokit/contents/{+path}", + "compare_url": "https://api.github.com/repos/octokit/go-octokit/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/octokit/go-octokit/merges", + "archive_url": "https://api.github.com/repos/octokit/go-octokit/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/octokit/go-octokit/downloads", + "issues_url": "https://api.github.com/repos/octokit/go-octokit/issues{/number}", + "pulls_url": "https://api.github.com/repos/octokit/go-octokit/pulls{/number}", + "milestones_url": "https://api.github.com/repos/octokit/go-octokit/milestones{/number}", + "notifications_url": "https://api.github.com/repos/octokit/go-octokit/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/octokit/go-octokit/labels{/name}", + "releases_url": "https://api.github.com/repos/octokit/go-octokit/releases{/id}", + "created_at": "2013-06-08T23:50:29Z", + "updated_at": "2015-04-02T18:47:34Z", + "pushed_at": "2015-04-02T18:48:16Z", + "git_url": "git://github.com/octokit/go-octokit.git", + "ssh_url": "git@github.com:octokit/go-octokit.git", + "clone_url": "https://github.com/octokit/go-octokit.git", + "svn_url": "https://github.com/octokit/go-octokit", + "homepage": "https://github.com/octokit/go-octokit", + "size": 3693, + "stargazers_count": 106, + "watchers_count": 106, + "language": "Go", + "has_issues": true, + "has_downloads": true, + "has_wiki": false, + "has_pages": false, + "forks_count": 29, + "mirror_url": null, + "open_issues_count": 16, + "forks": 29, + "open_issues": 16, + "watchers": 106, + "default_branch": "master", + "permissions": { + "admin": false, + "push": false, + "pull": true + } + } +] diff --git a/vendor/github.com/PuerkitoBio/pigeon/grammar/bootstrap.peg b/vendor/github.com/PuerkitoBio/pigeon/grammar/bootstrap.peg new file mode 100644 index 0000000000..f80200421c --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/grammar/bootstrap.peg @@ -0,0 +1,238 @@ +{ +package main +} + +Grammar ← __ initializer:( Initializer __ )? rules:( Rule __ )+ { + pos := c.astPos() + + // create the grammar, assign its initializer + g := ast.NewGrammar(pos) + initSlice := toIfaceSlice(initializer) + if len(initSlice) > 0 { + g.Init = initSlice[0].(*ast.CodeBlock) + } + + rulesSlice := toIfaceSlice(rules) + g.Rules = make([]*ast.Rule, len(rulesSlice)) + for i, duo := range rulesSlice { + g.Rules[i] = duo.([]interface{})[0].(*ast.Rule) + } + + return g, nil +} + +Initializer ← code:CodeBlock EOS { + return code, nil +} + +Rule ← name:IdentifierName __ display:( StringLiteral __ )? RuleDefOp __ expr:Expression EOS { + pos := c.astPos() + + rule := ast.NewRule(pos, name.(*ast.Identifier)) + displaySlice := toIfaceSlice(display) + if len(displaySlice) > 0 { + rule.DisplayName = displaySlice[0].(*ast.StringLit) + } + rule.Expr = expr.(ast.Expression) + + return rule, nil +} + +Expression ← ChoiceExpr + +ChoiceExpr ← first:ActionExpr rest:( __ "/" __ ActionExpr )* { + restSlice := toIfaceSlice(rest) + if len(restSlice) == 0 { + return first, nil + } + + pos := c.astPos() + choice := ast.NewChoiceExpr(pos) + choice.Alternatives = []ast.Expression{first.(ast.Expression)} + for _, sl := range restSlice { + choice.Alternatives = append(choice.Alternatives, sl.([]interface{})[3].(ast.Expression)) + } + return choice, nil +} + +ActionExpr ← expr:SeqExpr code:( __ CodeBlock )? { + if code == nil { + return expr, nil + } + + pos := c.astPos() + act := ast.NewActionExpr(pos) + act.Expr = expr.(ast.Expression) + codeSlice := toIfaceSlice(code) + act.Code = codeSlice[1].(*ast.CodeBlock) + + return act, nil +} + +SeqExpr ← first:LabeledExpr rest:( __ LabeledExpr )* { + restSlice := toIfaceSlice(rest) + if len(restSlice) == 0 { + return first, nil + } + seq := ast.NewSeqExpr(c.astPos()) + seq.Exprs = []ast.Expression{first.(ast.Expression)} + for _, sl := range restSlice { + seq.Exprs = append(seq.Exprs, sl.([]interface{})[1].(ast.Expression)) + } + return seq, nil +} + +LabeledExpr ← label:Identifier __ ':' __ expr:PrefixedExpr { + pos := c.astPos() + lab := ast.NewLabeledExpr(pos) + lab.Label = label.(*ast.Identifier) + lab.Expr = expr.(ast.Expression) + return lab, nil +} / PrefixedExpr + +PrefixedExpr ← op:PrefixedOp __ expr:SuffixedExpr { + pos := c.astPos() + opStr := op.(string) + if opStr == "&" { + and := ast.NewAndExpr(pos) + and.Expr = expr.(ast.Expression) + return and, nil + } + not := ast.NewNotExpr(pos) + not.Expr = expr.(ast.Expression) + return not, nil +} / SuffixedExpr + +PrefixedOp ← ( '&' / '!' ) { + return string(c.text), nil +} + +SuffixedExpr ← expr:PrimaryExpr __ op:SuffixedOp { + pos := c.astPos() + opStr := op.(string) + switch opStr { + case "?": + zero := ast.NewZeroOrOneExpr(pos) + zero.Expr = expr.(ast.Expression) + return zero, nil + case "*": + zero := ast.NewZeroOrMoreExpr(pos) + zero.Expr = expr.(ast.Expression) + return zero, nil + case "+": + one := ast.NewOneOrMoreExpr(pos) + one.Expr = expr.(ast.Expression) + return one, nil + default: + return nil, errors.New("unknown operator: " + opStr) + } +} / PrimaryExpr + +SuffixedOp ← ( '?' / '*' / '+' ) { + return string(c.text), nil +} + +PrimaryExpr ← LitMatcher / CharClassMatcher / AnyMatcher / RuleRefExpr / SemanticPredExpr / "(" __ expr:Expression __ ")" { + return expr, nil +} +RuleRefExpr ← name:IdentifierName !( __ ( StringLiteral __ )? RuleDefOp ) { + ref := ast.NewRuleRefExpr(c.astPos()) + ref.Name = name.(*ast.Identifier) + return ref, nil +} +SemanticPredExpr ← op:SemanticPredOp __ code:CodeBlock { + opStr := op.(string) + if opStr == "&" { + and := ast.NewAndCodeExpr(c.astPos()) + and.Code = code.(*ast.CodeBlock) + return and, nil + } + not := ast.NewNotCodeExpr(c.astPos()) + not.Code = code.(*ast.CodeBlock) + return not, nil +} +SemanticPredOp ← ( '&' / '!' ) { + return string(c.text), nil +} + +RuleDefOp ← '=' / "<-" / '\u2190' / '\u27f5' + +SourceChar ← . +Comment ← MultiLineComment / SingleLineComment +MultiLineComment ← "/*" ( !"*/" SourceChar )* "*/" +MultiLineCommentNoLineTerminator ← "/*" ( !( "*/" / EOL ) SourceChar )* "*/" +SingleLineComment ← "//" ( !EOL SourceChar )* + +Identifier ← IdentifierName +IdentifierName ← IdentifierStart IdentifierPart* { + return ast.NewIdentifier(c.astPos(), string(c.text)), nil +} +IdentifierStart ← [a-z_]i +IdentifierPart ← IdentifierStart / [0-9] + +LitMatcher ← lit:StringLiteral ignore:"i"? { + rawStr := lit.(*ast.StringLit).Val + s, err := strconv.Unquote(rawStr) + if err != nil { + return nil, err + } + m := ast.NewLitMatcher(c.astPos(), s) + m.IgnoreCase = ignore != nil + return m, nil +} +StringLiteral ← ( '"' DoubleStringChar* '"' / "'" SingleStringChar "'" / '`' RawStringChar '`' ) { + return ast.NewStringLit(c.astPos(), string(c.text)), nil +} +DoubleStringChar ← !( '"' / "\\" / EOL ) SourceChar / "\\" DoubleStringEscape +SingleStringChar ← !( "'" / "\\" / EOL ) SourceChar / "\\" SingleStringEscape +RawStringChar ← !'`' SourceChar + +DoubleStringEscape ← "'" / CommonEscapeSequence +SingleStringEscape ← '"' / CommonEscapeSequence + +CommonEscapeSequence ← SingleCharEscape / OctalEscape / HexEscape / LongUnicodeEscape / ShortUnicodeEscape +SingleCharEscape ← 'a' / 'b' / 'n' / 'f' / 'r' / 't' / 'v' / '\\' +OctalEscape ← OctalDigit OctalDigit OctalDigit +HexEscape ← 'x' HexDigit HexDigit +LongUnicodeEscape ← 'U' HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit +ShortUnicodeEscape ← 'u' HexDigit HexDigit HexDigit HexDigit + +OctalDigit ← [0-7] +DecimalDigit ← [0-9] +HexDigit ← [0-9a-f]i + +CharClassMatcher ← '[' ( ClassCharRange / ClassChar / "\\" UnicodeClassEscape )* ']' 'i'? { + pos := c.astPos() + cc := ast.NewCharClassMatcher(pos, string(c.text)) + return cc, nil +} +ClassCharRange ← ClassChar '-' ClassChar +ClassChar ← !( "]" / "\\" / EOL ) SourceChar / "\\" CharClassEscape +CharClassEscape ← ']' / CommonEscapeSequence + +UnicodeClassEscape ← 'p' ( SingleCharUnicodeClass / '{' UnicodeClass '}' ) +SingleCharUnicodeClass ← [LMNCPZS] +UnicodeClass ← [a-z_]i+ + +AnyMatcher ← "." { + any := ast.NewAnyMatcher(c.astPos(), ".") + return any, nil +} + +CodeBlock ← "{" Code "}" { + pos := c.astPos() + cb := ast.NewCodeBlock(pos, string(c.text)) + return cb, nil +} + +Code ← ( ( ![{}] SourceChar )+ / "{" Code "}" )* + +__ ← ( Whitespace / EOL / Comment )* +_ ← ( Whitespace / MultiLineCommentNoLineTerminator )* + +Whitespace ← [ \t\r] +EOL ← '\n' +EOS ← __ ';' / _ SingleLineComment? EOL / __ EOF + +EOF ← !. + diff --git a/vendor/github.com/PuerkitoBio/pigeon/grammar/pigeon.peg b/vendor/github.com/PuerkitoBio/pigeon/grammar/pigeon.peg new file mode 100644 index 0000000000..5d90993b8a --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/grammar/pigeon.peg @@ -0,0 +1,294 @@ +{ +package main +} + +Grammar ← __ initializer:( Initializer __ )? rules:( Rule __ )+ EOF { + pos := c.astPos() + + // create the grammar, assign its initializer + g := ast.NewGrammar(pos) + initSlice := toIfaceSlice(initializer) + if len(initSlice) > 0 { + g.Init = initSlice[0].(*ast.CodeBlock) + } + + rulesSlice := toIfaceSlice(rules) + g.Rules = make([]*ast.Rule, len(rulesSlice)) + for i, duo := range rulesSlice { + g.Rules[i] = duo.([]interface{})[0].(*ast.Rule) + } + + return g, nil +} + +Initializer ← code:CodeBlock EOS { + return code, nil +} + +Rule ← name:IdentifierName __ display:( StringLiteral __ )? RuleDefOp __ expr:Expression EOS { + pos := c.astPos() + + rule := ast.NewRule(pos, name.(*ast.Identifier)) + displaySlice := toIfaceSlice(display) + if len(displaySlice) > 0 { + rule.DisplayName = displaySlice[0].(*ast.StringLit) + } + rule.Expr = expr.(ast.Expression) + + return rule, nil +} + +Expression ← ChoiceExpr + +ChoiceExpr ← first:ActionExpr rest:( __ "/" __ ActionExpr )* { + restSlice := toIfaceSlice(rest) + if len(restSlice) == 0 { + return first, nil + } + + pos := c.astPos() + choice := ast.NewChoiceExpr(pos) + choice.Alternatives = []ast.Expression{first.(ast.Expression)} + for _, sl := range restSlice { + choice.Alternatives = append(choice.Alternatives, sl.([]interface{})[3].(ast.Expression)) + } + return choice, nil +} + +ActionExpr ← expr:SeqExpr code:( __ CodeBlock )? { + if code == nil { + return expr, nil + } + + pos := c.astPos() + act := ast.NewActionExpr(pos) + act.Expr = expr.(ast.Expression) + codeSlice := toIfaceSlice(code) + act.Code = codeSlice[1].(*ast.CodeBlock) + + return act, nil +} + +SeqExpr ← first:LabeledExpr rest:( __ LabeledExpr )* { + restSlice := toIfaceSlice(rest) + if len(restSlice) == 0 { + return first, nil + } + seq := ast.NewSeqExpr(c.astPos()) + seq.Exprs = []ast.Expression{first.(ast.Expression)} + for _, sl := range restSlice { + seq.Exprs = append(seq.Exprs, sl.([]interface{})[1].(ast.Expression)) + } + return seq, nil +} + +LabeledExpr ← label:Identifier __ ':' __ expr:PrefixedExpr { + pos := c.astPos() + lab := ast.NewLabeledExpr(pos) + lab.Label = label.(*ast.Identifier) + lab.Expr = expr.(ast.Expression) + return lab, nil +} / PrefixedExpr + +PrefixedExpr ← op:PrefixedOp __ expr:SuffixedExpr { + pos := c.astPos() + opStr := op.(string) + if opStr == "&" { + and := ast.NewAndExpr(pos) + and.Expr = expr.(ast.Expression) + return and, nil + } + not := ast.NewNotExpr(pos) + not.Expr = expr.(ast.Expression) + return not, nil +} / SuffixedExpr + +PrefixedOp ← ( '&' / '!' ) { + return string(c.text), nil +} + +SuffixedExpr ← expr:PrimaryExpr __ op:SuffixedOp { + pos := c.astPos() + opStr := op.(string) + switch opStr { + case "?": + zero := ast.NewZeroOrOneExpr(pos) + zero.Expr = expr.(ast.Expression) + return zero, nil + case "*": + zero := ast.NewZeroOrMoreExpr(pos) + zero.Expr = expr.(ast.Expression) + return zero, nil + case "+": + one := ast.NewOneOrMoreExpr(pos) + one.Expr = expr.(ast.Expression) + return one, nil + default: + return nil, errors.New("unknown operator: " + opStr) + } +} / PrimaryExpr + +SuffixedOp ← ( '?' / '*' / '+' ) { + return string(c.text), nil +} + +PrimaryExpr ← LitMatcher / CharClassMatcher / AnyMatcher / RuleRefExpr / SemanticPredExpr / "(" __ expr:Expression __ ")" { + return expr, nil +} +RuleRefExpr ← name:IdentifierName !( __ ( StringLiteral __ )? RuleDefOp ) { + ref := ast.NewRuleRefExpr(c.astPos()) + ref.Name = name.(*ast.Identifier) + return ref, nil +} +SemanticPredExpr ← op:SemanticPredOp __ code:CodeBlock { + opStr := op.(string) + if opStr == "&" { + and := ast.NewAndCodeExpr(c.astPos()) + and.Code = code.(*ast.CodeBlock) + return and, nil + } + not := ast.NewNotCodeExpr(c.astPos()) + not.Code = code.(*ast.CodeBlock) + return not, nil +} +SemanticPredOp ← ( '&' / '!' ) { + return string(c.text), nil +} + +RuleDefOp ← '=' / "<-" / '\u2190' / '\u27f5' + +SourceChar ← . +Comment ← MultiLineComment / SingleLineComment +MultiLineComment ← "/*" ( !"*/" SourceChar )* "*/" +MultiLineCommentNoLineTerminator ← "/*" ( !( "*/" / EOL ) SourceChar )* "*/" +SingleLineComment ← "//" ( !EOL SourceChar )* + +Identifier ← ident:IdentifierName { + astIdent := ast.NewIdentifier(c.astPos(), string(c.text)) + if reservedWords[astIdent.Val] { + return astIdent, errors.New("identifier is a reserved word") + } + return astIdent, nil +} + +IdentifierName ← IdentifierStart IdentifierPart* { + return ast.NewIdentifier(c.astPos(), string(c.text)), nil +} +IdentifierStart ← [\pL_] +IdentifierPart ← IdentifierStart / [\p{Nd}] + +LitMatcher ← lit:StringLiteral ignore:"i"? { + rawStr := lit.(*ast.StringLit).Val + s, err := strconv.Unquote(rawStr) + if err != nil { + // an invalid string literal raises an error in the escape rules, + // so simply replace the literal with an empty string here to + // avoid a cascade of errors. + s = "" + } + m := ast.NewLitMatcher(c.astPos(), s) + m.IgnoreCase = ignore != nil + return m, nil +} +StringLiteral ← ( '"' DoubleStringChar* '"' / "'" SingleStringChar "'" / '`' RawStringChar* '`' ) { + return ast.NewStringLit(c.astPos(), string(c.text)), nil +} / ( ( '"' DoubleStringChar* ( EOL / EOF ) ) / ( "'" SingleStringChar? ( EOL / EOF ) ) / '`' RawStringChar* EOF ) { + return ast.NewStringLit(c.astPos(), "``"), errors.New("string literal not terminated") +} + +DoubleStringChar ← !( '"' / "\\" / EOL ) SourceChar / "\\" DoubleStringEscape +SingleStringChar ← !( "'" / "\\" / EOL ) SourceChar / "\\" SingleStringEscape +RawStringChar ← !'`' SourceChar + +DoubleStringEscape ← ( '"' / CommonEscapeSequence ) + / ( SourceChar / EOL / EOF ) { + return nil, errors.New("invalid escape character") +} +SingleStringEscape ← ( "'" / CommonEscapeSequence ) + / ( SourceChar / EOL / EOF ) { + return nil, errors.New("invalid escape character") +} + +CommonEscapeSequence ← SingleCharEscape / OctalEscape / HexEscape / LongUnicodeEscape / ShortUnicodeEscape +SingleCharEscape ← 'a' / 'b' / 'n' / 'f' / 'r' / 't' / 'v' / '\\' +OctalEscape ← OctalDigit OctalDigit OctalDigit + / OctalDigit ( SourceChar / EOL / EOF ) { + return nil, errors.New("invalid octal escape") +} +HexEscape ← 'x' HexDigit HexDigit + / 'x' ( SourceChar / EOL / EOF ) { + return nil, errors.New("invalid hexadecimal escape") +} +LongUnicodeEscape ← + 'U' HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit HexDigit { + return validateUnicodeEscape(string(c.text), "invalid Unicode escape") + } + / 'U' ( SourceChar / EOL / EOF ) { + return nil, errors.New("invalid Unicode escape") +} +ShortUnicodeEscape ← + 'u' HexDigit HexDigit HexDigit HexDigit { + return validateUnicodeEscape(string(c.text), "invalid Unicode escape") + } + / 'u' ( SourceChar / EOL / EOF ) { + return nil, errors.New("invalid Unicode escape") +} + +OctalDigit ← [0-7] +DecimalDigit ← [0-9] +HexDigit ← [0-9a-f]i + +CharClassMatcher ← '[' ( ClassCharRange / ClassChar / "\\" UnicodeClassEscape )* ']' 'i'? { + pos := c.astPos() + cc := ast.NewCharClassMatcher(pos, string(c.text)) + return cc, nil +} / '[' ( !( EOL ) SourceChar )* ( EOL / EOF ) { + return ast.NewCharClassMatcher(c.astPos(), "[]"), errors.New("character class not terminated") +} + +ClassCharRange ← ClassChar '-' ClassChar +ClassChar ← !( "]" / "\\" / EOL ) SourceChar / "\\" CharClassEscape +CharClassEscape ← ( ']' / CommonEscapeSequence ) + / !'p' ( SourceChar / EOL / EOF ) { + return nil, errors.New("invalid escape character") +} + +UnicodeClassEscape ← 'p' ( + SingleCharUnicodeClass + / !'{' ( SourceChar / EOL / EOF ) { return nil, errors.New("invalid Unicode class escape") } + / '{' ident:IdentifierName '}' { + if !unicodeClasses[ident.(*ast.Identifier).Val] { + return nil, errors.New("invalid Unicode class escape") + } + return nil, nil + } + / '{' IdentifierName ( ']' / EOL / EOF ) { + return nil, errors.New("Unicode class not terminated") + } + ) +SingleCharUnicodeClass ← [LMNCPZS] + +AnyMatcher ← "." { + any := ast.NewAnyMatcher(c.astPos(), ".") + return any, nil +} + +CodeBlock ← '{' Code '}' { + pos := c.astPos() + cb := ast.NewCodeBlock(pos, string(c.text)) + return cb, nil +} / '{' Code EOF { + return nil, errors.New("code block not terminated") +} + +Code ← ( ( ![{}] SourceChar )+ / '{' Code '}' )* + +__ ← ( Whitespace / EOL / Comment )* +_ ← ( Whitespace / MultiLineCommentNoLineTerminator )* + +Whitespace ← [ \t\r] +EOL ← '\n' +EOS ← __ ';' / _ SingleLineComment? EOL / __ EOF + +EOF ← !. + diff --git a/vendor/github.com/PuerkitoBio/pigeon/main.go b/vendor/github.com/PuerkitoBio/pigeon/main.go new file mode 100644 index 0000000000..755592c23c --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/main.go @@ -0,0 +1,195 @@ +package main + +import ( + "bufio" + "errors" + "flag" + "fmt" + "io" + "os" + "strconv" + "strings" + + "github.com/PuerkitoBio/pigeon/ast" + "github.com/PuerkitoBio/pigeon/builder" +) + +var exit = os.Exit + +func main() { + fs := flag.NewFlagSet(os.Args[0], flag.ExitOnError) + + // define command-line flags + var ( + cacheFlag = fs.Bool("cache", false, "cache parsing results") + dbgFlag = fs.Bool("debug", false, "set debug mode") + shortHelpFlag = fs.Bool("h", false, "show help page") + longHelpFlag = fs.Bool("help", false, "show help page") + noRecoverFlag = fs.Bool("no-recover", false, "do not recover from panic") + outputFlag = fs.String("o", "", "output file, defaults to stdout") + recvrNmFlag = fs.String("receiver-name", "c", "receiver name for the generated methods") + noBuildFlag = fs.Bool("x", false, "do not build, only parse") + ) + + fs.Usage = usage + fs.Parse(os.Args[1:]) + + if *shortHelpFlag || *longHelpFlag { + fs.Usage() + exit(0) + } + + if fs.NArg() > 1 { + argError(1, "expected one argument, got %q", strings.Join(fs.Args(), " ")) + } + + // get input source + infile := "" + if fs.NArg() == 1 { + infile = fs.Arg(0) + } + nm, rc := input(infile) + defer rc.Close() + + // parse input + g, err := ParseReader(nm, rc, Debug(*dbgFlag), Memoize(*cacheFlag), Recover(!*noRecoverFlag)) + if err != nil { + fmt.Fprintln(os.Stderr, "parse error(s):\n", err) + exit(3) + } + + if !*noBuildFlag { + // generate parser + out := output(*outputFlag) + defer out.Close() + + curNmOpt := builder.ReceiverName(*recvrNmFlag) + if err := builder.BuildParser(out, g.(*ast.Grammar), curNmOpt); err != nil { + fmt.Fprintln(os.Stderr, "build error: ", err) + exit(5) + } + } +} + +var usagePage = `usage: %s [options] [GRAMMAR_FILE] + +Pigeon generates a parser based on a PEG grammar. It doesn't try +to format the generated code nor to detect required imports - +it is recommended to pipe the output of pigeon through a tool +such as goimports to do this, e.g.: + + pigeon GRAMMAR_FILE | goimports > output.go + +Use the following command to install goimports: + + go get golang.org/x/tools/cmd/goimports + +By default, pigeon reads the grammar from stdin and writes the +generated parser to stdout. If GRAMMAR_FILE is specified, the +grammar is read from this file instead. If the -o flag is set, +the generated code is written to this file instead. + + -cache + cache parser results to avoid exponential parsing time in + pathological cases. Can make the parsing slower for typical + cases and uses more memory. + -debug + output debugging information while parsing the grammar. + -h -help + display this help message. + -no-recover + do not recover from a panic. Useful to access the panic stack + when debugging, otherwise the panic is converted to an error. + -o OUTPUT_FILE + write the generated parser to OUTPUT_FILE. Defaults to stdout. + -receiver-name NAME + use NAME as for the receiver name of the generated methods + for the grammar's code blocks. Defaults to "c". + -x + do not generate the parser, only parse the grammar. + +See https://godoc.org/github.com/PuerkitoBio/pigeon for more +information. +` + +// usage prints the help page of the command-line tool. +func usage() { + fmt.Printf(usagePage, os.Args[0]) +} + +// argError prints an error message to stderr, prints the command usage +// and exits with the specified exit code. +func argError(exitCode int, msg string, args ...interface{}) { + fmt.Fprintf(os.Stderr, msg, args...) + fmt.Fprintln(os.Stderr) + usage() + exit(exitCode) +} + +// input gets the name and reader to get input text from. +func input(filename string) (nm string, rc io.ReadCloser) { + nm = "stdin" + inf := os.Stdin + if filename != "" { + f, err := os.Open(filename) + if err != nil { + fmt.Fprintln(os.Stderr, err) + exit(2) + } + inf = f + nm = filename + } + r := bufio.NewReader(inf) + return nm, makeReadCloser(r, inf) +} + +// output gets the writer to write the generated parser to. +func output(filename string) io.WriteCloser { + out := os.Stdout + if filename != "" { + f, err := os.Create(filename) + if err != nil { + fmt.Fprintln(os.Stderr, err) + exit(4) + } + out = f + } + return out +} + +// create a ReadCloser that reads from r and closes c. +func makeReadCloser(r io.Reader, c io.Closer) io.ReadCloser { + rc := struct { + io.Reader + io.Closer + }{r, c} + return io.ReadCloser(rc) +} + +// astPos is a helper method for the PEG grammar parser. It returns the +// position of the current match as an ast.Pos. +func (c *current) astPos() ast.Pos { + return ast.Pos{Line: c.pos.line, Col: c.pos.col, Off: c.pos.offset} +} + +// toIfaceSlice is a helper function for the PEG grammar parser. It converts +// v to a slice of empty interfaces. +func toIfaceSlice(v interface{}) []interface{} { + if v == nil { + return nil + } + return v.([]interface{}) +} + +// validateUnicodeEscape checks that the provided escape sequence is a +// valid Unicode escape sequence. +func validateUnicodeEscape(escape, errMsg string) (interface{}, error) { + r, _, _, err := strconv.UnquoteChar("\\"+escape, '"') + if err != nil { + return nil, errors.New(errMsg) + } + if 0xD800 <= r && r <= 0xDFFF { + return nil, errors.New(errMsg) + } + return nil, nil +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/main_test.go b/vendor/github.com/PuerkitoBio/pigeon/main_test.go new file mode 100644 index 0000000000..8dbfa6ac48 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/main_test.go @@ -0,0 +1,54 @@ +package main + +import ( + "os" + "strings" + "testing" +) + +func TestMain(t *testing.T) { + stdout, stderr := os.Stdout, os.Stderr + os.Stdout, _ = os.Open(os.DevNull) + os.Stderr, _ = os.Open(os.DevNull) + defer func() { + exit = os.Exit + os.Stdout = stdout + os.Stderr = stderr + }() + exit = func(code int) { + panic(code) + } + + cases := []struct { + args string + code int + }{ + {args: "", code: 3}, // stdin: no match found + {args: "-h", code: 0}, // help + {args: "FILE1 FILE2", code: 1}, // want only 1 non-flag arg + {args: "-x", code: 3}, // stdin: no match found + } + + for _, tc := range cases { + os.Args = append([]string{"pigeon"}, strings.Fields(tc.args)...) + + got := runMainRecover() + if got != tc.code { + t.Errorf("%q: want code %d, got %d", tc.args, tc.code, got) + } + } +} + +func runMainRecover() (code int) { + defer func() { + if e := recover(); e != nil { + if i, ok := e.(int); ok { + code = i + return + } + panic(e) + } + }() + main() + return 0 +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/misc/cmd/unicode-classes/main.go b/vendor/github.com/PuerkitoBio/pigeon/misc/cmd/unicode-classes/main.go new file mode 100644 index 0000000000..f21e6d2a5d --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/misc/cmd/unicode-classes/main.go @@ -0,0 +1,53 @@ +// Command unicode-classes generates a set-like map of all valid +// Unicode classes. +package main + +import ( + "fmt" + "sort" + "unicode" +) + +func main() { + set := make(map[string]bool) + for k := range unicode.Categories { + set[k] = true + } + for k := range unicode.Properties { + set[k] = true + } + for k := range unicode.Scripts { + set[k] = true + } + classes := make([]string, 0, len(set)) + for k := range set { + classes = append(classes, k) + } + + sort.Strings(classes) + fmt.Println(`// This file is generated by the misc/cmd/unicode-classes tool. +// Do not edit. +`) + fmt.Println("package main") + fmt.Println("\nvar unicodeClasses = map[string]bool{") + for _, s := range classes { + fmt.Printf("\t%q: true,\n", s) + } + fmt.Println("}") +} + +// lenSorter was used to generate Unicode classes directly in the PEG +// grammar (where longer classes had to come first). +type lenSorter []string + +func (l lenSorter) Len() int { return len(l) } +func (l lenSorter) Swap(i, j int) { l[i], l[j] = l[j], l[i] } +func (l lenSorter) Less(i, j int) bool { + li, lj := len(l[i]), len(l[j]) + if lj < li { + return true + } else if li < lj { + return false + } + return l[j] < l[i] +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/misc/git/pre-commit b/vendor/github.com/PuerkitoBio/pigeon/misc/git/pre-commit new file mode 100755 index 0000000000..b2466410cd --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/misc/git/pre-commit @@ -0,0 +1,37 @@ +#!/bin/sh +# Copyright 2012 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# git gofmt pre-commit hook +# +# To use, store as .git/hooks/pre-commit inside your repository and make sure +# it has execute permissions. +# +# This script does not handle file names that contain spaces. + +# golint is purely informational, it doesn't fail with exit code != 0 if it finds something, +# because it may find a lot of false positives. Just print out its result for information. +echo "lint result (informational only):" +golint ./... + +# go vet returns 1 if an error was found. Exit the hook with this exit code. +go vet ./... +vetres=$? + +# Check for gofmt problems and report if any. +gofiles=$(git diff --cached --name-only --diff-filter=ACM | grep '.go$') +[ -z "$gofiles" ] && echo "EXIT $vetres" && exit $vetres + +unformatted=$(gofmt -l $gofiles) +[ -z "$unformatted" ] && echo "EXIT $vetres" && exit $vetres + +# Some files are not gofmt'd. Print message and fail. + +echo >&2 "Go files must be formatted with gofmt. Please run:" +for fn in $unformatted; do + echo >&2 " gofmt -w $PWD/$fn" +done + +echo "EXIT 1" +exit 1 diff --git a/vendor/github.com/PuerkitoBio/pigeon/parse_test.go b/vendor/github.com/PuerkitoBio/pigeon/parse_test.go new file mode 100644 index 0000000000..0eee8b7468 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/parse_test.go @@ -0,0 +1,439 @@ +package main + +import ( + "testing" + + "github.com/PuerkitoBio/pigeon/ast" +) + +var invalidParseCases = map[string]string{ + "": "file:1:1 (0): no match found", + "a": "file:1:1 (0): no match found", + "abc": "file:1:1 (0): no match found", + " ": "file:1:1 (0): no match found", + `a = +`: "file:1:1 (0): no match found", + `a = *`: "file:1:1 (0): no match found", + `a = ?`: "file:1:1 (0): no match found", + "a ←": "file:1:1 (0): no match found", + "a ← b\nb ←": "file:1:1 (0): no match found", + "a ← nil:b": "file:1:5 (6): rule Identifier: identifier is a reserved word", + "\xfe": "file:1:1 (0): invalid encoding", + "{}{}": "file:1:1 (0): no match found", + + // non-terminated, empty, EOF "quoted" tokens + "{": "file:1:1 (0): rule CodeBlock: code block not terminated", + "\n{": "file:2:1 (1): rule CodeBlock: code block not terminated", + `a = "`: "file:1:5 (4): rule StringLiteral: string literal not terminated", + "a = `": "file:1:5 (4): rule StringLiteral: string literal not terminated", + "a = '": "file:1:5 (4): rule StringLiteral: string literal not terminated", + `a = [`: "file:1:5 (4): rule CharClassMatcher: character class not terminated", + `a = [\p{]`: `file:1:5 (4): rule CharClassMatcher: character class not terminated`, + + // non-terminated, empty, EOL "quoted" tokens + "{\n": "file:1:1 (0): rule CodeBlock: code block not terminated", + "\n{\n": "file:2:1 (1): rule CodeBlock: code block not terminated", + "a = \"\n": "file:1:5 (4): rule StringLiteral: string literal not terminated", + "a = `\n": "file:1:5 (4): rule StringLiteral: string literal not terminated", + "a = '\n": "file:1:5 (4): rule StringLiteral: string literal not terminated", + "a = [\n": "file:1:5 (4): rule CharClassMatcher: character class not terminated", + "a = [\\p{\n]": `file:1:5 (4): rule CharClassMatcher: character class not terminated`, + + // non-terminated quoted tokens with escaped closing char + `a = "\"`: "file:1:5 (4): rule StringLiteral: string literal not terminated", + `a = '\'`: "file:1:5 (4): rule StringLiteral: string literal not terminated", + `a = [\]`: "file:1:5 (4): rule CharClassMatcher: character class not terminated", + + // non-terminated, non-empty, EOF "quoted" tokens + "{a": "file:1:1 (0): rule CodeBlock: code block not terminated", + "\n{{}": "file:2:1 (1): rule CodeBlock: code block not terminated", + `a = "b`: "file:1:5 (4): rule StringLiteral: string literal not terminated", + "a = `b": "file:1:5 (4): rule StringLiteral: string literal not terminated", + "a = 'b": "file:1:5 (4): rule StringLiteral: string literal not terminated", + `a = [b`: "file:1:5 (4): rule CharClassMatcher: character class not terminated", + `a = [\p{W]`: `file:1:8 (7): rule UnicodeClassEscape: Unicode class not terminated +file:1:5 (4): rule CharClassMatcher: character class not terminated`, + + // invalid escapes + `a ← [\pA]`: "file:1:8 (9): rule UnicodeClassEscape: invalid Unicode class escape", + `a ← [\p{WW}]`: "file:1:8 (9): rule UnicodeClassEscape: invalid Unicode class escape", + `a = '\"'`: "file:1:7 (6): rule SingleStringEscape: invalid escape character", + `a = "\'"`: "file:1:7 (6): rule DoubleStringEscape: invalid escape character", + `a = [\']`: "file:1:7 (6): rule CharClassEscape: invalid escape character", + `a = '\xz'`: "file:1:7 (6): rule HexEscape: invalid hexadecimal escape", + `a = '\0z'`: "file:1:7 (6): rule OctalEscape: invalid octal escape", + `a = '\uz'`: "file:1:7 (6): rule ShortUnicodeEscape: invalid Unicode escape", + `a = '\Uz'`: "file:1:7 (6): rule LongUnicodeEscape: invalid Unicode escape", + + // escapes followed by newline + "a = '\\\n": `file:2:0 (6): rule SingleStringEscape: invalid escape character +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = '\\x\n": `file:1:7 (6): rule HexEscape: invalid hexadecimal escape +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = '\\0\n": `file:1:7 (6): rule OctalEscape: invalid octal escape +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = '\\u\n": `file:1:7 (6): rule ShortUnicodeEscape: invalid Unicode escape +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = '\\U\n": `file:1:7 (6): rule LongUnicodeEscape: invalid Unicode escape +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = \"\\\n": `file:2:0 (6): rule DoubleStringEscape: invalid escape character +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = \"\\x\n": `file:1:7 (6): rule HexEscape: invalid hexadecimal escape +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = \"\\0\n": `file:1:7 (6): rule OctalEscape: invalid octal escape +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = \"\\u\n": `file:1:7 (6): rule ShortUnicodeEscape: invalid Unicode escape +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = \"\\U\n": `file:1:7 (6): rule LongUnicodeEscape: invalid Unicode escape +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = [\\\n": `file:2:0 (6): rule CharClassEscape: invalid escape character +file:1:5 (4): rule CharClassMatcher: character class not terminated`, + "a = [\\x\n": `file:1:7 (6): rule HexEscape: invalid hexadecimal escape +file:1:5 (4): rule CharClassMatcher: character class not terminated`, + "a = [\\0\n": `file:1:7 (6): rule OctalEscape: invalid octal escape +file:1:5 (4): rule CharClassMatcher: character class not terminated`, + "a = [\\u\n": `file:1:7 (6): rule ShortUnicodeEscape: invalid Unicode escape +file:1:5 (4): rule CharClassMatcher: character class not terminated`, + "a = [\\U\n": `file:1:7 (6): rule LongUnicodeEscape: invalid Unicode escape +file:1:5 (4): rule CharClassMatcher: character class not terminated`, + "a = [\\p\n": `file:2:0 (7): rule UnicodeClassEscape: invalid Unicode class escape +file:1:5 (4): rule CharClassMatcher: character class not terminated`, + "a = [\\p{\n": `file:1:5 (4): rule CharClassMatcher: character class not terminated`, + + // escapes followed by EOF + "a = '\\": `file:1:7 (6): rule SingleStringEscape: invalid escape character +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = '\\x": `file:1:7 (6): rule HexEscape: invalid hexadecimal escape +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = '\\0": `file:1:7 (6): rule OctalEscape: invalid octal escape +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = '\\u": `file:1:7 (6): rule ShortUnicodeEscape: invalid Unicode escape +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = '\\U": `file:1:7 (6): rule LongUnicodeEscape: invalid Unicode escape +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = \"\\": `file:1:7 (6): rule DoubleStringEscape: invalid escape character +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = \"\\x": `file:1:7 (6): rule HexEscape: invalid hexadecimal escape +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = \"\\0": `file:1:7 (6): rule OctalEscape: invalid octal escape +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = \"\\u": `file:1:7 (6): rule ShortUnicodeEscape: invalid Unicode escape +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = \"\\U": `file:1:7 (6): rule LongUnicodeEscape: invalid Unicode escape +file:1:5 (4): rule StringLiteral: string literal not terminated`, + "a = [\\": `file:1:7 (6): rule CharClassEscape: invalid escape character +file:1:5 (4): rule CharClassMatcher: character class not terminated`, + "a = [\\x": `file:1:7 (6): rule HexEscape: invalid hexadecimal escape +file:1:5 (4): rule CharClassMatcher: character class not terminated`, + "a = [\\0": `file:1:7 (6): rule OctalEscape: invalid octal escape +file:1:5 (4): rule CharClassMatcher: character class not terminated`, + "a = [\\u": `file:1:7 (6): rule ShortUnicodeEscape: invalid Unicode escape +file:1:5 (4): rule CharClassMatcher: character class not terminated`, + "a = [\\U": `file:1:7 (6): rule LongUnicodeEscape: invalid Unicode escape +file:1:5 (4): rule CharClassMatcher: character class not terminated`, + "a = [\\p": `file:1:8 (7): rule UnicodeClassEscape: invalid Unicode class escape +file:1:5 (4): rule CharClassMatcher: character class not terminated`, + "a = [\\p{": `file:1:5 (4): rule CharClassMatcher: character class not terminated`, + + // multi-char escapes, fail after 2 chars + `a = '\x0z'`: "file:1:7 (6): rule HexEscape: invalid hexadecimal escape", + `a = '\00z'`: "file:1:7 (6): rule OctalEscape: invalid octal escape", + `a = '\u0z'`: "file:1:7 (6): rule ShortUnicodeEscape: invalid Unicode escape", + `a = '\U0z'`: "file:1:7 (6): rule LongUnicodeEscape: invalid Unicode escape", + // multi-char escapes, fail after 3 chars + `a = '\u00z'`: "file:1:7 (6): rule ShortUnicodeEscape: invalid Unicode escape", + `a = '\U00z'`: "file:1:7 (6): rule LongUnicodeEscape: invalid Unicode escape", + // multi-char escapes, fail after 4 chars + `a = '\u000z'`: "file:1:7 (6): rule ShortUnicodeEscape: invalid Unicode escape", + `a = '\U000z'`: "file:1:7 (6): rule LongUnicodeEscape: invalid Unicode escape", + // multi-char escapes, fail after 5 chars + `a = '\U0000z'`: "file:1:7 (6): rule LongUnicodeEscape: invalid Unicode escape", + // multi-char escapes, fail after 6 chars + `a = '\U00000z'`: "file:1:7 (6): rule LongUnicodeEscape: invalid Unicode escape", + // multi-char escapes, fail after 7 chars + `a = '\U000000z'`: "file:1:7 (6): rule LongUnicodeEscape: invalid Unicode escape", + + // combine escape errors + `a = "\a\b\c\t\n\r\xab\xz\ux"`: `file:1:11 (10): rule DoubleStringEscape: invalid escape character +file:1:23 (22): rule HexEscape: invalid hexadecimal escape +file:1:26 (25): rule ShortUnicodeEscape: invalid Unicode escape`, + + // syntactically valid escapes, but invalid values + `a = "\udfff"`: "file:1:7 (6): rule ShortUnicodeEscape: invalid Unicode escape", + `a = "\ud800"`: "file:1:7 (6): rule ShortUnicodeEscape: invalid Unicode escape", + `a = "\ud801"`: "file:1:7 (6): rule ShortUnicodeEscape: invalid Unicode escape", + `a = "\U00110000"`: "file:1:7 (6): rule LongUnicodeEscape: invalid Unicode escape", + `a = "\U0000DFFF"`: "file:1:7 (6): rule LongUnicodeEscape: invalid Unicode escape", + `a = "\U0000D800"`: "file:1:7 (6): rule LongUnicodeEscape: invalid Unicode escape", + `a = "\U0000D801"`: "file:1:7 (6): rule LongUnicodeEscape: invalid Unicode escape", +} + +func TestInvalidParseCases(t *testing.T) { + memo := false +again: + for tc, exp := range invalidParseCases { + _, err := Parse("file", []byte(tc), Memoize(memo)) + if err == nil { + t.Errorf("%q: want error, got none", tc) + continue + } + if err.Error() != exp { + t.Errorf("%q: want \n%s\n, got \n%s\n", tc, exp, err) + } + } + if !memo { + memo = true + goto again + } +} + +var validParseCases = map[string]*ast.Grammar{ + "a = b": &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: &ast.RuleRefExpr{Name: ast.NewIdentifier(ast.Pos{}, "b")}, + }, + }, + }, + "a ← b\nc=d \n e <- f \ng\u27f5h": &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: &ast.RuleRefExpr{Name: ast.NewIdentifier(ast.Pos{}, "b")}, + }, + { + Name: ast.NewIdentifier(ast.Pos{}, "c"), + Expr: &ast.RuleRefExpr{Name: ast.NewIdentifier(ast.Pos{}, "d")}, + }, + { + Name: ast.NewIdentifier(ast.Pos{}, "e"), + Expr: &ast.RuleRefExpr{Name: ast.NewIdentifier(ast.Pos{}, "f")}, + }, + { + Name: ast.NewIdentifier(ast.Pos{}, "g"), + Expr: &ast.RuleRefExpr{Name: ast.NewIdentifier(ast.Pos{}, "h")}, + }, + }, + }, + `a "A"← b`: &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + DisplayName: ast.NewStringLit(ast.Pos{}, `"A"`), + Expr: &ast.RuleRefExpr{Name: ast.NewIdentifier(ast.Pos{}, "b")}, + }, + }, + }, + "{ init \n}\na 'A'← b": &ast.Grammar{ + Init: ast.NewCodeBlock(ast.Pos{}, "{ init \n}"), + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + DisplayName: ast.NewStringLit(ast.Pos{}, `'A'`), + Expr: &ast.RuleRefExpr{Name: ast.NewIdentifier(ast.Pos{}, "b")}, + }, + }, + }, + "a\n<-\nb": &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: &ast.RuleRefExpr{Name: ast.NewIdentifier(ast.Pos{}, "b")}, + }, + }, + }, + "a\n<-\nb\nc": &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: &ast.SeqExpr{ + Exprs: []ast.Expression{ + &ast.RuleRefExpr{Name: ast.NewIdentifier(ast.Pos{}, "b")}, + &ast.RuleRefExpr{Name: ast.NewIdentifier(ast.Pos{}, "c")}, + }, + }, + }, + }, + }, + "a\n<-\nb\nc\n=\nd": &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: &ast.RuleRefExpr{Name: ast.NewIdentifier(ast.Pos{}, "b")}, + }, + { + Name: ast.NewIdentifier(ast.Pos{}, "c"), + Expr: &ast.RuleRefExpr{Name: ast.NewIdentifier(ast.Pos{}, "d")}, + }, + }, + }, + "a\n<-\nb\nc\n'C'\n=\nd": &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: &ast.RuleRefExpr{Name: ast.NewIdentifier(ast.Pos{}, "b")}, + }, + { + Name: ast.NewIdentifier(ast.Pos{}, "c"), + DisplayName: ast.NewStringLit(ast.Pos{}, `'C'`), + Expr: &ast.RuleRefExpr{Name: ast.NewIdentifier(ast.Pos{}, "d")}, + }, + }, + }, + `a = [a-def]`: &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: &ast.CharClassMatcher{ + Chars: []rune{'e', 'f'}, + Ranges: []rune{'a', 'd'}, + }, + }, + }, + }, + `a = [abc-f]`: &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: &ast.CharClassMatcher{ + Chars: []rune{'a', 'b'}, + Ranges: []rune{'c', 'f'}, + }, + }, + }, + }, + `a = [abc-fg]`: &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: &ast.CharClassMatcher{ + Chars: []rune{'a', 'b', 'g'}, + Ranges: []rune{'c', 'f'}, + }, + }, + }, + }, + `a = [abc-fgh-l]`: &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: &ast.CharClassMatcher{ + Chars: []rune{'a', 'b', 'g'}, + Ranges: []rune{'c', 'f', 'h', 'l'}, + }, + }, + }, + }, + `a = [\x00-\xabc]`: &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: &ast.CharClassMatcher{ + Chars: []rune{'c'}, + Ranges: []rune{'\x00', '\xab'}, + }, + }, + }, + }, + `a = [-a-b]`: &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: &ast.CharClassMatcher{ + Chars: []rune{'-'}, + Ranges: []rune{'a', 'b'}, + }, + }, + }, + }, + `a = [a-b-d]`: &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: &ast.CharClassMatcher{ + Chars: []rune{'-', 'd'}, + Ranges: []rune{'a', 'b'}, + }, + }, + }, + }, + `a = [\u0012\123]`: &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: &ast.CharClassMatcher{ + Chars: []rune{'\u0012', '\123'}, + }, + }, + }, + }, + `a = [-\u0012-\U00001234]`: &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: &ast.CharClassMatcher{ + Chars: []rune{'-'}, + Ranges: []rune{'\u0012', '\U00001234'}, + }, + }, + }, + }, + `a = [\p{Latin}]`: &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: &ast.CharClassMatcher{ + UnicodeClasses: []string{"Latin"}, + }, + }, + }, + }, + `a = [\p{Latin}\pZ]`: &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: &ast.CharClassMatcher{ + UnicodeClasses: []string{"Latin", "Z"}, + }, + }, + }, + }, + "a = `a\nb\nc`": &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: ast.NewLitMatcher(ast.Pos{}, "a\nb\nc"), + }, + }, + }, + "a = ``": &ast.Grammar{ + Rules: []*ast.Rule{ + { + Name: ast.NewIdentifier(ast.Pos{}, "a"), + Expr: ast.NewLitMatcher(ast.Pos{}, ""), + }, + }, + }, +} + +func TestValidParseCases(t *testing.T) { + memo := false +again: + for tc, exp := range validParseCases { + got, err := Parse("", []byte(tc)) + if err != nil { + t.Errorf("%q: got error %v", tc, err) + continue + } + gotg, ok := got.(*ast.Grammar) + if !ok { + t.Errorf("%q: want grammar type %T, got %T", tc, exp, got) + continue + } + compareGrammars(t, tc, exp, gotg) + } + if !memo { + memo = true + goto again + } +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/pigeon.go b/vendor/github.com/PuerkitoBio/pigeon/pigeon.go new file mode 100644 index 0000000000..a783582d5e --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/pigeon.go @@ -0,0 +1,3698 @@ +package main + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "strconv" + "strings" + "unicode" + "unicode/utf8" + + "github.com/PuerkitoBio/pigeon/ast" +) + +var g = &grammar{ + rules: []*rule{ + { + name: "Grammar", + pos: position{line: 5, col: 1, offset: 18}, + expr: &actionExpr{ + pos: position{line: 5, col: 11, offset: 30}, + run: (*parser).callonGrammar1, + expr: &seqExpr{ + pos: position{line: 5, col: 11, offset: 30}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 5, col: 11, offset: 30}, + name: "__", + }, + &labeledExpr{ + pos: position{line: 5, col: 14, offset: 33}, + label: "initializer", + expr: &zeroOrOneExpr{ + pos: position{line: 5, col: 26, offset: 45}, + expr: &seqExpr{ + pos: position{line: 5, col: 28, offset: 47}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 5, col: 28, offset: 47}, + name: "Initializer", + }, + &ruleRefExpr{ + pos: position{line: 5, col: 40, offset: 59}, + name: "__", + }, + }, + }, + }, + }, + &labeledExpr{ + pos: position{line: 5, col: 46, offset: 65}, + label: "rules", + expr: &oneOrMoreExpr{ + pos: position{line: 5, col: 52, offset: 71}, + expr: &seqExpr{ + pos: position{line: 5, col: 54, offset: 73}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 5, col: 54, offset: 73}, + name: "Rule", + }, + &ruleRefExpr{ + pos: position{line: 5, col: 59, offset: 78}, + name: "__", + }, + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 5, col: 65, offset: 84}, + name: "EOF", + }, + }, + }, + }, + }, + { + name: "Initializer", + pos: position{line: 24, col: 1, offset: 525}, + expr: &actionExpr{ + pos: position{line: 24, col: 15, offset: 541}, + run: (*parser).callonInitializer1, + expr: &seqExpr{ + pos: position{line: 24, col: 15, offset: 541}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 24, col: 15, offset: 541}, + label: "code", + expr: &ruleRefExpr{ + pos: position{line: 24, col: 20, offset: 546}, + name: "CodeBlock", + }, + }, + &ruleRefExpr{ + pos: position{line: 24, col: 30, offset: 556}, + name: "EOS", + }, + }, + }, + }, + }, + { + name: "Rule", + pos: position{line: 28, col: 1, offset: 586}, + expr: &actionExpr{ + pos: position{line: 28, col: 8, offset: 595}, + run: (*parser).callonRule1, + expr: &seqExpr{ + pos: position{line: 28, col: 8, offset: 595}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 28, col: 8, offset: 595}, + label: "name", + expr: &ruleRefExpr{ + pos: position{line: 28, col: 13, offset: 600}, + name: "IdentifierName", + }, + }, + &ruleRefExpr{ + pos: position{line: 28, col: 28, offset: 615}, + name: "__", + }, + &labeledExpr{ + pos: position{line: 28, col: 31, offset: 618}, + label: "display", + expr: &zeroOrOneExpr{ + pos: position{line: 28, col: 39, offset: 626}, + expr: &seqExpr{ + pos: position{line: 28, col: 41, offset: 628}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 28, col: 41, offset: 628}, + name: "StringLiteral", + }, + &ruleRefExpr{ + pos: position{line: 28, col: 55, offset: 642}, + name: "__", + }, + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 28, col: 61, offset: 648}, + name: "RuleDefOp", + }, + &ruleRefExpr{ + pos: position{line: 28, col: 71, offset: 658}, + name: "__", + }, + &labeledExpr{ + pos: position{line: 28, col: 74, offset: 661}, + label: "expr", + expr: &ruleRefExpr{ + pos: position{line: 28, col: 79, offset: 666}, + name: "Expression", + }, + }, + &ruleRefExpr{ + pos: position{line: 28, col: 90, offset: 677}, + name: "EOS", + }, + }, + }, + }, + }, + { + name: "Expression", + pos: position{line: 41, col: 1, offset: 961}, + expr: &ruleRefExpr{ + pos: position{line: 41, col: 14, offset: 976}, + name: "ChoiceExpr", + }, + }, + { + name: "ChoiceExpr", + pos: position{line: 43, col: 1, offset: 988}, + expr: &actionExpr{ + pos: position{line: 43, col: 14, offset: 1003}, + run: (*parser).callonChoiceExpr1, + expr: &seqExpr{ + pos: position{line: 43, col: 14, offset: 1003}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 43, col: 14, offset: 1003}, + label: "first", + expr: &ruleRefExpr{ + pos: position{line: 43, col: 20, offset: 1009}, + name: "ActionExpr", + }, + }, + &labeledExpr{ + pos: position{line: 43, col: 31, offset: 1020}, + label: "rest", + expr: &zeroOrMoreExpr{ + pos: position{line: 43, col: 36, offset: 1025}, + expr: &seqExpr{ + pos: position{line: 43, col: 38, offset: 1027}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 43, col: 38, offset: 1027}, + name: "__", + }, + &litMatcher{ + pos: position{line: 43, col: 41, offset: 1030}, + val: "/", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 43, col: 45, offset: 1034}, + name: "__", + }, + &ruleRefExpr{ + pos: position{line: 43, col: 48, offset: 1037}, + name: "ActionExpr", + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "ActionExpr", + pos: position{line: 58, col: 1, offset: 1442}, + expr: &actionExpr{ + pos: position{line: 58, col: 14, offset: 1457}, + run: (*parser).callonActionExpr1, + expr: &seqExpr{ + pos: position{line: 58, col: 14, offset: 1457}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 58, col: 14, offset: 1457}, + label: "expr", + expr: &ruleRefExpr{ + pos: position{line: 58, col: 19, offset: 1462}, + name: "SeqExpr", + }, + }, + &labeledExpr{ + pos: position{line: 58, col: 27, offset: 1470}, + label: "code", + expr: &zeroOrOneExpr{ + pos: position{line: 58, col: 32, offset: 1475}, + expr: &seqExpr{ + pos: position{line: 58, col: 34, offset: 1477}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 58, col: 34, offset: 1477}, + name: "__", + }, + &ruleRefExpr{ + pos: position{line: 58, col: 37, offset: 1480}, + name: "CodeBlock", + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "SeqExpr", + pos: position{line: 72, col: 1, offset: 1746}, + expr: &actionExpr{ + pos: position{line: 72, col: 11, offset: 1758}, + run: (*parser).callonSeqExpr1, + expr: &seqExpr{ + pos: position{line: 72, col: 11, offset: 1758}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 72, col: 11, offset: 1758}, + label: "first", + expr: &ruleRefExpr{ + pos: position{line: 72, col: 17, offset: 1764}, + name: "LabeledExpr", + }, + }, + &labeledExpr{ + pos: position{line: 72, col: 29, offset: 1776}, + label: "rest", + expr: &zeroOrMoreExpr{ + pos: position{line: 72, col: 34, offset: 1781}, + expr: &seqExpr{ + pos: position{line: 72, col: 36, offset: 1783}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 72, col: 36, offset: 1783}, + name: "__", + }, + &ruleRefExpr{ + pos: position{line: 72, col: 39, offset: 1786}, + name: "LabeledExpr", + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "LabeledExpr", + pos: position{line: 85, col: 1, offset: 2137}, + expr: &choiceExpr{ + pos: position{line: 85, col: 15, offset: 2153}, + alternatives: []interface{}{ + &actionExpr{ + pos: position{line: 85, col: 15, offset: 2153}, + run: (*parser).callonLabeledExpr2, + expr: &seqExpr{ + pos: position{line: 85, col: 15, offset: 2153}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 85, col: 15, offset: 2153}, + label: "label", + expr: &ruleRefExpr{ + pos: position{line: 85, col: 21, offset: 2159}, + name: "Identifier", + }, + }, + &ruleRefExpr{ + pos: position{line: 85, col: 32, offset: 2170}, + name: "__", + }, + &litMatcher{ + pos: position{line: 85, col: 35, offset: 2173}, + val: ":", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 85, col: 39, offset: 2177}, + name: "__", + }, + &labeledExpr{ + pos: position{line: 85, col: 42, offset: 2180}, + label: "expr", + expr: &ruleRefExpr{ + pos: position{line: 85, col: 47, offset: 2185}, + name: "PrefixedExpr", + }, + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 91, col: 5, offset: 2358}, + name: "PrefixedExpr", + }, + }, + }, + }, + { + name: "PrefixedExpr", + pos: position{line: 93, col: 1, offset: 2372}, + expr: &choiceExpr{ + pos: position{line: 93, col: 16, offset: 2389}, + alternatives: []interface{}{ + &actionExpr{ + pos: position{line: 93, col: 16, offset: 2389}, + run: (*parser).callonPrefixedExpr2, + expr: &seqExpr{ + pos: position{line: 93, col: 16, offset: 2389}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 93, col: 16, offset: 2389}, + label: "op", + expr: &ruleRefExpr{ + pos: position{line: 93, col: 19, offset: 2392}, + name: "PrefixedOp", + }, + }, + &ruleRefExpr{ + pos: position{line: 93, col: 30, offset: 2403}, + name: "__", + }, + &labeledExpr{ + pos: position{line: 93, col: 33, offset: 2406}, + label: "expr", + expr: &ruleRefExpr{ + pos: position{line: 93, col: 38, offset: 2411}, + name: "SuffixedExpr", + }, + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 104, col: 5, offset: 2693}, + name: "SuffixedExpr", + }, + }, + }, + }, + { + name: "PrefixedOp", + pos: position{line: 106, col: 1, offset: 2707}, + expr: &actionExpr{ + pos: position{line: 106, col: 14, offset: 2722}, + run: (*parser).callonPrefixedOp1, + expr: &choiceExpr{ + pos: position{line: 106, col: 16, offset: 2724}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 106, col: 16, offset: 2724}, + val: "&", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 106, col: 22, offset: 2730}, + val: "!", + ignoreCase: false, + }, + }, + }, + }, + }, + { + name: "SuffixedExpr", + pos: position{line: 110, col: 1, offset: 2772}, + expr: &choiceExpr{ + pos: position{line: 110, col: 16, offset: 2789}, + alternatives: []interface{}{ + &actionExpr{ + pos: position{line: 110, col: 16, offset: 2789}, + run: (*parser).callonSuffixedExpr2, + expr: &seqExpr{ + pos: position{line: 110, col: 16, offset: 2789}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 110, col: 16, offset: 2789}, + label: "expr", + expr: &ruleRefExpr{ + pos: position{line: 110, col: 21, offset: 2794}, + name: "PrimaryExpr", + }, + }, + &ruleRefExpr{ + pos: position{line: 110, col: 33, offset: 2806}, + name: "__", + }, + &labeledExpr{ + pos: position{line: 110, col: 36, offset: 2809}, + label: "op", + expr: &ruleRefExpr{ + pos: position{line: 110, col: 39, offset: 2812}, + name: "SuffixedOp", + }, + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 129, col: 5, offset: 3342}, + name: "PrimaryExpr", + }, + }, + }, + }, + { + name: "SuffixedOp", + pos: position{line: 131, col: 1, offset: 3356}, + expr: &actionExpr{ + pos: position{line: 131, col: 14, offset: 3371}, + run: (*parser).callonSuffixedOp1, + expr: &choiceExpr{ + pos: position{line: 131, col: 16, offset: 3373}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 131, col: 16, offset: 3373}, + val: "?", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 131, col: 22, offset: 3379}, + val: "*", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 131, col: 28, offset: 3385}, + val: "+", + ignoreCase: false, + }, + }, + }, + }, + }, + { + name: "PrimaryExpr", + pos: position{line: 135, col: 1, offset: 3427}, + expr: &choiceExpr{ + pos: position{line: 135, col: 15, offset: 3443}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 135, col: 15, offset: 3443}, + name: "LitMatcher", + }, + &ruleRefExpr{ + pos: position{line: 135, col: 28, offset: 3456}, + name: "CharClassMatcher", + }, + &ruleRefExpr{ + pos: position{line: 135, col: 47, offset: 3475}, + name: "AnyMatcher", + }, + &ruleRefExpr{ + pos: position{line: 135, col: 60, offset: 3488}, + name: "RuleRefExpr", + }, + &ruleRefExpr{ + pos: position{line: 135, col: 74, offset: 3502}, + name: "SemanticPredExpr", + }, + &actionExpr{ + pos: position{line: 135, col: 93, offset: 3521}, + run: (*parser).callonPrimaryExpr7, + expr: &seqExpr{ + pos: position{line: 135, col: 93, offset: 3521}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 135, col: 93, offset: 3521}, + val: "(", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 135, col: 97, offset: 3525}, + name: "__", + }, + &labeledExpr{ + pos: position{line: 135, col: 100, offset: 3528}, + label: "expr", + expr: &ruleRefExpr{ + pos: position{line: 135, col: 105, offset: 3533}, + name: "Expression", + }, + }, + &ruleRefExpr{ + pos: position{line: 135, col: 116, offset: 3544}, + name: "__", + }, + &litMatcher{ + pos: position{line: 135, col: 119, offset: 3547}, + val: ")", + ignoreCase: false, + }, + }, + }, + }, + }, + }, + }, + { + name: "RuleRefExpr", + pos: position{line: 138, col: 1, offset: 3576}, + expr: &actionExpr{ + pos: position{line: 138, col: 15, offset: 3592}, + run: (*parser).callonRuleRefExpr1, + expr: &seqExpr{ + pos: position{line: 138, col: 15, offset: 3592}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 138, col: 15, offset: 3592}, + label: "name", + expr: &ruleRefExpr{ + pos: position{line: 138, col: 20, offset: 3597}, + name: "IdentifierName", + }, + }, + ¬Expr{ + pos: position{line: 138, col: 35, offset: 3612}, + expr: &seqExpr{ + pos: position{line: 138, col: 38, offset: 3615}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 138, col: 38, offset: 3615}, + name: "__", + }, + &zeroOrOneExpr{ + pos: position{line: 138, col: 41, offset: 3618}, + expr: &seqExpr{ + pos: position{line: 138, col: 43, offset: 3620}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 138, col: 43, offset: 3620}, + name: "StringLiteral", + }, + &ruleRefExpr{ + pos: position{line: 138, col: 57, offset: 3634}, + name: "__", + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 138, col: 63, offset: 3640}, + name: "RuleDefOp", + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "SemanticPredExpr", + pos: position{line: 143, col: 1, offset: 3756}, + expr: &actionExpr{ + pos: position{line: 143, col: 20, offset: 3777}, + run: (*parser).callonSemanticPredExpr1, + expr: &seqExpr{ + pos: position{line: 143, col: 20, offset: 3777}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 143, col: 20, offset: 3777}, + label: "op", + expr: &ruleRefExpr{ + pos: position{line: 143, col: 23, offset: 3780}, + name: "SemanticPredOp", + }, + }, + &ruleRefExpr{ + pos: position{line: 143, col: 38, offset: 3795}, + name: "__", + }, + &labeledExpr{ + pos: position{line: 143, col: 41, offset: 3798}, + label: "code", + expr: &ruleRefExpr{ + pos: position{line: 143, col: 46, offset: 3803}, + name: "CodeBlock", + }, + }, + }, + }, + }, + }, + { + name: "SemanticPredOp", + pos: position{line: 154, col: 1, offset: 4080}, + expr: &actionExpr{ + pos: position{line: 154, col: 18, offset: 4099}, + run: (*parser).callonSemanticPredOp1, + expr: &choiceExpr{ + pos: position{line: 154, col: 20, offset: 4101}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 154, col: 20, offset: 4101}, + val: "&", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 154, col: 26, offset: 4107}, + val: "!", + ignoreCase: false, + }, + }, + }, + }, + }, + { + name: "RuleDefOp", + pos: position{line: 158, col: 1, offset: 4149}, + expr: &choiceExpr{ + pos: position{line: 158, col: 13, offset: 4163}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 158, col: 13, offset: 4163}, + val: "=", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 158, col: 19, offset: 4169}, + val: "<-", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 158, col: 26, offset: 4176}, + val: "←", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 158, col: 37, offset: 4187}, + val: "⟵", + ignoreCase: false, + }, + }, + }, + }, + { + name: "SourceChar", + pos: position{line: 160, col: 1, offset: 4197}, + expr: &anyMatcher{ + line: 160, col: 14, offset: 4212, + }, + }, + { + name: "Comment", + pos: position{line: 161, col: 1, offset: 4214}, + expr: &choiceExpr{ + pos: position{line: 161, col: 11, offset: 4226}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 161, col: 11, offset: 4226}, + name: "MultiLineComment", + }, + &ruleRefExpr{ + pos: position{line: 161, col: 30, offset: 4245}, + name: "SingleLineComment", + }, + }, + }, + }, + { + name: "MultiLineComment", + pos: position{line: 162, col: 1, offset: 4263}, + expr: &seqExpr{ + pos: position{line: 162, col: 20, offset: 4284}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 162, col: 20, offset: 4284}, + val: "/*", + ignoreCase: false, + }, + &zeroOrMoreExpr{ + pos: position{line: 162, col: 25, offset: 4289}, + expr: &seqExpr{ + pos: position{line: 162, col: 27, offset: 4291}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 162, col: 27, offset: 4291}, + expr: &litMatcher{ + pos: position{line: 162, col: 28, offset: 4292}, + val: "*/", + ignoreCase: false, + }, + }, + &ruleRefExpr{ + pos: position{line: 162, col: 33, offset: 4297}, + name: "SourceChar", + }, + }, + }, + }, + &litMatcher{ + pos: position{line: 162, col: 47, offset: 4311}, + val: "*/", + ignoreCase: false, + }, + }, + }, + }, + { + name: "MultiLineCommentNoLineTerminator", + pos: position{line: 163, col: 1, offset: 4316}, + expr: &seqExpr{ + pos: position{line: 163, col: 36, offset: 4353}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 163, col: 36, offset: 4353}, + val: "/*", + ignoreCase: false, + }, + &zeroOrMoreExpr{ + pos: position{line: 163, col: 41, offset: 4358}, + expr: &seqExpr{ + pos: position{line: 163, col: 43, offset: 4360}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 163, col: 43, offset: 4360}, + expr: &choiceExpr{ + pos: position{line: 163, col: 46, offset: 4363}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 163, col: 46, offset: 4363}, + val: "*/", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 163, col: 53, offset: 4370}, + name: "EOL", + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 163, col: 59, offset: 4376}, + name: "SourceChar", + }, + }, + }, + }, + &litMatcher{ + pos: position{line: 163, col: 73, offset: 4390}, + val: "*/", + ignoreCase: false, + }, + }, + }, + }, + { + name: "SingleLineComment", + pos: position{line: 164, col: 1, offset: 4395}, + expr: &seqExpr{ + pos: position{line: 164, col: 21, offset: 4417}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 164, col: 21, offset: 4417}, + val: "//", + ignoreCase: false, + }, + &zeroOrMoreExpr{ + pos: position{line: 164, col: 26, offset: 4422}, + expr: &seqExpr{ + pos: position{line: 164, col: 28, offset: 4424}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 164, col: 28, offset: 4424}, + expr: &ruleRefExpr{ + pos: position{line: 164, col: 29, offset: 4425}, + name: "EOL", + }, + }, + &ruleRefExpr{ + pos: position{line: 164, col: 33, offset: 4429}, + name: "SourceChar", + }, + }, + }, + }, + }, + }, + }, + { + name: "Identifier", + pos: position{line: 166, col: 1, offset: 4444}, + expr: &actionExpr{ + pos: position{line: 166, col: 14, offset: 4459}, + run: (*parser).callonIdentifier1, + expr: &labeledExpr{ + pos: position{line: 166, col: 14, offset: 4459}, + label: "ident", + expr: &ruleRefExpr{ + pos: position{line: 166, col: 20, offset: 4465}, + name: "IdentifierName", + }, + }, + }, + }, + { + name: "IdentifierName", + pos: position{line: 174, col: 1, offset: 4684}, + expr: &actionExpr{ + pos: position{line: 174, col: 18, offset: 4703}, + run: (*parser).callonIdentifierName1, + expr: &seqExpr{ + pos: position{line: 174, col: 18, offset: 4703}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 174, col: 18, offset: 4703}, + name: "IdentifierStart", + }, + &zeroOrMoreExpr{ + pos: position{line: 174, col: 34, offset: 4719}, + expr: &ruleRefExpr{ + pos: position{line: 174, col: 34, offset: 4719}, + name: "IdentifierPart", + }, + }, + }, + }, + }, + }, + { + name: "IdentifierStart", + pos: position{line: 177, col: 1, offset: 4801}, + expr: &charClassMatcher{ + pos: position{line: 177, col: 19, offset: 4821}, + val: "[\\pL_]", + chars: []rune{'_'}, + classes: []*unicode.RangeTable{rangeTable("L")}, + ignoreCase: false, + inverted: false, + }, + }, + { + name: "IdentifierPart", + pos: position{line: 178, col: 1, offset: 4828}, + expr: &choiceExpr{ + pos: position{line: 178, col: 18, offset: 4847}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 178, col: 18, offset: 4847}, + name: "IdentifierStart", + }, + &charClassMatcher{ + pos: position{line: 178, col: 36, offset: 4865}, + val: "[\\p{Nd}]", + classes: []*unicode.RangeTable{rangeTable("Nd")}, + ignoreCase: false, + inverted: false, + }, + }, + }, + }, + { + name: "LitMatcher", + pos: position{line: 180, col: 1, offset: 4875}, + expr: &actionExpr{ + pos: position{line: 180, col: 14, offset: 4890}, + run: (*parser).callonLitMatcher1, + expr: &seqExpr{ + pos: position{line: 180, col: 14, offset: 4890}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 180, col: 14, offset: 4890}, + label: "lit", + expr: &ruleRefExpr{ + pos: position{line: 180, col: 18, offset: 4894}, + name: "StringLiteral", + }, + }, + &labeledExpr{ + pos: position{line: 180, col: 32, offset: 4908}, + label: "ignore", + expr: &zeroOrOneExpr{ + pos: position{line: 180, col: 39, offset: 4915}, + expr: &litMatcher{ + pos: position{line: 180, col: 39, offset: 4915}, + val: "i", + ignoreCase: false, + }, + }, + }, + }, + }, + }, + }, + { + name: "StringLiteral", + pos: position{line: 193, col: 1, offset: 5314}, + expr: &choiceExpr{ + pos: position{line: 193, col: 17, offset: 5332}, + alternatives: []interface{}{ + &actionExpr{ + pos: position{line: 193, col: 17, offset: 5332}, + run: (*parser).callonStringLiteral2, + expr: &choiceExpr{ + pos: position{line: 193, col: 19, offset: 5334}, + alternatives: []interface{}{ + &seqExpr{ + pos: position{line: 193, col: 19, offset: 5334}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 193, col: 19, offset: 5334}, + val: "\"", + ignoreCase: false, + }, + &zeroOrMoreExpr{ + pos: position{line: 193, col: 23, offset: 5338}, + expr: &ruleRefExpr{ + pos: position{line: 193, col: 23, offset: 5338}, + name: "DoubleStringChar", + }, + }, + &litMatcher{ + pos: position{line: 193, col: 41, offset: 5356}, + val: "\"", + ignoreCase: false, + }, + }, + }, + &seqExpr{ + pos: position{line: 193, col: 47, offset: 5362}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 193, col: 47, offset: 5362}, + val: "'", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 193, col: 51, offset: 5366}, + name: "SingleStringChar", + }, + &litMatcher{ + pos: position{line: 193, col: 68, offset: 5383}, + val: "'", + ignoreCase: false, + }, + }, + }, + &seqExpr{ + pos: position{line: 193, col: 74, offset: 5389}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 193, col: 74, offset: 5389}, + val: "`", + ignoreCase: false, + }, + &zeroOrMoreExpr{ + pos: position{line: 193, col: 78, offset: 5393}, + expr: &ruleRefExpr{ + pos: position{line: 193, col: 78, offset: 5393}, + name: "RawStringChar", + }, + }, + &litMatcher{ + pos: position{line: 193, col: 93, offset: 5408}, + val: "`", + ignoreCase: false, + }, + }, + }, + }, + }, + }, + &actionExpr{ + pos: position{line: 195, col: 5, offset: 5481}, + run: (*parser).callonStringLiteral18, + expr: &choiceExpr{ + pos: position{line: 195, col: 7, offset: 5483}, + alternatives: []interface{}{ + &seqExpr{ + pos: position{line: 195, col: 9, offset: 5485}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 195, col: 9, offset: 5485}, + val: "\"", + ignoreCase: false, + }, + &zeroOrMoreExpr{ + pos: position{line: 195, col: 13, offset: 5489}, + expr: &ruleRefExpr{ + pos: position{line: 195, col: 13, offset: 5489}, + name: "DoubleStringChar", + }, + }, + &choiceExpr{ + pos: position{line: 195, col: 33, offset: 5509}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 195, col: 33, offset: 5509}, + name: "EOL", + }, + &ruleRefExpr{ + pos: position{line: 195, col: 39, offset: 5515}, + name: "EOF", + }, + }, + }, + }, + }, + &seqExpr{ + pos: position{line: 195, col: 51, offset: 5527}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 195, col: 51, offset: 5527}, + val: "'", + ignoreCase: false, + }, + &zeroOrOneExpr{ + pos: position{line: 195, col: 55, offset: 5531}, + expr: &ruleRefExpr{ + pos: position{line: 195, col: 55, offset: 5531}, + name: "SingleStringChar", + }, + }, + &choiceExpr{ + pos: position{line: 195, col: 75, offset: 5551}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 195, col: 75, offset: 5551}, + name: "EOL", + }, + &ruleRefExpr{ + pos: position{line: 195, col: 81, offset: 5557}, + name: "EOF", + }, + }, + }, + }, + }, + &seqExpr{ + pos: position{line: 195, col: 91, offset: 5567}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 195, col: 91, offset: 5567}, + val: "`", + ignoreCase: false, + }, + &zeroOrMoreExpr{ + pos: position{line: 195, col: 95, offset: 5571}, + expr: &ruleRefExpr{ + pos: position{line: 195, col: 95, offset: 5571}, + name: "RawStringChar", + }, + }, + &ruleRefExpr{ + pos: position{line: 195, col: 110, offset: 5586}, + name: "EOF", + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "DoubleStringChar", + pos: position{line: 199, col: 1, offset: 5688}, + expr: &choiceExpr{ + pos: position{line: 199, col: 20, offset: 5709}, + alternatives: []interface{}{ + &seqExpr{ + pos: position{line: 199, col: 20, offset: 5709}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 199, col: 20, offset: 5709}, + expr: &choiceExpr{ + pos: position{line: 199, col: 23, offset: 5712}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 199, col: 23, offset: 5712}, + val: "\"", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 199, col: 29, offset: 5718}, + val: "\\", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 199, col: 36, offset: 5725}, + name: "EOL", + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 199, col: 42, offset: 5731}, + name: "SourceChar", + }, + }, + }, + &seqExpr{ + pos: position{line: 199, col: 55, offset: 5744}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 199, col: 55, offset: 5744}, + val: "\\", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 199, col: 60, offset: 5749}, + name: "DoubleStringEscape", + }, + }, + }, + }, + }, + }, + { + name: "SingleStringChar", + pos: position{line: 200, col: 1, offset: 5768}, + expr: &choiceExpr{ + pos: position{line: 200, col: 20, offset: 5789}, + alternatives: []interface{}{ + &seqExpr{ + pos: position{line: 200, col: 20, offset: 5789}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 200, col: 20, offset: 5789}, + expr: &choiceExpr{ + pos: position{line: 200, col: 23, offset: 5792}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 200, col: 23, offset: 5792}, + val: "'", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 200, col: 29, offset: 5798}, + val: "\\", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 200, col: 36, offset: 5805}, + name: "EOL", + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 200, col: 42, offset: 5811}, + name: "SourceChar", + }, + }, + }, + &seqExpr{ + pos: position{line: 200, col: 55, offset: 5824}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 200, col: 55, offset: 5824}, + val: "\\", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 200, col: 60, offset: 5829}, + name: "SingleStringEscape", + }, + }, + }, + }, + }, + }, + { + name: "RawStringChar", + pos: position{line: 201, col: 1, offset: 5848}, + expr: &seqExpr{ + pos: position{line: 201, col: 17, offset: 5866}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 201, col: 17, offset: 5866}, + expr: &litMatcher{ + pos: position{line: 201, col: 18, offset: 5867}, + val: "`", + ignoreCase: false, + }, + }, + &ruleRefExpr{ + pos: position{line: 201, col: 22, offset: 5871}, + name: "SourceChar", + }, + }, + }, + }, + { + name: "DoubleStringEscape", + pos: position{line: 203, col: 1, offset: 5883}, + expr: &choiceExpr{ + pos: position{line: 203, col: 22, offset: 5906}, + alternatives: []interface{}{ + &choiceExpr{ + pos: position{line: 203, col: 24, offset: 5908}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 203, col: 24, offset: 5908}, + val: "\"", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 203, col: 30, offset: 5914}, + name: "CommonEscapeSequence", + }, + }, + }, + &actionExpr{ + pos: position{line: 204, col: 7, offset: 5943}, + run: (*parser).callonDoubleStringEscape5, + expr: &choiceExpr{ + pos: position{line: 204, col: 9, offset: 5945}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 204, col: 9, offset: 5945}, + name: "SourceChar", + }, + &ruleRefExpr{ + pos: position{line: 204, col: 22, offset: 5958}, + name: "EOL", + }, + &ruleRefExpr{ + pos: position{line: 204, col: 28, offset: 5964}, + name: "EOF", + }, + }, + }, + }, + }, + }, + }, + { + name: "SingleStringEscape", + pos: position{line: 207, col: 1, offset: 6029}, + expr: &choiceExpr{ + pos: position{line: 207, col: 22, offset: 6052}, + alternatives: []interface{}{ + &choiceExpr{ + pos: position{line: 207, col: 24, offset: 6054}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 207, col: 24, offset: 6054}, + val: "'", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 207, col: 30, offset: 6060}, + name: "CommonEscapeSequence", + }, + }, + }, + &actionExpr{ + pos: position{line: 208, col: 7, offset: 6089}, + run: (*parser).callonSingleStringEscape5, + expr: &choiceExpr{ + pos: position{line: 208, col: 9, offset: 6091}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 208, col: 9, offset: 6091}, + name: "SourceChar", + }, + &ruleRefExpr{ + pos: position{line: 208, col: 22, offset: 6104}, + name: "EOL", + }, + &ruleRefExpr{ + pos: position{line: 208, col: 28, offset: 6110}, + name: "EOF", + }, + }, + }, + }, + }, + }, + }, + { + name: "CommonEscapeSequence", + pos: position{line: 212, col: 1, offset: 6176}, + expr: &choiceExpr{ + pos: position{line: 212, col: 24, offset: 6201}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 212, col: 24, offset: 6201}, + name: "SingleCharEscape", + }, + &ruleRefExpr{ + pos: position{line: 212, col: 43, offset: 6220}, + name: "OctalEscape", + }, + &ruleRefExpr{ + pos: position{line: 212, col: 57, offset: 6234}, + name: "HexEscape", + }, + &ruleRefExpr{ + pos: position{line: 212, col: 69, offset: 6246}, + name: "LongUnicodeEscape", + }, + &ruleRefExpr{ + pos: position{line: 212, col: 89, offset: 6266}, + name: "ShortUnicodeEscape", + }, + }, + }, + }, + { + name: "SingleCharEscape", + pos: position{line: 213, col: 1, offset: 6285}, + expr: &choiceExpr{ + pos: position{line: 213, col: 20, offset: 6306}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 213, col: 20, offset: 6306}, + val: "a", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 213, col: 26, offset: 6312}, + val: "b", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 213, col: 32, offset: 6318}, + val: "n", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 213, col: 38, offset: 6324}, + val: "f", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 213, col: 44, offset: 6330}, + val: "r", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 213, col: 50, offset: 6336}, + val: "t", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 213, col: 56, offset: 6342}, + val: "v", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 213, col: 62, offset: 6348}, + val: "\\", + ignoreCase: false, + }, + }, + }, + }, + { + name: "OctalEscape", + pos: position{line: 214, col: 1, offset: 6353}, + expr: &choiceExpr{ + pos: position{line: 214, col: 15, offset: 6369}, + alternatives: []interface{}{ + &seqExpr{ + pos: position{line: 214, col: 15, offset: 6369}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 214, col: 15, offset: 6369}, + name: "OctalDigit", + }, + &ruleRefExpr{ + pos: position{line: 214, col: 26, offset: 6380}, + name: "OctalDigit", + }, + &ruleRefExpr{ + pos: position{line: 214, col: 37, offset: 6391}, + name: "OctalDigit", + }, + }, + }, + &actionExpr{ + pos: position{line: 215, col: 7, offset: 6408}, + run: (*parser).callonOctalEscape6, + expr: &seqExpr{ + pos: position{line: 215, col: 7, offset: 6408}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 215, col: 7, offset: 6408}, + name: "OctalDigit", + }, + &choiceExpr{ + pos: position{line: 215, col: 20, offset: 6421}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 215, col: 20, offset: 6421}, + name: "SourceChar", + }, + &ruleRefExpr{ + pos: position{line: 215, col: 33, offset: 6434}, + name: "EOL", + }, + &ruleRefExpr{ + pos: position{line: 215, col: 39, offset: 6440}, + name: "EOF", + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "HexEscape", + pos: position{line: 218, col: 1, offset: 6501}, + expr: &choiceExpr{ + pos: position{line: 218, col: 13, offset: 6515}, + alternatives: []interface{}{ + &seqExpr{ + pos: position{line: 218, col: 13, offset: 6515}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 218, col: 13, offset: 6515}, + val: "x", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 218, col: 17, offset: 6519}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 218, col: 26, offset: 6528}, + name: "HexDigit", + }, + }, + }, + &actionExpr{ + pos: position{line: 219, col: 7, offset: 6543}, + run: (*parser).callonHexEscape6, + expr: &seqExpr{ + pos: position{line: 219, col: 7, offset: 6543}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 219, col: 7, offset: 6543}, + val: "x", + ignoreCase: false, + }, + &choiceExpr{ + pos: position{line: 219, col: 13, offset: 6549}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 219, col: 13, offset: 6549}, + name: "SourceChar", + }, + &ruleRefExpr{ + pos: position{line: 219, col: 26, offset: 6562}, + name: "EOL", + }, + &ruleRefExpr{ + pos: position{line: 219, col: 32, offset: 6568}, + name: "EOF", + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "LongUnicodeEscape", + pos: position{line: 222, col: 1, offset: 6635}, + expr: &choiceExpr{ + pos: position{line: 223, col: 5, offset: 6662}, + alternatives: []interface{}{ + &actionExpr{ + pos: position{line: 223, col: 5, offset: 6662}, + run: (*parser).callonLongUnicodeEscape2, + expr: &seqExpr{ + pos: position{line: 223, col: 5, offset: 6662}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 223, col: 5, offset: 6662}, + val: "U", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 223, col: 9, offset: 6666}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 223, col: 18, offset: 6675}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 223, col: 27, offset: 6684}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 223, col: 36, offset: 6693}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 223, col: 45, offset: 6702}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 223, col: 54, offset: 6711}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 223, col: 63, offset: 6720}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 223, col: 72, offset: 6729}, + name: "HexDigit", + }, + }, + }, + }, + &actionExpr{ + pos: position{line: 226, col: 7, offset: 6831}, + run: (*parser).callonLongUnicodeEscape13, + expr: &seqExpr{ + pos: position{line: 226, col: 7, offset: 6831}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 226, col: 7, offset: 6831}, + val: "U", + ignoreCase: false, + }, + &choiceExpr{ + pos: position{line: 226, col: 13, offset: 6837}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 226, col: 13, offset: 6837}, + name: "SourceChar", + }, + &ruleRefExpr{ + pos: position{line: 226, col: 26, offset: 6850}, + name: "EOL", + }, + &ruleRefExpr{ + pos: position{line: 226, col: 32, offset: 6856}, + name: "EOF", + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "ShortUnicodeEscape", + pos: position{line: 229, col: 1, offset: 6919}, + expr: &choiceExpr{ + pos: position{line: 230, col: 5, offset: 6947}, + alternatives: []interface{}{ + &actionExpr{ + pos: position{line: 230, col: 5, offset: 6947}, + run: (*parser).callonShortUnicodeEscape2, + expr: &seqExpr{ + pos: position{line: 230, col: 5, offset: 6947}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 230, col: 5, offset: 6947}, + val: "u", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 230, col: 9, offset: 6951}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 230, col: 18, offset: 6960}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 230, col: 27, offset: 6969}, + name: "HexDigit", + }, + &ruleRefExpr{ + pos: position{line: 230, col: 36, offset: 6978}, + name: "HexDigit", + }, + }, + }, + }, + &actionExpr{ + pos: position{line: 233, col: 7, offset: 7080}, + run: (*parser).callonShortUnicodeEscape9, + expr: &seqExpr{ + pos: position{line: 233, col: 7, offset: 7080}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 233, col: 7, offset: 7080}, + val: "u", + ignoreCase: false, + }, + &choiceExpr{ + pos: position{line: 233, col: 13, offset: 7086}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 233, col: 13, offset: 7086}, + name: "SourceChar", + }, + &ruleRefExpr{ + pos: position{line: 233, col: 26, offset: 7099}, + name: "EOL", + }, + &ruleRefExpr{ + pos: position{line: 233, col: 32, offset: 7105}, + name: "EOF", + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "OctalDigit", + pos: position{line: 237, col: 1, offset: 7169}, + expr: &charClassMatcher{ + pos: position{line: 237, col: 14, offset: 7184}, + val: "[0-7]", + ranges: []rune{'0', '7'}, + ignoreCase: false, + inverted: false, + }, + }, + { + name: "DecimalDigit", + pos: position{line: 238, col: 1, offset: 7190}, + expr: &charClassMatcher{ + pos: position{line: 238, col: 16, offset: 7207}, + val: "[0-9]", + ranges: []rune{'0', '9'}, + ignoreCase: false, + inverted: false, + }, + }, + { + name: "HexDigit", + pos: position{line: 239, col: 1, offset: 7213}, + expr: &charClassMatcher{ + pos: position{line: 239, col: 12, offset: 7226}, + val: "[0-9a-f]i", + ranges: []rune{'0', '9', 'a', 'f'}, + ignoreCase: true, + inverted: false, + }, + }, + { + name: "CharClassMatcher", + pos: position{line: 241, col: 1, offset: 7237}, + expr: &choiceExpr{ + pos: position{line: 241, col: 20, offset: 7258}, + alternatives: []interface{}{ + &actionExpr{ + pos: position{line: 241, col: 20, offset: 7258}, + run: (*parser).callonCharClassMatcher2, + expr: &seqExpr{ + pos: position{line: 241, col: 20, offset: 7258}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 241, col: 20, offset: 7258}, + val: "[", + ignoreCase: false, + }, + &zeroOrMoreExpr{ + pos: position{line: 241, col: 24, offset: 7262}, + expr: &choiceExpr{ + pos: position{line: 241, col: 26, offset: 7264}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 241, col: 26, offset: 7264}, + name: "ClassCharRange", + }, + &ruleRefExpr{ + pos: position{line: 241, col: 43, offset: 7281}, + name: "ClassChar", + }, + &seqExpr{ + pos: position{line: 241, col: 55, offset: 7293}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 241, col: 55, offset: 7293}, + val: "\\", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 241, col: 60, offset: 7298}, + name: "UnicodeClassEscape", + }, + }, + }, + }, + }, + }, + &litMatcher{ + pos: position{line: 241, col: 82, offset: 7320}, + val: "]", + ignoreCase: false, + }, + &zeroOrOneExpr{ + pos: position{line: 241, col: 86, offset: 7324}, + expr: &litMatcher{ + pos: position{line: 241, col: 86, offset: 7324}, + val: "i", + ignoreCase: false, + }, + }, + }, + }, + }, + &actionExpr{ + pos: position{line: 245, col: 5, offset: 7431}, + run: (*parser).callonCharClassMatcher15, + expr: &seqExpr{ + pos: position{line: 245, col: 5, offset: 7431}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 245, col: 5, offset: 7431}, + val: "[", + ignoreCase: false, + }, + &zeroOrMoreExpr{ + pos: position{line: 245, col: 9, offset: 7435}, + expr: &seqExpr{ + pos: position{line: 245, col: 11, offset: 7437}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 245, col: 11, offset: 7437}, + expr: &ruleRefExpr{ + pos: position{line: 245, col: 14, offset: 7440}, + name: "EOL", + }, + }, + &ruleRefExpr{ + pos: position{line: 245, col: 20, offset: 7446}, + name: "SourceChar", + }, + }, + }, + }, + &choiceExpr{ + pos: position{line: 245, col: 36, offset: 7462}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 245, col: 36, offset: 7462}, + name: "EOL", + }, + &ruleRefExpr{ + pos: position{line: 245, col: 42, offset: 7468}, + name: "EOF", + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "ClassCharRange", + pos: position{line: 249, col: 1, offset: 7578}, + expr: &seqExpr{ + pos: position{line: 249, col: 18, offset: 7597}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 249, col: 18, offset: 7597}, + name: "ClassChar", + }, + &litMatcher{ + pos: position{line: 249, col: 28, offset: 7607}, + val: "-", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 249, col: 32, offset: 7611}, + name: "ClassChar", + }, + }, + }, + }, + { + name: "ClassChar", + pos: position{line: 250, col: 1, offset: 7621}, + expr: &choiceExpr{ + pos: position{line: 250, col: 13, offset: 7635}, + alternatives: []interface{}{ + &seqExpr{ + pos: position{line: 250, col: 13, offset: 7635}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 250, col: 13, offset: 7635}, + expr: &choiceExpr{ + pos: position{line: 250, col: 16, offset: 7638}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 250, col: 16, offset: 7638}, + val: "]", + ignoreCase: false, + }, + &litMatcher{ + pos: position{line: 250, col: 22, offset: 7644}, + val: "\\", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 250, col: 29, offset: 7651}, + name: "EOL", + }, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 250, col: 35, offset: 7657}, + name: "SourceChar", + }, + }, + }, + &seqExpr{ + pos: position{line: 250, col: 48, offset: 7670}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 250, col: 48, offset: 7670}, + val: "\\", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 250, col: 53, offset: 7675}, + name: "CharClassEscape", + }, + }, + }, + }, + }, + }, + { + name: "CharClassEscape", + pos: position{line: 251, col: 1, offset: 7691}, + expr: &choiceExpr{ + pos: position{line: 251, col: 19, offset: 7711}, + alternatives: []interface{}{ + &choiceExpr{ + pos: position{line: 251, col: 21, offset: 7713}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 251, col: 21, offset: 7713}, + val: "]", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 251, col: 27, offset: 7719}, + name: "CommonEscapeSequence", + }, + }, + }, + &actionExpr{ + pos: position{line: 252, col: 7, offset: 7748}, + run: (*parser).callonCharClassEscape5, + expr: &seqExpr{ + pos: position{line: 252, col: 7, offset: 7748}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 252, col: 7, offset: 7748}, + expr: &litMatcher{ + pos: position{line: 252, col: 8, offset: 7749}, + val: "p", + ignoreCase: false, + }, + }, + &choiceExpr{ + pos: position{line: 252, col: 14, offset: 7755}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 252, col: 14, offset: 7755}, + name: "SourceChar", + }, + &ruleRefExpr{ + pos: position{line: 252, col: 27, offset: 7768}, + name: "EOL", + }, + &ruleRefExpr{ + pos: position{line: 252, col: 33, offset: 7774}, + name: "EOF", + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "UnicodeClassEscape", + pos: position{line: 256, col: 1, offset: 7840}, + expr: &seqExpr{ + pos: position{line: 256, col: 22, offset: 7863}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 256, col: 22, offset: 7863}, + val: "p", + ignoreCase: false, + }, + &choiceExpr{ + pos: position{line: 257, col: 7, offset: 7876}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 257, col: 7, offset: 7876}, + name: "SingleCharUnicodeClass", + }, + &actionExpr{ + pos: position{line: 258, col: 7, offset: 7905}, + run: (*parser).callonUnicodeClassEscape5, + expr: &seqExpr{ + pos: position{line: 258, col: 7, offset: 7905}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 258, col: 7, offset: 7905}, + expr: &litMatcher{ + pos: position{line: 258, col: 8, offset: 7906}, + val: "{", + ignoreCase: false, + }, + }, + &choiceExpr{ + pos: position{line: 258, col: 14, offset: 7912}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 258, col: 14, offset: 7912}, + name: "SourceChar", + }, + &ruleRefExpr{ + pos: position{line: 258, col: 27, offset: 7925}, + name: "EOL", + }, + &ruleRefExpr{ + pos: position{line: 258, col: 33, offset: 7931}, + name: "EOF", + }, + }, + }, + }, + }, + }, + &actionExpr{ + pos: position{line: 259, col: 7, offset: 8002}, + run: (*parser).callonUnicodeClassEscape13, + expr: &seqExpr{ + pos: position{line: 259, col: 7, offset: 8002}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 259, col: 7, offset: 8002}, + val: "{", + ignoreCase: false, + }, + &labeledExpr{ + pos: position{line: 259, col: 11, offset: 8006}, + label: "ident", + expr: &ruleRefExpr{ + pos: position{line: 259, col: 17, offset: 8012}, + name: "IdentifierName", + }, + }, + &litMatcher{ + pos: position{line: 259, col: 32, offset: 8027}, + val: "}", + ignoreCase: false, + }, + }, + }, + }, + &actionExpr{ + pos: position{line: 265, col: 7, offset: 8204}, + run: (*parser).callonUnicodeClassEscape19, + expr: &seqExpr{ + pos: position{line: 265, col: 7, offset: 8204}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 265, col: 7, offset: 8204}, + val: "{", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 265, col: 11, offset: 8208}, + name: "IdentifierName", + }, + &choiceExpr{ + pos: position{line: 265, col: 28, offset: 8225}, + alternatives: []interface{}{ + &litMatcher{ + pos: position{line: 265, col: 28, offset: 8225}, + val: "]", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 265, col: 34, offset: 8231}, + name: "EOL", + }, + &ruleRefExpr{ + pos: position{line: 265, col: 40, offset: 8237}, + name: "EOF", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "SingleCharUnicodeClass", + pos: position{line: 269, col: 1, offset: 8320}, + expr: &charClassMatcher{ + pos: position{line: 269, col: 26, offset: 8347}, + val: "[LMNCPZS]", + chars: []rune{'L', 'M', 'N', 'C', 'P', 'Z', 'S'}, + ignoreCase: false, + inverted: false, + }, + }, + { + name: "AnyMatcher", + pos: position{line: 271, col: 1, offset: 8358}, + expr: &actionExpr{ + pos: position{line: 271, col: 14, offset: 8373}, + run: (*parser).callonAnyMatcher1, + expr: &litMatcher{ + pos: position{line: 271, col: 14, offset: 8373}, + val: ".", + ignoreCase: false, + }, + }, + }, + { + name: "CodeBlock", + pos: position{line: 276, col: 1, offset: 8448}, + expr: &choiceExpr{ + pos: position{line: 276, col: 13, offset: 8462}, + alternatives: []interface{}{ + &actionExpr{ + pos: position{line: 276, col: 13, offset: 8462}, + run: (*parser).callonCodeBlock2, + expr: &seqExpr{ + pos: position{line: 276, col: 13, offset: 8462}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 276, col: 13, offset: 8462}, + val: "{", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 276, col: 17, offset: 8466}, + name: "Code", + }, + &litMatcher{ + pos: position{line: 276, col: 22, offset: 8471}, + val: "}", + ignoreCase: false, + }, + }, + }, + }, + &actionExpr{ + pos: position{line: 280, col: 5, offset: 8570}, + run: (*parser).callonCodeBlock7, + expr: &seqExpr{ + pos: position{line: 280, col: 5, offset: 8570}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 280, col: 5, offset: 8570}, + val: "{", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 280, col: 9, offset: 8574}, + name: "Code", + }, + &ruleRefExpr{ + pos: position{line: 280, col: 14, offset: 8579}, + name: "EOF", + }, + }, + }, + }, + }, + }, + }, + { + name: "Code", + pos: position{line: 284, col: 1, offset: 8644}, + expr: &zeroOrMoreExpr{ + pos: position{line: 284, col: 8, offset: 8653}, + expr: &choiceExpr{ + pos: position{line: 284, col: 10, offset: 8655}, + alternatives: []interface{}{ + &oneOrMoreExpr{ + pos: position{line: 284, col: 10, offset: 8655}, + expr: &seqExpr{ + pos: position{line: 284, col: 12, offset: 8657}, + exprs: []interface{}{ + ¬Expr{ + pos: position{line: 284, col: 12, offset: 8657}, + expr: &charClassMatcher{ + pos: position{line: 284, col: 13, offset: 8658}, + val: "[{}]", + chars: []rune{'{', '}'}, + ignoreCase: false, + inverted: false, + }, + }, + &ruleRefExpr{ + pos: position{line: 284, col: 18, offset: 8663}, + name: "SourceChar", + }, + }, + }, + }, + &seqExpr{ + pos: position{line: 284, col: 34, offset: 8679}, + exprs: []interface{}{ + &litMatcher{ + pos: position{line: 284, col: 34, offset: 8679}, + val: "{", + ignoreCase: false, + }, + &ruleRefExpr{ + pos: position{line: 284, col: 38, offset: 8683}, + name: "Code", + }, + &litMatcher{ + pos: position{line: 284, col: 43, offset: 8688}, + val: "}", + ignoreCase: false, + }, + }, + }, + }, + }, + }, + }, + { + name: "__", + pos: position{line: 286, col: 1, offset: 8696}, + expr: &zeroOrMoreExpr{ + pos: position{line: 286, col: 6, offset: 8703}, + expr: &choiceExpr{ + pos: position{line: 286, col: 8, offset: 8705}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 286, col: 8, offset: 8705}, + name: "Whitespace", + }, + &ruleRefExpr{ + pos: position{line: 286, col: 21, offset: 8718}, + name: "EOL", + }, + &ruleRefExpr{ + pos: position{line: 286, col: 27, offset: 8724}, + name: "Comment", + }, + }, + }, + }, + }, + { + name: "_", + pos: position{line: 287, col: 1, offset: 8735}, + expr: &zeroOrMoreExpr{ + pos: position{line: 287, col: 5, offset: 8741}, + expr: &choiceExpr{ + pos: position{line: 287, col: 7, offset: 8743}, + alternatives: []interface{}{ + &ruleRefExpr{ + pos: position{line: 287, col: 7, offset: 8743}, + name: "Whitespace", + }, + &ruleRefExpr{ + pos: position{line: 287, col: 20, offset: 8756}, + name: "MultiLineCommentNoLineTerminator", + }, + }, + }, + }, + }, + { + name: "Whitespace", + pos: position{line: 289, col: 1, offset: 8793}, + expr: &charClassMatcher{ + pos: position{line: 289, col: 14, offset: 8808}, + val: "[ \\t\\r]", + chars: []rune{' ', '\t', '\r'}, + ignoreCase: false, + inverted: false, + }, + }, + { + name: "EOL", + pos: position{line: 290, col: 1, offset: 8816}, + expr: &litMatcher{ + pos: position{line: 290, col: 7, offset: 8824}, + val: "\n", + ignoreCase: false, + }, + }, + { + name: "EOS", + pos: position{line: 291, col: 1, offset: 8829}, + expr: &choiceExpr{ + pos: position{line: 291, col: 7, offset: 8837}, + alternatives: []interface{}{ + &seqExpr{ + pos: position{line: 291, col: 7, offset: 8837}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 291, col: 7, offset: 8837}, + name: "__", + }, + &litMatcher{ + pos: position{line: 291, col: 10, offset: 8840}, + val: ";", + ignoreCase: false, + }, + }, + }, + &seqExpr{ + pos: position{line: 291, col: 16, offset: 8846}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 291, col: 16, offset: 8846}, + name: "_", + }, + &zeroOrOneExpr{ + pos: position{line: 291, col: 18, offset: 8848}, + expr: &ruleRefExpr{ + pos: position{line: 291, col: 18, offset: 8848}, + name: "SingleLineComment", + }, + }, + &ruleRefExpr{ + pos: position{line: 291, col: 37, offset: 8867}, + name: "EOL", + }, + }, + }, + &seqExpr{ + pos: position{line: 291, col: 43, offset: 8873}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 291, col: 43, offset: 8873}, + name: "__", + }, + &ruleRefExpr{ + pos: position{line: 291, col: 46, offset: 8876}, + name: "EOF", + }, + }, + }, + }, + }, + }, + { + name: "EOF", + pos: position{line: 293, col: 1, offset: 8881}, + expr: ¬Expr{ + pos: position{line: 293, col: 7, offset: 8889}, + expr: &anyMatcher{ + line: 293, col: 8, offset: 8890, + }, + }, + }, + }, +} + +func (c *current) onGrammar1(initializer, rules interface{}) (interface{}, error) { + pos := c.astPos() + + // create the grammar, assign its initializer + g := ast.NewGrammar(pos) + initSlice := toIfaceSlice(initializer) + if len(initSlice) > 0 { + g.Init = initSlice[0].(*ast.CodeBlock) + } + + rulesSlice := toIfaceSlice(rules) + g.Rules = make([]*ast.Rule, len(rulesSlice)) + for i, duo := range rulesSlice { + g.Rules[i] = duo.([]interface{})[0].(*ast.Rule) + } + + return g, nil +} + +func (p *parser) callonGrammar1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onGrammar1(stack["initializer"], stack["rules"]) +} + +func (c *current) onInitializer1(code interface{}) (interface{}, error) { + return code, nil +} + +func (p *parser) callonInitializer1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onInitializer1(stack["code"]) +} + +func (c *current) onRule1(name, display, expr interface{}) (interface{}, error) { + pos := c.astPos() + + rule := ast.NewRule(pos, name.(*ast.Identifier)) + displaySlice := toIfaceSlice(display) + if len(displaySlice) > 0 { + rule.DisplayName = displaySlice[0].(*ast.StringLit) + } + rule.Expr = expr.(ast.Expression) + + return rule, nil +} + +func (p *parser) callonRule1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onRule1(stack["name"], stack["display"], stack["expr"]) +} + +func (c *current) onChoiceExpr1(first, rest interface{}) (interface{}, error) { + restSlice := toIfaceSlice(rest) + if len(restSlice) == 0 { + return first, nil + } + + pos := c.astPos() + choice := ast.NewChoiceExpr(pos) + choice.Alternatives = []ast.Expression{first.(ast.Expression)} + for _, sl := range restSlice { + choice.Alternatives = append(choice.Alternatives, sl.([]interface{})[3].(ast.Expression)) + } + return choice, nil +} + +func (p *parser) callonChoiceExpr1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onChoiceExpr1(stack["first"], stack["rest"]) +} + +func (c *current) onActionExpr1(expr, code interface{}) (interface{}, error) { + if code == nil { + return expr, nil + } + + pos := c.astPos() + act := ast.NewActionExpr(pos) + act.Expr = expr.(ast.Expression) + codeSlice := toIfaceSlice(code) + act.Code = codeSlice[1].(*ast.CodeBlock) + + return act, nil +} + +func (p *parser) callonActionExpr1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onActionExpr1(stack["expr"], stack["code"]) +} + +func (c *current) onSeqExpr1(first, rest interface{}) (interface{}, error) { + restSlice := toIfaceSlice(rest) + if len(restSlice) == 0 { + return first, nil + } + seq := ast.NewSeqExpr(c.astPos()) + seq.Exprs = []ast.Expression{first.(ast.Expression)} + for _, sl := range restSlice { + seq.Exprs = append(seq.Exprs, sl.([]interface{})[1].(ast.Expression)) + } + return seq, nil +} + +func (p *parser) callonSeqExpr1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onSeqExpr1(stack["first"], stack["rest"]) +} + +func (c *current) onLabeledExpr2(label, expr interface{}) (interface{}, error) { + pos := c.astPos() + lab := ast.NewLabeledExpr(pos) + lab.Label = label.(*ast.Identifier) + lab.Expr = expr.(ast.Expression) + return lab, nil +} + +func (p *parser) callonLabeledExpr2() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onLabeledExpr2(stack["label"], stack["expr"]) +} + +func (c *current) onPrefixedExpr2(op, expr interface{}) (interface{}, error) { + pos := c.astPos() + opStr := op.(string) + if opStr == "&" { + and := ast.NewAndExpr(pos) + and.Expr = expr.(ast.Expression) + return and, nil + } + not := ast.NewNotExpr(pos) + not.Expr = expr.(ast.Expression) + return not, nil +} + +func (p *parser) callonPrefixedExpr2() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onPrefixedExpr2(stack["op"], stack["expr"]) +} + +func (c *current) onPrefixedOp1() (interface{}, error) { + return string(c.text), nil +} + +func (p *parser) callonPrefixedOp1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onPrefixedOp1() +} + +func (c *current) onSuffixedExpr2(expr, op interface{}) (interface{}, error) { + pos := c.astPos() + opStr := op.(string) + switch opStr { + case "?": + zero := ast.NewZeroOrOneExpr(pos) + zero.Expr = expr.(ast.Expression) + return zero, nil + case "*": + zero := ast.NewZeroOrMoreExpr(pos) + zero.Expr = expr.(ast.Expression) + return zero, nil + case "+": + one := ast.NewOneOrMoreExpr(pos) + one.Expr = expr.(ast.Expression) + return one, nil + default: + return nil, errors.New("unknown operator: " + opStr) + } +} + +func (p *parser) callonSuffixedExpr2() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onSuffixedExpr2(stack["expr"], stack["op"]) +} + +func (c *current) onSuffixedOp1() (interface{}, error) { + return string(c.text), nil +} + +func (p *parser) callonSuffixedOp1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onSuffixedOp1() +} + +func (c *current) onPrimaryExpr7(expr interface{}) (interface{}, error) { + return expr, nil +} + +func (p *parser) callonPrimaryExpr7() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onPrimaryExpr7(stack["expr"]) +} + +func (c *current) onRuleRefExpr1(name interface{}) (interface{}, error) { + ref := ast.NewRuleRefExpr(c.astPos()) + ref.Name = name.(*ast.Identifier) + return ref, nil +} + +func (p *parser) callonRuleRefExpr1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onRuleRefExpr1(stack["name"]) +} + +func (c *current) onSemanticPredExpr1(op, code interface{}) (interface{}, error) { + opStr := op.(string) + if opStr == "&" { + and := ast.NewAndCodeExpr(c.astPos()) + and.Code = code.(*ast.CodeBlock) + return and, nil + } + not := ast.NewNotCodeExpr(c.astPos()) + not.Code = code.(*ast.CodeBlock) + return not, nil +} + +func (p *parser) callonSemanticPredExpr1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onSemanticPredExpr1(stack["op"], stack["code"]) +} + +func (c *current) onSemanticPredOp1() (interface{}, error) { + return string(c.text), nil +} + +func (p *parser) callonSemanticPredOp1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onSemanticPredOp1() +} + +func (c *current) onIdentifier1(ident interface{}) (interface{}, error) { + astIdent := ast.NewIdentifier(c.astPos(), string(c.text)) + if reservedWords[astIdent.Val] { + return astIdent, errors.New("identifier is a reserved word") + } + return astIdent, nil +} + +func (p *parser) callonIdentifier1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onIdentifier1(stack["ident"]) +} + +func (c *current) onIdentifierName1() (interface{}, error) { + return ast.NewIdentifier(c.astPos(), string(c.text)), nil +} + +func (p *parser) callonIdentifierName1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onIdentifierName1() +} + +func (c *current) onLitMatcher1(lit, ignore interface{}) (interface{}, error) { + rawStr := lit.(*ast.StringLit).Val + s, err := strconv.Unquote(rawStr) + if err != nil { + // an invalid string literal raises an error in the escape rules, + // so simply replace the literal with an empty string here to + // avoid a cascade of errors. + s = "" + } + m := ast.NewLitMatcher(c.astPos(), s) + m.IgnoreCase = ignore != nil + return m, nil +} + +func (p *parser) callonLitMatcher1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onLitMatcher1(stack["lit"], stack["ignore"]) +} + +func (c *current) onStringLiteral2() (interface{}, error) { + return ast.NewStringLit(c.astPos(), string(c.text)), nil +} + +func (p *parser) callonStringLiteral2() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onStringLiteral2() +} + +func (c *current) onStringLiteral18() (interface{}, error) { + return ast.NewStringLit(c.astPos(), "``"), errors.New("string literal not terminated") +} + +func (p *parser) callonStringLiteral18() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onStringLiteral18() +} + +func (c *current) onDoubleStringEscape5() (interface{}, error) { + return nil, errors.New("invalid escape character") +} + +func (p *parser) callonDoubleStringEscape5() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onDoubleStringEscape5() +} + +func (c *current) onSingleStringEscape5() (interface{}, error) { + return nil, errors.New("invalid escape character") +} + +func (p *parser) callonSingleStringEscape5() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onSingleStringEscape5() +} + +func (c *current) onOctalEscape6() (interface{}, error) { + return nil, errors.New("invalid octal escape") +} + +func (p *parser) callonOctalEscape6() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onOctalEscape6() +} + +func (c *current) onHexEscape6() (interface{}, error) { + return nil, errors.New("invalid hexadecimal escape") +} + +func (p *parser) callonHexEscape6() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onHexEscape6() +} + +func (c *current) onLongUnicodeEscape2() (interface{}, error) { + return validateUnicodeEscape(string(c.text), "invalid Unicode escape") + +} + +func (p *parser) callonLongUnicodeEscape2() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onLongUnicodeEscape2() +} + +func (c *current) onLongUnicodeEscape13() (interface{}, error) { + return nil, errors.New("invalid Unicode escape") +} + +func (p *parser) callonLongUnicodeEscape13() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onLongUnicodeEscape13() +} + +func (c *current) onShortUnicodeEscape2() (interface{}, error) { + return validateUnicodeEscape(string(c.text), "invalid Unicode escape") + +} + +func (p *parser) callonShortUnicodeEscape2() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onShortUnicodeEscape2() +} + +func (c *current) onShortUnicodeEscape9() (interface{}, error) { + return nil, errors.New("invalid Unicode escape") +} + +func (p *parser) callonShortUnicodeEscape9() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onShortUnicodeEscape9() +} + +func (c *current) onCharClassMatcher2() (interface{}, error) { + pos := c.astPos() + cc := ast.NewCharClassMatcher(pos, string(c.text)) + return cc, nil +} + +func (p *parser) callonCharClassMatcher2() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onCharClassMatcher2() +} + +func (c *current) onCharClassMatcher15() (interface{}, error) { + return ast.NewCharClassMatcher(c.astPos(), "[]"), errors.New("character class not terminated") +} + +func (p *parser) callonCharClassMatcher15() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onCharClassMatcher15() +} + +func (c *current) onCharClassEscape5() (interface{}, error) { + return nil, errors.New("invalid escape character") +} + +func (p *parser) callonCharClassEscape5() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onCharClassEscape5() +} + +func (c *current) onUnicodeClassEscape5() (interface{}, error) { + return nil, errors.New("invalid Unicode class escape") +} + +func (p *parser) callonUnicodeClassEscape5() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onUnicodeClassEscape5() +} + +func (c *current) onUnicodeClassEscape13(ident interface{}) (interface{}, error) { + if !unicodeClasses[ident.(*ast.Identifier).Val] { + return nil, errors.New("invalid Unicode class escape") + } + return nil, nil + +} + +func (p *parser) callonUnicodeClassEscape13() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onUnicodeClassEscape13(stack["ident"]) +} + +func (c *current) onUnicodeClassEscape19() (interface{}, error) { + return nil, errors.New("Unicode class not terminated") + +} + +func (p *parser) callonUnicodeClassEscape19() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onUnicodeClassEscape19() +} + +func (c *current) onAnyMatcher1() (interface{}, error) { + any := ast.NewAnyMatcher(c.astPos(), ".") + return any, nil +} + +func (p *parser) callonAnyMatcher1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onAnyMatcher1() +} + +func (c *current) onCodeBlock2() (interface{}, error) { + pos := c.astPos() + cb := ast.NewCodeBlock(pos, string(c.text)) + return cb, nil +} + +func (p *parser) callonCodeBlock2() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onCodeBlock2() +} + +func (c *current) onCodeBlock7() (interface{}, error) { + return nil, errors.New("code block not terminated") +} + +func (p *parser) callonCodeBlock7() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onCodeBlock7() +} + +var ( + // errNoRule is returned when the grammar to parse has no rule. + errNoRule = errors.New("grammar has no rule") + + // errInvalidEncoding is returned when the source is not properly + // utf8-encoded. + errInvalidEncoding = errors.New("invalid encoding") + + // errNoMatch is returned if no match could be found. + errNoMatch = errors.New("no match found") +) + +// Option is a function that can set an option on the parser. It returns +// the previous setting as an Option. +type Option func(*parser) Option + +// Debug creates an Option to set the debug flag to b. When set to true, +// debugging information is printed to stdout while parsing. +// +// The default is false. +func Debug(b bool) Option { + return func(p *parser) Option { + old := p.debug + p.debug = b + return Debug(old) + } +} + +// Memoize creates an Option to set the memoize flag to b. When set to true, +// the parser will cache all results so each expression is evaluated only +// once. This guarantees linear parsing time even for pathological cases, +// at the expense of more memory and slower times for typical cases. +// +// The default is false. +func Memoize(b bool) Option { + return func(p *parser) Option { + old := p.memoize + p.memoize = b + return Memoize(old) + } +} + +// Recover creates an Option to set the recover flag to b. When set to +// true, this causes the parser to recover from panics and convert it +// to an error. Setting it to false can be useful while debugging to +// access the full stack trace. +// +// The default is true. +func Recover(b bool) Option { + return func(p *parser) Option { + old := p.recover + p.recover = b + return Recover(old) + } +} + +// ParseFile parses the file identified by filename. +func ParseFile(filename string, opts ...Option) (interface{}, error) { + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + return ParseReader(filename, f, opts...) +} + +// ParseReader parses the data from r using filename as information in the +// error messages. +func ParseReader(filename string, r io.Reader, opts ...Option) (interface{}, error) { + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + + return Parse(filename, b, opts...) +} + +// Parse parses the data from b using filename as information in the +// error messages. +func Parse(filename string, b []byte, opts ...Option) (interface{}, error) { + return newParser(filename, b, opts...).parse(g) +} + +// position records a position in the text. +type position struct { + line, col, offset int +} + +func (p position) String() string { + return fmt.Sprintf("%d:%d [%d]", p.line, p.col, p.offset) +} + +// savepoint stores all state required to go back to this point in the +// parser. +type savepoint struct { + position + rn rune + w int +} + +type current struct { + pos position // start position of the match + text []byte // raw text of the match +} + +// the AST types... + +type grammar struct { + pos position + rules []*rule +} + +type rule struct { + pos position + name string + displayName string + expr interface{} +} + +type choiceExpr struct { + pos position + alternatives []interface{} +} + +type actionExpr struct { + pos position + expr interface{} + run func(*parser) (interface{}, error) +} + +type seqExpr struct { + pos position + exprs []interface{} +} + +type labeledExpr struct { + pos position + label string + expr interface{} +} + +type expr struct { + pos position + expr interface{} +} + +type andExpr expr +type notExpr expr +type zeroOrOneExpr expr +type zeroOrMoreExpr expr +type oneOrMoreExpr expr + +type ruleRefExpr struct { + pos position + name string +} + +type andCodeExpr struct { + pos position + run func(*parser) (bool, error) +} + +type notCodeExpr struct { + pos position + run func(*parser) (bool, error) +} + +type litMatcher struct { + pos position + val string + ignoreCase bool +} + +type charClassMatcher struct { + pos position + val string + chars []rune + ranges []rune + classes []*unicode.RangeTable + ignoreCase bool + inverted bool +} + +type anyMatcher position + +// errList cumulates the errors found by the parser. +type errList []error + +func (e *errList) add(err error) { + *e = append(*e, err) +} + +func (e errList) err() error { + if len(e) == 0 { + return nil + } + e.dedupe() + return e +} + +func (e *errList) dedupe() { + var cleaned []error + set := make(map[string]bool) + for _, err := range *e { + if msg := err.Error(); !set[msg] { + set[msg] = true + cleaned = append(cleaned, err) + } + } + *e = cleaned +} + +func (e errList) Error() string { + switch len(e) { + case 0: + return "" + case 1: + return e[0].Error() + default: + var buf bytes.Buffer + + for i, err := range e { + if i > 0 { + buf.WriteRune('\n') + } + buf.WriteString(err.Error()) + } + return buf.String() + } +} + +// parserError wraps an error with a prefix indicating the rule in which +// the error occurred. The original error is stored in the Inner field. +type parserError struct { + Inner error + pos position + prefix string +} + +// Error returns the error message. +func (p *parserError) Error() string { + return p.prefix + ": " + p.Inner.Error() +} + +// newParser creates a parser with the specified input source and options. +func newParser(filename string, b []byte, opts ...Option) *parser { + p := &parser{ + filename: filename, + errs: new(errList), + data: b, + pt: savepoint{position: position{line: 1}}, + recover: true, + } + p.setOptions(opts) + return p +} + +// setOptions applies the options to the parser. +func (p *parser) setOptions(opts []Option) { + for _, opt := range opts { + opt(p) + } +} + +type resultTuple struct { + v interface{} + b bool + end savepoint +} + +type parser struct { + filename string + pt savepoint + cur current + + data []byte + errs *errList + + recover bool + debug bool + depth int + + memoize bool + // memoization table for the packrat algorithm: + // map[offset in source] map[expression or rule] {value, match} + memo map[int]map[interface{}]resultTuple + + // rules table, maps the rule identifier to the rule node + rules map[string]*rule + // variables stack, map of label to value + vstack []map[string]interface{} + // rule stack, allows identification of the current rule in errors + rstack []*rule + + // stats + exprCnt int +} + +// push a variable set on the vstack. +func (p *parser) pushV() { + if cap(p.vstack) == len(p.vstack) { + // create new empty slot in the stack + p.vstack = append(p.vstack, nil) + } else { + // slice to 1 more + p.vstack = p.vstack[:len(p.vstack)+1] + } + + // get the last args set + m := p.vstack[len(p.vstack)-1] + if m != nil && len(m) == 0 { + // empty map, all good + return + } + + m = make(map[string]interface{}) + p.vstack[len(p.vstack)-1] = m +} + +// pop a variable set from the vstack. +func (p *parser) popV() { + // if the map is not empty, clear it + m := p.vstack[len(p.vstack)-1] + if len(m) > 0 { + // GC that map + p.vstack[len(p.vstack)-1] = nil + } + p.vstack = p.vstack[:len(p.vstack)-1] +} + +func (p *parser) print(prefix, s string) string { + if !p.debug { + return s + } + + fmt.Printf("%s %d:%d:%d: %s [%#U]\n", + prefix, p.pt.line, p.pt.col, p.pt.offset, s, p.pt.rn) + return s +} + +func (p *parser) in(s string) string { + p.depth++ + return p.print(strings.Repeat(" ", p.depth)+">", s) +} + +func (p *parser) out(s string) string { + p.depth-- + return p.print(strings.Repeat(" ", p.depth)+"<", s) +} + +func (p *parser) addErr(err error) { + p.addErrAt(err, p.pt.position) +} + +func (p *parser) addErrAt(err error, pos position) { + var buf bytes.Buffer + if p.filename != "" { + buf.WriteString(p.filename) + } + if buf.Len() > 0 { + buf.WriteString(":") + } + buf.WriteString(fmt.Sprintf("%d:%d (%d)", pos.line, pos.col, pos.offset)) + if len(p.rstack) > 0 { + if buf.Len() > 0 { + buf.WriteString(": ") + } + rule := p.rstack[len(p.rstack)-1] + if rule.displayName != "" { + buf.WriteString("rule " + rule.displayName) + } else { + buf.WriteString("rule " + rule.name) + } + } + pe := &parserError{Inner: err, prefix: buf.String()} + p.errs.add(pe) +} + +// read advances the parser to the next rune. +func (p *parser) read() { + p.pt.offset += p.pt.w + rn, n := utf8.DecodeRune(p.data[p.pt.offset:]) + p.pt.rn = rn + p.pt.w = n + p.pt.col++ + if rn == '\n' { + p.pt.line++ + p.pt.col = 0 + } + + if rn == utf8.RuneError { + if n > 0 { + p.addErr(errInvalidEncoding) + } + } +} + +// restore parser position to the savepoint pt. +func (p *parser) restore(pt savepoint) { + if p.debug { + defer p.out(p.in("restore")) + } + if pt.offset == p.pt.offset { + return + } + p.pt = pt +} + +// get the slice of bytes from the savepoint start to the current position. +func (p *parser) sliceFrom(start savepoint) []byte { + return p.data[start.position.offset:p.pt.position.offset] +} + +func (p *parser) getMemoized(node interface{}) (resultTuple, bool) { + if len(p.memo) == 0 { + return resultTuple{}, false + } + m := p.memo[p.pt.offset] + if len(m) == 0 { + return resultTuple{}, false + } + res, ok := m[node] + return res, ok +} + +func (p *parser) setMemoized(pt savepoint, node interface{}, tuple resultTuple) { + if p.memo == nil { + p.memo = make(map[int]map[interface{}]resultTuple) + } + m := p.memo[pt.offset] + if m == nil { + m = make(map[interface{}]resultTuple) + p.memo[pt.offset] = m + } + m[node] = tuple +} + +func (p *parser) buildRulesTable(g *grammar) { + p.rules = make(map[string]*rule, len(g.rules)) + for _, r := range g.rules { + p.rules[r.name] = r + } +} + +func (p *parser) parse(g *grammar) (val interface{}, err error) { + if len(g.rules) == 0 { + p.addErr(errNoRule) + return nil, p.errs.err() + } + + // TODO : not super critical but this could be generated + p.buildRulesTable(g) + + if p.recover { + // panic can be used in action code to stop parsing immediately + // and return the panic as an error. + defer func() { + if e := recover(); e != nil { + if p.debug { + defer p.out(p.in("panic handler")) + } + val = nil + switch e := e.(type) { + case error: + p.addErr(e) + default: + p.addErr(fmt.Errorf("%v", e)) + } + err = p.errs.err() + } + }() + } + + // start rule is rule [0] + p.read() // advance to first rune + val, ok := p.parseRule(g.rules[0]) + if !ok { + if len(*p.errs) == 0 { + // make sure this doesn't go out silently + p.addErr(errNoMatch) + } + return nil, p.errs.err() + } + return val, p.errs.err() +} + +func (p *parser) parseRule(rule *rule) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseRule " + rule.name)) + } + + if p.memoize { + res, ok := p.getMemoized(rule) + if ok { + p.restore(res.end) + return res.v, res.b + } + } + + start := p.pt + p.rstack = append(p.rstack, rule) + p.pushV() + val, ok := p.parseExpr(rule.expr) + p.popV() + p.rstack = p.rstack[:len(p.rstack)-1] + if ok && p.debug { + p.print(strings.Repeat(" ", p.depth)+"MATCH", string(p.sliceFrom(start))) + } + + if p.memoize { + p.setMemoized(start, rule, resultTuple{val, ok, p.pt}) + } + return val, ok +} + +func (p *parser) parseExpr(expr interface{}) (interface{}, bool) { + var pt savepoint + var ok bool + + if p.memoize { + res, ok := p.getMemoized(expr) + if ok { + p.restore(res.end) + return res.v, res.b + } + pt = p.pt + } + + p.exprCnt++ + var val interface{} + switch expr := expr.(type) { + case *actionExpr: + val, ok = p.parseActionExpr(expr) + case *andCodeExpr: + val, ok = p.parseAndCodeExpr(expr) + case *andExpr: + val, ok = p.parseAndExpr(expr) + case *anyMatcher: + val, ok = p.parseAnyMatcher(expr) + case *charClassMatcher: + val, ok = p.parseCharClassMatcher(expr) + case *choiceExpr: + val, ok = p.parseChoiceExpr(expr) + case *labeledExpr: + val, ok = p.parseLabeledExpr(expr) + case *litMatcher: + val, ok = p.parseLitMatcher(expr) + case *notCodeExpr: + val, ok = p.parseNotCodeExpr(expr) + case *notExpr: + val, ok = p.parseNotExpr(expr) + case *oneOrMoreExpr: + val, ok = p.parseOneOrMoreExpr(expr) + case *ruleRefExpr: + val, ok = p.parseRuleRefExpr(expr) + case *seqExpr: + val, ok = p.parseSeqExpr(expr) + case *zeroOrMoreExpr: + val, ok = p.parseZeroOrMoreExpr(expr) + case *zeroOrOneExpr: + val, ok = p.parseZeroOrOneExpr(expr) + default: + panic(fmt.Sprintf("unknown expression type %T", expr)) + } + if p.memoize { + p.setMemoized(pt, expr, resultTuple{val, ok, p.pt}) + } + return val, ok +} + +func (p *parser) parseActionExpr(act *actionExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseActionExpr")) + } + + start := p.pt + val, ok := p.parseExpr(act.expr) + if ok { + p.cur.pos = start.position + p.cur.text = p.sliceFrom(start) + actVal, err := act.run(p) + if err != nil { + p.addErrAt(err, start.position) + } + val = actVal + } + if ok && p.debug { + p.print(strings.Repeat(" ", p.depth)+"MATCH", string(p.sliceFrom(start))) + } + return val, ok +} + +func (p *parser) parseAndCodeExpr(and *andCodeExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAndCodeExpr")) + } + + ok, err := and.run(p) + if err != nil { + p.addErr(err) + } + return nil, ok +} + +func (p *parser) parseAndExpr(and *andExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAndExpr")) + } + + pt := p.pt + p.pushV() + _, ok := p.parseExpr(and.expr) + p.popV() + p.restore(pt) + return nil, ok +} + +func (p *parser) parseAnyMatcher(any *anyMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAnyMatcher")) + } + + if p.pt.rn != utf8.RuneError { + start := p.pt + p.read() + return p.sliceFrom(start), true + } + return nil, false +} + +func (p *parser) parseCharClassMatcher(chr *charClassMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseCharClassMatcher")) + } + + cur := p.pt.rn + // can't match EOF + if cur == utf8.RuneError { + return nil, false + } + start := p.pt + if chr.ignoreCase { + cur = unicode.ToLower(cur) + } + + // try to match in the list of available chars + for _, rn := range chr.chars { + if rn == cur { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + // try to match in the list of ranges + for i := 0; i < len(chr.ranges); i += 2 { + if cur >= chr.ranges[i] && cur <= chr.ranges[i+1] { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + // try to match in the list of Unicode classes + for _, cl := range chr.classes { + if unicode.Is(cl, cur) { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + if chr.inverted { + p.read() + return p.sliceFrom(start), true + } + return nil, false +} + +func (p *parser) parseChoiceExpr(ch *choiceExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseChoiceExpr")) + } + + for _, alt := range ch.alternatives { + p.pushV() + val, ok := p.parseExpr(alt) + p.popV() + if ok { + return val, ok + } + } + return nil, false +} + +func (p *parser) parseLabeledExpr(lab *labeledExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseLabeledExpr")) + } + + p.pushV() + val, ok := p.parseExpr(lab.expr) + p.popV() + if ok && lab.label != "" { + m := p.vstack[len(p.vstack)-1] + m[lab.label] = val + } + return val, ok +} + +func (p *parser) parseLitMatcher(lit *litMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseLitMatcher")) + } + + start := p.pt + for _, want := range lit.val { + cur := p.pt.rn + if lit.ignoreCase { + cur = unicode.ToLower(cur) + } + if cur != want { + p.restore(start) + return nil, false + } + p.read() + } + return p.sliceFrom(start), true +} + +func (p *parser) parseNotCodeExpr(not *notCodeExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseNotCodeExpr")) + } + + ok, err := not.run(p) + if err != nil { + p.addErr(err) + } + return nil, !ok +} + +func (p *parser) parseNotExpr(not *notExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseNotExpr")) + } + + pt := p.pt + p.pushV() + _, ok := p.parseExpr(not.expr) + p.popV() + p.restore(pt) + return nil, !ok +} + +func (p *parser) parseOneOrMoreExpr(expr *oneOrMoreExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseOneOrMoreExpr")) + } + + var vals []interface{} + + for { + p.pushV() + val, ok := p.parseExpr(expr.expr) + p.popV() + if !ok { + if len(vals) == 0 { + // did not match once, no match + return nil, false + } + return vals, true + } + vals = append(vals, val) + } +} + +func (p *parser) parseRuleRefExpr(ref *ruleRefExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseRuleRefExpr " + ref.name)) + } + + if ref.name == "" { + panic(fmt.Sprintf("%s: invalid rule: missing name", ref.pos)) + } + + rule := p.rules[ref.name] + if rule == nil { + p.addErr(fmt.Errorf("undefined rule: %s", ref.name)) + return nil, false + } + return p.parseRule(rule) +} + +func (p *parser) parseSeqExpr(seq *seqExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseSeqExpr")) + } + + var vals []interface{} + + pt := p.pt + for _, expr := range seq.exprs { + val, ok := p.parseExpr(expr) + if !ok { + p.restore(pt) + return nil, false + } + vals = append(vals, val) + } + return vals, true +} + +func (p *parser) parseZeroOrMoreExpr(expr *zeroOrMoreExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseZeroOrMoreExpr")) + } + + var vals []interface{} + + for { + p.pushV() + val, ok := p.parseExpr(expr.expr) + p.popV() + if !ok { + return vals, true + } + vals = append(vals, val) + } +} + +func (p *parser) parseZeroOrOneExpr(expr *zeroOrOneExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseZeroOrOneExpr")) + } + + p.pushV() + val, _ := p.parseExpr(expr.expr) + p.popV() + // whether it matched or not, consider it a match + return val, true +} + +func rangeTable(class string) *unicode.RangeTable { + if rt, ok := unicode.Categories[class]; ok { + return rt + } + if rt, ok := unicode.Properties[class]; ok { + return rt + } + if rt, ok := unicode.Scripts[class]; ok { + return rt + } + + // cannot happen + panic(fmt.Sprintf("invalid Unicode class: %s", class)) +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/reserved_words.go b/vendor/github.com/PuerkitoBio/pigeon/reserved_words.go new file mode 100644 index 0000000000..127d27387d --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/reserved_words.go @@ -0,0 +1,71 @@ +package main + +var reservedWords = map[string]bool{ + // Go keywords http://golang.org/ref/spec#Keywords + "break": true, + "case": true, + "chan": true, + "const": true, + "continue": true, + "default": true, + "defer": true, + "else": true, + "fallthrough": true, + "for": true, + "func": true, + "goto": true, + "go": true, + "if": true, + "import": true, + "interface": true, + "map": true, + "package": true, + "range": true, + "return": true, + "select": true, + "struct": true, + "switch": true, + "type": true, + "var": true, + + // predeclared identifiers http://golang.org/ref/spec#Predeclared_identifiers + "bool": true, + "byte": true, + "complex64": true, + "complex128": true, + "error": true, + "float32": true, + "float64": true, + "int8": true, + "int16": true, + "int32": true, + "int64": true, + "int": true, + "rune": true, + "string": true, + "uint8": true, + "uint16": true, + "uint32": true, + "uint64": true, + "uintptr": true, + "uint": true, + "true": true, + "false": true, + "iota": true, + "nil": true, + "append": true, + "cap": true, + "close": true, + "complex": true, + "copy": true, + "delete": true, + "imag": true, + "len": true, + "make": true, + "new": true, + "panic": true, + "println": true, + "print": true, + "real": true, + "recover": true, +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/targeted_test.go b/vendor/github.com/PuerkitoBio/pigeon/targeted_test.go new file mode 100644 index 0000000000..24b9b633d9 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/targeted_test.go @@ -0,0 +1,855 @@ +package main + +import ( + "fmt" + "io" + "reflect" + "testing" + "unicode" +) + +func TestParseNoRule(t *testing.T) { + g := &grammar{} + p := newParser("", []byte("")) + _, err := p.parse(g) + if err == nil { + t.Fatal("want error, got nil") + } + el, ok := err.(errList) + if !ok { + t.Fatalf("want error type %T, got %T", errList{}, err) + } + if len(el) != 1 { + t.Fatalf("want 1 error, got %d", len(el)) + } + pe, ok := el[0].(*parserError) + if !ok { + t.Fatalf("want single error type %T, got %T", &parserError{}, el[0]) + } + if pe.Inner != errNoRule { + t.Fatalf("want error %v, got %v", errNoRule, el[0]) + } +} + +func TestParseAnyMatcher(t *testing.T) { + cases := []struct { + in string + out []byte + }{ + {"", nil}, + {"a", []byte("a")}, + {"\u2190", []byte("\u2190")}, + {"ab", []byte("a")}, + {"\u2190\U00001100", []byte("\u2190")}, + {"\x0d", []byte("\x0d")}, + {"\xfa", nil}, + {"\nab", []byte("\n")}, + } + + for _, tc := range cases { + p := newParser("", []byte(tc.in)) + + // advance to the first rune + p.read() + + var want interface{} + var match bool + if tc.out != nil { + want = tc.out + match = true + } + got, ok := p.parseAnyMatcher(&anyMatcher{}) + if !reflect.DeepEqual(got, want) { + t.Errorf("%q: want %v, got %v", tc.in, tc.out, got) + } + if ok != match { + t.Errorf("%q: want match? %t, got %t", tc.in, match, ok) + } + if p.pt.offset != len(tc.out) { + t.Errorf("%q: want offset %d, got %d", tc.in, len(tc.out), p.pt.offset) + } + } +} + +func TestParseLitMatcher(t *testing.T) { + cases := []struct { + in string + lit string + ic bool + out []byte + }{ + {"", "", false, []byte{}}, // empty literal always matches + {"", "", true, []byte{}}, // empty literal always matches + {"a", "", false, []byte{}}, + {"a", "", true, []byte{}}, + {"a", "a", false, []byte("a")}, + {"a", "a", true, []byte("a")}, + {"a", "A", false, nil}, + {"a", "a", true, []byte("a")}, // ignored case literal is always generated lowercase + {"A", "a", true, []byte("A")}, + {"b", "a", false, nil}, + {"b", "a", true, nil}, + {"abc", "ab", false, []byte("ab")}, + {"abc", "ab", true, []byte("ab")}, + {"ab", "abc", false, nil}, + {"ab", "abc", true, nil}, + {"\u2190a", "\u2190", false, []byte("\u2190")}, + {"\u2190a", "\u2190", true, []byte("\u2190")}, + {"\n", "\n", false, []byte("\n")}, + {"\n", "\n", true, []byte("\n")}, + {"\na", "\n", false, []byte("\n")}, + {"\na", "\n", true, []byte("\n")}, + } + + for _, tc := range cases { + p := newParser("", []byte(tc.in)) + + // advance to the first rune + p.read() + + var want interface{} + var match bool + if tc.out != nil { + match = true + want = tc.out + } + lbl := fmt.Sprintf("%q (%t): %q", tc.lit, tc.ic, tc.in) + + got, ok := p.parseLitMatcher(&litMatcher{val: tc.lit, ignoreCase: tc.ic}) + if !reflect.DeepEqual(got, want) { + t.Errorf("%s: want %v, got %v", lbl, tc.out, got) + } + if ok != match { + t.Errorf("%s: want match? %t, got %t", lbl, match, ok) + } + if p.pt.offset != len(tc.out) { + t.Errorf("%s: want offset %d, got %d", lbl, len(tc.out), p.pt.offset) + } + } +} + +func TestParseCharClassMatcher(t *testing.T) { + cases := []struct { + in string + val string + chars []rune + ranges []rune + classes []string + ic bool + iv bool + out []byte + }{ + {in: "", val: "[]", out: nil}, // empty char class means no char matches + {in: "", val: "[^]", iv: true, out: nil}, // can't match EOF + {in: "", val: "[]i", ic: true, out: nil}, + {in: "", val: "[^]i", ic: true, iv: true, out: nil}, // can't match EOF + {in: "a", val: "[]", out: nil}, + {in: "a", val: "[^]", iv: true, out: []byte("a")}, + {in: "a", val: "[]i", ic: true, out: nil}, + {in: "a", val: "[^]i", ic: true, iv: true, out: []byte("a")}, + + {in: "a", val: "[a]", chars: []rune{'a'}, out: []byte("a")}, + {in: "a", val: "[a]i", ic: true, chars: []rune{'a'}, out: []byte("a")}, + {in: "A", val: "[a]i", ic: true, chars: []rune{'a'}, out: []byte("A")}, + {in: "a", val: "[^a]", chars: []rune{'a'}, iv: true, out: nil}, + {in: "A", val: "[^a]i", iv: true, ic: true, chars: []rune{'a'}, out: nil}, + + {in: "b", val: "[a]", chars: []rune{'a'}, out: nil}, + {in: "b", val: "[a]i", ic: true, chars: []rune{'a'}, out: nil}, + {in: "B", val: "[a]i", ic: true, chars: []rune{'a'}, out: nil}, + {in: "b", val: "[^a]", chars: []rune{'a'}, iv: true, out: []byte("b")}, + {in: "b", val: "[^a]i", iv: true, ic: true, chars: []rune{'a'}, out: []byte("b")}, + {in: "B", val: "[^a]i", iv: true, ic: true, chars: []rune{'a'}, out: []byte("B")}, + + {in: "←", val: "[a]", chars: []rune{'a'}, out: nil}, + {in: "←", val: "[a]i", ic: true, chars: []rune{'a'}, out: nil}, + {in: "←", val: "[a]i", ic: true, chars: []rune{'a'}, out: nil}, + {in: "←", val: "[^a]", chars: []rune{'a'}, iv: true, out: []byte("←")}, + {in: "←", val: "[^a]i", iv: true, ic: true, chars: []rune{'a'}, out: []byte("←")}, + {in: "←", val: "[^a]i", iv: true, ic: true, chars: []rune{'a'}, out: []byte("←")}, + + {in: "b", val: "[a-c]", ranges: []rune{'a', 'c'}, out: []byte("b")}, + {in: "B", val: "[a-c]", ranges: []rune{'a', 'c'}, out: nil}, + {in: "b", val: "[a-c]i", ic: true, ranges: []rune{'a', 'c'}, out: []byte("b")}, + {in: "B", val: "[a-c]i", ic: true, ranges: []rune{'a', 'c'}, out: []byte("B")}, + {in: "b", val: "[^a-c]", ranges: []rune{'a', 'c'}, iv: true, out: nil}, + {in: "B", val: "[^a-c]", ranges: []rune{'a', 'c'}, iv: true, out: []byte("B")}, + {in: "b", val: "[^a-c]i", iv: true, ic: true, ranges: []rune{'a', 'c'}, out: nil}, + {in: "B", val: "[^a-c]i", iv: true, ic: true, ranges: []rune{'a', 'c'}, out: nil}, + {in: "z", val: "[^a-c]i", iv: true, ic: true, chars: []rune{'a', 'c'}, out: []byte("z")}, + + {in: "∝", val: "[a-c]", ranges: []rune{'a', 'c'}, out: nil}, + {in: "∝", val: "[a-c]", ranges: []rune{'a', 'c'}, out: nil}, + {in: "∝", val: "[a-c]i", ic: true, ranges: []rune{'a', 'c'}, out: nil}, + {in: "∝", val: "[a-c]i", ic: true, ranges: []rune{'a', 'c'}, out: nil}, + {in: "∝", val: "[^a-c]", ranges: []rune{'a', 'c'}, iv: true, out: []byte("∝")}, + {in: "∝", val: "[^a-c]", ranges: []rune{'a', 'c'}, iv: true, out: []byte("∝")}, + {in: "∝", val: "[^a-c]i", iv: true, ic: true, ranges: []rune{'a', 'c'}, out: []byte("∝")}, + {in: "∝", val: "[^a-c]i", iv: true, ic: true, ranges: []rune{'a', 'c'}, out: []byte("∝")}, + {in: "∝", val: "[^a-c]i", iv: true, ic: true, chars: []rune{'a', 'c'}, out: []byte("∝")}, + + {in: "b", val: "[c-a]", ranges: []rune{'c', 'a'}, out: nil}, + {in: "B", val: "[c-a]i", ic: true, ranges: []rune{'c', 'a'}, out: nil}, + {in: "B", val: "[^c-a]", iv: true, ranges: []rune{'c', 'a'}, out: []byte("B")}, + {in: "B", val: "[^c-a]i", ic: true, iv: true, ranges: []rune{'c', 'a'}, out: []byte("B")}, + + {in: "b", val: "[\\pL]", classes: []string{"L"}, out: []byte("b")}, + {in: "b", val: "[\\pL]i", ic: true, classes: []string{"L"}, out: []byte("b")}, + {in: "B", val: "[\\pL]i", ic: true, classes: []string{"L"}, out: []byte("B")}, + {in: "b", val: "[^\\pL]", iv: true, classes: []string{"L"}, out: nil}, + {in: "b", val: "[^\\pL]i", iv: true, ic: true, classes: []string{"L"}, out: nil}, + {in: "B", val: "[^\\pL]i", iv: true, ic: true, classes: []string{"L"}, out: nil}, + + {in: "1", val: "[\\pL]", classes: []string{"L"}, out: nil}, + {in: "1", val: "[\\pL]i", ic: true, classes: []string{"L"}, out: nil}, + {in: "1", val: "[\\pL]i", ic: true, classes: []string{"L"}, out: nil}, + {in: "1", val: "[^\\pL]", iv: true, classes: []string{"L"}, out: []byte("1")}, + {in: "1", val: "[^\\pL]i", iv: true, ic: true, classes: []string{"L"}, out: []byte("1")}, + {in: "1", val: "[^\\pL]i", iv: true, ic: true, classes: []string{"L"}, out: []byte("1")}, + + {in: "ƛ", val: "[\\pL]", classes: []string{"L"}, out: []byte("ƛ")}, + {in: "ƛ", val: "[\\pL]i", ic: true, classes: []string{"L"}, out: []byte("ƛ")}, + {in: "ƛ", val: "[\\pL]i", ic: true, classes: []string{"L"}, out: []byte("ƛ")}, + {in: "ƛ", val: "[^\\pL]", iv: true, classes: []string{"L"}, out: nil}, + {in: "ƛ", val: "[^\\pL]i", iv: true, ic: true, classes: []string{"L"}, out: nil}, + {in: "ƛ", val: "[^\\pL]i", iv: true, ic: true, classes: []string{"L"}, out: nil}, + + {in: "←a", val: "[\\pL]", classes: []string{"L"}, out: nil}, + {in: "←a", val: "[\\pL]i", ic: true, classes: []string{"L"}, out: nil}, + {in: "←a", val: "[\\pL]i", ic: true, classes: []string{"L"}, out: nil}, + {in: "←a", val: "[^\\pL]", iv: true, classes: []string{"L"}, out: []byte("←")}, + {in: "←a", val: "[^\\pL]i", iv: true, ic: true, classes: []string{"L"}, out: []byte("←")}, + {in: "←a", val: "[^\\pL]i", iv: true, ic: true, classes: []string{"L"}, out: []byte("←")}, + + {in: "b", val: "[\\p{Latin}]", classes: []string{"Latin"}, out: []byte("b")}, + {in: "b", val: "[\\p{Latin}]i", ic: true, classes: []string{"Latin"}, out: []byte("b")}, + {in: "B", val: "[\\p{Latin}]i", ic: true, classes: []string{"Latin"}, out: []byte("B")}, + {in: "b", val: "[^\\p{Latin}]", iv: true, classes: []string{"Latin"}, out: nil}, + {in: "b", val: "[^\\p{Latin}]i", ic: true, iv: true, classes: []string{"Latin"}, out: nil}, + {in: "B", val: "[^\\p{Latin}]i", iv: true, ic: true, classes: []string{"Latin"}, out: nil}, + + {in: "", val: "[^<]", iv: true, chars: []rune{'<'}, out: nil}, + } + + for _, tc := range cases { + p := newParser("", []byte(tc.in)) + + // advance to the first rune + p.read() + + var want interface{} + var match bool + if tc.out != nil { + want = tc.out + match = true + } + lbl := fmt.Sprintf("%q (%t-%t): %q", tc.val, tc.ic, tc.iv, tc.in) + + classes := make([]*unicode.RangeTable, len(tc.classes)) + for i, c := range tc.classes { + classes[i] = rangeTable(c) + } + + got, ok := p.parseCharClassMatcher(&charClassMatcher{ + val: tc.val, + chars: tc.chars, + ranges: tc.ranges, + classes: classes, + ignoreCase: tc.ic, + inverted: tc.iv, + }) + if !reflect.DeepEqual(got, want) { + t.Errorf("%s: want %v, got %v", lbl, tc.out, got) + } + if ok != match { + t.Errorf("%s: want match? %t, got %t", lbl, match, ok) + } + if p.pt.offset != len(tc.out) { + t.Errorf("%s: want offset %d, got %d", lbl, len(tc.out), p.pt.offset) + } + } +} + +func TestParseZeroOrOneExpr(t *testing.T) { + cases := []struct { + in string + lit string + out []byte + }{ + {"", "", []byte{}}, + {"", "a", nil}, + {"a", "a", []byte("a")}, + {"a", "b", nil}, + {"abc", "ab", []byte("ab")}, + {"ab", "abc", nil}, + } + + for _, tc := range cases { + p := newParser("", []byte(tc.in)) + + // advance to the first rune + p.read() + + var want interface{} + if tc.out != nil { + want = tc.out + } + lbl := fmt.Sprintf("%q: %q", tc.lit, tc.in) + + got, ok := p.parseZeroOrOneExpr(&zeroOrOneExpr{expr: &litMatcher{val: tc.lit}}) + if !reflect.DeepEqual(got, want) { + t.Errorf("%q: want %v, got %v", lbl, tc.out, got) + } + // zero or one always matches + if !ok { + t.Errorf("%s: want match, got %t", lbl, ok) + } + if p.pt.offset != len(tc.out) { + t.Errorf("%s: want offset %d, got %d", lbl, len(tc.out), p.pt.offset) + } + } +} + +func TestParseZeroOrMoreExpr(t *testing.T) { + cases := []struct { + in string + lit string + out []string + }{ + // ""* is a pathological case - the empty string always matches, so this + // is an infinite loop. Not fixing it, because semantically this seems + // correct. + // {"", "", []byte{}}, + + {"", "a", nil}, + {"a", "a", []string{"a"}}, + {"a", "b", nil}, + {"abc", "ab", []string{"ab"}}, + {"ab", "abc", nil}, + + {"aab", "a", []string{"a", "a"}}, + {"bba", "a", nil}, + {"bba", "b", []string{"b", "b"}}, + {"bba", "bb", []string{"bb"}}, + {"aaaaab", "aa", []string{"aa", "aa"}}, + {"aaaaab", "a", []string{"a", "a", "a", "a", "a"}}, + } + + for _, tc := range cases { + p := newParser("", []byte(tc.in)) + + // advance to the first rune + p.read() + + want := make([]interface{}, len(tc.out)) + for i, v := range tc.out { + want[i] = []byte(v) + } + if tc.out == nil { + want = nil + } + lbl := fmt.Sprintf("%q: %q", tc.lit, tc.in) + + got, ok := p.parseZeroOrMoreExpr(&zeroOrMoreExpr{expr: &litMatcher{val: tc.lit}}) + if !reflect.DeepEqual(got, want) { + t.Errorf("%s: want %#v, got %#v", lbl, want, got) + } + // zero or more always matches + if !ok { + t.Errorf("%s: want match, got %t", lbl, ok) + } + wantOffset := 0 + for _, s := range tc.out { + wantOffset += len(s) + } + if p.pt.offset != wantOffset { + t.Errorf("%s: want offset %d, got %d", lbl, wantOffset, p.pt.offset) + } + } +} + +func TestParseOneOrMoreExpr(t *testing.T) { + cases := []struct { + in string + lit string + out []string + }{ + // ""+ is a pathological case - the empty string always matches, so this + // is an infinite loop. Not fixing it, because semantically this seems + // correct. + //{"", "", []string{}}, + + {"", "a", nil}, + {"a", "a", []string{"a"}}, + {"a", "b", nil}, + {"abc", "ab", []string{"ab"}}, + {"ab", "abc", nil}, + + {"aab", "a", []string{"a", "a"}}, + {"bba", "a", nil}, + {"bba", "b", []string{"b", "b"}}, + {"bba", "bb", []string{"bb"}}, + {"aaaaab", "aa", []string{"aa", "aa"}}, + {"aaaaab", "a", []string{"a", "a", "a", "a", "a"}}, + } + + for _, tc := range cases { + p := newParser("", []byte(tc.in)) + + // advance to the first rune + p.read() + + var want interface{} + var match bool + if tc.out != nil { + vals := make([]interface{}, len(tc.out)) + for i, v := range tc.out { + vals[i] = []byte(v) + } + want = vals + match = true + } + lbl := fmt.Sprintf("%q: %q", tc.lit, tc.in) + + got, ok := p.parseOneOrMoreExpr(&oneOrMoreExpr{expr: &litMatcher{val: tc.lit}}) + if !reflect.DeepEqual(got, want) { + t.Errorf("%s: want %#v, got %#v", lbl, want, got) + } + if ok != match { + t.Errorf("%s: want match? %t, got %t", lbl, match, ok) + } + wantOffset := 0 + for _, s := range tc.out { + wantOffset += len(s) + } + if p.pt.offset != wantOffset { + t.Errorf("%s: want offset %d, got %d", lbl, wantOffset, p.pt.offset) + } + } +} + +func TestParseSeqExpr(t *testing.T) { + cases := []struct { + in string + lits []string + out []string + }{ + {"", nil, []string{}}, // empty seq (impossible case via the parser) always matches + {"", []string{"a"}, nil}, + {"a", []string{"a"}, []string{"a"}}, + {"a", []string{"a", "b"}, nil}, + {"abc", []string{"a", "b"}, []string{"a", "b"}}, + {"abc", []string{"a", "b", "c"}, []string{"a", "b", "c"}}, + {"ab", []string{"a", "b", "c"}, nil}, + } + + for _, tc := range cases { + p := newParser("", []byte(tc.in)) + + // advance to the first rune + p.read() + + var want interface{} + var match bool + if tc.out != nil { + var vals []interface{} + for _, v := range tc.out { + vals = append(vals, []byte(v)) + } + want = vals + match = true + } + lbl := fmt.Sprintf("%v: %q", tc.lits, tc.in) + + lits := make([]interface{}, len(tc.lits)) + for i, l := range tc.lits { + lits[i] = &litMatcher{val: l} + } + + got, ok := p.parseSeqExpr(&seqExpr{exprs: lits}) + if !reflect.DeepEqual(got, want) { + t.Errorf("%s: want %#v, got %#v", lbl, want, got) + } + if ok != match { + t.Errorf("%s: want match? %t, got %t", lbl, match, ok) + } + wantOffset := 0 + for _, s := range tc.out { + wantOffset += len(s) + } + if p.pt.offset != wantOffset { + t.Errorf("%s: want offset %d, got %d", lbl, wantOffset, p.pt.offset) + } + } +} + +func TestParseRuleRefExpr(t *testing.T) { + p := newParser("", []byte("")) + + func() { + defer func() { + if e := recover(); e != nil { + return + } + t.Fatal("want panic, got none") + }() + p.parseRuleRefExpr(&ruleRefExpr{}) + }() + + p.parseRuleRefExpr(&ruleRefExpr{name: "a"}) + if p.errs.err() == nil { + t.Fatal("want error, got none") + } +} + +func TestParseNotExpr(t *testing.T) { + cases := []struct { + in string + lit string + match bool + }{ + {"", "", false}, + {"", "a", true}, + {"a", "a", false}, + {"b", "a", true}, + {"ab", "a", false}, + {"ab", "ab", false}, + {"ab", "abc", true}, + {"abc", "abc", false}, + {"abc", "ab", false}, + {"abc", "ac", true}, + } + for _, tc := range cases { + p := newParser("", []byte(tc.in)) + + // advance to the first rune + p.read() + + lbl := fmt.Sprintf("%q: %q", tc.lit, tc.in) + + _, ok := p.parseNotExpr(¬Expr{expr: &litMatcher{val: tc.lit}}) + if ok != tc.match { + t.Errorf("%s: want match? %t, got %t", lbl, tc.match, ok) + } + if p.pt.offset != 0 { + t.Errorf("%s: want offset %d, got %d", lbl, 0, p.pt.offset) + } + } +} + +func TestParseAndExpr(t *testing.T) { + cases := []struct { + in string + lit string + match bool + }{ + {"", "", true}, + {"", "a", false}, + {"a", "a", true}, + {"b", "a", false}, + {"ab", "a", true}, + {"ab", "ab", true}, + {"ab", "abc", false}, + {"abc", "abc", true}, + {"abc", "ab", true}, + {"abc", "ac", false}, + } + for _, tc := range cases { + p := newParser("", []byte(tc.in)) + + // advance to the first rune + p.read() + + lbl := fmt.Sprintf("%q: %q", tc.lit, tc.in) + + _, ok := p.parseAndExpr(&andExpr{expr: &litMatcher{val: tc.lit}}) + if ok != tc.match { + t.Errorf("%s: want match? %t, got %t", lbl, tc.match, ok) + } + if p.pt.offset != 0 { + t.Errorf("%s: want offset %d, got %d", lbl, 0, p.pt.offset) + } + } +} + +func TestParseNotCodeExpr(t *testing.T) { + cases := []struct { + in string + b bool + err error + }{ + {"", true, nil}, + {"", true, io.EOF}, + {"", false, nil}, + {"", false, io.EOF}, + {"a", true, nil}, + {"a", true, io.EOF}, + {"a", false, nil}, + {"a", false, io.EOF}, + } + + for _, tc := range cases { + fn := func(_ *parser) (bool, error) { + return tc.b, tc.err + } + p := newParser("", []byte(tc.in)) + + // advance to the first rune + p.read() + + lbl := fmt.Sprintf("%q: %t-%t", tc.in, tc.b, tc.err == nil) + + _, ok := p.parseNotCodeExpr(¬CodeExpr{run: fn}) + if ok != !tc.b { + t.Errorf("%s: want match? %t, got %t", lbl, !tc.b, ok) + } + + el := *p.errs + wantn := 0 + if tc.err != nil { + wantn = 1 + } + if len(el) != wantn { + t.Errorf("%s: want %d error, got %d", lbl, wantn, len(el)) + } else if wantn == 1 { + ie := el[0].(*parserError).Inner + if ie != tc.err { + t.Errorf("%s: want error %v, got %v", lbl, tc.err, ie) + } + } + + if p.pt.offset != 0 { + t.Errorf("%s: want offset %d, got %d", lbl, 0, p.pt.offset) + } + } +} + +func TestParseAndCodeExpr(t *testing.T) { + cases := []struct { + in string + b bool + err error + }{ + {"", true, nil}, + {"", true, io.EOF}, + {"", false, nil}, + {"", false, io.EOF}, + {"a", true, nil}, + {"a", true, io.EOF}, + {"a", false, nil}, + {"a", false, io.EOF}, + } + + for _, tc := range cases { + fn := func(_ *parser) (bool, error) { + return tc.b, tc.err + } + p := newParser("", []byte(tc.in)) + + // advance to the first rune + p.read() + + lbl := fmt.Sprintf("%q: %t-%t", tc.in, tc.b, tc.err == nil) + + _, ok := p.parseAndCodeExpr(&andCodeExpr{run: fn}) + if ok != tc.b { + t.Errorf("%s: want match? %t, got %t", lbl, tc.b, ok) + } + + el := *p.errs + wantn := 0 + if tc.err != nil { + wantn = 1 + } + if len(el) != wantn { + t.Errorf("%s: want %d error, got %d", lbl, wantn, len(el)) + } else if wantn == 1 { + ie := el[0].(*parserError).Inner + if ie != tc.err { + t.Errorf("%s: want error %v, got %v", lbl, tc.err, ie) + } + } + + if p.pt.offset != 0 { + t.Errorf("%s: want offset %d, got %d", lbl, 0, p.pt.offset) + } + } +} + +func TestParseLabeledExpr(t *testing.T) { + cases := []struct { + in string + lit string + out []byte + }{ + {"", "", []byte{}}, + {"", "a", nil}, + {"a", "a", []byte("a")}, + {"a", "ab", nil}, + {"ab", "a", []byte("a")}, + {"ab", "ab", []byte("ab")}, + {"ab", "abc", nil}, + {"abc", "ab", []byte("ab")}, + } + + for _, tc := range cases { + p := newParser("", []byte(tc.in)) + + // advance to the first rune + p.read() + p.pushV() + + var want interface{} + var match bool + if tc.out != nil { + match = true + want = tc.out + } + lbl := fmt.Sprintf("%q: %q", tc.lit, tc.in) + + got, ok := p.parseLabeledExpr(&labeledExpr{label: "l", expr: &litMatcher{val: tc.lit}}) + if !reflect.DeepEqual(got, want) { + t.Errorf("%s: want %v, got %v", lbl, tc.out, got) + } + if ok != match { + t.Errorf("%s: want match? %t, got %t", lbl, match, ok) + } else { + // must be 1 var set on the stack + if len(p.vstack) != 1 { + t.Errorf("%s: want %d var sets on the stack, got %d", lbl, 1, len(p.vstack)) + } else { + vs := p.vstack[0] + if !reflect.DeepEqual(vs["l"], got) { + t.Errorf("%s: want %v on the stack for this label, got %v", lbl, got, vs["l"]) + } + } + } + + if p.pt.offset != len(tc.out) { + t.Errorf("%s: want offset %d, got %d", lbl, len(tc.out), p.pt.offset) + } + } +} + +func TestParseChoiceExpr(t *testing.T) { + cases := []struct { + in string + lits []string + out []byte + }{ + {"", nil, nil}, // empty choice (impossible case via the parser) + + {"", []string{"a"}, nil}, + {"a", []string{"a"}, []byte("a")}, + {"a", []string{"b"}, nil}, + {"ab", []string{"b"}, nil}, + {"ba", []string{"b"}, []byte("b")}, + {"a", []string{"a", "b"}, []byte("a")}, + {"a", []string{"b", "a"}, []byte("a")}, + {"ab", []string{"a", "b"}, []byte("a")}, + {"ab", []string{"b", "a"}, []byte("a")}, + {"cb", []string{"a", "b"}, nil}, + {"cb", []string{"b", "a"}, nil}, + {"abcd", []string{"abc", "ab", "a"}, []byte("abc")}, + {"abcd", []string{"a", "ab", "abc"}, []byte("a")}, + {"bcd", []string{"a", "ab", "abc"}, nil}, + } + + for _, tc := range cases { + p := newParser("", []byte(tc.in)) + + // advance to the first rune + p.read() + + var want interface{} + var match bool + if tc.out != nil { + want = tc.out + match = true + } + lbl := fmt.Sprintf("%v: %q", tc.lits, tc.in) + + lits := make([]interface{}, len(tc.lits)) + for i, l := range tc.lits { + lits[i] = &litMatcher{val: l} + } + + got, ok := p.parseChoiceExpr(&choiceExpr{alternatives: lits}) + if !reflect.DeepEqual(got, want) { + t.Errorf("%s: want %#v, got %#v", lbl, want, got) + } + if ok != match { + t.Errorf("%s: want match? %t, got %t", lbl, match, ok) + } + if p.pt.offset != len(tc.out) { + t.Errorf("%s: want offset %d, got %d", lbl, len(tc.out), p.pt.offset) + } + } +} + +func TestParseActionExpr(t *testing.T) { + cases := []struct { + in string + lit string + v interface{} + err error + }{ + {"", "", 1, nil}, // empty string always matches + {"", "", 1, io.EOF}, + {"", "a", nil, nil}, + {"a", "a", 1, nil}, + {"a", "a", 1, io.EOF}, + {"ab", "a", 1, nil}, + {"ab", "a", 1, io.EOF}, + {"ba", "a", nil, nil}, + } + + for _, tc := range cases { + called := false + fn := func(_ *parser) (interface{}, error) { + called = true + return tc.v, tc.err + } + p := newParser("", []byte(tc.in)) + + // advance to the first rune + p.read() + + lbl := fmt.Sprintf("%q: %q", tc.in, tc.lit) + + match := tc.v != nil + + got, ok := p.parseActionExpr(&actionExpr{run: fn, expr: &litMatcher{val: tc.lit}}) + if ok != match { + t.Errorf("%s: want match? %t, got %t", lbl, match, ok) + } + if !reflect.DeepEqual(got, tc.v) { + t.Errorf("%s: want %#v, got %#v", lbl, tc.v, got) + } + if match != called { + t.Errorf("%s: want action code to be called? %t, got %t", lbl, match, called) + } + + el := *p.errs + wantn := 0 + if tc.err != nil { + wantn = 1 + } + if len(el) != wantn { + t.Errorf("%s: want %d error, got %d", lbl, wantn, len(el)) + } else if wantn == 1 { + ie := el[0].(*parserError).Inner + if ie != tc.err { + t.Errorf("%s: want error %v, got %v", lbl, tc.err, ie) + } + } + + wantOffset := 0 + if match { + wantOffset = len(tc.lit) + } + if p.pt.offset != wantOffset { + t.Errorf("%s: want offset %d, got %d", lbl, wantOffset, p.pt.offset) + } + } +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/test/andnot/andnot.go b/vendor/github.com/PuerkitoBio/pigeon/test/andnot/andnot.go new file mode 100644 index 0000000000..ef2cff1418 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/test/andnot/andnot.go @@ -0,0 +1,1038 @@ +package main + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "log" + "os" + "strings" + "unicode" + "unicode/utf8" +) + +func main() { + in := os.Stdin + if len(os.Args) > 1 { + f, err := os.Open(os.Args[1]) + if err != nil { + log.Fatal(err) + } + defer f.Close() + in = f + } + got, err := ParseReader("", in) + fmt.Println(got, err) +} + +func toString(v interface{}) string { + ifSl := v.([]interface{}) + var res string + for _, s := range ifSl { + res += string(s.([]byte)) + } + return res +} + +var g = &grammar{ + rules: []*rule{ + { + name: "Input", + pos: position{line: 28, col: 1, offset: 406}, + expr: &seqExpr{ + pos: position{line: 28, col: 9, offset: 416}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 28, col: 9, offset: 416}, + name: "_", + }, + &ruleRefExpr{ + pos: position{line: 28, col: 11, offset: 418}, + name: "AB", + }, + &ruleRefExpr{ + pos: position{line: 28, col: 14, offset: 421}, + name: "_", + }, + &ruleRefExpr{ + pos: position{line: 28, col: 16, offset: 423}, + name: "EOF", + }, + }, + }, + }, + { + name: "AB", + pos: position{line: 30, col: 1, offset: 428}, + expr: &choiceExpr{ + pos: position{line: 30, col: 6, offset: 435}, + alternatives: []interface{}{ + &seqExpr{ + pos: position{line: 30, col: 6, offset: 435}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 30, col: 6, offset: 435}, + label: "abees", + expr: &oneOrMoreExpr{ + pos: position{line: 30, col: 12, offset: 441}, + expr: &charClassMatcher{ + pos: position{line: 30, col: 12, offset: 441}, + val: "[ab]", + chars: []rune{'a', 'b'}, + ignoreCase: false, + inverted: false, + }, + }, + }, + &andCodeExpr{ + pos: position{line: 30, col: 18, offset: 447}, + run: (*parser).callonAB6, + }, + }, + }, + &ruleRefExpr{ + pos: position{line: 30, col: 77, offset: 506}, + name: "CD", + }, + }, + }, + }, + { + name: "CD", + pos: position{line: 31, col: 1, offset: 509}, + expr: &seqExpr{ + pos: position{line: 31, col: 6, offset: 516}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 31, col: 6, offset: 516}, + label: "ceedees", + expr: &oneOrMoreExpr{ + pos: position{line: 31, col: 14, offset: 524}, + expr: &charClassMatcher{ + pos: position{line: 31, col: 14, offset: 524}, + val: "[cd]", + chars: []rune{'c', 'd'}, + ignoreCase: false, + inverted: false, + }, + }, + }, + ¬CodeExpr{ + pos: position{line: 31, col: 20, offset: 530}, + run: (*parser).callonCD5, + }, + }, + }, + }, + { + name: "_", + pos: position{line: 33, col: 1, offset: 590}, + expr: &zeroOrMoreExpr{ + pos: position{line: 33, col: 5, offset: 596}, + expr: &charClassMatcher{ + pos: position{line: 33, col: 5, offset: 596}, + val: "[ \\t\\n\\r]", + chars: []rune{' ', '\t', '\n', '\r'}, + ignoreCase: false, + inverted: false, + }, + }, + }, + { + name: "EOF", + pos: position{line: 34, col: 1, offset: 607}, + expr: ¬Expr{ + pos: position{line: 34, col: 7, offset: 615}, + expr: &anyMatcher{ + line: 34, col: 8, offset: 616, + }, + }, + }, + }, +} + +func (c *current) onAB6(abees interface{}) (bool, error) { + return strings.HasSuffix(toString(abees), "b"), nil +} + +func (p *parser) callonAB6() (bool, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onAB6(stack["abees"]) +} + +func (c *current) onCD5(ceedees interface{}) (bool, error) { + return strings.HasSuffix(toString(ceedees), "c"), nil +} + +func (p *parser) callonCD5() (bool, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onCD5(stack["ceedees"]) +} + +var ( + // errNoRule is returned when the grammar to parse has no rule. + errNoRule = errors.New("grammar has no rule") + + // errInvalidEncoding is returned when the source is not properly + // utf8-encoded. + errInvalidEncoding = errors.New("invalid encoding") + + // errNoMatch is returned if no match could be found. + errNoMatch = errors.New("no match found") +) + +// Option is a function that can set an option on the parser. It returns +// the previous setting as an Option. +type Option func(*parser) Option + +// Debug creates an Option to set the debug flag to b. When set to true, +// debugging information is printed to stdout while parsing. +// +// The default is false. +func Debug(b bool) Option { + return func(p *parser) Option { + old := p.debug + p.debug = b + return Debug(old) + } +} + +// Memoize creates an Option to set the memoize flag to b. When set to true, +// the parser will cache all results so each expression is evaluated only +// once. This guarantees linear parsing time even for pathological cases, +// at the expense of more memory and slower times for typical cases. +// +// The default is false. +func Memoize(b bool) Option { + return func(p *parser) Option { + old := p.memoize + p.memoize = b + return Memoize(old) + } +} + +// Recover creates an Option to set the recover flag to b. When set to +// true, this causes the parser to recover from panics and convert it +// to an error. Setting it to false can be useful while debugging to +// access the full stack trace. +// +// The default is true. +func Recover(b bool) Option { + return func(p *parser) Option { + old := p.recover + p.recover = b + return Recover(old) + } +} + +// ParseFile parses the file identified by filename. +func ParseFile(filename string, opts ...Option) (interface{}, error) { + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + return ParseReader(filename, f, opts...) +} + +// ParseReader parses the data from r using filename as information in the +// error messages. +func ParseReader(filename string, r io.Reader, opts ...Option) (interface{}, error) { + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + + return Parse(filename, b, opts...) +} + +// Parse parses the data from b using filename as information in the +// error messages. +func Parse(filename string, b []byte, opts ...Option) (interface{}, error) { + return newParser(filename, b, opts...).parse(g) +} + +// position records a position in the text. +type position struct { + line, col, offset int +} + +func (p position) String() string { + return fmt.Sprintf("%d:%d [%d]", p.line, p.col, p.offset) +} + +// savepoint stores all state required to go back to this point in the +// parser. +type savepoint struct { + position + rn rune + w int +} + +type current struct { + pos position // start position of the match + text []byte // raw text of the match +} + +// the AST types... + +type grammar struct { + pos position + rules []*rule +} + +type rule struct { + pos position + name string + displayName string + expr interface{} +} + +type choiceExpr struct { + pos position + alternatives []interface{} +} + +type actionExpr struct { + pos position + expr interface{} + run func(*parser) (interface{}, error) +} + +type seqExpr struct { + pos position + exprs []interface{} +} + +type labeledExpr struct { + pos position + label string + expr interface{} +} + +type expr struct { + pos position + expr interface{} +} + +type andExpr expr +type notExpr expr +type zeroOrOneExpr expr +type zeroOrMoreExpr expr +type oneOrMoreExpr expr + +type ruleRefExpr struct { + pos position + name string +} + +type andCodeExpr struct { + pos position + run func(*parser) (bool, error) +} + +type notCodeExpr struct { + pos position + run func(*parser) (bool, error) +} + +type litMatcher struct { + pos position + val string + ignoreCase bool +} + +type charClassMatcher struct { + pos position + val string + chars []rune + ranges []rune + classes []*unicode.RangeTable + ignoreCase bool + inverted bool +} + +type anyMatcher position + +// errList cumulates the errors found by the parser. +type errList []error + +func (e *errList) add(err error) { + *e = append(*e, err) +} + +func (e errList) err() error { + if len(e) == 0 { + return nil + } + e.dedupe() + return e +} + +func (e *errList) dedupe() { + var cleaned []error + set := make(map[string]bool) + for _, err := range *e { + if msg := err.Error(); !set[msg] { + set[msg] = true + cleaned = append(cleaned, err) + } + } + *e = cleaned +} + +func (e errList) Error() string { + switch len(e) { + case 0: + return "" + case 1: + return e[0].Error() + default: + var buf bytes.Buffer + + for i, err := range e { + if i > 0 { + buf.WriteRune('\n') + } + buf.WriteString(err.Error()) + } + return buf.String() + } +} + +// parserError wraps an error with a prefix indicating the rule in which +// the error occurred. The original error is stored in the Inner field. +type parserError struct { + Inner error + pos position + prefix string +} + +// Error returns the error message. +func (p *parserError) Error() string { + return p.prefix + ": " + p.Inner.Error() +} + +// newParser creates a parser with the specified input source and options. +func newParser(filename string, b []byte, opts ...Option) *parser { + p := &parser{ + filename: filename, + errs: new(errList), + data: b, + pt: savepoint{position: position{line: 1}}, + recover: true, + } + p.setOptions(opts) + return p +} + +// setOptions applies the options to the parser. +func (p *parser) setOptions(opts []Option) { + for _, opt := range opts { + opt(p) + } +} + +type resultTuple struct { + v interface{} + b bool + end savepoint +} + +type parser struct { + filename string + pt savepoint + cur current + + data []byte + errs *errList + + recover bool + debug bool + depth int + + memoize bool + // memoization table for the packrat algorithm: + // map[offset in source] map[expression or rule] {value, match} + memo map[int]map[interface{}]resultTuple + + // rules table, maps the rule identifier to the rule node + rules map[string]*rule + // variables stack, map of label to value + vstack []map[string]interface{} + // rule stack, allows identification of the current rule in errors + rstack []*rule + + // stats + exprCnt int +} + +// push a variable set on the vstack. +func (p *parser) pushV() { + if cap(p.vstack) == len(p.vstack) { + // create new empty slot in the stack + p.vstack = append(p.vstack, nil) + } else { + // slice to 1 more + p.vstack = p.vstack[:len(p.vstack)+1] + } + + // get the last args set + m := p.vstack[len(p.vstack)-1] + if m != nil && len(m) == 0 { + // empty map, all good + return + } + + m = make(map[string]interface{}) + p.vstack[len(p.vstack)-1] = m +} + +// pop a variable set from the vstack. +func (p *parser) popV() { + // if the map is not empty, clear it + m := p.vstack[len(p.vstack)-1] + if len(m) > 0 { + // GC that map + p.vstack[len(p.vstack)-1] = nil + } + p.vstack = p.vstack[:len(p.vstack)-1] +} + +func (p *parser) print(prefix, s string) string { + if !p.debug { + return s + } + + fmt.Printf("%s %d:%d:%d: %s [%#U]\n", + prefix, p.pt.line, p.pt.col, p.pt.offset, s, p.pt.rn) + return s +} + +func (p *parser) in(s string) string { + p.depth++ + return p.print(strings.Repeat(" ", p.depth)+">", s) +} + +func (p *parser) out(s string) string { + p.depth-- + return p.print(strings.Repeat(" ", p.depth)+"<", s) +} + +func (p *parser) addErr(err error) { + p.addErrAt(err, p.pt.position) +} + +func (p *parser) addErrAt(err error, pos position) { + var buf bytes.Buffer + if p.filename != "" { + buf.WriteString(p.filename) + } + if buf.Len() > 0 { + buf.WriteString(":") + } + buf.WriteString(fmt.Sprintf("%d:%d (%d)", pos.line, pos.col, pos.offset)) + if len(p.rstack) > 0 { + if buf.Len() > 0 { + buf.WriteString(": ") + } + rule := p.rstack[len(p.rstack)-1] + if rule.displayName != "" { + buf.WriteString("rule " + rule.displayName) + } else { + buf.WriteString("rule " + rule.name) + } + } + pe := &parserError{Inner: err, prefix: buf.String()} + p.errs.add(pe) +} + +// read advances the parser to the next rune. +func (p *parser) read() { + p.pt.offset += p.pt.w + rn, n := utf8.DecodeRune(p.data[p.pt.offset:]) + p.pt.rn = rn + p.pt.w = n + p.pt.col++ + if rn == '\n' { + p.pt.line++ + p.pt.col = 0 + } + + if rn == utf8.RuneError { + if n > 0 { + p.addErr(errInvalidEncoding) + } + } +} + +// restore parser position to the savepoint pt. +func (p *parser) restore(pt savepoint) { + if p.debug { + defer p.out(p.in("restore")) + } + if pt.offset == p.pt.offset { + return + } + p.pt = pt +} + +// get the slice of bytes from the savepoint start to the current position. +func (p *parser) sliceFrom(start savepoint) []byte { + return p.data[start.position.offset:p.pt.position.offset] +} + +func (p *parser) getMemoized(node interface{}) (resultTuple, bool) { + if len(p.memo) == 0 { + return resultTuple{}, false + } + m := p.memo[p.pt.offset] + if len(m) == 0 { + return resultTuple{}, false + } + res, ok := m[node] + return res, ok +} + +func (p *parser) setMemoized(pt savepoint, node interface{}, tuple resultTuple) { + if p.memo == nil { + p.memo = make(map[int]map[interface{}]resultTuple) + } + m := p.memo[pt.offset] + if m == nil { + m = make(map[interface{}]resultTuple) + p.memo[pt.offset] = m + } + m[node] = tuple +} + +func (p *parser) buildRulesTable(g *grammar) { + p.rules = make(map[string]*rule, len(g.rules)) + for _, r := range g.rules { + p.rules[r.name] = r + } +} + +func (p *parser) parse(g *grammar) (val interface{}, err error) { + if len(g.rules) == 0 { + p.addErr(errNoRule) + return nil, p.errs.err() + } + + // TODO : not super critical but this could be generated + p.buildRulesTable(g) + + if p.recover { + // panic can be used in action code to stop parsing immediately + // and return the panic as an error. + defer func() { + if e := recover(); e != nil { + if p.debug { + defer p.out(p.in("panic handler")) + } + val = nil + switch e := e.(type) { + case error: + p.addErr(e) + default: + p.addErr(fmt.Errorf("%v", e)) + } + err = p.errs.err() + } + }() + } + + // start rule is rule [0] + p.read() // advance to first rune + val, ok := p.parseRule(g.rules[0]) + if !ok { + if len(*p.errs) == 0 { + // make sure this doesn't go out silently + p.addErr(errNoMatch) + } + return nil, p.errs.err() + } + return val, p.errs.err() +} + +func (p *parser) parseRule(rule *rule) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseRule " + rule.name)) + } + + if p.memoize { + res, ok := p.getMemoized(rule) + if ok { + p.restore(res.end) + return res.v, res.b + } + } + + start := p.pt + p.rstack = append(p.rstack, rule) + p.pushV() + val, ok := p.parseExpr(rule.expr) + p.popV() + p.rstack = p.rstack[:len(p.rstack)-1] + if ok && p.debug { + p.print(strings.Repeat(" ", p.depth)+"MATCH", string(p.sliceFrom(start))) + } + + if p.memoize { + p.setMemoized(start, rule, resultTuple{val, ok, p.pt}) + } + return val, ok +} + +func (p *parser) parseExpr(expr interface{}) (interface{}, bool) { + var pt savepoint + var ok bool + + if p.memoize { + res, ok := p.getMemoized(expr) + if ok { + p.restore(res.end) + return res.v, res.b + } + pt = p.pt + } + + p.exprCnt++ + var val interface{} + switch expr := expr.(type) { + case *actionExpr: + val, ok = p.parseActionExpr(expr) + case *andCodeExpr: + val, ok = p.parseAndCodeExpr(expr) + case *andExpr: + val, ok = p.parseAndExpr(expr) + case *anyMatcher: + val, ok = p.parseAnyMatcher(expr) + case *charClassMatcher: + val, ok = p.parseCharClassMatcher(expr) + case *choiceExpr: + val, ok = p.parseChoiceExpr(expr) + case *labeledExpr: + val, ok = p.parseLabeledExpr(expr) + case *litMatcher: + val, ok = p.parseLitMatcher(expr) + case *notCodeExpr: + val, ok = p.parseNotCodeExpr(expr) + case *notExpr: + val, ok = p.parseNotExpr(expr) + case *oneOrMoreExpr: + val, ok = p.parseOneOrMoreExpr(expr) + case *ruleRefExpr: + val, ok = p.parseRuleRefExpr(expr) + case *seqExpr: + val, ok = p.parseSeqExpr(expr) + case *zeroOrMoreExpr: + val, ok = p.parseZeroOrMoreExpr(expr) + case *zeroOrOneExpr: + val, ok = p.parseZeroOrOneExpr(expr) + default: + panic(fmt.Sprintf("unknown expression type %T", expr)) + } + if p.memoize { + p.setMemoized(pt, expr, resultTuple{val, ok, p.pt}) + } + return val, ok +} + +func (p *parser) parseActionExpr(act *actionExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseActionExpr")) + } + + start := p.pt + val, ok := p.parseExpr(act.expr) + if ok { + p.cur.pos = start.position + p.cur.text = p.sliceFrom(start) + actVal, err := act.run(p) + if err != nil { + p.addErrAt(err, start.position) + } + val = actVal + } + if ok && p.debug { + p.print(strings.Repeat(" ", p.depth)+"MATCH", string(p.sliceFrom(start))) + } + return val, ok +} + +func (p *parser) parseAndCodeExpr(and *andCodeExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAndCodeExpr")) + } + + ok, err := and.run(p) + if err != nil { + p.addErr(err) + } + return nil, ok +} + +func (p *parser) parseAndExpr(and *andExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAndExpr")) + } + + pt := p.pt + p.pushV() + _, ok := p.parseExpr(and.expr) + p.popV() + p.restore(pt) + return nil, ok +} + +func (p *parser) parseAnyMatcher(any *anyMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAnyMatcher")) + } + + if p.pt.rn != utf8.RuneError { + start := p.pt + p.read() + return p.sliceFrom(start), true + } + return nil, false +} + +func (p *parser) parseCharClassMatcher(chr *charClassMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseCharClassMatcher")) + } + + cur := p.pt.rn + // can't match EOF + if cur == utf8.RuneError { + return nil, false + } + start := p.pt + if chr.ignoreCase { + cur = unicode.ToLower(cur) + } + + // try to match in the list of available chars + for _, rn := range chr.chars { + if rn == cur { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + // try to match in the list of ranges + for i := 0; i < len(chr.ranges); i += 2 { + if cur >= chr.ranges[i] && cur <= chr.ranges[i+1] { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + // try to match in the list of Unicode classes + for _, cl := range chr.classes { + if unicode.Is(cl, cur) { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + if chr.inverted { + p.read() + return p.sliceFrom(start), true + } + return nil, false +} + +func (p *parser) parseChoiceExpr(ch *choiceExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseChoiceExpr")) + } + + for _, alt := range ch.alternatives { + p.pushV() + val, ok := p.parseExpr(alt) + p.popV() + if ok { + return val, ok + } + } + return nil, false +} + +func (p *parser) parseLabeledExpr(lab *labeledExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseLabeledExpr")) + } + + p.pushV() + val, ok := p.parseExpr(lab.expr) + p.popV() + if ok && lab.label != "" { + m := p.vstack[len(p.vstack)-1] + m[lab.label] = val + } + return val, ok +} + +func (p *parser) parseLitMatcher(lit *litMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseLitMatcher")) + } + + start := p.pt + for _, want := range lit.val { + cur := p.pt.rn + if lit.ignoreCase { + cur = unicode.ToLower(cur) + } + if cur != want { + p.restore(start) + return nil, false + } + p.read() + } + return p.sliceFrom(start), true +} + +func (p *parser) parseNotCodeExpr(not *notCodeExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseNotCodeExpr")) + } + + ok, err := not.run(p) + if err != nil { + p.addErr(err) + } + return nil, !ok +} + +func (p *parser) parseNotExpr(not *notExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseNotExpr")) + } + + pt := p.pt + p.pushV() + _, ok := p.parseExpr(not.expr) + p.popV() + p.restore(pt) + return nil, !ok +} + +func (p *parser) parseOneOrMoreExpr(expr *oneOrMoreExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseOneOrMoreExpr")) + } + + var vals []interface{} + + for { + p.pushV() + val, ok := p.parseExpr(expr.expr) + p.popV() + if !ok { + if len(vals) == 0 { + // did not match once, no match + return nil, false + } + return vals, true + } + vals = append(vals, val) + } +} + +func (p *parser) parseRuleRefExpr(ref *ruleRefExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseRuleRefExpr " + ref.name)) + } + + if ref.name == "" { + panic(fmt.Sprintf("%s: invalid rule: missing name", ref.pos)) + } + + rule := p.rules[ref.name] + if rule == nil { + p.addErr(fmt.Errorf("undefined rule: %s", ref.name)) + return nil, false + } + return p.parseRule(rule) +} + +func (p *parser) parseSeqExpr(seq *seqExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseSeqExpr")) + } + + var vals []interface{} + + pt := p.pt + for _, expr := range seq.exprs { + val, ok := p.parseExpr(expr) + if !ok { + p.restore(pt) + return nil, false + } + vals = append(vals, val) + } + return vals, true +} + +func (p *parser) parseZeroOrMoreExpr(expr *zeroOrMoreExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseZeroOrMoreExpr")) + } + + var vals []interface{} + + for { + p.pushV() + val, ok := p.parseExpr(expr.expr) + p.popV() + if !ok { + return vals, true + } + vals = append(vals, val) + } +} + +func (p *parser) parseZeroOrOneExpr(expr *zeroOrOneExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseZeroOrOneExpr")) + } + + p.pushV() + val, _ := p.parseExpr(expr.expr) + p.popV() + // whether it matched or not, consider it a match + return val, true +} + +func rangeTable(class string) *unicode.RangeTable { + if rt, ok := unicode.Categories[class]; ok { + return rt + } + if rt, ok := unicode.Properties[class]; ok { + return rt + } + if rt, ok := unicode.Scripts[class]; ok { + return rt + } + + // cannot happen + panic(fmt.Sprintf("invalid Unicode class: %s", class)) +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/test/andnot/andnot.peg b/vendor/github.com/PuerkitoBio/pigeon/test/andnot/andnot.peg new file mode 100644 index 0000000000..90d0557df4 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/test/andnot/andnot.peg @@ -0,0 +1,35 @@ +{ +package main + +func main() { + in := os.Stdin + if len(os.Args) > 1 { + f, err := os.Open(os.Args[1]) + if err != nil { + log.Fatal(err) + } + defer f.Close() + in = f + } + got, err := ParseReader("", in) + fmt.Println(got, err) +} + +func toString(v interface{}) string { + ifSl := v.([]interface{}) + var res string + for _, s := range ifSl { + res += string(s.([]byte)) + } + return res +} +} + +Input ← _ AB _ EOF + +AB ← abees:[ab]+ &{ return strings.HasSuffix(toString(abees), "b"), nil } / CD +CD ← ceedees:[cd]+ !{ return strings.HasSuffix(toString(ceedees), "c"), nil } + +_ ← [ \t\n\r]* +EOF ← !. + diff --git a/vendor/github.com/PuerkitoBio/pigeon/test/andnot/andnot_test.go b/vendor/github.com/PuerkitoBio/pigeon/test/andnot/andnot_test.go new file mode 100644 index 0000000000..1f77d2f5cd --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/test/andnot/andnot_test.go @@ -0,0 +1,36 @@ +package main + +import "testing" + +// ABs must end in Bs, CDs must end in Ds +var cases = map[string]string{ + "": "1:1 (0): no match found", + "a": "1:1 (0): no match found", + "b": "", + "ab": "", + "ba": "1:1 (0): no match found", + "aab": "", + "bba": "1:1 (0): no match found", + "aabbaba": "1:1 (0): no match found", + "bbaabaaabbbb": "", + "abc": "1:1 (0): no match found", + "c": "1:1 (0): no match found", + "d": "", + "cd": "", + "dc": "1:1 (0): no match found", + "dcddcc": "1:1 (0): no match found", + "dcddccdd": "", +} + +func TestAndNot(t *testing.T) { + for tc, exp := range cases { + _, err := Parse("", []byte(tc)) + var got string + if err != nil { + got = err.Error() + } + if got != exp { + t.Errorf("%q: want %v, got %v", tc, exp, got) + } + } +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/test/issue_1/issue_1.go b/vendor/github.com/PuerkitoBio/pigeon/test/issue_1/issue_1.go new file mode 100644 index 0000000000..2a1f1b45b5 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/test/issue_1/issue_1.go @@ -0,0 +1,971 @@ +package main + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "strings" + "unicode" + "unicode/utf8" +) + +func main() { + ast, err := Parse("STDIN", []byte("foo")) + if err != nil { + fmt.Printf("error: %s\n", err) + return + } + fmt.Printf("%+v\n", ast) +} + +var g = &grammar{ + rules: []*rule{ + { + name: "TableRef", + pos: position{line: 14, col: 1, offset: 174}, + expr: &actionExpr{ + pos: position{line: 14, col: 13, offset: 186}, + run: (*parser).callonTableRef1, + expr: &seqExpr{ + pos: position{line: 14, col: 13, offset: 186}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 14, col: 13, offset: 186}, + label: "database", + expr: &zeroOrOneExpr{ + pos: position{line: 14, col: 22, offset: 195}, + expr: &seqExpr{ + pos: position{line: 14, col: 23, offset: 196}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 14, col: 23, offset: 196}, + name: "ID", + }, + &litMatcher{ + pos: position{line: 14, col: 26, offset: 199}, + val: ".", + ignoreCase: false, + }, + }, + }, + }, + }, + &labeledExpr{ + pos: position{line: 14, col: 32, offset: 205}, + label: "table", + expr: &ruleRefExpr{ + pos: position{line: 14, col: 38, offset: 211}, + name: "ID", + }, + }, + }, + }, + }, + }, + { + name: "ID", + pos: position{line: 15, col: 1, offset: 271}, + expr: &actionExpr{ + pos: position{line: 15, col: 7, offset: 277}, + run: (*parser).callonID1, + expr: &oneOrMoreExpr{ + pos: position{line: 15, col: 7, offset: 277}, + expr: &charClassMatcher{ + pos: position{line: 15, col: 7, offset: 277}, + val: "[a-z]", + ranges: []rune{'a', 'z'}, + ignoreCase: false, + inverted: false, + }, + }, + }, + }, + }, +} + +func (c *current) onTableRef1(database, table interface{}) (interface{}, error) { + return fmt.Sprintf("%v.%s", database, table), nil +} + +func (p *parser) callonTableRef1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onTableRef1(stack["database"], stack["table"]) +} + +func (c *current) onID1() (interface{}, error) { + return c.text, nil +} + +func (p *parser) callonID1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onID1() +} + +var ( + // errNoRule is returned when the grammar to parse has no rule. + errNoRule = errors.New("grammar has no rule") + + // errInvalidEncoding is returned when the source is not properly + // utf8-encoded. + errInvalidEncoding = errors.New("invalid encoding") + + // errNoMatch is returned if no match could be found. + errNoMatch = errors.New("no match found") +) + +// Option is a function that can set an option on the parser. It returns +// the previous setting as an Option. +type Option func(*parser) Option + +// Debug creates an Option to set the debug flag to b. When set to true, +// debugging information is printed to stdout while parsing. +// +// The default is false. +func Debug(b bool) Option { + return func(p *parser) Option { + old := p.debug + p.debug = b + return Debug(old) + } +} + +// Memoize creates an Option to set the memoize flag to b. When set to true, +// the parser will cache all results so each expression is evaluated only +// once. This guarantees linear parsing time even for pathological cases, +// at the expense of more memory and slower times for typical cases. +// +// The default is false. +func Memoize(b bool) Option { + return func(p *parser) Option { + old := p.memoize + p.memoize = b + return Memoize(old) + } +} + +// Recover creates an Option to set the recover flag to b. When set to +// true, this causes the parser to recover from panics and convert it +// to an error. Setting it to false can be useful while debugging to +// access the full stack trace. +// +// The default is true. +func Recover(b bool) Option { + return func(p *parser) Option { + old := p.recover + p.recover = b + return Recover(old) + } +} + +// ParseFile parses the file identified by filename. +func ParseFile(filename string, opts ...Option) (interface{}, error) { + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + return ParseReader(filename, f, opts...) +} + +// ParseReader parses the data from r using filename as information in the +// error messages. +func ParseReader(filename string, r io.Reader, opts ...Option) (interface{}, error) { + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + + return Parse(filename, b, opts...) +} + +// Parse parses the data from b using filename as information in the +// error messages. +func Parse(filename string, b []byte, opts ...Option) (interface{}, error) { + return newParser(filename, b, opts...).parse(g) +} + +// position records a position in the text. +type position struct { + line, col, offset int +} + +func (p position) String() string { + return fmt.Sprintf("%d:%d [%d]", p.line, p.col, p.offset) +} + +// savepoint stores all state required to go back to this point in the +// parser. +type savepoint struct { + position + rn rune + w int +} + +type current struct { + pos position // start position of the match + text []byte // raw text of the match +} + +// the AST types... + +type grammar struct { + pos position + rules []*rule +} + +type rule struct { + pos position + name string + displayName string + expr interface{} +} + +type choiceExpr struct { + pos position + alternatives []interface{} +} + +type actionExpr struct { + pos position + expr interface{} + run func(*parser) (interface{}, error) +} + +type seqExpr struct { + pos position + exprs []interface{} +} + +type labeledExpr struct { + pos position + label string + expr interface{} +} + +type expr struct { + pos position + expr interface{} +} + +type andExpr expr +type notExpr expr +type zeroOrOneExpr expr +type zeroOrMoreExpr expr +type oneOrMoreExpr expr + +type ruleRefExpr struct { + pos position + name string +} + +type andCodeExpr struct { + pos position + run func(*parser) (bool, error) +} + +type notCodeExpr struct { + pos position + run func(*parser) (bool, error) +} + +type litMatcher struct { + pos position + val string + ignoreCase bool +} + +type charClassMatcher struct { + pos position + val string + chars []rune + ranges []rune + classes []*unicode.RangeTable + ignoreCase bool + inverted bool +} + +type anyMatcher position + +// errList cumulates the errors found by the parser. +type errList []error + +func (e *errList) add(err error) { + *e = append(*e, err) +} + +func (e errList) err() error { + if len(e) == 0 { + return nil + } + e.dedupe() + return e +} + +func (e *errList) dedupe() { + var cleaned []error + set := make(map[string]bool) + for _, err := range *e { + if msg := err.Error(); !set[msg] { + set[msg] = true + cleaned = append(cleaned, err) + } + } + *e = cleaned +} + +func (e errList) Error() string { + switch len(e) { + case 0: + return "" + case 1: + return e[0].Error() + default: + var buf bytes.Buffer + + for i, err := range e { + if i > 0 { + buf.WriteRune('\n') + } + buf.WriteString(err.Error()) + } + return buf.String() + } +} + +// parserError wraps an error with a prefix indicating the rule in which +// the error occurred. The original error is stored in the Inner field. +type parserError struct { + Inner error + pos position + prefix string +} + +// Error returns the error message. +func (p *parserError) Error() string { + return p.prefix + ": " + p.Inner.Error() +} + +// newParser creates a parser with the specified input source and options. +func newParser(filename string, b []byte, opts ...Option) *parser { + p := &parser{ + filename: filename, + errs: new(errList), + data: b, + pt: savepoint{position: position{line: 1}}, + recover: true, + } + p.setOptions(opts) + return p +} + +// setOptions applies the options to the parser. +func (p *parser) setOptions(opts []Option) { + for _, opt := range opts { + opt(p) + } +} + +type resultTuple struct { + v interface{} + b bool + end savepoint +} + +type parser struct { + filename string + pt savepoint + cur current + + data []byte + errs *errList + + recover bool + debug bool + depth int + + memoize bool + // memoization table for the packrat algorithm: + // map[offset in source] map[expression or rule] {value, match} + memo map[int]map[interface{}]resultTuple + + // rules table, maps the rule identifier to the rule node + rules map[string]*rule + // variables stack, map of label to value + vstack []map[string]interface{} + // rule stack, allows identification of the current rule in errors + rstack []*rule + + // stats + exprCnt int +} + +// push a variable set on the vstack. +func (p *parser) pushV() { + if cap(p.vstack) == len(p.vstack) { + // create new empty slot in the stack + p.vstack = append(p.vstack, nil) + } else { + // slice to 1 more + p.vstack = p.vstack[:len(p.vstack)+1] + } + + // get the last args set + m := p.vstack[len(p.vstack)-1] + if m != nil && len(m) == 0 { + // empty map, all good + return + } + + m = make(map[string]interface{}) + p.vstack[len(p.vstack)-1] = m +} + +// pop a variable set from the vstack. +func (p *parser) popV() { + // if the map is not empty, clear it + m := p.vstack[len(p.vstack)-1] + if len(m) > 0 { + // GC that map + p.vstack[len(p.vstack)-1] = nil + } + p.vstack = p.vstack[:len(p.vstack)-1] +} + +func (p *parser) print(prefix, s string) string { + if !p.debug { + return s + } + + fmt.Printf("%s %d:%d:%d: %s [%#U]\n", + prefix, p.pt.line, p.pt.col, p.pt.offset, s, p.pt.rn) + return s +} + +func (p *parser) in(s string) string { + p.depth++ + return p.print(strings.Repeat(" ", p.depth)+">", s) +} + +func (p *parser) out(s string) string { + p.depth-- + return p.print(strings.Repeat(" ", p.depth)+"<", s) +} + +func (p *parser) addErr(err error) { + p.addErrAt(err, p.pt.position) +} + +func (p *parser) addErrAt(err error, pos position) { + var buf bytes.Buffer + if p.filename != "" { + buf.WriteString(p.filename) + } + if buf.Len() > 0 { + buf.WriteString(":") + } + buf.WriteString(fmt.Sprintf("%d:%d (%d)", pos.line, pos.col, pos.offset)) + if len(p.rstack) > 0 { + if buf.Len() > 0 { + buf.WriteString(": ") + } + rule := p.rstack[len(p.rstack)-1] + if rule.displayName != "" { + buf.WriteString("rule " + rule.displayName) + } else { + buf.WriteString("rule " + rule.name) + } + } + pe := &parserError{Inner: err, prefix: buf.String()} + p.errs.add(pe) +} + +// read advances the parser to the next rune. +func (p *parser) read() { + p.pt.offset += p.pt.w + rn, n := utf8.DecodeRune(p.data[p.pt.offset:]) + p.pt.rn = rn + p.pt.w = n + p.pt.col++ + if rn == '\n' { + p.pt.line++ + p.pt.col = 0 + } + + if rn == utf8.RuneError { + if n > 0 { + p.addErr(errInvalidEncoding) + } + } +} + +// restore parser position to the savepoint pt. +func (p *parser) restore(pt savepoint) { + if p.debug { + defer p.out(p.in("restore")) + } + if pt.offset == p.pt.offset { + return + } + p.pt = pt +} + +// get the slice of bytes from the savepoint start to the current position. +func (p *parser) sliceFrom(start savepoint) []byte { + return p.data[start.position.offset:p.pt.position.offset] +} + +func (p *parser) getMemoized(node interface{}) (resultTuple, bool) { + if len(p.memo) == 0 { + return resultTuple{}, false + } + m := p.memo[p.pt.offset] + if len(m) == 0 { + return resultTuple{}, false + } + res, ok := m[node] + return res, ok +} + +func (p *parser) setMemoized(pt savepoint, node interface{}, tuple resultTuple) { + if p.memo == nil { + p.memo = make(map[int]map[interface{}]resultTuple) + } + m := p.memo[pt.offset] + if m == nil { + m = make(map[interface{}]resultTuple) + p.memo[pt.offset] = m + } + m[node] = tuple +} + +func (p *parser) buildRulesTable(g *grammar) { + p.rules = make(map[string]*rule, len(g.rules)) + for _, r := range g.rules { + p.rules[r.name] = r + } +} + +func (p *parser) parse(g *grammar) (val interface{}, err error) { + if len(g.rules) == 0 { + p.addErr(errNoRule) + return nil, p.errs.err() + } + + // TODO : not super critical but this could be generated + p.buildRulesTable(g) + + if p.recover { + // panic can be used in action code to stop parsing immediately + // and return the panic as an error. + defer func() { + if e := recover(); e != nil { + if p.debug { + defer p.out(p.in("panic handler")) + } + val = nil + switch e := e.(type) { + case error: + p.addErr(e) + default: + p.addErr(fmt.Errorf("%v", e)) + } + err = p.errs.err() + } + }() + } + + // start rule is rule [0] + p.read() // advance to first rune + val, ok := p.parseRule(g.rules[0]) + if !ok { + if len(*p.errs) == 0 { + // make sure this doesn't go out silently + p.addErr(errNoMatch) + } + return nil, p.errs.err() + } + return val, p.errs.err() +} + +func (p *parser) parseRule(rule *rule) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseRule " + rule.name)) + } + + if p.memoize { + res, ok := p.getMemoized(rule) + if ok { + p.restore(res.end) + return res.v, res.b + } + } + + start := p.pt + p.rstack = append(p.rstack, rule) + p.pushV() + val, ok := p.parseExpr(rule.expr) + p.popV() + p.rstack = p.rstack[:len(p.rstack)-1] + if ok && p.debug { + p.print(strings.Repeat(" ", p.depth)+"MATCH", string(p.sliceFrom(start))) + } + + if p.memoize { + p.setMemoized(start, rule, resultTuple{val, ok, p.pt}) + } + return val, ok +} + +func (p *parser) parseExpr(expr interface{}) (interface{}, bool) { + var pt savepoint + var ok bool + + if p.memoize { + res, ok := p.getMemoized(expr) + if ok { + p.restore(res.end) + return res.v, res.b + } + pt = p.pt + } + + p.exprCnt++ + var val interface{} + switch expr := expr.(type) { + case *actionExpr: + val, ok = p.parseActionExpr(expr) + case *andCodeExpr: + val, ok = p.parseAndCodeExpr(expr) + case *andExpr: + val, ok = p.parseAndExpr(expr) + case *anyMatcher: + val, ok = p.parseAnyMatcher(expr) + case *charClassMatcher: + val, ok = p.parseCharClassMatcher(expr) + case *choiceExpr: + val, ok = p.parseChoiceExpr(expr) + case *labeledExpr: + val, ok = p.parseLabeledExpr(expr) + case *litMatcher: + val, ok = p.parseLitMatcher(expr) + case *notCodeExpr: + val, ok = p.parseNotCodeExpr(expr) + case *notExpr: + val, ok = p.parseNotExpr(expr) + case *oneOrMoreExpr: + val, ok = p.parseOneOrMoreExpr(expr) + case *ruleRefExpr: + val, ok = p.parseRuleRefExpr(expr) + case *seqExpr: + val, ok = p.parseSeqExpr(expr) + case *zeroOrMoreExpr: + val, ok = p.parseZeroOrMoreExpr(expr) + case *zeroOrOneExpr: + val, ok = p.parseZeroOrOneExpr(expr) + default: + panic(fmt.Sprintf("unknown expression type %T", expr)) + } + if p.memoize { + p.setMemoized(pt, expr, resultTuple{val, ok, p.pt}) + } + return val, ok +} + +func (p *parser) parseActionExpr(act *actionExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseActionExpr")) + } + + start := p.pt + val, ok := p.parseExpr(act.expr) + if ok { + p.cur.pos = start.position + p.cur.text = p.sliceFrom(start) + actVal, err := act.run(p) + if err != nil { + p.addErrAt(err, start.position) + } + val = actVal + } + if ok && p.debug { + p.print(strings.Repeat(" ", p.depth)+"MATCH", string(p.sliceFrom(start))) + } + return val, ok +} + +func (p *parser) parseAndCodeExpr(and *andCodeExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAndCodeExpr")) + } + + ok, err := and.run(p) + if err != nil { + p.addErr(err) + } + return nil, ok +} + +func (p *parser) parseAndExpr(and *andExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAndExpr")) + } + + pt := p.pt + p.pushV() + _, ok := p.parseExpr(and.expr) + p.popV() + p.restore(pt) + return nil, ok +} + +func (p *parser) parseAnyMatcher(any *anyMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAnyMatcher")) + } + + if p.pt.rn != utf8.RuneError { + start := p.pt + p.read() + return p.sliceFrom(start), true + } + return nil, false +} + +func (p *parser) parseCharClassMatcher(chr *charClassMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseCharClassMatcher")) + } + + cur := p.pt.rn + // can't match EOF + if cur == utf8.RuneError { + return nil, false + } + start := p.pt + if chr.ignoreCase { + cur = unicode.ToLower(cur) + } + + // try to match in the list of available chars + for _, rn := range chr.chars { + if rn == cur { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + // try to match in the list of ranges + for i := 0; i < len(chr.ranges); i += 2 { + if cur >= chr.ranges[i] && cur <= chr.ranges[i+1] { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + // try to match in the list of Unicode classes + for _, cl := range chr.classes { + if unicode.Is(cl, cur) { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + if chr.inverted { + p.read() + return p.sliceFrom(start), true + } + return nil, false +} + +func (p *parser) parseChoiceExpr(ch *choiceExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseChoiceExpr")) + } + + for _, alt := range ch.alternatives { + p.pushV() + val, ok := p.parseExpr(alt) + p.popV() + if ok { + return val, ok + } + } + return nil, false +} + +func (p *parser) parseLabeledExpr(lab *labeledExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseLabeledExpr")) + } + + p.pushV() + val, ok := p.parseExpr(lab.expr) + p.popV() + if ok && lab.label != "" { + m := p.vstack[len(p.vstack)-1] + m[lab.label] = val + } + return val, ok +} + +func (p *parser) parseLitMatcher(lit *litMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseLitMatcher")) + } + + start := p.pt + for _, want := range lit.val { + cur := p.pt.rn + if lit.ignoreCase { + cur = unicode.ToLower(cur) + } + if cur != want { + p.restore(start) + return nil, false + } + p.read() + } + return p.sliceFrom(start), true +} + +func (p *parser) parseNotCodeExpr(not *notCodeExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseNotCodeExpr")) + } + + ok, err := not.run(p) + if err != nil { + p.addErr(err) + } + return nil, !ok +} + +func (p *parser) parseNotExpr(not *notExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseNotExpr")) + } + + pt := p.pt + p.pushV() + _, ok := p.parseExpr(not.expr) + p.popV() + p.restore(pt) + return nil, !ok +} + +func (p *parser) parseOneOrMoreExpr(expr *oneOrMoreExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseOneOrMoreExpr")) + } + + var vals []interface{} + + for { + p.pushV() + val, ok := p.parseExpr(expr.expr) + p.popV() + if !ok { + if len(vals) == 0 { + // did not match once, no match + return nil, false + } + return vals, true + } + vals = append(vals, val) + } +} + +func (p *parser) parseRuleRefExpr(ref *ruleRefExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseRuleRefExpr " + ref.name)) + } + + if ref.name == "" { + panic(fmt.Sprintf("%s: invalid rule: missing name", ref.pos)) + } + + rule := p.rules[ref.name] + if rule == nil { + p.addErr(fmt.Errorf("undefined rule: %s", ref.name)) + return nil, false + } + return p.parseRule(rule) +} + +func (p *parser) parseSeqExpr(seq *seqExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseSeqExpr")) + } + + var vals []interface{} + + pt := p.pt + for _, expr := range seq.exprs { + val, ok := p.parseExpr(expr) + if !ok { + p.restore(pt) + return nil, false + } + vals = append(vals, val) + } + return vals, true +} + +func (p *parser) parseZeroOrMoreExpr(expr *zeroOrMoreExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseZeroOrMoreExpr")) + } + + var vals []interface{} + + for { + p.pushV() + val, ok := p.parseExpr(expr.expr) + p.popV() + if !ok { + return vals, true + } + vals = append(vals, val) + } +} + +func (p *parser) parseZeroOrOneExpr(expr *zeroOrOneExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseZeroOrOneExpr")) + } + + p.pushV() + val, _ := p.parseExpr(expr.expr) + p.popV() + // whether it matched or not, consider it a match + return val, true +} + +func rangeTable(class string) *unicode.RangeTable { + if rt, ok := unicode.Categories[class]; ok { + return rt + } + if rt, ok := unicode.Properties[class]; ok { + return rt + } + if rt, ok := unicode.Scripts[class]; ok { + return rt + } + + // cannot happen + panic(fmt.Sprintf("invalid Unicode class: %s", class)) +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/test/issue_1/issue_1.peg b/vendor/github.com/PuerkitoBio/pigeon/test/issue_1/issue_1.peg new file mode 100644 index 0000000000..803d08a32e --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/test/issue_1/issue_1.peg @@ -0,0 +1,16 @@ +{ +package main + +func main() { + ast, err := Parse("STDIN", []byte("foo")) + if err != nil { + fmt.Printf("error: %s\n", err) + return + } + fmt.Printf("%+v\n", ast) +} +} + +TableRef <- database:(ID '.')? table:ID { return fmt.Sprintf("%v.%s", database, table), nil } +ID <- [a-z]+ { return c.text, nil } + diff --git a/vendor/github.com/PuerkitoBio/pigeon/test/issue_1/issue_1_test.go b/vendor/github.com/PuerkitoBio/pigeon/test/issue_1/issue_1_test.go new file mode 100644 index 0000000000..f2310e8d2f --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/test/issue_1/issue_1_test.go @@ -0,0 +1,38 @@ +package main + +import ( + "reflect" + "testing" +) + +func TestRunIssue1(t *testing.T) { + got, err := Parse("", []byte("foo")) + if err != nil { + t.Fatal(err) + } + want := ".foo" + gots := got.(string) + if gots != want { + t.Errorf("want %q, got %q", want, gots) + } +} + +func TestIssue1(t *testing.T) { + methods := map[string][]string{ + "onTableRef1": {"database", "table"}, + "onID1": {}, + } + + typ := reflect.TypeOf(¤t{}) + for nm, args := range methods { + meth, ok := typ.MethodByName(nm) + if !ok { + t.Errorf("want *current to have method %s", nm) + continue + } + if n := meth.Func.Type().NumIn(); n != len(args)+1 { + t.Errorf("%q: want %d arguments, got %d", nm, len(args)+1, n) + continue + } + } +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/test/linear/linear.go b/vendor/github.com/PuerkitoBio/pigeon/test/linear/linear.go new file mode 100644 index 0000000000..6e03f882e2 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/test/linear/linear.go @@ -0,0 +1,1058 @@ +package main + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "strings" + "unicode" + "unicode/utf8" +) + +func main() { +} + +var g = &grammar{ + rules: []*rule{ + { + name: "File", + pos: position{line: 10, col: 1, offset: 102}, + expr: &seqExpr{ + pos: position{line: 10, col: 8, offset: 111}, + exprs: []interface{}{ + &choiceExpr{ + pos: position{line: 10, col: 10, offset: 113}, + alternatives: []interface{}{ + &seqExpr{ + pos: position{line: 10, col: 10, offset: 113}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 10, col: 10, offset: 113}, + name: "L", + }, + &zeroOrOneExpr{ + pos: position{line: 10, col: 12, offset: 115}, + expr: &ruleRefExpr{ + pos: position{line: 10, col: 12, offset: 115}, + name: "S", + }, + }, + }, + }, + &seqExpr{ + pos: position{line: 10, col: 17, offset: 120}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 10, col: 17, offset: 120}, + name: "L", + }, + &zeroOrOneExpr{ + pos: position{line: 10, col: 19, offset: 122}, + expr: &ruleRefExpr{ + pos: position{line: 10, col: 19, offset: 122}, + name: "N", + }, + }, + }, + }, + &seqExpr{ + pos: position{line: 10, col: 24, offset: 127}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 10, col: 24, offset: 127}, + name: "N", + }, + &zeroOrOneExpr{ + pos: position{line: 10, col: 26, offset: 129}, + expr: &ruleRefExpr{ + pos: position{line: 10, col: 26, offset: 129}, + name: "L", + }, + }, + }, + }, + &seqExpr{ + pos: position{line: 10, col: 31, offset: 134}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 10, col: 31, offset: 134}, + name: "N", + }, + &zeroOrOneExpr{ + pos: position{line: 10, col: 33, offset: 136}, + expr: &ruleRefExpr{ + pos: position{line: 10, col: 33, offset: 136}, + name: "S", + }, + }, + }, + }, + &seqExpr{ + pos: position{line: 10, col: 38, offset: 141}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 10, col: 38, offset: 141}, + name: "S", + }, + &zeroOrOneExpr{ + pos: position{line: 10, col: 40, offset: 143}, + expr: &ruleRefExpr{ + pos: position{line: 10, col: 40, offset: 143}, + name: "L", + }, + }, + }, + }, + &seqExpr{ + pos: position{line: 10, col: 45, offset: 148}, + exprs: []interface{}{ + &ruleRefExpr{ + pos: position{line: 10, col: 45, offset: 148}, + name: "S", + }, + &zeroOrOneExpr{ + pos: position{line: 10, col: 47, offset: 150}, + expr: &ruleRefExpr{ + pos: position{line: 10, col: 47, offset: 150}, + name: "N", + }, + }, + }, + }, + }, + }, + &zeroOrMoreExpr{ + pos: position{line: 10, col: 52, offset: 155}, + expr: &ruleRefExpr{ + pos: position{line: 10, col: 52, offset: 155}, + name: "File", + }, + }, + &ruleRefExpr{ + pos: position{line: 10, col: 58, offset: 161}, + name: "EOF", + }, + }, + }, + }, + { + name: "L", + pos: position{line: 11, col: 1, offset: 165}, + expr: &oneOrMoreExpr{ + pos: position{line: 11, col: 5, offset: 171}, + expr: &charClassMatcher{ + pos: position{line: 11, col: 5, offset: 171}, + val: "[a-z]i", + ranges: []rune{'a', 'z'}, + ignoreCase: true, + inverted: false, + }, + }, + }, + { + name: "N", + pos: position{line: 12, col: 1, offset: 179}, + expr: &oneOrMoreExpr{ + pos: position{line: 12, col: 5, offset: 185}, + expr: &charClassMatcher{ + pos: position{line: 12, col: 5, offset: 185}, + val: "[0-9]", + ranges: []rune{'0', '9'}, + ignoreCase: false, + inverted: false, + }, + }, + }, + { + name: "S", + pos: position{line: 13, col: 1, offset: 192}, + expr: &oneOrMoreExpr{ + pos: position{line: 13, col: 5, offset: 198}, + expr: &charClassMatcher{ + pos: position{line: 13, col: 5, offset: 198}, + val: "[/+=]", + chars: []rune{'/', '+', '='}, + ignoreCase: false, + inverted: false, + }, + }, + }, + { + name: "EOF", + pos: position{line: 14, col: 1, offset: 205}, + expr: ¬Expr{ + pos: position{line: 14, col: 7, offset: 213}, + expr: &anyMatcher{ + line: 14, col: 8, offset: 214, + }, + }, + }, + }, +} + +var ( + // errNoRule is returned when the grammar to parse has no rule. + errNoRule = errors.New("grammar has no rule") + + // errInvalidEncoding is returned when the source is not properly + // utf8-encoded. + errInvalidEncoding = errors.New("invalid encoding") + + // errNoMatch is returned if no match could be found. + errNoMatch = errors.New("no match found") +) + +// Option is a function that can set an option on the parser. It returns +// the previous setting as an Option. +type Option func(*parser) Option + +// Debug creates an Option to set the debug flag to b. When set to true, +// debugging information is printed to stdout while parsing. +// +// The default is false. +func Debug(b bool) Option { + return func(p *parser) Option { + old := p.debug + p.debug = b + return Debug(old) + } +} + +// Memoize creates an Option to set the memoize flag to b. When set to true, +// the parser will cache all results so each expression is evaluated only +// once. This guarantees linear parsing time even for pathological cases, +// at the expense of more memory and slower times for typical cases. +// +// The default is false. +func Memoize(b bool) Option { + return func(p *parser) Option { + old := p.memoize + p.memoize = b + return Memoize(old) + } +} + +// Recover creates an Option to set the recover flag to b. When set to +// true, this causes the parser to recover from panics and convert it +// to an error. Setting it to false can be useful while debugging to +// access the full stack trace. +// +// The default is true. +func Recover(b bool) Option { + return func(p *parser) Option { + old := p.recover + p.recover = b + return Recover(old) + } +} + +// ParseFile parses the file identified by filename. +func ParseFile(filename string, opts ...Option) (interface{}, error) { + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + return ParseReader(filename, f, opts...) +} + +// ParseReader parses the data from r using filename as information in the +// error messages. +func ParseReader(filename string, r io.Reader, opts ...Option) (interface{}, error) { + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + + return Parse(filename, b, opts...) +} + +// Parse parses the data from b using filename as information in the +// error messages. +func Parse(filename string, b []byte, opts ...Option) (interface{}, error) { + return newParser(filename, b, opts...).parse(g) +} + +// position records a position in the text. +type position struct { + line, col, offset int +} + +func (p position) String() string { + return fmt.Sprintf("%d:%d [%d]", p.line, p.col, p.offset) +} + +// savepoint stores all state required to go back to this point in the +// parser. +type savepoint struct { + position + rn rune + w int +} + +type current struct { + pos position // start position of the match + text []byte // raw text of the match +} + +// the AST types... + +type grammar struct { + pos position + rules []*rule +} + +type rule struct { + pos position + name string + displayName string + expr interface{} +} + +type choiceExpr struct { + pos position + alternatives []interface{} +} + +type actionExpr struct { + pos position + expr interface{} + run func(*parser) (interface{}, error) +} + +type seqExpr struct { + pos position + exprs []interface{} +} + +type labeledExpr struct { + pos position + label string + expr interface{} +} + +type expr struct { + pos position + expr interface{} +} + +type andExpr expr +type notExpr expr +type zeroOrOneExpr expr +type zeroOrMoreExpr expr +type oneOrMoreExpr expr + +type ruleRefExpr struct { + pos position + name string +} + +type andCodeExpr struct { + pos position + run func(*parser) (bool, error) +} + +type notCodeExpr struct { + pos position + run func(*parser) (bool, error) +} + +type litMatcher struct { + pos position + val string + ignoreCase bool +} + +type charClassMatcher struct { + pos position + val string + chars []rune + ranges []rune + classes []*unicode.RangeTable + ignoreCase bool + inverted bool +} + +type anyMatcher position + +// errList cumulates the errors found by the parser. +type errList []error + +func (e *errList) add(err error) { + *e = append(*e, err) +} + +func (e errList) err() error { + if len(e) == 0 { + return nil + } + e.dedupe() + return e +} + +func (e *errList) dedupe() { + var cleaned []error + set := make(map[string]bool) + for _, err := range *e { + if msg := err.Error(); !set[msg] { + set[msg] = true + cleaned = append(cleaned, err) + } + } + *e = cleaned +} + +func (e errList) Error() string { + switch len(e) { + case 0: + return "" + case 1: + return e[0].Error() + default: + var buf bytes.Buffer + + for i, err := range e { + if i > 0 { + buf.WriteRune('\n') + } + buf.WriteString(err.Error()) + } + return buf.String() + } +} + +// parserError wraps an error with a prefix indicating the rule in which +// the error occurred. The original error is stored in the Inner field. +type parserError struct { + Inner error + pos position + prefix string +} + +// Error returns the error message. +func (p *parserError) Error() string { + return p.prefix + ": " + p.Inner.Error() +} + +// newParser creates a parser with the specified input source and options. +func newParser(filename string, b []byte, opts ...Option) *parser { + p := &parser{ + filename: filename, + errs: new(errList), + data: b, + pt: savepoint{position: position{line: 1}}, + recover: true, + } + p.setOptions(opts) + return p +} + +// setOptions applies the options to the parser. +func (p *parser) setOptions(opts []Option) { + for _, opt := range opts { + opt(p) + } +} + +type resultTuple struct { + v interface{} + b bool + end savepoint +} + +type parser struct { + filename string + pt savepoint + cur current + + data []byte + errs *errList + + recover bool + debug bool + depth int + + memoize bool + // memoization table for the packrat algorithm: + // map[offset in source] map[expression or rule] {value, match} + memo map[int]map[interface{}]resultTuple + + // rules table, maps the rule identifier to the rule node + rules map[string]*rule + // variables stack, map of label to value + vstack []map[string]interface{} + // rule stack, allows identification of the current rule in errors + rstack []*rule + + // stats + exprCnt int +} + +// push a variable set on the vstack. +func (p *parser) pushV() { + if cap(p.vstack) == len(p.vstack) { + // create new empty slot in the stack + p.vstack = append(p.vstack, nil) + } else { + // slice to 1 more + p.vstack = p.vstack[:len(p.vstack)+1] + } + + // get the last args set + m := p.vstack[len(p.vstack)-1] + if m != nil && len(m) == 0 { + // empty map, all good + return + } + + m = make(map[string]interface{}) + p.vstack[len(p.vstack)-1] = m +} + +// pop a variable set from the vstack. +func (p *parser) popV() { + // if the map is not empty, clear it + m := p.vstack[len(p.vstack)-1] + if len(m) > 0 { + // GC that map + p.vstack[len(p.vstack)-1] = nil + } + p.vstack = p.vstack[:len(p.vstack)-1] +} + +func (p *parser) print(prefix, s string) string { + if !p.debug { + return s + } + + fmt.Printf("%s %d:%d:%d: %s [%#U]\n", + prefix, p.pt.line, p.pt.col, p.pt.offset, s, p.pt.rn) + return s +} + +func (p *parser) in(s string) string { + p.depth++ + return p.print(strings.Repeat(" ", p.depth)+">", s) +} + +func (p *parser) out(s string) string { + p.depth-- + return p.print(strings.Repeat(" ", p.depth)+"<", s) +} + +func (p *parser) addErr(err error) { + p.addErrAt(err, p.pt.position) +} + +func (p *parser) addErrAt(err error, pos position) { + var buf bytes.Buffer + if p.filename != "" { + buf.WriteString(p.filename) + } + if buf.Len() > 0 { + buf.WriteString(":") + } + buf.WriteString(fmt.Sprintf("%d:%d (%d)", pos.line, pos.col, pos.offset)) + if len(p.rstack) > 0 { + if buf.Len() > 0 { + buf.WriteString(": ") + } + rule := p.rstack[len(p.rstack)-1] + if rule.displayName != "" { + buf.WriteString("rule " + rule.displayName) + } else { + buf.WriteString("rule " + rule.name) + } + } + pe := &parserError{Inner: err, prefix: buf.String()} + p.errs.add(pe) +} + +// read advances the parser to the next rune. +func (p *parser) read() { + p.pt.offset += p.pt.w + rn, n := utf8.DecodeRune(p.data[p.pt.offset:]) + p.pt.rn = rn + p.pt.w = n + p.pt.col++ + if rn == '\n' { + p.pt.line++ + p.pt.col = 0 + } + + if rn == utf8.RuneError { + if n > 0 { + p.addErr(errInvalidEncoding) + } + } +} + +// restore parser position to the savepoint pt. +func (p *parser) restore(pt savepoint) { + if p.debug { + defer p.out(p.in("restore")) + } + if pt.offset == p.pt.offset { + return + } + p.pt = pt +} + +// get the slice of bytes from the savepoint start to the current position. +func (p *parser) sliceFrom(start savepoint) []byte { + return p.data[start.position.offset:p.pt.position.offset] +} + +func (p *parser) getMemoized(node interface{}) (resultTuple, bool) { + if len(p.memo) == 0 { + return resultTuple{}, false + } + m := p.memo[p.pt.offset] + if len(m) == 0 { + return resultTuple{}, false + } + res, ok := m[node] + return res, ok +} + +func (p *parser) setMemoized(pt savepoint, node interface{}, tuple resultTuple) { + if p.memo == nil { + p.memo = make(map[int]map[interface{}]resultTuple) + } + m := p.memo[pt.offset] + if m == nil { + m = make(map[interface{}]resultTuple) + p.memo[pt.offset] = m + } + m[node] = tuple +} + +func (p *parser) buildRulesTable(g *grammar) { + p.rules = make(map[string]*rule, len(g.rules)) + for _, r := range g.rules { + p.rules[r.name] = r + } +} + +func (p *parser) parse(g *grammar) (val interface{}, err error) { + if len(g.rules) == 0 { + p.addErr(errNoRule) + return nil, p.errs.err() + } + + // TODO : not super critical but this could be generated + p.buildRulesTable(g) + + if p.recover { + // panic can be used in action code to stop parsing immediately + // and return the panic as an error. + defer func() { + if e := recover(); e != nil { + if p.debug { + defer p.out(p.in("panic handler")) + } + val = nil + switch e := e.(type) { + case error: + p.addErr(e) + default: + p.addErr(fmt.Errorf("%v", e)) + } + err = p.errs.err() + } + }() + } + + // start rule is rule [0] + p.read() // advance to first rune + val, ok := p.parseRule(g.rules[0]) + if !ok { + if len(*p.errs) == 0 { + // make sure this doesn't go out silently + p.addErr(errNoMatch) + } + return nil, p.errs.err() + } + return val, p.errs.err() +} + +func (p *parser) parseRule(rule *rule) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseRule " + rule.name)) + } + + if p.memoize { + res, ok := p.getMemoized(rule) + if ok { + p.restore(res.end) + return res.v, res.b + } + } + + start := p.pt + p.rstack = append(p.rstack, rule) + p.pushV() + val, ok := p.parseExpr(rule.expr) + p.popV() + p.rstack = p.rstack[:len(p.rstack)-1] + if ok && p.debug { + p.print(strings.Repeat(" ", p.depth)+"MATCH", string(p.sliceFrom(start))) + } + + if p.memoize { + p.setMemoized(start, rule, resultTuple{val, ok, p.pt}) + } + return val, ok +} + +func (p *parser) parseExpr(expr interface{}) (interface{}, bool) { + var pt savepoint + var ok bool + + if p.memoize { + res, ok := p.getMemoized(expr) + if ok { + p.restore(res.end) + return res.v, res.b + } + pt = p.pt + } + + p.exprCnt++ + var val interface{} + switch expr := expr.(type) { + case *actionExpr: + val, ok = p.parseActionExpr(expr) + case *andCodeExpr: + val, ok = p.parseAndCodeExpr(expr) + case *andExpr: + val, ok = p.parseAndExpr(expr) + case *anyMatcher: + val, ok = p.parseAnyMatcher(expr) + case *charClassMatcher: + val, ok = p.parseCharClassMatcher(expr) + case *choiceExpr: + val, ok = p.parseChoiceExpr(expr) + case *labeledExpr: + val, ok = p.parseLabeledExpr(expr) + case *litMatcher: + val, ok = p.parseLitMatcher(expr) + case *notCodeExpr: + val, ok = p.parseNotCodeExpr(expr) + case *notExpr: + val, ok = p.parseNotExpr(expr) + case *oneOrMoreExpr: + val, ok = p.parseOneOrMoreExpr(expr) + case *ruleRefExpr: + val, ok = p.parseRuleRefExpr(expr) + case *seqExpr: + val, ok = p.parseSeqExpr(expr) + case *zeroOrMoreExpr: + val, ok = p.parseZeroOrMoreExpr(expr) + case *zeroOrOneExpr: + val, ok = p.parseZeroOrOneExpr(expr) + default: + panic(fmt.Sprintf("unknown expression type %T", expr)) + } + if p.memoize { + p.setMemoized(pt, expr, resultTuple{val, ok, p.pt}) + } + return val, ok +} + +func (p *parser) parseActionExpr(act *actionExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseActionExpr")) + } + + start := p.pt + val, ok := p.parseExpr(act.expr) + if ok { + p.cur.pos = start.position + p.cur.text = p.sliceFrom(start) + actVal, err := act.run(p) + if err != nil { + p.addErrAt(err, start.position) + } + val = actVal + } + if ok && p.debug { + p.print(strings.Repeat(" ", p.depth)+"MATCH", string(p.sliceFrom(start))) + } + return val, ok +} + +func (p *parser) parseAndCodeExpr(and *andCodeExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAndCodeExpr")) + } + + ok, err := and.run(p) + if err != nil { + p.addErr(err) + } + return nil, ok +} + +func (p *parser) parseAndExpr(and *andExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAndExpr")) + } + + pt := p.pt + p.pushV() + _, ok := p.parseExpr(and.expr) + p.popV() + p.restore(pt) + return nil, ok +} + +func (p *parser) parseAnyMatcher(any *anyMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAnyMatcher")) + } + + if p.pt.rn != utf8.RuneError { + start := p.pt + p.read() + return p.sliceFrom(start), true + } + return nil, false +} + +func (p *parser) parseCharClassMatcher(chr *charClassMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseCharClassMatcher")) + } + + cur := p.pt.rn + // can't match EOF + if cur == utf8.RuneError { + return nil, false + } + start := p.pt + if chr.ignoreCase { + cur = unicode.ToLower(cur) + } + + // try to match in the list of available chars + for _, rn := range chr.chars { + if rn == cur { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + // try to match in the list of ranges + for i := 0; i < len(chr.ranges); i += 2 { + if cur >= chr.ranges[i] && cur <= chr.ranges[i+1] { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + // try to match in the list of Unicode classes + for _, cl := range chr.classes { + if unicode.Is(cl, cur) { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + if chr.inverted { + p.read() + return p.sliceFrom(start), true + } + return nil, false +} + +func (p *parser) parseChoiceExpr(ch *choiceExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseChoiceExpr")) + } + + for _, alt := range ch.alternatives { + p.pushV() + val, ok := p.parseExpr(alt) + p.popV() + if ok { + return val, ok + } + } + return nil, false +} + +func (p *parser) parseLabeledExpr(lab *labeledExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseLabeledExpr")) + } + + p.pushV() + val, ok := p.parseExpr(lab.expr) + p.popV() + if ok && lab.label != "" { + m := p.vstack[len(p.vstack)-1] + m[lab.label] = val + } + return val, ok +} + +func (p *parser) parseLitMatcher(lit *litMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseLitMatcher")) + } + + start := p.pt + for _, want := range lit.val { + cur := p.pt.rn + if lit.ignoreCase { + cur = unicode.ToLower(cur) + } + if cur != want { + p.restore(start) + return nil, false + } + p.read() + } + return p.sliceFrom(start), true +} + +func (p *parser) parseNotCodeExpr(not *notCodeExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseNotCodeExpr")) + } + + ok, err := not.run(p) + if err != nil { + p.addErr(err) + } + return nil, !ok +} + +func (p *parser) parseNotExpr(not *notExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseNotExpr")) + } + + pt := p.pt + p.pushV() + _, ok := p.parseExpr(not.expr) + p.popV() + p.restore(pt) + return nil, !ok +} + +func (p *parser) parseOneOrMoreExpr(expr *oneOrMoreExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseOneOrMoreExpr")) + } + + var vals []interface{} + + for { + p.pushV() + val, ok := p.parseExpr(expr.expr) + p.popV() + if !ok { + if len(vals) == 0 { + // did not match once, no match + return nil, false + } + return vals, true + } + vals = append(vals, val) + } +} + +func (p *parser) parseRuleRefExpr(ref *ruleRefExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseRuleRefExpr " + ref.name)) + } + + if ref.name == "" { + panic(fmt.Sprintf("%s: invalid rule: missing name", ref.pos)) + } + + rule := p.rules[ref.name] + if rule == nil { + p.addErr(fmt.Errorf("undefined rule: %s", ref.name)) + return nil, false + } + return p.parseRule(rule) +} + +func (p *parser) parseSeqExpr(seq *seqExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseSeqExpr")) + } + + var vals []interface{} + + pt := p.pt + for _, expr := range seq.exprs { + val, ok := p.parseExpr(expr) + if !ok { + p.restore(pt) + return nil, false + } + vals = append(vals, val) + } + return vals, true +} + +func (p *parser) parseZeroOrMoreExpr(expr *zeroOrMoreExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseZeroOrMoreExpr")) + } + + var vals []interface{} + + for { + p.pushV() + val, ok := p.parseExpr(expr.expr) + p.popV() + if !ok { + return vals, true + } + vals = append(vals, val) + } +} + +func (p *parser) parseZeroOrOneExpr(expr *zeroOrOneExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseZeroOrOneExpr")) + } + + p.pushV() + val, _ := p.parseExpr(expr.expr) + p.popV() + // whether it matched or not, consider it a match + return val, true +} + +func rangeTable(class string) *unicode.RangeTable { + if rt, ok := unicode.Categories[class]; ok { + return rt + } + if rt, ok := unicode.Properties[class]; ok { + return rt + } + if rt, ok := unicode.Scripts[class]; ok { + return rt + } + + // cannot happen + panic(fmt.Sprintf("invalid Unicode class: %s", class)) +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/test/linear/linear.peg b/vendor/github.com/PuerkitoBio/pigeon/test/linear/linear.peg new file mode 100644 index 0000000000..22d773243a --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/test/linear/linear.peg @@ -0,0 +1,14 @@ +{ + package main + + func main() { + } +} + +// any base64 input is good. force some backtracking. + +File ← ( L S? / L N? / N L? / N S? / S L? / S N? ) File* EOF +L ← [a-z]i+ +N ← [0-9]+ +S ← [/+=]+ +EOF ← !. diff --git a/vendor/github.com/PuerkitoBio/pigeon/test/linear/linear_test.go b/vendor/github.com/PuerkitoBio/pigeon/test/linear/linear_test.go new file mode 100644 index 0000000000..f50ba3089e --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/test/linear/linear_test.go @@ -0,0 +1,37 @@ +package main + +import ( + "bytes" + "crypto/rand" + "encoding/base64" + "io" + "testing" + "time" +) + +func TestLinearTime(t *testing.T) { + var buf bytes.Buffer + + sizes := []int64{ + 1 << 10, // 1Kb + 10 << 10, // 10Kb + 100 << 10, // 100Kb + // TODO : 1Mb overflows the stack + //1 << 20, + } + for _, sz := range sizes { + r := io.LimitReader(rand.Reader, sz) + enc := base64.NewEncoder(base64.StdEncoding, &buf) + _, err := io.Copy(enc, r) + if err != nil { + t.Fatal(err) + } + enc.Close() + + start := time.Now() + if _, err := Parse("", buf.Bytes(), Memoize(true)); err != nil { + t.Fatal(err) + } + t.Log(time.Now().Sub(start)) + } +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/test/predicates/predicates.go b/vendor/github.com/PuerkitoBio/pigeon/test/predicates/predicates.go new file mode 100644 index 0000000000..e1b16439db --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/test/predicates/predicates.go @@ -0,0 +1,1106 @@ +package predicates + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "strings" + "unicode" + "unicode/utf8" +) + +var g = &grammar{ + rules: []*rule{ + { + name: "A", + pos: position{line: 5, col: 1, offset: 24}, + expr: &choiceExpr{ + pos: position{line: 5, col: 5, offset: 30}, + alternatives: []interface{}{ + &seqExpr{ + pos: position{line: 5, col: 5, offset: 30}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 5, col: 5, offset: 30}, + label: "a", + expr: &litMatcher{ + pos: position{line: 5, col: 7, offset: 32}, + val: "a", + ignoreCase: false, + }, + }, + ¬CodeExpr{ + pos: position{line: 5, col: 11, offset: 36}, + run: (*parser).callonA5, + }, + }, + }, + &seqExpr{ + pos: position{line: 10, col: 3, offset: 98}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 10, col: 3, offset: 98}, + label: "b", + expr: &litMatcher{ + pos: position{line: 10, col: 5, offset: 100}, + val: "b", + ignoreCase: false, + }, + }, + ¬CodeExpr{ + pos: position{line: 10, col: 9, offset: 104}, + run: (*parser).callonA9, + }, + }, + }, + &seqExpr{ + pos: position{line: 15, col: 3, offset: 165}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 15, col: 3, offset: 165}, + label: "d", + expr: &litMatcher{ + pos: position{line: 15, col: 5, offset: 167}, + val: "d", + ignoreCase: false, + }, + }, + &andCodeExpr{ + pos: position{line: 15, col: 9, offset: 171}, + run: (*parser).callonA13, + }, + }, + }, + }, + }, + }, + { + name: "B", + pos: position{line: 20, col: 1, offset: 230}, + expr: &seqExpr{ + pos: position{line: 20, col: 5, offset: 236}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 20, col: 5, offset: 236}, + label: "out", + expr: &seqExpr{ + pos: position{line: 20, col: 11, offset: 242}, + exprs: []interface{}{ + &labeledExpr{ + pos: position{line: 20, col: 11, offset: 242}, + label: "inner", + expr: &seqExpr{ + pos: position{line: 20, col: 19, offset: 250}, + exprs: []interface{}{ + &charClassMatcher{ + pos: position{line: 20, col: 19, offset: 250}, + val: "[^abd]", + chars: []rune{'a', 'b', 'd'}, + ignoreCase: false, + inverted: true, + }, + &labeledExpr{ + pos: position{line: 20, col: 26, offset: 257}, + label: "innermost", + expr: &anyMatcher{ + line: 20, col: 36, offset: 267, + }, + }, + &andCodeExpr{ + pos: position{line: 20, col: 38, offset: 269}, + run: (*parser).callonB9, + }, + }, + }, + }, + &andCodeExpr{ + pos: position{line: 20, col: 60, offset: 291}, + run: (*parser).callonB10, + }, + }, + }, + }, + &andCodeExpr{ + pos: position{line: 20, col: 82, offset: 313}, + run: (*parser).callonB11, + }, + }, + }, + }, + { + name: "C", + pos: position{line: 22, col: 1, offset: 334}, + expr: &actionExpr{ + pos: position{line: 22, col: 5, offset: 340}, + run: (*parser).callonC1, + expr: &seqExpr{ + pos: position{line: 22, col: 5, offset: 340}, + exprs: []interface{}{ + &andExpr{ + pos: position{line: 22, col: 5, offset: 340}, + expr: &labeledExpr{ + pos: position{line: 22, col: 7, offset: 342}, + label: "inand", + expr: &charClassMatcher{ + pos: position{line: 22, col: 13, offset: 348}, + val: "[efg]", + chars: []rune{'e', 'f', 'g'}, + ignoreCase: false, + inverted: false, + }, + }, + }, + &labeledExpr{ + pos: position{line: 22, col: 20, offset: 355}, + label: "rest", + expr: &ruleRefExpr{ + pos: position{line: 22, col: 25, offset: 360}, + name: "hij", + }, + }, + }, + }, + }, + }, + }, +} + +func (c *current) onA5(a interface{}) (bool, error) { + fmt.Println(string(c.text)) + return true, nil +} + +func (p *parser) callonA5() (bool, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onA5(stack["a"]) +} + +func (c *current) onA9(b interface{}) (bool, error) { + fmt.Println(string(c.text)) + return true, nil +} + +func (p *parser) callonA9() (bool, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onA9(stack["b"]) +} + +func (c *current) onA13(d interface{}) (bool, error) { + fmt.Println(string(c.text)) + return true, nil +} + +func (p *parser) callonA13() (bool, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onA13(stack["d"]) +} + +func (c *current) onB9(innermost interface{}) (bool, error) { + return true, nil +} + +func (p *parser) callonB9() (bool, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onB9(stack["innermost"]) +} + +func (c *current) onB10(inner interface{}) (bool, error) { + return true, nil +} + +func (p *parser) callonB10() (bool, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onB10(stack["inner"]) +} + +func (c *current) onB11(out interface{}) (bool, error) { + return true, nil +} + +func (p *parser) callonB11() (bool, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onB11(stack["out"]) +} + +func (c *current) onC1(rest interface{}) (interface{}, error) { + return nil, nil +} + +func (p *parser) callonC1() (interface{}, error) { + stack := p.vstack[len(p.vstack)-1] + _ = stack + return p.cur.onC1(stack["rest"]) +} + +var ( + // errNoRule is returned when the grammar to parse has no rule. + errNoRule = errors.New("grammar has no rule") + + // errInvalidEncoding is returned when the source is not properly + // utf8-encoded. + errInvalidEncoding = errors.New("invalid encoding") + + // errNoMatch is returned if no match could be found. + errNoMatch = errors.New("no match found") +) + +// Option is a function that can set an option on the parser. It returns +// the previous setting as an Option. +type Option func(*parser) Option + +// Debug creates an Option to set the debug flag to b. When set to true, +// debugging information is printed to stdout while parsing. +// +// The default is false. +func Debug(b bool) Option { + return func(p *parser) Option { + old := p.debug + p.debug = b + return Debug(old) + } +} + +// Memoize creates an Option to set the memoize flag to b. When set to true, +// the parser will cache all results so each expression is evaluated only +// once. This guarantees linear parsing time even for pathological cases, +// at the expense of more memory and slower times for typical cases. +// +// The default is false. +func Memoize(b bool) Option { + return func(p *parser) Option { + old := p.memoize + p.memoize = b + return Memoize(old) + } +} + +// Recover creates an Option to set the recover flag to b. When set to +// true, this causes the parser to recover from panics and convert it +// to an error. Setting it to false can be useful while debugging to +// access the full stack trace. +// +// The default is true. +func Recover(b bool) Option { + return func(p *parser) Option { + old := p.recover + p.recover = b + return Recover(old) + } +} + +// ParseFile parses the file identified by filename. +func ParseFile(filename string, opts ...Option) (interface{}, error) { + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + return ParseReader(filename, f, opts...) +} + +// ParseReader parses the data from r using filename as information in the +// error messages. +func ParseReader(filename string, r io.Reader, opts ...Option) (interface{}, error) { + b, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + + return Parse(filename, b, opts...) +} + +// Parse parses the data from b using filename as information in the +// error messages. +func Parse(filename string, b []byte, opts ...Option) (interface{}, error) { + return newParser(filename, b, opts...).parse(g) +} + +// position records a position in the text. +type position struct { + line, col, offset int +} + +func (p position) String() string { + return fmt.Sprintf("%d:%d [%d]", p.line, p.col, p.offset) +} + +// savepoint stores all state required to go back to this point in the +// parser. +type savepoint struct { + position + rn rune + w int +} + +type current struct { + pos position // start position of the match + text []byte // raw text of the match +} + +// the AST types... + +type grammar struct { + pos position + rules []*rule +} + +type rule struct { + pos position + name string + displayName string + expr interface{} +} + +type choiceExpr struct { + pos position + alternatives []interface{} +} + +type actionExpr struct { + pos position + expr interface{} + run func(*parser) (interface{}, error) +} + +type seqExpr struct { + pos position + exprs []interface{} +} + +type labeledExpr struct { + pos position + label string + expr interface{} +} + +type expr struct { + pos position + expr interface{} +} + +type andExpr expr +type notExpr expr +type zeroOrOneExpr expr +type zeroOrMoreExpr expr +type oneOrMoreExpr expr + +type ruleRefExpr struct { + pos position + name string +} + +type andCodeExpr struct { + pos position + run func(*parser) (bool, error) +} + +type notCodeExpr struct { + pos position + run func(*parser) (bool, error) +} + +type litMatcher struct { + pos position + val string + ignoreCase bool +} + +type charClassMatcher struct { + pos position + val string + chars []rune + ranges []rune + classes []*unicode.RangeTable + ignoreCase bool + inverted bool +} + +type anyMatcher position + +// errList cumulates the errors found by the parser. +type errList []error + +func (e *errList) add(err error) { + *e = append(*e, err) +} + +func (e errList) err() error { + if len(e) == 0 { + return nil + } + e.dedupe() + return e +} + +func (e *errList) dedupe() { + var cleaned []error + set := make(map[string]bool) + for _, err := range *e { + if msg := err.Error(); !set[msg] { + set[msg] = true + cleaned = append(cleaned, err) + } + } + *e = cleaned +} + +func (e errList) Error() string { + switch len(e) { + case 0: + return "" + case 1: + return e[0].Error() + default: + var buf bytes.Buffer + + for i, err := range e { + if i > 0 { + buf.WriteRune('\n') + } + buf.WriteString(err.Error()) + } + return buf.String() + } +} + +// parserError wraps an error with a prefix indicating the rule in which +// the error occurred. The original error is stored in the Inner field. +type parserError struct { + Inner error + pos position + prefix string +} + +// Error returns the error message. +func (p *parserError) Error() string { + return p.prefix + ": " + p.Inner.Error() +} + +// newParser creates a parser with the specified input source and options. +func newParser(filename string, b []byte, opts ...Option) *parser { + p := &parser{ + filename: filename, + errs: new(errList), + data: b, + pt: savepoint{position: position{line: 1}}, + recover: true, + } + p.setOptions(opts) + return p +} + +// setOptions applies the options to the parser. +func (p *parser) setOptions(opts []Option) { + for _, opt := range opts { + opt(p) + } +} + +type resultTuple struct { + v interface{} + b bool + end savepoint +} + +type parser struct { + filename string + pt savepoint + cur current + + data []byte + errs *errList + + recover bool + debug bool + depth int + + memoize bool + // memoization table for the packrat algorithm: + // map[offset in source] map[expression or rule] {value, match} + memo map[int]map[interface{}]resultTuple + + // rules table, maps the rule identifier to the rule node + rules map[string]*rule + // variables stack, map of label to value + vstack []map[string]interface{} + // rule stack, allows identification of the current rule in errors + rstack []*rule + + // stats + exprCnt int +} + +// push a variable set on the vstack. +func (p *parser) pushV() { + if cap(p.vstack) == len(p.vstack) { + // create new empty slot in the stack + p.vstack = append(p.vstack, nil) + } else { + // slice to 1 more + p.vstack = p.vstack[:len(p.vstack)+1] + } + + // get the last args set + m := p.vstack[len(p.vstack)-1] + if m != nil && len(m) == 0 { + // empty map, all good + return + } + + m = make(map[string]interface{}) + p.vstack[len(p.vstack)-1] = m +} + +// pop a variable set from the vstack. +func (p *parser) popV() { + // if the map is not empty, clear it + m := p.vstack[len(p.vstack)-1] + if len(m) > 0 { + // GC that map + p.vstack[len(p.vstack)-1] = nil + } + p.vstack = p.vstack[:len(p.vstack)-1] +} + +func (p *parser) print(prefix, s string) string { + if !p.debug { + return s + } + + fmt.Printf("%s %d:%d:%d: %s [%#U]\n", + prefix, p.pt.line, p.pt.col, p.pt.offset, s, p.pt.rn) + return s +} + +func (p *parser) in(s string) string { + p.depth++ + return p.print(strings.Repeat(" ", p.depth)+">", s) +} + +func (p *parser) out(s string) string { + p.depth-- + return p.print(strings.Repeat(" ", p.depth)+"<", s) +} + +func (p *parser) addErr(err error) { + p.addErrAt(err, p.pt.position) +} + +func (p *parser) addErrAt(err error, pos position) { + var buf bytes.Buffer + if p.filename != "" { + buf.WriteString(p.filename) + } + if buf.Len() > 0 { + buf.WriteString(":") + } + buf.WriteString(fmt.Sprintf("%d:%d (%d)", pos.line, pos.col, pos.offset)) + if len(p.rstack) > 0 { + if buf.Len() > 0 { + buf.WriteString(": ") + } + rule := p.rstack[len(p.rstack)-1] + if rule.displayName != "" { + buf.WriteString("rule " + rule.displayName) + } else { + buf.WriteString("rule " + rule.name) + } + } + pe := &parserError{Inner: err, prefix: buf.String()} + p.errs.add(pe) +} + +// read advances the parser to the next rune. +func (p *parser) read() { + p.pt.offset += p.pt.w + rn, n := utf8.DecodeRune(p.data[p.pt.offset:]) + p.pt.rn = rn + p.pt.w = n + p.pt.col++ + if rn == '\n' { + p.pt.line++ + p.pt.col = 0 + } + + if rn == utf8.RuneError { + if n > 0 { + p.addErr(errInvalidEncoding) + } + } +} + +// restore parser position to the savepoint pt. +func (p *parser) restore(pt savepoint) { + if p.debug { + defer p.out(p.in("restore")) + } + if pt.offset == p.pt.offset { + return + } + p.pt = pt +} + +// get the slice of bytes from the savepoint start to the current position. +func (p *parser) sliceFrom(start savepoint) []byte { + return p.data[start.position.offset:p.pt.position.offset] +} + +func (p *parser) getMemoized(node interface{}) (resultTuple, bool) { + if len(p.memo) == 0 { + return resultTuple{}, false + } + m := p.memo[p.pt.offset] + if len(m) == 0 { + return resultTuple{}, false + } + res, ok := m[node] + return res, ok +} + +func (p *parser) setMemoized(pt savepoint, node interface{}, tuple resultTuple) { + if p.memo == nil { + p.memo = make(map[int]map[interface{}]resultTuple) + } + m := p.memo[pt.offset] + if m == nil { + m = make(map[interface{}]resultTuple) + p.memo[pt.offset] = m + } + m[node] = tuple +} + +func (p *parser) buildRulesTable(g *grammar) { + p.rules = make(map[string]*rule, len(g.rules)) + for _, r := range g.rules { + p.rules[r.name] = r + } +} + +func (p *parser) parse(g *grammar) (val interface{}, err error) { + if len(g.rules) == 0 { + p.addErr(errNoRule) + return nil, p.errs.err() + } + + // TODO : not super critical but this could be generated + p.buildRulesTable(g) + + if p.recover { + // panic can be used in action code to stop parsing immediately + // and return the panic as an error. + defer func() { + if e := recover(); e != nil { + if p.debug { + defer p.out(p.in("panic handler")) + } + val = nil + switch e := e.(type) { + case error: + p.addErr(e) + default: + p.addErr(fmt.Errorf("%v", e)) + } + err = p.errs.err() + } + }() + } + + // start rule is rule [0] + p.read() // advance to first rune + val, ok := p.parseRule(g.rules[0]) + if !ok { + if len(*p.errs) == 0 { + // make sure this doesn't go out silently + p.addErr(errNoMatch) + } + return nil, p.errs.err() + } + return val, p.errs.err() +} + +func (p *parser) parseRule(rule *rule) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseRule " + rule.name)) + } + + if p.memoize { + res, ok := p.getMemoized(rule) + if ok { + p.restore(res.end) + return res.v, res.b + } + } + + start := p.pt + p.rstack = append(p.rstack, rule) + p.pushV() + val, ok := p.parseExpr(rule.expr) + p.popV() + p.rstack = p.rstack[:len(p.rstack)-1] + if ok && p.debug { + p.print(strings.Repeat(" ", p.depth)+"MATCH", string(p.sliceFrom(start))) + } + + if p.memoize { + p.setMemoized(start, rule, resultTuple{val, ok, p.pt}) + } + return val, ok +} + +func (p *parser) parseExpr(expr interface{}) (interface{}, bool) { + var pt savepoint + var ok bool + + if p.memoize { + res, ok := p.getMemoized(expr) + if ok { + p.restore(res.end) + return res.v, res.b + } + pt = p.pt + } + + p.exprCnt++ + var val interface{} + switch expr := expr.(type) { + case *actionExpr: + val, ok = p.parseActionExpr(expr) + case *andCodeExpr: + val, ok = p.parseAndCodeExpr(expr) + case *andExpr: + val, ok = p.parseAndExpr(expr) + case *anyMatcher: + val, ok = p.parseAnyMatcher(expr) + case *charClassMatcher: + val, ok = p.parseCharClassMatcher(expr) + case *choiceExpr: + val, ok = p.parseChoiceExpr(expr) + case *labeledExpr: + val, ok = p.parseLabeledExpr(expr) + case *litMatcher: + val, ok = p.parseLitMatcher(expr) + case *notCodeExpr: + val, ok = p.parseNotCodeExpr(expr) + case *notExpr: + val, ok = p.parseNotExpr(expr) + case *oneOrMoreExpr: + val, ok = p.parseOneOrMoreExpr(expr) + case *ruleRefExpr: + val, ok = p.parseRuleRefExpr(expr) + case *seqExpr: + val, ok = p.parseSeqExpr(expr) + case *zeroOrMoreExpr: + val, ok = p.parseZeroOrMoreExpr(expr) + case *zeroOrOneExpr: + val, ok = p.parseZeroOrOneExpr(expr) + default: + panic(fmt.Sprintf("unknown expression type %T", expr)) + } + if p.memoize { + p.setMemoized(pt, expr, resultTuple{val, ok, p.pt}) + } + return val, ok +} + +func (p *parser) parseActionExpr(act *actionExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseActionExpr")) + } + + start := p.pt + val, ok := p.parseExpr(act.expr) + if ok { + p.cur.pos = start.position + p.cur.text = p.sliceFrom(start) + actVal, err := act.run(p) + if err != nil { + p.addErrAt(err, start.position) + } + val = actVal + } + if ok && p.debug { + p.print(strings.Repeat(" ", p.depth)+"MATCH", string(p.sliceFrom(start))) + } + return val, ok +} + +func (p *parser) parseAndCodeExpr(and *andCodeExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAndCodeExpr")) + } + + ok, err := and.run(p) + if err != nil { + p.addErr(err) + } + return nil, ok +} + +func (p *parser) parseAndExpr(and *andExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAndExpr")) + } + + pt := p.pt + p.pushV() + _, ok := p.parseExpr(and.expr) + p.popV() + p.restore(pt) + return nil, ok +} + +func (p *parser) parseAnyMatcher(any *anyMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseAnyMatcher")) + } + + if p.pt.rn != utf8.RuneError { + start := p.pt + p.read() + return p.sliceFrom(start), true + } + return nil, false +} + +func (p *parser) parseCharClassMatcher(chr *charClassMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseCharClassMatcher")) + } + + cur := p.pt.rn + // can't match EOF + if cur == utf8.RuneError { + return nil, false + } + start := p.pt + if chr.ignoreCase { + cur = unicode.ToLower(cur) + } + + // try to match in the list of available chars + for _, rn := range chr.chars { + if rn == cur { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + // try to match in the list of ranges + for i := 0; i < len(chr.ranges); i += 2 { + if cur >= chr.ranges[i] && cur <= chr.ranges[i+1] { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + // try to match in the list of Unicode classes + for _, cl := range chr.classes { + if unicode.Is(cl, cur) { + if chr.inverted { + return nil, false + } + p.read() + return p.sliceFrom(start), true + } + } + + if chr.inverted { + p.read() + return p.sliceFrom(start), true + } + return nil, false +} + +func (p *parser) parseChoiceExpr(ch *choiceExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseChoiceExpr")) + } + + for _, alt := range ch.alternatives { + p.pushV() + val, ok := p.parseExpr(alt) + p.popV() + if ok { + return val, ok + } + } + return nil, false +} + +func (p *parser) parseLabeledExpr(lab *labeledExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseLabeledExpr")) + } + + p.pushV() + val, ok := p.parseExpr(lab.expr) + p.popV() + if ok && lab.label != "" { + m := p.vstack[len(p.vstack)-1] + m[lab.label] = val + } + return val, ok +} + +func (p *parser) parseLitMatcher(lit *litMatcher) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseLitMatcher")) + } + + start := p.pt + for _, want := range lit.val { + cur := p.pt.rn + if lit.ignoreCase { + cur = unicode.ToLower(cur) + } + if cur != want { + p.restore(start) + return nil, false + } + p.read() + } + return p.sliceFrom(start), true +} + +func (p *parser) parseNotCodeExpr(not *notCodeExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseNotCodeExpr")) + } + + ok, err := not.run(p) + if err != nil { + p.addErr(err) + } + return nil, !ok +} + +func (p *parser) parseNotExpr(not *notExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseNotExpr")) + } + + pt := p.pt + p.pushV() + _, ok := p.parseExpr(not.expr) + p.popV() + p.restore(pt) + return nil, !ok +} + +func (p *parser) parseOneOrMoreExpr(expr *oneOrMoreExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseOneOrMoreExpr")) + } + + var vals []interface{} + + for { + p.pushV() + val, ok := p.parseExpr(expr.expr) + p.popV() + if !ok { + if len(vals) == 0 { + // did not match once, no match + return nil, false + } + return vals, true + } + vals = append(vals, val) + } +} + +func (p *parser) parseRuleRefExpr(ref *ruleRefExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseRuleRefExpr " + ref.name)) + } + + if ref.name == "" { + panic(fmt.Sprintf("%s: invalid rule: missing name", ref.pos)) + } + + rule := p.rules[ref.name] + if rule == nil { + p.addErr(fmt.Errorf("undefined rule: %s", ref.name)) + return nil, false + } + return p.parseRule(rule) +} + +func (p *parser) parseSeqExpr(seq *seqExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseSeqExpr")) + } + + var vals []interface{} + + pt := p.pt + for _, expr := range seq.exprs { + val, ok := p.parseExpr(expr) + if !ok { + p.restore(pt) + return nil, false + } + vals = append(vals, val) + } + return vals, true +} + +func (p *parser) parseZeroOrMoreExpr(expr *zeroOrMoreExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseZeroOrMoreExpr")) + } + + var vals []interface{} + + for { + p.pushV() + val, ok := p.parseExpr(expr.expr) + p.popV() + if !ok { + return vals, true + } + vals = append(vals, val) + } +} + +func (p *parser) parseZeroOrOneExpr(expr *zeroOrOneExpr) (interface{}, bool) { + if p.debug { + defer p.out(p.in("parseZeroOrOneExpr")) + } + + p.pushV() + val, _ := p.parseExpr(expr.expr) + p.popV() + // whether it matched or not, consider it a match + return val, true +} + +func rangeTable(class string) *unicode.RangeTable { + if rt, ok := unicode.Categories[class]; ok { + return rt + } + if rt, ok := unicode.Properties[class]; ok { + return rt + } + if rt, ok := unicode.Scripts[class]; ok { + return rt + } + + // cannot happen + panic(fmt.Sprintf("invalid Unicode class: %s", class)) +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/test/predicates/predicates.peg b/vendor/github.com/PuerkitoBio/pigeon/test/predicates/predicates.peg new file mode 100644 index 0000000000..90ecc59592 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/test/predicates/predicates.peg @@ -0,0 +1,24 @@ +{ +package predicates +} + +A ← a:'a' !{ + fmt.Println(string(c.text)) + return true, nil +} + +/ b:'b' !{ + fmt.Println(string(c.text)) + return true, nil +} + +/ d:'d' &{ + fmt.Println(string(c.text)) + return true, nil +} + +B ← out:( inner:( [^abd] innermost:. &{return true, nil} ) &{return true, nil} ) &{return true, nil} + +C ← &(inand:[efg]) rest:hij { + return nil, nil +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/test/predicates/predicates_test.go b/vendor/github.com/PuerkitoBio/pigeon/test/predicates/predicates_test.go new file mode 100644 index 0000000000..e2607205a3 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/test/predicates/predicates_test.go @@ -0,0 +1,31 @@ +package predicates + +import ( + "reflect" + "testing" +) + +func TestPredicatesArgs(t *testing.T) { + methods := map[string][]string{ + "onA5": {"a"}, + "onA9": {"b"}, + "onA13": {"d"}, + "onB9": {"innermost"}, + "onB10": {"inner"}, + "onB11": {"out"}, + "onC1": {"rest"}, + } + + typ := reflect.TypeOf(¤t{}) + for nm, args := range methods { + meth, ok := typ.MethodByName(nm) + if !ok { + t.Errorf("want *current to have method %s", nm) + continue + } + if n := meth.Func.Type().NumIn(); n != len(args)+1 { + t.Errorf("%q: want %d arguments, got %d", nm, len(args)+1, n) + continue + } + } +} diff --git a/vendor/github.com/PuerkitoBio/pigeon/unicode_classes.go b/vendor/github.com/PuerkitoBio/pigeon/unicode_classes.go new file mode 100644 index 0000000000..3600156296 --- /dev/null +++ b/vendor/github.com/PuerkitoBio/pigeon/unicode_classes.go @@ -0,0 +1,200 @@ +// This file is generated by the misc/cmd/unicode-classes tool. +// Do not edit. + +package main + +var unicodeClasses = map[string]bool{ + "ASCII_Hex_Digit": true, + "Arabic": true, + "Armenian": true, + "Avestan": true, + "Balinese": true, + "Bamum": true, + "Bassa_Vah": true, + "Batak": true, + "Bengali": true, + "Bidi_Control": true, + "Bopomofo": true, + "Brahmi": true, + "Braille": true, + "Buginese": true, + "Buhid": true, + "C": true, + "Canadian_Aboriginal": true, + "Carian": true, + "Caucasian_Albanian": true, + "Cc": true, + "Cf": true, + "Chakma": true, + "Cham": true, + "Cherokee": true, + "Co": true, + "Common": true, + "Coptic": true, + "Cs": true, + "Cuneiform": true, + "Cypriot": true, + "Cyrillic": true, + "Dash": true, + "Deprecated": true, + "Deseret": true, + "Devanagari": true, + "Diacritic": true, + "Duployan": true, + "Egyptian_Hieroglyphs": true, + "Elbasan": true, + "Ethiopic": true, + "Extender": true, + "Georgian": true, + "Glagolitic": true, + "Gothic": true, + "Grantha": true, + "Greek": true, + "Gujarati": true, + "Gurmukhi": true, + "Han": true, + "Hangul": true, + "Hanunoo": true, + "Hebrew": true, + "Hex_Digit": true, + "Hiragana": true, + "Hyphen": true, + "IDS_Binary_Operator": true, + "IDS_Trinary_Operator": true, + "Ideographic": true, + "Imperial_Aramaic": true, + "Inherited": true, + "Inscriptional_Pahlavi": true, + "Inscriptional_Parthian": true, + "Javanese": true, + "Join_Control": true, + "Kaithi": true, + "Kannada": true, + "Katakana": true, + "Kayah_Li": true, + "Kharoshthi": true, + "Khmer": true, + "Khojki": true, + "Khudawadi": true, + "L": true, + "Lao": true, + "Latin": true, + "Lepcha": true, + "Limbu": true, + "Linear_A": true, + "Linear_B": true, + "Lisu": true, + "Ll": true, + "Lm": true, + "Lo": true, + "Logical_Order_Exception": true, + "Lt": true, + "Lu": true, + "Lycian": true, + "Lydian": true, + "M": true, + "Mahajani": true, + "Malayalam": true, + "Mandaic": true, + "Manichaean": true, + "Mc": true, + "Me": true, + "Meetei_Mayek": true, + "Mende_Kikakui": true, + "Meroitic_Cursive": true, + "Meroitic_Hieroglyphs": true, + "Miao": true, + "Mn": true, + "Modi": true, + "Mongolian": true, + "Mro": true, + "Myanmar": true, + "N": true, + "Nabataean": true, + "Nd": true, + "New_Tai_Lue": true, + "Nko": true, + "Nl": true, + "No": true, + "Noncharacter_Code_Point": true, + "Ogham": true, + "Ol_Chiki": true, + "Old_Italic": true, + "Old_North_Arabian": true, + "Old_Permic": true, + "Old_Persian": true, + "Old_South_Arabian": true, + "Old_Turkic": true, + "Oriya": true, + "Osmanya": true, + "Other_Alphabetic": true, + "Other_Default_Ignorable_Code_Point": true, + "Other_Grapheme_Extend": true, + "Other_ID_Continue": true, + "Other_ID_Start": true, + "Other_Lowercase": true, + "Other_Math": true, + "Other_Uppercase": true, + "P": true, + "Pahawh_Hmong": true, + "Palmyrene": true, + "Pattern_Syntax": true, + "Pattern_White_Space": true, + "Pau_Cin_Hau": true, + "Pc": true, + "Pd": true, + "Pe": true, + "Pf": true, + "Phags_Pa": true, + "Phoenician": true, + "Pi": true, + "Po": true, + "Ps": true, + "Psalter_Pahlavi": true, + "Quotation_Mark": true, + "Radical": true, + "Rejang": true, + "Runic": true, + "S": true, + "STerm": true, + "Samaritan": true, + "Saurashtra": true, + "Sc": true, + "Sharada": true, + "Shavian": true, + "Siddham": true, + "Sinhala": true, + "Sk": true, + "Sm": true, + "So": true, + "Soft_Dotted": true, + "Sora_Sompeng": true, + "Sundanese": true, + "Syloti_Nagri": true, + "Syriac": true, + "Tagalog": true, + "Tagbanwa": true, + "Tai_Le": true, + "Tai_Tham": true, + "Tai_Viet": true, + "Takri": true, + "Tamil": true, + "Telugu": true, + "Terminal_Punctuation": true, + "Thaana": true, + "Thai": true, + "Tibetan": true, + "Tifinagh": true, + "Tirhuta": true, + "Ugaritic": true, + "Unified_Ideograph": true, + "Vai": true, + "Variation_Selector": true, + "Warang_Citi": true, + "White_Space": true, + "Yi": true, + "Z": true, + "Zl": true, + "Zp": true, + "Zs": true, +} diff --git a/vendor/github.com/armon/consul-api/.gitignore b/vendor/github.com/armon/consul-api/.gitignore new file mode 100644 index 0000000000..836562412f --- /dev/null +++ b/vendor/github.com/armon/consul-api/.gitignore @@ -0,0 +1,23 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test diff --git a/vendor/github.com/armon/consul-api/LICENSE b/vendor/github.com/armon/consul-api/LICENSE new file mode 100644 index 0000000000..f0e5c79e18 --- /dev/null +++ b/vendor/github.com/armon/consul-api/LICENSE @@ -0,0 +1,362 @@ +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. "Contributor" + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. "Contributor Version" + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the terms of + a Secondary License. + +1.6. "Executable Form" + + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + + means a work that combines Covered Software with other material, in a + separate file or files, that is not Covered Software. + +1.8. "License" + + means this document. + +1.9. "Licensable" + + means having the right to grant, to the maximum extent possible, whether + at the time of the initial grant or subsequently, any and all of the + rights conveyed by this License. + +1.10. "Modifications" + + means any of the following: + + a. any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. "Patent Claims" of a Contributor + + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the License, + by the making, using, selling, offering for sale, having made, import, + or transfer of either its Contributions or its Contributor Version. + +1.12. "Secondary License" + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. "Source Code Form" + + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution + become effective for each Contribution on the date the Contributor first + distributes such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under + this License. No additional rights or licenses will be implied from the + distribution or licensing of Covered Software under this License. + Notwithstanding Section 2.1(b) above, no patent license is granted by a + Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of + its Contributions. + + This License does not grant any rights in the trademarks, service marks, + or logos of any Contributor (except as may be necessary to comply with + the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this + License (see Section 10.2) or under the terms of a Secondary License (if + permitted under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its + Contributions are its original creation(s) or it has sufficient rights to + grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under + applicable copyright doctrines of fair use, fair dealing, or other + equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under + the terms of this License. You must inform recipients that the Source + Code Form of the Covered Software is governed by the terms of this + License, and how they can obtain a copy of this License. You may not + attempt to alter or restrict the recipients' rights in the Source Code + Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter the + recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for + the Covered Software. If the Larger Work is a combination of Covered + Software with a work governed by one or more Secondary Licenses, and the + Covered Software is not Incompatible With Secondary Licenses, this + License permits You to additionally distribute such Covered Software + under the terms of such Secondary License(s), so that the recipient of + the Larger Work may, at their option, further distribute the Covered + Software under the terms of either this License or such Secondary + License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices + (including copyright notices, patent notices, disclaimers of warranty, or + limitations of liability) contained within the Source Code Form of the + Covered Software, except that You may alter any license notices to the + extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on + behalf of any Contributor. You must make it absolutely clear that any + such warranty, support, indemnity, or liability obligation is offered by + You alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, + judicial order, or regulation then You must: (a) comply with the terms of + this License to the maximum extent possible; and (b) describe the + limitations and the code they affect. Such description must be placed in a + text file included with all distributions of the Covered Software under + this License. Except to the extent prohibited by statute or regulation, + such description must be sufficiently detailed for a recipient of ordinary + skill to be able to understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing + basis, if such Contributor fails to notify You of the non-compliance by + some reasonable means prior to 60 days after You have come back into + compliance. Moreover, Your grants from a particular Contributor are + reinstated on an ongoing basis if such Contributor notifies You of the + non-compliance by some reasonable means, this is the first time You have + received notice of non-compliance with this License from such + Contributor, and You become compliant prior to 30 days after Your receipt + of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, + counter-claims, and cross-claims) alleging that a Contributor Version + directly or indirectly infringes any patent, then the rights granted to + You by any and all Contributors for the Covered Software under Section + 2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an "as is" basis, + without warranty of any kind, either expressed, implied, or statutory, + including, without limitation, warranties that the Covered Software is free + of defects, merchantable, fit for a particular purpose or non-infringing. + The entire risk as to the quality and performance of the Covered Software + is with You. Should any Covered Software prove defective in any respect, + You (not any Contributor) assume the cost of any necessary servicing, + repair, or correction. This disclaimer of warranty constitutes an essential + part of this License. No use of any Covered Software is authorized under + this License except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from + such party's negligence to the extent applicable law prohibits such + limitation. Some jurisdictions do not allow the exclusion or limitation of + incidental or consequential damages, so this exclusion and limitation may + not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts + of a jurisdiction where the defendant maintains its principal place of + business and such litigation shall be governed by laws of that + jurisdiction, without reference to its conflict-of-law provisions. Nothing + in this Section shall prevent a party's ability to bring cross-claims or + counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. Any law or regulation which provides that + the language of a contract shall be construed against the drafter shall not + be used to construe this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version + of the License under which You originally received the Covered Software, + or under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a + modified version of this License if you rename the license and remove + any references to the name of the license steward (except to note that + such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary + Licenses If You choose to distribute Source Code Form that is + Incompatible With Secondary Licenses under the terms of this version of + the License, the notice described in Exhibit B of this License must be + attached. + +Exhibit A - Source Code Form License Notice + + 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/. + +If it is not possible or desirable to put the notice in a particular file, +then You may include the notice in a location (such as a LICENSE file in a +relevant directory) where a recipient would be likely to look for such a +notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible + With Secondary Licenses", as defined by + the Mozilla Public License, v. 2.0. \ No newline at end of file diff --git a/vendor/github.com/armon/consul-api/README.md b/vendor/github.com/armon/consul-api/README.md new file mode 100644 index 0000000000..c95d9dee33 --- /dev/null +++ b/vendor/github.com/armon/consul-api/README.md @@ -0,0 +1,42 @@ +consul-api +========== + +*DEPRECATED* Please use [consul api package](https://github.com/hashicorp/consul/tree/master/api) instead. +Godocs for that package [are here](http://godoc.org/github.com/hashicorp/consul/api). + +This package provides the `consulapi` package which attempts to +provide programmatic access to the full Consul API. + +Currently, all of the Consul APIs included in version 0.4 are supported. + +Documentation +============= + +The full documentation is available on [Godoc](http://godoc.org/github.com/armon/consul-api) + +Usage +===== + +Below is an example of using the Consul client: + +```go +// Get a new client, with KV endpoints +client, _ := consulapi.NewClient(consulapi.DefaultConfig()) +kv := client.KV() + +// PUT a new KV pair +p := &consulapi.KVPair{Key: "foo", Value: []byte("test")} +_, err := kv.Put(p, nil) +if err != nil { + panic(err) +} + +// Lookup the pair +pair, _, err := kv.Get("foo", nil) +if err != nil { + panic(err) +} +fmt.Printf("KV: %v", pair) + +``` + diff --git a/vendor/github.com/armon/consul-api/acl.go b/vendor/github.com/armon/consul-api/acl.go new file mode 100644 index 0000000000..e0179f54df --- /dev/null +++ b/vendor/github.com/armon/consul-api/acl.go @@ -0,0 +1,140 @@ +package consulapi + +const ( + // ACLCLientType is the client type token + ACLClientType = "client" + + // ACLManagementType is the management type token + ACLManagementType = "management" +) + +// ACLEntry is used to represent an ACL entry +type ACLEntry struct { + CreateIndex uint64 + ModifyIndex uint64 + ID string + Name string + Type string + Rules string +} + +// ACL can be used to query the ACL endpoints +type ACL struct { + c *Client +} + +// ACL returns a handle to the ACL endpoints +func (c *Client) ACL() *ACL { + return &ACL{c} +} + +// Create is used to generate a new token with the given parameters +func (a *ACL) Create(acl *ACLEntry, q *WriteOptions) (string, *WriteMeta, error) { + r := a.c.newRequest("PUT", "/v1/acl/create") + r.setWriteOptions(q) + r.obj = acl + rtt, resp, err := requireOK(a.c.doRequest(r)) + if err != nil { + return "", nil, err + } + defer resp.Body.Close() + + wm := &WriteMeta{RequestTime: rtt} + var out struct{ ID string } + if err := decodeBody(resp, &out); err != nil { + return "", nil, err + } + return out.ID, wm, nil +} + +// Update is used to update the rules of an existing token +func (a *ACL) Update(acl *ACLEntry, q *WriteOptions) (*WriteMeta, error) { + r := a.c.newRequest("PUT", "/v1/acl/update") + r.setWriteOptions(q) + r.obj = acl + rtt, resp, err := requireOK(a.c.doRequest(r)) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + wm := &WriteMeta{RequestTime: rtt} + return wm, nil +} + +// Destroy is used to destroy a given ACL token ID +func (a *ACL) Destroy(id string, q *WriteOptions) (*WriteMeta, error) { + r := a.c.newRequest("PUT", "/v1/acl/destroy/"+id) + r.setWriteOptions(q) + rtt, resp, err := requireOK(a.c.doRequest(r)) + if err != nil { + return nil, err + } + resp.Body.Close() + + wm := &WriteMeta{RequestTime: rtt} + return wm, nil +} + +// Clone is used to return a new token cloned from an existing one +func (a *ACL) Clone(id string, q *WriteOptions) (string, *WriteMeta, error) { + r := a.c.newRequest("PUT", "/v1/acl/clone/"+id) + r.setWriteOptions(q) + rtt, resp, err := requireOK(a.c.doRequest(r)) + if err != nil { + return "", nil, err + } + defer resp.Body.Close() + + wm := &WriteMeta{RequestTime: rtt} + var out struct{ ID string } + if err := decodeBody(resp, &out); err != nil { + return "", nil, err + } + return out.ID, wm, nil +} + +// Info is used to query for information about an ACL token +func (a *ACL) Info(id string, q *QueryOptions) (*ACLEntry, *QueryMeta, error) { + r := a.c.newRequest("GET", "/v1/acl/info/"+id) + r.setQueryOptions(q) + rtt, resp, err := requireOK(a.c.doRequest(r)) + if err != nil { + return nil, nil, err + } + defer resp.Body.Close() + + qm := &QueryMeta{} + parseQueryMeta(resp, qm) + qm.RequestTime = rtt + + var entries []*ACLEntry + if err := decodeBody(resp, &entries); err != nil { + return nil, nil, err + } + if len(entries) > 0 { + return entries[0], qm, nil + } + return nil, qm, nil +} + +// List is used to get all the ACL tokens +func (a *ACL) List(q *QueryOptions) ([]*ACLEntry, *QueryMeta, error) { + r := a.c.newRequest("GET", "/v1/acl/list") + r.setQueryOptions(q) + rtt, resp, err := requireOK(a.c.doRequest(r)) + if err != nil { + return nil, nil, err + } + defer resp.Body.Close() + + qm := &QueryMeta{} + parseQueryMeta(resp, qm) + qm.RequestTime = rtt + + var entries []*ACLEntry + if err := decodeBody(resp, &entries); err != nil { + return nil, nil, err + } + return entries, qm, nil +} diff --git a/vendor/github.com/armon/consul-api/acl_test.go b/vendor/github.com/armon/consul-api/acl_test.go new file mode 100644 index 0000000000..7932c5905a --- /dev/null +++ b/vendor/github.com/armon/consul-api/acl_test.go @@ -0,0 +1,140 @@ +package consulapi + +import ( + "os" + "testing" +) + +// ROOT is a management token for the tests +var CONSUL_ROOT string + +func init() { + CONSUL_ROOT = os.Getenv("CONSUL_ROOT") +} + +func TestACL_CreateDestroy(t *testing.T) { + if CONSUL_ROOT == "" { + t.SkipNow() + } + c := makeClient(t) + c.config.Token = CONSUL_ROOT + acl := c.ACL() + + ae := ACLEntry{ + Name: "API test", + Type: ACLClientType, + Rules: `key "" { policy = "deny" }`, + } + + id, wm, err := acl.Create(&ae, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if wm.RequestTime == 0 { + t.Fatalf("bad: %v", wm) + } + + if id == "" { + t.Fatalf("invalid: %v", id) + } + + ae2, _, err := acl.Info(id, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if ae2.Name != ae.Name || ae2.Type != ae.Type || ae2.Rules != ae.Rules { + t.Fatalf("Bad: %#v", ae2) + } + + wm, err = acl.Destroy(id, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if wm.RequestTime == 0 { + t.Fatalf("bad: %v", wm) + } +} + +func TestACL_CloneDestroy(t *testing.T) { + if CONSUL_ROOT == "" { + t.SkipNow() + } + c := makeClient(t) + c.config.Token = CONSUL_ROOT + acl := c.ACL() + + id, wm, err := acl.Clone(CONSUL_ROOT, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if wm.RequestTime == 0 { + t.Fatalf("bad: %v", wm) + } + + if id == "" { + t.Fatalf("invalid: %v", id) + } + + wm, err = acl.Destroy(id, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if wm.RequestTime == 0 { + t.Fatalf("bad: %v", wm) + } +} + +func TestACL_Info(t *testing.T) { + if CONSUL_ROOT == "" { + t.SkipNow() + } + c := makeClient(t) + c.config.Token = CONSUL_ROOT + acl := c.ACL() + + ae, qm, err := acl.Info(CONSUL_ROOT, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if qm.LastIndex == 0 { + t.Fatalf("bad: %v", qm) + } + if !qm.KnownLeader { + t.Fatalf("bad: %v", qm) + } + + if ae == nil || ae.ID != CONSUL_ROOT || ae.Type != ACLManagementType { + t.Fatalf("bad: %#v", ae) + } +} + +func TestACL_List(t *testing.T) { + if CONSUL_ROOT == "" { + t.SkipNow() + } + c := makeClient(t) + c.config.Token = CONSUL_ROOT + acl := c.ACL() + + acls, qm, err := acl.List(nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if len(acls) < 2 { + t.Fatalf("bad: %v", acls) + } + + if qm.LastIndex == 0 { + t.Fatalf("bad: %v", qm) + } + if !qm.KnownLeader { + t.Fatalf("bad: %v", qm) + } +} diff --git a/vendor/github.com/armon/consul-api/agent.go b/vendor/github.com/armon/consul-api/agent.go new file mode 100644 index 0000000000..eec93cb970 --- /dev/null +++ b/vendor/github.com/armon/consul-api/agent.go @@ -0,0 +1,272 @@ +package consulapi + +import ( + "fmt" +) + +// AgentCheck represents a check known to the agent +type AgentCheck struct { + Node string + CheckID string + Name string + Status string + Notes string + Output string + ServiceID string + ServiceName string +} + +// AgentService represents a service known to the agent +type AgentService struct { + ID string + Service string + Tags []string + Port int +} + +// AgentMember represents a cluster member known to the agent +type AgentMember struct { + Name string + Addr string + Port uint16 + Tags map[string]string + Status int + ProtocolMin uint8 + ProtocolMax uint8 + ProtocolCur uint8 + DelegateMin uint8 + DelegateMax uint8 + DelegateCur uint8 +} + +// AgentServiceRegistration is used to register a new service +type AgentServiceRegistration struct { + ID string `json:",omitempty"` + Name string `json:",omitempty"` + Tags []string `json:",omitempty"` + Port int `json:",omitempty"` + Check *AgentServiceCheck +} + +// AgentCheckRegistration is used to register a new check +type AgentCheckRegistration struct { + ID string `json:",omitempty"` + Name string `json:",omitempty"` + Notes string `json:",omitempty"` + AgentServiceCheck +} + +// AgentServiceCheck is used to create an associated +// check for a service +type AgentServiceCheck struct { + Script string `json:",omitempty"` + Interval string `json:",omitempty"` + TTL string `json:",omitempty"` +} + +// Agent can be used to query the Agent endpoints +type Agent struct { + c *Client + + // cache the node name + nodeName string +} + +// Agent returns a handle to the agent endpoints +func (c *Client) Agent() *Agent { + return &Agent{c: c} +} + +// Self is used to query the agent we are speaking to for +// information about itself +func (a *Agent) Self() (map[string]map[string]interface{}, error) { + r := a.c.newRequest("GET", "/v1/agent/self") + _, resp, err := requireOK(a.c.doRequest(r)) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + var out map[string]map[string]interface{} + if err := decodeBody(resp, &out); err != nil { + return nil, err + } + return out, nil +} + +// NodeName is used to get the node name of the agent +func (a *Agent) NodeName() (string, error) { + if a.nodeName != "" { + return a.nodeName, nil + } + info, err := a.Self() + if err != nil { + return "", err + } + name := info["Config"]["NodeName"].(string) + a.nodeName = name + return name, nil +} + +// Checks returns the locally registered checks +func (a *Agent) Checks() (map[string]*AgentCheck, error) { + r := a.c.newRequest("GET", "/v1/agent/checks") + _, resp, err := requireOK(a.c.doRequest(r)) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + var out map[string]*AgentCheck + if err := decodeBody(resp, &out); err != nil { + return nil, err + } + return out, nil +} + +// Services returns the locally registered services +func (a *Agent) Services() (map[string]*AgentService, error) { + r := a.c.newRequest("GET", "/v1/agent/services") + _, resp, err := requireOK(a.c.doRequest(r)) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + var out map[string]*AgentService + if err := decodeBody(resp, &out); err != nil { + return nil, err + } + return out, nil +} + +// Members returns the known gossip members. The WAN +// flag can be used to query a server for WAN members. +func (a *Agent) Members(wan bool) ([]*AgentMember, error) { + r := a.c.newRequest("GET", "/v1/agent/members") + if wan { + r.params.Set("wan", "1") + } + _, resp, err := requireOK(a.c.doRequest(r)) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + var out []*AgentMember + if err := decodeBody(resp, &out); err != nil { + return nil, err + } + return out, nil +} + +// ServiceRegister is used to register a new service with +// the local agent +func (a *Agent) ServiceRegister(service *AgentServiceRegistration) error { + r := a.c.newRequest("PUT", "/v1/agent/service/register") + r.obj = service + _, resp, err := requireOK(a.c.doRequest(r)) + if err != nil { + return err + } + resp.Body.Close() + return nil +} + +// ServiceDeregister is used to deregister a service with +// the local agent +func (a *Agent) ServiceDeregister(serviceID string) error { + r := a.c.newRequest("PUT", "/v1/agent/service/deregister/"+serviceID) + _, resp, err := requireOK(a.c.doRequest(r)) + if err != nil { + return err + } + resp.Body.Close() + return nil +} + +// PassTTL is used to set a TTL check to the passing state +func (a *Agent) PassTTL(checkID, note string) error { + return a.UpdateTTL(checkID, note, "pass") +} + +// WarnTTL is used to set a TTL check to the warning state +func (a *Agent) WarnTTL(checkID, note string) error { + return a.UpdateTTL(checkID, note, "warn") +} + +// FailTTL is used to set a TTL check to the failing state +func (a *Agent) FailTTL(checkID, note string) error { + return a.UpdateTTL(checkID, note, "fail") +} + +// UpdateTTL is used to update the TTL of a check +func (a *Agent) UpdateTTL(checkID, note, status string) error { + switch status { + case "pass": + case "warn": + case "fail": + default: + return fmt.Errorf("Invalid status: %s", status) + } + endpoint := fmt.Sprintf("/v1/agent/check/%s/%s", status, checkID) + r := a.c.newRequest("PUT", endpoint) + r.params.Set("note", note) + _, resp, err := requireOK(a.c.doRequest(r)) + if err != nil { + return err + } + resp.Body.Close() + return nil +} + +// CheckRegister is used to register a new check with +// the local agent +func (a *Agent) CheckRegister(check *AgentCheckRegistration) error { + r := a.c.newRequest("PUT", "/v1/agent/check/register") + r.obj = check + _, resp, err := requireOK(a.c.doRequest(r)) + if err != nil { + return err + } + resp.Body.Close() + return nil +} + +// CheckDeregister is used to deregister a check with +// the local agent +func (a *Agent) CheckDeregister(checkID string) error { + r := a.c.newRequest("PUT", "/v1/agent/check/deregister/"+checkID) + _, resp, err := requireOK(a.c.doRequest(r)) + if err != nil { + return err + } + resp.Body.Close() + return nil +} + +// Join is used to instruct the agent to attempt a join to +// another cluster member +func (a *Agent) Join(addr string, wan bool) error { + r := a.c.newRequest("PUT", "/v1/agent/join/"+addr) + if wan { + r.params.Set("wan", "1") + } + _, resp, err := requireOK(a.c.doRequest(r)) + if err != nil { + return err + } + resp.Body.Close() + return nil +} + +// ForceLeave is used to have the agent eject a failed node +func (a *Agent) ForceLeave(node string) error { + r := a.c.newRequest("PUT", "/v1/agent/force-leave/"+node) + _, resp, err := requireOK(a.c.doRequest(r)) + if err != nil { + return err + } + resp.Body.Close() + return nil +} diff --git a/vendor/github.com/armon/consul-api/agent_test.go b/vendor/github.com/armon/consul-api/agent_test.go new file mode 100644 index 0000000000..8d97af4af5 --- /dev/null +++ b/vendor/github.com/armon/consul-api/agent_test.go @@ -0,0 +1,162 @@ +package consulapi + +import ( + "testing" +) + +func TestAgent_Self(t *testing.T) { + c := makeClient(t) + agent := c.Agent() + + info, err := agent.Self() + if err != nil { + t.Fatalf("err: %v", err) + } + + name := info["Config"]["NodeName"] + if name == "" { + t.Fatalf("bad: %v", info) + } +} + +func TestAgent_Members(t *testing.T) { + c := makeClient(t) + agent := c.Agent() + + members, err := agent.Members(false) + if err != nil { + t.Fatalf("err: %v", err) + } + + if len(members) != 1 { + t.Fatalf("bad: %v", members) + } +} + +func TestAgent_Services(t *testing.T) { + c := makeClient(t) + agent := c.Agent() + + reg := &AgentServiceRegistration{ + Name: "foo", + Tags: []string{"bar", "baz"}, + Port: 8000, + Check: &AgentServiceCheck{ + TTL: "15s", + }, + } + if err := agent.ServiceRegister(reg); err != nil { + t.Fatalf("err: %v", err) + } + + services, err := agent.Services() + if err != nil { + t.Fatalf("err: %v", err) + } + if _, ok := services["foo"]; !ok { + t.Fatalf("missing service: %v", services) + } + + checks, err := agent.Checks() + if err != nil { + t.Fatalf("err: %v", err) + } + if _, ok := checks["service:foo"]; !ok { + t.Fatalf("missing check: %v", checks) + } + + if err := agent.ServiceDeregister("foo"); err != nil { + t.Fatalf("err: %v", err) + } +} + +func TestAgent_SetTTLStatus(t *testing.T) { + c := makeClient(t) + agent := c.Agent() + + reg := &AgentServiceRegistration{ + Name: "foo", + Check: &AgentServiceCheck{ + TTL: "15s", + }, + } + if err := agent.ServiceRegister(reg); err != nil { + t.Fatalf("err: %v", err) + } + + if err := agent.WarnTTL("service:foo", "test"); err != nil { + t.Fatalf("err: %v", err) + } + + checks, err := agent.Checks() + if err != nil { + t.Fatalf("err: %v", err) + } + chk, ok := checks["service:foo"] + if !ok { + t.Fatalf("missing check: %v", checks) + } + if chk.Status != "warning" { + t.Fatalf("Bad: %#v", chk) + } + if chk.Output != "test" { + t.Fatalf("Bad: %#v", chk) + } + + if err := agent.ServiceDeregister("foo"); err != nil { + t.Fatalf("err: %v", err) + } +} + +func TestAgent_Checks(t *testing.T) { + c := makeClient(t) + agent := c.Agent() + + reg := &AgentCheckRegistration{ + Name: "foo", + } + reg.TTL = "15s" + if err := agent.CheckRegister(reg); err != nil { + t.Fatalf("err: %v", err) + } + + checks, err := agent.Checks() + if err != nil { + t.Fatalf("err: %v", err) + } + if _, ok := checks["foo"]; !ok { + t.Fatalf("missing check: %v", checks) + } + + if err := agent.CheckDeregister("foo"); err != nil { + t.Fatalf("err: %v", err) + } +} + +func TestAgent_Join(t *testing.T) { + c := makeClient(t) + agent := c.Agent() + + info, err := agent.Self() + if err != nil { + t.Fatalf("err: %v", err) + } + + // Join ourself + addr := info["Config"]["AdvertiseAddr"].(string) + err = agent.Join(addr, false) + if err != nil { + t.Fatalf("err: %v", err) + } +} + +func TestAgent_ForceLeave(t *testing.T) { + c := makeClient(t) + agent := c.Agent() + + // Eject somebody + err := agent.ForceLeave("foo") + if err != nil { + t.Fatalf("err: %v", err) + } +} diff --git a/vendor/github.com/armon/consul-api/api.go b/vendor/github.com/armon/consul-api/api.go new file mode 100644 index 0000000000..e1335769b7 --- /dev/null +++ b/vendor/github.com/armon/consul-api/api.go @@ -0,0 +1,323 @@ +package consulapi + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "strconv" + "time" +) + +// QueryOptions are used to parameterize a query +type QueryOptions struct { + // Providing a datacenter overwrites the DC provided + // by the Config + Datacenter string + + // AllowStale allows any Consul server (non-leader) to service + // a read. This allows for lower latency and higher throughput + AllowStale bool + + // RequireConsistent forces the read to be fully consistent. + // This is more expensive but prevents ever performing a stale + // read. + RequireConsistent bool + + // WaitIndex is used to enable a blocking query. Waits + // until the timeout or the next index is reached + WaitIndex uint64 + + // WaitTime is used to bound the duration of a wait. + // Defaults to that of the Config, but can be overriden. + WaitTime time.Duration + + // Token is used to provide a per-request ACL token + // which overrides the agent's default token. + Token string +} + +// WriteOptions are used to parameterize a write +type WriteOptions struct { + // Providing a datacenter overwrites the DC provided + // by the Config + Datacenter string + + // Token is used to provide a per-request ACL token + // which overrides the agent's default token. + Token string +} + +// QueryMeta is used to return meta data about a query +type QueryMeta struct { + // LastIndex. This can be used as a WaitIndex to perform + // a blocking query + LastIndex uint64 + + // Time of last contact from the leader for the + // server servicing the request + LastContact time.Duration + + // Is there a known leader + KnownLeader bool + + // How long did the request take + RequestTime time.Duration +} + +// WriteMeta is used to return meta data about a write +type WriteMeta struct { + // How long did the request take + RequestTime time.Duration +} + +// HttpBasicAuth is used to authenticate http client with HTTP Basic Authentication +type HttpBasicAuth struct { + // Username to use for HTTP Basic Authentication + Username string + + // Password to use for HTTP Basic Authentication + Password string +} + +// Config is used to configure the creation of a client +type Config struct { + // Address is the address of the Consul server + Address string + + // Scheme is the URI scheme for the Consul server + Scheme string + + // Datacenter to use. If not provided, the default agent datacenter is used. + Datacenter string + + // HttpClient is the client to use. Default will be + // used if not provided. + HttpClient *http.Client + + // HttpAuth is the auth info to use for http access. + HttpAuth *HttpBasicAuth + + // WaitTime limits how long a Watch will block. If not provided, + // the agent default values will be used. + WaitTime time.Duration + + // Token is used to provide a per-request ACL token + // which overrides the agent's default token. + Token string +} + +// DefaultConfig returns a default configuration for the client +func DefaultConfig() *Config { + return &Config{ + Address: "127.0.0.1:8500", + Scheme: "http", + HttpClient: http.DefaultClient, + } +} + +// Client provides a client to the Consul API +type Client struct { + config Config +} + +// NewClient returns a new client +func NewClient(config *Config) (*Client, error) { + // bootstrap the config + defConfig := DefaultConfig() + + if len(config.Address) == 0 { + config.Address = defConfig.Address + } + + if len(config.Scheme) == 0 { + config.Scheme = defConfig.Scheme + } + + if config.HttpClient == nil { + config.HttpClient = defConfig.HttpClient + } + + client := &Client{ + config: *config, + } + return client, nil +} + +// request is used to help build up a request +type request struct { + config *Config + method string + url *url.URL + params url.Values + body io.Reader + obj interface{} +} + +// setQueryOptions is used to annotate the request with +// additional query options +func (r *request) setQueryOptions(q *QueryOptions) { + if q == nil { + return + } + if q.Datacenter != "" { + r.params.Set("dc", q.Datacenter) + } + if q.AllowStale { + r.params.Set("stale", "") + } + if q.RequireConsistent { + r.params.Set("consistent", "") + } + if q.WaitIndex != 0 { + r.params.Set("index", strconv.FormatUint(q.WaitIndex, 10)) + } + if q.WaitTime != 0 { + r.params.Set("wait", durToMsec(q.WaitTime)) + } + if q.Token != "" { + r.params.Set("token", q.Token) + } +} + +// durToMsec converts a duration to a millisecond specified string +func durToMsec(dur time.Duration) string { + return fmt.Sprintf("%dms", dur/time.Millisecond) +} + +// setWriteOptions is used to annotate the request with +// additional write options +func (r *request) setWriteOptions(q *WriteOptions) { + if q == nil { + return + } + if q.Datacenter != "" { + r.params.Set("dc", q.Datacenter) + } + if q.Token != "" { + r.params.Set("token", q.Token) + } +} + +// toHTTP converts the request to an HTTP request +func (r *request) toHTTP() (*http.Request, error) { + // Encode the query parameters + r.url.RawQuery = r.params.Encode() + + // Get the url sring + urlRaw := r.url.String() + + // Check if we should encode the body + if r.body == nil && r.obj != nil { + if b, err := encodeBody(r.obj); err != nil { + return nil, err + } else { + r.body = b + } + } + + // Create the HTTP request + req, err := http.NewRequest(r.method, urlRaw, r.body) + + // Setup auth + if err == nil && r.config.HttpAuth != nil { + req.SetBasicAuth(r.config.HttpAuth.Username, r.config.HttpAuth.Password) + } + + return req, err +} + +// newRequest is used to create a new request +func (c *Client) newRequest(method, path string) *request { + r := &request{ + config: &c.config, + method: method, + url: &url.URL{ + Scheme: c.config.Scheme, + Host: c.config.Address, + Path: path, + }, + params: make(map[string][]string), + } + if c.config.Datacenter != "" { + r.params.Set("dc", c.config.Datacenter) + } + if c.config.WaitTime != 0 { + r.params.Set("wait", durToMsec(r.config.WaitTime)) + } + if c.config.Token != "" { + r.params.Set("token", r.config.Token) + } + return r +} + +// doRequest runs a request with our client +func (c *Client) doRequest(r *request) (time.Duration, *http.Response, error) { + req, err := r.toHTTP() + if err != nil { + return 0, nil, err + } + start := time.Now() + resp, err := c.config.HttpClient.Do(req) + diff := time.Now().Sub(start) + return diff, resp, err +} + +// parseQueryMeta is used to help parse query meta-data +func parseQueryMeta(resp *http.Response, q *QueryMeta) error { + header := resp.Header + + // Parse the X-Consul-Index + index, err := strconv.ParseUint(header.Get("X-Consul-Index"), 10, 64) + if err != nil { + return fmt.Errorf("Failed to parse X-Consul-Index: %v", err) + } + q.LastIndex = index + + // Parse the X-Consul-LastContact + last, err := strconv.ParseUint(header.Get("X-Consul-LastContact"), 10, 64) + if err != nil { + return fmt.Errorf("Failed to parse X-Consul-LastContact: %v", err) + } + q.LastContact = time.Duration(last) * time.Millisecond + + // Parse the X-Consul-KnownLeader + switch header.Get("X-Consul-KnownLeader") { + case "true": + q.KnownLeader = true + default: + q.KnownLeader = false + } + return nil +} + +// decodeBody is used to JSON decode a body +func decodeBody(resp *http.Response, out interface{}) error { + dec := json.NewDecoder(resp.Body) + return dec.Decode(out) +} + +// encodeBody is used to encode a request body +func encodeBody(obj interface{}) (io.Reader, error) { + buf := bytes.NewBuffer(nil) + enc := json.NewEncoder(buf) + if err := enc.Encode(obj); err != nil { + return nil, err + } + return buf, nil +} + +// requireOK is used to wrap doRequest and check for a 200 +func requireOK(d time.Duration, resp *http.Response, e error) (time.Duration, *http.Response, error) { + if e != nil { + return d, resp, e + } + if resp.StatusCode != 200 { + var buf bytes.Buffer + io.Copy(&buf, resp.Body) + return d, resp, fmt.Errorf("Unexpected response code: %d (%s)", resp.StatusCode, buf.Bytes()) + } + return d, resp, e +} diff --git a/vendor/github.com/armon/consul-api/api_test.go b/vendor/github.com/armon/consul-api/api_test.go new file mode 100644 index 0000000000..3a608c539b --- /dev/null +++ b/vendor/github.com/armon/consul-api/api_test.go @@ -0,0 +1,126 @@ +package consulapi + +import ( + crand "crypto/rand" + "fmt" + "net/http" + "testing" + "time" +) + +func makeClient(t *testing.T) *Client { + conf := DefaultConfig() + client, err := NewClient(conf) + if err != nil { + t.Fatalf("err: %v", err) + } + return client +} + +func testKey() string { + buf := make([]byte, 16) + if _, err := crand.Read(buf); err != nil { + panic(fmt.Errorf("Failed to read random bytes: %v", err)) + } + + return fmt.Sprintf("%08x-%04x-%04x-%04x-%12x", + buf[0:4], + buf[4:6], + buf[6:8], + buf[8:10], + buf[10:16]) +} + +func TestSetQueryOptions(t *testing.T) { + c := makeClient(t) + r := c.newRequest("GET", "/v1/kv/foo") + q := &QueryOptions{ + Datacenter: "foo", + AllowStale: true, + RequireConsistent: true, + WaitIndex: 1000, + WaitTime: 100 * time.Second, + Token: "12345", + } + r.setQueryOptions(q) + + if r.params.Get("dc") != "foo" { + t.Fatalf("bad: %v", r.params) + } + if _, ok := r.params["stale"]; !ok { + t.Fatalf("bad: %v", r.params) + } + if _, ok := r.params["consistent"]; !ok { + t.Fatalf("bad: %v", r.params) + } + if r.params.Get("index") != "1000" { + t.Fatalf("bad: %v", r.params) + } + if r.params.Get("wait") != "100000ms" { + t.Fatalf("bad: %v", r.params) + } + if r.params.Get("token") != "12345" { + t.Fatalf("bad: %v", r.params) + } +} + +func TestSetWriteOptions(t *testing.T) { + c := makeClient(t) + r := c.newRequest("GET", "/v1/kv/foo") + q := &WriteOptions{ + Datacenter: "foo", + Token: "23456", + } + r.setWriteOptions(q) + + if r.params.Get("dc") != "foo" { + t.Fatalf("bad: %v", r.params) + } + if r.params.Get("token") != "23456" { + t.Fatalf("bad: %v", r.params) + } +} + +func TestRequestToHTTP(t *testing.T) { + c := makeClient(t) + r := c.newRequest("DELETE", "/v1/kv/foo") + q := &QueryOptions{ + Datacenter: "foo", + } + r.setQueryOptions(q) + req, err := r.toHTTP() + if err != nil { + t.Fatalf("err: %v", err) + } + + if req.Method != "DELETE" { + t.Fatalf("bad: %v", req) + } + if req.URL.String() != "http://127.0.0.1:8500/v1/kv/foo?dc=foo" { + t.Fatalf("bad: %v", req) + } +} + +func TestParseQueryMeta(t *testing.T) { + resp := &http.Response{ + Header: make(map[string][]string), + } + resp.Header.Set("X-Consul-Index", "12345") + resp.Header.Set("X-Consul-LastContact", "80") + resp.Header.Set("X-Consul-KnownLeader", "true") + + qm := &QueryMeta{} + if err := parseQueryMeta(resp, qm); err != nil { + t.Fatalf("err: %v", err) + } + + if qm.LastIndex != 12345 { + t.Fatalf("Bad: %v", qm) + } + if qm.LastContact != 80*time.Millisecond { + t.Fatalf("Bad: %v", qm) + } + if !qm.KnownLeader { + t.Fatalf("Bad: %v", qm) + } +} diff --git a/vendor/github.com/armon/consul-api/catalog.go b/vendor/github.com/armon/consul-api/catalog.go new file mode 100644 index 0000000000..8080e2a910 --- /dev/null +++ b/vendor/github.com/armon/consul-api/catalog.go @@ -0,0 +1,181 @@ +package consulapi + +type Node struct { + Node string + Address string +} + +type CatalogService struct { + Node string + Address string + ServiceID string + ServiceName string + ServiceTags []string + ServicePort int +} + +type CatalogNode struct { + Node *Node + Services map[string]*AgentService +} + +type CatalogRegistration struct { + Node string + Address string + Datacenter string + Service *AgentService + Check *AgentCheck +} + +type CatalogDeregistration struct { + Node string + Address string + Datacenter string + ServiceID string + CheckID string +} + +// Catalog can be used to query the Catalog endpoints +type Catalog struct { + c *Client +} + +// Catalog returns a handle to the catalog endpoints +func (c *Client) Catalog() *Catalog { + return &Catalog{c} +} + +func (c *Catalog) Register(reg *CatalogRegistration, q *WriteOptions) (*WriteMeta, error) { + r := c.c.newRequest("PUT", "/v1/catalog/register") + r.setWriteOptions(q) + r.obj = reg + rtt, resp, err := requireOK(c.c.doRequest(r)) + if err != nil { + return nil, err + } + resp.Body.Close() + + wm := &WriteMeta{} + wm.RequestTime = rtt + + return wm, nil +} + +func (c *Catalog) Deregister(dereg *CatalogDeregistration, q *WriteOptions) (*WriteMeta, error) { + r := c.c.newRequest("PUT", "/v1/catalog/deregister") + r.setWriteOptions(q) + r.obj = dereg + rtt, resp, err := requireOK(c.c.doRequest(r)) + if err != nil { + return nil, err + } + resp.Body.Close() + + wm := &WriteMeta{} + wm.RequestTime = rtt + + return wm, nil +} + +// Datacenters is used to query for all the known datacenters +func (c *Catalog) Datacenters() ([]string, error) { + r := c.c.newRequest("GET", "/v1/catalog/datacenters") + _, resp, err := requireOK(c.c.doRequest(r)) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + var out []string + if err := decodeBody(resp, &out); err != nil { + return nil, err + } + return out, nil +} + +// Nodes is used to query all the known nodes +func (c *Catalog) Nodes(q *QueryOptions) ([]*Node, *QueryMeta, error) { + r := c.c.newRequest("GET", "/v1/catalog/nodes") + r.setQueryOptions(q) + rtt, resp, err := requireOK(c.c.doRequest(r)) + if err != nil { + return nil, nil, err + } + defer resp.Body.Close() + + qm := &QueryMeta{} + parseQueryMeta(resp, qm) + qm.RequestTime = rtt + + var out []*Node + if err := decodeBody(resp, &out); err != nil { + return nil, nil, err + } + return out, qm, nil +} + +// Services is used to query for all known services +func (c *Catalog) Services(q *QueryOptions) (map[string][]string, *QueryMeta, error) { + r := c.c.newRequest("GET", "/v1/catalog/services") + r.setQueryOptions(q) + rtt, resp, err := requireOK(c.c.doRequest(r)) + if err != nil { + return nil, nil, err + } + defer resp.Body.Close() + + qm := &QueryMeta{} + parseQueryMeta(resp, qm) + qm.RequestTime = rtt + + var out map[string][]string + if err := decodeBody(resp, &out); err != nil { + return nil, nil, err + } + return out, qm, nil +} + +// Service is used to query catalog entries for a given service +func (c *Catalog) Service(service, tag string, q *QueryOptions) ([]*CatalogService, *QueryMeta, error) { + r := c.c.newRequest("GET", "/v1/catalog/service/"+service) + r.setQueryOptions(q) + if tag != "" { + r.params.Set("tag", tag) + } + rtt, resp, err := requireOK(c.c.doRequest(r)) + if err != nil { + return nil, nil, err + } + defer resp.Body.Close() + + qm := &QueryMeta{} + parseQueryMeta(resp, qm) + qm.RequestTime = rtt + + var out []*CatalogService + if err := decodeBody(resp, &out); err != nil { + return nil, nil, err + } + return out, qm, nil +} + +// Node is used to query for service information about a single node +func (c *Catalog) Node(node string, q *QueryOptions) (*CatalogNode, *QueryMeta, error) { + r := c.c.newRequest("GET", "/v1/catalog/node/"+node) + r.setQueryOptions(q) + rtt, resp, err := requireOK(c.c.doRequest(r)) + if err != nil { + return nil, nil, err + } + defer resp.Body.Close() + + qm := &QueryMeta{} + parseQueryMeta(resp, qm) + qm.RequestTime = rtt + + var out *CatalogNode + if err := decodeBody(resp, &out); err != nil { + return nil, nil, err + } + return out, qm, nil +} diff --git a/vendor/github.com/armon/consul-api/catalog_test.go b/vendor/github.com/armon/consul-api/catalog_test.go new file mode 100644 index 0000000000..7ed6cfc2ce --- /dev/null +++ b/vendor/github.com/armon/consul-api/catalog_test.go @@ -0,0 +1,219 @@ +package consulapi + +import ( + "testing" +) + +func TestCatalog_Datacenters(t *testing.T) { + c := makeClient(t) + catalog := c.Catalog() + + datacenters, err := catalog.Datacenters() + if err != nil { + t.Fatalf("err: %v", err) + } + + if len(datacenters) == 0 { + t.Fatalf("Bad: %v", datacenters) + } +} + +func TestCatalog_Nodes(t *testing.T) { + c := makeClient(t) + catalog := c.Catalog() + + nodes, meta, err := catalog.Nodes(nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if meta.LastIndex == 0 { + t.Fatalf("Bad: %v", meta) + } + + if len(nodes) == 0 { + t.Fatalf("Bad: %v", nodes) + } +} + +func TestCatalog_Services(t *testing.T) { + c := makeClient(t) + catalog := c.Catalog() + + services, meta, err := catalog.Services(nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if meta.LastIndex == 0 { + t.Fatalf("Bad: %v", meta) + } + + if len(services) == 0 { + t.Fatalf("Bad: %v", services) + } +} + +func TestCatalog_Service(t *testing.T) { + c := makeClient(t) + catalog := c.Catalog() + + services, meta, err := catalog.Service("consul", "", nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if meta.LastIndex == 0 { + t.Fatalf("Bad: %v", meta) + } + + if len(services) == 0 { + t.Fatalf("Bad: %v", services) + } +} + +func TestCatalog_Node(t *testing.T) { + c := makeClient(t) + catalog := c.Catalog() + + name, _ := c.Agent().NodeName() + info, meta, err := catalog.Node(name, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if meta.LastIndex == 0 { + t.Fatalf("Bad: %v", meta) + } + if len(info.Services) == 0 { + t.Fatalf("Bad: %v", info) + } +} + +func TestCatalog_Registration(t *testing.T) { + c := makeClient(t) + catalog := c.Catalog() + + service := &AgentService{ + ID: "redis1", + Service: "redis", + Tags: []string{"master", "v1"}, + Port: 8000, + } + + check := &AgentCheck{ + Node: "foobar", + CheckID: "service:redis1", + Name: "Redis health check", + Notes: "Script based health check", + Status: "passing", + ServiceID: "redis1", + } + + reg := &CatalogRegistration{ + Datacenter: "dc1", + Node: "foobar", + Address: "192.168.10.10", + Service: service, + Check: check, + } + + _, err := catalog.Register(reg, nil) + + if err != nil { + t.Fatalf("err: %v", err) + } + + node, _, err := catalog.Node("foobar", nil) + + if err != nil { + t.Fatalf("err: %v", err) + } + + if _, ok := node.Services["redis1"]; !ok { + t.Fatalf("missing service: redis1") + } + + health, _, err := c.Health().Node("foobar", nil) + + if err != nil { + t.Fatalf("err: %v", err) + } + + if health[0].CheckID != "service:redis1" { + t.Fatalf("missing checkid service:redis1") + } +} + +func TestCatalog_Deregistration(t *testing.T) { + c := makeClient(t) + catalog := c.Catalog() + + dereg := &CatalogDeregistration{ + Datacenter: "dc1", + Node: "foobar", + Address: "192.168.10.10", + ServiceID: "redis1", + } + + _, err := catalog.Deregister(dereg, nil) + + if err != nil { + t.Fatalf("err: %v", err) + } + + node, _, err := catalog.Node("foobar", nil) + + if err != nil { + t.Fatalf("err: %v", err) + } + + if _, ok := node.Services["redis1"]; ok { + t.Fatalf("ServiceID:redis1 is not deregistered") + } + + dereg = &CatalogDeregistration{ + Datacenter: "dc1", + Node: "foobar", + Address: "192.168.10.10", + CheckID: "service:redis1", + } + + _, err = catalog.Deregister(dereg, nil) + + if err != nil { + t.Fatalf("err: %v", err) + } + + health, _, err := c.Health().Node("foobar", nil) + + if err != nil { + t.Fatalf("err: %v", err) + } + + if len(health) != 0 { + t.Fatalf("CheckID:service:redis1 is not deregistered") + } + + dereg = &CatalogDeregistration{ + Datacenter: "dc1", + Node: "foobar", + Address: "192.168.10.10", + } + + _, err = catalog.Deregister(dereg, nil) + + if err != nil { + t.Fatalf("err: %v", err) + } + + node, _, err = catalog.Node("foobar", nil) + + if err != nil { + t.Fatalf("err: %v", err) + } + + if node != nil { + t.Fatalf("node is not deregistered: %v", node) + } +} diff --git a/vendor/github.com/armon/consul-api/event.go b/vendor/github.com/armon/consul-api/event.go new file mode 100644 index 0000000000..59813d40fa --- /dev/null +++ b/vendor/github.com/armon/consul-api/event.go @@ -0,0 +1,104 @@ +package consulapi + +import ( + "bytes" + "strconv" +) + +// Event can be used to query the Event endpoints +type Event struct { + c *Client +} + +// UserEvent represents an event that was fired by the user +type UserEvent struct { + ID string + Name string + Payload []byte + NodeFilter string + ServiceFilter string + TagFilter string + Version int + LTime uint64 +} + +// Event returns a handle to the event endpoints +func (c *Client) Event() *Event { + return &Event{c} +} + +// Fire is used to fire a new user event. Only the Name, Payload and Filters +// are respected. This returns the ID or an associated error. Cross DC requests +// are supported. +func (e *Event) Fire(params *UserEvent, q *WriteOptions) (string, *WriteMeta, error) { + r := e.c.newRequest("PUT", "/v1/event/fire/"+params.Name) + r.setWriteOptions(q) + if params.NodeFilter != "" { + r.params.Set("node", params.NodeFilter) + } + if params.ServiceFilter != "" { + r.params.Set("service", params.ServiceFilter) + } + if params.TagFilter != "" { + r.params.Set("tag", params.TagFilter) + } + if params.Payload != nil { + r.body = bytes.NewReader(params.Payload) + } + + rtt, resp, err := requireOK(e.c.doRequest(r)) + if err != nil { + return "", nil, err + } + defer resp.Body.Close() + + wm := &WriteMeta{RequestTime: rtt} + var out UserEvent + if err := decodeBody(resp, &out); err != nil { + return "", nil, err + } + return out.ID, wm, nil +} + +// List is used to get the most recent events an agent has received. +// This list can be optionally filtered by the name. This endpoint supports +// quasi-blocking queries. The index is not monotonic, nor does it provide provide +// LastContact or KnownLeader. +func (e *Event) List(name string, q *QueryOptions) ([]*UserEvent, *QueryMeta, error) { + r := e.c.newRequest("GET", "/v1/event/list") + r.setQueryOptions(q) + if name != "" { + r.params.Set("name", name) + } + rtt, resp, err := requireOK(e.c.doRequest(r)) + if err != nil { + return nil, nil, err + } + defer resp.Body.Close() + + qm := &QueryMeta{} + parseQueryMeta(resp, qm) + qm.RequestTime = rtt + + var entries []*UserEvent + if err := decodeBody(resp, &entries); err != nil { + return nil, nil, err + } + return entries, qm, nil +} + +// IDToIndex is a bit of a hack. This simulates the index generation to +// convert an event ID into a WaitIndex. +func (e *Event) IDToIndex(uuid string) uint64 { + lower := uuid[0:8] + uuid[9:13] + uuid[14:18] + upper := uuid[19:23] + uuid[24:36] + lowVal, err := strconv.ParseUint(lower, 16, 64) + if err != nil { + panic("Failed to convert " + lower) + } + highVal, err := strconv.ParseUint(upper, 16, 64) + if err != nil { + panic("Failed to convert " + upper) + } + return lowVal ^ highVal +} diff --git a/vendor/github.com/armon/consul-api/event_test.go b/vendor/github.com/armon/consul-api/event_test.go new file mode 100644 index 0000000000..f2be010ad9 --- /dev/null +++ b/vendor/github.com/armon/consul-api/event_test.go @@ -0,0 +1,37 @@ +package consulapi + +import ( + "testing" +) + +func TestEvent_FireList(t *testing.T) { + c := makeClient(t) + event := c.Event() + + params := &UserEvent{Name: "foo"} + id, meta, err := event.Fire(params, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if meta.RequestTime == 0 { + t.Fatalf("bad: %v", meta) + } + + if id == "" { + t.Fatalf("invalid: %v", id) + } + + events, qm, err := event.List("", nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if qm.LastIndex != event.IDToIndex(id) { + t.Fatalf("Bad: %#v", qm) + } + + if events[len(events)-1].ID != id { + t.Fatalf("bad: %#v", events) + } +} diff --git a/vendor/github.com/armon/consul-api/health.go b/vendor/github.com/armon/consul-api/health.go new file mode 100644 index 0000000000..574801e29b --- /dev/null +++ b/vendor/github.com/armon/consul-api/health.go @@ -0,0 +1,136 @@ +package consulapi + +import ( + "fmt" +) + +// HealthCheck is used to represent a single check +type HealthCheck struct { + Node string + CheckID string + Name string + Status string + Notes string + Output string + ServiceID string + ServiceName string +} + +// ServiceEntry is used for the health service endpoint +type ServiceEntry struct { + Node *Node + Service *AgentService + Checks []*HealthCheck +} + +// Health can be used to query the Health endpoints +type Health struct { + c *Client +} + +// Health returns a handle to the health endpoints +func (c *Client) Health() *Health { + return &Health{c} +} + +// Node is used to query for checks belonging to a given node +func (h *Health) Node(node string, q *QueryOptions) ([]*HealthCheck, *QueryMeta, error) { + r := h.c.newRequest("GET", "/v1/health/node/"+node) + r.setQueryOptions(q) + rtt, resp, err := requireOK(h.c.doRequest(r)) + if err != nil { + return nil, nil, err + } + defer resp.Body.Close() + + qm := &QueryMeta{} + parseQueryMeta(resp, qm) + qm.RequestTime = rtt + + var out []*HealthCheck + if err := decodeBody(resp, &out); err != nil { + return nil, nil, err + } + return out, qm, nil +} + +// Checks is used to return the checks associated with a service +func (h *Health) Checks(service string, q *QueryOptions) ([]*HealthCheck, *QueryMeta, error) { + r := h.c.newRequest("GET", "/v1/health/checks/"+service) + r.setQueryOptions(q) + rtt, resp, err := requireOK(h.c.doRequest(r)) + if err != nil { + return nil, nil, err + } + defer resp.Body.Close() + + qm := &QueryMeta{} + parseQueryMeta(resp, qm) + qm.RequestTime = rtt + + var out []*HealthCheck + if err := decodeBody(resp, &out); err != nil { + return nil, nil, err + } + return out, qm, nil +} + +// Service is used to query health information along with service info +// for a given service. It can optionally do server-side filtering on a tag +// or nodes with passing health checks only. +func (h *Health) Service(service, tag string, passingOnly bool, q *QueryOptions) ([]*ServiceEntry, *QueryMeta, error) { + r := h.c.newRequest("GET", "/v1/health/service/"+service) + r.setQueryOptions(q) + if tag != "" { + r.params.Set("tag", tag) + } + if passingOnly { + r.params.Set("passing", "1") + } + rtt, resp, err := requireOK(h.c.doRequest(r)) + if err != nil { + return nil, nil, err + } + defer resp.Body.Close() + + qm := &QueryMeta{} + parseQueryMeta(resp, qm) + qm.RequestTime = rtt + + var out []*ServiceEntry + if err := decodeBody(resp, &out); err != nil { + return nil, nil, err + } + return out, qm, nil +} + +// State is used to retreive all the checks in a given state. +// The wildcard "any" state can also be used for all checks. +func (h *Health) State(state string, q *QueryOptions) ([]*HealthCheck, *QueryMeta, error) { + switch state { + case "any": + case "warning": + case "critical": + case "passing": + case "unknown": + default: + return nil, nil, fmt.Errorf("Unsupported state: %v", state) + } + r := h.c.newRequest("GET", "/v1/health/state/"+state) + r.setQueryOptions(q) + rtt, resp, err := requireOK(h.c.doRequest(r)) + if err != nil { + return nil, nil, err + } + defer resp.Body.Close() + + qm := &QueryMeta{} + parseQueryMeta(resp, qm) + qm.RequestTime = rtt + + var out []*HealthCheck + if err := decodeBody(resp, &out); err != nil { + return nil, nil, err + } + return out, qm, nil +} diff --git a/vendor/github.com/armon/consul-api/health_test.go b/vendor/github.com/armon/consul-api/health_test.go new file mode 100644 index 0000000000..d2b3da2e99 --- /dev/null +++ b/vendor/github.com/armon/consul-api/health_test.go @@ -0,0 +1,98 @@ +package consulapi + +import ( + "testing" + "time" +) + +func TestHealth_Node(t *testing.T) { + c := makeClient(t) + agent := c.Agent() + health := c.Health() + + info, err := agent.Self() + if err != nil { + t.Fatalf("err: %v", err) + } + name := info["Config"]["NodeName"].(string) + + checks, meta, err := health.Node(name, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if meta.LastIndex == 0 { + t.Fatalf("bad: %v", meta) + } + if len(checks) == 0 { + t.Fatalf("Bad: %v", checks) + } +} + +func TestHealth_Checks(t *testing.T) { + c := makeClient(t) + agent := c.Agent() + health := c.Health() + + // Make a service with a check + reg := &AgentServiceRegistration{ + Name: "foo", + Check: &AgentServiceCheck{ + TTL: "15s", + }, + } + if err := agent.ServiceRegister(reg); err != nil { + t.Fatalf("err: %v", err) + } + defer agent.ServiceDeregister("foo") + + // Wait for the register... + time.Sleep(20 * time.Millisecond) + + checks, meta, err := health.Checks("foo", nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if meta.LastIndex == 0 { + t.Fatalf("bad: %v", meta) + } + if len(checks) == 0 { + t.Fatalf("Bad: %v", checks) + } +} + +func TestHealth_Service(t *testing.T) { + c := makeClient(t) + health := c.Health() + + // consul service should always exist... + checks, meta, err := health.Service("consul", "", true, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if meta.LastIndex == 0 { + t.Fatalf("bad: %v", meta) + } + if len(checks) == 0 { + t.Fatalf("Bad: %v", checks) + } +} + +func TestHealth_State(t *testing.T) { + c := makeClient(t) + health := c.Health() + + checks, meta, err := health.State("any", nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if meta.LastIndex == 0 { + t.Fatalf("bad: %v", meta) + } + if len(checks) == 0 { + t.Fatalf("Bad: %v", checks) + } +} diff --git a/vendor/github.com/armon/consul-api/kv.go b/vendor/github.com/armon/consul-api/kv.go new file mode 100644 index 0000000000..98c3b1a035 --- /dev/null +++ b/vendor/github.com/armon/consul-api/kv.go @@ -0,0 +1,219 @@ +package consulapi + +import ( + "bytes" + "fmt" + "io" + "net/http" + "strconv" + "strings" +) + +// KVPair is used to represent a single K/V entry +type KVPair struct { + Key string + CreateIndex uint64 + ModifyIndex uint64 + LockIndex uint64 + Flags uint64 + Value []byte + Session string +} + +// KVPairs is a list of KVPair objects +type KVPairs []*KVPair + +// KV is used to manipulate the K/V API +type KV struct { + c *Client +} + +// KV is used to return a handle to the K/V apis +func (c *Client) KV() *KV { + return &KV{c} +} + +// Get is used to lookup a single key +func (k *KV) Get(key string, q *QueryOptions) (*KVPair, *QueryMeta, error) { + resp, qm, err := k.getInternal(key, nil, q) + if err != nil { + return nil, nil, err + } + if resp == nil { + return nil, qm, nil + } + defer resp.Body.Close() + + var entries []*KVPair + if err := decodeBody(resp, &entries); err != nil { + return nil, nil, err + } + if len(entries) > 0 { + return entries[0], qm, nil + } + return nil, qm, nil +} + +// List is used to lookup all keys under a prefix +func (k *KV) List(prefix string, q *QueryOptions) (KVPairs, *QueryMeta, error) { + resp, qm, err := k.getInternal(prefix, map[string]string{"recurse": ""}, q) + if err != nil { + return nil, nil, err + } + if resp == nil { + return nil, qm, nil + } + defer resp.Body.Close() + + var entries []*KVPair + if err := decodeBody(resp, &entries); err != nil { + return nil, nil, err + } + return entries, qm, nil +} + +// Keys is used to list all the keys under a prefix. Optionally, +// a separator can be used to limit the responses. +func (k *KV) Keys(prefix, separator string, q *QueryOptions) ([]string, *QueryMeta, error) { + params := map[string]string{"keys": ""} + if separator != "" { + params["separator"] = separator + } + resp, qm, err := k.getInternal(prefix, params, q) + if err != nil { + return nil, nil, err + } + if resp == nil { + return nil, qm, nil + } + defer resp.Body.Close() + + var entries []string + if err := decodeBody(resp, &entries); err != nil { + return nil, nil, err + } + return entries, qm, nil +} + +func (k *KV) getInternal(key string, params map[string]string, q *QueryOptions) (*http.Response, *QueryMeta, error) { + r := k.c.newRequest("GET", "/v1/kv/"+key) + r.setQueryOptions(q) + for param, val := range params { + r.params.Set(param, val) + } + rtt, resp, err := k.c.doRequest(r) + if err != nil { + return nil, nil, err + } + + qm := &QueryMeta{} + parseQueryMeta(resp, qm) + qm.RequestTime = rtt + + if resp.StatusCode == 404 { + resp.Body.Close() + return nil, qm, nil + } else if resp.StatusCode != 200 { + resp.Body.Close() + return nil, nil, fmt.Errorf("Unexpected response code: %d", resp.StatusCode) + } + return resp, qm, nil +} + +// Put is used to write a new value. Only the +// Key, Flags and Value is respected. +func (k *KV) Put(p *KVPair, q *WriteOptions) (*WriteMeta, error) { + params := make(map[string]string, 1) + if p.Flags != 0 { + params["flags"] = strconv.FormatUint(p.Flags, 10) + } + _, wm, err := k.put(p.Key, params, p.Value, q) + return wm, err +} + +// CAS is used for a Check-And-Set operation. The Key, +// ModifyIndex, Flags and Value are respected. Returns true +// on success or false on failures. +func (k *KV) CAS(p *KVPair, q *WriteOptions) (bool, *WriteMeta, error) { + params := make(map[string]string, 2) + if p.Flags != 0 { + params["flags"] = strconv.FormatUint(p.Flags, 10) + } + params["cas"] = strconv.FormatUint(p.ModifyIndex, 10) + return k.put(p.Key, params, p.Value, q) +} + +// Acquire is used for a lock acquisiiton operation. The Key, +// Flags, Value and Session are respected. Returns true +// on success or false on failures. +func (k *KV) Acquire(p *KVPair, q *WriteOptions) (bool, *WriteMeta, error) { + params := make(map[string]string, 2) + if p.Flags != 0 { + params["flags"] = strconv.FormatUint(p.Flags, 10) + } + params["acquire"] = p.Session + return k.put(p.Key, params, p.Value, q) +} + +// Release is used for a lock release operation. The Key, +// Flags, Value and Session are respected. Returns true +// on success or false on failures. +func (k *KV) Release(p *KVPair, q *WriteOptions) (bool, *WriteMeta, error) { + params := make(map[string]string, 2) + if p.Flags != 0 { + params["flags"] = strconv.FormatUint(p.Flags, 10) + } + params["release"] = p.Session + return k.put(p.Key, params, p.Value, q) +} + +func (k *KV) put(key string, params map[string]string, body []byte, q *WriteOptions) (bool, *WriteMeta, error) { + r := k.c.newRequest("PUT", "/v1/kv/"+key) + r.setWriteOptions(q) + for param, val := range params { + r.params.Set(param, val) + } + r.body = bytes.NewReader(body) + rtt, resp, err := requireOK(k.c.doRequest(r)) + if err != nil { + return false, nil, err + } + defer resp.Body.Close() + + qm := &WriteMeta{} + qm.RequestTime = rtt + + var buf bytes.Buffer + if _, err := io.Copy(&buf, resp.Body); err != nil { + return false, nil, fmt.Errorf("Failed to read response: %v", err) + } + res := strings.Contains(string(buf.Bytes()), "true") + return res, qm, nil +} + +// Delete is used to delete a single key +func (k *KV) Delete(key string, w *WriteOptions) (*WriteMeta, error) { + return k.deleteInternal(key, nil, w) +} + +// DeleteTree is used to delete all keys under a prefix +func (k *KV) DeleteTree(prefix string, w *WriteOptions) (*WriteMeta, error) { + return k.deleteInternal(prefix, []string{"recurse"}, w) +} + +func (k *KV) deleteInternal(key string, params []string, q *WriteOptions) (*WriteMeta, error) { + r := k.c.newRequest("DELETE", "/v1/kv/"+key) + r.setWriteOptions(q) + for _, param := range params { + r.params.Set(param, "") + } + rtt, resp, err := requireOK(k.c.doRequest(r)) + if err != nil { + return nil, err + } + resp.Body.Close() + + qm := &WriteMeta{} + qm.RequestTime = rtt + return qm, nil +} diff --git a/vendor/github.com/armon/consul-api/kv_test.go b/vendor/github.com/armon/consul-api/kv_test.go new file mode 100644 index 0000000000..2d92d69f62 --- /dev/null +++ b/vendor/github.com/armon/consul-api/kv_test.go @@ -0,0 +1,374 @@ +package consulapi + +import ( + "bytes" + "path" + "testing" + "time" +) + +func TestClientPutGetDelete(t *testing.T) { + c := makeClient(t) + kv := c.KV() + + // Get a get without a key + key := testKey() + pair, _, err := kv.Get(key, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + if pair != nil { + t.Fatalf("unexpected value: %#v", pair) + } + + // Put the key + value := []byte("test") + p := &KVPair{Key: key, Flags: 42, Value: value} + if _, err := kv.Put(p, nil); err != nil { + t.Fatalf("err: %v", err) + } + + // Get should work + pair, meta, err := kv.Get(key, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + if pair == nil { + t.Fatalf("expected value: %#v", pair) + } + if !bytes.Equal(pair.Value, value) { + t.Fatalf("unexpected value: %#v", pair) + } + if pair.Flags != 42 { + t.Fatalf("unexpected value: %#v", pair) + } + if meta.LastIndex == 0 { + t.Fatalf("unexpected value: %#v", meta) + } + + // Delete + if _, err := kv.Delete(key, nil); err != nil { + t.Fatalf("err: %v", err) + } + + // Get should fail + pair, _, err = kv.Get(key, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + if pair != nil { + t.Fatalf("unexpected value: %#v", pair) + } +} + +func TestClient_List_DeleteRecurse(t *testing.T) { + c := makeClient(t) + kv := c.KV() + + // Generate some test keys + prefix := testKey() + var keys []string + for i := 0; i < 100; i++ { + keys = append(keys, path.Join(prefix, testKey())) + } + + // Set values + value := []byte("test") + for _, key := range keys { + p := &KVPair{Key: key, Value: value} + if _, err := kv.Put(p, nil); err != nil { + t.Fatalf("err: %v", err) + } + } + + // List the values + pairs, meta, err := kv.List(prefix, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + if len(pairs) != len(keys) { + t.Fatalf("got %d keys", len(pairs)) + } + for _, pair := range pairs { + if !bytes.Equal(pair.Value, value) { + t.Fatalf("unexpected value: %#v", pair) + } + } + if meta.LastIndex == 0 { + t.Fatalf("unexpected value: %#v", meta) + } + + // Delete all + if _, err := kv.DeleteTree(prefix, nil); err != nil { + t.Fatalf("err: %v", err) + } + + // List the values + pairs, _, err = kv.List(prefix, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + if len(pairs) != 0 { + t.Fatalf("got %d keys", len(pairs)) + } +} + +func TestClient_CAS(t *testing.T) { + c := makeClient(t) + kv := c.KV() + + // Put the key + key := testKey() + value := []byte("test") + p := &KVPair{Key: key, Value: value} + if work, _, err := kv.CAS(p, nil); err != nil { + t.Fatalf("err: %v", err) + } else if !work { + t.Fatalf("CAS failure") + } + + // Get should work + pair, meta, err := kv.Get(key, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + if pair == nil { + t.Fatalf("expected value: %#v", pair) + } + if meta.LastIndex == 0 { + t.Fatalf("unexpected value: %#v", meta) + } + + // CAS update with bad index + newVal := []byte("foo") + p.Value = newVal + p.ModifyIndex = 1 + if work, _, err := kv.CAS(p, nil); err != nil { + t.Fatalf("err: %v", err) + } else if work { + t.Fatalf("unexpected CAS") + } + + // CAS update with valid index + p.ModifyIndex = meta.LastIndex + if work, _, err := kv.CAS(p, nil); err != nil { + t.Fatalf("err: %v", err) + } else if !work { + t.Fatalf("unexpected CAS failure") + } +} + +func TestClient_WatchGet(t *testing.T) { + c := makeClient(t) + kv := c.KV() + + // Get a get without a key + key := testKey() + pair, meta, err := kv.Get(key, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + if pair != nil { + t.Fatalf("unexpected value: %#v", pair) + } + if meta.LastIndex == 0 { + t.Fatalf("unexpected value: %#v", meta) + } + + // Put the key + value := []byte("test") + go func() { + c := makeClient(t) + kv := c.KV() + + time.Sleep(100 * time.Millisecond) + p := &KVPair{Key: key, Flags: 42, Value: value} + if _, err := kv.Put(p, nil); err != nil { + t.Fatalf("err: %v", err) + } + }() + + // Get should work + options := &QueryOptions{WaitIndex: meta.LastIndex} + pair, meta2, err := kv.Get(key, options) + if err != nil { + t.Fatalf("err: %v", err) + } + if pair == nil { + t.Fatalf("expected value: %#v", pair) + } + if !bytes.Equal(pair.Value, value) { + t.Fatalf("unexpected value: %#v", pair) + } + if pair.Flags != 42 { + t.Fatalf("unexpected value: %#v", pair) + } + if meta2.LastIndex <= meta.LastIndex { + t.Fatalf("unexpected value: %#v", meta2) + } +} + +func TestClient_WatchList(t *testing.T) { + c := makeClient(t) + kv := c.KV() + + // Get a get without a key + prefix := testKey() + key := path.Join(prefix, testKey()) + pairs, meta, err := kv.List(prefix, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + if len(pairs) != 0 { + t.Fatalf("unexpected value: %#v", pairs) + } + if meta.LastIndex == 0 { + t.Fatalf("unexpected value: %#v", meta) + } + + // Put the key + value := []byte("test") + go func() { + c := makeClient(t) + kv := c.KV() + + time.Sleep(100 * time.Millisecond) + p := &KVPair{Key: key, Flags: 42, Value: value} + if _, err := kv.Put(p, nil); err != nil { + t.Fatalf("err: %v", err) + } + }() + + // Get should work + options := &QueryOptions{WaitIndex: meta.LastIndex} + pairs, meta2, err := kv.List(prefix, options) + if err != nil { + t.Fatalf("err: %v", err) + } + if len(pairs) != 1 { + t.Fatalf("expected value: %#v", pairs) + } + if !bytes.Equal(pairs[0].Value, value) { + t.Fatalf("unexpected value: %#v", pairs) + } + if pairs[0].Flags != 42 { + t.Fatalf("unexpected value: %#v", pairs) + } + if meta2.LastIndex <= meta.LastIndex { + t.Fatalf("unexpected value: %#v", meta2) + } + +} + +func TestClient_Keys_DeleteRecurse(t *testing.T) { + c := makeClient(t) + kv := c.KV() + + // Generate some test keys + prefix := testKey() + var keys []string + for i := 0; i < 100; i++ { + keys = append(keys, path.Join(prefix, testKey())) + } + + // Set values + value := []byte("test") + for _, key := range keys { + p := &KVPair{Key: key, Value: value} + if _, err := kv.Put(p, nil); err != nil { + t.Fatalf("err: %v", err) + } + } + + // List the values + out, meta, err := kv.Keys(prefix, "", nil) + if err != nil { + t.Fatalf("err: %v", err) + } + if len(out) != len(keys) { + t.Fatalf("got %d keys", len(out)) + } + if meta.LastIndex == 0 { + t.Fatalf("unexpected value: %#v", meta) + } + + // Delete all + if _, err := kv.DeleteTree(prefix, nil); err != nil { + t.Fatalf("err: %v", err) + } + + // List the values + out, _, err = kv.Keys(prefix, "", nil) + if err != nil { + t.Fatalf("err: %v", err) + } + if len(out) != 0 { + t.Fatalf("got %d keys", len(out)) + } +} + +func TestClient_AcquireRelease(t *testing.T) { + c := makeClient(t) + session := c.Session() + kv := c.KV() + + // Make a session + id, _, err := session.CreateNoChecks(nil, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + defer session.Destroy(id, nil) + + // Acquire the key + key := testKey() + value := []byte("test") + p := &KVPair{Key: key, Value: value, Session: id} + if work, _, err := kv.Acquire(p, nil); err != nil { + t.Fatalf("err: %v", err) + } else if !work { + t.Fatalf("Lock failure") + } + + // Get should work + pair, meta, err := kv.Get(key, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + if pair == nil { + t.Fatalf("expected value: %#v", pair) + } + if pair.LockIndex != 1 { + t.Fatalf("Expected lock: %v", pair) + } + if pair.Session != id { + t.Fatalf("Expected lock: %v", pair) + } + if meta.LastIndex == 0 { + t.Fatalf("unexpected value: %#v", meta) + } + + // Release + if work, _, err := kv.Release(p, nil); err != nil { + t.Fatalf("err: %v", err) + } else if !work { + t.Fatalf("Release fail") + } + + // Get should work + pair, meta, err = kv.Get(key, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + if pair == nil { + t.Fatalf("expected value: %#v", pair) + } + if pair.LockIndex != 1 { + t.Fatalf("Expected lock: %v", pair) + } + if pair.Session != "" { + t.Fatalf("Expected unlock: %v", pair) + } + if meta.LastIndex == 0 { + t.Fatalf("unexpected value: %#v", meta) + } +} diff --git a/vendor/github.com/armon/consul-api/session.go b/vendor/github.com/armon/consul-api/session.go new file mode 100644 index 0000000000..4fbfc5ee9a --- /dev/null +++ b/vendor/github.com/armon/consul-api/session.go @@ -0,0 +1,204 @@ +package consulapi + +import ( + "time" +) + +// SessionEntry represents a session in consul +type SessionEntry struct { + CreateIndex uint64 + ID string + Name string + Node string + Checks []string + LockDelay time.Duration + Behavior string + TTL string +} + +// Session can be used to query the Session endpoints +type Session struct { + c *Client +} + +// Session returns a handle to the session endpoints +func (c *Client) Session() *Session { + return &Session{c} +} + +// CreateNoChecks is like Create but is used specifically to create +// a session with no associated health checks. +func (s *Session) CreateNoChecks(se *SessionEntry, q *WriteOptions) (string, *WriteMeta, error) { + body := make(map[string]interface{}) + body["Checks"] = []string{} + if se != nil { + if se.Name != "" { + body["Name"] = se.Name + } + if se.Node != "" { + body["Node"] = se.Node + } + if se.LockDelay != 0 { + body["LockDelay"] = durToMsec(se.LockDelay) + } + if se.Behavior != "" { + body["Behavior"] = se.Behavior + } + if se.TTL != "" { + body["TTL"] = se.TTL + } + } + return s.create(body, q) + +} + +// Create makes a new session. Providing a session entry can +// customize the session. It can also be nil to use defaults. +func (s *Session) Create(se *SessionEntry, q *WriteOptions) (string, *WriteMeta, error) { + var obj interface{} + if se != nil { + body := make(map[string]interface{}) + obj = body + if se.Name != "" { + body["Name"] = se.Name + } + if se.Node != "" { + body["Node"] = se.Node + } + if se.LockDelay != 0 { + body["LockDelay"] = durToMsec(se.LockDelay) + } + if len(se.Checks) > 0 { + body["Checks"] = se.Checks + } + if se.Behavior != "" { + body["Behavior"] = se.Behavior + } + if se.TTL != "" { + body["TTL"] = se.TTL + } + } + return s.create(obj, q) +} + +func (s *Session) create(obj interface{}, q *WriteOptions) (string, *WriteMeta, error) { + r := s.c.newRequest("PUT", "/v1/session/create") + r.setWriteOptions(q) + r.obj = obj + rtt, resp, err := requireOK(s.c.doRequest(r)) + if err != nil { + return "", nil, err + } + defer resp.Body.Close() + + wm := &WriteMeta{RequestTime: rtt} + var out struct{ ID string } + if err := decodeBody(resp, &out); err != nil { + return "", nil, err + } + return out.ID, wm, nil +} + +// Destroy invalides a given session +func (s *Session) Destroy(id string, q *WriteOptions) (*WriteMeta, error) { + r := s.c.newRequest("PUT", "/v1/session/destroy/"+id) + r.setWriteOptions(q) + rtt, resp, err := requireOK(s.c.doRequest(r)) + if err != nil { + return nil, err + } + resp.Body.Close() + + wm := &WriteMeta{RequestTime: rtt} + return wm, nil +} + +// Renew renews the TTL on a given session +func (s *Session) Renew(id string, q *WriteOptions) (*SessionEntry, *WriteMeta, error) { + r := s.c.newRequest("PUT", "/v1/session/renew/"+id) + r.setWriteOptions(q) + rtt, resp, err := requireOK(s.c.doRequest(r)) + if err != nil { + return nil, nil, err + } + defer resp.Body.Close() + + wm := &WriteMeta{RequestTime: rtt} + + var entries []*SessionEntry + if err := decodeBody(resp, &entries); err != nil { + return nil, wm, err + } + + if len(entries) > 0 { + return entries[0], wm, nil + } + return nil, wm, nil +} + +// Info looks up a single session +func (s *Session) Info(id string, q *QueryOptions) (*SessionEntry, *QueryMeta, error) { + r := s.c.newRequest("GET", "/v1/session/info/"+id) + r.setQueryOptions(q) + rtt, resp, err := requireOK(s.c.doRequest(r)) + if err != nil { + return nil, nil, err + } + defer resp.Body.Close() + + qm := &QueryMeta{} + parseQueryMeta(resp, qm) + qm.RequestTime = rtt + + var entries []*SessionEntry + if err := decodeBody(resp, &entries); err != nil { + return nil, nil, err + } + + if len(entries) > 0 { + return entries[0], qm, nil + } + return nil, qm, nil +} + +// List gets sessions for a node +func (s *Session) Node(node string, q *QueryOptions) ([]*SessionEntry, *QueryMeta, error) { + r := s.c.newRequest("GET", "/v1/session/node/"+node) + r.setQueryOptions(q) + rtt, resp, err := requireOK(s.c.doRequest(r)) + if err != nil { + return nil, nil, err + } + defer resp.Body.Close() + + qm := &QueryMeta{} + parseQueryMeta(resp, qm) + qm.RequestTime = rtt + + var entries []*SessionEntry + if err := decodeBody(resp, &entries); err != nil { + return nil, nil, err + } + return entries, qm, nil +} + +// List gets all active sessions +func (s *Session) List(q *QueryOptions) ([]*SessionEntry, *QueryMeta, error) { + r := s.c.newRequest("GET", "/v1/session/list") + r.setQueryOptions(q) + rtt, resp, err := requireOK(s.c.doRequest(r)) + if err != nil { + return nil, nil, err + } + defer resp.Body.Close() + + qm := &QueryMeta{} + parseQueryMeta(resp, qm) + qm.RequestTime = rtt + + var entries []*SessionEntry + if err := decodeBody(resp, &entries); err != nil { + return nil, nil, err + } + return entries, qm, nil +} diff --git a/vendor/github.com/armon/consul-api/session_test.go b/vendor/github.com/armon/consul-api/session_test.go new file mode 100644 index 0000000000..9351c999ef --- /dev/null +++ b/vendor/github.com/armon/consul-api/session_test.go @@ -0,0 +1,190 @@ +package consulapi + +import ( + "testing" +) + +func TestSession_CreateDestroy(t *testing.T) { + c := makeClient(t) + session := c.Session() + + id, meta, err := session.Create(nil, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if meta.RequestTime == 0 { + t.Fatalf("bad: %v", meta) + } + + if id == "" { + t.Fatalf("invalid: %v", id) + } + + meta, err = session.Destroy(id, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if meta.RequestTime == 0 { + t.Fatalf("bad: %v", meta) + } +} + +func TestSession_CreateRenewDestroy(t *testing.T) { + c := makeClient(t) + session := c.Session() + + se := &SessionEntry{ + TTL: "10s", + } + + id, meta, err := session.Create(se, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + defer session.Destroy(id, nil) + + if meta.RequestTime == 0 { + t.Fatalf("bad: %v", meta) + } + + if id == "" { + t.Fatalf("invalid: %v", id) + } + + if meta.RequestTime == 0 { + t.Fatalf("bad: %v", meta) + } + + renew, meta, err := session.Renew(id, nil) + + if err != nil { + t.Fatalf("err: %v", err) + } + if meta.RequestTime == 0 { + t.Fatalf("bad: %v", meta) + } + + if renew == nil { + t.Fatalf("should get session") + } + + if renew.ID != id { + t.Fatalf("should have matching id") + } + + if renew.TTL != "10s" { + t.Fatalf("should get session with TTL") + } +} + +func TestSession_Info(t *testing.T) { + c := makeClient(t) + session := c.Session() + + id, _, err := session.Create(nil, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + defer session.Destroy(id, nil) + + info, qm, err := session.Info(id, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if qm.LastIndex == 0 { + t.Fatalf("bad: %v", qm) + } + if !qm.KnownLeader { + t.Fatalf("bad: %v", qm) + } + + if info == nil { + t.Fatalf("should get session") + } + if info.CreateIndex == 0 { + t.Fatalf("bad: %v", info) + } + if info.ID != id { + t.Fatalf("bad: %v", info) + } + if info.Name != "" { + t.Fatalf("bad: %v", info) + } + if info.Node == "" { + t.Fatalf("bad: %v", info) + } + if len(info.Checks) == 0 { + t.Fatalf("bad: %v", info) + } + if info.LockDelay == 0 { + t.Fatalf("bad: %v", info) + } + if info.Behavior != "release" { + t.Fatalf("bad: %v", info) + } + if info.TTL != "" { + t.Fatalf("bad: %v", info) + } +} + +func TestSession_Node(t *testing.T) { + c := makeClient(t) + session := c.Session() + + id, _, err := session.Create(nil, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + defer session.Destroy(id, nil) + + info, qm, err := session.Info(id, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + sessions, qm, err := session.Node(info.Node, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if len(sessions) != 1 { + t.Fatalf("bad: %v", sessions) + } + + if qm.LastIndex == 0 { + t.Fatalf("bad: %v", qm) + } + if !qm.KnownLeader { + t.Fatalf("bad: %v", qm) + } +} + +func TestSession_List(t *testing.T) { + c := makeClient(t) + session := c.Session() + + id, _, err := session.Create(nil, nil) + if err != nil { + t.Fatalf("err: %v", err) + } + defer session.Destroy(id, nil) + + sessions, qm, err := session.List(nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if len(sessions) != 1 { + t.Fatalf("bad: %v", sessions) + } + + if qm.LastIndex == 0 { + t.Fatalf("bad: %v", qm) + } + if !qm.KnownLeader { + t.Fatalf("bad: %v", qm) + } +} diff --git a/vendor/github.com/armon/consul-api/status.go b/vendor/github.com/armon/consul-api/status.go new file mode 100644 index 0000000000..21c31982f4 --- /dev/null +++ b/vendor/github.com/armon/consul-api/status.go @@ -0,0 +1,43 @@ +package consulapi + +// Status can be used to query the Status endpoints +type Status struct { + c *Client +} + +// Status returns a handle to the status endpoints +func (c *Client) Status() *Status { + return &Status{c} +} + +// Leader is used to query for a known leader +func (s *Status) Leader() (string, error) { + r := s.c.newRequest("GET", "/v1/status/leader") + _, resp, err := requireOK(s.c.doRequest(r)) + if err != nil { + return "", err + } + defer resp.Body.Close() + + var leader string + if err := decodeBody(resp, &leader); err != nil { + return "", err + } + return leader, nil +} + +// Peers is used to query for a known raft peers +func (s *Status) Peers() ([]string, error) { + r := s.c.newRequest("GET", "/v1/status/peers") + _, resp, err := requireOK(s.c.doRequest(r)) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + var peers []string + if err := decodeBody(resp, &peers); err != nil { + return nil, err + } + return peers, nil +} diff --git a/vendor/github.com/armon/consul-api/status_test.go b/vendor/github.com/armon/consul-api/status_test.go new file mode 100644 index 0000000000..ab9b42f503 --- /dev/null +++ b/vendor/github.com/armon/consul-api/status_test.go @@ -0,0 +1,31 @@ +package consulapi + +import ( + "testing" +) + +func TestStatusLeader(t *testing.T) { + c := makeClient(t) + status := c.Status() + + leader, err := status.Leader() + if err != nil { + t.Fatalf("err: %v", err) + } + if leader == "" { + t.Fatalf("Expected leader") + } +} + +func TestStatusPeers(t *testing.T) { + c := makeClient(t) + status := c.Status() + + peers, err := status.Peers() + if err != nil { + t.Fatalf("err: %v", err) + } + if len(peers) == 0 { + t.Fatalf("Expected peers ") + } +} diff --git a/vendor/github.com/coreos/go-etcd/.gitignore b/vendor/github.com/coreos/go-etcd/.gitignore new file mode 100644 index 0000000000..d344ba6b06 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/.gitignore @@ -0,0 +1 @@ +config.json diff --git a/vendor/github.com/coreos/go-etcd/LICENSE b/vendor/github.com/coreos/go-etcd/LICENSE new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/coreos/go-etcd/README.md b/vendor/github.com/coreos/go-etcd/README.md new file mode 100644 index 0000000000..4cd43d1bff --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/README.md @@ -0,0 +1,58 @@ +# go-etcd + +[![GoDoc](https://godoc.org/github.com/coreos/go-etcd/etcd?status.png)](https://godoc.org/github.com/coreos/go-etcd/etcd) + +# DEPRECATED + +etcd now has an [official Go client](https://github.com/coreos/etcd/tree/master/client), which has +a nicer API and better support. + +We strongly suggest you use the official Go client instead of go-etcd in your new projects. +For existing projects, we suggest you migrate to the official Go client. + +## Usage + +The current version of go-etcd supports etcd v2.0+, if you need support for etcd v0.4 please use go-etcd from the [release-0.4](https://github.com/coreos/go-etcd/tree/release-0.4) branch. + +``` +package main + +import ( + "log" + + "github.com/coreos/go-etcd/etcd" +) + +func main() { + machines := []string{"http://127.0.0.1:2379"} + client := etcd.NewClient(machines) + + if _, err := client.Set("/foo", "bar", 0); err != nil { + log.Fatal(err) + } +} +``` + +## Install + +```bash +go get github.com/coreos/go-etcd/etcd +``` + +## Caveat + +1. go-etcd always talks to one member if the member works well. This saves socket resources, and improves efficiency for both client and server side. It doesn't hurt the consistent view of the client because each etcd member has data replication. + +2. go-etcd does round-robin rotation when it fails to connect the member in use. For example, if the member that go-etcd connects to is hard killed, go-etcd will fail on the first attempt with the killed member, and succeed on the second attempt with another member. The default CheckRetry function does 2*machine_number retries before returning error. + +3. The default transport in go-etcd sets 1s DialTimeout and 1s TCP keepalive period. A customized transport could be set by calling `Client.SetTransport`. + +4. Default go-etcd cannot handle the case that the remote server is SIGSTOPed now. TCP keepalive mechanism doesn't help in this scenario because operating system may still send TCP keep-alive packets. We will improve it, but it is not in high priority because we don't see a solid real-life case which server is stopped but connection is alive. + +5. go-etcd is not thread-safe, and it may have race when switching member or updating cluster. + +6. go-etcd cannot detect whether the member in use is healthy when doing read requests. If the member is isolated from the cluster, go-etcd may retrieve outdated data. We will improve this. + +## License + +See LICENSE file. diff --git a/vendor/github.com/coreos/go-etcd/etcd/add_child.go b/vendor/github.com/coreos/go-etcd/etcd/add_child.go new file mode 100644 index 0000000000..7122be049e --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/add_child.go @@ -0,0 +1,23 @@ +package etcd + +// Add a new directory with a random etcd-generated key under the given path. +func (c *Client) AddChildDir(key string, ttl uint64) (*Response, error) { + raw, err := c.post(key, "", ttl) + + if err != nil { + return nil, err + } + + return raw.Unmarshal() +} + +// Add a new file with a random etcd-generated key under the given path. +func (c *Client) AddChild(key string, value string, ttl uint64) (*Response, error) { + raw, err := c.post(key, value, ttl) + + if err != nil { + return nil, err + } + + return raw.Unmarshal() +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/add_child_test.go b/vendor/github.com/coreos/go-etcd/etcd/add_child_test.go new file mode 100644 index 0000000000..26223ff1c8 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/add_child_test.go @@ -0,0 +1,73 @@ +package etcd + +import "testing" + +func TestAddChild(t *testing.T) { + c := NewClient(nil) + defer func() { + c.Delete("fooDir", true) + c.Delete("nonexistentDir", true) + }() + + c.CreateDir("fooDir", 5) + + _, err := c.AddChild("fooDir", "v0", 5) + if err != nil { + t.Fatal(err) + } + + _, err = c.AddChild("fooDir", "v1", 5) + if err != nil { + t.Fatal(err) + } + + resp, err := c.Get("fooDir", true, false) + // The child with v0 should proceed the child with v1 because it's added + // earlier, so it should have a lower key. + if !(len(resp.Node.Nodes) == 2 && (resp.Node.Nodes[0].Value == "v0" && resp.Node.Nodes[1].Value == "v1")) { + t.Fatalf("AddChild 1 failed. There should be two chlidren whose values are v0 and v1, respectively."+ + " The response was: %#v", resp) + } + + // Creating a child under a nonexistent directory should succeed. + // The directory should be created. + resp, err = c.AddChild("nonexistentDir", "foo", 5) + if err != nil { + t.Fatal(err) + } +} + +func TestAddChildDir(t *testing.T) { + c := NewClient(nil) + defer func() { + c.Delete("fooDir", true) + c.Delete("nonexistentDir", true) + }() + + c.CreateDir("fooDir", 5) + + _, err := c.AddChildDir("fooDir", 5) + if err != nil { + t.Fatal(err) + } + + _, err = c.AddChildDir("fooDir", 5) + if err != nil { + t.Fatal(err) + } + + resp, err := c.Get("fooDir", true, false) + // The child with v0 should proceed the child with v1 because it's added + // earlier, so it should have a lower key. + if !(len(resp.Node.Nodes) == 2 && (len(resp.Node.Nodes[0].Nodes) == 0 && len(resp.Node.Nodes[1].Nodes) == 0)) { + t.Fatalf("AddChildDir 1 failed. There should be two chlidren whose values are v0 and v1, respectively."+ + " The response was: %#v", resp) + } + + // Creating a child under a nonexistent directory should succeed. + // The directory should be created. + resp, err = c.AddChildDir("nonexistentDir", 5) + if err != nil { + t.Fatal(err) + } +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/client.go b/vendor/github.com/coreos/go-etcd/etcd/client.go new file mode 100644 index 0000000000..60ed762b99 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/client.go @@ -0,0 +1,476 @@ +package etcd + +import ( + "crypto/tls" + "crypto/x509" + "encoding/json" + "errors" + "io" + "io/ioutil" + "math/rand" + "net" + "net/http" + "net/url" + "os" + "path" + "strings" + "time" +) + +// See SetConsistency for how to use these constants. +const ( + // Using strings rather than iota because the consistency level + // could be persisted to disk, so it'd be better to use + // human-readable values. + STRONG_CONSISTENCY = "STRONG" + WEAK_CONSISTENCY = "WEAK" +) + +const ( + defaultBufferSize = 10 +) + +func init() { + rand.Seed(int64(time.Now().Nanosecond())) +} + +type Config struct { + CertFile string `json:"certFile"` + KeyFile string `json:"keyFile"` + CaCertFile []string `json:"caCertFiles"` + DialTimeout time.Duration `json:"timeout"` + Consistency string `json:"consistency"` +} + +type credentials struct { + username string + password string +} + +type Client struct { + config Config `json:"config"` + cluster *Cluster `json:"cluster"` + httpClient *http.Client + credentials *credentials + transport *http.Transport + persistence io.Writer + cURLch chan string + // CheckRetry can be used to control the policy for failed requests + // and modify the cluster if needed. + // The client calls it before sending requests again, and + // stops retrying if CheckRetry returns some error. The cases that + // this function needs to handle include no response and unexpected + // http status code of response. + // If CheckRetry is nil, client will call the default one + // `DefaultCheckRetry`. + // Argument cluster is the etcd.Cluster object that these requests have been made on. + // Argument numReqs is the number of http.Requests that have been made so far. + // Argument lastResp is the http.Responses from the last request. + // Argument err is the reason of the failure. + CheckRetry func(cluster *Cluster, numReqs int, + lastResp http.Response, err error) error +} + +// NewClient create a basic client that is configured to be used +// with the given machine list. +func NewClient(machines []string) *Client { + config := Config{ + // default timeout is one second + DialTimeout: time.Second, + Consistency: WEAK_CONSISTENCY, + } + + client := &Client{ + cluster: NewCluster(machines), + config: config, + } + + client.initHTTPClient() + client.saveConfig() + + return client +} + +// NewTLSClient create a basic client with TLS configuration +func NewTLSClient(machines []string, cert, key, caCert string) (*Client, error) { + // overwrite the default machine to use https + if len(machines) == 0 { + machines = []string{"https://127.0.0.1:4001"} + } + + config := Config{ + // default timeout is one second + DialTimeout: time.Second, + Consistency: WEAK_CONSISTENCY, + CertFile: cert, + KeyFile: key, + CaCertFile: make([]string, 0), + } + + client := &Client{ + cluster: NewCluster(machines), + config: config, + } + + err := client.initHTTPSClient(cert, key) + if err != nil { + return nil, err + } + + err = client.AddRootCA(caCert) + + client.saveConfig() + + return client, nil +} + +// NewClientFromFile creates a client from a given file path. +// The given file is expected to use the JSON format. +func NewClientFromFile(fpath string) (*Client, error) { + fi, err := os.Open(fpath) + if err != nil { + return nil, err + } + + defer func() { + if err := fi.Close(); err != nil { + panic(err) + } + }() + + return NewClientFromReader(fi) +} + +// NewClientFromReader creates a Client configured from a given reader. +// The configuration is expected to use the JSON format. +func NewClientFromReader(reader io.Reader) (*Client, error) { + c := new(Client) + + b, err := ioutil.ReadAll(reader) + if err != nil { + return nil, err + } + + err = json.Unmarshal(b, c) + if err != nil { + return nil, err + } + if c.config.CertFile == "" { + c.initHTTPClient() + } else { + err = c.initHTTPSClient(c.config.CertFile, c.config.KeyFile) + } + + if err != nil { + return nil, err + } + + for _, caCert := range c.config.CaCertFile { + if err := c.AddRootCA(caCert); err != nil { + return nil, err + } + } + + return c, nil +} + +// Override the Client's HTTP Transport object +func (c *Client) SetTransport(tr *http.Transport) { + c.httpClient.Transport = tr + c.transport = tr +} + +func (c *Client) SetCredentials(username, password string) { + c.credentials = &credentials{username, password} +} + +func (c *Client) Close() { + c.transport.DisableKeepAlives = true + c.transport.CloseIdleConnections() +} + +// initHTTPClient initializes a HTTP client for etcd client +func (c *Client) initHTTPClient() { + c.transport = &http.Transport{ + Dial: c.DefaultDial, + TLSClientConfig: &tls.Config{ + InsecureSkipVerify: true, + }, + } + c.httpClient = &http.Client{Transport: c.transport} +} + +// initHTTPClient initializes a HTTPS client for etcd client +func (c *Client) initHTTPSClient(cert, key string) error { + if cert == "" || key == "" { + return errors.New("Require both cert and key path") + } + + tlsCert, err := tls.LoadX509KeyPair(cert, key) + if err != nil { + return err + } + + tlsConfig := &tls.Config{ + Certificates: []tls.Certificate{tlsCert}, + InsecureSkipVerify: true, + } + + c.transport = &http.Transport{ + TLSClientConfig: tlsConfig, + Dial: c.DefaultDial, + } + + c.httpClient = &http.Client{Transport: c.transport} + return nil +} + +// SetPersistence sets a writer to which the config will be +// written every time it's changed. +func (c *Client) SetPersistence(writer io.Writer) { + c.persistence = writer +} + +// SetConsistency changes the consistency level of the client. +// +// When consistency is set to STRONG_CONSISTENCY, all requests, +// including GET, are sent to the leader. This means that, assuming +// the absence of leader failures, GET requests are guaranteed to see +// the changes made by previous requests. +// +// When consistency is set to WEAK_CONSISTENCY, other requests +// are still sent to the leader, but GET requests are sent to a +// random server from the server pool. This reduces the read +// load on the leader, but it's not guaranteed that the GET requests +// will see changes made by previous requests (they might have not +// yet been committed on non-leader servers). +func (c *Client) SetConsistency(consistency string) error { + if !(consistency == STRONG_CONSISTENCY || consistency == WEAK_CONSISTENCY) { + return errors.New("The argument must be either STRONG_CONSISTENCY or WEAK_CONSISTENCY.") + } + c.config.Consistency = consistency + return nil +} + +// Sets the DialTimeout value +func (c *Client) SetDialTimeout(d time.Duration) { + c.config.DialTimeout = d +} + +// AddRootCA adds a root CA cert for the etcd client +func (c *Client) AddRootCA(caCert string) error { + if c.httpClient == nil { + return errors.New("Client has not been initialized yet!") + } + + certBytes, err := ioutil.ReadFile(caCert) + if err != nil { + return err + } + + tr, ok := c.httpClient.Transport.(*http.Transport) + + if !ok { + panic("AddRootCA(): Transport type assert should not fail") + } + + if tr.TLSClientConfig.RootCAs == nil { + caCertPool := x509.NewCertPool() + ok = caCertPool.AppendCertsFromPEM(certBytes) + if ok { + tr.TLSClientConfig.RootCAs = caCertPool + } + tr.TLSClientConfig.InsecureSkipVerify = false + } else { + ok = tr.TLSClientConfig.RootCAs.AppendCertsFromPEM(certBytes) + } + + if !ok { + err = errors.New("Unable to load caCert") + } + + c.config.CaCertFile = append(c.config.CaCertFile, caCert) + c.saveConfig() + + return err +} + +// SetCluster updates cluster information using the given machine list. +func (c *Client) SetCluster(machines []string) bool { + success := c.internalSyncCluster(machines) + return success +} + +func (c *Client) GetCluster() []string { + return c.cluster.Machines +} + +// SyncCluster updates the cluster information using the internal machine list. +// If no members are found, the intenral machine list is left untouched. +func (c *Client) SyncCluster() bool { + return c.internalSyncCluster(c.cluster.Machines) +} + +// internalSyncCluster syncs cluster information using the given machine list. +func (c *Client) internalSyncCluster(machines []string) bool { + // comma-separated list of machines in the cluster. + members := "" + + for _, machine := range machines { + httpPath := c.createHttpPath(machine, path.Join(version, "members")) + resp, err := c.httpClient.Get(httpPath) + if err != nil { + // try another machine in the cluster + continue + } + + if resp.StatusCode != http.StatusOK { // fall-back to old endpoint + httpPath := c.createHttpPath(machine, path.Join(version, "machines")) + resp, err := c.httpClient.Get(httpPath) + if err != nil { + // try another machine in the cluster + continue + } + b, err := ioutil.ReadAll(resp.Body) + resp.Body.Close() + if err != nil { + // try another machine in the cluster + continue + } + members = string(b) + } else { + b, err := ioutil.ReadAll(resp.Body) + resp.Body.Close() + if err != nil { + // try another machine in the cluster + continue + } + + var mCollection memberCollection + if err := json.Unmarshal(b, &mCollection); err != nil { + // try another machine + continue + } + + urls := make([]string, 0) + for _, m := range mCollection { + urls = append(urls, m.ClientURLs...) + } + + members = strings.Join(urls, ",") + } + + // We should never do an empty cluster update. + if members == "" { + continue + } + + // update Machines List + c.cluster.updateFromStr(members) + logger.Debug("sync.machines ", c.cluster.Machines) + c.saveConfig() + return true + } + + return false +} + +// createHttpPath creates a complete HTTP URL. +// serverName should contain both the host name and a port number, if any. +func (c *Client) createHttpPath(serverName string, _path string) string { + u, err := url.Parse(serverName) + if err != nil { + panic(err) + } + + u.Path = path.Join(u.Path, _path) + + if u.Scheme == "" { + u.Scheme = "http" + } + return u.String() +} + +// DefaultDial attempts to open a TCP connection to the provided address, explicitly +// enabling keep-alives with a one-second interval. +func (c *Client) DefaultDial(network, addr string) (net.Conn, error) { + dialer := net.Dialer{ + Timeout: c.config.DialTimeout, + KeepAlive: time.Second, + } + + return dialer.Dial(network, addr) +} + +func (c *Client) OpenCURL() { + c.cURLch = make(chan string, defaultBufferSize) +} + +func (c *Client) CloseCURL() { + c.cURLch = nil +} + +func (c *Client) sendCURL(command string) { + go func() { + select { + case c.cURLch <- command: + default: + } + }() +} + +func (c *Client) RecvCURL() string { + return <-c.cURLch +} + +// saveConfig saves the current config using c.persistence. +func (c *Client) saveConfig() error { + if c.persistence != nil { + b, err := json.Marshal(c) + if err != nil { + return err + } + + _, err = c.persistence.Write(b) + if err != nil { + return err + } + } + + return nil +} + +// MarshalJSON implements the Marshaller interface +// as defined by the standard JSON package. +func (c *Client) MarshalJSON() ([]byte, error) { + b, err := json.Marshal(struct { + Config Config `json:"config"` + Cluster *Cluster `json:"cluster"` + }{ + Config: c.config, + Cluster: c.cluster, + }) + + if err != nil { + return nil, err + } + + return b, nil +} + +// UnmarshalJSON implements the Unmarshaller interface +// as defined by the standard JSON package. +func (c *Client) UnmarshalJSON(b []byte) error { + temp := struct { + Config Config `json:"config"` + Cluster *Cluster `json:"cluster"` + }{} + err := json.Unmarshal(b, &temp) + if err != nil { + return err + } + + c.cluster = temp.Cluster + c.config = temp.Config + return nil +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/client_test.go b/vendor/github.com/coreos/go-etcd/etcd/client_test.go new file mode 100644 index 0000000000..4720d8d693 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/client_test.go @@ -0,0 +1,108 @@ +package etcd + +import ( + "encoding/json" + "fmt" + "net" + "net/url" + "os" + "testing" +) + +// To pass this test, we need to create a cluster of 3 machines +// The server should be listening on localhost:4001, 4002, 4003 +func TestSync(t *testing.T) { + fmt.Println("Make sure there are three nodes at 0.0.0.0:4001-4003") + + // Explicit trailing slash to ensure this doesn't reproduce: + // https://github.com/coreos/go-etcd/issues/82 + c := NewClient([]string{"http://127.0.0.1:4001/"}) + + success := c.SyncCluster() + if !success { + t.Fatal("cannot sync machines") + } + + for _, m := range c.GetCluster() { + u, err := url.Parse(m) + if err != nil { + t.Fatal(err) + } + if u.Scheme != "http" { + t.Fatal("scheme must be http") + } + + host, _, err := net.SplitHostPort(u.Host) + if err != nil { + t.Fatal(err) + } + if host != "localhost" { + t.Fatal("Host must be localhost") + } + } + + badMachines := []string{"abc", "edef"} + + success = c.SetCluster(badMachines) + + if success { + t.Fatal("should not sync on bad machines") + } + + goodMachines := []string{"127.0.0.1:4002"} + + success = c.SetCluster(goodMachines) + + if !success { + t.Fatal("cannot sync machines") + } else { + fmt.Println(c.cluster.Machines) + } + +} + +func TestPersistence(t *testing.T) { + c := NewClient(nil) + c.SyncCluster() + + fo, err := os.Create("config.json") + if err != nil { + t.Fatal(err) + } + defer func() { + if err := fo.Close(); err != nil { + panic(err) + } + }() + + c.SetPersistence(fo) + err = c.saveConfig() + if err != nil { + t.Fatal(err) + } + + c2, err := NewClientFromFile("config.json") + if err != nil { + t.Fatal(err) + } + + // Verify that the two clients have the same config + b1, _ := json.Marshal(c) + b2, _ := json.Marshal(c2) + + if string(b1) != string(b2) { + t.Fatalf("The two configs should be equal!") + } +} + +func TestClientRetry(t *testing.T) { + c := NewClient([]string{"http://strange", "http://127.0.0.1:4001"}) + // use first endpoint as the picked url + c.cluster.picked = 0 + if _, err := c.Set("foo", "bar", 5); err != nil { + t.Fatal(err) + } + if _, err := c.Delete("foo", true); err != nil { + t.Fatal(err) + } +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/cluster.go b/vendor/github.com/coreos/go-etcd/etcd/cluster.go new file mode 100644 index 0000000000..d0461e17a2 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/cluster.go @@ -0,0 +1,54 @@ +package etcd + +import ( + "math/rand" + "strings" + "sync" +) + +type Cluster struct { + Leader string `json:"leader"` + Machines []string `json:"machines"` + picked int + mu sync.RWMutex +} + +func NewCluster(machines []string) *Cluster { + // if an empty slice was sent in then just assume HTTP 4001 on localhost + if len(machines) == 0 { + machines = []string{"http://127.0.0.1:4001"} + } + + machines = shuffleStringSlice(machines) + logger.Debug("Shuffle cluster machines", machines) + // default leader and machines + return &Cluster{ + Leader: "", + Machines: machines, + picked: rand.Intn(len(machines)), + } +} + +func (cl *Cluster) failure() { + cl.mu.Lock() + defer cl.mu.Unlock() + cl.picked = (cl.picked + 1) % len(cl.Machines) +} + +func (cl *Cluster) pick() string { + cl.mu.Lock() + defer cl.mu.Unlock() + return cl.Machines[cl.picked] +} + +func (cl *Cluster) updateFromStr(machines string) { + cl.mu.Lock() + defer cl.mu.Unlock() + + cl.Machines = strings.Split(machines, ",") + for i := range cl.Machines { + cl.Machines[i] = strings.TrimSpace(cl.Machines[i]) + } + cl.Machines = shuffleStringSlice(cl.Machines) + cl.picked = rand.Intn(len(cl.Machines)) +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/compare_and_delete.go b/vendor/github.com/coreos/go-etcd/etcd/compare_and_delete.go new file mode 100644 index 0000000000..11131bb760 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/compare_and_delete.go @@ -0,0 +1,34 @@ +package etcd + +import "fmt" + +func (c *Client) CompareAndDelete(key string, prevValue string, prevIndex uint64) (*Response, error) { + raw, err := c.RawCompareAndDelete(key, prevValue, prevIndex) + if err != nil { + return nil, err + } + + return raw.Unmarshal() +} + +func (c *Client) RawCompareAndDelete(key string, prevValue string, prevIndex uint64) (*RawResponse, error) { + if prevValue == "" && prevIndex == 0 { + return nil, fmt.Errorf("You must give either prevValue or prevIndex.") + } + + options := Options{} + if prevValue != "" { + options["prevValue"] = prevValue + } + if prevIndex != 0 { + options["prevIndex"] = prevIndex + } + + raw, err := c.delete(key, options) + + if err != nil { + return nil, err + } + + return raw, err +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/compare_and_delete_test.go b/vendor/github.com/coreos/go-etcd/etcd/compare_and_delete_test.go new file mode 100644 index 0000000000..223e50f291 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/compare_and_delete_test.go @@ -0,0 +1,46 @@ +package etcd + +import ( + "testing" +) + +func TestCompareAndDelete(t *testing.T) { + c := NewClient(nil) + defer func() { + c.Delete("foo", true) + }() + + c.Set("foo", "bar", 5) + + // This should succeed an correct prevValue + resp, err := c.CompareAndDelete("foo", "bar", 0) + if err != nil { + t.Fatal(err) + } + if !(resp.PrevNode.Value == "bar" && resp.PrevNode.Key == "/foo" && resp.PrevNode.TTL == 5) { + t.Fatalf("CompareAndDelete 1 prevNode failed: %#v", resp) + } + + resp, _ = c.Set("foo", "bar", 5) + // This should fail because it gives an incorrect prevValue + _, err = c.CompareAndDelete("foo", "xxx", 0) + if err == nil { + t.Fatalf("CompareAndDelete 2 should have failed. The response is: %#v", resp) + } + + // This should succeed because it gives an correct prevIndex + resp, err = c.CompareAndDelete("foo", "", resp.Node.ModifiedIndex) + if err != nil { + t.Fatal(err) + } + if !(resp.PrevNode.Value == "bar" && resp.PrevNode.Key == "/foo" && resp.PrevNode.TTL == 5) { + t.Fatalf("CompareAndSwap 3 prevNode failed: %#v", resp) + } + + c.Set("foo", "bar", 5) + // This should fail because it gives an incorrect prevIndex + resp, err = c.CompareAndDelete("foo", "", 29817514) + if err == nil { + t.Fatalf("CompareAndDelete 4 should have failed. The response is: %#v", resp) + } +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/compare_and_swap.go b/vendor/github.com/coreos/go-etcd/etcd/compare_and_swap.go new file mode 100644 index 0000000000..bb4f90643a --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/compare_and_swap.go @@ -0,0 +1,36 @@ +package etcd + +import "fmt" + +func (c *Client) CompareAndSwap(key string, value string, ttl uint64, + prevValue string, prevIndex uint64) (*Response, error) { + raw, err := c.RawCompareAndSwap(key, value, ttl, prevValue, prevIndex) + if err != nil { + return nil, err + } + + return raw.Unmarshal() +} + +func (c *Client) RawCompareAndSwap(key string, value string, ttl uint64, + prevValue string, prevIndex uint64) (*RawResponse, error) { + if prevValue == "" && prevIndex == 0 { + return nil, fmt.Errorf("You must give either prevValue or prevIndex.") + } + + options := Options{} + if prevValue != "" { + options["prevValue"] = prevValue + } + if prevIndex != 0 { + options["prevIndex"] = prevIndex + } + + raw, err := c.put(key, value, ttl, options) + + if err != nil { + return nil, err + } + + return raw, err +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/compare_and_swap_test.go b/vendor/github.com/coreos/go-etcd/etcd/compare_and_swap_test.go new file mode 100644 index 0000000000..14a1b00f5a --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/compare_and_swap_test.go @@ -0,0 +1,57 @@ +package etcd + +import ( + "testing" +) + +func TestCompareAndSwap(t *testing.T) { + c := NewClient(nil) + defer func() { + c.Delete("foo", true) + }() + + c.Set("foo", "bar", 5) + + // This should succeed + resp, err := c.CompareAndSwap("foo", "bar2", 5, "bar", 0) + if err != nil { + t.Fatal(err) + } + if !(resp.Node.Value == "bar2" && resp.Node.Key == "/foo" && resp.Node.TTL == 5) { + t.Fatalf("CompareAndSwap 1 failed: %#v", resp) + } + + if !(resp.PrevNode.Value == "bar" && resp.PrevNode.Key == "/foo" && resp.PrevNode.TTL == 5) { + t.Fatalf("CompareAndSwap 1 prevNode failed: %#v", resp) + } + + // This should fail because it gives an incorrect prevValue + resp, err = c.CompareAndSwap("foo", "bar3", 5, "xxx", 0) + if err == nil { + t.Fatalf("CompareAndSwap 2 should have failed. The response is: %#v", resp) + } + + resp, err = c.Set("foo", "bar", 5) + if err != nil { + t.Fatal(err) + } + + // This should succeed + resp, err = c.CompareAndSwap("foo", "bar2", 5, "", resp.Node.ModifiedIndex) + if err != nil { + t.Fatal(err) + } + if !(resp.Node.Value == "bar2" && resp.Node.Key == "/foo" && resp.Node.TTL == 5) { + t.Fatalf("CompareAndSwap 3 failed: %#v", resp) + } + + if !(resp.PrevNode.Value == "bar" && resp.PrevNode.Key == "/foo" && resp.PrevNode.TTL == 5) { + t.Fatalf("CompareAndSwap 3 prevNode failed: %#v", resp) + } + + // This should fail because it gives an incorrect prevIndex + resp, err = c.CompareAndSwap("foo", "bar3", 5, "", 29817514) + if err == nil { + t.Fatalf("CompareAndSwap 4 should have failed. The response is: %#v", resp) + } +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/debug.go b/vendor/github.com/coreos/go-etcd/etcd/debug.go new file mode 100644 index 0000000000..0f777886ba --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/debug.go @@ -0,0 +1,55 @@ +package etcd + +import ( + "fmt" + "io/ioutil" + "log" + "strings" +) + +var logger *etcdLogger + +func SetLogger(l *log.Logger) { + logger = &etcdLogger{l} +} + +func GetLogger() *log.Logger { + return logger.log +} + +type etcdLogger struct { + log *log.Logger +} + +func (p *etcdLogger) Debug(args ...interface{}) { + msg := "DEBUG: " + fmt.Sprint(args...) + p.log.Println(msg) +} + +func (p *etcdLogger) Debugf(f string, args ...interface{}) { + msg := "DEBUG: " + fmt.Sprintf(f, args...) + // Append newline if necessary + if !strings.HasSuffix(msg, "\n") { + msg = msg + "\n" + } + p.log.Print(msg) +} + +func (p *etcdLogger) Warning(args ...interface{}) { + msg := "WARNING: " + fmt.Sprint(args...) + p.log.Println(msg) +} + +func (p *etcdLogger) Warningf(f string, args ...interface{}) { + msg := "WARNING: " + fmt.Sprintf(f, args...) + // Append newline if necessary + if !strings.HasSuffix(msg, "\n") { + msg = msg + "\n" + } + p.log.Print(msg) +} + +func init() { + // Default logger uses the go default log. + SetLogger(log.New(ioutil.Discard, "go-etcd", log.LstdFlags)) +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/debug_test.go b/vendor/github.com/coreos/go-etcd/etcd/debug_test.go new file mode 100644 index 0000000000..97f6d1110b --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/debug_test.go @@ -0,0 +1,28 @@ +package etcd + +import ( + "testing" +) + +type Foo struct{} +type Bar struct { + one string + two int +} + +// Tests that logs don't panic with arbitrary interfaces +func TestDebug(t *testing.T) { + f := &Foo{} + b := &Bar{"asfd", 3} + for _, test := range []interface{}{ + 1234, + "asdf", + f, + b, + } { + logger.Debug(test) + logger.Debugf("something, %s", test) + logger.Warning(test) + logger.Warningf("something, %s", test) + } +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/delete.go b/vendor/github.com/coreos/go-etcd/etcd/delete.go new file mode 100644 index 0000000000..b37accd7db --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/delete.go @@ -0,0 +1,40 @@ +package etcd + +// Delete deletes the given key. +// +// When recursive set to false, if the key points to a +// directory the method will fail. +// +// When recursive set to true, if the key points to a file, +// the file will be deleted; if the key points to a directory, +// then everything under the directory (including all child directories) +// will be deleted. +func (c *Client) Delete(key string, recursive bool) (*Response, error) { + raw, err := c.RawDelete(key, recursive, false) + + if err != nil { + return nil, err + } + + return raw.Unmarshal() +} + +// DeleteDir deletes an empty directory or a key value pair +func (c *Client) DeleteDir(key string) (*Response, error) { + raw, err := c.RawDelete(key, false, true) + + if err != nil { + return nil, err + } + + return raw.Unmarshal() +} + +func (c *Client) RawDelete(key string, recursive bool, dir bool) (*RawResponse, error) { + ops := Options{ + "recursive": recursive, + "dir": dir, + } + + return c.delete(key, ops) +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/delete_test.go b/vendor/github.com/coreos/go-etcd/etcd/delete_test.go new file mode 100644 index 0000000000..5904971556 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/delete_test.go @@ -0,0 +1,81 @@ +package etcd + +import ( + "testing" +) + +func TestDelete(t *testing.T) { + c := NewClient(nil) + defer func() { + c.Delete("foo", true) + }() + + c.Set("foo", "bar", 5) + resp, err := c.Delete("foo", false) + if err != nil { + t.Fatal(err) + } + + if !(resp.Node.Value == "") { + t.Fatalf("Delete failed with %s", resp.Node.Value) + } + + if !(resp.PrevNode.Value == "bar") { + t.Fatalf("Delete PrevNode failed with %s", resp.Node.Value) + } + + resp, err = c.Delete("foo", false) + if err == nil { + t.Fatalf("Delete should have failed because the key foo did not exist. "+ + "The response was: %v", resp) + } +} + +func TestDeleteAll(t *testing.T) { + c := NewClient(nil) + defer func() { + c.Delete("foo", true) + c.Delete("fooDir", true) + }() + + c.SetDir("foo", 5) + // test delete an empty dir + resp, err := c.DeleteDir("foo") + if err != nil { + t.Fatal(err) + } + + if !(resp.Node.Value == "") { + t.Fatalf("DeleteAll 1 failed: %#v", resp) + } + + if !(resp.PrevNode.Dir == true && resp.PrevNode.Value == "") { + t.Fatalf("DeleteAll 1 PrevNode failed: %#v", resp) + } + + c.CreateDir("fooDir", 5) + c.Set("fooDir/foo", "bar", 5) + _, err = c.DeleteDir("fooDir") + if err == nil { + t.Fatal("should not able to delete a non-empty dir with deletedir") + } + + resp, err = c.Delete("fooDir", true) + if err != nil { + t.Fatal(err) + } + + if !(resp.Node.Value == "") { + t.Fatalf("DeleteAll 2 failed: %#v", resp) + } + + if !(resp.PrevNode.Dir == true && resp.PrevNode.Value == "") { + t.Fatalf("DeleteAll 2 PrevNode failed: %#v", resp) + } + + resp, err = c.Delete("foo", true) + if err == nil { + t.Fatalf("DeleteAll should have failed because the key foo did not exist. "+ + "The response was: %v", resp) + } +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/error.go b/vendor/github.com/coreos/go-etcd/etcd/error.go new file mode 100644 index 0000000000..66dca54b5c --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/error.go @@ -0,0 +1,49 @@ +package etcd + +import ( + "encoding/json" + "fmt" +) + +const ( + ErrCodeEtcdNotReachable = 501 + ErrCodeUnhandledHTTPStatus = 502 +) + +var ( + errorMap = map[int]string{ + ErrCodeEtcdNotReachable: "All the given peers are not reachable", + } +) + +type EtcdError struct { + ErrorCode int `json:"errorCode"` + Message string `json:"message"` + Cause string `json:"cause,omitempty"` + Index uint64 `json:"index"` +} + +func (e EtcdError) Error() string { + return fmt.Sprintf("%v: %v (%v) [%v]", e.ErrorCode, e.Message, e.Cause, e.Index) +} + +func newError(errorCode int, cause string, index uint64) *EtcdError { + return &EtcdError{ + ErrorCode: errorCode, + Message: errorMap[errorCode], + Cause: cause, + Index: index, + } +} + +func handleError(b []byte) error { + etcdErr := new(EtcdError) + + err := json.Unmarshal(b, etcdErr) + if err != nil { + logger.Warningf("cannot unmarshal etcd error: %v", err) + return err + } + + return etcdErr +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/get.go b/vendor/github.com/coreos/go-etcd/etcd/get.go new file mode 100644 index 0000000000..09fe641c25 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/get.go @@ -0,0 +1,32 @@ +package etcd + +// Get gets the file or directory associated with the given key. +// If the key points to a directory, files and directories under +// it will be returned in sorted or unsorted order, depending on +// the sort flag. +// If recursive is set to false, contents under child directories +// will not be returned. +// If recursive is set to true, all the contents will be returned. +func (c *Client) Get(key string, sort, recursive bool) (*Response, error) { + raw, err := c.RawGet(key, sort, recursive) + + if err != nil { + return nil, err + } + + return raw.Unmarshal() +} + +func (c *Client) RawGet(key string, sort, recursive bool) (*RawResponse, error) { + var q bool + if c.config.Consistency == STRONG_CONSISTENCY { + q = true + } + ops := Options{ + "recursive": recursive, + "sorted": sort, + "quorum": q, + } + + return c.get(key, ops) +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/get_test.go b/vendor/github.com/coreos/go-etcd/etcd/get_test.go new file mode 100644 index 0000000000..279c4e26f8 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/get_test.go @@ -0,0 +1,131 @@ +package etcd + +import ( + "reflect" + "testing" +) + +// cleanNode scrubs Expiration, ModifiedIndex and CreatedIndex of a node. +func cleanNode(n *Node) { + n.Expiration = nil + n.ModifiedIndex = 0 + n.CreatedIndex = 0 +} + +// cleanResult scrubs a result object two levels deep of Expiration, +// ModifiedIndex and CreatedIndex. +func cleanResult(result *Response) { + // TODO(philips): make this recursive. + cleanNode(result.Node) + for i, _ := range result.Node.Nodes { + cleanNode(result.Node.Nodes[i]) + for j, _ := range result.Node.Nodes[i].Nodes { + cleanNode(result.Node.Nodes[i].Nodes[j]) + } + } +} + +func TestGet(t *testing.T) { + c := NewClient(nil) + defer func() { + c.Delete("foo", true) + }() + + c.Set("foo", "bar", 5) + + result, err := c.Get("foo", false, false) + + if err != nil { + t.Fatal(err) + } + + if result.Node.Key != "/foo" || result.Node.Value != "bar" { + t.Fatalf("Get failed with %s %s %v", result.Node.Key, result.Node.Value, result.Node.TTL) + } + + result, err = c.Get("goo", false, false) + if err == nil { + t.Fatalf("should not be able to get non-exist key") + } +} + +func TestGetAll(t *testing.T) { + c := NewClient(nil) + defer func() { + c.Delete("fooDir", true) + }() + + c.CreateDir("fooDir", 5) + c.Set("fooDir/k0", "v0", 5) + c.Set("fooDir/k1", "v1", 5) + + // Return kv-pairs in sorted order + result, err := c.Get("fooDir", true, false) + + if err != nil { + t.Fatal(err) + } + + expected := Nodes{ + &Node{ + Key: "/fooDir/k0", + Value: "v0", + TTL: 5, + }, + &Node{ + Key: "/fooDir/k1", + Value: "v1", + TTL: 5, + }, + } + + cleanResult(result) + + if !reflect.DeepEqual(result.Node.Nodes, expected) { + t.Fatalf("(actual) %v != (expected) %v", result.Node.Nodes, expected) + } + + // Test the `recursive` option + c.CreateDir("fooDir/childDir", 5) + c.Set("fooDir/childDir/k2", "v2", 5) + + // Return kv-pairs in sorted order + result, err = c.Get("fooDir", true, true) + + cleanResult(result) + + if err != nil { + t.Fatal(err) + } + + expected = Nodes{ + &Node{ + Key: "/fooDir/childDir", + Dir: true, + Nodes: Nodes{ + &Node{ + Key: "/fooDir/childDir/k2", + Value: "v2", + TTL: 5, + }, + }, + TTL: 5, + }, + &Node{ + Key: "/fooDir/k0", + Value: "v0", + TTL: 5, + }, + &Node{ + Key: "/fooDir/k1", + Value: "v1", + TTL: 5, + }, + } + + cleanResult(result) + + if !reflect.DeepEqual(result.Node.Nodes, expected) { + t.Fatalf("(actual) %v != (expected) %v", result.Node.Nodes, expected) + } +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/member.go b/vendor/github.com/coreos/go-etcd/etcd/member.go new file mode 100644 index 0000000000..5b13b28e1a --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/member.go @@ -0,0 +1,30 @@ +package etcd + +import "encoding/json" + +type Member struct { + ID string `json:"id"` + Name string `json:"name"` + PeerURLs []string `json:"peerURLs"` + ClientURLs []string `json:"clientURLs"` +} + +type memberCollection []Member + +func (c *memberCollection) UnmarshalJSON(data []byte) error { + d := struct { + Members []Member + }{} + + if err := json.Unmarshal(data, &d); err != nil { + return err + } + + if d.Members == nil { + *c = make([]Member, 0) + return nil + } + + *c = d.Members + return nil +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/member_test.go b/vendor/github.com/coreos/go-etcd/etcd/member_test.go new file mode 100644 index 0000000000..53ebdd4bfd --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/member_test.go @@ -0,0 +1,71 @@ +package etcd + +import ( + "encoding/json" + "reflect" + "testing" +) + +func TestMemberCollectionUnmarshal(t *testing.T) { + tests := []struct { + body []byte + want memberCollection + }{ + { + body: []byte(`{"members":[]}`), + want: memberCollection([]Member{}), + }, + { + body: []byte(`{"members":[{"id":"2745e2525fce8fe","peerURLs":["http://127.0.0.1:7003"],"name":"node3","clientURLs":["http://127.0.0.1:4003"]},{"id":"42134f434382925","peerURLs":["http://127.0.0.1:2380","http://127.0.0.1:7001"],"name":"node1","clientURLs":["http://127.0.0.1:2379","http://127.0.0.1:4001"]},{"id":"94088180e21eb87b","peerURLs":["http://127.0.0.1:7002"],"name":"node2","clientURLs":["http://127.0.0.1:4002"]}]}`), + want: memberCollection( + []Member{ + { + ID: "2745e2525fce8fe", + Name: "node3", + PeerURLs: []string{ + "http://127.0.0.1:7003", + }, + ClientURLs: []string{ + "http://127.0.0.1:4003", + }, + }, + { + ID: "42134f434382925", + Name: "node1", + PeerURLs: []string{ + "http://127.0.0.1:2380", + "http://127.0.0.1:7001", + }, + ClientURLs: []string{ + "http://127.0.0.1:2379", + "http://127.0.0.1:4001", + }, + }, + { + ID: "94088180e21eb87b", + Name: "node2", + PeerURLs: []string{ + "http://127.0.0.1:7002", + }, + ClientURLs: []string{ + "http://127.0.0.1:4002", + }, + }, + }, + ), + }, + } + + for i, tt := range tests { + var got memberCollection + err := json.Unmarshal(tt.body, &got) + if err != nil { + t.Errorf("#%d: unexpected error: %v", i, err) + continue + } + + if !reflect.DeepEqual(tt.want, got) { + t.Errorf("#%d: incorrect output: want=%#v, got=%#v", i, tt.want, got) + } + } +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/options.go b/vendor/github.com/coreos/go-etcd/etcd/options.go new file mode 100644 index 0000000000..d21c96f080 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/options.go @@ -0,0 +1,72 @@ +package etcd + +import ( + "fmt" + "net/url" + "reflect" +) + +type Options map[string]interface{} + +// An internally-used data structure that represents a mapping +// between valid options and their kinds +type validOptions map[string]reflect.Kind + +// Valid options for GET, PUT, POST, DELETE +// Using CAPITALIZED_UNDERSCORE to emphasize that these +// values are meant to be used as constants. +var ( + VALID_GET_OPTIONS = validOptions{ + "recursive": reflect.Bool, + "quorum": reflect.Bool, + "sorted": reflect.Bool, + "wait": reflect.Bool, + "waitIndex": reflect.Uint64, + } + + VALID_PUT_OPTIONS = validOptions{ + "prevValue": reflect.String, + "prevIndex": reflect.Uint64, + "prevExist": reflect.Bool, + "dir": reflect.Bool, + } + + VALID_POST_OPTIONS = validOptions{} + + VALID_DELETE_OPTIONS = validOptions{ + "recursive": reflect.Bool, + "dir": reflect.Bool, + "prevValue": reflect.String, + "prevIndex": reflect.Uint64, + } +) + +// Convert options to a string of HTML parameters +func (ops Options) toParameters(validOps validOptions) (string, error) { + p := "?" + values := url.Values{} + + if ops == nil { + return "", nil + } + + for k, v := range ops { + // Check if the given option is valid (that it exists) + kind := validOps[k] + if kind == reflect.Invalid { + return "", fmt.Errorf("Invalid option: %v", k) + } + + // Check if the given option is of the valid type + t := reflect.TypeOf(v) + if kind != t.Kind() { + return "", fmt.Errorf("Option %s should be of %v kind, not of %v kind.", + k, kind, t.Kind()) + } + + values.Set(k, fmt.Sprintf("%v", v)) + } + + p += values.Encode() + return p, nil +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/requests.go b/vendor/github.com/coreos/go-etcd/etcd/requests.go new file mode 100644 index 0000000000..8f720f6f44 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/requests.go @@ -0,0 +1,403 @@ +package etcd + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "path" + "strings" + "sync" + "time" +) + +// Errors introduced by handling requests +var ( + ErrRequestCancelled = errors.New("sending request is cancelled") +) + +type RawRequest struct { + Method string + RelativePath string + Values url.Values + Cancel <-chan bool +} + +// NewRawRequest returns a new RawRequest +func NewRawRequest(method, relativePath string, values url.Values, cancel <-chan bool) *RawRequest { + return &RawRequest{ + Method: method, + RelativePath: relativePath, + Values: values, + Cancel: cancel, + } +} + +// getCancelable issues a cancelable GET request +func (c *Client) getCancelable(key string, options Options, + cancel <-chan bool) (*RawResponse, error) { + logger.Debugf("get %s [%s]", key, c.cluster.pick()) + p := keyToPath(key) + + str, err := options.toParameters(VALID_GET_OPTIONS) + if err != nil { + return nil, err + } + p += str + + req := NewRawRequest("GET", p, nil, cancel) + resp, err := c.SendRequest(req) + + if err != nil { + return nil, err + } + + return resp, nil +} + +// get issues a GET request +func (c *Client) get(key string, options Options) (*RawResponse, error) { + return c.getCancelable(key, options, nil) +} + +// put issues a PUT request +func (c *Client) put(key string, value string, ttl uint64, + options Options) (*RawResponse, error) { + + logger.Debugf("put %s, %s, ttl: %d, [%s]", key, value, ttl, c.cluster.pick()) + p := keyToPath(key) + + str, err := options.toParameters(VALID_PUT_OPTIONS) + if err != nil { + return nil, err + } + p += str + + req := NewRawRequest("PUT", p, buildValues(value, ttl), nil) + resp, err := c.SendRequest(req) + + if err != nil { + return nil, err + } + + return resp, nil +} + +// post issues a POST request +func (c *Client) post(key string, value string, ttl uint64) (*RawResponse, error) { + logger.Debugf("post %s, %s, ttl: %d, [%s]", key, value, ttl, c.cluster.pick()) + p := keyToPath(key) + + req := NewRawRequest("POST", p, buildValues(value, ttl), nil) + resp, err := c.SendRequest(req) + + if err != nil { + return nil, err + } + + return resp, nil +} + +// delete issues a DELETE request +func (c *Client) delete(key string, options Options) (*RawResponse, error) { + logger.Debugf("delete %s [%s]", key, c.cluster.pick()) + p := keyToPath(key) + + str, err := options.toParameters(VALID_DELETE_OPTIONS) + if err != nil { + return nil, err + } + p += str + + req := NewRawRequest("DELETE", p, nil, nil) + resp, err := c.SendRequest(req) + + if err != nil { + return nil, err + } + + return resp, nil +} + +// SendRequest sends a HTTP request and returns a Response as defined by etcd +func (c *Client) SendRequest(rr *RawRequest) (*RawResponse, error) { + var req *http.Request + var resp *http.Response + var httpPath string + var err error + var respBody []byte + + var numReqs = 1 + + checkRetry := c.CheckRetry + if checkRetry == nil { + checkRetry = DefaultCheckRetry + } + + cancelled := make(chan bool, 1) + reqLock := new(sync.Mutex) + + if rr.Cancel != nil { + cancelRoutine := make(chan bool) + defer close(cancelRoutine) + + go func() { + select { + case <-rr.Cancel: + cancelled <- true + logger.Debug("send.request is cancelled") + case <-cancelRoutine: + return + } + + // Repeat canceling request until this thread is stopped + // because we have no idea about whether it succeeds. + for { + reqLock.Lock() + c.httpClient.Transport.(*http.Transport).CancelRequest(req) + reqLock.Unlock() + + select { + case <-time.After(100 * time.Millisecond): + case <-cancelRoutine: + return + } + } + }() + } + + // If we connect to a follower and consistency is required, retry until + // we connect to a leader + sleep := 25 * time.Millisecond + maxSleep := time.Second + + for attempt := 0; ; attempt++ { + if attempt > 0 { + select { + case <-cancelled: + return nil, ErrRequestCancelled + case <-time.After(sleep): + sleep = sleep * 2 + if sleep > maxSleep { + sleep = maxSleep + } + } + } + + logger.Debug("Connecting to etcd: attempt ", attempt+1, " for ", rr.RelativePath) + + // get httpPath if not set + if httpPath == "" { + httpPath = c.getHttpPath(rr.RelativePath) + } + + // Return a cURL command if curlChan is set + if c.cURLch != nil { + command := fmt.Sprintf("curl -X %s %s", rr.Method, httpPath) + for key, value := range rr.Values { + command += fmt.Sprintf(" -d %s=%s", key, value[0]) + } + if c.credentials != nil { + command += fmt.Sprintf(" -u %s", c.credentials.username) + } + c.sendCURL(command) + } + + logger.Debug("send.request.to ", httpPath, " | method ", rr.Method) + + req, err := func() (*http.Request, error) { + reqLock.Lock() + defer reqLock.Unlock() + + if rr.Values == nil { + if req, err = http.NewRequest(rr.Method, httpPath, nil); err != nil { + return nil, err + } + } else { + body := strings.NewReader(rr.Values.Encode()) + if req, err = http.NewRequest(rr.Method, httpPath, body); err != nil { + return nil, err + } + + req.Header.Set("Content-Type", + "application/x-www-form-urlencoded; param=value") + } + return req, nil + }() + + if err != nil { + return nil, err + } + + if c.credentials != nil { + req.SetBasicAuth(c.credentials.username, c.credentials.password) + } + + resp, err = c.httpClient.Do(req) + // clear previous httpPath + httpPath = "" + defer func() { + if resp != nil { + resp.Body.Close() + } + }() + + // If the request was cancelled, return ErrRequestCancelled directly + select { + case <-cancelled: + return nil, ErrRequestCancelled + default: + } + + numReqs++ + + // network error, change a machine! + if err != nil { + logger.Debug("network error: ", err.Error()) + lastResp := http.Response{} + if checkErr := checkRetry(c.cluster, numReqs, lastResp, err); checkErr != nil { + return nil, checkErr + } + + c.cluster.failure() + continue + } + + // if there is no error, it should receive response + logger.Debug("recv.response.from ", httpPath) + + if validHttpStatusCode[resp.StatusCode] { + // try to read byte code and break the loop + respBody, err = ioutil.ReadAll(resp.Body) + if err == nil { + logger.Debug("recv.success ", httpPath) + break + } + // ReadAll error may be caused due to cancel request + select { + case <-cancelled: + return nil, ErrRequestCancelled + default: + } + + if err == io.ErrUnexpectedEOF { + // underlying connection was closed prematurely, probably by timeout + // TODO: empty body or unexpectedEOF can cause http.Transport to get hosed; + // this allows the client to detect that and take evasive action. Need + // to revisit once code.google.com/p/go/issues/detail?id=8648 gets fixed. + respBody = []byte{} + break + } + } + + if resp.StatusCode == http.StatusTemporaryRedirect { + u, err := resp.Location() + + if err != nil { + logger.Warning(err) + } else { + // set httpPath for following redirection + httpPath = u.String() + } + resp.Body.Close() + continue + } + + if checkErr := checkRetry(c.cluster, numReqs, *resp, + errors.New("Unexpected HTTP status code")); checkErr != nil { + return nil, checkErr + } + resp.Body.Close() + } + + r := &RawResponse{ + StatusCode: resp.StatusCode, + Body: respBody, + Header: resp.Header, + } + + return r, nil +} + +// DefaultCheckRetry defines the retrying behaviour for bad HTTP requests +// If we have retried 2 * machine number, stop retrying. +// If status code is InternalServerError, sleep for 200ms. +func DefaultCheckRetry(cluster *Cluster, numReqs int, lastResp http.Response, + err error) error { + + if numReqs > 2*len(cluster.Machines) { + errStr := fmt.Sprintf("failed to propose on members %v twice [last error: %v]", cluster.Machines, err) + return newError(ErrCodeEtcdNotReachable, errStr, 0) + } + + if isEmptyResponse(lastResp) { + // always retry if it failed to get response from one machine + return nil + } + if !shouldRetry(lastResp) { + body := []byte("nil") + if lastResp.Body != nil { + if b, err := ioutil.ReadAll(lastResp.Body); err == nil { + body = b + } + } + errStr := fmt.Sprintf("unhandled http status [%s] with body [%s]", http.StatusText(lastResp.StatusCode), body) + return newError(ErrCodeUnhandledHTTPStatus, errStr, 0) + } + // sleep some time and expect leader election finish + time.Sleep(time.Millisecond * 200) + logger.Warning("bad response status code ", lastResp.StatusCode) + return nil +} + +func isEmptyResponse(r http.Response) bool { return r.StatusCode == 0 } + +// shouldRetry returns whether the reponse deserves retry. +func shouldRetry(r http.Response) bool { + // TODO: only retry when the cluster is in leader election + // We cannot do it exactly because etcd doesn't support it well. + return r.StatusCode == http.StatusInternalServerError +} + +func (c *Client) getHttpPath(s ...string) string { + fullPath := c.cluster.pick() + "/" + version + for _, seg := range s { + fullPath = fullPath + "/" + seg + } + return fullPath +} + +// buildValues builds a url.Values map according to the given value and ttl +func buildValues(value string, ttl uint64) url.Values { + v := url.Values{} + + if value != "" { + v.Set("value", value) + } + + if ttl > 0 { + v.Set("ttl", fmt.Sprintf("%v", ttl)) + } + + return v +} + +// convert key string to http path exclude version, including URL escaping +// for example: key[foo] -> path[keys/foo] +// key[/%z] -> path[keys/%25z] +// key[/] -> path[keys/] +func keyToPath(key string) string { + // URL-escape our key, except for slashes + p := strings.Replace(url.QueryEscape(path.Join("keys", key)), "%2F", "/", -1) + + // corner case: if key is "/" or "//" ect + // path join will clear the tailing "/" + // we need to add it back + if p == "keys" { + p = "keys/" + } + + return p +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/requests_test.go b/vendor/github.com/coreos/go-etcd/etcd/requests_test.go new file mode 100644 index 0000000000..7a2bd190a1 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/requests_test.go @@ -0,0 +1,22 @@ +package etcd + +import "testing" + +func TestKeyToPath(t *testing.T) { + tests := []struct { + key string + wpath string + }{ + {"", "keys/"}, + {"foo", "keys/foo"}, + {"foo/bar", "keys/foo/bar"}, + {"%z", "keys/%25z"}, + {"/", "keys/"}, + } + for i, tt := range tests { + path := keyToPath(tt.key) + if path != tt.wpath { + t.Errorf("#%d: path = %s, want %s", i, path, tt.wpath) + } + } +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/response.generated.go b/vendor/github.com/coreos/go-etcd/etcd/response.generated.go new file mode 100644 index 0000000000..95d2cd99d4 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/response.generated.go @@ -0,0 +1,1587 @@ +// ************************************************************ +// DO NOT EDIT. +// THIS FILE IS AUTO-GENERATED BY codecgen. +// ************************************************************ + +package etcd + +import ( + "errors" + "fmt" + codec1978 "github.com/ugorji/go/codec" + pkg1_http "net/http" + "reflect" + "runtime" + time "time" +) + +const ( + // ----- content types ---- + codecSelferC_UTF81978 = 1 + codecSelferC_RAW1978 = 0 + // ----- value types used ---- + codecSelferValueTypeArray1978 = 10 + codecSelferValueTypeMap1978 = 9 + // ----- containerStateValues ---- + codecSelfer_containerMapKey1978 = 2 + codecSelfer_containerMapValue1978 = 3 + codecSelfer_containerMapEnd1978 = 4 + codecSelfer_containerArrayElem1978 = 6 + codecSelfer_containerArrayEnd1978 = 7 +) + +var ( + codecSelferBitsize1978 = uint8(reflect.TypeOf(uint(0)).Bits()) + codecSelferOnlyMapOrArrayEncodeToStructErr1978 = errors.New(`only encoded map or array can be decoded into a struct`) +) + +type codecSelfer1978 struct{} + +func init() { + if codec1978.GenVersion != 5 { + _, file, _, _ := runtime.Caller(0) + err := fmt.Errorf("codecgen version mismatch: current: %v, need %v. Re-generate file: %v", + 5, codec1978.GenVersion, file) + panic(err) + } + if false { // reference the types, but skip this branch at build/run time + var v0 pkg1_http.Header + var v1 time.Time + _, _ = v0, v1 + } +} + +func (x responseType) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + r.EncodeInt(int64(x)) + } +} + +func (x *responseType) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym2 := z.DecBinary() + _ = yym2 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + *((*int)(x)) = int(r.DecodeInt(codecSelferBitsize1978)) + } +} + +func (x *RawResponse) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym3 := z.EncBinary() + _ = yym3 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep4 := !z.EncBinary() + yy2arr4 := z.EncBasicHandle().StructToArray + var yyq4 [3]bool + _, _, _ = yysep4, yyq4, yy2arr4 + const yyr4 bool = false + var yynn4 int + if yyr4 || yy2arr4 { + r.EncodeArrayStart(3) + } else { + yynn4 = 3 + for _, b := range yyq4 { + if b { + yynn4++ + } + } + r.EncodeMapStart(yynn4) + yynn4 = 0 + } + if yyr4 || yy2arr4 { + z.EncSendContainerState(codecSelfer_containerArrayElem1978) + yym6 := z.EncBinary() + _ = yym6 + if false { + } else { + r.EncodeInt(int64(x.StatusCode)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1978) + r.EncodeString(codecSelferC_UTF81978, string("StatusCode")) + z.EncSendContainerState(codecSelfer_containerMapValue1978) + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeInt(int64(x.StatusCode)) + } + } + if yyr4 || yy2arr4 { + z.EncSendContainerState(codecSelfer_containerArrayElem1978) + if x.Body == nil { + r.EncodeNil() + } else { + yym9 := z.EncBinary() + _ = yym9 + if false { + } else { + r.EncodeStringBytes(codecSelferC_RAW1978, []byte(x.Body)) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1978) + r.EncodeString(codecSelferC_UTF81978, string("Body")) + z.EncSendContainerState(codecSelfer_containerMapValue1978) + if x.Body == nil { + r.EncodeNil() + } else { + yym10 := z.EncBinary() + _ = yym10 + if false { + } else { + r.EncodeStringBytes(codecSelferC_RAW1978, []byte(x.Body)) + } + } + } + if yyr4 || yy2arr4 { + z.EncSendContainerState(codecSelfer_containerArrayElem1978) + if x.Header == nil { + r.EncodeNil() + } else { + yym12 := z.EncBinary() + _ = yym12 + if false { + } else if z.HasExtensions() && z.EncExt(x.Header) { + } else { + h.enchttp_Header((pkg1_http.Header)(x.Header), e) + } + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1978) + r.EncodeString(codecSelferC_UTF81978, string("Header")) + z.EncSendContainerState(codecSelfer_containerMapValue1978) + if x.Header == nil { + r.EncodeNil() + } else { + yym13 := z.EncBinary() + _ = yym13 + if false { + } else if z.HasExtensions() && z.EncExt(x.Header) { + } else { + h.enchttp_Header((pkg1_http.Header)(x.Header), e) + } + } + } + if yyr4 || yy2arr4 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1978) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1978) + } + } + } +} + +func (x *RawResponse) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym14 := z.DecBinary() + _ = yym14 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct15 := r.ContainerType() + if yyct15 == codecSelferValueTypeMap1978 { + yyl15 := r.ReadMapStart() + if yyl15 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1978) + } else { + x.codecDecodeSelfFromMap(yyl15, d) + } + } else if yyct15 == codecSelferValueTypeArray1978 { + yyl15 := r.ReadArrayStart() + if yyl15 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + } else { + x.codecDecodeSelfFromArray(yyl15, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1978) + } + } +} + +func (x *RawResponse) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys16Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys16Slc + var yyhl16 bool = l >= 0 + for yyj16 := 0; ; yyj16++ { + if yyhl16 { + if yyj16 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1978) + yys16Slc = r.DecodeBytes(yys16Slc, true, true) + yys16 := string(yys16Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1978) + switch yys16 { + case "StatusCode": + if r.TryDecodeAsNil() { + x.StatusCode = 0 + } else { + x.StatusCode = int(r.DecodeInt(codecSelferBitsize1978)) + } + case "Body": + if r.TryDecodeAsNil() { + x.Body = nil + } else { + yyv18 := &x.Body + yym19 := z.DecBinary() + _ = yym19 + if false { + } else { + *yyv18 = r.DecodeBytes(*(*[]byte)(yyv18), false, false) + } + } + case "Header": + if r.TryDecodeAsNil() { + x.Header = nil + } else { + yyv20 := &x.Header + yym21 := z.DecBinary() + _ = yym21 + if false { + } else if z.HasExtensions() && z.DecExt(yyv20) { + } else { + h.dechttp_Header((*pkg1_http.Header)(yyv20), d) + } + } + default: + z.DecStructFieldNotFound(-1, yys16) + } // end switch yys16 + } // end for yyj16 + z.DecSendContainerState(codecSelfer_containerMapEnd1978) +} + +func (x *RawResponse) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj22 int + var yyb22 bool + var yyhl22 bool = l >= 0 + yyj22++ + if yyhl22 { + yyb22 = yyj22 > l + } else { + yyb22 = r.CheckBreak() + } + if yyb22 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + if r.TryDecodeAsNil() { + x.StatusCode = 0 + } else { + x.StatusCode = int(r.DecodeInt(codecSelferBitsize1978)) + } + yyj22++ + if yyhl22 { + yyb22 = yyj22 > l + } else { + yyb22 = r.CheckBreak() + } + if yyb22 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + if r.TryDecodeAsNil() { + x.Body = nil + } else { + yyv24 := &x.Body + yym25 := z.DecBinary() + _ = yym25 + if false { + } else { + *yyv24 = r.DecodeBytes(*(*[]byte)(yyv24), false, false) + } + } + yyj22++ + if yyhl22 { + yyb22 = yyj22 > l + } else { + yyb22 = r.CheckBreak() + } + if yyb22 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + if r.TryDecodeAsNil() { + x.Header = nil + } else { + yyv26 := &x.Header + yym27 := z.DecBinary() + _ = yym27 + if false { + } else if z.HasExtensions() && z.DecExt(yyv26) { + } else { + h.dechttp_Header((*pkg1_http.Header)(yyv26), d) + } + } + for { + yyj22++ + if yyhl22 { + yyb22 = yyj22 > l + } else { + yyb22 = r.CheckBreak() + } + if yyb22 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + z.DecStructFieldNotFound(yyj22-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) +} + +func (x *Response) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym28 := z.EncBinary() + _ = yym28 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep29 := !z.EncBinary() + yy2arr29 := z.EncBasicHandle().StructToArray + var yyq29 [6]bool + _, _, _ = yysep29, yyq29, yy2arr29 + const yyr29 bool = false + yyq29[2] = x.PrevNode != nil + var yynn29 int + if yyr29 || yy2arr29 { + r.EncodeArrayStart(6) + } else { + yynn29 = 5 + for _, b := range yyq29 { + if b { + yynn29++ + } + } + r.EncodeMapStart(yynn29) + yynn29 = 0 + } + if yyr29 || yy2arr29 { + z.EncSendContainerState(codecSelfer_containerArrayElem1978) + yym31 := z.EncBinary() + _ = yym31 + if false { + } else { + r.EncodeString(codecSelferC_UTF81978, string(x.Action)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1978) + r.EncodeString(codecSelferC_UTF81978, string("action")) + z.EncSendContainerState(codecSelfer_containerMapValue1978) + yym32 := z.EncBinary() + _ = yym32 + if false { + } else { + r.EncodeString(codecSelferC_UTF81978, string(x.Action)) + } + } + if yyr29 || yy2arr29 { + z.EncSendContainerState(codecSelfer_containerArrayElem1978) + if x.Node == nil { + r.EncodeNil() + } else { + x.Node.CodecEncodeSelf(e) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1978) + r.EncodeString(codecSelferC_UTF81978, string("node")) + z.EncSendContainerState(codecSelfer_containerMapValue1978) + if x.Node == nil { + r.EncodeNil() + } else { + x.Node.CodecEncodeSelf(e) + } + } + if yyr29 || yy2arr29 { + z.EncSendContainerState(codecSelfer_containerArrayElem1978) + if yyq29[2] { + if x.PrevNode == nil { + r.EncodeNil() + } else { + x.PrevNode.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq29[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1978) + r.EncodeString(codecSelferC_UTF81978, string("prevNode")) + z.EncSendContainerState(codecSelfer_containerMapValue1978) + if x.PrevNode == nil { + r.EncodeNil() + } else { + x.PrevNode.CodecEncodeSelf(e) + } + } + } + if yyr29 || yy2arr29 { + z.EncSendContainerState(codecSelfer_containerArrayElem1978) + yym36 := z.EncBinary() + _ = yym36 + if false { + } else { + r.EncodeUint(uint64(x.EtcdIndex)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1978) + r.EncodeString(codecSelferC_UTF81978, string("etcdIndex")) + z.EncSendContainerState(codecSelfer_containerMapValue1978) + yym37 := z.EncBinary() + _ = yym37 + if false { + } else { + r.EncodeUint(uint64(x.EtcdIndex)) + } + } + if yyr29 || yy2arr29 { + z.EncSendContainerState(codecSelfer_containerArrayElem1978) + yym39 := z.EncBinary() + _ = yym39 + if false { + } else { + r.EncodeUint(uint64(x.RaftIndex)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1978) + r.EncodeString(codecSelferC_UTF81978, string("raftIndex")) + z.EncSendContainerState(codecSelfer_containerMapValue1978) + yym40 := z.EncBinary() + _ = yym40 + if false { + } else { + r.EncodeUint(uint64(x.RaftIndex)) + } + } + if yyr29 || yy2arr29 { + z.EncSendContainerState(codecSelfer_containerArrayElem1978) + yym42 := z.EncBinary() + _ = yym42 + if false { + } else { + r.EncodeUint(uint64(x.RaftTerm)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1978) + r.EncodeString(codecSelferC_UTF81978, string("raftTerm")) + z.EncSendContainerState(codecSelfer_containerMapValue1978) + yym43 := z.EncBinary() + _ = yym43 + if false { + } else { + r.EncodeUint(uint64(x.RaftTerm)) + } + } + if yyr29 || yy2arr29 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1978) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1978) + } + } + } +} + +func (x *Response) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym44 := z.DecBinary() + _ = yym44 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct45 := r.ContainerType() + if yyct45 == codecSelferValueTypeMap1978 { + yyl45 := r.ReadMapStart() + if yyl45 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1978) + } else { + x.codecDecodeSelfFromMap(yyl45, d) + } + } else if yyct45 == codecSelferValueTypeArray1978 { + yyl45 := r.ReadArrayStart() + if yyl45 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + } else { + x.codecDecodeSelfFromArray(yyl45, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1978) + } + } +} + +func (x *Response) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys46Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys46Slc + var yyhl46 bool = l >= 0 + for yyj46 := 0; ; yyj46++ { + if yyhl46 { + if yyj46 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1978) + yys46Slc = r.DecodeBytes(yys46Slc, true, true) + yys46 := string(yys46Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1978) + switch yys46 { + case "action": + if r.TryDecodeAsNil() { + x.Action = "" + } else { + x.Action = string(r.DecodeString()) + } + case "node": + if r.TryDecodeAsNil() { + if x.Node != nil { + x.Node = nil + } + } else { + if x.Node == nil { + x.Node = new(Node) + } + x.Node.CodecDecodeSelf(d) + } + case "prevNode": + if r.TryDecodeAsNil() { + if x.PrevNode != nil { + x.PrevNode = nil + } + } else { + if x.PrevNode == nil { + x.PrevNode = new(Node) + } + x.PrevNode.CodecDecodeSelf(d) + } + case "etcdIndex": + if r.TryDecodeAsNil() { + x.EtcdIndex = 0 + } else { + x.EtcdIndex = uint64(r.DecodeUint(64)) + } + case "raftIndex": + if r.TryDecodeAsNil() { + x.RaftIndex = 0 + } else { + x.RaftIndex = uint64(r.DecodeUint(64)) + } + case "raftTerm": + if r.TryDecodeAsNil() { + x.RaftTerm = 0 + } else { + x.RaftTerm = uint64(r.DecodeUint(64)) + } + default: + z.DecStructFieldNotFound(-1, yys46) + } // end switch yys46 + } // end for yyj46 + z.DecSendContainerState(codecSelfer_containerMapEnd1978) +} + +func (x *Response) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj53 int + var yyb53 bool + var yyhl53 bool = l >= 0 + yyj53++ + if yyhl53 { + yyb53 = yyj53 > l + } else { + yyb53 = r.CheckBreak() + } + if yyb53 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + if r.TryDecodeAsNil() { + x.Action = "" + } else { + x.Action = string(r.DecodeString()) + } + yyj53++ + if yyhl53 { + yyb53 = yyj53 > l + } else { + yyb53 = r.CheckBreak() + } + if yyb53 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + if r.TryDecodeAsNil() { + if x.Node != nil { + x.Node = nil + } + } else { + if x.Node == nil { + x.Node = new(Node) + } + x.Node.CodecDecodeSelf(d) + } + yyj53++ + if yyhl53 { + yyb53 = yyj53 > l + } else { + yyb53 = r.CheckBreak() + } + if yyb53 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + if r.TryDecodeAsNil() { + if x.PrevNode != nil { + x.PrevNode = nil + } + } else { + if x.PrevNode == nil { + x.PrevNode = new(Node) + } + x.PrevNode.CodecDecodeSelf(d) + } + yyj53++ + if yyhl53 { + yyb53 = yyj53 > l + } else { + yyb53 = r.CheckBreak() + } + if yyb53 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + if r.TryDecodeAsNil() { + x.EtcdIndex = 0 + } else { + x.EtcdIndex = uint64(r.DecodeUint(64)) + } + yyj53++ + if yyhl53 { + yyb53 = yyj53 > l + } else { + yyb53 = r.CheckBreak() + } + if yyb53 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + if r.TryDecodeAsNil() { + x.RaftIndex = 0 + } else { + x.RaftIndex = uint64(r.DecodeUint(64)) + } + yyj53++ + if yyhl53 { + yyb53 = yyj53 > l + } else { + yyb53 = r.CheckBreak() + } + if yyb53 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + if r.TryDecodeAsNil() { + x.RaftTerm = 0 + } else { + x.RaftTerm = uint64(r.DecodeUint(64)) + } + for { + yyj53++ + if yyhl53 { + yyb53 = yyj53 > l + } else { + yyb53 = r.CheckBreak() + } + if yyb53 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + z.DecStructFieldNotFound(yyj53-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) +} + +func (x *Node) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym60 := z.EncBinary() + _ = yym60 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep61 := !z.EncBinary() + yy2arr61 := z.EncBasicHandle().StructToArray + var yyq61 [8]bool + _, _, _ = yysep61, yyq61, yy2arr61 + const yyr61 bool = false + yyq61[1] = x.Value != "" + yyq61[2] = x.Dir != false + yyq61[3] = x.Expiration != nil + yyq61[4] = x.TTL != 0 + yyq61[5] = len(x.Nodes) != 0 + yyq61[6] = x.ModifiedIndex != 0 + yyq61[7] = x.CreatedIndex != 0 + var yynn61 int + if yyr61 || yy2arr61 { + r.EncodeArrayStart(8) + } else { + yynn61 = 1 + for _, b := range yyq61 { + if b { + yynn61++ + } + } + r.EncodeMapStart(yynn61) + yynn61 = 0 + } + if yyr61 || yy2arr61 { + z.EncSendContainerState(codecSelfer_containerArrayElem1978) + yym63 := z.EncBinary() + _ = yym63 + if false { + } else { + r.EncodeString(codecSelferC_UTF81978, string(x.Key)) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1978) + r.EncodeString(codecSelferC_UTF81978, string("key")) + z.EncSendContainerState(codecSelfer_containerMapValue1978) + yym64 := z.EncBinary() + _ = yym64 + if false { + } else { + r.EncodeString(codecSelferC_UTF81978, string(x.Key)) + } + } + if yyr61 || yy2arr61 { + z.EncSendContainerState(codecSelfer_containerArrayElem1978) + if yyq61[1] { + yym66 := z.EncBinary() + _ = yym66 + if false { + } else { + r.EncodeString(codecSelferC_UTF81978, string(x.Value)) + } + } else { + r.EncodeString(codecSelferC_UTF81978, "") + } + } else { + if yyq61[1] { + z.EncSendContainerState(codecSelfer_containerMapKey1978) + r.EncodeString(codecSelferC_UTF81978, string("value")) + z.EncSendContainerState(codecSelfer_containerMapValue1978) + yym67 := z.EncBinary() + _ = yym67 + if false { + } else { + r.EncodeString(codecSelferC_UTF81978, string(x.Value)) + } + } + } + if yyr61 || yy2arr61 { + z.EncSendContainerState(codecSelfer_containerArrayElem1978) + if yyq61[2] { + yym69 := z.EncBinary() + _ = yym69 + if false { + } else { + r.EncodeBool(bool(x.Dir)) + } + } else { + r.EncodeBool(false) + } + } else { + if yyq61[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1978) + r.EncodeString(codecSelferC_UTF81978, string("dir")) + z.EncSendContainerState(codecSelfer_containerMapValue1978) + yym70 := z.EncBinary() + _ = yym70 + if false { + } else { + r.EncodeBool(bool(x.Dir)) + } + } + } + if yyr61 || yy2arr61 { + z.EncSendContainerState(codecSelfer_containerArrayElem1978) + if yyq61[3] { + if x.Expiration == nil { + r.EncodeNil() + } else { + yym72 := z.EncBinary() + _ = yym72 + if false { + } else if yym73 := z.TimeRtidIfBinc(); yym73 != 0 { + r.EncodeBuiltin(yym73, x.Expiration) + } else if z.HasExtensions() && z.EncExt(x.Expiration) { + } else if yym72 { + z.EncBinaryMarshal(x.Expiration) + } else if !yym72 && z.IsJSONHandle() { + z.EncJSONMarshal(x.Expiration) + } else { + z.EncFallback(x.Expiration) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq61[3] { + z.EncSendContainerState(codecSelfer_containerMapKey1978) + r.EncodeString(codecSelferC_UTF81978, string("expiration")) + z.EncSendContainerState(codecSelfer_containerMapValue1978) + if x.Expiration == nil { + r.EncodeNil() + } else { + yym74 := z.EncBinary() + _ = yym74 + if false { + } else if yym75 := z.TimeRtidIfBinc(); yym75 != 0 { + r.EncodeBuiltin(yym75, x.Expiration) + } else if z.HasExtensions() && z.EncExt(x.Expiration) { + } else if yym74 { + z.EncBinaryMarshal(x.Expiration) + } else if !yym74 && z.IsJSONHandle() { + z.EncJSONMarshal(x.Expiration) + } else { + z.EncFallback(x.Expiration) + } + } + } + } + if yyr61 || yy2arr61 { + z.EncSendContainerState(codecSelfer_containerArrayElem1978) + if yyq61[4] { + yym77 := z.EncBinary() + _ = yym77 + if false { + } else { + r.EncodeInt(int64(x.TTL)) + } + } else { + r.EncodeInt(0) + } + } else { + if yyq61[4] { + z.EncSendContainerState(codecSelfer_containerMapKey1978) + r.EncodeString(codecSelferC_UTF81978, string("ttl")) + z.EncSendContainerState(codecSelfer_containerMapValue1978) + yym78 := z.EncBinary() + _ = yym78 + if false { + } else { + r.EncodeInt(int64(x.TTL)) + } + } + } + if yyr61 || yy2arr61 { + z.EncSendContainerState(codecSelfer_containerArrayElem1978) + if yyq61[5] { + if x.Nodes == nil { + r.EncodeNil() + } else { + x.Nodes.CodecEncodeSelf(e) + } + } else { + r.EncodeNil() + } + } else { + if yyq61[5] { + z.EncSendContainerState(codecSelfer_containerMapKey1978) + r.EncodeString(codecSelferC_UTF81978, string("nodes")) + z.EncSendContainerState(codecSelfer_containerMapValue1978) + if x.Nodes == nil { + r.EncodeNil() + } else { + x.Nodes.CodecEncodeSelf(e) + } + } + } + if yyr61 || yy2arr61 { + z.EncSendContainerState(codecSelfer_containerArrayElem1978) + if yyq61[6] { + yym81 := z.EncBinary() + _ = yym81 + if false { + } else { + r.EncodeUint(uint64(x.ModifiedIndex)) + } + } else { + r.EncodeUint(0) + } + } else { + if yyq61[6] { + z.EncSendContainerState(codecSelfer_containerMapKey1978) + r.EncodeString(codecSelferC_UTF81978, string("modifiedIndex")) + z.EncSendContainerState(codecSelfer_containerMapValue1978) + yym82 := z.EncBinary() + _ = yym82 + if false { + } else { + r.EncodeUint(uint64(x.ModifiedIndex)) + } + } + } + if yyr61 || yy2arr61 { + z.EncSendContainerState(codecSelfer_containerArrayElem1978) + if yyq61[7] { + yym84 := z.EncBinary() + _ = yym84 + if false { + } else { + r.EncodeUint(uint64(x.CreatedIndex)) + } + } else { + r.EncodeUint(0) + } + } else { + if yyq61[7] { + z.EncSendContainerState(codecSelfer_containerMapKey1978) + r.EncodeString(codecSelferC_UTF81978, string("createdIndex")) + z.EncSendContainerState(codecSelfer_containerMapValue1978) + yym85 := z.EncBinary() + _ = yym85 + if false { + } else { + r.EncodeUint(uint64(x.CreatedIndex)) + } + } + } + if yyr61 || yy2arr61 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1978) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1978) + } + } + } +} + +func (x *Node) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym86 := z.DecBinary() + _ = yym86 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct87 := r.ContainerType() + if yyct87 == codecSelferValueTypeMap1978 { + yyl87 := r.ReadMapStart() + if yyl87 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1978) + } else { + x.codecDecodeSelfFromMap(yyl87, d) + } + } else if yyct87 == codecSelferValueTypeArray1978 { + yyl87 := r.ReadArrayStart() + if yyl87 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + } else { + x.codecDecodeSelfFromArray(yyl87, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1978) + } + } +} + +func (x *Node) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys88Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys88Slc + var yyhl88 bool = l >= 0 + for yyj88 := 0; ; yyj88++ { + if yyhl88 { + if yyj88 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1978) + yys88Slc = r.DecodeBytes(yys88Slc, true, true) + yys88 := string(yys88Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1978) + switch yys88 { + case "key": + if r.TryDecodeAsNil() { + x.Key = "" + } else { + x.Key = string(r.DecodeString()) + } + case "value": + if r.TryDecodeAsNil() { + x.Value = "" + } else { + x.Value = string(r.DecodeString()) + } + case "dir": + if r.TryDecodeAsNil() { + x.Dir = false + } else { + x.Dir = bool(r.DecodeBool()) + } + case "expiration": + if r.TryDecodeAsNil() { + if x.Expiration != nil { + x.Expiration = nil + } + } else { + if x.Expiration == nil { + x.Expiration = new(time.Time) + } + yym93 := z.DecBinary() + _ = yym93 + if false { + } else if yym94 := z.TimeRtidIfBinc(); yym94 != 0 { + r.DecodeBuiltin(yym94, x.Expiration) + } else if z.HasExtensions() && z.DecExt(x.Expiration) { + } else if yym93 { + z.DecBinaryUnmarshal(x.Expiration) + } else if !yym93 && z.IsJSONHandle() { + z.DecJSONUnmarshal(x.Expiration) + } else { + z.DecFallback(x.Expiration, false) + } + } + case "ttl": + if r.TryDecodeAsNil() { + x.TTL = 0 + } else { + x.TTL = int64(r.DecodeInt(64)) + } + case "nodes": + if r.TryDecodeAsNil() { + x.Nodes = nil + } else { + yyv96 := &x.Nodes + yyv96.CodecDecodeSelf(d) + } + case "modifiedIndex": + if r.TryDecodeAsNil() { + x.ModifiedIndex = 0 + } else { + x.ModifiedIndex = uint64(r.DecodeUint(64)) + } + case "createdIndex": + if r.TryDecodeAsNil() { + x.CreatedIndex = 0 + } else { + x.CreatedIndex = uint64(r.DecodeUint(64)) + } + default: + z.DecStructFieldNotFound(-1, yys88) + } // end switch yys88 + } // end for yyj88 + z.DecSendContainerState(codecSelfer_containerMapEnd1978) +} + +func (x *Node) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj99 int + var yyb99 bool + var yyhl99 bool = l >= 0 + yyj99++ + if yyhl99 { + yyb99 = yyj99 > l + } else { + yyb99 = r.CheckBreak() + } + if yyb99 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + if r.TryDecodeAsNil() { + x.Key = "" + } else { + x.Key = string(r.DecodeString()) + } + yyj99++ + if yyhl99 { + yyb99 = yyj99 > l + } else { + yyb99 = r.CheckBreak() + } + if yyb99 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + if r.TryDecodeAsNil() { + x.Value = "" + } else { + x.Value = string(r.DecodeString()) + } + yyj99++ + if yyhl99 { + yyb99 = yyj99 > l + } else { + yyb99 = r.CheckBreak() + } + if yyb99 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + if r.TryDecodeAsNil() { + x.Dir = false + } else { + x.Dir = bool(r.DecodeBool()) + } + yyj99++ + if yyhl99 { + yyb99 = yyj99 > l + } else { + yyb99 = r.CheckBreak() + } + if yyb99 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + if r.TryDecodeAsNil() { + if x.Expiration != nil { + x.Expiration = nil + } + } else { + if x.Expiration == nil { + x.Expiration = new(time.Time) + } + yym104 := z.DecBinary() + _ = yym104 + if false { + } else if yym105 := z.TimeRtidIfBinc(); yym105 != 0 { + r.DecodeBuiltin(yym105, x.Expiration) + } else if z.HasExtensions() && z.DecExt(x.Expiration) { + } else if yym104 { + z.DecBinaryUnmarshal(x.Expiration) + } else if !yym104 && z.IsJSONHandle() { + z.DecJSONUnmarshal(x.Expiration) + } else { + z.DecFallback(x.Expiration, false) + } + } + yyj99++ + if yyhl99 { + yyb99 = yyj99 > l + } else { + yyb99 = r.CheckBreak() + } + if yyb99 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + if r.TryDecodeAsNil() { + x.TTL = 0 + } else { + x.TTL = int64(r.DecodeInt(64)) + } + yyj99++ + if yyhl99 { + yyb99 = yyj99 > l + } else { + yyb99 = r.CheckBreak() + } + if yyb99 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + if r.TryDecodeAsNil() { + x.Nodes = nil + } else { + yyv107 := &x.Nodes + yyv107.CodecDecodeSelf(d) + } + yyj99++ + if yyhl99 { + yyb99 = yyj99 > l + } else { + yyb99 = r.CheckBreak() + } + if yyb99 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + if r.TryDecodeAsNil() { + x.ModifiedIndex = 0 + } else { + x.ModifiedIndex = uint64(r.DecodeUint(64)) + } + yyj99++ + if yyhl99 { + yyb99 = yyj99 > l + } else { + yyb99 = r.CheckBreak() + } + if yyb99 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + if r.TryDecodeAsNil() { + x.CreatedIndex = 0 + } else { + x.CreatedIndex = uint64(r.DecodeUint(64)) + } + for { + yyj99++ + if yyhl99 { + yyb99 = yyj99 > l + } else { + yyb99 = r.CheckBreak() + } + if yyb99 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1978) + z.DecStructFieldNotFound(yyj99-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1978) +} + +func (x Nodes) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym110 := z.EncBinary() + _ = yym110 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + h.encNodes((Nodes)(x), e) + } + } +} + +func (x *Nodes) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym111 := z.DecBinary() + _ = yym111 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + h.decNodes((*Nodes)(x), d) + } +} + +func (x codecSelfer1978) enchttp_Header(v pkg1_http.Header, e *codec1978.Encoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + r.EncodeMapStart(len(v)) + for yyk112, yyv112 := range v { + z.EncSendContainerState(codecSelfer_containerMapKey1978) + yym113 := z.EncBinary() + _ = yym113 + if false { + } else { + r.EncodeString(codecSelferC_UTF81978, string(yyk112)) + } + z.EncSendContainerState(codecSelfer_containerMapValue1978) + if yyv112 == nil { + r.EncodeNil() + } else { + yym114 := z.EncBinary() + _ = yym114 + if false { + } else { + z.F.EncSliceStringV(yyv112, false, e) + } + } + } + z.EncSendContainerState(codecSelfer_containerMapEnd1978) +} + +func (x codecSelfer1978) dechttp_Header(v *pkg1_http.Header, d *codec1978.Decoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + + yyv115 := *v + yyl115 := r.ReadMapStart() + yybh115 := z.DecBasicHandle() + if yyv115 == nil { + yyrl115, _ := z.DecInferLen(yyl115, yybh115.MaxInitLen, 40) + yyv115 = make(map[string][]string, yyrl115) + *v = yyv115 + } + var yymk115 string + var yymv115 []string + var yymg115 bool + if yybh115.MapValueReset { + yymg115 = true + } + if yyl115 > 0 { + for yyj115 := 0; yyj115 < yyl115; yyj115++ { + z.DecSendContainerState(codecSelfer_containerMapKey1978) + if r.TryDecodeAsNil() { + yymk115 = "" + } else { + yymk115 = string(r.DecodeString()) + } + + if yymg115 { + yymv115 = yyv115[yymk115] + } else { + yymv115 = nil + } + z.DecSendContainerState(codecSelfer_containerMapValue1978) + if r.TryDecodeAsNil() { + yymv115 = nil + } else { + yyv117 := &yymv115 + yym118 := z.DecBinary() + _ = yym118 + if false { + } else { + z.F.DecSliceStringX(yyv117, false, d) + } + } + + if yyv115 != nil { + yyv115[yymk115] = yymv115 + } + } + } else if yyl115 < 0 { + for yyj115 := 0; !r.CheckBreak(); yyj115++ { + z.DecSendContainerState(codecSelfer_containerMapKey1978) + if r.TryDecodeAsNil() { + yymk115 = "" + } else { + yymk115 = string(r.DecodeString()) + } + + if yymg115 { + yymv115 = yyv115[yymk115] + } else { + yymv115 = nil + } + z.DecSendContainerState(codecSelfer_containerMapValue1978) + if r.TryDecodeAsNil() { + yymv115 = nil + } else { + yyv120 := &yymv115 + yym121 := z.DecBinary() + _ = yym121 + if false { + } else { + z.F.DecSliceStringX(yyv120, false, d) + } + } + + if yyv115 != nil { + yyv115[yymk115] = yymv115 + } + } + } // else len==0: TODO: Should we clear map entries? + z.DecSendContainerState(codecSelfer_containerMapEnd1978) +} + +func (x codecSelfer1978) encNodes(v Nodes, e *codec1978.Encoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + r.EncodeArrayStart(len(v)) + for _, yyv122 := range v { + z.EncSendContainerState(codecSelfer_containerArrayElem1978) + if yyv122 == nil { + r.EncodeNil() + } else { + yyv122.CodecEncodeSelf(e) + } + } + z.EncSendContainerState(codecSelfer_containerArrayEnd1978) +} + +func (x codecSelfer1978) decNodes(v *Nodes, d *codec1978.Decoder) { + var h codecSelfer1978 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + + yyv123 := *v + yyh123, yyl123 := z.DecSliceHelperStart() + var yyc123 bool + if yyl123 == 0 { + if yyv123 == nil { + yyv123 = []*Node{} + yyc123 = true + } else if len(yyv123) != 0 { + yyv123 = yyv123[:0] + yyc123 = true + } + } else if yyl123 > 0 { + var yyrr123, yyrl123 int + var yyrt123 bool + if yyl123 > cap(yyv123) { + + yyrg123 := len(yyv123) > 0 + yyv2123 := yyv123 + yyrl123, yyrt123 = z.DecInferLen(yyl123, z.DecBasicHandle().MaxInitLen, 8) + if yyrt123 { + if yyrl123 <= cap(yyv123) { + yyv123 = yyv123[:yyrl123] + } else { + yyv123 = make([]*Node, yyrl123) + } + } else { + yyv123 = make([]*Node, yyrl123) + } + yyc123 = true + yyrr123 = len(yyv123) + if yyrg123 { + copy(yyv123, yyv2123) + } + } else if yyl123 != len(yyv123) { + yyv123 = yyv123[:yyl123] + yyc123 = true + } + yyj123 := 0 + for ; yyj123 < yyrr123; yyj123++ { + yyh123.ElemContainerState(yyj123) + if r.TryDecodeAsNil() { + if yyv123[yyj123] != nil { + *yyv123[yyj123] = Node{} + } + } else { + if yyv123[yyj123] == nil { + yyv123[yyj123] = new(Node) + } + yyw124 := yyv123[yyj123] + yyw124.CodecDecodeSelf(d) + } + + } + if yyrt123 { + for ; yyj123 < yyl123; yyj123++ { + yyv123 = append(yyv123, nil) + yyh123.ElemContainerState(yyj123) + if r.TryDecodeAsNil() { + if yyv123[yyj123] != nil { + *yyv123[yyj123] = Node{} + } + } else { + if yyv123[yyj123] == nil { + yyv123[yyj123] = new(Node) + } + yyw125 := yyv123[yyj123] + yyw125.CodecDecodeSelf(d) + } + + } + } + + } else { + yyj123 := 0 + for ; !r.CheckBreak(); yyj123++ { + + if yyj123 >= len(yyv123) { + yyv123 = append(yyv123, nil) // var yyz123 *Node + yyc123 = true + } + yyh123.ElemContainerState(yyj123) + if yyj123 < len(yyv123) { + if r.TryDecodeAsNil() { + if yyv123[yyj123] != nil { + *yyv123[yyj123] = Node{} + } + } else { + if yyv123[yyj123] == nil { + yyv123[yyj123] = new(Node) + } + yyw126 := yyv123[yyj123] + yyw126.CodecDecodeSelf(d) + } + + } else { + z.DecSwallow() + } + + } + if yyj123 < len(yyv123) { + yyv123 = yyv123[:yyj123] + yyc123 = true + } else if yyj123 == 0 && yyv123 == nil { + yyv123 = []*Node{} + yyc123 = true + } + } + yyh123.End() + if yyc123 { + *v = yyv123 + } +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/response.go b/vendor/github.com/coreos/go-etcd/etcd/response.go new file mode 100644 index 0000000000..69b38be46e --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/response.go @@ -0,0 +1,93 @@ +package etcd + +//go:generate codecgen -d 1978 -o response.generated.go response.go + +import ( + "net/http" + "strconv" + "time" + + "github.com/ugorji/go/codec" +) + +const ( + rawResponse = iota + normalResponse +) + +type responseType int + +type RawResponse struct { + StatusCode int + Body []byte + Header http.Header +} + +var ( + validHttpStatusCode = map[int]bool{ + http.StatusCreated: true, + http.StatusOK: true, + http.StatusBadRequest: true, + http.StatusNotFound: true, + http.StatusPreconditionFailed: true, + http.StatusForbidden: true, + http.StatusUnauthorized: true, + } +) + +// Unmarshal parses RawResponse and stores the result in Response +func (rr *RawResponse) Unmarshal() (*Response, error) { + if rr.StatusCode != http.StatusOK && rr.StatusCode != http.StatusCreated { + return nil, handleError(rr.Body) + } + + resp := new(Response) + + err := codec.NewDecoderBytes(rr.Body, new(codec.JsonHandle)).Decode(resp) + + if err != nil { + return nil, err + } + + // attach index and term to response + resp.EtcdIndex, _ = strconv.ParseUint(rr.Header.Get("X-Etcd-Index"), 10, 64) + resp.RaftIndex, _ = strconv.ParseUint(rr.Header.Get("X-Raft-Index"), 10, 64) + resp.RaftTerm, _ = strconv.ParseUint(rr.Header.Get("X-Raft-Term"), 10, 64) + + return resp, nil +} + +type Response struct { + Action string `json:"action"` + Node *Node `json:"node"` + PrevNode *Node `json:"prevNode,omitempty"` + EtcdIndex uint64 `json:"etcdIndex"` + RaftIndex uint64 `json:"raftIndex"` + RaftTerm uint64 `json:"raftTerm"` +} + +type Node struct { + Key string `json:"key, omitempty"` + Value string `json:"value,omitempty"` + Dir bool `json:"dir,omitempty"` + Expiration *time.Time `json:"expiration,omitempty"` + TTL int64 `json:"ttl,omitempty"` + Nodes Nodes `json:"nodes,omitempty"` + ModifiedIndex uint64 `json:"modifiedIndex,omitempty"` + CreatedIndex uint64 `json:"createdIndex,omitempty"` +} + +type Nodes []*Node + +// interfaces for sorting +func (ns Nodes) Len() int { + return len(ns) +} + +func (ns Nodes) Less(i, j int) bool { + return ns[i].Key < ns[j].Key +} + +func (ns Nodes) Swap(i, j int) { + ns[i], ns[j] = ns[j], ns[i] +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/response_test.go b/vendor/github.com/coreos/go-etcd/etcd/response_test.go new file mode 100644 index 0000000000..23e0c56eb3 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/response_test.go @@ -0,0 +1,75 @@ +package etcd + +import ( + "net/http" + "reflect" + "strings" + "testing" + + "github.com/ugorji/go/codec" +) + +func createTestNode(size int) *Node { + return &Node{ + Key: strings.Repeat("a", 30), + Value: strings.Repeat("a", size), + TTL: 123456789, + ModifiedIndex: 123456, + CreatedIndex: 123456, + } +} + +func createTestNodeWithChildren(children, size int) *Node { + node := createTestNode(size) + for i := 0; i < children; i++ { + node.Nodes = append(node.Nodes, createTestNode(size)) + } + return node +} + +func createTestResponse(children, size int) *Response { + return &Response{ + Action: "aaaaa", + Node: createTestNodeWithChildren(children, size), + PrevNode: nil, + EtcdIndex: 123456, + RaftIndex: 123456, + RaftTerm: 123456, + } +} + +func benchmarkResponseUnmarshalling(b *testing.B, children, size int) { + response := createTestResponse(children, size) + + rr := RawResponse{http.StatusOK, make([]byte, 0), http.Header{}} + codec.NewEncoderBytes(&rr.Body, new(codec.JsonHandle)).Encode(response) + + b.ResetTimer() + newResponse := new(Response) + var err error + for i := 0; i < b.N; i++ { + if newResponse, err = rr.Unmarshal(); err != nil { + b.Errorf("Error: %v", err) + } + + } + if !reflect.DeepEqual(response.Node, newResponse.Node) { + b.Errorf("Unexpected difference in a parsed response: \n%+v\n%+v", response, newResponse) + } +} + +func BenchmarkSmallResponseUnmarshal(b *testing.B) { + benchmarkResponseUnmarshalling(b, 30, 20) +} + +func BenchmarkManySmallResponseUnmarshal(b *testing.B) { + benchmarkResponseUnmarshalling(b, 3000, 20) +} + +func BenchmarkMediumResponseUnmarshal(b *testing.B) { + benchmarkResponseUnmarshalling(b, 300, 200) +} + +func BenchmarkLargeResponseUnmarshal(b *testing.B) { + benchmarkResponseUnmarshalling(b, 3000, 2000) +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/set_curl_chan_test.go b/vendor/github.com/coreos/go-etcd/etcd/set_curl_chan_test.go new file mode 100644 index 0000000000..87c86b8308 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/set_curl_chan_test.go @@ -0,0 +1,42 @@ +package etcd + +import ( + "fmt" + "testing" +) + +func TestSetCurlChan(t *testing.T) { + c := NewClient(nil) + c.OpenCURL() + + defer func() { + c.Delete("foo", true) + }() + + _, err := c.Set("foo", "bar", 5) + if err != nil { + t.Fatal(err) + } + + expected := fmt.Sprintf("curl -X PUT %s/v2/keys/foo -d value=bar -d ttl=5", + c.cluster.pick()) + actual := c.RecvCURL() + if expected != actual { + t.Fatalf(`Command "%s" is not equal to expected value "%s"`, + actual, expected) + } + + c.SetConsistency(STRONG_CONSISTENCY) + _, err = c.Get("foo", false, false) + if err != nil { + t.Fatal(err) + } + + expected = fmt.Sprintf("curl -X GET %s/v2/keys/foo?quorum=true&recursive=false&sorted=false", + c.cluster.pick()) + actual = c.RecvCURL() + if expected != actual { + t.Fatalf(`Command "%s" is not equal to expected value "%s"`, + actual, expected) + } +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/set_update_create.go b/vendor/github.com/coreos/go-etcd/etcd/set_update_create.go new file mode 100644 index 0000000000..e2840cf356 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/set_update_create.go @@ -0,0 +1,137 @@ +package etcd + +// Set sets the given key to the given value. +// It will create a new key value pair or replace the old one. +// It will not replace a existing directory. +func (c *Client) Set(key string, value string, ttl uint64) (*Response, error) { + raw, err := c.RawSet(key, value, ttl) + + if err != nil { + return nil, err + } + + return raw.Unmarshal() +} + +// SetDir sets the given key to a directory. +// It will create a new directory or replace the old key value pair by a directory. +// It will not replace a existing directory. +func (c *Client) SetDir(key string, ttl uint64) (*Response, error) { + raw, err := c.RawSetDir(key, ttl) + + if err != nil { + return nil, err + } + + return raw.Unmarshal() +} + +// CreateDir creates a directory. It succeeds only if +// the given key does not yet exist. +func (c *Client) CreateDir(key string, ttl uint64) (*Response, error) { + raw, err := c.RawCreateDir(key, ttl) + + if err != nil { + return nil, err + } + + return raw.Unmarshal() +} + +// UpdateDir updates the given directory. It succeeds only if the +// given key already exists. +func (c *Client) UpdateDir(key string, ttl uint64) (*Response, error) { + raw, err := c.RawUpdateDir(key, ttl) + + if err != nil { + return nil, err + } + + return raw.Unmarshal() +} + +// Create creates a file with the given value under the given key. It succeeds +// only if the given key does not yet exist. +func (c *Client) Create(key string, value string, ttl uint64) (*Response, error) { + raw, err := c.RawCreate(key, value, ttl) + + if err != nil { + return nil, err + } + + return raw.Unmarshal() +} + +// CreateInOrder creates a file with a key that's guaranteed to be higher than other +// keys in the given directory. It is useful for creating queues. +func (c *Client) CreateInOrder(dir string, value string, ttl uint64) (*Response, error) { + raw, err := c.RawCreateInOrder(dir, value, ttl) + + if err != nil { + return nil, err + } + + return raw.Unmarshal() +} + +// Update updates the given key to the given value. It succeeds only if the +// given key already exists. +func (c *Client) Update(key string, value string, ttl uint64) (*Response, error) { + raw, err := c.RawUpdate(key, value, ttl) + + if err != nil { + return nil, err + } + + return raw.Unmarshal() +} + +func (c *Client) RawUpdateDir(key string, ttl uint64) (*RawResponse, error) { + ops := Options{ + "prevExist": true, + "dir": true, + } + + return c.put(key, "", ttl, ops) +} + +func (c *Client) RawCreateDir(key string, ttl uint64) (*RawResponse, error) { + ops := Options{ + "prevExist": false, + "dir": true, + } + + return c.put(key, "", ttl, ops) +} + +func (c *Client) RawSet(key string, value string, ttl uint64) (*RawResponse, error) { + return c.put(key, value, ttl, nil) +} + +func (c *Client) RawSetDir(key string, ttl uint64) (*RawResponse, error) { + ops := Options{ + "dir": true, + } + + return c.put(key, "", ttl, ops) +} + +func (c *Client) RawUpdate(key string, value string, ttl uint64) (*RawResponse, error) { + ops := Options{ + "prevExist": true, + } + + return c.put(key, value, ttl, ops) +} + +func (c *Client) RawCreate(key string, value string, ttl uint64) (*RawResponse, error) { + ops := Options{ + "prevExist": false, + } + + return c.put(key, value, ttl, ops) +} + +func (c *Client) RawCreateInOrder(dir string, value string, ttl uint64) (*RawResponse, error) { + return c.post(dir, value, ttl) +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/set_update_create_test.go b/vendor/github.com/coreos/go-etcd/etcd/set_update_create_test.go new file mode 100644 index 0000000000..ced0f06e7b --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/set_update_create_test.go @@ -0,0 +1,241 @@ +package etcd + +import ( + "testing" +) + +func TestSet(t *testing.T) { + c := NewClient(nil) + defer func() { + c.Delete("foo", true) + }() + + resp, err := c.Set("foo", "bar", 5) + if err != nil { + t.Fatal(err) + } + if resp.Node.Key != "/foo" || resp.Node.Value != "bar" || resp.Node.TTL != 5 { + t.Fatalf("Set 1 failed: %#v", resp) + } + if resp.PrevNode != nil { + t.Fatalf("Set 1 PrevNode failed: %#v", resp) + } + + resp, err = c.Set("foo", "bar2", 5) + if err != nil { + t.Fatal(err) + } + if !(resp.Node.Key == "/foo" && resp.Node.Value == "bar2" && resp.Node.TTL == 5) { + t.Fatalf("Set 2 failed: %#v", resp) + } + if resp.PrevNode.Key != "/foo" || resp.PrevNode.Value != "bar" || resp.Node.TTL != 5 { + t.Fatalf("Set 2 PrevNode failed: %#v", resp) + } +} + +func TestUpdate(t *testing.T) { + c := NewClient(nil) + defer func() { + c.Delete("foo", true) + c.Delete("nonexistent", true) + }() + + resp, err := c.Set("foo", "bar", 5) + + if err != nil { + t.Fatal(err) + } + + // This should succeed. + resp, err = c.Update("foo", "wakawaka", 5) + if err != nil { + t.Fatal(err) + } + + if !(resp.Action == "update" && resp.Node.Key == "/foo" && resp.Node.TTL == 5) { + t.Fatalf("Update 1 failed: %#v", resp) + } + if !(resp.PrevNode.Key == "/foo" && resp.PrevNode.Value == "bar" && resp.Node.TTL == 5) { + t.Fatalf("Update 1 prevValue failed: %#v", resp) + } + + // This should fail because the key does not exist. + resp, err = c.Update("nonexistent", "whatever", 5) + if err == nil { + t.Fatalf("The key %v did not exist, so the update should have failed."+ + "The response was: %#v", resp.Node.Key, resp) + } +} + +func TestCreate(t *testing.T) { + c := NewClient(nil) + defer func() { + c.Delete("newKey", true) + }() + + newKey := "/newKey" + newValue := "/newValue" + + // This should succeed + resp, err := c.Create(newKey, newValue, 5) + if err != nil { + t.Fatal(err) + } + + if !(resp.Action == "create" && resp.Node.Key == newKey && + resp.Node.Value == newValue && resp.Node.TTL == 5) { + t.Fatalf("Create 1 failed: %#v", resp) + } + if resp.PrevNode != nil { + t.Fatalf("Create 1 PrevNode failed: %#v", resp) + } + + // This should fail, because the key is already there + resp, err = c.Create(newKey, newValue, 5) + if err == nil { + t.Fatalf("The key %v did exist, so the creation should have failed."+ + "The response was: %#v", resp.Node.Key, resp) + } +} + +func TestCreateInOrder(t *testing.T) { + c := NewClient(nil) + dir := "/queue" + defer func() { + c.DeleteDir(dir) + }() + + var firstKey, secondKey string + + resp, err := c.CreateInOrder(dir, "1", 5) + if err != nil { + t.Fatal(err) + } + + if !(resp.Action == "create" && resp.Node.Value == "1" && resp.Node.TTL == 5) { + t.Fatalf("Create 1 failed: %#v", resp) + } + + firstKey = resp.Node.Key + + resp, err = c.CreateInOrder(dir, "2", 5) + if err != nil { + t.Fatal(err) + } + + if !(resp.Action == "create" && resp.Node.Value == "2" && resp.Node.TTL == 5) { + t.Fatalf("Create 2 failed: %#v", resp) + } + + secondKey = resp.Node.Key + + if firstKey >= secondKey { + t.Fatalf("Expected first key to be greater than second key, but %s is not greater than %s", + firstKey, secondKey) + } +} + +func TestSetDir(t *testing.T) { + c := NewClient(nil) + defer func() { + c.Delete("foo", true) + c.Delete("fooDir", true) + }() + + resp, err := c.CreateDir("fooDir", 5) + if err != nil { + t.Fatal(err) + } + if !(resp.Node.Key == "/fooDir" && resp.Node.Value == "" && resp.Node.TTL == 5) { + t.Fatalf("SetDir 1 failed: %#v", resp) + } + if resp.PrevNode != nil { + t.Fatalf("SetDir 1 PrevNode failed: %#v", resp) + } + + // This should fail because /fooDir already points to a directory + resp, err = c.CreateDir("/fooDir", 5) + if err == nil { + t.Fatalf("fooDir already points to a directory, so SetDir should have failed."+ + "The response was: %#v", resp) + } + + _, err = c.Set("foo", "bar", 5) + if err != nil { + t.Fatal(err) + } + + // This should succeed + // It should replace the key + resp, err = c.SetDir("foo", 5) + if err != nil { + t.Fatal(err) + } + if !(resp.Node.Key == "/foo" && resp.Node.Value == "" && resp.Node.TTL == 5) { + t.Fatalf("SetDir 2 failed: %#v", resp) + } + if !(resp.PrevNode.Key == "/foo" && resp.PrevNode.Value == "bar" && resp.PrevNode.TTL == 5) { + t.Fatalf("SetDir 2 failed: %#v", resp) + } +} + +func TestUpdateDir(t *testing.T) { + c := NewClient(nil) + defer func() { + c.Delete("fooDir", true) + }() + + resp, err := c.CreateDir("fooDir", 5) + if err != nil { + t.Fatal(err) + } + + // This should succeed. + resp, err = c.UpdateDir("fooDir", 5) + if err != nil { + t.Fatal(err) + } + + if !(resp.Action == "update" && resp.Node.Key == "/fooDir" && + resp.Node.Value == "" && resp.Node.TTL == 5) { + t.Fatalf("UpdateDir 1 failed: %#v", resp) + } + if !(resp.PrevNode.Key == "/fooDir" && resp.PrevNode.Dir == true && resp.PrevNode.TTL == 5) { + t.Fatalf("UpdateDir 1 PrevNode failed: %#v", resp) + } + + // This should fail because the key does not exist. + resp, err = c.UpdateDir("nonexistentDir", 5) + if err == nil { + t.Fatalf("The key %v did not exist, so the update should have failed."+ + "The response was: %#v", resp.Node.Key, resp) + } +} + +func TestCreateDir(t *testing.T) { + c := NewClient(nil) + defer func() { + c.Delete("fooDir", true) + }() + + // This should succeed + resp, err := c.CreateDir("fooDir", 5) + if err != nil { + t.Fatal(err) + } + + if !(resp.Action == "create" && resp.Node.Key == "/fooDir" && + resp.Node.Value == "" && resp.Node.TTL == 5) { + t.Fatalf("CreateDir 1 failed: %#v", resp) + } + if resp.PrevNode != nil { + t.Fatalf("CreateDir 1 PrevNode failed: %#v", resp) + } + + // This should fail, because the key is already there + resp, err = c.CreateDir("fooDir", 5) + if err == nil { + t.Fatalf("The key %v did exist, so the creation should have failed."+ + "The response was: %#v", resp.Node.Key, resp) + } +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/shuffle.go b/vendor/github.com/coreos/go-etcd/etcd/shuffle.go new file mode 100644 index 0000000000..c26ddac30c --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/shuffle.go @@ -0,0 +1,19 @@ +package etcd + +import ( + "math/rand" +) + +func shuffleStringSlice(cards []string) []string { + size := len(cards) + //Do not need to copy if nothing changed + if size <= 1 { + return cards + } + shuffled := make([]string, size) + index := rand.Perm(size) + for i := range cards { + shuffled[index[i]] = cards[i] + } + return shuffled +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/version.go b/vendor/github.com/coreos/go-etcd/etcd/version.go new file mode 100644 index 0000000000..b1e9ed2713 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/version.go @@ -0,0 +1,6 @@ +package etcd + +const ( + version = "v2" + packageVersion = "v2.0.0+git" +) diff --git a/vendor/github.com/coreos/go-etcd/etcd/watch.go b/vendor/github.com/coreos/go-etcd/etcd/watch.go new file mode 100644 index 0000000000..aa8d3df301 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/watch.go @@ -0,0 +1,103 @@ +package etcd + +import ( + "errors" +) + +// Errors introduced by the Watch command. +var ( + ErrWatchStoppedByUser = errors.New("Watch stopped by the user via stop channel") +) + +// If recursive is set to true the watch returns the first change under the given +// prefix since the given index. +// +// If recursive is set to false the watch returns the first change to the given key +// since the given index. +// +// To watch for the latest change, set waitIndex = 0. +// +// If a receiver channel is given, it will be a long-term watch. Watch will block at the +//channel. After someone receives the channel, it will go on to watch that +// prefix. If a stop channel is given, the client can close long-term watch using +// the stop channel. +func (c *Client) Watch(prefix string, waitIndex uint64, recursive bool, + receiver chan *Response, stop chan bool) (*Response, error) { + logger.Debugf("watch %s [%s]", prefix, c.cluster.Leader) + if receiver == nil { + raw, err := c.watchOnce(prefix, waitIndex, recursive, stop) + + if err != nil { + return nil, err + } + + return raw.Unmarshal() + } + defer close(receiver) + + for { + raw, err := c.watchOnce(prefix, waitIndex, recursive, stop) + + if err != nil { + return nil, err + } + + resp, err := raw.Unmarshal() + + if err != nil { + return nil, err + } + + waitIndex = resp.Node.ModifiedIndex + 1 + receiver <- resp + } +} + +func (c *Client) RawWatch(prefix string, waitIndex uint64, recursive bool, + receiver chan *RawResponse, stop chan bool) (*RawResponse, error) { + + logger.Debugf("rawWatch %s [%s]", prefix, c.cluster.Leader) + if receiver == nil { + return c.watchOnce(prefix, waitIndex, recursive, stop) + } + + for { + raw, err := c.watchOnce(prefix, waitIndex, recursive, stop) + + if err != nil { + return nil, err + } + + resp, err := raw.Unmarshal() + + if err != nil { + return nil, err + } + + waitIndex = resp.Node.ModifiedIndex + 1 + receiver <- raw + } +} + +// helper func +// return when there is change under the given prefix +func (c *Client) watchOnce(key string, waitIndex uint64, recursive bool, stop chan bool) (*RawResponse, error) { + + options := Options{ + "wait": true, + } + if waitIndex > 0 { + options["waitIndex"] = waitIndex + } + if recursive { + options["recursive"] = true + } + + resp, err := c.getCancelable(key, options, stop) + + if err == ErrRequestCancelled { + return nil, ErrWatchStoppedByUser + } + + return resp, err +} diff --git a/vendor/github.com/coreos/go-etcd/etcd/watch_test.go b/vendor/github.com/coreos/go-etcd/etcd/watch_test.go new file mode 100644 index 0000000000..43e1dfeb81 --- /dev/null +++ b/vendor/github.com/coreos/go-etcd/etcd/watch_test.go @@ -0,0 +1,119 @@ +package etcd + +import ( + "fmt" + "runtime" + "testing" + "time" +) + +func TestWatch(t *testing.T) { + c := NewClient(nil) + defer func() { + c.Delete("watch_foo", true) + }() + + go setHelper("watch_foo", "bar", c) + + resp, err := c.Watch("watch_foo", 0, false, nil, nil) + if err != nil { + t.Fatal(err) + } + if !(resp.Node.Key == "/watch_foo" && resp.Node.Value == "bar") { + t.Fatalf("Watch 1 failed: %#v", resp) + } + + go setHelper("watch_foo", "bar", c) + + resp, err = c.Watch("watch_foo", resp.Node.ModifiedIndex+1, false, nil, nil) + if err != nil { + t.Fatal(err) + } + if !(resp.Node.Key == "/watch_foo" && resp.Node.Value == "bar") { + t.Fatalf("Watch 2 failed: %#v", resp) + } + + routineNum := runtime.NumGoroutine() + + ch := make(chan *Response, 10) + stop := make(chan bool, 1) + + go setLoop("watch_foo", "bar", c) + + go receiver(ch, stop) + + _, err = c.Watch("watch_foo", 0, false, ch, stop) + if err != ErrWatchStoppedByUser { + t.Fatalf("Watch returned a non-user stop error") + } + + if newRoutineNum := runtime.NumGoroutine(); newRoutineNum != routineNum { + t.Fatalf("Routine numbers differ after watch stop: %v, %v", routineNum, newRoutineNum) + } +} + +func TestWatchAll(t *testing.T) { + c := NewClient(nil) + defer func() { + c.Delete("watch_foo", true) + }() + + go setHelper("watch_foo/foo", "bar", c) + + resp, err := c.Watch("watch_foo", 0, true, nil, nil) + if err != nil { + t.Fatal(err) + } + if !(resp.Node.Key == "/watch_foo/foo" && resp.Node.Value == "bar") { + t.Fatalf("WatchAll 1 failed: %#v", resp) + } + + go setHelper("watch_foo/foo", "bar", c) + + resp, err = c.Watch("watch_foo", resp.Node.ModifiedIndex+1, true, nil, nil) + if err != nil { + t.Fatal(err) + } + if !(resp.Node.Key == "/watch_foo/foo" && resp.Node.Value == "bar") { + t.Fatalf("WatchAll 2 failed: %#v", resp) + } + + ch := make(chan *Response, 10) + stop := make(chan bool, 1) + + routineNum := runtime.NumGoroutine() + + go setLoop("watch_foo/foo", "bar", c) + + go receiver(ch, stop) + + _, err = c.Watch("watch_foo", 0, true, ch, stop) + if err != ErrWatchStoppedByUser { + t.Fatalf("Watch returned a non-user stop error") + } + + if newRoutineNum := runtime.NumGoroutine(); newRoutineNum != routineNum { + t.Fatalf("Routine numbers differ after watch stop: %v, %v", routineNum, newRoutineNum) + } +} + +func setHelper(key, value string, c *Client) { + time.Sleep(time.Second) + c.Set(key, value, 100) +} + +func setLoop(key, value string, c *Client) { + time.Sleep(time.Second) + for i := 0; i < 10; i++ { + newValue := fmt.Sprintf("%s_%v", value, i) + c.Set(key, newValue, 100) + time.Sleep(time.Second / 10) + } +} + +func receiver(c chan *Response, stop chan bool) { + for i := 0; i < 10; i++ { + <-c + } + stop <- true +} diff --git a/vendor/github.com/cpuguy83/go-md2man/.gitignore b/vendor/github.com/cpuguy83/go-md2man/.gitignore new file mode 100644 index 0000000000..b651fbfb1d --- /dev/null +++ b/vendor/github.com/cpuguy83/go-md2man/.gitignore @@ -0,0 +1 @@ +go-md2man diff --git a/vendor/github.com/cpuguy83/go-md2man/LICENSE.md b/vendor/github.com/cpuguy83/go-md2man/LICENSE.md new file mode 100644 index 0000000000..1cade6cef6 --- /dev/null +++ b/vendor/github.com/cpuguy83/go-md2man/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Brian Goff + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/cpuguy83/go-md2man/README.md b/vendor/github.com/cpuguy83/go-md2man/README.md new file mode 100644 index 0000000000..8eb4b2eb07 --- /dev/null +++ b/vendor/github.com/cpuguy83/go-md2man/README.md @@ -0,0 +1,11 @@ +go-md2man +========= + +** Work in Progress ** +This still needs a lot of help to be complete, or even usable! + +Uses blackfriday to process markdown into man pages. + +### Usage + +./md2man -in /path/to/markdownfile.md -out /manfile/output/path diff --git a/vendor/github.com/cpuguy83/go-md2man/go-md2man.1.md b/vendor/github.com/cpuguy83/go-md2man/go-md2man.1.md new file mode 100644 index 0000000000..1f7096a746 --- /dev/null +++ b/vendor/github.com/cpuguy83/go-md2man/go-md2man.1.md @@ -0,0 +1,21 @@ +go-md2man 1 "January 2015" go-md2man "User Manual" +================================================== + +# NAME + go-md2man - Convert mardown files into manpages + +# SYNOPSIS + go-md2man -in=[/path/to/md/file] -out=[/path/to/output] + +# Description + go-md2man converts standard markdown formatted documents into manpages. It is + written purely in Go so as to reduce dependencies on 3rd party libs. + +# Example + Convert the markdown file "go-md2man.1.md" into a manpage. + + go-md2man -in=README.md -out=go-md2man.1.out + +# HISTORY + January 2015, Originally compiled by Brian Goff( cpuguy83@gmail.com ) + diff --git a/vendor/github.com/cpuguy83/go-md2man/md2man.go b/vendor/github.com/cpuguy83/go-md2man/md2man.go new file mode 100644 index 0000000000..1dc70f47a7 --- /dev/null +++ b/vendor/github.com/cpuguy83/go-md2man/md2man.go @@ -0,0 +1,44 @@ +package main + +import ( + "flag" + "fmt" + "io/ioutil" + "os" + + "github.com/cpuguy83/go-md2man/md2man" +) + +var inFilePath = flag.String("in", "", "Path to file to be processed") +var outFilePath = flag.String("out", "", "Path to output processed file") + +func main() { + flag.Parse() + + inFile, err := os.Open(*inFilePath) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + defer inFile.Close() + + doc, err := ioutil.ReadAll(inFile) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + out := md2man.Render(doc) + + outFile, err := os.Create(*outFilePath) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + defer outFile.Close() + _, err = outFile.Write(out) + if err != nil { + fmt.Println(err) + os.Exit(1) + } +} diff --git a/vendor/github.com/cpuguy83/go-md2man/md2man/md2man.go b/vendor/github.com/cpuguy83/go-md2man/md2man/md2man.go new file mode 100644 index 0000000000..8f44fa1550 --- /dev/null +++ b/vendor/github.com/cpuguy83/go-md2man/md2man/md2man.go @@ -0,0 +1,19 @@ +package md2man + +import ( + "github.com/russross/blackfriday" +) + +func Render(doc []byte) []byte { + renderer := RoffRenderer(0) + extensions := 0 + extensions |= blackfriday.EXTENSION_NO_INTRA_EMPHASIS + extensions |= blackfriday.EXTENSION_TABLES + extensions |= blackfriday.EXTENSION_FENCED_CODE + extensions |= blackfriday.EXTENSION_AUTOLINK + extensions |= blackfriday.EXTENSION_SPACE_HEADERS + extensions |= blackfriday.EXTENSION_FOOTNOTES + extensions |= blackfriday.EXTENSION_TITLEBLOCK + + return blackfriday.Markdown(doc, renderer, extensions) +} diff --git a/vendor/github.com/cpuguy83/go-md2man/md2man/roff.go b/vendor/github.com/cpuguy83/go-md2man/md2man/roff.go new file mode 100644 index 0000000000..9f12daa160 --- /dev/null +++ b/vendor/github.com/cpuguy83/go-md2man/md2man/roff.go @@ -0,0 +1,281 @@ +package md2man + +import ( + "bytes" + "fmt" + "html" + "strings" + + "github.com/russross/blackfriday" +) + +type roffRenderer struct{} + +var listCounter int + +func RoffRenderer(flags int) blackfriday.Renderer { + return &roffRenderer{} +} + +func (r *roffRenderer) GetFlags() int { + return 0 +} + +func (r *roffRenderer) TitleBlock(out *bytes.Buffer, text []byte) { + out.WriteString(".TH ") + + splitText := bytes.Split(text, []byte("\n")) + for i, line := range splitText { + line = bytes.TrimPrefix(line, []byte("% ")) + if i == 0 { + line = bytes.Replace(line, []byte("("), []byte("\" \""), 1) + line = bytes.Replace(line, []byte(")"), []byte("\" \""), 1) + } + line = append([]byte("\""), line...) + line = append(line, []byte("\" ")...) + out.Write(line) + } + out.WriteString("\n") + + // disable hyphenation + out.WriteString(".nh\n") + // disable justification (adjust text to left margin only) + out.WriteString(".ad l\n") +} + +func (r *roffRenderer) BlockCode(out *bytes.Buffer, text []byte, lang string) { + out.WriteString("\n.PP\n.RS\n\n.nf\n") + escapeSpecialChars(out, text) + out.WriteString("\n.fi\n.RE\n") +} + +func (r *roffRenderer) BlockQuote(out *bytes.Buffer, text []byte) { + out.WriteString("\n.PP\n.RS\n") + out.Write(text) + out.WriteString("\n.RE\n") +} + +func (r *roffRenderer) BlockHtml(out *bytes.Buffer, text []byte) { + out.Write(text) +} + +func (r *roffRenderer) Header(out *bytes.Buffer, text func() bool, level int, id string) { + marker := out.Len() + + switch { + case marker == 0: + // This is the doc header + out.WriteString(".TH ") + case level == 1: + out.WriteString("\n\n.SH ") + case level == 2: + out.WriteString("\n.SH ") + default: + out.WriteString("\n.SS ") + } + + if !text() { + out.Truncate(marker) + return + } +} + +func (r *roffRenderer) HRule(out *bytes.Buffer) { + out.WriteString("\n.ti 0\n\\l'\\n(.lu'\n") +} + +func (r *roffRenderer) List(out *bytes.Buffer, text func() bool, flags int) { + marker := out.Len() + if flags&blackfriday.LIST_TYPE_ORDERED != 0 { + listCounter = 1 + } + if !text() { + out.Truncate(marker) + return + } +} + +func (r *roffRenderer) ListItem(out *bytes.Buffer, text []byte, flags int) { + if flags&blackfriday.LIST_TYPE_ORDERED != 0 { + out.WriteString(fmt.Sprintf(".IP \"%3d.\" 5\n", listCounter)) + listCounter += 1 + } else { + out.WriteString(".IP \\(bu 2\n") + } + out.Write(text) + out.WriteString("\n") +} + +func (r *roffRenderer) Paragraph(out *bytes.Buffer, text func() bool) { + marker := out.Len() + out.WriteString("\n.PP\n") + if !text() { + out.Truncate(marker) + return + } + if marker != 0 { + out.WriteString("\n") + } +} + +// TODO: This might now work +func (r *roffRenderer) Table(out *bytes.Buffer, header []byte, body []byte, columnData []int) { + out.WriteString(".TS\nallbox;\n") + + out.Write(header) + out.Write(body) + out.WriteString("\n.TE\n") +} + +func (r *roffRenderer) TableRow(out *bytes.Buffer, text []byte) { + if out.Len() > 0 { + out.WriteString("\n") + } + out.Write(text) + out.WriteString("\n") +} + +func (r *roffRenderer) TableHeaderCell(out *bytes.Buffer, text []byte, align int) { + if out.Len() > 0 { + out.WriteString(" ") + } + out.Write(text) + out.WriteString(" ") +} + +// TODO: This is probably broken +func (r *roffRenderer) TableCell(out *bytes.Buffer, text []byte, align int) { + if out.Len() > 0 { + out.WriteString("\t") + } + out.Write(text) + out.WriteString("\t") +} + +func (r *roffRenderer) Footnotes(out *bytes.Buffer, text func() bool) { + +} + +func (r *roffRenderer) FootnoteItem(out *bytes.Buffer, name, text []byte, flags int) { + +} + +func (r *roffRenderer) AutoLink(out *bytes.Buffer, link []byte, kind int) { + out.WriteString("\n\\[la]") + out.Write(link) + out.WriteString("\\[ra]") +} + +func (r *roffRenderer) CodeSpan(out *bytes.Buffer, text []byte) { + out.WriteString("\\fB\\fC") + escapeSpecialChars(out, text) + out.WriteString("\\fR") +} + +func (r *roffRenderer) DoubleEmphasis(out *bytes.Buffer, text []byte) { + out.WriteString("\\fB") + out.Write(text) + out.WriteString("\\fP") +} + +func (r *roffRenderer) Emphasis(out *bytes.Buffer, text []byte) { + out.WriteString("\\fI") + out.Write(text) + out.WriteString("\\fP") +} + +func (r *roffRenderer) Image(out *bytes.Buffer, link []byte, title []byte, alt []byte) { +} + +func (r *roffRenderer) LineBreak(out *bytes.Buffer) { + out.WriteString("\n.br\n") +} + +func (r *roffRenderer) Link(out *bytes.Buffer, link []byte, title []byte, content []byte) { + r.AutoLink(out, link, 0) +} + +func (r *roffRenderer) RawHtmlTag(out *bytes.Buffer, tag []byte) { + out.Write(tag) +} + +func (r *roffRenderer) TripleEmphasis(out *bytes.Buffer, text []byte) { + out.WriteString("\\s+2") + out.Write(text) + out.WriteString("\\s-2") +} + +func (r *roffRenderer) StrikeThrough(out *bytes.Buffer, text []byte) { +} + +func (r *roffRenderer) FootnoteRef(out *bytes.Buffer, ref []byte, id int) { + +} + +func (r *roffRenderer) Entity(out *bytes.Buffer, entity []byte) { + out.WriteString(html.UnescapeString(string(entity))) +} + +func processFooterText(text []byte) []byte { + text = bytes.TrimPrefix(text, []byte("% ")) + newText := []byte{} + textArr := strings.Split(string(text), ") ") + + for i, w := range textArr { + if i == 0 { + w = strings.Replace(w, "(", "\" \"", 1) + w = fmt.Sprintf("\"%s\"", w) + } else { + w = fmt.Sprintf(" \"%s\"", w) + } + newText = append(newText, []byte(w)...) + } + newText = append(newText, []byte(" \"\"")...) + + return newText +} + +func (r *roffRenderer) NormalText(out *bytes.Buffer, text []byte) { + escapeSpecialChars(out, text) +} + +func (r *roffRenderer) DocumentHeader(out *bytes.Buffer) { +} + +func (r *roffRenderer) DocumentFooter(out *bytes.Buffer) { +} + +func needsBackslash(c byte) bool { + for _, r := range []byte("-_&\\~") { + if c == r { + return true + } + } + return false +} + +func escapeSpecialChars(out *bytes.Buffer, text []byte) { + for i := 0; i < len(text); i++ { + // escape initial apostrophe or period + if len(text) >= 1 && (text[0] == '\'' || text[0] == '.') { + out.WriteString("\\&") + } + + // directly copy normal characters + org := i + + for i < len(text) && !needsBackslash(text[i]) { + i++ + } + if i > org { + out.Write(text[org:i]) + } + + // escape a character + if i >= len(text) { + break + } + out.WriteByte('\\') + out.WriteByte(text[i]) + } +} diff --git a/vendor/github.com/hashicorp/hcl/.gitignore b/vendor/github.com/hashicorp/hcl/.gitignore new file mode 100644 index 0000000000..15586a2b54 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/.gitignore @@ -0,0 +1,9 @@ +y.output + +# ignore intellij files +.idea +*.iml +*.ipr +*.iws + +*.test diff --git a/vendor/github.com/hashicorp/hcl/.travis.yml b/vendor/github.com/hashicorp/hcl/.travis.yml new file mode 100644 index 0000000000..83dc540ef9 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/.travis.yml @@ -0,0 +1,3 @@ +sudo: false +language: go +go: 1.5 diff --git a/vendor/github.com/hashicorp/hcl/LICENSE b/vendor/github.com/hashicorp/hcl/LICENSE new file mode 100644 index 0000000000..c33dcc7c92 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/LICENSE @@ -0,0 +1,354 @@ +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. “Contributor” + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. “Contributor Version” + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor’s Contribution. + +1.3. “Contribution” + + means Covered Software of a particular Contributor. + +1.4. “Covered Software” + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. “Incompatible With Secondary Licenses” + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of version + 1.1 or earlier of the License, but not also under the terms of a + Secondary License. + +1.6. “Executable Form” + + means any form of the work other than Source Code Form. + +1.7. “Larger Work” + + means a work that combines Covered Software with other material, in a separate + file or files, that is not Covered Software. + +1.8. “License” + + means this document. + +1.9. “Licensable” + + means having the right to grant, to the maximum extent possible, whether at the + time of the initial grant or subsequently, any and all of the rights conveyed by + this License. + +1.10. “Modifications” + + means any of the following: + + a. any file in Source Code Form that results from an addition to, deletion + from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. “Patent Claims” of a Contributor + + means any patent claim(s), including without limitation, method, process, + and apparatus claims, in any patent Licensable by such Contributor that + would be infringed, but for the grant of the License, by the making, + using, selling, offering for sale, having made, import, or transfer of + either its Contributions or its Contributor Version. + +1.12. “Secondary License” + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. “Source Code Form” + + means the form of the work preferred for making modifications. + +1.14. “You” (or “Your”) + + means an individual or a legal entity exercising rights under this + License. For legal entities, “You” includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, “control” means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or as + part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its Contributions + or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution become + effective for each Contribution on the date the Contributor first distributes + such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under this + License. No additional rights or licenses will be implied from the distribution + or licensing of Covered Software under this License. Notwithstanding Section + 2.1(b) above, no patent license is granted by a Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party’s + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of its + Contributions. + + This License does not grant any rights in the trademarks, service marks, or + logos of any Contributor (except as may be necessary to comply with the + notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this License + (see Section 10.2) or under the terms of a Secondary License (if permitted + under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its Contributions + are its original creation(s) or it has sufficient rights to grant the + rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under applicable + copyright doctrines of fair use, fair dealing, or other equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under the + terms of this License. You must inform recipients that the Source Code Form + of the Covered Software is governed by the terms of this License, and how + they can obtain a copy of this License. You may not attempt to alter or + restrict the recipients’ rights in the Source Code Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this License, + or sublicense it under different terms, provided that the license for + the Executable Form does not attempt to limit or alter the recipients’ + rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for the + Covered Software. If the Larger Work is a combination of Covered Software + with a work governed by one or more Secondary Licenses, and the Covered + Software is not Incompatible With Secondary Licenses, this License permits + You to additionally distribute such Covered Software under the terms of + such Secondary License(s), so that the recipient of the Larger Work may, at + their option, further distribute the Covered Software under the terms of + either this License or such Secondary License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices (including + copyright notices, patent notices, disclaimers of warranty, or limitations + of liability) contained within the Source Code Form of the Covered + Software, except that You may alter any license notices to the extent + required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on behalf + of any Contributor. You must make it absolutely clear that any such + warranty, support, indemnity, or liability obligation is offered by You + alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, judicial + order, or regulation then You must: (a) comply with the terms of this License + to the maximum extent possible; and (b) describe the limitations and the code + they affect. Such description must be placed in a text file included with all + distributions of the Covered Software under this License. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing basis, + if such Contributor fails to notify You of the non-compliance by some + reasonable means prior to 60 days after You have come back into compliance. + Moreover, Your grants from a particular Contributor are reinstated on an + ongoing basis if such Contributor notifies You of the non-compliance by + some reasonable means, this is the first time You have received notice of + non-compliance with this License from such Contributor, and You become + compliant prior to 30 days after Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, counter-claims, + and cross-claims) alleging that a Contributor Version directly or + indirectly infringes any patent, then the rights granted to You by any and + all Contributors for the Covered Software under Section 2.1 of this License + shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an “as is” basis, without + warranty of any kind, either expressed, implied, or statutory, including, + without limitation, warranties that the Covered Software is free of defects, + merchantable, fit for a particular purpose or non-infringing. The entire + risk as to the quality and performance of the Covered Software is with You. + Should any Covered Software prove defective in any respect, You (not any + Contributor) assume the cost of any necessary servicing, repair, or + correction. This disclaimer of warranty constitutes an essential part of this + License. No use of any Covered Software is authorized under this License + except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from such + party’s negligence to the extent applicable law prohibits such limitation. + Some jurisdictions do not allow the exclusion or limitation of incidental or + consequential damages, so this exclusion and limitation may not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts of + a jurisdiction where the defendant maintains its principal place of business + and such litigation shall be governed by laws of that jurisdiction, without + reference to its conflict-of-law provisions. Nothing in this Section shall + prevent a party’s ability to bring cross-claims or counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject matter + hereof. If any provision of this License is held to be unenforceable, such + provision shall be reformed only to the extent necessary to make it + enforceable. Any law or regulation which provides that the language of a + contract shall be construed against the drafter shall not be used to construe + this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version of + the License under which You originally received the Covered Software, or + under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a modified + version of this License if you rename the license and remove any + references to the name of the license steward (except to note that such + modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses + If You choose to distribute Source Code Form that is Incompatible With + Secondary Licenses under the terms of this version of the License, the + notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice + + 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/. + +If it is not possible or desirable to put the notice in a particular file, then +You may include the notice in a location (such as a LICENSE file in a relevant +directory) where a recipient would be likely to look for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - “Incompatible With Secondary Licenses” Notice + + This Source Code Form is “Incompatible + With Secondary Licenses”, as defined by + the Mozilla Public License, v. 2.0. + diff --git a/vendor/github.com/hashicorp/hcl/Makefile b/vendor/github.com/hashicorp/hcl/Makefile new file mode 100644 index 0000000000..ad404a8113 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/Makefile @@ -0,0 +1,17 @@ +TEST?=./... + +default: test + +fmt: generate + go fmt ./... + +test: generate + go test $(TEST) $(TESTARGS) + +generate: + go generate ./... + +updatedeps: + go get -u golang.org/x/tools/cmd/stringer + +.PHONY: default generate test updatedeps diff --git a/vendor/github.com/hashicorp/hcl/README.md b/vendor/github.com/hashicorp/hcl/README.md new file mode 100644 index 0000000000..3d5b8bd925 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/README.md @@ -0,0 +1,104 @@ +# HCL + +[![GoDoc](https://godoc.org/github.com/hashicorp/hcl?status.png)](https://godoc.org/github.com/hashicorp/hcl) [![Build Status](https://travis-ci.org/hashicorp/hcl.svg?branch=master)](https://travis-ci.org/hashicorp/hcl) + +HCL (HashiCorp Configuration Language) is a configuration language built +by HashiCorp. The goal of HCL is to build a structured configuration language +that is both human and machine friendly for use with command-line tools, but +specifically targeted towards DevOps tools, servers, etc. + +HCL is also fully JSON compatible. That is, JSON can be used as completely +valid input to a system expecting HCL. This helps makes systems +interoperable with other systems. + +HCL is heavily inspired by +[libucl](https://github.com/vstakhov/libucl), +nginx configuration, and others similar. + +## Why? + +A common question when viewing HCL is to ask the question: why not +JSON, YAML, etc.? + +Prior to HCL, the tools we built at [HashiCorp](http://www.hashicorp.com) +used a variety of configuration languages from full programming languages +such as Ruby to complete data structure languages such as JSON. What we +learned is that some people wanted human-friendly configuration languages +and some people wanted machine-friendly languages. + +JSON fits a nice balance in this, but is fairly verbose and most +importantly doesn't support comments. With YAML, we found that beginners +had a really hard time determining what the actual structure was, and +ended up guessing more often than not whether to use a hyphen, colon, etc. +in order to represent some configuration key. + +Full programming languages such as Ruby enable complex behavior +a configuration language shouldn't usually allow, and also forces +people to learn some set of Ruby. + +Because of this, we decided to create our own configuration language +that is JSON-compatible. Our configuration language (HCL) is designed +to be written and modified by humans. The API for HCL allows JSON +as an input so that it is also machine-friendly (machines can generate +JSON instead of trying to generate HCL). + +Our goal with HCL is not to alienate other configuration languages. +It is instead to provide HCL as a specialized language for our tools, +and JSON as the interoperability layer. + +## Syntax + +For a complete grammar, please see the parser itself. A high-level overview +of the syntax and grammar is listed here. + + * Single line comments start with `#` or `//` + + * Multi-line comments are wrapped in `/*` and `*/`. Nested block comments + are not allowed. A multi-line comment (also known as a block comment) + terminates at the first `*/` found. + + * Values are assigned with the syntax `key = value` (whitespace doesn't + matter). The value can be any primitive: a string, number, boolean, + object, or list. + + * Strings are double-quoted and can contain any UTF-8 characters. + Example: `"Hello, World"` + + * Multi-line strings start with `<- + echo %Path% + + go version + + go env +build_script: +- cmd: go test -v ./... diff --git a/vendor/github.com/hashicorp/hcl/decoder.go b/vendor/github.com/hashicorp/hcl/decoder.go new file mode 100644 index 0000000000..02888d2ab6 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/decoder.go @@ -0,0 +1,654 @@ +package hcl + +import ( + "errors" + "fmt" + "reflect" + "sort" + "strconv" + "strings" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/parser" + "github.com/hashicorp/hcl/hcl/token" +) + +// This is the tag to use with structures to have settings for HCL +const tagName = "hcl" + +var ( + // nodeType holds a reference to the type of ast.Node + nodeType reflect.Type = findNodeType() +) + +// Unmarshal accepts a byte slice as input and writes the +// data to the value pointed to by v. +func Unmarshal(bs []byte, v interface{}) error { + root, err := parse(bs) + if err != nil { + return err + } + + return DecodeObject(v, root) +} + +// Decode reads the given input and decodes it into the structure +// given by `out`. +func Decode(out interface{}, in string) error { + obj, err := Parse(in) + if err != nil { + return err + } + + return DecodeObject(out, obj) +} + +// DecodeObject is a lower-level version of Decode. It decodes a +// raw Object into the given output. +func DecodeObject(out interface{}, n ast.Node) error { + val := reflect.ValueOf(out) + if val.Kind() != reflect.Ptr { + return errors.New("result must be a pointer") + } + + // If we have the file, we really decode the root node + if f, ok := n.(*ast.File); ok { + n = f.Node + } + + var d decoder + return d.decode("root", n, val.Elem()) +} + +type decoder struct { + stack []reflect.Kind +} + +func (d *decoder) decode(name string, node ast.Node, result reflect.Value) error { + k := result + + // If we have an interface with a valid value, we use that + // for the check. + if result.Kind() == reflect.Interface { + elem := result.Elem() + if elem.IsValid() { + k = elem + } + } + + // Push current onto stack unless it is an interface. + if k.Kind() != reflect.Interface { + d.stack = append(d.stack, k.Kind()) + + // Schedule a pop + defer func() { + d.stack = d.stack[:len(d.stack)-1] + }() + } + + switch k.Kind() { + case reflect.Bool: + return d.decodeBool(name, node, result) + case reflect.Float64: + return d.decodeFloat(name, node, result) + case reflect.Int: + return d.decodeInt(name, node, result) + case reflect.Interface: + // When we see an interface, we make our own thing + return d.decodeInterface(name, node, result) + case reflect.Map: + return d.decodeMap(name, node, result) + case reflect.Ptr: + return d.decodePtr(name, node, result) + case reflect.Slice: + return d.decodeSlice(name, node, result) + case reflect.String: + return d.decodeString(name, node, result) + case reflect.Struct: + return d.decodeStruct(name, node, result) + default: + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown kind to decode into: %s", name, k.Kind()), + } + } +} + +func (d *decoder) decodeBool(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + if n.Token.Type == token.BOOL { + v, err := strconv.ParseBool(n.Token.Text) + if err != nil { + return err + } + + result.Set(reflect.ValueOf(v)) + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type %T", name, node), + } +} + +func (d *decoder) decodeFloat(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + if n.Token.Type == token.FLOAT { + v, err := strconv.ParseFloat(n.Token.Text, 64) + if err != nil { + return err + } + + result.Set(reflect.ValueOf(v)) + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type %T", name, node), + } +} + +func (d *decoder) decodeInt(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + switch n.Token.Type { + case token.NUMBER: + v, err := strconv.ParseInt(n.Token.Text, 0, 0) + if err != nil { + return err + } + + result.Set(reflect.ValueOf(int(v))) + return nil + case token.STRING: + v, err := strconv.ParseInt(n.Token.Value().(string), 0, 0) + if err != nil { + return err + } + + result.Set(reflect.ValueOf(int(v))) + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type %T", name, node), + } +} + +func (d *decoder) decodeInterface(name string, node ast.Node, result reflect.Value) error { + // When we see an ast.Node, we retain the value to enable deferred decoding. + // Very useful in situations where we want to preserve ast.Node information + // like Pos + if result.Type() == nodeType && result.CanSet() { + result.Set(reflect.ValueOf(node)) + return nil + } + + var set reflect.Value + redecode := true + + // For testing types, ObjectType should just be treated as a list. We + // set this to a temporary var because we want to pass in the real node. + testNode := node + if ot, ok := node.(*ast.ObjectType); ok { + testNode = ot.List + } + + switch n := testNode.(type) { + case *ast.ObjectList: + // If we're at the root or we're directly within a slice, then we + // decode objects into map[string]interface{}, otherwise we decode + // them into lists. + if len(d.stack) == 0 || d.stack[len(d.stack)-1] == reflect.Slice { + var temp map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeMap( + reflect.MapOf( + reflect.TypeOf(""), + tempVal.Type().Elem())) + + set = result + } else { + var temp []map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeSlice( + reflect.SliceOf(tempVal.Type().Elem()), 0, len(n.Items)) + set = result + } + case *ast.ObjectType: + // If we're at the root or we're directly within a slice, then we + // decode objects into map[string]interface{}, otherwise we decode + // them into lists. + if len(d.stack) == 0 || d.stack[len(d.stack)-1] == reflect.Slice { + var temp map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeMap( + reflect.MapOf( + reflect.TypeOf(""), + tempVal.Type().Elem())) + + set = result + } else { + var temp []map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeSlice( + reflect.SliceOf(tempVal.Type().Elem()), 0, 1) + set = result + } + case *ast.ListType: + var temp []interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeSlice( + reflect.SliceOf(tempVal.Type().Elem()), 0, 0) + set = result + case *ast.LiteralType: + switch n.Token.Type { + case token.BOOL: + var result bool + set = reflect.Indirect(reflect.New(reflect.TypeOf(result))) + case token.FLOAT: + var result float64 + set = reflect.Indirect(reflect.New(reflect.TypeOf(result))) + case token.NUMBER: + var result int + set = reflect.Indirect(reflect.New(reflect.TypeOf(result))) + case token.STRING, token.HEREDOC: + set = reflect.Indirect(reflect.New(reflect.TypeOf(""))) + default: + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: cannot decode into interface: %T", name, node), + } + } + default: + return fmt.Errorf( + "%s: cannot decode into interface: %T", + name, node) + } + + // Set the result to what its supposed to be, then reset + // result so we don't reflect into this method anymore. + result.Set(set) + + if redecode { + // Revisit the node so that we can use the newly instantiated + // thing and populate it. + if err := d.decode(name, node, result); err != nil { + return err + } + } + + return nil +} + +func (d *decoder) decodeMap(name string, node ast.Node, result reflect.Value) error { + if item, ok := node.(*ast.ObjectItem); ok { + node = &ast.ObjectList{Items: []*ast.ObjectItem{item}} + } + + if ot, ok := node.(*ast.ObjectType); ok { + node = ot.List + } + + n, ok := node.(*ast.ObjectList) + if !ok { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: not an object type for map (%T)", name, node), + } + } + + // If we have an interface, then we can address the interface, + // but not the slice itself, so get the element but set the interface + set := result + if result.Kind() == reflect.Interface { + result = result.Elem() + } + + resultType := result.Type() + resultElemType := resultType.Elem() + resultKeyType := resultType.Key() + if resultKeyType.Kind() != reflect.String { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: map must have string keys", name), + } + } + + // Make a map if it is nil + resultMap := result + if result.IsNil() { + resultMap = reflect.MakeMap( + reflect.MapOf(resultKeyType, resultElemType)) + } + + // Go through each element and decode it. + done := make(map[string]struct{}) + for _, item := range n.Items { + if item.Val == nil { + continue + } + + // github.com/hashicorp/terraform/issue/5740 + if len(item.Keys) == 0 { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: map must have string keys", name), + } + } + + // Get the key we're dealing with, which is the first item + keyStr := item.Keys[0].Token.Value().(string) + + // If we've already processed this key, then ignore it + if _, ok := done[keyStr]; ok { + continue + } + + // Determine the value. If we have more than one key, then we + // get the objectlist of only these keys. + itemVal := item.Val + if len(item.Keys) > 1 { + itemVal = n.Filter(keyStr) + done[keyStr] = struct{}{} + } + + // Make the field name + fieldName := fmt.Sprintf("%s.%s", name, keyStr) + + // Get the key/value as reflection values + key := reflect.ValueOf(keyStr) + val := reflect.Indirect(reflect.New(resultElemType)) + + // If we have a pre-existing value in the map, use that + oldVal := resultMap.MapIndex(key) + if oldVal.IsValid() { + val.Set(oldVal) + } + + // Decode! + if err := d.decode(fieldName, itemVal, val); err != nil { + return err + } + + // Set the value on the map + resultMap.SetMapIndex(key, val) + } + + // Set the final map if we can + set.Set(resultMap) + return nil +} + +func (d *decoder) decodePtr(name string, node ast.Node, result reflect.Value) error { + // Create an element of the concrete (non pointer) type and decode + // into that. Then set the value of the pointer to this type. + resultType := result.Type() + resultElemType := resultType.Elem() + val := reflect.New(resultElemType) + if err := d.decode(name, node, reflect.Indirect(val)); err != nil { + return err + } + + result.Set(val) + return nil +} + +func (d *decoder) decodeSlice(name string, node ast.Node, result reflect.Value) error { + // If we have an interface, then we can address the interface, + // but not the slice itself, so get the element but set the interface + set := result + if result.Kind() == reflect.Interface { + result = result.Elem() + } + + // Create the slice if it isn't nil + resultType := result.Type() + resultElemType := resultType.Elem() + if result.IsNil() { + resultSliceType := reflect.SliceOf(resultElemType) + result = reflect.MakeSlice( + resultSliceType, 0, 0) + } + + // Figure out the items we'll be copying into the slice + var items []ast.Node + switch n := node.(type) { + case *ast.ObjectList: + items = make([]ast.Node, len(n.Items)) + for i, item := range n.Items { + items[i] = item + } + case *ast.ObjectType: + items = []ast.Node{n} + case *ast.ListType: + items = n.List + default: + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("unknown slice type: %T", node), + } + } + + for i, item := range items { + fieldName := fmt.Sprintf("%s[%d]", name, i) + + // Decode + val := reflect.Indirect(reflect.New(resultElemType)) + if err := d.decode(fieldName, item, val); err != nil { + return err + } + + // Append it onto the slice + result = reflect.Append(result, val) + } + + set.Set(result) + return nil +} + +func (d *decoder) decodeString(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + switch n.Token.Type { + case token.NUMBER: + result.Set(reflect.ValueOf(n.Token.Text).Convert(result.Type())) + return nil + case token.STRING, token.HEREDOC: + result.Set(reflect.ValueOf(n.Token.Value()).Convert(result.Type())) + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type for string %T", name, node), + } +} + +func (d *decoder) decodeStruct(name string, node ast.Node, result reflect.Value) error { + var item *ast.ObjectItem + if it, ok := node.(*ast.ObjectItem); ok { + item = it + node = it.Val + } + + if ot, ok := node.(*ast.ObjectType); ok { + node = ot.List + } + + // Handle the special case where the object itself is a literal. Previously + // the yacc parser would always ensure top-level elements were arrays. The new + // parser does not make the same guarantees, thus we need to convert any + // top-level literal elements into a list. + if _, ok := node.(*ast.LiteralType); ok { + node = &ast.ObjectList{Items: []*ast.ObjectItem{item}} + } + + list, ok := node.(*ast.ObjectList) + if !ok { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: not an object type for struct (%T)", name, node), + } + } + + // This slice will keep track of all the structs we'll be decoding. + // There can be more than one struct if there are embedded structs + // that are squashed. + structs := make([]reflect.Value, 1, 5) + structs[0] = result + + // Compile the list of all the fields that we're going to be decoding + // from all the structs. + fields := make(map[*reflect.StructField]reflect.Value) + for len(structs) > 0 { + structVal := structs[0] + structs = structs[1:] + + structType := structVal.Type() + for i := 0; i < structType.NumField(); i++ { + fieldType := structType.Field(i) + + if fieldType.Anonymous { + fieldKind := fieldType.Type.Kind() + if fieldKind != reflect.Struct { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unsupported type to struct: %s", + fieldType.Name, fieldKind), + } + } + + // We have an embedded field. We "squash" the fields down + // if specified in the tag. + squash := false + tagParts := strings.Split(fieldType.Tag.Get(tagName), ",") + for _, tag := range tagParts[1:] { + if tag == "squash" { + squash = true + break + } + } + + if squash { + structs = append( + structs, result.FieldByName(fieldType.Name)) + continue + } + } + + // Normal struct field, store it away + fields[&fieldType] = structVal.Field(i) + } + } + + usedKeys := make(map[string]struct{}) + decodedFields := make([]string, 0, len(fields)) + decodedFieldsVal := make([]reflect.Value, 0) + unusedKeysVal := make([]reflect.Value, 0) + for fieldType, field := range fields { + if !field.IsValid() { + // This should never happen + panic("field is not valid") + } + + // If we can't set the field, then it is unexported or something, + // and we just continue onwards. + if !field.CanSet() { + continue + } + + fieldName := fieldType.Name + + tagValue := fieldType.Tag.Get(tagName) + tagParts := strings.SplitN(tagValue, ",", 2) + if len(tagParts) >= 2 { + switch tagParts[1] { + case "decodedFields": + decodedFieldsVal = append(decodedFieldsVal, field) + continue + case "key": + if item == nil { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: %s asked for 'key', impossible", + name, fieldName), + } + } + + field.SetString(item.Keys[0].Token.Value().(string)) + continue + case "unusedKeys": + unusedKeysVal = append(unusedKeysVal, field) + continue + } + } + + if tagParts[0] != "" { + fieldName = tagParts[0] + } + + // Determine the element we'll use to decode. If it is a single + // match (only object with the field), then we decode it exactly. + // If it is a prefix match, then we decode the matches. + filter := list.Filter(fieldName) + prefixMatches := filter.Children() + matches := filter.Elem() + if len(matches.Items) == 0 && len(prefixMatches.Items) == 0 { + continue + } + + // Track the used key + usedKeys[fieldName] = struct{}{} + + // Create the field name and decode. We range over the elements + // because we actually want the value. + fieldName = fmt.Sprintf("%s.%s", name, fieldName) + if len(prefixMatches.Items) > 0 { + if err := d.decode(fieldName, prefixMatches, field); err != nil { + return err + } + } + for _, match := range matches.Items { + var decodeNode ast.Node = match.Val + if ot, ok := decodeNode.(*ast.ObjectType); ok { + decodeNode = &ast.ObjectList{Items: ot.List.Items} + } + + if err := d.decode(fieldName, decodeNode, field); err != nil { + return err + } + } + + decodedFields = append(decodedFields, fieldType.Name) + } + + if len(decodedFieldsVal) > 0 { + // Sort it so that it is deterministic + sort.Strings(decodedFields) + + for _, v := range decodedFieldsVal { + v.Set(reflect.ValueOf(decodedFields)) + } + } + + return nil +} + +// findNodeType returns the type of ast.Node +func findNodeType() reflect.Type { + var nodeContainer struct { + Node ast.Node + } + value := reflect.ValueOf(nodeContainer).FieldByName("Node") + return value.Type() +} diff --git a/vendor/github.com/hashicorp/hcl/decoder_test.go b/vendor/github.com/hashicorp/hcl/decoder_test.go new file mode 100644 index 0000000000..5aea64a018 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/decoder_test.go @@ -0,0 +1,730 @@ +package hcl + +import ( + "io/ioutil" + "path/filepath" + "reflect" + "testing" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/testhelper" +) + +func TestDecode_interface(t *testing.T) { + cases := []struct { + File string + Err bool + Out interface{} + }{ + { + "basic.hcl", + false, + map[string]interface{}{ + "foo": "bar", + "bar": "${file(\"bing/bong.txt\")}", + }, + }, + { + "basic_squish.hcl", + false, + map[string]interface{}{ + "foo": "bar", + "bar": "${file(\"bing/bong.txt\")}", + "foo-bar": "baz", + }, + }, + { + "empty.hcl", + false, + map[string]interface{}{ + "resource": []map[string]interface{}{ + map[string]interface{}{ + "foo": []map[string]interface{}{ + map[string]interface{}{}, + }, + }, + }, + }, + }, + { + "tfvars.hcl", + false, + map[string]interface{}{ + "regularvar": "Should work", + "map.key1": "Value", + "map.key2": "Other value", + }, + }, + { + "escape.hcl", + false, + map[string]interface{}{ + "foo": "bar\"baz\\n", + }, + }, + { + "interpolate_escape.hcl", + false, + map[string]interface{}{ + "foo": "${file(\"bing/bong.txt\")}", + }, + }, + { + "float.hcl", + false, + map[string]interface{}{ + "a": 1.02, + }, + }, + { + "multiline_bad.hcl", + true, + nil, + }, + { + "multiline_no_marker.hcl", + true, + nil, + }, + { + "multiline.hcl", + false, + map[string]interface{}{"foo": testhelper.Unix2dos("bar\nbaz\n")}, + }, + { + "multiline_indented.hcl", + false, + map[string]interface{}{"foo": testhelper.Unix2dos(" bar\n baz\n")}, + }, + { + "multiline_no_hanging_indent.hcl", + false, + map[string]interface{}{"foo": testhelper.Unix2dos(" baz\n bar\n foo\n")}, + }, + { + "multiline_no_eof.hcl", + false, + map[string]interface{}{"foo": testhelper.Unix2dos("bar\nbaz\n"), "key": "value"}, + }, + { + "multiline.json", + false, + map[string]interface{}{"foo": "bar\nbaz"}, + }, + { + "scientific.json", + false, + map[string]interface{}{ + "a": 1e-10, + "b": 1e+10, + "c": 1e10, + "d": 1.2e-10, + "e": 1.2e+10, + "f": 1.2e10, + }, + }, + { + "scientific.hcl", + false, + map[string]interface{}{ + "a": 1e-10, + "b": 1e+10, + "c": 1e10, + "d": 1.2e-10, + "e": 1.2e+10, + "f": 1.2e10, + }, + }, + { + "terraform_heroku.hcl", + false, + map[string]interface{}{ + "name": "terraform-test-app", + "config_vars": []map[string]interface{}{ + map[string]interface{}{ + "FOO": "bar", + }, + }, + }, + }, + { + "structure_multi.hcl", + false, + map[string]interface{}{ + "foo": []map[string]interface{}{ + map[string]interface{}{ + "baz": []map[string]interface{}{ + map[string]interface{}{"key": 7}, + }, + }, + map[string]interface{}{ + "bar": []map[string]interface{}{ + map[string]interface{}{"key": 12}, + }, + }, + }, + }, + }, + { + "structure_multi.json", + false, + map[string]interface{}{ + "foo": []map[string]interface{}{ + map[string]interface{}{ + "baz": []map[string]interface{}{ + map[string]interface{}{"key": 7}, + }, + }, + map[string]interface{}{ + "bar": []map[string]interface{}{ + map[string]interface{}{"key": 12}, + }, + }, + }, + }, + }, + { + "structure_list.hcl", + false, + map[string]interface{}{ + "foo": []map[string]interface{}{ + map[string]interface{}{ + "key": 7, + }, + map[string]interface{}{ + "key": 12, + }, + }, + }, + }, + { + "structure_list.json", + false, + map[string]interface{}{ + "foo": []map[string]interface{}{ + map[string]interface{}{ + "key": 7, + }, + map[string]interface{}{ + "key": 12, + }, + }, + }, + }, + { + "structure_list_deep.json", + false, + map[string]interface{}{ + "bar": []map[string]interface{}{ + map[string]interface{}{ + "foo": []map[string]interface{}{ + map[string]interface{}{ + "name": "terraform_example", + "ingress": []map[string]interface{}{ + map[string]interface{}{ + "from_port": 22, + }, + map[string]interface{}{ + "from_port": 80, + }, + }, + }, + }, + }, + }, + }, + }, + + { + "nested_block_comment.hcl", + false, + map[string]interface{}{ + "bar": "value", + }, + }, + + { + "unterminated_block_comment.hcl", + true, + nil, + }, + + { + "unterminated_brace.hcl", + true, + nil, + }, + + { + "nested_provider_bad.hcl", + true, + // This is not ideal but without significant rework of the decoder + // we get a partial result back as well as an error. + map[string]interface{}{}, + }, + + { + "object_list.json", + false, + map[string]interface{}{ + "resource": []map[string]interface{}{ + map[string]interface{}{ + "aws_instance": []map[string]interface{}{ + map[string]interface{}{ + "db": []map[string]interface{}{ + map[string]interface{}{ + "vpc": "foo", + "provisioner": []map[string]interface{}{ + map[string]interface{}{ + "file": []map[string]interface{}{ + map[string]interface{}{ + "source": "foo", + "destination": "bar", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + } + + for _, tc := range cases { + t.Logf("Testing: %s", tc.File) + d, err := ioutil.ReadFile(filepath.Join(fixtureDir, tc.File)) + if err != nil { + t.Fatalf("err: %s", err) + } + + var out interface{} + err = Decode(&out, string(d)) + if (err != nil) != tc.Err { + t.Fatalf("Input: %s\n\nError: %s", tc.File, err) + } + + if !reflect.DeepEqual(out, tc.Out) { + t.Fatalf("Input: %s. Actual, Expected.\n\n%#v\n\n%#v", tc.File, out, tc.Out) + } + + var v interface{} + err = Unmarshal(d, &v) + if (err != nil) != tc.Err { + t.Fatalf("Input: %s\n\nError: %s", tc.File, err) + } + + if !reflect.DeepEqual(v, tc.Out) { + t.Fatalf("Input: %s. Actual, Expected.\n\n%#v\n\n%#v", tc.File, out, tc.Out) + } + } +} + +func TestDecode_equal(t *testing.T) { + cases := []struct { + One, Two string + }{ + { + "basic.hcl", + "basic.json", + }, + { + "float.hcl", + "float.json", + }, + /* + { + "structure.hcl", + "structure.json", + }, + */ + { + "structure.hcl", + "structure_flat.json", + }, + { + "terraform_heroku.hcl", + "terraform_heroku.json", + }, + } + + for _, tc := range cases { + p1 := filepath.Join(fixtureDir, tc.One) + p2 := filepath.Join(fixtureDir, tc.Two) + + d1, err := ioutil.ReadFile(p1) + if err != nil { + t.Fatalf("err: %s", err) + } + + d2, err := ioutil.ReadFile(p2) + if err != nil { + t.Fatalf("err: %s", err) + } + + var i1, i2 interface{} + err = Decode(&i1, string(d1)) + if err != nil { + t.Fatalf("err: %s", err) + } + + err = Decode(&i2, string(d2)) + if err != nil { + t.Fatalf("err: %s", err) + } + + if !reflect.DeepEqual(i1, i2) { + t.Fatalf( + "%s != %s\n\n%#v\n\n%#v", + tc.One, tc.Two, + i1, i2) + } + } +} + +func TestDecode_flatMap(t *testing.T) { + var val map[string]map[string]string + + err := Decode(&val, testReadFile(t, "structure_flatmap.hcl")) + if err != nil { + t.Fatalf("err: %s", err) + } + + expected := map[string]map[string]string{ + "foo": map[string]string{ + "foo": "bar", + "key": "7", + }, + } + + if !reflect.DeepEqual(val, expected) { + t.Fatalf("Actual: %#v\n\nExpected: %#v", val, expected) + } +} + +func TestDecode_structure(t *testing.T) { + type V struct { + Key int + Foo string + } + + var actual V + + err := Decode(&actual, testReadFile(t, "flat.hcl")) + if err != nil { + t.Fatalf("err: %s", err) + } + + expected := V{ + Key: 7, + Foo: "bar", + } + + if !reflect.DeepEqual(actual, expected) { + t.Fatalf("Actual: %#v\n\nExpected: %#v", actual, expected) + } +} + +func TestDecode_structurePtr(t *testing.T) { + type V struct { + Key int + Foo string + } + + var actual *V + + err := Decode(&actual, testReadFile(t, "flat.hcl")) + if err != nil { + t.Fatalf("err: %s", err) + } + + expected := &V{ + Key: 7, + Foo: "bar", + } + + if !reflect.DeepEqual(actual, expected) { + t.Fatalf("Actual: %#v\n\nExpected: %#v", actual, expected) + } +} + +func TestDecode_structureArray(t *testing.T) { + // This test is extracted from a failure in Consul (consul.io), + // hence the interesting structure naming. + + type KeyPolicyType string + + type KeyPolicy struct { + Prefix string `hcl:",key"` + Policy KeyPolicyType + } + + type Policy struct { + Keys []KeyPolicy `hcl:"key,expand"` + } + + expected := Policy{ + Keys: []KeyPolicy{ + KeyPolicy{ + Prefix: "", + Policy: "read", + }, + KeyPolicy{ + Prefix: "foo/", + Policy: "write", + }, + KeyPolicy{ + Prefix: "foo/bar/", + Policy: "read", + }, + KeyPolicy{ + Prefix: "foo/bar/baz", + Policy: "deny", + }, + }, + } + + files := []string{ + "decode_policy.hcl", + "decode_policy.json", + } + + for _, f := range files { + var actual Policy + + err := Decode(&actual, testReadFile(t, f)) + if err != nil { + t.Fatalf("Input: %s\n\nerr: %s", f, err) + } + + if !reflect.DeepEqual(actual, expected) { + t.Fatalf("Input: %s\n\nActual: %#v\n\nExpected: %#v", f, actual, expected) + } + } +} + +func TestDecode_sliceExpand(t *testing.T) { + type testInner struct { + Name string `hcl:",key"` + Key string + } + + type testStruct struct { + Services []testInner `hcl:"service,expand"` + } + + expected := testStruct{ + Services: []testInner{ + testInner{ + Name: "my-service-0", + Key: "value", + }, + testInner{ + Name: "my-service-1", + Key: "value", + }, + }, + } + + files := []string{ + "slice_expand.hcl", + } + + for _, f := range files { + t.Logf("Testing: %s", f) + + var actual testStruct + err := Decode(&actual, testReadFile(t, f)) + if err != nil { + t.Fatalf("Input: %s\n\nerr: %s", f, err) + } + + if !reflect.DeepEqual(actual, expected) { + t.Fatalf("Input: %s\n\nActual: %#v\n\nExpected: %#v", f, actual, expected) + } + } +} + +func TestDecode_structureMap(t *testing.T) { + // This test is extracted from a failure in Terraform (terraform.io), + // hence the interesting structure naming. + + type hclVariable struct { + Default interface{} + Description string + Fields []string `hcl:",decodedFields"` + } + + type rawConfig struct { + Variable map[string]hclVariable + } + + expected := rawConfig{ + Variable: map[string]hclVariable{ + "foo": hclVariable{ + Default: "bar", + Description: "bar", + Fields: []string{"Default", "Description"}, + }, + + "amis": hclVariable{ + Default: []map[string]interface{}{ + map[string]interface{}{ + "east": "foo", + }, + }, + Fields: []string{"Default"}, + }, + }, + } + + files := []string{ + "decode_tf_variable.hcl", + "decode_tf_variable.json", + } + + for _, f := range files { + t.Logf("Testing: %s", f) + + var actual rawConfig + err := Decode(&actual, testReadFile(t, f)) + if err != nil { + t.Fatalf("Input: %s\n\nerr: %s", f, err) + } + + if !reflect.DeepEqual(actual, expected) { + t.Fatalf("Input: %s\n\nActual: %#v\n\nExpected: %#v", f, actual, expected) + } + } +} + +func TestDecode_interfaceNonPointer(t *testing.T) { + var value interface{} + err := Decode(value, testReadFile(t, "basic_int_string.hcl")) + if err == nil { + t.Fatal("should error") + } +} + +func TestDecode_intString(t *testing.T) { + var value struct { + Count int + } + + err := Decode(&value, testReadFile(t, "basic_int_string.hcl")) + if err != nil { + t.Fatalf("err: %s", err) + } + + if value.Count != 3 { + t.Fatalf("bad: %#v", value.Count) + } +} + +func TestDecode_Node(t *testing.T) { + // given + var value struct { + Content ast.Node + Nested struct { + Content ast.Node + } + } + + content := ` +content { + hello = "world" +} +` + + // when + err := Decode(&value, content) + + // then + if err != nil { + t.Errorf("unable to decode content, %v", err) + return + } + + // verify ast.Node can be decoded later + var v map[string]interface{} + err = DecodeObject(&v, value.Content) + if err != nil { + t.Errorf("unable to decode content, %v", err) + return + } + + if v["hello"] != "world" { + t.Errorf("expected mapping to be returned") + } +} + +func TestDecode_NestedNode(t *testing.T) { + // given + var value struct { + Nested struct { + Content ast.Node + } + } + + content := ` +nested "content" { + hello = "world" +} +` + + // when + err := Decode(&value, content) + + // then + if err != nil { + t.Errorf("unable to decode content, %v", err) + return + } + + // verify ast.Node can be decoded later + var v map[string]interface{} + err = DecodeObject(&v, value.Nested.Content) + if err != nil { + t.Errorf("unable to decode content, %v", err) + return + } + + if v["hello"] != "world" { + t.Errorf("expected mapping to be returned") + } +} + +// https://github.com/hashicorp/hcl/issues/60 +func TestDecode_topLevelKeys(t *testing.T) { + type Template struct { + Source string + } + + templates := struct { + Templates []*Template `hcl:"template"` + }{} + + err := Decode(&templates, ` + template { + source = "blah" + } + + template { + source = "blahblah" + }`) + + if err != nil { + t.Fatal(err) + } + + if templates.Templates[0].Source != "blah" { + t.Errorf("bad source: %s", templates.Templates[0].Source) + } + + if templates.Templates[1].Source != "blahblah" { + t.Errorf("bad source: %s", templates.Templates[1].Source) + } +} diff --git a/vendor/github.com/hashicorp/hcl/hcl.go b/vendor/github.com/hashicorp/hcl/hcl.go new file mode 100644 index 0000000000..575a20b50b --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl.go @@ -0,0 +1,11 @@ +// Package hcl decodes HCL into usable Go structures. +// +// hcl input can come in either pure HCL format or JSON format. +// It can be parsed into an AST, and then decoded into a structure, +// or it can be decoded directly from a string into a structure. +// +// If you choose to parse HCL into a raw AST, the benefit is that you +// can write custom visitor implementations to implement custom +// semantic checks. By default, HCL does not perform any semantic +// checks. +package hcl diff --git a/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go b/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go new file mode 100644 index 0000000000..f8bb71a047 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go @@ -0,0 +1,211 @@ +// Package ast declares the types used to represent syntax trees for HCL +// (HashiCorp Configuration Language) +package ast + +import ( + "fmt" + "strings" + + "github.com/hashicorp/hcl/hcl/token" +) + +// Node is an element in the abstract syntax tree. +type Node interface { + node() + Pos() token.Pos +} + +func (File) node() {} +func (ObjectList) node() {} +func (ObjectKey) node() {} +func (ObjectItem) node() {} +func (Comment) node() {} +func (CommentGroup) node() {} +func (ObjectType) node() {} +func (LiteralType) node() {} +func (ListType) node() {} + +// File represents a single HCL file +type File struct { + Node Node // usually a *ObjectList + Comments []*CommentGroup // list of all comments in the source +} + +func (f *File) Pos() token.Pos { + return f.Node.Pos() +} + +// ObjectList represents a list of ObjectItems. An HCL file itself is an +// ObjectList. +type ObjectList struct { + Items []*ObjectItem +} + +func (o *ObjectList) Add(item *ObjectItem) { + o.Items = append(o.Items, item) +} + +// Filter filters out the objects with the given key list as a prefix. +// +// The returned list of objects contain ObjectItems where the keys have +// this prefix already stripped off. This might result in objects with +// zero-length key lists if they have no children. +// +// If no matches are found, an empty ObjectList (non-nil) is returned. +func (o *ObjectList) Filter(keys ...string) *ObjectList { + var result ObjectList + for _, item := range o.Items { + // If there aren't enough keys, then ignore this + if len(item.Keys) < len(keys) { + continue + } + + match := true + for i, key := range item.Keys[:len(keys)] { + key := key.Token.Value().(string) + if key != keys[i] && !strings.EqualFold(key, keys[i]) { + match = false + break + } + } + if !match { + continue + } + + // Strip off the prefix from the children + newItem := *item + newItem.Keys = newItem.Keys[len(keys):] + result.Add(&newItem) + } + + return &result +} + +// Children returns further nested objects (key length > 0) within this +// ObjectList. This should be used with Filter to get at child items. +func (o *ObjectList) Children() *ObjectList { + var result ObjectList + for _, item := range o.Items { + if len(item.Keys) > 0 { + result.Add(item) + } + } + + return &result +} + +// Elem returns items in the list that are direct element assignments +// (key length == 0). This should be used with Filter to get at elements. +func (o *ObjectList) Elem() *ObjectList { + var result ObjectList + for _, item := range o.Items { + if len(item.Keys) == 0 { + result.Add(item) + } + } + + return &result +} + +func (o *ObjectList) Pos() token.Pos { + // always returns the uninitiliazed position + return o.Items[0].Pos() +} + +// ObjectItem represents a HCL Object Item. An item is represented with a key +// (or keys). It can be an assignment or an object (both normal and nested) +type ObjectItem struct { + // keys is only one length long if it's of type assignment. If it's a + // nested object it can be larger than one. In that case "assign" is + // invalid as there is no assignments for a nested object. + Keys []*ObjectKey + + // assign contains the position of "=", if any + Assign token.Pos + + // val is the item itself. It can be an object,list, number, bool or a + // string. If key length is larger than one, val can be only of type + // Object. + Val Node + + LeadComment *CommentGroup // associated lead comment + LineComment *CommentGroup // associated line comment +} + +func (o *ObjectItem) Pos() token.Pos { + return o.Keys[0].Pos() +} + +// ObjectKeys are either an identifier or of type string. +type ObjectKey struct { + Token token.Token +} + +func (o *ObjectKey) Pos() token.Pos { + return o.Token.Pos +} + +// LiteralType represents a literal of basic type. Valid types are: +// token.NUMBER, token.FLOAT, token.BOOL and token.STRING +type LiteralType struct { + Token token.Token + + // associated line comment, only when used in a list + LineComment *CommentGroup +} + +func (l *LiteralType) Pos() token.Pos { + return l.Token.Pos +} + +// ListStatement represents a HCL List type +type ListType struct { + Lbrack token.Pos // position of "[" + Rbrack token.Pos // position of "]" + List []Node // the elements in lexical order +} + +func (l *ListType) Pos() token.Pos { + return l.Lbrack +} + +func (l *ListType) Add(node Node) { + l.List = append(l.List, node) +} + +// ObjectType represents a HCL Object Type +type ObjectType struct { + Lbrace token.Pos // position of "{" + Rbrace token.Pos // position of "}" + List *ObjectList // the nodes in lexical order +} + +func (o *ObjectType) Pos() token.Pos { + return o.Lbrace +} + +// Comment node represents a single //, # style or /*- style commment +type Comment struct { + Start token.Pos // position of / or # + Text string +} + +func (c *Comment) Pos() token.Pos { + return c.Start +} + +// CommentGroup node represents a sequence of comments with no other tokens and +// no empty lines between. +type CommentGroup struct { + List []*Comment // len(List) > 0 +} + +func (c *CommentGroup) Pos() token.Pos { + return c.List[0].Pos() +} + +//------------------------------------------------------------------- +// GoStringer +//------------------------------------------------------------------- + +func (o *ObjectKey) GoString() string { return fmt.Sprintf("*%#v", *o) } diff --git a/vendor/github.com/hashicorp/hcl/hcl/ast/ast_test.go b/vendor/github.com/hashicorp/hcl/hcl/ast/ast_test.go new file mode 100644 index 0000000000..942256cadc --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/ast/ast_test.go @@ -0,0 +1,200 @@ +package ast + +import ( + "reflect" + "strings" + "testing" + + "github.com/hashicorp/hcl/hcl/token" +) + +func TestObjectListFilter(t *testing.T) { + var cases = []struct { + Filter []string + Input []*ObjectItem + Output []*ObjectItem + }{ + { + []string{"foo"}, + []*ObjectItem{ + &ObjectItem{ + Keys: []*ObjectKey{ + &ObjectKey{ + Token: token.Token{Type: token.STRING, Text: `"foo"`}, + }, + }, + }, + }, + []*ObjectItem{ + &ObjectItem{ + Keys: []*ObjectKey{}, + }, + }, + }, + + { + []string{"foo"}, + []*ObjectItem{ + &ObjectItem{ + Keys: []*ObjectKey{ + &ObjectKey{Token: token.Token{Type: token.STRING, Text: `"foo"`}}, + &ObjectKey{Token: token.Token{Type: token.STRING, Text: `"bar"`}}, + }, + }, + &ObjectItem{ + Keys: []*ObjectKey{ + &ObjectKey{Token: token.Token{Type: token.STRING, Text: `"baz"`}}, + }, + }, + }, + []*ObjectItem{ + &ObjectItem{ + Keys: []*ObjectKey{ + &ObjectKey{Token: token.Token{Type: token.STRING, Text: `"bar"`}}, + }, + }, + }, + }, + } + + for _, tc := range cases { + input := &ObjectList{Items: tc.Input} + expected := &ObjectList{Items: tc.Output} + if actual := input.Filter(tc.Filter...); !reflect.DeepEqual(actual, expected) { + t.Fatalf("in order: input, expected, actual\n\n%#v\n\n%#v\n\n%#v", input, expected, actual) + } + } +} + +func TestWalk(t *testing.T) { + items := []*ObjectItem{ + &ObjectItem{ + Keys: []*ObjectKey{ + &ObjectKey{Token: token.Token{Type: token.STRING, Text: `"foo"`}}, + &ObjectKey{Token: token.Token{Type: token.STRING, Text: `"bar"`}}, + }, + Val: &LiteralType{Token: token.Token{Type: token.STRING, Text: `"example"`}}, + }, + &ObjectItem{ + Keys: []*ObjectKey{ + &ObjectKey{Token: token.Token{Type: token.STRING, Text: `"baz"`}}, + }, + }, + } + + node := &ObjectList{Items: items} + + order := []string{ + "*ast.ObjectList", + "*ast.ObjectItem", + "*ast.ObjectKey", + "*ast.ObjectKey", + "*ast.LiteralType", + "*ast.ObjectItem", + "*ast.ObjectKey", + } + count := 0 + + Walk(node, func(n Node) (Node, bool) { + if n == nil { + return n, false + } + + typeName := reflect.TypeOf(n).String() + if order[count] != typeName { + t.Errorf("expected '%s' got: '%s'", order[count], typeName) + } + count++ + return n, true + }) +} + +func TestWalkEquality(t *testing.T) { + items := []*ObjectItem{ + &ObjectItem{ + Keys: []*ObjectKey{ + &ObjectKey{Token: token.Token{Type: token.STRING, Text: `"foo"`}}, + }, + }, + &ObjectItem{ + Keys: []*ObjectKey{ + &ObjectKey{Token: token.Token{Type: token.STRING, Text: `"bar"`}}, + }, + }, + } + + node := &ObjectList{Items: items} + + rewritten := Walk(node, func(n Node) (Node, bool) { return n, true }) + + newNode, ok := rewritten.(*ObjectList) + if !ok { + t.Fatalf("expected Objectlist, got %T", rewritten) + } + + if !reflect.DeepEqual(node, newNode) { + t.Fatal("rewritten node is not equal to the given node") + } + + if len(newNode.Items) != 2 { + t.Error("expected newNode length 2, got: %d", len(newNode.Items)) + } + + expected := []string{ + `"foo"`, + `"bar"`, + } + + for i, item := range newNode.Items { + if len(item.Keys) != 1 { + t.Error("expected keys newNode length 1, got: %d", len(item.Keys)) + } + + if item.Keys[0].Token.Text != expected[i] { + t.Errorf("expected key %s, got %s", expected[i], item.Keys[0].Token.Text) + } + + if item.Val != nil { + t.Errorf("expected item value should be nil") + } + } +} + +func TestWalkRewrite(t *testing.T) { + items := []*ObjectItem{ + &ObjectItem{ + Keys: []*ObjectKey{ + &ObjectKey{Token: token.Token{Type: token.STRING, Text: `"foo"`}}, + &ObjectKey{Token: token.Token{Type: token.STRING, Text: `"bar"`}}, + }, + }, + &ObjectItem{ + Keys: []*ObjectKey{ + &ObjectKey{Token: token.Token{Type: token.STRING, Text: `"baz"`}}, + }, + }, + } + + node := &ObjectList{Items: items} + + suffix := "_example" + node = Walk(node, func(n Node) (Node, bool) { + switch i := n.(type) { + case *ObjectKey: + i.Token.Text = i.Token.Text + suffix + n = i + } + return n, true + }).(*ObjectList) + + Walk(node, func(n Node) (Node, bool) { + switch i := n.(type) { + case *ObjectKey: + if !strings.HasSuffix(i.Token.Text, suffix) { + t.Errorf("Token '%s' should have suffix: %s", i.Token.Text, suffix) + } + } + return n, true + }) + +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/ast/walk.go b/vendor/github.com/hashicorp/hcl/hcl/ast/walk.go new file mode 100644 index 0000000000..ba07ad42b0 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/ast/walk.go @@ -0,0 +1,52 @@ +package ast + +import "fmt" + +// WalkFunc describes a function to be called for each node during a Walk. The +// returned node can be used to rewrite the AST. Walking stops the returned +// bool is false. +type WalkFunc func(Node) (Node, bool) + +// Walk traverses an AST in depth-first order: It starts by calling fn(node); +// node must not be nil. If fn returns true, Walk invokes fn recursively for +// each of the non-nil children of node, followed by a call of fn(nil). The +// returned node of fn can be used to rewrite the passed node to fn. +func Walk(node Node, fn WalkFunc) Node { + rewritten, ok := fn(node) + if !ok { + return rewritten + } + + switch n := node.(type) { + case *File: + n.Node = Walk(n.Node, fn) + case *ObjectList: + for i, item := range n.Items { + n.Items[i] = Walk(item, fn).(*ObjectItem) + } + case *ObjectKey: + // nothing to do + case *ObjectItem: + for i, k := range n.Keys { + n.Keys[i] = Walk(k, fn).(*ObjectKey) + } + + if n.Val != nil { + n.Val = Walk(n.Val, fn) + } + case *LiteralType: + // nothing to do + case *ListType: + for i, l := range n.List { + n.List[i] = Walk(l, fn) + } + case *ObjectType: + n.List = Walk(n.List, fn).(*ObjectList) + default: + // should we panic here? + fmt.Printf("unknown type: %T\n", n) + } + + fn(nil) + return rewritten +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/fmtcmd.go b/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/fmtcmd.go new file mode 100644 index 0000000000..afc1e4eb12 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/fmtcmd.go @@ -0,0 +1,164 @@ +// Derivative work from: +// - https://golang.org/src/cmd/gofmt/gofmt.go +// - https://github.com/fatih/hclfmt + +package fmtcmd + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "strings" + + "github.com/hashicorp/hcl/hcl/printer" +) + +var ( + ErrWriteStdin = errors.New("cannot use write option with standard input") +) + +type Options struct { + List bool // list files whose formatting differs + Write bool // write result to (source) file instead of stdout + Diff bool // display diffs instead of rewriting files +} + +func isValidFile(f os.FileInfo, extensions []string) bool { + if !f.IsDir() && !strings.HasPrefix(f.Name(), ".") { + for _, ext := range extensions { + if strings.HasSuffix(f.Name(), "."+ext) { + return true + } + } + } + + return false +} + +// If in == nil, the source is the contents of the file with the given filename. +func processFile(filename string, in io.Reader, out io.Writer, stdin bool, opts Options) error { + if in == nil { + f, err := os.Open(filename) + if err != nil { + return err + } + defer f.Close() + in = f + } + + src, err := ioutil.ReadAll(in) + if err != nil { + return err + } + + res, err := printer.Format(src) + if err != nil { + return err + } + // Files should end with newlines + res = append(res, []byte("\n")...) + + if !bytes.Equal(src, res) { + // formatting has changed + if opts.List { + fmt.Fprintln(out, filename) + } + if opts.Write { + err = ioutil.WriteFile(filename, res, 0644) + if err != nil { + return err + } + } + if opts.Diff { + data, err := diff(src, res) + if err != nil { + return fmt.Errorf("computing diff: %s", err) + } + fmt.Fprintf(out, "diff a/%s b/%s\n", filename, filename) + out.Write(data) + } + } + + if !opts.List && !opts.Write && !opts.Diff { + _, err = out.Write(res) + } + + return err +} + +func walkDir(path string, extensions []string, stdout io.Writer, opts Options) error { + visitFile := func(path string, f os.FileInfo, err error) error { + if err == nil && isValidFile(f, extensions) { + err = processFile(path, nil, stdout, false, opts) + } + return err + } + + return filepath.Walk(path, visitFile) +} + +func Run( + paths, extensions []string, + stdin io.Reader, + stdout io.Writer, + opts Options, +) error { + if len(paths) == 0 { + if opts.Write { + return ErrWriteStdin + } + if err := processFile("", stdin, stdout, true, opts); err != nil { + return err + } + return nil + } + + for _, path := range paths { + switch dir, err := os.Stat(path); { + case err != nil: + return err + case dir.IsDir(): + if err := walkDir(path, extensions, stdout, opts); err != nil { + return err + } + default: + if err := processFile(path, nil, stdout, false, opts); err != nil { + return err + } + } + } + + return nil +} + +func diff(b1, b2 []byte) (data []byte, err error) { + f1, err := ioutil.TempFile("", "") + if err != nil { + return + } + defer os.Remove(f1.Name()) + defer f1.Close() + + f2, err := ioutil.TempFile("", "") + if err != nil { + return + } + defer os.Remove(f2.Name()) + defer f2.Close() + + f1.Write(b1) + f2.Write(b2) + + data, err = exec.Command("diff", "-u", f1.Name(), f2.Name()).CombinedOutput() + if len(data) > 0 { + // diff exits with a non-zero status when the files don't match. + // Ignore that failure as long as we get output. + err = nil + } + return +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/fmtcmd_test.go b/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/fmtcmd_test.go new file mode 100644 index 0000000000..b8cf5ee06a --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/fmtcmd_test.go @@ -0,0 +1,440 @@ +// +build -windows +// TODO(jen20): These need fixing on Windows but fmt is not used right now +// and red CI is making it harder to process other bugs, so ignore until +// we get around to fixing them. + +package fmtcmd + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "reflect" + "regexp" + "sort" + "syscall" + "testing" + + "github.com/hashicorp/hcl/testhelper" +) + +var fixtureExtensions = []string{"hcl"} + +func init() { + sort.Sort(ByFilename(fixtures)) +} + +func TestIsValidFile(t *testing.T) { + const fixtureDir = "./test-fixtures" + + cases := []struct { + Path string + Expected bool + }{ + {"good.hcl", true}, + {".hidden.ignore", false}, + {"file.ignore", false}, + {"dir.ignore", false}, + } + + for _, tc := range cases { + file, err := os.Stat(filepath.Join(fixtureDir, tc.Path)) + if err != nil { + t.Errorf("unexpected error: %s", err) + } + + if res := isValidFile(file, fixtureExtensions); res != tc.Expected { + t.Errorf("want: %b, got: %b", tc.Expected, res) + } + } +} + +func TestRunMultiplePaths(t *testing.T) { + path1, err := renderFixtures("") + if err != nil { + t.Errorf("unexpected error: %s", err) + } + defer os.RemoveAll(path1) + path2, err := renderFixtures("") + if err != nil { + t.Errorf("unexpected error: %s", err) + } + defer os.RemoveAll(path2) + + var expectedOut bytes.Buffer + for _, path := range []string{path1, path2} { + for _, fixture := range fixtures { + if !bytes.Equal(fixture.golden, fixture.input) { + expectedOut.WriteString(filepath.Join(path, fixture.filename) + "\n") + } + } + } + + _, stdout := mockIO() + err = Run( + []string{path1, path2}, + fixtureExtensions, + nil, stdout, + Options{ + List: true, + }, + ) + + if err != nil { + t.Errorf("unexpected error: %s", err) + } + if stdout.String() != expectedOut.String() { + t.Errorf("stdout want:\n%s\ngot:\n%s", expectedOut, stdout) + } +} + +func TestRunSubDirectories(t *testing.T) { + pathParent, err := ioutil.TempDir("", "") + if err != nil { + t.Errorf("unexpected error: %s", err) + } + defer os.RemoveAll(pathParent) + + path1, err := renderFixtures(pathParent) + if err != nil { + t.Errorf("unexpected error: %s", err) + } + path2, err := renderFixtures(pathParent) + if err != nil { + t.Errorf("unexpected error: %s", err) + } + + paths := []string{path1, path2} + sort.Strings(paths) + + var expectedOut bytes.Buffer + for _, path := range paths { + for _, fixture := range fixtures { + if !bytes.Equal(fixture.golden, fixture.input) { + expectedOut.WriteString(filepath.Join(path, fixture.filename) + "\n") + } + } + } + + _, stdout := mockIO() + err = Run( + []string{pathParent}, + fixtureExtensions, + nil, stdout, + Options{ + List: true, + }, + ) + + if err != nil { + t.Errorf("unexpected error: %s", err) + } + if stdout.String() != expectedOut.String() { + t.Errorf("stdout want:\n%s\ngot:\n%s", expectedOut, stdout) + } +} + +func TestRunStdin(t *testing.T) { + var expectedOut bytes.Buffer + for i, fixture := range fixtures { + if i != 0 { + expectedOut.WriteString("\n") + } + expectedOut.Write(fixture.golden) + } + + stdin, stdout := mockIO() + for _, fixture := range fixtures { + stdin.Write(fixture.input) + } + + err := Run( + []string{}, + fixtureExtensions, + stdin, stdout, + Options{}, + ) + + if err != nil { + t.Errorf("unexpected error: %s", err) + } + if !bytes.Equal(stdout.Bytes(), expectedOut.Bytes()) { + t.Errorf("stdout want:\n%s\ngot:\n%s", expectedOut, stdout) + } +} + +func TestRunStdinAndWrite(t *testing.T) { + var expectedOut = []byte{} + + stdin, stdout := mockIO() + stdin.WriteString("") + err := Run( + []string{}, []string{}, + stdin, stdout, + Options{ + Write: true, + }, + ) + + if err != ErrWriteStdin { + t.Errorf("error want:\n%s\ngot:\n%s", ErrWriteStdin, err) + } + if !bytes.Equal(stdout.Bytes(), expectedOut) { + t.Errorf("stdout want:\n%s\ngot:\n%s", expectedOut, stdout) + } +} + +func TestRunFileError(t *testing.T) { + path, err := ioutil.TempDir("", "") + if err != nil { + t.Errorf("unexpected error: %s", err) + } + defer os.RemoveAll(path) + filename := filepath.Join(path, "unreadable.hcl") + + var expectedError = &os.PathError{ + Op: "open", + Path: filename, + Err: syscall.EACCES, + } + + err = ioutil.WriteFile(filename, []byte{}, 0000) + if err != nil { + t.Errorf("unexpected error: %s", err) + } + + _, stdout := mockIO() + err = Run( + []string{path}, + fixtureExtensions, + nil, stdout, + Options{}, + ) + + if !reflect.DeepEqual(err, expectedError) { + t.Errorf("error want: %#v, got: %#v", expectedError, err) + } +} + +func TestRunNoOptions(t *testing.T) { + path, err := renderFixtures("") + if err != nil { + t.Errorf("unexpected error: %s", err) + } + defer os.RemoveAll(path) + + var expectedOut bytes.Buffer + for _, fixture := range fixtures { + expectedOut.Write(fixture.golden) + } + + _, stdout := mockIO() + err = Run( + []string{path}, + fixtureExtensions, + nil, stdout, + Options{}, + ) + + if err != nil { + t.Errorf("unexpected error: %s", err) + } + if stdout.String() != expectedOut.String() { + t.Errorf("stdout want:\n%s\ngot:\n%s", expectedOut, stdout) + } +} + +func TestRunList(t *testing.T) { + path, err := renderFixtures("") + if err != nil { + t.Errorf("unexpected error: %s", err) + } + defer os.RemoveAll(path) + + var expectedOut bytes.Buffer + for _, fixture := range fixtures { + if !bytes.Equal(fixture.golden, fixture.input) { + expectedOut.WriteString(fmt.Sprintln(filepath.Join(path, fixture.filename))) + } + } + + _, stdout := mockIO() + err = Run( + []string{path}, + fixtureExtensions, + nil, stdout, + Options{ + List: true, + }, + ) + + if err != nil { + t.Errorf("unexpected error: %s", err) + } + if stdout.String() != expectedOut.String() { + t.Errorf("stdout want:\n%s\ngot:\n%s", expectedOut, stdout) + } +} + +func TestRunWrite(t *testing.T) { + path, err := renderFixtures("") + if err != nil { + t.Errorf("unexpected error: %s", err) + } + defer os.RemoveAll(path) + + _, stdout := mockIO() + err = Run( + []string{path}, + fixtureExtensions, + nil, stdout, + Options{ + Write: true, + }, + ) + + if err != nil { + t.Errorf("unexpected error: %s", err) + } + for _, fixture := range fixtures { + res, err := ioutil.ReadFile(filepath.Join(path, fixture.filename)) + if err != nil { + t.Errorf("unexpected error: %s", err) + } + if !bytes.Equal(res, fixture.golden) { + t.Errorf("file %q contents want:\n%s\ngot:\n%s", fixture.filename, fixture.golden, res) + } + } +} + +func TestRunDiff(t *testing.T) { + path, err := renderFixtures("") + if err != nil { + t.Errorf("unexpected error: %s", err) + } + defer os.RemoveAll(path) + + var expectedOut bytes.Buffer + for _, fixture := range fixtures { + if len(fixture.diff) > 0 { + expectedOut.WriteString( + regexp.QuoteMeta( + fmt.Sprintf("diff a/%s/%s b/%s/%s\n", path, fixture.filename, path, fixture.filename), + ), + ) + // Need to use regex to ignore datetimes in diff. + expectedOut.WriteString(`--- .+?\n`) + expectedOut.WriteString(`\+\+\+ .+?\n`) + expectedOut.WriteString(regexp.QuoteMeta(string(fixture.diff))) + } + } + + expectedOutString := testhelper.Unix2dos(expectedOut.String()) + + _, stdout := mockIO() + err = Run( + []string{path}, + fixtureExtensions, + nil, stdout, + Options{ + Diff: true, + }, + ) + + if err != nil { + t.Errorf("unexpected error: %s", err) + } + if !regexp.MustCompile(expectedOutString).Match(stdout.Bytes()) { + t.Errorf("stdout want match:\n%s\ngot:\n%q", expectedOutString, stdout) + } +} + +func mockIO() (stdin, stdout *bytes.Buffer) { + return new(bytes.Buffer), new(bytes.Buffer) +} + +type fixture struct { + filename string + input, golden, diff []byte +} + +type ByFilename []fixture + +func (s ByFilename) Len() int { return len(s) } +func (s ByFilename) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s ByFilename) Less(i, j int) bool { return len(s[i].filename) > len(s[j].filename) } + +var fixtures = []fixture{ + { + "noop.hcl", + []byte(`resource "aws_security_group" "firewall" { + count = 5 +} +`), + []byte(`resource "aws_security_group" "firewall" { + count = 5 +} +`), + []byte(``), + }, { + "align_equals.hcl", + []byte(`variable "foo" { + default = "bar" + description = "bar" +} +`), + []byte(`variable "foo" { + default = "bar" + description = "bar" +} +`), + []byte(`@@ -1,4 +1,4 @@ + variable "foo" { +- default = "bar" ++ default = "bar" + description = "bar" + } +`), + }, { + "indentation.hcl", + []byte(`provider "aws" { + access_key = "foo" + secret_key = "bar" +} +`), + []byte(`provider "aws" { + access_key = "foo" + secret_key = "bar" +} +`), + []byte(`@@ -1,4 +1,4 @@ + provider "aws" { +- access_key = "foo" +- secret_key = "bar" ++ access_key = "foo" ++ secret_key = "bar" + } +`), + }, +} + +// parent can be an empty string, in which case the system's default +// temporary directory will be used. +func renderFixtures(parent string) (path string, err error) { + path, err = ioutil.TempDir(parent, "") + if err != nil { + return "", err + } + + for _, fixture := range fixtures { + err = ioutil.WriteFile(filepath.Join(path, fixture.filename), []byte(fixture.input), 0644) + if err != nil { + os.RemoveAll(path) + return "", err + } + } + + return path, nil +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/.hidden.ignore b/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/.hidden.ignore new file mode 100644 index 0000000000..9977a2836c --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/.hidden.ignore @@ -0,0 +1 @@ +invalid diff --git a/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/dir.ignore b/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/dir.ignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/file.ignore b/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/file.ignore new file mode 100644 index 0000000000..9977a2836c --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/file.ignore @@ -0,0 +1 @@ +invalid diff --git a/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/good.hcl b/vendor/github.com/hashicorp/hcl/hcl/fmtcmd/test-fixtures/good.hcl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/error.go b/vendor/github.com/hashicorp/hcl/hcl/parser/error.go new file mode 100644 index 0000000000..5c99381dfb --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/parser/error.go @@ -0,0 +1,17 @@ +package parser + +import ( + "fmt" + + "github.com/hashicorp/hcl/hcl/token" +) + +// PosError is a parse error that contains a position. +type PosError struct { + Pos token.Pos + Err error +} + +func (e *PosError) Error() string { + return fmt.Sprintf("At %s: %s", e.Pos, e.Err) +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/error_test.go b/vendor/github.com/hashicorp/hcl/hcl/parser/error_test.go new file mode 100644 index 0000000000..32399fec5d --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/parser/error_test.go @@ -0,0 +1,9 @@ +package parser + +import ( + "testing" +) + +func TestPosError_impl(t *testing.T) { + var _ error = new(PosError) +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go b/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go new file mode 100644 index 0000000000..cc129b6c7f --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go @@ -0,0 +1,454 @@ +// Package parser implements a parser for HCL (HashiCorp Configuration +// Language) +package parser + +import ( + "errors" + "fmt" + "strings" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/scanner" + "github.com/hashicorp/hcl/hcl/token" +) + +type Parser struct { + sc *scanner.Scanner + + // Last read token + tok token.Token + commaPrev token.Token + + comments []*ast.CommentGroup + leadComment *ast.CommentGroup // last lead comment + lineComment *ast.CommentGroup // last line comment + + enableTrace bool + indent int + n int // buffer size (max = 1) +} + +func newParser(src []byte) *Parser { + return &Parser{ + sc: scanner.New(src), + } +} + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func Parse(src []byte) (*ast.File, error) { + p := newParser(src) + return p.Parse() +} + +var errEofToken = errors.New("EOF token found") + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func (p *Parser) Parse() (*ast.File, error) { + f := &ast.File{} + var err, scerr error + p.sc.Error = func(pos token.Pos, msg string) { + scerr = &PosError{Pos: pos, Err: errors.New(msg)} + } + + f.Node, err = p.objectList() + if scerr != nil { + return nil, scerr + } + if err != nil { + return nil, err + } + + f.Comments = p.comments + return f, nil +} + +func (p *Parser) objectList() (*ast.ObjectList, error) { + defer un(trace(p, "ParseObjectList")) + node := &ast.ObjectList{} + + for { + n, err := p.objectItem() + if err == errEofToken { + break // we are finished + } + + // we don't return a nil node, because might want to use already + // collected items. + if err != nil { + return node, err + } + + node.Add(n) + } + return node, nil +} + +func (p *Parser) consumeComment() (comment *ast.Comment, endline int) { + endline = p.tok.Pos.Line + + // count the endline if it's multiline comment, ie starting with /* + if len(p.tok.Text) > 1 && p.tok.Text[1] == '*' { + // don't use range here - no need to decode Unicode code points + for i := 0; i < len(p.tok.Text); i++ { + if p.tok.Text[i] == '\n' { + endline++ + } + } + } + + comment = &ast.Comment{Start: p.tok.Pos, Text: p.tok.Text} + p.tok = p.sc.Scan() + return +} + +func (p *Parser) consumeCommentGroup(n int) (comments *ast.CommentGroup, endline int) { + var list []*ast.Comment + endline = p.tok.Pos.Line + + for p.tok.Type == token.COMMENT && p.tok.Pos.Line <= endline+n { + var comment *ast.Comment + comment, endline = p.consumeComment() + list = append(list, comment) + } + + // add comment group to the comments list + comments = &ast.CommentGroup{List: list} + p.comments = append(p.comments, comments) + + return +} + +// objectItem parses a single object item +func (p *Parser) objectItem() (*ast.ObjectItem, error) { + defer un(trace(p, "ParseObjectItem")) + + keys, err := p.objectKey() + if len(keys) > 0 && err == errEofToken { + // We ignore eof token here since it is an error if we didn't + // receive a value (but we did receive a key) for the item. + err = nil + } + if len(keys) > 0 && err != nil && p.tok.Type == token.RBRACE { + // This is a strange boolean statement, but what it means is: + // We have keys with no value, and we're likely in an object + // (since RBrace ends an object). For this, we set err to nil so + // we continue and get the error below of having the wrong value + // type. + err = nil + + // Reset the token type so we don't think it completed fine. See + // objectType which uses p.tok.Type to check if we're done with + // the object. + p.tok.Type = token.EOF + } + if err != nil { + return nil, err + } + + o := &ast.ObjectItem{ + Keys: keys, + } + + if p.leadComment != nil { + o.LeadComment = p.leadComment + p.leadComment = nil + } + + switch p.tok.Type { + case token.ASSIGN: + o.Assign = p.tok.Pos + o.Val, err = p.object() + if err != nil { + return nil, err + } + case token.LBRACE: + o.Val, err = p.objectType() + if err != nil { + return nil, err + } + default: + keyStr := make([]string, 0, len(keys)) + for _, k := range keys { + keyStr = append(keyStr, k.Token.Text) + } + + return nil, fmt.Errorf( + "key '%s' expected start of object ('{') or assignment ('=')", + strings.Join(keyStr, " ")) + } + + // do a look-ahead for line comment + p.scan() + if len(keys) > 0 && o.Val.Pos().Line == keys[0].Pos().Line && p.lineComment != nil { + o.LineComment = p.lineComment + p.lineComment = nil + } + p.unscan() + return o, nil +} + +// objectKey parses an object key and returns a ObjectKey AST +func (p *Parser) objectKey() ([]*ast.ObjectKey, error) { + keyCount := 0 + keys := make([]*ast.ObjectKey, 0) + + for { + tok := p.scan() + switch tok.Type { + case token.EOF: + // It is very important to also return the keys here as well as + // the error. This is because we need to be able to tell if we + // did parse keys prior to finding the EOF, or if we just found + // a bare EOF. + return keys, errEofToken + case token.ASSIGN: + // assignment or object only, but not nested objects. this is not + // allowed: `foo bar = {}` + if keyCount > 1 { + return nil, &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf("nested object expected: LBRACE got: %s", p.tok.Type), + } + } + + if keyCount == 0 { + return nil, &PosError{ + Pos: p.tok.Pos, + Err: errors.New("no object keys found!"), + } + } + + return keys, nil + case token.LBRACE: + // object + return keys, nil + case token.IDENT, token.STRING: + keyCount++ + keys = append(keys, &ast.ObjectKey{Token: p.tok}) + case token.ILLEGAL: + fmt.Println("illegal") + default: + return keys, &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf("expected: IDENT | STRING | ASSIGN | LBRACE got: %s", p.tok.Type), + } + } + } +} + +// object parses any type of object, such as number, bool, string, object or +// list. +func (p *Parser) object() (ast.Node, error) { + defer un(trace(p, "ParseType")) + tok := p.scan() + + switch tok.Type { + case token.NUMBER, token.FLOAT, token.BOOL, token.STRING, token.HEREDOC: + return p.literalType() + case token.LBRACE: + return p.objectType() + case token.LBRACK: + return p.listType() + case token.COMMENT: + // implement comment + case token.EOF: + return nil, errEofToken + } + + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf("Unknown token: %+v", tok), + } +} + +// objectType parses an object type and returns a ObjectType AST +func (p *Parser) objectType() (*ast.ObjectType, error) { + defer un(trace(p, "ParseObjectType")) + + // we assume that the currently scanned token is a LBRACE + o := &ast.ObjectType{ + Lbrace: p.tok.Pos, + } + + l, err := p.objectList() + + // if we hit RBRACE, we are good to go (means we parsed all Items), if it's + // not a RBRACE, it's an syntax error and we just return it. + if err != nil && p.tok.Type != token.RBRACE { + return nil, err + } + + // If there is no error, we should be at a RBRACE to end the object + if p.tok.Type != token.RBRACE { + return nil, fmt.Errorf("object expected closing RBRACE got: %s", p.tok.Type) + } + + o.List = l + o.Rbrace = p.tok.Pos // advanced via parseObjectList + return o, nil +} + +// listType parses a list type and returns a ListType AST +func (p *Parser) listType() (*ast.ListType, error) { + defer un(trace(p, "ParseListType")) + + // we assume that the currently scanned token is a LBRACK + l := &ast.ListType{ + Lbrack: p.tok.Pos, + } + + needComma := false + for { + tok := p.scan() + switch tok.Type { + case token.NUMBER, token.FLOAT, token.STRING, token.HEREDOC: + if needComma { + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf("unexpected token: %s. Expecting %s", tok.Type, token.COMMA), + } + } + + node, err := p.literalType() + if err != nil { + return nil, err + } + + l.Add(node) + needComma = true + case token.COMMA: + // get next list item or we are at the end + // do a look-ahead for line comment + p.scan() + if p.lineComment != nil { + lit, ok := l.List[len(l.List)-1].(*ast.LiteralType) + if ok { + lit.LineComment = p.lineComment + l.List[len(l.List)-1] = lit + p.lineComment = nil + } + } + p.unscan() + + needComma = false + continue + case token.BOOL: + // TODO(arslan) should we support? not supported by HCL yet + case token.LBRACK: + // TODO(arslan) should we support nested lists? Even though it's + // written in README of HCL, it's not a part of the grammar + // (not defined in parse.y) + case token.RBRACK: + // finished + l.Rbrack = p.tok.Pos + return l, nil + default: + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf("unexpected token while parsing list: %s", tok.Type), + } + } + } +} + +// literalType parses a literal type and returns a LiteralType AST +func (p *Parser) literalType() (*ast.LiteralType, error) { + defer un(trace(p, "ParseLiteral")) + + return &ast.LiteralType{ + Token: p.tok, + }, nil +} + +// scan returns the next token from the underlying scanner. If a token has +// been unscanned then read that instead. In the process, it collects any +// comment groups encountered, and remembers the last lead and line comments. +func (p *Parser) scan() token.Token { + // If we have a token on the buffer, then return it. + if p.n != 0 { + p.n = 0 + return p.tok + } + + // Otherwise read the next token from the scanner and Save it to the buffer + // in case we unscan later. + prev := p.tok + p.tok = p.sc.Scan() + + if p.tok.Type == token.COMMENT { + var comment *ast.CommentGroup + var endline int + + // fmt.Printf("p.tok.Pos.Line = %+v prev: %d endline %d \n", + // p.tok.Pos.Line, prev.Pos.Line, endline) + if p.tok.Pos.Line == prev.Pos.Line { + // The comment is on same line as the previous token; it + // cannot be a lead comment but may be a line comment. + comment, endline = p.consumeCommentGroup(0) + if p.tok.Pos.Line != endline { + // The next token is on a different line, thus + // the last comment group is a line comment. + p.lineComment = comment + } + } + + // consume successor comments, if any + endline = -1 + for p.tok.Type == token.COMMENT { + comment, endline = p.consumeCommentGroup(1) + } + + if endline+1 == p.tok.Pos.Line && p.tok.Type != token.RBRACE { + switch p.tok.Type { + case token.RBRACE, token.RBRACK: + // Do not count for these cases + default: + // The next token is following on the line immediately after the + // comment group, thus the last comment group is a lead comment. + p.leadComment = comment + } + } + + } + + return p.tok +} + +// unscan pushes the previously read token back onto the buffer. +func (p *Parser) unscan() { + p.n = 1 +} + +// ---------------------------------------------------------------------------- +// Parsing support + +func (p *Parser) printTrace(a ...interface{}) { + if !p.enableTrace { + return + } + + const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " + const n = len(dots) + fmt.Printf("%5d:%3d: ", p.tok.Pos.Line, p.tok.Pos.Column) + + i := 2 * p.indent + for i > n { + fmt.Print(dots) + i -= n + } + // i <= n + fmt.Print(dots[0:i]) + fmt.Println(a...) +} + +func trace(p *Parser, msg string) *Parser { + p.printTrace(msg, "(") + p.indent++ + return p +} + +// Usage pattern: defer un(trace(p, "...")) +func un(p *Parser) { + p.indent-- + p.printTrace(")") +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/parser_test.go b/vendor/github.com/hashicorp/hcl/hcl/parser/parser_test.go new file mode 100644 index 0000000000..2ef830faa2 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/parser/parser_test.go @@ -0,0 +1,342 @@ +package parser + +import ( + "fmt" + "io/ioutil" + "path/filepath" + "reflect" + "runtime" + "testing" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/token" +) + +func TestType(t *testing.T) { + var literals = []struct { + typ token.Type + src string + }{ + {token.STRING, `foo = "foo"`}, + {token.NUMBER, `foo = 123`}, + {token.NUMBER, `foo = -29`}, + {token.FLOAT, `foo = 123.12`}, + {token.FLOAT, `foo = -123.12`}, + {token.BOOL, `foo = true`}, + {token.HEREDOC, "foo = < 0 { + commented = true + buf.WriteByte(newline) + } + + buf.Write(p.indent([]byte(comment.Text))) + buf.WriteByte(newline) + if index != len(o.List.Items) { + buf.WriteByte(newline) // do not print on the end + } + } + } + } + + if index == len(o.List.Items) { + p.prev = o.Rbrace + break + } + + // At this point we are sure that it's not a totally empty block: print + // the initial newline if it hasn't been printed yet by the previous + // block about standalone comments. + if !newlinePrinted { + buf.WriteByte(newline) + newlinePrinted = true + } + + // check if we have adjacent one liner items. If yes we'll going to align + // the comments. + var aligned []*ast.ObjectItem + for _, item := range o.List.Items[index:] { + // we don't group one line lists + if len(o.List.Items) == 1 { + break + } + + // one means a oneliner with out any lead comment + // two means a oneliner with lead comment + // anything else might be something else + cur := lines(string(p.objectItem(item))) + if cur > 2 { + break + } + + curPos := item.Pos() + + nextPos := token.Pos{} + if index != len(o.List.Items)-1 { + nextPos = o.List.Items[index+1].Pos() + } + + prevPos := token.Pos{} + if index != 0 { + prevPos = o.List.Items[index-1].Pos() + } + + // fmt.Println("DEBUG ----------------") + // fmt.Printf("prev = %+v prevPos: %s\n", prev, prevPos) + // fmt.Printf("cur = %+v curPos: %s\n", cur, curPos) + // fmt.Printf("next = %+v nextPos: %s\n", next, nextPos) + + if curPos.Line+1 == nextPos.Line { + aligned = append(aligned, item) + index++ + continue + } + + if curPos.Line-1 == prevPos.Line { + aligned = append(aligned, item) + index++ + + // finish if we have a new line or comment next. This happens + // if the next item is not adjacent + if curPos.Line+1 != nextPos.Line { + break + } + continue + } + + break + } + + // put newlines if the items are between other non aligned items. + // newlines are also added if there is a standalone comment already, so + // check it too + if !commented && index != len(aligned) { + buf.WriteByte(newline) + } + + if len(aligned) >= 1 { + p.prev = aligned[len(aligned)-1].Pos() + + items := p.alignedItems(aligned) + buf.Write(p.indent(items)) + } else { + p.prev = o.List.Items[index].Pos() + + buf.Write(p.indent(p.objectItem(o.List.Items[index]))) + index++ + } + + buf.WriteByte(newline) + } + + buf.WriteString("}") + return buf.Bytes() +} + +func (p *printer) alignedItems(items []*ast.ObjectItem) []byte { + var buf bytes.Buffer + + // find the longest key and value length, needed for alignment + var longestKeyLen int // longest key length + var longestValLen int // longest value length + for _, item := range items { + key := len(item.Keys[0].Token.Text) + val := len(p.output(item.Val)) + + if key > longestKeyLen { + longestKeyLen = key + } + + if val > longestValLen { + longestValLen = val + } + } + + for i, item := range items { + if item.LeadComment != nil { + for _, comment := range item.LeadComment.List { + buf.WriteString(comment.Text) + buf.WriteByte(newline) + } + } + + for i, k := range item.Keys { + keyLen := len(k.Token.Text) + buf.WriteString(k.Token.Text) + for i := 0; i < longestKeyLen-keyLen+1; i++ { + buf.WriteByte(blank) + } + + // reach end of key + if i == len(item.Keys)-1 && len(item.Keys) == 1 { + buf.WriteString("=") + buf.WriteByte(blank) + } + } + + val := p.output(item.Val) + valLen := len(val) + buf.Write(val) + + if item.Val.Pos().Line == item.Keys[0].Pos().Line && item.LineComment != nil { + for i := 0; i < longestValLen-valLen+1; i++ { + buf.WriteByte(blank) + } + + for _, comment := range item.LineComment.List { + buf.WriteString(comment.Text) + } + } + + // do not print for the last item + if i != len(items)-1 { + buf.WriteByte(newline) + } + } + + return buf.Bytes() +} + +// list returns the printable HCL form of an list type. +func (p *printer) list(l *ast.ListType) []byte { + var buf bytes.Buffer + buf.WriteString("[") + + var longestLine int + for _, item := range l.List { + // for now we assume that the list only contains literal types + if lit, ok := item.(*ast.LiteralType); ok { + lineLen := len(lit.Token.Text) + if lineLen > longestLine { + longestLine = lineLen + } + } + } + + insertSpaceBeforeItem := false + for i, item := range l.List { + if item.Pos().Line != l.Lbrack.Line { + // multiline list, add newline before we add each item + buf.WriteByte(newline) + insertSpaceBeforeItem = false + // also indent each line + val := p.output(item) + curLen := len(val) + buf.Write(p.indent(val)) + buf.WriteString(",") + + if lit, ok := item.(*ast.LiteralType); ok && lit.LineComment != nil { + // if the next item doesn't have any comments, do not align + buf.WriteByte(blank) // align one space + for i := 0; i < longestLine-curLen; i++ { + buf.WriteByte(blank) + } + + for _, comment := range lit.LineComment.List { + buf.WriteString(comment.Text) + } + } + + if i == len(l.List)-1 { + buf.WriteByte(newline) + } + } else { + if insertSpaceBeforeItem { + buf.WriteByte(blank) + insertSpaceBeforeItem = false + } + buf.Write(p.output(item)) + if i != len(l.List)-1 { + buf.WriteString(",") + insertSpaceBeforeItem = true + } + } + + } + + buf.WriteString("]") + return buf.Bytes() +} + +// indent indents the lines of the given buffer for each non-empty line +func (p *printer) indent(buf []byte) []byte { + var prefix []byte + if p.cfg.SpacesWidth != 0 { + for i := 0; i < p.cfg.SpacesWidth; i++ { + prefix = append(prefix, blank) + } + } else { + prefix = []byte{tab} + } + + var res []byte + bol := true + for _, c := range buf { + if bol && c != '\n' { + res = append(res, prefix...) + } + + res = append(res, c) + bol = c == '\n' + } + return res +} + +// unindent removes all the indentation from the tombstoned lines +func (p *printer) unindent(buf []byte) []byte { + var res []byte + for i := 0; i < len(buf); i++ { + skip := len(buf)-i <= len(unindent) + if !skip { + skip = !bytes.Equal(unindent, buf[i:i+len(unindent)]) + } + if skip { + res = append(res, buf[i]) + continue + } + + // We have a marker. we have to backtrace here and clean out + // any whitespace ahead of our tombstone up to a \n + for j := len(res) - 1; j >= 0; j-- { + if res[j] == '\n' { + break + } + + res = res[:j] + } + + // Skip the entire unindent marker + i += len(unindent) - 1 + } + + return res +} + +// heredocIndent marks all the 2nd and further lines as unindentable +func (p *printer) heredocIndent(buf []byte) []byte { + var res []byte + bol := false + for _, c := range buf { + if bol && c != '\n' { + res = append(res, unindent...) + } + res = append(res, c) + bol = c == '\n' + } + return res +} + +func lines(txt string) int { + endline := 1 + for i := 0; i < len(txt); i++ { + if txt[i] == '\n' { + endline++ + } + } + return endline +} + +// ---------------------------------------------------------------------------- +// Tracing support + +func (p *printer) printTrace(a ...interface{}) { + if !p.enableTrace { + return + } + + const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " + const n = len(dots) + i := 2 * p.indentTrace + for i > n { + fmt.Print(dots) + i -= n + } + // i <= n + fmt.Print(dots[0:i]) + fmt.Println(a...) +} + +func trace(p *printer, msg string) *printer { + p.printTrace(msg, "(") + p.indentTrace++ + return p +} + +// Usage pattern: defer un(trace(p, "...")) +func un(p *printer) { + p.indentTrace-- + p.printTrace(")") +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go b/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go new file mode 100644 index 0000000000..fb9df58d4b --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go @@ -0,0 +1,64 @@ +// Package printer implements printing of AST nodes to HCL format. +package printer + +import ( + "bytes" + "io" + "text/tabwriter" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/parser" +) + +var DefaultConfig = Config{ + SpacesWidth: 2, +} + +// A Config node controls the output of Fprint. +type Config struct { + SpacesWidth int // if set, it will use spaces instead of tabs for alignment +} + +func (c *Config) Fprint(output io.Writer, node ast.Node) error { + p := &printer{ + cfg: *c, + comments: make([]*ast.CommentGroup, 0), + standaloneComments: make([]*ast.CommentGroup, 0), + // enableTrace: true, + } + + p.collectComments(node) + + if _, err := output.Write(p.unindent(p.output(node))); err != nil { + return err + } + + // flush tabwriter, if any + var err error + if tw, _ := output.(*tabwriter.Writer); tw != nil { + err = tw.Flush() + } + + return err +} + +// Fprint "pretty-prints" an HCL node to output +// It calls Config.Fprint with default settings. +func Fprint(output io.Writer, node ast.Node) error { + return DefaultConfig.Fprint(output, node) +} + +// Format formats src HCL and returns the result. +func Format(src []byte) ([]byte, error) { + node, err := parser.Parse(src) + if err != nil { + return nil, err + } + + var buf bytes.Buffer + if err := DefaultConfig.Fprint(&buf, node); err != nil { + return nil, err + } + + return buf.Bytes(), nil +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/printer_test.go b/vendor/github.com/hashicorp/hcl/hcl/printer/printer_test.go new file mode 100644 index 0000000000..6e1c7ceb5c --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/printer/printer_test.go @@ -0,0 +1,149 @@ +// +build -windows +// TODO(jen20): These need fixing on Windows but printer is not used right now +// and red CI is making it harder to process other bugs, so ignore until +// we get around to fixing them.package printer + +package printer + +import ( + "bytes" + "errors" + "flag" + "fmt" + "io/ioutil" + "path/filepath" + "testing" + + "github.com/hashicorp/hcl/hcl/parser" +) + +var update = flag.Bool("update", false, "update golden files") + +const ( + dataDir = "testdata" +) + +type entry struct { + source, golden string +} + +// Use go test -update to create/update the respective golden files. +var data = []entry{ + {"complexhcl.input", "complexhcl.golden"}, + {"list.input", "list.golden"}, + {"comment.input", "comment.golden"}, + {"comment_aligned.input", "comment_aligned.golden"}, + {"comment_standalone.input", "comment_standalone.golden"}, + {"empty_block.input", "empty_block.golden"}, +} + +func TestFiles(t *testing.T) { + for _, e := range data { + source := filepath.Join(dataDir, e.source) + golden := filepath.Join(dataDir, e.golden) + check(t, source, golden) + } +} + +func check(t *testing.T, source, golden string) { + src, err := ioutil.ReadFile(source) + if err != nil { + t.Error(err) + return + } + + res, err := format(src) + if err != nil { + t.Error(err) + return + } + + // update golden files if necessary + if *update { + if err := ioutil.WriteFile(golden, res, 0644); err != nil { + t.Error(err) + } + return + } + + // get golden + gld, err := ioutil.ReadFile(golden) + if err != nil { + t.Error(err) + return + } + + // formatted source and golden must be the same + if err := diff(source, golden, res, gld); err != nil { + t.Error(err) + return + } +} + +// diff compares a and b. +func diff(aname, bname string, a, b []byte) error { + var buf bytes.Buffer // holding long error message + + // compare lengths + if len(a) != len(b) { + fmt.Fprintf(&buf, "\nlength changed: len(%s) = %d, len(%s) = %d", aname, len(a), bname, len(b)) + } + + // compare contents + line := 1 + offs := 1 + for i := 0; i < len(a) && i < len(b); i++ { + ch := a[i] + if ch != b[i] { + fmt.Fprintf(&buf, "\n%s:%d:%d: %s", aname, line, i-offs+1, lineAt(a, offs)) + fmt.Fprintf(&buf, "\n%s:%d:%d: %s", bname, line, i-offs+1, lineAt(b, offs)) + fmt.Fprintf(&buf, "\n\n") + break + } + if ch == '\n' { + line++ + offs = i + 1 + } + } + + if buf.Len() > 0 { + return errors.New(buf.String()) + } + return nil +} + +// format parses src, prints the corresponding AST, verifies the resulting +// src is syntactically correct, and returns the resulting src or an error +// if any. +func format(src []byte) ([]byte, error) { + // parse src + node, err := parser.Parse(src) + if err != nil { + return nil, fmt.Errorf("parse: %s\n%s", err, src) + } + + var buf bytes.Buffer + + cfg := &Config{} + if err := cfg.Fprint(&buf, node); err != nil { + return nil, fmt.Errorf("print: %s", err) + } + + // make sure formatted output is syntactically correct + res := buf.Bytes() + + if _, err := parser.Parse(src); err != nil { + return nil, fmt.Errorf("parse: %s\n%s", err, src) + } + + return res, nil +} + +// lineAt returns the line in text starting at offset offs. +func lineAt(text []byte, offs int) []byte { + i := offs + for i < len(text) && text[i] != '\n' { + i++ + } + return text[offs:i] +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment.golden b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment.golden new file mode 100644 index 0000000000..e86215f53f --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment.golden @@ -0,0 +1,36 @@ +// A standalone comment is a comment which is not attached to any kind of node + +// This comes from Terraform, as a test +variable "foo" { + # Standalone comment should be still here + + default = "bar" + description = "bar" # yooo +} + +/* This is a multi line standalone +comment*/ + +// fatih arslan +/* This is a developer test +account and a multine comment */ +developer = ["fatih", "arslan"] // fatih arslan + +# One line here +numbers = [1, 2] // another line here + +# Another comment +variable = { + description = "bar" # another yooo + + foo { + # Nested standalone + + bar = "fatih" + } +} + +// lead comment +foo { + bar = "fatih" // line comment 2 +} // line comment 3 \ No newline at end of file diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment.input b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment.input new file mode 100644 index 0000000000..57c37ac1de --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment.input @@ -0,0 +1,37 @@ +// A standalone comment is a comment which is not attached to any kind of node + + // This comes from Terraform, as a test +variable "foo" { + # Standalone comment should be still here + + default = "bar" + description = "bar" # yooo +} + +/* This is a multi line standalone +comment*/ + + +// fatih arslan +/* This is a developer test +account and a multine comment */ +developer = [ "fatih", "arslan"] // fatih arslan + +# One line here +numbers = [1,2] // another line here + + # Another comment +variable = { + description = "bar" # another yooo + foo { + # Nested standalone + + bar = "fatih" + } +} + + // lead comment +foo { + bar = "fatih" // line comment 2 +} // line comment 3 + diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_aligned.golden b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_aligned.golden new file mode 100644 index 0000000000..e8469e5c4f --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_aligned.golden @@ -0,0 +1,32 @@ +aligned { + # We have some aligned items below + foo = "fatih" # yoo1 + default = "bar" # yoo2 + bar = "bar and foo" # yoo3 + + default = { + bar = "example" + } + + #deneme arslan + fatih = ["fatih"] # yoo4 + + #fatih arslan + fatiharslan = ["arslan"] // yoo5 + + default = { + bar = "example" + } + + security_groups = [ + "foo", # kenya 1 + "${aws_security_group.firewall.foo}", # kenya 2 + ] + + security_groups2 = [ + "foo", # kenya 1 + "bar", # kenya 1.5 + "${aws_security_group.firewall.foo}", # kenya 2 + "foobar", # kenya 3 + ] +} \ No newline at end of file diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_aligned.input b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_aligned.input new file mode 100644 index 0000000000..bd43ab1adc --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_aligned.input @@ -0,0 +1,28 @@ +aligned { +# We have some aligned items below + foo = "fatih" # yoo1 + default = "bar" # yoo2 + bar = "bar and foo" # yoo3 + default = { + bar = "example" + } + #deneme arslan + fatih = ["fatih"] # yoo4 + #fatih arslan + fatiharslan = ["arslan"] // yoo5 + default = { + bar = "example" + } + +security_groups = [ + "foo", # kenya 1 + "${aws_security_group.firewall.foo}", # kenya 2 +] + +security_groups2 = [ + "foo", # kenya 1 + "bar", # kenya 1.5 + "${aws_security_group.firewall.foo}", # kenya 2 + "foobar", # kenya 3 +] +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_standalone.golden b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_standalone.golden new file mode 100644 index 0000000000..962dbf2b36 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_standalone.golden @@ -0,0 +1,16 @@ +// A standalone comment + +aligned { + # Standalone 1 + + a = "bar" # yoo1 + default = "bar" # yoo2 + + # Standalone 2 +} + +# Standalone 3 + +numbers = [1, 2] // another line here + +# Standalone 4 diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_standalone.input b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_standalone.input new file mode 100644 index 0000000000..4436cb16c0 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/comment_standalone.input @@ -0,0 +1,16 @@ +// A standalone comment + +aligned { + # Standalone 1 + + a = "bar" # yoo1 + default = "bar" # yoo2 + + # Standalone 2 +} + + # Standalone 3 + +numbers = [1,2] // another line here + + # Standalone 4 diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/complexhcl.golden b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/complexhcl.golden new file mode 100644 index 0000000000..b733a27e46 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/printer/testdata/complexhcl.golden @@ -0,0 +1,54 @@ +variable "foo" { + default = "bar" + description = "bar" +} + +developer = ["fatih", "arslan"] + +provider "aws" { + access_key = "foo" + secret_key = "bar" +} + +provider "do" { + api_key = "${var.foo}" +} + +resource "aws_security_group" "firewall" { + count = 5 +} + +resource aws_instance "web" { + ami = "${var.foo}" + + security_groups = [ + "foo", + "${aws_security_group.firewall.foo}", + ] + + network_interface { + device_index = 0 + description = "Main network interface" + } + + network_interface = { + device_index = 1 + + description = < 0 { + // common case: last character was not a '\n' + s.tokPos.Line = s.srcPos.Line + s.tokPos.Column = s.srcPos.Column + } else { + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + s.tokPos.Line = s.srcPos.Line - 1 + s.tokPos.Column = s.lastLineLen + } + + switch { + case isLetter(ch): + tok = token.IDENT + lit := s.scanIdentifier() + if lit == "true" || lit == "false" { + tok = token.BOOL + } + case isDecimal(ch): + tok = s.scanNumber(ch) + default: + switch ch { + case eof: + tok = token.EOF + case '"': + tok = token.STRING + s.scanString() + case '#', '/': + tok = token.COMMENT + s.scanComment(ch) + case '.': + tok = token.PERIOD + ch = s.peek() + if isDecimal(ch) { + tok = token.FLOAT + ch = s.scanMantissa(ch) + ch = s.scanExponent(ch) + } + case '<': + tok = token.HEREDOC + s.scanHeredoc() + case '[': + tok = token.LBRACK + case ']': + tok = token.RBRACK + case '{': + tok = token.LBRACE + case '}': + tok = token.RBRACE + case ',': + tok = token.COMMA + case '=': + tok = token.ASSIGN + case '+': + tok = token.ADD + case '-': + if isDecimal(s.peek()) { + ch := s.next() + tok = s.scanNumber(ch) + } else { + tok = token.SUB + } + default: + s.err("illegal char") + } + } + + // finish token ending + s.tokEnd = s.srcPos.Offset + + // create token literal + var tokenText string + if s.tokStart >= 0 { + tokenText = string(s.src[s.tokStart:s.tokEnd]) + } + s.tokStart = s.tokEnd // ensure idempotency of tokenText() call + + return token.Token{ + Type: tok, + Pos: s.tokPos, + Text: tokenText, + } +} + +func (s *Scanner) scanComment(ch rune) { + // single line comments + if ch == '#' || (ch == '/' && s.peek() != '*') { + ch = s.next() + for ch != '\n' && ch >= 0 && ch != eof { + ch = s.next() + } + if ch != eof && ch >= 0 { + s.unread() + } + return + } + + // be sure we get the character after /* This allows us to find comment's + // that are not erminated + if ch == '/' { + s.next() + ch = s.next() // read character after "/*" + } + + // look for /* - style comments + for { + if ch < 0 || ch == eof { + s.err("comment not terminated") + break + } + + ch0 := ch + ch = s.next() + if ch0 == '*' && ch == '/' { + break + } + } +} + +// scanNumber scans a HCL number definition starting with the given rune +func (s *Scanner) scanNumber(ch rune) token.Type { + if ch == '0' { + // check for hexadecimal, octal or float + ch = s.next() + if ch == 'x' || ch == 'X' { + // hexadecimal + ch = s.next() + found := false + for isHexadecimal(ch) { + ch = s.next() + found = true + } + + if !found { + s.err("illegal hexadecimal number") + } + + if ch != eof { + s.unread() + } + + return token.NUMBER + } + + // now it's either something like: 0421(octal) or 0.1231(float) + illegalOctal := false + for isDecimal(ch) { + ch = s.next() + if ch == '8' || ch == '9' { + // this is just a possibility. For example 0159 is illegal, but + // 0159.23 is valid. So we mark a possible illegal octal. If + // the next character is not a period, we'll print the error. + illegalOctal = true + } + } + + if ch == 'e' || ch == 'E' { + ch = s.scanExponent(ch) + return token.FLOAT + } + + if ch == '.' { + ch = s.scanFraction(ch) + + if ch == 'e' || ch == 'E' { + ch = s.next() + ch = s.scanExponent(ch) + } + return token.FLOAT + } + + if illegalOctal { + s.err("illegal octal number") + } + + if ch != eof { + s.unread() + } + return token.NUMBER + } + + s.scanMantissa(ch) + ch = s.next() // seek forward + if ch == 'e' || ch == 'E' { + ch = s.scanExponent(ch) + return token.FLOAT + } + + if ch == '.' { + ch = s.scanFraction(ch) + if ch == 'e' || ch == 'E' { + ch = s.next() + ch = s.scanExponent(ch) + } + return token.FLOAT + } + + if ch != eof { + s.unread() + } + return token.NUMBER +} + +// scanMantissa scans the mantissa begining from the rune. It returns the next +// non decimal rune. It's used to determine wheter it's a fraction or exponent. +func (s *Scanner) scanMantissa(ch rune) rune { + scanned := false + for isDecimal(ch) { + ch = s.next() + scanned = true + } + + if scanned && ch != eof { + s.unread() + } + return ch +} + +// scanFraction scans the fraction after the '.' rune +func (s *Scanner) scanFraction(ch rune) rune { + if ch == '.' { + ch = s.peek() // we peek just to see if we can move forward + ch = s.scanMantissa(ch) + } + return ch +} + +// scanExponent scans the remaining parts of an exponent after the 'e' or 'E' +// rune. +func (s *Scanner) scanExponent(ch rune) rune { + if ch == 'e' || ch == 'E' { + ch = s.next() + if ch == '-' || ch == '+' { + ch = s.next() + } + ch = s.scanMantissa(ch) + } + return ch +} + +// scanHeredoc scans a heredoc string +func (s *Scanner) scanHeredoc() { + // Scan the second '<' in example: '<= len(identBytes) && identRegexp.Match(s.src[lineStart:s.srcPos.Offset-s.lastCharLen]) { + break + } + + // Not an anchor match, record the start of a new line + lineStart = s.srcPos.Offset + } + + if ch == eof { + s.err("heredoc not terminated") + return + } + } + + return +} + +// scanString scans a quoted string +func (s *Scanner) scanString() { + braces := 0 + for { + // '"' opening already consumed + // read character after quote + ch := s.next() + + if ch == '\n' || ch < 0 || ch == eof { + s.err("literal not terminated") + return + } + + if ch == '"' && braces == 0 { + break + } + + // If we're going into a ${} then we can ignore quotes for awhile + if braces == 0 && ch == '$' && s.peek() == '{' { + braces++ + s.next() + } else if braces > 0 && ch == '{' { + braces++ + } + if braces > 0 && ch == '}' { + braces-- + } + + if ch == '\\' { + s.scanEscape() + } + } + + return +} + +// scanEscape scans an escape sequence +func (s *Scanner) scanEscape() rune { + // http://en.cppreference.com/w/cpp/language/escape + ch := s.next() // read character after '/' + switch ch { + case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '"': + // nothing to do + case '0', '1', '2', '3', '4', '5', '6', '7': + // octal notation + ch = s.scanDigits(ch, 8, 3) + case 'x': + // hexademical notation + ch = s.scanDigits(s.next(), 16, 2) + case 'u': + // universal character name + ch = s.scanDigits(s.next(), 16, 4) + case 'U': + // universal character name + ch = s.scanDigits(s.next(), 16, 8) + default: + s.err("illegal char escape") + } + return ch +} + +// scanDigits scans a rune with the given base for n times. For example an +// octal notation \184 would yield in scanDigits(ch, 8, 3) +func (s *Scanner) scanDigits(ch rune, base, n int) rune { + for n > 0 && digitVal(ch) < base { + ch = s.next() + n-- + } + if n > 0 { + s.err("illegal char escape") + } + + // we scanned all digits, put the last non digit char back + s.unread() + return ch +} + +// scanIdentifier scans an identifier and returns the literal string +func (s *Scanner) scanIdentifier() string { + offs := s.srcPos.Offset - s.lastCharLen + ch := s.next() + for isLetter(ch) || isDigit(ch) || ch == '-' || ch == '.' { + ch = s.next() + } + + if ch != eof { + s.unread() // we got identifier, put back latest char + } + + return string(s.src[offs:s.srcPos.Offset]) +} + +// recentPosition returns the position of the character immediately after the +// character or token returned by the last call to Scan. +func (s *Scanner) recentPosition() (pos token.Pos) { + pos.Offset = s.srcPos.Offset - s.lastCharLen + switch { + case s.srcPos.Column > 0: + // common case: last character was not a '\n' + pos.Line = s.srcPos.Line + pos.Column = s.srcPos.Column + case s.lastLineLen > 0: + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + pos.Line = s.srcPos.Line - 1 + pos.Column = s.lastLineLen + default: + // at the beginning of the source + pos.Line = 1 + pos.Column = 1 + } + return +} + +// err prints the error of any scanning to s.Error function. If the function is +// not defined, by default it prints them to os.Stderr +func (s *Scanner) err(msg string) { + s.ErrorCount++ + pos := s.recentPosition() + + if s.Error != nil { + s.Error(pos, msg) + return + } + + fmt.Fprintf(os.Stderr, "%s: %s\n", pos, msg) +} + +// isHexadecimal returns true if the given rune is a letter +func isLetter(ch rune) bool { + return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch) +} + +// isDigit returns true if the given rune is a decimal digit +func isDigit(ch rune) bool { + return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch) +} + +// isDecimal returns true if the given rune is a decimal number +func isDecimal(ch rune) bool { + return '0' <= ch && ch <= '9' +} + +// isHexadecimal returns true if the given rune is an hexadecimal number +func isHexadecimal(ch rune) bool { + return '0' <= ch && ch <= '9' || 'a' <= ch && ch <= 'f' || 'A' <= ch && ch <= 'F' +} + +// isWhitespace returns true if the rune is a space, tab, newline or carriage return +func isWhitespace(ch rune) bool { + return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' +} + +// digitVal returns the integer value of a given octal,decimal or hexadecimal rune +func digitVal(ch rune) int { + switch { + case '0' <= ch && ch <= '9': + return int(ch - '0') + case 'a' <= ch && ch <= 'f': + return int(ch - 'a' + 10) + case 'A' <= ch && ch <= 'F': + return int(ch - 'A' + 10) + } + return 16 // larger than any legal digit val +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner_test.go b/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner_test.go new file mode 100644 index 0000000000..3c6dd32170 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner_test.go @@ -0,0 +1,554 @@ +package scanner + +import ( + "bytes" + "fmt" + "testing" + + "strings" + + "github.com/hashicorp/hcl/hcl/token" +) + +var f100 = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + +type tokenPair struct { + tok token.Type + text string +} + +var tokenLists = map[string][]tokenPair{ + "comment": []tokenPair{ + {token.COMMENT, "//"}, + {token.COMMENT, "////"}, + {token.COMMENT, "// comment"}, + {token.COMMENT, "// /* comment */"}, + {token.COMMENT, "// // comment //"}, + {token.COMMENT, "//" + f100}, + {token.COMMENT, "#"}, + {token.COMMENT, "##"}, + {token.COMMENT, "# comment"}, + {token.COMMENT, "# /* comment */"}, + {token.COMMENT, "# # comment #"}, + {token.COMMENT, "#" + f100}, + {token.COMMENT, "/**/"}, + {token.COMMENT, "/***/"}, + {token.COMMENT, "/* comment */"}, + {token.COMMENT, "/* // comment */"}, + {token.COMMENT, "/* /* comment */"}, + {token.COMMENT, "/*\n comment\n*/"}, + {token.COMMENT, "/*" + f100 + "*/"}, + }, + "operator": []tokenPair{ + {token.LBRACK, "["}, + {token.LBRACE, "{"}, + {token.COMMA, ","}, + {token.PERIOD, "."}, + {token.RBRACK, "]"}, + {token.RBRACE, "}"}, + {token.ASSIGN, "="}, + {token.ADD, "+"}, + {token.SUB, "-"}, + }, + "bool": []tokenPair{ + {token.BOOL, "true"}, + {token.BOOL, "false"}, + }, + "ident": []tokenPair{ + {token.IDENT, "a"}, + {token.IDENT, "a0"}, + {token.IDENT, "foobar"}, + {token.IDENT, "foo-bar"}, + {token.IDENT, "abc123"}, + {token.IDENT, "LGTM"}, + {token.IDENT, "_"}, + {token.IDENT, "_abc123"}, + {token.IDENT, "abc123_"}, + {token.IDENT, "_abc_123_"}, + {token.IDENT, "_äöü"}, + {token.IDENT, "_本"}, + {token.IDENT, "äöü"}, + {token.IDENT, "本"}, + {token.IDENT, "a۰۱۸"}, + {token.IDENT, "foo६४"}, + {token.IDENT, "bar9876"}, + }, + "heredoc": []tokenPair{ + {token.HEREDOC, "< 0 for %q", s.ErrorCount, src) + } +} + +func testTokenList(t *testing.T, tokenList []tokenPair) { + // create artifical source code + buf := new(bytes.Buffer) + for _, ident := range tokenList { + fmt.Fprintf(buf, "%s\n", ident.text) + } + + s := New(buf.Bytes()) + for _, ident := range tokenList { + tok := s.Scan() + if tok.Type != ident.tok { + t.Errorf("tok = %q want %q for %q\n", tok, ident.tok, ident.text) + } + + if tok.Text != ident.text { + t.Errorf("text = %q want %q", tok.String(), ident.text) + } + + } +} + +func countNewlines(s string) int { + n := 0 + for _, ch := range s { + if ch == '\n' { + n++ + } + } + return n +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go b/vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go new file mode 100644 index 0000000000..e87ac63563 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go @@ -0,0 +1,245 @@ +package strconv + +import ( + "errors" + "unicode/utf8" +) + +// ErrSyntax indicates that a value does not have the right syntax for the target type. +var ErrSyntax = errors.New("invalid syntax") + +// Unquote interprets s as a single-quoted, double-quoted, +// or backquoted Go string literal, returning the string value +// that s quotes. (If s is single-quoted, it would be a Go +// character literal; Unquote returns the corresponding +// one-character string.) +func Unquote(s string) (t string, err error) { + n := len(s) + if n < 2 { + return "", ErrSyntax + } + quote := s[0] + if quote != s[n-1] { + return "", ErrSyntax + } + s = s[1 : n-1] + + if quote != '"' { + return "", ErrSyntax + } + if contains(s, '\n') { + return "", ErrSyntax + } + + // Is it trivial? Avoid allocation. + if !contains(s, '\\') && !contains(s, quote) && !contains(s, '$') { + switch quote { + case '"': + return s, nil + case '\'': + r, size := utf8.DecodeRuneInString(s) + if size == len(s) && (r != utf8.RuneError || size != 1) { + return s, nil + } + } + } + + var runeTmp [utf8.UTFMax]byte + buf := make([]byte, 0, 3*len(s)/2) // Try to avoid more allocations. + for len(s) > 0 { + // If we're starting a '${}' then let it through un-unquoted. + // Specifically: we don't unquote any characters within the `${}` + // section, except for escaped quotes, which we handle specifically. + if s[0] == '$' && len(s) > 1 && s[1] == '{' { + buf = append(buf, '$', '{') + s = s[2:] + + // Continue reading until we find the closing brace, copying as-is + braces := 1 + for len(s) > 0 && braces > 0 { + r, size := utf8.DecodeRuneInString(s) + if r == utf8.RuneError { + return "", ErrSyntax + } + + s = s[size:] + + // We special case escaped double quotes in interpolations, converting + // them to straight double quotes. + if r == '\\' { + if q, _ := utf8.DecodeRuneInString(s); q == '"' { + continue + } + } + + n := utf8.EncodeRune(runeTmp[:], r) + buf = append(buf, runeTmp[:n]...) + + switch r { + case '{': + braces++ + case '}': + braces-- + } + } + if braces != 0 { + return "", ErrSyntax + } + if len(s) == 0 { + // If there's no string left, we're done! + break + } else { + // If there's more left, we need to pop back up to the top of the loop + // in case there's another interpolation in this string. + continue + } + } + + c, multibyte, ss, err := unquoteChar(s, quote) + if err != nil { + return "", err + } + s = ss + if c < utf8.RuneSelf || !multibyte { + buf = append(buf, byte(c)) + } else { + n := utf8.EncodeRune(runeTmp[:], c) + buf = append(buf, runeTmp[:n]...) + } + if quote == '\'' && len(s) != 0 { + // single-quoted must be single character + return "", ErrSyntax + } + } + return string(buf), nil +} + +// contains reports whether the string contains the byte c. +func contains(s string, c byte) bool { + for i := 0; i < len(s); i++ { + if s[i] == c { + return true + } + } + return false +} + +func unhex(b byte) (v rune, ok bool) { + c := rune(b) + switch { + case '0' <= c && c <= '9': + return c - '0', true + case 'a' <= c && c <= 'f': + return c - 'a' + 10, true + case 'A' <= c && c <= 'F': + return c - 'A' + 10, true + } + return +} + +func unquoteChar(s string, quote byte) (value rune, multibyte bool, tail string, err error) { + // easy cases + switch c := s[0]; { + case c == quote && (quote == '\'' || quote == '"'): + err = ErrSyntax + return + case c >= utf8.RuneSelf: + r, size := utf8.DecodeRuneInString(s) + return r, true, s[size:], nil + case c != '\\': + return rune(s[0]), false, s[1:], nil + } + + // hard case: c is backslash + if len(s) <= 1 { + err = ErrSyntax + return + } + c := s[1] + s = s[2:] + + switch c { + case 'a': + value = '\a' + case 'b': + value = '\b' + case 'f': + value = '\f' + case 'n': + value = '\n' + case 'r': + value = '\r' + case 't': + value = '\t' + case 'v': + value = '\v' + case 'x', 'u', 'U': + n := 0 + switch c { + case 'x': + n = 2 + case 'u': + n = 4 + case 'U': + n = 8 + } + var v rune + if len(s) < n { + err = ErrSyntax + return + } + for j := 0; j < n; j++ { + x, ok := unhex(s[j]) + if !ok { + err = ErrSyntax + return + } + v = v<<4 | x + } + s = s[n:] + if c == 'x' { + // single-byte string, possibly not UTF-8 + value = v + break + } + if v > utf8.MaxRune { + err = ErrSyntax + return + } + value = v + multibyte = true + case '0', '1', '2', '3', '4', '5', '6', '7': + v := rune(c) - '0' + if len(s) < 2 { + err = ErrSyntax + return + } + for j := 0; j < 2; j++ { // one digit already; two more + x := rune(s[j]) - '0' + if x < 0 || x > 7 { + err = ErrSyntax + return + } + v = (v << 3) | x + } + s = s[2:] + if v > 255 { + err = ErrSyntax + return + } + value = v + case '\\': + value = '\\' + case '\'', '"': + if c != quote { + err = ErrSyntax + return + } + value = rune(c) + default: + err = ErrSyntax + return + } + tail = s + return +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/strconv/quote_test.go b/vendor/github.com/hashicorp/hcl/hcl/strconv/quote_test.go new file mode 100644 index 0000000000..4a810aa38a --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/strconv/quote_test.go @@ -0,0 +1,93 @@ +package strconv + +import "testing" + +type quoteTest struct { + in string + out string + ascii string +} + +var quotetests = []quoteTest{ + {"\a\b\f\r\n\t\v", `"\a\b\f\r\n\t\v"`, `"\a\b\f\r\n\t\v"`}, + {"\\", `"\\"`, `"\\"`}, + {"abc\xffdef", `"abc\xffdef"`, `"abc\xffdef"`}, + {"\u263a", `"☺"`, `"\u263a"`}, + {"\U0010ffff", `"\U0010ffff"`, `"\U0010ffff"`}, + {"\x04", `"\x04"`, `"\x04"`}, +} + +type unQuoteTest struct { + in string + out string +} + +var unquotetests = []unQuoteTest{ + {`""`, ""}, + {`"a"`, "a"}, + {`"abc"`, "abc"}, + {`"☺"`, "☺"}, + {`"hello world"`, "hello world"}, + {`"\xFF"`, "\xFF"}, + {`"\377"`, "\377"}, + {`"\u1234"`, "\u1234"}, + {`"\U00010111"`, "\U00010111"}, + {`"\U0001011111"`, "\U0001011111"}, + {`"\a\b\f\n\r\t\v\\\""`, "\a\b\f\n\r\t\v\\\""}, + {`"'"`, "'"}, + {`"${file("foo")}"`, `${file("foo")}`}, + {`"${file(\"foo\")}"`, `${file("foo")}`}, + {`"echo ${var.region}${element(split(",",var.zones),0)}"`, + `echo ${var.region}${element(split(",",var.zones),0)}`}, +} + +var misquoted = []string{ + ``, + `"`, + `"a`, + `"'`, + `b"`, + `"\"`, + `"\9"`, + `"\19"`, + `"\129"`, + `'\'`, + `'\9'`, + `'\19'`, + `'\129'`, + `'ab'`, + `"\x1!"`, + `"\U12345678"`, + `"\z"`, + "`", + "`xxx", + "`\"", + `"\'"`, + `'\"'`, + "\"\n\"", + "\"\\n\n\"", + "'\n'", + `"${"`, + `"${foo{}"`, +} + +func TestUnquote(t *testing.T) { + for _, tt := range unquotetests { + if out, err := Unquote(tt.in); err != nil || out != tt.out { + t.Errorf("Unquote(%#q) = %q, %v want %q, nil", tt.in, out, err, tt.out) + } + } + + // run the quote tests too, backward + for _, tt := range quotetests { + if in, err := Unquote(tt.out); in != tt.in { + t.Errorf("Unquote(%#q) = %q, %v, want %q, nil", tt.out, in, err, tt.in) + } + } + + for _, s := range misquoted { + if out, err := Unquote(s); out != "" || err != ErrSyntax { + t.Errorf("Unquote(%#q) = %q, %v want %q, %v", s, out, err, "", ErrSyntax) + } + } +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/array_comment.hcl b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/array_comment.hcl new file mode 100644 index 0000000000..78c2675823 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/array_comment.hcl @@ -0,0 +1,4 @@ +foo = [ + "1", + "2", # comment +] diff --git a/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/assign_colon.hcl b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/assign_colon.hcl new file mode 100644 index 0000000000..eb5a99a694 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/assign_colon.hcl @@ -0,0 +1,6 @@ +resource = [{ + "foo": { + "bar": {}, + "baz": [1, 2, "foo"], + } +}] diff --git a/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/assign_deep.hcl b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/assign_deep.hcl new file mode 100644 index 0000000000..dd3151cb7d --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/assign_deep.hcl @@ -0,0 +1,5 @@ +resource = [{ + foo = [{ + bar = {} + }] +}] diff --git a/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/comment.hcl b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/comment.hcl new file mode 100644 index 0000000000..1ff7f29fd2 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/comment.hcl @@ -0,0 +1,15 @@ +// Foo + +/* Bar */ + +/* +/* +Baz +*/ + +# Another + +# Multiple +# Lines + +foo = "bar" diff --git a/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/comment_single.hcl b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/comment_single.hcl new file mode 100644 index 0000000000..fec56017dc --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/comment_single.hcl @@ -0,0 +1 @@ +# Hello diff --git a/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/complex.hcl b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/complex.hcl new file mode 100644 index 0000000000..cccb5b06fc --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/complex.hcl @@ -0,0 +1,42 @@ +// This comes from Terraform, as a test +variable "foo" { + default = "bar" + description = "bar" +} + +provider "aws" { + access_key = "foo" + secret_key = "bar" +} + +provider "do" { + api_key = "${var.foo}" +} + +resource "aws_security_group" "firewall" { + count = 5 +} + +resource aws_instance "web" { + ami = "${var.foo}" + security_groups = [ + "foo", + "${aws_security_group.firewall.foo}" + ] + + network_interface { + device_index = 0 + description = "Main network interface" + } +} + +resource "aws_instance" "db" { + security_groups = "${aws_security_group.firewall.*.id}" + VPC = "foo" + + depends_on = ["aws_instance.web"] +} + +output "web_ip" { + value = "${aws_instance.web.private_ip}" +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/complex_key.hcl b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/complex_key.hcl new file mode 100644 index 0000000000..0007aaf5f7 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/complex_key.hcl @@ -0,0 +1 @@ +foo.bar = "baz" diff --git a/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/empty.hcl b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/empty.hcl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/list.hcl b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/list.hcl new file mode 100644 index 0000000000..059d4ce65b --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/list.hcl @@ -0,0 +1 @@ +foo = [1, 2, "foo"] diff --git a/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/list_comma.hcl b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/list_comma.hcl new file mode 100644 index 0000000000..50f4218ac8 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/list_comma.hcl @@ -0,0 +1 @@ +foo = [1, 2, "foo",] diff --git a/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/multiple.hcl b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/multiple.hcl new file mode 100644 index 0000000000..029c54b0ce --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/multiple.hcl @@ -0,0 +1,2 @@ +foo = "bar" +key = 7 diff --git a/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/old.hcl b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/old.hcl new file mode 100644 index 0000000000..e9f77cae90 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/old.hcl @@ -0,0 +1,3 @@ +default = { + "eu-west-1": "ami-b1cf19c6", +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/structure.hcl b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/structure.hcl new file mode 100644 index 0000000000..92592fbb3c --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/structure.hcl @@ -0,0 +1,5 @@ +// This is a test structure for the lexer +foo bar "baz" { + key = 7 + foo = "bar" +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/structure_basic.hcl b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/structure_basic.hcl new file mode 100644 index 0000000000..7229a1f012 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/structure_basic.hcl @@ -0,0 +1,5 @@ +foo { + value = 7 + "value" = 8 + "complex::value" = 9 +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/structure_empty.hcl b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/structure_empty.hcl new file mode 100644 index 0000000000..4d156ddea9 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/structure_empty.hcl @@ -0,0 +1 @@ +resource "foo" "bar" {} diff --git a/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/types.hcl b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/types.hcl new file mode 100644 index 0000000000..cf2747ea1a --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/test-fixtures/types.hcl @@ -0,0 +1,7 @@ +foo = "bar" +bar = 7 +baz = [1,2,3] +foo = -12 +bar = 3.14159 +foo = true +bar = false diff --git a/vendor/github.com/hashicorp/hcl/hcl/token/position.go b/vendor/github.com/hashicorp/hcl/hcl/token/position.go new file mode 100644 index 0000000000..59c1bb72d4 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/token/position.go @@ -0,0 +1,46 @@ +package token + +import "fmt" + +// Pos describes an arbitrary source position +// including the file, line, and column location. +// A Position is valid if the line number is > 0. +type Pos struct { + Filename string // filename, if any + Offset int // offset, starting at 0 + Line int // line number, starting at 1 + Column int // column number, starting at 1 (character count) +} + +// IsValid returns true if the position is valid. +func (p *Pos) IsValid() bool { return p.Line > 0 } + +// String returns a string in one of several forms: +// +// file:line:column valid position with file name +// line:column valid position without file name +// file invalid position with file name +// - invalid position without file name +func (p Pos) String() string { + s := p.Filename + if p.IsValid() { + if s != "" { + s += ":" + } + s += fmt.Sprintf("%d:%d", p.Line, p.Column) + } + if s == "" { + s = "-" + } + return s +} + +// Before reports whether the position p is before u. +func (p Pos) Before(u Pos) bool { + return u.Offset > p.Offset || u.Line > p.Line +} + +// After reports whether the position p is after u. +func (p Pos) After(u Pos) bool { + return u.Offset < p.Offset || u.Line < p.Line +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/token/token.go b/vendor/github.com/hashicorp/hcl/hcl/token/token.go new file mode 100644 index 0000000000..6e99498040 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/token/token.go @@ -0,0 +1,214 @@ +// Package token defines constants representing the lexical tokens for HCL +// (HashiCorp Configuration Language) +package token + +import ( + "fmt" + "strconv" + "strings" + + hclstrconv "github.com/hashicorp/hcl/hcl/strconv" +) + +// Token defines a single HCL token which can be obtained via the Scanner +type Token struct { + Type Type + Pos Pos + Text string + JSON bool +} + +// Type is the set of lexical tokens of the HCL (HashiCorp Configuration Language) +type Type int + +const ( + // Special tokens + ILLEGAL Type = iota + EOF + COMMENT + + identifier_beg + IDENT // literals + literal_beg + NUMBER // 12345 + FLOAT // 123.45 + BOOL // true,false + STRING // "abc" + HEREDOC // < 0 { + // Pop the current item + n := len(frontier) + item := frontier[n-1] + frontier = frontier[:n-1] + + switch v := item.Val.(type) { + case *ast.ObjectType: + items, frontier = flattenObjectType(v, item, items, frontier) + case *ast.ListType: + items, frontier = flattenListType(v, item, items, frontier) + default: + items = append(items, item) + } + } + + // Reverse the list since the frontier model runs things backwards + for i := len(items)/2 - 1; i >= 0; i-- { + opp := len(items) - 1 - i + items[i], items[opp] = items[opp], items[i] + } + + // Done! Set the original items + list.Items = items + return n, true + }) +} + +func flattenListType( + ot *ast.ListType, + item *ast.ObjectItem, + items []*ast.ObjectItem, + frontier []*ast.ObjectItem) ([]*ast.ObjectItem, []*ast.ObjectItem) { + // All the elements of this object must also be objects! + for _, subitem := range ot.List { + if _, ok := subitem.(*ast.ObjectType); !ok { + items = append(items, item) + return items, frontier + } + } + + // Great! We have a match go through all the items and flatten + for _, elem := range ot.List { + // Add it to the frontier so that we can recurse + frontier = append(frontier, &ast.ObjectItem{ + Keys: item.Keys, + Assign: item.Assign, + Val: elem, + LeadComment: item.LeadComment, + LineComment: item.LineComment, + }) + } + + return items, frontier +} + +func flattenObjectType( + ot *ast.ObjectType, + item *ast.ObjectItem, + items []*ast.ObjectItem, + frontier []*ast.ObjectItem) ([]*ast.ObjectItem, []*ast.ObjectItem) { + // If the list has no items we do not have to flatten anything + if ot.List.Items == nil { + items = append(items, item) + return items, frontier + } + + // All the elements of this object must also be objects! + for _, subitem := range ot.List.Items { + if _, ok := subitem.Val.(*ast.ObjectType); !ok { + items = append(items, item) + return items, frontier + } + } + + // Great! We have a match go through all the items and flatten + for _, subitem := range ot.List.Items { + // Copy the new key + keys := make([]*ast.ObjectKey, len(item.Keys)+len(subitem.Keys)) + copy(keys, item.Keys) + copy(keys[len(item.Keys):], subitem.Keys) + + // Add it to the frontier so that we can recurse + frontier = append(frontier, &ast.ObjectItem{ + Keys: keys, + Assign: item.Assign, + Val: subitem.Val, + LeadComment: item.LeadComment, + LineComment: item.LineComment, + }) + } + + return items, frontier +} diff --git a/vendor/github.com/hashicorp/hcl/json/parser/parser.go b/vendor/github.com/hashicorp/hcl/json/parser/parser.go new file mode 100644 index 0000000000..65d56c9b85 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/parser/parser.go @@ -0,0 +1,297 @@ +package parser + +import ( + "errors" + "fmt" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/json/scanner" + "github.com/hashicorp/hcl/json/token" +) + +type Parser struct { + sc *scanner.Scanner + + // Last read token + tok token.Token + commaPrev token.Token + + enableTrace bool + indent int + n int // buffer size (max = 1) +} + +func newParser(src []byte) *Parser { + return &Parser{ + sc: scanner.New(src), + } +} + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func Parse(src []byte) (*ast.File, error) { + p := newParser(src) + return p.Parse() +} + +var errEofToken = errors.New("EOF token found") + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func (p *Parser) Parse() (*ast.File, error) { + f := &ast.File{} + var err, scerr error + p.sc.Error = func(pos token.Pos, msg string) { + scerr = fmt.Errorf("%s: %s", pos, msg) + } + + // The root must be an object in JSON + object, err := p.object() + if scerr != nil { + return nil, scerr + } + if err != nil { + return nil, err + } + + // We make our final node an object list so it is more HCL compatible + f.Node = object.List + + // Flatten it, which finds patterns and turns them into more HCL-like + // AST trees. + flattenObjects(f.Node) + + return f, nil +} + +func (p *Parser) objectList() (*ast.ObjectList, error) { + defer un(trace(p, "ParseObjectList")) + node := &ast.ObjectList{} + + for { + n, err := p.objectItem() + if err == errEofToken { + break // we are finished + } + + // we don't return a nil node, because might want to use already + // collected items. + if err != nil { + return node, err + } + + node.Add(n) + + // Check for a followup comma. If it isn't a comma, then we're done + if tok := p.scan(); tok.Type != token.COMMA { + break + } + } + return node, nil +} + +// objectItem parses a single object item +func (p *Parser) objectItem() (*ast.ObjectItem, error) { + defer un(trace(p, "ParseObjectItem")) + + keys, err := p.objectKey() + if err != nil { + return nil, err + } + + o := &ast.ObjectItem{ + Keys: keys, + } + + switch p.tok.Type { + case token.COLON: + o.Val, err = p.objectValue() + if err != nil { + return nil, err + } + } + + return o, nil +} + +// objectKey parses an object key and returns a ObjectKey AST +func (p *Parser) objectKey() ([]*ast.ObjectKey, error) { + keyCount := 0 + keys := make([]*ast.ObjectKey, 0) + + for { + tok := p.scan() + switch tok.Type { + case token.EOF: + return nil, errEofToken + case token.STRING: + keyCount++ + keys = append(keys, &ast.ObjectKey{ + Token: p.tok.HCLToken(), + }) + case token.COLON: + // Done + return keys, nil + case token.ILLEGAL: + fmt.Println("illegal") + default: + return nil, fmt.Errorf("expected: STRING got: %s", p.tok.Type) + } + } +} + +// object parses any type of object, such as number, bool, string, object or +// list. +func (p *Parser) objectValue() (ast.Node, error) { + defer un(trace(p, "ParseObjectValue")) + tok := p.scan() + + switch tok.Type { + case token.NUMBER, token.FLOAT, token.BOOL, token.NULL, token.STRING: + return p.literalType() + case token.LBRACE: + return p.objectType() + case token.LBRACK: + return p.listType() + case token.EOF: + return nil, errEofToken + } + + return nil, fmt.Errorf("Expected object value, got unknown token: %+v", tok) +} + +// object parses any type of object, such as number, bool, string, object or +// list. +func (p *Parser) object() (*ast.ObjectType, error) { + defer un(trace(p, "ParseType")) + tok := p.scan() + + switch tok.Type { + case token.LBRACE: + return p.objectType() + case token.EOF: + return nil, errEofToken + } + + return nil, fmt.Errorf("Expected object, got unknown token: %+v", tok) +} + +// objectType parses an object type and returns a ObjectType AST +func (p *Parser) objectType() (*ast.ObjectType, error) { + defer un(trace(p, "ParseObjectType")) + + // we assume that the currently scanned token is a LBRACE + o := &ast.ObjectType{} + + l, err := p.objectList() + + // if we hit RBRACE, we are good to go (means we parsed all Items), if it's + // not a RBRACE, it's an syntax error and we just return it. + if err != nil && p.tok.Type != token.RBRACE { + return nil, err + } + + o.List = l + return o, nil +} + +// listType parses a list type and returns a ListType AST +func (p *Parser) listType() (*ast.ListType, error) { + defer un(trace(p, "ParseListType")) + + // we assume that the currently scanned token is a LBRACK + l := &ast.ListType{} + + for { + tok := p.scan() + switch tok.Type { + case token.NUMBER, token.FLOAT, token.STRING: + node, err := p.literalType() + if err != nil { + return nil, err + } + + l.Add(node) + case token.COMMA: + continue + case token.LBRACE: + node, err := p.objectType() + if err != nil { + return nil, err + } + + l.Add(node) + case token.BOOL: + // TODO(arslan) should we support? not supported by HCL yet + case token.LBRACK: + // TODO(arslan) should we support nested lists? Even though it's + // written in README of HCL, it's not a part of the grammar + // (not defined in parse.y) + case token.RBRACK: + // finished + return l, nil + default: + return nil, fmt.Errorf("unexpected token while parsing list: %s", tok.Type) + } + + } +} + +// literalType parses a literal type and returns a LiteralType AST +func (p *Parser) literalType() (*ast.LiteralType, error) { + defer un(trace(p, "ParseLiteral")) + + return &ast.LiteralType{ + Token: p.tok.HCLToken(), + }, nil +} + +// scan returns the next token from the underlying scanner. If a token has +// been unscanned then read that instead. +func (p *Parser) scan() token.Token { + // If we have a token on the buffer, then return it. + if p.n != 0 { + p.n = 0 + return p.tok + } + + p.tok = p.sc.Scan() + return p.tok +} + +// unscan pushes the previously read token back onto the buffer. +func (p *Parser) unscan() { + p.n = 1 +} + +// ---------------------------------------------------------------------------- +// Parsing support + +func (p *Parser) printTrace(a ...interface{}) { + if !p.enableTrace { + return + } + + const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " + const n = len(dots) + fmt.Printf("%5d:%3d: ", p.tok.Pos.Line, p.tok.Pos.Column) + + i := 2 * p.indent + for i > n { + fmt.Print(dots) + i -= n + } + // i <= n + fmt.Print(dots[0:i]) + fmt.Println(a...) +} + +func trace(p *Parser, msg string) *Parser { + p.printTrace(msg, "(") + p.indent++ + return p +} + +// Usage pattern: defer un(trace(p, "...")) +func un(p *Parser) { + p.indent-- + p.printTrace(")") +} diff --git a/vendor/github.com/hashicorp/hcl/json/parser/parser_test.go b/vendor/github.com/hashicorp/hcl/json/parser/parser_test.go new file mode 100644 index 0000000000..8c66fb9ca5 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/parser/parser_test.go @@ -0,0 +1,338 @@ +package parser + +import ( + "fmt" + "io/ioutil" + "path/filepath" + "reflect" + "runtime" + "testing" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/token" +) + +func TestType(t *testing.T) { + var literals = []struct { + typ token.Type + src string + }{ + {token.STRING, `"foo": "bar"`}, + {token.NUMBER, `"foo": 123`}, + {token.FLOAT, `"foo": 123.12`}, + {token.FLOAT, `"foo": -123.12`}, + {token.BOOL, `"foo": true`}, + {token.STRING, `"foo": null`}, + } + + for _, l := range literals { + t.Logf("Testing: %s", l.src) + + p := newParser([]byte(l.src)) + item, err := p.objectItem() + if err != nil { + t.Error(err) + } + + lit, ok := item.Val.(*ast.LiteralType) + if !ok { + t.Errorf("node should be of type LiteralType, got: %T", item.Val) + } + + if lit.Token.Type != l.typ { + t.Errorf("want: %s, got: %s", l.typ, lit.Token.Type) + } + } +} + +func TestListType(t *testing.T) { + var literals = []struct { + src string + tokens []token.Type + }{ + { + `"foo": ["123", 123]`, + []token.Type{token.STRING, token.NUMBER}, + }, + { + `"foo": [123, "123",]`, + []token.Type{token.NUMBER, token.STRING}, + }, + { + `"foo": []`, + []token.Type{}, + }, + { + `"foo": ["123", 123]`, + []token.Type{token.STRING, token.NUMBER}, + }, + { + `"foo": ["123", {}]`, + []token.Type{token.STRING, token.LBRACE}, + }, + } + + for _, l := range literals { + t.Logf("Testing: %s", l.src) + + p := newParser([]byte(l.src)) + item, err := p.objectItem() + if err != nil { + t.Error(err) + } + + list, ok := item.Val.(*ast.ListType) + if !ok { + t.Errorf("node should be of type LiteralType, got: %T", item.Val) + } + + tokens := []token.Type{} + for _, li := range list.List { + switch v := li.(type) { + case *ast.LiteralType: + tokens = append(tokens, v.Token.Type) + case *ast.ObjectType: + tokens = append(tokens, token.LBRACE) + } + } + + equals(t, l.tokens, tokens) + } +} + +func TestObjectType(t *testing.T) { + var literals = []struct { + src string + nodeType []ast.Node + itemLen int + }{ + { + `"foo": {}`, + nil, + 0, + }, + { + `"foo": { + "bar": "fatih" + }`, + []ast.Node{&ast.LiteralType{}}, + 1, + }, + { + `"foo": { + "bar": "fatih", + "baz": ["arslan"] + }`, + []ast.Node{ + &ast.LiteralType{}, + &ast.ListType{}, + }, + 2, + }, + { + `"foo": { + "bar": {} + }`, + []ast.Node{ + &ast.ObjectType{}, + }, + 1, + }, + { + `"foo": { + "bar": {}, + "foo": true + }`, + []ast.Node{ + &ast.ObjectType{}, + &ast.LiteralType{}, + }, + 2, + }, + } + + for _, l := range literals { + t.Logf("Testing:\n%s\n", l.src) + + p := newParser([]byte(l.src)) + // p.enableTrace = true + item, err := p.objectItem() + if err != nil { + t.Error(err) + } + + // we know that the ObjectKey name is foo for all cases, what matters + // is the object + obj, ok := item.Val.(*ast.ObjectType) + if !ok { + t.Errorf("node should be of type LiteralType, got: %T", item.Val) + } + + // check if the total length of items are correct + equals(t, l.itemLen, len(obj.List.Items)) + + // check if the types are correct + for i, item := range obj.List.Items { + equals(t, reflect.TypeOf(l.nodeType[i]), reflect.TypeOf(item.Val)) + } + } +} + +func TestFlattenObjects(t *testing.T) { + var literals = []struct { + src string + nodeType []ast.Node + itemLen int + }{ + { + `{ + "foo": [ + { + "foo": "svh", + "bar": "fatih" + } + ] + }`, + []ast.Node{ + &ast.ObjectType{}, + &ast.LiteralType{}, + &ast.LiteralType{}, + }, + 3, + }, + { + `{ + "variable": { + "foo": {} + } + }`, + []ast.Node{ + &ast.ObjectType{}, + }, + 1, + }, + } + + for _, l := range literals { + t.Logf("Testing:\n%s\n", l.src) + + f, err := Parse([]byte(l.src)) + if err != nil { + t.Error(err) + } + + // the first object is always an ObjectList so just assert that one + // so we can use it as such + obj, ok := f.Node.(*ast.ObjectList) + if !ok { + t.Errorf("node should be *ast.ObjectList, got: %T", f.Node) + } + + // check if the types are correct + var i int + for _, item := range obj.Items { + equals(t, reflect.TypeOf(l.nodeType[i]), reflect.TypeOf(item.Val)) + i++ + + if obj, ok := item.Val.(*ast.ObjectType); ok { + for _, item := range obj.List.Items { + equals(t, reflect.TypeOf(l.nodeType[i]), reflect.TypeOf(item.Val)) + i++ + } + } + } + + // check if the number of items is correct + equals(t, l.itemLen, i) + + } +} + +func TestObjectKey(t *testing.T) { + keys := []struct { + exp []token.Type + src string + }{ + {[]token.Type{token.STRING}, `"foo": {}`}, + } + + for _, k := range keys { + p := newParser([]byte(k.src)) + keys, err := p.objectKey() + if err != nil { + t.Fatal(err) + } + + tokens := []token.Type{} + for _, o := range keys { + tokens = append(tokens, o.Token.Type) + } + + equals(t, k.exp, tokens) + } + + errKeys := []struct { + src string + }{ + {`foo 12 {}`}, + {`foo bar = {}`}, + {`foo []`}, + {`12 {}`}, + } + + for _, k := range errKeys { + p := newParser([]byte(k.src)) + _, err := p.objectKey() + if err == nil { + t.Errorf("case '%s' should give an error", k.src) + } + } +} + +// Official HCL tests +func TestParse(t *testing.T) { + cases := []struct { + Name string + Err bool + }{ + { + "array.json", + false, + }, + { + "basic.json", + false, + }, + { + "object.json", + false, + }, + { + "types.json", + false, + }, + } + + const fixtureDir = "./test-fixtures" + + for _, tc := range cases { + d, err := ioutil.ReadFile(filepath.Join(fixtureDir, tc.Name)) + if err != nil { + t.Fatalf("err: %s", err) + } + + _, err = Parse(d) + if (err != nil) != tc.Err { + t.Fatalf("Input: %s\n\nError: %s", tc.Name, err) + } + } +} + +// equals fails the test if exp is not equal to act. +func equals(tb testing.TB, exp, act interface{}) { + if !reflect.DeepEqual(exp, act) { + _, file, line, _ := runtime.Caller(1) + fmt.Printf("\033[31m%s:%d:\n\n\texp: %#v\n\n\tgot: %#v\033[39m\n\n", filepath.Base(file), line, exp, act) + tb.FailNow() + } +} diff --git a/vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/array.json b/vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/array.json new file mode 100644 index 0000000000..e320f17ab2 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/array.json @@ -0,0 +1,4 @@ +{ + "foo": [1, 2, "bar"], + "bar": "baz" +} diff --git a/vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/basic.json b/vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/basic.json new file mode 100644 index 0000000000..b54bde96c1 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/basic.json @@ -0,0 +1,3 @@ +{ + "foo": "bar" +} diff --git a/vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/object.json b/vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/object.json new file mode 100644 index 0000000000..72168a3ccb --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/object.json @@ -0,0 +1,5 @@ +{ + "foo": { + "bar": [1,2] + } +} diff --git a/vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/types.json b/vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/types.json new file mode 100644 index 0000000000..9a142a6ca6 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/parser/test-fixtures/types.json @@ -0,0 +1,10 @@ +{ + "foo": "bar", + "bar": 7, + "baz": [1,2,3], + "foo": -12, + "bar": 3.14159, + "foo": true, + "bar": false, + "foo": null +} diff --git a/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go b/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go new file mode 100644 index 0000000000..477f71ff3d --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go @@ -0,0 +1,451 @@ +package scanner + +import ( + "bytes" + "fmt" + "os" + "unicode" + "unicode/utf8" + + "github.com/hashicorp/hcl/json/token" +) + +// eof represents a marker rune for the end of the reader. +const eof = rune(0) + +// Scanner defines a lexical scanner +type Scanner struct { + buf *bytes.Buffer // Source buffer for advancing and scanning + src []byte // Source buffer for immutable access + + // Source Position + srcPos token.Pos // current position + prevPos token.Pos // previous position, used for peek() method + + lastCharLen int // length of last character in bytes + lastLineLen int // length of last line in characters (for correct column reporting) + + tokStart int // token text start position + tokEnd int // token text end position + + // Error is called for each error encountered. If no Error + // function is set, the error is reported to os.Stderr. + Error func(pos token.Pos, msg string) + + // ErrorCount is incremented by one for each error encountered. + ErrorCount int + + // tokPos is the start position of most recently scanned token; set by + // Scan. The Filename field is always left untouched by the Scanner. If + // an error is reported (via Error) and Position is invalid, the scanner is + // not inside a token. + tokPos token.Pos +} + +// New creates and initializes a new instance of Scanner using src as +// its source content. +func New(src []byte) *Scanner { + // even though we accept a src, we read from a io.Reader compatible type + // (*bytes.Buffer). So in the future we might easily change it to streaming + // read. + b := bytes.NewBuffer(src) + s := &Scanner{ + buf: b, + src: src, + } + + // srcPosition always starts with 1 + s.srcPos.Line = 1 + return s +} + +// next reads the next rune from the bufferred reader. Returns the rune(0) if +// an error occurs (or io.EOF is returned). +func (s *Scanner) next() rune { + ch, size, err := s.buf.ReadRune() + if err != nil { + // advance for error reporting + s.srcPos.Column++ + s.srcPos.Offset += size + s.lastCharLen = size + return eof + } + + if ch == utf8.RuneError && size == 1 { + s.srcPos.Column++ + s.srcPos.Offset += size + s.lastCharLen = size + s.err("illegal UTF-8 encoding") + return ch + } + + // remember last position + s.prevPos = s.srcPos + + s.srcPos.Column++ + s.lastCharLen = size + s.srcPos.Offset += size + + if ch == '\n' { + s.srcPos.Line++ + s.lastLineLen = s.srcPos.Column + s.srcPos.Column = 0 + } + + // debug + // fmt.Printf("ch: %q, offset:column: %d:%d\n", ch, s.srcPos.Offset, s.srcPos.Column) + return ch +} + +// unread unreads the previous read Rune and updates the source position +func (s *Scanner) unread() { + if err := s.buf.UnreadRune(); err != nil { + panic(err) // this is user fault, we should catch it + } + s.srcPos = s.prevPos // put back last position +} + +// peek returns the next rune without advancing the reader. +func (s *Scanner) peek() rune { + peek, _, err := s.buf.ReadRune() + if err != nil { + return eof + } + + s.buf.UnreadRune() + return peek +} + +// Scan scans the next token and returns the token. +func (s *Scanner) Scan() token.Token { + ch := s.next() + + // skip white space + for isWhitespace(ch) { + ch = s.next() + } + + var tok token.Type + + // token text markings + s.tokStart = s.srcPos.Offset - s.lastCharLen + + // token position, initial next() is moving the offset by one(size of rune + // actually), though we are interested with the starting point + s.tokPos.Offset = s.srcPos.Offset - s.lastCharLen + if s.srcPos.Column > 0 { + // common case: last character was not a '\n' + s.tokPos.Line = s.srcPos.Line + s.tokPos.Column = s.srcPos.Column + } else { + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + s.tokPos.Line = s.srcPos.Line - 1 + s.tokPos.Column = s.lastLineLen + } + + switch { + case isLetter(ch): + lit := s.scanIdentifier() + if lit == "true" || lit == "false" { + tok = token.BOOL + } else if lit == "null" { + tok = token.NULL + } else { + s.err("illegal char") + } + case isDecimal(ch): + tok = s.scanNumber(ch) + default: + switch ch { + case eof: + tok = token.EOF + case '"': + tok = token.STRING + s.scanString() + case '.': + tok = token.PERIOD + ch = s.peek() + if isDecimal(ch) { + tok = token.FLOAT + ch = s.scanMantissa(ch) + ch = s.scanExponent(ch) + } + case '[': + tok = token.LBRACK + case ']': + tok = token.RBRACK + case '{': + tok = token.LBRACE + case '}': + tok = token.RBRACE + case ',': + tok = token.COMMA + case ':': + tok = token.COLON + case '-': + if isDecimal(s.peek()) { + ch := s.next() + tok = s.scanNumber(ch) + } else { + s.err("illegal char") + } + default: + s.err("illegal char: " + string(ch)) + } + } + + // finish token ending + s.tokEnd = s.srcPos.Offset + + // create token literal + var tokenText string + if s.tokStart >= 0 { + tokenText = string(s.src[s.tokStart:s.tokEnd]) + } + s.tokStart = s.tokEnd // ensure idempotency of tokenText() call + + return token.Token{ + Type: tok, + Pos: s.tokPos, + Text: tokenText, + } +} + +// scanNumber scans a HCL number definition starting with the given rune +func (s *Scanner) scanNumber(ch rune) token.Type { + zero := ch == '0' + pos := s.srcPos + + s.scanMantissa(ch) + ch = s.next() // seek forward + if ch == 'e' || ch == 'E' { + ch = s.scanExponent(ch) + return token.FLOAT + } + + if ch == '.' { + ch = s.scanFraction(ch) + if ch == 'e' || ch == 'E' { + ch = s.next() + ch = s.scanExponent(ch) + } + return token.FLOAT + } + + if ch != eof { + s.unread() + } + + // If we have a larger number and this is zero, error + if zero && pos != s.srcPos { + s.err("numbers cannot start with 0") + } + + return token.NUMBER +} + +// scanMantissa scans the mantissa begining from the rune. It returns the next +// non decimal rune. It's used to determine wheter it's a fraction or exponent. +func (s *Scanner) scanMantissa(ch rune) rune { + scanned := false + for isDecimal(ch) { + ch = s.next() + scanned = true + } + + if scanned && ch != eof { + s.unread() + } + return ch +} + +// scanFraction scans the fraction after the '.' rune +func (s *Scanner) scanFraction(ch rune) rune { + if ch == '.' { + ch = s.peek() // we peek just to see if we can move forward + ch = s.scanMantissa(ch) + } + return ch +} + +// scanExponent scans the remaining parts of an exponent after the 'e' or 'E' +// rune. +func (s *Scanner) scanExponent(ch rune) rune { + if ch == 'e' || ch == 'E' { + ch = s.next() + if ch == '-' || ch == '+' { + ch = s.next() + } + ch = s.scanMantissa(ch) + } + return ch +} + +// scanString scans a quoted string +func (s *Scanner) scanString() { + braces := 0 + for { + // '"' opening already consumed + // read character after quote + ch := s.next() + + if ch == '\n' || ch < 0 || ch == eof { + s.err("literal not terminated") + return + } + + if ch == '"' && braces == 0 { + break + } + + // If we're going into a ${} then we can ignore quotes for awhile + if braces == 0 && ch == '$' && s.peek() == '{' { + braces++ + s.next() + } else if braces > 0 && ch == '{' { + braces++ + } + if braces > 0 && ch == '}' { + braces-- + } + + if ch == '\\' { + s.scanEscape() + } + } + + return +} + +// scanEscape scans an escape sequence +func (s *Scanner) scanEscape() rune { + // http://en.cppreference.com/w/cpp/language/escape + ch := s.next() // read character after '/' + switch ch { + case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '"': + // nothing to do + case '0', '1', '2', '3', '4', '5', '6', '7': + // octal notation + ch = s.scanDigits(ch, 8, 3) + case 'x': + // hexademical notation + ch = s.scanDigits(s.next(), 16, 2) + case 'u': + // universal character name + ch = s.scanDigits(s.next(), 16, 4) + case 'U': + // universal character name + ch = s.scanDigits(s.next(), 16, 8) + default: + s.err("illegal char escape") + } + return ch +} + +// scanDigits scans a rune with the given base for n times. For example an +// octal notation \184 would yield in scanDigits(ch, 8, 3) +func (s *Scanner) scanDigits(ch rune, base, n int) rune { + for n > 0 && digitVal(ch) < base { + ch = s.next() + n-- + } + if n > 0 { + s.err("illegal char escape") + } + + // we scanned all digits, put the last non digit char back + s.unread() + return ch +} + +// scanIdentifier scans an identifier and returns the literal string +func (s *Scanner) scanIdentifier() string { + offs := s.srcPos.Offset - s.lastCharLen + ch := s.next() + for isLetter(ch) || isDigit(ch) || ch == '-' { + ch = s.next() + } + + if ch != eof { + s.unread() // we got identifier, put back latest char + } + + return string(s.src[offs:s.srcPos.Offset]) +} + +// recentPosition returns the position of the character immediately after the +// character or token returned by the last call to Scan. +func (s *Scanner) recentPosition() (pos token.Pos) { + pos.Offset = s.srcPos.Offset - s.lastCharLen + switch { + case s.srcPos.Column > 0: + // common case: last character was not a '\n' + pos.Line = s.srcPos.Line + pos.Column = s.srcPos.Column + case s.lastLineLen > 0: + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + pos.Line = s.srcPos.Line - 1 + pos.Column = s.lastLineLen + default: + // at the beginning of the source + pos.Line = 1 + pos.Column = 1 + } + return +} + +// err prints the error of any scanning to s.Error function. If the function is +// not defined, by default it prints them to os.Stderr +func (s *Scanner) err(msg string) { + s.ErrorCount++ + pos := s.recentPosition() + + if s.Error != nil { + s.Error(pos, msg) + return + } + + fmt.Fprintf(os.Stderr, "%s: %s\n", pos, msg) +} + +// isHexadecimal returns true if the given rune is a letter +func isLetter(ch rune) bool { + return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch) +} + +// isHexadecimal returns true if the given rune is a decimal digit +func isDigit(ch rune) bool { + return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch) +} + +// isHexadecimal returns true if the given rune is a decimal number +func isDecimal(ch rune) bool { + return '0' <= ch && ch <= '9' +} + +// isHexadecimal returns true if the given rune is an hexadecimal number +func isHexadecimal(ch rune) bool { + return '0' <= ch && ch <= '9' || 'a' <= ch && ch <= 'f' || 'A' <= ch && ch <= 'F' +} + +// isWhitespace returns true if the rune is a space, tab, newline or carriage return +func isWhitespace(ch rune) bool { + return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' +} + +// digitVal returns the integer value of a given octal,decimal or hexadecimal rune +func digitVal(ch rune) int { + switch { + case '0' <= ch && ch <= '9': + return int(ch - '0') + case 'a' <= ch && ch <= 'f': + return int(ch - 'a' + 10) + case 'A' <= ch && ch <= 'F': + return int(ch - 'A' + 10) + } + return 16 // larger than any legal digit val +} diff --git a/vendor/github.com/hashicorp/hcl/json/scanner/scanner_test.go b/vendor/github.com/hashicorp/hcl/json/scanner/scanner_test.go new file mode 100644 index 0000000000..fe2d75524d --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/scanner/scanner_test.go @@ -0,0 +1,363 @@ +package scanner + +import ( + "bytes" + "fmt" + "testing" + + "github.com/hashicorp/hcl/json/token" +) + +var f100 = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + +type tokenPair struct { + tok token.Type + text string +} + +var tokenLists = map[string][]tokenPair{ + "operator": []tokenPair{ + {token.LBRACK, "["}, + {token.LBRACE, "{"}, + {token.COMMA, ","}, + {token.PERIOD, "."}, + {token.RBRACK, "]"}, + {token.RBRACE, "}"}, + }, + "bool": []tokenPair{ + {token.BOOL, "true"}, + {token.BOOL, "false"}, + }, + "string": []tokenPair{ + {token.STRING, `" "`}, + {token.STRING, `"a"`}, + {token.STRING, `"本"`}, + {token.STRING, `"${file("foo")}"`}, + {token.STRING, `"${file(\"foo\")}"`}, + {token.STRING, `"\a"`}, + {token.STRING, `"\b"`}, + {token.STRING, `"\f"`}, + {token.STRING, `"\n"`}, + {token.STRING, `"\r"`}, + {token.STRING, `"\t"`}, + {token.STRING, `"\v"`}, + {token.STRING, `"\""`}, + {token.STRING, `"\000"`}, + {token.STRING, `"\777"`}, + {token.STRING, `"\x00"`}, + {token.STRING, `"\xff"`}, + {token.STRING, `"\u0000"`}, + {token.STRING, `"\ufA16"`}, + {token.STRING, `"\U00000000"`}, + {token.STRING, `"\U0000ffAB"`}, + {token.STRING, `"` + f100 + `"`}, + }, + "number": []tokenPair{ + {token.NUMBER, "0"}, + {token.NUMBER, "1"}, + {token.NUMBER, "9"}, + {token.NUMBER, "42"}, + {token.NUMBER, "1234567890"}, + {token.NUMBER, "-0"}, + {token.NUMBER, "-1"}, + {token.NUMBER, "-9"}, + {token.NUMBER, "-42"}, + {token.NUMBER, "-1234567890"}, + }, + "float": []tokenPair{ + {token.FLOAT, "0."}, + {token.FLOAT, "1."}, + {token.FLOAT, "42."}, + {token.FLOAT, "01234567890."}, + {token.FLOAT, ".0"}, + {token.FLOAT, ".1"}, + {token.FLOAT, ".42"}, + {token.FLOAT, ".0123456789"}, + {token.FLOAT, "0.0"}, + {token.FLOAT, "1.0"}, + {token.FLOAT, "42.0"}, + {token.FLOAT, "01234567890.0"}, + {token.FLOAT, "0e0"}, + {token.FLOAT, "1e0"}, + {token.FLOAT, "42e0"}, + {token.FLOAT, "01234567890e0"}, + {token.FLOAT, "0E0"}, + {token.FLOAT, "1E0"}, + {token.FLOAT, "42E0"}, + {token.FLOAT, "01234567890E0"}, + {token.FLOAT, "0e+10"}, + {token.FLOAT, "1e-10"}, + {token.FLOAT, "42e+10"}, + {token.FLOAT, "01234567890e-10"}, + {token.FLOAT, "0E+10"}, + {token.FLOAT, "1E-10"}, + {token.FLOAT, "42E+10"}, + {token.FLOAT, "01234567890E-10"}, + {token.FLOAT, "01.8e0"}, + {token.FLOAT, "1.4e0"}, + {token.FLOAT, "42.2e0"}, + {token.FLOAT, "01234567890.12e0"}, + {token.FLOAT, "0.E0"}, + {token.FLOAT, "1.12E0"}, + {token.FLOAT, "42.123E0"}, + {token.FLOAT, "01234567890.213E0"}, + {token.FLOAT, "0.2e+10"}, + {token.FLOAT, "1.2e-10"}, + {token.FLOAT, "42.54e+10"}, + {token.FLOAT, "01234567890.98e-10"}, + {token.FLOAT, "0.1E+10"}, + {token.FLOAT, "1.1E-10"}, + {token.FLOAT, "42.1E+10"}, + {token.FLOAT, "01234567890.1E-10"}, + {token.FLOAT, "-0.0"}, + {token.FLOAT, "-1.0"}, + {token.FLOAT, "-42.0"}, + {token.FLOAT, "-01234567890.0"}, + {token.FLOAT, "-0e0"}, + {token.FLOAT, "-1e0"}, + {token.FLOAT, "-42e0"}, + {token.FLOAT, "-01234567890e0"}, + {token.FLOAT, "-0E0"}, + {token.FLOAT, "-1E0"}, + {token.FLOAT, "-42E0"}, + {token.FLOAT, "-01234567890E0"}, + {token.FLOAT, "-0e+10"}, + {token.FLOAT, "-1e-10"}, + {token.FLOAT, "-42e+10"}, + {token.FLOAT, "-01234567890e-10"}, + {token.FLOAT, "-0E+10"}, + {token.FLOAT, "-1E-10"}, + {token.FLOAT, "-42E+10"}, + {token.FLOAT, "-01234567890E-10"}, + {token.FLOAT, "-01.8e0"}, + {token.FLOAT, "-1.4e0"}, + {token.FLOAT, "-42.2e0"}, + {token.FLOAT, "-01234567890.12e0"}, + {token.FLOAT, "-0.E0"}, + {token.FLOAT, "-1.12E0"}, + {token.FLOAT, "-42.123E0"}, + {token.FLOAT, "-01234567890.213E0"}, + {token.FLOAT, "-0.2e+10"}, + {token.FLOAT, "-1.2e-10"}, + {token.FLOAT, "-42.54e+10"}, + {token.FLOAT, "-01234567890.98e-10"}, + {token.FLOAT, "-0.1E+10"}, + {token.FLOAT, "-1.1E-10"}, + {token.FLOAT, "-42.1E+10"}, + {token.FLOAT, "-01234567890.1E-10"}, + }, +} + +var orderedTokenLists = []string{ + "comment", + "operator", + "bool", + "string", + "number", + "float", +} + +func TestPosition(t *testing.T) { + // create artifical source code + buf := new(bytes.Buffer) + + for _, listName := range orderedTokenLists { + for _, ident := range tokenLists[listName] { + fmt.Fprintf(buf, "\t\t\t\t%s\n", ident.text) + } + } + + s := New(buf.Bytes()) + + pos := token.Pos{"", 4, 1, 5} + s.Scan() + for _, listName := range orderedTokenLists { + + for _, k := range tokenLists[listName] { + curPos := s.tokPos + // fmt.Printf("[%q] s = %+v:%+v\n", k.text, curPos.Offset, curPos.Column) + + if curPos.Offset != pos.Offset { + t.Fatalf("offset = %d, want %d for %q", curPos.Offset, pos.Offset, k.text) + } + if curPos.Line != pos.Line { + t.Fatalf("line = %d, want %d for %q", curPos.Line, pos.Line, k.text) + } + if curPos.Column != pos.Column { + t.Fatalf("column = %d, want %d for %q", curPos.Column, pos.Column, k.text) + } + pos.Offset += 4 + len(k.text) + 1 // 4 tabs + token bytes + newline + pos.Line += countNewlines(k.text) + 1 // each token is on a new line + + s.Error = func(pos token.Pos, msg string) { + t.Errorf("error %q for %q", msg, k.text) + } + + s.Scan() + } + } + // make sure there were no token-internal errors reported by scanner + if s.ErrorCount != 0 { + t.Errorf("%d errors", s.ErrorCount) + } +} + +func TestComment(t *testing.T) { + testTokenList(t, tokenLists["comment"]) +} + +func TestOperator(t *testing.T) { + testTokenList(t, tokenLists["operator"]) +} + +func TestBool(t *testing.T) { + testTokenList(t, tokenLists["bool"]) +} + +func TestIdent(t *testing.T) { + testTokenList(t, tokenLists["ident"]) +} + +func TestString(t *testing.T) { + testTokenList(t, tokenLists["string"]) +} + +func TestNumber(t *testing.T) { + testTokenList(t, tokenLists["number"]) +} + +func TestFloat(t *testing.T) { + testTokenList(t, tokenLists["float"]) +} + +func TestRealExample(t *testing.T) { + complexReal := ` +{ + "variable": { + "foo": { + "default": "bar", + "description": "bar", + "depends_on": ["something"] + } + } +}` + + literals := []struct { + tokenType token.Type + literal string + }{ + {token.LBRACE, `{`}, + {token.STRING, `"variable"`}, + {token.COLON, `:`}, + {token.LBRACE, `{`}, + {token.STRING, `"foo"`}, + {token.COLON, `:`}, + {token.LBRACE, `{`}, + {token.STRING, `"default"`}, + {token.COLON, `:`}, + {token.STRING, `"bar"`}, + {token.COMMA, `,`}, + {token.STRING, `"description"`}, + {token.COLON, `:`}, + {token.STRING, `"bar"`}, + {token.COMMA, `,`}, + {token.STRING, `"depends_on"`}, + {token.COLON, `:`}, + {token.LBRACK, `[`}, + {token.STRING, `"something"`}, + {token.RBRACK, `]`}, + {token.RBRACE, `}`}, + {token.RBRACE, `}`}, + {token.RBRACE, `}`}, + {token.EOF, ``}, + } + + s := New([]byte(complexReal)) + for _, l := range literals { + tok := s.Scan() + if l.tokenType != tok.Type { + t.Errorf("got: %s want %s for %s\n", tok, l.tokenType, tok.String()) + } + + if l.literal != tok.Text { + t.Errorf("got: %s want %s\n", tok, l.literal) + } + } + +} + +func TestError(t *testing.T) { + testError(t, "\x80", "1:1", "illegal UTF-8 encoding", token.ILLEGAL) + testError(t, "\xff", "1:1", "illegal UTF-8 encoding", token.ILLEGAL) + + testError(t, `"ab`+"\x80", "1:4", "illegal UTF-8 encoding", token.STRING) + testError(t, `"abc`+"\xff", "1:5", "illegal UTF-8 encoding", token.STRING) + + testError(t, `01238`, "1:7", "numbers cannot start with 0", token.NUMBER) + testError(t, `01238123`, "1:10", "numbers cannot start with 0", token.NUMBER) + testError(t, `'aa'`, "1:1", "illegal char: '", token.ILLEGAL) + + testError(t, `"`, "1:2", "literal not terminated", token.STRING) + testError(t, `"abc`, "1:5", "literal not terminated", token.STRING) + testError(t, `"abc`+"\n", "1:5", "literal not terminated", token.STRING) +} + +func testError(t *testing.T, src, pos, msg string, tok token.Type) { + s := New([]byte(src)) + + errorCalled := false + s.Error = func(p token.Pos, m string) { + if !errorCalled { + if pos != p.String() { + t.Errorf("pos = %q, want %q for %q", p, pos, src) + } + + if m != msg { + t.Errorf("msg = %q, want %q for %q", m, msg, src) + } + errorCalled = true + } + } + + tk := s.Scan() + if tk.Type != tok { + t.Errorf("tok = %s, want %s for %q", tk, tok, src) + } + if !errorCalled { + t.Errorf("error handler not called for %q", src) + } + if s.ErrorCount == 0 { + t.Errorf("count = %d, want > 0 for %q", s.ErrorCount, src) + } +} + +func testTokenList(t *testing.T, tokenList []tokenPair) { + // create artifical source code + buf := new(bytes.Buffer) + for _, ident := range tokenList { + fmt.Fprintf(buf, "%s\n", ident.text) + } + + s := New(buf.Bytes()) + for _, ident := range tokenList { + tok := s.Scan() + if tok.Type != ident.tok { + t.Errorf("tok = %q want %q for %q\n", tok, ident.tok, ident.text) + } + + if tok.Text != ident.text { + t.Errorf("text = %q want %q", tok.String(), ident.text) + } + + } +} + +func countNewlines(s string) int { + n := 0 + for _, ch := range s { + if ch == '\n' { + n++ + } + } + return n +} diff --git a/vendor/github.com/hashicorp/hcl/json/test-fixtures/array.json b/vendor/github.com/hashicorp/hcl/json/test-fixtures/array.json new file mode 100644 index 0000000000..e320f17ab2 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/test-fixtures/array.json @@ -0,0 +1,4 @@ +{ + "foo": [1, 2, "bar"], + "bar": "baz" +} diff --git a/vendor/github.com/hashicorp/hcl/json/test-fixtures/basic.json b/vendor/github.com/hashicorp/hcl/json/test-fixtures/basic.json new file mode 100644 index 0000000000..b54bde96c1 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/test-fixtures/basic.json @@ -0,0 +1,3 @@ +{ + "foo": "bar" +} diff --git a/vendor/github.com/hashicorp/hcl/json/test-fixtures/object.json b/vendor/github.com/hashicorp/hcl/json/test-fixtures/object.json new file mode 100644 index 0000000000..72168a3ccb --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/test-fixtures/object.json @@ -0,0 +1,5 @@ +{ + "foo": { + "bar": [1,2] + } +} diff --git a/vendor/github.com/hashicorp/hcl/json/test-fixtures/types.json b/vendor/github.com/hashicorp/hcl/json/test-fixtures/types.json new file mode 100644 index 0000000000..9a142a6ca6 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/test-fixtures/types.json @@ -0,0 +1,10 @@ +{ + "foo": "bar", + "bar": 7, + "baz": [1,2,3], + "foo": -12, + "bar": 3.14159, + "foo": true, + "bar": false, + "foo": null +} diff --git a/vendor/github.com/hashicorp/hcl/json/token/position.go b/vendor/github.com/hashicorp/hcl/json/token/position.go new file mode 100644 index 0000000000..59c1bb72d4 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/token/position.go @@ -0,0 +1,46 @@ +package token + +import "fmt" + +// Pos describes an arbitrary source position +// including the file, line, and column location. +// A Position is valid if the line number is > 0. +type Pos struct { + Filename string // filename, if any + Offset int // offset, starting at 0 + Line int // line number, starting at 1 + Column int // column number, starting at 1 (character count) +} + +// IsValid returns true if the position is valid. +func (p *Pos) IsValid() bool { return p.Line > 0 } + +// String returns a string in one of several forms: +// +// file:line:column valid position with file name +// line:column valid position without file name +// file invalid position with file name +// - invalid position without file name +func (p Pos) String() string { + s := p.Filename + if p.IsValid() { + if s != "" { + s += ":" + } + s += fmt.Sprintf("%d:%d", p.Line, p.Column) + } + if s == "" { + s = "-" + } + return s +} + +// Before reports whether the position p is before u. +func (p Pos) Before(u Pos) bool { + return u.Offset > p.Offset || u.Line > p.Line +} + +// After reports whether the position p is after u. +func (p Pos) After(u Pos) bool { + return u.Offset < p.Offset || u.Line < p.Line +} diff --git a/vendor/github.com/hashicorp/hcl/json/token/token.go b/vendor/github.com/hashicorp/hcl/json/token/token.go new file mode 100644 index 0000000000..95a0c3eee6 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/token/token.go @@ -0,0 +1,118 @@ +package token + +import ( + "fmt" + "strconv" + + hcltoken "github.com/hashicorp/hcl/hcl/token" +) + +// Token defines a single HCL token which can be obtained via the Scanner +type Token struct { + Type Type + Pos Pos + Text string +} + +// Type is the set of lexical tokens of the HCL (HashiCorp Configuration Language) +type Type int + +const ( + // Special tokens + ILLEGAL Type = iota + EOF + + identifier_beg + literal_beg + NUMBER // 12345 + FLOAT // 123.45 + BOOL // true,false + STRING // "abc" + NULL // null + literal_end + identifier_end + + operator_beg + LBRACK // [ + LBRACE // { + COMMA // , + PERIOD // . + COLON // : + + RBRACK // ] + RBRACE // } + + operator_end +) + +var tokens = [...]string{ + ILLEGAL: "ILLEGAL", + + EOF: "EOF", + + NUMBER: "NUMBER", + FLOAT: "FLOAT", + BOOL: "BOOL", + STRING: "STRING", + NULL: "NULL", + + LBRACK: "LBRACK", + LBRACE: "LBRACE", + COMMA: "COMMA", + PERIOD: "PERIOD", + COLON: "COLON", + + RBRACK: "RBRACK", + RBRACE: "RBRACE", +} + +// String returns the string corresponding to the token tok. +func (t Type) String() string { + s := "" + if 0 <= t && t < Type(len(tokens)) { + s = tokens[t] + } + if s == "" { + s = "token(" + strconv.Itoa(int(t)) + ")" + } + return s +} + +// IsIdentifier returns true for tokens corresponding to identifiers and basic +// type literals; it returns false otherwise. +func (t Type) IsIdentifier() bool { return identifier_beg < t && t < identifier_end } + +// IsLiteral returns true for tokens corresponding to basic type literals; it +// returns false otherwise. +func (t Type) IsLiteral() bool { return literal_beg < t && t < literal_end } + +// IsOperator returns true for tokens corresponding to operators and +// delimiters; it returns false otherwise. +func (t Type) IsOperator() bool { return operator_beg < t && t < operator_end } + +// String returns the token's literal text. Note that this is only +// applicable for certain token types, such as token.IDENT, +// token.STRING, etc.. +func (t Token) String() string { + return fmt.Sprintf("%s %s %s", t.Pos.String(), t.Type.String(), t.Text) +} + +// HCLToken converts this token to an HCL token. +// +// The token type must be a literal type or this will panic. +func (t Token) HCLToken() hcltoken.Token { + switch t.Type { + case BOOL: + return hcltoken.Token{Type: hcltoken.BOOL, Text: t.Text} + case FLOAT: + return hcltoken.Token{Type: hcltoken.FLOAT, Text: t.Text} + case NULL: + return hcltoken.Token{Type: hcltoken.STRING, Text: ""} + case NUMBER: + return hcltoken.Token{Type: hcltoken.NUMBER, Text: t.Text} + case STRING: + return hcltoken.Token{Type: hcltoken.STRING, Text: t.Text, JSON: true} + default: + panic(fmt.Sprintf("unimplemented HCLToken for type: %s", t.Type)) + } +} diff --git a/vendor/github.com/hashicorp/hcl/json/token/token_test.go b/vendor/github.com/hashicorp/hcl/json/token/token_test.go new file mode 100644 index 0000000000..a83fdd55bb --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/token/token_test.go @@ -0,0 +1,34 @@ +package token + +import ( + "testing" +) + +func TestTypeString(t *testing.T) { + var tokens = []struct { + tt Type + str string + }{ + {ILLEGAL, "ILLEGAL"}, + {EOF, "EOF"}, + {NUMBER, "NUMBER"}, + {FLOAT, "FLOAT"}, + {BOOL, "BOOL"}, + {STRING, "STRING"}, + {NULL, "NULL"}, + {LBRACK, "LBRACK"}, + {LBRACE, "LBRACE"}, + {COMMA, "COMMA"}, + {PERIOD, "PERIOD"}, + {RBRACK, "RBRACK"}, + {RBRACE, "RBRACE"}, + } + + for _, token := range tokens { + if token.tt.String() != token.str { + t.Errorf("want: %q got:%q\n", token.str, token.tt) + + } + } + +} diff --git a/vendor/github.com/hashicorp/hcl/lex.go b/vendor/github.com/hashicorp/hcl/lex.go new file mode 100644 index 0000000000..d9993c2928 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/lex.go @@ -0,0 +1,38 @@ +package hcl + +import ( + "unicode" + "unicode/utf8" +) + +type lexModeValue byte + +const ( + lexModeUnknown lexModeValue = iota + lexModeHcl + lexModeJson +) + +// lexMode returns whether we're going to be parsing in JSON +// mode or HCL mode. +func lexMode(v []byte) lexModeValue { + var ( + r rune + w int + offset int + ) + + for { + r, w = utf8.DecodeRune(v[offset:]) + offset += w + if unicode.IsSpace(r) { + continue + } + if r == '{' { + return lexModeJson + } + break + } + + return lexModeHcl +} diff --git a/vendor/github.com/hashicorp/hcl/lex_test.go b/vendor/github.com/hashicorp/hcl/lex_test.go new file mode 100644 index 0000000000..8062764446 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/lex_test.go @@ -0,0 +1,37 @@ +package hcl + +import ( + "testing" +) + +func TestLexMode(t *testing.T) { + cases := []struct { + Input string + Mode lexModeValue + }{ + { + "", + lexModeHcl, + }, + { + "foo", + lexModeHcl, + }, + { + "{}", + lexModeJson, + }, + { + " {}", + lexModeJson, + }, + } + + for i, tc := range cases { + actual := lexMode([]byte(tc.Input)) + + if actual != tc.Mode { + t.Fatalf("%d: %#v", i, actual) + } + } +} diff --git a/vendor/github.com/hashicorp/hcl/parse.go b/vendor/github.com/hashicorp/hcl/parse.go new file mode 100644 index 0000000000..1fca53c4ce --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/parse.go @@ -0,0 +1,39 @@ +package hcl + +import ( + "fmt" + + "github.com/hashicorp/hcl/hcl/ast" + hclParser "github.com/hashicorp/hcl/hcl/parser" + jsonParser "github.com/hashicorp/hcl/json/parser" +) + +// ParseBytes accepts as input byte slice and returns ast tree. +// +// Input can be either JSON or HCL +func ParseBytes(in []byte) (*ast.File, error) { + return parse(in) +} + +// ParseString accepts input as a string and returns ast tree. +func ParseString(input string) (*ast.File, error) { + return parse([]byte(input)) +} + +func parse(in []byte) (*ast.File, error) { + switch lexMode(in) { + case lexModeHcl: + return hclParser.Parse(in) + case lexModeJson: + return jsonParser.Parse(in) + } + + return nil, fmt.Errorf("unknown config format") +} + +// Parse parses the given input and returns the root object. +// +// The input format can be either HCL or JSON. +func Parse(input string) (*ast.File, error) { + return parse([]byte(input)) +} diff --git a/vendor/github.com/hashicorp/hcl/test-fixtures/basic.hcl b/vendor/github.com/hashicorp/hcl/test-fixtures/basic.hcl new file mode 100644 index 0000000000..9499944872 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/test-fixtures/basic.hcl @@ -0,0 +1,2 @@ +foo = "bar" +bar = "${file("bing/bong.txt")}" diff --git a/vendor/github.com/hashicorp/hcl/test-fixtures/basic.json b/vendor/github.com/hashicorp/hcl/test-fixtures/basic.json new file mode 100644 index 0000000000..7bdddc84b0 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/test-fixtures/basic.json @@ -0,0 +1,4 @@ +{ + "foo": "bar", + "bar": "${file(\"bing/bong.txt\")}" +} diff --git a/vendor/github.com/hashicorp/hcl/test-fixtures/basic_int_string.hcl b/vendor/github.com/hashicorp/hcl/test-fixtures/basic_int_string.hcl new file mode 100644 index 0000000000..4e415da20e --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/test-fixtures/basic_int_string.hcl @@ -0,0 +1 @@ +count = "3" diff --git a/vendor/github.com/hashicorp/hcl/test-fixtures/basic_squish.hcl b/vendor/github.com/hashicorp/hcl/test-fixtures/basic_squish.hcl new file mode 100644 index 0000000000..363697b496 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/test-fixtures/basic_squish.hcl @@ -0,0 +1,3 @@ +foo="bar" +bar="${file("bing/bong.txt")}" +foo-bar="baz" diff --git a/vendor/github.com/hashicorp/hcl/test-fixtures/decode_policy.hcl b/vendor/github.com/hashicorp/hcl/test-fixtures/decode_policy.hcl new file mode 100644 index 0000000000..5b185cc918 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/test-fixtures/decode_policy.hcl @@ -0,0 +1,15 @@ +key "" { + policy = "read" +} + +key "foo/" { + policy = "write" +} + +key "foo/bar/" { + policy = "read" +} + +key "foo/bar/baz" { + policy = "deny" +} diff --git a/vendor/github.com/hashicorp/hcl/test-fixtures/decode_policy.json b/vendor/github.com/hashicorp/hcl/test-fixtures/decode_policy.json new file mode 100644 index 0000000000..151864ee89 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/test-fixtures/decode_policy.json @@ -0,0 +1,19 @@ +{ + "key": { + "": { + "policy": "read" + }, + + "foo/": { + "policy": "write" + }, + + "foo/bar/": { + "policy": "read" + }, + + "foo/bar/baz": { + "policy": "deny" + } + } +} diff --git a/vendor/github.com/hashicorp/hcl/test-fixtures/decode_tf_variable.hcl b/vendor/github.com/hashicorp/hcl/test-fixtures/decode_tf_variable.hcl new file mode 100644 index 0000000000..52dcaa1bc3 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/test-fixtures/decode_tf_variable.hcl @@ -0,0 +1,10 @@ +variable "foo" { + default = "bar" + description = "bar" +} + +variable "amis" { + default = { + east = "foo" + } +} diff --git a/vendor/github.com/hashicorp/hcl/test-fixtures/decode_tf_variable.json b/vendor/github.com/hashicorp/hcl/test-fixtures/decode_tf_variable.json new file mode 100644 index 0000000000..49f921ed0b --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/test-fixtures/decode_tf_variable.json @@ -0,0 +1,14 @@ +{ + "variable": { + "foo": { + "default": "bar", + "description": "bar" + }, + + "amis": { + "default": { + "east": "foo" + } + } + } +} diff --git a/vendor/github.com/hashicorp/hcl/test-fixtures/empty.hcl b/vendor/github.com/hashicorp/hcl/test-fixtures/empty.hcl new file mode 100644 index 0000000000..5be1b23154 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/test-fixtures/empty.hcl @@ -0,0 +1 @@ +resource "foo" {} diff --git a/vendor/github.com/hashicorp/hcl/test-fixtures/escape.hcl b/vendor/github.com/hashicorp/hcl/test-fixtures/escape.hcl new file mode 100644 index 0000000000..ead1b8b99e --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/test-fixtures/escape.hcl @@ -0,0 +1 @@ +foo = "bar\"baz\\n" diff --git a/vendor/github.com/hashicorp/hcl/test-fixtures/flat.hcl b/vendor/github.com/hashicorp/hcl/test-fixtures/flat.hcl new file mode 100644 index 0000000000..9bca551f89 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/test-fixtures/flat.hcl @@ -0,0 +1,2 @@ +foo = "bar" +Key = 7 diff --git a/vendor/github.com/hashicorp/hcl/test-fixtures/float.hcl b/vendor/github.com/hashicorp/hcl/test-fixtures/float.hcl new file mode 100644 index 0000000000..eed44e5420 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/test-fixtures/float.hcl @@ -0,0 +1 @@ +a = 1.02 diff --git a/vendor/github.com/hashicorp/hcl/test-fixtures/float.json b/vendor/github.com/hashicorp/hcl/test-fixtures/float.json new file mode 100644 index 0000000000..a9d1ab4b02 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/test-fixtures/float.json @@ -0,0 +1,3 @@ +{ + "a": 1.02 +} diff --git a/vendor/github.com/hashicorp/hcl/test-fixtures/interpolate_escape.hcl b/vendor/github.com/hashicorp/hcl/test-fixtures/interpolate_escape.hcl new file mode 100644 index 0000000000..7b95391387 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/test-fixtures/interpolate_escape.hcl @@ -0,0 +1 @@ +foo="${file(\"bing/bong.txt\")}" diff --git a/vendor/github.com/hashicorp/hcl/test-fixtures/multiline.hcl b/vendor/github.com/hashicorp/hcl/test-fixtures/multiline.hcl new file mode 100644 index 0000000000..f883bd707b --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/test-fixtures/multiline.hcl @@ -0,0 +1,4 @@ +foo = < []}`}}, +} + +func TestDiff(t *testing.T) { + for _, tt := range diffs { + got := Diff(tt.a, tt.b) + eq := len(got) == len(tt.exp) + if eq { + for i := range got { + eq = eq && got[i] == tt.exp[i] + } + } + if !eq { + t.Errorf("diffing % #v", tt.a) + t.Errorf("with % #v", tt.b) + diffdiff(t, got, tt.exp) + continue + } + } +} + +func diffdiff(t *testing.T, got, exp []string) { + minus(t, "unexpected:", got, exp) + minus(t, "missing:", exp, got) +} + +func minus(t *testing.T, s string, a, b []string) { + var i, j int + for i = 0; i < len(a); i++ { + for j = 0; j < len(b); j++ { + if a[i] == b[j] { + break + } + } + if j == len(b) { + t.Error(s, a[i]) + } + } +} diff --git a/vendor/github.com/kr/pretty/example_test.go b/vendor/github.com/kr/pretty/example_test.go new file mode 100644 index 0000000000..ecf40f3fcc --- /dev/null +++ b/vendor/github.com/kr/pretty/example_test.go @@ -0,0 +1,20 @@ +package pretty_test + +import ( + "fmt" + "github.com/kr/pretty" +) + +func Example() { + type myType struct { + a, b int + } + var x = []myType{{1, 2}, {3, 4}, {5, 6}} + fmt.Printf("%# v", pretty.Formatter(x)) + // output: + // []pretty_test.myType{ + // {a:1, b:2}, + // {a:3, b:4}, + // {a:5, b:6}, + // } +} diff --git a/vendor/github.com/kr/pretty/formatter.go b/vendor/github.com/kr/pretty/formatter.go new file mode 100644 index 0000000000..8dacda25fa --- /dev/null +++ b/vendor/github.com/kr/pretty/formatter.go @@ -0,0 +1,337 @@ +package pretty + +import ( + "fmt" + "io" + "reflect" + "strconv" + "text/tabwriter" + + "github.com/kr/text" +) + +const ( + limit = 50 +) + +type formatter struct { + x interface{} + force bool + quote bool +} + +// Formatter makes a wrapper, f, that will format x as go source with line +// breaks and tabs. Object f responds to the "%v" formatting verb when both the +// "#" and " " (space) flags are set, for example: +// +// fmt.Sprintf("%# v", Formatter(x)) +// +// If one of these two flags is not set, or any other verb is used, f will +// format x according to the usual rules of package fmt. +// In particular, if x satisfies fmt.Formatter, then x.Format will be called. +func Formatter(x interface{}) (f fmt.Formatter) { + return formatter{x: x, quote: true} +} + +func (fo formatter) String() string { + return fmt.Sprint(fo.x) // unwrap it +} + +func (fo formatter) passThrough(f fmt.State, c rune) { + s := "%" + for i := 0; i < 128; i++ { + if f.Flag(i) { + s += string(i) + } + } + if w, ok := f.Width(); ok { + s += fmt.Sprintf("%d", w) + } + if p, ok := f.Precision(); ok { + s += fmt.Sprintf(".%d", p) + } + s += string(c) + fmt.Fprintf(f, s, fo.x) +} + +func (fo formatter) Format(f fmt.State, c rune) { + if fo.force || c == 'v' && f.Flag('#') && f.Flag(' ') { + w := tabwriter.NewWriter(f, 4, 4, 1, ' ', 0) + p := &printer{tw: w, Writer: w, visited: make(map[visit]int)} + p.printValue(reflect.ValueOf(fo.x), true, fo.quote) + w.Flush() + return + } + fo.passThrough(f, c) +} + +type printer struct { + io.Writer + tw *tabwriter.Writer + visited map[visit]int + depth int +} + +func (p *printer) indent() *printer { + q := *p + q.tw = tabwriter.NewWriter(p.Writer, 4, 4, 1, ' ', 0) + q.Writer = text.NewIndentWriter(q.tw, []byte{'\t'}) + return &q +} + +func (p *printer) printInline(v reflect.Value, x interface{}, showType bool) { + if showType { + io.WriteString(p, v.Type().String()) + fmt.Fprintf(p, "(%#v)", x) + } else { + fmt.Fprintf(p, "%#v", x) + } +} + +// printValue must keep track of already-printed pointer values to avoid +// infinite recursion. +type visit struct { + v uintptr + typ reflect.Type +} + +func (p *printer) printValue(v reflect.Value, showType, quote bool) { + if p.depth > 10 { + io.WriteString(p, "!%v(DEPTH EXCEEDED)") + return + } + + switch v.Kind() { + case reflect.Bool: + p.printInline(v, v.Bool(), showType) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + p.printInline(v, v.Int(), showType) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + p.printInline(v, v.Uint(), showType) + case reflect.Float32, reflect.Float64: + p.printInline(v, v.Float(), showType) + case reflect.Complex64, reflect.Complex128: + fmt.Fprintf(p, "%#v", v.Complex()) + case reflect.String: + p.fmtString(v.String(), quote) + case reflect.Map: + t := v.Type() + if showType { + io.WriteString(p, t.String()) + } + writeByte(p, '{') + if nonzero(v) { + expand := !canInline(v.Type()) + pp := p + if expand { + writeByte(p, '\n') + pp = p.indent() + } + keys := v.MapKeys() + for i := 0; i < v.Len(); i++ { + showTypeInStruct := true + k := keys[i] + mv := v.MapIndex(k) + pp.printValue(k, false, true) + writeByte(pp, ':') + if expand { + writeByte(pp, '\t') + } + showTypeInStruct = t.Elem().Kind() == reflect.Interface + pp.printValue(mv, showTypeInStruct, true) + if expand { + io.WriteString(pp, ",\n") + } else if i < v.Len()-1 { + io.WriteString(pp, ", ") + } + } + if expand { + pp.tw.Flush() + } + } + writeByte(p, '}') + case reflect.Struct: + t := v.Type() + if v.CanAddr() { + addr := v.UnsafeAddr() + vis := visit{addr, t} + if vd, ok := p.visited[vis]; ok && vd < p.depth { + p.fmtString(t.String()+"{(CYCLIC REFERENCE)}", false) + break // don't print v again + } + p.visited[vis] = p.depth + } + + if showType { + io.WriteString(p, t.String()) + } + writeByte(p, '{') + if nonzero(v) { + expand := !canInline(v.Type()) + pp := p + if expand { + writeByte(p, '\n') + pp = p.indent() + } + for i := 0; i < v.NumField(); i++ { + showTypeInStruct := true + if f := t.Field(i); f.Name != "" { + io.WriteString(pp, f.Name) + writeByte(pp, ':') + if expand { + writeByte(pp, '\t') + } + showTypeInStruct = labelType(f.Type) + } + pp.printValue(getField(v, i), showTypeInStruct, true) + if expand { + io.WriteString(pp, ",\n") + } else if i < v.NumField()-1 { + io.WriteString(pp, ", ") + } + } + if expand { + pp.tw.Flush() + } + } + writeByte(p, '}') + case reflect.Interface: + switch e := v.Elem(); { + case e.Kind() == reflect.Invalid: + io.WriteString(p, "nil") + case e.IsValid(): + pp := *p + pp.depth++ + pp.printValue(e, showType, true) + default: + io.WriteString(p, v.Type().String()) + io.WriteString(p, "(nil)") + } + case reflect.Array, reflect.Slice: + t := v.Type() + if showType { + io.WriteString(p, t.String()) + } + if v.Kind() == reflect.Slice && v.IsNil() && showType { + io.WriteString(p, "(nil)") + break + } + if v.Kind() == reflect.Slice && v.IsNil() { + io.WriteString(p, "nil") + break + } + writeByte(p, '{') + expand := !canInline(v.Type()) + pp := p + if expand { + writeByte(p, '\n') + pp = p.indent() + } + for i := 0; i < v.Len(); i++ { + showTypeInSlice := t.Elem().Kind() == reflect.Interface + pp.printValue(v.Index(i), showTypeInSlice, true) + if expand { + io.WriteString(pp, ",\n") + } else if i < v.Len()-1 { + io.WriteString(pp, ", ") + } + } + if expand { + pp.tw.Flush() + } + writeByte(p, '}') + case reflect.Ptr: + e := v.Elem() + if !e.IsValid() { + writeByte(p, '(') + io.WriteString(p, v.Type().String()) + io.WriteString(p, ")(nil)") + } else { + pp := *p + pp.depth++ + writeByte(pp, '&') + pp.printValue(e, true, true) + } + case reflect.Chan: + x := v.Pointer() + if showType { + writeByte(p, '(') + io.WriteString(p, v.Type().String()) + fmt.Fprintf(p, ")(%#v)", x) + } else { + fmt.Fprintf(p, "%#v", x) + } + case reflect.Func: + io.WriteString(p, v.Type().String()) + io.WriteString(p, " {...}") + case reflect.UnsafePointer: + p.printInline(v, v.Pointer(), showType) + case reflect.Invalid: + io.WriteString(p, "nil") + } +} + +func canInline(t reflect.Type) bool { + switch t.Kind() { + case reflect.Map: + return !canExpand(t.Elem()) + case reflect.Struct: + for i := 0; i < t.NumField(); i++ { + if canExpand(t.Field(i).Type) { + return false + } + } + return true + case reflect.Interface: + return false + case reflect.Array, reflect.Slice: + return !canExpand(t.Elem()) + case reflect.Ptr: + return false + case reflect.Chan, reflect.Func, reflect.UnsafePointer: + return false + } + return true +} + +func canExpand(t reflect.Type) bool { + switch t.Kind() { + case reflect.Map, reflect.Struct, + reflect.Interface, reflect.Array, reflect.Slice, + reflect.Ptr: + return true + } + return false +} + +func labelType(t reflect.Type) bool { + switch t.Kind() { + case reflect.Interface, reflect.Struct: + return true + } + return false +} + +func (p *printer) fmtString(s string, quote bool) { + if quote { + s = strconv.Quote(s) + } + io.WriteString(p, s) +} + +func tryDeepEqual(a, b interface{}) bool { + defer func() { recover() }() + return reflect.DeepEqual(a, b) +} + +func writeByte(w io.Writer, b byte) { + w.Write([]byte{b}) +} + +func getField(v reflect.Value, i int) reflect.Value { + val := v.Field(i) + if val.Kind() == reflect.Interface && !val.IsNil() { + val = val.Elem() + } + return val +} diff --git a/vendor/github.com/kr/pretty/formatter_test.go b/vendor/github.com/kr/pretty/formatter_test.go new file mode 100644 index 0000000000..5f3204e8e8 --- /dev/null +++ b/vendor/github.com/kr/pretty/formatter_test.go @@ -0,0 +1,261 @@ +package pretty + +import ( + "fmt" + "io" + "strings" + "testing" + "unsafe" +) + +type test struct { + v interface{} + s string +} + +type LongStructTypeName struct { + longFieldName interface{} + otherLongFieldName interface{} +} + +type SA struct { + t *T + v T +} + +type T struct { + x, y int +} + +type F int + +func (f F) Format(s fmt.State, c rune) { + fmt.Fprintf(s, "F(%d)", int(f)) +} + +var long = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + +var gosyntax = []test{ + {nil, `nil`}, + {"", `""`}, + {"a", `"a"`}, + {1, "int(1)"}, + {1.0, "float64(1)"}, + {[]int(nil), "[]int(nil)"}, + {[0]int{}, "[0]int{}"}, + {complex(1, 0), "(1+0i)"}, + //{make(chan int), "(chan int)(0x1234)"}, + {unsafe.Pointer(uintptr(unsafe.Pointer(&long))), fmt.Sprintf("unsafe.Pointer(0x%02x)", uintptr(unsafe.Pointer(&long)))}, + {func(int) {}, "func(int) {...}"}, + {map[int]int{1: 1}, "map[int]int{1:1}"}, + {int32(1), "int32(1)"}, + {io.EOF, `&errors.errorString{s:"EOF"}`}, + {[]string{"a"}, `[]string{"a"}`}, + { + []string{long}, + `[]string{"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"}`, + }, + {F(5), "pretty.F(5)"}, + { + SA{&T{1, 2}, T{3, 4}}, + `pretty.SA{ + t: &pretty.T{x:1, y:2}, + v: pretty.T{x:3, y:4}, +}`, + }, + { + map[int][]byte{1: {}}, + `map[int][]uint8{ + 1: {}, +}`, + }, + { + map[int]T{1: {}}, + `map[int]pretty.T{ + 1: {}, +}`, + }, + { + long, + `"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"`, + }, + { + LongStructTypeName{ + longFieldName: LongStructTypeName{}, + otherLongFieldName: long, + }, + `pretty.LongStructTypeName{ + longFieldName: pretty.LongStructTypeName{}, + otherLongFieldName: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", +}`, + }, + { + &LongStructTypeName{ + longFieldName: &LongStructTypeName{}, + otherLongFieldName: (*LongStructTypeName)(nil), + }, + `&pretty.LongStructTypeName{ + longFieldName: &pretty.LongStructTypeName{}, + otherLongFieldName: (*pretty.LongStructTypeName)(nil), +}`, + }, + { + []LongStructTypeName{ + {nil, nil}, + {3, 3}, + {long, nil}, + }, + `[]pretty.LongStructTypeName{ + {}, + { + longFieldName: int(3), + otherLongFieldName: int(3), + }, + { + longFieldName: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", + otherLongFieldName: nil, + }, +}`, + }, + { + []interface{}{ + LongStructTypeName{nil, nil}, + []byte{1, 2, 3}, + T{3, 4}, + LongStructTypeName{long, nil}, + }, + `[]interface {}{ + pretty.LongStructTypeName{}, + []uint8{0x1, 0x2, 0x3}, + pretty.T{x:3, y:4}, + pretty.LongStructTypeName{ + longFieldName: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", + otherLongFieldName: nil, + }, +}`, + }, +} + +func TestGoSyntax(t *testing.T) { + for _, tt := range gosyntax { + s := fmt.Sprintf("%# v", Formatter(tt.v)) + if tt.s != s { + t.Errorf("expected %q", tt.s) + t.Errorf("got %q", s) + t.Errorf("expraw\n%s", tt.s) + t.Errorf("gotraw\n%s", s) + } + } +} + +type I struct { + i int + R interface{} +} + +func (i *I) I() *I { return i.R.(*I) } + +func TestCycle(t *testing.T) { + type A struct{ *A } + v := &A{} + v.A = v + + // panics from stack overflow without cycle detection + t.Logf("Example cycle:\n%# v", Formatter(v)) + + p := &A{} + s := fmt.Sprintf("%# v", Formatter([]*A{p, p})) + if strings.Contains(s, "CYCLIC") { + t.Errorf("Repeated address detected as cyclic reference:\n%s", s) + } + + type R struct { + i int + *R + } + r := &R{ + i: 1, + R: &R{ + i: 2, + R: &R{ + i: 3, + }, + }, + } + r.R.R.R = r + t.Logf("Example longer cycle:\n%# v", Formatter(r)) + + r = &R{ + i: 1, + R: &R{ + i: 2, + R: &R{ + i: 3, + R: &R{ + i: 4, + R: &R{ + i: 5, + R: &R{ + i: 6, + R: &R{ + i: 7, + R: &R{ + i: 8, + R: &R{ + i: 9, + R: &R{ + i: 10, + R: &R{ + i: 11, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + } + // here be pirates + r.R.R.R.R.R.R.R.R.R.R.R = r + t.Logf("Example very long cycle:\n%# v", Formatter(r)) + + i := &I{ + i: 1, + R: &I{ + i: 2, + R: &I{ + i: 3, + R: &I{ + i: 4, + R: &I{ + i: 5, + R: &I{ + i: 6, + R: &I{ + i: 7, + R: &I{ + i: 8, + R: &I{ + i: 9, + R: &I{ + i: 10, + R: &I{ + i: 11, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + } + iv := i.I().I().I().I().I().I().I().I().I().I() + *iv = *i + t.Logf("Example long interface cycle:\n%# v", Formatter(i)) +} diff --git a/vendor/github.com/kr/pretty/pretty.go b/vendor/github.com/kr/pretty/pretty.go new file mode 100644 index 0000000000..b91020a284 --- /dev/null +++ b/vendor/github.com/kr/pretty/pretty.go @@ -0,0 +1,107 @@ +// Package pretty provides pretty-printing for Go values. This is +// useful during debugging, to avoid wrapping long output lines in +// the terminal. +// +// It provides a function, Formatter, that can be used with any +// function that accepts a format string. It also provides +// convenience wrappers for functions in packages fmt and log. +package pretty + +import ( + "fmt" + "io" + "log" +) + +// Errorf is a convenience wrapper for fmt.Errorf. +// +// Calling Errorf(f, x, y) is equivalent to +// fmt.Errorf(f, Formatter(x), Formatter(y)). +func Errorf(format string, a ...interface{}) error { + return fmt.Errorf(format, wrap(a, false)...) +} + +// Fprintf is a convenience wrapper for fmt.Fprintf. +// +// Calling Fprintf(w, f, x, y) is equivalent to +// fmt.Fprintf(w, f, Formatter(x), Formatter(y)). +func Fprintf(w io.Writer, format string, a ...interface{}) (n int, error error) { + return fmt.Fprintf(w, format, wrap(a, false)...) +} + +// Log is a convenience wrapper for log.Printf. +// +// Calling Log(x, y) is equivalent to +// log.Print(Formatter(x), Formatter(y)), but each operand is +// formatted with "%# v". +func Log(a ...interface{}) { + log.Print(wrap(a, true)...) +} + +// Logf is a convenience wrapper for log.Printf. +// +// Calling Logf(f, x, y) is equivalent to +// log.Printf(f, Formatter(x), Formatter(y)). +func Logf(format string, a ...interface{}) { + log.Printf(format, wrap(a, false)...) +} + +// Logln is a convenience wrapper for log.Printf. +// +// Calling Logln(x, y) is equivalent to +// log.Println(Formatter(x), Formatter(y)), but each operand is +// formatted with "%# v". +func Logln(a ...interface{}) { + log.Println(wrap(a, true)...) +} + +// Print pretty-prints its operands and writes to standard output. +// +// Calling Print(x, y) is equivalent to +// fmt.Print(Formatter(x), Formatter(y)), but each operand is +// formatted with "%# v". +func Print(a ...interface{}) (n int, errno error) { + return fmt.Print(wrap(a, true)...) +} + +// Printf is a convenience wrapper for fmt.Printf. +// +// Calling Printf(f, x, y) is equivalent to +// fmt.Printf(f, Formatter(x), Formatter(y)). +func Printf(format string, a ...interface{}) (n int, errno error) { + return fmt.Printf(format, wrap(a, false)...) +} + +// Println pretty-prints its operands and writes to standard output. +// +// Calling Print(x, y) is equivalent to +// fmt.Println(Formatter(x), Formatter(y)), but each operand is +// formatted with "%# v". +func Println(a ...interface{}) (n int, errno error) { + return fmt.Println(wrap(a, true)...) +} + +// Sprint is a convenience wrapper for fmt.Sprintf. +// +// Calling Sprint(x, y) is equivalent to +// fmt.Sprint(Formatter(x), Formatter(y)), but each operand is +// formatted with "%# v". +func Sprint(a ...interface{}) string { + return fmt.Sprint(wrap(a, true)...) +} + +// Sprintf is a convenience wrapper for fmt.Sprintf. +// +// Calling Sprintf(f, x, y) is equivalent to +// fmt.Sprintf(f, Formatter(x), Formatter(y)). +func Sprintf(format string, a ...interface{}) string { + return fmt.Sprintf(format, wrap(a, false)...) +} + +func wrap(a []interface{}, force bool) []interface{} { + w := make([]interface{}, len(a)) + for i, x := range a { + w[i] = formatter{x: x, force: force} + } + return w +} diff --git a/vendor/github.com/kr/pretty/zero.go b/vendor/github.com/kr/pretty/zero.go new file mode 100644 index 0000000000..abb5b6fc14 --- /dev/null +++ b/vendor/github.com/kr/pretty/zero.go @@ -0,0 +1,41 @@ +package pretty + +import ( + "reflect" +) + +func nonzero(v reflect.Value) bool { + switch v.Kind() { + case reflect.Bool: + return v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() != 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() != 0 + case reflect.Float32, reflect.Float64: + return v.Float() != 0 + case reflect.Complex64, reflect.Complex128: + return v.Complex() != complex(0, 0) + case reflect.String: + return v.String() != "" + case reflect.Struct: + for i := 0; i < v.NumField(); i++ { + if nonzero(getField(v, i)) { + return true + } + } + return false + case reflect.Array: + for i := 0; i < v.Len(); i++ { + if nonzero(v.Index(i)) { + return true + } + } + return false + case reflect.Map, reflect.Interface, reflect.Slice, reflect.Ptr, reflect.Chan, reflect.Func: + return !v.IsNil() + case reflect.UnsafePointer: + return v.Pointer() != 0 + } + return true +} diff --git a/vendor/github.com/kr/pty/.gitignore b/vendor/github.com/kr/pty/.gitignore new file mode 100644 index 0000000000..1f0a99f2f2 --- /dev/null +++ b/vendor/github.com/kr/pty/.gitignore @@ -0,0 +1,4 @@ +[568].out +_go* +_test* +_obj diff --git a/vendor/github.com/kr/pty/License b/vendor/github.com/kr/pty/License new file mode 100644 index 0000000000..6b7558b6b4 --- /dev/null +++ b/vendor/github.com/kr/pty/License @@ -0,0 +1,23 @@ +Copyright (c) 2011 Keith Rarick + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall +be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/kr/pty/README.md b/vendor/github.com/kr/pty/README.md new file mode 100644 index 0000000000..7b7900c3ae --- /dev/null +++ b/vendor/github.com/kr/pty/README.md @@ -0,0 +1,36 @@ +# pty + +Pty is a Go package for using unix pseudo-terminals. + +## Install + + go get github.com/kr/pty + +## Example + +```go +package main + +import ( + "github.com/kr/pty" + "io" + "os" + "os/exec" +) + +func main() { + c := exec.Command("grep", "--color=auto", "bar") + f, err := pty.Start(c) + if err != nil { + panic(err) + } + + go func() { + f.Write([]byte("foo\n")) + f.Write([]byte("bar\n")) + f.Write([]byte("baz\n")) + f.Write([]byte{4}) // EOT + }() + io.Copy(os.Stdout, f) +} +``` diff --git a/vendor/github.com/kr/pty/doc.go b/vendor/github.com/kr/pty/doc.go new file mode 100644 index 0000000000..190cfbea92 --- /dev/null +++ b/vendor/github.com/kr/pty/doc.go @@ -0,0 +1,16 @@ +// Package pty provides functions for working with Unix terminals. +package pty + +import ( + "errors" + "os" +) + +// ErrUnsupported is returned if a function is not +// available on the current platform. +var ErrUnsupported = errors.New("unsupported") + +// Opens a pty and its corresponding tty. +func Open() (pty, tty *os.File, err error) { + return open() +} diff --git a/vendor/github.com/kr/pty/ioctl.go b/vendor/github.com/kr/pty/ioctl.go new file mode 100644 index 0000000000..5b856e8711 --- /dev/null +++ b/vendor/github.com/kr/pty/ioctl.go @@ -0,0 +1,11 @@ +package pty + +import "syscall" + +func ioctl(fd, cmd, ptr uintptr) error { + _, _, e := syscall.Syscall(syscall.SYS_IOCTL, fd, cmd, ptr) + if e != 0 { + return e + } + return nil +} diff --git a/vendor/github.com/kr/pty/ioctl_bsd.go b/vendor/github.com/kr/pty/ioctl_bsd.go new file mode 100644 index 0000000000..73b12c53cf --- /dev/null +++ b/vendor/github.com/kr/pty/ioctl_bsd.go @@ -0,0 +1,39 @@ +// +build darwin dragonfly freebsd netbsd openbsd + +package pty + +// from +const ( + _IOC_VOID uintptr = 0x20000000 + _IOC_OUT uintptr = 0x40000000 + _IOC_IN uintptr = 0x80000000 + _IOC_IN_OUT uintptr = _IOC_OUT | _IOC_IN + _IOC_DIRMASK = _IOC_VOID | _IOC_OUT | _IOC_IN + + _IOC_PARAM_SHIFT = 13 + _IOC_PARAM_MASK = (1 << _IOC_PARAM_SHIFT) - 1 +) + +func _IOC_PARM_LEN(ioctl uintptr) uintptr { + return (ioctl >> 16) & _IOC_PARAM_MASK +} + +func _IOC(inout uintptr, group byte, ioctl_num uintptr, param_len uintptr) uintptr { + return inout | (param_len&_IOC_PARAM_MASK)<<16 | uintptr(group)<<8 | ioctl_num +} + +func _IO(group byte, ioctl_num uintptr) uintptr { + return _IOC(_IOC_VOID, group, ioctl_num, 0) +} + +func _IOR(group byte, ioctl_num uintptr, param_len uintptr) uintptr { + return _IOC(_IOC_OUT, group, ioctl_num, param_len) +} + +func _IOW(group byte, ioctl_num uintptr, param_len uintptr) uintptr { + return _IOC(_IOC_IN, group, ioctl_num, param_len) +} + +func _IOWR(group byte, ioctl_num uintptr, param_len uintptr) uintptr { + return _IOC(_IOC_IN_OUT, group, ioctl_num, param_len) +} diff --git a/vendor/github.com/kr/pty/mktypes.bash b/vendor/github.com/kr/pty/mktypes.bash new file mode 100755 index 0000000000..9952c88838 --- /dev/null +++ b/vendor/github.com/kr/pty/mktypes.bash @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +GOOSARCH="${GOOS}_${GOARCH}" +case "$GOOSARCH" in +_* | *_ | _) + echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2 + exit 1 + ;; +esac + +GODEFS="go tool cgo -godefs" + +$GODEFS types.go |gofmt > ztypes_$GOARCH.go + +case $GOOS in +freebsd) + $GODEFS types_$GOOS.go |gofmt > ztypes_$GOOSARCH.go + ;; +esac diff --git a/vendor/github.com/kr/pty/pty_darwin.go b/vendor/github.com/kr/pty/pty_darwin.go new file mode 100644 index 0000000000..4f4d5ca26e --- /dev/null +++ b/vendor/github.com/kr/pty/pty_darwin.go @@ -0,0 +1,60 @@ +package pty + +import ( + "errors" + "os" + "syscall" + "unsafe" +) + +func open() (pty, tty *os.File, err error) { + p, err := os.OpenFile("/dev/ptmx", os.O_RDWR, 0) + if err != nil { + return nil, nil, err + } + + sname, err := ptsname(p) + if err != nil { + return nil, nil, err + } + + err = grantpt(p) + if err != nil { + return nil, nil, err + } + + err = unlockpt(p) + if err != nil { + return nil, nil, err + } + + t, err := os.OpenFile(sname, os.O_RDWR, 0) + if err != nil { + return nil, nil, err + } + return p, t, nil +} + +func ptsname(f *os.File) (string, error) { + n := make([]byte, _IOC_PARM_LEN(syscall.TIOCPTYGNAME)) + + err := ioctl(f.Fd(), syscall.TIOCPTYGNAME, uintptr(unsafe.Pointer(&n[0]))) + if err != nil { + return "", err + } + + for i, c := range n { + if c == 0 { + return string(n[:i]), nil + } + } + return "", errors.New("TIOCPTYGNAME string not NUL-terminated") +} + +func grantpt(f *os.File) error { + return ioctl(f.Fd(), syscall.TIOCPTYGRANT, 0) +} + +func unlockpt(f *os.File) error { + return ioctl(f.Fd(), syscall.TIOCPTYUNLK, 0) +} diff --git a/vendor/github.com/kr/pty/pty_freebsd.go b/vendor/github.com/kr/pty/pty_freebsd.go new file mode 100644 index 0000000000..b341babd05 --- /dev/null +++ b/vendor/github.com/kr/pty/pty_freebsd.go @@ -0,0 +1,73 @@ +package pty + +import ( + "errors" + "os" + "syscall" + "unsafe" +) + +func posix_openpt(oflag int) (fd int, err error) { + r0, _, e1 := syscall.Syscall(syscall.SYS_POSIX_OPENPT, uintptr(oflag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func open() (pty, tty *os.File, err error) { + fd, err := posix_openpt(syscall.O_RDWR | syscall.O_CLOEXEC) + if err != nil { + return nil, nil, err + } + + p := os.NewFile(uintptr(fd), "/dev/pts") + sname, err := ptsname(p) + if err != nil { + return nil, nil, err + } + + t, err := os.OpenFile("/dev/"+sname, os.O_RDWR, 0) + if err != nil { + return nil, nil, err + } + return p, t, nil +} + +func isptmaster(fd uintptr) (bool, error) { + err := ioctl(fd, syscall.TIOCPTMASTER, 0) + return err == nil, err +} + +var ( + emptyFiodgnameArg fiodgnameArg + ioctl_FIODGNAME = _IOW('f', 120, unsafe.Sizeof(emptyFiodgnameArg)) +) + +func ptsname(f *os.File) (string, error) { + master, err := isptmaster(f.Fd()) + if err != nil { + return "", err + } + if !master { + return "", syscall.EINVAL + } + + const n = _C_SPECNAMELEN + 1 + var ( + buf = make([]byte, n) + arg = fiodgnameArg{Len: n, Buf: (*byte)(unsafe.Pointer(&buf[0]))} + ) + err = ioctl(f.Fd(), ioctl_FIODGNAME, uintptr(unsafe.Pointer(&arg))) + if err != nil { + return "", err + } + + for i, c := range buf { + if c == 0 { + return string(buf[:i]), nil + } + } + return "", errors.New("FIODGNAME string not NUL-terminated") +} diff --git a/vendor/github.com/kr/pty/pty_linux.go b/vendor/github.com/kr/pty/pty_linux.go new file mode 100644 index 0000000000..cb901a21e0 --- /dev/null +++ b/vendor/github.com/kr/pty/pty_linux.go @@ -0,0 +1,46 @@ +package pty + +import ( + "os" + "strconv" + "syscall" + "unsafe" +) + +func open() (pty, tty *os.File, err error) { + p, err := os.OpenFile("/dev/ptmx", os.O_RDWR, 0) + if err != nil { + return nil, nil, err + } + + sname, err := ptsname(p) + if err != nil { + return nil, nil, err + } + + err = unlockpt(p) + if err != nil { + return nil, nil, err + } + + t, err := os.OpenFile(sname, os.O_RDWR|syscall.O_NOCTTY, 0) + if err != nil { + return nil, nil, err + } + return p, t, nil +} + +func ptsname(f *os.File) (string, error) { + var n _C_uint + err := ioctl(f.Fd(), syscall.TIOCGPTN, uintptr(unsafe.Pointer(&n))) + if err != nil { + return "", err + } + return "/dev/pts/" + strconv.Itoa(int(n)), nil +} + +func unlockpt(f *os.File) error { + var u _C_int + // use TIOCSPTLCK with a zero valued arg to clear the slave pty lock + return ioctl(f.Fd(), syscall.TIOCSPTLCK, uintptr(unsafe.Pointer(&u))) +} diff --git a/vendor/github.com/kr/pty/pty_unsupported.go b/vendor/github.com/kr/pty/pty_unsupported.go new file mode 100644 index 0000000000..898c7303c4 --- /dev/null +++ b/vendor/github.com/kr/pty/pty_unsupported.go @@ -0,0 +1,11 @@ +// +build !linux,!darwin,!freebsd + +package pty + +import ( + "os" +) + +func open() (pty, tty *os.File, err error) { + return nil, nil, ErrUnsupported +} diff --git a/vendor/github.com/kr/pty/run.go b/vendor/github.com/kr/pty/run.go new file mode 100644 index 0000000000..c2bc48878c --- /dev/null +++ b/vendor/github.com/kr/pty/run.go @@ -0,0 +1,32 @@ +package pty + +import ( + "os" + "os/exec" + "syscall" +) + +// Start assigns a pseudo-terminal tty os.File to c.Stdin, c.Stdout, +// and c.Stderr, calls c.Start, and returns the File of the tty's +// corresponding pty. +func Start(c *exec.Cmd) (pty *os.File, err error) { + pty, tty, err := Open() + if err != nil { + return nil, err + } + defer tty.Close() + c.Stdout = tty + c.Stdin = tty + c.Stderr = tty + if c.SysProcAttr == nil { + c.SysProcAttr = &syscall.SysProcAttr{} + } + c.SysProcAttr.Setctty = true + c.SysProcAttr.Setsid = true + err = c.Start() + if err != nil { + pty.Close() + return nil, err + } + return pty, err +} diff --git a/vendor/github.com/kr/pty/types.go b/vendor/github.com/kr/pty/types.go new file mode 100644 index 0000000000..5aecb6bcdc --- /dev/null +++ b/vendor/github.com/kr/pty/types.go @@ -0,0 +1,10 @@ +// +build ignore + +package pty + +import "C" + +type ( + _C_int C.int + _C_uint C.uint +) diff --git a/vendor/github.com/kr/pty/types_freebsd.go b/vendor/github.com/kr/pty/types_freebsd.go new file mode 100644 index 0000000000..ce3eb95181 --- /dev/null +++ b/vendor/github.com/kr/pty/types_freebsd.go @@ -0,0 +1,15 @@ +// +build ignore + +package pty + +/* +#include +#include +*/ +import "C" + +const ( + _C_SPECNAMELEN = C.SPECNAMELEN /* max length of devicename */ +) + +type fiodgnameArg C.struct_fiodgname_arg diff --git a/vendor/github.com/kr/pty/util.go b/vendor/github.com/kr/pty/util.go new file mode 100644 index 0000000000..67c52d06cd --- /dev/null +++ b/vendor/github.com/kr/pty/util.go @@ -0,0 +1,35 @@ +package pty + +import ( + "os" + "syscall" + "unsafe" +) + +// Getsize returns the number of rows (lines) and cols (positions +// in each line) in terminal t. +func Getsize(t *os.File) (rows, cols int, err error) { + var ws winsize + err = windowrect(&ws, t.Fd()) + return int(ws.ws_row), int(ws.ws_col), err +} + +type winsize struct { + ws_row uint16 + ws_col uint16 + ws_xpixel uint16 + ws_ypixel uint16 +} + +func windowrect(ws *winsize, fd uintptr) error { + _, _, errno := syscall.Syscall( + syscall.SYS_IOCTL, + fd, + syscall.TIOCGWINSZ, + uintptr(unsafe.Pointer(ws)), + ) + if errno != 0 { + return syscall.Errno(errno) + } + return nil +} diff --git a/vendor/github.com/kr/pty/ztypes_386.go b/vendor/github.com/kr/pty/ztypes_386.go new file mode 100644 index 0000000000..ff0b8fd838 --- /dev/null +++ b/vendor/github.com/kr/pty/ztypes_386.go @@ -0,0 +1,9 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types.go + +package pty + +type ( + _C_int int32 + _C_uint uint32 +) diff --git a/vendor/github.com/kr/pty/ztypes_amd64.go b/vendor/github.com/kr/pty/ztypes_amd64.go new file mode 100644 index 0000000000..ff0b8fd838 --- /dev/null +++ b/vendor/github.com/kr/pty/ztypes_amd64.go @@ -0,0 +1,9 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types.go + +package pty + +type ( + _C_int int32 + _C_uint uint32 +) diff --git a/vendor/github.com/kr/pty/ztypes_arm.go b/vendor/github.com/kr/pty/ztypes_arm.go new file mode 100644 index 0000000000..ff0b8fd838 --- /dev/null +++ b/vendor/github.com/kr/pty/ztypes_arm.go @@ -0,0 +1,9 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types.go + +package pty + +type ( + _C_int int32 + _C_uint uint32 +) diff --git a/vendor/github.com/kr/pty/ztypes_arm64.go b/vendor/github.com/kr/pty/ztypes_arm64.go new file mode 100644 index 0000000000..6c29a4b918 --- /dev/null +++ b/vendor/github.com/kr/pty/ztypes_arm64.go @@ -0,0 +1,11 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types.go + +// +build arm64 + +package pty + +type ( + _C_int int32 + _C_uint uint32 +) diff --git a/vendor/github.com/kr/pty/ztypes_freebsd_386.go b/vendor/github.com/kr/pty/ztypes_freebsd_386.go new file mode 100644 index 0000000000..d9975374e3 --- /dev/null +++ b/vendor/github.com/kr/pty/ztypes_freebsd_386.go @@ -0,0 +1,13 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_freebsd.go + +package pty + +const ( + _C_SPECNAMELEN = 0x3f +) + +type fiodgnameArg struct { + Len int32 + Buf *byte +} diff --git a/vendor/github.com/kr/pty/ztypes_freebsd_amd64.go b/vendor/github.com/kr/pty/ztypes_freebsd_amd64.go new file mode 100644 index 0000000000..5fa102fcdf --- /dev/null +++ b/vendor/github.com/kr/pty/ztypes_freebsd_amd64.go @@ -0,0 +1,14 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_freebsd.go + +package pty + +const ( + _C_SPECNAMELEN = 0x3f +) + +type fiodgnameArg struct { + Len int32 + Pad_cgo_0 [4]byte + Buf *byte +} diff --git a/vendor/github.com/kr/pty/ztypes_freebsd_arm.go b/vendor/github.com/kr/pty/ztypes_freebsd_arm.go new file mode 100644 index 0000000000..d9975374e3 --- /dev/null +++ b/vendor/github.com/kr/pty/ztypes_freebsd_arm.go @@ -0,0 +1,13 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_freebsd.go + +package pty + +const ( + _C_SPECNAMELEN = 0x3f +) + +type fiodgnameArg struct { + Len int32 + Buf *byte +} diff --git a/vendor/github.com/kr/pty/ztypes_ppc64.go b/vendor/github.com/kr/pty/ztypes_ppc64.go new file mode 100644 index 0000000000..4e1af84312 --- /dev/null +++ b/vendor/github.com/kr/pty/ztypes_ppc64.go @@ -0,0 +1,11 @@ +// +build ppc64 + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types.go + +package pty + +type ( + _C_int int32 + _C_uint uint32 +) diff --git a/vendor/github.com/kr/pty/ztypes_ppc64le.go b/vendor/github.com/kr/pty/ztypes_ppc64le.go new file mode 100644 index 0000000000..e6780f4e23 --- /dev/null +++ b/vendor/github.com/kr/pty/ztypes_ppc64le.go @@ -0,0 +1,11 @@ +// +build ppc64le + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types.go + +package pty + +type ( + _C_int int32 + _C_uint uint32 +) diff --git a/vendor/github.com/kr/pty/ztypes_s390x.go b/vendor/github.com/kr/pty/ztypes_s390x.go new file mode 100644 index 0000000000..a7452b61cb --- /dev/null +++ b/vendor/github.com/kr/pty/ztypes_s390x.go @@ -0,0 +1,11 @@ +// +build s390x + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types.go + +package pty + +type ( + _C_int int32 + _C_uint uint32 +) diff --git a/vendor/github.com/kr/text/License b/vendor/github.com/kr/text/License new file mode 100644 index 0000000000..480a328059 --- /dev/null +++ b/vendor/github.com/kr/text/License @@ -0,0 +1,19 @@ +Copyright 2012 Keith Rarick + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/kr/text/Readme b/vendor/github.com/kr/text/Readme new file mode 100644 index 0000000000..7e6e7c0687 --- /dev/null +++ b/vendor/github.com/kr/text/Readme @@ -0,0 +1,3 @@ +This is a Go package for manipulating paragraphs of text. + +See http://go.pkgdoc.org/github.com/kr/text for full documentation. diff --git a/vendor/github.com/kr/text/colwriter/Readme b/vendor/github.com/kr/text/colwriter/Readme new file mode 100644 index 0000000000..1c1f4e6839 --- /dev/null +++ b/vendor/github.com/kr/text/colwriter/Readme @@ -0,0 +1,5 @@ +Package colwriter provides a write filter that formats +input lines in multiple columns. + +The package is a straightforward translation from +/src/cmd/draw/mc.c in Plan 9 from User Space. diff --git a/vendor/github.com/kr/text/colwriter/column.go b/vendor/github.com/kr/text/colwriter/column.go new file mode 100644 index 0000000000..7302ce9f7a --- /dev/null +++ b/vendor/github.com/kr/text/colwriter/column.go @@ -0,0 +1,147 @@ +// Package colwriter provides a write filter that formats +// input lines in multiple columns. +// +// The package is a straightforward translation from +// /src/cmd/draw/mc.c in Plan 9 from User Space. +package colwriter + +import ( + "bytes" + "io" + "unicode/utf8" +) + +const ( + tab = 4 +) + +const ( + // Print each input line ending in a colon ':' separately. + BreakOnColon uint = 1 << iota +) + +// A Writer is a filter that arranges input lines in as many columns as will +// fit in its width. Tab '\t' chars in the input are translated to sequences +// of spaces ending at multiples of 4 positions. +// +// If BreakOnColon is set, each input line ending in a colon ':' is written +// separately. +// +// The Writer assumes that all Unicode code points have the same width; this +// may not be true in some fonts. +type Writer struct { + w io.Writer + buf []byte + width int + flag uint +} + +// NewWriter allocates and initializes a new Writer writing to w. +// Parameter width controls the total number of characters on each line +// across all columns. +func NewWriter(w io.Writer, width int, flag uint) *Writer { + return &Writer{ + w: w, + width: width, + flag: flag, + } +} + +// Write writes p to the writer w. The only errors returned are ones +// encountered while writing to the underlying output stream. +func (w *Writer) Write(p []byte) (n int, err error) { + var linelen int + var lastWasColon bool + for i, c := range p { + w.buf = append(w.buf, c) + linelen++ + if c == '\t' { + w.buf[len(w.buf)-1] = ' ' + for linelen%tab != 0 { + w.buf = append(w.buf, ' ') + linelen++ + } + } + if w.flag&BreakOnColon != 0 && c == ':' { + lastWasColon = true + } else if lastWasColon { + if c == '\n' { + pos := bytes.LastIndex(w.buf[:len(w.buf)-1], []byte{'\n'}) + if pos < 0 { + pos = 0 + } + line := w.buf[pos:] + w.buf = w.buf[:pos] + if err = w.columnate(); err != nil { + if len(line) < i { + return i - len(line), err + } + return 0, err + } + if n, err := w.w.Write(line); err != nil { + if r := len(line) - n; r < i { + return i - r, err + } + return 0, err + } + } + lastWasColon = false + } + if c == '\n' { + linelen = 0 + } + } + return len(p), nil +} + +// Flush should be called after the last call to Write to ensure that any data +// buffered in the Writer is written to output. +func (w *Writer) Flush() error { + return w.columnate() +} + +func (w *Writer) columnate() error { + words := bytes.Split(w.buf, []byte{'\n'}) + w.buf = nil + if len(words[len(words)-1]) == 0 { + words = words[:len(words)-1] + } + maxwidth := 0 + for _, wd := range words { + if n := utf8.RuneCount(wd); n > maxwidth { + maxwidth = n + } + } + maxwidth++ // space char + wordsPerLine := w.width / maxwidth + if wordsPerLine <= 0 { + wordsPerLine = 1 + } + nlines := (len(words) + wordsPerLine - 1) / wordsPerLine + for i := 0; i < nlines; i++ { + col := 0 + endcol := 0 + for j := i; j < len(words); j += nlines { + endcol += maxwidth + _, err := w.w.Write(words[j]) + if err != nil { + return err + } + col += utf8.RuneCount(words[j]) + if j+nlines < len(words) { + for col < endcol { + _, err := w.w.Write([]byte{' '}) + if err != nil { + return err + } + col++ + } + } + } + _, err := w.w.Write([]byte{'\n'}) + if err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/kr/text/colwriter/column_test.go b/vendor/github.com/kr/text/colwriter/column_test.go new file mode 100644 index 0000000000..ce388f5a26 --- /dev/null +++ b/vendor/github.com/kr/text/colwriter/column_test.go @@ -0,0 +1,90 @@ +package colwriter + +import ( + "bytes" + "testing" +) + +var src = ` +.git +.gitignore +.godir +Procfile: +README.md +api.go +apps.go +auth.go +darwin.go +data.go +dyno.go: +env.go +git.go +help.go +hkdist +linux.go +ls.go +main.go +plugin.go +run.go +scale.go +ssh.go +tail.go +term +unix.go +update.go +version.go +windows.go +`[1:] + +var tests = []struct { + wid int + flag uint + src string + want string +}{ + {80, 0, "", ""}, + {80, 0, src, ` +.git README.md darwin.go git.go ls.go scale.go unix.go +.gitignore api.go data.go help.go main.go ssh.go update.go +.godir apps.go dyno.go: hkdist plugin.go tail.go version.go +Procfile: auth.go env.go linux.go run.go term windows.go +`[1:]}, + {80, BreakOnColon, src, ` +.git .gitignore .godir + +Procfile: +README.md api.go apps.go auth.go darwin.go data.go + +dyno.go: +env.go hkdist main.go scale.go term version.go +git.go linux.go plugin.go ssh.go unix.go windows.go +help.go ls.go run.go tail.go update.go +`[1:]}, + {20, 0, ` +Hello +Γειά σου +안녕 +今日は +`[1:], ` +Hello 안녕 +Γειά σου 今日は +`[1:]}, +} + +func TestWriter(t *testing.T) { + for _, test := range tests { + b := new(bytes.Buffer) + w := NewWriter(b, test.wid, test.flag) + if _, err := w.Write([]byte(test.src)); err != nil { + t.Error(err) + } + if err := w.Flush(); err != nil { + t.Error(err) + } + if g := b.String(); test.want != g { + t.Log("\n" + test.want) + t.Log("\n" + g) + t.Errorf("%q != %q", test.want, g) + } + } +} diff --git a/vendor/github.com/kr/text/doc.go b/vendor/github.com/kr/text/doc.go new file mode 100644 index 0000000000..cf4c198f95 --- /dev/null +++ b/vendor/github.com/kr/text/doc.go @@ -0,0 +1,3 @@ +// Package text provides rudimentary functions for manipulating text in +// paragraphs. +package text diff --git a/vendor/github.com/kr/text/indent.go b/vendor/github.com/kr/text/indent.go new file mode 100644 index 0000000000..4ebac45c09 --- /dev/null +++ b/vendor/github.com/kr/text/indent.go @@ -0,0 +1,74 @@ +package text + +import ( + "io" +) + +// Indent inserts prefix at the beginning of each non-empty line of s. The +// end-of-line marker is NL. +func Indent(s, prefix string) string { + return string(IndentBytes([]byte(s), []byte(prefix))) +} + +// IndentBytes inserts prefix at the beginning of each non-empty line of b. +// The end-of-line marker is NL. +func IndentBytes(b, prefix []byte) []byte { + var res []byte + bol := true + for _, c := range b { + if bol && c != '\n' { + res = append(res, prefix...) + } + res = append(res, c) + bol = c == '\n' + } + return res +} + +// Writer indents each line of its input. +type indentWriter struct { + w io.Writer + bol bool + pre [][]byte + sel int + off int +} + +// NewIndentWriter makes a new write filter that indents the input +// lines. Each line is prefixed in order with the corresponding +// element of pre. If there are more lines than elements, the last +// element of pre is repeated for each subsequent line. +func NewIndentWriter(w io.Writer, pre ...[]byte) io.Writer { + return &indentWriter{ + w: w, + pre: pre, + bol: true, + } +} + +// The only errors returned are from the underlying indentWriter. +func (w *indentWriter) Write(p []byte) (n int, err error) { + for _, c := range p { + if w.bol { + var i int + i, err = w.w.Write(w.pre[w.sel][w.off:]) + w.off += i + if err != nil { + return n, err + } + } + _, err = w.w.Write([]byte{c}) + if err != nil { + return n, err + } + n++ + w.bol = c == '\n' + if w.bol { + w.off = 0 + if w.sel < len(w.pre)-1 { + w.sel++ + } + } + } + return n, nil +} diff --git a/vendor/github.com/kr/text/indent_test.go b/vendor/github.com/kr/text/indent_test.go new file mode 100644 index 0000000000..5c723eee85 --- /dev/null +++ b/vendor/github.com/kr/text/indent_test.go @@ -0,0 +1,119 @@ +package text + +import ( + "bytes" + "testing" +) + +type T struct { + inp, exp, pre string +} + +var tests = []T{ + { + "The quick brown fox\njumps over the lazy\ndog.\nBut not quickly.\n", + "xxxThe quick brown fox\nxxxjumps over the lazy\nxxxdog.\nxxxBut not quickly.\n", + "xxx", + }, + { + "The quick brown fox\njumps over the lazy\ndog.\n\nBut not quickly.", + "xxxThe quick brown fox\nxxxjumps over the lazy\nxxxdog.\n\nxxxBut not quickly.", + "xxx", + }, +} + +func TestIndent(t *testing.T) { + for _, test := range tests { + got := Indent(test.inp, test.pre) + if got != test.exp { + t.Errorf("mismatch %q != %q", got, test.exp) + } + } +} + +type IndentWriterTest struct { + inp, exp string + pre []string +} + +var ts = []IndentWriterTest{ + { + ` +The quick brown fox +jumps over the lazy +dog. +But not quickly. +`[1:], + ` +xxxThe quick brown fox +xxxjumps over the lazy +xxxdog. +xxxBut not quickly. +`[1:], + []string{"xxx"}, + }, + { + ` +The quick brown fox +jumps over the lazy +dog. +But not quickly. +`[1:], + ` +xxaThe quick brown fox +xxxjumps over the lazy +xxxdog. +xxxBut not quickly. +`[1:], + []string{"xxa", "xxx"}, + }, + { + ` +The quick brown fox +jumps over the lazy +dog. +But not quickly. +`[1:], + ` +xxaThe quick brown fox +xxbjumps over the lazy +xxcdog. +xxxBut not quickly. +`[1:], + []string{"xxa", "xxb", "xxc", "xxx"}, + }, + { + ` +The quick brown fox +jumps over the lazy +dog. + +But not quickly.`[1:], + ` +xxaThe quick brown fox +xxxjumps over the lazy +xxxdog. +xxx +xxxBut not quickly.`[1:], + []string{"xxa", "xxx"}, + }, +} + +func TestIndentWriter(t *testing.T) { + for _, test := range ts { + b := new(bytes.Buffer) + pre := make([][]byte, len(test.pre)) + for i := range test.pre { + pre[i] = []byte(test.pre[i]) + } + w := NewIndentWriter(b, pre...) + if _, err := w.Write([]byte(test.inp)); err != nil { + t.Error(err) + } + if got := b.String(); got != test.exp { + t.Errorf("mismatch %q != %q", got, test.exp) + t.Log(got) + t.Log(test.exp) + } + } +} diff --git a/vendor/github.com/kr/text/mc/Readme b/vendor/github.com/kr/text/mc/Readme new file mode 100644 index 0000000000..519ddc00a1 --- /dev/null +++ b/vendor/github.com/kr/text/mc/Readme @@ -0,0 +1,9 @@ +Command mc prints in multiple columns. + + Usage: mc [-] [-N] [file...] + +Mc splits the input into as many columns as will fit in N +print positions. If the output is a tty, the default N is +the number of characters in a terminal line; otherwise the +default N is 80. Under option - each input line ending in +a colon ':' is printed separately. diff --git a/vendor/github.com/kr/text/mc/mc.go b/vendor/github.com/kr/text/mc/mc.go new file mode 100644 index 0000000000..00169a30f1 --- /dev/null +++ b/vendor/github.com/kr/text/mc/mc.go @@ -0,0 +1,62 @@ +// Command mc prints in multiple columns. +// +// Usage: mc [-] [-N] [file...] +// +// Mc splits the input into as many columns as will fit in N +// print positions. If the output is a tty, the default N is +// the number of characters in a terminal line; otherwise the +// default N is 80. Under option - each input line ending in +// a colon ':' is printed separately. +package main + +import ( + "github.com/kr/pty" + "github.com/kr/text/colwriter" + "io" + "log" + "os" + "strconv" +) + +func main() { + var width int + var flag uint + args := os.Args[1:] + for len(args) > 0 && len(args[0]) > 0 && args[0][0] == '-' { + if len(args[0]) > 1 { + width, _ = strconv.Atoi(args[0][1:]) + } else { + flag |= colwriter.BreakOnColon + } + args = args[1:] + } + if width < 1 { + _, width, _ = pty.Getsize(os.Stdout) + } + if width < 1 { + width = 80 + } + + w := colwriter.NewWriter(os.Stdout, width, flag) + if len(args) > 0 { + for _, s := range args { + if f, err := os.Open(s); err == nil { + copyin(w, f) + f.Close() + } else { + log.Println(err) + } + } + } else { + copyin(w, os.Stdin) + } +} + +func copyin(w *colwriter.Writer, r io.Reader) { + if _, err := io.Copy(w, r); err != nil { + log.Println(err) + } + if err := w.Flush(); err != nil { + log.Println(err) + } +} diff --git a/vendor/github.com/kr/text/wrap.go b/vendor/github.com/kr/text/wrap.go new file mode 100644 index 0000000000..b09bb03736 --- /dev/null +++ b/vendor/github.com/kr/text/wrap.go @@ -0,0 +1,86 @@ +package text + +import ( + "bytes" + "math" +) + +var ( + nl = []byte{'\n'} + sp = []byte{' '} +) + +const defaultPenalty = 1e5 + +// Wrap wraps s into a paragraph of lines of length lim, with minimal +// raggedness. +func Wrap(s string, lim int) string { + return string(WrapBytes([]byte(s), lim)) +} + +// WrapBytes wraps b into a paragraph of lines of length lim, with minimal +// raggedness. +func WrapBytes(b []byte, lim int) []byte { + words := bytes.Split(bytes.Replace(bytes.TrimSpace(b), nl, sp, -1), sp) + var lines [][]byte + for _, line := range WrapWords(words, 1, lim, defaultPenalty) { + lines = append(lines, bytes.Join(line, sp)) + } + return bytes.Join(lines, nl) +} + +// WrapWords is the low-level line-breaking algorithm, useful if you need more +// control over the details of the text wrapping process. For most uses, either +// Wrap or WrapBytes will be sufficient and more convenient. +// +// WrapWords splits a list of words into lines with minimal "raggedness", +// treating each byte as one unit, accounting for spc units between adjacent +// words on each line, and attempting to limit lines to lim units. Raggedness +// is the total error over all lines, where error is the square of the +// difference of the length of the line and lim. Too-long lines (which only +// happen when a single word is longer than lim units) have pen penalty units +// added to the error. +func WrapWords(words [][]byte, spc, lim, pen int) [][][]byte { + n := len(words) + + length := make([][]int, n) + for i := 0; i < n; i++ { + length[i] = make([]int, n) + length[i][i] = len(words[i]) + for j := i + 1; j < n; j++ { + length[i][j] = length[i][j-1] + spc + len(words[j]) + } + } + + nbrk := make([]int, n) + cost := make([]int, n) + for i := range cost { + cost[i] = math.MaxInt32 + } + for i := n - 1; i >= 0; i-- { + if length[i][n-1] <= lim || i == n-1 { + cost[i] = 0 + nbrk[i] = n + } else { + for j := i + 1; j < n; j++ { + d := lim - length[i][j-1] + c := d*d + cost[j] + if length[i][j-1] > lim { + c += pen // too-long lines get a worse penalty + } + if c < cost[i] { + cost[i] = c + nbrk[i] = j + } + } + } + } + + var lines [][][]byte + i := 0 + for i < n { + lines = append(lines, words[i:nbrk[i]]) + i = nbrk[i] + } + return lines +} diff --git a/vendor/github.com/kr/text/wrap_test.go b/vendor/github.com/kr/text/wrap_test.go new file mode 100644 index 0000000000..634b6e8ebb --- /dev/null +++ b/vendor/github.com/kr/text/wrap_test.go @@ -0,0 +1,62 @@ +package text + +import ( + "bytes" + "testing" +) + +var text = "The quick brown fox jumps over the lazy dog." + +func TestWrap(t *testing.T) { + exp := [][]string{ + {"The", "quick", "brown", "fox"}, + {"jumps", "over", "the", "lazy", "dog."}, + } + words := bytes.Split([]byte(text), sp) + got := WrapWords(words, 1, 24, defaultPenalty) + if len(exp) != len(got) { + t.Fail() + } + for i := range exp { + if len(exp[i]) != len(got[i]) { + t.Fail() + } + for j := range exp[i] { + if exp[i][j] != string(got[i][j]) { + t.Fatal(i, exp[i][j], got[i][j]) + } + } + } +} + +func TestWrapNarrow(t *testing.T) { + exp := "The\nquick\nbrown\nfox\njumps\nover\nthe\nlazy\ndog." + if Wrap(text, 5) != exp { + t.Fail() + } +} + +func TestWrapOneLine(t *testing.T) { + exp := "The quick brown fox jumps over the lazy dog." + if Wrap(text, 500) != exp { + t.Fail() + } +} + +func TestWrapBug1(t *testing.T) { + cases := []struct { + limit int + text string + want string + }{ + {4, "aaaaa", "aaaaa"}, + {4, "a aaaaa", "a\naaaaa"}, + } + + for _, test := range cases { + got := Wrap(test.text, test.limit) + if got != test.want { + t.Errorf("Wrap(%q, %d) = %q want %q", test.text, test.limit, got, test.want) + } + } +} diff --git a/vendor/github.com/magiconair/properties/.gitignore b/vendor/github.com/magiconair/properties/.gitignore new file mode 100644 index 0000000000..7054822dc9 --- /dev/null +++ b/vendor/github.com/magiconair/properties/.gitignore @@ -0,0 +1,4 @@ +*.sublime-project +*.sublime-workspace +*.un~ +*.swp diff --git a/vendor/github.com/magiconair/properties/.travis.yml b/vendor/github.com/magiconair/properties/.travis.yml new file mode 100644 index 0000000000..5ef5d72f3b --- /dev/null +++ b/vendor/github.com/magiconair/properties/.travis.yml @@ -0,0 +1,6 @@ +language: go +go: + - 1.4.3 + - 1.5.3 + - 1.6 + - tip diff --git a/vendor/github.com/magiconair/properties/CHANGELOG.md b/vendor/github.com/magiconair/properties/CHANGELOG.md new file mode 100644 index 0000000000..bf49a1376f --- /dev/null +++ b/vendor/github.com/magiconair/properties/CHANGELOG.md @@ -0,0 +1,81 @@ +## Changelog + +### [1.7.0](https://github.com/magiconair/properties/tags/v1.7.0) - 20 Mar 2016 + + * [Issue #10](https://github.com/magiconair/properties/issues/10): Add [LoadURL,LoadURLs,MustLoadURL,MustLoadURLs](http://godoc.org/github.com/magiconair/properties#Properties.LoadURL) method to load properties from a URL. + * [Issue #11](https://github.com/magiconair/properties/issues/11): Add [LoadString,MustLoadString](http://godoc.org/github.com/magiconair/properties#Properties.LoadString) method to load properties from an UTF8 string. + * [PR #8](https://github.com/magiconair/properties/pull/8): Add [MustFlag](http://godoc.org/github.com/magiconair/properties#Properties.MustFlag) method to provide overrides via command line flags. (@pascaldekloe) + +### [1.6.0](https://github.com/magiconair/properties/tags/v1.6.0) - 11 Dec 2015 + + * Add [Decode](http://godoc.org/github.com/magiconair/properties#Properties.Decode) method to populate struct from properties via tags. + +### [1.5.6](https://github.com/magiconair/properties/tags/v1.5.6) - 18 Oct 2015 + + * Vendored in gopkg.in/check.v1 + +### [1.5.5](https://github.com/magiconair/properties/tags/v1.5.5) - 31 Jul 2015 + + * [PR #6](https://github.com/magiconair/properties/pull/6): Add [Delete](http://godoc.org/github.com/magiconair/properties#Properties.Delete) method to remove keys including comments. (@gerbenjacobs) + +### [1.5.4](https://github.com/magiconair/properties/tags/v1.5.4) - 23 Jun 2015 + + * [Issue #5](https://github.com/magiconair/properties/issues/5): Allow disabling of property expansion [DisableExpansion](http://godoc.org/github.com/magiconair/properties#Properties.DisableExpansion). When property expansion is disabled Properties become a simple key/value store and don't check for circular references. + +### [1.5.3](https://github.com/magiconair/properties/tags/v1.5.3) - 02 Jun 2015 + + * [Issue #4](https://github.com/magiconair/properties/issues/4): Maintain key order in [Filter()](http://godoc.org/github.com/magiconair/properties#Properties.Filter), [FilterPrefix()](http://godoc.org/github.com/magiconair/properties#Properties.FilterPrefix) and [FilterRegexp()](http://godoc.org/github.com/magiconair/properties#Properties.FilterRegexp) + +### [1.5.2](https://github.com/magiconair/properties/tags/v1.5.2) - 10 Apr 2015 + + * [Issue #3](https://github.com/magiconair/properties/issues/3): Don't print comments in [WriteComment()](http://godoc.org/github.com/magiconair/properties#Properties.WriteComment) if they are all empty + * Add clickable links to README + +### [1.5.1](https://github.com/magiconair/properties/tags/v1.5.1) - 08 Dec 2014 + + * Added [GetParsedDuration()](http://godoc.org/github.com/magiconair/properties#Properties.GetParsedDuration) and [MustGetParsedDuration()](http://godoc.org/github.com/magiconair/properties#Properties.MustGetParsedDuration) for values specified compatible with + [time.ParseDuration()](http://golang.org/pkg/time/#ParseDuration). + +### [1.5.0](https://github.com/magiconair/properties/tags/v1.5.0) - 18 Nov 2014 + + * Added support for single and multi-line comments (reading, writing and updating) + * The order of keys is now preserved + * Calling [Set()](http://godoc.org/github.com/magiconair/properties#Properties.Set) with an empty key now silently ignores the call and does not create a new entry + * Added a [MustSet()](http://godoc.org/github.com/magiconair/properties#Properties.MustSet) method + * Migrated test library from launchpad.net/gocheck to [gopkg.in/check.v1](http://gopkg.in/check.v1) + +### [1.4.2](https://github.com/magiconair/properties/tags/v1.4.2) - 15 Nov 2014 + + * [Issue #2](https://github.com/magiconair/properties/issues/2): Fixed goroutine leak in parser which created two lexers but cleaned up only one + +### [1.4.1](https://github.com/magiconair/properties/tags/v1.4.1) - 13 Nov 2014 + + * [Issue #1](https://github.com/magiconair/properties/issues/1): Fixed bug in Keys() method which returned an empty string + +### [1.4.0](https://github.com/magiconair/properties/tags/v1.4.0) - 23 Sep 2014 + + * Added [Keys()](http://godoc.org/github.com/magiconair/properties#Properties.Keys) to get the keys + * Added [Filter()](http://godoc.org/github.com/magiconair/properties#Properties.Filter), [FilterRegexp()](http://godoc.org/github.com/magiconair/properties#Properties.FilterRegexp) and [FilterPrefix()](http://godoc.org/github.com/magiconair/properties#Properties.FilterPrefix) to get a subset of the properties + +### [1.3.0](https://github.com/magiconair/properties/tags/v1.3.0) - 18 Mar 2014 + +* Added support for time.Duration +* Made MustXXX() failure beha[ior configurable (log.Fatal, panic](https://github.com/magiconair/properties/tags/vior configurable (log.Fatal, panic) - custom) +* Changed default of MustXXX() failure from panic to log.Fatal + +### [1.2.0](https://github.com/magiconair/properties/tags/v1.2.0) - 05 Mar 2014 + +* Added MustGet... functions +* Added support for int and uint with range checks on 32 bit platforms + +### [1.1.0](https://github.com/magiconair/properties/tags/v1.1.0) - 20 Jan 2014 + +* Renamed from goproperties to properties +* Added support for expansion of environment vars in + filenames and value expressions +* Fixed bug where value expressions were not at the + start of the string + +### [1.0.0](https://github.com/magiconair/properties/tags/v1.0.0) - 7 Jan 2014 + +* Initial release diff --git a/vendor/github.com/magiconair/properties/LICENSE b/vendor/github.com/magiconair/properties/LICENSE new file mode 100644 index 0000000000..7eab43b6bf --- /dev/null +++ b/vendor/github.com/magiconair/properties/LICENSE @@ -0,0 +1,25 @@ +goproperties - properties file decoder for Go + +Copyright (c) 2013-2014 - Frank Schroeder + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/magiconair/properties/README.md b/vendor/github.com/magiconair/properties/README.md new file mode 100644 index 0000000000..1ae0035a0d --- /dev/null +++ b/vendor/github.com/magiconair/properties/README.md @@ -0,0 +1,81 @@ +Overview [![Build Status](https://travis-ci.org/magiconair/properties.svg?branch=master)](https://travis-ci.org/magiconair/properties) +======== + +#### Current version: 1.7.0 + +properties is a Go library for reading and writing properties files. + +It supports reading from multiple files or URLs and Spring style recursive +property expansion of expressions like `${key}` to their corresponding value. +Value expressions can refer to other keys like in `${key}` or to environment +variables like in `${USER}`. Filenames can also contain environment variables +like in `/home/${USER}/myapp.properties`. + +Properties can be decoded into structs, maps, arrays and values through +struct tags. + +Comments and the order of keys are preserved. Comments can be modified +and can be written to the output. + +The properties library supports both ISO-8859-1 and UTF-8 encoded data. + +Starting from version 1.3.0 the behavior of the MustXXX() functions is +configurable by providing a custom `ErrorHandler` function. The default has +changed from `panic` to `log.Fatal` but this is configurable and custom +error handling functions can be provided. See the package documentation for +details. + +Getting Started +--------------- + +```go +import ( + "flag" + "github.com/magiconair/properties" +) + +func main() { + p := properties.MustLoadFile("${HOME}/config.properties", properties.UTF8) + + // via getters + host := p.MustGetString("host") + port := p.GetInt("port", 8080) + + // or via decode + type Config struct { + Host string `properties:"host"` + Port int `properties:"port,default=9000"` + Accept []string `properties:"accept,default=image/png;image;gif"` + Timeout time.Duration `properties:"timeout,default=5s"` + } + var cfg Config + if err := p.Decode(&cfg); err != nil { + log.Fatal(err) + } + + // or via flags + p.MustFlag(flag.CommandLine) + + // or via url + p = properties.MustLoadURL("http://host/path") +} + +``` + +Read the full documentation on [GoDoc](https://godoc.org/github.com/magiconair/properties) [![GoDoc](https://godoc.org/github.com/magiconair/properties?status.png)](https://godoc.org/github.com/magiconair/properties) + +Installation and Upgrade +------------------------ + +``` +$ go get -u github.com/magiconair/properties +``` + +License +------- + +2 clause BSD license. See [LICENSE](https://github.com/magiconair/properties/blob/master/LICENSE) file for details. + +ToDo +---- +* Dump contents with passwords and secrets obscured diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/LICENSE b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/LICENSE new file mode 100644 index 0000000000..545cf2d331 --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/LICENSE @@ -0,0 +1,25 @@ +Gocheck - A rich testing framework for Go + +Copyright (c) 2010-2013 Gustavo Niemeyer + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/README.md b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/README.md new file mode 100644 index 0000000000..0ca9e57260 --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/README.md @@ -0,0 +1,20 @@ +Instructions +============ + +Install the package with: + + go get gopkg.in/check.v1 + +Import it with: + + import "gopkg.in/check.v1" + +and use _check_ as the package name inside the code. + +For more details, visit the project page: + +* http://labix.org/gocheck + +and the API documentation: + +* https://gopkg.in/check.v1 diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/TODO b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/TODO new file mode 100644 index 0000000000..33498270ea --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/TODO @@ -0,0 +1,2 @@ +- Assert(slice, Contains, item) +- Parallel test support diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/benchmark.go b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/benchmark.go new file mode 100644 index 0000000000..48cb8c8114 --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/benchmark.go @@ -0,0 +1,163 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package check + +import ( + "fmt" + "runtime" + "time" +) + +var memStats runtime.MemStats + +// testingB is a type passed to Benchmark functions to manage benchmark +// timing and to specify the number of iterations to run. +type timer struct { + start time.Time // Time test or benchmark started + duration time.Duration + N int + bytes int64 + timerOn bool + benchTime time.Duration + // The initial states of memStats.Mallocs and memStats.TotalAlloc. + startAllocs uint64 + startBytes uint64 + // The net total of this test after being run. + netAllocs uint64 + netBytes uint64 +} + +// StartTimer starts timing a test. This function is called automatically +// before a benchmark starts, but it can also used to resume timing after +// a call to StopTimer. +func (c *C) StartTimer() { + if !c.timerOn { + c.start = time.Now() + c.timerOn = true + + runtime.ReadMemStats(&memStats) + c.startAllocs = memStats.Mallocs + c.startBytes = memStats.TotalAlloc + } +} + +// StopTimer stops timing a test. This can be used to pause the timer +// while performing complex initialization that you don't +// want to measure. +func (c *C) StopTimer() { + if c.timerOn { + c.duration += time.Now().Sub(c.start) + c.timerOn = false + runtime.ReadMemStats(&memStats) + c.netAllocs += memStats.Mallocs - c.startAllocs + c.netBytes += memStats.TotalAlloc - c.startBytes + } +} + +// ResetTimer sets the elapsed benchmark time to zero. +// It does not affect whether the timer is running. +func (c *C) ResetTimer() { + if c.timerOn { + c.start = time.Now() + runtime.ReadMemStats(&memStats) + c.startAllocs = memStats.Mallocs + c.startBytes = memStats.TotalAlloc + } + c.duration = 0 + c.netAllocs = 0 + c.netBytes = 0 +} + +// SetBytes informs the number of bytes that the benchmark processes +// on each iteration. If this is called in a benchmark it will also +// report MB/s. +func (c *C) SetBytes(n int64) { + c.bytes = n +} + +func (c *C) nsPerOp() int64 { + if c.N <= 0 { + return 0 + } + return c.duration.Nanoseconds() / int64(c.N) +} + +func (c *C) mbPerSec() float64 { + if c.bytes <= 0 || c.duration <= 0 || c.N <= 0 { + return 0 + } + return (float64(c.bytes) * float64(c.N) / 1e6) / c.duration.Seconds() +} + +func (c *C) timerString() string { + if c.N <= 0 { + return fmt.Sprintf("%3.3fs", float64(c.duration.Nanoseconds())/1e9) + } + mbs := c.mbPerSec() + mb := "" + if mbs != 0 { + mb = fmt.Sprintf("\t%7.2f MB/s", mbs) + } + nsop := c.nsPerOp() + ns := fmt.Sprintf("%10d ns/op", nsop) + if c.N > 0 && nsop < 100 { + // The format specifiers here make sure that + // the ones digits line up for all three possible formats. + if nsop < 10 { + ns = fmt.Sprintf("%13.2f ns/op", float64(c.duration.Nanoseconds())/float64(c.N)) + } else { + ns = fmt.Sprintf("%12.1f ns/op", float64(c.duration.Nanoseconds())/float64(c.N)) + } + } + memStats := "" + if c.benchMem { + allocedBytes := fmt.Sprintf("%8d B/op", int64(c.netBytes)/int64(c.N)) + allocs := fmt.Sprintf("%8d allocs/op", int64(c.netAllocs)/int64(c.N)) + memStats = fmt.Sprintf("\t%s\t%s", allocedBytes, allocs) + } + return fmt.Sprintf("%8d\t%s%s%s", c.N, ns, mb, memStats) +} + +func min(x, y int) int { + if x > y { + return y + } + return x +} + +func max(x, y int) int { + if x < y { + return y + } + return x +} + +// roundDown10 rounds a number down to the nearest power of 10. +func roundDown10(n int) int { + var tens = 0 + // tens = floor(log_10(n)) + for n > 10 { + n = n / 10 + tens++ + } + // result = 10^tens + result := 1 + for i := 0; i < tens; i++ { + result *= 10 + } + return result +} + +// roundUp rounds x up to a number of the form [1eX, 2eX, 5eX]. +func roundUp(n int) int { + base := roundDown10(n) + if n < (2 * base) { + return 2 * base + } + if n < (5 * base) { + return 5 * base + } + return 10 * base +} diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/benchmark_test.go b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/benchmark_test.go new file mode 100644 index 0000000000..a7cfd53f97 --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/benchmark_test.go @@ -0,0 +1,91 @@ +// These tests verify the test running logic. + +package check_test + +import ( + . "github.com/magiconair/properties/_third_party/gopkg.in/check.v1" + "time" +) + +var benchmarkS = Suite(&BenchmarkS{}) + +type BenchmarkS struct{} + +func (s *BenchmarkS) TestCountSuite(c *C) { + suitesRun += 1 +} + +func (s *BenchmarkS) TestBasicTestTiming(c *C) { + helper := FixtureHelper{sleepOn: "Test1", sleep: 1000000 * time.Nanosecond} + output := String{} + runConf := RunConf{Output: &output, Verbose: true} + Run(&helper, &runConf) + + expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test1\t0\\.001s\n" + + "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test2\t0\\.000s\n" + c.Assert(output.value, Matches, expected) +} + +func (s *BenchmarkS) TestStreamTestTiming(c *C) { + helper := FixtureHelper{sleepOn: "SetUpSuite", sleep: 1000000 * time.Nanosecond} + output := String{} + runConf := RunConf{Output: &output, Stream: true} + Run(&helper, &runConf) + + expected := "(?s).*\nPASS: check_test\\.go:[0-9]+: FixtureHelper\\.SetUpSuite\t *0\\.001s\n.*" + c.Assert(output.value, Matches, expected) +} + +func (s *BenchmarkS) TestBenchmark(c *C) { + helper := FixtureHelper{sleep: 100000} + output := String{} + runConf := RunConf{ + Output: &output, + Benchmark: true, + BenchmarkTime: 10000000, + Filter: "Benchmark1", + } + Run(&helper, &runConf) + c.Check(helper.calls[0], Equals, "SetUpSuite") + c.Check(helper.calls[1], Equals, "SetUpTest") + c.Check(helper.calls[2], Equals, "Benchmark1") + c.Check(helper.calls[3], Equals, "TearDownTest") + c.Check(helper.calls[4], Equals, "SetUpTest") + c.Check(helper.calls[5], Equals, "Benchmark1") + c.Check(helper.calls[6], Equals, "TearDownTest") + // ... and more. + + expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Benchmark1\t *100\t *[12][0-9]{5} ns/op\n" + c.Assert(output.value, Matches, expected) +} + +func (s *BenchmarkS) TestBenchmarkBytes(c *C) { + helper := FixtureHelper{sleep: 100000} + output := String{} + runConf := RunConf{ + Output: &output, + Benchmark: true, + BenchmarkTime: 10000000, + Filter: "Benchmark2", + } + Run(&helper, &runConf) + + expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Benchmark2\t *100\t *[12][0-9]{5} ns/op\t *[4-9]\\.[0-9]{2} MB/s\n" + c.Assert(output.value, Matches, expected) +} + +func (s *BenchmarkS) TestBenchmarkMem(c *C) { + helper := FixtureHelper{sleep: 100000} + output := String{} + runConf := RunConf{ + Output: &output, + Benchmark: true, + BenchmarkMem: true, + BenchmarkTime: 10000000, + Filter: "Benchmark3", + } + Run(&helper, &runConf) + + expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Benchmark3\t *100\t *[12][0-9]{5} ns/op\t *[0-9]+ B/op\t *[1-9] allocs/op\n" + c.Assert(output.value, Matches, expected) +} diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/bootstrap_test.go b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/bootstrap_test.go new file mode 100644 index 0000000000..e5cee20ec7 --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/bootstrap_test.go @@ -0,0 +1,82 @@ +// These initial tests are for bootstrapping. They verify that we can +// basically use the testing infrastructure itself to check if the test +// system is working. +// +// These tests use will break down the test runner badly in case of +// errors because if they simply fail, we can't be sure the developer +// will ever see anything (because failing means the failing system +// somehow isn't working! :-) +// +// Do not assume *any* internal functionality works as expected besides +// what's actually tested here. + +package check_test + +import ( + "fmt" + "github.com/magiconair/properties/_third_party/gopkg.in/check.v1" + "strings" +) + +type BootstrapS struct{} + +var boostrapS = check.Suite(&BootstrapS{}) + +func (s *BootstrapS) TestCountSuite(c *check.C) { + suitesRun += 1 +} + +func (s *BootstrapS) TestFailedAndFail(c *check.C) { + if c.Failed() { + critical("c.Failed() must be false first!") + } + c.Fail() + if !c.Failed() { + critical("c.Fail() didn't put the test in a failed state!") + } + c.Succeed() +} + +func (s *BootstrapS) TestFailedAndSucceed(c *check.C) { + c.Fail() + c.Succeed() + if c.Failed() { + critical("c.Succeed() didn't put the test back in a non-failed state") + } +} + +func (s *BootstrapS) TestLogAndGetTestLog(c *check.C) { + c.Log("Hello there!") + log := c.GetTestLog() + if log != "Hello there!\n" { + critical(fmt.Sprintf("Log() or GetTestLog() is not working! Got: %#v", log)) + } +} + +func (s *BootstrapS) TestLogfAndGetTestLog(c *check.C) { + c.Logf("Hello %v", "there!") + log := c.GetTestLog() + if log != "Hello there!\n" { + critical(fmt.Sprintf("Logf() or GetTestLog() is not working! Got: %#v", log)) + } +} + +func (s *BootstrapS) TestRunShowsErrors(c *check.C) { + output := String{} + check.Run(&FailHelper{}, &check.RunConf{Output: &output}) + if strings.Index(output.value, "Expected failure!") == -1 { + critical(fmt.Sprintf("RunWithWriter() output did not contain the "+ + "expected failure! Got: %#v", + output.value)) + } +} + +func (s *BootstrapS) TestRunDoesntShowSuccesses(c *check.C) { + output := String{} + check.Run(&SuccessHelper{}, &check.RunConf{Output: &output}) + if strings.Index(output.value, "Expected success!") != -1 { + critical(fmt.Sprintf("RunWithWriter() output contained a successful "+ + "test! Got: %#v", + output.value)) + } +} diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/check.go b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/check.go new file mode 100644 index 0000000000..ca8c0f92de --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/check.go @@ -0,0 +1,945 @@ +// Package check is a rich testing extension for Go's testing package. +// +// For details about the project, see: +// +// http://labix.org/gocheck +// +package check + +import ( + "bytes" + "errors" + "fmt" + "io" + "math/rand" + "os" + "path" + "path/filepath" + "reflect" + "regexp" + "runtime" + "strconv" + "strings" + "sync" + "time" +) + +// ----------------------------------------------------------------------- +// Internal type which deals with suite method calling. + +const ( + fixtureKd = iota + testKd +) + +type funcKind int + +const ( + succeededSt = iota + failedSt + skippedSt + panickedSt + fixturePanickedSt + missedSt +) + +type funcStatus int + +// A method value can't reach its own Method structure. +type methodType struct { + reflect.Value + Info reflect.Method +} + +func newMethod(receiver reflect.Value, i int) *methodType { + return &methodType{receiver.Method(i), receiver.Type().Method(i)} +} + +func (method *methodType) PC() uintptr { + return method.Info.Func.Pointer() +} + +func (method *methodType) suiteName() string { + t := method.Info.Type.In(0) + if t.Kind() == reflect.Ptr { + t = t.Elem() + } + return t.Name() +} + +func (method *methodType) String() string { + return method.suiteName() + "." + method.Info.Name +} + +func (method *methodType) matches(re *regexp.Regexp) bool { + return (re.MatchString(method.Info.Name) || + re.MatchString(method.suiteName()) || + re.MatchString(method.String())) +} + +type C struct { + method *methodType + kind funcKind + testName string + status funcStatus + logb *logger + logw io.Writer + done chan *C + reason string + mustFail bool + tempDir *tempDir + benchMem bool + startTime time.Time + timer +} + +func (c *C) stopNow() { + runtime.Goexit() +} + +// logger is a concurrency safe byte.Buffer +type logger struct { + sync.Mutex + writer bytes.Buffer +} + +func (l *logger) Write(buf []byte) (int, error) { + l.Lock() + defer l.Unlock() + return l.writer.Write(buf) +} + +func (l *logger) WriteTo(w io.Writer) (int64, error) { + l.Lock() + defer l.Unlock() + return l.writer.WriteTo(w) +} + +func (l *logger) String() string { + l.Lock() + defer l.Unlock() + return l.writer.String() +} + +// ----------------------------------------------------------------------- +// Handling of temporary files and directories. + +type tempDir struct { + sync.Mutex + path string + counter int +} + +func (td *tempDir) newPath() string { + td.Lock() + defer td.Unlock() + if td.path == "" { + var err error + for i := 0; i != 100; i++ { + path := fmt.Sprintf("%s%ccheck-%d", os.TempDir(), os.PathSeparator, rand.Int()) + if err = os.Mkdir(path, 0700); err == nil { + td.path = path + break + } + } + if td.path == "" { + panic("Couldn't create temporary directory: " + err.Error()) + } + } + result := filepath.Join(td.path, strconv.Itoa(td.counter)) + td.counter += 1 + return result +} + +func (td *tempDir) removeAll() { + td.Lock() + defer td.Unlock() + if td.path != "" { + err := os.RemoveAll(td.path) + if err != nil { + fmt.Fprintf(os.Stderr, "WARNING: Error cleaning up temporaries: "+err.Error()) + } + } +} + +// Create a new temporary directory which is automatically removed after +// the suite finishes running. +func (c *C) MkDir() string { + path := c.tempDir.newPath() + if err := os.Mkdir(path, 0700); err != nil { + panic(fmt.Sprintf("Couldn't create temporary directory %s: %s", path, err.Error())) + } + return path +} + +// ----------------------------------------------------------------------- +// Low-level logging functions. + +func (c *C) log(args ...interface{}) { + c.writeLog([]byte(fmt.Sprint(args...) + "\n")) +} + +func (c *C) logf(format string, args ...interface{}) { + c.writeLog([]byte(fmt.Sprintf(format+"\n", args...))) +} + +func (c *C) logNewLine() { + c.writeLog([]byte{'\n'}) +} + +func (c *C) writeLog(buf []byte) { + c.logb.Write(buf) + if c.logw != nil { + c.logw.Write(buf) + } +} + +func hasStringOrError(x interface{}) (ok bool) { + _, ok = x.(fmt.Stringer) + if ok { + return + } + _, ok = x.(error) + return +} + +func (c *C) logValue(label string, value interface{}) { + if label == "" { + if hasStringOrError(value) { + c.logf("... %#v (%q)", value, value) + } else { + c.logf("... %#v", value) + } + } else if value == nil { + c.logf("... %s = nil", label) + } else { + if hasStringOrError(value) { + fv := fmt.Sprintf("%#v", value) + qv := fmt.Sprintf("%q", value) + if fv != qv { + c.logf("... %s %s = %s (%s)", label, reflect.TypeOf(value), fv, qv) + return + } + } + if s, ok := value.(string); ok && isMultiLine(s) { + c.logf(`... %s %s = "" +`, label, reflect.TypeOf(value)) + c.logMultiLine(s) + } else { + c.logf("... %s %s = %#v", label, reflect.TypeOf(value), value) + } + } +} + +func (c *C) logMultiLine(s string) { + b := make([]byte, 0, len(s)*2) + i := 0 + n := len(s) + for i < n { + j := i + 1 + for j < n && s[j-1] != '\n' { + j++ + } + b = append(b, "... "...) + b = strconv.AppendQuote(b, s[i:j]) + if j < n { + b = append(b, " +"...) + } + b = append(b, '\n') + i = j + } + c.writeLog(b) +} + +func isMultiLine(s string) bool { + for i := 0; i+1 < len(s); i++ { + if s[i] == '\n' { + return true + } + } + return false +} + +func (c *C) logString(issue string) { + c.log("... ", issue) +} + +func (c *C) logCaller(skip int) { + // This is a bit heavier than it ought to be. + skip += 1 // Our own frame. + pc, callerFile, callerLine, ok := runtime.Caller(skip) + if !ok { + return + } + var testFile string + var testLine int + testFunc := runtime.FuncForPC(c.method.PC()) + if runtime.FuncForPC(pc) != testFunc { + for { + skip += 1 + if pc, file, line, ok := runtime.Caller(skip); ok { + // Note that the test line may be different on + // distinct calls for the same test. Showing + // the "internal" line is helpful when debugging. + if runtime.FuncForPC(pc) == testFunc { + testFile, testLine = file, line + break + } + } else { + break + } + } + } + if testFile != "" && (testFile != callerFile || testLine != callerLine) { + c.logCode(testFile, testLine) + } + c.logCode(callerFile, callerLine) +} + +func (c *C) logCode(path string, line int) { + c.logf("%s:%d:", nicePath(path), line) + code, err := printLine(path, line) + if code == "" { + code = "..." // XXX Open the file and take the raw line. + if err != nil { + code += err.Error() + } + } + c.log(indent(code, " ")) +} + +var valueGo = filepath.Join("reflect", "value.go") +var asmGo = filepath.Join("runtime", "asm_") + +func (c *C) logPanic(skip int, value interface{}) { + skip++ // Our own frame. + initialSkip := skip + for ; ; skip++ { + if pc, file, line, ok := runtime.Caller(skip); ok { + if skip == initialSkip { + c.logf("... Panic: %s (PC=0x%X)\n", value, pc) + } + name := niceFuncName(pc) + path := nicePath(file) + if strings.Contains(path, "/gopkg.in/check.v") { + continue + } + if name == "Value.call" && strings.HasSuffix(path, valueGo) { + continue + } + if name == "call16" && strings.Contains(path, asmGo) { + continue + } + c.logf("%s:%d\n in %s", nicePath(file), line, name) + } else { + break + } + } +} + +func (c *C) logSoftPanic(issue string) { + c.log("... Panic: ", issue) +} + +func (c *C) logArgPanic(method *methodType, expectedType string) { + c.logf("... Panic: %s argument should be %s", + niceFuncName(method.PC()), expectedType) +} + +// ----------------------------------------------------------------------- +// Some simple formatting helpers. + +var initWD, initWDErr = os.Getwd() + +func init() { + if initWDErr == nil { + initWD = strings.Replace(initWD, "\\", "/", -1) + "/" + } +} + +func nicePath(path string) string { + if initWDErr == nil { + if strings.HasPrefix(path, initWD) { + return path[len(initWD):] + } + } + return path +} + +func niceFuncPath(pc uintptr) string { + function := runtime.FuncForPC(pc) + if function != nil { + filename, line := function.FileLine(pc) + return fmt.Sprintf("%s:%d", nicePath(filename), line) + } + return "" +} + +func niceFuncName(pc uintptr) string { + function := runtime.FuncForPC(pc) + if function != nil { + name := path.Base(function.Name()) + if i := strings.Index(name, "."); i > 0 { + name = name[i+1:] + } + if strings.HasPrefix(name, "(*") { + if i := strings.Index(name, ")"); i > 0 { + name = name[2:i] + name[i+1:] + } + } + if i := strings.LastIndex(name, ".*"); i != -1 { + name = name[:i] + "." + name[i+2:] + } + if i := strings.LastIndex(name, "·"); i != -1 { + name = name[:i] + "." + name[i+2:] + } + return name + } + return "" +} + +// ----------------------------------------------------------------------- +// Result tracker to aggregate call results. + +type Result struct { + Succeeded int + Failed int + Skipped int + Panicked int + FixturePanicked int + ExpectedFailures int + Missed int // Not even tried to run, related to a panic in the fixture. + RunError error // Houston, we've got a problem. + WorkDir string // If KeepWorkDir is true +} + +type resultTracker struct { + result Result + _lastWasProblem bool + _waiting int + _missed int + _expectChan chan *C + _doneChan chan *C + _stopChan chan bool +} + +func newResultTracker() *resultTracker { + return &resultTracker{_expectChan: make(chan *C), // Synchronous + _doneChan: make(chan *C, 32), // Asynchronous + _stopChan: make(chan bool)} // Synchronous +} + +func (tracker *resultTracker) start() { + go tracker._loopRoutine() +} + +func (tracker *resultTracker) waitAndStop() { + <-tracker._stopChan +} + +func (tracker *resultTracker) expectCall(c *C) { + tracker._expectChan <- c +} + +func (tracker *resultTracker) callDone(c *C) { + tracker._doneChan <- c +} + +func (tracker *resultTracker) _loopRoutine() { + for { + var c *C + if tracker._waiting > 0 { + // Calls still running. Can't stop. + select { + // XXX Reindent this (not now to make diff clear) + case c = <-tracker._expectChan: + tracker._waiting += 1 + case c = <-tracker._doneChan: + tracker._waiting -= 1 + switch c.status { + case succeededSt: + if c.kind == testKd { + if c.mustFail { + tracker.result.ExpectedFailures++ + } else { + tracker.result.Succeeded++ + } + } + case failedSt: + tracker.result.Failed++ + case panickedSt: + if c.kind == fixtureKd { + tracker.result.FixturePanicked++ + } else { + tracker.result.Panicked++ + } + case fixturePanickedSt: + // Track it as missed, since the panic + // was on the fixture, not on the test. + tracker.result.Missed++ + case missedSt: + tracker.result.Missed++ + case skippedSt: + if c.kind == testKd { + tracker.result.Skipped++ + } + } + } + } else { + // No calls. Can stop, but no done calls here. + select { + case tracker._stopChan <- true: + return + case c = <-tracker._expectChan: + tracker._waiting += 1 + case c = <-tracker._doneChan: + panic("Tracker got an unexpected done call.") + } + } + } +} + +// ----------------------------------------------------------------------- +// The underlying suite runner. + +type suiteRunner struct { + suite interface{} + setUpSuite, tearDownSuite *methodType + setUpTest, tearDownTest *methodType + tests []*methodType + tracker *resultTracker + tempDir *tempDir + keepDir bool + output *outputWriter + reportedProblemLast bool + benchTime time.Duration + benchMem bool +} + +type RunConf struct { + Output io.Writer + Stream bool + Verbose bool + Filter string + Benchmark bool + BenchmarkTime time.Duration // Defaults to 1 second + BenchmarkMem bool + KeepWorkDir bool +} + +// Create a new suiteRunner able to run all methods in the given suite. +func newSuiteRunner(suite interface{}, runConf *RunConf) *suiteRunner { + var conf RunConf + if runConf != nil { + conf = *runConf + } + if conf.Output == nil { + conf.Output = os.Stdout + } + if conf.Benchmark { + conf.Verbose = true + } + + suiteType := reflect.TypeOf(suite) + suiteNumMethods := suiteType.NumMethod() + suiteValue := reflect.ValueOf(suite) + + runner := &suiteRunner{ + suite: suite, + output: newOutputWriter(conf.Output, conf.Stream, conf.Verbose), + tracker: newResultTracker(), + benchTime: conf.BenchmarkTime, + benchMem: conf.BenchmarkMem, + tempDir: &tempDir{}, + keepDir: conf.KeepWorkDir, + tests: make([]*methodType, 0, suiteNumMethods), + } + if runner.benchTime == 0 { + runner.benchTime = 1 * time.Second + } + + var filterRegexp *regexp.Regexp + if conf.Filter != "" { + if regexp, err := regexp.Compile(conf.Filter); err != nil { + msg := "Bad filter expression: " + err.Error() + runner.tracker.result.RunError = errors.New(msg) + return runner + } else { + filterRegexp = regexp + } + } + + for i := 0; i != suiteNumMethods; i++ { + method := newMethod(suiteValue, i) + switch method.Info.Name { + case "SetUpSuite": + runner.setUpSuite = method + case "TearDownSuite": + runner.tearDownSuite = method + case "SetUpTest": + runner.setUpTest = method + case "TearDownTest": + runner.tearDownTest = method + default: + prefix := "Test" + if conf.Benchmark { + prefix = "Benchmark" + } + if !strings.HasPrefix(method.Info.Name, prefix) { + continue + } + if filterRegexp == nil || method.matches(filterRegexp) { + runner.tests = append(runner.tests, method) + } + } + } + return runner +} + +// Run all methods in the given suite. +func (runner *suiteRunner) run() *Result { + if runner.tracker.result.RunError == nil && len(runner.tests) > 0 { + runner.tracker.start() + if runner.checkFixtureArgs() { + c := runner.runFixture(runner.setUpSuite, "", nil) + if c == nil || c.status == succeededSt { + for i := 0; i != len(runner.tests); i++ { + c := runner.runTest(runner.tests[i]) + if c.status == fixturePanickedSt { + runner.skipTests(missedSt, runner.tests[i+1:]) + break + } + } + } else if c != nil && c.status == skippedSt { + runner.skipTests(skippedSt, runner.tests) + } else { + runner.skipTests(missedSt, runner.tests) + } + runner.runFixture(runner.tearDownSuite, "", nil) + } else { + runner.skipTests(missedSt, runner.tests) + } + runner.tracker.waitAndStop() + if runner.keepDir { + runner.tracker.result.WorkDir = runner.tempDir.path + } else { + runner.tempDir.removeAll() + } + } + return &runner.tracker.result +} + +// Create a call object with the given suite method, and fork a +// goroutine with the provided dispatcher for running it. +func (runner *suiteRunner) forkCall(method *methodType, kind funcKind, testName string, logb *logger, dispatcher func(c *C)) *C { + var logw io.Writer + if runner.output.Stream { + logw = runner.output + } + if logb == nil { + logb = new(logger) + } + c := &C{ + method: method, + kind: kind, + testName: testName, + logb: logb, + logw: logw, + tempDir: runner.tempDir, + done: make(chan *C, 1), + timer: timer{benchTime: runner.benchTime}, + startTime: time.Now(), + benchMem: runner.benchMem, + } + runner.tracker.expectCall(c) + go (func() { + runner.reportCallStarted(c) + defer runner.callDone(c) + dispatcher(c) + })() + return c +} + +// Same as forkCall(), but wait for call to finish before returning. +func (runner *suiteRunner) runFunc(method *methodType, kind funcKind, testName string, logb *logger, dispatcher func(c *C)) *C { + c := runner.forkCall(method, kind, testName, logb, dispatcher) + <-c.done + return c +} + +// Handle a finished call. If there were any panics, update the call status +// accordingly. Then, mark the call as done and report to the tracker. +func (runner *suiteRunner) callDone(c *C) { + value := recover() + if value != nil { + switch v := value.(type) { + case *fixturePanic: + if v.status == skippedSt { + c.status = skippedSt + } else { + c.logSoftPanic("Fixture has panicked (see related PANIC)") + c.status = fixturePanickedSt + } + default: + c.logPanic(1, value) + c.status = panickedSt + } + } + if c.mustFail { + switch c.status { + case failedSt: + c.status = succeededSt + case succeededSt: + c.status = failedSt + c.logString("Error: Test succeeded, but was expected to fail") + c.logString("Reason: " + c.reason) + } + } + + runner.reportCallDone(c) + c.done <- c +} + +// Runs a fixture call synchronously. The fixture will still be run in a +// goroutine like all suite methods, but this method will not return +// while the fixture goroutine is not done, because the fixture must be +// run in a desired order. +func (runner *suiteRunner) runFixture(method *methodType, testName string, logb *logger) *C { + if method != nil { + c := runner.runFunc(method, fixtureKd, testName, logb, func(c *C) { + c.ResetTimer() + c.StartTimer() + defer c.StopTimer() + c.method.Call([]reflect.Value{reflect.ValueOf(c)}) + }) + return c + } + return nil +} + +// Run the fixture method with runFixture(), but panic with a fixturePanic{} +// in case the fixture method panics. This makes it easier to track the +// fixture panic together with other call panics within forkTest(). +func (runner *suiteRunner) runFixtureWithPanic(method *methodType, testName string, logb *logger, skipped *bool) *C { + if skipped != nil && *skipped { + return nil + } + c := runner.runFixture(method, testName, logb) + if c != nil && c.status != succeededSt { + if skipped != nil { + *skipped = c.status == skippedSt + } + panic(&fixturePanic{c.status, method}) + } + return c +} + +type fixturePanic struct { + status funcStatus + method *methodType +} + +// Run the suite test method, together with the test-specific fixture, +// asynchronously. +func (runner *suiteRunner) forkTest(method *methodType) *C { + testName := method.String() + return runner.forkCall(method, testKd, testName, nil, func(c *C) { + var skipped bool + defer runner.runFixtureWithPanic(runner.tearDownTest, testName, nil, &skipped) + defer c.StopTimer() + benchN := 1 + for { + runner.runFixtureWithPanic(runner.setUpTest, testName, c.logb, &skipped) + mt := c.method.Type() + if mt.NumIn() != 1 || mt.In(0) != reflect.TypeOf(c) { + // Rather than a plain panic, provide a more helpful message when + // the argument type is incorrect. + c.status = panickedSt + c.logArgPanic(c.method, "*check.C") + return + } + if strings.HasPrefix(c.method.Info.Name, "Test") { + c.ResetTimer() + c.StartTimer() + c.method.Call([]reflect.Value{reflect.ValueOf(c)}) + return + } + if !strings.HasPrefix(c.method.Info.Name, "Benchmark") { + panic("unexpected method prefix: " + c.method.Info.Name) + } + + runtime.GC() + c.N = benchN + c.ResetTimer() + c.StartTimer() + c.method.Call([]reflect.Value{reflect.ValueOf(c)}) + c.StopTimer() + if c.status != succeededSt || c.duration >= c.benchTime || benchN >= 1e9 { + return + } + perOpN := int(1e9) + if c.nsPerOp() != 0 { + perOpN = int(c.benchTime.Nanoseconds() / c.nsPerOp()) + } + + // Logic taken from the stock testing package: + // - Run more iterations than we think we'll need for a second (1.5x). + // - Don't grow too fast in case we had timing errors previously. + // - Be sure to run at least one more than last time. + benchN = max(min(perOpN+perOpN/2, 100*benchN), benchN+1) + benchN = roundUp(benchN) + + skipped = true // Don't run the deferred one if this panics. + runner.runFixtureWithPanic(runner.tearDownTest, testName, nil, nil) + skipped = false + } + }) +} + +// Same as forkTest(), but wait for the test to finish before returning. +func (runner *suiteRunner) runTest(method *methodType) *C { + c := runner.forkTest(method) + <-c.done + return c +} + +// Helper to mark tests as skipped or missed. A bit heavy for what +// it does, but it enables homogeneous handling of tracking, including +// nice verbose output. +func (runner *suiteRunner) skipTests(status funcStatus, methods []*methodType) { + for _, method := range methods { + runner.runFunc(method, testKd, "", nil, func(c *C) { + c.status = status + }) + } +} + +// Verify if the fixture arguments are *check.C. In case of errors, +// log the error as a panic in the fixture method call, and return false. +func (runner *suiteRunner) checkFixtureArgs() bool { + succeeded := true + argType := reflect.TypeOf(&C{}) + for _, method := range []*methodType{runner.setUpSuite, runner.tearDownSuite, runner.setUpTest, runner.tearDownTest} { + if method != nil { + mt := method.Type() + if mt.NumIn() != 1 || mt.In(0) != argType { + succeeded = false + runner.runFunc(method, fixtureKd, "", nil, func(c *C) { + c.logArgPanic(method, "*check.C") + c.status = panickedSt + }) + } + } + } + return succeeded +} + +func (runner *suiteRunner) reportCallStarted(c *C) { + runner.output.WriteCallStarted("START", c) +} + +func (runner *suiteRunner) reportCallDone(c *C) { + runner.tracker.callDone(c) + switch c.status { + case succeededSt: + if c.mustFail { + runner.output.WriteCallSuccess("FAIL EXPECTED", c) + } else { + runner.output.WriteCallSuccess("PASS", c) + } + case skippedSt: + runner.output.WriteCallSuccess("SKIP", c) + case failedSt: + runner.output.WriteCallProblem("FAIL", c) + case panickedSt: + runner.output.WriteCallProblem("PANIC", c) + case fixturePanickedSt: + // That's a testKd call reporting that its fixture + // has panicked. The fixture call which caused the + // panic itself was tracked above. We'll report to + // aid debugging. + runner.output.WriteCallProblem("PANIC", c) + case missedSt: + runner.output.WriteCallSuccess("MISS", c) + } +} + +// ----------------------------------------------------------------------- +// Output writer manages atomic output writing according to settings. + +type outputWriter struct { + m sync.Mutex + writer io.Writer + wroteCallProblemLast bool + Stream bool + Verbose bool +} + +func newOutputWriter(writer io.Writer, stream, verbose bool) *outputWriter { + return &outputWriter{writer: writer, Stream: stream, Verbose: verbose} +} + +func (ow *outputWriter) Write(content []byte) (n int, err error) { + ow.m.Lock() + n, err = ow.writer.Write(content) + ow.m.Unlock() + return +} + +func (ow *outputWriter) WriteCallStarted(label string, c *C) { + if ow.Stream { + header := renderCallHeader(label, c, "", "\n") + ow.m.Lock() + ow.writer.Write([]byte(header)) + ow.m.Unlock() + } +} + +func (ow *outputWriter) WriteCallProblem(label string, c *C) { + var prefix string + if !ow.Stream { + prefix = "\n-----------------------------------" + + "-----------------------------------\n" + } + header := renderCallHeader(label, c, prefix, "\n\n") + ow.m.Lock() + ow.wroteCallProblemLast = true + ow.writer.Write([]byte(header)) + if !ow.Stream { + c.logb.WriteTo(ow.writer) + } + ow.m.Unlock() +} + +func (ow *outputWriter) WriteCallSuccess(label string, c *C) { + if ow.Stream || (ow.Verbose && c.kind == testKd) { + // TODO Use a buffer here. + var suffix string + if c.reason != "" { + suffix = " (" + c.reason + ")" + } + if c.status == succeededSt { + suffix += "\t" + c.timerString() + } + suffix += "\n" + if ow.Stream { + suffix += "\n" + } + header := renderCallHeader(label, c, "", suffix) + ow.m.Lock() + // Resist temptation of using line as prefix above due to race. + if !ow.Stream && ow.wroteCallProblemLast { + header = "\n-----------------------------------" + + "-----------------------------------\n" + + header + } + ow.wroteCallProblemLast = false + ow.writer.Write([]byte(header)) + ow.m.Unlock() + } +} + +func renderCallHeader(label string, c *C, prefix, suffix string) string { + pc := c.method.PC() + return fmt.Sprintf("%s%s: %s: %s%s", prefix, label, niceFuncPath(pc), + niceFuncName(pc), suffix) +} diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/check_test.go b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/check_test.go new file mode 100644 index 0000000000..2fb8f897c9 --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/check_test.go @@ -0,0 +1,207 @@ +// This file contains just a few generic helpers which are used by the +// other test files. + +package check_test + +import ( + "flag" + "fmt" + "os" + "regexp" + "runtime" + "testing" + "time" + + "github.com/magiconair/properties/_third_party/gopkg.in/check.v1" +) + +// We count the number of suites run at least to get a vague hint that the +// test suite is behaving as it should. Otherwise a bug introduced at the +// very core of the system could go unperceived. +const suitesRunExpected = 8 + +var suitesRun int = 0 + +func Test(t *testing.T) { + check.TestingT(t) + if suitesRun != suitesRunExpected && flag.Lookup("check.f").Value.String() == "" { + critical(fmt.Sprintf("Expected %d suites to run rather than %d", + suitesRunExpected, suitesRun)) + } +} + +// ----------------------------------------------------------------------- +// Helper functions. + +// Break down badly. This is used in test cases which can't yet assume +// that the fundamental bits are working. +func critical(error string) { + fmt.Fprintln(os.Stderr, "CRITICAL: "+error) + os.Exit(1) +} + +// Return the file line where it's called. +func getMyLine() int { + if _, _, line, ok := runtime.Caller(1); ok { + return line + } + return -1 +} + +// ----------------------------------------------------------------------- +// Helper type implementing a basic io.Writer for testing output. + +// Type implementing the io.Writer interface for analyzing output. +type String struct { + value string +} + +// The only function required by the io.Writer interface. Will append +// written data to the String.value string. +func (s *String) Write(p []byte) (n int, err error) { + s.value += string(p) + return len(p), nil +} + +// Trivial wrapper to test errors happening on a different file +// than the test itself. +func checkEqualWrapper(c *check.C, obtained, expected interface{}) (result bool, line int) { + return c.Check(obtained, check.Equals, expected), getMyLine() +} + +// ----------------------------------------------------------------------- +// Helper suite for testing basic fail behavior. + +type FailHelper struct { + testLine int +} + +func (s *FailHelper) TestLogAndFail(c *check.C) { + s.testLine = getMyLine() - 1 + c.Log("Expected failure!") + c.Fail() +} + +// ----------------------------------------------------------------------- +// Helper suite for testing basic success behavior. + +type SuccessHelper struct{} + +func (s *SuccessHelper) TestLogAndSucceed(c *check.C) { + c.Log("Expected success!") +} + +// ----------------------------------------------------------------------- +// Helper suite for testing ordering and behavior of fixture. + +type FixtureHelper struct { + calls []string + panicOn string + skip bool + skipOnN int + sleepOn string + sleep time.Duration + bytes int64 +} + +func (s *FixtureHelper) trace(name string, c *check.C) { + s.calls = append(s.calls, name) + if name == s.panicOn { + panic(name) + } + if s.sleep > 0 && s.sleepOn == name { + time.Sleep(s.sleep) + } + if s.skip && s.skipOnN == len(s.calls)-1 { + c.Skip("skipOnN == n") + } +} + +func (s *FixtureHelper) SetUpSuite(c *check.C) { + s.trace("SetUpSuite", c) +} + +func (s *FixtureHelper) TearDownSuite(c *check.C) { + s.trace("TearDownSuite", c) +} + +func (s *FixtureHelper) SetUpTest(c *check.C) { + s.trace("SetUpTest", c) +} + +func (s *FixtureHelper) TearDownTest(c *check.C) { + s.trace("TearDownTest", c) +} + +func (s *FixtureHelper) Test1(c *check.C) { + s.trace("Test1", c) +} + +func (s *FixtureHelper) Test2(c *check.C) { + s.trace("Test2", c) +} + +func (s *FixtureHelper) Benchmark1(c *check.C) { + s.trace("Benchmark1", c) + for i := 0; i < c.N; i++ { + time.Sleep(s.sleep) + } +} + +func (s *FixtureHelper) Benchmark2(c *check.C) { + s.trace("Benchmark2", c) + c.SetBytes(1024) + for i := 0; i < c.N; i++ { + time.Sleep(s.sleep) + } +} + +func (s *FixtureHelper) Benchmark3(c *check.C) { + var x []int64 + s.trace("Benchmark3", c) + for i := 0; i < c.N; i++ { + time.Sleep(s.sleep) + x = make([]int64, 5) + _ = x + } +} + +// ----------------------------------------------------------------------- +// Helper which checks the state of the test and ensures that it matches +// the given expectations. Depends on c.Errorf() working, so shouldn't +// be used to test this one function. + +type expectedState struct { + name string + result interface{} + failed bool + log string +} + +// Verify the state of the test. Note that since this also verifies if +// the test is supposed to be in a failed state, no other checks should +// be done in addition to what is being tested. +func checkState(c *check.C, result interface{}, expected *expectedState) { + failed := c.Failed() + c.Succeed() + log := c.GetTestLog() + matched, matchError := regexp.MatchString("^"+expected.log+"$", log) + if matchError != nil { + c.Errorf("Error in matching expression used in testing %s", + expected.name) + } else if !matched { + c.Errorf("%s logged:\n----------\n%s----------\n\nExpected:\n----------\n%s\n----------", + expected.name, log, expected.log) + } + if result != expected.result { + c.Errorf("%s returned %#v rather than %#v", + expected.name, result, expected.result) + } + if failed != expected.failed { + if failed { + c.Errorf("%s has failed when it shouldn't", expected.name) + } else { + c.Errorf("%s has not failed when it should", expected.name) + } + } +} diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/checkers.go b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/checkers.go new file mode 100644 index 0000000000..bac338729c --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/checkers.go @@ -0,0 +1,458 @@ +package check + +import ( + "fmt" + "reflect" + "regexp" +) + +// ----------------------------------------------------------------------- +// CommentInterface and Commentf helper, to attach extra information to checks. + +type comment struct { + format string + args []interface{} +} + +// Commentf returns an infomational value to use with Assert or Check calls. +// If the checker test fails, the provided arguments will be passed to +// fmt.Sprintf, and will be presented next to the logged failure. +// +// For example: +// +// c.Assert(v, Equals, 42, Commentf("Iteration #%d failed.", i)) +// +// Note that if the comment is constant, a better option is to +// simply use a normal comment right above or next to the line, as +// it will also get printed with any errors: +// +// c.Assert(l, Equals, 8192) // Ensure buffer size is correct (bug #123) +// +func Commentf(format string, args ...interface{}) CommentInterface { + return &comment{format, args} +} + +// CommentInterface must be implemented by types that attach extra +// information to failed checks. See the Commentf function for details. +type CommentInterface interface { + CheckCommentString() string +} + +func (c *comment) CheckCommentString() string { + return fmt.Sprintf(c.format, c.args...) +} + +// ----------------------------------------------------------------------- +// The Checker interface. + +// The Checker interface must be provided by checkers used with +// the Assert and Check verification methods. +type Checker interface { + Info() *CheckerInfo + Check(params []interface{}, names []string) (result bool, error string) +} + +// See the Checker interface. +type CheckerInfo struct { + Name string + Params []string +} + +func (info *CheckerInfo) Info() *CheckerInfo { + return info +} + +// ----------------------------------------------------------------------- +// Not checker logic inverter. + +// The Not checker inverts the logic of the provided checker. The +// resulting checker will succeed where the original one failed, and +// vice-versa. +// +// For example: +// +// c.Assert(a, Not(Equals), b) +// +func Not(checker Checker) Checker { + return ¬Checker{checker} +} + +type notChecker struct { + sub Checker +} + +func (checker *notChecker) Info() *CheckerInfo { + info := *checker.sub.Info() + info.Name = "Not(" + info.Name + ")" + return &info +} + +func (checker *notChecker) Check(params []interface{}, names []string) (result bool, error string) { + result, error = checker.sub.Check(params, names) + result = !result + return +} + +// ----------------------------------------------------------------------- +// IsNil checker. + +type isNilChecker struct { + *CheckerInfo +} + +// The IsNil checker tests whether the obtained value is nil. +// +// For example: +// +// c.Assert(err, IsNil) +// +var IsNil Checker = &isNilChecker{ + &CheckerInfo{Name: "IsNil", Params: []string{"value"}}, +} + +func (checker *isNilChecker) Check(params []interface{}, names []string) (result bool, error string) { + return isNil(params[0]), "" +} + +func isNil(obtained interface{}) (result bool) { + if obtained == nil { + result = true + } else { + switch v := reflect.ValueOf(obtained); v.Kind() { + case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: + return v.IsNil() + } + } + return +} + +// ----------------------------------------------------------------------- +// NotNil checker. Alias for Not(IsNil), since it's so common. + +type notNilChecker struct { + *CheckerInfo +} + +// The NotNil checker verifies that the obtained value is not nil. +// +// For example: +// +// c.Assert(iface, NotNil) +// +// This is an alias for Not(IsNil), made available since it's a +// fairly common check. +// +var NotNil Checker = ¬NilChecker{ + &CheckerInfo{Name: "NotNil", Params: []string{"value"}}, +} + +func (checker *notNilChecker) Check(params []interface{}, names []string) (result bool, error string) { + return !isNil(params[0]), "" +} + +// ----------------------------------------------------------------------- +// Equals checker. + +type equalsChecker struct { + *CheckerInfo +} + +// The Equals checker verifies that the obtained value is equal to +// the expected value, according to usual Go semantics for ==. +// +// For example: +// +// c.Assert(value, Equals, 42) +// +var Equals Checker = &equalsChecker{ + &CheckerInfo{Name: "Equals", Params: []string{"obtained", "expected"}}, +} + +func (checker *equalsChecker) Check(params []interface{}, names []string) (result bool, error string) { + defer func() { + if v := recover(); v != nil { + result = false + error = fmt.Sprint(v) + } + }() + return params[0] == params[1], "" +} + +// ----------------------------------------------------------------------- +// DeepEquals checker. + +type deepEqualsChecker struct { + *CheckerInfo +} + +// The DeepEquals checker verifies that the obtained value is deep-equal to +// the expected value. The check will work correctly even when facing +// slices, interfaces, and values of different types (which always fail +// the test). +// +// For example: +// +// c.Assert(value, DeepEquals, 42) +// c.Assert(array, DeepEquals, []string{"hi", "there"}) +// +var DeepEquals Checker = &deepEqualsChecker{ + &CheckerInfo{Name: "DeepEquals", Params: []string{"obtained", "expected"}}, +} + +func (checker *deepEqualsChecker) Check(params []interface{}, names []string) (result bool, error string) { + return reflect.DeepEqual(params[0], params[1]), "" +} + +// ----------------------------------------------------------------------- +// HasLen checker. + +type hasLenChecker struct { + *CheckerInfo +} + +// The HasLen checker verifies that the obtained value has the +// provided length. In many cases this is superior to using Equals +// in conjuction with the len function because in case the check +// fails the value itself will be printed, instead of its length, +// providing more details for figuring the problem. +// +// For example: +// +// c.Assert(list, HasLen, 5) +// +var HasLen Checker = &hasLenChecker{ + &CheckerInfo{Name: "HasLen", Params: []string{"obtained", "n"}}, +} + +func (checker *hasLenChecker) Check(params []interface{}, names []string) (result bool, error string) { + n, ok := params[1].(int) + if !ok { + return false, "n must be an int" + } + value := reflect.ValueOf(params[0]) + switch value.Kind() { + case reflect.Map, reflect.Array, reflect.Slice, reflect.Chan, reflect.String: + default: + return false, "obtained value type has no length" + } + return value.Len() == n, "" +} + +// ----------------------------------------------------------------------- +// ErrorMatches checker. + +type errorMatchesChecker struct { + *CheckerInfo +} + +// The ErrorMatches checker verifies that the error value +// is non nil and matches the regular expression provided. +// +// For example: +// +// c.Assert(err, ErrorMatches, "perm.*denied") +// +var ErrorMatches Checker = errorMatchesChecker{ + &CheckerInfo{Name: "ErrorMatches", Params: []string{"value", "regex"}}, +} + +func (checker errorMatchesChecker) Check(params []interface{}, names []string) (result bool, errStr string) { + if params[0] == nil { + return false, "Error value is nil" + } + err, ok := params[0].(error) + if !ok { + return false, "Value is not an error" + } + params[0] = err.Error() + names[0] = "error" + return matches(params[0], params[1]) +} + +// ----------------------------------------------------------------------- +// Matches checker. + +type matchesChecker struct { + *CheckerInfo +} + +// The Matches checker verifies that the string provided as the obtained +// value (or the string resulting from obtained.String()) matches the +// regular expression provided. +// +// For example: +// +// c.Assert(err, Matches, "perm.*denied") +// +var Matches Checker = &matchesChecker{ + &CheckerInfo{Name: "Matches", Params: []string{"value", "regex"}}, +} + +func (checker *matchesChecker) Check(params []interface{}, names []string) (result bool, error string) { + return matches(params[0], params[1]) +} + +func matches(value, regex interface{}) (result bool, error string) { + reStr, ok := regex.(string) + if !ok { + return false, "Regex must be a string" + } + valueStr, valueIsStr := value.(string) + if !valueIsStr { + if valueWithStr, valueHasStr := value.(fmt.Stringer); valueHasStr { + valueStr, valueIsStr = valueWithStr.String(), true + } + } + if valueIsStr { + matches, err := regexp.MatchString("^"+reStr+"$", valueStr) + if err != nil { + return false, "Can't compile regex: " + err.Error() + } + return matches, "" + } + return false, "Obtained value is not a string and has no .String()" +} + +// ----------------------------------------------------------------------- +// Panics checker. + +type panicsChecker struct { + *CheckerInfo +} + +// The Panics checker verifies that calling the provided zero-argument +// function will cause a panic which is deep-equal to the provided value. +// +// For example: +// +// c.Assert(func() { f(1, 2) }, Panics, &SomeErrorType{"BOOM"}). +// +// +var Panics Checker = &panicsChecker{ + &CheckerInfo{Name: "Panics", Params: []string{"function", "expected"}}, +} + +func (checker *panicsChecker) Check(params []interface{}, names []string) (result bool, error string) { + f := reflect.ValueOf(params[0]) + if f.Kind() != reflect.Func || f.Type().NumIn() != 0 { + return false, "Function must take zero arguments" + } + defer func() { + // If the function has not panicked, then don't do the check. + if error != "" { + return + } + params[0] = recover() + names[0] = "panic" + result = reflect.DeepEqual(params[0], params[1]) + }() + f.Call(nil) + return false, "Function has not panicked" +} + +type panicMatchesChecker struct { + *CheckerInfo +} + +// The PanicMatches checker verifies that calling the provided zero-argument +// function will cause a panic with an error value matching +// the regular expression provided. +// +// For example: +// +// c.Assert(func() { f(1, 2) }, PanicMatches, `open.*: no such file or directory`). +// +// +var PanicMatches Checker = &panicMatchesChecker{ + &CheckerInfo{Name: "PanicMatches", Params: []string{"function", "expected"}}, +} + +func (checker *panicMatchesChecker) Check(params []interface{}, names []string) (result bool, errmsg string) { + f := reflect.ValueOf(params[0]) + if f.Kind() != reflect.Func || f.Type().NumIn() != 0 { + return false, "Function must take zero arguments" + } + defer func() { + // If the function has not panicked, then don't do the check. + if errmsg != "" { + return + } + obtained := recover() + names[0] = "panic" + if e, ok := obtained.(error); ok { + params[0] = e.Error() + } else if _, ok := obtained.(string); ok { + params[0] = obtained + } else { + errmsg = "Panic value is not a string or an error" + return + } + result, errmsg = matches(params[0], params[1]) + }() + f.Call(nil) + return false, "Function has not panicked" +} + +// ----------------------------------------------------------------------- +// FitsTypeOf checker. + +type fitsTypeChecker struct { + *CheckerInfo +} + +// The FitsTypeOf checker verifies that the obtained value is +// assignable to a variable with the same type as the provided +// sample value. +// +// For example: +// +// c.Assert(value, FitsTypeOf, int64(0)) +// c.Assert(value, FitsTypeOf, os.Error(nil)) +// +var FitsTypeOf Checker = &fitsTypeChecker{ + &CheckerInfo{Name: "FitsTypeOf", Params: []string{"obtained", "sample"}}, +} + +func (checker *fitsTypeChecker) Check(params []interface{}, names []string) (result bool, error string) { + obtained := reflect.ValueOf(params[0]) + sample := reflect.ValueOf(params[1]) + if !obtained.IsValid() { + return false, "" + } + if !sample.IsValid() { + return false, "Invalid sample value" + } + return obtained.Type().AssignableTo(sample.Type()), "" +} + +// ----------------------------------------------------------------------- +// Implements checker. + +type implementsChecker struct { + *CheckerInfo +} + +// The Implements checker verifies that the obtained value +// implements the interface specified via a pointer to an interface +// variable. +// +// For example: +// +// var e os.Error +// c.Assert(err, Implements, &e) +// +var Implements Checker = &implementsChecker{ + &CheckerInfo{Name: "Implements", Params: []string{"obtained", "ifaceptr"}}, +} + +func (checker *implementsChecker) Check(params []interface{}, names []string) (result bool, error string) { + obtained := reflect.ValueOf(params[0]) + ifaceptr := reflect.ValueOf(params[1]) + if !obtained.IsValid() { + return false, "" + } + if !ifaceptr.IsValid() || ifaceptr.Kind() != reflect.Ptr || ifaceptr.Elem().Kind() != reflect.Interface { + return false, "ifaceptr should be a pointer to an interface variable" + } + return obtained.Type().Implements(ifaceptr.Elem().Type()), "" +} diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/checkers_test.go b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/checkers_test.go new file mode 100644 index 0000000000..2da898af29 --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/checkers_test.go @@ -0,0 +1,272 @@ +package check_test + +import ( + "errors" + "github.com/magiconair/properties/_third_party/gopkg.in/check.v1" + "reflect" + "runtime" +) + +type CheckersS struct{} + +var _ = check.Suite(&CheckersS{}) + +func testInfo(c *check.C, checker check.Checker, name string, paramNames []string) { + info := checker.Info() + if info.Name != name { + c.Fatalf("Got name %s, expected %s", info.Name, name) + } + if !reflect.DeepEqual(info.Params, paramNames) { + c.Fatalf("Got param names %#v, expected %#v", info.Params, paramNames) + } +} + +func testCheck(c *check.C, checker check.Checker, result bool, error string, params ...interface{}) ([]interface{}, []string) { + info := checker.Info() + if len(params) != len(info.Params) { + c.Fatalf("unexpected param count in test; expected %d got %d", len(info.Params), len(params)) + } + names := append([]string{}, info.Params...) + result_, error_ := checker.Check(params, names) + if result_ != result || error_ != error { + c.Fatalf("%s.Check(%#v) returned (%#v, %#v) rather than (%#v, %#v)", + info.Name, params, result_, error_, result, error) + } + return params, names +} + +func (s *CheckersS) TestComment(c *check.C) { + bug := check.Commentf("a %d bc", 42) + comment := bug.CheckCommentString() + if comment != "a 42 bc" { + c.Fatalf("Commentf returned %#v", comment) + } +} + +func (s *CheckersS) TestIsNil(c *check.C) { + testInfo(c, check.IsNil, "IsNil", []string{"value"}) + + testCheck(c, check.IsNil, true, "", nil) + testCheck(c, check.IsNil, false, "", "a") + + testCheck(c, check.IsNil, true, "", (chan int)(nil)) + testCheck(c, check.IsNil, false, "", make(chan int)) + testCheck(c, check.IsNil, true, "", (error)(nil)) + testCheck(c, check.IsNil, false, "", errors.New("")) + testCheck(c, check.IsNil, true, "", ([]int)(nil)) + testCheck(c, check.IsNil, false, "", make([]int, 1)) + testCheck(c, check.IsNil, false, "", int(0)) +} + +func (s *CheckersS) TestNotNil(c *check.C) { + testInfo(c, check.NotNil, "NotNil", []string{"value"}) + + testCheck(c, check.NotNil, false, "", nil) + testCheck(c, check.NotNil, true, "", "a") + + testCheck(c, check.NotNil, false, "", (chan int)(nil)) + testCheck(c, check.NotNil, true, "", make(chan int)) + testCheck(c, check.NotNil, false, "", (error)(nil)) + testCheck(c, check.NotNil, true, "", errors.New("")) + testCheck(c, check.NotNil, false, "", ([]int)(nil)) + testCheck(c, check.NotNil, true, "", make([]int, 1)) +} + +func (s *CheckersS) TestNot(c *check.C) { + testInfo(c, check.Not(check.IsNil), "Not(IsNil)", []string{"value"}) + + testCheck(c, check.Not(check.IsNil), false, "", nil) + testCheck(c, check.Not(check.IsNil), true, "", "a") +} + +type simpleStruct struct { + i int +} + +func (s *CheckersS) TestEquals(c *check.C) { + testInfo(c, check.Equals, "Equals", []string{"obtained", "expected"}) + + // The simplest. + testCheck(c, check.Equals, true, "", 42, 42) + testCheck(c, check.Equals, false, "", 42, 43) + + // Different native types. + testCheck(c, check.Equals, false, "", int32(42), int64(42)) + + // With nil. + testCheck(c, check.Equals, false, "", 42, nil) + + // Slices + testCheck(c, check.Equals, false, "runtime error: comparing uncomparable type []uint8", []byte{1, 2}, []byte{1, 2}) + + // Struct values + testCheck(c, check.Equals, true, "", simpleStruct{1}, simpleStruct{1}) + testCheck(c, check.Equals, false, "", simpleStruct{1}, simpleStruct{2}) + + // Struct pointers + testCheck(c, check.Equals, false, "", &simpleStruct{1}, &simpleStruct{1}) + testCheck(c, check.Equals, false, "", &simpleStruct{1}, &simpleStruct{2}) +} + +func (s *CheckersS) TestDeepEquals(c *check.C) { + testInfo(c, check.DeepEquals, "DeepEquals", []string{"obtained", "expected"}) + + // The simplest. + testCheck(c, check.DeepEquals, true, "", 42, 42) + testCheck(c, check.DeepEquals, false, "", 42, 43) + + // Different native types. + testCheck(c, check.DeepEquals, false, "", int32(42), int64(42)) + + // With nil. + testCheck(c, check.DeepEquals, false, "", 42, nil) + + // Slices + testCheck(c, check.DeepEquals, true, "", []byte{1, 2}, []byte{1, 2}) + testCheck(c, check.DeepEquals, false, "", []byte{1, 2}, []byte{1, 3}) + + // Struct values + testCheck(c, check.DeepEquals, true, "", simpleStruct{1}, simpleStruct{1}) + testCheck(c, check.DeepEquals, false, "", simpleStruct{1}, simpleStruct{2}) + + // Struct pointers + testCheck(c, check.DeepEquals, true, "", &simpleStruct{1}, &simpleStruct{1}) + testCheck(c, check.DeepEquals, false, "", &simpleStruct{1}, &simpleStruct{2}) +} + +func (s *CheckersS) TestHasLen(c *check.C) { + testInfo(c, check.HasLen, "HasLen", []string{"obtained", "n"}) + + testCheck(c, check.HasLen, true, "", "abcd", 4) + testCheck(c, check.HasLen, true, "", []int{1, 2}, 2) + testCheck(c, check.HasLen, false, "", []int{1, 2}, 3) + + testCheck(c, check.HasLen, false, "n must be an int", []int{1, 2}, "2") + testCheck(c, check.HasLen, false, "obtained value type has no length", nil, 2) +} + +func (s *CheckersS) TestErrorMatches(c *check.C) { + testInfo(c, check.ErrorMatches, "ErrorMatches", []string{"value", "regex"}) + + testCheck(c, check.ErrorMatches, false, "Error value is nil", nil, "some error") + testCheck(c, check.ErrorMatches, false, "Value is not an error", 1, "some error") + testCheck(c, check.ErrorMatches, true, "", errors.New("some error"), "some error") + testCheck(c, check.ErrorMatches, true, "", errors.New("some error"), "so.*or") + + // Verify params mutation + params, names := testCheck(c, check.ErrorMatches, false, "", errors.New("some error"), "other error") + c.Assert(params[0], check.Equals, "some error") + c.Assert(names[0], check.Equals, "error") +} + +func (s *CheckersS) TestMatches(c *check.C) { + testInfo(c, check.Matches, "Matches", []string{"value", "regex"}) + + // Simple matching + testCheck(c, check.Matches, true, "", "abc", "abc") + testCheck(c, check.Matches, true, "", "abc", "a.c") + + // Must match fully + testCheck(c, check.Matches, false, "", "abc", "ab") + testCheck(c, check.Matches, false, "", "abc", "bc") + + // String()-enabled values accepted + testCheck(c, check.Matches, true, "", reflect.ValueOf("abc"), "a.c") + testCheck(c, check.Matches, false, "", reflect.ValueOf("abc"), "a.d") + + // Some error conditions. + testCheck(c, check.Matches, false, "Obtained value is not a string and has no .String()", 1, "a.c") + testCheck(c, check.Matches, false, "Can't compile regex: error parsing regexp: missing closing ]: `[c$`", "abc", "a[c") +} + +func (s *CheckersS) TestPanics(c *check.C) { + testInfo(c, check.Panics, "Panics", []string{"function", "expected"}) + + // Some errors. + testCheck(c, check.Panics, false, "Function has not panicked", func() bool { return false }, "BOOM") + testCheck(c, check.Panics, false, "Function must take zero arguments", 1, "BOOM") + + // Plain strings. + testCheck(c, check.Panics, true, "", func() { panic("BOOM") }, "BOOM") + testCheck(c, check.Panics, false, "", func() { panic("KABOOM") }, "BOOM") + testCheck(c, check.Panics, true, "", func() bool { panic("BOOM") }, "BOOM") + + // Error values. + testCheck(c, check.Panics, true, "", func() { panic(errors.New("BOOM")) }, errors.New("BOOM")) + testCheck(c, check.Panics, false, "", func() { panic(errors.New("KABOOM")) }, errors.New("BOOM")) + + type deep struct{ i int } + // Deep value + testCheck(c, check.Panics, true, "", func() { panic(&deep{99}) }, &deep{99}) + + // Verify params/names mutation + params, names := testCheck(c, check.Panics, false, "", func() { panic(errors.New("KABOOM")) }, errors.New("BOOM")) + c.Assert(params[0], check.ErrorMatches, "KABOOM") + c.Assert(names[0], check.Equals, "panic") + + // Verify a nil panic + testCheck(c, check.Panics, true, "", func() { panic(nil) }, nil) + testCheck(c, check.Panics, false, "", func() { panic(nil) }, "NOPE") +} + +func (s *CheckersS) TestPanicMatches(c *check.C) { + testInfo(c, check.PanicMatches, "PanicMatches", []string{"function", "expected"}) + + // Error matching. + testCheck(c, check.PanicMatches, true, "", func() { panic(errors.New("BOOM")) }, "BO.M") + testCheck(c, check.PanicMatches, false, "", func() { panic(errors.New("KABOOM")) }, "BO.M") + + // Some errors. + testCheck(c, check.PanicMatches, false, "Function has not panicked", func() bool { return false }, "BOOM") + testCheck(c, check.PanicMatches, false, "Function must take zero arguments", 1, "BOOM") + + // Plain strings. + testCheck(c, check.PanicMatches, true, "", func() { panic("BOOM") }, "BO.M") + testCheck(c, check.PanicMatches, false, "", func() { panic("KABOOM") }, "BOOM") + testCheck(c, check.PanicMatches, true, "", func() bool { panic("BOOM") }, "BO.M") + + // Verify params/names mutation + params, names := testCheck(c, check.PanicMatches, false, "", func() { panic(errors.New("KABOOM")) }, "BOOM") + c.Assert(params[0], check.Equals, "KABOOM") + c.Assert(names[0], check.Equals, "panic") + + // Verify a nil panic + testCheck(c, check.PanicMatches, false, "Panic value is not a string or an error", func() { panic(nil) }, "") +} + +func (s *CheckersS) TestFitsTypeOf(c *check.C) { + testInfo(c, check.FitsTypeOf, "FitsTypeOf", []string{"obtained", "sample"}) + + // Basic types + testCheck(c, check.FitsTypeOf, true, "", 1, 0) + testCheck(c, check.FitsTypeOf, false, "", 1, int64(0)) + + // Aliases + testCheck(c, check.FitsTypeOf, false, "", 1, errors.New("")) + testCheck(c, check.FitsTypeOf, false, "", "error", errors.New("")) + testCheck(c, check.FitsTypeOf, true, "", errors.New("error"), errors.New("")) + + // Structures + testCheck(c, check.FitsTypeOf, false, "", 1, simpleStruct{}) + testCheck(c, check.FitsTypeOf, false, "", simpleStruct{42}, &simpleStruct{}) + testCheck(c, check.FitsTypeOf, true, "", simpleStruct{42}, simpleStruct{}) + testCheck(c, check.FitsTypeOf, true, "", &simpleStruct{42}, &simpleStruct{}) + + // Some bad values + testCheck(c, check.FitsTypeOf, false, "Invalid sample value", 1, interface{}(nil)) + testCheck(c, check.FitsTypeOf, false, "", interface{}(nil), 0) +} + +func (s *CheckersS) TestImplements(c *check.C) { + testInfo(c, check.Implements, "Implements", []string{"obtained", "ifaceptr"}) + + var e error + var re runtime.Error + testCheck(c, check.Implements, true, "", errors.New(""), &e) + testCheck(c, check.Implements, false, "", errors.New(""), &re) + + // Some bad values + testCheck(c, check.Implements, false, "ifaceptr should be a pointer to an interface variable", 0, errors.New("")) + testCheck(c, check.Implements, false, "ifaceptr should be a pointer to an interface variable", 0, interface{}(nil)) + testCheck(c, check.Implements, false, "", interface{}(nil), &e) +} diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/export_test.go b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/export_test.go new file mode 100644 index 0000000000..0e6cfe0f22 --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/export_test.go @@ -0,0 +1,9 @@ +package check + +func PrintLine(filename string, line int) (string, error) { + return printLine(filename, line) +} + +func Indent(s, with string) string { + return indent(s, with) +} diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/fixture_test.go b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/fixture_test.go new file mode 100644 index 0000000000..eaff23a1b9 --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/fixture_test.go @@ -0,0 +1,484 @@ +// Tests for the behavior of the test fixture system. + +package check_test + +import ( + . "github.com/magiconair/properties/_third_party/gopkg.in/check.v1" +) + +// ----------------------------------------------------------------------- +// Fixture test suite. + +type FixtureS struct{} + +var fixtureS = Suite(&FixtureS{}) + +func (s *FixtureS) TestCountSuite(c *C) { + suitesRun += 1 +} + +// ----------------------------------------------------------------------- +// Basic fixture ordering verification. + +func (s *FixtureS) TestOrder(c *C) { + helper := FixtureHelper{} + Run(&helper, nil) + c.Check(helper.calls[0], Equals, "SetUpSuite") + c.Check(helper.calls[1], Equals, "SetUpTest") + c.Check(helper.calls[2], Equals, "Test1") + c.Check(helper.calls[3], Equals, "TearDownTest") + c.Check(helper.calls[4], Equals, "SetUpTest") + c.Check(helper.calls[5], Equals, "Test2") + c.Check(helper.calls[6], Equals, "TearDownTest") + c.Check(helper.calls[7], Equals, "TearDownSuite") + c.Check(len(helper.calls), Equals, 8) +} + +// ----------------------------------------------------------------------- +// Check the behavior when panics occur within tests and fixtures. + +func (s *FixtureS) TestPanicOnTest(c *C) { + helper := FixtureHelper{panicOn: "Test1"} + output := String{} + Run(&helper, &RunConf{Output: &output}) + c.Check(helper.calls[0], Equals, "SetUpSuite") + c.Check(helper.calls[1], Equals, "SetUpTest") + c.Check(helper.calls[2], Equals, "Test1") + c.Check(helper.calls[3], Equals, "TearDownTest") + c.Check(helper.calls[4], Equals, "SetUpTest") + c.Check(helper.calls[5], Equals, "Test2") + c.Check(helper.calls[6], Equals, "TearDownTest") + c.Check(helper.calls[7], Equals, "TearDownSuite") + c.Check(len(helper.calls), Equals, 8) + + expected := "^\n-+\n" + + "PANIC: check_test\\.go:[0-9]+: FixtureHelper.Test1\n\n" + + "\\.\\.\\. Panic: Test1 \\(PC=[xA-F0-9]+\\)\n\n" + + ".+:[0-9]+\n" + + " in (go)?panic\n" + + ".*check_test.go:[0-9]+\n" + + " in FixtureHelper.trace\n" + + ".*check_test.go:[0-9]+\n" + + " in FixtureHelper.Test1\n" + + "(.|\n)*$" + + c.Check(output.value, Matches, expected) +} + +func (s *FixtureS) TestPanicOnSetUpTest(c *C) { + helper := FixtureHelper{panicOn: "SetUpTest"} + output := String{} + Run(&helper, &RunConf{Output: &output}) + c.Check(helper.calls[0], Equals, "SetUpSuite") + c.Check(helper.calls[1], Equals, "SetUpTest") + c.Check(helper.calls[2], Equals, "TearDownTest") + c.Check(helper.calls[3], Equals, "TearDownSuite") + c.Check(len(helper.calls), Equals, 4) + + expected := "^\n-+\n" + + "PANIC: check_test\\.go:[0-9]+: " + + "FixtureHelper\\.SetUpTest\n\n" + + "\\.\\.\\. Panic: SetUpTest \\(PC=[xA-F0-9]+\\)\n\n" + + ".+:[0-9]+\n" + + " in (go)?panic\n" + + ".*check_test.go:[0-9]+\n" + + " in FixtureHelper.trace\n" + + ".*check_test.go:[0-9]+\n" + + " in FixtureHelper.SetUpTest\n" + + "(.|\n)*" + + "\n-+\n" + + "PANIC: check_test\\.go:[0-9]+: " + + "FixtureHelper\\.Test1\n\n" + + "\\.\\.\\. Panic: Fixture has panicked " + + "\\(see related PANIC\\)\n$" + + c.Check(output.value, Matches, expected) +} + +func (s *FixtureS) TestPanicOnTearDownTest(c *C) { + helper := FixtureHelper{panicOn: "TearDownTest"} + output := String{} + Run(&helper, &RunConf{Output: &output}) + c.Check(helper.calls[0], Equals, "SetUpSuite") + c.Check(helper.calls[1], Equals, "SetUpTest") + c.Check(helper.calls[2], Equals, "Test1") + c.Check(helper.calls[3], Equals, "TearDownTest") + c.Check(helper.calls[4], Equals, "TearDownSuite") + c.Check(len(helper.calls), Equals, 5) + + expected := "^\n-+\n" + + "PANIC: check_test\\.go:[0-9]+: " + + "FixtureHelper.TearDownTest\n\n" + + "\\.\\.\\. Panic: TearDownTest \\(PC=[xA-F0-9]+\\)\n\n" + + ".+:[0-9]+\n" + + " in (go)?panic\n" + + ".*check_test.go:[0-9]+\n" + + " in FixtureHelper.trace\n" + + ".*check_test.go:[0-9]+\n" + + " in FixtureHelper.TearDownTest\n" + + "(.|\n)*" + + "\n-+\n" + + "PANIC: check_test\\.go:[0-9]+: " + + "FixtureHelper\\.Test1\n\n" + + "\\.\\.\\. Panic: Fixture has panicked " + + "\\(see related PANIC\\)\n$" + + c.Check(output.value, Matches, expected) +} + +func (s *FixtureS) TestPanicOnSetUpSuite(c *C) { + helper := FixtureHelper{panicOn: "SetUpSuite"} + output := String{} + Run(&helper, &RunConf{Output: &output}) + c.Check(helper.calls[0], Equals, "SetUpSuite") + c.Check(helper.calls[1], Equals, "TearDownSuite") + c.Check(len(helper.calls), Equals, 2) + + expected := "^\n-+\n" + + "PANIC: check_test\\.go:[0-9]+: " + + "FixtureHelper.SetUpSuite\n\n" + + "\\.\\.\\. Panic: SetUpSuite \\(PC=[xA-F0-9]+\\)\n\n" + + ".+:[0-9]+\n" + + " in (go)?panic\n" + + ".*check_test.go:[0-9]+\n" + + " in FixtureHelper.trace\n" + + ".*check_test.go:[0-9]+\n" + + " in FixtureHelper.SetUpSuite\n" + + "(.|\n)*$" + + c.Check(output.value, Matches, expected) +} + +func (s *FixtureS) TestPanicOnTearDownSuite(c *C) { + helper := FixtureHelper{panicOn: "TearDownSuite"} + output := String{} + Run(&helper, &RunConf{Output: &output}) + c.Check(helper.calls[0], Equals, "SetUpSuite") + c.Check(helper.calls[1], Equals, "SetUpTest") + c.Check(helper.calls[2], Equals, "Test1") + c.Check(helper.calls[3], Equals, "TearDownTest") + c.Check(helper.calls[4], Equals, "SetUpTest") + c.Check(helper.calls[5], Equals, "Test2") + c.Check(helper.calls[6], Equals, "TearDownTest") + c.Check(helper.calls[7], Equals, "TearDownSuite") + c.Check(len(helper.calls), Equals, 8) + + expected := "^\n-+\n" + + "PANIC: check_test\\.go:[0-9]+: " + + "FixtureHelper.TearDownSuite\n\n" + + "\\.\\.\\. Panic: TearDownSuite \\(PC=[xA-F0-9]+\\)\n\n" + + ".+:[0-9]+\n" + + " in (go)?panic\n" + + ".*check_test.go:[0-9]+\n" + + " in FixtureHelper.trace\n" + + ".*check_test.go:[0-9]+\n" + + " in FixtureHelper.TearDownSuite\n" + + "(.|\n)*$" + + c.Check(output.value, Matches, expected) +} + +// ----------------------------------------------------------------------- +// A wrong argument on a test or fixture will produce a nice error. + +func (s *FixtureS) TestPanicOnWrongTestArg(c *C) { + helper := WrongTestArgHelper{} + output := String{} + Run(&helper, &RunConf{Output: &output}) + c.Check(helper.calls[0], Equals, "SetUpSuite") + c.Check(helper.calls[1], Equals, "SetUpTest") + c.Check(helper.calls[2], Equals, "TearDownTest") + c.Check(helper.calls[3], Equals, "SetUpTest") + c.Check(helper.calls[4], Equals, "Test2") + c.Check(helper.calls[5], Equals, "TearDownTest") + c.Check(helper.calls[6], Equals, "TearDownSuite") + c.Check(len(helper.calls), Equals, 7) + + expected := "^\n-+\n" + + "PANIC: fixture_test\\.go:[0-9]+: " + + "WrongTestArgHelper\\.Test1\n\n" + + "\\.\\.\\. Panic: WrongTestArgHelper\\.Test1 argument " + + "should be \\*check\\.C\n" + + c.Check(output.value, Matches, expected) +} + +func (s *FixtureS) TestPanicOnWrongSetUpTestArg(c *C) { + helper := WrongSetUpTestArgHelper{} + output := String{} + Run(&helper, &RunConf{Output: &output}) + c.Check(len(helper.calls), Equals, 0) + + expected := + "^\n-+\n" + + "PANIC: fixture_test\\.go:[0-9]+: " + + "WrongSetUpTestArgHelper\\.SetUpTest\n\n" + + "\\.\\.\\. Panic: WrongSetUpTestArgHelper\\.SetUpTest argument " + + "should be \\*check\\.C\n" + + c.Check(output.value, Matches, expected) +} + +func (s *FixtureS) TestPanicOnWrongSetUpSuiteArg(c *C) { + helper := WrongSetUpSuiteArgHelper{} + output := String{} + Run(&helper, &RunConf{Output: &output}) + c.Check(len(helper.calls), Equals, 0) + + expected := + "^\n-+\n" + + "PANIC: fixture_test\\.go:[0-9]+: " + + "WrongSetUpSuiteArgHelper\\.SetUpSuite\n\n" + + "\\.\\.\\. Panic: WrongSetUpSuiteArgHelper\\.SetUpSuite argument " + + "should be \\*check\\.C\n" + + c.Check(output.value, Matches, expected) +} + +// ----------------------------------------------------------------------- +// Nice errors also when tests or fixture have wrong arg count. + +func (s *FixtureS) TestPanicOnWrongTestArgCount(c *C) { + helper := WrongTestArgCountHelper{} + output := String{} + Run(&helper, &RunConf{Output: &output}) + c.Check(helper.calls[0], Equals, "SetUpSuite") + c.Check(helper.calls[1], Equals, "SetUpTest") + c.Check(helper.calls[2], Equals, "TearDownTest") + c.Check(helper.calls[3], Equals, "SetUpTest") + c.Check(helper.calls[4], Equals, "Test2") + c.Check(helper.calls[5], Equals, "TearDownTest") + c.Check(helper.calls[6], Equals, "TearDownSuite") + c.Check(len(helper.calls), Equals, 7) + + expected := "^\n-+\n" + + "PANIC: fixture_test\\.go:[0-9]+: " + + "WrongTestArgCountHelper\\.Test1\n\n" + + "\\.\\.\\. Panic: WrongTestArgCountHelper\\.Test1 argument " + + "should be \\*check\\.C\n" + + c.Check(output.value, Matches, expected) +} + +func (s *FixtureS) TestPanicOnWrongSetUpTestArgCount(c *C) { + helper := WrongSetUpTestArgCountHelper{} + output := String{} + Run(&helper, &RunConf{Output: &output}) + c.Check(len(helper.calls), Equals, 0) + + expected := + "^\n-+\n" + + "PANIC: fixture_test\\.go:[0-9]+: " + + "WrongSetUpTestArgCountHelper\\.SetUpTest\n\n" + + "\\.\\.\\. Panic: WrongSetUpTestArgCountHelper\\.SetUpTest argument " + + "should be \\*check\\.C\n" + + c.Check(output.value, Matches, expected) +} + +func (s *FixtureS) TestPanicOnWrongSetUpSuiteArgCount(c *C) { + helper := WrongSetUpSuiteArgCountHelper{} + output := String{} + Run(&helper, &RunConf{Output: &output}) + c.Check(len(helper.calls), Equals, 0) + + expected := + "^\n-+\n" + + "PANIC: fixture_test\\.go:[0-9]+: " + + "WrongSetUpSuiteArgCountHelper\\.SetUpSuite\n\n" + + "\\.\\.\\. Panic: WrongSetUpSuiteArgCountHelper" + + "\\.SetUpSuite argument should be \\*check\\.C\n" + + c.Check(output.value, Matches, expected) +} + +// ----------------------------------------------------------------------- +// Helper test suites with wrong function arguments. + +type WrongTestArgHelper struct { + FixtureHelper +} + +func (s *WrongTestArgHelper) Test1(t int) { +} + +type WrongSetUpTestArgHelper struct { + FixtureHelper +} + +func (s *WrongSetUpTestArgHelper) SetUpTest(t int) { +} + +type WrongSetUpSuiteArgHelper struct { + FixtureHelper +} + +func (s *WrongSetUpSuiteArgHelper) SetUpSuite(t int) { +} + +type WrongTestArgCountHelper struct { + FixtureHelper +} + +func (s *WrongTestArgCountHelper) Test1(c *C, i int) { +} + +type WrongSetUpTestArgCountHelper struct { + FixtureHelper +} + +func (s *WrongSetUpTestArgCountHelper) SetUpTest(c *C, i int) { +} + +type WrongSetUpSuiteArgCountHelper struct { + FixtureHelper +} + +func (s *WrongSetUpSuiteArgCountHelper) SetUpSuite(c *C, i int) { +} + +// ----------------------------------------------------------------------- +// Ensure fixture doesn't run without tests. + +type NoTestsHelper struct { + hasRun bool +} + +func (s *NoTestsHelper) SetUpSuite(c *C) { + s.hasRun = true +} + +func (s *NoTestsHelper) TearDownSuite(c *C) { + s.hasRun = true +} + +func (s *FixtureS) TestFixtureDoesntRunWithoutTests(c *C) { + helper := NoTestsHelper{} + output := String{} + Run(&helper, &RunConf{Output: &output}) + c.Check(helper.hasRun, Equals, false) +} + +// ----------------------------------------------------------------------- +// Verify that checks and assertions work correctly inside the fixture. + +type FixtureCheckHelper struct { + fail string + completed bool +} + +func (s *FixtureCheckHelper) SetUpSuite(c *C) { + switch s.fail { + case "SetUpSuiteAssert": + c.Assert(false, Equals, true) + case "SetUpSuiteCheck": + c.Check(false, Equals, true) + } + s.completed = true +} + +func (s *FixtureCheckHelper) SetUpTest(c *C) { + switch s.fail { + case "SetUpTestAssert": + c.Assert(false, Equals, true) + case "SetUpTestCheck": + c.Check(false, Equals, true) + } + s.completed = true +} + +func (s *FixtureCheckHelper) Test(c *C) { + // Do nothing. +} + +func (s *FixtureS) TestSetUpSuiteCheck(c *C) { + helper := FixtureCheckHelper{fail: "SetUpSuiteCheck"} + output := String{} + Run(&helper, &RunConf{Output: &output}) + c.Assert(output.value, Matches, + "\n---+\n"+ + "FAIL: fixture_test\\.go:[0-9]+: "+ + "FixtureCheckHelper\\.SetUpSuite\n\n"+ + "fixture_test\\.go:[0-9]+:\n"+ + " c\\.Check\\(false, Equals, true\\)\n"+ + "\\.+ obtained bool = false\n"+ + "\\.+ expected bool = true\n\n") + c.Assert(helper.completed, Equals, true) +} + +func (s *FixtureS) TestSetUpSuiteAssert(c *C) { + helper := FixtureCheckHelper{fail: "SetUpSuiteAssert"} + output := String{} + Run(&helper, &RunConf{Output: &output}) + c.Assert(output.value, Matches, + "\n---+\n"+ + "FAIL: fixture_test\\.go:[0-9]+: "+ + "FixtureCheckHelper\\.SetUpSuite\n\n"+ + "fixture_test\\.go:[0-9]+:\n"+ + " c\\.Assert\\(false, Equals, true\\)\n"+ + "\\.+ obtained bool = false\n"+ + "\\.+ expected bool = true\n\n") + c.Assert(helper.completed, Equals, false) +} + +// ----------------------------------------------------------------------- +// Verify that logging within SetUpTest() persists within the test log itself. + +type FixtureLogHelper struct { + c *C +} + +func (s *FixtureLogHelper) SetUpTest(c *C) { + s.c = c + c.Log("1") +} + +func (s *FixtureLogHelper) Test(c *C) { + c.Log("2") + s.c.Log("3") + c.Log("4") + c.Fail() +} + +func (s *FixtureLogHelper) TearDownTest(c *C) { + s.c.Log("5") +} + +func (s *FixtureS) TestFixtureLogging(c *C) { + helper := FixtureLogHelper{} + output := String{} + Run(&helper, &RunConf{Output: &output}) + c.Assert(output.value, Matches, + "\n---+\n"+ + "FAIL: fixture_test\\.go:[0-9]+: "+ + "FixtureLogHelper\\.Test\n\n"+ + "1\n2\n3\n4\n5\n") +} + +// ----------------------------------------------------------------------- +// Skip() within fixture methods. + +func (s *FixtureS) TestSkipSuite(c *C) { + helper := FixtureHelper{skip: true, skipOnN: 0} + output := String{} + result := Run(&helper, &RunConf{Output: &output}) + c.Assert(output.value, Equals, "") + c.Assert(helper.calls[0], Equals, "SetUpSuite") + c.Assert(helper.calls[1], Equals, "TearDownSuite") + c.Assert(len(helper.calls), Equals, 2) + c.Assert(result.Skipped, Equals, 2) +} + +func (s *FixtureS) TestSkipTest(c *C) { + helper := FixtureHelper{skip: true, skipOnN: 1} + output := String{} + result := Run(&helper, &RunConf{Output: &output}) + c.Assert(helper.calls[0], Equals, "SetUpSuite") + c.Assert(helper.calls[1], Equals, "SetUpTest") + c.Assert(helper.calls[2], Equals, "SetUpTest") + c.Assert(helper.calls[3], Equals, "Test2") + c.Assert(helper.calls[4], Equals, "TearDownTest") + c.Assert(helper.calls[5], Equals, "TearDownSuite") + c.Assert(len(helper.calls), Equals, 6) + c.Assert(result.Skipped, Equals, 1) +} diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/foundation_test.go b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/foundation_test.go new file mode 100644 index 0000000000..809ef65e98 --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/foundation_test.go @@ -0,0 +1,335 @@ +// These tests check that the foundations of gocheck are working properly. +// They already assume that fundamental failing is working already, though, +// since this was tested in bootstrap_test.go. Even then, some care may +// still have to be taken when using external functions, since they should +// of course not rely on functionality tested here. + +package check_test + +import ( + "fmt" + "github.com/magiconair/properties/_third_party/gopkg.in/check.v1" + "log" + "os" + "regexp" + "strings" +) + +// ----------------------------------------------------------------------- +// Foundation test suite. + +type FoundationS struct{} + +var foundationS = check.Suite(&FoundationS{}) + +func (s *FoundationS) TestCountSuite(c *check.C) { + suitesRun += 1 +} + +func (s *FoundationS) TestErrorf(c *check.C) { + // Do not use checkState() here. It depends on Errorf() working. + expectedLog := fmt.Sprintf("foundation_test.go:%d:\n"+ + " c.Errorf(\"Error %%v!\", \"message\")\n"+ + "... Error: Error message!\n\n", + getMyLine()+1) + c.Errorf("Error %v!", "message") + failed := c.Failed() + c.Succeed() + if log := c.GetTestLog(); log != expectedLog { + c.Logf("Errorf() logged %#v rather than %#v", log, expectedLog) + c.Fail() + } + if !failed { + c.Logf("Errorf() didn't put the test in a failed state") + c.Fail() + } +} + +func (s *FoundationS) TestError(c *check.C) { + expectedLog := fmt.Sprintf("foundation_test.go:%d:\n"+ + " c\\.Error\\(\"Error \", \"message!\"\\)\n"+ + "\\.\\.\\. Error: Error message!\n\n", + getMyLine()+1) + c.Error("Error ", "message!") + checkState(c, nil, + &expectedState{ + name: "Error(`Error `, `message!`)", + failed: true, + log: expectedLog, + }) +} + +func (s *FoundationS) TestFailNow(c *check.C) { + defer (func() { + if !c.Failed() { + c.Error("FailNow() didn't fail the test") + } else { + c.Succeed() + if c.GetTestLog() != "" { + c.Error("Something got logged:\n" + c.GetTestLog()) + } + } + })() + + c.FailNow() + c.Log("FailNow() didn't stop the test") +} + +func (s *FoundationS) TestSucceedNow(c *check.C) { + defer (func() { + if c.Failed() { + c.Error("SucceedNow() didn't succeed the test") + } + if c.GetTestLog() != "" { + c.Error("Something got logged:\n" + c.GetTestLog()) + } + })() + + c.Fail() + c.SucceedNow() + c.Log("SucceedNow() didn't stop the test") +} + +func (s *FoundationS) TestFailureHeader(c *check.C) { + output := String{} + failHelper := FailHelper{} + check.Run(&failHelper, &check.RunConf{Output: &output}) + header := fmt.Sprintf(""+ + "\n-----------------------------------"+ + "-----------------------------------\n"+ + "FAIL: check_test.go:%d: FailHelper.TestLogAndFail\n", + failHelper.testLine) + if strings.Index(output.value, header) == -1 { + c.Errorf(""+ + "Failure didn't print a proper header.\n"+ + "... Got:\n%s... Expected something with:\n%s", + output.value, header) + } +} + +func (s *FoundationS) TestFatal(c *check.C) { + var line int + defer (func() { + if !c.Failed() { + c.Error("Fatal() didn't fail the test") + } else { + c.Succeed() + expected := fmt.Sprintf("foundation_test.go:%d:\n"+ + " c.Fatal(\"Die \", \"now!\")\n"+ + "... Error: Die now!\n\n", + line) + if c.GetTestLog() != expected { + c.Error("Incorrect log:", c.GetTestLog()) + } + } + })() + + line = getMyLine() + 1 + c.Fatal("Die ", "now!") + c.Log("Fatal() didn't stop the test") +} + +func (s *FoundationS) TestFatalf(c *check.C) { + var line int + defer (func() { + if !c.Failed() { + c.Error("Fatalf() didn't fail the test") + } else { + c.Succeed() + expected := fmt.Sprintf("foundation_test.go:%d:\n"+ + " c.Fatalf(\"Die %%s!\", \"now\")\n"+ + "... Error: Die now!\n\n", + line) + if c.GetTestLog() != expected { + c.Error("Incorrect log:", c.GetTestLog()) + } + } + })() + + line = getMyLine() + 1 + c.Fatalf("Die %s!", "now") + c.Log("Fatalf() didn't stop the test") +} + +func (s *FoundationS) TestCallerLoggingInsideTest(c *check.C) { + log := fmt.Sprintf(""+ + "foundation_test.go:%d:\n"+ + " result := c.Check\\(10, check.Equals, 20\\)\n"+ + "\\.\\.\\. obtained int = 10\n"+ + "\\.\\.\\. expected int = 20\n\n", + getMyLine()+1) + result := c.Check(10, check.Equals, 20) + checkState(c, result, + &expectedState{ + name: "Check(10, Equals, 20)", + result: false, + failed: true, + log: log, + }) +} + +func (s *FoundationS) TestCallerLoggingInDifferentFile(c *check.C) { + result, line := checkEqualWrapper(c, 10, 20) + testLine := getMyLine() - 1 + log := fmt.Sprintf(""+ + "foundation_test.go:%d:\n"+ + " result, line := checkEqualWrapper\\(c, 10, 20\\)\n"+ + "check_test.go:%d:\n"+ + " return c.Check\\(obtained, check.Equals, expected\\), getMyLine\\(\\)\n"+ + "\\.\\.\\. obtained int = 10\n"+ + "\\.\\.\\. expected int = 20\n\n", + testLine, line) + checkState(c, result, + &expectedState{ + name: "Check(10, Equals, 20)", + result: false, + failed: true, + log: log, + }) +} + +// ----------------------------------------------------------------------- +// ExpectFailure() inverts the logic of failure. + +type ExpectFailureSucceedHelper struct{} + +func (s *ExpectFailureSucceedHelper) TestSucceed(c *check.C) { + c.ExpectFailure("It booms!") + c.Error("Boom!") +} + +type ExpectFailureFailHelper struct{} + +func (s *ExpectFailureFailHelper) TestFail(c *check.C) { + c.ExpectFailure("Bug #XYZ") +} + +func (s *FoundationS) TestExpectFailureFail(c *check.C) { + helper := ExpectFailureFailHelper{} + output := String{} + result := check.Run(&helper, &check.RunConf{Output: &output}) + + expected := "" + + "^\n-+\n" + + "FAIL: foundation_test\\.go:[0-9]+:" + + " ExpectFailureFailHelper\\.TestFail\n\n" + + "\\.\\.\\. Error: Test succeeded, but was expected to fail\n" + + "\\.\\.\\. Reason: Bug #XYZ\n$" + + matched, err := regexp.MatchString(expected, output.value) + if err != nil { + c.Error("Bad expression: ", expected) + } else if !matched { + c.Error("ExpectFailure() didn't log properly:\n", output.value) + } + + c.Assert(result.ExpectedFailures, check.Equals, 0) +} + +func (s *FoundationS) TestExpectFailureSucceed(c *check.C) { + helper := ExpectFailureSucceedHelper{} + output := String{} + result := check.Run(&helper, &check.RunConf{Output: &output}) + + c.Assert(output.value, check.Equals, "") + c.Assert(result.ExpectedFailures, check.Equals, 1) +} + +func (s *FoundationS) TestExpectFailureSucceedVerbose(c *check.C) { + helper := ExpectFailureSucceedHelper{} + output := String{} + result := check.Run(&helper, &check.RunConf{Output: &output, Verbose: true}) + + expected := "" + + "FAIL EXPECTED: foundation_test\\.go:[0-9]+:" + + " ExpectFailureSucceedHelper\\.TestSucceed \\(It booms!\\)\t *[.0-9]+s\n" + + matched, err := regexp.MatchString(expected, output.value) + if err != nil { + c.Error("Bad expression: ", expected) + } else if !matched { + c.Error("ExpectFailure() didn't log properly:\n", output.value) + } + + c.Assert(result.ExpectedFailures, check.Equals, 1) +} + +// ----------------------------------------------------------------------- +// Skip() allows stopping a test without positive/negative results. + +type SkipTestHelper struct{} + +func (s *SkipTestHelper) TestFail(c *check.C) { + c.Skip("Wrong platform or whatever") + c.Error("Boom!") +} + +func (s *FoundationS) TestSkip(c *check.C) { + helper := SkipTestHelper{} + output := String{} + check.Run(&helper, &check.RunConf{Output: &output}) + + if output.value != "" { + c.Error("Skip() logged something:\n", output.value) + } +} + +func (s *FoundationS) TestSkipVerbose(c *check.C) { + helper := SkipTestHelper{} + output := String{} + check.Run(&helper, &check.RunConf{Output: &output, Verbose: true}) + + expected := "SKIP: foundation_test\\.go:[0-9]+: SkipTestHelper\\.TestFail" + + " \\(Wrong platform or whatever\\)" + matched, err := regexp.MatchString(expected, output.value) + if err != nil { + c.Error("Bad expression: ", expected) + } else if !matched { + c.Error("Skip() didn't log properly:\n", output.value) + } +} + +// ----------------------------------------------------------------------- +// Check minimum *log.Logger interface provided by *check.C. + +type minLogger interface { + Output(calldepth int, s string) error +} + +func (s *BootstrapS) TestMinLogger(c *check.C) { + var logger minLogger + logger = log.New(os.Stderr, "", 0) + logger = c + logger.Output(0, "Hello there") + expected := `\[LOG\] [0-9]+:[0-9][0-9]\.[0-9][0-9][0-9] +Hello there\n` + output := c.GetTestLog() + c.Assert(output, check.Matches, expected) +} + +// ----------------------------------------------------------------------- +// Ensure that suites with embedded types are working fine, including the +// the workaround for issue 906. + +type EmbeddedInternalS struct { + called bool +} + +type EmbeddedS struct { + EmbeddedInternalS +} + +var embeddedS = check.Suite(&EmbeddedS{}) + +func (s *EmbeddedS) TestCountSuite(c *check.C) { + suitesRun += 1 +} + +func (s *EmbeddedInternalS) TestMethod(c *check.C) { + c.Error("TestMethod() of the embedded type was called!?") +} + +func (s *EmbeddedS) TestMethod(c *check.C) { + // http://code.google.com/p/go/issues/detail?id=906 + c.Check(s.called, check.Equals, false) // Go issue 906 is affecting the runner? + s.called = true +} diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/helpers.go b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/helpers.go new file mode 100644 index 0000000000..4b6c26da45 --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/helpers.go @@ -0,0 +1,231 @@ +package check + +import ( + "fmt" + "strings" + "time" +) + +// TestName returns the current test name in the form "SuiteName.TestName" +func (c *C) TestName() string { + return c.testName +} + +// ----------------------------------------------------------------------- +// Basic succeeding/failing logic. + +// Failed returns whether the currently running test has already failed. +func (c *C) Failed() bool { + return c.status == failedSt +} + +// Fail marks the currently running test as failed. +// +// Something ought to have been previously logged so the developer can tell +// what went wrong. The higher level helper functions will fail the test +// and do the logging properly. +func (c *C) Fail() { + c.status = failedSt +} + +// FailNow marks the currently running test as failed and stops running it. +// Something ought to have been previously logged so the developer can tell +// what went wrong. The higher level helper functions will fail the test +// and do the logging properly. +func (c *C) FailNow() { + c.Fail() + c.stopNow() +} + +// Succeed marks the currently running test as succeeded, undoing any +// previous failures. +func (c *C) Succeed() { + c.status = succeededSt +} + +// SucceedNow marks the currently running test as succeeded, undoing any +// previous failures, and stops running the test. +func (c *C) SucceedNow() { + c.Succeed() + c.stopNow() +} + +// ExpectFailure informs that the running test is knowingly broken for +// the provided reason. If the test does not fail, an error will be reported +// to raise attention to this fact. This method is useful to temporarily +// disable tests which cover well known problems until a better time to +// fix the problem is found, without forgetting about the fact that a +// failure still exists. +func (c *C) ExpectFailure(reason string) { + if reason == "" { + panic("Missing reason why the test is expected to fail") + } + c.mustFail = true + c.reason = reason +} + +// Skip skips the running test for the provided reason. If run from within +// SetUpTest, the individual test being set up will be skipped, and if run +// from within SetUpSuite, the whole suite is skipped. +func (c *C) Skip(reason string) { + if reason == "" { + panic("Missing reason why the test is being skipped") + } + c.reason = reason + c.status = skippedSt + c.stopNow() +} + +// ----------------------------------------------------------------------- +// Basic logging. + +// GetTestLog returns the current test error output. +func (c *C) GetTestLog() string { + return c.logb.String() +} + +// Log logs some information into the test error output. +// The provided arguments are assembled together into a string with fmt.Sprint. +func (c *C) Log(args ...interface{}) { + c.log(args...) +} + +// Log logs some information into the test error output. +// The provided arguments are assembled together into a string with fmt.Sprintf. +func (c *C) Logf(format string, args ...interface{}) { + c.logf(format, args...) +} + +// Output enables *C to be used as a logger in functions that require only +// the minimum interface of *log.Logger. +func (c *C) Output(calldepth int, s string) error { + d := time.Now().Sub(c.startTime) + msec := d / time.Millisecond + sec := d / time.Second + min := d / time.Minute + + c.Logf("[LOG] %d:%02d.%03d %s", min, sec%60, msec%1000, s) + return nil +} + +// Error logs an error into the test error output and marks the test as failed. +// The provided arguments are assembled together into a string with fmt.Sprint. +func (c *C) Error(args ...interface{}) { + c.logCaller(1) + c.logString(fmt.Sprint("Error: ", fmt.Sprint(args...))) + c.logNewLine() + c.Fail() +} + +// Errorf logs an error into the test error output and marks the test as failed. +// The provided arguments are assembled together into a string with fmt.Sprintf. +func (c *C) Errorf(format string, args ...interface{}) { + c.logCaller(1) + c.logString(fmt.Sprintf("Error: "+format, args...)) + c.logNewLine() + c.Fail() +} + +// Fatal logs an error into the test error output, marks the test as failed, and +// stops the test execution. The provided arguments are assembled together into +// a string with fmt.Sprint. +func (c *C) Fatal(args ...interface{}) { + c.logCaller(1) + c.logString(fmt.Sprint("Error: ", fmt.Sprint(args...))) + c.logNewLine() + c.FailNow() +} + +// Fatlaf logs an error into the test error output, marks the test as failed, and +// stops the test execution. The provided arguments are assembled together into +// a string with fmt.Sprintf. +func (c *C) Fatalf(format string, args ...interface{}) { + c.logCaller(1) + c.logString(fmt.Sprint("Error: ", fmt.Sprintf(format, args...))) + c.logNewLine() + c.FailNow() +} + +// ----------------------------------------------------------------------- +// Generic checks and assertions based on checkers. + +// Check verifies if the first value matches the expected value according +// to the provided checker. If they do not match, an error is logged, the +// test is marked as failed, and the test execution continues. +// +// Some checkers may not need the expected argument (e.g. IsNil). +// +// Extra arguments provided to the function are logged next to the reported +// problem when the matching fails. +func (c *C) Check(obtained interface{}, checker Checker, args ...interface{}) bool { + return c.internalCheck("Check", obtained, checker, args...) +} + +// Assert ensures that the first value matches the expected value according +// to the provided checker. If they do not match, an error is logged, the +// test is marked as failed, and the test execution stops. +// +// Some checkers may not need the expected argument (e.g. IsNil). +// +// Extra arguments provided to the function are logged next to the reported +// problem when the matching fails. +func (c *C) Assert(obtained interface{}, checker Checker, args ...interface{}) { + if !c.internalCheck("Assert", obtained, checker, args...) { + c.stopNow() + } +} + +func (c *C) internalCheck(funcName string, obtained interface{}, checker Checker, args ...interface{}) bool { + if checker == nil { + c.logCaller(2) + c.logString(fmt.Sprintf("%s(obtained, nil!?, ...):", funcName)) + c.logString("Oops.. you've provided a nil checker!") + c.logNewLine() + c.Fail() + return false + } + + // If the last argument is a bug info, extract it out. + var comment CommentInterface + if len(args) > 0 { + if c, ok := args[len(args)-1].(CommentInterface); ok { + comment = c + args = args[:len(args)-1] + } + } + + params := append([]interface{}{obtained}, args...) + info := checker.Info() + + if len(params) != len(info.Params) { + names := append([]string{info.Params[0], info.Name}, info.Params[1:]...) + c.logCaller(2) + c.logString(fmt.Sprintf("%s(%s):", funcName, strings.Join(names, ", "))) + c.logString(fmt.Sprintf("Wrong number of parameters for %s: want %d, got %d", info.Name, len(names), len(params)+1)) + c.logNewLine() + c.Fail() + return false + } + + // Copy since it may be mutated by Check. + names := append([]string{}, info.Params...) + + // Do the actual check. + result, error := checker.Check(params, names) + if !result || error != "" { + c.logCaller(2) + for i := 0; i != len(params); i++ { + c.logValue(names[i], params[i]) + } + if comment != nil { + c.logString(comment.CheckCommentString()) + } + if error != "" { + c.logString(error) + } + c.logNewLine() + c.Fail() + return false + } + return true +} diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/helpers_test.go b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/helpers_test.go new file mode 100644 index 0000000000..704ee10159 --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/helpers_test.go @@ -0,0 +1,519 @@ +// These tests verify the inner workings of the helper methods associated +// with check.T. + +package check_test + +import ( + "github.com/magiconair/properties/_third_party/gopkg.in/check.v1" + "os" + "reflect" + "runtime" + "sync" +) + +var helpersS = check.Suite(&HelpersS{}) + +type HelpersS struct{} + +func (s *HelpersS) TestCountSuite(c *check.C) { + suitesRun += 1 +} + +// ----------------------------------------------------------------------- +// Fake checker and bug info to verify the behavior of Assert() and Check(). + +type MyChecker struct { + info *check.CheckerInfo + params []interface{} + names []string + result bool + error string +} + +func (checker *MyChecker) Info() *check.CheckerInfo { + if checker.info == nil { + return &check.CheckerInfo{Name: "MyChecker", Params: []string{"myobtained", "myexpected"}} + } + return checker.info +} + +func (checker *MyChecker) Check(params []interface{}, names []string) (bool, string) { + rparams := checker.params + rnames := checker.names + checker.params = append([]interface{}{}, params...) + checker.names = append([]string{}, names...) + if rparams != nil { + copy(params, rparams) + } + if rnames != nil { + copy(names, rnames) + } + return checker.result, checker.error +} + +type myCommentType string + +func (c myCommentType) CheckCommentString() string { + return string(c) +} + +func myComment(s string) myCommentType { + return myCommentType(s) +} + +// ----------------------------------------------------------------------- +// Ensure a real checker actually works fine. + +func (s *HelpersS) TestCheckerInterface(c *check.C) { + testHelperSuccess(c, "Check(1, Equals, 1)", true, func() interface{} { + return c.Check(1, check.Equals, 1) + }) +} + +// ----------------------------------------------------------------------- +// Tests for Check(), mostly the same as for Assert() following these. + +func (s *HelpersS) TestCheckSucceedWithExpected(c *check.C) { + checker := &MyChecker{result: true} + testHelperSuccess(c, "Check(1, checker, 2)", true, func() interface{} { + return c.Check(1, checker, 2) + }) + if !reflect.DeepEqual(checker.params, []interface{}{1, 2}) { + c.Fatalf("Bad params for check: %#v", checker.params) + } +} + +func (s *HelpersS) TestCheckSucceedWithoutExpected(c *check.C) { + checker := &MyChecker{result: true, info: &check.CheckerInfo{Params: []string{"myvalue"}}} + testHelperSuccess(c, "Check(1, checker)", true, func() interface{} { + return c.Check(1, checker) + }) + if !reflect.DeepEqual(checker.params, []interface{}{1}) { + c.Fatalf("Bad params for check: %#v", checker.params) + } +} + +func (s *HelpersS) TestCheckFailWithExpected(c *check.C) { + checker := &MyChecker{result: false} + log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + + " return c\\.Check\\(1, checker, 2\\)\n" + + "\\.+ myobtained int = 1\n" + + "\\.+ myexpected int = 2\n\n" + testHelperFailure(c, "Check(1, checker, 2)", false, false, log, + func() interface{} { + return c.Check(1, checker, 2) + }) +} + +func (s *HelpersS) TestCheckFailWithExpectedAndComment(c *check.C) { + checker := &MyChecker{result: false} + log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + + " return c\\.Check\\(1, checker, 2, myComment\\(\"Hello world!\"\\)\\)\n" + + "\\.+ myobtained int = 1\n" + + "\\.+ myexpected int = 2\n" + + "\\.+ Hello world!\n\n" + testHelperFailure(c, "Check(1, checker, 2, msg)", false, false, log, + func() interface{} { + return c.Check(1, checker, 2, myComment("Hello world!")) + }) +} + +func (s *HelpersS) TestCheckFailWithExpectedAndStaticComment(c *check.C) { + checker := &MyChecker{result: false} + log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + + " // Nice leading comment\\.\n" + + " return c\\.Check\\(1, checker, 2\\) // Hello there\n" + + "\\.+ myobtained int = 1\n" + + "\\.+ myexpected int = 2\n\n" + testHelperFailure(c, "Check(1, checker, 2, msg)", false, false, log, + func() interface{} { + // Nice leading comment. + return c.Check(1, checker, 2) // Hello there + }) +} + +func (s *HelpersS) TestCheckFailWithoutExpected(c *check.C) { + checker := &MyChecker{result: false, info: &check.CheckerInfo{Params: []string{"myvalue"}}} + log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + + " return c\\.Check\\(1, checker\\)\n" + + "\\.+ myvalue int = 1\n\n" + testHelperFailure(c, "Check(1, checker)", false, false, log, + func() interface{} { + return c.Check(1, checker) + }) +} + +func (s *HelpersS) TestCheckFailWithoutExpectedAndMessage(c *check.C) { + checker := &MyChecker{result: false, info: &check.CheckerInfo{Params: []string{"myvalue"}}} + log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + + " return c\\.Check\\(1, checker, myComment\\(\"Hello world!\"\\)\\)\n" + + "\\.+ myvalue int = 1\n" + + "\\.+ Hello world!\n\n" + testHelperFailure(c, "Check(1, checker, msg)", false, false, log, + func() interface{} { + return c.Check(1, checker, myComment("Hello world!")) + }) +} + +func (s *HelpersS) TestCheckWithMissingExpected(c *check.C) { + checker := &MyChecker{result: true} + log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + + " return c\\.Check\\(1, checker\\)\n" + + "\\.+ Check\\(myobtained, MyChecker, myexpected\\):\n" + + "\\.+ Wrong number of parameters for MyChecker: " + + "want 3, got 2\n\n" + testHelperFailure(c, "Check(1, checker, !?)", false, false, log, + func() interface{} { + return c.Check(1, checker) + }) +} + +func (s *HelpersS) TestCheckWithTooManyExpected(c *check.C) { + checker := &MyChecker{result: true} + log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + + " return c\\.Check\\(1, checker, 2, 3\\)\n" + + "\\.+ Check\\(myobtained, MyChecker, myexpected\\):\n" + + "\\.+ Wrong number of parameters for MyChecker: " + + "want 3, got 4\n\n" + testHelperFailure(c, "Check(1, checker, 2, 3)", false, false, log, + func() interface{} { + return c.Check(1, checker, 2, 3) + }) +} + +func (s *HelpersS) TestCheckWithError(c *check.C) { + checker := &MyChecker{result: false, error: "Some not so cool data provided!"} + log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + + " return c\\.Check\\(1, checker, 2\\)\n" + + "\\.+ myobtained int = 1\n" + + "\\.+ myexpected int = 2\n" + + "\\.+ Some not so cool data provided!\n\n" + testHelperFailure(c, "Check(1, checker, 2)", false, false, log, + func() interface{} { + return c.Check(1, checker, 2) + }) +} + +func (s *HelpersS) TestCheckWithNilChecker(c *check.C) { + log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + + " return c\\.Check\\(1, nil\\)\n" + + "\\.+ Check\\(obtained, nil!\\?, \\.\\.\\.\\):\n" + + "\\.+ Oops\\.\\. you've provided a nil checker!\n\n" + testHelperFailure(c, "Check(obtained, nil)", false, false, log, + func() interface{} { + return c.Check(1, nil) + }) +} + +func (s *HelpersS) TestCheckWithParamsAndNamesMutation(c *check.C) { + checker := &MyChecker{result: false, params: []interface{}{3, 4}, names: []string{"newobtained", "newexpected"}} + log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + + " return c\\.Check\\(1, checker, 2\\)\n" + + "\\.+ newobtained int = 3\n" + + "\\.+ newexpected int = 4\n\n" + testHelperFailure(c, "Check(1, checker, 2) with mutation", false, false, log, + func() interface{} { + return c.Check(1, checker, 2) + }) +} + +// ----------------------------------------------------------------------- +// Tests for Assert(), mostly the same as for Check() above. + +func (s *HelpersS) TestAssertSucceedWithExpected(c *check.C) { + checker := &MyChecker{result: true} + testHelperSuccess(c, "Assert(1, checker, 2)", nil, func() interface{} { + c.Assert(1, checker, 2) + return nil + }) + if !reflect.DeepEqual(checker.params, []interface{}{1, 2}) { + c.Fatalf("Bad params for check: %#v", checker.params) + } +} + +func (s *HelpersS) TestAssertSucceedWithoutExpected(c *check.C) { + checker := &MyChecker{result: true, info: &check.CheckerInfo{Params: []string{"myvalue"}}} + testHelperSuccess(c, "Assert(1, checker)", nil, func() interface{} { + c.Assert(1, checker) + return nil + }) + if !reflect.DeepEqual(checker.params, []interface{}{1}) { + c.Fatalf("Bad params for check: %#v", checker.params) + } +} + +func (s *HelpersS) TestAssertFailWithExpected(c *check.C) { + checker := &MyChecker{result: false} + log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + + " c\\.Assert\\(1, checker, 2\\)\n" + + "\\.+ myobtained int = 1\n" + + "\\.+ myexpected int = 2\n\n" + testHelperFailure(c, "Assert(1, checker, 2)", nil, true, log, + func() interface{} { + c.Assert(1, checker, 2) + return nil + }) +} + +func (s *HelpersS) TestAssertFailWithExpectedAndMessage(c *check.C) { + checker := &MyChecker{result: false} + log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + + " c\\.Assert\\(1, checker, 2, myComment\\(\"Hello world!\"\\)\\)\n" + + "\\.+ myobtained int = 1\n" + + "\\.+ myexpected int = 2\n" + + "\\.+ Hello world!\n\n" + testHelperFailure(c, "Assert(1, checker, 2, msg)", nil, true, log, + func() interface{} { + c.Assert(1, checker, 2, myComment("Hello world!")) + return nil + }) +} + +func (s *HelpersS) TestAssertFailWithoutExpected(c *check.C) { + checker := &MyChecker{result: false, info: &check.CheckerInfo{Params: []string{"myvalue"}}} + log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + + " c\\.Assert\\(1, checker\\)\n" + + "\\.+ myvalue int = 1\n\n" + testHelperFailure(c, "Assert(1, checker)", nil, true, log, + func() interface{} { + c.Assert(1, checker) + return nil + }) +} + +func (s *HelpersS) TestAssertFailWithoutExpectedAndMessage(c *check.C) { + checker := &MyChecker{result: false, info: &check.CheckerInfo{Params: []string{"myvalue"}}} + log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + + " c\\.Assert\\(1, checker, myComment\\(\"Hello world!\"\\)\\)\n" + + "\\.+ myvalue int = 1\n" + + "\\.+ Hello world!\n\n" + testHelperFailure(c, "Assert(1, checker, msg)", nil, true, log, + func() interface{} { + c.Assert(1, checker, myComment("Hello world!")) + return nil + }) +} + +func (s *HelpersS) TestAssertWithMissingExpected(c *check.C) { + checker := &MyChecker{result: true} + log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + + " c\\.Assert\\(1, checker\\)\n" + + "\\.+ Assert\\(myobtained, MyChecker, myexpected\\):\n" + + "\\.+ Wrong number of parameters for MyChecker: " + + "want 3, got 2\n\n" + testHelperFailure(c, "Assert(1, checker, !?)", nil, true, log, + func() interface{} { + c.Assert(1, checker) + return nil + }) +} + +func (s *HelpersS) TestAssertWithError(c *check.C) { + checker := &MyChecker{result: false, error: "Some not so cool data provided!"} + log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + + " c\\.Assert\\(1, checker, 2\\)\n" + + "\\.+ myobtained int = 1\n" + + "\\.+ myexpected int = 2\n" + + "\\.+ Some not so cool data provided!\n\n" + testHelperFailure(c, "Assert(1, checker, 2)", nil, true, log, + func() interface{} { + c.Assert(1, checker, 2) + return nil + }) +} + +func (s *HelpersS) TestAssertWithNilChecker(c *check.C) { + log := "(?s)helpers_test\\.go:[0-9]+:.*\nhelpers_test\\.go:[0-9]+:\n" + + " c\\.Assert\\(1, nil\\)\n" + + "\\.+ Assert\\(obtained, nil!\\?, \\.\\.\\.\\):\n" + + "\\.+ Oops\\.\\. you've provided a nil checker!\n\n" + testHelperFailure(c, "Assert(obtained, nil)", nil, true, log, + func() interface{} { + c.Assert(1, nil) + return nil + }) +} + +// ----------------------------------------------------------------------- +// Ensure that values logged work properly in some interesting cases. + +func (s *HelpersS) TestValueLoggingWithArrays(c *check.C) { + checker := &MyChecker{result: false} + log := "(?s)helpers_test.go:[0-9]+:.*\nhelpers_test.go:[0-9]+:\n" + + " return c\\.Check\\(\\[\\]byte{1, 2}, checker, \\[\\]byte{1, 3}\\)\n" + + "\\.+ myobtained \\[\\]uint8 = \\[\\]byte{0x1, 0x2}\n" + + "\\.+ myexpected \\[\\]uint8 = \\[\\]byte{0x1, 0x3}\n\n" + testHelperFailure(c, "Check([]byte{1}, chk, []byte{3})", false, false, log, + func() interface{} { + return c.Check([]byte{1, 2}, checker, []byte{1, 3}) + }) +} + +func (s *HelpersS) TestValueLoggingWithMultiLine(c *check.C) { + checker := &MyChecker{result: false} + log := "(?s)helpers_test.go:[0-9]+:.*\nhelpers_test.go:[0-9]+:\n" + + " return c\\.Check\\(\"a\\\\nb\\\\n\", checker, \"a\\\\nb\\\\nc\"\\)\n" + + "\\.+ myobtained string = \"\" \\+\n" + + "\\.+ \"a\\\\n\" \\+\n" + + "\\.+ \"b\\\\n\"\n" + + "\\.+ myexpected string = \"\" \\+\n" + + "\\.+ \"a\\\\n\" \\+\n" + + "\\.+ \"b\\\\n\" \\+\n" + + "\\.+ \"c\"\n\n" + testHelperFailure(c, `Check("a\nb\n", chk, "a\nb\nc")`, false, false, log, + func() interface{} { + return c.Check("a\nb\n", checker, "a\nb\nc") + }) +} + +func (s *HelpersS) TestValueLoggingWithMultiLineException(c *check.C) { + // If the newline is at the end of the string, don't log as multi-line. + checker := &MyChecker{result: false} + log := "(?s)helpers_test.go:[0-9]+:.*\nhelpers_test.go:[0-9]+:\n" + + " return c\\.Check\\(\"a b\\\\n\", checker, \"a\\\\nb\"\\)\n" + + "\\.+ myobtained string = \"a b\\\\n\"\n" + + "\\.+ myexpected string = \"\" \\+\n" + + "\\.+ \"a\\\\n\" \\+\n" + + "\\.+ \"b\"\n\n" + testHelperFailure(c, `Check("a b\n", chk, "a\nb")`, false, false, log, + func() interface{} { + return c.Check("a b\n", checker, "a\nb") + }) +} + +// ----------------------------------------------------------------------- +// MakeDir() tests. + +type MkDirHelper struct { + path1 string + path2 string + isDir1 bool + isDir2 bool + isDir3 bool + isDir4 bool +} + +func (s *MkDirHelper) SetUpSuite(c *check.C) { + s.path1 = c.MkDir() + s.isDir1 = isDir(s.path1) +} + +func (s *MkDirHelper) Test(c *check.C) { + s.path2 = c.MkDir() + s.isDir2 = isDir(s.path2) +} + +func (s *MkDirHelper) TearDownSuite(c *check.C) { + s.isDir3 = isDir(s.path1) + s.isDir4 = isDir(s.path2) +} + +func (s *HelpersS) TestMkDir(c *check.C) { + helper := MkDirHelper{} + output := String{} + check.Run(&helper, &check.RunConf{Output: &output}) + c.Assert(output.value, check.Equals, "") + c.Check(helper.isDir1, check.Equals, true) + c.Check(helper.isDir2, check.Equals, true) + c.Check(helper.isDir3, check.Equals, true) + c.Check(helper.isDir4, check.Equals, true) + c.Check(helper.path1, check.Not(check.Equals), + helper.path2) + c.Check(isDir(helper.path1), check.Equals, false) + c.Check(isDir(helper.path2), check.Equals, false) +} + +func isDir(path string) bool { + if stat, err := os.Stat(path); err == nil { + return stat.IsDir() + } + return false +} + +// Concurrent logging should not corrupt the underling buffer. +// Use go test -race to detect the race in this test. +func (s *HelpersS) TestConcurrentLogging(c *check.C) { + defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(runtime.NumCPU())) + var start, stop sync.WaitGroup + start.Add(1) + for i, n := 0, runtime.NumCPU()*2; i < n; i++ { + stop.Add(1) + go func(i int) { + start.Wait() + for j := 0; j < 30; j++ { + c.Logf("Worker %d: line %d", i, j) + } + stop.Done() + }(i) + } + start.Done() + stop.Wait() +} + +// ----------------------------------------------------------------------- +// Test the TestName function + +type TestNameHelper struct { + name1 string + name2 string + name3 string + name4 string + name5 string +} + +func (s *TestNameHelper) SetUpSuite(c *check.C) { s.name1 = c.TestName() } +func (s *TestNameHelper) SetUpTest(c *check.C) { s.name2 = c.TestName() } +func (s *TestNameHelper) Test(c *check.C) { s.name3 = c.TestName() } +func (s *TestNameHelper) TearDownTest(c *check.C) { s.name4 = c.TestName() } +func (s *TestNameHelper) TearDownSuite(c *check.C) { s.name5 = c.TestName() } + +func (s *HelpersS) TestTestName(c *check.C) { + helper := TestNameHelper{} + output := String{} + check.Run(&helper, &check.RunConf{Output: &output}) + c.Check(helper.name1, check.Equals, "") + c.Check(helper.name2, check.Equals, "TestNameHelper.Test") + c.Check(helper.name3, check.Equals, "TestNameHelper.Test") + c.Check(helper.name4, check.Equals, "TestNameHelper.Test") + c.Check(helper.name5, check.Equals, "") +} + +// ----------------------------------------------------------------------- +// A couple of helper functions to test helper functions. :-) + +func testHelperSuccess(c *check.C, name string, expectedResult interface{}, closure func() interface{}) { + var result interface{} + defer (func() { + if err := recover(); err != nil { + panic(err) + } + checkState(c, result, + &expectedState{ + name: name, + result: expectedResult, + failed: false, + log: "", + }) + })() + result = closure() +} + +func testHelperFailure(c *check.C, name string, expectedResult interface{}, shouldStop bool, log string, closure func() interface{}) { + var result interface{} + defer (func() { + if err := recover(); err != nil { + panic(err) + } + checkState(c, result, + &expectedState{ + name: name, + result: expectedResult, + failed: true, + log: log, + }) + })() + result = closure() + if shouldStop { + c.Logf("%s didn't stop when it should", name) + } +} diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/printer.go b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/printer.go new file mode 100644 index 0000000000..e0f7557b5c --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/printer.go @@ -0,0 +1,168 @@ +package check + +import ( + "bytes" + "go/ast" + "go/parser" + "go/printer" + "go/token" + "os" +) + +func indent(s, with string) (r string) { + eol := true + for i := 0; i != len(s); i++ { + c := s[i] + switch { + case eol && c == '\n' || c == '\r': + case c == '\n' || c == '\r': + eol = true + case eol: + eol = false + s = s[:i] + with + s[i:] + i += len(with) + } + } + return s +} + +func printLine(filename string, line int) (string, error) { + fset := token.NewFileSet() + file, err := os.Open(filename) + if err != nil { + return "", err + } + fnode, err := parser.ParseFile(fset, filename, file, parser.ParseComments) + if err != nil { + return "", err + } + config := &printer.Config{Mode: printer.UseSpaces, Tabwidth: 4} + lp := &linePrinter{fset: fset, fnode: fnode, line: line, config: config} + ast.Walk(lp, fnode) + result := lp.output.Bytes() + // Comments leave \n at the end. + n := len(result) + for n > 0 && result[n-1] == '\n' { + n-- + } + return string(result[:n]), nil +} + +type linePrinter struct { + config *printer.Config + fset *token.FileSet + fnode *ast.File + line int + output bytes.Buffer + stmt ast.Stmt +} + +func (lp *linePrinter) emit() bool { + if lp.stmt != nil { + lp.trim(lp.stmt) + lp.printWithComments(lp.stmt) + lp.stmt = nil + return true + } + return false +} + +func (lp *linePrinter) printWithComments(n ast.Node) { + nfirst := lp.fset.Position(n.Pos()).Line + nlast := lp.fset.Position(n.End()).Line + for _, g := range lp.fnode.Comments { + cfirst := lp.fset.Position(g.Pos()).Line + clast := lp.fset.Position(g.End()).Line + if clast == nfirst-1 && lp.fset.Position(n.Pos()).Column == lp.fset.Position(g.Pos()).Column { + for _, c := range g.List { + lp.output.WriteString(c.Text) + lp.output.WriteByte('\n') + } + } + if cfirst >= nfirst && cfirst <= nlast && n.End() <= g.List[0].Slash { + // The printer will not include the comment if it starts past + // the node itself. Trick it into printing by overlapping the + // slash with the end of the statement. + g.List[0].Slash = n.End() - 1 + } + } + node := &printer.CommentedNode{n, lp.fnode.Comments} + lp.config.Fprint(&lp.output, lp.fset, node) +} + +func (lp *linePrinter) Visit(n ast.Node) (w ast.Visitor) { + if n == nil { + if lp.output.Len() == 0 { + lp.emit() + } + return nil + } + first := lp.fset.Position(n.Pos()).Line + last := lp.fset.Position(n.End()).Line + if first <= lp.line && last >= lp.line { + // Print the innermost statement containing the line. + if stmt, ok := n.(ast.Stmt); ok { + if _, ok := n.(*ast.BlockStmt); !ok { + lp.stmt = stmt + } + } + if first == lp.line && lp.emit() { + return nil + } + return lp + } + return nil +} + +func (lp *linePrinter) trim(n ast.Node) bool { + stmt, ok := n.(ast.Stmt) + if !ok { + return true + } + line := lp.fset.Position(n.Pos()).Line + if line != lp.line { + return false + } + switch stmt := stmt.(type) { + case *ast.IfStmt: + stmt.Body = lp.trimBlock(stmt.Body) + case *ast.SwitchStmt: + stmt.Body = lp.trimBlock(stmt.Body) + case *ast.TypeSwitchStmt: + stmt.Body = lp.trimBlock(stmt.Body) + case *ast.CaseClause: + stmt.Body = lp.trimList(stmt.Body) + case *ast.CommClause: + stmt.Body = lp.trimList(stmt.Body) + case *ast.BlockStmt: + stmt.List = lp.trimList(stmt.List) + } + return true +} + +func (lp *linePrinter) trimBlock(stmt *ast.BlockStmt) *ast.BlockStmt { + if !lp.trim(stmt) { + return lp.emptyBlock(stmt) + } + stmt.Rbrace = stmt.Lbrace + return stmt +} + +func (lp *linePrinter) trimList(stmts []ast.Stmt) []ast.Stmt { + for i := 0; i != len(stmts); i++ { + if !lp.trim(stmts[i]) { + stmts[i] = lp.emptyStmt(stmts[i]) + break + } + } + return stmts +} + +func (lp *linePrinter) emptyStmt(n ast.Node) *ast.ExprStmt { + return &ast.ExprStmt{&ast.Ellipsis{n.Pos(), nil}} +} + +func (lp *linePrinter) emptyBlock(n ast.Node) *ast.BlockStmt { + p := n.Pos() + return &ast.BlockStmt{p, []ast.Stmt{lp.emptyStmt(n)}, p} +} diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/printer_test.go b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/printer_test.go new file mode 100644 index 0000000000..47f94a7fa8 --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/printer_test.go @@ -0,0 +1,109 @@ +package check_test + +import ( + . "github.com/magiconair/properties/_third_party/gopkg.in/check.v1" +) + +var _ = Suite(&PrinterS{}) + +type PrinterS struct{} + +func (s *PrinterS) TestCountSuite(c *C) { + suitesRun += 1 +} + +var printTestFuncLine int + +func init() { + printTestFuncLine = getMyLine() + 3 +} + +func printTestFunc() { + println(1) // Comment1 + if 2 == 2 { // Comment2 + println(3) // Comment3 + } + switch 5 { + case 6: + println(6) // Comment6 + println(7) + } + switch interface{}(9).(type) { // Comment9 + case int: + println(10) + println(11) + } + select { + case <-(chan bool)(nil): + println(14) + println(15) + default: + println(16) + println(17) + } + println(19, + 20) + _ = func() { + println(21) + println(22) + } + println(24, func() { + println(25) + }) + // Leading comment + // with multiple lines. + println(29) // Comment29 +} + +var printLineTests = []struct { + line int + output string +}{ + {1, "println(1) // Comment1"}, + {2, "if 2 == 2 { // Comment2\n ...\n}"}, + {3, "println(3) // Comment3"}, + {5, "switch 5 {\n...\n}"}, + {6, "case 6:\n println(6) // Comment6\n ..."}, + {7, "println(7)"}, + {9, "switch interface{}(9).(type) { // Comment9\n...\n}"}, + {10, "case int:\n println(10)\n ..."}, + {14, "case <-(chan bool)(nil):\n println(14)\n ..."}, + {15, "println(15)"}, + {16, "default:\n println(16)\n ..."}, + {17, "println(17)"}, + {19, "println(19,\n 20)"}, + {20, "println(19,\n 20)"}, + {21, "_ = func() {\n println(21)\n println(22)\n}"}, + {22, "println(22)"}, + {24, "println(24, func() {\n println(25)\n})"}, + {25, "println(25)"}, + {26, "println(24, func() {\n println(25)\n})"}, + {29, "// Leading comment\n// with multiple lines.\nprintln(29) // Comment29"}, +} + +func (s *PrinterS) TestPrintLine(c *C) { + for _, test := range printLineTests { + output, err := PrintLine("printer_test.go", printTestFuncLine+test.line) + c.Assert(err, IsNil) + c.Assert(output, Equals, test.output) + } +} + +var indentTests = []struct { + in, out string +}{ + {"", ""}, + {"\n", "\n"}, + {"a", ">>>a"}, + {"a\n", ">>>a\n"}, + {"a\nb", ">>>a\n>>>b"}, + {" ", ">>> "}, +} + +func (s *PrinterS) TestIndent(c *C) { + for _, test := range indentTests { + out := Indent(test.in, ">>>") + c.Assert(out, Equals, test.out) + } + +} diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/run.go b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/run.go new file mode 100644 index 0000000000..da8fd79872 --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/run.go @@ -0,0 +1,175 @@ +package check + +import ( + "bufio" + "flag" + "fmt" + "os" + "testing" + "time" +) + +// ----------------------------------------------------------------------- +// Test suite registry. + +var allSuites []interface{} + +// Suite registers the given value as a test suite to be run. Any methods +// starting with the Test prefix in the given value will be considered as +// a test method. +func Suite(suite interface{}) interface{} { + allSuites = append(allSuites, suite) + return suite +} + +// ----------------------------------------------------------------------- +// Public running interface. + +var ( + oldFilterFlag = flag.String("gocheck.f", "", "Regular expression selecting which tests and/or suites to run") + oldVerboseFlag = flag.Bool("gocheck.v", false, "Verbose mode") + oldStreamFlag = flag.Bool("gocheck.vv", false, "Super verbose mode (disables output caching)") + oldBenchFlag = flag.Bool("gocheck.b", false, "Run benchmarks") + oldBenchTime = flag.Duration("gocheck.btime", 1*time.Second, "approximate run time for each benchmark") + oldListFlag = flag.Bool("gocheck.list", false, "List the names of all tests that will be run") + oldWorkFlag = flag.Bool("gocheck.work", false, "Display and do not remove the test working directory") + + newFilterFlag = flag.String("check.f", "", "Regular expression selecting which tests and/or suites to run") + newVerboseFlag = flag.Bool("check.v", false, "Verbose mode") + newStreamFlag = flag.Bool("check.vv", false, "Super verbose mode (disables output caching)") + newBenchFlag = flag.Bool("check.b", false, "Run benchmarks") + newBenchTime = flag.Duration("check.btime", 1*time.Second, "approximate run time for each benchmark") + newBenchMem = flag.Bool("check.bmem", false, "Report memory benchmarks") + newListFlag = flag.Bool("check.list", false, "List the names of all tests that will be run") + newWorkFlag = flag.Bool("check.work", false, "Display and do not remove the test working directory") +) + +// TestingT runs all test suites registered with the Suite function, +// printing results to stdout, and reporting any failures back to +// the "testing" package. +func TestingT(testingT *testing.T) { + benchTime := *newBenchTime + if benchTime == 1*time.Second { + benchTime = *oldBenchTime + } + conf := &RunConf{ + Filter: *oldFilterFlag + *newFilterFlag, + Verbose: *oldVerboseFlag || *newVerboseFlag, + Stream: *oldStreamFlag || *newStreamFlag, + Benchmark: *oldBenchFlag || *newBenchFlag, + BenchmarkTime: benchTime, + BenchmarkMem: *newBenchMem, + KeepWorkDir: *oldWorkFlag || *newWorkFlag, + } + if *oldListFlag || *newListFlag { + w := bufio.NewWriter(os.Stdout) + for _, name := range ListAll(conf) { + fmt.Fprintln(w, name) + } + w.Flush() + return + } + result := RunAll(conf) + println(result.String()) + if !result.Passed() { + testingT.Fail() + } +} + +// RunAll runs all test suites registered with the Suite function, using the +// provided run configuration. +func RunAll(runConf *RunConf) *Result { + result := Result{} + for _, suite := range allSuites { + result.Add(Run(suite, runConf)) + } + return &result +} + +// Run runs the provided test suite using the provided run configuration. +func Run(suite interface{}, runConf *RunConf) *Result { + runner := newSuiteRunner(suite, runConf) + return runner.run() +} + +// ListAll returns the names of all the test functions registered with the +// Suite function that will be run with the provided run configuration. +func ListAll(runConf *RunConf) []string { + var names []string + for _, suite := range allSuites { + names = append(names, List(suite, runConf)...) + } + return names +} + +// List returns the names of the test functions in the given +// suite that will be run with the provided run configuration. +func List(suite interface{}, runConf *RunConf) []string { + var names []string + runner := newSuiteRunner(suite, runConf) + for _, t := range runner.tests { + names = append(names, t.String()) + } + return names +} + +// ----------------------------------------------------------------------- +// Result methods. + +func (r *Result) Add(other *Result) { + r.Succeeded += other.Succeeded + r.Skipped += other.Skipped + r.Failed += other.Failed + r.Panicked += other.Panicked + r.FixturePanicked += other.FixturePanicked + r.ExpectedFailures += other.ExpectedFailures + r.Missed += other.Missed + if r.WorkDir != "" && other.WorkDir != "" { + r.WorkDir += ":" + other.WorkDir + } else if other.WorkDir != "" { + r.WorkDir = other.WorkDir + } +} + +func (r *Result) Passed() bool { + return (r.Failed == 0 && r.Panicked == 0 && + r.FixturePanicked == 0 && r.Missed == 0 && + r.RunError == nil) +} + +func (r *Result) String() string { + if r.RunError != nil { + return "ERROR: " + r.RunError.Error() + } + + var value string + if r.Failed == 0 && r.Panicked == 0 && r.FixturePanicked == 0 && + r.Missed == 0 { + value = "OK: " + } else { + value = "OOPS: " + } + value += fmt.Sprintf("%d passed", r.Succeeded) + if r.Skipped != 0 { + value += fmt.Sprintf(", %d skipped", r.Skipped) + } + if r.ExpectedFailures != 0 { + value += fmt.Sprintf(", %d expected failures", r.ExpectedFailures) + } + if r.Failed != 0 { + value += fmt.Sprintf(", %d FAILED", r.Failed) + } + if r.Panicked != 0 { + value += fmt.Sprintf(", %d PANICKED", r.Panicked) + } + if r.FixturePanicked != 0 { + value += fmt.Sprintf(", %d FIXTURE-PANICKED", r.FixturePanicked) + } + if r.Missed != 0 { + value += fmt.Sprintf(", %d MISSED", r.Missed) + } + if r.WorkDir != "" { + value += "\nWORK=" + r.WorkDir + } + return value +} diff --git a/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/run_test.go b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/run_test.go new file mode 100644 index 0000000000..4444cacf9c --- /dev/null +++ b/vendor/github.com/magiconair/properties/_third_party/gopkg.in/check.v1/run_test.go @@ -0,0 +1,419 @@ +// These tests verify the test running logic. + +package check_test + +import ( + "errors" + . "github.com/magiconair/properties/_third_party/gopkg.in/check.v1" + "os" + "sync" +) + +var runnerS = Suite(&RunS{}) + +type RunS struct{} + +func (s *RunS) TestCountSuite(c *C) { + suitesRun += 1 +} + +// ----------------------------------------------------------------------- +// Tests ensuring result counting works properly. + +func (s *RunS) TestSuccess(c *C) { + output := String{} + result := Run(&SuccessHelper{}, &RunConf{Output: &output}) + c.Check(result.Succeeded, Equals, 1) + c.Check(result.Failed, Equals, 0) + c.Check(result.Skipped, Equals, 0) + c.Check(result.Panicked, Equals, 0) + c.Check(result.FixturePanicked, Equals, 0) + c.Check(result.Missed, Equals, 0) + c.Check(result.RunError, IsNil) +} + +func (s *RunS) TestFailure(c *C) { + output := String{} + result := Run(&FailHelper{}, &RunConf{Output: &output}) + c.Check(result.Succeeded, Equals, 0) + c.Check(result.Failed, Equals, 1) + c.Check(result.Skipped, Equals, 0) + c.Check(result.Panicked, Equals, 0) + c.Check(result.FixturePanicked, Equals, 0) + c.Check(result.Missed, Equals, 0) + c.Check(result.RunError, IsNil) +} + +func (s *RunS) TestFixture(c *C) { + output := String{} + result := Run(&FixtureHelper{}, &RunConf{Output: &output}) + c.Check(result.Succeeded, Equals, 2) + c.Check(result.Failed, Equals, 0) + c.Check(result.Skipped, Equals, 0) + c.Check(result.Panicked, Equals, 0) + c.Check(result.FixturePanicked, Equals, 0) + c.Check(result.Missed, Equals, 0) + c.Check(result.RunError, IsNil) +} + +func (s *RunS) TestPanicOnTest(c *C) { + output := String{} + helper := &FixtureHelper{panicOn: "Test1"} + result := Run(helper, &RunConf{Output: &output}) + c.Check(result.Succeeded, Equals, 1) + c.Check(result.Failed, Equals, 0) + c.Check(result.Skipped, Equals, 0) + c.Check(result.Panicked, Equals, 1) + c.Check(result.FixturePanicked, Equals, 0) + c.Check(result.Missed, Equals, 0) + c.Check(result.RunError, IsNil) +} + +func (s *RunS) TestPanicOnSetUpTest(c *C) { + output := String{} + helper := &FixtureHelper{panicOn: "SetUpTest"} + result := Run(helper, &RunConf{Output: &output}) + c.Check(result.Succeeded, Equals, 0) + c.Check(result.Failed, Equals, 0) + c.Check(result.Skipped, Equals, 0) + c.Check(result.Panicked, Equals, 0) + c.Check(result.FixturePanicked, Equals, 1) + c.Check(result.Missed, Equals, 2) + c.Check(result.RunError, IsNil) +} + +func (s *RunS) TestPanicOnSetUpSuite(c *C) { + output := String{} + helper := &FixtureHelper{panicOn: "SetUpSuite"} + result := Run(helper, &RunConf{Output: &output}) + c.Check(result.Succeeded, Equals, 0) + c.Check(result.Failed, Equals, 0) + c.Check(result.Skipped, Equals, 0) + c.Check(result.Panicked, Equals, 0) + c.Check(result.FixturePanicked, Equals, 1) + c.Check(result.Missed, Equals, 2) + c.Check(result.RunError, IsNil) +} + +// ----------------------------------------------------------------------- +// Check result aggregation. + +func (s *RunS) TestAdd(c *C) { + result := &Result{ + Succeeded: 1, + Skipped: 2, + Failed: 3, + Panicked: 4, + FixturePanicked: 5, + Missed: 6, + ExpectedFailures: 7, + } + result.Add(&Result{ + Succeeded: 10, + Skipped: 20, + Failed: 30, + Panicked: 40, + FixturePanicked: 50, + Missed: 60, + ExpectedFailures: 70, + }) + c.Check(result.Succeeded, Equals, 11) + c.Check(result.Skipped, Equals, 22) + c.Check(result.Failed, Equals, 33) + c.Check(result.Panicked, Equals, 44) + c.Check(result.FixturePanicked, Equals, 55) + c.Check(result.Missed, Equals, 66) + c.Check(result.ExpectedFailures, Equals, 77) + c.Check(result.RunError, IsNil) +} + +// ----------------------------------------------------------------------- +// Check the Passed() method. + +func (s *RunS) TestPassed(c *C) { + c.Assert((&Result{}).Passed(), Equals, true) + c.Assert((&Result{Succeeded: 1}).Passed(), Equals, true) + c.Assert((&Result{Skipped: 1}).Passed(), Equals, true) + c.Assert((&Result{Failed: 1}).Passed(), Equals, false) + c.Assert((&Result{Panicked: 1}).Passed(), Equals, false) + c.Assert((&Result{FixturePanicked: 1}).Passed(), Equals, false) + c.Assert((&Result{Missed: 1}).Passed(), Equals, false) + c.Assert((&Result{RunError: errors.New("!")}).Passed(), Equals, false) +} + +// ----------------------------------------------------------------------- +// Check that result printing is working correctly. + +func (s *RunS) TestPrintSuccess(c *C) { + result := &Result{Succeeded: 5} + c.Check(result.String(), Equals, "OK: 5 passed") +} + +func (s *RunS) TestPrintFailure(c *C) { + result := &Result{Failed: 5} + c.Check(result.String(), Equals, "OOPS: 0 passed, 5 FAILED") +} + +func (s *RunS) TestPrintSkipped(c *C) { + result := &Result{Skipped: 5} + c.Check(result.String(), Equals, "OK: 0 passed, 5 skipped") +} + +func (s *RunS) TestPrintExpectedFailures(c *C) { + result := &Result{ExpectedFailures: 5} + c.Check(result.String(), Equals, "OK: 0 passed, 5 expected failures") +} + +func (s *RunS) TestPrintPanicked(c *C) { + result := &Result{Panicked: 5} + c.Check(result.String(), Equals, "OOPS: 0 passed, 5 PANICKED") +} + +func (s *RunS) TestPrintFixturePanicked(c *C) { + result := &Result{FixturePanicked: 5} + c.Check(result.String(), Equals, "OOPS: 0 passed, 5 FIXTURE-PANICKED") +} + +func (s *RunS) TestPrintMissed(c *C) { + result := &Result{Missed: 5} + c.Check(result.String(), Equals, "OOPS: 0 passed, 5 MISSED") +} + +func (s *RunS) TestPrintAll(c *C) { + result := &Result{Succeeded: 1, Skipped: 2, ExpectedFailures: 3, + Panicked: 4, FixturePanicked: 5, Missed: 6} + c.Check(result.String(), Equals, + "OOPS: 1 passed, 2 skipped, 3 expected failures, 4 PANICKED, "+ + "5 FIXTURE-PANICKED, 6 MISSED") +} + +func (s *RunS) TestPrintRunError(c *C) { + result := &Result{Succeeded: 1, Failed: 1, + RunError: errors.New("Kaboom!")} + c.Check(result.String(), Equals, "ERROR: Kaboom!") +} + +// ----------------------------------------------------------------------- +// Verify that the method pattern flag works correctly. + +func (s *RunS) TestFilterTestName(c *C) { + helper := FixtureHelper{} + output := String{} + runConf := RunConf{Output: &output, Filter: "Test[91]"} + Run(&helper, &runConf) + c.Check(helper.calls[0], Equals, "SetUpSuite") + c.Check(helper.calls[1], Equals, "SetUpTest") + c.Check(helper.calls[2], Equals, "Test1") + c.Check(helper.calls[3], Equals, "TearDownTest") + c.Check(helper.calls[4], Equals, "TearDownSuite") + c.Check(len(helper.calls), Equals, 5) +} + +func (s *RunS) TestFilterTestNameWithAll(c *C) { + helper := FixtureHelper{} + output := String{} + runConf := RunConf{Output: &output, Filter: ".*"} + Run(&helper, &runConf) + c.Check(helper.calls[0], Equals, "SetUpSuite") + c.Check(helper.calls[1], Equals, "SetUpTest") + c.Check(helper.calls[2], Equals, "Test1") + c.Check(helper.calls[3], Equals, "TearDownTest") + c.Check(helper.calls[4], Equals, "SetUpTest") + c.Check(helper.calls[5], Equals, "Test2") + c.Check(helper.calls[6], Equals, "TearDownTest") + c.Check(helper.calls[7], Equals, "TearDownSuite") + c.Check(len(helper.calls), Equals, 8) +} + +func (s *RunS) TestFilterSuiteName(c *C) { + helper := FixtureHelper{} + output := String{} + runConf := RunConf{Output: &output, Filter: "FixtureHelper"} + Run(&helper, &runConf) + c.Check(helper.calls[0], Equals, "SetUpSuite") + c.Check(helper.calls[1], Equals, "SetUpTest") + c.Check(helper.calls[2], Equals, "Test1") + c.Check(helper.calls[3], Equals, "TearDownTest") + c.Check(helper.calls[4], Equals, "SetUpTest") + c.Check(helper.calls[5], Equals, "Test2") + c.Check(helper.calls[6], Equals, "TearDownTest") + c.Check(helper.calls[7], Equals, "TearDownSuite") + c.Check(len(helper.calls), Equals, 8) +} + +func (s *RunS) TestFilterSuiteNameAndTestName(c *C) { + helper := FixtureHelper{} + output := String{} + runConf := RunConf{Output: &output, Filter: "FixtureHelper\\.Test2"} + Run(&helper, &runConf) + c.Check(helper.calls[0], Equals, "SetUpSuite") + c.Check(helper.calls[1], Equals, "SetUpTest") + c.Check(helper.calls[2], Equals, "Test2") + c.Check(helper.calls[3], Equals, "TearDownTest") + c.Check(helper.calls[4], Equals, "TearDownSuite") + c.Check(len(helper.calls), Equals, 5) +} + +func (s *RunS) TestFilterAllOut(c *C) { + helper := FixtureHelper{} + output := String{} + runConf := RunConf{Output: &output, Filter: "NotFound"} + Run(&helper, &runConf) + c.Check(len(helper.calls), Equals, 0) +} + +func (s *RunS) TestRequirePartialMatch(c *C) { + helper := FixtureHelper{} + output := String{} + runConf := RunConf{Output: &output, Filter: "est"} + Run(&helper, &runConf) + c.Check(len(helper.calls), Equals, 8) +} + +func (s *RunS) TestFilterError(c *C) { + helper := FixtureHelper{} + output := String{} + runConf := RunConf{Output: &output, Filter: "]["} + result := Run(&helper, &runConf) + c.Check(result.String(), Equals, + "ERROR: Bad filter expression: error parsing regexp: missing closing ]: `[`") + c.Check(len(helper.calls), Equals, 0) +} + +// ----------------------------------------------------------------------- +// Verify that List works correctly. + +func (s *RunS) TestListFiltered(c *C) { + names := List(&FixtureHelper{}, &RunConf{Filter: "1"}) + c.Assert(names, DeepEquals, []string{ + "FixtureHelper.Test1", + }) +} + +func (s *RunS) TestList(c *C) { + names := List(&FixtureHelper{}, &RunConf{}) + c.Assert(names, DeepEquals, []string{ + "FixtureHelper.Test1", + "FixtureHelper.Test2", + }) +} + +// ----------------------------------------------------------------------- +// Verify that verbose mode prints tests which pass as well. + +func (s *RunS) TestVerboseMode(c *C) { + helper := FixtureHelper{} + output := String{} + runConf := RunConf{Output: &output, Verbose: true} + Run(&helper, &runConf) + + expected := "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test1\t *[.0-9]+s\n" + + "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test2\t *[.0-9]+s\n" + + c.Assert(output.value, Matches, expected) +} + +func (s *RunS) TestVerboseModeWithFailBeforePass(c *C) { + helper := FixtureHelper{panicOn: "Test1"} + output := String{} + runConf := RunConf{Output: &output, Verbose: true} + Run(&helper, &runConf) + + expected := "(?s).*PANIC.*\n-+\n" + // Should have an extra line. + "PASS: check_test\\.go:[0-9]+: FixtureHelper\\.Test2\t *[.0-9]+s\n" + + c.Assert(output.value, Matches, expected) +} + +// ----------------------------------------------------------------------- +// Verify the stream output mode. In this mode there's no output caching. + +type StreamHelper struct { + l2 sync.Mutex + l3 sync.Mutex +} + +func (s *StreamHelper) SetUpSuite(c *C) { + c.Log("0") +} + +func (s *StreamHelper) Test1(c *C) { + c.Log("1") + s.l2.Lock() + s.l3.Lock() + go func() { + s.l2.Lock() // Wait for "2". + c.Log("3") + s.l3.Unlock() + }() +} + +func (s *StreamHelper) Test2(c *C) { + c.Log("2") + s.l2.Unlock() + s.l3.Lock() // Wait for "3". + c.Fail() + c.Log("4") +} + +func (s *RunS) TestStreamMode(c *C) { + helper := &StreamHelper{} + output := String{} + runConf := RunConf{Output: &output, Stream: true} + Run(helper, &runConf) + + expected := "START: run_test\\.go:[0-9]+: StreamHelper\\.SetUpSuite\n0\n" + + "PASS: run_test\\.go:[0-9]+: StreamHelper\\.SetUpSuite\t *[.0-9]+s\n\n" + + "START: run_test\\.go:[0-9]+: StreamHelper\\.Test1\n1\n" + + "PASS: run_test\\.go:[0-9]+: StreamHelper\\.Test1\t *[.0-9]+s\n\n" + + "START: run_test\\.go:[0-9]+: StreamHelper\\.Test2\n2\n3\n4\n" + + "FAIL: run_test\\.go:[0-9]+: StreamHelper\\.Test2\n\n" + + c.Assert(output.value, Matches, expected) +} + +type StreamMissHelper struct{} + +func (s *StreamMissHelper) SetUpSuite(c *C) { + c.Log("0") + c.Fail() +} + +func (s *StreamMissHelper) Test1(c *C) { + c.Log("1") +} + +func (s *RunS) TestStreamModeWithMiss(c *C) { + helper := &StreamMissHelper{} + output := String{} + runConf := RunConf{Output: &output, Stream: true} + Run(helper, &runConf) + + expected := "START: run_test\\.go:[0-9]+: StreamMissHelper\\.SetUpSuite\n0\n" + + "FAIL: run_test\\.go:[0-9]+: StreamMissHelper\\.SetUpSuite\n\n" + + "START: run_test\\.go:[0-9]+: StreamMissHelper\\.Test1\n" + + "MISS: run_test\\.go:[0-9]+: StreamMissHelper\\.Test1\n\n" + + c.Assert(output.value, Matches, expected) +} + +// ----------------------------------------------------------------------- +// Verify that that the keep work dir request indeed does so. + +type WorkDirSuite struct{} + +func (s *WorkDirSuite) Test(c *C) { + c.MkDir() +} + +func (s *RunS) TestKeepWorkDir(c *C) { + output := String{} + runConf := RunConf{Output: &output, Verbose: true, KeepWorkDir: true} + result := Run(&WorkDirSuite{}, &runConf) + + c.Assert(result.String(), Matches, ".*\nWORK="+result.WorkDir) + + stat, err := os.Stat(result.WorkDir) + c.Assert(err, IsNil) + c.Assert(stat.IsDir(), Equals, true) +} diff --git a/vendor/github.com/magiconair/properties/benchmark_test.go b/vendor/github.com/magiconair/properties/benchmark_test.go new file mode 100644 index 0000000000..b2019e1033 --- /dev/null +++ b/vendor/github.com/magiconair/properties/benchmark_test.go @@ -0,0 +1,22 @@ +// Copyright 2013-2014 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "testing" +) + +// Benchmarks the decoder by creating a property file with 1000 key/value pairs. +func BenchmarkLoad(b *testing.B) { + input := "" + for i := 0; i < 1000; i++ { + input += fmt.Sprintf("key%d=value%d\n", i, i) + } + b.ResetTimer() + for i := 0; i < b.N; i++ { + Load([]byte(input), ISO_8859_1) + } +} diff --git a/vendor/github.com/magiconair/properties/decode.go b/vendor/github.com/magiconair/properties/decode.go new file mode 100644 index 0000000000..b989e6397c --- /dev/null +++ b/vendor/github.com/magiconair/properties/decode.go @@ -0,0 +1,290 @@ +// Copyright 2016 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "reflect" + "strconv" + "strings" + "time" +) + +// Decode assigns property values to exported fields of a struct. +// +// Decode traverses v recursively and returns an error if a value cannot be +// converted to the field type or a required value is missing for a field. +// +// The following type dependent decodings are used: +// +// String, boolean, numeric fields have the value of the property key assigned. +// The property key name is the name of the field. A different key and a default +// value can be set in the field's tag. Fields without default value are +// required. If the value cannot be converted to the field type an error is +// returned. +// +// time.Duration fields have the result of time.ParseDuration() assigned. +// +// time.Time fields have the vaule of time.Parse() assigned. The default layout +// is time.RFC3339 but can be set in the field's tag. +// +// Arrays and slices of string, boolean, numeric, time.Duration and time.Time +// fields have the value interpreted as a comma separated list of values. The +// individual values are trimmed of whitespace and empty values are ignored. A +// default value can be provided as a semicolon separated list in the field's +// tag. +// +// Struct fields are decoded recursively using the field name plus "." as +// prefix. The prefix (without dot) can be overridden in the field's tag. +// Default values are not supported in the field's tag. Specify them on the +// fields of the inner struct instead. +// +// Map fields must have a key of type string and are decoded recursively by +// using the field's name plus ".' as prefix and the next element of the key +// name as map key. The prefix (without dot) can be overridden in the field's +// tag. Default values are not supported. +// +// Examples: +// +// // Field is ignored. +// Field int `properties:"-"` +// +// // Field is assigned value of 'Field'. +// Field int +// +// // Field is assigned value of 'myName'. +// Field int `properties:"myName"` +// +// // Field is assigned value of key 'myName' and has a default +// // value 15 if the key does not exist. +// Field int `properties:"myName,default=15"` +// +// // Field is assigned value of key 'Field' and has a default +// // value 15 if the key does not exist. +// Field int `properties:",default=15"` +// +// // Field is assigned value of key 'date' and the date +// // is in format 2006-01-02 +// Field time.Time `properties:"date,layout=2006-01-02"` +// +// // Field is assigned the non-empty and whitespace trimmed +// // values of key 'Field' split by commas. +// Field []string +// +// // Field is assigned the non-empty and whitespace trimmed +// // values of key 'Field' split by commas and has a default +// // value ["a", "b", "c"] if the key does not exist. +// Field []string `properties:",default=a;b;c"` +// +// // Field is decoded recursively with "Field." as key prefix. +// Field SomeStruct +// +// // Field is decoded recursively with "myName." as key prefix. +// Field SomeStruct `properties:"myName"` +// +// // Field is decoded recursively with "Field." as key prefix +// // and the next dotted element of the key as map key. +// Field map[string]string +// +// // Field is decoded recursively with "myName." as key prefix +// // and the next dotted element of the key as map key. +// Field map[string]string `properties:"myName"` +func (p *Properties) Decode(x interface{}) error { + t, v := reflect.TypeOf(x), reflect.ValueOf(x) + if t.Kind() != reflect.Ptr || v.Elem().Type().Kind() != reflect.Struct { + return fmt.Errorf("not a pointer to struct: %s", t) + } + if err := dec(p, "", nil, nil, v); err != nil { + return err + } + return nil +} + +func dec(p *Properties, key string, def *string, opts map[string]string, v reflect.Value) error { + t := v.Type() + + // value returns the property value for key or the default if provided. + value := func() (string, error) { + if val, ok := p.Get(key); ok { + return val, nil + } + if def != nil { + return *def, nil + } + return "", fmt.Errorf("missing required key %s", key) + } + + // conv converts a string to a value of the given type. + conv := func(s string, t reflect.Type) (val reflect.Value, err error) { + var v interface{} + + switch { + case isDuration(t): + v, err = time.ParseDuration(s) + + case isTime(t): + layout := opts["layout"] + if layout == "" { + layout = time.RFC3339 + } + v, err = time.Parse(layout, s) + + case isBool(t): + v, err = boolVal(s), nil + + case isString(t): + v, err = s, nil + + case isFloat(t): + v, err = strconv.ParseFloat(s, 64) + + case isInt(t): + v, err = strconv.ParseInt(s, 10, 64) + + case isUint(t): + v, err = strconv.ParseUint(s, 10, 64) + + default: + return reflect.Zero(t), fmt.Errorf("unsupported type %s", t) + } + if err != nil { + return reflect.Zero(t), err + } + return reflect.ValueOf(v).Convert(t), nil + } + + // keydef returns the property key and the default value based on the + // name of the struct field and the options in the tag. + keydef := func(f reflect.StructField) (string, *string, map[string]string) { + key, opts := parseTag(f.Tag.Get("properties")) + + var def *string + if d, ok := opts["default"]; ok { + def = &d + } + if key != "" { + return key, def, opts + } + return f.Name, def, opts + } + + switch { + case isDuration(t) || isTime(t) || isBool(t) || isString(t) || isFloat(t) || isInt(t) || isUint(t): + s, err := value() + if err != nil { + return err + } + val, err := conv(s, t) + if err != nil { + return err + } + v.Set(val) + + case isPtr(t): + return dec(p, key, def, opts, v.Elem()) + + case isStruct(t): + for i := 0; i < v.NumField(); i++ { + fv := v.Field(i) + fk, def, opts := keydef(t.Field(i)) + if !fv.CanSet() { + return fmt.Errorf("cannot set ", t.Field(i).Name) + } + if fk == "-" { + continue + } + if key != "" { + fk = key + "." + fk + } + if err := dec(p, fk, def, opts, fv); err != nil { + return err + } + } + return nil + + case isArray(t): + val, err := value() + if err != nil { + return err + } + vals := split(val, ";") + a := reflect.MakeSlice(t, 0, len(vals)) + for _, s := range vals { + val, err := conv(s, t.Elem()) + if err != nil { + return err + } + a = reflect.Append(a, val) + } + v.Set(a) + + case isMap(t): + valT := t.Elem() + m := reflect.MakeMap(t) + for postfix, _ := range p.FilterStripPrefix(key + ".").m { + pp := strings.SplitN(postfix, ".", 2) + mk, mv := pp[0], reflect.New(valT) + if err := dec(p, key+"."+mk, nil, nil, mv); err != nil { + return err + } + m.SetMapIndex(reflect.ValueOf(mk), mv.Elem()) + } + v.Set(m) + + default: + return fmt.Errorf("unsupported type %s", t) + } + return nil +} + +// split splits a string on sep, trims whitespace of elements +// and omits empty elements +func split(s string, sep string) []string { + var a []string + for _, v := range strings.Split(s, sep) { + if v = strings.TrimSpace(v); v != "" { + a = append(a, v) + } + } + return a +} + +// parseTag parses a "key,k=v,k=v,..." +func parseTag(tag string) (key string, opts map[string]string) { + opts = map[string]string{} + for i, s := range strings.Split(tag, ",") { + if i == 0 { + key = s + continue + } + + pp := strings.SplitN(s, "=", 2) + if len(pp) == 1 { + opts[pp[0]] = "" + } else { + opts[pp[0]] = pp[1] + } + } + return key, opts +} + +func isArray(t reflect.Type) bool { return t.Kind() == reflect.Array || t.Kind() == reflect.Slice } +func isBool(t reflect.Type) bool { return t.Kind() == reflect.Bool } +func isDuration(t reflect.Type) bool { return t == reflect.TypeOf(time.Second) } +func isMap(t reflect.Type) bool { return t.Kind() == reflect.Map } +func isNumeric(t reflect.Type) bool { return isInt(t) || isUint(t) || isFloat(t) } +func isPtr(t reflect.Type) bool { return t.Kind() == reflect.Ptr } +func isString(t reflect.Type) bool { return t.Kind() == reflect.String } +func isStruct(t reflect.Type) bool { return t.Kind() == reflect.Struct } +func isTime(t reflect.Type) bool { return t == reflect.TypeOf(time.Time{}) } +func isFloat(t reflect.Type) bool { + return t.Kind() == reflect.Float32 || t.Kind() == reflect.Float64 +} +func isInt(t reflect.Type) bool { + return t.Kind() == reflect.Int || t.Kind() == reflect.Int8 || t.Kind() == reflect.Int16 || t.Kind() == reflect.Int32 || t.Kind() == reflect.Int64 +} +func isUint(t reflect.Type) bool { + return t.Kind() == reflect.Uint || t.Kind() == reflect.Uint8 || t.Kind() == reflect.Uint16 || t.Kind() == reflect.Uint32 || t.Kind() == reflect.Uint64 +} diff --git a/vendor/github.com/magiconair/properties/decode_test.go b/vendor/github.com/magiconair/properties/decode_test.go new file mode 100644 index 0000000000..a12f1e208b --- /dev/null +++ b/vendor/github.com/magiconair/properties/decode_test.go @@ -0,0 +1,299 @@ +// Copyright 2016 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "reflect" + "testing" + "time" +) + +func TestDecodeValues(t *testing.T) { + type S struct { + S string + BT bool + BF bool + I int + I8 int8 + I16 int16 + I32 int32 + I64 int64 + U uint + U8 uint8 + U16 uint16 + U32 uint32 + U64 uint64 + F32 float32 + F64 float64 + D time.Duration + TM time.Time + } + in := ` + S=abc + BT=true + BF=false + I=-1 + I8=-8 + I16=-16 + I32=-32 + I64=-64 + U=1 + U8=8 + U16=16 + U32=32 + U64=64 + F32=3.2 + F64=6.4 + D=5s + TM=2015-01-02T12:34:56Z + ` + out := &S{ + S: "abc", + BT: true, + BF: false, + I: -1, + I8: -8, + I16: -16, + I32: -32, + I64: -64, + U: 1, + U8: 8, + U16: 16, + U32: 32, + U64: 64, + F32: 3.2, + F64: 6.4, + D: 5 * time.Second, + TM: tm(t, time.RFC3339, "2015-01-02T12:34:56Z"), + } + testDecode(t, in, &S{}, out) +} + +func TestDecodeValueDefaults(t *testing.T) { + type S struct { + S string `properties:",default=abc"` + BT bool `properties:",default=true"` + BF bool `properties:",default=false"` + I int `properties:",default=-1"` + I8 int8 `properties:",default=-8"` + I16 int16 `properties:",default=-16"` + I32 int32 `properties:",default=-32"` + I64 int64 `properties:",default=-64"` + U uint `properties:",default=1"` + U8 uint8 `properties:",default=8"` + U16 uint16 `properties:",default=16"` + U32 uint32 `properties:",default=32"` + U64 uint64 `properties:",default=64"` + F32 float32 `properties:",default=3.2"` + F64 float64 `properties:",default=6.4"` + D time.Duration `properties:",default=5s"` + TM time.Time `properties:",default=2015-01-02T12:34:56Z"` + } + out := &S{ + S: "abc", + BT: true, + BF: false, + I: -1, + I8: -8, + I16: -16, + I32: -32, + I64: -64, + U: 1, + U8: 8, + U16: 16, + U32: 32, + U64: 64, + F32: 3.2, + F64: 6.4, + D: 5 * time.Second, + TM: tm(t, time.RFC3339, "2015-01-02T12:34:56Z"), + } + testDecode(t, "", &S{}, out) +} + +func TestDecodeArrays(t *testing.T) { + type S struct { + S []string + B []bool + I []int + I8 []int8 + I16 []int16 + I32 []int32 + I64 []int64 + U []uint + U8 []uint8 + U16 []uint16 + U32 []uint32 + U64 []uint64 + F32 []float32 + F64 []float64 + D []time.Duration + TM []time.Time + } + in := ` + S=a;b + B=true;false + I=-1;-2 + I8=-8;-9 + I16=-16;-17 + I32=-32;-33 + I64=-64;-65 + U=1;2 + U8=8;9 + U16=16;17 + U32=32;33 + U64=64;65 + F32=3.2;3.3 + F64=6.4;6.5 + D=4s;5s + TM=2015-01-01T00:00:00Z;2016-01-01T00:00:00Z + ` + out := &S{ + S: []string{"a", "b"}, + B: []bool{true, false}, + I: []int{-1, -2}, + I8: []int8{-8, -9}, + I16: []int16{-16, -17}, + I32: []int32{-32, -33}, + I64: []int64{-64, -65}, + U: []uint{1, 2}, + U8: []uint8{8, 9}, + U16: []uint16{16, 17}, + U32: []uint32{32, 33}, + U64: []uint64{64, 65}, + F32: []float32{3.2, 3.3}, + F64: []float64{6.4, 6.5}, + D: []time.Duration{4 * time.Second, 5 * time.Second}, + TM: []time.Time{tm(t, time.RFC3339, "2015-01-01T00:00:00Z"), tm(t, time.RFC3339, "2016-01-01T00:00:00Z")}, + } + testDecode(t, in, &S{}, out) +} + +func TestDecodeArrayDefaults(t *testing.T) { + type S struct { + S []string `properties:",default=a;b"` + B []bool `properties:",default=true;false"` + I []int `properties:",default=-1;-2"` + I8 []int8 `properties:",default=-8;-9"` + I16 []int16 `properties:",default=-16;-17"` + I32 []int32 `properties:",default=-32;-33"` + I64 []int64 `properties:",default=-64;-65"` + U []uint `properties:",default=1;2"` + U8 []uint8 `properties:",default=8;9"` + U16 []uint16 `properties:",default=16;17"` + U32 []uint32 `properties:",default=32;33"` + U64 []uint64 `properties:",default=64;65"` + F32 []float32 `properties:",default=3.2;3.3"` + F64 []float64 `properties:",default=6.4;6.5"` + D []time.Duration `properties:",default=4s;5s"` + TM []time.Time `properties:",default=2015-01-01T00:00:00Z;2016-01-01T00:00:00Z"` + } + out := &S{ + S: []string{"a", "b"}, + B: []bool{true, false}, + I: []int{-1, -2}, + I8: []int8{-8, -9}, + I16: []int16{-16, -17}, + I32: []int32{-32, -33}, + I64: []int64{-64, -65}, + U: []uint{1, 2}, + U8: []uint8{8, 9}, + U16: []uint16{16, 17}, + U32: []uint32{32, 33}, + U64: []uint64{64, 65}, + F32: []float32{3.2, 3.3}, + F64: []float64{6.4, 6.5}, + D: []time.Duration{4 * time.Second, 5 * time.Second}, + TM: []time.Time{tm(t, time.RFC3339, "2015-01-01T00:00:00Z"), tm(t, time.RFC3339, "2016-01-01T00:00:00Z")}, + } + testDecode(t, "", &S{}, out) +} + +func TestDecodeSkipUndef(t *testing.T) { + type S struct { + X string `properties:"-"` + Undef string `properties:",default=some value"` + } + in := `X=ignore` + out := &S{"", "some value"} + testDecode(t, in, &S{}, out) +} + +func TestDecodeStruct(t *testing.T) { + type A struct { + S string + T string `properties:"t"` + U string `properties:"u,default=uuu"` + } + type S struct { + A A + B A `properties:"b"` + } + in := ` + A.S=sss + A.t=ttt + b.S=SSS + b.t=TTT + ` + out := &S{ + A{S: "sss", T: "ttt", U: "uuu"}, + A{S: "SSS", T: "TTT", U: "uuu"}, + } + testDecode(t, in, &S{}, out) +} + +func TestDecodeMap(t *testing.T) { + type S struct { + A string `properties:"a"` + } + type X struct { + A map[string]string + B map[string][]string + C map[string]map[string]string + D map[string]S + E map[string]int + F map[string]int `properties:"-"` + } + in := ` + A.foo=bar + A.bar=bang + B.foo=a;b;c + B.bar=1;2;3 + C.foo.one=1 + C.foo.two=2 + C.bar.three=3 + C.bar.four=4 + D.foo.a=bar + ` + out := &X{ + A: map[string]string{"foo": "bar", "bar": "bang"}, + B: map[string][]string{"foo": []string{"a", "b", "c"}, "bar": []string{"1", "2", "3"}}, + C: map[string]map[string]string{"foo": map[string]string{"one": "1", "two": "2"}, "bar": map[string]string{"three": "3", "four": "4"}}, + D: map[string]S{"foo": S{"bar"}}, + E: map[string]int{}, + } + testDecode(t, in, &X{}, out) +} + +func testDecode(t *testing.T, in string, v, out interface{}) { + p, err := parse(in) + if err != nil { + t.Fatalf("got %v want nil", err) + } + if err := p.Decode(v); err != nil { + t.Fatalf("got %v want nil", err) + } + if got, want := v, out; !reflect.DeepEqual(got, want) { + t.Fatalf("\ngot %+v\nwant %+v", got, want) + } +} + +func tm(t *testing.T, layout, s string) time.Time { + tm, err := time.Parse(layout, s) + if err != nil { + t.Fatalf("got %v want nil", err) + } + return tm +} diff --git a/vendor/github.com/magiconair/properties/doc.go b/vendor/github.com/magiconair/properties/doc.go new file mode 100644 index 0000000000..ed1ff510ac --- /dev/null +++ b/vendor/github.com/magiconair/properties/doc.go @@ -0,0 +1,156 @@ +// Copyright 2016 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package properties provides functions for reading and writing +// ISO-8859-1 and UTF-8 encoded .properties files and has +// support for recursive property expansion. +// +// Java properties files are ISO-8859-1 encoded and use Unicode +// literals for characters outside the ISO character set. Unicode +// literals can be used in UTF-8 encoded properties files but +// aren't necessary. +// +// To load a single properties file use MustLoadFile(): +// +// p := properties.MustLoadFile(filename, properties.UTF8) +// +// To load multiple properties files use MustLoadFiles() +// which loads the files in the given order and merges the +// result. Missing properties files can be ignored if the +// 'ignoreMissing' flag is set to true. +// +// Filenames can contain environment variables which are expanded +// before loading. +// +// f1 := "/etc/myapp/myapp.conf" +// f2 := "/home/${USER}/myapp.conf" +// p := MustLoadFiles([]string{f1, f2}, properties.UTF8, true) +// +// All of the different key/value delimiters ' ', ':' and '=' are +// supported as well as the comment characters '!' and '#' and +// multi-line values. +// +// ! this is a comment +// # and so is this +// +// # the following expressions are equal +// key value +// key=value +// key:value +// key = value +// key : value +// key = val\ +// ue +// +// Properties stores all comments preceding a key and provides +// GetComments() and SetComments() methods to retrieve and +// update them. The convenience functions GetComment() and +// SetComment() allow access to the last comment. The +// WriteComment() method writes properties files including +// the comments and with the keys in the original order. +// This can be used for sanitizing properties files. +// +// Property expansion is recursive and circular references +// and malformed expressions are not allowed and cause an +// error. Expansion of environment variables is supported. +// +// # standard property +// key = value +// +// # property expansion: key2 = value +// key2 = ${key} +// +// # recursive expansion: key3 = value +// key3 = ${key2} +// +// # circular reference (error) +// key = ${key} +// +// # malformed expression (error) +// key = ${ke +// +// # refers to the users' home dir +// home = ${HOME} +// +// # local key takes precendence over env var: u = foo +// USER = foo +// u = ${USER} +// +// The default property expansion format is ${key} but can be +// changed by setting different pre- and postfix values on the +// Properties object. +// +// p := properties.NewProperties() +// p.Prefix = "#[" +// p.Postfix = "]#" +// +// Properties provides convenience functions for getting typed +// values with default values if the key does not exist or the +// type conversion failed. +// +// # Returns true if the value is either "1", "on", "yes" or "true" +// # Returns false for every other value and the default value if +// # the key does not exist. +// v = p.GetBool("key", false) +// +// # Returns the value if the key exists and the format conversion +// # was successful. Otherwise, the default value is returned. +// v = p.GetInt64("key", 999) +// v = p.GetUint64("key", 999) +// v = p.GetFloat64("key", 123.0) +// v = p.GetString("key", "def") +// v = p.GetDuration("key", 999) +// +// As an alterantive properties may be applied with the standard +// library's flag implementation at any time. +// +// # Standard configuration +// v = flag.Int("key", 999, "help message") +// flag.Parse() +// +// # Merge p into the flag set +// p.MustFlag(flag.CommandLine) +// +// Properties provides several MustXXX() convenience functions +// which will terminate the app if an error occurs. The behavior +// of the failure is configurable and the default is to call +// log.Fatal(err). To have the MustXXX() functions panic instead +// of logging the error set a different ErrorHandler before +// you use the Properties package. +// +// properties.ErrorHandler = properties.PanicHandler +// +// # Will panic instead of logging an error +// p := properties.MustLoadFile("config.properties") +// +// You can also provide your own ErrorHandler function. The only requirement +// is that the error handler function must exit after handling the error. +// +// properties.ErrorHandler = func(err error) { +// fmt.Println(err) +// os.Exit(1) +// } +// +// # Will write to stdout and then exit +// p := properties.MustLoadFile("config.properties") +// +// Properties can also be loaded into a struct via the `Decode` +// method, e.g. +// +// type S struct { +// A string `properties:"a,default=foo"` +// D time.Duration `properties:"timeout,default=5s"` +// E time.Time `properties:"expires,layout=2006-01-02,default=2015-01-01"` +// } +// +// See `Decode()` method for the full documentation. +// +// The following documents provide a description of the properties +// file format. +// +// http://en.wikipedia.org/wiki/.properties +// +// http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html#load%28java.io.Reader%29 +// +package properties diff --git a/vendor/github.com/magiconair/properties/example_test.go b/vendor/github.com/magiconair/properties/example_test.go new file mode 100644 index 0000000000..3601217e28 --- /dev/null +++ b/vendor/github.com/magiconair/properties/example_test.go @@ -0,0 +1,93 @@ +// Copyright 2016 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "log" +) + +func ExampleLoad_iso88591() { + buf := []byte("key = ISO-8859-1 value with unicode literal \\u2318 and umlaut \xE4") // 0xE4 == ä + p, _ := Load(buf, ISO_8859_1) + v, ok := p.Get("key") + fmt.Println(ok) + fmt.Println(v) + // Output: + // true + // ISO-8859-1 value with unicode literal ⌘ and umlaut ä +} + +func ExampleLoad_utf8() { + p, _ := Load([]byte("key = UTF-8 value with unicode character ⌘ and umlaut ä"), UTF8) + v, ok := p.Get("key") + fmt.Println(ok) + fmt.Println(v) + // Output: + // true + // UTF-8 value with unicode character ⌘ and umlaut ä +} + +func ExampleProperties_GetBool() { + var input = ` + key=1 + key2=On + key3=YES + key4=true` + p, _ := Load([]byte(input), ISO_8859_1) + fmt.Println(p.GetBool("key", false)) + fmt.Println(p.GetBool("key2", false)) + fmt.Println(p.GetBool("key3", false)) + fmt.Println(p.GetBool("key4", false)) + fmt.Println(p.GetBool("keyX", false)) + // Output: + // true + // true + // true + // true + // false +} + +func ExampleProperties_GetString() { + p, _ := Load([]byte("key=value"), ISO_8859_1) + v := p.GetString("another key", "default value") + fmt.Println(v) + // Output: + // default value +} + +func Example() { + // Decode some key/value pairs with expressions + p, err := Load([]byte("key=value\nkey2=${key}"), ISO_8859_1) + if err != nil { + log.Fatal(err) + } + + // Get a valid key + if v, ok := p.Get("key"); ok { + fmt.Println(v) + } + + // Get an invalid key + if _, ok := p.Get("does not exist"); !ok { + fmt.Println("invalid key") + } + + // Get a key with a default value + v := p.GetString("does not exist", "some value") + fmt.Println(v) + + // Dump the expanded key/value pairs of the Properties + fmt.Println("Expanded key/value pairs") + fmt.Println(p) + + // Output: + // value + // invalid key + // some value + // Expanded key/value pairs + // key = value + // key2 = value +} diff --git a/vendor/github.com/magiconair/properties/integrate.go b/vendor/github.com/magiconair/properties/integrate.go new file mode 100644 index 0000000000..37baaad958 --- /dev/null +++ b/vendor/github.com/magiconair/properties/integrate.go @@ -0,0 +1,34 @@ +// Copyright 2016 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import "flag" + +// MustFlag sets flags that are skipped by dst.Parse when p contains +// the respective key for flag.Flag.Name. +// +// It's use is recommended with command line arguments as in: +// flag.Parse() +// p.MustFlag(flag.CommandLine) +func (p *Properties) MustFlag(dst *flag.FlagSet) { + m := make(map[string]*flag.Flag) + dst.VisitAll(func(f *flag.Flag) { + m[f.Name] = f + }) + dst.Visit(func(f *flag.Flag) { + delete(m, f.Name) // overridden + }) + + for name, f := range m { + v, ok := p.Get(name) + if !ok { + continue + } + + if err := f.Value.Set(v); err != nil { + ErrorHandler(err) + } + } +} diff --git a/vendor/github.com/magiconair/properties/integrate_test.go b/vendor/github.com/magiconair/properties/integrate_test.go new file mode 100644 index 0000000000..2daaf8ab6a --- /dev/null +++ b/vendor/github.com/magiconair/properties/integrate_test.go @@ -0,0 +1,74 @@ +// Copyright 2016 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "flag" + "fmt" + "testing" +) + +// TestFlag verifies Properties.MustFlag without flag.FlagSet.Parse +func TestFlag(t *testing.T) { + f := flag.NewFlagSet("src", flag.PanicOnError) + gotS := f.String("s", "?", "string flag") + gotI := f.Int("i", -1, "int flag") + + p := NewProperties() + p.Set("s", "t") + p.Set("i", "9") + p.MustFlag(f) + + if want := "t"; *gotS != want { + t.Errorf("Got string s=%q, want %q", *gotS, want) + } + if want := 9; *gotI != want { + t.Errorf("Got int i=%d, want %d", *gotI, want) + } +} + +// TestFlagOverride verifies Properties.MustFlag with flag.FlagSet.Parse. +func TestFlagOverride(t *testing.T) { + f := flag.NewFlagSet("src", flag.PanicOnError) + gotA := f.Int("a", 1, "remain default") + gotB := f.Int("b", 2, "customized") + gotC := f.Int("c", 3, "overridden") + + f.Parse([]string{"-c", "4"}) + + p := NewProperties() + p.Set("b", "5") + p.Set("c", "6") + p.MustFlag(f) + + if want := 1; *gotA != want { + t.Errorf("Got remain default a=%d, want %d", *gotA, want) + } + if want := 5; *gotB != want { + t.Errorf("Got customized b=%d, want %d", *gotB, want) + } + if want := 4; *gotC != want { + t.Errorf("Got overriden c=%d, want %d", *gotC, want) + } +} + +func ExampleProperties_MustFlag() { + x := flag.Int("x", 0, "demo customize") + y := flag.Int("y", 0, "demo override") + + // Demo alternative for flag.Parse(): + flag.CommandLine.Parse([]string{"-y", "10"}) + fmt.Printf("flagged as x=%d, y=%d\n", *x, *y) + + p := NewProperties() + p.Set("x", "7") + p.Set("y", "42") // note discard + p.MustFlag(flag.CommandLine) + fmt.Printf("configured to x=%d, y=%d\n", *x, *y) + + // Output: + // flagged as x=0, y=10 + // configured to x=7, y=10 +} diff --git a/vendor/github.com/magiconair/properties/lex.go b/vendor/github.com/magiconair/properties/lex.go new file mode 100644 index 0000000000..014e63f0ef --- /dev/null +++ b/vendor/github.com/magiconair/properties/lex.go @@ -0,0 +1,409 @@ +// Copyright 2016 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. +// +// Parts of the lexer are from the template/text/parser package +// For these parts the following applies: +// +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file of the go 1.2 +// distribution. + +package properties + +import ( + "fmt" + "strconv" + "strings" + "unicode/utf8" +) + +// item represents a token or text string returned from the scanner. +type item struct { + typ itemType // The type of this item. + pos int // The starting position, in bytes, of this item in the input string. + val string // The value of this item. +} + +func (i item) String() string { + switch { + case i.typ == itemEOF: + return "EOF" + case i.typ == itemError: + return i.val + case len(i.val) > 10: + return fmt.Sprintf("%.10q...", i.val) + } + return fmt.Sprintf("%q", i.val) +} + +// itemType identifies the type of lex items. +type itemType int + +const ( + itemError itemType = iota // error occurred; value is text of error + itemEOF + itemKey // a key + itemValue // a value + itemComment // a comment +) + +// defines a constant for EOF +const eof = -1 + +// permitted whitespace characters space, FF and TAB +const whitespace = " \f\t" + +// stateFn represents the state of the scanner as a function that returns the next state. +type stateFn func(*lexer) stateFn + +// lexer holds the state of the scanner. +type lexer struct { + input string // the string being scanned + state stateFn // the next lexing function to enter + pos int // current position in the input + start int // start position of this item + width int // width of last rune read from input + lastPos int // position of most recent item returned by nextItem + runes []rune // scanned runes for this item + items chan item // channel of scanned items +} + +// next returns the next rune in the input. +func (l *lexer) next() rune { + if int(l.pos) >= len(l.input) { + l.width = 0 + return eof + } + r, w := utf8.DecodeRuneInString(l.input[l.pos:]) + l.width = w + l.pos += l.width + return r +} + +// peek returns but does not consume the next rune in the input. +func (l *lexer) peek() rune { + r := l.next() + l.backup() + return r +} + +// backup steps back one rune. Can only be called once per call of next. +func (l *lexer) backup() { + l.pos -= l.width +} + +// emit passes an item back to the client. +func (l *lexer) emit(t itemType) { + item := item{t, l.start, string(l.runes)} + l.items <- item + l.start = l.pos + l.runes = l.runes[:0] +} + +// ignore skips over the pending input before this point. +func (l *lexer) ignore() { + l.start = l.pos +} + +// appends the rune to the current value +func (l *lexer) appendRune(r rune) { + l.runes = append(l.runes, r) +} + +// accept consumes the next rune if it's from the valid set. +func (l *lexer) accept(valid string) bool { + if strings.IndexRune(valid, l.next()) >= 0 { + return true + } + l.backup() + return false +} + +// acceptRun consumes a run of runes from the valid set. +func (l *lexer) acceptRun(valid string) { + for strings.IndexRune(valid, l.next()) >= 0 { + } + l.backup() +} + +// acceptRunUntil consumes a run of runes up to a terminator. +func (l *lexer) acceptRunUntil(term rune) { + for term != l.next() { + } + l.backup() +} + +// hasText returns true if the current parsed text is not empty. +func (l *lexer) isNotEmpty() bool { + return l.pos > l.start +} + +// lineNumber reports which line we're on, based on the position of +// the previous item returned by nextItem. Doing it this way +// means we don't have to worry about peek double counting. +func (l *lexer) lineNumber() int { + return 1 + strings.Count(l.input[:l.lastPos], "\n") +} + +// errorf returns an error token and terminates the scan by passing +// back a nil pointer that will be the next state, terminating l.nextItem. +func (l *lexer) errorf(format string, args ...interface{}) stateFn { + l.items <- item{itemError, l.start, fmt.Sprintf(format, args...)} + return nil +} + +// nextItem returns the next item from the input. +func (l *lexer) nextItem() item { + item := <-l.items + l.lastPos = item.pos + return item +} + +// lex creates a new scanner for the input string. +func lex(input string) *lexer { + l := &lexer{ + input: input, + items: make(chan item), + runes: make([]rune, 0, 32), + } + go l.run() + return l +} + +// run runs the state machine for the lexer. +func (l *lexer) run() { + for l.state = lexBeforeKey(l); l.state != nil; { + l.state = l.state(l) + } +} + +// state functions + +// lexBeforeKey scans until a key begins. +func lexBeforeKey(l *lexer) stateFn { + switch r := l.next(); { + case isEOF(r): + l.emit(itemEOF) + return nil + + case isEOL(r): + l.ignore() + return lexBeforeKey + + case isComment(r): + return lexComment + + case isWhitespace(r): + l.acceptRun(whitespace) + l.ignore() + return lexKey + + default: + l.backup() + return lexKey + } +} + +// lexComment scans a comment line. The comment character has already been scanned. +func lexComment(l *lexer) stateFn { + l.acceptRun(whitespace) + l.ignore() + for { + switch r := l.next(); { + case isEOF(r): + l.ignore() + l.emit(itemEOF) + return nil + case isEOL(r): + l.emit(itemComment) + return lexBeforeKey + default: + l.appendRune(r) + } + } +} + +// lexKey scans the key up to a delimiter +func lexKey(l *lexer) stateFn { + var r rune + +Loop: + for { + switch r = l.next(); { + + case isEscape(r): + err := l.scanEscapeSequence() + if err != nil { + return l.errorf(err.Error()) + } + + case isEndOfKey(r): + l.backup() + break Loop + + case isEOF(r): + break Loop + + default: + l.appendRune(r) + } + } + + if len(l.runes) > 0 { + l.emit(itemKey) + } + + if isEOF(r) { + l.emit(itemEOF) + return nil + } + + return lexBeforeValue +} + +// lexBeforeValue scans the delimiter between key and value. +// Leading and trailing whitespace is ignored. +// We expect to be just after the key. +func lexBeforeValue(l *lexer) stateFn { + l.acceptRun(whitespace) + l.accept(":=") + l.acceptRun(whitespace) + l.ignore() + return lexValue +} + +// lexValue scans text until the end of the line. We expect to be just after the delimiter. +func lexValue(l *lexer) stateFn { + for { + switch r := l.next(); { + case isEscape(r): + r := l.peek() + if isEOL(r) { + l.next() + l.acceptRun(whitespace) + } else { + err := l.scanEscapeSequence() + if err != nil { + return l.errorf(err.Error()) + } + } + + case isEOL(r): + l.emit(itemValue) + l.ignore() + return lexBeforeKey + + case isEOF(r): + l.emit(itemValue) + l.emit(itemEOF) + return nil + + default: + l.appendRune(r) + } + } +} + +// scanEscapeSequence scans either one of the escaped characters +// or a unicode literal. We expect to be after the escape character. +func (l *lexer) scanEscapeSequence() error { + switch r := l.next(); { + + case isEscapedCharacter(r): + l.appendRune(decodeEscapedCharacter(r)) + return nil + + case atUnicodeLiteral(r): + return l.scanUnicodeLiteral() + + case isEOF(r): + return fmt.Errorf("premature EOF") + + // silently drop the escape character and append the rune as is + default: + l.appendRune(r) + return nil + } +} + +// scans a unicode literal in the form \uXXXX. We expect to be after the \u. +func (l *lexer) scanUnicodeLiteral() error { + // scan the digits + d := make([]rune, 4) + for i := 0; i < 4; i++ { + d[i] = l.next() + if d[i] == eof || !strings.ContainsRune("0123456789abcdefABCDEF", d[i]) { + return fmt.Errorf("invalid unicode literal") + } + } + + // decode the digits into a rune + r, err := strconv.ParseInt(string(d), 16, 0) + if err != nil { + return err + } + + l.appendRune(rune(r)) + return nil +} + +// decodeEscapedCharacter returns the unescaped rune. We expect to be after the escape character. +func decodeEscapedCharacter(r rune) rune { + switch r { + case 'f': + return '\f' + case 'n': + return '\n' + case 'r': + return '\r' + case 't': + return '\t' + default: + return r + } +} + +// atUnicodeLiteral reports whether we are at a unicode literal. +// The escape character has already been consumed. +func atUnicodeLiteral(r rune) bool { + return r == 'u' +} + +// isComment reports whether we are at the start of a comment. +func isComment(r rune) bool { + return r == '#' || r == '!' +} + +// isEndOfKey reports whether the rune terminates the current key. +func isEndOfKey(r rune) bool { + return strings.ContainsRune(" \f\t\r\n:=", r) +} + +// isEOF reports whether we are at EOF. +func isEOF(r rune) bool { + return r == eof +} + +// isEOL reports whether we are at a new line character. +func isEOL(r rune) bool { + return r == '\n' || r == '\r' +} + +// isEscape reports whether the rune is the escape character which +// prefixes unicode literals and other escaped characters. +func isEscape(r rune) bool { + return r == '\\' +} + +// isEscapedCharacter reports whether we are at one of the characters that need escaping. +// The escape character has already been consumed. +func isEscapedCharacter(r rune) bool { + return strings.ContainsRune(" :=fnrt", r) +} + +// isWhitespace reports whether the rune is a whitespace character. +func isWhitespace(r rune) bool { + return strings.ContainsRune(whitespace, r) +} diff --git a/vendor/github.com/magiconair/properties/load.go b/vendor/github.com/magiconair/properties/load.go new file mode 100644 index 0000000000..3915c73976 --- /dev/null +++ b/vendor/github.com/magiconair/properties/load.go @@ -0,0 +1,203 @@ +// Copyright 2016 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "bytes" + "fmt" + "io/ioutil" + "net/http" + "os" + "strings" +) + +// Encoding specifies encoding of the input data. +type Encoding uint + +const ( + // UTF8 interprets the input data as UTF-8. + UTF8 Encoding = 1 << iota + + // ISO_8859_1 interprets the input data as ISO-8859-1. + ISO_8859_1 +) + +// Load reads a buffer into a Properties struct. +func Load(buf []byte, enc Encoding) (*Properties, error) { + return loadBuf(buf, enc) +} + +// LoadString reads an UTF8 string into a properties struct. +func LoadString(s string) (*Properties, error) { + return loadBuf([]byte(s), UTF8) +} + +// LoadFile reads a file into a Properties struct. +func LoadFile(filename string, enc Encoding) (*Properties, error) { + return loadFiles([]string{filename}, enc, false) +} + +// LoadFiles reads multiple files in the given order into +// a Properties struct. If 'ignoreMissing' is true then +// non-existent files will not be reported as error. +func LoadFiles(filenames []string, enc Encoding, ignoreMissing bool) (*Properties, error) { + return loadFiles(filenames, enc, ignoreMissing) +} + +// LoadURL reads the content of the URL into a Properties struct. +// +// The encoding is determined via the Content-Type header which +// should be set to 'text/plain'. If the 'charset' parameter is +// missing, 'iso-8859-1' or 'latin1' the encoding is set to +// ISO-8859-1. If the 'charset' parameter is set to 'utf-8' the +// encoding is set to UTF-8. A missing content type header is +// interpreted as 'text/plain; charset=utf-8'. +func LoadURL(url string) (*Properties, error) { + return loadURLs([]string{url}, false) +} + +// LoadURLs reads the content of multiple URLs in the given order into a +// Properties struct. If 'ignoreMissing' is true then a 404 status code will +// not be reported as error. See LoadURL for the Content-Type header +// and the encoding. +func LoadURLs(urls []string, ignoreMissing bool) (*Properties, error) { + return loadURLs(urls, ignoreMissing) +} + +// MustLoadString reads an UTF8 string into a Properties struct and +// panics on error. +func MustLoadString(s string) *Properties { + return must(LoadString(s)) +} + +// MustLoadFile reads a file into a Properties struct and +// panics on error. +func MustLoadFile(filename string, enc Encoding) *Properties { + return must(LoadFile(filename, enc)) +} + +// MustLoadFiles reads multiple files in the given order into +// a Properties struct and panics on error. If 'ignoreMissing' +// is true then non-existent files will not be reported as error. +func MustLoadFiles(filenames []string, enc Encoding, ignoreMissing bool) *Properties { + return must(LoadFiles(filenames, enc, ignoreMissing)) +} + +// MustLoadURL reads the content of a URL into a Properties struct and +// panics on error. +func MustLoadURL(url string) *Properties { + return must(LoadURL(url)) +} + +// MustLoadFiles reads the content of multiple URLs in the given order into a +// Properties struct and panics on error. If 'ignoreMissing' is true then a 404 +// status code will not be reported as error. +func MustLoadURLs(urls []string, ignoreMissing bool) *Properties { + return must(LoadURLs(urls, ignoreMissing)) +} + +func loadBuf(buf []byte, enc Encoding) (*Properties, error) { + p, err := parse(convert(buf, enc)) + if err != nil { + return nil, err + } + return p, p.check() +} + +func loadFiles(filenames []string, enc Encoding, ignoreMissing bool) (*Properties, error) { + var buf bytes.Buffer + for _, filename := range filenames { + f, err := expandFilename(filename) + if err != nil { + return nil, err + } + + data, err := ioutil.ReadFile(f) + if err != nil { + if ignoreMissing && os.IsNotExist(err) { + LogPrintf("properties: %s not found. skipping", filename) + continue + } + return nil, err + } + + // concatenate the buffers and add a new line in case + // the previous file didn't end with a new line + buf.Write(data) + buf.WriteRune('\n') + } + return loadBuf(buf.Bytes(), enc) +} + +func loadURLs(urls []string, ignoreMissing bool) (*Properties, error) { + var buf bytes.Buffer + for _, u := range urls { + resp, err := http.Get(u) + if err != nil { + return nil, fmt.Errorf("properties: error fetching %q. %s", u, err) + } + if resp.StatusCode == 404 && ignoreMissing { + LogPrintf("properties: %s returned %d. skipping", u, resp.StatusCode) + continue + } + if resp.StatusCode != 200 { + return nil, fmt.Errorf("properties: %s returned %d", u, resp.StatusCode) + } + body, err := ioutil.ReadAll(resp.Body) + resp.Body.Close() + if err != nil { + return nil, fmt.Errorf("properties: %s error reading response. %s", u, err) + } + + ct := resp.Header.Get("Content-Type") + var enc Encoding + switch strings.ToLower(ct) { + case "text/plain", "text/plain; charset=iso-8859-1", "text/plain; charset=latin1": + enc = ISO_8859_1 + case "", "text/plain; charset=utf-8": + enc = UTF8 + default: + return nil, fmt.Errorf("properties: invalid content type %s", ct) + } + + buf.WriteString(convert(body, enc)) + buf.WriteRune('\n') + } + return loadBuf(buf.Bytes(), UTF8) +} + +func must(p *Properties, err error) *Properties { + if err != nil { + ErrorHandler(err) + } + return p +} + +// expandFilename expands ${ENV_VAR} expressions in a filename. +// If the environment variable does not exist then it will be replaced +// with an empty string. Malformed expressions like "${ENV_VAR" will +// be reported as error. +func expandFilename(filename string) (string, error) { + return expand(filename, make(map[string]bool), "${", "}", make(map[string]string)) +} + +// Interprets a byte buffer either as an ISO-8859-1 or UTF-8 encoded string. +// For ISO-8859-1 we can convert each byte straight into a rune since the +// first 256 unicode code points cover ISO-8859-1. +func convert(buf []byte, enc Encoding) string { + switch enc { + case UTF8: + return string(buf) + case ISO_8859_1: + runes := make([]rune, len(buf)) + for i, b := range buf { + runes[i] = rune(b) + } + return string(runes) + default: + ErrorHandler(fmt.Errorf("unsupported encoding %v", enc)) + } + panic("ErrorHandler should exit") +} diff --git a/vendor/github.com/magiconair/properties/load_test.go b/vendor/github.com/magiconair/properties/load_test.go new file mode 100644 index 0000000000..f95b948382 --- /dev/null +++ b/vendor/github.com/magiconair/properties/load_test.go @@ -0,0 +1,204 @@ +// Copyright 2016 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "io/ioutil" + "net/http" + "net/http/httptest" + "os" + "strings" + + . "github.com/magiconair/properties/_third_party/gopkg.in/check.v1" +) + +type LoadSuite struct { + tempFiles []string +} + +var _ = Suite(&LoadSuite{}) + +func (s *LoadSuite) TestLoadFailsWithNotExistingFile(c *C) { + _, err := LoadFile("doesnotexist.properties", ISO_8859_1) + c.Assert(err, NotNil) + c.Assert(err, ErrorMatches, "open.*no such file or directory") +} + +func (s *LoadSuite) TestLoadFilesFailsOnNotExistingFile(c *C) { + _, err := LoadFiles([]string{"doesnotexist.properties"}, ISO_8859_1, false) + c.Assert(err, NotNil) + c.Assert(err, ErrorMatches, "open.*no such file or directory") +} + +func (s *LoadSuite) TestLoadFilesDoesNotFailOnNotExistingFileAndIgnoreMissing(c *C) { + p, err := LoadFiles([]string{"doesnotexist.properties"}, ISO_8859_1, true) + c.Assert(err, IsNil) + c.Assert(p.Len(), Equals, 0) +} + +func (s *LoadSuite) TestLoadString(c *C) { + x := "key=äüö" + p1 := MustLoadString(x) + p2 := must(Load([]byte(x), UTF8)) + c.Assert(p1, DeepEquals, p2) +} + +func (s *LoadSuite) TestLoadFile(c *C) { + filename := s.makeFile(c, "key=value") + p := MustLoadFile(filename, ISO_8859_1) + + c.Assert(p.Len(), Equals, 1) + assertKeyValues(c, "", p, "key", "value") +} + +func (s *LoadSuite) TestLoadFiles(c *C) { + filename := s.makeFile(c, "key=value") + filename2 := s.makeFile(c, "key2=value2") + p := MustLoadFiles([]string{filename, filename2}, ISO_8859_1, false) + assertKeyValues(c, "", p, "key", "value", "key2", "value2") +} + +func (s *LoadSuite) TestLoadExpandedFile(c *C) { + filename := s.makeFilePrefix(c, os.Getenv("USER"), "key=value") + filename = strings.Replace(filename, os.Getenv("USER"), "${USER}", -1) + p := MustLoadFile(filename, ISO_8859_1) + assertKeyValues(c, "", p, "key", "value") +} + +func (s *LoadSuite) TestLoadFilesAndIgnoreMissing(c *C) { + filename := s.makeFile(c, "key=value") + filename2 := s.makeFile(c, "key2=value2") + p := MustLoadFiles([]string{filename, filename + "foo", filename2, filename2 + "foo"}, ISO_8859_1, true) + assertKeyValues(c, "", p, "key", "value", "key2", "value2") +} + +func (s *LoadSuite) TestLoadURL(c *C) { + srv := testServer() + defer srv.Close() + p := MustLoadURL(srv.URL + "/a") + assertKeyValues(c, "", p, "key", "value") +} + +func (s *LoadSuite) TestLoadURLs(c *C) { + srv := testServer() + defer srv.Close() + p := MustLoadURLs([]string{srv.URL + "/a", srv.URL + "/b"}, false) + assertKeyValues(c, "", p, "key", "value", "key2", "value2") +} + +func (s *LoadSuite) TestLoadURLsAndFailMissing(c *C) { + srv := testServer() + defer srv.Close() + p, err := LoadURLs([]string{srv.URL + "/a", srv.URL + "/c"}, false) + c.Assert(p, IsNil) + c.Assert(err, ErrorMatches, ".*returned 404.*") +} + +func (s *LoadSuite) TestLoadURLsAndIgnoreMissing(c *C) { + srv := testServer() + defer srv.Close() + p := MustLoadURLs([]string{srv.URL + "/a", srv.URL + "/b", srv.URL + "/c"}, true) + assertKeyValues(c, "", p, "key", "value", "key2", "value2") +} + +func (s *LoadSuite) TestLoadURLEncoding(c *C) { + srv := testServer() + defer srv.Close() + + uris := []string{"/none", "/utf8", "/plain", "/latin1", "/iso88591"} + for i, uri := range uris { + p := MustLoadURL(srv.URL + uri) + c.Assert(p.GetString("key", ""), Equals, "äöü", Commentf("%d", i)) + } +} + +func (s *LoadSuite) TestLoadURLFailInvalidEncoding(c *C) { + srv := testServer() + defer srv.Close() + + p, err := LoadURL(srv.URL + "/json") + c.Assert(p, IsNil) + c.Assert(err, ErrorMatches, ".*invalid content type.*") +} + +func (s *LoadSuite) SetUpSuite(c *C) { + s.tempFiles = make([]string, 0) +} + +func (s *LoadSuite) TearDownSuite(c *C) { + for _, path := range s.tempFiles { + err := os.Remove(path) + if err != nil { + fmt.Printf("os.Remove: %v", err) + } + } +} + +func (s *LoadSuite) makeFile(c *C, data string) string { + return s.makeFilePrefix(c, "properties", data) +} + +func (s *LoadSuite) makeFilePrefix(c *C, prefix, data string) string { + f, err := ioutil.TempFile("", prefix) + if err != nil { + fmt.Printf("ioutil.TempFile: %v", err) + c.FailNow() + } + + // remember the temp file so that we can remove it later + s.tempFiles = append(s.tempFiles, f.Name()) + + n, err := fmt.Fprint(f, data) + if err != nil { + fmt.Printf("fmt.Fprintln: %v", err) + c.FailNow() + } + if n != len(data) { + fmt.Printf("Data size mismatch. expected=%d wrote=%d\n", len(data), n) + c.FailNow() + } + + err = f.Close() + if err != nil { + fmt.Printf("f.Close: %v", err) + c.FailNow() + } + + return f.Name() +} + +func testServer() *httptest.Server { + return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + send := func(data []byte, contentType string) { + w.Header().Set("Content-Type", contentType) + w.Write(data) + } + + utf8 := []byte("key=äöü") + iso88591 := []byte{0x6b, 0x65, 0x79, 0x3d, 0xe4, 0xf6, 0xfc} // key=äöü + + switch r.RequestURI { + case "/a": + send([]byte("key=value"), "") + case "/b": + send([]byte("key2=value2"), "") + case "/none": + send(utf8, "") + case "/utf8": + send(utf8, "text/plain; charset=utf-8") + case "/json": + send(utf8, "application/json; charset=utf-8") + case "/plain": + send(iso88591, "text/plain") + case "/latin1": + send(iso88591, "text/plain; charset=latin1") + case "/iso88591": + send(iso88591, "text/plain; charset=iso-8859-1") + default: + w.WriteHeader(404) + } + })) +} diff --git a/vendor/github.com/magiconair/properties/parser.go b/vendor/github.com/magiconair/properties/parser.go new file mode 100644 index 0000000000..ff0e1e1578 --- /dev/null +++ b/vendor/github.com/magiconair/properties/parser.go @@ -0,0 +1,95 @@ +// Copyright 2016 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "runtime" +) + +type parser struct { + lex *lexer +} + +func parse(input string) (properties *Properties, err error) { + p := &parser{lex: lex(input)} + defer p.recover(&err) + + properties = NewProperties() + key := "" + comments := []string{} + + for { + token := p.expectOneOf(itemComment, itemKey, itemEOF) + switch token.typ { + case itemEOF: + goto done + case itemComment: + comments = append(comments, token.val) + continue + case itemKey: + key = token.val + if _, ok := properties.m[key]; !ok { + properties.k = append(properties.k, key) + } + } + + token = p.expectOneOf(itemValue, itemEOF) + if len(comments) > 0 { + properties.c[key] = comments + comments = []string{} + } + switch token.typ { + case itemEOF: + properties.m[key] = "" + goto done + case itemValue: + properties.m[key] = token.val + } + } + +done: + return properties, nil +} + +func (p *parser) errorf(format string, args ...interface{}) { + format = fmt.Sprintf("properties: Line %d: %s", p.lex.lineNumber(), format) + panic(fmt.Errorf(format, args...)) +} + +func (p *parser) expect(expected itemType) (token item) { + token = p.lex.nextItem() + if token.typ != expected { + p.unexpected(token) + } + return token +} + +func (p *parser) expectOneOf(expected ...itemType) (token item) { + token = p.lex.nextItem() + for _, v := range expected { + if token.typ == v { + return token + } + } + p.unexpected(token) + panic("unexpected token") +} + +func (p *parser) unexpected(token item) { + p.errorf(token.String()) +} + +// recover is the handler that turns panics into returns from the top level of Parse. +func (p *parser) recover(errp *error) { + e := recover() + if e != nil { + if _, ok := e.(runtime.Error); ok { + panic(e) + } + *errp = e.(error) + } + return +} diff --git a/vendor/github.com/magiconair/properties/properties.go b/vendor/github.com/magiconair/properties/properties.go new file mode 100644 index 0000000000..884ef4e079 --- /dev/null +++ b/vendor/github.com/magiconair/properties/properties.go @@ -0,0 +1,750 @@ +// Copyright 2016 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +// BUG(frank): Set() does not check for invalid unicode literals since this is currently handled by the lexer. +// BUG(frank): Write() does not allow to configure the newline character. Therefore, on Windows LF is used. + +import ( + "fmt" + "io" + "log" + "os" + "regexp" + "strconv" + "strings" + "time" + "unicode/utf8" +) + +// ErrorHandlerFunc defines the type of function which handles failures +// of the MustXXX() functions. An error handler function must exit +// the application after handling the error. +type ErrorHandlerFunc func(error) + +// ErrorHandler is the function which handles failures of the MustXXX() +// functions. The default is LogFatalHandler. +var ErrorHandler ErrorHandlerFunc = LogFatalHandler + +type LogHandlerFunc func(fmt string, args ...interface{}) + +var LogPrintf LogHandlerFunc = log.Printf + +// LogFatalHandler handles the error by logging a fatal error and exiting. +func LogFatalHandler(err error) { + log.Fatal(err) +} + +// PanicHandler handles the error by panicking. +func PanicHandler(err error) { + panic(err) +} + +// ----------------------------------------------------------------------------- + +// A Properties contains the key/value pairs from the properties input. +// All values are stored in unexpanded form and are expanded at runtime +type Properties struct { + // Pre-/Postfix for property expansion. + Prefix string + Postfix string + + // DisableExpansion controls the expansion of properties on Get() + // and the check for circular references on Set(). When set to + // true Properties behaves like a simple key/value store and does + // not check for circular references on Get() or on Set(). + DisableExpansion bool + + // Stores the key/value pairs + m map[string]string + + // Stores the comments per key. + c map[string][]string + + // Stores the keys in order of appearance. + k []string +} + +// NewProperties creates a new Properties struct with the default +// configuration for "${key}" expressions. +func NewProperties() *Properties { + return &Properties{ + Prefix: "${", + Postfix: "}", + m: map[string]string{}, + c: map[string][]string{}, + k: []string{}, + } +} + +// Get returns the expanded value for the given key if exists. +// Otherwise, ok is false. +func (p *Properties) Get(key string) (value string, ok bool) { + v, ok := p.m[key] + if p.DisableExpansion { + return v, ok + } + if !ok { + return "", false + } + + expanded, err := p.expand(v) + + // we guarantee that the expanded value is free of + // circular references and malformed expressions + // so we panic if we still get an error here. + if err != nil { + ErrorHandler(fmt.Errorf("%s in %q", err, key+" = "+v)) + } + + return expanded, true +} + +// MustGet returns the expanded value for the given key if exists. +// Otherwise, it panics. +func (p *Properties) MustGet(key string) string { + if v, ok := p.Get(key); ok { + return v + } + ErrorHandler(invalidKeyError(key)) + panic("ErrorHandler should exit") +} + +// ---------------------------------------------------------------------------- + +// ClearComments removes the comments for all keys. +func (p *Properties) ClearComments() { + p.c = map[string][]string{} +} + +// ---------------------------------------------------------------------------- + +// GetComment returns the last comment before the given key or an empty string. +func (p *Properties) GetComment(key string) string { + comments, ok := p.c[key] + if !ok || len(comments) == 0 { + return "" + } + return comments[len(comments)-1] +} + +// ---------------------------------------------------------------------------- + +// GetComments returns all comments that appeared before the given key or nil. +func (p *Properties) GetComments(key string) []string { + if comments, ok := p.c[key]; ok { + return comments + } + return nil +} + +// ---------------------------------------------------------------------------- + +// SetComment sets the comment for the key. +func (p *Properties) SetComment(key, comment string) { + p.c[key] = []string{comment} +} + +// ---------------------------------------------------------------------------- + +// SetComments sets the comments for the key. If the comments are nil then +// all comments for this key are deleted. +func (p *Properties) SetComments(key string, comments []string) { + if comments == nil { + delete(p.c, key) + return + } + p.c[key] = comments +} + +// ---------------------------------------------------------------------------- + +// GetBool checks if the expanded value is one of '1', 'yes', +// 'true' or 'on' if the key exists. The comparison is case-insensitive. +// If the key does not exist the default value is returned. +func (p *Properties) GetBool(key string, def bool) bool { + v, err := p.getBool(key) + if err != nil { + return def + } + return v +} + +// MustGetBool checks if the expanded value is one of '1', 'yes', +// 'true' or 'on' if the key exists. The comparison is case-insensitive. +// If the key does not exist the function panics. +func (p *Properties) MustGetBool(key string) bool { + v, err := p.getBool(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getBool(key string) (value bool, err error) { + if v, ok := p.Get(key); ok { + return boolVal(v), nil + } + return false, invalidKeyError(key) +} + +func boolVal(v string) bool { + v = strings.ToLower(v) + return v == "1" || v == "true" || v == "yes" || v == "on" +} + +// ---------------------------------------------------------------------------- + +// GetDuration parses the expanded value as an time.Duration (in ns) if the +// key exists. If key does not exist or the value cannot be parsed the default +// value is returned. In almost all cases you want to use GetParsedDuration(). +func (p *Properties) GetDuration(key string, def time.Duration) time.Duration { + v, err := p.getInt64(key) + if err != nil { + return def + } + return time.Duration(v) +} + +// MustGetDuration parses the expanded value as an time.Duration (in ns) if +// the key exists. If key does not exist or the value cannot be parsed the +// function panics. In almost all cases you want to use MustGetParsedDuration(). +func (p *Properties) MustGetDuration(key string) time.Duration { + v, err := p.getInt64(key) + if err != nil { + ErrorHandler(err) + } + return time.Duration(v) +} + +// ---------------------------------------------------------------------------- + +// GetParsedDuration parses the expanded value with time.ParseDuration() if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetParsedDuration(key string, def time.Duration) time.Duration { + s, ok := p.Get(key) + if !ok { + return def + } + v, err := time.ParseDuration(s) + if err != nil { + return def + } + return v +} + +// MustGetParsedDuration parses the expanded value with time.ParseDuration() if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetParsedDuration(key string) time.Duration { + s, ok := p.Get(key) + if !ok { + ErrorHandler(invalidKeyError(key)) + } + v, err := time.ParseDuration(s) + if err != nil { + ErrorHandler(err) + } + return v +} + +// ---------------------------------------------------------------------------- + +// GetFloat64 parses the expanded value as a float64 if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetFloat64(key string, def float64) float64 { + v, err := p.getFloat64(key) + if err != nil { + return def + } + return v +} + +// MustGetFloat64 parses the expanded value as a float64 if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetFloat64(key string) float64 { + v, err := p.getFloat64(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getFloat64(key string) (value float64, err error) { + if v, ok := p.Get(key); ok { + value, err = strconv.ParseFloat(v, 64) + if err != nil { + return 0, err + } + return value, nil + } + return 0, invalidKeyError(key) +} + +// ---------------------------------------------------------------------------- + +// GetInt parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. If the value does not fit into an int the +// function panics with an out of range error. +func (p *Properties) GetInt(key string, def int) int { + v, err := p.getInt64(key) + if err != nil { + return def + } + return intRangeCheck(key, v) +} + +// MustGetInt parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +// If the value does not fit into an int the function panics with +// an out of range error. +func (p *Properties) MustGetInt(key string) int { + v, err := p.getInt64(key) + if err != nil { + ErrorHandler(err) + } + return intRangeCheck(key, v) +} + +// ---------------------------------------------------------------------------- + +// GetInt64 parses the expanded value as an int64 if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetInt64(key string, def int64) int64 { + v, err := p.getInt64(key) + if err != nil { + return def + } + return v +} + +// MustGetInt64 parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetInt64(key string) int64 { + v, err := p.getInt64(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getInt64(key string) (value int64, err error) { + if v, ok := p.Get(key); ok { + value, err = strconv.ParseInt(v, 10, 64) + if err != nil { + return 0, err + } + return value, nil + } + return 0, invalidKeyError(key) +} + +// ---------------------------------------------------------------------------- + +// GetUint parses the expanded value as an uint if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. If the value does not fit into an int the +// function panics with an out of range error. +func (p *Properties) GetUint(key string, def uint) uint { + v, err := p.getUint64(key) + if err != nil { + return def + } + return uintRangeCheck(key, v) +} + +// MustGetUint parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +// If the value does not fit into an int the function panics with +// an out of range error. +func (p *Properties) MustGetUint(key string) uint { + v, err := p.getUint64(key) + if err != nil { + ErrorHandler(err) + } + return uintRangeCheck(key, v) +} + +// ---------------------------------------------------------------------------- + +// GetUint64 parses the expanded value as an uint64 if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetUint64(key string, def uint64) uint64 { + v, err := p.getUint64(key) + if err != nil { + return def + } + return v +} + +// MustGetUint64 parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetUint64(key string) uint64 { + v, err := p.getUint64(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getUint64(key string) (value uint64, err error) { + if v, ok := p.Get(key); ok { + value, err = strconv.ParseUint(v, 10, 64) + if err != nil { + return 0, err + } + return value, nil + } + return 0, invalidKeyError(key) +} + +// ---------------------------------------------------------------------------- + +// GetString returns the expanded value for the given key if exists or +// the default value otherwise. +func (p *Properties) GetString(key, def string) string { + if v, ok := p.Get(key); ok { + return v + } + return def +} + +// MustGetString returns the expanded value for the given key if exists or +// panics otherwise. +func (p *Properties) MustGetString(key string) string { + if v, ok := p.Get(key); ok { + return v + } + ErrorHandler(invalidKeyError(key)) + panic("ErrorHandler should exit") +} + +// ---------------------------------------------------------------------------- + +// Filter returns a new properties object which contains all properties +// for which the key matches the pattern. +func (p *Properties) Filter(pattern string) (*Properties, error) { + re, err := regexp.Compile(pattern) + if err != nil { + return nil, err + } + + return p.FilterRegexp(re), nil +} + +// FilterRegexp returns a new properties object which contains all properties +// for which the key matches the regular expression. +func (p *Properties) FilterRegexp(re *regexp.Regexp) *Properties { + pp := NewProperties() + for _, k := range p.k { + if re.MatchString(k) { + pp.Set(k, p.m[k]) + } + } + return pp +} + +// FilterPrefix returns a new properties object with a subset of all keys +// with the given prefix. +func (p *Properties) FilterPrefix(prefix string) *Properties { + pp := NewProperties() + for _, k := range p.k { + if strings.HasPrefix(k, prefix) { + pp.Set(k, p.m[k]) + } + } + return pp +} + +// FilterStripPrefix returns a new properties object with a subset of all keys +// with the given prefix and the prefix removed from the keys. +func (p *Properties) FilterStripPrefix(prefix string) *Properties { + pp := NewProperties() + n := len(prefix) + for _, k := range p.k { + if len(k) > len(prefix) && strings.HasPrefix(k, prefix) { + pp.Set(k[n:], p.m[k]) + } + } + return pp +} + +// Len returns the number of keys. +func (p *Properties) Len() int { + return len(p.m) +} + +// Keys returns all keys in the same order as in the input. +func (p *Properties) Keys() []string { + keys := make([]string, len(p.k)) + for i, k := range p.k { + keys[i] = k + } + return keys +} + +// Set sets the property key to the corresponding value. +// If a value for key existed before then ok is true and prev +// contains the previous value. If the value contains a +// circular reference or a malformed expression then +// an error is returned. +// An empty key is silently ignored. +func (p *Properties) Set(key, value string) (prev string, ok bool, err error) { + if key == "" { + return "", false, nil + } + + // if expansion is disabled we allow circular references + if p.DisableExpansion { + prev, ok = p.Get(key) + p.m[key] = value + return prev, ok, nil + } + + // to check for a circular reference we temporarily need + // to set the new value. If there is an error then revert + // to the previous state. Only if all tests are successful + // then we add the key to the p.k list. + prev, ok = p.Get(key) + p.m[key] = value + + // now check for a circular reference + _, err = p.expand(value) + if err != nil { + + // revert to the previous state + if ok { + p.m[key] = prev + } else { + delete(p.m, key) + } + + return "", false, err + } + + if !ok { + p.k = append(p.k, key) + } + + return prev, ok, nil +} + +// MustSet sets the property key to the corresponding value. +// If a value for key existed before then ok is true and prev +// contains the previous value. An empty key is silently ignored. +func (p *Properties) MustSet(key, value string) (prev string, ok bool) { + prev, ok, err := p.Set(key, value) + if err != nil { + ErrorHandler(err) + } + return prev, ok +} + +// String returns a string of all expanded 'key = value' pairs. +func (p *Properties) String() string { + var s string + for _, key := range p.k { + value, _ := p.Get(key) + s = fmt.Sprintf("%s%s = %s\n", s, key, value) + } + return s +} + +// Write writes all unexpanded 'key = value' pairs to the given writer. +// Write returns the number of bytes written and any write error encountered. +func (p *Properties) Write(w io.Writer, enc Encoding) (n int, err error) { + return p.WriteComment(w, "", enc) +} + +// WriteComment writes all unexpanced 'key = value' pairs to the given writer. +// If prefix is not empty then comments are written with a blank line and the +// given prefix. The prefix should be either "# " or "! " to be compatible with +// the properties file format. Otherwise, the properties parser will not be +// able to read the file back in. It returns the number of bytes written and +// any write error encountered. +func (p *Properties) WriteComment(w io.Writer, prefix string, enc Encoding) (n int, err error) { + var x int + + for _, key := range p.k { + value := p.m[key] + + if prefix != "" { + if comments, ok := p.c[key]; ok { + // don't print comments if they are all empty + allEmpty := true + for _, c := range comments { + if c != "" { + allEmpty = false + break + } + } + + if !allEmpty { + // add a blank line between entries but not at the top + if len(comments) > 0 && n > 0 { + x, err = fmt.Fprintln(w) + if err != nil { + return + } + n += x + } + + for _, c := range comments { + x, err = fmt.Fprintf(w, "%s%s\n", prefix, encode(c, "", enc)) + if err != nil { + return + } + n += x + } + } + } + } + + x, err = fmt.Fprintf(w, "%s = %s\n", encode(key, " :", enc), encode(value, "", enc)) + if err != nil { + return + } + n += x + } + return +} + +// ---------------------------------------------------------------------------- + +// Delete removes the key and its comments. +func (p *Properties) Delete(key string) { + delete(p.m, key) + delete(p.c, key) + newKeys := []string{} + for _, k := range p.k { + if k != key { + newKeys = append(newKeys, key) + } + } + p.k = newKeys +} + +// ---------------------------------------------------------------------------- + +// check expands all values and returns an error if a circular reference or +// a malformed expression was found. +func (p *Properties) check() error { + for _, value := range p.m { + if _, err := p.expand(value); err != nil { + return err + } + } + return nil +} + +func (p *Properties) expand(input string) (string, error) { + // no pre/postfix -> nothing to expand + if p.Prefix == "" && p.Postfix == "" { + return input, nil + } + + return expand(input, make(map[string]bool), p.Prefix, p.Postfix, p.m) +} + +// expand recursively expands expressions of '(prefix)key(postfix)' to their corresponding values. +// The function keeps track of the keys that were already expanded and stops if it +// detects a circular reference or a malformed expression of the form '(prefix)key'. +func expand(s string, keys map[string]bool, prefix, postfix string, values map[string]string) (string, error) { + start := strings.Index(s, prefix) + if start == -1 { + return s, nil + } + + keyStart := start + len(prefix) + keyLen := strings.Index(s[keyStart:], postfix) + if keyLen == -1 { + return "", fmt.Errorf("malformed expression") + } + + end := keyStart + keyLen + len(postfix) - 1 + key := s[keyStart : keyStart+keyLen] + + // fmt.Printf("s:%q pp:%q start:%d end:%d keyStart:%d keyLen:%d key:%q\n", s, prefix + "..." + postfix, start, end, keyStart, keyLen, key) + + if _, ok := keys[key]; ok { + return "", fmt.Errorf("circular reference") + } + + val, ok := values[key] + if !ok { + val = os.Getenv(key) + } + + // remember that we've seen the key + keys[key] = true + + return expand(s[:start]+val+s[end+1:], keys, prefix, postfix, values) +} + +// encode encodes a UTF-8 string to ISO-8859-1 and escapes some characters. +func encode(s string, special string, enc Encoding) string { + switch enc { + case UTF8: + return encodeUtf8(s, special) + case ISO_8859_1: + return encodeIso(s, special) + default: + panic(fmt.Sprintf("unsupported encoding %v", enc)) + } +} + +func encodeUtf8(s string, special string) string { + v := "" + for pos := 0; pos < len(s); { + r, w := utf8.DecodeRuneInString(s[pos:]) + pos += w + v += escape(r, special) + } + return v +} + +func encodeIso(s string, special string) string { + var r rune + var w int + var v string + for pos := 0; pos < len(s); { + switch r, w = utf8.DecodeRuneInString(s[pos:]); { + case r < 1<<8: // single byte rune -> escape special chars only + v += escape(r, special) + case r < 1<<16: // two byte rune -> unicode literal + v += fmt.Sprintf("\\u%04x", r) + default: // more than two bytes per rune -> can't encode + v += "?" + } + pos += w + } + return v +} + +func escape(r rune, special string) string { + switch r { + case '\f': + return "\\f" + case '\n': + return "\\n" + case '\r': + return "\\r" + case '\t': + return "\\t" + default: + if strings.ContainsRune(special, r) { + return "\\" + string(r) + } + return string(r) + } +} + +func invalidKeyError(key string) error { + return fmt.Errorf("unknown property: %s", key) +} diff --git a/vendor/github.com/magiconair/properties/properties_test.go b/vendor/github.com/magiconair/properties/properties_test.go new file mode 100644 index 0000000000..c0af16e7e9 --- /dev/null +++ b/vendor/github.com/magiconair/properties/properties_test.go @@ -0,0 +1,906 @@ +// Copyright 2016 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "bytes" + "flag" + "fmt" + "math" + "os" + "strings" + "testing" + "time" + + . "github.com/magiconair/properties/_third_party/gopkg.in/check.v1" +) + +func Test(t *testing.T) { TestingT(t) } + +type TestSuite struct { + prevHandler ErrorHandlerFunc +} + +var ( + _ = Suite(&TestSuite{}) + verbose = flag.Bool("verbose", false, "Verbose output") +) + +// -------------------------------------------------------------------- + +func (s *TestSuite) SetUpSuite(c *C) { + s.prevHandler = ErrorHandler + ErrorHandler = PanicHandler +} + +// -------------------------------------------------------------------- + +func (s *TestSuite) TearDownSuite(c *C) { + ErrorHandler = s.prevHandler +} + +// ---------------------------------------------------------------------------- + +// define test cases in the form of +// {"input", "key1", "value1", "key2", "value2", ...} +var complexTests = [][]string{ + // whitespace prefix + {" key=value", "key", "value"}, // SPACE prefix + {"\fkey=value", "key", "value"}, // FF prefix + {"\tkey=value", "key", "value"}, // TAB prefix + {" \f\tkey=value", "key", "value"}, // mix prefix + + // multiple keys + {"key1=value1\nkey2=value2\n", "key1", "value1", "key2", "value2"}, + {"key1=value1\rkey2=value2\r", "key1", "value1", "key2", "value2"}, + {"key1=value1\r\nkey2=value2\r\n", "key1", "value1", "key2", "value2"}, + + // blank lines + {"\nkey=value\n", "key", "value"}, + {"\rkey=value\r", "key", "value"}, + {"\r\nkey=value\r\n", "key", "value"}, + + // escaped chars in key + {"k\\ ey = value", "k ey", "value"}, + {"k\\:ey = value", "k:ey", "value"}, + {"k\\=ey = value", "k=ey", "value"}, + {"k\\fey = value", "k\fey", "value"}, + {"k\\ney = value", "k\ney", "value"}, + {"k\\rey = value", "k\rey", "value"}, + {"k\\tey = value", "k\tey", "value"}, + + // escaped chars in value + {"key = v\\ alue", "key", "v alue"}, + {"key = v\\:alue", "key", "v:alue"}, + {"key = v\\=alue", "key", "v=alue"}, + {"key = v\\falue", "key", "v\falue"}, + {"key = v\\nalue", "key", "v\nalue"}, + {"key = v\\ralue", "key", "v\ralue"}, + {"key = v\\talue", "key", "v\talue"}, + + // silently dropped escape character + {"k\\zey = value", "kzey", "value"}, + {"key = v\\zalue", "key", "vzalue"}, + + // unicode literals + {"key\\u2318 = value", "key⌘", "value"}, + {"k\\u2318ey = value", "k⌘ey", "value"}, + {"key = value\\u2318", "key", "value⌘"}, + {"key = valu\\u2318e", "key", "valu⌘e"}, + + // multiline values + {"key = valueA,\\\n valueB", "key", "valueA,valueB"}, // SPACE indent + {"key = valueA,\\\n\f\f\fvalueB", "key", "valueA,valueB"}, // FF indent + {"key = valueA,\\\n\t\t\tvalueB", "key", "valueA,valueB"}, // TAB indent + {"key = valueA,\\\n \f\tvalueB", "key", "valueA,valueB"}, // mix indent + + // comments + {"# this is a comment\n! and so is this\nkey1=value1\nkey#2=value#2\n\nkey!3=value!3\n# and another one\n! and the final one", "key1", "value1", "key#2", "value#2", "key!3", "value!3"}, + + // expansion tests + {"key=value\nkey2=${key}", "key", "value", "key2", "value"}, + {"key=value\nkey2=aa${key}", "key", "value", "key2", "aavalue"}, + {"key=value\nkey2=${key}bb", "key", "value", "key2", "valuebb"}, + {"key=value\nkey2=aa${key}bb", "key", "value", "key2", "aavaluebb"}, + {"key=value\nkey2=${key}\nkey3=${key2}", "key", "value", "key2", "value", "key3", "value"}, + {"key=${USER}", "key", os.Getenv("USER")}, + {"key=${USER}\nUSER=value", "key", "value", "USER", "value"}, +} + +// ---------------------------------------------------------------------------- + +var commentTests = []struct { + input, key, value string + comments []string +}{ + {"key=value", "key", "value", nil}, + {"#\nkey=value", "key", "value", []string{""}}, + {"#comment\nkey=value", "key", "value", []string{"comment"}}, + {"# comment\nkey=value", "key", "value", []string{"comment"}}, + {"# comment\nkey=value", "key", "value", []string{"comment"}}, + {"# comment\n\nkey=value", "key", "value", []string{"comment"}}, + {"# comment1\n# comment2\nkey=value", "key", "value", []string{"comment1", "comment2"}}, + {"# comment1\n\n# comment2\n\nkey=value", "key", "value", []string{"comment1", "comment2"}}, + {"!comment\nkey=value", "key", "value", []string{"comment"}}, + {"! comment\nkey=value", "key", "value", []string{"comment"}}, + {"! comment\nkey=value", "key", "value", []string{"comment"}}, + {"! comment\n\nkey=value", "key", "value", []string{"comment"}}, + {"! comment1\n! comment2\nkey=value", "key", "value", []string{"comment1", "comment2"}}, + {"! comment1\n\n! comment2\n\nkey=value", "key", "value", []string{"comment1", "comment2"}}, +} + +// ---------------------------------------------------------------------------- + +var errorTests = []struct { + input, msg string +}{ + // unicode literals + {"key\\u1 = value", "invalid unicode literal"}, + {"key\\u12 = value", "invalid unicode literal"}, + {"key\\u123 = value", "invalid unicode literal"}, + {"key\\u123g = value", "invalid unicode literal"}, + {"key\\u123", "invalid unicode literal"}, + + // circular references + {"key=${key}", "circular reference"}, + {"key1=${key2}\nkey2=${key1}", "circular reference"}, + + // malformed expressions + {"key=${ke", "malformed expression"}, + {"key=valu${ke", "malformed expression"}, +} + +// ---------------------------------------------------------------------------- + +var writeTests = []struct { + input, output, encoding string +}{ + // ISO-8859-1 tests + {"key = value", "key = value\n", "ISO-8859-1"}, + {"key = value \\\n continued", "key = value continued\n", "ISO-8859-1"}, + {"key⌘ = value", "key\\u2318 = value\n", "ISO-8859-1"}, + {"ke\\ \\:y = value", "ke\\ \\:y = value\n", "ISO-8859-1"}, + + // UTF-8 tests + {"key = value", "key = value\n", "UTF-8"}, + {"key = value \\\n continued", "key = value continued\n", "UTF-8"}, + {"key⌘ = value⌘", "key⌘ = value⌘\n", "UTF-8"}, + {"ke\\ \\:y = value", "ke\\ \\:y = value\n", "UTF-8"}, +} + +// ---------------------------------------------------------------------------- + +var writeCommentTests = []struct { + input, output, encoding string +}{ + // ISO-8859-1 tests + {"key = value", "key = value\n", "ISO-8859-1"}, + {"#\nkey = value", "key = value\n", "ISO-8859-1"}, + {"#\n#\n#\nkey = value", "key = value\n", "ISO-8859-1"}, + {"# comment\nkey = value", "# comment\nkey = value\n", "ISO-8859-1"}, + {"\n# comment\nkey = value", "# comment\nkey = value\n", "ISO-8859-1"}, + {"# comment\n\nkey = value", "# comment\nkey = value\n", "ISO-8859-1"}, + {"# comment1\n# comment2\nkey = value", "# comment1\n# comment2\nkey = value\n", "ISO-8859-1"}, + {"#comment1\nkey1 = value1\n#comment2\nkey2 = value2", "# comment1\nkey1 = value1\n\n# comment2\nkey2 = value2\n", "ISO-8859-1"}, + + // UTF-8 tests + {"key = value", "key = value\n", "UTF-8"}, + {"# comment⌘\nkey = value⌘", "# comment⌘\nkey = value⌘\n", "UTF-8"}, + {"\n# comment⌘\nkey = value⌘", "# comment⌘\nkey = value⌘\n", "UTF-8"}, + {"# comment⌘\n\nkey = value⌘", "# comment⌘\nkey = value⌘\n", "UTF-8"}, + {"# comment1⌘\n# comment2⌘\nkey = value⌘", "# comment1⌘\n# comment2⌘\nkey = value⌘\n", "UTF-8"}, + {"#comment1⌘\nkey1 = value1⌘\n#comment2⌘\nkey2 = value2⌘", "# comment1⌘\nkey1 = value1⌘\n\n# comment2⌘\nkey2 = value2⌘\n", "UTF-8"}, +} + +// ---------------------------------------------------------------------------- + +var boolTests = []struct { + input, key string + def, value bool +}{ + // valid values for TRUE + {"key = 1", "key", false, true}, + {"key = on", "key", false, true}, + {"key = On", "key", false, true}, + {"key = ON", "key", false, true}, + {"key = true", "key", false, true}, + {"key = True", "key", false, true}, + {"key = TRUE", "key", false, true}, + {"key = yes", "key", false, true}, + {"key = Yes", "key", false, true}, + {"key = YES", "key", false, true}, + + // valid values for FALSE (all other) + {"key = 0", "key", true, false}, + {"key = off", "key", true, false}, + {"key = false", "key", true, false}, + {"key = no", "key", true, false}, + + // non existent key + {"key = true", "key2", false, false}, +} + +// ---------------------------------------------------------------------------- + +var durationTests = []struct { + input, key string + def, value time.Duration +}{ + // valid values + {"key = 1", "key", 999, 1}, + {"key = 0", "key", 999, 0}, + {"key = -1", "key", 999, -1}, + {"key = 0123", "key", 999, 123}, + + // invalid values + {"key = 0xff", "key", 999, 999}, + {"key = 1.0", "key", 999, 999}, + {"key = a", "key", 999, 999}, + + // non existent key + {"key = 1", "key2", 999, 999}, +} + +// ---------------------------------------------------------------------------- + +var parsedDurationTests = []struct { + input, key string + def, value time.Duration +}{ + // valid values + {"key = -1ns", "key", 999, -1 * time.Nanosecond}, + {"key = 300ms", "key", 999, 300 * time.Millisecond}, + {"key = 5s", "key", 999, 5 * time.Second}, + {"key = 3h", "key", 999, 3 * time.Hour}, + {"key = 2h45m", "key", 999, 2*time.Hour + 45*time.Minute}, + + // invalid values + {"key = 0xff", "key", 999, 999}, + {"key = 1.0", "key", 999, 999}, + {"key = a", "key", 999, 999}, + {"key = 1", "key", 999, 999}, + {"key = 0", "key", 999, 0}, + + // non existent key + {"key = 1", "key2", 999, 999}, +} + +// ---------------------------------------------------------------------------- + +var floatTests = []struct { + input, key string + def, value float64 +}{ + // valid values + {"key = 1.0", "key", 999, 1.0}, + {"key = 0.0", "key", 999, 0.0}, + {"key = -1.0", "key", 999, -1.0}, + {"key = 1", "key", 999, 1}, + {"key = 0", "key", 999, 0}, + {"key = -1", "key", 999, -1}, + {"key = 0123", "key", 999, 123}, + + // invalid values + {"key = 0xff", "key", 999, 999}, + {"key = a", "key", 999, 999}, + + // non existent key + {"key = 1", "key2", 999, 999}, +} + +// ---------------------------------------------------------------------------- + +var int64Tests = []struct { + input, key string + def, value int64 +}{ + // valid values + {"key = 1", "key", 999, 1}, + {"key = 0", "key", 999, 0}, + {"key = -1", "key", 999, -1}, + {"key = 0123", "key", 999, 123}, + + // invalid values + {"key = 0xff", "key", 999, 999}, + {"key = 1.0", "key", 999, 999}, + {"key = a", "key", 999, 999}, + + // non existent key + {"key = 1", "key2", 999, 999}, +} + +// ---------------------------------------------------------------------------- + +var uint64Tests = []struct { + input, key string + def, value uint64 +}{ + // valid values + {"key = 1", "key", 999, 1}, + {"key = 0", "key", 999, 0}, + {"key = 0123", "key", 999, 123}, + + // invalid values + {"key = -1", "key", 999, 999}, + {"key = 0xff", "key", 999, 999}, + {"key = 1.0", "key", 999, 999}, + {"key = a", "key", 999, 999}, + + // non existent key + {"key = 1", "key2", 999, 999}, +} + +// ---------------------------------------------------------------------------- + +var stringTests = []struct { + input, key string + def, value string +}{ + // valid values + {"key = abc", "key", "def", "abc"}, + + // non existent key + {"key = abc", "key2", "def", "def"}, +} + +// ---------------------------------------------------------------------------- + +var keysTests = []struct { + input string + keys []string +}{ + {"", []string{}}, + {"key = abc", []string{"key"}}, + {"key = abc\nkey2=def", []string{"key", "key2"}}, + {"key2 = abc\nkey=def", []string{"key2", "key"}}, + {"key = abc\nkey=def", []string{"key"}}, +} + +// ---------------------------------------------------------------------------- + +var filterTests = []struct { + input string + pattern string + keys []string + err string +}{ + {"", "", []string{}, ""}, + {"", "abc", []string{}, ""}, + {"key=value", "", []string{"key"}, ""}, + {"key=value", "key=", []string{}, ""}, + {"key=value\nfoo=bar", "", []string{"foo", "key"}, ""}, + {"key=value\nfoo=bar", "f", []string{"foo"}, ""}, + {"key=value\nfoo=bar", "fo", []string{"foo"}, ""}, + {"key=value\nfoo=bar", "foo", []string{"foo"}, ""}, + {"key=value\nfoo=bar", "fooo", []string{}, ""}, + {"key=value\nkey2=value2\nfoo=bar", "ey", []string{"key", "key2"}, ""}, + {"key=value\nkey2=value2\nfoo=bar", "key", []string{"key", "key2"}, ""}, + {"key=value\nkey2=value2\nfoo=bar", "^key", []string{"key", "key2"}, ""}, + {"key=value\nkey2=value2\nfoo=bar", "^(key|foo)", []string{"foo", "key", "key2"}, ""}, + {"key=value\nkey2=value2\nfoo=bar", "[ abc", nil, "error parsing regexp.*"}, +} + +// ---------------------------------------------------------------------------- + +var filterPrefixTests = []struct { + input string + prefix string + keys []string +}{ + {"", "", []string{}}, + {"", "abc", []string{}}, + {"key=value", "", []string{"key"}}, + {"key=value", "key=", []string{}}, + {"key=value\nfoo=bar", "", []string{"foo", "key"}}, + {"key=value\nfoo=bar", "f", []string{"foo"}}, + {"key=value\nfoo=bar", "fo", []string{"foo"}}, + {"key=value\nfoo=bar", "foo", []string{"foo"}}, + {"key=value\nfoo=bar", "fooo", []string{}}, + {"key=value\nkey2=value2\nfoo=bar", "key", []string{"key", "key2"}}, +} + +// ---------------------------------------------------------------------------- + +var filterStripPrefixTests = []struct { + input string + prefix string + keys []string +}{ + {"", "", []string{}}, + {"", "abc", []string{}}, + {"key=value", "", []string{"key"}}, + {"key=value", "key=", []string{}}, + {"key=value\nfoo=bar", "", []string{"foo", "key"}}, + {"key=value\nfoo=bar", "f", []string{"foo"}}, + {"key=value\nfoo=bar", "fo", []string{"foo"}}, + {"key=value\nfoo=bar", "foo", []string{"foo"}}, + {"key=value\nfoo=bar", "fooo", []string{}}, + {"key=value\nkey2=value2\nfoo=bar", "key", []string{"key", "key2"}}, +} + +// ---------------------------------------------------------------------------- + +var setTests = []struct { + input string + key, value string + prev string + ok bool + err string + keys []string +}{ + {"", "", "", "", false, "", []string{}}, + {"", "key", "value", "", false, "", []string{"key"}}, + {"key=value", "key2", "value2", "", false, "", []string{"key", "key2"}}, + {"key=value", "abc", "value3", "", false, "", []string{"key", "abc"}}, + {"key=value", "key", "value3", "value", true, "", []string{"key"}}, +} + +// ---------------------------------------------------------------------------- + +// TestBasic tests basic single key/value combinations with all possible +// whitespace, delimiter and newline permutations. +func (s *TestSuite) TestBasic(c *C) { + testWhitespaceAndDelimiterCombinations(c, "key", "") + testWhitespaceAndDelimiterCombinations(c, "key", "value") + testWhitespaceAndDelimiterCombinations(c, "key", "value ") +} + +func (s *TestSuite) TestComplex(c *C) { + for _, test := range complexTests { + testKeyValue(c, test[0], test[1:]...) + } +} + +func (s *TestSuite) TestErrors(c *C) { + for _, test := range errorTests { + _, err := Load([]byte(test.input), ISO_8859_1) + c.Assert(err, NotNil) + c.Assert(strings.Contains(err.Error(), test.msg), Equals, true, Commentf("Expected %q got %q", test.msg, err.Error())) + } +} + +func (s *TestSuite) TestDisableExpansion(c *C) { + input := "key=value\nkey2=${key}" + p, err := parse(input) + p.DisableExpansion = true + c.Assert(err, IsNil) + c.Assert(p.MustGet("key"), Equals, "value") + c.Assert(p.MustGet("key2"), Equals, "${key}") + + // with expansion disabled we can introduce circular references + p.Set("keyA", "${keyB}") + p.Set("keyB", "${keyA}") + c.Assert(p.MustGet("keyA"), Equals, "${keyB}") + c.Assert(p.MustGet("keyB"), Equals, "${keyA}") +} + +func (s *TestSuite) TestMustGet(c *C) { + input := "key = value\nkey2 = ghi" + p, err := parse(input) + c.Assert(err, IsNil) + c.Assert(p.MustGet("key"), Equals, "value") + c.Assert(func() { p.MustGet("invalid") }, PanicMatches, "unknown property: invalid") +} + +func (s *TestSuite) TestGetBool(c *C) { + for _, test := range boolTests { + p, err := parse(test.input) + c.Assert(err, IsNil) + c.Assert(p.Len(), Equals, 1) + c.Assert(p.GetBool(test.key, test.def), Equals, test.value) + } +} + +func (s *TestSuite) TestMustGetBool(c *C) { + input := "key = true\nkey2 = ghi" + p, err := parse(input) + c.Assert(err, IsNil) + c.Assert(p.MustGetBool("key"), Equals, true) + c.Assert(func() { p.MustGetBool("invalid") }, PanicMatches, "unknown property: invalid") +} + +func (s *TestSuite) TestGetDuration(c *C) { + for _, test := range durationTests { + p, err := parse(test.input) + c.Assert(err, IsNil) + c.Assert(p.Len(), Equals, 1) + c.Assert(p.GetDuration(test.key, test.def), Equals, test.value) + } +} + +func (s *TestSuite) TestMustGetDuration(c *C) { + input := "key = 123\nkey2 = ghi" + p, err := parse(input) + c.Assert(err, IsNil) + c.Assert(p.MustGetDuration("key"), Equals, time.Duration(123)) + c.Assert(func() { p.MustGetDuration("key2") }, PanicMatches, "strconv.ParseInt: parsing.*") + c.Assert(func() { p.MustGetDuration("invalid") }, PanicMatches, "unknown property: invalid") +} + +func (s *TestSuite) TestGetParsedDuration(c *C) { + for _, test := range parsedDurationTests { + p, err := parse(test.input) + c.Assert(err, IsNil) + c.Assert(p.Len(), Equals, 1) + c.Assert(p.GetParsedDuration(test.key, test.def), Equals, test.value) + } +} + +func (s *TestSuite) TestMustGetParsedDuration(c *C) { + input := "key = 123ms\nkey2 = ghi" + p, err := parse(input) + c.Assert(err, IsNil) + c.Assert(p.MustGetParsedDuration("key"), Equals, 123*time.Millisecond) + c.Assert(func() { p.MustGetParsedDuration("key2") }, PanicMatches, "time: invalid duration ghi") + c.Assert(func() { p.MustGetParsedDuration("invalid") }, PanicMatches, "unknown property: invalid") +} + +func (s *TestSuite) TestGetFloat64(c *C) { + for _, test := range floatTests { + p, err := parse(test.input) + c.Assert(err, IsNil) + c.Assert(p.Len(), Equals, 1) + c.Assert(p.GetFloat64(test.key, test.def), Equals, test.value) + } +} + +func (s *TestSuite) TestMustGetFloat64(c *C) { + input := "key = 123\nkey2 = ghi" + p, err := parse(input) + c.Assert(err, IsNil) + c.Assert(p.MustGetFloat64("key"), Equals, float64(123)) + c.Assert(func() { p.MustGetFloat64("key2") }, PanicMatches, "strconv.ParseFloat: parsing.*") + c.Assert(func() { p.MustGetFloat64("invalid") }, PanicMatches, "unknown property: invalid") +} + +func (s *TestSuite) TestGetInt(c *C) { + for _, test := range int64Tests { + p, err := parse(test.input) + c.Assert(err, IsNil) + c.Assert(p.Len(), Equals, 1) + c.Assert(p.GetInt(test.key, int(test.def)), Equals, int(test.value)) + } +} + +func (s *TestSuite) TestMustGetInt(c *C) { + input := "key = 123\nkey2 = ghi" + p, err := parse(input) + c.Assert(err, IsNil) + c.Assert(p.MustGetInt("key"), Equals, int(123)) + c.Assert(func() { p.MustGetInt("key2") }, PanicMatches, "strconv.ParseInt: parsing.*") + c.Assert(func() { p.MustGetInt("invalid") }, PanicMatches, "unknown property: invalid") +} + +func (s *TestSuite) TestGetInt64(c *C) { + for _, test := range int64Tests { + p, err := parse(test.input) + c.Assert(err, IsNil) + c.Assert(p.Len(), Equals, 1) + c.Assert(p.GetInt64(test.key, test.def), Equals, test.value) + } +} + +func (s *TestSuite) TestMustGetInt64(c *C) { + input := "key = 123\nkey2 = ghi" + p, err := parse(input) + c.Assert(err, IsNil) + c.Assert(p.MustGetInt64("key"), Equals, int64(123)) + c.Assert(func() { p.MustGetInt64("key2") }, PanicMatches, "strconv.ParseInt: parsing.*") + c.Assert(func() { p.MustGetInt64("invalid") }, PanicMatches, "unknown property: invalid") +} + +func (s *TestSuite) TestGetUint(c *C) { + for _, test := range uint64Tests { + p, err := parse(test.input) + c.Assert(err, IsNil) + c.Assert(p.Len(), Equals, 1) + c.Assert(p.GetUint(test.key, uint(test.def)), Equals, uint(test.value)) + } +} + +func (s *TestSuite) TestMustGetUint(c *C) { + input := "key = 123\nkey2 = ghi" + p, err := parse(input) + c.Assert(err, IsNil) + c.Assert(p.MustGetUint("key"), Equals, uint(123)) + c.Assert(func() { p.MustGetUint64("key2") }, PanicMatches, "strconv.ParseUint: parsing.*") + c.Assert(func() { p.MustGetUint64("invalid") }, PanicMatches, "unknown property: invalid") +} + +func (s *TestSuite) TestGetUint64(c *C) { + for _, test := range uint64Tests { + p, err := parse(test.input) + c.Assert(err, IsNil) + c.Assert(p.Len(), Equals, 1) + c.Assert(p.GetUint64(test.key, test.def), Equals, test.value) + } +} + +func (s *TestSuite) TestMustGetUint64(c *C) { + input := "key = 123\nkey2 = ghi" + p, err := parse(input) + c.Assert(err, IsNil) + c.Assert(p.MustGetUint64("key"), Equals, uint64(123)) + c.Assert(func() { p.MustGetUint64("key2") }, PanicMatches, "strconv.ParseUint: parsing.*") + c.Assert(func() { p.MustGetUint64("invalid") }, PanicMatches, "unknown property: invalid") +} + +func (s *TestSuite) TestGetString(c *C) { + for _, test := range stringTests { + p, err := parse(test.input) + c.Assert(err, IsNil) + c.Assert(p.Len(), Equals, 1) + c.Assert(p.GetString(test.key, test.def), Equals, test.value) + } +} + +func (s *TestSuite) TestMustGetString(c *C) { + input := `key = value` + p, err := parse(input) + c.Assert(err, IsNil) + c.Assert(p.MustGetString("key"), Equals, "value") + c.Assert(func() { p.MustGetString("invalid") }, PanicMatches, "unknown property: invalid") +} + +func (s *TestSuite) TestComment(c *C) { + for _, test := range commentTests { + p, err := parse(test.input) + c.Assert(err, IsNil) + c.Assert(p.MustGetString(test.key), Equals, test.value) + c.Assert(p.GetComments(test.key), DeepEquals, test.comments) + if test.comments != nil { + c.Assert(p.GetComment(test.key), Equals, test.comments[len(test.comments)-1]) + } else { + c.Assert(p.GetComment(test.key), Equals, "") + } + + // test setting comments + if len(test.comments) > 0 { + // set single comment + p.ClearComments() + c.Assert(len(p.c), Equals, 0) + p.SetComment(test.key, test.comments[0]) + c.Assert(p.GetComment(test.key), Equals, test.comments[0]) + + // set multiple comments + p.ClearComments() + c.Assert(len(p.c), Equals, 0) + p.SetComments(test.key, test.comments) + c.Assert(p.GetComments(test.key), DeepEquals, test.comments) + + // clear comments for a key + p.SetComments(test.key, nil) + c.Assert(p.GetComment(test.key), Equals, "") + c.Assert(p.GetComments(test.key), IsNil) + } + } +} + +func (s *TestSuite) TestFilter(c *C) { + for _, test := range filterTests { + p, err := parse(test.input) + c.Assert(err, IsNil) + pp, err := p.Filter(test.pattern) + if err != nil { + c.Assert(err, ErrorMatches, test.err) + continue + } + c.Assert(pp, NotNil) + c.Assert(pp.Len(), Equals, len(test.keys)) + for _, key := range test.keys { + v1, ok1 := p.Get(key) + v2, ok2 := pp.Get(key) + c.Assert(ok1, Equals, true) + c.Assert(ok2, Equals, true) + c.Assert(v1, Equals, v2) + } + } +} + +func (s *TestSuite) TestFilterPrefix(c *C) { + for _, test := range filterPrefixTests { + p, err := parse(test.input) + c.Assert(err, IsNil) + pp := p.FilterPrefix(test.prefix) + c.Assert(pp, NotNil) + c.Assert(pp.Len(), Equals, len(test.keys)) + for _, key := range test.keys { + v1, ok1 := p.Get(key) + v2, ok2 := pp.Get(key) + c.Assert(ok1, Equals, true) + c.Assert(ok2, Equals, true) + c.Assert(v1, Equals, v2) + } + } +} + +func (s *TestSuite) TestKeys(c *C) { + for _, test := range keysTests { + p, err := parse(test.input) + c.Assert(err, IsNil) + c.Assert(p.Len(), Equals, len(test.keys)) + c.Assert(len(p.Keys()), Equals, len(test.keys)) + c.Assert(p.Keys(), DeepEquals, test.keys) + } +} + +func (s *TestSuite) TestSet(c *C) { + for _, test := range setTests { + p, err := parse(test.input) + c.Assert(err, IsNil) + prev, ok, err := p.Set(test.key, test.value) + if test.err != "" { + c.Assert(err, ErrorMatches, test.err) + continue + } + + c.Assert(err, IsNil) + c.Assert(ok, Equals, test.ok) + if ok { + c.Assert(prev, Equals, test.prev) + } + c.Assert(p.Keys(), DeepEquals, test.keys) + } +} + +func (s *TestSuite) TestMustSet(c *C) { + input := "key=${key}" + p, err := parse(input) + c.Assert(err, IsNil) + c.Assert(func() { p.MustSet("key", "${key}") }, PanicMatches, "circular reference .*") +} + +func (s *TestSuite) TestWrite(c *C) { + for _, test := range writeTests { + p, err := parse(test.input) + + buf := new(bytes.Buffer) + var n int + switch test.encoding { + case "UTF-8": + n, err = p.Write(buf, UTF8) + case "ISO-8859-1": + n, err = p.Write(buf, ISO_8859_1) + } + c.Assert(err, IsNil) + s := string(buf.Bytes()) + c.Assert(n, Equals, len(test.output), Commentf("input=%q expected=%q obtained=%q", test.input, test.output, s)) + c.Assert(s, Equals, test.output, Commentf("input=%q expected=%q obtained=%q", test.input, test.output, s)) + } +} + +func (s *TestSuite) TestWriteComment(c *C) { + for _, test := range writeCommentTests { + p, err := parse(test.input) + + buf := new(bytes.Buffer) + var n int + switch test.encoding { + case "UTF-8": + n, err = p.WriteComment(buf, "# ", UTF8) + case "ISO-8859-1": + n, err = p.WriteComment(buf, "# ", ISO_8859_1) + } + c.Assert(err, IsNil) + s := string(buf.Bytes()) + c.Assert(n, Equals, len(test.output), Commentf("input=%q expected=%q obtained=%q", test.input, test.output, s)) + c.Assert(s, Equals, test.output, Commentf("input=%q expected=%q obtained=%q", test.input, test.output, s)) + } +} + +func (s *TestSuite) TestCustomExpansionExpression(c *C) { + testKeyValuePrePostfix(c, "*[", "]*", "key=value\nkey2=*[key]*", "key", "value", "key2", "value") +} + +func (s *TestSuite) TestPanicOn32BitIntOverflow(c *C) { + is32Bit = true + var min, max int64 = math.MinInt32 - 1, math.MaxInt32 + 1 + input := fmt.Sprintf("min=%d\nmax=%d", min, max) + p, err := parse(input) + c.Assert(err, IsNil) + c.Assert(p.MustGetInt64("min"), Equals, min) + c.Assert(p.MustGetInt64("max"), Equals, max) + c.Assert(func() { p.MustGetInt("min") }, PanicMatches, ".* out of range") + c.Assert(func() { p.MustGetInt("max") }, PanicMatches, ".* out of range") +} + +func (s *TestSuite) TestPanicOn32BitUintOverflow(c *C) { + is32Bit = true + var max uint64 = math.MaxUint32 + 1 + input := fmt.Sprintf("max=%d", max) + p, err := parse(input) + c.Assert(err, IsNil) + c.Assert(p.MustGetUint64("max"), Equals, max) + c.Assert(func() { p.MustGetUint("max") }, PanicMatches, ".* out of range") +} + +func (s *TestSuite) TestDeleteKey(c *C) { + input := "#comments should also be gone\nkey=to-be-deleted\nsecond=key" + p, err := parse(input) + c.Assert(err, IsNil) + c.Check(len(p.m), Equals, 2) + c.Check(len(p.c), Equals, 1) + c.Check(len(p.k), Equals, 2) + p.Delete("key") + c.Check(len(p.m), Equals, 1) + c.Check(len(p.c), Equals, 0) + c.Check(len(p.k), Equals, 1) +} + +func (s *TestSuite) TestDeleteUnknownKey(c *C) { + input := "#comments should also be gone\nkey=to-be-deleted" + p, err := parse(input) + c.Assert(err, IsNil) + c.Check(len(p.m), Equals, 1) + c.Check(len(p.c), Equals, 1) + c.Check(len(p.k), Equals, 1) + p.Delete("wrong-key") + c.Check(len(p.m), Equals, 1) + c.Check(len(p.c), Equals, 1) + c.Check(len(p.k), Equals, 1) +} + +// ---------------------------------------------------------------------------- + +// tests all combinations of delimiters, leading and/or trailing whitespace and newlines. +func testWhitespaceAndDelimiterCombinations(c *C, key, value string) { + whitespace := []string{"", " ", "\f", "\t"} + delimiters := []string{"", " ", "=", ":"} + newlines := []string{"", "\r", "\n", "\r\n"} + for _, dl := range delimiters { + for _, ws1 := range whitespace { + for _, ws2 := range whitespace { + for _, nl := range newlines { + // skip the one case where there is nothing between a key and a value + if ws1 == "" && dl == "" && ws2 == "" && value != "" { + continue + } + + input := fmt.Sprintf("%s%s%s%s%s%s", key, ws1, dl, ws2, value, nl) + testKeyValue(c, input, key, value) + } + } + } + } +} + +// tests whether key/value pairs exist for a given input. +// keyvalues is expected to be an even number of strings of "key", "value", ... +func testKeyValue(c *C, input string, keyvalues ...string) { + testKeyValuePrePostfix(c, "${", "}", input, keyvalues...) +} + +// tests whether key/value pairs exist for a given input. +// keyvalues is expected to be an even number of strings of "key", "value", ... +func testKeyValuePrePostfix(c *C, prefix, postfix, input string, keyvalues ...string) { + printf("%q\n", input) + + p, err := Load([]byte(input), ISO_8859_1) + c.Assert(err, IsNil) + p.Prefix = prefix + p.Postfix = postfix + assertKeyValues(c, input, p, keyvalues...) +} + +// tests whether key/value pairs exist for a given input. +// keyvalues is expected to be an even number of strings of "key", "value", ... +func assertKeyValues(c *C, input string, p *Properties, keyvalues ...string) { + c.Assert(p, NotNil) + c.Assert(2*p.Len(), Equals, len(keyvalues), Commentf("Odd number of key/value pairs.")) + + for i := 0; i < len(keyvalues); i += 2 { + key, value := keyvalues[i], keyvalues[i+1] + v, ok := p.Get(key) + c.Assert(ok, Equals, true, Commentf("No key %q found (input=%q)", key, input)) + c.Assert(v, Equals, value, Commentf("Value %q does not match %q (input=%q)", v, value, input)) + } +} + +// prints to stderr if the -verbose flag was given. +func printf(format string, args ...interface{}) { + if *verbose { + fmt.Fprintf(os.Stderr, format, args...) + } +} diff --git a/vendor/github.com/magiconair/properties/rangecheck.go b/vendor/github.com/magiconair/properties/rangecheck.go new file mode 100644 index 0000000000..d9ce2806bb --- /dev/null +++ b/vendor/github.com/magiconair/properties/rangecheck.go @@ -0,0 +1,31 @@ +// Copyright 2016 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "math" +) + +// make this a var to overwrite it in a test +var is32Bit = ^uint(0) == math.MaxUint32 + +// intRangeCheck checks if the value fits into the int type and +// panics if it does not. +func intRangeCheck(key string, v int64) int { + if is32Bit && (v < math.MinInt32 || v > math.MaxInt32) { + panic(fmt.Sprintf("Value %d for key %s out of range", v, key)) + } + return int(v) +} + +// uintRangeCheck checks if the value fits into the uint type and +// panics if it does not. +func uintRangeCheck(key string, v uint64) uint { + if is32Bit && v > math.MaxUint32 { + panic(fmt.Sprintf("Value %d for key %s out of range", v, key)) + } + return uint(v) +} diff --git a/vendor/github.com/mitchellh/mapstructure/.travis.yml b/vendor/github.com/mitchellh/mapstructure/.travis.yml new file mode 100644 index 0000000000..7f3fe9a969 --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/.travis.yml @@ -0,0 +1,7 @@ +language: go + +go: + - 1.4 + +script: + - go test diff --git a/vendor/github.com/mitchellh/mapstructure/LICENSE b/vendor/github.com/mitchellh/mapstructure/LICENSE new file mode 100644 index 0000000000..f9c841a51e --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Mitchell Hashimoto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/mitchellh/mapstructure/README.md b/vendor/github.com/mitchellh/mapstructure/README.md new file mode 100644 index 0000000000..659d6885fc --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/README.md @@ -0,0 +1,46 @@ +# mapstructure + +mapstructure is a Go library for decoding generic map values to structures +and vice versa, while providing helpful error handling. + +This library is most useful when decoding values from some data stream (JSON, +Gob, etc.) where you don't _quite_ know the structure of the underlying data +until you read a part of it. You can therefore read a `map[string]interface{}` +and use this library to decode it into the proper underlying native Go +structure. + +## Installation + +Standard `go get`: + +``` +$ go get github.com/mitchellh/mapstructure +``` + +## Usage & Example + +For usage and examples see the [Godoc](http://godoc.org/github.com/mitchellh/mapstructure). + +The `Decode` function has examples associated with it there. + +## But Why?! + +Go offers fantastic standard libraries for decoding formats such as JSON. +The standard method is to have a struct pre-created, and populate that struct +from the bytes of the encoded format. This is great, but the problem is if +you have configuration or an encoding that changes slightly depending on +specific fields. For example, consider this JSON: + +```json +{ + "type": "person", + "name": "Mitchell" +} +``` + +Perhaps we can't populate a specific structure without first reading +the "type" field from the JSON. We could always do two passes over the +decoding of the JSON (reading the "type" first, and the rest later). +However, it is much simpler to just decode this into a `map[string]interface{}` +structure, read the "type" key, then use something like this library +to decode it into the proper structure. diff --git a/vendor/github.com/mitchellh/mapstructure/decode_hooks.go b/vendor/github.com/mitchellh/mapstructure/decode_hooks.go new file mode 100644 index 0000000000..aa91f76ce4 --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/decode_hooks.go @@ -0,0 +1,151 @@ +package mapstructure + +import ( + "errors" + "reflect" + "strconv" + "strings" + "time" +) + +// typedDecodeHook takes a raw DecodeHookFunc (an interface{}) and turns +// it into the proper DecodeHookFunc type, such as DecodeHookFuncType. +func typedDecodeHook(h DecodeHookFunc) DecodeHookFunc { + // Create variables here so we can reference them with the reflect pkg + var f1 DecodeHookFuncType + var f2 DecodeHookFuncKind + + // Fill in the variables into this interface and the rest is done + // automatically using the reflect package. + potential := []interface{}{f1, f2} + + v := reflect.ValueOf(h) + vt := v.Type() + for _, raw := range potential { + pt := reflect.ValueOf(raw).Type() + if vt.ConvertibleTo(pt) { + return v.Convert(pt).Interface() + } + } + + return nil +} + +// DecodeHookExec executes the given decode hook. This should be used +// since it'll naturally degrade to the older backwards compatible DecodeHookFunc +// that took reflect.Kind instead of reflect.Type. +func DecodeHookExec( + raw DecodeHookFunc, + from reflect.Type, to reflect.Type, + data interface{}) (interface{}, error) { + // Build our arguments that reflect expects + argVals := make([]reflect.Value, 3) + argVals[0] = reflect.ValueOf(from) + argVals[1] = reflect.ValueOf(to) + argVals[2] = reflect.ValueOf(data) + + switch f := typedDecodeHook(raw).(type) { + case DecodeHookFuncType: + return f(from, to, data) + case DecodeHookFuncKind: + return f(from.Kind(), to.Kind(), data) + default: + return nil, errors.New("invalid decode hook signature") + } +} + +// ComposeDecodeHookFunc creates a single DecodeHookFunc that +// automatically composes multiple DecodeHookFuncs. +// +// The composed funcs are called in order, with the result of the +// previous transformation. +func ComposeDecodeHookFunc(fs ...DecodeHookFunc) DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + var err error + for _, f1 := range fs { + data, err = DecodeHookExec(f1, f, t, data) + if err != nil { + return nil, err + } + + // Modify the from kind to be correct with the new data + f = reflect.ValueOf(data).Type() + } + + return data, nil + } +} + +// StringToSliceHookFunc returns a DecodeHookFunc that converts +// string to []string by splitting on the given sep. +func StringToSliceHookFunc(sep string) DecodeHookFunc { + return func( + f reflect.Kind, + t reflect.Kind, + data interface{}) (interface{}, error) { + if f != reflect.String || t != reflect.Slice { + return data, nil + } + + raw := data.(string) + if raw == "" { + return []string{}, nil + } + + return strings.Split(raw, sep), nil + } +} + +// StringToTimeDurationHookFunc returns a DecodeHookFunc that converts +// strings to time.Duration. +func StringToTimeDurationHookFunc() DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.String { + return data, nil + } + if t != reflect.TypeOf(time.Duration(5)) { + return data, nil + } + + // Convert it by parsing + return time.ParseDuration(data.(string)) + } +} + +func WeaklyTypedHook( + f reflect.Kind, + t reflect.Kind, + data interface{}) (interface{}, error) { + dataVal := reflect.ValueOf(data) + switch t { + case reflect.String: + switch f { + case reflect.Bool: + if dataVal.Bool() { + return "1", nil + } else { + return "0", nil + } + case reflect.Float32: + return strconv.FormatFloat(dataVal.Float(), 'f', -1, 64), nil + case reflect.Int: + return strconv.FormatInt(dataVal.Int(), 10), nil + case reflect.Slice: + dataType := dataVal.Type() + elemKind := dataType.Elem().Kind() + if elemKind == reflect.Uint8 { + return string(dataVal.Interface().([]uint8)), nil + } + case reflect.Uint: + return strconv.FormatUint(dataVal.Uint(), 10), nil + } + } + + return data, nil +} diff --git a/vendor/github.com/mitchellh/mapstructure/decode_hooks_test.go b/vendor/github.com/mitchellh/mapstructure/decode_hooks_test.go new file mode 100644 index 0000000000..53289afcfb --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/decode_hooks_test.go @@ -0,0 +1,229 @@ +package mapstructure + +import ( + "errors" + "reflect" + "testing" + "time" +) + +func TestComposeDecodeHookFunc(t *testing.T) { + f1 := func( + f reflect.Kind, + t reflect.Kind, + data interface{}) (interface{}, error) { + return data.(string) + "foo", nil + } + + f2 := func( + f reflect.Kind, + t reflect.Kind, + data interface{}) (interface{}, error) { + return data.(string) + "bar", nil + } + + f := ComposeDecodeHookFunc(f1, f2) + + result, err := DecodeHookExec( + f, reflect.TypeOf(""), reflect.TypeOf([]byte("")), "") + if err != nil { + t.Fatalf("bad: %s", err) + } + if result.(string) != "foobar" { + t.Fatalf("bad: %#v", result) + } +} + +func TestComposeDecodeHookFunc_err(t *testing.T) { + f1 := func(reflect.Kind, reflect.Kind, interface{}) (interface{}, error) { + return nil, errors.New("foo") + } + + f2 := func(reflect.Kind, reflect.Kind, interface{}) (interface{}, error) { + panic("NOPE") + } + + f := ComposeDecodeHookFunc(f1, f2) + + _, err := DecodeHookExec( + f, reflect.TypeOf(""), reflect.TypeOf([]byte("")), 42) + if err.Error() != "foo" { + t.Fatalf("bad: %s", err) + } +} + +func TestComposeDecodeHookFunc_kinds(t *testing.T) { + var f2From reflect.Kind + + f1 := func( + f reflect.Kind, + t reflect.Kind, + data interface{}) (interface{}, error) { + return int(42), nil + } + + f2 := func( + f reflect.Kind, + t reflect.Kind, + data interface{}) (interface{}, error) { + f2From = f + return data, nil + } + + f := ComposeDecodeHookFunc(f1, f2) + + _, err := DecodeHookExec( + f, reflect.TypeOf(""), reflect.TypeOf([]byte("")), "") + if err != nil { + t.Fatalf("bad: %s", err) + } + if f2From != reflect.Int { + t.Fatalf("bad: %#v", f2From) + } +} + +func TestStringToSliceHookFunc(t *testing.T) { + f := StringToSliceHookFunc(",") + + strType := reflect.TypeOf("") + sliceType := reflect.TypeOf([]byte("")) + cases := []struct { + f, t reflect.Type + data interface{} + result interface{} + err bool + }{ + {sliceType, sliceType, 42, 42, false}, + {strType, strType, 42, 42, false}, + { + strType, + sliceType, + "foo,bar,baz", + []string{"foo", "bar", "baz"}, + false, + }, + { + strType, + sliceType, + "", + []string{}, + false, + }, + } + + for i, tc := range cases { + actual, err := DecodeHookExec(f, tc.f, tc.t, tc.data) + if tc.err != (err != nil) { + t.Fatalf("case %d: expected err %#v", i, tc.err) + } + if !reflect.DeepEqual(actual, tc.result) { + t.Fatalf( + "case %d: expected %#v, got %#v", + i, tc.result, actual) + } + } +} + +func TestStringToTimeDurationHookFunc(t *testing.T) { + f := StringToTimeDurationHookFunc() + + strType := reflect.TypeOf("") + timeType := reflect.TypeOf(time.Duration(5)) + cases := []struct { + f, t reflect.Type + data interface{} + result interface{} + err bool + }{ + {strType, timeType, "5s", 5 * time.Second, false}, + {strType, timeType, "5", time.Duration(0), true}, + {strType, strType, "5", "5", false}, + } + + for i, tc := range cases { + actual, err := DecodeHookExec(f, tc.f, tc.t, tc.data) + if tc.err != (err != nil) { + t.Fatalf("case %d: expected err %#v", i, tc.err) + } + if !reflect.DeepEqual(actual, tc.result) { + t.Fatalf( + "case %d: expected %#v, got %#v", + i, tc.result, actual) + } + } +} + +func TestWeaklyTypedHook(t *testing.T) { + var f DecodeHookFunc = WeaklyTypedHook + + boolType := reflect.TypeOf(true) + strType := reflect.TypeOf("") + sliceType := reflect.TypeOf([]byte("")) + cases := []struct { + f, t reflect.Type + data interface{} + result interface{} + err bool + }{ + // TO STRING + { + boolType, + strType, + false, + "0", + false, + }, + + { + boolType, + strType, + true, + "1", + false, + }, + + { + reflect.TypeOf(float32(1)), + strType, + float32(7), + "7", + false, + }, + + { + reflect.TypeOf(int(1)), + strType, + int(7), + "7", + false, + }, + + { + sliceType, + strType, + []uint8("foo"), + "foo", + false, + }, + + { + reflect.TypeOf(uint(1)), + strType, + uint(7), + "7", + false, + }, + } + + for i, tc := range cases { + actual, err := DecodeHookExec(f, tc.f, tc.t, tc.data) + if tc.err != (err != nil) { + t.Fatalf("case %d: expected err %#v", i, tc.err) + } + if !reflect.DeepEqual(actual, tc.result) { + t.Fatalf( + "case %d: expected %#v, got %#v", + i, tc.result, actual) + } + } +} diff --git a/vendor/github.com/mitchellh/mapstructure/error.go b/vendor/github.com/mitchellh/mapstructure/error.go new file mode 100644 index 0000000000..47a99e5af3 --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/error.go @@ -0,0 +1,50 @@ +package mapstructure + +import ( + "errors" + "fmt" + "sort" + "strings" +) + +// Error implements the error interface and can represents multiple +// errors that occur in the course of a single decode. +type Error struct { + Errors []string +} + +func (e *Error) Error() string { + points := make([]string, len(e.Errors)) + for i, err := range e.Errors { + points[i] = fmt.Sprintf("* %s", err) + } + + sort.Strings(points) + return fmt.Sprintf( + "%d error(s) decoding:\n\n%s", + len(e.Errors), strings.Join(points, "\n")) +} + +// WrappedErrors implements the errwrap.Wrapper interface to make this +// return value more useful with the errwrap and go-multierror libraries. +func (e *Error) WrappedErrors() []error { + if e == nil { + return nil + } + + result := make([]error, len(e.Errors)) + for i, e := range e.Errors { + result[i] = errors.New(e) + } + + return result +} + +func appendErrors(errors []string, err error) []string { + switch e := err.(type) { + case *Error: + return append(errors, e.Errors...) + default: + return append(errors, e.Error()) + } +} diff --git a/vendor/github.com/mitchellh/mapstructure/mapstructure.go b/vendor/github.com/mitchellh/mapstructure/mapstructure.go new file mode 100644 index 0000000000..a367a95b68 --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/mapstructure.go @@ -0,0 +1,767 @@ +// The mapstructure package exposes functionality to convert an +// abitrary map[string]interface{} into a native Go structure. +// +// The Go structure can be arbitrarily complex, containing slices, +// other structs, etc. and the decoder will properly decode nested +// maps and so on into the proper structures in the native Go struct. +// See the examples to see what the decoder is capable of. +package mapstructure + +import ( + "errors" + "fmt" + "reflect" + "sort" + "strconv" + "strings" +) + +// DecodeHookFunc is the callback function that can be used for +// data transformations. See "DecodeHook" in the DecoderConfig +// struct. +// +// The type should be DecodeHookFuncType or DecodeHookFuncKind. +// Either is accepted. Types are a superset of Kinds (Types can return +// Kinds) and are generally a richer thing to use, but Kinds are simpler +// if you only need those. +// +// The reason DecodeHookFunc is multi-typed is for backwards compatibility: +// we started with Kinds and then realized Types were the better solution, +// but have a promise to not break backwards compat so we now support +// both. +type DecodeHookFunc interface{} + +type DecodeHookFuncType func(reflect.Type, reflect.Type, interface{}) (interface{}, error) +type DecodeHookFuncKind func(reflect.Kind, reflect.Kind, interface{}) (interface{}, error) + +// DecoderConfig is the configuration that is used to create a new decoder +// and allows customization of various aspects of decoding. +type DecoderConfig struct { + // DecodeHook, if set, will be called before any decoding and any + // type conversion (if WeaklyTypedInput is on). This lets you modify + // the values before they're set down onto the resulting struct. + // + // If an error is returned, the entire decode will fail with that + // error. + DecodeHook DecodeHookFunc + + // If ErrorUnused is true, then it is an error for there to exist + // keys in the original map that were unused in the decoding process + // (extra keys). + ErrorUnused bool + + // ZeroFields, if set to true, will zero fields before writing them. + // For example, a map will be emptied before decoded values are put in + // it. If this is false, a map will be merged. + ZeroFields bool + + // If WeaklyTypedInput is true, the decoder will make the following + // "weak" conversions: + // + // - bools to string (true = "1", false = "0") + // - numbers to string (base 10) + // - bools to int/uint (true = 1, false = 0) + // - strings to int/uint (base implied by prefix) + // - int to bool (true if value != 0) + // - string to bool (accepts: 1, t, T, TRUE, true, True, 0, f, F, + // FALSE, false, False. Anything else is an error) + // - empty array = empty map and vice versa + // - negative numbers to overflowed uint values (base 10) + // - slice of maps to a merged map + // + WeaklyTypedInput bool + + // Metadata is the struct that will contain extra metadata about + // the decoding. If this is nil, then no metadata will be tracked. + Metadata *Metadata + + // Result is a pointer to the struct that will contain the decoded + // value. + Result interface{} + + // The tag name that mapstructure reads for field names. This + // defaults to "mapstructure" + TagName string +} + +// A Decoder takes a raw interface value and turns it into structured +// data, keeping track of rich error information along the way in case +// anything goes wrong. Unlike the basic top-level Decode method, you can +// more finely control how the Decoder behaves using the DecoderConfig +// structure. The top-level Decode method is just a convenience that sets +// up the most basic Decoder. +type Decoder struct { + config *DecoderConfig +} + +// Metadata contains information about decoding a structure that +// is tedious or difficult to get otherwise. +type Metadata struct { + // Keys are the keys of the structure which were successfully decoded + Keys []string + + // Unused is a slice of keys that were found in the raw value but + // weren't decoded since there was no matching field in the result interface + Unused []string +} + +// Decode takes a map and uses reflection to convert it into the +// given Go native structure. val must be a pointer to a struct. +func Decode(m interface{}, rawVal interface{}) error { + config := &DecoderConfig{ + Metadata: nil, + Result: rawVal, + } + + decoder, err := NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(m) +} + +// WeakDecode is the same as Decode but is shorthand to enable +// WeaklyTypedInput. See DecoderConfig for more info. +func WeakDecode(input, output interface{}) error { + config := &DecoderConfig{ + Metadata: nil, + Result: output, + WeaklyTypedInput: true, + } + + decoder, err := NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +// NewDecoder returns a new decoder for the given configuration. Once +// a decoder has been returned, the same configuration must not be used +// again. +func NewDecoder(config *DecoderConfig) (*Decoder, error) { + val := reflect.ValueOf(config.Result) + if val.Kind() != reflect.Ptr { + return nil, errors.New("result must be a pointer") + } + + val = val.Elem() + if !val.CanAddr() { + return nil, errors.New("result must be addressable (a pointer)") + } + + if config.Metadata != nil { + if config.Metadata.Keys == nil { + config.Metadata.Keys = make([]string, 0) + } + + if config.Metadata.Unused == nil { + config.Metadata.Unused = make([]string, 0) + } + } + + if config.TagName == "" { + config.TagName = "mapstructure" + } + + result := &Decoder{ + config: config, + } + + return result, nil +} + +// Decode decodes the given raw interface to the target pointer specified +// by the configuration. +func (d *Decoder) Decode(raw interface{}) error { + return d.decode("", raw, reflect.ValueOf(d.config.Result).Elem()) +} + +// Decodes an unknown data type into a specific reflection value. +func (d *Decoder) decode(name string, data interface{}, val reflect.Value) error { + if data == nil { + // If the data is nil, then we don't set anything. + return nil + } + + dataVal := reflect.ValueOf(data) + if !dataVal.IsValid() { + // If the data value is invalid, then we just set the value + // to be the zero value. + val.Set(reflect.Zero(val.Type())) + return nil + } + + if d.config.DecodeHook != nil { + // We have a DecodeHook, so let's pre-process the data. + var err error + data, err = DecodeHookExec( + d.config.DecodeHook, + dataVal.Type(), val.Type(), data) + if err != nil { + return err + } + } + + var err error + dataKind := getKind(val) + switch dataKind { + case reflect.Bool: + err = d.decodeBool(name, data, val) + case reflect.Interface: + err = d.decodeBasic(name, data, val) + case reflect.String: + err = d.decodeString(name, data, val) + case reflect.Int: + err = d.decodeInt(name, data, val) + case reflect.Uint: + err = d.decodeUint(name, data, val) + case reflect.Float32: + err = d.decodeFloat(name, data, val) + case reflect.Struct: + err = d.decodeStruct(name, data, val) + case reflect.Map: + err = d.decodeMap(name, data, val) + case reflect.Ptr: + err = d.decodePtr(name, data, val) + case reflect.Slice: + err = d.decodeSlice(name, data, val) + default: + // If we reached this point then we weren't able to decode it + return fmt.Errorf("%s: unsupported type: %s", name, dataKind) + } + + // If we reached here, then we successfully decoded SOMETHING, so + // mark the key as used if we're tracking metadata. + if d.config.Metadata != nil && name != "" { + d.config.Metadata.Keys = append(d.config.Metadata.Keys, name) + } + + return err +} + +// This decodes a basic type (bool, int, string, etc.) and sets the +// value to "data" of that type. +func (d *Decoder) decodeBasic(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.ValueOf(data) + dataValType := dataVal.Type() + if !dataValType.AssignableTo(val.Type()) { + return fmt.Errorf( + "'%s' expected type '%s', got '%s'", + name, val.Type(), dataValType) + } + + val.Set(dataVal) + return nil +} + +func (d *Decoder) decodeString(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.ValueOf(data) + dataKind := getKind(dataVal) + + converted := true + switch { + case dataKind == reflect.String: + val.SetString(dataVal.String()) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetString("1") + } else { + val.SetString("0") + } + case dataKind == reflect.Int && d.config.WeaklyTypedInput: + val.SetString(strconv.FormatInt(dataVal.Int(), 10)) + case dataKind == reflect.Uint && d.config.WeaklyTypedInput: + val.SetString(strconv.FormatUint(dataVal.Uint(), 10)) + case dataKind == reflect.Float32 && d.config.WeaklyTypedInput: + val.SetString(strconv.FormatFloat(dataVal.Float(), 'f', -1, 64)) + case dataKind == reflect.Slice && d.config.WeaklyTypedInput: + dataType := dataVal.Type() + elemKind := dataType.Elem().Kind() + switch { + case elemKind == reflect.Uint8: + val.SetString(string(dataVal.Interface().([]uint8))) + default: + converted = false + } + default: + converted = false + } + + if !converted { + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.ValueOf(data) + dataKind := getKind(dataVal) + + switch { + case dataKind == reflect.Int: + val.SetInt(dataVal.Int()) + case dataKind == reflect.Uint: + val.SetInt(int64(dataVal.Uint())) + case dataKind == reflect.Float32: + val.SetInt(int64(dataVal.Float())) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetInt(1) + } else { + val.SetInt(0) + } + case dataKind == reflect.String && d.config.WeaklyTypedInput: + i, err := strconv.ParseInt(dataVal.String(), 0, val.Type().Bits()) + if err == nil { + val.SetInt(i) + } else { + return fmt.Errorf("cannot parse '%s' as int: %s", name, err) + } + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.ValueOf(data) + dataKind := getKind(dataVal) + + switch { + case dataKind == reflect.Int: + i := dataVal.Int() + if i < 0 && !d.config.WeaklyTypedInput { + return fmt.Errorf("cannot parse '%s', %d overflows uint", + name, i) + } + val.SetUint(uint64(i)) + case dataKind == reflect.Uint: + val.SetUint(dataVal.Uint()) + case dataKind == reflect.Float32: + f := dataVal.Float() + if f < 0 && !d.config.WeaklyTypedInput { + return fmt.Errorf("cannot parse '%s', %f overflows uint", + name, f) + } + val.SetUint(uint64(f)) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetUint(1) + } else { + val.SetUint(0) + } + case dataKind == reflect.String && d.config.WeaklyTypedInput: + i, err := strconv.ParseUint(dataVal.String(), 0, val.Type().Bits()) + if err == nil { + val.SetUint(i) + } else { + return fmt.Errorf("cannot parse '%s' as uint: %s", name, err) + } + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeBool(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.ValueOf(data) + dataKind := getKind(dataVal) + + switch { + case dataKind == reflect.Bool: + val.SetBool(dataVal.Bool()) + case dataKind == reflect.Int && d.config.WeaklyTypedInput: + val.SetBool(dataVal.Int() != 0) + case dataKind == reflect.Uint && d.config.WeaklyTypedInput: + val.SetBool(dataVal.Uint() != 0) + case dataKind == reflect.Float32 && d.config.WeaklyTypedInput: + val.SetBool(dataVal.Float() != 0) + case dataKind == reflect.String && d.config.WeaklyTypedInput: + b, err := strconv.ParseBool(dataVal.String()) + if err == nil { + val.SetBool(b) + } else if dataVal.String() == "" { + val.SetBool(false) + } else { + return fmt.Errorf("cannot parse '%s' as bool: %s", name, err) + } + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeFloat(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.ValueOf(data) + dataKind := getKind(dataVal) + + switch { + case dataKind == reflect.Int: + val.SetFloat(float64(dataVal.Int())) + case dataKind == reflect.Uint: + val.SetFloat(float64(dataVal.Uint())) + case dataKind == reflect.Float32: + val.SetFloat(float64(dataVal.Float())) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetFloat(1) + } else { + val.SetFloat(0) + } + case dataKind == reflect.String && d.config.WeaklyTypedInput: + f, err := strconv.ParseFloat(dataVal.String(), val.Type().Bits()) + if err == nil { + val.SetFloat(f) + } else { + return fmt.Errorf("cannot parse '%s' as float: %s", name, err) + } + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeMap(name string, data interface{}, val reflect.Value) error { + valType := val.Type() + valKeyType := valType.Key() + valElemType := valType.Elem() + + // By default we overwrite keys in the current map + valMap := val + + // If the map is nil or we're purposely zeroing fields, make a new map + if valMap.IsNil() || d.config.ZeroFields { + // Make a new map to hold our result + mapType := reflect.MapOf(valKeyType, valElemType) + valMap = reflect.MakeMap(mapType) + } + + // Check input type + dataVal := reflect.Indirect(reflect.ValueOf(data)) + if dataVal.Kind() != reflect.Map { + // In weak mode, we accept a slice of maps as an input... + if d.config.WeaklyTypedInput { + switch dataVal.Kind() { + case reflect.Array, reflect.Slice: + // Special case for BC reasons (covered by tests) + if dataVal.Len() == 0 { + val.Set(valMap) + return nil + } + + for i := 0; i < dataVal.Len(); i++ { + err := d.decode( + fmt.Sprintf("%s[%d]", name, i), + dataVal.Index(i).Interface(), val) + if err != nil { + return err + } + } + + return nil + } + } + + return fmt.Errorf("'%s' expected a map, got '%s'", name, dataVal.Kind()) + } + + // Accumulate errors + errors := make([]string, 0) + + for _, k := range dataVal.MapKeys() { + fieldName := fmt.Sprintf("%s[%s]", name, k) + + // First decode the key into the proper type + currentKey := reflect.Indirect(reflect.New(valKeyType)) + if err := d.decode(fieldName, k.Interface(), currentKey); err != nil { + errors = appendErrors(errors, err) + continue + } + + // Next decode the data into the proper type + v := dataVal.MapIndex(k).Interface() + currentVal := reflect.Indirect(reflect.New(valElemType)) + if err := d.decode(fieldName, v, currentVal); err != nil { + errors = appendErrors(errors, err) + continue + } + + valMap.SetMapIndex(currentKey, currentVal) + } + + // Set the built up map to the value + val.Set(valMap) + + // If we had errors, return those + if len(errors) > 0 { + return &Error{errors} + } + + return nil +} + +func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) error { + // Create an element of the concrete (non pointer) type and decode + // into that. Then set the value of the pointer to this type. + valType := val.Type() + valElemType := valType.Elem() + realVal := reflect.New(valElemType) + if err := d.decode(name, data, reflect.Indirect(realVal)); err != nil { + return err + } + + val.Set(realVal) + return nil +} + +func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataValKind := dataVal.Kind() + valType := val.Type() + valElemType := valType.Elem() + sliceType := reflect.SliceOf(valElemType) + + // Check input type + if dataValKind != reflect.Array && dataValKind != reflect.Slice { + // Accept empty map instead of array/slice in weakly typed mode + if d.config.WeaklyTypedInput && dataVal.Kind() == reflect.Map && dataVal.Len() == 0 { + val.Set(reflect.MakeSlice(sliceType, 0, 0)) + return nil + } else { + return fmt.Errorf( + "'%s': source data must be an array or slice, got %s", name, dataValKind) + } + } + + // Make a new slice to hold our result, same size as the original data. + valSlice := reflect.MakeSlice(sliceType, dataVal.Len(), dataVal.Len()) + + // Accumulate any errors + errors := make([]string, 0) + + for i := 0; i < dataVal.Len(); i++ { + currentData := dataVal.Index(i).Interface() + currentField := valSlice.Index(i) + + fieldName := fmt.Sprintf("%s[%d]", name, i) + if err := d.decode(fieldName, currentData, currentField); err != nil { + errors = appendErrors(errors, err) + } + } + + // Finally, set the value to the slice we built up + val.Set(valSlice) + + // If there were errors, we return those + if len(errors) > 0 { + return &Error{errors} + } + + return nil +} + +func (d *Decoder) decodeStruct(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + + // If the type of the value to write to and the data match directly, + // then we just set it directly instead of recursing into the structure. + if dataVal.Type() == val.Type() { + val.Set(dataVal) + return nil + } + + dataValKind := dataVal.Kind() + if dataValKind != reflect.Map { + return fmt.Errorf("'%s' expected a map, got '%s'", name, dataValKind) + } + + dataValType := dataVal.Type() + if kind := dataValType.Key().Kind(); kind != reflect.String && kind != reflect.Interface { + return fmt.Errorf( + "'%s' needs a map with string keys, has '%s' keys", + name, dataValType.Key().Kind()) + } + + dataValKeys := make(map[reflect.Value]struct{}) + dataValKeysUnused := make(map[interface{}]struct{}) + for _, dataValKey := range dataVal.MapKeys() { + dataValKeys[dataValKey] = struct{}{} + dataValKeysUnused[dataValKey.Interface()] = struct{}{} + } + + errors := make([]string, 0) + + // This slice will keep track of all the structs we'll be decoding. + // There can be more than one struct if there are embedded structs + // that are squashed. + structs := make([]reflect.Value, 1, 5) + structs[0] = val + + // Compile the list of all the fields that we're going to be decoding + // from all the structs. + fields := make(map[*reflect.StructField]reflect.Value) + for len(structs) > 0 { + structVal := structs[0] + structs = structs[1:] + + structType := structVal.Type() + + for i := 0; i < structType.NumField(); i++ { + fieldType := structType.Field(i) + fieldKind := fieldType.Type.Kind() + + if fieldType.Anonymous { + if fieldKind != reflect.Struct { + errors = appendErrors(errors, + fmt.Errorf("%s: unsupported type: %s", fieldType.Name, fieldKind)) + continue + } + } + + // If "squash" is specified in the tag, we squash the field down. + squash := false + tagParts := strings.Split(fieldType.Tag.Get(d.config.TagName), ",") + for _, tag := range tagParts[1:] { + if tag == "squash" { + squash = true + break + } + } + + if squash { + if fieldKind != reflect.Struct { + errors = appendErrors(errors, + fmt.Errorf("%s: unsupported type for squash: %s", fieldType.Name, fieldKind)) + } else { + structs = append(structs, val.FieldByName(fieldType.Name)) + } + continue + } + + // Normal struct field, store it away + fields[&fieldType] = structVal.Field(i) + } + } + + for fieldType, field := range fields { + fieldName := fieldType.Name + + tagValue := fieldType.Tag.Get(d.config.TagName) + tagValue = strings.SplitN(tagValue, ",", 2)[0] + if tagValue != "" { + fieldName = tagValue + } + + rawMapKey := reflect.ValueOf(fieldName) + rawMapVal := dataVal.MapIndex(rawMapKey) + if !rawMapVal.IsValid() { + // Do a slower search by iterating over each key and + // doing case-insensitive search. + for dataValKey, _ := range dataValKeys { + mK, ok := dataValKey.Interface().(string) + if !ok { + // Not a string key + continue + } + + if strings.EqualFold(mK, fieldName) { + rawMapKey = dataValKey + rawMapVal = dataVal.MapIndex(dataValKey) + break + } + } + + if !rawMapVal.IsValid() { + // There was no matching key in the map for the value in + // the struct. Just ignore. + continue + } + } + + // Delete the key we're using from the unused map so we stop tracking + delete(dataValKeysUnused, rawMapKey.Interface()) + + if !field.IsValid() { + // This should never happen + panic("field is not valid") + } + + // If we can't set the field, then it is unexported or something, + // and we just continue onwards. + if !field.CanSet() { + continue + } + + // If the name is empty string, then we're at the root, and we + // don't dot-join the fields. + if name != "" { + fieldName = fmt.Sprintf("%s.%s", name, fieldName) + } + + if err := d.decode(fieldName, rawMapVal.Interface(), field); err != nil { + errors = appendErrors(errors, err) + } + } + + if d.config.ErrorUnused && len(dataValKeysUnused) > 0 { + keys := make([]string, 0, len(dataValKeysUnused)) + for rawKey, _ := range dataValKeysUnused { + keys = append(keys, rawKey.(string)) + } + sort.Strings(keys) + + err := fmt.Errorf("'%s' has invalid keys: %s", name, strings.Join(keys, ", ")) + errors = appendErrors(errors, err) + } + + if len(errors) > 0 { + return &Error{errors} + } + + // Add the unused keys to the list of unused keys if we're tracking metadata + if d.config.Metadata != nil { + for rawKey, _ := range dataValKeysUnused { + key := rawKey.(string) + if name != "" { + key = fmt.Sprintf("%s.%s", name, key) + } + + d.config.Metadata.Unused = append(d.config.Metadata.Unused, key) + } + } + + return nil +} + +func getKind(val reflect.Value) reflect.Kind { + kind := val.Kind() + + switch { + case kind >= reflect.Int && kind <= reflect.Int64: + return reflect.Int + case kind >= reflect.Uint && kind <= reflect.Uint64: + return reflect.Uint + case kind >= reflect.Float32 && kind <= reflect.Float64: + return reflect.Float32 + default: + return kind + } +} diff --git a/vendor/github.com/mitchellh/mapstructure/mapstructure_benchmark_test.go b/vendor/github.com/mitchellh/mapstructure/mapstructure_benchmark_test.go new file mode 100644 index 0000000000..41d2a41f75 --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/mapstructure_benchmark_test.go @@ -0,0 +1,279 @@ +package mapstructure + +import ( + "encoding/json" + "testing" +) + +func Benchmark_Decode(b *testing.B) { + type Person struct { + Name string + Age int + Emails []string + Extra map[string]string + } + + input := map[string]interface{}{ + "name": "Mitchell", + "age": 91, + "emails": []string{"one", "two", "three"}, + "extra": map[string]string{ + "twitter": "mitchellh", + }, + } + + var result Person + for i := 0; i < b.N; i++ { + Decode(input, &result) + } +} + +// decodeViaJSON takes the map data and passes it through encoding/json to convert it into the +// given Go native structure pointed to by v. v must be a pointer to a struct. +func decodeViaJSON(data interface{}, v interface{}) error { + // Perform the task by simply marshalling the input into JSON, + // then unmarshalling it into target native Go struct. + b, err := json.Marshal(data) + if err != nil { + return err + } + return json.Unmarshal(b, v) +} + +func Benchmark_DecodeViaJSON(b *testing.B) { + type Person struct { + Name string + Age int + Emails []string + Extra map[string]string + } + + input := map[string]interface{}{ + "name": "Mitchell", + "age": 91, + "emails": []string{"one", "two", "three"}, + "extra": map[string]string{ + "twitter": "mitchellh", + }, + } + + var result Person + for i := 0; i < b.N; i++ { + decodeViaJSON(input, &result) + } +} + +func Benchmark_DecodeBasic(b *testing.B) { + input := map[string]interface{}{ + "vstring": "foo", + "vint": 42, + "Vuint": 42, + "vbool": true, + "Vfloat": 42.42, + "vsilent": true, + "vdata": 42, + } + + var result Basic + for i := 0; i < b.N; i++ { + Decode(input, &result) + } +} + +func Benchmark_DecodeEmbedded(b *testing.B) { + input := map[string]interface{}{ + "vstring": "foo", + "Basic": map[string]interface{}{ + "vstring": "innerfoo", + }, + "vunique": "bar", + } + + var result Embedded + for i := 0; i < b.N; i++ { + Decode(input, &result) + } +} + +func Benchmark_DecodeTypeConversion(b *testing.B) { + input := map[string]interface{}{ + "IntToFloat": 42, + "IntToUint": 42, + "IntToBool": 1, + "IntToString": 42, + "UintToInt": 42, + "UintToFloat": 42, + "UintToBool": 42, + "UintToString": 42, + "BoolToInt": true, + "BoolToUint": true, + "BoolToFloat": true, + "BoolToString": true, + "FloatToInt": 42.42, + "FloatToUint": 42.42, + "FloatToBool": 42.42, + "FloatToString": 42.42, + "StringToInt": "42", + "StringToUint": "42", + "StringToBool": "1", + "StringToFloat": "42.42", + "SliceToMap": []interface{}{}, + "MapToSlice": map[string]interface{}{}, + } + + var resultStrict TypeConversionResult + for i := 0; i < b.N; i++ { + Decode(input, &resultStrict) + } +} + +func Benchmark_DecodeMap(b *testing.B) { + input := map[string]interface{}{ + "vfoo": "foo", + "vother": map[interface{}]interface{}{ + "foo": "foo", + "bar": "bar", + }, + } + + var result Map + for i := 0; i < b.N; i++ { + Decode(input, &result) + } +} + +func Benchmark_DecodeMapOfStruct(b *testing.B) { + input := map[string]interface{}{ + "value": map[string]interface{}{ + "foo": map[string]string{"vstring": "one"}, + "bar": map[string]string{"vstring": "two"}, + }, + } + + var result MapOfStruct + for i := 0; i < b.N; i++ { + Decode(input, &result) + } +} + +func Benchmark_DecodeSlice(b *testing.B) { + input := map[string]interface{}{ + "vfoo": "foo", + "vbar": []string{"foo", "bar", "baz"}, + } + + var result Slice + for i := 0; i < b.N; i++ { + Decode(input, &result) + } +} + +func Benchmark_DecodeSliceOfStruct(b *testing.B) { + input := map[string]interface{}{ + "value": []map[string]interface{}{ + {"vstring": "one"}, + {"vstring": "two"}, + }, + } + + var result SliceOfStruct + for i := 0; i < b.N; i++ { + Decode(input, &result) + } +} + +func Benchmark_DecodeWeaklyTypedInput(b *testing.B) { + type Person struct { + Name string + Age int + Emails []string + } + + // This input can come from anywhere, but typically comes from + // something like decoding JSON, generated by a weakly typed language + // such as PHP. + input := map[string]interface{}{ + "name": 123, // number => string + "age": "42", // string => number + "emails": map[string]interface{}{}, // empty map => empty array + } + + var result Person + config := &DecoderConfig{ + WeaklyTypedInput: true, + Result: &result, + } + + decoder, err := NewDecoder(config) + if err != nil { + panic(err) + } + + for i := 0; i < b.N; i++ { + decoder.Decode(input) + } +} + +func Benchmark_DecodeMetadata(b *testing.B) { + type Person struct { + Name string + Age int + } + + input := map[string]interface{}{ + "name": "Mitchell", + "age": 91, + "email": "foo@bar.com", + } + + var md Metadata + var result Person + config := &DecoderConfig{ + Metadata: &md, + Result: &result, + } + + decoder, err := NewDecoder(config) + if err != nil { + panic(err) + } + + for i := 0; i < b.N; i++ { + decoder.Decode(input) + } +} + +func Benchmark_DecodeMetadataEmbedded(b *testing.B) { + input := map[string]interface{}{ + "vstring": "foo", + "vunique": "bar", + } + + var md Metadata + var result EmbeddedSquash + config := &DecoderConfig{ + Metadata: &md, + Result: &result, + } + + decoder, err := NewDecoder(config) + if err != nil { + b.Fatalf("err: %s", err) + } + + for i := 0; i < b.N; i++ { + decoder.Decode(input) + } +} + +func Benchmark_DecodeTagged(b *testing.B) { + input := map[string]interface{}{ + "foo": "bar", + "bar": "value", + } + + var result Tagged + for i := 0; i < b.N; i++ { + Decode(input, &result) + } +} diff --git a/vendor/github.com/mitchellh/mapstructure/mapstructure_bugs_test.go b/vendor/github.com/mitchellh/mapstructure/mapstructure_bugs_test.go new file mode 100644 index 0000000000..7054f1ac9a --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/mapstructure_bugs_test.go @@ -0,0 +1,47 @@ +package mapstructure + +import "testing" + +// GH-1 +func TestDecode_NilValue(t *testing.T) { + input := map[string]interface{}{ + "vfoo": nil, + "vother": nil, + } + + var result Map + err := Decode(input, &result) + if err != nil { + t.Fatalf("should not error: %s", err) + } + + if result.Vfoo != "" { + t.Fatalf("value should be default: %s", result.Vfoo) + } + + if result.Vother != nil { + t.Fatalf("Vother should be nil: %s", result.Vother) + } +} + +// GH-10 +func TestDecode_mapInterfaceInterface(t *testing.T) { + input := map[interface{}]interface{}{ + "vfoo": nil, + "vother": nil, + } + + var result Map + err := Decode(input, &result) + if err != nil { + t.Fatalf("should not error: %s", err) + } + + if result.Vfoo != "" { + t.Fatalf("value should be default: %s", result.Vfoo) + } + + if result.Vother != nil { + t.Fatalf("Vother should be nil: %s", result.Vother) + } +} diff --git a/vendor/github.com/mitchellh/mapstructure/mapstructure_examples_test.go b/vendor/github.com/mitchellh/mapstructure/mapstructure_examples_test.go new file mode 100644 index 0000000000..f17c214a8a --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/mapstructure_examples_test.go @@ -0,0 +1,203 @@ +package mapstructure + +import ( + "fmt" +) + +func ExampleDecode() { + type Person struct { + Name string + Age int + Emails []string + Extra map[string]string + } + + // This input can come from anywhere, but typically comes from + // something like decoding JSON where we're not quite sure of the + // struct initially. + input := map[string]interface{}{ + "name": "Mitchell", + "age": 91, + "emails": []string{"one", "two", "three"}, + "extra": map[string]string{ + "twitter": "mitchellh", + }, + } + + var result Person + err := Decode(input, &result) + if err != nil { + panic(err) + } + + fmt.Printf("%#v", result) + // Output: + // mapstructure.Person{Name:"Mitchell", Age:91, Emails:[]string{"one", "two", "three"}, Extra:map[string]string{"twitter":"mitchellh"}} +} + +func ExampleDecode_errors() { + type Person struct { + Name string + Age int + Emails []string + Extra map[string]string + } + + // This input can come from anywhere, but typically comes from + // something like decoding JSON where we're not quite sure of the + // struct initially. + input := map[string]interface{}{ + "name": 123, + "age": "bad value", + "emails": []int{1, 2, 3}, + } + + var result Person + err := Decode(input, &result) + if err == nil { + panic("should have an error") + } + + fmt.Println(err.Error()) + // Output: + // 5 error(s) decoding: + // + // * 'Age' expected type 'int', got unconvertible type 'string' + // * 'Emails[0]' expected type 'string', got unconvertible type 'int' + // * 'Emails[1]' expected type 'string', got unconvertible type 'int' + // * 'Emails[2]' expected type 'string', got unconvertible type 'int' + // * 'Name' expected type 'string', got unconvertible type 'int' +} + +func ExampleDecode_metadata() { + type Person struct { + Name string + Age int + } + + // This input can come from anywhere, but typically comes from + // something like decoding JSON where we're not quite sure of the + // struct initially. + input := map[string]interface{}{ + "name": "Mitchell", + "age": 91, + "email": "foo@bar.com", + } + + // For metadata, we make a more advanced DecoderConfig so we can + // more finely configure the decoder that is used. In this case, we + // just tell the decoder we want to track metadata. + var md Metadata + var result Person + config := &DecoderConfig{ + Metadata: &md, + Result: &result, + } + + decoder, err := NewDecoder(config) + if err != nil { + panic(err) + } + + if err := decoder.Decode(input); err != nil { + panic(err) + } + + fmt.Printf("Unused keys: %#v", md.Unused) + // Output: + // Unused keys: []string{"email"} +} + +func ExampleDecode_weaklyTypedInput() { + type Person struct { + Name string + Age int + Emails []string + } + + // This input can come from anywhere, but typically comes from + // something like decoding JSON, generated by a weakly typed language + // such as PHP. + input := map[string]interface{}{ + "name": 123, // number => string + "age": "42", // string => number + "emails": map[string]interface{}{}, // empty map => empty array + } + + var result Person + config := &DecoderConfig{ + WeaklyTypedInput: true, + Result: &result, + } + + decoder, err := NewDecoder(config) + if err != nil { + panic(err) + } + + err = decoder.Decode(input) + if err != nil { + panic(err) + } + + fmt.Printf("%#v", result) + // Output: mapstructure.Person{Name:"123", Age:42, Emails:[]string{}} +} + +func ExampleDecode_tags() { + // Note that the mapstructure tags defined in the struct type + // can indicate which fields the values are mapped to. + type Person struct { + Name string `mapstructure:"person_name"` + Age int `mapstructure:"person_age"` + } + + input := map[string]interface{}{ + "person_name": "Mitchell", + "person_age": 91, + } + + var result Person + err := Decode(input, &result) + if err != nil { + panic(err) + } + + fmt.Printf("%#v", result) + // Output: + // mapstructure.Person{Name:"Mitchell", Age:91} +} + +func ExampleDecode_embeddedStruct() { + // Squashing multiple embedded structs is allowed using the squash tag. + // This is demonstrated by creating a composite struct of multiple types + // and decoding into it. In this case, a person can carry with it both + // a Family and a Location, as well as their own FirstName. + type Family struct { + LastName string + } + type Location struct { + City string + } + type Person struct { + Family `mapstructure:",squash"` + Location `mapstructure:",squash"` + FirstName string + } + + input := map[string]interface{}{ + "FirstName": "Mitchell", + "LastName": "Hashimoto", + "City": "San Francisco", + } + + var result Person + err := Decode(input, &result) + if err != nil { + panic(err) + } + + fmt.Printf("%s %s, %s", result.FirstName, result.LastName, result.City) + // Output: + // Mitchell Hashimoto, San Francisco +} diff --git a/vendor/github.com/mitchellh/mapstructure/mapstructure_test.go b/vendor/github.com/mitchellh/mapstructure/mapstructure_test.go new file mode 100644 index 0000000000..45e72849f5 --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/mapstructure_test.go @@ -0,0 +1,1047 @@ +package mapstructure + +import ( + "reflect" + "sort" + "strings" + "testing" +) + +type Basic struct { + Vstring string + Vint int + Vuint uint + Vbool bool + Vfloat float64 + Vextra string + vsilent bool + Vdata interface{} +} + +type BasicSquash struct { + Test Basic `mapstructure:",squash"` +} + +type Embedded struct { + Basic + Vunique string +} + +type EmbeddedPointer struct { + *Basic + Vunique string +} + +type EmbeddedSquash struct { + Basic `mapstructure:",squash"` + Vunique string +} + +type SquashOnNonStructType struct { + InvalidSquashType int `mapstructure:",squash"` +} + +type Map struct { + Vfoo string + Vother map[string]string +} + +type MapOfStruct struct { + Value map[string]Basic +} + +type Nested struct { + Vfoo string + Vbar Basic +} + +type NestedPointer struct { + Vfoo string + Vbar *Basic +} + +type Slice struct { + Vfoo string + Vbar []string +} + +type SliceOfStruct struct { + Value []Basic +} + +type Tagged struct { + Extra string `mapstructure:"bar,what,what"` + Value string `mapstructure:"foo"` +} + +type TypeConversionResult struct { + IntToFloat float32 + IntToUint uint + IntToBool bool + IntToString string + UintToInt int + UintToFloat float32 + UintToBool bool + UintToString string + BoolToInt int + BoolToUint uint + BoolToFloat float32 + BoolToString string + FloatToInt int + FloatToUint uint + FloatToBool bool + FloatToString string + SliceUint8ToString string + StringToInt int + StringToUint uint + StringToBool bool + StringToFloat float32 + SliceToMap map[string]interface{} + MapToSlice []interface{} +} + +func TestBasicTypes(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vstring": "foo", + "vint": 42, + "Vuint": 42, + "vbool": true, + "Vfloat": 42.42, + "vsilent": true, + "vdata": 42, + } + + var result Basic + err := Decode(input, &result) + if err != nil { + t.Errorf("got an err: %s", err.Error()) + t.FailNow() + } + + if result.Vstring != "foo" { + t.Errorf("vstring value should be 'foo': %#v", result.Vstring) + } + + if result.Vint != 42 { + t.Errorf("vint value should be 42: %#v", result.Vint) + } + + if result.Vuint != 42 { + t.Errorf("vuint value should be 42: %#v", result.Vuint) + } + + if result.Vbool != true { + t.Errorf("vbool value should be true: %#v", result.Vbool) + } + + if result.Vfloat != 42.42 { + t.Errorf("vfloat value should be 42.42: %#v", result.Vfloat) + } + + if result.Vextra != "" { + t.Errorf("vextra value should be empty: %#v", result.Vextra) + } + + if result.vsilent != false { + t.Error("vsilent should not be set, it is unexported") + } + + if result.Vdata != 42 { + t.Error("vdata should be valid") + } +} + +func TestBasic_IntWithFloat(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vint": float64(42), + } + + var result Basic + err := Decode(input, &result) + if err != nil { + t.Fatalf("got an err: %s", err) + } +} + +func TestBasic_Merge(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vint": 42, + } + + var result Basic + result.Vuint = 100 + err := Decode(input, &result) + if err != nil { + t.Fatalf("got an err: %s", err) + } + + expected := Basic{ + Vint: 42, + Vuint: 100, + } + if !reflect.DeepEqual(result, expected) { + t.Fatalf("bad: %#v", result) + } +} + +func TestDecode_BasicSquash(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vstring": "foo", + } + + var result BasicSquash + err := Decode(input, &result) + if err != nil { + t.Fatalf("got an err: %s", err.Error()) + } + + if result.Test.Vstring != "foo" { + t.Errorf("vstring value should be 'foo': %#v", result.Test.Vstring) + } +} + +func TestDecode_Embedded(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vstring": "foo", + "Basic": map[string]interface{}{ + "vstring": "innerfoo", + }, + "vunique": "bar", + } + + var result Embedded + err := Decode(input, &result) + if err != nil { + t.Fatalf("got an err: %s", err.Error()) + } + + if result.Vstring != "innerfoo" { + t.Errorf("vstring value should be 'innerfoo': %#v", result.Vstring) + } + + if result.Vunique != "bar" { + t.Errorf("vunique value should be 'bar': %#v", result.Vunique) + } +} + +func TestDecode_EmbeddedPointer(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vstring": "foo", + "Basic": map[string]interface{}{ + "vstring": "innerfoo", + }, + "vunique": "bar", + } + + var result EmbeddedPointer + err := Decode(input, &result) + if err == nil { + t.Fatal("should get error") + } +} + +func TestDecode_EmbeddedSquash(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vstring": "foo", + "vunique": "bar", + } + + var result EmbeddedSquash + err := Decode(input, &result) + if err != nil { + t.Fatalf("got an err: %s", err.Error()) + } + + if result.Vstring != "foo" { + t.Errorf("vstring value should be 'foo': %#v", result.Vstring) + } + + if result.Vunique != "bar" { + t.Errorf("vunique value should be 'bar': %#v", result.Vunique) + } +} + +func TestDecode_SquashOnNonStructType(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "InvalidSquashType": 42, + } + + var result SquashOnNonStructType + err := Decode(input, &result) + if err == nil { + t.Fatal("unexpected success decoding invalid squash field type") + } else if !strings.Contains(err.Error(), "unsupported type for squash") { + t.Fatalf("unexpected error message for invalid squash field type: %s", err) + } +} + +func TestDecode_DecodeHook(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vint": "WHAT", + } + + decodeHook := func(from reflect.Kind, to reflect.Kind, v interface{}) (interface{}, error) { + if from == reflect.String && to != reflect.String { + return 5, nil + } + + return v, nil + } + + var result Basic + config := &DecoderConfig{ + DecodeHook: decodeHook, + Result: &result, + } + + decoder, err := NewDecoder(config) + if err != nil { + t.Fatalf("err: %s", err) + } + + err = decoder.Decode(input) + if err != nil { + t.Fatalf("got an err: %s", err) + } + + if result.Vint != 5 { + t.Errorf("vint should be 5: %#v", result.Vint) + } +} + +func TestDecode_DecodeHookType(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vint": "WHAT", + } + + decodeHook := func(from reflect.Type, to reflect.Type, v interface{}) (interface{}, error) { + if from.Kind() == reflect.String && + to.Kind() != reflect.String { + return 5, nil + } + + return v, nil + } + + var result Basic + config := &DecoderConfig{ + DecodeHook: decodeHook, + Result: &result, + } + + decoder, err := NewDecoder(config) + if err != nil { + t.Fatalf("err: %s", err) + } + + err = decoder.Decode(input) + if err != nil { + t.Fatalf("got an err: %s", err) + } + + if result.Vint != 5 { + t.Errorf("vint should be 5: %#v", result.Vint) + } +} + +func TestDecode_Nil(t *testing.T) { + t.Parallel() + + var input interface{} = nil + result := Basic{ + Vstring: "foo", + } + + err := Decode(input, &result) + if err != nil { + t.Fatalf("err: %s", err) + } + + if result.Vstring != "foo" { + t.Fatalf("bad: %#v", result.Vstring) + } +} + +func TestDecode_NonStruct(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "foo": "bar", + "bar": "baz", + } + + var result map[string]string + err := Decode(input, &result) + if err != nil { + t.Fatalf("err: %s", err) + } + + if result["foo"] != "bar" { + t.Fatal("foo is not bar") + } +} + +func TestDecode_StructMatch(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vbar": Basic{ + Vstring: "foo", + }, + } + + var result Nested + err := Decode(input, &result) + if err != nil { + t.Fatalf("got an err: %s", err.Error()) + } + + if result.Vbar.Vstring != "foo" { + t.Errorf("bad: %#v", result) + } +} + +func TestDecode_TypeConversion(t *testing.T) { + input := map[string]interface{}{ + "IntToFloat": 42, + "IntToUint": 42, + "IntToBool": 1, + "IntToString": 42, + "UintToInt": 42, + "UintToFloat": 42, + "UintToBool": 42, + "UintToString": 42, + "BoolToInt": true, + "BoolToUint": true, + "BoolToFloat": true, + "BoolToString": true, + "FloatToInt": 42.42, + "FloatToUint": 42.42, + "FloatToBool": 42.42, + "FloatToString": 42.42, + "SliceUint8ToString": []uint8("foo"), + "StringToInt": "42", + "StringToUint": "42", + "StringToBool": "1", + "StringToFloat": "42.42", + "SliceToMap": []interface{}{}, + "MapToSlice": map[string]interface{}{}, + } + + expectedResultStrict := TypeConversionResult{ + IntToFloat: 42.0, + IntToUint: 42, + UintToInt: 42, + UintToFloat: 42, + BoolToInt: 0, + BoolToUint: 0, + BoolToFloat: 0, + FloatToInt: 42, + FloatToUint: 42, + } + + expectedResultWeak := TypeConversionResult{ + IntToFloat: 42.0, + IntToUint: 42, + IntToBool: true, + IntToString: "42", + UintToInt: 42, + UintToFloat: 42, + UintToBool: true, + UintToString: "42", + BoolToInt: 1, + BoolToUint: 1, + BoolToFloat: 1, + BoolToString: "1", + FloatToInt: 42, + FloatToUint: 42, + FloatToBool: true, + FloatToString: "42.42", + SliceUint8ToString: "foo", + StringToInt: 42, + StringToUint: 42, + StringToBool: true, + StringToFloat: 42.42, + SliceToMap: map[string]interface{}{}, + MapToSlice: []interface{}{}, + } + + // Test strict type conversion + var resultStrict TypeConversionResult + err := Decode(input, &resultStrict) + if err == nil { + t.Errorf("should return an error") + } + if !reflect.DeepEqual(resultStrict, expectedResultStrict) { + t.Errorf("expected %v, got: %v", expectedResultStrict, resultStrict) + } + + // Test weak type conversion + var decoder *Decoder + var resultWeak TypeConversionResult + + config := &DecoderConfig{ + WeaklyTypedInput: true, + Result: &resultWeak, + } + + decoder, err = NewDecoder(config) + if err != nil { + t.Fatalf("err: %s", err) + } + + err = decoder.Decode(input) + if err != nil { + t.Fatalf("got an err: %s", err) + } + + if !reflect.DeepEqual(resultWeak, expectedResultWeak) { + t.Errorf("expected \n%#v, got: \n%#v", expectedResultWeak, resultWeak) + } +} + +func TestDecoder_ErrorUnused(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vstring": "hello", + "foo": "bar", + } + + var result Basic + config := &DecoderConfig{ + ErrorUnused: true, + Result: &result, + } + + decoder, err := NewDecoder(config) + if err != nil { + t.Fatalf("err: %s", err) + } + + err = decoder.Decode(input) + if err == nil { + t.Fatal("expected error") + } +} + +func TestMap(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vfoo": "foo", + "vother": map[interface{}]interface{}{ + "foo": "foo", + "bar": "bar", + }, + } + + var result Map + err := Decode(input, &result) + if err != nil { + t.Fatalf("got an error: %s", err) + } + + if result.Vfoo != "foo" { + t.Errorf("vfoo value should be 'foo': %#v", result.Vfoo) + } + + if result.Vother == nil { + t.Fatal("vother should not be nil") + } + + if len(result.Vother) != 2 { + t.Error("vother should have two items") + } + + if result.Vother["foo"] != "foo" { + t.Errorf("'foo' key should be foo, got: %#v", result.Vother["foo"]) + } + + if result.Vother["bar"] != "bar" { + t.Errorf("'bar' key should be bar, got: %#v", result.Vother["bar"]) + } +} + +func TestMapMerge(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vfoo": "foo", + "vother": map[interface{}]interface{}{ + "foo": "foo", + "bar": "bar", + }, + } + + var result Map + result.Vother = map[string]string{"hello": "world"} + err := Decode(input, &result) + if err != nil { + t.Fatalf("got an error: %s", err) + } + + if result.Vfoo != "foo" { + t.Errorf("vfoo value should be 'foo': %#v", result.Vfoo) + } + + expected := map[string]string{ + "foo": "foo", + "bar": "bar", + "hello": "world", + } + if !reflect.DeepEqual(result.Vother, expected) { + t.Errorf("bad: %#v", result.Vother) + } +} + +func TestMapOfStruct(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "value": map[string]interface{}{ + "foo": map[string]string{"vstring": "one"}, + "bar": map[string]string{"vstring": "two"}, + }, + } + + var result MapOfStruct + err := Decode(input, &result) + if err != nil { + t.Fatalf("got an err: %s", err) + } + + if result.Value == nil { + t.Fatal("value should not be nil") + } + + if len(result.Value) != 2 { + t.Error("value should have two items") + } + + if result.Value["foo"].Vstring != "one" { + t.Errorf("foo value should be 'one', got: %s", result.Value["foo"].Vstring) + } + + if result.Value["bar"].Vstring != "two" { + t.Errorf("bar value should be 'two', got: %s", result.Value["bar"].Vstring) + } +} + +func TestNestedType(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vfoo": "foo", + "vbar": map[string]interface{}{ + "vstring": "foo", + "vint": 42, + "vbool": true, + }, + } + + var result Nested + err := Decode(input, &result) + if err != nil { + t.Fatalf("got an err: %s", err.Error()) + } + + if result.Vfoo != "foo" { + t.Errorf("vfoo value should be 'foo': %#v", result.Vfoo) + } + + if result.Vbar.Vstring != "foo" { + t.Errorf("vstring value should be 'foo': %#v", result.Vbar.Vstring) + } + + if result.Vbar.Vint != 42 { + t.Errorf("vint value should be 42: %#v", result.Vbar.Vint) + } + + if result.Vbar.Vbool != true { + t.Errorf("vbool value should be true: %#v", result.Vbar.Vbool) + } + + if result.Vbar.Vextra != "" { + t.Errorf("vextra value should be empty: %#v", result.Vbar.Vextra) + } +} + +func TestNestedTypePointer(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vfoo": "foo", + "vbar": &map[string]interface{}{ + "vstring": "foo", + "vint": 42, + "vbool": true, + }, + } + + var result NestedPointer + err := Decode(input, &result) + if err != nil { + t.Fatalf("got an err: %s", err.Error()) + } + + if result.Vfoo != "foo" { + t.Errorf("vfoo value should be 'foo': %#v", result.Vfoo) + } + + if result.Vbar.Vstring != "foo" { + t.Errorf("vstring value should be 'foo': %#v", result.Vbar.Vstring) + } + + if result.Vbar.Vint != 42 { + t.Errorf("vint value should be 42: %#v", result.Vbar.Vint) + } + + if result.Vbar.Vbool != true { + t.Errorf("vbool value should be true: %#v", result.Vbar.Vbool) + } + + if result.Vbar.Vextra != "" { + t.Errorf("vextra value should be empty: %#v", result.Vbar.Vextra) + } +} + +func TestSlice(t *testing.T) { + t.Parallel() + + inputStringSlice := map[string]interface{}{ + "vfoo": "foo", + "vbar": []string{"foo", "bar", "baz"}, + } + + inputStringSlicePointer := map[string]interface{}{ + "vfoo": "foo", + "vbar": &[]string{"foo", "bar", "baz"}, + } + + outputStringSlice := &Slice{ + "foo", + []string{"foo", "bar", "baz"}, + } + + testSliceInput(t, inputStringSlice, outputStringSlice) + testSliceInput(t, inputStringSlicePointer, outputStringSlice) +} + +func TestInvalidSlice(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vfoo": "foo", + "vbar": 42, + } + + result := Slice{} + err := Decode(input, &result) + if err == nil { + t.Errorf("expected failure") + } +} + +func TestSliceOfStruct(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "value": []map[string]interface{}{ + {"vstring": "one"}, + {"vstring": "two"}, + }, + } + + var result SliceOfStruct + err := Decode(input, &result) + if err != nil { + t.Fatalf("got unexpected error: %s", err) + } + + if len(result.Value) != 2 { + t.Fatalf("expected two values, got %d", len(result.Value)) + } + + if result.Value[0].Vstring != "one" { + t.Errorf("first value should be 'one', got: %s", result.Value[0].Vstring) + } + + if result.Value[1].Vstring != "two" { + t.Errorf("second value should be 'two', got: %s", result.Value[1].Vstring) + } +} + +func TestSliceToMap(t *testing.T) { + t.Parallel() + + input := []map[string]interface{}{ + map[string]interface{}{ + "foo": "bar", + }, + map[string]interface{}{ + "bar": "baz", + }, + } + + var result map[string]interface{} + err := WeakDecode(input, &result) + if err != nil { + t.Fatalf("got an error: %s", err) + } + + expected := map[string]interface{}{ + "foo": "bar", + "bar": "baz", + } + if !reflect.DeepEqual(result, expected) { + t.Errorf("bad: %#v", result) + } +} + +func TestInvalidType(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vstring": 42, + } + + var result Basic + err := Decode(input, &result) + if err == nil { + t.Fatal("error should exist") + } + + derr, ok := err.(*Error) + if !ok { + t.Fatalf("error should be kind of Error, instead: %#v", err) + } + + if derr.Errors[0] != "'Vstring' expected type 'string', got unconvertible type 'int'" { + t.Errorf("got unexpected error: %s", err) + } + + inputNegIntUint := map[string]interface{}{ + "vuint": -42, + } + + err = Decode(inputNegIntUint, &result) + if err == nil { + t.Fatal("error should exist") + } + + derr, ok = err.(*Error) + if !ok { + t.Fatalf("error should be kind of Error, instead: %#v", err) + } + + if derr.Errors[0] != "cannot parse 'Vuint', -42 overflows uint" { + t.Errorf("got unexpected error: %s", err) + } + + inputNegFloatUint := map[string]interface{}{ + "vuint": -42.0, + } + + err = Decode(inputNegFloatUint, &result) + if err == nil { + t.Fatal("error should exist") + } + + derr, ok = err.(*Error) + if !ok { + t.Fatalf("error should be kind of Error, instead: %#v", err) + } + + if derr.Errors[0] != "cannot parse 'Vuint', -42.000000 overflows uint" { + t.Errorf("got unexpected error: %s", err) + } +} + +func TestMetadata(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vfoo": "foo", + "vbar": map[string]interface{}{ + "vstring": "foo", + "Vuint": 42, + "foo": "bar", + }, + "bar": "nil", + } + + var md Metadata + var result Nested + config := &DecoderConfig{ + Metadata: &md, + Result: &result, + } + + decoder, err := NewDecoder(config) + if err != nil { + t.Fatalf("err: %s", err) + } + + err = decoder.Decode(input) + if err != nil { + t.Fatalf("err: %s", err.Error()) + } + + expectedKeys := []string{"Vbar", "Vbar.Vstring", "Vbar.Vuint", "Vfoo"} + sort.Strings(md.Keys) + if !reflect.DeepEqual(md.Keys, expectedKeys) { + t.Fatalf("bad keys: %#v", md.Keys) + } + + expectedUnused := []string{"Vbar.foo", "bar"} + if !reflect.DeepEqual(md.Unused, expectedUnused) { + t.Fatalf("bad unused: %#v", md.Unused) + } +} + +func TestMetadata_Embedded(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "vstring": "foo", + "vunique": "bar", + } + + var md Metadata + var result EmbeddedSquash + config := &DecoderConfig{ + Metadata: &md, + Result: &result, + } + + decoder, err := NewDecoder(config) + if err != nil { + t.Fatalf("err: %s", err) + } + + err = decoder.Decode(input) + if err != nil { + t.Fatalf("err: %s", err.Error()) + } + + expectedKeys := []string{"Vstring", "Vunique"} + + sort.Strings(md.Keys) + if !reflect.DeepEqual(md.Keys, expectedKeys) { + t.Fatalf("bad keys: %#v", md.Keys) + } + + expectedUnused := []string{} + if !reflect.DeepEqual(md.Unused, expectedUnused) { + t.Fatalf("bad unused: %#v", md.Unused) + } +} + +func TestNonPtrValue(t *testing.T) { + t.Parallel() + + err := Decode(map[string]interface{}{}, Basic{}) + if err == nil { + t.Fatal("error should exist") + } + + if err.Error() != "result must be a pointer" { + t.Errorf("got unexpected error: %s", err) + } +} + +func TestTagged(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "foo": "bar", + "bar": "value", + } + + var result Tagged + err := Decode(input, &result) + if err != nil { + t.Fatalf("unexpected error: %s", err) + } + + if result.Value != "bar" { + t.Errorf("value should be 'bar', got: %#v", result.Value) + } + + if result.Extra != "value" { + t.Errorf("extra should be 'value', got: %#v", result.Extra) + } +} + +func TestWeakDecode(t *testing.T) { + t.Parallel() + + input := map[string]interface{}{ + "foo": "4", + "bar": "value", + } + + var result struct { + Foo int + Bar string + } + + if err := WeakDecode(input, &result); err != nil { + t.Fatalf("err: %s", err) + } + if result.Foo != 4 { + t.Fatalf("bad: %#v", result) + } + if result.Bar != "value" { + t.Fatalf("bad: %#v", result) + } +} + +func testSliceInput(t *testing.T, input map[string]interface{}, expected *Slice) { + var result Slice + err := Decode(input, &result) + if err != nil { + t.Fatalf("got error: %s", err) + } + + if result.Vfoo != expected.Vfoo { + t.Errorf("Vfoo expected '%s', got '%s'", expected.Vfoo, result.Vfoo) + } + + if result.Vbar == nil { + t.Fatalf("Vbar a slice, got '%#v'", result.Vbar) + } + + if len(result.Vbar) != len(expected.Vbar) { + t.Errorf("Vbar length should be %d, got %d", len(expected.Vbar), len(result.Vbar)) + } + + for i, v := range result.Vbar { + if v != expected.Vbar[i] { + t.Errorf( + "Vbar[%d] should be '%#v', got '%#v'", + i, expected.Vbar[i], v) + } + } +} diff --git a/vendor/github.com/russross/blackfriday/.gitignore b/vendor/github.com/russross/blackfriday/.gitignore new file mode 100644 index 0000000000..75623dcccb --- /dev/null +++ b/vendor/github.com/russross/blackfriday/.gitignore @@ -0,0 +1,8 @@ +*.out +*.swp +*.8 +*.6 +_obj +_test* +markdown +tags diff --git a/vendor/github.com/russross/blackfriday/.travis.yml b/vendor/github.com/russross/blackfriday/.travis.yml new file mode 100644 index 0000000000..208fd25bcd --- /dev/null +++ b/vendor/github.com/russross/blackfriday/.travis.yml @@ -0,0 +1,18 @@ +# Travis CI (http://travis-ci.org/) is a continuous integration service for +# open source projects. This file configures it to run unit tests for +# blackfriday. + +language: go + +go: + - 1.2 + - 1.3 + - 1.4 + - 1.5 + +install: + - go get -d -t -v ./... + - go build -v ./... + +script: + - go test -v ./... diff --git a/vendor/github.com/russross/blackfriday/LICENSE.txt b/vendor/github.com/russross/blackfriday/LICENSE.txt new file mode 100644 index 0000000000..2885af3602 --- /dev/null +++ b/vendor/github.com/russross/blackfriday/LICENSE.txt @@ -0,0 +1,29 @@ +Blackfriday is distributed under the Simplified BSD License: + +> Copyright © 2011 Russ Ross +> All rights reserved. +> +> Redistribution and use in source and binary forms, with or without +> modification, are permitted provided that the following conditions +> are met: +> +> 1. Redistributions of source code must retain the above copyright +> notice, this list of conditions and the following disclaimer. +> +> 2. Redistributions in binary form must reproduce the above +> copyright notice, this list of conditions and the following +> disclaimer in the documentation and/or other materials provided with +> the distribution. +> +> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +> "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +> LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +> FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +> COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +> INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +> BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +> LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +> LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +> ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +> POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/russross/blackfriday/README.md b/vendor/github.com/russross/blackfriday/README.md new file mode 100644 index 0000000000..7650ce44ec --- /dev/null +++ b/vendor/github.com/russross/blackfriday/README.md @@ -0,0 +1,267 @@ +Blackfriday [![Build Status](https://travis-ci.org/russross/blackfriday.svg?branch=master)](https://travis-ci.org/russross/blackfriday) +=========== + +Blackfriday is a [Markdown][1] processor implemented in [Go][2]. It +is paranoid about its input (so you can safely feed it user-supplied +data), it is fast, it supports common extensions (tables, smart +punctuation substitutions, etc.), and it is safe for all utf-8 +(unicode) input. + +HTML output is currently supported, along with Smartypants +extensions. An experimental LaTeX output engine is also included. + +It started as a translation from C of [Sundown][3]. + + +Installation +------------ + +Blackfriday is compatible with Go 1. If you are using an older +release of Go, consider using v1.1 of blackfriday, which was based +on the last stable release of Go prior to Go 1. You can find it as a +tagged commit on github. + +With Go 1 and git installed: + + go get github.com/russross/blackfriday + +will download, compile, and install the package into your `$GOPATH` +directory hierarchy. Alternatively, you can achieve the same if you +import it into a project: + + import "github.com/russross/blackfriday" + +and `go get` without parameters. + +Usage +----- + +For basic usage, it is as simple as getting your input into a byte +slice and calling: + + output := blackfriday.MarkdownBasic(input) + +This renders it with no extensions enabled. To get a more useful +feature set, use this instead: + + output := blackfriday.MarkdownCommon(input) + +### Sanitize untrusted content + +Blackfriday itself does nothing to protect against malicious content. If you are +dealing with user-supplied markdown, we recommend running blackfriday's output +through HTML sanitizer such as +[Bluemonday](https://github.com/microcosm-cc/bluemonday). + +Here's an example of simple usage of blackfriday together with bluemonday: + +``` go +import ( + "github.com/microcosm-cc/bluemonday" + "github.com/russross/blackfriday" +) + +// ... +unsafe := blackfriday.MarkdownCommon(input) +html := bluemonday.UGCPolicy().SanitizeBytes(unsafe) +``` + +### Custom options + +If you want to customize the set of options, first get a renderer +(currently either the HTML or LaTeX output engines), then use it to +call the more general `Markdown` function. For examples, see the +implementations of `MarkdownBasic` and `MarkdownCommon` in +`markdown.go`. + +You can also check out `blackfriday-tool` for a more complete example +of how to use it. Download and install it using: + + go get github.com/russross/blackfriday-tool + +This is a simple command-line tool that allows you to process a +markdown file using a standalone program. You can also browse the +source directly on github if you are just looking for some example +code: + +* + +Note that if you have not already done so, installing +`blackfriday-tool` will be sufficient to download and install +blackfriday in addition to the tool itself. The tool binary will be +installed in `$GOPATH/bin`. This is a statically-linked binary that +can be copied to wherever you need it without worrying about +dependencies and library versions. + + +Features +-------- + +All features of Sundown are supported, including: + +* **Compatibility**. The Markdown v1.0.3 test suite passes with + the `--tidy` option. Without `--tidy`, the differences are + mostly in whitespace and entity escaping, where blackfriday is + more consistent and cleaner. + +* **Common extensions**, including table support, fenced code + blocks, autolinks, strikethroughs, non-strict emphasis, etc. + +* **Safety**. Blackfriday is paranoid when parsing, making it safe + to feed untrusted user input without fear of bad things + happening. The test suite stress tests this and there are no + known inputs that make it crash. If you find one, please let me + know and send me the input that does it. + + NOTE: "safety" in this context means *runtime safety only*. In order to + protect yourself against JavaScript injection in untrusted content, see + [this example](https://github.com/russross/blackfriday#sanitize-untrusted-content). + +* **Fast processing**. It is fast enough to render on-demand in + most web applications without having to cache the output. + +* **Thread safety**. You can run multiple parsers in different + goroutines without ill effect. There is no dependence on global + shared state. + +* **Minimal dependencies**. Blackfriday only depends on standard + library packages in Go. The source code is pretty + self-contained, so it is easy to add to any project, including + Google App Engine projects. + +* **Standards compliant**. Output successfully validates using the + W3C validation tool for HTML 4.01 and XHTML 1.0 Transitional. + + +Extensions +---------- + +In addition to the standard markdown syntax, this package +implements the following extensions: + +* **Intra-word emphasis supression**. The `_` character is + commonly used inside words when discussing code, so having + markdown interpret it as an emphasis command is usually the + wrong thing. Blackfriday lets you treat all emphasis markers as + normal characters when they occur inside a word. + +* **Tables**. Tables can be created by drawing them in the input + using a simple syntax: + + ``` + Name | Age + --------|------ + Bob | 27 + Alice | 23 + ``` + +* **Fenced code blocks**. In addition to the normal 4-space + indentation to mark code blocks, you can explicitly mark them + and supply a language (to make syntax highlighting simple). Just + mark it like this: + + ``` go + func getTrue() bool { + return true + } + ``` + + You can use 3 or more backticks to mark the beginning of the + block, and the same number to mark the end of the block. + +* **Definition lists**. A simple definition list is made of a single-line + term followed by a colon and the definition for that term. + + Cat + : Fluffy animal everyone likes + + Internet + : Vector of transmission for pictures of cats + + Terms must be separated from the previous definition by a blank line. + +* **Footnotes**. A marker in the text that will become a superscript number; + a footnote definition that will be placed in a list of footnotes at the + end of the document. A footnote looks like this: + + This is a footnote.[^1] + + [^1]: the footnote text. + +* **Autolinking**. Blackfriday can find URLs that have not been + explicitly marked as links and turn them into links. + +* **Strikethrough**. Use two tildes (`~~`) to mark text that + should be crossed out. + +* **Hard line breaks**. With this extension enabled (it is off by + default in the `MarkdownBasic` and `MarkdownCommon` convenience + functions), newlines in the input translate into line breaks in + the output. + +* **Smart quotes**. Smartypants-style punctuation substitution is + supported, turning normal double- and single-quote marks into + curly quotes, etc. + +* **LaTeX-style dash parsing** is an additional option, where `--` + is translated into `–`, and `---` is translated into + `—`. This differs from most smartypants processors, which + turn a single hyphen into an ndash and a double hyphen into an + mdash. + +* **Smart fractions**, where anything that looks like a fraction + is translated into suitable HTML (instead of just a few special + cases like most smartypant processors). For example, `4/5` + becomes `45`, which renders as + 45. + + +Other renderers +--------------- + +Blackfriday is structured to allow alternative rendering engines. Here +are a few of note: + +* [github_flavored_markdown](https://godoc.org/github.com/shurcooL/github_flavored_markdown): + provides a GitHub Flavored Markdown renderer with fenced code block + highlighting, clickable header anchor links. + + It's not customizable, and its goal is to produce HTML output + equivalent to the [GitHub Markdown API endpoint](https://developer.github.com/v3/markdown/#render-a-markdown-document-in-raw-mode), + except the rendering is performed locally. + +* [markdownfmt](https://github.com/shurcooL/markdownfmt): like gofmt, + but for markdown. + +* LaTeX output: renders output as LaTeX. This is currently part of the + main Blackfriday repository, but may be split into its own project + in the future. If you are interested in owning and maintaining the + LaTeX output component, please be in touch. + + It renders some basic documents, but is only experimental at this + point. In particular, it does not do any inline escaping, so input + that happens to look like LaTeX code will be passed through without + modification. + +* [Md2Vim](https://github.com/FooSoft/md2vim): transforms markdown files into vimdoc format. + + +Todo +---- + +* More unit testing +* Improve unicode support. It does not understand all unicode + rules (about what constitutes a letter, a punctuation symbol, + etc.), so it may fail to detect word boundaries correctly in + some instances. It is safe on all utf-8 input. + + +License +------- + +[Blackfriday is distributed under the Simplified BSD License](LICENSE.txt) + + + [1]: http://daringfireball.net/projects/markdown/ "Markdown" + [2]: http://golang.org/ "Go Language" + [3]: https://github.com/vmg/sundown "Sundown" diff --git a/vendor/github.com/russross/blackfriday/block.go b/vendor/github.com/russross/blackfriday/block.go new file mode 100644 index 0000000000..740ad46263 --- /dev/null +++ b/vendor/github.com/russross/blackfriday/block.go @@ -0,0 +1,1412 @@ +// +// Blackfriday Markdown Processor +// Available at http://github.com/russross/blackfriday +// +// Copyright © 2011 Russ Ross . +// Distributed under the Simplified BSD License. +// See README.md for details. +// + +// +// Functions to parse block-level elements. +// + +package blackfriday + +import ( + "bytes" + + "github.com/shurcooL/sanitized_anchor_name" +) + +// Parse block-level data. +// Note: this function and many that it calls assume that +// the input buffer ends with a newline. +func (p *parser) block(out *bytes.Buffer, data []byte) { + if len(data) == 0 || data[len(data)-1] != '\n' { + panic("block input is missing terminating newline") + } + + // this is called recursively: enforce a maximum depth + if p.nesting >= p.maxNesting { + return + } + p.nesting++ + + // parse out one block-level construct at a time + for len(data) > 0 { + // prefixed header: + // + // # Header 1 + // ## Header 2 + // ... + // ###### Header 6 + if p.isPrefixHeader(data) { + data = data[p.prefixHeader(out, data):] + continue + } + + // block of preformatted HTML: + // + //
+ // ... + //
+ if data[0] == '<' { + if i := p.html(out, data, true); i > 0 { + data = data[i:] + continue + } + } + + // title block + // + // % stuff + // % more stuff + // % even more stuff + if p.flags&EXTENSION_TITLEBLOCK != 0 { + if data[0] == '%' { + if i := p.titleBlock(out, data, true); i > 0 { + data = data[i:] + continue + } + } + } + + // blank lines. note: returns the # of bytes to skip + if i := p.isEmpty(data); i > 0 { + data = data[i:] + continue + } + + // indented code block: + // + // func max(a, b int) int { + // if a > b { + // return a + // } + // return b + // } + if p.codePrefix(data) > 0 { + data = data[p.code(out, data):] + continue + } + + // fenced code block: + // + // ``` go + // func fact(n int) int { + // if n <= 1 { + // return n + // } + // return n * fact(n-1) + // } + // ``` + if p.flags&EXTENSION_FENCED_CODE != 0 { + if i := p.fencedCode(out, data, true); i > 0 { + data = data[i:] + continue + } + } + + // horizontal rule: + // + // ------ + // or + // ****** + // or + // ______ + if p.isHRule(data) { + p.r.HRule(out) + var i int + for i = 0; data[i] != '\n'; i++ { + } + data = data[i:] + continue + } + + // block quote: + // + // > A big quote I found somewhere + // > on the web + if p.quotePrefix(data) > 0 { + data = data[p.quote(out, data):] + continue + } + + // table: + // + // Name | Age | Phone + // ------|-----|--------- + // Bob | 31 | 555-1234 + // Alice | 27 | 555-4321 + if p.flags&EXTENSION_TABLES != 0 { + if i := p.table(out, data); i > 0 { + data = data[i:] + continue + } + } + + // an itemized/unordered list: + // + // * Item 1 + // * Item 2 + // + // also works with + or - + if p.uliPrefix(data) > 0 { + data = data[p.list(out, data, 0):] + continue + } + + // a numbered/ordered list: + // + // 1. Item 1 + // 2. Item 2 + if p.oliPrefix(data) > 0 { + data = data[p.list(out, data, LIST_TYPE_ORDERED):] + continue + } + + // definition lists: + // + // Term 1 + // : Definition a + // : Definition b + // + // Term 2 + // : Definition c + if p.flags&EXTENSION_DEFINITION_LISTS != 0 { + if p.dliPrefix(data) > 0 { + data = data[p.list(out, data, LIST_TYPE_DEFINITION):] + continue + } + } + + // anything else must look like a normal paragraph + // note: this finds underlined headers, too + data = data[p.paragraph(out, data):] + } + + p.nesting-- +} + +func (p *parser) isPrefixHeader(data []byte) bool { + if data[0] != '#' { + return false + } + + if p.flags&EXTENSION_SPACE_HEADERS != 0 { + level := 0 + for level < 6 && data[level] == '#' { + level++ + } + if data[level] != ' ' { + return false + } + } + return true +} + +func (p *parser) prefixHeader(out *bytes.Buffer, data []byte) int { + level := 0 + for level < 6 && data[level] == '#' { + level++ + } + i := skipChar(data, level, ' ') + end := skipUntilChar(data, i, '\n') + skip := end + id := "" + if p.flags&EXTENSION_HEADER_IDS != 0 { + j, k := 0, 0 + // find start/end of header id + for j = i; j < end-1 && (data[j] != '{' || data[j+1] != '#'); j++ { + } + for k = j + 1; k < end && data[k] != '}'; k++ { + } + // extract header id iff found + if j < end && k < end { + id = string(data[j+2 : k]) + end = j + skip = k + 1 + for end > 0 && data[end-1] == ' ' { + end-- + } + } + } + for end > 0 && data[end-1] == '#' { + if isBackslashEscaped(data, end-1) { + break + } + end-- + } + for end > 0 && data[end-1] == ' ' { + end-- + } + if end > i { + if id == "" && p.flags&EXTENSION_AUTO_HEADER_IDS != 0 { + id = sanitized_anchor_name.Create(string(data[i:end])) + } + work := func() bool { + p.inline(out, data[i:end]) + return true + } + p.r.Header(out, work, level, id) + } + return skip +} + +func (p *parser) isUnderlinedHeader(data []byte) int { + // test of level 1 header + if data[0] == '=' { + i := skipChar(data, 1, '=') + i = skipChar(data, i, ' ') + if data[i] == '\n' { + return 1 + } else { + return 0 + } + } + + // test of level 2 header + if data[0] == '-' { + i := skipChar(data, 1, '-') + i = skipChar(data, i, ' ') + if data[i] == '\n' { + return 2 + } else { + return 0 + } + } + + return 0 +} + +func (p *parser) titleBlock(out *bytes.Buffer, data []byte, doRender bool) int { + if data[0] != '%' { + return 0 + } + splitData := bytes.Split(data, []byte("\n")) + var i int + for idx, b := range splitData { + if !bytes.HasPrefix(b, []byte("%")) { + i = idx // - 1 + break + } + } + + data = bytes.Join(splitData[0:i], []byte("\n")) + p.r.TitleBlock(out, data) + + return len(data) +} + +func (p *parser) html(out *bytes.Buffer, data []byte, doRender bool) int { + var i, j int + + // identify the opening tag + if data[0] != '<' { + return 0 + } + curtag, tagfound := p.htmlFindTag(data[1:]) + + // handle special cases + if !tagfound { + // check for an HTML comment + if size := p.htmlComment(out, data, doRender); size > 0 { + return size + } + + // check for an
tag + if size := p.htmlHr(out, data, doRender); size > 0 { + return size + } + + // check for HTML CDATA + if size := p.htmlCDATA(out, data, doRender); size > 0 { + return size + } + + // no special case recognized + return 0 + } + + // look for an unindented matching closing tag + // followed by a blank line + found := false + /* + closetag := []byte("\n") + j = len(curtag) + 1 + for !found { + // scan for a closing tag at the beginning of a line + if skip := bytes.Index(data[j:], closetag); skip >= 0 { + j += skip + len(closetag) + } else { + break + } + + // see if it is the only thing on the line + if skip := p.isEmpty(data[j:]); skip > 0 { + // see if it is followed by a blank line/eof + j += skip + if j >= len(data) { + found = true + i = j + } else { + if skip := p.isEmpty(data[j:]); skip > 0 { + j += skip + found = true + i = j + } + } + } + } + */ + + // if not found, try a second pass looking for indented match + // but not if tag is "ins" or "del" (following original Markdown.pl) + if !found && curtag != "ins" && curtag != "del" { + i = 1 + for i < len(data) { + i++ + for i < len(data) && !(data[i-1] == '<' && data[i] == '/') { + i++ + } + + if i+2+len(curtag) >= len(data) { + break + } + + j = p.htmlFindEnd(curtag, data[i-1:]) + + if j > 0 { + i += j - 1 + found = true + break + } + } + } + + if !found { + return 0 + } + + // the end of the block has been found + if doRender { + // trim newlines + end := i + for end > 0 && data[end-1] == '\n' { + end-- + } + p.r.BlockHtml(out, data[:end]) + } + + return i +} + +func (p *parser) renderHTMLBlock(out *bytes.Buffer, data []byte, start int, doRender bool) int { + // html block needs to end with a blank line + if i := p.isEmpty(data[start:]); i > 0 { + size := start + i + if doRender { + // trim trailing newlines + end := size + for end > 0 && data[end-1] == '\n' { + end-- + } + p.r.BlockHtml(out, data[:end]) + } + return size + } + return 0 +} + +// HTML comment, lax form +func (p *parser) htmlComment(out *bytes.Buffer, data []byte, doRender bool) int { + i := p.inlineHTMLComment(out, data) + return p.renderHTMLBlock(out, data, i, doRender) +} + +// HTML CDATA section +func (p *parser) htmlCDATA(out *bytes.Buffer, data []byte, doRender bool) int { + const cdataTag = "') { + i++ + } + i++ + // no end-of-comment marker + if i >= len(data) { + return 0 + } + return p.renderHTMLBlock(out, data, i, doRender) +} + +// HR, which is the only self-closing block tag considered +func (p *parser) htmlHr(out *bytes.Buffer, data []byte, doRender bool) int { + if data[0] != '<' || (data[1] != 'h' && data[1] != 'H') || (data[2] != 'r' && data[2] != 'R') { + return 0 + } + if data[3] != ' ' && data[3] != '/' && data[3] != '>' { + // not an
tag after all; at least not a valid one + return 0 + } + + i := 3 + for data[i] != '>' && data[i] != '\n' { + i++ + } + + if data[i] == '>' { + return p.renderHTMLBlock(out, data, i+1, doRender) + } + + return 0 +} + +func (p *parser) htmlFindTag(data []byte) (string, bool) { + i := 0 + for isalnum(data[i]) { + i++ + } + key := string(data[:i]) + if _, ok := blockTags[key]; ok { + return key, true + } + return "", false +} + +func (p *parser) htmlFindEnd(tag string, data []byte) int { + // assume data[0] == '<' && data[1] == '/' already tested + + // check if tag is a match + closetag := []byte("") + if !bytes.HasPrefix(data, closetag) { + return 0 + } + i := len(closetag) + + // check that the rest of the line is blank + skip := 0 + if skip = p.isEmpty(data[i:]); skip == 0 { + return 0 + } + i += skip + skip = 0 + + if i >= len(data) { + return i + } + + if p.flags&EXTENSION_LAX_HTML_BLOCKS != 0 { + return i + } + if skip = p.isEmpty(data[i:]); skip == 0 { + // following line must be blank + return 0 + } + + return i + skip +} + +func (p *parser) isEmpty(data []byte) int { + // it is okay to call isEmpty on an empty buffer + if len(data) == 0 { + return 0 + } + + var i int + for i = 0; i < len(data) && data[i] != '\n'; i++ { + if data[i] != ' ' && data[i] != '\t' { + return 0 + } + } + return i + 1 +} + +func (p *parser) isHRule(data []byte) bool { + i := 0 + + // skip up to three spaces + for i < 3 && data[i] == ' ' { + i++ + } + + // look at the hrule char + if data[i] != '*' && data[i] != '-' && data[i] != '_' { + return false + } + c := data[i] + + // the whole line must be the char or whitespace + n := 0 + for data[i] != '\n' { + switch { + case data[i] == c: + n++ + case data[i] != ' ': + return false + } + i++ + } + + return n >= 3 +} + +func (p *parser) isFencedCode(data []byte, syntax **string, oldmarker string) (skip int, marker string) { + i, size := 0, 0 + skip = 0 + + // skip up to three spaces + for i < len(data) && i < 3 && data[i] == ' ' { + i++ + } + if i >= len(data) { + return + } + + // check for the marker characters: ~ or ` + if data[i] != '~' && data[i] != '`' { + return + } + + c := data[i] + + // the whole line must be the same char or whitespace + for i < len(data) && data[i] == c { + size++ + i++ + } + + if i >= len(data) { + return + } + + // the marker char must occur at least 3 times + if size < 3 { + return + } + marker = string(data[i-size : i]) + + // if this is the end marker, it must match the beginning marker + if oldmarker != "" && marker != oldmarker { + return + } + + if syntax != nil { + syn := 0 + i = skipChar(data, i, ' ') + + if i >= len(data) { + return + } + + syntaxStart := i + + if data[i] == '{' { + i++ + syntaxStart++ + + for i < len(data) && data[i] != '}' && data[i] != '\n' { + syn++ + i++ + } + + if i >= len(data) || data[i] != '}' { + return + } + + // strip all whitespace at the beginning and the end + // of the {} block + for syn > 0 && isspace(data[syntaxStart]) { + syntaxStart++ + syn-- + } + + for syn > 0 && isspace(data[syntaxStart+syn-1]) { + syn-- + } + + i++ + } else { + for i < len(data) && !isspace(data[i]) { + syn++ + i++ + } + } + + language := string(data[syntaxStart : syntaxStart+syn]) + *syntax = &language + } + + i = skipChar(data, i, ' ') + if i >= len(data) || data[i] != '\n' { + return + } + + skip = i + 1 + return +} + +func (p *parser) fencedCode(out *bytes.Buffer, data []byte, doRender bool) int { + var lang *string + beg, marker := p.isFencedCode(data, &lang, "") + if beg == 0 || beg >= len(data) { + return 0 + } + + var work bytes.Buffer + + for { + // safe to assume beg < len(data) + + // check for the end of the code block + fenceEnd, _ := p.isFencedCode(data[beg:], nil, marker) + if fenceEnd != 0 { + beg += fenceEnd + break + } + + // copy the current line + end := skipUntilChar(data, beg, '\n') + 1 + + // did we reach the end of the buffer without a closing marker? + if end >= len(data) { + return 0 + } + + // verbatim copy to the working buffer + if doRender { + work.Write(data[beg:end]) + } + beg = end + } + + syntax := "" + if lang != nil { + syntax = *lang + } + + if doRender { + p.r.BlockCode(out, work.Bytes(), syntax) + } + + return beg +} + +func (p *parser) table(out *bytes.Buffer, data []byte) int { + var header bytes.Buffer + i, columns := p.tableHeader(&header, data) + if i == 0 { + return 0 + } + + var body bytes.Buffer + + for i < len(data) { + pipes, rowStart := 0, i + for ; data[i] != '\n'; i++ { + if data[i] == '|' { + pipes++ + } + } + + if pipes == 0 { + i = rowStart + break + } + + // include the newline in data sent to tableRow + i++ + p.tableRow(&body, data[rowStart:i], columns, false) + } + + p.r.Table(out, header.Bytes(), body.Bytes(), columns) + + return i +} + +// check if the specified position is preceded by an odd number of backslashes +func isBackslashEscaped(data []byte, i int) bool { + backslashes := 0 + for i-backslashes-1 >= 0 && data[i-backslashes-1] == '\\' { + backslashes++ + } + return backslashes&1 == 1 +} + +func (p *parser) tableHeader(out *bytes.Buffer, data []byte) (size int, columns []int) { + i := 0 + colCount := 1 + for i = 0; data[i] != '\n'; i++ { + if data[i] == '|' && !isBackslashEscaped(data, i) { + colCount++ + } + } + + // doesn't look like a table header + if colCount == 1 { + return + } + + // include the newline in the data sent to tableRow + header := data[:i+1] + + // column count ignores pipes at beginning or end of line + if data[0] == '|' { + colCount-- + } + if i > 2 && data[i-1] == '|' && !isBackslashEscaped(data, i-1) { + colCount-- + } + + columns = make([]int, colCount) + + // move on to the header underline + i++ + if i >= len(data) { + return + } + + if data[i] == '|' && !isBackslashEscaped(data, i) { + i++ + } + i = skipChar(data, i, ' ') + + // each column header is of form: / *:?-+:? *|/ with # dashes + # colons >= 3 + // and trailing | optional on last column + col := 0 + for data[i] != '\n' { + dashes := 0 + + if data[i] == ':' { + i++ + columns[col] |= TABLE_ALIGNMENT_LEFT + dashes++ + } + for data[i] == '-' { + i++ + dashes++ + } + if data[i] == ':' { + i++ + columns[col] |= TABLE_ALIGNMENT_RIGHT + dashes++ + } + for data[i] == ' ' { + i++ + } + + // end of column test is messy + switch { + case dashes < 3: + // not a valid column + return + + case data[i] == '|' && !isBackslashEscaped(data, i): + // marker found, now skip past trailing whitespace + col++ + i++ + for data[i] == ' ' { + i++ + } + + // trailing junk found after last column + if col >= colCount && data[i] != '\n' { + return + } + + case (data[i] != '|' || isBackslashEscaped(data, i)) && col+1 < colCount: + // something else found where marker was required + return + + case data[i] == '\n': + // marker is optional for the last column + col++ + + default: + // trailing junk found after last column + return + } + } + if col != colCount { + return + } + + p.tableRow(out, header, columns, true) + size = i + 1 + return +} + +func (p *parser) tableRow(out *bytes.Buffer, data []byte, columns []int, header bool) { + i, col := 0, 0 + var rowWork bytes.Buffer + + if data[i] == '|' && !isBackslashEscaped(data, i) { + i++ + } + + for col = 0; col < len(columns) && i < len(data); col++ { + for data[i] == ' ' { + i++ + } + + cellStart := i + + for (data[i] != '|' || isBackslashEscaped(data, i)) && data[i] != '\n' { + i++ + } + + cellEnd := i + + // skip the end-of-cell marker, possibly taking us past end of buffer + i++ + + for cellEnd > cellStart && data[cellEnd-1] == ' ' { + cellEnd-- + } + + var cellWork bytes.Buffer + p.inline(&cellWork, data[cellStart:cellEnd]) + + if header { + p.r.TableHeaderCell(&rowWork, cellWork.Bytes(), columns[col]) + } else { + p.r.TableCell(&rowWork, cellWork.Bytes(), columns[col]) + } + } + + // pad it out with empty columns to get the right number + for ; col < len(columns); col++ { + if header { + p.r.TableHeaderCell(&rowWork, nil, columns[col]) + } else { + p.r.TableCell(&rowWork, nil, columns[col]) + } + } + + // silently ignore rows with too many cells + + p.r.TableRow(out, rowWork.Bytes()) +} + +// returns blockquote prefix length +func (p *parser) quotePrefix(data []byte) int { + i := 0 + for i < 3 && data[i] == ' ' { + i++ + } + if data[i] == '>' { + if data[i+1] == ' ' { + return i + 2 + } + return i + 1 + } + return 0 +} + +// blockquote ends with at least one blank line +// followed by something without a blockquote prefix +func (p *parser) terminateBlockquote(data []byte, beg, end int) bool { + if p.isEmpty(data[beg:]) <= 0 { + return false + } + if end >= len(data) { + return true + } + return p.quotePrefix(data[end:]) == 0 && p.isEmpty(data[end:]) == 0 +} + +// parse a blockquote fragment +func (p *parser) quote(out *bytes.Buffer, data []byte) int { + var raw bytes.Buffer + beg, end := 0, 0 + for beg < len(data) { + end = beg + // Step over whole lines, collecting them. While doing that, check for + // fenced code and if one's found, incorporate it altogether, + // irregardless of any contents inside it + for data[end] != '\n' { + if p.flags&EXTENSION_FENCED_CODE != 0 { + if i := p.fencedCode(out, data[end:], false); i > 0 { + // -1 to compensate for the extra end++ after the loop: + end += i - 1 + break + } + } + end++ + } + end++ + + if pre := p.quotePrefix(data[beg:]); pre > 0 { + // skip the prefix + beg += pre + } else if p.terminateBlockquote(data, beg, end) { + break + } + + // this line is part of the blockquote + raw.Write(data[beg:end]) + beg = end + } + + var cooked bytes.Buffer + p.block(&cooked, raw.Bytes()) + p.r.BlockQuote(out, cooked.Bytes()) + return end +} + +// returns prefix length for block code +func (p *parser) codePrefix(data []byte) int { + if data[0] == ' ' && data[1] == ' ' && data[2] == ' ' && data[3] == ' ' { + return 4 + } + return 0 +} + +func (p *parser) code(out *bytes.Buffer, data []byte) int { + var work bytes.Buffer + + i := 0 + for i < len(data) { + beg := i + for data[i] != '\n' { + i++ + } + i++ + + blankline := p.isEmpty(data[beg:i]) > 0 + if pre := p.codePrefix(data[beg:i]); pre > 0 { + beg += pre + } else if !blankline { + // non-empty, non-prefixed line breaks the pre + i = beg + break + } + + // verbatim copy to the working buffeu + if blankline { + work.WriteByte('\n') + } else { + work.Write(data[beg:i]) + } + } + + // trim all the \n off the end of work + workbytes := work.Bytes() + eol := len(workbytes) + for eol > 0 && workbytes[eol-1] == '\n' { + eol-- + } + if eol != len(workbytes) { + work.Truncate(eol) + } + + work.WriteByte('\n') + + p.r.BlockCode(out, work.Bytes(), "") + + return i +} + +// returns unordered list item prefix +func (p *parser) uliPrefix(data []byte) int { + i := 0 + + // start with up to 3 spaces + for i < 3 && data[i] == ' ' { + i++ + } + + // need a *, +, or - followed by a space + if (data[i] != '*' && data[i] != '+' && data[i] != '-') || + data[i+1] != ' ' { + return 0 + } + return i + 2 +} + +// returns ordered list item prefix +func (p *parser) oliPrefix(data []byte) int { + i := 0 + + // start with up to 3 spaces + for i < 3 && data[i] == ' ' { + i++ + } + + // count the digits + start := i + for data[i] >= '0' && data[i] <= '9' { + i++ + } + + // we need >= 1 digits followed by a dot and a space + if start == i || data[i] != '.' || data[i+1] != ' ' { + return 0 + } + return i + 2 +} + +// returns definition list item prefix +func (p *parser) dliPrefix(data []byte) int { + i := 0 + + // need a : followed by a spaces + if data[i] != ':' || data[i+1] != ' ' { + return 0 + } + for data[i] == ' ' { + i++ + } + return i + 2 +} + +// parse ordered or unordered list block +func (p *parser) list(out *bytes.Buffer, data []byte, flags int) int { + i := 0 + flags |= LIST_ITEM_BEGINNING_OF_LIST + work := func() bool { + for i < len(data) { + skip := p.listItem(out, data[i:], &flags) + i += skip + + if skip == 0 || flags&LIST_ITEM_END_OF_LIST != 0 { + break + } + flags &= ^LIST_ITEM_BEGINNING_OF_LIST + } + return true + } + + p.r.List(out, work, flags) + return i +} + +// Parse a single list item. +// Assumes initial prefix is already removed if this is a sublist. +func (p *parser) listItem(out *bytes.Buffer, data []byte, flags *int) int { + // keep track of the indentation of the first line + itemIndent := 0 + for itemIndent < 3 && data[itemIndent] == ' ' { + itemIndent++ + } + + i := p.uliPrefix(data) + if i == 0 { + i = p.oliPrefix(data) + } + if i == 0 { + i = p.dliPrefix(data) + // reset definition term flag + if i > 0 { + *flags &= ^LIST_TYPE_TERM + } + } + if i == 0 { + // if in defnition list, set term flag and continue + if *flags&LIST_TYPE_DEFINITION != 0 { + *flags |= LIST_TYPE_TERM + } else { + return 0 + } + } + + // skip leading whitespace on first line + for data[i] == ' ' { + i++ + } + + // find the end of the line + line := i + for i > 0 && data[i-1] != '\n' { + i++ + } + + // get working buffer + var raw bytes.Buffer + + // put the first line into the working buffer + raw.Write(data[line:i]) + line = i + + // process the following lines + containsBlankLine := false + sublist := 0 + +gatherlines: + for line < len(data) { + i++ + + // find the end of this line + for data[i-1] != '\n' { + i++ + } + + // if it is an empty line, guess that it is part of this item + // and move on to the next line + if p.isEmpty(data[line:i]) > 0 { + containsBlankLine = true + raw.Write(data[line:i]) + line = i + continue + } + + // calculate the indentation + indent := 0 + for indent < 4 && line+indent < i && data[line+indent] == ' ' { + indent++ + } + + chunk := data[line+indent : i] + + // evaluate how this line fits in + switch { + // is this a nested list item? + case (p.uliPrefix(chunk) > 0 && !p.isHRule(chunk)) || + p.oliPrefix(chunk) > 0 || + p.dliPrefix(chunk) > 0: + + if containsBlankLine { + *flags |= LIST_ITEM_CONTAINS_BLOCK + } + + // to be a nested list, it must be indented more + // if not, it is the next item in the same list + if indent <= itemIndent { + break gatherlines + } + + // is this the first item in the nested list? + if sublist == 0 { + sublist = raw.Len() + } + + // is this a nested prefix header? + case p.isPrefixHeader(chunk): + // if the header is not indented, it is not nested in the list + // and thus ends the list + if containsBlankLine && indent < 4 { + *flags |= LIST_ITEM_END_OF_LIST + break gatherlines + } + *flags |= LIST_ITEM_CONTAINS_BLOCK + + // anything following an empty line is only part + // of this item if it is indented 4 spaces + // (regardless of the indentation of the beginning of the item) + case containsBlankLine && indent < 4: + if *flags&LIST_TYPE_DEFINITION != 0 && i < len(data)-1 { + // is the next item still a part of this list? + next := i + for data[next] != '\n' { + next++ + } + for next < len(data)-1 && data[next] == '\n' { + next++ + } + if i < len(data)-1 && data[i] != ':' && data[next] != ':' { + *flags |= LIST_ITEM_END_OF_LIST + } + } else { + *flags |= LIST_ITEM_END_OF_LIST + } + break gatherlines + + // a blank line means this should be parsed as a block + case containsBlankLine: + *flags |= LIST_ITEM_CONTAINS_BLOCK + } + + containsBlankLine = false + + // add the line into the working buffer without prefix + raw.Write(data[line+indent : i]) + + line = i + } + + rawBytes := raw.Bytes() + + // render the contents of the list item + var cooked bytes.Buffer + if *flags&LIST_ITEM_CONTAINS_BLOCK != 0 && *flags&LIST_TYPE_TERM == 0 { + // intermediate render of block item, except for definition term + if sublist > 0 { + p.block(&cooked, rawBytes[:sublist]) + p.block(&cooked, rawBytes[sublist:]) + } else { + p.block(&cooked, rawBytes) + } + } else { + // intermediate render of inline item + if sublist > 0 { + p.inline(&cooked, rawBytes[:sublist]) + p.block(&cooked, rawBytes[sublist:]) + } else { + p.inline(&cooked, rawBytes) + } + } + + // render the actual list item + cookedBytes := cooked.Bytes() + parsedEnd := len(cookedBytes) + + // strip trailing newlines + for parsedEnd > 0 && cookedBytes[parsedEnd-1] == '\n' { + parsedEnd-- + } + p.r.ListItem(out, cookedBytes[:parsedEnd], *flags) + + return line +} + +// render a single paragraph that has already been parsed out +func (p *parser) renderParagraph(out *bytes.Buffer, data []byte) { + if len(data) == 0 { + return + } + + // trim leading spaces + beg := 0 + for data[beg] == ' ' { + beg++ + } + + // trim trailing newline + end := len(data) - 1 + + // trim trailing spaces + for end > beg && data[end-1] == ' ' { + end-- + } + + work := func() bool { + p.inline(out, data[beg:end]) + return true + } + p.r.Paragraph(out, work) +} + +func (p *parser) paragraph(out *bytes.Buffer, data []byte) int { + // prev: index of 1st char of previous line + // line: index of 1st char of current line + // i: index of cursor/end of current line + var prev, line, i int + + // keep going until we find something to mark the end of the paragraph + for i < len(data) { + // mark the beginning of the current line + prev = line + current := data[i:] + line = i + + // did we find a blank line marking the end of the paragraph? + if n := p.isEmpty(current); n > 0 { + // did this blank line followed by a definition list item? + if p.flags&EXTENSION_DEFINITION_LISTS != 0 { + if i < len(data)-1 && data[i+1] == ':' { + return p.list(out, data[prev:], LIST_TYPE_DEFINITION) + } + } + + p.renderParagraph(out, data[:i]) + return i + n + } + + // an underline under some text marks a header, so our paragraph ended on prev line + if i > 0 { + if level := p.isUnderlinedHeader(current); level > 0 { + // render the paragraph + p.renderParagraph(out, data[:prev]) + + // ignore leading and trailing whitespace + eol := i - 1 + for prev < eol && data[prev] == ' ' { + prev++ + } + for eol > prev && data[eol-1] == ' ' { + eol-- + } + + // render the header + // this ugly double closure avoids forcing variables onto the heap + work := func(o *bytes.Buffer, pp *parser, d []byte) func() bool { + return func() bool { + pp.inline(o, d) + return true + } + }(out, p, data[prev:eol]) + + id := "" + if p.flags&EXTENSION_AUTO_HEADER_IDS != 0 { + id = sanitized_anchor_name.Create(string(data[prev:eol])) + } + + p.r.Header(out, work, level, id) + + // find the end of the underline + for data[i] != '\n' { + i++ + } + return i + } + } + + // if the next line starts a block of HTML, then the paragraph ends here + if p.flags&EXTENSION_LAX_HTML_BLOCKS != 0 { + if data[i] == '<' && p.html(out, current, false) > 0 { + // rewind to before the HTML block + p.renderParagraph(out, data[:i]) + return i + } + } + + // if there's a prefixed header or a horizontal rule after this, paragraph is over + if p.isPrefixHeader(current) || p.isHRule(current) { + p.renderParagraph(out, data[:i]) + return i + } + + // if there's a fenced code block, paragraph is over + if p.flags&EXTENSION_FENCED_CODE != 0 { + if p.fencedCode(out, current, false) > 0 { + p.renderParagraph(out, data[:i]) + return i + } + } + + // if there's a definition list item, prev line is a definition term + if p.flags&EXTENSION_DEFINITION_LISTS != 0 { + if p.dliPrefix(current) != 0 { + return p.list(out, data[prev:], LIST_TYPE_DEFINITION) + } + } + + // if there's a list after this, paragraph is over + if p.flags&EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK != 0 { + if p.uliPrefix(current) != 0 || + p.oliPrefix(current) != 0 || + p.quotePrefix(current) != 0 || + p.codePrefix(current) != 0 { + p.renderParagraph(out, data[:i]) + return i + } + } + + // otherwise, scan to the beginning of the next line + for data[i] != '\n' { + i++ + } + i++ + } + + p.renderParagraph(out, data[:i]) + return i +} diff --git a/vendor/github.com/russross/blackfriday/block_test.go b/vendor/github.com/russross/blackfriday/block_test.go new file mode 100644 index 0000000000..f59268ee0b --- /dev/null +++ b/vendor/github.com/russross/blackfriday/block_test.go @@ -0,0 +1,1621 @@ +// +// Blackfriday Markdown Processor +// Available at http://github.com/russross/blackfriday +// +// Copyright © 2011 Russ Ross . +// Distributed under the Simplified BSD License. +// See README.md for details. +// + +// +// Unit tests for block parsing +// + +package blackfriday + +import ( + "strings" + "testing" +) + +func runMarkdownBlockWithRenderer(input string, extensions int, renderer Renderer) string { + return string(Markdown([]byte(input), renderer, extensions)) +} + +func runMarkdownBlock(input string, extensions int) string { + htmlFlags := 0 + htmlFlags |= HTML_USE_XHTML + + renderer := HtmlRenderer(htmlFlags, "", "") + + return runMarkdownBlockWithRenderer(input, extensions, renderer) +} + +func runnerWithRendererParameters(parameters HtmlRendererParameters) func(string, int) string { + return func(input string, extensions int) string { + htmlFlags := 0 + htmlFlags |= HTML_USE_XHTML + + renderer := HtmlRendererWithParameters(htmlFlags, "", "", parameters) + + return runMarkdownBlockWithRenderer(input, extensions, renderer) + } +} + +func doTestsBlock(t *testing.T, tests []string, extensions int) { + doTestsBlockWithRunner(t, tests, extensions, runMarkdownBlock) +} + +func doTestsBlockWithRunner(t *testing.T, tests []string, extensions int, runner func(string, int) string) { + // catch and report panics + var candidate string + defer func() { + if err := recover(); err != nil { + t.Errorf("\npanic while processing [%#v]: %s\n", candidate, err) + } + }() + + for i := 0; i+1 < len(tests); i += 2 { + input := tests[i] + candidate = input + expected := tests[i+1] + actual := runner(candidate, extensions) + if actual != expected { + t.Errorf("\nInput [%#v]\nExpected[%#v]\nActual [%#v]", + candidate, expected, actual) + } + + // now test every substring to stress test bounds checking + if !testing.Short() { + for start := 0; start < len(input); start++ { + for end := start + 1; end <= len(input); end++ { + candidate = input[start:end] + _ = runMarkdownBlock(candidate, extensions) + } + } + } + } +} + +func TestPrefixHeaderNoExtensions(t *testing.T) { + var tests = []string{ + "# Header 1\n", + "

Header 1

\n", + + "## Header 2\n", + "

Header 2

\n", + + "### Header 3\n", + "

Header 3

\n", + + "#### Header 4\n", + "

Header 4

\n", + + "##### Header 5\n", + "
Header 5
\n", + + "###### Header 6\n", + "
Header 6
\n", + + "####### Header 7\n", + "
# Header 7
\n", + + "#Header 1\n", + "

Header 1

\n", + + "##Header 2\n", + "

Header 2

\n", + + "###Header 3\n", + "

Header 3

\n", + + "####Header 4\n", + "

Header 4

\n", + + "#####Header 5\n", + "
Header 5
\n", + + "######Header 6\n", + "
Header 6
\n", + + "#######Header 7\n", + "
#Header 7
\n", + + "Hello\n# Header 1\nGoodbye\n", + "

Hello

\n\n

Header 1

\n\n

Goodbye

\n", + + "* List\n# Header\n* List\n", + "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", + + "* List\n#Header\n* List\n", + "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", + + "* List\n * Nested list\n # Nested header\n", + "
    \n
  • List

    \n\n
      \n
    • Nested list

      \n\n" + + "

      Nested header

    • \n
  • \n
\n", + + "#Header 1 \\#\n", + "

Header 1 #

\n", + + "#Header 1 \\# foo\n", + "

Header 1 # foo

\n", + + "#Header 1 #\\##\n", + "

Header 1 ##

\n", + } + doTestsBlock(t, tests, 0) +} + +func TestPrefixHeaderSpaceExtension(t *testing.T) { + var tests = []string{ + "# Header 1\n", + "

Header 1

\n", + + "## Header 2\n", + "

Header 2

\n", + + "### Header 3\n", + "

Header 3

\n", + + "#### Header 4\n", + "

Header 4

\n", + + "##### Header 5\n", + "
Header 5
\n", + + "###### Header 6\n", + "
Header 6
\n", + + "####### Header 7\n", + "

####### Header 7

\n", + + "#Header 1\n", + "

#Header 1

\n", + + "##Header 2\n", + "

##Header 2

\n", + + "###Header 3\n", + "

###Header 3

\n", + + "####Header 4\n", + "

####Header 4

\n", + + "#####Header 5\n", + "

#####Header 5

\n", + + "######Header 6\n", + "

######Header 6

\n", + + "#######Header 7\n", + "

#######Header 7

\n", + + "Hello\n# Header 1\nGoodbye\n", + "

Hello

\n\n

Header 1

\n\n

Goodbye

\n", + + "* List\n# Header\n* List\n", + "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", + + "* List\n#Header\n* List\n", + "
    \n
  • List\n#Header
  • \n
  • List
  • \n
\n", + + "* List\n * Nested list\n # Nested header\n", + "
    \n
  • List

    \n\n
      \n
    • Nested list

      \n\n" + + "

      Nested header

    • \n
  • \n
\n", + } + doTestsBlock(t, tests, EXTENSION_SPACE_HEADERS) +} + +func TestPrefixHeaderIdExtension(t *testing.T) { + var tests = []string{ + "# Header 1 {#someid}\n", + "

Header 1

\n", + + "# Header 1 {#someid} \n", + "

Header 1

\n", + + "# Header 1 {#someid}\n", + "

Header 1

\n", + + "# Header 1 {#someid\n", + "

Header 1 {#someid

\n", + + "# Header 1 {#someid\n", + "

Header 1 {#someid

\n", + + "# Header 1 {#someid}}\n", + "

Header 1

\n\n

}

\n", + + "## Header 2 {#someid}\n", + "

Header 2

\n", + + "### Header 3 {#someid}\n", + "

Header 3

\n", + + "#### Header 4 {#someid}\n", + "

Header 4

\n", + + "##### Header 5 {#someid}\n", + "
Header 5
\n", + + "###### Header 6 {#someid}\n", + "
Header 6
\n", + + "####### Header 7 {#someid}\n", + "
# Header 7
\n", + + "# Header 1 # {#someid}\n", + "

Header 1

\n", + + "## Header 2 ## {#someid}\n", + "

Header 2

\n", + + "Hello\n# Header 1\nGoodbye\n", + "

Hello

\n\n

Header 1

\n\n

Goodbye

\n", + + "* List\n# Header {#someid}\n* List\n", + "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", + + "* List\n#Header {#someid}\n* List\n", + "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", + + "* List\n * Nested list\n # Nested header {#someid}\n", + "
    \n
  • List

    \n\n
      \n
    • Nested list

      \n\n" + + "

      Nested header

    • \n
  • \n
\n", + } + doTestsBlock(t, tests, EXTENSION_HEADER_IDS) +} + +func TestPrefixHeaderIdExtensionWithPrefixAndSuffix(t *testing.T) { + var tests = []string{ + "# header 1 {#someid}\n", + "

header 1

\n", + + "## header 2 {#someid}\n", + "

header 2

\n", + + "### header 3 {#someid}\n", + "

header 3

\n", + + "#### header 4 {#someid}\n", + "

header 4

\n", + + "##### header 5 {#someid}\n", + "
header 5
\n", + + "###### header 6 {#someid}\n", + "
header 6
\n", + + "####### header 7 {#someid}\n", + "
# header 7
\n", + + "# header 1 # {#someid}\n", + "

header 1

\n", + + "## header 2 ## {#someid}\n", + "

header 2

\n", + + "* List\n# Header {#someid}\n* List\n", + "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", + + "* List\n#Header {#someid}\n* List\n", + "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", + + "* List\n * Nested list\n # Nested header {#someid}\n", + "
    \n
  • List

    \n\n
      \n
    • Nested list

      \n\n" + + "

      Nested header

    • \n
  • \n
\n", + } + + parameters := HtmlRendererParameters{ + HeaderIDPrefix: "PRE:", + HeaderIDSuffix: ":POST", + } + + doTestsBlockWithRunner(t, tests, EXTENSION_HEADER_IDS, runnerWithRendererParameters(parameters)) +} + +func TestPrefixAutoHeaderIdExtension(t *testing.T) { + var tests = []string{ + "# Header 1\n", + "

Header 1

\n", + + "# Header 1 \n", + "

Header 1

\n", + + "## Header 2\n", + "

Header 2

\n", + + "### Header 3\n", + "

Header 3

\n", + + "#### Header 4\n", + "

Header 4

\n", + + "##### Header 5\n", + "
Header 5
\n", + + "###### Header 6\n", + "
Header 6
\n", + + "####### Header 7\n", + "
# Header 7
\n", + + "Hello\n# Header 1\nGoodbye\n", + "

Hello

\n\n

Header 1

\n\n

Goodbye

\n", + + "* List\n# Header\n* List\n", + "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", + + "* List\n#Header\n* List\n", + "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", + + "* List\n * Nested list\n # Nested header\n", + "
    \n
  • List

    \n\n
      \n
    • Nested list

      \n\n" + + "

      Nested header

    • \n
  • \n
\n", + + "# Header\n\n# Header\n", + "

Header

\n\n

Header

\n", + + "# Header 1\n\n# Header 1", + "

Header 1

\n\n

Header 1

\n", + + "# Header\n\n# Header 1\n\n# Header\n\n# Header", + "

Header

\n\n

Header 1

\n\n

Header

\n\n

Header

\n", + } + doTestsBlock(t, tests, EXTENSION_AUTO_HEADER_IDS) +} + +func TestPrefixAutoHeaderIdExtensionWithPrefixAndSuffix(t *testing.T) { + var tests = []string{ + "# Header 1\n", + "

Header 1

\n", + + "# Header 1 \n", + "

Header 1

\n", + + "## Header 2\n", + "

Header 2

\n", + + "### Header 3\n", + "

Header 3

\n", + + "#### Header 4\n", + "

Header 4

\n", + + "##### Header 5\n", + "
Header 5
\n", + + "###### Header 6\n", + "
Header 6
\n", + + "####### Header 7\n", + "
# Header 7
\n", + + "Hello\n# Header 1\nGoodbye\n", + "

Hello

\n\n

Header 1

\n\n

Goodbye

\n", + + "* List\n# Header\n* List\n", + "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", + + "* List\n#Header\n* List\n", + "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", + + "* List\n * Nested list\n # Nested header\n", + "
    \n
  • List

    \n\n
      \n
    • Nested list

      \n\n" + + "

      Nested header

    • \n
  • \n
\n", + + "# Header\n\n# Header\n", + "

Header

\n\n

Header

\n", + + "# Header 1\n\n# Header 1", + "

Header 1

\n\n

Header 1

\n", + + "# Header\n\n# Header 1\n\n# Header\n\n# Header", + "

Header

\n\n

Header 1

\n\n

Header

\n\n

Header

\n", + } + + parameters := HtmlRendererParameters{ + HeaderIDPrefix: "PRE:", + HeaderIDSuffix: ":POST", + } + + doTestsBlockWithRunner(t, tests, EXTENSION_AUTO_HEADER_IDS, runnerWithRendererParameters(parameters)) +} + +func TestPrefixMultipleHeaderExtensions(t *testing.T) { + var tests = []string{ + "# Header\n\n# Header {#header}\n\n# Header 1", + "

Header

\n\n

Header

\n\n

Header 1

\n", + } + doTestsBlock(t, tests, EXTENSION_AUTO_HEADER_IDS|EXTENSION_HEADER_IDS) +} + +func TestUnderlineHeaders(t *testing.T) { + var tests = []string{ + "Header 1\n========\n", + "

Header 1

\n", + + "Header 2\n--------\n", + "

Header 2

\n", + + "A\n=\n", + "

A

\n", + + "B\n-\n", + "

B

\n", + + "Paragraph\nHeader\n=\n", + "

Paragraph

\n\n

Header

\n", + + "Header\n===\nParagraph\n", + "

Header

\n\n

Paragraph

\n", + + "Header\n===\nAnother header\n---\n", + "

Header

\n\n

Another header

\n", + + " Header\n======\n", + "

Header

\n", + + " Code\n========\n", + "
Code\n
\n\n

========

\n", + + "Header with *inline*\n=====\n", + "

Header with inline

\n", + + "* List\n * Sublist\n Not a header\n ------\n", + "
    \n
  • List\n\n
      \n
    • Sublist\nNot a header\n------
    • \n
  • \n
\n", + + "Paragraph\n\n\n\n\nHeader\n===\n", + "

Paragraph

\n\n

Header

\n", + + "Trailing space \n==== \n\n", + "

Trailing space

\n", + + "Trailing spaces\n==== \n\n", + "

Trailing spaces

\n", + + "Double underline\n=====\n=====\n", + "

Double underline

\n\n

=====

\n", + } + doTestsBlock(t, tests, 0) +} + +func TestUnderlineHeadersAutoIDs(t *testing.T) { + var tests = []string{ + "Header 1\n========\n", + "

Header 1

\n", + + "Header 2\n--------\n", + "

Header 2

\n", + + "A\n=\n", + "

A

\n", + + "B\n-\n", + "

B

\n", + + "Paragraph\nHeader\n=\n", + "

Paragraph

\n\n

Header

\n", + + "Header\n===\nParagraph\n", + "

Header

\n\n

Paragraph

\n", + + "Header\n===\nAnother header\n---\n", + "

Header

\n\n

Another header

\n", + + " Header\n======\n", + "

Header

\n", + + "Header with *inline*\n=====\n", + "

Header with inline

\n", + + "Paragraph\n\n\n\n\nHeader\n===\n", + "

Paragraph

\n\n

Header

\n", + + "Trailing space \n==== \n\n", + "

Trailing space

\n", + + "Trailing spaces\n==== \n\n", + "

Trailing spaces

\n", + + "Double underline\n=====\n=====\n", + "

Double underline

\n\n

=====

\n", + + "Header\n======\n\nHeader\n======\n", + "

Header

\n\n

Header

\n", + + "Header 1\n========\n\nHeader 1\n========\n", + "

Header 1

\n\n

Header 1

\n", + } + doTestsBlock(t, tests, EXTENSION_AUTO_HEADER_IDS) +} + +func TestHorizontalRule(t *testing.T) { + var tests = []string{ + "-\n", + "

-

\n", + + "--\n", + "

--

\n", + + "---\n", + "
\n", + + "----\n", + "
\n", + + "*\n", + "

*

\n", + + "**\n", + "

**

\n", + + "***\n", + "
\n", + + "****\n", + "
\n", + + "_\n", + "

_

\n", + + "__\n", + "

__

\n", + + "___\n", + "
\n", + + "____\n", + "
\n", + + "-*-\n", + "

-*-

\n", + + "- - -\n", + "
\n", + + "* * *\n", + "
\n", + + "_ _ _\n", + "
\n", + + "-----*\n", + "

-----*

\n", + + " ------ \n", + "
\n", + + "Hello\n***\n", + "

Hello

\n\n
\n", + + "---\n***\n___\n", + "
\n\n
\n\n
\n", + } + doTestsBlock(t, tests, 0) +} + +func TestUnorderedList(t *testing.T) { + var tests = []string{ + "* Hello\n", + "
    \n
  • Hello
  • \n
\n", + + "* Yin\n* Yang\n", + "
    \n
  • Yin
  • \n
  • Yang
  • \n
\n", + + "* Ting\n* Bong\n* Goo\n", + "
    \n
  • Ting
  • \n
  • Bong
  • \n
  • Goo
  • \n
\n", + + "* Yin\n\n* Yang\n", + "
    \n
  • Yin

  • \n\n
  • Yang

  • \n
\n", + + "* Ting\n\n* Bong\n* Goo\n", + "
    \n
  • Ting

  • \n\n
  • Bong

  • \n\n
  • Goo

  • \n
\n", + + "+ Hello\n", + "
    \n
  • Hello
  • \n
\n", + + "+ Yin\n+ Yang\n", + "
    \n
  • Yin
  • \n
  • Yang
  • \n
\n", + + "+ Ting\n+ Bong\n+ Goo\n", + "
    \n
  • Ting
  • \n
  • Bong
  • \n
  • Goo
  • \n
\n", + + "+ Yin\n\n+ Yang\n", + "
    \n
  • Yin

  • \n\n
  • Yang

  • \n
\n", + + "+ Ting\n\n+ Bong\n+ Goo\n", + "
    \n
  • Ting

  • \n\n
  • Bong

  • \n\n
  • Goo

  • \n
\n", + + "- Hello\n", + "
    \n
  • Hello
  • \n
\n", + + "- Yin\n- Yang\n", + "
    \n
  • Yin
  • \n
  • Yang
  • \n
\n", + + "- Ting\n- Bong\n- Goo\n", + "
    \n
  • Ting
  • \n
  • Bong
  • \n
  • Goo
  • \n
\n", + + "- Yin\n\n- Yang\n", + "
    \n
  • Yin

  • \n\n
  • Yang

  • \n
\n", + + "- Ting\n\n- Bong\n- Goo\n", + "
    \n
  • Ting

  • \n\n
  • Bong

  • \n\n
  • Goo

  • \n
\n", + + "*Hello\n", + "

*Hello

\n", + + "* Hello \n", + "
    \n
  • Hello
  • \n
\n", + + "* Hello \n Next line \n", + "
    \n
  • Hello\nNext line
  • \n
\n", + + "Paragraph\n* No linebreak\n", + "

Paragraph\n* No linebreak

\n", + + "Paragraph\n\n* Linebreak\n", + "

Paragraph

\n\n
    \n
  • Linebreak
  • \n
\n", + + "* List\n * Nested list\n", + "
    \n
  • List\n\n
      \n
    • Nested list
    • \n
  • \n
\n", + + "* List\n\n * Nested list\n", + "
    \n
  • List

    \n\n
      \n
    • Nested list
    • \n
  • \n
\n", + + "* List\n Second line\n\n + Nested\n", + "
    \n
  • List\nSecond line

    \n\n
      \n
    • Nested
    • \n
  • \n
\n", + + "* List\n + Nested\n\n Continued\n", + "
    \n
  • List

    \n\n
      \n
    • Nested
    • \n
    \n\n

    Continued

  • \n
\n", + + "* List\n * shallow indent\n", + "
    \n
  • List\n\n
      \n
    • shallow indent
    • \n
  • \n
\n", + + "* List\n" + + " * shallow indent\n" + + " * part of second list\n" + + " * still second\n" + + " * almost there\n" + + " * third level\n", + "
    \n" + + "
  • List\n\n" + + "
      \n" + + "
    • shallow indent
    • \n" + + "
    • part of second list
    • \n" + + "
    • still second
    • \n" + + "
    • almost there\n\n" + + "
        \n" + + "
      • third level
      • \n" + + "
    • \n" + + "
  • \n" + + "
\n", + + "* List\n extra indent, same paragraph\n", + "
    \n
  • List\n extra indent, same paragraph
  • \n
\n", + + "* List\n\n code block\n", + "
    \n
  • List

    \n\n
    code block\n
  • \n
\n", + + "* List\n\n code block with spaces\n", + "
    \n
  • List

    \n\n
      code block with spaces\n
  • \n
\n", + + "* List\n\n * sublist\n\n normal text\n\n * another sublist\n", + "
    \n
  • List

    \n\n
      \n
    • sublist
    • \n
    \n\n

    normal text

    \n\n
      \n
    • another sublist
    • \n
  • \n
\n", + + `* Foo + + bar + + qux +`, + `
    +
  • Foo

    + +
    bar
    +
    +qux
    +
  • +
+`, + } + doTestsBlock(t, tests, 0) +} + +func TestFencedCodeBlockWithinList(t *testing.T) { + doTestsBlock(t, []string{ + "* Foo\n\n ```\n bar\n\n qux\n ```\n", + `
    +
  • Foo

    + +
    bar
    +
    +qux
    +
  • +
+`, + }, EXTENSION_FENCED_CODE) +} + +func TestOrderedList(t *testing.T) { + var tests = []string{ + "1. Hello\n", + "
    \n
  1. Hello
  2. \n
\n", + + "1. Yin\n2. Yang\n", + "
    \n
  1. Yin
  2. \n
  3. Yang
  4. \n
\n", + + "1. Ting\n2. Bong\n3. Goo\n", + "
    \n
  1. Ting
  2. \n
  3. Bong
  4. \n
  5. Goo
  6. \n
\n", + + "1. Yin\n\n2. Yang\n", + "
    \n
  1. Yin

  2. \n\n
  3. Yang

  4. \n
\n", + + "1. Ting\n\n2. Bong\n3. Goo\n", + "
    \n
  1. Ting

  2. \n\n
  3. Bong

  4. \n\n
  5. Goo

  6. \n
\n", + + "1 Hello\n", + "

1 Hello

\n", + + "1.Hello\n", + "

1.Hello

\n", + + "1. Hello \n", + "
    \n
  1. Hello
  2. \n
\n", + + "1. Hello \n Next line \n", + "
    \n
  1. Hello\nNext line
  2. \n
\n", + + "Paragraph\n1. No linebreak\n", + "

Paragraph\n1. No linebreak

\n", + + "Paragraph\n\n1. Linebreak\n", + "

Paragraph

\n\n
    \n
  1. Linebreak
  2. \n
\n", + + "1. List\n 1. Nested list\n", + "
    \n
  1. List\n\n
      \n
    1. Nested list
    2. \n
  2. \n
\n", + + "1. List\n\n 1. Nested list\n", + "
    \n
  1. List

    \n\n
      \n
    1. Nested list
    2. \n
  2. \n
\n", + + "1. List\n Second line\n\n 1. Nested\n", + "
    \n
  1. List\nSecond line

    \n\n
      \n
    1. Nested
    2. \n
  2. \n
\n", + + "1. List\n 1. Nested\n\n Continued\n", + "
    \n
  1. List

    \n\n
      \n
    1. Nested
    2. \n
    \n\n

    Continued

  2. \n
\n", + + "1. List\n 1. shallow indent\n", + "
    \n
  1. List\n\n
      \n
    1. shallow indent
    2. \n
  2. \n
\n", + + "1. List\n" + + " 1. shallow indent\n" + + " 2. part of second list\n" + + " 3. still second\n" + + " 4. almost there\n" + + " 1. third level\n", + "
    \n" + + "
  1. List\n\n" + + "
      \n" + + "
    1. shallow indent
    2. \n" + + "
    3. part of second list
    4. \n" + + "
    5. still second
    6. \n" + + "
    7. almost there\n\n" + + "
        \n" + + "
      1. third level
      2. \n" + + "
    8. \n" + + "
  2. \n" + + "
\n", + + "1. List\n extra indent, same paragraph\n", + "
    \n
  1. List\n extra indent, same paragraph
  2. \n
\n", + + "1. List\n\n code block\n", + "
    \n
  1. List

    \n\n
    code block\n
  2. \n
\n", + + "1. List\n\n code block with spaces\n", + "
    \n
  1. List

    \n\n
      code block with spaces\n
  2. \n
\n", + + "1. List\n * Mixted list\n", + "
    \n
  1. List\n\n
      \n
    • Mixted list
    • \n
  2. \n
\n", + + "1. List\n * Mixed list\n", + "
    \n
  1. List\n\n
      \n
    • Mixed list
    • \n
  2. \n
\n", + + "* Start with unordered\n 1. Ordered\n", + "
    \n
  • Start with unordered\n\n
      \n
    1. Ordered
    2. \n
  • \n
\n", + + "* Start with unordered\n 1. Ordered\n", + "
    \n
  • Start with unordered\n\n
      \n
    1. Ordered
    2. \n
  • \n
\n", + + "1. numbers\n1. are ignored\n", + "
    \n
  1. numbers
  2. \n
  3. are ignored
  4. \n
\n", + + `1. Foo + + bar + + + + qux +`, + `
    +
  1. Foo

    + +
    bar
    +
    +
    +
    +qux
    +
  2. +
+`, + } + doTestsBlock(t, tests, 0) +} + +func TestDefinitionList(t *testing.T) { + var tests = []string{ + "Term 1\n: Definition a\n", + "
\n
Term 1
\n
Definition a
\n
\n", + + "Term 1\n: Definition a \n", + "
\n
Term 1
\n
Definition a
\n
\n", + + "Term 1\n: Definition a\n: Definition b\n", + "
\n
Term 1
\n
Definition a
\n
Definition b
\n
\n", + + "Term 1\n: Definition a\n\nTerm 2\n: Definition b\n", + "
\n" + + "
Term 1
\n" + + "
Definition a
\n" + + "
Term 2
\n" + + "
Definition b
\n" + + "
\n", + + "Term 1\n: Definition a\n\nTerm 2\n: Definition b\n\nTerm 3\n: Definition c\n", + "
\n" + + "
Term 1
\n" + + "
Definition a
\n" + + "
Term 2
\n" + + "
Definition b
\n" + + "
Term 3
\n" + + "
Definition c
\n" + + "
\n", + + "Term 1\n: Definition a\n: Definition b\n\nTerm 2\n: Definition c\n", + "
\n" + + "
Term 1
\n" + + "
Definition a
\n" + + "
Definition b
\n" + + "
Term 2
\n" + + "
Definition c
\n" + + "
\n", + + "Term 1\n\n: Definition a\n\nTerm 2\n\n: Definition b\n", + "
\n" + + "
Term 1
\n" + + "

Definition a

\n" + + "
Term 2
\n" + + "

Definition b

\n" + + "
\n", + + "Term 1\n\n: Definition a\n\n: Definition b\n\nTerm 2\n\n: Definition c\n", + "
\n" + + "
Term 1
\n" + + "

Definition a

\n" + + "

Definition b

\n" + + "
Term 2
\n" + + "

Definition c

\n" + + "
\n", + + "Term 1\n: Definition a\nNext line\n", + "
\n
Term 1
\n
Definition a\nNext line
\n
\n", + + "Term 1\n: Definition a\n Next line\n", + "
\n
Term 1
\n
Definition a\nNext line
\n
\n", + + "Term 1\n: Definition a \n Next line \n", + "
\n
Term 1
\n
Definition a\nNext line
\n
\n", + + "Term 1\n: Definition a\nNext line\n\nTerm 2\n: Definition b", + "
\n" + + "
Term 1
\n" + + "
Definition a\nNext line
\n" + + "
Term 2
\n" + + "
Definition b
\n" + + "
\n", + + "Term 1\n: Definition a\n", + "
\n
Term 1
\n
Definition a
\n
\n", + + "Term 1\n:Definition a\n", + "

Term 1\n:Definition a

\n", + + "Term 1\n\n: Definition a\n\nTerm 2\n\n: Definition b\n\nText 1", + "
\n" + + "
Term 1
\n" + + "

Definition a

\n" + + "
Term 2
\n" + + "

Definition b

\n" + + "
\n" + + "\n

Text 1

\n", + + "Term 1\n\n: Definition a\n\nText 1\n\nTerm 2\n\n: Definition b\n\nText 2", + "
\n" + + "
Term 1
\n" + + "

Definition a

\n" + + "
\n" + + "\n

Text 1

\n" + + "\n
\n" + + "
Term 2
\n" + + "

Definition b

\n" + + "
\n" + + "\n

Text 2

\n", + } + doTestsBlock(t, tests, EXTENSION_DEFINITION_LISTS) +} + +func TestPreformattedHtml(t *testing.T) { + var tests = []string{ + "
\n", + "
\n", + + "
\n
\n", + "
\n
\n", + + "
\n
\nParagraph\n", + "

\n
\nParagraph

\n", + + "
\n
\n", + "
\n
\n", + + "
\nAnything here\n
\n", + "
\nAnything here\n
\n", + + "
\n Anything here\n
\n", + "
\n Anything here\n
\n", + + "
\nAnything here\n
\n", + "
\nAnything here\n
\n", + + "
\nThis is *not* &proceessed\n
\n", + "
\nThis is *not* &proceessed\n
\n", + + "\n Something\n\n", + "

\n Something\n

\n", + + "
\n Something here\n\n", + "

\n Something here\n

\n", + + "Paragraph\n
\nHere? >&<\n
\n", + "

Paragraph\n

\nHere? >&<\n

\n", + + "Paragraph\n\n
\nHow about here? >&<\n
\n", + "

Paragraph

\n\n
\nHow about here? >&<\n
\n", + + "Paragraph\n
\nHere? >&<\n
\nAnd here?\n", + "

Paragraph\n

\nHere? >&<\n
\nAnd here?

\n", + + "Paragraph\n\n
\nHow about here? >&<\n
\nAnd here?\n", + "

Paragraph

\n\n

\nHow about here? >&<\n
\nAnd here?

\n", + + "Paragraph\n
\nHere? >&<\n
\n\nAnd here?\n", + "

Paragraph\n

\nHere? >&<\n

\n\n

And here?

\n", + + "Paragraph\n\n
\nHow about here? >&<\n
\n\nAnd here?\n", + "

Paragraph

\n\n
\nHow about here? >&<\n
\n\n

And here?

\n", + } + doTestsBlock(t, tests, 0) +} + +func TestPreformattedHtmlLax(t *testing.T) { + var tests = []string{ + "Paragraph\n
\nHere? >&<\n
\n", + "

Paragraph

\n\n
\nHere? >&<\n
\n", + + "Paragraph\n\n
\nHow about here? >&<\n
\n", + "

Paragraph

\n\n
\nHow about here? >&<\n
\n", + + "Paragraph\n
\nHere? >&<\n
\nAnd here?\n", + "

Paragraph

\n\n
\nHere? >&<\n
\n\n

And here?

\n", + + "Paragraph\n\n
\nHow about here? >&<\n
\nAnd here?\n", + "

Paragraph

\n\n
\nHow about here? >&<\n
\n\n

And here?

\n", + + "Paragraph\n
\nHere? >&<\n
\n\nAnd here?\n", + "

Paragraph

\n\n
\nHere? >&<\n
\n\n

And here?

\n", + + "Paragraph\n\n
\nHow about here? >&<\n
\n\nAnd here?\n", + "

Paragraph

\n\n
\nHow about here? >&<\n
\n\n

And here?

\n", + } + doTestsBlock(t, tests, EXTENSION_LAX_HTML_BLOCKS) +} + +func TestFencedCodeBlock(t *testing.T) { + var tests = []string{ + "``` go\nfunc foo() bool {\n\treturn true;\n}\n```\n", + "
func foo() bool {\n\treturn true;\n}\n
\n", + + "``` c\n/* special & char < > \" escaping */\n```\n", + "
/* special & char < > " escaping */\n
\n", + + "``` c\nno *inline* processing ~~of text~~\n```\n", + "
no *inline* processing ~~of text~~\n
\n", + + "```\nNo language\n```\n", + "
No language\n
\n", + + "``` {ocaml}\nlanguage in braces\n```\n", + "
language in braces\n
\n", + + "``` {ocaml} \nwith extra whitespace\n```\n", + "
with extra whitespace\n
\n", + + "```{ ocaml }\nwith extra whitespace\n```\n", + "
with extra whitespace\n
\n", + + "~ ~~ java\nWith whitespace\n~~~\n", + "

~ ~~ java\nWith whitespace\n~~~

\n", + + "~~\nonly two\n~~\n", + "

~~\nonly two\n~~

\n", + + "```` python\nextra\n````\n", + "
extra\n
\n", + + "~~~ perl\nthree to start, four to end\n~~~~\n", + "

~~~ perl\nthree to start, four to end\n~~~~

\n", + + "~~~~ perl\nfour to start, three to end\n~~~\n", + "

~~~~ perl\nfour to start, three to end\n~~~

\n", + + "~~~ bash\ntildes\n~~~\n", + "
tildes\n
\n", + + "``` lisp\nno ending\n", + "

``` lisp\nno ending

\n", + + "~~~ lisp\nend with language\n~~~ lisp\n", + "

~~~ lisp\nend with language\n~~~ lisp

\n", + + "```\nmismatched begin and end\n~~~\n", + "

```\nmismatched begin and end\n~~~

\n", + + "~~~\nmismatched begin and end\n```\n", + "

~~~\nmismatched begin and end\n```

\n", + + " ``` oz\nleading spaces\n```\n", + "
leading spaces\n
\n", + + " ``` oz\nleading spaces\n ```\n", + "
leading spaces\n
\n", + + " ``` oz\nleading spaces\n ```\n", + "
leading spaces\n
\n", + + "``` oz\nleading spaces\n ```\n", + "
leading spaces\n
\n", + + " ``` oz\nleading spaces\n ```\n", + "
``` oz\n
\n\n

leading spaces\n ```

\n", + + "Bla bla\n\n``` oz\ncode blocks breakup paragraphs\n```\n\nBla Bla\n", + "

Bla bla

\n\n
code blocks breakup paragraphs\n
\n\n

Bla Bla

\n", + + "Some text before a fenced code block\n``` oz\ncode blocks breakup paragraphs\n```\nAnd some text after a fenced code block", + "

Some text before a fenced code block

\n\n
code blocks breakup paragraphs\n
\n\n

And some text after a fenced code block

\n", + + "`", + "

`

\n", + + "Bla bla\n\n``` oz\ncode blocks breakup paragraphs\n```\n\nBla Bla\n\n``` oz\nmultiple code blocks work okay\n```\n\nBla Bla\n", + "

Bla bla

\n\n
code blocks breakup paragraphs\n
\n\n

Bla Bla

\n\n
multiple code blocks work okay\n
\n\n

Bla Bla

\n", + + "Some text before a fenced code block\n``` oz\ncode blocks breakup paragraphs\n```\nSome text in between\n``` oz\nmultiple code blocks work okay\n```\nAnd some text after a fenced code block", + "

Some text before a fenced code block

\n\n
code blocks breakup paragraphs\n
\n\n

Some text in between

\n\n
multiple code blocks work okay\n
\n\n

And some text after a fenced code block

\n", + } + doTestsBlock(t, tests, EXTENSION_FENCED_CODE) +} + +func TestFencedCodeInsideBlockquotes(t *testing.T) { + cat := func(s ...string) string { return strings.Join(s, "\n") } + var tests = []string{ + cat("> ```go", + "package moo", + "", + "```", + ""), + `
+
package moo
+
+
+
+`, + // ------------------------------------------- + cat("> foo", + "> ", + "> ```go", + "package moo", + "```", + "> ", + "> goo.", + ""), + `
+

foo

+ +
package moo
+
+ +

goo.

+
+`, + // ------------------------------------------- + cat("> foo", + "> ", + "> quote", + "continues", + "```", + ""), + `
+

foo

+ +

quote +continues +` + "```" + `

+
+`, + // ------------------------------------------- + cat("> foo", + "> ", + "> ```go", + "package moo", + "```", + "> ", + "> goo.", + "> ", + "> ```go", + "package zoo", + "```", + "> ", + "> woo.", + ""), + `
+

foo

+ +
package moo
+
+ +

goo.

+ +
package zoo
+
+ +

woo.

+
+`, + } + + // These 2 alternative forms of blockquoted fenced code blocks should produce same output. + forms := [2]string{ + cat("> plain quoted text", + "> ```fenced", + "code", + " with leading single space correctly preserved", + "okay", + "```", + "> rest of quoted text"), + cat("> plain quoted text", + "> ```fenced", + "> code", + "> with leading single space correctly preserved", + "> okay", + "> ```", + "> rest of quoted text"), + } + want := `
+

plain quoted text

+ +
code
+ with leading single space correctly preserved
+okay
+
+ +

rest of quoted text

+
+` + tests = append(tests, forms[0], want) + tests = append(tests, forms[1], want) + + doTestsBlock(t, tests, EXTENSION_FENCED_CODE) +} + +func TestTable(t *testing.T) { + var tests = []string{ + "a | b\n---|---\nc | d\n", + "\n\n\n\n\n\n\n\n" + + "\n\n\n\n\n\n
ab
cd
\n", + + "a | b\n---|--\nc | d\n", + "

a | b\n---|--\nc | d

\n", + + "|a|b|c|d|\n|----|----|----|---|\n|e|f|g|h|\n", + "\n\n\n\n\n\n\n\n\n\n" + + "\n\n\n\n\n\n\n\n
abcd
efgh
\n", + + "*a*|__b__|[c](C)|d\n---|---|---|---\ne|f|g|h\n", + "\n\n\n\n\n\n\n\n\n\n" + + "\n\n\n\n\n\n\n\n
abcd
efgh
\n", + + "a|b|c\n---|---|---\nd|e|f\ng|h\ni|j|k|l|m\nn|o|p\n", + "\n\n\n\n\n\n\n\n\n" + + "\n\n\n\n\n\n\n" + + "\n\n\n\n\n\n" + + "\n\n\n\n\n\n" + + "\n\n\n\n\n\n
abc
def
gh
ijk
nop
\n", + + "a|b|c\n---|---|---\n*d*|__e__|f\n", + "\n\n\n\n\n\n\n\n\n" + + "\n\n\n\n\n\n\n
abc
def
\n", + + "a|b|c|d\n:--|--:|:-:|---\ne|f|g|h\n", + "\n\n\n\n\n" + + "\n\n\n\n\n" + + "\n\n\n\n" + + "\n\n\n\n
abcd
efgh
\n", + + "a|b|c\n---|---|---\n", + "\n\n\n\n\n\n\n\n\n\n\n
abc
\n", + + "a| b|c | d | e\n---|---|---|---|---\nf| g|h | i |j\n", + "\n\n\n\n\n\n\n\n\n\n\n" + + "\n\n\n\n\n\n\n\n\n
abcde
fghij
\n", + + "a|b\\|c|d\n---|---|---\nf|g\\|h|i\n", + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ab|cd
fg|hi
\n", + } + doTestsBlock(t, tests, EXTENSION_TABLES) +} + +func TestUnorderedListWith_EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK(t *testing.T) { + var tests = []string{ + "* Hello\n", + "
    \n
  • Hello
  • \n
\n", + + "* Yin\n* Yang\n", + "
    \n
  • Yin
  • \n
  • Yang
  • \n
\n", + + "* Ting\n* Bong\n* Goo\n", + "
    \n
  • Ting
  • \n
  • Bong
  • \n
  • Goo
  • \n
\n", + + "* Yin\n\n* Yang\n", + "
    \n
  • Yin

  • \n\n
  • Yang

  • \n
\n", + + "* Ting\n\n* Bong\n* Goo\n", + "
    \n
  • Ting

  • \n\n
  • Bong

  • \n\n
  • Goo

  • \n
\n", + + "+ Hello\n", + "
    \n
  • Hello
  • \n
\n", + + "+ Yin\n+ Yang\n", + "
    \n
  • Yin
  • \n
  • Yang
  • \n
\n", + + "+ Ting\n+ Bong\n+ Goo\n", + "
    \n
  • Ting
  • \n
  • Bong
  • \n
  • Goo
  • \n
\n", + + "+ Yin\n\n+ Yang\n", + "
    \n
  • Yin

  • \n\n
  • Yang

  • \n
\n", + + "+ Ting\n\n+ Bong\n+ Goo\n", + "
    \n
  • Ting

  • \n\n
  • Bong

  • \n\n
  • Goo

  • \n
\n", + + "- Hello\n", + "
    \n
  • Hello
  • \n
\n", + + "- Yin\n- Yang\n", + "
    \n
  • Yin
  • \n
  • Yang
  • \n
\n", + + "- Ting\n- Bong\n- Goo\n", + "
    \n
  • Ting
  • \n
  • Bong
  • \n
  • Goo
  • \n
\n", + + "- Yin\n\n- Yang\n", + "
    \n
  • Yin

  • \n\n
  • Yang

  • \n
\n", + + "- Ting\n\n- Bong\n- Goo\n", + "
    \n
  • Ting

  • \n\n
  • Bong

  • \n\n
  • Goo

  • \n
\n", + + "*Hello\n", + "

*Hello

\n", + + "* Hello \n", + "
    \n
  • Hello
  • \n
\n", + + "* Hello \n Next line \n", + "
    \n
  • Hello\nNext line
  • \n
\n", + + "Paragraph\n* No linebreak\n", + "

Paragraph

\n\n
    \n
  • No linebreak
  • \n
\n", + + "Paragraph\n\n* Linebreak\n", + "

Paragraph

\n\n
    \n
  • Linebreak
  • \n
\n", + + "* List\n * Nested list\n", + "
    \n
  • List\n\n
      \n
    • Nested list
    • \n
  • \n
\n", + + "* List\n\n * Nested list\n", + "
    \n
  • List

    \n\n
      \n
    • Nested list
    • \n
  • \n
\n", + + "* List\n Second line\n\n + Nested\n", + "
    \n
  • List\nSecond line

    \n\n
      \n
    • Nested
    • \n
  • \n
\n", + + "* List\n + Nested\n\n Continued\n", + "
    \n
  • List

    \n\n
      \n
    • Nested
    • \n
    \n\n

    Continued

  • \n
\n", + + "* List\n * shallow indent\n", + "
    \n
  • List\n\n
      \n
    • shallow indent
    • \n
  • \n
\n", + + "* List\n" + + " * shallow indent\n" + + " * part of second list\n" + + " * still second\n" + + " * almost there\n" + + " * third level\n", + "
    \n" + + "
  • List\n\n" + + "
      \n" + + "
    • shallow indent
    • \n" + + "
    • part of second list
    • \n" + + "
    • still second
    • \n" + + "
    • almost there\n\n" + + "
        \n" + + "
      • third level
      • \n" + + "
    • \n" + + "
  • \n" + + "
\n", + + "* List\n extra indent, same paragraph\n", + "
    \n
  • List\n extra indent, same paragraph
  • \n
\n", + + "* List\n\n code block\n", + "
    \n
  • List

    \n\n
    code block\n
  • \n
\n", + + "* List\n\n code block with spaces\n", + "
    \n
  • List

    \n\n
      code block with spaces\n
  • \n
\n", + + "* List\n\n * sublist\n\n normal text\n\n * another sublist\n", + "
    \n
  • List

    \n\n
      \n
    • sublist
    • \n
    \n\n

    normal text

    \n\n
      \n
    • another sublist
    • \n
  • \n
\n", + } + doTestsBlock(t, tests, EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK) +} + +func TestOrderedList_EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK(t *testing.T) { + var tests = []string{ + "1. Hello\n", + "
    \n
  1. Hello
  2. \n
\n", + + "1. Yin\n2. Yang\n", + "
    \n
  1. Yin
  2. \n
  3. Yang
  4. \n
\n", + + "1. Ting\n2. Bong\n3. Goo\n", + "
    \n
  1. Ting
  2. \n
  3. Bong
  4. \n
  5. Goo
  6. \n
\n", + + "1. Yin\n\n2. Yang\n", + "
    \n
  1. Yin

  2. \n\n
  3. Yang

  4. \n
\n", + + "1. Ting\n\n2. Bong\n3. Goo\n", + "
    \n
  1. Ting

  2. \n\n
  3. Bong

  4. \n\n
  5. Goo

  6. \n
\n", + + "1 Hello\n", + "

1 Hello

\n", + + "1.Hello\n", + "

1.Hello

\n", + + "1. Hello \n", + "
    \n
  1. Hello
  2. \n
\n", + + "1. Hello \n Next line \n", + "
    \n
  1. Hello\nNext line
  2. \n
\n", + + "Paragraph\n1. No linebreak\n", + "

Paragraph

\n\n
    \n
  1. No linebreak
  2. \n
\n", + + "Paragraph\n\n1. Linebreak\n", + "

Paragraph

\n\n
    \n
  1. Linebreak
  2. \n
\n", + + "1. List\n 1. Nested list\n", + "
    \n
  1. List\n\n
      \n
    1. Nested list
    2. \n
  2. \n
\n", + + "1. List\n\n 1. Nested list\n", + "
    \n
  1. List

    \n\n
      \n
    1. Nested list
    2. \n
  2. \n
\n", + + "1. List\n Second line\n\n 1. Nested\n", + "
    \n
  1. List\nSecond line

    \n\n
      \n
    1. Nested
    2. \n
  2. \n
\n", + + "1. List\n 1. Nested\n\n Continued\n", + "
    \n
  1. List

    \n\n
      \n
    1. Nested
    2. \n
    \n\n

    Continued

  2. \n
\n", + + "1. List\n 1. shallow indent\n", + "
    \n
  1. List\n\n
      \n
    1. shallow indent
    2. \n
  2. \n
\n", + + "1. List\n" + + " 1. shallow indent\n" + + " 2. part of second list\n" + + " 3. still second\n" + + " 4. almost there\n" + + " 1. third level\n", + "
    \n" + + "
  1. List\n\n" + + "
      \n" + + "
    1. shallow indent
    2. \n" + + "
    3. part of second list
    4. \n" + + "
    5. still second
    6. \n" + + "
    7. almost there\n\n" + + "
        \n" + + "
      1. third level
      2. \n" + + "
    8. \n" + + "
  2. \n" + + "
\n", + + "1. List\n extra indent, same paragraph\n", + "
    \n
  1. List\n extra indent, same paragraph
  2. \n
\n", + + "1. List\n\n code block\n", + "
    \n
  1. List

    \n\n
    code block\n
  2. \n
\n", + + "1. List\n\n code block with spaces\n", + "
    \n
  1. List

    \n\n
      code block with spaces\n
  2. \n
\n", + + "1. List\n * Mixted list\n", + "
    \n
  1. List\n\n
      \n
    • Mixted list
    • \n
  2. \n
\n", + + "1. List\n * Mixed list\n", + "
    \n
  1. List\n\n
      \n
    • Mixed list
    • \n
  2. \n
\n", + + "* Start with unordered\n 1. Ordered\n", + "
    \n
  • Start with unordered\n\n
      \n
    1. Ordered
    2. \n
  • \n
\n", + + "* Start with unordered\n 1. Ordered\n", + "
    \n
  • Start with unordered\n\n
      \n
    1. Ordered
    2. \n
  • \n
\n", + + "1. numbers\n1. are ignored\n", + "
    \n
  1. numbers
  2. \n
  3. are ignored
  4. \n
\n", + } + doTestsBlock(t, tests, EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK) +} + +func TestFencedCodeBlock_EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK(t *testing.T) { + var tests = []string{ + "``` go\nfunc foo() bool {\n\treturn true;\n}\n```\n", + "
func foo() bool {\n\treturn true;\n}\n
\n", + + "``` c\n/* special & char < > \" escaping */\n```\n", + "
/* special & char < > " escaping */\n
\n", + + "``` c\nno *inline* processing ~~of text~~\n```\n", + "
no *inline* processing ~~of text~~\n
\n", + + "```\nNo language\n```\n", + "
No language\n
\n", + + "``` {ocaml}\nlanguage in braces\n```\n", + "
language in braces\n
\n", + + "``` {ocaml} \nwith extra whitespace\n```\n", + "
with extra whitespace\n
\n", + + "```{ ocaml }\nwith extra whitespace\n```\n", + "
with extra whitespace\n
\n", + + "~ ~~ java\nWith whitespace\n~~~\n", + "

~ ~~ java\nWith whitespace\n~~~

\n", + + "~~\nonly two\n~~\n", + "

~~\nonly two\n~~

\n", + + "```` python\nextra\n````\n", + "
extra\n
\n", + + "~~~ perl\nthree to start, four to end\n~~~~\n", + "

~~~ perl\nthree to start, four to end\n~~~~

\n", + + "~~~~ perl\nfour to start, three to end\n~~~\n", + "

~~~~ perl\nfour to start, three to end\n~~~

\n", + + "~~~ bash\ntildes\n~~~\n", + "
tildes\n
\n", + + "``` lisp\nno ending\n", + "

``` lisp\nno ending

\n", + + "~~~ lisp\nend with language\n~~~ lisp\n", + "

~~~ lisp\nend with language\n~~~ lisp

\n", + + "```\nmismatched begin and end\n~~~\n", + "

```\nmismatched begin and end\n~~~

\n", + + "~~~\nmismatched begin and end\n```\n", + "

~~~\nmismatched begin and end\n```

\n", + + " ``` oz\nleading spaces\n```\n", + "
leading spaces\n
\n", + + " ``` oz\nleading spaces\n ```\n", + "
leading spaces\n
\n", + + " ``` oz\nleading spaces\n ```\n", + "
leading spaces\n
\n", + + "``` oz\nleading spaces\n ```\n", + "
leading spaces\n
\n", + + " ``` oz\nleading spaces\n ```\n", + "
``` oz\n
\n\n

leading spaces

\n\n
```\n
\n", + } + doTestsBlock(t, tests, EXTENSION_FENCED_CODE|EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK) +} + +func TestTitleBlock_EXTENSION_TITLEBLOCK(t *testing.T) { + var tests = []string{ + "% Some title\n" + + "% Another title line\n" + + "% Yep, more here too\n", + "

" + + "Some title\n" + + "Another title line\n" + + "Yep, more here too\n" + + "

", + } + doTestsBlock(t, tests, EXTENSION_TITLEBLOCK) +} + +func TestBlockComments(t *testing.T) { + var tests = []string{ + "Some text\n\n\n", + "

Some text

\n\n\n", + + "Some text\n\n\n", + "

Some text

\n\n\n", + + "Some text\n\n\n", + "

Some text

\n\n\n", + } + doTestsBlock(t, tests, 0) +} + +func TestCDATA(t *testing.T) { + var tests = []string{ + "Some text\n\n\n", + "

Some text

\n\n\n", + + "CDATA ]]\n\n\n", + "

CDATA ]]

\n\n\n", + + "CDATA >\n\n]]>\n", + "

CDATA >

\n\n]]>\n", + + "Lots of text\n\n\n", + "

Lots of text

\n\n\n", + + "]]>\n", + "]]>\n", + } + doTestsBlock(t, tests, 0) + doTestsBlock(t, []string{ + "``` html\n\n```\n", + "
<![CDATA[foo]]>\n
\n", + + "\n", + "\n", + + ` def func(): +> pass +]]> +`, + ` def func(): +> pass +]]> +`, + }, EXTENSION_FENCED_CODE) +} diff --git a/vendor/github.com/russross/blackfriday/html.go b/vendor/github.com/russross/blackfriday/html.go new file mode 100644 index 0000000000..74e67ee82b --- /dev/null +++ b/vendor/github.com/russross/blackfriday/html.go @@ -0,0 +1,949 @@ +// +// Blackfriday Markdown Processor +// Available at http://github.com/russross/blackfriday +// +// Copyright © 2011 Russ Ross . +// Distributed under the Simplified BSD License. +// See README.md for details. +// + +// +// +// HTML rendering backend +// +// + +package blackfriday + +import ( + "bytes" + "fmt" + "regexp" + "strconv" + "strings" +) + +// Html renderer configuration options. +const ( + HTML_SKIP_HTML = 1 << iota // skip preformatted HTML blocks + HTML_SKIP_STYLE // skip embedded + + + +

HTTP charset

+ + +
+ + +
 
+ + + + + +
+

The character encoding of a page can be set using the HTTP header charset declaration.

+

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

The only character encoding declaration for this HTML file is in the HTTP header, which sets the encoding to ISO 8859-15.

+
+
+
HTML5
+

the-input-byte-stream-001
Result summary & related tests
Detailed results for this test
Link to spec

+
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • +
  • The test is read from a server that supports HTTP.
+
+ + + + + + diff --git a/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html b/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html new file mode 100644 index 0000000000..26e5d8b4eb --- /dev/null +++ b/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html @@ -0,0 +1,48 @@ + + + + HTTP vs UTF-8 BOM + + + + + + + + + + + +

HTTP vs UTF-8 BOM

+ + +
+ + +
 
+ + + + + +
+

A character encoding set in the HTTP header has lower precedence than the UTF-8 signature.

+

The HTTP header attempts to set the character encoding to ISO 8859-15. The page starts with a UTF-8 signature.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

If the test is unsuccessful, the characters  should appear at the top of the page. These represent the bytes that make up the UTF-8 signature when encountered in the ISO 8859-15 encoding.

+
+
+
HTML5
+

the-input-byte-stream-034
Result summary & related tests
Detailed results for this test
Link to spec

+
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • +
  • The test is read from a server that supports HTTP.
+
+ + + + + + diff --git a/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html b/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html new file mode 100644 index 0000000000..2f07e95158 --- /dev/null +++ b/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html @@ -0,0 +1,49 @@ + + + + HTTP vs meta charset + + + + + + + + + + + +

HTTP vs meta charset

+ + +
+ + +
 
+ + + + + +
+

The HTTP header has a higher precedence than an encoding declaration in a meta charset attribute.

+

The HTTP header attempts to set the character encoding to ISO 8859-15. The page contains an encoding declaration in a meta charset attribute that attempts to set the character encoding to ISO 8859-1.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

+
+
+
HTML5
+

the-input-byte-stream-018
Result summary & related tests
Detailed results for this test
Link to spec

+
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • +
  • The test is read from a server that supports HTTP.
+
+ + + + + + diff --git a/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html b/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html new file mode 100644 index 0000000000..6853cddecc --- /dev/null +++ b/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html @@ -0,0 +1,49 @@ + + + + HTTP vs meta content + + + + + + + + + + + +

HTTP vs meta content

+ + +
+ + +
 
+ + + + + +
+

The HTTP header has a higher precedence than an encoding declaration in a meta content attribute.

+

The HTTP header attempts to set the character encoding to ISO 8859-15. The page contains an encoding declaration in a meta content attribute that attempts to set the character encoding to ISO 8859-1.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

+
+
+
HTML5
+

the-input-byte-stream-016
Result summary & related tests
Detailed results for this test
Link to spec

+
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • +
  • The test is read from a server that supports HTTP.
+
+ + + + + + diff --git a/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html b/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html new file mode 100644 index 0000000000..612e26c6c5 --- /dev/null +++ b/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html @@ -0,0 +1,47 @@ + + + + No encoding declaration + + + + + + + + + + + +

No encoding declaration

+ + +
+ + +
 
+ + + + + +
+

A page with no encoding information in HTTP, BOM, XML declaration or meta element will be treated as UTF-8.

+

The test on this page contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

+
+
+
HTML5
+

the-input-byte-stream-015
Result summary & related tests
Detailed results for this test
Link to spec

+
Assumptions:
  • The test is read from a server that supports HTTP.
+
+ + + + + + diff --git a/vendor/golang.org/x/net/html/charset/testdata/README b/vendor/golang.org/x/net/html/charset/testdata/README new file mode 100644 index 0000000000..38ef0f9f12 --- /dev/null +++ b/vendor/golang.org/x/net/html/charset/testdata/README @@ -0,0 +1,9 @@ +These test cases come from +http://www.w3.org/International/tests/repository/html5/the-input-byte-stream/results-basics + +Distributed under both the W3C Test Suite License +(http://www.w3.org/Consortium/Legal/2008/04-testsuite-license) +and the W3C 3-clause BSD License +(http://www.w3.org/Consortium/Legal/2008/03-bsd-license). +To contribute to a W3C Test Suite, see the policies and contribution +forms (http://www.w3.org/2004/10/27-testcases). diff --git a/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html b/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html new file mode 100644 index 0000000000..3abf7a9343 Binary files /dev/null and b/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html differ diff --git a/vendor/golang.org/x/net/html/charset/testdata/UTF-16LE-BOM.html b/vendor/golang.org/x/net/html/charset/testdata/UTF-16LE-BOM.html new file mode 100644 index 0000000000..76254c980c Binary files /dev/null and b/vendor/golang.org/x/net/html/charset/testdata/UTF-16LE-BOM.html differ diff --git a/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html b/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html new file mode 100644 index 0000000000..83de43338e --- /dev/null +++ b/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html @@ -0,0 +1,49 @@ + + + + UTF-8 BOM vs meta charset + + + + + + + + + + + +

UTF-8 BOM vs meta charset

+ + +
+ + +
 
+ + + + + +
+

A page with a UTF-8 BOM will be recognized as UTF-8 even if the meta charset attribute declares a different encoding.

+

The page contains an encoding declaration in a meta charset attribute that attempts to set the character encoding to ISO 8859-15, but the file starts with a UTF-8 signature.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

+
+
+
HTML5
+

the-input-byte-stream-038
Result summary & related tests
Detailed results for this test
Link to spec

+
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • +
  • The test is read from a server that supports HTTP.
+
+ + + + + + diff --git a/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html b/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html new file mode 100644 index 0000000000..501aac2d6a --- /dev/null +++ b/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html @@ -0,0 +1,48 @@ + + + + UTF-8 BOM vs meta content + + + + + + + + + + + +

UTF-8 BOM vs meta content

+ + +
+ + +
 
+ + + + + +
+

A page with a UTF-8 BOM will be recognized as UTF-8 even if the meta content attribute declares a different encoding.

+

The page contains an encoding declaration in a meta content attribute that attempts to set the character encoding to ISO 8859-15, but the file starts with a UTF-8 signature.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

+
+
+
HTML5
+

the-input-byte-stream-037
Result summary & related tests
Detailed results for this test
Link to spec

+
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • +
  • The test is read from a server that supports HTTP.
+
+ + + + + + diff --git a/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html b/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html new file mode 100644 index 0000000000..2d7d25aba1 --- /dev/null +++ b/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html @@ -0,0 +1,48 @@ + + + + meta charset attribute + + + + + + + + + + + +

meta charset attribute

+ + +
+ + +
 
+ + + + + +
+

The character encoding of the page can be set by a meta element with charset attribute.

+

The only character encoding declaration for this HTML file is in the charset attribute of the meta element, which declares the encoding to be ISO 8859-15.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

+
+
+
HTML5
+

the-input-byte-stream-009
Result summary & related tests
Detailed results for this test
Link to spec

+
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • +
  • The test is read from a server that supports HTTP.
+
+ + + + + + diff --git a/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html b/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html new file mode 100644 index 0000000000..1c3f228e7c --- /dev/null +++ b/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html @@ -0,0 +1,48 @@ + + + + meta content attribute + + + + + + + + + + + +

meta content attribute

+ + +
+ + +
 
+ + + + + +
+

The character encoding of the page can be set by a meta element with http-equiv and content attributes.

+

The only character encoding declaration for this HTML file is in the content attribute of the meta element, which declares the encoding to be ISO 8859-15.

The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

+
+
+
HTML5
+

the-input-byte-stream-007
Result summary & related tests
Detailed results for this test
Link to spec

+
Assumptions:
  • The default encoding for the browser you are testing is not set to ISO 8859-15.
  • +
  • The test is read from a server that supports HTTP.
+
+ + + + + + diff --git a/vendor/golang.org/x/net/html/const.go b/vendor/golang.org/x/net/html/const.go new file mode 100644 index 0000000000..52f651ff6d --- /dev/null +++ b/vendor/golang.org/x/net/html/const.go @@ -0,0 +1,102 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package html + +// Section 12.2.3.2 of the HTML5 specification says "The following elements +// have varying levels of special parsing rules". +// https://html.spec.whatwg.org/multipage/syntax.html#the-stack-of-open-elements +var isSpecialElementMap = map[string]bool{ + "address": true, + "applet": true, + "area": true, + "article": true, + "aside": true, + "base": true, + "basefont": true, + "bgsound": true, + "blockquote": true, + "body": true, + "br": true, + "button": true, + "caption": true, + "center": true, + "col": true, + "colgroup": true, + "dd": true, + "details": true, + "dir": true, + "div": true, + "dl": true, + "dt": true, + "embed": true, + "fieldset": true, + "figcaption": true, + "figure": true, + "footer": true, + "form": true, + "frame": true, + "frameset": true, + "h1": true, + "h2": true, + "h3": true, + "h4": true, + "h5": true, + "h6": true, + "head": true, + "header": true, + "hgroup": true, + "hr": true, + "html": true, + "iframe": true, + "img": true, + "input": true, + "isindex": true, + "li": true, + "link": true, + "listing": true, + "marquee": true, + "menu": true, + "meta": true, + "nav": true, + "noembed": true, + "noframes": true, + "noscript": true, + "object": true, + "ol": true, + "p": true, + "param": true, + "plaintext": true, + "pre": true, + "script": true, + "section": true, + "select": true, + "source": true, + "style": true, + "summary": true, + "table": true, + "tbody": true, + "td": true, + "template": true, + "textarea": true, + "tfoot": true, + "th": true, + "thead": true, + "title": true, + "tr": true, + "track": true, + "ul": true, + "wbr": true, + "xmp": true, +} + +func isSpecialElement(element *Node) bool { + switch element.Namespace { + case "", "html": + return isSpecialElementMap[element.Data] + case "svg": + return element.Data == "foreignObject" + } + return false +} diff --git a/vendor/golang.org/x/net/html/doc.go b/vendor/golang.org/x/net/html/doc.go new file mode 100644 index 0000000000..94f496874a --- /dev/null +++ b/vendor/golang.org/x/net/html/doc.go @@ -0,0 +1,106 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package html implements an HTML5-compliant tokenizer and parser. + +Tokenization is done by creating a Tokenizer for an io.Reader r. It is the +caller's responsibility to ensure that r provides UTF-8 encoded HTML. + + z := html.NewTokenizer(r) + +Given a Tokenizer z, the HTML is tokenized by repeatedly calling z.Next(), +which parses the next token and returns its type, or an error: + + for { + tt := z.Next() + if tt == html.ErrorToken { + // ... + return ... + } + // Process the current token. + } + +There are two APIs for retrieving the current token. The high-level API is to +call Token; the low-level API is to call Text or TagName / TagAttr. Both APIs +allow optionally calling Raw after Next but before Token, Text, TagName, or +TagAttr. In EBNF notation, the valid call sequence per token is: + + Next {Raw} [ Token | Text | TagName {TagAttr} ] + +Token returns an independent data structure that completely describes a token. +Entities (such as "<") are unescaped, tag names and attribute keys are +lower-cased, and attributes are collected into a []Attribute. For example: + + for { + if z.Next() == html.ErrorToken { + // Returning io.EOF indicates success. + return z.Err() + } + emitToken(z.Token()) + } + +The low-level API performs fewer allocations and copies, but the contents of +the []byte values returned by Text, TagName and TagAttr may change on the next +call to Next. For example, to extract an HTML page's anchor text: + + depth := 0 + for { + tt := z.Next() + switch tt { + case ErrorToken: + return z.Err() + case TextToken: + if depth > 0 { + // emitBytes should copy the []byte it receives, + // if it doesn't process it immediately. + emitBytes(z.Text()) + } + case StartTagToken, EndTagToken: + tn, _ := z.TagName() + if len(tn) == 1 && tn[0] == 'a' { + if tt == StartTagToken { + depth++ + } else { + depth-- + } + } + } + } + +Parsing is done by calling Parse with an io.Reader, which returns the root of +the parse tree (the document element) as a *Node. It is the caller's +responsibility to ensure that the Reader provides UTF-8 encoded HTML. For +example, to process each anchor node in depth-first order: + + doc, err := html.Parse(r) + if err != nil { + // ... + } + var f func(*html.Node) + f = func(n *html.Node) { + if n.Type == html.ElementNode && n.Data == "a" { + // Do something with n... + } + for c := n.FirstChild; c != nil; c = c.NextSibling { + f(c) + } + } + f(doc) + +The relevant specifications include: +https://html.spec.whatwg.org/multipage/syntax.html and +https://html.spec.whatwg.org/multipage/syntax.html#tokenization +*/ +package html // import "golang.org/x/net/html" + +// The tokenization algorithm implemented by this package is not a line-by-line +// transliteration of the relatively verbose state-machine in the WHATWG +// specification. A more direct approach is used instead, where the program +// counter implies the state, such as whether it is tokenizing a tag or a text +// node. Specification compliance is verified by checking expected and actual +// outputs over a test suite rather than aiming for algorithmic fidelity. + +// TODO(nigeltao): Does a DOM API belong in this package or a separate one? +// TODO(nigeltao): How does parsing interact with a JavaScript engine? diff --git a/vendor/golang.org/x/net/html/doctype.go b/vendor/golang.org/x/net/html/doctype.go new file mode 100644 index 0000000000..c484e5a94f --- /dev/null +++ b/vendor/golang.org/x/net/html/doctype.go @@ -0,0 +1,156 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package html + +import ( + "strings" +) + +// parseDoctype parses the data from a DoctypeToken into a name, +// public identifier, and system identifier. It returns a Node whose Type +// is DoctypeNode, whose Data is the name, and which has attributes +// named "system" and "public" for the two identifiers if they were present. +// quirks is whether the document should be parsed in "quirks mode". +func parseDoctype(s string) (n *Node, quirks bool) { + n = &Node{Type: DoctypeNode} + + // Find the name. + space := strings.IndexAny(s, whitespace) + if space == -1 { + space = len(s) + } + n.Data = s[:space] + // The comparison to "html" is case-sensitive. + if n.Data != "html" { + quirks = true + } + n.Data = strings.ToLower(n.Data) + s = strings.TrimLeft(s[space:], whitespace) + + if len(s) < 6 { + // It can't start with "PUBLIC" or "SYSTEM". + // Ignore the rest of the string. + return n, quirks || s != "" + } + + key := strings.ToLower(s[:6]) + s = s[6:] + for key == "public" || key == "system" { + s = strings.TrimLeft(s, whitespace) + if s == "" { + break + } + quote := s[0] + if quote != '"' && quote != '\'' { + break + } + s = s[1:] + q := strings.IndexRune(s, rune(quote)) + var id string + if q == -1 { + id = s + s = "" + } else { + id = s[:q] + s = s[q+1:] + } + n.Attr = append(n.Attr, Attribute{Key: key, Val: id}) + if key == "public" { + key = "system" + } else { + key = "" + } + } + + if key != "" || s != "" { + quirks = true + } else if len(n.Attr) > 0 { + if n.Attr[0].Key == "public" { + public := strings.ToLower(n.Attr[0].Val) + switch public { + case "-//w3o//dtd w3 html strict 3.0//en//", "-/w3d/dtd html 4.0 transitional/en", "html": + quirks = true + default: + for _, q := range quirkyIDs { + if strings.HasPrefix(public, q) { + quirks = true + break + } + } + } + // The following two public IDs only cause quirks mode if there is no system ID. + if len(n.Attr) == 1 && (strings.HasPrefix(public, "-//w3c//dtd html 4.01 frameset//") || + strings.HasPrefix(public, "-//w3c//dtd html 4.01 transitional//")) { + quirks = true + } + } + if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && + strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { + quirks = true + } + } + + return n, quirks +} + +// quirkyIDs is a list of public doctype identifiers that cause a document +// to be interpreted in quirks mode. The identifiers should be in lower case. +var quirkyIDs = []string{ + "+//silmaril//dtd html pro v0r11 19970101//", + "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", + "-//as//dtd html 3.0 aswedit + extensions//", + "-//ietf//dtd html 2.0 level 1//", + "-//ietf//dtd html 2.0 level 2//", + "-//ietf//dtd html 2.0 strict level 1//", + "-//ietf//dtd html 2.0 strict level 2//", + "-//ietf//dtd html 2.0 strict//", + "-//ietf//dtd html 2.0//", + "-//ietf//dtd html 2.1e//", + "-//ietf//dtd html 3.0//", + "-//ietf//dtd html 3.2 final//", + "-//ietf//dtd html 3.2//", + "-//ietf//dtd html 3//", + "-//ietf//dtd html level 0//", + "-//ietf//dtd html level 1//", + "-//ietf//dtd html level 2//", + "-//ietf//dtd html level 3//", + "-//ietf//dtd html strict level 0//", + "-//ietf//dtd html strict level 1//", + "-//ietf//dtd html strict level 2//", + "-//ietf//dtd html strict level 3//", + "-//ietf//dtd html strict//", + "-//ietf//dtd html//", + "-//metrius//dtd metrius presentational//", + "-//microsoft//dtd internet explorer 2.0 html strict//", + "-//microsoft//dtd internet explorer 2.0 html//", + "-//microsoft//dtd internet explorer 2.0 tables//", + "-//microsoft//dtd internet explorer 3.0 html strict//", + "-//microsoft//dtd internet explorer 3.0 html//", + "-//microsoft//dtd internet explorer 3.0 tables//", + "-//netscape comm. corp.//dtd html//", + "-//netscape comm. corp.//dtd strict html//", + "-//o'reilly and associates//dtd html 2.0//", + "-//o'reilly and associates//dtd html extended 1.0//", + "-//o'reilly and associates//dtd html extended relaxed 1.0//", + "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", + "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", + "-//spyglass//dtd html 2.0 extended//", + "-//sq//dtd html 2.0 hotmetal + extensions//", + "-//sun microsystems corp.//dtd hotjava html//", + "-//sun microsystems corp.//dtd hotjava strict html//", + "-//w3c//dtd html 3 1995-03-24//", + "-//w3c//dtd html 3.2 draft//", + "-//w3c//dtd html 3.2 final//", + "-//w3c//dtd html 3.2//", + "-//w3c//dtd html 3.2s draft//", + "-//w3c//dtd html 4.0 frameset//", + "-//w3c//dtd html 4.0 transitional//", + "-//w3c//dtd html experimental 19960712//", + "-//w3c//dtd html experimental 970421//", + "-//w3c//dtd w3 html//", + "-//w3o//dtd w3 html 3.0//", + "-//webtechs//dtd mozilla html 2.0//", + "-//webtechs//dtd mozilla html//", +} diff --git a/vendor/golang.org/x/net/html/entity.go b/vendor/golang.org/x/net/html/entity.go new file mode 100644 index 0000000000..a50c04c60e --- /dev/null +++ b/vendor/golang.org/x/net/html/entity.go @@ -0,0 +1,2253 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package html + +// All entities that do not end with ';' are 6 or fewer bytes long. +const longestEntityWithoutSemicolon = 6 + +// entity is a map from HTML entity names to their values. The semicolon matters: +// https://html.spec.whatwg.org/multipage/syntax.html#named-character-references +// lists both "amp" and "amp;" as two separate entries. +// +// Note that the HTML5 list is larger than the HTML4 list at +// http://www.w3.org/TR/html4/sgml/entities.html +var entity = map[string]rune{ + "AElig;": '\U000000C6', + "AMP;": '\U00000026', + "Aacute;": '\U000000C1', + "Abreve;": '\U00000102', + "Acirc;": '\U000000C2', + "Acy;": '\U00000410', + "Afr;": '\U0001D504', + "Agrave;": '\U000000C0', + "Alpha;": '\U00000391', + "Amacr;": '\U00000100', + "And;": '\U00002A53', + "Aogon;": '\U00000104', + "Aopf;": '\U0001D538', + "ApplyFunction;": '\U00002061', + "Aring;": '\U000000C5', + "Ascr;": '\U0001D49C', + "Assign;": '\U00002254', + "Atilde;": '\U000000C3', + "Auml;": '\U000000C4', + "Backslash;": '\U00002216', + "Barv;": '\U00002AE7', + "Barwed;": '\U00002306', + "Bcy;": '\U00000411', + "Because;": '\U00002235', + "Bernoullis;": '\U0000212C', + "Beta;": '\U00000392', + "Bfr;": '\U0001D505', + "Bopf;": '\U0001D539', + "Breve;": '\U000002D8', + "Bscr;": '\U0000212C', + "Bumpeq;": '\U0000224E', + "CHcy;": '\U00000427', + "COPY;": '\U000000A9', + "Cacute;": '\U00000106', + "Cap;": '\U000022D2', + "CapitalDifferentialD;": '\U00002145', + "Cayleys;": '\U0000212D', + "Ccaron;": '\U0000010C', + "Ccedil;": '\U000000C7', + "Ccirc;": '\U00000108', + "Cconint;": '\U00002230', + "Cdot;": '\U0000010A', + "Cedilla;": '\U000000B8', + "CenterDot;": '\U000000B7', + "Cfr;": '\U0000212D', + "Chi;": '\U000003A7', + "CircleDot;": '\U00002299', + "CircleMinus;": '\U00002296', + "CirclePlus;": '\U00002295', + "CircleTimes;": '\U00002297', + "ClockwiseContourIntegral;": '\U00002232', + "CloseCurlyDoubleQuote;": '\U0000201D', + "CloseCurlyQuote;": '\U00002019', + "Colon;": '\U00002237', + "Colone;": '\U00002A74', + "Congruent;": '\U00002261', + "Conint;": '\U0000222F', + "ContourIntegral;": '\U0000222E', + "Copf;": '\U00002102', + "Coproduct;": '\U00002210', + "CounterClockwiseContourIntegral;": '\U00002233', + "Cross;": '\U00002A2F', + "Cscr;": '\U0001D49E', + "Cup;": '\U000022D3', + "CupCap;": '\U0000224D', + "DD;": '\U00002145', + "DDotrahd;": '\U00002911', + "DJcy;": '\U00000402', + "DScy;": '\U00000405', + "DZcy;": '\U0000040F', + "Dagger;": '\U00002021', + "Darr;": '\U000021A1', + "Dashv;": '\U00002AE4', + "Dcaron;": '\U0000010E', + "Dcy;": '\U00000414', + "Del;": '\U00002207', + "Delta;": '\U00000394', + "Dfr;": '\U0001D507', + "DiacriticalAcute;": '\U000000B4', + "DiacriticalDot;": '\U000002D9', + "DiacriticalDoubleAcute;": '\U000002DD', + "DiacriticalGrave;": '\U00000060', + "DiacriticalTilde;": '\U000002DC', + "Diamond;": '\U000022C4', + "DifferentialD;": '\U00002146', + "Dopf;": '\U0001D53B', + "Dot;": '\U000000A8', + "DotDot;": '\U000020DC', + "DotEqual;": '\U00002250', + "DoubleContourIntegral;": '\U0000222F', + "DoubleDot;": '\U000000A8', + "DoubleDownArrow;": '\U000021D3', + "DoubleLeftArrow;": '\U000021D0', + "DoubleLeftRightArrow;": '\U000021D4', + "DoubleLeftTee;": '\U00002AE4', + "DoubleLongLeftArrow;": '\U000027F8', + "DoubleLongLeftRightArrow;": '\U000027FA', + "DoubleLongRightArrow;": '\U000027F9', + "DoubleRightArrow;": '\U000021D2', + "DoubleRightTee;": '\U000022A8', + "DoubleUpArrow;": '\U000021D1', + "DoubleUpDownArrow;": '\U000021D5', + "DoubleVerticalBar;": '\U00002225', + "DownArrow;": '\U00002193', + "DownArrowBar;": '\U00002913', + "DownArrowUpArrow;": '\U000021F5', + "DownBreve;": '\U00000311', + "DownLeftRightVector;": '\U00002950', + "DownLeftTeeVector;": '\U0000295E', + "DownLeftVector;": '\U000021BD', + "DownLeftVectorBar;": '\U00002956', + "DownRightTeeVector;": '\U0000295F', + "DownRightVector;": '\U000021C1', + "DownRightVectorBar;": '\U00002957', + "DownTee;": '\U000022A4', + "DownTeeArrow;": '\U000021A7', + "Downarrow;": '\U000021D3', + "Dscr;": '\U0001D49F', + "Dstrok;": '\U00000110', + "ENG;": '\U0000014A', + "ETH;": '\U000000D0', + "Eacute;": '\U000000C9', + "Ecaron;": '\U0000011A', + "Ecirc;": '\U000000CA', + "Ecy;": '\U0000042D', + "Edot;": '\U00000116', + "Efr;": '\U0001D508', + "Egrave;": '\U000000C8', + "Element;": '\U00002208', + "Emacr;": '\U00000112', + "EmptySmallSquare;": '\U000025FB', + "EmptyVerySmallSquare;": '\U000025AB', + "Eogon;": '\U00000118', + "Eopf;": '\U0001D53C', + "Epsilon;": '\U00000395', + "Equal;": '\U00002A75', + "EqualTilde;": '\U00002242', + "Equilibrium;": '\U000021CC', + "Escr;": '\U00002130', + "Esim;": '\U00002A73', + "Eta;": '\U00000397', + "Euml;": '\U000000CB', + "Exists;": '\U00002203', + "ExponentialE;": '\U00002147', + "Fcy;": '\U00000424', + "Ffr;": '\U0001D509', + "FilledSmallSquare;": '\U000025FC', + "FilledVerySmallSquare;": '\U000025AA', + "Fopf;": '\U0001D53D', + "ForAll;": '\U00002200', + "Fouriertrf;": '\U00002131', + "Fscr;": '\U00002131', + "GJcy;": '\U00000403', + "GT;": '\U0000003E', + "Gamma;": '\U00000393', + "Gammad;": '\U000003DC', + "Gbreve;": '\U0000011E', + "Gcedil;": '\U00000122', + "Gcirc;": '\U0000011C', + "Gcy;": '\U00000413', + "Gdot;": '\U00000120', + "Gfr;": '\U0001D50A', + "Gg;": '\U000022D9', + "Gopf;": '\U0001D53E', + "GreaterEqual;": '\U00002265', + "GreaterEqualLess;": '\U000022DB', + "GreaterFullEqual;": '\U00002267', + "GreaterGreater;": '\U00002AA2', + "GreaterLess;": '\U00002277', + "GreaterSlantEqual;": '\U00002A7E', + "GreaterTilde;": '\U00002273', + "Gscr;": '\U0001D4A2', + "Gt;": '\U0000226B', + "HARDcy;": '\U0000042A', + "Hacek;": '\U000002C7', + "Hat;": '\U0000005E', + "Hcirc;": '\U00000124', + "Hfr;": '\U0000210C', + "HilbertSpace;": '\U0000210B', + "Hopf;": '\U0000210D', + "HorizontalLine;": '\U00002500', + "Hscr;": '\U0000210B', + "Hstrok;": '\U00000126', + "HumpDownHump;": '\U0000224E', + "HumpEqual;": '\U0000224F', + "IEcy;": '\U00000415', + "IJlig;": '\U00000132', + "IOcy;": '\U00000401', + "Iacute;": '\U000000CD', + "Icirc;": '\U000000CE', + "Icy;": '\U00000418', + "Idot;": '\U00000130', + "Ifr;": '\U00002111', + "Igrave;": '\U000000CC', + "Im;": '\U00002111', + "Imacr;": '\U0000012A', + "ImaginaryI;": '\U00002148', + "Implies;": '\U000021D2', + "Int;": '\U0000222C', + "Integral;": '\U0000222B', + "Intersection;": '\U000022C2', + "InvisibleComma;": '\U00002063', + "InvisibleTimes;": '\U00002062', + "Iogon;": '\U0000012E', + "Iopf;": '\U0001D540', + "Iota;": '\U00000399', + "Iscr;": '\U00002110', + "Itilde;": '\U00000128', + "Iukcy;": '\U00000406', + "Iuml;": '\U000000CF', + "Jcirc;": '\U00000134', + "Jcy;": '\U00000419', + "Jfr;": '\U0001D50D', + "Jopf;": '\U0001D541', + "Jscr;": '\U0001D4A5', + "Jsercy;": '\U00000408', + "Jukcy;": '\U00000404', + "KHcy;": '\U00000425', + "KJcy;": '\U0000040C', + "Kappa;": '\U0000039A', + "Kcedil;": '\U00000136', + "Kcy;": '\U0000041A', + "Kfr;": '\U0001D50E', + "Kopf;": '\U0001D542', + "Kscr;": '\U0001D4A6', + "LJcy;": '\U00000409', + "LT;": '\U0000003C', + "Lacute;": '\U00000139', + "Lambda;": '\U0000039B', + "Lang;": '\U000027EA', + "Laplacetrf;": '\U00002112', + "Larr;": '\U0000219E', + "Lcaron;": '\U0000013D', + "Lcedil;": '\U0000013B', + "Lcy;": '\U0000041B', + "LeftAngleBracket;": '\U000027E8', + "LeftArrow;": '\U00002190', + "LeftArrowBar;": '\U000021E4', + "LeftArrowRightArrow;": '\U000021C6', + "LeftCeiling;": '\U00002308', + "LeftDoubleBracket;": '\U000027E6', + "LeftDownTeeVector;": '\U00002961', + "LeftDownVector;": '\U000021C3', + "LeftDownVectorBar;": '\U00002959', + "LeftFloor;": '\U0000230A', + "LeftRightArrow;": '\U00002194', + "LeftRightVector;": '\U0000294E', + "LeftTee;": '\U000022A3', + "LeftTeeArrow;": '\U000021A4', + "LeftTeeVector;": '\U0000295A', + "LeftTriangle;": '\U000022B2', + "LeftTriangleBar;": '\U000029CF', + "LeftTriangleEqual;": '\U000022B4', + "LeftUpDownVector;": '\U00002951', + "LeftUpTeeVector;": '\U00002960', + "LeftUpVector;": '\U000021BF', + "LeftUpVectorBar;": '\U00002958', + "LeftVector;": '\U000021BC', + "LeftVectorBar;": '\U00002952', + "Leftarrow;": '\U000021D0', + "Leftrightarrow;": '\U000021D4', + "LessEqualGreater;": '\U000022DA', + "LessFullEqual;": '\U00002266', + "LessGreater;": '\U00002276', + "LessLess;": '\U00002AA1', + "LessSlantEqual;": '\U00002A7D', + "LessTilde;": '\U00002272', + "Lfr;": '\U0001D50F', + "Ll;": '\U000022D8', + "Lleftarrow;": '\U000021DA', + "Lmidot;": '\U0000013F', + "LongLeftArrow;": '\U000027F5', + "LongLeftRightArrow;": '\U000027F7', + "LongRightArrow;": '\U000027F6', + "Longleftarrow;": '\U000027F8', + "Longleftrightarrow;": '\U000027FA', + "Longrightarrow;": '\U000027F9', + "Lopf;": '\U0001D543', + "LowerLeftArrow;": '\U00002199', + "LowerRightArrow;": '\U00002198', + "Lscr;": '\U00002112', + "Lsh;": '\U000021B0', + "Lstrok;": '\U00000141', + "Lt;": '\U0000226A', + "Map;": '\U00002905', + "Mcy;": '\U0000041C', + "MediumSpace;": '\U0000205F', + "Mellintrf;": '\U00002133', + "Mfr;": '\U0001D510', + "MinusPlus;": '\U00002213', + "Mopf;": '\U0001D544', + "Mscr;": '\U00002133', + "Mu;": '\U0000039C', + "NJcy;": '\U0000040A', + "Nacute;": '\U00000143', + "Ncaron;": '\U00000147', + "Ncedil;": '\U00000145', + "Ncy;": '\U0000041D', + "NegativeMediumSpace;": '\U0000200B', + "NegativeThickSpace;": '\U0000200B', + "NegativeThinSpace;": '\U0000200B', + "NegativeVeryThinSpace;": '\U0000200B', + "NestedGreaterGreater;": '\U0000226B', + "NestedLessLess;": '\U0000226A', + "NewLine;": '\U0000000A', + "Nfr;": '\U0001D511', + "NoBreak;": '\U00002060', + "NonBreakingSpace;": '\U000000A0', + "Nopf;": '\U00002115', + "Not;": '\U00002AEC', + "NotCongruent;": '\U00002262', + "NotCupCap;": '\U0000226D', + "NotDoubleVerticalBar;": '\U00002226', + "NotElement;": '\U00002209', + "NotEqual;": '\U00002260', + "NotExists;": '\U00002204', + "NotGreater;": '\U0000226F', + "NotGreaterEqual;": '\U00002271', + "NotGreaterLess;": '\U00002279', + "NotGreaterTilde;": '\U00002275', + "NotLeftTriangle;": '\U000022EA', + "NotLeftTriangleEqual;": '\U000022EC', + "NotLess;": '\U0000226E', + "NotLessEqual;": '\U00002270', + "NotLessGreater;": '\U00002278', + "NotLessTilde;": '\U00002274', + "NotPrecedes;": '\U00002280', + "NotPrecedesSlantEqual;": '\U000022E0', + "NotReverseElement;": '\U0000220C', + "NotRightTriangle;": '\U000022EB', + "NotRightTriangleEqual;": '\U000022ED', + "NotSquareSubsetEqual;": '\U000022E2', + "NotSquareSupersetEqual;": '\U000022E3', + "NotSubsetEqual;": '\U00002288', + "NotSucceeds;": '\U00002281', + "NotSucceedsSlantEqual;": '\U000022E1', + "NotSupersetEqual;": '\U00002289', + "NotTilde;": '\U00002241', + "NotTildeEqual;": '\U00002244', + "NotTildeFullEqual;": '\U00002247', + "NotTildeTilde;": '\U00002249', + "NotVerticalBar;": '\U00002224', + "Nscr;": '\U0001D4A9', + "Ntilde;": '\U000000D1', + "Nu;": '\U0000039D', + "OElig;": '\U00000152', + "Oacute;": '\U000000D3', + "Ocirc;": '\U000000D4', + "Ocy;": '\U0000041E', + "Odblac;": '\U00000150', + "Ofr;": '\U0001D512', + "Ograve;": '\U000000D2', + "Omacr;": '\U0000014C', + "Omega;": '\U000003A9', + "Omicron;": '\U0000039F', + "Oopf;": '\U0001D546', + "OpenCurlyDoubleQuote;": '\U0000201C', + "OpenCurlyQuote;": '\U00002018', + "Or;": '\U00002A54', + "Oscr;": '\U0001D4AA', + "Oslash;": '\U000000D8', + "Otilde;": '\U000000D5', + "Otimes;": '\U00002A37', + "Ouml;": '\U000000D6', + "OverBar;": '\U0000203E', + "OverBrace;": '\U000023DE', + "OverBracket;": '\U000023B4', + "OverParenthesis;": '\U000023DC', + "PartialD;": '\U00002202', + "Pcy;": '\U0000041F', + "Pfr;": '\U0001D513', + "Phi;": '\U000003A6', + "Pi;": '\U000003A0', + "PlusMinus;": '\U000000B1', + "Poincareplane;": '\U0000210C', + "Popf;": '\U00002119', + "Pr;": '\U00002ABB', + "Precedes;": '\U0000227A', + "PrecedesEqual;": '\U00002AAF', + "PrecedesSlantEqual;": '\U0000227C', + "PrecedesTilde;": '\U0000227E', + "Prime;": '\U00002033', + "Product;": '\U0000220F', + "Proportion;": '\U00002237', + "Proportional;": '\U0000221D', + "Pscr;": '\U0001D4AB', + "Psi;": '\U000003A8', + "QUOT;": '\U00000022', + "Qfr;": '\U0001D514', + "Qopf;": '\U0000211A', + "Qscr;": '\U0001D4AC', + "RBarr;": '\U00002910', + "REG;": '\U000000AE', + "Racute;": '\U00000154', + "Rang;": '\U000027EB', + "Rarr;": '\U000021A0', + "Rarrtl;": '\U00002916', + "Rcaron;": '\U00000158', + "Rcedil;": '\U00000156', + "Rcy;": '\U00000420', + "Re;": '\U0000211C', + "ReverseElement;": '\U0000220B', + "ReverseEquilibrium;": '\U000021CB', + "ReverseUpEquilibrium;": '\U0000296F', + "Rfr;": '\U0000211C', + "Rho;": '\U000003A1', + "RightAngleBracket;": '\U000027E9', + "RightArrow;": '\U00002192', + "RightArrowBar;": '\U000021E5', + "RightArrowLeftArrow;": '\U000021C4', + "RightCeiling;": '\U00002309', + "RightDoubleBracket;": '\U000027E7', + "RightDownTeeVector;": '\U0000295D', + "RightDownVector;": '\U000021C2', + "RightDownVectorBar;": '\U00002955', + "RightFloor;": '\U0000230B', + "RightTee;": '\U000022A2', + "RightTeeArrow;": '\U000021A6', + "RightTeeVector;": '\U0000295B', + "RightTriangle;": '\U000022B3', + "RightTriangleBar;": '\U000029D0', + "RightTriangleEqual;": '\U000022B5', + "RightUpDownVector;": '\U0000294F', + "RightUpTeeVector;": '\U0000295C', + "RightUpVector;": '\U000021BE', + "RightUpVectorBar;": '\U00002954', + "RightVector;": '\U000021C0', + "RightVectorBar;": '\U00002953', + "Rightarrow;": '\U000021D2', + "Ropf;": '\U0000211D', + "RoundImplies;": '\U00002970', + "Rrightarrow;": '\U000021DB', + "Rscr;": '\U0000211B', + "Rsh;": '\U000021B1', + "RuleDelayed;": '\U000029F4', + "SHCHcy;": '\U00000429', + "SHcy;": '\U00000428', + "SOFTcy;": '\U0000042C', + "Sacute;": '\U0000015A', + "Sc;": '\U00002ABC', + "Scaron;": '\U00000160', + "Scedil;": '\U0000015E', + "Scirc;": '\U0000015C', + "Scy;": '\U00000421', + "Sfr;": '\U0001D516', + "ShortDownArrow;": '\U00002193', + "ShortLeftArrow;": '\U00002190', + "ShortRightArrow;": '\U00002192', + "ShortUpArrow;": '\U00002191', + "Sigma;": '\U000003A3', + "SmallCircle;": '\U00002218', + "Sopf;": '\U0001D54A', + "Sqrt;": '\U0000221A', + "Square;": '\U000025A1', + "SquareIntersection;": '\U00002293', + "SquareSubset;": '\U0000228F', + "SquareSubsetEqual;": '\U00002291', + "SquareSuperset;": '\U00002290', + "SquareSupersetEqual;": '\U00002292', + "SquareUnion;": '\U00002294', + "Sscr;": '\U0001D4AE', + "Star;": '\U000022C6', + "Sub;": '\U000022D0', + "Subset;": '\U000022D0', + "SubsetEqual;": '\U00002286', + "Succeeds;": '\U0000227B', + "SucceedsEqual;": '\U00002AB0', + "SucceedsSlantEqual;": '\U0000227D', + "SucceedsTilde;": '\U0000227F', + "SuchThat;": '\U0000220B', + "Sum;": '\U00002211', + "Sup;": '\U000022D1', + "Superset;": '\U00002283', + "SupersetEqual;": '\U00002287', + "Supset;": '\U000022D1', + "THORN;": '\U000000DE', + "TRADE;": '\U00002122', + "TSHcy;": '\U0000040B', + "TScy;": '\U00000426', + "Tab;": '\U00000009', + "Tau;": '\U000003A4', + "Tcaron;": '\U00000164', + "Tcedil;": '\U00000162', + "Tcy;": '\U00000422', + "Tfr;": '\U0001D517', + "Therefore;": '\U00002234', + "Theta;": '\U00000398', + "ThinSpace;": '\U00002009', + "Tilde;": '\U0000223C', + "TildeEqual;": '\U00002243', + "TildeFullEqual;": '\U00002245', + "TildeTilde;": '\U00002248', + "Topf;": '\U0001D54B', + "TripleDot;": '\U000020DB', + "Tscr;": '\U0001D4AF', + "Tstrok;": '\U00000166', + "Uacute;": '\U000000DA', + "Uarr;": '\U0000219F', + "Uarrocir;": '\U00002949', + "Ubrcy;": '\U0000040E', + "Ubreve;": '\U0000016C', + "Ucirc;": '\U000000DB', + "Ucy;": '\U00000423', + "Udblac;": '\U00000170', + "Ufr;": '\U0001D518', + "Ugrave;": '\U000000D9', + "Umacr;": '\U0000016A', + "UnderBar;": '\U0000005F', + "UnderBrace;": '\U000023DF', + "UnderBracket;": '\U000023B5', + "UnderParenthesis;": '\U000023DD', + "Union;": '\U000022C3', + "UnionPlus;": '\U0000228E', + "Uogon;": '\U00000172', + "Uopf;": '\U0001D54C', + "UpArrow;": '\U00002191', + "UpArrowBar;": '\U00002912', + "UpArrowDownArrow;": '\U000021C5', + "UpDownArrow;": '\U00002195', + "UpEquilibrium;": '\U0000296E', + "UpTee;": '\U000022A5', + "UpTeeArrow;": '\U000021A5', + "Uparrow;": '\U000021D1', + "Updownarrow;": '\U000021D5', + "UpperLeftArrow;": '\U00002196', + "UpperRightArrow;": '\U00002197', + "Upsi;": '\U000003D2', + "Upsilon;": '\U000003A5', + "Uring;": '\U0000016E', + "Uscr;": '\U0001D4B0', + "Utilde;": '\U00000168', + "Uuml;": '\U000000DC', + "VDash;": '\U000022AB', + "Vbar;": '\U00002AEB', + "Vcy;": '\U00000412', + "Vdash;": '\U000022A9', + "Vdashl;": '\U00002AE6', + "Vee;": '\U000022C1', + "Verbar;": '\U00002016', + "Vert;": '\U00002016', + "VerticalBar;": '\U00002223', + "VerticalLine;": '\U0000007C', + "VerticalSeparator;": '\U00002758', + "VerticalTilde;": '\U00002240', + "VeryThinSpace;": '\U0000200A', + "Vfr;": '\U0001D519', + "Vopf;": '\U0001D54D', + "Vscr;": '\U0001D4B1', + "Vvdash;": '\U000022AA', + "Wcirc;": '\U00000174', + "Wedge;": '\U000022C0', + "Wfr;": '\U0001D51A', + "Wopf;": '\U0001D54E', + "Wscr;": '\U0001D4B2', + "Xfr;": '\U0001D51B', + "Xi;": '\U0000039E', + "Xopf;": '\U0001D54F', + "Xscr;": '\U0001D4B3', + "YAcy;": '\U0000042F', + "YIcy;": '\U00000407', + "YUcy;": '\U0000042E', + "Yacute;": '\U000000DD', + "Ycirc;": '\U00000176', + "Ycy;": '\U0000042B', + "Yfr;": '\U0001D51C', + "Yopf;": '\U0001D550', + "Yscr;": '\U0001D4B4', + "Yuml;": '\U00000178', + "ZHcy;": '\U00000416', + "Zacute;": '\U00000179', + "Zcaron;": '\U0000017D', + "Zcy;": '\U00000417', + "Zdot;": '\U0000017B', + "ZeroWidthSpace;": '\U0000200B', + "Zeta;": '\U00000396', + "Zfr;": '\U00002128', + "Zopf;": '\U00002124', + "Zscr;": '\U0001D4B5', + "aacute;": '\U000000E1', + "abreve;": '\U00000103', + "ac;": '\U0000223E', + "acd;": '\U0000223F', + "acirc;": '\U000000E2', + "acute;": '\U000000B4', + "acy;": '\U00000430', + "aelig;": '\U000000E6', + "af;": '\U00002061', + "afr;": '\U0001D51E', + "agrave;": '\U000000E0', + "alefsym;": '\U00002135', + "aleph;": '\U00002135', + "alpha;": '\U000003B1', + "amacr;": '\U00000101', + "amalg;": '\U00002A3F', + "amp;": '\U00000026', + "and;": '\U00002227', + "andand;": '\U00002A55', + "andd;": '\U00002A5C', + "andslope;": '\U00002A58', + "andv;": '\U00002A5A', + "ang;": '\U00002220', + "ange;": '\U000029A4', + "angle;": '\U00002220', + "angmsd;": '\U00002221', + "angmsdaa;": '\U000029A8', + "angmsdab;": '\U000029A9', + "angmsdac;": '\U000029AA', + "angmsdad;": '\U000029AB', + "angmsdae;": '\U000029AC', + "angmsdaf;": '\U000029AD', + "angmsdag;": '\U000029AE', + "angmsdah;": '\U000029AF', + "angrt;": '\U0000221F', + "angrtvb;": '\U000022BE', + "angrtvbd;": '\U0000299D', + "angsph;": '\U00002222', + "angst;": '\U000000C5', + "angzarr;": '\U0000237C', + "aogon;": '\U00000105', + "aopf;": '\U0001D552', + "ap;": '\U00002248', + "apE;": '\U00002A70', + "apacir;": '\U00002A6F', + "ape;": '\U0000224A', + "apid;": '\U0000224B', + "apos;": '\U00000027', + "approx;": '\U00002248', + "approxeq;": '\U0000224A', + "aring;": '\U000000E5', + "ascr;": '\U0001D4B6', + "ast;": '\U0000002A', + "asymp;": '\U00002248', + "asympeq;": '\U0000224D', + "atilde;": '\U000000E3', + "auml;": '\U000000E4', + "awconint;": '\U00002233', + "awint;": '\U00002A11', + "bNot;": '\U00002AED', + "backcong;": '\U0000224C', + "backepsilon;": '\U000003F6', + "backprime;": '\U00002035', + "backsim;": '\U0000223D', + "backsimeq;": '\U000022CD', + "barvee;": '\U000022BD', + "barwed;": '\U00002305', + "barwedge;": '\U00002305', + "bbrk;": '\U000023B5', + "bbrktbrk;": '\U000023B6', + "bcong;": '\U0000224C', + "bcy;": '\U00000431', + "bdquo;": '\U0000201E', + "becaus;": '\U00002235', + "because;": '\U00002235', + "bemptyv;": '\U000029B0', + "bepsi;": '\U000003F6', + "bernou;": '\U0000212C', + "beta;": '\U000003B2', + "beth;": '\U00002136', + "between;": '\U0000226C', + "bfr;": '\U0001D51F', + "bigcap;": '\U000022C2', + "bigcirc;": '\U000025EF', + "bigcup;": '\U000022C3', + "bigodot;": '\U00002A00', + "bigoplus;": '\U00002A01', + "bigotimes;": '\U00002A02', + "bigsqcup;": '\U00002A06', + "bigstar;": '\U00002605', + "bigtriangledown;": '\U000025BD', + "bigtriangleup;": '\U000025B3', + "biguplus;": '\U00002A04', + "bigvee;": '\U000022C1', + "bigwedge;": '\U000022C0', + "bkarow;": '\U0000290D', + "blacklozenge;": '\U000029EB', + "blacksquare;": '\U000025AA', + "blacktriangle;": '\U000025B4', + "blacktriangledown;": '\U000025BE', + "blacktriangleleft;": '\U000025C2', + "blacktriangleright;": '\U000025B8', + "blank;": '\U00002423', + "blk12;": '\U00002592', + "blk14;": '\U00002591', + "blk34;": '\U00002593', + "block;": '\U00002588', + "bnot;": '\U00002310', + "bopf;": '\U0001D553', + "bot;": '\U000022A5', + "bottom;": '\U000022A5', + "bowtie;": '\U000022C8', + "boxDL;": '\U00002557', + "boxDR;": '\U00002554', + "boxDl;": '\U00002556', + "boxDr;": '\U00002553', + "boxH;": '\U00002550', + "boxHD;": '\U00002566', + "boxHU;": '\U00002569', + "boxHd;": '\U00002564', + "boxHu;": '\U00002567', + "boxUL;": '\U0000255D', + "boxUR;": '\U0000255A', + "boxUl;": '\U0000255C', + "boxUr;": '\U00002559', + "boxV;": '\U00002551', + "boxVH;": '\U0000256C', + "boxVL;": '\U00002563', + "boxVR;": '\U00002560', + "boxVh;": '\U0000256B', + "boxVl;": '\U00002562', + "boxVr;": '\U0000255F', + "boxbox;": '\U000029C9', + "boxdL;": '\U00002555', + "boxdR;": '\U00002552', + "boxdl;": '\U00002510', + "boxdr;": '\U0000250C', + "boxh;": '\U00002500', + "boxhD;": '\U00002565', + "boxhU;": '\U00002568', + "boxhd;": '\U0000252C', + "boxhu;": '\U00002534', + "boxminus;": '\U0000229F', + "boxplus;": '\U0000229E', + "boxtimes;": '\U000022A0', + "boxuL;": '\U0000255B', + "boxuR;": '\U00002558', + "boxul;": '\U00002518', + "boxur;": '\U00002514', + "boxv;": '\U00002502', + "boxvH;": '\U0000256A', + "boxvL;": '\U00002561', + "boxvR;": '\U0000255E', + "boxvh;": '\U0000253C', + "boxvl;": '\U00002524', + "boxvr;": '\U0000251C', + "bprime;": '\U00002035', + "breve;": '\U000002D8', + "brvbar;": '\U000000A6', + "bscr;": '\U0001D4B7', + "bsemi;": '\U0000204F', + "bsim;": '\U0000223D', + "bsime;": '\U000022CD', + "bsol;": '\U0000005C', + "bsolb;": '\U000029C5', + "bsolhsub;": '\U000027C8', + "bull;": '\U00002022', + "bullet;": '\U00002022', + "bump;": '\U0000224E', + "bumpE;": '\U00002AAE', + "bumpe;": '\U0000224F', + "bumpeq;": '\U0000224F', + "cacute;": '\U00000107', + "cap;": '\U00002229', + "capand;": '\U00002A44', + "capbrcup;": '\U00002A49', + "capcap;": '\U00002A4B', + "capcup;": '\U00002A47', + "capdot;": '\U00002A40', + "caret;": '\U00002041', + "caron;": '\U000002C7', + "ccaps;": '\U00002A4D', + "ccaron;": '\U0000010D', + "ccedil;": '\U000000E7', + "ccirc;": '\U00000109', + "ccups;": '\U00002A4C', + "ccupssm;": '\U00002A50', + "cdot;": '\U0000010B', + "cedil;": '\U000000B8', + "cemptyv;": '\U000029B2', + "cent;": '\U000000A2', + "centerdot;": '\U000000B7', + "cfr;": '\U0001D520', + "chcy;": '\U00000447', + "check;": '\U00002713', + "checkmark;": '\U00002713', + "chi;": '\U000003C7', + "cir;": '\U000025CB', + "cirE;": '\U000029C3', + "circ;": '\U000002C6', + "circeq;": '\U00002257', + "circlearrowleft;": '\U000021BA', + "circlearrowright;": '\U000021BB', + "circledR;": '\U000000AE', + "circledS;": '\U000024C8', + "circledast;": '\U0000229B', + "circledcirc;": '\U0000229A', + "circleddash;": '\U0000229D', + "cire;": '\U00002257', + "cirfnint;": '\U00002A10', + "cirmid;": '\U00002AEF', + "cirscir;": '\U000029C2', + "clubs;": '\U00002663', + "clubsuit;": '\U00002663', + "colon;": '\U0000003A', + "colone;": '\U00002254', + "coloneq;": '\U00002254', + "comma;": '\U0000002C', + "commat;": '\U00000040', + "comp;": '\U00002201', + "compfn;": '\U00002218', + "complement;": '\U00002201', + "complexes;": '\U00002102', + "cong;": '\U00002245', + "congdot;": '\U00002A6D', + "conint;": '\U0000222E', + "copf;": '\U0001D554', + "coprod;": '\U00002210', + "copy;": '\U000000A9', + "copysr;": '\U00002117', + "crarr;": '\U000021B5', + "cross;": '\U00002717', + "cscr;": '\U0001D4B8', + "csub;": '\U00002ACF', + "csube;": '\U00002AD1', + "csup;": '\U00002AD0', + "csupe;": '\U00002AD2', + "ctdot;": '\U000022EF', + "cudarrl;": '\U00002938', + "cudarrr;": '\U00002935', + "cuepr;": '\U000022DE', + "cuesc;": '\U000022DF', + "cularr;": '\U000021B6', + "cularrp;": '\U0000293D', + "cup;": '\U0000222A', + "cupbrcap;": '\U00002A48', + "cupcap;": '\U00002A46', + "cupcup;": '\U00002A4A', + "cupdot;": '\U0000228D', + "cupor;": '\U00002A45', + "curarr;": '\U000021B7', + "curarrm;": '\U0000293C', + "curlyeqprec;": '\U000022DE', + "curlyeqsucc;": '\U000022DF', + "curlyvee;": '\U000022CE', + "curlywedge;": '\U000022CF', + "curren;": '\U000000A4', + "curvearrowleft;": '\U000021B6', + "curvearrowright;": '\U000021B7', + "cuvee;": '\U000022CE', + "cuwed;": '\U000022CF', + "cwconint;": '\U00002232', + "cwint;": '\U00002231', + "cylcty;": '\U0000232D', + "dArr;": '\U000021D3', + "dHar;": '\U00002965', + "dagger;": '\U00002020', + "daleth;": '\U00002138', + "darr;": '\U00002193', + "dash;": '\U00002010', + "dashv;": '\U000022A3', + "dbkarow;": '\U0000290F', + "dblac;": '\U000002DD', + "dcaron;": '\U0000010F', + "dcy;": '\U00000434', + "dd;": '\U00002146', + "ddagger;": '\U00002021', + "ddarr;": '\U000021CA', + "ddotseq;": '\U00002A77', + "deg;": '\U000000B0', + "delta;": '\U000003B4', + "demptyv;": '\U000029B1', + "dfisht;": '\U0000297F', + "dfr;": '\U0001D521', + "dharl;": '\U000021C3', + "dharr;": '\U000021C2', + "diam;": '\U000022C4', + "diamond;": '\U000022C4', + "diamondsuit;": '\U00002666', + "diams;": '\U00002666', + "die;": '\U000000A8', + "digamma;": '\U000003DD', + "disin;": '\U000022F2', + "div;": '\U000000F7', + "divide;": '\U000000F7', + "divideontimes;": '\U000022C7', + "divonx;": '\U000022C7', + "djcy;": '\U00000452', + "dlcorn;": '\U0000231E', + "dlcrop;": '\U0000230D', + "dollar;": '\U00000024', + "dopf;": '\U0001D555', + "dot;": '\U000002D9', + "doteq;": '\U00002250', + "doteqdot;": '\U00002251', + "dotminus;": '\U00002238', + "dotplus;": '\U00002214', + "dotsquare;": '\U000022A1', + "doublebarwedge;": '\U00002306', + "downarrow;": '\U00002193', + "downdownarrows;": '\U000021CA', + "downharpoonleft;": '\U000021C3', + "downharpoonright;": '\U000021C2', + "drbkarow;": '\U00002910', + "drcorn;": '\U0000231F', + "drcrop;": '\U0000230C', + "dscr;": '\U0001D4B9', + "dscy;": '\U00000455', + "dsol;": '\U000029F6', + "dstrok;": '\U00000111', + "dtdot;": '\U000022F1', + "dtri;": '\U000025BF', + "dtrif;": '\U000025BE', + "duarr;": '\U000021F5', + "duhar;": '\U0000296F', + "dwangle;": '\U000029A6', + "dzcy;": '\U0000045F', + "dzigrarr;": '\U000027FF', + "eDDot;": '\U00002A77', + "eDot;": '\U00002251', + "eacute;": '\U000000E9', + "easter;": '\U00002A6E', + "ecaron;": '\U0000011B', + "ecir;": '\U00002256', + "ecirc;": '\U000000EA', + "ecolon;": '\U00002255', + "ecy;": '\U0000044D', + "edot;": '\U00000117', + "ee;": '\U00002147', + "efDot;": '\U00002252', + "efr;": '\U0001D522', + "eg;": '\U00002A9A', + "egrave;": '\U000000E8', + "egs;": '\U00002A96', + "egsdot;": '\U00002A98', + "el;": '\U00002A99', + "elinters;": '\U000023E7', + "ell;": '\U00002113', + "els;": '\U00002A95', + "elsdot;": '\U00002A97', + "emacr;": '\U00000113', + "empty;": '\U00002205', + "emptyset;": '\U00002205', + "emptyv;": '\U00002205', + "emsp;": '\U00002003', + "emsp13;": '\U00002004', + "emsp14;": '\U00002005', + "eng;": '\U0000014B', + "ensp;": '\U00002002', + "eogon;": '\U00000119', + "eopf;": '\U0001D556', + "epar;": '\U000022D5', + "eparsl;": '\U000029E3', + "eplus;": '\U00002A71', + "epsi;": '\U000003B5', + "epsilon;": '\U000003B5', + "epsiv;": '\U000003F5', + "eqcirc;": '\U00002256', + "eqcolon;": '\U00002255', + "eqsim;": '\U00002242', + "eqslantgtr;": '\U00002A96', + "eqslantless;": '\U00002A95', + "equals;": '\U0000003D', + "equest;": '\U0000225F', + "equiv;": '\U00002261', + "equivDD;": '\U00002A78', + "eqvparsl;": '\U000029E5', + "erDot;": '\U00002253', + "erarr;": '\U00002971', + "escr;": '\U0000212F', + "esdot;": '\U00002250', + "esim;": '\U00002242', + "eta;": '\U000003B7', + "eth;": '\U000000F0', + "euml;": '\U000000EB', + "euro;": '\U000020AC', + "excl;": '\U00000021', + "exist;": '\U00002203', + "expectation;": '\U00002130', + "exponentiale;": '\U00002147', + "fallingdotseq;": '\U00002252', + "fcy;": '\U00000444', + "female;": '\U00002640', + "ffilig;": '\U0000FB03', + "fflig;": '\U0000FB00', + "ffllig;": '\U0000FB04', + "ffr;": '\U0001D523', + "filig;": '\U0000FB01', + "flat;": '\U0000266D', + "fllig;": '\U0000FB02', + "fltns;": '\U000025B1', + "fnof;": '\U00000192', + "fopf;": '\U0001D557', + "forall;": '\U00002200', + "fork;": '\U000022D4', + "forkv;": '\U00002AD9', + "fpartint;": '\U00002A0D', + "frac12;": '\U000000BD', + "frac13;": '\U00002153', + "frac14;": '\U000000BC', + "frac15;": '\U00002155', + "frac16;": '\U00002159', + "frac18;": '\U0000215B', + "frac23;": '\U00002154', + "frac25;": '\U00002156', + "frac34;": '\U000000BE', + "frac35;": '\U00002157', + "frac38;": '\U0000215C', + "frac45;": '\U00002158', + "frac56;": '\U0000215A', + "frac58;": '\U0000215D', + "frac78;": '\U0000215E', + "frasl;": '\U00002044', + "frown;": '\U00002322', + "fscr;": '\U0001D4BB', + "gE;": '\U00002267', + "gEl;": '\U00002A8C', + "gacute;": '\U000001F5', + "gamma;": '\U000003B3', + "gammad;": '\U000003DD', + "gap;": '\U00002A86', + "gbreve;": '\U0000011F', + "gcirc;": '\U0000011D', + "gcy;": '\U00000433', + "gdot;": '\U00000121', + "ge;": '\U00002265', + "gel;": '\U000022DB', + "geq;": '\U00002265', + "geqq;": '\U00002267', + "geqslant;": '\U00002A7E', + "ges;": '\U00002A7E', + "gescc;": '\U00002AA9', + "gesdot;": '\U00002A80', + "gesdoto;": '\U00002A82', + "gesdotol;": '\U00002A84', + "gesles;": '\U00002A94', + "gfr;": '\U0001D524', + "gg;": '\U0000226B', + "ggg;": '\U000022D9', + "gimel;": '\U00002137', + "gjcy;": '\U00000453', + "gl;": '\U00002277', + "glE;": '\U00002A92', + "gla;": '\U00002AA5', + "glj;": '\U00002AA4', + "gnE;": '\U00002269', + "gnap;": '\U00002A8A', + "gnapprox;": '\U00002A8A', + "gne;": '\U00002A88', + "gneq;": '\U00002A88', + "gneqq;": '\U00002269', + "gnsim;": '\U000022E7', + "gopf;": '\U0001D558', + "grave;": '\U00000060', + "gscr;": '\U0000210A', + "gsim;": '\U00002273', + "gsime;": '\U00002A8E', + "gsiml;": '\U00002A90', + "gt;": '\U0000003E', + "gtcc;": '\U00002AA7', + "gtcir;": '\U00002A7A', + "gtdot;": '\U000022D7', + "gtlPar;": '\U00002995', + "gtquest;": '\U00002A7C', + "gtrapprox;": '\U00002A86', + "gtrarr;": '\U00002978', + "gtrdot;": '\U000022D7', + "gtreqless;": '\U000022DB', + "gtreqqless;": '\U00002A8C', + "gtrless;": '\U00002277', + "gtrsim;": '\U00002273', + "hArr;": '\U000021D4', + "hairsp;": '\U0000200A', + "half;": '\U000000BD', + "hamilt;": '\U0000210B', + "hardcy;": '\U0000044A', + "harr;": '\U00002194', + "harrcir;": '\U00002948', + "harrw;": '\U000021AD', + "hbar;": '\U0000210F', + "hcirc;": '\U00000125', + "hearts;": '\U00002665', + "heartsuit;": '\U00002665', + "hellip;": '\U00002026', + "hercon;": '\U000022B9', + "hfr;": '\U0001D525', + "hksearow;": '\U00002925', + "hkswarow;": '\U00002926', + "hoarr;": '\U000021FF', + "homtht;": '\U0000223B', + "hookleftarrow;": '\U000021A9', + "hookrightarrow;": '\U000021AA', + "hopf;": '\U0001D559', + "horbar;": '\U00002015', + "hscr;": '\U0001D4BD', + "hslash;": '\U0000210F', + "hstrok;": '\U00000127', + "hybull;": '\U00002043', + "hyphen;": '\U00002010', + "iacute;": '\U000000ED', + "ic;": '\U00002063', + "icirc;": '\U000000EE', + "icy;": '\U00000438', + "iecy;": '\U00000435', + "iexcl;": '\U000000A1', + "iff;": '\U000021D4', + "ifr;": '\U0001D526', + "igrave;": '\U000000EC', + "ii;": '\U00002148', + "iiiint;": '\U00002A0C', + "iiint;": '\U0000222D', + "iinfin;": '\U000029DC', + "iiota;": '\U00002129', + "ijlig;": '\U00000133', + "imacr;": '\U0000012B', + "image;": '\U00002111', + "imagline;": '\U00002110', + "imagpart;": '\U00002111', + "imath;": '\U00000131', + "imof;": '\U000022B7', + "imped;": '\U000001B5', + "in;": '\U00002208', + "incare;": '\U00002105', + "infin;": '\U0000221E', + "infintie;": '\U000029DD', + "inodot;": '\U00000131', + "int;": '\U0000222B', + "intcal;": '\U000022BA', + "integers;": '\U00002124', + "intercal;": '\U000022BA', + "intlarhk;": '\U00002A17', + "intprod;": '\U00002A3C', + "iocy;": '\U00000451', + "iogon;": '\U0000012F', + "iopf;": '\U0001D55A', + "iota;": '\U000003B9', + "iprod;": '\U00002A3C', + "iquest;": '\U000000BF', + "iscr;": '\U0001D4BE', + "isin;": '\U00002208', + "isinE;": '\U000022F9', + "isindot;": '\U000022F5', + "isins;": '\U000022F4', + "isinsv;": '\U000022F3', + "isinv;": '\U00002208', + "it;": '\U00002062', + "itilde;": '\U00000129', + "iukcy;": '\U00000456', + "iuml;": '\U000000EF', + "jcirc;": '\U00000135', + "jcy;": '\U00000439', + "jfr;": '\U0001D527', + "jmath;": '\U00000237', + "jopf;": '\U0001D55B', + "jscr;": '\U0001D4BF', + "jsercy;": '\U00000458', + "jukcy;": '\U00000454', + "kappa;": '\U000003BA', + "kappav;": '\U000003F0', + "kcedil;": '\U00000137', + "kcy;": '\U0000043A', + "kfr;": '\U0001D528', + "kgreen;": '\U00000138', + "khcy;": '\U00000445', + "kjcy;": '\U0000045C', + "kopf;": '\U0001D55C', + "kscr;": '\U0001D4C0', + "lAarr;": '\U000021DA', + "lArr;": '\U000021D0', + "lAtail;": '\U0000291B', + "lBarr;": '\U0000290E', + "lE;": '\U00002266', + "lEg;": '\U00002A8B', + "lHar;": '\U00002962', + "lacute;": '\U0000013A', + "laemptyv;": '\U000029B4', + "lagran;": '\U00002112', + "lambda;": '\U000003BB', + "lang;": '\U000027E8', + "langd;": '\U00002991', + "langle;": '\U000027E8', + "lap;": '\U00002A85', + "laquo;": '\U000000AB', + "larr;": '\U00002190', + "larrb;": '\U000021E4', + "larrbfs;": '\U0000291F', + "larrfs;": '\U0000291D', + "larrhk;": '\U000021A9', + "larrlp;": '\U000021AB', + "larrpl;": '\U00002939', + "larrsim;": '\U00002973', + "larrtl;": '\U000021A2', + "lat;": '\U00002AAB', + "latail;": '\U00002919', + "late;": '\U00002AAD', + "lbarr;": '\U0000290C', + "lbbrk;": '\U00002772', + "lbrace;": '\U0000007B', + "lbrack;": '\U0000005B', + "lbrke;": '\U0000298B', + "lbrksld;": '\U0000298F', + "lbrkslu;": '\U0000298D', + "lcaron;": '\U0000013E', + "lcedil;": '\U0000013C', + "lceil;": '\U00002308', + "lcub;": '\U0000007B', + "lcy;": '\U0000043B', + "ldca;": '\U00002936', + "ldquo;": '\U0000201C', + "ldquor;": '\U0000201E', + "ldrdhar;": '\U00002967', + "ldrushar;": '\U0000294B', + "ldsh;": '\U000021B2', + "le;": '\U00002264', + "leftarrow;": '\U00002190', + "leftarrowtail;": '\U000021A2', + "leftharpoondown;": '\U000021BD', + "leftharpoonup;": '\U000021BC', + "leftleftarrows;": '\U000021C7', + "leftrightarrow;": '\U00002194', + "leftrightarrows;": '\U000021C6', + "leftrightharpoons;": '\U000021CB', + "leftrightsquigarrow;": '\U000021AD', + "leftthreetimes;": '\U000022CB', + "leg;": '\U000022DA', + "leq;": '\U00002264', + "leqq;": '\U00002266', + "leqslant;": '\U00002A7D', + "les;": '\U00002A7D', + "lescc;": '\U00002AA8', + "lesdot;": '\U00002A7F', + "lesdoto;": '\U00002A81', + "lesdotor;": '\U00002A83', + "lesges;": '\U00002A93', + "lessapprox;": '\U00002A85', + "lessdot;": '\U000022D6', + "lesseqgtr;": '\U000022DA', + "lesseqqgtr;": '\U00002A8B', + "lessgtr;": '\U00002276', + "lesssim;": '\U00002272', + "lfisht;": '\U0000297C', + "lfloor;": '\U0000230A', + "lfr;": '\U0001D529', + "lg;": '\U00002276', + "lgE;": '\U00002A91', + "lhard;": '\U000021BD', + "lharu;": '\U000021BC', + "lharul;": '\U0000296A', + "lhblk;": '\U00002584', + "ljcy;": '\U00000459', + "ll;": '\U0000226A', + "llarr;": '\U000021C7', + "llcorner;": '\U0000231E', + "llhard;": '\U0000296B', + "lltri;": '\U000025FA', + "lmidot;": '\U00000140', + "lmoust;": '\U000023B0', + "lmoustache;": '\U000023B0', + "lnE;": '\U00002268', + "lnap;": '\U00002A89', + "lnapprox;": '\U00002A89', + "lne;": '\U00002A87', + "lneq;": '\U00002A87', + "lneqq;": '\U00002268', + "lnsim;": '\U000022E6', + "loang;": '\U000027EC', + "loarr;": '\U000021FD', + "lobrk;": '\U000027E6', + "longleftarrow;": '\U000027F5', + "longleftrightarrow;": '\U000027F7', + "longmapsto;": '\U000027FC', + "longrightarrow;": '\U000027F6', + "looparrowleft;": '\U000021AB', + "looparrowright;": '\U000021AC', + "lopar;": '\U00002985', + "lopf;": '\U0001D55D', + "loplus;": '\U00002A2D', + "lotimes;": '\U00002A34', + "lowast;": '\U00002217', + "lowbar;": '\U0000005F', + "loz;": '\U000025CA', + "lozenge;": '\U000025CA', + "lozf;": '\U000029EB', + "lpar;": '\U00000028', + "lparlt;": '\U00002993', + "lrarr;": '\U000021C6', + "lrcorner;": '\U0000231F', + "lrhar;": '\U000021CB', + "lrhard;": '\U0000296D', + "lrm;": '\U0000200E', + "lrtri;": '\U000022BF', + "lsaquo;": '\U00002039', + "lscr;": '\U0001D4C1', + "lsh;": '\U000021B0', + "lsim;": '\U00002272', + "lsime;": '\U00002A8D', + "lsimg;": '\U00002A8F', + "lsqb;": '\U0000005B', + "lsquo;": '\U00002018', + "lsquor;": '\U0000201A', + "lstrok;": '\U00000142', + "lt;": '\U0000003C', + "ltcc;": '\U00002AA6', + "ltcir;": '\U00002A79', + "ltdot;": '\U000022D6', + "lthree;": '\U000022CB', + "ltimes;": '\U000022C9', + "ltlarr;": '\U00002976', + "ltquest;": '\U00002A7B', + "ltrPar;": '\U00002996', + "ltri;": '\U000025C3', + "ltrie;": '\U000022B4', + "ltrif;": '\U000025C2', + "lurdshar;": '\U0000294A', + "luruhar;": '\U00002966', + "mDDot;": '\U0000223A', + "macr;": '\U000000AF', + "male;": '\U00002642', + "malt;": '\U00002720', + "maltese;": '\U00002720', + "map;": '\U000021A6', + "mapsto;": '\U000021A6', + "mapstodown;": '\U000021A7', + "mapstoleft;": '\U000021A4', + "mapstoup;": '\U000021A5', + "marker;": '\U000025AE', + "mcomma;": '\U00002A29', + "mcy;": '\U0000043C', + "mdash;": '\U00002014', + "measuredangle;": '\U00002221', + "mfr;": '\U0001D52A', + "mho;": '\U00002127', + "micro;": '\U000000B5', + "mid;": '\U00002223', + "midast;": '\U0000002A', + "midcir;": '\U00002AF0', + "middot;": '\U000000B7', + "minus;": '\U00002212', + "minusb;": '\U0000229F', + "minusd;": '\U00002238', + "minusdu;": '\U00002A2A', + "mlcp;": '\U00002ADB', + "mldr;": '\U00002026', + "mnplus;": '\U00002213', + "models;": '\U000022A7', + "mopf;": '\U0001D55E', + "mp;": '\U00002213', + "mscr;": '\U0001D4C2', + "mstpos;": '\U0000223E', + "mu;": '\U000003BC', + "multimap;": '\U000022B8', + "mumap;": '\U000022B8', + "nLeftarrow;": '\U000021CD', + "nLeftrightarrow;": '\U000021CE', + "nRightarrow;": '\U000021CF', + "nVDash;": '\U000022AF', + "nVdash;": '\U000022AE', + "nabla;": '\U00002207', + "nacute;": '\U00000144', + "nap;": '\U00002249', + "napos;": '\U00000149', + "napprox;": '\U00002249', + "natur;": '\U0000266E', + "natural;": '\U0000266E', + "naturals;": '\U00002115', + "nbsp;": '\U000000A0', + "ncap;": '\U00002A43', + "ncaron;": '\U00000148', + "ncedil;": '\U00000146', + "ncong;": '\U00002247', + "ncup;": '\U00002A42', + "ncy;": '\U0000043D', + "ndash;": '\U00002013', + "ne;": '\U00002260', + "neArr;": '\U000021D7', + "nearhk;": '\U00002924', + "nearr;": '\U00002197', + "nearrow;": '\U00002197', + "nequiv;": '\U00002262', + "nesear;": '\U00002928', + "nexist;": '\U00002204', + "nexists;": '\U00002204', + "nfr;": '\U0001D52B', + "nge;": '\U00002271', + "ngeq;": '\U00002271', + "ngsim;": '\U00002275', + "ngt;": '\U0000226F', + "ngtr;": '\U0000226F', + "nhArr;": '\U000021CE', + "nharr;": '\U000021AE', + "nhpar;": '\U00002AF2', + "ni;": '\U0000220B', + "nis;": '\U000022FC', + "nisd;": '\U000022FA', + "niv;": '\U0000220B', + "njcy;": '\U0000045A', + "nlArr;": '\U000021CD', + "nlarr;": '\U0000219A', + "nldr;": '\U00002025', + "nle;": '\U00002270', + "nleftarrow;": '\U0000219A', + "nleftrightarrow;": '\U000021AE', + "nleq;": '\U00002270', + "nless;": '\U0000226E', + "nlsim;": '\U00002274', + "nlt;": '\U0000226E', + "nltri;": '\U000022EA', + "nltrie;": '\U000022EC', + "nmid;": '\U00002224', + "nopf;": '\U0001D55F', + "not;": '\U000000AC', + "notin;": '\U00002209', + "notinva;": '\U00002209', + "notinvb;": '\U000022F7', + "notinvc;": '\U000022F6', + "notni;": '\U0000220C', + "notniva;": '\U0000220C', + "notnivb;": '\U000022FE', + "notnivc;": '\U000022FD', + "npar;": '\U00002226', + "nparallel;": '\U00002226', + "npolint;": '\U00002A14', + "npr;": '\U00002280', + "nprcue;": '\U000022E0', + "nprec;": '\U00002280', + "nrArr;": '\U000021CF', + "nrarr;": '\U0000219B', + "nrightarrow;": '\U0000219B', + "nrtri;": '\U000022EB', + "nrtrie;": '\U000022ED', + "nsc;": '\U00002281', + "nsccue;": '\U000022E1', + "nscr;": '\U0001D4C3', + "nshortmid;": '\U00002224', + "nshortparallel;": '\U00002226', + "nsim;": '\U00002241', + "nsime;": '\U00002244', + "nsimeq;": '\U00002244', + "nsmid;": '\U00002224', + "nspar;": '\U00002226', + "nsqsube;": '\U000022E2', + "nsqsupe;": '\U000022E3', + "nsub;": '\U00002284', + "nsube;": '\U00002288', + "nsubseteq;": '\U00002288', + "nsucc;": '\U00002281', + "nsup;": '\U00002285', + "nsupe;": '\U00002289', + "nsupseteq;": '\U00002289', + "ntgl;": '\U00002279', + "ntilde;": '\U000000F1', + "ntlg;": '\U00002278', + "ntriangleleft;": '\U000022EA', + "ntrianglelefteq;": '\U000022EC', + "ntriangleright;": '\U000022EB', + "ntrianglerighteq;": '\U000022ED', + "nu;": '\U000003BD', + "num;": '\U00000023', + "numero;": '\U00002116', + "numsp;": '\U00002007', + "nvDash;": '\U000022AD', + "nvHarr;": '\U00002904', + "nvdash;": '\U000022AC', + "nvinfin;": '\U000029DE', + "nvlArr;": '\U00002902', + "nvrArr;": '\U00002903', + "nwArr;": '\U000021D6', + "nwarhk;": '\U00002923', + "nwarr;": '\U00002196', + "nwarrow;": '\U00002196', + "nwnear;": '\U00002927', + "oS;": '\U000024C8', + "oacute;": '\U000000F3', + "oast;": '\U0000229B', + "ocir;": '\U0000229A', + "ocirc;": '\U000000F4', + "ocy;": '\U0000043E', + "odash;": '\U0000229D', + "odblac;": '\U00000151', + "odiv;": '\U00002A38', + "odot;": '\U00002299', + "odsold;": '\U000029BC', + "oelig;": '\U00000153', + "ofcir;": '\U000029BF', + "ofr;": '\U0001D52C', + "ogon;": '\U000002DB', + "ograve;": '\U000000F2', + "ogt;": '\U000029C1', + "ohbar;": '\U000029B5', + "ohm;": '\U000003A9', + "oint;": '\U0000222E', + "olarr;": '\U000021BA', + "olcir;": '\U000029BE', + "olcross;": '\U000029BB', + "oline;": '\U0000203E', + "olt;": '\U000029C0', + "omacr;": '\U0000014D', + "omega;": '\U000003C9', + "omicron;": '\U000003BF', + "omid;": '\U000029B6', + "ominus;": '\U00002296', + "oopf;": '\U0001D560', + "opar;": '\U000029B7', + "operp;": '\U000029B9', + "oplus;": '\U00002295', + "or;": '\U00002228', + "orarr;": '\U000021BB', + "ord;": '\U00002A5D', + "order;": '\U00002134', + "orderof;": '\U00002134', + "ordf;": '\U000000AA', + "ordm;": '\U000000BA', + "origof;": '\U000022B6', + "oror;": '\U00002A56', + "orslope;": '\U00002A57', + "orv;": '\U00002A5B', + "oscr;": '\U00002134', + "oslash;": '\U000000F8', + "osol;": '\U00002298', + "otilde;": '\U000000F5', + "otimes;": '\U00002297', + "otimesas;": '\U00002A36', + "ouml;": '\U000000F6', + "ovbar;": '\U0000233D', + "par;": '\U00002225', + "para;": '\U000000B6', + "parallel;": '\U00002225', + "parsim;": '\U00002AF3', + "parsl;": '\U00002AFD', + "part;": '\U00002202', + "pcy;": '\U0000043F', + "percnt;": '\U00000025', + "period;": '\U0000002E', + "permil;": '\U00002030', + "perp;": '\U000022A5', + "pertenk;": '\U00002031', + "pfr;": '\U0001D52D', + "phi;": '\U000003C6', + "phiv;": '\U000003D5', + "phmmat;": '\U00002133', + "phone;": '\U0000260E', + "pi;": '\U000003C0', + "pitchfork;": '\U000022D4', + "piv;": '\U000003D6', + "planck;": '\U0000210F', + "planckh;": '\U0000210E', + "plankv;": '\U0000210F', + "plus;": '\U0000002B', + "plusacir;": '\U00002A23', + "plusb;": '\U0000229E', + "pluscir;": '\U00002A22', + "plusdo;": '\U00002214', + "plusdu;": '\U00002A25', + "pluse;": '\U00002A72', + "plusmn;": '\U000000B1', + "plussim;": '\U00002A26', + "plustwo;": '\U00002A27', + "pm;": '\U000000B1', + "pointint;": '\U00002A15', + "popf;": '\U0001D561', + "pound;": '\U000000A3', + "pr;": '\U0000227A', + "prE;": '\U00002AB3', + "prap;": '\U00002AB7', + "prcue;": '\U0000227C', + "pre;": '\U00002AAF', + "prec;": '\U0000227A', + "precapprox;": '\U00002AB7', + "preccurlyeq;": '\U0000227C', + "preceq;": '\U00002AAF', + "precnapprox;": '\U00002AB9', + "precneqq;": '\U00002AB5', + "precnsim;": '\U000022E8', + "precsim;": '\U0000227E', + "prime;": '\U00002032', + "primes;": '\U00002119', + "prnE;": '\U00002AB5', + "prnap;": '\U00002AB9', + "prnsim;": '\U000022E8', + "prod;": '\U0000220F', + "profalar;": '\U0000232E', + "profline;": '\U00002312', + "profsurf;": '\U00002313', + "prop;": '\U0000221D', + "propto;": '\U0000221D', + "prsim;": '\U0000227E', + "prurel;": '\U000022B0', + "pscr;": '\U0001D4C5', + "psi;": '\U000003C8', + "puncsp;": '\U00002008', + "qfr;": '\U0001D52E', + "qint;": '\U00002A0C', + "qopf;": '\U0001D562', + "qprime;": '\U00002057', + "qscr;": '\U0001D4C6', + "quaternions;": '\U0000210D', + "quatint;": '\U00002A16', + "quest;": '\U0000003F', + "questeq;": '\U0000225F', + "quot;": '\U00000022', + "rAarr;": '\U000021DB', + "rArr;": '\U000021D2', + "rAtail;": '\U0000291C', + "rBarr;": '\U0000290F', + "rHar;": '\U00002964', + "racute;": '\U00000155', + "radic;": '\U0000221A', + "raemptyv;": '\U000029B3', + "rang;": '\U000027E9', + "rangd;": '\U00002992', + "range;": '\U000029A5', + "rangle;": '\U000027E9', + "raquo;": '\U000000BB', + "rarr;": '\U00002192', + "rarrap;": '\U00002975', + "rarrb;": '\U000021E5', + "rarrbfs;": '\U00002920', + "rarrc;": '\U00002933', + "rarrfs;": '\U0000291E', + "rarrhk;": '\U000021AA', + "rarrlp;": '\U000021AC', + "rarrpl;": '\U00002945', + "rarrsim;": '\U00002974', + "rarrtl;": '\U000021A3', + "rarrw;": '\U0000219D', + "ratail;": '\U0000291A', + "ratio;": '\U00002236', + "rationals;": '\U0000211A', + "rbarr;": '\U0000290D', + "rbbrk;": '\U00002773', + "rbrace;": '\U0000007D', + "rbrack;": '\U0000005D', + "rbrke;": '\U0000298C', + "rbrksld;": '\U0000298E', + "rbrkslu;": '\U00002990', + "rcaron;": '\U00000159', + "rcedil;": '\U00000157', + "rceil;": '\U00002309', + "rcub;": '\U0000007D', + "rcy;": '\U00000440', + "rdca;": '\U00002937', + "rdldhar;": '\U00002969', + "rdquo;": '\U0000201D', + "rdquor;": '\U0000201D', + "rdsh;": '\U000021B3', + "real;": '\U0000211C', + "realine;": '\U0000211B', + "realpart;": '\U0000211C', + "reals;": '\U0000211D', + "rect;": '\U000025AD', + "reg;": '\U000000AE', + "rfisht;": '\U0000297D', + "rfloor;": '\U0000230B', + "rfr;": '\U0001D52F', + "rhard;": '\U000021C1', + "rharu;": '\U000021C0', + "rharul;": '\U0000296C', + "rho;": '\U000003C1', + "rhov;": '\U000003F1', + "rightarrow;": '\U00002192', + "rightarrowtail;": '\U000021A3', + "rightharpoondown;": '\U000021C1', + "rightharpoonup;": '\U000021C0', + "rightleftarrows;": '\U000021C4', + "rightleftharpoons;": '\U000021CC', + "rightrightarrows;": '\U000021C9', + "rightsquigarrow;": '\U0000219D', + "rightthreetimes;": '\U000022CC', + "ring;": '\U000002DA', + "risingdotseq;": '\U00002253', + "rlarr;": '\U000021C4', + "rlhar;": '\U000021CC', + "rlm;": '\U0000200F', + "rmoust;": '\U000023B1', + "rmoustache;": '\U000023B1', + "rnmid;": '\U00002AEE', + "roang;": '\U000027ED', + "roarr;": '\U000021FE', + "robrk;": '\U000027E7', + "ropar;": '\U00002986', + "ropf;": '\U0001D563', + "roplus;": '\U00002A2E', + "rotimes;": '\U00002A35', + "rpar;": '\U00000029', + "rpargt;": '\U00002994', + "rppolint;": '\U00002A12', + "rrarr;": '\U000021C9', + "rsaquo;": '\U0000203A', + "rscr;": '\U0001D4C7', + "rsh;": '\U000021B1', + "rsqb;": '\U0000005D', + "rsquo;": '\U00002019', + "rsquor;": '\U00002019', + "rthree;": '\U000022CC', + "rtimes;": '\U000022CA', + "rtri;": '\U000025B9', + "rtrie;": '\U000022B5', + "rtrif;": '\U000025B8', + "rtriltri;": '\U000029CE', + "ruluhar;": '\U00002968', + "rx;": '\U0000211E', + "sacute;": '\U0000015B', + "sbquo;": '\U0000201A', + "sc;": '\U0000227B', + "scE;": '\U00002AB4', + "scap;": '\U00002AB8', + "scaron;": '\U00000161', + "sccue;": '\U0000227D', + "sce;": '\U00002AB0', + "scedil;": '\U0000015F', + "scirc;": '\U0000015D', + "scnE;": '\U00002AB6', + "scnap;": '\U00002ABA', + "scnsim;": '\U000022E9', + "scpolint;": '\U00002A13', + "scsim;": '\U0000227F', + "scy;": '\U00000441', + "sdot;": '\U000022C5', + "sdotb;": '\U000022A1', + "sdote;": '\U00002A66', + "seArr;": '\U000021D8', + "searhk;": '\U00002925', + "searr;": '\U00002198', + "searrow;": '\U00002198', + "sect;": '\U000000A7', + "semi;": '\U0000003B', + "seswar;": '\U00002929', + "setminus;": '\U00002216', + "setmn;": '\U00002216', + "sext;": '\U00002736', + "sfr;": '\U0001D530', + "sfrown;": '\U00002322', + "sharp;": '\U0000266F', + "shchcy;": '\U00000449', + "shcy;": '\U00000448', + "shortmid;": '\U00002223', + "shortparallel;": '\U00002225', + "shy;": '\U000000AD', + "sigma;": '\U000003C3', + "sigmaf;": '\U000003C2', + "sigmav;": '\U000003C2', + "sim;": '\U0000223C', + "simdot;": '\U00002A6A', + "sime;": '\U00002243', + "simeq;": '\U00002243', + "simg;": '\U00002A9E', + "simgE;": '\U00002AA0', + "siml;": '\U00002A9D', + "simlE;": '\U00002A9F', + "simne;": '\U00002246', + "simplus;": '\U00002A24', + "simrarr;": '\U00002972', + "slarr;": '\U00002190', + "smallsetminus;": '\U00002216', + "smashp;": '\U00002A33', + "smeparsl;": '\U000029E4', + "smid;": '\U00002223', + "smile;": '\U00002323', + "smt;": '\U00002AAA', + "smte;": '\U00002AAC', + "softcy;": '\U0000044C', + "sol;": '\U0000002F', + "solb;": '\U000029C4', + "solbar;": '\U0000233F', + "sopf;": '\U0001D564', + "spades;": '\U00002660', + "spadesuit;": '\U00002660', + "spar;": '\U00002225', + "sqcap;": '\U00002293', + "sqcup;": '\U00002294', + "sqsub;": '\U0000228F', + "sqsube;": '\U00002291', + "sqsubset;": '\U0000228F', + "sqsubseteq;": '\U00002291', + "sqsup;": '\U00002290', + "sqsupe;": '\U00002292', + "sqsupset;": '\U00002290', + "sqsupseteq;": '\U00002292', + "squ;": '\U000025A1', + "square;": '\U000025A1', + "squarf;": '\U000025AA', + "squf;": '\U000025AA', + "srarr;": '\U00002192', + "sscr;": '\U0001D4C8', + "ssetmn;": '\U00002216', + "ssmile;": '\U00002323', + "sstarf;": '\U000022C6', + "star;": '\U00002606', + "starf;": '\U00002605', + "straightepsilon;": '\U000003F5', + "straightphi;": '\U000003D5', + "strns;": '\U000000AF', + "sub;": '\U00002282', + "subE;": '\U00002AC5', + "subdot;": '\U00002ABD', + "sube;": '\U00002286', + "subedot;": '\U00002AC3', + "submult;": '\U00002AC1', + "subnE;": '\U00002ACB', + "subne;": '\U0000228A', + "subplus;": '\U00002ABF', + "subrarr;": '\U00002979', + "subset;": '\U00002282', + "subseteq;": '\U00002286', + "subseteqq;": '\U00002AC5', + "subsetneq;": '\U0000228A', + "subsetneqq;": '\U00002ACB', + "subsim;": '\U00002AC7', + "subsub;": '\U00002AD5', + "subsup;": '\U00002AD3', + "succ;": '\U0000227B', + "succapprox;": '\U00002AB8', + "succcurlyeq;": '\U0000227D', + "succeq;": '\U00002AB0', + "succnapprox;": '\U00002ABA', + "succneqq;": '\U00002AB6', + "succnsim;": '\U000022E9', + "succsim;": '\U0000227F', + "sum;": '\U00002211', + "sung;": '\U0000266A', + "sup;": '\U00002283', + "sup1;": '\U000000B9', + "sup2;": '\U000000B2', + "sup3;": '\U000000B3', + "supE;": '\U00002AC6', + "supdot;": '\U00002ABE', + "supdsub;": '\U00002AD8', + "supe;": '\U00002287', + "supedot;": '\U00002AC4', + "suphsol;": '\U000027C9', + "suphsub;": '\U00002AD7', + "suplarr;": '\U0000297B', + "supmult;": '\U00002AC2', + "supnE;": '\U00002ACC', + "supne;": '\U0000228B', + "supplus;": '\U00002AC0', + "supset;": '\U00002283', + "supseteq;": '\U00002287', + "supseteqq;": '\U00002AC6', + "supsetneq;": '\U0000228B', + "supsetneqq;": '\U00002ACC', + "supsim;": '\U00002AC8', + "supsub;": '\U00002AD4', + "supsup;": '\U00002AD6', + "swArr;": '\U000021D9', + "swarhk;": '\U00002926', + "swarr;": '\U00002199', + "swarrow;": '\U00002199', + "swnwar;": '\U0000292A', + "szlig;": '\U000000DF', + "target;": '\U00002316', + "tau;": '\U000003C4', + "tbrk;": '\U000023B4', + "tcaron;": '\U00000165', + "tcedil;": '\U00000163', + "tcy;": '\U00000442', + "tdot;": '\U000020DB', + "telrec;": '\U00002315', + "tfr;": '\U0001D531', + "there4;": '\U00002234', + "therefore;": '\U00002234', + "theta;": '\U000003B8', + "thetasym;": '\U000003D1', + "thetav;": '\U000003D1', + "thickapprox;": '\U00002248', + "thicksim;": '\U0000223C', + "thinsp;": '\U00002009', + "thkap;": '\U00002248', + "thksim;": '\U0000223C', + "thorn;": '\U000000FE', + "tilde;": '\U000002DC', + "times;": '\U000000D7', + "timesb;": '\U000022A0', + "timesbar;": '\U00002A31', + "timesd;": '\U00002A30', + "tint;": '\U0000222D', + "toea;": '\U00002928', + "top;": '\U000022A4', + "topbot;": '\U00002336', + "topcir;": '\U00002AF1', + "topf;": '\U0001D565', + "topfork;": '\U00002ADA', + "tosa;": '\U00002929', + "tprime;": '\U00002034', + "trade;": '\U00002122', + "triangle;": '\U000025B5', + "triangledown;": '\U000025BF', + "triangleleft;": '\U000025C3', + "trianglelefteq;": '\U000022B4', + "triangleq;": '\U0000225C', + "triangleright;": '\U000025B9', + "trianglerighteq;": '\U000022B5', + "tridot;": '\U000025EC', + "trie;": '\U0000225C', + "triminus;": '\U00002A3A', + "triplus;": '\U00002A39', + "trisb;": '\U000029CD', + "tritime;": '\U00002A3B', + "trpezium;": '\U000023E2', + "tscr;": '\U0001D4C9', + "tscy;": '\U00000446', + "tshcy;": '\U0000045B', + "tstrok;": '\U00000167', + "twixt;": '\U0000226C', + "twoheadleftarrow;": '\U0000219E', + "twoheadrightarrow;": '\U000021A0', + "uArr;": '\U000021D1', + "uHar;": '\U00002963', + "uacute;": '\U000000FA', + "uarr;": '\U00002191', + "ubrcy;": '\U0000045E', + "ubreve;": '\U0000016D', + "ucirc;": '\U000000FB', + "ucy;": '\U00000443', + "udarr;": '\U000021C5', + "udblac;": '\U00000171', + "udhar;": '\U0000296E', + "ufisht;": '\U0000297E', + "ufr;": '\U0001D532', + "ugrave;": '\U000000F9', + "uharl;": '\U000021BF', + "uharr;": '\U000021BE', + "uhblk;": '\U00002580', + "ulcorn;": '\U0000231C', + "ulcorner;": '\U0000231C', + "ulcrop;": '\U0000230F', + "ultri;": '\U000025F8', + "umacr;": '\U0000016B', + "uml;": '\U000000A8', + "uogon;": '\U00000173', + "uopf;": '\U0001D566', + "uparrow;": '\U00002191', + "updownarrow;": '\U00002195', + "upharpoonleft;": '\U000021BF', + "upharpoonright;": '\U000021BE', + "uplus;": '\U0000228E', + "upsi;": '\U000003C5', + "upsih;": '\U000003D2', + "upsilon;": '\U000003C5', + "upuparrows;": '\U000021C8', + "urcorn;": '\U0000231D', + "urcorner;": '\U0000231D', + "urcrop;": '\U0000230E', + "uring;": '\U0000016F', + "urtri;": '\U000025F9', + "uscr;": '\U0001D4CA', + "utdot;": '\U000022F0', + "utilde;": '\U00000169', + "utri;": '\U000025B5', + "utrif;": '\U000025B4', + "uuarr;": '\U000021C8', + "uuml;": '\U000000FC', + "uwangle;": '\U000029A7', + "vArr;": '\U000021D5', + "vBar;": '\U00002AE8', + "vBarv;": '\U00002AE9', + "vDash;": '\U000022A8', + "vangrt;": '\U0000299C', + "varepsilon;": '\U000003F5', + "varkappa;": '\U000003F0', + "varnothing;": '\U00002205', + "varphi;": '\U000003D5', + "varpi;": '\U000003D6', + "varpropto;": '\U0000221D', + "varr;": '\U00002195', + "varrho;": '\U000003F1', + "varsigma;": '\U000003C2', + "vartheta;": '\U000003D1', + "vartriangleleft;": '\U000022B2', + "vartriangleright;": '\U000022B3', + "vcy;": '\U00000432', + "vdash;": '\U000022A2', + "vee;": '\U00002228', + "veebar;": '\U000022BB', + "veeeq;": '\U0000225A', + "vellip;": '\U000022EE', + "verbar;": '\U0000007C', + "vert;": '\U0000007C', + "vfr;": '\U0001D533', + "vltri;": '\U000022B2', + "vopf;": '\U0001D567', + "vprop;": '\U0000221D', + "vrtri;": '\U000022B3', + "vscr;": '\U0001D4CB', + "vzigzag;": '\U0000299A', + "wcirc;": '\U00000175', + "wedbar;": '\U00002A5F', + "wedge;": '\U00002227', + "wedgeq;": '\U00002259', + "weierp;": '\U00002118', + "wfr;": '\U0001D534', + "wopf;": '\U0001D568', + "wp;": '\U00002118', + "wr;": '\U00002240', + "wreath;": '\U00002240', + "wscr;": '\U0001D4CC', + "xcap;": '\U000022C2', + "xcirc;": '\U000025EF', + "xcup;": '\U000022C3', + "xdtri;": '\U000025BD', + "xfr;": '\U0001D535', + "xhArr;": '\U000027FA', + "xharr;": '\U000027F7', + "xi;": '\U000003BE', + "xlArr;": '\U000027F8', + "xlarr;": '\U000027F5', + "xmap;": '\U000027FC', + "xnis;": '\U000022FB', + "xodot;": '\U00002A00', + "xopf;": '\U0001D569', + "xoplus;": '\U00002A01', + "xotime;": '\U00002A02', + "xrArr;": '\U000027F9', + "xrarr;": '\U000027F6', + "xscr;": '\U0001D4CD', + "xsqcup;": '\U00002A06', + "xuplus;": '\U00002A04', + "xutri;": '\U000025B3', + "xvee;": '\U000022C1', + "xwedge;": '\U000022C0', + "yacute;": '\U000000FD', + "yacy;": '\U0000044F', + "ycirc;": '\U00000177', + "ycy;": '\U0000044B', + "yen;": '\U000000A5', + "yfr;": '\U0001D536', + "yicy;": '\U00000457', + "yopf;": '\U0001D56A', + "yscr;": '\U0001D4CE', + "yucy;": '\U0000044E', + "yuml;": '\U000000FF', + "zacute;": '\U0000017A', + "zcaron;": '\U0000017E', + "zcy;": '\U00000437', + "zdot;": '\U0000017C', + "zeetrf;": '\U00002128', + "zeta;": '\U000003B6', + "zfr;": '\U0001D537', + "zhcy;": '\U00000436', + "zigrarr;": '\U000021DD', + "zopf;": '\U0001D56B', + "zscr;": '\U0001D4CF', + "zwj;": '\U0000200D', + "zwnj;": '\U0000200C', + "AElig": '\U000000C6', + "AMP": '\U00000026', + "Aacute": '\U000000C1', + "Acirc": '\U000000C2', + "Agrave": '\U000000C0', + "Aring": '\U000000C5', + "Atilde": '\U000000C3', + "Auml": '\U000000C4', + "COPY": '\U000000A9', + "Ccedil": '\U000000C7', + "ETH": '\U000000D0', + "Eacute": '\U000000C9', + "Ecirc": '\U000000CA', + "Egrave": '\U000000C8', + "Euml": '\U000000CB', + "GT": '\U0000003E', + "Iacute": '\U000000CD', + "Icirc": '\U000000CE', + "Igrave": '\U000000CC', + "Iuml": '\U000000CF', + "LT": '\U0000003C', + "Ntilde": '\U000000D1', + "Oacute": '\U000000D3', + "Ocirc": '\U000000D4', + "Ograve": '\U000000D2', + "Oslash": '\U000000D8', + "Otilde": '\U000000D5', + "Ouml": '\U000000D6', + "QUOT": '\U00000022', + "REG": '\U000000AE', + "THORN": '\U000000DE', + "Uacute": '\U000000DA', + "Ucirc": '\U000000DB', + "Ugrave": '\U000000D9', + "Uuml": '\U000000DC', + "Yacute": '\U000000DD', + "aacute": '\U000000E1', + "acirc": '\U000000E2', + "acute": '\U000000B4', + "aelig": '\U000000E6', + "agrave": '\U000000E0', + "amp": '\U00000026', + "aring": '\U000000E5', + "atilde": '\U000000E3', + "auml": '\U000000E4', + "brvbar": '\U000000A6', + "ccedil": '\U000000E7', + "cedil": '\U000000B8', + "cent": '\U000000A2', + "copy": '\U000000A9', + "curren": '\U000000A4', + "deg": '\U000000B0', + "divide": '\U000000F7', + "eacute": '\U000000E9', + "ecirc": '\U000000EA', + "egrave": '\U000000E8', + "eth": '\U000000F0', + "euml": '\U000000EB', + "frac12": '\U000000BD', + "frac14": '\U000000BC', + "frac34": '\U000000BE', + "gt": '\U0000003E', + "iacute": '\U000000ED', + "icirc": '\U000000EE', + "iexcl": '\U000000A1', + "igrave": '\U000000EC', + "iquest": '\U000000BF', + "iuml": '\U000000EF', + "laquo": '\U000000AB', + "lt": '\U0000003C', + "macr": '\U000000AF', + "micro": '\U000000B5', + "middot": '\U000000B7', + "nbsp": '\U000000A0', + "not": '\U000000AC', + "ntilde": '\U000000F1', + "oacute": '\U000000F3', + "ocirc": '\U000000F4', + "ograve": '\U000000F2', + "ordf": '\U000000AA', + "ordm": '\U000000BA', + "oslash": '\U000000F8', + "otilde": '\U000000F5', + "ouml": '\U000000F6', + "para": '\U000000B6', + "plusmn": '\U000000B1', + "pound": '\U000000A3', + "quot": '\U00000022', + "raquo": '\U000000BB', + "reg": '\U000000AE', + "sect": '\U000000A7', + "shy": '\U000000AD', + "sup1": '\U000000B9', + "sup2": '\U000000B2', + "sup3": '\U000000B3', + "szlig": '\U000000DF', + "thorn": '\U000000FE', + "times": '\U000000D7', + "uacute": '\U000000FA', + "ucirc": '\U000000FB', + "ugrave": '\U000000F9', + "uml": '\U000000A8', + "uuml": '\U000000FC', + "yacute": '\U000000FD', + "yen": '\U000000A5', + "yuml": '\U000000FF', +} + +// HTML entities that are two unicode codepoints. +var entity2 = map[string][2]rune{ + // TODO(nigeltao): Handle replacements that are wider than their names. + // "nLt;": {'\u226A', '\u20D2'}, + // "nGt;": {'\u226B', '\u20D2'}, + "NotEqualTilde;": {'\u2242', '\u0338'}, + "NotGreaterFullEqual;": {'\u2267', '\u0338'}, + "NotGreaterGreater;": {'\u226B', '\u0338'}, + "NotGreaterSlantEqual;": {'\u2A7E', '\u0338'}, + "NotHumpDownHump;": {'\u224E', '\u0338'}, + "NotHumpEqual;": {'\u224F', '\u0338'}, + "NotLeftTriangleBar;": {'\u29CF', '\u0338'}, + "NotLessLess;": {'\u226A', '\u0338'}, + "NotLessSlantEqual;": {'\u2A7D', '\u0338'}, + "NotNestedGreaterGreater;": {'\u2AA2', '\u0338'}, + "NotNestedLessLess;": {'\u2AA1', '\u0338'}, + "NotPrecedesEqual;": {'\u2AAF', '\u0338'}, + "NotRightTriangleBar;": {'\u29D0', '\u0338'}, + "NotSquareSubset;": {'\u228F', '\u0338'}, + "NotSquareSuperset;": {'\u2290', '\u0338'}, + "NotSubset;": {'\u2282', '\u20D2'}, + "NotSucceedsEqual;": {'\u2AB0', '\u0338'}, + "NotSucceedsTilde;": {'\u227F', '\u0338'}, + "NotSuperset;": {'\u2283', '\u20D2'}, + "ThickSpace;": {'\u205F', '\u200A'}, + "acE;": {'\u223E', '\u0333'}, + "bne;": {'\u003D', '\u20E5'}, + "bnequiv;": {'\u2261', '\u20E5'}, + "caps;": {'\u2229', '\uFE00'}, + "cups;": {'\u222A', '\uFE00'}, + "fjlig;": {'\u0066', '\u006A'}, + "gesl;": {'\u22DB', '\uFE00'}, + "gvertneqq;": {'\u2269', '\uFE00'}, + "gvnE;": {'\u2269', '\uFE00'}, + "lates;": {'\u2AAD', '\uFE00'}, + "lesg;": {'\u22DA', '\uFE00'}, + "lvertneqq;": {'\u2268', '\uFE00'}, + "lvnE;": {'\u2268', '\uFE00'}, + "nGg;": {'\u22D9', '\u0338'}, + "nGtv;": {'\u226B', '\u0338'}, + "nLl;": {'\u22D8', '\u0338'}, + "nLtv;": {'\u226A', '\u0338'}, + "nang;": {'\u2220', '\u20D2'}, + "napE;": {'\u2A70', '\u0338'}, + "napid;": {'\u224B', '\u0338'}, + "nbump;": {'\u224E', '\u0338'}, + "nbumpe;": {'\u224F', '\u0338'}, + "ncongdot;": {'\u2A6D', '\u0338'}, + "nedot;": {'\u2250', '\u0338'}, + "nesim;": {'\u2242', '\u0338'}, + "ngE;": {'\u2267', '\u0338'}, + "ngeqq;": {'\u2267', '\u0338'}, + "ngeqslant;": {'\u2A7E', '\u0338'}, + "nges;": {'\u2A7E', '\u0338'}, + "nlE;": {'\u2266', '\u0338'}, + "nleqq;": {'\u2266', '\u0338'}, + "nleqslant;": {'\u2A7D', '\u0338'}, + "nles;": {'\u2A7D', '\u0338'}, + "notinE;": {'\u22F9', '\u0338'}, + "notindot;": {'\u22F5', '\u0338'}, + "nparsl;": {'\u2AFD', '\u20E5'}, + "npart;": {'\u2202', '\u0338'}, + "npre;": {'\u2AAF', '\u0338'}, + "npreceq;": {'\u2AAF', '\u0338'}, + "nrarrc;": {'\u2933', '\u0338'}, + "nrarrw;": {'\u219D', '\u0338'}, + "nsce;": {'\u2AB0', '\u0338'}, + "nsubE;": {'\u2AC5', '\u0338'}, + "nsubset;": {'\u2282', '\u20D2'}, + "nsubseteqq;": {'\u2AC5', '\u0338'}, + "nsucceq;": {'\u2AB0', '\u0338'}, + "nsupE;": {'\u2AC6', '\u0338'}, + "nsupset;": {'\u2283', '\u20D2'}, + "nsupseteqq;": {'\u2AC6', '\u0338'}, + "nvap;": {'\u224D', '\u20D2'}, + "nvge;": {'\u2265', '\u20D2'}, + "nvgt;": {'\u003E', '\u20D2'}, + "nvle;": {'\u2264', '\u20D2'}, + "nvlt;": {'\u003C', '\u20D2'}, + "nvltrie;": {'\u22B4', '\u20D2'}, + "nvrtrie;": {'\u22B5', '\u20D2'}, + "nvsim;": {'\u223C', '\u20D2'}, + "race;": {'\u223D', '\u0331'}, + "smtes;": {'\u2AAC', '\uFE00'}, + "sqcaps;": {'\u2293', '\uFE00'}, + "sqcups;": {'\u2294', '\uFE00'}, + "varsubsetneq;": {'\u228A', '\uFE00'}, + "varsubsetneqq;": {'\u2ACB', '\uFE00'}, + "varsupsetneq;": {'\u228B', '\uFE00'}, + "varsupsetneqq;": {'\u2ACC', '\uFE00'}, + "vnsub;": {'\u2282', '\u20D2'}, + "vnsup;": {'\u2283', '\u20D2'}, + "vsubnE;": {'\u2ACB', '\uFE00'}, + "vsubne;": {'\u228A', '\uFE00'}, + "vsupnE;": {'\u2ACC', '\uFE00'}, + "vsupne;": {'\u228B', '\uFE00'}, +} diff --git a/vendor/golang.org/x/net/html/entity_test.go b/vendor/golang.org/x/net/html/entity_test.go new file mode 100644 index 0000000000..b53f866fa2 --- /dev/null +++ b/vendor/golang.org/x/net/html/entity_test.go @@ -0,0 +1,29 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package html + +import ( + "testing" + "unicode/utf8" +) + +func TestEntityLength(t *testing.T) { + // We verify that the length of UTF-8 encoding of each value is <= 1 + len(key). + // The +1 comes from the leading "&". This property implies that the length of + // unescaped text is <= the length of escaped text. + for k, v := range entity { + if 1+len(k) < utf8.RuneLen(v) { + t.Error("escaped entity &" + k + " is shorter than its UTF-8 encoding " + string(v)) + } + if len(k) > longestEntityWithoutSemicolon && k[len(k)-1] != ';' { + t.Errorf("entity name %s is %d characters, but longestEntityWithoutSemicolon=%d", k, len(k), longestEntityWithoutSemicolon) + } + } + for k, v := range entity2 { + if 1+len(k) < utf8.RuneLen(v[0])+utf8.RuneLen(v[1]) { + t.Error("escaped entity &" + k + " is shorter than its UTF-8 encoding " + string(v[0]) + string(v[1])) + } + } +} diff --git a/vendor/golang.org/x/net/html/escape.go b/vendor/golang.org/x/net/html/escape.go new file mode 100644 index 0000000000..d856139620 --- /dev/null +++ b/vendor/golang.org/x/net/html/escape.go @@ -0,0 +1,258 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package html + +import ( + "bytes" + "strings" + "unicode/utf8" +) + +// These replacements permit compatibility with old numeric entities that +// assumed Windows-1252 encoding. +// https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference +var replacementTable = [...]rune{ + '\u20AC', // First entry is what 0x80 should be replaced with. + '\u0081', + '\u201A', + '\u0192', + '\u201E', + '\u2026', + '\u2020', + '\u2021', + '\u02C6', + '\u2030', + '\u0160', + '\u2039', + '\u0152', + '\u008D', + '\u017D', + '\u008F', + '\u0090', + '\u2018', + '\u2019', + '\u201C', + '\u201D', + '\u2022', + '\u2013', + '\u2014', + '\u02DC', + '\u2122', + '\u0161', + '\u203A', + '\u0153', + '\u009D', + '\u017E', + '\u0178', // Last entry is 0x9F. + // 0x00->'\uFFFD' is handled programmatically. + // 0x0D->'\u000D' is a no-op. +} + +// unescapeEntity reads an entity like "<" from b[src:] and writes the +// corresponding "<" to b[dst:], returning the incremented dst and src cursors. +// Precondition: b[src] == '&' && dst <= src. +// attribute should be true if parsing an attribute value. +func unescapeEntity(b []byte, dst, src int, attribute bool) (dst1, src1 int) { + // https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference + + // i starts at 1 because we already know that s[0] == '&'. + i, s := 1, b[src:] + + if len(s) <= 1 { + b[dst] = b[src] + return dst + 1, src + 1 + } + + if s[i] == '#' { + if len(s) <= 3 { // We need to have at least "&#.". + b[dst] = b[src] + return dst + 1, src + 1 + } + i++ + c := s[i] + hex := false + if c == 'x' || c == 'X' { + hex = true + i++ + } + + x := '\x00' + for i < len(s) { + c = s[i] + i++ + if hex { + if '0' <= c && c <= '9' { + x = 16*x + rune(c) - '0' + continue + } else if 'a' <= c && c <= 'f' { + x = 16*x + rune(c) - 'a' + 10 + continue + } else if 'A' <= c && c <= 'F' { + x = 16*x + rune(c) - 'A' + 10 + continue + } + } else if '0' <= c && c <= '9' { + x = 10*x + rune(c) - '0' + continue + } + if c != ';' { + i-- + } + break + } + + if i <= 3 { // No characters matched. + b[dst] = b[src] + return dst + 1, src + 1 + } + + if 0x80 <= x && x <= 0x9F { + // Replace characters from Windows-1252 with UTF-8 equivalents. + x = replacementTable[x-0x80] + } else if x == 0 || (0xD800 <= x && x <= 0xDFFF) || x > 0x10FFFF { + // Replace invalid characters with the replacement character. + x = '\uFFFD' + } + + return dst + utf8.EncodeRune(b[dst:], x), src + i + } + + // Consume the maximum number of characters possible, with the + // consumed characters matching one of the named references. + + for i < len(s) { + c := s[i] + i++ + // Lower-cased characters are more common in entities, so we check for them first. + if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { + continue + } + if c != ';' { + i-- + } + break + } + + entityName := string(s[1:i]) + if entityName == "" { + // No-op. + } else if attribute && entityName[len(entityName)-1] != ';' && len(s) > i && s[i] == '=' { + // No-op. + } else if x := entity[entityName]; x != 0 { + return dst + utf8.EncodeRune(b[dst:], x), src + i + } else if x := entity2[entityName]; x[0] != 0 { + dst1 := dst + utf8.EncodeRune(b[dst:], x[0]) + return dst1 + utf8.EncodeRune(b[dst1:], x[1]), src + i + } else if !attribute { + maxLen := len(entityName) - 1 + if maxLen > longestEntityWithoutSemicolon { + maxLen = longestEntityWithoutSemicolon + } + for j := maxLen; j > 1; j-- { + if x := entity[entityName[:j]]; x != 0 { + return dst + utf8.EncodeRune(b[dst:], x), src + j + 1 + } + } + } + + dst1, src1 = dst+i, src+i + copy(b[dst:dst1], b[src:src1]) + return dst1, src1 +} + +// unescape unescapes b's entities in-place, so that "a<b" becomes "a': + esc = ">" + case '"': + // """ is shorter than """. + esc = """ + case '\r': + esc = " " + default: + panic("unrecognized escape character") + } + s = s[i+1:] + if _, err := w.WriteString(esc); err != nil { + return err + } + i = strings.IndexAny(s, escapedChars) + } + _, err := w.WriteString(s) + return err +} + +// EscapeString escapes special characters like "<" to become "<". It +// escapes only five such characters: <, >, &, ' and ". +// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't +// always true. +func EscapeString(s string) string { + if strings.IndexAny(s, escapedChars) == -1 { + return s + } + var buf bytes.Buffer + escape(&buf, s) + return buf.String() +} + +// UnescapeString unescapes entities like "<" to become "<". It unescapes a +// larger range of entities than EscapeString escapes. For example, "á" +// unescapes to "á", as does "á" and "&xE1;". +// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't +// always true. +func UnescapeString(s string) string { + for _, c := range s { + if c == '&' { + return string(unescape([]byte(s), false)) + } + } + return s +} diff --git a/vendor/golang.org/x/net/html/escape_test.go b/vendor/golang.org/x/net/html/escape_test.go new file mode 100644 index 0000000000..b405d4b4a7 --- /dev/null +++ b/vendor/golang.org/x/net/html/escape_test.go @@ -0,0 +1,97 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package html + +import "testing" + +type unescapeTest struct { + // A short description of the test case. + desc string + // The HTML text. + html string + // The unescaped text. + unescaped string +} + +var unescapeTests = []unescapeTest{ + // Handle no entities. + { + "copy", + "A\ttext\nstring", + "A\ttext\nstring", + }, + // Handle simple named entities. + { + "simple", + "& > <", + "& > <", + }, + // Handle hitting the end of the string. + { + "stringEnd", + "& &", + "& &", + }, + // Handle entities with two codepoints. + { + "multiCodepoint", + "text ⋛︀ blah", + "text \u22db\ufe00 blah", + }, + // Handle decimal numeric entities. + { + "decimalEntity", + "Delta = Δ ", + "Delta = Δ ", + }, + // Handle hexadecimal numeric entities. + { + "hexadecimalEntity", + "Lambda = λ = λ ", + "Lambda = λ = λ ", + }, + // Handle numeric early termination. + { + "numericEnds", + "&# &#x €43 © = ©f = ©", + "&# &#x €43 © = ©f = ©", + }, + // Handle numeric ISO-8859-1 entity replacements. + { + "numericReplacements", + "Footnote‡", + "Footnote‡", + }, +} + +func TestUnescape(t *testing.T) { + for _, tt := range unescapeTests { + unescaped := UnescapeString(tt.html) + if unescaped != tt.unescaped { + t.Errorf("TestUnescape %s: want %q, got %q", tt.desc, tt.unescaped, unescaped) + } + } +} + +func TestUnescapeEscape(t *testing.T) { + ss := []string{ + ``, + `abc def`, + `a & b`, + `a&b`, + `a & b`, + `"`, + `"`, + `"<&>"`, + `"<&>"`, + `3&5==1 && 0<1, "0<1", a+acute=á`, + `The special characters are: <, >, &, ' and "`, + } + for _, s := range ss { + if got := UnescapeString(EscapeString(s)); got != s { + t.Errorf("got %q want %q", got, s) + } + } +} diff --git a/vendor/golang.org/x/net/html/example_test.go b/vendor/golang.org/x/net/html/example_test.go new file mode 100644 index 0000000000..0b06ed7730 --- /dev/null +++ b/vendor/golang.org/x/net/html/example_test.go @@ -0,0 +1,40 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This example demonstrates parsing HTML data and walking the resulting tree. +package html_test + +import ( + "fmt" + "log" + "strings" + + "golang.org/x/net/html" +) + +func ExampleParse() { + s := `

Links:

` + doc, err := html.Parse(strings.NewReader(s)) + if err != nil { + log.Fatal(err) + } + var f func(*html.Node) + f = func(n *html.Node) { + if n.Type == html.ElementNode && n.Data == "a" { + for _, a := range n.Attr { + if a.Key == "href" { + fmt.Println(a.Val) + break + } + } + } + for c := n.FirstChild; c != nil; c = c.NextSibling { + f(c) + } + } + f(doc) + // Output: + // foo + // /bar/baz +} diff --git a/vendor/golang.org/x/net/html/foreign.go b/vendor/golang.org/x/net/html/foreign.go new file mode 100644 index 0000000000..d3b3844099 --- /dev/null +++ b/vendor/golang.org/x/net/html/foreign.go @@ -0,0 +1,226 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package html + +import ( + "strings" +) + +func adjustAttributeNames(aa []Attribute, nameMap map[string]string) { + for i := range aa { + if newName, ok := nameMap[aa[i].Key]; ok { + aa[i].Key = newName + } + } +} + +func adjustForeignAttributes(aa []Attribute) { + for i, a := range aa { + if a.Key == "" || a.Key[0] != 'x' { + continue + } + switch a.Key { + case "xlink:actuate", "xlink:arcrole", "xlink:href", "xlink:role", "xlink:show", + "xlink:title", "xlink:type", "xml:base", "xml:lang", "xml:space", "xmlns:xlink": + j := strings.Index(a.Key, ":") + aa[i].Namespace = a.Key[:j] + aa[i].Key = a.Key[j+1:] + } + } +} + +func htmlIntegrationPoint(n *Node) bool { + if n.Type != ElementNode { + return false + } + switch n.Namespace { + case "math": + if n.Data == "annotation-xml" { + for _, a := range n.Attr { + if a.Key == "encoding" { + val := strings.ToLower(a.Val) + if val == "text/html" || val == "application/xhtml+xml" { + return true + } + } + } + } + case "svg": + switch n.Data { + case "desc", "foreignObject", "title": + return true + } + } + return false +} + +func mathMLTextIntegrationPoint(n *Node) bool { + if n.Namespace != "math" { + return false + } + switch n.Data { + case "mi", "mo", "mn", "ms", "mtext": + return true + } + return false +} + +// Section 12.2.5.5. +var breakout = map[string]bool{ + "b": true, + "big": true, + "blockquote": true, + "body": true, + "br": true, + "center": true, + "code": true, + "dd": true, + "div": true, + "dl": true, + "dt": true, + "em": true, + "embed": true, + "h1": true, + "h2": true, + "h3": true, + "h4": true, + "h5": true, + "h6": true, + "head": true, + "hr": true, + "i": true, + "img": true, + "li": true, + "listing": true, + "menu": true, + "meta": true, + "nobr": true, + "ol": true, + "p": true, + "pre": true, + "ruby": true, + "s": true, + "small": true, + "span": true, + "strong": true, + "strike": true, + "sub": true, + "sup": true, + "table": true, + "tt": true, + "u": true, + "ul": true, + "var": true, +} + +// Section 12.2.5.5. +var svgTagNameAdjustments = map[string]string{ + "altglyph": "altGlyph", + "altglyphdef": "altGlyphDef", + "altglyphitem": "altGlyphItem", + "animatecolor": "animateColor", + "animatemotion": "animateMotion", + "animatetransform": "animateTransform", + "clippath": "clipPath", + "feblend": "feBlend", + "fecolormatrix": "feColorMatrix", + "fecomponenttransfer": "feComponentTransfer", + "fecomposite": "feComposite", + "feconvolvematrix": "feConvolveMatrix", + "fediffuselighting": "feDiffuseLighting", + "fedisplacementmap": "feDisplacementMap", + "fedistantlight": "feDistantLight", + "feflood": "feFlood", + "fefunca": "feFuncA", + "fefuncb": "feFuncB", + "fefuncg": "feFuncG", + "fefuncr": "feFuncR", + "fegaussianblur": "feGaussianBlur", + "feimage": "feImage", + "femerge": "feMerge", + "femergenode": "feMergeNode", + "femorphology": "feMorphology", + "feoffset": "feOffset", + "fepointlight": "fePointLight", + "fespecularlighting": "feSpecularLighting", + "fespotlight": "feSpotLight", + "fetile": "feTile", + "feturbulence": "feTurbulence", + "foreignobject": "foreignObject", + "glyphref": "glyphRef", + "lineargradient": "linearGradient", + "radialgradient": "radialGradient", + "textpath": "textPath", +} + +// Section 12.2.5.1 +var mathMLAttributeAdjustments = map[string]string{ + "definitionurl": "definitionURL", +} + +var svgAttributeAdjustments = map[string]string{ + "attributename": "attributeName", + "attributetype": "attributeType", + "basefrequency": "baseFrequency", + "baseprofile": "baseProfile", + "calcmode": "calcMode", + "clippathunits": "clipPathUnits", + "contentscripttype": "contentScriptType", + "contentstyletype": "contentStyleType", + "diffuseconstant": "diffuseConstant", + "edgemode": "edgeMode", + "externalresourcesrequired": "externalResourcesRequired", + "filterres": "filterRes", + "filterunits": "filterUnits", + "glyphref": "glyphRef", + "gradienttransform": "gradientTransform", + "gradientunits": "gradientUnits", + "kernelmatrix": "kernelMatrix", + "kernelunitlength": "kernelUnitLength", + "keypoints": "keyPoints", + "keysplines": "keySplines", + "keytimes": "keyTimes", + "lengthadjust": "lengthAdjust", + "limitingconeangle": "limitingConeAngle", + "markerheight": "markerHeight", + "markerunits": "markerUnits", + "markerwidth": "markerWidth", + "maskcontentunits": "maskContentUnits", + "maskunits": "maskUnits", + "numoctaves": "numOctaves", + "pathlength": "pathLength", + "patterncontentunits": "patternContentUnits", + "patterntransform": "patternTransform", + "patternunits": "patternUnits", + "pointsatx": "pointsAtX", + "pointsaty": "pointsAtY", + "pointsatz": "pointsAtZ", + "preservealpha": "preserveAlpha", + "preserveaspectratio": "preserveAspectRatio", + "primitiveunits": "primitiveUnits", + "refx": "refX", + "refy": "refY", + "repeatcount": "repeatCount", + "repeatdur": "repeatDur", + "requiredextensions": "requiredExtensions", + "requiredfeatures": "requiredFeatures", + "specularconstant": "specularConstant", + "specularexponent": "specularExponent", + "spreadmethod": "spreadMethod", + "startoffset": "startOffset", + "stddeviation": "stdDeviation", + "stitchtiles": "stitchTiles", + "surfacescale": "surfaceScale", + "systemlanguage": "systemLanguage", + "tablevalues": "tableValues", + "targetx": "targetX", + "targety": "targetY", + "textlength": "textLength", + "viewbox": "viewBox", + "viewtarget": "viewTarget", + "xchannelselector": "xChannelSelector", + "ychannelselector": "yChannelSelector", + "zoomandpan": "zoomAndPan", +} diff --git a/vendor/golang.org/x/net/html/node.go b/vendor/golang.org/x/net/html/node.go new file mode 100644 index 0000000000..26b657aec8 --- /dev/null +++ b/vendor/golang.org/x/net/html/node.go @@ -0,0 +1,193 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package html + +import ( + "golang.org/x/net/html/atom" +) + +// A NodeType is the type of a Node. +type NodeType uint32 + +const ( + ErrorNode NodeType = iota + TextNode + DocumentNode + ElementNode + CommentNode + DoctypeNode + scopeMarkerNode +) + +// Section 12.2.3.3 says "scope markers are inserted when entering applet +// elements, buttons, object elements, marquees, table cells, and table +// captions, and are used to prevent formatting from 'leaking'". +var scopeMarker = Node{Type: scopeMarkerNode} + +// A Node consists of a NodeType and some Data (tag name for element nodes, +// content for text) and are part of a tree of Nodes. Element nodes may also +// have a Namespace and contain a slice of Attributes. Data is unescaped, so +// that it looks like "a 0 { + return (*s)[i-1] + } + return nil +} + +// index returns the index of the top-most occurrence of n in the stack, or -1 +// if n is not present. +func (s *nodeStack) index(n *Node) int { + for i := len(*s) - 1; i >= 0; i-- { + if (*s)[i] == n { + return i + } + } + return -1 +} + +// insert inserts a node at the given index. +func (s *nodeStack) insert(i int, n *Node) { + (*s) = append(*s, nil) + copy((*s)[i+1:], (*s)[i:]) + (*s)[i] = n +} + +// remove removes a node from the stack. It is a no-op if n is not present. +func (s *nodeStack) remove(n *Node) { + i := s.index(n) + if i == -1 { + return + } + copy((*s)[i:], (*s)[i+1:]) + j := len(*s) - 1 + (*s)[j] = nil + *s = (*s)[:j] +} diff --git a/vendor/golang.org/x/net/html/node_test.go b/vendor/golang.org/x/net/html/node_test.go new file mode 100644 index 0000000000..471102f3a2 --- /dev/null +++ b/vendor/golang.org/x/net/html/node_test.go @@ -0,0 +1,146 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package html + +import ( + "fmt" +) + +// checkTreeConsistency checks that a node and its descendants are all +// consistent in their parent/child/sibling relationships. +func checkTreeConsistency(n *Node) error { + return checkTreeConsistency1(n, 0) +} + +func checkTreeConsistency1(n *Node, depth int) error { + if depth == 1e4 { + return fmt.Errorf("html: tree looks like it contains a cycle") + } + if err := checkNodeConsistency(n); err != nil { + return err + } + for c := n.FirstChild; c != nil; c = c.NextSibling { + if err := checkTreeConsistency1(c, depth+1); err != nil { + return err + } + } + return nil +} + +// checkNodeConsistency checks that a node's parent/child/sibling relationships +// are consistent. +func checkNodeConsistency(n *Node) error { + if n == nil { + return nil + } + + nParent := 0 + for p := n.Parent; p != nil; p = p.Parent { + nParent++ + if nParent == 1e4 { + return fmt.Errorf("html: parent list looks like an infinite loop") + } + } + + nForward := 0 + for c := n.FirstChild; c != nil; c = c.NextSibling { + nForward++ + if nForward == 1e6 { + return fmt.Errorf("html: forward list of children looks like an infinite loop") + } + if c.Parent != n { + return fmt.Errorf("html: inconsistent child/parent relationship") + } + } + + nBackward := 0 + for c := n.LastChild; c != nil; c = c.PrevSibling { + nBackward++ + if nBackward == 1e6 { + return fmt.Errorf("html: backward list of children looks like an infinite loop") + } + if c.Parent != n { + return fmt.Errorf("html: inconsistent child/parent relationship") + } + } + + if n.Parent != nil { + if n.Parent == n { + return fmt.Errorf("html: inconsistent parent relationship") + } + if n.Parent == n.FirstChild { + return fmt.Errorf("html: inconsistent parent/first relationship") + } + if n.Parent == n.LastChild { + return fmt.Errorf("html: inconsistent parent/last relationship") + } + if n.Parent == n.PrevSibling { + return fmt.Errorf("html: inconsistent parent/prev relationship") + } + if n.Parent == n.NextSibling { + return fmt.Errorf("html: inconsistent parent/next relationship") + } + + parentHasNAsAChild := false + for c := n.Parent.FirstChild; c != nil; c = c.NextSibling { + if c == n { + parentHasNAsAChild = true + break + } + } + if !parentHasNAsAChild { + return fmt.Errorf("html: inconsistent parent/child relationship") + } + } + + if n.PrevSibling != nil && n.PrevSibling.NextSibling != n { + return fmt.Errorf("html: inconsistent prev/next relationship") + } + if n.NextSibling != nil && n.NextSibling.PrevSibling != n { + return fmt.Errorf("html: inconsistent next/prev relationship") + } + + if (n.FirstChild == nil) != (n.LastChild == nil) { + return fmt.Errorf("html: inconsistent first/last relationship") + } + if n.FirstChild != nil && n.FirstChild == n.LastChild { + // We have a sole child. + if n.FirstChild.PrevSibling != nil || n.FirstChild.NextSibling != nil { + return fmt.Errorf("html: inconsistent sole child's sibling relationship") + } + } + + seen := map[*Node]bool{} + + var last *Node + for c := n.FirstChild; c != nil; c = c.NextSibling { + if seen[c] { + return fmt.Errorf("html: inconsistent repeated child") + } + seen[c] = true + last = c + } + if last != n.LastChild { + return fmt.Errorf("html: inconsistent last relationship") + } + + var first *Node + for c := n.LastChild; c != nil; c = c.PrevSibling { + if !seen[c] { + return fmt.Errorf("html: inconsistent missing child") + } + delete(seen, c) + first = c + } + if first != n.FirstChild { + return fmt.Errorf("html: inconsistent first relationship") + } + + if len(seen) != 0 { + return fmt.Errorf("html: inconsistent forwards/backwards child list") + } + + return nil +} diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go new file mode 100644 index 0000000000..be4b2bf5aa --- /dev/null +++ b/vendor/golang.org/x/net/html/parse.go @@ -0,0 +1,2094 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package html + +import ( + "errors" + "fmt" + "io" + "strings" + + a "golang.org/x/net/html/atom" +) + +// A parser implements the HTML5 parsing algorithm: +// https://html.spec.whatwg.org/multipage/syntax.html#tree-construction +type parser struct { + // tokenizer provides the tokens for the parser. + tokenizer *Tokenizer + // tok is the most recently read token. + tok Token + // Self-closing tags like
are treated as start tags, except that + // hasSelfClosingToken is set while they are being processed. + hasSelfClosingToken bool + // doc is the document root element. + doc *Node + // The stack of open elements (section 12.2.3.2) and active formatting + // elements (section 12.2.3.3). + oe, afe nodeStack + // Element pointers (section 12.2.3.4). + head, form *Node + // Other parsing state flags (section 12.2.3.5). + scripting, framesetOK bool + // im is the current insertion mode. + im insertionMode + // originalIM is the insertion mode to go back to after completing a text + // or inTableText insertion mode. + originalIM insertionMode + // fosterParenting is whether new elements should be inserted according to + // the foster parenting rules (section 12.2.5.3). + fosterParenting bool + // quirks is whether the parser is operating in "quirks mode." + quirks bool + // fragment is whether the parser is parsing an HTML fragment. + fragment bool + // context is the context element when parsing an HTML fragment + // (section 12.4). + context *Node +} + +func (p *parser) top() *Node { + if n := p.oe.top(); n != nil { + return n + } + return p.doc +} + +// Stop tags for use in popUntil. These come from section 12.2.3.2. +var ( + defaultScopeStopTags = map[string][]a.Atom{ + "": {a.Applet, a.Caption, a.Html, a.Table, a.Td, a.Th, a.Marquee, a.Object, a.Template}, + "math": {a.AnnotationXml, a.Mi, a.Mn, a.Mo, a.Ms, a.Mtext}, + "svg": {a.Desc, a.ForeignObject, a.Title}, + } +) + +type scope int + +const ( + defaultScope scope = iota + listItemScope + buttonScope + tableScope + tableRowScope + tableBodyScope + selectScope +) + +// popUntil pops the stack of open elements at the highest element whose tag +// is in matchTags, provided there is no higher element in the scope's stop +// tags (as defined in section 12.2.3.2). It returns whether or not there was +// such an element. If there was not, popUntil leaves the stack unchanged. +// +// For example, the set of stop tags for table scope is: "html", "table". If +// the stack was: +// ["html", "body", "font", "table", "b", "i", "u"] +// then popUntil(tableScope, "font") would return false, but +// popUntil(tableScope, "i") would return true and the stack would become: +// ["html", "body", "font", "table", "b"] +// +// If an element's tag is in both the stop tags and matchTags, then the stack +// will be popped and the function returns true (provided, of course, there was +// no higher element in the stack that was also in the stop tags). For example, +// popUntil(tableScope, "table") returns true and leaves: +// ["html", "body", "font"] +func (p *parser) popUntil(s scope, matchTags ...a.Atom) bool { + if i := p.indexOfElementInScope(s, matchTags...); i != -1 { + p.oe = p.oe[:i] + return true + } + return false +} + +// indexOfElementInScope returns the index in p.oe of the highest element whose +// tag is in matchTags that is in scope. If no matching element is in scope, it +// returns -1. +func (p *parser) indexOfElementInScope(s scope, matchTags ...a.Atom) int { + for i := len(p.oe) - 1; i >= 0; i-- { + tagAtom := p.oe[i].DataAtom + if p.oe[i].Namespace == "" { + for _, t := range matchTags { + if t == tagAtom { + return i + } + } + switch s { + case defaultScope: + // No-op. + case listItemScope: + if tagAtom == a.Ol || tagAtom == a.Ul { + return -1 + } + case buttonScope: + if tagAtom == a.Button { + return -1 + } + case tableScope: + if tagAtom == a.Html || tagAtom == a.Table { + return -1 + } + case selectScope: + if tagAtom != a.Optgroup && tagAtom != a.Option { + return -1 + } + default: + panic("unreachable") + } + } + switch s { + case defaultScope, listItemScope, buttonScope: + for _, t := range defaultScopeStopTags[p.oe[i].Namespace] { + if t == tagAtom { + return -1 + } + } + } + } + return -1 +} + +// elementInScope is like popUntil, except that it doesn't modify the stack of +// open elements. +func (p *parser) elementInScope(s scope, matchTags ...a.Atom) bool { + return p.indexOfElementInScope(s, matchTags...) != -1 +} + +// clearStackToContext pops elements off the stack of open elements until a +// scope-defined element is found. +func (p *parser) clearStackToContext(s scope) { + for i := len(p.oe) - 1; i >= 0; i-- { + tagAtom := p.oe[i].DataAtom + switch s { + case tableScope: + if tagAtom == a.Html || tagAtom == a.Table { + p.oe = p.oe[:i+1] + return + } + case tableRowScope: + if tagAtom == a.Html || tagAtom == a.Tr { + p.oe = p.oe[:i+1] + return + } + case tableBodyScope: + if tagAtom == a.Html || tagAtom == a.Tbody || tagAtom == a.Tfoot || tagAtom == a.Thead { + p.oe = p.oe[:i+1] + return + } + default: + panic("unreachable") + } + } +} + +// generateImpliedEndTags pops nodes off the stack of open elements as long as +// the top node has a tag name of dd, dt, li, option, optgroup, p, rp, or rt. +// If exceptions are specified, nodes with that name will not be popped off. +func (p *parser) generateImpliedEndTags(exceptions ...string) { + var i int +loop: + for i = len(p.oe) - 1; i >= 0; i-- { + n := p.oe[i] + if n.Type == ElementNode { + switch n.DataAtom { + case a.Dd, a.Dt, a.Li, a.Option, a.Optgroup, a.P, a.Rp, a.Rt: + for _, except := range exceptions { + if n.Data == except { + break loop + } + } + continue + } + } + break + } + + p.oe = p.oe[:i+1] +} + +// addChild adds a child node n to the top element, and pushes n onto the stack +// of open elements if it is an element node. +func (p *parser) addChild(n *Node) { + if p.shouldFosterParent() { + p.fosterParent(n) + } else { + p.top().AppendChild(n) + } + + if n.Type == ElementNode { + p.oe = append(p.oe, n) + } +} + +// shouldFosterParent returns whether the next node to be added should be +// foster parented. +func (p *parser) shouldFosterParent() bool { + if p.fosterParenting { + switch p.top().DataAtom { + case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr: + return true + } + } + return false +} + +// fosterParent adds a child node according to the foster parenting rules. +// Section 12.2.5.3, "foster parenting". +func (p *parser) fosterParent(n *Node) { + var table, parent, prev *Node + var i int + for i = len(p.oe) - 1; i >= 0; i-- { + if p.oe[i].DataAtom == a.Table { + table = p.oe[i] + break + } + } + + if table == nil { + // The foster parent is the html element. + parent = p.oe[0] + } else { + parent = table.Parent + } + if parent == nil { + parent = p.oe[i-1] + } + + if table != nil { + prev = table.PrevSibling + } else { + prev = parent.LastChild + } + if prev != nil && prev.Type == TextNode && n.Type == TextNode { + prev.Data += n.Data + return + } + + parent.InsertBefore(n, table) +} + +// addText adds text to the preceding node if it is a text node, or else it +// calls addChild with a new text node. +func (p *parser) addText(text string) { + if text == "" { + return + } + + if p.shouldFosterParent() { + p.fosterParent(&Node{ + Type: TextNode, + Data: text, + }) + return + } + + t := p.top() + if n := t.LastChild; n != nil && n.Type == TextNode { + n.Data += text + return + } + p.addChild(&Node{ + Type: TextNode, + Data: text, + }) +} + +// addElement adds a child element based on the current token. +func (p *parser) addElement() { + p.addChild(&Node{ + Type: ElementNode, + DataAtom: p.tok.DataAtom, + Data: p.tok.Data, + Attr: p.tok.Attr, + }) +} + +// Section 12.2.3.3. +func (p *parser) addFormattingElement() { + tagAtom, attr := p.tok.DataAtom, p.tok.Attr + p.addElement() + + // Implement the Noah's Ark clause, but with three per family instead of two. + identicalElements := 0 +findIdenticalElements: + for i := len(p.afe) - 1; i >= 0; i-- { + n := p.afe[i] + if n.Type == scopeMarkerNode { + break + } + if n.Type != ElementNode { + continue + } + if n.Namespace != "" { + continue + } + if n.DataAtom != tagAtom { + continue + } + if len(n.Attr) != len(attr) { + continue + } + compareAttributes: + for _, t0 := range n.Attr { + for _, t1 := range attr { + if t0.Key == t1.Key && t0.Namespace == t1.Namespace && t0.Val == t1.Val { + // Found a match for this attribute, continue with the next attribute. + continue compareAttributes + } + } + // If we get here, there is no attribute that matches a. + // Therefore the element is not identical to the new one. + continue findIdenticalElements + } + + identicalElements++ + if identicalElements >= 3 { + p.afe.remove(n) + } + } + + p.afe = append(p.afe, p.top()) +} + +// Section 12.2.3.3. +func (p *parser) clearActiveFormattingElements() { + for { + n := p.afe.pop() + if len(p.afe) == 0 || n.Type == scopeMarkerNode { + return + } + } +} + +// Section 12.2.3.3. +func (p *parser) reconstructActiveFormattingElements() { + n := p.afe.top() + if n == nil { + return + } + if n.Type == scopeMarkerNode || p.oe.index(n) != -1 { + return + } + i := len(p.afe) - 1 + for n.Type != scopeMarkerNode && p.oe.index(n) == -1 { + if i == 0 { + i = -1 + break + } + i-- + n = p.afe[i] + } + for { + i++ + clone := p.afe[i].clone() + p.addChild(clone) + p.afe[i] = clone + if i == len(p.afe)-1 { + break + } + } +} + +// Section 12.2.4. +func (p *parser) acknowledgeSelfClosingTag() { + p.hasSelfClosingToken = false +} + +// An insertion mode (section 12.2.3.1) is the state transition function from +// a particular state in the HTML5 parser's state machine. It updates the +// parser's fields depending on parser.tok (where ErrorToken means EOF). +// It returns whether the token was consumed. +type insertionMode func(*parser) bool + +// setOriginalIM sets the insertion mode to return to after completing a text or +// inTableText insertion mode. +// Section 12.2.3.1, "using the rules for". +func (p *parser) setOriginalIM() { + if p.originalIM != nil { + panic("html: bad parser state: originalIM was set twice") + } + p.originalIM = p.im +} + +// Section 12.2.3.1, "reset the insertion mode". +func (p *parser) resetInsertionMode() { + for i := len(p.oe) - 1; i >= 0; i-- { + n := p.oe[i] + if i == 0 && p.context != nil { + n = p.context + } + + switch n.DataAtom { + case a.Select: + p.im = inSelectIM + case a.Td, a.Th: + p.im = inCellIM + case a.Tr: + p.im = inRowIM + case a.Tbody, a.Thead, a.Tfoot: + p.im = inTableBodyIM + case a.Caption: + p.im = inCaptionIM + case a.Colgroup: + p.im = inColumnGroupIM + case a.Table: + p.im = inTableIM + case a.Head: + p.im = inBodyIM + case a.Body: + p.im = inBodyIM + case a.Frameset: + p.im = inFramesetIM + case a.Html: + p.im = beforeHeadIM + default: + continue + } + return + } + p.im = inBodyIM +} + +const whitespace = " \t\r\n\f" + +// Section 12.2.5.4.1. +func initialIM(p *parser) bool { + switch p.tok.Type { + case TextToken: + p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) + if len(p.tok.Data) == 0 { + // It was all whitespace, so ignore it. + return true + } + case CommentToken: + p.doc.AppendChild(&Node{ + Type: CommentNode, + Data: p.tok.Data, + }) + return true + case DoctypeToken: + n, quirks := parseDoctype(p.tok.Data) + p.doc.AppendChild(n) + p.quirks = quirks + p.im = beforeHTMLIM + return true + } + p.quirks = true + p.im = beforeHTMLIM + return false +} + +// Section 12.2.5.4.2. +func beforeHTMLIM(p *parser) bool { + switch p.tok.Type { + case DoctypeToken: + // Ignore the token. + return true + case TextToken: + p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) + if len(p.tok.Data) == 0 { + // It was all whitespace, so ignore it. + return true + } + case StartTagToken: + if p.tok.DataAtom == a.Html { + p.addElement() + p.im = beforeHeadIM + return true + } + case EndTagToken: + switch p.tok.DataAtom { + case a.Head, a.Body, a.Html, a.Br: + p.parseImpliedToken(StartTagToken, a.Html, a.Html.String()) + return false + default: + // Ignore the token. + return true + } + case CommentToken: + p.doc.AppendChild(&Node{ + Type: CommentNode, + Data: p.tok.Data, + }) + return true + } + p.parseImpliedToken(StartTagToken, a.Html, a.Html.String()) + return false +} + +// Section 12.2.5.4.3. +func beforeHeadIM(p *parser) bool { + switch p.tok.Type { + case TextToken: + p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) + if len(p.tok.Data) == 0 { + // It was all whitespace, so ignore it. + return true + } + case StartTagToken: + switch p.tok.DataAtom { + case a.Head: + p.addElement() + p.head = p.top() + p.im = inHeadIM + return true + case a.Html: + return inBodyIM(p) + } + case EndTagToken: + switch p.tok.DataAtom { + case a.Head, a.Body, a.Html, a.Br: + p.parseImpliedToken(StartTagToken, a.Head, a.Head.String()) + return false + default: + // Ignore the token. + return true + } + case CommentToken: + p.addChild(&Node{ + Type: CommentNode, + Data: p.tok.Data, + }) + return true + case DoctypeToken: + // Ignore the token. + return true + } + + p.parseImpliedToken(StartTagToken, a.Head, a.Head.String()) + return false +} + +// Section 12.2.5.4.4. +func inHeadIM(p *parser) bool { + switch p.tok.Type { + case TextToken: + s := strings.TrimLeft(p.tok.Data, whitespace) + if len(s) < len(p.tok.Data) { + // Add the initial whitespace to the current node. + p.addText(p.tok.Data[:len(p.tok.Data)-len(s)]) + if s == "" { + return true + } + p.tok.Data = s + } + case StartTagToken: + switch p.tok.DataAtom { + case a.Html: + return inBodyIM(p) + case a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta: + p.addElement() + p.oe.pop() + p.acknowledgeSelfClosingTag() + return true + case a.Script, a.Title, a.Noscript, a.Noframes, a.Style: + p.addElement() + p.setOriginalIM() + p.im = textIM + return true + case a.Head: + // Ignore the token. + return true + } + case EndTagToken: + switch p.tok.DataAtom { + case a.Head: + n := p.oe.pop() + if n.DataAtom != a.Head { + panic("html: bad parser state: element not found, in the in-head insertion mode") + } + p.im = afterHeadIM + return true + case a.Body, a.Html, a.Br: + p.parseImpliedToken(EndTagToken, a.Head, a.Head.String()) + return false + default: + // Ignore the token. + return true + } + case CommentToken: + p.addChild(&Node{ + Type: CommentNode, + Data: p.tok.Data, + }) + return true + case DoctypeToken: + // Ignore the token. + return true + } + + p.parseImpliedToken(EndTagToken, a.Head, a.Head.String()) + return false +} + +// Section 12.2.5.4.6. +func afterHeadIM(p *parser) bool { + switch p.tok.Type { + case TextToken: + s := strings.TrimLeft(p.tok.Data, whitespace) + if len(s) < len(p.tok.Data) { + // Add the initial whitespace to the current node. + p.addText(p.tok.Data[:len(p.tok.Data)-len(s)]) + if s == "" { + return true + } + p.tok.Data = s + } + case StartTagToken: + switch p.tok.DataAtom { + case a.Html: + return inBodyIM(p) + case a.Body: + p.addElement() + p.framesetOK = false + p.im = inBodyIM + return true + case a.Frameset: + p.addElement() + p.im = inFramesetIM + return true + case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Title: + p.oe = append(p.oe, p.head) + defer p.oe.remove(p.head) + return inHeadIM(p) + case a.Head: + // Ignore the token. + return true + } + case EndTagToken: + switch p.tok.DataAtom { + case a.Body, a.Html, a.Br: + // Drop down to creating an implied tag. + default: + // Ignore the token. + return true + } + case CommentToken: + p.addChild(&Node{ + Type: CommentNode, + Data: p.tok.Data, + }) + return true + case DoctypeToken: + // Ignore the token. + return true + } + + p.parseImpliedToken(StartTagToken, a.Body, a.Body.String()) + p.framesetOK = true + return false +} + +// copyAttributes copies attributes of src not found on dst to dst. +func copyAttributes(dst *Node, src Token) { + if len(src.Attr) == 0 { + return + } + attr := map[string]string{} + for _, t := range dst.Attr { + attr[t.Key] = t.Val + } + for _, t := range src.Attr { + if _, ok := attr[t.Key]; !ok { + dst.Attr = append(dst.Attr, t) + attr[t.Key] = t.Val + } + } +} + +// Section 12.2.5.4.7. +func inBodyIM(p *parser) bool { + switch p.tok.Type { + case TextToken: + d := p.tok.Data + switch n := p.oe.top(); n.DataAtom { + case a.Pre, a.Listing: + if n.FirstChild == nil { + // Ignore a newline at the start of a
 block.
+				if d != "" && d[0] == '\r' {
+					d = d[1:]
+				}
+				if d != "" && d[0] == '\n' {
+					d = d[1:]
+				}
+			}
+		}
+		d = strings.Replace(d, "\x00", "", -1)
+		if d == "" {
+			return true
+		}
+		p.reconstructActiveFormattingElements()
+		p.addText(d)
+		if p.framesetOK && strings.TrimLeft(d, whitespace) != "" {
+			// There were non-whitespace characters inserted.
+			p.framesetOK = false
+		}
+	case StartTagToken:
+		switch p.tok.DataAtom {
+		case a.Html:
+			copyAttributes(p.oe[0], p.tok)
+		case a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Title:
+			return inHeadIM(p)
+		case a.Body:
+			if len(p.oe) >= 2 {
+				body := p.oe[1]
+				if body.Type == ElementNode && body.DataAtom == a.Body {
+					p.framesetOK = false
+					copyAttributes(body, p.tok)
+				}
+			}
+		case a.Frameset:
+			if !p.framesetOK || len(p.oe) < 2 || p.oe[1].DataAtom != a.Body {
+				// Ignore the token.
+				return true
+			}
+			body := p.oe[1]
+			if body.Parent != nil {
+				body.Parent.RemoveChild(body)
+			}
+			p.oe = p.oe[:1]
+			p.addElement()
+			p.im = inFramesetIM
+			return true
+		case a.Address, a.Article, a.Aside, a.Blockquote, a.Center, a.Details, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Menu, a.Nav, a.Ol, a.P, a.Section, a.Summary, a.Ul:
+			p.popUntil(buttonScope, a.P)
+			p.addElement()
+		case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
+			p.popUntil(buttonScope, a.P)
+			switch n := p.top(); n.DataAtom {
+			case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
+				p.oe.pop()
+			}
+			p.addElement()
+		case a.Pre, a.Listing:
+			p.popUntil(buttonScope, a.P)
+			p.addElement()
+			// The newline, if any, will be dealt with by the TextToken case.
+			p.framesetOK = false
+		case a.Form:
+			if p.form == nil {
+				p.popUntil(buttonScope, a.P)
+				p.addElement()
+				p.form = p.top()
+			}
+		case a.Li:
+			p.framesetOK = false
+			for i := len(p.oe) - 1; i >= 0; i-- {
+				node := p.oe[i]
+				switch node.DataAtom {
+				case a.Li:
+					p.oe = p.oe[:i]
+				case a.Address, a.Div, a.P:
+					continue
+				default:
+					if !isSpecialElement(node) {
+						continue
+					}
+				}
+				break
+			}
+			p.popUntil(buttonScope, a.P)
+			p.addElement()
+		case a.Dd, a.Dt:
+			p.framesetOK = false
+			for i := len(p.oe) - 1; i >= 0; i-- {
+				node := p.oe[i]
+				switch node.DataAtom {
+				case a.Dd, a.Dt:
+					p.oe = p.oe[:i]
+				case a.Address, a.Div, a.P:
+					continue
+				default:
+					if !isSpecialElement(node) {
+						continue
+					}
+				}
+				break
+			}
+			p.popUntil(buttonScope, a.P)
+			p.addElement()
+		case a.Plaintext:
+			p.popUntil(buttonScope, a.P)
+			p.addElement()
+		case a.Button:
+			p.popUntil(defaultScope, a.Button)
+			p.reconstructActiveFormattingElements()
+			p.addElement()
+			p.framesetOK = false
+		case a.A:
+			for i := len(p.afe) - 1; i >= 0 && p.afe[i].Type != scopeMarkerNode; i-- {
+				if n := p.afe[i]; n.Type == ElementNode && n.DataAtom == a.A {
+					p.inBodyEndTagFormatting(a.A)
+					p.oe.remove(n)
+					p.afe.remove(n)
+					break
+				}
+			}
+			p.reconstructActiveFormattingElements()
+			p.addFormattingElement()
+		case a.B, a.Big, a.Code, a.Em, a.Font, a.I, a.S, a.Small, a.Strike, a.Strong, a.Tt, a.U:
+			p.reconstructActiveFormattingElements()
+			p.addFormattingElement()
+		case a.Nobr:
+			p.reconstructActiveFormattingElements()
+			if p.elementInScope(defaultScope, a.Nobr) {
+				p.inBodyEndTagFormatting(a.Nobr)
+				p.reconstructActiveFormattingElements()
+			}
+			p.addFormattingElement()
+		case a.Applet, a.Marquee, a.Object:
+			p.reconstructActiveFormattingElements()
+			p.addElement()
+			p.afe = append(p.afe, &scopeMarker)
+			p.framesetOK = false
+		case a.Table:
+			if !p.quirks {
+				p.popUntil(buttonScope, a.P)
+			}
+			p.addElement()
+			p.framesetOK = false
+			p.im = inTableIM
+			return true
+		case a.Area, a.Br, a.Embed, a.Img, a.Input, a.Keygen, a.Wbr:
+			p.reconstructActiveFormattingElements()
+			p.addElement()
+			p.oe.pop()
+			p.acknowledgeSelfClosingTag()
+			if p.tok.DataAtom == a.Input {
+				for _, t := range p.tok.Attr {
+					if t.Key == "type" {
+						if strings.ToLower(t.Val) == "hidden" {
+							// Skip setting framesetOK = false
+							return true
+						}
+					}
+				}
+			}
+			p.framesetOK = false
+		case a.Param, a.Source, a.Track:
+			p.addElement()
+			p.oe.pop()
+			p.acknowledgeSelfClosingTag()
+		case a.Hr:
+			p.popUntil(buttonScope, a.P)
+			p.addElement()
+			p.oe.pop()
+			p.acknowledgeSelfClosingTag()
+			p.framesetOK = false
+		case a.Image:
+			p.tok.DataAtom = a.Img
+			p.tok.Data = a.Img.String()
+			return false
+		case a.Isindex:
+			if p.form != nil {
+				// Ignore the token.
+				return true
+			}
+			action := ""
+			prompt := "This is a searchable index. Enter search keywords: "
+			attr := []Attribute{{Key: "name", Val: "isindex"}}
+			for _, t := range p.tok.Attr {
+				switch t.Key {
+				case "action":
+					action = t.Val
+				case "name":
+					// Ignore the attribute.
+				case "prompt":
+					prompt = t.Val
+				default:
+					attr = append(attr, t)
+				}
+			}
+			p.acknowledgeSelfClosingTag()
+			p.popUntil(buttonScope, a.P)
+			p.parseImpliedToken(StartTagToken, a.Form, a.Form.String())
+			if action != "" {
+				p.form.Attr = []Attribute{{Key: "action", Val: action}}
+			}
+			p.parseImpliedToken(StartTagToken, a.Hr, a.Hr.String())
+			p.parseImpliedToken(StartTagToken, a.Label, a.Label.String())
+			p.addText(prompt)
+			p.addChild(&Node{
+				Type:     ElementNode,
+				DataAtom: a.Input,
+				Data:     a.Input.String(),
+				Attr:     attr,
+			})
+			p.oe.pop()
+			p.parseImpliedToken(EndTagToken, a.Label, a.Label.String())
+			p.parseImpliedToken(StartTagToken, a.Hr, a.Hr.String())
+			p.parseImpliedToken(EndTagToken, a.Form, a.Form.String())
+		case a.Textarea:
+			p.addElement()
+			p.setOriginalIM()
+			p.framesetOK = false
+			p.im = textIM
+		case a.Xmp:
+			p.popUntil(buttonScope, a.P)
+			p.reconstructActiveFormattingElements()
+			p.framesetOK = false
+			p.addElement()
+			p.setOriginalIM()
+			p.im = textIM
+		case a.Iframe:
+			p.framesetOK = false
+			p.addElement()
+			p.setOriginalIM()
+			p.im = textIM
+		case a.Noembed, a.Noscript:
+			p.addElement()
+			p.setOriginalIM()
+			p.im = textIM
+		case a.Select:
+			p.reconstructActiveFormattingElements()
+			p.addElement()
+			p.framesetOK = false
+			p.im = inSelectIM
+			return true
+		case a.Optgroup, a.Option:
+			if p.top().DataAtom == a.Option {
+				p.oe.pop()
+			}
+			p.reconstructActiveFormattingElements()
+			p.addElement()
+		case a.Rp, a.Rt:
+			if p.elementInScope(defaultScope, a.Ruby) {
+				p.generateImpliedEndTags()
+			}
+			p.addElement()
+		case a.Math, a.Svg:
+			p.reconstructActiveFormattingElements()
+			if p.tok.DataAtom == a.Math {
+				adjustAttributeNames(p.tok.Attr, mathMLAttributeAdjustments)
+			} else {
+				adjustAttributeNames(p.tok.Attr, svgAttributeAdjustments)
+			}
+			adjustForeignAttributes(p.tok.Attr)
+			p.addElement()
+			p.top().Namespace = p.tok.Data
+			if p.hasSelfClosingToken {
+				p.oe.pop()
+				p.acknowledgeSelfClosingTag()
+			}
+			return true
+		case a.Caption, a.Col, a.Colgroup, a.Frame, a.Head, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr:
+			// Ignore the token.
+		default:
+			p.reconstructActiveFormattingElements()
+			p.addElement()
+		}
+	case EndTagToken:
+		switch p.tok.DataAtom {
+		case a.Body:
+			if p.elementInScope(defaultScope, a.Body) {
+				p.im = afterBodyIM
+			}
+		case a.Html:
+			if p.elementInScope(defaultScope, a.Body) {
+				p.parseImpliedToken(EndTagToken, a.Body, a.Body.String())
+				return false
+			}
+			return true
+		case a.Address, a.Article, a.Aside, a.Blockquote, a.Button, a.Center, a.Details, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Listing, a.Menu, a.Nav, a.Ol, a.Pre, a.Section, a.Summary, a.Ul:
+			p.popUntil(defaultScope, p.tok.DataAtom)
+		case a.Form:
+			node := p.form
+			p.form = nil
+			i := p.indexOfElementInScope(defaultScope, a.Form)
+			if node == nil || i == -1 || p.oe[i] != node {
+				// Ignore the token.
+				return true
+			}
+			p.generateImpliedEndTags()
+			p.oe.remove(node)
+		case a.P:
+			if !p.elementInScope(buttonScope, a.P) {
+				p.parseImpliedToken(StartTagToken, a.P, a.P.String())
+			}
+			p.popUntil(buttonScope, a.P)
+		case a.Li:
+			p.popUntil(listItemScope, a.Li)
+		case a.Dd, a.Dt:
+			p.popUntil(defaultScope, p.tok.DataAtom)
+		case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
+			p.popUntil(defaultScope, a.H1, a.H2, a.H3, a.H4, a.H5, a.H6)
+		case a.A, a.B, a.Big, a.Code, a.Em, a.Font, a.I, a.Nobr, a.S, a.Small, a.Strike, a.Strong, a.Tt, a.U:
+			p.inBodyEndTagFormatting(p.tok.DataAtom)
+		case a.Applet, a.Marquee, a.Object:
+			if p.popUntil(defaultScope, p.tok.DataAtom) {
+				p.clearActiveFormattingElements()
+			}
+		case a.Br:
+			p.tok.Type = StartTagToken
+			return false
+		default:
+			p.inBodyEndTagOther(p.tok.DataAtom)
+		}
+	case CommentToken:
+		p.addChild(&Node{
+			Type: CommentNode,
+			Data: p.tok.Data,
+		})
+	}
+
+	return true
+}
+
+func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) {
+	// This is the "adoption agency" algorithm, described at
+	// https://html.spec.whatwg.org/multipage/syntax.html#adoptionAgency
+
+	// TODO: this is a fairly literal line-by-line translation of that algorithm.
+	// Once the code successfully parses the comprehensive test suite, we should
+	// refactor this code to be more idiomatic.
+
+	// Steps 1-4. The outer loop.
+	for i := 0; i < 8; i++ {
+		// Step 5. Find the formatting element.
+		var formattingElement *Node
+		for j := len(p.afe) - 1; j >= 0; j-- {
+			if p.afe[j].Type == scopeMarkerNode {
+				break
+			}
+			if p.afe[j].DataAtom == tagAtom {
+				formattingElement = p.afe[j]
+				break
+			}
+		}
+		if formattingElement == nil {
+			p.inBodyEndTagOther(tagAtom)
+			return
+		}
+		feIndex := p.oe.index(formattingElement)
+		if feIndex == -1 {
+			p.afe.remove(formattingElement)
+			return
+		}
+		if !p.elementInScope(defaultScope, tagAtom) {
+			// Ignore the tag.
+			return
+		}
+
+		// Steps 9-10. Find the furthest block.
+		var furthestBlock *Node
+		for _, e := range p.oe[feIndex:] {
+			if isSpecialElement(e) {
+				furthestBlock = e
+				break
+			}
+		}
+		if furthestBlock == nil {
+			e := p.oe.pop()
+			for e != formattingElement {
+				e = p.oe.pop()
+			}
+			p.afe.remove(e)
+			return
+		}
+
+		// Steps 11-12. Find the common ancestor and bookmark node.
+		commonAncestor := p.oe[feIndex-1]
+		bookmark := p.afe.index(formattingElement)
+
+		// Step 13. The inner loop. Find the lastNode to reparent.
+		lastNode := furthestBlock
+		node := furthestBlock
+		x := p.oe.index(node)
+		// Steps 13.1-13.2
+		for j := 0; j < 3; j++ {
+			// Step 13.3.
+			x--
+			node = p.oe[x]
+			// Step 13.4 - 13.5.
+			if p.afe.index(node) == -1 {
+				p.oe.remove(node)
+				continue
+			}
+			// Step 13.6.
+			if node == formattingElement {
+				break
+			}
+			// Step 13.7.
+			clone := node.clone()
+			p.afe[p.afe.index(node)] = clone
+			p.oe[p.oe.index(node)] = clone
+			node = clone
+			// Step 13.8.
+			if lastNode == furthestBlock {
+				bookmark = p.afe.index(node) + 1
+			}
+			// Step 13.9.
+			if lastNode.Parent != nil {
+				lastNode.Parent.RemoveChild(lastNode)
+			}
+			node.AppendChild(lastNode)
+			// Step 13.10.
+			lastNode = node
+		}
+
+		// Step 14. Reparent lastNode to the common ancestor,
+		// or for misnested table nodes, to the foster parent.
+		if lastNode.Parent != nil {
+			lastNode.Parent.RemoveChild(lastNode)
+		}
+		switch commonAncestor.DataAtom {
+		case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr:
+			p.fosterParent(lastNode)
+		default:
+			commonAncestor.AppendChild(lastNode)
+		}
+
+		// Steps 15-17. Reparent nodes from the furthest block's children
+		// to a clone of the formatting element.
+		clone := formattingElement.clone()
+		reparentChildren(clone, furthestBlock)
+		furthestBlock.AppendChild(clone)
+
+		// Step 18. Fix up the list of active formatting elements.
+		if oldLoc := p.afe.index(formattingElement); oldLoc != -1 && oldLoc < bookmark {
+			// Move the bookmark with the rest of the list.
+			bookmark--
+		}
+		p.afe.remove(formattingElement)
+		p.afe.insert(bookmark, clone)
+
+		// Step 19. Fix up the stack of open elements.
+		p.oe.remove(formattingElement)
+		p.oe.insert(p.oe.index(furthestBlock)+1, clone)
+	}
+}
+
+// inBodyEndTagOther performs the "any other end tag" algorithm for inBodyIM.
+// "Any other end tag" handling from 12.2.5.5 The rules for parsing tokens in foreign content
+// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inforeign
+func (p *parser) inBodyEndTagOther(tagAtom a.Atom) {
+	for i := len(p.oe) - 1; i >= 0; i-- {
+		if p.oe[i].DataAtom == tagAtom {
+			p.oe = p.oe[:i]
+			break
+		}
+		if isSpecialElement(p.oe[i]) {
+			break
+		}
+	}
+}
+
+// Section 12.2.5.4.8.
+func textIM(p *parser) bool {
+	switch p.tok.Type {
+	case ErrorToken:
+		p.oe.pop()
+	case TextToken:
+		d := p.tok.Data
+		if n := p.oe.top(); n.DataAtom == a.Textarea && n.FirstChild == nil {
+			// Ignore a newline at the start of a -->
+#errors
+#document
+| 
+|   
+|   
+|     -->
+#errors
+#document
+| 
+|   
+|   
+|     
+#errors
+Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE.
+#document
+| 
+|   
+|   
+|     
+#errors
+Line: 1 Col: 9 Unexpected end tag (strong). Expected DOCTYPE.
+Line: 1 Col: 9 Unexpected end tag (strong) after the (implied) root element.
+Line: 1 Col: 13 Unexpected end tag (b) after the (implied) root element.
+Line: 1 Col: 18 Unexpected end tag (em) after the (implied) root element.
+Line: 1 Col: 22 Unexpected end tag (i) after the (implied) root element.
+Line: 1 Col: 26 Unexpected end tag (u) after the (implied) root element.
+Line: 1 Col: 35 Unexpected end tag (strike) after the (implied) root element.
+Line: 1 Col: 39 Unexpected end tag (s) after the (implied) root element.
+Line: 1 Col: 47 Unexpected end tag (blink) after the (implied) root element.
+Line: 1 Col: 52 Unexpected end tag (tt) after the (implied) root element.
+Line: 1 Col: 58 Unexpected end tag (pre) after the (implied) root element.
+Line: 1 Col: 64 Unexpected end tag (big) after the (implied) root element.
+Line: 1 Col: 72 Unexpected end tag (small) after the (implied) root element.
+Line: 1 Col: 79 Unexpected end tag (font) after the (implied) root element.
+Line: 1 Col: 88 Unexpected end tag (select) after the (implied) root element.
+Line: 1 Col: 93 Unexpected end tag (h1) after the (implied) root element.
+Line: 1 Col: 98 Unexpected end tag (h2) after the (implied) root element.
+Line: 1 Col: 103 Unexpected end tag (h3) after the (implied) root element.
+Line: 1 Col: 108 Unexpected end tag (h4) after the (implied) root element.
+Line: 1 Col: 113 Unexpected end tag (h5) after the (implied) root element.
+Line: 1 Col: 118 Unexpected end tag (h6) after the (implied) root element.
+Line: 1 Col: 125 Unexpected end tag (body) after the (implied) root element.
+Line: 1 Col: 130 Unexpected end tag (br). Treated as br element.
+Line: 1 Col: 134 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 140 This element (img) has no end tag.
+Line: 1 Col: 148 Unexpected end tag (title). Ignored.
+Line: 1 Col: 155 Unexpected end tag (span). Ignored.
+Line: 1 Col: 163 Unexpected end tag (style). Ignored.
+Line: 1 Col: 172 Unexpected end tag (script). Ignored.
+Line: 1 Col: 180 Unexpected end tag (table). Ignored.
+Line: 1 Col: 185 Unexpected end tag (th). Ignored.
+Line: 1 Col: 190 Unexpected end tag (td). Ignored.
+Line: 1 Col: 195 Unexpected end tag (tr). Ignored.
+Line: 1 Col: 203 This element (frame) has no end tag.
+Line: 1 Col: 210 This element (area) has no end tag.
+Line: 1 Col: 217 Unexpected end tag (link). Ignored.
+Line: 1 Col: 225 This element (param) has no end tag.
+Line: 1 Col: 230 This element (hr) has no end tag.
+Line: 1 Col: 238 This element (input) has no end tag.
+Line: 1 Col: 244 Unexpected end tag (col). Ignored.
+Line: 1 Col: 251 Unexpected end tag (base). Ignored.
+Line: 1 Col: 258 Unexpected end tag (meta). Ignored.
+Line: 1 Col: 269 This element (basefont) has no end tag.
+Line: 1 Col: 279 This element (bgsound) has no end tag.
+Line: 1 Col: 287 This element (embed) has no end tag.
+Line: 1 Col: 296 This element (spacer) has no end tag.
+Line: 1 Col: 300 Unexpected end tag (p). Ignored.
+Line: 1 Col: 305 End tag (dd) seen too early. Expected other end tag.
+Line: 1 Col: 310 End tag (dt) seen too early. Expected other end tag.
+Line: 1 Col: 320 Unexpected end tag (caption). Ignored.
+Line: 1 Col: 331 Unexpected end tag (colgroup). Ignored.
+Line: 1 Col: 339 Unexpected end tag (tbody). Ignored.
+Line: 1 Col: 347 Unexpected end tag (tfoot). Ignored.
+Line: 1 Col: 355 Unexpected end tag (thead). Ignored.
+Line: 1 Col: 365 End tag (address) seen too early. Expected other end tag.
+Line: 1 Col: 378 End tag (blockquote) seen too early. Expected other end tag.
+Line: 1 Col: 387 End tag (center) seen too early. Expected other end tag.
+Line: 1 Col: 393 Unexpected end tag (dir). Ignored.
+Line: 1 Col: 399 End tag (div) seen too early. Expected other end tag.
+Line: 1 Col: 404 End tag (dl) seen too early. Expected other end tag.
+Line: 1 Col: 415 End tag (fieldset) seen too early. Expected other end tag.
+Line: 1 Col: 425 End tag (listing) seen too early. Expected other end tag.
+Line: 1 Col: 432 End tag (menu) seen too early. Expected other end tag.
+Line: 1 Col: 437 End tag (ol) seen too early. Expected other end tag.
+Line: 1 Col: 442 End tag (ul) seen too early. Expected other end tag.
+Line: 1 Col: 447 End tag (li) seen too early. Expected other end tag.
+Line: 1 Col: 454 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm.
+Line: 1 Col: 460 This element (wbr) has no end tag.
+Line: 1 Col: 476 End tag (button) seen too early. Expected other end tag.
+Line: 1 Col: 486 End tag (marquee) seen too early. Expected other end tag.
+Line: 1 Col: 495 End tag (object) seen too early. Expected other end tag.
+Line: 1 Col: 513 Unexpected end tag (html). Ignored.
+Line: 1 Col: 513 Unexpected end tag (frameset). Ignored.
+Line: 1 Col: 520 Unexpected end tag (head). Ignored.
+Line: 1 Col: 529 Unexpected end tag (iframe). Ignored.
+Line: 1 Col: 537 This element (image) has no end tag.
+Line: 1 Col: 547 This element (isindex) has no end tag.
+Line: 1 Col: 557 Unexpected end tag (noembed). Ignored.
+Line: 1 Col: 568 Unexpected end tag (noframes). Ignored.
+Line: 1 Col: 579 Unexpected end tag (noscript). Ignored.
+Line: 1 Col: 590 Unexpected end tag (optgroup). Ignored.
+Line: 1 Col: 599 Unexpected end tag (option). Ignored.
+Line: 1 Col: 611 Unexpected end tag (plaintext). Ignored.
+Line: 1 Col: 622 Unexpected end tag (textarea). Ignored.
+#document
+| 
+|   
+|   
+|     
+|

+ +#data +

+#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 20 Unexpected end tag (strong) in table context caused voodoo mode. +Line: 1 Col: 20 End tag (strong) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 24 Unexpected end tag (b) in table context caused voodoo mode. +Line: 1 Col: 24 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 29 Unexpected end tag (em) in table context caused voodoo mode. +Line: 1 Col: 29 End tag (em) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 33 Unexpected end tag (i) in table context caused voodoo mode. +Line: 1 Col: 33 End tag (i) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 37 Unexpected end tag (u) in table context caused voodoo mode. +Line: 1 Col: 37 End tag (u) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 46 Unexpected end tag (strike) in table context caused voodoo mode. +Line: 1 Col: 46 End tag (strike) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 50 Unexpected end tag (s) in table context caused voodoo mode. +Line: 1 Col: 50 End tag (s) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 58 Unexpected end tag (blink) in table context caused voodoo mode. +Line: 1 Col: 58 Unexpected end tag (blink). Ignored. +Line: 1 Col: 63 Unexpected end tag (tt) in table context caused voodoo mode. +Line: 1 Col: 63 End tag (tt) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 69 Unexpected end tag (pre) in table context caused voodoo mode. +Line: 1 Col: 69 End tag (pre) seen too early. Expected other end tag. +Line: 1 Col: 75 Unexpected end tag (big) in table context caused voodoo mode. +Line: 1 Col: 75 End tag (big) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 83 Unexpected end tag (small) in table context caused voodoo mode. +Line: 1 Col: 83 End tag (small) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 90 Unexpected end tag (font) in table context caused voodoo mode. +Line: 1 Col: 90 End tag (font) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 99 Unexpected end tag (select) in table context caused voodoo mode. +Line: 1 Col: 99 Unexpected end tag (select). Ignored. +Line: 1 Col: 104 Unexpected end tag (h1) in table context caused voodoo mode. +Line: 1 Col: 104 End tag (h1) seen too early. Expected other end tag. +Line: 1 Col: 109 Unexpected end tag (h2) in table context caused voodoo mode. +Line: 1 Col: 109 End tag (h2) seen too early. Expected other end tag. +Line: 1 Col: 114 Unexpected end tag (h3) in table context caused voodoo mode. +Line: 1 Col: 114 End tag (h3) seen too early. Expected other end tag. +Line: 1 Col: 119 Unexpected end tag (h4) in table context caused voodoo mode. +Line: 1 Col: 119 End tag (h4) seen too early. Expected other end tag. +Line: 1 Col: 124 Unexpected end tag (h5) in table context caused voodoo mode. +Line: 1 Col: 124 End tag (h5) seen too early. Expected other end tag. +Line: 1 Col: 129 Unexpected end tag (h6) in table context caused voodoo mode. +Line: 1 Col: 129 End tag (h6) seen too early. Expected other end tag. +Line: 1 Col: 136 Unexpected end tag (body) in the table row phase. Ignored. +Line: 1 Col: 141 Unexpected end tag (br) in table context caused voodoo mode. +Line: 1 Col: 141 Unexpected end tag (br). Treated as br element. +Line: 1 Col: 145 Unexpected end tag (a) in table context caused voodoo mode. +Line: 1 Col: 145 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 151 Unexpected end tag (img) in table context caused voodoo mode. +Line: 1 Col: 151 This element (img) has no end tag. +Line: 1 Col: 159 Unexpected end tag (title) in table context caused voodoo mode. +Line: 1 Col: 159 Unexpected end tag (title). Ignored. +Line: 1 Col: 166 Unexpected end tag (span) in table context caused voodoo mode. +Line: 1 Col: 166 Unexpected end tag (span). Ignored. +Line: 1 Col: 174 Unexpected end tag (style) in table context caused voodoo mode. +Line: 1 Col: 174 Unexpected end tag (style). Ignored. +Line: 1 Col: 183 Unexpected end tag (script) in table context caused voodoo mode. +Line: 1 Col: 183 Unexpected end tag (script). Ignored. +Line: 1 Col: 196 Unexpected end tag (th). Ignored. +Line: 1 Col: 201 Unexpected end tag (td). Ignored. +Line: 1 Col: 206 Unexpected end tag (tr). Ignored. +Line: 1 Col: 214 This element (frame) has no end tag. +Line: 1 Col: 221 This element (area) has no end tag. +Line: 1 Col: 228 Unexpected end tag (link). Ignored. +Line: 1 Col: 236 This element (param) has no end tag. +Line: 1 Col: 241 This element (hr) has no end tag. +Line: 1 Col: 249 This element (input) has no end tag. +Line: 1 Col: 255 Unexpected end tag (col). Ignored. +Line: 1 Col: 262 Unexpected end tag (base). Ignored. +Line: 1 Col: 269 Unexpected end tag (meta). Ignored. +Line: 1 Col: 280 This element (basefont) has no end tag. +Line: 1 Col: 290 This element (bgsound) has no end tag. +Line: 1 Col: 298 This element (embed) has no end tag. +Line: 1 Col: 307 This element (spacer) has no end tag. +Line: 1 Col: 311 Unexpected end tag (p). Ignored. +Line: 1 Col: 316 End tag (dd) seen too early. Expected other end tag. +Line: 1 Col: 321 End tag (dt) seen too early. Expected other end tag. +Line: 1 Col: 331 Unexpected end tag (caption). Ignored. +Line: 1 Col: 342 Unexpected end tag (colgroup). Ignored. +Line: 1 Col: 350 Unexpected end tag (tbody). Ignored. +Line: 1 Col: 358 Unexpected end tag (tfoot). Ignored. +Line: 1 Col: 366 Unexpected end tag (thead). Ignored. +Line: 1 Col: 376 End tag (address) seen too early. Expected other end tag. +Line: 1 Col: 389 End tag (blockquote) seen too early. Expected other end tag. +Line: 1 Col: 398 End tag (center) seen too early. Expected other end tag. +Line: 1 Col: 404 Unexpected end tag (dir). Ignored. +Line: 1 Col: 410 End tag (div) seen too early. Expected other end tag. +Line: 1 Col: 415 End tag (dl) seen too early. Expected other end tag. +Line: 1 Col: 426 End tag (fieldset) seen too early. Expected other end tag. +Line: 1 Col: 436 End tag (listing) seen too early. Expected other end tag. +Line: 1 Col: 443 End tag (menu) seen too early. Expected other end tag. +Line: 1 Col: 448 End tag (ol) seen too early. Expected other end tag. +Line: 1 Col: 453 End tag (ul) seen too early. Expected other end tag. +Line: 1 Col: 458 End tag (li) seen too early. Expected other end tag. +Line: 1 Col: 465 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 471 This element (wbr) has no end tag. +Line: 1 Col: 487 End tag (button) seen too early. Expected other end tag. +Line: 1 Col: 497 End tag (marquee) seen too early. Expected other end tag. +Line: 1 Col: 506 End tag (object) seen too early. Expected other end tag. +Line: 1 Col: 524 Unexpected end tag (html). Ignored. +Line: 1 Col: 524 Unexpected end tag (frameset). Ignored. +Line: 1 Col: 531 Unexpected end tag (head). Ignored. +Line: 1 Col: 540 Unexpected end tag (iframe). Ignored. +Line: 1 Col: 548 This element (image) has no end tag. +Line: 1 Col: 558 This element (isindex) has no end tag. +Line: 1 Col: 568 Unexpected end tag (noembed). Ignored. +Line: 1 Col: 579 Unexpected end tag (noframes). Ignored. +Line: 1 Col: 590 Unexpected end tag (noscript). Ignored. +Line: 1 Col: 601 Unexpected end tag (optgroup). Ignored. +Line: 1 Col: 610 Unexpected end tag (option). Ignored. +Line: 1 Col: 622 Unexpected end tag (plaintext). Ignored. +Line: 1 Col: 633 Unexpected end tag (textarea). Ignored. +#document +| +| +| +|
+| +| +| +|

+ +#data + +#errors +Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. +Line: 1 Col: 10 Expected closing tag. Unexpected end of file. +#document +| +| +| diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat new file mode 100644 index 0000000000..4f8df86f20 --- /dev/null +++ b/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat @@ -0,0 +1,799 @@ +#data + +#errors +#document +| +| +| +| +| + +#data +a +#errors +29: Bogus comment +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| + +#data + +#errors +35: Stray “svg” start tag. +42: Stray end tag “svg” +#document +| +| +| +| +| +#errors +43: Stray “svg” start tag. +50: Stray end tag “svg” +#document +| +| +| +| +|

+#errors +34: Start tag “svg” seen in “table”. +41: Stray end tag “svg”. +#document +| +| +| +| +| +| + +#data +
foo
+#errors +34: Start tag “svg” seen in “table”. +46: Stray end tag “g”. +53: Stray end tag “svg”. +#document +| +| +| +| +| +| +| "foo" +| + +#data +
foobar
+#errors +34: Start tag “svg” seen in “table”. +46: Stray end tag “g”. +58: Stray end tag “g”. +65: Stray end tag “svg”. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +| + +#data +
foobar
+#errors +41: Start tag “svg” seen in “table”. +53: Stray end tag “g”. +65: Stray end tag “g”. +72: Stray end tag “svg”. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +| +| + +#data +
foobar
+#errors +45: Start tag “svg” seen in “table”. +57: Stray end tag “g”. +69: Stray end tag “g”. +76: Stray end tag “svg”. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +| +| +| + +#data +
foobar
+#errors +#document +| +| +| +| +| +| +| +|
+| +| +| "foo" +| +| "bar" + +#data +
foobar

baz

+#errors +#document +| +| +| +| +| +| +| +|
+| +| +| "foo" +| +| "bar" +|

+| "baz" + +#data +
foobar

baz

+#errors +#document +| +| +| +| +| +|
+| +| +| "foo" +| +| "bar" +|

+| "baz" + +#data +
foobar

baz

quux +#errors +70: HTML start tag “p” in a foreign namespace context. +81: “table” closed but “caption” was still open. +#document +| +| +| +| +| +|
+| +| +| "foo" +| +| "bar" +|

+| "baz" +|

+| "quux" + +#data +
foobarbaz

quux +#errors +78: “table” closed but “caption” was still open. +78: Unclosed elements on stack. +#document +| +| +| +| +| +|
+| +| +| "foo" +| +| "bar" +| "baz" +|

+| "quux" + +#data +foobar

baz

quux +#errors +44: Start tag “svg” seen in “table”. +56: Stray end tag “g”. +68: Stray end tag “g”. +71: HTML start tag “p” in a foreign namespace context. +71: Start tag “p” seen in “table”. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +|

+| "baz" +| +| +|

+| "quux" + +#data +

quux +#errors +50: Stray “svg” start tag. +54: Stray “g” start tag. +62: Stray end tag “g” +66: Stray “g” start tag. +74: Stray end tag “g” +77: Stray “p” start tag. +88: “table” end tag with “select” open. +#document +| +| +| +| +| +| +| +|
+|

quux +#errors +36: Start tag “select” seen in “table”. +42: Stray “svg” start tag. +46: Stray “g” start tag. +54: Stray end tag “g” +58: Stray “g” start tag. +66: Stray end tag “g” +69: Stray “p” start tag. +80: “table” end tag with “select” open. +#document +| +| +| +| +| +|

+| "quux" + +#data +foobar

baz +#errors +41: Stray “svg” start tag. +68: HTML start tag “p” in a foreign namespace context. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +|

+| "baz" + +#data +foobar

baz +#errors +34: Stray “svg” start tag. +61: HTML start tag “p” in a foreign namespace context. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +|

+| "baz" + +#data +

+#errors +31: Stray “svg” start tag. +35: Stray “g” start tag. +40: Stray end tag “g” +44: Stray “g” start tag. +49: Stray end tag “g” +52: Stray “p” start tag. +58: Stray “span” start tag. +58: End of file seen and there were open elements. +#document +| +| +| +| + +#data +

+#errors +42: Stray “svg” start tag. +46: Stray “g” start tag. +51: Stray end tag “g” +55: Stray “g” start tag. +60: Stray end tag “g” +63: Stray “p” start tag. +69: Stray “span” start tag. +#document +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| xlink:href="foo" +| +| xlink href="foo" + +#data + +#errors +#document +| +| +| +| +| xlink:href="foo" +| xml:lang="en" +| +| +| xlink href="foo" +| xml lang="en" + +#data + +#errors +#document +| +| +| +| +| xlink:href="foo" +| xml:lang="en" +| +| +| xlink href="foo" +| xml lang="en" + +#data +bar +#errors +#document +| +| +| +| +| xlink:href="foo" +| xml:lang="en" +| +| +| xlink href="foo" +| xml lang="en" +| "bar" + +#data + +#errors +#document +| +| +| +| + +#data +

a +#errors +#document +| +| +| +|
+| +| "a" + +#data +
a +#errors +#document +| +| +| +|
+| +| +| "a" + +#data +
+#errors +#document +| +| +| +|
+| +| +| + +#data +
a +#errors +#document +| +| +| +|
+| +| +| +| +| "a" + +#data +

a +#errors +#document +| +| +| +|

+| +| +| +|

+| "a" + +#data +
    a +#errors +40: HTML start tag “ul” in a foreign namespace context. +41: End of file in a foreign namespace context. +#document +| +| +| +| +| +| +|
    +| +|
      +| "a" + +#data +
        a +#errors +35: HTML start tag “ul” in a foreign namespace context. +36: End of file in a foreign namespace context. +#document +| +| +| +| +| +| +| +|
          +| "a" + +#data +

          +#errors +#document +| +| +| +| +|

          +| +| +|

          + +#data +

          +#errors +#document +| +| +| +| +|

          +| +| +|

          + +#data +

          +#errors +#document +| +| +| +|

          +| +| +| +|

          +|

          + +#data +
          +#errors +#document +| +| +| +| +| +|
          +| +|
          +| +| + +#data +
          +#errors +#document +| +| +| +| +| +| +| +|
          +|
          +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data +

+#errors +#document +| +| +| +| +|
+| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| + +#data +
+#errors +#document +| +| +| +| +| +| +| +|
+| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat new file mode 100644 index 0000000000..638cde479f --- /dev/null +++ b/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat @@ -0,0 +1,482 @@ +#data + +#errors +#document +| +| +| +| +| +| attributeName="" +| attributeType="" +| baseFrequency="" +| baseProfile="" +| calcMode="" +| clipPathUnits="" +| contentScriptType="" +| contentStyleType="" +| diffuseConstant="" +| edgeMode="" +| externalResourcesRequired="" +| filterRes="" +| filterUnits="" +| glyphRef="" +| gradientTransform="" +| gradientUnits="" +| kernelMatrix="" +| kernelUnitLength="" +| keyPoints="" +| keySplines="" +| keyTimes="" +| lengthAdjust="" +| limitingConeAngle="" +| markerHeight="" +| markerUnits="" +| markerWidth="" +| maskContentUnits="" +| maskUnits="" +| numOctaves="" +| pathLength="" +| patternContentUnits="" +| patternTransform="" +| patternUnits="" +| pointsAtX="" +| pointsAtY="" +| pointsAtZ="" +| preserveAlpha="" +| preserveAspectRatio="" +| primitiveUnits="" +| refX="" +| refY="" +| repeatCount="" +| repeatDur="" +| requiredExtensions="" +| requiredFeatures="" +| specularConstant="" +| specularExponent="" +| spreadMethod="" +| startOffset="" +| stdDeviation="" +| stitchTiles="" +| surfaceScale="" +| systemLanguage="" +| tableValues="" +| targetX="" +| targetY="" +| textLength="" +| viewBox="" +| viewTarget="" +| xChannelSelector="" +| yChannelSelector="" +| zoomAndPan="" + +#data + +#errors +#document +| +| +| +| +| +| attributeName="" +| attributeType="" +| baseFrequency="" +| baseProfile="" +| calcMode="" +| clipPathUnits="" +| contentScriptType="" +| contentStyleType="" +| diffuseConstant="" +| edgeMode="" +| externalResourcesRequired="" +| filterRes="" +| filterUnits="" +| glyphRef="" +| gradientTransform="" +| gradientUnits="" +| kernelMatrix="" +| kernelUnitLength="" +| keyPoints="" +| keySplines="" +| keyTimes="" +| lengthAdjust="" +| limitingConeAngle="" +| markerHeight="" +| markerUnits="" +| markerWidth="" +| maskContentUnits="" +| maskUnits="" +| numOctaves="" +| pathLength="" +| patternContentUnits="" +| patternTransform="" +| patternUnits="" +| pointsAtX="" +| pointsAtY="" +| pointsAtZ="" +| preserveAlpha="" +| preserveAspectRatio="" +| primitiveUnits="" +| refX="" +| refY="" +| repeatCount="" +| repeatDur="" +| requiredExtensions="" +| requiredFeatures="" +| specularConstant="" +| specularExponent="" +| spreadMethod="" +| startOffset="" +| stdDeviation="" +| stitchTiles="" +| surfaceScale="" +| systemLanguage="" +| tableValues="" +| targetX="" +| targetY="" +| textLength="" +| viewBox="" +| viewTarget="" +| xChannelSelector="" +| yChannelSelector="" +| zoomAndPan="" + +#data + +#errors +#document +| +| +| +| +| +| attributeName="" +| attributeType="" +| baseFrequency="" +| baseProfile="" +| calcMode="" +| clipPathUnits="" +| contentScriptType="" +| contentStyleType="" +| diffuseConstant="" +| edgeMode="" +| externalResourcesRequired="" +| filterRes="" +| filterUnits="" +| glyphRef="" +| gradientTransform="" +| gradientUnits="" +| kernelMatrix="" +| kernelUnitLength="" +| keyPoints="" +| keySplines="" +| keyTimes="" +| lengthAdjust="" +| limitingConeAngle="" +| markerHeight="" +| markerUnits="" +| markerWidth="" +| maskContentUnits="" +| maskUnits="" +| numOctaves="" +| pathLength="" +| patternContentUnits="" +| patternTransform="" +| patternUnits="" +| pointsAtX="" +| pointsAtY="" +| pointsAtZ="" +| preserveAlpha="" +| preserveAspectRatio="" +| primitiveUnits="" +| refX="" +| refY="" +| repeatCount="" +| repeatDur="" +| requiredExtensions="" +| requiredFeatures="" +| specularConstant="" +| specularExponent="" +| spreadMethod="" +| startOffset="" +| stdDeviation="" +| stitchTiles="" +| surfaceScale="" +| systemLanguage="" +| tableValues="" +| targetX="" +| targetY="" +| textLength="" +| viewBox="" +| viewTarget="" +| xChannelSelector="" +| yChannelSelector="" +| zoomAndPan="" + +#data + +#errors +#document +| +| +| +| +| +| attributename="" +| attributetype="" +| basefrequency="" +| baseprofile="" +| calcmode="" +| clippathunits="" +| contentscripttype="" +| contentstyletype="" +| diffuseconstant="" +| edgemode="" +| externalresourcesrequired="" +| filterres="" +| filterunits="" +| glyphref="" +| gradienttransform="" +| gradientunits="" +| kernelmatrix="" +| kernelunitlength="" +| keypoints="" +| keysplines="" +| keytimes="" +| lengthadjust="" +| limitingconeangle="" +| markerheight="" +| markerunits="" +| markerwidth="" +| maskcontentunits="" +| maskunits="" +| numoctaves="" +| pathlength="" +| patterncontentunits="" +| patterntransform="" +| patternunits="" +| pointsatx="" +| pointsaty="" +| pointsatz="" +| preservealpha="" +| preserveaspectratio="" +| primitiveunits="" +| refx="" +| refy="" +| repeatcount="" +| repeatdur="" +| requiredextensions="" +| requiredfeatures="" +| specularconstant="" +| specularexponent="" +| spreadmethod="" +| startoffset="" +| stddeviation="" +| stitchtiles="" +| surfacescale="" +| systemlanguage="" +| tablevalues="" +| targetx="" +| targety="" +| textlength="" +| viewbox="" +| viewtarget="" +| xchannelselector="" +| ychannelselector="" +| zoomandpan="" + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat new file mode 100644 index 0000000000..63107d277b --- /dev/null +++ b/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat @@ -0,0 +1,62 @@ +#data +

foobazeggs

spam

quuxbar +#errors +#document +| +| +| +| +|

+| "foo" +| +| +| +| "baz" +| +| +| +| +| "eggs" +| +| +|

+| "spam" +| +| +| +|
+| +| +| "quux" +| "bar" + +#data +foobazeggs

spam
quuxbar +#errors +#document +| +| +| +| +| "foo" +| +| +| +| "baz" +| +| +| +| +| "eggs" +| +| +|

+| "spam" +| +| +| +|
+| +| +| "quux" +| "bar" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat new file mode 100644 index 0000000000..b8713f8858 --- /dev/null +++ b/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat @@ -0,0 +1,74 @@ +#data + +#errors +#document +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +15: Unexpected start tag html +#document +| +| +| abc:def="gh" +| +| +| + +#data + +#errors +15: Unexpected start tag html +#document +| +| +| xml:lang="bar" +| +| + +#data + +#errors +#document +| +| +| 123="456" +| +| + +#data + +#errors +#document +| +| +| 123="456" +| 789="012" +| +| + +#data + +#errors +#document +| +| +| +| +| 789="012" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat new file mode 100644 index 0000000000..6ce1c0d166 --- /dev/null +++ b/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat @@ -0,0 +1,208 @@ +#data +

X +#errors +Line: 1 Col: 31 Unexpected end tag (p). Ignored. +Line: 1 Col: 36 Expected closing tag. Unexpected end of file. +#document +| +| +| +| +|

+| +| +| +| +| +| +| " " +|

+| "X" + +#data +

+

X +#errors +Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. +Line: 1 Col: 16 Unexpected end tag (p). Ignored. +Line: 2 Col: 4 Expected closing tag. Unexpected end of file. +#document +| +| +| +|

+| +| +| +| +| +| +| " +" +|

+| "X" + +#data + +#errors +Line: 1 Col: 22 Unexpected end tag (html) after the (implied) root element. +#document +| +| +| +| +| " " + +#data + +#errors +Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. +#document +| +| +| +| +| + +#data + +#errors +Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end tag (html) after the (implied) root element. +#document +| +| +| +| + +#data +X +#errors +Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. +#document +| +| +| +| +| +| "X" + +#data +<!doctype html><table> X<meta></table> +#errors +Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. +Line: 1 Col: 30 Unexpected start tag (meta) in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " X" +| <meta> +| <table> + +#data +<!doctype html><table> x</table> +#errors +Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " x" +| <table> + +#data +<!doctype html><table> x </table> +#errors +Line: 1 Col: 25 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " x " +| <table> + +#data +<!doctype html><table><tr> x</table> +#errors +Line: 1 Col: 28 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " x" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table>X<style> <tr>x </style> </table> +#errors +Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "X" +| <table> +| <style> +| " <tr>x " +| " " + +#data +<!doctype html><div><table><a>foo</a> <tr><td>bar</td> </tr></table></div> +#errors +Line: 1 Col: 30 Unexpected start tag (a) in table context caused voodoo mode. +Line: 1 Col: 37 Unexpected end tag (a) in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| <a> +| "foo" +| <table> +| " " +| <tbody> +| <tr> +| <td> +| "bar" +| " " + +#data +<frame></frame></frame><frameset><frame><frameset><frame></frameset><noframes></frameset><noframes> +#errors +6: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”. +13: Stray start tag “frame”. +21: Stray end tag “frame”. +29: Stray end tag “frame”. +39: “frameset” start tag after “body” already open. +105: End of file seen inside an [R]CDATA element. +105: End of file seen and there were open elements. +XXX: These errors are wrong, please fix me! +#document +| <html> +| <head> +| <frameset> +| <frame> +| <frameset> +| <frame> +| <noframes> +| "</frameset><noframes>" + +#data +<!DOCTYPE html><object></html> +#errors +1: Expected closing tag. Unexpected end of file +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <object> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat new file mode 100644 index 0000000000..c8ef66f0e6 --- /dev/null +++ b/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat @@ -0,0 +1,2299 @@ +#data +<!doctype html><script> +#errors +Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| <body> + +#data +<!doctype html><script>a +#errors +Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "a" +| <body> + +#data +<!doctype html><script>< +#errors +Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<" +| <body> + +#data +<!doctype html><script></ +#errors +Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</" +| <body> + +#data +<!doctype html><script></S +#errors +Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</S" +| <body> + +#data +<!doctype html><script></SC +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SC" +| <body> + +#data +<!doctype html><script></SCR +#errors +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCR" +| <body> + +#data +<!doctype html><script></SCRI +#errors +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCRI" +| <body> + +#data +<!doctype html><script></SCRIP +#errors +Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCRIP" +| <body> + +#data +<!doctype html><script></SCRIPT +#errors +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCRIPT" +| <body> + +#data +<!doctype html><script></SCRIPT +#errors +Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| <body> + +#data +<!doctype html><script></s +#errors +Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</s" +| <body> + +#data +<!doctype html><script></sc +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</sc" +| <body> + +#data +<!doctype html><script></scr +#errors +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</scr" +| <body> + +#data +<!doctype html><script></scri +#errors +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</scri" +| <body> + +#data +<!doctype html><script></scrip +#errors +Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</scrip" +| <body> + +#data +<!doctype html><script></script +#errors +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</script" +| <body> + +#data +<!doctype html><script></script +#errors +Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| <body> + +#data +<!doctype html><script><! +#errors +Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!" +| <body> + +#data +<!doctype html><script><!a +#errors +Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!a" +| <body> + +#data +<!doctype html><script><!- +#errors +Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!-" +| <body> + +#data +<!doctype html><script><!-a +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!-a" +| <body> + +#data +<!doctype html><script><!-- +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<!doctype html><script><!--a +#errors +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--a" +| <body> + +#data +<!doctype html><script><!--< +#errors +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<" +| <body> + +#data +<!doctype html><script><!--<a +#errors +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<a" +| <body> + +#data +<!doctype html><script><!--</ +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--</" +| <body> + +#data +<!doctype html><script><!--</script +#errors +Line: 1 Col: 35 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--</script" +| <body> + +#data +<!doctype html><script><!--</script +#errors +Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<!doctype html><script><!--<s +#errors +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<s" +| <body> + +#data +<!doctype html><script><!--<script +#errors +Line: 1 Col: 34 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script" +| <body> + +#data +<!doctype html><script><!--<script +#errors +Line: 1 Col: 35 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script " +| <body> + +#data +<!doctype html><script><!--<script < +#errors +Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script <" +| <body> + +#data +<!doctype html><script><!--<script <a +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script <a" +| <body> + +#data +<!doctype html><script><!--<script </ +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </" +| <body> + +#data +<!doctype html><script><!--<script </s +#errors +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </s" +| <body> + +#data +<!doctype html><script><!--<script </script +#errors +Line: 1 Col: 43 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script" +| <body> + +#data +<!doctype html><script><!--<script </scripta +#errors +Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </scripta" +| <body> + +#data +<!doctype html><script><!--<script </script +#errors +Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script </script> +#errors +Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script>" +| <body> + +#data +<!doctype html><script><!--<script </script/ +#errors +Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script/" +| <body> + +#data +<!doctype html><script><!--<script </script < +#errors +Line: 1 Col: 45 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script <" +| <body> + +#data +<!doctype html><script><!--<script </script <a +#errors +Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script <a" +| <body> + +#data +<!doctype html><script><!--<script </script </ +#errors +Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script </" +| <body> + +#data +<!doctype html><script><!--<script </script </script +#errors +Line: 1 Col: 52 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script </script" +| <body> + +#data +<!doctype html><script><!--<script </script </script +#errors +Line: 1 Col: 53 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script </script </script/ +#errors +Line: 1 Col: 53 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script </script </script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script - +#errors +Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -" +| <body> + +#data +<!doctype html><script><!--<script -a +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -a" +| <body> + +#data +<!doctype html><script><!--<script -< +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -<" +| <body> + +#data +<!doctype html><script><!--<script -- +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --" +| <body> + +#data +<!doctype html><script><!--<script --a +#errors +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --a" +| <body> + +#data +<!doctype html><script><!--<script --< +#errors +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --<" +| <body> + +#data +<!doctype html><script><!--<script --> +#errors +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script -->< +#errors +Line: 1 Col: 39 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --><" +| <body> + +#data +<!doctype html><script><!--<script --></ +#errors +Line: 1 Col: 40 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --></" +| <body> + +#data +<!doctype html><script><!--<script --></script +#errors +Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --></script" +| <body> + +#data +<!doctype html><script><!--<script --></script +#errors +Line: 1 Col: 47 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script --></script/ +#errors +Line: 1 Col: 47 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script --></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script><\/script>--></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script><\/script>-->" +| <body> + +#data +<!doctype html><script><!--<script></scr'+'ipt>--></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt>-->" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>--><!--</script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>--><!--" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>-- ></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>-- >" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>- -></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- ->" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>- - ></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- - >" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>-></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>->" +| <body> + +#data +<!doctype html><script><!--<script>--!></script>X +#errors +Line: 1 Col: 49 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script>--!></script>X" +| <body> + +#data +<!doctype html><script><!--<scr'+'ipt></script>--></script> +#errors +Line: 1 Col: 59 Unexpected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<scr'+'ipt>" +| <body> +| "-->" + +#data +<!doctype html><script><!--<script></scr'+'ipt></script>X +#errors +Line: 1 Col: 57 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt></script>X" +| <body> + +#data +<!doctype html><style><!--<style></style>--></style> +#errors +Line: 1 Col: 52 Unexpected end tag (style). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--<style>" +| <body> +| "-->" + +#data +<!doctype html><style><!--</style>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--" +| <body> +| "X" + +#data +<!doctype html><style><!--...</style>...--></style> +#errors +Line: 1 Col: 51 Unexpected end tag (style). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--..." +| <body> +| "...-->" + +#data +<!doctype html><style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" +| <body> +| "X" + +#data +<!doctype html><style><!--...<style><!--...--!></style>--></style> +#errors +Line: 1 Col: 66 Unexpected end tag (style). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--...<style><!--...--!>" +| <body> +| "-->" + +#data +<!doctype html><style><!--...</style><!-- --><style>@import ...</style> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--..." +| <!-- --> +| <style> +| "@import ..." +| <body> + +#data +<!doctype html><style>...<style><!--...</style><!-- --></style> +#errors +Line: 1 Col: 63 Unexpected end tag (style). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "...<style><!--..." +| <!-- --> +| <body> + +#data +<!doctype html><style>...<!--[if IE]><style>...</style>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "...<!--[if IE]><style>..." +| <body> +| "X" + +#data +<!doctype html><title><!--<title>--> +#errors +Line: 1 Col: 52 Unexpected end tag (title). +#document +| +| +| +| +| "<!--<title>" +| <body> +| "-->" + +#data +<!doctype html><title></title> +#errors +#document +| +| +| +| +| "" +| + +#data +foo/title><link></head><body>X +#errors +Line: 1 Col: 52 Unexpected end of file. Expected end tag (title). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <title> +| "foo/title><link></head><body>X" +| <body> + +#data +<!doctype html><noscript><!--<noscript></noscript>--></noscript> +#errors +Line: 1 Col: 64 Unexpected end tag (noscript). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noscript> +| "<!--<noscript>" +| <body> +| "-->" + +#data +<!doctype html><noscript><!--</noscript>X<noscript>--></noscript> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noscript> +| "<!--" +| <body> +| "X" +| <noscript> +| "-->" + +#data +<!doctype html><noscript><iframe></noscript>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noscript> +| "<iframe>" +| <body> +| "X" + +#data +<!doctype html><noframes><!--<noframes></noframes>--></noframes> +#errors +Line: 1 Col: 64 Unexpected end tag (noframes). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noframes> +| "<!--<noframes>" +| <body> +| "-->" + +#data +<!doctype html><noframes><body><script><!--...</script></body></noframes></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noframes> +| "<body><script><!--...</script></body>" +| <body> + +#data +<!doctype html><textarea><!--<textarea></textarea>--></textarea> +#errors +Line: 1 Col: 64 Unexpected end tag (textarea). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "<!--<textarea>" +| "-->" + +#data +<!doctype html><textarea></textarea></textarea> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "</textarea>" + +#data +<!doctype html><textarea><</textarea> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "<" + +#data +<!doctype html><textarea>a<b</textarea> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "a<b" + +#data +<!doctype html><iframe><!--<iframe></iframe>--></iframe> +#errors +Line: 1 Col: 56 Unexpected end tag (iframe). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <iframe> +| "<!--<iframe>" +| "-->" + +#data +<!doctype html><iframe>...<!--X->...<!--/X->...</iframe> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <iframe> +| "...<!--X->...<!--/X->..." + +#data +<!doctype html><xmp><!--<xmp></xmp>--></xmp> +#errors +Line: 1 Col: 44 Unexpected end tag (xmp). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <xmp> +| "<!--<xmp>" +| "-->" + +#data +<!doctype html><noembed><!--<noembed></noembed>--></noembed> +#errors +Line: 1 Col: 60 Unexpected end tag (noembed). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <noembed> +| "<!--<noembed>" +| "-->" + +#data +<script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 8 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| <body> + +#data +<script>a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 9 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "a" +| <body> + +#data +<script>< +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 9 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<" +| <body> + +#data +<script></ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 10 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</" +| <body> + +#data +<script></S +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</S" +| <body> + +#data +<script></SC +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SC" +| <body> + +#data +<script></SCR +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SCR" +| <body> + +#data +<script></SCRI +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SCRI" +| <body> + +#data +<script></SCRIP +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 15 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SCRIP" +| <body> + +#data +<script></SCRIPT +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 16 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SCRIPT" +| <body> + +#data +<script></SCRIPT +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 17 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| <body> + +#data +<script></s +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</s" +| <body> + +#data +<script></sc +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</sc" +| <body> + +#data +<script></scr +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</scr" +| <body> + +#data +<script></scri +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</scri" +| <body> + +#data +<script></scrip +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 15 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</scrip" +| <body> + +#data +<script></script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 16 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</script" +| <body> + +#data +<script></script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 17 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| <body> + +#data +<script><! +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 10 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!" +| <body> + +#data +<script><!a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!a" +| <body> + +#data +<script><!- +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!-" +| <body> + +#data +<script><!-a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!-a" +| <body> + +#data +<script><!-- +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<script><!--a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--a" +| <body> + +#data +<script><!--< +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<" +| <body> + +#data +<script><!--<a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<a" +| <body> + +#data +<script><!--</ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--</" +| <body> + +#data +<script><!--</script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 20 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--</script" +| <body> + +#data +<script><!--</script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<script><!--<s +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<s" +| <body> + +#data +<script><!--<script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 19 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script" +| <body> + +#data +<script><!--<script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 20 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script " +| <body> + +#data +<script><!--<script < +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script <" +| <body> + +#data +<script><!--<script <a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script <a" +| <body> + +#data +<script><!--<script </ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </" +| <body> + +#data +<script><!--<script </s +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </s" +| <body> + +#data +<script><!--<script </script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script" +| <body> + +#data +<script><!--<script </scripta +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </scripta" +| <body> + +#data +<script><!--<script </script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script </script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script>" +| <body> + +#data +<script><!--<script </script/ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script/" +| <body> + +#data +<script><!--<script </script < +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script <" +| <body> + +#data +<script><!--<script </script <a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script <a" +| <body> + +#data +<script><!--<script </script </ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script </" +| <body> + +#data +<script><!--<script </script </script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script </script" +| <body> + +#data +<script><!--<script </script </script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script </script </script/ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script </script </script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script - +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -" +| <body> + +#data +<script><!--<script -a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -a" +| <body> + +#data +<script><!--<script -- +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --" +| <body> + +#data +<script><!--<script --a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --a" +| <body> + +#data +<script><!--<script --> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script -->< +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --><" +| <body> + +#data +<script><!--<script --></ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --></" +| <body> + +#data +<script><!--<script --></script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --></script" +| <body> + +#data +<script><!--<script --></script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script --></script/ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script --></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script><\/script>--></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script><\/script>-->" +| <body> + +#data +<script><!--<script></scr'+'ipt>--></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt>-->" +| <body> + +#data +<script><!--<script></script><script></script></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>" +| <body> + +#data +<script><!--<script></script><script></script>--><!--</script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>--><!--" +| <body> + +#data +<script><!--<script></script><script></script>-- ></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>-- >" +| <body> + +#data +<script><!--<script></script><script></script>- -></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- ->" +| <body> + +#data +<script><!--<script></script><script></script>- - ></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- - >" +| <body> + +#data +<script><!--<script></script><script></script>-></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>->" +| <body> + +#data +<script><!--<script>--!></script>X +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 34 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script>--!></script>X" +| <body> + +#data +<script><!--<scr'+'ipt></script>--></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 44 Unexpected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<scr'+'ipt>" +| <body> +| "-->" + +#data +<script><!--<script></scr'+'ipt></script>X +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 42 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt></script>X" +| <body> + +#data +<style><!--<style></style>--></style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 37 Unexpected end tag (style). +#document +| <html> +| <head> +| <style> +| "<!--<style>" +| <body> +| "-->" + +#data +<style><!--</style>X +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| <html> +| <head> +| <style> +| "<!--" +| <body> +| "X" + +#data +<style><!--...</style>...--></style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 36 Unexpected end tag (style). +#document +| <html> +| <head> +| <style> +| "<!--..." +| <body> +| "...-->" + +#data +<style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| <html> +| <head> +| <style> +| "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" +| <body> +| "X" + +#data +<style><!--...<style><!--...--!></style>--></style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 51 Unexpected end tag (style). +#document +| <html> +| <head> +| <style> +| "<!--...<style><!--...--!>" +| <body> +| "-->" + +#data +<style><!--...</style><!-- --><style>@import ...</style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| <html> +| <head> +| <style> +| "<!--..." +| <!-- --> +| <style> +| "@import ..." +| <body> + +#data +<style>...<style><!--...</style><!-- --></style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 48 Unexpected end tag (style). +#document +| <html> +| <head> +| <style> +| "...<style><!--..." +| <!-- --> +| <body> + +#data +<style>...<!--[if IE]><style>...</style>X +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| <html> +| <head> +| <style> +| "...<!--[if IE]><style>..." +| <body> +| "X" + +#data +<title><!--<title>--> +#errors +Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. +Line: 1 Col: 37 Unexpected end tag (title). +#document +| +| +| +| "<!--<title>" +| <body> +| "-->" + +#data +<title></title> +#errors +Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. +#document +| +| +| +| "" +| + +#data +foo/title><link></head><body>X +#errors +Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. +Line: 1 Col: 37 Unexpected end of file. Expected end tag (title). +#document +| <html> +| <head> +| <title> +| "foo/title><link></head><body>X" +| <body> + +#data +<noscript><!--<noscript></noscript>--></noscript> +#errors +Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. +Line: 1 Col: 49 Unexpected end tag (noscript). +#document +| <html> +| <head> +| <noscript> +| "<!--<noscript>" +| <body> +| "-->" + +#data +<noscript><!--</noscript>X<noscript>--></noscript> +#errors +Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. +#document +| <html> +| <head> +| <noscript> +| "<!--" +| <body> +| "X" +| <noscript> +| "-->" + +#data +<noscript><iframe></noscript>X +#errors +Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. +#document +| <html> +| <head> +| <noscript> +| "<iframe>" +| <body> +| "X" + +#data +<noframes><!--<noframes></noframes>--></noframes> +#errors +Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE. +Line: 1 Col: 49 Unexpected end tag (noframes). +#document +| <html> +| <head> +| <noframes> +| "<!--<noframes>" +| <body> +| "-->" + +#data +<noframes><body><script><!--...</script></body></noframes></html> +#errors +Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE. +#document +| <html> +| <head> +| <noframes> +| "<body><script><!--...</script></body>" +| <body> + +#data +<textarea><!--<textarea></textarea>--></textarea> +#errors +Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. +Line: 1 Col: 49 Unexpected end tag (textarea). +#document +| <html> +| <head> +| <body> +| <textarea> +| "<!--<textarea>" +| "-->" + +#data +<textarea></textarea></textarea> +#errors +Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| <textarea> +| "</textarea>" + +#data +<iframe><!--<iframe></iframe>--></iframe> +#errors +Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. +Line: 1 Col: 41 Unexpected end tag (iframe). +#document +| <html> +| <head> +| <body> +| <iframe> +| "<!--<iframe>" +| "-->" + +#data +<iframe>...<!--X->...<!--/X->...</iframe> +#errors +Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| <iframe> +| "...<!--X->...<!--/X->..." + +#data +<xmp><!--<xmp></xmp>--></xmp> +#errors +Line: 1 Col: 5 Unexpected start tag (xmp). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end tag (xmp). +#document +| <html> +| <head> +| <body> +| <xmp> +| "<!--<xmp>" +| "-->" + +#data +<noembed><!--<noembed></noembed>--></noembed> +#errors +Line: 1 Col: 9 Unexpected start tag (noembed). Expected DOCTYPE. +Line: 1 Col: 45 Unexpected end tag (noembed). +#document +| <html> +| <head> +| <body> +| <noembed> +| "<!--<noembed>" +| "-->" + +#data +<!doctype html><table> + +#errors +Line 2 Col 0 Unexpected end of file. Expected table content. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| " +" + +#data +<!doctype html><table><td><span><font></span><span> +#errors +Line 1 Col 26 Unexpected table cell start tag (td) in the table body phase. +Line 1 Col 45 Unexpected end tag (span). +Line 1 Col 51 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <span> +| <font> +| <font> +| <span> + +#data +<!doctype html><form><table></form><form></table></form> +#errors +35: Stray end tag “form”. +41: Start tag “form” seen in “table”. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <table> +| <form> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat new file mode 100644 index 0000000000..7b555f888d --- /dev/null +++ b/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat @@ -0,0 +1,153 @@ +#data +<!doctype html><table><tbody><select><tr> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><tr><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <table> +| <tbody> +| <tr> +| <td> + +#data +<!doctype html><table><tr><td><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <select> +| <td> + +#data +<!doctype html><table><tr><th><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <th> +| <select> +| <td> + +#data +<!doctype html><table><caption><select><tr> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <select> +| <tbody> +| <tr> + +#data +<!doctype html><select><tr> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><th> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><tbody> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><thead> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><tfoot> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><caption> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><table><tr></table>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| "a" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat new file mode 100644 index 0000000000..680e1f068a --- /dev/null +++ b/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat @@ -0,0 +1,269 @@ +#data +<!doctype html><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" + +#data +<!doctype html><table><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> + +#data +<!doctype html><table><tbody><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> +| <tbody> + +#data +<!doctype html><table><tbody><tr><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><tbody><tr><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><td><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <plaintext> +| "</plaintext>" + +#data +<!doctype html><table><caption><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <plaintext> +| "</plaintext>" + +#data +<!doctype html><table><tr><style></script></style>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "abc" +| <table> +| <tbody> +| <tr> +| <style> +| "</script>" + +#data +<!doctype html><table><tr><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "abc" +| <table> +| <tbody> +| <tr> +| <script> +| "</style>" + +#data +<!doctype html><table><caption><style></script></style>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <style> +| "</script>" +| "abc" + +#data +<!doctype html><table><td><style></script></style>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <style> +| "</script>" +| "abc" + +#data +<!doctype html><select><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <script> +| "</style>" +| "abc" + +#data +<!doctype html><table><select><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <script> +| "</style>" +| "abc" +| <table> + +#data +<!doctype html><table><tr><select><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <script> +| "</style>" +| "abc" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><frameset></frameset><noframes>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" + +#data +<!doctype html><frameset></frameset><noframes>abc</noframes><!--abc--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" +| <!-- abc --> + +#data +<!doctype html><frameset></frameset></html><noframes>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" + +#data +<!doctype html><frameset></frameset></html><noframes>abc</noframes><!--abc--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" +| <!-- abc --> + +#data +<!doctype html><table><tr></tbody><tfoot> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <tfoot> + +#data +<!doctype html><table><td><svg></svg>abc<td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <svg svg> +| "abc" +| <td> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat new file mode 100644 index 0000000000..0d62f5a5b0 --- /dev/null +++ b/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat @@ -0,0 +1,1237 @@ +#data +<!doctype html><math><mn DefinitionUrl="foo"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <math mn> +| definitionURL="foo" + +#data +<!doctype html><html></p><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <!-- foo --> +| <head> +| <body> + +#data +<!doctype html><head></head></p><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <!-- foo --> +| <body> + +#data +<!doctype html><body><p><pre> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <pre> + +#data +<!doctype html><body><p><listing> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <listing> + +#data +<!doctype html><p><plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <plaintext> + +#data +<!doctype html><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <h1> + +#data +<!doctype html><form><isindex> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> + +#data +<!doctype html><isindex action="POST"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| action="POST" +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| <hr> + +#data +<!doctype html><isindex prompt="this is isindex"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "this is isindex" +| <input> +| name="isindex" +| <hr> + +#data +<!doctype html><isindex type="hidden"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| type="hidden" +| <hr> + +#data +<!doctype html><isindex name="foo"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| <hr> + +#data +<!doctype html><ruby><p><rp> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <p> +| <rp> + +#data +<!doctype html><ruby><div><span><rp> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <span> +| <rp> + +#data +<!doctype html><ruby><div><p><rp> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <p> +| <rp> + +#data +<!doctype html><ruby><p><rt> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <p> +| <rt> + +#data +<!doctype html><ruby><div><span><rt> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <span> +| <rt> + +#data +<!doctype html><ruby><div><p><rt> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <p> +| <rt> + +#data +<!doctype html><math/><foo> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <foo> + +#data +<!doctype html><svg/><foo> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <foo> + +#data +<!doctype html><div></body><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| <!-- foo --> + +#data +<!doctype html><h1><div><h3><span></h1>foo +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <h1> +| <div> +| <h3> +| <span> +| "foo" + +#data +<!doctype html><p></h3>foo +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "foo" + +#data +<!doctype html><h3><li>abc</h2>foo +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <h3> +| <li> +| "abc" +| "foo" + +#data +<!doctype html><table>abc<!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "abc" +| <table> +| <!-- foo --> + +#data +<!doctype html><table> <!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| " " +| <!-- foo --> + +#data +<!doctype html><table> b <!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " b " +| <table> +| <!-- foo --> + +#data +<!doctype html><select><option><option> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> +| <option> + +#data +<!doctype html><select><option></optgroup> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> + +#data +<!doctype html><select><option></optgroup> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> + +#data +<!doctype html><p><math><mi><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mi> +| <p> +| <h1> + +#data +<!doctype html><p><math><mo><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mo> +| <p> +| <h1> + +#data +<!doctype html><p><math><mn><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mn> +| <p> +| <h1> + +#data +<!doctype html><p><math><ms><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math ms> +| <p> +| <h1> + +#data +<!doctype html><p><math><mtext><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mtext> +| <p> +| <h1> + +#data +<!doctype html><frameset></noframes> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><html c=d><body></html><html a=b> +#errors +#document +| <!DOCTYPE html> +| <html> +| a="b" +| c="d" +| <head> +| <body> + +#data +<!doctype html><html c=d><frameset></frameset></html><html a=b> +#errors +#document +| <!DOCTYPE html> +| <html> +| a="b" +| c="d" +| <head> +| <frameset> + +#data +<!doctype html><html><frameset></frameset></html><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <!-- foo --> + +#data +<!doctype html><html><frameset></frameset></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| " " + +#data +<!doctype html><html><frameset></frameset></html>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><html><frameset></frameset></html><p> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><html><frameset></frameset></html></p> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<html><frameset></frameset></html><!doctype html> +#errors +#document +| <html> +| <head> +| <frameset> + +#data +<!doctype html><body><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> + +#data +<!doctype html><p><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><p>a<frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "a" + +#data +<!doctype html><p> <frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><pre><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <pre> + +#data +<!doctype html><listing><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <listing> + +#data +<!doctype html><li><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <li> + +#data +<!doctype html><dd><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dd> + +#data +<!doctype html><dt><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dt> + +#data +<!doctype html><button><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <button> + +#data +<!doctype html><applet><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <applet> + +#data +<!doctype html><marquee><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <marquee> + +#data +<!doctype html><object><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <object> + +#data +<!doctype html><table><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> + +#data +<!doctype html><area><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <area> + +#data +<!doctype html><basefont><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <basefont> +| <frameset> + +#data +<!doctype html><bgsound><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <bgsound> +| <frameset> + +#data +<!doctype html><br><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <br> + +#data +<!doctype html><embed><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <embed> + +#data +<!doctype html><img><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <img> + +#data +<!doctype html><input><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <input> + +#data +<!doctype html><keygen><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <keygen> + +#data +<!doctype html><wbr><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <wbr> + +#data +<!doctype html><hr><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <hr> + +#data +<!doctype html><textarea></textarea><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> + +#data +<!doctype html><xmp></xmp><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <xmp> + +#data +<!doctype html><iframe></iframe><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <iframe> + +#data +<!doctype html><select></select><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><svg></svg><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><math></math><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><svg><foreignObject><div> <frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><svg>a</svg><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| "a" + +#data +<!doctype html><svg> </svg><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<html>aaa<frameset></frameset> +#errors +#document +| <html> +| <head> +| <body> +| "aaa" + +#data +<html> a <frameset></frameset> +#errors +#document +| <html> +| <head> +| <body> +| "a " + +#data +<!doctype html><div><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><div><body><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> + +#data +<!doctype html><p><math></p>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| "a" + +#data +<!doctype html><p><math><mn><span></p>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mn> +| <span> +| <p> +| "a" + +#data +<!doctype html><math></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> + +#data +<!doctype html><meta charset="ascii"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <meta> +| charset="ascii" +| <body> + +#data +<!doctype html><meta http-equiv="content-type" content="text/html;charset=ascii"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <meta> +| content="text/html;charset=ascii" +| http-equiv="content-type" +| <body> + +#data +<!doctype html><head><!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset="utf8"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <!-- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa --> +| <meta> +| charset="utf8" +| <body> + +#data +<!doctype html><html a=b><head></head><html c=d> +#errors +#document +| <!DOCTYPE html> +| <html> +| a="b" +| c="d" +| <head> +| <body> + +#data +<!doctype html><image/> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <img> + +#data +<!doctype html>a<i>b<table>c<b>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "a" +| <i> +| "bc" +| <b> +| "de" +| "f" +| <table> + +#data +<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <b> +| <i> +| "c" +| <a> +| "d" +| <a> +| "e" +| <a> +| "f" +| <table> + +#data +<!doctype html><i>a<b>b<div>c<a>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <b> +| <i> +| "c" +| <a> +| "d" +| <a> +| "e" +| <a> +| "f" + +#data +<!doctype html><table><i>a<b>b<div>c</i> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <i> +| "c" +| <table> + +#data +<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <b> +| <i> +| "c" +| <a> +| "d" +| <a> +| "e" +| <a> +| "f" +| <table> + +#data +<!doctype html><table><i>a<div>b<tr>c<b>d</i>e +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <div> +| "b" +| <i> +| "c" +| <b> +| "d" +| <b> +| "e" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><td><table><i>a<div>b<b>c</i>d +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <i> +| "a" +| <div> +| <i> +| "b" +| <b> +| "c" +| <b> +| "d" +| <table> + +#data +<!doctype html><body><bgsound> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <bgsound> + +#data +<!doctype html><body><basefont> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <basefont> + +#data +<!doctype html><a><b></a><basefont> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <a> +| <b> +| <basefont> + +#data +<!doctype html><a><b></a><bgsound> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <a> +| <b> +| <bgsound> + +#data +<!doctype html><figcaption><article></figcaption>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <figcaption> +| <article> +| "a" + +#data +<!doctype html><summary><article></summary>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <summary> +| <article> +| "a" + +#data +<!doctype html><p><a><plaintext>b +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <a> +| <plaintext> +| <a> +| "b" + +#data +<!DOCTYPE html><div>a<a></div>b<p>c</p>d +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| "a" +| <a> +| <a> +| "b" +| <p> +| "c" +| "d" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat new file mode 100644 index 0000000000..60d8592216 --- /dev/null +++ b/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat @@ -0,0 +1,763 @@ +#data +<!DOCTYPE html>Test +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "Test" + +#data +<textarea>test</div>test +#errors +Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. +Line: 1 Col: 24 Expected closing tag. Unexpected end of file. +#document +| <html> +| <head> +| <body> +| <textarea> +| "test</div>test" + +#data +<table><td> +#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. +Line: 1 Col: 11 Expected closing tag. Unexpected end of file. +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> + +#data +<table><td>test</tbody></table> +#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| "test" + +#data +<frame>test +#errors +Line: 1 Col: 7 Unexpected start tag (frame). Expected DOCTYPE. +Line: 1 Col: 7 Unexpected start tag frame. Ignored. +#document +| <html> +| <head> +| <body> +| "test" + +#data +<!DOCTYPE html><frameset>test +#errors +Line: 1 Col: 29 Unepxected characters in the frameset phase. Characters ignored. +Line: 1 Col: 29 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!DOCTYPE html><frameset><!DOCTYPE html> +#errors +Line: 1 Col: 40 Unexpected DOCTYPE. Ignored. +Line: 1 Col: 40 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!DOCTYPE html><font><p><b>test</font> +#errors +Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. +Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <font> +| <p> +| <font> +| <b> +| "test" + +#data +<!DOCTYPE html><dt><div><dd> +#errors +Line: 1 Col: 28 Missing end tag (div, dt). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dt> +| <div> +| <dd> + +#data +<script></x +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</x" +| <body> + +#data +<table><plaintext><td> +#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 18 Unexpected start tag (plaintext) in table context caused voodoo mode. +Line: 1 Col: 22 Unexpected end of file. Expected table content. +#document +| <html> +| <head> +| <body> +| <plaintext> +| "<td>" +| <table> + +#data +<plaintext></plaintext> +#errors +Line: 1 Col: 11 Unexpected start tag (plaintext). Expected DOCTYPE. +Line: 1 Col: 23 Expected closing tag. Unexpected end of file. +#document +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" + +#data +<!DOCTYPE html><table><tr>TEST +#errors +Line: 1 Col: 30 Unexpected non-space characters in table context caused voodoo mode. +Line: 1 Col: 30 Unexpected end of file. Expected table content. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "TEST" +| <table> +| <tbody> +| <tr> + +#data +<!DOCTYPE html><body t1=1><body t2=2><body t3=3 t4=4> +#errors +Line: 1 Col: 37 Unexpected start tag (body). +Line: 1 Col: 53 Unexpected start tag (body). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| t1="1" +| t2="2" +| t3="3" +| t4="4" + +#data +</b test +#errors +Line: 1 Col: 8 Unexpected end of file in attribute name. +Line: 1 Col: 8 End tag contains unexpected attributes. +Line: 1 Col: 8 Unexpected end tag (b). Expected DOCTYPE. +Line: 1 Col: 8 Unexpected end tag (b) after the (implied) root element. +#document +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html></b test<b &=&>X +#errors +Line: 1 Col: 32 Named entity didn't end with ';'. +Line: 1 Col: 33 End tag contains unexpected attributes. +Line: 1 Col: 33 Unexpected end tag (b) after the (implied) root element. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "X" + +#data +<!doctypehtml><scrIPt type=text/x-foobar;baz>X</SCRipt +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +Line: 1 Col: 54 Unexpected end of file in the tag name. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| type="text/x-foobar;baz" +| "X</SCRipt" +| <body> + +#data +& +#errors +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&" + +#data +&# +#errors +Line: 1 Col: 1 Numeric entity expected. Got end of file instead. +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&#" + +#data +&#X +#errors +Line: 1 Col: 3 Numeric entity expected but none found. +Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&#X" + +#data +&#x +#errors +Line: 1 Col: 3 Numeric entity expected but none found. +Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&#x" + +#data +- +#errors +Line: 1 Col: 4 Numeric entity didn't end with ';'. +Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "-" + +#data +&x-test +#errors +Line: 1 Col: 1 Named entity expected. Got none. +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&x-test" + +#data +<!doctypehtml><p><li> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <li> + +#data +<!doctypehtml><p><dt> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <dt> + +#data +<!doctypehtml><p><dd> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <dd> + +#data +<!doctypehtml><p><form> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +Line: 1 Col: 23 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <form> + +#data +<!DOCTYPE html><p></P>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "X" + +#data +& +#errors +Line: 1 Col: 4 Named entity didn't end with ';'. +Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&" + +#data +&AMp; +#errors +Line: 1 Col: 1 Named entity expected. Got none. +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&AMp;" + +#data +<!DOCTYPE html><html><head></head><body><thisISasillyTESTelementNameToMakeSureCrazyTagNamesArePARSEDcorrectLY> +#errors +Line: 1 Col: 110 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly> + +#data +<!DOCTYPE html>X</body>X +#errors +Line: 1 Col: 24 Unexpected non-space characters in the after body phase. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "XX" + +#data +<!DOCTYPE html><!-- X +#errors +Line: 1 Col: 21 Unexpected end of file in comment. +#document +| <!DOCTYPE html> +| <!-- X --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><table><caption>test TEST</caption><td>test +#errors +Line: 1 Col: 54 Unexpected table cell start tag (td) in the table body phase. +Line: 1 Col: 58 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| "test TEST" +| <tbody> +| <tr> +| <td> +| "test" + +#data +<!DOCTYPE html><select><option><optgroup> +#errors +Line: 1 Col: 41 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> +| <optgroup> + +#data +<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option> +#errors +Line: 1 Col: 68 Unexpected select start tag in the select phase treated as select end tag. +Line: 1 Col: 76 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <optgroup> +| <option> +| <option> +| <option> + +#data +<!DOCTYPE html><select><optgroup><option><optgroup> +#errors +Line: 1 Col: 51 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <optgroup> +| <option> +| <optgroup> + +#data +<!DOCTYPE html><datalist><option>foo</datalist>bar +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <datalist> +| <option> +| "foo" +| "bar" + +#data +<!DOCTYPE html><font><input><input></font> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <font> +| <input> +| <input> + +#data +<!DOCTYPE html><!-- XXX - XXX --> +#errors +#document +| <!DOCTYPE html> +| <!-- XXX - XXX --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><!-- XXX - XXX +#errors +Line: 1 Col: 29 Unexpected end of file in comment (-) +#document +| <!DOCTYPE html> +| <!-- XXX - XXX --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><!-- XXX - XXX - XXX --> +#errors +#document +| <!DOCTYPE html> +| <!-- XXX - XXX - XXX --> +| <html> +| <head> +| <body> + +#data +<isindex test=x name=x> +#errors +Line: 1 Col: 23 Unexpected start tag (isindex). Expected DOCTYPE. +Line: 1 Col: 23 Unexpected start tag isindex. Don't use it! +#document +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| test="x" +| <hr> + +#data +test +test +#errors +Line: 2 Col: 4 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "test +test" + +#data +<!DOCTYPE html><body><title>test</body> +#errors +#document +| +| +| +| +| +| "test</body>" + +#data +<!DOCTYPE html><body><title>X +#errors +#document +| +| +| +| +| +| "X" +| <meta> +| name="z" +| <link> +| rel="foo" +| <style> +| " +x { content:"</style" } " + +#data +<!DOCTYPE html><select><optgroup></optgroup></select> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <optgroup> + +#data + + +#errors +Line: 2 Col: 1 Unexpected End of file. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html> <html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><script> +</script> <title>x +#errors +#document +| +| +| +| +#errors +Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. +Line: 1 Col: 21 Unexpected start tag (script) that can be in head. Moved. +#document +| +| +| +#errors +Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. +Line: 1 Col: 28 Unexpected start tag (style) that can be in head. Moved. +#document +| +| +| +#errors +Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. +#document +| +| +| +| +| "x" +| x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (style). +#document +| +| +| --> x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| +| +| x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| +| +| x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| +| +| x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| +| +|

+#errors +#document +| +| +| +| +| +| ddd +#errors +#document +| +| +| +#errors +#document +| +| +| +| +|
  • +| +| ", + " +
    << 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 +} + +const idleTimeout = 5 * time.Minute +const activeTimeout = 10 * time.Minute + +// TODO: put this into the standard library and actually send +// PING frames and GOAWAY, etc: golang.org/issue/14204 +func idleTimeoutHook() func(net.Conn, http.ConnState) { + var mu sync.Mutex + m := map[net.Conn]*time.Timer{} + return func(c net.Conn, cs http.ConnState) { + mu.Lock() + defer mu.Unlock() + if t, ok := m[c]; ok { + delete(m, c) + t.Stop() + } + var d time.Duration + switch cs { + case http.StateNew, http.StateIdle: + d = idleTimeout + case http.StateActive: + d = activeTimeout + default: + return + } + m[c] = time.AfterFunc(d, func() { + log.Printf("closing idle conn %v after %v", c.RemoteAddr(), d) + go c.Close() + }) + } +} + +func main() { + var srv http.Server + flag.BoolVar(&http2.VerboseLogs, "verbose", false, "Verbose HTTP/2 debugging.") + flag.Parse() + srv.Addr = *httpsAddr + srv.ConnState = idleTimeoutHook() + + 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 0000000000..df0866a307 --- /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.DevstorageFullControlScope, + 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{ + { + AccessConfigs: []*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.DevstorageFullControlScope, + 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 0000000000..a15a6abaf7 --- /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 0000000000..3a323e774e --- /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 0000000000..6db3891880 --- /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 0000000000..c59059bd64 --- /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 0000000000..f329c14212 --- /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 0000000000..fb5c5efb0f --- /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 0000000000..b70976f775 --- /dev/null +++ b/vendor/golang.org/x/net/http2/h2i/h2i.go @@ -0,0 +1,501 @@ +// 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 !plan9,!solaris + +/* +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": {run: (*h2i).cmdPing}, + "settings": { + 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": {run: (*h2i).cmdQuit}, + "headers": {run: (*h2i).cmdHeaders}, +} + +func usage() { + fmt.Fprintf(os.Stderr, "Usage: h2i \n\n") + flag.PrintDefaults() +} + +// 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() + os.Exit(2) + } + 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 0000000000..c2805f6ac4 --- /dev/null +++ b/vendor/golang.org/x/net/http2/headermap.go @@ -0,0 +1,78 @@ +// 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", + "trailer", + "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 0000000000..f9bb033984 --- /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 0000000000..92286f3bad --- /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 0000000000..dcf257afa4 --- /dev/null +++ b/vendor/golang.org/x/net/http2/hpack/hpack.go @@ -0,0 +1,542 @@ +// 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 +} + +// IsPseudo reports whether the header field is an http2 pseudo header. +// That is, it reports whether it starts with a colon. +// It is not otherwise guaranteed to be a valid psuedo header field, +// though. +func (hf HeaderField) IsPseudo() bool { + return len(hf.Name) != 0 && hf.Name[0] == ':' +} + +func (hf HeaderField) String() string { + var suffix string + if hf.Sensitive { + suffix = " (sensitive)" + } + return fmt.Sprintf("header field %q = %q%s", hf.Name, hf.Value, suffix) +} + +// Size returns the size of an entry per RFC 7540 section 5.2. +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 +} + +// SetEmitFunc changes the callback used when new header fields +// are decoded. +// It must be non-nil. It does not affect EmitEnabled. +func (d *Decoder) SetEmitFunc(emitFunc func(f HeaderField)) { + d.emit = emitFunc +} + +// 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 0000000000..6dc69f9579 --- /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 0000000000..eb4b1f05cd --- /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 0000000000..b9283a0233 --- /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 0000000000..9d0003123a --- /dev/null +++ b/vendor/golang.org/x/net/http2/http2.go @@ -0,0 +1,464 @@ +// 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 package is low-level and intended to be used directly by very +// few people. Most users will use it indirectly through the automatic +// use by the net/http package (from Go 1.6 and later). +// For use in earlier Go versions see ConfigureServer. (Transport support +// requires Go 1.6 or later) +// +// See https://http2.github.io/ for more information on HTTP/2. +// +// See https://http2.golang.org/ for a test server running this code. +package http2 + +import ( + "bufio" + "crypto/tls" + "errors" + "fmt" + "io" + "net/http" + "os" + "sort" + "strconv" + "strings" + "sync" +) + +var ( + VerboseLogs bool + logFrameWrites bool + logFrameReads bool +) + +func init() { + e := os.Getenv("GODEBUG") + if strings.Contains(e, "http2debug=1") { + VerboseLogs = true + } + if strings.Contains(e, "http2debug=2") { + VerboseLogs = true + logFrameWrites = true + logFrameReads = true + } +} + +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)) +} + +var ( + errInvalidHeaderFieldName = errors.New("http2: invalid header field name") + errInvalidHeaderFieldValue = errors.New("http2: invalid header field value") +) + +// validHeaderFieldName reports whether v is a valid header field name (key). +// RFC 7230 says: +// header-field = field-name ":" OWS field-value OWS +// field-name = token +// token = 1*tchar +// tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / +// "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA +// Further, http2 says: +// "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. " +func validHeaderFieldName(v string) bool { + if len(v) == 0 { + return false + } + for _, r := range v { + if int(r) >= len(isTokenTable) || ('A' <= r && r <= 'Z') { + return false + } + if !isTokenTable[byte(r)] { + return false + } + } + return true +} + +// validHeaderFieldValue reports whether v is a valid header field value. +// +// RFC 7230 says: +// field-value = *( field-content / obs-fold ) +// obj-fold = N/A to http2, and deprecated +// field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] +// field-vchar = VCHAR / obs-text +// obs-text = %x80-FF +// VCHAR = "any visible [USASCII] character" +// +// http2 further says: "Similarly, HTTP/2 allows header field values +// that are not valid. While most of the values that can be encoded +// will not alter header field parsing, carriage return (CR, ASCII +// 0xd), line feed (LF, ASCII 0xa), and the zero character (NUL, ASCII +// 0x0) might be exploited by an attacker if they are translated +// verbatim. Any request or response that contains a character not +// permitted in a header field value MUST be treated as malformed +// (Section 8.1.2.6). Valid characters are defined by the +// field-content ABNF rule in Section 3.2 of [RFC7230]." +// +// This function does not (yet?) properly handle the rejection of +// strings that begin or end with SP or HTAB. +func validHeaderFieldValue(v string) bool { + for i := 0; i < len(v); i++ { + if b := v[i]; b < ' ' && b != '\t' || b == 0x7f { + 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) +} + +// bodyAllowedForStatus reports whether a given response status code +// permits a body. See RFC2616, section 4.4. +func bodyAllowedForStatus(status int) bool { + switch { + case status >= 100 && status <= 199: + return false + case status == 204: + return false + case status == 304: + return false + } + return true +} + +type httpError struct { + msg string + timeout bool +} + +func (e *httpError) Error() string { return e.msg } +func (e *httpError) Timeout() bool { return e.timeout } +func (e *httpError) Temporary() bool { return true } + +var errTimeout error = &httpError{msg: "http2: timeout awaiting response headers", timeout: true} + +var isTokenTable = [127]bool{ + '!': true, + '#': true, + '$': true, + '%': true, + '&': true, + '\'': true, + '*': true, + '+': true, + '-': true, + '.': true, + '0': true, + '1': true, + '2': true, + '3': true, + '4': true, + '5': true, + '6': true, + '7': true, + '8': true, + '9': true, + 'A': true, + 'B': true, + 'C': true, + 'D': true, + 'E': true, + 'F': true, + 'G': true, + 'H': true, + 'I': true, + 'J': true, + 'K': true, + 'L': true, + 'M': true, + 'N': true, + 'O': true, + 'P': true, + 'Q': true, + 'R': true, + 'S': true, + 'T': true, + 'U': true, + 'W': true, + 'V': true, + 'X': true, + 'Y': true, + 'Z': true, + '^': true, + '_': true, + '`': true, + 'a': true, + 'b': true, + 'c': true, + 'd': true, + 'e': true, + 'f': true, + 'g': true, + 'h': true, + 'i': true, + 'j': true, + 'k': true, + 'l': true, + 'm': true, + 'n': true, + 'o': true, + 'p': true, + 'q': true, + 'r': true, + 's': true, + 't': true, + 'u': true, + 'v': true, + 'w': true, + 'x': true, + 'y': true, + 'z': true, + '|': true, + '~': true, +} + +type connectionStater interface { + ConnectionState() tls.ConnectionState +} + +var sorterPool = sync.Pool{New: func() interface{} { return new(sorter) }} + +type sorter struct { + v []string // owned by sorter +} + +func (s *sorter) Len() int { return len(s.v) } +func (s *sorter) Swap(i, j int) { s.v[i], s.v[j] = s.v[j], s.v[i] } +func (s *sorter) Less(i, j int) bool { return s.v[i] < s.v[j] } + +// Keys returns the sorted keys of h. +// +// The returned slice is only valid until s used again or returned to +// its pool. +func (s *sorter) Keys(h http.Header) []string { + keys := s.v[:0] + for k := range h { + keys = append(keys, k) + } + s.v = keys + sort.Sort(s) + return keys +} + +func (s *sorter) SortStrings(ss []string) { + // Our sorter works on s.v, which sorter owners, so + // stash it away while we sort the user's buffer. + save := s.v + s.v = ss + sort.Sort(s) + s.v = save +} 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 0000000000..34dcb13732 --- /dev/null +++ b/vendor/golang.org/x/net/http2/http2_test.go @@ -0,0 +1,198 @@ +// 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() +} + +func cleanDate(res *http.Response) { + if d := res.Header["Date"]; len(d) == 1 { + d[0] = "XXX" + } +} + +func TestSorterPoolAllocs(t *testing.T) { + ss := []string{"a", "b", "c"} + h := http.Header{ + "a": nil, + "b": nil, + "c": nil, + } + sorter := new(sorter) + + if allocs := testing.AllocsPerRun(100, func() { + sorter.SortStrings(ss) + }); allocs >= 1 { + t.Logf("SortStrings allocs = %v; want <1", allocs) + } + + if allocs := testing.AllocsPerRun(5, func() { + if len(sorter.Keys(h)) != 3 { + t.Fatal("wrong result") + } + }); allocs > 0 { + t.Logf("Keys allocs = %v; want <1", allocs) + } +} diff --git a/vendor/golang.org/x/net/http2/not_go15.go b/vendor/golang.org/x/net/http2/not_go15.go new file mode 100644 index 0000000000..d0fa5c8906 --- /dev/null +++ b/vendor/golang.org/x/net/http2/not_go15.go @@ -0,0 +1,11 @@ +// 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.5 + +package http2 + +import "net/http" + +func requestCancel(req *http.Request) <-chan struct{} { return nil } diff --git a/vendor/golang.org/x/net/http2/not_go16.go b/vendor/golang.org/x/net/http2/not_go16.go new file mode 100644 index 0000000000..db53c5b8cb --- /dev/null +++ b/vendor/golang.org/x/net/http2/not_go16.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) (*Transport, error) { + return nil, errTransportVersion +} 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 0000000000..69446e7a37 --- /dev/null +++ b/vendor/golang.org/x/net/http2/pipe.go @@ -0,0 +1,147 @@ +// 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 lazily initialized to &p.mu + b pipeBuffer + err error // read error once empty. non-nil means closed. + breakErr error // immediate read error (caller doesn't see rest of b) + donec chan struct{} // closed on error + readFn func() // optional code to run in Read before error +} + +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.breakErr != nil { + return 0, p.breakErr + } + if p.b.Len() > 0 { + return p.b.Read(d) + } + if p.err != nil { + if p.readFn != nil { + p.readFn() // e.g. copy trailers + p.readFn = nil // not sticky like p.err + } + 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 the next Read (waking up a current blocked +// Read if needed) to return the provided err after all data has been +// read. +// +// The error must be non-nil. +func (p *pipe) CloseWithError(err error) { p.closeWithError(&p.err, err, nil) } + +// BreakWithError causes the next Read (waking up a current blocked +// Read if needed) to return the provided err immediately, without +// waiting for unread data. +func (p *pipe) BreakWithError(err error) { p.closeWithError(&p.breakErr, err, nil) } + +// closeWithErrorAndCode is like CloseWithError but also sets some code to run +// in the caller's goroutine before returning the error. +func (p *pipe) closeWithErrorAndCode(err error, fn func()) { p.closeWithError(&p.err, err, fn) } + +func (p *pipe) closeWithError(dst *error, err error, fn func()) { + if err == nil { + panic("err 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 *dst != nil { + // Already been done. + return + } + p.readFn = fn + *dst = err + p.closeDoneLocked() +} + +// requires p.mu be held. +func (p *pipe) closeDoneLocked() { + if p.donec == nil { + return + } + // Close if unclosed. This isn't racy since we always + // hold p.mu while closing. + select { + case <-p.donec: + default: + close(p.donec) + } +} + +// Err returns the error (if any) first set by BreakWithError or CloseWithError. +func (p *pipe) Err() error { + p.mu.Lock() + defer p.mu.Unlock() + if p.breakErr != nil { + return p.breakErr + } + return p.err +} + +// Done returns a channel which is closed if and when this pipe is closed +// with CloseWithError. +func (p *pipe) Done() <-chan struct{} { + p.mu.Lock() + defer p.mu.Unlock() + if p.donec == nil { + p.donec = make(chan struct{}) + if p.err != nil || p.breakErr != nil { + // Already hit an error. + p.closeDoneLocked() + } + } + return p.donec +} 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 0000000000..7632299996 --- /dev/null +++ b/vendor/golang.org/x/net/http2/pipe_test.go @@ -0,0 +1,109 @@ +// 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" + "io" + "io/ioutil" + "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) + } +} + +func TestPipeDoneChan(t *testing.T) { + var p pipe + done := p.Done() + select { + case <-done: + t.Fatal("done too soon") + default: + } + p.CloseWithError(io.EOF) + select { + case <-done: + default: + t.Fatal("should be done") + } +} + +func TestPipeDoneChan_ErrFirst(t *testing.T) { + var p pipe + p.CloseWithError(io.EOF) + done := p.Done() + select { + case <-done: + default: + t.Fatal("should be done") + } +} + +func TestPipeDoneChan_Break(t *testing.T) { + var p pipe + done := p.Done() + select { + case <-done: + t.Fatal("done too soon") + default: + } + p.BreakWithError(io.EOF) + select { + case <-done: + default: + t.Fatal("should be done") + } +} + +func TestPipeDoneChan_Break_ErrFirst(t *testing.T) { + var p pipe + p.BreakWithError(io.EOF) + done := p.Done() + select { + case <-done: + default: + t.Fatal("should be done") + } +} + +func TestPipeCloseWithError(t *testing.T) { + p := &pipe{b: new(bytes.Buffer)} + const body = "foo" + io.WriteString(p, body) + a := errors.New("test error") + p.CloseWithError(a) + all, err := ioutil.ReadAll(p) + if string(all) != body { + t.Errorf("read bytes = %q; want %q", all, body) + } + if err != a { + t.Logf("read error = %v, %v", err, a) + } +} + +func TestPipeBreakWithError(t *testing.T) { + p := &pipe{b: new(bytes.Buffer)} + io.WriteString(p, "foo") + a := errors.New("test err") + p.BreakWithError(a) + all, err := ioutil.ReadAll(p) + if string(all) != "" { + t.Errorf("read bytes = %q; want empty string", all) + } + if err != a { + t.Logf("read error = %v, %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 0000000000..a3fe2bb490 --- /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 0000000000..5f62b49e49 --- /dev/null +++ b/vendor/golang.org/x/net/http2/server.go @@ -0,0 +1,2182 @@ +// 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: re-audit GOAWAY support. Consider each incoming frame type and +// whether it should be ignored during graceful shutdown. + +// 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/textproto" + "net/url" + "os" + "reflect" + "runtime" + "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.ServeConn(c, &ServeConnOpts{ + Handler: h, + BaseConfig: hs, + }) + } + s.TLSNextProto[NextProtoTLS] = protoHandler + s.TLSNextProto["h2-14"] = protoHandler // temporary; see above. + return nil +} + +// ServeConnOpts are options for the Server.ServeConn method. +type ServeConnOpts struct { + // BaseConfig optionally sets the base configuration + // for values. If nil, defaults are used. + BaseConfig *http.Server + + // Handler specifies which handler to use for processing + // requests. If nil, BaseConfig.Handler is used. If BaseConfig + // or BaseConfig.Handler is nil, http.DefaultServeMux is used. + Handler http.Handler +} + +func (o *ServeConnOpts) baseConfig() *http.Server { + if o != nil && o.BaseConfig != nil { + return o.BaseConfig + } + return new(http.Server) +} + +func (o *ServeConnOpts) handler() http.Handler { + if o != nil { + if o.Handler != nil { + return o.Handler + } + if o.BaseConfig != nil && o.BaseConfig.Handler != nil { + return o.BaseConfig.Handler + } + } + return http.DefaultServeMux +} + +// ServeConn serves HTTP/2 requests on the provided connection and +// blocks until the connection is no longer readable. +// +// ServeConn starts speaking HTTP/2 assuming that c has not had any +// reads or writes. It writes its initial settings frame and expects +// to be able to read the preface and settings frame from the +// client. If c has a ConnectionState method like a *tls.Conn, the +// ConnectionState is used to verify the TLS ciphersuite and to set +// the Request.TLS field in Handlers. +// +// ServeConn does not support h2c by itself. Any h2c support must be +// implemented in terms of providing a suitably-behaving net.Conn. +// +// The opts parameter is optional. If nil, default values are used. +func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) { + sc := &serverConn{ + srv: s, + hs: opts.baseConfig(), + conn: c, + remoteAddrStr: c.RemoteAddr().String(), + bw: newBufferedWriter(c), + handler: opts.handler(), + 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: s.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) + + fr := NewFramer(sc.bw, c) + fr.ReadMetaHeaders = hpack.NewDecoder(initialHeaderTableSize, nil) + fr.MaxHeaderListSize = sc.maxHeaderListSize() + fr.SetMaxReadFrameSize(s.maxReadFrameSize()) + sc.framer = fr + + if tc, ok := c.(connectionStater); 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 !s.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("http2: server 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 + 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 + 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 + freeRequestBodyBuf []byte // if non-nil, a free initialWindowSize buffer for getRequestBodyBuf + + // Owned by the writeFrameAsync goroutine: + headerWriteBuf bytes.Buffer + hpackEncoder *hpack.Encoder +} + +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) +} + +// 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: + sc *serverConn + 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 + numTrailerValues int64 + weight uint8 + state streamState + sentReset bool // only true once detached from streams map + gotReset bool // only true once detacted from streams map + gotTrailerHeader bool // HEADER frame for trailers was seen + reqBuf []byte + + trailer http.Header // accumulated trailers + reqTrailer http.Header // handler's Request.Trailer +} + +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...) + } +} + +// errno returns v's underlying uintptr, else 0. +// +// TODO: remove this helper function once http2 can use build +// tags. See comment in isClosedConnError. +func errno(v error) uintptr { + if rv := reflect.ValueOf(v); rv.Kind() == reflect.Uintptr { + return uintptr(rv.Uint()) + } + return 0 +} + +// isClosedConnError reports whether err is an error from use of a closed +// network connection. +func isClosedConnError(err error) bool { + if err == nil { + return false + } + + // TODO: remove this string search and be more like the Windows + // case below. That might involve modifying the standard library + // to return better error types. + str := err.Error() + if strings.Contains(str, "use of closed network connection") { + return true + } + + // TODO(bradfitz): x/tools/cmd/bundle doesn't really support + // build tags, so I can't make an http2_windows.go file with + // Windows-specific stuff. Fix that and move this, once we + // have a way to bundle this into std's net/http somehow. + if runtime.GOOS == "windows" { + if oe, ok := err.(*net.OpError); ok && oe.Op == "read" { + if se, ok := oe.Err.(*os.SyscallError); ok && se.Syscall == "wsarecv" { + const WSAECONNABORTED = 10053 + const WSAECONNRESET = 10054 + if n := errno(se.Err); n == WSAECONNRESET || n == WSAECONNABORTED { + return true + } + } + } + } + return false +} + +func (sc *serverConn) condlogf(err error, format string, args ...interface{}) { + if err == nil { + return + } + if err == io.EOF || err == io.ErrUnexpectedEOF || isClosedConnError(err) { + // Boring, expected errors. + sc.vlogf(format, args...) + } else { + sc.logf(format, args...) + } +} + +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) + gateDone := gate.Done + for { + f, err := sc.framer.ReadFrame() + select { + case sc.readFrameCh <- readFrameResult{f, err, gateDone}: + case <-sc.doneServing: + return + } + select { + case <-gate: + case <-sc.doneServing: + return + } + if terminalReadFrameError(err) { + 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() { + // Note: this is for serverConn.serve panicking, not http.Handler code. + 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 + + if VerboseLogs { + sc.vlogf("http2: server 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, "http2: server: 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 { + if VerboseLogs { + sc.vlogf("http2: server: 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) +} + +// errHandlerPanicked is the error given to any callers blocked in a read from +// Request.Body when the main goroutine panics. Since most handlers read in the +// the main ServeHTTP goroutine, this will show up rarely. +var errHandlerPanicked = errors.New("http2: handler panicked") + +// 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) + + if _, ok := wm.write.(handlerPanicRST); ok { + sc.closeStream(st, errHandlerPanicked) + } + + // 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) + } +} + +// 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 || err == io.ErrUnexpectedEOF || isClosedConnError(err) + 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 + if VerboseLogs { + sc.vlogf("http2: server read frame %v", summarizeFrame(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("http2: server connection error from %v: %v", sc.conn.RemoteAddr(), ev) + sc.goAway(ErrCode(ev)) + return true // goAway will handle shutdown + default: + if res.err != nil { + sc.vlogf("http2: server closing client connection; error reading frame from client %s: %v", sc.conn.RemoteAddr(), err) + } else { + sc.logf("http2: server closing client connection: %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 + } + + switch f := f.(type) { + case *SettingsFrame: + return sc.processSettings(f) + case *MetaHeadersFrame: + return sc.processHeaders(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("http2: server 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) + if st.reqBuf != nil { + // Stash this request body buffer (64k) away for reuse + // by a future POST/PUT/etc. + // + // TODO(bradfitz): share on the server? sync.Pool? + // Server requires locks and might hurt contention. + // sync.Pool might work, or might be worse, depending + // on goroutine CPU migrations. (get and put on + // separate CPUs). Maybe a mix of strategies. But + // this is an easy win for now. + sc.freeRequestBodyBuf = st.reqBuf + } +} + +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 + } + if VerboseLogs { + sc.vlogf("http2: server 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." + if VerboseLogs { + sc.vlogf("http2: server ignoring unknown setting %v", s) + } + } + 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 || st.gotTrailerHeader { + // 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() { + st.endStream() + } + return nil +} + +// endStream closes a Request.Body's pipe. It is called when a DATA +// frame says a request body is over (or after trailers). +func (st *stream) endStream() { + sc := st.sc + sc.serveG.check() + + 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.closeWithErrorAndCode(io.EOF, st.copyTrailersToHandlerRequest) + st.body.CloseWithError(io.EOF) + } + st.state = stateHalfClosedRemote +} + +// copyTrailersToHandlerRequest is run in the Handler's goroutine in +// its Request.Body.Read just before it gets io.EOF. +func (st *stream) copyTrailersToHandlerRequest() { + for k, vv := range st.trailer { + if _, ok := st.reqTrailer[k]; ok { + // Only copy it over it was pre-declared. + st.reqTrailer[k] = vv + } + } +} + +func (sc *serverConn) processHeaders(f *MetaHeadersFrame) 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 + // Streams initiated by a client MUST use odd-numbered stream + // identifiers. [...] An endpoint that receives an unexpected + // stream identifier MUST respond with a connection error + // (Section 5.4.1) of type PROTOCOL_ERROR. + if id%2 != 1 { + return ConnectionError(ErrCodeProtocol) + } + // A HEADERS frame can be used to create a new stream or + // send a trailer for an open one. If we already have a stream + // open, let it process its own HEADERS frame (trailers at this + // point, if it's valid). + st := sc.streams[f.Header().StreamID] + if st != nil { + return st.processTrailerHeaders(f) + } + + // [...] 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. + if id <= sc.maxStreamID { + return ConnectionError(ErrCodeProtocol) + } + sc.maxStreamID = id + + st = &stream{ + sc: sc, + 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) + } + 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(st, f) + if err != nil { + return err + } + st.reqTrailer = req.Trailer + if st.reqTrailer != nil { + st.trailer = make(http.Header) + } + st.body = req.Body.(*requestBody).pipe // may be nil + st.declBodyBytes = req.ContentLength + + handler := sc.handler.ServeHTTP + if f.Truncated { + // Their header list was too long. Send a 431 error. + handler = handleHeaderListTooLong + } + + go sc.runHandler(rw, req, handler) + return nil +} + +func (st *stream) processTrailerHeaders(f *MetaHeadersFrame) error { + sc := st.sc + sc.serveG.check() + if st.gotTrailerHeader { + return ConnectionError(ErrCodeProtocol) + } + st.gotTrailerHeader = true + if !f.StreamEnded() { + return StreamError{st.id, ErrCodeProtocol} + } + + if len(f.PseudoFields()) > 0 { + return StreamError{st.id, ErrCodeProtocol} + } + if st.trailer != nil { + for _, hf := range f.RegularFields() { + key := sc.canonicalHeader(hf.Name) + st.trailer[key] = append(st.trailer[key], hf.Value) + } + } + st.endStream() + 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 + } + } + } +} + +func (sc *serverConn) newWriterAndRequest(st *stream, f *MetaHeadersFrame) (*responseWriter, *http.Request, error) { + sc.serveG.check() + + method := f.PseudoValue("method") + path := f.PseudoValue("path") + scheme := f.PseudoValue("scheme") + authority := f.PseudoValue("authority") + + isConnect := method == "CONNECT" + if isConnect { + if path != "" || scheme != "" || authority == "" { + return nil, nil, StreamError{f.StreamID, ErrCodeProtocol} + } + } else if method == "" || path == "" || + (scheme != "https" && 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{f.StreamID, ErrCodeProtocol} + } + + bodyOpen := !f.StreamEnded() + if method == "HEAD" && bodyOpen { + // HEAD requests can't have bodies + return nil, nil, StreamError{f.StreamID, ErrCodeProtocol} + } + var tlsState *tls.ConnectionState // nil if not scheme https + + if scheme == "https" { + tlsState = sc.tlsState + } + + header := make(http.Header) + for _, hf := range f.RegularFields() { + header.Add(sc.canonicalHeader(hf.Name), hf.Value) + } + + if authority == "" { + authority = header.Get("Host") + } + needsContinue := header.Get("Expect") == "100-continue" + if needsContinue { + header.Del("Expect") + } + // Merge Cookie headers into one "; "-delimited value. + if cookies := header["Cookie"]; len(cookies) > 1 { + header.Set("Cookie", strings.Join(cookies, "; ")) + } + + // Setup Trailers + var trailer http.Header + for _, v := range header["Trailer"] { + for _, key := range strings.Split(v, ",") { + key = http.CanonicalHeaderKey(strings.TrimSpace(key)) + switch key { + case "Transfer-Encoding", "Trailer", "Content-Length": + // Bogus. (copy of http1 rules) + // Ignore. + default: + if trailer == nil { + trailer = make(http.Header) + } + trailer[key] = nil + } + } + } + delete(header, "Trailer") + + body := &requestBody{ + conn: sc, + stream: st, + needsContinue: needsContinue, + } + var url_ *url.URL + var requestURI string + if isConnect { + url_ = &url.URL{Host: authority} + requestURI = authority // mimic HTTP/1 server behavior + } else { + var err error + url_, err = url.ParseRequestURI(path) + if err != nil { + return nil, nil, StreamError{f.StreamID, ErrCodeProtocol} + } + requestURI = path + } + req := &http.Request{ + Method: method, + URL: url_, + RemoteAddr: sc.remoteAddrStr, + Header: header, + RequestURI: requestURI, + Proto: "HTTP/2.0", + ProtoMajor: 2, + ProtoMinor: 0, + TLS: tlsState, + Host: authority, + Body: body, + Trailer: trailer, + } + if bodyOpen { + // Disabled, per golang.org/issue/14960: + // st.reqBuf = sc.getRequestBodyBuf() + // TODO: remove this 64k of garbage per request (again, but without a data race): + buf := make([]byte, initialWindowSize) + + body.pipe = &pipe{ + b: &fixedBuffer{buf: buf}, + } + + if vv, ok := 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 = st + rws.req = req + rws.body = body + + rw := &responseWriter{rws: rws} + return rw, req, nil +} + +func (sc *serverConn) getRequestBodyBuf() []byte { + sc.serveG.check() + if buf := sc.freeRequestBodyBuf; buf != nil { + sc.freeRequestBodyBuf = nil + return buf + } + return make([]byte, initialWindowSize) +} + +// Run on its own goroutine. +func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) { + didPanic := true + defer func() { + if didPanic { + e := recover() + // Same as net/http: + const size = 64 << 10 + buf := make([]byte, size) + buf = buf[:runtime.Stack(buf, false)] + sc.writeFrameFromHandler(frameWriteMsg{ + write: handlerPanicRST{rw.rws.stream.id}, + stream: rw.rws.stream, + }) + sc.logf("http2: panic serving %v: %v\n%s", sc.conn.RemoteAddr(), e, buf) + return + } + rw.handlerDone() + }() + handler(rw, req) + didPanic = false +} + +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 + trailers []string // set in writeChunk + 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 + + sentContentLen int64 // non-zero if handler set a Content-Length header + wroteBytes int64 + + 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) } + +func (rws *responseWriterState) hasTrailers() bool { return len(rws.trailers) != 0 } + +// declareTrailer is called for each Trailer header when the +// response header is written. It notes that a header will need to be +// written in the trailers at the end of the response. +func (rws *responseWriterState) declareTrailer(k string) { + k = http.CanonicalHeaderKey(k) + switch k { + case "Transfer-Encoding", "Content-Length", "Trailer": + // Forbidden by RFC 2616 14.40. + return + } + if !strSliceContains(rws.trailers, k) { + rws.trailers = append(rws.trailers, k) + } +} + +// 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) + } + + isHeadResp := rws.req.Method == "HEAD" + if !rws.sentHeader { + rws.sentHeader = true + var ctype, clen string + if clen = rws.snapHeader.Get("Content-Length"); clen != "" { + rws.snapHeader.Del("Content-Length") + clen64, err := strconv.ParseInt(clen, 10, 64) + if err == nil && clen64 >= 0 { + rws.sentContentLen = clen64 + } else { + clen = "" + } + } + if clen == "" && rws.handlerDone && bodyAllowedForStatus(rws.status) && (len(p) > 0 || !isHeadResp) { + clen = strconv.Itoa(len(p)) + } + _, hasContentType := rws.snapHeader["Content-Type"] + if !hasContentType && bodyAllowedForStatus(rws.status) { + ctype = http.DetectContentType(p) + } + var date string + if _, ok := rws.snapHeader["Date"]; !ok { + // TODO(bradfitz): be faster here, like net/http? measure. + date = time.Now().UTC().Format(http.TimeFormat) + } + + for _, v := range rws.snapHeader["Trailer"] { + foreachHeaderElement(v, rws.declareTrailer) + } + + endStream := (rws.handlerDone && !rws.hasTrailers() && len(p) == 0) || isHeadResp + err = rws.conn.writeHeaders(rws.stream, &writeResHeaders{ + streamID: rws.stream.id, + httpResCode: rws.status, + h: rws.snapHeader, + endStream: endStream, + contentType: ctype, + contentLength: clen, + date: date, + }) + if err != nil { + return 0, err + } + if endStream { + return 0, nil + } + } + if isHeadResp { + return len(p), nil + } + if len(p) == 0 && !rws.handlerDone { + return 0, nil + } + + if rws.handlerDone { + rws.promoteUndeclaredTrailers() + } + + endStream := rws.handlerDone && !rws.hasTrailers() + if len(p) > 0 || endStream { + // only send a 0 byte DATA frame if we're ending the stream. + if err := rws.conn.writeDataFromHandler(rws.stream, p, endStream); err != nil { + return 0, err + } + } + + if rws.handlerDone && rws.hasTrailers() { + err = rws.conn.writeHeaders(rws.stream, &writeResHeaders{ + streamID: rws.stream.id, + h: rws.handlerHeader, + trailers: rws.trailers, + endStream: true, + }) + return len(p), err + } + return len(p), nil +} + +// TrailerPrefix is a magic prefix for ResponseWriter.Header map keys +// that, if present, signals that the map entry is actually for +// the response trailers, and not the response headers. The prefix +// is stripped after the ServeHTTP call finishes and the values are +// sent in the trailers. +// +// This mechanism is intended only for trailers that are not known +// prior to the headers being written. If the set of trailers is fixed +// or known before the header is written, the normal Go trailers mechanism +// is preferred: +// https://golang.org/pkg/net/http/#ResponseWriter +// https://golang.org/pkg/net/http/#example_ResponseWriter_trailers +const TrailerPrefix = "Trailer:" + +// promoteUndeclaredTrailers permits http.Handlers to set trailers +// after the header has already been flushed. Because the Go +// ResponseWriter interface has no way to set Trailers (only the +// Header), and because we didn't want to expand the ResponseWriter +// interface, and because nobody used trailers, and because RFC 2616 +// says you SHOULD (but not must) predeclare any trailers in the +// header, the official ResponseWriter rules said trailers in Go must +// be predeclared, and then we reuse the same ResponseWriter.Header() +// map to mean both Headers and Trailers. When it's time to write the +// Trailers, we pick out the fields of Headers that were declared as +// trailers. That worked for a while, until we found the first major +// user of Trailers in the wild: gRPC (using them only over http2), +// and gRPC libraries permit setting trailers mid-stream without +// predeclarnig them. So: change of plans. We still permit the old +// way, but we also permit this hack: if a Header() key begins with +// "Trailer:", the suffix of that key is a Trailer. Because ':' is an +// invalid token byte anyway, there is no ambiguity. (And it's already +// filtered out) It's mildly hacky, but not terrible. +// +// This method runs after the Handler is done and promotes any Header +// fields to be trailers. +func (rws *responseWriterState) promoteUndeclaredTrailers() { + for k, vv := range rws.handlerHeader { + if !strings.HasPrefix(k, TrailerPrefix) { + continue + } + trailerKey := strings.TrimPrefix(k, TrailerPrefix) + rws.declareTrailer(trailerKey) + rws.handlerHeader[http.CanonicalHeaderKey(trailerKey)] = vv + } + + if len(rws.trailers) > 1 { + sorter := sorterPool.Get().(*sorter) + sorter.SortStrings(rws.trailers) + sorterPool.Put(sorter) + } +} + +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 !bodyAllowedForStatus(rws.status) { + return 0, http.ErrBodyNotAllowed + } + rws.wroteBytes += int64(len(dataB)) + int64(len(dataS)) // only one can be set + if rws.sentContentLen != 0 && rws.wroteBytes > rws.sentContentLen { + // TODO: send a RST_STREAM + return 0, errors.New("http2: handler wrote more than declared Content-Length") + } + + if dataB != nil { + return rws.bw.Write(dataB) + } else { + return rws.bw.WriteString(dataS) + } +} + +func (w *responseWriter) handlerDone() { + rws := w.rws + rws.handlerDone = true + w.Flush() + w.rws = nil + responseWriterStatePool.Put(rws) +} + +// foreachHeaderElement splits v according to the "#rule" construction +// in RFC 2616 section 2.1 and calls fn for each non-empty element. +func foreachHeaderElement(v string, fn func(string)) { + v = textproto.TrimString(v) + if v == "" { + return + } + if !strings.Contains(v, ",") { + fn(v) + return + } + for _, f := range strings.Split(v, ",") { + if f = textproto.TrimString(f); f != "" { + fn(f) + } + } +} 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 0000000000..c2df35530c --- /dev/null +++ b/vendor/golang.org/x/net/http2/server_test.go @@ -0,0 +1,3181 @@ +// 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 + hpackDec *hpack.Decoder + decodedHeaders [][2]string + + // 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") +var optQuiet = serverTesterOpt("quiet_logging") + +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"}, + } + + var onlyServer, quiet bool + for _, opt := range opts { + switch v := opt.(type) { + case func(*tls.Config): + v(tlsConfig) + case func(*httptest.Server): + v(ts) + case serverTesterOpt: + switch v { + case optOnlyServer: + onlyServer = true + case optQuiet: + quiet = true + } + 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) + st.hpackDec = hpack.NewDecoder(initialHeaderTableSize, st.onHeaderField) + + ts.TLS = ts.Config.TLSConfig // the httptest.Server has its own copy of this TLS config + if quiet { + ts.Config.ErrorLog = log.New(ioutil.Discard, "", 0) + } else { + 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() { + if st.t.Failed() { + // If we failed already (and are likely in a Fatal, + // unwindowing), force close the connection, so the + // httptest.Server doesn't wait forever for the conn + // to close. + st.cc.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) + } +} + +// encodeHeaderRaw is the magic-free version of encodeHeader. +// It takes 0 or more (k, v) pairs and encodes them. +func (st *serverTester) encodeHeaderRaw(headers ...string) []byte { + if len(headers)%2 == 1 { + panic("odd number of kv args") + } + st.headerBuf.Reset() + for len(headers) > 0 { + k, v := headers[0], headers[1] + st.encodeHeaderField(k, v) + headers = headers[2:] + } + return st.headerBuf.Bytes() +} + +// 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) + } + } + 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_HeaderFieldNameColon(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("has:colon", "v") }) +} + +func TestServer_Request_Reject_HeaderFieldNameNULL(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("has\x00null", "v") }) +} + +func TestServer_Request_Reject_HeaderFieldNameEmpty(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("", "v") }) +} + +func TestServer_Request_Reject_HeaderFieldValueNewline(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("foo", "has\nnewline") }) +} + +func TestServer_Request_Reject_HeaderFieldValueCR(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("foo", "has\rcarriage") }) +} + +func TestServer_Request_Reject_HeaderFieldValueDEL(t *testing.T) { + testRejectRequest(t, func(st *serverTester) { st.bodylessReq1("foo", "has\x7fdel") }) +} + +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_Request_Connect(t *testing.T) { + testServerRequest(t, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeaderRaw( + ":method", "CONNECT", + ":authority", "example.com:123", + ), + EndStream: true, + EndHeaders: true, + }) + }, func(r *http.Request) { + if g, w := r.Method, "CONNECT"; g != w { + t.Errorf("Method = %q; want %q", g, w) + } + if g, w := r.RequestURI, "example.com:123"; g != w { + t.Errorf("RequestURI = %q; want %q", g, w) + } + if g, w := r.URL.Host, "example.com:123"; g != w { + t.Errorf("URL.Host = %q; want %q", g, w) + } + }) +} + +func TestServer_Request_Connect_InvalidPath(t *testing.T) { + testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeaderRaw( + ":method", "CONNECT", + ":authority", "example.com:123", + ":path", "/bogus", + ), + EndStream: true, + EndHeaders: true, + }) + }) +} + +func TestServer_Request_Connect_InvalidScheme(t *testing.T) { + testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeaderRaw( + ":method", "CONNECT", + ":authority", "example.com:123", + ":scheme", "https", + ), + EndStream: true, + EndHeaders: true, + }) + }) +} + +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) { + if runtime.GOOS == "windows" { + t.Skip("see golang.org/issue/13434") + } + + 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) + } + if st.logBuf.Len() != 0 { + // Previously we spun here for a bit until the GOAWAY disconnect + // timer fired, logging while we fired. + t.Errorf("unexpected server output: %.500s\n", st.logBuf.Bytes()) + } +} + +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) { + want := StreamError{StreamID: 0x1, Code: 0x8} + if !reflect.DeepEqual(err, want) { + t.Errorf("Read error = %v; want %v", err, want) + } + }, + ) +} + +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) { + testServerRejectsConn(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) { + testServerRejectsConn(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) { + testServerRejectsConn(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) { + testServerRejectsConn(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) { + testServerRejectsConn(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) { + testServerRejectsConn(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) { + testServerRejectsConn(t, func(st *serverTester) { + pp := PushPromiseParam{ + StreamID: 1, + PromiseID: 3, + } + if err := st.fr.WritePushPromise(pp); err != nil { + t.Fatal(err) + } + }) +} + +// testServerRejectsConn tests that the server hangs up with a GOAWAY +// frame and a server close after the client does something +// deserving a CONNECTION_ERROR. +func testServerRejectsConn(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") + } +} + +// testServerRejectsStream tests that the server sends a RST_STREAM with the provided +// error code after a client sends a bogus request. +func testServerRejectsStream(t *testing.T, code ErrCode, writeReq func(*serverTester)) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {}) + defer st.Close() + st.greet() + writeReq(st) + st.wantRSTStream(1, code) +} + +// 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 := st.decodeHeader(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 := st.decodeHeader(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 := st.decodeHeader(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 := st.decodeHeader(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 := st.decodeHeader(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 := st.decodeHeader(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 := st.decodeHeader(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 := st.decodeHeader(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 := st.decodeHeader(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 = st.decodeHeader(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() +} + +func (st *serverTester) onHeaderField(f hpack.HeaderField) { + if f.Name == "date" { + return + } + st.decodedHeaders = append(st.decodedHeaders, [2]string{f.Name, f.Value}) +} + +func (st *serverTester) decodeHeader(headerBlock []byte) (pairs [][2]string) { + st.decodedHeaders = nil + if _, err := st.hpackDec.Write(headerBlock); err != nil { + st.t.Fatalf("hpack decoding error: %v", err) + } + if err := st.hpackDec.Close(); err != nil { + st.t.Fatalf("hpack decoding error: %v", err) + } + return st.decodedHeaders +} + +// 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) + var gotConn int32 + testHookOnConn = func() { atomic.StoreInt32(&gotConn, 1) } + + 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() + + 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 := st.decodeHeader(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 + }) + st.addLogFilter("connection error: COMPRESSION_ERROR") + defer st.Close() + st.greet() + + maxAllowed := st.sc.framer.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 + // for the hpack compression. It's still too long for the header list + // size, so we'll get the 431 error, but that keeps the compression + // context still valid. + 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() { + t.Fatalf("Got HEADERS without END_HEADERS set: %v", h) + } + headers := st.decodeHeader(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) + } + df := st.wantData() + if !strings.Contains(string(df.Data()), "HTTP Error 431") { + t.Errorf("Unexpected data body: %q", df.Data()) + } + if !df.StreamEnded() { + t.Fatalf("expect data stream end") + } + + // 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. + }) + st.addLogFilter("connection error: COMPRESSION_ERROR") + 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) + } +} + +// test that a server handler can read trailers from a client +func TestServerReadsTrailers(t *testing.T) { + const testBody = "some test body" + writeReq := func(st *serverTester) { + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader("trailer", "Foo, Bar", "trailer", "Baz"), + EndStream: false, + EndHeaders: true, + }) + st.writeData(1, false, []byte(testBody)) + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeaderRaw( + "foo", "foov", + "bar", "barv", + "baz", "bazv", + "surprise", "wasn't declared; shouldn't show up", + ), + EndStream: true, + EndHeaders: true, + }) + } + checkReq := func(r *http.Request) { + wantTrailer := http.Header{ + "Foo": nil, + "Bar": nil, + "Baz": nil, + } + if !reflect.DeepEqual(r.Trailer, wantTrailer) { + t.Errorf("initial Trailer = %v; want %v", r.Trailer, wantTrailer) + } + slurp, err := ioutil.ReadAll(r.Body) + if string(slurp) != testBody { + t.Errorf("read body %q; want %q", slurp, testBody) + } + if err != nil { + t.Fatalf("Body slurp: %v", err) + } + wantTrailerAfter := http.Header{ + "Foo": {"foov"}, + "Bar": {"barv"}, + "Baz": {"bazv"}, + } + if !reflect.DeepEqual(r.Trailer, wantTrailerAfter) { + t.Errorf("final Trailer = %v; want %v", r.Trailer, wantTrailerAfter) + } + } + testServerRequest(t, writeReq, checkReq) +} + +// test that a server handler can send trailers +func TestServerWritesTrailers_WithFlush(t *testing.T) { testServerWritesTrailers(t, true) } +func TestServerWritesTrailers_WithoutFlush(t *testing.T) { testServerWritesTrailers(t, false) } + +func testServerWritesTrailers(t *testing.T, withFlush bool) { + // See https://httpwg.github.io/specs/rfc7540.html#rfc.section.8.1.3 + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Set("Trailer", "Server-Trailer-A, Server-Trailer-B") + w.Header().Add("Trailer", "Server-Trailer-C") + + // TODO: decide if the server should filter these while + // writing the Trailer header in the response. Currently it + // appears net/http doesn't do this for http/1.1 + w.Header().Add("Trailer", "Transfer-Encoding, Content-Length, Trailer") // filtered + w.Header().Set("Foo", "Bar") + w.Header().Set("Content-Length", "5") + + io.WriteString(w, "Hello") + if withFlush { + w.(http.Flusher).Flush() + } + w.Header().Set("Server-Trailer-A", "valuea") + w.Header().Set("Server-Trailer-C", "valuec") // skipping B + // After a flush, random keys like Server-Surprise shouldn't show up: + w.Header().Set("Server-Surpise", "surprise! this isn't predeclared!") + // But we do permit promoting keys to trailers after a + // flush if they start with the magic + // otherwise-invalid "Trailer:" prefix: + w.Header().Set("Trailer:Post-Header-Trailer", "hi1") + w.Header().Set("Trailer:post-header-trailer2", "hi2") + w.Header().Set("Transfer-Encoding", "should not be included; Forbidden by RFC 2616 14.40") + w.Header().Set("Content-Length", "should not be included; Forbidden by RFC 2616 14.40") + w.Header().Set("Trailer", "should not be included; Forbidden by RFC 2616 14.40") + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if hf.StreamEnded() { + t.Fatal("response HEADERS had END_STREAM") + } + if !hf.HeadersEnded() { + t.Fatal("response HEADERS didn't have END_HEADERS") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"foo", "Bar"}, + {"trailer", "Server-Trailer-A, Server-Trailer-B"}, + {"trailer", "Server-Trailer-C"}, + {"trailer", "Transfer-Encoding, Content-Length, Trailer"}, + {"content-type", "text/plain; charset=utf-8"}, + {"content-length", "5"}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Header mismatch.\n got: %v\nwant: %v", goth, wanth) + } + df := st.wantData() + if string(df.Data()) != "Hello" { + t.Fatalf("Client read %q; want Hello", df.Data()) + } + if df.StreamEnded() { + t.Fatalf("data frame had STREAM_ENDED") + } + tf := st.wantHeaders() // for the trailers + if !tf.StreamEnded() { + t.Fatalf("trailers HEADERS lacked END_STREAM") + } + if !tf.HeadersEnded() { + t.Fatalf("trailers HEADERS lacked END_HEADERS") + } + wanth = [][2]string{ + {"post-header-trailer", "hi1"}, + {"post-header-trailer2", "hi2"}, + {"server-trailer-a", "valuea"}, + {"server-trailer-c", "valuec"}, + } + goth = st.decodeHeader(tf.HeaderBlockFragment()) + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Header mismatch.\n got: %v\nwant: %v", goth, wanth) + } + }) +} + +// validate transmitted header field names & values +// golang.org/issue/14048 +func TestServerDoesntWriteInvalidHeaders(t *testing.T) { + testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error { + w.Header().Add("OK1", "x") + w.Header().Add("Bad:Colon", "x") // colon (non-token byte) in key + w.Header().Add("Bad1\x00", "x") // null in key + w.Header().Add("Bad2", "x\x00y") // null in value + return nil + }, func(st *serverTester) { + getSlash(st) + hf := st.wantHeaders() + if !hf.StreamEnded() { + t.Error("response HEADERS lacked END_STREAM") + } + if !hf.HeadersEnded() { + t.Fatal("response HEADERS didn't have END_HEADERS") + } + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"ok1", "x"}, + {"content-type", "text/plain; charset=utf-8"}, + {"content-length", "0"}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Header mismatch.\n got: %v\nwant: %v", goth, wanth) + } + }) +} + +func BenchmarkServerGets(b *testing.B) { + defer disableGoroutineTracking()() + 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) { + defer disableGoroutineTracking()() + 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), + Handler: http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + w.Write([]byte("hello")) + }), + } + s2 := &Server{ + MaxReadFrameSize: 1 << 16, + PermitProhibitedCipherSuites: true, + } + c := &issue53Conn{[]byte(data), false, false} + s2.ServeConn(c, &ServeConnOpts{BaseConfig: s}) + 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.Errorf("%s: PreferServerCipherSuite is false; want true", tt.name) + } + } +} + +func TestServerRejectHeadWithBody(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + // No response body. + }) + defer st.Close() + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "HEAD"), + EndStream: false, // what we're testing, a bogus HEAD request with body + EndHeaders: true, + }) + st.wantRSTStream(1, ErrCodeProtocol) +} + +func TestServerNoAutoContentLengthOnHead(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + // No response body. (or smaller than one frame) + }) + defer st.Close() + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, // clients send odd numbers + BlockFragment: st.encodeHeader(":method", "HEAD"), + EndStream: true, + EndHeaders: true, + }) + h := st.wantHeaders() + headers := st.decodeHeader(h.HeaderBlockFragment()) + want := [][2]string{ + {":status", "200"}, + {"content-type", "text/plain; charset=utf-8"}, + } + if !reflect.DeepEqual(headers, want) { + t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want) + } +} + +// golang.org/issue/13495 +func TestServerNoDuplicateContentType(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + w.Header()["Content-Type"] = []string{""} + fmt.Fprintf(w, "hi") + }) + defer st.Close() + st.greet() + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: true, + }) + h := st.wantHeaders() + headers := st.decodeHeader(h.HeaderBlockFragment()) + want := [][2]string{ + {":status", "200"}, + {"content-type", ""}, + {"content-length", "41"}, + } + if !reflect.DeepEqual(headers, want) { + t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want) + } +} + +func disableGoroutineTracking() (restore func()) { + old := DebugGoroutines + DebugGoroutines = false + return func() { DebugGoroutines = old } +} + +func BenchmarkServer_GetRequest(b *testing.B) { + defer disableGoroutineTracking()() + b.ReportAllocs() + const msg = "Hello, world." + st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) { + n, err := io.Copy(ioutil.Discard, r.Body) + if err != nil || n > 0 { + b.Error("Read %d bytes, error %v; want 0 bytes.", n, err) + } + 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) + } + hbf := st.encodeHeader(":method", "GET") + for i := 0; i < b.N; i++ { + streamID := uint32(1 + 2*i) + st.writeHeaders(HeadersFrameParam{ + StreamID: streamID, + BlockFragment: hbf, + EndStream: true, + EndHeaders: true, + }) + st.wantHeaders() + st.wantData() + } +} + +func BenchmarkServer_PostRequest(b *testing.B) { + defer disableGoroutineTracking()() + b.ReportAllocs() + const msg = "Hello, world." + st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) { + n, err := io.Copy(ioutil.Discard, r.Body) + if err != nil || n > 0 { + b.Error("Read %d bytes, error %v; want 0 bytes.", n, err) + } + 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) + } + hbf := st.encodeHeader(":method", "POST") + for i := 0; i < b.N; i++ { + streamID := uint32(1 + 2*i) + st.writeHeaders(HeadersFrameParam{ + StreamID: streamID, + BlockFragment: hbf, + EndStream: false, + EndHeaders: true, + }) + st.writeData(streamID, true, nil) + st.wantHeaders() + st.wantData() + } +} + +type connStateConn struct { + net.Conn + cs tls.ConnectionState +} + +func (c connStateConn) ConnectionState() tls.ConnectionState { return c.cs } + +// golang.org/issue/12737 -- handle any net.Conn, not just +// *tls.Conn. +func TestServerHandleCustomConn(t *testing.T) { + var s Server + c1, c2 := net.Pipe() + clientDone := make(chan struct{}) + handlerDone := make(chan struct{}) + var req *http.Request + go func() { + defer close(clientDone) + defer c2.Close() + fr := NewFramer(c2, c2) + io.WriteString(c2, ClientPreface) + fr.WriteSettings() + fr.WriteSettingsAck() + f, err := fr.ReadFrame() + if err != nil { + t.Error(err) + return + } + if sf, ok := f.(*SettingsFrame); !ok || sf.IsAck() { + t.Errorf("Got %v; want non-ACK SettingsFrame", summarizeFrame(f)) + return + } + f, err = fr.ReadFrame() + if err != nil { + t.Error(err) + return + } + if sf, ok := f.(*SettingsFrame); !ok || !sf.IsAck() { + t.Errorf("Got %v; want ACK SettingsFrame", summarizeFrame(f)) + return + } + var henc hpackEncoder + fr.WriteHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: henc.encodeHeaderRaw(t, ":method", "GET", ":path", "/", ":scheme", "https", ":authority", "foo.com"), + EndStream: true, + EndHeaders: true, + }) + go io.Copy(ioutil.Discard, c2) + <-handlerDone + }() + const testString = "my custom ConnectionState" + fakeConnState := tls.ConnectionState{ + ServerName: testString, + Version: tls.VersionTLS12, + } + go s.ServeConn(connStateConn{c1, fakeConnState}, &ServeConnOpts{ + BaseConfig: &http.Server{ + Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + defer close(handlerDone) + req = r + }), + }}) + select { + case <-clientDone: + case <-time.After(5 * time.Second): + t.Fatal("timeout waiting for handler") + } + if req.TLS == nil { + t.Fatalf("Request.TLS is nil. Got: %#v", req) + } + if req.TLS.ServerName != testString { + t.Fatalf("Request.TLS = %+v; want ServerName of %q", req.TLS, testString) + } +} + +type hpackEncoder struct { + enc *hpack.Encoder + buf bytes.Buffer +} + +func (he *hpackEncoder) encodeHeaderRaw(t *testing.T, headers ...string) []byte { + if len(headers)%2 == 1 { + panic("odd number of kv args") + } + he.buf.Reset() + if he.enc == nil { + he.enc = hpack.NewEncoder(&he.buf) + } + for len(headers) > 0 { + k, v := headers[0], headers[1] + err := he.enc.WriteField(hpack.HeaderField{Name: k, Value: v}) + if err != nil { + t.Fatalf("HPACK encoding error for %q/%q: %v", k, v, err) + } + headers = headers[2:] + } + return he.buf.Bytes() +} 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 0000000000..31a84bed4f --- /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 0000000000..52ee68d959 --- /dev/null +++ b/vendor/golang.org/x/net/http2/transport.go @@ -0,0 +1,1667 @@ +// 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" + "compress/gzip" + "crypto/tls" + "errors" + "fmt" + "io" + "io/ioutil" + "log" + "net" + "net/http" + "sort" + "strconv" + "strings" + "sync" + "time" + + "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 + + defaultUserAgent = "Go-http-client/2.0" +) + +// 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 + + // DisableCompression, if true, prevents the Transport from + // requesting compression with an "Accept-Encoding: gzip" + // request header when the Request contains no existing + // Accept-Encoding value. If the Transport requests gzip on + // its own and gets a gzipped response, it's transparently + // decoded in the Response.Body. However, if the user + // explicitly requested gzip it is not automatically + // uncompressed. + DisableCompression bool + + // MaxHeaderListSize is the http2 SETTINGS_MAX_HEADER_LIST_SIZE to + // send in the initial settings frame. It is how many bytes + // of response headers are allow. Unlike the http2 spec, zero here + // means to use a default limit (currently 10MB). If you actually + // want to advertise an ulimited value to the peer, Transport + // interprets the highest possible value here (0xffffffff or 1<<32-1) + // to mean no limit. + MaxHeaderListSize uint32 + + // t1, if non-nil, is the standard library Transport using + // this transport. Its settings are used (but not its + // RoundTrip method, etc). + t1 *http.Transport + + connPoolOnce sync.Once + connPoolOrDef ClientConnPool // non-nil version of ConnPool +} + +func (t *Transport) maxHeaderListSize() uint32 { + if t.MaxHeaderListSize == 0 { + return 10 << 20 + } + if t.MaxHeaderListSize == 0xffffffff { + return 0 + } + return t.MaxHeaderListSize +} + +func (t *Transport) disableCompression() bool { + return t.DisableCompression || (t.t1 != nil && t.t1.DisableCompression) +} + +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 { + _, err := configureTransport(t1) // in configure_transport.go (go1.6) or not_go16.go + return err +} + +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 mu 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 + req *http.Request + ID uint32 + resc chan resAndError + bufPipe pipe // buffered pipe with the flow-controlled response payload + requestedGzip bool + + flow flow // guarded by cc.mu + inflow flow // guarded by cc.mu + bytesRemain int64 // -1 means unknown; owned by transportResponseBody.Read + readErr error // sticky read error; owned by transportResponseBody.Read + stopReqBody error // if non-nil, stop writing req body; guarded by cc.mu + + peerReset chan struct{} // closed on peer reset + resetErr error // populated before peerReset is closed + + done chan struct{} // closed when stream remove from cc.streams map; close calls guarded by cc.mu + + // owned by clientConnReadLoop: + pastHeaders bool // got first MetaHeadersFrame (actual headers) + pastTrailers bool // got optional second MetaHeadersFrame (trailers) + + trailer http.Header // accumulated trailers + resTrailer *http.Header // client's Response.Trailer +} + +// awaitRequestCancel runs in its own goroutine and waits for the user +// to either cancel a RoundTrip request (using the provided +// Request.Cancel channel), or for the request to be done (any way it +// might be removed from the cc.streams map: peer reset, successful +// completion, TCP connection breakage, etc) +func (cs *clientStream) awaitRequestCancel(cancel <-chan struct{}) { + if cancel == nil { + return + } + select { + case <-cancel: + cs.bufPipe.CloseWithError(errRequestCanceled) + cs.cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + case <-cs.done: + } +} + +// 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 + } +} + +func (cs *clientStream) abortRequestBodyWrite(err error) { + if err == nil { + panic("nil error") + } + cc := cs.cc + cc.mu.Lock() + cs.stopReqBody = err + cc.cond.Broadcast() + cc.mu.Unlock() +} + +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 { + t.vlogf("http2: Transport failed to get client conn for %s: %v", addr, err) + return nil, err + } + res, err := cc.RoundTrip(req) + if shouldRetryRequest(req, err) { + continue + } + if err != nil { + t.vlogf("RoundTrip failure: %v", err) + 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 + } + if !strSliceContains(cfg.NextProtos, NextProtoTLS) { + cfg.NextProtos = append([]string{NextProtoTLS}, cfg.NextProtos...) + } + if cfg.ServerName == "" { + 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 +} + +// disableKeepAlives reports whether connections should be closed as +// soon as possible after handling the first request. +func (t *Transport) disableKeepAlives() bool { + return t.t1 != nil && t.t1.DisableKeepAlives +} + +func (t *Transport) NewClientConn(c net.Conn) (*ClientConn, error) { + if VerboseLogs { + t.vlogf("http2: Transport creating client conn to %v", c.RemoteAddr()) + } + if _, err := c.Write(clientPreface); err != nil { + t.vlogf("client preface write error: %v", err) + 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.fr.ReadMetaHeaders = hpack.NewDecoder(initialHeaderTableSize, nil) + cc.fr.MaxHeaderListSize = t.maxHeaderListSize() + + // TODO: SetMaxDynamicTableSize, SetMaxDynamicTableSizeLimit on + // henc in response to SETTINGS frames? + cc.henc = hpack.NewEncoder(&cc.hbuf) + + if cs, ok := c.(connectionStater); ok { + state := cs.ConnectionState() + cc.tlsState = &state + } + + initialSettings := []Setting{ + {ID: SettingEnablePush, Val: 0}, + {ID: SettingInitialWindowSize, Val: transportDefaultStreamFlow}, + } + if max := t.maxHeaderListSize(); max != 0 { + initialSettings = append(initialSettings, Setting{ID: SettingMaxHeaderListSize, Val: max}) + } + cc.fr.WriteSettings(initialSettings...) + 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; at least SETTINGS_HEADER_TABLE_SIZE? + 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 && !cc.closed && + 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. +} + +// errRequestCanceled is a copy of net/http's errRequestCanceled because it's not +// exported. At least they'll be DeepEqual for h1-vs-h2 comparisons tests. +var errRequestCanceled = errors.New("net/http: request canceled") + +func commaSeparatedTrailers(req *http.Request) (string, error) { + keys := make([]string, 0, len(req.Trailer)) + for k := range req.Trailer { + k = http.CanonicalHeaderKey(k) + switch k { + case "Transfer-Encoding", "Trailer", "Content-Length": + return "", &badStringError{"invalid Trailer key", k} + } + keys = append(keys, k) + } + if len(keys) > 0 { + sort.Strings(keys) + // TODO: could do better allocation-wise here, but trailers are rare, + // so being lazy for now. + return strings.Join(keys, ","), nil + } + return "", nil +} + +func (cc *ClientConn) responseHeaderTimeout() time.Duration { + if cc.t.t1 != nil { + return cc.t.t1.ResponseHeaderTimeout + } + // No way to do this (yet?) with just an http2.Transport. Probably + // no need. Request.Cancel this is the new way. We only need to support + // this for compatibility with the old http.Transport fields when + // we're doing transparent http2. + return 0 +} + +// checkConnHeaders checks whether req has any invalid connection-level headers. +// per RFC 7540 section 8.1.2.2: Connection-Specific Header Fields. +// Certain headers are special-cased as okay but not transmitted later. +func checkConnHeaders(req *http.Request) error { + if v := req.Header.Get("Upgrade"); v != "" { + return errors.New("http2: invalid Upgrade request header") + } + if v := req.Header.Get("Transfer-Encoding"); (v != "" && v != "chunked") || len(req.Header["Transfer-Encoding"]) > 1 { + return errors.New("http2: invalid Transfer-Encoding request header") + } + if v := req.Header.Get("Connection"); (v != "" && v != "close" && v != "keep-alive") || len(req.Header["Connection"]) > 1 { + return errors.New("http2: invalid Connection request header") + } + return nil +} + +func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { + if err := checkConnHeaders(req); err != nil { + return nil, err + } + + trailers, err := commaSeparatedTrailers(req) + if err != nil { + return nil, err + } + hasTrailers := trailers != "" + + var body io.Reader = req.Body + contentLen := req.ContentLength + if req.Body != nil && contentLen == 0 { + // Test to see if it's actually zero or just unset. + var buf [1]byte + n, rerr := io.ReadFull(body, buf[:]) + if rerr != nil && rerr != io.EOF { + contentLen = -1 + body = errorReader{rerr} + } else if n == 1 { + // Oh, guess there is data in this Body Reader after all. + // The ContentLength field just wasn't set. + // Stich the Body back together again, re-attaching our + // consumed byte. + contentLen = -1 + body = io.MultiReader(bytes.NewReader(buf[:]), body) + } else { + // Body is actually empty. + body = nil + } + } + + cc.mu.Lock() + if cc.closed || !cc.canTakeNewRequestLocked() { + cc.mu.Unlock() + return nil, errClientConnUnusable + } + + cs := cc.newStream() + cs.req = req + hasBody := body != nil + + // TODO(bradfitz): this is a copy of the logic in net/http. Unify somewhere? + if !cc.t.disableCompression() && + req.Header.Get("Accept-Encoding") == "" && + req.Header.Get("Range") == "" && + req.Method != "HEAD" { + // Request gzip only, not deflate. Deflate is ambiguous and + // not as universally supported anyway. + // See: http://www.gzip.org/zlib/zlib_faq.html#faq38 + // + // Note that we don't request this for HEAD requests, + // due to a bug in nginx: + // http://trac.nginx.org/nginx/ticket/358 + // https://golang.org/issue/5522 + // + // We don't request gzip if the request is for a range, since + // auto-decoding a portion of a gzipped document will just fail + // anyway. See https://golang.org/issue/8923 + cs.requestedGzip = true + } + + // we send: HEADERS{1}, CONTINUATION{0,} + DATA{0,} (DATA is + // sent by writeRequestBody below, along with any Trailers, + // again in form HEADERS{1}, CONTINUATION{0,}) + hdrs := cc.encodeHeaders(req, cs.requestedGzip, trailers, contentLen) + cc.wmu.Lock() + endStream := !hasBody && !hasTrailers + werr := cc.writeHeaders(cs.ID, endStream, hdrs) + cc.wmu.Unlock() + cc.mu.Unlock() + + if werr != nil { + if hasBody { + req.Body.Close() // per RoundTripper contract + } + cc.forgetStreamID(cs.ID) + // Don't bother sending a RST_STREAM (our write already failed; + // no need to keep writing) + return nil, werr + } + + var respHeaderTimer <-chan time.Time + var bodyCopyErrc chan error // result of body copy + if hasBody { + bodyCopyErrc = make(chan error, 1) + go func() { + bodyCopyErrc <- cs.writeRequestBody(body, req.Body) + }() + } else { + if d := cc.responseHeaderTimeout(); d != 0 { + timer := time.NewTimer(d) + defer timer.Stop() + respHeaderTimer = timer.C + } + } + + readLoopResCh := cs.resc + requestCanceledCh := requestCancel(req) + bodyWritten := false + + for { + select { + case re := <-readLoopResCh: + res := re.res + if re.err != nil || res.StatusCode > 299 { + // On error or status code 3xx, 4xx, 5xx, etc abort any + // ongoing write, assuming that the server doesn't care + // about our request body. If the server replied with 1xx or + // 2xx, however, then assume the server DOES potentially + // want our body (e.g. full-duplex streaming: + // golang.org/issue/13444). If it turns out the server + // doesn't, they'll RST_STREAM us soon enough. This is a + // heuristic to avoid adding knobs to Transport. Hopefully + // we can keep it. + cs.abortRequestBodyWrite(errStopReqBodyWrite) + } + if re.err != nil { + cc.forgetStreamID(cs.ID) + return nil, re.err + } + res.Request = req + res.TLS = cc.tlsState + return res, nil + case <-respHeaderTimer: + cc.forgetStreamID(cs.ID) + if !hasBody || bodyWritten { + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + } else { + cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel) + } + return nil, errTimeout + case <-requestCanceledCh: + cc.forgetStreamID(cs.ID) + if !hasBody || bodyWritten { + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + } else { + cs.abortRequestBodyWrite(errStopReqBodyWriteAndCancel) + } + return nil, errRequestCanceled + case <-cs.peerReset: + // processResetStream already removed the + // stream from the streams map; no need for + // forgetStreamID. + return nil, cs.resetErr + case err := <-bodyCopyErrc: + if err != nil { + return nil, err + } + bodyWritten = true + if d := cc.responseHeaderTimeout(); d != 0 { + timer := time.NewTimer(d) + defer timer.Stop() + respHeaderTimer = timer.C + } + } + } +} + +// requires cc.wmu be held +func (cc *ClientConn) writeHeaders(streamID uint32, endStream bool, hdrs []byte) error { + first := true // first frame written (HEADERS is first, then CONTINUATION) + 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: streamID, + BlockFragment: chunk, + EndStream: endStream, + EndHeaders: endHeaders, + }) + first = false + } else { + cc.fr.WriteContinuation(streamID, endHeaders, chunk) + } + } + // TODO(bradfitz): this Flush could potentially block (as + // could the WriteHeaders call(s) above), which means they + // wouldn't respond to Request.Cancel being readable. That's + // rare, but this should probably be in a goroutine. + cc.bw.Flush() + return cc.werr +} + +// internal error values; they don't escape to callers +var ( + // abort request body write; don't send cancel + errStopReqBodyWrite = errors.New("http2: aborting request body write") + + // abort request body write, but send stream reset of cancel. + errStopReqBodyWriteAndCancel = errors.New("http2: canceling request") +) + +func (cs *clientStream) writeRequestBody(body io.Reader, bodyCloser io.Closer) (err error) { + cc := cs.cc + sentEnd := false // whether we sent the final DATA frame w/ END_STREAM + buf := cc.frameScratchBuffer() + defer cc.putFrameScratchBuffer(buf) + + defer func() { + // TODO: write h12Compare test showing whether + // Request.Body is closed by the Transport, + // and in multiple cases: server replies <=299 and >299 + // while still writing request body + cerr := bodyCloser.Close() + if err == nil { + err = cerr + } + }() + + req := cs.req + hasTrailers := req.Trailer != nil + + var sawEOF bool + for !sawEOF { + n, err := body.Read(buf) + if err == io.EOF { + sawEOF = true + err = nil + } else if err != nil { + return err + } + + remain := buf[:n] + for len(remain) > 0 && err == nil { + var allowed int32 + allowed, err = cs.awaitFlowControl(len(remain)) + switch { + case err == errStopReqBodyWrite: + return err + case err == errStopReqBodyWriteAndCancel: + cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + return err + case err != nil: + return err + } + cc.wmu.Lock() + data := remain[:allowed] + remain = remain[allowed:] + sentEnd = sawEOF && len(remain) == 0 && !hasTrailers + err = cc.fr.WriteData(cs.ID, sentEnd, data) + if err == nil { + // TODO(bradfitz): this flush is for latency, not bandwidth. + // Most requests won't need this. Make this opt-in or opt-out? + // Use some heuristic on the body type? Nagel-like timers? + // Based on 'n'? Only last chunk of this for loop, unless flow control + // tokens are low? For now, always: + err = cc.bw.Flush() + } + cc.wmu.Unlock() + } + if err != nil { + return err + } + } + + cc.wmu.Lock() + if !sentEnd { + var trls []byte + if hasTrailers { + cc.mu.Lock() + trls = cc.encodeTrailers(req) + cc.mu.Unlock() + } + + // Avoid forgetting to send an END_STREAM if the encoded + // trailers are 0 bytes. Both results produce and END_STREAM. + if len(trls) > 0 { + err = cc.writeHeaders(cs.ID, true, trls) + } else { + 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 int) (taken int32, err error) { + cc := cs.cc + cc.mu.Lock() + defer cc.mu.Unlock() + for { + if cc.closed { + return 0, errClientConnClosed + } + if cs.stopReqBody != nil { + return 0, cs.stopReqBody + } + if err := cs.checkReset(); err != nil { + return 0, err + } + if a := cs.flow.available(); a > 0 { + take := a + if int(take) > maxBytes { + + take = int32(maxBytes) // can't truncate int; take is int32 + } + if take > int32(cc.maxFrameSize) { + take = int32(cc.maxFrameSize) + } + cs.flow.take(take) + return take, nil + } + cc.cond.Wait() + } +} + +type badStringError struct { + what string + str string +} + +func (e *badStringError) Error() string { return fmt.Sprintf("%s %q", e.what, e.str) } + +// requires cc.mu be held. +func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trailers string, contentLength int64) []byte { + cc.hbuf.Reset() + + 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) + cc.writeHeader(":method", req.Method) + if req.Method != "CONNECT" { + cc.writeHeader(":path", req.URL.RequestURI()) + cc.writeHeader(":scheme", "https") + } + if trailers != "" { + cc.writeHeader("trailer", trailers) + } + + var didUA bool + for k, vv := range req.Header { + lowKey := strings.ToLower(k) + switch lowKey { + case "host", "content-length": + // Host is :authority, already sent. + // Content-Length is automatic, set below. + continue + case "connection", "proxy-connection", "transfer-encoding", "upgrade": + // Per 8.1.2.2 Connection-Specific Header + // Fields, don't send connection-specific + // fields. We deal with these earlier in + // RoundTrip, deciding whether they're + // error-worthy, but we don't want to mutate + // the user's *Request so at this point, just + // skip over them at this point. + continue + case "user-agent": + // Match Go's http1 behavior: at most one + // User-Agent. If set to nil or empty string, + // then omit it. Otherwise if not mentioned, + // include the default (below). + didUA = true + if len(vv) < 1 { + continue + } + vv = vv[:1] + if vv[0] == "" { + continue + } + } + for _, v := range vv { + cc.writeHeader(lowKey, v) + } + } + if shouldSendReqContentLength(req.Method, contentLength) { + cc.writeHeader("content-length", strconv.FormatInt(contentLength, 10)) + } + if addGzipHeader { + cc.writeHeader("accept-encoding", "gzip") + } + if !didUA { + cc.writeHeader("user-agent", defaultUserAgent) + } + return cc.hbuf.Bytes() +} + +// shouldSendReqContentLength reports whether the http2.Transport should send +// a "content-length" request header. This logic is basically a copy of the net/http +// transferWriter.shouldSendContentLength. +// The contentLength is the corrected contentLength (so 0 means actually 0, not unknown). +// -1 means unknown. +func shouldSendReqContentLength(method string, contentLength int64) bool { + if contentLength > 0 { + return true + } + if contentLength < 0 { + return false + } + // For zero bodies, whether we send a content-length depends on the method. + // It also kinda doesn't matter for http2 either way, with END_STREAM. + switch method { + case "POST", "PUT", "PATCH": + return true + default: + return false + } +} + +// requires cc.mu be held. +func (cc *ClientConn) encodeTrailers(req *http.Request) []byte { + cc.hbuf.Reset() + for k, vv := range req.Trailer { + // Transfer-Encoding, etc.. have already been filter at the + // start of RoundTrip + lowKey := strings.ToLower(k) + for _, v := range vv { + cc.writeHeader(lowKey, v) + } + } + return cc.hbuf.Bytes() +} + +func (cc *ClientConn) writeHeader(name, value string) { + if VerboseLogs { + log.Printf("http2: Transport encoding header %q = %q", name, value) + } + 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{}), + done: 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) forgetStreamID(id uint32) { + cc.streamByID(id, true) +} + +func (cc *ClientConn) streamByID(id uint32, andRemove bool) *clientStream { + cc.mu.Lock() + defer cc.mu.Unlock() + cs := cc.streams[id] + if andRemove && cs != nil && !cc.closed { + delete(cc.streams, id) + close(cs.done) + } + 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 + closeWhenIdle bool +} + +// readLoop runs in its own goroutine and reads and dispatches frames. +func (cc *ClientConn) readLoop() { + rl := &clientConnReadLoop{ + cc: cc, + activeRes: make(map[uint32]*clientStream), + } + + 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: + } + close(cs.done) + } + cc.closed = true + cc.cond.Broadcast() + cc.mu.Unlock() +} + +func (rl *clientConnReadLoop) run() error { + cc := rl.cc + rl.closeWhenIdle = cc.t.disableKeepAlives() + gotReply := false // ever saw a reply + for { + f, err := cc.fr.ReadFrame() + if err != nil { + cc.vlogf("Transport readFrame error: (%T) %v", err, err) + } + if se, ok := err.(StreamError); ok { + if cs := cc.streamByID(se.StreamID, true /*ended; remove it*/); cs != nil { + rl.endStreamError(cs, cc.fr.errDetail) + } + continue + } else if err != nil { + return err + } + if VerboseLogs { + cc.vlogf("http2: Transport received %s", summarizeFrame(f)) + } + maybeIdle := false // whether frame might transition us to idle + + switch f := f.(type) { + case *MetaHeadersFrame: + err = rl.processHeaders(f) + maybeIdle = true + gotReply = true + case *DataFrame: + err = rl.processData(f) + maybeIdle = true + case *GoAwayFrame: + err = rl.processGoAway(f) + maybeIdle = true + case *RSTStreamFrame: + err = rl.processResetStream(f) + maybeIdle = true + 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 + } + if rl.closeWhenIdle && gotReply && maybeIdle && len(rl.activeRes) == 0 { + cc.closeIfIdle() + } + } +} + +func (rl *clientConnReadLoop) processHeaders(f *MetaHeadersFrame) error { + cc := rl.cc + cs := cc.streamByID(f.StreamID, f.StreamEnded()) + if cs == nil { + // We'd get here if we canceled a request while the + // server had its response still in flight. So if this + // was just something we canceled, ignore it. + return nil + } + if !cs.pastHeaders { + cs.pastHeaders = true + } else { + return rl.processTrailers(cs, f) + } + + res, err := rl.handleResponse(cs, f) + if err != nil { + if _, ok := err.(ConnectionError); ok { + return err + } + // Any other error type is a stream error. + cs.cc.writeStreamReset(f.StreamID, ErrCodeProtocol, err) + cs.resc <- resAndError{err: err} + return nil // return nil from process* funcs to keep conn alive + } + if res == nil { + // (nil, nil) special case. See handleResponse docs. + return nil + } + if res.Body != noBody { + rl.activeRes[cs.ID] = cs + } + cs.resTrailer = &res.Trailer + cs.resc <- resAndError{res: res} + return nil +} + +// may return error types nil, or ConnectionError. Any other error value +// is a StreamError of type ErrCodeProtocol. The returned error in that case +// is the detail. +// +// As a special case, handleResponse may return (nil, nil) to skip the +// frame (currently only used for 100 expect continue). This special +// case is going away after Issue 13851 is fixed. +func (rl *clientConnReadLoop) handleResponse(cs *clientStream, f *MetaHeadersFrame) (*http.Response, error) { + if f.Truncated { + return nil, errResponseHeaderListSize + } + + status := f.PseudoValue("status") + if status == "" { + return nil, errors.New("missing status pseudo header") + } + statusCode, err := strconv.Atoi(status) + if err != nil { + return nil, errors.New("malformed non-numeric status pseudo header") + } + + if statusCode == 100 { + // Just skip 100-continue response headers for now. + // TODO: golang.org/issue/13851 for doing it properly. + cs.pastHeaders = false // do it all again + return nil, nil + } + + header := make(http.Header) + res := &http.Response{ + Proto: "HTTP/2.0", + ProtoMajor: 2, + Header: header, + StatusCode: statusCode, + Status: status + " " + http.StatusText(statusCode), + } + for _, hf := range f.RegularFields() { + key := http.CanonicalHeaderKey(hf.Name) + if key == "Trailer" { + t := res.Trailer + if t == nil { + t = make(http.Header) + res.Trailer = t + } + foreachHeaderElement(hf.Value, func(v string) { + t[http.CanonicalHeaderKey(v)] = nil + }) + } else { + header[key] = append(header[key], hf.Value) + } + } + + streamEnded := f.StreamEnded() + isHead := cs.req.Method == "HEAD" + if !streamEnded || isHead { + res.ContentLength = -1 + if clens := res.Header["Content-Length"]; len(clens) == 1 { + if clen64, err := strconv.ParseInt(clens[0], 10, 64); err == nil { + res.ContentLength = clen64 + } else { + // TODO: care? unlike http/1, it won't mess up our framing, so it's + // more safe smuggling-wise to ignore. + } + } else if len(clens) > 1 { + // TODO: care? unlike http/1, it won't mess up our framing, so it's + // more safe smuggling-wise to ignore. + } + } + + if streamEnded || isHead { + res.Body = noBody + return res, nil + } + + buf := new(bytes.Buffer) // TODO(bradfitz): recycle this garbage + cs.bufPipe = pipe{b: buf} + cs.bytesRemain = res.ContentLength + res.Body = transportResponseBody{cs} + go cs.awaitRequestCancel(requestCancel(cs.req)) + + if cs.requestedGzip && res.Header.Get("Content-Encoding") == "gzip" { + res.Header.Del("Content-Encoding") + res.Header.Del("Content-Length") + res.ContentLength = -1 + res.Body = &gzipReader{body: res.Body} + } + return res, nil +} + +func (rl *clientConnReadLoop) processTrailers(cs *clientStream, f *MetaHeadersFrame) error { + if cs.pastTrailers { + // Too many HEADERS frames for this stream. + return ConnectionError(ErrCodeProtocol) + } + cs.pastTrailers = true + if !f.StreamEnded() { + // We expect that any headers for trailers also + // has END_STREAM. + return ConnectionError(ErrCodeProtocol) + } + if len(f.PseudoFields()) > 0 { + // No pseudo header fields are defined for trailers. + // TODO: ConnectionError might be overly harsh? Check. + return ConnectionError(ErrCodeProtocol) + } + + trailer := make(http.Header) + for _, hf := range f.RegularFields() { + key := http.CanonicalHeaderKey(hf.Name) + trailer[key] = append(trailer[key], hf.Value) + } + cs.trailer = trailer + + rl.endStream(cs) + 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) { + cs := b.cs + cc := cs.cc + + if cs.readErr != nil { + return 0, cs.readErr + } + n, err = b.cs.bufPipe.Read(p) + if cs.bytesRemain != -1 { + if int64(n) > cs.bytesRemain { + n = int(cs.bytesRemain) + if err == nil { + err = errors.New("net/http: server replied with more than declared Content-Length; truncated") + cc.writeStreamReset(cs.ID, ErrCodeProtocol, err) + } + cs.readErr = err + return int(cs.bytesRemain), err + } + cs.bytesRemain -= int64(n) + if err == io.EOF && cs.bytesRemain > 0 { + err = io.ErrUnexpectedEOF + cs.readErr = err + return n, err + } + } + if n == 0 { + // No flow control tokens to send back. + return + } + + 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 +} + +var errClosedResponseBody = errors.New("http2: response body closed") + +func (b transportResponseBody) Close() error { + cs := b.cs + if cs.bufPipe.Err() != io.EOF { + // TODO: write test for this + cs.cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + } + cs.bufPipe.BreakWithError(errClosedResponseBody) + return nil +} + +func (rl *clientConnReadLoop) processData(f *DataFrame) error { + cc := rl.cc + cs := cc.streamByID(f.StreamID, f.StreamEnded()) + if cs == nil { + cc.mu.Lock() + neverSent := cc.nextStreamID + cc.mu.Unlock() + if f.StreamID >= neverSent { + // We never asked for this. + cc.logf("http2: Transport received unsolicited DATA frame; closing connection") + return ConnectionError(ErrCodeProtocol) + } + // We probably did ask for this, but canceled. Just ignore it. + // TODO: be stricter here? only silently ignore things which + // we canceled, but not things which were closed normally + // by the peer? Tough without accumulating too much state. + return nil + } + if data := f.Data(); len(data) > 0 { + if cs.bufPipe.b == nil { + // Data frame after it's already closed? + cc.logf("http2: Transport received DATA frame for closed stream; closing connection") + return ConnectionError(ErrCodeProtocol) + } + + // 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 { + rl.endStreamError(cs, err) + return err + } + } + + if f.StreamEnded() { + rl.endStream(cs) + } + return nil +} + +var errInvalidTrailers = errors.New("http2: invalid trailers") + +func (rl *clientConnReadLoop) endStream(cs *clientStream) { + // TODO: check that any declared content-length matches, like + // server.go's (*stream).endStream method. + rl.endStreamError(cs, nil) +} + +func (rl *clientConnReadLoop) endStreamError(cs *clientStream, err error) { + var code func() + if err == nil { + err = io.EOF + code = cs.copyTrailers + } + cs.bufPipe.closeWithErrorAndCode(err, code) + delete(rl.activeRes, cs.ID) + if cs.req.Close || cs.req.Header.Get("Connection") == "close" { + rl.closeWhenIdle = true + } +} + +func (cs *clientStream) copyTrailers() { + for k, vv := range cs.trailer { + t := cs.resTrailer + if *t == nil { + *t = make(http.Header) + } + (*t)[k] = vv + } +} + +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? SETTINGS_HEADER_TABLE_SIZE probably. + 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) + cs.cc.cond.Broadcast() // wake up checkReset via clientStream.awaitFlowControl + } + 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.bw.Flush() + cc.wmu.Unlock() +} + +var ( + errResponseHeaderListSize = errors.New("http2: response header list larger than advertised limit") + errPseudoTrailers = errors.New("http2: invalid pseudo header in trailers") +) + +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 } + +// gzipReader wraps a response body so it can lazily +// call gzip.NewReader on the first call to Read +type gzipReader struct { + body io.ReadCloser // underlying Response.Body + zr *gzip.Reader // lazily-initialized gzip reader + zerr error // sticky error +} + +func (gz *gzipReader) Read(p []byte) (n int, err error) { + if gz.zerr != nil { + return 0, gz.zerr + } + if gz.zr == nil { + gz.zr, err = gzip.NewReader(gz.body) + if err != nil { + gz.zerr = err + return 0, err + } + } + return gz.zr.Read(p) +} + +func (gz *gzipReader) Close() error { + return gz.body.Close() +} + +type errorReader struct{ err error } + +func (r errorReader) Read(p []byte) (int, error) { return 0, r.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 0000000000..07598b20bb --- /dev/null +++ b/vendor/golang.org/x/net/http2/transport_test.go @@ -0,0 +1,1797 @@ +// 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 ( + "bufio" + "bytes" + "crypto/tls" + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "math/rand" + "net" + "net/http" + "net/url" + "os" + "reflect" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "testing" + "time" + + "golang.org/x/net/http2/hpack" +) + +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"}, + "Date": []string{"XXX"}, // see cleanDate + } + cleanDate(res) + 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 onSameConn(t *testing.T, modReq func(*http.Request)) bool { + 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) + } + modReq(req) + 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() + return first == second +} + +func TestTransportReusesConns(t *testing.T) { + if !onSameConn(t, func(*http.Request) {}) { + t.Errorf("first and second responses were on different connections") + } +} + +func TestTransportReusesConn_RequestClose(t *testing.T) { + if onSameConn(t, func(r *http.Request) { r.Close = true }) { + t.Errorf("first and second responses were not on different connections") + } +} + +func TestTransportReusesConn_ConnClose(t *testing.T) { + if onSameConn(t, func(r *http.Request) { r.Header.Set("Connection", "close") }) { + t.Errorf("first and second responses were not on different connections") + } +} + +// Tests that the Transport only keeps one pending dial open per destination address. +// https://golang.org/issue/13397 +func TestTransportGroupsPendingDials(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() + var ( + mu sync.Mutex + dials = map[string]int{} + ) + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + req, err := http.NewRequest("GET", st.ts.URL, nil) + if err != nil { + t.Error(err) + return + } + res, err := tr.RoundTrip(req) + if err != nil { + t.Error(err) + return + } + defer res.Body.Close() + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Errorf("Body read: %v", err) + } + addr := strings.TrimSpace(string(slurp)) + if addr == "" { + t.Errorf("didn't get an addr in response") + } + mu.Lock() + dials[addr]++ + mu.Unlock() + }() + } + wg.Wait() + if len(dials) != 1 { + t.Errorf("saw %d dials; want 1: %v", len(dials), dials) + } + tr.CloseIdleConnections() + if err := retry(50, 10*time.Millisecond, func() error { + cp, ok := tr.connPool().(*clientConnPool) + if !ok { + return fmt.Errorf("Conn pool is %T; want *clientConnPool", tr.connPool()) + } + cp.mu.Lock() + defer cp.mu.Unlock() + if len(cp.dialing) != 0 { + return fmt.Errorf("dialing map = %v; want empty", cp.dialing) + } + if len(cp.conns) != 0 { + return fmt.Errorf("conns = %v; want empty", cp.conns) + } + if len(cp.keys) != 0 { + return fmt.Errorf("keys = %v; want empty", cp.keys) + } + return nil + }); err != nil { + t.Errorf("State of pool after CloseIdleConnections: %v", err) + } +} + +func retry(tries int, delay time.Duration, fn func() error) error { + var err error + for i := 0; i < tries; i++ { + err = fn() + if err == nil { + return nil + } + time.Sleep(delay) + } + return err +} + +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) +} + +func TestTransportBody(t *testing.T) { + 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)}, + } + + type reqInfo struct { + req *http.Request + slurp []byte + err error + } + gotc := make(chan reqInfo, 1) + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + slurp, err := ioutil.ReadAll(r.Body) + if err != nil { + gotc <- reqInfo{err: err} + } else { + gotc <- reqInfo{req: r, slurp: 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() + ri := <-gotc + if ri.err != nil { + t.Errorf("#%d: read error: %v", i, ri.err) + continue + } + if got := string(ri.slurp); got != tt.body { + 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)) + } + wantLen := int64(len(tt.body)) + if tt.noContentLen && tt.body != "" { + wantLen = -1 + } + if ri.req.ContentLength != wantLen { + t.Errorf("#%d. handler got ContentLength = %v; want %v", i, ri.req.ContentLength, wantLen) + } + } +} + +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) + } + wantNextProtos := []string{"h2", "http/1.1"} + if t1.TLSClientConfig == nil { + t.Errorf("nil t1.TLSClientConfig") + } else if !reflect.DeepEqual(t1.TLSClientConfig.NextProtos, wantNextProtos) { + t.Errorf("TLSClientConfig.NextProtos = %q; want %q", t1.TLSClientConfig.NextProtos, wantNextProtos) + } + 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) + } +} + +type capitalizeReader struct { + r io.Reader +} + +func (cr capitalizeReader) Read(p []byte) (n int, err error) { + n, err = cr.r.Read(p) + for i, b := range p[:n] { + if b >= 'a' && b <= 'z' { + p[i] = b - ('a' - 'A') + } + } + return +} + +type flushWriter struct { + w io.Writer +} + +func (fw flushWriter) Write(p []byte) (n int, err error) { + n, err = fw.w.Write(p) + if f, ok := fw.w.(http.Flusher); ok { + f.Flush() + } + return +} + +type clientTester struct { + t *testing.T + tr *Transport + sc, cc net.Conn // server and client conn + fr *Framer // server's framer + client func() error + server func() error +} + +func newClientTester(t *testing.T) *clientTester { + var dialOnce struct { + sync.Mutex + dialed bool + } + ct := &clientTester{ + t: t, + } + ct.tr = &Transport{ + TLSClientConfig: tlsConfigInsecure, + DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) { + dialOnce.Lock() + defer dialOnce.Unlock() + if dialOnce.dialed { + return nil, errors.New("only one dial allowed in test mode") + } + dialOnce.dialed = true + return ct.cc, nil + }, + } + + ln := newLocalListener(t) + cc, err := net.Dial("tcp", ln.Addr().String()) + if err != nil { + t.Fatal(err) + + } + sc, err := ln.Accept() + if err != nil { + t.Fatal(err) + } + ln.Close() + ct.cc = cc + ct.sc = sc + ct.fr = NewFramer(sc, sc) + return ct +} + +func newLocalListener(t *testing.T) net.Listener { + ln, err := net.Listen("tcp4", "127.0.0.1:0") + if err == nil { + return ln + } + ln, err = net.Listen("tcp6", "[::1]:0") + if err != nil { + t.Fatal(err) + } + return ln +} + +func (ct *clientTester) greet() { + buf := make([]byte, len(ClientPreface)) + _, err := io.ReadFull(ct.sc, buf) + if err != nil { + ct.t.Fatalf("reading client preface: %v", err) + } + f, err := ct.fr.ReadFrame() + if err != nil { + ct.t.Fatalf("Reading client settings frame: %v", err) + } + if sf, ok := f.(*SettingsFrame); !ok { + ct.t.Fatalf("Wanted client settings frame; got %v", f) + _ = sf // stash it away? + } + if err := ct.fr.WriteSettings(); err != nil { + ct.t.Fatal(err) + } + if err := ct.fr.WriteSettingsAck(); err != nil { + ct.t.Fatal(err) + } +} + +func (ct *clientTester) cleanup() { + ct.tr.CloseIdleConnections() +} + +func (ct *clientTester) run() { + errc := make(chan error, 2) + ct.start("client", errc, ct.client) + ct.start("server", errc, ct.server) + defer ct.cleanup() + for i := 0; i < 2; i++ { + if err := <-errc; err != nil { + ct.t.Error(err) + return + } + } +} + +func (ct *clientTester) start(which string, errc chan<- error, fn func() error) { + go func() { + finished := false + var err error + defer func() { + if !finished { + err = fmt.Errorf("%s goroutine didn't finish.", which) + } else if err != nil { + err = fmt.Errorf("%s: %v", which, err) + } + errc <- err + }() + err = fn() + finished = true + }() +} + +type countingReader struct { + n *int64 +} + +func (r countingReader) Read(p []byte) (n int, err error) { + for i := range p { + p[i] = byte(i) + } + atomic.AddInt64(r.n, int64(len(p))) + return len(p), err +} + +func TestTransportReqBodyAfterResponse_200(t *testing.T) { testTransportReqBodyAfterResponse(t, 200) } +func TestTransportReqBodyAfterResponse_403(t *testing.T) { testTransportReqBodyAfterResponse(t, 403) } + +func testTransportReqBodyAfterResponse(t *testing.T, status int) { + const bodySize = 10 << 20 + ct := newClientTester(t) + ct.client = func() error { + var n int64 // atomic + req, err := http.NewRequest("PUT", "https://dummy.tld/", io.LimitReader(countingReader{&n}, bodySize)) + if err != nil { + return err + } + res, err := ct.tr.RoundTrip(req) + if err != nil { + return fmt.Errorf("RoundTrip: %v", err) + } + defer res.Body.Close() + if res.StatusCode != status { + return fmt.Errorf("status code = %v; want %v", res.StatusCode, status) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + return fmt.Errorf("Slurp: %v", err) + } + if len(slurp) > 0 { + return fmt.Errorf("unexpected body: %q", slurp) + } + if status == 200 { + if got := atomic.LoadInt64(&n); got != bodySize { + return fmt.Errorf("For 200 response, Transport wrote %d bytes; want %d", got, bodySize) + } + } else { + if got := atomic.LoadInt64(&n); got == 0 || got >= bodySize { + return fmt.Errorf("For %d response, Transport wrote %d bytes; want (0,%d) exclusive", status, got, bodySize) + } + } + return nil + } + ct.server = func() error { + ct.greet() + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + var dataRecv int64 + var closed bool + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return err + } + //println(fmt.Sprintf("server got frame: %v", f)) + switch f := f.(type) { + case *WindowUpdateFrame, *SettingsFrame: + case *HeadersFrame: + if !f.HeadersEnded() { + return fmt.Errorf("headers should have END_HEADERS be ended: %v", f) + } + if f.StreamEnded() { + return fmt.Errorf("headers contains END_STREAM unexpectedly: %v", f) + } + time.Sleep(50 * time.Millisecond) // let client send body + enc.WriteField(hpack.HeaderField{Name: ":status", Value: strconv.Itoa(status)}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: true, + EndStream: false, + BlockFragment: buf.Bytes(), + }) + case *DataFrame: + dataLen := len(f.Data()) + dataRecv += int64(dataLen) + if dataLen > 0 { + if err := ct.fr.WriteWindowUpdate(0, uint32(dataLen)); err != nil { + return err + } + if err := ct.fr.WriteWindowUpdate(f.StreamID, uint32(dataLen)); err != nil { + return err + } + } + if !closed && ((status != 200 && dataRecv > 0) || + (status == 200 && dataRecv == bodySize)) { + closed = true + if err := ct.fr.WriteData(f.StreamID, true, nil); err != nil { + return err + } + return nil + } + default: + return fmt.Errorf("Unexpected client frame %v", f) + } + } + return nil + } + ct.run() +} + +// See golang.org/issue/13444 +func TestTransportFullDuplex(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(200) // redundant but for clarity + w.(http.Flusher).Flush() + io.Copy(flushWriter{w}, capitalizeReader{r.Body}) + fmt.Fprintf(w, "bye.\n") + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + c := &http.Client{Transport: tr} + + pr, pw := io.Pipe() + req, err := http.NewRequest("PUT", st.ts.URL, ioutil.NopCloser(pr)) + if err != nil { + log.Fatal(err) + } + req.ContentLength = -1 + res, err := c.Do(req) + if err != nil { + log.Fatal(err) + } + defer res.Body.Close() + if res.StatusCode != 200 { + t.Fatalf("StatusCode = %v; want %v", res.StatusCode, 200) + } + bs := bufio.NewScanner(res.Body) + want := func(v string) { + if !bs.Scan() { + t.Fatalf("wanted to read %q but Scan() = false, err = %v", v, bs.Err()) + } + } + write := func(v string) { + _, err := io.WriteString(pw, v) + if err != nil { + t.Fatalf("pipe write: %v", err) + } + } + write("foo\n") + want("FOO") + write("bar\n") + want("BAR") + pw.Close() + want("bye.") + if err := bs.Err(); err != nil { + t.Fatal(err) + } +} + +func TestTransportConnectRequest(t *testing.T) { + gotc := make(chan *http.Request, 1) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + gotc <- r + }, optOnlyServer) + defer st.Close() + + u, err := url.Parse(st.ts.URL) + if err != nil { + t.Fatal(err) + } + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + c := &http.Client{Transport: tr} + + tests := []struct { + req *http.Request + want string + }{ + { + req: &http.Request{ + Method: "CONNECT", + Header: http.Header{}, + URL: u, + }, + want: u.Host, + }, + { + req: &http.Request{ + Method: "CONNECT", + Header: http.Header{}, + URL: u, + Host: "example.com:123", + }, + want: "example.com:123", + }, + } + + for i, tt := range tests { + res, err := c.Do(tt.req) + if err != nil { + t.Errorf("%d. RoundTrip = %v", i, err) + continue + } + res.Body.Close() + req := <-gotc + if req.Method != "CONNECT" { + t.Errorf("method = %q; want CONNECT", req.Method) + } + if req.Host != tt.want { + t.Errorf("Host = %q; want %q", req.Host, tt.want) + } + if req.URL.Host != tt.want { + t.Errorf("URL.Host = %q; want %q", req.URL.Host, tt.want) + } + } +} + +type headerType int + +const ( + noHeader headerType = iota // omitted + oneHeader + splitHeader // broken into continuation on purpose +) + +const ( + f0 = noHeader + f1 = oneHeader + f2 = splitHeader + d0 = false + d1 = true +) + +// Test all 36 combinations of response frame orders: +// (3 ways of 100-continue) * (2 ways of headers) * (2 ways of data) * (3 ways of trailers):func TestTransportResponsePattern_00f0(t *testing.T) { testTransportResponsePattern(h0, h1, false, h0) } +// Generated by http://play.golang.org/p/SScqYKJYXd +func TestTransportResPattern_c0h1d0t0(t *testing.T) { testTransportResPattern(t, f0, f1, d0, f0) } +func TestTransportResPattern_c0h1d0t1(t *testing.T) { testTransportResPattern(t, f0, f1, d0, f1) } +func TestTransportResPattern_c0h1d0t2(t *testing.T) { testTransportResPattern(t, f0, f1, d0, f2) } +func TestTransportResPattern_c0h1d1t0(t *testing.T) { testTransportResPattern(t, f0, f1, d1, f0) } +func TestTransportResPattern_c0h1d1t1(t *testing.T) { testTransportResPattern(t, f0, f1, d1, f1) } +func TestTransportResPattern_c0h1d1t2(t *testing.T) { testTransportResPattern(t, f0, f1, d1, f2) } +func TestTransportResPattern_c0h2d0t0(t *testing.T) { testTransportResPattern(t, f0, f2, d0, f0) } +func TestTransportResPattern_c0h2d0t1(t *testing.T) { testTransportResPattern(t, f0, f2, d0, f1) } +func TestTransportResPattern_c0h2d0t2(t *testing.T) { testTransportResPattern(t, f0, f2, d0, f2) } +func TestTransportResPattern_c0h2d1t0(t *testing.T) { testTransportResPattern(t, f0, f2, d1, f0) } +func TestTransportResPattern_c0h2d1t1(t *testing.T) { testTransportResPattern(t, f0, f2, d1, f1) } +func TestTransportResPattern_c0h2d1t2(t *testing.T) { testTransportResPattern(t, f0, f2, d1, f2) } +func TestTransportResPattern_c1h1d0t0(t *testing.T) { testTransportResPattern(t, f1, f1, d0, f0) } +func TestTransportResPattern_c1h1d0t1(t *testing.T) { testTransportResPattern(t, f1, f1, d0, f1) } +func TestTransportResPattern_c1h1d0t2(t *testing.T) { testTransportResPattern(t, f1, f1, d0, f2) } +func TestTransportResPattern_c1h1d1t0(t *testing.T) { testTransportResPattern(t, f1, f1, d1, f0) } +func TestTransportResPattern_c1h1d1t1(t *testing.T) { testTransportResPattern(t, f1, f1, d1, f1) } +func TestTransportResPattern_c1h1d1t2(t *testing.T) { testTransportResPattern(t, f1, f1, d1, f2) } +func TestTransportResPattern_c1h2d0t0(t *testing.T) { testTransportResPattern(t, f1, f2, d0, f0) } +func TestTransportResPattern_c1h2d0t1(t *testing.T) { testTransportResPattern(t, f1, f2, d0, f1) } +func TestTransportResPattern_c1h2d0t2(t *testing.T) { testTransportResPattern(t, f1, f2, d0, f2) } +func TestTransportResPattern_c1h2d1t0(t *testing.T) { testTransportResPattern(t, f1, f2, d1, f0) } +func TestTransportResPattern_c1h2d1t1(t *testing.T) { testTransportResPattern(t, f1, f2, d1, f1) } +func TestTransportResPattern_c1h2d1t2(t *testing.T) { testTransportResPattern(t, f1, f2, d1, f2) } +func TestTransportResPattern_c2h1d0t0(t *testing.T) { testTransportResPattern(t, f2, f1, d0, f0) } +func TestTransportResPattern_c2h1d0t1(t *testing.T) { testTransportResPattern(t, f2, f1, d0, f1) } +func TestTransportResPattern_c2h1d0t2(t *testing.T) { testTransportResPattern(t, f2, f1, d0, f2) } +func TestTransportResPattern_c2h1d1t0(t *testing.T) { testTransportResPattern(t, f2, f1, d1, f0) } +func TestTransportResPattern_c2h1d1t1(t *testing.T) { testTransportResPattern(t, f2, f1, d1, f1) } +func TestTransportResPattern_c2h1d1t2(t *testing.T) { testTransportResPattern(t, f2, f1, d1, f2) } +func TestTransportResPattern_c2h2d0t0(t *testing.T) { testTransportResPattern(t, f2, f2, d0, f0) } +func TestTransportResPattern_c2h2d0t1(t *testing.T) { testTransportResPattern(t, f2, f2, d0, f1) } +func TestTransportResPattern_c2h2d0t2(t *testing.T) { testTransportResPattern(t, f2, f2, d0, f2) } +func TestTransportResPattern_c2h2d1t0(t *testing.T) { testTransportResPattern(t, f2, f2, d1, f0) } +func TestTransportResPattern_c2h2d1t1(t *testing.T) { testTransportResPattern(t, f2, f2, d1, f1) } +func TestTransportResPattern_c2h2d1t2(t *testing.T) { testTransportResPattern(t, f2, f2, d1, f2) } + +func testTransportResPattern(t *testing.T, expect100Continue, resHeader headerType, withData bool, trailers headerType) { + const reqBody = "some request body" + const resBody = "some response body" + + if resHeader == noHeader { + // TODO: test 100-continue followed by immediate + // server stream reset, without headers in the middle? + panic("invalid combination") + } + + ct := newClientTester(t) + ct.client = func() error { + req, _ := http.NewRequest("POST", "https://dummy.tld/", strings.NewReader(reqBody)) + if expect100Continue != noHeader { + req.Header.Set("Expect", "100-continue") + } + res, err := ct.tr.RoundTrip(req) + if err != nil { + return fmt.Errorf("RoundTrip: %v", err) + } + defer res.Body.Close() + if res.StatusCode != 200 { + return fmt.Errorf("status code = %v; want 200", res.StatusCode) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + return fmt.Errorf("Slurp: %v", err) + } + wantBody := resBody + if !withData { + wantBody = "" + } + if string(slurp) != wantBody { + return fmt.Errorf("body = %q; want %q", slurp, wantBody) + } + if trailers == noHeader { + if len(res.Trailer) > 0 { + t.Errorf("Trailer = %v; want none", res.Trailer) + } + } else { + want := http.Header{"Some-Trailer": {"some-value"}} + if !reflect.DeepEqual(res.Trailer, want) { + t.Errorf("Trailer = %v; want %v", res.Trailer, want) + } + } + return nil + } + ct.server = func() error { + ct.greet() + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return err + } + switch f := f.(type) { + case *WindowUpdateFrame, *SettingsFrame: + case *DataFrame: + // ignore for now. + case *HeadersFrame: + endStream := false + send := func(mode headerType) { + hbf := buf.Bytes() + switch mode { + case oneHeader: + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: true, + EndStream: endStream, + BlockFragment: hbf, + }) + case splitHeader: + if len(hbf) < 2 { + panic("too small") + } + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: false, + EndStream: endStream, + BlockFragment: hbf[:1], + }) + ct.fr.WriteContinuation(f.StreamID, true, hbf[1:]) + default: + panic("bogus mode") + } + } + if expect100Continue != noHeader { + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "100"}) + send(expect100Continue) + } + // Response headers (1+ frames; 1 or 2 in this test, but never 0) + { + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: "x-foo", Value: "blah"}) + enc.WriteField(hpack.HeaderField{Name: "x-bar", Value: "more"}) + if trailers != noHeader { + enc.WriteField(hpack.HeaderField{Name: "trailer", Value: "some-trailer"}) + } + endStream = withData == false && trailers == noHeader + send(resHeader) + } + if withData { + endStream = trailers == noHeader + ct.fr.WriteData(f.StreamID, endStream, []byte(resBody)) + } + if trailers != noHeader { + endStream = true + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: "some-trailer", Value: "some-value"}) + send(trailers) + } + return nil + } + } + } + ct.run() +} + +func TestTransportReceiveUndeclaredTrailer(t *testing.T) { + ct := newClientTester(t) + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err != nil { + return fmt.Errorf("RoundTrip: %v", err) + } + defer res.Body.Close() + if res.StatusCode != 200 { + return fmt.Errorf("status code = %v; want 200", res.StatusCode) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + return fmt.Errorf("res.Body ReadAll error = %q, %v; want %v", slurp, err, nil) + } + if len(slurp) > 0 { + return fmt.Errorf("body = %q; want nothing", slurp) + } + if _, ok := res.Trailer["Some-Trailer"]; !ok { + return fmt.Errorf("expected Some-Trailer") + } + return nil + } + ct.server = func() error { + ct.greet() + + var n int + var hf *HeadersFrame + for hf == nil && n < 10 { + f, err := ct.fr.ReadFrame() + if err != nil { + return err + } + hf, _ = f.(*HeadersFrame) + n++ + } + + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + + // send headers without Trailer header + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: false, + BlockFragment: buf.Bytes(), + }) + + // send trailers + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: "some-trailer", Value: "I'm an undeclared Trailer!"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: true, + BlockFragment: buf.Bytes(), + }) + return nil + } + ct.run() +} + +func TestTransportInvalidTrailer_Pseudo1(t *testing.T) { + testTransportInvalidTrailer_Pseudo(t, oneHeader) +} +func TestTransportInvalidTrailer_Pseudo2(t *testing.T) { + testTransportInvalidTrailer_Pseudo(t, splitHeader) +} +func testTransportInvalidTrailer_Pseudo(t *testing.T, trailers headerType) { + testInvalidTrailer(t, trailers, pseudoHeaderError(":colon"), func(enc *hpack.Encoder) { + enc.WriteField(hpack.HeaderField{Name: ":colon", Value: "foo"}) + enc.WriteField(hpack.HeaderField{Name: "foo", Value: "bar"}) + }) +} + +func TestTransportInvalidTrailer_Capital1(t *testing.T) { + testTransportInvalidTrailer_Capital(t, oneHeader) +} +func TestTransportInvalidTrailer_Capital2(t *testing.T) { + testTransportInvalidTrailer_Capital(t, splitHeader) +} +func testTransportInvalidTrailer_Capital(t *testing.T, trailers headerType) { + testInvalidTrailer(t, trailers, headerFieldNameError("Capital"), func(enc *hpack.Encoder) { + enc.WriteField(hpack.HeaderField{Name: "foo", Value: "bar"}) + enc.WriteField(hpack.HeaderField{Name: "Capital", Value: "bad"}) + }) +} +func TestTransportInvalidTrailer_EmptyFieldName(t *testing.T) { + testInvalidTrailer(t, oneHeader, headerFieldNameError(""), func(enc *hpack.Encoder) { + enc.WriteField(hpack.HeaderField{Name: "", Value: "bad"}) + }) +} +func TestTransportInvalidTrailer_BinaryFieldValue(t *testing.T) { + testInvalidTrailer(t, oneHeader, headerFieldValueError("has\nnewline"), func(enc *hpack.Encoder) { + enc.WriteField(hpack.HeaderField{Name: "x", Value: "has\nnewline"}) + }) +} + +func testInvalidTrailer(t *testing.T, trailers headerType, wantErr error, writeTrailer func(*hpack.Encoder)) { + ct := newClientTester(t) + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err != nil { + return fmt.Errorf("RoundTrip: %v", err) + } + defer res.Body.Close() + if res.StatusCode != 200 { + return fmt.Errorf("status code = %v; want 200", res.StatusCode) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != wantErr { + return fmt.Errorf("res.Body ReadAll error = %q, %#v; want %T of %#v", slurp, err, wantErr, wantErr) + } + if len(slurp) > 0 { + return fmt.Errorf("body = %q; want nothing", slurp) + } + return nil + } + ct.server = func() error { + ct.greet() + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return err + } + switch f := f.(type) { + case *HeadersFrame: + var endStream bool + send := func(mode headerType) { + hbf := buf.Bytes() + switch mode { + case oneHeader: + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: true, + EndStream: endStream, + BlockFragment: hbf, + }) + case splitHeader: + if len(hbf) < 2 { + panic("too small") + } + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: false, + EndStream: endStream, + BlockFragment: hbf[:1], + }) + ct.fr.WriteContinuation(f.StreamID, true, hbf[1:]) + default: + panic("bogus mode") + } + } + // Response headers (1+ frames; 1 or 2 in this test, but never 0) + { + buf.Reset() + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: "trailer", Value: "declared"}) + endStream = false + send(oneHeader) + } + // Trailers: + { + endStream = true + buf.Reset() + writeTrailer(enc) + send(trailers) + } + return nil + } + } + } + ct.run() +} + +func TestTransportChecksResponseHeaderListSize(t *testing.T) { + ct := newClientTester(t) + ct.client = func() error { + req, _ := http.NewRequest("GET", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err != errResponseHeaderListSize { + if res != nil { + res.Body.Close() + } + size := int64(0) + for k, vv := range res.Header { + for _, v := range vv { + size += int64(len(k)) + int64(len(v)) + 32 + } + } + return fmt.Errorf("RoundTrip Error = %v (and %d bytes of response headers); want errResponseHeaderListSize", err, size) + } + return nil + } + ct.server = func() error { + ct.greet() + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + + for { + f, err := ct.fr.ReadFrame() + if err != nil { + return err + } + switch f := f.(type) { + case *HeadersFrame: + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + large := strings.Repeat("a", 1<<10) + for i := 0; i < 5042; i++ { + enc.WriteField(hpack.HeaderField{Name: large, Value: large}) + } + if size, want := buf.Len(), 6329; size != want { + // Note: this number might change if + // our hpack implementation + // changes. That's fine. This is + // just a sanity check that our + // response can fit in a single + // header block fragment frame. + return fmt.Errorf("encoding over 10MB of duplicate keypairs took %d bytes; expected %d", size, want) + } + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: f.StreamID, + EndHeaders: true, + EndStream: true, + BlockFragment: buf.Bytes(), + }) + return nil + } + } + } + ct.run() +} + +// Test that the the Transport returns a typed error from Response.Body.Read calls +// when the server sends an error. (here we use a panic, since that should generate +// a stream error, but others like cancel should be similar) +func TestTransportBodyReadErrorType(t *testing.T) { + doPanic := make(chan bool, 1) + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + w.(http.Flusher).Flush() // force headers out + <-doPanic + panic("boom") + }, + optOnlyServer, + optQuiet, + ) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + c := &http.Client{Transport: tr} + + res, err := c.Get(st.ts.URL) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + doPanic <- true + buf := make([]byte, 100) + n, err := res.Body.Read(buf) + want := StreamError{StreamID: 0x1, Code: 0x2} + if !reflect.DeepEqual(want, err) { + t.Errorf("Read = %v, %#v; want error %#v", n, err, want) + } +} + +// golang.org/issue/13924 +// This used to fail after many iterations, especially with -race: +// go test -v -run=TestTransportDoubleCloseOnWriteError -count=500 -race +func TestTransportDoubleCloseOnWriteError(t *testing.T) { + var ( + mu sync.Mutex + conn net.Conn // to close if set + ) + + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + mu.Lock() + defer mu.Unlock() + if conn != nil { + conn.Close() + } + }, + optOnlyServer, + ) + defer st.Close() + + tr := &Transport{ + TLSClientConfig: tlsConfigInsecure, + DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) { + tc, err := tls.Dial(network, addr, cfg) + if err != nil { + return nil, err + } + mu.Lock() + defer mu.Unlock() + conn = tc + return tc, nil + }, + } + defer tr.CloseIdleConnections() + c := &http.Client{Transport: tr} + c.Get(st.ts.URL) +} + +// Test that the http1 Transport.DisableKeepAlives option is respected +// and connections are closed as soon as idle. +// See golang.org/issue/14008 +func TestTransportDisableKeepAlives(t *testing.T) { + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, "hi") + }, + optOnlyServer, + ) + defer st.Close() + + connClosed := make(chan struct{}) // closed on tls.Conn.Close + tr := &Transport{ + t1: &http.Transport{ + DisableKeepAlives: true, + }, + TLSClientConfig: tlsConfigInsecure, + DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) { + tc, err := tls.Dial(network, addr, cfg) + if err != nil { + return nil, err + } + return ¬eCloseConn{Conn: tc, closefn: func() { close(connClosed) }}, nil + }, + } + c := &http.Client{Transport: tr} + res, err := c.Get(st.ts.URL) + if err != nil { + t.Fatal(err) + } + if _, err := ioutil.ReadAll(res.Body); err != nil { + t.Fatal(err) + } + defer res.Body.Close() + + select { + case <-connClosed: + case <-time.After(1 * time.Second): + t.Errorf("timeout") + } + +} + +// Test concurrent requests with Transport.DisableKeepAlives. We can share connections, +// but when things are totally idle, it still needs to close. +func TestTransportDisableKeepAlives_Concurrency(t *testing.T) { + const D = 25 * time.Millisecond + st := newServerTester(t, + func(w http.ResponseWriter, r *http.Request) { + time.Sleep(D) + io.WriteString(w, "hi") + }, + optOnlyServer, + ) + defer st.Close() + + var dials int32 + var conns sync.WaitGroup + tr := &Transport{ + t1: &http.Transport{ + DisableKeepAlives: true, + }, + TLSClientConfig: tlsConfigInsecure, + DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) { + tc, err := tls.Dial(network, addr, cfg) + if err != nil { + return nil, err + } + atomic.AddInt32(&dials, 1) + conns.Add(1) + return ¬eCloseConn{Conn: tc, closefn: func() { conns.Done() }}, nil + }, + } + c := &http.Client{Transport: tr} + var reqs sync.WaitGroup + const N = 20 + for i := 0; i < N; i++ { + reqs.Add(1) + if i == N-1 { + // For the final request, try to make all the + // others close. This isn't verified in the + // count, other than the Log statement, since + // it's so timing dependent. This test is + // really to make sure we don't interrupt a + // valid request. + time.Sleep(D * 2) + } + go func() { + defer reqs.Done() + res, err := c.Get(st.ts.URL) + if err != nil { + t.Error(err) + return + } + if _, err := ioutil.ReadAll(res.Body); err != nil { + t.Error(err) + return + } + res.Body.Close() + }() + } + reqs.Wait() + conns.Wait() + t.Logf("did %d dials, %d requests", atomic.LoadInt32(&dials), N) +} + +type noteCloseConn struct { + net.Conn + onceClose sync.Once + closefn func() +} + +func (c *noteCloseConn) Close() error { + c.onceClose.Do(c.closefn) + return c.Conn.Close() +} + +func isTimeout(err error) bool { + switch err := err.(type) { + case nil: + return false + case *url.Error: + return isTimeout(err.Err) + case net.Error: + return err.Timeout() + } + return false +} + +// Test that the http1 Transport.ResponseHeaderTimeout option and cancel is sent. +func TestTransportResponseHeaderTimeout_NoBody(t *testing.T) { + testTransportResponseHeaderTimeout(t, false) +} +func TestTransportResponseHeaderTimeout_Body(t *testing.T) { + testTransportResponseHeaderTimeout(t, true) +} + +func testTransportResponseHeaderTimeout(t *testing.T, body bool) { + ct := newClientTester(t) + ct.tr.t1 = &http.Transport{ + ResponseHeaderTimeout: 5 * time.Millisecond, + } + ct.client = func() error { + c := &http.Client{Transport: ct.tr} + var err error + var n int64 + const bodySize = 4 << 20 + if body { + _, err = c.Post("https://dummy.tld/", "text/foo", io.LimitReader(countingReader{&n}, bodySize)) + } else { + _, err = c.Get("https://dummy.tld/") + } + if !isTimeout(err) { + t.Errorf("client expected timeout error; got %#v", err) + } + if body && n != bodySize { + t.Errorf("only read %d bytes of body; want %d", n, bodySize) + } + return nil + } + ct.server = func() error { + ct.greet() + for { + f, err := ct.fr.ReadFrame() + if err != nil { + t.Logf("ReadFrame: %v", err) + return nil + } + switch f := f.(type) { + case *DataFrame: + dataLen := len(f.Data()) + if dataLen > 0 { + if err := ct.fr.WriteWindowUpdate(0, uint32(dataLen)); err != nil { + return err + } + if err := ct.fr.WriteWindowUpdate(f.StreamID, uint32(dataLen)); err != nil { + return err + } + } + case *RSTStreamFrame: + if f.StreamID == 1 && f.ErrCode == ErrCodeCancel { + return nil + } + } + } + return nil + } + ct.run() +} + +func TestTransportDisableCompression(t *testing.T) { + const body = "sup" + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + want := http.Header{ + "User-Agent": []string{"Go-http-client/2.0"}, + } + if !reflect.DeepEqual(r.Header, want) { + t.Errorf("request headers = %v; want %v", r.Header, want) + } + }, optOnlyServer) + defer st.Close() + + tr := &Transport{ + TLSClientConfig: tlsConfigInsecure, + t1: &http.Transport{ + DisableCompression: true, + }, + } + 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() +} + +// RFC 7540 section 8.1.2.2 +func TestTransportRejectsConnHeaders(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + var got []string + for k := range r.Header { + got = append(got, k) + } + sort.Strings(got) + w.Header().Set("Got-Header", strings.Join(got, ",")) + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + tests := []struct { + key string + value []string + want string + }{ + { + key: "Upgrade", + value: []string{"anything"}, + want: "ERROR: http2: invalid Upgrade request header", + }, + { + key: "Connection", + value: []string{"foo"}, + want: "ERROR: http2: invalid Connection request header", + }, + { + key: "Connection", + value: []string{"close"}, + want: "Accept-Encoding,User-Agent", + }, + { + key: "Connection", + value: []string{"close", "something-else"}, + want: "ERROR: http2: invalid Connection request header", + }, + { + key: "Connection", + value: []string{"keep-alive"}, + want: "Accept-Encoding,User-Agent", + }, + { + key: "Proxy-Connection", // just deleted and ignored + value: []string{"keep-alive"}, + want: "Accept-Encoding,User-Agent", + }, + { + key: "Transfer-Encoding", + value: []string{""}, + want: "Accept-Encoding,User-Agent", + }, + { + key: "Transfer-Encoding", + value: []string{"foo"}, + want: "ERROR: http2: invalid Transfer-Encoding request header", + }, + { + key: "Transfer-Encoding", + value: []string{"chunked"}, + want: "Accept-Encoding,User-Agent", + }, + { + key: "Transfer-Encoding", + value: []string{"chunked", "other"}, + want: "ERROR: http2: invalid Transfer-Encoding request header", + }, + { + key: "Content-Length", + value: []string{"123"}, + want: "Accept-Encoding,User-Agent", + }, + } + + for _, tt := range tests { + req, _ := http.NewRequest("GET", st.ts.URL, nil) + req.Header[tt.key] = tt.value + res, err := tr.RoundTrip(req) + var got string + if err != nil { + got = fmt.Sprintf("ERROR: %v", err) + } else { + got = res.Header.Get("Got-Header") + res.Body.Close() + } + if got != tt.want { + t.Errorf("For key %q, value %q, got = %q; want %q", tt.key, tt.value, got, tt.want) + } + } +} + +// Tests that gzipReader doesn't crash on a second Read call following +// the first Read call's gzip.NewReader returning an error. +func TestGzipReader_DoubleReadCrash(t *testing.T) { + gz := &gzipReader{ + body: ioutil.NopCloser(strings.NewReader("0123456789")), + } + var buf [1]byte + n, err1 := gz.Read(buf[:]) + if n != 0 || !strings.Contains(fmt.Sprint(err1), "invalid header") { + t.Fatalf("Read = %v, %v; want 0, invalid header", n, err1) + } + n, err2 := gz.Read(buf[:]) + if n != 0 || err2 != err1 { + t.Fatalf("second Read = %v, %v; want 0, %v", n, err2, err1) + } +} + +func TestTransportNewTLSConfig(t *testing.T) { + tests := [...]struct { + conf *tls.Config + host string + want *tls.Config + }{ + // Normal case. + 0: { + conf: nil, + host: "foo.com", + want: &tls.Config{ + ServerName: "foo.com", + NextProtos: []string{NextProtoTLS}, + }, + }, + + // User-provided name (bar.com) takes precedence: + 1: { + conf: &tls.Config{ + ServerName: "bar.com", + }, + host: "foo.com", + want: &tls.Config{ + ServerName: "bar.com", + NextProtos: []string{NextProtoTLS}, + }, + }, + + // NextProto is prepended: + 2: { + conf: &tls.Config{ + NextProtos: []string{"foo", "bar"}, + }, + host: "example.com", + want: &tls.Config{ + ServerName: "example.com", + NextProtos: []string{NextProtoTLS, "foo", "bar"}, + }, + }, + + // NextProto is not duplicated: + 3: { + conf: &tls.Config{ + NextProtos: []string{"foo", "bar", NextProtoTLS}, + }, + host: "example.com", + want: &tls.Config{ + ServerName: "example.com", + NextProtos: []string{"foo", "bar", NextProtoTLS}, + }, + }, + } + for i, tt := range tests { + tr := &Transport{TLSClientConfig: tt.conf} + got := tr.newTLSConfig(tt.host) + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("%d. got %#v; want %#v", i, got, tt.want) + } + } +} + +// The Google GFE responds to HEAD requests with a HEADERS frame +// without END_STREAM, followed by a 0-length DATA frame with +// END_STREAM. Make sure we don't get confused by that. (We did.) +func TestTransportReadHeadResponse(t *testing.T) { + ct := newClientTester(t) + clientDone := make(chan struct{}) + ct.client = func() error { + defer close(clientDone) + req, _ := http.NewRequest("HEAD", "https://dummy.tld/", nil) + res, err := ct.tr.RoundTrip(req) + if err != nil { + return err + } + if res.ContentLength != 123 { + return fmt.Errorf("Content-Length = %d; want 123", res.ContentLength) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + return fmt.Errorf("ReadAll: %v", err) + } + if len(slurp) > 0 { + return fmt.Errorf("Unexpected non-empty ReadAll body: %q", slurp) + } + return nil + } + ct.server = func() error { + ct.greet() + for { + f, err := ct.fr.ReadFrame() + if err != nil { + t.Logf("ReadFrame: %v", err) + return nil + } + hf, ok := f.(*HeadersFrame) + if !ok { + continue + } + var buf bytes.Buffer + enc := hpack.NewEncoder(&buf) + enc.WriteField(hpack.HeaderField{Name: ":status", Value: "200"}) + enc.WriteField(hpack.HeaderField{Name: "content-length", Value: "123"}) + ct.fr.WriteHeaders(HeadersFrameParam{ + StreamID: hf.StreamID, + EndHeaders: true, + EndStream: false, // as the GFE does + BlockFragment: buf.Bytes(), + }) + ct.fr.WriteData(hf.StreamID, true, nil) + + <-clientDone + return nil + } + return nil + } + ct.run() +} 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 0000000000..0143b24cd3 --- /dev/null +++ b/vendor/golang.org/x/net/http2/write.go @@ -0,0 +1,262 @@ +// 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" + "log" + "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: decide whether to a) use this in the client code (which didn't +// end up using this yet, because it has a simpler design, not +// currently implementing priorities), or b) delete this and +// make the server code a bit more concrete. +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) +} + +// handlerPanicRST is the message sent from handler goroutines when +// the handler panics. +type handlerPanicRST struct { + StreamID uint32 +} + +func (hp handlerPanicRST) writeFrame(ctx writeContext) error { + return ctx.Framer().WriteRSTStream(hp.StreamID, ErrCodeInternal) +} + +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 or trailers from a server handler. +type writeResHeaders struct { + streamID uint32 + httpResCode int // 0 means no ":status" line + h http.Header // may be nil + trailers []string // if non-nil, which keys of h to write. nil means all. + endStream bool + + date string + contentType string + contentLength string +} + +func encKV(enc *hpack.Encoder, k, v string) { + if VerboseLogs { + log.Printf("http2: server encoding header %q = %q", k, v) + } + enc.WriteField(hpack.HeaderField{Name: k, Value: v}) +} + +func (w *writeResHeaders) writeFrame(ctx writeContext) error { + enc, buf := ctx.HeaderEncoder() + buf.Reset() + + if w.httpResCode != 0 { + encKV(enc, ":status", httpCodeString(w.httpResCode)) + } + + encodeHeaders(enc, w.h, w.trailers) + + if w.contentType != "" { + encKV(enc, "content-type", w.contentType) + } + if w.contentLength != "" { + encKV(enc, "content-length", w.contentLength) + } + if w.date != "" { + encKV(enc, "date", w.date) + } + + headerBlock := buf.Bytes() + if len(headerBlock) == 0 && w.trailers == nil { + 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() + encKV(enc, ":status", "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) +} + +func encodeHeaders(enc *hpack.Encoder, h http.Header, keys []string) { + if keys == nil { + sorter := sorterPool.Get().(*sorter) + // Using defer here, since the returned keys from the + // sorter.Keys method is only valid until the sorter + // is returned: + defer sorterPool.Put(sorter) + keys = sorter.Keys(h) + } + for _, k := range keys { + vv := h[k] + k = lowerHeader(k) + if !validHeaderFieldName(k) { + // TODO: return an error? golang.org/issue/14048 + // For now just omit it. + continue + } + isTE := k == "transfer-encoding" + for _, v := range vv { + if !validHeaderFieldValue(v) { + // TODO: return an error? golang.org/issue/14048 + // For now just omit it. + continue + } + // TODO: more of "8.1.2.2 Connection-Specific Header Fields" + if isTE && v != "trailers" { + continue + } + encKV(enc, k, v) + } + } +} 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 0000000000..c24316ce7b --- /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 0000000000..e0f420a188 --- /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/dstunreach.go b/vendor/golang.org/x/net/icmp/dstunreach.go new file mode 100644 index 0000000000..75db991dfd --- /dev/null +++ b/vendor/golang.org/x/net/icmp/dstunreach.go @@ -0,0 +1,41 @@ +// 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 icmp + +// A DstUnreach represents an ICMP destination unreachable message +// body. +type DstUnreach struct { + Data []byte // data, known as original datagram field + Extensions []Extension // extensions +} + +// Len implements the Len method of MessageBody interface. +func (p *DstUnreach) Len(proto int) int { + if p == nil { + return 0 + } + l, _ := multipartMessageBodyDataLen(proto, p.Data, p.Extensions) + return 4 + l +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *DstUnreach) Marshal(proto int) ([]byte, error) { + return marshalMultipartMessageBody(proto, p.Data, p.Extensions) +} + +// parseDstUnreach parses b as an ICMP destination unreachable message +// body. +func parseDstUnreach(proto int, b []byte) (MessageBody, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + p := &DstUnreach{} + var err error + p.Data, p.Extensions, err = parseMultipartMessageBody(proto, b) + if err != nil { + return nil, err + } + return p, nil +} diff --git a/vendor/golang.org/x/net/icmp/echo.go b/vendor/golang.org/x/net/icmp/echo.go new file mode 100644 index 0000000000..dd55181157 --- /dev/null +++ b/vendor/golang.org/x/net/icmp/echo.go @@ -0,0 +1,45 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package icmp + +import "encoding/binary" + +// An Echo represents an ICMP echo request or reply message body. +type Echo struct { + ID int // identifier + Seq int // sequence number + Data []byte // data +} + +// Len implements the Len method of MessageBody interface. +func (p *Echo) Len(proto int) int { + if p == nil { + return 0 + } + return 4 + len(p.Data) +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *Echo) Marshal(proto int) ([]byte, error) { + b := make([]byte, 4+len(p.Data)) + binary.BigEndian.PutUint16(b[:2], uint16(p.ID)) + binary.BigEndian.PutUint16(b[2:4], uint16(p.Seq)) + copy(b[4:], p.Data) + return b, nil +} + +// parseEcho parses b as an ICMP echo request or reply message body. +func parseEcho(proto int, b []byte) (MessageBody, error) { + bodyLen := len(b) + if bodyLen < 4 { + return nil, errMessageTooShort + } + p := &Echo{ID: int(binary.BigEndian.Uint16(b[:2])), Seq: int(binary.BigEndian.Uint16(b[2:4]))} + if bodyLen > 4 { + p.Data = make([]byte, bodyLen-4) + copy(p.Data, b[4:]) + } + return p, nil +} diff --git a/vendor/golang.org/x/net/icmp/endpoint.go b/vendor/golang.org/x/net/icmp/endpoint.go new file mode 100644 index 0000000000..0213d1a134 --- /dev/null +++ b/vendor/golang.org/x/net/icmp/endpoint.go @@ -0,0 +1,113 @@ +// 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 icmp + +import ( + "net" + "runtime" + "syscall" + "time" + + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +var _ net.PacketConn = &PacketConn{} + +// A PacketConn represents a packet network endpoint that uses either +// ICMPv4 or ICMPv6. +type PacketConn struct { + c net.PacketConn + p4 *ipv4.PacketConn + p6 *ipv6.PacketConn +} + +func (c *PacketConn) ok() bool { return c != nil && c.c != nil } + +// IPv4PacketConn returns the ipv4.PacketConn of c. +// It returns nil when c is not created as the endpoint for ICMPv4. +func (c *PacketConn) IPv4PacketConn() *ipv4.PacketConn { + if !c.ok() { + return nil + } + return c.p4 +} + +// IPv6PacketConn returns the ipv6.PacketConn of c. +// It returns nil when c is not created as the endpoint for ICMPv6. +func (c *PacketConn) IPv6PacketConn() *ipv6.PacketConn { + if !c.ok() { + return nil + } + return c.p6 +} + +// ReadFrom reads an ICMP message from the connection. +func (c *PacketConn) ReadFrom(b []byte) (int, net.Addr, error) { + if !c.ok() { + return 0, nil, syscall.EINVAL + } + // 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" && c.p4 != nil { + n, _, peer, err := c.p4.ReadFrom(b) + return n, peer, err + } + return c.c.ReadFrom(b) +} + +// WriteTo writes the ICMP message b to dst. +// Dst must be net.UDPAddr when c is a non-privileged +// datagram-oriented ICMP endpoint. Otherwise it must be net.IPAddr. +func (c *PacketConn) WriteTo(b []byte, dst net.Addr) (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + return c.c.WriteTo(b, dst) +} + +// Close closes the endpoint. +func (c *PacketConn) Close() error { + if !c.ok() { + return syscall.EINVAL + } + return c.c.Close() +} + +// LocalAddr returns the local network address. +func (c *PacketConn) LocalAddr() net.Addr { + if !c.ok() { + return nil + } + return c.c.LocalAddr() +} + +// SetDeadline sets the read and write deadlines associated with the +// endpoint. +func (c *PacketConn) SetDeadline(t time.Time) error { + if !c.ok() { + return syscall.EINVAL + } + return c.c.SetDeadline(t) +} + +// SetReadDeadline sets the read deadline associated with the +// endpoint. +func (c *PacketConn) SetReadDeadline(t time.Time) error { + if !c.ok() { + return syscall.EINVAL + } + return c.c.SetReadDeadline(t) +} + +// SetWriteDeadline sets the write deadline associated with the +// endpoint. +func (c *PacketConn) SetWriteDeadline(t time.Time) error { + if !c.ok() { + return syscall.EINVAL + } + return c.c.SetWriteDeadline(t) +} diff --git a/vendor/golang.org/x/net/icmp/example_test.go b/vendor/golang.org/x/net/icmp/example_test.go new file mode 100644 index 0000000000..1df4ceccdd --- /dev/null +++ b/vendor/golang.org/x/net/icmp/example_test.go @@ -0,0 +1,63 @@ +// 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 icmp_test + +import ( + "log" + "net" + "os" + "runtime" + + "golang.org/x/net/icmp" + "golang.org/x/net/ipv6" +) + +func ExamplePacketConn_nonPrivilegedPing() { + switch runtime.GOOS { + case "darwin": + case "linux": + log.Println("you may need to adjust the net.ipv4.ping_group_range kernel state") + default: + log.Println("not supported on", runtime.GOOS) + return + } + + c, err := icmp.ListenPacket("udp6", "fe80::1%en0") + if err != nil { + log.Fatal(err) + } + defer c.Close() + + wm := icmp.Message{ + Type: ipv6.ICMPTypeEchoRequest, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: 1, + Data: []byte("HELLO-R-U-THERE"), + }, + } + wb, err := wm.Marshal(nil) + if err != nil { + log.Fatal(err) + } + if _, err := c.WriteTo(wb, &net.UDPAddr{IP: net.ParseIP("ff02::1"), Zone: "en0"}); err != nil { + log.Fatal(err) + } + + rb := make([]byte, 1500) + n, peer, err := c.ReadFrom(rb) + if err != nil { + log.Fatal(err) + } + rm, err := icmp.ParseMessage(58, rb[:n]) + if err != nil { + log.Fatal(err) + } + switch rm.Type { + case ipv6.ICMPTypeEchoReply: + log.Printf("got reflection from %v", peer) + default: + log.Printf("got %+v; want echo reply", rm) + } +} diff --git a/vendor/golang.org/x/net/icmp/extension.go b/vendor/golang.org/x/net/icmp/extension.go new file mode 100644 index 0000000000..402a7514b0 --- /dev/null +++ b/vendor/golang.org/x/net/icmp/extension.go @@ -0,0 +1,89 @@ +// 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 icmp + +import "encoding/binary" + +// An Extension represents an ICMP extension. +type Extension interface { + // Len returns the length of ICMP extension. + // Proto must be either the ICMPv4 or ICMPv6 protocol number. + Len(proto int) int + + // Marshal returns the binary encoding of ICMP extension. + // Proto must be either the ICMPv4 or ICMPv6 protocol number. + Marshal(proto int) ([]byte, error) +} + +const extensionVersion = 2 + +func validExtensionHeader(b []byte) bool { + v := int(b[0]&0xf0) >> 4 + s := binary.BigEndian.Uint16(b[2:4]) + if s != 0 { + s = checksum(b) + } + if v != extensionVersion || s != 0 { + return false + } + return true +} + +// parseExtensions parses b as a list of ICMP extensions. +// The length attribute l must be the length attribute field in +// received icmp messages. +// +// It will return a list of ICMP extensions and an adjusted length +// attribute that represents the length of the padded original +// datagram field. Otherwise, it returns an error. +func parseExtensions(b []byte, l int) ([]Extension, int, error) { + // Still a lot of non-RFC 4884 compliant implementations are + // out there. Set the length attribute l to 128 when it looks + // inappropriate for backwards compatibility. + // + // A minimal extension at least requires 8 octets; 4 octets + // for an extension header, and 4 octets for a single object + // header. + // + // See RFC 4884 for further information. + if 128 > l || l+8 > len(b) { + l = 128 + } + if l+8 > len(b) { + return nil, -1, errNoExtension + } + if !validExtensionHeader(b[l:]) { + if l == 128 { + return nil, -1, errNoExtension + } + l = 128 + if !validExtensionHeader(b[l:]) { + return nil, -1, errNoExtension + } + } + var exts []Extension + for b = b[l+4:]; len(b) >= 4; { + ol := int(binary.BigEndian.Uint16(b[:2])) + if 4 > ol || ol > len(b) { + break + } + switch b[2] { + case classMPLSLabelStack: + ext, err := parseMPLSLabelStack(b[:ol]) + if err != nil { + return nil, -1, err + } + exts = append(exts, ext) + case classInterfaceInfo: + ext, err := parseInterfaceInfo(b[:ol]) + if err != nil { + return nil, -1, err + } + exts = append(exts, ext) + } + b = b[ol:] + } + return exts, l, nil +} diff --git a/vendor/golang.org/x/net/icmp/extension_test.go b/vendor/golang.org/x/net/icmp/extension_test.go new file mode 100644 index 0000000000..0b3f7b9e15 --- /dev/null +++ b/vendor/golang.org/x/net/icmp/extension_test.go @@ -0,0 +1,259 @@ +// 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 icmp + +import ( + "net" + "reflect" + "testing" + + "golang.org/x/net/internal/iana" +) + +var marshalAndParseExtensionTests = []struct { + proto int + hdr []byte + obj []byte + exts []Extension +}{ + // MPLS label stack with no label + { + proto: iana.ProtocolICMP, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x04, 0x01, 0x01, + }, + exts: []Extension{ + &MPLSLabelStack{ + Class: classMPLSLabelStack, + Type: typeIncomingMPLSLabelStack, + }, + }, + }, + // MPLS label stack with a single label + { + proto: iana.ProtocolIPv6ICMP, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x08, 0x01, 0x01, + 0x03, 0xe8, 0xe9, 0xff, + }, + exts: []Extension{ + &MPLSLabelStack{ + Class: classMPLSLabelStack, + Type: typeIncomingMPLSLabelStack, + Labels: []MPLSLabel{ + { + Label: 16014, + TC: 0x4, + S: true, + TTL: 255, + }, + }, + }, + }, + }, + // MPLS label stack with multiple labels + { + proto: iana.ProtocolICMP, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x0c, 0x01, 0x01, + 0x03, 0xe8, 0xde, 0xfe, + 0x03, 0xe8, 0xe1, 0xff, + }, + exts: []Extension{ + &MPLSLabelStack{ + Class: classMPLSLabelStack, + Type: typeIncomingMPLSLabelStack, + Labels: []MPLSLabel{ + { + Label: 16013, + TC: 0x7, + S: false, + TTL: 254, + }, + { + Label: 16014, + TC: 0, + S: true, + TTL: 255, + }, + }, + }, + }, + }, + // Interface information with no attribute + { + proto: iana.ProtocolICMP, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x04, 0x02, 0x00, + }, + exts: []Extension{ + &InterfaceInfo{ + Class: classInterfaceInfo, + }, + }, + }, + // Interface information with ifIndex and name + { + proto: iana.ProtocolICMP, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x10, 0x02, 0x0a, + 0x00, 0x00, 0x00, 0x10, + 0x08, byte('e'), byte('n'), byte('1'), + byte('0'), byte('1'), 0x00, 0x00, + }, + exts: []Extension{ + &InterfaceInfo{ + Class: classInterfaceInfo, + Type: 0x0a, + Interface: &net.Interface{ + Index: 16, + Name: "en101", + }, + }, + }, + }, + // Interface information with ifIndex, IPAddr, name and MTU + { + proto: iana.ProtocolIPv6ICMP, + hdr: []byte{ + 0x20, 0x00, 0x00, 0x00, + }, + obj: []byte{ + 0x00, 0x28, 0x02, 0x0f, + 0x00, 0x00, 0x00, 0x0f, + 0x00, 0x02, 0x00, 0x00, + 0xfe, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x08, byte('e'), byte('n'), byte('1'), + byte('0'), byte('1'), 0x00, 0x00, + 0x00, 0x00, 0x20, 0x00, + }, + exts: []Extension{ + &InterfaceInfo{ + Class: classInterfaceInfo, + Type: 0x0f, + Interface: &net.Interface{ + Index: 15, + Name: "en101", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.ParseIP("fe80::1"), + Zone: "en101", + }, + }, + }, + }, +} + +func TestMarshalAndParseExtension(t *testing.T) { + for i, tt := range marshalAndParseExtensionTests { + for j, ext := range tt.exts { + var err error + var b []byte + switch ext := ext.(type) { + case *MPLSLabelStack: + b, err = ext.Marshal(tt.proto) + if err != nil { + t.Errorf("#%v/%v: %v", i, j, err) + continue + } + case *InterfaceInfo: + b, err = ext.Marshal(tt.proto) + if err != nil { + t.Errorf("#%v/%v: %v", i, j, err) + continue + } + } + if !reflect.DeepEqual(b, tt.obj) { + t.Errorf("#%v/%v: got %#v; want %#v", i, j, b, tt.obj) + continue + } + } + + for j, wire := range []struct { + data []byte // original datagram + inlattr int // length of padded original datagram, a hint + outlattr int // length of padded original datagram, a want + err error + }{ + {nil, 0, -1, errNoExtension}, + {make([]byte, 127), 128, -1, errNoExtension}, + + {make([]byte, 128), 127, -1, errNoExtension}, + {make([]byte, 128), 128, -1, errNoExtension}, + {make([]byte, 128), 129, -1, errNoExtension}, + + {append(make([]byte, 128), append(tt.hdr, tt.obj...)...), 127, 128, nil}, + {append(make([]byte, 128), append(tt.hdr, tt.obj...)...), 128, 128, nil}, + {append(make([]byte, 128), append(tt.hdr, tt.obj...)...), 129, 128, nil}, + + {append(make([]byte, 512), append(tt.hdr, tt.obj...)...), 511, -1, errNoExtension}, + {append(make([]byte, 512), append(tt.hdr, tt.obj...)...), 512, 512, nil}, + {append(make([]byte, 512), append(tt.hdr, tt.obj...)...), 513, -1, errNoExtension}, + } { + exts, l, err := parseExtensions(wire.data, wire.inlattr) + if err != wire.err { + t.Errorf("#%v/%v: got %v; want %v", i, j, err, wire.err) + continue + } + if wire.err != nil { + continue + } + if l != wire.outlattr { + t.Errorf("#%v/%v: got %v; want %v", i, j, l, wire.outlattr) + } + if !reflect.DeepEqual(exts, tt.exts) { + for j, ext := range exts { + switch ext := ext.(type) { + case *MPLSLabelStack: + want := tt.exts[j].(*MPLSLabelStack) + t.Errorf("#%v/%v: got %#v; want %#v", i, j, ext, want) + case *InterfaceInfo: + want := tt.exts[j].(*InterfaceInfo) + t.Errorf("#%v/%v: got %#v; want %#v", i, j, ext, want) + } + } + continue + } + } + } +} + +var parseInterfaceNameTests = []struct { + b []byte + error +}{ + {[]byte{0, 'e', 'n', '0'}, errInvalidExtension}, + {[]byte{4, 'e', 'n', '0'}, nil}, + {[]byte{7, 'e', 'n', '0', 0xff, 0xff, 0xff, 0xff}, errInvalidExtension}, + {[]byte{8, 'e', 'n', '0', 0xff, 0xff, 0xff}, errMessageTooShort}, +} + +func TestParseInterfaceName(t *testing.T) { + ifi := InterfaceInfo{Interface: &net.Interface{}} + for i, tt := range parseInterfaceNameTests { + if _, err := ifi.parseName(tt.b); err != tt.error { + t.Errorf("#%d: got %v; want %v", i, err, tt.error) + } + } +} diff --git a/vendor/golang.org/x/net/icmp/helper.go b/vendor/golang.org/x/net/icmp/helper.go new file mode 100644 index 0000000000..6c4e633bc9 --- /dev/null +++ b/vendor/golang.org/x/net/icmp/helper.go @@ -0,0 +1,27 @@ +// Copyright 2016 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 icmp + +import ( + "encoding/binary" + "unsafe" +) + +var ( + // See http://www.freebsd.org/doc/en/books/porters-handbook/freebsd-versions.html. + freebsdVersion uint32 + + nativeEndian binary.ByteOrder +) + +func init() { + i := uint32(1) + b := (*[4]byte)(unsafe.Pointer(&i)) + if b[0] == 1 { + nativeEndian = binary.LittleEndian + } else { + nativeEndian = binary.BigEndian + } +} diff --git a/vendor/golang.org/x/net/icmp/helper_posix.go b/vendor/golang.org/x/net/icmp/helper_posix.go new file mode 100644 index 0000000000..398fd388ff --- /dev/null +++ b/vendor/golang.org/x/net/icmp/helper_posix.go @@ -0,0 +1,75 @@ +// 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 darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package icmp + +import ( + "net" + "strconv" + "syscall" +) + +func sockaddr(family int, address string) (syscall.Sockaddr, error) { + switch family { + case syscall.AF_INET: + a, err := net.ResolveIPAddr("ip4", address) + if err != nil { + return nil, err + } + if len(a.IP) == 0 { + a.IP = net.IPv4zero + } + if a.IP = a.IP.To4(); a.IP == nil { + return nil, net.InvalidAddrError("non-ipv4 address") + } + sa := &syscall.SockaddrInet4{} + copy(sa.Addr[:], a.IP) + return sa, nil + case syscall.AF_INET6: + a, err := net.ResolveIPAddr("ip6", address) + if err != nil { + return nil, err + } + if len(a.IP) == 0 { + a.IP = net.IPv6unspecified + } + if a.IP.Equal(net.IPv4zero) { + a.IP = net.IPv6unspecified + } + if a.IP = a.IP.To16(); a.IP == nil || a.IP.To4() != nil { + return nil, net.InvalidAddrError("non-ipv6 address") + } + sa := &syscall.SockaddrInet6{ZoneId: zoneToUint32(a.Zone)} + copy(sa.Addr[:], a.IP) + return sa, nil + default: + return nil, net.InvalidAddrError("unexpected family") + } +} + +func zoneToUint32(zone string) uint32 { + if zone == "" { + return 0 + } + if ifi, err := net.InterfaceByName(zone); err == nil { + return uint32(ifi.Index) + } + n, err := strconv.Atoi(zone) + if err != nil { + return 0 + } + return uint32(n) +} + +func last(s string, b byte) int { + i := len(s) + for i--; i >= 0; i-- { + if s[i] == b { + break + } + } + return i +} diff --git a/vendor/golang.org/x/net/icmp/interface.go b/vendor/golang.org/x/net/icmp/interface.go new file mode 100644 index 0000000000..78b5b98bf9 --- /dev/null +++ b/vendor/golang.org/x/net/icmp/interface.go @@ -0,0 +1,236 @@ +// 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 icmp + +import ( + "encoding/binary" + "net" + "strings" + + "golang.org/x/net/internal/iana" +) + +const ( + classInterfaceInfo = 2 + + afiIPv4 = 1 + afiIPv6 = 2 +) + +const ( + attrMTU = 1 << iota + attrName + attrIPAddr + attrIfIndex +) + +// An InterfaceInfo represents interface and next-hop identification. +type InterfaceInfo struct { + Class int // extension object class number + Type int // extension object sub-type + Interface *net.Interface + Addr *net.IPAddr +} + +func (ifi *InterfaceInfo) nameLen() int { + if len(ifi.Interface.Name) > 63 { + return 64 + } + l := 1 + len(ifi.Interface.Name) + return (l + 3) &^ 3 +} + +func (ifi *InterfaceInfo) attrsAndLen(proto int) (attrs, l int) { + l = 4 + if ifi.Interface != nil && ifi.Interface.Index > 0 { + attrs |= attrIfIndex + l += 4 + if len(ifi.Interface.Name) > 0 { + attrs |= attrName + l += ifi.nameLen() + } + if ifi.Interface.MTU > 0 { + attrs |= attrMTU + l += 4 + } + } + if ifi.Addr != nil { + switch proto { + case iana.ProtocolICMP: + if ifi.Addr.IP.To4() != nil { + attrs |= attrIPAddr + l += 4 + net.IPv4len + } + case iana.ProtocolIPv6ICMP: + if ifi.Addr.IP.To16() != nil && ifi.Addr.IP.To4() == nil { + attrs |= attrIPAddr + l += 4 + net.IPv6len + } + } + } + return +} + +// Len implements the Len method of Extension interface. +func (ifi *InterfaceInfo) Len(proto int) int { + _, l := ifi.attrsAndLen(proto) + return l +} + +// Marshal implements the Marshal method of Extension interface. +func (ifi *InterfaceInfo) Marshal(proto int) ([]byte, error) { + attrs, l := ifi.attrsAndLen(proto) + b := make([]byte, l) + if err := ifi.marshal(proto, b, attrs, l); err != nil { + return nil, err + } + return b, nil +} + +func (ifi *InterfaceInfo) marshal(proto int, b []byte, attrs, l int) error { + binary.BigEndian.PutUint16(b[:2], uint16(l)) + b[2], b[3] = classInterfaceInfo, byte(ifi.Type) + for b = b[4:]; len(b) > 0 && attrs != 0; { + switch { + case attrs&attrIfIndex != 0: + b = ifi.marshalIfIndex(proto, b) + attrs &^= attrIfIndex + case attrs&attrIPAddr != 0: + b = ifi.marshalIPAddr(proto, b) + attrs &^= attrIPAddr + case attrs&attrName != 0: + b = ifi.marshalName(proto, b) + attrs &^= attrName + case attrs&attrMTU != 0: + b = ifi.marshalMTU(proto, b) + attrs &^= attrMTU + } + } + return nil +} + +func (ifi *InterfaceInfo) marshalIfIndex(proto int, b []byte) []byte { + binary.BigEndian.PutUint32(b[:4], uint32(ifi.Interface.Index)) + return b[4:] +} + +func (ifi *InterfaceInfo) parseIfIndex(b []byte) ([]byte, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + ifi.Interface.Index = int(binary.BigEndian.Uint32(b[:4])) + return b[4:], nil +} + +func (ifi *InterfaceInfo) marshalIPAddr(proto int, b []byte) []byte { + switch proto { + case iana.ProtocolICMP: + binary.BigEndian.PutUint16(b[:2], uint16(afiIPv4)) + copy(b[4:4+net.IPv4len], ifi.Addr.IP.To4()) + b = b[4+net.IPv4len:] + case iana.ProtocolIPv6ICMP: + binary.BigEndian.PutUint16(b[:2], uint16(afiIPv6)) + copy(b[4:4+net.IPv6len], ifi.Addr.IP.To16()) + b = b[4+net.IPv6len:] + } + return b +} + +func (ifi *InterfaceInfo) parseIPAddr(b []byte) ([]byte, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + afi := int(binary.BigEndian.Uint16(b[:2])) + b = b[4:] + switch afi { + case afiIPv4: + if len(b) < net.IPv4len { + return nil, errMessageTooShort + } + ifi.Addr.IP = make(net.IP, net.IPv4len) + copy(ifi.Addr.IP, b[:net.IPv4len]) + b = b[net.IPv4len:] + case afiIPv6: + if len(b) < net.IPv6len { + return nil, errMessageTooShort + } + ifi.Addr.IP = make(net.IP, net.IPv6len) + copy(ifi.Addr.IP, b[:net.IPv6len]) + b = b[net.IPv6len:] + } + return b, nil +} + +func (ifi *InterfaceInfo) marshalName(proto int, b []byte) []byte { + l := byte(ifi.nameLen()) + b[0] = l + copy(b[1:], []byte(ifi.Interface.Name)) + return b[l:] +} + +func (ifi *InterfaceInfo) parseName(b []byte) ([]byte, error) { + if 4 > len(b) || len(b) < int(b[0]) { + return nil, errMessageTooShort + } + l := int(b[0]) + if l%4 != 0 || 4 > l || l > 64 { + return nil, errInvalidExtension + } + var name [63]byte + copy(name[:], b[1:l]) + ifi.Interface.Name = strings.Trim(string(name[:]), "\000") + return b[l:], nil +} + +func (ifi *InterfaceInfo) marshalMTU(proto int, b []byte) []byte { + binary.BigEndian.PutUint32(b[:4], uint32(ifi.Interface.MTU)) + return b[4:] +} + +func (ifi *InterfaceInfo) parseMTU(b []byte) ([]byte, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + ifi.Interface.MTU = int(binary.BigEndian.Uint32(b[:4])) + return b[4:], nil +} + +func parseInterfaceInfo(b []byte) (Extension, error) { + ifi := &InterfaceInfo{ + Class: int(b[2]), + Type: int(b[3]), + } + if ifi.Type&(attrIfIndex|attrName|attrMTU) != 0 { + ifi.Interface = &net.Interface{} + } + if ifi.Type&attrIPAddr != 0 { + ifi.Addr = &net.IPAddr{} + } + attrs := ifi.Type & (attrIfIndex | attrIPAddr | attrName | attrMTU) + for b = b[4:]; len(b) > 0 && attrs != 0; { + var err error + switch { + case attrs&attrIfIndex != 0: + b, err = ifi.parseIfIndex(b) + attrs &^= attrIfIndex + case attrs&attrIPAddr != 0: + b, err = ifi.parseIPAddr(b) + attrs &^= attrIPAddr + case attrs&attrName != 0: + b, err = ifi.parseName(b) + attrs &^= attrName + case attrs&attrMTU != 0: + b, err = ifi.parseMTU(b) + attrs &^= attrMTU + } + if err != nil { + return nil, err + } + } + if ifi.Interface != nil && ifi.Interface.Name != "" && ifi.Addr != nil && ifi.Addr.IP.To16() != nil && ifi.Addr.IP.To4() == nil { + ifi.Addr.Zone = ifi.Interface.Name + } + return ifi, nil +} diff --git a/vendor/golang.org/x/net/icmp/ipv4.go b/vendor/golang.org/x/net/icmp/ipv4.go new file mode 100644 index 0000000000..729ddc97c0 --- /dev/null +++ b/vendor/golang.org/x/net/icmp/ipv4.go @@ -0,0 +1,56 @@ +// 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 icmp + +import ( + "encoding/binary" + "net" + "runtime" + + "golang.org/x/net/ipv4" +) + +// ParseIPv4Header parses b as an IPv4 header of ICMP error message +// invoking packet, which is contained in ICMP error message. +func ParseIPv4Header(b []byte) (*ipv4.Header, error) { + if len(b) < ipv4.HeaderLen { + return nil, errHeaderTooShort + } + hdrlen := int(b[0]&0x0f) << 2 + if hdrlen > len(b) { + return nil, errBufferTooShort + } + h := &ipv4.Header{ + Version: int(b[0] >> 4), + Len: hdrlen, + TOS: int(b[1]), + ID: int(binary.BigEndian.Uint16(b[4:6])), + FragOff: int(binary.BigEndian.Uint16(b[6:8])), + TTL: int(b[8]), + Protocol: int(b[9]), + Checksum: int(binary.BigEndian.Uint16(b[10:12])), + Src: net.IPv4(b[12], b[13], b[14], b[15]), + Dst: net.IPv4(b[16], b[17], b[18], b[19]), + } + switch runtime.GOOS { + case "darwin": + h.TotalLen = int(nativeEndian.Uint16(b[2:4])) + case "freebsd": + if freebsdVersion >= 1000000 { + h.TotalLen = int(binary.BigEndian.Uint16(b[2:4])) + } else { + h.TotalLen = int(nativeEndian.Uint16(b[2:4])) + } + default: + h.TotalLen = int(binary.BigEndian.Uint16(b[2:4])) + } + h.Flags = ipv4.HeaderFlags(h.FragOff&0xe000) >> 13 + h.FragOff = h.FragOff & 0x1fff + if hdrlen-ipv4.HeaderLen > 0 { + h.Options = make([]byte, hdrlen-ipv4.HeaderLen) + copy(h.Options, b[ipv4.HeaderLen:]) + } + return h, nil +} diff --git a/vendor/golang.org/x/net/icmp/ipv4_test.go b/vendor/golang.org/x/net/icmp/ipv4_test.go new file mode 100644 index 0000000000..b05c697394 --- /dev/null +++ b/vendor/golang.org/x/net/icmp/ipv4_test.go @@ -0,0 +1,71 @@ +// 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 icmp + +import ( + "net" + "reflect" + "runtime" + "testing" + + "golang.org/x/net/ipv4" +) + +var ( + wireHeaderFromKernel = [ipv4.HeaderLen]byte{ + 0x45, 0x01, 0xbe, 0xef, + 0xca, 0xfe, 0x45, 0xdc, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + } + wireHeaderFromTradBSDKernel = [ipv4.HeaderLen]byte{ + 0x45, 0x01, 0xef, 0xbe, + 0xca, 0xfe, 0x45, 0xdc, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + } + // TODO(mikio): Add platform dependent wire header formats when + // we support new platforms. + + testHeader = &ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TOS: 1, + TotalLen: 0xbeef, + ID: 0xcafe, + Flags: ipv4.DontFragment, + FragOff: 1500, + TTL: 255, + Protocol: 1, + Checksum: 0xdead, + Src: net.IPv4(172, 16, 254, 254), + Dst: net.IPv4(192, 168, 0, 1), + } +) + +func TestParseIPv4Header(t *testing.T) { + var wh []byte + switch runtime.GOOS { + case "darwin": + wh = wireHeaderFromTradBSDKernel[:] + case "freebsd": + if freebsdVersion >= 1000000 { + wh = wireHeaderFromKernel[:] + } else { + wh = wireHeaderFromTradBSDKernel[:] + } + default: + wh = wireHeaderFromKernel[:] + } + h, err := ParseIPv4Header(wh) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(h, testHeader) { + t.Fatalf("got %#v; want %#v", h, testHeader) + } +} diff --git a/vendor/golang.org/x/net/icmp/ipv6.go b/vendor/golang.org/x/net/icmp/ipv6.go new file mode 100644 index 0000000000..58eaa77d02 --- /dev/null +++ b/vendor/golang.org/x/net/icmp/ipv6.go @@ -0,0 +1,23 @@ +// Copyright 2013 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 icmp + +import ( + "net" + + "golang.org/x/net/internal/iana" +) + +const ipv6PseudoHeaderLen = 2*net.IPv6len + 8 + +// IPv6PseudoHeader returns an IPv6 pseudo header for checksum +// calculation. +func IPv6PseudoHeader(src, dst net.IP) []byte { + b := make([]byte, ipv6PseudoHeaderLen) + copy(b, src.To16()) + copy(b[net.IPv6len:], dst.To16()) + b[len(b)-1] = byte(iana.ProtocolIPv6ICMP) + return b +} diff --git a/vendor/golang.org/x/net/icmp/listen_posix.go b/vendor/golang.org/x/net/icmp/listen_posix.go new file mode 100644 index 0000000000..b9f260796e --- /dev/null +++ b/vendor/golang.org/x/net/icmp/listen_posix.go @@ -0,0 +1,98 @@ +// 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 darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package icmp + +import ( + "net" + "os" + "runtime" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +const sysIP_STRIPHDR = 0x17 // for now only darwin supports this option + +// ListenPacket listens for incoming ICMP packets addressed to +// address. See net.Dial for the syntax of address. +// +// For non-privileged datagram-oriented ICMP endpoints, network must +// be "udp4" or "udp6". The endpoint allows to read, write a few +// limited ICMP messages such as echo request and echo reply. +// Currently only Darwin and Linux support this. +// +// Examples: +// ListenPacket("udp4", "192.168.0.1") +// ListenPacket("udp4", "0.0.0.0") +// ListenPacket("udp6", "fe80::1%en0") +// ListenPacket("udp6", "::") +// +// For privileged raw ICMP endpoints, network must be "ip4" or "ip6" +// followed by a colon and an ICMP protocol number or name. +// +// Examples: +// ListenPacket("ip4:icmp", "192.168.0.1") +// ListenPacket("ip4:1", "0.0.0.0") +// ListenPacket("ip6:ipv6-icmp", "fe80::1%en0") +// ListenPacket("ip6:58", "::") +func ListenPacket(network, address string) (*PacketConn, error) { + var family, proto int + switch network { + case "udp4": + family, proto = syscall.AF_INET, iana.ProtocolICMP + case "udp6": + family, proto = syscall.AF_INET6, iana.ProtocolIPv6ICMP + default: + i := last(network, ':') + switch network[:i] { + case "ip4": + proto = iana.ProtocolICMP + case "ip6": + proto = iana.ProtocolIPv6ICMP + } + } + var cerr error + var c net.PacketConn + switch family { + case syscall.AF_INET, syscall.AF_INET6: + s, err := syscall.Socket(family, syscall.SOCK_DGRAM, proto) + if err != nil { + return nil, os.NewSyscallError("socket", err) + } + defer syscall.Close(s) + if runtime.GOOS == "darwin" && family == syscall.AF_INET { + if err := syscall.SetsockoptInt(s, iana.ProtocolIP, sysIP_STRIPHDR, 1); err != nil { + return nil, os.NewSyscallError("setsockopt", err) + } + } + sa, err := sockaddr(family, address) + if err != nil { + return nil, err + } + if err := syscall.Bind(s, sa); err != nil { + return nil, os.NewSyscallError("bind", err) + } + f := os.NewFile(uintptr(s), "datagram-oriented icmp") + defer f.Close() + c, cerr = net.FilePacketConn(f) + default: + c, cerr = net.ListenPacket(network, address) + } + if cerr != nil { + return nil, cerr + } + switch proto { + case iana.ProtocolICMP: + return &PacketConn{c: c, p4: ipv4.NewPacketConn(c)}, nil + case iana.ProtocolIPv6ICMP: + return &PacketConn{c: c, p6: ipv6.NewPacketConn(c)}, nil + default: + return &PacketConn{c: c}, nil + } +} diff --git a/vendor/golang.org/x/net/icmp/listen_stub.go b/vendor/golang.org/x/net/icmp/listen_stub.go new file mode 100644 index 0000000000..668728d17e --- /dev/null +++ b/vendor/golang.org/x/net/icmp/listen_stub.go @@ -0,0 +1,33 @@ +// 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 nacl plan9 + +package icmp + +// ListenPacket listens for incoming ICMP packets addressed to +// address. See net.Dial for the syntax of address. +// +// For non-privileged datagram-oriented ICMP endpoints, network must +// be "udp4" or "udp6". The endpoint allows to read, write a few +// limited ICMP messages such as echo request and echo reply. +// Currently only Darwin and Linux support this. +// +// Examples: +// ListenPacket("udp4", "192.168.0.1") +// ListenPacket("udp4", "0.0.0.0") +// ListenPacket("udp6", "fe80::1%en0") +// ListenPacket("udp6", "::") +// +// For privileged raw ICMP endpoints, network must be "ip4" or "ip6" +// followed by a colon and an ICMP protocol number or name. +// +// Examples: +// ListenPacket("ip4:icmp", "192.168.0.1") +// ListenPacket("ip4:1", "0.0.0.0") +// ListenPacket("ip6:ipv6-icmp", "fe80::1%en0") +// ListenPacket("ip6:58", "::") +func ListenPacket(network, address string) (*PacketConn, error) { + return nil, errOpNoSupport +} diff --git a/vendor/golang.org/x/net/icmp/message.go b/vendor/golang.org/x/net/icmp/message.go new file mode 100644 index 0000000000..42d6df2c13 --- /dev/null +++ b/vendor/golang.org/x/net/icmp/message.go @@ -0,0 +1,150 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package icmp provides basic functions for the manipulation of +// messages used in the Internet Control Message Protocols, +// ICMPv4 and ICMPv6. +// +// ICMPv4 and ICMPv6 are defined in RFC 792 and RFC 4443. +// Multi-part message support for ICMP is defined in RFC 4884. +// ICMP extensions for MPLS are defined in RFC 4950. +// ICMP extensions for interface and next-hop identification are +// defined in RFC 5837. +package icmp // import "golang.org/x/net/icmp" + +import ( + "encoding/binary" + "errors" + "net" + "syscall" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +var ( + errMessageTooShort = errors.New("message too short") + errHeaderTooShort = errors.New("header too short") + errBufferTooShort = errors.New("buffer too short") + errOpNoSupport = errors.New("operation not supported") + errNoExtension = errors.New("no extension") + errInvalidExtension = errors.New("invalid extension") +) + +func checksum(b []byte) uint16 { + csumcv := len(b) - 1 // checksum coverage + s := uint32(0) + for i := 0; i < csumcv; i += 2 { + s += uint32(b[i+1])<<8 | uint32(b[i]) + } + if csumcv&1 == 0 { + s += uint32(b[csumcv]) + } + s = s>>16 + s&0xffff + s = s + s>>16 + return ^uint16(s) +} + +// A Type represents an ICMP message type. +type Type interface { + Protocol() int +} + +// A Message represents an ICMP message. +type Message struct { + Type Type // type, either ipv4.ICMPType or ipv6.ICMPType + Code int // code + Checksum int // checksum + Body MessageBody // body +} + +// Marshal returns the binary encoding of the ICMP message m. +// +// For an ICMPv4 message, the returned message always contains the +// calculated checksum field. +// +// For an ICMPv6 message, the returned message contains the calculated +// checksum field when psh is not nil, otherwise the kernel will +// compute the checksum field during the message transmission. +// When psh is not nil, it must be the pseudo header for IPv6. +func (m *Message) Marshal(psh []byte) ([]byte, error) { + var mtype int + switch typ := m.Type.(type) { + case ipv4.ICMPType: + mtype = int(typ) + case ipv6.ICMPType: + mtype = int(typ) + default: + return nil, syscall.EINVAL + } + b := []byte{byte(mtype), byte(m.Code), 0, 0} + if m.Type.Protocol() == iana.ProtocolIPv6ICMP && psh != nil { + b = append(psh, b...) + } + if m.Body != nil && m.Body.Len(m.Type.Protocol()) != 0 { + mb, err := m.Body.Marshal(m.Type.Protocol()) + if err != nil { + return nil, err + } + b = append(b, mb...) + } + if m.Type.Protocol() == iana.ProtocolIPv6ICMP { + if psh == nil { // cannot calculate checksum here + return b, nil + } + off, l := 2*net.IPv6len, len(b)-len(psh) + binary.BigEndian.PutUint32(b[off:off+4], uint32(l)) + } + s := checksum(b) + // Place checksum back in header; using ^= avoids the + // assumption the checksum bytes are zero. + b[len(psh)+2] ^= byte(s) + b[len(psh)+3] ^= byte(s >> 8) + return b[len(psh):], nil +} + +var parseFns = map[Type]func(int, []byte) (MessageBody, error){ + ipv4.ICMPTypeDestinationUnreachable: parseDstUnreach, + ipv4.ICMPTypeTimeExceeded: parseTimeExceeded, + ipv4.ICMPTypeParameterProblem: parseParamProb, + + ipv4.ICMPTypeEcho: parseEcho, + ipv4.ICMPTypeEchoReply: parseEcho, + + ipv6.ICMPTypeDestinationUnreachable: parseDstUnreach, + ipv6.ICMPTypePacketTooBig: parsePacketTooBig, + ipv6.ICMPTypeTimeExceeded: parseTimeExceeded, + ipv6.ICMPTypeParameterProblem: parseParamProb, + + ipv6.ICMPTypeEchoRequest: parseEcho, + ipv6.ICMPTypeEchoReply: parseEcho, +} + +// ParseMessage parses b as an ICMP message. +// Proto must be either the ICMPv4 or ICMPv6 protocol number. +func ParseMessage(proto int, b []byte) (*Message, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + var err error + m := &Message{Code: int(b[1]), Checksum: int(binary.BigEndian.Uint16(b[2:4]))} + switch proto { + case iana.ProtocolICMP: + m.Type = ipv4.ICMPType(b[0]) + case iana.ProtocolIPv6ICMP: + m.Type = ipv6.ICMPType(b[0]) + default: + return nil, syscall.EINVAL + } + if fn, ok := parseFns[m.Type]; !ok { + m.Body, err = parseDefaultMessageBody(proto, b[4:]) + } else { + m.Body, err = fn(proto, b[4:]) + } + if err != nil { + return nil, err + } + return m, nil +} diff --git a/vendor/golang.org/x/net/icmp/message_test.go b/vendor/golang.org/x/net/icmp/message_test.go new file mode 100644 index 0000000000..5d2605f8d1 --- /dev/null +++ b/vendor/golang.org/x/net/icmp/message_test.go @@ -0,0 +1,134 @@ +// 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 icmp_test + +import ( + "net" + "reflect" + "testing" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +var marshalAndParseMessageForIPv4Tests = []icmp.Message{ + { + Type: ipv4.ICMPTypeDestinationUnreachable, Code: 15, + Body: &icmp.DstUnreach{ + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv4.ICMPTypeTimeExceeded, Code: 1, + Body: &icmp.TimeExceeded{ + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv4.ICMPTypeParameterProblem, Code: 2, + Body: &icmp.ParamProb{ + Pointer: 8, + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: 1, Seq: 2, + Data: []byte("HELLO-R-U-THERE"), + }, + }, + { + Type: ipv4.ICMPTypePhoturis, + Body: &icmp.DefaultMessageBody{ + Data: []byte{0x80, 0x40, 0x20, 0x10}, + }, + }, +} + +func TestMarshalAndParseMessageForIPv4(t *testing.T) { + for i, tt := range marshalAndParseMessageForIPv4Tests { + b, err := tt.Marshal(nil) + if err != nil { + t.Fatal(err) + } + m, err := icmp.ParseMessage(iana.ProtocolICMP, b) + if err != nil { + t.Fatal(err) + } + if m.Type != tt.Type || m.Code != tt.Code { + t.Errorf("#%v: got %v; want %v", i, m, &tt) + } + if !reflect.DeepEqual(m.Body, tt.Body) { + t.Errorf("#%v: got %v; want %v", i, m.Body, tt.Body) + } + } +} + +var marshalAndParseMessageForIPv6Tests = []icmp.Message{ + { + Type: ipv6.ICMPTypeDestinationUnreachable, Code: 6, + Body: &icmp.DstUnreach{ + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv6.ICMPTypePacketTooBig, Code: 0, + Body: &icmp.PacketTooBig{ + MTU: 1<<16 - 1, + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv6.ICMPTypeTimeExceeded, Code: 1, + Body: &icmp.TimeExceeded{ + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv6.ICMPTypeParameterProblem, Code: 2, + Body: &icmp.ParamProb{ + Pointer: 8, + Data: []byte("ERROR-INVOKING-PACKET"), + }, + }, + { + Type: ipv6.ICMPTypeEchoRequest, Code: 0, + Body: &icmp.Echo{ + ID: 1, Seq: 2, + Data: []byte("HELLO-R-U-THERE"), + }, + }, + { + Type: ipv6.ICMPTypeDuplicateAddressConfirmation, + Body: &icmp.DefaultMessageBody{ + Data: []byte{0x80, 0x40, 0x20, 0x10}, + }, + }, +} + +func TestMarshalAndParseMessageForIPv6(t *testing.T) { + pshicmp := icmp.IPv6PseudoHeader(net.ParseIP("fe80::1"), net.ParseIP("ff02::1")) + for i, tt := range marshalAndParseMessageForIPv6Tests { + for _, psh := range [][]byte{pshicmp, nil} { + b, err := tt.Marshal(psh) + if err != nil { + t.Fatal(err) + } + m, err := icmp.ParseMessage(iana.ProtocolIPv6ICMP, b) + if err != nil { + t.Fatal(err) + } + if m.Type != tt.Type || m.Code != tt.Code { + t.Errorf("#%v: got %v; want %v", i, m, &tt) + } + if !reflect.DeepEqual(m.Body, tt.Body) { + t.Errorf("#%v: got %v; want %v", i, m.Body, tt.Body) + } + } + } +} diff --git a/vendor/golang.org/x/net/icmp/messagebody.go b/vendor/golang.org/x/net/icmp/messagebody.go new file mode 100644 index 0000000000..2121a17be2 --- /dev/null +++ b/vendor/golang.org/x/net/icmp/messagebody.go @@ -0,0 +1,41 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package icmp + +// A MessageBody represents an ICMP message body. +type MessageBody interface { + // Len returns the length of ICMP message body. + // Proto must be either the ICMPv4 or ICMPv6 protocol number. + Len(proto int) int + + // Marshal returns the binary encoding of ICMP message body. + // Proto must be either the ICMPv4 or ICMPv6 protocol number. + Marshal(proto int) ([]byte, error) +} + +// A DefaultMessageBody represents the default message body. +type DefaultMessageBody struct { + Data []byte // data +} + +// Len implements the Len method of MessageBody interface. +func (p *DefaultMessageBody) Len(proto int) int { + if p == nil { + return 0 + } + return len(p.Data) +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *DefaultMessageBody) Marshal(proto int) ([]byte, error) { + return p.Data, nil +} + +// parseDefaultMessageBody parses b as an ICMP message body. +func parseDefaultMessageBody(proto int, b []byte) (MessageBody, error) { + p := &DefaultMessageBody{Data: make([]byte, len(b))} + copy(p.Data, b) + return p, nil +} diff --git a/vendor/golang.org/x/net/icmp/mpls.go b/vendor/golang.org/x/net/icmp/mpls.go new file mode 100644 index 0000000000..c314917488 --- /dev/null +++ b/vendor/golang.org/x/net/icmp/mpls.go @@ -0,0 +1,77 @@ +// 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 icmp + +import "encoding/binary" + +// A MPLSLabel represents a MPLS label stack entry. +type MPLSLabel struct { + Label int // label value + TC int // traffic class; formerly experimental use + S bool // bottom of stack + TTL int // time to live +} + +const ( + classMPLSLabelStack = 1 + typeIncomingMPLSLabelStack = 1 +) + +// A MPLSLabelStack represents a MPLS label stack. +type MPLSLabelStack struct { + Class int // extension object class number + Type int // extension object sub-type + Labels []MPLSLabel +} + +// Len implements the Len method of Extension interface. +func (ls *MPLSLabelStack) Len(proto int) int { + return 4 + (4 * len(ls.Labels)) +} + +// Marshal implements the Marshal method of Extension interface. +func (ls *MPLSLabelStack) Marshal(proto int) ([]byte, error) { + b := make([]byte, ls.Len(proto)) + if err := ls.marshal(proto, b); err != nil { + return nil, err + } + return b, nil +} + +func (ls *MPLSLabelStack) marshal(proto int, b []byte) error { + l := ls.Len(proto) + binary.BigEndian.PutUint16(b[:2], uint16(l)) + b[2], b[3] = classMPLSLabelStack, typeIncomingMPLSLabelStack + off := 4 + for _, ll := range ls.Labels { + b[off], b[off+1], b[off+2] = byte(ll.Label>>12), byte(ll.Label>>4&0xff), byte(ll.Label<<4&0xf0) + b[off+2] |= byte(ll.TC << 1 & 0x0e) + if ll.S { + b[off+2] |= 0x1 + } + b[off+3] = byte(ll.TTL) + off += 4 + } + return nil +} + +func parseMPLSLabelStack(b []byte) (Extension, error) { + ls := &MPLSLabelStack{ + Class: int(b[2]), + Type: int(b[3]), + } + for b = b[4:]; len(b) >= 4; b = b[4:] { + ll := MPLSLabel{ + Label: int(b[0])<<12 | int(b[1])<<4 | int(b[2])>>4, + TC: int(b[2]&0x0e) >> 1, + TTL: int(b[3]), + } + if b[2]&0x1 != 0 { + ll.S = true + } + ls.Labels = append(ls.Labels, ll) + } + return ls, nil +} diff --git a/vendor/golang.org/x/net/icmp/multipart.go b/vendor/golang.org/x/net/icmp/multipart.go new file mode 100644 index 0000000000..f271356606 --- /dev/null +++ b/vendor/golang.org/x/net/icmp/multipart.go @@ -0,0 +1,109 @@ +// 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 icmp + +import "golang.org/x/net/internal/iana" + +// multipartMessageBodyDataLen takes b as an original datagram and +// exts as extensions, and returns a required length for message body +// and a required length for a padded original datagram in wire +// format. +func multipartMessageBodyDataLen(proto int, b []byte, exts []Extension) (bodyLen, dataLen int) { + for _, ext := range exts { + bodyLen += ext.Len(proto) + } + if bodyLen > 0 { + dataLen = multipartMessageOrigDatagramLen(proto, b) + bodyLen += 4 // length of extension header + } else { + dataLen = len(b) + } + bodyLen += dataLen + return bodyLen, dataLen +} + +// multipartMessageOrigDatagramLen takes b as an original datagram, +// and returns a required length for a padded orignal datagram in wire +// format. +func multipartMessageOrigDatagramLen(proto int, b []byte) int { + roundup := func(b []byte, align int) int { + // According to RFC 4884, the padded original datagram + // field must contain at least 128 octets. + if len(b) < 128 { + return 128 + } + r := len(b) + return (r + align - 1) & ^(align - 1) + } + switch proto { + case iana.ProtocolICMP: + return roundup(b, 4) + case iana.ProtocolIPv6ICMP: + return roundup(b, 8) + default: + return len(b) + } +} + +// marshalMultipartMessageBody takes data as an original datagram and +// exts as extesnsions, and returns a binary encoding of message body. +// It can be used for non-multipart message bodies when exts is nil. +func marshalMultipartMessageBody(proto int, data []byte, exts []Extension) ([]byte, error) { + bodyLen, dataLen := multipartMessageBodyDataLen(proto, data, exts) + b := make([]byte, 4+bodyLen) + copy(b[4:], data) + off := dataLen + 4 + if len(exts) > 0 { + b[dataLen+4] = byte(extensionVersion << 4) + off += 4 // length of object header + for _, ext := range exts { + switch ext := ext.(type) { + case *MPLSLabelStack: + if err := ext.marshal(proto, b[off:]); err != nil { + return nil, err + } + off += ext.Len(proto) + case *InterfaceInfo: + attrs, l := ext.attrsAndLen(proto) + if err := ext.marshal(proto, b[off:], attrs, l); err != nil { + return nil, err + } + off += ext.Len(proto) + } + } + s := checksum(b[dataLen+4:]) + b[dataLen+4+2] ^= byte(s) + b[dataLen+4+3] ^= byte(s >> 8) + switch proto { + case iana.ProtocolICMP: + b[1] = byte(dataLen / 4) + case iana.ProtocolIPv6ICMP: + b[0] = byte(dataLen / 8) + } + } + return b, nil +} + +// parseMultipartMessageBody parses b as either a non-multipart +// message body or a multipart message body. +func parseMultipartMessageBody(proto int, b []byte) ([]byte, []Extension, error) { + var l int + switch proto { + case iana.ProtocolICMP: + l = 4 * int(b[1]) + case iana.ProtocolIPv6ICMP: + l = 8 * int(b[0]) + } + if len(b) == 4 { + return nil, nil, nil + } + exts, l, err := parseExtensions(b[4:], l) + if err != nil { + l = len(b) - 4 + } + data := make([]byte, l) + copy(data, b[4:]) + return data, exts, nil +} diff --git a/vendor/golang.org/x/net/icmp/multipart_test.go b/vendor/golang.org/x/net/icmp/multipart_test.go new file mode 100644 index 0000000000..966ccb8da1 --- /dev/null +++ b/vendor/golang.org/x/net/icmp/multipart_test.go @@ -0,0 +1,442 @@ +// 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 icmp_test + +import ( + "fmt" + "net" + "reflect" + "testing" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +var marshalAndParseMultipartMessageForIPv4Tests = []icmp.Message{ + { + Type: ipv4.ICMPTypeDestinationUnreachable, Code: 15, + Body: &icmp.DstUnreach{ + Data: []byte("ERROR-INVOKING-PACKET"), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{ + Class: 1, + Type: 1, + Labels: []icmp.MPLSLabel{ + { + Label: 16014, + TC: 0x4, + S: true, + TTL: 255, + }, + }, + }, + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x0f, + Interface: &net.Interface{ + Index: 15, + Name: "en101", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.IPv4(192, 168, 0, 1).To4(), + }, + }, + }, + }, + }, + { + Type: ipv4.ICMPTypeTimeExceeded, Code: 1, + Body: &icmp.TimeExceeded{ + Data: []byte("ERROR-INVOKING-PACKET"), + Extensions: []icmp.Extension{ + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x0f, + Interface: &net.Interface{ + Index: 15, + Name: "en101", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.IPv4(192, 168, 0, 1).To4(), + }, + }, + &icmp.MPLSLabelStack{ + Class: 1, + Type: 1, + Labels: []icmp.MPLSLabel{ + { + Label: 16014, + TC: 0x4, + S: true, + TTL: 255, + }, + }, + }, + }, + }, + }, + { + Type: ipv4.ICMPTypeParameterProblem, Code: 2, + Body: &icmp.ParamProb{ + Pointer: 8, + Data: []byte("ERROR-INVOKING-PACKET"), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{ + Class: 1, + Type: 1, + Labels: []icmp.MPLSLabel{ + { + Label: 16014, + TC: 0x4, + S: true, + TTL: 255, + }, + }, + }, + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x0f, + Interface: &net.Interface{ + Index: 15, + Name: "en101", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.IPv4(192, 168, 0, 1).To4(), + }, + }, + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x2f, + Interface: &net.Interface{ + Index: 16, + Name: "en102", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.IPv4(192, 168, 0, 2).To4(), + }, + }, + }, + }, + }, +} + +func TestMarshalAndParseMultipartMessageForIPv4(t *testing.T) { + for i, tt := range marshalAndParseMultipartMessageForIPv4Tests { + b, err := tt.Marshal(nil) + if err != nil { + t.Fatal(err) + } + if b[5] != 32 { + t.Errorf("#%v: got %v; want 32", i, b[5]) + } + m, err := icmp.ParseMessage(iana.ProtocolICMP, b) + if err != nil { + t.Fatal(err) + } + if m.Type != tt.Type || m.Code != tt.Code { + t.Errorf("#%v: got %v; want %v", i, m, &tt) + } + switch m.Type { + case ipv4.ICMPTypeDestinationUnreachable: + got, want := m.Body.(*icmp.DstUnreach), tt.Body.(*icmp.DstUnreach) + if !reflect.DeepEqual(got.Extensions, want.Extensions) { + t.Error(dumpExtensions(i, got.Extensions, want.Extensions)) + } + if len(got.Data) != 128 { + t.Errorf("#%v: got %v; want 128", i, len(got.Data)) + } + case ipv4.ICMPTypeTimeExceeded: + got, want := m.Body.(*icmp.TimeExceeded), tt.Body.(*icmp.TimeExceeded) + if !reflect.DeepEqual(got.Extensions, want.Extensions) { + t.Error(dumpExtensions(i, got.Extensions, want.Extensions)) + } + if len(got.Data) != 128 { + t.Errorf("#%v: got %v; want 128", i, len(got.Data)) + } + case ipv4.ICMPTypeParameterProblem: + got, want := m.Body.(*icmp.ParamProb), tt.Body.(*icmp.ParamProb) + if !reflect.DeepEqual(got.Extensions, want.Extensions) { + t.Error(dumpExtensions(i, got.Extensions, want.Extensions)) + } + if len(got.Data) != 128 { + t.Errorf("#%v: got %v; want 128", i, len(got.Data)) + } + } + } +} + +var marshalAndParseMultipartMessageForIPv6Tests = []icmp.Message{ + { + Type: ipv6.ICMPTypeDestinationUnreachable, Code: 6, + Body: &icmp.DstUnreach{ + Data: []byte("ERROR-INVOKING-PACKET"), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{ + Class: 1, + Type: 1, + Labels: []icmp.MPLSLabel{ + { + Label: 16014, + TC: 0x4, + S: true, + TTL: 255, + }, + }, + }, + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x0f, + Interface: &net.Interface{ + Index: 15, + Name: "en101", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.ParseIP("fe80::1"), + Zone: "en101", + }, + }, + }, + }, + }, + { + Type: ipv6.ICMPTypeTimeExceeded, Code: 1, + Body: &icmp.TimeExceeded{ + Data: []byte("ERROR-INVOKING-PACKET"), + Extensions: []icmp.Extension{ + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x0f, + Interface: &net.Interface{ + Index: 15, + Name: "en101", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.ParseIP("fe80::1"), + Zone: "en101", + }, + }, + &icmp.MPLSLabelStack{ + Class: 1, + Type: 1, + Labels: []icmp.MPLSLabel{ + { + Label: 16014, + TC: 0x4, + S: true, + TTL: 255, + }, + }, + }, + &icmp.InterfaceInfo{ + Class: 2, + Type: 0x2f, + Interface: &net.Interface{ + Index: 16, + Name: "en102", + MTU: 8192, + }, + Addr: &net.IPAddr{ + IP: net.ParseIP("fe80::1"), + Zone: "en102", + }, + }, + }, + }, + }, +} + +func TestMarshalAndParseMultipartMessageForIPv6(t *testing.T) { + pshicmp := icmp.IPv6PseudoHeader(net.ParseIP("fe80::1"), net.ParseIP("ff02::1")) + for i, tt := range marshalAndParseMultipartMessageForIPv6Tests { + for _, psh := range [][]byte{pshicmp, nil} { + b, err := tt.Marshal(psh) + if err != nil { + t.Fatal(err) + } + if b[4] != 16 { + t.Errorf("#%v: got %v; want 16", i, b[4]) + } + m, err := icmp.ParseMessage(iana.ProtocolIPv6ICMP, b) + if err != nil { + t.Fatal(err) + } + if m.Type != tt.Type || m.Code != tt.Code { + t.Errorf("#%v: got %v; want %v", i, m, &tt) + } + switch m.Type { + case ipv6.ICMPTypeDestinationUnreachable: + got, want := m.Body.(*icmp.DstUnreach), tt.Body.(*icmp.DstUnreach) + if !reflect.DeepEqual(got.Extensions, want.Extensions) { + t.Error(dumpExtensions(i, got.Extensions, want.Extensions)) + } + if len(got.Data) != 128 { + t.Errorf("#%v: got %v; want 128", i, len(got.Data)) + } + case ipv6.ICMPTypeTimeExceeded: + got, want := m.Body.(*icmp.TimeExceeded), tt.Body.(*icmp.TimeExceeded) + if !reflect.DeepEqual(got.Extensions, want.Extensions) { + t.Error(dumpExtensions(i, got.Extensions, want.Extensions)) + } + if len(got.Data) != 128 { + t.Errorf("#%v: got %v; want 128", i, len(got.Data)) + } + } + } + } +} + +func dumpExtensions(i int, gotExts, wantExts []icmp.Extension) string { + var s string + for j, got := range gotExts { + switch got := got.(type) { + case *icmp.MPLSLabelStack: + want := wantExts[j].(*icmp.MPLSLabelStack) + if !reflect.DeepEqual(got, want) { + s += fmt.Sprintf("#%v/%v: got %#v; want %#v\n", i, j, got, want) + } + case *icmp.InterfaceInfo: + want := wantExts[j].(*icmp.InterfaceInfo) + if !reflect.DeepEqual(got, want) { + s += fmt.Sprintf("#%v/%v: got %#v, %#v, %#v; want %#v, %#v, %#v\n", i, j, got, got.Interface, got.Addr, want, want.Interface, want.Addr) + } + } + } + return s[:len(s)-1] +} + +var multipartMessageBodyLenTests = []struct { + proto int + in icmp.MessageBody + out int +}{ + { + iana.ProtocolICMP, + &icmp.DstUnreach{ + Data: make([]byte, ipv4.HeaderLen), + }, + 4 + ipv4.HeaderLen, // unused and original datagram + }, + { + iana.ProtocolICMP, + &icmp.TimeExceeded{ + Data: make([]byte, ipv4.HeaderLen), + }, + 4 + ipv4.HeaderLen, // unused and original datagram + }, + { + iana.ProtocolICMP, + &icmp.ParamProb{ + Data: make([]byte, ipv4.HeaderLen), + }, + 4 + ipv4.HeaderLen, // [pointer, unused] and original datagram + }, + + { + iana.ProtocolICMP, + &icmp.ParamProb{ + Data: make([]byte, ipv4.HeaderLen), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{}, + }, + }, + 4 + 4 + 4 + 0 + 128, // [pointer, length, unused], extension header, object header, object payload, original datagram + }, + { + iana.ProtocolICMP, + &icmp.ParamProb{ + Data: make([]byte, 128), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{}, + }, + }, + 4 + 4 + 4 + 0 + 128, // [pointer, length, unused], extension header, object header, object payload and original datagram + }, + { + iana.ProtocolICMP, + &icmp.ParamProb{ + Data: make([]byte, 129), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{}, + }, + }, + 4 + 4 + 4 + 0 + 132, // [pointer, length, unused], extension header, object header, object payload and original datagram + }, + + { + iana.ProtocolIPv6ICMP, + &icmp.DstUnreach{ + Data: make([]byte, ipv6.HeaderLen), + }, + 4 + ipv6.HeaderLen, // unused and original datagram + }, + { + iana.ProtocolIPv6ICMP, + &icmp.PacketTooBig{ + Data: make([]byte, ipv6.HeaderLen), + }, + 4 + ipv6.HeaderLen, // mtu and original datagram + }, + { + iana.ProtocolIPv6ICMP, + &icmp.TimeExceeded{ + Data: make([]byte, ipv6.HeaderLen), + }, + 4 + ipv6.HeaderLen, // unused and original datagram + }, + { + iana.ProtocolIPv6ICMP, + &icmp.ParamProb{ + Data: make([]byte, ipv6.HeaderLen), + }, + 4 + ipv6.HeaderLen, // pointer and original datagram + }, + + { + iana.ProtocolIPv6ICMP, + &icmp.DstUnreach{ + Data: make([]byte, 127), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{}, + }, + }, + 4 + 4 + 4 + 0 + 128, // [length, unused], extension header, object header, object payload and original datagram + }, + { + iana.ProtocolIPv6ICMP, + &icmp.DstUnreach{ + Data: make([]byte, 128), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{}, + }, + }, + 4 + 4 + 4 + 0 + 128, // [length, unused], extension header, object header, object payload and original datagram + }, + { + iana.ProtocolIPv6ICMP, + &icmp.DstUnreach{ + Data: make([]byte, 129), + Extensions: []icmp.Extension{ + &icmp.MPLSLabelStack{}, + }, + }, + 4 + 4 + 4 + 0 + 136, // [length, unused], extension header, object header, object payload and original datagram + }, +} + +func TestMultipartMessageBodyLen(t *testing.T) { + for i, tt := range multipartMessageBodyLenTests { + if out := tt.in.Len(tt.proto); out != tt.out { + t.Errorf("#%d: got %d; want %d", i, out, tt.out) + } + } +} diff --git a/vendor/golang.org/x/net/icmp/packettoobig.go b/vendor/golang.org/x/net/icmp/packettoobig.go new file mode 100644 index 0000000000..a1c9df7bff --- /dev/null +++ b/vendor/golang.org/x/net/icmp/packettoobig.go @@ -0,0 +1,43 @@ +// 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 icmp + +import "encoding/binary" + +// A PacketTooBig represents an ICMP packet too big message body. +type PacketTooBig struct { + MTU int // maximum transmission unit of the nexthop link + Data []byte // data, known as original datagram field +} + +// Len implements the Len method of MessageBody interface. +func (p *PacketTooBig) Len(proto int) int { + if p == nil { + return 0 + } + return 4 + len(p.Data) +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *PacketTooBig) Marshal(proto int) ([]byte, error) { + b := make([]byte, 4+len(p.Data)) + binary.BigEndian.PutUint32(b[:4], uint32(p.MTU)) + copy(b[4:], p.Data) + return b, nil +} + +// parsePacketTooBig parses b as an ICMP packet too big message body. +func parsePacketTooBig(proto int, b []byte) (MessageBody, error) { + bodyLen := len(b) + if bodyLen < 4 { + return nil, errMessageTooShort + } + p := &PacketTooBig{MTU: int(binary.BigEndian.Uint32(b[:4]))} + if bodyLen > 4 { + p.Data = make([]byte, bodyLen-4) + copy(p.Data, b[4:]) + } + return p, nil +} diff --git a/vendor/golang.org/x/net/icmp/paramprob.go b/vendor/golang.org/x/net/icmp/paramprob.go new file mode 100644 index 0000000000..0a2548daae --- /dev/null +++ b/vendor/golang.org/x/net/icmp/paramprob.go @@ -0,0 +1,63 @@ +// 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 icmp + +import ( + "encoding/binary" + "golang.org/x/net/internal/iana" +) + +// A ParamProb represents an ICMP parameter problem message body. +type ParamProb struct { + Pointer uintptr // offset within the data where the error was detected + Data []byte // data, known as original datagram field + Extensions []Extension // extensions +} + +// Len implements the Len method of MessageBody interface. +func (p *ParamProb) Len(proto int) int { + if p == nil { + return 0 + } + l, _ := multipartMessageBodyDataLen(proto, p.Data, p.Extensions) + return 4 + l +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *ParamProb) Marshal(proto int) ([]byte, error) { + if proto == iana.ProtocolIPv6ICMP { + b := make([]byte, p.Len(proto)) + binary.BigEndian.PutUint32(b[:4], uint32(p.Pointer)) + copy(b[4:], p.Data) + return b, nil + } + b, err := marshalMultipartMessageBody(proto, p.Data, p.Extensions) + if err != nil { + return nil, err + } + b[0] = byte(p.Pointer) + return b, nil +} + +// parseParamProb parses b as an ICMP parameter problem message body. +func parseParamProb(proto int, b []byte) (MessageBody, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + p := &ParamProb{} + if proto == iana.ProtocolIPv6ICMP { + p.Pointer = uintptr(binary.BigEndian.Uint32(b[:4])) + p.Data = make([]byte, len(b)-4) + copy(p.Data, b[4:]) + return p, nil + } + p.Pointer = uintptr(b[0]) + var err error + p.Data, p.Extensions, err = parseMultipartMessageBody(proto, b) + if err != nil { + return nil, err + } + return p, nil +} diff --git a/vendor/golang.org/x/net/icmp/ping_test.go b/vendor/golang.org/x/net/icmp/ping_test.go new file mode 100644 index 0000000000..4ec269284f --- /dev/null +++ b/vendor/golang.org/x/net/icmp/ping_test.go @@ -0,0 +1,166 @@ +// 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 icmp_test + +import ( + "errors" + "fmt" + "net" + "os" + "runtime" + "testing" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" + "golang.org/x/net/ipv6" +) + +func googleAddr(c *icmp.PacketConn, protocol int) (net.Addr, error) { + const host = "www.google.com" + ips, err := net.LookupIP(host) + if err != nil { + return nil, err + } + netaddr := func(ip net.IP) (net.Addr, error) { + switch c.LocalAddr().(type) { + case *net.UDPAddr: + return &net.UDPAddr{IP: ip}, nil + case *net.IPAddr: + return &net.IPAddr{IP: ip}, nil + default: + return nil, errors.New("neither UDPAddr nor IPAddr") + } + } + for _, ip := range ips { + switch protocol { + case iana.ProtocolICMP: + if ip.To4() != nil { + return netaddr(ip) + } + case iana.ProtocolIPv6ICMP: + if ip.To16() != nil && ip.To4() == nil { + return netaddr(ip) + } + } + } + return nil, errors.New("no A or AAAA record") +} + +type pingTest struct { + network, address string + protocol int + mtype icmp.Type +} + +var nonPrivilegedPingTests = []pingTest{ + {"udp4", "0.0.0.0", iana.ProtocolICMP, ipv4.ICMPTypeEcho}, + + {"udp6", "::", iana.ProtocolIPv6ICMP, ipv6.ICMPTypeEchoRequest}, +} + +func TestNonPrivilegedPing(t *testing.T) { + if testing.Short() { + t.Skip("avoid external network") + } + switch runtime.GOOS { + case "darwin": + case "linux": + t.Log("you may need to adjust the net.ipv4.ping_group_range kernel state") + default: + t.Skipf("not supported on %s", runtime.GOOS) + } + + for i, tt := range nonPrivilegedPingTests { + if err := doPing(tt, i); err != nil { + t.Error(err) + } + } +} + +var privilegedPingTests = []pingTest{ + {"ip4:icmp", "0.0.0.0", iana.ProtocolICMP, ipv4.ICMPTypeEcho}, + + {"ip6:ipv6-icmp", "::", iana.ProtocolIPv6ICMP, ipv6.ICMPTypeEchoRequest}, +} + +func TestPrivilegedPing(t *testing.T) { + if testing.Short() { + t.Skip("avoid external network") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + for i, tt := range privilegedPingTests { + if err := doPing(tt, i); err != nil { + t.Error(err) + } + } +} + +func doPing(tt pingTest, seq int) error { + c, err := icmp.ListenPacket(tt.network, tt.address) + if err != nil { + return err + } + defer c.Close() + + dst, err := googleAddr(c, tt.protocol) + if err != nil { + return err + } + + if tt.network != "udp6" && tt.protocol == iana.ProtocolIPv6ICMP { + var f ipv6.ICMPFilter + f.SetAll(true) + f.Accept(ipv6.ICMPTypeDestinationUnreachable) + f.Accept(ipv6.ICMPTypePacketTooBig) + f.Accept(ipv6.ICMPTypeTimeExceeded) + f.Accept(ipv6.ICMPTypeParameterProblem) + f.Accept(ipv6.ICMPTypeEchoReply) + if err := c.IPv6PacketConn().SetICMPFilter(&f); err != nil { + return err + } + } + + wm := icmp.Message{ + Type: tt.mtype, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: 1 << uint(seq), + Data: []byte("HELLO-R-U-THERE"), + }, + } + wb, err := wm.Marshal(nil) + if err != nil { + return err + } + if n, err := c.WriteTo(wb, dst); err != nil { + return err + } else if n != len(wb) { + return fmt.Errorf("got %v; want %v", n, len(wb)) + } + + rb := make([]byte, 1500) + if err := c.SetReadDeadline(time.Now().Add(3 * time.Second)); err != nil { + return err + } + n, peer, err := c.ReadFrom(rb) + if err != nil { + return err + } + rm, err := icmp.ParseMessage(tt.protocol, rb[:n]) + if err != nil { + return err + } + switch rm.Type { + case ipv4.ICMPTypeEchoReply, ipv6.ICMPTypeEchoReply: + return nil + default: + return fmt.Errorf("got %+v from %v; want echo reply", rm, peer) + } +} diff --git a/vendor/golang.org/x/net/icmp/sys_freebsd.go b/vendor/golang.org/x/net/icmp/sys_freebsd.go new file mode 100644 index 0000000000..c75f3ddaa7 --- /dev/null +++ b/vendor/golang.org/x/net/icmp/sys_freebsd.go @@ -0,0 +1,11 @@ +// 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 icmp + +import "syscall" + +func init() { + freebsdVersion, _ = syscall.SysctlUint32("kern.osreldate") +} diff --git a/vendor/golang.org/x/net/icmp/timeexceeded.go b/vendor/golang.org/x/net/icmp/timeexceeded.go new file mode 100644 index 0000000000..344e15848d --- /dev/null +++ b/vendor/golang.org/x/net/icmp/timeexceeded.go @@ -0,0 +1,39 @@ +// 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 icmp + +// A TimeExceeded represents an ICMP time exceeded message body. +type TimeExceeded struct { + Data []byte // data, known as original datagram field + Extensions []Extension // extensions +} + +// Len implements the Len method of MessageBody interface. +func (p *TimeExceeded) Len(proto int) int { + if p == nil { + return 0 + } + l, _ := multipartMessageBodyDataLen(proto, p.Data, p.Extensions) + return 4 + l +} + +// Marshal implements the Marshal method of MessageBody interface. +func (p *TimeExceeded) Marshal(proto int) ([]byte, error) { + return marshalMultipartMessageBody(proto, p.Data, p.Extensions) +} + +// parseTimeExceeded parses b as an ICMP time exceeded message body. +func parseTimeExceeded(proto int, b []byte) (MessageBody, error) { + if len(b) < 4 { + return nil, errMessageTooShort + } + p := &TimeExceeded{} + var err error + p.Data, p.Extensions, err = parseMultipartMessageBody(proto, b) + if err != nil { + return nil, err + } + return p, nil +} diff --git a/vendor/golang.org/x/net/idna/idna.go b/vendor/golang.org/x/net/idna/idna.go new file mode 100644 index 0000000000..3daa8979e1 --- /dev/null +++ b/vendor/golang.org/x/net/idna/idna.go @@ -0,0 +1,68 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package idna implements IDNA2008 (Internationalized Domain Names for +// Applications), defined in RFC 5890, RFC 5891, RFC 5892, RFC 5893 and +// RFC 5894. +package idna // import "golang.org/x/net/idna" + +import ( + "strings" + "unicode/utf8" +) + +// TODO(nigeltao): specify when errors occur. For example, is ToASCII(".") or +// ToASCII("foo\x00") an error? See also http://www.unicode.org/faq/idn.html#11 + +// acePrefix is the ASCII Compatible Encoding prefix. +const acePrefix = "xn--" + +// ToASCII converts a domain or domain label to its ASCII form. For example, +// ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and +// ToASCII("golang") is "golang". +func ToASCII(s string) (string, error) { + if ascii(s) { + return s, nil + } + labels := strings.Split(s, ".") + for i, label := range labels { + if !ascii(label) { + a, err := encode(acePrefix, label) + if err != nil { + return "", err + } + labels[i] = a + } + } + return strings.Join(labels, "."), nil +} + +// ToUnicode converts a domain or domain label to its Unicode form. For example, +// ToUnicode("xn--bcher-kva.example.com") is "bücher.example.com", and +// ToUnicode("golang") is "golang". +func ToUnicode(s string) (string, error) { + if !strings.Contains(s, acePrefix) { + return s, nil + } + labels := strings.Split(s, ".") + for i, label := range labels { + if strings.HasPrefix(label, acePrefix) { + u, err := decode(label[len(acePrefix):]) + if err != nil { + return "", err + } + labels[i] = u + } + } + return strings.Join(labels, "."), nil +} + +func ascii(s string) bool { + for i := 0; i < len(s); i++ { + if s[i] >= utf8.RuneSelf { + return false + } + } + return true +} diff --git a/vendor/golang.org/x/net/idna/idna_test.go b/vendor/golang.org/x/net/idna/idna_test.go new file mode 100644 index 0000000000..b1bc6fa225 --- /dev/null +++ b/vendor/golang.org/x/net/idna/idna_test.go @@ -0,0 +1,43 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package idna + +import ( + "testing" +) + +var idnaTestCases = [...]struct { + ascii, unicode string +}{ + // Labels. + {"books", "books"}, + {"xn--bcher-kva", "bücher"}, + + // Domains. + {"foo--xn--bar.org", "foo--xn--bar.org"}, + {"golang.org", "golang.org"}, + {"example.xn--p1ai", "example.рф"}, + {"xn--czrw28b.tw", "商業.tw"}, + {"www.xn--mller-kva.de", "www.müller.de"}, +} + +func TestIDNA(t *testing.T) { + for _, tc := range idnaTestCases { + if a, err := ToASCII(tc.unicode); err != nil { + t.Errorf("ToASCII(%q): %v", tc.unicode, err) + } else if a != tc.ascii { + t.Errorf("ToASCII(%q): got %q, want %q", tc.unicode, a, tc.ascii) + } + + if u, err := ToUnicode(tc.ascii); err != nil { + t.Errorf("ToUnicode(%q): %v", tc.ascii, err) + } else if u != tc.unicode { + t.Errorf("ToUnicode(%q): got %q, want %q", tc.ascii, u, tc.unicode) + } + } +} + +// TODO(nigeltao): test errors, once we've specified when ToASCII and ToUnicode +// return errors. diff --git a/vendor/golang.org/x/net/idna/punycode.go b/vendor/golang.org/x/net/idna/punycode.go new file mode 100644 index 0000000000..92e733f6a7 --- /dev/null +++ b/vendor/golang.org/x/net/idna/punycode.go @@ -0,0 +1,200 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package idna + +// This file implements the Punycode algorithm from RFC 3492. + +import ( + "fmt" + "math" + "strings" + "unicode/utf8" +) + +// These parameter values are specified in section 5. +// +// All computation is done with int32s, so that overflow behavior is identical +// regardless of whether int is 32-bit or 64-bit. +const ( + base int32 = 36 + damp int32 = 700 + initialBias int32 = 72 + initialN int32 = 128 + skew int32 = 38 + tmax int32 = 26 + tmin int32 = 1 +) + +// decode decodes a string as specified in section 6.2. +func decode(encoded string) (string, error) { + if encoded == "" { + return "", nil + } + pos := 1 + strings.LastIndex(encoded, "-") + if pos == 1 { + return "", fmt.Errorf("idna: invalid label %q", encoded) + } + if pos == len(encoded) { + return encoded[:len(encoded)-1], nil + } + output := make([]rune, 0, len(encoded)) + if pos != 0 { + for _, r := range encoded[:pos-1] { + output = append(output, r) + } + } + i, n, bias := int32(0), initialN, initialBias + for pos < len(encoded) { + oldI, w := i, int32(1) + for k := base; ; k += base { + if pos == len(encoded) { + return "", fmt.Errorf("idna: invalid label %q", encoded) + } + digit, ok := decodeDigit(encoded[pos]) + if !ok { + return "", fmt.Errorf("idna: invalid label %q", encoded) + } + pos++ + i += digit * w + if i < 0 { + return "", fmt.Errorf("idna: invalid label %q", encoded) + } + t := k - bias + if t < tmin { + t = tmin + } else if t > tmax { + t = tmax + } + if digit < t { + break + } + w *= base - t + if w >= math.MaxInt32/base { + return "", fmt.Errorf("idna: invalid label %q", encoded) + } + } + x := int32(len(output) + 1) + bias = adapt(i-oldI, x, oldI == 0) + n += i / x + i %= x + if n > utf8.MaxRune || len(output) >= 1024 { + return "", fmt.Errorf("idna: invalid label %q", encoded) + } + output = append(output, 0) + copy(output[i+1:], output[i:]) + output[i] = n + i++ + } + return string(output), nil +} + +// encode encodes a string as specified in section 6.3 and prepends prefix to +// the result. +// +// The "while h < length(input)" line in the specification becomes "for +// remaining != 0" in the Go code, because len(s) in Go is in bytes, not runes. +func encode(prefix, s string) (string, error) { + output := make([]byte, len(prefix), len(prefix)+1+2*len(s)) + copy(output, prefix) + delta, n, bias := int32(0), initialN, initialBias + b, remaining := int32(0), int32(0) + for _, r := range s { + if r < 0x80 { + b++ + output = append(output, byte(r)) + } else { + remaining++ + } + } + h := b + if b > 0 { + output = append(output, '-') + } + for remaining != 0 { + m := int32(0x7fffffff) + for _, r := range s { + if m > r && r >= n { + m = r + } + } + delta += (m - n) * (h + 1) + if delta < 0 { + return "", fmt.Errorf("idna: invalid label %q", s) + } + n = m + for _, r := range s { + if r < n { + delta++ + if delta < 0 { + return "", fmt.Errorf("idna: invalid label %q", s) + } + continue + } + if r > n { + continue + } + q := delta + for k := base; ; k += base { + t := k - bias + if t < tmin { + t = tmin + } else if t > tmax { + t = tmax + } + if q < t { + break + } + output = append(output, encodeDigit(t+(q-t)%(base-t))) + q = (q - t) / (base - t) + } + output = append(output, encodeDigit(q)) + bias = adapt(delta, h+1, h == b) + delta = 0 + h++ + remaining-- + } + delta++ + n++ + } + return string(output), nil +} + +func decodeDigit(x byte) (digit int32, ok bool) { + switch { + case '0' <= x && x <= '9': + return int32(x - ('0' - 26)), true + case 'A' <= x && x <= 'Z': + return int32(x - 'A'), true + case 'a' <= x && x <= 'z': + return int32(x - 'a'), true + } + return 0, false +} + +func encodeDigit(digit int32) byte { + switch { + case 0 <= digit && digit < 26: + return byte(digit + 'a') + case 26 <= digit && digit < 36: + return byte(digit + ('0' - 26)) + } + panic("idna: internal error in punycode encoding") +} + +// adapt is the bias adaptation function specified in section 6.1. +func adapt(delta, numPoints int32, firstTime bool) int32 { + if firstTime { + delta /= damp + } else { + delta /= 2 + } + delta += delta / numPoints + k := int32(0) + for delta > ((base-tmin)*tmax)/2 { + delta /= base - tmin + k += base + } + return k + (base-tmin+1)*delta/(delta+skew) +} diff --git a/vendor/golang.org/x/net/idna/punycode_test.go b/vendor/golang.org/x/net/idna/punycode_test.go new file mode 100644 index 0000000000..bfec81decd --- /dev/null +++ b/vendor/golang.org/x/net/idna/punycode_test.go @@ -0,0 +1,198 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package idna + +import ( + "strings" + "testing" +) + +var punycodeTestCases = [...]struct { + s, encoded string +}{ + {"", ""}, + {"-", "--"}, + {"-a", "-a-"}, + {"-a-", "-a--"}, + {"a", "a-"}, + {"a-", "a--"}, + {"a-b", "a-b-"}, + {"books", "books-"}, + {"bücher", "bcher-kva"}, + {"Hello世界", "Hello-ck1hg65u"}, + {"ü", "tda"}, + {"üý", "tdac"}, + + // The test cases below come from RFC 3492 section 7.1 with Errata 3026. + { + // (A) Arabic (Egyptian). + "\u0644\u064A\u0647\u0645\u0627\u0628\u062A\u0643\u0644" + + "\u0645\u0648\u0634\u0639\u0631\u0628\u064A\u061F", + "egbpdaj6bu4bxfgehfvwxn", + }, + { + // (B) Chinese (simplified). + "\u4ED6\u4EEC\u4E3A\u4EC0\u4E48\u4E0D\u8BF4\u4E2D\u6587", + "ihqwcrb4cv8a8dqg056pqjye", + }, + { + // (C) Chinese (traditional). + "\u4ED6\u5011\u7232\u4EC0\u9EBD\u4E0D\u8AAA\u4E2D\u6587", + "ihqwctvzc91f659drss3x8bo0yb", + }, + { + // (D) Czech. + "\u0050\u0072\u006F\u010D\u0070\u0072\u006F\u0073\u0074" + + "\u011B\u006E\u0065\u006D\u006C\u0075\u0076\u00ED\u010D" + + "\u0065\u0073\u006B\u0079", + "Proprostnemluvesky-uyb24dma41a", + }, + { + // (E) Hebrew. + "\u05DC\u05DE\u05D4\u05D4\u05DD\u05E4\u05E9\u05D5\u05D8" + + "\u05DC\u05D0\u05DE\u05D3\u05D1\u05E8\u05D9\u05DD\u05E2" + + "\u05D1\u05E8\u05D9\u05EA", + "4dbcagdahymbxekheh6e0a7fei0b", + }, + { + // (F) Hindi (Devanagari). + "\u092F\u0939\u0932\u094B\u0917\u0939\u093F\u0928\u094D" + + "\u0926\u0940\u0915\u094D\u092F\u094B\u0902\u0928\u0939" + + "\u0940\u0902\u092C\u094B\u0932\u0938\u0915\u0924\u0947" + + "\u0939\u0948\u0902", + "i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd", + }, + { + // (G) Japanese (kanji and hiragana). + "\u306A\u305C\u307F\u3093\u306A\u65E5\u672C\u8A9E\u3092" + + "\u8A71\u3057\u3066\u304F\u308C\u306A\u3044\u306E\u304B", + "n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa", + }, + { + // (H) Korean (Hangul syllables). + "\uC138\uACC4\uC758\uBAA8\uB4E0\uC0AC\uB78C\uB4E4\uC774" + + "\uD55C\uAD6D\uC5B4\uB97C\uC774\uD574\uD55C\uB2E4\uBA74" + + "\uC5BC\uB9C8\uB098\uC88B\uC744\uAE4C", + "989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5j" + + "psd879ccm6fea98c", + }, + { + // (I) Russian (Cyrillic). + "\u043F\u043E\u0447\u0435\u043C\u0443\u0436\u0435\u043E" + + "\u043D\u0438\u043D\u0435\u0433\u043E\u0432\u043E\u0440" + + "\u044F\u0442\u043F\u043E\u0440\u0443\u0441\u0441\u043A" + + "\u0438", + "b1abfaaepdrnnbgefbadotcwatmq2g4l", + }, + { + // (J) Spanish. + "\u0050\u006F\u0072\u0071\u0075\u00E9\u006E\u006F\u0070" + + "\u0075\u0065\u0064\u0065\u006E\u0073\u0069\u006D\u0070" + + "\u006C\u0065\u006D\u0065\u006E\u0074\u0065\u0068\u0061" + + "\u0062\u006C\u0061\u0072\u0065\u006E\u0045\u0073\u0070" + + "\u0061\u00F1\u006F\u006C", + "PorqunopuedensimplementehablarenEspaol-fmd56a", + }, + { + // (K) Vietnamese. + "\u0054\u1EA1\u0069\u0073\u0061\u006F\u0068\u1ECD\u006B" + + "\u0068\u00F4\u006E\u0067\u0074\u0068\u1EC3\u0063\u0068" + + "\u1EC9\u006E\u00F3\u0069\u0074\u0069\u1EBF\u006E\u0067" + + "\u0056\u0069\u1EC7\u0074", + "TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g", + }, + { + // (L) 3B. + "\u0033\u5E74\u0042\u7D44\u91D1\u516B\u5148\u751F", + "3B-ww4c5e180e575a65lsy2b", + }, + { + // (M) -with-SUPER-MONKEYS. + "\u5B89\u5BA4\u5948\u7F8E\u6075\u002D\u0077\u0069\u0074" + + "\u0068\u002D\u0053\u0055\u0050\u0045\u0052\u002D\u004D" + + "\u004F\u004E\u004B\u0045\u0059\u0053", + "-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n", + }, + { + // (N) Hello-Another-Way-. + "\u0048\u0065\u006C\u006C\u006F\u002D\u0041\u006E\u006F" + + "\u0074\u0068\u0065\u0072\u002D\u0057\u0061\u0079\u002D" + + "\u305D\u308C\u305E\u308C\u306E\u5834\u6240", + "Hello-Another-Way--fc4qua05auwb3674vfr0b", + }, + { + // (O) 2. + "\u3072\u3068\u3064\u5C4B\u6839\u306E\u4E0B\u0032", + "2-u9tlzr9756bt3uc0v", + }, + { + // (P) MajiKoi5 + "\u004D\u0061\u006A\u0069\u3067\u004B\u006F\u0069\u3059" + + "\u308B\u0035\u79D2\u524D", + "MajiKoi5-783gue6qz075azm5e", + }, + { + // (Q) de + "\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", + "de-jg4avhby1noc0d", + }, + { + // (R) + "\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067", + "d9juau41awczczp", + }, + { + // (S) -> $1.00 <- + "\u002D\u003E\u0020\u0024\u0031\u002E\u0030\u0030\u0020" + + "\u003C\u002D", + "-> $1.00 <--", + }, +} + +func TestPunycode(t *testing.T) { + for _, tc := range punycodeTestCases { + if got, err := decode(tc.encoded); err != nil { + t.Errorf("decode(%q): %v", tc.encoded, err) + } else if got != tc.s { + t.Errorf("decode(%q): got %q, want %q", tc.encoded, got, tc.s) + } + + if got, err := encode("", tc.s); err != nil { + t.Errorf(`encode("", %q): %v`, tc.s, err) + } else if got != tc.encoded { + t.Errorf(`encode("", %q): got %q, want %q`, tc.s, got, tc.encoded) + } + } +} + +var punycodeErrorTestCases = [...]string{ + "decode -", // A sole '-' is invalid. + "decode foo\x00bar", // '\x00' is not in [0-9A-Za-z]. + "decode foo#bar", // '#' is not in [0-9A-Za-z]. + "decode foo\u00A3bar", // '\u00A3' is not in [0-9A-Za-z]. + "decode 9", // "9a" decodes to codepoint \u00A3; "9" is truncated. + "decode 99999a", // "99999a" decodes to codepoint \U0048A3C1, which is > \U0010FFFF. + "decode 9999999999a", // "9999999999a" overflows the int32 calculation. + + "encode " + strings.Repeat("x", 65536) + "\uff00", // int32 overflow. +} + +func TestPunycodeErrors(t *testing.T) { + for _, tc := range punycodeErrorTestCases { + var err error + switch { + case strings.HasPrefix(tc, "decode "): + _, err = decode(tc[7:]) + case strings.HasPrefix(tc, "encode "): + _, err = encode("", tc[7:]) + } + if err == nil { + if len(tc) > 256 { + tc = tc[:100] + "..." + tc[len(tc)-100:] + } + t.Errorf("no error for %s", tc) + } + } +} diff --git a/vendor/golang.org/x/net/internal/iana/const.go b/vendor/golang.org/x/net/internal/iana/const.go new file mode 100644 index 0000000000..3438a27c8d --- /dev/null +++ b/vendor/golang.org/x/net/internal/iana/const.go @@ -0,0 +1,180 @@ +// go generate gen.go +// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// Package iana provides protocol number resources managed by the Internet Assigned Numbers Authority (IANA). +package iana // import "golang.org/x/net/internal/iana" + +// Differentiated Services Field Codepoints (DSCP), Updated: 2013-06-25 +const ( + DiffServCS0 = 0x0 // CS0 + DiffServCS1 = 0x20 // CS1 + DiffServCS2 = 0x40 // CS2 + DiffServCS3 = 0x60 // CS3 + DiffServCS4 = 0x80 // CS4 + DiffServCS5 = 0xa0 // CS5 + DiffServCS6 = 0xc0 // CS6 + DiffServCS7 = 0xe0 // CS7 + DiffServAF11 = 0x28 // AF11 + DiffServAF12 = 0x30 // AF12 + DiffServAF13 = 0x38 // AF13 + DiffServAF21 = 0x48 // AF21 + DiffServAF22 = 0x50 // AF22 + DiffServAF23 = 0x58 // AF23 + DiffServAF31 = 0x68 // AF31 + DiffServAF32 = 0x70 // AF32 + DiffServAF33 = 0x78 // AF33 + DiffServAF41 = 0x88 // AF41 + DiffServAF42 = 0x90 // AF42 + DiffServAF43 = 0x98 // AF43 + DiffServEFPHB = 0xb8 // EF PHB + DiffServVOICEADMIT = 0xb0 // VOICE-ADMIT +) + +// IPv4 TOS Byte and IPv6 Traffic Class Octet, Updated: 2001-09-06 +const ( + NotECNTransport = 0x0 // Not-ECT (Not ECN-Capable Transport) + ECNTransport1 = 0x1 // ECT(1) (ECN-Capable Transport(1)) + ECNTransport0 = 0x2 // ECT(0) (ECN-Capable Transport(0)) + CongestionExperienced = 0x3 // CE (Congestion Experienced) +) + +// Protocol Numbers, Updated: 2015-10-06 +const ( + ProtocolIP = 0 // IPv4 encapsulation, pseudo protocol number + ProtocolHOPOPT = 0 // IPv6 Hop-by-Hop Option + ProtocolICMP = 1 // Internet Control Message + ProtocolIGMP = 2 // Internet Group Management + ProtocolGGP = 3 // Gateway-to-Gateway + ProtocolIPv4 = 4 // IPv4 encapsulation + ProtocolST = 5 // Stream + ProtocolTCP = 6 // Transmission Control + ProtocolCBT = 7 // CBT + ProtocolEGP = 8 // Exterior Gateway Protocol + ProtocolIGP = 9 // any private interior gateway (used by Cisco for their IGRP) + ProtocolBBNRCCMON = 10 // BBN RCC Monitoring + ProtocolNVPII = 11 // Network Voice Protocol + ProtocolPUP = 12 // PUP + ProtocolEMCON = 14 // EMCON + ProtocolXNET = 15 // Cross Net Debugger + ProtocolCHAOS = 16 // Chaos + ProtocolUDP = 17 // User Datagram + ProtocolMUX = 18 // Multiplexing + ProtocolDCNMEAS = 19 // DCN Measurement Subsystems + ProtocolHMP = 20 // Host Monitoring + ProtocolPRM = 21 // Packet Radio Measurement + ProtocolXNSIDP = 22 // XEROX NS IDP + ProtocolTRUNK1 = 23 // Trunk-1 + ProtocolTRUNK2 = 24 // Trunk-2 + ProtocolLEAF1 = 25 // Leaf-1 + ProtocolLEAF2 = 26 // Leaf-2 + ProtocolRDP = 27 // Reliable Data Protocol + ProtocolIRTP = 28 // Internet Reliable Transaction + ProtocolISOTP4 = 29 // ISO Transport Protocol Class 4 + ProtocolNETBLT = 30 // Bulk Data Transfer Protocol + ProtocolMFENSP = 31 // MFE Network Services Protocol + ProtocolMERITINP = 32 // MERIT Internodal Protocol + ProtocolDCCP = 33 // Datagram Congestion Control Protocol + Protocol3PC = 34 // Third Party Connect Protocol + ProtocolIDPR = 35 // Inter-Domain Policy Routing Protocol + ProtocolXTP = 36 // XTP + ProtocolDDP = 37 // Datagram Delivery Protocol + ProtocolIDPRCMTP = 38 // IDPR Control Message Transport Proto + ProtocolTPPP = 39 // TP++ Transport Protocol + ProtocolIL = 40 // IL Transport Protocol + ProtocolIPv6 = 41 // IPv6 encapsulation + ProtocolSDRP = 42 // Source Demand Routing Protocol + ProtocolIPv6Route = 43 // Routing Header for IPv6 + ProtocolIPv6Frag = 44 // Fragment Header for IPv6 + ProtocolIDRP = 45 // Inter-Domain Routing Protocol + ProtocolRSVP = 46 // Reservation Protocol + ProtocolGRE = 47 // Generic Routing Encapsulation + ProtocolDSR = 48 // Dynamic Source Routing Protocol + ProtocolBNA = 49 // BNA + ProtocolESP = 50 // Encap Security Payload + ProtocolAH = 51 // Authentication Header + ProtocolINLSP = 52 // Integrated Net Layer Security TUBA + ProtocolNARP = 54 // NBMA Address Resolution Protocol + ProtocolMOBILE = 55 // IP Mobility + ProtocolTLSP = 56 // Transport Layer Security Protocol using Kryptonet key management + ProtocolSKIP = 57 // SKIP + ProtocolIPv6ICMP = 58 // ICMP for IPv6 + ProtocolIPv6NoNxt = 59 // No Next Header for IPv6 + ProtocolIPv6Opts = 60 // Destination Options for IPv6 + ProtocolCFTP = 62 // CFTP + ProtocolSATEXPAK = 64 // SATNET and Backroom EXPAK + ProtocolKRYPTOLAN = 65 // Kryptolan + ProtocolRVD = 66 // MIT Remote Virtual Disk Protocol + ProtocolIPPC = 67 // Internet Pluribus Packet Core + ProtocolSATMON = 69 // SATNET Monitoring + ProtocolVISA = 70 // VISA Protocol + ProtocolIPCV = 71 // Internet Packet Core Utility + ProtocolCPNX = 72 // Computer Protocol Network Executive + ProtocolCPHB = 73 // Computer Protocol Heart Beat + ProtocolWSN = 74 // Wang Span Network + ProtocolPVP = 75 // Packet Video Protocol + ProtocolBRSATMON = 76 // Backroom SATNET Monitoring + ProtocolSUNND = 77 // SUN ND PROTOCOL-Temporary + ProtocolWBMON = 78 // WIDEBAND Monitoring + ProtocolWBEXPAK = 79 // WIDEBAND EXPAK + ProtocolISOIP = 80 // ISO Internet Protocol + ProtocolVMTP = 81 // VMTP + ProtocolSECUREVMTP = 82 // SECURE-VMTP + ProtocolVINES = 83 // VINES + ProtocolTTP = 84 // Transaction Transport Protocol + ProtocolIPTM = 84 // Internet Protocol Traffic Manager + ProtocolNSFNETIGP = 85 // NSFNET-IGP + ProtocolDGP = 86 // Dissimilar Gateway Protocol + ProtocolTCF = 87 // TCF + ProtocolEIGRP = 88 // EIGRP + ProtocolOSPFIGP = 89 // OSPFIGP + ProtocolSpriteRPC = 90 // Sprite RPC Protocol + ProtocolLARP = 91 // Locus Address Resolution Protocol + ProtocolMTP = 92 // Multicast Transport Protocol + ProtocolAX25 = 93 // AX.25 Frames + ProtocolIPIP = 94 // IP-within-IP Encapsulation Protocol + ProtocolSCCSP = 96 // Semaphore Communications Sec. Pro. + ProtocolETHERIP = 97 // Ethernet-within-IP Encapsulation + ProtocolENCAP = 98 // Encapsulation Header + ProtocolGMTP = 100 // GMTP + ProtocolIFMP = 101 // Ipsilon Flow Management Protocol + ProtocolPNNI = 102 // PNNI over IP + ProtocolPIM = 103 // Protocol Independent Multicast + ProtocolARIS = 104 // ARIS + ProtocolSCPS = 105 // SCPS + ProtocolQNX = 106 // QNX + ProtocolAN = 107 // Active Networks + ProtocolIPComp = 108 // IP Payload Compression Protocol + ProtocolSNP = 109 // Sitara Networks Protocol + ProtocolCompaqPeer = 110 // Compaq Peer Protocol + ProtocolIPXinIP = 111 // IPX in IP + ProtocolVRRP = 112 // Virtual Router Redundancy Protocol + ProtocolPGM = 113 // PGM Reliable Transport Protocol + ProtocolL2TP = 115 // Layer Two Tunneling Protocol + ProtocolDDX = 116 // D-II Data Exchange (DDX) + ProtocolIATP = 117 // Interactive Agent Transfer Protocol + ProtocolSTP = 118 // Schedule Transfer Protocol + ProtocolSRP = 119 // SpectraLink Radio Protocol + ProtocolUTI = 120 // UTI + ProtocolSMP = 121 // Simple Message Protocol + ProtocolPTP = 123 // Performance Transparency Protocol + ProtocolISIS = 124 // ISIS over IPv4 + ProtocolFIRE = 125 // FIRE + ProtocolCRTP = 126 // Combat Radio Transport Protocol + ProtocolCRUDP = 127 // Combat Radio User Datagram + ProtocolSSCOPMCE = 128 // SSCOPMCE + ProtocolIPLT = 129 // IPLT + ProtocolSPS = 130 // Secure Packet Shield + ProtocolPIPE = 131 // Private IP Encapsulation within IP + ProtocolSCTP = 132 // Stream Control Transmission Protocol + ProtocolFC = 133 // Fibre Channel + ProtocolRSVPE2EIGNORE = 134 // RSVP-E2E-IGNORE + ProtocolMobilityHeader = 135 // Mobility Header + ProtocolUDPLite = 136 // UDPLite + ProtocolMPLSinIP = 137 // MPLS-in-IP + ProtocolMANET = 138 // MANET Protocols + ProtocolHIP = 139 // Host Identity Protocol + ProtocolShim6 = 140 // Shim6 Protocol + ProtocolWESP = 141 // Wrapped Encapsulating Security Payload + ProtocolROHC = 142 // Robust Header Compression + ProtocolReserved = 255 // Reserved +) diff --git a/vendor/golang.org/x/net/internal/iana/gen.go b/vendor/golang.org/x/net/internal/iana/gen.go new file mode 100644 index 0000000000..2d8c07ca1b --- /dev/null +++ b/vendor/golang.org/x/net/internal/iana/gen.go @@ -0,0 +1,293 @@ +// Copyright 2013 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 + +//go:generate go run gen.go + +// This program generates internet protocol constants and tables by +// reading IANA protocol registries. +package main + +import ( + "bytes" + "encoding/xml" + "fmt" + "go/format" + "io" + "io/ioutil" + "net/http" + "os" + "strconv" + "strings" +) + +var registries = []struct { + url string + parse func(io.Writer, io.Reader) error +}{ + { + "http://www.iana.org/assignments/dscp-registry/dscp-registry.xml", + parseDSCPRegistry, + }, + { + "http://www.iana.org/assignments/ipv4-tos-byte/ipv4-tos-byte.xml", + parseTOSTCByte, + }, + { + "http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml", + parseProtocolNumbers, + }, +} + +func main() { + var bb bytes.Buffer + fmt.Fprintf(&bb, "// go generate gen.go\n") + fmt.Fprintf(&bb, "// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n") + fmt.Fprintf(&bb, "// Package iana provides protocol number resources managed by the Internet Assigned Numbers Authority (IANA).\n") + fmt.Fprintf(&bb, `package iana // import "golang.org/x/net/internal/iana"`+"\n\n") + for _, r := range registries { + resp, err := http.Get(r.url) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + fmt.Fprintf(os.Stderr, "got HTTP status code %v for %v\n", resp.StatusCode, r.url) + os.Exit(1) + } + if err := r.parse(&bb, resp.Body); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + fmt.Fprintf(&bb, "\n") + } + b, err := format.Source(bb.Bytes()) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + if err := ioutil.WriteFile("const.go", b, 0644); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func parseDSCPRegistry(w io.Writer, r io.Reader) error { + dec := xml.NewDecoder(r) + var dr dscpRegistry + if err := dec.Decode(&dr); err != nil { + return err + } + drs := dr.escape() + fmt.Fprintf(w, "// %s, Updated: %s\n", dr.Title, dr.Updated) + fmt.Fprintf(w, "const (\n") + for _, dr := range drs { + fmt.Fprintf(w, "DiffServ%s = %#x", dr.Name, dr.Value) + fmt.Fprintf(w, "// %s\n", dr.OrigName) + } + fmt.Fprintf(w, ")\n") + return nil +} + +type dscpRegistry struct { + XMLName xml.Name `xml:"registry"` + Title string `xml:"title"` + Updated string `xml:"updated"` + Note string `xml:"note"` + RegTitle string `xml:"registry>title"` + PoolRecords []struct { + Name string `xml:"name"` + Space string `xml:"space"` + } `xml:"registry>record"` + Records []struct { + Name string `xml:"name"` + Space string `xml:"space"` + } `xml:"registry>registry>record"` +} + +type canonDSCPRecord struct { + OrigName string + Name string + Value int +} + +func (drr *dscpRegistry) escape() []canonDSCPRecord { + drs := make([]canonDSCPRecord, len(drr.Records)) + sr := strings.NewReplacer( + "+", "", + "-", "", + "/", "", + ".", "", + " ", "", + ) + for i, dr := range drr.Records { + s := strings.TrimSpace(dr.Name) + drs[i].OrigName = s + drs[i].Name = sr.Replace(s) + n, err := strconv.ParseUint(dr.Space, 2, 8) + if err != nil { + continue + } + drs[i].Value = int(n) << 2 + } + return drs +} + +func parseTOSTCByte(w io.Writer, r io.Reader) error { + dec := xml.NewDecoder(r) + var ttb tosTCByte + if err := dec.Decode(&ttb); err != nil { + return err + } + trs := ttb.escape() + fmt.Fprintf(w, "// %s, Updated: %s\n", ttb.Title, ttb.Updated) + fmt.Fprintf(w, "const (\n") + for _, tr := range trs { + fmt.Fprintf(w, "%s = %#x", tr.Keyword, tr.Value) + fmt.Fprintf(w, "// %s\n", tr.OrigKeyword) + } + fmt.Fprintf(w, ")\n") + return nil +} + +type tosTCByte struct { + XMLName xml.Name `xml:"registry"` + Title string `xml:"title"` + Updated string `xml:"updated"` + Note string `xml:"note"` + RegTitle string `xml:"registry>title"` + Records []struct { + Binary string `xml:"binary"` + Keyword string `xml:"keyword"` + } `xml:"registry>record"` +} + +type canonTOSTCByteRecord struct { + OrigKeyword string + Keyword string + Value int +} + +func (ttb *tosTCByte) escape() []canonTOSTCByteRecord { + trs := make([]canonTOSTCByteRecord, len(ttb.Records)) + sr := strings.NewReplacer( + "Capable", "", + "(", "", + ")", "", + "+", "", + "-", "", + "/", "", + ".", "", + " ", "", + ) + for i, tr := range ttb.Records { + s := strings.TrimSpace(tr.Keyword) + trs[i].OrigKeyword = s + ss := strings.Split(s, " ") + if len(ss) > 1 { + trs[i].Keyword = strings.Join(ss[1:], " ") + } else { + trs[i].Keyword = ss[0] + } + trs[i].Keyword = sr.Replace(trs[i].Keyword) + n, err := strconv.ParseUint(tr.Binary, 2, 8) + if err != nil { + continue + } + trs[i].Value = int(n) + } + return trs +} + +func parseProtocolNumbers(w io.Writer, r io.Reader) error { + dec := xml.NewDecoder(r) + var pn protocolNumbers + if err := dec.Decode(&pn); err != nil { + return err + } + prs := pn.escape() + prs = append([]canonProtocolRecord{{ + Name: "IP", + Descr: "IPv4 encapsulation, pseudo protocol number", + Value: 0, + }}, prs...) + fmt.Fprintf(w, "// %s, Updated: %s\n", pn.Title, pn.Updated) + fmt.Fprintf(w, "const (\n") + for _, pr := range prs { + if pr.Name == "" { + continue + } + fmt.Fprintf(w, "Protocol%s = %d", pr.Name, pr.Value) + s := pr.Descr + if s == "" { + s = pr.OrigName + } + fmt.Fprintf(w, "// %s\n", s) + } + fmt.Fprintf(w, ")\n") + return nil +} + +type protocolNumbers struct { + XMLName xml.Name `xml:"registry"` + Title string `xml:"title"` + Updated string `xml:"updated"` + RegTitle string `xml:"registry>title"` + Note string `xml:"registry>note"` + Records []struct { + Value string `xml:"value"` + Name string `xml:"name"` + Descr string `xml:"description"` + } `xml:"registry>record"` +} + +type canonProtocolRecord struct { + OrigName string + Name string + Descr string + Value int +} + +func (pn *protocolNumbers) escape() []canonProtocolRecord { + prs := make([]canonProtocolRecord, len(pn.Records)) + sr := strings.NewReplacer( + "-in-", "in", + "-within-", "within", + "-over-", "over", + "+", "P", + "-", "", + "/", "", + ".", "", + " ", "", + ) + for i, pr := range pn.Records { + if strings.Contains(pr.Name, "Deprecated") || + strings.Contains(pr.Name, "deprecated") { + continue + } + prs[i].OrigName = pr.Name + s := strings.TrimSpace(pr.Name) + switch pr.Name { + case "ISIS over IPv4": + prs[i].Name = "ISIS" + case "manet": + prs[i].Name = "MANET" + default: + prs[i].Name = sr.Replace(s) + } + ss := strings.Split(pr.Descr, "\n") + for i := range ss { + ss[i] = strings.TrimSpace(ss[i]) + } + if len(ss) > 1 { + prs[i].Descr = strings.Join(ss, " ") + } else { + prs[i].Descr = ss[0] + } + prs[i].Value, _ = strconv.Atoi(pr.Value) + } + return prs +} diff --git a/vendor/golang.org/x/net/internal/nettest/error_posix.go b/vendor/golang.org/x/net/internal/nettest/error_posix.go new file mode 100644 index 0000000000..963ed99655 --- /dev/null +++ b/vendor/golang.org/x/net/internal/nettest/error_posix.go @@ -0,0 +1,31 @@ +// 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 darwin dragonfly freebsd linux netbsd openbsd solaris windows + +package nettest + +import ( + "os" + "syscall" +) + +func protocolNotSupported(err error) bool { + switch err := err.(type) { + case syscall.Errno: + switch err { + case syscall.EPROTONOSUPPORT, syscall.ENOPROTOOPT: + return true + } + case *os.SyscallError: + switch err := err.Err.(type) { + case syscall.Errno: + switch err { + case syscall.EPROTONOSUPPORT, syscall.ENOPROTOOPT: + return true + } + } + } + return false +} diff --git a/vendor/golang.org/x/net/internal/nettest/error_stub.go b/vendor/golang.org/x/net/internal/nettest/error_stub.go new file mode 100644 index 0000000000..3c74d812f6 --- /dev/null +++ b/vendor/golang.org/x/net/internal/nettest/error_stub.go @@ -0,0 +1,11 @@ +// 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 nacl plan9 + +package nettest + +func protocolNotSupported(err error) bool { + return false +} diff --git a/vendor/golang.org/x/net/internal/nettest/interface.go b/vendor/golang.org/x/net/internal/nettest/interface.go new file mode 100644 index 0000000000..53ae13a987 --- /dev/null +++ b/vendor/golang.org/x/net/internal/nettest/interface.go @@ -0,0 +1,94 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package nettest + +import "net" + +// IsMulticastCapable reports whether ifi is an IP multicast-capable +// network interface. Network must be "ip", "ip4" or "ip6". +func IsMulticastCapable(network string, ifi *net.Interface) (net.IP, bool) { + switch network { + case "ip", "ip4", "ip6": + default: + return nil, false + } + if ifi == nil || ifi.Flags&net.FlagUp == 0 || ifi.Flags&net.FlagMulticast == 0 { + return nil, false + } + return hasRoutableIP(network, ifi) +} + +// RoutedInterface returns a network interface that can route IP +// traffic and satisfies flags. It returns nil when an appropriate +// network interface is not found. Network must be "ip", "ip4" or +// "ip6". +func RoutedInterface(network string, flags net.Flags) *net.Interface { + switch network { + case "ip", "ip4", "ip6": + default: + return nil + } + ift, err := net.Interfaces() + if err != nil { + return nil + } + for _, ifi := range ift { + if ifi.Flags&flags != flags { + continue + } + if _, ok := hasRoutableIP(network, &ifi); !ok { + continue + } + return &ifi + } + return nil +} + +func hasRoutableIP(network string, ifi *net.Interface) (net.IP, bool) { + ifat, err := ifi.Addrs() + if err != nil { + return nil, false + } + for _, ifa := range ifat { + switch ifa := ifa.(type) { + case *net.IPAddr: + if ip := routableIP(network, ifa.IP); ip != nil { + return ip, true + } + case *net.IPNet: + if ip := routableIP(network, ifa.IP); ip != nil { + return ip, true + } + } + } + return nil, false +} + +func routableIP(network string, ip net.IP) net.IP { + if !ip.IsLoopback() && !ip.IsLinkLocalUnicast() && !ip.IsGlobalUnicast() { + return nil + } + switch network { + case "ip4": + if ip := ip.To4(); ip != nil { + return ip + } + case "ip6": + if ip.IsLoopback() { // addressing scope of the loopback address depends on each implementation + return nil + } + if ip := ip.To16(); ip != nil && ip.To4() == nil { + return ip + } + default: + if ip := ip.To4(); ip != nil { + return ip + } + if ip := ip.To16(); ip != nil { + return ip + } + } + return nil +} diff --git a/vendor/golang.org/x/net/internal/nettest/rlimit.go b/vendor/golang.org/x/net/internal/nettest/rlimit.go new file mode 100644 index 0000000000..bb34aec0bb --- /dev/null +++ b/vendor/golang.org/x/net/internal/nettest/rlimit.go @@ -0,0 +1,11 @@ +// 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 nettest + +const defaultMaxOpenFiles = 256 + +// MaxOpenFiles returns the maximum number of open files for the +// caller's process. +func MaxOpenFiles() int { return maxOpenFiles() } diff --git a/vendor/golang.org/x/net/internal/nettest/rlimit_stub.go b/vendor/golang.org/x/net/internal/nettest/rlimit_stub.go new file mode 100644 index 0000000000..102bef9309 --- /dev/null +++ b/vendor/golang.org/x/net/internal/nettest/rlimit_stub.go @@ -0,0 +1,9 @@ +// 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 nacl plan9 + +package nettest + +func maxOpenFiles() int { return defaultMaxOpenFiles } diff --git a/vendor/golang.org/x/net/internal/nettest/rlimit_unix.go b/vendor/golang.org/x/net/internal/nettest/rlimit_unix.go new file mode 100644 index 0000000000..eb4312ce38 --- /dev/null +++ b/vendor/golang.org/x/net/internal/nettest/rlimit_unix.go @@ -0,0 +1,17 @@ +// 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 darwin dragonfly freebsd linux netbsd openbsd solaris + +package nettest + +import "syscall" + +func maxOpenFiles() int { + var rlim syscall.Rlimit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlim); err != nil { + return defaultMaxOpenFiles + } + return int(rlim.Cur) +} diff --git a/vendor/golang.org/x/net/internal/nettest/rlimit_windows.go b/vendor/golang.org/x/net/internal/nettest/rlimit_windows.go new file mode 100644 index 0000000000..de927b56e0 --- /dev/null +++ b/vendor/golang.org/x/net/internal/nettest/rlimit_windows.go @@ -0,0 +1,7 @@ +// 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 nettest + +func maxOpenFiles() int { return 4 * defaultMaxOpenFiles /* actually it's 16581375 */ } diff --git a/vendor/golang.org/x/net/internal/nettest/stack.go b/vendor/golang.org/x/net/internal/nettest/stack.go new file mode 100644 index 0000000000..e07c015f3f --- /dev/null +++ b/vendor/golang.org/x/net/internal/nettest/stack.go @@ -0,0 +1,36 @@ +// 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 nettest provides utilities for IP testing. +package nettest // import "golang.org/x/net/internal/nettest" + +import "net" + +// SupportsIPv4 reports whether the platform supports IPv4 networking +// functionality. +func SupportsIPv4() bool { + ln, err := net.Listen("tcp4", "127.0.0.1:0") + if err != nil { + return false + } + ln.Close() + return true +} + +// SupportsIPv6 reports whether the platform supports IPv6 networking +// functionality. +func SupportsIPv6() bool { + ln, err := net.Listen("tcp6", "[::1]:0") + if err != nil { + return false + } + ln.Close() + return true +} + +// ProtocolNotSupported reports whether err is a protocol not +// supported error. +func ProtocolNotSupported(err error) bool { + return protocolNotSupported(err) +} diff --git a/vendor/golang.org/x/net/internal/nettest/stack_stub.go b/vendor/golang.org/x/net/internal/nettest/stack_stub.go new file mode 100644 index 0000000000..1b5fde1a38 --- /dev/null +++ b/vendor/golang.org/x/net/internal/nettest/stack_stub.go @@ -0,0 +1,18 @@ +// 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 nacl plan9 + +package nettest + +import ( + "fmt" + "runtime" +) + +// SupportsRawIPSocket reports whether the platform supports raw IP +// sockets. +func SupportsRawIPSocket() (string, bool) { + return fmt.Sprintf("not supported on %s", runtime.GOOS), false +} diff --git a/vendor/golang.org/x/net/internal/nettest/stack_unix.go b/vendor/golang.org/x/net/internal/nettest/stack_unix.go new file mode 100644 index 0000000000..af89229f48 --- /dev/null +++ b/vendor/golang.org/x/net/internal/nettest/stack_unix.go @@ -0,0 +1,22 @@ +// 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 darwin dragonfly freebsd linux netbsd openbsd solaris + +package nettest + +import ( + "fmt" + "os" + "runtime" +) + +// SupportsRawIPSocket reports whether the platform supports raw IP +// sockets. +func SupportsRawIPSocket() (string, bool) { + if os.Getuid() != 0 { + return fmt.Sprintf("must be root on %s", runtime.GOOS), false + } + return "", true +} diff --git a/vendor/golang.org/x/net/internal/nettest/stack_windows.go b/vendor/golang.org/x/net/internal/nettest/stack_windows.go new file mode 100644 index 0000000000..a21f4993e7 --- /dev/null +++ b/vendor/golang.org/x/net/internal/nettest/stack_windows.go @@ -0,0 +1,32 @@ +// 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 nettest + +import ( + "fmt" + "runtime" + "syscall" +) + +// SupportsRawIPSocket reports whether the platform supports raw IP +// sockets. +func SupportsRawIPSocket() (string, bool) { + // From http://msdn.microsoft.com/en-us/library/windows/desktop/ms740548.aspx: + // Note: To use a socket of type SOCK_RAW requires administrative privileges. + // Users running Winsock applications that use raw sockets must be a member of + // the Administrators group on the local computer, otherwise raw socket calls + // will fail with an error code of WSAEACCES. On Windows Vista and later, access + // for raw sockets is enforced at socket creation. In earlier versions of Windows, + // access for raw sockets is enforced during other socket operations. + s, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, 0) + if err == syscall.WSAEACCES { + return fmt.Sprintf("no access to raw socket allowed on %s", runtime.GOOS), false + } + if err != nil { + return err.Error(), false + } + syscall.Closesocket(s) + return "", true +} diff --git a/vendor/golang.org/x/net/internal/timeseries/timeseries.go b/vendor/golang.org/x/net/internal/timeseries/timeseries.go new file mode 100644 index 0000000000..1119f34482 --- /dev/null +++ b/vendor/golang.org/x/net/internal/timeseries/timeseries.go @@ -0,0 +1,525 @@ +// 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 timeseries implements a time series structure for stats collection. +package timeseries // import "golang.org/x/net/internal/timeseries" + +import ( + "fmt" + "log" + "time" +) + +const ( + timeSeriesNumBuckets = 64 + minuteHourSeriesNumBuckets = 60 +) + +var timeSeriesResolutions = []time.Duration{ + 1 * time.Second, + 10 * time.Second, + 1 * time.Minute, + 10 * time.Minute, + 1 * time.Hour, + 6 * time.Hour, + 24 * time.Hour, // 1 day + 7 * 24 * time.Hour, // 1 week + 4 * 7 * 24 * time.Hour, // 4 weeks + 16 * 7 * 24 * time.Hour, // 16 weeks +} + +var minuteHourSeriesResolutions = []time.Duration{ + 1 * time.Second, + 1 * time.Minute, +} + +// An Observable is a kind of data that can be aggregated in a time series. +type Observable interface { + Multiply(ratio float64) // Multiplies the data in self by a given ratio + Add(other Observable) // Adds the data from a different observation to self + Clear() // Clears the observation so it can be reused. + CopyFrom(other Observable) // Copies the contents of a given observation to self +} + +// Float attaches the methods of Observable to a float64. +type Float float64 + +// NewFloat returns a Float. +func NewFloat() Observable { + f := Float(0) + return &f +} + +// String returns the float as a string. +func (f *Float) String() string { return fmt.Sprintf("%g", f.Value()) } + +// Value returns the float's value. +func (f *Float) Value() float64 { return float64(*f) } + +func (f *Float) Multiply(ratio float64) { *f *= Float(ratio) } + +func (f *Float) Add(other Observable) { + o := other.(*Float) + *f += *o +} + +func (f *Float) Clear() { *f = 0 } + +func (f *Float) CopyFrom(other Observable) { + o := other.(*Float) + *f = *o +} + +// A Clock tells the current time. +type Clock interface { + Time() time.Time +} + +type defaultClock int + +var defaultClockInstance defaultClock + +func (defaultClock) Time() time.Time { return time.Now() } + +// Information kept per level. Each level consists of a circular list of +// observations. The start of the level may be derived from end and the +// len(buckets) * sizeInMillis. +type tsLevel struct { + oldest int // index to oldest bucketed Observable + newest int // index to newest bucketed Observable + end time.Time // end timestamp for this level + size time.Duration // duration of the bucketed Observable + buckets []Observable // collections of observations + provider func() Observable // used for creating new Observable +} + +func (l *tsLevel) Clear() { + l.oldest = 0 + l.newest = len(l.buckets) - 1 + l.end = time.Time{} + for i := range l.buckets { + if l.buckets[i] != nil { + l.buckets[i].Clear() + l.buckets[i] = nil + } + } +} + +func (l *tsLevel) InitLevel(size time.Duration, numBuckets int, f func() Observable) { + l.size = size + l.provider = f + l.buckets = make([]Observable, numBuckets) +} + +// Keeps a sequence of levels. Each level is responsible for storing data at +// a given resolution. For example, the first level stores data at a one +// minute resolution while the second level stores data at a one hour +// resolution. + +// Each level is represented by a sequence of buckets. Each bucket spans an +// interval equal to the resolution of the level. New observations are added +// to the last bucket. +type timeSeries struct { + provider func() Observable // make more Observable + numBuckets int // number of buckets in each level + levels []*tsLevel // levels of bucketed Observable + lastAdd time.Time // time of last Observable tracked + total Observable // convenient aggregation of all Observable + clock Clock // Clock for getting current time + pending Observable // observations not yet bucketed + pendingTime time.Time // what time are we keeping in pending + dirty bool // if there are pending observations +} + +// init initializes a level according to the supplied criteria. +func (ts *timeSeries) init(resolutions []time.Duration, f func() Observable, numBuckets int, clock Clock) { + ts.provider = f + ts.numBuckets = numBuckets + ts.clock = clock + ts.levels = make([]*tsLevel, len(resolutions)) + + for i := range resolutions { + if i > 0 && resolutions[i-1] >= resolutions[i] { + log.Print("timeseries: resolutions must be monotonically increasing") + break + } + newLevel := new(tsLevel) + newLevel.InitLevel(resolutions[i], ts.numBuckets, ts.provider) + ts.levels[i] = newLevel + } + + ts.Clear() +} + +// Clear removes all observations from the time series. +func (ts *timeSeries) Clear() { + ts.lastAdd = time.Time{} + ts.total = ts.resetObservation(ts.total) + ts.pending = ts.resetObservation(ts.pending) + ts.pendingTime = time.Time{} + ts.dirty = false + + for i := range ts.levels { + ts.levels[i].Clear() + } +} + +// Add records an observation at the current time. +func (ts *timeSeries) Add(observation Observable) { + ts.AddWithTime(observation, ts.clock.Time()) +} + +// AddWithTime records an observation at the specified time. +func (ts *timeSeries) AddWithTime(observation Observable, t time.Time) { + + smallBucketDuration := ts.levels[0].size + + if t.After(ts.lastAdd) { + ts.lastAdd = t + } + + if t.After(ts.pendingTime) { + ts.advance(t) + ts.mergePendingUpdates() + ts.pendingTime = ts.levels[0].end + ts.pending.CopyFrom(observation) + ts.dirty = true + } else if t.After(ts.pendingTime.Add(-1 * smallBucketDuration)) { + // The observation is close enough to go into the pending bucket. + // This compensates for clock skewing and small scheduling delays + // by letting the update stay in the fast path. + ts.pending.Add(observation) + ts.dirty = true + } else { + ts.mergeValue(observation, t) + } +} + +// mergeValue inserts the observation at the specified time in the past into all levels. +func (ts *timeSeries) mergeValue(observation Observable, t time.Time) { + for _, level := range ts.levels { + index := (ts.numBuckets - 1) - int(level.end.Sub(t)/level.size) + if 0 <= index && index < ts.numBuckets { + bucketNumber := (level.oldest + index) % ts.numBuckets + if level.buckets[bucketNumber] == nil { + level.buckets[bucketNumber] = level.provider() + } + level.buckets[bucketNumber].Add(observation) + } + } + ts.total.Add(observation) +} + +// mergePendingUpdates applies the pending updates into all levels. +func (ts *timeSeries) mergePendingUpdates() { + if ts.dirty { + ts.mergeValue(ts.pending, ts.pendingTime) + ts.pending = ts.resetObservation(ts.pending) + ts.dirty = false + } +} + +// advance cycles the buckets at each level until the latest bucket in +// each level can hold the time specified. +func (ts *timeSeries) advance(t time.Time) { + if !t.After(ts.levels[0].end) { + return + } + for i := 0; i < len(ts.levels); i++ { + level := ts.levels[i] + if !level.end.Before(t) { + break + } + + // If the time is sufficiently far, just clear the level and advance + // directly. + if !t.Before(level.end.Add(level.size * time.Duration(ts.numBuckets))) { + for _, b := range level.buckets { + ts.resetObservation(b) + } + level.end = time.Unix(0, (t.UnixNano()/level.size.Nanoseconds())*level.size.Nanoseconds()) + } + + for t.After(level.end) { + level.end = level.end.Add(level.size) + level.newest = level.oldest + level.oldest = (level.oldest + 1) % ts.numBuckets + ts.resetObservation(level.buckets[level.newest]) + } + + t = level.end + } +} + +// Latest returns the sum of the num latest buckets from the level. +func (ts *timeSeries) Latest(level, num int) Observable { + now := ts.clock.Time() + if ts.levels[0].end.Before(now) { + ts.advance(now) + } + + ts.mergePendingUpdates() + + result := ts.provider() + l := ts.levels[level] + index := l.newest + + for i := 0; i < num; i++ { + if l.buckets[index] != nil { + result.Add(l.buckets[index]) + } + if index == 0 { + index = ts.numBuckets + } + index-- + } + + return result +} + +// LatestBuckets returns a copy of the num latest buckets from level. +func (ts *timeSeries) LatestBuckets(level, num int) []Observable { + if level < 0 || level > len(ts.levels) { + log.Print("timeseries: bad level argument: ", level) + return nil + } + if num < 0 || num >= ts.numBuckets { + log.Print("timeseries: bad num argument: ", num) + return nil + } + + results := make([]Observable, num) + now := ts.clock.Time() + if ts.levels[0].end.Before(now) { + ts.advance(now) + } + + ts.mergePendingUpdates() + + l := ts.levels[level] + index := l.newest + + for i := 0; i < num; i++ { + result := ts.provider() + results[i] = result + if l.buckets[index] != nil { + result.CopyFrom(l.buckets[index]) + } + + if index == 0 { + index = ts.numBuckets + } + index -= 1 + } + return results +} + +// ScaleBy updates observations by scaling by factor. +func (ts *timeSeries) ScaleBy(factor float64) { + for _, l := range ts.levels { + for i := 0; i < ts.numBuckets; i++ { + l.buckets[i].Multiply(factor) + } + } + + ts.total.Multiply(factor) + ts.pending.Multiply(factor) +} + +// Range returns the sum of observations added over the specified time range. +// If start or finish times don't fall on bucket boundaries of the same +// level, then return values are approximate answers. +func (ts *timeSeries) Range(start, finish time.Time) Observable { + return ts.ComputeRange(start, finish, 1)[0] +} + +// Recent returns the sum of observations from the last delta. +func (ts *timeSeries) Recent(delta time.Duration) Observable { + now := ts.clock.Time() + return ts.Range(now.Add(-delta), now) +} + +// Total returns the total of all observations. +func (ts *timeSeries) Total() Observable { + ts.mergePendingUpdates() + return ts.total +} + +// ComputeRange computes a specified number of values into a slice using +// the observations recorded over the specified time period. The return +// values are approximate if the start or finish times don't fall on the +// bucket boundaries at the same level or if the number of buckets spanning +// the range is not an integral multiple of num. +func (ts *timeSeries) ComputeRange(start, finish time.Time, num int) []Observable { + if start.After(finish) { + log.Printf("timeseries: start > finish, %v>%v", start, finish) + return nil + } + + if num < 0 { + log.Printf("timeseries: num < 0, %v", num) + return nil + } + + results := make([]Observable, num) + + for _, l := range ts.levels { + if !start.Before(l.end.Add(-l.size * time.Duration(ts.numBuckets))) { + ts.extract(l, start, finish, num, results) + return results + } + } + + // Failed to find a level that covers the desired range. So just + // extract from the last level, even if it doesn't cover the entire + // desired range. + ts.extract(ts.levels[len(ts.levels)-1], start, finish, num, results) + + return results +} + +// RecentList returns the specified number of values in slice over the most +// recent time period of the specified range. +func (ts *timeSeries) RecentList(delta time.Duration, num int) []Observable { + if delta < 0 { + return nil + } + now := ts.clock.Time() + return ts.ComputeRange(now.Add(-delta), now, num) +} + +// extract returns a slice of specified number of observations from a given +// level over a given range. +func (ts *timeSeries) extract(l *tsLevel, start, finish time.Time, num int, results []Observable) { + ts.mergePendingUpdates() + + srcInterval := l.size + dstInterval := finish.Sub(start) / time.Duration(num) + dstStart := start + srcStart := l.end.Add(-srcInterval * time.Duration(ts.numBuckets)) + + srcIndex := 0 + + // Where should scanning start? + if dstStart.After(srcStart) { + advance := dstStart.Sub(srcStart) / srcInterval + srcIndex += int(advance) + srcStart = srcStart.Add(advance * srcInterval) + } + + // The i'th value is computed as show below. + // interval = (finish/start)/num + // i'th value = sum of observation in range + // [ start + i * interval, + // start + (i + 1) * interval ) + for i := 0; i < num; i++ { + results[i] = ts.resetObservation(results[i]) + dstEnd := dstStart.Add(dstInterval) + for srcIndex < ts.numBuckets && srcStart.Before(dstEnd) { + srcEnd := srcStart.Add(srcInterval) + if srcEnd.After(ts.lastAdd) { + srcEnd = ts.lastAdd + } + + if !srcEnd.Before(dstStart) { + srcValue := l.buckets[(srcIndex+l.oldest)%ts.numBuckets] + if !srcStart.Before(dstStart) && !srcEnd.After(dstEnd) { + // dst completely contains src. + if srcValue != nil { + results[i].Add(srcValue) + } + } else { + // dst partially overlaps src. + overlapStart := maxTime(srcStart, dstStart) + overlapEnd := minTime(srcEnd, dstEnd) + base := srcEnd.Sub(srcStart) + fraction := overlapEnd.Sub(overlapStart).Seconds() / base.Seconds() + + used := ts.provider() + if srcValue != nil { + used.CopyFrom(srcValue) + } + used.Multiply(fraction) + results[i].Add(used) + } + + if srcEnd.After(dstEnd) { + break + } + } + srcIndex++ + srcStart = srcStart.Add(srcInterval) + } + dstStart = dstStart.Add(dstInterval) + } +} + +// resetObservation clears the content so the struct may be reused. +func (ts *timeSeries) resetObservation(observation Observable) Observable { + if observation == nil { + observation = ts.provider() + } else { + observation.Clear() + } + return observation +} + +// TimeSeries tracks data at granularities from 1 second to 16 weeks. +type TimeSeries struct { + timeSeries +} + +// NewTimeSeries creates a new TimeSeries using the function provided for creating new Observable. +func NewTimeSeries(f func() Observable) *TimeSeries { + return NewTimeSeriesWithClock(f, defaultClockInstance) +} + +// NewTimeSeriesWithClock creates a new TimeSeries using the function provided for creating new Observable and the clock for +// assigning timestamps. +func NewTimeSeriesWithClock(f func() Observable, clock Clock) *TimeSeries { + ts := new(TimeSeries) + ts.timeSeries.init(timeSeriesResolutions, f, timeSeriesNumBuckets, clock) + return ts +} + +// MinuteHourSeries tracks data at granularities of 1 minute and 1 hour. +type MinuteHourSeries struct { + timeSeries +} + +// NewMinuteHourSeries creates a new MinuteHourSeries using the function provided for creating new Observable. +func NewMinuteHourSeries(f func() Observable) *MinuteHourSeries { + return NewMinuteHourSeriesWithClock(f, defaultClockInstance) +} + +// NewMinuteHourSeriesWithClock creates a new MinuteHourSeries using the function provided for creating new Observable and the clock for +// assigning timestamps. +func NewMinuteHourSeriesWithClock(f func() Observable, clock Clock) *MinuteHourSeries { + ts := new(MinuteHourSeries) + ts.timeSeries.init(minuteHourSeriesResolutions, f, + minuteHourSeriesNumBuckets, clock) + return ts +} + +func (ts *MinuteHourSeries) Minute() Observable { + return ts.timeSeries.Latest(0, 60) +} + +func (ts *MinuteHourSeries) Hour() Observable { + return ts.timeSeries.Latest(1, 60) +} + +func minTime(a, b time.Time) time.Time { + if a.Before(b) { + return a + } + return b +} + +func maxTime(a, b time.Time) time.Time { + if a.After(b) { + return a + } + return b +} diff --git a/vendor/golang.org/x/net/internal/timeseries/timeseries_test.go b/vendor/golang.org/x/net/internal/timeseries/timeseries_test.go new file mode 100644 index 0000000000..66325a912a --- /dev/null +++ b/vendor/golang.org/x/net/internal/timeseries/timeseries_test.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 timeseries + +import ( + "math" + "testing" + "time" +) + +func isNear(x *Float, y float64, tolerance float64) bool { + return math.Abs(x.Value()-y) < tolerance +} + +func isApproximate(x *Float, y float64) bool { + return isNear(x, y, 1e-2) +} + +func checkApproximate(t *testing.T, o Observable, y float64) { + x := o.(*Float) + if !isApproximate(x, y) { + t.Errorf("Wanted %g, got %g", y, x.Value()) + } +} + +func checkNear(t *testing.T, o Observable, y, tolerance float64) { + x := o.(*Float) + if !isNear(x, y, tolerance) { + t.Errorf("Wanted %g +- %g, got %g", y, tolerance, x.Value()) + } +} + +var baseTime = time.Date(2013, 1, 1, 0, 0, 0, 0, time.UTC) + +func tu(s int64) time.Time { + return baseTime.Add(time.Duration(s) * time.Second) +} + +func tu2(s int64, ns int64) time.Time { + return baseTime.Add(time.Duration(s)*time.Second + time.Duration(ns)*time.Nanosecond) +} + +func TestBasicTimeSeries(t *testing.T) { + ts := NewTimeSeries(NewFloat) + fo := new(Float) + *fo = Float(10) + ts.AddWithTime(fo, tu(1)) + ts.AddWithTime(fo, tu(1)) + ts.AddWithTime(fo, tu(1)) + ts.AddWithTime(fo, tu(1)) + checkApproximate(t, ts.Range(tu(0), tu(1)), 40) + checkApproximate(t, ts.Total(), 40) + ts.AddWithTime(fo, tu(3)) + ts.AddWithTime(fo, tu(3)) + ts.AddWithTime(fo, tu(3)) + checkApproximate(t, ts.Range(tu(0), tu(2)), 40) + checkApproximate(t, ts.Range(tu(2), tu(4)), 30) + checkApproximate(t, ts.Total(), 70) + ts.AddWithTime(fo, tu(1)) + ts.AddWithTime(fo, tu(1)) + checkApproximate(t, ts.Range(tu(0), tu(2)), 60) + checkApproximate(t, ts.Range(tu(2), tu(4)), 30) + checkApproximate(t, ts.Total(), 90) + *fo = Float(100) + ts.AddWithTime(fo, tu(100)) + checkApproximate(t, ts.Range(tu(99), tu(100)), 100) + checkApproximate(t, ts.Range(tu(0), tu(4)), 36) + checkApproximate(t, ts.Total(), 190) + *fo = Float(10) + ts.AddWithTime(fo, tu(1)) + ts.AddWithTime(fo, tu(1)) + checkApproximate(t, ts.Range(tu(0), tu(4)), 44) + checkApproximate(t, ts.Range(tu(37), tu2(100, 100e6)), 100) + checkApproximate(t, ts.Range(tu(50), tu2(100, 100e6)), 100) + checkApproximate(t, ts.Range(tu(99), tu2(100, 100e6)), 100) + checkApproximate(t, ts.Total(), 210) + + for i, l := range ts.ComputeRange(tu(36), tu(100), 64) { + if i == 63 { + checkApproximate(t, l, 100) + } else { + checkApproximate(t, l, 0) + } + } + + checkApproximate(t, ts.Range(tu(0), tu(100)), 210) + checkApproximate(t, ts.Range(tu(10), tu(100)), 100) + + for i, l := range ts.ComputeRange(tu(0), tu(100), 100) { + if i < 10 { + checkApproximate(t, l, 11) + } else if i >= 90 { + checkApproximate(t, l, 10) + } else { + checkApproximate(t, l, 0) + } + } +} + +func TestFloat(t *testing.T) { + f := Float(1) + if g, w := f.String(), "1"; g != w { + t.Errorf("Float(1).String = %q; want %q", g, w) + } + f2 := Float(2) + var o Observable = &f2 + f.Add(o) + if g, w := f.Value(), 3.0; g != w { + t.Errorf("Float post-add = %v; want %v", g, w) + } + f.Multiply(2) + if g, w := f.Value(), 6.0; g != w { + t.Errorf("Float post-multiply = %v; want %v", g, w) + } + f.Clear() + if g, w := f.Value(), 0.0; g != w { + t.Errorf("Float post-clear = %v; want %v", g, w) + } + f.CopyFrom(&f2) + if g, w := f.Value(), 2.0; g != w { + t.Errorf("Float post-CopyFrom = %v; want %v", g, w) + } +} + +type mockClock struct { + time time.Time +} + +func (m *mockClock) Time() time.Time { return m.time } +func (m *mockClock) Set(t time.Time) { m.time = t } + +const buckets = 6 + +var testResolutions = []time.Duration{ + 10 * time.Second, // level holds one minute of observations + 100 * time.Second, // level holds ten minutes of observations + 10 * time.Minute, // level holds one hour of observations +} + +// TestTimeSeries uses a small number of buckets to force a higher +// error rate on approximations from the timeseries. +type TestTimeSeries struct { + timeSeries +} + +func TestExpectedErrorRate(t *testing.T) { + ts := new(TestTimeSeries) + fake := new(mockClock) + fake.Set(time.Now()) + ts.timeSeries.init(testResolutions, NewFloat, buckets, fake) + for i := 1; i <= 61*61; i++ { + fake.Set(fake.Time().Add(1 * time.Second)) + ob := Float(1) + ts.AddWithTime(&ob, fake.Time()) + + // The results should be accurate within one missing bucket (1/6) of the observations recorded. + checkNear(t, ts.Latest(0, buckets), min(float64(i), 60), 10) + checkNear(t, ts.Latest(1, buckets), min(float64(i), 600), 100) + checkNear(t, ts.Latest(2, buckets), min(float64(i), 3600), 600) + } +} + +func min(a, b float64) float64 { + if a < b { + return a + } + return b +} diff --git a/vendor/golang.org/x/net/ipv4/control.go b/vendor/golang.org/x/net/ipv4/control.go new file mode 100644 index 0000000000..8cadfd7f3f --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/control.go @@ -0,0 +1,70 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4 + +import ( + "fmt" + "net" + "sync" +) + +type rawOpt struct { + sync.RWMutex + cflags ControlFlags +} + +func (c *rawOpt) set(f ControlFlags) { c.cflags |= f } +func (c *rawOpt) clear(f ControlFlags) { c.cflags &^= f } +func (c *rawOpt) isset(f ControlFlags) bool { return c.cflags&f != 0 } + +type ControlFlags uint + +const ( + FlagTTL ControlFlags = 1 << iota // pass the TTL on the received packet + FlagSrc // pass the source address on the received packet + FlagDst // pass the destination address on the received packet + FlagInterface // pass the interface index on the received packet +) + +// A ControlMessage represents per packet basis IP-level socket options. +type ControlMessage struct { + // Receiving socket options: SetControlMessage allows to + // receive the options from the protocol stack using ReadFrom + // method of PacketConn or RawConn. + // + // Specifying socket options: ControlMessage for WriteTo + // method of PacketConn or RawConn allows to send the options + // to the protocol stack. + // + TTL int // time-to-live, receiving only + Src net.IP // source address, specifying only + Dst net.IP // destination address, receiving only + IfIndex int // interface index, must be 1 <= value when specifying +} + +func (cm *ControlMessage) String() string { + if cm == nil { + return "" + } + return fmt.Sprintf("ttl=%d src=%v dst=%v ifindex=%d", cm.TTL, cm.Src, cm.Dst, cm.IfIndex) +} + +// Ancillary data socket options +const ( + ctlTTL = iota // header field + ctlSrc // header field + ctlDst // header field + ctlInterface // inbound or outbound interface + ctlPacketInfo // inbound or outbound packet path + ctlMax +) + +// A ctlOpt represents a binding for ancillary data socket option. +type ctlOpt struct { + name int // option name, must be equal or greater than 1 + length int // option length + marshal func([]byte, *ControlMessage) []byte + parse func(*ControlMessage, []byte) +} diff --git a/vendor/golang.org/x/net/ipv4/control_bsd.go b/vendor/golang.org/x/net/ipv4/control_bsd.go new file mode 100644 index 0000000000..33d8bc8b38 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/control_bsd.go @@ -0,0 +1,40 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd netbsd openbsd + +package ipv4 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" +) + +func marshalDst(b []byte, cm *ControlMessage) []byte { + m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) + m.Level = iana.ProtocolIP + m.Type = sysIP_RECVDSTADDR + m.SetLen(syscall.CmsgLen(net.IPv4len)) + return b[syscall.CmsgSpace(net.IPv4len):] +} + +func parseDst(cm *ControlMessage, b []byte) { + cm.Dst = b[:net.IPv4len] +} + +func marshalInterface(b []byte, cm *ControlMessage) []byte { + m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) + m.Level = iana.ProtocolIP + m.Type = sysIP_RECVIF + m.SetLen(syscall.CmsgLen(syscall.SizeofSockaddrDatalink)) + return b[syscall.CmsgSpace(syscall.SizeofSockaddrDatalink):] +} + +func parseInterface(cm *ControlMessage, b []byte) { + sadl := (*syscall.SockaddrDatalink)(unsafe.Pointer(&b[0])) + cm.IfIndex = int(sadl.Index) +} diff --git a/vendor/golang.org/x/net/ipv4/control_pktinfo.go b/vendor/golang.org/x/net/ipv4/control_pktinfo.go new file mode 100644 index 0000000000..444782f397 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/control_pktinfo.go @@ -0,0 +1,37 @@ +// 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 darwin linux + +package ipv4 + +import ( + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" +) + +func marshalPacketInfo(b []byte, cm *ControlMessage) []byte { + m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) + m.Level = iana.ProtocolIP + m.Type = sysIP_PKTINFO + m.SetLen(syscall.CmsgLen(sysSizeofInetPktinfo)) + if cm != nil { + pi := (*sysInetPktinfo)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) + if ip := cm.Src.To4(); ip != nil { + copy(pi.Spec_dst[:], ip) + } + if cm.IfIndex > 0 { + pi.setIfindex(cm.IfIndex) + } + } + return b[syscall.CmsgSpace(sysSizeofInetPktinfo):] +} + +func parsePacketInfo(cm *ControlMessage, b []byte) { + pi := (*sysInetPktinfo)(unsafe.Pointer(&b[0])) + cm.IfIndex = int(pi.Ifindex) + cm.Dst = pi.Addr[:] +} diff --git a/vendor/golang.org/x/net/ipv4/control_stub.go b/vendor/golang.org/x/net/ipv4/control_stub.go new file mode 100644 index 0000000000..4d8507194c --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/control_stub.go @@ -0,0 +1,23 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build nacl plan9 solaris + +package ipv4 + +func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error { + return errOpNoSupport +} + +func newControlMessage(opt *rawOpt) []byte { + return nil +} + +func parseControlMessage(b []byte) (*ControlMessage, error) { + return nil, errOpNoSupport +} + +func marshalControlMessage(cm *ControlMessage) []byte { + return nil +} diff --git a/vendor/golang.org/x/net/ipv4/control_unix.go b/vendor/golang.org/x/net/ipv4/control_unix.go new file mode 100644 index 0000000000..3000c52e40 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/control_unix.go @@ -0,0 +1,164 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd + +package ipv4 + +import ( + "os" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" +) + +func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error { + opt.Lock() + defer opt.Unlock() + if cf&FlagTTL != 0 && sockOpts[ssoReceiveTTL].name > 0 { + if err := setInt(fd, &sockOpts[ssoReceiveTTL], boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagTTL) + } else { + opt.clear(FlagTTL) + } + } + if sockOpts[ssoPacketInfo].name > 0 { + if cf&(FlagSrc|FlagDst|FlagInterface) != 0 { + if err := setInt(fd, &sockOpts[ssoPacketInfo], boolint(on)); err != nil { + return err + } + if on { + opt.set(cf & (FlagSrc | FlagDst | FlagInterface)) + } else { + opt.clear(cf & (FlagSrc | FlagDst | FlagInterface)) + } + } + } else { + if cf&FlagDst != 0 && sockOpts[ssoReceiveDst].name > 0 { + if err := setInt(fd, &sockOpts[ssoReceiveDst], boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagDst) + } else { + opt.clear(FlagDst) + } + } + if cf&FlagInterface != 0 && sockOpts[ssoReceiveInterface].name > 0 { + if err := setInt(fd, &sockOpts[ssoReceiveInterface], boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagInterface) + } else { + opt.clear(FlagInterface) + } + } + } + return nil +} + +func newControlMessage(opt *rawOpt) (oob []byte) { + opt.RLock() + var l int + if opt.isset(FlagTTL) && ctlOpts[ctlTTL].name > 0 { + l += syscall.CmsgSpace(ctlOpts[ctlTTL].length) + } + if ctlOpts[ctlPacketInfo].name > 0 { + if opt.isset(FlagSrc | FlagDst | FlagInterface) { + l += syscall.CmsgSpace(ctlOpts[ctlPacketInfo].length) + } + } else { + if opt.isset(FlagDst) && ctlOpts[ctlDst].name > 0 { + l += syscall.CmsgSpace(ctlOpts[ctlDst].length) + } + if opt.isset(FlagInterface) && ctlOpts[ctlInterface].name > 0 { + l += syscall.CmsgSpace(ctlOpts[ctlInterface].length) + } + } + if l > 0 { + oob = make([]byte, l) + b := oob + if opt.isset(FlagTTL) && ctlOpts[ctlTTL].name > 0 { + b = ctlOpts[ctlTTL].marshal(b, nil) + } + if ctlOpts[ctlPacketInfo].name > 0 { + if opt.isset(FlagSrc | FlagDst | FlagInterface) { + b = ctlOpts[ctlPacketInfo].marshal(b, nil) + } + } else { + if opt.isset(FlagDst) && ctlOpts[ctlDst].name > 0 { + b = ctlOpts[ctlDst].marshal(b, nil) + } + if opt.isset(FlagInterface) && ctlOpts[ctlInterface].name > 0 { + b = ctlOpts[ctlInterface].marshal(b, nil) + } + } + } + opt.RUnlock() + return +} + +func parseControlMessage(b []byte) (*ControlMessage, error) { + if len(b) == 0 { + return nil, nil + } + cmsgs, err := syscall.ParseSocketControlMessage(b) + if err != nil { + return nil, os.NewSyscallError("parse socket control message", err) + } + cm := &ControlMessage{} + for _, m := range cmsgs { + if m.Header.Level != iana.ProtocolIP { + continue + } + switch int(m.Header.Type) { + case ctlOpts[ctlTTL].name: + ctlOpts[ctlTTL].parse(cm, m.Data[:]) + case ctlOpts[ctlDst].name: + ctlOpts[ctlDst].parse(cm, m.Data[:]) + case ctlOpts[ctlInterface].name: + ctlOpts[ctlInterface].parse(cm, m.Data[:]) + case ctlOpts[ctlPacketInfo].name: + ctlOpts[ctlPacketInfo].parse(cm, m.Data[:]) + } + } + return cm, nil +} + +func marshalControlMessage(cm *ControlMessage) (oob []byte) { + if cm == nil { + return nil + } + var l int + pktinfo := false + if ctlOpts[ctlPacketInfo].name > 0 && (cm.Src.To4() != nil || cm.IfIndex > 0) { + pktinfo = true + l += syscall.CmsgSpace(ctlOpts[ctlPacketInfo].length) + } + if l > 0 { + oob = make([]byte, l) + b := oob + if pktinfo { + b = ctlOpts[ctlPacketInfo].marshal(b, cm) + } + } + return +} + +func marshalTTL(b []byte, cm *ControlMessage) []byte { + m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) + m.Level = iana.ProtocolIP + m.Type = sysIP_RECVTTL + m.SetLen(syscall.CmsgLen(1)) + return b[syscall.CmsgSpace(1):] +} + +func parseTTL(cm *ControlMessage, b []byte) { + cm.TTL = int(*(*byte)(unsafe.Pointer(&b[:1][0]))) +} diff --git a/vendor/golang.org/x/net/ipv4/control_windows.go b/vendor/golang.org/x/net/ipv4/control_windows.go new file mode 100644 index 0000000000..800f637795 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/control_windows.go @@ -0,0 +1,27 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4 + +import "syscall" + +func setControlMessage(fd syscall.Handle, opt *rawOpt, cf ControlFlags, on bool) error { + // TODO(mikio): implement this + return syscall.EWINDOWS +} + +func newControlMessage(opt *rawOpt) []byte { + // TODO(mikio): implement this + return nil +} + +func parseControlMessage(b []byte) (*ControlMessage, error) { + // TODO(mikio): implement this + return nil, syscall.EWINDOWS +} + +func marshalControlMessage(cm *ControlMessage) []byte { + // TODO(mikio): implement this + return nil +} diff --git a/vendor/golang.org/x/net/ipv4/defs_darwin.go b/vendor/golang.org/x/net/ipv4/defs_darwin.go new file mode 100644 index 0000000000..731d56a711 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/defs_darwin.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. + +// +build ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include + +#include +*/ +import "C" + +const ( + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_STRIPHDR = C.IP_STRIPHDR + sysIP_RECVTTL = C.IP_RECVTTL + sysIP_BOUND_IF = C.IP_BOUND_IF + sysIP_PKTINFO = C.IP_PKTINFO + sysIP_RECVPKTINFO = C.IP_RECVPKTINFO + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + sysIP_MULTICAST_VIF = C.IP_MULTICAST_VIF + sysIP_MULTICAST_IFINDEX = C.IP_MULTICAST_IFINDEX + sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP + sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP + sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE + sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + + sysSizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sysSizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sysSizeofInetPktinfo = C.sizeof_struct_in_pktinfo + + sysSizeofIPMreq = C.sizeof_struct_ip_mreq + sysSizeofIPMreqn = C.sizeof_struct_ip_mreqn + sysSizeofIPMreqSource = C.sizeof_struct_ip_mreq_source + sysSizeofGroupReq = C.sizeof_struct_group_req + sysSizeofGroupSourceReq = C.sizeof_struct_group_source_req +) + +type sysSockaddrStorage C.struct_sockaddr_storage + +type sysSockaddrInet C.struct_sockaddr_in + +type sysInetPktinfo C.struct_in_pktinfo + +type sysIPMreq C.struct_ip_mreq + +type sysIPMreqn C.struct_ip_mreqn + +type sysIPMreqSource C.struct_ip_mreq_source + +type sysGroupReq C.struct_group_req + +type sysGroupSourceReq C.struct_group_source_req diff --git a/vendor/golang.org/x/net/ipv4/defs_dragonfly.go b/vendor/golang.org/x/net/ipv4/defs_dragonfly.go new file mode 100644 index 0000000000..08e3b855d5 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/defs_dragonfly.go @@ -0,0 +1,38 @@ +// 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 + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include +*/ +import "C" + +const ( + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_RECVTTL = C.IP_RECVTTL + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_MULTICAST_VIF = C.IP_MULTICAST_VIF + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + + sysSizeofIPMreq = C.sizeof_struct_ip_mreq +) + +type sysIPMreq C.struct_ip_mreq diff --git a/vendor/golang.org/x/net/ipv4/defs_freebsd.go b/vendor/golang.org/x/net/ipv4/defs_freebsd.go new file mode 100644 index 0000000000..f12ca327bf --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/defs_freebsd.go @@ -0,0 +1,75 @@ +// 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 + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include + +#include +*/ +import "C" + +const ( + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_SENDSRCADDR = C.IP_SENDSRCADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_ONESBCAST = C.IP_ONESBCAST + sysIP_BINDANY = C.IP_BINDANY + sysIP_RECVTTL = C.IP_RECVTTL + sysIP_MINTTL = C.IP_MINTTL + sysIP_DONTFRAG = C.IP_DONTFRAG + sysIP_RECVTOS = C.IP_RECVTOS + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + sysIP_MULTICAST_VIF = C.IP_MULTICAST_VIF + sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP + sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP + sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE + sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + + sysSizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sysSizeofSockaddrInet = C.sizeof_struct_sockaddr_in + + sysSizeofIPMreq = C.sizeof_struct_ip_mreq + sysSizeofIPMreqn = C.sizeof_struct_ip_mreqn + sysSizeofIPMreqSource = C.sizeof_struct_ip_mreq_source + sysSizeofGroupReq = C.sizeof_struct_group_req + sysSizeofGroupSourceReq = C.sizeof_struct_group_source_req +) + +type sysSockaddrStorage C.struct_sockaddr_storage + +type sysSockaddrInet C.struct_sockaddr_in + +type sysIPMreq C.struct_ip_mreq + +type sysIPMreqn C.struct_ip_mreqn + +type sysIPMreqSource C.struct_ip_mreq_source + +type sysGroupReq C.struct_group_req + +type sysGroupSourceReq C.struct_group_source_req diff --git a/vendor/golang.org/x/net/ipv4/defs_linux.go b/vendor/golang.org/x/net/ipv4/defs_linux.go new file mode 100644 index 0000000000..fdba148a2f --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/defs_linux.go @@ -0,0 +1,111 @@ +// 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 + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include + +#include +#include +#include +*/ +import "C" + +const ( + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_ROUTER_ALERT = C.IP_ROUTER_ALERT + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_PKTINFO = C.IP_PKTINFO + sysIP_PKTOPTIONS = C.IP_PKTOPTIONS + sysIP_MTU_DISCOVER = C.IP_MTU_DISCOVER + sysIP_RECVERR = C.IP_RECVERR + sysIP_RECVTTL = C.IP_RECVTTL + sysIP_RECVTOS = C.IP_RECVTOS + sysIP_MTU = C.IP_MTU + sysIP_FREEBIND = C.IP_FREEBIND + sysIP_TRANSPARENT = C.IP_TRANSPARENT + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_ORIGDSTADDR = C.IP_ORIGDSTADDR + sysIP_RECVORIGDSTADDR = C.IP_RECVORIGDSTADDR + sysIP_MINTTL = C.IP_MINTTL + sysIP_NODEFRAG = C.IP_NODEFRAG + sysIP_UNICAST_IF = C.IP_UNICAST_IF + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE + sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE + sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP + sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP + sysIP_MSFILTER = C.IP_MSFILTER + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + sysMCAST_MSFILTER = C.MCAST_MSFILTER + sysIP_MULTICAST_ALL = C.IP_MULTICAST_ALL + + //sysIP_PMTUDISC_DONT = C.IP_PMTUDISC_DONT + //sysIP_PMTUDISC_WANT = C.IP_PMTUDISC_WANT + //sysIP_PMTUDISC_DO = C.IP_PMTUDISC_DO + //sysIP_PMTUDISC_PROBE = C.IP_PMTUDISC_PROBE + //sysIP_PMTUDISC_INTERFACE = C.IP_PMTUDISC_INTERFACE + //sysIP_PMTUDISC_OMIT = C.IP_PMTUDISC_OMIT + + sysICMP_FILTER = C.ICMP_FILTER + + sysSO_EE_ORIGIN_NONE = C.SO_EE_ORIGIN_NONE + sysSO_EE_ORIGIN_LOCAL = C.SO_EE_ORIGIN_LOCAL + sysSO_EE_ORIGIN_ICMP = C.SO_EE_ORIGIN_ICMP + sysSO_EE_ORIGIN_ICMP6 = C.SO_EE_ORIGIN_ICMP6 + sysSO_EE_ORIGIN_TXSTATUS = C.SO_EE_ORIGIN_TXSTATUS + sysSO_EE_ORIGIN_TIMESTAMPING = C.SO_EE_ORIGIN_TIMESTAMPING + + sysSizeofKernelSockaddrStorage = C.sizeof_struct___kernel_sockaddr_storage + sysSizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sysSizeofInetPktinfo = C.sizeof_struct_in_pktinfo + sysSizeofSockExtendedErr = C.sizeof_struct_sock_extended_err + + sysSizeofIPMreq = C.sizeof_struct_ip_mreq + sysSizeofIPMreqn = C.sizeof_struct_ip_mreqn + sysSizeofIPMreqSource = C.sizeof_struct_ip_mreq_source + sysSizeofGroupReq = C.sizeof_struct_group_req + sysSizeofGroupSourceReq = C.sizeof_struct_group_source_req + + sysSizeofICMPFilter = C.sizeof_struct_icmp_filter +) + +type sysKernelSockaddrStorage C.struct___kernel_sockaddr_storage + +type sysSockaddrInet C.struct_sockaddr_in + +type sysInetPktinfo C.struct_in_pktinfo + +type sysSockExtendedErr C.struct_sock_extended_err + +type sysIPMreq C.struct_ip_mreq + +type sysIPMreqn C.struct_ip_mreqn + +type sysIPMreqSource C.struct_ip_mreq_source + +type sysGroupReq C.struct_group_req + +type sysGroupSourceReq C.struct_group_source_req + +type sysICMPFilter C.struct_icmp_filter diff --git a/vendor/golang.org/x/net/ipv4/defs_netbsd.go b/vendor/golang.org/x/net/ipv4/defs_netbsd.go new file mode 100644 index 0000000000..8642354f49 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/defs_netbsd.go @@ -0,0 +1,37 @@ +// 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 + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include +*/ +import "C" + +const ( + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_RECVTTL = C.IP_RECVTTL + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + + sysSizeofIPMreq = C.sizeof_struct_ip_mreq +) + +type sysIPMreq C.struct_ip_mreq diff --git a/vendor/golang.org/x/net/ipv4/defs_openbsd.go b/vendor/golang.org/x/net/ipv4/defs_openbsd.go new file mode 100644 index 0000000000..8642354f49 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/defs_openbsd.go @@ -0,0 +1,37 @@ +// 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 + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include +*/ +import "C" + +const ( + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_RECVTTL = C.IP_RECVTTL + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + + sysSizeofIPMreq = C.sizeof_struct_ip_mreq +) + +type sysIPMreq C.struct_ip_mreq diff --git a/vendor/golang.org/x/net/ipv4/defs_solaris.go b/vendor/golang.org/x/net/ipv4/defs_solaris.go new file mode 100644 index 0000000000..bb74afa49b --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/defs_solaris.go @@ -0,0 +1,57 @@ +// 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 + +// +godefs map struct_in_addr [4]byte /* in_addr */ + +package ipv4 + +/* +#include +*/ +import "C" + +const ( + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_RECVSLLA = C.IP_RECVSLLA + sysIP_RECVTTL = C.IP_RECVTTL + sysIP_NEXTHOP = C.IP_NEXTHOP + sysIP_PKTINFO = C.IP_PKTINFO + sysIP_RECVPKTINFO = C.IP_RECVPKTINFO + sysIP_DONTFRAG = C.IP_DONTFRAG + sysIP_BOUND_IF = C.IP_BOUND_IF + sysIP_UNSPEC_SRC = C.IP_UNSPEC_SRC + sysIP_BROADCAST_TTL = C.IP_BROADCAST_TTL + sysIP_DHCPINIT_IF = C.IP_DHCPINIT_IF + + sysIP_MULTICAST_IF = C.IP_MULTICAST_IF + sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL + sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP + sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP + sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP + sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE + sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE + sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP + sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP + + sysSizeofInetPktinfo = C.sizeof_struct_in_pktinfo + + sysSizeofIPMreq = C.sizeof_struct_ip_mreq + sysSizeofIPMreqSource = C.sizeof_struct_ip_mreq_source +) + +type sysInetPktinfo C.struct_in_pktinfo + +type sysIPMreq C.struct_ip_mreq + +type sysIPMreqSource C.struct_ip_mreq_source diff --git a/vendor/golang.org/x/net/ipv4/dgramopt_posix.go b/vendor/golang.org/x/net/ipv4/dgramopt_posix.go new file mode 100644 index 0000000000..103c4f6dae --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/dgramopt_posix.go @@ -0,0 +1,251 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd windows + +package ipv4 + +import ( + "net" + "syscall" +) + +// MulticastTTL returns the time-to-live field value for outgoing +// multicast packets. +func (c *dgramOpt) MulticastTTL() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return 0, err + } + return getInt(fd, &sockOpts[ssoMulticastTTL]) +} + +// SetMulticastTTL sets the time-to-live field value for future +// outgoing multicast packets. +func (c *dgramOpt) SetMulticastTTL(ttl int) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + return setInt(fd, &sockOpts[ssoMulticastTTL], ttl) +} + +// MulticastInterface returns the default interface for multicast +// packet transmissions. +func (c *dgramOpt) MulticastInterface() (*net.Interface, error) { + if !c.ok() { + return nil, syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return nil, err + } + return getInterface(fd, &sockOpts[ssoMulticastInterface]) +} + +// SetMulticastInterface sets the default interface for future +// multicast packet transmissions. +func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + return setInterface(fd, &sockOpts[ssoMulticastInterface], ifi) +} + +// MulticastLoopback reports whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) MulticastLoopback() (bool, error) { + if !c.ok() { + return false, syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return false, err + } + on, err := getInt(fd, &sockOpts[ssoMulticastLoopback]) + if err != nil { + return false, err + } + return on == 1, nil +} + +// SetMulticastLoopback sets whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) SetMulticastLoopback(on bool) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + return setInt(fd, &sockOpts[ssoMulticastLoopback], boolint(on)) +} + +// JoinGroup joins the group address group on the interface ifi. +// By default all sources that can cast data to group are accepted. +// It's possible to mute and unmute data transmission from a specific +// source by using ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup. +// JoinGroup uses the system assigned multicast interface when ifi is +// nil, although this is not recommended because the assignment +// depends on platforms and sometimes it might require routing +// configuration. +func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + return setGroup(fd, &sockOpts[ssoJoinGroup], ifi, grp) +} + +// LeaveGroup leaves the group address group on the interface ifi +// regardless of whether the group is any-source group or +// source-specific group. +func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + return setGroup(fd, &sockOpts[ssoLeaveGroup], ifi, grp) +} + +// JoinSourceSpecificGroup joins the source-specific group comprising +// group and source on the interface ifi. +// JoinSourceSpecificGroup uses the system assigned multicast +// interface when ifi is nil, although this is not recommended because +// the assignment depends on platforms and sometimes it might require +// routing configuration. +func (c *dgramOpt) JoinSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP4(source) + if src == nil { + return errMissingAddress + } + return setSourceGroup(fd, &sockOpts[ssoJoinSourceGroup], ifi, grp, src) +} + +// LeaveSourceSpecificGroup leaves the source-specific group on the +// interface ifi. +func (c *dgramOpt) LeaveSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP4(source) + if src == nil { + return errMissingAddress + } + return setSourceGroup(fd, &sockOpts[ssoLeaveSourceGroup], ifi, grp, src) +} + +// ExcludeSourceSpecificGroup excludes the source-specific group from +// the already joined any-source groups by JoinGroup on the interface +// ifi. +func (c *dgramOpt) ExcludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP4(source) + if src == nil { + return errMissingAddress + } + return setSourceGroup(fd, &sockOpts[ssoBlockSourceGroup], ifi, grp, src) +} + +// IncludeSourceSpecificGroup includes the excluded source-specific +// group by ExcludeSourceSpecificGroup again on the interface ifi. +func (c *dgramOpt) IncludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + grp := netAddrToIP4(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP4(source) + if src == nil { + return errMissingAddress + } + return setSourceGroup(fd, &sockOpts[ssoUnblockSourceGroup], ifi, grp, src) +} + +// ICMPFilter returns an ICMP filter. +// Currently only Linux supports this. +func (c *dgramOpt) ICMPFilter() (*ICMPFilter, error) { + if !c.ok() { + return nil, syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return nil, err + } + return getICMPFilter(fd, &sockOpts[ssoICMPFilter]) +} + +// SetICMPFilter deploys the ICMP filter. +// Currently only Linux supports this. +func (c *dgramOpt) SetICMPFilter(f *ICMPFilter) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + return setICMPFilter(fd, &sockOpts[ssoICMPFilter], f) +} diff --git a/vendor/golang.org/x/net/ipv4/dgramopt_stub.go b/vendor/golang.org/x/net/ipv4/dgramopt_stub.go new file mode 100644 index 0000000000..b74df69310 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/dgramopt_stub.go @@ -0,0 +1,106 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build nacl plan9 solaris + +package ipv4 + +import "net" + +// MulticastTTL returns the time-to-live field value for outgoing +// multicast packets. +func (c *dgramOpt) MulticastTTL() (int, error) { + return 0, errOpNoSupport +} + +// SetMulticastTTL sets the time-to-live field value for future +// outgoing multicast packets. +func (c *dgramOpt) SetMulticastTTL(ttl int) error { + return errOpNoSupport +} + +// MulticastInterface returns the default interface for multicast +// packet transmissions. +func (c *dgramOpt) MulticastInterface() (*net.Interface, error) { + return nil, errOpNoSupport +} + +// SetMulticastInterface sets the default interface for future +// multicast packet transmissions. +func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error { + return errOpNoSupport +} + +// MulticastLoopback reports whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) MulticastLoopback() (bool, error) { + return false, errOpNoSupport +} + +// SetMulticastLoopback sets whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) SetMulticastLoopback(on bool) error { + return errOpNoSupport +} + +// JoinGroup joins the group address group on the interface ifi. +// By default all sources that can cast data to group are accepted. +// It's possible to mute and unmute data transmission from a specific +// source by using ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup. +// JoinGroup uses the system assigned multicast interface when ifi is +// nil, although this is not recommended because the assignment +// depends on platforms and sometimes it might require routing +// configuration. +func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error { + return errOpNoSupport +} + +// LeaveGroup leaves the group address group on the interface ifi +// regardless of whether the group is any-source group or +// source-specific group. +func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error { + return errOpNoSupport +} + +// JoinSourceSpecificGroup joins the source-specific group comprising +// group and source on the interface ifi. +// JoinSourceSpecificGroup uses the system assigned multicast +// interface when ifi is nil, although this is not recommended because +// the assignment depends on platforms and sometimes it might require +// routing configuration. +func (c *dgramOpt) JoinSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + return errOpNoSupport +} + +// LeaveSourceSpecificGroup leaves the source-specific group on the +// interface ifi. +func (c *dgramOpt) LeaveSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + return errOpNoSupport +} + +// ExcludeSourceSpecificGroup excludes the source-specific group from +// the already joined any-source groups by JoinGroup on the interface +// ifi. +func (c *dgramOpt) ExcludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + return errOpNoSupport +} + +// IncludeSourceSpecificGroup includes the excluded source-specific +// group by ExcludeSourceSpecificGroup again on the interface ifi. +func (c *dgramOpt) IncludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + return errOpNoSupport +} + +// ICMPFilter returns an ICMP filter. +// Currently only Linux supports this. +func (c *dgramOpt) ICMPFilter() (*ICMPFilter, error) { + return nil, errOpNoSupport +} + +// SetICMPFilter deploys the ICMP filter. +// Currently only Linux supports this. +func (c *dgramOpt) SetICMPFilter(f *ICMPFilter) error { + return errOpNoSupport +} diff --git a/vendor/golang.org/x/net/ipv4/doc.go b/vendor/golang.org/x/net/ipv4/doc.go new file mode 100644 index 0000000000..9a79badfe2 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/doc.go @@ -0,0 +1,242 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package ipv4 implements IP-level socket options for the Internet +// Protocol version 4. +// +// The package provides IP-level socket options that allow +// manipulation of IPv4 facilities. +// +// The IPv4 protocol and basic host requirements for IPv4 are defined +// in RFC 791 and RFC 1122. +// Host extensions for multicasting and socket interface extensions +// for multicast source filters are defined in RFC 1112 and RFC 3678. +// IGMPv1, IGMPv2 and IGMPv3 are defined in RFC 1112, RFC 2236 and RFC +// 3376. +// Source-specific multicast is defined in RFC 4607. +// +// +// Unicasting +// +// The options for unicasting are available for net.TCPConn, +// net.UDPConn and net.IPConn which are created as network connections +// that use the IPv4 transport. When a single TCP connection carrying +// a data flow of multiple packets needs to indicate the flow is +// important, ipv4.Conn is used to set the type-of-service field on +// the IPv4 header for each packet. +// +// ln, err := net.Listen("tcp4", "0.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer ln.Close() +// for { +// c, err := ln.Accept() +// if err != nil { +// // error handling +// } +// go func(c net.Conn) { +// defer c.Close() +// +// The outgoing packets will be labeled DiffServ assured forwarding +// class 1 low drop precedence, known as AF11 packets. +// +// if err := ipv4.NewConn(c).SetTOS(0x28); err != nil { +// // error handling +// } +// if _, err := c.Write(data); err != nil { +// // error handling +// } +// }(c) +// } +// +// +// Multicasting +// +// The options for multicasting are available for net.UDPConn and +// net.IPconn which are created as network connections that use the +// IPv4 transport. A few network facilities must be prepared before +// you begin multicasting, at a minimum joining network interfaces and +// multicast groups. +// +// en0, err := net.InterfaceByName("en0") +// if err != nil { +// // error handling +// } +// en1, err := net.InterfaceByIndex(911) +// if err != nil { +// // error handling +// } +// group := net.IPv4(224, 0, 0, 250) +// +// First, an application listens to an appropriate address with an +// appropriate service port. +// +// c, err := net.ListenPacket("udp4", "0.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer c.Close() +// +// Second, the application joins multicast groups, starts listening to +// the groups on the specified network interfaces. Note that the +// service port for transport layer protocol does not matter with this +// operation as joining groups affects only network and link layer +// protocols, such as IPv4 and Ethernet. +// +// p := ipv4.NewPacketConn(c) +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: group}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en1, &net.UDPAddr{IP: group}); err != nil { +// // error handling +// } +// +// The application might set per packet control message transmissions +// between the protocol stack within the kernel. When the application +// needs a destination address on an incoming packet, +// SetControlMessage of ipv4.PacketConn is used to enable control +// message transmissons. +// +// if err := p.SetControlMessage(ipv4.FlagDst, true); err != nil { +// // error handling +// } +// +// The application could identify whether the received packets are +// of interest by using the control message that contains the +// destination address of the received packet. +// +// b := make([]byte, 1500) +// for { +// n, cm, src, err := p.ReadFrom(b) +// if err != nil { +// // error handling +// } +// if cm.Dst.IsMulticast() { +// if cm.Dst.Equal(group) { +// // joined group, do something +// } else { +// // unknown group, discard +// continue +// } +// } +// +// The application can also send both unicast and multicast packets. +// +// p.SetTOS(0x0) +// p.SetTTL(16) +// if _, err := p.WriteTo(data, nil, src); err != nil { +// // error handling +// } +// dst := &net.UDPAddr{IP: group, Port: 1024} +// for _, ifi := range []*net.Interface{en0, en1} { +// if err := p.SetMulticastInterface(ifi); err != nil { +// // error handling +// } +// p.SetMulticastTTL(2) +// if _, err := p.WriteTo(data, nil, dst); err != nil { +// // error handling +// } +// } +// } +// +// +// More multicasting +// +// An application that uses PacketConn or RawConn may join multiple +// multicast groups. For example, a UDP listener with port 1024 might +// join two different groups across over two different network +// interfaces by using: +// +// c, err := net.ListenPacket("udp4", "0.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer c.Close() +// p := ipv4.NewPacketConn(c) +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en1, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}); err != nil { +// // error handling +// } +// +// It is possible for multiple UDP listeners that listen on the same +// UDP port to join the same multicast group. The net package will +// provide a socket that listens to a wildcard address with reusable +// UDP port when an appropriate multicast address prefix is passed to +// the net.ListenPacket or net.ListenUDP. +// +// c1, err := net.ListenPacket("udp4", "224.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer c1.Close() +// c2, err := net.ListenPacket("udp4", "224.0.0.0:1024") +// if err != nil { +// // error handling +// } +// defer c2.Close() +// p1 := ipv4.NewPacketConn(c1) +// if err := p1.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { +// // error handling +// } +// p2 := ipv4.NewPacketConn(c2) +// if err := p2.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { +// // error handling +// } +// +// Also it is possible for the application to leave or rejoin a +// multicast group on the network interface. +// +// if err := p.LeaveGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 250)}); err != nil { +// // error handling +// } +// +// +// Source-specific multicasting +// +// An application that uses PacketConn or RawConn on IGMPv3 supported +// platform is able to join source-specific multicast groups. +// The application may use JoinSourceSpecificGroup and +// LeaveSourceSpecificGroup for the operation known as "include" mode, +// +// ssmgroup := net.UDPAddr{IP: net.IPv4(232, 7, 8, 9)} +// ssmsource := net.UDPAddr{IP: net.IPv4(192, 168, 0, 1)}) +// if err := p.JoinSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { +// // error handling +// } +// if err := p.LeaveSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { +// // error handling +// } +// +// or JoinGroup, ExcludeSourceSpecificGroup, +// IncludeSourceSpecificGroup and LeaveGroup for the operation known +// as "exclude" mode. +// +// exclsource := net.UDPAddr{IP: net.IPv4(192, 168, 0, 254)} +// if err := p.JoinGroup(en0, &ssmgroup); err != nil { +// // error handling +// } +// if err := p.ExcludeSourceSpecificGroup(en0, &ssmgroup, &exclsource); err != nil { +// // error handling +// } +// if err := p.LeaveGroup(en0, &ssmgroup); err != nil { +// // error handling +// } +// +// Note that it depends on each platform implementation what happens +// when an application which runs on IGMPv3 unsupported platform uses +// JoinSourceSpecificGroup and LeaveSourceSpecificGroup. +// In general the platform tries to fall back to conversations using +// IGMPv1 or IGMPv2 and starts to listen to multicast traffic. +// In the fallback case, ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup may return an error. +package ipv4 // import "golang.org/x/net/ipv4" diff --git a/vendor/golang.org/x/net/ipv4/endpoint.go b/vendor/golang.org/x/net/ipv4/endpoint.go new file mode 100644 index 0000000000..bc45bf054c --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/endpoint.go @@ -0,0 +1,187 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4 + +import ( + "net" + "syscall" + "time" +) + +// A Conn represents a network endpoint that uses the IPv4 transport. +// It is used to control basic IP-level socket options such as TOS and +// TTL. +type Conn struct { + genericOpt +} + +type genericOpt struct { + net.Conn +} + +func (c *genericOpt) ok() bool { return c != nil && c.Conn != nil } + +// NewConn returns a new Conn. +func NewConn(c net.Conn) *Conn { + return &Conn{ + genericOpt: genericOpt{Conn: c}, + } +} + +// A PacketConn represents a packet network endpoint that uses the +// IPv4 transport. It is used to control several IP-level socket +// options including multicasting. It also provides datagram based +// network I/O methods specific to the IPv4 and higher layer protocols +// such as UDP. +type PacketConn struct { + genericOpt + dgramOpt + payloadHandler +} + +type dgramOpt struct { + net.PacketConn +} + +func (c *dgramOpt) ok() bool { return c != nil && c.PacketConn != nil } + +// SetControlMessage sets the per packet IP-level socket options. +func (c *PacketConn) SetControlMessage(cf ControlFlags, on bool) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + fd, err := c.payloadHandler.sysfd() + if err != nil { + return err + } + return setControlMessage(fd, &c.payloadHandler.rawOpt, cf, on) +} + +// SetDeadline sets the read and write deadlines associated with the +// endpoint. +func (c *PacketConn) SetDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.PacketConn.SetDeadline(t) +} + +// SetReadDeadline sets the read deadline associated with the +// endpoint. +func (c *PacketConn) SetReadDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.PacketConn.SetReadDeadline(t) +} + +// SetWriteDeadline sets the write deadline associated with the +// endpoint. +func (c *PacketConn) SetWriteDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.PacketConn.SetWriteDeadline(t) +} + +// Close closes the endpoint. +func (c *PacketConn) Close() error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.PacketConn.Close() +} + +// NewPacketConn returns a new PacketConn using c as its underlying +// transport. +func NewPacketConn(c net.PacketConn) *PacketConn { + p := &PacketConn{ + genericOpt: genericOpt{Conn: c.(net.Conn)}, + dgramOpt: dgramOpt{PacketConn: c}, + payloadHandler: payloadHandler{PacketConn: c}, + } + if _, ok := c.(*net.IPConn); ok && sockOpts[ssoStripHeader].name > 0 { + if fd, err := p.payloadHandler.sysfd(); err == nil { + setInt(fd, &sockOpts[ssoStripHeader], boolint(true)) + } + } + return p +} + +// A RawConn represents a packet network endpoint that uses the IPv4 +// transport. It is used to control several IP-level socket options +// including IPv4 header manipulation. It also provides datagram +// based network I/O methods specific to the IPv4 and higher layer +// protocols that handle IPv4 datagram directly such as OSPF, GRE. +type RawConn struct { + genericOpt + dgramOpt + packetHandler +} + +// SetControlMessage sets the per packet IP-level socket options. +func (c *RawConn) SetControlMessage(cf ControlFlags, on bool) error { + if !c.packetHandler.ok() { + return syscall.EINVAL + } + fd, err := c.packetHandler.sysfd() + if err != nil { + return err + } + return setControlMessage(fd, &c.packetHandler.rawOpt, cf, on) +} + +// SetDeadline sets the read and write deadlines associated with the +// endpoint. +func (c *RawConn) SetDeadline(t time.Time) error { + if !c.packetHandler.ok() { + return syscall.EINVAL + } + return c.packetHandler.c.SetDeadline(t) +} + +// SetReadDeadline sets the read deadline associated with the +// endpoint. +func (c *RawConn) SetReadDeadline(t time.Time) error { + if !c.packetHandler.ok() { + return syscall.EINVAL + } + return c.packetHandler.c.SetReadDeadline(t) +} + +// SetWriteDeadline sets the write deadline associated with the +// endpoint. +func (c *RawConn) SetWriteDeadline(t time.Time) error { + if !c.packetHandler.ok() { + return syscall.EINVAL + } + return c.packetHandler.c.SetWriteDeadline(t) +} + +// Close closes the endpoint. +func (c *RawConn) Close() error { + if !c.packetHandler.ok() { + return syscall.EINVAL + } + return c.packetHandler.c.Close() +} + +// NewRawConn returns a new RawConn using c as its underlying +// transport. +func NewRawConn(c net.PacketConn) (*RawConn, error) { + r := &RawConn{ + genericOpt: genericOpt{Conn: c.(net.Conn)}, + dgramOpt: dgramOpt{PacketConn: c}, + packetHandler: packetHandler{c: c.(*net.IPConn)}, + } + fd, err := r.packetHandler.sysfd() + if err != nil { + return nil, err + } + if err := setInt(fd, &sockOpts[ssoHeaderPrepend], boolint(true)); err != nil { + return nil, err + } + return r, nil +} diff --git a/vendor/golang.org/x/net/ipv4/example_test.go b/vendor/golang.org/x/net/ipv4/example_test.go new file mode 100644 index 0000000000..4f5e2f3121 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/example_test.go @@ -0,0 +1,224 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4_test + +import ( + "fmt" + "log" + "net" + "os" + "runtime" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/ipv4" +) + +func ExampleConn_markingTCP() { + ln, err := net.Listen("tcp", "0.0.0.0:1024") + if err != nil { + log.Fatal(err) + } + defer ln.Close() + + for { + c, err := ln.Accept() + if err != nil { + log.Fatal(err) + } + go func(c net.Conn) { + defer c.Close() + if c.RemoteAddr().(*net.TCPAddr).IP.To4() != nil { + p := ipv4.NewConn(c) + if err := p.SetTOS(0x28); err != nil { // DSCP AF11 + log.Fatal(err) + } + if err := p.SetTTL(128); err != nil { + log.Fatal(err) + } + } + if _, err := c.Write([]byte("HELLO-R-U-THERE-ACK")); err != nil { + log.Fatal(err) + } + }(c) + } +} + +func ExamplePacketConn_servingOneShotMulticastDNS() { + c, err := net.ListenPacket("udp4", "0.0.0.0:5353") // mDNS over UDP + if err != nil { + log.Fatal(err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + + en0, err := net.InterfaceByName("en0") + if err != nil { + log.Fatal(err) + } + mDNSLinkLocal := net.UDPAddr{IP: net.IPv4(224, 0, 0, 251)} + if err := p.JoinGroup(en0, &mDNSLinkLocal); err != nil { + log.Fatal(err) + } + defer p.LeaveGroup(en0, &mDNSLinkLocal) + if err := p.SetControlMessage(ipv4.FlagDst, true); err != nil { + log.Fatal(err) + } + + b := make([]byte, 1500) + for { + _, cm, peer, err := p.ReadFrom(b) + if err != nil { + log.Fatal(err) + } + if !cm.Dst.IsMulticast() || !cm.Dst.Equal(mDNSLinkLocal.IP) { + continue + } + answers := []byte("FAKE-MDNS-ANSWERS") // fake mDNS answers, you need to implement this + if _, err := p.WriteTo(answers, nil, peer); err != nil { + log.Fatal(err) + } + } +} + +func ExamplePacketConn_tracingIPPacketRoute() { + // Tracing an IP packet route to www.google.com. + + const host = "www.google.com" + ips, err := net.LookupIP(host) + if err != nil { + log.Fatal(err) + } + var dst net.IPAddr + for _, ip := range ips { + if ip.To4() != nil { + dst.IP = ip + fmt.Printf("using %v for tracing an IP packet route to %s\n", dst.IP, host) + break + } + } + if dst.IP == nil { + log.Fatal("no A record found") + } + + c, err := net.ListenPacket("ip4:1", "0.0.0.0") // ICMP for IPv4 + if err != nil { + log.Fatal(err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + + if err := p.SetControlMessage(ipv4.FlagTTL|ipv4.FlagSrc|ipv4.FlagDst|ipv4.FlagInterface, true); err != nil { + log.Fatal(err) + } + wm := icmp.Message{ + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, + Data: []byte("HELLO-R-U-THERE"), + }, + } + + rb := make([]byte, 1500) + for i := 1; i <= 64; i++ { // up to 64 hops + wm.Body.(*icmp.Echo).Seq = i + wb, err := wm.Marshal(nil) + if err != nil { + log.Fatal(err) + } + if err := p.SetTTL(i); err != nil { + log.Fatal(err) + } + + // In the real world usually there are several + // multiple traffic-engineered paths for each hop. + // You may need to probe a few times to each hop. + begin := time.Now() + if _, err := p.WriteTo(wb, nil, &dst); err != nil { + log.Fatal(err) + } + if err := p.SetReadDeadline(time.Now().Add(3 * time.Second)); err != nil { + log.Fatal(err) + } + n, cm, peer, err := p.ReadFrom(rb) + if err != nil { + if err, ok := err.(net.Error); ok && err.Timeout() { + fmt.Printf("%v\t*\n", i) + continue + } + log.Fatal(err) + } + rm, err := icmp.ParseMessage(1, rb[:n]) + if err != nil { + log.Fatal(err) + } + rtt := time.Since(begin) + + // In the real world you need to determine whether the + // received message is yours using ControlMessage.Src, + // ControlMessage.Dst, icmp.Echo.ID and icmp.Echo.Seq. + switch rm.Type { + case ipv4.ICMPTypeTimeExceeded: + names, _ := net.LookupAddr(peer.String()) + fmt.Printf("%d\t%v %+v %v\n\t%+v\n", i, peer, names, rtt, cm) + case ipv4.ICMPTypeEchoReply: + names, _ := net.LookupAddr(peer.String()) + fmt.Printf("%d\t%v %+v %v\n\t%+v\n", i, peer, names, rtt, cm) + return + default: + log.Printf("unknown ICMP message: %+v\n", rm) + } + } +} + +func ExampleRawConn_advertisingOSPFHello() { + c, err := net.ListenPacket("ip4:89", "0.0.0.0") // OSPF for IPv4 + if err != nil { + log.Fatal(err) + } + defer c.Close() + r, err := ipv4.NewRawConn(c) + if err != nil { + log.Fatal(err) + } + + en0, err := net.InterfaceByName("en0") + if err != nil { + log.Fatal(err) + } + allSPFRouters := net.IPAddr{IP: net.IPv4(224, 0, 0, 5)} + if err := r.JoinGroup(en0, &allSPFRouters); err != nil { + log.Fatal(err) + } + defer r.LeaveGroup(en0, &allSPFRouters) + + hello := make([]byte, 24) // fake hello data, you need to implement this + ospf := make([]byte, 24) // fake ospf header, you need to implement this + ospf[0] = 2 // version 2 + ospf[1] = 1 // hello packet + ospf = append(ospf, hello...) + iph := &ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TOS: 0xc0, // DSCP CS6 + TotalLen: ipv4.HeaderLen + len(ospf), + TTL: 1, + Protocol: 89, + Dst: allSPFRouters.IP.To4(), + } + + var cm *ipv4.ControlMessage + switch runtime.GOOS { + case "darwin", "linux": + cm = &ipv4.ControlMessage{IfIndex: en0.Index} + default: + if err := r.SetMulticastInterface(en0); err != nil { + log.Fatal(err) + } + } + if err := r.WriteTo(iph, ospf, cm); err != nil { + log.Fatal(err) + } +} diff --git a/vendor/golang.org/x/net/ipv4/gen.go b/vendor/golang.org/x/net/ipv4/gen.go new file mode 100644 index 0000000000..4785212a7b --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/gen.go @@ -0,0 +1,208 @@ +// Copyright 2013 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 + +//go:generate go run gen.go + +// This program generates system adaptation constants and types, +// internet protocol constants and tables by reading template files +// and IANA protocol registries. +package main + +import ( + "bytes" + "encoding/xml" + "fmt" + "go/format" + "io" + "io/ioutil" + "net/http" + "os" + "os/exec" + "runtime" + "strconv" + "strings" +) + +func main() { + if err := genzsys(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + if err := geniana(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func genzsys() error { + defs := "defs_" + runtime.GOOS + ".go" + f, err := os.Open(defs) + if err != nil { + if os.IsNotExist(err) { + return nil + } + return err + } + f.Close() + cmd := exec.Command("go", "tool", "cgo", "-godefs", defs) + b, err := cmd.Output() + if err != nil { + return err + } + // The ipv4 pacakge still supports go1.2, and so we need to + // take care of additional platforms in go1.3 and above for + // working with go1.2. + switch { + case runtime.GOOS == "dragonfly" || runtime.GOOS == "solaris": + b = bytes.Replace(b, []byte("package ipv4\n"), []byte("// +build "+runtime.GOOS+"\n\npackage ipv4\n"), 1) + case runtime.GOOS == "linux" && (runtime.GOARCH == "arm64" || runtime.GOARCH == "mips64" || runtime.GOARCH == "mips64le" || runtime.GOARCH == "ppc64" || runtime.GOARCH == "ppc64le"): + b = bytes.Replace(b, []byte("package ipv4\n"), []byte("// +build "+runtime.GOOS+","+runtime.GOARCH+"\n\npackage ipv4\n"), 1) + } + b, err = format.Source(b) + if err != nil { + return err + } + zsys := "zsys_" + runtime.GOOS + ".go" + switch runtime.GOOS { + case "freebsd", "linux": + zsys = "zsys_" + runtime.GOOS + "_" + runtime.GOARCH + ".go" + } + if err := ioutil.WriteFile(zsys, b, 0644); err != nil { + return err + } + return nil +} + +var registries = []struct { + url string + parse func(io.Writer, io.Reader) error +}{ + { + "http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xml", + parseICMPv4Parameters, + }, +} + +func geniana() error { + var bb bytes.Buffer + fmt.Fprintf(&bb, "// go generate gen.go\n") + fmt.Fprintf(&bb, "// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n") + fmt.Fprintf(&bb, "package ipv4\n\n") + for _, r := range registries { + resp, err := http.Get(r.url) + if err != nil { + return err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("got HTTP status code %v for %v\n", resp.StatusCode, r.url) + } + if err := r.parse(&bb, resp.Body); err != nil { + return err + } + fmt.Fprintf(&bb, "\n") + } + b, err := format.Source(bb.Bytes()) + if err != nil { + return err + } + if err := ioutil.WriteFile("iana.go", b, 0644); err != nil { + return err + } + return nil +} + +func parseICMPv4Parameters(w io.Writer, r io.Reader) error { + dec := xml.NewDecoder(r) + var icp icmpv4Parameters + if err := dec.Decode(&icp); err != nil { + return err + } + prs := icp.escape() + fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) + fmt.Fprintf(w, "const (\n") + for _, pr := range prs { + if pr.Descr == "" { + continue + } + fmt.Fprintf(w, "ICMPType%s ICMPType = %d", pr.Descr, pr.Value) + fmt.Fprintf(w, "// %s\n", pr.OrigDescr) + } + fmt.Fprintf(w, ")\n\n") + fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) + fmt.Fprintf(w, "var icmpTypes = map[ICMPType]string{\n") + for _, pr := range prs { + if pr.Descr == "" { + continue + } + fmt.Fprintf(w, "%d: %q,\n", pr.Value, strings.ToLower(pr.OrigDescr)) + } + fmt.Fprintf(w, "}\n") + return nil +} + +type icmpv4Parameters struct { + XMLName xml.Name `xml:"registry"` + Title string `xml:"title"` + Updated string `xml:"updated"` + Registries []struct { + Title string `xml:"title"` + Records []struct { + Value string `xml:"value"` + Descr string `xml:"description"` + } `xml:"record"` + } `xml:"registry"` +} + +type canonICMPv4ParamRecord struct { + OrigDescr string + Descr string + Value int +} + +func (icp *icmpv4Parameters) escape() []canonICMPv4ParamRecord { + id := -1 + for i, r := range icp.Registries { + if strings.Contains(r.Title, "Type") || strings.Contains(r.Title, "type") { + id = i + break + } + } + if id < 0 { + return nil + } + prs := make([]canonICMPv4ParamRecord, len(icp.Registries[id].Records)) + sr := strings.NewReplacer( + "Messages", "", + "Message", "", + "ICMP", "", + "+", "P", + "-", "", + "/", "", + ".", "", + " ", "", + ) + for i, pr := range icp.Registries[id].Records { + if strings.Contains(pr.Descr, "Reserved") || + strings.Contains(pr.Descr, "Unassigned") || + strings.Contains(pr.Descr, "Deprecated") || + strings.Contains(pr.Descr, "Experiment") || + strings.Contains(pr.Descr, "experiment") { + continue + } + ss := strings.Split(pr.Descr, "\n") + if len(ss) > 1 { + prs[i].Descr = strings.Join(ss, " ") + } else { + prs[i].Descr = ss[0] + } + s := strings.TrimSpace(prs[i].Descr) + prs[i].OrigDescr = s + prs[i].Descr = sr.Replace(s) + prs[i].Value, _ = strconv.Atoi(pr.Value) + } + return prs +} diff --git a/vendor/golang.org/x/net/ipv4/genericopt_posix.go b/vendor/golang.org/x/net/ipv4/genericopt_posix.go new file mode 100644 index 0000000000..fefa0be36b --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/genericopt_posix.go @@ -0,0 +1,59 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd windows + +package ipv4 + +import "syscall" + +// TOS returns the type-of-service field value for outgoing packets. +func (c *genericOpt) TOS() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return 0, err + } + return getInt(fd, &sockOpts[ssoTOS]) +} + +// SetTOS sets the type-of-service field value for future outgoing +// packets. +func (c *genericOpt) SetTOS(tos int) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + return setInt(fd, &sockOpts[ssoTOS], tos) +} + +// TTL returns the time-to-live field value for outgoing packets. +func (c *genericOpt) TTL() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return 0, err + } + return getInt(fd, &sockOpts[ssoTTL]) +} + +// SetTTL sets the time-to-live field value for future outgoing +// packets. +func (c *genericOpt) SetTTL(ttl int) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + return setInt(fd, &sockOpts[ssoTTL], ttl) +} diff --git a/vendor/golang.org/x/net/ipv4/genericopt_stub.go b/vendor/golang.org/x/net/ipv4/genericopt_stub.go new file mode 100644 index 0000000000..1817badb17 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/genericopt_stub.go @@ -0,0 +1,29 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build nacl plan9 solaris + +package ipv4 + +// TOS returns the type-of-service field value for outgoing packets. +func (c *genericOpt) TOS() (int, error) { + return 0, errOpNoSupport +} + +// SetTOS sets the type-of-service field value for future outgoing +// packets. +func (c *genericOpt) SetTOS(tos int) error { + return errOpNoSupport +} + +// TTL returns the time-to-live field value for outgoing packets. +func (c *genericOpt) TTL() (int, error) { + return 0, errOpNoSupport +} + +// SetTTL sets the time-to-live field value for future outgoing +// packets. +func (c *genericOpt) SetTTL(ttl int) error { + return errOpNoSupport +} diff --git a/vendor/golang.org/x/net/ipv4/header.go b/vendor/golang.org/x/net/ipv4/header.go new file mode 100644 index 0000000000..363d9c21a6 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/header.go @@ -0,0 +1,132 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4 + +import ( + "encoding/binary" + "fmt" + "net" + "runtime" + "syscall" +) + +const ( + Version = 4 // protocol version + HeaderLen = 20 // header length without extension headers + maxHeaderLen = 60 // sensible default, revisit if later RFCs define new usage of version and header length fields +) + +type HeaderFlags int + +const ( + MoreFragments HeaderFlags = 1 << iota // more fragments flag + DontFragment // don't fragment flag +) + +// A Header represents an IPv4 header. +type Header struct { + Version int // protocol version + Len int // header length + TOS int // type-of-service + TotalLen int // packet total length + ID int // identification + Flags HeaderFlags // flags + FragOff int // fragment offset + TTL int // time-to-live + Protocol int // next protocol + Checksum int // checksum + Src net.IP // source address + Dst net.IP // destination address + Options []byte // options, extension headers +} + +func (h *Header) String() string { + if h == nil { + return "" + } + return fmt.Sprintf("ver=%d hdrlen=%d tos=%#x totallen=%d id=%#x flags=%#x fragoff=%#x ttl=%d proto=%d cksum=%#x src=%v dst=%v", h.Version, h.Len, h.TOS, h.TotalLen, h.ID, h.Flags, h.FragOff, h.TTL, h.Protocol, h.Checksum, h.Src, h.Dst) +} + +// Marshal returns the binary encoding of the IPv4 header h. +func (h *Header) Marshal() ([]byte, error) { + if h == nil { + return nil, syscall.EINVAL + } + if h.Len < HeaderLen { + return nil, errHeaderTooShort + } + hdrlen := HeaderLen + len(h.Options) + b := make([]byte, hdrlen) + b[0] = byte(Version<<4 | (hdrlen >> 2 & 0x0f)) + b[1] = byte(h.TOS) + flagsAndFragOff := (h.FragOff & 0x1fff) | int(h.Flags<<13) + switch runtime.GOOS { + case "darwin", "dragonfly", "freebsd", "netbsd": + nativeEndian.PutUint16(b[2:4], uint16(h.TotalLen)) + nativeEndian.PutUint16(b[6:8], uint16(flagsAndFragOff)) + default: + binary.BigEndian.PutUint16(b[2:4], uint16(h.TotalLen)) + binary.BigEndian.PutUint16(b[6:8], uint16(flagsAndFragOff)) + } + binary.BigEndian.PutUint16(b[4:6], uint16(h.ID)) + b[8] = byte(h.TTL) + b[9] = byte(h.Protocol) + binary.BigEndian.PutUint16(b[10:12], uint16(h.Checksum)) + if ip := h.Src.To4(); ip != nil { + copy(b[12:16], ip[:net.IPv4len]) + } + if ip := h.Dst.To4(); ip != nil { + copy(b[16:20], ip[:net.IPv4len]) + } else { + return nil, errMissingAddress + } + if len(h.Options) > 0 { + copy(b[HeaderLen:], h.Options) + } + return b, nil +} + +// ParseHeader parses b as an IPv4 header. +func ParseHeader(b []byte) (*Header, error) { + if len(b) < HeaderLen { + return nil, errHeaderTooShort + } + hdrlen := int(b[0]&0x0f) << 2 + if hdrlen > len(b) { + return nil, errBufferTooShort + } + h := &Header{ + Version: int(b[0] >> 4), + Len: hdrlen, + TOS: int(b[1]), + ID: int(binary.BigEndian.Uint16(b[4:6])), + TTL: int(b[8]), + Protocol: int(b[9]), + Checksum: int(binary.BigEndian.Uint16(b[10:12])), + Src: net.IPv4(b[12], b[13], b[14], b[15]), + Dst: net.IPv4(b[16], b[17], b[18], b[19]), + } + switch runtime.GOOS { + case "darwin", "dragonfly", "netbsd": + h.TotalLen = int(nativeEndian.Uint16(b[2:4])) + hdrlen + h.FragOff = int(nativeEndian.Uint16(b[6:8])) + case "freebsd": + h.TotalLen = int(nativeEndian.Uint16(b[2:4])) + if freebsdVersion < 1000000 { + h.TotalLen += hdrlen + } + h.FragOff = int(nativeEndian.Uint16(b[6:8])) + default: + h.TotalLen = int(binary.BigEndian.Uint16(b[2:4])) + h.FragOff = int(binary.BigEndian.Uint16(b[6:8])) + } + h.Flags = HeaderFlags(h.FragOff&0xe000) >> 13 + h.FragOff = h.FragOff & 0x1fff + if hdrlen-HeaderLen > 0 { + h.Options = make([]byte, hdrlen-HeaderLen) + copy(h.Options, b[HeaderLen:]) + } + return h, nil +} diff --git a/vendor/golang.org/x/net/ipv4/header_test.go b/vendor/golang.org/x/net/ipv4/header_test.go new file mode 100644 index 0000000000..ac89358cb7 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/header_test.go @@ -0,0 +1,119 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4 + +import ( + "bytes" + "net" + "reflect" + "runtime" + "strings" + "testing" +) + +var ( + wireHeaderFromKernel = [HeaderLen]byte{ + 0x45, 0x01, 0xbe, 0xef, + 0xca, 0xfe, 0x45, 0xdc, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + } + wireHeaderToKernel = [HeaderLen]byte{ + 0x45, 0x01, 0xbe, 0xef, + 0xca, 0xfe, 0x45, 0xdc, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + } + wireHeaderFromTradBSDKernel = [HeaderLen]byte{ + 0x45, 0x01, 0xdb, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + } + wireHeaderFromFreeBSD10Kernel = [HeaderLen]byte{ + 0x45, 0x01, 0xef, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + } + wireHeaderToTradBSDKernel = [HeaderLen]byte{ + 0x45, 0x01, 0xef, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + } + // TODO(mikio): Add platform dependent wire header formats when + // we support new platforms. + + testHeader = &Header{ + Version: Version, + Len: HeaderLen, + TOS: 1, + TotalLen: 0xbeef, + ID: 0xcafe, + Flags: DontFragment, + FragOff: 1500, + TTL: 255, + Protocol: 1, + Checksum: 0xdead, + Src: net.IPv4(172, 16, 254, 254), + Dst: net.IPv4(192, 168, 0, 1), + } +) + +func TestMarshalHeader(t *testing.T) { + b, err := testHeader.Marshal() + if err != nil { + t.Fatal(err) + } + var wh []byte + switch runtime.GOOS { + case "darwin", "dragonfly", "netbsd": + wh = wireHeaderToTradBSDKernel[:] + case "freebsd": + if freebsdVersion < 1000000 { + wh = wireHeaderToTradBSDKernel[:] + } else { + wh = wireHeaderFromFreeBSD10Kernel[:] + } + default: + wh = wireHeaderToKernel[:] + } + if !bytes.Equal(b, wh) { + t.Fatalf("got %#v; want %#v", b, wh) + } +} + +func TestParseHeader(t *testing.T) { + var wh []byte + switch runtime.GOOS { + case "darwin", "dragonfly", "netbsd": + wh = wireHeaderFromTradBSDKernel[:] + case "freebsd": + if freebsdVersion < 1000000 { + wh = wireHeaderFromTradBSDKernel[:] + } else { + wh = wireHeaderFromFreeBSD10Kernel[:] + } + default: + wh = wireHeaderFromKernel[:] + } + h, err := ParseHeader(wh) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(h, testHeader) { + t.Fatalf("got %#v; want %#v", h, testHeader) + } + s := h.String() + if strings.Contains(s, ",") { + t.Fatalf("should be space-separated values: %s", s) + } +} diff --git a/vendor/golang.org/x/net/ipv4/helper.go b/vendor/golang.org/x/net/ipv4/helper.go new file mode 100644 index 0000000000..acecfd0d34 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/helper.go @@ -0,0 +1,59 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4 + +import ( + "encoding/binary" + "errors" + "net" + "unsafe" +) + +var ( + errMissingAddress = errors.New("missing address") + errMissingHeader = errors.New("missing header") + errHeaderTooShort = errors.New("header too short") + errBufferTooShort = errors.New("buffer too short") + errInvalidConnType = errors.New("invalid conn type") + errOpNoSupport = errors.New("operation not supported") + errNoSuchInterface = errors.New("no such interface") + errNoSuchMulticastInterface = errors.New("no such multicast interface") + + // See http://www.freebsd.org/doc/en/books/porters-handbook/freebsd-versions.html. + freebsdVersion uint32 + + nativeEndian binary.ByteOrder +) + +func init() { + i := uint32(1) + b := (*[4]byte)(unsafe.Pointer(&i)) + if b[0] == 1 { + nativeEndian = binary.LittleEndian + } else { + nativeEndian = binary.BigEndian + } +} + +func boolint(b bool) int { + if b { + return 1 + } + return 0 +} + +func netAddrToIP4(a net.Addr) net.IP { + switch v := a.(type) { + case *net.UDPAddr: + if ip := v.IP.To4(); ip != nil { + return ip + } + case *net.IPAddr: + if ip := v.IP.To4(); ip != nil { + return ip + } + } + return nil +} diff --git a/vendor/golang.org/x/net/ipv4/helper_stub.go b/vendor/golang.org/x/net/ipv4/helper_stub.go new file mode 100644 index 0000000000..dc2120cf2f --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/helper_stub.go @@ -0,0 +1,23 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build nacl plan9 solaris + +package ipv4 + +func (c *genericOpt) sysfd() (int, error) { + return 0, errOpNoSupport +} + +func (c *dgramOpt) sysfd() (int, error) { + return 0, errOpNoSupport +} + +func (c *payloadHandler) sysfd() (int, error) { + return 0, errOpNoSupport +} + +func (c *packetHandler) sysfd() (int, error) { + return 0, errOpNoSupport +} diff --git a/vendor/golang.org/x/net/ipv4/helper_unix.go b/vendor/golang.org/x/net/ipv4/helper_unix.go new file mode 100644 index 0000000000..345ca7dc7f --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/helper_unix.go @@ -0,0 +1,50 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd + +package ipv4 + +import ( + "net" + "reflect" +) + +func (c *genericOpt) sysfd() (int, error) { + switch p := c.Conn.(type) { + case *net.TCPConn, *net.UDPConn, *net.IPConn: + return sysfd(p) + } + return 0, errInvalidConnType +} + +func (c *dgramOpt) sysfd() (int, error) { + switch p := c.PacketConn.(type) { + case *net.UDPConn, *net.IPConn: + return sysfd(p.(net.Conn)) + } + return 0, errInvalidConnType +} + +func (c *payloadHandler) sysfd() (int, error) { + return sysfd(c.PacketConn.(net.Conn)) +} + +func (c *packetHandler) sysfd() (int, error) { + return sysfd(c.c) +} + +func sysfd(c net.Conn) (int, error) { + cv := reflect.ValueOf(c) + switch ce := cv.Elem(); ce.Kind() { + case reflect.Struct: + netfd := ce.FieldByName("conn").FieldByName("fd") + switch fe := netfd.Elem(); fe.Kind() { + case reflect.Struct: + fd := fe.FieldByName("sysfd") + return int(fd.Int()), nil + } + } + return 0, errInvalidConnType +} diff --git a/vendor/golang.org/x/net/ipv4/helper_windows.go b/vendor/golang.org/x/net/ipv4/helper_windows.go new file mode 100644 index 0000000000..322b2a5e43 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/helper_windows.go @@ -0,0 +1,49 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4 + +import ( + "net" + "reflect" + "syscall" +) + +func (c *genericOpt) sysfd() (syscall.Handle, error) { + switch p := c.Conn.(type) { + case *net.TCPConn, *net.UDPConn, *net.IPConn: + return sysfd(p) + } + return syscall.InvalidHandle, errInvalidConnType +} + +func (c *dgramOpt) sysfd() (syscall.Handle, error) { + switch p := c.PacketConn.(type) { + case *net.UDPConn, *net.IPConn: + return sysfd(p.(net.Conn)) + } + return syscall.InvalidHandle, errInvalidConnType +} + +func (c *payloadHandler) sysfd() (syscall.Handle, error) { + return sysfd(c.PacketConn.(net.Conn)) +} + +func (c *packetHandler) sysfd() (syscall.Handle, error) { + return sysfd(c.c) +} + +func sysfd(c net.Conn) (syscall.Handle, error) { + cv := reflect.ValueOf(c) + switch ce := cv.Elem(); ce.Kind() { + case reflect.Struct: + netfd := ce.FieldByName("conn").FieldByName("fd") + switch fe := netfd.Elem(); fe.Kind() { + case reflect.Struct: + fd := fe.FieldByName("sysfd") + return syscall.Handle(fd.Uint()), nil + } + } + return syscall.InvalidHandle, errInvalidConnType +} diff --git a/vendor/golang.org/x/net/ipv4/iana.go b/vendor/golang.org/x/net/ipv4/iana.go new file mode 100644 index 0000000000..be10c94888 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/iana.go @@ -0,0 +1,34 @@ +// go generate gen.go +// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +package ipv4 + +// Internet Control Message Protocol (ICMP) Parameters, Updated: 2013-04-19 +const ( + ICMPTypeEchoReply ICMPType = 0 // Echo Reply + ICMPTypeDestinationUnreachable ICMPType = 3 // Destination Unreachable + ICMPTypeRedirect ICMPType = 5 // Redirect + ICMPTypeEcho ICMPType = 8 // Echo + ICMPTypeRouterAdvertisement ICMPType = 9 // Router Advertisement + ICMPTypeRouterSolicitation ICMPType = 10 // Router Solicitation + ICMPTypeTimeExceeded ICMPType = 11 // Time Exceeded + ICMPTypeParameterProblem ICMPType = 12 // Parameter Problem + ICMPTypeTimestamp ICMPType = 13 // Timestamp + ICMPTypeTimestampReply ICMPType = 14 // Timestamp Reply + ICMPTypePhoturis ICMPType = 40 // Photuris +) + +// Internet Control Message Protocol (ICMP) Parameters, Updated: 2013-04-19 +var icmpTypes = map[ICMPType]string{ + 0: "echo reply", + 3: "destination unreachable", + 5: "redirect", + 8: "echo", + 9: "router advertisement", + 10: "router solicitation", + 11: "time exceeded", + 12: "parameter problem", + 13: "timestamp", + 14: "timestamp reply", + 40: "photuris", +} diff --git a/vendor/golang.org/x/net/ipv4/icmp.go b/vendor/golang.org/x/net/ipv4/icmp.go new file mode 100644 index 0000000000..dbd05cff2c --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/icmp.go @@ -0,0 +1,57 @@ +// Copyright 2013 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 ipv4 + +import "golang.org/x/net/internal/iana" + +// An ICMPType represents a type of ICMP message. +type ICMPType int + +func (typ ICMPType) String() string { + s, ok := icmpTypes[typ] + if !ok { + return "" + } + return s +} + +// Protocol returns the ICMPv4 protocol number. +func (typ ICMPType) Protocol() int { + return iana.ProtocolICMP +} + +// An ICMPFilter represents an ICMP message filter for incoming +// packets. The filter belongs to a packet delivery path on a host and +// it cannot interact with forwarding packets or tunnel-outer packets. +// +// Note: RFC 2460 defines a reasonable role model and it works not +// only for IPv6 but IPv4. A node means a device that implements IP. +// A router means a node that forwards IP packets not explicitly +// addressed to itself, and a host means a node that is not a router. +type ICMPFilter struct { + sysICMPFilter +} + +// Accept accepts incoming ICMP packets including the type field value +// typ. +func (f *ICMPFilter) Accept(typ ICMPType) { + f.accept(typ) +} + +// Block blocks incoming ICMP packets including the type field value +// typ. +func (f *ICMPFilter) Block(typ ICMPType) { + f.block(typ) +} + +// SetAll sets the filter action to the filter. +func (f *ICMPFilter) SetAll(block bool) { + f.setAll(block) +} + +// WillBlock reports whether the ICMP type will be blocked. +func (f *ICMPFilter) WillBlock(typ ICMPType) bool { + return f.willBlock(typ) +} diff --git a/vendor/golang.org/x/net/ipv4/icmp_linux.go b/vendor/golang.org/x/net/ipv4/icmp_linux.go new file mode 100644 index 0000000000..c912253354 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/icmp_linux.go @@ -0,0 +1,25 @@ +// 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 ipv4 + +func (f *sysICMPFilter) accept(typ ICMPType) { + f.Data &^= 1 << (uint32(typ) & 31) +} + +func (f *sysICMPFilter) block(typ ICMPType) { + f.Data |= 1 << (uint32(typ) & 31) +} + +func (f *sysICMPFilter) setAll(block bool) { + if block { + f.Data = 1<<32 - 1 + } else { + f.Data = 0 + } +} + +func (f *sysICMPFilter) willBlock(typ ICMPType) bool { + return f.Data&(1<<(uint32(typ)&31)) != 0 +} diff --git a/vendor/golang.org/x/net/ipv4/icmp_stub.go b/vendor/golang.org/x/net/ipv4/icmp_stub.go new file mode 100644 index 0000000000..9ee9b6a329 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/icmp_stub.go @@ -0,0 +1,25 @@ +// 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 !linux + +package ipv4 + +const sysSizeofICMPFilter = 0x0 + +type sysICMPFilter struct { +} + +func (f *sysICMPFilter) accept(typ ICMPType) { +} + +func (f *sysICMPFilter) block(typ ICMPType) { +} + +func (f *sysICMPFilter) setAll(block bool) { +} + +func (f *sysICMPFilter) willBlock(typ ICMPType) bool { + return false +} diff --git a/vendor/golang.org/x/net/ipv4/icmp_test.go b/vendor/golang.org/x/net/ipv4/icmp_test.go new file mode 100644 index 0000000000..3324b54df6 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/icmp_test.go @@ -0,0 +1,95 @@ +// 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 ipv4_test + +import ( + "net" + "reflect" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +var icmpStringTests = []struct { + in ipv4.ICMPType + out string +}{ + {ipv4.ICMPTypeDestinationUnreachable, "destination unreachable"}, + + {256, ""}, +} + +func TestICMPString(t *testing.T) { + for _, tt := range icmpStringTests { + s := tt.in.String() + if s != tt.out { + t.Errorf("got %s; want %s", s, tt.out) + } + } +} + +func TestICMPFilter(t *testing.T) { + switch runtime.GOOS { + case "linux": + default: + t.Skipf("not supported on %s", runtime.GOOS) + } + + var f ipv4.ICMPFilter + for _, toggle := range []bool{false, true} { + f.SetAll(toggle) + for _, typ := range []ipv4.ICMPType{ + ipv4.ICMPTypeDestinationUnreachable, + ipv4.ICMPTypeEchoReply, + ipv4.ICMPTypeTimeExceeded, + ipv4.ICMPTypeParameterProblem, + } { + f.Accept(typ) + if f.WillBlock(typ) { + t.Errorf("ipv4.ICMPFilter.Set(%v, false) failed", typ) + } + f.Block(typ) + if !f.WillBlock(typ) { + t.Errorf("ipv4.ICMPFilter.Set(%v, true) failed", typ) + } + } + } +} + +func TestSetICMPFilter(t *testing.T) { + switch runtime.GOOS { + case "linux": + default: + t.Skipf("not supported on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + c, err := net.ListenPacket("ip4:icmp", "127.0.0.1") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv4.NewPacketConn(c) + + var f ipv4.ICMPFilter + f.SetAll(true) + f.Accept(ipv4.ICMPTypeEcho) + f.Accept(ipv4.ICMPTypeEchoReply) + if err := p.SetICMPFilter(&f); err != nil { + t.Fatal(err) + } + kf, err := p.ICMPFilter() + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(kf, &f) { + t.Fatalf("got %#v; want %#v", kf, f) + } +} diff --git a/vendor/golang.org/x/net/ipv4/mocktransponder_test.go b/vendor/golang.org/x/net/ipv4/mocktransponder_test.go new file mode 100644 index 0000000000..e55aaee918 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/mocktransponder_test.go @@ -0,0 +1,21 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4_test + +import ( + "net" + "testing" +) + +func acceptor(t *testing.T, ln net.Listener, done chan<- bool) { + defer func() { done <- true }() + + c, err := ln.Accept() + if err != nil { + t.Error(err) + return + } + c.Close() +} diff --git a/vendor/golang.org/x/net/ipv4/multicast_test.go b/vendor/golang.org/x/net/ipv4/multicast_test.go new file mode 100644 index 0000000000..d2bcf8533b --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/multicast_test.go @@ -0,0 +1,330 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4_test + +import ( + "bytes" + "net" + "os" + "runtime" + "testing" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +var packetConnReadWriteMulticastUDPTests = []struct { + addr string + grp, src *net.UDPAddr +}{ + {"224.0.0.0:0", &net.UDPAddr{IP: net.IPv4(224, 0, 0, 254)}, nil}, // see RFC 4727 + + {"232.0.1.0:0", &net.UDPAddr{IP: net.IPv4(232, 0, 1, 254)}, &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 +} + +func TestPacketConnReadWriteMulticastUDP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + for _, tt := range packetConnReadWriteMulticastUDPTests { + c, err := net.ListenPacket("udp4", tt.addr) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + grp := *tt.grp + grp.Port = c.LocalAddr().(*net.UDPAddr).Port + p := ipv4.NewPacketConn(c) + defer p.Close() + if tt.src == nil { + if err := p.JoinGroup(ifi, &grp); err != nil { + t.Fatal(err) + } + defer p.LeaveGroup(ifi, &grp) + } else { + if err := p.JoinSourceSpecificGroup(ifi, &grp, tt.src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support IGMPv2/3 fail here + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + defer p.LeaveSourceSpecificGroup(ifi, &grp, tt.src) + } + if err := p.SetMulticastInterface(ifi); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastInterface(); err != nil { + t.Fatal(err) + } + if err := p.SetMulticastLoopback(true); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastLoopback(); err != nil { + t.Fatal(err) + } + cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface + wb := []byte("HELLO-R-U-THERE") + + for i, toggle := range []bool{true, false, true} { + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { + t.Fatal(err) + } + p.SetMulticastTTL(i + 1) + if n, err := p.WriteTo(wb, nil, &grp); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + if n, _, _, err := p.ReadFrom(rb); err != nil { + t.Fatal(err) + } else if !bytes.Equal(rb[:n], wb) { + t.Fatalf("got %v; want %v", rb[:n], wb) + } + } + } +} + +var packetConnReadWriteMulticastICMPTests = []struct { + grp, src *net.IPAddr +}{ + {&net.IPAddr{IP: net.IPv4(224, 0, 0, 254)}, nil}, // see RFC 4727 + + {&net.IPAddr{IP: net.IPv4(232, 0, 1, 254)}, &net.IPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 +} + +func TestPacketConnReadWriteMulticastICMP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + for _, tt := range packetConnReadWriteMulticastICMPTests { + c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv4.NewPacketConn(c) + defer p.Close() + if tt.src == nil { + if err := p.JoinGroup(ifi, tt.grp); err != nil { + t.Fatal(err) + } + defer p.LeaveGroup(ifi, tt.grp) + } else { + if err := p.JoinSourceSpecificGroup(ifi, tt.grp, tt.src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support IGMPv2/3 fail here + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + defer p.LeaveSourceSpecificGroup(ifi, tt.grp, tt.src) + } + if err := p.SetMulticastInterface(ifi); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastInterface(); err != nil { + t.Fatal(err) + } + if err := p.SetMulticastLoopback(true); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastLoopback(); err != nil { + t.Fatal(err) + } + cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface + + for i, toggle := range []bool{true, false, true} { + wb, err := (&icmp.Message{ + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: i + 1, + Data: []byte("HELLO-R-U-THERE"), + }, + }).Marshal(nil) + if err != nil { + t.Fatal(err) + } + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { + t.Fatal(err) + } + p.SetMulticastTTL(i + 1) + if n, err := p.WriteTo(wb, nil, tt.grp); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + if n, _, _, err := p.ReadFrom(rb); err != nil { + t.Fatal(err) + } else { + m, err := icmp.ParseMessage(iana.ProtocolICMP, rb[:n]) + if err != nil { + t.Fatal(err) + } + switch { + case m.Type == ipv4.ICMPTypeEchoReply && m.Code == 0: // net.inet.icmp.bmcastecho=1 + case m.Type == ipv4.ICMPTypeEcho && m.Code == 0: // net.inet.icmp.bmcastecho=0 + default: + t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) + } + } + } + } +} + +var rawConnReadWriteMulticastICMPTests = []struct { + grp, src *net.IPAddr +}{ + {&net.IPAddr{IP: net.IPv4(224, 0, 0, 254)}, nil}, // see RFC 4727 + + {&net.IPAddr{IP: net.IPv4(232, 0, 1, 254)}, &net.IPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 +} + +func TestRawConnReadWriteMulticastICMP(t *testing.T) { + if testing.Short() { + t.Skip("to avoid external network") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + for _, tt := range rawConnReadWriteMulticastICMPTests { + c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + r, err := ipv4.NewRawConn(c) + if err != nil { + t.Fatal(err) + } + defer r.Close() + if tt.src == nil { + if err := r.JoinGroup(ifi, tt.grp); err != nil { + t.Fatal(err) + } + defer r.LeaveGroup(ifi, tt.grp) + } else { + if err := r.JoinSourceSpecificGroup(ifi, tt.grp, tt.src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support IGMPv2/3 fail here + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + defer r.LeaveSourceSpecificGroup(ifi, tt.grp, tt.src) + } + if err := r.SetMulticastInterface(ifi); err != nil { + t.Fatal(err) + } + if _, err := r.MulticastInterface(); err != nil { + t.Fatal(err) + } + if err := r.SetMulticastLoopback(true); err != nil { + t.Fatal(err) + } + if _, err := r.MulticastLoopback(); err != nil { + t.Fatal(err) + } + cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface + + for i, toggle := range []bool{true, false, true} { + wb, err := (&icmp.Message{ + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: i + 1, + Data: []byte("HELLO-R-U-THERE"), + }, + }).Marshal(nil) + if err != nil { + t.Fatal(err) + } + wh := &ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TOS: i + 1, + TotalLen: ipv4.HeaderLen + len(wb), + Protocol: 1, + Dst: tt.grp.IP, + } + if err := r.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + if err := r.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { + t.Fatal(err) + } + r.SetMulticastTTL(i + 1) + if err := r.WriteTo(wh, wb, nil); err != nil { + t.Fatal(err) + } + rb := make([]byte, ipv4.HeaderLen+128) + if rh, b, _, err := r.ReadFrom(rb); err != nil { + t.Fatal(err) + } else { + m, err := icmp.ParseMessage(iana.ProtocolICMP, b) + if err != nil { + t.Fatal(err) + } + switch { + case (rh.Dst.IsLoopback() || rh.Dst.IsLinkLocalUnicast() || rh.Dst.IsGlobalUnicast()) && m.Type == ipv4.ICMPTypeEchoReply && m.Code == 0: // net.inet.icmp.bmcastecho=1 + case rh.Dst.IsMulticast() && m.Type == ipv4.ICMPTypeEcho && m.Code == 0: // net.inet.icmp.bmcastecho=0 + default: + t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) + } + } + } + } +} diff --git a/vendor/golang.org/x/net/ipv4/multicastlistener_test.go b/vendor/golang.org/x/net/ipv4/multicastlistener_test.go new file mode 100644 index 0000000000..e342bf1d90 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/multicastlistener_test.go @@ -0,0 +1,249 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4_test + +import ( + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +var udpMultipleGroupListenerTests = []net.Addr{ + &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}, // see RFC 4727 + &net.UDPAddr{IP: net.IPv4(224, 0, 0, 250)}, + &net.UDPAddr{IP: net.IPv4(224, 0, 0, 254)}, +} + +func TestUDPSinglePacketConnWithMultipleGroupListeners(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if testing.Short() { + t.Skip("to avoid external network") + } + + for _, gaddr := range udpMultipleGroupListenerTests { + c, err := net.ListenPacket("udp4", "0.0.0.0:0") // wildcard address with no reusable port + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv4.NewPacketConn(c) + var mift []*net.Interface + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + if _, ok := nettest.IsMulticastCapable("ip4", &ifi); !ok { + continue + } + if err := p.JoinGroup(&ifi, gaddr); err != nil { + t.Fatal(err) + } + mift = append(mift, &ift[i]) + } + for _, ifi := range mift { + if err := p.LeaveGroup(ifi, gaddr); err != nil { + t.Fatal(err) + } + } + } +} + +func TestUDPMultiplePacketConnWithMultipleGroupListeners(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if testing.Short() { + t.Skip("to avoid external network") + } + + for _, gaddr := range udpMultipleGroupListenerTests { + c1, err := net.ListenPacket("udp4", "224.0.0.0:1024") // wildcard address with reusable port + if err != nil { + t.Fatal(err) + } + defer c1.Close() + + c2, err := net.ListenPacket("udp4", "224.0.0.0:1024") // wildcard address with reusable port + if err != nil { + t.Fatal(err) + } + defer c2.Close() + + var ps [2]*ipv4.PacketConn + ps[0] = ipv4.NewPacketConn(c1) + ps[1] = ipv4.NewPacketConn(c2) + var mift []*net.Interface + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + if _, ok := nettest.IsMulticastCapable("ip4", &ifi); !ok { + continue + } + for _, p := range ps { + if err := p.JoinGroup(&ifi, gaddr); err != nil { + t.Fatal(err) + } + } + mift = append(mift, &ift[i]) + } + for _, ifi := range mift { + for _, p := range ps { + if err := p.LeaveGroup(ifi, gaddr); err != nil { + t.Fatal(err) + } + } + } + } +} + +func TestUDPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if testing.Short() { + t.Skip("to avoid external network") + } + + gaddr := net.IPAddr{IP: net.IPv4(224, 0, 0, 254)} // see RFC 4727 + type ml struct { + c *ipv4.PacketConn + ifi *net.Interface + } + var mlt []*ml + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + ip, ok := nettest.IsMulticastCapable("ip4", &ifi) + if !ok { + continue + } + c, err := net.ListenPacket("udp4", ip.String()+":"+"1024") // unicast address with non-reusable port + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + if err := p.JoinGroup(&ifi, &gaddr); err != nil { + t.Fatal(err) + } + mlt = append(mlt, &ml{p, &ift[i]}) + } + for _, m := range mlt { + if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil { + t.Fatal(err) + } + } +} + +func TestIPSingleRawConnWithSingleGroupListener(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if testing.Short() { + t.Skip("to avoid external network") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") // wildcard address + if err != nil { + t.Fatal(err) + } + defer c.Close() + + r, err := ipv4.NewRawConn(c) + if err != nil { + t.Fatal(err) + } + gaddr := net.IPAddr{IP: net.IPv4(224, 0, 0, 254)} // see RFC 4727 + var mift []*net.Interface + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + if _, ok := nettest.IsMulticastCapable("ip4", &ifi); !ok { + continue + } + if err := r.JoinGroup(&ifi, &gaddr); err != nil { + t.Fatal(err) + } + mift = append(mift, &ift[i]) + } + for _, ifi := range mift { + if err := r.LeaveGroup(ifi, &gaddr); err != nil { + t.Fatal(err) + } + } +} + +func TestIPPerInterfaceSingleRawConnWithSingleGroupListener(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if testing.Short() { + t.Skip("to avoid external network") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + gaddr := net.IPAddr{IP: net.IPv4(224, 0, 0, 254)} // see RFC 4727 + type ml struct { + c *ipv4.RawConn + ifi *net.Interface + } + var mlt []*ml + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + ip, ok := nettest.IsMulticastCapable("ip4", &ifi) + if !ok { + continue + } + c, err := net.ListenPacket("ip4:253", ip.String()) // unicast address + if err != nil { + t.Fatal(err) + } + defer c.Close() + r, err := ipv4.NewRawConn(c) + if err != nil { + t.Fatal(err) + } + if err := r.JoinGroup(&ifi, &gaddr); err != nil { + t.Fatal(err) + } + mlt = append(mlt, &ml{r, &ift[i]}) + } + for _, m := range mlt { + if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil { + t.Fatal(err) + } + } +} diff --git a/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go b/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go new file mode 100644 index 0000000000..c76dbe4def --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go @@ -0,0 +1,195 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4_test + +import ( + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +var packetConnMulticastSocketOptionTests = []struct { + net, proto, addr string + grp, src net.Addr +}{ + {"udp4", "", "224.0.0.0:0", &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}, nil}, // see RFC 4727 + {"ip4", ":icmp", "0.0.0.0", &net.IPAddr{IP: net.IPv4(224, 0, 0, 250)}, nil}, // see RFC 4727 + + {"udp4", "", "232.0.0.0:0", &net.UDPAddr{IP: net.IPv4(232, 0, 1, 249)}, &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 + {"ip4", ":icmp", "0.0.0.0", &net.IPAddr{IP: net.IPv4(232, 0, 1, 250)}, &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 +} + +func TestPacketConnMulticastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris": + t.Skipf("not supported on %s", runtime.GOOS) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + m, ok := nettest.SupportsRawIPSocket() + for _, tt := range packetConnMulticastSocketOptionTests { + if tt.net == "ip4" && !ok { + t.Log(m) + continue + } + c, err := net.ListenPacket(tt.net+tt.proto, tt.addr) + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + defer p.Close() + + if tt.src == nil { + testMulticastSocketOptions(t, p, ifi, tt.grp) + } else { + testSourceSpecificMulticastSocketOptions(t, p, ifi, tt.grp, tt.src) + } + } +} + +var rawConnMulticastSocketOptionTests = []struct { + grp, src net.Addr +}{ + {&net.IPAddr{IP: net.IPv4(224, 0, 0, 250)}, nil}, // see RFC 4727 + + {&net.IPAddr{IP: net.IPv4(232, 0, 1, 250)}, &net.IPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 +} + +func TestRawConnMulticastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris": + t.Skipf("not supported on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + for _, tt := range rawConnMulticastSocketOptionTests { + c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + r, err := ipv4.NewRawConn(c) + if err != nil { + t.Fatal(err) + } + defer r.Close() + + if tt.src == nil { + testMulticastSocketOptions(t, r, ifi, tt.grp) + } else { + testSourceSpecificMulticastSocketOptions(t, r, ifi, tt.grp, tt.src) + } + } +} + +type testIPv4MulticastConn interface { + MulticastTTL() (int, error) + SetMulticastTTL(ttl int) error + MulticastLoopback() (bool, error) + SetMulticastLoopback(bool) error + JoinGroup(*net.Interface, net.Addr) error + LeaveGroup(*net.Interface, net.Addr) error + JoinSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error + LeaveSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error + ExcludeSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error + IncludeSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error +} + +func testMulticastSocketOptions(t *testing.T, c testIPv4MulticastConn, ifi *net.Interface, grp net.Addr) { + const ttl = 255 + if err := c.SetMulticastTTL(ttl); err != nil { + t.Error(err) + return + } + if v, err := c.MulticastTTL(); err != nil { + t.Error(err) + return + } else if v != ttl { + t.Errorf("got %v; want %v", v, ttl) + return + } + + for _, toggle := range []bool{true, false} { + if err := c.SetMulticastLoopback(toggle); err != nil { + t.Error(err) + return + } + if v, err := c.MulticastLoopback(); err != nil { + t.Error(err) + return + } else if v != toggle { + t.Errorf("got %v; want %v", v, toggle) + return + } + } + + if err := c.JoinGroup(ifi, grp); err != nil { + t.Error(err) + return + } + if err := c.LeaveGroup(ifi, grp); err != nil { + t.Error(err) + return + } +} + +func testSourceSpecificMulticastSocketOptions(t *testing.T, c testIPv4MulticastConn, ifi *net.Interface, grp, src net.Addr) { + // MCAST_JOIN_GROUP -> MCAST_BLOCK_SOURCE -> MCAST_UNBLOCK_SOURCE -> MCAST_LEAVE_GROUP + if err := c.JoinGroup(ifi, grp); err != nil { + t.Error(err) + return + } + if err := c.ExcludeSourceSpecificGroup(ifi, grp, src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support IGMPv2/3 fail here + t.Logf("not supported on %s", runtime.GOOS) + return + } + t.Error(err) + return + } + if err := c.IncludeSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + if err := c.LeaveGroup(ifi, grp); err != nil { + t.Error(err) + return + } + + // MCAST_JOIN_SOURCE_GROUP -> MCAST_LEAVE_SOURCE_GROUP + if err := c.JoinSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + if err := c.LeaveSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + + // MCAST_JOIN_SOURCE_GROUP -> MCAST_LEAVE_GROUP + if err := c.JoinSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + if err := c.LeaveGroup(ifi, grp); err != nil { + t.Error(err) + return + } +} diff --git a/vendor/golang.org/x/net/ipv4/packet.go b/vendor/golang.org/x/net/ipv4/packet.go new file mode 100644 index 0000000000..09864314e4 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/packet.go @@ -0,0 +1,97 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4 + +import ( + "net" + "syscall" +) + +// A packetHandler represents the IPv4 datagram handler. +type packetHandler struct { + c *net.IPConn + rawOpt +} + +func (c *packetHandler) ok() bool { return c != nil && c.c != nil } + +// ReadFrom reads an IPv4 datagram from the endpoint c, copying the +// datagram into b. It returns the received datagram as the IPv4 +// header h, the payload p and the control message cm. +func (c *packetHandler) ReadFrom(b []byte) (h *Header, p []byte, cm *ControlMessage, err error) { + if !c.ok() { + return nil, nil, nil, syscall.EINVAL + } + oob := newControlMessage(&c.rawOpt) + n, oobn, _, src, err := c.c.ReadMsgIP(b, oob) + if err != nil { + return nil, nil, nil, err + } + var hs []byte + if hs, p, err = slicePacket(b[:n]); err != nil { + return nil, nil, nil, err + } + if h, err = ParseHeader(hs); err != nil { + return nil, nil, nil, err + } + if cm, err = parseControlMessage(oob[:oobn]); err != nil { + return nil, nil, nil, err + } + if src != nil && cm != nil { + cm.Src = src.IP + } + return +} + +func slicePacket(b []byte) (h, p []byte, err error) { + if len(b) < HeaderLen { + return nil, nil, errHeaderTooShort + } + hdrlen := int(b[0]&0x0f) << 2 + return b[:hdrlen], b[hdrlen:], nil +} + +// WriteTo writes an IPv4 datagram through the endpoint c, copying the +// datagram from the IPv4 header h and the payload p. The control +// message cm allows the datagram path and the outgoing interface to be +// specified. Currently only Darwin and Linux support this. The cm +// may be nil if control of the outgoing datagram is not required. +// +// The IPv4 header h must contain appropriate fields that include: +// +// Version = ipv4.Version +// Len = +// TOS = +// TotalLen = +// ID = platform sets an appropriate value if ID is zero +// FragOff = +// TTL = +// Protocol = +// Checksum = platform sets an appropriate value if Checksum is zero +// Src = platform sets an appropriate value if Src is nil +// Dst = +// Options = optional +func (c *packetHandler) WriteTo(h *Header, p []byte, cm *ControlMessage) error { + if !c.ok() { + return syscall.EINVAL + } + oob := marshalControlMessage(cm) + wh, err := h.Marshal() + if err != nil { + return err + } + dst := &net.IPAddr{} + if cm != nil { + if ip := cm.Dst.To4(); ip != nil { + dst.IP = ip + } + } + if dst.IP == nil { + dst.IP = h.Dst + } + wh = append(wh, p...) + _, _, err = c.c.WriteMsgIP(wh, oob, dst) + return err +} diff --git a/vendor/golang.org/x/net/ipv4/payload.go b/vendor/golang.org/x/net/ipv4/payload.go new file mode 100644 index 0000000000..d7698cbd35 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/payload.go @@ -0,0 +1,15 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4 + +import "net" + +// A payloadHandler represents the IPv4 datagram payload handler. +type payloadHandler struct { + net.PacketConn + rawOpt +} + +func (c *payloadHandler) ok() bool { return c != nil && c.PacketConn != nil } diff --git a/vendor/golang.org/x/net/ipv4/payload_cmsg.go b/vendor/golang.org/x/net/ipv4/payload_cmsg.go new file mode 100644 index 0000000000..d358fc3ac4 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/payload_cmsg.go @@ -0,0 +1,81 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !plan9,!solaris,!windows + +package ipv4 + +import ( + "net" + "syscall" +) + +// ReadFrom reads a payload of the received IPv4 datagram, from the +// endpoint c, copying the payload into b. It returns the number of +// bytes copied into b, the control message cm and the source address +// src of the received datagram. +func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + if !c.ok() { + return 0, nil, nil, syscall.EINVAL + } + oob := newControlMessage(&c.rawOpt) + var oobn int + switch c := c.PacketConn.(type) { + case *net.UDPConn: + if n, oobn, _, src, err = c.ReadMsgUDP(b, oob); err != nil { + return 0, nil, nil, err + } + case *net.IPConn: + if sockOpts[ssoStripHeader].name > 0 { + if n, oobn, _, src, err = c.ReadMsgIP(b, oob); err != nil { + return 0, nil, nil, err + } + } else { + nb := make([]byte, maxHeaderLen+len(b)) + if n, oobn, _, src, err = c.ReadMsgIP(nb, oob); err != nil { + return 0, nil, nil, err + } + hdrlen := int(nb[0]&0x0f) << 2 + copy(b, nb[hdrlen:]) + n -= hdrlen + } + default: + return 0, nil, nil, errInvalidConnType + } + if cm, err = parseControlMessage(oob[:oobn]); err != nil { + return 0, nil, nil, err + } + if cm != nil { + cm.Src = netAddrToIP4(src) + } + return +} + +// WriteTo writes a payload of the IPv4 datagram, to the destination +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows +// the datagram path and the outgoing interface to be specified. +// Currently only Darwin and Linux support this. The cm may be nil if +// control of the outgoing datagram is not required. +func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + if !c.ok() { + return 0, syscall.EINVAL + } + oob := marshalControlMessage(cm) + if dst == nil { + return 0, errMissingAddress + } + switch c := c.PacketConn.(type) { + case *net.UDPConn: + n, _, err = c.WriteMsgUDP(b, oob, dst.(*net.UDPAddr)) + case *net.IPConn: + n, _, err = c.WriteMsgIP(b, oob, dst.(*net.IPAddr)) + default: + return 0, errInvalidConnType + } + if err != nil { + return 0, err + } + return +} diff --git a/vendor/golang.org/x/net/ipv4/payload_nocmsg.go b/vendor/golang.org/x/net/ipv4/payload_nocmsg.go new file mode 100644 index 0000000000..d128c9c2e7 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/payload_nocmsg.go @@ -0,0 +1,42 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build plan9 solaris windows + +package ipv4 + +import ( + "net" + "syscall" +) + +// ReadFrom reads a payload of the received IPv4 datagram, from the +// endpoint c, copying the payload into b. It returns the number of +// bytes copied into b, the control message cm and the source address +// src of the received datagram. +func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + if !c.ok() { + return 0, nil, nil, syscall.EINVAL + } + if n, src, err = c.PacketConn.ReadFrom(b); err != nil { + return 0, nil, nil, err + } + return +} + +// WriteTo writes a payload of the IPv4 datagram, to the destination +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows +// the datagram path and the outgoing interface to be specified. +// Currently only Darwin and Linux support this. The cm may be nil if +// control of the outgoing datagram is not required. +func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + if !c.ok() { + return 0, syscall.EINVAL + } + if dst == nil { + return 0, errMissingAddress + } + return c.PacketConn.WriteTo(b, dst) +} diff --git a/vendor/golang.org/x/net/ipv4/readwrite_test.go b/vendor/golang.org/x/net/ipv4/readwrite_test.go new file mode 100644 index 0000000000..247d06c1a8 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/readwrite_test.go @@ -0,0 +1,174 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4_test + +import ( + "bytes" + "net" + "runtime" + "strings" + "sync" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +func benchmarkUDPListener() (net.PacketConn, net.Addr, error) { + c, err := net.ListenPacket("udp4", "127.0.0.1:0") + if err != nil { + return nil, nil, err + } + dst, err := net.ResolveUDPAddr("udp4", c.LocalAddr().String()) + if err != nil { + c.Close() + return nil, nil, err + } + return c, dst, nil +} + +func BenchmarkReadWriteNetUDP(b *testing.B) { + c, dst, err := benchmarkUDPListener() + if err != nil { + b.Fatal(err) + } + defer c.Close() + + wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128) + b.ResetTimer() + for i := 0; i < b.N; i++ { + benchmarkReadWriteNetUDP(b, c, wb, rb, dst) + } +} + +func benchmarkReadWriteNetUDP(b *testing.B, c net.PacketConn, wb, rb []byte, dst net.Addr) { + if _, err := c.WriteTo(wb, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(rb); err != nil { + b.Fatal(err) + } +} + +func BenchmarkReadWriteIPv4UDP(b *testing.B) { + c, dst, err := benchmarkUDPListener() + if err != nil { + b.Fatal(err) + } + defer c.Close() + + p := ipv4.NewPacketConn(c) + defer p.Close() + cf := ipv4.FlagTTL | ipv4.FlagInterface + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + + wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128) + b.ResetTimer() + for i := 0; i < b.N; i++ { + benchmarkReadWriteIPv4UDP(b, p, wb, rb, dst, ifi) + } +} + +func benchmarkReadWriteIPv4UDP(b *testing.B, p *ipv4.PacketConn, wb, rb []byte, dst net.Addr, ifi *net.Interface) { + cm := ipv4.ControlMessage{TTL: 1} + if ifi != nil { + cm.IfIndex = ifi.Index + } + if n, err := p.WriteTo(wb, &cm, dst); err != nil { + b.Fatal(err) + } else if n != len(wb) { + b.Fatalf("got %v; want %v", n, len(wb)) + } + if _, _, _, err := p.ReadFrom(rb); err != nil { + b.Fatal(err) + } +} + +func TestPacketConnConcurrentReadWriteUnicastUDP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + + c, err := net.ListenPacket("udp4", "127.0.0.1:0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv4.NewPacketConn(c) + defer p.Close() + + dst, err := net.ResolveUDPAddr("udp4", c.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + cf := ipv4.FlagTTL | ipv4.FlagSrc | ipv4.FlagDst | ipv4.FlagInterface + wb := []byte("HELLO-R-U-THERE") + + if err := p.SetControlMessage(cf, true); err != nil { // probe before test + if nettest.ProtocolNotSupported(err) { + t.Skipf("not supported on %s", runtime.GOOS) + } + t.Fatal(err) + } + + var wg sync.WaitGroup + reader := func() { + defer wg.Done() + rb := make([]byte, 128) + if n, cm, _, err := p.ReadFrom(rb); err != nil { + t.Error(err) + return + } else if !bytes.Equal(rb[:n], wb) { + t.Errorf("got %v; want %v", rb[:n], wb) + return + } else { + s := cm.String() + if strings.Contains(s, ",") { + t.Errorf("should be space-separated values: %s", s) + } + } + } + writer := func(toggle bool) { + defer wg.Done() + cm := ipv4.ControlMessage{ + Src: net.IPv4(127, 0, 0, 1), + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if err := p.SetControlMessage(cf, toggle); err != nil { + t.Error(err) + return + } + if n, err := p.WriteTo(wb, &cm, dst); err != nil { + t.Error(err) + return + } else if n != len(wb) { + t.Errorf("short write: %v", n) + return + } + } + + const N = 10 + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Add(2 * N) + for i := 0; i < 2*N; i++ { + go writer(i%2 != 0) + } + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Wait() +} diff --git a/vendor/golang.org/x/net/ipv4/sockopt.go b/vendor/golang.org/x/net/ipv4/sockopt.go new file mode 100644 index 0000000000..ace37d30f5 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sockopt.go @@ -0,0 +1,46 @@ +// 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 ipv4 + +// Sticky socket options +const ( + ssoTOS = iota // header field for unicast packet + ssoTTL // header field for unicast packet + ssoMulticastTTL // header field for multicast packet + ssoMulticastInterface // outbound interface for multicast packet + ssoMulticastLoopback // loopback for multicast packet + ssoReceiveTTL // header field on received packet + ssoReceiveDst // header field on received packet + ssoReceiveInterface // inbound interface on received packet + ssoPacketInfo // incbound or outbound packet path + ssoHeaderPrepend // ipv4 header prepend + ssoStripHeader // strip ipv4 header + ssoICMPFilter // icmp filter + ssoJoinGroup // any-source multicast + ssoLeaveGroup // any-source multicast + ssoJoinSourceGroup // source-specific multicast + ssoLeaveSourceGroup // source-specific multicast + ssoBlockSourceGroup // any-source or source-specific multicast + ssoUnblockSourceGroup // any-source or source-specific multicast + ssoMax +) + +// Sticky socket option value types +const ( + ssoTypeByte = iota + 1 + ssoTypeInt + ssoTypeInterface + ssoTypeICMPFilter + ssoTypeIPMreq + ssoTypeIPMreqn + ssoTypeGroupReq + ssoTypeGroupSourceReq +) + +// A sockOpt represents a binding for sticky socket option. +type sockOpt struct { + name int // option name, must be equal or greater than 1 + typ int // option value type, must be equal or greater than 1 +} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_asmreq.go b/vendor/golang.org/x/net/ipv4/sockopt_asmreq.go new file mode 100644 index 0000000000..4a6aa78eff --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sockopt_asmreq.go @@ -0,0 +1,83 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd netbsd openbsd windows + +package ipv4 + +import "net" + +func setIPMreqInterface(mreq *sysIPMreq, ifi *net.Interface) error { + if ifi == nil { + return nil + } + ifat, err := ifi.Addrs() + if err != nil { + return err + } + for _, ifa := range ifat { + switch ifa := ifa.(type) { + case *net.IPAddr: + if ip := ifa.IP.To4(); ip != nil { + copy(mreq.Interface[:], ip) + return nil + } + case *net.IPNet: + if ip := ifa.IP.To4(); ip != nil { + copy(mreq.Interface[:], ip) + return nil + } + } + } + return errNoSuchInterface +} + +func netIP4ToInterface(ip net.IP) (*net.Interface, error) { + ift, err := net.Interfaces() + if err != nil { + return nil, err + } + for _, ifi := range ift { + ifat, err := ifi.Addrs() + if err != nil { + return nil, err + } + for _, ifa := range ifat { + switch ifa := ifa.(type) { + case *net.IPAddr: + if ip.Equal(ifa.IP) { + return &ifi, nil + } + case *net.IPNet: + if ip.Equal(ifa.IP) { + return &ifi, nil + } + } + } + } + return nil, errNoSuchInterface +} + +func netInterfaceToIP4(ifi *net.Interface) (net.IP, error) { + if ifi == nil { + return net.IPv4zero.To4(), nil + } + ifat, err := ifi.Addrs() + if err != nil { + return nil, err + } + for _, ifa := range ifat { + switch ifa := ifa.(type) { + case *net.IPAddr: + if ip := ifa.IP.To4(); ip != nil { + return ip, nil + } + case *net.IPNet: + if ip := ifa.IP.To4(); ip != nil { + return ip, nil + } + } + } + return nil, errNoSuchInterface +} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_asmreq_stub.go b/vendor/golang.org/x/net/ipv4/sockopt_asmreq_stub.go new file mode 100644 index 0000000000..45551528b3 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sockopt_asmreq_stub.go @@ -0,0 +1,21 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !darwin,!dragonfly,!freebsd,!netbsd,!openbsd,!windows + +package ipv4 + +import "net" + +func setsockoptIPMreq(fd, name int, ifi *net.Interface, grp net.IP) error { + return errOpNoSupport +} + +func getsockoptInterface(fd, name int) (*net.Interface, error) { + return nil, errOpNoSupport +} + +func setsockoptInterface(fd, name int, ifi *net.Interface) error { + return errOpNoSupport +} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_asmreq_unix.go b/vendor/golang.org/x/net/ipv4/sockopt_asmreq_unix.go new file mode 100644 index 0000000000..fefa901e6d --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sockopt_asmreq_unix.go @@ -0,0 +1,46 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd netbsd openbsd + +package ipv4 + +import ( + "net" + "os" + "unsafe" + + "golang.org/x/net/internal/iana" +) + +func setsockoptIPMreq(fd, name int, ifi *net.Interface, grp net.IP) error { + mreq := sysIPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}} + if err := setIPMreqInterface(&mreq, ifi); err != nil { + return err + } + return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&mreq), sysSizeofIPMreq)) +} + +func getsockoptInterface(fd, name int) (*net.Interface, error) { + var b [4]byte + l := sysSockoptLen(4) + if err := getsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&b[0]), &l); err != nil { + return nil, os.NewSyscallError("getsockopt", err) + } + ifi, err := netIP4ToInterface(net.IPv4(b[0], b[1], b[2], b[3])) + if err != nil { + return nil, err + } + return ifi, nil +} + +func setsockoptInterface(fd, name int, ifi *net.Interface) error { + ip, err := netInterfaceToIP4(ifi) + if err != nil { + return err + } + var b [4]byte + copy(b[:], ip) + return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&b[0]), sysSockoptLen(4))) +} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_asmreq_windows.go b/vendor/golang.org/x/net/ipv4/sockopt_asmreq_windows.go new file mode 100644 index 0000000000..431930df75 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sockopt_asmreq_windows.go @@ -0,0 +1,45 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4 + +import ( + "net" + "os" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" +) + +func setsockoptIPMreq(fd syscall.Handle, name int, ifi *net.Interface, grp net.IP) error { + mreq := sysIPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}} + if err := setIPMreqInterface(&mreq, ifi); err != nil { + return err + } + return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, iana.ProtocolIP, int32(name), (*byte)(unsafe.Pointer(&mreq)), int32(sysSizeofIPMreq))) +} + +func getsockoptInterface(fd syscall.Handle, name int) (*net.Interface, error) { + var b [4]byte + l := int32(4) + if err := syscall.Getsockopt(fd, iana.ProtocolIP, int32(name), (*byte)(unsafe.Pointer(&b[0])), &l); err != nil { + return nil, os.NewSyscallError("getsockopt", err) + } + ifi, err := netIP4ToInterface(net.IPv4(b[0], b[1], b[2], b[3])) + if err != nil { + return nil, err + } + return ifi, nil +} + +func setsockoptInterface(fd syscall.Handle, name int, ifi *net.Interface) error { + ip, err := netInterfaceToIP4(ifi) + if err != nil { + return err + } + var b [4]byte + copy(b[:], ip) + return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, iana.ProtocolIP, int32(name), (*byte)(unsafe.Pointer(&b[0])), 4)) +} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_asmreqn_stub.go b/vendor/golang.org/x/net/ipv4/sockopt_asmreqn_stub.go new file mode 100644 index 0000000000..332f403e8c --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sockopt_asmreqn_stub.go @@ -0,0 +1,17 @@ +// 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 !darwin,!freebsd,!linux,!windows + +package ipv4 + +import "net" + +func getsockoptIPMreqn(fd, name int) (*net.Interface, error) { + return nil, errOpNoSupport +} + +func setsockoptIPMreqn(fd, name int, ifi *net.Interface, grp net.IP) error { + return errOpNoSupport +} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_asmreqn_unix.go b/vendor/golang.org/x/net/ipv4/sockopt_asmreqn_unix.go new file mode 100644 index 0000000000..92c8e34cfa --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sockopt_asmreqn_unix.go @@ -0,0 +1,42 @@ +// 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 darwin freebsd linux + +package ipv4 + +import ( + "net" + "os" + "unsafe" + + "golang.org/x/net/internal/iana" +) + +func getsockoptIPMreqn(fd, name int) (*net.Interface, error) { + var mreqn sysIPMreqn + l := sysSockoptLen(sysSizeofIPMreqn) + if err := getsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&mreqn), &l); err != nil { + return nil, os.NewSyscallError("getsockopt", err) + } + if mreqn.Ifindex == 0 { + return nil, nil + } + ifi, err := net.InterfaceByIndex(int(mreqn.Ifindex)) + if err != nil { + return nil, err + } + return ifi, nil +} + +func setsockoptIPMreqn(fd, name int, ifi *net.Interface, grp net.IP) error { + var mreqn sysIPMreqn + if ifi != nil { + mreqn.Ifindex = int32(ifi.Index) + } + if grp != nil { + mreqn.Multiaddr = [4]byte{grp[0], grp[1], grp[2], grp[3]} + } + return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&mreqn), sysSizeofIPMreqn)) +} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_stub.go b/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_stub.go new file mode 100644 index 0000000000..8546524476 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_stub.go @@ -0,0 +1,17 @@ +// 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 !darwin,!freebsd,!linux + +package ipv4 + +import "net" + +func setsockoptGroupReq(fd, name int, ifi *net.Interface, grp net.IP) error { + return errOpNoSupport +} + +func setsockoptGroupSourceReq(fd, name int, ifi *net.Interface, grp, src net.IP) error { + return errOpNoSupport +} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_unix.go b/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_unix.go new file mode 100644 index 0000000000..6f647bc58a --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_unix.go @@ -0,0 +1,61 @@ +// 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 darwin freebsd linux + +package ipv4 + +import ( + "net" + "os" + "unsafe" + + "golang.org/x/net/internal/iana" +) + +var freebsd32o64 bool + +func setsockoptGroupReq(fd, name int, ifi *net.Interface, grp net.IP) error { + var gr sysGroupReq + if ifi != nil { + gr.Interface = uint32(ifi.Index) + } + gr.setGroup(grp) + var p unsafe.Pointer + var l sysSockoptLen + if freebsd32o64 { + var d [sysSizeofGroupReq + 4]byte + s := (*[sysSizeofGroupReq]byte)(unsafe.Pointer(&gr)) + copy(d[:4], s[:4]) + copy(d[8:], s[4:]) + p = unsafe.Pointer(&d[0]) + l = sysSizeofGroupReq + 4 + } else { + p = unsafe.Pointer(&gr) + l = sysSizeofGroupReq + } + return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, p, l)) +} + +func setsockoptGroupSourceReq(fd, name int, ifi *net.Interface, grp, src net.IP) error { + var gsr sysGroupSourceReq + if ifi != nil { + gsr.Interface = uint32(ifi.Index) + } + gsr.setSourceGroup(grp, src) + var p unsafe.Pointer + var l sysSockoptLen + if freebsd32o64 { + var d [sysSizeofGroupSourceReq + 4]byte + s := (*[sysSizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr)) + copy(d[:4], s[:4]) + copy(d[8:], s[4:]) + p = unsafe.Pointer(&d[0]) + l = sysSizeofGroupSourceReq + 4 + } else { + p = unsafe.Pointer(&gsr) + l = sysSizeofGroupSourceReq + } + return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, p, l)) +} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_stub.go b/vendor/golang.org/x/net/ipv4/sockopt_stub.go new file mode 100644 index 0000000000..9d19f5dfed --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sockopt_stub.go @@ -0,0 +1,11 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build nacl plan9 solaris + +package ipv4 + +func setInt(fd int, opt *sockOpt, v int) error { + return errOpNoSupport +} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_unix.go b/vendor/golang.org/x/net/ipv4/sockopt_unix.go new file mode 100644 index 0000000000..50cdbd81e2 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sockopt_unix.go @@ -0,0 +1,122 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd + +package ipv4 + +import ( + "net" + "os" + "unsafe" + + "golang.org/x/net/internal/iana" +) + +func getInt(fd int, opt *sockOpt) (int, error) { + if opt.name < 1 || (opt.typ != ssoTypeByte && opt.typ != ssoTypeInt) { + return 0, errOpNoSupport + } + var i int32 + var b byte + p := unsafe.Pointer(&i) + l := sysSockoptLen(4) + if opt.typ == ssoTypeByte { + p = unsafe.Pointer(&b) + l = sysSockoptLen(1) + } + if err := getsockopt(fd, iana.ProtocolIP, opt.name, p, &l); err != nil { + return 0, os.NewSyscallError("getsockopt", err) + } + if opt.typ == ssoTypeByte { + return int(b), nil + } + return int(i), nil +} + +func setInt(fd int, opt *sockOpt, v int) error { + if opt.name < 1 || (opt.typ != ssoTypeByte && opt.typ != ssoTypeInt) { + return errOpNoSupport + } + i := int32(v) + var b byte + p := unsafe.Pointer(&i) + l := sysSockoptLen(4) + if opt.typ == ssoTypeByte { + b = byte(v) + p = unsafe.Pointer(&b) + l = sysSockoptLen(1) + } + return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, opt.name, p, l)) +} + +func getInterface(fd int, opt *sockOpt) (*net.Interface, error) { + if opt.name < 1 { + return nil, errOpNoSupport + } + switch opt.typ { + case ssoTypeInterface: + return getsockoptInterface(fd, opt.name) + case ssoTypeIPMreqn: + return getsockoptIPMreqn(fd, opt.name) + default: + return nil, errOpNoSupport + } +} + +func setInterface(fd int, opt *sockOpt, ifi *net.Interface) error { + if opt.name < 1 { + return errOpNoSupport + } + switch opt.typ { + case ssoTypeInterface: + return setsockoptInterface(fd, opt.name, ifi) + case ssoTypeIPMreqn: + return setsockoptIPMreqn(fd, opt.name, ifi, nil) + default: + return errOpNoSupport + } +} + +func getICMPFilter(fd int, opt *sockOpt) (*ICMPFilter, error) { + if opt.name < 1 || opt.typ != ssoTypeICMPFilter { + return nil, errOpNoSupport + } + var f ICMPFilter + l := sysSockoptLen(sysSizeofICMPFilter) + if err := getsockopt(fd, iana.ProtocolReserved, opt.name, unsafe.Pointer(&f.sysICMPFilter), &l); err != nil { + return nil, os.NewSyscallError("getsockopt", err) + } + return &f, nil +} + +func setICMPFilter(fd int, opt *sockOpt, f *ICMPFilter) error { + if opt.name < 1 || opt.typ != ssoTypeICMPFilter { + return errOpNoSupport + } + return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolReserved, opt.name, unsafe.Pointer(&f.sysICMPFilter), sysSizeofICMPFilter)) +} + +func setGroup(fd int, opt *sockOpt, ifi *net.Interface, grp net.IP) error { + if opt.name < 1 { + return errOpNoSupport + } + switch opt.typ { + case ssoTypeIPMreq: + return setsockoptIPMreq(fd, opt.name, ifi, grp) + case ssoTypeIPMreqn: + return setsockoptIPMreqn(fd, opt.name, ifi, grp) + case ssoTypeGroupReq: + return setsockoptGroupReq(fd, opt.name, ifi, grp) + default: + return errOpNoSupport + } +} + +func setSourceGroup(fd int, opt *sockOpt, ifi *net.Interface, grp, src net.IP) error { + if opt.name < 1 || opt.typ != ssoTypeGroupSourceReq { + return errOpNoSupport + } + return setsockoptGroupSourceReq(fd, opt.name, ifi, grp, src) +} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_windows.go b/vendor/golang.org/x/net/ipv4/sockopt_windows.go new file mode 100644 index 0000000000..c4c2441ec5 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sockopt_windows.go @@ -0,0 +1,68 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4 + +import ( + "net" + "os" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" +) + +func getInt(fd syscall.Handle, opt *sockOpt) (int, error) { + if opt.name < 1 || opt.typ != ssoTypeInt { + return 0, errOpNoSupport + } + var i int32 + l := int32(4) + if err := syscall.Getsockopt(fd, iana.ProtocolIP, int32(opt.name), (*byte)(unsafe.Pointer(&i)), &l); err != nil { + return 0, os.NewSyscallError("getsockopt", err) + } + return int(i), nil +} + +func setInt(fd syscall.Handle, opt *sockOpt, v int) error { + if opt.name < 1 || opt.typ != ssoTypeInt { + return errOpNoSupport + } + i := int32(v) + return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, iana.ProtocolIP, int32(opt.name), (*byte)(unsafe.Pointer(&i)), 4)) +} + +func getInterface(fd syscall.Handle, opt *sockOpt) (*net.Interface, error) { + if opt.name < 1 || opt.typ != ssoTypeInterface { + return nil, errOpNoSupport + } + return getsockoptInterface(fd, opt.name) +} + +func setInterface(fd syscall.Handle, opt *sockOpt, ifi *net.Interface) error { + if opt.name < 1 || opt.typ != ssoTypeInterface { + return errOpNoSupport + } + return setsockoptInterface(fd, opt.name, ifi) +} + +func getICMPFilter(fd syscall.Handle, opt *sockOpt) (*ICMPFilter, error) { + return nil, errOpNoSupport +} + +func setICMPFilter(fd syscall.Handle, opt *sockOpt, f *ICMPFilter) error { + return errOpNoSupport +} + +func setGroup(fd syscall.Handle, opt *sockOpt, ifi *net.Interface, grp net.IP) error { + if opt.name < 1 || opt.typ != ssoTypeIPMreq { + return errOpNoSupport + } + return setsockoptIPMreq(fd, opt.name, ifi, grp) +} + +func setSourceGroup(fd syscall.Handle, opt *sockOpt, ifi *net.Interface, grp, src net.IP) error { + // TODO(mikio): implement this + return errOpNoSupport +} diff --git a/vendor/golang.org/x/net/ipv4/sys_bsd.go b/vendor/golang.org/x/net/ipv4/sys_bsd.go new file mode 100644 index 0000000000..a669a4403f --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_bsd.go @@ -0,0 +1,36 @@ +// 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 dragonfly netbsd + +package ipv4 + +import ( + "net" + "syscall" +) + +type sysSockoptLen int32 + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, + ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, + ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, + } + + sockOpts = [ssoMax]sockOpt{ + ssoTOS: {sysIP_TOS, ssoTypeInt}, + ssoTTL: {sysIP_TTL, ssoTypeInt}, + ssoMulticastTTL: {sysIP_MULTICAST_TTL, ssoTypeByte}, + ssoMulticastInterface: {sysIP_MULTICAST_IF, ssoTypeInterface}, + ssoMulticastLoopback: {sysIP_MULTICAST_LOOP, ssoTypeInt}, + ssoReceiveTTL: {sysIP_RECVTTL, ssoTypeInt}, + ssoReceiveDst: {sysIP_RECVDSTADDR, ssoTypeInt}, + ssoReceiveInterface: {sysIP_RECVIF, ssoTypeInt}, + ssoHeaderPrepend: {sysIP_HDRINCL, ssoTypeInt}, + ssoJoinGroup: {sysIP_ADD_MEMBERSHIP, ssoTypeIPMreq}, + ssoLeaveGroup: {sysIP_DROP_MEMBERSHIP, ssoTypeIPMreq}, + } +) diff --git a/vendor/golang.org/x/net/ipv4/sys_darwin.go b/vendor/golang.org/x/net/ipv4/sys_darwin.go new file mode 100644 index 0000000000..3f34734818 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_darwin.go @@ -0,0 +1,98 @@ +// 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 ipv4 + +import ( + "net" + "syscall" + "unsafe" +) + +type sysSockoptLen int32 + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, + ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, + ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, + } + + sockOpts = [ssoMax]sockOpt{ + ssoTOS: {sysIP_TOS, ssoTypeInt}, + ssoTTL: {sysIP_TTL, ssoTypeInt}, + ssoMulticastTTL: {sysIP_MULTICAST_TTL, ssoTypeByte}, + ssoMulticastInterface: {sysIP_MULTICAST_IF, ssoTypeInterface}, + ssoMulticastLoopback: {sysIP_MULTICAST_LOOP, ssoTypeInt}, + ssoReceiveTTL: {sysIP_RECVTTL, ssoTypeInt}, + ssoReceiveDst: {sysIP_RECVDSTADDR, ssoTypeInt}, + ssoReceiveInterface: {sysIP_RECVIF, ssoTypeInt}, + ssoHeaderPrepend: {sysIP_HDRINCL, ssoTypeInt}, + ssoStripHeader: {sysIP_STRIPHDR, ssoTypeInt}, + ssoJoinGroup: {sysIP_ADD_MEMBERSHIP, ssoTypeIPMreq}, + ssoLeaveGroup: {sysIP_DROP_MEMBERSHIP, ssoTypeIPMreq}, + } +) + +func init() { + // Seems like kern.osreldate is veiled on latest OS X. We use + // kern.osrelease instead. + osver, err := syscall.Sysctl("kern.osrelease") + if err != nil { + return + } + var i int + for i = range osver { + if osver[i] == '.' { + break + } + } + // The IP_PKTINFO and protocol-independent multicast API were + // introduced in OS X 10.7 (Darwin 11.0.0). But it looks like + // those features require OS X 10.8 (Darwin 12.0.0) and above. + // See http://support.apple.com/kb/HT1633. + if i > 2 || i == 2 && osver[0] >= '1' && osver[1] >= '2' { + ctlOpts[ctlPacketInfo].name = sysIP_PKTINFO + ctlOpts[ctlPacketInfo].length = sysSizeofInetPktinfo + ctlOpts[ctlPacketInfo].marshal = marshalPacketInfo + ctlOpts[ctlPacketInfo].parse = parsePacketInfo + sockOpts[ssoPacketInfo].name = sysIP_RECVPKTINFO + sockOpts[ssoPacketInfo].typ = ssoTypeInt + sockOpts[ssoMulticastInterface].typ = ssoTypeIPMreqn + sockOpts[ssoJoinGroup].name = sysMCAST_JOIN_GROUP + sockOpts[ssoJoinGroup].typ = ssoTypeGroupReq + sockOpts[ssoLeaveGroup].name = sysMCAST_LEAVE_GROUP + sockOpts[ssoLeaveGroup].typ = ssoTypeGroupReq + sockOpts[ssoJoinSourceGroup].name = sysMCAST_JOIN_SOURCE_GROUP + sockOpts[ssoJoinSourceGroup].typ = ssoTypeGroupSourceReq + sockOpts[ssoLeaveSourceGroup].name = sysMCAST_LEAVE_SOURCE_GROUP + sockOpts[ssoLeaveSourceGroup].typ = ssoTypeGroupSourceReq + sockOpts[ssoBlockSourceGroup].name = sysMCAST_BLOCK_SOURCE + sockOpts[ssoBlockSourceGroup].typ = ssoTypeGroupSourceReq + sockOpts[ssoUnblockSourceGroup].name = sysMCAST_UNBLOCK_SOURCE + sockOpts[ssoUnblockSourceGroup].typ = ssoTypeGroupSourceReq + } +} + +func (pi *sysInetPktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (gr *sysGroupReq) setGroup(grp net.IP) { + sa := (*sysSockaddrInet)(unsafe.Pointer(&gr.Pad_cgo_0[0])) + sa.Len = sysSizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) +} + +func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sysSockaddrInet)(unsafe.Pointer(&gsr.Pad_cgo_0[0])) + sa.Len = sysSizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) + sa = (*sysSockaddrInet)(unsafe.Pointer(&gsr.Pad_cgo_1[0])) + sa.Len = sysSizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], src) +} diff --git a/vendor/golang.org/x/net/ipv4/sys_freebsd.go b/vendor/golang.org/x/net/ipv4/sys_freebsd.go new file mode 100644 index 0000000000..09ef491075 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_freebsd.go @@ -0,0 +1,75 @@ +// 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 ipv4 + +import ( + "net" + "runtime" + "strings" + "syscall" + "unsafe" +) + +type sysSockoptLen int32 + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, + ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, + ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, + } + + sockOpts = [ssoMax]sockOpt{ + ssoTOS: {sysIP_TOS, ssoTypeInt}, + ssoTTL: {sysIP_TTL, ssoTypeInt}, + ssoMulticastTTL: {sysIP_MULTICAST_TTL, ssoTypeByte}, + ssoMulticastInterface: {sysIP_MULTICAST_IF, ssoTypeInterface}, + ssoMulticastLoopback: {sysIP_MULTICAST_LOOP, ssoTypeInt}, + ssoReceiveTTL: {sysIP_RECVTTL, ssoTypeInt}, + ssoReceiveDst: {sysIP_RECVDSTADDR, ssoTypeInt}, + ssoReceiveInterface: {sysIP_RECVIF, ssoTypeInt}, + ssoHeaderPrepend: {sysIP_HDRINCL, ssoTypeInt}, + ssoJoinGroup: {sysMCAST_JOIN_GROUP, ssoTypeGroupReq}, + ssoLeaveGroup: {sysMCAST_LEAVE_GROUP, ssoTypeGroupReq}, + ssoJoinSourceGroup: {sysMCAST_JOIN_SOURCE_GROUP, ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {sysMCAST_LEAVE_SOURCE_GROUP, ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {sysMCAST_BLOCK_SOURCE, ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {sysMCAST_UNBLOCK_SOURCE, ssoTypeGroupSourceReq}, + } +) + +func init() { + freebsdVersion, _ = syscall.SysctlUint32("kern.osreldate") + if freebsdVersion >= 1000000 { + sockOpts[ssoMulticastInterface].typ = ssoTypeIPMreqn + } + if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" { + archs, _ := syscall.Sysctl("kern.supported_archs") + for _, s := range strings.Fields(archs) { + if s == "amd64" { + freebsd32o64 = true + break + } + } + } +} + +func (gr *sysGroupReq) setGroup(grp net.IP) { + sa := (*sysSockaddrInet)(unsafe.Pointer(&gr.Group)) + sa.Len = sysSizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) +} + +func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sysSockaddrInet)(unsafe.Pointer(&gsr.Group)) + sa.Len = sysSizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) + sa = (*sysSockaddrInet)(unsafe.Pointer(&gsr.Source)) + sa.Len = sysSizeofSockaddrInet + sa.Family = syscall.AF_INET + copy(sa.Addr[:], src) +} diff --git a/vendor/golang.org/x/net/ipv4/sys_linux.go b/vendor/golang.org/x/net/ipv4/sys_linux.go new file mode 100644 index 0000000000..b1f3878907 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_linux.go @@ -0,0 +1,57 @@ +// 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 ipv4 + +import ( + "net" + "syscall" + "unsafe" +) + +type sysSockoptLen int32 + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_TTL, 1, marshalTTL, parseTTL}, + ctlPacketInfo: {sysIP_PKTINFO, sysSizeofInetPktinfo, marshalPacketInfo, parsePacketInfo}, + } + + sockOpts = [ssoMax]sockOpt{ + ssoTOS: {sysIP_TOS, ssoTypeInt}, + ssoTTL: {sysIP_TTL, ssoTypeInt}, + ssoMulticastTTL: {sysIP_MULTICAST_TTL, ssoTypeInt}, + ssoMulticastInterface: {sysIP_MULTICAST_IF, ssoTypeIPMreqn}, + ssoMulticastLoopback: {sysIP_MULTICAST_LOOP, ssoTypeInt}, + ssoReceiveTTL: {sysIP_RECVTTL, ssoTypeInt}, + ssoPacketInfo: {sysIP_PKTINFO, ssoTypeInt}, + ssoHeaderPrepend: {sysIP_HDRINCL, ssoTypeInt}, + ssoICMPFilter: {sysICMP_FILTER, ssoTypeICMPFilter}, + ssoJoinGroup: {sysMCAST_JOIN_GROUP, ssoTypeGroupReq}, + ssoLeaveGroup: {sysMCAST_LEAVE_GROUP, ssoTypeGroupReq}, + ssoJoinSourceGroup: {sysMCAST_JOIN_SOURCE_GROUP, ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {sysMCAST_LEAVE_SOURCE_GROUP, ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {sysMCAST_BLOCK_SOURCE, ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {sysMCAST_UNBLOCK_SOURCE, ssoTypeGroupSourceReq}, + } +) + +func (pi *sysInetPktinfo) setIfindex(i int) { + pi.Ifindex = int32(i) +} + +func (gr *sysGroupReq) setGroup(grp net.IP) { + sa := (*sysSockaddrInet)(unsafe.Pointer(&gr.Group)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) +} + +func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sysSockaddrInet)(unsafe.Pointer(&gsr.Group)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) + sa = (*sysSockaddrInet)(unsafe.Pointer(&gsr.Source)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], src) +} diff --git a/vendor/golang.org/x/net/ipv4/sys_openbsd.go b/vendor/golang.org/x/net/ipv4/sys_openbsd.go new file mode 100644 index 0000000000..550f20816f --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_openbsd.go @@ -0,0 +1,34 @@ +// 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 ipv4 + +import ( + "net" + "syscall" +) + +type sysSockoptLen int32 + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, + ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, + ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, + } + + sockOpts = [ssoMax]sockOpt{ + ssoTOS: {sysIP_TOS, ssoTypeInt}, + ssoTTL: {sysIP_TTL, ssoTypeInt}, + ssoMulticastTTL: {sysIP_MULTICAST_TTL, ssoTypeByte}, + ssoMulticastInterface: {sysIP_MULTICAST_IF, ssoTypeInterface}, + ssoMulticastLoopback: {sysIP_MULTICAST_LOOP, ssoTypeByte}, + ssoReceiveTTL: {sysIP_RECVTTL, ssoTypeInt}, + ssoReceiveDst: {sysIP_RECVDSTADDR, ssoTypeInt}, + ssoReceiveInterface: {sysIP_RECVIF, ssoTypeInt}, + ssoHeaderPrepend: {sysIP_HDRINCL, ssoTypeInt}, + ssoJoinGroup: {sysIP_ADD_MEMBERSHIP, ssoTypeIPMreq}, + ssoLeaveGroup: {sysIP_DROP_MEMBERSHIP, ssoTypeIPMreq}, + } +) diff --git a/vendor/golang.org/x/net/ipv4/sys_stub.go b/vendor/golang.org/x/net/ipv4/sys_stub.go new file mode 100644 index 0000000000..efbcc479a7 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_stub.go @@ -0,0 +1,15 @@ +// 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 nacl plan9 solaris + +package ipv4 + +type sysSockoptLen int32 + +var ( + ctlOpts = [ctlMax]ctlOpt{} + + sockOpts = [ssoMax]sockOpt{} +) diff --git a/vendor/golang.org/x/net/ipv4/sys_windows.go b/vendor/golang.org/x/net/ipv4/sys_windows.go new file mode 100644 index 0000000000..466489fe06 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_windows.go @@ -0,0 +1,61 @@ +// 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 ipv4 + +const ( + // See ws2tcpip.h. + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_DONTFRAGMENT = 0xe + sysIP_ADD_SOURCE_MEMBERSHIP = 0xf + sysIP_DROP_SOURCE_MEMBERSHIP = 0x10 + sysIP_PKTINFO = 0x13 + + sysSizeofInetPktinfo = 0x8 + sysSizeofIPMreq = 0x8 + sysSizeofIPMreqSource = 0xc +) + +type sysInetPktinfo struct { + Addr [4]byte + Ifindex int32 +} + +type sysIPMreq struct { + Multiaddr [4]byte + Interface [4]byte +} + +type sysIPMreqSource struct { + Multiaddr [4]byte + Sourceaddr [4]byte + Interface [4]byte +} + +// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms738586(v=vs.85).aspx +var ( + ctlOpts = [ctlMax]ctlOpt{} + + sockOpts = [ssoMax]sockOpt{ + ssoTOS: {sysIP_TOS, ssoTypeInt}, + ssoTTL: {sysIP_TTL, ssoTypeInt}, + ssoMulticastTTL: {sysIP_MULTICAST_TTL, ssoTypeInt}, + ssoMulticastInterface: {sysIP_MULTICAST_IF, ssoTypeInterface}, + ssoMulticastLoopback: {sysIP_MULTICAST_LOOP, ssoTypeInt}, + ssoJoinGroup: {sysIP_ADD_MEMBERSHIP, ssoTypeIPMreq}, + ssoLeaveGroup: {sysIP_DROP_MEMBERSHIP, ssoTypeIPMreq}, + } +) + +func (pi *sysInetPktinfo) setIfindex(i int) { + pi.Ifindex = int32(i) +} diff --git a/vendor/golang.org/x/net/ipv4/syscall_linux_386.go b/vendor/golang.org/x/net/ipv4/syscall_linux_386.go new file mode 100644 index 0000000000..ab4ad04549 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/syscall_linux_386.go @@ -0,0 +1,31 @@ +// 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 ipv4 + +import ( + "syscall" + "unsafe" +) + +const ( + sysGETSOCKOPT = 0xf + sysSETSOCKOPT = 0xe +) + +func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (int, syscall.Errno) + +func getsockopt(fd, level, name int, v unsafe.Pointer, l *sysSockoptLen) error { + if _, errno := socketcall(sysGETSOCKOPT, uintptr(fd), uintptr(level), uintptr(name), uintptr(v), uintptr(unsafe.Pointer(l)), 0); errno != 0 { + return error(errno) + } + return nil +} + +func setsockopt(fd, level, name int, v unsafe.Pointer, l sysSockoptLen) error { + if _, errno := socketcall(sysSETSOCKOPT, uintptr(fd), uintptr(level), uintptr(name), uintptr(v), uintptr(l), 0); errno != 0 { + return error(errno) + } + return nil +} diff --git a/vendor/golang.org/x/net/ipv4/syscall_unix.go b/vendor/golang.org/x/net/ipv4/syscall_unix.go new file mode 100644 index 0000000000..5fe8e83bc5 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/syscall_unix.go @@ -0,0 +1,26 @@ +// 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 darwin dragonfly freebsd linux,!386 netbsd openbsd + +package ipv4 + +import ( + "syscall" + "unsafe" +) + +func getsockopt(fd, level, name int, v unsafe.Pointer, l *sysSockoptLen) error { + if _, _, errno := syscall.Syscall6(syscall.SYS_GETSOCKOPT, uintptr(fd), uintptr(level), uintptr(name), uintptr(v), uintptr(unsafe.Pointer(l)), 0); errno != 0 { + return error(errno) + } + return nil +} + +func setsockopt(fd, level, name int, v unsafe.Pointer, l sysSockoptLen) error { + if _, _, errno := syscall.Syscall6(syscall.SYS_SETSOCKOPT, uintptr(fd), uintptr(level), uintptr(name), uintptr(v), uintptr(l), 0); errno != 0 { + return error(errno) + } + return nil +} diff --git a/vendor/golang.org/x/net/ipv4/thunk_linux_386.s b/vendor/golang.org/x/net/ipv4/thunk_linux_386.s new file mode 100644 index 0000000000..daa78bc02d --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/thunk_linux_386.s @@ -0,0 +1,8 @@ +// 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 go1.2 + +TEXT ·socketcall(SB),4,$0-36 + JMP syscall·socketcall(SB) diff --git a/vendor/golang.org/x/net/ipv4/unicast_test.go b/vendor/golang.org/x/net/ipv4/unicast_test.go new file mode 100644 index 0000000000..9c632cd898 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/unicast_test.go @@ -0,0 +1,246 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4_test + +import ( + "bytes" + "net" + "os" + "runtime" + "testing" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +func TestPacketConnReadWriteUnicastUDP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + c, err := net.ListenPacket("udp4", "127.0.0.1:0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + dst, err := net.ResolveUDPAddr("udp4", c.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + p := ipv4.NewPacketConn(c) + defer p.Close() + cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface + wb := []byte("HELLO-R-U-THERE") + + for i, toggle := range []bool{true, false, true} { + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + p.SetTTL(i + 1) + if err := p.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, err := p.WriteTo(wb, nil, dst); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + if err := p.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, _, _, err := p.ReadFrom(rb); err != nil { + t.Fatal(err) + } else if !bytes.Equal(rb[:n], wb) { + t.Fatalf("got %v; want %v", rb[:n], wb) + } + } +} + +func TestPacketConnReadWriteUnicastICMP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + dst, err := net.ResolveIPAddr("ip4", "127.0.0.1") + if err != nil { + t.Fatal(err) + } + p := ipv4.NewPacketConn(c) + defer p.Close() + cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface + + for i, toggle := range []bool{true, false, true} { + wb, err := (&icmp.Message{ + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: i + 1, + Data: []byte("HELLO-R-U-THERE"), + }, + }).Marshal(nil) + if err != nil { + t.Fatal(err) + } + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + p.SetTTL(i + 1) + if err := p.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, err := p.WriteTo(wb, nil, dst); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + loop: + if err := p.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, _, _, err := p.ReadFrom(rb); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels have some limitation on receiving icmp packet through raw socket + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } else { + m, err := icmp.ParseMessage(iana.ProtocolICMP, rb[:n]) + if err != nil { + t.Fatal(err) + } + if runtime.GOOS == "linux" && m.Type == ipv4.ICMPTypeEcho { + // On Linux we must handle own sent packets. + goto loop + } + if m.Type != ipv4.ICMPTypeEchoReply || m.Code != 0 { + t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) + } + } + } +} + +func TestRawConnReadWriteUnicastICMP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + dst, err := net.ResolveIPAddr("ip4", "127.0.0.1") + if err != nil { + t.Fatal(err) + } + r, err := ipv4.NewRawConn(c) + if err != nil { + t.Fatal(err) + } + defer r.Close() + cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface + + for i, toggle := range []bool{true, false, true} { + wb, err := (&icmp.Message{ + Type: ipv4.ICMPTypeEcho, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: i + 1, + Data: []byte("HELLO-R-U-THERE"), + }, + }).Marshal(nil) + if err != nil { + t.Fatal(err) + } + wh := &ipv4.Header{ + Version: ipv4.Version, + Len: ipv4.HeaderLen, + TOS: i + 1, + TotalLen: ipv4.HeaderLen + len(wb), + TTL: i + 1, + Protocol: 1, + Dst: dst.IP, + } + if err := r.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + if err := r.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if err := r.WriteTo(wh, wb, nil); err != nil { + t.Fatal(err) + } + rb := make([]byte, ipv4.HeaderLen+128) + loop: + if err := r.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if _, b, _, err := r.ReadFrom(rb); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels have some limitation on receiving icmp packet through raw socket + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } else { + m, err := icmp.ParseMessage(iana.ProtocolICMP, b) + if err != nil { + t.Fatal(err) + } + if runtime.GOOS == "linux" && m.Type == ipv4.ICMPTypeEcho { + // On Linux we must handle own sent packets. + goto loop + } + if m.Type != ipv4.ICMPTypeEchoReply || m.Code != 0 { + t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) + } + } + } +} diff --git a/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go b/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go new file mode 100644 index 0000000000..25606f21da --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go @@ -0,0 +1,139 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv4_test + +import ( + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv4" +) + +func TestConnUnicastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris": + t.Skipf("not supported on %s", runtime.GOOS) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + ln, err := net.Listen("tcp4", "127.0.0.1:0") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + + done := make(chan bool) + go acceptor(t, ln, done) + + c, err := net.Dial("tcp4", ln.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + testUnicastSocketOptions(t, ipv4.NewConn(c)) + + <-done +} + +var packetConnUnicastSocketOptionTests = []struct { + net, proto, addr string +}{ + {"udp4", "", "127.0.0.1:0"}, + {"ip4", ":icmp", "127.0.0.1"}, +} + +func TestPacketConnUnicastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris": + t.Skipf("not supported on %s", runtime.GOOS) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + m, ok := nettest.SupportsRawIPSocket() + for _, tt := range packetConnUnicastSocketOptionTests { + if tt.net == "ip4" && !ok { + t.Log(m) + continue + } + c, err := net.ListenPacket(tt.net+tt.proto, tt.addr) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + testUnicastSocketOptions(t, ipv4.NewPacketConn(c)) + } +} + +func TestRawConnUnicastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris": + t.Skipf("not supported on %s", runtime.GOOS) + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + c, err := net.ListenPacket("ip4:icmp", "127.0.0.1") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + r, err := ipv4.NewRawConn(c) + if err != nil { + t.Fatal(err) + } + + testUnicastSocketOptions(t, r) +} + +type testIPv4UnicastConn interface { + TOS() (int, error) + SetTOS(int) error + TTL() (int, error) + SetTTL(int) error +} + +func testUnicastSocketOptions(t *testing.T, c testIPv4UnicastConn) { + tos := iana.DiffServCS0 | iana.NotECNTransport + switch runtime.GOOS { + case "windows": + // IP_TOS option is supported on Windows 8 and beyond. + t.Skipf("not supported on %s", runtime.GOOS) + } + + if err := c.SetTOS(tos); err != nil { + t.Fatal(err) + } + if v, err := c.TOS(); err != nil { + t.Fatal(err) + } else if v != tos { + t.Fatalf("got %v; want %v", v, tos) + } + const ttl = 255 + if err := c.SetTTL(ttl); err != nil { + t.Fatal(err) + } + if v, err := c.TTL(); err != nil { + t.Fatal(err) + } else if v != ttl { + t.Fatalf("got %v; want %v", v, ttl) + } +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_darwin.go b/vendor/golang.org/x/net/ipv4/zsys_darwin.go new file mode 100644 index 0000000000..087c639063 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_darwin.go @@ -0,0 +1,99 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_darwin.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_STRIPHDR = 0x17 + sysIP_RECVTTL = 0x18 + sysIP_BOUND_IF = 0x19 + sysIP_PKTINFO = 0x1a + sysIP_RECVPKTINFO = 0x1a + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_MULTICAST_VIF = 0xe + sysIP_MULTICAST_IFINDEX = 0x42 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 + sysIP_BLOCK_SOURCE = 0x48 + sysIP_UNBLOCK_SOURCE = 0x49 + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysSizeofSockaddrStorage = 0x80 + sysSizeofSockaddrInet = 0x10 + sysSizeofInetPktinfo = 0xc + + sysSizeofIPMreq = 0x8 + sysSizeofIPMreqn = 0xc + sysSizeofIPMreqSource = 0xc + sysSizeofGroupReq = 0x84 + sysSizeofGroupSourceReq = 0x104 +) + +type sysSockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sysSockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sysInetPktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sysIPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type sysIPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type sysIPMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type sysGroupReq struct { + Interface uint32 + Pad_cgo_0 [128]byte +} + +type sysGroupSourceReq struct { + Interface uint32 + Pad_cgo_0 [128]byte + Pad_cgo_1 [128]byte +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go b/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go new file mode 100644 index 0000000000..f5c9ccec4f --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go @@ -0,0 +1,33 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_dragonfly.go + +// +build dragonfly + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_RECVTTL = 0x41 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_MULTICAST_VIF = 0xe + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + + sysSizeofIPMreq = 0x8 +) + +type sysIPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go new file mode 100644 index 0000000000..6fd67e1e99 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go @@ -0,0 +1,93 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_SENDSRCADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_ONESBCAST = 0x17 + sysIP_BINDANY = 0x18 + sysIP_RECVTTL = 0x41 + sysIP_MINTTL = 0x42 + sysIP_DONTFRAG = 0x43 + sysIP_RECVTOS = 0x44 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_MULTICAST_VIF = 0xe + sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 + sysIP_BLOCK_SOURCE = 0x48 + sysIP_UNBLOCK_SOURCE = 0x49 + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysSizeofSockaddrStorage = 0x80 + sysSizeofSockaddrInet = 0x10 + + sysSizeofIPMreq = 0x8 + sysSizeofIPMreqn = 0xc + sysSizeofIPMreqSource = 0xc + sysSizeofGroupReq = 0x84 + sysSizeofGroupSourceReq = 0x104 +) + +type sysSockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sysSockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sysIPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type sysIPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type sysIPMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type sysGroupReq struct { + Interface uint32 + Group sysSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Group sysSockaddrStorage + Source sysSockaddrStorage +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go new file mode 100644 index 0000000000..ebac6d7926 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go @@ -0,0 +1,95 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_SENDSRCADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_ONESBCAST = 0x17 + sysIP_BINDANY = 0x18 + sysIP_RECVTTL = 0x41 + sysIP_MINTTL = 0x42 + sysIP_DONTFRAG = 0x43 + sysIP_RECVTOS = 0x44 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_MULTICAST_VIF = 0xe + sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 + sysIP_BLOCK_SOURCE = 0x48 + sysIP_UNBLOCK_SOURCE = 0x49 + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysSizeofSockaddrStorage = 0x80 + sysSizeofSockaddrInet = 0x10 + + sysSizeofIPMreq = 0x8 + sysSizeofIPMreqn = 0xc + sysSizeofIPMreqSource = 0xc + sysSizeofGroupReq = 0x88 + sysSizeofGroupSourceReq = 0x108 +) + +type sysSockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sysSockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sysIPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type sysIPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type sysIPMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type sysGroupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysSockaddrStorage + Source sysSockaddrStorage +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go new file mode 100644 index 0000000000..ebac6d7926 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go @@ -0,0 +1,95 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_SENDSRCADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_ONESBCAST = 0x17 + sysIP_BINDANY = 0x18 + sysIP_RECVTTL = 0x41 + sysIP_MINTTL = 0x42 + sysIP_DONTFRAG = 0x43 + sysIP_RECVTOS = 0x44 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + sysIP_MULTICAST_VIF = 0xe + sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 + sysIP_BLOCK_SOURCE = 0x48 + sysIP_UNBLOCK_SOURCE = 0x49 + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysSizeofSockaddrStorage = 0x80 + sysSizeofSockaddrInet = 0x10 + + sysSizeofIPMreq = 0x8 + sysSizeofIPMreqn = 0xc + sysSizeofIPMreqSource = 0xc + sysSizeofGroupReq = 0x88 + sysSizeofGroupSourceReq = 0x108 +) + +type sysSockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sysSockaddrInet struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type sysIPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type sysIPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type sysIPMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type sysGroupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysSockaddrStorage + Source sysSockaddrStorage +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_386.go b/vendor/golang.org/x/net/ipv4/zsys_linux_386.go new file mode 100644 index 0000000000..fc7a9ebfbf --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_386.go @@ -0,0 +1,130 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSizeofKernelSockaddrStorage = 0x80 + sysSizeofSockaddrInet = 0x10 + sysSizeofInetPktinfo = 0xc + sysSizeofSockExtendedErr = 0x10 + + sysSizeofIPMreq = 0x8 + sysSizeofIPMreqn = 0xc + sysSizeofIPMreqSource = 0xc + sysSizeofGroupReq = 0x84 + sysSizeofGroupSourceReq = 0x104 + + sysSizeofICMPFilter = 0x4 +) + +type sysKernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sysSockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sysInetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sysSockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type sysIPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type sysIPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type sysIPMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type sysGroupReq struct { + Interface uint32 + Group sysKernelSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Group sysKernelSockaddrStorage + Source sysKernelSockaddrStorage +} + +type sysICMPFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go new file mode 100644 index 0000000000..e324b81b63 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go @@ -0,0 +1,132 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSizeofKernelSockaddrStorage = 0x80 + sysSizeofSockaddrInet = 0x10 + sysSizeofInetPktinfo = 0xc + sysSizeofSockExtendedErr = 0x10 + + sysSizeofIPMreq = 0x8 + sysSizeofIPMreqn = 0xc + sysSizeofIPMreqSource = 0xc + sysSizeofGroupReq = 0x88 + sysSizeofGroupSourceReq = 0x108 + + sysSizeofICMPFilter = 0x4 +) + +type sysKernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sysSockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sysInetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sysSockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type sysIPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type sysIPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type sysIPMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type sysGroupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage + Source sysKernelSockaddrStorage +} + +type sysICMPFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go b/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go new file mode 100644 index 0000000000..fc7a9ebfbf --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go @@ -0,0 +1,130 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSizeofKernelSockaddrStorage = 0x80 + sysSizeofSockaddrInet = 0x10 + sysSizeofInetPktinfo = 0xc + sysSizeofSockExtendedErr = 0x10 + + sysSizeofIPMreq = 0x8 + sysSizeofIPMreqn = 0xc + sysSizeofIPMreqSource = 0xc + sysSizeofGroupReq = 0x84 + sysSizeofGroupSourceReq = 0x104 + + sysSizeofICMPFilter = 0x4 +) + +type sysKernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sysSockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sysInetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sysSockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type sysIPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type sysIPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type sysIPMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type sysGroupReq struct { + Interface uint32 + Group sysKernelSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Group sysKernelSockaddrStorage + Source sysKernelSockaddrStorage +} + +type sysICMPFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go new file mode 100644 index 0000000000..ce4194a64a --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go @@ -0,0 +1,134 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +// +build linux,arm64 + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSizeofKernelSockaddrStorage = 0x80 + sysSizeofSockaddrInet = 0x10 + sysSizeofInetPktinfo = 0xc + sysSizeofSockExtendedErr = 0x10 + + sysSizeofIPMreq = 0x8 + sysSizeofIPMreqn = 0xc + sysSizeofIPMreqSource = 0xc + sysSizeofGroupReq = 0x88 + sysSizeofGroupSourceReq = 0x108 + + sysSizeofICMPFilter = 0x4 +) + +type sysKernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sysSockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sysInetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sysSockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type sysIPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type sysIPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type sysIPMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type sysGroupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage + Source sysKernelSockaddrStorage +} + +type sysICMPFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go new file mode 100644 index 0000000000..94116bfa66 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go @@ -0,0 +1,134 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +// +build linux,mips64 + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSizeofKernelSockaddrStorage = 0x80 + sysSizeofSockaddrInet = 0x10 + sysSizeofInetPktinfo = 0xc + sysSizeofSockExtendedErr = 0x10 + + sysSizeofIPMreq = 0x8 + sysSizeofIPMreqn = 0xc + sysSizeofIPMreqSource = 0xc + sysSizeofGroupReq = 0x88 + sysSizeofGroupSourceReq = 0x108 + + sysSizeofICMPFilter = 0x4 +) + +type sysKernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sysSockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sysInetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sysSockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type sysIPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type sysIPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type sysIPMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type sysGroupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage + Source sysKernelSockaddrStorage +} + +type sysICMPFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go new file mode 100644 index 0000000000..698d7db322 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go @@ -0,0 +1,134 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +// +build linux,mips64le + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSizeofKernelSockaddrStorage = 0x80 + sysSizeofSockaddrInet = 0x10 + sysSizeofInetPktinfo = 0xc + sysSizeofSockExtendedErr = 0x10 + + sysSizeofIPMreq = 0x8 + sysSizeofIPMreqn = 0xc + sysSizeofIPMreqSource = 0xc + sysSizeofGroupReq = 0x88 + sysSizeofGroupSourceReq = 0x108 + + sysSizeofICMPFilter = 0x4 +) + +type sysKernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sysSockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sysInetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sysSockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type sysIPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type sysIPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type sysIPMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type sysGroupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage + Source sysKernelSockaddrStorage +} + +type sysICMPFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go new file mode 100644 index 0000000000..9fe5ee2b64 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go @@ -0,0 +1,134 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +// +build linux,ppc64 + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSizeofKernelSockaddrStorage = 0x80 + sysSizeofSockaddrInet = 0x10 + sysSizeofInetPktinfo = 0xc + sysSizeofSockExtendedErr = 0x10 + + sysSizeofIPMreq = 0x8 + sysSizeofIPMreqn = 0xc + sysSizeofIPMreqSource = 0xc + sysSizeofGroupReq = 0x88 + sysSizeofGroupSourceReq = 0x108 + + sysSizeofICMPFilter = 0x4 +) + +type sysKernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sysSockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sysInetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sysSockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type sysIPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type sysIPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type sysIPMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type sysGroupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage + Source sysKernelSockaddrStorage +} + +type sysICMPFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go new file mode 100644 index 0000000000..3891f54efa --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go @@ -0,0 +1,134 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +// +build linux,ppc64le + +package ipv4 + +const ( + sysIP_TOS = 0x1 + sysIP_TTL = 0x2 + sysIP_HDRINCL = 0x3 + sysIP_OPTIONS = 0x4 + sysIP_ROUTER_ALERT = 0x5 + sysIP_RECVOPTS = 0x6 + sysIP_RETOPTS = 0x7 + sysIP_PKTINFO = 0x8 + sysIP_PKTOPTIONS = 0x9 + sysIP_MTU_DISCOVER = 0xa + sysIP_RECVERR = 0xb + sysIP_RECVTTL = 0xc + sysIP_RECVTOS = 0xd + sysIP_MTU = 0xe + sysIP_FREEBIND = 0xf + sysIP_TRANSPARENT = 0x13 + sysIP_RECVRETOPTS = 0x7 + sysIP_ORIGDSTADDR = 0x14 + sysIP_RECVORIGDSTADDR = 0x14 + sysIP_MINTTL = 0x15 + sysIP_NODEFRAG = 0x16 + sysIP_UNICAST_IF = 0x32 + + sysIP_MULTICAST_IF = 0x20 + sysIP_MULTICAST_TTL = 0x21 + sysIP_MULTICAST_LOOP = 0x22 + sysIP_ADD_MEMBERSHIP = 0x23 + sysIP_DROP_MEMBERSHIP = 0x24 + sysIP_UNBLOCK_SOURCE = 0x25 + sysIP_BLOCK_SOURCE = 0x26 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 + sysIP_MSFILTER = 0x29 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIP_MULTICAST_ALL = 0x31 + + sysICMP_FILTER = 0x1 + + sysSO_EE_ORIGIN_NONE = 0x0 + sysSO_EE_ORIGIN_LOCAL = 0x1 + sysSO_EE_ORIGIN_ICMP = 0x2 + sysSO_EE_ORIGIN_ICMP6 = 0x3 + sysSO_EE_ORIGIN_TXSTATUS = 0x4 + sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 + + sysSizeofKernelSockaddrStorage = 0x80 + sysSizeofSockaddrInet = 0x10 + sysSizeofInetPktinfo = 0xc + sysSizeofSockExtendedErr = 0x10 + + sysSizeofIPMreq = 0x8 + sysSizeofIPMreqn = 0xc + sysSizeofIPMreqSource = 0xc + sysSizeofGroupReq = 0x88 + sysSizeofGroupSourceReq = 0x108 + + sysSizeofICMPFilter = 0x4 +) + +type sysKernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sysSockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + X__pad [8]uint8 +} + +type sysInetPktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sysSockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} + +type sysIPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type sysIPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type sysIPMreqSource struct { + Multiaddr uint32 + Interface uint32 + Sourceaddr uint32 +} + +type sysGroupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage + Source sysKernelSockaddrStorage +} + +type sysICMPFilter struct { + Data uint32 +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_netbsd.go b/vendor/golang.org/x/net/ipv4/zsys_netbsd.go new file mode 100644 index 0000000000..8a440eb65b --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_netbsd.go @@ -0,0 +1,30 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_netbsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x14 + sysIP_RECVTTL = 0x17 + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + + sysSizeofIPMreq = 0x8 +) + +type sysIPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_openbsd.go b/vendor/golang.org/x/net/ipv4/zsys_openbsd.go new file mode 100644 index 0000000000..fd522b5738 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_openbsd.go @@ -0,0 +1,30 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_openbsd.go + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x1e + sysIP_RECVTTL = 0x1f + + sysIP_MULTICAST_IF = 0x9 + sysIP_MULTICAST_TTL = 0xa + sysIP_MULTICAST_LOOP = 0xb + sysIP_ADD_MEMBERSHIP = 0xc + sysIP_DROP_MEMBERSHIP = 0xd + + sysSizeofIPMreq = 0x8 +) + +type sysIPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} diff --git a/vendor/golang.org/x/net/ipv4/zsys_solaris.go b/vendor/golang.org/x/net/ipv4/zsys_solaris.go new file mode 100644 index 0000000000..d7c23349a3 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/zsys_solaris.go @@ -0,0 +1,60 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_solaris.go + +// +build solaris + +package ipv4 + +const ( + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x9 + sysIP_RECVSLLA = 0xa + sysIP_RECVTTL = 0xb + sysIP_NEXTHOP = 0x19 + sysIP_PKTINFO = 0x1a + sysIP_RECVPKTINFO = 0x1a + sysIP_DONTFRAG = 0x1b + sysIP_BOUND_IF = 0x41 + sysIP_UNSPEC_SRC = 0x42 + sysIP_BROADCAST_TTL = 0x43 + sysIP_DHCPINIT_IF = 0x45 + + sysIP_MULTICAST_IF = 0x10 + sysIP_MULTICAST_TTL = 0x11 + sysIP_MULTICAST_LOOP = 0x12 + sysIP_ADD_MEMBERSHIP = 0x13 + sysIP_DROP_MEMBERSHIP = 0x14 + sysIP_BLOCK_SOURCE = 0x15 + sysIP_UNBLOCK_SOURCE = 0x16 + sysIP_ADD_SOURCE_MEMBERSHIP = 0x17 + sysIP_DROP_SOURCE_MEMBERSHIP = 0x18 + + sysSizeofInetPktinfo = 0xc + + sysSizeofIPMreq = 0x8 + sysSizeofIPMreqSource = 0xc +) + +type sysInetPktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type sysIPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type sysIPMreqSource struct { + Multiaddr [4]byte /* in_addr */ + Sourceaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} diff --git a/vendor/golang.org/x/net/ipv6/control.go b/vendor/golang.org/x/net/ipv6/control.go new file mode 100644 index 0000000000..b7362aae79 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/control.go @@ -0,0 +1,85 @@ +// Copyright 2013 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 ipv6 + +import ( + "fmt" + "net" + "sync" +) + +// Note that RFC 3542 obsoletes RFC 2292 but OS X Snow Leopard and the +// former still support RFC 2292 only. Please be aware that almost +// all protocol implementations prohibit using a combination of RFC +// 2292 and RFC 3542 for some practical reasons. + +type rawOpt struct { + sync.RWMutex + cflags ControlFlags +} + +func (c *rawOpt) set(f ControlFlags) { c.cflags |= f } +func (c *rawOpt) clear(f ControlFlags) { c.cflags &^= f } +func (c *rawOpt) isset(f ControlFlags) bool { return c.cflags&f != 0 } + +// A ControlFlags represents per packet basis IP-level socket option +// control flags. +type ControlFlags uint + +const ( + FlagTrafficClass ControlFlags = 1 << iota // pass the traffic class on the received packet + FlagHopLimit // pass the hop limit on the received packet + FlagSrc // pass the source address on the received packet + FlagDst // pass the destination address on the received packet + FlagInterface // pass the interface index on the received packet + FlagPathMTU // pass the path MTU on the received packet path +) + +const flagPacketInfo = FlagDst | FlagInterface + +// A ControlMessage represents per packet basis IP-level socket +// options. +type ControlMessage struct { + // Receiving socket options: SetControlMessage allows to + // receive the options from the protocol stack using ReadFrom + // method of PacketConn. + // + // Specifying socket options: ControlMessage for WriteTo + // method of PacketConn allows to send the options to the + // protocol stack. + // + TrafficClass int // traffic class, must be 1 <= value <= 255 when specifying + HopLimit int // hop limit, must be 1 <= value <= 255 when specifying + Src net.IP // source address, specifying only + Dst net.IP // destination address, receiving only + IfIndex int // interface index, must be 1 <= value when specifying + NextHop net.IP // next hop address, specifying only + MTU int // path MTU, receiving only +} + +func (cm *ControlMessage) String() string { + if cm == nil { + return "" + } + return fmt.Sprintf("tclass=%#x hoplim=%d src=%v dst=%v ifindex=%d nexthop=%v mtu=%d", cm.TrafficClass, cm.HopLimit, cm.Src, cm.Dst, cm.IfIndex, cm.NextHop, cm.MTU) +} + +// Ancillary data socket options +const ( + ctlTrafficClass = iota // header field + ctlHopLimit // header field + ctlPacketInfo // inbound or outbound packet path + ctlNextHop // nexthop + ctlPathMTU // path mtu + ctlMax +) + +// A ctlOpt represents a binding for ancillary data socket option. +type ctlOpt struct { + name int // option name, must be equal or greater than 1 + length int // option length + marshal func([]byte, *ControlMessage) []byte + parse func(*ControlMessage, []byte) +} diff --git a/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go b/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go new file mode 100644 index 0000000000..80ec2e2f0b --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go @@ -0,0 +1,55 @@ +// Copyright 2013 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 darwin + +package ipv6 + +import ( + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" +) + +func marshal2292HopLimit(b []byte, cm *ControlMessage) []byte { + m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) + m.Level = iana.ProtocolIPv6 + m.Type = sysIPV6_2292HOPLIMIT + m.SetLen(syscall.CmsgLen(4)) + if cm != nil { + data := b[syscall.CmsgLen(0):] + nativeEndian.PutUint32(data[:4], uint32(cm.HopLimit)) + } + return b[syscall.CmsgSpace(4):] +} + +func marshal2292PacketInfo(b []byte, cm *ControlMessage) []byte { + m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) + m.Level = iana.ProtocolIPv6 + m.Type = sysIPV6_2292PKTINFO + m.SetLen(syscall.CmsgLen(sysSizeofInet6Pktinfo)) + if cm != nil { + pi := (*sysInet6Pktinfo)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) + if ip := cm.Src.To16(); ip != nil && ip.To4() == nil { + copy(pi.Addr[:], ip) + } + if cm.IfIndex > 0 { + pi.setIfindex(cm.IfIndex) + } + } + return b[syscall.CmsgSpace(sysSizeofInet6Pktinfo):] +} + +func marshal2292NextHop(b []byte, cm *ControlMessage) []byte { + m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) + m.Level = iana.ProtocolIPv6 + m.Type = sysIPV6_2292NEXTHOP + m.SetLen(syscall.CmsgLen(sysSizeofSockaddrInet6)) + if cm != nil { + sa := (*sysSockaddrInet6)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) + sa.setSockaddr(cm.NextHop, cm.IfIndex) + } + return b[syscall.CmsgSpace(sysSizeofSockaddrInet6):] +} diff --git a/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go b/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go new file mode 100644 index 0000000000..f344d16d03 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go @@ -0,0 +1,99 @@ +// Copyright 2013 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 darwin dragonfly freebsd linux netbsd openbsd + +package ipv6 + +import ( + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" +) + +func marshalTrafficClass(b []byte, cm *ControlMessage) []byte { + m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) + m.Level = iana.ProtocolIPv6 + m.Type = sysIPV6_TCLASS + m.SetLen(syscall.CmsgLen(4)) + if cm != nil { + data := b[syscall.CmsgLen(0):] + nativeEndian.PutUint32(data[:4], uint32(cm.TrafficClass)) + } + return b[syscall.CmsgSpace(4):] +} + +func parseTrafficClass(cm *ControlMessage, b []byte) { + cm.TrafficClass = int(nativeEndian.Uint32(b[:4])) +} + +func marshalHopLimit(b []byte, cm *ControlMessage) []byte { + m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) + m.Level = iana.ProtocolIPv6 + m.Type = sysIPV6_HOPLIMIT + m.SetLen(syscall.CmsgLen(4)) + if cm != nil { + data := b[syscall.CmsgLen(0):] + nativeEndian.PutUint32(data[:4], uint32(cm.HopLimit)) + } + return b[syscall.CmsgSpace(4):] +} + +func parseHopLimit(cm *ControlMessage, b []byte) { + cm.HopLimit = int(nativeEndian.Uint32(b[:4])) +} + +func marshalPacketInfo(b []byte, cm *ControlMessage) []byte { + m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) + m.Level = iana.ProtocolIPv6 + m.Type = sysIPV6_PKTINFO + m.SetLen(syscall.CmsgLen(sysSizeofInet6Pktinfo)) + if cm != nil { + pi := (*sysInet6Pktinfo)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) + if ip := cm.Src.To16(); ip != nil && ip.To4() == nil { + copy(pi.Addr[:], ip) + } + if cm.IfIndex > 0 { + pi.setIfindex(cm.IfIndex) + } + } + return b[syscall.CmsgSpace(sysSizeofInet6Pktinfo):] +} + +func parsePacketInfo(cm *ControlMessage, b []byte) { + pi := (*sysInet6Pktinfo)(unsafe.Pointer(&b[0])) + cm.Dst = pi.Addr[:] + cm.IfIndex = int(pi.Ifindex) +} + +func marshalNextHop(b []byte, cm *ControlMessage) []byte { + m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) + m.Level = iana.ProtocolIPv6 + m.Type = sysIPV6_NEXTHOP + m.SetLen(syscall.CmsgLen(sysSizeofSockaddrInet6)) + if cm != nil { + sa := (*sysSockaddrInet6)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) + sa.setSockaddr(cm.NextHop, cm.IfIndex) + } + return b[syscall.CmsgSpace(sysSizeofSockaddrInet6):] +} + +func parseNextHop(cm *ControlMessage, b []byte) { +} + +func marshalPathMTU(b []byte, cm *ControlMessage) []byte { + m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) + m.Level = iana.ProtocolIPv6 + m.Type = sysIPV6_PATHMTU + m.SetLen(syscall.CmsgLen(sysSizeofIPv6Mtuinfo)) + return b[syscall.CmsgSpace(sysSizeofIPv6Mtuinfo):] +} + +func parsePathMTU(cm *ControlMessage, b []byte) { + mi := (*sysIPv6Mtuinfo)(unsafe.Pointer(&b[0])) + cm.Dst = mi.Addr.Addr[:] + cm.IfIndex = int(mi.Addr.Scope_id) + cm.MTU = int(mi.Mtu) +} diff --git a/vendor/golang.org/x/net/ipv6/control_stub.go b/vendor/golang.org/x/net/ipv6/control_stub.go new file mode 100644 index 0000000000..2fecf7e5ce --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/control_stub.go @@ -0,0 +1,23 @@ +// Copyright 2013 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 nacl plan9 solaris + +package ipv6 + +func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error { + return errOpNoSupport +} + +func newControlMessage(opt *rawOpt) (oob []byte) { + return nil +} + +func parseControlMessage(b []byte) (*ControlMessage, error) { + return nil, errOpNoSupport +} + +func marshalControlMessage(cm *ControlMessage) (oob []byte) { + return nil +} diff --git a/vendor/golang.org/x/net/ipv6/control_unix.go b/vendor/golang.org/x/net/ipv6/control_unix.go new file mode 100644 index 0000000000..2af5beb43e --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/control_unix.go @@ -0,0 +1,166 @@ +// Copyright 2013 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 darwin dragonfly freebsd linux netbsd openbsd + +package ipv6 + +import ( + "os" + "syscall" + + "golang.org/x/net/internal/iana" +) + +func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error { + opt.Lock() + defer opt.Unlock() + if cf&FlagTrafficClass != 0 && sockOpts[ssoReceiveTrafficClass].name > 0 { + if err := setInt(fd, &sockOpts[ssoReceiveTrafficClass], boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagTrafficClass) + } else { + opt.clear(FlagTrafficClass) + } + } + if cf&FlagHopLimit != 0 && sockOpts[ssoReceiveHopLimit].name > 0 { + if err := setInt(fd, &sockOpts[ssoReceiveHopLimit], boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagHopLimit) + } else { + opt.clear(FlagHopLimit) + } + } + if cf&flagPacketInfo != 0 && sockOpts[ssoReceivePacketInfo].name > 0 { + if err := setInt(fd, &sockOpts[ssoReceivePacketInfo], boolint(on)); err != nil { + return err + } + if on { + opt.set(cf & flagPacketInfo) + } else { + opt.clear(cf & flagPacketInfo) + } + } + if cf&FlagPathMTU != 0 && sockOpts[ssoReceivePathMTU].name > 0 { + if err := setInt(fd, &sockOpts[ssoReceivePathMTU], boolint(on)); err != nil { + return err + } + if on { + opt.set(FlagPathMTU) + } else { + opt.clear(FlagPathMTU) + } + } + return nil +} + +func newControlMessage(opt *rawOpt) (oob []byte) { + opt.RLock() + var l int + if opt.isset(FlagTrafficClass) && ctlOpts[ctlTrafficClass].name > 0 { + l += syscall.CmsgSpace(ctlOpts[ctlTrafficClass].length) + } + if opt.isset(FlagHopLimit) && ctlOpts[ctlHopLimit].name > 0 { + l += syscall.CmsgSpace(ctlOpts[ctlHopLimit].length) + } + if opt.isset(flagPacketInfo) && ctlOpts[ctlPacketInfo].name > 0 { + l += syscall.CmsgSpace(ctlOpts[ctlPacketInfo].length) + } + if opt.isset(FlagPathMTU) && ctlOpts[ctlPathMTU].name > 0 { + l += syscall.CmsgSpace(ctlOpts[ctlPathMTU].length) + } + if l > 0 { + oob = make([]byte, l) + b := oob + if opt.isset(FlagTrafficClass) && ctlOpts[ctlTrafficClass].name > 0 { + b = ctlOpts[ctlTrafficClass].marshal(b, nil) + } + if opt.isset(FlagHopLimit) && ctlOpts[ctlHopLimit].name > 0 { + b = ctlOpts[ctlHopLimit].marshal(b, nil) + } + if opt.isset(flagPacketInfo) && ctlOpts[ctlPacketInfo].name > 0 { + b = ctlOpts[ctlPacketInfo].marshal(b, nil) + } + if opt.isset(FlagPathMTU) && ctlOpts[ctlPathMTU].name > 0 { + b = ctlOpts[ctlPathMTU].marshal(b, nil) + } + } + opt.RUnlock() + return +} + +func parseControlMessage(b []byte) (*ControlMessage, error) { + if len(b) == 0 { + return nil, nil + } + cmsgs, err := syscall.ParseSocketControlMessage(b) + if err != nil { + return nil, os.NewSyscallError("parse socket control message", err) + } + cm := &ControlMessage{} + for _, m := range cmsgs { + if m.Header.Level != iana.ProtocolIPv6 { + continue + } + switch int(m.Header.Type) { + case ctlOpts[ctlTrafficClass].name: + ctlOpts[ctlTrafficClass].parse(cm, m.Data[:]) + case ctlOpts[ctlHopLimit].name: + ctlOpts[ctlHopLimit].parse(cm, m.Data[:]) + case ctlOpts[ctlPacketInfo].name: + ctlOpts[ctlPacketInfo].parse(cm, m.Data[:]) + case ctlOpts[ctlPathMTU].name: + ctlOpts[ctlPathMTU].parse(cm, m.Data[:]) + } + } + return cm, nil +} + +func marshalControlMessage(cm *ControlMessage) (oob []byte) { + if cm == nil { + return + } + var l int + tclass := false + if ctlOpts[ctlTrafficClass].name > 0 && cm.TrafficClass > 0 { + tclass = true + l += syscall.CmsgSpace(ctlOpts[ctlTrafficClass].length) + } + hoplimit := false + if ctlOpts[ctlHopLimit].name > 0 && cm.HopLimit > 0 { + hoplimit = true + l += syscall.CmsgSpace(ctlOpts[ctlHopLimit].length) + } + pktinfo := false + if ctlOpts[ctlPacketInfo].name > 0 && (cm.Src.To16() != nil && cm.Src.To4() == nil || cm.IfIndex > 0) { + pktinfo = true + l += syscall.CmsgSpace(ctlOpts[ctlPacketInfo].length) + } + nexthop := false + if ctlOpts[ctlNextHop].name > 0 && cm.NextHop.To16() != nil && cm.NextHop.To4() == nil { + nexthop = true + l += syscall.CmsgSpace(ctlOpts[ctlNextHop].length) + } + if l > 0 { + oob = make([]byte, l) + b := oob + if tclass { + b = ctlOpts[ctlTrafficClass].marshal(b, cm) + } + if hoplimit { + b = ctlOpts[ctlHopLimit].marshal(b, cm) + } + if pktinfo { + b = ctlOpts[ctlPacketInfo].marshal(b, cm) + } + if nexthop { + b = ctlOpts[ctlNextHop].marshal(b, cm) + } + } + return +} diff --git a/vendor/golang.org/x/net/ipv6/control_windows.go b/vendor/golang.org/x/net/ipv6/control_windows.go new file mode 100644 index 0000000000..72fdc1b038 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/control_windows.go @@ -0,0 +1,27 @@ +// Copyright 2013 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 ipv6 + +import "syscall" + +func setControlMessage(fd syscall.Handle, opt *rawOpt, cf ControlFlags, on bool) error { + // TODO(mikio): implement this + return syscall.EWINDOWS +} + +func newControlMessage(opt *rawOpt) (oob []byte) { + // TODO(mikio): implement this + return nil +} + +func parseControlMessage(b []byte) (*ControlMessage, error) { + // TODO(mikio): implement this + return nil, syscall.EWINDOWS +} + +func marshalControlMessage(cm *ControlMessage) (oob []byte) { + // TODO(mikio): implement this + return nil +} diff --git a/vendor/golang.org/x/net/ipv6/defs_darwin.go b/vendor/golang.org/x/net/ipv6/defs_darwin.go new file mode 100644 index 0000000000..4c7f476a8d --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/defs_darwin.go @@ -0,0 +1,112 @@ +// 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 + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#define __APPLE_USE_RFC_3542 +#include +#include +*/ +import "C" + +const ( + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP + sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP + + sysIPV6_PORTRANGE = C.IPV6_PORTRANGE + sysICMP6_FILTER = C.ICMP6_FILTER + sysIPV6_2292PKTINFO = C.IPV6_2292PKTINFO + sysIPV6_2292HOPLIMIT = C.IPV6_2292HOPLIMIT + sysIPV6_2292NEXTHOP = C.IPV6_2292NEXTHOP + sysIPV6_2292HOPOPTS = C.IPV6_2292HOPOPTS + sysIPV6_2292DSTOPTS = C.IPV6_2292DSTOPTS + sysIPV6_2292RTHDR = C.IPV6_2292RTHDR + + sysIPV6_2292PKTOPTIONS = C.IPV6_2292PKTOPTIONS + + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_V6ONLY = C.IPV6_V6ONLY + + sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY + + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + sysIPV6_TCLASS = C.IPV6_TCLASS + + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + + sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + + sysIPV6_PATHMTU = C.IPV6_PATHMTU + + sysIPV6_PKTINFO = C.IPV6_PKTINFO + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + sysIPV6_RTHDR = C.IPV6_RTHDR + + sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL + + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + + sysIPV6_PREFER_TEMPADDR = C.IPV6_PREFER_TEMPADDR + + sysIPV6_MSFILTER = C.IPV6_MSFILTER + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + + sysIPV6_BOUND_IF = C.IPV6_BOUND_IF + + sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT + sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH + sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW + + sysSizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + + sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sysSizeofGroupReq = C.sizeof_struct_group_req + sysSizeofGroupSourceReq = C.sizeof_struct_group_source_req + + sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sysSockaddrStorage C.struct_sockaddr_storage + +type sysSockaddrInet6 C.struct_sockaddr_in6 + +type sysInet6Pktinfo C.struct_in6_pktinfo + +type sysIPv6Mtuinfo C.struct_ip6_mtuinfo + +type sysIPv6Mreq C.struct_ipv6_mreq + +type sysICMPv6Filter C.struct_icmp6_filter + +type sysGroupReq C.struct_group_req + +type sysGroupSourceReq C.struct_group_source_req diff --git a/vendor/golang.org/x/net/ipv6/defs_dragonfly.go b/vendor/golang.org/x/net/ipv6/defs_dragonfly.go new file mode 100644 index 0000000000..c72487ceb7 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/defs_dragonfly.go @@ -0,0 +1,84 @@ +// 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 + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#include +#include + +#include +#include +*/ +import "C" + +const ( + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP + sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP + sysIPV6_PORTRANGE = C.IPV6_PORTRANGE + sysICMP6_FILTER = C.ICMP6_FILTER + + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_V6ONLY = C.IPV6_V6ONLY + + sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY + + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + + sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + + sysIPV6_PATHMTU = C.IPV6_PATHMTU + + sysIPV6_PKTINFO = C.IPV6_PKTINFO + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + sysIPV6_RTHDR = C.IPV6_RTHDR + + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + + sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL + + sysIPV6_TCLASS = C.IPV6_TCLASS + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + + sysIPV6_PREFER_TEMPADDR = C.IPV6_PREFER_TEMPADDR + + sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT + sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH + sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW + + sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + + sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + + sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sysSockaddrInet6 C.struct_sockaddr_in6 + +type sysInet6Pktinfo C.struct_in6_pktinfo + +type sysIPv6Mtuinfo C.struct_ip6_mtuinfo + +type sysIPv6Mreq C.struct_ipv6_mreq + +type sysICMPv6Filter C.struct_icmp6_filter diff --git a/vendor/golang.org/x/net/ipv6/defs_freebsd.go b/vendor/golang.org/x/net/ipv6/defs_freebsd.go new file mode 100644 index 0000000000..de199ec6a7 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/defs_freebsd.go @@ -0,0 +1,105 @@ +// 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 + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#include +#include + +#include +#include +*/ +import "C" + +const ( + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP + sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP + sysIPV6_PORTRANGE = C.IPV6_PORTRANGE + sysICMP6_FILTER = C.ICMP6_FILTER + + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_V6ONLY = C.IPV6_V6ONLY + + sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY + + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + + sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + + sysIPV6_PATHMTU = C.IPV6_PATHMTU + + sysIPV6_PKTINFO = C.IPV6_PKTINFO + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + sysIPV6_RTHDR = C.IPV6_RTHDR + + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + + sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL + + sysIPV6_TCLASS = C.IPV6_TCLASS + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + + sysIPV6_PREFER_TEMPADDR = C.IPV6_PREFER_TEMPADDR + + sysIPV6_BINDANY = C.IPV6_BINDANY + + sysIPV6_MSFILTER = C.IPV6_MSFILTER + + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + + sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT + sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH + sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW + + sysSizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + + sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sysSizeofGroupReq = C.sizeof_struct_group_req + sysSizeofGroupSourceReq = C.sizeof_struct_group_source_req + + sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sysSockaddrStorage C.struct_sockaddr_storage + +type sysSockaddrInet6 C.struct_sockaddr_in6 + +type sysInet6Pktinfo C.struct_in6_pktinfo + +type sysIPv6Mtuinfo C.struct_ip6_mtuinfo + +type sysIPv6Mreq C.struct_ipv6_mreq + +type sysGroupReq C.struct_group_req + +type sysGroupSourceReq C.struct_group_source_req + +type sysICMPv6Filter C.struct_icmp6_filter diff --git a/vendor/golang.org/x/net/ipv6/defs_linux.go b/vendor/golang.org/x/net/ipv6/defs_linux.go new file mode 100644 index 0000000000..d83abce35f --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/defs_linux.go @@ -0,0 +1,136 @@ +// 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 + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#include +#include +#include +#include +*/ +import "C" + +const ( + sysIPV6_ADDRFORM = C.IPV6_ADDRFORM + sysIPV6_2292PKTINFO = C.IPV6_2292PKTINFO + sysIPV6_2292HOPOPTS = C.IPV6_2292HOPOPTS + sysIPV6_2292DSTOPTS = C.IPV6_2292DSTOPTS + sysIPV6_2292RTHDR = C.IPV6_2292RTHDR + sysIPV6_2292PKTOPTIONS = C.IPV6_2292PKTOPTIONS + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_2292HOPLIMIT = C.IPV6_2292HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_FLOWINFO = C.IPV6_FLOWINFO + + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_ADD_MEMBERSHIP = C.IPV6_ADD_MEMBERSHIP + sysIPV6_DROP_MEMBERSHIP = C.IPV6_DROP_MEMBERSHIP + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + sysMCAST_MSFILTER = C.MCAST_MSFILTER + sysIPV6_ROUTER_ALERT = C.IPV6_ROUTER_ALERT + sysIPV6_MTU_DISCOVER = C.IPV6_MTU_DISCOVER + sysIPV6_MTU = C.IPV6_MTU + sysIPV6_RECVERR = C.IPV6_RECVERR + sysIPV6_V6ONLY = C.IPV6_V6ONLY + sysIPV6_JOIN_ANYCAST = C.IPV6_JOIN_ANYCAST + sysIPV6_LEAVE_ANYCAST = C.IPV6_LEAVE_ANYCAST + + //sysIPV6_PMTUDISC_DONT = C.IPV6_PMTUDISC_DONT + //sysIPV6_PMTUDISC_WANT = C.IPV6_PMTUDISC_WANT + //sysIPV6_PMTUDISC_DO = C.IPV6_PMTUDISC_DO + //sysIPV6_PMTUDISC_PROBE = C.IPV6_PMTUDISC_PROBE + //sysIPV6_PMTUDISC_INTERFACE = C.IPV6_PMTUDISC_INTERFACE + //sysIPV6_PMTUDISC_OMIT = C.IPV6_PMTUDISC_OMIT + + sysIPV6_FLOWLABEL_MGR = C.IPV6_FLOWLABEL_MGR + sysIPV6_FLOWINFO_SEND = C.IPV6_FLOWINFO_SEND + + sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY + sysIPV6_XFRM_POLICY = C.IPV6_XFRM_POLICY + + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + sysIPV6_PKTINFO = C.IPV6_PKTINFO + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + sysIPV6_RTHDR = C.IPV6_RTHDR + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + sysIPV6_PATHMTU = C.IPV6_PATHMTU + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + sysIPV6_TCLASS = C.IPV6_TCLASS + + sysIPV6_ADDR_PREFERENCES = C.IPV6_ADDR_PREFERENCES + + sysIPV6_PREFER_SRC_TMP = C.IPV6_PREFER_SRC_TMP + sysIPV6_PREFER_SRC_PUBLIC = C.IPV6_PREFER_SRC_PUBLIC + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = C.IPV6_PREFER_SRC_PUBTMP_DEFAULT + sysIPV6_PREFER_SRC_COA = C.IPV6_PREFER_SRC_COA + sysIPV6_PREFER_SRC_HOME = C.IPV6_PREFER_SRC_HOME + sysIPV6_PREFER_SRC_CGA = C.IPV6_PREFER_SRC_CGA + sysIPV6_PREFER_SRC_NONCGA = C.IPV6_PREFER_SRC_NONCGA + + sysIPV6_MINHOPCOUNT = C.IPV6_MINHOPCOUNT + + sysIPV6_ORIGDSTADDR = C.IPV6_ORIGDSTADDR + sysIPV6_RECVORIGDSTADDR = C.IPV6_RECVORIGDSTADDR + sysIPV6_TRANSPARENT = C.IPV6_TRANSPARENT + sysIPV6_UNICAST_IF = C.IPV6_UNICAST_IF + + sysICMPV6_FILTER = C.ICMPV6_FILTER + + sysICMPV6_FILTER_BLOCK = C.ICMPV6_FILTER_BLOCK + sysICMPV6_FILTER_PASS = C.ICMPV6_FILTER_PASS + sysICMPV6_FILTER_BLOCKOTHERS = C.ICMPV6_FILTER_BLOCKOTHERS + sysICMPV6_FILTER_PASSONLY = C.ICMPV6_FILTER_PASSONLY + + sysSizeofKernelSockaddrStorage = C.sizeof_struct___kernel_sockaddr_storage + sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + sysSizeofIPv6FlowlabelReq = C.sizeof_struct_in6_flowlabel_req + + sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sysSizeofGroupReq = C.sizeof_struct_group_req + sysSizeofGroupSourceReq = C.sizeof_struct_group_source_req + + sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sysKernelSockaddrStorage C.struct___kernel_sockaddr_storage + +type sysSockaddrInet6 C.struct_sockaddr_in6 + +type sysInet6Pktinfo C.struct_in6_pktinfo + +type sysIPv6Mtuinfo C.struct_ip6_mtuinfo + +type sysIPv6FlowlabelReq C.struct_in6_flowlabel_req + +type sysIPv6Mreq C.struct_ipv6_mreq + +type sysGroupReq C.struct_group_req + +type sysGroupSourceReq C.struct_group_source_req + +type sysICMPv6Filter C.struct_icmp6_filter diff --git a/vendor/golang.org/x/net/ipv6/defs_netbsd.go b/vendor/golang.org/x/net/ipv6/defs_netbsd.go new file mode 100644 index 0000000000..7bd09e8e88 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/defs_netbsd.go @@ -0,0 +1,80 @@ +// 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 + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#include +#include + +#include +#include +*/ +import "C" + +const ( + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP + sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP + sysIPV6_PORTRANGE = C.IPV6_PORTRANGE + sysICMP6_FILTER = C.ICMP6_FILTER + + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_V6ONLY = C.IPV6_V6ONLY + + sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY + + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + + sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + sysIPV6_PATHMTU = C.IPV6_PATHMTU + + sysIPV6_PKTINFO = C.IPV6_PKTINFO + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + sysIPV6_RTHDR = C.IPV6_RTHDR + + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + + sysIPV6_TCLASS = C.IPV6_TCLASS + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + + sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT + sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH + sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW + + sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + + sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + + sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sysSockaddrInet6 C.struct_sockaddr_in6 + +type sysInet6Pktinfo C.struct_in6_pktinfo + +type sysIPv6Mtuinfo C.struct_ip6_mtuinfo + +type sysIPv6Mreq C.struct_ipv6_mreq + +type sysICMPv6Filter C.struct_icmp6_filter diff --git a/vendor/golang.org/x/net/ipv6/defs_openbsd.go b/vendor/golang.org/x/net/ipv6/defs_openbsd.go new file mode 100644 index 0000000000..6796d9b2f5 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/defs_openbsd.go @@ -0,0 +1,89 @@ +// 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 + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#include +#include + +#include +#include +*/ +import "C" + +const ( + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP + sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP + sysIPV6_PORTRANGE = C.IPV6_PORTRANGE + sysICMP6_FILTER = C.ICMP6_FILTER + + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_V6ONLY = C.IPV6_V6ONLY + + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + + sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + + sysIPV6_PATHMTU = C.IPV6_PATHMTU + + sysIPV6_PKTINFO = C.IPV6_PKTINFO + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + sysIPV6_RTHDR = C.IPV6_RTHDR + + sysIPV6_AUTH_LEVEL = C.IPV6_AUTH_LEVEL + sysIPV6_ESP_TRANS_LEVEL = C.IPV6_ESP_TRANS_LEVEL + sysIPV6_ESP_NETWORK_LEVEL = C.IPV6_ESP_NETWORK_LEVEL + sysIPSEC6_OUTSA = C.IPSEC6_OUTSA + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + + sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL + sysIPV6_IPCOMP_LEVEL = C.IPV6_IPCOMP_LEVEL + + sysIPV6_TCLASS = C.IPV6_TCLASS + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + sysIPV6_PIPEX = C.IPV6_PIPEX + + sysIPV6_RTABLE = C.IPV6_RTABLE + + sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT + sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH + sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW + + sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + + sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + + sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sysSockaddrInet6 C.struct_sockaddr_in6 + +type sysInet6Pktinfo C.struct_in6_pktinfo + +type sysIPv6Mtuinfo C.struct_ip6_mtuinfo + +type sysIPv6Mreq C.struct_ipv6_mreq + +type sysICMPv6Filter C.struct_icmp6_filter diff --git a/vendor/golang.org/x/net/ipv6/defs_solaris.go b/vendor/golang.org/x/net/ipv6/defs_solaris.go new file mode 100644 index 0000000000..972b171260 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/defs_solaris.go @@ -0,0 +1,96 @@ +// 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 + +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package ipv6 + +/* +#include +#include +*/ +import "C" + +const ( + sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS + sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF + sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS + sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP + sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP + sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP + + sysIPV6_PKTINFO = C.IPV6_PKTINFO + + sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT + sysIPV6_NEXTHOP = C.IPV6_NEXTHOP + sysIPV6_HOPOPTS = C.IPV6_HOPOPTS + sysIPV6_DSTOPTS = C.IPV6_DSTOPTS + + sysIPV6_RTHDR = C.IPV6_RTHDR + sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS + + sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO + sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT + sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS + + sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR + + sysIPV6_RECVRTHDRDSTOPTS = C.IPV6_RECVRTHDRDSTOPTS + + sysIPV6_CHECKSUM = C.IPV6_CHECKSUM + sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS + sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU + sysIPV6_DONTFRAG = C.IPV6_DONTFRAG + sysIPV6_SEC_OPT = C.IPV6_SEC_OPT + sysIPV6_SRC_PREFERENCES = C.IPV6_SRC_PREFERENCES + sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU + sysIPV6_PATHMTU = C.IPV6_PATHMTU + sysIPV6_TCLASS = C.IPV6_TCLASS + sysIPV6_V6ONLY = C.IPV6_V6ONLY + + sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + + sysIPV6_PREFER_SRC_HOME = C.IPV6_PREFER_SRC_HOME + sysIPV6_PREFER_SRC_COA = C.IPV6_PREFER_SRC_COA + sysIPV6_PREFER_SRC_PUBLIC = C.IPV6_PREFER_SRC_PUBLIC + sysIPV6_PREFER_SRC_TMP = C.IPV6_PREFER_SRC_TMP + sysIPV6_PREFER_SRC_NONCGA = C.IPV6_PREFER_SRC_NONCGA + sysIPV6_PREFER_SRC_CGA = C.IPV6_PREFER_SRC_CGA + + sysIPV6_PREFER_SRC_MIPMASK = C.IPV6_PREFER_SRC_MIPMASK + sysIPV6_PREFER_SRC_MIPDEFAULT = C.IPV6_PREFER_SRC_MIPDEFAULT + sysIPV6_PREFER_SRC_TMPMASK = C.IPV6_PREFER_SRC_TMPMASK + sysIPV6_PREFER_SRC_TMPDEFAULT = C.IPV6_PREFER_SRC_TMPDEFAULT + sysIPV6_PREFER_SRC_CGAMASK = C.IPV6_PREFER_SRC_CGAMASK + sysIPV6_PREFER_SRC_CGADEFAULT = C.IPV6_PREFER_SRC_CGADEFAULT + + sysIPV6_PREFER_SRC_MASK = C.IPV6_PREFER_SRC_MASK + + sysIPV6_PREFER_SRC_DEFAULT = C.IPV6_PREFER_SRC_DEFAULT + + sysIPV6_BOUND_IF = C.IPV6_BOUND_IF + sysIPV6_UNSPEC_SRC = C.IPV6_UNSPEC_SRC + + sysICMP6_FILTER = C.ICMP6_FILTER + + sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + + sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + + sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +type sysSockaddrInet6 C.struct_sockaddr_in6 + +type sysInet6Pktinfo C.struct_in6_pktinfo + +type sysIPv6Mtuinfo C.struct_ip6_mtuinfo + +type sysIPv6Mreq C.struct_ipv6_mreq + +type sysICMPv6Filter C.struct_icmp6_filter diff --git a/vendor/golang.org/x/net/ipv6/dgramopt_posix.go b/vendor/golang.org/x/net/ipv6/dgramopt_posix.go new file mode 100644 index 0000000000..93ff2f1af3 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/dgramopt_posix.go @@ -0,0 +1,288 @@ +// Copyright 2013 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 darwin dragonfly freebsd linux netbsd openbsd windows + +package ipv6 + +import ( + "net" + "syscall" +) + +// MulticastHopLimit returns the hop limit field value for outgoing +// multicast packets. +func (c *dgramOpt) MulticastHopLimit() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return 0, err + } + return getInt(fd, &sockOpts[ssoMulticastHopLimit]) +} + +// SetMulticastHopLimit sets the hop limit field value for future +// outgoing multicast packets. +func (c *dgramOpt) SetMulticastHopLimit(hoplim int) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + return setInt(fd, &sockOpts[ssoMulticastHopLimit], hoplim) +} + +// MulticastInterface returns the default interface for multicast +// packet transmissions. +func (c *dgramOpt) MulticastInterface() (*net.Interface, error) { + if !c.ok() { + return nil, syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return nil, err + } + return getInterface(fd, &sockOpts[ssoMulticastInterface]) +} + +// SetMulticastInterface sets the default interface for future +// multicast packet transmissions. +func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + return setInterface(fd, &sockOpts[ssoMulticastInterface], ifi) +} + +// MulticastLoopback reports whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) MulticastLoopback() (bool, error) { + if !c.ok() { + return false, syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return false, err + } + on, err := getInt(fd, &sockOpts[ssoMulticastLoopback]) + if err != nil { + return false, err + } + return on == 1, nil +} + +// SetMulticastLoopback sets whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) SetMulticastLoopback(on bool) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + return setInt(fd, &sockOpts[ssoMulticastLoopback], boolint(on)) +} + +// JoinGroup joins the group address group on the interface ifi. +// By default all sources that can cast data to group are accepted. +// It's possible to mute and unmute data transmission from a specific +// source by using ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup. +// JoinGroup uses the system assigned multicast interface when ifi is +// nil, although this is not recommended because the assignment +// depends on platforms and sometimes it might require routing +// configuration. +func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + return setGroup(fd, &sockOpts[ssoJoinGroup], ifi, grp) +} + +// LeaveGroup leaves the group address group on the interface ifi +// regardless of whether the group is any-source group or +// source-specific group. +func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + return setGroup(fd, &sockOpts[ssoLeaveGroup], ifi, grp) +} + +// JoinSourceSpecificGroup joins the source-specific group comprising +// group and source on the interface ifi. +// JoinSourceSpecificGroup uses the system assigned multicast +// interface when ifi is nil, although this is not recommended because +// the assignment depends on platforms and sometimes it might require +// routing configuration. +func (c *dgramOpt) JoinSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP16(source) + if src == nil { + return errMissingAddress + } + return setSourceGroup(fd, &sockOpts[ssoJoinSourceGroup], ifi, grp, src) +} + +// LeaveSourceSpecificGroup leaves the source-specific group on the +// interface ifi. +func (c *dgramOpt) LeaveSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP16(source) + if src == nil { + return errMissingAddress + } + return setSourceGroup(fd, &sockOpts[ssoLeaveSourceGroup], ifi, grp, src) +} + +// ExcludeSourceSpecificGroup excludes the source-specific group from +// the already joined any-source groups by JoinGroup on the interface +// ifi. +func (c *dgramOpt) ExcludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP16(source) + if src == nil { + return errMissingAddress + } + return setSourceGroup(fd, &sockOpts[ssoBlockSourceGroup], ifi, grp, src) +} + +// IncludeSourceSpecificGroup includes the excluded source-specific +// group by ExcludeSourceSpecificGroup again on the interface ifi. +func (c *dgramOpt) IncludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + grp := netAddrToIP16(group) + if grp == nil { + return errMissingAddress + } + src := netAddrToIP16(source) + if src == nil { + return errMissingAddress + } + return setSourceGroup(fd, &sockOpts[ssoUnblockSourceGroup], ifi, grp, src) +} + +// Checksum reports whether the kernel will compute, store or verify a +// checksum for both incoming and outgoing packets. If on is true, it +// returns an offset in bytes into the data of where the checksum +// field is located. +func (c *dgramOpt) Checksum() (on bool, offset int, err error) { + if !c.ok() { + return false, 0, syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return false, 0, err + } + offset, err = getInt(fd, &sockOpts[ssoChecksum]) + if err != nil { + return false, 0, err + } + if offset < 0 { + return false, 0, nil + } + return true, offset, nil +} + +// SetChecksum enables the kernel checksum processing. If on is ture, +// the offset should be an offset in bytes into the data of where the +// checksum field is located. +func (c *dgramOpt) SetChecksum(on bool, offset int) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + if !on { + offset = -1 + } + return setInt(fd, &sockOpts[ssoChecksum], offset) +} + +// ICMPFilter returns an ICMP filter. +func (c *dgramOpt) ICMPFilter() (*ICMPFilter, error) { + if !c.ok() { + return nil, syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return nil, err + } + return getICMPFilter(fd, &sockOpts[ssoICMPFilter]) +} + +// SetICMPFilter deploys the ICMP filter. +func (c *dgramOpt) SetICMPFilter(f *ICMPFilter) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + return setICMPFilter(fd, &sockOpts[ssoICMPFilter], f) +} diff --git a/vendor/golang.org/x/net/ipv6/dgramopt_stub.go b/vendor/golang.org/x/net/ipv6/dgramopt_stub.go new file mode 100644 index 0000000000..fb067fb2ff --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/dgramopt_stub.go @@ -0,0 +1,119 @@ +// Copyright 2013 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 nacl plan9 solaris + +package ipv6 + +import "net" + +// MulticastHopLimit returns the hop limit field value for outgoing +// multicast packets. +func (c *dgramOpt) MulticastHopLimit() (int, error) { + return 0, errOpNoSupport +} + +// SetMulticastHopLimit sets the hop limit field value for future +// outgoing multicast packets. +func (c *dgramOpt) SetMulticastHopLimit(hoplim int) error { + return errOpNoSupport +} + +// MulticastInterface returns the default interface for multicast +// packet transmissions. +func (c *dgramOpt) MulticastInterface() (*net.Interface, error) { + return nil, errOpNoSupport +} + +// SetMulticastInterface sets the default interface for future +// multicast packet transmissions. +func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error { + return errOpNoSupport +} + +// MulticastLoopback reports whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) MulticastLoopback() (bool, error) { + return false, errOpNoSupport +} + +// SetMulticastLoopback sets whether transmitted multicast packets +// should be copied and send back to the originator. +func (c *dgramOpt) SetMulticastLoopback(on bool) error { + return errOpNoSupport +} + +// JoinGroup joins the group address group on the interface ifi. +// By default all sources that can cast data to group are accepted. +// It's possible to mute and unmute data transmission from a specific +// source by using ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup. +// JoinGroup uses the system assigned multicast interface when ifi is +// nil, although this is not recommended because the assignment +// depends on platforms and sometimes it might require routing +// configuration. +func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error { + return errOpNoSupport +} + +// LeaveGroup leaves the group address group on the interface ifi +// regardless of whether the group is any-source group or +// source-specific group. +func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error { + return errOpNoSupport +} + +// JoinSourceSpecificGroup joins the source-specific group comprising +// group and source on the interface ifi. +// JoinSourceSpecificGroup uses the system assigned multicast +// interface when ifi is nil, although this is not recommended because +// the assignment depends on platforms and sometimes it might require +// routing configuration. +func (c *dgramOpt) JoinSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + return errOpNoSupport +} + +// LeaveSourceSpecificGroup leaves the source-specific group on the +// interface ifi. +func (c *dgramOpt) LeaveSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + return errOpNoSupport +} + +// ExcludeSourceSpecificGroup excludes the source-specific group from +// the already joined any-source groups by JoinGroup on the interface +// ifi. +func (c *dgramOpt) ExcludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + return errOpNoSupport +} + +// IncludeSourceSpecificGroup includes the excluded source-specific +// group by ExcludeSourceSpecificGroup again on the interface ifi. +func (c *dgramOpt) IncludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { + return errOpNoSupport +} + +// Checksum reports whether the kernel will compute, store or verify a +// checksum for both incoming and outgoing packets. If on is true, it +// returns an offset in bytes into the data of where the checksum +// field is located. +func (c *dgramOpt) Checksum() (on bool, offset int, err error) { + return false, 0, errOpNoSupport +} + +// SetChecksum enables the kernel checksum processing. If on is ture, +// the offset should be an offset in bytes into the data of where the +// checksum field is located. +func (c *dgramOpt) SetChecksum(on bool, offset int) error { + return errOpNoSupport +} + +// ICMPFilter returns an ICMP filter. +func (c *dgramOpt) ICMPFilter() (*ICMPFilter, error) { + return nil, errOpNoSupport +} + +// SetICMPFilter deploys the ICMP filter. +func (c *dgramOpt) SetICMPFilter(f *ICMPFilter) error { + return errOpNoSupport +} diff --git a/vendor/golang.org/x/net/ipv6/doc.go b/vendor/golang.org/x/net/ipv6/doc.go new file mode 100644 index 0000000000..dd13aa21f8 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/doc.go @@ -0,0 +1,240 @@ +// Copyright 2013 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 ipv6 implements IP-level socket options for the Internet +// Protocol version 6. +// +// The package provides IP-level socket options that allow +// manipulation of IPv6 facilities. +// +// The IPv6 protocol is defined in RFC 2460. +// Basic and advanced socket interface extensions are defined in RFC +// 3493 and RFC 3542. +// Socket interface extensions for multicast source filters are +// defined in RFC 3678. +// MLDv1 and MLDv2 are defined in RFC 2710 and RFC 3810. +// Source-specific multicast is defined in RFC 4607. +// +// +// Unicasting +// +// The options for unicasting are available for net.TCPConn, +// net.UDPConn and net.IPConn which are created as network connections +// that use the IPv6 transport. When a single TCP connection carrying +// a data flow of multiple packets needs to indicate the flow is +// important, ipv6.Conn is used to set the traffic class field on the +// IPv6 header for each packet. +// +// ln, err := net.Listen("tcp6", "[::]:1024") +// if err != nil { +// // error handling +// } +// defer ln.Close() +// for { +// c, err := ln.Accept() +// if err != nil { +// // error handling +// } +// go func(c net.Conn) { +// defer c.Close() +// +// The outgoing packets will be labeled DiffServ assured forwarding +// class 1 low drop precedence, known as AF11 packets. +// +// if err := ipv6.NewConn(c).SetTrafficClass(0x28); err != nil { +// // error handling +// } +// if _, err := c.Write(data); err != nil { +// // error handling +// } +// }(c) +// } +// +// +// Multicasting +// +// The options for multicasting are available for net.UDPConn and +// net.IPconn which are created as network connections that use the +// IPv6 transport. A few network facilities must be prepared before +// you begin multicasting, at a minimum joining network interfaces and +// multicast groups. +// +// en0, err := net.InterfaceByName("en0") +// if err != nil { +// // error handling +// } +// en1, err := net.InterfaceByIndex(911) +// if err != nil { +// // error handling +// } +// group := net.ParseIP("ff02::114") +// +// First, an application listens to an appropriate address with an +// appropriate service port. +// +// c, err := net.ListenPacket("udp6", "[::]:1024") +// if err != nil { +// // error handling +// } +// defer c.Close() +// +// Second, the application joins multicast groups, starts listening to +// the groups on the specified network interfaces. Note that the +// service port for transport layer protocol does not matter with this +// operation as joining groups affects only network and link layer +// protocols, such as IPv6 and Ethernet. +// +// p := ipv6.NewPacketConn(c) +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: group}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en1, &net.UDPAddr{IP: group}); err != nil { +// // error handling +// } +// +// The application might set per packet control message transmissions +// between the protocol stack within the kernel. When the application +// needs a destination address on an incoming packet, +// SetControlMessage of ipv6.PacketConn is used to enable control +// message transmissons. +// +// if err := p.SetControlMessage(ipv6.FlagDst, true); err != nil { +// // error handling +// } +// +// The application could identify whether the received packets are +// of interest by using the control message that contains the +// destination address of the received packet. +// +// b := make([]byte, 1500) +// for { +// n, rcm, src, err := p.ReadFrom(b) +// if err != nil { +// // error handling +// } +// if rcm.Dst.IsMulticast() { +// if rcm.Dst.Equal(group) { +// // joined group, do something +// } else { +// // unknown group, discard +// continue +// } +// } +// +// The application can also send both unicast and multicast packets. +// +// p.SetTrafficClass(0x0) +// p.SetHopLimit(16) +// if _, err := p.WriteTo(data[:n], nil, src); err != nil { +// // error handling +// } +// dst := &net.UDPAddr{IP: group, Port: 1024} +// wcm := ipv6.ControlMessage{TrafficClass: 0xe0, HopLimit: 1} +// for _, ifi := range []*net.Interface{en0, en1} { +// wcm.IfIndex = ifi.Index +// if _, err := p.WriteTo(data[:n], &wcm, dst); err != nil { +// // error handling +// } +// } +// } +// +// +// More multicasting +// +// An application that uses PacketConn may join multiple multicast +// groups. For example, a UDP listener with port 1024 might join two +// different groups across over two different network interfaces by +// using: +// +// c, err := net.ListenPacket("udp6", "[::]:1024") +// if err != nil { +// // error handling +// } +// defer c.Close() +// p := ipv6.NewPacketConn(c) +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::1:114")}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::2:114")}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en1, &net.UDPAddr{IP: net.ParseIP("ff02::2:114")}); err != nil { +// // error handling +// } +// +// It is possible for multiple UDP listeners that listen on the same +// UDP port to join the same multicast group. The net package will +// provide a socket that listens to a wildcard address with reusable +// UDP port when an appropriate multicast address prefix is passed to +// the net.ListenPacket or net.ListenUDP. +// +// c1, err := net.ListenPacket("udp6", "[ff02::]:1024") +// if err != nil { +// // error handling +// } +// defer c1.Close() +// c2, err := net.ListenPacket("udp6", "[ff02::]:1024") +// if err != nil { +// // error handling +// } +// defer c2.Close() +// p1 := ipv6.NewPacketConn(c1) +// if err := p1.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::114")}); err != nil { +// // error handling +// } +// p2 := ipv6.NewPacketConn(c2) +// if err := p2.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::114")}); err != nil { +// // error handling +// } +// +// Also it is possible for the application to leave or rejoin a +// multicast group on the network interface. +// +// if err := p.LeaveGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::114")}); err != nil { +// // error handling +// } +// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff01::114")}); err != nil { +// // error handling +// } +// +// +// Source-specific multicasting +// +// An application that uses PacketConn on MLDv2 supported platform is +// able to join source-specific multicast groups. +// The application may use JoinSourceSpecificGroup and +// LeaveSourceSpecificGroup for the operation known as "include" mode, +// +// ssmgroup := net.UDPAddr{IP: net.ParseIP("ff32::8000:9")} +// ssmsource := net.UDPAddr{IP: net.ParseIP("fe80::cafe")} +// if err := p.JoinSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { +// // error handling +// } +// if err := p.LeaveSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { +// // error handling +// } +// +// or JoinGroup, ExcludeSourceSpecificGroup, +// IncludeSourceSpecificGroup and LeaveGroup for the operation known +// as "exclude" mode. +// +// exclsource := net.UDPAddr{IP: net.ParseIP("fe80::dead")} +// if err := p.JoinGroup(en0, &ssmgroup); err != nil { +// // error handling +// } +// if err := p.ExcludeSourceSpecificGroup(en0, &ssmgroup, &exclsource); err != nil { +// // error handling +// } +// if err := p.LeaveGroup(en0, &ssmgroup); err != nil { +// // error handling +// } +// +// Note that it depends on each platform implementation what happens +// when an application which runs on MLDv2 unsupported platform uses +// JoinSourceSpecificGroup and LeaveSourceSpecificGroup. +// In general the platform tries to fall back to conversations using +// MLDv1 and starts to listen to multicast traffic. +// In the fallback case, ExcludeSourceSpecificGroup and +// IncludeSourceSpecificGroup may return an error. +package ipv6 // import "golang.org/x/net/ipv6" diff --git a/vendor/golang.org/x/net/ipv6/endpoint.go b/vendor/golang.org/x/net/ipv6/endpoint.go new file mode 100644 index 0000000000..966eaa8920 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/endpoint.go @@ -0,0 +1,123 @@ +// Copyright 2013 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 ipv6 + +import ( + "net" + "syscall" + "time" +) + +// A Conn represents a network endpoint that uses IPv6 transport. +// It allows to set basic IP-level socket options such as traffic +// class and hop limit. +type Conn struct { + genericOpt +} + +type genericOpt struct { + net.Conn +} + +func (c *genericOpt) ok() bool { return c != nil && c.Conn != nil } + +// PathMTU returns a path MTU value for the destination associated +// with the endpoint. +func (c *Conn) PathMTU() (int, error) { + if !c.genericOpt.ok() { + return 0, syscall.EINVAL + } + fd, err := c.genericOpt.sysfd() + if err != nil { + return 0, err + } + _, mtu, err := getMTUInfo(fd, &sockOpts[ssoPathMTU]) + if err != nil { + return 0, err + } + return mtu, nil +} + +// NewConn returns a new Conn. +func NewConn(c net.Conn) *Conn { + return &Conn{ + genericOpt: genericOpt{Conn: c}, + } +} + +// A PacketConn represents a packet network endpoint that uses IPv6 +// transport. It is used to control several IP-level socket options +// including IPv6 header manipulation. It also provides datagram +// based network I/O methods specific to the IPv6 and higher layer +// protocols such as OSPF, GRE, and UDP. +type PacketConn struct { + genericOpt + dgramOpt + payloadHandler +} + +type dgramOpt struct { + net.PacketConn +} + +func (c *dgramOpt) ok() bool { return c != nil && c.PacketConn != nil } + +// SetControlMessage allows to receive the per packet basis IP-level +// socket options. +func (c *PacketConn) SetControlMessage(cf ControlFlags, on bool) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + fd, err := c.payloadHandler.sysfd() + if err != nil { + return err + } + return setControlMessage(fd, &c.payloadHandler.rawOpt, cf, on) +} + +// SetDeadline sets the read and write deadlines associated with the +// endpoint. +func (c *PacketConn) SetDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.SetDeadline(t) +} + +// SetReadDeadline sets the read deadline associated with the +// endpoint. +func (c *PacketConn) SetReadDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.SetReadDeadline(t) +} + +// SetWriteDeadline sets the write deadline associated with the +// endpoint. +func (c *PacketConn) SetWriteDeadline(t time.Time) error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.SetWriteDeadline(t) +} + +// Close closes the endpoint. +func (c *PacketConn) Close() error { + if !c.payloadHandler.ok() { + return syscall.EINVAL + } + return c.payloadHandler.Close() +} + +// NewPacketConn returns a new PacketConn using c as its underlying +// transport. +func NewPacketConn(c net.PacketConn) *PacketConn { + return &PacketConn{ + genericOpt: genericOpt{Conn: c.(net.Conn)}, + dgramOpt: dgramOpt{PacketConn: c}, + payloadHandler: payloadHandler{PacketConn: c}, + } +} diff --git a/vendor/golang.org/x/net/ipv6/example_test.go b/vendor/golang.org/x/net/ipv6/example_test.go new file mode 100644 index 0000000000..e761aa2a17 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/example_test.go @@ -0,0 +1,216 @@ +// 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 ipv6_test + +import ( + "fmt" + "log" + "net" + "os" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/ipv6" +) + +func ExampleConn_markingTCP() { + ln, err := net.Listen("tcp", "[::]:1024") + if err != nil { + log.Fatal(err) + } + defer ln.Close() + + for { + c, err := ln.Accept() + if err != nil { + log.Fatal(err) + } + go func(c net.Conn) { + defer c.Close() + if c.RemoteAddr().(*net.TCPAddr).IP.To16() != nil && c.RemoteAddr().(*net.TCPAddr).IP.To4() == nil { + p := ipv6.NewConn(c) + if err := p.SetTrafficClass(0x28); err != nil { // DSCP AF11 + log.Fatal(err) + } + if err := p.SetHopLimit(128); err != nil { + log.Fatal(err) + } + } + if _, err := c.Write([]byte("HELLO-R-U-THERE-ACK")); err != nil { + log.Fatal(err) + } + }(c) + } +} + +func ExamplePacketConn_servingOneShotMulticastDNS() { + c, err := net.ListenPacket("udp6", "[::]:5353") // mDNS over UDP + if err != nil { + log.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + + en0, err := net.InterfaceByName("en0") + if err != nil { + log.Fatal(err) + } + mDNSLinkLocal := net.UDPAddr{IP: net.ParseIP("ff02::fb")} + if err := p.JoinGroup(en0, &mDNSLinkLocal); err != nil { + log.Fatal(err) + } + defer p.LeaveGroup(en0, &mDNSLinkLocal) + if err := p.SetControlMessage(ipv6.FlagDst|ipv6.FlagInterface, true); err != nil { + log.Fatal(err) + } + + var wcm ipv6.ControlMessage + b := make([]byte, 1500) + for { + _, rcm, peer, err := p.ReadFrom(b) + if err != nil { + log.Fatal(err) + } + if !rcm.Dst.IsMulticast() || !rcm.Dst.Equal(mDNSLinkLocal.IP) { + continue + } + wcm.IfIndex = rcm.IfIndex + answers := []byte("FAKE-MDNS-ANSWERS") // fake mDNS answers, you need to implement this + if _, err := p.WriteTo(answers, &wcm, peer); err != nil { + log.Fatal(err) + } + } +} + +func ExamplePacketConn_tracingIPPacketRoute() { + // Tracing an IP packet route to www.google.com. + + const host = "www.google.com" + ips, err := net.LookupIP(host) + if err != nil { + log.Fatal(err) + } + var dst net.IPAddr + for _, ip := range ips { + if ip.To16() != nil && ip.To4() == nil { + dst.IP = ip + fmt.Printf("using %v for tracing an IP packet route to %s\n", dst.IP, host) + break + } + } + if dst.IP == nil { + log.Fatal("no AAAA record found") + } + + c, err := net.ListenPacket("ip6:58", "::") // ICMP for IPv6 + if err != nil { + log.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + + if err := p.SetControlMessage(ipv6.FlagHopLimit|ipv6.FlagSrc|ipv6.FlagDst|ipv6.FlagInterface, true); err != nil { + log.Fatal(err) + } + wm := icmp.Message{ + Type: ipv6.ICMPTypeEchoRequest, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, + Data: []byte("HELLO-R-U-THERE"), + }, + } + var f ipv6.ICMPFilter + f.SetAll(true) + f.Accept(ipv6.ICMPTypeTimeExceeded) + f.Accept(ipv6.ICMPTypeEchoReply) + if err := p.SetICMPFilter(&f); err != nil { + log.Fatal(err) + } + + var wcm ipv6.ControlMessage + rb := make([]byte, 1500) + for i := 1; i <= 64; i++ { // up to 64 hops + wm.Body.(*icmp.Echo).Seq = i + wb, err := wm.Marshal(nil) + if err != nil { + log.Fatal(err) + } + + // In the real world usually there are several + // multiple traffic-engineered paths for each hop. + // You may need to probe a few times to each hop. + begin := time.Now() + wcm.HopLimit = i + if _, err := p.WriteTo(wb, &wcm, &dst); err != nil { + log.Fatal(err) + } + if err := p.SetReadDeadline(time.Now().Add(3 * time.Second)); err != nil { + log.Fatal(err) + } + n, rcm, peer, err := p.ReadFrom(rb) + if err != nil { + if err, ok := err.(net.Error); ok && err.Timeout() { + fmt.Printf("%v\t*\n", i) + continue + } + log.Fatal(err) + } + rm, err := icmp.ParseMessage(58, rb[:n]) + if err != nil { + log.Fatal(err) + } + rtt := time.Since(begin) + + // In the real world you need to determine whether the + // received message is yours using ControlMessage.Src, + // ControlMesage.Dst, icmp.Echo.ID and icmp.Echo.Seq. + switch rm.Type { + case ipv6.ICMPTypeTimeExceeded: + names, _ := net.LookupAddr(peer.String()) + fmt.Printf("%d\t%v %+v %v\n\t%+v\n", i, peer, names, rtt, rcm) + case ipv6.ICMPTypeEchoReply: + names, _ := net.LookupAddr(peer.String()) + fmt.Printf("%d\t%v %+v %v\n\t%+v\n", i, peer, names, rtt, rcm) + return + } + } +} + +func ExamplePacketConn_advertisingOSPFHello() { + c, err := net.ListenPacket("ip6:89", "::") // OSPF for IPv6 + if err != nil { + log.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + + en0, err := net.InterfaceByName("en0") + if err != nil { + log.Fatal(err) + } + allSPFRouters := net.IPAddr{IP: net.ParseIP("ff02::5")} + if err := p.JoinGroup(en0, &allSPFRouters); err != nil { + log.Fatal(err) + } + defer p.LeaveGroup(en0, &allSPFRouters) + + hello := make([]byte, 24) // fake hello data, you need to implement this + ospf := make([]byte, 16) // fake ospf header, you need to implement this + ospf[0] = 3 // version 3 + ospf[1] = 1 // hello packet + ospf = append(ospf, hello...) + if err := p.SetChecksum(true, 12); err != nil { + log.Fatal(err) + } + + cm := ipv6.ControlMessage{ + TrafficClass: 0xc0, // DSCP CS6 + HopLimit: 1, + IfIndex: en0.Index, + } + if _, err := p.WriteTo(ospf, &cm, &allSPFRouters); err != nil { + log.Fatal(err) + } +} diff --git a/vendor/golang.org/x/net/ipv6/gen.go b/vendor/golang.org/x/net/ipv6/gen.go new file mode 100644 index 0000000000..b1e0ea3783 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/gen.go @@ -0,0 +1,208 @@ +// Copyright 2013 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 + +//go:generate go run gen.go + +// This program generates system adaptation constants and types, +// internet protocol constants and tables by reading template files +// and IANA protocol registries. +package main + +import ( + "bytes" + "encoding/xml" + "fmt" + "go/format" + "io" + "io/ioutil" + "net/http" + "os" + "os/exec" + "runtime" + "strconv" + "strings" +) + +func main() { + if err := genzsys(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + if err := geniana(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func genzsys() error { + defs := "defs_" + runtime.GOOS + ".go" + f, err := os.Open(defs) + if err != nil { + if os.IsNotExist(err) { + return nil + } + return err + } + f.Close() + cmd := exec.Command("go", "tool", "cgo", "-godefs", defs) + b, err := cmd.Output() + if err != nil { + return err + } + // The ipv6 pacakge still supports go1.2, and so we need to + // take care of additional platforms in go1.3 and above for + // working with go1.2. + switch { + case runtime.GOOS == "dragonfly" || runtime.GOOS == "solaris": + b = bytes.Replace(b, []byte("package ipv6\n"), []byte("// +build "+runtime.GOOS+"\n\npackage ipv6\n"), 1) + case runtime.GOOS == "linux" && (runtime.GOARCH == "arm64" || runtime.GOARCH == "mips64" || runtime.GOARCH == "mips64le" || runtime.GOARCH == "ppc64" || runtime.GOARCH == "ppc64le"): + b = bytes.Replace(b, []byte("package ipv6\n"), []byte("// +build "+runtime.GOOS+","+runtime.GOARCH+"\n\npackage ipv6\n"), 1) + } + b, err = format.Source(b) + if err != nil { + return err + } + zsys := "zsys_" + runtime.GOOS + ".go" + switch runtime.GOOS { + case "freebsd", "linux": + zsys = "zsys_" + runtime.GOOS + "_" + runtime.GOARCH + ".go" + } + if err := ioutil.WriteFile(zsys, b, 0644); err != nil { + return err + } + return nil +} + +var registries = []struct { + url string + parse func(io.Writer, io.Reader) error +}{ + { + "http://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xml", + parseICMPv6Parameters, + }, +} + +func geniana() error { + var bb bytes.Buffer + fmt.Fprintf(&bb, "// go generate gen.go\n") + fmt.Fprintf(&bb, "// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n") + fmt.Fprintf(&bb, "package ipv6\n\n") + for _, r := range registries { + resp, err := http.Get(r.url) + if err != nil { + return err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("got HTTP status code %v for %v\n", resp.StatusCode, r.url) + } + if err := r.parse(&bb, resp.Body); err != nil { + return err + } + fmt.Fprintf(&bb, "\n") + } + b, err := format.Source(bb.Bytes()) + if err != nil { + return err + } + if err := ioutil.WriteFile("iana.go", b, 0644); err != nil { + return err + } + return nil +} + +func parseICMPv6Parameters(w io.Writer, r io.Reader) error { + dec := xml.NewDecoder(r) + var icp icmpv6Parameters + if err := dec.Decode(&icp); err != nil { + return err + } + prs := icp.escape() + fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) + fmt.Fprintf(w, "const (\n") + for _, pr := range prs { + if pr.Name == "" { + continue + } + fmt.Fprintf(w, "ICMPType%s ICMPType = %d", pr.Name, pr.Value) + fmt.Fprintf(w, "// %s\n", pr.OrigName) + } + fmt.Fprintf(w, ")\n\n") + fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) + fmt.Fprintf(w, "var icmpTypes = map[ICMPType]string{\n") + for _, pr := range prs { + if pr.Name == "" { + continue + } + fmt.Fprintf(w, "%d: %q,\n", pr.Value, strings.ToLower(pr.OrigName)) + } + fmt.Fprintf(w, "}\n") + return nil +} + +type icmpv6Parameters struct { + XMLName xml.Name `xml:"registry"` + Title string `xml:"title"` + Updated string `xml:"updated"` + Registries []struct { + Title string `xml:"title"` + Records []struct { + Value string `xml:"value"` + Name string `xml:"name"` + } `xml:"record"` + } `xml:"registry"` +} + +type canonICMPv6ParamRecord struct { + OrigName string + Name string + Value int +} + +func (icp *icmpv6Parameters) escape() []canonICMPv6ParamRecord { + id := -1 + for i, r := range icp.Registries { + if strings.Contains(r.Title, "Type") || strings.Contains(r.Title, "type") { + id = i + break + } + } + if id < 0 { + return nil + } + prs := make([]canonICMPv6ParamRecord, len(icp.Registries[id].Records)) + sr := strings.NewReplacer( + "Messages", "", + "Message", "", + "ICMP", "", + "+", "P", + "-", "", + "/", "", + ".", "", + " ", "", + ) + for i, pr := range icp.Registries[id].Records { + if strings.Contains(pr.Name, "Reserved") || + strings.Contains(pr.Name, "Unassigned") || + strings.Contains(pr.Name, "Deprecated") || + strings.Contains(pr.Name, "Experiment") || + strings.Contains(pr.Name, "experiment") { + continue + } + ss := strings.Split(pr.Name, "\n") + if len(ss) > 1 { + prs[i].Name = strings.Join(ss, " ") + } else { + prs[i].Name = ss[0] + } + s := strings.TrimSpace(prs[i].Name) + prs[i].OrigName = s + prs[i].Name = sr.Replace(s) + prs[i].Value, _ = strconv.Atoi(pr.Value) + } + return prs +} diff --git a/vendor/golang.org/x/net/ipv6/genericopt_posix.go b/vendor/golang.org/x/net/ipv6/genericopt_posix.go new file mode 100644 index 0000000000..dd77a0167e --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/genericopt_posix.go @@ -0,0 +1,60 @@ +// Copyright 2013 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 darwin dragonfly freebsd linux netbsd openbsd windows + +package ipv6 + +import "syscall" + +// TrafficClass returns the traffic class field value for outgoing +// packets. +func (c *genericOpt) TrafficClass() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return 0, err + } + return getInt(fd, &sockOpts[ssoTrafficClass]) +} + +// SetTrafficClass sets the traffic class field value for future +// outgoing packets. +func (c *genericOpt) SetTrafficClass(tclass int) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + return setInt(fd, &sockOpts[ssoTrafficClass], tclass) +} + +// HopLimit returns the hop limit field value for outgoing packets. +func (c *genericOpt) HopLimit() (int, error) { + if !c.ok() { + return 0, syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return 0, err + } + return getInt(fd, &sockOpts[ssoHopLimit]) +} + +// SetHopLimit sets the hop limit field value for future outgoing +// packets. +func (c *genericOpt) SetHopLimit(hoplim int) error { + if !c.ok() { + return syscall.EINVAL + } + fd, err := c.sysfd() + if err != nil { + return err + } + return setInt(fd, &sockOpts[ssoHopLimit], hoplim) +} diff --git a/vendor/golang.org/x/net/ipv6/genericopt_stub.go b/vendor/golang.org/x/net/ipv6/genericopt_stub.go new file mode 100644 index 0000000000..f5c3722421 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/genericopt_stub.go @@ -0,0 +1,30 @@ +// Copyright 2013 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 nacl plan9 solaris + +package ipv6 + +// TrafficClass returns the traffic class field value for outgoing +// packets. +func (c *genericOpt) TrafficClass() (int, error) { + return 0, errOpNoSupport +} + +// SetTrafficClass sets the traffic class field value for future +// outgoing packets. +func (c *genericOpt) SetTrafficClass(tclass int) error { + return errOpNoSupport +} + +// HopLimit returns the hop limit field value for outgoing packets. +func (c *genericOpt) HopLimit() (int, error) { + return 0, errOpNoSupport +} + +// SetHopLimit sets the hop limit field value for future outgoing +// packets. +func (c *genericOpt) SetHopLimit(hoplim int) error { + return errOpNoSupport +} diff --git a/vendor/golang.org/x/net/ipv6/header.go b/vendor/golang.org/x/net/ipv6/header.go new file mode 100644 index 0000000000..e05cb08b21 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/header.go @@ -0,0 +1,55 @@ +// 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 ipv6 + +import ( + "encoding/binary" + "fmt" + "net" +) + +const ( + Version = 6 // protocol version + HeaderLen = 40 // header length +) + +// A Header represents an IPv6 base header. +type Header struct { + Version int // protocol version + TrafficClass int // traffic class + FlowLabel int // flow label + PayloadLen int // payload length + NextHeader int // next header + HopLimit int // hop limit + Src net.IP // source address + Dst net.IP // destination address +} + +func (h *Header) String() string { + if h == nil { + return "" + } + return fmt.Sprintf("ver=%d tclass=%#x flowlbl=%#x payloadlen=%d nxthdr=%d hoplim=%d src=%v dst=%v", h.Version, h.TrafficClass, h.FlowLabel, h.PayloadLen, h.NextHeader, h.HopLimit, h.Src, h.Dst) +} + +// ParseHeader parses b as an IPv6 base header. +func ParseHeader(b []byte) (*Header, error) { + if len(b) < HeaderLen { + return nil, errHeaderTooShort + } + h := &Header{ + Version: int(b[0]) >> 4, + TrafficClass: int(b[0]&0x0f)<<4 | int(b[1])>>4, + FlowLabel: int(b[1]&0x0f)<<16 | int(b[2])<<8 | int(b[3]), + PayloadLen: int(binary.BigEndian.Uint16(b[4:6])), + NextHeader: int(b[6]), + HopLimit: int(b[7]), + } + h.Src = make(net.IP, net.IPv6len) + copy(h.Src, b[8:24]) + h.Dst = make(net.IP, net.IPv6len) + copy(h.Dst, b[24:40]) + return h, nil +} diff --git a/vendor/golang.org/x/net/ipv6/header_test.go b/vendor/golang.org/x/net/ipv6/header_test.go new file mode 100644 index 0000000000..ca11dc23de --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/header_test.go @@ -0,0 +1,55 @@ +// 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 ipv6_test + +import ( + "net" + "reflect" + "strings" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/ipv6" +) + +var ( + wireHeaderFromKernel = [ipv6.HeaderLen]byte{ + 0x69, 0x8b, 0xee, 0xf1, + 0xca, 0xfe, 0x2c, 0x01, + 0x20, 0x01, 0x0d, 0xb8, + 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + 0x20, 0x01, 0x0d, 0xb8, + 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, + } + + testHeader = &ipv6.Header{ + Version: ipv6.Version, + TrafficClass: iana.DiffServAF43, + FlowLabel: 0xbeef1, + PayloadLen: 0xcafe, + NextHeader: iana.ProtocolIPv6Frag, + HopLimit: 1, + Src: net.ParseIP("2001:db8:1::1"), + Dst: net.ParseIP("2001:db8:2::1"), + } +) + +func TestParseHeader(t *testing.T) { + h, err := ipv6.ParseHeader(wireHeaderFromKernel[:]) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(h, testHeader) { + t.Fatalf("got %#v; want %#v", h, testHeader) + } + s := h.String() + if strings.Contains(s, ",") { + t.Fatalf("should be space-separated values: %s", s) + } +} diff --git a/vendor/golang.org/x/net/ipv6/helper.go b/vendor/golang.org/x/net/ipv6/helper.go new file mode 100644 index 0000000000..53b9999058 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/helper.go @@ -0,0 +1,53 @@ +// Copyright 2013 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 ipv6 + +import ( + "encoding/binary" + "errors" + "net" + "unsafe" +) + +var ( + errMissingAddress = errors.New("missing address") + errHeaderTooShort = errors.New("header too short") + errInvalidConnType = errors.New("invalid conn type") + errOpNoSupport = errors.New("operation not supported") + errNoSuchInterface = errors.New("no such interface") + + nativeEndian binary.ByteOrder +) + +func init() { + i := uint32(1) + b := (*[4]byte)(unsafe.Pointer(&i)) + if b[0] == 1 { + nativeEndian = binary.LittleEndian + } else { + nativeEndian = binary.BigEndian + } +} + +func boolint(b bool) int { + if b { + return 1 + } + return 0 +} + +func netAddrToIP16(a net.Addr) net.IP { + switch v := a.(type) { + case *net.UDPAddr: + if ip := v.IP.To16(); ip != nil && ip.To4() == nil { + return ip + } + case *net.IPAddr: + if ip := v.IP.To16(); ip != nil && ip.To4() == nil { + return ip + } + } + return nil +} diff --git a/vendor/golang.org/x/net/ipv6/helper_stub.go b/vendor/golang.org/x/net/ipv6/helper_stub.go new file mode 100644 index 0000000000..20354ab2f3 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/helper_stub.go @@ -0,0 +1,19 @@ +// Copyright 2013 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 nacl plan9 solaris + +package ipv6 + +func (c *genericOpt) sysfd() (int, error) { + return 0, errOpNoSupport +} + +func (c *dgramOpt) sysfd() (int, error) { + return 0, errOpNoSupport +} + +func (c *payloadHandler) sysfd() (int, error) { + return 0, errOpNoSupport +} diff --git a/vendor/golang.org/x/net/ipv6/helper_unix.go b/vendor/golang.org/x/net/ipv6/helper_unix.go new file mode 100644 index 0000000000..92868ed295 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/helper_unix.go @@ -0,0 +1,46 @@ +// Copyright 2013 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 darwin dragonfly freebsd linux netbsd openbsd + +package ipv6 + +import ( + "net" + "reflect" +) + +func (c *genericOpt) sysfd() (int, error) { + switch p := c.Conn.(type) { + case *net.TCPConn, *net.UDPConn, *net.IPConn: + return sysfd(p) + } + return 0, errInvalidConnType +} + +func (c *dgramOpt) sysfd() (int, error) { + switch p := c.PacketConn.(type) { + case *net.UDPConn, *net.IPConn: + return sysfd(p.(net.Conn)) + } + return 0, errInvalidConnType +} + +func (c *payloadHandler) sysfd() (int, error) { + return sysfd(c.PacketConn.(net.Conn)) +} + +func sysfd(c net.Conn) (int, error) { + cv := reflect.ValueOf(c) + switch ce := cv.Elem(); ce.Kind() { + case reflect.Struct: + nfd := ce.FieldByName("conn").FieldByName("fd") + switch fe := nfd.Elem(); fe.Kind() { + case reflect.Struct: + fd := fe.FieldByName("sysfd") + return int(fd.Int()), nil + } + } + return 0, errInvalidConnType +} diff --git a/vendor/golang.org/x/net/ipv6/helper_windows.go b/vendor/golang.org/x/net/ipv6/helper_windows.go new file mode 100644 index 0000000000..28c401b53c --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/helper_windows.go @@ -0,0 +1,45 @@ +// Copyright 2013 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 ipv6 + +import ( + "net" + "reflect" + "syscall" +) + +func (c *genericOpt) sysfd() (syscall.Handle, error) { + switch p := c.Conn.(type) { + case *net.TCPConn, *net.UDPConn, *net.IPConn: + return sysfd(p) + } + return syscall.InvalidHandle, errInvalidConnType +} + +func (c *dgramOpt) sysfd() (syscall.Handle, error) { + switch p := c.PacketConn.(type) { + case *net.UDPConn, *net.IPConn: + return sysfd(p.(net.Conn)) + } + return syscall.InvalidHandle, errInvalidConnType +} + +func (c *payloadHandler) sysfd() (syscall.Handle, error) { + return sysfd(c.PacketConn.(net.Conn)) +} + +func sysfd(c net.Conn) (syscall.Handle, error) { + cv := reflect.ValueOf(c) + switch ce := cv.Elem(); ce.Kind() { + case reflect.Struct: + netfd := ce.FieldByName("conn").FieldByName("fd") + switch fe := netfd.Elem(); fe.Kind() { + case reflect.Struct: + fd := fe.FieldByName("sysfd") + return syscall.Handle(fd.Uint()), nil + } + } + return syscall.InvalidHandle, errInvalidConnType +} diff --git a/vendor/golang.org/x/net/ipv6/iana.go b/vendor/golang.org/x/net/ipv6/iana.go new file mode 100644 index 0000000000..3c6214fb69 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/iana.go @@ -0,0 +1,82 @@ +// go generate gen.go +// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +package ipv6 + +// Internet Control Message Protocol version 6 (ICMPv6) Parameters, Updated: 2015-07-07 +const ( + ICMPTypeDestinationUnreachable ICMPType = 1 // Destination Unreachable + ICMPTypePacketTooBig ICMPType = 2 // Packet Too Big + ICMPTypeTimeExceeded ICMPType = 3 // Time Exceeded + ICMPTypeParameterProblem ICMPType = 4 // Parameter Problem + ICMPTypeEchoRequest ICMPType = 128 // Echo Request + ICMPTypeEchoReply ICMPType = 129 // Echo Reply + ICMPTypeMulticastListenerQuery ICMPType = 130 // Multicast Listener Query + ICMPTypeMulticastListenerReport ICMPType = 131 // Multicast Listener Report + ICMPTypeMulticastListenerDone ICMPType = 132 // Multicast Listener Done + ICMPTypeRouterSolicitation ICMPType = 133 // Router Solicitation + ICMPTypeRouterAdvertisement ICMPType = 134 // Router Advertisement + ICMPTypeNeighborSolicitation ICMPType = 135 // Neighbor Solicitation + ICMPTypeNeighborAdvertisement ICMPType = 136 // Neighbor Advertisement + ICMPTypeRedirect ICMPType = 137 // Redirect Message + ICMPTypeRouterRenumbering ICMPType = 138 // Router Renumbering + ICMPTypeNodeInformationQuery ICMPType = 139 // ICMP Node Information Query + ICMPTypeNodeInformationResponse ICMPType = 140 // ICMP Node Information Response + ICMPTypeInverseNeighborDiscoverySolicitation ICMPType = 141 // Inverse Neighbor Discovery Solicitation Message + ICMPTypeInverseNeighborDiscoveryAdvertisement ICMPType = 142 // Inverse Neighbor Discovery Advertisement Message + ICMPTypeVersion2MulticastListenerReport ICMPType = 143 // Version 2 Multicast Listener Report + ICMPTypeHomeAgentAddressDiscoveryRequest ICMPType = 144 // Home Agent Address Discovery Request Message + ICMPTypeHomeAgentAddressDiscoveryReply ICMPType = 145 // Home Agent Address Discovery Reply Message + ICMPTypeMobilePrefixSolicitation ICMPType = 146 // Mobile Prefix Solicitation + ICMPTypeMobilePrefixAdvertisement ICMPType = 147 // Mobile Prefix Advertisement + ICMPTypeCertificationPathSolicitation ICMPType = 148 // Certification Path Solicitation Message + ICMPTypeCertificationPathAdvertisement ICMPType = 149 // Certification Path Advertisement Message + ICMPTypeMulticastRouterAdvertisement ICMPType = 151 // Multicast Router Advertisement + ICMPTypeMulticastRouterSolicitation ICMPType = 152 // Multicast Router Solicitation + ICMPTypeMulticastRouterTermination ICMPType = 153 // Multicast Router Termination + ICMPTypeFMIPv6 ICMPType = 154 // FMIPv6 Messages + ICMPTypeRPLControl ICMPType = 155 // RPL Control Message + ICMPTypeILNPv6LocatorUpdate ICMPType = 156 // ILNPv6 Locator Update Message + ICMPTypeDuplicateAddressRequest ICMPType = 157 // Duplicate Address Request + ICMPTypeDuplicateAddressConfirmation ICMPType = 158 // Duplicate Address Confirmation + ICMPTypeMPLControl ICMPType = 159 // MPL Control Message +) + +// Internet Control Message Protocol version 6 (ICMPv6) Parameters, Updated: 2015-07-07 +var icmpTypes = map[ICMPType]string{ + 1: "destination unreachable", + 2: "packet too big", + 3: "time exceeded", + 4: "parameter problem", + 128: "echo request", + 129: "echo reply", + 130: "multicast listener query", + 131: "multicast listener report", + 132: "multicast listener done", + 133: "router solicitation", + 134: "router advertisement", + 135: "neighbor solicitation", + 136: "neighbor advertisement", + 137: "redirect message", + 138: "router renumbering", + 139: "icmp node information query", + 140: "icmp node information response", + 141: "inverse neighbor discovery solicitation message", + 142: "inverse neighbor discovery advertisement message", + 143: "version 2 multicast listener report", + 144: "home agent address discovery request message", + 145: "home agent address discovery reply message", + 146: "mobile prefix solicitation", + 147: "mobile prefix advertisement", + 148: "certification path solicitation message", + 149: "certification path advertisement message", + 151: "multicast router advertisement", + 152: "multicast router solicitation", + 153: "multicast router termination", + 154: "fmipv6 messages", + 155: "rpl control message", + 156: "ilnpv6 locator update message", + 157: "duplicate address request", + 158: "duplicate address confirmation", + 159: "mpl control message", +} diff --git a/vendor/golang.org/x/net/ipv6/icmp.go b/vendor/golang.org/x/net/ipv6/icmp.go new file mode 100644 index 0000000000..a2de65a08c --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/icmp.go @@ -0,0 +1,57 @@ +// Copyright 2013 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 ipv6 + +import "golang.org/x/net/internal/iana" + +// An ICMPType represents a type of ICMP message. +type ICMPType int + +func (typ ICMPType) String() string { + s, ok := icmpTypes[typ] + if !ok { + return "" + } + return s +} + +// Protocol returns the ICMPv6 protocol number. +func (typ ICMPType) Protocol() int { + return iana.ProtocolIPv6ICMP +} + +// An ICMPFilter represents an ICMP message filter for incoming +// packets. The filter belongs to a packet delivery path on a host and +// it cannot interact with forwarding packets or tunnel-outer packets. +// +// Note: RFC 2460 defines a reasonable role model. A node means a +// device that implements IP. A router means a node that forwards IP +// packets not explicitly addressed to itself, and a host means a node +// that is not a router. +type ICMPFilter struct { + sysICMPv6Filter +} + +// Accept accepts incoming ICMP packets including the type field value +// typ. +func (f *ICMPFilter) Accept(typ ICMPType) { + f.accept(typ) +} + +// Block blocks incoming ICMP packets including the type field value +// typ. +func (f *ICMPFilter) Block(typ ICMPType) { + f.block(typ) +} + +// SetAll sets the filter action to the filter. +func (f *ICMPFilter) SetAll(block bool) { + f.setAll(block) +} + +// WillBlock reports whether the ICMP type will be blocked. +func (f *ICMPFilter) WillBlock(typ ICMPType) bool { + return f.willBlock(typ) +} diff --git a/vendor/golang.org/x/net/ipv6/icmp_bsd.go b/vendor/golang.org/x/net/ipv6/icmp_bsd.go new file mode 100644 index 0000000000..30e3ce424d --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/icmp_bsd.go @@ -0,0 +1,29 @@ +// Copyright 2013 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 darwin dragonfly freebsd netbsd openbsd + +package ipv6 + +func (f *sysICMPv6Filter) accept(typ ICMPType) { + f.Filt[typ>>5] |= 1 << (uint32(typ) & 31) +} + +func (f *sysICMPv6Filter) block(typ ICMPType) { + f.Filt[typ>>5] &^= 1 << (uint32(typ) & 31) +} + +func (f *sysICMPv6Filter) setAll(block bool) { + for i := range f.Filt { + if block { + f.Filt[i] = 0 + } else { + f.Filt[i] = 1<<32 - 1 + } + } +} + +func (f *sysICMPv6Filter) willBlock(typ ICMPType) bool { + return f.Filt[typ>>5]&(1<<(uint32(typ)&31)) == 0 +} diff --git a/vendor/golang.org/x/net/ipv6/icmp_linux.go b/vendor/golang.org/x/net/ipv6/icmp_linux.go new file mode 100644 index 0000000000..a67ecf690c --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/icmp_linux.go @@ -0,0 +1,27 @@ +// Copyright 2013 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 ipv6 + +func (f *sysICMPv6Filter) accept(typ ICMPType) { + f.Data[typ>>5] &^= 1 << (uint32(typ) & 31) +} + +func (f *sysICMPv6Filter) block(typ ICMPType) { + f.Data[typ>>5] |= 1 << (uint32(typ) & 31) +} + +func (f *sysICMPv6Filter) setAll(block bool) { + for i := range f.Data { + if block { + f.Data[i] = 1<<32 - 1 + } else { + f.Data[i] = 0 + } + } +} + +func (f *sysICMPv6Filter) willBlock(typ ICMPType) bool { + return f.Data[typ>>5]&(1<<(uint32(typ)&31)) != 0 +} diff --git a/vendor/golang.org/x/net/ipv6/icmp_solaris.go b/vendor/golang.org/x/net/ipv6/icmp_solaris.go new file mode 100644 index 0000000000..a942f354ca --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/icmp_solaris.go @@ -0,0 +1,24 @@ +// Copyright 2013 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 solaris + +package ipv6 + +func (f *sysICMPv6Filter) accept(typ ICMPType) { + // TODO(mikio): implement this +} + +func (f *sysICMPv6Filter) block(typ ICMPType) { + // TODO(mikio): implement this +} + +func (f *sysICMPv6Filter) setAll(block bool) { + // TODO(mikio): implement this +} + +func (f *sysICMPv6Filter) willBlock(typ ICMPType) bool { + // TODO(mikio): implement this + return false +} diff --git a/vendor/golang.org/x/net/ipv6/icmp_stub.go b/vendor/golang.org/x/net/ipv6/icmp_stub.go new file mode 100644 index 0000000000..c1263ecac4 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/icmp_stub.go @@ -0,0 +1,23 @@ +// Copyright 2013 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 nacl plan9 + +package ipv6 + +type sysICMPv6Filter struct { +} + +func (f *sysICMPv6Filter) accept(typ ICMPType) { +} + +func (f *sysICMPv6Filter) block(typ ICMPType) { +} + +func (f *sysICMPv6Filter) setAll(block bool) { +} + +func (f *sysICMPv6Filter) willBlock(typ ICMPType) bool { + return false +} diff --git a/vendor/golang.org/x/net/ipv6/icmp_test.go b/vendor/golang.org/x/net/ipv6/icmp_test.go new file mode 100644 index 0000000000..e192d6d8c2 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/icmp_test.go @@ -0,0 +1,96 @@ +// Copyright 2013 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 ipv6_test + +import ( + "net" + "reflect" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +var icmpStringTests = []struct { + in ipv6.ICMPType + out string +}{ + {ipv6.ICMPTypeDestinationUnreachable, "destination unreachable"}, + + {256, ""}, +} + +func TestICMPString(t *testing.T) { + for _, tt := range icmpStringTests { + s := tt.in.String() + if s != tt.out { + t.Errorf("got %s; want %s", s, tt.out) + } + } +} + +func TestICMPFilter(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + + var f ipv6.ICMPFilter + for _, toggle := range []bool{false, true} { + f.SetAll(toggle) + for _, typ := range []ipv6.ICMPType{ + ipv6.ICMPTypeDestinationUnreachable, + ipv6.ICMPTypeEchoReply, + ipv6.ICMPTypeNeighborSolicitation, + ipv6.ICMPTypeDuplicateAddressConfirmation, + } { + f.Accept(typ) + if f.WillBlock(typ) { + t.Errorf("ipv6.ICMPFilter.Set(%v, false) failed", typ) + } + f.Block(typ) + if !f.WillBlock(typ) { + t.Errorf("ipv6.ICMPFilter.Set(%v, true) failed", typ) + } + } + } +} + +func TestSetICMPFilter(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + c, err := net.ListenPacket("ip6:ipv6-icmp", "::1") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv6.NewPacketConn(c) + + var f ipv6.ICMPFilter + f.SetAll(true) + f.Accept(ipv6.ICMPTypeEchoRequest) + f.Accept(ipv6.ICMPTypeEchoReply) + if err := p.SetICMPFilter(&f); err != nil { + t.Fatal(err) + } + kf, err := p.ICMPFilter() + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(kf, &f) { + t.Fatalf("got %#v; want %#v", kf, f) + } +} diff --git a/vendor/golang.org/x/net/ipv6/icmp_windows.go b/vendor/golang.org/x/net/ipv6/icmp_windows.go new file mode 100644 index 0000000000..9dcfb8106b --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/icmp_windows.go @@ -0,0 +1,26 @@ +// Copyright 2013 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 ipv6 + +type sysICMPv6Filter struct { + // TODO(mikio): implement this +} + +func (f *sysICMPv6Filter) accept(typ ICMPType) { + // TODO(mikio): implement this +} + +func (f *sysICMPv6Filter) block(typ ICMPType) { + // TODO(mikio): implement this +} + +func (f *sysICMPv6Filter) setAll(block bool) { + // TODO(mikio): implement this +} + +func (f *sysICMPv6Filter) willBlock(typ ICMPType) bool { + // TODO(mikio): implement this + return false +} diff --git a/vendor/golang.org/x/net/ipv6/mocktransponder_test.go b/vendor/golang.org/x/net/ipv6/mocktransponder_test.go new file mode 100644 index 0000000000..d587922a14 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/mocktransponder_test.go @@ -0,0 +1,32 @@ +// Copyright 2013 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 ipv6_test + +import ( + "net" + "testing" +) + +func connector(t *testing.T, network, addr string, done chan<- bool) { + defer func() { done <- true }() + + c, err := net.Dial(network, addr) + if err != nil { + t.Error(err) + return + } + c.Close() +} + +func acceptor(t *testing.T, ln net.Listener, done chan<- bool) { + defer func() { done <- true }() + + c, err := ln.Accept() + if err != nil { + t.Error(err) + return + } + c.Close() +} diff --git a/vendor/golang.org/x/net/ipv6/multicast_test.go b/vendor/golang.org/x/net/ipv6/multicast_test.go new file mode 100644 index 0000000000..a3a8979d29 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/multicast_test.go @@ -0,0 +1,260 @@ +// Copyright 2013 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 ipv6_test + +import ( + "bytes" + "net" + "os" + "runtime" + "testing" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +var packetConnReadWriteMulticastUDPTests = []struct { + addr string + grp, src *net.UDPAddr +}{ + {"[ff02::]:0", &net.UDPAddr{IP: net.ParseIP("ff02::114")}, nil}, // see RFC 4727 + + {"[ff30::8000:0]:0", &net.UDPAddr{IP: net.ParseIP("ff30::8000:1")}, &net.UDPAddr{IP: net.IPv6loopback}}, // see RFC 5771 +} + +func TestPacketConnReadWriteMulticastUDP(t *testing.T) { + switch runtime.GOOS { + case "freebsd": // due to a bug on loopback marking + // See http://www.freebsd.org/cgi/query-pr.cgi?pr=180065. + t.Skipf("not supported on %s", runtime.GOOS) + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + for _, tt := range packetConnReadWriteMulticastUDPTests { + c, err := net.ListenPacket("udp6", tt.addr) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + grp := *tt.grp + grp.Port = c.LocalAddr().(*net.UDPAddr).Port + p := ipv6.NewPacketConn(c) + defer p.Close() + if tt.src == nil { + if err := p.JoinGroup(ifi, &grp); err != nil { + t.Fatal(err) + } + defer p.LeaveGroup(ifi, &grp) + } else { + if err := p.JoinSourceSpecificGroup(ifi, &grp, tt.src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support MLDv2 fail here + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + defer p.LeaveSourceSpecificGroup(ifi, &grp, tt.src) + } + if err := p.SetMulticastInterface(ifi); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastInterface(); err != nil { + t.Fatal(err) + } + if err := p.SetMulticastLoopback(true); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastLoopback(); err != nil { + t.Fatal(err) + } + + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + Src: net.IPv6loopback, + IfIndex: ifi.Index, + } + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + wb := []byte("HELLO-R-U-THERE") + + for i, toggle := range []bool{true, false, true} { + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { + t.Fatal(err) + } + cm.HopLimit = i + 1 + if n, err := p.WriteTo(wb, &cm, &grp); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatal(err) + } + rb := make([]byte, 128) + if n, _, _, err := p.ReadFrom(rb); err != nil { + t.Fatal(err) + } else if !bytes.Equal(rb[:n], wb) { + t.Fatalf("got %v; want %v", rb[:n], wb) + } + } + } +} + +var packetConnReadWriteMulticastICMPTests = []struct { + grp, src *net.IPAddr +}{ + {&net.IPAddr{IP: net.ParseIP("ff02::114")}, nil}, // see RFC 4727 + + {&net.IPAddr{IP: net.ParseIP("ff30::8000:1")}, &net.IPAddr{IP: net.IPv6loopback}}, // see RFC 5771 +} + +func TestPacketConnReadWriteMulticastICMP(t *testing.T) { + switch runtime.GOOS { + case "freebsd": // due to a bug on loopback marking + // See http://www.freebsd.org/cgi/query-pr.cgi?pr=180065. + t.Skipf("not supported on %s", runtime.GOOS) + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + for _, tt := range packetConnReadWriteMulticastICMPTests { + c, err := net.ListenPacket("ip6:ipv6-icmp", "::") + if err != nil { + t.Fatal(err) + } + defer c.Close() + + pshicmp := icmp.IPv6PseudoHeader(c.LocalAddr().(*net.IPAddr).IP, tt.grp.IP) + p := ipv6.NewPacketConn(c) + defer p.Close() + if tt.src == nil { + if err := p.JoinGroup(ifi, tt.grp); err != nil { + t.Fatal(err) + } + defer p.LeaveGroup(ifi, tt.grp) + } else { + if err := p.JoinSourceSpecificGroup(ifi, tt.grp, tt.src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support MLDv2 fail here + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + defer p.LeaveSourceSpecificGroup(ifi, tt.grp, tt.src) + } + if err := p.SetMulticastInterface(ifi); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastInterface(); err != nil { + t.Fatal(err) + } + if err := p.SetMulticastLoopback(true); err != nil { + t.Fatal(err) + } + if _, err := p.MulticastLoopback(); err != nil { + t.Fatal(err) + } + + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + Src: net.IPv6loopback, + IfIndex: ifi.Index, + } + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + + var f ipv6.ICMPFilter + f.SetAll(true) + f.Accept(ipv6.ICMPTypeEchoReply) + if err := p.SetICMPFilter(&f); err != nil { + t.Fatal(err) + } + + var psh []byte + for i, toggle := range []bool{true, false, true} { + if toggle { + psh = nil + if err := p.SetChecksum(true, 2); err != nil { + t.Fatal(err) + } + } else { + psh = pshicmp + // Some platforms never allow to + // disable the kernel checksum + // processing. + p.SetChecksum(false, -1) + } + wb, err := (&icmp.Message{ + Type: ipv6.ICMPTypeEchoRequest, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: i + 1, + Data: []byte("HELLO-R-U-THERE"), + }, + }).Marshal(psh) + if err != nil { + t.Fatal(err) + } + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } + if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { + t.Fatal(err) + } + cm.HopLimit = i + 1 + if n, err := p.WriteTo(wb, &cm, tt.grp); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + if n, _, _, err := p.ReadFrom(rb); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels have some limitation on receiving icmp packet through raw socket + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } else { + if m, err := icmp.ParseMessage(iana.ProtocolIPv6ICMP, rb[:n]); err != nil { + t.Fatal(err) + } else if m.Type != ipv6.ICMPTypeEchoReply || m.Code != 0 { + t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv6.ICMPTypeEchoReply, 0) + } + } + } + } +} diff --git a/vendor/golang.org/x/net/ipv6/multicastlistener_test.go b/vendor/golang.org/x/net/ipv6/multicastlistener_test.go new file mode 100644 index 0000000000..9711f7513f --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/multicastlistener_test.go @@ -0,0 +1,246 @@ +// Copyright 2013 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 ipv6_test + +import ( + "fmt" + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +var udpMultipleGroupListenerTests = []net.Addr{ + &net.UDPAddr{IP: net.ParseIP("ff02::114")}, // see RFC 4727 + &net.UDPAddr{IP: net.ParseIP("ff02::1:114")}, + &net.UDPAddr{IP: net.ParseIP("ff02::2:114")}, +} + +func TestUDPSinglePacketConnWithMultipleGroupListeners(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + for _, gaddr := range udpMultipleGroupListenerTests { + c, err := net.ListenPacket("udp6", "[::]:0") // wildcard address with non-reusable port + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv6.NewPacketConn(c) + var mift []*net.Interface + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + if _, ok := nettest.IsMulticastCapable("ip6", &ifi); !ok { + continue + } + if err := p.JoinGroup(&ifi, gaddr); err != nil { + t.Fatal(err) + } + mift = append(mift, &ift[i]) + } + for _, ifi := range mift { + if err := p.LeaveGroup(ifi, gaddr); err != nil { + t.Fatal(err) + } + } + } +} + +func TestUDPMultiplePacketConnWithMultipleGroupListeners(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + for _, gaddr := range udpMultipleGroupListenerTests { + c1, err := net.ListenPacket("udp6", "[ff02::]:1024") // wildcard address with reusable port + if err != nil { + t.Fatal(err) + } + defer c1.Close() + + c2, err := net.ListenPacket("udp6", "[ff02::]:1024") // wildcard address with reusable port + if err != nil { + t.Fatal(err) + } + defer c2.Close() + + var ps [2]*ipv6.PacketConn + ps[0] = ipv6.NewPacketConn(c1) + ps[1] = ipv6.NewPacketConn(c2) + var mift []*net.Interface + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + if _, ok := nettest.IsMulticastCapable("ip6", &ifi); !ok { + continue + } + for _, p := range ps { + if err := p.JoinGroup(&ifi, gaddr); err != nil { + t.Fatal(err) + } + } + mift = append(mift, &ift[i]) + } + for _, ifi := range mift { + for _, p := range ps { + if err := p.LeaveGroup(ifi, gaddr); err != nil { + t.Fatal(err) + } + } + } + } +} + +func TestUDPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + gaddr := net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727 + type ml struct { + c *ipv6.PacketConn + ifi *net.Interface + } + var mlt []*ml + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + ip, ok := nettest.IsMulticastCapable("ip6", &ifi) + if !ok { + continue + } + c, err := net.ListenPacket("udp6", fmt.Sprintf("[%s%%%s]:1024", ip.String(), ifi.Name)) // unicast address with non-reusable port + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + if err := p.JoinGroup(&ifi, &gaddr); err != nil { + t.Fatal(err) + } + mlt = append(mlt, &ml{p, &ift[i]}) + } + for _, m := range mlt { + if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil { + t.Fatal(err) + } + } +} + +func TestIPSinglePacketConnWithSingleGroupListener(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + c, err := net.ListenPacket("ip6:ipv6-icmp", "::") // wildcard address + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv6.NewPacketConn(c) + gaddr := net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727 + var mift []*net.Interface + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + if _, ok := nettest.IsMulticastCapable("ip6", &ifi); !ok { + continue + } + if err := p.JoinGroup(&ifi, &gaddr); err != nil { + t.Fatal(err) + } + mift = append(mift, &ift[i]) + } + for _, ifi := range mift { + if err := p.LeaveGroup(ifi, &gaddr); err != nil { + t.Fatal(err) + } + } +} + +func TestIPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { + switch runtime.GOOS { + case "darwin", "dragonfly", "openbsd": // platforms that return fe80::1%lo0: bind: can't assign requested address + t.Skipf("not supported on %s", runtime.GOOS) + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + gaddr := net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727 + type ml struct { + c *ipv6.PacketConn + ifi *net.Interface + } + var mlt []*ml + + ift, err := net.Interfaces() + if err != nil { + t.Fatal(err) + } + for i, ifi := range ift { + ip, ok := nettest.IsMulticastCapable("ip6", &ifi) + if !ok { + continue + } + c, err := net.ListenPacket("ip6:ipv6-icmp", fmt.Sprintf("%s%%%s", ip.String(), ifi.Name)) // unicast address + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + if err := p.JoinGroup(&ifi, &gaddr); err != nil { + t.Fatal(err) + } + mlt = append(mlt, &ml{p, &ift[i]}) + } + for _, m := range mlt { + if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil { + t.Fatal(err) + } + } +} diff --git a/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go b/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go new file mode 100644 index 0000000000..fe0e6e1b14 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go @@ -0,0 +1,157 @@ +// Copyright 2013 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 ipv6_test + +import ( + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +var packetConnMulticastSocketOptionTests = []struct { + net, proto, addr string + grp, src net.Addr +}{ + {"udp6", "", "[ff02::]:0", &net.UDPAddr{IP: net.ParseIP("ff02::114")}, nil}, // see RFC 4727 + {"ip6", ":ipv6-icmp", "::", &net.IPAddr{IP: net.ParseIP("ff02::115")}, nil}, // see RFC 4727 + + {"udp6", "", "[ff30::8000:0]:0", &net.UDPAddr{IP: net.ParseIP("ff30::8000:1")}, &net.UDPAddr{IP: net.IPv6loopback}}, // see RFC 5771 + {"ip6", ":ipv6-icmp", "::", &net.IPAddr{IP: net.ParseIP("ff30::8000:2")}, &net.IPAddr{IP: net.IPv6loopback}}, // see RFC 5771 +} + +func TestPacketConnMulticastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagMulticast|net.FlagLoopback) + if ifi == nil { + t.Skipf("not available on %s", runtime.GOOS) + } + + m, ok := nettest.SupportsRawIPSocket() + for _, tt := range packetConnMulticastSocketOptionTests { + if tt.net == "ip6" && !ok { + t.Log(m) + continue + } + c, err := net.ListenPacket(tt.net+tt.proto, tt.addr) + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + defer p.Close() + + if tt.src == nil { + testMulticastSocketOptions(t, p, ifi, tt.grp) + } else { + testSourceSpecificMulticastSocketOptions(t, p, ifi, tt.grp, tt.src) + } + } +} + +type testIPv6MulticastConn interface { + MulticastHopLimit() (int, error) + SetMulticastHopLimit(ttl int) error + MulticastLoopback() (bool, error) + SetMulticastLoopback(bool) error + JoinGroup(*net.Interface, net.Addr) error + LeaveGroup(*net.Interface, net.Addr) error + JoinSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error + LeaveSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error + ExcludeSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error + IncludeSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error +} + +func testMulticastSocketOptions(t *testing.T, c testIPv6MulticastConn, ifi *net.Interface, grp net.Addr) { + const hoplim = 255 + if err := c.SetMulticastHopLimit(hoplim); err != nil { + t.Error(err) + return + } + if v, err := c.MulticastHopLimit(); err != nil { + t.Error(err) + return + } else if v != hoplim { + t.Errorf("got %v; want %v", v, hoplim) + return + } + + for _, toggle := range []bool{true, false} { + if err := c.SetMulticastLoopback(toggle); err != nil { + t.Error(err) + return + } + if v, err := c.MulticastLoopback(); err != nil { + t.Error(err) + return + } else if v != toggle { + t.Errorf("got %v; want %v", v, toggle) + return + } + } + + if err := c.JoinGroup(ifi, grp); err != nil { + t.Error(err) + return + } + if err := c.LeaveGroup(ifi, grp); err != nil { + t.Error(err) + return + } +} + +func testSourceSpecificMulticastSocketOptions(t *testing.T, c testIPv6MulticastConn, ifi *net.Interface, grp, src net.Addr) { + // MCAST_JOIN_GROUP -> MCAST_BLOCK_SOURCE -> MCAST_UNBLOCK_SOURCE -> MCAST_LEAVE_GROUP + if err := c.JoinGroup(ifi, grp); err != nil { + t.Error(err) + return + } + if err := c.ExcludeSourceSpecificGroup(ifi, grp, src); err != nil { + switch runtime.GOOS { + case "freebsd", "linux": + default: // platforms that don't support MLDv2 fail here + t.Logf("not supported on %s", runtime.GOOS) + return + } + t.Error(err) + return + } + if err := c.IncludeSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + if err := c.LeaveGroup(ifi, grp); err != nil { + t.Error(err) + return + } + + // MCAST_JOIN_SOURCE_GROUP -> MCAST_LEAVE_SOURCE_GROUP + if err := c.JoinSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + if err := c.LeaveSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + + // MCAST_JOIN_SOURCE_GROUP -> MCAST_LEAVE_GROUP + if err := c.JoinSourceSpecificGroup(ifi, grp, src); err != nil { + t.Error(err) + return + } + if err := c.LeaveGroup(ifi, grp); err != nil { + t.Error(err) + return + } +} diff --git a/vendor/golang.org/x/net/ipv6/payload.go b/vendor/golang.org/x/net/ipv6/payload.go new file mode 100644 index 0000000000..529b20bcaf --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/payload.go @@ -0,0 +1,15 @@ +// Copyright 2013 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 ipv6 + +import "net" + +// A payloadHandler represents the IPv6 datagram payload handler. +type payloadHandler struct { + net.PacketConn + rawOpt +} + +func (c *payloadHandler) ok() bool { return c != nil && c.PacketConn != nil } diff --git a/vendor/golang.org/x/net/ipv6/payload_cmsg.go b/vendor/golang.org/x/net/ipv6/payload_cmsg.go new file mode 100644 index 0000000000..8e90d324d2 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/payload_cmsg.go @@ -0,0 +1,70 @@ +// Copyright 2013 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 !nacl,!plan9,!windows + +package ipv6 + +import ( + "net" + "syscall" +) + +// ReadFrom reads a payload of the received IPv6 datagram, from the +// endpoint c, copying the payload into b. It returns the number of +// bytes copied into b, the control message cm and the source address +// src of the received datagram. +func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + if !c.ok() { + return 0, nil, nil, syscall.EINVAL + } + oob := newControlMessage(&c.rawOpt) + var oobn int + switch c := c.PacketConn.(type) { + case *net.UDPConn: + if n, oobn, _, src, err = c.ReadMsgUDP(b, oob); err != nil { + return 0, nil, nil, err + } + case *net.IPConn: + if n, oobn, _, src, err = c.ReadMsgIP(b, oob); err != nil { + return 0, nil, nil, err + } + default: + return 0, nil, nil, errInvalidConnType + } + if cm, err = parseControlMessage(oob[:oobn]); err != nil { + return 0, nil, nil, err + } + if cm != nil { + cm.Src = netAddrToIP16(src) + } + return +} + +// WriteTo writes a payload of the IPv6 datagram, to the destination +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows +// the IPv6 header fields and the datagram path to be specified. The +// cm may be nil if control of the outgoing datagram is not required. +func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + if !c.ok() { + return 0, syscall.EINVAL + } + oob := marshalControlMessage(cm) + if dst == nil { + return 0, errMissingAddress + } + switch c := c.PacketConn.(type) { + case *net.UDPConn: + n, _, err = c.WriteMsgUDP(b, oob, dst.(*net.UDPAddr)) + case *net.IPConn: + n, _, err = c.WriteMsgIP(b, oob, dst.(*net.IPAddr)) + default: + return 0, errInvalidConnType + } + if err != nil { + return 0, err + } + return +} diff --git a/vendor/golang.org/x/net/ipv6/payload_nocmsg.go b/vendor/golang.org/x/net/ipv6/payload_nocmsg.go new file mode 100644 index 0000000000..499204d0c7 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/payload_nocmsg.go @@ -0,0 +1,41 @@ +// Copyright 2013 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 nacl plan9 windows + +package ipv6 + +import ( + "net" + "syscall" +) + +// ReadFrom reads a payload of the received IPv6 datagram, from the +// endpoint c, copying the payload into b. It returns the number of +// bytes copied into b, the control message cm and the source address +// src of the received datagram. +func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { + if !c.ok() { + return 0, nil, nil, syscall.EINVAL + } + if n, src, err = c.PacketConn.ReadFrom(b); err != nil { + return 0, nil, nil, err + } + return +} + +// WriteTo writes a payload of the IPv6 datagram, to the destination +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows +// the IPv6 header fields and the datagram path to be specified. The +// cm may be nil if control of the outgoing datagram is not required. +func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { + if !c.ok() { + return 0, syscall.EINVAL + } + if dst == nil { + return 0, errMissingAddress + } + return c.PacketConn.WriteTo(b, dst) +} diff --git a/vendor/golang.org/x/net/ipv6/readwrite_test.go b/vendor/golang.org/x/net/ipv6/readwrite_test.go new file mode 100644 index 0000000000..8c8c6fde08 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/readwrite_test.go @@ -0,0 +1,189 @@ +// Copyright 2013 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 ipv6_test + +import ( + "bytes" + "net" + "runtime" + "strings" + "sync" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +func benchmarkUDPListener() (net.PacketConn, net.Addr, error) { + c, err := net.ListenPacket("udp6", "[::1]:0") + if err != nil { + return nil, nil, err + } + dst, err := net.ResolveUDPAddr("udp6", c.LocalAddr().String()) + if err != nil { + c.Close() + return nil, nil, err + } + return c, dst, nil +} + +func BenchmarkReadWriteNetUDP(b *testing.B) { + if !supportsIPv6 { + b.Skip("ipv6 is not supported") + } + + c, dst, err := benchmarkUDPListener() + if err != nil { + b.Fatal(err) + } + defer c.Close() + + wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128) + b.ResetTimer() + for i := 0; i < b.N; i++ { + benchmarkReadWriteNetUDP(b, c, wb, rb, dst) + } +} + +func benchmarkReadWriteNetUDP(b *testing.B, c net.PacketConn, wb, rb []byte, dst net.Addr) { + if _, err := c.WriteTo(wb, dst); err != nil { + b.Fatal(err) + } + if _, _, err := c.ReadFrom(rb); err != nil { + b.Fatal(err) + } +} + +func BenchmarkReadWriteIPv6UDP(b *testing.B) { + if !supportsIPv6 { + b.Skip("ipv6 is not supported") + } + + c, dst, err := benchmarkUDPListener() + if err != nil { + b.Fatal(err) + } + defer c.Close() + + p := ipv6.NewPacketConn(c) + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + if err := p.SetControlMessage(cf, true); err != nil { + b.Fatal(err) + } + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) + + wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128) + b.ResetTimer() + for i := 0; i < b.N; i++ { + benchmarkReadWriteIPv6UDP(b, p, wb, rb, dst, ifi) + } +} + +func benchmarkReadWriteIPv6UDP(b *testing.B, p *ipv6.PacketConn, wb, rb []byte, dst net.Addr, ifi *net.Interface) { + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + HopLimit: 1, + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if n, err := p.WriteTo(wb, &cm, dst); err != nil { + b.Fatal(err) + } else if n != len(wb) { + b.Fatalf("got %v; want %v", n, len(wb)) + } + if _, _, _, err := p.ReadFrom(rb); err != nil { + b.Fatal(err) + } +} + +func TestPacketConnConcurrentReadWriteUnicastUDP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + c, err := net.ListenPacket("udp6", "[::1]:0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + defer p.Close() + + dst, err := net.ResolveUDPAddr("udp6", c.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + wb := []byte("HELLO-R-U-THERE") + + if err := p.SetControlMessage(cf, true); err != nil { // probe before test + if nettest.ProtocolNotSupported(err) { + t.Skipf("not supported on %s", runtime.GOOS) + } + t.Fatal(err) + } + + var wg sync.WaitGroup + reader := func() { + defer wg.Done() + rb := make([]byte, 128) + if n, cm, _, err := p.ReadFrom(rb); err != nil { + t.Error(err) + return + } else if !bytes.Equal(rb[:n], wb) { + t.Errorf("got %v; want %v", rb[:n], wb) + return + } else { + s := cm.String() + if strings.Contains(s, ",") { + t.Errorf("should be space-separated values: %s", s) + } + } + } + writer := func(toggle bool) { + defer wg.Done() + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + Src: net.IPv6loopback, + } + if ifi != nil { + cm.IfIndex = ifi.Index + } + if err := p.SetControlMessage(cf, toggle); err != nil { + t.Error(err) + return + } + if n, err := p.WriteTo(wb, &cm, dst); err != nil { + t.Error(err) + return + } else if n != len(wb) { + t.Errorf("got %v; want %v", n, len(wb)) + return + } + } + + const N = 10 + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Add(2 * N) + for i := 0; i < 2*N; i++ { + go writer(i%2 != 0) + } + wg.Add(N) + for i := 0; i < N; i++ { + go reader() + } + wg.Wait() +} diff --git a/vendor/golang.org/x/net/ipv6/sockopt.go b/vendor/golang.org/x/net/ipv6/sockopt.go new file mode 100644 index 0000000000..f0cfc2f94a --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sockopt.go @@ -0,0 +1,46 @@ +// 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 ipv6 + +// Sticky socket options +const ( + ssoTrafficClass = iota // header field for unicast packet, RFC 3542 + ssoHopLimit // header field for unicast packet, RFC 3493 + ssoMulticastInterface // outbound interface for multicast packet, RFC 3493 + ssoMulticastHopLimit // header field for multicast packet, RFC 3493 + ssoMulticastLoopback // loopback for multicast packet, RFC 3493 + ssoReceiveTrafficClass // header field on received packet, RFC 3542 + ssoReceiveHopLimit // header field on received packet, RFC 2292 or 3542 + ssoReceivePacketInfo // incbound or outbound packet path, RFC 2292 or 3542 + ssoReceivePathMTU // path mtu, RFC 3542 + ssoPathMTU // path mtu, RFC 3542 + ssoChecksum // packet checksum, RFC 2292 or 3542 + ssoICMPFilter // icmp filter, RFC 2292 or 3542 + ssoJoinGroup // any-source multicast, RFC 3493 + ssoLeaveGroup // any-source multicast, RFC 3493 + ssoJoinSourceGroup // source-specific multicast + ssoLeaveSourceGroup // source-specific multicast + ssoBlockSourceGroup // any-source or source-specific multicast + ssoUnblockSourceGroup // any-source or source-specific multicast + ssoMax +) + +// Sticky socket option value types +const ( + ssoTypeInt = iota + 1 + ssoTypeInterface + ssoTypeICMPFilter + ssoTypeMTUInfo + ssoTypeIPMreq + ssoTypeGroupReq + ssoTypeGroupSourceReq +) + +// A sockOpt represents a binding for sticky socket option. +type sockOpt struct { + level int // option level + name int // option name, must be equal or greater than 1 + typ int // option value type, must be equal or greater than 1 +} diff --git a/vendor/golang.org/x/net/ipv6/sockopt_asmreq_unix.go b/vendor/golang.org/x/net/ipv6/sockopt_asmreq_unix.go new file mode 100644 index 0000000000..b7fd4fe670 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sockopt_asmreq_unix.go @@ -0,0 +1,22 @@ +// Copyright 2013 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 darwin dragonfly freebsd linux netbsd openbsd + +package ipv6 + +import ( + "net" + "os" + "unsafe" +) + +func setsockoptIPMreq(fd int, opt *sockOpt, ifi *net.Interface, grp net.IP) error { + var mreq sysIPv6Mreq + copy(mreq.Multiaddr[:], grp) + if ifi != nil { + mreq.setIfindex(ifi.Index) + } + return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, unsafe.Pointer(&mreq), sysSizeofIPv6Mreq)) +} diff --git a/vendor/golang.org/x/net/ipv6/sockopt_asmreq_windows.go b/vendor/golang.org/x/net/ipv6/sockopt_asmreq_windows.go new file mode 100644 index 0000000000..c03c731342 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sockopt_asmreq_windows.go @@ -0,0 +1,21 @@ +// Copyright 2013 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 ipv6 + +import ( + "net" + "os" + "syscall" + "unsafe" +) + +func setsockoptIPMreq(fd syscall.Handle, opt *sockOpt, ifi *net.Interface, grp net.IP) error { + var mreq sysIPv6Mreq + copy(mreq.Multiaddr[:], grp) + if ifi != nil { + mreq.setIfindex(ifi.Index) + } + return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, int32(opt.level), int32(opt.name), (*byte)(unsafe.Pointer(&mreq)), sysSizeofIPv6Mreq)) +} diff --git a/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_stub.go b/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_stub.go new file mode 100644 index 0000000000..7732e49f88 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_stub.go @@ -0,0 +1,17 @@ +// 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 !darwin,!freebsd,!linux + +package ipv6 + +import "net" + +func setsockoptGroupReq(fd int, opt *sockOpt, ifi *net.Interface, grp net.IP) error { + return errOpNoSupport +} + +func setsockoptGroupSourceReq(fd int, opt *sockOpt, ifi *net.Interface, grp, src net.IP) error { + return errOpNoSupport +} diff --git a/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_unix.go b/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_unix.go new file mode 100644 index 0000000000..c64d6d584a --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_unix.go @@ -0,0 +1,59 @@ +// 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 darwin freebsd linux + +package ipv6 + +import ( + "net" + "os" + "unsafe" +) + +var freebsd32o64 bool + +func setsockoptGroupReq(fd int, opt *sockOpt, ifi *net.Interface, grp net.IP) error { + var gr sysGroupReq + if ifi != nil { + gr.Interface = uint32(ifi.Index) + } + gr.setGroup(grp) + var p unsafe.Pointer + var l sysSockoptLen + if freebsd32o64 { + var d [sysSizeofGroupReq + 4]byte + s := (*[sysSizeofGroupReq]byte)(unsafe.Pointer(&gr)) + copy(d[:4], s[:4]) + copy(d[8:], s[4:]) + p = unsafe.Pointer(&d[0]) + l = sysSizeofGroupReq + 4 + } else { + p = unsafe.Pointer(&gr) + l = sysSizeofGroupReq + } + return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, p, l)) +} + +func setsockoptGroupSourceReq(fd int, opt *sockOpt, ifi *net.Interface, grp, src net.IP) error { + var gsr sysGroupSourceReq + if ifi != nil { + gsr.Interface = uint32(ifi.Index) + } + gsr.setSourceGroup(grp, src) + var p unsafe.Pointer + var l sysSockoptLen + if freebsd32o64 { + var d [sysSizeofGroupSourceReq + 4]byte + s := (*[sysSizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr)) + copy(d[:4], s[:4]) + copy(d[8:], s[4:]) + p = unsafe.Pointer(&d[0]) + l = sysSizeofGroupSourceReq + 4 + } else { + p = unsafe.Pointer(&gsr) + l = sysSizeofGroupSourceReq + } + return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, p, l)) +} diff --git a/vendor/golang.org/x/net/ipv6/sockopt_stub.go b/vendor/golang.org/x/net/ipv6/sockopt_stub.go new file mode 100644 index 0000000000..b8dacfde9e --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sockopt_stub.go @@ -0,0 +1,13 @@ +// Copyright 2013 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 nacl plan9 solaris + +package ipv6 + +import "net" + +func getMTUInfo(fd int, opt *sockOpt) (*net.Interface, int, error) { + return nil, 0, errOpNoSupport +} diff --git a/vendor/golang.org/x/net/ipv6/sockopt_test.go b/vendor/golang.org/x/net/ipv6/sockopt_test.go new file mode 100644 index 0000000000..9c21903160 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sockopt_test.go @@ -0,0 +1,133 @@ +// Copyright 2013 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 ipv6_test + +import ( + "fmt" + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +var supportsIPv6 bool = nettest.SupportsIPv6() + +func TestConnInitiatorPathMTU(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + ln, err := net.Listen("tcp6", "[::1]:0") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + + done := make(chan bool) + go acceptor(t, ln, done) + + c, err := net.Dial("tcp6", ln.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + if pmtu, err := ipv6.NewConn(c).PathMTU(); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels don't support IPV6_PATHMTU option + t.Logf("not supported on %s", runtime.GOOS) + default: + t.Fatal(err) + } + } else { + t.Logf("path mtu for %v: %v", c.RemoteAddr(), pmtu) + } + + <-done +} + +func TestConnResponderPathMTU(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + ln, err := net.Listen("tcp6", "[::1]:0") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + + done := make(chan bool) + go connector(t, "tcp6", ln.Addr().String(), done) + + c, err := ln.Accept() + if err != nil { + t.Fatal(err) + } + defer c.Close() + + if pmtu, err := ipv6.NewConn(c).PathMTU(); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels don't support IPV6_PATHMTU option + t.Logf("not supported on %s", runtime.GOOS) + default: + t.Fatal(err) + } + } else { + t.Logf("path mtu for %v: %v", c.RemoteAddr(), pmtu) + } + + <-done +} + +func TestPacketConnChecksum(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + c, err := net.ListenPacket(fmt.Sprintf("ip6:%d", iana.ProtocolOSPFIGP), "::") // OSPF for IPv6 + if err != nil { + t.Fatal(err) + } + defer c.Close() + + p := ipv6.NewPacketConn(c) + offset := 12 // see RFC 5340 + + for _, toggle := range []bool{false, true} { + if err := p.SetChecksum(toggle, offset); err != nil { + if toggle { + t.Fatalf("ipv6.PacketConn.SetChecksum(%v, %v) failed: %v", toggle, offset, err) + } else { + // Some platforms never allow to disable the kernel + // checksum processing. + t.Logf("ipv6.PacketConn.SetChecksum(%v, %v) failed: %v", toggle, offset, err) + } + } + if on, offset, err := p.Checksum(); err != nil { + t.Fatal(err) + } else { + t.Logf("kernel checksum processing enabled=%v, offset=%v", on, offset) + } + } +} diff --git a/vendor/golang.org/x/net/ipv6/sockopt_unix.go b/vendor/golang.org/x/net/ipv6/sockopt_unix.go new file mode 100644 index 0000000000..25ea545f5b --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sockopt_unix.go @@ -0,0 +1,122 @@ +// Copyright 2013 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 darwin dragonfly freebsd linux netbsd openbsd + +package ipv6 + +import ( + "net" + "os" + "unsafe" +) + +func getInt(fd int, opt *sockOpt) (int, error) { + if opt.name < 1 || opt.typ != ssoTypeInt { + return 0, errOpNoSupport + } + var i int32 + l := sysSockoptLen(4) + if err := getsockopt(fd, opt.level, opt.name, unsafe.Pointer(&i), &l); err != nil { + return 0, os.NewSyscallError("getsockopt", err) + } + return int(i), nil +} + +func setInt(fd int, opt *sockOpt, v int) error { + if opt.name < 1 || opt.typ != ssoTypeInt { + return errOpNoSupport + } + i := int32(v) + return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, unsafe.Pointer(&i), sysSockoptLen(4))) +} + +func getInterface(fd int, opt *sockOpt) (*net.Interface, error) { + if opt.name < 1 || opt.typ != ssoTypeInterface { + return nil, errOpNoSupport + } + var i int32 + l := sysSockoptLen(4) + if err := getsockopt(fd, opt.level, opt.name, unsafe.Pointer(&i), &l); err != nil { + return nil, os.NewSyscallError("getsockopt", err) + } + if i == 0 { + return nil, nil + } + ifi, err := net.InterfaceByIndex(int(i)) + if err != nil { + return nil, err + } + return ifi, nil +} + +func setInterface(fd int, opt *sockOpt, ifi *net.Interface) error { + if opt.name < 1 || opt.typ != ssoTypeInterface { + return errOpNoSupport + } + var i int32 + if ifi != nil { + i = int32(ifi.Index) + } + return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, unsafe.Pointer(&i), sysSockoptLen(4))) +} + +func getICMPFilter(fd int, opt *sockOpt) (*ICMPFilter, error) { + if opt.name < 1 || opt.typ != ssoTypeICMPFilter { + return nil, errOpNoSupport + } + var f ICMPFilter + l := sysSockoptLen(sysSizeofICMPv6Filter) + if err := getsockopt(fd, opt.level, opt.name, unsafe.Pointer(&f.sysICMPv6Filter), &l); err != nil { + return nil, os.NewSyscallError("getsockopt", err) + } + return &f, nil +} + +func setICMPFilter(fd int, opt *sockOpt, f *ICMPFilter) error { + if opt.name < 1 || opt.typ != ssoTypeICMPFilter { + return errOpNoSupport + } + return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, unsafe.Pointer(&f.sysICMPv6Filter), sysSizeofICMPv6Filter)) +} + +func getMTUInfo(fd int, opt *sockOpt) (*net.Interface, int, error) { + if opt.name < 1 || opt.typ != ssoTypeMTUInfo { + return nil, 0, errOpNoSupport + } + var mi sysIPv6Mtuinfo + l := sysSockoptLen(sysSizeofIPv6Mtuinfo) + if err := getsockopt(fd, opt.level, opt.name, unsafe.Pointer(&mi), &l); err != nil { + return nil, 0, os.NewSyscallError("getsockopt", err) + } + if mi.Addr.Scope_id == 0 { + return nil, int(mi.Mtu), nil + } + ifi, err := net.InterfaceByIndex(int(mi.Addr.Scope_id)) + if err != nil { + return nil, 0, err + } + return ifi, int(mi.Mtu), nil +} + +func setGroup(fd int, opt *sockOpt, ifi *net.Interface, grp net.IP) error { + if opt.name < 1 { + return errOpNoSupport + } + switch opt.typ { + case ssoTypeIPMreq: + return setsockoptIPMreq(fd, opt, ifi, grp) + case ssoTypeGroupReq: + return setsockoptGroupReq(fd, opt, ifi, grp) + default: + return errOpNoSupport + } +} + +func setSourceGroup(fd int, opt *sockOpt, ifi *net.Interface, grp, src net.IP) error { + if opt.name < 1 || opt.typ != ssoTypeGroupSourceReq { + return errOpNoSupport + } + return setsockoptGroupSourceReq(fd, opt, ifi, grp, src) +} diff --git a/vendor/golang.org/x/net/ipv6/sockopt_windows.go b/vendor/golang.org/x/net/ipv6/sockopt_windows.go new file mode 100644 index 0000000000..32c73b722c --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sockopt_windows.go @@ -0,0 +1,86 @@ +// Copyright 2013 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 ipv6 + +import ( + "net" + "os" + "syscall" + "unsafe" +) + +func getInt(fd syscall.Handle, opt *sockOpt) (int, error) { + if opt.name < 1 || opt.typ != ssoTypeInt { + return 0, errOpNoSupport + } + var i int32 + l := int32(4) + if err := syscall.Getsockopt(fd, int32(opt.level), int32(opt.name), (*byte)(unsafe.Pointer(&i)), &l); err != nil { + return 0, os.NewSyscallError("getsockopt", err) + } + return int(i), nil +} + +func setInt(fd syscall.Handle, opt *sockOpt, v int) error { + if opt.name < 1 || opt.typ != ssoTypeInt { + return errOpNoSupport + } + i := int32(v) + return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, int32(opt.level), int32(opt.name), (*byte)(unsafe.Pointer(&i)), 4)) +} + +func getInterface(fd syscall.Handle, opt *sockOpt) (*net.Interface, error) { + if opt.name < 1 || opt.typ != ssoTypeInterface { + return nil, errOpNoSupport + } + var i int32 + l := int32(4) + if err := syscall.Getsockopt(fd, int32(opt.level), int32(opt.name), (*byte)(unsafe.Pointer(&i)), &l); err != nil { + return nil, os.NewSyscallError("getsockopt", err) + } + if i == 0 { + return nil, nil + } + ifi, err := net.InterfaceByIndex(int(i)) + if err != nil { + return nil, err + } + return ifi, nil +} + +func setInterface(fd syscall.Handle, opt *sockOpt, ifi *net.Interface) error { + if opt.name < 1 || opt.typ != ssoTypeInterface { + return errOpNoSupport + } + var i int32 + if ifi != nil { + i = int32(ifi.Index) + } + return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, int32(opt.level), int32(opt.name), (*byte)(unsafe.Pointer(&i)), 4)) +} + +func getICMPFilter(fd syscall.Handle, opt *sockOpt) (*ICMPFilter, error) { + return nil, errOpNoSupport +} + +func setICMPFilter(fd syscall.Handle, opt *sockOpt, f *ICMPFilter) error { + return errOpNoSupport +} + +func getMTUInfo(fd syscall.Handle, opt *sockOpt) (*net.Interface, int, error) { + return nil, 0, errOpNoSupport +} + +func setGroup(fd syscall.Handle, opt *sockOpt, ifi *net.Interface, grp net.IP) error { + if opt.name < 1 || opt.typ != ssoTypeIPMreq { + return errOpNoSupport + } + return setsockoptIPMreq(fd, opt, ifi, grp) +} + +func setSourceGroup(fd syscall.Handle, opt *sockOpt, ifi *net.Interface, grp, src net.IP) error { + // TODO(mikio): implement this + return errOpNoSupport +} diff --git a/vendor/golang.org/x/net/ipv6/sys_bsd.go b/vendor/golang.org/x/net/ipv6/sys_bsd.go new file mode 100644 index 0000000000..75a8863b3e --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_bsd.go @@ -0,0 +1,58 @@ +// Copyright 2013 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 dragonfly netbsd openbsd + +package ipv6 + +import ( + "net" + "syscall" + + "golang.org/x/net/internal/iana" +) + +type sysSockoptLen int32 + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, + ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_PKTINFO, sysSizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlNextHop: {sysIPV6_NEXTHOP, sysSizeofSockaddrInet6, marshalNextHop, parseNextHop}, + ctlPathMTU: {sysIPV6_PATHMTU, sysSizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + } + + sockOpts = [ssoMax]sockOpt{ + ssoTrafficClass: {iana.ProtocolIPv6, sysIPV6_TCLASS, ssoTypeInt}, + ssoHopLimit: {iana.ProtocolIPv6, sysIPV6_UNICAST_HOPS, ssoTypeInt}, + ssoMulticastInterface: {iana.ProtocolIPv6, sysIPV6_MULTICAST_IF, ssoTypeInterface}, + ssoMulticastHopLimit: {iana.ProtocolIPv6, sysIPV6_MULTICAST_HOPS, ssoTypeInt}, + ssoMulticastLoopback: {iana.ProtocolIPv6, sysIPV6_MULTICAST_LOOP, ssoTypeInt}, + ssoReceiveTrafficClass: {iana.ProtocolIPv6, sysIPV6_RECVTCLASS, ssoTypeInt}, + ssoReceiveHopLimit: {iana.ProtocolIPv6, sysIPV6_RECVHOPLIMIT, ssoTypeInt}, + ssoReceivePacketInfo: {iana.ProtocolIPv6, sysIPV6_RECVPKTINFO, ssoTypeInt}, + ssoReceivePathMTU: {iana.ProtocolIPv6, sysIPV6_RECVPATHMTU, ssoTypeInt}, + ssoPathMTU: {iana.ProtocolIPv6, sysIPV6_PATHMTU, ssoTypeMTUInfo}, + ssoChecksum: {iana.ProtocolIPv6, sysIPV6_CHECKSUM, ssoTypeInt}, + ssoICMPFilter: {iana.ProtocolIPv6ICMP, sysICMP6_FILTER, ssoTypeICMPFilter}, + ssoJoinGroup: {iana.ProtocolIPv6, sysIPV6_JOIN_GROUP, ssoTypeIPMreq}, + ssoLeaveGroup: {iana.ProtocolIPv6, sysIPV6_LEAVE_GROUP, ssoTypeIPMreq}, + } +) + +func (sa *sysSockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Len = sysSizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *sysInet6Pktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (mreq *sysIPv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} diff --git a/vendor/golang.org/x/net/ipv6/sys_darwin.go b/vendor/golang.org/x/net/ipv6/sys_darwin.go new file mode 100644 index 0000000000..411fb498c8 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_darwin.go @@ -0,0 +1,135 @@ +// Copyright 2013 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 ipv6 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" +) + +type sysSockoptLen int32 + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlHopLimit: {sysIPV6_2292HOPLIMIT, 4, marshal2292HopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_2292PKTINFO, sysSizeofInet6Pktinfo, marshal2292PacketInfo, parsePacketInfo}, + } + + sockOpts = [ssoMax]sockOpt{ + ssoHopLimit: {iana.ProtocolIPv6, sysIPV6_UNICAST_HOPS, ssoTypeInt}, + ssoMulticastInterface: {iana.ProtocolIPv6, sysIPV6_MULTICAST_IF, ssoTypeInterface}, + ssoMulticastHopLimit: {iana.ProtocolIPv6, sysIPV6_MULTICAST_HOPS, ssoTypeInt}, + ssoMulticastLoopback: {iana.ProtocolIPv6, sysIPV6_MULTICAST_LOOP, ssoTypeInt}, + ssoReceiveHopLimit: {iana.ProtocolIPv6, sysIPV6_2292HOPLIMIT, ssoTypeInt}, + ssoReceivePacketInfo: {iana.ProtocolIPv6, sysIPV6_2292PKTINFO, ssoTypeInt}, + ssoChecksum: {iana.ProtocolIPv6, sysIPV6_CHECKSUM, ssoTypeInt}, + ssoICMPFilter: {iana.ProtocolIPv6ICMP, sysICMP6_FILTER, ssoTypeICMPFilter}, + ssoJoinGroup: {iana.ProtocolIPv6, sysIPV6_JOIN_GROUP, ssoTypeIPMreq}, + ssoLeaveGroup: {iana.ProtocolIPv6, sysIPV6_LEAVE_GROUP, ssoTypeIPMreq}, + } +) + +func init() { + // Seems like kern.osreldate is veiled on latest OS X. We use + // kern.osrelease instead. + osver, err := syscall.Sysctl("kern.osrelease") + if err != nil { + return + } + var i int + for i = range osver { + if osver[i] == '.' { + break + } + } + // The IP_PKTINFO and protocol-independent multicast API were + // introduced in OS X 10.7 (Darwin 11.0.0). But it looks like + // those features require OS X 10.8 (Darwin 12.0.0) and above. + // See http://support.apple.com/kb/HT1633. + if i > 2 || i == 2 && osver[0] >= '1' && osver[1] >= '2' { + ctlOpts[ctlTrafficClass].name = sysIPV6_TCLASS + ctlOpts[ctlTrafficClass].length = 4 + ctlOpts[ctlTrafficClass].marshal = marshalTrafficClass + ctlOpts[ctlTrafficClass].parse = parseTrafficClass + ctlOpts[ctlHopLimit].name = sysIPV6_HOPLIMIT + ctlOpts[ctlHopLimit].marshal = marshalHopLimit + ctlOpts[ctlPacketInfo].name = sysIPV6_PKTINFO + ctlOpts[ctlPacketInfo].marshal = marshalPacketInfo + ctlOpts[ctlNextHop].name = sysIPV6_NEXTHOP + ctlOpts[ctlNextHop].length = sysSizeofSockaddrInet6 + ctlOpts[ctlNextHop].marshal = marshalNextHop + ctlOpts[ctlNextHop].parse = parseNextHop + ctlOpts[ctlPathMTU].name = sysIPV6_PATHMTU + ctlOpts[ctlPathMTU].length = sysSizeofIPv6Mtuinfo + ctlOpts[ctlPathMTU].marshal = marshalPathMTU + ctlOpts[ctlPathMTU].parse = parsePathMTU + sockOpts[ssoTrafficClass].level = iana.ProtocolIPv6 + sockOpts[ssoTrafficClass].name = sysIPV6_TCLASS + sockOpts[ssoTrafficClass].typ = ssoTypeInt + sockOpts[ssoReceiveTrafficClass].level = iana.ProtocolIPv6 + sockOpts[ssoReceiveTrafficClass].name = sysIPV6_RECVTCLASS + sockOpts[ssoReceiveTrafficClass].typ = ssoTypeInt + sockOpts[ssoReceiveHopLimit].name = sysIPV6_RECVHOPLIMIT + sockOpts[ssoReceivePacketInfo].name = sysIPV6_RECVPKTINFO + sockOpts[ssoReceivePathMTU].level = iana.ProtocolIPv6 + sockOpts[ssoReceivePathMTU].name = sysIPV6_RECVPATHMTU + sockOpts[ssoReceivePathMTU].typ = ssoTypeInt + sockOpts[ssoPathMTU].level = iana.ProtocolIPv6 + sockOpts[ssoPathMTU].name = sysIPV6_PATHMTU + sockOpts[ssoPathMTU].typ = ssoTypeMTUInfo + sockOpts[ssoJoinGroup].name = sysMCAST_JOIN_GROUP + sockOpts[ssoJoinGroup].typ = ssoTypeGroupReq + sockOpts[ssoLeaveGroup].name = sysMCAST_LEAVE_GROUP + sockOpts[ssoLeaveGroup].typ = ssoTypeGroupReq + sockOpts[ssoJoinSourceGroup].level = iana.ProtocolIPv6 + sockOpts[ssoJoinSourceGroup].name = sysMCAST_JOIN_SOURCE_GROUP + sockOpts[ssoJoinSourceGroup].typ = ssoTypeGroupSourceReq + sockOpts[ssoLeaveSourceGroup].level = iana.ProtocolIPv6 + sockOpts[ssoLeaveSourceGroup].name = sysMCAST_LEAVE_SOURCE_GROUP + sockOpts[ssoLeaveSourceGroup].typ = ssoTypeGroupSourceReq + sockOpts[ssoBlockSourceGroup].level = iana.ProtocolIPv6 + sockOpts[ssoBlockSourceGroup].name = sysMCAST_BLOCK_SOURCE + sockOpts[ssoBlockSourceGroup].typ = ssoTypeGroupSourceReq + sockOpts[ssoUnblockSourceGroup].level = iana.ProtocolIPv6 + sockOpts[ssoUnblockSourceGroup].name = sysMCAST_UNBLOCK_SOURCE + sockOpts[ssoUnblockSourceGroup].typ = ssoTypeGroupSourceReq + } +} + +func (sa *sysSockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Len = sysSizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *sysInet6Pktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (mreq *sysIPv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} + +func (gr *sysGroupReq) setGroup(grp net.IP) { + sa := (*sysSockaddrInet6)(unsafe.Pointer(&gr.Pad_cgo_0[0])) + sa.Len = sysSizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) +} + +func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Pad_cgo_0[0])) + sa.Len = sysSizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) + sa = (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Pad_cgo_1[0])) + sa.Len = sysSizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], src) +} diff --git a/vendor/golang.org/x/net/ipv6/sys_freebsd.go b/vendor/golang.org/x/net/ipv6/sys_freebsd.go new file mode 100644 index 0000000000..b68725cba6 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_freebsd.go @@ -0,0 +1,93 @@ +// Copyright 2013 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 ipv6 + +import ( + "net" + "runtime" + "strings" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" +) + +type sysSockoptLen int32 + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, + ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_PKTINFO, sysSizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlNextHop: {sysIPV6_NEXTHOP, sysSizeofSockaddrInet6, marshalNextHop, parseNextHop}, + ctlPathMTU: {sysIPV6_PATHMTU, sysSizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + } + + sockOpts = [ssoMax]sockOpt{ + ssoTrafficClass: {iana.ProtocolIPv6, sysIPV6_TCLASS, ssoTypeInt}, + ssoHopLimit: {iana.ProtocolIPv6, sysIPV6_UNICAST_HOPS, ssoTypeInt}, + ssoMulticastInterface: {iana.ProtocolIPv6, sysIPV6_MULTICAST_IF, ssoTypeInterface}, + ssoMulticastHopLimit: {iana.ProtocolIPv6, sysIPV6_MULTICAST_HOPS, ssoTypeInt}, + ssoMulticastLoopback: {iana.ProtocolIPv6, sysIPV6_MULTICAST_LOOP, ssoTypeInt}, + ssoReceiveTrafficClass: {iana.ProtocolIPv6, sysIPV6_RECVTCLASS, ssoTypeInt}, + ssoReceiveHopLimit: {iana.ProtocolIPv6, sysIPV6_RECVHOPLIMIT, ssoTypeInt}, + ssoReceivePacketInfo: {iana.ProtocolIPv6, sysIPV6_RECVPKTINFO, ssoTypeInt}, + ssoReceivePathMTU: {iana.ProtocolIPv6, sysIPV6_RECVPATHMTU, ssoTypeInt}, + ssoPathMTU: {iana.ProtocolIPv6, sysIPV6_PATHMTU, ssoTypeMTUInfo}, + ssoChecksum: {iana.ProtocolIPv6, sysIPV6_CHECKSUM, ssoTypeInt}, + ssoICMPFilter: {iana.ProtocolIPv6ICMP, sysICMP6_FILTER, ssoTypeICMPFilter}, + ssoJoinGroup: {iana.ProtocolIPv6, sysMCAST_JOIN_GROUP, ssoTypeGroupReq}, + ssoLeaveGroup: {iana.ProtocolIPv6, sysMCAST_LEAVE_GROUP, ssoTypeGroupReq}, + ssoJoinSourceGroup: {iana.ProtocolIPv6, sysMCAST_JOIN_SOURCE_GROUP, ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {iana.ProtocolIPv6, sysMCAST_LEAVE_SOURCE_GROUP, ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {iana.ProtocolIPv6, sysMCAST_BLOCK_SOURCE, ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {iana.ProtocolIPv6, sysMCAST_UNBLOCK_SOURCE, ssoTypeGroupSourceReq}, + } +) + +func init() { + if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" { + archs, _ := syscall.Sysctl("kern.supported_archs") + for _, s := range strings.Fields(archs) { + if s == "amd64" { + freebsd32o64 = true + break + } + } + } +} + +func (sa *sysSockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Len = sysSizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *sysInet6Pktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (mreq *sysIPv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} + +func (gr *sysGroupReq) setGroup(grp net.IP) { + sa := (*sysSockaddrInet6)(unsafe.Pointer(&gr.Group)) + sa.Len = sysSizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) +} + +func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Group)) + sa.Len = sysSizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) + sa = (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Source)) + sa.Len = sysSizeofSockaddrInet6 + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], src) +} diff --git a/vendor/golang.org/x/net/ipv6/sys_linux.go b/vendor/golang.org/x/net/ipv6/sys_linux.go new file mode 100644 index 0000000000..2fa6088d0f --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_linux.go @@ -0,0 +1,74 @@ +// Copyright 2013 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 ipv6 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" +) + +type sysSockoptLen int32 + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, + ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_PKTINFO, sysSizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlPathMTU: {sysIPV6_PATHMTU, sysSizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + } + + sockOpts = [ssoMax]sockOpt{ + ssoTrafficClass: {iana.ProtocolIPv6, sysIPV6_TCLASS, ssoTypeInt}, + ssoHopLimit: {iana.ProtocolIPv6, sysIPV6_UNICAST_HOPS, ssoTypeInt}, + ssoMulticastInterface: {iana.ProtocolIPv6, sysIPV6_MULTICAST_IF, ssoTypeInterface}, + ssoMulticastHopLimit: {iana.ProtocolIPv6, sysIPV6_MULTICAST_HOPS, ssoTypeInt}, + ssoMulticastLoopback: {iana.ProtocolIPv6, sysIPV6_MULTICAST_LOOP, ssoTypeInt}, + ssoReceiveTrafficClass: {iana.ProtocolIPv6, sysIPV6_RECVTCLASS, ssoTypeInt}, + ssoReceiveHopLimit: {iana.ProtocolIPv6, sysIPV6_RECVHOPLIMIT, ssoTypeInt}, + ssoReceivePacketInfo: {iana.ProtocolIPv6, sysIPV6_RECVPKTINFO, ssoTypeInt}, + ssoReceivePathMTU: {iana.ProtocolIPv6, sysIPV6_RECVPATHMTU, ssoTypeInt}, + ssoPathMTU: {iana.ProtocolIPv6, sysIPV6_PATHMTU, ssoTypeMTUInfo}, + ssoChecksum: {iana.ProtocolReserved, sysIPV6_CHECKSUM, ssoTypeInt}, + ssoICMPFilter: {iana.ProtocolIPv6ICMP, sysICMPV6_FILTER, ssoTypeICMPFilter}, + ssoJoinGroup: {iana.ProtocolIPv6, sysMCAST_JOIN_GROUP, ssoTypeGroupReq}, + ssoLeaveGroup: {iana.ProtocolIPv6, sysMCAST_LEAVE_GROUP, ssoTypeGroupReq}, + ssoJoinSourceGroup: {iana.ProtocolIPv6, sysMCAST_JOIN_SOURCE_GROUP, ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {iana.ProtocolIPv6, sysMCAST_LEAVE_SOURCE_GROUP, ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {iana.ProtocolIPv6, sysMCAST_BLOCK_SOURCE, ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {iana.ProtocolIPv6, sysMCAST_UNBLOCK_SOURCE, ssoTypeGroupSourceReq}, + } +) + +func (sa *sysSockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *sysInet6Pktinfo) setIfindex(i int) { + pi.Ifindex = int32(i) +} + +func (mreq *sysIPv6Mreq) setIfindex(i int) { + mreq.Ifindex = int32(i) +} + +func (gr *sysGroupReq) setGroup(grp net.IP) { + sa := (*sysSockaddrInet6)(unsafe.Pointer(&gr.Group)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) +} + +func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Group)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) + sa = (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Source)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], src) +} diff --git a/vendor/golang.org/x/net/ipv6/sys_stub.go b/vendor/golang.org/x/net/ipv6/sys_stub.go new file mode 100644 index 0000000000..6c9a14304a --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_stub.go @@ -0,0 +1,15 @@ +// 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 nacl plan9 solaris + +package ipv6 + +type sysSockoptLen int32 + +var ( + ctlOpts = [ctlMax]ctlOpt{} + + sockOpts = [ssoMax]sockOpt{} +) diff --git a/vendor/golang.org/x/net/ipv6/sys_windows.go b/vendor/golang.org/x/net/ipv6/sys_windows.go new file mode 100644 index 0000000000..fda875736f --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_windows.go @@ -0,0 +1,63 @@ +// Copyright 2013 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 ipv6 + +import ( + "net" + "syscall" + + "golang.org/x/net/internal/iana" +) + +const ( + // See ws2tcpip.h. + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PKTINFO = 0x13 + + sysSizeofSockaddrInet6 = 0x1c + + sysSizeofIPv6Mreq = 0x14 +) + +type sysSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type sysIPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +var ( + ctlOpts = [ctlMax]ctlOpt{} + + sockOpts = [ssoMax]sockOpt{ + ssoHopLimit: {iana.ProtocolIPv6, sysIPV6_UNICAST_HOPS, ssoTypeInt}, + ssoMulticastInterface: {iana.ProtocolIPv6, sysIPV6_MULTICAST_IF, ssoTypeInterface}, + ssoMulticastHopLimit: {iana.ProtocolIPv6, sysIPV6_MULTICAST_HOPS, ssoTypeInt}, + ssoMulticastLoopback: {iana.ProtocolIPv6, sysIPV6_MULTICAST_LOOP, ssoTypeInt}, + ssoJoinGroup: {iana.ProtocolIPv6, sysIPV6_JOIN_GROUP, ssoTypeIPMreq}, + ssoLeaveGroup: {iana.ProtocolIPv6, sysIPV6_LEAVE_GROUP, ssoTypeIPMreq}, + } +) + +func (sa *sysSockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (mreq *sysIPv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} diff --git a/vendor/golang.org/x/net/ipv6/syscall_linux_386.go b/vendor/golang.org/x/net/ipv6/syscall_linux_386.go new file mode 100644 index 0000000000..82633a5649 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/syscall_linux_386.go @@ -0,0 +1,31 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ipv6 + +import ( + "syscall" + "unsafe" +) + +const ( + sysGETSOCKOPT = 0xf + sysSETSOCKOPT = 0xe +) + +func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (int, syscall.Errno) + +func getsockopt(fd, level, name int, v unsafe.Pointer, l *sysSockoptLen) error { + if _, errno := socketcall(sysGETSOCKOPT, uintptr(fd), uintptr(level), uintptr(name), uintptr(v), uintptr(unsafe.Pointer(l)), 0); errno != 0 { + return error(errno) + } + return nil +} + +func setsockopt(fd, level, name int, v unsafe.Pointer, l sysSockoptLen) error { + if _, errno := socketcall(sysSETSOCKOPT, uintptr(fd), uintptr(level), uintptr(name), uintptr(v), uintptr(l), 0); errno != 0 { + return error(errno) + } + return nil +} diff --git a/vendor/golang.org/x/net/ipv6/syscall_unix.go b/vendor/golang.org/x/net/ipv6/syscall_unix.go new file mode 100644 index 0000000000..a2bd8363a3 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/syscall_unix.go @@ -0,0 +1,26 @@ +// Copyright 2013 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 darwin dragonfly freebsd linux,!386 netbsd openbsd + +package ipv6 + +import ( + "syscall" + "unsafe" +) + +func getsockopt(fd, level, name int, v unsafe.Pointer, l *sysSockoptLen) error { + if _, _, errno := syscall.Syscall6(syscall.SYS_GETSOCKOPT, uintptr(fd), uintptr(level), uintptr(name), uintptr(v), uintptr(unsafe.Pointer(l)), 0); errno != 0 { + return error(errno) + } + return nil +} + +func setsockopt(fd, level, name int, v unsafe.Pointer, l sysSockoptLen) error { + if _, _, errno := syscall.Syscall6(syscall.SYS_SETSOCKOPT, uintptr(fd), uintptr(level), uintptr(name), uintptr(v), uintptr(l), 0); errno != 0 { + return error(errno) + } + return nil +} diff --git a/vendor/golang.org/x/net/ipv6/thunk_linux_386.s b/vendor/golang.org/x/net/ipv6/thunk_linux_386.s new file mode 100644 index 0000000000..daa78bc02d --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/thunk_linux_386.s @@ -0,0 +1,8 @@ +// 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 go1.2 + +TEXT ·socketcall(SB),4,$0-36 + JMP syscall·socketcall(SB) diff --git a/vendor/golang.org/x/net/ipv6/unicast_test.go b/vendor/golang.org/x/net/ipv6/unicast_test.go new file mode 100644 index 0000000000..db5b08a28c --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/unicast_test.go @@ -0,0 +1,182 @@ +// Copyright 2013 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 ipv6_test + +import ( + "bytes" + "net" + "os" + "runtime" + "testing" + "time" + + "golang.org/x/net/icmp" + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +func TestPacketConnReadWriteUnicastUDP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + c, err := net.ListenPacket("udp6", "[::1]:0") + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + defer p.Close() + + dst, err := net.ResolveUDPAddr("udp6", c.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + Src: net.IPv6loopback, + } + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) + if ifi != nil { + cm.IfIndex = ifi.Index + } + wb := []byte("HELLO-R-U-THERE") + + for i, toggle := range []bool{true, false, true} { + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Skipf("not supported on %s", runtime.GOOS) + } + t.Fatal(err) + } + cm.HopLimit = i + 1 + if err := p.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, err := p.WriteTo(wb, &cm, dst); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + if err := p.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, _, _, err := p.ReadFrom(rb); err != nil { + t.Fatal(err) + } else if !bytes.Equal(rb[:n], wb) { + t.Fatalf("got %v; want %v", rb[:n], wb) + } + } +} + +func TestPacketConnReadWriteUnicastICMP(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + if m, ok := nettest.SupportsRawIPSocket(); !ok { + t.Skip(m) + } + + c, err := net.ListenPacket("ip6:ipv6-icmp", "::1") + if err != nil { + t.Fatal(err) + } + defer c.Close() + p := ipv6.NewPacketConn(c) + defer p.Close() + + dst, err := net.ResolveIPAddr("ip6", "::1") + if err != nil { + t.Fatal(err) + } + + pshicmp := icmp.IPv6PseudoHeader(c.LocalAddr().(*net.IPAddr).IP, dst.IP) + cm := ipv6.ControlMessage{ + TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, + Src: net.IPv6loopback, + } + cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU + ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) + if ifi != nil { + cm.IfIndex = ifi.Index + } + + var f ipv6.ICMPFilter + f.SetAll(true) + f.Accept(ipv6.ICMPTypeEchoReply) + if err := p.SetICMPFilter(&f); err != nil { + t.Fatal(err) + } + + var psh []byte + for i, toggle := range []bool{true, false, true} { + if toggle { + psh = nil + if err := p.SetChecksum(true, 2); err != nil { + t.Fatal(err) + } + } else { + psh = pshicmp + // Some platforms never allow to disable the + // kernel checksum processing. + p.SetChecksum(false, -1) + } + wb, err := (&icmp.Message{ + Type: ipv6.ICMPTypeEchoRequest, Code: 0, + Body: &icmp.Echo{ + ID: os.Getpid() & 0xffff, Seq: i + 1, + Data: []byte("HELLO-R-U-THERE"), + }, + }).Marshal(psh) + if err != nil { + t.Fatal(err) + } + if err := p.SetControlMessage(cf, toggle); err != nil { + if nettest.ProtocolNotSupported(err) { + t.Skipf("not supported on %s", runtime.GOOS) + } + t.Fatal(err) + } + cm.HopLimit = i + 1 + if err := p.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, err := p.WriteTo(wb, &cm, dst); err != nil { + t.Fatal(err) + } else if n != len(wb) { + t.Fatalf("got %v; want %v", n, len(wb)) + } + rb := make([]byte, 128) + if err := p.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { + t.Fatal(err) + } + if n, _, _, err := p.ReadFrom(rb); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels have some limitation on receiving icmp packet through raw socket + t.Logf("not supported on %s", runtime.GOOS) + continue + } + t.Fatal(err) + } else { + if m, err := icmp.ParseMessage(iana.ProtocolIPv6ICMP, rb[:n]); err != nil { + t.Fatal(err) + } else if m.Type != ipv6.ICMPTypeEchoReply || m.Code != 0 { + t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv6.ICMPTypeEchoReply, 0) + } + } + } +} diff --git a/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go b/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go new file mode 100644 index 0000000000..7bb2e440ac --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go @@ -0,0 +1,111 @@ +// Copyright 2013 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 ipv6_test + +import ( + "net" + "runtime" + "testing" + + "golang.org/x/net/internal/iana" + "golang.org/x/net/internal/nettest" + "golang.org/x/net/ipv6" +) + +func TestConnUnicastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + ln, err := net.Listen("tcp6", "[::1]:0") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + + done := make(chan bool) + go acceptor(t, ln, done) + + c, err := net.Dial("tcp6", ln.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + testUnicastSocketOptions(t, ipv6.NewConn(c)) + + <-done +} + +var packetConnUnicastSocketOptionTests = []struct { + net, proto, addr string +}{ + {"udp6", "", "[::1]:0"}, + {"ip6", ":ipv6-icmp", "::1"}, +} + +func TestPacketConnUnicastSocketOptions(t *testing.T) { + switch runtime.GOOS { + case "nacl", "plan9", "solaris", "windows": + t.Skipf("not supported on %s", runtime.GOOS) + } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } + + m, ok := nettest.SupportsRawIPSocket() + for _, tt := range packetConnUnicastSocketOptionTests { + if tt.net == "ip6" && !ok { + t.Log(m) + continue + } + c, err := net.ListenPacket(tt.net+tt.proto, tt.addr) + if err != nil { + t.Fatal(err) + } + defer c.Close() + + testUnicastSocketOptions(t, ipv6.NewPacketConn(c)) + } +} + +type testIPv6UnicastConn interface { + TrafficClass() (int, error) + SetTrafficClass(int) error + HopLimit() (int, error) + SetHopLimit(int) error +} + +func testUnicastSocketOptions(t *testing.T, c testIPv6UnicastConn) { + tclass := iana.DiffServCS0 | iana.NotECNTransport + if err := c.SetTrafficClass(tclass); err != nil { + switch runtime.GOOS { + case "darwin": // older darwin kernels don't support IPV6_TCLASS option + t.Logf("not supported on %s", runtime.GOOS) + goto next + } + t.Fatal(err) + } + if v, err := c.TrafficClass(); err != nil { + t.Fatal(err) + } else if v != tclass { + t.Fatalf("got %v; want %v", v, tclass) + } + +next: + hoplim := 255 + if err := c.SetHopLimit(hoplim); err != nil { + t.Fatal(err) + } + if v, err := c.HopLimit(); err != nil { + t.Fatal(err) + } else if v != hoplim { + t.Fatalf("got %v; want %v", v, hoplim) + } +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_darwin.go b/vendor/golang.org/x/net/ipv6/zsys_darwin.go new file mode 100644 index 0000000000..cb044b0336 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_darwin.go @@ -0,0 +1,131 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_darwin.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + sysIPV6_2292PKTINFO = 0x13 + sysIPV6_2292HOPLIMIT = 0x14 + sysIPV6_2292NEXTHOP = 0x15 + sysIPV6_2292HOPOPTS = 0x16 + sysIPV6_2292DSTOPTS = 0x17 + sysIPV6_2292RTHDR = 0x18 + + sysIPV6_2292PKTOPTIONS = 0x19 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RECVTCLASS = 0x23 + sysIPV6_TCLASS = 0x24 + + sysIPV6_RTHDRDSTOPTS = 0x39 + + sysIPV6_RECVPKTINFO = 0x3d + + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_MSFILTER = 0x4a + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysIPV6_BOUND_IF = 0x7d + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sysSizeofSockaddrStorage = 0x80 + sysSizeofSockaddrInet6 = 0x1c + sysSizeofInet6Pktinfo = 0x14 + sysSizeofIPv6Mtuinfo = 0x20 + + sysSizeofIPv6Mreq = 0x14 + sysSizeofGroupReq = 0x84 + sysSizeofGroupSourceReq = 0x104 + + sysSizeofICMPv6Filter = 0x20 +) + +type sysSockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sysSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type sysInet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type sysIPv6Mtuinfo struct { + Addr sysSockaddrInet6 + Mtu uint32 +} + +type sysIPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type sysICMPv6Filter struct { + Filt [8]uint32 +} + +type sysGroupReq struct { + Interface uint32 + Pad_cgo_0 [128]byte +} + +type sysGroupSourceReq struct { + Interface uint32 + Pad_cgo_0 [128]byte + Pad_cgo_1 [128]byte +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go b/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go new file mode 100644 index 0000000000..5a03ab7340 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go @@ -0,0 +1,90 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_dragonfly.go + +// +build dragonfly + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sysSizeofSockaddrInet6 = 0x1c + sysSizeofInet6Pktinfo = 0x14 + sysSizeofIPv6Mtuinfo = 0x20 + + sysSizeofIPv6Mreq = 0x14 + + sysSizeofICMPv6Filter = 0x20 +) + +type sysSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type sysInet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type sysIPv6Mtuinfo struct { + Addr sysSockaddrInet6 + Mtu uint32 +} + +type sysIPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type sysICMPv6Filter struct { + Filt [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go new file mode 100644 index 0000000000..4ace96f0c5 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go @@ -0,0 +1,122 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_BINDANY = 0x40 + + sysIPV6_MSFILTER = 0x4a + + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sysSizeofSockaddrStorage = 0x80 + sysSizeofSockaddrInet6 = 0x1c + sysSizeofInet6Pktinfo = 0x14 + sysSizeofIPv6Mtuinfo = 0x20 + + sysSizeofIPv6Mreq = 0x14 + sysSizeofGroupReq = 0x84 + sysSizeofGroupSourceReq = 0x104 + + sysSizeofICMPv6Filter = 0x20 +) + +type sysSockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sysSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type sysInet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type sysIPv6Mtuinfo struct { + Addr sysSockaddrInet6 + Mtu uint32 +} + +type sysIPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type sysGroupReq struct { + Interface uint32 + Group sysSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Group sysSockaddrStorage + Source sysSockaddrStorage +} + +type sysICMPv6Filter struct { + Filt [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go new file mode 100644 index 0000000000..4a62c2d5c0 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go @@ -0,0 +1,124 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_BINDANY = 0x40 + + sysIPV6_MSFILTER = 0x4a + + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sysSizeofSockaddrStorage = 0x80 + sysSizeofSockaddrInet6 = 0x1c + sysSizeofInet6Pktinfo = 0x14 + sysSizeofIPv6Mtuinfo = 0x20 + + sysSizeofIPv6Mreq = 0x14 + sysSizeofGroupReq = 0x88 + sysSizeofGroupSourceReq = 0x108 + + sysSizeofICMPv6Filter = 0x20 +) + +type sysSockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sysSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type sysInet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type sysIPv6Mtuinfo struct { + Addr sysSockaddrInet6 + Mtu uint32 +} + +type sysIPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type sysGroupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysSockaddrStorage + Source sysSockaddrStorage +} + +type sysICMPv6Filter struct { + Filt [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go new file mode 100644 index 0000000000..4a62c2d5c0 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go @@ -0,0 +1,124 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_freebsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PREFER_TEMPADDR = 0x3f + + sysIPV6_BINDANY = 0x40 + + sysIPV6_MSFILTER = 0x4a + + sysMCAST_JOIN_GROUP = 0x50 + sysMCAST_LEAVE_GROUP = 0x51 + sysMCAST_JOIN_SOURCE_GROUP = 0x52 + sysMCAST_LEAVE_SOURCE_GROUP = 0x53 + sysMCAST_BLOCK_SOURCE = 0x54 + sysMCAST_UNBLOCK_SOURCE = 0x55 + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sysSizeofSockaddrStorage = 0x80 + sysSizeofSockaddrInet6 = 0x1c + sysSizeofInet6Pktinfo = 0x14 + sysSizeofIPv6Mtuinfo = 0x20 + + sysSizeofIPv6Mreq = 0x14 + sysSizeofGroupReq = 0x88 + sysSizeofGroupSourceReq = 0x108 + + sysSizeofICMPv6Filter = 0x20 +) + +type sysSockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + +type sysSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type sysInet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type sysIPv6Mtuinfo struct { + Addr sysSockaddrInet6 + Mtu uint32 +} + +type sysIPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type sysGroupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysSockaddrStorage + Source sysSockaddrStorage +} + +type sysICMPv6Filter struct { + Filt [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_386.go b/vendor/golang.org/x/net/ipv6/zsys_linux_386.go new file mode 100644 index 0000000000..272792929d --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_386.go @@ -0,0 +1,152 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSizeofKernelSockaddrStorage = 0x80 + sysSizeofSockaddrInet6 = 0x1c + sysSizeofInet6Pktinfo = 0x14 + sysSizeofIPv6Mtuinfo = 0x20 + sysSizeofIPv6FlowlabelReq = 0x20 + + sysSizeofIPv6Mreq = 0x14 + sysSizeofGroupReq = 0x84 + sysSizeofGroupSourceReq = 0x104 + + sysSizeofICMPv6Filter = 0x20 +) + +type sysKernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sysSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type sysInet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type sysIPv6Mtuinfo struct { + Addr sysSockaddrInet6 + Mtu uint32 +} + +type sysIPv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type sysIPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type sysGroupReq struct { + Interface uint32 + Group sysKernelSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Group sysKernelSockaddrStorage + Source sysKernelSockaddrStorage +} + +type sysICMPv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go new file mode 100644 index 0000000000..2f742e9560 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go @@ -0,0 +1,154 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSizeofKernelSockaddrStorage = 0x80 + sysSizeofSockaddrInet6 = 0x1c + sysSizeofInet6Pktinfo = 0x14 + sysSizeofIPv6Mtuinfo = 0x20 + sysSizeofIPv6FlowlabelReq = 0x20 + + sysSizeofIPv6Mreq = 0x14 + sysSizeofGroupReq = 0x88 + sysSizeofGroupSourceReq = 0x108 + + sysSizeofICMPv6Filter = 0x20 +) + +type sysKernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sysSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type sysInet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type sysIPv6Mtuinfo struct { + Addr sysSockaddrInet6 + Mtu uint32 +} + +type sysIPv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type sysIPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type sysGroupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage + Source sysKernelSockaddrStorage +} + +type sysICMPv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go b/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go new file mode 100644 index 0000000000..272792929d --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go @@ -0,0 +1,152 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSizeofKernelSockaddrStorage = 0x80 + sysSizeofSockaddrInet6 = 0x1c + sysSizeofInet6Pktinfo = 0x14 + sysSizeofIPv6Mtuinfo = 0x20 + sysSizeofIPv6FlowlabelReq = 0x20 + + sysSizeofIPv6Mreq = 0x14 + sysSizeofGroupReq = 0x84 + sysSizeofGroupSourceReq = 0x104 + + sysSizeofICMPv6Filter = 0x20 +) + +type sysKernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sysSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type sysInet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type sysIPv6Mtuinfo struct { + Addr sysSockaddrInet6 + Mtu uint32 +} + +type sysIPv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type sysIPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type sysGroupReq struct { + Interface uint32 + Group sysKernelSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Group sysKernelSockaddrStorage + Source sysKernelSockaddrStorage +} + +type sysICMPv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go new file mode 100644 index 0000000000..ab10464533 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go @@ -0,0 +1,156 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +// +build linux,arm64 + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSizeofKernelSockaddrStorage = 0x80 + sysSizeofSockaddrInet6 = 0x1c + sysSizeofInet6Pktinfo = 0x14 + sysSizeofIPv6Mtuinfo = 0x20 + sysSizeofIPv6FlowlabelReq = 0x20 + + sysSizeofIPv6Mreq = 0x14 + sysSizeofGroupReq = 0x88 + sysSizeofGroupSourceReq = 0x108 + + sysSizeofICMPv6Filter = 0x20 +) + +type sysKernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sysSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type sysInet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type sysIPv6Mtuinfo struct { + Addr sysSockaddrInet6 + Mtu uint32 +} + +type sysIPv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type sysIPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type sysGroupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage + Source sysKernelSockaddrStorage +} + +type sysICMPv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go new file mode 100644 index 0000000000..ec8ce1579d --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go @@ -0,0 +1,156 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +// +build linux,mips64 + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSizeofKernelSockaddrStorage = 0x80 + sysSizeofSockaddrInet6 = 0x1c + sysSizeofInet6Pktinfo = 0x14 + sysSizeofIPv6Mtuinfo = 0x20 + sysSizeofIPv6FlowlabelReq = 0x20 + + sysSizeofIPv6Mreq = 0x14 + sysSizeofGroupReq = 0x88 + sysSizeofGroupSourceReq = 0x108 + + sysSizeofICMPv6Filter = 0x20 +) + +type sysKernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sysSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type sysInet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type sysIPv6Mtuinfo struct { + Addr sysSockaddrInet6 + Mtu uint32 +} + +type sysIPv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type sysIPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type sysGroupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage + Source sysKernelSockaddrStorage +} + +type sysICMPv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go new file mode 100644 index 0000000000..2341ae6774 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go @@ -0,0 +1,156 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +// +build linux,mips64le + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSizeofKernelSockaddrStorage = 0x80 + sysSizeofSockaddrInet6 = 0x1c + sysSizeofInet6Pktinfo = 0x14 + sysSizeofIPv6Mtuinfo = 0x20 + sysSizeofIPv6FlowlabelReq = 0x20 + + sysSizeofIPv6Mreq = 0x14 + sysSizeofGroupReq = 0x88 + sysSizeofGroupSourceReq = 0x108 + + sysSizeofICMPv6Filter = 0x20 +) + +type sysKernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sysSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type sysInet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type sysIPv6Mtuinfo struct { + Addr sysSockaddrInet6 + Mtu uint32 +} + +type sysIPv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type sysIPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type sysGroupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage + Source sysKernelSockaddrStorage +} + +type sysICMPv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go new file mode 100644 index 0000000000..b99b8a5150 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go @@ -0,0 +1,156 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +// +build linux,ppc64 + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSizeofKernelSockaddrStorage = 0x80 + sysSizeofSockaddrInet6 = 0x1c + sysSizeofInet6Pktinfo = 0x14 + sysSizeofIPv6Mtuinfo = 0x20 + sysSizeofIPv6FlowlabelReq = 0x20 + + sysSizeofIPv6Mreq = 0x14 + sysSizeofGroupReq = 0x88 + sysSizeofGroupSourceReq = 0x108 + + sysSizeofICMPv6Filter = 0x20 +) + +type sysKernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sysSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type sysInet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type sysIPv6Mtuinfo struct { + Addr sysSockaddrInet6 + Mtu uint32 +} + +type sysIPv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type sysIPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type sysGroupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage + Source sysKernelSockaddrStorage +} + +type sysICMPv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go new file mode 100644 index 0000000000..992b56e2ed --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go @@ -0,0 +1,156 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_linux.go + +// +build linux,ppc64le + +package ipv6 + +const ( + sysIPV6_ADDRFORM = 0x1 + sysIPV6_2292PKTINFO = 0x2 + sysIPV6_2292HOPOPTS = 0x3 + sysIPV6_2292DSTOPTS = 0x4 + sysIPV6_2292RTHDR = 0x5 + sysIPV6_2292PKTOPTIONS = 0x6 + sysIPV6_CHECKSUM = 0x7 + sysIPV6_2292HOPLIMIT = 0x8 + sysIPV6_NEXTHOP = 0x9 + sysIPV6_FLOWINFO = 0xb + + sysIPV6_UNICAST_HOPS = 0x10 + sysIPV6_MULTICAST_IF = 0x11 + sysIPV6_MULTICAST_HOPS = 0x12 + sysIPV6_MULTICAST_LOOP = 0x13 + sysIPV6_ADD_MEMBERSHIP = 0x14 + sysIPV6_DROP_MEMBERSHIP = 0x15 + sysMCAST_JOIN_GROUP = 0x2a + sysMCAST_LEAVE_GROUP = 0x2d + sysMCAST_JOIN_SOURCE_GROUP = 0x2e + sysMCAST_LEAVE_SOURCE_GROUP = 0x2f + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_MSFILTER = 0x30 + sysIPV6_ROUTER_ALERT = 0x16 + sysIPV6_MTU_DISCOVER = 0x17 + sysIPV6_MTU = 0x18 + sysIPV6_RECVERR = 0x19 + sysIPV6_V6ONLY = 0x1a + sysIPV6_JOIN_ANYCAST = 0x1b + sysIPV6_LEAVE_ANYCAST = 0x1c + + sysIPV6_FLOWLABEL_MGR = 0x20 + sysIPV6_FLOWINFO_SEND = 0x21 + + sysIPV6_IPSEC_POLICY = 0x22 + sysIPV6_XFRM_POLICY = 0x23 + + sysIPV6_RECVPKTINFO = 0x31 + sysIPV6_PKTINFO = 0x32 + sysIPV6_RECVHOPLIMIT = 0x33 + sysIPV6_HOPLIMIT = 0x34 + sysIPV6_RECVHOPOPTS = 0x35 + sysIPV6_HOPOPTS = 0x36 + sysIPV6_RTHDRDSTOPTS = 0x37 + sysIPV6_RECVRTHDR = 0x38 + sysIPV6_RTHDR = 0x39 + sysIPV6_RECVDSTOPTS = 0x3a + sysIPV6_DSTOPTS = 0x3b + sysIPV6_RECVPATHMTU = 0x3c + sysIPV6_PATHMTU = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_RECVTCLASS = 0x42 + sysIPV6_TCLASS = 0x43 + + sysIPV6_ADDR_PREFERENCES = 0x48 + + sysIPV6_PREFER_SRC_TMP = 0x1 + sysIPV6_PREFER_SRC_PUBLIC = 0x2 + sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 + sysIPV6_PREFER_SRC_COA = 0x4 + sysIPV6_PREFER_SRC_HOME = 0x400 + sysIPV6_PREFER_SRC_CGA = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x800 + + sysIPV6_MINHOPCOUNT = 0x49 + + sysIPV6_ORIGDSTADDR = 0x4a + sysIPV6_RECVORIGDSTADDR = 0x4a + sysIPV6_TRANSPARENT = 0x4b + sysIPV6_UNICAST_IF = 0x4c + + sysICMPV6_FILTER = 0x1 + + sysICMPV6_FILTER_BLOCK = 0x1 + sysICMPV6_FILTER_PASS = 0x2 + sysICMPV6_FILTER_BLOCKOTHERS = 0x3 + sysICMPV6_FILTER_PASSONLY = 0x4 + + sysSizeofKernelSockaddrStorage = 0x80 + sysSizeofSockaddrInet6 = 0x1c + sysSizeofInet6Pktinfo = 0x14 + sysSizeofIPv6Mtuinfo = 0x20 + sysSizeofIPv6FlowlabelReq = 0x20 + + sysSizeofIPv6Mreq = 0x14 + sysSizeofGroupReq = 0x88 + sysSizeofGroupSourceReq = 0x108 + + sysSizeofICMPv6Filter = 0x20 +) + +type sysKernelSockaddrStorage struct { + Family uint16 + X__data [126]int8 +} + +type sysSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type sysInet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex int32 +} + +type sysIPv6Mtuinfo struct { + Addr sysSockaddrInet6 + Mtu uint32 +} + +type sysIPv6FlowlabelReq struct { + Dst [16]byte /* in6_addr */ + Label uint32 + Action uint8 + Share uint8 + Flags uint16 + Expires uint16 + Linger uint16 + X__flr_pad uint32 +} + +type sysIPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Ifindex int32 +} + +type sysGroupReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage +} + +type sysGroupSourceReq struct { + Interface uint32 + Pad_cgo_0 [4]byte + Group sysKernelSockaddrStorage + Source sysKernelSockaddrStorage +} + +type sysICMPv6Filter struct { + Data [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_netbsd.go b/vendor/golang.org/x/net/ipv6/zsys_netbsd.go new file mode 100644 index 0000000000..d6ec88e39b --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_netbsd.go @@ -0,0 +1,84 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_netbsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_IPSEC_POLICY = 0x1c + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sysSizeofSockaddrInet6 = 0x1c + sysSizeofInet6Pktinfo = 0x14 + sysSizeofIPv6Mtuinfo = 0x20 + + sysSizeofIPv6Mreq = 0x14 + + sysSizeofICMPv6Filter = 0x20 +) + +type sysSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type sysInet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type sysIPv6Mtuinfo struct { + Addr sysSockaddrInet6 + Mtu uint32 +} + +type sysIPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type sysICMPv6Filter struct { + Filt [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_openbsd.go b/vendor/golang.org/x/net/ipv6/zsys_openbsd.go new file mode 100644 index 0000000000..3e080b78aa --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_openbsd.go @@ -0,0 +1,93 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_openbsd.go + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x4 + sysIPV6_MULTICAST_IF = 0x9 + sysIPV6_MULTICAST_HOPS = 0xa + sysIPV6_MULTICAST_LOOP = 0xb + sysIPV6_JOIN_GROUP = 0xc + sysIPV6_LEAVE_GROUP = 0xd + sysIPV6_PORTRANGE = 0xe + sysICMP6_FILTER = 0x12 + + sysIPV6_CHECKSUM = 0x1a + sysIPV6_V6ONLY = 0x1b + + sysIPV6_RTHDRDSTOPTS = 0x23 + + sysIPV6_RECVPKTINFO = 0x24 + sysIPV6_RECVHOPLIMIT = 0x25 + sysIPV6_RECVRTHDR = 0x26 + sysIPV6_RECVHOPOPTS = 0x27 + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_USE_MIN_MTU = 0x2a + sysIPV6_RECVPATHMTU = 0x2b + + sysIPV6_PATHMTU = 0x2c + + sysIPV6_PKTINFO = 0x2e + sysIPV6_HOPLIMIT = 0x2f + sysIPV6_NEXTHOP = 0x30 + sysIPV6_HOPOPTS = 0x31 + sysIPV6_DSTOPTS = 0x32 + sysIPV6_RTHDR = 0x33 + + sysIPV6_AUTH_LEVEL = 0x35 + sysIPV6_ESP_TRANS_LEVEL = 0x36 + sysIPV6_ESP_NETWORK_LEVEL = 0x37 + sysIPSEC6_OUTSA = 0x38 + sysIPV6_RECVTCLASS = 0x39 + + sysIPV6_AUTOFLOWLABEL = 0x3b + sysIPV6_IPCOMP_LEVEL = 0x3c + + sysIPV6_TCLASS = 0x3d + sysIPV6_DONTFRAG = 0x3e + sysIPV6_PIPEX = 0x3f + + sysIPV6_RTABLE = 0x1021 + + sysIPV6_PORTRANGE_DEFAULT = 0x0 + sysIPV6_PORTRANGE_HIGH = 0x1 + sysIPV6_PORTRANGE_LOW = 0x2 + + sysSizeofSockaddrInet6 = 0x1c + sysSizeofInet6Pktinfo = 0x14 + sysSizeofIPv6Mtuinfo = 0x20 + + sysSizeofIPv6Mreq = 0x14 + + sysSizeofICMPv6Filter = 0x20 +) + +type sysSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type sysInet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type sysIPv6Mtuinfo struct { + Addr sysSockaddrInet6 + Mtu uint32 +} + +type sysIPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type sysICMPv6Filter struct { + Filt [8]uint32 +} diff --git a/vendor/golang.org/x/net/ipv6/zsys_solaris.go b/vendor/golang.org/x/net/ipv6/zsys_solaris.go new file mode 100644 index 0000000000..cdf00c25d9 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/zsys_solaris.go @@ -0,0 +1,105 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_solaris.go + +// +build solaris + +package ipv6 + +const ( + sysIPV6_UNICAST_HOPS = 0x5 + sysIPV6_MULTICAST_IF = 0x6 + sysIPV6_MULTICAST_HOPS = 0x7 + sysIPV6_MULTICAST_LOOP = 0x8 + sysIPV6_JOIN_GROUP = 0x9 + sysIPV6_LEAVE_GROUP = 0xa + + sysIPV6_PKTINFO = 0xb + + sysIPV6_HOPLIMIT = 0xc + sysIPV6_NEXTHOP = 0xd + sysIPV6_HOPOPTS = 0xe + sysIPV6_DSTOPTS = 0xf + + sysIPV6_RTHDR = 0x10 + sysIPV6_RTHDRDSTOPTS = 0x11 + + sysIPV6_RECVPKTINFO = 0x12 + sysIPV6_RECVHOPLIMIT = 0x13 + sysIPV6_RECVHOPOPTS = 0x14 + + sysIPV6_RECVRTHDR = 0x16 + + sysIPV6_RECVRTHDRDSTOPTS = 0x17 + + sysIPV6_CHECKSUM = 0x18 + sysIPV6_RECVTCLASS = 0x19 + sysIPV6_USE_MIN_MTU = 0x20 + sysIPV6_DONTFRAG = 0x21 + sysIPV6_SEC_OPT = 0x22 + sysIPV6_SRC_PREFERENCES = 0x23 + sysIPV6_RECVPATHMTU = 0x24 + sysIPV6_PATHMTU = 0x25 + sysIPV6_TCLASS = 0x26 + sysIPV6_V6ONLY = 0x27 + + sysIPV6_RECVDSTOPTS = 0x28 + + sysIPV6_PREFER_SRC_HOME = 0x1 + sysIPV6_PREFER_SRC_COA = 0x2 + sysIPV6_PREFER_SRC_PUBLIC = 0x4 + sysIPV6_PREFER_SRC_TMP = 0x8 + sysIPV6_PREFER_SRC_NONCGA = 0x10 + sysIPV6_PREFER_SRC_CGA = 0x20 + + sysIPV6_PREFER_SRC_MIPMASK = 0x3 + sysIPV6_PREFER_SRC_MIPDEFAULT = 0x1 + sysIPV6_PREFER_SRC_TMPMASK = 0xc + sysIPV6_PREFER_SRC_TMPDEFAULT = 0x4 + sysIPV6_PREFER_SRC_CGAMASK = 0x30 + sysIPV6_PREFER_SRC_CGADEFAULT = 0x10 + + sysIPV6_PREFER_SRC_MASK = 0x3f + + sysIPV6_PREFER_SRC_DEFAULT = 0x15 + + sysIPV6_BOUND_IF = 0x41 + sysIPV6_UNSPEC_SRC = 0x42 + + sysICMP6_FILTER = 0x1 + + sysSizeofSockaddrInet6 = 0x20 + sysSizeofInet6Pktinfo = 0x14 + sysSizeofIPv6Mtuinfo = 0x24 + + sysSizeofIPv6Mreq = 0x14 + + sysSizeofICMPv6Filter = 0x20 +) + +type sysSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 + X__sin6_src_id uint32 +} + +type sysInet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type sysIPv6Mtuinfo struct { + Addr sysSockaddrInet6 + Mtu uint32 +} + +type sysIPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type sysICMPv6Filter struct { + X__icmp6_filt [8]uint32 +} diff --git a/vendor/golang.org/x/net/netutil/listen.go b/vendor/golang.org/x/net/netutil/listen.go new file mode 100644 index 0000000000..b317ba2e6a --- /dev/null +++ b/vendor/golang.org/x/net/netutil/listen.go @@ -0,0 +1,48 @@ +// Copyright 2013 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 netutil provides network utility functions, complementing the more +// common ones in the net package. +package netutil // import "golang.org/x/net/netutil" + +import ( + "net" + "sync" +) + +// LimitListener returns a Listener that accepts at most n simultaneous +// connections from the provided Listener. +func LimitListener(l net.Listener, n int) net.Listener { + return &limitListener{l, make(chan struct{}, n)} +} + +type limitListener struct { + net.Listener + sem chan struct{} +} + +func (l *limitListener) acquire() { l.sem <- struct{}{} } +func (l *limitListener) release() { <-l.sem } + +func (l *limitListener) Accept() (net.Conn, error) { + l.acquire() + c, err := l.Listener.Accept() + if err != nil { + l.release() + return nil, err + } + return &limitListenerConn{Conn: c, release: l.release}, nil +} + +type limitListenerConn struct { + net.Conn + releaseOnce sync.Once + release func() +} + +func (l *limitListenerConn) Close() error { + err := l.Conn.Close() + l.releaseOnce.Do(l.release) + return err +} diff --git a/vendor/golang.org/x/net/netutil/listen_test.go b/vendor/golang.org/x/net/netutil/listen_test.go new file mode 100644 index 0000000000..c1a3d5527c --- /dev/null +++ b/vendor/golang.org/x/net/netutil/listen_test.go @@ -0,0 +1,101 @@ +// Copyright 2013 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 netutil + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "sync" + "sync/atomic" + "testing" + "time" + + "golang.org/x/net/internal/nettest" +) + +func TestLimitListener(t *testing.T) { + const max = 5 + attempts := (nettest.MaxOpenFiles() - max) / 2 + if attempts > 256 { // maximum length of accept queue is 128 by default + attempts = 256 + } + + l, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatal(err) + } + defer l.Close() + l = LimitListener(l, max) + + var open int32 + go http.Serve(l, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if n := atomic.AddInt32(&open, 1); n > max { + t.Errorf("%d open connections, want <= %d", n, max) + } + defer atomic.AddInt32(&open, -1) + time.Sleep(10 * time.Millisecond) + fmt.Fprint(w, "some body") + })) + + var wg sync.WaitGroup + var failed int32 + for i := 0; i < attempts; i++ { + wg.Add(1) + go func() { + defer wg.Done() + c := http.Client{Timeout: 3 * time.Second} + r, err := c.Get("http://" + l.Addr().String()) + if err != nil { + t.Log(err) + atomic.AddInt32(&failed, 1) + return + } + defer r.Body.Close() + io.Copy(ioutil.Discard, r.Body) + }() + } + wg.Wait() + + // We expect some Gets to fail as the kernel's accept queue is filled, + // but most should succeed. + if int(failed) >= attempts/2 { + t.Errorf("%d requests failed within %d attempts", failed, attempts) + } +} + +type errorListener struct { + net.Listener +} + +func (errorListener) Accept() (net.Conn, error) { + return nil, errFake +} + +var errFake = errors.New("fake error from errorListener") + +// This used to hang. +func TestLimitListenerError(t *testing.T) { + donec := make(chan bool, 1) + go func() { + const n = 2 + ll := LimitListener(errorListener{}, n) + for i := 0; i < n+1; i++ { + _, err := ll.Accept() + if err != errFake { + t.Fatalf("Accept error = %v; want errFake", err) + } + } + donec <- true + }() + select { + case <-donec: + case <-time.After(5 * time.Second): + t.Fatal("timeout. deadlock?") + } +} diff --git a/vendor/golang.org/x/net/proxy/direct.go b/vendor/golang.org/x/net/proxy/direct.go new file mode 100644 index 0000000000..4c5ad88b1e --- /dev/null +++ b/vendor/golang.org/x/net/proxy/direct.go @@ -0,0 +1,18 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package proxy + +import ( + "net" +) + +type direct struct{} + +// Direct is a direct proxy: one that makes network connections directly. +var Direct = direct{} + +func (direct) Dial(network, addr string) (net.Conn, error) { + return net.Dial(network, addr) +} diff --git a/vendor/golang.org/x/net/proxy/per_host.go b/vendor/golang.org/x/net/proxy/per_host.go new file mode 100644 index 0000000000..f540b196f7 --- /dev/null +++ b/vendor/golang.org/x/net/proxy/per_host.go @@ -0,0 +1,140 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package proxy + +import ( + "net" + "strings" +) + +// A PerHost directs connections to a default Dialer unless the hostname +// requested matches one of a number of exceptions. +type PerHost struct { + def, bypass Dialer + + bypassNetworks []*net.IPNet + bypassIPs []net.IP + bypassZones []string + bypassHosts []string +} + +// NewPerHost returns a PerHost Dialer that directs connections to either +// defaultDialer or bypass, depending on whether the connection matches one of +// the configured rules. +func NewPerHost(defaultDialer, bypass Dialer) *PerHost { + return &PerHost{ + def: defaultDialer, + bypass: bypass, + } +} + +// Dial connects to the address addr on the given network through either +// defaultDialer or bypass. +func (p *PerHost) Dial(network, addr string) (c net.Conn, err error) { + host, _, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + + return p.dialerForRequest(host).Dial(network, addr) +} + +func (p *PerHost) dialerForRequest(host string) Dialer { + if ip := net.ParseIP(host); ip != nil { + for _, net := range p.bypassNetworks { + if net.Contains(ip) { + return p.bypass + } + } + for _, bypassIP := range p.bypassIPs { + if bypassIP.Equal(ip) { + return p.bypass + } + } + return p.def + } + + for _, zone := range p.bypassZones { + if strings.HasSuffix(host, zone) { + return p.bypass + } + if host == zone[1:] { + // For a zone "example.com", we match "example.com" + // too. + return p.bypass + } + } + for _, bypassHost := range p.bypassHosts { + if bypassHost == host { + return p.bypass + } + } + return p.def +} + +// AddFromString parses a string that contains comma-separated values +// specifying hosts that should use the bypass proxy. Each value is either an +// IP address, a CIDR range, a zone (*.example.com) or a hostname +// (localhost). A best effort is made to parse the string and errors are +// ignored. +func (p *PerHost) AddFromString(s string) { + hosts := strings.Split(s, ",") + for _, host := range hosts { + host = strings.TrimSpace(host) + if len(host) == 0 { + continue + } + if strings.Contains(host, "/") { + // We assume that it's a CIDR address like 127.0.0.0/8 + if _, net, err := net.ParseCIDR(host); err == nil { + p.AddNetwork(net) + } + continue + } + if ip := net.ParseIP(host); ip != nil { + p.AddIP(ip) + continue + } + if strings.HasPrefix(host, "*.") { + p.AddZone(host[1:]) + continue + } + p.AddHost(host) + } +} + +// AddIP specifies an IP address that will use the bypass proxy. Note that +// this will only take effect if a literal IP address is dialed. A connection +// to a named host will never match an IP. +func (p *PerHost) AddIP(ip net.IP) { + p.bypassIPs = append(p.bypassIPs, ip) +} + +// AddNetwork specifies an IP range that will use the bypass proxy. Note that +// this will only take effect if a literal IP address is dialed. A connection +// to a named host will never match. +func (p *PerHost) AddNetwork(net *net.IPNet) { + p.bypassNetworks = append(p.bypassNetworks, net) +} + +// AddZone specifies a DNS suffix that will use the bypass proxy. A zone of +// "example.com" matches "example.com" and all of its subdomains. +func (p *PerHost) AddZone(zone string) { + if strings.HasSuffix(zone, ".") { + zone = zone[:len(zone)-1] + } + if !strings.HasPrefix(zone, ".") { + zone = "." + zone + } + p.bypassZones = append(p.bypassZones, zone) +} + +// AddHost specifies a hostname that will use the bypass proxy. +func (p *PerHost) AddHost(host string) { + if strings.HasSuffix(host, ".") { + host = host[:len(host)-1] + } + p.bypassHosts = append(p.bypassHosts, host) +} diff --git a/vendor/golang.org/x/net/proxy/per_host_test.go b/vendor/golang.org/x/net/proxy/per_host_test.go new file mode 100644 index 0000000000..a7d8095711 --- /dev/null +++ b/vendor/golang.org/x/net/proxy/per_host_test.go @@ -0,0 +1,55 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package proxy + +import ( + "errors" + "net" + "reflect" + "testing" +) + +type recordingProxy struct { + addrs []string +} + +func (r *recordingProxy) Dial(network, addr string) (net.Conn, error) { + r.addrs = append(r.addrs, addr) + return nil, errors.New("recordingProxy") +} + +func TestPerHost(t *testing.T) { + var def, bypass recordingProxy + perHost := NewPerHost(&def, &bypass) + perHost.AddFromString("localhost,*.zone,127.0.0.1,10.0.0.1/8,1000::/16") + + expectedDef := []string{ + "example.com:123", + "1.2.3.4:123", + "[1001::]:123", + } + expectedBypass := []string{ + "localhost:123", + "zone:123", + "foo.zone:123", + "127.0.0.1:123", + "10.1.2.3:123", + "[1000::]:123", + } + + for _, addr := range expectedDef { + perHost.Dial("tcp", addr) + } + for _, addr := range expectedBypass { + perHost.Dial("tcp", addr) + } + + if !reflect.DeepEqual(expectedDef, def.addrs) { + t.Errorf("Hosts which went to the default proxy didn't match. Got %v, want %v", def.addrs, expectedDef) + } + if !reflect.DeepEqual(expectedBypass, bypass.addrs) { + t.Errorf("Hosts which went to the bypass proxy didn't match. Got %v, want %v", bypass.addrs, expectedBypass) + } +} diff --git a/vendor/golang.org/x/net/proxy/proxy.go b/vendor/golang.org/x/net/proxy/proxy.go new file mode 100644 index 0000000000..78a8b7bee9 --- /dev/null +++ b/vendor/golang.org/x/net/proxy/proxy.go @@ -0,0 +1,94 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package proxy provides support for a variety of protocols to proxy network +// data. +package proxy // import "golang.org/x/net/proxy" + +import ( + "errors" + "net" + "net/url" + "os" +) + +// A Dialer is a means to establish a connection. +type Dialer interface { + // Dial connects to the given address via the proxy. + Dial(network, addr string) (c net.Conn, err error) +} + +// Auth contains authentication parameters that specific Dialers may require. +type Auth struct { + User, Password string +} + +// FromEnvironment returns the dialer specified by the proxy related variables in +// the environment. +func FromEnvironment() Dialer { + allProxy := os.Getenv("all_proxy") + if len(allProxy) == 0 { + return Direct + } + + proxyURL, err := url.Parse(allProxy) + if err != nil { + return Direct + } + proxy, err := FromURL(proxyURL, Direct) + if err != nil { + return Direct + } + + noProxy := os.Getenv("no_proxy") + if len(noProxy) == 0 { + return proxy + } + + perHost := NewPerHost(proxy, Direct) + perHost.AddFromString(noProxy) + return perHost +} + +// proxySchemes is a map from URL schemes to a function that creates a Dialer +// from a URL with such a scheme. +var proxySchemes map[string]func(*url.URL, Dialer) (Dialer, error) + +// RegisterDialerType takes a URL scheme and a function to generate Dialers from +// a URL with that scheme and a forwarding Dialer. Registered schemes are used +// by FromURL. +func RegisterDialerType(scheme string, f func(*url.URL, Dialer) (Dialer, error)) { + if proxySchemes == nil { + proxySchemes = make(map[string]func(*url.URL, Dialer) (Dialer, error)) + } + proxySchemes[scheme] = f +} + +// FromURL returns a Dialer given a URL specification and an underlying +// Dialer for it to make network requests. +func FromURL(u *url.URL, forward Dialer) (Dialer, error) { + var auth *Auth + if u.User != nil { + auth = new(Auth) + auth.User = u.User.Username() + if p, ok := u.User.Password(); ok { + auth.Password = p + } + } + + switch u.Scheme { + case "socks5": + return SOCKS5("tcp", u.Host, auth, forward) + } + + // If the scheme doesn't match any of the built-in schemes, see if it + // was registered by another package. + if proxySchemes != nil { + if f, ok := proxySchemes[u.Scheme]; ok { + return f(u, forward) + } + } + + return nil, errors.New("proxy: unknown scheme: " + u.Scheme) +} diff --git a/vendor/golang.org/x/net/proxy/proxy_test.go b/vendor/golang.org/x/net/proxy/proxy_test.go new file mode 100644 index 0000000000..c19a5c0635 --- /dev/null +++ b/vendor/golang.org/x/net/proxy/proxy_test.go @@ -0,0 +1,142 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package proxy + +import ( + "io" + "net" + "net/url" + "strconv" + "sync" + "testing" +) + +func TestFromURL(t *testing.T) { + endSystem, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatalf("net.Listen failed: %v", err) + } + defer endSystem.Close() + gateway, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatalf("net.Listen failed: %v", err) + } + defer gateway.Close() + + var wg sync.WaitGroup + wg.Add(1) + go socks5Gateway(t, gateway, endSystem, socks5Domain, &wg) + + url, err := url.Parse("socks5://user:password@" + gateway.Addr().String()) + if err != nil { + t.Fatalf("url.Parse failed: %v", err) + } + proxy, err := FromURL(url, Direct) + if err != nil { + t.Fatalf("FromURL failed: %v", err) + } + _, port, err := net.SplitHostPort(endSystem.Addr().String()) + if err != nil { + t.Fatalf("net.SplitHostPort failed: %v", err) + } + if c, err := proxy.Dial("tcp", "localhost:"+port); err != nil { + t.Fatalf("FromURL.Dial failed: %v", err) + } else { + c.Close() + } + + wg.Wait() +} + +func TestSOCKS5(t *testing.T) { + endSystem, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatalf("net.Listen failed: %v", err) + } + defer endSystem.Close() + gateway, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatalf("net.Listen failed: %v", err) + } + defer gateway.Close() + + var wg sync.WaitGroup + wg.Add(1) + go socks5Gateway(t, gateway, endSystem, socks5IP4, &wg) + + proxy, err := SOCKS5("tcp", gateway.Addr().String(), nil, Direct) + if err != nil { + t.Fatalf("SOCKS5 failed: %v", err) + } + if c, err := proxy.Dial("tcp", endSystem.Addr().String()); err != nil { + t.Fatalf("SOCKS5.Dial failed: %v", err) + } else { + c.Close() + } + + wg.Wait() +} + +func socks5Gateway(t *testing.T, gateway, endSystem net.Listener, typ byte, wg *sync.WaitGroup) { + defer wg.Done() + + c, err := gateway.Accept() + if err != nil { + t.Errorf("net.Listener.Accept failed: %v", err) + return + } + defer c.Close() + + b := make([]byte, 32) + var n int + if typ == socks5Domain { + n = 4 + } else { + n = 3 + } + if _, err := io.ReadFull(c, b[:n]); err != nil { + t.Errorf("io.ReadFull failed: %v", err) + return + } + if _, err := c.Write([]byte{socks5Version, socks5AuthNone}); err != nil { + t.Errorf("net.Conn.Write failed: %v", err) + return + } + if typ == socks5Domain { + n = 16 + } else { + n = 10 + } + if _, err := io.ReadFull(c, b[:n]); err != nil { + t.Errorf("io.ReadFull failed: %v", err) + return + } + if b[0] != socks5Version || b[1] != socks5Connect || b[2] != 0x00 || b[3] != typ { + t.Errorf("got an unexpected packet: %#02x %#02x %#02x %#02x", b[0], b[1], b[2], b[3]) + return + } + if typ == socks5Domain { + copy(b[:5], []byte{socks5Version, 0x00, 0x00, socks5Domain, 9}) + b = append(b, []byte("localhost")...) + } else { + copy(b[:4], []byte{socks5Version, 0x00, 0x00, socks5IP4}) + } + host, port, err := net.SplitHostPort(endSystem.Addr().String()) + if err != nil { + t.Errorf("net.SplitHostPort failed: %v", err) + return + } + b = append(b, []byte(net.ParseIP(host).To4())...) + p, err := strconv.Atoi(port) + if err != nil { + t.Errorf("strconv.Atoi failed: %v", err) + return + } + b = append(b, []byte{byte(p >> 8), byte(p)}...) + if _, err := c.Write(b); err != nil { + t.Errorf("net.Conn.Write failed: %v", err) + return + } +} diff --git a/vendor/golang.org/x/net/proxy/socks5.go b/vendor/golang.org/x/net/proxy/socks5.go new file mode 100644 index 0000000000..9b9628239a --- /dev/null +++ b/vendor/golang.org/x/net/proxy/socks5.go @@ -0,0 +1,210 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package proxy + +import ( + "errors" + "io" + "net" + "strconv" +) + +// SOCKS5 returns a Dialer that makes SOCKSv5 connections to the given address +// with an optional username and password. See RFC 1928. +func SOCKS5(network, addr string, auth *Auth, forward Dialer) (Dialer, error) { + s := &socks5{ + network: network, + addr: addr, + forward: forward, + } + if auth != nil { + s.user = auth.User + s.password = auth.Password + } + + return s, nil +} + +type socks5 struct { + user, password string + network, addr string + forward Dialer +} + +const socks5Version = 5 + +const ( + socks5AuthNone = 0 + socks5AuthPassword = 2 +) + +const socks5Connect = 1 + +const ( + socks5IP4 = 1 + socks5Domain = 3 + socks5IP6 = 4 +) + +var socks5Errors = []string{ + "", + "general failure", + "connection forbidden", + "network unreachable", + "host unreachable", + "connection refused", + "TTL expired", + "command not supported", + "address type not supported", +} + +// Dial connects to the address addr on the network net via the SOCKS5 proxy. +func (s *socks5) Dial(network, addr string) (net.Conn, error) { + switch network { + case "tcp", "tcp6", "tcp4": + default: + return nil, errors.New("proxy: no support for SOCKS5 proxy connections of type " + network) + } + + conn, err := s.forward.Dial(s.network, s.addr) + if err != nil { + return nil, err + } + closeConn := &conn + defer func() { + if closeConn != nil { + (*closeConn).Close() + } + }() + + host, portStr, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + + port, err := strconv.Atoi(portStr) + if err != nil { + return nil, errors.New("proxy: failed to parse port number: " + portStr) + } + if port < 1 || port > 0xffff { + return nil, errors.New("proxy: port number out of range: " + portStr) + } + + // the size here is just an estimate + buf := make([]byte, 0, 6+len(host)) + + buf = append(buf, socks5Version) + if len(s.user) > 0 && len(s.user) < 256 && len(s.password) < 256 { + buf = append(buf, 2 /* num auth methods */, socks5AuthNone, socks5AuthPassword) + } else { + buf = append(buf, 1 /* num auth methods */, socks5AuthNone) + } + + if _, err := conn.Write(buf); err != nil { + return nil, errors.New("proxy: failed to write greeting to SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + if _, err := io.ReadFull(conn, buf[:2]); err != nil { + return nil, errors.New("proxy: failed to read greeting from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + if buf[0] != 5 { + return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " has unexpected version " + strconv.Itoa(int(buf[0]))) + } + if buf[1] == 0xff { + return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " requires authentication") + } + + if buf[1] == socks5AuthPassword { + buf = buf[:0] + buf = append(buf, 1 /* password protocol version */) + buf = append(buf, uint8(len(s.user))) + buf = append(buf, s.user...) + buf = append(buf, uint8(len(s.password))) + buf = append(buf, s.password...) + + if _, err := conn.Write(buf); err != nil { + return nil, errors.New("proxy: failed to write authentication request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + if _, err := io.ReadFull(conn, buf[:2]); err != nil { + return nil, errors.New("proxy: failed to read authentication reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + if buf[1] != 0 { + return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " rejected username/password") + } + } + + buf = buf[:0] + buf = append(buf, socks5Version, socks5Connect, 0 /* reserved */) + + if ip := net.ParseIP(host); ip != nil { + if ip4 := ip.To4(); ip4 != nil { + buf = append(buf, socks5IP4) + ip = ip4 + } else { + buf = append(buf, socks5IP6) + } + buf = append(buf, ip...) + } else { + if len(host) > 255 { + return nil, errors.New("proxy: destination hostname too long: " + host) + } + buf = append(buf, socks5Domain) + buf = append(buf, byte(len(host))) + buf = append(buf, host...) + } + buf = append(buf, byte(port>>8), byte(port)) + + if _, err := conn.Write(buf); err != nil { + return nil, errors.New("proxy: failed to write connect request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + if _, err := io.ReadFull(conn, buf[:4]); err != nil { + return nil, errors.New("proxy: failed to read connect reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + failure := "unknown error" + if int(buf[1]) < len(socks5Errors) { + failure = socks5Errors[buf[1]] + } + + if len(failure) > 0 { + return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " failed to connect: " + failure) + } + + bytesToDiscard := 0 + switch buf[3] { + case socks5IP4: + bytesToDiscard = net.IPv4len + case socks5IP6: + bytesToDiscard = net.IPv6len + case socks5Domain: + _, err := io.ReadFull(conn, buf[:1]) + if err != nil { + return nil, errors.New("proxy: failed to read domain length from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + bytesToDiscard = int(buf[0]) + default: + return nil, errors.New("proxy: got unknown address type " + strconv.Itoa(int(buf[3])) + " from SOCKS5 proxy at " + s.addr) + } + + if cap(buf) < bytesToDiscard { + buf = make([]byte, bytesToDiscard) + } else { + buf = buf[:bytesToDiscard] + } + if _, err := io.ReadFull(conn, buf); err != nil { + return nil, errors.New("proxy: failed to read address from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + // Also need to discard the port number + if _, err := io.ReadFull(conn, buf[:2]); err != nil { + return nil, errors.New("proxy: failed to read port from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + } + + closeConn = nil + return conn, nil +} diff --git a/vendor/golang.org/x/net/publicsuffix/gen.go b/vendor/golang.org/x/net/publicsuffix/gen.go new file mode 100644 index 0000000000..5c8d7b5fb1 --- /dev/null +++ b/vendor/golang.org/x/net/publicsuffix/gen.go @@ -0,0 +1,663 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +package main + +// This program generates table.go and table_test.go. +// Invoke as: +// +// go run gen.go -version "xxx" >table.go +// go run gen.go -version "xxx" -test >table_test.go +// +// Pass -v to print verbose progress information. +// +// The version is derived from information found at +// https://github.com/publicsuffix/list/commits/master/public_suffix_list.dat +// +// To fetch a particular git revision, such as 5c70ccd250, pass +// -url "https://raw.githubusercontent.com/publicsuffix/list/5c70ccd250/public_suffix_list.dat" + +import ( + "bufio" + "bytes" + "flag" + "fmt" + "go/format" + "io" + "net/http" + "os" + "regexp" + "sort" + "strings" + + "golang.org/x/net/idna" +) + +const ( + // These sum of these four values must be no greater than 32. + nodesBitsChildren = 9 + nodesBitsICANN = 1 + nodesBitsTextOffset = 15 + nodesBitsTextLength = 6 + + // These sum of these four values must be no greater than 32. + childrenBitsWildcard = 1 + childrenBitsNodeType = 2 + childrenBitsHi = 14 + childrenBitsLo = 14 +) + +var ( + maxChildren int + maxTextOffset int + maxTextLength int + maxHi uint32 + maxLo uint32 +) + +func max(a, b int) int { + if a < b { + return b + } + return a +} + +func u32max(a, b uint32) uint32 { + if a < b { + return b + } + return a +} + +const ( + nodeTypeNormal = 0 + nodeTypeException = 1 + nodeTypeParentOnly = 2 + numNodeType = 3 +) + +func nodeTypeStr(n int) string { + switch n { + case nodeTypeNormal: + return "+" + case nodeTypeException: + return "!" + case nodeTypeParentOnly: + return "o" + } + panic("unreachable") +} + +var ( + labelEncoding = map[string]uint32{} + labelsList = []string{} + labelsMap = map[string]bool{} + rules = []string{} + + // validSuffix is used to check that the entries in the public suffix list + // are in canonical form (after Punycode encoding). Specifically, capital + // letters are not allowed. + validSuffix = regexp.MustCompile(`^[a-z0-9_\!\*\-\.]+$`) + + subset = flag.Bool("subset", false, "generate only a subset of the full table, for debugging") + url = flag.String("url", + "https://publicsuffix.org/list/effective_tld_names.dat", + "URL of the publicsuffix.org list. If empty, stdin is read instead") + v = flag.Bool("v", false, "verbose output (to stderr)") + version = flag.String("version", "", "the effective_tld_names.dat version") + test = flag.Bool("test", false, "generate table_test.go") +) + +func main() { + if err := main1(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func main1() error { + flag.Parse() + if nodesBitsTextLength+nodesBitsTextOffset+nodesBitsICANN+nodesBitsChildren > 32 { + return fmt.Errorf("not enough bits to encode the nodes table") + } + if childrenBitsLo+childrenBitsHi+childrenBitsNodeType+childrenBitsWildcard > 32 { + return fmt.Errorf("not enough bits to encode the children table") + } + if *version == "" { + return fmt.Errorf("-version was not specified") + } + var r io.Reader = os.Stdin + if *url != "" { + res, err := http.Get(*url) + if err != nil { + return err + } + if res.StatusCode != http.StatusOK { + return fmt.Errorf("bad GET status for %s: %d", *url, res.Status) + } + r = res.Body + defer res.Body.Close() + } + + var root node + icann := false + buf := new(bytes.Buffer) + br := bufio.NewReader(r) + for { + s, err := br.ReadString('\n') + if err != nil { + if err == io.EOF { + break + } + return err + } + s = strings.TrimSpace(s) + if strings.Contains(s, "BEGIN ICANN DOMAINS") { + icann = true + continue + } + if strings.Contains(s, "END ICANN DOMAINS") { + icann = false + continue + } + if s == "" || strings.HasPrefix(s, "//") { + continue + } + s, err = idna.ToASCII(s) + if err != nil { + return err + } + if !validSuffix.MatchString(s) { + return fmt.Errorf("bad publicsuffix.org list data: %q", s) + } + + if *subset { + switch { + case s == "ac.jp" || strings.HasSuffix(s, ".ac.jp"): + case s == "ak.us" || strings.HasSuffix(s, ".ak.us"): + case s == "ao" || strings.HasSuffix(s, ".ao"): + case s == "ar" || strings.HasSuffix(s, ".ar"): + case s == "arpa" || strings.HasSuffix(s, ".arpa"): + case s == "cy" || strings.HasSuffix(s, ".cy"): + case s == "dyndns.org" || strings.HasSuffix(s, ".dyndns.org"): + case s == "jp": + case s == "kobe.jp" || strings.HasSuffix(s, ".kobe.jp"): + case s == "kyoto.jp" || strings.HasSuffix(s, ".kyoto.jp"): + case s == "om" || strings.HasSuffix(s, ".om"): + case s == "uk" || strings.HasSuffix(s, ".uk"): + case s == "uk.com" || strings.HasSuffix(s, ".uk.com"): + case s == "tw" || strings.HasSuffix(s, ".tw"): + case s == "zw" || strings.HasSuffix(s, ".zw"): + case s == "xn--p1ai" || strings.HasSuffix(s, ".xn--p1ai"): + // xn--p1ai is Russian-Cyrillic "рф". + default: + continue + } + } + + rules = append(rules, s) + + nt, wildcard := nodeTypeNormal, false + switch { + case strings.HasPrefix(s, "*."): + s, nt = s[2:], nodeTypeParentOnly + wildcard = true + case strings.HasPrefix(s, "!"): + s, nt = s[1:], nodeTypeException + } + labels := strings.Split(s, ".") + for n, i := &root, len(labels)-1; i >= 0; i-- { + label := labels[i] + n = n.child(label) + if i == 0 { + if nt != nodeTypeParentOnly && n.nodeType == nodeTypeParentOnly { + n.nodeType = nt + } + n.icann = n.icann && icann + n.wildcard = n.wildcard || wildcard + } + labelsMap[label] = true + } + } + labelsList = make([]string, 0, len(labelsMap)) + for label := range labelsMap { + labelsList = append(labelsList, label) + } + sort.Strings(labelsList) + + p := printReal + if *test { + p = printTest + } + if err := p(buf, &root); err != nil { + return err + } + + b, err := format.Source(buf.Bytes()) + if err != nil { + return err + } + _, err = os.Stdout.Write(b) + return err +} + +func printTest(w io.Writer, n *node) error { + fmt.Fprintf(w, "// generated by go run gen.go; DO NOT EDIT\n\n") + fmt.Fprintf(w, "package publicsuffix\n\nvar rules = [...]string{\n") + for _, rule := range rules { + fmt.Fprintf(w, "%q,\n", rule) + } + fmt.Fprintf(w, "}\n\nvar nodeLabels = [...]string{\n") + if err := n.walk(w, printNodeLabel); err != nil { + return err + } + fmt.Fprintf(w, "}\n") + return nil +} + +func printReal(w io.Writer, n *node) error { + const header = `// generated by go run gen.go; DO NOT EDIT + +package publicsuffix + +const version = %q + +const ( + nodesBitsChildren = %d + nodesBitsICANN = %d + nodesBitsTextOffset = %d + nodesBitsTextLength = %d + + childrenBitsWildcard = %d + childrenBitsNodeType = %d + childrenBitsHi = %d + childrenBitsLo = %d +) + +const ( + nodeTypeNormal = %d + nodeTypeException = %d + nodeTypeParentOnly = %d +) + +// numTLD is the number of top level domains. +const numTLD = %d + +` + fmt.Fprintf(w, header, *version, + nodesBitsChildren, nodesBitsICANN, nodesBitsTextOffset, nodesBitsTextLength, + childrenBitsWildcard, childrenBitsNodeType, childrenBitsHi, childrenBitsLo, + nodeTypeNormal, nodeTypeException, nodeTypeParentOnly, len(n.children)) + + text := combineText(labelsList) + if text == "" { + return fmt.Errorf("internal error: makeText returned no text") + } + for _, label := range labelsList { + offset, length := strings.Index(text, label), len(label) + if offset < 0 { + return fmt.Errorf("internal error: could not find %q in text %q", label, text) + } + maxTextOffset, maxTextLength = max(maxTextOffset, offset), max(maxTextLength, length) + if offset >= 1<= 1< 64 { + n, plus = 64, " +" + } + fmt.Fprintf(w, "%q%s\n", text[:n], plus) + text = text[n:] + } + + if err := n.walk(w, assignIndexes); err != nil { + return err + } + + fmt.Fprintf(w, ` + +// 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 +// the children array), ICANN bit and text. +// +// In the //-comment after each node's data, the nodes indexes of the children +// are formatted as (n0x1234-n0x1256), with * denoting the wildcard bit. The +// nodeType is printed as + for normal, ! for exception, and o for parent-only +// nodes that have children but don't match a domain label in their own right. +// An I denotes an ICANN domain. +// +// The layout within the uint32, from MSB to LSB, is: +// [%2d bits] unused +// [%2d bits] children index +// [%2d bits] ICANN bit +// [%2d bits] text index +// [%2d bits] text length +var nodes = [...]uint32{ +`, + 32-nodesBitsChildren-nodesBitsICANN-nodesBitsTextOffset-nodesBitsTextLength, + nodesBitsChildren, nodesBitsICANN, nodesBitsTextOffset, nodesBitsTextLength) + if err := n.walk(w, printNode); err != nil { + return err + } + fmt.Fprintf(w, `} + +// children is the list of nodes' children, the parent's wildcard bit and the +// parent's node type. If a node has no children then their children index +// will be in the range [0, 6), depending on the wildcard bit and node type. +// +// The layout within the uint32, from MSB to LSB, is: +// [%2d bits] unused +// [%2d bits] wildcard bit +// [%2d bits] node type +// [%2d bits] high nodes index (exclusive) of children +// [%2d bits] low nodes index (inclusive) of children +var children=[...]uint32{ +`, + 32-childrenBitsWildcard-childrenBitsNodeType-childrenBitsHi-childrenBitsLo, + childrenBitsWildcard, childrenBitsNodeType, childrenBitsHi, childrenBitsLo) + for i, c := range childrenEncoding { + s := "---------------" + lo := c & (1<> childrenBitsLo) & (1<>(childrenBitsLo+childrenBitsHi)) & (1<>(childrenBitsLo+childrenBitsHi+childrenBitsNodeType) != 0 + fmt.Fprintf(w, "0x%08x, // c0x%04x (%s)%s %s\n", + c, i, s, wildcardStr(wildcard), nodeTypeStr(nodeType)) + } + fmt.Fprintf(w, "}\n\n") + fmt.Fprintf(w, "// max children %d (capacity %d)\n", maxChildren, 1<= 1<= 1<= 1< 0 && ss[0] == "" { + ss = ss[1:] + } + return ss +} + +// crush combines a list of strings, taking advantage of overlaps. It returns a +// single string that contains each input string as a substring. +func crush(ss []string) string { + maxLabelLen := 0 + for _, s := range ss { + if maxLabelLen < len(s) { + maxLabelLen = len(s) + } + } + + for prefixLen := maxLabelLen; prefixLen > 0; prefixLen-- { + prefixes := makePrefixMap(ss, prefixLen) + for i, s := range ss { + if len(s) <= prefixLen { + continue + } + mergeLabel(ss, i, prefixLen, prefixes) + } + } + + return strings.Join(ss, "") +} + +// mergeLabel merges the label at ss[i] with the first available matching label +// in prefixMap, where the last "prefixLen" characters in ss[i] match the first +// "prefixLen" characters in the matching label. +// It will merge ss[i] repeatedly until no more matches are available. +// All matching labels merged into ss[i] are replaced by "". +func mergeLabel(ss []string, i, prefixLen int, prefixes prefixMap) { + s := ss[i] + suffix := s[len(s)-prefixLen:] + for _, j := range prefixes[suffix] { + // Empty strings mean "already used." Also avoid merging with self. + if ss[j] == "" || i == j { + continue + } + if *v { + fmt.Fprintf(os.Stderr, "%d-length overlap at (%4d,%4d): %q and %q share %q\n", + prefixLen, i, j, ss[i], ss[j], suffix) + } + ss[i] += ss[j][prefixLen:] + ss[j] = "" + // ss[i] has a new suffix, so merge again if possible. + // Note: we only have to merge again at the same prefix length. Shorter + // prefix lengths will be handled in the next iteration of crush's for loop. + // Can there be matches for longer prefix lengths, introduced by the merge? + // I believe that any such matches would by necessity have been eliminated + // during substring removal or merged at a higher prefix length. For + // instance, in crush("abc", "cde", "bcdef"), combining "abc" and "cde" + // would yield "abcde", which could be merged with "bcdef." However, in + // practice "cde" would already have been elimintated by removeSubstrings. + mergeLabel(ss, i, prefixLen, prefixes) + return + } +} + +// prefixMap maps from a prefix to a list of strings containing that prefix. The +// list of strings is represented as indexes into a slice of strings stored +// elsewhere. +type prefixMap map[string][]int + +// makePrefixMap constructs a prefixMap from a slice of strings. +func makePrefixMap(ss []string, prefixLen int) prefixMap { + prefixes := make(prefixMap) + for i, s := range ss { + // We use < rather than <= because if a label matches on a prefix equal to + // its full length, that's actually a substring match handled by + // removeSubstrings. + if prefixLen < len(s) { + prefix := s[:prefixLen] + prefixes[prefix] = append(prefixes[prefix], i) + } + } + + return prefixes +} diff --git a/vendor/golang.org/x/net/publicsuffix/list.go b/vendor/golang.org/x/net/publicsuffix/list.go new file mode 100644 index 0000000000..9419ca9923 --- /dev/null +++ b/vendor/golang.org/x/net/publicsuffix/list.go @@ -0,0 +1,133 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package publicsuffix provides a public suffix list based on data from +// http://publicsuffix.org/. A public suffix is one under which Internet users +// can directly register names. +package publicsuffix // import "golang.org/x/net/publicsuffix" + +// TODO: specify case sensitivity and leading/trailing dot behavior for +// func PublicSuffix and func EffectiveTLDPlusOne. + +import ( + "fmt" + "net/http/cookiejar" + "strings" +) + +// List implements the cookiejar.PublicSuffixList interface by calling the +// PublicSuffix function. +var List cookiejar.PublicSuffixList = list{} + +type list struct{} + +func (list) PublicSuffix(domain string) string { + ps, _ := PublicSuffix(domain) + return ps +} + +func (list) String() string { + return version +} + +// PublicSuffix returns the public suffix of the domain using a copy of the +// publicsuffix.org database compiled into the library. +// +// icann is whether the public suffix is managed by the Internet Corporation +// for Assigned Names and Numbers. If not, the public suffix is privately +// managed. For example, foo.org and foo.co.uk are ICANN domains, +// foo.dyndns.org and foo.blogspot.co.uk are private domains. +// +// Use cases for distinguishing ICANN domains like foo.com from private +// domains like foo.appspot.com can be found at +// https://wiki.mozilla.org/Public_Suffix_List/Use_Cases +func PublicSuffix(domain string) (publicSuffix string, icann bool) { + lo, hi := uint32(0), uint32(numTLD) + s, suffix, wildcard := domain, len(domain), false +loop: + for { + dot := strings.LastIndex(s, ".") + if wildcard { + suffix = 1 + dot + } + if lo == hi { + break + } + f := find(s[1+dot:], lo, hi) + if f == notFound { + break + } + + u := nodes[f] >> (nodesBitsTextOffset + nodesBitsTextLength) + icann = u&(1<>= nodesBitsICANN + u = children[u&(1<>= childrenBitsLo + hi = u & (1<>= childrenBitsHi + switch u & (1<>= childrenBitsNodeType + wildcard = u&(1<>= nodesBitsTextLength + offset := x & (1< len(b[j]) +} + +// eTLDPlusOneTestCases come from +// https://github.com/publicsuffix/list/blob/master/tests/test_psl.txt +var eTLDPlusOneTestCases = []struct { + domain, want string +}{ + // Empty input. + {"", ""}, + // Unlisted TLD. + {"example", ""}, + {"example.example", "example.example"}, + {"b.example.example", "example.example"}, + {"a.b.example.example", "example.example"}, + // TLD with only 1 rule. + {"biz", ""}, + {"domain.biz", "domain.biz"}, + {"b.domain.biz", "domain.biz"}, + {"a.b.domain.biz", "domain.biz"}, + // TLD with some 2-level rules. + {"com", ""}, + {"example.com", "example.com"}, + {"b.example.com", "example.com"}, + {"a.b.example.com", "example.com"}, + {"uk.com", ""}, + {"example.uk.com", "example.uk.com"}, + {"b.example.uk.com", "example.uk.com"}, + {"a.b.example.uk.com", "example.uk.com"}, + {"test.ac", "test.ac"}, + // TLD with only 1 (wildcard) rule. + {"mm", ""}, + {"c.mm", ""}, + {"b.c.mm", "b.c.mm"}, + {"a.b.c.mm", "b.c.mm"}, + // More complex TLD. + {"jp", ""}, + {"test.jp", "test.jp"}, + {"www.test.jp", "test.jp"}, + {"ac.jp", ""}, + {"test.ac.jp", "test.ac.jp"}, + {"www.test.ac.jp", "test.ac.jp"}, + {"kyoto.jp", ""}, + {"test.kyoto.jp", "test.kyoto.jp"}, + {"ide.kyoto.jp", ""}, + {"b.ide.kyoto.jp", "b.ide.kyoto.jp"}, + {"a.b.ide.kyoto.jp", "b.ide.kyoto.jp"}, + {"c.kobe.jp", ""}, + {"b.c.kobe.jp", "b.c.kobe.jp"}, + {"a.b.c.kobe.jp", "b.c.kobe.jp"}, + {"city.kobe.jp", "city.kobe.jp"}, + {"www.city.kobe.jp", "city.kobe.jp"}, + // TLD with a wildcard rule and exceptions. + {"ck", ""}, + {"test.ck", ""}, + {"b.test.ck", "b.test.ck"}, + {"a.b.test.ck", "b.test.ck"}, + {"www.ck", "www.ck"}, + {"www.www.ck", "www.ck"}, + // US K12. + {"us", ""}, + {"test.us", "test.us"}, + {"www.test.us", "test.us"}, + {"ak.us", ""}, + {"test.ak.us", "test.ak.us"}, + {"www.test.ak.us", "test.ak.us"}, + {"k12.ak.us", ""}, + {"test.k12.ak.us", "test.k12.ak.us"}, + {"www.test.k12.ak.us", "test.k12.ak.us"}, + // Punycoded IDN labels + {"xn--85x722f.com.cn", "xn--85x722f.com.cn"}, + {"xn--85x722f.xn--55qx5d.cn", "xn--85x722f.xn--55qx5d.cn"}, + {"www.xn--85x722f.xn--55qx5d.cn", "xn--85x722f.xn--55qx5d.cn"}, + {"shishi.xn--55qx5d.cn", "shishi.xn--55qx5d.cn"}, + {"xn--55qx5d.cn", ""}, + {"xn--85x722f.xn--fiqs8s", "xn--85x722f.xn--fiqs8s"}, + {"www.xn--85x722f.xn--fiqs8s", "xn--85x722f.xn--fiqs8s"}, + {"shishi.xn--fiqs8s", "shishi.xn--fiqs8s"}, + {"xn--fiqs8s", ""}, +} + +func TestEffectiveTLDPlusOne(t *testing.T) { + for _, tc := range eTLDPlusOneTestCases { + got, _ := EffectiveTLDPlusOne(tc.domain) + if got != tc.want { + t.Errorf("%q: got %q, want %q", tc.domain, got, tc.want) + } + } +} diff --git a/vendor/golang.org/x/net/publicsuffix/table.go b/vendor/golang.org/x/net/publicsuffix/table.go new file mode 100644 index 0000000000..ebcb13952c --- /dev/null +++ b/vendor/golang.org/x/net/publicsuffix/table.go @@ -0,0 +1,8786 @@ +// generated by go run gen.go; DO NOT EDIT + +package publicsuffix + +const version = "publicsuffix.org's public_suffix_list.dat, git revision bade64c (2016-03-01)" + +const ( + nodesBitsChildren = 9 + nodesBitsICANN = 1 + nodesBitsTextOffset = 15 + nodesBitsTextLength = 6 + + childrenBitsWildcard = 1 + childrenBitsNodeType = 2 + childrenBitsHi = 14 + childrenBitsLo = 14 +) + +const ( + nodeTypeNormal = 0 + nodeTypeException = 1 + nodeTypeParentOnly = 2 +) + +// numTLD is the number of top level domains. +const numTLD = 1545 + +// Text is the combined text of all labels. +const text = "bievatmallorcadaquesanfranciscotlandupontarioceanographiquebifuk" + + "agawalmartateshinanomachintaijinuyamanouchikuhokuryugasakitashio" + + "barabihorologyusuharabikedagestangebilbaogakievenesangoddabillus" + + "trationikkoebenhavnikolaeverbankashiwarabiomutashinainvestmentsa" + + "njotateyamabirdartcenterprisesakikonaircraftraeumtgeradealstahau" + + "gesundurbanamexeterbirkenesoddtangenovaravennaharimalvikashiwaza" + + "kiyokawarabirthplacebjarkoyusuisservicesannanikonantanangerbjerk" + + "reimmobilieninohelplfinancialipetskasukabedzin-the-bandaioiraseb" + + "astopologyeongnamegawakembuchikumagayagawakkanaibetsubamericanfa" + + "milydscloudappspotenzachpomorskienebakkeshibechambagriculturenne" + + "budapest-a-la-masioninomiyakonojoshkar-olayangroupaleostrowiecar" + + "toonartdecoffeedbackasumigaurawa-mazowszextraspace-to-rentalstom" + + "akomaibarabjugnirasakis-a-candidateblockbusternidurhamburgliwice" + + "bloombergbauernrtatsunostrowwlkpmglobalashovhachinoheguris-a-cat" + + "ererbluedatingloboehringerikebmoattachmentsannohelsinkitahiroshi" + + "marshallstatebankasuyakutiabmsanokaszubyuudmurtiabmwegroweibolza" + + "nore-og-uvdalivornobnpparibaselburglogoweirbomloansantabarbarabo" + + "ndvrdnsantacruzsantafedexhibitionishiazais-a-celticsfanishigotpa" + + "ntheonishiharabonnishiizunazukis-a-chefarsundwgloppenzaogashimad" + + "achicagobododgemologicallyngenglandyndns-homednsanukis-a-conserv" + + "ativefsncfailomzansimagicasadelamonedavvesiidazaifudaigodoesntex" + + "istanbullensakerbookingmbhartiffanynysafetysfjordyndns-ip6bootsa" + + "otomeldalorenskogminakamichigangwonishikatakazakis-a-cpadoval-da" + + "ostavalleyuzawaboschaefflerdalotenkawabostikatowicebostonakijins" + + "ekikogentingmodenakasatsunairtrafficaseihichisobetsuitairabotani" + + "calgardenishikatsuragithubusercontentattoolsztynsettlersapodhale" + + "vangerbotanicgardenishikawazukanazawabotanyuzhno-sakhalinskatsus" + + "hikabeeldengeluidyndns-mailotteboutiquebecngmxboxenapponazure-mo" + + "bilebozentsujiiebradescorporationishimerabrandywinevalleybrasilj" + + "an-mayenishinomiyashironobresciabrindisibenikebristolgalsacebrit" + + "ishcolumbialowiezagannakadomari-elasticbeanstalkatsuyamasfjorden" + + "ishinoomotegotsukisosakitagatakamatsukawabroadcastlebtimnetzgora" + + "broadwaybroke-itaxihuanishinoshimatta-varjjatgorybrokerrypropert" + + "iesapporobronnoysundyndns-office-on-the-webcambridgestonewspaper" + + "brothermesaverdefensejnybrumunddalottokigawabrunelblagdenesnaase" + + "ralingenkainanaejrietisalatinabenogatachikawakayamagadancebetsuk" + + "ubabia-goracleaningatlantagajobojis-a-cubicle-slavellinowtvallea" + + "ostavernishiokoppegardyndns-picsaratovalled-aostavropolicebrusse" + + "lsardegnamsskoganeis-a-democratjeldsundyndns-remotegildeskalmyki" + + "abruxellesardiniabryanskjakdnepropetrovskiervaapsteiermarkaufeni" + + "shitosashimizunaminamiashigarabryneustarhubalestrandabergamoarek" + + "ehimejibestadishakotankarmoyokozembroideryomitanobninskarpaczela" + + "dz-1buskerudinewhampshirechtrainingretakamoriokamchatkameokameya" + + "mashinatsukigatakanabeatsarlouvrepairbusantiquest-a-la-maisondre" + + "-landebusinessebykleclercasertaishinomakikuchikuseikarugapartmen" + + "tsarpsborgrimstadyndns-serverbaniabuzenishiwakis-a-designerbuzzg" + + "orzeleccollegersundyndns-weberlincolnissandnessjoenissayokoshiba" + + "hikariwanumataketomisatokuyamatteledatabaseballooningripebwfashi" + + "onissedalovegaskimitsubatamicabbottjmaxxxfinitybzhitomirkutskjer" + + "voyagecloudfunctionsaudacntkmaxxn--11b4c3dcolognewmexicoldwarmia" + + "miastaplesauheradcolonialwilliamsburguideventsavannahgacoloradop" + + "lateaudiocolumbusheycommunitysnesaves-the-whalessandria-trani-ba" + + "rletta-andriatranibarlettaandriacomobaracomparemarkerryhotelsavo" + + "naplesaxocompute-1computerhistoryofscience-fictioncomsecuritysva" + + "rdoharuhrcondoshichinohedmarkhangelskypescaravantaaconferencecon" + + "structionconsuladollsbschokoladenconsultanthropologyconsultingvo" + + "llutskddielddanuorrikuzentakatajirissagaeroclubmedecincinnationw" + + "idealerimo-i-ranadexchangeiseiyoichiropracticbcn-north-1contactm" + + "palmspringsakercontemporaryarteducationalchikugojomedicaltanisse" + + "ttaiwanairguardcontractorskenconventureshinodesashibetsuikimobet" + + "suliguriacookingchannelveruminamibosogndaluxembourguitarscholars" + + "hipschooluxurycoolkuszgradcoopocznorthwesternmutualuzerncopenhag" + + "encyclopedicdn77-sslattumetlifeinsurancecorsicagliaridagawarszaw" + + "ashingtondclkfhskhabarovskhakassiacorvettemasekharkivguccipriani" + + "igataitogitsuldalvivano-frankivskharkovalledaostakkofuelcosenzam" + + "amibuilderschulexuslivinghistorycostumedio-campidano-mediocampid" + + "anomediocouncilcouponschwarzgwangjuifminamidaitomangotembaixadac" + + "ourseschweizippodlasiellakasamatsudovre-eikercq-acranbrookuwanal" + + "yticsciencecentersciencehistorycreditcardcreditunioncremonashoro" + + "kanaiecrewiiheyaizuwakamatsubushikusakadogawacricketrzyncrimeacr" + + "otonewportlligatewaycrowncrscientistor-elvdalcruisescjohnsoncuis" + + "inellajollamericanexpressexyzjcbnlculturalcentertainmentoyokawac" + + "uneocupcakecxn--1ck2e1balsanagochihayaakasakawaharaumakeupowiath" + + "letajimabariakepnordkappgjesdalillyonabaruconnectarnobrzegjovika" + + "ruizawaugustowadaegubs3-ap-southeast-2cymruovatoyonakagyokutoshi" + + "macyouthdfcbankhersonfilateliafilminamiechizenfinalfinancefinear" + + "tsettsurfastlyfinlandfinnoyfirebaseappamperedchefauskedsmokorset" + + "agayaseljordfirenzefirestonextdirectoryfirmdalegoldpointelligenc" + + "efishingolfbsbxn--1ctwolominamatamayukis-a-geekhmelnitskiyamashi" + + "kefitjarqhachiojiyahikobeautydalfitnessettlementoyookarasjohkami" + + "noyamatsuris-a-greenfjalerflickragerotikaluganskhmelnytskyivalle" + + "e-aosteroyflightsevastopolezajskhvalleeaosteigenflirumansionseve" + + "nassisicilyfloguchikuzenfloraflorencefloridafloristanohatakaharu" + + "ssiafloromskoguovdageaidnulminamifuranoflowersewildlifestyleflsm" + + "idthruhereggio-emilia-romagnakanotoddenflynnhubalsfjordiskstatio" + + "naustdalimanowarudaukraanghke164fndfolldalfoodnetworkangerfor-be" + + "tter-thandafor-ourfor-somedizinhistorischesfranziskanerimamatera" + + "mochizukirafor-theaterforexrothachirogatakanezawaforgotdnshangri" + + "langevagrarboretumbriaforli-cesena-forlicesenaforlikes-piedmontb" + + "lancomeeresharis-a-gurulsandoyforsaleikangerforsandasuolodingenf" + + "ortmissoulan-udell-ogliastrakhanawawilliamhillfortworthadanotoga" + + "waforuminamiiselectoyosatotalfosnesharpanamafotoyotaris-a-hard-w" + + "orkerfoxn--1lqs03nfreiburgushikamifuranotaireshawaiijimarylandfr" + + "eightcmwinbaltimore-og-romsdalimitedunetflixilimoliserniaurskog-" + + "holandroverhalla-speziaetnagahamaroygardendoftheinternetcimdbala" + + "tinordre-landds3-ap-northeast-2freseniusdecorativeartshellaspezi" + + "afribourgxn--1lqs71dfriuli-v-giuliafriuli-ve-giuliafriuli-vegiul" + + "iafriuli-venezia-giuliafriuli-veneziagiuliafriuli-vgiuliafriuliv" + + "-giuliafriulive-giuliafriulivegiuliafriulivenezia-giuliafriulive" + + "neziagiuliafriulivgiuliafrlfroganshimokawafrognfrolandfrom-akreh" + + "amnfrom-alfrom-arfrom-azlgzpanasonicheltenham-radio-operaunitele" + + "markautokeinofrom-canonoichikawamisatodayfrom-collectionfrom-cto" + + "yotomiyazakis-a-hunterfrom-dchelyabinskodjeffersonisshinguernsey" + + "from-dellogliastraderfrom-flandershimokitayamafrom-gaulardalfrom" + + "-higashiagatsumagoirmitakeharafrom-iafrom-idfrom-ilfrom-incheonf" + + "rom-kshimonitayanagivestbytomaritimekeepingfrom-kyknetoyotsukaid" + + "ownloadfrom-lanbibaidarfrom-manxn--1qqw23afrom-mdfrom-meetoyoura" + + "from-microsoftbanklabudhabikinokawabarthadselfipirangafrom-mnfro" + + "m-modalenfrom-mshimonosekikawafrom-mtnfrom-nchernigovernmentjome" + + "morialucaniafrom-ndfrom-nexusgardenfrom-nhktoystre-slidrettozawa" + + "from-njcparaglidingfrom-nminamiizukamitondabayashiogamagoriziafr" + + "om-nvanylvenicefrom-nyfrom-ohkurafrom-oketogurafrom-orfrom-pader" + + "bornfrom-pratohmaoris-a-knightozsdefrom-ris-a-landscaperugiafrom" + + "-schoenbrunnfrom-sdnipropetrovskmpspbambleborkarumaifarmsteadivt" + + "asvuodnakaiwamizawaustevollavangenativeamericanantiques3-eu-cent" + + "ral-1from-tnfrom-txn--2m4a15efrom-utazuerichardlikescandyndns-at" + + "-homedepotaruis-a-lawyerfrom-vadsochildrensgardenfrom-vtranbyfro" + + "m-wafrom-wielunnerfrom-wvaolbia-tempio-olbiatempioolbialystokkem" + + "erovodkagoshimaintenancefrom-wyfrosinonefrostalowa-wolawafroyaha" + + "badajozorahkkeravjudygarlandfstcgrouparisor-fronfujiiderafujikaw" + + "aguchikonefujiminohtawaramotoineppugliafujinomiyadafujiokayamarb" + + "urgfujisatoshonairportland-4-salernogiessengerdalaskanittedallas" + + "alleaseeklogesquarezzoologyfujisawafujishiroishidakabiratoridelm" + + "enhorstalbanshimosuwalkis-a-liberalfujitsurugashimarinefujixerox" + + "n--30rr7yfujiyoshidafukayabeardubaiduckdnsdojoburgfukuchiyamadaf" + + "ukudominichernihivanovosibirskydivingrondarfukuis-a-libertarianf" + + "ukumitsubishigakirkeneshimotsukefukuokazakirovogradoyfukuroishik" + + "arikaturindalfukusakiryuohaebaruminamimakis-a-linux-useranishiar" + + "itabashikaoizumizakitaurayasudafukuyamagatakahashimamakisarazure" + + "websiteshikagamiishibukawafunabashiriuchinadafunagatakahatakaish" + + "imoichinosekigaharafunahashikamiamakusatsumasendaisennangonoheji" + + "s-a-llamarylhursteinkjerusalembetsukuis-a-musicianfundaciofuoisk" + + "ujukuriyamarcheaparliamentrani-andria-barletta-trani-andriafuoss" + + "koczowindmillfurnitureggiocalabriafurubiraquarelleasingleshimots" + + "umafurudonostiafurukawairtelecityeatshinichinanfusodegaurafussai" + + "kishiwadafutabayamaguchinomigawafutboldlygoingnowhere-for-morego" + + "ntrailroadfuttsurugiminamiminowafvgfyis-a-nascarfanfylkesbiblack" + + "fridayfyresdalhannovareserveftparocherkasyzrankoshigayaltaikis-a" + + "-painteractivegarsheis-a-patsfanhanyuzenhapmirhappoulvikokonoeha" + + "reidsbergenharstadharvestcelebrationhasamarahasaminami-alpssells" + + "-for-unzenhashbanghasudahasvikolobrzegyptianpachigasakidsmynaspe" + + "rschlesischesurancehatogayahoooshikamaishimofusartshinkamigotoyo" + + "hashimotomobellunordreisa-geekomaganehatoyamazakitahatakaokamiki" + + "tayamatotakadahatsukaichiharahattfjelldalhayashimamotobuildingha" + + "zuminobusells-itraniandriabarlettatraniandriahbofagehembygdsforb" + + "undhemneshinshinotsurgeonshalloffamelhustkamisunagawahemsedalher" + + "okussldheroyhgtvarggatranoyhigashichichibungotakadatsunanjoetsuw" + + "anouchikujogaszkoladbrokesennumamurogawalterhigashihiroshimanehi" + + "gashiizumozakitakamiizumisanofiatransportrapaniimimatakatoris-a-" + + "personaltrainerhigashikagawahigashikagurasoedahigashikawakitaaik" + + "itakatakarazukamikoaniikappulawyhigashikurumeguroroskoleirvikoma" + + "kiyosatokamachippubetsubetsugaruhigashimatsushimarugame-hostingh" + + "igashimatsuyamakitaakitadaitoigawahigashimurayamalatvuopmidoris-" + + "a-photographerokuapparshinshirohigashinarusellsyourhomegoodshint" + + "okushimahigashinehigashiomihachimanchesterhigashiosakasayamamoto" + + "rcycleshintomikasaharahigashishirakawamatakasagooglecodespotrave" + + "lchannelhigashisumiyoshikawaminamiaikitakyushuaiahigashitsunowru" + + "zhgorodoyhigashiurausukitamidsundhigashiyamatokoriyamanakakogawa" + + "higashiyodogawahigashiyoshinogaris-a-playerhiraizumisatohnoshooh" + + "irakatashinagawahiranais-a-republicancerresearchaeologicaliforni" + + "ahirarahiratsukagawahirayaitakasakitamotosumitakaginankokubunjis" + + "-a-rockstarachowicehisayamanashiibaghdadultravelersinsurancehist" + + "orichouseshinyoshitomiokaniepcehitachiomiyaginowaniihamatamakawa" + + "jimaritimodellinghitachiotagopartis-a-socialistmeindianapolis-a-" + + "bloggerhitoyoshimifunehitradinghjartdalhjelmelandholeckobierzyce" + + "holidayhomeipartnershiojirishirifujiedahomelinuxn--32vp30hagebos" + + "tadhomesensembokukitanakagusukumoduminamiogunicomcastresistanceh" + + "omeunixn--3bst00minamisanrikubetsupplyhondahonefosshioyameloyali" + + "stockholmestrandhoneywellhongorgehonjyoitakashimarumorimachidaho" + + "rnindalhorseminehortendofinternetrdhoteleshirahamatonbetsurgeryh" + + "otmailhoyangerhoylandetroitskomatsushimashikiyosemitehumanitiesh" + + "irakoenighurdalhurumajis-a-soxfanhyllestadhyogoris-a-studentalhy" + + "ugawarahyundaiwafunejgorajlchitachinakagawatchandclockazimierz-d" + + "olnyjlljmpartshishikuis-an-actorjnjelenia-gorajoyokaichibahcavuo" + + "tnagaraholtalenjpmorganichitosetogakushimotoganewjerseyjpnchloej" + + "prshisognejuniperjurkristiansandcatshisuifuettertdasnetzwindowsh" + + "itaramakristiansundkrodsheradkrokstadelvaldaostarostwodzislawinn" + + "ershizukuishimogosenkryminamitanekumatorinokumejimasudakumenanyo" + + "kkaichirurgiens-dentisteshizuokanoyakagekunisakis-an-entertainer" + + "kunitachiarailwaykunitomigusukumamotoyamassa-carrara-massacarrar" + + "amassabunkyonanaoshimageandsoundandvisionkunneppupartykunstsamml" + + "ungkunstunddesignkuokgroupasadenamsosnowiechocolatelevisionrwhal" + + "ingrongausdaluccapebretonamiasakuchinotsuchiurakawassamukawatari" + + "cohdavvenjargamvikazokureitrentino-stirolkurgankurobelaudiblebes" + + "byglandkurogimilitarykuroisoftwarendalenugkuromatsunais-bykurota" + + "kikawasakis-certifiedekakegawakurskomonokushirogawakustanais-fou" + + "ndationkusupersportrentino-sud-tirolkutchanelkutnokuzbassnillfjo" + + "rdkuzumakis-gonekvafjordkvalsundkvamlidlugolekagaminord-aurdalvd" + + "alipayufuchukotkafjordkvanangenkvinesdalkvinnheradkviteseidskogk" + + "vitsoykwpspjelkavikomorotsukamishihoronobeokaminokawanishiaizuba" + + "ngekyotobetsupplieshoujis-into-animeiwamaseratis-a-therapistoiak" + + "yowariasahikawamishimatsumotofukemissileksvikongsbergmisugitokon" + + "amegatakayamatsunomitourismolanciamitoyoakemiuramiyazumiyotamano" + + "mjondalenmlbarclaycards3-us-west-1monmouthaibarakitagawamonsterm" + + "onticellolmontrealestatefarmequipmentrentino-sudtirolmonza-brian" + + "zaporizhzhekinannestadmonza-e-della-brianzaporizhzhiamonzabrianz" + + "apposlombardiamondshowtimemerckongsvingermonzaebrianzaramonzaede" + + "llabrianzamoparachutingmordoviajessheiminamiuonumatsumaebashimod" + + "atemoriyamatsusakahoginozawaonsenmoriyoshiokamitsuemormoneymoroy" + + "amatsushigemortgagemoscowiostrolekaneyamaxunjargamoseushistorymo" + + "sjoenmoskeneshriramsterdambulanceomossienarashinomosvikoninjamis" + + "onmoviemovistargardmtpccwitdkonskowolancashirehabmermtranakayama" + + "tsuuramuenstermugithubcloudusercontentrentino-sued-tirolmuikamog" + + "awamukochikushinonsenergymulhouservebbsigdalmultichoicemunakatan" + + "emuncieszynmuosattemupassagensimbirskonsulatrobeermurmanskonyvel" + + "oftrentino-s-tirollagrigentomologyeonggiehtavuoatnagaivuotnagaok" + + "akyotambabydgoszczecinemailmurotorcraftrentino-suedtirolmusashim" + + "urayamatsuzakis-leetrentino-a-adigemusashinoharamuseetrentinoa-a" + + "digemuseumverenigingmutsuzawamutuellelmyokohamamatsudamypetsimpl" + + "e-urlmyphotoshibahccavuotnagareyamaizurubtsovskiptveterinairebun" + + "goonomichinomiyakemytis-a-bookkeeperminamiyamashirokawanabelgoro" + + "deophiladelphiaareadmyblogsitephilatelyphilipsyphoenixn--3e0b707" + + "ephotographysiopiagetmyipassenger-associationpictetrentinoaadige" + + "pictureslupskooris-an-actresshiraois-a-techietis-a-teacherkassym" + + "antechnologypiemontepilotsmolenskopervikommunalforbundpinkoryola" + + "sitepioneerpippupiszpittsburghofedjejuegoshikiminokamoenairlineb" + + "raskaunbieidsvollpiwatepizzapkosaigawaplanetariuminanoplantation" + + "plantsnoasaitamatsukuris-lostre-toteneis-an-accountantshiranukan" + + "makiwakunigamihamadaplatformincommbankomvuxn--3ds443gplaystation" + + "plazaplchofunatorientexpressasayamaplombardyndns-at-workinggroup" + + "aviancapetownplumbingotvbarclays3-us-west-2plusterpmnpodzonepohl" + + "pokerpokrovskosakaerodromegallupinbarcelonagasakijobservercellie" + + "rneues3-us-gov-west-1politiendapolkowicepoltavalle-aostathellewi" + + "smillerpomorzeszowithgoogleapisa-hockeynutrentinoalto-adigeporde" + + "nonepornporsangerporsangugeporsgrunnanpoznanpraxis-a-bruinsfansn" + + "zprdpreservationpresidioprgmrprimelbourneprincipeprivneprochowic" + + "eproductionsokanraprofermobilyprogressivenneslaskerrylogisticsok" + + "ndalprojectrentinoaltoadigepromombetsupportrentinos-tirolpropert" + + "yprotectionprudentialpruszkowithyoutubeneventochiokinoshimalselv" + + "endrellprzeworskogptzpvtrentinostirolpwchonanbugattipschmidtre-g" + + "auldalucernepzqldqponqslgbtrentinosud-tirolqvchoseiroumuenchenst" + + "orfjordstpetersburgstreamurskinderoystudiostudyndns-freemasonryo" + + "kamikawanehonbetsurutaharastuff-4-salestuttgartrentinosuedtirols" + + "urnadalsurreysusakis-slickomforbananarepublicargodaddynathomebui" + + "ltarumizusawaustinnaturalhistorymuseumcentereviewskrakowebhopage" + + "frontappagespeedmobilizerobihirosakikamijimagroks-thisamitsukeis" + + "enbahnasushiobaraeroportalabamagasakishimabarackmaze-burggfarmer" + + "seinewyorkshireggio-calabriabruzzoologicalvinklein-addrammenuern" + + "bergdyniabogadocscbg12000susonosuzakanumazurysuzukanzakiwiensuzu" + + "kis-uberleetrentino-aadigesvalbardudinkakamigaharasveiosvelvikos" + + "himizumakiyosumykolaivaroysvizzeraswedenswidnicapitalonewholland" + + "swiebodzindianmarketingswiftcoverisignswinoujscienceandhistorysw" + + "isshikis-very-badaddjamalborkdalsxn--3oq18vl8pn36atuscanytushuis" + + "sier-justicetuvalle-daostavangervestnesopotrentinosudtirolvestre" + + "-slidreamhostersor-odalvestre-totennishiawakuravestvagoyvevelsta" + + "dvibo-valentiavibovalentiavideovillaskoyabearalvahkihokumakogeni" + + "waizumiotsukumiyamazonawsabaerobaticketsor-varangervinnicarbonia" + + "-iglesias-carboniaiglesiascarboniavinnytsiavipsinaappfizervirgin" + + "iavirtualvirtuelvisakatakinouevistaprintuitrentottoris-very-evil" + + "lageviterboltrevisohughesolognevivoldavladikavkazanvladimirvladi" + + "vostokaizukarasuyamazoevlogvolkenkunderseaportroandinosaurepbody" + + "ndns-blogdnsolundbeckoseis-an-anarchistoricalsocietyvolkswagents" + + "orfoldvologdanskostromahachijorpelandvolvolgogradvolyngdalvorone" + + "zhytomyrvossevangenvotevotingvotoursorreisahayakawakamiichikaise" + + "is-saveducatorahimeshimakanegasakinkobayashikshacknetnedalvrnwor" + + "se-thangglidingwowiwatsukiyonowritesthisblogspotrogstadwroclawlo" + + "clawekosugewtchoshibuyachiyodawtferrarawuozuwwworldwzmiuwajimaxn" + + "--4gq48lf9jeonnamerikawauexn--4it168dxn--4it797kotouraxn--4pvxso" + + "rtlandxn--54b7fta0cchromediaxn--55qw42gxn--55qx5dxn--5js045dxn--" + + "5rtp49chryslerxn--5rtq34kouhokutamakis-an-artistjohnxn--5su34j93" + + "6bgsgxn--5tzm5gxn--6btw5axn--6frz82gxn--6orx2rxn--6qq986b3xlxn--" + + "7t0a264chungbukazunoxn--80adxhksoruminnesotaketakatsukis-into-ca" + + "rshiraokannamiharuxn--80ao21axn--80aqecdr1axn--80asehdbarefootba" + + "llangenoamishirasatobishimalopolskanlandivttasvuotnakamagayachts" + + "akuraibigawaustraliaisondriodejaneirochesterhcloudcontrolledigit" + + "alaziobirakunedre-eikereportarantomsk-uralsk12xn--80aswgxn--80au" + + "dnedalnxn--8ltr62kounosunndalxn--8pvr4uxn--8y0a063axn--90a3acade" + + "mydroboatsaritsynologyeongbukouyamashikokuchuoxn--90aishobaraomo" + + "riguchiharagusaarlandxn--90azhair-surveillancexn--9dbhblg6diethn" + + "ologyxn--9dbq2axn--9et52uxn--9krt00axn--andy-iraxn--aroport-byan" + + "agawaxn--asky-iraxn--aurskog-hland-jnbargainstitutelefonicafeder" + + "ationaval-d-aosta-valleyonagoyaustrheimatunduhrennesoyekaterinbu" + + "rgjemnes3-eu-west-1xn--avery-yuasakegawaxn--b-5gaxn--b4w605ferdx" + + "n--bck1b9a5dre4chungnamdalseidfjordyroyrvikingrossetouchijiwadel" + + "tajimicrolightingroundhandlingroznyxn--bdddj-mrabdxn--bearalvhki" + + "-y4axn--berlevg-jxaxn--bhcavuotna-s4axn--bhccavuotna-k7axn--bidr" + + "-5nachikatsuuraxn--bievt-0qa2xn--bjarky-fyanaizuxn--bjddar-ptamb" + + "oversaillesooxn--blt-elaborxn--bmlo-graingerxn--bod-2naroyxn--br" + + "nny-wuaccident-investigationjukudoyamaceratabuseat-band-campania" + + "mallamadridvagsoyericssonlineat-urlxn--brnnysund-m8accident-prev" + + "entionxn--brum-voagatromsakakinokiaxn--btsfjord-9zaxn--c1avgxn--" + + "c2br7gxn--c3s14minternationalfirearmshowaxn--cck2b3barreauctiona" + + "vigationavuotnakhodkanagawauthordalandroidiscountyumenaturalscie" + + "ncesnaturelles3-external-1xn--cg4bkis-very-goodhandsonxn--ciqpnx" + + "n--clchc0ea0b2g2a9gcdn77-securecipesaro-urbino-pesarourbinopesar" + + "omaniwakuratelekommunikationxn--comunicaes-v6a2oxn--correios-e-t" + + "elecomunicaes-ghc29axn--czr694barrel-of-knowledgeometre-experts-" + + "comptablesakyotanabellevuelosangelesjaguarchitecturealtychyattor" + + "neyagawalbrzycharternopilawalesundiyonaguniversityoriikasaokamio" + + "kamiminersalangenayoroceanographicsalondonetskashibatakasugaibmd" + + "npalacemergencyberlevagangaviikanonjiinetatamotorsaltdalindasiau" + + "tomotivecodyn-o-saurlandes3-external-2xn--czrs0tromsojavald-aost" + + "arnbergxn--czru2dxn--czrw28barrell-of-knowledgeorgeorgiautoscana" + + "daejeonbukariyakumoldebinagisoccertificationaturbruksgymnaturhis" + + "torisches3-fips-us-gov-west-1xn--d1acj3bashkiriaveroykenvironmen" + + "talconservationatuurwetenschappenaumburgjerdrumckinseyokosukarel" + + "iancebinosegawasmatartanddesignieznorddalavagiske12xn--d1alfarom" + + "eoxn--d1atrusteexn--d5qv7z876churchaseljeepilepsydneyxn--davvenj" + + "rga-y4axn--djrs72d6uyxn--djty4kouzushimasoyxn--dnna-grajewolters" + + "kluwerxn--drbak-wuaxn--dyry-iraxn--eckvdtc9dxn--efvn9southcaroli" + + "nazawaxn--efvy88hakatanotteroyxn--ehqz56nxn--elqq16hakodatevaksd" + + "alxn--estv75gxn--eveni-0qa01gaxn--f6qx53axn--fct429kozagawaxn--f" + + "hbeiarnxn--finny-yuaxn--fiq228c5hsouthwestfalenxn--fiq64basilica" + + "taniavocatanzaroweddingjerstadotsuruokamakurazakisofukushimarnar" + + "dalillesandefjordiscoveryggeelvinckarlsoyokotebizenakaniikawatan" + + "agurasnesoddenmarkets3-ap-southeast-1kappleangaviikadenaamesjevu" + + "emielnoboribetsucks3-ap-northeast-1xn--fiqs8sowaxn--fiqz9spreadb" + + "ettingxn--fjord-lraxn--fjq720axn--fl-ziaxn--flor-jraxn--flw351ex" + + "n--fpcrj9c3dxn--frde-grandrapidspydebergxn--frna-woaraisaijosoyr" + + "ovigorlicexn--frya-hraxn--fzc2c9e2chuvashiaxn--fzys8d69uvgmailxn" + + "--g2xx48circlegallocuscountryestateofdelawarecreationxn--gckr3f0" + + "ferrarittogokasells-for-lesscrapper-sitexn--gecrj9circuscultured" + + "umbrellahppiacenzakopanerairforcechirealtorlandxn--ggaviika-8ya4" + + "7hakonexn--gildeskl-g0axn--givuotna-8yandexn--3pxu8kotohiradomai" + + "nsureisenxn--gjvik-wuaxn--gk3at1exn--gls-elacaixaxn--gmq050is-ve" + + "ry-nicexn--gmqw5axn--h-2fairwindsrlxn--h1aeghakubankmshinjournal" + + "ismailillehammerfest-mon-blogueurovisionxn--h2brj9citadeliverybn" + + "ikahokutogliattiresaskatchewanggouvicenzaxn--hbmer-xqaxn--hcesuo" + + "lo-7ya35basketballfinanz-2xn--hery-iraxn--hgebostad-g3axn--hmmrf" + + "easta-s4acctrverranzanxn--hnefoss-q1axn--hobl-iraxn--holtlen-hxa" + + "xn--hpmir-xqaxn--hxt814exn--hyanger-q1axn--hylandet-54axn--i1b6b" + + "1a6a2exn--imr513nxn--indery-fyaotsurgutsiracusaitokyotangovtrysi" + + "lkoshunantokashikizunokunimilanoxn--io0a7is-very-sweetrentino-al" + + "to-adigexn--j1aeferreroticampobassociatescrappingujolsterxn--j1a" + + "mhakuis-a-nurseoullensvanguardxn--j6w193gxn--jlq61u9w7batochigif" + + "tsalvadordalibabaikaliszczytnordlandrangedalindesnesalzburgladel" + + "oittenrightathomeftpaccessamegawavoues3-sa-east-1xn--jlster-byar" + + "oslavlaanderenxn--jrpeland-54axn--jvr189misakis-into-cartoonshir" + + "atakahagivingxn--k7yn95exn--karmy-yuaxn--kbrq7oxn--kcrx77d1x4axn" + + "--kfjord-iuaxn--klbu-woaxn--klt787dxn--kltp7dxn--kltx9axn--klty5" + + "xn--42c2d9axn--koluokta-7ya57hakusandiegoodyearthagakhanamigawax" + + "n--kprw13dxn--kpry57dxn--kpu716fetsundxn--kput3is-with-thebandoo" + + "mdnsaliascolipicenord-odalxn--krager-gyasakaiminatoyakokamisatoh" + + "obby-sitexasdaburyatiaarpharmaciensirdalxn--kranghke-b0axn--krds" + + "herad-m8axn--krehamn-dxaxn--krjohka-hwab49jetztrentino-altoadige" + + "xn--ksnes-uuaxn--kvfjord-nxaxn--kvitsy-fyasugisleofmandalxn--kvn" + + "angen-k0axn--l-1faitheguardianquanconagawakuyabukicks-assediciti" + + "cateringebudejjuedischesapeakebayernurembergriwataraidyndns-work" + + "shoppdalowiczest-le-patrondheimperiaxn--l1accentureklamborghinii" + + "zaxn--laheadju-7yasuokaratexn--langevg-jxaxn--lcvr32dxn--ldingen" + + "-q1axn--leagaviika-52batsfjordrivelandrobaknoluoktainaikawachina" + + "ganoharamcoalaheadjudaicaaarborteaches-yogasawaracingroks-theatr" + + "eemersongdalenviknakanojohanamakinoharaxastronomydstvedestrandgc" + + "ahcesuolocalhistoryazannefrankfurtargets-itargi234xn--lesund-hua" + + "xn--lgbbat1ad8jevnakerxn--lgrd-poacoachampionshiphopenair-traffi" + + "c-controlleyxn--lhppi-xqaxn--linds-pramericanartulansolutionsola" + + "rssonxn--lns-qlanxessrtrentinosued-tirolxn--loabt-0qaxn--lrdal-s" + + "raxn--lrenskog-54axn--lt-liacivilaviationxn--lten-granexn--lury-" + + "iraxn--mely-iraxn--merker-kuaxn--mgb2ddesrvdonskosherbrookegawax" + + "n--mgb9awbfgulenxn--mgba3a3ejtunesomaxn--mgba3a4f16axn--mgba3a4f" + + "ranamizuholdingsmileirfjordxn--mgba7c0bbn0axn--mgbaakc7dvfidelit" + + "yxn--mgbaam7a8haldenxn--mgbab2bdxn--mgbai9a5eva00bauhausposts-an" + + "d-telecommunicationsnasadoes-itveronagasukemrxn--mgbai9azgqp6jew" + + "elryxn--mgbayh7gpaduaxn--mgbb9fbpobanazawaxn--mgbbh1a71exn--mgbc" + + "0a9azcgxn--mgbca7dzdoxn--mgberp4a5d4a87gxn--mgberp4a5d4arxn--mgb" + + "i4ecexposedxn--mgbpl2fhvalerxn--mgbqly7c0a67fbcivilisationxn--mg" + + "bqly7cvafredrikstadtvstoragexn--mgbt3dhdxn--mgbtf8flekkefjordxn-" + + "-mgbtx2bbcarrierxn--mgbx4cd0abbvieeexn--mix082fidonnakamuratakah" + + "amannortonsbergunmarriottoyonezawaxn--mix891fieldxn--mjndalen-64" + + "axn--mk0axindustriesteamfamberkeleyxn--mk1bu44civilizationxn--mk" + + "ru45issmarterthanyouxn--mlatvuopmi-s4axn--mli-tlapyatigorskozaki" + + "s-an-engineeringxn--mlselv-iuaxn--moreke-juaxn--mori-qsakuhokkai" + + "dontexisteingeekpnxn--mosjen-eyatominamiawajikiwchiryukyuragifue" + + "fukihaborokunohealthcareersarufutsunomiyawakasaikaitakoelniyodog" + + "awaxn--mot-tlaquilancasterxn--mre-og-romsdal-qqbbtatarstanflatan" + + "gerxn--msy-ula0halsaintlouis-a-anarchistoireggioemiliaromagnakat" + + "ombetsumidatlantichernivtsiciliaxn--mtta-vrjjat-k7afamilycompany" + + "civilwarmanagementjxjaworznoxn--muost-0qaxn--mxtq1misasaguris-in" + + "to-gamessinashikitchenxn--ngbc5azdxn--ngbe9e0axn--ngbrxn--45brj9" + + "choyodobashichikashukujitawaraxn--nit225kppspiegelxn--nmesjevuem" + + "ie-tcbajddarchaeologyxn--nnx388axn--nodessakuragawaxn--nqv7fs00e" + + "maxn--nry-yla5gxn--ntso0iqx3axn--ntsq17gxn--nttery-byaeservegame" + + "-serverdalxn--nvuotna-hwaxn--nyqy26axn--o1achattanooganorilsklep" + + "pharmacyslingxn--o3cw4hammarfeastafricamagichernovtsykkylvenetoe" + + "iheijis-a-doctorayxn--od0algxn--od0aq3bbvacationswatch-and-clock" + + "erxn--ogbpf8flesbergxn--oppegrd-ixaxn--ostery-fyatsukaratsuginam" + + "ikatagamihoboleslawieclaimsassaris-a-financialadvisor-aurdaluroy" + + "xn--osyro-wuaxn--p1acfdxn--p1aixn--pbt977clickchristiansburgrpal" + + "ermomasvuotnakatsugawaxn--pgbs0dhlxn--porsgu-sta26figuerestauran" + + "toyonoxn--pssu33lxn--pssy2uxn--q9jyb4clinicatholicasinorfolkebib" + + "lefrakkestadyndns-wikindlegnicamerakershus-east-1xn--qcka1pmcdon" + + "aldstordalxn--qqqt11misawaxn--qxamusementurystykarasjoksnesomnar" + + "itakurashikis-not-certifiedogawarabikomaezakirunoshiroomuraxn--r" + + "ady-iraxn--rdal-poaxn--rde-ularvikrasnodarxn--rdy-0nabarixn--ren" + + "nesy-v1axn--rhkkervju-01aflakstadaokagakibichuoxn--rholt-mragowo" + + "odsidexn--rhqv96gxn--rht27zxn--rht3dxn--rht61exn--risa-5narusawa" + + "xn--risr-iraxn--rland-uuaxn--rlingen-mxaxn--rmskog-byatsushiroxn" + + "--rny31hamurakamigoriginshinjukumanoxn--rovu88bentleyukuhashimoj" + + "iitatebayashijonawatextileitungsenfshostrodawaraxn--rros-granvin" + + "dafjordxn--rskog-uuaxn--rst-0narutokorozawaxn--rsta-francaisehar" + + "axn--ryken-vuaxn--ryrvik-byawaraxn--s-1fareastcoastaldefencexn--" + + "s9brj9cliniquenoharaxn--sandnessjen-ogbizhevskrasnoyarskommunexn" + + "--sandy-yuaxn--seral-lraxn--ses554gxn--sgne-gratangenxn--skierv-" + + "utazaskvolloabathsbclintonoshoesatxn--0trq7p7nnxn--skjervy-v1axn" + + "--skjk-soaxn--sknit-yqaxn--sknland-fxaxn--slat-5narviikananporov" + + "noxn--slt-elabourxn--smla-hraxn--smna-gratis-a-bulls-fanxn--snas" + + "e-nraxn--sndre-land-0cbremangerxn--snes-poaxn--snsa-roaxn--sr-au" + + "rdal-l8axn--sr-fron-q1axn--sr-odal-q1axn--sr-varanger-ggbeppubol" + + "ognagatorockartuzyurihonjournalistjordalshalsenhsamnangerxn--srf" + + "old-byawatahamaxn--srreisa-q1axn--srum-grazxn--stfold-9xaxn--stj" + + "rdal-s1axn--stjrdalshalsen-sqberndunloppacificartierxn--stre-tot" + + "en-zcbstorenburgxn--t60b56axn--tckweatherchannelxn--tiq49xqyjewi" + + "shartgalleryxn--tjme-hraxn--tn0agrinetbankzxn--tnsberg-q1axn--to" + + "r131oxn--trany-yuaxn--trgstad-r1axn--trna-woaxn--troms-zuaxn--ty" + + "svr-vraxn--uc0atversicherungxn--uc0ay4axn--uist22hangoutsystemsc" + + "loudcontrolapparmaxn--uisz3gxn--unjrga-rtaobaokinawashirosatobam" + + "agazinemurorangeologyxn--unup4yxn--uuwu58axn--vads-jraxn--vard-j" + + "raxn--vegrshei-c0axn--vermgensberater-ctbeskidynaliascoli-piceno" + + "rd-frontierxn--vermgensberatung-pwbestbuyshousesamsclubindalinka" + + "shiharaxn--vestvgy-ixa6oxn--vg-yiabcgxn--vgan-qoaxn--vgsy-qoa0jf" + + "komitamamuraxn--vgu402clothingruexn--vhquvestfoldxn--vler-qoaxn-" + + "-vre-eiker-k8axn--vrggt-xqadxn--vry-yla5gxn--vuq861betainaboxfor" + + "deatnuorogersvpalanaklodzkodairaxn--w4r85el8fhu5dnraxn--w4rs40lx" + + "n--wcvs22dxn--wgbh1cloudfrontdoorxn--wgbl6axn--xhq521bielawallon" + + "ieruchomoscienceandindustrynikiiyamanobeauxartsandcraftsamsungla" + + "ssassinationalheritagematsubarakawagoepostfoldnavyatkakudamatsue" + + "psonyoursidegreevje-og-hornnesandvikcoromantovalle-d-aostatoilin" + + "zainfinitinfoggiaxn--xkc2al3hye2axn--xkc2dl3a5ee0hannanmokuizumo" + + "dernxn--y9a3aquariumisconfusedxn--yer-znarvikredstonexn--yfro4i6" + + "7oxn--ygarden-p1axn--ygbi2ammxn--45q11christmasakikugawatchesase" + + "boknowsitallukowhoswhokksundynv6xn--ystre-slidre-ujbiellaakesvue" + + "mieleccexn--zbx025dxn--zf0ao64axn--zf0avxn--4gbriminingxn--zfr16" + + "4bieszczadygeyachimataipeigersundunsagamiharaxperiaxz" + +// 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 +// the children array), ICANN bit and text. +// +// In the //-comment after each node's data, the nodes indexes of the children +// are formatted as (n0x1234-n0x1256), with * denoting the wildcard bit. The +// nodeType is printed as + for normal, ! for exception, and o for parent-only +// nodes that have children but don't match a domain label in their own right. +// An I denotes an ICANN domain. +// +// The layout within the uint32, from MSB to LSB, is: +// [ 1 bits] unused +// [ 9 bits] children index +// [ 1 bits] ICANN bit +// [15 bits] text index +// [ 6 bits] text length +var nodes = [...]uint32{ + 0x00355603, // n0x0000 c0x0000 (---------------) + I aaa + 0x0034d544, // n0x0001 c0x0000 (---------------) + I aarp + 0x0026b886, // n0x0002 c0x0000 (---------------) + I abarth + 0x00230743, // n0x0003 c0x0000 (---------------) + I abb + 0x00230746, // n0x0004 c0x0000 (---------------) + I abbott + 0x00365706, // n0x0005 c0x0000 (---------------) + I abbvie + 0x00399843, // n0x0006 c0x0000 (---------------) + I abc + 0x0031f144, // n0x0007 c0x0000 (---------------) + I able + 0x002ee207, // n0x0008 c0x0000 (---------------) + I abogado + 0x0026b4c8, // n0x0009 c0x0000 (---------------) + I abudhabi + 0x01a01542, // n0x000a c0x0006 (n0x0609-n0x060f) + I ac + 0x0030aec7, // n0x000b c0x0000 (---------------) + I academy + 0x00352a89, // n0x000c c0x0000 (---------------) + I accenture + 0x002d9b0a, // n0x000d c0x0000 (---------------) + I accountant + 0x002d9b0b, // n0x000e c0x0000 (---------------) + I accountants + 0x00232d83, // n0x000f c0x0000 (---------------) + I aco + 0x0028a206, // n0x0010 c0x0000 (---------------) + I active + 0x0023b505, // n0x0011 c0x0000 (---------------) + I actor + 0x01e00342, // n0x0012 c0x0007 (n0x060f-n0x0610) + I ad + 0x00212f84, // n0x0013 c0x0000 (---------------) + I adac + 0x0026ba03, // n0x0014 c0x0000 (---------------) + I ads + 0x002a1985, // n0x0015 c0x0000 (---------------) + I adult + 0x022035c2, // n0x0016 c0x0008 (n0x0610-n0x0618) + I ae + 0x0024a403, // n0x0017 c0x0000 (---------------) + I aeg + 0x026389c4, // n0x0018 c0x0009 (n0x0618-n0x066f) + I aero + 0x0025e585, // n0x0019 c0x0000 (---------------) + I aetna + 0x02a04a42, // n0x001a c0x000a (n0x066f-n0x0674) + I af + 0x0036ec8e, // n0x001b c0x0000 (---------------) + I afamilycompany + 0x00252703, // n0x001c c0x0000 (---------------) + I afl + 0x00375846, // n0x001d c0x0000 (---------------) + I africa + 0x0037584b, // n0x001e c0x0000 (---------------) + I africamagic + 0x02e01002, // n0x001f c0x000b (n0x0674-n0x0679) + I ag + 0x0034ac47, // n0x0020 c0x0000 (---------------) + I agakhan + 0x0023df86, // n0x0021 c0x0000 (---------------) + I agency + 0x032016c2, // n0x0022 c0x000c (n0x0679-n0x067d) + I ai + 0x00214d03, // n0x0023 c0x0000 (---------------) + I aig + 0x00214d04, // n0x0024 c0x0000 (---------------) + I aigo + 0x0022b886, // n0x0025 c0x0000 (---------------) + I airbus + 0x00338648, // n0x0026 c0x0000 (---------------) + I airforce + 0x00286586, // n0x0027 c0x0000 (---------------) + I airtel + 0x00227644, // n0x0028 c0x0000 (---------------) + I akdn + 0x036001c2, // n0x0029 c0x000d (n0x067d-n0x0684) + I al + 0x00328e49, // n0x002a c0x0000 (---------------) + I alfaromeo + 0x00345287, // n0x002b c0x0000 (---------------) + I alibaba + 0x002bc006, // n0x002c c0x0000 (---------------) + I alipay + 0x0033e3c9, // n0x002d c0x0000 (---------------) + I allfinanz + 0x0020f148, // n0x002e c0x0000 (---------------) + I allstate + 0x00213584, // n0x002f c0x0000 (---------------) + I ally + 0x0021dd86, // n0x0030 c0x0000 (---------------) + I alsace + 0x0020be86, // n0x0031 c0x0000 (---------------) + I alstom + 0x03a01882, // n0x0032 c0x000e (n0x0684-n0x0685) + I am + 0x0024728f, // n0x0033 c0x0000 (---------------) + I americanexpress + 0x00208d8e, // n0x0034 c0x0000 (---------------) + I americanfamily + 0x002052c4, // n0x0035 c0x0000 (---------------) + I amex + 0x00367585, // n0x0036 c0x0000 (---------------) + I amfam + 0x00230645, // n0x0037 c0x0000 (---------------) + I amica + 0x002c8449, // n0x0038 c0x0000 (---------------) + I amsterdam + 0x00243f09, // n0x0039 c0x0000 (---------------) + I analytics + 0x0031a8c7, // n0x003a c0x0000 (---------------) + I android + 0x00350706, // n0x003b c0x0000 (---------------) + I anquan + 0x00256b43, // n0x003c c0x0000 (---------------) + I anz + 0x03e029c2, // n0x003d c0x000f (n0x0685-n0x068b) + I ao + 0x00275643, // n0x003e c0x0000 (---------------) + I aol + 0x0022ce0a, // n0x003f c0x0000 (---------------) + I apartments + 0x002092c3, // n0x0040 c0x0000 (---------------) + I app + 0x00331985, // n0x0041 c0x0000 (---------------) + I apple + 0x002003c2, // n0x0042 c0x0000 (---------------) + I aq + 0x00285a49, // n0x0043 c0x0000 (---------------) + I aquarelle + 0x04200a42, // n0x0044 c0x0010 (n0x068b-n0x0694) + I ar + 0x00202044, // n0x0045 c0x0000 (---------------) + I arab + 0x00355146, // n0x0046 c0x0000 (---------------) + I aramco + 0x002fb805, // n0x0047 c0x0000 (---------------) + I archi + 0x00348744, // n0x0048 c0x0000 (---------------) + I army + 0x04a29dc4, // n0x0049 c0x0012 (n0x0695-n0x069b) + I arpa + 0x0023a6c4, // n0x004a c0x0000 (---------------) + I arte + 0x04e01d42, // n0x004b c0x0013 (n0x069b-n0x069c) + I as + 0x0034d284, // n0x004c c0x0000 (---------------) + I asda + 0x00322ec4, // n0x004d c0x0000 (---------------) + I asia + 0x003437ca, // n0x004e c0x0000 (---------------) + I associates + 0x05200102, // n0x004f c0x0014 (n0x069c-n0x06a3) + I at + 0x00248f47, // n0x0050 c0x0000 (---------------) + I athleta + 0x0031fec8, // n0x0051 c0x0000 (---------------) + I attorney + 0x05a04f82, // n0x0052 c0x0016 (n0x06a4-n0x06b6) + I au + 0x00319e07, // n0x0053 c0x0000 (---------------) + I auction + 0x00233104, // n0x0054 c0x0000 (---------------) + I audi + 0x002b7d87, // n0x0055 c0x0000 (---------------) + I audible + 0x00233105, // n0x0056 c0x0000 (---------------) + I audio + 0x0035fd47, // n0x0057 c0x0000 (---------------) + I auspost + 0x0031a686, // n0x0058 c0x0000 (---------------) + I author + 0x00265104, // n0x0059 c0x0000 (---------------) + I auto + 0x00324dc5, // n0x005a c0x0000 (---------------) + I autos + 0x002dc007, // n0x005b c0x0000 (---------------) + I avianca + 0x06a01082, // n0x005c c0x001a (n0x06c4-n0x06c5) + I aw + 0x002f6583, // n0x005d c0x0000 (---------------) + I aws + 0x00220402, // n0x005e c0x0000 (---------------) + I ax + 0x00356983, // n0x005f c0x0000 (---------------) + I axa + 0x06e05f42, // n0x0060 c0x001b (n0x06c5-n0x06d1) + I az + 0x0021be05, // n0x0061 c0x0000 (---------------) + I azure + 0x07202002, // n0x0062 c0x001c (n0x06d1-n0x06dc) + I ba + 0x002ce1c4, // n0x0063 c0x0000 (---------------) + I baby + 0x0027c805, // n0x0064 c0x0000 (---------------) + I baidu + 0x00205207, // n0x0065 c0x0000 (---------------) + I banamex + 0x002e97ce, // n0x0066 c0x0000 (---------------) + I bananarepublic + 0x00207cc4, // n0x0067 c0x0000 (---------------) + I band + 0x00203704, // n0x0068 c0x0000 (---------------) + I bank + 0x00202003, // n0x0069 c0x0000 (---------------) + I bar + 0x002dd889, // n0x006a c0x0000 (---------------) + I barcelona + 0x002c12cb, // n0x006b c0x0000 (---------------) + I barclaycard + 0x002dc608, // n0x006c c0x0000 (---------------) + I barclays + 0x00306d88, // n0x006d c0x0000 (---------------) + I barefoot + 0x0030e948, // n0x006e c0x0000 (---------------) + I bargains + 0x0022f9c8, // n0x006f c0x0000 (---------------) + I baseball + 0x0033e20a, // n0x0070 c0x0000 (---------------) + I basketball + 0x0035fc47, // n0x0071 c0x0000 (---------------) + I bauhaus + 0x00351786, // n0x0072 c0x0000 (---------------) + I bayern + 0x07630782, // n0x0073 c0x001d (n0x06dc-n0x06e6) + I bb + 0x003651c3, // n0x0074 c0x0000 (---------------) + I bbc + 0x0036cbc3, // n0x0075 c0x0000 (---------------) + I bbt + 0x00376984, // n0x0076 c0x0000 (---------------) + I bbva + 0x00399883, // n0x0077 c0x0000 (---------------) + I bcg + 0x00239b43, // n0x0078 c0x0000 (---------------) + I bcn + 0x017129c2, // n0x0079 c0x0005 (---------------)* o I bd + 0x07a03302, // n0x007a c0x001e (n0x06e6-n0x06e8) + I be + 0x0022b505, // n0x007b c0x0000 (---------------) + I beats + 0x0024f5c6, // n0x007c c0x0000 (---------------) + I beauty + 0x002ccb84, // n0x007d c0x0000 (---------------) + I beer + 0x00383b87, // n0x007e c0x0000 (---------------) + I bentley + 0x0022e6c6, // n0x007f c0x0000 (---------------) + I berlin + 0x002291c4, // n0x0080 c0x0000 (---------------) + I best + 0x00398887, // n0x0081 c0x0000 (---------------) + I bestbuy + 0x00208c03, // n0x0082 c0x0000 (---------------) + I bet + 0x07f5d242, // n0x0083 c0x001f (n0x06e8-n0x06e9) + I bf + 0x082ee482, // n0x0084 c0x0020 (n0x06e9-n0x070e) + I bg + 0x08615602, // n0x0085 c0x0021 (n0x070e-n0x0713) + I bh + 0x00215606, // n0x0086 c0x0000 (---------------) + I bharti + 0x08a00002, // n0x0087 c0x0022 (n0x0713-n0x0718) + I bi + 0x0037bf45, // n0x0088 c0x0000 (---------------) + I bible + 0x00313f03, // n0x0089 c0x0000 (---------------) + I bid + 0x00202544, // n0x008a c0x0000 (---------------) + I bike + 0x002dc444, // n0x008b c0x0000 (---------------) + I bing + 0x002dc445, // n0x008c c0x0000 (---------------) + I bingo + 0x00203a03, // n0x008d c0x0000 (---------------) + I bio + 0x08f30b83, // n0x008e c0x0023 (n0x0718-n0x0720) + I biz + 0x09206502, // n0x008f c0x0024 (n0x0720-n0x0724) + I bj + 0x00288ec5, // n0x0090 c0x0000 (---------------) + I black + 0x00288ecb, // n0x0091 c0x0000 (---------------) + I blackfriday + 0x00258fc6, // n0x0092 c0x0000 (---------------) + I blanco + 0x0020c8cb, // n0x0093 c0x0000 (---------------) + I blockbuster + 0x002a4004, // n0x0094 c0x0000 (---------------) + I blog + 0x0020d009, // n0x0095 c0x0000 (---------------) + I bloomberg + 0x0020e104, // n0x0096 c0x0000 (---------------) + I blue + 0x0960e742, // n0x0097 c0x0025 (n0x0724-n0x0729) + I bm + 0x0020f6c3, // n0x0098 c0x0000 (---------------) + I bms + 0x0020fc43, // n0x0099 c0x0000 (---------------) + I bmw + 0x016104c2, // n0x009a c0x0005 (---------------)* o I bn + 0x002477c3, // n0x009b c0x0000 (---------------) + I bnl + 0x002104ca, // n0x009c c0x0000 (---------------) + I bnpparibas + 0x09a0e402, // n0x009d c0x0026 (n0x0729-n0x0732) + I bo + 0x0030b145, // n0x009e c0x0000 (---------------) + I boats + 0x0020e40a, // n0x009f c0x0000 (---------------) + I boehringer + 0x00290b84, // n0x00a0 c0x0000 (---------------) + I bofa + 0x00210ac3, // n0x00a1 c0x0000 (---------------) + I bom + 0x00210f84, // n0x00a2 c0x0000 (---------------) + I bond + 0x00215403, // n0x00a3 c0x0000 (---------------) + I boo + 0x00215404, // n0x00a4 c0x0000 (---------------) + I book + 0x00215407, // n0x00a5 c0x0000 (---------------) + I booking + 0x00215e85, // n0x00a6 c0x0000 (---------------) + I boots + 0x002173c5, // n0x00a7 c0x0000 (---------------) + I bosch + 0x00217986, // n0x00a8 c0x0000 (---------------) + I bostik + 0x00217cc6, // n0x00a9 c0x0000 (---------------) + I boston + 0x00218e83, // n0x00aa c0x0000 (---------------) + I bot + 0x0021b7c8, // n0x00ab c0x0000 (---------------) + I boutique + 0x0021bb83, // n0x00ac c0x0000 (---------------) + I box + 0x09e1c402, // n0x00ad c0x0027 (n0x0732-n0x0778) + I br + 0x0021c408, // n0x00ae c0x0000 (---------------) + I bradesco + 0x00221b8b, // n0x00af c0x0000 (---------------) + I bridgestone + 0x00220008, // n0x00b0 c0x0000 (---------------) + I broadway + 0x00220c46, // n0x00b1 c0x0000 (---------------) + I broker + 0x00222007, // n0x00b2 c0x0000 (---------------) + I brother + 0x00225e88, // n0x00b3 c0x0000 (---------------) + I brussels + 0x0a637542, // n0x00b4 c0x0029 (n0x0779-n0x077e) + I bs + 0x0aa1fd02, // n0x00b5 c0x002a (n0x077e-n0x0783) + I bt + 0x0020a008, // n0x00b6 c0x0000 (---------------) + I budapest + 0x002e5b47, // n0x00b7 c0x0000 (---------------) + I bugatti + 0x002410c5, // n0x00b8 c0x0000 (---------------) + I build + 0x002410c8, // n0x00b9 c0x0000 (---------------) + I builders + 0x0022c188, // n0x00ba c0x0000 (---------------) + I business + 0x003004c3, // n0x00bb c0x0000 (---------------) + I buy + 0x0022dec4, // n0x00bc c0x0000 (---------------) + I buzz + 0x00365782, // n0x00bd c0x0000 (---------------) + I bv + 0x0ae2fe42, // n0x00be c0x002b (n0x0783-n0x0785) + I bw + 0x0b20f982, // n0x00bf c0x002c (n0x0785-n0x0789) + I by + 0x0ba30bc2, // n0x00c0 c0x002e (n0x078a-n0x0790) + I bz + 0x00230bc3, // n0x00c1 c0x0000 (---------------) + I bzh + 0x0be00302, // n0x00c2 c0x002f (n0x0790-n0x07a1) + I ca + 0x00230703, // n0x00c3 c0x0000 (---------------) + I cab + 0x0030ee44, // n0x00c4 c0x0000 (---------------) + I cafe + 0x00213543, // n0x00c5 c0x0000 (---------------) + I cal + 0x00213544, // n0x00c6 c0x0000 (---------------) + I call + 0x002ed9cb, // n0x00c7 c0x0000 (---------------) + I calvinklein + 0x0037c746, // n0x00c8 c0x0000 (---------------) + I camera + 0x00241ac4, // n0x00c9 c0x0000 (---------------) + I camp + 0x0029f88e, // n0x00ca c0x0000 (---------------) + I cancerresearch + 0x00265485, // n0x00cb c0x0000 (---------------) + I canon + 0x002dc148, // n0x00cc c0x0000 (---------------) + I capetown + 0x002f0b87, // n0x00cd c0x0000 (---------------) + I capital + 0x002f0b8a, // n0x00ce c0x0000 (---------------) + I capitalone + 0x0020af43, // n0x00cf c0x0000 (---------------) + I car + 0x00236a47, // n0x00d0 c0x0000 (---------------) + I caravan + 0x002c1485, // n0x00d1 c0x0000 (---------------) + I cards + 0x0036b504, // n0x00d2 c0x0000 (---------------) + I care + 0x0036b506, // n0x00d3 c0x0000 (---------------) + I career + 0x0036b507, // n0x00d4 c0x0000 (---------------) + I careers + 0x00305f84, // n0x00d5 c0x0000 (---------------) + I cars + 0x00390b47, // n0x00d6 c0x0000 (---------------) + I cartier + 0x00214604, // n0x00d7 c0x0000 (---------------) + I casa + 0x002188c4, // n0x00d8 c0x0000 (---------------) + I case + 0x002188c6, // n0x00d9 c0x0000 (---------------) + I caseih + 0x002c99c4, // n0x00da c0x0000 (---------------) + I cash + 0x0037bc46, // n0x00db c0x0000 (---------------) + I casino + 0x0020df43, // n0x00dc c0x0000 (---------------) + I cat + 0x00351008, // n0x00dd c0x0000 (---------------) + I catering + 0x0037ba88, // n0x00de c0x0000 (---------------) + I catholic + 0x0024b283, // n0x00df c0x0000 (---------------) + I cba + 0x00247783, // n0x00e0 c0x0000 (---------------) + I cbn + 0x0038c544, // n0x00e1 c0x0000 (---------------) + I cbre + 0x00391103, // n0x00e2 c0x0000 (---------------) + I cbs + 0x0c22e182, // n0x00e3 c0x0030 (n0x07a1-n0x07a5) + I cc + 0x0c63e2c2, // n0x00e4 c0x0031 (n0x07a5-n0x07a6) + I cd + 0x00206483, // n0x00e5 c0x0000 (---------------) + I ceb + 0x00204486, // n0x00e6 c0x0000 (---------------) + I center + 0x002c87c3, // n0x00e7 c0x0000 (---------------) + I ceo + 0x002e61c4, // n0x00e8 c0x0000 (---------------) + I cern + 0x0ca14202, // n0x00e9 c0x0032 (n0x07a6-n0x07a7) + I cf + 0x00214203, // n0x00ea c0x0000 (---------------) + I cfa + 0x00379503, // n0x00eb c0x0000 (---------------) + I cfd + 0x0021a302, // n0x00ec c0x0000 (---------------) + I cg + 0x0ce01582, // n0x00ed c0x0033 (n0x07a7-n0x07a8) + I ch + 0x002ba9c6, // n0x00ee c0x0000 (---------------) + I chanel + 0x0023c407, // n0x00ef c0x0000 (---------------) + I channel + 0x00329845, // n0x00f0 c0x0000 (---------------) + I chase + 0x0022ac44, // n0x00f1 c0x0000 (---------------) + I chat + 0x00284305, // n0x00f2 c0x0000 (---------------) + I cheap + 0x00201587, // n0x00f3 c0x0000 (---------------) + I chintai + 0x002aee85, // n0x00f4 c0x0000 (---------------) + I chloe + 0x003a3989, // n0x00f5 c0x0000 (---------------) + I christmas + 0x003024c6, // n0x00f6 c0x0000 (---------------) + I chrome + 0x00303188, // n0x00f7 c0x0000 (---------------) + I chrysler + 0x00329746, // n0x00f8 c0x0000 (---------------) + I church + 0x0d200682, // n0x00f9 c0x0034 (n0x07a8-n0x07b7) + I ci + 0x0023fe08, // n0x00fa c0x0000 (---------------) + I cipriani + 0x00336206, // n0x00fb c0x0000 (---------------) + I circle + 0x00200685, // n0x00fc c0x0000 (---------------) + I cisco + 0x0033cc87, // n0x00fd c0x0000 (---------------) + I citadel + 0x00350f04, // n0x00fe c0x0000 (---------------) + I citi + 0x00350f05, // n0x00ff c0x0000 (---------------) + I citic + 0x00286744, // n0x0100 c0x0000 (---------------) + I city + 0x00286748, // n0x0101 c0x0000 (---------------) + I cityeats + 0x0d60b482, // n0x0102 c0x0035 (n0x07b7-n0x07b8)* o I ck + 0x0da09182, // n0x0103 c0x0036 (n0x07b8-n0x07bd) + I cl + 0x00378546, // n0x0104 c0x0000 (---------------) + I claims + 0x002242c8, // n0x0105 c0x0000 (---------------) + I cleaning + 0x00379a45, // n0x0106 c0x0000 (---------------) + I click + 0x0037b946, // n0x0107 c0x0000 (---------------) + I clinic + 0x00387188, // n0x0108 c0x0000 (---------------) + I clinique + 0x0039a588, // n0x0109 c0x0000 (---------------) + I clothing + 0x00209185, // n0x010a c0x0000 (---------------) + I cloud + 0x00238ac4, // n0x010b c0x0000 (---------------) + I club + 0x00238ac7, // n0x010c c0x0000 (---------------) + I clubmed + 0x0de5d142, // n0x010d c0x0037 (n0x07bd-n0x07c1) + I cm + 0x0e21ba42, // n0x010e c0x0038 (n0x07c1-n0x07ee) + I cn + 0x0fa00742, // n0x010f c0x003e (n0x07f3-n0x0800) + I co + 0x00358885, // n0x0110 c0x0000 (---------------) + I coach + 0x0029bd05, // n0x0111 c0x0000 (---------------) + I codes + 0x0020b246, // n0x0112 c0x0000 (---------------) + I coffee + 0x0022e1c7, // n0x0113 c0x0000 (---------------) + I college + 0x00231a87, // n0x0114 c0x0000 (---------------) + I cologne + 0x10233503, // n0x0115 c0x0040 (n0x0801-n0x08d7) + I com + 0x002a6b87, // n0x0116 c0x0000 (---------------) + I comcast + 0x002da788, // n0x0117 c0x0000 (---------------) + I commbank + 0x00233509, // n0x0118 c0x0000 (---------------) + I community + 0x0036ee47, // n0x0119 c0x0000 (---------------) + I company + 0x00234a07, // n0x011a c0x0000 (---------------) + I compare + 0x00235488, // n0x011b c0x0000 (---------------) + I computer + 0x00235c86, // n0x011c c0x0000 (---------------) + I comsec + 0x00236246, // n0x011d c0x0000 (---------------) + I condos + 0x00236f4c, // n0x011e c0x0000 (---------------) + I construction + 0x00237d0a, // n0x011f c0x0000 (---------------) + I consulting + 0x00239e07, // n0x0120 c0x0000 (---------------) + I contact + 0x0023b3cb, // n0x0121 c0x0000 (---------------) + I contractors + 0x0023c247, // n0x0122 c0x0000 (---------------) + I cooking + 0x0023c24e, // n0x0123 c0x0000 (---------------) + I cookingchannel + 0x0023d384, // n0x0124 c0x0000 (---------------) + I cool + 0x0023d684, // n0x0125 c0x0000 (---------------) + I coop + 0x0023ea07, // n0x0126 c0x0000 (---------------) + I corsica + 0x00336587, // n0x0127 c0x0000 (---------------) + I country + 0x002423c6, // n0x0128 c0x0000 (---------------) + I coupon + 0x002423c7, // n0x0129 c0x0000 (---------------) + I coupons + 0x00242fc7, // n0x012a c0x0000 (---------------) + I courses + 0x126049c2, // n0x012b c0x0049 (n0x08fe-n0x0905) + I cr + 0x002447c6, // n0x012c c0x0000 (---------------) + I credit + 0x002447ca, // n0x012d c0x0000 (---------------) + I creditcard + 0x00244a4b, // n0x012e c0x0000 (---------------) + I creditunion + 0x00245b47, // n0x012f c0x0000 (---------------) + I cricket + 0x00246505, // n0x0130 c0x0000 (---------------) + I crown + 0x00246643, // n0x0131 c0x0000 (---------------) + I crs + 0x00246b46, // n0x0132 c0x0000 (---------------) + I cruise + 0x00246b47, // n0x0133 c0x0000 (---------------) + I cruises + 0x002440c3, // n0x0134 c0x0000 (---------------) + I csc + 0x12a09d82, // n0x0135 c0x004a (n0x0905-n0x090b) + I cu + 0x00246f0a, // n0x0136 c0x0000 (---------------) + I cuisinella + 0x12f53bc2, // n0x0137 c0x004b (n0x090b-n0x090c) + I cv + 0x132c95c2, // n0x0138 c0x004c (n0x090c-n0x0910) + I cw + 0x136482c2, // n0x0139 c0x004d (n0x0910-n0x0912) + I cx + 0x13a3e082, // n0x013a c0x004e (n0x0912-n0x091f) o I cy + 0x0024a985, // n0x013b c0x0000 (---------------) + I cymru + 0x0024b084, // n0x013c c0x0000 (---------------) + I cyou + 0x14229ec2, // n0x013d c0x0050 (n0x0920-n0x0922) + I cz + 0x0034d305, // n0x013e c0x0000 (---------------) + I dabur + 0x002a1943, // n0x013f c0x0000 (---------------) + I dad + 0x00223d45, // n0x0140 c0x0000 (---------------) + I dance + 0x0020c7c4, // n0x0141 c0x0000 (---------------) + I date + 0x0020e206, // n0x0142 c0x0000 (---------------) + I dating + 0x00292c46, // n0x0143 c0x0000 (---------------) + I datsun + 0x00265983, // n0x0144 c0x0000 (---------------) + I day + 0x0023f244, // n0x0145 c0x0000 (---------------) + I dclk + 0x0025f303, // n0x0146 c0x0000 (---------------) + I dds + 0x14604d82, // n0x0147 c0x0051 (n0x0922-n0x092a) + I de + 0x00204d84, // n0x0148 c0x0000 (---------------) + I deal + 0x00239046, // n0x0149 c0x0000 (---------------) + I dealer + 0x00204d85, // n0x014a c0x0000 (---------------) + I deals + 0x003a0286, // n0x014b c0x0000 (---------------) + I degree + 0x0033cd88, // n0x014c c0x0000 (---------------) + I delivery + 0x0025a384, // n0x014d c0x0000 (---------------) + I dell + 0x00345f48, // n0x014e c0x0000 (---------------) + I deloitte + 0x00311f45, // n0x014f c0x0000 (---------------) + I delta + 0x002265c8, // n0x0150 c0x0000 (---------------) + I democrat + 0x002abe06, // n0x0151 c0x0000 (---------------) + I dental + 0x002b2407, // n0x0152 c0x0000 (---------------) + I dentist + 0x0022dcc4, // n0x0153 c0x0000 (---------------) + I desi + 0x0022dcc6, // n0x0154 c0x0000 (---------------) + I design + 0x002329c3, // n0x0155 c0x0000 (---------------) + I dev + 0x0037a7c3, // n0x0156 c0x0000 (---------------) + I dhl + 0x002c42c8, // n0x0157 c0x0000 (---------------) + I diamonds + 0x0030ce84, // n0x0158 c0x0000 (---------------) + I diet + 0x00308ec7, // n0x0159 c0x0000 (---------------) + I digital + 0x0024d786, // n0x015a c0x0000 (---------------) + I direct + 0x0024d789, // n0x015b c0x0000 (---------------) + I directory + 0x0031aa48, // n0x015c c0x0000 (---------------) + I discount + 0x00330408, // n0x015d c0x0000 (---------------) + I discover + 0x00229304, // n0x015e c0x0000 (---------------) + I dish + 0x00320843, // n0x015f c0x0000 (---------------) + I diy + 0x00266a02, // n0x0160 c0x0000 (---------------) + I dj + 0x14a494c2, // n0x0161 c0x0052 (n0x092a-n0x092b) + I dk + 0x14e0fa82, // n0x0162 c0x0053 (n0x092b-n0x0930) + I dm + 0x00321fc3, // n0x0163 c0x0000 (---------------) + I dnp + 0x15213282, // n0x0164 c0x0054 (n0x0930-n0x093a) + I do + 0x002ee344, // n0x0165 c0x0000 (---------------) + I docs + 0x00213285, // n0x0166 c0x0000 (---------------) + I dodge + 0x002459c3, // n0x0167 c0x0000 (---------------) + I dog + 0x00236044, // n0x0168 c0x0000 (---------------) + I doha + 0x00339ec7, // n0x0169 c0x0000 (---------------) + I domains + 0x0032f743, // n0x016a c0x0000 (---------------) + I dot + 0x00269fc8, // n0x016b c0x0000 (---------------) + I download + 0x00354745, // n0x016c c0x0000 (---------------) + I drive + 0x00356c44, // n0x016d c0x0000 (---------------) + I dstv + 0x00364483, // n0x016e c0x0000 (---------------) + I dtv + 0x0027c785, // n0x016f c0x0000 (---------------) + I dubai + 0x0027c8c4, // n0x0170 c0x0000 (---------------) + I duck + 0x00390846, // n0x0171 c0x0000 (---------------) + I dunlop + 0x003a6804, // n0x0172 c0x0000 (---------------) + I duns + 0x002008c6, // n0x0173 c0x0000 (---------------) + I dupont + 0x00205146, // n0x0174 c0x0000 (---------------) + I durban + 0x00317284, // n0x0175 c0x0000 (---------------) + I dvag + 0x00212b03, // n0x0176 c0x0000 (---------------) + I dwg + 0x15607a82, // n0x0177 c0x0055 (n0x093a-n0x0942) + I dz + 0x0034ab05, // n0x0178 c0x0000 (---------------) + I earth + 0x0022b543, // n0x0179 c0x0000 (---------------) + I eat + 0x15a09b02, // n0x017a c0x0056 (n0x0942-n0x094e) + I ec + 0x002b94c5, // n0x017b c0x0000 (---------------) + I edeka + 0x0023a783, // n0x017c c0x0000 (---------------) + I edu + 0x0023a789, // n0x017d c0x0000 (---------------) + I education + 0x15e0b342, // n0x017e c0x0057 (n0x094e-n0x0958) + I ee + 0x16608442, // n0x017f c0x0059 (n0x0959-n0x0962) + I eg + 0x002ce585, // n0x0180 c0x0000 (---------------) + I email + 0x002c4646, // n0x0181 c0x0000 (---------------) + I emerck + 0x00356047, // n0x0182 c0x0000 (---------------) + I emerson + 0x002cb4c6, // n0x0183 c0x0000 (---------------) + I energy + 0x00369148, // n0x0184 c0x0000 (---------------) + I engineer + 0x0036914b, // n0x0185 c0x0000 (---------------) + I engineering + 0x002044cb, // n0x0186 c0x0000 (---------------) + I enterprises + 0x0039f945, // n0x0187 c0x0000 (---------------) + I epost + 0x0039ffc5, // n0x0188 c0x0000 (---------------) + I epson + 0x002c2709, // n0x0189 c0x0000 (---------------) + I equipment + 0x01603682, // n0x018a c0x0005 (---------------)* o I er + 0x00317448, // n0x018b c0x0000 (---------------) + I ericsson + 0x0020cb04, // n0x018c c0x0000 (---------------) + I erni + 0x16e00482, // n0x018d c0x005b (n0x0963-n0x0968) + I es + 0x0027a303, // n0x018e c0x0000 (---------------) + I esq + 0x002c2486, // n0x018f c0x0000 (---------------) + I estate + 0x0028d2c8, // n0x0190 c0x0000 (---------------) + I esurance + 0x176053c2, // n0x0191 c0x005d (n0x0969-n0x0971) + I et + 0x002234c8, // n0x0192 c0x0000 (---------------) + I etisalat + 0x00204b82, // n0x0193 c0x0000 (---------------) + I eu + 0x0033c78a, // n0x0194 c0x0000 (---------------) + I eurovision + 0x00228883, // n0x0195 c0x0000 (---------------) + I eus + 0x00232a06, // n0x0196 c0x0000 (---------------) + I events + 0x00203608, // n0x0197 c0x0000 (---------------) + I everbank + 0x00239488, // n0x0198 c0x0000 (---------------) + I exchange + 0x0031ee06, // n0x0199 c0x0000 (---------------) + I expert + 0x00363107, // n0x019a c0x0000 (---------------) + I exposed + 0x00247487, // n0x019b c0x0000 (---------------) + I express + 0x0020ba0a, // n0x019c c0x0000 (---------------) + I extraspace + 0x00290c04, // n0x019d c0x0000 (---------------) + I fage + 0x00214244, // n0x019e c0x0000 (---------------) + I fail + 0x0033b609, // n0x019f c0x0000 (---------------) + I fairwinds + 0x00350405, // n0x01a0 c0x0000 (---------------) + I faith + 0x00208f86, // n0x01a1 c0x0000 (---------------) + I family + 0x00211d03, // n0x01a2 c0x0000 (---------------) + I fan + 0x002e0ec4, // n0x01a3 c0x0000 (---------------) + I fans + 0x00271d04, // n0x01a4 c0x0000 (---------------) + I farm + 0x002ece87, // n0x01a5 c0x0000 (---------------) + I farmers + 0x0022fec7, // n0x01a6 c0x0000 (---------------) + I fashion + 0x0024c204, // n0x01a7 c0x0000 (---------------) + I fast + 0x00211505, // n0x01a8 c0x0000 (---------------) + I fedex + 0x0020b308, // n0x01a9 c0x0000 (---------------) + I feedback + 0x00337007, // n0x01aa c0x0000 (---------------) + I ferrari + 0x00343407, // n0x01ab c0x0000 (---------------) + I ferrero + 0x17a07502, // n0x01ac c0x005e (n0x0971-n0x0974) + I fi + 0x00294744, // n0x01ad c0x0000 (---------------) + I fiat + 0x0035ee48, // n0x01ae c0x0000 (---------------) + I fidelity + 0x00365b84, // n0x01af c0x0000 (---------------) + I fido + 0x0024b784, // n0x01b0 c0x0000 (---------------) + I film + 0x0024bb85, // n0x01b1 c0x0000 (---------------) + I final + 0x0024bcc7, // n0x01b2 c0x0000 (---------------) + I finance + 0x00207509, // n0x01b3 c0x0000 (---------------) + I financial + 0x0024c6c4, // n0x01b4 c0x0000 (---------------) + I fire + 0x0024d4c9, // n0x01b5 c0x0000 (---------------) + I firestone + 0x0024d9c8, // n0x01b6 c0x0000 (---------------) + I firmdale + 0x0024e044, // n0x01b7 c0x0000 (---------------) + I fish + 0x0024e047, // n0x01b8 c0x0000 (---------------) + I fishing + 0x0024f083, // n0x01b9 c0x0000 (---------------) + I fit + 0x0024f807, // n0x01ba c0x0000 (---------------) + I fitness + 0x01615b02, // n0x01bb c0x0005 (---------------)* o I fj + 0x01799fc2, // n0x01bc c0x0005 (---------------)* o I fk + 0x00250686, // n0x01bd c0x0000 (---------------) + I flickr + 0x00251287, // n0x01be c0x0000 (---------------) + I flights + 0x00251c04, // n0x01bf c0x0000 (---------------) + I flir + 0x00252b07, // n0x01c0 c0x0000 (---------------) + I florist + 0x002539c7, // n0x01c1 c0x0000 (---------------) + I flowers + 0x00253f08, // n0x01c2 c0x0000 (---------------) + I flsmidth + 0x002549c3, // n0x01c3 c0x0000 (---------------) + I fly + 0x00242902, // n0x01c4 c0x0000 (---------------) + I fm + 0x002558c2, // n0x01c5 c0x0000 (---------------) + I fo + 0x00255a83, // n0x01c6 c0x0000 (---------------) + I foo + 0x00255a8b, // n0x01c7 c0x0000 (---------------) + I foodnetwork + 0x00306e88, // n0x01c8 c0x0000 (---------------) + I football + 0x0039bf44, // n0x01c9 c0x0000 (---------------) + I ford + 0x00257585, // n0x01ca c0x0000 (---------------) + I forex + 0x00259787, // n0x01cb c0x0000 (---------------) + I forsale + 0x0025b085, // n0x01cc c0x0000 (---------------) + I forum + 0x002b9f4a, // n0x01cd c0x0000 (---------------) + I foundation + 0x0025c143, // n0x01ce c0x0000 (---------------) + I fox + 0x17e00582, // n0x01cf c0x005f (n0x0974-n0x098c) + I fr + 0x002e7d04, // n0x01d0 c0x0000 (---------------) + I free + 0x0025f7c9, // n0x01d1 c0x0000 (---------------) + I fresenius + 0x00263603, // n0x01d2 c0x0000 (---------------) + I frl + 0x002636c7, // n0x01d3 c0x0000 (---------------) + I frogans + 0x0039d609, // n0x01d4 c0x0000 (---------------) + I frontdoor + 0x003980c8, // n0x01d5 c0x0000 (---------------) + I frontier + 0x00204a83, // n0x01d6 c0x0000 (---------------) + I ftr + 0x0027b8c7, // n0x01d7 c0x0000 (---------------) + I fujitsu + 0x0027bdc9, // n0x01d8 c0x0000 (---------------) + I fujixerox + 0x002312c3, // n0x01d9 c0x0000 (---------------) + I fun + 0x00283c84, // n0x01da c0x0000 (---------------) + I fund + 0x00285349, // n0x01db c0x0000 (---------------) + I furniture + 0x00287806, // n0x01dc c0x0000 (---------------) + I futbol + 0x002888c3, // n0x01dd c0x0000 (---------------) + I fyi + 0x00201042, // n0x01de c0x0000 (---------------) + I ga + 0x0021dd43, // n0x01df c0x0000 (---------------) + I gal + 0x00392147, // n0x01e0 c0x0000 (---------------) + I gallery + 0x00336385, // n0x01e1 c0x0000 (---------------) + I gallo + 0x002dd686, // n0x01e2 c0x0000 (---------------) + I gallup + 0x00297cc4, // n0x01e3 c0x0000 (---------------) + I game + 0x003700c5, // n0x01e4 c0x0000 (---------------) + I games + 0x0022cdc3, // n0x01e5 c0x0000 (---------------) + I gap + 0x002190c6, // n0x01e6 c0x0000 (---------------) + I garden + 0x0020d202, // n0x01e7 c0x0000 (---------------) + I gb + 0x00387944, // n0x01e8 c0x0000 (---------------) + I gbiz + 0x00222d42, // n0x01e9 c0x0000 (---------------) + I gd + 0x002fb203, // n0x01ea c0x0000 (---------------) + I gdn + 0x182026c2, // n0x01eb c0x0060 (n0x098c-n0x0993) + I ge + 0x002534c3, // n0x01ec c0x0000 (---------------) + I gea + 0x00218144, // n0x01ed c0x0000 (---------------) + I gent + 0x00218147, // n0x01ee c0x0000 (---------------) + I genting + 0x00324b46, // n0x01ef c0x0000 (---------------) + I george + 0x00269a82, // n0x01f0 c0x0000 (---------------) + I gf + 0x18654282, // n0x01f1 c0x0061 (n0x0993-n0x0996) + I gg + 0x00330644, // n0x01f2 c0x0000 (---------------) + I ggee + 0x18a41602, // n0x01f3 c0x0062 (n0x0996-n0x099b) + I gh + 0x18e134c2, // n0x01f4 c0x0063 (n0x099b-n0x09a1) + I gi + 0x00344f44, // n0x01f5 c0x0000 (---------------) + I gift + 0x00344f45, // n0x01f6 c0x0000 (---------------) + I gifts + 0x00269485, // n0x01f7 c0x0000 (---------------) + I gives + 0x003481c6, // n0x01f8 c0x0000 (---------------) + I giving + 0x1920ce42, // n0x01f9 c0x0064 (n0x09a1-n0x09a6) + I gl + 0x00345e85, // n0x01fa c0x0000 (---------------) + I glade + 0x0039ef45, // n0x01fb c0x0000 (---------------) + I glass + 0x00285d83, // n0x01fc c0x0000 (---------------) + I gle + 0x0020d846, // n0x01fd c0x0000 (---------------) + I global + 0x0020e345, // n0x01fe c0x0000 (---------------) + I globo + 0x00215582, // n0x01ff c0x0000 (---------------) + I gm + 0x00335e45, // n0x0200 c0x0000 (---------------) + I gmail + 0x00215584, // n0x0201 c0x0000 (---------------) + I gmbh + 0x002182c3, // n0x0202 c0x0000 (---------------) + I gmo + 0x0021bac3, // n0x0203 c0x0000 (---------------) + I gmx + 0x19608342, // n0x0204 c0x0065 (n0x09a6-n0x09ac) + I gn + 0x002e9bc7, // n0x0205 c0x0000 (---------------) + I godaddy + 0x0024dbc4, // n0x0206 c0x0000 (---------------) + I gold + 0x0024dbc9, // n0x0207 c0x0000 (---------------) + I goldpoint + 0x0024e1c4, // n0x0208 c0x0000 (---------------) + I golf + 0x00299dc3, // n0x0209 c0x0000 (---------------) + I goo + 0x0031bac9, // n0x020a c0x0000 (---------------) + I goodhands + 0x0034a9c8, // n0x020b c0x0000 (---------------) + I goodyear + 0x0029bb84, // n0x020c c0x0000 (---------------) + I goog + 0x0029bb86, // n0x020d c0x0000 (---------------) + I google + 0x002a36c3, // n0x020e c0x0000 (---------------) + I gop + 0x00211ec3, // n0x020f c0x0000 (---------------) + I got + 0x002dc504, // n0x0210 c0x0000 (---------------) + I gotv + 0x0026cc83, // n0x0211 c0x0000 (---------------) + I gov + 0x19adad02, // n0x0212 c0x0066 (n0x09ac-n0x09b2) + I gp + 0x003010c2, // n0x0213 c0x0000 (---------------) + I gq + 0x19e00c82, // n0x0214 c0x0067 (n0x09b2-n0x09b8) + I gr + 0x00315908, // n0x0215 c0x0000 (---------------) + I grainger + 0x003216c8, // n0x0216 c0x0000 (---------------) + I graphics + 0x0038b986, // n0x0217 c0x0000 (---------------) + I gratis + 0x002503c5, // n0x0218 c0x0000 (---------------) + I green + 0x0022fd05, // n0x0219 c0x0000 (---------------) + I gripe + 0x0020ab45, // n0x021a c0x0000 (---------------) + I group + 0x0023a242, // n0x021b c0x0000 (---------------) + I gs + 0x1a23f142, // n0x021c c0x0068 (n0x09b8-n0x09bf) + I gt + 0x0160dd42, // n0x021d c0x0005 (---------------)* o I gu + 0x00350588, // n0x021e c0x0000 (---------------) + I guardian + 0x0023fd45, // n0x021f c0x0000 (---------------) + I gucci + 0x002e05c4, // n0x0220 c0x0000 (---------------) + I guge + 0x00232905, // n0x0221 c0x0000 (---------------) + I guide + 0x0023cc87, // n0x0222 c0x0000 (---------------) + I guitars + 0x002594c4, // n0x0223 c0x0000 (---------------) + I guru + 0x002167c2, // n0x0224 c0x0000 (---------------) + I gw + 0x1a602302, // n0x0225 c0x0069 (n0x09bf-n0x09c5) + I gy + 0x0030c744, // n0x0226 c0x0000 (---------------) + I hair + 0x0020ccc7, // n0x0227 c0x0000 (---------------) + I hamburg + 0x00394c47, // n0x0228 c0x0000 (---------------) + I hangout + 0x0035fd04, // n0x0229 c0x0000 (---------------) + I haus + 0x00290b43, // n0x022a c0x0000 (---------------) + I hbo + 0x0024b1c4, // n0x022b c0x0000 (---------------) + I hdfc + 0x0024b1c8, // n0x022c c0x0000 (---------------) + I hdfcbank + 0x0036b386, // n0x022d c0x0000 (---------------) + I health + 0x0036b38a, // n0x022e c0x0000 (---------------) + I healthcare + 0x002073c4, // n0x022f c0x0000 (---------------) + I help + 0x0020ebc8, // n0x0230 c0x0000 (---------------) + I helsinki + 0x00254184, // n0x0231 c0x0000 (---------------) + I here + 0x00222106, // n0x0232 c0x0000 (---------------) + I hermes + 0x00292304, // n0x0233 c0x0000 (---------------) + I hgtv + 0x00358b86, // n0x0234 c0x0000 (---------------) + I hiphop + 0x002ebcc9, // n0x0235 c0x0000 (---------------) + I hisamitsu + 0x002a27c7, // n0x0236 c0x0000 (---------------) + I hitachi + 0x0027d3c3, // n0x0237 c0x0000 (---------------) + I hiv + 0x1aa0a882, // n0x0238 c0x006a (n0x09c5-n0x09dd) + I hk + 0x0026da43, // n0x0239 c0x0000 (---------------) + I hkt + 0x0020e942, // n0x023a c0x0000 (---------------) + I hm + 0x1ae1ab42, // n0x023b c0x006b (n0x09dd-n0x09e3) + I hn + 0x002df846, // n0x023c c0x0000 (---------------) + I hockey + 0x0035e208, // n0x023d c0x0000 (---------------) + I holdings + 0x002a5007, // n0x023e c0x0000 (---------------) + I holiday + 0x00274049, // n0x023f c0x0000 (---------------) + I homedepot + 0x00299cc9, // n0x0240 c0x0000 (---------------) + I homegoods + 0x002a60c5, // n0x0241 c0x0000 (---------------) + I homes + 0x002a60c9, // n0x0242 c0x0000 (---------------) + I homesense + 0x002a7985, // n0x0243 c0x0000 (---------------) + I honda + 0x002a8409, // n0x0244 c0x0000 (---------------) + I honeywell + 0x002a91c5, // n0x0245 c0x0000 (---------------) + I horse + 0x00297e04, // n0x0246 c0x0000 (---------------) + I host + 0x00297e07, // n0x0247 c0x0000 (---------------) + I hosting + 0x00234dc3, // n0x0248 c0x0000 (---------------) + I hot + 0x002a98c7, // n0x0249 c0x0000 (---------------) + I hoteles + 0x002a9fc7, // n0x024a c0x0000 (---------------) + I hotmail + 0x002a2105, // n0x024b c0x0000 (---------------) + I house + 0x002a1343, // n0x024c c0x0000 (---------------) + I how + 0x1b20e4c2, // n0x024d c0x006c (n0x09e3-n0x09e8) + I hr + 0x00389404, // n0x024e c0x0000 (---------------) + I hsbc + 0x1b62a682, // n0x024f c0x006d (n0x09e8-n0x09f9) + I ht + 0x0025d0c3, // n0x0250 c0x0000 (---------------) + I htc + 0x1ba195c2, // n0x0251 c0x006e (n0x09f9-n0x0a19) + I hu + 0x002f94c6, // n0x0252 c0x0000 (---------------) + I hughes + 0x0031fe45, // n0x0253 c0x0000 (---------------) + I hyatt + 0x002ac1c7, // n0x0254 c0x0000 (---------------) + I hyundai + 0x00321f03, // n0x0255 c0x0000 (---------------) + I ibm + 0x00239ac4, // n0x0256 c0x0000 (---------------) + I icbc + 0x00206903, // n0x0257 c0x0000 (---------------) + I ice + 0x00209d43, // n0x0258 c0x0000 (---------------) + I icu + 0x1be0c782, // n0x0259 c0x006f (n0x0a19-n0x0a24) + I id + 0x1c600042, // n0x025a c0x0071 (n0x0a25-n0x0a27) + I ie + 0x00365804, // n0x025b c0x0000 (---------------) + I ieee + 0x002428c3, // n0x025c c0x0000 (---------------) + I ifm + 0x00322905, // n0x025d c0x0000 (---------------) + I iinet + 0x00322745, // n0x025e c0x0000 (---------------) + I ikano + 0x1ca02902, // n0x025f c0x0072 (n0x0a27-n0x0a2f) + I il + 0x1d205c42, // n0x0260 c0x0074 (n0x0a30-n0x0a37) + I im + 0x00256dc6, // n0x0261 c0x0000 (---------------) + I imamat + 0x0025ee44, // n0x0262 c0x0000 (---------------) + I imdb + 0x00207084, // n0x0263 c0x0000 (---------------) + I immo + 0x0020708a, // n0x0264 c0x0000 (---------------) + I immobilien + 0x1da013c2, // n0x0265 c0x0076 (n0x0a39-n0x0a46) + I in + 0x0036728a, // n0x0266 c0x0000 (---------------) + I industries + 0x003a1088, // n0x0267 c0x0000 (---------------) + I infiniti + 0x1dfa1244, // n0x0268 c0x0077 (n0x0a46-n0x0a50) + I info + 0x0020e2c3, // n0x0269 c0x0000 (---------------) + I ing + 0x0020ecc3, // n0x026a c0x0000 (---------------) + I ink + 0x0030ea89, // n0x026b c0x0000 (---------------) + I institute + 0x0023e7c9, // n0x026c c0x0000 (---------------) + I insurance + 0x00339fc6, // n0x026d c0x0000 (---------------) + I insure + 0x1e201603, // n0x026e c0x0078 (n0x0a50-n0x0a51) + I int + 0x0024dd45, // n0x026f c0x0000 (---------------) + I intel + 0x0031940d, // n0x0270 c0x0000 (---------------) + I international + 0x002f8946, // n0x0271 c0x0000 (---------------) + I intuit + 0x00203d0b, // n0x0272 c0x0000 (---------------) + I investments + 0x1e600ac2, // n0x0273 c0x0079 (n0x0a51-n0x0a57) + I io + 0x0026bb88, // n0x0274 c0x0000 (---------------) + I ipiranga + 0x1ea00dc2, // n0x0275 c0x007a (n0x0a57-n0x0a5d) + I iq + 0x1ee04302, // n0x0276 c0x007b (n0x0a5d-n0x0a66) + I ir + 0x002a5605, // n0x0277 c0x0000 (---------------) + I irish + 0x1f2006c2, // n0x0278 c0x007c (n0x0a66-n0x0a6e) + I is + 0x0025b307, // n0x0279 c0x0000 (---------------) + I iselect + 0x0033c007, // n0x027a c0x0000 (---------------) + I ismaili + 0x00215003, // n0x027b c0x0000 (---------------) + I ist + 0x00215008, // n0x027c c0x0000 (---------------) + I istanbul + 0x1f601e42, // n0x027d c0x007d (n0x0a6e-n0x0bdf) + I it + 0x002804c4, // n0x027e c0x0000 (---------------) + I itau + 0x00360743, // n0x027f c0x0000 (---------------) + I itv + 0x00323145, // n0x0280 c0x0000 (---------------) + I iveco + 0x0036ab83, // n0x0281 c0x0000 (---------------) + I iwc + 0x0031f906, // n0x0282 c0x0000 (---------------) + I jaguar + 0x00323d44, // n0x0283 c0x0000 (---------------) + I java + 0x00247743, // n0x0284 c0x0000 (---------------) + I jcb + 0x0026e183, // n0x0285 c0x0000 (---------------) + I jcp + 0x1fa06f02, // n0x0286 c0x007e (n0x0bdf-n0x0be2) + I je + 0x003299c4, // n0x0287 c0x0000 (---------------) + I jeep + 0x0034ea85, // n0x0288 c0x0000 (---------------) + I jetzt + 0x00360f47, // n0x0289 c0x0000 (---------------) + I jewelry + 0x00278d43, // n0x028a c0x0000 (---------------) + I jio + 0x002ac643, // n0x028b c0x0000 (---------------) + I jlc + 0x002ad103, // n0x028c c0x0000 (---------------) + I jll + 0x016308c2, // n0x028d c0x0005 (---------------)* o I jm + 0x002ad1c3, // n0x028e c0x0000 (---------------) + I jmp + 0x002ad803, // n0x028f c0x0000 (---------------) + I jnj + 0x1fe04042, // n0x0290 c0x007f (n0x0be2-n0x0bea) + I jo + 0x002ddc44, // n0x0291 c0x0000 (---------------) + I jobs + 0x0027cb06, // n0x0292 c0x0000 (---------------) + I joburg + 0x00204043, // n0x0293 c0x0000 (---------------) + I jot + 0x002adb83, // n0x0294 c0x0000 (---------------) + I joy + 0x202ae3c2, // n0x0295 c0x0080 (n0x0bea-n0x0c59) + I jp + 0x002ae3c8, // n0x0296 c0x0000 (---------------) + I jpmorgan + 0x002aefc4, // n0x0297 c0x0000 (---------------) + I jprs + 0x002d7906, // n0x0298 c0x0000 (---------------) + I juegos + 0x002af287, // n0x0299 c0x0000 (---------------) + I juniper + 0x00227e46, // n0x029a c0x0000 (---------------) + I kaufen + 0x00238144, // n0x029b c0x0000 (---------------) + I kddi + 0x2de025c2, // n0x029c c0x00b7 (n0x12ed-n0x12ee)* o I ke + 0x00234c8b, // n0x029d c0x0000 (---------------) + I kerryhotels + 0x002e2c0e, // n0x029e c0x0000 (---------------) + I kerrylogistics + 0x00220d0f, // n0x029f c0x0000 (---------------) + I kerryproperties + 0x0023f303, // n0x02a0 c0x0000 (---------------) + I kfh + 0x2e6b5502, // n0x02a1 c0x00b9 (n0x12ef-n0x12f5) + I kg + 0x0161acc2, // n0x02a2 c0x0005 (---------------)* o I kh + 0x2ea01e02, // n0x02a3 c0x00ba (n0x12f5-n0x12fc) + I ki + 0x00226f83, // n0x02a4 c0x0000 (---------------) + I kia + 0x002303c3, // n0x02a5 c0x0000 (---------------) + I kim + 0x002e7706, // n0x02a6 c0x0000 (---------------) + I kinder + 0x0037c506, // n0x02a7 c0x0000 (---------------) + I kindle + 0x003703c7, // n0x02a8 c0x0000 (---------------) + I kitchen + 0x002eed84, // n0x02a9 c0x0000 (---------------) + I kiwi + 0x2ee316c2, // n0x02aa c0x00bb (n0x12fc-n0x130d) + I km + 0x2f269c82, // n0x02ab c0x00bc (n0x130d-n0x1311) + I kn + 0x0036bd45, // n0x02ac c0x0000 (---------------) + I koeln + 0x002aa707, // n0x02ad c0x0000 (---------------) + I komatsu + 0x0035cbc6, // n0x02ae c0x0000 (---------------) + I kosher + 0x2f60d782, // n0x02af c0x00bd (n0x1311-n0x1317) + I kp + 0x0020d784, // n0x02b0 c0x0000 (---------------) + I kpmg + 0x0036a3c3, // n0x02b1 c0x0000 (---------------) + I kpn + 0x2fa06fc2, // n0x02b2 c0x00be (n0x1317-n0x1335) + I kr + 0x0034df03, // n0x02b3 c0x0000 (---------------) + I krd + 0x003a2b04, // n0x02b4 c0x0000 (---------------) + I kred + 0x002b5449, // n0x02b5 c0x0000 (---------------) + I kuokgroup + 0x016bd182, // n0x02b6 c0x0005 (---------------)* o I kw + 0x2fe36902, // n0x02b7 c0x00bf (n0x1335-n0x133a) + I ky + 0x00269c06, // n0x02b8 c0x0000 (---------------) + I kyknet + 0x002be0c5, // n0x02b9 c0x0000 (---------------) + I kyoto + 0x30392a42, // n0x02ba c0x00c0 (n0x133a-n0x1340) + I kz + 0x30600802, // n0x02bb c0x00c1 (n0x1340-n0x1349) + I la + 0x0033aa87, // n0x02bc c0x0000 (---------------) + I lacaixa + 0x00293449, // n0x02bd c0x0000 (---------------) + I ladbrokes + 0x00352d0b, // n0x02be c0x0000 (---------------) + I lamborghini + 0x00247245, // n0x02bf c0x0000 (---------------) + I lamer + 0x0036c449, // n0x02c0 c0x0000 (---------------) + I lancaster + 0x002c0706, // n0x02c1 c0x0000 (---------------) + I lancia + 0x00259007, // n0x02c2 c0x0000 (---------------) + I lancome + 0x00200804, // n0x02c3 c0x0000 (---------------) + I land + 0x0025e089, // n0x02c4 c0x0000 (---------------) + I landrover + 0x0035a387, // n0x02c5 c0x0000 (---------------) + I lanxess + 0x00279f47, // n0x02c6 c0x0000 (---------------) + I lasalle + 0x00223603, // n0x02c7 c0x0000 (---------------) + I lat + 0x0025ef86, // n0x02c8 c0x0000 (---------------) + I latino + 0x002cca47, // n0x02c9 c0x0000 (---------------) + I latrobe + 0x00274483, // n0x02ca c0x0000 (---------------) + I law + 0x00274486, // n0x02cb c0x0000 (---------------) + I lawyer + 0x30a02942, // n0x02cc c0x00c2 (n0x1349-n0x134e) + I lb + 0x30e3aa02, // n0x02cd c0x00c3 (n0x134e-n0x1354) + I lc + 0x00226843, // n0x02ce c0x0000 (---------------) + I lds + 0x0027a085, // n0x02cf c0x0000 (---------------) + I lease + 0x0022c487, // n0x02d0 c0x0000 (---------------) + I leclerc + 0x0037c006, // n0x02d1 c0x0000 (---------------) + I lefrak + 0x00336305, // n0x02d2 c0x0000 (---------------) + I legal + 0x0024db44, // n0x02d3 c0x0000 (---------------) + I lego + 0x00241385, // n0x02d4 c0x0000 (---------------) + I lexus + 0x002e65c4, // n0x02d5 c0x0000 (---------------) + I lgbt + 0x31207202, // n0x02d6 c0x00c4 (n0x1354-n0x1355) + I li + 0x00308447, // n0x02d7 c0x0000 (---------------) + I liaison + 0x002bb904, // n0x02d8 c0x0000 (---------------) + I lidl + 0x0023e6c4, // n0x02d9 c0x0000 (---------------) + I life + 0x0023e6cd, // n0x02da c0x0000 (---------------) + I lifeinsurance + 0x00253cc9, // n0x02db c0x0000 (---------------) + I lifestyle + 0x00312248, // n0x02dc c0x0000 (---------------) + I lighting + 0x00258c44, // n0x02dd c0x0000 (---------------) + I like + 0x00249785, // n0x02de c0x0000 (---------------) + I lilly + 0x0025d747, // n0x02df c0x0000 (---------------) + I limited + 0x0025db44, // n0x02e0 c0x0000 (---------------) + I limo + 0x0022e787, // n0x02e1 c0x0000 (---------------) + I lincoln + 0x00345ac5, // n0x02e2 c0x0000 (---------------) + I linde + 0x00398ec4, // n0x02e3 c0x0000 (---------------) + I link + 0x002d3a85, // n0x02e4 c0x0000 (---------------) + I lipsy + 0x002622c4, // n0x02e5 c0x0000 (---------------) + I live + 0x002414c6, // n0x02e6 c0x0000 (---------------) + I living + 0x0025da45, // n0x02e7 c0x0000 (---------------) + I lixil + 0x3160d742, // n0x02e8 c0x00c5 (n0x1355-n0x1364) + I lk + 0x00210b84, // n0x02e9 c0x0000 (---------------) + I loan + 0x00210b85, // n0x02ea c0x0000 (---------------) + I loans + 0x00376f06, // n0x02eb c0x0000 (---------------) + I locker + 0x00336445, // n0x02ec c0x0000 (---------------) + I locus + 0x002ccfc4, // n0x02ed c0x0000 (---------------) + I loft + 0x002c21c3, // n0x02ee c0x0000 (---------------) + I lol + 0x00321906, // n0x02ef c0x0000 (---------------) + I london + 0x0021b685, // n0x02f0 c0x0000 (---------------) + I lotte + 0x00222845, // n0x02f1 c0x0000 (---------------) + I lotto + 0x00230204, // n0x02f2 c0x0000 (---------------) + I love + 0x00207443, // n0x02f3 c0x0000 (---------------) + I lpl + 0x0020744c, // n0x02f4 c0x0000 (---------------) + I lplfinancial + 0x31a88142, // n0x02f5 c0x00c6 (n0x1364-n0x1369) + I lr + 0x31e04e42, // n0x02f6 c0x00c7 (n0x1369-n0x136b) + I ls + 0x32209e02, // n0x02f7 c0x00c8 (n0x136b-n0x136d) + I lt + 0x00322cc3, // n0x02f8 c0x0000 (---------------) + I ltd + 0x00322cc4, // n0x02f9 c0x0000 (---------------) + I ltda + 0x32602f42, // n0x02fa c0x00c9 (n0x136d-n0x136e) + I lu + 0x002fb348, // n0x02fb c0x0000 (---------------) + I lundbeck + 0x002dd745, // n0x02fc c0x0000 (---------------) + I lupin + 0x0023ca44, // n0x02fd c0x0000 (---------------) + I luxe + 0x0023d206, // n0x02fe c0x0000 (---------------) + I luxury + 0x32a05d02, // n0x02ff c0x00ca (n0x136e-n0x1377) + I lv + 0x32e09082, // n0x0300 c0x00cb (n0x1377-n0x1380) + I ly + 0x33200182, // n0x0301 c0x00cc (n0x1380-n0x1386) + I ma + 0x00375105, // n0x0302 c0x0000 (---------------) + I macys + 0x00317146, // n0x0303 c0x0000 (---------------) + I madrid + 0x00271c44, // n0x0304 c0x0000 (---------------) + I maif + 0x0022bdc6, // n0x0305 c0x0000 (---------------) + I maison + 0x00248d06, // n0x0306 c0x0000 (---------------) + I makeup + 0x002018c3, // n0x0307 c0x0000 (---------------) + I man + 0x0036f20a, // n0x0308 c0x0000 (---------------) + I management + 0x00242c05, // n0x0309 c0x0000 (---------------) + I mango + 0x002f1386, // n0x030a c0x0000 (---------------) + I market + 0x002f1389, // n0x030b c0x0000 (---------------) + I marketing + 0x00331387, // n0x030c c0x0000 (---------------) + I markets + 0x00366448, // n0x030d c0x0000 (---------------) + I marriott + 0x0020f009, // n0x030e c0x0000 (---------------) + I marshalls + 0x002be9c8, // n0x030f c0x0000 (---------------) + I maserati + 0x0022f706, // n0x0310 c0x0000 (---------------) + I mattel + 0x00209c03, // n0x0311 c0x0000 (---------------) + I mba + 0x3362ac02, // n0x0312 c0x00cd (n0x1386-n0x1388) + I mc + 0x0037cec3, // n0x0313 c0x0000 (---------------) + I mcd + 0x0037cec9, // n0x0314 c0x0000 (---------------) + I mcdonalds + 0x00327b88, // n0x0315 c0x0000 (---------------) + I mckinsey + 0x33a4da82, // n0x0316 c0x00ce (n0x1388-n0x1389) + I md + 0x33e03e82, // n0x0317 c0x00cf (n0x1389-n0x1396) + I me + 0x00213ac3, // n0x0318 c0x0000 (---------------) + I med + 0x003025c5, // n0x0319 c0x0000 (---------------) + I media + 0x0026ad84, // n0x031a c0x0000 (---------------) + I meet + 0x002e1809, // n0x031b c0x0000 (---------------) + I melbourne + 0x002c4604, // n0x031c c0x0000 (---------------) + I meme + 0x0026cf88, // n0x031d c0x0000 (---------------) + I memorial + 0x00203e83, // n0x031e c0x0000 (---------------) + I men + 0x002ede44, // n0x031f c0x0000 (---------------) + I menu + 0x0022adc3, // n0x0320 c0x0000 (---------------) + I meo + 0x0023e607, // n0x0321 c0x0000 (---------------) + I metlife + 0x3420d802, // n0x0322 c0x00d0 (n0x1396-n0x139f) + I mg + 0x0025aa42, // n0x0323 c0x0000 (---------------) + I mh + 0x00231f45, // n0x0324 c0x0000 (---------------) + I miami + 0x0026b149, // n0x0325 c0x0000 (---------------) + I microsoft + 0x00209003, // n0x0326 c0x0000 (---------------) + I mil + 0x0027d144, // n0x0327 c0x0000 (---------------) + I mini + 0x003193c4, // n0x0328 c0x0000 (---------------) + I mint + 0x00229ac3, // n0x0329 c0x0000 (---------------) + I mit + 0x0027e0ca, // n0x032a c0x0000 (---------------) + I mitsubishi + 0x34767142, // n0x032b c0x00d1 (n0x139f-n0x13a7) + I mk + 0x34a10b42, // n0x032c c0x00d2 (n0x13a7-n0x13ae) + I ml + 0x002c1243, // n0x032d c0x0000 (---------------) + I mlb + 0x00369503, // n0x032e c0x0000 (---------------) + I mls + 0x016070c2, // n0x032f c0x0005 (---------------)* o I mm + 0x00375603, // n0x0330 c0x0000 (---------------) + I mma + 0x34e1fdc2, // n0x0331 c0x00d3 (n0x13ae-n0x13b2) + I mn + 0x0021fdc4, // n0x0332 c0x0000 (---------------) + I mnet + 0x35207102, // n0x0333 c0x00d4 (n0x13b2-n0x13b7) + I mo + 0x35607104, // n0x0334 c0x00d5 (n0x13b7-n0x13b8) + I mobi + 0x002e2606, // n0x0335 c0x0000 (---------------) + I mobily + 0x0026c084, // n0x0336 c0x0000 (---------------) + I moda + 0x002d7d03, // n0x0337 c0x0000 (---------------) + I moe + 0x00282043, // n0x0338 c0x0000 (---------------) + I moi + 0x002e3783, // n0x0339 c0x0000 (---------------) + I mom + 0x00244dc6, // n0x033a c0x0000 (---------------) + I monash + 0x002c6d85, // n0x033b c0x0000 (---------------) + I money + 0x002c1e07, // n0x033c c0x0000 (---------------) + I monster + 0x00258ec9, // n0x033d c0x0000 (---------------) + I montblanc + 0x002c5285, // n0x033e c0x0000 (---------------) + I mopar + 0x002c6cc6, // n0x033f c0x0000 (---------------) + I mormon + 0x002c72c8, // n0x0340 c0x0000 (---------------) + I mortgage + 0x002c74c6, // n0x0341 c0x0000 (---------------) + I moscow + 0x00278644, // n0x0342 c0x0000 (---------------) + I moto + 0x0029af0b, // n0x0343 c0x0000 (---------------) + I motorcycles + 0x002c9083, // n0x0344 c0x0000 (---------------) + I mov + 0x002c9085, // n0x0345 c0x0000 (---------------) + I movie + 0x002c91c8, // n0x0346 c0x0000 (---------------) + I movistar + 0x0022a482, // n0x0347 c0x0000 (---------------) + I mp + 0x0033ad82, // n0x0348 c0x0000 (---------------) + I mq + 0x35a4aa02, // n0x0349 c0x00d6 (n0x13b8-n0x13ba) + I mr + 0x35e0f702, // n0x034a c0x00d7 (n0x13ba-n0x13bf) + I ms + 0x0025d643, // n0x034b c0x0000 (---------------) + I msd + 0x36204c02, // n0x034c c0x00d8 (n0x13bf-n0x13c3) + I mt + 0x0026c8c3, // n0x034d c0x0000 (---------------) + I mtn + 0x002c94c4, // n0x034e c0x0000 (---------------) + I mtpc + 0x002c9d03, // n0x034f c0x0000 (---------------) + I mtr + 0x36a03ac2, // n0x0350 c0x00da (n0x13c4-n0x13cb) + I mu + 0x002cbb0b, // n0x0351 c0x0000 (---------------) + I multichoice + 0x36ed0106, // n0x0352 c0x00db (n0x13cb-n0x15ef) + I museum + 0x0023db46, // n0x0353 c0x0000 (---------------) + I mutual + 0x002d0748, // n0x0354 c0x0000 (---------------) + I mutuelle + 0x372b7382, // n0x0355 c0x00dc (n0x15ef-n0x15fd) + I mv + 0x3760fc82, // n0x0356 c0x00dd (n0x15fd-n0x1608) + I mw + 0x37a1bb02, // n0x0357 c0x00de (n0x1608-n0x160e) + I mx + 0x37e26f02, // n0x0358 c0x00df (n0x160e-n0x1616) + I my + 0x38214382, // n0x0359 c0x00e0 (n0x1616-n0x1617)* o I mz + 0x0021438b, // n0x035a c0x0000 (---------------) + I mzansimagic + 0x38601402, // n0x035b c0x00e1 (n0x1617-n0x1628) + I na + 0x00223703, // n0x035c c0x0000 (---------------) + I nab + 0x002393c5, // n0x035d c0x0000 (---------------) + I nadex + 0x0030f646, // n0x035e c0x0000 (---------------) + I nagoya + 0x38a05284, // n0x035f c0x00e2 (n0x1628-n0x162a) + I name + 0x0028cec7, // n0x0360 c0x0000 (---------------) + I naspers + 0x00238e4a, // n0x0361 c0x0000 (---------------) + I nationwide + 0x002ea486, // n0x0362 c0x0000 (---------------) + I natura + 0x0039fb84, // n0x0363 c0x0000 (---------------) + I navy + 0x0025d243, // n0x0364 c0x0000 (---------------) + I nba + 0x39600642, // n0x0365 c0x00e5 (n0x162c-n0x162d) + I nc + 0x00202c02, // n0x0366 c0x0000 (---------------) + I ne + 0x00249b43, // n0x0367 c0x0000 (---------------) + I nec + 0x39a1fe03, // n0x0368 c0x00e6 (n0x162d-n0x1663) + I net + 0x003928c7, // n0x0369 c0x0000 (---------------) + I netbank + 0x0025d947, // n0x036a c0x0000 (---------------) + I netflix + 0x00255b87, // n0x036b c0x0000 (---------------) + I network + 0x00228847, // n0x036c c0x0000 (---------------) + I neustar + 0x00221dc3, // n0x036d c0x0000 (---------------) + I new + 0x002f0d8a, // n0x036e c0x0000 (---------------) + I newholland + 0x00221dc4, // n0x036f c0x0000 (---------------) + I news + 0x0024d684, // n0x0370 c0x0000 (---------------) + I next + 0x0024d68a, // n0x0371 c0x0000 (---------------) + I nextdirect + 0x0026d605, // n0x0372 c0x0000 (---------------) + I nexus + 0x3ae00542, // n0x0373 c0x00eb (n0x166b-n0x1675) + I nf + 0x00251bc3, // n0x0374 c0x0000 (---------------) + I nfl + 0x3b202802, // n0x0375 c0x00ec (n0x1675-n0x167f) + I ng + 0x00202d03, // n0x0376 c0x0000 (---------------) + I ngo + 0x0026da03, // n0x0377 c0x0000 (---------------) + I nhk + 0x3ba03182, // n0x0378 c0x00ee (n0x1680-n0x168e) o I ni + 0x002a6b04, // n0x0379 c0x0000 (---------------) + I nico + 0x0021da84, // n0x037a c0x0000 (---------------) + I nike + 0x00206b05, // n0x037b c0x0000 (---------------) + I nikon + 0x002c8e05, // n0x037c c0x0000 (---------------) + I ninja + 0x0022e906, // n0x037d c0x0000 (---------------) + I nissan + 0x0022ec86, // n0x037e c0x0000 (---------------) + I nissay + 0x3be47802, // n0x037f c0x00ef (n0x168e-n0x1691) + I nl + 0x3c200c02, // n0x0380 c0x00f0 (n0x1691-n0x1967) + I no + 0x00318785, // n0x0381 c0x0000 (---------------) + I nokia + 0x0023d852, // n0x0382 c0x0000 (---------------) + I northwesternmutual + 0x00366106, // n0x0383 c0x0000 (---------------) + I norton + 0x00224d83, // n0x0384 c0x0000 (---------------) + I now + 0x0029cec6, // n0x0385 c0x0000 (---------------) + I nowruz + 0x00224d85, // n0x0386 c0x0000 (---------------) + I nowtv + 0x01610502, // n0x0387 c0x0005 (---------------)* o I np + 0x4460d382, // n0x0388 c0x0111 (n0x198f-n0x1996) + I nr + 0x002e23c3, // n0x0389 c0x0000 (---------------) + I nra + 0x002b5e83, // n0x038a c0x0000 (---------------) + I nrw + 0x00373b03, // n0x038b c0x0000 (---------------) + I ntt + 0x44a017c2, // n0x038c c0x0112 (n0x1996-n0x1999) + I nu + 0x0036ef83, // n0x038d c0x0000 (---------------) + I nyc + 0x44e094c2, // n0x038e c0x0113 (n0x1999-n0x19a9) + I nz + 0x00207143, // n0x038f c0x0000 (---------------) + I obi + 0x002ddc88, // n0x0390 c0x0000 (---------------) + I observer + 0x0020b283, // n0x0391 c0x0000 (---------------) + I off + 0x00221686, // n0x0392 c0x0000 (---------------) + I office + 0x00395b47, // n0x0393 c0x0000 (---------------) + I okinawa + 0x0020a9c6, // n0x0394 c0x0000 (---------------) + I olayan + 0x0020a9cb, // n0x0395 c0x0000 (---------------) + I olayangroup + 0x0039fac7, // n0x0396 c0x0000 (---------------) + I oldnavy + 0x00389204, // n0x0397 c0x0000 (---------------) + I ollo + 0x456014c2, // n0x0398 c0x0115 (n0x19aa-n0x19b3) + I om + 0x002dd5c5, // n0x0399 c0x0000 (---------------) + I omega + 0x00214843, // n0x039a c0x0000 (---------------) + I one + 0x002082c3, // n0x039b c0x0000 (---------------) + I ong + 0x003175c3, // n0x039c c0x0000 (---------------) + I onl + 0x003175c6, // n0x039d c0x0000 (---------------) + I online + 0x003a008a, // n0x039e c0x0000 (---------------) + I onyourside + 0x0028d703, // n0x039f c0x0000 (---------------) + I ooo + 0x0023de44, // n0x03a0 c0x0000 (---------------) + I open + 0x00224206, // n0x03a1 c0x0000 (---------------) + I oracle + 0x00396286, // n0x03a2 c0x0000 (---------------) + I orange + 0x45a2d1c3, // n0x03a3 c0x0116 (n0x19b3-n0x19f0) + I org + 0x002ae487, // n0x03a4 c0x0000 (---------------) + I organic + 0x002db3cd, // n0x03a5 c0x0000 (---------------) + I orientexpress + 0x00383487, // n0x03a6 c0x0000 (---------------) + I origins + 0x0029ac45, // n0x03a7 c0x0000 (---------------) + I osaka + 0x00269e06, // n0x03a8 c0x0000 (---------------) + I otsuka + 0x0021b6c3, // n0x03a9 c0x0000 (---------------) + I ott + 0x0020da83, // n0x03aa c0x0000 (---------------) + I ovh + 0x4720ac42, // n0x03ab c0x011c (n0x1a2d-n0x1a38) + I pa + 0x002eaf04, // n0x03ac c0x0000 (---------------) + I page + 0x0024c94c, // n0x03ad c0x0000 (---------------) + I pamperedchef + 0x002646c9, // n0x03ae c0x0000 (---------------) + I panasonic + 0x00338507, // n0x03af c0x0000 (---------------) + I panerai + 0x00277905, // n0x03b0 c0x0000 (---------------) + I paris + 0x002994c4, // n0x03b1 c0x0000 (---------------) + I pars + 0x002a5308, // n0x03b2 c0x0000 (---------------) + I partners + 0x002ad245, // n0x03b3 c0x0000 (---------------) + I parts + 0x002b4c45, // n0x03b4 c0x0000 (---------------) + I party + 0x002cc549, // n0x03b5 c0x0000 (---------------) + I passagens + 0x002bc0c3, // n0x03b6 c0x0000 (---------------) + I pay + 0x002bc0c4, // n0x03b7 c0x0000 (---------------) + I payu + 0x002c9544, // n0x03b8 c0x0000 (---------------) + I pccw + 0x47607782, // n0x03b9 c0x011d (n0x1a38-n0x1a40) + I pe + 0x00207783, // n0x03ba c0x0000 (---------------) + I pet + 0x47af7d02, // n0x03bb c0x011e (n0x1a40-n0x1a43) + I pf + 0x002f7d06, // n0x03bc c0x0000 (---------------) + I pfizer + 0x016495c2, // n0x03bd c0x0005 (---------------)* o I pg + 0x47e00d42, // n0x03be c0x011f (n0x1a43-n0x1a4b) + I ph + 0x00375008, // n0x03bf c0x0000 (---------------) + I pharmacy + 0x002d39c7, // n0x03c0 c0x0000 (---------------) + I philips + 0x00299085, // n0x03c1 c0x0000 (---------------) + I photo + 0x002d404b, // n0x03c2 c0x0000 (---------------) + I photography + 0x002d11c6, // n0x03c3 c0x0000 (---------------) + I photos + 0x002d4246, // n0x03c4 c0x0000 (---------------) + I physio + 0x002d43c6, // n0x03c5 c0x0000 (---------------) + I piaget + 0x00225704, // n0x03c6 c0x0000 (---------------) + I pics + 0x002d4b46, // n0x03c7 c0x0000 (---------------) + I pictet + 0x002d5008, // n0x03c8 c0x0000 (---------------) + I pictures + 0x00241b83, // n0x03c9 c0x0000 (---------------) + I pid + 0x002699c3, // n0x03ca c0x0000 (---------------) + I pin + 0x002699c4, // n0x03cb c0x0000 (---------------) + I ping + 0x002d6d84, // n0x03cc c0x0000 (---------------) + I pink + 0x002d7107, // n0x03cd c0x0000 (---------------) + I pioneer + 0x002d85c5, // n0x03ce c0x0000 (---------------) + I pizza + 0x482d8702, // n0x03cf c0x0120 (n0x1a4b-n0x1a59) + I pk + 0x486063c2, // n0x03d0 c0x0121 (n0x1a59-n0x1afe) + I pl + 0x002063c5, // n0x03d1 c0x0000 (---------------) + I place + 0x0029e944, // n0x03d2 c0x0000 (---------------) + I play + 0x002dad4b, // n0x03d3 c0x0000 (---------------) + I playstation + 0x002dc348, // n0x03d4 c0x0000 (---------------) + I plumbing + 0x002dcac4, // n0x03d5 c0x0000 (---------------) + I plus + 0x0020d7c2, // n0x03d6 c0x0000 (---------------) + I pm + 0x48e493c2, // n0x03d7 c0x0123 (n0x1b2d-n0x1b32) + I pn + 0x002aee03, // n0x03d8 c0x0000 (---------------) + I pnc + 0x002dcf04, // n0x03d9 c0x0000 (---------------) + I pohl + 0x002dd005, // n0x03da c0x0000 (---------------) + I poker + 0x002de547, // n0x03db c0x0000 (---------------) + I politie + 0x002e0104, // n0x03dc c0x0000 (---------------) + I porn + 0x0035fe04, // n0x03dd c0x0000 (---------------) + I post + 0x49204602, // n0x03de c0x0124 (n0x1b32-n0x1b3f) + I pr + 0x003598c9, // n0x03df c0x0000 (---------------) + I pramerica + 0x002e0b05, // n0x03e0 c0x0000 (---------------) + I praxi + 0x00247505, // n0x03e1 c0x0000 (---------------) + I press + 0x002e1745, // n0x03e2 c0x0000 (---------------) + I prime + 0x49620e43, // n0x03e3 c0x0125 (n0x1b3f-n0x1b4a) + I pro + 0x002e2044, // n0x03e4 c0x0000 (---------------) + I prod + 0x002e204b, // n0x03e5 c0x0000 (---------------) + I productions + 0x002e2484, // n0x03e6 c0x0000 (---------------) + I prof + 0x002e278b, // n0x03e7 c0x0000 (---------------) + I progressive + 0x002e36c5, // n0x03e8 c0x0000 (---------------) + I promo + 0x00220e4a, // n0x03e9 c0x0000 (---------------) + I properties + 0x002e3e48, // n0x03ea c0x0000 (---------------) + I property + 0x002e404a, // n0x03eb c0x0000 (---------------) + I protection + 0x002e42c3, // n0x03ec c0x0000 (---------------) + I pru + 0x002e42ca, // n0x03ed c0x0000 (---------------) + I prudential + 0x49a09342, // n0x03ee c0x0126 (n0x1b4a-n0x1b51) + I ps + 0x49e8c9c2, // n0x03ef c0x0127 (n0x1b51-n0x1b5a) + I pt + 0x00297403, // n0x03f0 c0x0000 (---------------) + I pub + 0x4a2e5942, // n0x03f1 c0x0128 (n0x1b5a-n0x1b60) + I pw + 0x002e5943, // n0x03f2 c0x0000 (---------------) + I pwc + 0x4a734802, // n0x03f3 c0x0129 (n0x1b60-n0x1b67) + I py + 0x4ab14682, // n0x03f4 c0x012a (n0x1b67-n0x1b70) + I qa + 0x002e6444, // n0x03f5 c0x0000 (---------------) + I qpon + 0x0021b906, // n0x03f6 c0x0000 (---------------) + I quebec + 0x0022bb05, // n0x03f7 c0x0000 (---------------) + I quest + 0x002e6ac3, // n0x03f8 c0x0000 (---------------) + I qvc + 0x00355bc6, // n0x03f9 c0x0000 (---------------) + I racing + 0x00351c84, // n0x03fa c0x0000 (---------------) + I raid + 0x4ae07002, // n0x03fb c0x012b (n0x1b70-n0x1b74) + I re + 0x002d3404, // n0x03fc c0x0000 (---------------) + I read + 0x002c238a, // n0x03fd c0x0000 (---------------) + I realestate + 0x00338907, // n0x03fe c0x0000 (---------------) + I realtor + 0x0031fc86, // n0x03ff c0x0000 (---------------) + I realty + 0x0031c747, // n0x0400 c0x0000 (---------------) + I recipes + 0x00244803, // n0x0401 c0x0000 (---------------) + I red + 0x003a2b48, // n0x0402 c0x0000 (---------------) + I redstone + 0x00337f4b, // n0x0403 c0x0000 (---------------) + I redumbrella + 0x002c9b05, // n0x0404 c0x0000 (---------------) + I rehab + 0x0033a0c5, // n0x0405 c0x0000 (---------------) + I reise + 0x0033a0c6, // n0x0406 c0x0000 (---------------) + I reisen + 0x002b75c4, // n0x0407 c0x0000 (---------------) + I reit + 0x00327f48, // n0x0408 c0x0000 (---------------) + I reliance + 0x00209ec3, // n0x0409 c0x0000 (---------------) + I ren + 0x0020bd84, // n0x040a c0x0000 (---------------) + I rent + 0x0020bd87, // n0x040b c0x0000 (---------------) + I rentals + 0x0022b7c6, // n0x040c c0x0000 (---------------) + I repair + 0x00309586, // n0x040d c0x0000 (---------------) + I report + 0x0029f6ca, // n0x040e c0x0000 (---------------) + I republican + 0x0024d544, // n0x040f c0x0000 (---------------) + I rest + 0x0037adca, // n0x0410 c0x0000 (---------------) + I restaurant + 0x002eaac6, // n0x0411 c0x0000 (---------------) + I review + 0x002eaac7, // n0x0412 c0x0000 (---------------) + I reviews + 0x00257607, // n0x0413 c0x0000 (---------------) + I rexroth + 0x00273a04, // n0x0414 c0x0000 (---------------) + I rich + 0x00273a09, // n0x0415 c0x0000 (---------------) + I richardli + 0x002b6f85, // n0x0416 c0x0000 (---------------) + I ricoh + 0x0034618b, // n0x0417 c0x0000 (---------------) + I rightathome + 0x00257f83, // n0x0418 c0x0000 (---------------) + I ril + 0x00200a83, // n0x0419 c0x0000 (---------------) + I rio + 0x0022fd43, // n0x041a c0x0000 (---------------) + I rip + 0x002684c4, // n0x041b c0x0000 (---------------) + I rmit + 0x4b202202, // n0x041c c0x012c (n0x1b74-n0x1b80) + I ro + 0x00289806, // n0x041d c0x0000 (---------------) + I rocher + 0x002a10c5, // n0x041e c0x0000 (---------------) + I rocks + 0x002d2f85, // n0x041f c0x0000 (---------------) + I rodeo + 0x0039c1c6, // n0x0420 c0x0000 (---------------) + I rogers + 0x0037ed04, // n0x0421 c0x0000 (---------------) + I room + 0x4b609702, // n0x0422 c0x012d (n0x1b80-n0x1b87) + I rs + 0x0039c2c4, // n0x0423 c0x0000 (---------------) + I rsvp + 0x4ba11302, // n0x0424 c0x012e (n0x1b87-n0x1c0a) + I ru + 0x00236144, // n0x0425 c0x0000 (---------------) + I ruhr + 0x00222b43, // n0x0426 c0x0000 (---------------) + I run + 0x4beb5ec2, // n0x0427 c0x012f (n0x1c0a-n0x1c13) + I rw + 0x003274c3, // n0x0428 c0x0000 (---------------) + I rwe + 0x0036acc6, // n0x0429 c0x0000 (---------------) + I ryukyu + 0x4c2004c2, // n0x042a c0x0130 (n0x1c13-n0x1c1b) + I sa + 0x0030c348, // n0x042b c0x0000 (---------------) + I saarland + 0x00215944, // n0x042c c0x0000 (---------------) + I safe + 0x00215946, // n0x042d c0x0000 (---------------) + I safety + 0x00307fc6, // n0x042e c0x0000 (---------------) + I sakura + 0x00259844, // n0x042f c0x0000 (---------------) + I sale + 0x00321885, // n0x0430 c0x0000 (---------------) + I salon + 0x00398bc8, // n0x0431 c0x0000 (---------------) + I samsclub + 0x0039edc7, // n0x0432 c0x0000 (---------------) + I samsung + 0x003a0747, // n0x0433 c0x0000 (---------------) + I sandvik + 0x003a074f, // n0x0434 c0x0000 (---------------) + I sandvikcoromant + 0x00294646, // n0x0435 c0x0000 (---------------) + I sanofi + 0x00219dc3, // n0x0436 c0x0000 (---------------) + I sap + 0x00219dc4, // n0x0437 c0x0000 (---------------) + I sapo + 0x0022b604, // n0x0438 c0x0000 (---------------) + I sarl + 0x00228143, // n0x0439 c0x0000 (---------------) + I sas + 0x00222244, // n0x043a c0x0000 (---------------) + I save + 0x00235144, // n0x043b c0x0000 (---------------) + I saxo + 0x4c62d142, // n0x043c c0x0131 (n0x1c1b-n0x1c20) + I sb + 0x00288e03, // n0x043d c0x0000 (---------------) + I sbi + 0x00237503, // n0x043e c0x0000 (---------------) + I sbs + 0x4ca00702, // n0x043f c0x0132 (n0x1c20-n0x1c25) + I sc + 0x00236a03, // n0x0440 c0x0000 (---------------) + I sca + 0x002ee403, // n0x0441 c0x0000 (---------------) + I scb + 0x0021744a, // n0x0442 c0x0000 (---------------) + I schaeffler + 0x002e5d47, // n0x0443 c0x0000 (---------------) + I schmidt + 0x0023ce0c, // n0x0444 c0x0000 (---------------) + I scholarships + 0x0023d0c6, // n0x0445 c0x0000 (---------------) + I school + 0x00241286, // n0x0446 c0x0000 (---------------) + I schule + 0x00242547, // n0x0447 c0x0000 (---------------) + I schwarz + 0x002358c7, // n0x0448 c0x0000 (---------------) + I science + 0x00246cc9, // n0x0449 c0x0000 (---------------) + I scjohnson + 0x0021c544, // n0x044a c0x0000 (---------------) + I scor + 0x00200704, // n0x044b c0x0000 (---------------) + I scot + 0x4ce496c2, // n0x044c c0x0133 (n0x1c25-n0x1c2d) + I sd + 0x4d2046c2, // n0x044d c0x0134 (n0x1c2d-n0x1c56) + I se + 0x00316b84, // n0x044e c0x0000 (---------------) + I seat + 0x0031c646, // n0x044f c0x0000 (---------------) + I secure + 0x00235d48, // n0x0450 c0x0000 (---------------) + I security + 0x0027a144, // n0x0451 c0x0000 (---------------) + I seek + 0x0025b346, // n0x0452 c0x0000 (---------------) + I select + 0x002cb485, // n0x0453 c0x0000 (---------------) + I sener + 0x00206808, // n0x0454 c0x0000 (---------------) + I services + 0x002046c3, // n0x0455 c0x0000 (---------------) + I ses + 0x00251f05, // n0x0456 c0x0000 (---------------) + I seven + 0x00253b43, // n0x0457 c0x0000 (---------------) + I sew + 0x00247603, // n0x0458 c0x0000 (---------------) + I sex + 0x00247604, // n0x0459 c0x0000 (---------------) + I sexy + 0x00256a83, // n0x045a c0x0000 (---------------) + I sfr + 0x4d66d702, // n0x045b c0x0135 (n0x1c56-n0x1c5d) + I sg + 0x4da01342, // n0x045c c0x0136 (n0x1c5d-n0x1c64) + I sh + 0x00257e49, // n0x045d c0x0000 (---------------) + I shangrila + 0x0025b885, // n0x045e c0x0000 (---------------) + I sharp + 0x0025cb44, // n0x045f c0x0000 (---------------) + I shaw + 0x0025fd45, // n0x0460 c0x0000 (---------------) + I shell + 0x00211884, // n0x0461 c0x0000 (---------------) + I shia + 0x002fea47, // n0x0462 c0x0000 (---------------) + I shiksha + 0x003896c5, // n0x0463 c0x0000 (---------------) + I shoes + 0x002be486, // n0x0464 c0x0000 (---------------) + I shouji + 0x002c4484, // n0x0465 c0x0000 (---------------) + I show + 0x002c4488, // n0x0466 c0x0000 (---------------) + I showtime + 0x002c8307, // n0x0467 c0x0000 (---------------) + I shriram + 0x4de0a402, // n0x0468 c0x0137 (n0x1c64-n0x1c65) + I si + 0x00341f84, // n0x0469 c0x0000 (---------------) + I silk + 0x002f7b84, // n0x046a c0x0000 (---------------) + I sina + 0x00285cc7, // n0x046b c0x0000 (---------------) + I singles + 0x002810c4, // n0x046c c0x0000 (---------------) + I site + 0x0022eb82, // n0x046d c0x0000 (---------------) + I sj + 0x4e207842, // n0x046e c0x0138 (n0x1c65-n0x1c66) + I sk + 0x00209743, // n0x046f c0x0000 (---------------) + I ski + 0x002e76c4, // n0x0470 c0x0000 (---------------) + I skin + 0x002368c3, // n0x0471 c0x0000 (---------------) + I sky + 0x002368c5, // n0x0472 c0x0000 (---------------) + I skype + 0x4e624b82, // n0x0473 c0x0139 (n0x1c66-n0x1c6b) + I sl + 0x00375205, // n0x0474 c0x0000 (---------------) + I sling + 0x0024cdc2, // n0x0475 c0x0000 (---------------) + I sm + 0x00368185, // n0x0476 c0x0000 (---------------) + I smart + 0x0035e3c5, // n0x0477 c0x0000 (---------------) + I smile + 0x4ea14182, // n0x0478 c0x013a (n0x1c6b-n0x1c73) + I sn + 0x00214184, // n0x0479 c0x0000 (---------------) + I sncf + 0x4ee05682, // n0x047a c0x013b (n0x1c73-n0x1c76) + I so + 0x00325706, // n0x047b c0x0000 (---------------) + I soccer + 0x002a3986, // n0x047c c0x0000 (---------------) + I social + 0x0026b288, // n0x047d c0x0000 (---------------) + I softbank + 0x002b8688, // n0x047e c0x0000 (---------------) + I software + 0x002f9444, // n0x047f c0x0000 (---------------) + I sohu + 0x00359f05, // n0x0480 c0x0000 (---------------) + I solar + 0x00359d09, // n0x0481 c0x0000 (---------------) + I solutions + 0x00356144, // n0x0482 c0x0000 (---------------) + I song + 0x003a0044, // n0x0483 c0x0000 (---------------) + I sony + 0x002bd0c3, // n0x0484 c0x0000 (---------------) + I soy + 0x0020bb45, // n0x0485 c0x0000 (---------------) + I space + 0x00371ac7, // n0x0486 c0x0000 (---------------) + I spiegel + 0x00209384, // n0x0487 c0x0000 (---------------) + I spot + 0x00332e4d, // n0x0488 c0x0000 (---------------) + I spreadbetting + 0x0033b802, // n0x0489 c0x0000 (---------------) + I sr + 0x0033b803, // n0x048a c0x0000 (---------------) + I srl + 0x0035a503, // n0x048b c0x0000 (---------------) + I srt + 0x4f202742, // n0x048c c0x013c (n0x1c76-n0x1c82) + I st + 0x00380745, // n0x048d c0x0000 (---------------) + I stada + 0x002320c7, // n0x048e c0x0000 (---------------) + I staples + 0x00228904, // n0x048f c0x0000 (---------------) + I star + 0x00228907, // n0x0490 c0x0000 (---------------) + I starhub + 0x0020f209, // n0x0491 c0x0000 (---------------) + I statebank + 0x002c24c9, // n0x0492 c0x0000 (---------------) + I statefarm + 0x003a0dc7, // n0x0493 c0x0000 (---------------) + I statoil + 0x00277743, // n0x0494 c0x0000 (---------------) + I stc + 0x00277748, // n0x0495 c0x0000 (---------------) + I stcgroup + 0x002a8009, // n0x0496 c0x0000 (---------------) + I stockholm + 0x00364547, // n0x0497 c0x0000 (---------------) + I storage + 0x00391185, // n0x0498 c0x0000 (---------------) + I store + 0x002e74c6, // n0x0499 c0x0000 (---------------) + I stream + 0x002e7906, // n0x049a c0x0000 (---------------) + I studio + 0x002e7a85, // n0x049b c0x0000 (---------------) + I study + 0x00253dc5, // n0x049c c0x0000 (---------------) + I style + 0x4f6023c2, // n0x049d c0x013d (n0x1c82-n0x1ca2) + I su + 0x00332385, // n0x049e c0x0000 (---------------) + I sucks + 0x002ba24a, // n0x049f c0x0000 (---------------) + I supersport + 0x002be2c8, // n0x04a0 c0x0000 (---------------) + I supplies + 0x002a7806, // n0x04a1 c0x0000 (---------------) + I supply + 0x002e3907, // n0x04a2 c0x0000 (---------------) + I support + 0x0024c144, // n0x04a3 c0x0000 (---------------) + I surf + 0x002a9e07, // n0x04a4 c0x0000 (---------------) + I surgery + 0x002eef06, // n0x04a5 c0x0000 (---------------) + I suzuki + 0x4fa35f42, // n0x04a6 c0x013e (n0x1ca2-n0x1ca7) + I sv + 0x00376c06, // n0x04a7 c0x0000 (---------------) + I swatch + 0x002f15ca, // n0x04a8 c0x0000 (---------------) + I swiftcover + 0x002f1f85, // n0x04a9 c0x0000 (---------------) + I swiss + 0x4fef2802, // n0x04aa c0x013f (n0x1ca7-n0x1ca8) + I sx + 0x50289a02, // n0x04ab c0x0140 (n0x1ca8-n0x1cae) + I sy + 0x00329bc6, // n0x04ac c0x0000 (---------------) + I sydney + 0x002d5f48, // n0x04ad c0x0000 (---------------) + I symantec + 0x00394e07, // n0x04ae c0x0000 (---------------) + I systems + 0x5060b982, // n0x04af c0x0141 (n0x1cae-n0x1cb1) + I sz + 0x00210d43, // n0x04b0 c0x0000 (---------------) + I tab + 0x003a6506, // n0x04b1 c0x0000 (---------------) + I taipei + 0x0021eb04, // n0x04b2 c0x0000 (---------------) + I talk + 0x00395a06, // n0x04b3 c0x0000 (---------------) + I taobao + 0x00357846, // n0x04b4 c0x0000 (---------------) + I target + 0x00322a0a, // n0x04b5 c0x0000 (---------------) + I tatamotors + 0x0036cc45, // n0x04b6 c0x0000 (---------------) + I tatar + 0x00219906, // n0x04b7 c0x0000 (---------------) + I tattoo + 0x002203c3, // n0x04b8 c0x0000 (---------------) + I tax + 0x002203c4, // n0x04b9 c0x0000 (---------------) + I taxi + 0x00204442, // n0x04ba c0x0000 (---------------) + I tc + 0x0025edc3, // n0x04bb c0x0000 (---------------) + I tci + 0x50a0b182, // n0x04bc c0x0142 (n0x1cb1-n0x1cb2) + I td + 0x002c9683, // n0x04bd c0x0000 (---------------) + I tdk + 0x00367504, // n0x04be c0x0000 (---------------) + I team + 0x002d59c4, // n0x04bf c0x0000 (---------------) + I tech + 0x002d608a, // n0x04c0 c0x0000 (---------------) + I technology + 0x0022f7c3, // n0x04c1 c0x0000 (---------------) + I tel + 0x00286648, // n0x04c2 c0x0000 (---------------) + I telecity + 0x0030ec4a, // n0x04c3 c0x0000 (---------------) + I telefonica + 0x0023fa07, // n0x04c4 c0x0000 (---------------) + I temasek + 0x002f4806, // n0x04c5 c0x0000 (---------------) + I tennis + 0x0032ce44, // n0x04c6 c0x0000 (---------------) + I teva + 0x0025d9c2, // n0x04c7 c0x0000 (---------------) + I tf + 0x00204c42, // n0x04c8 c0x0000 (---------------) + I tg + 0x50e06342, // n0x04c9 c0x0143 (n0x1cb2-n0x1cb9) + I th + 0x0024b183, // n0x04ca c0x0000 (---------------) + I thd + 0x002573c7, // n0x04cb c0x0000 (---------------) + I theater + 0x00355e87, // n0x04cc c0x0000 (---------------) + I theatre + 0x003504cb, // n0x04cd c0x0000 (---------------) + I theguardian + 0x0034d4c4, // n0x04ce c0x0000 (---------------) + I tiaa + 0x002f6847, // n0x04cf c0x0000 (---------------) + I tickets + 0x002de646, // n0x04d0 c0x0000 (---------------) + I tienda + 0x00215707, // n0x04d1 c0x0000 (---------------) + I tiffany + 0x002e5c84, // n0x04d2 c0x0000 (---------------) + I tips + 0x0033d385, // n0x04d3 c0x0000 (---------------) + I tires + 0x002b7905, // n0x04d4 c0x0000 (---------------) + I tirol + 0x51226782, // n0x04d5 c0x0144 (n0x1cb9-n0x1cc8) + I tj + 0x00230886, // n0x04d6 c0x0000 (---------------) + I tjmaxx + 0x0036f443, // n0x04d7 c0x0000 (---------------) + I tjx + 0x0022ad02, // n0x04d8 c0x0000 (---------------) + I tk + 0x00231686, // n0x04d9 c0x0000 (---------------) + I tkmaxx + 0x516007c2, // n0x04da c0x0145 (n0x1cc8-n0x1cc9) + I tl + 0x51a00142, // n0x04db c0x0146 (n0x1cc9-n0x1cd1) + I tm + 0x00200145, // n0x04dc c0x0000 (---------------) + I tmall + 0x51e4f882, // n0x04dd c0x0147 (n0x1cd1-n0x1ce5) + I tn + 0x52208082, // n0x04de c0x0148 (n0x1ce5-n0x1ceb) + I to + 0x00265905, // n0x04df c0x0000 (---------------) + I today + 0x00341c05, // n0x04e0 c0x0000 (---------------) + I tokyo + 0x002199c5, // n0x04e1 c0x0000 (---------------) + I tools + 0x00208083, // n0x04e2 c0x0000 (---------------) + I top + 0x00376345, // n0x04e3 c0x0000 (---------------) + I toray + 0x002d1287, // n0x04e4 c0x0000 (---------------) + I toshiba + 0x0025b605, // n0x04e5 c0x0000 (---------------) + I total + 0x002fd7c5, // n0x04e6 c0x0000 (---------------) + I tours + 0x002dc244, // n0x04e7 c0x0000 (---------------) + I town + 0x0025bb86, // n0x04e8 c0x0000 (---------------) + I toyota + 0x0026dac4, // n0x04e9 c0x0000 (---------------) + I toys + 0x52603002, // n0x04ea c0x0149 (n0x1ceb-n0x1d00) + I tr + 0x002673c5, // n0x04eb c0x0000 (---------------) + I trade + 0x002a4607, // n0x04ec c0x0000 (---------------) + I trading + 0x0022a6c8, // n0x04ed c0x0000 (---------------) + I training + 0x0029bec6, // n0x04ee c0x0000 (---------------) + I travel + 0x0029becd, // n0x04ef c0x0000 (---------------) + I travelchannel + 0x002a1a89, // n0x04f0 c0x0000 (---------------) + I travelers + 0x002a1a92, // n0x04f1 c0x0000 (---------------) + I travelersinsurance + 0x00329245, // n0x04f2 c0x0000 (---------------) + I trust + 0x0033f2c3, // n0x04f3 c0x0000 (---------------) + I trv + 0x5320e842, // n0x04f4 c0x014c (n0x1d02-n0x1d13) + I tt + 0x002e48c4, // n0x04f5 c0x0000 (---------------) + I tube + 0x002f89c3, // n0x04f6 c0x0000 (---------------) + I tui + 0x0035d745, // n0x04f7 c0x0000 (---------------) + I tunes + 0x002f2e45, // n0x04f8 c0x0000 (---------------) + I tushu + 0x53624e42, // n0x04f9 c0x014d (n0x1d13-n0x1d17) + I tv + 0x003644c3, // n0x04fa c0x0000 (---------------) + I tvs + 0x53a4e502, // n0x04fb c0x014e (n0x1d17-n0x1d25) + I tw + 0x53e1fe82, // n0x04fc c0x014f (n0x1d25-n0x1d31) + I tz + 0x54220502, // n0x04fd c0x0150 (n0x1d31-n0x1d80) + I ua + 0x0033bbc5, // n0x04fe c0x0000 (---------------) + I ubank + 0x0024a4c3, // n0x04ff c0x0000 (---------------) + I ubs + 0x00249a48, // n0x0500 c0x0000 (---------------) + I uconnect + 0x54601cc2, // n0x0501 c0x0151 (n0x1d80-n0x1d89) + I ug + 0x54a00f82, // n0x0502 c0x0152 (n0x1d89-n0x1d94) + I uk + 0x002a6ac6, // n0x0503 c0x0000 (---------------) + I unicom + 0x00320a0a, // n0x0504 c0x0000 (---------------) + I university + 0x0020d503, // n0x0505 c0x0000 (---------------) + I uno + 0x00259d43, // n0x0506 c0x0000 (---------------) + I uol + 0x002d5243, // n0x0507 c0x0000 (---------------) + I ups + 0x55602382, // n0x0508 c0x0155 (n0x1d96-n0x1dd5) + I us + 0x63a01802, // n0x0509 c0x018e (n0x1e78-n0x1e7e) + I uy + 0x64211342, // n0x050a c0x0190 (n0x1e7f-n0x1e83) + I uz + 0x002000c2, // n0x050b c0x0000 (---------------) + I va + 0x00376a09, // n0x050c c0x0000 (---------------) + I vacations + 0x002bc5c4, // n0x050d c0x0000 (---------------) + I vana + 0x00344588, // n0x050e c0x0000 (---------------) + I vanguard + 0x646e6b02, // n0x050f c0x0191 (n0x1e83-n0x1e89) + I vc + 0x64a02b82, // n0x0510 c0x0192 (n0x1e89-n0x1e9a) + I ve + 0x00230285, // n0x0511 c0x0000 (---------------) + I vegas + 0x0023b808, // n0x0512 c0x0000 (---------------) + I ventures + 0x002f1788, // n0x0513 c0x0000 (---------------) + I verisign + 0x0039440c, // n0x0514 c0x0000 (---------------) + I versicherung + 0x0023f943, // n0x0515 c0x0000 (---------------) + I vet + 0x0023fd02, // n0x0516 c0x0000 (---------------) + I vg + 0x64e05d42, // n0x0517 c0x0193 (n0x1e9a-n0x1e9f) + I vi + 0x002c5706, // n0x0518 c0x0000 (---------------) + I viajes + 0x002f5685, // n0x0519 c0x0000 (---------------) + I video + 0x0031a003, // n0x051a c0x0000 (---------------) + I vig + 0x00311a06, // n0x051b c0x0000 (---------------) + I viking + 0x002f57c6, // n0x051c c0x0000 (---------------) + I villas + 0x00241543, // n0x051d c0x0000 (---------------) + I vin + 0x002f7ac3, // n0x051e c0x0000 (---------------) + I vip + 0x002f7e86, // n0x051f c0x0000 (---------------) + I virgin + 0x002f8404, // n0x0520 c0x0000 (---------------) + I visa + 0x002b48c6, // n0x0521 c0x0000 (---------------) + I vision + 0x002c9245, // n0x0522 c0x0000 (---------------) + I vista + 0x002f878a, // n0x0523 c0x0000 (---------------) + I vistaprint + 0x00240444, // n0x0524 c0x0000 (---------------) + I viva + 0x002f97c4, // n0x0525 c0x0000 (---------------) + I vivo + 0x0034710a, // n0x0526 c0x0000 (---------------) + I vlaanderen + 0x65203442, // n0x0527 c0x0194 (n0x1e9f-n0x1eac) + I vn + 0x002760c5, // n0x0528 c0x0000 (---------------) + I vodka + 0x002fbd0a, // n0x0529 c0x0000 (---------------) + I volkswagen + 0x002fc945, // n0x052a c0x0000 (---------------) + I volvo + 0x002fd4c4, // n0x052b c0x0000 (---------------) + I vote + 0x002fd5c6, // n0x052c c0x0000 (---------------) + I voting + 0x002fd744, // n0x052d c0x0000 (---------------) + I voto + 0x00231006, // n0x052e c0x0000 (---------------) + I voyage + 0x65672082, // n0x052f c0x0195 (n0x1eac-n0x1eb0) + I vu + 0x0031f5c6, // n0x0530 c0x0000 (---------------) + I vuelos + 0x00320685, // n0x0531 c0x0000 (---------------) + I wales + 0x002010c7, // n0x0532 c0x0000 (---------------) + I walmart + 0x00293986, // n0x0533 c0x0000 (---------------) + I walter + 0x00242744, // n0x0534 c0x0000 (---------------) + I wang + 0x0033d6c7, // n0x0535 c0x0000 (---------------) + I wanggou + 0x0036f146, // n0x0536 c0x0000 (---------------) + I warman + 0x002aca45, // n0x0537 c0x0000 (---------------) + I watch + 0x003a3d87, // n0x0538 c0x0000 (---------------) + I watches + 0x00391887, // n0x0539 c0x0000 (---------------) + I weather + 0x0039188e, // n0x053a c0x0000 (---------------) + I weatherchannel + 0x00221a06, // n0x053b c0x0000 (---------------) + I webcam + 0x0022e645, // n0x053c c0x0000 (---------------) + I weber + 0x00281007, // n0x053d c0x0000 (---------------) + I website + 0x002f08c3, // n0x053e c0x0000 (---------------) + I wed + 0x0032f407, // n0x053f c0x0000 (---------------) + I wedding + 0x0020fe05, // n0x0540 c0x0000 (---------------) + I weibo + 0x002109c4, // n0x0541 c0x0000 (---------------) + I weir + 0x0022fe82, // n0x0542 c0x0000 (---------------) + I wf + 0x003a43c7, // n0x0543 c0x0000 (---------------) + I whoswho + 0x002eee04, // n0x0544 c0x0000 (---------------) + I wien + 0x0037c484, // n0x0545 c0x0000 (---------------) + I wiki + 0x0025a8cb, // n0x0546 c0x0000 (---------------) + I williamhill + 0x0021cbc3, // n0x0547 c0x0000 (---------------) + I win + 0x002afe07, // n0x0548 c0x0000 (---------------) + I windows + 0x0021cbc4, // n0x0549 c0x0000 (---------------) + I wine + 0x002b0f07, // n0x054a c0x0000 (---------------) + I winners + 0x00231c43, // n0x054b c0x0000 (---------------) + I wme + 0x0032ae4d, // n0x054c c0x0000 (---------------) + I wolterskluwer + 0x00380f88, // n0x054d c0x0000 (---------------) + I woodside + 0x00255c44, // n0x054e c0x0000 (---------------) + I work + 0x00351f05, // n0x054f c0x0000 (---------------) + I works + 0x00300b85, // n0x0550 c0x0000 (---------------) + I world + 0x002ff3c3, // n0x0551 c0x0000 (---------------) + I wow + 0x65a0b942, // n0x0552 c0x0196 (n0x1eb0-n0x1eb7) + I ws + 0x003002c3, // n0x0553 c0x0000 (---------------) + I wtc + 0x00300783, // n0x0554 c0x0000 (---------------) + I wtf + 0x0021bb44, // n0x0555 c0x0000 (---------------) + I xbox + 0x0027bec5, // n0x0556 c0x0000 (---------------) + I xerox + 0x00230a07, // n0x0557 c0x0000 (---------------) + I xfinity + 0x00220446, // n0x0558 c0x0000 (---------------) + I xihuan + 0x00367243, // n0x0559 c0x0000 (---------------) + I xin + 0x002317cb, // n0x055a c0x0000 (---------------) + I xn--11b4c3d + 0x0024830b, // n0x055b c0x0000 (---------------) + I xn--1ck2e1b + 0x0026a7cb, // n0x055c c0x0000 (---------------) + I xn--1qqw23a + 0x0027bfca, // n0x055d c0x0000 (---------------) + I xn--30rr7y + 0x002a718b, // n0x055e c0x0000 (---------------) + I xn--3bst00m + 0x002daa8b, // n0x055f c0x0000 (---------------) + I xn--3ds443g + 0x002d3d4c, // n0x0560 c0x0000 (---------------) + I xn--3e0b707e + 0x002f2851, // n0x0561 c0x0000 (---------------) + I xn--3oq18vl8pn36a + 0x00339a8a, // n0x0562 c0x0000 (---------------) + I xn--3pxu8k + 0x0034a00b, // n0x0563 c0x0000 (---------------) + I xn--42c2d9a + 0x00370d8b, // n0x0564 c0x0000 (---------------) + I xn--45brj9c + 0x003a374a, // n0x0565 c0x0000 (---------------) + I xn--45q11c + 0x003a5a0a, // n0x0566 c0x0000 (---------------) + I xn--4gbrim + 0x00300f8d, // n0x0567 c0x0000 (---------------) + I xn--4gq48lf9j + 0x0030218e, // n0x0568 c0x0000 (---------------) + I xn--54b7fta0cc + 0x0030270b, // n0x0569 c0x0000 (---------------) + I xn--55qw42g + 0x003029ca, // n0x056a c0x0000 (---------------) + I xn--55qx5d + 0x00303d11, // n0x056b c0x0000 (---------------) + I xn--5su34j936bgsg + 0x0030414a, // n0x056c c0x0000 (---------------) + I xn--5tzm5g + 0x0030464b, // n0x056d c0x0000 (---------------) + I xn--6frz82g + 0x00304b8e, // n0x056e c0x0000 (---------------) + I xn--6qq986b3xl + 0x0030550c, // n0x056f c0x0000 (---------------) + I xn--80adxhks + 0x0030648b, // n0x0570 c0x0000 (---------------) + I xn--80ao21a + 0x0030674e, // n0x0571 c0x0000 (---------------) + I xn--80aqecdr1a + 0x00306acc, // n0x0572 c0x0000 (---------------) + I xn--80asehdb + 0x00309b8a, // n0x0573 c0x0000 (---------------) + I xn--80aswg + 0x0030a9cc, // n0x0574 c0x0000 (---------------) + I xn--8y0a063a + 0x65f0acca, // n0x0575 c0x0197 (n0x1eb7-n0x1ebd) + I xn--90a3ac + 0x0030bb89, // n0x0576 c0x0000 (---------------) + I xn--90ais + 0x0030d14a, // n0x0577 c0x0000 (---------------) + I xn--9dbq2a + 0x0030d3ca, // n0x0578 c0x0000 (---------------) + I xn--9et52u + 0x0030d64b, // n0x0579 c0x0000 (---------------) + I xn--9krt00a + 0x00310c4e, // n0x057a c0x0000 (---------------) + I xn--b4w605ferd + 0x00310fd1, // n0x057b c0x0000 (---------------) + I xn--bck1b9a5dre4c + 0x00318cc9, // n0x057c c0x0000 (---------------) + I xn--c1avg + 0x00318f0a, // n0x057d c0x0000 (---------------) + I xn--c2br7g + 0x00319a4b, // n0x057e c0x0000 (---------------) + I xn--cck2b3b + 0x0031b68a, // n0x057f c0x0000 (---------------) + I xn--cg4bki + 0x0031bfd6, // n0x0580 c0x0000 (---------------) + I xn--clchc0ea0b2g2a9gcd + 0x0031e50b, // n0x0581 c0x0000 (---------------) + I xn--czr694b + 0x0032398a, // n0x0582 c0x0000 (---------------) + I xn--czrs0t + 0x003241ca, // n0x0583 c0x0000 (---------------) + I xn--czru2d + 0x0032674b, // n0x0584 c0x0000 (---------------) + I xn--d1acj3b + 0x00328cc9, // n0x0585 c0x0000 (---------------) + I xn--d1alf + 0x0032b7cd, // n0x0586 c0x0000 (---------------) + I xn--eckvdtc9d + 0x0032c18b, // n0x0587 c0x0000 (---------------) + I xn--efvy88h + 0x0032d08b, // n0x0588 c0x0000 (---------------) + I xn--estv75g + 0x0032da4b, // n0x0589 c0x0000 (---------------) + I xn--fct429k + 0x0032dec9, // n0x058a c0x0000 (---------------) + I xn--fhbei + 0x0032e50e, // n0x058b c0x0000 (---------------) + I xn--fiq228c5hs + 0x0032ebca, // n0x058c c0x0000 (---------------) + I xn--fiq64b + 0x003328ca, // n0x058d c0x0000 (---------------) + I xn--fiqs8s + 0x00332c0a, // n0x058e c0x0000 (---------------) + I xn--fiqz9s + 0x003334cb, // n0x058f c0x0000 (---------------) + I xn--fjq720a + 0x00333d0b, // n0x0590 c0x0000 (---------------) + I xn--flw351e + 0x00333fcd, // n0x0591 c0x0000 (---------------) + I xn--fpcrj9c3d + 0x0033558d, // n0x0592 c0x0000 (---------------) + I xn--fzc2c9e2c + 0x00335ad0, // n0x0593 c0x0000 (---------------) + I xn--fzys8d69uvgm + 0x00335f8b, // n0x0594 c0x0000 (---------------) + I xn--g2xx48c + 0x00336d4c, // n0x0595 c0x0000 (---------------) + I xn--gckr3f0f + 0x00337a0b, // n0x0596 c0x0000 (---------------) + I xn--gecrj9c + 0x0033a58b, // n0x0597 c0x0000 (---------------) + I xn--gk3at1e + 0x0033ca0b, // n0x0598 c0x0000 (---------------) + I xn--h2brj9c + 0x0034034b, // n0x0599 c0x0000 (---------------) + I xn--hxt814e + 0x00340dcf, // n0x059a c0x0000 (---------------) + I xn--i1b6b1a6a2e + 0x0034118b, // n0x059b c0x0000 (---------------) + I xn--imr513n + 0x0034280a, // n0x059c c0x0000 (---------------) + I xn--io0a7i + 0x00343209, // n0x059d c0x0000 (---------------) + I xn--j1aef + 0x00343e49, // n0x059e c0x0000 (---------------) + I xn--j1amh + 0x0034478b, // n0x059f c0x0000 (---------------) + I xn--j6w193g + 0x00344a4e, // n0x05a0 c0x0000 (---------------) + I xn--jlq61u9w7b + 0x0034778b, // n0x05a1 c0x0000 (---------------) + I xn--jvr189m + 0x00348bcf, // n0x05a2 c0x0000 (---------------) + I xn--kcrx77d1x4a + 0x0034afcb, // n0x05a3 c0x0000 (---------------) + I xn--kprw13d + 0x0034b28b, // n0x05a4 c0x0000 (---------------) + I xn--kpry57d + 0x0034b54b, // n0x05a5 c0x0000 (---------------) + I xn--kpu716f + 0x0034b98a, // n0x05a6 c0x0000 (---------------) + I xn--kput3i + 0x00352909, // n0x05a7 c0x0000 (---------------) + I xn--l1acc + 0x0035800f, // n0x05a8 c0x0000 (---------------) + I xn--lgbbat1ad8j + 0x0035c74c, // n0x05a9 c0x0000 (---------------) + I xn--mgb2ddes + 0x0035cfcc, // n0x05aa c0x0000 (---------------) + I xn--mgb9awbf + 0x0035d40e, // n0x05ab c0x0000 (---------------) + I xn--mgba3a3ejt + 0x0035d94f, // n0x05ac c0x0000 (---------------) + I xn--mgba3a4f16a + 0x0035dd0e, // n0x05ad c0x0000 (---------------) + I xn--mgba3a4fra + 0x0035e6d0, // n0x05ae c0x0000 (---------------) + I xn--mgba7c0bbn0a + 0x0035eacf, // n0x05af c0x0000 (---------------) + I xn--mgbaakc7dvf + 0x0035f04e, // n0x05b0 c0x0000 (---------------) + I xn--mgbaam7a8h + 0x0035f50c, // n0x05b1 c0x0000 (---------------) + I xn--mgbab2bd + 0x0035f812, // n0x05b2 c0x0000 (---------------) + I xn--mgbai9a5eva00b + 0x00360b51, // n0x05b3 c0x0000 (---------------) + I xn--mgbai9azgqp6j + 0x0036110e, // n0x05b4 c0x0000 (---------------) + I xn--mgbayh7gpa + 0x0036154e, // n0x05b5 c0x0000 (---------------) + I xn--mgbb9fbpob + 0x00361a8e, // n0x05b6 c0x0000 (---------------) + I xn--mgbbh1a71e + 0x00361e0f, // n0x05b7 c0x0000 (---------------) + I xn--mgbc0a9azcg + 0x003621ce, // n0x05b8 c0x0000 (---------------) + I xn--mgbca7dzdo + 0x00362553, // n0x05b9 c0x0000 (---------------) + I xn--mgberp4a5d4a87g + 0x00362a11, // n0x05ba c0x0000 (---------------) + I xn--mgberp4a5d4ar + 0x00362e4e, // n0x05bb c0x0000 (---------------) + I xn--mgbi4ecexp + 0x003632cc, // n0x05bc c0x0000 (---------------) + I xn--mgbpl2fh + 0x00363713, // n0x05bd c0x0000 (---------------) + I xn--mgbqly7c0a67fbc + 0x00363e90, // n0x05be c0x0000 (---------------) + I xn--mgbqly7cvafr + 0x0036470c, // n0x05bf c0x0000 (---------------) + I xn--mgbt3dhd + 0x00364a0c, // n0x05c0 c0x0000 (---------------) + I xn--mgbtf8fl + 0x00364f4b, // n0x05c1 c0x0000 (---------------) + I xn--mgbtx2b + 0x0036540e, // n0x05c2 c0x0000 (---------------) + I xn--mgbx4cd0ab + 0x0036590b, // n0x05c3 c0x0000 (---------------) + I xn--mix082f + 0x0036688b, // n0x05c4 c0x0000 (---------------) + I xn--mix891f + 0x003678cc, // n0x05c5 c0x0000 (---------------) + I xn--mk1bu44c + 0x0036fa4a, // n0x05c6 c0x0000 (---------------) + I xn--mxtq1m + 0x0037058c, // n0x05c7 c0x0000 (---------------) + I xn--ngbc5azd + 0x0037088c, // n0x05c8 c0x0000 (---------------) + I xn--ngbe9e0a + 0x00370b89, // n0x05c9 c0x0000 (---------------) + I xn--ngbrx + 0x0037254b, // n0x05ca c0x0000 (---------------) + I xn--nnx388a + 0x00372808, // n0x05cb c0x0000 (---------------) + I xn--node + 0x00372cc9, // n0x05cc c0x0000 (---------------) + I xn--nqv7f + 0x00372ccf, // n0x05cd c0x0000 (---------------) + I xn--nqv7fs00ema + 0x0037464b, // n0x05ce c0x0000 (---------------) + I xn--nyqy26a + 0x0037534a, // n0x05cf c0x0000 (---------------) + I xn--o3cw4h + 0x0037708c, // n0x05d0 c0x0000 (---------------) + I xn--ogbpf8fl + 0x00379349, // n0x05d1 c0x0000 (---------------) + I xn--p1acf + 0x003795c8, // n0x05d2 c0x0000 (---------------) + I xn--p1ai + 0x003797cb, // n0x05d3 c0x0000 (---------------) + I xn--pbt977c + 0x0037a58b, // n0x05d4 c0x0000 (---------------) + I xn--pgbs0dh + 0x0037b44a, // n0x05d5 c0x0000 (---------------) + I xn--pssy2u + 0x0037b6cb, // n0x05d6 c0x0000 (---------------) + I xn--q9jyb4c + 0x0037cc4c, // n0x05d7 c0x0000 (---------------) + I xn--qcka1pmc + 0x0037d688, // n0x05d8 c0x0000 (---------------) + I xn--qxam + 0x0038118b, // n0x05d9 c0x0000 (---------------) + I xn--rhqv96g + 0x0038390b, // n0x05da c0x0000 (---------------) + I xn--rovu88b + 0x00386f0b, // n0x05db c0x0000 (---------------) + I xn--s9brj9c + 0x0038860b, // n0x05dc c0x0000 (---------------) + I xn--ses554g + 0x0039140b, // n0x05dd c0x0000 (---------------) + I xn--t60b56a + 0x003916c9, // n0x05de c0x0000 (---------------) + I xn--tckwe + 0x00391c0d, // n0x05df c0x0000 (---------------) + I xn--tiq49xqyj + 0x0039654a, // n0x05e0 c0x0000 (---------------) + I xn--unup4y + 0x00397497, // n0x05e1 c0x0000 (---------------) + I xn--vermgensberater-ctb + 0x003982d8, // n0x05e2 c0x0000 (---------------) + I xn--vermgensberatung-pwb + 0x0039a849, // n0x05e3 c0x0000 (---------------) + I xn--vhquv + 0x0039ba4b, // n0x05e4 c0x0000 (---------------) + I xn--vuq861b + 0x0039c814, // n0x05e5 c0x0000 (---------------) + I xn--w4r85el8fhu5dnra + 0x0039cd0b, // n0x05e6 c0x0000 (---------------) + I xn--w4rs40l + 0x0039d28a, // n0x05e7 c0x0000 (---------------) + I xn--wgbh1c + 0x0039d84a, // n0x05e8 c0x0000 (---------------) + I xn--wgbl6a + 0x0039dacb, // n0x05e9 c0x0000 (---------------) + I xn--xhq521b + 0x003a1450, // n0x05ea c0x0000 (---------------) + I xn--xkc2al3hye2a + 0x003a1851, // n0x05eb c0x0000 (---------------) + I xn--xkc2dl3a5ee0h + 0x003a210a, // n0x05ec c0x0000 (---------------) + I xn--y9a3aq + 0x003a2d4d, // n0x05ed c0x0000 (---------------) + I xn--yfro4i67o + 0x003a344d, // n0x05ee c0x0000 (---------------) + I xn--ygbi2ammx + 0x003a5dcb, // n0x05ef c0x0000 (---------------) + I xn--zfr164b + 0x003a6b46, // n0x05f0 c0x0000 (---------------) + I xperia + 0x00230983, // n0x05f1 c0x0000 (---------------) + I xxx + 0x00247683, // n0x05f2 c0x0000 (---------------) + I xyz + 0x00307e86, // n0x05f3 c0x0000 (---------------) + I yachts + 0x0028d645, // n0x05f4 c0x0000 (---------------) + I yahoo + 0x002c7947, // n0x05f5 c0x0000 (---------------) + I yamaxun + 0x00339946, // n0x05f6 c0x0000 (---------------) + I yandex + 0x01608242, // n0x05f7 c0x0005 (---------------)* o I ye + 0x003710c9, // n0x05f8 c0x0000 (---------------) + I yodobashi + 0x003559c4, // n0x05f9 c0x0000 (---------------) + I yoga + 0x002d09c8, // n0x05fa c0x0000 (---------------) + I yokohama + 0x0024b0c3, // n0x05fb c0x0000 (---------------) + I you + 0x002e4807, // n0x05fc c0x0000 (---------------) + I youtube + 0x00244002, // n0x05fd c0x0000 (---------------) + I yt + 0x002ac203, // n0x05fe c0x0000 (---------------) + I yun + 0x66205f82, // n0x05ff c0x0198 (n0x1ebd-n0x1ece) o I za + 0x002c3fc6, // n0x0600 c0x0000 (---------------) + I zappos + 0x002c4d04, // n0x0601 c0x0000 (---------------) + I zara + 0x002eb584, // n0x0602 c0x0000 (---------------) + I zero + 0x002432c3, // n0x0603 c0x0000 (---------------) + I zip + 0x002432c5, // n0x0604 c0x0000 (---------------) + I zippo + 0x01700d02, // n0x0605 c0x0005 (---------------)* o I zm + 0x002dce04, // n0x0606 c0x0000 (---------------) + I zone + 0x00273947, // n0x0607 c0x0000 (---------------) + I zuerich + 0x016afdc2, // n0x0608 c0x0005 (---------------)* o I zw + 0x00233503, // n0x0609 c0x0000 (---------------) + I com + 0x0023a783, // n0x060a c0x0000 (---------------) + I edu + 0x0026cc83, // n0x060b c0x0000 (---------------) + I gov + 0x00209003, // n0x060c c0x0000 (---------------) + I mil + 0x0021fe03, // n0x060d c0x0000 (---------------) + I net + 0x0022d1c3, // n0x060e c0x0000 (---------------) + I org + 0x00201483, // n0x060f c0x0000 (---------------) + I nom + 0x00201542, // n0x0610 c0x0000 (---------------) + I ac + 0x000ffa08, // n0x0611 c0x0000 (---------------) + blogspot + 0x00200742, // n0x0612 c0x0000 (---------------) + I co + 0x0026cc83, // n0x0613 c0x0000 (---------------) + I gov + 0x00209003, // n0x0614 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x0615 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0616 c0x0000 (---------------) + I org + 0x00217443, // n0x0617 c0x0000 (---------------) + I sch + 0x00316196, // n0x0618 c0x0000 (---------------) + I accident-investigation + 0x00317cd3, // n0x0619 c0x0000 (---------------) + I accident-prevention + 0x002f66c9, // n0x061a c0x0000 (---------------) + I aerobatic + 0x002389c8, // n0x061b c0x0000 (---------------) + I aeroclub + 0x002dd449, // n0x061c c0x0000 (---------------) + I aerodrome + 0x002fbe86, // n0x061d c0x0000 (---------------) + I agents + 0x0030c790, // n0x061e c0x0000 (---------------) + I air-surveillance + 0x00358d93, // n0x061f c0x0000 (---------------) + I air-traffic-control + 0x00204908, // n0x0620 c0x0000 (---------------) + I aircraft + 0x002d7e07, // n0x0621 c0x0000 (---------------) + I airline + 0x002793c7, // n0x0622 c0x0000 (---------------) + I airport + 0x0021868a, // n0x0623 c0x0000 (---------------) + I airtraffic + 0x002c8609, // n0x0624 c0x0000 (---------------) + I ambulance + 0x0037d809, // n0x0625 c0x0000 (---------------) + I amusement + 0x002d488b, // n0x0626 c0x0000 (---------------) + I association + 0x0031a686, // n0x0627 c0x0000 (---------------) + I author + 0x0022faca, // n0x0628 c0x0000 (---------------) + I ballooning + 0x00220c46, // n0x0629 c0x0000 (---------------) + I broker + 0x003555c3, // n0x062a c0x0000 (---------------) + I caa + 0x002e9b05, // n0x062b c0x0000 (---------------) + I cargo + 0x00351008, // n0x062c c0x0000 (---------------) + I catering + 0x003257cd, // n0x062d c0x0000 (---------------) + I certification + 0x0035894c, // n0x062e c0x0000 (---------------) + I championship + 0x00320347, // n0x062f c0x0000 (---------------) + I charter + 0x0035b70d, // n0x0630 c0x0000 (---------------) + I civilaviation + 0x00238ac4, // n0x0631 c0x0000 (---------------) + I club + 0x00236cca, // n0x0632 c0x0000 (---------------) + I conference + 0x0023784a, // n0x0633 c0x0000 (---------------) + I consultant + 0x00237d0a, // n0x0634 c0x0000 (---------------) + I consulting + 0x00308c87, // n0x0635 c0x0000 (---------------) + I control + 0x00242207, // n0x0636 c0x0000 (---------------) + I council + 0x00245184, // n0x0637 c0x0000 (---------------) + I crew + 0x0022dcc6, // n0x0638 c0x0000 (---------------) + I design + 0x00356f44, // n0x0639 c0x0000 (---------------) + I dgca + 0x002fe188, // n0x063a c0x0000 (---------------) + I educator + 0x00322189, // n0x063b c0x0000 (---------------) + I emergency + 0x00369146, // n0x063c c0x0000 (---------------) + I engine + 0x00369148, // n0x063d c0x0000 (---------------) + I engineer + 0x00247acd, // n0x063e c0x0000 (---------------) + I entertainment + 0x002c2709, // n0x063f c0x0000 (---------------) + I equipment + 0x00239488, // n0x0640 c0x0000 (---------------) + I exchange + 0x00247487, // n0x0641 c0x0000 (---------------) + I express + 0x0030eeca, // n0x0642 c0x0000 (---------------) + I federation + 0x00251286, // n0x0643 c0x0000 (---------------) + I flight + 0x0025cf87, // n0x0644 c0x0000 (---------------) + I freight + 0x00240d04, // n0x0645 c0x0000 (---------------) + I fuel + 0x0026e307, // n0x0646 c0x0000 (---------------) + I gliding + 0x0026cc8a, // n0x0647 c0x0000 (---------------) + I government + 0x0031240e, // n0x0648 c0x0000 (---------------) + I groundhandling + 0x0020ab45, // n0x0649 c0x0000 (---------------) + I group + 0x002ff10b, // n0x064a c0x0000 (---------------) + I hanggliding + 0x002e9e49, // n0x064b c0x0000 (---------------) + I homebuilt + 0x0023e7c9, // n0x064c c0x0000 (---------------) + I insurance + 0x0033be47, // n0x064d c0x0000 (---------------) + I journal + 0x0038e60a, // n0x064e c0x0000 (---------------) + I journalist + 0x00285c07, // n0x064f c0x0000 (---------------) + I leasing + 0x002e2d49, // n0x0650 c0x0000 (---------------) + I logistics + 0x00395fc8, // n0x0651 c0x0000 (---------------) + I magazine + 0x0027634b, // n0x0652 c0x0000 (---------------) + I maintenance + 0x003025c5, // n0x0653 c0x0000 (---------------) + I media + 0x0031210a, // n0x0654 c0x0000 (---------------) + I microlight + 0x002a3209, // n0x0655 c0x0000 (---------------) + I modelling + 0x00319f8a, // n0x0656 c0x0000 (---------------) + I navigation + 0x002c530b, // n0x0657 c0x0000 (---------------) + I parachuting + 0x0026e20b, // n0x0658 c0x0000 (---------------) + I paragliding + 0x002d4615, // n0x0659 c0x0000 (---------------) + I passenger-association + 0x002d6505, // n0x065a c0x0000 (---------------) + I pilot + 0x00247505, // n0x065b c0x0000 (---------------) + I press + 0x002e204a, // n0x065c c0x0000 (---------------) + I production + 0x00336aca, // n0x065d c0x0000 (---------------) + I recreation + 0x002fae47, // n0x065e c0x0000 (---------------) + I repbody + 0x0021d683, // n0x065f c0x0000 (---------------) + I res + 0x0029fa08, // n0x0660 c0x0000 (---------------) + I research + 0x002ce74a, // n0x0661 c0x0000 (---------------) + I rotorcraft + 0x00215946, // n0x0662 c0x0000 (---------------) + I safety + 0x002466c9, // n0x0663 c0x0000 (---------------) + I scientist + 0x00206808, // n0x0664 c0x0000 (---------------) + I services + 0x002c4484, // n0x0665 c0x0000 (---------------) + I show + 0x0027d709, // n0x0666 c0x0000 (---------------) + I skydiving + 0x002b8688, // n0x0667 c0x0000 (---------------) + I software + 0x002abd47, // n0x0668 c0x0000 (---------------) + I student + 0x002673c6, // n0x0669 c0x0000 (---------------) + I trader + 0x002a4607, // n0x066a c0x0000 (---------------) + I trading + 0x00295207, // n0x066b c0x0000 (---------------) + I trainer + 0x00244bc5, // n0x066c c0x0000 (---------------) + I union + 0x002dbd0c, // n0x066d c0x0000 (---------------) + I workinggroup + 0x00351f05, // n0x066e c0x0000 (---------------) + I works + 0x00233503, // n0x066f c0x0000 (---------------) + I com + 0x0023a783, // n0x0670 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x0671 c0x0000 (---------------) + I gov + 0x0021fe03, // n0x0672 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0673 c0x0000 (---------------) + I org + 0x00200742, // n0x0674 c0x0000 (---------------) + I co + 0x00233503, // n0x0675 c0x0000 (---------------) + I com + 0x0021fe03, // n0x0676 c0x0000 (---------------) + I net + 0x00201483, // n0x0677 c0x0000 (---------------) + I nom + 0x0022d1c3, // n0x0678 c0x0000 (---------------) + I org + 0x00233503, // n0x0679 c0x0000 (---------------) + I com + 0x0021fe03, // n0x067a c0x0000 (---------------) + I net + 0x0020b283, // n0x067b c0x0000 (---------------) + I off + 0x0022d1c3, // n0x067c c0x0000 (---------------) + I org + 0x000ffa08, // n0x067d c0x0000 (---------------) + blogspot + 0x00233503, // n0x067e c0x0000 (---------------) + I com + 0x0023a783, // n0x067f c0x0000 (---------------) + I edu + 0x0026cc83, // n0x0680 c0x0000 (---------------) + I gov + 0x00209003, // n0x0681 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x0682 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0683 c0x0000 (---------------) + I org + 0x000ffa08, // n0x0684 c0x0000 (---------------) + blogspot + 0x00200742, // n0x0685 c0x0000 (---------------) + I co + 0x00202602, // n0x0686 c0x0000 (---------------) + I ed + 0x00237f42, // n0x0687 c0x0000 (---------------) + I gv + 0x00201e42, // n0x0688 c0x0000 (---------------) + I it + 0x00200c42, // n0x0689 c0x0000 (---------------) + I og + 0x002718c2, // n0x068a c0x0000 (---------------) + I pb + 0x04633503, // n0x068b c0x0011 (n0x0694-n0x0695) + I com + 0x0023a783, // n0x068c c0x0000 (---------------) + I edu + 0x00213183, // n0x068d c0x0000 (---------------) + I gob + 0x0026cc83, // n0x068e c0x0000 (---------------) + I gov + 0x00201603, // n0x068f c0x0000 (---------------) + I int + 0x00209003, // n0x0690 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x0691 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0692 c0x0000 (---------------) + I org + 0x00209e43, // n0x0693 c0x0000 (---------------) + I tur + 0x000ffa08, // n0x0694 c0x0000 (---------------) + blogspot + 0x00255704, // n0x0695 c0x0000 (---------------) + I e164 + 0x002edc07, // n0x0696 c0x0000 (---------------) + I in-addr + 0x00215dc3, // n0x0697 c0x0000 (---------------) + I ip6 + 0x00238804, // n0x0698 c0x0000 (---------------) + I iris + 0x0020dd83, // n0x0699 c0x0000 (---------------) + I uri + 0x00285383, // n0x069a c0x0000 (---------------) + I urn + 0x0026cc83, // n0x069b c0x0000 (---------------) + I gov + 0x00201542, // n0x069c c0x0000 (---------------) + I ac + 0x00130b83, // n0x069d c0x0000 (---------------) + biz + 0x05600742, // n0x069e c0x0015 (n0x06a3-n0x06a4) + I co + 0x00237f42, // n0x069f c0x0000 (---------------) + I gv + 0x001a1244, // n0x06a0 c0x0000 (---------------) + info + 0x00200282, // n0x06a1 c0x0000 (---------------) + I or + 0x000e1c44, // n0x06a2 c0x0000 (---------------) + priv + 0x000ffa08, // n0x06a3 c0x0000 (---------------) + blogspot + 0x00239a03, // n0x06a4 c0x0000 (---------------) + I act + 0x002afc83, // n0x06a5 c0x0000 (---------------) + I asn + 0x05e33503, // n0x06a6 c0x0017 (n0x06b6-n0x06b7) + I com + 0x00236cc4, // n0x06a7 c0x0000 (---------------) + I conf + 0x0623a783, // n0x06a8 c0x0018 (n0x06b7-n0x06bf) + I edu + 0x0666cc83, // n0x06a9 c0x0019 (n0x06bf-n0x06c4) + I gov + 0x0020c782, // n0x06aa c0x0000 (---------------) + I id + 0x003a1244, // n0x06ab c0x0000 (---------------) + I info + 0x0021fe03, // n0x06ac c0x0000 (---------------) + I net + 0x002f09c3, // n0x06ad c0x0000 (---------------) + I nsw + 0x002009c2, // n0x06ae c0x0000 (---------------) + I nt + 0x0022d1c3, // n0x06af c0x0000 (---------------) + I org + 0x0021c142, // n0x06b0 c0x0000 (---------------) + I oz + 0x002e6383, // n0x06b1 c0x0000 (---------------) + I qld + 0x002004c2, // n0x06b2 c0x0000 (---------------) + I sa + 0x00201e83, // n0x06b3 c0x0000 (---------------) + I tas + 0x002068c3, // n0x06b4 c0x0000 (---------------) + I vic + 0x002010c2, // n0x06b5 c0x0000 (---------------) + I wa + 0x000ffa08, // n0x06b6 c0x0000 (---------------) + blogspot + 0x00239a03, // n0x06b7 c0x0000 (---------------) + I act + 0x002f09c3, // n0x06b8 c0x0000 (---------------) + I nsw + 0x002009c2, // n0x06b9 c0x0000 (---------------) + I nt + 0x002e6383, // n0x06ba c0x0000 (---------------) + I qld + 0x002004c2, // n0x06bb c0x0000 (---------------) + I sa + 0x00201e83, // n0x06bc c0x0000 (---------------) + I tas + 0x002068c3, // n0x06bd c0x0000 (---------------) + I vic + 0x002010c2, // n0x06be c0x0000 (---------------) + I wa + 0x002e6383, // n0x06bf c0x0000 (---------------) + I qld + 0x002004c2, // n0x06c0 c0x0000 (---------------) + I sa + 0x00201e83, // n0x06c1 c0x0000 (---------------) + I tas + 0x002068c3, // n0x06c2 c0x0000 (---------------) + I vic + 0x002010c2, // n0x06c3 c0x0000 (---------------) + I wa + 0x00233503, // n0x06c4 c0x0000 (---------------) + I com + 0x00330b83, // n0x06c5 c0x0000 (---------------) + I biz + 0x00233503, // n0x06c6 c0x0000 (---------------) + I com + 0x0023a783, // n0x06c7 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x06c8 c0x0000 (---------------) + I gov + 0x003a1244, // n0x06c9 c0x0000 (---------------) + I info + 0x00201603, // n0x06ca c0x0000 (---------------) + I int + 0x00209003, // n0x06cb c0x0000 (---------------) + I mil + 0x00205284, // n0x06cc c0x0000 (---------------) + I name + 0x0021fe03, // n0x06cd c0x0000 (---------------) + I net + 0x0022d1c3, // n0x06ce c0x0000 (---------------) + I org + 0x00209302, // n0x06cf c0x0000 (---------------) + I pp + 0x00220e43, // n0x06d0 c0x0000 (---------------) + I pro + 0x000ffa08, // n0x06d1 c0x0000 (---------------) + blogspot + 0x00200742, // n0x06d2 c0x0000 (---------------) + I co + 0x00233503, // n0x06d3 c0x0000 (---------------) + I com + 0x0023a783, // n0x06d4 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x06d5 c0x0000 (---------------) + I gov + 0x00209003, // n0x06d6 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x06d7 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x06d8 c0x0000 (---------------) + I org + 0x00209702, // n0x06d9 c0x0000 (---------------) + I rs + 0x002d8144, // n0x06da c0x0000 (---------------) + I unbi + 0x003a6844, // n0x06db c0x0000 (---------------) + I unsa + 0x00330b83, // n0x06dc c0x0000 (---------------) + I biz + 0x00200742, // n0x06dd c0x0000 (---------------) + I co + 0x00233503, // n0x06de c0x0000 (---------------) + I com + 0x0023a783, // n0x06df c0x0000 (---------------) + I edu + 0x0026cc83, // n0x06e0 c0x0000 (---------------) + I gov + 0x003a1244, // n0x06e1 c0x0000 (---------------) + I info + 0x0021fe03, // n0x06e2 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x06e3 c0x0000 (---------------) + I org + 0x00391185, // n0x06e4 c0x0000 (---------------) + I store + 0x00224e42, // n0x06e5 c0x0000 (---------------) + I tv + 0x00201542, // n0x06e6 c0x0000 (---------------) + I ac + 0x000ffa08, // n0x06e7 c0x0000 (---------------) + blogspot + 0x0026cc83, // n0x06e8 c0x0000 (---------------) + I gov + 0x0025c3c1, // n0x06e9 c0x0000 (---------------) + I 0 + 0x0022a0c1, // n0x06ea c0x0000 (---------------) + I 1 + 0x002484c1, // n0x06eb c0x0000 (---------------) + I 2 + 0x00231a01, // n0x06ec c0x0000 (---------------) + I 3 + 0x00231981, // n0x06ed c0x0000 (---------------) + I 4 + 0x002736c1, // n0x06ee c0x0000 (---------------) + I 5 + 0x00215e41, // n0x06ef c0x0000 (---------------) + I 6 + 0x0023e381, // n0x06f0 c0x0000 (---------------) + I 7 + 0x002f2a41, // n0x06f1 c0x0000 (---------------) + I 8 + 0x00301241, // n0x06f2 c0x0000 (---------------) + I 9 + 0x00200101, // n0x06f3 c0x0000 (---------------) + I a + 0x00200001, // n0x06f4 c0x0000 (---------------) + I b + 0x000ffa08, // n0x06f5 c0x0000 (---------------) + blogspot + 0x00200301, // n0x06f6 c0x0000 (---------------) + I c + 0x00200381, // n0x06f7 c0x0000 (---------------) + I d + 0x00200081, // n0x06f8 c0x0000 (---------------) + I e + 0x00200581, // n0x06f9 c0x0000 (---------------) + I f + 0x00200c81, // n0x06fa c0x0000 (---------------) + I g + 0x00200d81, // n0x06fb c0x0000 (---------------) + I h + 0x00200041, // n0x06fc c0x0000 (---------------) + I i + 0x00201741, // n0x06fd c0x0000 (---------------) + I j + 0x00200fc1, // n0x06fe c0x0000 (---------------) + I k + 0x00200201, // n0x06ff c0x0000 (---------------) + I l + 0x00200181, // n0x0700 c0x0000 (---------------) + I m + 0x00200541, // n0x0701 c0x0000 (---------------) + I n + 0x00200281, // n0x0702 c0x0000 (---------------) + I o + 0x00200941, // n0x0703 c0x0000 (---------------) + I p + 0x00200401, // n0x0704 c0x0000 (---------------) + I q + 0x002002c1, // n0x0705 c0x0000 (---------------) + I r + 0x002004c1, // n0x0706 c0x0000 (---------------) + I s + 0x00200141, // n0x0707 c0x0000 (---------------) + I t + 0x00200441, // n0x0708 c0x0000 (---------------) + I u + 0x002000c1, // n0x0709 c0x0000 (---------------) + I v + 0x002010c1, // n0x070a c0x0000 (---------------) + I w + 0x00205381, // n0x070b c0x0000 (---------------) + I x + 0x00201841, // n0x070c c0x0000 (---------------) + I y + 0x00205f81, // n0x070d c0x0000 (---------------) + I z + 0x00233503, // n0x070e c0x0000 (---------------) + I com + 0x0023a783, // n0x070f c0x0000 (---------------) + I edu + 0x0026cc83, // n0x0710 c0x0000 (---------------) + I gov + 0x0021fe03, // n0x0711 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0712 c0x0000 (---------------) + I org + 0x00200742, // n0x0713 c0x0000 (---------------) + I co + 0x00233503, // n0x0714 c0x0000 (---------------) + I com + 0x0023a783, // n0x0715 c0x0000 (---------------) + I edu + 0x00200282, // n0x0716 c0x0000 (---------------) + I or + 0x0022d1c3, // n0x0717 c0x0000 (---------------) + I org + 0x00009107, // n0x0718 c0x0000 (---------------) + dscloud + 0x00013886, // n0x0719 c0x0000 (---------------) + dyndns + 0x00055e8a, // n0x071a c0x0000 (---------------) + for-better + 0x00087d88, // n0x071b c0x0000 (---------------) + for-more + 0x00056488, // n0x071c c0x0000 (---------------) + for-some + 0x000572c7, // n0x071d c0x0000 (---------------) + for-the + 0x0006ba86, // n0x071e c0x0000 (---------------) + selfip + 0x000eadc6, // n0x071f c0x0000 (---------------) + webhop + 0x002d4884, // n0x0720 c0x0000 (---------------) + I asso + 0x00319cc7, // n0x0721 c0x0000 (---------------) + I barreau + 0x000ffa08, // n0x0722 c0x0000 (---------------) + blogspot + 0x0033d7c4, // n0x0723 c0x0000 (---------------) + I gouv + 0x00233503, // n0x0724 c0x0000 (---------------) + I com + 0x0023a783, // n0x0725 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x0726 c0x0000 (---------------) + I gov + 0x0021fe03, // n0x0727 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0728 c0x0000 (---------------) + I org + 0x00233503, // n0x0729 c0x0000 (---------------) + I com + 0x0023a783, // n0x072a c0x0000 (---------------) + I edu + 0x00213183, // n0x072b c0x0000 (---------------) + I gob + 0x0026cc83, // n0x072c c0x0000 (---------------) + I gov + 0x00201603, // n0x072d c0x0000 (---------------) + I int + 0x00209003, // n0x072e c0x0000 (---------------) + I mil + 0x0021fe03, // n0x072f c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0730 c0x0000 (---------------) + I org + 0x00224e42, // n0x0731 c0x0000 (---------------) + I tv + 0x002c3503, // n0x0732 c0x0000 (---------------) + I adm + 0x002f4fc3, // n0x0733 c0x0000 (---------------) + I adv + 0x00209c83, // n0x0734 c0x0000 (---------------) + I agr + 0x00201882, // n0x0735 c0x0000 (---------------) + I am + 0x0024f183, // n0x0736 c0x0000 (---------------) + I arq + 0x002011c3, // n0x0737 c0x0000 (---------------) + I art + 0x00217b03, // n0x0738 c0x0000 (---------------) + I ato + 0x00200001, // n0x0739 c0x0000 (---------------) + I b + 0x00203a03, // n0x073a c0x0000 (---------------) + I bio + 0x002a4004, // n0x073b c0x0000 (---------------) + I blog + 0x00321f43, // n0x073c c0x0000 (---------------) + I bmd + 0x0025ee03, // n0x073d c0x0000 (---------------) + I cim + 0x0021ba43, // n0x073e c0x0000 (---------------) + I cng + 0x00231603, // n0x073f c0x0000 (---------------) + I cnt + 0x0a233503, // n0x0740 c0x0028 (n0x0778-n0x0779) + I com + 0x0023d684, // n0x0741 c0x0000 (---------------) + I coop + 0x0021ba03, // n0x0742 c0x0000 (---------------) + I ecn + 0x0020b203, // n0x0743 c0x0000 (---------------) + I eco + 0x0023a783, // n0x0744 c0x0000 (---------------) + I edu + 0x0023a4c3, // n0x0745 c0x0000 (---------------) + I emp + 0x00213703, // n0x0746 c0x0000 (---------------) + I eng + 0x0029bdc3, // n0x0747 c0x0000 (---------------) + I esp + 0x0025ed83, // n0x0748 c0x0000 (---------------) + I etc + 0x002234c3, // n0x0749 c0x0000 (---------------) + I eti + 0x00212983, // n0x074a c0x0000 (---------------) + I far + 0x002522c4, // n0x074b c0x0000 (---------------) + I flog + 0x00242902, // n0x074c c0x0000 (---------------) + I fm + 0x00255803, // n0x074d c0x0000 (---------------) + I fnd + 0x0025bb03, // n0x074e c0x0000 (---------------) + I fot + 0x00277703, // n0x074f c0x0000 (---------------) + I fst + 0x002ee4c3, // n0x0750 c0x0000 (---------------) + I g12 + 0x002ece03, // n0x0751 c0x0000 (---------------) + I ggf + 0x0026cc83, // n0x0752 c0x0000 (---------------) + I gov + 0x002cc783, // n0x0753 c0x0000 (---------------) + I imb + 0x0021d883, // n0x0754 c0x0000 (---------------) + I ind + 0x003a1083, // n0x0755 c0x0000 (---------------) + I inf + 0x00215b43, // n0x0756 c0x0000 (---------------) + I jor + 0x002f3143, // n0x0757 c0x0000 (---------------) + I jus + 0x0022e283, // n0x0758 c0x0000 (---------------) + I leg + 0x002d08c3, // n0x0759 c0x0000 (---------------) + I lel + 0x0021f803, // n0x075a c0x0000 (---------------) + I mat + 0x00213ac3, // n0x075b c0x0000 (---------------) + I med + 0x00209003, // n0x075c c0x0000 (---------------) + I mil + 0x0022a482, // n0x075d c0x0000 (---------------) + I mp + 0x00283a83, // n0x075e c0x0000 (---------------) + I mus + 0x0021fe03, // n0x075f c0x0000 (---------------) + I net + 0x01601483, // n0x0760 c0x0005 (---------------)* o I nom + 0x002547c3, // n0x0761 c0x0000 (---------------) + I not + 0x0023b443, // n0x0762 c0x0000 (---------------) + I ntr + 0x00213243, // n0x0763 c0x0000 (---------------) + I odo + 0x0022d1c3, // n0x0764 c0x0000 (---------------) + I org + 0x00249583, // n0x0765 c0x0000 (---------------) + I ppg + 0x00220e43, // n0x0766 c0x0000 (---------------) + I pro + 0x0023d083, // n0x0767 c0x0000 (---------------) + I psc + 0x002f7b43, // n0x0768 c0x0000 (---------------) + I psi + 0x002e6543, // n0x0769 c0x0000 (---------------) + I qsl + 0x00264b85, // n0x076a c0x0000 (---------------) + I radio + 0x0022a5c3, // n0x076b c0x0000 (---------------) + I rec + 0x002e6583, // n0x076c c0x0000 (---------------) + I slg + 0x0035ca03, // n0x076d c0x0000 (---------------) + I srv + 0x002203c4, // n0x076e c0x0000 (---------------) + I taxi + 0x00336843, // n0x076f c0x0000 (---------------) + I teo + 0x00239f83, // n0x0770 c0x0000 (---------------) + I tmp + 0x002a9803, // n0x0771 c0x0000 (---------------) + I trd + 0x00209e43, // n0x0772 c0x0000 (---------------) + I tur + 0x00224e42, // n0x0773 c0x0000 (---------------) + I tv + 0x0023f943, // n0x0774 c0x0000 (---------------) + I vet + 0x002fa5c4, // n0x0775 c0x0000 (---------------) + I vlog + 0x0037c484, // n0x0776 c0x0000 (---------------) + I wiki + 0x002645c3, // n0x0777 c0x0000 (---------------) + I zlg + 0x000ffa08, // n0x0778 c0x0000 (---------------) + blogspot + 0x00233503, // n0x0779 c0x0000 (---------------) + I com + 0x0023a783, // n0x077a c0x0000 (---------------) + I edu + 0x0026cc83, // n0x077b c0x0000 (---------------) + I gov + 0x0021fe03, // n0x077c c0x0000 (---------------) + I net + 0x0022d1c3, // n0x077d c0x0000 (---------------) + I org + 0x00233503, // n0x077e c0x0000 (---------------) + I com + 0x0023a783, // n0x077f c0x0000 (---------------) + I edu + 0x0026cc83, // n0x0780 c0x0000 (---------------) + I gov + 0x0021fe03, // n0x0781 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0782 c0x0000 (---------------) + I org + 0x00200742, // n0x0783 c0x0000 (---------------) + I co + 0x0022d1c3, // n0x0784 c0x0000 (---------------) + I org + 0x0b633503, // n0x0785 c0x002d (n0x0789-n0x078a) + I com + 0x0026cc83, // n0x0786 c0x0000 (---------------) + I gov + 0x00209003, // n0x0787 c0x0000 (---------------) + I mil + 0x0020b282, // n0x0788 c0x0000 (---------------) + I of + 0x000ffa08, // n0x0789 c0x0000 (---------------) + blogspot + 0x00233503, // n0x078a c0x0000 (---------------) + I com + 0x0023a783, // n0x078b c0x0000 (---------------) + I edu + 0x0026cc83, // n0x078c c0x0000 (---------------) + I gov + 0x0021fe03, // n0x078d c0x0000 (---------------) + I net + 0x0022d1c3, // n0x078e c0x0000 (---------------) + I org + 0x00005f82, // n0x078f c0x0000 (---------------) + za + 0x002020c2, // n0x0790 c0x0000 (---------------) + I ab + 0x00221a82, // n0x0791 c0x0000 (---------------) + I bc + 0x000ffa08, // n0x0792 c0x0000 (---------------) + blogspot + 0x00000742, // n0x0793 c0x0000 (---------------) + co + 0x0023c3c2, // n0x0794 c0x0000 (---------------) + I gc + 0x00208602, // n0x0795 c0x0000 (---------------) + I mb + 0x00215102, // n0x0796 c0x0000 (---------------) + I nb + 0x00200542, // n0x0797 c0x0000 (---------------) + I nf + 0x00247802, // n0x0798 c0x0000 (---------------) + I nl + 0x00210c42, // n0x0799 c0x0000 (---------------) + I ns + 0x002009c2, // n0x079a c0x0000 (---------------) + I nt + 0x002017c2, // n0x079b c0x0000 (---------------) + I nu + 0x00200982, // n0x079c c0x0000 (---------------) + I on + 0x00207782, // n0x079d c0x0000 (---------------) + I pe + 0x0037cd42, // n0x079e c0x0000 (---------------) + I qc + 0x00207842, // n0x079f c0x0000 (---------------) + I sk + 0x00226f42, // n0x07a0 c0x0000 (---------------) + I yk + 0x00146449, // n0x07a1 c0x0000 (---------------) + ftpaccess + 0x00173f0b, // n0x07a2 c0x0000 (---------------) + game-server + 0x000d1148, // n0x07a3 c0x0000 (---------------) + myphotos + 0x00143a09, // n0x07a4 c0x0000 (---------------) + scrapping + 0x0026cc83, // n0x07a5 c0x0000 (---------------) + I gov + 0x000ffa08, // n0x07a6 c0x0000 (---------------) + blogspot + 0x000ffa08, // n0x07a7 c0x0000 (---------------) + blogspot + 0x00201542, // n0x07a8 c0x0000 (---------------) + I ac + 0x002d4884, // n0x07a9 c0x0000 (---------------) + I asso + 0x00200742, // n0x07aa c0x0000 (---------------) + I co + 0x00233503, // n0x07ab c0x0000 (---------------) + I com + 0x00202602, // n0x07ac c0x0000 (---------------) + I ed + 0x0023a783, // n0x07ad c0x0000 (---------------) + I edu + 0x00202d42, // n0x07ae c0x0000 (---------------) + I go + 0x0033d7c4, // n0x07af c0x0000 (---------------) + I gouv + 0x00201603, // n0x07b0 c0x0000 (---------------) + I int + 0x0024da82, // n0x07b1 c0x0000 (---------------) + I md + 0x0021fe03, // n0x07b2 c0x0000 (---------------) + I net + 0x00200282, // n0x07b3 c0x0000 (---------------) + I or + 0x0022d1c3, // n0x07b4 c0x0000 (---------------) + I org + 0x00247506, // n0x07b5 c0x0000 (---------------) + I presse + 0x0030dc0f, // n0x07b6 c0x0000 (---------------) + I xn--aroport-bya + 0x00700b03, // n0x07b7 c0x0001 (---------------) ! I www + 0x000ffa08, // n0x07b8 c0x0000 (---------------) + blogspot + 0x00200742, // n0x07b9 c0x0000 (---------------) + I co + 0x00213183, // n0x07ba c0x0000 (---------------) + I gob + 0x0026cc83, // n0x07bb c0x0000 (---------------) + I gov + 0x00209003, // n0x07bc c0x0000 (---------------) + I mil + 0x00200742, // n0x07bd c0x0000 (---------------) + I co + 0x00233503, // n0x07be c0x0000 (---------------) + I com + 0x0026cc83, // n0x07bf c0x0000 (---------------) + I gov + 0x0021fe03, // n0x07c0 c0x0000 (---------------) + I net + 0x00201542, // n0x07c1 c0x0000 (---------------) + I ac + 0x00204f02, // n0x07c2 c0x0000 (---------------) + I ah + 0x0e6f6409, // n0x07c3 c0x0039 (n0x07ee-n0x07ef) o I amazonaws + 0x00206502, // n0x07c4 c0x0000 (---------------) + I bj + 0x0ee33503, // n0x07c5 c0x003b (n0x07f0-n0x07f1) + I com + 0x00243b42, // n0x07c6 c0x0000 (---------------) + I cq + 0x0023a783, // n0x07c7 c0x0000 (---------------) + I edu + 0x00215b02, // n0x07c8 c0x0000 (---------------) + I fj + 0x00222d42, // n0x07c9 c0x0000 (---------------) + I gd + 0x0026cc83, // n0x07ca c0x0000 (---------------) + I gov + 0x0023a242, // n0x07cb c0x0000 (---------------) + I gs + 0x00260202, // n0x07cc c0x0000 (---------------) + I gx + 0x00264642, // n0x07cd c0x0000 (---------------) + I gz + 0x00202442, // n0x07ce c0x0000 (---------------) + I ha + 0x0028c342, // n0x07cf c0x0000 (---------------) + I hb + 0x002073c2, // n0x07d0 c0x0000 (---------------) + I he + 0x00200d82, // n0x07d1 c0x0000 (---------------) + I hi + 0x0020a882, // n0x07d2 c0x0000 (---------------) + I hk + 0x00248fc2, // n0x07d3 c0x0000 (---------------) + I hl + 0x0021ab42, // n0x07d4 c0x0000 (---------------) + I hn + 0x002ac642, // n0x07d5 c0x0000 (---------------) + I jl + 0x00251742, // n0x07d6 c0x0000 (---------------) + I js + 0x00313402, // n0x07d7 c0x0000 (---------------) + I jx + 0x0022e8c2, // n0x07d8 c0x0000 (---------------) + I ln + 0x00209003, // n0x07d9 c0x0000 (---------------) + I mil + 0x00207102, // n0x07da c0x0000 (---------------) + I mo + 0x0021fe03, // n0x07db c0x0000 (---------------) + I net + 0x0023db02, // n0x07dc c0x0000 (---------------) + I nm + 0x0026a782, // n0x07dd c0x0000 (---------------) + I nx + 0x0022d1c3, // n0x07de c0x0000 (---------------) + I org + 0x0024f202, // n0x07df c0x0000 (---------------) + I qh + 0x00200702, // n0x07e0 c0x0000 (---------------) + I sc + 0x002496c2, // n0x07e1 c0x0000 (---------------) + I sd + 0x00201342, // n0x07e2 c0x0000 (---------------) + I sh + 0x00214182, // n0x07e3 c0x0000 (---------------) + I sn + 0x002f2802, // n0x07e4 c0x0000 (---------------) + I sx + 0x00226782, // n0x07e5 c0x0000 (---------------) + I tj + 0x0024e502, // n0x07e6 c0x0000 (---------------) + I tw + 0x0036f4c2, // n0x07e7 c0x0000 (---------------) + I xj + 0x003029ca, // n0x07e8 c0x0000 (---------------) + I xn--55qx5d + 0x0034280a, // n0x07e9 c0x0000 (---------------) + I xn--io0a7i + 0x0037648a, // n0x07ea c0x0000 (---------------) + I xn--od0alg + 0x003a6cc2, // n0x07eb c0x0000 (---------------) + I xz + 0x00213642, // n0x07ec c0x0000 (---------------) + I yn + 0x00247702, // n0x07ed c0x0000 (---------------) + I zj + 0x0e835247, // n0x07ee c0x003a (n0x07ef-n0x07f0) + compute + 0x00039b8a, // n0x07ef c0x0000 (---------------) + cn-north-1 + 0x0f2f6409, // n0x07f0 c0x003c (n0x07f1-n0x07f2) o I amazonaws + 0x0f639b8a, // n0x07f1 c0x003d (n0x07f2-n0x07f3) o I cn-north-1 + 0x0004a542, // n0x07f2 c0x0000 (---------------) + s3 + 0x0024bf84, // n0x07f3 c0x0000 (---------------) + I arts + 0x0fe33503, // n0x07f4 c0x003f (n0x0800-n0x0801) + I com + 0x0023a783, // n0x07f5 c0x0000 (---------------) + I edu + 0x0024d9c4, // n0x07f6 c0x0000 (---------------) + I firm + 0x0026cc83, // n0x07f7 c0x0000 (---------------) + I gov + 0x003a1244, // n0x07f8 c0x0000 (---------------) + I info + 0x00201603, // n0x07f9 c0x0000 (---------------) + I int + 0x00209003, // n0x07fa c0x0000 (---------------) + I mil + 0x0021fe03, // n0x07fb c0x0000 (---------------) + I net + 0x00201483, // n0x07fc c0x0000 (---------------) + I nom + 0x0022d1c3, // n0x07fd c0x0000 (---------------) + I org + 0x0022a5c3, // n0x07fe c0x0000 (---------------) + I rec + 0x00221a03, // n0x07ff c0x0000 (---------------) + I web + 0x000ffa08, // n0x0800 c0x0000 (---------------) + blogspot + 0x00131905, // n0x0801 c0x0000 (---------------) + 1kapp + 0x0010a942, // n0x0802 c0x0000 (---------------) + 4u + 0x00175846, // n0x0803 c0x0000 (---------------) + africa + 0x106f6409, // n0x0804 c0x0041 (n0x08d7-n0x08eb) o I amazonaws + 0x000092c7, // n0x0805 c0x0000 (---------------) + appspot + 0x00000a42, // n0x0806 c0x0000 (---------------) + ar + 0x0019bcca, // n0x0807 c0x0000 (---------------) + betainabox + 0x000fb147, // n0x0808 c0x0000 (---------------) + blogdns + 0x000ffa08, // n0x0809 c0x0000 (---------------) + blogspot + 0x0001c402, // n0x080a c0x0000 (---------------) + br + 0x001387c7, // n0x080b c0x0000 (---------------) + cechire + 0x00194fcf, // n0x080c c0x0000 (---------------) + cloudcontrolapp + 0x00108b4f, // n0x080d c0x0000 (---------------) + cloudcontrolled + 0x0001ba42, // n0x080e c0x0000 (---------------) + cn + 0x00000742, // n0x080f c0x0000 (---------------) + co + 0x0009bd08, // n0x0810 c0x0000 (---------------) + codespot + 0x00004d82, // n0x0811 c0x0000 (---------------) + de + 0x0014c048, // n0x0812 c0x0000 (---------------) + dnsalias + 0x0007c9c7, // n0x0813 c0x0000 (---------------) + dnsdojo + 0x00014e0b, // n0x0814 c0x0000 (---------------) + doesntexist + 0x0016a009, // n0x0815 c0x0000 (---------------) + dontexist + 0x0014bf47, // n0x0816 c0x0000 (---------------) + doomdns + 0x000f410c, // n0x0817 c0x0000 (---------------) + dreamhosters + 0x0008cdc7, // n0x0818 c0x0000 (---------------) + dsmynas + 0x0012328a, // n0x0819 c0x0000 (---------------) + dyn-o-saur + 0x00197b48, // n0x081a c0x0000 (---------------) + dynalias + 0x00073dce, // n0x081b c0x0000 (---------------) + dyndns-at-home + 0x000dba8e, // n0x081c c0x0000 (---------------) + dyndns-at-work + 0x000faf8b, // n0x081d c0x0000 (---------------) + dyndns-blog + 0x000e7b4b, // n0x081e c0x0000 (---------------) + dyndns-free + 0x0001388b, // n0x081f c0x0000 (---------------) + dyndns-home + 0x00015c09, // n0x0820 c0x0000 (---------------) + dyndns-ip + 0x0001b40b, // n0x0821 c0x0000 (---------------) + dyndns-mail + 0x000214cd, // n0x0822 c0x0000 (---------------) + dyndns-office + 0x0002554b, // n0x0823 c0x0000 (---------------) + dyndns-pics + 0x0002698d, // n0x0824 c0x0000 (---------------) + dyndns-remote + 0x0002d40d, // n0x0825 c0x0000 (---------------) + dyndns-server + 0x0002e48a, // n0x0826 c0x0000 (---------------) + dyndns-web + 0x0017c2cb, // n0x0827 c0x0000 (---------------) + dyndns-wiki + 0x00151d4b, // n0x0828 c0x0000 (---------------) + dyndns-work + 0x0001e810, // n0x0829 c0x0000 (---------------) + elasticbeanstalk + 0x0002bb8f, // n0x082a c0x0000 (---------------) + est-a-la-maison + 0x0000a14f, // n0x082b c0x0000 (---------------) + est-a-la-masion + 0x0015234d, // n0x082c c0x0000 (---------------) + est-le-patron + 0x0013c450, // n0x082d c0x0000 (---------------) + est-mon-blogueur + 0x00004b82, // n0x082e c0x0000 (---------------) + eu + 0x00008f88, // n0x082f c0x0000 (---------------) + familyds + 0x11a4e285, // n0x0830 c0x0046 (n0x08f9-n0x08fa) o I fbsbx + 0x0004c6cb, // n0x0831 c0x0000 (---------------) + firebaseapp + 0x000549c8, // n0x0832 c0x0000 (---------------) + flynnhub + 0x00063d87, // n0x0833 c0x0000 (---------------) + from-ak + 0x000640c7, // n0x0834 c0x0000 (---------------) + from-al + 0x00064287, // n0x0835 c0x0000 (---------------) + from-ar + 0x00065347, // n0x0836 c0x0000 (---------------) + from-ca + 0x00065e07, // n0x0837 c0x0000 (---------------) + from-ct + 0x00066587, // n0x0838 c0x0000 (---------------) + from-dc + 0x00067007, // n0x0839 c0x0000 (---------------) + from-de + 0x00067547, // n0x083a c0x0000 (---------------) + from-fl + 0x00067b87, // n0x083b c0x0000 (---------------) + from-ga + 0x00067f07, // n0x083c c0x0000 (---------------) + from-hi + 0x00068787, // n0x083d c0x0000 (---------------) + from-ia + 0x00068947, // n0x083e c0x0000 (---------------) + from-id + 0x00068b07, // n0x083f c0x0000 (---------------) + from-il + 0x00068cc7, // n0x0840 c0x0000 (---------------) + from-in + 0x00068fc7, // n0x0841 c0x0000 (---------------) + from-ks + 0x00069ac7, // n0x0842 c0x0000 (---------------) + from-ky + 0x0006a5c7, // n0x0843 c0x0000 (---------------) + from-ma + 0x0006aa87, // n0x0844 c0x0000 (---------------) + from-md + 0x0006b007, // n0x0845 c0x0000 (---------------) + from-mi + 0x0006bd87, // n0x0846 c0x0000 (---------------) + from-mn + 0x0006bf47, // n0x0847 c0x0000 (---------------) + from-mo + 0x0006c247, // n0x0848 c0x0000 (---------------) + from-ms + 0x0006c787, // n0x0849 c0x0000 (---------------) + from-mt + 0x0006c987, // n0x084a c0x0000 (---------------) + from-nc + 0x0006d307, // n0x084b c0x0000 (---------------) + from-nd + 0x0006d4c7, // n0x084c c0x0000 (---------------) + from-ne + 0x0006d8c7, // n0x084d c0x0000 (---------------) + from-nh + 0x0006e007, // n0x084e c0x0000 (---------------) + from-nj + 0x0006e4c7, // n0x084f c0x0000 (---------------) + from-nm + 0x0006ef87, // n0x0850 c0x0000 (---------------) + from-nv + 0x0006f587, // n0x0851 c0x0000 (---------------) + from-oh + 0x0006f847, // n0x0852 c0x0000 (---------------) + from-ok + 0x0006fbc7, // n0x0853 c0x0000 (---------------) + from-or + 0x0006fd87, // n0x0854 c0x0000 (---------------) + from-pa + 0x00070107, // n0x0855 c0x0000 (---------------) + from-pr + 0x000708c7, // n0x0856 c0x0000 (---------------) + from-ri + 0x00070f07, // n0x0857 c0x0000 (---------------) + from-sc + 0x00071307, // n0x0858 c0x0000 (---------------) + from-sd + 0x00073147, // n0x0859 c0x0000 (---------------) + from-tn + 0x00073307, // n0x085a c0x0000 (---------------) + from-tx + 0x00073747, // n0x085b c0x0000 (---------------) + from-ut + 0x00074607, // n0x085c c0x0000 (---------------) + from-va + 0x00074c47, // n0x085d c0x0000 (---------------) + from-vt + 0x00074f47, // n0x085e c0x0000 (---------------) + from-wa + 0x00075107, // n0x085f c0x0000 (---------------) + from-wi + 0x00075487, // n0x0860 c0x0000 (---------------) + from-wv + 0x00076607, // n0x0861 c0x0000 (---------------) + from-wy + 0x0000d202, // n0x0862 c0x0000 (---------------) + gb + 0x000d4487, // n0x0863 c0x0000 (---------------) + getmyip + 0x11cca40b, // n0x0864 c0x0047 (n0x08fa-n0x08fd) + githubcloud + 0x014ca416, // n0x0865 c0x0005 (---------------)* o githubcloudusercontent + 0x00019511, // n0x0866 c0x0000 (---------------) + githubusercontent + 0x000df54a, // n0x0867 c0x0000 (---------------) + googleapis + 0x0009bb8a, // n0x0868 c0x0000 (---------------) + googlecode + 0x00057d06, // n0x0869 c0x0000 (---------------) + gotdns + 0x00011ecb, // n0x086a c0x0000 (---------------) + gotpantheon + 0x00000c82, // n0x086b c0x0000 (---------------) + gr + 0x000992c9, // n0x086c c0x0000 (---------------) + herokuapp + 0x00091f49, // n0x086d c0x0000 (---------------) + herokussl + 0x0000a882, // n0x086e c0x0000 (---------------) + hk + 0x0014cfca, // n0x086f c0x0000 (---------------) + hobby-site + 0x000a59c9, // n0x0870 c0x0000 (---------------) + homelinux + 0x000a6fc8, // n0x0871 c0x0000 (---------------) + homeunix + 0x000195c2, // n0x0872 c0x0000 (---------------) + hu + 0x00116f89, // n0x0873 c0x0000 (---------------) + iamallama + 0x0016d68e, // n0x0874 c0x0000 (---------------) + is-a-anarchist + 0x000a3ecc, // n0x0875 c0x0000 (---------------) + is-a-blogger + 0x000d254f, // n0x0876 c0x0000 (---------------) + is-a-bookkeeper + 0x0018ba8e, // n0x0877 c0x0000 (---------------) + is-a-bulls-fan + 0x0000de0c, // n0x0878 c0x0000 (---------------) + is-a-caterer + 0x00012789, // n0x0879 c0x0000 (---------------) + is-a-chef + 0x00013d11, // n0x087a c0x0000 (---------------) + is-a-conservative + 0x00016c08, // n0x087b c0x0000 (---------------) + is-a-cpa + 0x00024852, // n0x087c c0x0000 (---------------) + is-a-cubicle-slave + 0x0002648d, // n0x087d c0x0000 (---------------) + is-a-democrat + 0x0002db8d, // n0x087e c0x0000 (---------------) + is-a-designer + 0x0017614b, // n0x087f c0x0000 (---------------) + is-a-doctor + 0x00178815, // n0x0880 c0x0000 (---------------) + is-a-financialadvisor + 0x0004e989, // n0x0881 c0x0000 (---------------) + is-a-geek + 0x0005028a, // n0x0882 c0x0000 (---------------) + is-a-green + 0x00059389, // n0x0883 c0x0000 (---------------) + is-a-guru + 0x0005bd50, // n0x0884 c0x0000 (---------------) + is-a-hard-worker + 0x000662cb, // n0x0885 c0x0000 (---------------) + is-a-hunter + 0x00070a4f, // n0x0886 c0x0000 (---------------) + is-a-landscaper + 0x0007434b, // n0x0887 c0x0000 (---------------) + is-a-lawyer + 0x0007b5cc, // n0x0888 c0x0000 (---------------) + is-a-liberal + 0x0007dbd0, // n0x0889 c0x0000 (---------------) + is-a-libertarian + 0x00082fca, // n0x088a c0x0000 (---------------) + is-a-llama + 0x0008394d, // n0x088b c0x0000 (---------------) + is-a-musician + 0x0008894e, // n0x088c c0x0000 (---------------) + is-a-nascarfan + 0x0014414a, // n0x088d c0x0000 (---------------) + is-a-nurse + 0x00089f0c, // n0x088e c0x0000 (---------------) + is-a-painter + 0x00094ed4, // n0x088f c0x0000 (---------------) + is-a-personaltrainer + 0x00098f51, // n0x0890 c0x0000 (---------------) + is-a-photographer + 0x0009e80b, // n0x0891 c0x0000 (---------------) + is-a-player + 0x0009f58f, // n0x0892 c0x0000 (---------------) + is-a-republican + 0x000a0f8d, // n0x0893 c0x0000 (---------------) + is-a-rockstar + 0x000a384e, // n0x0894 c0x0000 (---------------) + is-a-socialist + 0x000abc0c, // n0x0895 c0x0000 (---------------) + is-a-student + 0x000d5b8c, // n0x0896 c0x0000 (---------------) + is-a-teacher + 0x000d588b, // n0x0897 c0x0000 (---------------) + is-a-techie + 0x000beb8e, // n0x0898 c0x0000 (---------------) + is-a-therapist + 0x000d9990, // n0x0899 c0x0000 (---------------) + is-an-accountant + 0x000ad54b, // n0x089a c0x0000 (---------------) + is-an-actor + 0x000d540d, // n0x089b c0x0000 (---------------) + is-an-actress + 0x000fb60f, // n0x089c c0x0000 (---------------) + is-an-anarchist + 0x0010390c, // n0x089d c0x0000 (---------------) + is-an-artist + 0x00168fce, // n0x089e c0x0000 (---------------) + is-an-engineer + 0x000b2bd1, // n0x089f c0x0000 (---------------) + is-an-entertainer + 0x000b924c, // n0x08a0 c0x0000 (---------------) + is-certified + 0x000bb247, // n0x08a1 c0x0000 (---------------) + is-gone + 0x000be5cd, // n0x08a2 c0x0000 (---------------) + is-into-anime + 0x00105d8c, // n0x08a3 c0x0000 (---------------) + is-into-cars + 0x00147b50, // n0x08a4 c0x0000 (---------------) + is-into-cartoons + 0x0016fecd, // n0x08a5 c0x0000 (---------------) + is-into-games + 0x000cf347, // n0x08a6 c0x0000 (---------------) + is-leet + 0x0017e2d0, // n0x08a7 c0x0000 (---------------) + is-not-certified + 0x000e9488, // n0x08a8 c0x0000 (---------------) + is-slick + 0x000ef04b, // n0x08a9 c0x0000 (---------------) + is-uberleet + 0x0014bbcf, // n0x08aa c0x0000 (---------------) + is-with-theband + 0x0008e588, // n0x08ab c0x0000 (---------------) + isa-geek + 0x000df74d, // n0x08ac c0x0000 (---------------) + isa-hockeynut + 0x00168110, // n0x08ad c0x0000 (---------------) + issmarterthanyou + 0x000aedc3, // n0x08ae c0x0000 (---------------) + jpn + 0x00006fc2, // n0x08af c0x0000 (---------------) + kr + 0x00058c49, // n0x08b0 c0x0000 (---------------) + likes-pie + 0x00073bca, // n0x08b1 c0x0000 (---------------) + likescandy + 0x00005303, // n0x08b2 c0x0000 (---------------) + mex + 0x0010b007, // n0x08b3 c0x0000 (---------------) + mydrobo + 0x001176c8, // n0x08b4 c0x0000 (---------------) + neat-url + 0x00184847, // n0x08b5 c0x0000 (---------------) + nfshost + 0x00000c02, // n0x08b6 c0x0000 (---------------) + no + 0x00064d0a, // n0x08b7 c0x0000 (---------------) + operaunite + 0x00194d4f, // n0x08b8 c0x0000 (---------------) + outsystemscloud + 0x000eaf0c, // n0x08b9 c0x0000 (---------------) + pagefrontapp + 0x000eb1d2, // n0x08ba c0x0000 (---------------) + pagespeedmobilizer + 0x122e1605, // n0x08bb c0x0048 (n0x08fd-n0x08fe) o I prgmr + 0x00114683, // n0x08bc c0x0000 (---------------) + qa2 + 0x0017cd42, // n0x08bd c0x0000 (---------------) + qc + 0x000ecb08, // n0x08be c0x0000 (---------------) + rackmaze + 0x00108ac7, // n0x08bf c0x0000 (---------------) + rhcloud + 0x00002202, // n0x08c0 c0x0000 (---------------) + ro + 0x00011302, // n0x08c1 c0x0000 (---------------) + ru + 0x000004c2, // n0x08c2 c0x0000 (---------------) + sa + 0x00033810, // n0x08c3 c0x0000 (---------------) + saves-the-whales + 0x000046c2, // n0x08c4 c0x0000 (---------------) + se + 0x0006ba86, // n0x08c5 c0x0000 (---------------) + selfip + 0x0013738e, // n0x08c6 c0x0000 (---------------) + sells-for-less + 0x0008becb, // n0x08c7 c0x0000 (---------------) + sells-for-u + 0x000cb7c8, // n0x08c8 c0x0000 (---------------) + servebbs + 0x000d0eca, // n0x08c9 c0x0000 (---------------) + simple-url + 0x000f7b87, // n0x08ca c0x0000 (---------------) + sinaapp + 0x0000bb4d, // n0x08cb c0x0000 (---------------) + space-to-rent + 0x001557cc, // n0x08cc c0x0000 (---------------) + teaches-yoga + 0x00000f82, // n0x08cd c0x0000 (---------------) + uk + 0x00002382, // n0x08ce c0x0000 (---------------) + us + 0x00001802, // n0x08cf c0x0000 (---------------) + uy + 0x000f7aca, // n0x08d0 c0x0000 (---------------) + vipsinaapp + 0x000df44a, // n0x08d1 c0x0000 (---------------) + withgoogle + 0x000e470b, // n0x08d2 c0x0000 (---------------) + withyoutube + 0x000ff78e, // n0x08d3 c0x0000 (---------------) + writesthisblog + 0x0001bc0d, // n0x08d4 c0x0000 (---------------) + xenapponazure + 0x000d6f08, // n0x08d5 c0x0000 (---------------) + yolasite + 0x00005f82, // n0x08d6 c0x0000 (---------------) + za + 0x10a5f44e, // n0x08d7 c0x0042 (n0x08eb-n0x08ec) o I ap-northeast-2 + 0x10c35247, // n0x08d8 c0x0043 (n0x08ec-n0x08f6) + compute + 0x11035249, // n0x08d9 c0x0044 (n0x08f6-n0x08f8) + compute-1 + 0x00010743, // n0x08da c0x0000 (---------------) + elb + 0x11672e4c, // n0x08db c0x0045 (n0x08f8-n0x08f9) o I eu-central-1 + 0x0004a542, // n0x08dc c0x0000 (---------------) + s3 + 0x00132491, // n0x08dd c0x0000 (---------------) + s3-ap-northeast-1 + 0x0005f391, // n0x08de c0x0000 (---------------) + s3-ap-northeast-2 + 0x00131511, // n0x08df c0x0000 (---------------) + s3-ap-southeast-1 + 0x0004a551, // n0x08e0 c0x0000 (---------------) + s3-ap-southeast-2 + 0x00072d8f, // n0x08e1 c0x0000 (---------------) + s3-eu-central-1 + 0x001101cc, // n0x08e2 c0x0000 (---------------) + s3-eu-west-1 + 0x0011b34d, // n0x08e3 c0x0000 (---------------) + s3-external-1 + 0x0012364d, // n0x08e4 c0x0000 (---------------) + s3-external-2 + 0x00126215, // n0x08e5 c0x0000 (---------------) + s3-fips-us-gov-west-1 + 0x0014694c, // n0x08e6 c0x0000 (---------------) + s3-sa-east-1 + 0x000de150, // n0x08e7 c0x0000 (---------------) + s3-us-gov-west-1 + 0x000c158c, // n0x08e8 c0x0000 (---------------) + s3-us-west-1 + 0x000dc7cc, // n0x08e9 c0x0000 (---------------) + s3-us-west-2 + 0x0017ca09, // n0x08ea c0x0000 (---------------) + us-east-1 + 0x0004a542, // n0x08eb c0x0000 (---------------) + s3 + 0x0013254e, // n0x08ec c0x0000 (---------------) + ap-northeast-1 + 0x0005f44e, // n0x08ed c0x0000 (---------------) + ap-northeast-2 + 0x001315ce, // n0x08ee c0x0000 (---------------) + ap-southeast-1 + 0x0004a60e, // n0x08ef c0x0000 (---------------) + ap-southeast-2 + 0x00072e4c, // n0x08f0 c0x0000 (---------------) + eu-central-1 + 0x00110289, // n0x08f1 c0x0000 (---------------) + eu-west-1 + 0x00146a09, // n0x08f2 c0x0000 (---------------) + sa-east-1 + 0x000de20d, // n0x08f3 c0x0000 (---------------) + us-gov-west-1 + 0x000c1649, // n0x08f4 c0x0000 (---------------) + us-west-1 + 0x000dc889, // n0x08f5 c0x0000 (---------------) + us-west-2 + 0x0002a043, // n0x08f6 c0x0000 (---------------) + z-1 + 0x0013e5c3, // n0x08f7 c0x0000 (---------------) + z-2 + 0x0004a542, // n0x08f8 c0x0000 (---------------) + s3 + 0x000092c4, // n0x08f9 c0x0000 (---------------) + apps + 0x014bedc3, // n0x08fa c0x0005 (---------------)* o api + 0x0140ba03, // n0x08fb c0x0005 (---------------)* o ext + 0x000e2dc4, // n0x08fc c0x0000 (---------------) + gist + 0x0001bc03, // n0x08fd c0x0000 (---------------) + xen + 0x00201542, // n0x08fe c0x0000 (---------------) + I ac + 0x00200742, // n0x08ff c0x0000 (---------------) + I co + 0x00202602, // n0x0900 c0x0000 (---------------) + I ed + 0x00207502, // n0x0901 c0x0000 (---------------) + I fi + 0x00202d42, // n0x0902 c0x0000 (---------------) + I go + 0x00200282, // n0x0903 c0x0000 (---------------) + I or + 0x002004c2, // n0x0904 c0x0000 (---------------) + I sa + 0x00233503, // n0x0905 c0x0000 (---------------) + I com + 0x0023a783, // n0x0906 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x0907 c0x0000 (---------------) + I gov + 0x003a1083, // n0x0908 c0x0000 (---------------) + I inf + 0x0021fe03, // n0x0909 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x090a c0x0000 (---------------) + I org + 0x000ffa08, // n0x090b c0x0000 (---------------) + blogspot + 0x00233503, // n0x090c c0x0000 (---------------) + I com + 0x0023a783, // n0x090d c0x0000 (---------------) + I edu + 0x0021fe03, // n0x090e c0x0000 (---------------) + I net + 0x0022d1c3, // n0x090f c0x0000 (---------------) + I org + 0x00048f43, // n0x0910 c0x0000 (---------------) + ath + 0x0026cc83, // n0x0911 c0x0000 (---------------) + I gov + 0x00201542, // n0x0912 c0x0000 (---------------) + I ac + 0x00330b83, // n0x0913 c0x0000 (---------------) + I biz + 0x13e33503, // n0x0914 c0x004f (n0x091f-n0x0920) + I com + 0x0027a1c7, // n0x0915 c0x0000 (---------------) + I ekloges + 0x0026cc83, // n0x0916 c0x0000 (---------------) + I gov + 0x00322cc3, // n0x0917 c0x0000 (---------------) + I ltd + 0x00205284, // n0x0918 c0x0000 (---------------) + I name + 0x0021fe03, // n0x0919 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x091a c0x0000 (---------------) + I org + 0x0028440a, // n0x091b c0x0000 (---------------) + I parliament + 0x00247505, // n0x091c c0x0000 (---------------) + I press + 0x00220e43, // n0x091d c0x0000 (---------------) + I pro + 0x00200142, // n0x091e c0x0000 (---------------) + I tm + 0x000ffa08, // n0x091f c0x0000 (---------------) + blogspot + 0x000ffa08, // n0x0920 c0x0000 (---------------) + blogspot + 0x00000742, // n0x0921 c0x0000 (---------------) + co + 0x000ffa08, // n0x0922 c0x0000 (---------------) + blogspot + 0x00033503, // n0x0923 c0x0000 (---------------) + com + 0x000afa4f, // n0x0924 c0x0000 (---------------) + fuettertdasnetz + 0x0016a18a, // n0x0925 c0x0000 (---------------) + isteingeek + 0x000a3b07, // n0x0926 c0x0000 (---------------) + istmein + 0x0001fc8a, // n0x0927 c0x0000 (---------------) + lebtimnetz + 0x0018460a, // n0x0928 c0x0000 (---------------) + leitungsen + 0x00004acd, // n0x0929 c0x0000 (---------------) + traeumtgerade + 0x000ffa08, // n0x092a c0x0000 (---------------) + blogspot + 0x00233503, // n0x092b c0x0000 (---------------) + I com + 0x0023a783, // n0x092c c0x0000 (---------------) + I edu + 0x0026cc83, // n0x092d c0x0000 (---------------) + I gov + 0x0021fe03, // n0x092e c0x0000 (---------------) + I net + 0x0022d1c3, // n0x092f c0x0000 (---------------) + I org + 0x002011c3, // n0x0930 c0x0000 (---------------) + I art + 0x00233503, // n0x0931 c0x0000 (---------------) + I com + 0x0023a783, // n0x0932 c0x0000 (---------------) + I edu + 0x00213183, // n0x0933 c0x0000 (---------------) + I gob + 0x0026cc83, // n0x0934 c0x0000 (---------------) + I gov + 0x00209003, // n0x0935 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x0936 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0937 c0x0000 (---------------) + I org + 0x00292103, // n0x0938 c0x0000 (---------------) + I sld + 0x00221a03, // n0x0939 c0x0000 (---------------) + I web + 0x002011c3, // n0x093a c0x0000 (---------------) + I art + 0x002d4884, // n0x093b c0x0000 (---------------) + I asso + 0x00233503, // n0x093c c0x0000 (---------------) + I com + 0x0023a783, // n0x093d c0x0000 (---------------) + I edu + 0x0026cc83, // n0x093e c0x0000 (---------------) + I gov + 0x0021fe03, // n0x093f c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0940 c0x0000 (---------------) + I org + 0x00208103, // n0x0941 c0x0000 (---------------) + I pol + 0x00233503, // n0x0942 c0x0000 (---------------) + I com + 0x0023a783, // n0x0943 c0x0000 (---------------) + I edu + 0x00207503, // n0x0944 c0x0000 (---------------) + I fin + 0x00213183, // n0x0945 c0x0000 (---------------) + I gob + 0x0026cc83, // n0x0946 c0x0000 (---------------) + I gov + 0x003a1244, // n0x0947 c0x0000 (---------------) + I info + 0x00309ac3, // n0x0948 c0x0000 (---------------) + I k12 + 0x00213ac3, // n0x0949 c0x0000 (---------------) + I med + 0x00209003, // n0x094a c0x0000 (---------------) + I mil + 0x0021fe03, // n0x094b c0x0000 (---------------) + I net + 0x0022d1c3, // n0x094c c0x0000 (---------------) + I org + 0x00220e43, // n0x094d c0x0000 (---------------) + I pro + 0x003a6543, // n0x094e c0x0000 (---------------) + I aip + 0x16233503, // n0x094f c0x0058 (n0x0958-n0x0959) + I com + 0x0023a783, // n0x0950 c0x0000 (---------------) + I edu + 0x002b9443, // n0x0951 c0x0000 (---------------) + I fie + 0x0026cc83, // n0x0952 c0x0000 (---------------) + I gov + 0x0027b703, // n0x0953 c0x0000 (---------------) + I lib + 0x00213ac3, // n0x0954 c0x0000 (---------------) + I med + 0x0022d1c3, // n0x0955 c0x0000 (---------------) + I org + 0x00204603, // n0x0956 c0x0000 (---------------) + I pri + 0x00320cc4, // n0x0957 c0x0000 (---------------) + I riik + 0x000ffa08, // n0x0958 c0x0000 (---------------) + blogspot + 0x16a33503, // n0x0959 c0x005a (n0x0962-n0x0963) + I com + 0x0023a783, // n0x095a c0x0000 (---------------) + I edu + 0x002a7083, // n0x095b c0x0000 (---------------) + I eun + 0x0026cc83, // n0x095c c0x0000 (---------------) + I gov + 0x00209003, // n0x095d c0x0000 (---------------) + I mil + 0x00205284, // n0x095e c0x0000 (---------------) + I name + 0x0021fe03, // n0x095f c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0960 c0x0000 (---------------) + I org + 0x0021d703, // n0x0961 c0x0000 (---------------) + I sci + 0x000ffa08, // n0x0962 c0x0000 (---------------) + blogspot + 0x17233503, // n0x0963 c0x005c (n0x0968-n0x0969) + I com + 0x0023a783, // n0x0964 c0x0000 (---------------) + I edu + 0x00213183, // n0x0965 c0x0000 (---------------) + I gob + 0x00201483, // n0x0966 c0x0000 (---------------) + I nom + 0x0022d1c3, // n0x0967 c0x0000 (---------------) + I org + 0x000ffa08, // n0x0968 c0x0000 (---------------) + blogspot + 0x00330b83, // n0x0969 c0x0000 (---------------) + I biz + 0x00233503, // n0x096a c0x0000 (---------------) + I com + 0x0023a783, // n0x096b c0x0000 (---------------) + I edu + 0x0026cc83, // n0x096c c0x0000 (---------------) + I gov + 0x003a1244, // n0x096d c0x0000 (---------------) + I info + 0x00205284, // n0x096e c0x0000 (---------------) + I name + 0x0021fe03, // n0x096f c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0970 c0x0000 (---------------) + I org + 0x0031a845, // n0x0971 c0x0000 (---------------) + I aland + 0x000ffa08, // n0x0972 c0x0000 (---------------) + blogspot + 0x0003be03, // n0x0973 c0x0000 (---------------) + iki + 0x002ec408, // n0x0974 c0x0000 (---------------) + I aeroport + 0x00350d87, // n0x0975 c0x0000 (---------------) + I assedic + 0x002d4884, // n0x0976 c0x0000 (---------------) + I asso + 0x0032f106, // n0x0977 c0x0000 (---------------) + I avocat + 0x00346806, // n0x0978 c0x0000 (---------------) + I avoues + 0x000ffa08, // n0x0979 c0x0000 (---------------) + blogspot + 0x0023fdc3, // n0x097a c0x0000 (---------------) + I cci + 0x00209b49, // n0x097b c0x0000 (---------------) + I chambagri + 0x002b2115, // n0x097c c0x0000 (---------------) + I chirurgiens-dentistes + 0x00233503, // n0x097d c0x0000 (---------------) + I com + 0x0031ee12, // n0x097e c0x0000 (---------------) + I experts-comptables + 0x0031ebcf, // n0x097f c0x0000 (---------------) + I geometre-expert + 0x0033d7c4, // n0x0980 c0x0000 (---------------) + I gouv + 0x0022a885, // n0x0981 c0x0000 (---------------) + I greta + 0x002f2f10, // n0x0982 c0x0000 (---------------) + I huissier-justice + 0x00238bc7, // n0x0983 c0x0000 (---------------) + I medecin + 0x00201483, // n0x0984 c0x0000 (---------------) + I nom + 0x0025c988, // n0x0985 c0x0000 (---------------) + I notaires + 0x0034d60a, // n0x0986 c0x0000 (---------------) + I pharmacien + 0x00246184, // n0x0987 c0x0000 (---------------) + I port + 0x002e1043, // n0x0988 c0x0000 (---------------) + I prd + 0x00247506, // n0x0989 c0x0000 (---------------) + I presse + 0x00200142, // n0x098a c0x0000 (---------------) + I tm + 0x002d1c8b, // n0x098b c0x0000 (---------------) + I veterinaire + 0x00233503, // n0x098c c0x0000 (---------------) + I com + 0x0023a783, // n0x098d c0x0000 (---------------) + I edu + 0x0026cc83, // n0x098e c0x0000 (---------------) + I gov + 0x00209003, // n0x098f c0x0000 (---------------) + I mil + 0x0021fe03, // n0x0990 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0991 c0x0000 (---------------) + I org + 0x002e5543, // n0x0992 c0x0000 (---------------) + I pvt + 0x00200742, // n0x0993 c0x0000 (---------------) + I co + 0x0021fe03, // n0x0994 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0995 c0x0000 (---------------) + I org + 0x00233503, // n0x0996 c0x0000 (---------------) + I com + 0x0023a783, // n0x0997 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x0998 c0x0000 (---------------) + I gov + 0x00209003, // n0x0999 c0x0000 (---------------) + I mil + 0x0022d1c3, // n0x099a c0x0000 (---------------) + I org + 0x00233503, // n0x099b c0x0000 (---------------) + I com + 0x0023a783, // n0x099c c0x0000 (---------------) + I edu + 0x0026cc83, // n0x099d c0x0000 (---------------) + I gov + 0x00322cc3, // n0x099e c0x0000 (---------------) + I ltd + 0x00218303, // n0x099f c0x0000 (---------------) + I mod + 0x0022d1c3, // n0x09a0 c0x0000 (---------------) + I org + 0x00200742, // n0x09a1 c0x0000 (---------------) + I co + 0x00233503, // n0x09a2 c0x0000 (---------------) + I com + 0x0023a783, // n0x09a3 c0x0000 (---------------) + I edu + 0x0021fe03, // n0x09a4 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x09a5 c0x0000 (---------------) + I org + 0x00201542, // n0x09a6 c0x0000 (---------------) + I ac + 0x00233503, // n0x09a7 c0x0000 (---------------) + I com + 0x0023a783, // n0x09a8 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x09a9 c0x0000 (---------------) + I gov + 0x0021fe03, // n0x09aa c0x0000 (---------------) + I net + 0x0022d1c3, // n0x09ab c0x0000 (---------------) + I org + 0x002d4884, // n0x09ac c0x0000 (---------------) + I asso + 0x00233503, // n0x09ad c0x0000 (---------------) + I com + 0x0023a783, // n0x09ae c0x0000 (---------------) + I edu + 0x00207104, // n0x09af c0x0000 (---------------) + I mobi + 0x0021fe03, // n0x09b0 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x09b1 c0x0000 (---------------) + I org + 0x000ffa08, // n0x09b2 c0x0000 (---------------) + blogspot + 0x00233503, // n0x09b3 c0x0000 (---------------) + I com + 0x0023a783, // n0x09b4 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x09b5 c0x0000 (---------------) + I gov + 0x0021fe03, // n0x09b6 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x09b7 c0x0000 (---------------) + I org + 0x00233503, // n0x09b8 c0x0000 (---------------) + I com + 0x0023a783, // n0x09b9 c0x0000 (---------------) + I edu + 0x00213183, // n0x09ba c0x0000 (---------------) + I gob + 0x0021d883, // n0x09bb c0x0000 (---------------) + I ind + 0x00209003, // n0x09bc c0x0000 (---------------) + I mil + 0x0021fe03, // n0x09bd c0x0000 (---------------) + I net + 0x0022d1c3, // n0x09be c0x0000 (---------------) + I org + 0x00200742, // n0x09bf c0x0000 (---------------) + I co + 0x00233503, // n0x09c0 c0x0000 (---------------) + I com + 0x0023a783, // n0x09c1 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x09c2 c0x0000 (---------------) + I gov + 0x0021fe03, // n0x09c3 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x09c4 c0x0000 (---------------) + I org + 0x000ffa08, // n0x09c5 c0x0000 (---------------) + blogspot + 0x00233503, // n0x09c6 c0x0000 (---------------) + I com + 0x0023a783, // n0x09c7 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x09c8 c0x0000 (---------------) + I gov + 0x00317243, // n0x09c9 c0x0000 (---------------) + I idv + 0x0002e7c3, // n0x09ca c0x0000 (---------------) + inc + 0x00122cc3, // n0x09cb c0x0000 (---------------) + ltd + 0x0021fe03, // n0x09cc c0x0000 (---------------) + I net + 0x0022d1c3, // n0x09cd c0x0000 (---------------) + I org + 0x003029ca, // n0x09ce c0x0000 (---------------) + I xn--55qx5d + 0x0031bd89, // n0x09cf c0x0000 (---------------) + I xn--ciqpn + 0x0033ac4b, // n0x09d0 c0x0000 (---------------) + I xn--gmq050i + 0x0033b1ca, // n0x09d1 c0x0000 (---------------) + I xn--gmqw5a + 0x0034280a, // n0x09d2 c0x0000 (---------------) + I xn--io0a7i + 0x00353a8b, // n0x09d3 c0x0000 (---------------) + I xn--lcvr32d + 0x0036704a, // n0x09d4 c0x0000 (---------------) + I xn--mk0axi + 0x0036fa4a, // n0x09d5 c0x0000 (---------------) + I xn--mxtq1m + 0x0037648a, // n0x09d6 c0x0000 (---------------) + I xn--od0alg + 0x0037670b, // n0x09d7 c0x0000 (---------------) + I xn--od0aq3b + 0x00392609, // n0x09d8 c0x0000 (---------------) + I xn--tn0ag + 0x003941ca, // n0x09d9 c0x0000 (---------------) + I xn--uc0atv + 0x0039470b, // n0x09da c0x0000 (---------------) + I xn--uc0ay4a + 0x0039cfcb, // n0x09db c0x0000 (---------------) + I xn--wcvs22d + 0x003a57ca, // n0x09dc c0x0000 (---------------) + I xn--zf0avx + 0x00233503, // n0x09dd c0x0000 (---------------) + I com + 0x0023a783, // n0x09de c0x0000 (---------------) + I edu + 0x00213183, // n0x09df c0x0000 (---------------) + I gob + 0x00209003, // n0x09e0 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x09e1 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x09e2 c0x0000 (---------------) + I org + 0x000ffa08, // n0x09e3 c0x0000 (---------------) + blogspot + 0x00233503, // n0x09e4 c0x0000 (---------------) + I com + 0x00263d84, // n0x09e5 c0x0000 (---------------) + I from + 0x00212582, // n0x09e6 c0x0000 (---------------) + I iz + 0x00205284, // n0x09e7 c0x0000 (---------------) + I name + 0x002a1985, // n0x09e8 c0x0000 (---------------) + I adult + 0x002011c3, // n0x09e9 c0x0000 (---------------) + I art + 0x002d4884, // n0x09ea c0x0000 (---------------) + I asso + 0x00233503, // n0x09eb c0x0000 (---------------) + I com + 0x0023d684, // n0x09ec c0x0000 (---------------) + I coop + 0x0023a783, // n0x09ed c0x0000 (---------------) + I edu + 0x0024d9c4, // n0x09ee c0x0000 (---------------) + I firm + 0x0033d7c4, // n0x09ef c0x0000 (---------------) + I gouv + 0x003a1244, // n0x09f0 c0x0000 (---------------) + I info + 0x00213ac3, // n0x09f1 c0x0000 (---------------) + I med + 0x0021fe03, // n0x09f2 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x09f3 c0x0000 (---------------) + I org + 0x00295005, // n0x09f4 c0x0000 (---------------) + I perso + 0x00208103, // n0x09f5 c0x0000 (---------------) + I pol + 0x00220e43, // n0x09f6 c0x0000 (---------------) + I pro + 0x00285b43, // n0x09f7 c0x0000 (---------------) + I rel + 0x00352004, // n0x09f8 c0x0000 (---------------) + I shop + 0x002ee544, // n0x09f9 c0x0000 (---------------) + I 2000 + 0x00258185, // n0x09fa c0x0000 (---------------) + I agrar + 0x000ffa08, // n0x09fb c0x0000 (---------------) + blogspot + 0x002f9244, // n0x09fc c0x0000 (---------------) + I bolt + 0x0037bc46, // n0x09fd c0x0000 (---------------) + I casino + 0x00286744, // n0x09fe c0x0000 (---------------) + I city + 0x00200742, // n0x09ff c0x0000 (---------------) + I co + 0x00343507, // n0x0a00 c0x0000 (---------------) + I erotica + 0x00250887, // n0x0a01 c0x0000 (---------------) + I erotika + 0x0024b784, // n0x0a02 c0x0000 (---------------) + I film + 0x0025b085, // n0x0a03 c0x0000 (---------------) + I forum + 0x003700c5, // n0x0a04 c0x0000 (---------------) + I games + 0x00234dc5, // n0x0a05 c0x0000 (---------------) + I hotel + 0x003a1244, // n0x0a06 c0x0000 (---------------) + I info + 0x00224408, // n0x0a07 c0x0000 (---------------) + I ingatlan + 0x00293246, // n0x0a08 c0x0000 (---------------) + I jogasz + 0x002cce48, // n0x0a09 c0x0000 (---------------) + I konyvelo + 0x002435c5, // n0x0a0a c0x0000 (---------------) + I lakas + 0x003025c5, // n0x0a0b c0x0000 (---------------) + I media + 0x00221dc4, // n0x0a0c c0x0000 (---------------) + I news + 0x0022d1c3, // n0x0a0d c0x0000 (---------------) + I org + 0x002e1c44, // n0x0a0e c0x0000 (---------------) + I priv + 0x00352c46, // n0x0a0f c0x0000 (---------------) + I reklam + 0x00247603, // n0x0a10 c0x0000 (---------------) + I sex + 0x00352004, // n0x0a11 c0x0000 (---------------) + I shop + 0x00294905, // n0x0a12 c0x0000 (---------------) + I sport + 0x0023c004, // n0x0a13 c0x0000 (---------------) + I suli + 0x0020b984, // n0x0a14 c0x0000 (---------------) + I szex + 0x00200142, // n0x0a15 c0x0000 (---------------) + I tm + 0x00270746, // n0x0a16 c0x0000 (---------------) + I tozsde + 0x00389006, // n0x0a17 c0x0000 (---------------) + I utazas + 0x002f5685, // n0x0a18 c0x0000 (---------------) + I video + 0x00201542, // n0x0a19 c0x0000 (---------------) + I ac + 0x00330b83, // n0x0a1a c0x0000 (---------------) + I biz + 0x1c200742, // n0x0a1b c0x0070 (n0x0a24-n0x0a25) + I co + 0x0023bb04, // n0x0a1c c0x0000 (---------------) + I desa + 0x00202d42, // n0x0a1d c0x0000 (---------------) + I go + 0x00209003, // n0x0a1e c0x0000 (---------------) + I mil + 0x00226f02, // n0x0a1f c0x0000 (---------------) + I my + 0x0021fe03, // n0x0a20 c0x0000 (---------------) + I net + 0x00200282, // n0x0a21 c0x0000 (---------------) + I or + 0x00217443, // n0x0a22 c0x0000 (---------------) + I sch + 0x00221a03, // n0x0a23 c0x0000 (---------------) + I web + 0x000ffa08, // n0x0a24 c0x0000 (---------------) + blogspot + 0x000ffa08, // n0x0a25 c0x0000 (---------------) + blogspot + 0x0026cc83, // n0x0a26 c0x0000 (---------------) + I gov + 0x00201542, // n0x0a27 c0x0000 (---------------) + I ac + 0x1ce00742, // n0x0a28 c0x0073 (n0x0a2f-n0x0a30) + I co + 0x0026cc83, // n0x0a29 c0x0000 (---------------) + I gov + 0x00268a83, // n0x0a2a c0x0000 (---------------) + I idf + 0x00309ac3, // n0x0a2b c0x0000 (---------------) + I k12 + 0x002335c4, // n0x0a2c c0x0000 (---------------) + I muni + 0x0021fe03, // n0x0a2d c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0a2e c0x0000 (---------------) + I org + 0x000ffa08, // n0x0a2f c0x0000 (---------------) + blogspot + 0x00201542, // n0x0a30 c0x0000 (---------------) + I ac + 0x1d600742, // n0x0a31 c0x0075 (n0x0a37-n0x0a39) + I co + 0x00233503, // n0x0a32 c0x0000 (---------------) + I com + 0x0021fe03, // n0x0a33 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0a34 c0x0000 (---------------) + I org + 0x0020e842, // n0x0a35 c0x0000 (---------------) + I tt + 0x00224e42, // n0x0a36 c0x0000 (---------------) + I tv + 0x00322cc3, // n0x0a37 c0x0000 (---------------) + I ltd + 0x002db143, // n0x0a38 c0x0000 (---------------) + I plc + 0x00201542, // n0x0a39 c0x0000 (---------------) + I ac + 0x000ffa08, // n0x0a3a c0x0000 (---------------) + blogspot + 0x00200742, // n0x0a3b c0x0000 (---------------) + I co + 0x0023a783, // n0x0a3c c0x0000 (---------------) + I edu + 0x0024d9c4, // n0x0a3d c0x0000 (---------------) + I firm + 0x00205843, // n0x0a3e c0x0000 (---------------) + I gen + 0x0026cc83, // n0x0a3f c0x0000 (---------------) + I gov + 0x0021d883, // n0x0a40 c0x0000 (---------------) + I ind + 0x00209003, // n0x0a41 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x0a42 c0x0000 (---------------) + I net + 0x00218f83, // n0x0a43 c0x0000 (---------------) + I nic + 0x0022d1c3, // n0x0a44 c0x0000 (---------------) + I org + 0x0021d683, // n0x0a45 c0x0000 (---------------) + I res + 0x0011e793, // n0x0a46 c0x0000 (---------------) + barrel-of-knowledge + 0x001246d4, // n0x0a47 c0x0000 (---------------) + barrell-of-knowledge + 0x00013886, // n0x0a48 c0x0000 (---------------) + dyndns + 0x000562c7, // n0x0a49 c0x0000 (---------------) + for-our + 0x00155d09, // n0x0a4a c0x0000 (---------------) + groks-the + 0x000ebb0a, // n0x0a4b c0x0000 (---------------) + groks-this + 0x00087c4d, // n0x0a4c c0x0000 (---------------) + here-for-more + 0x001a408a, // n0x0a4d c0x0000 (---------------) + knowsitall + 0x0006ba86, // n0x0a4e c0x0000 (---------------) + selfip + 0x000eadc6, // n0x0a4f c0x0000 (---------------) + webhop + 0x00204b82, // n0x0a50 c0x0000 (---------------) + I eu + 0x00233503, // n0x0a51 c0x0000 (---------------) + I com + 0x00019506, // n0x0a52 c0x0000 (---------------) + github + 0x00155cc5, // n0x0a53 c0x0000 (---------------) + ngrok + 0x0000cb83, // n0x0a54 c0x0000 (---------------) + nid + 0x00011f88, // n0x0a55 c0x0000 (---------------) + pantheon + 0x000af708, // n0x0a56 c0x0000 (---------------) + sandcats + 0x00233503, // n0x0a57 c0x0000 (---------------) + I com + 0x0023a783, // n0x0a58 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x0a59 c0x0000 (---------------) + I gov + 0x00209003, // n0x0a5a c0x0000 (---------------) + I mil + 0x0021fe03, // n0x0a5b c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0a5c c0x0000 (---------------) + I org + 0x00201542, // n0x0a5d c0x0000 (---------------) + I ac + 0x00200742, // n0x0a5e c0x0000 (---------------) + I co + 0x0026cc83, // n0x0a5f c0x0000 (---------------) + I gov + 0x0020c782, // n0x0a60 c0x0000 (---------------) + I id + 0x0021fe03, // n0x0a61 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0a62 c0x0000 (---------------) + I org + 0x00217443, // n0x0a63 c0x0000 (---------------) + I sch + 0x0035d94f, // n0x0a64 c0x0000 (---------------) + I xn--mgba3a4f16a + 0x0035dd0e, // n0x0a65 c0x0000 (---------------) + I xn--mgba3a4fra + 0x000ffa08, // n0x0a66 c0x0000 (---------------) + blogspot + 0x00233503, // n0x0a67 c0x0000 (---------------) + I com + 0x00048107, // n0x0a68 c0x0000 (---------------) + cupcake + 0x0023a783, // n0x0a69 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x0a6a c0x0000 (---------------) + I gov + 0x00201603, // n0x0a6b c0x0000 (---------------) + I int + 0x0021fe03, // n0x0a6c c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0a6d c0x0000 (---------------) + I org + 0x0021ca03, // n0x0a6e c0x0000 (---------------) + I abr + 0x002ed6c7, // n0x0a6f c0x0000 (---------------) + I abruzzo + 0x00201002, // n0x0a70 c0x0000 (---------------) + I ag + 0x002cd4c9, // n0x0a71 c0x0000 (---------------) + I agrigento + 0x002001c2, // n0x0a72 c0x0000 (---------------) + I al + 0x00233b0b, // n0x0a73 c0x0000 (---------------) + I alessandria + 0x002dfc4a, // n0x0a74 c0x0000 (---------------) + I alto-adige + 0x002e3489, // n0x0a75 c0x0000 (---------------) + I altoadige + 0x00200502, // n0x0a76 c0x0000 (---------------) + I an + 0x00350806, // n0x0a77 c0x0000 (---------------) + I ancona + 0x002847d5, // n0x0a78 c0x0000 (---------------) + I andria-barletta-trani + 0x00233c55, // n0x0a79 c0x0000 (---------------) + I andria-trani-barletta + 0x00290513, // n0x0a7a c0x0000 (---------------) + I andriabarlettatrani + 0x002341d3, // n0x0a7b c0x0000 (---------------) + I andriatranibarletta + 0x002029c2, // n0x0a7c c0x0000 (---------------) + I ao + 0x00216fc5, // n0x0a7d c0x0000 (---------------) + I aosta + 0x0030f30c, // n0x0a7e c0x0000 (---------------) + I aosta-valley + 0x00216fcb, // n0x0a7f c0x0000 (---------------) + I aostavalley + 0x00251085, // n0x0a80 c0x0000 (---------------) + I aoste + 0x00200d02, // n0x0a81 c0x0000 (---------------) + I ap + 0x002003c2, // n0x0a82 c0x0000 (---------------) + I aq + 0x0036c346, // n0x0a83 c0x0000 (---------------) + I aquila + 0x00200a42, // n0x0a84 c0x0000 (---------------) + I ar + 0x0027a406, // n0x0a85 c0x0000 (---------------) + I arezzo + 0x00397ccd, // n0x0a86 c0x0000 (---------------) + I ascoli-piceno + 0x0034c1cc, // n0x0a87 c0x0000 (---------------) + I ascolipiceno + 0x0021e884, // n0x0a88 c0x0000 (---------------) + I asti + 0x00200102, // n0x0a89 c0x0000 (---------------) + I at + 0x00203402, // n0x0a8a c0x0000 (---------------) + I av + 0x00224c08, // n0x0a8b c0x0000 (---------------) + I avellino + 0x00202002, // n0x0a8c c0x0000 (---------------) + I ba + 0x00248586, // n0x0a8d c0x0000 (---------------) + I balsan + 0x00249204, // n0x0a8e c0x0000 (---------------) + I bari + 0x00284995, // n0x0a8f c0x0000 (---------------) + I barletta-trani-andria + 0x00290693, // n0x0a90 c0x0000 (---------------) + I barlettatraniandria + 0x00207fc3, // n0x0a91 c0x0000 (---------------) + I bas + 0x0032ee0a, // n0x0a92 c0x0000 (---------------) + I basilicata + 0x0028e2c7, // n0x0a93 c0x0000 (---------------) + I belluno + 0x002e4949, // n0x0a94 c0x0000 (---------------) + I benevento + 0x00228d47, // n0x0a95 c0x0000 (---------------) + I bergamo + 0x002ee482, // n0x0a96 c0x0000 (---------------) + I bg + 0x00200002, // n0x0a97 c0x0000 (---------------) + I bi + 0x003a4cc6, // n0x0a98 c0x0000 (---------------) + I biella + 0x0020c8c2, // n0x0a99 c0x0000 (---------------) + I bl + 0x000ffa08, // n0x0a9a c0x0000 (---------------) + blogspot + 0x002104c2, // n0x0a9b c0x0000 (---------------) + I bn + 0x0020e402, // n0x0a9c c0x0000 (---------------) + I bo + 0x0038df47, // n0x0a9d c0x0000 (---------------) + I bologna + 0x0020fec7, // n0x0a9e c0x0000 (---------------) + I bolzano + 0x0021c105, // n0x0a9f c0x0000 (---------------) + I bozen + 0x0021c402, // n0x0aa0 c0x0000 (---------------) + I br + 0x0021d647, // n0x0aa1 c0x0000 (---------------) + I brescia + 0x0021d808, // n0x0aa2 c0x0000 (---------------) + I brindisi + 0x00237542, // n0x0aa3 c0x0000 (---------------) + I bs + 0x0021fd02, // n0x0aa4 c0x0000 (---------------) + I bt + 0x00230bc2, // n0x0aa5 c0x0000 (---------------) + I bz + 0x00200302, // n0x0aa6 c0x0000 (---------------) + I ca + 0x0023eb48, // n0x0aa7 c0x0000 (---------------) + I cagliari + 0x00213543, // n0x0aa8 c0x0000 (---------------) + I cal + 0x00285688, // n0x0aa9 c0x0000 (---------------) + I calabria + 0x0023ad8d, // n0x0aaa c0x0000 (---------------) + I caltanissetta + 0x00221ac3, // n0x0aab c0x0000 (---------------) + I cam + 0x00316e08, // n0x0aac c0x0000 (---------------) + I campania + 0x00241acf, // n0x0aad c0x0000 (---------------) + I campidano-medio + 0x00241e8e, // n0x0aae c0x0000 (---------------) + I campidanomedio + 0x0034364a, // n0x0aaf c0x0000 (---------------) + I campobasso + 0x002f6e11, // n0x0ab0 c0x0000 (---------------) + I carbonia-iglesias + 0x002f7290, // n0x0ab1 c0x0000 (---------------) + I carboniaiglesias + 0x002b3b4d, // n0x0ab2 c0x0000 (---------------) + I carrara-massa + 0x002b3e8c, // n0x0ab3 c0x0000 (---------------) + I carraramassa + 0x0022c607, // n0x0ab4 c0x0000 (---------------) + I caserta + 0x0032ef87, // n0x0ab5 c0x0000 (---------------) + I catania + 0x0032f1c9, // n0x0ab6 c0x0000 (---------------) + I catanzaro + 0x0021e982, // n0x0ab7 c0x0000 (---------------) + I cb + 0x00200b42, // n0x0ab8 c0x0000 (---------------) + I ce + 0x0025870c, // n0x0ab9 c0x0000 (---------------) + I cesena-forli + 0x00258a0b, // n0x0aba c0x0000 (---------------) + I cesenaforli + 0x00201582, // n0x0abb c0x0000 (---------------) + I ch + 0x002d5a46, // n0x0abc c0x0000 (---------------) + I chieti + 0x00200682, // n0x0abd c0x0000 (---------------) + I ci + 0x00209182, // n0x0abe c0x0000 (---------------) + I cl + 0x0021ba42, // n0x0abf c0x0000 (---------------) + I cn + 0x00200742, // n0x0ac0 c0x0000 (---------------) + I co + 0x00234804, // n0x0ac1 c0x0000 (---------------) + I como + 0x00240e07, // n0x0ac2 c0x0000 (---------------) + I cosenza + 0x002049c2, // n0x0ac3 c0x0000 (---------------) + I cr + 0x00244d07, // n0x0ac4 c0x0000 (---------------) + I cremona + 0x00245f87, // n0x0ac5 c0x0000 (---------------) + I crotone + 0x00211c82, // n0x0ac6 c0x0000 (---------------) + I cs + 0x00231382, // n0x0ac7 c0x0000 (---------------) + I ct + 0x00247fc5, // n0x0ac8 c0x0000 (---------------) + I cuneo + 0x00229ec2, // n0x0ac9 c0x0000 (---------------) + I cz + 0x0025a38e, // n0x0aca c0x0000 (---------------) + I dell-ogliastra + 0x0026714d, // n0x0acb c0x0000 (---------------) + I dellogliastra + 0x0023a783, // n0x0acc c0x0000 (---------------) + I edu + 0x002543ce, // n0x0acd c0x0000 (---------------) + I emilia-romagna + 0x0036dc0d, // n0x0ace c0x0000 (---------------) + I emiliaromagna + 0x00360a83, // n0x0acf c0x0000 (---------------) + I emr + 0x00202bc2, // n0x0ad0 c0x0000 (---------------) + I en + 0x00205a84, // n0x0ad1 c0x0000 (---------------) + I enna + 0x0024b242, // n0x0ad2 c0x0000 (---------------) + I fc + 0x0020b302, // n0x0ad3 c0x0000 (---------------) + I fe + 0x002e2545, // n0x0ad4 c0x0000 (---------------) + I fermo + 0x00300807, // n0x0ad5 c0x0000 (---------------) + I ferrara + 0x0035d282, // n0x0ad6 c0x0000 (---------------) + I fg + 0x00207502, // n0x0ad7 c0x0000 (---------------) + I fi + 0x0024d307, // n0x0ad8 c0x0000 (---------------) + I firenze + 0x00252748, // n0x0ad9 c0x0000 (---------------) + I florence + 0x00242902, // n0x0ada c0x0000 (---------------) + I fm + 0x003a12c6, // n0x0adb c0x0000 (---------------) + I foggia + 0x0025858c, // n0x0adc c0x0000 (---------------) + I forli-cesena + 0x002588cb, // n0x0add c0x0000 (---------------) + I forlicesena + 0x00200582, // n0x0ade c0x0000 (---------------) + I fr + 0x0026050f, // n0x0adf c0x0000 (---------------) + I friuli-v-giulia + 0x002608d0, // n0x0ae0 c0x0000 (---------------) + I friuli-ve-giulia + 0x00260ccf, // n0x0ae1 c0x0000 (---------------) + I friuli-vegiulia + 0x00261095, // n0x0ae2 c0x0000 (---------------) + I friuli-venezia-giulia + 0x002615d4, // n0x0ae3 c0x0000 (---------------) + I friuli-veneziagiulia + 0x00261ace, // n0x0ae4 c0x0000 (---------------) + I friuli-vgiulia + 0x00261e4e, // n0x0ae5 c0x0000 (---------------) + I friuliv-giulia + 0x002621cf, // n0x0ae6 c0x0000 (---------------) + I friulive-giulia + 0x0026258e, // n0x0ae7 c0x0000 (---------------) + I friulivegiulia + 0x00262914, // n0x0ae8 c0x0000 (---------------) + I friulivenezia-giulia + 0x00262e13, // n0x0ae9 c0x0000 (---------------) + I friuliveneziagiulia + 0x002632cd, // n0x0aea c0x0000 (---------------) + I friulivgiulia + 0x002767c9, // n0x0aeb c0x0000 (---------------) + I frosinone + 0x00288803, // n0x0aec c0x0000 (---------------) + I fvg + 0x002026c2, // n0x0aed c0x0000 (---------------) + I ge + 0x00307105, // n0x0aee c0x0000 (---------------) + I genoa + 0x00205846, // n0x0aef c0x0000 (---------------) + I genova + 0x00202d42, // n0x0af0 c0x0000 (---------------) + I go + 0x0026edc7, // n0x0af1 c0x0000 (---------------) + I gorizia + 0x0026cc83, // n0x0af2 c0x0000 (---------------) + I gov + 0x00200c82, // n0x0af3 c0x0000 (---------------) + I gr + 0x00311b48, // n0x0af4 c0x0000 (---------------) + I grosseto + 0x002f7051, // n0x0af5 c0x0000 (---------------) + I iglesias-carbonia + 0x002f7490, // n0x0af6 c0x0000 (---------------) + I iglesiascarbonia + 0x00205c42, // n0x0af7 c0x0000 (---------------) + I im + 0x00352747, // n0x0af8 c0x0000 (---------------) + I imperia + 0x002006c2, // n0x0af9 c0x0000 (---------------) + I is + 0x0025dc87, // n0x0afa c0x0000 (---------------) + I isernia + 0x00206fc2, // n0x0afb c0x0000 (---------------) + I kr + 0x0025e389, // n0x0afc c0x0000 (---------------) + I la-spezia + 0x0036c307, // n0x0afd c0x0000 (---------------) + I laquila + 0x0025fe48, // n0x0afe c0x0000 (---------------) + I laspezia + 0x00223606, // n0x0aff c0x0000 (---------------) + I latina + 0x002db043, // n0x0b00 c0x0000 (---------------) + I laz + 0x00309045, // n0x0b01 c0x0000 (---------------) + I lazio + 0x0023aa02, // n0x0b02 c0x0000 (---------------) + I lc + 0x0020acc2, // n0x0b03 c0x0000 (---------------) + I le + 0x003a50c5, // n0x0b04 c0x0000 (---------------) + I lecce + 0x0022e105, // n0x0b05 c0x0000 (---------------) + I lecco + 0x00207202, // n0x0b06 c0x0000 (---------------) + I li + 0x0023c083, // n0x0b07 c0x0000 (---------------) + I lig + 0x0023c087, // n0x0b08 c0x0000 (---------------) + I liguria + 0x00210307, // n0x0b09 c0x0000 (---------------) + I livorno + 0x00200242, // n0x0b0a c0x0000 (---------------) + I lo + 0x00259dc4, // n0x0b0b c0x0000 (---------------) + I lodi + 0x00214303, // n0x0b0c c0x0000 (---------------) + I lom + 0x002c4149, // n0x0b0d c0x0000 (---------------) + I lombardia + 0x002db908, // n0x0b0e c0x0000 (---------------) + I lombardy + 0x00209e02, // n0x0b0f c0x0000 (---------------) + I lt + 0x00202f42, // n0x0b10 c0x0000 (---------------) + I lu + 0x0026d147, // n0x0b11 c0x0000 (---------------) + I lucania + 0x002b6305, // n0x0b12 c0x0000 (---------------) + I lucca + 0x00316908, // n0x0b13 c0x0000 (---------------) + I macerata + 0x003a0a07, // n0x0b14 c0x0000 (---------------) + I mantova + 0x00201183, // n0x0b15 c0x0000 (---------------) + I mar + 0x00284246, // n0x0b16 c0x0000 (---------------) + I marche + 0x002b39cd, // n0x0b17 c0x0000 (---------------) + I massa-carrara + 0x002b3d4c, // n0x0b18 c0x0000 (---------------) + I massacarrara + 0x00256e86, // n0x0b19 c0x0000 (---------------) + I matera + 0x00208602, // n0x0b1a c0x0000 (---------------) + I mb + 0x0022ac02, // n0x0b1b c0x0000 (---------------) + I mc + 0x00203e82, // n0x0b1c c0x0000 (---------------) + I me + 0x0024194f, // n0x0b1d c0x0000 (---------------) + I medio-campidano + 0x00241d4e, // n0x0b1e c0x0000 (---------------) + I mediocampidano + 0x00370147, // n0x0b1f c0x0000 (---------------) + I messina + 0x00209002, // n0x0b20 c0x0000 (---------------) + I mi + 0x00342685, // n0x0b21 c0x0000 (---------------) + I milan + 0x00342686, // n0x0b22 c0x0000 (---------------) + I milano + 0x0021fdc2, // n0x0b23 c0x0000 (---------------) + I mn + 0x00207102, // n0x0b24 c0x0000 (---------------) + I mo + 0x00218306, // n0x0b25 c0x0000 (---------------) + I modena + 0x002133c3, // n0x0b26 c0x0000 (---------------) + I mol + 0x0025dbc6, // n0x0b27 c0x0000 (---------------) + I molise + 0x002c2d45, // n0x0b28 c0x0000 (---------------) + I monza + 0x002c2d4d, // n0x0b29 c0x0000 (---------------) + I monza-brianza + 0x002c3595, // n0x0b2a c0x0000 (---------------) + I monza-e-della-brianza + 0x002c3d4c, // n0x0b2b c0x0000 (---------------) + I monzabrianza + 0x002c4a4d, // n0x0b2c c0x0000 (---------------) + I monzaebrianza + 0x002c4e12, // n0x0b2d c0x0000 (---------------) + I monzaedellabrianza + 0x0020f702, // n0x0b2e c0x0000 (---------------) + I ms + 0x00204c02, // n0x0b2f c0x0000 (---------------) + I mt + 0x00201402, // n0x0b30 c0x0000 (---------------) + I na + 0x00235006, // n0x0b31 c0x0000 (---------------) + I naples + 0x002a3d86, // n0x0b32 c0x0000 (---------------) + I napoli + 0x00200c02, // n0x0b33 c0x0000 (---------------) + I no + 0x002058c6, // n0x0b34 c0x0000 (---------------) + I novara + 0x002017c2, // n0x0b35 c0x0000 (---------------) + I nu + 0x0039c105, // n0x0b36 c0x0000 (---------------) + I nuoro + 0x00200c42, // n0x0b37 c0x0000 (---------------) + I og + 0x0025a4c9, // n0x0b38 c0x0000 (---------------) + I ogliastra + 0x0027568c, // n0x0b39 c0x0000 (---------------) + I olbia-tempio + 0x002759cb, // n0x0b3a c0x0000 (---------------) + I olbiatempio + 0x00200282, // n0x0b3b c0x0000 (---------------) + I or + 0x00252b88, // n0x0b3c c0x0000 (---------------) + I oristano + 0x00200782, // n0x0b3d c0x0000 (---------------) + I ot + 0x0020ac42, // n0x0b3e c0x0000 (---------------) + I pa + 0x00216d86, // n0x0b3f c0x0000 (---------------) + I padova + 0x00361405, // n0x0b40 c0x0000 (---------------) + I padua + 0x00379f47, // n0x0b41 c0x0000 (---------------) + I palermo + 0x00395345, // n0x0b42 c0x0000 (---------------) + I parma + 0x002dbfc5, // n0x0b43 c0x0000 (---------------) + I pavia + 0x00248182, // n0x0b44 c0x0000 (---------------) + I pc + 0x00352102, // n0x0b45 c0x0000 (---------------) + I pd + 0x00207782, // n0x0b46 c0x0000 (---------------) + I pe + 0x00270d47, // n0x0b47 c0x0000 (---------------) + I perugia + 0x0031c84d, // n0x0b48 c0x0000 (---------------) + I pesaro-urbino + 0x0031cbcc, // n0x0b49 c0x0000 (---------------) + I pesarourbino + 0x00236987, // n0x0b4a c0x0000 (---------------) + I pescara + 0x002495c2, // n0x0b4b c0x0000 (---------------) + I pg + 0x00225702, // n0x0b4c c0x0000 (---------------) + I pi + 0x00338288, // n0x0b4d c0x0000 (---------------) + I piacenza + 0x00258dc8, // n0x0b4e c0x0000 (---------------) + I piedmont + 0x002d6308, // n0x0b4f c0x0000 (---------------) + I piemonte + 0x002df704, // n0x0b50 c0x0000 (---------------) + I pisa + 0x002bee07, // n0x0b51 c0x0000 (---------------) + I pistoia + 0x002dcc83, // n0x0b52 c0x0000 (---------------) + I pmn + 0x002493c2, // n0x0b53 c0x0000 (---------------) + I pn + 0x00200942, // n0x0b54 c0x0000 (---------------) + I po + 0x002dfec9, // n0x0b55 c0x0000 (---------------) + I pordenone + 0x002093c7, // n0x0b56 c0x0000 (---------------) + I potenza + 0x00204602, // n0x0b57 c0x0000 (---------------) + I pr + 0x00270245, // n0x0b58 c0x0000 (---------------) + I prato + 0x0028c9c2, // n0x0b59 c0x0000 (---------------) + I pt + 0x00235302, // n0x0b5a c0x0000 (---------------) + I pu + 0x00278843, // n0x0b5b c0x0000 (---------------) + I pug + 0x00278846, // n0x0b5c c0x0000 (---------------) + I puglia + 0x002e5542, // n0x0b5d c0x0000 (---------------) + I pv + 0x002e6302, // n0x0b5e c0x0000 (---------------) + I pz + 0x002005c2, // n0x0b5f c0x0000 (---------------) + I ra + 0x0030c246, // n0x0b60 c0x0000 (---------------) + I ragusa + 0x002059c7, // n0x0b61 c0x0000 (---------------) + I ravenna + 0x002002c2, // n0x0b62 c0x0000 (---------------) + I rc + 0x00207002, // n0x0b63 c0x0000 (---------------) + I re + 0x002ed34f, // n0x0b64 c0x0000 (---------------) + I reggio-calabria + 0x0025420d, // n0x0b65 c0x0000 (---------------) + I reggio-emilia + 0x0028550e, // n0x0b66 c0x0000 (---------------) + I reggiocalabria + 0x0036da8c, // n0x0b67 c0x0000 (---------------) + I reggioemilia + 0x0020ce02, // n0x0b68 c0x0000 (---------------) + I rg + 0x00200a82, // n0x0b69 c0x0000 (---------------) + I ri + 0x00223445, // n0x0b6a c0x0000 (---------------) + I rieti + 0x003a5bc6, // n0x0b6b c0x0000 (---------------) + I rimini + 0x00222182, // n0x0b6c c0x0000 (---------------) + I rm + 0x0020cb42, // n0x0b6d c0x0000 (---------------) + I rn + 0x00202202, // n0x0b6e c0x0000 (---------------) + I ro + 0x00254584, // n0x0b6f c0x0000 (---------------) + I roma + 0x002dd584, // n0x0b70 c0x0000 (---------------) + I rome + 0x00334fc6, // n0x0b71 c0x0000 (---------------) + I rovigo + 0x002004c2, // n0x0b72 c0x0000 (---------------) + I sa + 0x00279747, // n0x0b73 c0x0000 (---------------) + I salerno + 0x002257c3, // n0x0b74 c0x0000 (---------------) + I sar + 0x00226048, // n0x0b75 c0x0000 (---------------) + I sardegna + 0x00227248, // n0x0b76 c0x0000 (---------------) + I sardinia + 0x00378687, // n0x0b77 c0x0000 (---------------) + I sassari + 0x00234f06, // n0x0b78 c0x0000 (---------------) + I savona + 0x0020a402, // n0x0b79 c0x0000 (---------------) + I si + 0x0023eac3, // n0x0b7a c0x0000 (---------------) + I sic + 0x0036e647, // n0x0b7b c0x0000 (---------------) + I sicilia + 0x00252146, // n0x0b7c c0x0000 (---------------) + I sicily + 0x002c8945, // n0x0b7d c0x0000 (---------------) + I siena + 0x003419c8, // n0x0b7e c0x0000 (---------------) + I siracusa + 0x00205682, // n0x0b7f c0x0000 (---------------) + I so + 0x00308547, // n0x0b80 c0x0000 (---------------) + I sondrio + 0x00209382, // n0x0b81 c0x0000 (---------------) + I sp + 0x0033b802, // n0x0b82 c0x0000 (---------------) + I sr + 0x002067c2, // n0x0b83 c0x0000 (---------------) + I ss + 0x002cebc9, // n0x0b84 c0x0000 (---------------) + I suedtirol + 0x00235f42, // n0x0b85 c0x0000 (---------------) + I sv + 0x00200a02, // n0x0b86 c0x0000 (---------------) + I ta + 0x00234603, // n0x0b87 c0x0000 (---------------) + I taa + 0x003096c7, // n0x0b88 c0x0000 (---------------) + I taranto + 0x002012c2, // n0x0b89 c0x0000 (---------------) + I te + 0x0027580c, // n0x0b8a c0x0000 (---------------) + I tempio-olbia + 0x00275b0b, // n0x0b8b c0x0000 (---------------) + I tempioolbia + 0x00256f06, // n0x0b8c c0x0000 (---------------) + I teramo + 0x0020cac5, // n0x0b8d c0x0000 (---------------) + I terni + 0x0024f882, // n0x0b8e c0x0000 (---------------) + I tn + 0x00208082, // n0x0b8f c0x0000 (---------------) + I to + 0x002b1946, // n0x0b90 c0x0000 (---------------) + I torino + 0x002280c3, // n0x0b91 c0x0000 (---------------) + I tos + 0x00324e47, // n0x0b92 c0x0000 (---------------) + I toscana + 0x00211f42, // n0x0b93 c0x0000 (---------------) + I tp + 0x00203002, // n0x0b94 c0x0000 (---------------) + I tr + 0x00284655, // n0x0b95 c0x0000 (---------------) + I trani-andria-barletta + 0x00233e15, // n0x0b96 c0x0000 (---------------) + I trani-barletta-andria + 0x002903d3, // n0x0b97 c0x0000 (---------------) + I traniandriabarletta + 0x00234353, // n0x0b98 c0x0000 (---------------) + I tranibarlettaandria + 0x00294a07, // n0x0b99 c0x0000 (---------------) + I trapani + 0x002b7688, // n0x0b9a c0x0000 (---------------) + I trentino + 0x002cf4d0, // n0x0b9b c0x0000 (---------------) + I trentino-a-adige + 0x002ef2cf, // n0x0b9c c0x0000 (---------------) + I trentino-aadige + 0x00342d53, // n0x0b9d c0x0000 (---------------) + I trentino-alto-adige + 0x0034eb92, // n0x0b9e c0x0000 (---------------) + I trentino-altoadige + 0x002cd090, // n0x0b9f c0x0000 (---------------) + I trentino-s-tirol + 0x002b768f, // n0x0ba0 c0x0000 (---------------) + I trentino-stirol + 0x002ba492, // n0x0ba1 c0x0000 (---------------) + I trentino-sud-tirol + 0x002c2911, // n0x0ba2 c0x0000 (---------------) + I trentino-sudtirol + 0x002ca953, // n0x0ba3 c0x0000 (---------------) + I trentino-sued-tirol + 0x002ce992, // n0x0ba4 c0x0000 (---------------) + I trentino-suedtirol + 0x002cfd4f, // n0x0ba5 c0x0000 (---------------) + I trentinoa-adige + 0x002d4c8e, // n0x0ba6 c0x0000 (---------------) + I trentinoaadige + 0x002dfa52, // n0x0ba7 c0x0000 (---------------) + I trentinoalto-adige + 0x002e3291, // n0x0ba8 c0x0000 (---------------) + I trentinoaltoadige + 0x002e3a8f, // n0x0ba9 c0x0000 (---------------) + I trentinos-tirol + 0x002e55ce, // n0x0baa c0x0000 (---------------) + I trentinostirol + 0x002e6691, // n0x0bab c0x0000 (---------------) + I trentinosud-tirol + 0x002f3a90, // n0x0bac c0x0000 (---------------) + I trentinosudtirol + 0x0035a592, // n0x0bad c0x0000 (---------------) + I trentinosued-tirol + 0x002e8b91, // n0x0bae c0x0000 (---------------) + I trentinosuedtirol + 0x002f8a86, // n0x0baf c0x0000 (---------------) + I trento + 0x002f9307, // n0x0bb0 c0x0000 (---------------) + I treviso + 0x003673c7, // n0x0bb1 c0x0000 (---------------) + I trieste + 0x00203f42, // n0x0bb2 c0x0000 (---------------) + I ts + 0x0027f145, // n0x0bb3 c0x0000 (---------------) + I turin + 0x002f2c87, // n0x0bb4 c0x0000 (---------------) + I tuscany + 0x00224e42, // n0x0bb5 c0x0000 (---------------) + I tv + 0x00209242, // n0x0bb6 c0x0000 (---------------) + I ud + 0x0022a285, // n0x0bb7 c0x0000 (---------------) + I udine + 0x0021e183, // n0x0bb8 c0x0000 (---------------) + I umb + 0x00258406, // n0x0bb9 c0x0000 (---------------) + I umbria + 0x0031ca0d, // n0x0bba c0x0000 (---------------) + I urbino-pesaro + 0x0031cd4c, // n0x0bbb c0x0000 (---------------) + I urbinopesaro + 0x002000c2, // n0x0bbc c0x0000 (---------------) + I va + 0x0030f18b, // n0x0bbd c0x0000 (---------------) + I val-d-aosta + 0x00216e8a, // n0x0bbe c0x0000 (---------------) + I val-daosta + 0x00323dca, // n0x0bbf c0x0000 (---------------) + I vald-aosta + 0x002b09c9, // n0x0bc0 c0x0000 (---------------) + I valdaosta + 0x002deb4b, // n0x0bc1 c0x0000 (---------------) + I valle-aosta + 0x003a0b4d, // n0x0bc2 c0x0000 (---------------) + I valle-d-aosta + 0x002f338c, // n0x0bc3 c0x0000 (---------------) + I valle-daosta + 0x00224e8a, // n0x0bc4 c0x0000 (---------------) + I valleaosta + 0x0022594c, // n0x0bc5 c0x0000 (---------------) + I valled-aosta + 0x0024098b, // n0x0bc6 c0x0000 (---------------) + I valledaosta + 0x00250ecc, // n0x0bc7 c0x0000 (---------------) + I vallee-aoste + 0x0025184b, // n0x0bc8 c0x0000 (---------------) + I valleeaoste + 0x00275603, // n0x0bc9 c0x0000 (---------------) + I vao + 0x002894c6, // n0x0bca c0x0000 (---------------) + I varese + 0x002dc5c2, // n0x0bcb c0x0000 (---------------) + I vb + 0x002e6b02, // n0x0bcc c0x0000 (---------------) + I vc + 0x00210243, // n0x0bcd c0x0000 (---------------) + I vda + 0x00202b82, // n0x0bce c0x0000 (---------------) + I ve + 0x00202b83, // n0x0bcf c0x0000 (---------------) + I ven + 0x00375e46, // n0x0bd0 c0x0000 (---------------) + I veneto + 0x00261247, // n0x0bd1 c0x0000 (---------------) + I venezia + 0x0026f246, // n0x0bd2 c0x0000 (---------------) + I venice + 0x0022d688, // n0x0bd3 c0x0000 (---------------) + I verbania + 0x002dddc8, // n0x0bd4 c0x0000 (---------------) + I vercelli + 0x003607c6, // n0x0bd5 c0x0000 (---------------) + I verona + 0x00205d42, // n0x0bd6 c0x0000 (---------------) + I vi + 0x002f504d, // n0x0bd7 c0x0000 (---------------) + I vibo-valentia + 0x002f538c, // n0x0bd8 c0x0000 (---------------) + I vibovalentia + 0x0033d887, // n0x0bd9 c0x0000 (---------------) + I vicenza + 0x002f9107, // n0x0bda c0x0000 (---------------) + I viterbo + 0x00211082, // n0x0bdb c0x0000 (---------------) + I vr + 0x00227982, // n0x0bdc c0x0000 (---------------) + I vs + 0x00271f82, // n0x0bdd c0x0000 (---------------) + I vt + 0x00214982, // n0x0bde c0x0000 (---------------) + I vv + 0x00200742, // n0x0bdf c0x0000 (---------------) + I co + 0x0021fe03, // n0x0be0 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0be1 c0x0000 (---------------) + I org + 0x00233503, // n0x0be2 c0x0000 (---------------) + I com + 0x0023a783, // n0x0be3 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x0be4 c0x0000 (---------------) + I gov + 0x00209003, // n0x0be5 c0x0000 (---------------) + I mil + 0x00205284, // n0x0be6 c0x0000 (---------------) + I name + 0x0021fe03, // n0x0be7 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x0be8 c0x0000 (---------------) + I org + 0x00217443, // n0x0be9 c0x0000 (---------------) + I sch + 0x00201542, // n0x0bea c0x0000 (---------------) + I ac + 0x00200342, // n0x0beb c0x0000 (---------------) + I ad + 0x2068f505, // n0x0bec c0x0081 (n0x0c59-n0x0c8d) + I aichi + 0x20a01dc5, // n0x0bed c0x0082 (n0x0c8d-n0x0ca9) + I akita + 0x20f0bf06, // n0x0bee c0x0083 (n0x0ca9-n0x0cbf) + I aomori + 0x000ffa08, // n0x0bef c0x0000 (---------------) + blogspot + 0x212add45, // n0x0bf0 c0x0084 (n0x0cbf-n0x0cf9) + I chiba + 0x00200742, // n0x0bf1 c0x0000 (---------------) + I co + 0x00202602, // n0x0bf2 c0x0000 (---------------) + I ed + 0x21629005, // n0x0bf3 c0x0085 (n0x0cf9-n0x0d0f) + I ehime + 0x21a7dac5, // n0x0bf4 c0x0086 (n0x0d0f-n0x0d1e) + I fukui + 0x21e7e807, // n0x0bf5 c0x0087 (n0x0d1e-n0x0d5d) + I fukuoka + 0x2232fcc9, // n0x0bf6 c0x0088 (n0x0d5d-n0x0d90) + I fukushima + 0x2276aec4, // n0x0bf7 c0x0089 (n0x0d90-n0x0db6) + I gifu + 0x00202d42, // n0x0bf8 c0x0000 (---------------) + I go + 0x00200c82, // n0x0bf9 c0x0000 (---------------) + I gr + 0x22b66385, // n0x0bfa c0x008a (n0x0db6-n0x0dda) + I gunma + 0x22e0ee49, // n0x0bfb c0x008b (n0x0dda-n0x0df3) + I hiroshima + 0x23369e88, // n0x0bfc c0x008c (n0x0df3-n0x0e81) + I hokkaido + 0x236aba85, // n0x0bfd c0x008d (n0x0e81-n0x0eaf) + I hyogo + 0x23ac1ac7, // n0x0bfe c0x008e (n0x0eaf-n0x0ee2) + I ibaraki + 0x23e1a4c8, // n0x0bff c0x008f (n0x0ee2-n0x0ef5) + I ishikawa + 0x242d8485, // n0x0c00 c0x0090 (n0x0ef5-n0x0f17) + I iwate + 0x24600fc6, // n0x0c01 c0x0091 (n0x0f17-n0x0f26) + I kagawa + 0x24a76189, // n0x0c02 c0x0092 (n0x0f26-n0x0f3a) + I kagoshima + 0x24f1a4c8, // n0x0c03 c0x0093 (n0x0f3a-n0x0f58) + I kanagawa + 0x252b9088, // n0x0c04 c0x0094 (n0x0f58-n0x0f59)* o I kawasaki + 0x2569c90a, // n0x0c05 c0x0095 (n0x0f59-n0x0f5a)* o I kitakyushu + 0x25a4f544, // n0x0c06 c0x0096 (n0x0f5a-n0x0f5b)* o I kobe + 0x25ecb145, // n0x0c07 c0x0097 (n0x0f5b-n0x0f7a) + I kochi + 0x262b3748, // n0x0c08 c0x0098 (n0x0f7a-n0x0f94) + I kumamoto + 0x266be0c5, // n0x0c09 c0x0099 (n0x0f94-n0x0fb3) + I kyoto + 0x00219082, // n0x0c0a c0x0000 (---------------) + I lg + 0x26a4b943, // n0x0c0b c0x009a (n0x0fb3-n0x0fd1) + I mie + 0x26ea29c6, // n0x0c0c c0x009b (n0x0fd1-n0x0ff2) + I miyagi + 0x27266108, // n0x0c0d c0x009c (n0x0ff2-n0x100d) + I miyazaki + 0x27754f86, // n0x0c0e c0x009d (n0x100d-n0x1058) + I nagano + 0x27adda48, // n0x0c0f c0x009e (n0x1058-n0x106e) + I nagasaki + 0x27f0f646, // n0x0c10 c0x009f (n0x106e-n0x106f)* o I nagoya + 0x282c8a04, // n0x0c11 c0x00a0 (n0x106f-n0x1095) + I nara + 0x00202c02, // n0x0c12 c0x0000 (---------------) + I ne + 0x2863ff87, // n0x0c13 c0x00a1 (n0x1095-n0x10b7) + I niigata + 0x28aa8984, // n0x0c14 c0x00a2 (n0x10b7-n0x10ca) + I oita + 0x28e78dc7, // n0x0c15 c0x00a3 (n0x10ca-n0x10e4) + I okayama + 0x29395b47, // n0x0c16 c0x00a4 (n0x10e4-n0x110e) + I okinawa + 0x00200282, // n0x0c17 c0x0000 (---------------) + I or + 0x2969ac45, // n0x0c18 c0x00a5 (n0x110e-n0x1140) + I osaka + 0x29a38904, // n0x0c19 c0x00a6 (n0x1140-n0x115a) + I saga + 0x29ed9247, // n0x0c1a c0x00a7 (n0x115a-n0x119f) + I saitama + 0x2a221087, // n0x0c1b c0x00a8 (n0x119f-n0x11a0)* o I sapporo + 0x2a682b06, // n0x0c1c c0x00a9 (n0x11a0-n0x11a1)* o I sendai + 0x2aa285c5, // n0x0c1d c0x00aa (n0x11a1-n0x11b8) + I shiga + 0x2ae93dc7, // n0x0c1e c0x00ab (n0x11b8-n0x11cf) + I shimane + 0x2b2b2608, // n0x0c1f c0x00ac (n0x11cf-n0x11f3) + I shizuoka + 0x2b744e07, // n0x0c20 c0x00ad (n0x11f3-n0x1212) + I tochigi + 0x2ba99fc9, // n0x0c21 c0x00ae (n0x1212-n0x1223) + I tokushima + 0x2bf41c05, // n0x0c22 c0x00af (n0x1223-n0x125c) + I tokyo + 0x2c2f8b87, // n0x0c23 c0x00b0 (n0x125c-n0x1269) + I tottori + 0x2c68e9c6, // n0x0c24 c0x00b1 (n0x1269-n0x1281) + I toyama + 0x2ca23ac8, // n0x0c25 c0x00b2 (n0x1281-n0x129e) + I wakayama + 0x0038988d, // n0x0c26 c0x0000 (---------------) + I xn--0trq7p7nn + 0x0024e389, // n0x0c27 c0x0000 (---------------) + I xn--1ctwo + 0x0025c1cb, // n0x0c28 c0x0000 (---------------) + I xn--1lqs03n + 0x0026024b, // n0x0c29 c0x0000 (---------------) + I xn--1lqs71d + 0x0027348b, // n0x0c2a c0x0000 (---------------) + I xn--2m4a15e + 0x002a5bcb, // n0x0c2b c0x0000 (---------------) + I xn--32vp30h + 0x0030168b, // n0x0c2c c0x0000 (---------------) + I xn--4it168d + 0x0030194b, // n0x0c2d c0x0000 (---------------) + I xn--4it797k + 0x00301d89, // n0x0c2e c0x0000 (---------------) + I xn--4pvxs + 0x00302c4b, // n0x0c2f c0x0000 (---------------) + I xn--5js045d + 0x00302f0b, // n0x0c30 c0x0000 (---------------) + I xn--5rtp49c + 0x0030338b, // n0x0c31 c0x0000 (---------------) + I xn--5rtq34k + 0x003043ca, // n0x0c32 c0x0000 (---------------) + I xn--6btw5a + 0x0030490a, // n0x0c33 c0x0000 (---------------) + I xn--6orx2r + 0x00304f0c, // n0x0c34 c0x0000 (---------------) + I xn--7t0a264c + 0x0030a1cb, // n0x0c35 c0x0000 (---------------) + I xn--8ltr62k + 0x0030a74a, // n0x0c36 c0x0000 (---------------) + I xn--8pvr4u + 0x0031918a, // n0x0c37 c0x0000 (---------------) + I xn--c3s14m + 0x0032940e, // n0x0c38 c0x0000 (---------------) + I xn--d5qv7z876c + 0x0032a1ce, // n0x0c39 c0x0000 (---------------) + I xn--djrs72d6uy + 0x0032a54a, // n0x0c3a c0x0000 (---------------) + I xn--djty4k + 0x0032bb0a, // n0x0c3b c0x0000 (---------------) + I xn--efvn9s + 0x0032c78b, // n0x0c3c c0x0000 (---------------) + I xn--ehqz56n + 0x0032ca4b, // n0x0c3d c0x0000 (---------------) + I xn--elqq16h + 0x0032d78b, // n0x0c3e c0x0000 (---------------) + I xn--f6qx53a + 0x0034834b, // n0x0c3f c0x0000 (---------------) + I xn--k7yn95e + 0x0034894a, // n0x0c40 c0x0000 (---------------) + I xn--kbrq7o + 0x0034960b, // n0x0c41 c0x0000 (---------------) + I xn--klt787d + 0x003498ca, // n0x0c42 c0x0000 (---------------) + I xn--kltp7d + 0x00349b4a, // n0x0c43 c0x0000 (---------------) + I xn--kltx9a + 0x00349dca, // n0x0c44 c0x0000 (---------------) + I xn--klty5x + 0x00367e8b, // n0x0c45 c0x0000 (---------------) + I xn--mkru45i + 0x0037178b, // n0x0c46 c0x0000 (---------------) + I xn--nit225k + 0x003733ce, // n0x0c47 c0x0000 (---------------) + I xn--ntso0iqx3a + 0x0037374b, // n0x0c48 c0x0000 (---------------) + I xn--ntsq17g + 0x0037b18b, // n0x0c49 c0x0000 (---------------) + I xn--pssu33l + 0x0037d28b, // n0x0c4a c0x0000 (---------------) + I xn--qqqt11m + 0x0038144a, // n0x0c4b c0x0000 (---------------) + I xn--rht27z + 0x003816c9, // n0x0c4c c0x0000 (---------------) + I xn--rht3d + 0x0038190a, // n0x0c4d c0x0000 (---------------) + I xn--rht61e + 0x00382f8a, // n0x0c4e c0x0000 (---------------) + I xn--rny31h + 0x00392e8b, // n0x0c4f c0x0000 (---------------) + I xn--tor131o + 0x003949cb, // n0x0c50 c0x0000 (---------------) + I xn--uist22h + 0x0039548a, // n0x0c51 c0x0000 (---------------) + I xn--uisz3g + 0x003967cb, // n0x0c52 c0x0000 (---------------) + I xn--uuwu58a + 0x0039a30b, // n0x0c53 c0x0000 (---------------) + I xn--vgu402c + 0x003a520b, // n0x0c54 c0x0000 (---------------) + I xn--zbx025d + 0x2ce808c8, // n0x0c55 c0x00b3 (n0x129e-n0x12c0) + I yamagata + 0x2d2873c9, // n0x0c56 c0x00b4 (n0x12c0-n0x12d0) + I yamaguchi + 0x2d6a15c9, // n0x0c57 c0x00b5 (n0x12d0-n0x12ec) + I yamanashi + 0x2dad09c8, // n0x0c58 c0x00b6 (n0x12ec-n0x12ed)* o I yokohama + 0x00334d45, // n0x0c59 c0x0000 (---------------) + I aisai + 0x00201883, // n0x0c5a c0x0000 (---------------) + I ama + 0x00203fc4, // n0x0c5b c0x0000 (---------------) + I anjo + 0x00360985, // n0x0c5c c0x0000 (---------------) + I asuke + 0x0036ac06, // n0x0c5d c0x0000 (---------------) + I chiryu + 0x002ac6c5, // n0x0c5e c0x0000 (---------------) + I chita + 0x00286bc4, // n0x0c5f c0x0000 (---------------) + I fuso + 0x0026ecc8, // n0x0c60 c0x0000 (---------------) + I gamagori + 0x00256185, // n0x0c61 c0x0000 (---------------) + I handa + 0x0028ff84, // n0x0c62 c0x0000 (---------------) + I hazu + 0x002c3247, // n0x0c63 c0x0000 (---------------) + I hekinan + 0x0029d24a, // n0x0c64 c0x0000 (---------------) + I higashiura + 0x002d218a, // n0x0c65 c0x0000 (---------------) + I ichinomiya + 0x0032bfc7, // n0x0c66 c0x0000 (---------------) + I inazawa + 0x00201787, // n0x0c67 c0x0000 (---------------) + I inuyama + 0x002f2007, // n0x0c68 c0x0000 (---------------) + I isshiki + 0x0031d107, // n0x0c69 c0x0000 (---------------) + I iwakura + 0x002a25c5, // n0x0c6a c0x0000 (---------------) + I kanie + 0x00325246, // n0x0c6b c0x0000 (---------------) + I kariya + 0x00321d87, // n0x0c6c c0x0000 (---------------) + I kasugai + 0x002571c4, // n0x0c6d c0x0000 (---------------) + I kira + 0x002f0206, // n0x0c6e c0x0000 (---------------) + I kiyosu + 0x00296f06, // n0x0c6f c0x0000 (---------------) + I komaki + 0x00206b85, // n0x0c70 c0x0000 (---------------) + I konan + 0x00229444, // n0x0c71 c0x0000 (---------------) + I kota + 0x002da306, // n0x0c72 c0x0000 (---------------) + I mihama + 0x0029c447, // n0x0c73 c0x0000 (---------------) + I miyoshi + 0x002251c6, // n0x0c74 c0x0000 (---------------) + I nishio + 0x00266c47, // n0x0c75 c0x0000 (---------------) + I nisshin + 0x0027cb43, // n0x0c76 c0x0000 (---------------) + I obu + 0x00252346, // n0x0c77 c0x0000 (---------------) + I oguchi + 0x00236085, // n0x0c78 c0x0000 (---------------) + I oharu + 0x0027e907, // n0x0c79 c0x0000 (---------------) + I okazaki + 0x002bf04a, // n0x0c7a c0x0000 (---------------) + I owariasahi + 0x002ae744, // n0x0c7b c0x0000 (---------------) + I seto + 0x00219288, // n0x0c7c c0x0000 (---------------) + I shikatsu + 0x00299589, // n0x0c7d c0x0000 (---------------) + I shinshiro + 0x002aff87, // n0x0c7e c0x0000 (---------------) + I shitara + 0x002e8506, // n0x0c7f c0x0000 (---------------) + I tahara + 0x00365ec8, // n0x0c80 c0x0000 (---------------) + I takahama + 0x00307489, // n0x0c81 c0x0000 (---------------) + I tobishima + 0x00375f44, // n0x0c82 c0x0000 (---------------) + I toei + 0x00337204, // n0x0c83 c0x0000 (---------------) + I togo + 0x002fa0c5, // n0x0c84 c0x0000 (---------------) + I tokai + 0x002bfec8, // n0x0c85 c0x0000 (---------------) + I tokoname + 0x002c0907, // n0x0c86 c0x0000 (---------------) + I toyoake + 0x0028df09, // n0x0c87 c0x0000 (---------------) + I toyohashi + 0x00247dc8, // n0x0c88 c0x0000 (---------------) + I toyokawa + 0x00366606, // n0x0c89 c0x0000 (---------------) + I toyone + 0x0025bb86, // n0x0c8a c0x0000 (---------------) + I toyota + 0x00297a48, // n0x0c8b c0x0000 (---------------) + I tsushima + 0x0036a786, // n0x0c8c c0x0000 (---------------) + I yatomi + 0x00201dc5, // n0x0c8d c0x0000 (---------------) + I akita + 0x00282bc6, // n0x0c8e c0x0000 (---------------) + I daisen + 0x002790c8, // n0x0c8f c0x0000 (---------------) + I fujisato + 0x0023ab86, // n0x0c90 c0x0000 (---------------) + I gojome + 0x0025778b, // n0x0c91 c0x0000 (---------------) + I hachirogata + 0x0028ab86, // n0x0c92 c0x0000 (---------------) + I happou + 0x002997cd, // n0x0c93 c0x0000 (---------------) + I higashinaruse + 0x0038e545, // n0x0c94 c0x0000 (---------------) + I honjo + 0x002a8846, // n0x0c95 c0x0000 (---------------) + I honjyo + 0x0021a585, // n0x0c96 c0x0000 (---------------) + I ikawa + 0x00296349, // n0x0c97 c0x0000 (---------------) + I kamikoani + 0x00320ec7, // n0x0c98 c0x0000 (---------------) + I kamioka + 0x00378048, // n0x0c99 c0x0000 (---------------) + I katagami + 0x00305386, // n0x0c9a c0x0000 (---------------) + I kazuno + 0x002983c9, // n0x0c9b c0x0000 (---------------) + I kitaakita + 0x002dd306, // n0x0c9c c0x0000 (---------------) + I kosaka + 0x002befc5, // n0x0c9d c0x0000 (---------------) + I kyowa + 0x0022f486, // n0x0c9e c0x0000 (---------------) + I misato + 0x002b16c6, // n0x0c9f c0x0000 (---------------) + I mitane + 0x002c6849, // n0x0ca0 c0x0000 (---------------) + I moriyoshi + 0x0033cfc6, // n0x0ca1 c0x0000 (---------------) + I nikaho + 0x0037ebc7, // n0x0ca2 c0x0000 (---------------) + I noshiro + 0x002c5f85, // n0x0ca3 c0x0000 (---------------) + I odate + 0x00202a03, // n0x0ca4 c0x0000 (---------------) + I oga + 0x00223845, // n0x0ca5 c0x0000 (---------------) + I ogata + 0x002a6287, // n0x0ca6 c0x0000 (---------------) + I semboku + 0x00330a06, // n0x0ca7 c0x0000 (---------------) + I yokote + 0x0038e449, // n0x0ca8 c0x0000 (---------------) + I yurihonjo + 0x0030bf06, // n0x0ca9 c0x0000 (---------------) + I aomori + 0x00282e06, // n0x0caa c0x0000 (---------------) + I gonohe + 0x0020db09, // n0x0cab c0x0000 (---------------) + I hachinohe + 0x002825c9, // n0x0cac c0x0000 (---------------) + I hashikami + 0x0029f407, // n0x0cad c0x0000 (---------------) + I hiranai + 0x002eb708, // n0x0cae c0x0000 (---------------) + I hirosaki + 0x002692c9, // n0x0caf c0x0000 (---------------) + I itayanagi + 0x0027edc8, // n0x0cb0 c0x0000 (---------------) + I kuroishi + 0x0037d506, // n0x0cb1 c0x0000 (---------------) + I misawa + 0x002d0505, // n0x0cb2 c0x0000 (---------------) + I mutsu + 0x0021e54a, // n0x0cb3 c0x0000 (---------------) + I nakadomari + 0x00282e86, // n0x0cb4 c0x0000 (---------------) + I noheji + 0x00207e46, // n0x0cb5 c0x0000 (---------------) + I oirase + 0x002a2b85, // n0x0cb6 c0x0000 (---------------) + I owani + 0x0036b208, // n0x0cb7 c0x0000 (---------------) + I rokunohe + 0x0020ea87, // n0x0cb8 c0x0000 (---------------) + I sannohe + 0x0023638a, // n0x0cb9 c0x0000 (---------------) + I shichinohe + 0x0024e0c6, // n0x0cba c0x0000 (---------------) + I shingo + 0x00240bc5, // n0x0cbb c0x0000 (---------------) + I takko + 0x0024a2c6, // n0x0cbc c0x0000 (---------------) + I towada + 0x00297647, // n0x0cbd c0x0000 (---------------) + I tsugaru + 0x002e83c7, // n0x0cbe c0x0000 (---------------) + I tsuruta + 0x0037e845, // n0x0cbf c0x0000 (---------------) + I abiko + 0x002bf185, // n0x0cc0 c0x0000 (---------------) + I asahi + 0x002e59c6, // n0x0cc1 c0x0000 (---------------) + I chonan + 0x002e6b46, // n0x0cc2 c0x0000 (---------------) + I chosei + 0x00300346, // n0x0cc3 c0x0000 (---------------) + I choshi + 0x0030ba84, // n0x0cc4 c0x0000 (---------------) + I chuo + 0x00281689, // n0x0cc5 c0x0000 (---------------) + I funabashi + 0x00288286, // n0x0cc6 c0x0000 (---------------) + I futtsu + 0x0034ad4a, // n0x0cc7 c0x0000 (---------------) + I hanamigawa + 0x0028f548, // n0x0cc8 c0x0000 (---------------) + I ichihara + 0x00265608, // n0x0cc9 c0x0000 (---------------) + I ichikawa + 0x002d218a, // n0x0cca c0x0000 (---------------) + I ichinomiya + 0x003a0f85, // n0x0ccb c0x0000 (---------------) + I inzai + 0x0029c385, // n0x0ccc c0x0000 (---------------) + I isumi + 0x00307d08, // n0x0ccd c0x0000 (---------------) + I kamagaya + 0x002caec8, // n0x0cce c0x0000 (---------------) + I kamogawa + 0x002037c7, // n0x0ccf c0x0000 (---------------) + I kashiwa + 0x00294d86, // n0x0cd0 c0x0000 (---------------) + I katori + 0x003141c8, // n0x0cd1 c0x0000 (---------------) + I katsuura + 0x002303c7, // n0x0cd2 c0x0000 (---------------) + I kimitsu + 0x00280d88, // n0x0cd3 c0x0000 (---------------) + I kisarazu + 0x00368e86, // n0x0cd4 c0x0000 (---------------) + I kozaki + 0x00283fc8, // n0x0cd5 c0x0000 (---------------) + I kujukuri + 0x002b4246, // n0x0cd6 c0x0000 (---------------) + I kyonan + 0x00243747, // n0x0cd7 c0x0000 (---------------) + I matsudo + 0x00298e06, // n0x0cd8 c0x0000 (---------------) + I midori + 0x002da306, // n0x0cd9 c0x0000 (---------------) + I mihama + 0x0023c6ca, // n0x0cda c0x0000 (---------------) + I minamiboso + 0x00234886, // n0x0cdb c0x0000 (---------------) + I mobara + 0x002d0509, // n0x0cdc c0x0000 (---------------) + I mutsuzawa + 0x002ae046, // n0x0cdd c0x0000 (---------------) + I nagara + 0x002d164a, // n0x0cde c0x0000 (---------------) + I nagareyama + 0x002c8a09, // n0x0cdf c0x0000 (---------------) + I narashino + 0x0037df46, // n0x0ce0 c0x0000 (---------------) + I narita + 0x0037f944, // n0x0ce1 c0x0000 (---------------) + I noda + 0x003071cd, // n0x0ce2 c0x0000 (---------------) + I oamishirasato + 0x00287647, // n0x0ce3 c0x0000 (---------------) + I omigawa + 0x00316686, // n0x0ce4 c0x0000 (---------------) + I onjuku + 0x002b8f45, // n0x0ce5 c0x0000 (---------------) + I otaki + 0x002dd385, // n0x0ce6 c0x0000 (---------------) + I sakae + 0x00307fc6, // n0x0ce7 c0x0000 (---------------) + I sakura + 0x0028d9c9, // n0x0ce8 c0x0000 (---------------) + I shimofusa + 0x002aaf87, // n0x0ce9 c0x0000 (---------------) + I shirako + 0x0027a9c6, // n0x0cea c0x0000 (---------------) + I shiroi + 0x002af8c6, // n0x0ceb c0x0000 (---------------) + I shisui + 0x00286c49, // n0x0cec c0x0000 (---------------) + I sodegaura + 0x0021f484, // n0x0ced c0x0000 (---------------) + I sosa + 0x0036bcc4, // n0x0cee c0x0000 (---------------) + I tako + 0x002040c8, // n0x0cef c0x0000 (---------------) + I tateyama + 0x002aea86, // n0x0cf0 c0x0000 (---------------) + I togane + 0x0029ed88, // n0x0cf1 c0x0000 (---------------) + I tohnosho + 0x0022f408, // n0x0cf2 c0x0000 (---------------) + I tomisato + 0x00280587, // n0x0cf3 c0x0000 (---------------) + I urayasu + 0x003a6349, // n0x0cf4 c0x0000 (---------------) + I yachimata + 0x00300547, // n0x0cf5 c0x0000 (---------------) + I yachiyo + 0x002adc0a, // n0x0cf6 c0x0000 (---------------) + I yokaichiba + 0x0022edcf, // n0x0cf7 c0x0000 (---------------) + I yokoshibahikari + 0x00269dca, // n0x0cf8 c0x0000 (---------------) + I yotsukaido + 0x00223245, // n0x0cf9 c0x0000 (---------------) + I ainan + 0x00279305, // n0x0cfa c0x0000 (---------------) + I honai + 0x00216985, // n0x0cfb c0x0000 (---------------) + I ikata + 0x00249147, // n0x0cfc c0x0000 (---------------) + I imabari + 0x00206043, // n0x0cfd c0x0000 (---------------) + I iyo + 0x002eb908, // n0x0cfe c0x0000 (---------------) + I kamijima + 0x002f5c86, // n0x0cff c0x0000 (---------------) + I kihoku + 0x002f5d89, // n0x0d00 c0x0000 (---------------) + I kumakogen + 0x003a3b06, // n0x0d01 c0x0000 (---------------) + I masaki + 0x002c02c7, // n0x0d02 c0x0000 (---------------) + I matsuno + 0x00298189, // n0x0d03 c0x0000 (---------------) + I matsuyama + 0x00377f48, // n0x0d04 c0x0000 (---------------) + I namikata + 0x002a2c47, // n0x0d05 c0x0000 (---------------) + I niihama + 0x00300a43, // n0x0d06 c0x0000 (---------------) + I ozu + 0x00334dc5, // n0x0d07 c0x0000 (---------------) + I saijo + 0x002396c5, // n0x0d08 c0x0000 (---------------) + I seiyo + 0x0030b8cb, // n0x0d09 c0x0000 (---------------) + I shikokuchuo + 0x002be184, // n0x0d0a c0x0000 (---------------) + I tobe + 0x0020b004, // n0x0d0b c0x0000 (---------------) + I toon + 0x00278086, // n0x0d0c c0x0000 (---------------) + I uchiko + 0x00300dc7, // n0x0d0d c0x0000 (---------------) + I uwajima + 0x0038f14a, // n0x0d0e c0x0000 (---------------) + I yawatahama + 0x0024b9c7, // n0x0d0f c0x0000 (---------------) + I echizen + 0x00375fc7, // n0x0d10 c0x0000 (---------------) + I eiheiji + 0x0027dac5, // n0x0d11 c0x0000 (---------------) + I fukui + 0x00202585, // n0x0d12 c0x0000 (---------------) + I ikeda + 0x0021ebc9, // n0x0d13 c0x0000 (---------------) + I katsuyama + 0x002da306, // n0x0d14 c0x0000 (---------------) + I mihama + 0x0024b84d, // n0x0d15 c0x0000 (---------------) + I minamiechizen + 0x00395f05, // n0x0d16 c0x0000 (---------------) + I obama + 0x00299783, // n0x0d17 c0x0000 (---------------) + I ohi + 0x0020a703, // n0x0d18 c0x0000 (---------------) + I ono + 0x002f6605, // n0x0d19 c0x0000 (---------------) + I sabae + 0x0034ca05, // n0x0d1a c0x0000 (---------------) + I sakai + 0x00365ec8, // n0x0d1b c0x0000 (---------------) + I takahama + 0x0027b9c7, // n0x0d1c c0x0000 (---------------) + I tsuruga + 0x0036ba46, // n0x0d1d c0x0000 (---------------) + I wakasa + 0x0029d906, // n0x0d1e c0x0000 (---------------) + I ashiya + 0x0022d885, // n0x0d1f c0x0000 (---------------) + I buzen + 0x0023aa47, // n0x0d20 c0x0000 (---------------) + I chikugo + 0x00201a07, // n0x0d21 c0x0000 (---------------) + I chikuho + 0x00293107, // n0x0d22 c0x0000 (---------------) + I chikujo + 0x002cb1ca, // n0x0d23 c0x0000 (---------------) + I chikushino + 0x00252408, // n0x0d24 c0x0000 (---------------) + I chikuzen + 0x0030ba84, // n0x0d25 c0x0000 (---------------) + I chuo + 0x00214b07, // n0x0d26 c0x0000 (---------------) + I dazaifu + 0x0027cc87, // n0x0d27 c0x0000 (---------------) + I fukuchi + 0x0032c406, // n0x0d28 c0x0000 (---------------) + I hakata + 0x00268047, // n0x0d29 c0x0000 (---------------) + I higashi + 0x002d2bc8, // n0x0d2a c0x0000 (---------------) + I hirokawa + 0x002a14c8, // n0x0d2b c0x0000 (---------------) + I hisayama + 0x0026e786, // n0x0d2c c0x0000 (---------------) + I iizuka + 0x0022b108, // n0x0d2d c0x0000 (---------------) + I inatsuki + 0x002c6404, // n0x0d2e c0x0000 (---------------) + I kaho + 0x00321d86, // n0x0d2f c0x0000 (---------------) + I kasuga + 0x0020f406, // n0x0d30 c0x0000 (---------------) + I kasuya + 0x00206106, // n0x0d31 c0x0000 (---------------) + I kawara + 0x002ebf06, // n0x0d32 c0x0000 (---------------) + I keisen + 0x00226304, // n0x0d33 c0x0000 (---------------) + I koga + 0x0031d1c6, // n0x0d34 c0x0000 (---------------) + I kurate + 0x002b81c6, // n0x0d35 c0x0000 (---------------) + I kurogi + 0x002969c6, // n0x0d36 c0x0000 (---------------) + I kurume + 0x00228406, // n0x0d37 c0x0000 (---------------) + I minami + 0x0020a5c6, // n0x0d38 c0x0000 (---------------) + I miyako + 0x002d2a06, // n0x0d39 c0x0000 (---------------) + I miyama + 0x0036b948, // n0x0d3a c0x0000 (---------------) + I miyawaka + 0x002f0088, // n0x0d3b c0x0000 (---------------) + I mizumaki + 0x002cbdc8, // n0x0d3c c0x0000 (---------------) + I munakata + 0x002ac8c8, // n0x0d3d c0x0000 (---------------) + I nakagawa + 0x00307c86, // n0x0d3e c0x0000 (---------------) + I nakama + 0x00211805, // n0x0d3f c0x0000 (---------------) + I nishi + 0x00223806, // n0x0d40 c0x0000 (---------------) + I nogata + 0x002abb05, // n0x0d41 c0x0000 (---------------) + I ogori + 0x00380887, // n0x0d42 c0x0000 (---------------) + I okagaki + 0x002060c5, // n0x0d43 c0x0000 (---------------) + I okawa + 0x00215483, // n0x0d44 c0x0000 (---------------) + I oki + 0x00203a85, // n0x0d45 c0x0000 (---------------) + I omuta + 0x002b6104, // n0x0d46 c0x0000 (---------------) + I onga + 0x0020a705, // n0x0d47 c0x0000 (---------------) + I onojo + 0x00216003, // n0x0d48 c0x0000 (---------------) + I oto + 0x002d87c7, // n0x0d49 c0x0000 (---------------) + I saigawa + 0x0036fd08, // n0x0d4a c0x0000 (---------------) + I sasaguri + 0x00266d06, // n0x0d4b c0x0000 (---------------) + I shingu + 0x002a224d, // n0x0d4c c0x0000 (---------------) + I shinyoshitomi + 0x002792c6, // n0x0d4d c0x0000 (---------------) + I shonai + 0x00295a45, // n0x0d4e c0x0000 (---------------) + I soeda + 0x002c6c03, // n0x0d4f c0x0000 (---------------) + I sue + 0x002b3109, // n0x0d50 c0x0000 (---------------) + I tachiarai + 0x002c1c86, // n0x0d51 c0x0000 (---------------) + I tagawa + 0x00238646, // n0x0d52 c0x0000 (---------------) + I takata + 0x0034cf44, // n0x0d53 c0x0000 (---------------) + I toho + 0x00269d47, // n0x0d54 c0x0000 (---------------) + I toyotsu + 0x0023bd46, // n0x0d55 c0x0000 (---------------) + I tsuiki + 0x0036b045, // n0x0d56 c0x0000 (---------------) + I ukiha + 0x0020b583, // n0x0d57 c0x0000 (---------------) + I umi + 0x002066c4, // n0x0d58 c0x0000 (---------------) + I usui + 0x0027ce46, // n0x0d59 c0x0000 (---------------) + I yamada + 0x002a7d84, // n0x0d5a c0x0000 (---------------) + I yame + 0x0030df48, // n0x0d5b c0x0000 (---------------) + I yanagawa + 0x00383d09, // n0x0d5c c0x0000 (---------------) + I yukuhashi + 0x002bde89, // n0x0d5d c0x0000 (---------------) + I aizubange + 0x0029eb8a, // n0x0d5e c0x0000 (---------------) + I aizumisato + 0x002453cd, // n0x0d5f c0x0000 (---------------) + I aizuwakamatsu + 0x00248a07, // n0x0d60 c0x0000 (---------------) + I asakawa + 0x00207cc6, // n0x0d61 c0x0000 (---------------) + I bandai + 0x0020c7c4, // n0x0d62 c0x0000 (---------------) + I date + 0x0032fcc9, // n0x0d63 c0x0000 (---------------) + I fukushima + 0x002860c8, // n0x0d64 c0x0000 (---------------) + I furudono + 0x00287246, // n0x0d65 c0x0000 (---------------) + I futaba + 0x0025a746, // n0x0d66 c0x0000 (---------------) + I hanawa + 0x00268047, // n0x0d67 c0x0000 (---------------) + I higashi + 0x00347f46, // n0x0d68 c0x0000 (---------------) + I hirata + 0x0021d4c6, // n0x0d69 c0x0000 (---------------) + I hirono + 0x00384006, // n0x0d6a c0x0000 (---------------) + I iitate + 0x00395bca, // n0x0d6b c0x0000 (---------------) + I inawashiro + 0x0021a4c8, // n0x0d6c c0x0000 (---------------) + I ishikawa + 0x0022da85, // n0x0d6d c0x0000 (---------------) + I iwaki + 0x002802c9, // n0x0d6e c0x0000 (---------------) + I izumizaki + 0x0028128a, // n0x0d6f c0x0000 (---------------) + I kagamiishi + 0x002c7848, // n0x0d70 c0x0000 (---------------) + I kaneyama + 0x0029b888, // n0x0d71 c0x0000 (---------------) + I kawamata + 0x00295fc8, // n0x0d72 c0x0000 (---------------) + I kitakata + 0x00201e0c, // n0x0d73 c0x0000 (---------------) + I kitashiobara + 0x002d5305, // n0x0d74 c0x0000 (---------------) + I koori + 0x0029db88, // n0x0d75 c0x0000 (---------------) + I koriyama + 0x00342586, // n0x0d76 c0x0000 (---------------) + I kunimi + 0x00306306, // n0x0d77 c0x0000 (---------------) + I miharu + 0x002bf3c7, // n0x0d78 c0x0000 (---------------) + I mishima + 0x0024b8c5, // n0x0d79 c0x0000 (---------------) + I namie + 0x00282d45, // n0x0d7a c0x0000 (---------------) + I nango + 0x002bdd49, // n0x0d7b c0x0000 (---------------) + I nishiaizu + 0x00211d87, // n0x0d7c c0x0000 (---------------) + I nishigo + 0x002f5d45, // n0x0d7d c0x0000 (---------------) + I okuma + 0x0021f187, // n0x0d7e c0x0000 (---------------) + I omotego + 0x0020a703, // n0x0d7f c0x0000 (---------------) + I ono + 0x002c0e45, // n0x0d80 c0x0000 (---------------) + I otama + 0x00346648, // n0x0d81 c0x0000 (---------------) + I samegawa + 0x002b1287, // n0x0d82 c0x0000 (---------------) + I shimogo + 0x0029b749, // n0x0d83 c0x0000 (---------------) + I shirakawa + 0x00319905, // n0x0d84 c0x0000 (---------------) + I showa + 0x0035d844, // n0x0d85 c0x0000 (---------------) + I soma + 0x002a0308, // n0x0d86 c0x0000 (---------------) + I sukagawa + 0x0022c747, // n0x0d87 c0x0000 (---------------) + I taishin + 0x002a2e08, // n0x0d88 c0x0000 (---------------) + I tamakawa + 0x00330f48, // n0x0d89 c0x0000 (---------------) + I tanagura + 0x002d9885, // n0x0d8a c0x0000 (---------------) + I tenei + 0x00350b06, // n0x0d8b c0x0000 (---------------) + I yabuki + 0x0028f086, // n0x0d8c c0x0000 (---------------) + I yamato + 0x00250089, // n0x0d8d c0x0000 (---------------) + I yamatsuri + 0x00314a47, // n0x0d8e c0x0000 (---------------) + I yanaizu + 0x002abfc6, // n0x0d8f c0x0000 (---------------) + I yugawa + 0x0028ca87, // n0x0d90 c0x0000 (---------------) + I anpachi + 0x002183c3, // n0x0d91 c0x0000 (---------------) + I ena + 0x0036aec4, // n0x0d92 c0x0000 (---------------) + I gifu + 0x002a0c45, // n0x0d93 c0x0000 (---------------) + I ginan + 0x00214d84, // n0x0d94 c0x0000 (---------------) + I godo + 0x00343c04, // n0x0d95 c0x0000 (---------------) + I gujo + 0x00280b47, // n0x0d96 c0x0000 (---------------) + I hashima + 0x00218a07, // n0x0d97 c0x0000 (---------------) + I hichiso + 0x0027ab84, // n0x0d98 c0x0000 (---------------) + I hida + 0x0029b590, // n0x0d99 c0x0000 (---------------) + I higashishirakawa + 0x00308147, // n0x0d9a c0x0000 (---------------) + I ibigawa + 0x00202585, // n0x0d9b c0x0000 (---------------) + I ikeda + 0x002ef98c, // n0x0d9c c0x0000 (---------------) + I kakamigahara + 0x00279cc4, // n0x0d9d c0x0000 (---------------) + I kani + 0x0029b388, // n0x0d9e c0x0000 (---------------) + I kasahara + 0x00243649, // n0x0d9f c0x0000 (---------------) + I kasamatsu + 0x00301506, // n0x0da0 c0x0000 (---------------) + I kawaue + 0x0021f588, // n0x0da1 c0x0000 (---------------) + I kitagata + 0x0024ff84, // n0x0da2 c0x0000 (---------------) + I mino + 0x002d7b88, // n0x0da3 c0x0000 (---------------) + I minokamo + 0x00268506, // n0x0da4 c0x0000 (---------------) + I mitake + 0x00228288, // n0x0da5 c0x0000 (---------------) + I mizunami + 0x002a0946, // n0x0da6 c0x0000 (---------------) + I motosu + 0x0037a2cb, // n0x0da7 c0x0000 (---------------) + I nakatsugawa + 0x00202a05, // n0x0da8 c0x0000 (---------------) + I ogaki + 0x002c6388, // n0x0da9 c0x0000 (---------------) + I sakahogi + 0x00217fc4, // n0x0daa c0x0000 (---------------) + I seki + 0x0028224a, // n0x0dab c0x0000 (---------------) + I sekigahara + 0x0029b749, // n0x0dac c0x0000 (---------------) + I shirakawa + 0x00312006, // n0x0dad c0x0000 (---------------) + I tajimi + 0x002c0148, // n0x0dae c0x0000 (---------------) + I takayama + 0x00274245, // n0x0daf c0x0000 (---------------) + I tarui + 0x00222904, // n0x0db0 c0x0000 (---------------) + I toki + 0x0029b286, // n0x0db1 c0x0000 (---------------) + I tomika + 0x00292fc8, // n0x0db2 c0x0000 (---------------) + I wanouchi + 0x002808c8, // n0x0db3 c0x0000 (---------------) + I yamagata + 0x00341746, // n0x0db4 c0x0000 (---------------) + I yaotsu + 0x00321484, // n0x0db5 c0x0000 (---------------) + I yoro + 0x0021e4c6, // n0x0db6 c0x0000 (---------------) + I annaka + 0x003005c7, // n0x0db7 c0x0000 (---------------) + I chiyoda + 0x00278cc7, // n0x0db8 c0x0000 (---------------) + I fujioka + 0x0026804f, // n0x0db9 c0x0000 (---------------) + I higashiagatsuma + 0x00204687, // n0x0dba c0x0000 (---------------) + I isesaki + 0x0037e007, // n0x0dbb c0x0000 (---------------) + I itakura + 0x003061c5, // n0x0dbc c0x0000 (---------------) + I kanna + 0x002e2345, // n0x0dbd c0x0000 (---------------) + I kanra + 0x0029f0c9, // n0x0dbe c0x0000 (---------------) + I katashina + 0x0026b7c6, // n0x0dbf c0x0000 (---------------) + I kawaba + 0x0027f4c5, // n0x0dc0 c0x0000 (---------------) + I kiryu + 0x002828c7, // n0x0dc1 c0x0000 (---------------) + I kusatsu + 0x002c5d48, // n0x0dc2 c0x0000 (---------------) + I maebashi + 0x002be885, // n0x0dc3 c0x0000 (---------------) + I meiwa + 0x00298e06, // n0x0dc4 c0x0000 (---------------) + I midori + 0x00216448, // n0x0dc5 c0x0000 (---------------) + I minakami + 0x00354f8a, // n0x0dc6 c0x0000 (---------------) + I naganohara + 0x00356448, // n0x0dc7 c0x0000 (---------------) + I nakanojo + 0x003a1d07, // n0x0dc8 c0x0000 (---------------) + I nanmoku + 0x0022f206, // n0x0dc9 c0x0000 (---------------) + I numata + 0x00280286, // n0x0dca c0x0000 (---------------) + I oizumi + 0x0021c683, // n0x0dcb c0x0000 (---------------) + I ora + 0x00204083, // n0x0dcc c0x0000 (---------------) + I ota + 0x00281449, // n0x0dcd c0x0000 (---------------) + I shibukawa + 0x00269149, // n0x0dce c0x0000 (---------------) + I shimonita + 0x00299ec6, // n0x0dcf c0x0000 (---------------) + I shinto + 0x00319905, // n0x0dd0 c0x0000 (---------------) + I showa + 0x002a06c8, // n0x0dd1 c0x0000 (---------------) + I takasaki + 0x002c0148, // n0x0dd2 c0x0000 (---------------) + I takayama + 0x0039a108, // n0x0dd3 c0x0000 (---------------) + I tamamura + 0x0038408b, // n0x0dd4 c0x0000 (---------------) + I tatebayashi + 0x002a2487, // n0x0dd5 c0x0000 (---------------) + I tomioka + 0x002ff549, // n0x0dd6 c0x0000 (---------------) + I tsukiyono + 0x002682c8, // n0x0dd7 c0x0000 (---------------) + I tsumagoi + 0x00387304, // n0x0dd8 c0x0000 (---------------) + I ueno + 0x002c6948, // n0x0dd9 c0x0000 (---------------) + I yoshioka + 0x0028bb49, // n0x0dda c0x0000 (---------------) + I asaminami + 0x002ac2c5, // n0x0ddb c0x0000 (---------------) + I daiwa + 0x00249047, // n0x0ddc c0x0000 (---------------) + I etajima + 0x002bc1c5, // n0x0ddd c0x0000 (---------------) + I fuchu + 0x002807c8, // n0x0dde c0x0000 (---------------) + I fukuyama + 0x0028f38b, // n0x0ddf c0x0000 (---------------) + I hatsukaichi + 0x00293b10, // n0x0de0 c0x0000 (---------------) + I higashihiroshima + 0x002a8645, // n0x0de1 c0x0000 (---------------) + I hongo + 0x00217f0c, // n0x0de2 c0x0000 (---------------) + I jinsekikogen + 0x0036bc05, // n0x0de3 c0x0000 (---------------) + I kaita + 0x0027db43, // n0x0de4 c0x0000 (---------------) + I kui + 0x00383786, // n0x0de5 c0x0000 (---------------) + I kumano + 0x002b7544, // n0x0de6 c0x0000 (---------------) + I kure + 0x003a69c6, // n0x0de7 c0x0000 (---------------) + I mihara + 0x0029c447, // n0x0de8 c0x0000 (---------------) + I miyoshi + 0x002164c4, // n0x0de9 c0x0000 (---------------) + I naka + 0x002d2088, // n0x0dea c0x0000 (---------------) + I onomichi + 0x002eb7cd, // n0x0deb c0x0000 (---------------) + I osakikamijima + 0x00305a45, // n0x0dec c0x0000 (---------------) + I otake + 0x002458c4, // n0x0ded c0x0000 (---------------) + I saka + 0x00222f84, // n0x0dee c0x0000 (---------------) + I sera + 0x0027fd49, // n0x0def c0x0000 (---------------) + I seranishi + 0x00286908, // n0x0df0 c0x0000 (---------------) + I shinichi + 0x0030bd87, // n0x0df1 c0x0000 (---------------) + I shobara + 0x00268588, // n0x0df2 c0x0000 (---------------) + I takehara + 0x00281748, // n0x0df3 c0x0000 (---------------) + I abashiri + 0x0027acc5, // n0x0df4 c0x0000 (---------------) + I abira + 0x00208b87, // n0x0df5 c0x0000 (---------------) + I aibetsu + 0x0027ac47, // n0x0df6 c0x0000 (---------------) + I akabira + 0x00209907, // n0x0df7 c0x0000 (---------------) + I akkeshi + 0x002bf189, // n0x0df8 c0x0000 (---------------) + I asahikawa + 0x0023bbc9, // n0x0df9 c0x0000 (---------------) + I ashibetsu + 0x00244e86, // n0x0dfa c0x0000 (---------------) + I ashoro + 0x002b4086, // n0x0dfb c0x0000 (---------------) + I assabu + 0x00268286, // n0x0dfc c0x0000 (---------------) + I atsuma + 0x0026a3c5, // n0x0dfd c0x0000 (---------------) + I bibai + 0x002d81c4, // n0x0dfe c0x0000 (---------------) + I biei + 0x00200ec6, // n0x0dff c0x0000 (---------------) + I bifuka + 0x00202106, // n0x0e00 c0x0000 (---------------) + I bihoro + 0x0027ad08, // n0x0e01 c0x0000 (---------------) + I biratori + 0x0029730b, // n0x0e02 c0x0000 (---------------) + I chippubetsu + 0x002ae607, // n0x0e03 c0x0000 (---------------) + I chitose + 0x0020c7c4, // n0x0e04 c0x0000 (---------------) + I date + 0x00223e46, // n0x0e05 c0x0000 (---------------) + I ebetsu + 0x00283707, // n0x0e06 c0x0000 (---------------) + I embetsu + 0x002f5f45, // n0x0e07 c0x0000 (---------------) + I eniwa + 0x00239145, // n0x0e08 c0x0000 (---------------) + I erimo + 0x00200484, // n0x0e09 c0x0000 (---------------) + I esan + 0x0023bb46, // n0x0e0a c0x0000 (---------------) + I esashi + 0x00200f48, // n0x0e0b c0x0000 (---------------) + I fukagawa + 0x0032fcc9, // n0x0e0c c0x0000 (---------------) + I fukushima + 0x00253846, // n0x0e0d c0x0000 (---------------) + I furano + 0x00285888, // n0x0e0e c0x0000 (---------------) + I furubira + 0x0036b106, // n0x0e0f c0x0000 (---------------) + I haboro + 0x0032ccc8, // n0x0e10 c0x0000 (---------------) + I hakodate + 0x002a9b8c, // n0x0e11 c0x0000 (---------------) + I hamatonbetsu + 0x0027ab86, // n0x0e12 c0x0000 (---------------) + I hidaka + 0x0029570d, // n0x0e13 c0x0000 (---------------) + I higashikagura + 0x00295b8b, // n0x0e14 c0x0000 (---------------) + I higashikawa + 0x0037ec85, // n0x0e15 c0x0000 (---------------) + I hiroo + 0x00201b47, // n0x0e16 c0x0000 (---------------) + I hokuryu + 0x0033d0c6, // n0x0e17 c0x0000 (---------------) + I hokuto + 0x002e8288, // n0x0e18 c0x0000 (---------------) + I honbetsu + 0x00244f09, // n0x0e19 c0x0000 (---------------) + I horokanai + 0x002bd888, // n0x0e1a c0x0000 (---------------) + I horonobe + 0x00202585, // n0x0e1b c0x0000 (---------------) + I ikeda + 0x002fe547, // n0x0e1c c0x0000 (---------------) + I imakane + 0x0027eec8, // n0x0e1d c0x0000 (---------------) + I ishikari + 0x00272289, // n0x0e1e c0x0000 (---------------) + I iwamizawa + 0x0023b0c6, // n0x0e1f c0x0000 (---------------) + I iwanai + 0x0025c78a, // n0x0e20 c0x0000 (---------------) + I kamifurano + 0x002e8008, // n0x0e21 c0x0000 (---------------) + I kamikawa + 0x002bd6cb, // n0x0e22 c0x0000 (---------------) + I kamishihoro + 0x00291a4c, // n0x0e23 c0x0000 (---------------) + I kamisunagawa + 0x002d7c88, // n0x0e24 c0x0000 (---------------) + I kamoenai + 0x0027c586, // n0x0e25 c0x0000 (---------------) + I kayabe + 0x00208588, // n0x0e26 c0x0000 (---------------) + I kembuchi + 0x002047c7, // n0x0e27 c0x0000 (---------------) + I kikonai + 0x0023be49, // n0x0e28 c0x0000 (---------------) + I kimobetsu + 0x0020ed4d, // n0x0e29 c0x0000 (---------------) + I kitahiroshima + 0x0029d586, // n0x0e2a c0x0000 (---------------) + I kitami + 0x00297008, // n0x0e2b c0x0000 (---------------) + I kiyosato + 0x002eff49, // n0x0e2c c0x0000 (---------------) + I koshimizu + 0x002b4a48, // n0x0e2d c0x0000 (---------------) + I kunneppu + 0x002840c8, // n0x0e2e c0x0000 (---------------) + I kuriyama + 0x002b8a8c, // n0x0e2f c0x0000 (---------------) + I kuromatsunai + 0x002b9a07, // n0x0e30 c0x0000 (---------------) + I kushiro + 0x002ba907, // n0x0e31 c0x0000 (---------------) + I kutchan + 0x002befc5, // n0x0e32 c0x0000 (---------------) + I kyowa + 0x0024eec7, // n0x0e33 c0x0000 (---------------) + I mashike + 0x002c5c08, // n0x0e34 c0x0000 (---------------) + I matsumae + 0x0029b306, // n0x0e35 c0x0000 (---------------) + I mikasa + 0x002536cc, // n0x0e36 c0x0000 (---------------) + I minamifurano + 0x002e3788, // n0x0e37 c0x0000 (---------------) + I mombetsu + 0x002c7c48, // n0x0e38 c0x0000 (---------------) + I moseushi + 0x002b6d86, // n0x0e39 c0x0000 (---------------) + I mukawa + 0x003961c7, // n0x0e3a c0x0000 (---------------) + I muroran + 0x00245084, // n0x0e3b c0x0000 (---------------) + I naie + 0x002ac8c8, // n0x0e3c c0x0000 (---------------) + I nakagawa + 0x0021840c, // n0x0e3d c0x0000 (---------------) + I nakasatsunai + 0x0036decc, // n0x0e3e c0x0000 (---------------) + I nakatombetsu + 0x002232c5, // n0x0e3f c0x0000 (---------------) + I nanae + 0x0038ae07, // n0x0e40 c0x0000 (---------------) + I nanporo + 0x00321406, // n0x0e41 c0x0000 (---------------) + I nayoro + 0x00396146, // n0x0e42 c0x0000 (---------------) + I nemuro + 0x00296508, // n0x0e43 c0x0000 (---------------) + I niikappu + 0x0039e6c4, // n0x0e44 c0x0000 (---------------) + I niki + 0x002251cb, // n0x0e45 c0x0000 (---------------) + I nishiokoppe + 0x0033214b, // n0x0e46 c0x0000 (---------------) + I noboribetsu + 0x0022f206, // n0x0e47 c0x0000 (---------------) + I numata + 0x002eb647, // n0x0e48 c0x0000 (---------------) + I obihiro + 0x00309145, // n0x0e49 c0x0000 (---------------) + I obira + 0x0026f985, // n0x0e4a c0x0000 (---------------) + I oketo + 0x00225306, // n0x0e4b c0x0000 (---------------) + I okoppe + 0x00274205, // n0x0e4c c0x0000 (---------------) + I otaru + 0x002be145, // n0x0e4d c0x0000 (---------------) + I otobe + 0x002bf687, // n0x0e4e c0x0000 (---------------) + I otofuke + 0x00278689, // n0x0e4f c0x0000 (---------------) + I otoineppu + 0x002e6d04, // n0x0e50 c0x0000 (---------------) + I oumu + 0x00277145, // n0x0e51 c0x0000 (---------------) + I ozora + 0x002d72c5, // n0x0e52 c0x0000 (---------------) + I pippu + 0x00289ac8, // n0x0e53 c0x0000 (---------------) + I rankoshi + 0x002d1ec5, // n0x0e54 c0x0000 (---------------) + I rebun + 0x002a7649, // n0x0e55 c0x0000 (---------------) + I rikubetsu + 0x002a5647, // n0x0e56 c0x0000 (---------------) + I rishiri + 0x002a564b, // n0x0e57 c0x0000 (---------------) + I rishirifuji + 0x0031cf46, // n0x0e58 c0x0000 (---------------) + I saroma + 0x0036b689, // n0x0e59 c0x0000 (---------------) + I sarufutsu + 0x00229388, // n0x0e5a c0x0000 (---------------) + I shakotan + 0x00259285, // n0x0e5b c0x0000 (---------------) + I shari + 0x00209a08, // n0x0e5c c0x0000 (---------------) + I shibecha + 0x0023bc08, // n0x0e5d c0x0000 (---------------) + I shibetsu + 0x0021afc7, // n0x0e5e c0x0000 (---------------) + I shikabe + 0x00280147, // n0x0e5f c0x0000 (---------------) + I shikaoi + 0x00280bc9, // n0x0e60 c0x0000 (---------------) + I shimamaki + 0x002281c7, // n0x0e61 c0x0000 (---------------) + I shimizu + 0x00263849, // n0x0e62 c0x0000 (---------------) + I shimokawa + 0x0029120c, // n0x0e63 c0x0000 (---------------) + I shinshinotsu + 0x00299ec8, // n0x0e64 c0x0000 (---------------) + I shintoku + 0x002d9d89, // n0x0e65 c0x0000 (---------------) + I shiranuka + 0x002d5707, // n0x0e66 c0x0000 (---------------) + I shiraoi + 0x00281809, // n0x0e67 c0x0000 (---------------) + I shiriuchi + 0x00218b47, // n0x0e68 c0x0000 (---------------) + I sobetsu + 0x00291b48, // n0x0e69 c0x0000 (---------------) + I sunagawa + 0x00289e05, // n0x0e6a c0x0000 (---------------) + I taiki + 0x00321d06, // n0x0e6b c0x0000 (---------------) + I takasu + 0x002b8f88, // n0x0e6c c0x0000 (---------------) + I takikawa + 0x002f8588, // n0x0e6d c0x0000 (---------------) + I takinoue + 0x00281149, // n0x0e6e c0x0000 (---------------) + I teshikaga + 0x002be187, // n0x0e6f c0x0000 (---------------) + I tobetsu + 0x00270305, // n0x0e70 c0x0000 (---------------) + I tohma + 0x0020bf49, // n0x0e71 c0x0000 (---------------) + I tomakomai + 0x00269686, // n0x0e72 c0x0000 (---------------) + I tomari + 0x0028e9c4, // n0x0e73 c0x0000 (---------------) + I toya + 0x0034cc46, // n0x0e74 c0x0000 (---------------) + I toyako + 0x00265f88, // n0x0e75 c0x0000 (---------------) + I toyotomi + 0x0026ae47, // n0x0e76 c0x0000 (---------------) + I toyoura + 0x00297508, // n0x0e77 c0x0000 (---------------) + I tsubetsu + 0x0022b1c9, // n0x0e78 c0x0000 (---------------) + I tsukigata + 0x002b6b07, // n0x0e79 c0x0000 (---------------) + I urakawa + 0x0029d406, // n0x0e7a c0x0000 (---------------) + I urausu + 0x00201c04, // n0x0e7b c0x0000 (---------------) + I uryu + 0x00203b09, // n0x0e7c c0x0000 (---------------) + I utashinai + 0x00208a08, // n0x0e7d c0x0000 (---------------) + I wakkanai + 0x002b6c47, // n0x0e7e c0x0000 (---------------) + I wassamu + 0x00325346, // n0x0e7f c0x0000 (---------------) + I yakumo + 0x00239786, // n0x0e80 c0x0000 (---------------) + I yoichi + 0x00207dc4, // n0x0e81 c0x0000 (---------------) + I aioi + 0x002a8a46, // n0x0e82 c0x0000 (---------------) + I akashi + 0x0020a683, // n0x0e83 c0x0000 (---------------) + I ako + 0x002ec709, // n0x0e84 c0x0000 (---------------) + I amagasaki + 0x002029c6, // n0x0e85 c0x0000 (---------------) + I aogaki + 0x0029bac5, // n0x0e86 c0x0000 (---------------) + I asago + 0x0029d906, // n0x0e87 c0x0000 (---------------) + I ashiya + 0x002a2f45, // n0x0e88 c0x0000 (---------------) + I awaji + 0x0027f348, // n0x0e89 c0x0000 (---------------) + I fukusaki + 0x002d79c7, // n0x0e8a c0x0000 (---------------) + I goshiki + 0x00205b86, // n0x0e8b c0x0000 (---------------) + I harima + 0x00229046, // n0x0e8c c0x0000 (---------------) + I himeji + 0x00265608, // n0x0e8d c0x0000 (---------------) + I ichikawa + 0x0029f247, // n0x0e8e c0x0000 (---------------) + I inagawa + 0x0029d5c5, // n0x0e8f c0x0000 (---------------) + I itami + 0x0029de08, // n0x0e90 c0x0000 (---------------) + I kakogawa + 0x00383348, // n0x0e91 c0x0000 (---------------) + I kamigori + 0x002e8008, // n0x0e92 c0x0000 (---------------) + I kamikawa + 0x0036bac5, // n0x0e93 c0x0000 (---------------) + I kasai + 0x00321d86, // n0x0e94 c0x0000 (---------------) + I kasuga + 0x002bdc49, // n0x0e95 c0x0000 (---------------) + I kawanishi + 0x0028ef04, // n0x0e96 c0x0000 (---------------) + I miki + 0x0036a88b, // n0x0e97 c0x0000 (---------------) + I minamiawaji + 0x0021d1cb, // n0x0e98 c0x0000 (---------------) + I nishinomiya + 0x0022d989, // n0x0e99 c0x0000 (---------------) + I nishiwaki + 0x0020a703, // n0x0e9a c0x0000 (---------------) + I ono + 0x00259bc5, // n0x0e9b c0x0000 (---------------) + I sanda + 0x002069c6, // n0x0e9c c0x0000 (---------------) + I sannan + 0x002db6c8, // n0x0e9d c0x0000 (---------------) + I sasayama + 0x0022ed44, // n0x0e9e c0x0000 (---------------) + I sayo + 0x00266d06, // n0x0e9f c0x0000 (---------------) + I shingu + 0x002cb309, // n0x0ea0 c0x0000 (---------------) + I shinonsen + 0x002af085, // n0x0ea1 c0x0000 (---------------) + I shiso + 0x002bf5c6, // n0x0ea2 c0x0000 (---------------) + I sumoto + 0x0022c746, // n0x0ea3 c0x0000 (---------------) + I taishi + 0x00216a44, // n0x0ea4 c0x0000 (---------------) + I taka + 0x0029614a, // n0x0ea5 c0x0000 (---------------) + I takarazuka + 0x0029ba08, // n0x0ea6 c0x0000 (---------------) + I takasago + 0x002f8586, // n0x0ea7 c0x0000 (---------------) + I takino + 0x002ce105, // n0x0ea8 c0x0000 (---------------) + I tamba + 0x0020d407, // n0x0ea9 c0x0000 (---------------) + I tatsuno + 0x0024fbc7, // n0x0eaa c0x0000 (---------------) + I toyooka + 0x00350b04, // n0x0eab c0x0000 (---------------) + I yabu + 0x0021d407, // n0x0eac c0x0000 (---------------) + I yashiro + 0x00206084, // n0x0ead c0x0000 (---------------) + I yoka + 0x00206086, // n0x0eae c0x0000 (---------------) + I yokawa + 0x00208fc3, // n0x0eaf c0x0000 (---------------) + I ami + 0x002bf185, // n0x0eb0 c0x0000 (---------------) + I asahi + 0x0034be85, // n0x0eb1 c0x0000 (---------------) + I bando + 0x0022cac8, // n0x0eb2 c0x0000 (---------------) + I chikusei + 0x00214cc5, // n0x0eb3 c0x0000 (---------------) + I daigo + 0x0027a8c9, // n0x0eb4 c0x0000 (---------------) + I fujishiro + 0x002a27c7, // n0x0eb5 c0x0000 (---------------) + I hitachi + 0x002ac70b, // n0x0eb6 c0x0000 (---------------) + I hitachinaka + 0x002a27cc, // n0x0eb7 c0x0000 (---------------) + I hitachiomiya + 0x002a344a, // n0x0eb8 c0x0000 (---------------) + I hitachiota + 0x002c1ac7, // n0x0eb9 c0x0000 (---------------) + I ibaraki + 0x002013c3, // n0x0eba c0x0000 (---------------) + I ina + 0x00370248, // n0x0ebb c0x0000 (---------------) + I inashiki + 0x0036bc85, // n0x0ebc c0x0000 (---------------) + I itako + 0x002be905, // n0x0ebd c0x0000 (---------------) + I iwama + 0x00334e84, // n0x0ebe c0x0000 (---------------) + I joso + 0x00291a46, // n0x0ebf c0x0000 (---------------) + I kamisu + 0x00243646, // n0x0ec0 c0x0000 (---------------) + I kasama + 0x002a8a87, // n0x0ec1 c0x0000 (---------------) + I kashima + 0x0020b4cb, // n0x0ec2 c0x0000 (---------------) + I kasumigaura + 0x00226304, // n0x0ec3 c0x0000 (---------------) + I koga + 0x003781c4, // n0x0ec4 c0x0000 (---------------) + I miho + 0x0026e904, // n0x0ec5 c0x0000 (---------------) + I mito + 0x002c60c6, // n0x0ec6 c0x0000 (---------------) + I moriya + 0x002164c4, // n0x0ec7 c0x0000 (---------------) + I naka + 0x002bffc8, // n0x0ec8 c0x0000 (---------------) + I namegata + 0x00334c85, // n0x0ec9 c0x0000 (---------------) + I oarai + 0x00245a05, // n0x0eca c0x0000 (---------------) + I ogawa + 0x0039a047, // n0x0ecb c0x0000 (---------------) + I omitama + 0x00201c49, // n0x0ecc c0x0000 (---------------) + I ryugasaki + 0x0034ca05, // n0x0ecd c0x0000 (---------------) + I sakai + 0x00372a4a, // n0x0ece c0x0000 (---------------) + I sakuragawa + 0x002c5e89, // n0x0ecf c0x0000 (---------------) + I shimodate + 0x00285e4a, // n0x0ed0 c0x0000 (---------------) + I shimotsuma + 0x00395d09, // n0x0ed1 c0x0000 (---------------) + I shirosato + 0x00332b04, // n0x0ed2 c0x0000 (---------------) + I sowa + 0x002af985, // n0x0ed3 c0x0000 (---------------) + I suifu + 0x00348048, // n0x0ed4 c0x0000 (---------------) + I takahagi + 0x002d930b, // n0x0ed5 c0x0000 (---------------) + I tamatsukuri + 0x002fa0c5, // n0x0ed6 c0x0000 (---------------) + I tokai + 0x0028e1c6, // n0x0ed7 c0x0000 (---------------) + I tomobe + 0x00221d44, // n0x0ed8 c0x0000 (---------------) + I tone + 0x0027ae06, // n0x0ed9 c0x0000 (---------------) + I toride + 0x002b6989, // n0x0eda c0x0000 (---------------) + I tsuchiura + 0x00223f07, // n0x0edb c0x0000 (---------------) + I tsukuba + 0x0030c0c8, // n0x0edc c0x0000 (---------------) + I uchihara + 0x00245746, // n0x0edd c0x0000 (---------------) + I ushiku + 0x00300547, // n0x0ede c0x0000 (---------------) + I yachiyo + 0x002808c8, // n0x0edf c0x0000 (---------------) + I yamagata + 0x00386686, // n0x0ee0 c0x0000 (---------------) + I yawara + 0x0024e8c4, // n0x0ee1 c0x0000 (---------------) + I yuki + 0x0035e047, // n0x0ee2 c0x0000 (---------------) + I anamizu + 0x00344045, // n0x0ee3 c0x0000 (---------------) + I hakui + 0x0034a747, // n0x0ee4 c0x0000 (---------------) + I hakusan + 0x00200fc4, // n0x0ee5 c0x0000 (---------------) + I kaga + 0x0033d046, // n0x0ee6 c0x0000 (---------------) + I kahoku + 0x0021a748, // n0x0ee7 c0x0000 (---------------) + I kanazawa + 0x00295d48, // n0x0ee8 c0x0000 (---------------) + I kawakita + 0x002aa707, // n0x0ee9 c0x0000 (---------------) + I komatsu + 0x002546c8, // n0x0eea c0x0000 (---------------) + I nakanoto + 0x002b4305, // n0x0eeb c0x0000 (---------------) + I nanao + 0x0020a544, // n0x0eec c0x0000 (---------------) + I nomi + 0x00265508, // n0x0eed c0x0000 (---------------) + I nonoichi + 0x002547c4, // n0x0eee c0x0000 (---------------) + I noto + 0x00216905, // n0x0eef c0x0000 (---------------) + I shika + 0x002eeb44, // n0x0ef0 c0x0000 (---------------) + I suzu + 0x002304c7, // n0x0ef1 c0x0000 (---------------) + I tsubata + 0x00288347, // n0x0ef2 c0x0000 (---------------) + I tsurugi + 0x00281948, // n0x0ef3 c0x0000 (---------------) + I uchinada + 0x002a2f86, // n0x0ef4 c0x0000 (---------------) + I wajima + 0x00214c45, // n0x0ef5 c0x0000 (---------------) + I fudai + 0x0027a6c8, // n0x0ef6 c0x0000 (---------------) + I fujisawa + 0x00356648, // n0x0ef7 c0x0000 (---------------) + I hanamaki + 0x0029eac9, // n0x0ef8 c0x0000 (---------------) + I hiraizumi + 0x0021d4c6, // n0x0ef9 c0x0000 (---------------) + I hirono + 0x00236408, // n0x0efa c0x0000 (---------------) + I ichinohe + 0x002820ca, // n0x0efb c0x0000 (---------------) + I ichinoseki + 0x002f5fc8, // n0x0efc c0x0000 (---------------) + I iwaizumi + 0x002d8485, // n0x0efd c0x0000 (---------------) + I iwate + 0x00224706, // n0x0efe c0x0000 (---------------) + I joboji + 0x0028d888, // n0x0eff c0x0000 (---------------) + I kamaishi + 0x002fe60a, // n0x0f00 c0x0000 (---------------) + I kanegasaki + 0x00271b47, // n0x0f01 c0x0000 (---------------) + I karumai + 0x002864c5, // n0x0f02 c0x0000 (---------------) + I kawai + 0x00294308, // n0x0f03 c0x0000 (---------------) + I kitakami + 0x00371504, // n0x0f04 c0x0000 (---------------) + I kuji + 0x0036b286, // n0x0f05 c0x0000 (---------------) + I kunohe + 0x002bb088, // n0x0f06 c0x0000 (---------------) + I kuzumaki + 0x0020a5c6, // n0x0f07 c0x0000 (---------------) + I miyako + 0x002ea148, // n0x0f08 c0x0000 (---------------) + I mizusawa + 0x0022aa47, // n0x0f09 c0x0000 (---------------) + I morioka + 0x002072c6, // n0x0f0a c0x0000 (---------------) + I ninohe + 0x0037f944, // n0x0f0b c0x0000 (---------------) + I noda + 0x002db247, // n0x0f0c c0x0000 (---------------) + I ofunato + 0x00342084, // n0x0f0d c0x0000 (---------------) + I oshu + 0x002b6947, // n0x0f0e c0x0000 (---------------) + I otsuchi + 0x0023848d, // n0x0f0f c0x0000 (---------------) + I rikuzentakata + 0x00203845, // n0x0f10 c0x0000 (---------------) + I shiwa + 0x002b108b, // n0x0f11 c0x0000 (---------------) + I shizukuishi + 0x002a0a46, // n0x0f12 c0x0000 (---------------) + I sumita + 0x00252c88, // n0x0f13 c0x0000 (---------------) + I tanohata + 0x003895c4, // n0x0f14 c0x0000 (---------------) + I tono + 0x00276f06, // n0x0f15 c0x0000 (---------------) + I yahaba + 0x0027ce46, // n0x0f16 c0x0000 (---------------) + I yamada + 0x002088c7, // n0x0f17 c0x0000 (---------------) + I ayagawa + 0x002953cd, // n0x0f18 c0x0000 (---------------) + I higashikagawa + 0x00322787, // n0x0f19 c0x0000 (---------------) + I kanonji + 0x00339cc8, // n0x0f1a c0x0000 (---------------) + I kotohira + 0x00366045, // n0x0f1b c0x0000 (---------------) + I manno + 0x00297bc8, // n0x0f1c c0x0000 (---------------) + I marugame + 0x002c0886, // n0x0f1d c0x0000 (---------------) + I mitoyo + 0x002b4388, // n0x0f1e c0x0000 (---------------) + I naoshima + 0x00213bc6, // n0x0f1f c0x0000 (---------------) + I sanuki + 0x0032f6c7, // n0x0f20 c0x0000 (---------------) + I tadotsu + 0x0021f709, // n0x0f21 c0x0000 (---------------) + I takamatsu + 0x003895c7, // n0x0f22 c0x0000 (---------------) + I tonosho + 0x00287508, // n0x0f23 c0x0000 (---------------) + I uchinomi + 0x00273885, // n0x0f24 c0x0000 (---------------) + I utazu + 0x0021c188, // n0x0f25 c0x0000 (---------------) + I zentsuji + 0x00309245, // n0x0f26 c0x0000 (---------------) + I akune + 0x00240f85, // n0x0f27 c0x0000 (---------------) + I amami + 0x002e4bc5, // n0x0f28 c0x0000 (---------------) + I hioki + 0x00223543, // n0x0f29 c0x0000 (---------------) + I isa + 0x00282c44, // n0x0f2a c0x0000 (---------------) + I isen + 0x002802c5, // n0x0f2b c0x0000 (---------------) + I izumi + 0x00276189, // n0x0f2c c0x0000 (---------------) + I kagoshima + 0x002b2786, // n0x0f2d c0x0000 (---------------) + I kanoya + 0x002d2cc8, // n0x0f2e c0x0000 (---------------) + I kawanabe + 0x002fe805, // n0x0f2f c0x0000 (---------------) + I kinko + 0x0030b707, // n0x0f30 c0x0000 (---------------) + I kouyama + 0x0032f9ca, // n0x0f31 c0x0000 (---------------) + I makurazaki + 0x002bf509, // n0x0f32 c0x0000 (---------------) + I matsumoto + 0x002b15ca, // n0x0f33 c0x0000 (---------------) + I minamitane + 0x002cbe48, // n0x0f34 c0x0000 (---------------) + I nakatane + 0x0021efcc, // n0x0f35 c0x0000 (---------------) + I nishinoomote + 0x0028294d, // n0x0f36 c0x0000 (---------------) + I satsumasendai + 0x00315283, // n0x0f37 c0x0000 (---------------) + I soo + 0x002ea048, // n0x0f38 c0x0000 (---------------) + I tarumizu + 0x00206685, // n0x0f39 c0x0000 (---------------) + I yusui + 0x00354d46, // n0x0f3a c0x0000 (---------------) + I aikawa + 0x00377dc6, // n0x0f3b c0x0000 (---------------) + I atsugi + 0x0024d085, // n0x0f3c c0x0000 (---------------) + I ayase + 0x0028cb89, // n0x0f3d c0x0000 (---------------) + I chigasaki + 0x00325545, // n0x0f3e c0x0000 (---------------) + I ebina + 0x0027a6c8, // n0x0f3f c0x0000 (---------------) + I fujisawa + 0x0025ad86, // n0x0f40 c0x0000 (---------------) + I hadano + 0x00339046, // n0x0f41 c0x0000 (---------------) + I hakone + 0x002a01c9, // n0x0f42 c0x0000 (---------------) + I hiratsuka + 0x00385e87, // n0x0f43 c0x0000 (---------------) + I isehara + 0x002fdec6, // n0x0f44 c0x0000 (---------------) + I kaisei + 0x0032f948, // n0x0f45 c0x0000 (---------------) + I kamakura + 0x00206008, // n0x0f46 c0x0000 (---------------) + I kiyokawa + 0x002d0bc7, // n0x0f47 c0x0000 (---------------) + I matsuda + 0x0022840e, // n0x0f48 c0x0000 (---------------) + I minamiashigara + 0x002c0ac5, // n0x0f49 c0x0000 (---------------) + I miura + 0x00272185, // n0x0f4a c0x0000 (---------------) + I nakai + 0x0020a4c8, // n0x0f4b c0x0000 (---------------) + I ninomiya + 0x00384a47, // n0x0f4c c0x0000 (---------------) + I odawara + 0x00207e42, // n0x0f4d c0x0000 (---------------) + I oi + 0x002b8604, // n0x0f4e c0x0000 (---------------) + I oiso + 0x003a68ca, // n0x0f4f c0x0000 (---------------) + I sagamihara + 0x002b6d08, // n0x0f50 c0x0000 (---------------) + I samukawa + 0x00283806, // n0x0f51 c0x0000 (---------------) + I tsukui + 0x002982c8, // n0x0f52 c0x0000 (---------------) + I yamakita + 0x0028f086, // n0x0f53 c0x0000 (---------------) + I yamato + 0x00327d48, // n0x0f54 c0x0000 (---------------) + I yokosuka + 0x002abfc8, // n0x0f55 c0x0000 (---------------) + I yugawara + 0x00240f44, // n0x0f56 c0x0000 (---------------) + I zama + 0x0032a845, // n0x0f57 c0x0000 (---------------) + I zushi + 0x00686744, // n0x0f58 c0x0001 (---------------) ! I city + 0x00686744, // n0x0f59 c0x0001 (---------------) ! I city + 0x00686744, // n0x0f5a c0x0001 (---------------) ! I city + 0x00201dc3, // n0x0f5b c0x0000 (---------------) + I aki + 0x00239606, // n0x0f5c c0x0000 (---------------) + I geisei + 0x0027ab86, // n0x0f5d c0x0000 (---------------) + I hidaka + 0x0029cc4c, // n0x0f5e c0x0000 (---------------) + I higashitsuno + 0x00207303, // n0x0f5f c0x0000 (---------------) + I ino + 0x00281286, // n0x0f60 c0x0000 (---------------) + I kagami + 0x00216544, // n0x0f61 c0x0000 (---------------) + I kami + 0x002c1c08, // n0x0f62 c0x0000 (---------------) + I kitagawa + 0x002cb145, // n0x0f63 c0x0000 (---------------) + I kochi + 0x003a69c6, // n0x0f64 c0x0000 (---------------) + I mihara + 0x002b3848, // n0x0f65 c0x0000 (---------------) + I motoyama + 0x002ce6c6, // n0x0f66 c0x0000 (---------------) + I muroto + 0x00205b06, // n0x0f67 c0x0000 (---------------) + I nahari + 0x00365cc8, // n0x0f68 c0x0000 (---------------) + I nakamura + 0x002a0cc7, // n0x0f69 c0x0000 (---------------) + I nankoku + 0x00227f89, // n0x0f6a c0x0000 (---------------) + I nishitosa + 0x0036be4a, // n0x0f6b c0x0000 (---------------) + I niyodogawa + 0x00248784, // n0x0f6c c0x0000 (---------------) + I ochi + 0x002060c5, // n0x0f6d c0x0000 (---------------) + I okawa + 0x0025bb45, // n0x0f6e c0x0000 (---------------) + I otoyo + 0x0021f306, // n0x0f6f c0x0000 (---------------) + I otsuki + 0x00248a46, // n0x0f70 c0x0000 (---------------) + I sakawa + 0x002a66c6, // n0x0f71 c0x0000 (---------------) + I sukumo + 0x002e9346, // n0x0f72 c0x0000 (---------------) + I susaki + 0x002280c4, // n0x0f73 c0x0000 (---------------) + I tosa + 0x002280cb, // n0x0f74 c0x0000 (---------------) + I tosashimizu + 0x00247dc4, // n0x0f75 c0x0000 (---------------) + I toyo + 0x0020d485, // n0x0f76 c0x0000 (---------------) + I tsuno + 0x002ab485, // n0x0f77 c0x0000 (---------------) + I umaji + 0x00280646, // n0x0f78 c0x0000 (---------------) + I yasuda + 0x00202348, // n0x0f79 c0x0000 (---------------) + I yusuhara + 0x00282807, // n0x0f7a c0x0000 (---------------) + I amakusa + 0x0030be84, // n0x0f7b c0x0000 (---------------) + I arao + 0x00264783, // n0x0f7c c0x0000 (---------------) + I aso + 0x00371005, // n0x0f7d c0x0000 (---------------) + I choyo + 0x0024ad87, // n0x0f7e c0x0000 (---------------) + I gyokuto + 0x002a41c9, // n0x0f7f c0x0000 (---------------) + I hitoyoshi + 0x0028270b, // n0x0f80 c0x0000 (---------------) + I kamiamakusa + 0x002a8a87, // n0x0f81 c0x0000 (---------------) + I kashima + 0x0022c9c7, // n0x0f82 c0x0000 (---------------) + I kikuchi + 0x002d8744, // n0x0f83 c0x0000 (---------------) + I kosa + 0x002b3748, // n0x0f84 c0x0000 (---------------) + I kumamoto + 0x002aa987, // n0x0f85 c0x0000 (---------------) + I mashiki + 0x002a4406, // n0x0f86 c0x0000 (---------------) + I mifune + 0x0024e648, // n0x0f87 c0x0000 (---------------) + I minamata + 0x002a68cb, // n0x0f88 c0x0000 (---------------) + I minamioguni + 0x003608c6, // n0x0f89 c0x0000 (---------------) + I nagasu + 0x00212149, // n0x0f8a c0x0000 (---------------) + I nishihara + 0x002a6a45, // n0x0f8b c0x0000 (---------------) + I oguni + 0x00300a43, // n0x0f8c c0x0000 (---------------) + I ozu + 0x002bf5c6, // n0x0f8d c0x0000 (---------------) + I sumoto + 0x0022a948, // n0x0f8e c0x0000 (---------------) + I takamori + 0x00212703, // n0x0f8f c0x0000 (---------------) + I uki + 0x0024ae83, // n0x0f90 c0x0000 (---------------) + I uto + 0x00223bc6, // n0x0f91 c0x0000 (---------------) + I yamaga + 0x0028f086, // n0x0f92 c0x0000 (---------------) + I yamato + 0x00382d0a, // n0x0f93 c0x0000 (---------------) + I yatsushiro + 0x0027c5c5, // n0x0f94 c0x0000 (---------------) + I ayabe + 0x0027cc8b, // n0x0f95 c0x0000 (---------------) + I fukuchiyama + 0x0029d84b, // n0x0f96 c0x0000 (---------------) + I higashiyama + 0x00229943, // n0x0f97 c0x0000 (---------------) + I ide + 0x0021cc03, // n0x0f98 c0x0000 (---------------) + I ine + 0x002adb84, // n0x0f99 c0x0000 (---------------) + I joyo + 0x0022ad47, // n0x0f9a c0x0000 (---------------) + I kameoka + 0x0022a9c4, // n0x0f9b c0x0000 (---------------) + I kamo + 0x00201e04, // n0x0f9c c0x0000 (---------------) + I kita + 0x00342404, // n0x0f9d c0x0000 (---------------) + I kizu + 0x002f62c8, // n0x0f9e c0x0000 (---------------) + I kumiyama + 0x002ce048, // n0x0f9f c0x0000 (---------------) + I kyotamba + 0x0031f2c9, // n0x0fa0 c0x0000 (---------------) + I kyotanabe + 0x00341c88, // n0x0fa1 c0x0000 (---------------) + I kyotango + 0x002d1847, // n0x0fa2 c0x0000 (---------------) + I maizuru + 0x00228406, // n0x0fa3 c0x0000 (---------------) + I minami + 0x002d290f, // n0x0fa4 c0x0000 (---------------) + I minamiyamashiro + 0x002c0c06, // n0x0fa5 c0x0000 (---------------) + I miyazu + 0x002cb0c4, // n0x0fa6 c0x0000 (---------------) + I muko + 0x002cde8a, // n0x0fa7 c0x0000 (---------------) + I nagaokakyo + 0x0024ac87, // n0x0fa8 c0x0000 (---------------) + I nakagyo + 0x00206c06, // n0x0fa9 c0x0000 (---------------) + I nantan + 0x0028ea09, // n0x0faa c0x0000 (---------------) + I oyamazaki + 0x0031f245, // n0x0fab c0x0000 (---------------) + I sakyo + 0x0022cc05, // n0x0fac c0x0000 (---------------) + I seika + 0x0031f386, // n0x0fad c0x0000 (---------------) + I tanabe + 0x0021c2c3, // n0x0fae c0x0000 (---------------) + I uji + 0x00371549, // n0x0faf c0x0000 (---------------) + I ujitawara + 0x0021a646, // n0x0fb0 c0x0000 (---------------) + I wazuka + 0x0022af89, // n0x0fb1 c0x0000 (---------------) + I yamashina + 0x0038f146, // n0x0fb2 c0x0000 (---------------) + I yawata + 0x002bf185, // n0x0fb3 c0x0000 (---------------) + I asahi + 0x002236c5, // n0x0fb4 c0x0000 (---------------) + I inabe + 0x00204683, // n0x0fb5 c0x0000 (---------------) + I ise + 0x0022ae88, // n0x0fb6 c0x0000 (---------------) + I kameyama + 0x0039f7c7, // n0x0fb7 c0x0000 (---------------) + I kawagoe + 0x002f5c84, // n0x0fb8 c0x0000 (---------------) + I kiho + 0x0021f408, // n0x0fb9 c0x0000 (---------------) + I kisosaki + 0x002da084, // n0x0fba c0x0000 (---------------) + I kiwa + 0x002b9886, // n0x0fbb c0x0000 (---------------) + I komono + 0x00383786, // n0x0fbc c0x0000 (---------------) + I kumano + 0x00243e46, // n0x0fbd c0x0000 (---------------) + I kuwana + 0x002c6249, // n0x0fbe c0x0000 (---------------) + I matsusaka + 0x002be885, // n0x0fbf c0x0000 (---------------) + I meiwa + 0x002da306, // n0x0fc0 c0x0000 (---------------) + I mihama + 0x0025b189, // n0x0fc1 c0x0000 (---------------) + I minamiise + 0x002bfd46, // n0x0fc2 c0x0000 (---------------) + I misugi + 0x002d2a06, // n0x0fc3 c0x0000 (---------------) + I miyama + 0x0037fcc6, // n0x0fc4 c0x0000 (---------------) + I nabari + 0x0020ef45, // n0x0fc5 c0x0000 (---------------) + I shima + 0x002eeb46, // n0x0fc6 c0x0000 (---------------) + I suzuka + 0x0032f6c4, // n0x0fc7 c0x0000 (---------------) + I tado + 0x00289e05, // n0x0fc8 c0x0000 (---------------) + I taiki + 0x002b8f84, // n0x0fc9 c0x0000 (---------------) + I taki + 0x003037c6, // n0x0fca c0x0000 (---------------) + I tamaki + 0x00395ec4, // n0x0fcb c0x0000 (---------------) + I toba + 0x00208c83, // n0x0fcc c0x0000 (---------------) + I tsu + 0x00286185, // n0x0fcd c0x0000 (---------------) + I udono + 0x0023b908, // n0x0fce c0x0000 (---------------) + I ureshino + 0x00351b87, // n0x0fcf c0x0000 (---------------) + I watarai + 0x002b1f89, // n0x0fd0 c0x0000 (---------------) + I yokkaichi + 0x002863c8, // n0x0fd1 c0x0000 (---------------) + I furukawa + 0x00297811, // n0x0fd2 c0x0000 (---------------) + I higashimatsushima + 0x0022c7ca, // n0x0fd3 c0x0000 (---------------) + I ishinomaki + 0x0022f147, // n0x0fd4 c0x0000 (---------------) + I iwanuma + 0x0039fd06, // n0x0fd5 c0x0000 (---------------) + I kakuda + 0x00216544, // n0x0fd6 c0x0000 (---------------) + I kami + 0x002b9088, // n0x0fd7 c0x0000 (---------------) + I kawasaki + 0x002935c9, // n0x0fd8 c0x0000 (---------------) + I kesennuma + 0x002a8bc8, // n0x0fd9 c0x0000 (---------------) + I marumori + 0x002979ca, // n0x0fda c0x0000 (---------------) + I matsushima + 0x002a740d, // n0x0fdb c0x0000 (---------------) + I minamisanriku + 0x0022f486, // n0x0fdc c0x0000 (---------------) + I misato + 0x00365dc6, // n0x0fdd c0x0000 (---------------) + I murata + 0x002db306, // n0x0fde c0x0000 (---------------) + I natori + 0x0037e6c7, // n0x0fdf c0x0000 (---------------) + I ogawara + 0x0029ef85, // n0x0fe0 c0x0000 (---------------) + I ohira + 0x003508c7, // n0x0fe1 c0x0000 (---------------) + I onagawa + 0x0021f4c5, // n0x0fe2 c0x0000 (---------------) + I osaki + 0x002a5784, // n0x0fe3 c0x0000 (---------------) + I rifu + 0x002a9286, // n0x0fe4 c0x0000 (---------------) + I semine + 0x00321bc7, // n0x0fe5 c0x0000 (---------------) + I shibata + 0x0037124d, // n0x0fe6 c0x0000 (---------------) + I shichikashuku + 0x0028d7c7, // n0x0fe7 c0x0000 (---------------) + I shikama + 0x0026ebc8, // n0x0fe8 c0x0000 (---------------) + I shiogama + 0x0027a9c9, // n0x0fe9 c0x0000 (---------------) + I shiroishi + 0x00224606, // n0x0fea c0x0000 (---------------) + I tagajo + 0x0023b045, // n0x0feb c0x0000 (---------------) + I taiwa + 0x00216044, // n0x0fec c0x0000 (---------------) + I tome + 0x00266086, // n0x0fed c0x0000 (---------------) + I tomiya + 0x00350a06, // n0x0fee c0x0000 (---------------) + I wakuya + 0x002b6e86, // n0x0fef c0x0000 (---------------) + I watari + 0x0029ae08, // n0x0ff0 c0x0000 (---------------) + I yamamoto + 0x00212d43, // n0x0ff1 c0x0000 (---------------) + I zao + 0x002088c3, // n0x0ff2 c0x0000 (---------------) + I aya + 0x00328105, // n0x0ff3 c0x0000 (---------------) + I ebino + 0x00337286, // n0x0ff4 c0x0000 (---------------) + I gokase + 0x002abf85, // n0x0ff5 c0x0000 (---------------) + I hyuga + 0x00245948, // n0x0ff6 c0x0000 (---------------) + I kadogawa + 0x0029c60a, // n0x0ff7 c0x0000 (---------------) + I kawaminami + 0x002ddbc4, // n0x0ff8 c0x0000 (---------------) + I kijo + 0x002c1c08, // n0x0ff9 c0x0000 (---------------) + I kitagawa + 0x00295fc8, // n0x0ffa c0x0000 (---------------) + I kitakata + 0x00280487, // n0x0ffb c0x0000 (---------------) + I kitaura + 0x002fe8c9, // n0x0ffc c0x0000 (---------------) + I kobayashi + 0x002b3448, // n0x0ffd c0x0000 (---------------) + I kunitomi + 0x0029a047, // n0x0ffe c0x0000 (---------------) + I kushima + 0x00294c06, // n0x0fff c0x0000 (---------------) + I mimata + 0x0020a5ca, // n0x1000 c0x0000 (---------------) + I miyakonojo + 0x00266108, // n0x1001 c0x0000 (---------------) + I miyazaki + 0x002bd509, // n0x1002 c0x0000 (---------------) + I morotsuka + 0x002869c8, // n0x1003 c0x0000 (---------------) + I nichinan + 0x0021c809, // n0x1004 c0x0000 (---------------) + I nishimera + 0x002bd987, // n0x1005 c0x0000 (---------------) + I nobeoka + 0x00341b45, // n0x1006 c0x0000 (---------------) + I saito + 0x002a1746, // n0x1007 c0x0000 (---------------) + I shiiba + 0x0029b188, // n0x1008 c0x0000 (---------------) + I shintomi + 0x00252e08, // n0x1009 c0x0000 (---------------) + I takaharu + 0x0022b388, // n0x100a c0x0000 (---------------) + I takanabe + 0x00216a48, // n0x100b c0x0000 (---------------) + I takazaki + 0x0020d485, // n0x100c c0x0000 (---------------) + I tsuno + 0x00201544, // n0x100d c0x0000 (---------------) + I achi + 0x0039f4c8, // n0x100e c0x0000 (---------------) + I agematsu + 0x00206d04, // n0x100f c0x0000 (---------------) + I anan + 0x00395b04, // n0x1010 c0x0000 (---------------) + I aoki + 0x002bf185, // n0x1011 c0x0000 (---------------) + I asahi + 0x0028ffc7, // n0x1012 c0x0000 (---------------) + I azumino + 0x00201a09, // n0x1013 c0x0000 (---------------) + I chikuhoku + 0x002086c7, // n0x1014 c0x0000 (---------------) + I chikuma + 0x0020db85, // n0x1015 c0x0000 (---------------) + I chino + 0x00278286, // n0x1016 c0x0000 (---------------) + I fujimi + 0x0033bb06, // n0x1017 c0x0000 (---------------) + I hakuba + 0x00202444, // n0x1018 c0x0000 (---------------) + I hara + 0x002a0506, // n0x1019 c0x0000 (---------------) + I hiraya + 0x00214a84, // n0x101a c0x0000 (---------------) + I iida + 0x0025cc86, // n0x101b c0x0000 (---------------) + I iijima + 0x0039e786, // n0x101c c0x0000 (---------------) + I iiyama + 0x00212546, // n0x101d c0x0000 (---------------) + I iizuna + 0x00202585, // n0x101e c0x0000 (---------------) + I ikeda + 0x00245807, // n0x101f c0x0000 (---------------) + I ikusaka + 0x002013c3, // n0x1020 c0x0000 (---------------) + I ina + 0x00249f89, // n0x1021 c0x0000 (---------------) + I karuizawa + 0x002fdbc8, // n0x1022 c0x0000 (---------------) + I kawakami + 0x0021f404, // n0x1023 c0x0000 (---------------) + I kiso + 0x0032fbcd, // n0x1024 c0x0000 (---------------) + I kisofukushima + 0x00295e48, // n0x1025 c0x0000 (---------------) + I kitaaiki + 0x0028e748, // n0x1026 c0x0000 (---------------) + I komagane + 0x002bd486, // n0x1027 c0x0000 (---------------) + I komoro + 0x0021f809, // n0x1028 c0x0000 (---------------) + I matsukawa + 0x002bf509, // n0x1029 c0x0000 (---------------) + I matsumoto + 0x002b6685, // n0x102a c0x0000 (---------------) + I miasa + 0x0029c70a, // n0x102b c0x0000 (---------------) + I minamiaiki + 0x0027f80a, // n0x102c c0x0000 (---------------) + I minamimaki + 0x0028850c, // n0x102d c0x0000 (---------------) + I minamiminowa + 0x00288686, // n0x102e c0x0000 (---------------) + I minowa + 0x00278b46, // n0x102f c0x0000 (---------------) + I miyada + 0x002c0d86, // n0x1030 c0x0000 (---------------) + I miyota + 0x00257009, // n0x1031 c0x0000 (---------------) + I mochizuki + 0x00354f86, // n0x1032 c0x0000 (---------------) + I nagano + 0x00291bc6, // n0x1033 c0x0000 (---------------) + I nagawa + 0x00325606, // n0x1034 c0x0000 (---------------) + I nagiso + 0x002ac8c8, // n0x1035 c0x0000 (---------------) + I nakagawa + 0x002546c6, // n0x1036 c0x0000 (---------------) + I nakano + 0x002c658b, // n0x1037 c0x0000 (---------------) + I nozawaonsen + 0x00290145, // n0x1038 c0x0000 (---------------) + I obuse + 0x00245a05, // n0x1039 c0x0000 (---------------) + I ogawa + 0x00278dc5, // n0x103a c0x0000 (---------------) + I okaya + 0x002014c6, // n0x103b c0x0000 (---------------) + I omachi + 0x0020a583, // n0x103c c0x0000 (---------------) + I omi + 0x00243dc6, // n0x103d c0x0000 (---------------) + I ookuwa + 0x0028d747, // n0x103e c0x0000 (---------------) + I ooshika + 0x002b8f45, // n0x103f c0x0000 (---------------) + I otaki + 0x0025bc45, // n0x1040 c0x0000 (---------------) + I otari + 0x002dd385, // n0x1041 c0x0000 (---------------) + I sakae + 0x00318606, // n0x1042 c0x0000 (---------------) + I sakaki + 0x002b6744, // n0x1043 c0x0000 (---------------) + I saku + 0x00369d86, // n0x1044 c0x0000 (---------------) + I sakuho + 0x0027b309, // n0x1045 c0x0000 (---------------) + I shimosuwa + 0x0020134c, // n0x1046 c0x0000 (---------------) + I shinanomachi + 0x002a54c8, // n0x1047 c0x0000 (---------------) + I shiojiri + 0x0027b444, // n0x1048 c0x0000 (---------------) + I suwa + 0x002ee7c6, // n0x1049 c0x0000 (---------------) + I suzaka + 0x002a0b46, // n0x104a c0x0000 (---------------) + I takagi + 0x0022a948, // n0x104b c0x0000 (---------------) + I takamori + 0x002c0148, // n0x104c c0x0000 (---------------) + I takayama + 0x00201249, // n0x104d c0x0000 (---------------) + I tateshina + 0x0020d407, // n0x104e c0x0000 (---------------) + I tatsuno + 0x002ae7c9, // n0x104f c0x0000 (---------------) + I togakushi + 0x0026fa46, // n0x1050 c0x0000 (---------------) + I togura + 0x0022f404, // n0x1051 c0x0000 (---------------) + I tomi + 0x0020e184, // n0x1052 c0x0000 (---------------) + I ueda + 0x0024a344, // n0x1053 c0x0000 (---------------) + I wada + 0x002808c8, // n0x1054 c0x0000 (---------------) + I yamagata + 0x0020184a, // n0x1055 c0x0000 (---------------) + I yamanouchi + 0x0034c986, // n0x1056 c0x0000 (---------------) + I yasaka + 0x00353407, // n0x1057 c0x0000 (---------------) + I yasuoka + 0x00311d87, // n0x1058 c0x0000 (---------------) + I chijiwa + 0x0036b785, // n0x1059 c0x0000 (---------------) + I futsu + 0x0028de84, // n0x105a c0x0000 (---------------) + I goto + 0x0028bb06, // n0x105b c0x0000 (---------------) + I hasami + 0x00339dc6, // n0x105c c0x0000 (---------------) + I hirado + 0x0023be03, // n0x105d c0x0000 (---------------) + I iki + 0x002fda07, // n0x105e c0x0000 (---------------) + I isahaya + 0x00330e48, // n0x105f c0x0000 (---------------) + I kawatana + 0x002b67ca, // n0x1060 c0x0000 (---------------) + I kuchinotsu + 0x002c9f88, // n0x1061 c0x0000 (---------------) + I matsuura + 0x002dda48, // n0x1062 c0x0000 (---------------) + I nagasaki + 0x00395f05, // n0x1063 c0x0000 (---------------) + I obama + 0x0037ed85, // n0x1064 c0x0000 (---------------) + I omura + 0x002ae705, // n0x1065 c0x0000 (---------------) + I oseto + 0x0036bb46, // n0x1066 c0x0000 (---------------) + I saikai + 0x003a3f06, // n0x1067 c0x0000 (---------------) + I sasebo + 0x00218945, // n0x1068 c0x0000 (---------------) + I seihi + 0x002ec949, // n0x1069 c0x0000 (---------------) + I shimabara + 0x0028dc8c, // n0x106a c0x0000 (---------------) + I shinkamigoto + 0x00240187, // n0x106b c0x0000 (---------------) + I togitsu + 0x00297a48, // n0x106c c0x0000 (---------------) + I tsushima + 0x0028c145, // n0x106d c0x0000 (---------------) + I unzen + 0x00686744, // n0x106e c0x0001 (---------------) ! I city + 0x00259644, // n0x106f c0x0000 (---------------) + I ando + 0x002b13c4, // n0x1070 c0x0000 (---------------) + I gose + 0x0020dcc6, // n0x1071 c0x0000 (---------------) + I heguri + 0x0029e3ce, // n0x1072 c0x0000 (---------------) + I higashiyoshino + 0x0022cc87, // n0x1073 c0x0000 (---------------) + I ikaruga + 0x00296ec5, // n0x1074 c0x0000 (---------------) + I ikoma + 0x0028ee8c, // n0x1075 c0x0000 (---------------) + I kamikitayama + 0x002d9f47, // n0x1076 c0x0000 (---------------) + I kanmaki + 0x00321b47, // n0x1077 c0x0000 (---------------) + I kashiba + 0x00398f89, // n0x1078 c0x0000 (---------------) + I kashihara + 0x00219349, // n0x1079 c0x0000 (---------------) + I katsuragi + 0x002864c5, // n0x107a c0x0000 (---------------) + I kawai + 0x002fdbc8, // n0x107b c0x0000 (---------------) + I kawakami + 0x002bdc49, // n0x107c c0x0000 (---------------) + I kawanishi + 0x002d6e45, // n0x107d c0x0000 (---------------) + I koryo + 0x002b8e88, // n0x107e c0x0000 (---------------) + I kurotaki + 0x002c6b46, // n0x107f c0x0000 (---------------) + I mitsue + 0x002d2306, // n0x1080 c0x0000 (---------------) + I miyake + 0x002c8a04, // n0x1081 c0x0000 (---------------) + I nara + 0x003281c8, // n0x1082 c0x0000 (---------------) + I nosegawa + 0x002247c3, // n0x1083 c0x0000 (---------------) + I oji + 0x00209204, // n0x1084 c0x0000 (---------------) + I ouda + 0x00371085, // n0x1085 c0x0000 (---------------) + I oyodo + 0x00307fc7, // n0x1086 c0x0000 (---------------) + I sakurai + 0x00202c85, // n0x1087 c0x0000 (---------------) + I sango + 0x00281f89, // n0x1088 c0x0000 (---------------) + I shimoichi + 0x0026784d, // n0x1089 c0x0000 (---------------) + I shimokitayama + 0x0033bd46, // n0x108a c0x0000 (---------------) + I shinjo + 0x002647c4, // n0x108b c0x0000 (---------------) + I soni + 0x00294d08, // n0x108c c0x0000 (---------------) + I takatori + 0x002784ca, // n0x108d c0x0000 (---------------) + I tawaramoto + 0x002177c7, // n0x108e c0x0000 (---------------) + I tenkawa + 0x003460c5, // n0x108f c0x0000 (---------------) + I tenri + 0x00209243, // n0x1090 c0x0000 (---------------) + I uda + 0x0029da0e, // n0x1091 c0x0000 (---------------) + I yamatokoriyama + 0x0028f08c, // n0x1092 c0x0000 (---------------) + I yamatotakada + 0x002fa407, // n0x1093 c0x0000 (---------------) + I yamazoe + 0x0029e587, // n0x1094 c0x0000 (---------------) + I yoshino + 0x00201003, // n0x1095 c0x0000 (---------------) + I aga + 0x00354fc5, // n0x1096 c0x0000 (---------------) + I agano + 0x002b13c5, // n0x1097 c0x0000 (---------------) + I gosen + 0x00298688, // n0x1098 c0x0000 (---------------) + I itoigawa + 0x00294149, // n0x1099 c0x0000 (---------------) + I izumozaki + 0x00292e46, // n0x109a c0x0000 (---------------) + I joetsu + 0x0022a9c4, // n0x109b c0x0000 (---------------) + I kamo + 0x0022f086, // n0x109c c0x0000 (---------------) + I kariwa + 0x00205dcb, // n0x109d c0x0000 (---------------) + I kashiwazaki + 0x002c598c, // n0x109e c0x0000 (---------------) + I minamiuonuma + 0x002ebdc7, // n0x109f c0x0000 (---------------) + I mitsuke + 0x002cae05, // n0x10a0 c0x0000 (---------------) + I muika + 0x00383248, // n0x10a1 c0x0000 (---------------) + I murakami + 0x002d0985, // n0x10a2 c0x0000 (---------------) + I myoko + 0x002cde87, // n0x10a3 c0x0000 (---------------) + I nagaoka + 0x0023ff87, // n0x10a4 c0x0000 (---------------) + I niigata + 0x0024f385, // n0x10a5 c0x0000 (---------------) + I ojiya + 0x0020a583, // n0x10a6 c0x0000 (---------------) + I omi + 0x00360584, // n0x10a7 c0x0000 (---------------) + I sado + 0x00203f85, // n0x10a8 c0x0000 (---------------) + I sanjo + 0x002e6c05, // n0x10a9 c0x0000 (---------------) + I seiro + 0x002e6c06, // n0x10aa c0x0000 (---------------) + I seirou + 0x0026c588, // n0x10ab c0x0000 (---------------) + I sekikawa + 0x00321bc7, // n0x10ac c0x0000 (---------------) + I shibata + 0x003780c6, // n0x10ad c0x0000 (---------------) + I tagami + 0x00354c46, // n0x10ae c0x0000 (---------------) + I tainai + 0x002e4b06, // n0x10af c0x0000 (---------------) + I tochio + 0x00297189, // n0x10b0 c0x0000 (---------------) + I tokamachi + 0x00208c87, // n0x10b1 c0x0000 (---------------) + I tsubame + 0x00292cc6, // n0x10b2 c0x0000 (---------------) + I tsunan + 0x002c5b06, // n0x10b3 c0x0000 (---------------) + I uonuma + 0x0024f446, // n0x10b4 c0x0000 (---------------) + I yahiko + 0x002a8945, // n0x10b5 c0x0000 (---------------) + I yoita + 0x00217246, // n0x10b6 c0x0000 (---------------) + I yuzawa + 0x0038de05, // n0x10b7 c0x0000 (---------------) + I beppu + 0x002d1f48, // n0x10b8 c0x0000 (---------------) + I bungoono + 0x00292a0b, // n0x10b9 c0x0000 (---------------) + I bungotakada + 0x0028b906, // n0x10ba c0x0000 (---------------) + I hasama + 0x00311dc4, // n0x10bb c0x0000 (---------------) + I hiji + 0x002fe3c9, // n0x10bc c0x0000 (---------------) + I himeshima + 0x002a27c4, // n0x10bd c0x0000 (---------------) + I hita + 0x002c6ac8, // n0x10be c0x0000 (---------------) + I kamitsue + 0x0028adc7, // n0x10bf c0x0000 (---------------) + I kokonoe + 0x00283fc4, // n0x10c0 c0x0000 (---------------) + I kuju + 0x002b2a08, // n0x10c1 c0x0000 (---------------) + I kunisaki + 0x002ba1c4, // n0x10c2 c0x0000 (---------------) + I kusu + 0x002a8984, // n0x10c3 c0x0000 (---------------) + I oita + 0x00286f45, // n0x10c4 c0x0000 (---------------) + I saiki + 0x00305a86, // n0x10c5 c0x0000 (---------------) + I taketa + 0x002f6207, // n0x10c6 c0x0000 (---------------) + I tsukumi + 0x0022b983, // n0x10c7 c0x0000 (---------------) + I usa + 0x0029d4c5, // n0x10c8 c0x0000 (---------------) + I usuki + 0x002bc144, // n0x10c9 c0x0000 (---------------) + I yufu + 0x002721c6, // n0x10ca c0x0000 (---------------) + I akaiwa + 0x002b6708, // n0x10cb c0x0000 (---------------) + I asakuchi + 0x00330b85, // n0x10cc c0x0000 (---------------) + I bizen + 0x0028fa49, // n0x10cd c0x0000 (---------------) + I hayashima + 0x0020c145, // n0x10ce c0x0000 (---------------) + I ibara + 0x002bbb48, // n0x10cf c0x0000 (---------------) + I kagamino + 0x00320d87, // n0x10d0 c0x0000 (---------------) + I kasaoka + 0x003809c8, // n0x10d1 c0x0000 (---------------) + I kibichuo + 0x002b1dc7, // n0x10d2 c0x0000 (---------------) + I kumenan + 0x0037e0c9, // n0x10d3 c0x0000 (---------------) + I kurashiki + 0x0031d046, // n0x10d4 c0x0000 (---------------) + I maniwa + 0x00347a06, // n0x10d5 c0x0000 (---------------) + I misaki + 0x00269404, // n0x10d6 c0x0000 (---------------) + I nagi + 0x00294b45, // n0x10d7 c0x0000 (---------------) + I niimi + 0x002f48cc, // n0x10d8 c0x0000 (---------------) + I nishiawakura + 0x00278dc7, // n0x10d9 c0x0000 (---------------) + I okayama + 0x002791c7, // n0x10da c0x0000 (---------------) + I satosho + 0x00311c48, // n0x10db c0x0000 (---------------) + I setouchi + 0x0033bd46, // n0x10dc c0x0000 (---------------) + I shinjo + 0x0029eec4, // n0x10dd c0x0000 (---------------) + I shoo + 0x00323cc4, // n0x10de c0x0000 (---------------) + I soja + 0x00280a49, // n0x10df c0x0000 (---------------) + I takahashi + 0x002c0e86, // n0x10e0 c0x0000 (---------------) + I tamano + 0x0021ec47, // n0x10e1 c0x0000 (---------------) + I tsuyama + 0x00208504, // n0x10e2 c0x0000 (---------------) + I wake + 0x002b2886, // n0x10e3 c0x0000 (---------------) + I yakage + 0x00320985, // n0x10e4 c0x0000 (---------------) + I aguni + 0x002a2ac7, // n0x10e5 c0x0000 (---------------) + I ginowan + 0x002c6506, // n0x10e6 c0x0000 (---------------) + I ginoza + 0x0025c649, // n0x10e7 c0x0000 (---------------) + I gushikami + 0x0027f647, // n0x10e8 c0x0000 (---------------) + I haebaru + 0x00268047, // n0x10e9 c0x0000 (---------------) + I higashi + 0x002a0046, // n0x10ea c0x0000 (---------------) + I hirara + 0x002452c5, // n0x10eb c0x0000 (---------------) + I iheya + 0x0027e248, // n0x10ec c0x0000 (---------------) + I ishigaki + 0x0021a4c8, // n0x10ed c0x0000 (---------------) + I ishikawa + 0x00242b46, // n0x10ee c0x0000 (---------------) + I itoman + 0x00330bc5, // n0x10ef c0x0000 (---------------) + I izena + 0x00331c86, // n0x10f0 c0x0000 (---------------) + I kadena + 0x002154c3, // n0x10f1 c0x0000 (---------------) + I kin + 0x00298509, // n0x10f2 c0x0000 (---------------) + I kitadaito + 0x002a644e, // n0x10f3 c0x0000 (---------------) + I kitanakagusuku + 0x002b1ac8, // n0x10f4 c0x0000 (---------------) + I kumejima + 0x002da188, // n0x10f5 c0x0000 (---------------) + I kunigami + 0x0024294b, // n0x10f6 c0x0000 (---------------) + I minamidaito + 0x0028fc86, // n0x10f7 c0x0000 (---------------) + I motobu + 0x002486c4, // n0x10f8 c0x0000 (---------------) + I nago + 0x00205b04, // n0x10f9 c0x0000 (---------------) + I naha + 0x002a654a, // n0x10fa c0x0000 (---------------) + I nakagusuku + 0x00217e07, // n0x10fb c0x0000 (---------------) + I nakijin + 0x00292d85, // n0x10fc c0x0000 (---------------) + I nanjo + 0x00212149, // n0x10fd c0x0000 (---------------) + I nishihara + 0x002b8285, // n0x10fe c0x0000 (---------------) + I ogimi + 0x00395b47, // n0x10ff c0x0000 (---------------) + I okinawa + 0x00301304, // n0x1100 c0x0000 (---------------) + I onna + 0x00383e87, // n0x1101 c0x0000 (---------------) + I shimoji + 0x0022f308, // n0x1102 c0x0000 (---------------) + I taketomi + 0x002b0046, // n0x1103 c0x0000 (---------------) + I tarama + 0x00342249, // n0x1104 c0x0000 (---------------) + I tokashiki + 0x002b354a, // n0x1105 c0x0000 (---------------) + I tomigusuku + 0x00217d86, // n0x1106 c0x0000 (---------------) + I tonaki + 0x00295986, // n0x1107 c0x0000 (---------------) + I urasoe + 0x002ab405, // n0x1108 c0x0000 (---------------) + I uruma + 0x00373d05, // n0x1109 c0x0000 (---------------) + I yaese + 0x00229a47, // n0x110a c0x0000 (---------------) + I yomitan + 0x00249888, // n0x110b c0x0000 (---------------) + I yonabaru + 0x003208c8, // n0x110c c0x0000 (---------------) + I yonaguni + 0x00240f46, // n0x110d c0x0000 (---------------) + I zamami + 0x00223745, // n0x110e c0x0000 (---------------) + I abeno + 0x002487ce, // n0x110f c0x0000 (---------------) + I chihayaakasaka + 0x0030ba84, // n0x1110 c0x0000 (---------------) + I chuo + 0x00242ac5, // n0x1111 c0x0000 (---------------) + I daito + 0x00277c09, // n0x1112 c0x0000 (---------------) + I fujiidera + 0x0026b5c8, // n0x1113 c0x0000 (---------------) + I habikino + 0x003a1c46, // n0x1114 c0x0000 (---------------) + I hannan + 0x0029aa8c, // n0x1115 c0x0000 (---------------) + I higashiosaka + 0x0029c210, // n0x1116 c0x0000 (---------------) + I higashisumiyoshi + 0x0029e00f, // n0x1117 c0x0000 (---------------) + I higashiyodogawa + 0x0029efc8, // n0x1118 c0x0000 (---------------) + I hirakata + 0x002c1ac7, // n0x1119 c0x0000 (---------------) + I ibaraki + 0x00202585, // n0x111a c0x0000 (---------------) + I ikeda + 0x002802c5, // n0x111b c0x0000 (---------------) + I izumi + 0x002f6089, // n0x111c c0x0000 (---------------) + I izumiotsu + 0x00294509, // n0x111d c0x0000 (---------------) + I izumisano + 0x0021e5c6, // n0x111e c0x0000 (---------------) + I kadoma + 0x002fa147, // n0x111f c0x0000 (---------------) + I kaizuka + 0x0038ad85, // n0x1120 c0x0000 (---------------) + I kanan + 0x002037c9, // n0x1121 c0x0000 (---------------) + I kashiwara + 0x0032c486, // n0x1122 c0x0000 (---------------) + I katano + 0x00354dcd, // n0x1123 c0x0000 (---------------) + I kawachinagano + 0x00287009, // n0x1124 c0x0000 (---------------) + I kishiwada + 0x00201e04, // n0x1125 c0x0000 (---------------) + I kita + 0x002b1848, // n0x1126 c0x0000 (---------------) + I kumatori + 0x0039f589, // n0x1127 c0x0000 (---------------) + I matsubara + 0x0034cb46, // n0x1128 c0x0000 (---------------) + I minato + 0x00278385, // n0x1129 c0x0000 (---------------) + I minoh + 0x00347a06, // n0x112a c0x0000 (---------------) + I misaki + 0x0030bf89, // n0x112b c0x0000 (---------------) + I moriguchi + 0x00320008, // n0x112c c0x0000 (---------------) + I neyagawa + 0x00211805, // n0x112d c0x0000 (---------------) + I nishi + 0x0026c504, // n0x112e c0x0000 (---------------) + I nose + 0x0029ac4b, // n0x112f c0x0000 (---------------) + I osakasayama + 0x0034ca05, // n0x1130 c0x0000 (---------------) + I sakai + 0x0029ad86, // n0x1131 c0x0000 (---------------) + I sayama + 0x00282c86, // n0x1132 c0x0000 (---------------) + I sennan + 0x0024c046, // n0x1133 c0x0000 (---------------) + I settsu + 0x0038428b, // n0x1134 c0x0000 (---------------) + I shijonawate + 0x0028fb49, // n0x1135 c0x0000 (---------------) + I shimamoto + 0x00218c85, // n0x1136 c0x0000 (---------------) + I suita + 0x00380787, // n0x1137 c0x0000 (---------------) + I tadaoka + 0x0022c746, // n0x1138 c0x0000 (---------------) + I taishi + 0x00238746, // n0x1139 c0x0000 (---------------) + I tajiri + 0x00281e48, // n0x113a c0x0000 (---------------) + I takaishi + 0x00305b89, // n0x113b c0x0000 (---------------) + I takatsuki + 0x0026e98c, // n0x113c c0x0000 (---------------) + I tondabayashi + 0x0024ab88, // n0x113d c0x0000 (---------------) + I toyonaka + 0x0037b006, // n0x113e c0x0000 (---------------) + I toyono + 0x00341743, // n0x113f c0x0000 (---------------) + I yao + 0x00249246, // n0x1140 c0x0000 (---------------) + I ariake + 0x0027ff85, // n0x1141 c0x0000 (---------------) + I arita + 0x0027cfc8, // n0x1142 c0x0000 (---------------) + I fukudomi + 0x00223146, // n0x1143 c0x0000 (---------------) + I genkai + 0x002a2d08, // n0x1144 c0x0000 (---------------) + I hamatama + 0x0024ba45, // n0x1145 c0x0000 (---------------) + I hizen + 0x0027bc05, // n0x1146 c0x0000 (---------------) + I imari + 0x00321008, // n0x1147 c0x0000 (---------------) + I kamimine + 0x002eec47, // n0x1148 c0x0000 (---------------) + I kanzaki + 0x00377d07, // n0x1149 c0x0000 (---------------) + I karatsu + 0x002a8a87, // n0x114a c0x0000 (---------------) + I kashima + 0x0021f588, // n0x114b c0x0000 (---------------) + I kitagata + 0x0028ebc8, // n0x114c c0x0000 (---------------) + I kitahata + 0x0024edc6, // n0x114d c0x0000 (---------------) + I kiyama + 0x00303607, // n0x114e c0x0000 (---------------) + I kouhoku + 0x0036ad87, // n0x114f c0x0000 (---------------) + I kyuragi + 0x0027fe4a, // n0x1150 c0x0000 (---------------) + I nishiarita + 0x00213483, // n0x1151 c0x0000 (---------------) + I ogi + 0x002014c6, // n0x1152 c0x0000 (---------------) + I omachi + 0x00201985, // n0x1153 c0x0000 (---------------) + I ouchi + 0x00238904, // n0x1154 c0x0000 (---------------) + I saga + 0x0027a9c9, // n0x1155 c0x0000 (---------------) + I shiroishi + 0x0037e044, // n0x1156 c0x0000 (---------------) + I taku + 0x002a1204, // n0x1157 c0x0000 (---------------) + I tara + 0x002a09c4, // n0x1158 c0x0000 (---------------) + I tosu + 0x0029e58b, // n0x1159 c0x0000 (---------------) + I yoshinogari + 0x0039f707, // n0x115a c0x0000 (---------------) + I arakawa + 0x00248a05, // n0x115b c0x0000 (---------------) + I asaka + 0x00292888, // n0x115c c0x0000 (---------------) + I chichibu + 0x00278286, // n0x115d c0x0000 (---------------) + I fujimi + 0x00278288, // n0x115e c0x0000 (---------------) + I fujimino + 0x0027c506, // n0x115f c0x0000 (---------------) + I fukaya + 0x00289385, // n0x1160 c0x0000 (---------------) + I hanno + 0x0028a805, // n0x1161 c0x0000 (---------------) + I hanyu + 0x0028c486, // n0x1162 c0x0000 (---------------) + I hasuda + 0x0028d4c8, // n0x1163 c0x0000 (---------------) + I hatogaya + 0x0028e948, // n0x1164 c0x0000 (---------------) + I hatoyama + 0x0027ab86, // n0x1165 c0x0000 (---------------) + I hidaka + 0x002926cf, // n0x1166 c0x0000 (---------------) + I higashichichibu + 0x00297fd0, // n0x1167 c0x0000 (---------------) + I higashimatsuyama + 0x0038e545, // n0x1168 c0x0000 (---------------) + I honjo + 0x002013c3, // n0x1169 c0x0000 (---------------) + I ina + 0x00251c85, // n0x116a c0x0000 (---------------) + I iruma + 0x002ff488, // n0x116b c0x0000 (---------------) + I iwatsuki + 0x00294409, // n0x116c c0x0000 (---------------) + I kamiizumi + 0x002e8008, // n0x116d c0x0000 (---------------) + I kamikawa + 0x0034cdc8, // n0x116e c0x0000 (---------------) + I kamisato + 0x00207888, // n0x116f c0x0000 (---------------) + I kasukabe + 0x0039f7c7, // n0x1170 c0x0000 (---------------) + I kawagoe + 0x00277f49, // n0x1171 c0x0000 (---------------) + I kawaguchi + 0x002a2f08, // n0x1172 c0x0000 (---------------) + I kawajima + 0x002b7444, // n0x1173 c0x0000 (---------------) + I kazo + 0x002a0848, // n0x1174 c0x0000 (---------------) + I kitamoto + 0x00289b89, // n0x1175 c0x0000 (---------------) + I koshigaya + 0x0030a447, // n0x1176 c0x0000 (---------------) + I kounosu + 0x002a63c4, // n0x1177 c0x0000 (---------------) + I kuki + 0x00208788, // n0x1178 c0x0000 (---------------) + I kumagaya + 0x002455ca, // n0x1179 c0x0000 (---------------) + I matsubushi + 0x002d8c06, // n0x117a c0x0000 (---------------) + I minano + 0x0022f486, // n0x117b c0x0000 (---------------) + I misato + 0x0021d389, // n0x117c c0x0000 (---------------) + I miyashiro + 0x0029c447, // n0x117d c0x0000 (---------------) + I miyoshi + 0x002c6ec8, // n0x117e c0x0000 (---------------) + I moroyama + 0x0038e088, // n0x117f c0x0000 (---------------) + I nagatoro + 0x00208388, // n0x1180 c0x0000 (---------------) + I namegawa + 0x00352f45, // n0x1181 c0x0000 (---------------) + I niiza + 0x00374cc5, // n0x1182 c0x0000 (---------------) + I ogano + 0x00245a05, // n0x1183 c0x0000 (---------------) + I ogawa + 0x002b1385, // n0x1184 c0x0000 (---------------) + I ogose + 0x0035ce07, // n0x1185 c0x0000 (---------------) + I okegawa + 0x0020a585, // n0x1186 c0x0000 (---------------) + I omiya + 0x002b8f45, // n0x1187 c0x0000 (---------------) + I otaki + 0x0033f406, // n0x1188 c0x0000 (---------------) + I ranzan + 0x002e7f47, // n0x1189 c0x0000 (---------------) + I ryokami + 0x002d9247, // n0x118a c0x0000 (---------------) + I saitama + 0x002458c6, // n0x118b c0x0000 (---------------) + I sakado + 0x002cc385, // n0x118c c0x0000 (---------------) + I satte + 0x0029ad86, // n0x118d c0x0000 (---------------) + I sayama + 0x002aaa05, // n0x118e c0x0000 (---------------) + I shiki + 0x00306048, // n0x118f c0x0000 (---------------) + I shiraoka + 0x002e22c4, // n0x1190 c0x0000 (---------------) + I soka + 0x002bfdc6, // n0x1191 c0x0000 (---------------) + I sugito + 0x00265904, // n0x1192 c0x0000 (---------------) + I toda + 0x00222908, // n0x1193 c0x0000 (---------------) + I tokigawa + 0x0038584a, // n0x1194 c0x0000 (---------------) + I tokorozawa + 0x0027b9cc, // n0x1195 c0x0000 (---------------) + I tsurugashima + 0x0020b6c5, // n0x1196 c0x0000 (---------------) + I urawa + 0x00203906, // n0x1197 c0x0000 (---------------) + I warabi + 0x0026eb46, // n0x1198 c0x0000 (---------------) + I yashio + 0x002296c6, // n0x1199 c0x0000 (---------------) + I yokoze + 0x002ff684, // n0x119a c0x0000 (---------------) + I yono + 0x00320c45, // n0x119b c0x0000 (---------------) + I yorii + 0x0027c347, // n0x119c c0x0000 (---------------) + I yoshida + 0x0029c4c9, // n0x119d c0x0000 (---------------) + I yoshikawa + 0x002a42c7, // n0x119e c0x0000 (---------------) + I yoshimi + 0x00686744, // n0x119f c0x0001 (---------------) ! I city + 0x00686744, // n0x11a0 c0x0001 (---------------) ! I city + 0x0030bd05, // n0x11a1 c0x0000 (---------------) + I aisho + 0x00228e04, // n0x11a2 c0x0000 (---------------) + I gamo + 0x0029a44a, // n0x11a3 c0x0000 (---------------) + I higashiomi + 0x00278106, // n0x11a4 c0x0000 (---------------) + I hikone + 0x0034cd44, // n0x11a5 c0x0000 (---------------) + I koka + 0x00206b85, // n0x11a6 c0x0000 (---------------) + I konan + 0x002fb505, // n0x11a7 c0x0000 (---------------) + I kosei + 0x00301bc4, // n0x11a8 c0x0000 (---------------) + I koto + 0x002828c7, // n0x11a9 c0x0000 (---------------) + I kusatsu + 0x0020c0c7, // n0x11aa c0x0000 (---------------) + I maibara + 0x002c60c8, // n0x11ab c0x0000 (---------------) + I moriyama + 0x0025e648, // n0x11ac c0x0000 (---------------) + I nagahama + 0x00211809, // n0x11ad c0x0000 (---------------) + I nishiazai + 0x0025ae88, // n0x11ae c0x0000 (---------------) + I notogawa + 0x0029a60b, // n0x11af c0x0000 (---------------) + I omihachiman + 0x0021f304, // n0x11b0 c0x0000 (---------------) + I otsu + 0x00337145, // n0x11b1 c0x0000 (---------------) + I ritto + 0x0027f545, // n0x11b2 c0x0000 (---------------) + I ryuoh + 0x002a8a09, // n0x11b3 c0x0000 (---------------) + I takashima + 0x00305b89, // n0x11b4 c0x0000 (---------------) + I takatsuki + 0x002fe2c8, // n0x11b5 c0x0000 (---------------) + I torahime + 0x0025b488, // n0x11b6 c0x0000 (---------------) + I toyosato + 0x00280644, // n0x11b7 c0x0000 (---------------) + I yasu + 0x002a0b85, // n0x11b8 c0x0000 (---------------) + I akagi + 0x00201883, // n0x11b9 c0x0000 (---------------) + I ama + 0x0021f2c5, // n0x11ba c0x0000 (---------------) + I gotsu + 0x002da386, // n0x11bb c0x0000 (---------------) + I hamada + 0x00293f8c, // n0x11bc c0x0000 (---------------) + I higashiizumo + 0x0021a546, // n0x11bd c0x0000 (---------------) + I hikawa + 0x002d7a86, // n0x11be c0x0000 (---------------) + I hikimi + 0x00294145, // n0x11bf c0x0000 (---------------) + I izumo + 0x00318688, // n0x11c0 c0x0000 (---------------) + I kakinoki + 0x002b1c46, // n0x11c1 c0x0000 (---------------) + I masuda + 0x0039fe86, // n0x11c2 c0x0000 (---------------) + I matsue + 0x0022f486, // n0x11c3 c0x0000 (---------------) + I misato + 0x0022058c, // n0x11c4 c0x0000 (---------------) + I nishinoshima + 0x002b7044, // n0x11c5 c0x0000 (---------------) + I ohda + 0x002e4c4a, // n0x11c6 c0x0000 (---------------) + I okinoshima + 0x003a1e08, // n0x11c7 c0x0000 (---------------) + I okuizumo + 0x00293dc7, // n0x11c8 c0x0000 (---------------) + I shimane + 0x0024e7c6, // n0x11c9 c0x0000 (---------------) + I tamayu + 0x00292f07, // n0x11ca c0x0000 (---------------) + I tsuwano + 0x002e0845, // n0x11cb c0x0000 (---------------) + I unnan + 0x00325346, // n0x11cc c0x0000 (---------------) + I yakumo + 0x0034fa06, // n0x11cd c0x0000 (---------------) + I yasugi + 0x00377bc7, // n0x11ce c0x0000 (---------------) + I yatsuka + 0x002b3244, // n0x11cf c0x0000 (---------------) + I arai + 0x002305c5, // n0x11d0 c0x0000 (---------------) + I atami + 0x00277c04, // n0x11d1 c0x0000 (---------------) + I fuji + 0x002a5807, // n0x11d2 c0x0000 (---------------) + I fujieda + 0x00277e48, // n0x11d3 c0x0000 (---------------) + I fujikawa + 0x002789ca, // n0x11d4 c0x0000 (---------------) + I fujinomiya + 0x0027ed47, // n0x11d5 c0x0000 (---------------) + I fukuroi + 0x00242cc7, // n0x11d6 c0x0000 (---------------) + I gotemba + 0x002c1a47, // n0x11d7 c0x0000 (---------------) + I haibara + 0x002d0ac9, // n0x11d8 c0x0000 (---------------) + I hamamatsu + 0x00293f8a, // n0x11d9 c0x0000 (---------------) + I higashiizu + 0x00228083, // n0x11da c0x0000 (---------------) + I ito + 0x00351b45, // n0x11db c0x0000 (---------------) + I iwata + 0x00212583, // n0x11dc c0x0000 (---------------) + I izu + 0x00342449, // n0x11dd c0x0000 (---------------) + I izunokuni + 0x002b9588, // n0x11de c0x0000 (---------------) + I kakegawa + 0x003061c7, // n0x11df c0x0000 (---------------) + I kannami + 0x002e8109, // n0x11e0 c0x0000 (---------------) + I kawanehon + 0x0021a5c6, // n0x11e1 c0x0000 (---------------) + I kawazu + 0x003a3c08, // n0x11e2 c0x0000 (---------------) + I kikugawa + 0x002d8745, // n0x11e3 c0x0000 (---------------) + I kosai + 0x0035674a, // n0x11e4 c0x0000 (---------------) + I makinohara + 0x002cf149, // n0x11e5 c0x0000 (---------------) + I matsuzaki + 0x0026e649, // n0x11e6 c0x0000 (---------------) + I minamiizu + 0x002bf3c7, // n0x11e7 c0x0000 (---------------) + I mishima + 0x002a8cc9, // n0x11e8 c0x0000 (---------------) + I morimachi + 0x00212448, // n0x11e9 c0x0000 (---------------) + I nishiizu + 0x002ee946, // n0x11ea c0x0000 (---------------) + I numazu + 0x0037e948, // n0x11eb c0x0000 (---------------) + I omaezaki + 0x00212e87, // n0x11ec c0x0000 (---------------) + I shimada + 0x002281c7, // n0x11ed c0x0000 (---------------) + I shimizu + 0x002c5e87, // n0x11ee c0x0000 (---------------) + I shimoda + 0x002b2608, // n0x11ef c0x0000 (---------------) + I shizuoka + 0x002ee646, // n0x11f0 c0x0000 (---------------) + I susono + 0x00245385, // n0x11f1 c0x0000 (---------------) + I yaizu + 0x0027c347, // n0x11f2 c0x0000 (---------------) + I yoshida + 0x00295488, // n0x11f3 c0x0000 (---------------) + I ashikaga + 0x00344d84, // n0x11f4 c0x0000 (---------------) + I bato + 0x0034ac04, // n0x11f5 c0x0000 (---------------) + I haga + 0x002fddc7, // n0x11f6 c0x0000 (---------------) + I ichikai + 0x002ac347, // n0x11f7 c0x0000 (---------------) + I iwafune + 0x002bdaca, // n0x11f8 c0x0000 (---------------) + I kaminokawa + 0x002ee8c6, // n0x11f9 c0x0000 (---------------) + I kanuma + 0x002fa28a, // n0x11fa c0x0000 (---------------) + I karasuyama + 0x002b8547, // n0x11fb c0x0000 (---------------) + I kuroiso + 0x0030b847, // n0x11fc c0x0000 (---------------) + I mashiko + 0x00241044, // n0x11fd c0x0000 (---------------) + I mibu + 0x00263904, // n0x11fe c0x0000 (---------------) + I moka + 0x00226bc6, // n0x11ff c0x0000 (---------------) + I motegi + 0x002ec144, // n0x1200 c0x0000 (---------------) + I nasu + 0x002ec14c, // n0x1201 c0x0000 (---------------) + I nasushiobara + 0x00203185, // n0x1202 c0x0000 (---------------) + I nikko + 0x00216889, // n0x1203 c0x0000 (---------------) + I nishikata + 0x00279884, // n0x1204 c0x0000 (---------------) + I nogi + 0x0029ef85, // n0x1205 c0x0000 (---------------) + I ohira + 0x00278448, // n0x1206 c0x0000 (---------------) + I ohtawara + 0x00250045, // n0x1207 c0x0000 (---------------) + I oyama + 0x00307fc6, // n0x1208 c0x0000 (---------------) + I sakura + 0x0020f744, // n0x1209 c0x0000 (---------------) + I sano + 0x0027e58a, // n0x120a c0x0000 (---------------) + I shimotsuke + 0x002a7c86, // n0x120b c0x0000 (---------------) + I shioya + 0x002579ca, // n0x120c c0x0000 (---------------) + I takanezawa + 0x00344e07, // n0x120d c0x0000 (---------------) + I tochigi + 0x00297645, // n0x120e c0x0000 (---------------) + I tsuga + 0x0021c2c5, // n0x120f c0x0000 (---------------) + I ujiie + 0x0036b7ca, // n0x1210 c0x0000 (---------------) + I utsunomiya + 0x002a0605, // n0x1211 c0x0000 (---------------) + I yaita + 0x0029eb86, // n0x1212 c0x0000 (---------------) + I aizumi + 0x00206d04, // n0x1213 c0x0000 (---------------) + I anan + 0x002add06, // n0x1214 c0x0000 (---------------) + I ichiba + 0x00229b05, // n0x1215 c0x0000 (---------------) + I itano + 0x00223206, // n0x1216 c0x0000 (---------------) + I kainan + 0x002aa70c, // n0x1217 c0x0000 (---------------) + I komatsushima + 0x002c704a, // n0x1218 c0x0000 (---------------) + I matsushige + 0x0027f904, // n0x1219 c0x0000 (---------------) + I mima + 0x00228406, // n0x121a c0x0000 (---------------) + I minami + 0x0029c447, // n0x121b c0x0000 (---------------) + I miyoshi + 0x002ca384, // n0x121c c0x0000 (---------------) + I mugi + 0x002ac8c8, // n0x121d c0x0000 (---------------) + I nakagawa + 0x00385746, // n0x121e c0x0000 (---------------) + I naruto + 0x00248649, // n0x121f c0x0000 (---------------) + I sanagochi + 0x002ad349, // n0x1220 c0x0000 (---------------) + I shishikui + 0x00299fc9, // n0x1221 c0x0000 (---------------) + I tokushima + 0x0036aa46, // n0x1222 c0x0000 (---------------) + I wajiki + 0x00212f86, // n0x1223 c0x0000 (---------------) + I adachi + 0x0037ea87, // n0x1224 c0x0000 (---------------) + I akiruno + 0x002ec888, // n0x1225 c0x0000 (---------------) + I akishima + 0x00212d89, // n0x1226 c0x0000 (---------------) + I aogashima + 0x0039f707, // n0x1227 c0x0000 (---------------) + I arakawa + 0x002b4186, // n0x1228 c0x0000 (---------------) + I bunkyo + 0x003005c7, // n0x1229 c0x0000 (---------------) + I chiyoda + 0x002db1c5, // n0x122a c0x0000 (---------------) + I chofu + 0x0030ba84, // n0x122b c0x0000 (---------------) + I chuo + 0x0037e647, // n0x122c c0x0000 (---------------) + I edogawa + 0x002bc1c5, // n0x122d c0x0000 (---------------) + I fuchu + 0x00286e85, // n0x122e c0x0000 (---------------) + I fussa + 0x002fc5c7, // n0x122f c0x0000 (---------------) + I hachijo + 0x0024f248, // n0x1230 c0x0000 (---------------) + I hachioji + 0x003831c6, // n0x1231 c0x0000 (---------------) + I hamura + 0x0029680d, // n0x1232 c0x0000 (---------------) + I higashikurume + 0x0029888f, // n0x1233 c0x0000 (---------------) + I higashimurayama + 0x0029d84d, // n0x1234 c0x0000 (---------------) + I higashiyamato + 0x0020dbc4, // n0x1235 c0x0000 (---------------) + I hino + 0x0023ba06, // n0x1236 c0x0000 (---------------) + I hinode + 0x002cfa08, // n0x1237 c0x0000 (---------------) + I hinohara + 0x003255c5, // n0x1238 c0x0000 (---------------) + I inagi + 0x00280008, // n0x1239 c0x0000 (---------------) + I itabashi + 0x0021ae8a, // n0x123a c0x0000 (---------------) + I katsushika + 0x00201e04, // n0x123b c0x0000 (---------------) + I kita + 0x002aaac6, // n0x123c c0x0000 (---------------) + I kiyose + 0x0039c647, // n0x123d c0x0000 (---------------) + I kodaira + 0x00226307, // n0x123e c0x0000 (---------------) + I koganei + 0x002a0d89, // n0x123f c0x0000 (---------------) + I kokubunji + 0x0037e905, // n0x1240 c0x0000 (---------------) + I komae + 0x00301bc4, // n0x1241 c0x0000 (---------------) + I koto + 0x0032a78a, // n0x1242 c0x0000 (---------------) + I kouzushima + 0x002b3009, // n0x1243 c0x0000 (---------------) + I kunitachi + 0x002a8dc7, // n0x1244 c0x0000 (---------------) + I machida + 0x00296ac6, // n0x1245 c0x0000 (---------------) + I meguro + 0x0034cb46, // n0x1246 c0x0000 (---------------) + I minato + 0x002a0ac6, // n0x1247 c0x0000 (---------------) + I mitaka + 0x0035e106, // n0x1248 c0x0000 (---------------) + I mizuho + 0x002cee0f, // n0x1249 c0x0000 (---------------) + I musashimurayama + 0x002cf8c9, // n0x124a c0x0000 (---------------) + I musashino + 0x002546c6, // n0x124b c0x0000 (---------------) + I nakano + 0x00256d06, // n0x124c c0x0000 (---------------) + I nerima + 0x00355a09, // n0x124d c0x0000 (---------------) + I ogasawara + 0x00303707, // n0x124e c0x0000 (---------------) + I okutama + 0x00213a83, // n0x124f c0x0000 (---------------) + I ome + 0x0020ef06, // n0x1250 c0x0000 (---------------) + I oshima + 0x00204083, // n0x1251 c0x0000 (---------------) + I ota + 0x0024cf48, // n0x1252 c0x0000 (---------------) + I setagaya + 0x00300407, // n0x1253 c0x0000 (---------------) + I shibuya + 0x0029f1c9, // n0x1254 c0x0000 (---------------) + I shinagawa + 0x00383608, // n0x1255 c0x0000 (---------------) + I shinjuku + 0x00377e48, // n0x1256 c0x0000 (---------------) + I suginami + 0x0036e146, // n0x1257 c0x0000 (---------------) + I sumida + 0x00223909, // n0x1258 c0x0000 (---------------) + I tachikawa + 0x002400c5, // n0x1259 c0x0000 (---------------) + I taito + 0x0024e7c4, // n0x125a c0x0000 (---------------) + I tama + 0x0024aec7, // n0x125b c0x0000 (---------------) + I toshima + 0x00257085, // n0x125c c0x0000 (---------------) + I chizu + 0x0020dbc4, // n0x125d c0x0000 (---------------) + I hino + 0x00248ac8, // n0x125e c0x0000 (---------------) + I kawahara + 0x002180c4, // n0x125f c0x0000 (---------------) + I koge + 0x00301bc7, // n0x1260 c0x0000 (---------------) + I kotoura + 0x0036fc86, // n0x1261 c0x0000 (---------------) + I misasa + 0x002e5a85, // n0x1262 c0x0000 (---------------) + I nanbu + 0x002869c8, // n0x1263 c0x0000 (---------------) + I nichinan + 0x0034ca0b, // n0x1264 c0x0000 (---------------) + I sakaiminato + 0x002f8b87, // n0x1265 c0x0000 (---------------) + I tottori + 0x0036ba46, // n0x1266 c0x0000 (---------------) + I wakasa + 0x002c0c84, // n0x1267 c0x0000 (---------------) + I yazu + 0x0030f5c6, // n0x1268 c0x0000 (---------------) + I yonago + 0x002bf185, // n0x1269 c0x0000 (---------------) + I asahi + 0x002bc1c5, // n0x126a c0x0000 (---------------) + I fuchu + 0x0027dfc9, // n0x126b c0x0000 (---------------) + I fukumitsu + 0x002824c9, // n0x126c c0x0000 (---------------) + I funahashi + 0x00228204, // n0x126d c0x0000 (---------------) + I himi + 0x00228245, // n0x126e c0x0000 (---------------) + I imizu + 0x00228445, // n0x126f c0x0000 (---------------) + I inami + 0x003565c6, // n0x1270 c0x0000 (---------------) + I johana + 0x002fdcc8, // n0x1271 c0x0000 (---------------) + I kamiichi + 0x002b7bc6, // n0x1272 c0x0000 (---------------) + I kurobe + 0x00330c8b, // n0x1273 c0x0000 (---------------) + I nakaniikawa + 0x0030138a, // n0x1274 c0x0000 (---------------) + I namerikawa + 0x00342185, // n0x1275 c0x0000 (---------------) + I nanto + 0x0028a886, // n0x1276 c0x0000 (---------------) + I nyuzen + 0x002f5985, // n0x1277 c0x0000 (---------------) + I oyabe + 0x00218d45, // n0x1278 c0x0000 (---------------) + I taira + 0x0028ed47, // n0x1279 c0x0000 (---------------) + I takaoka + 0x002040c8, // n0x127a c0x0000 (---------------) + I tateyama + 0x0025af04, // n0x127b c0x0000 (---------------) + I toga + 0x002b6586, // n0x127c c0x0000 (---------------) + I tonami + 0x0028e9c6, // n0x127d c0x0000 (---------------) + I toyama + 0x00212607, // n0x127e c0x0000 (---------------) + I unazuki + 0x00300a04, // n0x127f c0x0000 (---------------) + I uozu + 0x0027ce46, // n0x1280 c0x0000 (---------------) + I yamada + 0x0023ec85, // n0x1281 c0x0000 (---------------) + I arida + 0x0023ec89, // n0x1282 c0x0000 (---------------) + I aridagawa + 0x00213184, // n0x1283 c0x0000 (---------------) + I gobo + 0x0028e009, // n0x1284 c0x0000 (---------------) + I hashimoto + 0x0027ab86, // n0x1285 c0x0000 (---------------) + I hidaka + 0x002b9ac8, // n0x1286 c0x0000 (---------------) + I hirogawa + 0x00228445, // n0x1287 c0x0000 (---------------) + I inami + 0x00311e85, // n0x1288 c0x0000 (---------------) + I iwade + 0x00223206, // n0x1289 c0x0000 (---------------) + I kainan + 0x0026e889, // n0x128a c0x0000 (---------------) + I kamitonda + 0x00219349, // n0x128b c0x0000 (---------------) + I katsuragi + 0x002d7b06, // n0x128c c0x0000 (---------------) + I kimino + 0x0026b6c8, // n0x128d c0x0000 (---------------) + I kinokawa + 0x00267988, // n0x128e c0x0000 (---------------) + I kitayama + 0x002f5944, // n0x128f c0x0000 (---------------) + I koya + 0x0032dcc4, // n0x1290 c0x0000 (---------------) + I koza + 0x0032dcc8, // n0x1291 c0x0000 (---------------) + I kozagawa + 0x00316788, // n0x1292 c0x0000 (---------------) + I kudoyama + 0x002ae8c9, // n0x1293 c0x0000 (---------------) + I kushimoto + 0x002da306, // n0x1294 c0x0000 (---------------) + I mihama + 0x0022f486, // n0x1295 c0x0000 (---------------) + I misato + 0x0031408d, // n0x1296 c0x0000 (---------------) + I nachikatsuura + 0x00266d06, // n0x1297 c0x0000 (---------------) + I shingu + 0x002a9a49, // n0x1298 c0x0000 (---------------) + I shirahama + 0x00201685, // n0x1299 c0x0000 (---------------) + I taiji + 0x0031f386, // n0x129a c0x0000 (---------------) + I tanabe + 0x00223ac8, // n0x129b c0x0000 (---------------) + I wakayama + 0x00310745, // n0x129c c0x0000 (---------------) + I yuasa + 0x0036adc4, // n0x129d c0x0000 (---------------) + I yura + 0x002bf185, // n0x129e c0x0000 (---------------) + I asahi + 0x00281b48, // n0x129f c0x0000 (---------------) + I funagata + 0x0029a209, // n0x12a0 c0x0000 (---------------) + I higashine + 0x00277cc4, // n0x12a1 c0x0000 (---------------) + I iide + 0x0033d046, // n0x12a2 c0x0000 (---------------) + I kahoku + 0x0024ff0a, // n0x12a3 c0x0000 (---------------) + I kaminoyama + 0x002c7848, // n0x12a4 c0x0000 (---------------) + I kaneyama + 0x002bdc49, // n0x12a5 c0x0000 (---------------) + I kawanishi + 0x0029378a, // n0x12a6 c0x0000 (---------------) + I mamurogawa + 0x002e8086, // n0x12a7 c0x0000 (---------------) + I mikawa + 0x00298a48, // n0x12a8 c0x0000 (---------------) + I murayama + 0x002cdc45, // n0x12a9 c0x0000 (---------------) + I nagai + 0x002c9e08, // n0x12aa c0x0000 (---------------) + I nakayama + 0x002b1ec5, // n0x12ab c0x0000 (---------------) + I nanyo + 0x0021a489, // n0x12ac c0x0000 (---------------) + I nishikawa + 0x00361849, // n0x12ad c0x0000 (---------------) + I obanazawa + 0x00203282, // n0x12ae c0x0000 (---------------) + I oe + 0x002a6a45, // n0x12af c0x0000 (---------------) + I oguni + 0x0026f6c6, // n0x12b0 c0x0000 (---------------) + I ohkura + 0x0027aac7, // n0x12b1 c0x0000 (---------------) + I oishida + 0x00238905, // n0x12b2 c0x0000 (---------------) + I sagae + 0x002f8486, // n0x12b3 c0x0000 (---------------) + I sakata + 0x00310808, // n0x12b4 c0x0000 (---------------) + I sakegawa + 0x0033bd46, // n0x12b5 c0x0000 (---------------) + I shinjo + 0x00347f09, // n0x12b6 c0x0000 (---------------) + I shirataka + 0x002792c6, // n0x12b7 c0x0000 (---------------) + I shonai + 0x00281cc8, // n0x12b8 c0x0000 (---------------) + I takahata + 0x002a94c5, // n0x12b9 c0x0000 (---------------) + I tendo + 0x0026de86, // n0x12ba c0x0000 (---------------) + I tozawa + 0x0032f7c8, // n0x12bb c0x0000 (---------------) + I tsuruoka + 0x002808c8, // n0x12bc c0x0000 (---------------) + I yamagata + 0x0039e808, // n0x12bd c0x0000 (---------------) + I yamanobe + 0x00366688, // n0x12be c0x0000 (---------------) + I yonezawa + 0x00217244, // n0x12bf c0x0000 (---------------) + I yuza + 0x0022d843, // n0x12c0 c0x0000 (---------------) + I abu + 0x00348144, // n0x12c1 c0x0000 (---------------) + I hagi + 0x0022f006, // n0x12c2 c0x0000 (---------------) + I hikari + 0x002db204, // n0x12c3 c0x0000 (---------------) + I hofu + 0x002da0c7, // n0x12c4 c0x0000 (---------------) + I iwakuni + 0x0039fd89, // n0x12c5 c0x0000 (---------------) + I kudamatsu + 0x002c0485, // n0x12c6 c0x0000 (---------------) + I mitou + 0x0038e086, // n0x12c7 c0x0000 (---------------) + I nagato + 0x0020ef06, // n0x12c8 c0x0000 (---------------) + I oshima + 0x0026c3cb, // n0x12c9 c0x0000 (---------------) + I shimonoseki + 0x003420c6, // n0x12ca c0x0000 (---------------) + I shunan + 0x00316a86, // n0x12cb c0x0000 (---------------) + I tabuse + 0x0022f588, // n0x12cc c0x0000 (---------------) + I tokuyama + 0x0025bb86, // n0x12cd c0x0000 (---------------) + I toyota + 0x00297443, // n0x12ce c0x0000 (---------------) + I ube + 0x0020f9c3, // n0x12cf c0x0000 (---------------) + I yuu + 0x0030ba84, // n0x12d0 c0x0000 (---------------) + I chuo + 0x00236305, // n0x12d1 c0x0000 (---------------) + I doshi + 0x0036af47, // n0x12d2 c0x0000 (---------------) + I fuefuki + 0x00277e48, // n0x12d3 c0x0000 (---------------) + I fujikawa + 0x00277e4f, // n0x12d4 c0x0000 (---------------) + I fujikawaguchiko + 0x0027c24b, // n0x12d5 c0x0000 (---------------) + I fujiyoshida + 0x002fdac8, // n0x12d6 c0x0000 (---------------) + I hayakawa + 0x0033d0c6, // n0x12d7 c0x0000 (---------------) + I hokuto + 0x0026560e, // n0x12d8 c0x0000 (---------------) + I ichikawamisato + 0x00223203, // n0x12d9 c0x0000 (---------------) + I kai + 0x00240c84, // n0x12da c0x0000 (---------------) + I kofu + 0x00342045, // n0x12db c0x0000 (---------------) + I koshu + 0x00300146, // n0x12dc c0x0000 (---------------) + I kosuge + 0x0028bc0b, // n0x12dd c0x0000 (---------------) + I minami-alps + 0x00290086, // n0x12de c0x0000 (---------------) + I minobu + 0x002164c9, // n0x12df c0x0000 (---------------) + I nakamichi + 0x002e5a85, // n0x12e0 c0x0000 (---------------) + I nanbu + 0x00381e08, // n0x12e1 c0x0000 (---------------) + I narusawa + 0x0020c388, // n0x12e2 c0x0000 (---------------) + I nirasaki + 0x0021920c, // n0x12e3 c0x0000 (---------------) + I nishikatsura + 0x0029e5c6, // n0x12e4 c0x0000 (---------------) + I oshino + 0x0021f306, // n0x12e5 c0x0000 (---------------) + I otsuki + 0x00319905, // n0x12e6 c0x0000 (---------------) + I showa + 0x002872c8, // n0x12e7 c0x0000 (---------------) + I tabayama + 0x0027b9c5, // n0x12e8 c0x0000 (---------------) + I tsuru + 0x00387308, // n0x12e9 c0x0000 (---------------) + I uenohara + 0x0029dc8a, // n0x12ea c0x0000 (---------------) + I yamanakako + 0x002a15c9, // n0x12eb c0x0000 (---------------) + I yamanashi + 0x00686744, // n0x12ec c0x0001 (---------------) ! I city + 0x2e200742, // n0x12ed c0x00b8 (n0x12ee-n0x12ef) o I co + 0x000ffa08, // n0x12ee c0x0000 (---------------) + blogspot + 0x00233503, // n0x12ef c0x0000 (---------------) + I com + 0x0023a783, // n0x12f0 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x12f1 c0x0000 (---------------) + I gov + 0x00209003, // n0x12f2 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x12f3 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x12f4 c0x0000 (---------------) + I org + 0x00330b83, // n0x12f5 c0x0000 (---------------) + I biz + 0x00233503, // n0x12f6 c0x0000 (---------------) + I com + 0x0023a783, // n0x12f7 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x12f8 c0x0000 (---------------) + I gov + 0x003a1244, // n0x12f9 c0x0000 (---------------) + I info + 0x0021fe03, // n0x12fa c0x0000 (---------------) + I net + 0x0022d1c3, // n0x12fb c0x0000 (---------------) + I org + 0x0023f743, // n0x12fc c0x0000 (---------------) + I ass + 0x002d4884, // n0x12fd c0x0000 (---------------) + I asso + 0x00233503, // n0x12fe c0x0000 (---------------) + I com + 0x0023d684, // n0x12ff c0x0000 (---------------) + I coop + 0x0023a783, // n0x1300 c0x0000 (---------------) + I edu + 0x0033d7c4, // n0x1301 c0x0000 (---------------) + I gouv + 0x0026cc83, // n0x1302 c0x0000 (---------------) + I gov + 0x00238bc7, // n0x1303 c0x0000 (---------------) + I medecin + 0x00209003, // n0x1304 c0x0000 (---------------) + I mil + 0x00201483, // n0x1305 c0x0000 (---------------) + I nom + 0x0025c988, // n0x1306 c0x0000 (---------------) + I notaires + 0x0022d1c3, // n0x1307 c0x0000 (---------------) + I org + 0x0034d60b, // n0x1308 c0x0000 (---------------) + I pharmaciens + 0x002e1043, // n0x1309 c0x0000 (---------------) + I prd + 0x00247506, // n0x130a c0x0000 (---------------) + I presse + 0x00200142, // n0x130b c0x0000 (---------------) + I tm + 0x002d1c8b, // n0x130c c0x0000 (---------------) + I veterinaire + 0x0023a783, // n0x130d c0x0000 (---------------) + I edu + 0x0026cc83, // n0x130e c0x0000 (---------------) + I gov + 0x0021fe03, // n0x130f c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1310 c0x0000 (---------------) + I org + 0x00233503, // n0x1311 c0x0000 (---------------) + I com + 0x0023a783, // n0x1312 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1313 c0x0000 (---------------) + I gov + 0x0022d1c3, // n0x1314 c0x0000 (---------------) + I org + 0x0022b7c3, // n0x1315 c0x0000 (---------------) + I rep + 0x00203003, // n0x1316 c0x0000 (---------------) + I tra + 0x00201542, // n0x1317 c0x0000 (---------------) + I ac + 0x000ffa08, // n0x1318 c0x0000 (---------------) + blogspot + 0x0022b945, // n0x1319 c0x0000 (---------------) + I busan + 0x003051c8, // n0x131a c0x0000 (---------------) + I chungbuk + 0x003113c8, // n0x131b c0x0000 (---------------) + I chungnam + 0x00200742, // n0x131c c0x0000 (---------------) + I co + 0x0024a3c5, // n0x131d c0x0000 (---------------) + I daegu + 0x00325007, // n0x131e c0x0000 (---------------) + I daejeon + 0x00200482, // n0x131f c0x0000 (---------------) + I es + 0x00216707, // n0x1320 c0x0000 (---------------) + I gangwon + 0x00202d42, // n0x1321 c0x0000 (---------------) + I go + 0x00242707, // n0x1322 c0x0000 (---------------) + I gwangju + 0x0030b509, // n0x1323 c0x0000 (---------------) + I gyeongbuk + 0x002cd808, // n0x1324 c0x0000 (---------------) + I gyeonggi + 0x00208209, // n0x1325 c0x0000 (---------------) + I gyeongnam + 0x0023f382, // n0x1326 c0x0000 (---------------) + I hs + 0x00268e07, // n0x1327 c0x0000 (---------------) + I incheon + 0x002d7884, // n0x1328 c0x0000 (---------------) + I jeju + 0x003250c7, // n0x1329 c0x0000 (---------------) + I jeonbuk + 0x00301287, // n0x132a c0x0000 (---------------) + I jeonnam + 0x002b5502, // n0x132b c0x0000 (---------------) + I kg + 0x00209003, // n0x132c c0x0000 (---------------) + I mil + 0x0020f702, // n0x132d c0x0000 (---------------) + I ms + 0x00202c02, // n0x132e c0x0000 (---------------) + I ne + 0x00200282, // n0x132f c0x0000 (---------------) + I or + 0x00207782, // n0x1330 c0x0000 (---------------) + I pe + 0x00207002, // n0x1331 c0x0000 (---------------) + I re + 0x00200702, // n0x1332 c0x0000 (---------------) + I sc + 0x00344345, // n0x1333 c0x0000 (---------------) + I seoul + 0x00259585, // n0x1334 c0x0000 (---------------) + I ulsan + 0x00233503, // n0x1335 c0x0000 (---------------) + I com + 0x0023a783, // n0x1336 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1337 c0x0000 (---------------) + I gov + 0x0021fe03, // n0x1338 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1339 c0x0000 (---------------) + I org + 0x00233503, // n0x133a c0x0000 (---------------) + I com + 0x0023a783, // n0x133b c0x0000 (---------------) + I edu + 0x0026cc83, // n0x133c c0x0000 (---------------) + I gov + 0x00209003, // n0x133d c0x0000 (---------------) + I mil + 0x0021fe03, // n0x133e c0x0000 (---------------) + I net + 0x0022d1c3, // n0x133f c0x0000 (---------------) + I org + 0x00000301, // n0x1340 c0x0000 (---------------) + c + 0x00233503, // n0x1341 c0x0000 (---------------) + I com + 0x0023a783, // n0x1342 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1343 c0x0000 (---------------) + I gov + 0x003a1244, // n0x1344 c0x0000 (---------------) + I info + 0x00201603, // n0x1345 c0x0000 (---------------) + I int + 0x0021fe03, // n0x1346 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1347 c0x0000 (---------------) + I org + 0x00220f03, // n0x1348 c0x0000 (---------------) + I per + 0x00233503, // n0x1349 c0x0000 (---------------) + I com + 0x0023a783, // n0x134a c0x0000 (---------------) + I edu + 0x0026cc83, // n0x134b c0x0000 (---------------) + I gov + 0x0021fe03, // n0x134c c0x0000 (---------------) + I net + 0x0022d1c3, // n0x134d c0x0000 (---------------) + I org + 0x00200742, // n0x134e c0x0000 (---------------) + I co + 0x00233503, // n0x134f c0x0000 (---------------) + I com + 0x0023a783, // n0x1350 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1351 c0x0000 (---------------) + I gov + 0x0021fe03, // n0x1352 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1353 c0x0000 (---------------) + I org + 0x000ffa08, // n0x1354 c0x0000 (---------------) + blogspot + 0x00201542, // n0x1355 c0x0000 (---------------) + I ac + 0x002bad84, // n0x1356 c0x0000 (---------------) + I assn + 0x00233503, // n0x1357 c0x0000 (---------------) + I com + 0x0023a783, // n0x1358 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1359 c0x0000 (---------------) + I gov + 0x00379ec3, // n0x135a c0x0000 (---------------) + I grp + 0x00234dc5, // n0x135b c0x0000 (---------------) + I hotel + 0x00201603, // n0x135c c0x0000 (---------------) + I int + 0x00322cc3, // n0x135d c0x0000 (---------------) + I ltd + 0x0021fe03, // n0x135e c0x0000 (---------------) + I net + 0x00202d03, // n0x135f c0x0000 (---------------) + I ngo + 0x0022d1c3, // n0x1360 c0x0000 (---------------) + I org + 0x00217443, // n0x1361 c0x0000 (---------------) + I sch + 0x00274803, // n0x1362 c0x0000 (---------------) + I soc + 0x00221a03, // n0x1363 c0x0000 (---------------) + I web + 0x00233503, // n0x1364 c0x0000 (---------------) + I com + 0x0023a783, // n0x1365 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1366 c0x0000 (---------------) + I gov + 0x0021fe03, // n0x1367 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1368 c0x0000 (---------------) + I org + 0x00200742, // n0x1369 c0x0000 (---------------) + I co + 0x0022d1c3, // n0x136a c0x0000 (---------------) + I org + 0x000ffa08, // n0x136b c0x0000 (---------------) + blogspot + 0x0026cc83, // n0x136c c0x0000 (---------------) + I gov + 0x000ffa08, // n0x136d c0x0000 (---------------) + blogspot + 0x002afc83, // n0x136e c0x0000 (---------------) + I asn + 0x00233503, // n0x136f c0x0000 (---------------) + I com + 0x00236cc4, // n0x1370 c0x0000 (---------------) + I conf + 0x0023a783, // n0x1371 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1372 c0x0000 (---------------) + I gov + 0x0020c782, // n0x1373 c0x0000 (---------------) + I id + 0x00209003, // n0x1374 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x1375 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1376 c0x0000 (---------------) + I org + 0x00233503, // n0x1377 c0x0000 (---------------) + I com + 0x0023a783, // n0x1378 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1379 c0x0000 (---------------) + I gov + 0x0020c782, // n0x137a c0x0000 (---------------) + I id + 0x00213ac3, // n0x137b c0x0000 (---------------) + I med + 0x0021fe03, // n0x137c c0x0000 (---------------) + I net + 0x0022d1c3, // n0x137d c0x0000 (---------------) + I org + 0x002db143, // n0x137e c0x0000 (---------------) + I plc + 0x00217443, // n0x137f c0x0000 (---------------) + I sch + 0x00201542, // n0x1380 c0x0000 (---------------) + I ac + 0x00200742, // n0x1381 c0x0000 (---------------) + I co + 0x0026cc83, // n0x1382 c0x0000 (---------------) + I gov + 0x0021fe03, // n0x1383 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1384 c0x0000 (---------------) + I org + 0x00247505, // n0x1385 c0x0000 (---------------) + I press + 0x002d4884, // n0x1386 c0x0000 (---------------) + I asso + 0x00200142, // n0x1387 c0x0000 (---------------) + I tm + 0x000ffa08, // n0x1388 c0x0000 (---------------) + blogspot + 0x00201542, // n0x1389 c0x0000 (---------------) + I ac + 0x00200742, // n0x138a c0x0000 (---------------) + I co + 0x00054d8b, // n0x138b c0x0000 (---------------) + diskstation + 0x00009107, // n0x138c c0x0000 (---------------) + dscloud + 0x0023a783, // n0x138d c0x0000 (---------------) + I edu + 0x0026cc83, // n0x138e c0x0000 (---------------) + I gov + 0x00157b84, // n0x138f c0x0000 (---------------) + i234 + 0x00230483, // n0x1390 c0x0000 (---------------) + I its + 0x00156bc4, // n0x1391 c0x0000 (---------------) + myds + 0x0021fe03, // n0x1392 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1393 c0x0000 (---------------) + I org + 0x002e1c44, // n0x1394 c0x0000 (---------------) + I priv + 0x0010b388, // n0x1395 c0x0000 (---------------) + synology + 0x00200742, // n0x1396 c0x0000 (---------------) + I co + 0x00233503, // n0x1397 c0x0000 (---------------) + I com + 0x0023a783, // n0x1398 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1399 c0x0000 (---------------) + I gov + 0x00209003, // n0x139a c0x0000 (---------------) + I mil + 0x00201483, // n0x139b c0x0000 (---------------) + I nom + 0x0022d1c3, // n0x139c c0x0000 (---------------) + I org + 0x002e1043, // n0x139d c0x0000 (---------------) + I prd + 0x00200142, // n0x139e c0x0000 (---------------) + I tm + 0x000ffa08, // n0x139f c0x0000 (---------------) + blogspot + 0x00233503, // n0x13a0 c0x0000 (---------------) + I com + 0x0023a783, // n0x13a1 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x13a2 c0x0000 (---------------) + I gov + 0x003a1083, // n0x13a3 c0x0000 (---------------) + I inf + 0x00205284, // n0x13a4 c0x0000 (---------------) + I name + 0x0021fe03, // n0x13a5 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x13a6 c0x0000 (---------------) + I org + 0x00233503, // n0x13a7 c0x0000 (---------------) + I com + 0x0023a783, // n0x13a8 c0x0000 (---------------) + I edu + 0x0033d7c4, // n0x13a9 c0x0000 (---------------) + I gouv + 0x0026cc83, // n0x13aa c0x0000 (---------------) + I gov + 0x0021fe03, // n0x13ab c0x0000 (---------------) + I net + 0x0022d1c3, // n0x13ac c0x0000 (---------------) + I org + 0x00247506, // n0x13ad c0x0000 (---------------) + I presse + 0x0023a783, // n0x13ae c0x0000 (---------------) + I edu + 0x0026cc83, // n0x13af c0x0000 (---------------) + I gov + 0x0016ef83, // n0x13b0 c0x0000 (---------------) + nyc + 0x0022d1c3, // n0x13b1 c0x0000 (---------------) + I org + 0x00233503, // n0x13b2 c0x0000 (---------------) + I com + 0x0023a783, // n0x13b3 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x13b4 c0x0000 (---------------) + I gov + 0x0021fe03, // n0x13b5 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x13b6 c0x0000 (---------------) + I org + 0x00009107, // n0x13b7 c0x0000 (---------------) + dscloud + 0x000ffa08, // n0x13b8 c0x0000 (---------------) + blogspot + 0x0026cc83, // n0x13b9 c0x0000 (---------------) + I gov + 0x00233503, // n0x13ba c0x0000 (---------------) + I com + 0x0023a783, // n0x13bb c0x0000 (---------------) + I edu + 0x0026cc83, // n0x13bc c0x0000 (---------------) + I gov + 0x0021fe03, // n0x13bd c0x0000 (---------------) + I net + 0x0022d1c3, // n0x13be c0x0000 (---------------) + I org + 0x36633503, // n0x13bf c0x00d9 (n0x13c3-n0x13c4) + I com + 0x0023a783, // n0x13c0 c0x0000 (---------------) + I edu + 0x0021fe03, // n0x13c1 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x13c2 c0x0000 (---------------) + I org + 0x000ffa08, // n0x13c3 c0x0000 (---------------) + blogspot + 0x00201542, // n0x13c4 c0x0000 (---------------) + I ac + 0x00200742, // n0x13c5 c0x0000 (---------------) + I co + 0x00233503, // n0x13c6 c0x0000 (---------------) + I com + 0x0026cc83, // n0x13c7 c0x0000 (---------------) + I gov + 0x0021fe03, // n0x13c8 c0x0000 (---------------) + I net + 0x00200282, // n0x13c9 c0x0000 (---------------) + I or + 0x0022d1c3, // n0x13ca c0x0000 (---------------) + I org + 0x0030aec7, // n0x13cb c0x0000 (---------------) + I academy + 0x00209c8b, // n0x13cc c0x0000 (---------------) + I agriculture + 0x00204903, // n0x13cd c0x0000 (---------------) + I air + 0x0023b1c8, // n0x13ce c0x0000 (---------------) + I airguard + 0x002ec607, // n0x13cf c0x0000 (---------------) + I alabama + 0x00279bc6, // n0x13d0 c0x0000 (---------------) + I alaska + 0x00367645, // n0x13d1 c0x0000 (---------------) + I amber + 0x002c8609, // n0x13d2 c0x0000 (---------------) + I ambulance + 0x00208d88, // n0x13d3 c0x0000 (---------------) + I american + 0x002729c9, // n0x13d4 c0x0000 (---------------) + I americana + 0x002729d0, // n0x13d5 c0x0000 (---------------) + I americanantiques + 0x0035994b, // n0x13d6 c0x0000 (---------------) + I americanart + 0x002c8449, // n0x13d7 c0x0000 (---------------) + I amsterdam + 0x00200843, // n0x13d8 c0x0000 (---------------) + I and + 0x00357549, // n0x13d9 c0x0000 (---------------) + I annefrank + 0x00237a06, // n0x13da c0x0000 (---------------) + I anthro + 0x00237a0c, // n0x13db c0x0000 (---------------) + I anthropology + 0x0022ba08, // n0x13dc c0x0000 (---------------) + I antiques + 0x003a2308, // n0x13dd c0x0000 (---------------) + I aquarium + 0x00258249, // n0x13de c0x0000 (---------------) + I arboretum + 0x0029fb0e, // n0x13df c0x0000 (---------------) + I archaeological + 0x0037228b, // n0x13e0 c0x0000 (---------------) + I archaeology + 0x0031fa0c, // n0x13e1 c0x0000 (---------------) + I architecture + 0x002011c3, // n0x13e2 c0x0000 (---------------) + I art + 0x003284cc, // n0x13e3 c0x0000 (---------------) + I artanddesign + 0x002043c9, // n0x13e4 c0x0000 (---------------) + I artcenter + 0x0020b107, // n0x13e5 c0x0000 (---------------) + I artdeco + 0x0023a6cc, // n0x13e6 c0x0000 (---------------) + I arteducation + 0x0039208a, // n0x13e7 c0x0000 (---------------) + I artgallery + 0x0024bf84, // n0x13e8 c0x0000 (---------------) + I arts + 0x0039eacd, // n0x13e9 c0x0000 (---------------) + I artsandcrafts + 0x00328388, // n0x13ea c0x0000 (---------------) + I asmatart + 0x0039efcd, // n0x13eb c0x0000 (---------------) + I assassination + 0x00252046, // n0x13ec c0x0000 (---------------) + I assisi + 0x002d488b, // n0x13ed c0x0000 (---------------) + I association + 0x00356a09, // n0x13ee c0x0000 (---------------) + I astronomy + 0x002244c7, // n0x13ef c0x0000 (---------------) + I atlanta + 0x002ea306, // n0x13f0 c0x0000 (---------------) + I austin + 0x003082c9, // n0x13f1 c0x0000 (---------------) + I australia + 0x00322f8a, // n0x13f2 c0x0000 (---------------) + I automotive + 0x0035b848, // n0x13f3 c0x0000 (---------------) + I aviation + 0x002e0b84, // n0x13f4 c0x0000 (---------------) + I axis + 0x00277007, // n0x13f5 c0x0000 (---------------) + I badajoz + 0x002a1847, // n0x13f6 c0x0000 (---------------) + I baghdad + 0x002ec084, // n0x13f7 c0x0000 (---------------) + I bahn + 0x00228a84, // n0x13f8 c0x0000 (---------------) + I bale + 0x0025d289, // n0x13f9 c0x0000 (---------------) + I baltimore + 0x002dd889, // n0x13fa c0x0000 (---------------) + I barcelona + 0x0022f9c8, // n0x13fb c0x0000 (---------------) + I baseball + 0x00210685, // n0x13fc c0x0000 (---------------) + I basel + 0x00389345, // n0x13fd c0x0000 (---------------) + I baths + 0x0020d246, // n0x13fe c0x0000 (---------------) + I bauern + 0x0039e989, // n0x13ff c0x0000 (---------------) + I beauxarts + 0x0021b10d, // n0x1400 c0x0000 (---------------) + I beeldengeluid + 0x0031f488, // n0x1401 c0x0000 (---------------) + I bellevue + 0x0020d147, // n0x1402 c0x0000 (---------------) + I bergbau + 0x003676c8, // n0x1403 c0x0000 (---------------) + I berkeley + 0x0022e6c6, // n0x1404 c0x0000 (---------------) + I berlin + 0x00390744, // n0x1405 c0x0000 (---------------) + I bern + 0x0037bf45, // n0x1406 c0x0000 (---------------) + I bible + 0x002028c6, // n0x1407 c0x0000 (---------------) + I bilbao + 0x00202e84, // n0x1408 c0x0000 (---------------) + I bill + 0x002042c7, // n0x1409 c0x0000 (---------------) + I birdart + 0x0020628a, // n0x140a c0x0000 (---------------) + I birthplace + 0x00212384, // n0x140b c0x0000 (---------------) + I bonn + 0x00217cc6, // n0x140c c0x0000 (---------------) + I boston + 0x00218e89, // n0x140d c0x0000 (---------------) + I botanical + 0x00218e8f, // n0x140e c0x0000 (---------------) + I botanicalgarden + 0x0021a18d, // n0x140f c0x0000 (---------------) + I botanicgarden + 0x0021a946, // n0x1410 c0x0000 (---------------) + I botany + 0x0021ca50, // n0x1411 c0x0000 (---------------) + I brandywinevalley + 0x0021ce46, // n0x1412 c0x0000 (---------------) + I brasil + 0x0021db87, // n0x1413 c0x0000 (---------------) + I bristol + 0x0021df07, // n0x1414 c0x0000 (---------------) + I british + 0x0021df0f, // n0x1415 c0x0000 (---------------) + I britishcolumbia + 0x0021fa49, // n0x1416 c0x0000 (---------------) + I broadcast + 0x00222b06, // n0x1417 c0x0000 (---------------) + I brunel + 0x00225e87, // n0x1418 c0x0000 (---------------) + I brussel + 0x00225e88, // n0x1419 c0x0000 (---------------) + I brussels + 0x00227049, // n0x141a c0x0000 (---------------) + I bruxelles + 0x0028fd88, // n0x141b c0x0000 (---------------) + I building + 0x002d7647, // n0x141c c0x0000 (---------------) + I burghof + 0x0020ca03, // n0x141d c0x0000 (---------------) + I bus + 0x00233386, // n0x141e c0x0000 (---------------) + I bushey + 0x00200308, // n0x141f c0x0000 (---------------) + I cadaques + 0x0029fdca, // n0x1420 c0x0000 (---------------) + I california + 0x00221ac9, // n0x1421 c0x0000 (---------------) + I cambridge + 0x00208ec3, // n0x1422 c0x0000 (---------------) + I can + 0x00324f06, // n0x1423 c0x0000 (---------------) + I canada + 0x002b63ca, // n0x1424 c0x0000 (---------------) + I capebreton + 0x00365247, // n0x1425 c0x0000 (---------------) + I carrier + 0x0020af4a, // n0x1426 c0x0000 (---------------) + I cartoonart + 0x0021460e, // n0x1427 c0x0000 (---------------) + I casadelamoneda + 0x0021fb86, // n0x1428 c0x0000 (---------------) + I castle + 0x002a6c47, // n0x1429 c0x0000 (---------------) + I castres + 0x00211b46, // n0x142a c0x0000 (---------------) + I celtic + 0x00204486, // n0x142b c0x0000 (---------------) + I center + 0x00374acb, // n0x142c c0x0000 (---------------) + I chattanooga + 0x002648ca, // n0x142d c0x0000 (---------------) + I cheltenham + 0x0035150d, // n0x142e c0x0000 (---------------) + I chesapeakebay + 0x00213047, // n0x142f c0x0000 (---------------) + I chicago + 0x00274888, // n0x1430 c0x0000 (---------------) + I children + 0x00274889, // n0x1431 c0x0000 (---------------) + I childrens + 0x0027488f, // n0x1432 c0x0000 (---------------) + I childrensgarden + 0x0023984c, // n0x1433 c0x0000 (---------------) + I chiropractic + 0x002b5a89, // n0x1434 c0x0000 (---------------) + I chocolate + 0x00379b8e, // n0x1435 c0x0000 (---------------) + I christiansburg + 0x00238cca, // n0x1436 c0x0000 (---------------) + I cincinnati + 0x002ce4c6, // n0x1437 c0x0000 (---------------) + I cinema + 0x00337c86, // n0x1438 c0x0000 (---------------) + I circus + 0x00363b8c, // n0x1439 c0x0000 (---------------) + I civilisation + 0x00367b8c, // n0x143a c0x0000 (---------------) + I civilization + 0x0036f008, // n0x143b c0x0000 (---------------) + I civilwar + 0x003894c7, // n0x143c c0x0000 (---------------) + I clinton + 0x002acc45, // n0x143d c0x0000 (---------------) + I clock + 0x00355244, // n0x143e c0x0000 (---------------) + I coal + 0x00386b8e, // n0x143f c0x0000 (---------------) + I coastaldefence + 0x00323204, // n0x1440 c0x0000 (---------------) + I cody + 0x00231d87, // n0x1441 c0x0000 (---------------) + I coldwar + 0x00265b8a, // n0x1442 c0x0000 (---------------) + I collection + 0x00232454, // n0x1443 c0x0000 (---------------) + I colonialwilliamsburg + 0x00232dcf, // n0x1444 c0x0000 (---------------) + I coloradoplateau + 0x0021e0c8, // n0x1445 c0x0000 (---------------) + I columbia + 0x00233248, // n0x1446 c0x0000 (---------------) + I columbus + 0x0036018d, // n0x1447 c0x0000 (---------------) + I communication + 0x0036018e, // n0x1448 c0x0000 (---------------) + I communications + 0x00233509, // n0x1449 c0x0000 (---------------) + I community + 0x00235488, // n0x144a c0x0000 (---------------) + I computer + 0x0023548f, // n0x144b c0x0000 (---------------) + I computerhistory + 0x0023a3cc, // n0x144c c0x0000 (---------------) + I contemporary + 0x0023a3cf, // n0x144d c0x0000 (---------------) + I contemporaryart + 0x0023b747, // n0x144e c0x0000 (---------------) + I convent + 0x0023de0a, // n0x144f c0x0000 (---------------) + I copenhagen + 0x0021c58b, // n0x1450 c0x0000 (---------------) + I corporation + 0x0023f888, // n0x1451 c0x0000 (---------------) + I corvette + 0x00241807, // n0x1452 c0x0000 (---------------) + I costume + 0x0033658d, // n0x1453 c0x0000 (---------------) + I countryestate + 0x0031ab06, // n0x1454 c0x0000 (---------------) + I county + 0x0039ec86, // n0x1455 c0x0000 (---------------) + I crafts + 0x00243c49, // n0x1456 c0x0000 (---------------) + I cranbrook + 0x00336b48, // n0x1457 c0x0000 (---------------) + I creation + 0x00247888, // n0x1458 c0x0000 (---------------) + I cultural + 0x0024788e, // n0x1459 c0x0000 (---------------) + I culturalcenter + 0x00209d87, // n0x145a c0x0000 (---------------) + I culture + 0x00322345, // n0x145b c0x0000 (---------------) + I cyber + 0x0024a985, // n0x145c c0x0000 (---------------) + I cymru + 0x00210284, // n0x145d c0x0000 (---------------) + I dali + 0x00279e86, // n0x145e c0x0000 (---------------) + I dallas + 0x0022f8c8, // n0x145f c0x0000 (---------------) + I database + 0x002edd03, // n0x1460 c0x0000 (---------------) + I ddr + 0x0025fa0e, // n0x1461 c0x0000 (---------------) + I decorativearts + 0x00336948, // n0x1462 c0x0000 (---------------) + I delaware + 0x0027af0b, // n0x1463 c0x0000 (---------------) + I delmenhorst + 0x003312c7, // n0x1464 c0x0000 (---------------) + I denmark + 0x00274145, // n0x1465 c0x0000 (---------------) + I depot + 0x0022dcc6, // n0x1466 c0x0000 (---------------) + I design + 0x002aa507, // n0x1467 c0x0000 (---------------) + I detroit + 0x002fac88, // n0x1468 c0x0000 (---------------) + I dinosaur + 0x00330409, // n0x1469 c0x0000 (---------------) + I discovery + 0x00237405, // n0x146a c0x0000 (---------------) + I dolls + 0x002861c8, // n0x146b c0x0000 (---------------) + I donostia + 0x0020cc06, // n0x146c c0x0000 (---------------) + I durham + 0x0037574a, // n0x146d c0x0000 (---------------) + I eastafrica + 0x00386a89, // n0x146e c0x0000 (---------------) + I eastcoast + 0x0023a789, // n0x146f c0x0000 (---------------) + I education + 0x0023a78b, // n0x1470 c0x0000 (---------------) + I educational + 0x0028c908, // n0x1471 c0x0000 (---------------) + I egyptian + 0x002ebf49, // n0x1472 c0x0000 (---------------) + I eisenbahn + 0x00210746, // n0x1473 c0x0000 (---------------) + I elburg + 0x002e4f4a, // n0x1474 c0x0000 (---------------) + I elvendrell + 0x0022980a, // n0x1475 c0x0000 (---------------) + I embroidery + 0x0023e00c, // n0x1476 c0x0000 (---------------) + I encyclopedic + 0x00213707, // n0x1477 c0x0000 (---------------) + I england + 0x002cd60a, // n0x1478 c0x0000 (---------------) + I entomology + 0x00326d8b, // n0x1479 c0x0000 (---------------) + I environment + 0x00326d99, // n0x147a c0x0000 (---------------) + I environmentalconservation + 0x00329a48, // n0x147b c0x0000 (---------------) + I epilepsy + 0x00247585, // n0x147c c0x0000 (---------------) + I essex + 0x002c2486, // n0x147d c0x0000 (---------------) + I estate + 0x0030cf09, // n0x147e c0x0000 (---------------) + I ethnology + 0x00205346, // n0x147f c0x0000 (---------------) + I exeter + 0x002115ca, // n0x1480 c0x0000 (---------------) + I exhibition + 0x00208f86, // n0x1481 c0x0000 (---------------) + I family + 0x00271d04, // n0x1482 c0x0000 (---------------) + I farm + 0x002c260d, // n0x1483 c0x0000 (---------------) + I farmequipment + 0x002ece87, // n0x1484 c0x0000 (---------------) + I farmers + 0x00271d09, // n0x1485 c0x0000 (---------------) + I farmstead + 0x00366b05, // n0x1486 c0x0000 (---------------) + I field + 0x0037ac88, // n0x1487 c0x0000 (---------------) + I figueres + 0x0024b549, // n0x1488 c0x0000 (---------------) + I filatelia + 0x0024b784, // n0x1489 c0x0000 (---------------) + I film + 0x0024be87, // n0x148a c0x0000 (---------------) + I fineart + 0x0024be88, // n0x148b c0x0000 (---------------) + I finearts + 0x0024c387, // n0x148c c0x0000 (---------------) + I finland + 0x00267688, // n0x148d c0x0000 (---------------) + I flanders + 0x00252947, // n0x148e c0x0000 (---------------) + I florida + 0x00338705, // n0x148f c0x0000 (---------------) + I force + 0x00259fcc, // n0x1490 c0x0000 (---------------) + I fortmissoula + 0x0025ab89, // n0x1491 c0x0000 (---------------) + I fortworth + 0x002b9f4a, // n0x1492 c0x0000 (---------------) + I foundation + 0x00385d09, // n0x1493 c0x0000 (---------------) + I francaise + 0x00357649, // n0x1494 c0x0000 (---------------) + I frankfurt + 0x00256acc, // n0x1495 c0x0000 (---------------) + I franziskaner + 0x002e7d0b, // n0x1496 c0x0000 (---------------) + I freemasonry + 0x0025c488, // n0x1497 c0x0000 (---------------) + I freiburg + 0x00260048, // n0x1498 c0x0000 (---------------) + I fribourg + 0x002636c4, // n0x1499 c0x0000 (---------------) + I frog + 0x00283c88, // n0x149a c0x0000 (---------------) + I fundacio + 0x00285349, // n0x149b c0x0000 (---------------) + I furniture + 0x00392147, // n0x149c c0x0000 (---------------) + I gallery + 0x002190c6, // n0x149d c0x0000 (---------------) + I garden + 0x00246347, // n0x149e c0x0000 (---------------) + I gateway + 0x00330689, // n0x149f c0x0000 (---------------) + I geelvinck + 0x0021334b, // n0x14a0 c0x0000 (---------------) + I gemological + 0x00396387, // n0x14a1 c0x0000 (---------------) + I geology + 0x00324c47, // n0x14a2 c0x0000 (---------------) + I georgia + 0x00279907, // n0x14a3 c0x0000 (---------------) + I giessen + 0x0039ef44, // n0x14a4 c0x0000 (---------------) + I glas + 0x0039ef45, // n0x14a5 c0x0000 (---------------) + I glass + 0x002a8705, // n0x14a6 c0x0000 (---------------) + I gorge + 0x0033454b, // n0x14a7 c0x0000 (---------------) + I grandrapids + 0x0038f9c4, // n0x14a8 c0x0000 (---------------) + I graz + 0x00266e08, // n0x14a9 c0x0000 (---------------) + I guernsey + 0x0029168a, // n0x14aa c0x0000 (---------------) + I halloffame + 0x0020ccc7, // n0x14ab c0x0000 (---------------) + I hamburg + 0x0031bbc7, // n0x14ac c0x0000 (---------------) + I handson + 0x0028b492, // n0x14ad c0x0000 (---------------) + I harvestcelebration + 0x0025cb86, // n0x14ae c0x0000 (---------------) + I hawaii + 0x0036b386, // n0x14af c0x0000 (---------------) + I health + 0x0030f8ce, // n0x14b0 c0x0000 (---------------) + I heimatunduhren + 0x0025fd86, // n0x14b1 c0x0000 (---------------) + I hellas + 0x0020ebc8, // n0x14b2 c0x0000 (---------------) + I helsinki + 0x00290d0f, // n0x14b3 c0x0000 (---------------) + I hembygdsforbund + 0x0039f388, // n0x14b4 c0x0000 (---------------) + I heritage + 0x0036d908, // n0x14b5 c0x0000 (---------------) + I histoire + 0x002fb8ca, // n0x14b6 c0x0000 (---------------) + I historical + 0x002fb8d1, // n0x14b7 c0x0000 (---------------) + I historicalsociety + 0x002a1f0e, // n0x14b8 c0x0000 (---------------) + I historichouses + 0x002567ca, // n0x14b9 c0x0000 (---------------) + I historisch + 0x002567cc, // n0x14ba c0x0000 (---------------) + I historisches + 0x00235687, // n0x14bb c0x0000 (---------------) + I history + 0x00235690, // n0x14bc c0x0000 (---------------) + I historyofscience + 0x00202188, // n0x14bd c0x0000 (---------------) + I horology + 0x002a2105, // n0x14be c0x0000 (---------------) + I house + 0x002aad4a, // n0x14bf c0x0000 (---------------) + I humanities + 0x00202ecc, // n0x14c0 c0x0000 (---------------) + I illustration + 0x002b44cd, // n0x14c1 c0x0000 (---------------) + I imageandsound + 0x002a3c46, // n0x14c2 c0x0000 (---------------) + I indian + 0x002a3c47, // n0x14c3 c0x0000 (---------------) + I indiana + 0x002a3c4c, // n0x14c4 c0x0000 (---------------) + I indianapolis + 0x002f120c, // n0x14c5 c0x0000 (---------------) + I indianmarket + 0x0024dd4c, // n0x14c6 c0x0000 (---------------) + I intelligence + 0x0028a0cb, // n0x14c7 c0x0000 (---------------) + I interactive + 0x002859c4, // n0x14c8 c0x0000 (---------------) + I iraq + 0x0021d504, // n0x14c9 c0x0000 (---------------) + I iron + 0x0034fb49, // n0x14ca c0x0000 (---------------) + I isleofman + 0x002c8ec7, // n0x14cb c0x0000 (---------------) + I jamison + 0x00266a49, // n0x14cc c0x0000 (---------------) + I jefferson + 0x00283549, // n0x14cd c0x0000 (---------------) + I jerusalem + 0x00360f47, // n0x14ce c0x0000 (---------------) + I jewelry + 0x00391f06, // n0x14cf c0x0000 (---------------) + I jewish + 0x00391f09, // n0x14d0 c0x0000 (---------------) + I jewishart + 0x00399f83, // n0x14d1 c0x0000 (---------------) + I jfk + 0x0033be4a, // n0x14d2 c0x0000 (---------------) + I journalism + 0x00355487, // n0x14d3 c0x0000 (---------------) + I judaica + 0x0027744b, // n0x14d4 c0x0000 (---------------) + I judygarland + 0x0035138a, // n0x14d5 c0x0000 (---------------) + I juedisches + 0x00242844, // n0x14d6 c0x0000 (---------------) + I juif + 0x00353546, // n0x14d7 c0x0000 (---------------) + I karate + 0x0027efc9, // n0x14d8 c0x0000 (---------------) + I karikatur + 0x0028cd44, // n0x14d9 c0x0000 (---------------) + I kids + 0x0020324a, // n0x14da c0x0000 (---------------) + I koebenhavn + 0x0036bd45, // n0x14db c0x0000 (---------------) + I koeln + 0x002b4d85, // n0x14dc c0x0000 (---------------) + I kunst + 0x002b4d8d, // n0x14dd c0x0000 (---------------) + I kunstsammlung + 0x002b50ce, // n0x14de c0x0000 (---------------) + I kunstunddesign + 0x00315585, // n0x14df c0x0000 (---------------) + I labor + 0x0038b2c6, // n0x14e0 c0x0000 (---------------) + I labour + 0x00247107, // n0x14e1 c0x0000 (---------------) + I lajolla + 0x002c990a, // n0x14e2 c0x0000 (---------------) + I lancashire + 0x00323506, // n0x14e3 c0x0000 (---------------) + I landes + 0x00359c44, // n0x14e4 c0x0000 (---------------) + I lans + 0x00359f87, // n0x14e5 c0x0000 (---------------) + I larsson + 0x002def0b, // n0x14e6 c0x0000 (---------------) + I lewismiller + 0x0022e787, // n0x14e7 c0x0000 (---------------) + I lincoln + 0x003a0f44, // n0x14e8 c0x0000 (---------------) + I linz + 0x002414c6, // n0x14e9 c0x0000 (---------------) + I living + 0x002414cd, // n0x14ea c0x0000 (---------------) + I livinghistory + 0x003571cc, // n0x14eb c0x0000 (---------------) + I localhistory + 0x00321906, // n0x14ec c0x0000 (---------------) + I london + 0x0031f68a, // n0x14ed c0x0000 (---------------) + I losangeles + 0x0022b6c6, // n0x14ee c0x0000 (---------------) + I louvre + 0x002a7e88, // n0x14ef c0x0000 (---------------) + I loyalist + 0x002e6147, // n0x14f0 c0x0000 (---------------) + I lucerne + 0x0023ca4a, // n0x14f1 c0x0000 (---------------) + I luxembourg + 0x0023dc86, // n0x14f2 c0x0000 (---------------) + I luzern + 0x00212f43, // n0x14f3 c0x0000 (---------------) + I mad + 0x00317146, // n0x14f4 c0x0000 (---------------) + I madrid + 0x00200188, // n0x14f5 c0x0000 (---------------) + I mallorca + 0x0029a80a, // n0x14f6 c0x0000 (---------------) + I manchester + 0x00251d47, // n0x14f7 c0x0000 (---------------) + I mansion + 0x00251d48, // n0x14f8 c0x0000 (---------------) + I mansions + 0x0026a704, // n0x14f9 c0x0000 (---------------) + I manx + 0x00278f07, // n0x14fa c0x0000 (---------------) + I marburg + 0x00269708, // n0x14fb c0x0000 (---------------) + I maritime + 0x002a3088, // n0x14fc c0x0000 (---------------) + I maritimo + 0x0025cd88, // n0x14fd c0x0000 (---------------) + I maryland + 0x002831ca, // n0x14fe c0x0000 (---------------) + I marylhurst + 0x003025c5, // n0x14ff c0x0000 (---------------) + I media + 0x0023ac87, // n0x1500 c0x0000 (---------------) + I medical + 0x00256613, // n0x1501 c0x0000 (---------------) + I medizinhistorisches + 0x00259146, // n0x1502 c0x0000 (---------------) + I meeres + 0x0026cf88, // n0x1503 c0x0000 (---------------) + I memorial + 0x002221c9, // n0x1504 c0x0000 (---------------) + I mesaverde + 0x002165c8, // n0x1505 c0x0000 (---------------) + I michigan + 0x0036e1cb, // n0x1506 c0x0000 (---------------) + I midatlantic + 0x002b8348, // n0x1507 c0x0000 (---------------) + I military + 0x00285244, // n0x1508 c0x0000 (---------------) + I mill + 0x00321106, // n0x1509 c0x0000 (---------------) + I miners + 0x003a5c46, // n0x150a c0x0000 (---------------) + I mining + 0x003058c9, // n0x150b c0x0000 (---------------) + I minnesota + 0x002bf847, // n0x150c c0x0000 (---------------) + I missile + 0x0025a0c8, // n0x150d c0x0000 (---------------) + I missoula + 0x003a1f86, // n0x150e c0x0000 (---------------) + I modern + 0x0037a084, // n0x150f c0x0000 (---------------) + I moma + 0x002c6d85, // n0x1510 c0x0000 (---------------) + I money + 0x002c1888, // n0x1511 c0x0000 (---------------) + I monmouth + 0x002c1fca, // n0x1512 c0x0000 (---------------) + I monticello + 0x002c2288, // n0x1513 c0x0000 (---------------) + I montreal + 0x002c74c6, // n0x1514 c0x0000 (---------------) + I moscow + 0x0029af0a, // n0x1515 c0x0000 (---------------) + I motorcycle + 0x002e6d88, // n0x1516 c0x0000 (---------------) + I muenchen + 0x002ca188, // n0x1517 c0x0000 (---------------) + I muenster + 0x002cb648, // n0x1518 c0x0000 (---------------) + I mulhouse + 0x002cc046, // n0x1519 c0x0000 (---------------) + I muncie + 0x002cfc06, // n0x151a c0x0000 (---------------) + I museet + 0x002ea80c, // n0x151b c0x0000 (---------------) + I museumcenter + 0x002d0110, // n0x151c c0x0000 (---------------) + I museumvereniging + 0x00283a85, // n0x151d c0x0000 (---------------) + I music + 0x00319548, // n0x151e c0x0000 (---------------) + I national + 0x00319550, // n0x151f c0x0000 (---------------) + I nationalfirearms + 0x0039f190, // n0x1520 c0x0000 (---------------) + I nationalheritage + 0x0027284e, // n0x1521 c0x0000 (---------------) + I nativeamerican + 0x002ea48e, // n0x1522 c0x0000 (---------------) + I naturalhistory + 0x002ea494, // n0x1523 c0x0000 (---------------) + I naturalhistorymuseum + 0x0031ad4f, // n0x1524 c0x0000 (---------------) + I naturalsciences + 0x0031b106, // n0x1525 c0x0000 (---------------) + I nature + 0x00325e11, // n0x1526 c0x0000 (---------------) + I naturhistorisches + 0x00327393, // n0x1527 c0x0000 (---------------) + I natuurwetenschappen + 0x00327808, // n0x1528 c0x0000 (---------------) + I naumburg + 0x0030f105, // n0x1529 c0x0000 (---------------) + I naval + 0x002d7f48, // n0x152a c0x0000 (---------------) + I nebraska + 0x002de045, // n0x152b c0x0000 (---------------) + I neues + 0x0022a34c, // n0x152c c0x0000 (---------------) + I newhampshire + 0x002aeb89, // n0x152d c0x0000 (---------------) + I newjersey + 0x00231bc9, // n0x152e c0x0000 (---------------) + I newmexico + 0x002460c7, // n0x152f c0x0000 (---------------) + I newport + 0x00221dc9, // n0x1530 c0x0000 (---------------) + I newspaper + 0x002ed0c7, // n0x1531 c0x0000 (---------------) + I newyork + 0x002a2646, // n0x1532 c0x0000 (---------------) + I niepce + 0x0037bd47, // n0x1533 c0x0000 (---------------) + I norfolk + 0x00239c45, // n0x1534 c0x0000 (---------------) + I north + 0x002b5e83, // n0x1535 c0x0000 (---------------) + I nrw + 0x002edec9, // n0x1536 c0x0000 (---------------) + I nuernberg + 0x003518c9, // n0x1537 c0x0000 (---------------) + I nuremberg + 0x0036ef83, // n0x1538 c0x0000 (---------------) + I nyc + 0x00215844, // n0x1539 c0x0000 (---------------) + I nyny + 0x0032154d, // n0x153a c0x0000 (---------------) + I oceanographic + 0x00200b0f, // n0x153b c0x0000 (---------------) + I oceanographique + 0x002fc505, // n0x153c c0x0000 (---------------) + I omaha + 0x003175c6, // n0x153d c0x0000 (---------------) + I online + 0x00200987, // n0x153e c0x0000 (---------------) + I ontario + 0x00358c87, // n0x153f c0x0000 (---------------) + I openair + 0x00287ec6, // n0x1540 c0x0000 (---------------) + I oregon + 0x00287ecb, // n0x1541 c0x0000 (---------------) + I oregontrail + 0x002a3605, // n0x1542 c0x0000 (---------------) + I otago + 0x0039bec6, // n0x1543 c0x0000 (---------------) + I oxford + 0x003909c7, // n0x1544 c0x0000 (---------------) + I pacific + 0x0026fec9, // n0x1545 c0x0000 (---------------) + I paderborn + 0x00322046, // n0x1546 c0x0000 (---------------) + I palace + 0x0020ac45, // n0x1547 c0x0000 (---------------) + I paleo + 0x0023a00b, // n0x1548 c0x0000 (---------------) + I palmsprings + 0x0025b986, // n0x1549 c0x0000 (---------------) + I panama + 0x00277905, // n0x154a c0x0000 (---------------) + I paris + 0x002b5648, // n0x154b c0x0000 (---------------) + I pasadena + 0x00375008, // n0x154c c0x0000 (---------------) + I pharmacy + 0x002d30cc, // n0x154d c0x0000 (---------------) + I philadelphia + 0x002d30d0, // n0x154e c0x0000 (---------------) + I philadelphiaarea + 0x002d3789, // n0x154f c0x0000 (---------------) + I philately + 0x002d3bc7, // n0x1550 c0x0000 (---------------) + I phoenix + 0x002d404b, // n0x1551 c0x0000 (---------------) + I photography + 0x002d6506, // n0x1552 c0x0000 (---------------) + I pilots + 0x002d750a, // n0x1553 c0x0000 (---------------) + I pittsburgh + 0x002d898b, // n0x1554 c0x0000 (---------------) + I planetarium + 0x002d8d8a, // n0x1555 c0x0000 (---------------) + I plantation + 0x002d9006, // n0x1556 c0x0000 (---------------) + I plants + 0x002db005, // n0x1557 c0x0000 (---------------) + I plaza + 0x002ec506, // n0x1558 c0x0000 (---------------) + I portal + 0x00279488, // n0x1559 c0x0000 (---------------) + I portland + 0x0024618a, // n0x155a c0x0000 (---------------) + I portlligat + 0x0035fe1c, // n0x155b c0x0000 (---------------) + I posts-and-telecommunications + 0x002e110c, // n0x155c c0x0000 (---------------) + I preservation + 0x002e1408, // n0x155d c0x0000 (---------------) + I presidio + 0x00247505, // n0x155e c0x0000 (---------------) + I press + 0x002e3107, // n0x155f c0x0000 (---------------) + I project + 0x0029f746, // n0x1560 c0x0000 (---------------) + I public + 0x0038dec5, // n0x1561 c0x0000 (---------------) + I pubol + 0x0021b906, // n0x1562 c0x0000 (---------------) + I quebec + 0x00288088, // n0x1563 c0x0000 (---------------) + I railroad + 0x002b3287, // n0x1564 c0x0000 (---------------) + I railway + 0x0029fa08, // n0x1565 c0x0000 (---------------) + I research + 0x002a6d4a, // n0x1566 c0x0000 (---------------) + I resistance + 0x0030864c, // n0x1567 c0x0000 (---------------) + I riodejaneiro + 0x003088c9, // n0x1568 c0x0000 (---------------) + I rochester + 0x0038e207, // n0x1569 c0x0000 (---------------) + I rockart + 0x00254584, // n0x156a c0x0000 (---------------) + I roma + 0x00252f86, // n0x156b c0x0000 (---------------) + I russia + 0x0036d48a, // n0x156c c0x0000 (---------------) + I saintlouis + 0x00283645, // n0x156d c0x0000 (---------------) + I salem + 0x0034504c, // n0x156e c0x0000 (---------------) + I salvadordali + 0x00345cc8, // n0x156f c0x0000 (---------------) + I salzburg + 0x0034a848, // n0x1570 c0x0000 (---------------) + I sandiego + 0x002004cc, // n0x1571 c0x0000 (---------------) + I sanfrancisco + 0x00210c8c, // n0x1572 c0x0000 (---------------) + I santabarbara + 0x00211189, // n0x1573 c0x0000 (---------------) + I santacruz + 0x002113c7, // n0x1574 c0x0000 (---------------) + I santafe + 0x0033d48c, // n0x1575 c0x0000 (---------------) + I saskatchewan + 0x003897c4, // n0x1576 c0x0000 (---------------) + I satx + 0x00232b4a, // n0x1577 c0x0000 (---------------) + I savannahga + 0x0028d04c, // n0x1578 c0x0000 (---------------) + I schlesisches + 0x0027104b, // n0x1579 c0x0000 (---------------) + I schoenbrunn + 0x0023758b, // n0x157a c0x0000 (---------------) + I schokoladen + 0x0023d0c6, // n0x157b c0x0000 (---------------) + I school + 0x00243147, // n0x157c c0x0000 (---------------) + I schweiz + 0x002358c7, // n0x157d c0x0000 (---------------) + I science + 0x002358cf, // n0x157e c0x0000 (---------------) + I science-fiction + 0x002f1b51, // n0x157f c0x0000 (---------------) + I scienceandhistory + 0x0039e252, // n0x1580 c0x0000 (---------------) + I scienceandindustry + 0x0024410d, // n0x1581 c0x0000 (---------------) + I sciencecenter + 0x0024410e, // n0x1582 c0x0000 (---------------) + I sciencecenters + 0x0024444e, // n0x1583 c0x0000 (---------------) + I sciencehistory + 0x0031af08, // n0x1584 c0x0000 (---------------) + I sciences + 0x0031af12, // n0x1585 c0x0000 (---------------) + I sciencesnaturelles + 0x00200708, // n0x1586 c0x0000 (---------------) + I scotland + 0x002fa9c7, // n0x1587 c0x0000 (---------------) + I seaport + 0x0024f98a, // n0x1588 c0x0000 (---------------) + I settlement + 0x00219c08, // n0x1589 c0x0000 (---------------) + I settlers + 0x0025fd45, // n0x158a c0x0000 (---------------) + I shell + 0x0035cc4a, // n0x158b c0x0000 (---------------) + I sherbrooke + 0x0021d987, // n0x158c c0x0000 (---------------) + I sibenik + 0x00341f84, // n0x158d c0x0000 (---------------) + I silk + 0x00209743, // n0x158e c0x0000 (---------------) + I ski + 0x00296cc5, // n0x158f c0x0000 (---------------) + I skole + 0x002fbb47, // n0x1590 c0x0000 (---------------) + I society + 0x002f9607, // n0x1591 c0x0000 (---------------) + I sologne + 0x002b46ce, // n0x1592 c0x0000 (---------------) + I soundandvision + 0x0032bd4d, // n0x1593 c0x0000 (---------------) + I southcarolina + 0x0032e849, // n0x1594 c0x0000 (---------------) + I southwest + 0x0020bb45, // n0x1595 c0x0000 (---------------) + I space + 0x003347c3, // n0x1596 c0x0000 (---------------) + I spy + 0x0027a346, // n0x1597 c0x0000 (---------------) + I square + 0x003643c5, // n0x1598 c0x0000 (---------------) + I stadt + 0x0027b148, // n0x1599 c0x0000 (---------------) + I stalbans + 0x00323f89, // n0x159a c0x0000 (---------------) + I starnberg + 0x0020f205, // n0x159b c0x0000 (---------------) + I state + 0x0033678f, // n0x159c c0x0000 (---------------) + I stateofdelaware + 0x00254e87, // n0x159d c0x0000 (---------------) + I station + 0x003674c5, // n0x159e c0x0000 (---------------) + I steam + 0x00227c0a, // n0x159f c0x0000 (---------------) + I steiermark + 0x00303b86, // n0x15a0 c0x0000 (---------------) + I stjohn + 0x002a8009, // n0x15a1 c0x0000 (---------------) + I stockholm + 0x002e71cc, // n0x15a2 c0x0000 (---------------) + I stpetersburg + 0x002e8989, // n0x15a3 c0x0000 (---------------) + I stuttgart + 0x00206706, // n0x15a4 c0x0000 (---------------) + I suisse + 0x0029148c, // n0x15a5 c0x0000 (---------------) + I surgeonshall + 0x002e91c6, // n0x15a6 c0x0000 (---------------) + I surrey + 0x002f0688, // n0x15a7 c0x0000 (---------------) + I svizzera + 0x002f0886, // n0x15a8 c0x0000 (---------------) + I sweden + 0x00329bc6, // n0x15a9 c0x0000 (---------------) + I sydney + 0x002294c4, // n0x15aa c0x0000 (---------------) + I tank + 0x0025d103, // n0x15ab c0x0000 (---------------) + I tcm + 0x002d608a, // n0x15ac c0x0000 (---------------) + I technology + 0x0031d2d1, // n0x15ad c0x0000 (---------------) + I telekommunikation + 0x002b5c4a, // n0x15ae c0x0000 (---------------) + I television + 0x0034d1c5, // n0x15af c0x0000 (---------------) + I texas + 0x003844c7, // n0x15b0 c0x0000 (---------------) + I textile + 0x002573c7, // n0x15b1 c0x0000 (---------------) + I theater + 0x00269804, // n0x15b2 c0x0000 (---------------) + I time + 0x0026980b, // n0x15b3 c0x0000 (---------------) + I timekeeping + 0x00208088, // n0x15b4 c0x0000 (---------------) + I topology + 0x002b1946, // n0x15b5 c0x0000 (---------------) + I torino + 0x00311cc5, // n0x15b6 c0x0000 (---------------) + I touch + 0x002dc244, // n0x15b7 c0x0000 (---------------) + I town + 0x00294809, // n0x15b8 c0x0000 (---------------) + I transport + 0x00355f84, // n0x15b9 c0x0000 (---------------) + I tree + 0x00359147, // n0x15ba c0x0000 (---------------) + I trolley + 0x00329245, // n0x15bb c0x0000 (---------------) + I trust + 0x00329247, // n0x15bc c0x0000 (---------------) + I trustee + 0x0030fb05, // n0x15bd c0x0000 (---------------) + I uhren + 0x00253643, // n0x15be c0x0000 (---------------) + I ulm + 0x002fa888, // n0x15bf c0x0000 (---------------) + I undersea + 0x00320a0a, // n0x15c0 c0x0000 (---------------) + I university + 0x0022b983, // n0x15c1 c0x0000 (---------------) + I usa + 0x0022b98a, // n0x15c2 c0x0000 (---------------) + I usantiques + 0x0028db46, // n0x15c3 c0x0000 (---------------) + I usarts + 0x0033650f, // n0x15c4 c0x0000 (---------------) + I uscountryestate + 0x00337d89, // n0x15c5 c0x0000 (---------------) + I usculture + 0x0025f990, // n0x15c6 c0x0000 (---------------) + I usdecorativearts + 0x0026d6c8, // n0x15c7 c0x0000 (---------------) + I usgarden + 0x002c7d49, // n0x15c8 c0x0000 (---------------) + I ushistory + 0x0029ca87, // n0x15c9 c0x0000 (---------------) + I ushuaia + 0x0024144f, // n0x15ca c0x0000 (---------------) + I uslivinghistory + 0x002e84c4, // n0x15cb c0x0000 (---------------) + I utah + 0x0033d844, // n0x15cc c0x0000 (---------------) + I uvic + 0x00217106, // n0x15cd c0x0000 (---------------) + I valley + 0x00236b46, // n0x15ce c0x0000 (---------------) + I vantaa + 0x0031504a, // n0x15cf c0x0000 (---------------) + I versailles + 0x00311a06, // n0x15d0 c0x0000 (---------------) + I viking + 0x002f8f47, // n0x15d1 c0x0000 (---------------) + I village + 0x002f7e88, // n0x15d2 c0x0000 (---------------) + I virginia + 0x002f8087, // n0x15d3 c0x0000 (---------------) + I virtual + 0x002f8247, // n0x15d4 c0x0000 (---------------) + I virtuel + 0x0034710a, // n0x15d5 c0x0000 (---------------) + I vlaanderen + 0x002fa6cb, // n0x15d6 c0x0000 (---------------) + I volkenkunde + 0x00320685, // n0x15d7 c0x0000 (---------------) + I wales + 0x0039de88, // n0x15d8 c0x0000 (---------------) + I wallonie + 0x00203903, // n0x15d9 c0x0000 (---------------) + I war + 0x0023efcc, // n0x15da c0x0000 (---------------) + I washingtondc + 0x00376c4f, // n0x15db c0x0000 (---------------) + I watch-and-clock + 0x002aca4d, // n0x15dc c0x0000 (---------------) + I watchandclock + 0x0023d987, // n0x15dd c0x0000 (---------------) + I western + 0x0032e989, // n0x15de c0x0000 (---------------) + I westfalen + 0x002b5f07, // n0x15df c0x0000 (---------------) + I whaling + 0x00253bc8, // n0x15e0 c0x0000 (---------------) + I wildlife + 0x0023264c, // n0x15e1 c0x0000 (---------------) + I williamsburg + 0x00285148, // n0x15e2 c0x0000 (---------------) + I windmill + 0x00351f08, // n0x15e3 c0x0000 (---------------) + I workshop + 0x0030cb8e, // n0x15e4 c0x0000 (---------------) + I xn--9dbhblg6di + 0x0031d714, // n0x15e5 c0x0000 (---------------) + I xn--comunicaes-v6a2o + 0x0031dc24, // n0x15e6 c0x0000 (---------------) + I xn--correios-e-telecomunicaes-ghc29a + 0x0033b8ca, // n0x15e7 c0x0000 (---------------) + I xn--h1aegh + 0x0035a14b, // n0x15e8 c0x0000 (---------------) + I xn--lns-qla + 0x002ed184, // n0x15e9 c0x0000 (---------------) + I york + 0x002ed189, // n0x15ea c0x0000 (---------------) + I yorkshire + 0x002aab48, // n0x15eb c0x0000 (---------------) + I yosemite + 0x0024b0c5, // n0x15ec c0x0000 (---------------) + I youth + 0x002ed80a, // n0x15ed c0x0000 (---------------) + I zoological + 0x0027a507, // n0x15ee c0x0000 (---------------) + I zoology + 0x002389c4, // n0x15ef c0x0000 (---------------) + I aero + 0x00330b83, // n0x15f0 c0x0000 (---------------) + I biz + 0x00233503, // n0x15f1 c0x0000 (---------------) + I com + 0x0023d684, // n0x15f2 c0x0000 (---------------) + I coop + 0x0023a783, // n0x15f3 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x15f4 c0x0000 (---------------) + I gov + 0x003a1244, // n0x15f5 c0x0000 (---------------) + I info + 0x00201603, // n0x15f6 c0x0000 (---------------) + I int + 0x00209003, // n0x15f7 c0x0000 (---------------) + I mil + 0x002d0106, // n0x15f8 c0x0000 (---------------) + I museum + 0x00205284, // n0x15f9 c0x0000 (---------------) + I name + 0x0021fe03, // n0x15fa c0x0000 (---------------) + I net + 0x0022d1c3, // n0x15fb c0x0000 (---------------) + I org + 0x00220e43, // n0x15fc c0x0000 (---------------) + I pro + 0x00201542, // n0x15fd c0x0000 (---------------) + I ac + 0x00330b83, // n0x15fe c0x0000 (---------------) + I biz + 0x00200742, // n0x15ff c0x0000 (---------------) + I co + 0x00233503, // n0x1600 c0x0000 (---------------) + I com + 0x0023d684, // n0x1601 c0x0000 (---------------) + I coop + 0x0023a783, // n0x1602 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1603 c0x0000 (---------------) + I gov + 0x00201603, // n0x1604 c0x0000 (---------------) + I int + 0x002d0106, // n0x1605 c0x0000 (---------------) + I museum + 0x0021fe03, // n0x1606 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1607 c0x0000 (---------------) + I org + 0x000ffa08, // n0x1608 c0x0000 (---------------) + blogspot + 0x00233503, // n0x1609 c0x0000 (---------------) + I com + 0x0023a783, // n0x160a c0x0000 (---------------) + I edu + 0x00213183, // n0x160b c0x0000 (---------------) + I gob + 0x0021fe03, // n0x160c c0x0000 (---------------) + I net + 0x0022d1c3, // n0x160d c0x0000 (---------------) + I org + 0x000ffa08, // n0x160e c0x0000 (---------------) + blogspot + 0x00233503, // n0x160f c0x0000 (---------------) + I com + 0x0023a783, // n0x1610 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1611 c0x0000 (---------------) + I gov + 0x00209003, // n0x1612 c0x0000 (---------------) + I mil + 0x00205284, // n0x1613 c0x0000 (---------------) + I name + 0x0021fe03, // n0x1614 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1615 c0x0000 (---------------) + I org + 0x0062f7c8, // n0x1616 c0x0001 (---------------) ! I teledata + 0x00200302, // n0x1617 c0x0000 (---------------) + I ca + 0x0022e182, // n0x1618 c0x0000 (---------------) + I cc + 0x00200742, // n0x1619 c0x0000 (---------------) + I co + 0x00233503, // n0x161a c0x0000 (---------------) + I com + 0x0022bf42, // n0x161b c0x0000 (---------------) + I dr + 0x002013c2, // n0x161c c0x0000 (---------------) + I in + 0x003a1244, // n0x161d c0x0000 (---------------) + I info + 0x00207104, // n0x161e c0x0000 (---------------) + I mobi + 0x0021bb02, // n0x161f c0x0000 (---------------) + I mx + 0x00205284, // n0x1620 c0x0000 (---------------) + I name + 0x00200282, // n0x1621 c0x0000 (---------------) + I or + 0x0022d1c3, // n0x1622 c0x0000 (---------------) + I org + 0x00220e43, // n0x1623 c0x0000 (---------------) + I pro + 0x0023d0c6, // n0x1624 c0x0000 (---------------) + I school + 0x00224e42, // n0x1625 c0x0000 (---------------) + I tv + 0x00202382, // n0x1626 c0x0000 (---------------) + I us + 0x0020b942, // n0x1627 c0x0000 (---------------) + I ws + 0x38e22103, // n0x1628 c0x00e3 (n0x162a-n0x162b) o I her + 0x39218ac3, // n0x1629 c0x00e4 (n0x162b-n0x162c) o I his + 0x00057c46, // n0x162a c0x0000 (---------------) + forgot + 0x00057c46, // n0x162b c0x0000 (---------------) + forgot + 0x002d4884, // n0x162c c0x0000 (---------------) + I asso + 0x00116c0c, // n0x162d c0x0000 (---------------) + at-band-camp + 0x0001be0c, // n0x162e c0x0000 (---------------) + azure-mobile + 0x00080ecd, // n0x162f c0x0000 (---------------) + azurewebsites + 0x000fb147, // n0x1630 c0x0000 (---------------) + blogdns + 0x00020208, // n0x1631 c0x0000 (---------------) + broke-it + 0x0019898a, // n0x1632 c0x0000 (---------------) + buyshouses + 0x39e3e2c5, // n0x1633 c0x00e7 (n0x1663-n0x1664) o I cdn77 + 0x0003e2c9, // n0x1634 c0x0000 (---------------) + cdn77-ssl + 0x00009188, // n0x1635 c0x0000 (---------------) + cloudapp + 0x0019d4ca, // n0x1636 c0x0000 (---------------) + cloudfront + 0x0003118e, // n0x1637 c0x0000 (---------------) + cloudfunctions + 0x0014c048, // n0x1638 c0x0000 (---------------) + dnsalias + 0x0007c9c7, // n0x1639 c0x0000 (---------------) + dnsdojo + 0x00160607, // n0x163a c0x0000 (---------------) + does-it + 0x0016a009, // n0x163b c0x0000 (---------------) + dontexist + 0x0008cdc7, // n0x163c c0x0000 (---------------) + dsmynas + 0x00197b48, // n0x163d c0x0000 (---------------) + dynalias + 0x000e9d09, // n0x163e c0x0000 (---------------) + dynathome + 0x001a46c5, // n0x163f c0x0000 (---------------) + dynv6 + 0x000a950d, // n0x1640 c0x0000 (---------------) + endofinternet + 0x00008f88, // n0x1641 c0x0000 (---------------) + familyds + 0x3a24c206, // n0x1642 c0x00e8 (n0x1664-n0x1666) o I fastly + 0x00064447, // n0x1643 c0x0000 (---------------) + from-az + 0x00065a47, // n0x1644 c0x0000 (---------------) + from-co + 0x0006a1c7, // n0x1645 c0x0000 (---------------) + from-la + 0x0006f3c7, // n0x1646 c0x0000 (---------------) + from-ny + 0x0000d202, // n0x1647 c0x0000 (---------------) + gb + 0x00157907, // n0x1648 c0x0000 (---------------) + gets-it + 0x00064a8c, // n0x1649 c0x0000 (---------------) + ham-radio-op + 0x00146347, // n0x164a c0x0000 (---------------) + homeftp + 0x000a51c6, // n0x164b c0x0000 (---------------) + homeip + 0x000a59c9, // n0x164c c0x0000 (---------------) + homelinux + 0x000a6fc8, // n0x164d c0x0000 (---------------) + homeunix + 0x000195c2, // n0x164e c0x0000 (---------------) + hu + 0x000013c2, // n0x164f c0x0000 (---------------) + in + 0x00007b0b, // n0x1650 c0x0000 (---------------) + in-the-band + 0x00012789, // n0x1651 c0x0000 (---------------) + is-a-chef + 0x0004e989, // n0x1652 c0x0000 (---------------) + is-a-geek + 0x0008e588, // n0x1653 c0x0000 (---------------) + isa-geek + 0x000ae3c2, // n0x1654 c0x0000 (---------------) + jp + 0x00150c09, // n0x1655 c0x0000 (---------------) + kicks-ass + 0x0002168d, // n0x1656 c0x0000 (---------------) + office-on-the + 0x000dcd47, // n0x1657 c0x0000 (---------------) + podzone + 0x000ecb08, // n0x1658 c0x0000 (---------------) + rackmaze + 0x001376cd, // n0x1659 c0x0000 (---------------) + scrapper-site + 0x000046c2, // n0x165a c0x0000 (---------------) + se + 0x0006ba86, // n0x165b c0x0000 (---------------) + selfip + 0x00090208, // n0x165c c0x0000 (---------------) + sells-it + 0x000cb7c8, // n0x165d c0x0000 (---------------) + servebbs + 0x000895c8, // n0x165e c0x0000 (---------------) + serveftp + 0x00054088, // n0x165f c0x0000 (---------------) + thruhere + 0x00000f82, // n0x1660 c0x0000 (---------------) + uk + 0x000eadc6, // n0x1661 c0x0000 (---------------) + webhop + 0x00005f82, // n0x1662 c0x0000 (---------------) + za + 0x000002c1, // n0x1663 c0x0000 (---------------) + r + 0x3a6e2044, // n0x1664 c0x00e9 (n0x1666-n0x1668) o I prod + 0x3aa3e443, // n0x1665 c0x00ea (n0x1668-n0x166b) o I ssl + 0x00000101, // n0x1666 c0x0000 (---------------) + a + 0x0000d846, // n0x1667 c0x0000 (---------------) + global + 0x00000101, // n0x1668 c0x0000 (---------------) + a + 0x00000001, // n0x1669 c0x0000 (---------------) + b + 0x0000d846, // n0x166a c0x0000 (---------------) + global + 0x0024bf84, // n0x166b c0x0000 (---------------) + I arts + 0x00233503, // n0x166c c0x0000 (---------------) + I com + 0x0024d9c4, // n0x166d c0x0000 (---------------) + I firm + 0x003a1244, // n0x166e c0x0000 (---------------) + I info + 0x0021fe03, // n0x166f c0x0000 (---------------) + I net + 0x00222085, // n0x1670 c0x0000 (---------------) + I other + 0x00220f03, // n0x1671 c0x0000 (---------------) + I per + 0x0022a5c3, // n0x1672 c0x0000 (---------------) + I rec + 0x00391185, // n0x1673 c0x0000 (---------------) + I store + 0x00221a03, // n0x1674 c0x0000 (---------------) + I web + 0x3b633503, // n0x1675 c0x00ed (n0x167f-n0x1680) + I com + 0x0023a783, // n0x1676 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1677 c0x0000 (---------------) + I gov + 0x00200041, // n0x1678 c0x0000 (---------------) + I i + 0x00209003, // n0x1679 c0x0000 (---------------) + I mil + 0x00207104, // n0x167a c0x0000 (---------------) + I mobi + 0x00205284, // n0x167b c0x0000 (---------------) + I name + 0x0021fe03, // n0x167c c0x0000 (---------------) + I net + 0x0022d1c3, // n0x167d c0x0000 (---------------) + I org + 0x00217443, // n0x167e c0x0000 (---------------) + I sch + 0x000ffa08, // n0x167f c0x0000 (---------------) + blogspot + 0x00201542, // n0x1680 c0x0000 (---------------) + I ac + 0x00330b83, // n0x1681 c0x0000 (---------------) + I biz + 0x00200742, // n0x1682 c0x0000 (---------------) + I co + 0x00233503, // n0x1683 c0x0000 (---------------) + I com + 0x0023a783, // n0x1684 c0x0000 (---------------) + I edu + 0x00213183, // n0x1685 c0x0000 (---------------) + I gob + 0x002013c2, // n0x1686 c0x0000 (---------------) + I in + 0x003a1244, // n0x1687 c0x0000 (---------------) + I info + 0x00201603, // n0x1688 c0x0000 (---------------) + I int + 0x00209003, // n0x1689 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x168a c0x0000 (---------------) + I net + 0x00201483, // n0x168b c0x0000 (---------------) + I nom + 0x0022d1c3, // n0x168c c0x0000 (---------------) + I org + 0x00221a03, // n0x168d c0x0000 (---------------) + I web + 0x000ffa08, // n0x168e c0x0000 (---------------) + blogspot + 0x00365782, // n0x168f c0x0000 (---------------) + I bv + 0x00000742, // n0x1690 c0x0000 (---------------) + co + 0x3c622f02, // n0x1691 c0x00f1 (n0x1967-n0x1968) + I aa + 0x00355648, // n0x1692 c0x0000 (---------------) + I aarborte + 0x00223386, // n0x1693 c0x0000 (---------------) + I aejrie + 0x002bb486, // n0x1694 c0x0000 (---------------) + I afjord + 0x00222d07, // n0x1695 c0x0000 (---------------) + I agdenes + 0x3ca04f02, // n0x1696 c0x00f2 (n0x1968-n0x1969) + I ah + 0x3cf7c888, // n0x1697 c0x00f3 (n0x1969-n0x196a) o I akershus + 0x00354a4a, // n0x1698 c0x0000 (---------------) + I aknoluokta + 0x00263ec8, // n0x1699 c0x0000 (---------------) + I akrehamn + 0x002001c2, // n0x169a c0x0000 (---------------) + I al + 0x003552c9, // n0x169b c0x0000 (---------------) + I alaheadju + 0x003206c7, // n0x169c c0x0000 (---------------) + I alesund + 0x00219046, // n0x169d c0x0000 (---------------) + I algard + 0x00204e09, // n0x169e c0x0000 (---------------) + I alstahaug + 0x0023adc4, // n0x169f c0x0000 (---------------) + I alta + 0x002bbf06, // n0x16a0 c0x0000 (---------------) + I alvdal + 0x002bb884, // n0x16a1 c0x0000 (---------------) + I amli + 0x00278604, // n0x16a2 c0x0000 (---------------) + I amot + 0x00259c09, // n0x16a3 c0x0000 (---------------) + I andasuolo + 0x0022c086, // n0x16a4 c0x0000 (---------------) + I andebu + 0x00259645, // n0x16a5 c0x0000 (---------------) + I andoy + 0x00267dc5, // n0x16a6 c0x0000 (---------------) + I ardal + 0x00234b07, // n0x16a7 c0x0000 (---------------) + I aremark + 0x002b87c7, // n0x16a8 c0x0000 (---------------) + I arendal + 0x0032fec4, // n0x16a9 c0x0000 (---------------) + I arna + 0x00222f46, // n0x16aa c0x0000 (---------------) + I aseral + 0x002e2b85, // n0x16ab c0x0000 (---------------) + I asker + 0x00230345, // n0x16ac c0x0000 (---------------) + I askim + 0x002f58c5, // n0x16ad c0x0000 (---------------) + I askoy + 0x00389107, // n0x16ae c0x0000 (---------------) + I askvoll + 0x00331105, // n0x16af c0x0000 (---------------) + I asnes + 0x00309f89, // n0x16b0 c0x0000 (---------------) + I audnedaln + 0x00255485, // n0x16b1 c0x0000 (---------------) + I aukra + 0x002fadc4, // n0x16b2 c0x0000 (---------------) + I aure + 0x00323447, // n0x16b3 c0x0000 (---------------) + I aurland + 0x0025de0e, // n0x16b4 c0x0000 (---------------) + I aurskog-holand + 0x00272489, // n0x16b5 c0x0000 (---------------) + I austevoll + 0x0030f789, // n0x16b6 c0x0000 (---------------) + I austrheim + 0x00326bc6, // n0x16b7 c0x0000 (---------------) + I averoy + 0x002f2388, // n0x16b8 c0x0000 (---------------) + I badaddja + 0x002ade0b, // n0x16b9 c0x0000 (---------------) + I bahcavuotna + 0x002d13cc, // n0x16ba c0x0000 (---------------) + I bahccavuotna + 0x0026a446, // n0x16bb c0x0000 (---------------) + I baidar + 0x00372147, // n0x16bc c0x0000 (---------------) + I bajddar + 0x0025ef05, // n0x16bd c0x0000 (---------------) + I balat + 0x00228a8a, // n0x16be c0x0000 (---------------) + I balestrand + 0x00306f89, // n0x16bf c0x0000 (---------------) + I ballangen + 0x00254b89, // n0x16c0 c0x0000 (---------------) + I balsfjord + 0x00271906, // n0x16c1 c0x0000 (---------------) + I bamble + 0x002ef785, // n0x16c2 c0x0000 (---------------) + I bardu + 0x0027f705, // n0x16c3 c0x0000 (---------------) + I barum + 0x00354549, // n0x16c4 c0x0000 (---------------) + I batsfjord + 0x002f5a4b, // n0x16c5 c0x0000 (---------------) + I bearalvahki + 0x0027c686, // n0x16c6 c0x0000 (---------------) + I beardu + 0x0032e046, // n0x16c7 c0x0000 (---------------) + I beiarn + 0x0020d144, // n0x16c8 c0x0000 (---------------) + I berg + 0x0028b146, // n0x16c9 c0x0000 (---------------) + I bergen + 0x003223c8, // n0x16ca c0x0000 (---------------) + I berlevag + 0x00200006, // n0x16cb c0x0000 (---------------) + I bievat + 0x00398d86, // n0x16cc c0x0000 (---------------) + I bindal + 0x002054c8, // n0x16cd c0x0000 (---------------) + I birkenes + 0x00206507, // n0x16ce c0x0000 (---------------) + I bjarkoy + 0x00206ec9, // n0x16cf c0x0000 (---------------) + I bjerkreim + 0x0020c285, // n0x16d0 c0x0000 (---------------) + I bjugn + 0x000ffa08, // n0x16d1 c0x0000 (---------------) + blogspot + 0x00213204, // n0x16d2 c0x0000 (---------------) + I bodo + 0x003a4004, // n0x16d3 c0x0000 (---------------) + I bokn + 0x00210ac5, // n0x16d4 c0x0000 (---------------) + I bomlo + 0x0038c589, // n0x16d5 c0x0000 (---------------) + I bremanger + 0x00221247, // n0x16d6 c0x0000 (---------------) + I bronnoy + 0x0022124b, // n0x16d7 c0x0000 (---------------) + I bronnoysund + 0x0022260a, // n0x16d8 c0x0000 (---------------) + I brumunddal + 0x00228785, // n0x16d9 c0x0000 (---------------) + I bryne + 0x3d208642, // n0x16da c0x00f4 (n0x196a-n0x196b) + I bu + 0x00351247, // n0x16db c0x0000 (---------------) + I budejju + 0x3d62a108, // n0x16dc c0x00f5 (n0x196b-n0x196c) o I buskerud + 0x002b8007, // n0x16dd c0x0000 (---------------) + I bygland + 0x0022c3c5, // n0x16de c0x0000 (---------------) + I bykle + 0x00356fca, // n0x16df c0x0000 (---------------) + I cahcesuolo + 0x00000742, // n0x16e0 c0x0000 (---------------) + co + 0x002b70cb, // n0x16e1 c0x0000 (---------------) + I davvenjarga + 0x0021490a, // n0x16e2 c0x0000 (---------------) + I davvesiida + 0x0039c006, // n0x16e3 c0x0000 (---------------) + I deatnu + 0x00274143, // n0x16e4 c0x0000 (---------------) + I dep + 0x002381cd, // n0x16e5 c0x0000 (---------------) + I dielddanuorri + 0x00271f0c, // n0x16e6 c0x0000 (---------------) + I divtasvuodna + 0x003079cd, // n0x16e7 c0x0000 (---------------) + I divttasvuotna + 0x00365c05, // n0x16e8 c0x0000 (---------------) + I donna + 0x00243885, // n0x16e9 c0x0000 (---------------) + I dovre + 0x002edd47, // n0x16ea c0x0000 (---------------) + I drammen + 0x003458c9, // n0x16eb c0x0000 (---------------) + I drangedal + 0x00354946, // n0x16ec c0x0000 (---------------) + I drobak + 0x00311885, // n0x16ed c0x0000 (---------------) + I dyroy + 0x0022e2c8, // n0x16ee c0x0000 (---------------) + I egersund + 0x0028b043, // n0x16ef c0x0000 (---------------) + I eid + 0x003116c8, // n0x16f0 c0x0000 (---------------) + I eidfjord + 0x0028b048, // n0x16f1 c0x0000 (---------------) + I eidsberg + 0x002bce07, // n0x16f2 c0x0000 (---------------) + I eidskog + 0x002d8248, // n0x16f3 c0x0000 (---------------) + I eidsvoll + 0x003a6609, // n0x16f4 c0x0000 (---------------) + I eigersund + 0x0023c547, // n0x16f5 c0x0000 (---------------) + I elverum + 0x00209807, // n0x16f6 c0x0000 (---------------) + I enebakk + 0x00279a48, // n0x16f7 c0x0000 (---------------) + I engerdal + 0x002fecc4, // n0x16f8 c0x0000 (---------------) + I etne + 0x002fecc7, // n0x16f9 c0x0000 (---------------) + I etnedal + 0x00251f48, // n0x16fa c0x0000 (---------------) + I evenassi + 0x00202b46, // n0x16fb c0x0000 (---------------) + I evenes + 0x003a03cf, // n0x16fc c0x0000 (---------------) + I evje-og-hornnes + 0x00212987, // n0x16fd c0x0000 (---------------) + I farsund + 0x0024cc06, // n0x16fe c0x0000 (---------------) + I fauske + 0x002d77c5, // n0x16ff c0x0000 (---------------) + I fedje + 0x002159c3, // n0x1700 c0x0000 (---------------) + I fet + 0x0034b7c7, // n0x1701 c0x0000 (---------------) + I fetsund + 0x0023f343, // n0x1702 c0x0000 (---------------) + I fhs + 0x0024c546, // n0x1703 c0x0000 (---------------) + I finnoy + 0x0024f086, // n0x1704 c0x0000 (---------------) + I fitjar + 0x00250506, // n0x1705 c0x0000 (---------------) + I fjaler + 0x0028f845, // n0x1706 c0x0000 (---------------) + I fjell + 0x00267683, // n0x1707 c0x0000 (---------------) + I fla + 0x00380648, // n0x1708 c0x0000 (---------------) + I flakstad + 0x0036ce89, // n0x1709 c0x0000 (---------------) + I flatanger + 0x00364c8b, // n0x170a c0x0000 (---------------) + I flekkefjord + 0x00377308, // n0x170b c0x0000 (---------------) + I flesberg + 0x00252605, // n0x170c c0x0000 (---------------) + I flora + 0x00253105, // n0x170d c0x0000 (---------------) + I floro + 0x3da42902, // n0x170e c0x00f6 (n0x196c-n0x196d) + I fm + 0x0037be09, // n0x170f c0x0000 (---------------) + I folkebibl + 0x002558c7, // n0x1710 c0x0000 (---------------) + I folldal + 0x0039bf45, // n0x1711 c0x0000 (---------------) + I forde + 0x00259b07, // n0x1712 c0x0000 (---------------) + I forsand + 0x0025b746, // n0x1713 c0x0000 (---------------) + I fosnes + 0x0035dfc5, // n0x1714 c0x0000 (---------------) + I frana + 0x0036420b, // n0x1715 c0x0000 (---------------) + I fredrikstad + 0x0025c484, // n0x1716 c0x0000 (---------------) + I frei + 0x00263a85, // n0x1717 c0x0000 (---------------) + I frogn + 0x00263bc7, // n0x1718 c0x0000 (---------------) + I froland + 0x00276a06, // n0x1719 c0x0000 (---------------) + I frosta + 0x00276e45, // n0x171a c0x0000 (---------------) + I froya + 0x00283e87, // n0x171b c0x0000 (---------------) + I fuoisku + 0x00284ec7, // n0x171c c0x0000 (---------------) + I fuossko + 0x0028db04, // n0x171d c0x0000 (---------------) + I fusa + 0x00288cca, // n0x171e c0x0000 (---------------) + I fylkesbibl + 0x00289188, // n0x171f c0x0000 (---------------) + I fyresdal + 0x002cdcc9, // n0x1720 c0x0000 (---------------) + I gaivuotna + 0x0021dd45, // n0x1721 c0x0000 (---------------) + I galsa + 0x002b7306, // n0x1722 c0x0000 (---------------) + I gamvik + 0x0032258a, // n0x1723 c0x0000 (---------------) + I gangaviika + 0x00267cc6, // n0x1724 c0x0000 (---------------) + I gaular + 0x002b6187, // n0x1725 c0x0000 (---------------) + I gausdal + 0x002cd98d, // n0x1726 c0x0000 (---------------) + I giehtavuoatna + 0x00226cc9, // n0x1727 c0x0000 (---------------) + I gildeskal + 0x00328b05, // n0x1728 c0x0000 (---------------) + I giske + 0x00310047, // n0x1729 c0x0000 (---------------) + I gjemnes + 0x003279c8, // n0x172a c0x0000 (---------------) + I gjerdrum + 0x0032f588, // n0x172b c0x0000 (---------------) + I gjerstad + 0x00249607, // n0x172c c0x0000 (---------------) + I gjesdal + 0x00249e46, // n0x172d c0x0000 (---------------) + I gjovik + 0x00212b87, // n0x172e c0x0000 (---------------) + I gloppen + 0x0024dbc3, // n0x172f c0x0000 (---------------) + I gol + 0x00334544, // n0x1730 c0x0000 (---------------) + I gran + 0x0035bc85, // n0x1731 c0x0000 (---------------) + I grane + 0x00384e47, // n0x1732 c0x0000 (---------------) + I granvin + 0x00388b09, // n0x1733 c0x0000 (---------------) + I gratangen + 0x0022d248, // n0x1734 c0x0000 (---------------) + I grimstad + 0x002b6085, // n0x1735 c0x0000 (---------------) + I grong + 0x0039a744, // n0x1736 c0x0000 (---------------) + I grue + 0x0035d2c5, // n0x1737 c0x0000 (---------------) + I gulen + 0x0025334d, // n0x1738 c0x0000 (---------------) + I guovdageaidnu + 0x00202442, // n0x1739 c0x0000 (---------------) + I ha + 0x002c9b86, // n0x173a c0x0000 (---------------) + I habmer + 0x0026b9c6, // n0x173b c0x0000 (---------------) + I hadsel + 0x002a5e4a, // n0x173c c0x0000 (---------------) + I hagebostad + 0x0035f386, // n0x173d c0x0000 (---------------) + I halden + 0x0036d3c5, // n0x173e c0x0000 (---------------) + I halsa + 0x0025e745, // n0x173f c0x0000 (---------------) + I hamar + 0x0025e747, // n0x1740 c0x0000 (---------------) + I hamaroy + 0x0037558c, // n0x1741 c0x0000 (---------------) + I hammarfeasta + 0x0033c28a, // n0x1742 c0x0000 (---------------) + I hammerfest + 0x0028aa06, // n0x1743 c0x0000 (---------------) + I hapmir + 0x002cfb05, // n0x1744 c0x0000 (---------------) + I haram + 0x0028af86, // n0x1745 c0x0000 (---------------) + I hareid + 0x0028b2c7, // n0x1746 c0x0000 (---------------) + I harstad + 0x0028c606, // n0x1747 c0x0000 (---------------) + I hasvik + 0x0028f74c, // n0x1748 c0x0000 (---------------) + I hattfjelldal + 0x00204f49, // n0x1749 c0x0000 (---------------) + I haugesund + 0x3de36587, // n0x174a c0x00f7 (n0x196d-n0x1970) o I hedmark + 0x002910c5, // n0x174b c0x0000 (---------------) + I hemne + 0x002910c6, // n0x174c c0x0000 (---------------) + I hemnes + 0x00291d48, // n0x174d c0x0000 (---------------) + I hemsedal + 0x00232305, // n0x174e c0x0000 (---------------) + I herad + 0x002a4585, // n0x174f c0x0000 (---------------) + I hitra + 0x002a47c8, // n0x1750 c0x0000 (---------------) + I hjartdal + 0x002a49ca, // n0x1751 c0x0000 (---------------) + I hjelmeland + 0x3e248fc2, // n0x1752 c0x00f8 (n0x1970-n0x1971) + I hl + 0x3e60e942, // n0x1753 c0x00f9 (n0x1971-n0x1972) + I hm + 0x00378245, // n0x1754 c0x0000 (---------------) + I hobol + 0x002d7743, // n0x1755 c0x0000 (---------------) + I hof + 0x003a4508, // n0x1756 c0x0000 (---------------) + I hokksund + 0x0023ce83, // n0x1757 c0x0000 (---------------) + I hol + 0x002a4c44, // n0x1758 c0x0000 (---------------) + I hole + 0x002a814b, // n0x1759 c0x0000 (---------------) + I holmestrand + 0x002ae1c8, // n0x175a c0x0000 (---------------) + I holtalen + 0x002a7ac8, // n0x175b c0x0000 (---------------) + I honefoss + 0x3eb1a749, // n0x175c c0x00fa (n0x1972-n0x1973) o I hordaland + 0x002a8f89, // n0x175d c0x0000 (---------------) + I hornindal + 0x002a9406, // n0x175e c0x0000 (---------------) + I horten + 0x002aa188, // n0x175f c0x0000 (---------------) + I hoyanger + 0x002aa389, // n0x1760 c0x0000 (---------------) + I hoylandet + 0x002ab246, // n0x1761 c0x0000 (---------------) + I hurdal + 0x002ab3c5, // n0x1762 c0x0000 (---------------) + I hurum + 0x00363586, // n0x1763 c0x0000 (---------------) + I hvaler + 0x002ab849, // n0x1764 c0x0000 (---------------) + I hyllestad + 0x00229187, // n0x1765 c0x0000 (---------------) + I ibestad + 0x0026dd46, // n0x1766 c0x0000 (---------------) + I idrett + 0x002e7747, // n0x1767 c0x0000 (---------------) + I inderoy + 0x003547c7, // n0x1768 c0x0000 (---------------) + I iveland + 0x0023fcc4, // n0x1769 c0x0000 (---------------) + I ivgu + 0x3ee1cfc9, // n0x176a c0x00fb (n0x1973-n0x1974) + I jan-mayen + 0x002c57c8, // n0x176b c0x0000 (---------------) + I jessheim + 0x00358388, // n0x176c c0x0000 (---------------) + I jevnaker + 0x00343c87, // n0x176d c0x0000 (---------------) + I jolster + 0x002c1046, // n0x176e c0x0000 (---------------) + I jondal + 0x002fc709, // n0x176f c0x0000 (---------------) + I jorpeland + 0x002bc3c7, // n0x1770 c0x0000 (---------------) + I kafjord + 0x0024fd0a, // n0x1771 c0x0000 (---------------) + I karasjohka + 0x0037dbc8, // n0x1772 c0x0000 (---------------) + I karasjok + 0x00330887, // n0x1773 c0x0000 (---------------) + I karlsoy + 0x00229586, // n0x1774 c0x0000 (---------------) + I karmoy + 0x002650ca, // n0x1775 c0x0000 (---------------) + I kautokeino + 0x0027e3c8, // n0x1776 c0x0000 (---------------) + I kirkenes + 0x0026b445, // n0x1777 c0x0000 (---------------) + I klabu + 0x00374f05, // n0x1778 c0x0000 (---------------) + I klepp + 0x00387dc7, // n0x1779 c0x0000 (---------------) + I kommune + 0x002bfb09, // n0x177a c0x0000 (---------------) + I kongsberg + 0x002c478b, // n0x177b c0x0000 (---------------) + I kongsvinger + 0x002d6808, // n0x177c c0x0000 (---------------) + I kopervik + 0x00255509, // n0x177d c0x0000 (---------------) + I kraanghke + 0x00250787, // n0x177e c0x0000 (---------------) + I kragero + 0x002af50c, // n0x177f c0x0000 (---------------) + I kristiansand + 0x002b01cc, // n0x1780 c0x0000 (---------------) + I kristiansund + 0x002b04ca, // n0x1781 c0x0000 (---------------) + I krodsherad + 0x002b074c, // n0x1782 c0x0000 (---------------) + I krokstadelva + 0x002bb408, // n0x1783 c0x0000 (---------------) + I kvafjord + 0x002bb608, // n0x1784 c0x0000 (---------------) + I kvalsund + 0x002bb804, // n0x1785 c0x0000 (---------------) + I kvam + 0x002bc589, // n0x1786 c0x0000 (---------------) + I kvanangen + 0x002bc7c9, // n0x1787 c0x0000 (---------------) + I kvinesdal + 0x002bca0a, // n0x1788 c0x0000 (---------------) + I kvinnherad + 0x002bcc89, // n0x1789 c0x0000 (---------------) + I kviteseid + 0x002bcfc7, // n0x178a c0x0000 (---------------) + I kvitsoy + 0x003a4dcc, // n0x178b c0x0000 (---------------) + I laakesvuemie + 0x00338186, // n0x178c c0x0000 (---------------) + I lahppi + 0x00258008, // n0x178d c0x0000 (---------------) + I langevag + 0x00267d86, // n0x178e c0x0000 (---------------) + I lardal + 0x0037f706, // n0x178f c0x0000 (---------------) + I larvik + 0x00328a07, // n0x1790 c0x0000 (---------------) + I lavagis + 0x00272688, // n0x1791 c0x0000 (---------------) + I lavangen + 0x00331a4b, // n0x1792 c0x0000 (---------------) + I leangaviika + 0x002b7ec7, // n0x1793 c0x0000 (---------------) + I lebesby + 0x002598c9, // n0x1794 c0x0000 (---------------) + I leikanger + 0x0035e489, // n0x1795 c0x0000 (---------------) + I leirfjord + 0x00296d87, // n0x1796 c0x0000 (---------------) + I leirvik + 0x002bbac4, // n0x1797 c0x0000 (---------------) + I leka + 0x002bf987, // n0x1798 c0x0000 (---------------) + I leksvik + 0x003562c6, // n0x1799 c0x0000 (---------------) + I lenvik + 0x00217606, // n0x179a c0x0000 (---------------) + I lerdal + 0x0031f845, // n0x179b c0x0000 (---------------) + I lesja + 0x00219f88, // n0x179c c0x0000 (---------------) + I levanger + 0x002ddf44, // n0x179d c0x0000 (---------------) + I lier + 0x002ddf46, // n0x179e c0x0000 (---------------) + I lierne + 0x0033c14b, // n0x179f c0x0000 (---------------) + I lillehammer + 0x00330089, // n0x17a0 c0x0000 (---------------) + I lillesand + 0x00322dc6, // n0x17a1 c0x0000 (---------------) + I lindas + 0x00345ac9, // n0x17a2 c0x0000 (---------------) + I lindesnes + 0x00389286, // n0x17a3 c0x0000 (---------------) + I loabat + 0x00259dc8, // n0x17a4 c0x0000 (---------------) + I lodingen + 0x00214303, // n0x17a5 c0x0000 (---------------) + I lom + 0x00390905, // n0x17a6 c0x0000 (---------------) + I loppa + 0x00216209, // n0x17a7 c0x0000 (---------------) + I lorenskog + 0x00217745, // n0x17a8 c0x0000 (---------------) + I loten + 0x002fb344, // n0x17a9 c0x0000 (---------------) + I lund + 0x00275306, // n0x17aa c0x0000 (---------------) + I lunner + 0x00378ec5, // n0x17ab c0x0000 (---------------) + I luroy + 0x002dcb06, // n0x17ac c0x0000 (---------------) + I luster + 0x002fccc7, // n0x17ad c0x0000 (---------------) + I lyngdal + 0x00213606, // n0x17ae c0x0000 (---------------) + I lyngen + 0x00298bcb, // n0x17af c0x0000 (---------------) + I malatvuopmi + 0x002e4e47, // n0x17b0 c0x0000 (---------------) + I malselv + 0x00205c86, // n0x17b1 c0x0000 (---------------) + I malvik + 0x0034fcc6, // n0x17b2 c0x0000 (---------------) + I mandal + 0x00234bc6, // n0x17b3 c0x0000 (---------------) + I marker + 0x0032fe89, // n0x17b4 c0x0000 (---------------) + I marnardal + 0x0021ed8a, // n0x17b5 c0x0000 (---------------) + I masfjorden + 0x0032a985, // n0x17b6 c0x0000 (---------------) + I masoy + 0x0022080d, // n0x17b7 c0x0000 (---------------) + I matta-varjjat + 0x002a4ac6, // n0x17b8 c0x0000 (---------------) + I meland + 0x002160c6, // n0x17b9 c0x0000 (---------------) + I meldal + 0x00291886, // n0x17ba c0x0000 (---------------) + I melhus + 0x002a7e05, // n0x17bb c0x0000 (---------------) + I meloy + 0x0037c7c7, // n0x17bc c0x0000 (---------------) + I meraker + 0x0029d687, // n0x17bd c0x0000 (---------------) + I midsund + 0x002e5e0e, // n0x17be c0x0000 (---------------) + I midtre-gauldal + 0x00209003, // n0x17bf c0x0000 (---------------) + I mil + 0x002c1009, // n0x17c0 c0x0000 (---------------) + I mjondalen + 0x00239209, // n0x17c1 c0x0000 (---------------) + I mo-i-rana + 0x00228e87, // n0x17c2 c0x0000 (---------------) + I moareke + 0x0026c087, // n0x17c3 c0x0000 (---------------) + I modalen + 0x002a67c5, // n0x17c4 c0x0000 (---------------) + I modum + 0x00325445, // n0x17c5 c0x0000 (---------------) + I molde + 0x3f25d3cf, // n0x17c6 c0x00fc (n0x1974-n0x1976) o I more-og-romsdal + 0x002c7f87, // n0x17c7 c0x0000 (---------------) + I mosjoen + 0x002c8148, // n0x17c8 c0x0000 (---------------) + I moskenes + 0x002c8884, // n0x17c9 c0x0000 (---------------) + I moss + 0x002c8c46, // n0x17ca c0x0000 (---------------) + I mosvik + 0x3f64aa02, // n0x17cb c0x00fd (n0x1976-n0x1977) + I mr + 0x002cc2c6, // n0x17cc c0x0000 (---------------) + I muosat + 0x002d0106, // n0x17cd c0x0000 (---------------) + I museum + 0x00331d8e, // n0x17ce c0x0000 (---------------) + I naamesjevuemie + 0x0031150a, // n0x17cf c0x0000 (---------------) + I namdalseid + 0x002b57c6, // n0x17d0 c0x0000 (---------------) + I namsos + 0x002261ca, // n0x17d1 c0x0000 (---------------) + I namsskogan + 0x002c3349, // n0x17d2 c0x0000 (---------------) + I nannestad + 0x00315d45, // n0x17d3 c0x0000 (---------------) + I naroy + 0x0038ac08, // n0x17d4 c0x0000 (---------------) + I narviika + 0x003a29c6, // n0x17d5 c0x0000 (---------------) + I narvik + 0x00255008, // n0x17d6 c0x0000 (---------------) + I naustdal + 0x0031a1c8, // n0x17d7 c0x0000 (---------------) + I navuotna + 0x0030930b, // n0x17d8 c0x0000 (---------------) + I nedre-eiker + 0x00222e05, // n0x17d9 c0x0000 (---------------) + I nesna + 0x00331188, // n0x17da c0x0000 (---------------) + I nesodden + 0x0020560c, // n0x17db c0x0000 (---------------) + I nesoddtangen + 0x0022c287, // n0x17dc c0x0000 (---------------) + I nesseby + 0x0024f8c6, // n0x17dd c0x0000 (---------------) + I nesset + 0x00230048, // n0x17de c0x0000 (---------------) + I nissedal + 0x00279d48, // n0x17df c0x0000 (---------------) + I nittedal + 0x3fa47802, // n0x17e0 c0x00fe (n0x1977-n0x1978) + I nl + 0x002bbccb, // n0x17e1 c0x0000 (---------------) + I nord-aurdal + 0x00397f89, // n0x17e2 c0x0000 (---------------) + I nord-fron + 0x0034c449, // n0x17e3 c0x0000 (---------------) + I nord-odal + 0x00328887, // n0x17e4 c0x0000 (---------------) + I norddal + 0x00249408, // n0x17e5 c0x0000 (---------------) + I nordkapp + 0x3ff45708, // n0x17e6 c0x00ff (n0x1978-n0x197c) o I nordland + 0x0025f08b, // n0x17e7 c0x0000 (---------------) + I nordre-land + 0x0028e409, // n0x17e8 c0x0000 (---------------) + I nordreisa + 0x0021000d, // n0x17e9 c0x0000 (---------------) + I nore-og-uvdal + 0x002547c8, // n0x17ea c0x0000 (---------------) + I notodden + 0x0032c588, // n0x17eb c0x0000 (---------------) + I notteroy + 0x402009c2, // n0x17ec c0x0100 (n0x197c-n0x197d) + I nt + 0x00202d84, // n0x17ed c0x0000 (---------------) + I odda + 0x4060b282, // n0x17ee c0x0101 (n0x197d-n0x197e) + I of + 0x0037dd46, // n0x17ef c0x0000 (---------------) + I oksnes + 0x40a02242, // n0x17f0 c0x0102 (n0x197e-n0x197f) + I ol + 0x0037a0ca, // n0x17f1 c0x0000 (---------------) + I omasvuotna + 0x00352086, // n0x17f2 c0x0000 (---------------) + I oppdal + 0x00225388, // n0x17f3 c0x0000 (---------------) + I oppegard + 0x00255c88, // n0x17f4 c0x0000 (---------------) + I orkanger + 0x002f2686, // n0x17f5 c0x0000 (---------------) + I orkdal + 0x00338a46, // n0x17f6 c0x0000 (---------------) + I orland + 0x002e5306, // n0x17f7 c0x0000 (---------------) + I orskog + 0x0027b0c5, // n0x17f8 c0x0000 (---------------) + I orsta + 0x00240e44, // n0x17f9 c0x0000 (---------------) + I osen + 0x40ec40c4, // n0x17fa c0x0103 (n0x197f-n0x1980) + I oslo + 0x00334ec6, // n0x17fb c0x0000 (---------------) + I osoyro + 0x002510c7, // n0x17fc c0x0000 (---------------) + I osteroy + 0x4139f9c7, // n0x17fd c0x0104 (n0x1980-n0x1981) o I ostfold + 0x002d968b, // n0x17fe c0x0000 (---------------) + I ostre-toten + 0x0025e1c9, // n0x17ff c0x0000 (---------------) + I overhalla + 0x002438ca, // n0x1800 c0x0000 (---------------) + I ovre-eiker + 0x003173c4, // n0x1801 c0x0000 (---------------) + I oyer + 0x0025e888, // n0x1802 c0x0000 (---------------) + I oygarden + 0x0026db0d, // n0x1803 c0x0000 (---------------) + I oystre-slidre + 0x002e0209, // n0x1804 c0x0000 (---------------) + I porsanger + 0x002e0448, // n0x1805 c0x0000 (---------------) + I porsangu + 0x002e06c9, // n0x1806 c0x0000 (---------------) + I porsgrunn + 0x002e1c44, // n0x1807 c0x0000 (---------------) + I priv + 0x00204d04, // n0x1808 c0x0000 (---------------) + I rade + 0x0027ec05, // n0x1809 c0x0000 (---------------) + I radoy + 0x0027720b, // n0x180a c0x0000 (---------------) + I rahkkeravju + 0x002ae146, // n0x180b c0x0000 (---------------) + I raholt + 0x00334d05, // n0x180c c0x0000 (---------------) + I raisa + 0x0037c0c9, // n0x180d c0x0000 (---------------) + I rakkestad + 0x00223008, // n0x180e c0x0000 (---------------) + I ralingen + 0x00239344, // n0x180f c0x0000 (---------------) + I rana + 0x00228c09, // n0x1810 c0x0000 (---------------) + I randaberg + 0x00248c45, // n0x1811 c0x0000 (---------------) + I rauma + 0x002b8808, // n0x1812 c0x0000 (---------------) + I rendalen + 0x00209ec7, // n0x1813 c0x0000 (---------------) + I rennebu + 0x0030fb88, // n0x1814 c0x0000 (---------------) + I rennesoy + 0x0027f1c6, // n0x1815 c0x0000 (---------------) + I rindal + 0x00351107, // n0x1816 c0x0000 (---------------) + I ringebu + 0x0020e509, // n0x1817 c0x0000 (---------------) + I ringerike + 0x0023a189, // n0x1818 c0x0000 (---------------) + I ringsaker + 0x00277985, // n0x1819 c0x0000 (---------------) + I risor + 0x00238845, // n0x181a c0x0000 (---------------) + I rissa + 0x4162b682, // n0x181b c0x0105 (n0x1981-n0x1982) + I rl + 0x002fab84, // n0x181c c0x0000 (---------------) + I roan + 0x0029d105, // n0x181d c0x0000 (---------------) + I rodoy + 0x002cd3c6, // n0x181e c0x0000 (---------------) + I rollag + 0x00318545, // n0x181f c0x0000 (---------------) + I romsa + 0x002531c7, // n0x1820 c0x0000 (---------------) + I romskog + 0x00296bc5, // n0x1821 c0x0000 (---------------) + I roros + 0x00276a44, // n0x1822 c0x0000 (---------------) + I rost + 0x00326c86, // n0x1823 c0x0000 (---------------) + I royken + 0x00311907, // n0x1824 c0x0000 (---------------) + I royrvik + 0x0024aa46, // n0x1825 c0x0000 (---------------) + I ruovat + 0x003305c5, // n0x1826 c0x0000 (---------------) + I rygge + 0x00321248, // n0x1827 c0x0000 (---------------) + I salangen + 0x00223585, // n0x1828 c0x0000 (---------------) + I salat + 0x00322c47, // n0x1829 c0x0000 (---------------) + I saltdal + 0x0038ec09, // n0x182a c0x0000 (---------------) + I samnanger + 0x003301ca, // n0x182b c0x0000 (---------------) + I sandefjord + 0x0022e9c7, // n0x182c c0x0000 (---------------) + I sandnes + 0x0022e9cc, // n0x182d c0x0000 (---------------) + I sandnessjoen + 0x00259606, // n0x182e c0x0000 (---------------) + I sandoy + 0x0022d049, // n0x182f c0x0000 (---------------) + I sarpsborg + 0x002314c5, // n0x1830 c0x0000 (---------------) + I sauda + 0x00232248, // n0x1831 c0x0000 (---------------) + I sauherad + 0x00210703, // n0x1832 c0x0000 (---------------) + I sel + 0x00210705, // n0x1833 c0x0000 (---------------) + I selbu + 0x00329905, // n0x1834 c0x0000 (---------------) + I selje + 0x0024d147, // n0x1835 c0x0000 (---------------) + I seljord + 0x41a11cc2, // n0x1836 c0x0106 (n0x1982-n0x1983) + I sf + 0x002434c7, // n0x1837 c0x0000 (---------------) + I siellak + 0x002cb986, // n0x1838 c0x0000 (---------------) + I sigdal + 0x0021cf06, // n0x1839 c0x0000 (---------------) + I siljan + 0x0034d886, // n0x183a c0x0000 (---------------) + I sirdal + 0x00279c86, // n0x183b c0x0000 (---------------) + I skanit + 0x00307808, // n0x183c c0x0000 (---------------) + I skanland + 0x002d8085, // n0x183d c0x0000 (---------------) + I skaun + 0x0024ccc7, // n0x183e c0x0000 (---------------) + I skedsmo + 0x0024cccd, // n0x183f c0x0000 (---------------) + I skedsmokorset + 0x00209743, // n0x1840 c0x0000 (---------------) + I ski + 0x00209745, // n0x1841 c0x0000 (---------------) + I skien + 0x002279c7, // n0x1842 c0x0000 (---------------) + I skierva + 0x002d1b48, // n0x1843 c0x0000 (---------------) + I skiptvet + 0x00227585, // n0x1844 c0x0000 (---------------) + I skjak + 0x00230ec8, // n0x1845 c0x0000 (---------------) + I skjervoy + 0x00266946, // n0x1846 c0x0000 (---------------) + I skodje + 0x0023e487, // n0x1847 c0x0000 (---------------) + I slattum + 0x002c0645, // n0x1848 c0x0000 (---------------) + I smola + 0x00222e86, // n0x1849 c0x0000 (---------------) + I snaase + 0x003604c5, // n0x184a c0x0000 (---------------) + I snasa + 0x002bae0a, // n0x184b c0x0000 (---------------) + I snillfjord + 0x002d9146, // n0x184c c0x0000 (---------------) + I snoasa + 0x0023c8c7, // n0x184d c0x0000 (---------------) + I sogndal + 0x002af145, // n0x184e c0x0000 (---------------) + I sogne + 0x002e2f47, // n0x184f c0x0000 (---------------) + I sokndal + 0x00359f04, // n0x1850 c0x0000 (---------------) + I sola + 0x002fb2c6, // n0x1851 c0x0000 (---------------) + I solund + 0x0037de85, // n0x1852 c0x0000 (---------------) + I somna + 0x0022be8b, // n0x1853 c0x0000 (---------------) + I sondre-land + 0x00356149, // n0x1854 c0x0000 (---------------) + I songdalen + 0x00378c8a, // n0x1855 c0x0000 (---------------) + I sor-aurdal + 0x00277a08, // n0x1856 c0x0000 (---------------) + I sor-fron + 0x002f43c8, // n0x1857 c0x0000 (---------------) + I sor-odal + 0x002f69cc, // n0x1858 c0x0000 (---------------) + I sor-varanger + 0x002fbfc7, // n0x1859 c0x0000 (---------------) + I sorfold + 0x002fd8c8, // n0x185a c0x0000 (---------------) + I sorreisa + 0x00301f88, // n0x185b c0x0000 (---------------) + I sortland + 0x003057c5, // n0x185c c0x0000 (---------------) + I sorum + 0x002bd24a, // n0x185d c0x0000 (---------------) + I spjelkavik + 0x003347c9, // n0x185e c0x0000 (---------------) + I spydeberg + 0x41e02742, // n0x185f c0x0107 (n0x1983-n0x1984) + I st + 0x00202746, // n0x1860 c0x0000 (---------------) + I stange + 0x0020f204, // n0x1861 c0x0000 (---------------) + I stat + 0x002ded49, // n0x1862 c0x0000 (---------------) + I stathelle + 0x002f35c9, // n0x1863 c0x0000 (---------------) + I stavanger + 0x00225047, // n0x1864 c0x0000 (---------------) + I stavern + 0x00251a47, // n0x1865 c0x0000 (---------------) + I steigen + 0x002833c9, // n0x1866 c0x0000 (---------------) + I steinkjer + 0x0038e808, // n0x1867 c0x0000 (---------------) + I stjordal + 0x0038e80f, // n0x1868 c0x0000 (---------------) + I stjordalshalsen + 0x00275e46, // n0x1869 c0x0000 (---------------) + I stokke + 0x0024688b, // n0x186a c0x0000 (---------------) + I stor-elvdal + 0x0037d0c5, // n0x186b c0x0000 (---------------) + I stord + 0x0037d0c7, // n0x186c c0x0000 (---------------) + I stordal + 0x002e6f89, // n0x186d c0x0000 (---------------) + I storfjord + 0x00228b86, // n0x186e c0x0000 (---------------) + I strand + 0x00228b87, // n0x186f c0x0000 (---------------) + I stranda + 0x0039e5c5, // n0x1870 c0x0000 (---------------) + I stryn + 0x00237304, // n0x1871 c0x0000 (---------------) + I sula + 0x002402c6, // n0x1872 c0x0000 (---------------) + I suldal + 0x00205084, // n0x1873 c0x0000 (---------------) + I sund + 0x0030a587, // n0x1874 c0x0000 (---------------) + I sunndal + 0x002e8fc8, // n0x1875 c0x0000 (---------------) + I surnadal + 0x422ef688, // n0x1876 c0x0108 (n0x1984-n0x1985) + I svalbard + 0x002efc85, // n0x1877 c0x0000 (---------------) + I sveio + 0x002efdc7, // n0x1878 c0x0000 (---------------) + I svelvik + 0x00375cc9, // n0x1879 c0x0000 (---------------) + I sykkylven + 0x00206cc4, // n0x187a c0x0000 (---------------) + I tana + 0x00206cc8, // n0x187b c0x0000 (---------------) + I tananger + 0x42664f08, // n0x187c c0x0109 (n0x1985-n0x1987) o I telemark + 0x00269804, // n0x187d c0x0000 (---------------) + I time + 0x00237e88, // n0x187e c0x0000 (---------------) + I tingvoll + 0x002ea3c4, // n0x187f c0x0000 (---------------) + I tinn + 0x00226789, // n0x1880 c0x0000 (---------------) + I tjeldsund + 0x0026cec5, // n0x1881 c0x0000 (---------------) + I tjome + 0x42a00142, // n0x1882 c0x010a (n0x1987-n0x1988) + I tm + 0x00275e85, // n0x1883 c0x0000 (---------------) + I tokke + 0x0021dc85, // n0x1884 c0x0000 (---------------) + I tolga + 0x003661c8, // n0x1885 c0x0000 (---------------) + I tonsberg + 0x0023b587, // n0x1886 c0x0000 (---------------) + I torsken + 0x42e03002, // n0x1887 c0x010b (n0x1988-n0x1989) + I tr + 0x002c9d45, // n0x1888 c0x0000 (---------------) + I trana + 0x00274dc6, // n0x1889 c0x0000 (---------------) + I tranby + 0x00292546, // n0x188a c0x0000 (---------------) + I tranoy + 0x002fab48, // n0x188b c0x0000 (---------------) + I troandin + 0x002ffbc8, // n0x188c c0x0000 (---------------) + I trogstad + 0x00318506, // n0x188d c0x0000 (---------------) + I tromsa + 0x00323bc6, // n0x188e c0x0000 (---------------) + I tromso + 0x00352589, // n0x188f c0x0000 (---------------) + I trondheim + 0x00341ec6, // n0x1890 c0x0000 (---------------) + I trysil + 0x00356ccb, // n0x1891 c0x0000 (---------------) + I tvedestrand + 0x0024f6c5, // n0x1892 c0x0000 (---------------) + I tydal + 0x00219b46, // n0x1893 c0x0000 (---------------) + I tynset + 0x00215a48, // n0x1894 c0x0000 (---------------) + I tysfjord + 0x002336c6, // n0x1895 c0x0000 (---------------) + I tysnes + 0x00235ec6, // n0x1896 c0x0000 (---------------) + I tysvar + 0x0021518a, // n0x1897 c0x0000 (---------------) + I ullensaker + 0x0034440a, // n0x1898 c0x0000 (---------------) + I ullensvang + 0x0028acc5, // n0x1899 c0x0000 (---------------) + I ulvik + 0x002c7a87, // n0x189a c0x0000 (---------------) + I unjarga + 0x00341946, // n0x189b c0x0000 (---------------) + I utsira + 0x432000c2, // n0x189c c0x010c (n0x1989-n0x198a) + I va + 0x00227b07, // n0x189d c0x0000 (---------------) + I vaapste + 0x00274745, // n0x189e c0x0000 (---------------) + I vadso + 0x00322504, // n0x189f c0x0000 (---------------) + I vaga + 0x00322505, // n0x18a0 c0x0000 (---------------) + I vagan + 0x003172c6, // n0x18a1 c0x0000 (---------------) + I vagsoy + 0x0032cec7, // n0x18a2 c0x0000 (---------------) + I vaksdal + 0x00217105, // n0x18a3 c0x0000 (---------------) + I valle + 0x0021a004, // n0x18a4 c0x0000 (---------------) + I vang + 0x0026f108, // n0x18a5 c0x0000 (---------------) + I vanylven + 0x00235f85, // n0x18a6 c0x0000 (---------------) + I vardo + 0x002923c7, // n0x18a7 c0x0000 (---------------) + I varggat + 0x002f0545, // n0x18a8 c0x0000 (---------------) + I varoy + 0x002140c5, // n0x18a9 c0x0000 (---------------) + I vefsn + 0x00230284, // n0x18aa c0x0000 (---------------) + I vega + 0x0028a309, // n0x18ab c0x0000 (---------------) + I vegarshei + 0x002e29c8, // n0x18ac c0x0000 (---------------) + I vennesla + 0x00374106, // n0x18ad c0x0000 (---------------) + I verdal + 0x0033f346, // n0x18ae c0x0000 (---------------) + I verran + 0x00269506, // n0x18af c0x0000 (---------------) + I vestby + 0x4379aa48, // n0x18b0 c0x010d (n0x198a-n0x198b) o I vestfold + 0x002f3807, // n0x18b1 c0x0000 (---------------) + I vestnes + 0x002f3e8d, // n0x18b2 c0x0000 (---------------) + I vestre-slidre + 0x002f45cc, // n0x18b3 c0x0000 (---------------) + I vestre-toten + 0x002f4bc9, // n0x18b4 c0x0000 (---------------) + I vestvagoy + 0x002f4e09, // n0x18b5 c0x0000 (---------------) + I vevelstad + 0x43b4f482, // n0x18b6 c0x010e (n0x198b-n0x198c) + I vf + 0x00399d43, // n0x18b7 c0x0000 (---------------) + I vgs + 0x00205d43, // n0x18b8 c0x0000 (---------------) + I vik + 0x00356385, // n0x18b9 c0x0000 (---------------) + I vikna + 0x00384f4a, // n0x18ba c0x0000 (---------------) + I vindafjord + 0x003183c6, // n0x18bb c0x0000 (---------------) + I voagat + 0x002f9845, // n0x18bc c0x0000 (---------------) + I volda + 0x002fd204, // n0x18bd c0x0000 (---------------) + I voss + 0x002fd20b, // n0x18be c0x0000 (---------------) + I vossevangen + 0x0030d90c, // n0x18bf c0x0000 (---------------) + I xn--andy-ira + 0x0030e14c, // n0x18c0 c0x0000 (---------------) + I xn--asky-ira + 0x0030e455, // n0x18c1 c0x0000 (---------------) + I xn--aurskog-hland-jnb + 0x003104cd, // n0x18c2 c0x0000 (---------------) + I xn--avery-yua + 0x003128cf, // n0x18c3 c0x0000 (---------------) + I xn--bdddj-mrabd + 0x00312c92, // n0x18c4 c0x0000 (---------------) + I xn--bearalvhki-y4a + 0x0031310f, // n0x18c5 c0x0000 (---------------) + I xn--berlevg-jxa + 0x003134d2, // n0x18c6 c0x0000 (---------------) + I xn--bhcavuotna-s4a + 0x00313953, // n0x18c7 c0x0000 (---------------) + I xn--bhccavuotna-k7a + 0x00313e0d, // n0x18c8 c0x0000 (---------------) + I xn--bidr-5nac + 0x003143cd, // n0x18c9 c0x0000 (---------------) + I xn--bievt-0qa + 0x0031474e, // n0x18ca c0x0000 (---------------) + I xn--bjarky-fya + 0x00314c0e, // n0x18cb c0x0000 (---------------) + I xn--bjddar-pta + 0x0031534c, // n0x18cc c0x0000 (---------------) + I xn--blt-elab + 0x003156cc, // n0x18cd c0x0000 (---------------) + I xn--bmlo-gra + 0x00315b0b, // n0x18ce c0x0000 (---------------) + I xn--bod-2na + 0x00315e8e, // n0x18cf c0x0000 (---------------) + I xn--brnny-wuac + 0x003178d2, // n0x18d0 c0x0000 (---------------) + I xn--brnnysund-m8ac + 0x0031818c, // n0x18d1 c0x0000 (---------------) + I xn--brum-voa + 0x003188d0, // n0x18d2 c0x0000 (---------------) + I xn--btsfjord-9za + 0x00329d52, // n0x18d3 c0x0000 (---------------) + I xn--davvenjrga-y4a + 0x0032aacc, // n0x18d4 c0x0000 (---------------) + I xn--dnna-gra + 0x0032b18d, // n0x18d5 c0x0000 (---------------) + I xn--drbak-wua + 0x0032b4cc, // n0x18d6 c0x0000 (---------------) + I xn--dyry-ira + 0x0032d351, // n0x18d7 c0x0000 (---------------) + I xn--eveni-0qa01ga + 0x0032e1cd, // n0x18d8 c0x0000 (---------------) + I xn--finny-yua + 0x0033318d, // n0x18d9 c0x0000 (---------------) + I xn--fjord-lra + 0x0033378a, // n0x18da c0x0000 (---------------) + I xn--fl-zia + 0x00333a0c, // n0x18db c0x0000 (---------------) + I xn--flor-jra + 0x0033430c, // n0x18dc c0x0000 (---------------) + I xn--frde-gra + 0x00334a0c, // n0x18dd c0x0000 (---------------) + I xn--frna-woa + 0x0033528c, // n0x18de c0x0000 (---------------) + I xn--frya-hra + 0x00338bd3, // n0x18df c0x0000 (---------------) + I xn--ggaviika-8ya47h + 0x003391d0, // n0x18e0 c0x0000 (---------------) + I xn--gildeskl-g0a + 0x003395d0, // n0x18e1 c0x0000 (---------------) + I xn--givuotna-8ya + 0x0033a24d, // n0x18e2 c0x0000 (---------------) + I xn--gjvik-wua + 0x0033a84c, // n0x18e3 c0x0000 (---------------) + I xn--gls-elac + 0x0033b449, // n0x18e4 c0x0000 (---------------) + I xn--h-2fa + 0x0033da4d, // n0x18e5 c0x0000 (---------------) + I xn--hbmer-xqa + 0x0033dd93, // n0x18e6 c0x0000 (---------------) + I xn--hcesuolo-7ya35b + 0x0033e991, // n0x18e7 c0x0000 (---------------) + I xn--hgebostad-g3a + 0x0033edd3, // n0x18e8 c0x0000 (---------------) + I xn--hmmrfeasta-s4ac + 0x0033f58f, // n0x18e9 c0x0000 (---------------) + I xn--hnefoss-q1a + 0x0033f94c, // n0x18ea c0x0000 (---------------) + I xn--hobl-ira + 0x0033fc4f, // n0x18eb c0x0000 (---------------) + I xn--holtlen-hxa + 0x0034000d, // n0x18ec c0x0000 (---------------) + I xn--hpmir-xqa + 0x0034060f, // n0x18ed c0x0000 (---------------) + I xn--hyanger-q1a + 0x003409d0, // n0x18ee c0x0000 (---------------) + I xn--hylandet-54a + 0x0034144e, // n0x18ef c0x0000 (---------------) + I xn--indery-fya + 0x00346c4e, // n0x18f0 c0x0000 (---------------) + I xn--jlster-bya + 0x00347390, // n0x18f1 c0x0000 (---------------) + I xn--jrpeland-54a + 0x0034860d, // n0x18f2 c0x0000 (---------------) + I xn--karmy-yua + 0x00348f8e, // n0x18f3 c0x0000 (---------------) + I xn--kfjord-iua + 0x0034930c, // n0x18f4 c0x0000 (---------------) + I xn--klbu-woa + 0x0034a2d3, // n0x18f5 c0x0000 (---------------) + I xn--koluokta-7ya57h + 0x0034c68e, // n0x18f6 c0x0000 (---------------) + I xn--krager-gya + 0x0034da10, // n0x18f7 c0x0000 (---------------) + I xn--kranghke-b0a + 0x0034de11, // n0x18f8 c0x0000 (---------------) + I xn--krdsherad-m8a + 0x0034e24f, // n0x18f9 c0x0000 (---------------) + I xn--krehamn-dxa + 0x0034e613, // n0x18fa c0x0000 (---------------) + I xn--krjohka-hwab49j + 0x0034f00d, // n0x18fb c0x0000 (---------------) + I xn--ksnes-uua + 0x0034f34f, // n0x18fc c0x0000 (---------------) + I xn--kvfjord-nxa + 0x0034f70e, // n0x18fd c0x0000 (---------------) + I xn--kvitsy-fya + 0x0034fe50, // n0x18fe c0x0000 (---------------) + I xn--kvnangen-k0a + 0x00350249, // n0x18ff c0x0000 (---------------) + I xn--l-1fa + 0x00353090, // n0x1900 c0x0000 (---------------) + I xn--laheadju-7ya + 0x003536cf, // n0x1901 c0x0000 (---------------) + I xn--langevg-jxa + 0x00353d4f, // n0x1902 c0x0000 (---------------) + I xn--ldingen-q1a + 0x00354112, // n0x1903 c0x0000 (---------------) + I xn--leagaviika-52b + 0x00357c8e, // n0x1904 c0x0000 (---------------) + I xn--lesund-hua + 0x0035858d, // n0x1905 c0x0000 (---------------) + I xn--lgrd-poac + 0x0035930d, // n0x1906 c0x0000 (---------------) + I xn--lhppi-xqa + 0x0035964d, // n0x1907 c0x0000 (---------------) + I xn--linds-pra + 0x0035aa0d, // n0x1908 c0x0000 (---------------) + I xn--loabt-0qa + 0x0035ad4d, // n0x1909 c0x0000 (---------------) + I xn--lrdal-sra + 0x0035b090, // n0x190a c0x0000 (---------------) + I xn--lrenskog-54a + 0x0035b48b, // n0x190b c0x0000 (---------------) + I xn--lt-liac + 0x0035ba4c, // n0x190c c0x0000 (---------------) + I xn--lten-gra + 0x0035bdcc, // n0x190d c0x0000 (---------------) + I xn--lury-ira + 0x0035c0cc, // n0x190e c0x0000 (---------------) + I xn--mely-ira + 0x0035c3ce, // n0x190f c0x0000 (---------------) + I xn--merker-kua + 0x00366c50, // n0x1910 c0x0000 (---------------) + I xn--mjndalen-64a + 0x00368512, // n0x1911 c0x0000 (---------------) + I xn--mlatvuopmi-s4a + 0x0036898b, // n0x1912 c0x0000 (---------------) + I xn--mli-tla + 0x0036940e, // n0x1913 c0x0000 (---------------) + I xn--mlselv-iua + 0x0036978e, // n0x1914 c0x0000 (---------------) + I xn--moreke-jua + 0x0036a48e, // n0x1915 c0x0000 (---------------) + I xn--mosjen-eya + 0x0036c0cb, // n0x1916 c0x0000 (---------------) + I xn--mot-tla + 0x43f6c696, // n0x1917 c0x010f (n0x198c-n0x198e) o I xn--mre-og-romsdal-qqb + 0x0036d0cd, // n0x1918 c0x0000 (---------------) + I xn--msy-ula0h + 0x0036e814, // n0x1919 c0x0000 (---------------) + I xn--mtta-vrjjat-k7af + 0x0036f70d, // n0x191a c0x0000 (---------------) + I xn--muost-0qa + 0x00371c95, // n0x191b c0x0000 (---------------) + I xn--nmesjevuemie-tcba + 0x0037308d, // n0x191c c0x0000 (---------------) + I xn--nry-yla5g + 0x00373a0f, // n0x191d c0x0000 (---------------) + I xn--nttery-byae + 0x0037428f, // n0x191e c0x0000 (---------------) + I xn--nvuotna-hwa + 0x0037750f, // n0x191f c0x0000 (---------------) + I xn--oppegrd-ixa + 0x003778ce, // n0x1920 c0x0000 (---------------) + I xn--ostery-fya + 0x0037900d, // n0x1921 c0x0000 (---------------) + I xn--osyro-wua + 0x0037a891, // n0x1922 c0x0000 (---------------) + I xn--porsgu-sta26f + 0x0037eecc, // n0x1923 c0x0000 (---------------) + I xn--rady-ira + 0x0037f1cc, // n0x1924 c0x0000 (---------------) + I xn--rdal-poa + 0x0037f4cb, // n0x1925 c0x0000 (---------------) + I xn--rde-ula + 0x0037fa8c, // n0x1926 c0x0000 (---------------) + I xn--rdy-0nab + 0x0037fe4f, // n0x1927 c0x0000 (---------------) + I xn--rennesy-v1a + 0x00380212, // n0x1928 c0x0000 (---------------) + I xn--rhkkervju-01af + 0x00380bcd, // n0x1929 c0x0000 (---------------) + I xn--rholt-mra + 0x00381b8c, // n0x192a c0x0000 (---------------) + I xn--risa-5na + 0x0038200c, // n0x192b c0x0000 (---------------) + I xn--risr-ira + 0x0038230d, // n0x192c c0x0000 (---------------) + I xn--rland-uua + 0x0038264f, // n0x192d c0x0000 (---------------) + I xn--rlingen-mxa + 0x00382a0e, // n0x192e c0x0000 (---------------) + I xn--rmskog-bya + 0x00384c0c, // n0x192f c0x0000 (---------------) + I xn--rros-gra + 0x003851cd, // n0x1930 c0x0000 (---------------) + I xn--rskog-uua + 0x0038550b, // n0x1931 c0x0000 (---------------) + I xn--rst-0na + 0x00385acc, // n0x1932 c0x0000 (---------------) + I xn--rsta-fra + 0x0038604d, // n0x1933 c0x0000 (---------------) + I xn--ryken-vua + 0x0038638e, // n0x1934 c0x0000 (---------------) + I xn--ryrvik-bya + 0x00386809, // n0x1935 c0x0000 (---------------) + I xn--s-1fa + 0x00387513, // n0x1936 c0x0000 (---------------) + I xn--sandnessjen-ogb + 0x00387f8d, // n0x1937 c0x0000 (---------------) + I xn--sandy-yua + 0x003882cd, // n0x1938 c0x0000 (---------------) + I xn--seral-lra + 0x003888cc, // n0x1939 c0x0000 (---------------) + I xn--sgne-gra + 0x00388d4e, // n0x193a c0x0000 (---------------) + I xn--skierv-uta + 0x00389bcf, // n0x193b c0x0000 (---------------) + I xn--skjervy-v1a + 0x00389f8c, // n0x193c c0x0000 (---------------) + I xn--skjk-soa + 0x0038a28d, // n0x193d c0x0000 (---------------) + I xn--sknit-yqa + 0x0038a5cf, // n0x193e c0x0000 (---------------) + I xn--sknland-fxa + 0x0038a98c, // n0x193f c0x0000 (---------------) + I xn--slat-5na + 0x0038b08c, // n0x1940 c0x0000 (---------------) + I xn--slt-elab + 0x0038b44c, // n0x1941 c0x0000 (---------------) + I xn--smla-hra + 0x0038b74c, // n0x1942 c0x0000 (---------------) + I xn--smna-gra + 0x0038be0d, // n0x1943 c0x0000 (---------------) + I xn--snase-nra + 0x0038c152, // n0x1944 c0x0000 (---------------) + I xn--sndre-land-0cb + 0x0038c7cc, // n0x1945 c0x0000 (---------------) + I xn--snes-poa + 0x0038cacc, // n0x1946 c0x0000 (---------------) + I xn--snsa-roa + 0x0038cdd1, // n0x1947 c0x0000 (---------------) + I xn--sr-aurdal-l8a + 0x0038d20f, // n0x1948 c0x0000 (---------------) + I xn--sr-fron-q1a + 0x0038d5cf, // n0x1949 c0x0000 (---------------) + I xn--sr-odal-q1a + 0x0038d993, // n0x194a c0x0000 (---------------) + I xn--sr-varanger-ggb + 0x0038ee4e, // n0x194b c0x0000 (---------------) + I xn--srfold-bya + 0x0038f3cf, // n0x194c c0x0000 (---------------) + I xn--srreisa-q1a + 0x0038f78c, // n0x194d c0x0000 (---------------) + I xn--srum-gra + 0x4438face, // n0x194e c0x0110 (n0x198e-n0x198f) o I xn--stfold-9xa + 0x0038fe4f, // n0x194f c0x0000 (---------------) + I xn--stjrdal-s1a + 0x00390216, // n0x1950 c0x0000 (---------------) + I xn--stjrdalshalsen-sqb + 0x00390d12, // n0x1951 c0x0000 (---------------) + I xn--stre-toten-zcb + 0x0039230c, // n0x1952 c0x0000 (---------------) + I xn--tjme-hra + 0x00392acf, // n0x1953 c0x0000 (---------------) + I xn--tnsberg-q1a + 0x0039314d, // n0x1954 c0x0000 (---------------) + I xn--trany-yua + 0x0039348f, // n0x1955 c0x0000 (---------------) + I xn--trgstad-r1a + 0x0039384c, // n0x1956 c0x0000 (---------------) + I xn--trna-woa + 0x00393b4d, // n0x1957 c0x0000 (---------------) + I xn--troms-zua + 0x00393e8d, // n0x1958 c0x0000 (---------------) + I xn--tysvr-vra + 0x0039570e, // n0x1959 c0x0000 (---------------) + I xn--unjrga-rta + 0x00396a8c, // n0x195a c0x0000 (---------------) + I xn--vads-jra + 0x00396d8c, // n0x195b c0x0000 (---------------) + I xn--vard-jra + 0x00397090, // n0x195c c0x0000 (---------------) + I xn--vegrshei-c0a + 0x003991d1, // n0x195d c0x0000 (---------------) + I xn--vestvgy-ixa6o + 0x0039960b, // n0x195e c0x0000 (---------------) + I xn--vg-yiab + 0x0039994c, // n0x195f c0x0000 (---------------) + I xn--vgan-qoa + 0x00399c4e, // n0x1960 c0x0000 (---------------) + I xn--vgsy-qoa0j + 0x0039af51, // n0x1961 c0x0000 (---------------) + I xn--vre-eiker-k8a + 0x0039b38e, // n0x1962 c0x0000 (---------------) + I xn--vrggt-xqad + 0x0039b70d, // n0x1963 c0x0000 (---------------) + I xn--vry-yla5g + 0x003a278b, // n0x1964 c0x0000 (---------------) + I xn--yer-zna + 0x003a308f, // n0x1965 c0x0000 (---------------) + I xn--ygarden-p1a + 0x003a4814, // n0x1966 c0x0000 (---------------) + I xn--ystre-slidre-ujb + 0x0023a242, // n0x1967 c0x0000 (---------------) + I gs + 0x0023a242, // n0x1968 c0x0000 (---------------) + I gs + 0x00202c03, // n0x1969 c0x0000 (---------------) + I nes + 0x0023a242, // n0x196a c0x0000 (---------------) + I gs + 0x00202c03, // n0x196b c0x0000 (---------------) + I nes + 0x0023a242, // n0x196c c0x0000 (---------------) + I gs + 0x0020a802, // n0x196d c0x0000 (---------------) + I os + 0x003635c5, // n0x196e c0x0000 (---------------) + I valer + 0x0039ac4c, // n0x196f c0x0000 (---------------) + I xn--vler-qoa + 0x0023a242, // n0x1970 c0x0000 (---------------) + I gs + 0x0023a242, // n0x1971 c0x0000 (---------------) + I gs + 0x0020a802, // n0x1972 c0x0000 (---------------) + I os + 0x0023a242, // n0x1973 c0x0000 (---------------) + I gs + 0x002921c5, // n0x1974 c0x0000 (---------------) + I heroy + 0x003301c5, // n0x1975 c0x0000 (---------------) + I sande + 0x0023a242, // n0x1976 c0x0000 (---------------) + I gs + 0x0023a242, // n0x1977 c0x0000 (---------------) + I gs + 0x0020e402, // n0x1978 c0x0000 (---------------) + I bo + 0x002921c5, // n0x1979 c0x0000 (---------------) + I heroy + 0x00310a09, // n0x197a c0x0000 (---------------) + I xn--b-5ga + 0x0033e68c, // n0x197b c0x0000 (---------------) + I xn--hery-ira + 0x0023a242, // n0x197c c0x0000 (---------------) + I gs + 0x0023a242, // n0x197d c0x0000 (---------------) + I gs + 0x0023a242, // n0x197e c0x0000 (---------------) + I gs + 0x0023a242, // n0x197f c0x0000 (---------------) + I gs + 0x003635c5, // n0x1980 c0x0000 (---------------) + I valer + 0x0023a242, // n0x1981 c0x0000 (---------------) + I gs + 0x0023a242, // n0x1982 c0x0000 (---------------) + I gs + 0x0023a242, // n0x1983 c0x0000 (---------------) + I gs + 0x0023a242, // n0x1984 c0x0000 (---------------) + I gs + 0x0020e402, // n0x1985 c0x0000 (---------------) + I bo + 0x00310a09, // n0x1986 c0x0000 (---------------) + I xn--b-5ga + 0x0023a242, // n0x1987 c0x0000 (---------------) + I gs + 0x0023a242, // n0x1988 c0x0000 (---------------) + I gs + 0x0023a242, // n0x1989 c0x0000 (---------------) + I gs + 0x003301c5, // n0x198a c0x0000 (---------------) + I sande + 0x0023a242, // n0x198b c0x0000 (---------------) + I gs + 0x003301c5, // n0x198c c0x0000 (---------------) + I sande + 0x0033e68c, // n0x198d c0x0000 (---------------) + I xn--hery-ira + 0x0039ac4c, // n0x198e c0x0000 (---------------) + I xn--vler-qoa + 0x00330b83, // n0x198f c0x0000 (---------------) + I biz + 0x00233503, // n0x1990 c0x0000 (---------------) + I com + 0x0023a783, // n0x1991 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1992 c0x0000 (---------------) + I gov + 0x003a1244, // n0x1993 c0x0000 (---------------) + I info + 0x0021fe03, // n0x1994 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1995 c0x0000 (---------------) + I org + 0x000ecf48, // n0x1996 c0x0000 (---------------) + merseine + 0x000a9304, // n0x1997 c0x0000 (---------------) + mine + 0x000feb48, // n0x1998 c0x0000 (---------------) + shacknet + 0x00201542, // n0x1999 c0x0000 (---------------) + I ac + 0x45200742, // n0x199a c0x0114 (n0x19a9-n0x19aa) + I co + 0x00245b43, // n0x199b c0x0000 (---------------) + I cri + 0x0024eac4, // n0x199c c0x0000 (---------------) + I geek + 0x00205843, // n0x199d c0x0000 (---------------) + I gen + 0x00341e04, // n0x199e c0x0000 (---------------) + I govt + 0x0036b386, // n0x199f c0x0000 (---------------) + I health + 0x0020cec3, // n0x19a0 c0x0000 (---------------) + I iwi + 0x002eed84, // n0x19a1 c0x0000 (---------------) + I kiwi + 0x002703c5, // n0x19a2 c0x0000 (---------------) + I maori + 0x00209003, // n0x19a3 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x19a4 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x19a5 c0x0000 (---------------) + I org + 0x0028440a, // n0x19a6 c0x0000 (---------------) + I parliament + 0x0023d0c6, // n0x19a7 c0x0000 (---------------) + I school + 0x00369b0c, // n0x19a8 c0x0000 (---------------) + I xn--mori-qsa + 0x000ffa08, // n0x19a9 c0x0000 (---------------) + blogspot + 0x00200742, // n0x19aa c0x0000 (---------------) + I co + 0x00233503, // n0x19ab c0x0000 (---------------) + I com + 0x0023a783, // n0x19ac c0x0000 (---------------) + I edu + 0x0026cc83, // n0x19ad c0x0000 (---------------) + I gov + 0x00213ac3, // n0x19ae c0x0000 (---------------) + I med + 0x002d0106, // n0x19af c0x0000 (---------------) + I museum + 0x0021fe03, // n0x19b0 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x19b1 c0x0000 (---------------) + I org + 0x00220e43, // n0x19b2 c0x0000 (---------------) + I pro + 0x000035c2, // n0x19b3 c0x0000 (---------------) + ae + 0x000fb147, // n0x19b4 c0x0000 (---------------) + blogdns + 0x000d3588, // n0x19b5 c0x0000 (---------------) + blogsite + 0x0000e74e, // n0x19b6 c0x0000 (---------------) + bmoattachments + 0x000878d2, // n0x19b7 c0x0000 (---------------) + boldlygoingnowhere + 0x45e3e2c5, // n0x19b8 c0x0117 (n0x19f0-n0x19f2) o I cdn77 + 0x4631c4cc, // n0x19b9 c0x0118 (n0x19f2-n0x19f3) o I cdn77-secure + 0x0014c048, // n0x19ba c0x0000 (---------------) + dnsalias + 0x0007c9c7, // n0x19bb c0x0000 (---------------) + dnsdojo + 0x00014e0b, // n0x19bc c0x0000 (---------------) + doesntexist + 0x0016a009, // n0x19bd c0x0000 (---------------) + dontexist + 0x0014bf47, // n0x19be c0x0000 (---------------) + doomdns + 0x0008cdc7, // n0x19bf c0x0000 (---------------) + dsmynas + 0x0007c8c7, // n0x19c0 c0x0000 (---------------) + duckdns + 0x00011046, // n0x19c1 c0x0000 (---------------) + dvrdns + 0x00197b48, // n0x19c2 c0x0000 (---------------) + dynalias + 0x46813886, // n0x19c3 c0x011a (n0x19f4-n0x19f6) + dyndns + 0x000a950d, // n0x19c4 c0x0000 (---------------) + endofinternet + 0x0005ea10, // n0x19c5 c0x0000 (---------------) + endoftheinternet + 0x46c04b82, // n0x19c6 c0x011b (n0x19f6-n0x1a2d) + eu + 0x00008f88, // n0x19c7 c0x0000 (---------------) + familyds + 0x0006ac47, // n0x19c8 c0x0000 (---------------) + from-me + 0x00097cc9, // n0x19c9 c0x0000 (---------------) + game-host + 0x00057d06, // n0x19ca c0x0000 (---------------) + gotdns + 0x0000a882, // n0x19cb c0x0000 (---------------) + hk + 0x0014cfca, // n0x19cc c0x0000 (---------------) + hobby-site + 0x00013a47, // n0x19cd c0x0000 (---------------) + homedns + 0x00146347, // n0x19ce c0x0000 (---------------) + homeftp + 0x000a59c9, // n0x19cf c0x0000 (---------------) + homelinux + 0x000a6fc8, // n0x19d0 c0x0000 (---------------) + homeunix + 0x000e0c0e, // n0x19d1 c0x0000 (---------------) + is-a-bruinsfan + 0x0000c54e, // n0x19d2 c0x0000 (---------------) + is-a-candidate + 0x00011a0f, // n0x19d3 c0x0000 (---------------) + is-a-celticsfan + 0x00012789, // n0x19d4 c0x0000 (---------------) + is-a-chef + 0x0004e989, // n0x19d5 c0x0000 (---------------) + is-a-geek + 0x000704cb, // n0x19d6 c0x0000 (---------------) + is-a-knight + 0x0007fa4f, // n0x19d7 c0x0000 (---------------) + is-a-linux-user + 0x0008a50c, // n0x19d8 c0x0000 (---------------) + is-a-patsfan + 0x000ab58b, // n0x19d9 c0x0000 (---------------) + is-a-soxfan + 0x000b9e88, // n0x19da c0x0000 (---------------) + is-found + 0x000d9587, // n0x19db c0x0000 (---------------) + is-lost + 0x000fe008, // n0x19dc c0x0000 (---------------) + is-saved + 0x000f218b, // n0x19dd c0x0000 (---------------) + is-very-bad + 0x000f8d0c, // n0x19de c0x0000 (---------------) + is-very-evil + 0x0011b8cc, // n0x19df c0x0000 (---------------) + is-very-good + 0x0013aecc, // n0x19e0 c0x0000 (---------------) + is-very-nice + 0x00142a4d, // n0x19e1 c0x0000 (---------------) + is-very-sweet + 0x0008e588, // n0x19e2 c0x0000 (---------------) + isa-geek + 0x00150c09, // n0x19e3 c0x0000 (---------------) + kicks-ass + 0x001a24cb, // n0x19e4 c0x0000 (---------------) + misconfused + 0x000dcd47, // n0x19e5 c0x0000 (---------------) + podzone + 0x000d340a, // n0x19e6 c0x0000 (---------------) + readmyblog + 0x0006ba86, // n0x19e7 c0x0000 (---------------) + selfip + 0x00099a8d, // n0x19e8 c0x0000 (---------------) + sellsyourhome + 0x000cb7c8, // n0x19e9 c0x0000 (---------------) + servebbs + 0x000895c8, // n0x19ea c0x0000 (---------------) + serveftp + 0x00173dc9, // n0x19eb c0x0000 (---------------) + servegame + 0x000e868c, // n0x19ec c0x0000 (---------------) + stuff-4-sale + 0x00002382, // n0x19ed c0x0000 (---------------) + us + 0x000eadc6, // n0x19ee c0x0000 (---------------) + webhop + 0x00005f82, // n0x19ef c0x0000 (---------------) + za + 0x00000301, // n0x19f0 c0x0000 (---------------) + c + 0x0003cdc3, // n0x19f1 c0x0000 (---------------) + rsc + 0x46783486, // n0x19f2 c0x0119 (n0x19f3-n0x19f4) o I origin + 0x0003e443, // n0x19f3 c0x0000 (---------------) + ssl + 0x00002d42, // n0x19f4 c0x0000 (---------------) + go + 0x00013a44, // n0x19f5 c0x0000 (---------------) + home + 0x000001c2, // n0x19f6 c0x0000 (---------------) + al + 0x000d4884, // n0x19f7 c0x0000 (---------------) + asso + 0x00000102, // n0x19f8 c0x0000 (---------------) + at + 0x00004f82, // n0x19f9 c0x0000 (---------------) + au + 0x00003302, // n0x19fa c0x0000 (---------------) + be + 0x000ee482, // n0x19fb c0x0000 (---------------) + bg + 0x00000302, // n0x19fc c0x0000 (---------------) + ca + 0x0003e2c2, // n0x19fd c0x0000 (---------------) + cd + 0x00001582, // n0x19fe c0x0000 (---------------) + ch + 0x0001ba42, // n0x19ff c0x0000 (---------------) + cn + 0x0003e082, // n0x1a00 c0x0000 (---------------) + cy + 0x00029ec2, // n0x1a01 c0x0000 (---------------) + cz + 0x00004d82, // n0x1a02 c0x0000 (---------------) + de + 0x000494c2, // n0x1a03 c0x0000 (---------------) + dk + 0x0003a783, // n0x1a04 c0x0000 (---------------) + edu + 0x0000b342, // n0x1a05 c0x0000 (---------------) + ee + 0x00000482, // n0x1a06 c0x0000 (---------------) + es + 0x00007502, // n0x1a07 c0x0000 (---------------) + fi + 0x00000582, // n0x1a08 c0x0000 (---------------) + fr + 0x00000c82, // n0x1a09 c0x0000 (---------------) + gr + 0x0000e4c2, // n0x1a0a c0x0000 (---------------) + hr + 0x000195c2, // n0x1a0b c0x0000 (---------------) + hu + 0x00000042, // n0x1a0c c0x0000 (---------------) + ie + 0x00002902, // n0x1a0d c0x0000 (---------------) + il + 0x000013c2, // n0x1a0e c0x0000 (---------------) + in + 0x00001603, // n0x1a0f c0x0000 (---------------) + int + 0x000006c2, // n0x1a10 c0x0000 (---------------) + is + 0x00001e42, // n0x1a11 c0x0000 (---------------) + it + 0x000ae3c2, // n0x1a12 c0x0000 (---------------) + jp + 0x00006fc2, // n0x1a13 c0x0000 (---------------) + kr + 0x00009e02, // n0x1a14 c0x0000 (---------------) + lt + 0x00002f42, // n0x1a15 c0x0000 (---------------) + lu + 0x00005d02, // n0x1a16 c0x0000 (---------------) + lv + 0x0002ac02, // n0x1a17 c0x0000 (---------------) + mc + 0x00003e82, // n0x1a18 c0x0000 (---------------) + me + 0x00167142, // n0x1a19 c0x0000 (---------------) + mk + 0x00004c02, // n0x1a1a c0x0000 (---------------) + mt + 0x00026f02, // n0x1a1b c0x0000 (---------------) + my + 0x0001fe03, // n0x1a1c c0x0000 (---------------) + net + 0x00002802, // n0x1a1d c0x0000 (---------------) + ng + 0x00047802, // n0x1a1e c0x0000 (---------------) + nl + 0x00000c02, // n0x1a1f c0x0000 (---------------) + no + 0x000094c2, // n0x1a20 c0x0000 (---------------) + nz + 0x00077905, // n0x1a21 c0x0000 (---------------) + paris + 0x000063c2, // n0x1a22 c0x0000 (---------------) + pl + 0x0008c9c2, // n0x1a23 c0x0000 (---------------) + pt + 0x00043b83, // n0x1a24 c0x0000 (---------------) + q-a + 0x00002202, // n0x1a25 c0x0000 (---------------) + ro + 0x00011302, // n0x1a26 c0x0000 (---------------) + ru + 0x000046c2, // n0x1a27 c0x0000 (---------------) + se + 0x0000a402, // n0x1a28 c0x0000 (---------------) + si + 0x00007842, // n0x1a29 c0x0000 (---------------) + sk + 0x00003002, // n0x1a2a c0x0000 (---------------) + tr + 0x00000f82, // n0x1a2b c0x0000 (---------------) + uk + 0x00002382, // n0x1a2c c0x0000 (---------------) + us + 0x00210f43, // n0x1a2d c0x0000 (---------------) + I abo + 0x00201542, // n0x1a2e c0x0000 (---------------) + I ac + 0x00233503, // n0x1a2f c0x0000 (---------------) + I com + 0x0023a783, // n0x1a30 c0x0000 (---------------) + I edu + 0x00213183, // n0x1a31 c0x0000 (---------------) + I gob + 0x0020e2c3, // n0x1a32 c0x0000 (---------------) + I ing + 0x00213ac3, // n0x1a33 c0x0000 (---------------) + I med + 0x0021fe03, // n0x1a34 c0x0000 (---------------) + I net + 0x00201483, // n0x1a35 c0x0000 (---------------) + I nom + 0x0022d1c3, // n0x1a36 c0x0000 (---------------) + I org + 0x00292103, // n0x1a37 c0x0000 (---------------) + I sld + 0x000ffa08, // n0x1a38 c0x0000 (---------------) + blogspot + 0x00233503, // n0x1a39 c0x0000 (---------------) + I com + 0x0023a783, // n0x1a3a c0x0000 (---------------) + I edu + 0x00213183, // n0x1a3b c0x0000 (---------------) + I gob + 0x00209003, // n0x1a3c c0x0000 (---------------) + I mil + 0x0021fe03, // n0x1a3d c0x0000 (---------------) + I net + 0x00201483, // n0x1a3e c0x0000 (---------------) + I nom + 0x0022d1c3, // n0x1a3f c0x0000 (---------------) + I org + 0x00233503, // n0x1a40 c0x0000 (---------------) + I com + 0x0023a783, // n0x1a41 c0x0000 (---------------) + I edu + 0x0022d1c3, // n0x1a42 c0x0000 (---------------) + I org + 0x00233503, // n0x1a43 c0x0000 (---------------) + I com + 0x0023a783, // n0x1a44 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1a45 c0x0000 (---------------) + I gov + 0x00200041, // n0x1a46 c0x0000 (---------------) + I i + 0x00209003, // n0x1a47 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x1a48 c0x0000 (---------------) + I net + 0x00202d03, // n0x1a49 c0x0000 (---------------) + I ngo + 0x0022d1c3, // n0x1a4a c0x0000 (---------------) + I org + 0x00330b83, // n0x1a4b c0x0000 (---------------) + I biz + 0x00233503, // n0x1a4c c0x0000 (---------------) + I com + 0x0023a783, // n0x1a4d c0x0000 (---------------) + I edu + 0x00208f83, // n0x1a4e c0x0000 (---------------) + I fam + 0x00213183, // n0x1a4f c0x0000 (---------------) + I gob + 0x00337283, // n0x1a50 c0x0000 (---------------) + I gok + 0x00282e03, // n0x1a51 c0x0000 (---------------) + I gon + 0x002a36c3, // n0x1a52 c0x0000 (---------------) + I gop + 0x00276203, // n0x1a53 c0x0000 (---------------) + I gos + 0x0026cc83, // n0x1a54 c0x0000 (---------------) + I gov + 0x003a1244, // n0x1a55 c0x0000 (---------------) + I info + 0x0021fe03, // n0x1a56 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1a57 c0x0000 (---------------) + I org + 0x00221a03, // n0x1a58 c0x0000 (---------------) + I web + 0x002ebac4, // n0x1a59 c0x0000 (---------------) + I agro + 0x00253543, // n0x1a5a c0x0000 (---------------) + I aid + 0x000011c3, // n0x1a5b c0x0000 (---------------) + art + 0x00200103, // n0x1a5c c0x0000 (---------------) + I atm + 0x0024a188, // n0x1a5d c0x0000 (---------------) + I augustow + 0x00265104, // n0x1a5e c0x0000 (---------------) + I auto + 0x0022404a, // n0x1a5f c0x0000 (---------------) + I babia-gora + 0x00207a06, // n0x1a60 c0x0000 (---------------) + I bedzin + 0x00397a07, // n0x1a61 c0x0000 (---------------) + I beskidy + 0x0021e20a, // n0x1a62 c0x0000 (---------------) + I bialowieza + 0x00275d09, // n0x1a63 c0x0000 (---------------) + I bialystok + 0x0039dd47, // n0x1a64 c0x0000 (---------------) + I bielawa + 0x003a604a, // n0x1a65 c0x0000 (---------------) + I bieszczady + 0x00330b83, // n0x1a66 c0x0000 (---------------) + I biz + 0x003782cb, // n0x1a67 c0x0000 (---------------) + I boleslawiec + 0x002ce249, // n0x1a68 c0x0000 (---------------) + I bydgoszcz + 0x00269605, // n0x1a69 c0x0000 (---------------) + I bytom + 0x002cc107, // n0x1a6a c0x0000 (---------------) + I cieszyn + 0x00000742, // n0x1a6b c0x0000 (---------------) + co + 0x00233503, // n0x1a6c c0x0000 (---------------) + I com + 0x00229ec7, // n0x1a6d c0x0000 (---------------) + I czeladz + 0x003522c5, // n0x1a6e c0x0000 (---------------) + I czest + 0x002bb989, // n0x1a6f c0x0000 (---------------) + I dlugoleka + 0x0023a783, // n0x1a70 c0x0000 (---------------) + I edu + 0x00222c06, // n0x1a71 c0x0000 (---------------) + I elblag + 0x002baac3, // n0x1a72 c0x0000 (---------------) + I elk + 0x000cba03, // n0x1a73 c0x0000 (---------------) + gda + 0x000fc286, // n0x1a74 c0x0000 (---------------) + gdansk + 0x000ee0c6, // n0x1a75 c0x0000 (---------------) + gdynia + 0x0000ce47, // n0x1a76 c0x0000 (---------------) + gliwice + 0x00210886, // n0x1a77 c0x0000 (---------------) + I glogow + 0x00216405, // n0x1a78 c0x0000 (---------------) + I gmina + 0x00328747, // n0x1a79 c0x0000 (---------------) + I gniezno + 0x003350c7, // n0x1a7a c0x0000 (---------------) + I gorlice + 0x48a6cc83, // n0x1a7b c0x0122 (n0x1afe-n0x1b2d) + I gov + 0x0032ad07, // n0x1a7c c0x0000 (---------------) + I grajewo + 0x0035e383, // n0x1a7d c0x0000 (---------------) + I gsm + 0x003205c5, // n0x1a7e c0x0000 (---------------) + I ilawa + 0x003a1244, // n0x1a7f c0x0000 (---------------) + I info + 0x0036f508, // n0x1a80 c0x0000 (---------------) + I jaworzno + 0x002ad88c, // n0x1a81 c0x0000 (---------------) + I jelenia-gora + 0x002ac505, // n0x1a82 c0x0000 (---------------) + I jgora + 0x00345486, // n0x1a83 c0x0000 (---------------) + I kalisz + 0x00229d87, // n0x1a84 c0x0000 (---------------) + I karpacz + 0x0038e2c7, // n0x1a85 c0x0000 (---------------) + I kartuzy + 0x0020f847, // n0x1a86 c0x0000 (---------------) + I kaszuby + 0x00217ac8, // n0x1a87 c0x0000 (---------------) + I katowice + 0x002acd4f, // n0x1a88 c0x0000 (---------------) + I kazimierz-dolny + 0x00249345, // n0x1a89 c0x0000 (---------------) + I kepno + 0x00245c47, // n0x1a8a c0x0000 (---------------) + I ketrzyn + 0x0039c507, // n0x1a8b c0x0000 (---------------) + I klodzko + 0x002a4d8a, // n0x1a8c c0x0000 (---------------) + I kobierzyce + 0x0028c749, // n0x1a8d c0x0000 (---------------) + I kolobrzeg + 0x002c8d85, // n0x1a8e c0x0000 (---------------) + I konin + 0x002c970a, // n0x1a8f c0x0000 (---------------) + I konskowola + 0x000eac86, // n0x1a90 c0x0000 (---------------) + krakow + 0x002bab45, // n0x1a91 c0x0000 (---------------) + I kutno + 0x00368bc4, // n0x1a92 c0x0000 (---------------) + I lapy + 0x00271a06, // n0x1a93 c0x0000 (---------------) + I lebork + 0x0037c607, // n0x1a94 c0x0000 (---------------) + I legnica + 0x00251647, // n0x1a95 c0x0000 (---------------) + I lezajsk + 0x002551c8, // n0x1a96 c0x0000 (---------------) + I limanowa + 0x00214305, // n0x1a97 c0x0000 (---------------) + I lomza + 0x003521c6, // n0x1a98 c0x0000 (---------------) + I lowicz + 0x00398d05, // n0x1a99 c0x0000 (---------------) + I lubin + 0x003a42c5, // n0x1a9a c0x0000 (---------------) + I lukow + 0x0021b5c4, // n0x1a9b c0x0000 (---------------) + I mail + 0x002f2587, // n0x1a9c c0x0000 (---------------) + I malbork + 0x0030764a, // n0x1a9d c0x0000 (---------------) + I malopolska + 0x0020b848, // n0x1a9e c0x0000 (---------------) + I mazowsze + 0x002ee9c6, // n0x1a9f c0x0000 (---------------) + I mazury + 0x00013ac3, // n0x1aa0 c0x0000 (---------------) + med + 0x003025c5, // n0x1aa1 c0x0000 (---------------) + I media + 0x00232006, // n0x1aa2 c0x0000 (---------------) + I miasta + 0x003a5006, // n0x1aa3 c0x0000 (---------------) + I mielec + 0x00332046, // n0x1aa4 c0x0000 (---------------) + I mielno + 0x00209003, // n0x1aa5 c0x0000 (---------------) + I mil + 0x00380e47, // n0x1aa6 c0x0000 (---------------) + I mragowo + 0x0039c485, // n0x1aa7 c0x0000 (---------------) + I naklo + 0x0021fe03, // n0x1aa8 c0x0000 (---------------) + I net + 0x0039dfcd, // n0x1aa9 c0x0000 (---------------) + I nieruchomosci + 0x00201483, // n0x1aaa c0x0000 (---------------) + I nom + 0x002552c8, // n0x1aab c0x0000 (---------------) + I nowaruda + 0x002158c4, // n0x1aac c0x0000 (---------------) + I nysa + 0x00276d05, // n0x1aad c0x0000 (---------------) + I olawa + 0x002a4c86, // n0x1aae c0x0000 (---------------) + I olecko + 0x0023d406, // n0x1aaf c0x0000 (---------------) + I olkusz + 0x00219a47, // n0x1ab0 c0x0000 (---------------) + I olsztyn + 0x0023d707, // n0x1ab1 c0x0000 (---------------) + I opoczno + 0x00251585, // n0x1ab2 c0x0000 (---------------) + I opole + 0x0022d1c3, // n0x1ab3 c0x0000 (---------------) + I org + 0x00384947, // n0x1ab4 c0x0000 (---------------) + I ostroda + 0x002c7689, // n0x1ab5 c0x0000 (---------------) + I ostroleka + 0x0020ad49, // n0x1ab6 c0x0000 (---------------) + I ostrowiec + 0x0020d58a, // n0x1ab7 c0x0000 (---------------) + I ostrowwlkp + 0x00248182, // n0x1ab8 c0x0000 (---------------) + I pc + 0x00320584, // n0x1ab9 c0x0000 (---------------) + I pila + 0x002d7404, // n0x1aba c0x0000 (---------------) + I pisz + 0x00219e47, // n0x1abb c0x0000 (---------------) + I podhale + 0x00243388, // n0x1abc c0x0000 (---------------) + I podlasie + 0x002de7c9, // n0x1abd c0x0000 (---------------) + I polkowice + 0x00209609, // n0x1abe c0x0000 (---------------) + I pomorskie + 0x002df1c7, // n0x1abf c0x0000 (---------------) + I pomorze + 0x00248e46, // n0x1ac0 c0x0000 (---------------) + I powiat + 0x000e0986, // n0x1ac1 c0x0000 (---------------) + poznan + 0x002e1c44, // n0x1ac2 c0x0000 (---------------) + I priv + 0x002e1dca, // n0x1ac3 c0x0000 (---------------) + I prochowice + 0x002e4548, // n0x1ac4 c0x0000 (---------------) + I pruszkow + 0x002e51c9, // n0x1ac5 c0x0000 (---------------) + I przeworsk + 0x00296686, // n0x1ac6 c0x0000 (---------------) + I pulawy + 0x00339e45, // n0x1ac7 c0x0000 (---------------) + I radom + 0x0020b708, // n0x1ac8 c0x0000 (---------------) + I rawa-maz + 0x002c238a, // n0x1ac9 c0x0000 (---------------) + I realestate + 0x00285b43, // n0x1aca c0x0000 (---------------) + I rel + 0x0033cf06, // n0x1acb c0x0000 (---------------) + I rybnik + 0x002df2c7, // n0x1acc c0x0000 (---------------) + I rzeszow + 0x0020f745, // n0x1acd c0x0000 (---------------) + I sanok + 0x002224c5, // n0x1ace c0x0000 (---------------) + I sejny + 0x00247603, // n0x1acf c0x0000 (---------------) + I sex + 0x00352004, // n0x1ad0 c0x0000 (---------------) + I shop + 0x00374ec5, // n0x1ad1 c0x0000 (---------------) + I sklep + 0x00284fc7, // n0x1ad2 c0x0000 (---------------) + I skoczow + 0x002e2b05, // n0x1ad3 c0x0000 (---------------) + I slask + 0x002d51c6, // n0x1ad4 c0x0000 (---------------) + I slupsk + 0x000f3985, // n0x1ad5 c0x0000 (---------------) + sopot + 0x0021f483, // n0x1ad6 c0x0000 (---------------) + I sos + 0x002b5889, // n0x1ad7 c0x0000 (---------------) + I sosnowiec + 0x00276acc, // n0x1ad8 c0x0000 (---------------) + I stalowa-wola + 0x002a11cc, // n0x1ad9 c0x0000 (---------------) + I starachowice + 0x002c92c8, // n0x1ada c0x0000 (---------------) + I stargard + 0x0027b447, // n0x1adb c0x0000 (---------------) + I suwalki + 0x002f0a08, // n0x1adc c0x0000 (---------------) + I swidnica + 0x002f100a, // n0x1add c0x0000 (---------------) + I swiebodzin + 0x002f198b, // n0x1ade c0x0000 (---------------) + I swinoujscie + 0x002ce388, // n0x1adf c0x0000 (---------------) + I szczecin + 0x00345588, // n0x1ae0 c0x0000 (---------------) + I szczytno + 0x00293346, // n0x1ae1 c0x0000 (---------------) + I szkola + 0x00357a85, // n0x1ae2 c0x0000 (---------------) + I targi + 0x00249c0a, // n0x1ae3 c0x0000 (---------------) + I tarnobrzeg + 0x00220b05, // n0x1ae4 c0x0000 (---------------) + I tgory + 0x00200142, // n0x1ae5 c0x0000 (---------------) + I tm + 0x002c0507, // n0x1ae6 c0x0000 (---------------) + I tourism + 0x0029bec6, // n0x1ae7 c0x0000 (---------------) + I travel + 0x00352bc5, // n0x1ae8 c0x0000 (---------------) + I turek + 0x0037da09, // n0x1ae9 c0x0000 (---------------) + I turystyka + 0x0031fd85, // n0x1aea c0x0000 (---------------) + I tychy + 0x00291985, // n0x1aeb c0x0000 (---------------) + I ustka + 0x00320189, // n0x1aec c0x0000 (---------------) + I walbrzych + 0x00231e86, // n0x1aed c0x0000 (---------------) + I warmia + 0x0023ee48, // n0x1aee c0x0000 (---------------) + I warszawa + 0x0025a843, // n0x1aef c0x0000 (---------------) + I waw + 0x0020fcc6, // n0x1af0 c0x0000 (---------------) + I wegrow + 0x00275246, // n0x1af1 c0x0000 (---------------) + I wielun + 0x002fff45, // n0x1af2 c0x0000 (---------------) + I wlocl + 0x002fff49, // n0x1af3 c0x0000 (---------------) + I wloclawek + 0x002b0d09, // n0x1af4 c0x0000 (---------------) + I wodzislaw + 0x0024e547, // n0x1af5 c0x0000 (---------------) + I wolomin + 0x000ffdc4, // n0x1af6 c0x0000 (---------------) + wroc + 0x002ffdc7, // n0x1af7 c0x0000 (---------------) + I wroclaw + 0x00209509, // n0x1af8 c0x0000 (---------------) + I zachpomor + 0x0021e405, // n0x1af9 c0x0000 (---------------) + I zagan + 0x00138408, // n0x1afa c0x0000 (---------------) + zakopane + 0x0032f305, // n0x1afb c0x0000 (---------------) + I zarow + 0x0021fec5, // n0x1afc c0x0000 (---------------) + I zgora + 0x0022df89, // n0x1afd c0x0000 (---------------) + I zgorzelec + 0x00200d02, // n0x1afe c0x0000 (---------------) + I ap + 0x00351ac4, // n0x1aff c0x0000 (---------------) + I griw + 0x00206902, // n0x1b00 c0x0000 (---------------) + I ic + 0x002006c2, // n0x1b01 c0x0000 (---------------) + I is + 0x002717c5, // n0x1b02 c0x0000 (---------------) + I kmpsp + 0x002cc908, // n0x1b03 c0x0000 (---------------) + I konsulat + 0x00371a05, // n0x1b04 c0x0000 (---------------) + I kppsp + 0x002bd183, // n0x1b05 c0x0000 (---------------) + I kwp + 0x002bd185, // n0x1b06 c0x0000 (---------------) + I kwpsp + 0x002cc4c3, // n0x1b07 c0x0000 (---------------) + I mup + 0x0020fc82, // n0x1b08 c0x0000 (---------------) + I mw + 0x00268444, // n0x1b09 c0x0000 (---------------) + I oirm + 0x002e6d03, // n0x1b0a c0x0000 (---------------) + I oum + 0x0020ac42, // n0x1b0b c0x0000 (---------------) + I pa + 0x002dd7c4, // n0x1b0c c0x0000 (---------------) + I pinb + 0x002d8443, // n0x1b0d c0x0000 (---------------) + I piw + 0x00200942, // n0x1b0e c0x0000 (---------------) + I po + 0x00209343, // n0x1b0f c0x0000 (---------------) + I psp + 0x0028be44, // n0x1b10 c0x0000 (---------------) + I psse + 0x002b4bc3, // n0x1b11 c0x0000 (---------------) + I pup + 0x00242684, // n0x1b12 c0x0000 (---------------) + I rzgw + 0x002004c2, // n0x1b13 c0x0000 (---------------) + I sa + 0x00271443, // n0x1b14 c0x0000 (---------------) + I sdn + 0x00216343, // n0x1b15 c0x0000 (---------------) + I sko + 0x00205682, // n0x1b16 c0x0000 (---------------) + I so + 0x0033b802, // n0x1b17 c0x0000 (---------------) + I sr + 0x002b0b49, // n0x1b18 c0x0000 (---------------) + I starostwo + 0x00201cc2, // n0x1b19 c0x0000 (---------------) + I ug + 0x00288444, // n0x1b1a c0x0000 (---------------) + I ugim + 0x00204bc2, // n0x1b1b c0x0000 (---------------) + I um + 0x0020b584, // n0x1b1c c0x0000 (---------------) + I umig + 0x00248e04, // n0x1b1d c0x0000 (---------------) + I upow + 0x002e3944, // n0x1b1e c0x0000 (---------------) + I uppo + 0x00202382, // n0x1b1f c0x0000 (---------------) + I us + 0x00243e82, // n0x1b20 c0x0000 (---------------) + I uw + 0x00211343, // n0x1b21 c0x0000 (---------------) + I uzs + 0x002f1603, // n0x1b22 c0x0000 (---------------) + I wif + 0x00245244, // n0x1b23 c0x0000 (---------------) + I wiih + 0x0025d1c4, // n0x1b24 c0x0000 (---------------) + I winb + 0x002c7604, // n0x1b25 c0x0000 (---------------) + I wios + 0x002c9604, // n0x1b26 c0x0000 (---------------) + I witd + 0x002ff443, // n0x1b27 c0x0000 (---------------) + I wiw + 0x002f65c3, // n0x1b28 c0x0000 (---------------) + I wsa + 0x002eac04, // n0x1b29 c0x0000 (---------------) + I wskr + 0x003009c4, // n0x1b2a c0x0000 (---------------) + I wuoz + 0x00300cc6, // n0x1b2b c0x0000 (---------------) + I wzmiuw + 0x00264682, // n0x1b2c c0x0000 (---------------) + I zp + 0x00200742, // n0x1b2d c0x0000 (---------------) + I co + 0x0023a783, // n0x1b2e c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1b2f c0x0000 (---------------) + I gov + 0x0021fe03, // n0x1b30 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1b31 c0x0000 (---------------) + I org + 0x00201542, // n0x1b32 c0x0000 (---------------) + I ac + 0x00330b83, // n0x1b33 c0x0000 (---------------) + I biz + 0x00233503, // n0x1b34 c0x0000 (---------------) + I com + 0x0023a783, // n0x1b35 c0x0000 (---------------) + I edu + 0x00202703, // n0x1b36 c0x0000 (---------------) + I est + 0x0026cc83, // n0x1b37 c0x0000 (---------------) + I gov + 0x003a1244, // n0x1b38 c0x0000 (---------------) + I info + 0x002b0e04, // n0x1b39 c0x0000 (---------------) + I isla + 0x00205284, // n0x1b3a c0x0000 (---------------) + I name + 0x0021fe03, // n0x1b3b c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1b3c c0x0000 (---------------) + I org + 0x00220e43, // n0x1b3d c0x0000 (---------------) + I pro + 0x002e2484, // n0x1b3e c0x0000 (---------------) + I prof + 0x00355603, // n0x1b3f c0x0000 (---------------) + I aaa + 0x002b3e43, // n0x1b40 c0x0000 (---------------) + I aca + 0x0033f204, // n0x1b41 c0x0000 (---------------) + I acct + 0x0032f106, // n0x1b42 c0x0000 (---------------) + I avocat + 0x00202003, // n0x1b43 c0x0000 (---------------) + I bar + 0x00216d43, // n0x1b44 c0x0000 (---------------) + I cpa + 0x00213703, // n0x1b45 c0x0000 (---------------) + I eng + 0x002af443, // n0x1b46 c0x0000 (---------------) + I jur + 0x00274483, // n0x1b47 c0x0000 (---------------) + I law + 0x00213ac3, // n0x1b48 c0x0000 (---------------) + I med + 0x0022a5c5, // n0x1b49 c0x0000 (---------------) + I recht + 0x00233503, // n0x1b4a c0x0000 (---------------) + I com + 0x0023a783, // n0x1b4b c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1b4c c0x0000 (---------------) + I gov + 0x0021fe03, // n0x1b4d c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1b4e c0x0000 (---------------) + I org + 0x002db8c3, // n0x1b4f c0x0000 (---------------) + I plo + 0x00235d43, // n0x1b50 c0x0000 (---------------) + I sec + 0x000ffa08, // n0x1b51 c0x0000 (---------------) + blogspot + 0x00233503, // n0x1b52 c0x0000 (---------------) + I com + 0x0023a783, // n0x1b53 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1b54 c0x0000 (---------------) + I gov + 0x00201603, // n0x1b55 c0x0000 (---------------) + I int + 0x0021fe03, // n0x1b56 c0x0000 (---------------) + I net + 0x00242044, // n0x1b57 c0x0000 (---------------) + I nome + 0x0022d1c3, // n0x1b58 c0x0000 (---------------) + I org + 0x0029f744, // n0x1b59 c0x0000 (---------------) + I publ + 0x002b7cc5, // n0x1b5a c0x0000 (---------------) + I belau + 0x00200742, // n0x1b5b c0x0000 (---------------) + I co + 0x00202602, // n0x1b5c c0x0000 (---------------) + I ed + 0x00202d42, // n0x1b5d c0x0000 (---------------) + I go + 0x00202c02, // n0x1b5e c0x0000 (---------------) + I ne + 0x00200282, // n0x1b5f c0x0000 (---------------) + I or + 0x00233503, // n0x1b60 c0x0000 (---------------) + I com + 0x0023d684, // n0x1b61 c0x0000 (---------------) + I coop + 0x0023a783, // n0x1b62 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1b63 c0x0000 (---------------) + I gov + 0x00209003, // n0x1b64 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x1b65 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1b66 c0x0000 (---------------) + I org + 0x000ffa08, // n0x1b67 c0x0000 (---------------) + blogspot + 0x00233503, // n0x1b68 c0x0000 (---------------) + I com + 0x0023a783, // n0x1b69 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1b6a c0x0000 (---------------) + I gov + 0x00209003, // n0x1b6b c0x0000 (---------------) + I mil + 0x00205284, // n0x1b6c c0x0000 (---------------) + I name + 0x0021fe03, // n0x1b6d c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1b6e c0x0000 (---------------) + I org + 0x00217443, // n0x1b6f c0x0000 (---------------) + I sch + 0x002d4884, // n0x1b70 c0x0000 (---------------) + I asso + 0x000ffa08, // n0x1b71 c0x0000 (---------------) + blogspot + 0x00233503, // n0x1b72 c0x0000 (---------------) + I com + 0x00201483, // n0x1b73 c0x0000 (---------------) + I nom + 0x0024bf84, // n0x1b74 c0x0000 (---------------) + I arts + 0x000ffa08, // n0x1b75 c0x0000 (---------------) + blogspot + 0x00233503, // n0x1b76 c0x0000 (---------------) + I com + 0x0024d9c4, // n0x1b77 c0x0000 (---------------) + I firm + 0x003a1244, // n0x1b78 c0x0000 (---------------) + I info + 0x00201483, // n0x1b79 c0x0000 (---------------) + I nom + 0x002009c2, // n0x1b7a c0x0000 (---------------) + I nt + 0x0022d1c3, // n0x1b7b c0x0000 (---------------) + I org + 0x0022a5c3, // n0x1b7c c0x0000 (---------------) + I rec + 0x00391185, // n0x1b7d c0x0000 (---------------) + I store + 0x00200142, // n0x1b7e c0x0000 (---------------) + I tm + 0x00300b03, // n0x1b7f c0x0000 (---------------) + I www + 0x00201542, // n0x1b80 c0x0000 (---------------) + I ac + 0x000ffa08, // n0x1b81 c0x0000 (---------------) + blogspot + 0x00200742, // n0x1b82 c0x0000 (---------------) + I co + 0x0023a783, // n0x1b83 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1b84 c0x0000 (---------------) + I gov + 0x002013c2, // n0x1b85 c0x0000 (---------------) + I in + 0x0022d1c3, // n0x1b86 c0x0000 (---------------) + I org + 0x00201542, // n0x1b87 c0x0000 (---------------) + I ac + 0x003a6207, // n0x1b88 c0x0000 (---------------) + I adygeya + 0x00289d85, // n0x1b89 c0x0000 (---------------) + I altai + 0x002937c4, // n0x1b8a c0x0000 (---------------) + I amur + 0x002e75c6, // n0x1b8b c0x0000 (---------------) + I amursk + 0x0023668b, // n0x1b8c c0x0000 (---------------) + I arkhangelsk + 0x0025a5c9, // n0x1b8d c0x0000 (---------------) + I astrakhan + 0x003453c6, // n0x1b8e c0x0000 (---------------) + I baikal + 0x003269c9, // n0x1b8f c0x0000 (---------------) + I bashkiria + 0x002d2e48, // n0x1b90 c0x0000 (---------------) + I belgorod + 0x002042c3, // n0x1b91 c0x0000 (---------------) + I bir + 0x000ffa08, // n0x1b92 c0x0000 (---------------) + blogspot + 0x00227447, // n0x1b93 c0x0000 (---------------) + I bryansk + 0x0034d388, // n0x1b94 c0x0000 (---------------) + I buryatia + 0x002ee443, // n0x1b95 c0x0000 (---------------) + I cbg + 0x002648c4, // n0x1b96 c0x0000 (---------------) + I chel + 0x0026670b, // n0x1b97 c0x0000 (---------------) + I chelyabinsk + 0x002ac6c5, // n0x1b98 c0x0000 (---------------) + I chita + 0x002bc248, // n0x1b99 c0x0000 (---------------) + I chukotka + 0x00335889, // n0x1b9a c0x0000 (---------------) + I chuvashia + 0x0025d143, // n0x1b9b c0x0000 (---------------) + I cmw + 0x00233503, // n0x1b9c c0x0000 (---------------) + I com + 0x00202648, // n0x1b9d c0x0000 (---------------) + I dagestan + 0x002ef847, // n0x1b9e c0x0000 (---------------) + I dudinka + 0x002eccc6, // n0x1b9f c0x0000 (---------------) + I e-burg + 0x0023a783, // n0x1ba0 c0x0000 (---------------) + I edu + 0x003869c7, // n0x1ba1 c0x0000 (---------------) + I fareast + 0x0026cc83, // n0x1ba2 c0x0000 (---------------) + I gov + 0x00312746, // n0x1ba3 c0x0000 (---------------) + I grozny + 0x00201603, // n0x1ba4 c0x0000 (---------------) + I int + 0x00230d87, // n0x1ba5 c0x0000 (---------------) + I irkutsk + 0x0027d407, // n0x1ba6 c0x0000 (---------------) + I ivanovo + 0x003879c7, // n0x1ba7 c0x0000 (---------------) + I izhevsk + 0x002f2505, // n0x1ba8 c0x0000 (---------------) + I jamal + 0x00206543, // n0x1ba9 c0x0000 (---------------) + I jar + 0x0020a7cb, // n0x1baa c0x0000 (---------------) + I joshkar-ola + 0x00309908, // n0x1bab c0x0000 (---------------) + I k-uralsk + 0x00226e48, // n0x1bac c0x0000 (---------------) + I kalmykia + 0x002509c6, // n0x1bad c0x0000 (---------------) + I kaluga + 0x0022ab89, // n0x1bae c0x0000 (---------------) + I kamchatka + 0x00327ec7, // n0x1baf c0x0000 (---------------) + I karelia + 0x002f9b85, // n0x1bb0 c0x0000 (---------------) + I kazan + 0x00379b44, // n0x1bb1 c0x0000 (---------------) + I kchr + 0x00275f48, // n0x1bb2 c0x0000 (---------------) + I kemerovo + 0x0023f40a, // n0x1bb3 c0x0000 (---------------) + I khabarovsk + 0x0023f649, // n0x1bb4 c0x0000 (---------------) + I khakassia + 0x002517c3, // n0x1bb5 c0x0000 (---------------) + I khv + 0x0027ea45, // n0x1bb6 c0x0000 (---------------) + I kirov + 0x0033bcc3, // n0x1bb7 c0x0000 (---------------) + I kms + 0x002ab0c6, // n0x1bb8 c0x0000 (---------------) + I koenig + 0x0039a004, // n0x1bb9 c0x0000 (---------------) + I komi + 0x002fc3c8, // n0x1bba c0x0000 (---------------) + I kostroma + 0x00387b4b, // n0x1bbb c0x0000 (---------------) + I krasnoyarsk + 0x0033bb85, // n0x1bbc c0x0000 (---------------) + I kuban + 0x002b7a46, // n0x1bbd c0x0000 (---------------) + I kurgan + 0x002b9785, // n0x1bbe c0x0000 (---------------) + I kursk + 0x002b9cc8, // n0x1bbf c0x0000 (---------------) + I kustanai + 0x002bac87, // n0x1bc0 c0x0000 (---------------) + I kuzbass + 0x00207707, // n0x1bc1 c0x0000 (---------------) + I lipetsk + 0x00223c47, // n0x1bc2 c0x0000 (---------------) + I magadan + 0x0021e6c4, // n0x1bc3 c0x0000 (---------------) + I mari + 0x0021e6c7, // n0x1bc4 c0x0000 (---------------) + I mari-el + 0x0027bc46, // n0x1bc5 c0x0000 (---------------) + I marine + 0x00209003, // n0x1bc6 c0x0000 (---------------) + I mil + 0x002c55c8, // n0x1bc7 c0x0000 (---------------) + I mordovia + 0x00253243, // n0x1bc8 c0x0000 (---------------) + I msk + 0x002ccc88, // n0x1bc9 c0x0000 (---------------) + I murmansk + 0x002d2485, // n0x1bca c0x0000 (---------------) + I mytis + 0x0031a348, // n0x1bcb c0x0000 (---------------) + I nakhodka + 0x0023a987, // n0x1bcc c0x0000 (---------------) + I nalchik + 0x0021fe03, // n0x1bcd c0x0000 (---------------) + I net + 0x00392a03, // n0x1bce c0x0000 (---------------) + I nkz + 0x00289404, // n0x1bcf c0x0000 (---------------) + I nnov + 0x00374d87, // n0x1bd0 c0x0000 (---------------) + I norilsk + 0x002058c3, // n0x1bd1 c0x0000 (---------------) + I nov + 0x0027d4cb, // n0x1bd2 c0x0000 (---------------) + I novosibirsk + 0x00216303, // n0x1bd3 c0x0000 (---------------) + I nsk + 0x00253204, // n0x1bd4 c0x0000 (---------------) + I omsk + 0x00391208, // n0x1bd5 c0x0000 (---------------) + I orenburg + 0x0022d1c3, // n0x1bd6 c0x0000 (---------------) + I org + 0x002d6e85, // n0x1bd7 c0x0000 (---------------) + I oryol + 0x00296c85, // n0x1bd8 c0x0000 (---------------) + I oskol + 0x0039c386, // n0x1bd9 c0x0000 (---------------) + I palana + 0x00212c85, // n0x1bda c0x0000 (---------------) + I penza + 0x002d2844, // n0x1bdb c0x0000 (---------------) + I perm + 0x00209302, // n0x1bdc c0x0000 (---------------) + I pp + 0x002e5483, // n0x1bdd c0x0000 (---------------) + I ptz + 0x00368c4a, // n0x1bde c0x0000 (---------------) + I pyatigorsk + 0x003907c3, // n0x1bdf c0x0000 (---------------) + I rnd + 0x002d1989, // n0x1be0 c0x0000 (---------------) + I rubtsovsk + 0x00357446, // n0x1be1 c0x0000 (---------------) + I ryazan + 0x0021ac48, // n0x1be2 c0x0000 (---------------) + I sakhalin + 0x0028b986, // n0x1be3 c0x0000 (---------------) + I samara + 0x002257c7, // n0x1be4 c0x0000 (---------------) + I saratov + 0x002cc748, // n0x1be5 c0x0000 (---------------) + I simbirsk + 0x002d6648, // n0x1be6 c0x0000 (---------------) + I smolensk + 0x002e0f83, // n0x1be7 c0x0000 (---------------) + I snz + 0x00271883, // n0x1be8 c0x0000 (---------------) + I spb + 0x00225b89, // n0x1be9 c0x0000 (---------------) + I stavropol + 0x002f4c43, // n0x1bea c0x0000 (---------------) + I stv + 0x00341846, // n0x1beb c0x0000 (---------------) + I surgut + 0x00289a06, // n0x1bec c0x0000 (---------------) + I syzran + 0x00314f06, // n0x1bed c0x0000 (---------------) + I tambov + 0x0036cc49, // n0x1bee c0x0000 (---------------) + I tatarstan + 0x002ff844, // n0x1bef c0x0000 (---------------) + I test + 0x0020bf43, // n0x1bf0 c0x0000 (---------------) + I tom + 0x00309805, // n0x1bf1 c0x0000 (---------------) + I tomsk + 0x0030b209, // n0x1bf2 c0x0000 (---------------) + I tsaritsyn + 0x00207803, // n0x1bf3 c0x0000 (---------------) + I tsk + 0x00359bc4, // n0x1bf4 c0x0000 (---------------) + I tula + 0x002f3304, // n0x1bf5 c0x0000 (---------------) + I tuva + 0x00360784, // n0x1bf6 c0x0000 (---------------) + I tver + 0x0031ac06, // n0x1bf7 c0x0000 (---------------) + I tyumen + 0x0020fa43, // n0x1bf8 c0x0000 (---------------) + I udm + 0x0020fa48, // n0x1bf9 c0x0000 (---------------) + I udmurtia + 0x0025a208, // n0x1bfa c0x0000 (---------------) + I ulan-ude + 0x0035ca86, // n0x1bfb c0x0000 (---------------) + I vdonsk + 0x002f998b, // n0x1bfc c0x0000 (---------------) + I vladikavkaz + 0x002f9cc8, // n0x1bfd c0x0000 (---------------) + I vladimir + 0x002f9ecb, // n0x1bfe c0x0000 (---------------) + I vladivostok + 0x002fca09, // n0x1bff c0x0000 (---------------) + I volgograd + 0x002fc187, // n0x1c00 c0x0000 (---------------) + I vologda + 0x002fce88, // n0x1c01 c0x0000 (---------------) + I voronezh + 0x002fee83, // n0x1c02 c0x0000 (---------------) + I vrn + 0x0039fc06, // n0x1c03 c0x0000 (---------------) + I vyatka + 0x0020f507, // n0x1c04 c0x0000 (---------------) + I yakutia + 0x00298b45, // n0x1c05 c0x0000 (---------------) + I yamal + 0x00346f49, // n0x1c06 c0x0000 (---------------) + I yaroslavl + 0x0030fd4d, // n0x1c07 c0x0000 (---------------) + I yekaterinburg + 0x0021aa91, // n0x1c08 c0x0000 (---------------) + I yuzhno-sakhalinsk + 0x0023d545, // n0x1c09 c0x0000 (---------------) + I zgrad + 0x00201542, // n0x1c0a c0x0000 (---------------) + I ac + 0x00200742, // n0x1c0b c0x0000 (---------------) + I co + 0x00233503, // n0x1c0c c0x0000 (---------------) + I com + 0x0023a783, // n0x1c0d c0x0000 (---------------) + I edu + 0x0033d7c4, // n0x1c0e c0x0000 (---------------) + I gouv + 0x0026cc83, // n0x1c0f c0x0000 (---------------) + I gov + 0x00201603, // n0x1c10 c0x0000 (---------------) + I int + 0x00209003, // n0x1c11 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x1c12 c0x0000 (---------------) + I net + 0x00233503, // n0x1c13 c0x0000 (---------------) + I com + 0x0023a783, // n0x1c14 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1c15 c0x0000 (---------------) + I gov + 0x00213ac3, // n0x1c16 c0x0000 (---------------) + I med + 0x0021fe03, // n0x1c17 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1c18 c0x0000 (---------------) + I org + 0x00297403, // n0x1c19 c0x0000 (---------------) + I pub + 0x00217443, // n0x1c1a c0x0000 (---------------) + I sch + 0x00233503, // n0x1c1b c0x0000 (---------------) + I com + 0x0023a783, // n0x1c1c c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1c1d c0x0000 (---------------) + I gov + 0x0021fe03, // n0x1c1e c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1c1f c0x0000 (---------------) + I org + 0x00233503, // n0x1c20 c0x0000 (---------------) + I com + 0x0023a783, // n0x1c21 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1c22 c0x0000 (---------------) + I gov + 0x0021fe03, // n0x1c23 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1c24 c0x0000 (---------------) + I org + 0x00233503, // n0x1c25 c0x0000 (---------------) + I com + 0x0023a783, // n0x1c26 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1c27 c0x0000 (---------------) + I gov + 0x003a1244, // n0x1c28 c0x0000 (---------------) + I info + 0x00213ac3, // n0x1c29 c0x0000 (---------------) + I med + 0x0021fe03, // n0x1c2a c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1c2b c0x0000 (---------------) + I org + 0x00224e42, // n0x1c2c c0x0000 (---------------) + I tv + 0x00200101, // n0x1c2d c0x0000 (---------------) + I a + 0x00201542, // n0x1c2e c0x0000 (---------------) + I ac + 0x00200001, // n0x1c2f c0x0000 (---------------) + I b + 0x003129c2, // n0x1c30 c0x0000 (---------------) + I bd + 0x000ffa08, // n0x1c31 c0x0000 (---------------) + blogspot + 0x0021ca45, // n0x1c32 c0x0000 (---------------) + I brand + 0x00200301, // n0x1c33 c0x0000 (---------------) + I c + 0x00033503, // n0x1c34 c0x0000 (---------------) + com + 0x00200381, // n0x1c35 c0x0000 (---------------) + I d + 0x00200081, // n0x1c36 c0x0000 (---------------) + I e + 0x00200581, // n0x1c37 c0x0000 (---------------) + I f + 0x0023f342, // n0x1c38 c0x0000 (---------------) + I fh + 0x0023f344, // n0x1c39 c0x0000 (---------------) + I fhsk + 0x00363543, // n0x1c3a c0x0000 (---------------) + I fhv + 0x00200c81, // n0x1c3b c0x0000 (---------------) + I g + 0x00200d81, // n0x1c3c c0x0000 (---------------) + I h + 0x00200041, // n0x1c3d c0x0000 (---------------) + I i + 0x00200fc1, // n0x1c3e c0x0000 (---------------) + I k + 0x002e9647, // n0x1c3f c0x0000 (---------------) + I komforb + 0x002d69cf, // n0x1c40 c0x0000 (---------------) + I kommunalforbund + 0x002da946, // n0x1c41 c0x0000 (---------------) + I komvux + 0x00200201, // n0x1c42 c0x0000 (---------------) + I l + 0x0026a306, // n0x1c43 c0x0000 (---------------) + I lanbib + 0x00200181, // n0x1c44 c0x0000 (---------------) + I m + 0x00200541, // n0x1c45 c0x0000 (---------------) + I n + 0x00325ace, // n0x1c46 c0x0000 (---------------) + I naturbruksgymn + 0x00200281, // n0x1c47 c0x0000 (---------------) + I o + 0x0022d1c3, // n0x1c48 c0x0000 (---------------) + I org + 0x00200941, // n0x1c49 c0x0000 (---------------) + I p + 0x002a3745, // n0x1c4a c0x0000 (---------------) + I parti + 0x00209302, // n0x1c4b c0x0000 (---------------) + I pp + 0x00247505, // n0x1c4c c0x0000 (---------------) + I press + 0x002002c1, // n0x1c4d c0x0000 (---------------) + I r + 0x002004c1, // n0x1c4e c0x0000 (---------------) + I s + 0x00200141, // n0x1c4f c0x0000 (---------------) + I t + 0x00200142, // n0x1c50 c0x0000 (---------------) + I tm + 0x00200441, // n0x1c51 c0x0000 (---------------) + I u + 0x002010c1, // n0x1c52 c0x0000 (---------------) + I w + 0x00205381, // n0x1c53 c0x0000 (---------------) + I x + 0x00201841, // n0x1c54 c0x0000 (---------------) + I y + 0x00205f81, // n0x1c55 c0x0000 (---------------) + I z + 0x000ffa08, // n0x1c56 c0x0000 (---------------) + blogspot + 0x00233503, // n0x1c57 c0x0000 (---------------) + I com + 0x0023a783, // n0x1c58 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1c59 c0x0000 (---------------) + I gov + 0x0021fe03, // n0x1c5a c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1c5b c0x0000 (---------------) + I org + 0x00220f03, // n0x1c5c c0x0000 (---------------) + I per + 0x00233503, // n0x1c5d c0x0000 (---------------) + I com + 0x0026cc83, // n0x1c5e c0x0000 (---------------) + I gov + 0x0008c288, // n0x1c5f c0x0000 (---------------) + hashbang + 0x00209003, // n0x1c60 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x1c61 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1c62 c0x0000 (---------------) + I org + 0x014da508, // n0x1c63 c0x0005 (---------------)* o platform + 0x000ffa08, // n0x1c64 c0x0000 (---------------) + blogspot + 0x000ffa08, // n0x1c65 c0x0000 (---------------) + blogspot + 0x00233503, // n0x1c66 c0x0000 (---------------) + I com + 0x0023a783, // n0x1c67 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1c68 c0x0000 (---------------) + I gov + 0x0021fe03, // n0x1c69 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1c6a c0x0000 (---------------) + I org + 0x002011c3, // n0x1c6b c0x0000 (---------------) + I art + 0x000ffa08, // n0x1c6c c0x0000 (---------------) + blogspot + 0x00233503, // n0x1c6d c0x0000 (---------------) + I com + 0x0023a783, // n0x1c6e c0x0000 (---------------) + I edu + 0x0033d7c4, // n0x1c6f c0x0000 (---------------) + I gouv + 0x0022d1c3, // n0x1c70 c0x0000 (---------------) + I org + 0x00295005, // n0x1c71 c0x0000 (---------------) + I perso + 0x00320a04, // n0x1c72 c0x0000 (---------------) + I univ + 0x00233503, // n0x1c73 c0x0000 (---------------) + I com + 0x0021fe03, // n0x1c74 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1c75 c0x0000 (---------------) + I org + 0x00200742, // n0x1c76 c0x0000 (---------------) + I co + 0x00233503, // n0x1c77 c0x0000 (---------------) + I com + 0x00237249, // n0x1c78 c0x0000 (---------------) + I consulado + 0x0023a783, // n0x1c79 c0x0000 (---------------) + I edu + 0x00242d89, // n0x1c7a c0x0000 (---------------) + I embaixada + 0x0026cc83, // n0x1c7b c0x0000 (---------------) + I gov + 0x00209003, // n0x1c7c c0x0000 (---------------) + I mil + 0x0021fe03, // n0x1c7d c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1c7e c0x0000 (---------------) + I org + 0x002e1a48, // n0x1c7f c0x0000 (---------------) + I principe + 0x00215f87, // n0x1c80 c0x0000 (---------------) + I saotome + 0x00391185, // n0x1c81 c0x0000 (---------------) + I store + 0x003a6207, // n0x1c82 c0x0000 (---------------) + I adygeya + 0x0023668b, // n0x1c83 c0x0000 (---------------) + I arkhangelsk + 0x0020d908, // n0x1c84 c0x0000 (---------------) + I balashov + 0x003269c9, // n0x1c85 c0x0000 (---------------) + I bashkiria + 0x00227447, // n0x1c86 c0x0000 (---------------) + I bryansk + 0x00202648, // n0x1c87 c0x0000 (---------------) + I dagestan + 0x00312746, // n0x1c88 c0x0000 (---------------) + I grozny + 0x0027d407, // n0x1c89 c0x0000 (---------------) + I ivanovo + 0x00226e48, // n0x1c8a c0x0000 (---------------) + I kalmykia + 0x002509c6, // n0x1c8b c0x0000 (---------------) + I kaluga + 0x00327ec7, // n0x1c8c c0x0000 (---------------) + I karelia + 0x0023f649, // n0x1c8d c0x0000 (---------------) + I khakassia + 0x0037f849, // n0x1c8e c0x0000 (---------------) + I krasnodar + 0x002b7a46, // n0x1c8f c0x0000 (---------------) + I kurgan + 0x002b8945, // n0x1c90 c0x0000 (---------------) + I lenug + 0x002c55c8, // n0x1c91 c0x0000 (---------------) + I mordovia + 0x00253243, // n0x1c92 c0x0000 (---------------) + I msk + 0x002ccc88, // n0x1c93 c0x0000 (---------------) + I murmansk + 0x0023a987, // n0x1c94 c0x0000 (---------------) + I nalchik + 0x002058c3, // n0x1c95 c0x0000 (---------------) + I nov + 0x00229c07, // n0x1c96 c0x0000 (---------------) + I obninsk + 0x00212c85, // n0x1c97 c0x0000 (---------------) + I penza + 0x002dd148, // n0x1c98 c0x0000 (---------------) + I pokrovsk + 0x00274805, // n0x1c99 c0x0000 (---------------) + I sochi + 0x00271883, // n0x1c9a c0x0000 (---------------) + I spb + 0x0033d1c9, // n0x1c9b c0x0000 (---------------) + I togliatti + 0x002aa587, // n0x1c9c c0x0000 (---------------) + I troitsk + 0x00359bc4, // n0x1c9d c0x0000 (---------------) + I tula + 0x002f3304, // n0x1c9e c0x0000 (---------------) + I tuva + 0x002f998b, // n0x1c9f c0x0000 (---------------) + I vladikavkaz + 0x002f9cc8, // n0x1ca0 c0x0000 (---------------) + I vladimir + 0x002fc187, // n0x1ca1 c0x0000 (---------------) + I vologda + 0x00233503, // n0x1ca2 c0x0000 (---------------) + I com + 0x0023a783, // n0x1ca3 c0x0000 (---------------) + I edu + 0x00213183, // n0x1ca4 c0x0000 (---------------) + I gob + 0x0022d1c3, // n0x1ca5 c0x0000 (---------------) + I org + 0x00244803, // n0x1ca6 c0x0000 (---------------) + I red + 0x0026cc83, // n0x1ca7 c0x0000 (---------------) + I gov + 0x00233503, // n0x1ca8 c0x0000 (---------------) + I com + 0x0023a783, // n0x1ca9 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1caa c0x0000 (---------------) + I gov + 0x00209003, // n0x1cab c0x0000 (---------------) + I mil + 0x0021fe03, // n0x1cac c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1cad c0x0000 (---------------) + I org + 0x00201542, // n0x1cae c0x0000 (---------------) + I ac + 0x00200742, // n0x1caf c0x0000 (---------------) + I co + 0x0022d1c3, // n0x1cb0 c0x0000 (---------------) + I org + 0x000ffa08, // n0x1cb1 c0x0000 (---------------) + blogspot + 0x00201542, // n0x1cb2 c0x0000 (---------------) + I ac + 0x00200742, // n0x1cb3 c0x0000 (---------------) + I co + 0x00202d42, // n0x1cb4 c0x0000 (---------------) + I go + 0x002013c2, // n0x1cb5 c0x0000 (---------------) + I in + 0x00209002, // n0x1cb6 c0x0000 (---------------) + I mi + 0x0021fe03, // n0x1cb7 c0x0000 (---------------) + I net + 0x00200282, // n0x1cb8 c0x0000 (---------------) + I or + 0x00201542, // n0x1cb9 c0x0000 (---------------) + I ac + 0x00330b83, // n0x1cba c0x0000 (---------------) + I biz + 0x00200742, // n0x1cbb c0x0000 (---------------) + I co + 0x00233503, // n0x1cbc c0x0000 (---------------) + I com + 0x0023a783, // n0x1cbd c0x0000 (---------------) + I edu + 0x00202d42, // n0x1cbe c0x0000 (---------------) + I go + 0x0026cc83, // n0x1cbf c0x0000 (---------------) + I gov + 0x00201603, // n0x1cc0 c0x0000 (---------------) + I int + 0x00209003, // n0x1cc1 c0x0000 (---------------) + I mil + 0x00205284, // n0x1cc2 c0x0000 (---------------) + I name + 0x0021fe03, // n0x1cc3 c0x0000 (---------------) + I net + 0x00218f83, // n0x1cc4 c0x0000 (---------------) + I nic + 0x0022d1c3, // n0x1cc5 c0x0000 (---------------) + I org + 0x002ff844, // n0x1cc6 c0x0000 (---------------) + I test + 0x00221a03, // n0x1cc7 c0x0000 (---------------) + I web + 0x0026cc83, // n0x1cc8 c0x0000 (---------------) + I gov + 0x00200742, // n0x1cc9 c0x0000 (---------------) + I co + 0x00233503, // n0x1cca c0x0000 (---------------) + I com + 0x0023a783, // n0x1ccb c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1ccc c0x0000 (---------------) + I gov + 0x00209003, // n0x1ccd c0x0000 (---------------) + I mil + 0x0021fe03, // n0x1cce c0x0000 (---------------) + I net + 0x00201483, // n0x1ccf c0x0000 (---------------) + I nom + 0x0022d1c3, // n0x1cd0 c0x0000 (---------------) + I org + 0x003927c7, // n0x1cd1 c0x0000 (---------------) + I agrinet + 0x00233503, // n0x1cd2 c0x0000 (---------------) + I com + 0x00222387, // n0x1cd3 c0x0000 (---------------) + I defense + 0x0025d886, // n0x1cd4 c0x0000 (---------------) + I edunet + 0x00215243, // n0x1cd5 c0x0000 (---------------) + I ens + 0x00207503, // n0x1cd6 c0x0000 (---------------) + I fin + 0x0026cc83, // n0x1cd7 c0x0000 (---------------) + I gov + 0x0021d883, // n0x1cd8 c0x0000 (---------------) + I ind + 0x003a1244, // n0x1cd9 c0x0000 (---------------) + I info + 0x0036d504, // n0x1cda c0x0000 (---------------) + I intl + 0x002da6c6, // n0x1cdb c0x0000 (---------------) + I mincom + 0x0022b143, // n0x1cdc c0x0000 (---------------) + I nat + 0x0021fe03, // n0x1cdd c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1cde c0x0000 (---------------) + I org + 0x00295005, // n0x1cdf c0x0000 (---------------) + I perso + 0x0020d344, // n0x1ce0 c0x0000 (---------------) + I rnrt + 0x00266ec3, // n0x1ce1 c0x0000 (---------------) + I rns + 0x00351883, // n0x1ce2 c0x0000 (---------------) + I rnu + 0x002c0507, // n0x1ce3 c0x0000 (---------------) + I tourism + 0x00209e45, // n0x1ce4 c0x0000 (---------------) + I turen + 0x00233503, // n0x1ce5 c0x0000 (---------------) + I com + 0x0023a783, // n0x1ce6 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1ce7 c0x0000 (---------------) + I gov + 0x00209003, // n0x1ce8 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x1ce9 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1cea c0x0000 (---------------) + I org + 0x00203402, // n0x1ceb c0x0000 (---------------) + I av + 0x002cb903, // n0x1cec c0x0000 (---------------) + I bbs + 0x0028e2c3, // n0x1ced c0x0000 (---------------) + I bel + 0x00330b83, // n0x1cee c0x0000 (---------------) + I biz + 0x52a33503, // n0x1cef c0x014a (n0x1d00-n0x1d01) + I com + 0x0022bf42, // n0x1cf0 c0x0000 (---------------) + I dr + 0x0023a783, // n0x1cf1 c0x0000 (---------------) + I edu + 0x00205843, // n0x1cf2 c0x0000 (---------------) + I gen + 0x0026cc83, // n0x1cf3 c0x0000 (---------------) + I gov + 0x003a1244, // n0x1cf4 c0x0000 (---------------) + I info + 0x00309ac3, // n0x1cf5 c0x0000 (---------------) + I k12 + 0x00249343, // n0x1cf6 c0x0000 (---------------) + I kep + 0x00209003, // n0x1cf7 c0x0000 (---------------) + I mil + 0x00205284, // n0x1cf8 c0x0000 (---------------) + I name + 0x52e00642, // n0x1cf9 c0x014b (n0x1d01-n0x1d02) + I nc + 0x0021fe03, // n0x1cfa c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1cfb c0x0000 (---------------) + I org + 0x00208103, // n0x1cfc c0x0000 (---------------) + I pol + 0x0022f7c3, // n0x1cfd c0x0000 (---------------) + I tel + 0x00224e42, // n0x1cfe c0x0000 (---------------) + I tv + 0x00221a03, // n0x1cff c0x0000 (---------------) + I web + 0x000ffa08, // n0x1d00 c0x0000 (---------------) + blogspot + 0x0026cc83, // n0x1d01 c0x0000 (---------------) + I gov + 0x002389c4, // n0x1d02 c0x0000 (---------------) + I aero + 0x00330b83, // n0x1d03 c0x0000 (---------------) + I biz + 0x00200742, // n0x1d04 c0x0000 (---------------) + I co + 0x00233503, // n0x1d05 c0x0000 (---------------) + I com + 0x0023d684, // n0x1d06 c0x0000 (---------------) + I coop + 0x0023a783, // n0x1d07 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1d08 c0x0000 (---------------) + I gov + 0x003a1244, // n0x1d09 c0x0000 (---------------) + I info + 0x00201603, // n0x1d0a c0x0000 (---------------) + I int + 0x002ddc44, // n0x1d0b c0x0000 (---------------) + I jobs + 0x00207104, // n0x1d0c c0x0000 (---------------) + I mobi + 0x002d0106, // n0x1d0d c0x0000 (---------------) + I museum + 0x00205284, // n0x1d0e c0x0000 (---------------) + I name + 0x0021fe03, // n0x1d0f c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1d10 c0x0000 (---------------) + I org + 0x00220e43, // n0x1d11 c0x0000 (---------------) + I pro + 0x0029bec6, // n0x1d12 c0x0000 (---------------) + I travel + 0x00055f8b, // n0x1d13 c0x0000 (---------------) + better-than + 0x00013886, // n0x1d14 c0x0000 (---------------) + dyndns + 0x0002184a, // n0x1d15 c0x0000 (---------------) + on-the-web + 0x000fef4a, // n0x1d16 c0x0000 (---------------) + worse-than + 0x000ffa08, // n0x1d17 c0x0000 (---------------) + blogspot + 0x00238ac4, // n0x1d18 c0x0000 (---------------) + I club + 0x00233503, // n0x1d19 c0x0000 (---------------) + I com + 0x00330b44, // n0x1d1a c0x0000 (---------------) + I ebiz + 0x0023a783, // n0x1d1b c0x0000 (---------------) + I edu + 0x00297cc4, // n0x1d1c c0x0000 (---------------) + I game + 0x0026cc83, // n0x1d1d c0x0000 (---------------) + I gov + 0x00317243, // n0x1d1e c0x0000 (---------------) + I idv + 0x00209003, // n0x1d1f c0x0000 (---------------) + I mil + 0x0021fe03, // n0x1d20 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1d21 c0x0000 (---------------) + I org + 0x0032444b, // n0x1d22 c0x0000 (---------------) + I xn--czrw28b + 0x003941ca, // n0x1d23 c0x0000 (---------------) + I xn--uc0atv + 0x003a54cc, // n0x1d24 c0x0000 (---------------) + I xn--zf0ao64a + 0x00201542, // n0x1d25 c0x0000 (---------------) + I ac + 0x00200742, // n0x1d26 c0x0000 (---------------) + I co + 0x00202d42, // n0x1d27 c0x0000 (---------------) + I go + 0x00234dc5, // n0x1d28 c0x0000 (---------------) + I hotel + 0x003a1244, // n0x1d29 c0x0000 (---------------) + I info + 0x00203e82, // n0x1d2a c0x0000 (---------------) + I me + 0x00209003, // n0x1d2b c0x0000 (---------------) + I mil + 0x00207104, // n0x1d2c c0x0000 (---------------) + I mobi + 0x00202c02, // n0x1d2d c0x0000 (---------------) + I ne + 0x00200282, // n0x1d2e c0x0000 (---------------) + I or + 0x00200702, // n0x1d2f c0x0000 (---------------) + I sc + 0x00224e42, // n0x1d30 c0x0000 (---------------) + I tv + 0x00130b83, // n0x1d31 c0x0000 (---------------) + biz + 0x002d5d89, // n0x1d32 c0x0000 (---------------) + I cherkassy + 0x00289888, // n0x1d33 c0x0000 (---------------) + I cherkasy + 0x0026cb09, // n0x1d34 c0x0000 (---------------) + I chernigov + 0x0027d249, // n0x1d35 c0x0000 (---------------) + I chernihiv + 0x0036e44a, // n0x1d36 c0x0000 (---------------) + I chernivtsi + 0x00375aca, // n0x1d37 c0x0000 (---------------) + I chernovtsy + 0x0020b482, // n0x1d38 c0x0000 (---------------) + I ck + 0x0021ba42, // n0x1d39 c0x0000 (---------------) + I cn + 0x00000742, // n0x1d3a c0x0000 (---------------) + co + 0x00233503, // n0x1d3b c0x0000 (---------------) + I com + 0x002049c2, // n0x1d3c c0x0000 (---------------) + I cr + 0x00245e06, // n0x1d3d c0x0000 (---------------) + I crimea + 0x00353bc2, // n0x1d3e c0x0000 (---------------) + I cv + 0x00211102, // n0x1d3f c0x0000 (---------------) + I dn + 0x002276ce, // n0x1d40 c0x0000 (---------------) + I dnepropetrovsk + 0x0027148e, // n0x1d41 c0x0000 (---------------) + I dnipropetrovsk + 0x0027d0c7, // n0x1d42 c0x0000 (---------------) + I dominic + 0x003219c7, // n0x1d43 c0x0000 (---------------) + I donetsk + 0x0024dc82, // n0x1d44 c0x0000 (---------------) + I dp + 0x0023a783, // n0x1d45 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1d46 c0x0000 (---------------) + I gov + 0x00200f02, // n0x1d47 c0x0000 (---------------) + I if + 0x002013c2, // n0x1d48 c0x0000 (---------------) + I in + 0x0024048f, // n0x1d49 c0x0000 (---------------) + I ivano-frankivsk + 0x0021acc2, // n0x1d4a c0x0000 (---------------) + I kh + 0x0023fb87, // n0x1d4b c0x0000 (---------------) + I kharkiv + 0x00240807, // n0x1d4c c0x0000 (---------------) + I kharkov + 0x0024b387, // n0x1d4d c0x0000 (---------------) + I kherson + 0x0024eb8c, // n0x1d4e c0x0000 (---------------) + I khmelnitskiy + 0x00250bcc, // n0x1d4f c0x0000 (---------------) + I khmelnytskyi + 0x00202ac4, // n0x1d50 c0x0000 (---------------) + I kiev + 0x0027ea4a, // n0x1d51 c0x0000 (---------------) + I kirovograd + 0x002316c2, // n0x1d52 c0x0000 (---------------) + I km + 0x00206fc2, // n0x1d53 c0x0000 (---------------) + I kr + 0x002b1504, // n0x1d54 c0x0000 (---------------) + I krym + 0x00254e42, // n0x1d55 c0x0000 (---------------) + I ks + 0x002bb402, // n0x1d56 c0x0000 (---------------) + I kv + 0x00250e04, // n0x1d57 c0x0000 (---------------) + I kyiv + 0x00219082, // n0x1d58 c0x0000 (---------------) + I lg + 0x00209e02, // n0x1d59 c0x0000 (---------------) + I lt + 0x00250a47, // n0x1d5a c0x0000 (---------------) + I lugansk + 0x00238045, // n0x1d5b c0x0000 (---------------) + I lutsk + 0x00205d02, // n0x1d5c c0x0000 (---------------) + I lv + 0x00240404, // n0x1d5d c0x0000 (---------------) + I lviv + 0x00367142, // n0x1d5e c0x0000 (---------------) + I mk + 0x002f0388, // n0x1d5f c0x0000 (---------------) + I mykolaiv + 0x0021fe03, // n0x1d60 c0x0000 (---------------) + I net + 0x00203488, // n0x1d61 c0x0000 (---------------) + I nikolaev + 0x00202d82, // n0x1d62 c0x0000 (---------------) + I od + 0x0023bac5, // n0x1d63 c0x0000 (---------------) + I odesa + 0x00372946, // n0x1d64 c0x0000 (---------------) + I odessa + 0x0022d1c3, // n0x1d65 c0x0000 (---------------) + I org + 0x002063c2, // n0x1d66 c0x0000 (---------------) + I pl + 0x002dea07, // n0x1d67 c0x0000 (---------------) + I poltava + 0x00009302, // n0x1d68 c0x0000 (---------------) + pp + 0x002e1c85, // n0x1d69 c0x0000 (---------------) + I rivne + 0x0038af45, // n0x1d6a c0x0000 (---------------) + I rovno + 0x00206882, // n0x1d6b c0x0000 (---------------) + I rv + 0x0022d142, // n0x1d6c c0x0000 (---------------) + I sb + 0x00207f4a, // n0x1d6d c0x0000 (---------------) + I sebastopol + 0x0025140a, // n0x1d6e c0x0000 (---------------) + I sevastopol + 0x0024cdc2, // n0x1d6f c0x0000 (---------------) + I sm + 0x002f0304, // n0x1d70 c0x0000 (---------------) + I sumy + 0x002012c2, // n0x1d71 c0x0000 (---------------) + I te + 0x00320448, // n0x1d72 c0x0000 (---------------) + I ternopil + 0x00211342, // n0x1d73 c0x0000 (---------------) + I uz + 0x0029cfc8, // n0x1d74 c0x0000 (---------------) + I uzhgorod + 0x002f6cc7, // n0x1d75 c0x0000 (---------------) + I vinnica + 0x002f7889, // n0x1d76 c0x0000 (---------------) + I vinnytsia + 0x00203442, // n0x1d77 c0x0000 (---------------) + I vn + 0x002fcc45, // n0x1d78 c0x0000 (---------------) + I volyn + 0x00289d45, // n0x1d79 c0x0000 (---------------) + I yalta + 0x002c300b, // n0x1d7a c0x0000 (---------------) + I zaporizhzhe + 0x002c3a4c, // n0x1d7b c0x0000 (---------------) + I zaporizhzhia + 0x00230c08, // n0x1d7c c0x0000 (---------------) + I zhitomir + 0x002fd008, // n0x1d7d c0x0000 (---------------) + I zhytomyr + 0x00264682, // n0x1d7e c0x0000 (---------------) + I zp + 0x00219b02, // n0x1d7f c0x0000 (---------------) + I zt + 0x00201542, // n0x1d80 c0x0000 (---------------) + I ac + 0x000ffa08, // n0x1d81 c0x0000 (---------------) + blogspot + 0x00200742, // n0x1d82 c0x0000 (---------------) + I co + 0x00233503, // n0x1d83 c0x0000 (---------------) + I com + 0x00202d42, // n0x1d84 c0x0000 (---------------) + I go + 0x00202c02, // n0x1d85 c0x0000 (---------------) + I ne + 0x00200282, // n0x1d86 c0x0000 (---------------) + I or + 0x0022d1c3, // n0x1d87 c0x0000 (---------------) + I org + 0x00200702, // n0x1d88 c0x0000 (---------------) + I sc + 0x00201542, // n0x1d89 c0x0000 (---------------) + I ac + 0x54e00742, // n0x1d8a c0x0153 (n0x1d94-n0x1d95) + I co + 0x5526cc83, // n0x1d8b c0x0154 (n0x1d95-n0x1d96) + I gov + 0x00322cc3, // n0x1d8c c0x0000 (---------------) + I ltd + 0x00203e82, // n0x1d8d c0x0000 (---------------) + I me + 0x0021fe03, // n0x1d8e c0x0000 (---------------) + I net + 0x0038eb83, // n0x1d8f c0x0000 (---------------) + I nhs + 0x0022d1c3, // n0x1d90 c0x0000 (---------------) + I org + 0x002db143, // n0x1d91 c0x0000 (---------------) + I plc + 0x00225d06, // n0x1d92 c0x0000 (---------------) + I police + 0x01617443, // n0x1d93 c0x0005 (---------------)* o I sch + 0x000ffa08, // n0x1d94 c0x0000 (---------------) + blogspot + 0x00006807, // n0x1d95 c0x0000 (---------------) + service + 0x55a01dc2, // n0x1d96 c0x0156 (n0x1dd5-n0x1dd8) + I ak + 0x55e001c2, // n0x1d97 c0x0157 (n0x1dd8-n0x1ddb) + I al + 0x56200a42, // n0x1d98 c0x0158 (n0x1ddb-n0x1dde) + I ar + 0x56601d42, // n0x1d99 c0x0159 (n0x1dde-n0x1de1) + I as + 0x56a05f42, // n0x1d9a c0x015a (n0x1de1-n0x1de4) + I az + 0x56e00302, // n0x1d9b c0x015b (n0x1de4-n0x1de7) + I ca + 0x57200742, // n0x1d9c c0x015c (n0x1de7-n0x1dea) + I co + 0x57631382, // n0x1d9d c0x015d (n0x1dea-n0x1ded) + I ct + 0x57a1fb42, // n0x1d9e c0x015e (n0x1ded-n0x1df0) + I dc + 0x57e04d82, // n0x1d9f c0x015f (n0x1df0-n0x1df3) + I de + 0x00271483, // n0x1da0 c0x0000 (---------------) + I dni + 0x00211503, // n0x1da1 c0x0000 (---------------) + I fed + 0x582175c2, // n0x1da2 c0x0160 (n0x1df3-n0x1df6) + I fl + 0x58601042, // n0x1da3 c0x0161 (n0x1df6-n0x1df9) + I ga + 0x58a0dd42, // n0x1da4 c0x0162 (n0x1df9-n0x1dfc) + I gu + 0x58e00d82, // n0x1da5 c0x0163 (n0x1dfc-n0x1dfe) + I hi + 0x59207682, // n0x1da6 c0x0164 (n0x1dfe-n0x1e01) + I ia + 0x5960c782, // n0x1da7 c0x0165 (n0x1e01-n0x1e04) + I id + 0x59a02902, // n0x1da8 c0x0166 (n0x1e04-n0x1e07) + I il + 0x59e013c2, // n0x1da9 c0x0167 (n0x1e07-n0x1e0a) + I in + 0x000b8d45, // n0x1daa c0x0000 (---------------) + is-by + 0x00223543, // n0x1dab c0x0000 (---------------) + I isa + 0x0028cd44, // n0x1dac c0x0000 (---------------) + I kids + 0x5a254e42, // n0x1dad c0x0168 (n0x1e0a-n0x1e0d) + I ks + 0x5a636902, // n0x1dae c0x0169 (n0x1e0d-n0x1e10) + I ky + 0x5aa00802, // n0x1daf c0x016a (n0x1e10-n0x1e13) + I la + 0x0007958b, // n0x1db0 c0x0000 (---------------) + land-4-sale + 0x5ae00182, // n0x1db1 c0x016b (n0x1e13-n0x1e16) + I ma + 0x5b64da82, // n0x1db2 c0x016d (n0x1e19-n0x1e1c) + I md + 0x5ba03e82, // n0x1db3 c0x016e (n0x1e1c-n0x1e1f) + I me + 0x5be09002, // n0x1db4 c0x016f (n0x1e1f-n0x1e22) + I mi + 0x5c21fdc2, // n0x1db5 c0x0170 (n0x1e22-n0x1e25) + I mn + 0x5c607102, // n0x1db6 c0x0171 (n0x1e25-n0x1e28) + I mo + 0x5ca0f702, // n0x1db7 c0x0172 (n0x1e28-n0x1e2b) + I ms + 0x5ce04c02, // n0x1db8 c0x0173 (n0x1e2b-n0x1e2e) + I mt + 0x5d200642, // n0x1db9 c0x0174 (n0x1e2e-n0x1e31) + I nc + 0x5d600882, // n0x1dba c0x0175 (n0x1e31-n0x1e33) + I nd + 0x5da02c02, // n0x1dbb c0x0176 (n0x1e33-n0x1e36) + I ne + 0x5de03382, // n0x1dbc c0x0177 (n0x1e36-n0x1e39) + I nh + 0x5e204002, // n0x1dbd c0x0178 (n0x1e39-n0x1e3c) + I nj + 0x5e63db02, // n0x1dbe c0x0179 (n0x1e3c-n0x1e3f) + I nm + 0x002e0f43, // n0x1dbf c0x0000 (---------------) + I nsn + 0x5ea03d42, // n0x1dc0 c0x017a (n0x1e3f-n0x1e42) + I nv + 0x5ee15842, // n0x1dc1 c0x017b (n0x1e42-n0x1e45) + I ny + 0x5f207382, // n0x1dc2 c0x017c (n0x1e45-n0x1e48) + I oh + 0x5f601b82, // n0x1dc3 c0x017d (n0x1e48-n0x1e4b) + I ok + 0x5fa00282, // n0x1dc4 c0x017e (n0x1e4b-n0x1e4e) + I or + 0x5fe0ac42, // n0x1dc5 c0x017f (n0x1e4e-n0x1e51) + I pa + 0x60204602, // n0x1dc6 c0x0180 (n0x1e51-n0x1e54) + I pr + 0x60600a82, // n0x1dc7 c0x0181 (n0x1e54-n0x1e57) + I ri + 0x60a00702, // n0x1dc8 c0x0182 (n0x1e57-n0x1e5a) + I sc + 0x60e496c2, // n0x1dc9 c0x0183 (n0x1e5a-n0x1e5c) + I sd + 0x000e868c, // n0x1dca c0x0000 (---------------) + stuff-4-sale + 0x6124f882, // n0x1dcb c0x0184 (n0x1e5c-n0x1e5f) + I tn + 0x61673442, // n0x1dcc c0x0185 (n0x1e5f-n0x1e62) + I tx + 0x61a03b02, // n0x1dcd c0x0186 (n0x1e62-n0x1e65) + I ut + 0x61e000c2, // n0x1dce c0x0187 (n0x1e65-n0x1e68) + I va + 0x62205d42, // n0x1dcf c0x0188 (n0x1e68-n0x1e6b) + I vi + 0x62671f82, // n0x1dd0 c0x0189 (n0x1e6b-n0x1e6e) + I vt + 0x62a010c2, // n0x1dd1 c0x018a (n0x1e6e-n0x1e71) + I wa + 0x62e0ae82, // n0x1dd2 c0x018b (n0x1e71-n0x1e74) + I wi + 0x632755c2, // n0x1dd3 c0x018c (n0x1e74-n0x1e75) + I wv + 0x63674502, // n0x1dd4 c0x018d (n0x1e75-n0x1e78) + I wy + 0x0022e182, // n0x1dd5 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1dd6 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1dd7 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1dd8 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1dd9 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1dda c0x0000 (---------------) + I lib + 0x0022e182, // n0x1ddb c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1ddc c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1ddd c0x0000 (---------------) + I lib + 0x0022e182, // n0x1dde c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1ddf c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1de0 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1de1 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1de2 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1de3 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1de4 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1de5 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1de6 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1de7 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1de8 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1de9 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1dea c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1deb c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1dec c0x0000 (---------------) + I lib + 0x0022e182, // n0x1ded c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1dee c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1def c0x0000 (---------------) + I lib + 0x0022e182, // n0x1df0 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1df1 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1df2 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1df3 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1df4 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1df5 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1df6 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1df7 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1df8 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1df9 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1dfa c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1dfb c0x0000 (---------------) + I lib + 0x0022e182, // n0x1dfc c0x0000 (---------------) + I cc + 0x0027b703, // n0x1dfd c0x0000 (---------------) + I lib + 0x0022e182, // n0x1dfe c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1dff c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e00 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e01 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e02 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e03 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e04 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e05 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e06 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e07 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e08 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e09 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e0a c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e0b c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e0c c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e0d c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e0e c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e0f c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e10 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e11 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e12 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e13 c0x0000 (---------------) + I cc + 0x5b309ac3, // n0x1e14 c0x016c (n0x1e16-n0x1e19) + I k12 + 0x0027b703, // n0x1e15 c0x0000 (---------------) + I lib + 0x0022a644, // n0x1e16 c0x0000 (---------------) + I chtr + 0x00289786, // n0x1e17 c0x0000 (---------------) + I paroch + 0x002e5543, // n0x1e18 c0x0000 (---------------) + I pvt + 0x0022e182, // n0x1e19 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e1a c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e1b c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e1c c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e1d c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e1e c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e1f c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e20 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e21 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e22 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e23 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e24 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e25 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e26 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e27 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e28 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e29 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e2a c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e2b c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e2c c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e2d c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e2e c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e2f c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e30 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e31 c0x0000 (---------------) + I cc + 0x0027b703, // n0x1e32 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e33 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e34 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e35 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e36 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e37 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e38 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e39 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e3a c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e3b c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e3c c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e3d c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e3e c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e3f c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e40 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e41 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e42 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e43 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e44 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e45 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e46 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e47 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e48 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e49 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e4a c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e4b c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e4c c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e4d c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e4e c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e4f c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e50 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e51 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e52 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e53 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e54 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e55 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e56 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e57 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e58 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e59 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e5a c0x0000 (---------------) + I cc + 0x0027b703, // n0x1e5b c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e5c c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e5d c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e5e c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e5f c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e60 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e61 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e62 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e63 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e64 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e65 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e66 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e67 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e68 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e69 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e6a c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e6b c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e6c c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e6d c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e6e c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e6f c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e70 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e71 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e72 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e73 c0x0000 (---------------) + I lib + 0x0022e182, // n0x1e74 c0x0000 (---------------) + I cc + 0x0022e182, // n0x1e75 c0x0000 (---------------) + I cc + 0x00309ac3, // n0x1e76 c0x0000 (---------------) + I k12 + 0x0027b703, // n0x1e77 c0x0000 (---------------) + I lib + 0x63e33503, // n0x1e78 c0x018f (n0x1e7e-n0x1e7f) + I com + 0x0023a783, // n0x1e79 c0x0000 (---------------) + I edu + 0x0024a483, // n0x1e7a c0x0000 (---------------) + I gub + 0x00209003, // n0x1e7b c0x0000 (---------------) + I mil + 0x0021fe03, // n0x1e7c c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1e7d c0x0000 (---------------) + I org + 0x000ffa08, // n0x1e7e c0x0000 (---------------) + blogspot + 0x00200742, // n0x1e7f c0x0000 (---------------) + I co + 0x00233503, // n0x1e80 c0x0000 (---------------) + I com + 0x0021fe03, // n0x1e81 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1e82 c0x0000 (---------------) + I org + 0x00233503, // n0x1e83 c0x0000 (---------------) + I com + 0x0023a783, // n0x1e84 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1e85 c0x0000 (---------------) + I gov + 0x00209003, // n0x1e86 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x1e87 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1e88 c0x0000 (---------------) + I org + 0x0024bf84, // n0x1e89 c0x0000 (---------------) + I arts + 0x00200742, // n0x1e8a c0x0000 (---------------) + I co + 0x00233503, // n0x1e8b c0x0000 (---------------) + I com + 0x00328c03, // n0x1e8c c0x0000 (---------------) + I e12 + 0x0023a783, // n0x1e8d c0x0000 (---------------) + I edu + 0x0024d9c4, // n0x1e8e c0x0000 (---------------) + I firm + 0x00213183, // n0x1e8f c0x0000 (---------------) + I gob + 0x0026cc83, // n0x1e90 c0x0000 (---------------) + I gov + 0x003a1244, // n0x1e91 c0x0000 (---------------) + I info + 0x00201603, // n0x1e92 c0x0000 (---------------) + I int + 0x00209003, // n0x1e93 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x1e94 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1e95 c0x0000 (---------------) + I org + 0x0022a5c3, // n0x1e96 c0x0000 (---------------) + I rec + 0x00391185, // n0x1e97 c0x0000 (---------------) + I store + 0x002d59c3, // n0x1e98 c0x0000 (---------------) + I tec + 0x00221a03, // n0x1e99 c0x0000 (---------------) + I web + 0x00200742, // n0x1e9a c0x0000 (---------------) + I co + 0x00233503, // n0x1e9b c0x0000 (---------------) + I com + 0x00309ac3, // n0x1e9c c0x0000 (---------------) + I k12 + 0x0021fe03, // n0x1e9d c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1e9e c0x0000 (---------------) + I org + 0x00201542, // n0x1e9f c0x0000 (---------------) + I ac + 0x00330b83, // n0x1ea0 c0x0000 (---------------) + I biz + 0x000ffa08, // n0x1ea1 c0x0000 (---------------) + blogspot + 0x00233503, // n0x1ea2 c0x0000 (---------------) + I com + 0x0023a783, // n0x1ea3 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1ea4 c0x0000 (---------------) + I gov + 0x0036b386, // n0x1ea5 c0x0000 (---------------) + I health + 0x003a1244, // n0x1ea6 c0x0000 (---------------) + I info + 0x00201603, // n0x1ea7 c0x0000 (---------------) + I int + 0x00205284, // n0x1ea8 c0x0000 (---------------) + I name + 0x0021fe03, // n0x1ea9 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1eaa c0x0000 (---------------) + I org + 0x00220e43, // n0x1eab c0x0000 (---------------) + I pro + 0x00233503, // n0x1eac c0x0000 (---------------) + I com + 0x0023a783, // n0x1ead c0x0000 (---------------) + I edu + 0x0021fe03, // n0x1eae c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1eaf c0x0000 (---------------) + I org + 0x00233503, // n0x1eb0 c0x0000 (---------------) + I com + 0x00013886, // n0x1eb1 c0x0000 (---------------) + dyndns + 0x0023a783, // n0x1eb2 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1eb3 c0x0000 (---------------) + I gov + 0x000d0d86, // n0x1eb4 c0x0000 (---------------) + mypets + 0x0021fe03, // n0x1eb5 c0x0000 (---------------) + I net + 0x0022d1c3, // n0x1eb6 c0x0000 (---------------) + I org + 0x00309e08, // n0x1eb7 c0x0000 (---------------) + I xn--80au + 0x0030c549, // n0x1eb8 c0x0000 (---------------) + I xn--90azh + 0x00318cc9, // n0x1eb9 c0x0000 (---------------) + I xn--c1avg + 0x00329088, // n0x1eba c0x0000 (---------------) + I xn--d1at + 0x00374908, // n0x1ebb c0x0000 (---------------) + I xn--o1ac + 0x00374909, // n0x1ebc c0x0000 (---------------) + I xn--o1ach + 0x00201542, // n0x1ebd c0x0000 (---------------) + I ac + 0x00209c85, // n0x1ebe c0x0000 (---------------) + I agric + 0x0023adc3, // n0x1ebf c0x0000 (---------------) + I alt + 0x66600742, // n0x1ec0 c0x0199 (n0x1ece-n0x1ecf) + I co + 0x0023a783, // n0x1ec1 c0x0000 (---------------) + I edu + 0x0026cc83, // n0x1ec2 c0x0000 (---------------) + I gov + 0x0027d907, // n0x1ec3 c0x0000 (---------------) + I grondar + 0x00274483, // n0x1ec4 c0x0000 (---------------) + I law + 0x00209003, // n0x1ec5 c0x0000 (---------------) + I mil + 0x0021fe03, // n0x1ec6 c0x0000 (---------------) + I net + 0x00202d03, // n0x1ec7 c0x0000 (---------------) + I ngo + 0x00211803, // n0x1ec8 c0x0000 (---------------) + I nis + 0x00201483, // n0x1ec9 c0x0000 (---------------) + I nom + 0x0022d1c3, // n0x1eca c0x0000 (---------------) + I org + 0x0023d0c6, // n0x1ecb c0x0000 (---------------) + I school + 0x00200142, // n0x1ecc c0x0000 (---------------) + I tm + 0x00221a03, // n0x1ecd c0x0000 (---------------) + I web + 0x000ffa08, // n0x1ece c0x0000 (---------------) + blogspot +} + +// children is the list of nodes' children, the parent's wildcard bit and the +// parent's node type. If a node has no children then their children index +// will be in the range [0, 6), depending on the wildcard bit and node type. +// +// The layout within the uint32, from MSB to LSB, is: +// [ 1 bits] unused +// [ 1 bits] wildcard bit +// [ 2 bits] node type +// [14 bits] high nodes index (exclusive) of children +// [14 bits] low nodes index (inclusive) of children +var children = [...]uint32{ + 0x00000000, // c0x0000 (---------------) + + 0x10000000, // c0x0001 (---------------) ! + 0x20000000, // c0x0002 (---------------) o + 0x40000000, // c0x0003 (---------------)* + + 0x50000000, // c0x0004 (---------------)* ! + 0x60000000, // c0x0005 (---------------)* o + 0x0183c609, // c0x0006 (n0x0609-n0x060f) + + 0x0184060f, // c0x0007 (n0x060f-n0x0610) + + 0x01860610, // c0x0008 (n0x0610-n0x0618) + + 0x019bc618, // c0x0009 (n0x0618-n0x066f) + + 0x019d066f, // c0x000a (n0x066f-n0x0674) + + 0x019e4674, // c0x000b (n0x0674-n0x0679) + + 0x019f4679, // c0x000c (n0x0679-n0x067d) + + 0x01a1067d, // c0x000d (n0x067d-n0x0684) + + 0x01a14684, // c0x000e (n0x0684-n0x0685) + + 0x01a2c685, // c0x000f (n0x0685-n0x068b) + + 0x01a5068b, // c0x0010 (n0x068b-n0x0694) + + 0x01a54694, // c0x0011 (n0x0694-n0x0695) + + 0x01a6c695, // c0x0012 (n0x0695-n0x069b) + + 0x01a7069b, // c0x0013 (n0x069b-n0x069c) + + 0x01a8c69c, // c0x0014 (n0x069c-n0x06a3) + + 0x01a906a3, // c0x0015 (n0x06a3-n0x06a4) + + 0x01ad86a4, // c0x0016 (n0x06a4-n0x06b6) + + 0x01adc6b6, // c0x0017 (n0x06b6-n0x06b7) + + 0x01afc6b7, // c0x0018 (n0x06b7-n0x06bf) + + 0x01b106bf, // c0x0019 (n0x06bf-n0x06c4) + + 0x01b146c4, // c0x001a (n0x06c4-n0x06c5) + + 0x01b446c5, // c0x001b (n0x06c5-n0x06d1) + + 0x01b706d1, // c0x001c (n0x06d1-n0x06dc) + + 0x01b986dc, // c0x001d (n0x06dc-n0x06e6) + + 0x01ba06e6, // c0x001e (n0x06e6-n0x06e8) + + 0x01ba46e8, // c0x001f (n0x06e8-n0x06e9) + + 0x01c386e9, // c0x0020 (n0x06e9-n0x070e) + + 0x01c4c70e, // c0x0021 (n0x070e-n0x0713) + + 0x01c60713, // c0x0022 (n0x0713-n0x0718) + + 0x01c80718, // c0x0023 (n0x0718-n0x0720) + + 0x01c90720, // c0x0024 (n0x0720-n0x0724) + + 0x01ca4724, // c0x0025 (n0x0724-n0x0729) + + 0x01cc8729, // c0x0026 (n0x0729-n0x0732) + + 0x01de0732, // c0x0027 (n0x0732-n0x0778) + + 0x01de4778, // c0x0028 (n0x0778-n0x0779) + + 0x01df8779, // c0x0029 (n0x0779-n0x077e) + + 0x01e0c77e, // c0x002a (n0x077e-n0x0783) + + 0x01e14783, // c0x002b (n0x0783-n0x0785) + + 0x01e24785, // c0x002c (n0x0785-n0x0789) + + 0x01e28789, // c0x002d (n0x0789-n0x078a) + + 0x01e4078a, // c0x002e (n0x078a-n0x0790) + + 0x01e84790, // c0x002f (n0x0790-n0x07a1) + + 0x01e947a1, // c0x0030 (n0x07a1-n0x07a5) + + 0x01e987a5, // c0x0031 (n0x07a5-n0x07a6) + + 0x01e9c7a6, // c0x0032 (n0x07a6-n0x07a7) + + 0x01ea07a7, // c0x0033 (n0x07a7-n0x07a8) + + 0x01edc7a8, // c0x0034 (n0x07a8-n0x07b7) + + 0x61ee07b7, // c0x0035 (n0x07b7-n0x07b8)* o + 0x01ef47b8, // c0x0036 (n0x07b8-n0x07bd) + + 0x01f047bd, // c0x0037 (n0x07bd-n0x07c1) + + 0x01fb87c1, // c0x0038 (n0x07c1-n0x07ee) + + 0x21fbc7ee, // c0x0039 (n0x07ee-n0x07ef) o + 0x01fc07ef, // c0x003a (n0x07ef-n0x07f0) + + 0x01fc47f0, // c0x003b (n0x07f0-n0x07f1) + + 0x21fc87f1, // c0x003c (n0x07f1-n0x07f2) o + 0x21fcc7f2, // c0x003d (n0x07f2-n0x07f3) o + 0x020007f3, // c0x003e (n0x07f3-n0x0800) + + 0x02004800, // c0x003f (n0x0800-n0x0801) + + 0x0235c801, // c0x0040 (n0x0801-n0x08d7) + + 0x223ac8d7, // c0x0041 (n0x08d7-n0x08eb) o + 0x223b08eb, // c0x0042 (n0x08eb-n0x08ec) o + 0x023d88ec, // c0x0043 (n0x08ec-n0x08f6) + + 0x023e08f6, // c0x0044 (n0x08f6-n0x08f8) + + 0x223e48f8, // c0x0045 (n0x08f8-n0x08f9) o + 0x223e88f9, // c0x0046 (n0x08f9-n0x08fa) o + 0x023f48fa, // c0x0047 (n0x08fa-n0x08fd) + + 0x223f88fd, // c0x0048 (n0x08fd-n0x08fe) o + 0x024148fe, // c0x0049 (n0x08fe-n0x0905) + + 0x0242c905, // c0x004a (n0x0905-n0x090b) + + 0x0243090b, // c0x004b (n0x090b-n0x090c) + + 0x0244090c, // c0x004c (n0x090c-n0x0910) + + 0x02448910, // c0x004d (n0x0910-n0x0912) + + 0x2247c912, // c0x004e (n0x0912-n0x091f) o + 0x0248091f, // c0x004f (n0x091f-n0x0920) + + 0x02488920, // c0x0050 (n0x0920-n0x0922) + + 0x024a8922, // c0x0051 (n0x0922-n0x092a) + + 0x024ac92a, // c0x0052 (n0x092a-n0x092b) + + 0x024c092b, // c0x0053 (n0x092b-n0x0930) + + 0x024e8930, // c0x0054 (n0x0930-n0x093a) + + 0x0250893a, // c0x0055 (n0x093a-n0x0942) + + 0x02538942, // c0x0056 (n0x0942-n0x094e) + + 0x0256094e, // c0x0057 (n0x094e-n0x0958) + + 0x02564958, // c0x0058 (n0x0958-n0x0959) + + 0x02588959, // c0x0059 (n0x0959-n0x0962) + + 0x0258c962, // c0x005a (n0x0962-n0x0963) + + 0x025a0963, // c0x005b (n0x0963-n0x0968) + + 0x025a4968, // c0x005c (n0x0968-n0x0969) + + 0x025c4969, // c0x005d (n0x0969-n0x0971) + + 0x025d0971, // c0x005e (n0x0971-n0x0974) + + 0x02630974, // c0x005f (n0x0974-n0x098c) + + 0x0264c98c, // c0x0060 (n0x098c-n0x0993) + + 0x02658993, // c0x0061 (n0x0993-n0x0996) + + 0x0266c996, // c0x0062 (n0x0996-n0x099b) + + 0x0268499b, // c0x0063 (n0x099b-n0x09a1) + + 0x026989a1, // c0x0064 (n0x09a1-n0x09a6) + + 0x026b09a6, // c0x0065 (n0x09a6-n0x09ac) + + 0x026c89ac, // c0x0066 (n0x09ac-n0x09b2) + + 0x026e09b2, // c0x0067 (n0x09b2-n0x09b8) + + 0x026fc9b8, // c0x0068 (n0x09b8-n0x09bf) + + 0x027149bf, // c0x0069 (n0x09bf-n0x09c5) + + 0x027749c5, // c0x006a (n0x09c5-n0x09dd) + + 0x0278c9dd, // c0x006b (n0x09dd-n0x09e3) + + 0x027a09e3, // c0x006c (n0x09e3-n0x09e8) + + 0x027e49e8, // c0x006d (n0x09e8-n0x09f9) + + 0x028649f9, // c0x006e (n0x09f9-n0x0a19) + + 0x02890a19, // c0x006f (n0x0a19-n0x0a24) + + 0x02894a24, // c0x0070 (n0x0a24-n0x0a25) + + 0x0289ca25, // c0x0071 (n0x0a25-n0x0a27) + + 0x028bca27, // c0x0072 (n0x0a27-n0x0a2f) + + 0x028c0a2f, // c0x0073 (n0x0a2f-n0x0a30) + + 0x028dca30, // c0x0074 (n0x0a30-n0x0a37) + + 0x028e4a37, // c0x0075 (n0x0a37-n0x0a39) + + 0x02918a39, // c0x0076 (n0x0a39-n0x0a46) + + 0x02940a46, // c0x0077 (n0x0a46-n0x0a50) + + 0x02944a50, // c0x0078 (n0x0a50-n0x0a51) + + 0x0295ca51, // c0x0079 (n0x0a51-n0x0a57) + + 0x02974a57, // c0x007a (n0x0a57-n0x0a5d) + + 0x02998a5d, // c0x007b (n0x0a5d-n0x0a66) + + 0x029b8a66, // c0x007c (n0x0a66-n0x0a6e) + + 0x02f7ca6e, // c0x007d (n0x0a6e-n0x0bdf) + + 0x02f88bdf, // c0x007e (n0x0bdf-n0x0be2) + + 0x02fa8be2, // c0x007f (n0x0be2-n0x0bea) + + 0x03164bea, // c0x0080 (n0x0bea-n0x0c59) + + 0x03234c59, // c0x0081 (n0x0c59-n0x0c8d) + + 0x032a4c8d, // c0x0082 (n0x0c8d-n0x0ca9) + + 0x032fcca9, // c0x0083 (n0x0ca9-n0x0cbf) + + 0x033e4cbf, // c0x0084 (n0x0cbf-n0x0cf9) + + 0x0343ccf9, // c0x0085 (n0x0cf9-n0x0d0f) + + 0x03478d0f, // c0x0086 (n0x0d0f-n0x0d1e) + + 0x03574d1e, // c0x0087 (n0x0d1e-n0x0d5d) + + 0x03640d5d, // c0x0088 (n0x0d5d-n0x0d90) + + 0x036d8d90, // c0x0089 (n0x0d90-n0x0db6) + + 0x03768db6, // c0x008a (n0x0db6-n0x0dda) + + 0x037ccdda, // c0x008b (n0x0dda-n0x0df3) + + 0x03a04df3, // c0x008c (n0x0df3-n0x0e81) + + 0x03abce81, // c0x008d (n0x0e81-n0x0eaf) + + 0x03b88eaf, // c0x008e (n0x0eaf-n0x0ee2) + + 0x03bd4ee2, // c0x008f (n0x0ee2-n0x0ef5) + + 0x03c5cef5, // c0x0090 (n0x0ef5-n0x0f17) + + 0x03c98f17, // c0x0091 (n0x0f17-n0x0f26) + + 0x03ce8f26, // c0x0092 (n0x0f26-n0x0f3a) + + 0x03d60f3a, // c0x0093 (n0x0f3a-n0x0f58) + + 0x63d64f58, // c0x0094 (n0x0f58-n0x0f59)* o + 0x63d68f59, // c0x0095 (n0x0f59-n0x0f5a)* o + 0x63d6cf5a, // c0x0096 (n0x0f5a-n0x0f5b)* o + 0x03de8f5b, // c0x0097 (n0x0f5b-n0x0f7a) + + 0x03e50f7a, // c0x0098 (n0x0f7a-n0x0f94) + + 0x03eccf94, // c0x0099 (n0x0f94-n0x0fb3) + + 0x03f44fb3, // c0x009a (n0x0fb3-n0x0fd1) + + 0x03fc8fd1, // c0x009b (n0x0fd1-n0x0ff2) + + 0x04034ff2, // c0x009c (n0x0ff2-n0x100d) + + 0x0416100d, // c0x009d (n0x100d-n0x1058) + + 0x041b9058, // c0x009e (n0x1058-n0x106e) + + 0x641bd06e, // c0x009f (n0x106e-n0x106f)* o + 0x0425506f, // c0x00a0 (n0x106f-n0x1095) + + 0x042dd095, // c0x00a1 (n0x1095-n0x10b7) + + 0x043290b7, // c0x00a2 (n0x10b7-n0x10ca) + + 0x043910ca, // c0x00a3 (n0x10ca-n0x10e4) + + 0x044390e4, // c0x00a4 (n0x10e4-n0x110e) + + 0x0450110e, // c0x00a5 (n0x110e-n0x1140) + + 0x04569140, // c0x00a6 (n0x1140-n0x115a) + + 0x0467d15a, // c0x00a7 (n0x115a-n0x119f) + + 0x6468119f, // c0x00a8 (n0x119f-n0x11a0)* o + 0x646851a0, // c0x00a9 (n0x11a0-n0x11a1)* o + 0x046e11a1, // c0x00aa (n0x11a1-n0x11b8) + + 0x0473d1b8, // c0x00ab (n0x11b8-n0x11cf) + + 0x047cd1cf, // c0x00ac (n0x11cf-n0x11f3) + + 0x048491f3, // c0x00ad (n0x11f3-n0x1212) + + 0x0488d212, // c0x00ae (n0x1212-n0x1223) + + 0x04971223, // c0x00af (n0x1223-n0x125c) + + 0x049a525c, // c0x00b0 (n0x125c-n0x1269) + + 0x04a05269, // c0x00b1 (n0x1269-n0x1281) + + 0x04a79281, // c0x00b2 (n0x1281-n0x129e) + + 0x04b0129e, // c0x00b3 (n0x129e-n0x12c0) + + 0x04b412c0, // c0x00b4 (n0x12c0-n0x12d0) + + 0x04bb12d0, // c0x00b5 (n0x12d0-n0x12ec) + + 0x64bb52ec, // c0x00b6 (n0x12ec-n0x12ed)* o + 0x64bb92ed, // c0x00b7 (n0x12ed-n0x12ee)* o + 0x24bbd2ee, // c0x00b8 (n0x12ee-n0x12ef) o + 0x04bd52ef, // c0x00b9 (n0x12ef-n0x12f5) + + 0x04bf12f5, // c0x00ba (n0x12f5-n0x12fc) + + 0x04c352fc, // c0x00bb (n0x12fc-n0x130d) + + 0x04c4530d, // c0x00bc (n0x130d-n0x1311) + + 0x04c5d311, // c0x00bd (n0x1311-n0x1317) + + 0x04cd5317, // c0x00be (n0x1317-n0x1335) + + 0x04ce9335, // c0x00bf (n0x1335-n0x133a) + + 0x04d0133a, // c0x00c0 (n0x133a-n0x1340) + + 0x04d25340, // c0x00c1 (n0x1340-n0x1349) + + 0x04d39349, // c0x00c2 (n0x1349-n0x134e) + + 0x04d5134e, // c0x00c3 (n0x134e-n0x1354) + + 0x04d55354, // c0x00c4 (n0x1354-n0x1355) + + 0x04d91355, // c0x00c5 (n0x1355-n0x1364) + + 0x04da5364, // c0x00c6 (n0x1364-n0x1369) + + 0x04dad369, // c0x00c7 (n0x1369-n0x136b) + + 0x04db536b, // c0x00c8 (n0x136b-n0x136d) + + 0x04db936d, // c0x00c9 (n0x136d-n0x136e) + + 0x04ddd36e, // c0x00ca (n0x136e-n0x1377) + + 0x04e01377, // c0x00cb (n0x1377-n0x1380) + + 0x04e19380, // c0x00cc (n0x1380-n0x1386) + + 0x04e21386, // c0x00cd (n0x1386-n0x1388) + + 0x04e25388, // c0x00ce (n0x1388-n0x1389) + + 0x04e59389, // c0x00cf (n0x1389-n0x1396) + + 0x04e7d396, // c0x00d0 (n0x1396-n0x139f) + + 0x04e9d39f, // c0x00d1 (n0x139f-n0x13a7) + + 0x04eb93a7, // c0x00d2 (n0x13a7-n0x13ae) + + 0x04ec93ae, // c0x00d3 (n0x13ae-n0x13b2) + + 0x04edd3b2, // c0x00d4 (n0x13b2-n0x13b7) + + 0x04ee13b7, // c0x00d5 (n0x13b7-n0x13b8) + + 0x04ee93b8, // c0x00d6 (n0x13b8-n0x13ba) + + 0x04efd3ba, // c0x00d7 (n0x13ba-n0x13bf) + + 0x04f0d3bf, // c0x00d8 (n0x13bf-n0x13c3) + + 0x04f113c3, // c0x00d9 (n0x13c3-n0x13c4) + + 0x04f2d3c4, // c0x00da (n0x13c4-n0x13cb) + + 0x057bd3cb, // c0x00db (n0x13cb-n0x15ef) + + 0x057f55ef, // c0x00dc (n0x15ef-n0x15fd) + + 0x058215fd, // c0x00dd (n0x15fd-n0x1608) + + 0x05839608, // c0x00de (n0x1608-n0x160e) + + 0x0585960e, // c0x00df (n0x160e-n0x1616) + + 0x6585d616, // c0x00e0 (n0x1616-n0x1617)* o + 0x058a1617, // c0x00e1 (n0x1617-n0x1628) + + 0x058a9628, // c0x00e2 (n0x1628-n0x162a) + + 0x258ad62a, // c0x00e3 (n0x162a-n0x162b) o + 0x258b162b, // c0x00e4 (n0x162b-n0x162c) o + 0x058b562c, // c0x00e5 (n0x162c-n0x162d) + + 0x0598d62d, // c0x00e6 (n0x162d-n0x1663) + + 0x25991663, // c0x00e7 (n0x1663-n0x1664) o + 0x25999664, // c0x00e8 (n0x1664-n0x1666) o + 0x259a1666, // c0x00e9 (n0x1666-n0x1668) o + 0x259ad668, // c0x00ea (n0x1668-n0x166b) o + 0x059d566b, // c0x00eb (n0x166b-n0x1675) + + 0x059fd675, // c0x00ec (n0x1675-n0x167f) + + 0x05a0167f, // c0x00ed (n0x167f-n0x1680) + + 0x25a39680, // c0x00ee (n0x1680-n0x168e) o + 0x05a4568e, // c0x00ef (n0x168e-n0x1691) + + 0x0659d691, // c0x00f0 (n0x1691-n0x1967) + + 0x065a1967, // c0x00f1 (n0x1967-n0x1968) + + 0x065a5968, // c0x00f2 (n0x1968-n0x1969) + + 0x265a9969, // c0x00f3 (n0x1969-n0x196a) o + 0x065ad96a, // c0x00f4 (n0x196a-n0x196b) + + 0x265b196b, // c0x00f5 (n0x196b-n0x196c) o + 0x065b596c, // c0x00f6 (n0x196c-n0x196d) + + 0x265c196d, // c0x00f7 (n0x196d-n0x1970) o + 0x065c5970, // c0x00f8 (n0x1970-n0x1971) + + 0x065c9971, // c0x00f9 (n0x1971-n0x1972) + + 0x265cd972, // c0x00fa (n0x1972-n0x1973) o + 0x065d1973, // c0x00fb (n0x1973-n0x1974) + + 0x265d9974, // c0x00fc (n0x1974-n0x1976) o + 0x065dd976, // c0x00fd (n0x1976-n0x1977) + + 0x065e1977, // c0x00fe (n0x1977-n0x1978) + + 0x265f1978, // c0x00ff (n0x1978-n0x197c) o + 0x065f597c, // c0x0100 (n0x197c-n0x197d) + + 0x065f997d, // c0x0101 (n0x197d-n0x197e) + + 0x065fd97e, // c0x0102 (n0x197e-n0x197f) + + 0x0660197f, // c0x0103 (n0x197f-n0x1980) + + 0x26605980, // c0x0104 (n0x1980-n0x1981) o + 0x06609981, // c0x0105 (n0x1981-n0x1982) + + 0x0660d982, // c0x0106 (n0x1982-n0x1983) + + 0x06611983, // c0x0107 (n0x1983-n0x1984) + + 0x06615984, // c0x0108 (n0x1984-n0x1985) + + 0x2661d985, // c0x0109 (n0x1985-n0x1987) o + 0x06621987, // c0x010a (n0x1987-n0x1988) + + 0x06625988, // c0x010b (n0x1988-n0x1989) + + 0x06629989, // c0x010c (n0x1989-n0x198a) + + 0x2662d98a, // c0x010d (n0x198a-n0x198b) o + 0x0663198b, // c0x010e (n0x198b-n0x198c) + + 0x2663998c, // c0x010f (n0x198c-n0x198e) o + 0x2663d98e, // c0x0110 (n0x198e-n0x198f) o + 0x0665998f, // c0x0111 (n0x198f-n0x1996) + + 0x06665996, // c0x0112 (n0x1996-n0x1999) + + 0x066a5999, // c0x0113 (n0x1999-n0x19a9) + + 0x066a99a9, // c0x0114 (n0x19a9-n0x19aa) + + 0x066cd9aa, // c0x0115 (n0x19aa-n0x19b3) + + 0x067c19b3, // c0x0116 (n0x19b3-n0x19f0) + + 0x267c99f0, // c0x0117 (n0x19f0-n0x19f2) o + 0x267cd9f2, // c0x0118 (n0x19f2-n0x19f3) o + 0x267d19f3, // c0x0119 (n0x19f3-n0x19f4) o + 0x067d99f4, // c0x011a (n0x19f4-n0x19f6) + + 0x068b59f6, // c0x011b (n0x19f6-n0x1a2d) + + 0x068e1a2d, // c0x011c (n0x1a2d-n0x1a38) + + 0x06901a38, // c0x011d (n0x1a38-n0x1a40) + + 0x0690da40, // c0x011e (n0x1a40-n0x1a43) + + 0x0692da43, // c0x011f (n0x1a43-n0x1a4b) + + 0x06965a4b, // c0x0120 (n0x1a4b-n0x1a59) + + 0x06bf9a59, // c0x0121 (n0x1a59-n0x1afe) + + 0x06cb5afe, // c0x0122 (n0x1afe-n0x1b2d) + + 0x06cc9b2d, // c0x0123 (n0x1b2d-n0x1b32) + + 0x06cfdb32, // c0x0124 (n0x1b32-n0x1b3f) + + 0x06d29b3f, // c0x0125 (n0x1b3f-n0x1b4a) + + 0x06d45b4a, // c0x0126 (n0x1b4a-n0x1b51) + + 0x06d69b51, // c0x0127 (n0x1b51-n0x1b5a) + + 0x06d81b5a, // c0x0128 (n0x1b5a-n0x1b60) + + 0x06d9db60, // c0x0129 (n0x1b60-n0x1b67) + + 0x06dc1b67, // c0x012a (n0x1b67-n0x1b70) + + 0x06dd1b70, // c0x012b (n0x1b70-n0x1b74) + + 0x06e01b74, // c0x012c (n0x1b74-n0x1b80) + + 0x06e1db80, // c0x012d (n0x1b80-n0x1b87) + + 0x07029b87, // c0x012e (n0x1b87-n0x1c0a) + + 0x0704dc0a, // c0x012f (n0x1c0a-n0x1c13) + + 0x0706dc13, // c0x0130 (n0x1c13-n0x1c1b) + + 0x07081c1b, // c0x0131 (n0x1c1b-n0x1c20) + + 0x07095c20, // c0x0132 (n0x1c20-n0x1c25) + + 0x070b5c25, // c0x0133 (n0x1c25-n0x1c2d) + + 0x07159c2d, // c0x0134 (n0x1c2d-n0x1c56) + + 0x07175c56, // c0x0135 (n0x1c56-n0x1c5d) + + 0x07191c5d, // c0x0136 (n0x1c5d-n0x1c64) + + 0x07195c64, // c0x0137 (n0x1c64-n0x1c65) + + 0x07199c65, // c0x0138 (n0x1c65-n0x1c66) + + 0x071adc66, // c0x0139 (n0x1c66-n0x1c6b) + + 0x071cdc6b, // c0x013a (n0x1c6b-n0x1c73) + + 0x071d9c73, // c0x013b (n0x1c73-n0x1c76) + + 0x07209c76, // c0x013c (n0x1c76-n0x1c82) + + 0x07289c82, // c0x013d (n0x1c82-n0x1ca2) + + 0x0729dca2, // c0x013e (n0x1ca2-n0x1ca7) + + 0x072a1ca7, // c0x013f (n0x1ca7-n0x1ca8) + + 0x072b9ca8, // c0x0140 (n0x1ca8-n0x1cae) + + 0x072c5cae, // c0x0141 (n0x1cae-n0x1cb1) + + 0x072c9cb1, // c0x0142 (n0x1cb1-n0x1cb2) + + 0x072e5cb2, // c0x0143 (n0x1cb2-n0x1cb9) + + 0x07321cb9, // c0x0144 (n0x1cb9-n0x1cc8) + + 0x07325cc8, // c0x0145 (n0x1cc8-n0x1cc9) + + 0x07345cc9, // c0x0146 (n0x1cc9-n0x1cd1) + + 0x07395cd1, // c0x0147 (n0x1cd1-n0x1ce5) + + 0x073adce5, // c0x0148 (n0x1ce5-n0x1ceb) + + 0x07401ceb, // c0x0149 (n0x1ceb-n0x1d00) + + 0x07405d00, // c0x014a (n0x1d00-n0x1d01) + + 0x07409d01, // c0x014b (n0x1d01-n0x1d02) + + 0x0744dd02, // c0x014c (n0x1d02-n0x1d13) + + 0x0745dd13, // c0x014d (n0x1d13-n0x1d17) + + 0x07495d17, // c0x014e (n0x1d17-n0x1d25) + + 0x074c5d25, // c0x014f (n0x1d25-n0x1d31) + + 0x07601d31, // c0x0150 (n0x1d31-n0x1d80) + + 0x07625d80, // c0x0151 (n0x1d80-n0x1d89) + + 0x07651d89, // c0x0152 (n0x1d89-n0x1d94) + + 0x07655d94, // c0x0153 (n0x1d94-n0x1d95) + + 0x07659d95, // c0x0154 (n0x1d95-n0x1d96) + + 0x07755d96, // c0x0155 (n0x1d96-n0x1dd5) + + 0x07761dd5, // c0x0156 (n0x1dd5-n0x1dd8) + + 0x0776ddd8, // c0x0157 (n0x1dd8-n0x1ddb) + + 0x07779ddb, // c0x0158 (n0x1ddb-n0x1dde) + + 0x07785dde, // c0x0159 (n0x1dde-n0x1de1) + + 0x07791de1, // c0x015a (n0x1de1-n0x1de4) + + 0x0779dde4, // c0x015b (n0x1de4-n0x1de7) + + 0x077a9de7, // c0x015c (n0x1de7-n0x1dea) + + 0x077b5dea, // c0x015d (n0x1dea-n0x1ded) + + 0x077c1ded, // c0x015e (n0x1ded-n0x1df0) + + 0x077cddf0, // c0x015f (n0x1df0-n0x1df3) + + 0x077d9df3, // c0x0160 (n0x1df3-n0x1df6) + + 0x077e5df6, // c0x0161 (n0x1df6-n0x1df9) + + 0x077f1df9, // c0x0162 (n0x1df9-n0x1dfc) + + 0x077f9dfc, // c0x0163 (n0x1dfc-n0x1dfe) + + 0x07805dfe, // c0x0164 (n0x1dfe-n0x1e01) + + 0x07811e01, // c0x0165 (n0x1e01-n0x1e04) + + 0x0781de04, // c0x0166 (n0x1e04-n0x1e07) + + 0x07829e07, // c0x0167 (n0x1e07-n0x1e0a) + + 0x07835e0a, // c0x0168 (n0x1e0a-n0x1e0d) + + 0x07841e0d, // c0x0169 (n0x1e0d-n0x1e10) + + 0x0784de10, // c0x016a (n0x1e10-n0x1e13) + + 0x07859e13, // c0x016b (n0x1e13-n0x1e16) + + 0x07865e16, // c0x016c (n0x1e16-n0x1e19) + + 0x07871e19, // c0x016d (n0x1e19-n0x1e1c) + + 0x0787de1c, // c0x016e (n0x1e1c-n0x1e1f) + + 0x07889e1f, // c0x016f (n0x1e1f-n0x1e22) + + 0x07895e22, // c0x0170 (n0x1e22-n0x1e25) + + 0x078a1e25, // c0x0171 (n0x1e25-n0x1e28) + + 0x078ade28, // c0x0172 (n0x1e28-n0x1e2b) + + 0x078b9e2b, // c0x0173 (n0x1e2b-n0x1e2e) + + 0x078c5e2e, // c0x0174 (n0x1e2e-n0x1e31) + + 0x078cde31, // c0x0175 (n0x1e31-n0x1e33) + + 0x078d9e33, // c0x0176 (n0x1e33-n0x1e36) + + 0x078e5e36, // c0x0177 (n0x1e36-n0x1e39) + + 0x078f1e39, // c0x0178 (n0x1e39-n0x1e3c) + + 0x078fde3c, // c0x0179 (n0x1e3c-n0x1e3f) + + 0x07909e3f, // c0x017a (n0x1e3f-n0x1e42) + + 0x07915e42, // c0x017b (n0x1e42-n0x1e45) + + 0x07921e45, // c0x017c (n0x1e45-n0x1e48) + + 0x0792de48, // c0x017d (n0x1e48-n0x1e4b) + + 0x07939e4b, // c0x017e (n0x1e4b-n0x1e4e) + + 0x07945e4e, // c0x017f (n0x1e4e-n0x1e51) + + 0x07951e51, // c0x0180 (n0x1e51-n0x1e54) + + 0x0795de54, // c0x0181 (n0x1e54-n0x1e57) + + 0x07969e57, // c0x0182 (n0x1e57-n0x1e5a) + + 0x07971e5a, // c0x0183 (n0x1e5a-n0x1e5c) + + 0x0797de5c, // c0x0184 (n0x1e5c-n0x1e5f) + + 0x07989e5f, // c0x0185 (n0x1e5f-n0x1e62) + + 0x07995e62, // c0x0186 (n0x1e62-n0x1e65) + + 0x079a1e65, // c0x0187 (n0x1e65-n0x1e68) + + 0x079ade68, // c0x0188 (n0x1e68-n0x1e6b) + + 0x079b9e6b, // c0x0189 (n0x1e6b-n0x1e6e) + + 0x079c5e6e, // c0x018a (n0x1e6e-n0x1e71) + + 0x079d1e71, // c0x018b (n0x1e71-n0x1e74) + + 0x079d5e74, // c0x018c (n0x1e74-n0x1e75) + + 0x079e1e75, // c0x018d (n0x1e75-n0x1e78) + + 0x079f9e78, // c0x018e (n0x1e78-n0x1e7e) + + 0x079fde7e, // c0x018f (n0x1e7e-n0x1e7f) + + 0x07a0de7f, // c0x0190 (n0x1e7f-n0x1e83) + + 0x07a25e83, // c0x0191 (n0x1e83-n0x1e89) + + 0x07a69e89, // c0x0192 (n0x1e89-n0x1e9a) + + 0x07a7de9a, // c0x0193 (n0x1e9a-n0x1e9f) + + 0x07ab1e9f, // c0x0194 (n0x1e9f-n0x1eac) + + 0x07ac1eac, // c0x0195 (n0x1eac-n0x1eb0) + + 0x07addeb0, // c0x0196 (n0x1eb0-n0x1eb7) + + 0x07af5eb7, // c0x0197 (n0x1eb7-n0x1ebd) + + 0x27b39ebd, // c0x0198 (n0x1ebd-n0x1ece) o + 0x07b3dece, // c0x0199 (n0x1ece-n0x1ecf) + +} + +// max children 409 (capacity 511) +// max text offset 27059 (capacity 32767) +// max text length 36 (capacity 63) +// max hi 7887 (capacity 16383) +// max lo 7886 (capacity 16383) diff --git a/vendor/golang.org/x/net/publicsuffix/table_test.go b/vendor/golang.org/x/net/publicsuffix/table_test.go new file mode 100644 index 0000000000..5b635b9716 --- /dev/null +++ b/vendor/golang.org/x/net/publicsuffix/table_test.go @@ -0,0 +1,15751 @@ +// generated by go run gen.go; DO NOT EDIT + +package publicsuffix + +var rules = [...]string{ + "ac", + "com.ac", + "edu.ac", + "gov.ac", + "net.ac", + "mil.ac", + "org.ac", + "ad", + "nom.ad", + "ae", + "co.ae", + "net.ae", + "org.ae", + "sch.ae", + "ac.ae", + "gov.ae", + "mil.ae", + "aero", + "accident-investigation.aero", + "accident-prevention.aero", + "aerobatic.aero", + "aeroclub.aero", + "aerodrome.aero", + "agents.aero", + "aircraft.aero", + "airline.aero", + "airport.aero", + "air-surveillance.aero", + "airtraffic.aero", + "air-traffic-control.aero", + "ambulance.aero", + "amusement.aero", + "association.aero", + "author.aero", + "ballooning.aero", + "broker.aero", + "caa.aero", + "cargo.aero", + "catering.aero", + "certification.aero", + "championship.aero", + "charter.aero", + "civilaviation.aero", + "club.aero", + "conference.aero", + "consultant.aero", + "consulting.aero", + "control.aero", + "council.aero", + "crew.aero", + "design.aero", + "dgca.aero", + "educator.aero", + "emergency.aero", + "engine.aero", + "engineer.aero", + "entertainment.aero", + "equipment.aero", + "exchange.aero", + "express.aero", + "federation.aero", + "flight.aero", + "freight.aero", + "fuel.aero", + "gliding.aero", + "government.aero", + "groundhandling.aero", + "group.aero", + "hanggliding.aero", + "homebuilt.aero", + "insurance.aero", + "journal.aero", + "journalist.aero", + "leasing.aero", + "logistics.aero", + "magazine.aero", + "maintenance.aero", + "media.aero", + "microlight.aero", + "modelling.aero", + "navigation.aero", + "parachuting.aero", + "paragliding.aero", + "passenger-association.aero", + "pilot.aero", + "press.aero", + "production.aero", + "recreation.aero", + "repbody.aero", + "res.aero", + "research.aero", + "rotorcraft.aero", + "safety.aero", + "scientist.aero", + "services.aero", + "show.aero", + "skydiving.aero", + "software.aero", + "student.aero", + "trader.aero", + "trading.aero", + "trainer.aero", + "union.aero", + "workinggroup.aero", + "works.aero", + "af", + "gov.af", + "com.af", + "org.af", + "net.af", + "edu.af", + "ag", + "com.ag", + "org.ag", + "net.ag", + "co.ag", + "nom.ag", + "ai", + "off.ai", + "com.ai", + "net.ai", + "org.ai", + "al", + "com.al", + "edu.al", + "gov.al", + "mil.al", + "net.al", + "org.al", + "am", + "ao", + "ed.ao", + "gv.ao", + "og.ao", + "co.ao", + "pb.ao", + "it.ao", + "aq", + "ar", + "com.ar", + "edu.ar", + "gob.ar", + "gov.ar", + "int.ar", + "mil.ar", + "net.ar", + "org.ar", + "tur.ar", + "arpa", + "e164.arpa", + "in-addr.arpa", + "ip6.arpa", + "iris.arpa", + "uri.arpa", + "urn.arpa", + "as", + "gov.as", + "asia", + "at", + "ac.at", + "co.at", + "gv.at", + "or.at", + "au", + "com.au", + "net.au", + "org.au", + "edu.au", + "gov.au", + "asn.au", + "id.au", + "info.au", + "conf.au", + "oz.au", + "act.au", + "nsw.au", + "nt.au", + "qld.au", + "sa.au", + "tas.au", + "vic.au", + "wa.au", + "act.edu.au", + "nsw.edu.au", + "nt.edu.au", + "qld.edu.au", + "sa.edu.au", + "tas.edu.au", + "vic.edu.au", + "wa.edu.au", + "qld.gov.au", + "sa.gov.au", + "tas.gov.au", + "vic.gov.au", + "wa.gov.au", + "aw", + "com.aw", + "ax", + "az", + "com.az", + "net.az", + "int.az", + "gov.az", + "org.az", + "edu.az", + "info.az", + "pp.az", + "mil.az", + "name.az", + "pro.az", + "biz.az", + "ba", + "org.ba", + "net.ba", + "edu.ba", + "gov.ba", + "mil.ba", + "unsa.ba", + "unbi.ba", + "co.ba", + "com.ba", + "rs.ba", + "bb", + "biz.bb", + "co.bb", + "com.bb", + "edu.bb", + "gov.bb", + "info.bb", + "net.bb", + "org.bb", + "store.bb", + "tv.bb", + "*.bd", + "be", + "ac.be", + "bf", + "gov.bf", + "bg", + "a.bg", + "b.bg", + "c.bg", + "d.bg", + "e.bg", + "f.bg", + "g.bg", + "h.bg", + "i.bg", + "j.bg", + "k.bg", + "l.bg", + "m.bg", + "n.bg", + "o.bg", + "p.bg", + "q.bg", + "r.bg", + "s.bg", + "t.bg", + "u.bg", + "v.bg", + "w.bg", + "x.bg", + "y.bg", + "z.bg", + "0.bg", + "1.bg", + "2.bg", + "3.bg", + "4.bg", + "5.bg", + "6.bg", + "7.bg", + "8.bg", + "9.bg", + "bh", + "com.bh", + "edu.bh", + "net.bh", + "org.bh", + "gov.bh", + "bi", + "co.bi", + "com.bi", + "edu.bi", + "or.bi", + "org.bi", + "biz", + "bj", + "asso.bj", + "barreau.bj", + "gouv.bj", + "bm", + "com.bm", + "edu.bm", + "gov.bm", + "net.bm", + "org.bm", + "*.bn", + "bo", + "com.bo", + "edu.bo", + "gov.bo", + "gob.bo", + "int.bo", + "org.bo", + "net.bo", + "mil.bo", + "tv.bo", + "br", + "adm.br", + "adv.br", + "agr.br", + "am.br", + "arq.br", + "art.br", + "ato.br", + "b.br", + "bio.br", + "blog.br", + "bmd.br", + "cim.br", + "cng.br", + "cnt.br", + "com.br", + "coop.br", + "ecn.br", + "eco.br", + "edu.br", + "emp.br", + "eng.br", + "esp.br", + "etc.br", + "eti.br", + "far.br", + "flog.br", + "fm.br", + "fnd.br", + "fot.br", + "fst.br", + "g12.br", + "ggf.br", + "gov.br", + "imb.br", + "ind.br", + "inf.br", + "jor.br", + "jus.br", + "leg.br", + "lel.br", + "mat.br", + "med.br", + "mil.br", + "mp.br", + "mus.br", + "net.br", + "*.nom.br", + "not.br", + "ntr.br", + "odo.br", + "org.br", + "ppg.br", + "pro.br", + "psc.br", + "psi.br", + "qsl.br", + "radio.br", + "rec.br", + "slg.br", + "srv.br", + "taxi.br", + "teo.br", + "tmp.br", + "trd.br", + "tur.br", + "tv.br", + "vet.br", + "vlog.br", + "wiki.br", + "zlg.br", + "bs", + "com.bs", + "net.bs", + "org.bs", + "edu.bs", + "gov.bs", + "bt", + "com.bt", + "edu.bt", + "gov.bt", + "net.bt", + "org.bt", + "bv", + "bw", + "co.bw", + "org.bw", + "by", + "gov.by", + "mil.by", + "com.by", + "of.by", + "bz", + "com.bz", + "net.bz", + "org.bz", + "edu.bz", + "gov.bz", + "ca", + "ab.ca", + "bc.ca", + "mb.ca", + "nb.ca", + "nf.ca", + "nl.ca", + "ns.ca", + "nt.ca", + "nu.ca", + "on.ca", + "pe.ca", + "qc.ca", + "sk.ca", + "yk.ca", + "gc.ca", + "cat", + "cc", + "cd", + "gov.cd", + "cf", + "cg", + "ch", + "ci", + "org.ci", + "or.ci", + "com.ci", + "co.ci", + "edu.ci", + "ed.ci", + "ac.ci", + "net.ci", + "go.ci", + "asso.ci", + "xn--aroport-bya.ci", + "int.ci", + "presse.ci", + "md.ci", + "gouv.ci", + "*.ck", + "!www.ck", + "cl", + "gov.cl", + "gob.cl", + "co.cl", + "mil.cl", + "cm", + "co.cm", + "com.cm", + "gov.cm", + "net.cm", + "cn", + "ac.cn", + "com.cn", + "edu.cn", + "gov.cn", + "net.cn", + "org.cn", + "mil.cn", + "xn--55qx5d.cn", + "xn--io0a7i.cn", + "xn--od0alg.cn", + "ah.cn", + "bj.cn", + "cq.cn", + "fj.cn", + "gd.cn", + "gs.cn", + "gz.cn", + "gx.cn", + "ha.cn", + "hb.cn", + "he.cn", + "hi.cn", + "hl.cn", + "hn.cn", + "jl.cn", + "js.cn", + "jx.cn", + "ln.cn", + "nm.cn", + "nx.cn", + "qh.cn", + "sc.cn", + "sd.cn", + "sh.cn", + "sn.cn", + "sx.cn", + "tj.cn", + "xj.cn", + "xz.cn", + "yn.cn", + "zj.cn", + "hk.cn", + "mo.cn", + "tw.cn", + "co", + "arts.co", + "com.co", + "edu.co", + "firm.co", + "gov.co", + "info.co", + "int.co", + "mil.co", + "net.co", + "nom.co", + "org.co", + "rec.co", + "web.co", + "com", + "coop", + "cr", + "ac.cr", + "co.cr", + "ed.cr", + "fi.cr", + "go.cr", + "or.cr", + "sa.cr", + "cu", + "com.cu", + "edu.cu", + "org.cu", + "net.cu", + "gov.cu", + "inf.cu", + "cv", + "cw", + "com.cw", + "edu.cw", + "net.cw", + "org.cw", + "cx", + "gov.cx", + "ac.cy", + "biz.cy", + "com.cy", + "ekloges.cy", + "gov.cy", + "ltd.cy", + "name.cy", + "net.cy", + "org.cy", + "parliament.cy", + "press.cy", + "pro.cy", + "tm.cy", + "cz", + "de", + "dj", + "dk", + "dm", + "com.dm", + "net.dm", + "org.dm", + "edu.dm", + "gov.dm", + "do", + "art.do", + "com.do", + "edu.do", + "gob.do", + "gov.do", + "mil.do", + "net.do", + "org.do", + "sld.do", + "web.do", + "dz", + "com.dz", + "org.dz", + "net.dz", + "gov.dz", + "edu.dz", + "asso.dz", + "pol.dz", + "art.dz", + "ec", + "com.ec", + "info.ec", + "net.ec", + "fin.ec", + "k12.ec", + "med.ec", + "pro.ec", + "org.ec", + "edu.ec", + "gov.ec", + "gob.ec", + "mil.ec", + "edu", + "ee", + "edu.ee", + "gov.ee", + "riik.ee", + "lib.ee", + "med.ee", + "com.ee", + "pri.ee", + "aip.ee", + "org.ee", + "fie.ee", + "eg", + "com.eg", + "edu.eg", + "eun.eg", + "gov.eg", + "mil.eg", + "name.eg", + "net.eg", + "org.eg", + "sci.eg", + "*.er", + "es", + "com.es", + "nom.es", + "org.es", + "gob.es", + "edu.es", + "et", + "com.et", + "gov.et", + "org.et", + "edu.et", + "biz.et", + "name.et", + "info.et", + "net.et", + "eu", + "fi", + "aland.fi", + "*.fj", + "*.fk", + "fm", + "fo", + "fr", + "com.fr", + "asso.fr", + "nom.fr", + "prd.fr", + "presse.fr", + "tm.fr", + "aeroport.fr", + "assedic.fr", + "avocat.fr", + "avoues.fr", + "cci.fr", + "chambagri.fr", + "chirurgiens-dentistes.fr", + "experts-comptables.fr", + "geometre-expert.fr", + "gouv.fr", + "greta.fr", + "huissier-justice.fr", + "medecin.fr", + "notaires.fr", + "pharmacien.fr", + "port.fr", + "veterinaire.fr", + "ga", + "gb", + "gd", + "ge", + "com.ge", + "edu.ge", + "gov.ge", + "org.ge", + "mil.ge", + "net.ge", + "pvt.ge", + "gf", + "gg", + "co.gg", + "net.gg", + "org.gg", + "gh", + "com.gh", + "edu.gh", + "gov.gh", + "org.gh", + "mil.gh", + "gi", + "com.gi", + "ltd.gi", + "gov.gi", + "mod.gi", + "edu.gi", + "org.gi", + "gl", + "co.gl", + "com.gl", + "edu.gl", + "net.gl", + "org.gl", + "gm", + "gn", + "ac.gn", + "com.gn", + "edu.gn", + "gov.gn", + "org.gn", + "net.gn", + "gov", + "gp", + "com.gp", + "net.gp", + "mobi.gp", + "edu.gp", + "org.gp", + "asso.gp", + "gq", + "gr", + "com.gr", + "edu.gr", + "net.gr", + "org.gr", + "gov.gr", + "gs", + "gt", + "com.gt", + "edu.gt", + "gob.gt", + "ind.gt", + "mil.gt", + "net.gt", + "org.gt", + "*.gu", + "gw", + "gy", + "co.gy", + "com.gy", + "edu.gy", + "gov.gy", + "net.gy", + "org.gy", + "hk", + "com.hk", + "edu.hk", + "gov.hk", + "idv.hk", + "net.hk", + "org.hk", + "xn--55qx5d.hk", + "xn--wcvs22d.hk", + "xn--lcvr32d.hk", + "xn--mxtq1m.hk", + "xn--gmqw5a.hk", + "xn--ciqpn.hk", + "xn--gmq050i.hk", + "xn--zf0avx.hk", + "xn--io0a7i.hk", + "xn--mk0axi.hk", + "xn--od0alg.hk", + "xn--od0aq3b.hk", + "xn--tn0ag.hk", + "xn--uc0atv.hk", + "xn--uc0ay4a.hk", + "hm", + "hn", + "com.hn", + "edu.hn", + "org.hn", + "net.hn", + "mil.hn", + "gob.hn", + "hr", + "iz.hr", + "from.hr", + "name.hr", + "com.hr", + "ht", + "com.ht", + "shop.ht", + "firm.ht", + "info.ht", + "adult.ht", + "net.ht", + "pro.ht", + "org.ht", + "med.ht", + "art.ht", + "coop.ht", + "pol.ht", + "asso.ht", + "edu.ht", + "rel.ht", + "gouv.ht", + "perso.ht", + "hu", + "co.hu", + "info.hu", + "org.hu", + "priv.hu", + "sport.hu", + "tm.hu", + "2000.hu", + "agrar.hu", + "bolt.hu", + "casino.hu", + "city.hu", + "erotica.hu", + "erotika.hu", + "film.hu", + "forum.hu", + "games.hu", + "hotel.hu", + "ingatlan.hu", + "jogasz.hu", + "konyvelo.hu", + "lakas.hu", + "media.hu", + "news.hu", + "reklam.hu", + "sex.hu", + "shop.hu", + "suli.hu", + "szex.hu", + "tozsde.hu", + "utazas.hu", + "video.hu", + "id", + "ac.id", + "biz.id", + "co.id", + "desa.id", + "go.id", + "mil.id", + "my.id", + "net.id", + "or.id", + "sch.id", + "web.id", + "ie", + "gov.ie", + "il", + "ac.il", + "co.il", + "gov.il", + "idf.il", + "k12.il", + "muni.il", + "net.il", + "org.il", + "im", + "ac.im", + "co.im", + "com.im", + "ltd.co.im", + "net.im", + "org.im", + "plc.co.im", + "tt.im", + "tv.im", + "in", + "co.in", + "firm.in", + "net.in", + "org.in", + "gen.in", + "ind.in", + "nic.in", + "ac.in", + "edu.in", + "res.in", + "gov.in", + "mil.in", + "info", + "int", + "eu.int", + "io", + "com.io", + "iq", + "gov.iq", + "edu.iq", + "mil.iq", + "com.iq", + "org.iq", + "net.iq", + "ir", + "ac.ir", + "co.ir", + "gov.ir", + "id.ir", + "net.ir", + "org.ir", + "sch.ir", + "xn--mgba3a4f16a.ir", + "xn--mgba3a4fra.ir", + "is", + "net.is", + "com.is", + "edu.is", + "gov.is", + "org.is", + "int.is", + "it", + "gov.it", + "edu.it", + "abr.it", + "abruzzo.it", + "aosta-valley.it", + "aostavalley.it", + "bas.it", + "basilicata.it", + "cal.it", + "calabria.it", + "cam.it", + "campania.it", + "emilia-romagna.it", + "emiliaromagna.it", + "emr.it", + "friuli-v-giulia.it", + "friuli-ve-giulia.it", + "friuli-vegiulia.it", + "friuli-venezia-giulia.it", + "friuli-veneziagiulia.it", + "friuli-vgiulia.it", + "friuliv-giulia.it", + "friulive-giulia.it", + "friulivegiulia.it", + "friulivenezia-giulia.it", + "friuliveneziagiulia.it", + "friulivgiulia.it", + "fvg.it", + "laz.it", + "lazio.it", + "lig.it", + "liguria.it", + "lom.it", + "lombardia.it", + "lombardy.it", + "lucania.it", + "mar.it", + "marche.it", + "mol.it", + "molise.it", + "piedmont.it", + "piemonte.it", + "pmn.it", + "pug.it", + "puglia.it", + "sar.it", + "sardegna.it", + "sardinia.it", + "sic.it", + "sicilia.it", + "sicily.it", + "taa.it", + "tos.it", + "toscana.it", + "trentino-a-adige.it", + "trentino-aadige.it", + "trentino-alto-adige.it", + "trentino-altoadige.it", + "trentino-s-tirol.it", + "trentino-stirol.it", + "trentino-sud-tirol.it", + "trentino-sudtirol.it", + "trentino-sued-tirol.it", + "trentino-suedtirol.it", + "trentinoa-adige.it", + "trentinoaadige.it", + "trentinoalto-adige.it", + "trentinoaltoadige.it", + "trentinos-tirol.it", + "trentinostirol.it", + "trentinosud-tirol.it", + "trentinosudtirol.it", + "trentinosued-tirol.it", + "trentinosuedtirol.it", + "tuscany.it", + "umb.it", + "umbria.it", + "val-d-aosta.it", + "val-daosta.it", + "vald-aosta.it", + "valdaosta.it", + "valle-aosta.it", + "valle-d-aosta.it", + "valle-daosta.it", + "valleaosta.it", + "valled-aosta.it", + "valledaosta.it", + "vallee-aoste.it", + "valleeaoste.it", + "vao.it", + "vda.it", + "ven.it", + "veneto.it", + "ag.it", + "agrigento.it", + "al.it", + "alessandria.it", + "alto-adige.it", + "altoadige.it", + "an.it", + "ancona.it", + "andria-barletta-trani.it", + "andria-trani-barletta.it", + "andriabarlettatrani.it", + "andriatranibarletta.it", + "ao.it", + "aosta.it", + "aoste.it", + "ap.it", + "aq.it", + "aquila.it", + "ar.it", + "arezzo.it", + "ascoli-piceno.it", + "ascolipiceno.it", + "asti.it", + "at.it", + "av.it", + "avellino.it", + "ba.it", + "balsan.it", + "bari.it", + "barletta-trani-andria.it", + "barlettatraniandria.it", + "belluno.it", + "benevento.it", + "bergamo.it", + "bg.it", + "bi.it", + "biella.it", + "bl.it", + "bn.it", + "bo.it", + "bologna.it", + "bolzano.it", + "bozen.it", + "br.it", + "brescia.it", + "brindisi.it", + "bs.it", + "bt.it", + "bz.it", + "ca.it", + "cagliari.it", + "caltanissetta.it", + "campidano-medio.it", + "campidanomedio.it", + "campobasso.it", + "carbonia-iglesias.it", + "carboniaiglesias.it", + "carrara-massa.it", + "carraramassa.it", + "caserta.it", + "catania.it", + "catanzaro.it", + "cb.it", + "ce.it", + "cesena-forli.it", + "cesenaforli.it", + "ch.it", + "chieti.it", + "ci.it", + "cl.it", + "cn.it", + "co.it", + "como.it", + "cosenza.it", + "cr.it", + "cremona.it", + "crotone.it", + "cs.it", + "ct.it", + "cuneo.it", + "cz.it", + "dell-ogliastra.it", + "dellogliastra.it", + "en.it", + "enna.it", + "fc.it", + "fe.it", + "fermo.it", + "ferrara.it", + "fg.it", + "fi.it", + "firenze.it", + "florence.it", + "fm.it", + "foggia.it", + "forli-cesena.it", + "forlicesena.it", + "fr.it", + "frosinone.it", + "ge.it", + "genoa.it", + "genova.it", + "go.it", + "gorizia.it", + "gr.it", + "grosseto.it", + "iglesias-carbonia.it", + "iglesiascarbonia.it", + "im.it", + "imperia.it", + "is.it", + "isernia.it", + "kr.it", + "la-spezia.it", + "laquila.it", + "laspezia.it", + "latina.it", + "lc.it", + "le.it", + "lecce.it", + "lecco.it", + "li.it", + "livorno.it", + "lo.it", + "lodi.it", + "lt.it", + "lu.it", + "lucca.it", + "macerata.it", + "mantova.it", + "massa-carrara.it", + "massacarrara.it", + "matera.it", + "mb.it", + "mc.it", + "me.it", + "medio-campidano.it", + "mediocampidano.it", + "messina.it", + "mi.it", + "milan.it", + "milano.it", + "mn.it", + "mo.it", + "modena.it", + "monza-brianza.it", + "monza-e-della-brianza.it", + "monza.it", + "monzabrianza.it", + "monzaebrianza.it", + "monzaedellabrianza.it", + "ms.it", + "mt.it", + "na.it", + "naples.it", + "napoli.it", + "no.it", + "novara.it", + "nu.it", + "nuoro.it", + "og.it", + "ogliastra.it", + "olbia-tempio.it", + "olbiatempio.it", + "or.it", + "oristano.it", + "ot.it", + "pa.it", + "padova.it", + "padua.it", + "palermo.it", + "parma.it", + "pavia.it", + "pc.it", + "pd.it", + "pe.it", + "perugia.it", + "pesaro-urbino.it", + "pesarourbino.it", + "pescara.it", + "pg.it", + "pi.it", + "piacenza.it", + "pisa.it", + "pistoia.it", + "pn.it", + "po.it", + "pordenone.it", + "potenza.it", + "pr.it", + "prato.it", + "pt.it", + "pu.it", + "pv.it", + "pz.it", + "ra.it", + "ragusa.it", + "ravenna.it", + "rc.it", + "re.it", + "reggio-calabria.it", + "reggio-emilia.it", + "reggiocalabria.it", + "reggioemilia.it", + "rg.it", + "ri.it", + "rieti.it", + "rimini.it", + "rm.it", + "rn.it", + "ro.it", + "roma.it", + "rome.it", + "rovigo.it", + "sa.it", + "salerno.it", + "sassari.it", + "savona.it", + "si.it", + "siena.it", + "siracusa.it", + "so.it", + "sondrio.it", + "sp.it", + "sr.it", + "ss.it", + "suedtirol.it", + "sv.it", + "ta.it", + "taranto.it", + "te.it", + "tempio-olbia.it", + "tempioolbia.it", + "teramo.it", + "terni.it", + "tn.it", + "to.it", + "torino.it", + "tp.it", + "tr.it", + "trani-andria-barletta.it", + "trani-barletta-andria.it", + "traniandriabarletta.it", + "tranibarlettaandria.it", + "trapani.it", + "trentino.it", + "trento.it", + "treviso.it", + "trieste.it", + "ts.it", + "turin.it", + "tv.it", + "ud.it", + "udine.it", + "urbino-pesaro.it", + "urbinopesaro.it", + "va.it", + "varese.it", + "vb.it", + "vc.it", + "ve.it", + "venezia.it", + "venice.it", + "verbania.it", + "vercelli.it", + "verona.it", + "vi.it", + "vibo-valentia.it", + "vibovalentia.it", + "vicenza.it", + "viterbo.it", + "vr.it", + "vs.it", + "vt.it", + "vv.it", + "je", + "co.je", + "net.je", + "org.je", + "*.jm", + "jo", + "com.jo", + "org.jo", + "net.jo", + "edu.jo", + "sch.jo", + "gov.jo", + "mil.jo", + "name.jo", + "jobs", + "jp", + "ac.jp", + "ad.jp", + "co.jp", + "ed.jp", + "go.jp", + "gr.jp", + "lg.jp", + "ne.jp", + "or.jp", + "aichi.jp", + "akita.jp", + "aomori.jp", + "chiba.jp", + "ehime.jp", + "fukui.jp", + "fukuoka.jp", + "fukushima.jp", + "gifu.jp", + "gunma.jp", + "hiroshima.jp", + "hokkaido.jp", + "hyogo.jp", + "ibaraki.jp", + "ishikawa.jp", + "iwate.jp", + "kagawa.jp", + "kagoshima.jp", + "kanagawa.jp", + "kochi.jp", + "kumamoto.jp", + "kyoto.jp", + "mie.jp", + "miyagi.jp", + "miyazaki.jp", + "nagano.jp", + "nagasaki.jp", + "nara.jp", + "niigata.jp", + "oita.jp", + "okayama.jp", + "okinawa.jp", + "osaka.jp", + "saga.jp", + "saitama.jp", + "shiga.jp", + "shimane.jp", + "shizuoka.jp", + "tochigi.jp", + "tokushima.jp", + "tokyo.jp", + "tottori.jp", + "toyama.jp", + "wakayama.jp", + "yamagata.jp", + "yamaguchi.jp", + "yamanashi.jp", + "xn--4pvxs.jp", + "xn--vgu402c.jp", + "xn--c3s14m.jp", + "xn--f6qx53a.jp", + "xn--8pvr4u.jp", + "xn--uist22h.jp", + "xn--djrs72d6uy.jp", + "xn--mkru45i.jp", + "xn--0trq7p7nn.jp", + "xn--8ltr62k.jp", + "xn--2m4a15e.jp", + "xn--efvn9s.jp", + "xn--32vp30h.jp", + "xn--4it797k.jp", + "xn--1lqs71d.jp", + "xn--5rtp49c.jp", + "xn--5js045d.jp", + "xn--ehqz56n.jp", + "xn--1lqs03n.jp", + "xn--qqqt11m.jp", + "xn--kbrq7o.jp", + "xn--pssu33l.jp", + "xn--ntsq17g.jp", + "xn--uisz3g.jp", + "xn--6btw5a.jp", + "xn--1ctwo.jp", + "xn--6orx2r.jp", + "xn--rht61e.jp", + "xn--rht27z.jp", + "xn--djty4k.jp", + "xn--nit225k.jp", + "xn--rht3d.jp", + "xn--klty5x.jp", + "xn--kltx9a.jp", + "xn--kltp7d.jp", + "xn--uuwu58a.jp", + "xn--zbx025d.jp", + "xn--ntso0iqx3a.jp", + "xn--elqq16h.jp", + "xn--4it168d.jp", + "xn--klt787d.jp", + "xn--rny31h.jp", + "xn--7t0a264c.jp", + "xn--5rtq34k.jp", + "xn--k7yn95e.jp", + "xn--tor131o.jp", + "xn--d5qv7z876c.jp", + "*.kawasaki.jp", + "*.kitakyushu.jp", + "*.kobe.jp", + "*.nagoya.jp", + "*.sapporo.jp", + "*.sendai.jp", + "*.yokohama.jp", + "!city.kawasaki.jp", + "!city.kitakyushu.jp", + "!city.kobe.jp", + "!city.nagoya.jp", + "!city.sapporo.jp", + "!city.sendai.jp", + "!city.yokohama.jp", + "aisai.aichi.jp", + "ama.aichi.jp", + "anjo.aichi.jp", + "asuke.aichi.jp", + "chiryu.aichi.jp", + "chita.aichi.jp", + "fuso.aichi.jp", + "gamagori.aichi.jp", + "handa.aichi.jp", + "hazu.aichi.jp", + "hekinan.aichi.jp", + "higashiura.aichi.jp", + "ichinomiya.aichi.jp", + "inazawa.aichi.jp", + "inuyama.aichi.jp", + "isshiki.aichi.jp", + "iwakura.aichi.jp", + "kanie.aichi.jp", + "kariya.aichi.jp", + "kasugai.aichi.jp", + "kira.aichi.jp", + "kiyosu.aichi.jp", + "komaki.aichi.jp", + "konan.aichi.jp", + "kota.aichi.jp", + "mihama.aichi.jp", + "miyoshi.aichi.jp", + "nishio.aichi.jp", + "nisshin.aichi.jp", + "obu.aichi.jp", + "oguchi.aichi.jp", + "oharu.aichi.jp", + "okazaki.aichi.jp", + "owariasahi.aichi.jp", + "seto.aichi.jp", + "shikatsu.aichi.jp", + "shinshiro.aichi.jp", + "shitara.aichi.jp", + "tahara.aichi.jp", + "takahama.aichi.jp", + "tobishima.aichi.jp", + "toei.aichi.jp", + "togo.aichi.jp", + "tokai.aichi.jp", + "tokoname.aichi.jp", + "toyoake.aichi.jp", + "toyohashi.aichi.jp", + "toyokawa.aichi.jp", + "toyone.aichi.jp", + "toyota.aichi.jp", + "tsushima.aichi.jp", + "yatomi.aichi.jp", + "akita.akita.jp", + "daisen.akita.jp", + "fujisato.akita.jp", + "gojome.akita.jp", + "hachirogata.akita.jp", + "happou.akita.jp", + "higashinaruse.akita.jp", + "honjo.akita.jp", + "honjyo.akita.jp", + "ikawa.akita.jp", + "kamikoani.akita.jp", + "kamioka.akita.jp", + "katagami.akita.jp", + "kazuno.akita.jp", + "kitaakita.akita.jp", + "kosaka.akita.jp", + "kyowa.akita.jp", + "misato.akita.jp", + "mitane.akita.jp", + "moriyoshi.akita.jp", + "nikaho.akita.jp", + "noshiro.akita.jp", + "odate.akita.jp", + "oga.akita.jp", + "ogata.akita.jp", + "semboku.akita.jp", + "yokote.akita.jp", + "yurihonjo.akita.jp", + "aomori.aomori.jp", + "gonohe.aomori.jp", + "hachinohe.aomori.jp", + "hashikami.aomori.jp", + "hiranai.aomori.jp", + "hirosaki.aomori.jp", + "itayanagi.aomori.jp", + "kuroishi.aomori.jp", + "misawa.aomori.jp", + "mutsu.aomori.jp", + "nakadomari.aomori.jp", + "noheji.aomori.jp", + "oirase.aomori.jp", + "owani.aomori.jp", + "rokunohe.aomori.jp", + "sannohe.aomori.jp", + "shichinohe.aomori.jp", + "shingo.aomori.jp", + "takko.aomori.jp", + "towada.aomori.jp", + "tsugaru.aomori.jp", + "tsuruta.aomori.jp", + "abiko.chiba.jp", + "asahi.chiba.jp", + "chonan.chiba.jp", + "chosei.chiba.jp", + "choshi.chiba.jp", + "chuo.chiba.jp", + "funabashi.chiba.jp", + "futtsu.chiba.jp", + "hanamigawa.chiba.jp", + "ichihara.chiba.jp", + "ichikawa.chiba.jp", + "ichinomiya.chiba.jp", + "inzai.chiba.jp", + "isumi.chiba.jp", + "kamagaya.chiba.jp", + "kamogawa.chiba.jp", + "kashiwa.chiba.jp", + "katori.chiba.jp", + "katsuura.chiba.jp", + "kimitsu.chiba.jp", + "kisarazu.chiba.jp", + "kozaki.chiba.jp", + "kujukuri.chiba.jp", + "kyonan.chiba.jp", + "matsudo.chiba.jp", + "midori.chiba.jp", + "mihama.chiba.jp", + "minamiboso.chiba.jp", + "mobara.chiba.jp", + "mutsuzawa.chiba.jp", + "nagara.chiba.jp", + "nagareyama.chiba.jp", + "narashino.chiba.jp", + "narita.chiba.jp", + "noda.chiba.jp", + "oamishirasato.chiba.jp", + "omigawa.chiba.jp", + "onjuku.chiba.jp", + "otaki.chiba.jp", + "sakae.chiba.jp", + "sakura.chiba.jp", + "shimofusa.chiba.jp", + "shirako.chiba.jp", + "shiroi.chiba.jp", + "shisui.chiba.jp", + "sodegaura.chiba.jp", + "sosa.chiba.jp", + "tako.chiba.jp", + "tateyama.chiba.jp", + "togane.chiba.jp", + "tohnosho.chiba.jp", + "tomisato.chiba.jp", + "urayasu.chiba.jp", + "yachimata.chiba.jp", + "yachiyo.chiba.jp", + "yokaichiba.chiba.jp", + "yokoshibahikari.chiba.jp", + "yotsukaido.chiba.jp", + "ainan.ehime.jp", + "honai.ehime.jp", + "ikata.ehime.jp", + "imabari.ehime.jp", + "iyo.ehime.jp", + "kamijima.ehime.jp", + "kihoku.ehime.jp", + "kumakogen.ehime.jp", + "masaki.ehime.jp", + "matsuno.ehime.jp", + "matsuyama.ehime.jp", + "namikata.ehime.jp", + "niihama.ehime.jp", + "ozu.ehime.jp", + "saijo.ehime.jp", + "seiyo.ehime.jp", + "shikokuchuo.ehime.jp", + "tobe.ehime.jp", + "toon.ehime.jp", + "uchiko.ehime.jp", + "uwajima.ehime.jp", + "yawatahama.ehime.jp", + "echizen.fukui.jp", + "eiheiji.fukui.jp", + "fukui.fukui.jp", + "ikeda.fukui.jp", + "katsuyama.fukui.jp", + "mihama.fukui.jp", + "minamiechizen.fukui.jp", + "obama.fukui.jp", + "ohi.fukui.jp", + "ono.fukui.jp", + "sabae.fukui.jp", + "sakai.fukui.jp", + "takahama.fukui.jp", + "tsuruga.fukui.jp", + "wakasa.fukui.jp", + "ashiya.fukuoka.jp", + "buzen.fukuoka.jp", + "chikugo.fukuoka.jp", + "chikuho.fukuoka.jp", + "chikujo.fukuoka.jp", + "chikushino.fukuoka.jp", + "chikuzen.fukuoka.jp", + "chuo.fukuoka.jp", + "dazaifu.fukuoka.jp", + "fukuchi.fukuoka.jp", + "hakata.fukuoka.jp", + "higashi.fukuoka.jp", + "hirokawa.fukuoka.jp", + "hisayama.fukuoka.jp", + "iizuka.fukuoka.jp", + "inatsuki.fukuoka.jp", + "kaho.fukuoka.jp", + "kasuga.fukuoka.jp", + "kasuya.fukuoka.jp", + "kawara.fukuoka.jp", + "keisen.fukuoka.jp", + "koga.fukuoka.jp", + "kurate.fukuoka.jp", + "kurogi.fukuoka.jp", + "kurume.fukuoka.jp", + "minami.fukuoka.jp", + "miyako.fukuoka.jp", + "miyama.fukuoka.jp", + "miyawaka.fukuoka.jp", + "mizumaki.fukuoka.jp", + "munakata.fukuoka.jp", + "nakagawa.fukuoka.jp", + "nakama.fukuoka.jp", + "nishi.fukuoka.jp", + "nogata.fukuoka.jp", + "ogori.fukuoka.jp", + "okagaki.fukuoka.jp", + "okawa.fukuoka.jp", + "oki.fukuoka.jp", + "omuta.fukuoka.jp", + "onga.fukuoka.jp", + "onojo.fukuoka.jp", + "oto.fukuoka.jp", + "saigawa.fukuoka.jp", + "sasaguri.fukuoka.jp", + "shingu.fukuoka.jp", + "shinyoshitomi.fukuoka.jp", + "shonai.fukuoka.jp", + "soeda.fukuoka.jp", + "sue.fukuoka.jp", + "tachiarai.fukuoka.jp", + "tagawa.fukuoka.jp", + "takata.fukuoka.jp", + "toho.fukuoka.jp", + "toyotsu.fukuoka.jp", + "tsuiki.fukuoka.jp", + "ukiha.fukuoka.jp", + "umi.fukuoka.jp", + "usui.fukuoka.jp", + "yamada.fukuoka.jp", + "yame.fukuoka.jp", + "yanagawa.fukuoka.jp", + "yukuhashi.fukuoka.jp", + "aizubange.fukushima.jp", + "aizumisato.fukushima.jp", + "aizuwakamatsu.fukushima.jp", + "asakawa.fukushima.jp", + "bandai.fukushima.jp", + "date.fukushima.jp", + "fukushima.fukushima.jp", + "furudono.fukushima.jp", + "futaba.fukushima.jp", + "hanawa.fukushima.jp", + "higashi.fukushima.jp", + "hirata.fukushima.jp", + "hirono.fukushima.jp", + "iitate.fukushima.jp", + "inawashiro.fukushima.jp", + "ishikawa.fukushima.jp", + "iwaki.fukushima.jp", + "izumizaki.fukushima.jp", + "kagamiishi.fukushima.jp", + "kaneyama.fukushima.jp", + "kawamata.fukushima.jp", + "kitakata.fukushima.jp", + "kitashiobara.fukushima.jp", + "koori.fukushima.jp", + "koriyama.fukushima.jp", + "kunimi.fukushima.jp", + "miharu.fukushima.jp", + "mishima.fukushima.jp", + "namie.fukushima.jp", + "nango.fukushima.jp", + "nishiaizu.fukushima.jp", + "nishigo.fukushima.jp", + "okuma.fukushima.jp", + "omotego.fukushima.jp", + "ono.fukushima.jp", + "otama.fukushima.jp", + "samegawa.fukushima.jp", + "shimogo.fukushima.jp", + "shirakawa.fukushima.jp", + "showa.fukushima.jp", + "soma.fukushima.jp", + "sukagawa.fukushima.jp", + "taishin.fukushima.jp", + "tamakawa.fukushima.jp", + "tanagura.fukushima.jp", + "tenei.fukushima.jp", + "yabuki.fukushima.jp", + "yamato.fukushima.jp", + "yamatsuri.fukushima.jp", + "yanaizu.fukushima.jp", + "yugawa.fukushima.jp", + "anpachi.gifu.jp", + "ena.gifu.jp", + "gifu.gifu.jp", + "ginan.gifu.jp", + "godo.gifu.jp", + "gujo.gifu.jp", + "hashima.gifu.jp", + "hichiso.gifu.jp", + "hida.gifu.jp", + "higashishirakawa.gifu.jp", + "ibigawa.gifu.jp", + "ikeda.gifu.jp", + "kakamigahara.gifu.jp", + "kani.gifu.jp", + "kasahara.gifu.jp", + "kasamatsu.gifu.jp", + "kawaue.gifu.jp", + "kitagata.gifu.jp", + "mino.gifu.jp", + "minokamo.gifu.jp", + "mitake.gifu.jp", + "mizunami.gifu.jp", + "motosu.gifu.jp", + "nakatsugawa.gifu.jp", + "ogaki.gifu.jp", + "sakahogi.gifu.jp", + "seki.gifu.jp", + "sekigahara.gifu.jp", + "shirakawa.gifu.jp", + "tajimi.gifu.jp", + "takayama.gifu.jp", + "tarui.gifu.jp", + "toki.gifu.jp", + "tomika.gifu.jp", + "wanouchi.gifu.jp", + "yamagata.gifu.jp", + "yaotsu.gifu.jp", + "yoro.gifu.jp", + "annaka.gunma.jp", + "chiyoda.gunma.jp", + "fujioka.gunma.jp", + "higashiagatsuma.gunma.jp", + "isesaki.gunma.jp", + "itakura.gunma.jp", + "kanna.gunma.jp", + "kanra.gunma.jp", + "katashina.gunma.jp", + "kawaba.gunma.jp", + "kiryu.gunma.jp", + "kusatsu.gunma.jp", + "maebashi.gunma.jp", + "meiwa.gunma.jp", + "midori.gunma.jp", + "minakami.gunma.jp", + "naganohara.gunma.jp", + "nakanojo.gunma.jp", + "nanmoku.gunma.jp", + "numata.gunma.jp", + "oizumi.gunma.jp", + "ora.gunma.jp", + "ota.gunma.jp", + "shibukawa.gunma.jp", + "shimonita.gunma.jp", + "shinto.gunma.jp", + "showa.gunma.jp", + "takasaki.gunma.jp", + "takayama.gunma.jp", + "tamamura.gunma.jp", + "tatebayashi.gunma.jp", + "tomioka.gunma.jp", + "tsukiyono.gunma.jp", + "tsumagoi.gunma.jp", + "ueno.gunma.jp", + "yoshioka.gunma.jp", + "asaminami.hiroshima.jp", + "daiwa.hiroshima.jp", + "etajima.hiroshima.jp", + "fuchu.hiroshima.jp", + "fukuyama.hiroshima.jp", + "hatsukaichi.hiroshima.jp", + "higashihiroshima.hiroshima.jp", + "hongo.hiroshima.jp", + "jinsekikogen.hiroshima.jp", + "kaita.hiroshima.jp", + "kui.hiroshima.jp", + "kumano.hiroshima.jp", + "kure.hiroshima.jp", + "mihara.hiroshima.jp", + "miyoshi.hiroshima.jp", + "naka.hiroshima.jp", + "onomichi.hiroshima.jp", + "osakikamijima.hiroshima.jp", + "otake.hiroshima.jp", + "saka.hiroshima.jp", + "sera.hiroshima.jp", + "seranishi.hiroshima.jp", + "shinichi.hiroshima.jp", + "shobara.hiroshima.jp", + "takehara.hiroshima.jp", + "abashiri.hokkaido.jp", + "abira.hokkaido.jp", + "aibetsu.hokkaido.jp", + "akabira.hokkaido.jp", + "akkeshi.hokkaido.jp", + "asahikawa.hokkaido.jp", + "ashibetsu.hokkaido.jp", + "ashoro.hokkaido.jp", + "assabu.hokkaido.jp", + "atsuma.hokkaido.jp", + "bibai.hokkaido.jp", + "biei.hokkaido.jp", + "bifuka.hokkaido.jp", + "bihoro.hokkaido.jp", + "biratori.hokkaido.jp", + "chippubetsu.hokkaido.jp", + "chitose.hokkaido.jp", + "date.hokkaido.jp", + "ebetsu.hokkaido.jp", + "embetsu.hokkaido.jp", + "eniwa.hokkaido.jp", + "erimo.hokkaido.jp", + "esan.hokkaido.jp", + "esashi.hokkaido.jp", + "fukagawa.hokkaido.jp", + "fukushima.hokkaido.jp", + "furano.hokkaido.jp", + "furubira.hokkaido.jp", + "haboro.hokkaido.jp", + "hakodate.hokkaido.jp", + "hamatonbetsu.hokkaido.jp", + "hidaka.hokkaido.jp", + "higashikagura.hokkaido.jp", + "higashikawa.hokkaido.jp", + "hiroo.hokkaido.jp", + "hokuryu.hokkaido.jp", + "hokuto.hokkaido.jp", + "honbetsu.hokkaido.jp", + "horokanai.hokkaido.jp", + "horonobe.hokkaido.jp", + "ikeda.hokkaido.jp", + "imakane.hokkaido.jp", + "ishikari.hokkaido.jp", + "iwamizawa.hokkaido.jp", + "iwanai.hokkaido.jp", + "kamifurano.hokkaido.jp", + "kamikawa.hokkaido.jp", + "kamishihoro.hokkaido.jp", + "kamisunagawa.hokkaido.jp", + "kamoenai.hokkaido.jp", + "kayabe.hokkaido.jp", + "kembuchi.hokkaido.jp", + "kikonai.hokkaido.jp", + "kimobetsu.hokkaido.jp", + "kitahiroshima.hokkaido.jp", + "kitami.hokkaido.jp", + "kiyosato.hokkaido.jp", + "koshimizu.hokkaido.jp", + "kunneppu.hokkaido.jp", + "kuriyama.hokkaido.jp", + "kuromatsunai.hokkaido.jp", + "kushiro.hokkaido.jp", + "kutchan.hokkaido.jp", + "kyowa.hokkaido.jp", + "mashike.hokkaido.jp", + "matsumae.hokkaido.jp", + "mikasa.hokkaido.jp", + "minamifurano.hokkaido.jp", + "mombetsu.hokkaido.jp", + "moseushi.hokkaido.jp", + "mukawa.hokkaido.jp", + "muroran.hokkaido.jp", + "naie.hokkaido.jp", + "nakagawa.hokkaido.jp", + "nakasatsunai.hokkaido.jp", + "nakatombetsu.hokkaido.jp", + "nanae.hokkaido.jp", + "nanporo.hokkaido.jp", + "nayoro.hokkaido.jp", + "nemuro.hokkaido.jp", + "niikappu.hokkaido.jp", + "niki.hokkaido.jp", + "nishiokoppe.hokkaido.jp", + "noboribetsu.hokkaido.jp", + "numata.hokkaido.jp", + "obihiro.hokkaido.jp", + "obira.hokkaido.jp", + "oketo.hokkaido.jp", + "okoppe.hokkaido.jp", + "otaru.hokkaido.jp", + "otobe.hokkaido.jp", + "otofuke.hokkaido.jp", + "otoineppu.hokkaido.jp", + "oumu.hokkaido.jp", + "ozora.hokkaido.jp", + "pippu.hokkaido.jp", + "rankoshi.hokkaido.jp", + "rebun.hokkaido.jp", + "rikubetsu.hokkaido.jp", + "rishiri.hokkaido.jp", + "rishirifuji.hokkaido.jp", + "saroma.hokkaido.jp", + "sarufutsu.hokkaido.jp", + "shakotan.hokkaido.jp", + "shari.hokkaido.jp", + "shibecha.hokkaido.jp", + "shibetsu.hokkaido.jp", + "shikabe.hokkaido.jp", + "shikaoi.hokkaido.jp", + "shimamaki.hokkaido.jp", + "shimizu.hokkaido.jp", + "shimokawa.hokkaido.jp", + "shinshinotsu.hokkaido.jp", + "shintoku.hokkaido.jp", + "shiranuka.hokkaido.jp", + "shiraoi.hokkaido.jp", + "shiriuchi.hokkaido.jp", + "sobetsu.hokkaido.jp", + "sunagawa.hokkaido.jp", + "taiki.hokkaido.jp", + "takasu.hokkaido.jp", + "takikawa.hokkaido.jp", + "takinoue.hokkaido.jp", + "teshikaga.hokkaido.jp", + "tobetsu.hokkaido.jp", + "tohma.hokkaido.jp", + "tomakomai.hokkaido.jp", + "tomari.hokkaido.jp", + "toya.hokkaido.jp", + "toyako.hokkaido.jp", + "toyotomi.hokkaido.jp", + "toyoura.hokkaido.jp", + "tsubetsu.hokkaido.jp", + "tsukigata.hokkaido.jp", + "urakawa.hokkaido.jp", + "urausu.hokkaido.jp", + "uryu.hokkaido.jp", + "utashinai.hokkaido.jp", + "wakkanai.hokkaido.jp", + "wassamu.hokkaido.jp", + "yakumo.hokkaido.jp", + "yoichi.hokkaido.jp", + "aioi.hyogo.jp", + "akashi.hyogo.jp", + "ako.hyogo.jp", + "amagasaki.hyogo.jp", + "aogaki.hyogo.jp", + "asago.hyogo.jp", + "ashiya.hyogo.jp", + "awaji.hyogo.jp", + "fukusaki.hyogo.jp", + "goshiki.hyogo.jp", + "harima.hyogo.jp", + "himeji.hyogo.jp", + "ichikawa.hyogo.jp", + "inagawa.hyogo.jp", + "itami.hyogo.jp", + "kakogawa.hyogo.jp", + "kamigori.hyogo.jp", + "kamikawa.hyogo.jp", + "kasai.hyogo.jp", + "kasuga.hyogo.jp", + "kawanishi.hyogo.jp", + "miki.hyogo.jp", + "minamiawaji.hyogo.jp", + "nishinomiya.hyogo.jp", + "nishiwaki.hyogo.jp", + "ono.hyogo.jp", + "sanda.hyogo.jp", + "sannan.hyogo.jp", + "sasayama.hyogo.jp", + "sayo.hyogo.jp", + "shingu.hyogo.jp", + "shinonsen.hyogo.jp", + "shiso.hyogo.jp", + "sumoto.hyogo.jp", + "taishi.hyogo.jp", + "taka.hyogo.jp", + "takarazuka.hyogo.jp", + "takasago.hyogo.jp", + "takino.hyogo.jp", + "tamba.hyogo.jp", + "tatsuno.hyogo.jp", + "toyooka.hyogo.jp", + "yabu.hyogo.jp", + "yashiro.hyogo.jp", + "yoka.hyogo.jp", + "yokawa.hyogo.jp", + "ami.ibaraki.jp", + "asahi.ibaraki.jp", + "bando.ibaraki.jp", + "chikusei.ibaraki.jp", + "daigo.ibaraki.jp", + "fujishiro.ibaraki.jp", + "hitachi.ibaraki.jp", + "hitachinaka.ibaraki.jp", + "hitachiomiya.ibaraki.jp", + "hitachiota.ibaraki.jp", + "ibaraki.ibaraki.jp", + "ina.ibaraki.jp", + "inashiki.ibaraki.jp", + "itako.ibaraki.jp", + "iwama.ibaraki.jp", + "joso.ibaraki.jp", + "kamisu.ibaraki.jp", + "kasama.ibaraki.jp", + "kashima.ibaraki.jp", + "kasumigaura.ibaraki.jp", + "koga.ibaraki.jp", + "miho.ibaraki.jp", + "mito.ibaraki.jp", + "moriya.ibaraki.jp", + "naka.ibaraki.jp", + "namegata.ibaraki.jp", + "oarai.ibaraki.jp", + "ogawa.ibaraki.jp", + "omitama.ibaraki.jp", + "ryugasaki.ibaraki.jp", + "sakai.ibaraki.jp", + "sakuragawa.ibaraki.jp", + "shimodate.ibaraki.jp", + "shimotsuma.ibaraki.jp", + "shirosato.ibaraki.jp", + "sowa.ibaraki.jp", + "suifu.ibaraki.jp", + "takahagi.ibaraki.jp", + "tamatsukuri.ibaraki.jp", + "tokai.ibaraki.jp", + "tomobe.ibaraki.jp", + "tone.ibaraki.jp", + "toride.ibaraki.jp", + "tsuchiura.ibaraki.jp", + "tsukuba.ibaraki.jp", + "uchihara.ibaraki.jp", + "ushiku.ibaraki.jp", + "yachiyo.ibaraki.jp", + "yamagata.ibaraki.jp", + "yawara.ibaraki.jp", + "yuki.ibaraki.jp", + "anamizu.ishikawa.jp", + "hakui.ishikawa.jp", + "hakusan.ishikawa.jp", + "kaga.ishikawa.jp", + "kahoku.ishikawa.jp", + "kanazawa.ishikawa.jp", + "kawakita.ishikawa.jp", + "komatsu.ishikawa.jp", + "nakanoto.ishikawa.jp", + "nanao.ishikawa.jp", + "nomi.ishikawa.jp", + "nonoichi.ishikawa.jp", + "noto.ishikawa.jp", + "shika.ishikawa.jp", + "suzu.ishikawa.jp", + "tsubata.ishikawa.jp", + "tsurugi.ishikawa.jp", + "uchinada.ishikawa.jp", + "wajima.ishikawa.jp", + "fudai.iwate.jp", + "fujisawa.iwate.jp", + "hanamaki.iwate.jp", + "hiraizumi.iwate.jp", + "hirono.iwate.jp", + "ichinohe.iwate.jp", + "ichinoseki.iwate.jp", + "iwaizumi.iwate.jp", + "iwate.iwate.jp", + "joboji.iwate.jp", + "kamaishi.iwate.jp", + "kanegasaki.iwate.jp", + "karumai.iwate.jp", + "kawai.iwate.jp", + "kitakami.iwate.jp", + "kuji.iwate.jp", + "kunohe.iwate.jp", + "kuzumaki.iwate.jp", + "miyako.iwate.jp", + "mizusawa.iwate.jp", + "morioka.iwate.jp", + "ninohe.iwate.jp", + "noda.iwate.jp", + "ofunato.iwate.jp", + "oshu.iwate.jp", + "otsuchi.iwate.jp", + "rikuzentakata.iwate.jp", + "shiwa.iwate.jp", + "shizukuishi.iwate.jp", + "sumita.iwate.jp", + "tanohata.iwate.jp", + "tono.iwate.jp", + "yahaba.iwate.jp", + "yamada.iwate.jp", + "ayagawa.kagawa.jp", + "higashikagawa.kagawa.jp", + "kanonji.kagawa.jp", + "kotohira.kagawa.jp", + "manno.kagawa.jp", + "marugame.kagawa.jp", + "mitoyo.kagawa.jp", + "naoshima.kagawa.jp", + "sanuki.kagawa.jp", + "tadotsu.kagawa.jp", + "takamatsu.kagawa.jp", + "tonosho.kagawa.jp", + "uchinomi.kagawa.jp", + "utazu.kagawa.jp", + "zentsuji.kagawa.jp", + "akune.kagoshima.jp", + "amami.kagoshima.jp", + "hioki.kagoshima.jp", + "isa.kagoshima.jp", + "isen.kagoshima.jp", + "izumi.kagoshima.jp", + "kagoshima.kagoshima.jp", + "kanoya.kagoshima.jp", + "kawanabe.kagoshima.jp", + "kinko.kagoshima.jp", + "kouyama.kagoshima.jp", + "makurazaki.kagoshima.jp", + "matsumoto.kagoshima.jp", + "minamitane.kagoshima.jp", + "nakatane.kagoshima.jp", + "nishinoomote.kagoshima.jp", + "satsumasendai.kagoshima.jp", + "soo.kagoshima.jp", + "tarumizu.kagoshima.jp", + "yusui.kagoshima.jp", + "aikawa.kanagawa.jp", + "atsugi.kanagawa.jp", + "ayase.kanagawa.jp", + "chigasaki.kanagawa.jp", + "ebina.kanagawa.jp", + "fujisawa.kanagawa.jp", + "hadano.kanagawa.jp", + "hakone.kanagawa.jp", + "hiratsuka.kanagawa.jp", + "isehara.kanagawa.jp", + "kaisei.kanagawa.jp", + "kamakura.kanagawa.jp", + "kiyokawa.kanagawa.jp", + "matsuda.kanagawa.jp", + "minamiashigara.kanagawa.jp", + "miura.kanagawa.jp", + "nakai.kanagawa.jp", + "ninomiya.kanagawa.jp", + "odawara.kanagawa.jp", + "oi.kanagawa.jp", + "oiso.kanagawa.jp", + "sagamihara.kanagawa.jp", + "samukawa.kanagawa.jp", + "tsukui.kanagawa.jp", + "yamakita.kanagawa.jp", + "yamato.kanagawa.jp", + "yokosuka.kanagawa.jp", + "yugawara.kanagawa.jp", + "zama.kanagawa.jp", + "zushi.kanagawa.jp", + "aki.kochi.jp", + "geisei.kochi.jp", + "hidaka.kochi.jp", + "higashitsuno.kochi.jp", + "ino.kochi.jp", + "kagami.kochi.jp", + "kami.kochi.jp", + "kitagawa.kochi.jp", + "kochi.kochi.jp", + "mihara.kochi.jp", + "motoyama.kochi.jp", + "muroto.kochi.jp", + "nahari.kochi.jp", + "nakamura.kochi.jp", + "nankoku.kochi.jp", + "nishitosa.kochi.jp", + "niyodogawa.kochi.jp", + "ochi.kochi.jp", + "okawa.kochi.jp", + "otoyo.kochi.jp", + "otsuki.kochi.jp", + "sakawa.kochi.jp", + "sukumo.kochi.jp", + "susaki.kochi.jp", + "tosa.kochi.jp", + "tosashimizu.kochi.jp", + "toyo.kochi.jp", + "tsuno.kochi.jp", + "umaji.kochi.jp", + "yasuda.kochi.jp", + "yusuhara.kochi.jp", + "amakusa.kumamoto.jp", + "arao.kumamoto.jp", + "aso.kumamoto.jp", + "choyo.kumamoto.jp", + "gyokuto.kumamoto.jp", + "hitoyoshi.kumamoto.jp", + "kamiamakusa.kumamoto.jp", + "kashima.kumamoto.jp", + "kikuchi.kumamoto.jp", + "kosa.kumamoto.jp", + "kumamoto.kumamoto.jp", + "mashiki.kumamoto.jp", + "mifune.kumamoto.jp", + "minamata.kumamoto.jp", + "minamioguni.kumamoto.jp", + "nagasu.kumamoto.jp", + "nishihara.kumamoto.jp", + "oguni.kumamoto.jp", + "ozu.kumamoto.jp", + "sumoto.kumamoto.jp", + "takamori.kumamoto.jp", + "uki.kumamoto.jp", + "uto.kumamoto.jp", + "yamaga.kumamoto.jp", + "yamato.kumamoto.jp", + "yatsushiro.kumamoto.jp", + "ayabe.kyoto.jp", + "fukuchiyama.kyoto.jp", + "higashiyama.kyoto.jp", + "ide.kyoto.jp", + "ine.kyoto.jp", + "joyo.kyoto.jp", + "kameoka.kyoto.jp", + "kamo.kyoto.jp", + "kita.kyoto.jp", + "kizu.kyoto.jp", + "kumiyama.kyoto.jp", + "kyotamba.kyoto.jp", + "kyotanabe.kyoto.jp", + "kyotango.kyoto.jp", + "maizuru.kyoto.jp", + "minami.kyoto.jp", + "minamiyamashiro.kyoto.jp", + "miyazu.kyoto.jp", + "muko.kyoto.jp", + "nagaokakyo.kyoto.jp", + "nakagyo.kyoto.jp", + "nantan.kyoto.jp", + "oyamazaki.kyoto.jp", + "sakyo.kyoto.jp", + "seika.kyoto.jp", + "tanabe.kyoto.jp", + "uji.kyoto.jp", + "ujitawara.kyoto.jp", + "wazuka.kyoto.jp", + "yamashina.kyoto.jp", + "yawata.kyoto.jp", + "asahi.mie.jp", + "inabe.mie.jp", + "ise.mie.jp", + "kameyama.mie.jp", + "kawagoe.mie.jp", + "kiho.mie.jp", + "kisosaki.mie.jp", + "kiwa.mie.jp", + "komono.mie.jp", + "kumano.mie.jp", + "kuwana.mie.jp", + "matsusaka.mie.jp", + "meiwa.mie.jp", + "mihama.mie.jp", + "minamiise.mie.jp", + "misugi.mie.jp", + "miyama.mie.jp", + "nabari.mie.jp", + "shima.mie.jp", + "suzuka.mie.jp", + "tado.mie.jp", + "taiki.mie.jp", + "taki.mie.jp", + "tamaki.mie.jp", + "toba.mie.jp", + "tsu.mie.jp", + "udono.mie.jp", + "ureshino.mie.jp", + "watarai.mie.jp", + "yokkaichi.mie.jp", + "furukawa.miyagi.jp", + "higashimatsushima.miyagi.jp", + "ishinomaki.miyagi.jp", + "iwanuma.miyagi.jp", + "kakuda.miyagi.jp", + "kami.miyagi.jp", + "kawasaki.miyagi.jp", + "kesennuma.miyagi.jp", + "marumori.miyagi.jp", + "matsushima.miyagi.jp", + "minamisanriku.miyagi.jp", + "misato.miyagi.jp", + "murata.miyagi.jp", + "natori.miyagi.jp", + "ogawara.miyagi.jp", + "ohira.miyagi.jp", + "onagawa.miyagi.jp", + "osaki.miyagi.jp", + "rifu.miyagi.jp", + "semine.miyagi.jp", + "shibata.miyagi.jp", + "shichikashuku.miyagi.jp", + "shikama.miyagi.jp", + "shiogama.miyagi.jp", + "shiroishi.miyagi.jp", + "tagajo.miyagi.jp", + "taiwa.miyagi.jp", + "tome.miyagi.jp", + "tomiya.miyagi.jp", + "wakuya.miyagi.jp", + "watari.miyagi.jp", + "yamamoto.miyagi.jp", + "zao.miyagi.jp", + "aya.miyazaki.jp", + "ebino.miyazaki.jp", + "gokase.miyazaki.jp", + "hyuga.miyazaki.jp", + "kadogawa.miyazaki.jp", + "kawaminami.miyazaki.jp", + "kijo.miyazaki.jp", + "kitagawa.miyazaki.jp", + "kitakata.miyazaki.jp", + "kitaura.miyazaki.jp", + "kobayashi.miyazaki.jp", + "kunitomi.miyazaki.jp", + "kushima.miyazaki.jp", + "mimata.miyazaki.jp", + "miyakonojo.miyazaki.jp", + "miyazaki.miyazaki.jp", + "morotsuka.miyazaki.jp", + "nichinan.miyazaki.jp", + "nishimera.miyazaki.jp", + "nobeoka.miyazaki.jp", + "saito.miyazaki.jp", + "shiiba.miyazaki.jp", + "shintomi.miyazaki.jp", + "takaharu.miyazaki.jp", + "takanabe.miyazaki.jp", + "takazaki.miyazaki.jp", + "tsuno.miyazaki.jp", + "achi.nagano.jp", + "agematsu.nagano.jp", + "anan.nagano.jp", + "aoki.nagano.jp", + "asahi.nagano.jp", + "azumino.nagano.jp", + "chikuhoku.nagano.jp", + "chikuma.nagano.jp", + "chino.nagano.jp", + "fujimi.nagano.jp", + "hakuba.nagano.jp", + "hara.nagano.jp", + "hiraya.nagano.jp", + "iida.nagano.jp", + "iijima.nagano.jp", + "iiyama.nagano.jp", + "iizuna.nagano.jp", + "ikeda.nagano.jp", + "ikusaka.nagano.jp", + "ina.nagano.jp", + "karuizawa.nagano.jp", + "kawakami.nagano.jp", + "kiso.nagano.jp", + "kisofukushima.nagano.jp", + "kitaaiki.nagano.jp", + "komagane.nagano.jp", + "komoro.nagano.jp", + "matsukawa.nagano.jp", + "matsumoto.nagano.jp", + "miasa.nagano.jp", + "minamiaiki.nagano.jp", + "minamimaki.nagano.jp", + "minamiminowa.nagano.jp", + "minowa.nagano.jp", + "miyada.nagano.jp", + "miyota.nagano.jp", + "mochizuki.nagano.jp", + "nagano.nagano.jp", + "nagawa.nagano.jp", + "nagiso.nagano.jp", + "nakagawa.nagano.jp", + "nakano.nagano.jp", + "nozawaonsen.nagano.jp", + "obuse.nagano.jp", + "ogawa.nagano.jp", + "okaya.nagano.jp", + "omachi.nagano.jp", + "omi.nagano.jp", + "ookuwa.nagano.jp", + "ooshika.nagano.jp", + "otaki.nagano.jp", + "otari.nagano.jp", + "sakae.nagano.jp", + "sakaki.nagano.jp", + "saku.nagano.jp", + "sakuho.nagano.jp", + "shimosuwa.nagano.jp", + "shinanomachi.nagano.jp", + "shiojiri.nagano.jp", + "suwa.nagano.jp", + "suzaka.nagano.jp", + "takagi.nagano.jp", + "takamori.nagano.jp", + "takayama.nagano.jp", + "tateshina.nagano.jp", + "tatsuno.nagano.jp", + "togakushi.nagano.jp", + "togura.nagano.jp", + "tomi.nagano.jp", + "ueda.nagano.jp", + "wada.nagano.jp", + "yamagata.nagano.jp", + "yamanouchi.nagano.jp", + "yasaka.nagano.jp", + "yasuoka.nagano.jp", + "chijiwa.nagasaki.jp", + "futsu.nagasaki.jp", + "goto.nagasaki.jp", + "hasami.nagasaki.jp", + "hirado.nagasaki.jp", + "iki.nagasaki.jp", + "isahaya.nagasaki.jp", + "kawatana.nagasaki.jp", + "kuchinotsu.nagasaki.jp", + "matsuura.nagasaki.jp", + "nagasaki.nagasaki.jp", + "obama.nagasaki.jp", + "omura.nagasaki.jp", + "oseto.nagasaki.jp", + "saikai.nagasaki.jp", + "sasebo.nagasaki.jp", + "seihi.nagasaki.jp", + "shimabara.nagasaki.jp", + "shinkamigoto.nagasaki.jp", + "togitsu.nagasaki.jp", + "tsushima.nagasaki.jp", + "unzen.nagasaki.jp", + "ando.nara.jp", + "gose.nara.jp", + "heguri.nara.jp", + "higashiyoshino.nara.jp", + "ikaruga.nara.jp", + "ikoma.nara.jp", + "kamikitayama.nara.jp", + "kanmaki.nara.jp", + "kashiba.nara.jp", + "kashihara.nara.jp", + "katsuragi.nara.jp", + "kawai.nara.jp", + "kawakami.nara.jp", + "kawanishi.nara.jp", + "koryo.nara.jp", + "kurotaki.nara.jp", + "mitsue.nara.jp", + "miyake.nara.jp", + "nara.nara.jp", + "nosegawa.nara.jp", + "oji.nara.jp", + "ouda.nara.jp", + "oyodo.nara.jp", + "sakurai.nara.jp", + "sango.nara.jp", + "shimoichi.nara.jp", + "shimokitayama.nara.jp", + "shinjo.nara.jp", + "soni.nara.jp", + "takatori.nara.jp", + "tawaramoto.nara.jp", + "tenkawa.nara.jp", + "tenri.nara.jp", + "uda.nara.jp", + "yamatokoriyama.nara.jp", + "yamatotakada.nara.jp", + "yamazoe.nara.jp", + "yoshino.nara.jp", + "aga.niigata.jp", + "agano.niigata.jp", + "gosen.niigata.jp", + "itoigawa.niigata.jp", + "izumozaki.niigata.jp", + "joetsu.niigata.jp", + "kamo.niigata.jp", + "kariwa.niigata.jp", + "kashiwazaki.niigata.jp", + "minamiuonuma.niigata.jp", + "mitsuke.niigata.jp", + "muika.niigata.jp", + "murakami.niigata.jp", + "myoko.niigata.jp", + "nagaoka.niigata.jp", + "niigata.niigata.jp", + "ojiya.niigata.jp", + "omi.niigata.jp", + "sado.niigata.jp", + "sanjo.niigata.jp", + "seiro.niigata.jp", + "seirou.niigata.jp", + "sekikawa.niigata.jp", + "shibata.niigata.jp", + "tagami.niigata.jp", + "tainai.niigata.jp", + "tochio.niigata.jp", + "tokamachi.niigata.jp", + "tsubame.niigata.jp", + "tsunan.niigata.jp", + "uonuma.niigata.jp", + "yahiko.niigata.jp", + "yoita.niigata.jp", + "yuzawa.niigata.jp", + "beppu.oita.jp", + "bungoono.oita.jp", + "bungotakada.oita.jp", + "hasama.oita.jp", + "hiji.oita.jp", + "himeshima.oita.jp", + "hita.oita.jp", + "kamitsue.oita.jp", + "kokonoe.oita.jp", + "kuju.oita.jp", + "kunisaki.oita.jp", + "kusu.oita.jp", + "oita.oita.jp", + "saiki.oita.jp", + "taketa.oita.jp", + "tsukumi.oita.jp", + "usa.oita.jp", + "usuki.oita.jp", + "yufu.oita.jp", + "akaiwa.okayama.jp", + "asakuchi.okayama.jp", + "bizen.okayama.jp", + "hayashima.okayama.jp", + "ibara.okayama.jp", + "kagamino.okayama.jp", + "kasaoka.okayama.jp", + "kibichuo.okayama.jp", + "kumenan.okayama.jp", + "kurashiki.okayama.jp", + "maniwa.okayama.jp", + "misaki.okayama.jp", + "nagi.okayama.jp", + "niimi.okayama.jp", + "nishiawakura.okayama.jp", + "okayama.okayama.jp", + "satosho.okayama.jp", + "setouchi.okayama.jp", + "shinjo.okayama.jp", + "shoo.okayama.jp", + "soja.okayama.jp", + "takahashi.okayama.jp", + "tamano.okayama.jp", + "tsuyama.okayama.jp", + "wake.okayama.jp", + "yakage.okayama.jp", + "aguni.okinawa.jp", + "ginowan.okinawa.jp", + "ginoza.okinawa.jp", + "gushikami.okinawa.jp", + "haebaru.okinawa.jp", + "higashi.okinawa.jp", + "hirara.okinawa.jp", + "iheya.okinawa.jp", + "ishigaki.okinawa.jp", + "ishikawa.okinawa.jp", + "itoman.okinawa.jp", + "izena.okinawa.jp", + "kadena.okinawa.jp", + "kin.okinawa.jp", + "kitadaito.okinawa.jp", + "kitanakagusuku.okinawa.jp", + "kumejima.okinawa.jp", + "kunigami.okinawa.jp", + "minamidaito.okinawa.jp", + "motobu.okinawa.jp", + "nago.okinawa.jp", + "naha.okinawa.jp", + "nakagusuku.okinawa.jp", + "nakijin.okinawa.jp", + "nanjo.okinawa.jp", + "nishihara.okinawa.jp", + "ogimi.okinawa.jp", + "okinawa.okinawa.jp", + "onna.okinawa.jp", + "shimoji.okinawa.jp", + "taketomi.okinawa.jp", + "tarama.okinawa.jp", + "tokashiki.okinawa.jp", + "tomigusuku.okinawa.jp", + "tonaki.okinawa.jp", + "urasoe.okinawa.jp", + "uruma.okinawa.jp", + "yaese.okinawa.jp", + "yomitan.okinawa.jp", + "yonabaru.okinawa.jp", + "yonaguni.okinawa.jp", + "zamami.okinawa.jp", + "abeno.osaka.jp", + "chihayaakasaka.osaka.jp", + "chuo.osaka.jp", + "daito.osaka.jp", + "fujiidera.osaka.jp", + "habikino.osaka.jp", + "hannan.osaka.jp", + "higashiosaka.osaka.jp", + "higashisumiyoshi.osaka.jp", + "higashiyodogawa.osaka.jp", + "hirakata.osaka.jp", + "ibaraki.osaka.jp", + "ikeda.osaka.jp", + "izumi.osaka.jp", + "izumiotsu.osaka.jp", + "izumisano.osaka.jp", + "kadoma.osaka.jp", + "kaizuka.osaka.jp", + "kanan.osaka.jp", + "kashiwara.osaka.jp", + "katano.osaka.jp", + "kawachinagano.osaka.jp", + "kishiwada.osaka.jp", + "kita.osaka.jp", + "kumatori.osaka.jp", + "matsubara.osaka.jp", + "minato.osaka.jp", + "minoh.osaka.jp", + "misaki.osaka.jp", + "moriguchi.osaka.jp", + "neyagawa.osaka.jp", + "nishi.osaka.jp", + "nose.osaka.jp", + "osakasayama.osaka.jp", + "sakai.osaka.jp", + "sayama.osaka.jp", + "sennan.osaka.jp", + "settsu.osaka.jp", + "shijonawate.osaka.jp", + "shimamoto.osaka.jp", + "suita.osaka.jp", + "tadaoka.osaka.jp", + "taishi.osaka.jp", + "tajiri.osaka.jp", + "takaishi.osaka.jp", + "takatsuki.osaka.jp", + "tondabayashi.osaka.jp", + "toyonaka.osaka.jp", + "toyono.osaka.jp", + "yao.osaka.jp", + "ariake.saga.jp", + "arita.saga.jp", + "fukudomi.saga.jp", + "genkai.saga.jp", + "hamatama.saga.jp", + "hizen.saga.jp", + "imari.saga.jp", + "kamimine.saga.jp", + "kanzaki.saga.jp", + "karatsu.saga.jp", + "kashima.saga.jp", + "kitagata.saga.jp", + "kitahata.saga.jp", + "kiyama.saga.jp", + "kouhoku.saga.jp", + "kyuragi.saga.jp", + "nishiarita.saga.jp", + "ogi.saga.jp", + "omachi.saga.jp", + "ouchi.saga.jp", + "saga.saga.jp", + "shiroishi.saga.jp", + "taku.saga.jp", + "tara.saga.jp", + "tosu.saga.jp", + "yoshinogari.saga.jp", + "arakawa.saitama.jp", + "asaka.saitama.jp", + "chichibu.saitama.jp", + "fujimi.saitama.jp", + "fujimino.saitama.jp", + "fukaya.saitama.jp", + "hanno.saitama.jp", + "hanyu.saitama.jp", + "hasuda.saitama.jp", + "hatogaya.saitama.jp", + "hatoyama.saitama.jp", + "hidaka.saitama.jp", + "higashichichibu.saitama.jp", + "higashimatsuyama.saitama.jp", + "honjo.saitama.jp", + "ina.saitama.jp", + "iruma.saitama.jp", + "iwatsuki.saitama.jp", + "kamiizumi.saitama.jp", + "kamikawa.saitama.jp", + "kamisato.saitama.jp", + "kasukabe.saitama.jp", + "kawagoe.saitama.jp", + "kawaguchi.saitama.jp", + "kawajima.saitama.jp", + "kazo.saitama.jp", + "kitamoto.saitama.jp", + "koshigaya.saitama.jp", + "kounosu.saitama.jp", + "kuki.saitama.jp", + "kumagaya.saitama.jp", + "matsubushi.saitama.jp", + "minano.saitama.jp", + "misato.saitama.jp", + "miyashiro.saitama.jp", + "miyoshi.saitama.jp", + "moroyama.saitama.jp", + "nagatoro.saitama.jp", + "namegawa.saitama.jp", + "niiza.saitama.jp", + "ogano.saitama.jp", + "ogawa.saitama.jp", + "ogose.saitama.jp", + "okegawa.saitama.jp", + "omiya.saitama.jp", + "otaki.saitama.jp", + "ranzan.saitama.jp", + "ryokami.saitama.jp", + "saitama.saitama.jp", + "sakado.saitama.jp", + "satte.saitama.jp", + "sayama.saitama.jp", + "shiki.saitama.jp", + "shiraoka.saitama.jp", + "soka.saitama.jp", + "sugito.saitama.jp", + "toda.saitama.jp", + "tokigawa.saitama.jp", + "tokorozawa.saitama.jp", + "tsurugashima.saitama.jp", + "urawa.saitama.jp", + "warabi.saitama.jp", + "yashio.saitama.jp", + "yokoze.saitama.jp", + "yono.saitama.jp", + "yorii.saitama.jp", + "yoshida.saitama.jp", + "yoshikawa.saitama.jp", + "yoshimi.saitama.jp", + "aisho.shiga.jp", + "gamo.shiga.jp", + "higashiomi.shiga.jp", + "hikone.shiga.jp", + "koka.shiga.jp", + "konan.shiga.jp", + "kosei.shiga.jp", + "koto.shiga.jp", + "kusatsu.shiga.jp", + "maibara.shiga.jp", + "moriyama.shiga.jp", + "nagahama.shiga.jp", + "nishiazai.shiga.jp", + "notogawa.shiga.jp", + "omihachiman.shiga.jp", + "otsu.shiga.jp", + "ritto.shiga.jp", + "ryuoh.shiga.jp", + "takashima.shiga.jp", + "takatsuki.shiga.jp", + "torahime.shiga.jp", + "toyosato.shiga.jp", + "yasu.shiga.jp", + "akagi.shimane.jp", + "ama.shimane.jp", + "gotsu.shimane.jp", + "hamada.shimane.jp", + "higashiizumo.shimane.jp", + "hikawa.shimane.jp", + "hikimi.shimane.jp", + "izumo.shimane.jp", + "kakinoki.shimane.jp", + "masuda.shimane.jp", + "matsue.shimane.jp", + "misato.shimane.jp", + "nishinoshima.shimane.jp", + "ohda.shimane.jp", + "okinoshima.shimane.jp", + "okuizumo.shimane.jp", + "shimane.shimane.jp", + "tamayu.shimane.jp", + "tsuwano.shimane.jp", + "unnan.shimane.jp", + "yakumo.shimane.jp", + "yasugi.shimane.jp", + "yatsuka.shimane.jp", + "arai.shizuoka.jp", + "atami.shizuoka.jp", + "fuji.shizuoka.jp", + "fujieda.shizuoka.jp", + "fujikawa.shizuoka.jp", + "fujinomiya.shizuoka.jp", + "fukuroi.shizuoka.jp", + "gotemba.shizuoka.jp", + "haibara.shizuoka.jp", + "hamamatsu.shizuoka.jp", + "higashiizu.shizuoka.jp", + "ito.shizuoka.jp", + "iwata.shizuoka.jp", + "izu.shizuoka.jp", + "izunokuni.shizuoka.jp", + "kakegawa.shizuoka.jp", + "kannami.shizuoka.jp", + "kawanehon.shizuoka.jp", + "kawazu.shizuoka.jp", + "kikugawa.shizuoka.jp", + "kosai.shizuoka.jp", + "makinohara.shizuoka.jp", + "matsuzaki.shizuoka.jp", + "minamiizu.shizuoka.jp", + "mishima.shizuoka.jp", + "morimachi.shizuoka.jp", + "nishiizu.shizuoka.jp", + "numazu.shizuoka.jp", + "omaezaki.shizuoka.jp", + "shimada.shizuoka.jp", + "shimizu.shizuoka.jp", + "shimoda.shizuoka.jp", + "shizuoka.shizuoka.jp", + "susono.shizuoka.jp", + "yaizu.shizuoka.jp", + "yoshida.shizuoka.jp", + "ashikaga.tochigi.jp", + "bato.tochigi.jp", + "haga.tochigi.jp", + "ichikai.tochigi.jp", + "iwafune.tochigi.jp", + "kaminokawa.tochigi.jp", + "kanuma.tochigi.jp", + "karasuyama.tochigi.jp", + "kuroiso.tochigi.jp", + "mashiko.tochigi.jp", + "mibu.tochigi.jp", + "moka.tochigi.jp", + "motegi.tochigi.jp", + "nasu.tochigi.jp", + "nasushiobara.tochigi.jp", + "nikko.tochigi.jp", + "nishikata.tochigi.jp", + "nogi.tochigi.jp", + "ohira.tochigi.jp", + "ohtawara.tochigi.jp", + "oyama.tochigi.jp", + "sakura.tochigi.jp", + "sano.tochigi.jp", + "shimotsuke.tochigi.jp", + "shioya.tochigi.jp", + "takanezawa.tochigi.jp", + "tochigi.tochigi.jp", + "tsuga.tochigi.jp", + "ujiie.tochigi.jp", + "utsunomiya.tochigi.jp", + "yaita.tochigi.jp", + "aizumi.tokushima.jp", + "anan.tokushima.jp", + "ichiba.tokushima.jp", + "itano.tokushima.jp", + "kainan.tokushima.jp", + "komatsushima.tokushima.jp", + "matsushige.tokushima.jp", + "mima.tokushima.jp", + "minami.tokushima.jp", + "miyoshi.tokushima.jp", + "mugi.tokushima.jp", + "nakagawa.tokushima.jp", + "naruto.tokushima.jp", + "sanagochi.tokushima.jp", + "shishikui.tokushima.jp", + "tokushima.tokushima.jp", + "wajiki.tokushima.jp", + "adachi.tokyo.jp", + "akiruno.tokyo.jp", + "akishima.tokyo.jp", + "aogashima.tokyo.jp", + "arakawa.tokyo.jp", + "bunkyo.tokyo.jp", + "chiyoda.tokyo.jp", + "chofu.tokyo.jp", + "chuo.tokyo.jp", + "edogawa.tokyo.jp", + "fuchu.tokyo.jp", + "fussa.tokyo.jp", + "hachijo.tokyo.jp", + "hachioji.tokyo.jp", + "hamura.tokyo.jp", + "higashikurume.tokyo.jp", + "higashimurayama.tokyo.jp", + "higashiyamato.tokyo.jp", + "hino.tokyo.jp", + "hinode.tokyo.jp", + "hinohara.tokyo.jp", + "inagi.tokyo.jp", + "itabashi.tokyo.jp", + "katsushika.tokyo.jp", + "kita.tokyo.jp", + "kiyose.tokyo.jp", + "kodaira.tokyo.jp", + "koganei.tokyo.jp", + "kokubunji.tokyo.jp", + "komae.tokyo.jp", + "koto.tokyo.jp", + "kouzushima.tokyo.jp", + "kunitachi.tokyo.jp", + "machida.tokyo.jp", + "meguro.tokyo.jp", + "minato.tokyo.jp", + "mitaka.tokyo.jp", + "mizuho.tokyo.jp", + "musashimurayama.tokyo.jp", + "musashino.tokyo.jp", + "nakano.tokyo.jp", + "nerima.tokyo.jp", + "ogasawara.tokyo.jp", + "okutama.tokyo.jp", + "ome.tokyo.jp", + "oshima.tokyo.jp", + "ota.tokyo.jp", + "setagaya.tokyo.jp", + "shibuya.tokyo.jp", + "shinagawa.tokyo.jp", + "shinjuku.tokyo.jp", + "suginami.tokyo.jp", + "sumida.tokyo.jp", + "tachikawa.tokyo.jp", + "taito.tokyo.jp", + "tama.tokyo.jp", + "toshima.tokyo.jp", + "chizu.tottori.jp", + "hino.tottori.jp", + "kawahara.tottori.jp", + "koge.tottori.jp", + "kotoura.tottori.jp", + "misasa.tottori.jp", + "nanbu.tottori.jp", + "nichinan.tottori.jp", + "sakaiminato.tottori.jp", + "tottori.tottori.jp", + "wakasa.tottori.jp", + "yazu.tottori.jp", + "yonago.tottori.jp", + "asahi.toyama.jp", + "fuchu.toyama.jp", + "fukumitsu.toyama.jp", + "funahashi.toyama.jp", + "himi.toyama.jp", + "imizu.toyama.jp", + "inami.toyama.jp", + "johana.toyama.jp", + "kamiichi.toyama.jp", + "kurobe.toyama.jp", + "nakaniikawa.toyama.jp", + "namerikawa.toyama.jp", + "nanto.toyama.jp", + "nyuzen.toyama.jp", + "oyabe.toyama.jp", + "taira.toyama.jp", + "takaoka.toyama.jp", + "tateyama.toyama.jp", + "toga.toyama.jp", + "tonami.toyama.jp", + "toyama.toyama.jp", + "unazuki.toyama.jp", + "uozu.toyama.jp", + "yamada.toyama.jp", + "arida.wakayama.jp", + "aridagawa.wakayama.jp", + "gobo.wakayama.jp", + "hashimoto.wakayama.jp", + "hidaka.wakayama.jp", + "hirogawa.wakayama.jp", + "inami.wakayama.jp", + "iwade.wakayama.jp", + "kainan.wakayama.jp", + "kamitonda.wakayama.jp", + "katsuragi.wakayama.jp", + "kimino.wakayama.jp", + "kinokawa.wakayama.jp", + "kitayama.wakayama.jp", + "koya.wakayama.jp", + "koza.wakayama.jp", + "kozagawa.wakayama.jp", + "kudoyama.wakayama.jp", + "kushimoto.wakayama.jp", + "mihama.wakayama.jp", + "misato.wakayama.jp", + "nachikatsuura.wakayama.jp", + "shingu.wakayama.jp", + "shirahama.wakayama.jp", + "taiji.wakayama.jp", + "tanabe.wakayama.jp", + "wakayama.wakayama.jp", + "yuasa.wakayama.jp", + "yura.wakayama.jp", + "asahi.yamagata.jp", + "funagata.yamagata.jp", + "higashine.yamagata.jp", + "iide.yamagata.jp", + "kahoku.yamagata.jp", + "kaminoyama.yamagata.jp", + "kaneyama.yamagata.jp", + "kawanishi.yamagata.jp", + "mamurogawa.yamagata.jp", + "mikawa.yamagata.jp", + "murayama.yamagata.jp", + "nagai.yamagata.jp", + "nakayama.yamagata.jp", + "nanyo.yamagata.jp", + "nishikawa.yamagata.jp", + "obanazawa.yamagata.jp", + "oe.yamagata.jp", + "oguni.yamagata.jp", + "ohkura.yamagata.jp", + "oishida.yamagata.jp", + "sagae.yamagata.jp", + "sakata.yamagata.jp", + "sakegawa.yamagata.jp", + "shinjo.yamagata.jp", + "shirataka.yamagata.jp", + "shonai.yamagata.jp", + "takahata.yamagata.jp", + "tendo.yamagata.jp", + "tozawa.yamagata.jp", + "tsuruoka.yamagata.jp", + "yamagata.yamagata.jp", + "yamanobe.yamagata.jp", + "yonezawa.yamagata.jp", + "yuza.yamagata.jp", + "abu.yamaguchi.jp", + "hagi.yamaguchi.jp", + "hikari.yamaguchi.jp", + "hofu.yamaguchi.jp", + "iwakuni.yamaguchi.jp", + "kudamatsu.yamaguchi.jp", + "mitou.yamaguchi.jp", + "nagato.yamaguchi.jp", + "oshima.yamaguchi.jp", + "shimonoseki.yamaguchi.jp", + "shunan.yamaguchi.jp", + "tabuse.yamaguchi.jp", + "tokuyama.yamaguchi.jp", + "toyota.yamaguchi.jp", + "ube.yamaguchi.jp", + "yuu.yamaguchi.jp", + "chuo.yamanashi.jp", + "doshi.yamanashi.jp", + "fuefuki.yamanashi.jp", + "fujikawa.yamanashi.jp", + "fujikawaguchiko.yamanashi.jp", + "fujiyoshida.yamanashi.jp", + "hayakawa.yamanashi.jp", + "hokuto.yamanashi.jp", + "ichikawamisato.yamanashi.jp", + "kai.yamanashi.jp", + "kofu.yamanashi.jp", + "koshu.yamanashi.jp", + "kosuge.yamanashi.jp", + "minami-alps.yamanashi.jp", + "minobu.yamanashi.jp", + "nakamichi.yamanashi.jp", + "nanbu.yamanashi.jp", + "narusawa.yamanashi.jp", + "nirasaki.yamanashi.jp", + "nishikatsura.yamanashi.jp", + "oshino.yamanashi.jp", + "otsuki.yamanashi.jp", + "showa.yamanashi.jp", + "tabayama.yamanashi.jp", + "tsuru.yamanashi.jp", + "uenohara.yamanashi.jp", + "yamanakako.yamanashi.jp", + "yamanashi.yamanashi.jp", + "*.ke", + "kg", + "org.kg", + "net.kg", + "com.kg", + "edu.kg", + "gov.kg", + "mil.kg", + "*.kh", + "ki", + "edu.ki", + "biz.ki", + "net.ki", + "org.ki", + "gov.ki", + "info.ki", + "com.ki", + "km", + "org.km", + "nom.km", + "gov.km", + "prd.km", + "tm.km", + "edu.km", + "mil.km", + "ass.km", + "com.km", + "coop.km", + "asso.km", + "presse.km", + "medecin.km", + "notaires.km", + "pharmaciens.km", + "veterinaire.km", + "gouv.km", + "kn", + "net.kn", + "org.kn", + "edu.kn", + "gov.kn", + "kp", + "com.kp", + "edu.kp", + "gov.kp", + "org.kp", + "rep.kp", + "tra.kp", + "kr", + "ac.kr", + "co.kr", + "es.kr", + "go.kr", + "hs.kr", + "kg.kr", + "mil.kr", + "ms.kr", + "ne.kr", + "or.kr", + "pe.kr", + "re.kr", + "sc.kr", + "busan.kr", + "chungbuk.kr", + "chungnam.kr", + "daegu.kr", + "daejeon.kr", + "gangwon.kr", + "gwangju.kr", + "gyeongbuk.kr", + "gyeonggi.kr", + "gyeongnam.kr", + "incheon.kr", + "jeju.kr", + "jeonbuk.kr", + "jeonnam.kr", + "seoul.kr", + "ulsan.kr", + "*.kw", + "ky", + "edu.ky", + "gov.ky", + "com.ky", + "org.ky", + "net.ky", + "kz", + "org.kz", + "edu.kz", + "net.kz", + "gov.kz", + "mil.kz", + "com.kz", + "la", + "int.la", + "net.la", + "info.la", + "edu.la", + "gov.la", + "per.la", + "com.la", + "org.la", + "lb", + "com.lb", + "edu.lb", + "gov.lb", + "net.lb", + "org.lb", + "lc", + "com.lc", + "net.lc", + "co.lc", + "org.lc", + "edu.lc", + "gov.lc", + "li", + "lk", + "gov.lk", + "sch.lk", + "net.lk", + "int.lk", + "com.lk", + "org.lk", + "edu.lk", + "ngo.lk", + "soc.lk", + "web.lk", + "ltd.lk", + "assn.lk", + "grp.lk", + "hotel.lk", + "ac.lk", + "lr", + "com.lr", + "edu.lr", + "gov.lr", + "org.lr", + "net.lr", + "ls", + "co.ls", + "org.ls", + "lt", + "gov.lt", + "lu", + "lv", + "com.lv", + "edu.lv", + "gov.lv", + "org.lv", + "mil.lv", + "id.lv", + "net.lv", + "asn.lv", + "conf.lv", + "ly", + "com.ly", + "net.ly", + "gov.ly", + "plc.ly", + "edu.ly", + "sch.ly", + "med.ly", + "org.ly", + "id.ly", + "ma", + "co.ma", + "net.ma", + "gov.ma", + "org.ma", + "ac.ma", + "press.ma", + "mc", + "tm.mc", + "asso.mc", + "md", + "me", + "co.me", + "net.me", + "org.me", + "edu.me", + "ac.me", + "gov.me", + "its.me", + "priv.me", + "mg", + "org.mg", + "nom.mg", + "gov.mg", + "prd.mg", + "tm.mg", + "edu.mg", + "mil.mg", + "com.mg", + "co.mg", + "mh", + "mil", + "mk", + "com.mk", + "org.mk", + "net.mk", + "edu.mk", + "gov.mk", + "inf.mk", + "name.mk", + "ml", + "com.ml", + "edu.ml", + "gouv.ml", + "gov.ml", + "net.ml", + "org.ml", + "presse.ml", + "*.mm", + "mn", + "gov.mn", + "edu.mn", + "org.mn", + "mo", + "com.mo", + "net.mo", + "org.mo", + "edu.mo", + "gov.mo", + "mobi", + "mp", + "mq", + "mr", + "gov.mr", + "ms", + "com.ms", + "edu.ms", + "gov.ms", + "net.ms", + "org.ms", + "mt", + "com.mt", + "edu.mt", + "net.mt", + "org.mt", + "mu", + "com.mu", + "net.mu", + "org.mu", + "gov.mu", + "ac.mu", + "co.mu", + "or.mu", + "museum", + "academy.museum", + "agriculture.museum", + "air.museum", + "airguard.museum", + "alabama.museum", + "alaska.museum", + "amber.museum", + "ambulance.museum", + "american.museum", + "americana.museum", + "americanantiques.museum", + "americanart.museum", + "amsterdam.museum", + "and.museum", + "annefrank.museum", + "anthro.museum", + "anthropology.museum", + "antiques.museum", + "aquarium.museum", + "arboretum.museum", + "archaeological.museum", + "archaeology.museum", + "architecture.museum", + "art.museum", + "artanddesign.museum", + "artcenter.museum", + "artdeco.museum", + "arteducation.museum", + "artgallery.museum", + "arts.museum", + "artsandcrafts.museum", + "asmatart.museum", + "assassination.museum", + "assisi.museum", + "association.museum", + "astronomy.museum", + "atlanta.museum", + "austin.museum", + "australia.museum", + "automotive.museum", + "aviation.museum", + "axis.museum", + "badajoz.museum", + "baghdad.museum", + "bahn.museum", + "bale.museum", + "baltimore.museum", + "barcelona.museum", + "baseball.museum", + "basel.museum", + "baths.museum", + "bauern.museum", + "beauxarts.museum", + "beeldengeluid.museum", + "bellevue.museum", + "bergbau.museum", + "berkeley.museum", + "berlin.museum", + "bern.museum", + "bible.museum", + "bilbao.museum", + "bill.museum", + "birdart.museum", + "birthplace.museum", + "bonn.museum", + "boston.museum", + "botanical.museum", + "botanicalgarden.museum", + "botanicgarden.museum", + "botany.museum", + "brandywinevalley.museum", + "brasil.museum", + "bristol.museum", + "british.museum", + "britishcolumbia.museum", + "broadcast.museum", + "brunel.museum", + "brussel.museum", + "brussels.museum", + "bruxelles.museum", + "building.museum", + "burghof.museum", + "bus.museum", + "bushey.museum", + "cadaques.museum", + "california.museum", + "cambridge.museum", + "can.museum", + "canada.museum", + "capebreton.museum", + "carrier.museum", + "cartoonart.museum", + "casadelamoneda.museum", + "castle.museum", + "castres.museum", + "celtic.museum", + "center.museum", + "chattanooga.museum", + "cheltenham.museum", + "chesapeakebay.museum", + "chicago.museum", + "children.museum", + "childrens.museum", + "childrensgarden.museum", + "chiropractic.museum", + "chocolate.museum", + "christiansburg.museum", + "cincinnati.museum", + "cinema.museum", + "circus.museum", + "civilisation.museum", + "civilization.museum", + "civilwar.museum", + "clinton.museum", + "clock.museum", + "coal.museum", + "coastaldefence.museum", + "cody.museum", + "coldwar.museum", + "collection.museum", + "colonialwilliamsburg.museum", + "coloradoplateau.museum", + "columbia.museum", + "columbus.museum", + "communication.museum", + "communications.museum", + "community.museum", + "computer.museum", + "computerhistory.museum", + "xn--comunicaes-v6a2o.museum", + "contemporary.museum", + "contemporaryart.museum", + "convent.museum", + "copenhagen.museum", + "corporation.museum", + "xn--correios-e-telecomunicaes-ghc29a.museum", + "corvette.museum", + "costume.museum", + "countryestate.museum", + "county.museum", + "crafts.museum", + "cranbrook.museum", + "creation.museum", + "cultural.museum", + "culturalcenter.museum", + "culture.museum", + "cyber.museum", + "cymru.museum", + "dali.museum", + "dallas.museum", + "database.museum", + "ddr.museum", + "decorativearts.museum", + "delaware.museum", + "delmenhorst.museum", + "denmark.museum", + "depot.museum", + "design.museum", + "detroit.museum", + "dinosaur.museum", + "discovery.museum", + "dolls.museum", + "donostia.museum", + "durham.museum", + "eastafrica.museum", + "eastcoast.museum", + "education.museum", + "educational.museum", + "egyptian.museum", + "eisenbahn.museum", + "elburg.museum", + "elvendrell.museum", + "embroidery.museum", + "encyclopedic.museum", + "england.museum", + "entomology.museum", + "environment.museum", + "environmentalconservation.museum", + "epilepsy.museum", + "essex.museum", + "estate.museum", + "ethnology.museum", + "exeter.museum", + "exhibition.museum", + "family.museum", + "farm.museum", + "farmequipment.museum", + "farmers.museum", + "farmstead.museum", + "field.museum", + "figueres.museum", + "filatelia.museum", + "film.museum", + "fineart.museum", + "finearts.museum", + "finland.museum", + "flanders.museum", + "florida.museum", + "force.museum", + "fortmissoula.museum", + "fortworth.museum", + "foundation.museum", + "francaise.museum", + "frankfurt.museum", + "franziskaner.museum", + "freemasonry.museum", + "freiburg.museum", + "fribourg.museum", + "frog.museum", + "fundacio.museum", + "furniture.museum", + "gallery.museum", + "garden.museum", + "gateway.museum", + "geelvinck.museum", + "gemological.museum", + "geology.museum", + "georgia.museum", + "giessen.museum", + "glas.museum", + "glass.museum", + "gorge.museum", + "grandrapids.museum", + "graz.museum", + "guernsey.museum", + "halloffame.museum", + "hamburg.museum", + "handson.museum", + "harvestcelebration.museum", + "hawaii.museum", + "health.museum", + "heimatunduhren.museum", + "hellas.museum", + "helsinki.museum", + "hembygdsforbund.museum", + "heritage.museum", + "histoire.museum", + "historical.museum", + "historicalsociety.museum", + "historichouses.museum", + "historisch.museum", + "historisches.museum", + "history.museum", + "historyofscience.museum", + "horology.museum", + "house.museum", + "humanities.museum", + "illustration.museum", + "imageandsound.museum", + "indian.museum", + "indiana.museum", + "indianapolis.museum", + "indianmarket.museum", + "intelligence.museum", + "interactive.museum", + "iraq.museum", + "iron.museum", + "isleofman.museum", + "jamison.museum", + "jefferson.museum", + "jerusalem.museum", + "jewelry.museum", + "jewish.museum", + "jewishart.museum", + "jfk.museum", + "journalism.museum", + "judaica.museum", + "judygarland.museum", + "juedisches.museum", + "juif.museum", + "karate.museum", + "karikatur.museum", + "kids.museum", + "koebenhavn.museum", + "koeln.museum", + "kunst.museum", + "kunstsammlung.museum", + "kunstunddesign.museum", + "labor.museum", + "labour.museum", + "lajolla.museum", + "lancashire.museum", + "landes.museum", + "lans.museum", + "xn--lns-qla.museum", + "larsson.museum", + "lewismiller.museum", + "lincoln.museum", + "linz.museum", + "living.museum", + "livinghistory.museum", + "localhistory.museum", + "london.museum", + "losangeles.museum", + "louvre.museum", + "loyalist.museum", + "lucerne.museum", + "luxembourg.museum", + "luzern.museum", + "mad.museum", + "madrid.museum", + "mallorca.museum", + "manchester.museum", + "mansion.museum", + "mansions.museum", + "manx.museum", + "marburg.museum", + "maritime.museum", + "maritimo.museum", + "maryland.museum", + "marylhurst.museum", + "media.museum", + "medical.museum", + "medizinhistorisches.museum", + "meeres.museum", + "memorial.museum", + "mesaverde.museum", + "michigan.museum", + "midatlantic.museum", + "military.museum", + "mill.museum", + "miners.museum", + "mining.museum", + "minnesota.museum", + "missile.museum", + "missoula.museum", + "modern.museum", + "moma.museum", + "money.museum", + "monmouth.museum", + "monticello.museum", + "montreal.museum", + "moscow.museum", + "motorcycle.museum", + "muenchen.museum", + "muenster.museum", + "mulhouse.museum", + "muncie.museum", + "museet.museum", + "museumcenter.museum", + "museumvereniging.museum", + "music.museum", + "national.museum", + "nationalfirearms.museum", + "nationalheritage.museum", + "nativeamerican.museum", + "naturalhistory.museum", + "naturalhistorymuseum.museum", + "naturalsciences.museum", + "nature.museum", + "naturhistorisches.museum", + "natuurwetenschappen.museum", + "naumburg.museum", + "naval.museum", + "nebraska.museum", + "neues.museum", + "newhampshire.museum", + "newjersey.museum", + "newmexico.museum", + "newport.museum", + "newspaper.museum", + "newyork.museum", + "niepce.museum", + "norfolk.museum", + "north.museum", + "nrw.museum", + "nuernberg.museum", + "nuremberg.museum", + "nyc.museum", + "nyny.museum", + "oceanographic.museum", + "oceanographique.museum", + "omaha.museum", + "online.museum", + "ontario.museum", + "openair.museum", + "oregon.museum", + "oregontrail.museum", + "otago.museum", + "oxford.museum", + "pacific.museum", + "paderborn.museum", + "palace.museum", + "paleo.museum", + "palmsprings.museum", + "panama.museum", + "paris.museum", + "pasadena.museum", + "pharmacy.museum", + "philadelphia.museum", + "philadelphiaarea.museum", + "philately.museum", + "phoenix.museum", + "photography.museum", + "pilots.museum", + "pittsburgh.museum", + "planetarium.museum", + "plantation.museum", + "plants.museum", + "plaza.museum", + "portal.museum", + "portland.museum", + "portlligat.museum", + "posts-and-telecommunications.museum", + "preservation.museum", + "presidio.museum", + "press.museum", + "project.museum", + "public.museum", + "pubol.museum", + "quebec.museum", + "railroad.museum", + "railway.museum", + "research.museum", + "resistance.museum", + "riodejaneiro.museum", + "rochester.museum", + "rockart.museum", + "roma.museum", + "russia.museum", + "saintlouis.museum", + "salem.museum", + "salvadordali.museum", + "salzburg.museum", + "sandiego.museum", + "sanfrancisco.museum", + "santabarbara.museum", + "santacruz.museum", + "santafe.museum", + "saskatchewan.museum", + "satx.museum", + "savannahga.museum", + "schlesisches.museum", + "schoenbrunn.museum", + "schokoladen.museum", + "school.museum", + "schweiz.museum", + "science.museum", + "scienceandhistory.museum", + "scienceandindustry.museum", + "sciencecenter.museum", + "sciencecenters.museum", + "science-fiction.museum", + "sciencehistory.museum", + "sciences.museum", + "sciencesnaturelles.museum", + "scotland.museum", + "seaport.museum", + "settlement.museum", + "settlers.museum", + "shell.museum", + "sherbrooke.museum", + "sibenik.museum", + "silk.museum", + "ski.museum", + "skole.museum", + "society.museum", + "sologne.museum", + "soundandvision.museum", + "southcarolina.museum", + "southwest.museum", + "space.museum", + "spy.museum", + "square.museum", + "stadt.museum", + "stalbans.museum", + "starnberg.museum", + "state.museum", + "stateofdelaware.museum", + "station.museum", + "steam.museum", + "steiermark.museum", + "stjohn.museum", + "stockholm.museum", + "stpetersburg.museum", + "stuttgart.museum", + "suisse.museum", + "surgeonshall.museum", + "surrey.museum", + "svizzera.museum", + "sweden.museum", + "sydney.museum", + "tank.museum", + "tcm.museum", + "technology.museum", + "telekommunikation.museum", + "television.museum", + "texas.museum", + "textile.museum", + "theater.museum", + "time.museum", + "timekeeping.museum", + "topology.museum", + "torino.museum", + "touch.museum", + "town.museum", + "transport.museum", + "tree.museum", + "trolley.museum", + "trust.museum", + "trustee.museum", + "uhren.museum", + "ulm.museum", + "undersea.museum", + "university.museum", + "usa.museum", + "usantiques.museum", + "usarts.museum", + "uscountryestate.museum", + "usculture.museum", + "usdecorativearts.museum", + "usgarden.museum", + "ushistory.museum", + "ushuaia.museum", + "uslivinghistory.museum", + "utah.museum", + "uvic.museum", + "valley.museum", + "vantaa.museum", + "versailles.museum", + "viking.museum", + "village.museum", + "virginia.museum", + "virtual.museum", + "virtuel.museum", + "vlaanderen.museum", + "volkenkunde.museum", + "wales.museum", + "wallonie.museum", + "war.museum", + "washingtondc.museum", + "watchandclock.museum", + "watch-and-clock.museum", + "western.museum", + "westfalen.museum", + "whaling.museum", + "wildlife.museum", + "williamsburg.museum", + "windmill.museum", + "workshop.museum", + "york.museum", + "yorkshire.museum", + "yosemite.museum", + "youth.museum", + "zoological.museum", + "zoology.museum", + "xn--9dbhblg6di.museum", + "xn--h1aegh.museum", + "mv", + "aero.mv", + "biz.mv", + "com.mv", + "coop.mv", + "edu.mv", + "gov.mv", + "info.mv", + "int.mv", + "mil.mv", + "museum.mv", + "name.mv", + "net.mv", + "org.mv", + "pro.mv", + "mw", + "ac.mw", + "biz.mw", + "co.mw", + "com.mw", + "coop.mw", + "edu.mw", + "gov.mw", + "int.mw", + "museum.mw", + "net.mw", + "org.mw", + "mx", + "com.mx", + "org.mx", + "gob.mx", + "edu.mx", + "net.mx", + "my", + "com.my", + "net.my", + "org.my", + "gov.my", + "edu.my", + "mil.my", + "name.my", + "*.mz", + "!teledata.mz", + "na", + "info.na", + "pro.na", + "name.na", + "school.na", + "or.na", + "dr.na", + "us.na", + "mx.na", + "ca.na", + "in.na", + "cc.na", + "tv.na", + "ws.na", + "mobi.na", + "co.na", + "com.na", + "org.na", + "name", + "nc", + "asso.nc", + "ne", + "net", + "nf", + "com.nf", + "net.nf", + "per.nf", + "rec.nf", + "web.nf", + "arts.nf", + "firm.nf", + "info.nf", + "other.nf", + "store.nf", + "ng", + "com.ng", + "edu.ng", + "gov.ng", + "i.ng", + "mil.ng", + "mobi.ng", + "name.ng", + "net.ng", + "org.ng", + "sch.ng", + "com.ni", + "gob.ni", + "edu.ni", + "org.ni", + "nom.ni", + "net.ni", + "mil.ni", + "co.ni", + "biz.ni", + "web.ni", + "int.ni", + "ac.ni", + "in.ni", + "info.ni", + "nl", + "bv.nl", + "no", + "fhs.no", + "vgs.no", + "fylkesbibl.no", + "folkebibl.no", + "museum.no", + "idrett.no", + "priv.no", + "mil.no", + "stat.no", + "dep.no", + "kommune.no", + "herad.no", + "aa.no", + "ah.no", + "bu.no", + "fm.no", + "hl.no", + "hm.no", + "jan-mayen.no", + "mr.no", + "nl.no", + "nt.no", + "of.no", + "ol.no", + "oslo.no", + "rl.no", + "sf.no", + "st.no", + "svalbard.no", + "tm.no", + "tr.no", + "va.no", + "vf.no", + "gs.aa.no", + "gs.ah.no", + "gs.bu.no", + "gs.fm.no", + "gs.hl.no", + "gs.hm.no", + "gs.jan-mayen.no", + "gs.mr.no", + "gs.nl.no", + "gs.nt.no", + "gs.of.no", + "gs.ol.no", + "gs.oslo.no", + "gs.rl.no", + "gs.sf.no", + "gs.st.no", + "gs.svalbard.no", + "gs.tm.no", + "gs.tr.no", + "gs.va.no", + "gs.vf.no", + "akrehamn.no", + "xn--krehamn-dxa.no", + "algard.no", + "xn--lgrd-poac.no", + "arna.no", + "brumunddal.no", + "bryne.no", + "bronnoysund.no", + "xn--brnnysund-m8ac.no", + "drobak.no", + "xn--drbak-wua.no", + "egersund.no", + "fetsund.no", + "floro.no", + "xn--flor-jra.no", + "fredrikstad.no", + "hokksund.no", + "honefoss.no", + "xn--hnefoss-q1a.no", + "jessheim.no", + "jorpeland.no", + "xn--jrpeland-54a.no", + "kirkenes.no", + "kopervik.no", + "krokstadelva.no", + "langevag.no", + "xn--langevg-jxa.no", + "leirvik.no", + "mjondalen.no", + "xn--mjndalen-64a.no", + "mo-i-rana.no", + "mosjoen.no", + "xn--mosjen-eya.no", + "nesoddtangen.no", + "orkanger.no", + "osoyro.no", + "xn--osyro-wua.no", + "raholt.no", + "xn--rholt-mra.no", + "sandnessjoen.no", + "xn--sandnessjen-ogb.no", + "skedsmokorset.no", + "slattum.no", + "spjelkavik.no", + "stathelle.no", + "stavern.no", + "stjordalshalsen.no", + "xn--stjrdalshalsen-sqb.no", + "tananger.no", + "tranby.no", + "vossevangen.no", + "afjord.no", + "xn--fjord-lra.no", + "agdenes.no", + "al.no", + "xn--l-1fa.no", + "alesund.no", + "xn--lesund-hua.no", + "alstahaug.no", + "alta.no", + "xn--lt-liac.no", + "alaheadju.no", + "xn--laheadju-7ya.no", + "alvdal.no", + "amli.no", + "xn--mli-tla.no", + "amot.no", + "xn--mot-tla.no", + "andebu.no", + "andoy.no", + "xn--andy-ira.no", + "andasuolo.no", + "ardal.no", + "xn--rdal-poa.no", + "aremark.no", + "arendal.no", + "xn--s-1fa.no", + "aseral.no", + "xn--seral-lra.no", + "asker.no", + "askim.no", + "askvoll.no", + "askoy.no", + "xn--asky-ira.no", + "asnes.no", + "xn--snes-poa.no", + "audnedaln.no", + "aukra.no", + "aure.no", + "aurland.no", + "aurskog-holand.no", + "xn--aurskog-hland-jnb.no", + "austevoll.no", + "austrheim.no", + "averoy.no", + "xn--avery-yua.no", + "balestrand.no", + "ballangen.no", + "balat.no", + "xn--blt-elab.no", + "balsfjord.no", + "bahccavuotna.no", + "xn--bhccavuotna-k7a.no", + "bamble.no", + "bardu.no", + "beardu.no", + "beiarn.no", + "bajddar.no", + "xn--bjddar-pta.no", + "baidar.no", + "xn--bidr-5nac.no", + "berg.no", + "bergen.no", + "berlevag.no", + "xn--berlevg-jxa.no", + "bearalvahki.no", + "xn--bearalvhki-y4a.no", + "bindal.no", + "birkenes.no", + "bjarkoy.no", + "xn--bjarky-fya.no", + "bjerkreim.no", + "bjugn.no", + "bodo.no", + "xn--bod-2na.no", + "badaddja.no", + "xn--bdddj-mrabd.no", + "budejju.no", + "bokn.no", + "bremanger.no", + "bronnoy.no", + "xn--brnny-wuac.no", + "bygland.no", + "bykle.no", + "barum.no", + "xn--brum-voa.no", + "bo.telemark.no", + "xn--b-5ga.telemark.no", + "bo.nordland.no", + "xn--b-5ga.nordland.no", + "bievat.no", + "xn--bievt-0qa.no", + "bomlo.no", + "xn--bmlo-gra.no", + "batsfjord.no", + "xn--btsfjord-9za.no", + "bahcavuotna.no", + "xn--bhcavuotna-s4a.no", + "dovre.no", + "drammen.no", + "drangedal.no", + "dyroy.no", + "xn--dyry-ira.no", + "donna.no", + "xn--dnna-gra.no", + "eid.no", + "eidfjord.no", + "eidsberg.no", + "eidskog.no", + "eidsvoll.no", + "eigersund.no", + "elverum.no", + "enebakk.no", + "engerdal.no", + "etne.no", + "etnedal.no", + "evenes.no", + "evenassi.no", + "xn--eveni-0qa01ga.no", + "evje-og-hornnes.no", + "farsund.no", + "fauske.no", + "fuossko.no", + "fuoisku.no", + "fedje.no", + "fet.no", + "finnoy.no", + "xn--finny-yua.no", + "fitjar.no", + "fjaler.no", + "fjell.no", + "flakstad.no", + "flatanger.no", + "flekkefjord.no", + "flesberg.no", + "flora.no", + "fla.no", + "xn--fl-zia.no", + "folldal.no", + "forsand.no", + "fosnes.no", + "frei.no", + "frogn.no", + "froland.no", + "frosta.no", + "frana.no", + "xn--frna-woa.no", + "froya.no", + "xn--frya-hra.no", + "fusa.no", + "fyresdal.no", + "forde.no", + "xn--frde-gra.no", + "gamvik.no", + "gangaviika.no", + "xn--ggaviika-8ya47h.no", + "gaular.no", + "gausdal.no", + "gildeskal.no", + "xn--gildeskl-g0a.no", + "giske.no", + "gjemnes.no", + "gjerdrum.no", + "gjerstad.no", + "gjesdal.no", + "gjovik.no", + "xn--gjvik-wua.no", + "gloppen.no", + "gol.no", + "gran.no", + "grane.no", + "granvin.no", + "gratangen.no", + "grimstad.no", + "grong.no", + "kraanghke.no", + "xn--kranghke-b0a.no", + "grue.no", + "gulen.no", + "hadsel.no", + "halden.no", + "halsa.no", + "hamar.no", + "hamaroy.no", + "habmer.no", + "xn--hbmer-xqa.no", + "hapmir.no", + "xn--hpmir-xqa.no", + "hammerfest.no", + "hammarfeasta.no", + "xn--hmmrfeasta-s4ac.no", + "haram.no", + "hareid.no", + "harstad.no", + "hasvik.no", + "aknoluokta.no", + "xn--koluokta-7ya57h.no", + "hattfjelldal.no", + "aarborte.no", + "haugesund.no", + "hemne.no", + "hemnes.no", + "hemsedal.no", + "heroy.more-og-romsdal.no", + "xn--hery-ira.xn--mre-og-romsdal-qqb.no", + "heroy.nordland.no", + "xn--hery-ira.nordland.no", + "hitra.no", + "hjartdal.no", + "hjelmeland.no", + "hobol.no", + "xn--hobl-ira.no", + "hof.no", + "hol.no", + "hole.no", + "holmestrand.no", + "holtalen.no", + "xn--holtlen-hxa.no", + "hornindal.no", + "horten.no", + "hurdal.no", + "hurum.no", + "hvaler.no", + "hyllestad.no", + "hagebostad.no", + "xn--hgebostad-g3a.no", + "hoyanger.no", + "xn--hyanger-q1a.no", + "hoylandet.no", + "xn--hylandet-54a.no", + "ha.no", + "xn--h-2fa.no", + "ibestad.no", + "inderoy.no", + "xn--indery-fya.no", + "iveland.no", + "jevnaker.no", + "jondal.no", + "jolster.no", + "xn--jlster-bya.no", + "karasjok.no", + "karasjohka.no", + "xn--krjohka-hwab49j.no", + "karlsoy.no", + "galsa.no", + "xn--gls-elac.no", + "karmoy.no", + "xn--karmy-yua.no", + "kautokeino.no", + "guovdageaidnu.no", + "klepp.no", + "klabu.no", + "xn--klbu-woa.no", + "kongsberg.no", + "kongsvinger.no", + "kragero.no", + "xn--krager-gya.no", + "kristiansand.no", + "kristiansund.no", + "krodsherad.no", + "xn--krdsherad-m8a.no", + "kvalsund.no", + "rahkkeravju.no", + "xn--rhkkervju-01af.no", + "kvam.no", + "kvinesdal.no", + "kvinnherad.no", + "kviteseid.no", + "kvitsoy.no", + "xn--kvitsy-fya.no", + "kvafjord.no", + "xn--kvfjord-nxa.no", + "giehtavuoatna.no", + "kvanangen.no", + "xn--kvnangen-k0a.no", + "navuotna.no", + "xn--nvuotna-hwa.no", + "kafjord.no", + "xn--kfjord-iua.no", + "gaivuotna.no", + "xn--givuotna-8ya.no", + "larvik.no", + "lavangen.no", + "lavagis.no", + "loabat.no", + "xn--loabt-0qa.no", + "lebesby.no", + "davvesiida.no", + "leikanger.no", + "leirfjord.no", + "leka.no", + "leksvik.no", + "lenvik.no", + "leangaviika.no", + "xn--leagaviika-52b.no", + "lesja.no", + "levanger.no", + "lier.no", + "lierne.no", + "lillehammer.no", + "lillesand.no", + "lindesnes.no", + "lindas.no", + "xn--linds-pra.no", + "lom.no", + "loppa.no", + "lahppi.no", + "xn--lhppi-xqa.no", + "lund.no", + "lunner.no", + "luroy.no", + "xn--lury-ira.no", + "luster.no", + "lyngdal.no", + "lyngen.no", + "ivgu.no", + "lardal.no", + "lerdal.no", + "xn--lrdal-sra.no", + "lodingen.no", + "xn--ldingen-q1a.no", + "lorenskog.no", + "xn--lrenskog-54a.no", + "loten.no", + "xn--lten-gra.no", + "malvik.no", + "masoy.no", + "xn--msy-ula0h.no", + "muosat.no", + "xn--muost-0qa.no", + "mandal.no", + "marker.no", + "marnardal.no", + "masfjorden.no", + "meland.no", + "meldal.no", + "melhus.no", + "meloy.no", + "xn--mely-ira.no", + "meraker.no", + "xn--merker-kua.no", + "moareke.no", + "xn--moreke-jua.no", + "midsund.no", + "midtre-gauldal.no", + "modalen.no", + "modum.no", + "molde.no", + "moskenes.no", + "moss.no", + "mosvik.no", + "malselv.no", + "xn--mlselv-iua.no", + "malatvuopmi.no", + "xn--mlatvuopmi-s4a.no", + "namdalseid.no", + "aejrie.no", + "namsos.no", + "namsskogan.no", + "naamesjevuemie.no", + "xn--nmesjevuemie-tcba.no", + "laakesvuemie.no", + "nannestad.no", + "narvik.no", + "narviika.no", + "naustdal.no", + "nedre-eiker.no", + "nes.akershus.no", + "nes.buskerud.no", + "nesna.no", + "nesodden.no", + "nesseby.no", + "unjarga.no", + "xn--unjrga-rta.no", + "nesset.no", + "nissedal.no", + "nittedal.no", + "nord-aurdal.no", + "nord-fron.no", + "nord-odal.no", + "norddal.no", + "nordkapp.no", + "davvenjarga.no", + "xn--davvenjrga-y4a.no", + "nordre-land.no", + "nordreisa.no", + "raisa.no", + "xn--risa-5na.no", + "nore-og-uvdal.no", + "notodden.no", + "naroy.no", + "xn--nry-yla5g.no", + "notteroy.no", + "xn--nttery-byae.no", + "odda.no", + "oksnes.no", + "xn--ksnes-uua.no", + "oppdal.no", + "oppegard.no", + "xn--oppegrd-ixa.no", + "orkdal.no", + "orland.no", + "xn--rland-uua.no", + "orskog.no", + "xn--rskog-uua.no", + "orsta.no", + "xn--rsta-fra.no", + "os.hedmark.no", + "os.hordaland.no", + "osen.no", + "osteroy.no", + "xn--ostery-fya.no", + "ostre-toten.no", + "xn--stre-toten-zcb.no", + "overhalla.no", + "ovre-eiker.no", + "xn--vre-eiker-k8a.no", + "oyer.no", + "xn--yer-zna.no", + "oygarden.no", + "xn--ygarden-p1a.no", + "oystre-slidre.no", + "xn--ystre-slidre-ujb.no", + "porsanger.no", + "porsangu.no", + "xn--porsgu-sta26f.no", + "porsgrunn.no", + "radoy.no", + "xn--rady-ira.no", + "rakkestad.no", + "rana.no", + "ruovat.no", + "randaberg.no", + "rauma.no", + "rendalen.no", + "rennebu.no", + "rennesoy.no", + "xn--rennesy-v1a.no", + "rindal.no", + "ringebu.no", + "ringerike.no", + "ringsaker.no", + "rissa.no", + "risor.no", + "xn--risr-ira.no", + "roan.no", + "rollag.no", + "rygge.no", + "ralingen.no", + "xn--rlingen-mxa.no", + "rodoy.no", + "xn--rdy-0nab.no", + "romskog.no", + "xn--rmskog-bya.no", + "roros.no", + "xn--rros-gra.no", + "rost.no", + "xn--rst-0na.no", + "royken.no", + "xn--ryken-vua.no", + "royrvik.no", + "xn--ryrvik-bya.no", + "rade.no", + "xn--rde-ula.no", + "salangen.no", + "siellak.no", + "saltdal.no", + "salat.no", + "xn--slt-elab.no", + "xn--slat-5na.no", + "samnanger.no", + "sande.more-og-romsdal.no", + "sande.xn--mre-og-romsdal-qqb.no", + "sande.vestfold.no", + "sandefjord.no", + "sandnes.no", + "sandoy.no", + "xn--sandy-yua.no", + "sarpsborg.no", + "sauda.no", + "sauherad.no", + "sel.no", + "selbu.no", + "selje.no", + "seljord.no", + "sigdal.no", + "siljan.no", + "sirdal.no", + "skaun.no", + "skedsmo.no", + "ski.no", + "skien.no", + "skiptvet.no", + "skjervoy.no", + "xn--skjervy-v1a.no", + "skierva.no", + "xn--skierv-uta.no", + "skjak.no", + "xn--skjk-soa.no", + "skodje.no", + "skanland.no", + "xn--sknland-fxa.no", + "skanit.no", + "xn--sknit-yqa.no", + "smola.no", + "xn--smla-hra.no", + "snillfjord.no", + "snasa.no", + "xn--snsa-roa.no", + "snoasa.no", + "snaase.no", + "xn--snase-nra.no", + "sogndal.no", + "sokndal.no", + "sola.no", + "solund.no", + "songdalen.no", + "sortland.no", + "spydeberg.no", + "stange.no", + "stavanger.no", + "steigen.no", + "steinkjer.no", + "stjordal.no", + "xn--stjrdal-s1a.no", + "stokke.no", + "stor-elvdal.no", + "stord.no", + "stordal.no", + "storfjord.no", + "omasvuotna.no", + "strand.no", + "stranda.no", + "stryn.no", + "sula.no", + "suldal.no", + "sund.no", + "sunndal.no", + "surnadal.no", + "sveio.no", + "svelvik.no", + "sykkylven.no", + "sogne.no", + "xn--sgne-gra.no", + "somna.no", + "xn--smna-gra.no", + "sondre-land.no", + "xn--sndre-land-0cb.no", + "sor-aurdal.no", + "xn--sr-aurdal-l8a.no", + "sor-fron.no", + "xn--sr-fron-q1a.no", + "sor-odal.no", + "xn--sr-odal-q1a.no", + "sor-varanger.no", + "xn--sr-varanger-ggb.no", + "matta-varjjat.no", + "xn--mtta-vrjjat-k7af.no", + "sorfold.no", + "xn--srfold-bya.no", + "sorreisa.no", + "xn--srreisa-q1a.no", + "sorum.no", + "xn--srum-gra.no", + "tana.no", + "deatnu.no", + "time.no", + "tingvoll.no", + "tinn.no", + "tjeldsund.no", + "dielddanuorri.no", + "tjome.no", + "xn--tjme-hra.no", + "tokke.no", + "tolga.no", + "torsken.no", + "tranoy.no", + "xn--trany-yua.no", + "tromso.no", + "xn--troms-zua.no", + "tromsa.no", + "romsa.no", + "trondheim.no", + "troandin.no", + "trysil.no", + "trana.no", + "xn--trna-woa.no", + "trogstad.no", + "xn--trgstad-r1a.no", + "tvedestrand.no", + "tydal.no", + "tynset.no", + "tysfjord.no", + "divtasvuodna.no", + "divttasvuotna.no", + "tysnes.no", + "tysvar.no", + "xn--tysvr-vra.no", + "tonsberg.no", + "xn--tnsberg-q1a.no", + "ullensaker.no", + "ullensvang.no", + "ulvik.no", + "utsira.no", + "vadso.no", + "xn--vads-jra.no", + "cahcesuolo.no", + "xn--hcesuolo-7ya35b.no", + "vaksdal.no", + "valle.no", + "vang.no", + "vanylven.no", + "vardo.no", + "xn--vard-jra.no", + "varggat.no", + "xn--vrggt-xqad.no", + "vefsn.no", + "vaapste.no", + "vega.no", + "vegarshei.no", + "xn--vegrshei-c0a.no", + "vennesla.no", + "verdal.no", + "verran.no", + "vestby.no", + "vestnes.no", + "vestre-slidre.no", + "vestre-toten.no", + "vestvagoy.no", + "xn--vestvgy-ixa6o.no", + "vevelstad.no", + "vik.no", + "vikna.no", + "vindafjord.no", + "volda.no", + "voss.no", + "varoy.no", + "xn--vry-yla5g.no", + "vagan.no", + "xn--vgan-qoa.no", + "voagat.no", + "vagsoy.no", + "xn--vgsy-qoa0j.no", + "vaga.no", + "xn--vg-yiab.no", + "valer.ostfold.no", + "xn--vler-qoa.xn--stfold-9xa.no", + "valer.hedmark.no", + "xn--vler-qoa.hedmark.no", + "*.np", + "nr", + "biz.nr", + "info.nr", + "gov.nr", + "edu.nr", + "org.nr", + "net.nr", + "com.nr", + "nu", + "nz", + "ac.nz", + "co.nz", + "cri.nz", + "geek.nz", + "gen.nz", + "govt.nz", + "health.nz", + "iwi.nz", + "kiwi.nz", + "maori.nz", + "mil.nz", + "xn--mori-qsa.nz", + "net.nz", + "org.nz", + "parliament.nz", + "school.nz", + "om", + "co.om", + "com.om", + "edu.om", + "gov.om", + "med.om", + "museum.om", + "net.om", + "org.om", + "pro.om", + "org", + "pa", + "ac.pa", + "gob.pa", + "com.pa", + "org.pa", + "sld.pa", + "edu.pa", + "net.pa", + "ing.pa", + "abo.pa", + "med.pa", + "nom.pa", + "pe", + "edu.pe", + "gob.pe", + "nom.pe", + "mil.pe", + "org.pe", + "com.pe", + "net.pe", + "pf", + "com.pf", + "org.pf", + "edu.pf", + "*.pg", + "ph", + "com.ph", + "net.ph", + "org.ph", + "gov.ph", + "edu.ph", + "ngo.ph", + "mil.ph", + "i.ph", + "pk", + "com.pk", + "net.pk", + "edu.pk", + "org.pk", + "fam.pk", + "biz.pk", + "web.pk", + "gov.pk", + "gob.pk", + "gok.pk", + "gon.pk", + "gop.pk", + "gos.pk", + "info.pk", + "pl", + "com.pl", + "net.pl", + "org.pl", + "aid.pl", + "agro.pl", + "atm.pl", + "auto.pl", + "biz.pl", + "edu.pl", + "gmina.pl", + "gsm.pl", + "info.pl", + "mail.pl", + "miasta.pl", + "media.pl", + "mil.pl", + "nieruchomosci.pl", + "nom.pl", + "pc.pl", + "powiat.pl", + "priv.pl", + "realestate.pl", + "rel.pl", + "sex.pl", + "shop.pl", + "sklep.pl", + "sos.pl", + "szkola.pl", + "targi.pl", + "tm.pl", + "tourism.pl", + "travel.pl", + "turystyka.pl", + "gov.pl", + "ap.gov.pl", + "ic.gov.pl", + "is.gov.pl", + "us.gov.pl", + "kmpsp.gov.pl", + "kppsp.gov.pl", + "kwpsp.gov.pl", + "psp.gov.pl", + "wskr.gov.pl", + "kwp.gov.pl", + "mw.gov.pl", + "ug.gov.pl", + "um.gov.pl", + "umig.gov.pl", + "ugim.gov.pl", + "upow.gov.pl", + "uw.gov.pl", + "starostwo.gov.pl", + "pa.gov.pl", + "po.gov.pl", + "psse.gov.pl", + "pup.gov.pl", + "rzgw.gov.pl", + "sa.gov.pl", + "so.gov.pl", + "sr.gov.pl", + "wsa.gov.pl", + "sko.gov.pl", + "uzs.gov.pl", + "wiih.gov.pl", + "winb.gov.pl", + "pinb.gov.pl", + "wios.gov.pl", + "witd.gov.pl", + "wzmiuw.gov.pl", + "piw.gov.pl", + "wiw.gov.pl", + "griw.gov.pl", + "wif.gov.pl", + "oum.gov.pl", + "sdn.gov.pl", + "zp.gov.pl", + "uppo.gov.pl", + "mup.gov.pl", + "wuoz.gov.pl", + "konsulat.gov.pl", + "oirm.gov.pl", + "augustow.pl", + "babia-gora.pl", + "bedzin.pl", + "beskidy.pl", + "bialowieza.pl", + "bialystok.pl", + "bielawa.pl", + "bieszczady.pl", + "boleslawiec.pl", + "bydgoszcz.pl", + "bytom.pl", + "cieszyn.pl", + "czeladz.pl", + "czest.pl", + "dlugoleka.pl", + "elblag.pl", + "elk.pl", + "glogow.pl", + "gniezno.pl", + "gorlice.pl", + "grajewo.pl", + "ilawa.pl", + "jaworzno.pl", + "jelenia-gora.pl", + "jgora.pl", + "kalisz.pl", + "kazimierz-dolny.pl", + "karpacz.pl", + "kartuzy.pl", + "kaszuby.pl", + "katowice.pl", + "kepno.pl", + "ketrzyn.pl", + "klodzko.pl", + "kobierzyce.pl", + "kolobrzeg.pl", + "konin.pl", + "konskowola.pl", + "kutno.pl", + "lapy.pl", + "lebork.pl", + "legnica.pl", + "lezajsk.pl", + "limanowa.pl", + "lomza.pl", + "lowicz.pl", + "lubin.pl", + "lukow.pl", + "malbork.pl", + "malopolska.pl", + "mazowsze.pl", + "mazury.pl", + "mielec.pl", + "mielno.pl", + "mragowo.pl", + "naklo.pl", + "nowaruda.pl", + "nysa.pl", + "olawa.pl", + "olecko.pl", + "olkusz.pl", + "olsztyn.pl", + "opoczno.pl", + "opole.pl", + "ostroda.pl", + "ostroleka.pl", + "ostrowiec.pl", + "ostrowwlkp.pl", + "pila.pl", + "pisz.pl", + "podhale.pl", + "podlasie.pl", + "polkowice.pl", + "pomorze.pl", + "pomorskie.pl", + "prochowice.pl", + "pruszkow.pl", + "przeworsk.pl", + "pulawy.pl", + "radom.pl", + "rawa-maz.pl", + "rybnik.pl", + "rzeszow.pl", + "sanok.pl", + "sejny.pl", + "slask.pl", + "slupsk.pl", + "sosnowiec.pl", + "stalowa-wola.pl", + "skoczow.pl", + "starachowice.pl", + "stargard.pl", + "suwalki.pl", + "swidnica.pl", + "swiebodzin.pl", + "swinoujscie.pl", + "szczecin.pl", + "szczytno.pl", + "tarnobrzeg.pl", + "tgory.pl", + "turek.pl", + "tychy.pl", + "ustka.pl", + "walbrzych.pl", + "warmia.pl", + "warszawa.pl", + "waw.pl", + "wegrow.pl", + "wielun.pl", + "wlocl.pl", + "wloclawek.pl", + "wodzislaw.pl", + "wolomin.pl", + "wroclaw.pl", + "zachpomor.pl", + "zagan.pl", + "zarow.pl", + "zgora.pl", + "zgorzelec.pl", + "pm", + "pn", + "gov.pn", + "co.pn", + "org.pn", + "edu.pn", + "net.pn", + "post", + "pr", + "com.pr", + "net.pr", + "org.pr", + "gov.pr", + "edu.pr", + "isla.pr", + "pro.pr", + "biz.pr", + "info.pr", + "name.pr", + "est.pr", + "prof.pr", + "ac.pr", + "pro", + "aaa.pro", + "aca.pro", + "acct.pro", + "avocat.pro", + "bar.pro", + "cpa.pro", + "eng.pro", + "jur.pro", + "law.pro", + "med.pro", + "recht.pro", + "ps", + "edu.ps", + "gov.ps", + "sec.ps", + "plo.ps", + "com.ps", + "org.ps", + "net.ps", + "pt", + "net.pt", + "gov.pt", + "org.pt", + "edu.pt", + "int.pt", + "publ.pt", + "com.pt", + "nome.pt", + "pw", + "co.pw", + "ne.pw", + "or.pw", + "ed.pw", + "go.pw", + "belau.pw", + "py", + "com.py", + "coop.py", + "edu.py", + "gov.py", + "mil.py", + "net.py", + "org.py", + "qa", + "com.qa", + "edu.qa", + "gov.qa", + "mil.qa", + "name.qa", + "net.qa", + "org.qa", + "sch.qa", + "re", + "asso.re", + "com.re", + "nom.re", + "ro", + "arts.ro", + "com.ro", + "firm.ro", + "info.ro", + "nom.ro", + "nt.ro", + "org.ro", + "rec.ro", + "store.ro", + "tm.ro", + "www.ro", + "rs", + "ac.rs", + "co.rs", + "edu.rs", + "gov.rs", + "in.rs", + "org.rs", + "ru", + "ac.ru", + "com.ru", + "edu.ru", + "int.ru", + "net.ru", + "org.ru", + "pp.ru", + "adygeya.ru", + "altai.ru", + "amur.ru", + "arkhangelsk.ru", + "astrakhan.ru", + "bashkiria.ru", + "belgorod.ru", + "bir.ru", + "bryansk.ru", + "buryatia.ru", + "cbg.ru", + "chel.ru", + "chelyabinsk.ru", + "chita.ru", + "chukotka.ru", + "chuvashia.ru", + "dagestan.ru", + "dudinka.ru", + "e-burg.ru", + "grozny.ru", + "irkutsk.ru", + "ivanovo.ru", + "izhevsk.ru", + "jar.ru", + "joshkar-ola.ru", + "kalmykia.ru", + "kaluga.ru", + "kamchatka.ru", + "karelia.ru", + "kazan.ru", + "kchr.ru", + "kemerovo.ru", + "khabarovsk.ru", + "khakassia.ru", + "khv.ru", + "kirov.ru", + "koenig.ru", + "komi.ru", + "kostroma.ru", + "krasnoyarsk.ru", + "kuban.ru", + "kurgan.ru", + "kursk.ru", + "lipetsk.ru", + "magadan.ru", + "mari.ru", + "mari-el.ru", + "marine.ru", + "mordovia.ru", + "msk.ru", + "murmansk.ru", + "nalchik.ru", + "nnov.ru", + "nov.ru", + "novosibirsk.ru", + "nsk.ru", + "omsk.ru", + "orenburg.ru", + "oryol.ru", + "palana.ru", + "penza.ru", + "perm.ru", + "ptz.ru", + "rnd.ru", + "ryazan.ru", + "sakhalin.ru", + "samara.ru", + "saratov.ru", + "simbirsk.ru", + "smolensk.ru", + "spb.ru", + "stavropol.ru", + "stv.ru", + "surgut.ru", + "tambov.ru", + "tatarstan.ru", + "tom.ru", + "tomsk.ru", + "tsaritsyn.ru", + "tsk.ru", + "tula.ru", + "tuva.ru", + "tver.ru", + "tyumen.ru", + "udm.ru", + "udmurtia.ru", + "ulan-ude.ru", + "vladikavkaz.ru", + "vladimir.ru", + "vladivostok.ru", + "volgograd.ru", + "vologda.ru", + "voronezh.ru", + "vrn.ru", + "vyatka.ru", + "yakutia.ru", + "yamal.ru", + "yaroslavl.ru", + "yekaterinburg.ru", + "yuzhno-sakhalinsk.ru", + "amursk.ru", + "baikal.ru", + "cmw.ru", + "fareast.ru", + "jamal.ru", + "kms.ru", + "k-uralsk.ru", + "kustanai.ru", + "kuzbass.ru", + "mytis.ru", + "nakhodka.ru", + "nkz.ru", + "norilsk.ru", + "oskol.ru", + "pyatigorsk.ru", + "rubtsovsk.ru", + "snz.ru", + "syzran.ru", + "vdonsk.ru", + "zgrad.ru", + "gov.ru", + "mil.ru", + "test.ru", + "rw", + "gov.rw", + "net.rw", + "edu.rw", + "ac.rw", + "com.rw", + "co.rw", + "int.rw", + "mil.rw", + "gouv.rw", + "sa", + "com.sa", + "net.sa", + "org.sa", + "gov.sa", + "med.sa", + "pub.sa", + "edu.sa", + "sch.sa", + "sb", + "com.sb", + "edu.sb", + "gov.sb", + "net.sb", + "org.sb", + "sc", + "com.sc", + "gov.sc", + "net.sc", + "org.sc", + "edu.sc", + "sd", + "com.sd", + "net.sd", + "org.sd", + "edu.sd", + "med.sd", + "tv.sd", + "gov.sd", + "info.sd", + "se", + "a.se", + "ac.se", + "b.se", + "bd.se", + "brand.se", + "c.se", + "d.se", + "e.se", + "f.se", + "fh.se", + "fhsk.se", + "fhv.se", + "g.se", + "h.se", + "i.se", + "k.se", + "komforb.se", + "kommunalforbund.se", + "komvux.se", + "l.se", + "lanbib.se", + "m.se", + "n.se", + "naturbruksgymn.se", + "o.se", + "org.se", + "p.se", + "parti.se", + "pp.se", + "press.se", + "r.se", + "s.se", + "t.se", + "tm.se", + "u.se", + "w.se", + "x.se", + "y.se", + "z.se", + "sg", + "com.sg", + "net.sg", + "org.sg", + "gov.sg", + "edu.sg", + "per.sg", + "sh", + "com.sh", + "net.sh", + "gov.sh", + "org.sh", + "mil.sh", + "si", + "sj", + "sk", + "sl", + "com.sl", + "net.sl", + "edu.sl", + "gov.sl", + "org.sl", + "sm", + "sn", + "art.sn", + "com.sn", + "edu.sn", + "gouv.sn", + "org.sn", + "perso.sn", + "univ.sn", + "so", + "com.so", + "net.so", + "org.so", + "sr", + "st", + "co.st", + "com.st", + "consulado.st", + "edu.st", + "embaixada.st", + "gov.st", + "mil.st", + "net.st", + "org.st", + "principe.st", + "saotome.st", + "store.st", + "su", + "adygeya.su", + "arkhangelsk.su", + "balashov.su", + "bashkiria.su", + "bryansk.su", + "dagestan.su", + "grozny.su", + "ivanovo.su", + "kalmykia.su", + "kaluga.su", + "karelia.su", + "khakassia.su", + "krasnodar.su", + "kurgan.su", + "lenug.su", + "mordovia.su", + "msk.su", + "murmansk.su", + "nalchik.su", + "nov.su", + "obninsk.su", + "penza.su", + "pokrovsk.su", + "sochi.su", + "spb.su", + "togliatti.su", + "troitsk.su", + "tula.su", + "tuva.su", + "vladikavkaz.su", + "vladimir.su", + "vologda.su", + "sv", + "com.sv", + "edu.sv", + "gob.sv", + "org.sv", + "red.sv", + "sx", + "gov.sx", + "sy", + "edu.sy", + "gov.sy", + "net.sy", + "mil.sy", + "com.sy", + "org.sy", + "sz", + "co.sz", + "ac.sz", + "org.sz", + "tc", + "td", + "tel", + "tf", + "tg", + "th", + "ac.th", + "co.th", + "go.th", + "in.th", + "mi.th", + "net.th", + "or.th", + "tj", + "ac.tj", + "biz.tj", + "co.tj", + "com.tj", + "edu.tj", + "go.tj", + "gov.tj", + "int.tj", + "mil.tj", + "name.tj", + "net.tj", + "nic.tj", + "org.tj", + "test.tj", + "web.tj", + "tk", + "tl", + "gov.tl", + "tm", + "com.tm", + "co.tm", + "org.tm", + "net.tm", + "nom.tm", + "gov.tm", + "mil.tm", + "edu.tm", + "tn", + "com.tn", + "ens.tn", + "fin.tn", + "gov.tn", + "ind.tn", + "intl.tn", + "nat.tn", + "net.tn", + "org.tn", + "info.tn", + "perso.tn", + "tourism.tn", + "edunet.tn", + "rnrt.tn", + "rns.tn", + "rnu.tn", + "mincom.tn", + "agrinet.tn", + "defense.tn", + "turen.tn", + "to", + "com.to", + "gov.to", + "net.to", + "org.to", + "edu.to", + "mil.to", + "tr", + "com.tr", + "info.tr", + "biz.tr", + "net.tr", + "org.tr", + "web.tr", + "gen.tr", + "tv.tr", + "av.tr", + "dr.tr", + "bbs.tr", + "name.tr", + "tel.tr", + "gov.tr", + "bel.tr", + "pol.tr", + "mil.tr", + "k12.tr", + "edu.tr", + "kep.tr", + "nc.tr", + "gov.nc.tr", + "travel", + "tt", + "co.tt", + "com.tt", + "org.tt", + "net.tt", + "biz.tt", + "info.tt", + "pro.tt", + "int.tt", + "coop.tt", + "jobs.tt", + "mobi.tt", + "travel.tt", + "museum.tt", + "aero.tt", + "name.tt", + "gov.tt", + "edu.tt", + "tv", + "tw", + "edu.tw", + "gov.tw", + "mil.tw", + "com.tw", + "net.tw", + "org.tw", + "idv.tw", + "game.tw", + "ebiz.tw", + "club.tw", + "xn--zf0ao64a.tw", + "xn--uc0atv.tw", + "xn--czrw28b.tw", + "tz", + "ac.tz", + "co.tz", + "go.tz", + "hotel.tz", + "info.tz", + "me.tz", + "mil.tz", + "mobi.tz", + "ne.tz", + "or.tz", + "sc.tz", + "tv.tz", + "ua", + "com.ua", + "edu.ua", + "gov.ua", + "in.ua", + "net.ua", + "org.ua", + "cherkassy.ua", + "cherkasy.ua", + "chernigov.ua", + "chernihiv.ua", + "chernivtsi.ua", + "chernovtsy.ua", + "ck.ua", + "cn.ua", + "cr.ua", + "crimea.ua", + "cv.ua", + "dn.ua", + "dnepropetrovsk.ua", + "dnipropetrovsk.ua", + "dominic.ua", + "donetsk.ua", + "dp.ua", + "if.ua", + "ivano-frankivsk.ua", + "kh.ua", + "kharkiv.ua", + "kharkov.ua", + "kherson.ua", + "khmelnitskiy.ua", + "khmelnytskyi.ua", + "kiev.ua", + "kirovograd.ua", + "km.ua", + "kr.ua", + "krym.ua", + "ks.ua", + "kv.ua", + "kyiv.ua", + "lg.ua", + "lt.ua", + "lugansk.ua", + "lutsk.ua", + "lv.ua", + "lviv.ua", + "mk.ua", + "mykolaiv.ua", + "nikolaev.ua", + "od.ua", + "odesa.ua", + "odessa.ua", + "pl.ua", + "poltava.ua", + "rivne.ua", + "rovno.ua", + "rv.ua", + "sb.ua", + "sebastopol.ua", + "sevastopol.ua", + "sm.ua", + "sumy.ua", + "te.ua", + "ternopil.ua", + "uz.ua", + "uzhgorod.ua", + "vinnica.ua", + "vinnytsia.ua", + "vn.ua", + "volyn.ua", + "yalta.ua", + "zaporizhzhe.ua", + "zaporizhzhia.ua", + "zhitomir.ua", + "zhytomyr.ua", + "zp.ua", + "zt.ua", + "ug", + "co.ug", + "or.ug", + "ac.ug", + "sc.ug", + "go.ug", + "ne.ug", + "com.ug", + "org.ug", + "uk", + "ac.uk", + "co.uk", + "gov.uk", + "ltd.uk", + "me.uk", + "net.uk", + "nhs.uk", + "org.uk", + "plc.uk", + "police.uk", + "*.sch.uk", + "us", + "dni.us", + "fed.us", + "isa.us", + "kids.us", + "nsn.us", + "ak.us", + "al.us", + "ar.us", + "as.us", + "az.us", + "ca.us", + "co.us", + "ct.us", + "dc.us", + "de.us", + "fl.us", + "ga.us", + "gu.us", + "hi.us", + "ia.us", + "id.us", + "il.us", + "in.us", + "ks.us", + "ky.us", + "la.us", + "ma.us", + "md.us", + "me.us", + "mi.us", + "mn.us", + "mo.us", + "ms.us", + "mt.us", + "nc.us", + "nd.us", + "ne.us", + "nh.us", + "nj.us", + "nm.us", + "nv.us", + "ny.us", + "oh.us", + "ok.us", + "or.us", + "pa.us", + "pr.us", + "ri.us", + "sc.us", + "sd.us", + "tn.us", + "tx.us", + "ut.us", + "vi.us", + "vt.us", + "va.us", + "wa.us", + "wi.us", + "wv.us", + "wy.us", + "k12.ak.us", + "k12.al.us", + "k12.ar.us", + "k12.as.us", + "k12.az.us", + "k12.ca.us", + "k12.co.us", + "k12.ct.us", + "k12.dc.us", + "k12.de.us", + "k12.fl.us", + "k12.ga.us", + "k12.gu.us", + "k12.ia.us", + "k12.id.us", + "k12.il.us", + "k12.in.us", + "k12.ks.us", + "k12.ky.us", + "k12.la.us", + "k12.ma.us", + "k12.md.us", + "k12.me.us", + "k12.mi.us", + "k12.mn.us", + "k12.mo.us", + "k12.ms.us", + "k12.mt.us", + "k12.nc.us", + "k12.ne.us", + "k12.nh.us", + "k12.nj.us", + "k12.nm.us", + "k12.nv.us", + "k12.ny.us", + "k12.oh.us", + "k12.ok.us", + "k12.or.us", + "k12.pa.us", + "k12.pr.us", + "k12.ri.us", + "k12.sc.us", + "k12.tn.us", + "k12.tx.us", + "k12.ut.us", + "k12.vi.us", + "k12.vt.us", + "k12.va.us", + "k12.wa.us", + "k12.wi.us", + "k12.wy.us", + "cc.ak.us", + "cc.al.us", + "cc.ar.us", + "cc.as.us", + "cc.az.us", + "cc.ca.us", + "cc.co.us", + "cc.ct.us", + "cc.dc.us", + "cc.de.us", + "cc.fl.us", + "cc.ga.us", + "cc.gu.us", + "cc.hi.us", + "cc.ia.us", + "cc.id.us", + "cc.il.us", + "cc.in.us", + "cc.ks.us", + "cc.ky.us", + "cc.la.us", + "cc.ma.us", + "cc.md.us", + "cc.me.us", + "cc.mi.us", + "cc.mn.us", + "cc.mo.us", + "cc.ms.us", + "cc.mt.us", + "cc.nc.us", + "cc.nd.us", + "cc.ne.us", + "cc.nh.us", + "cc.nj.us", + "cc.nm.us", + "cc.nv.us", + "cc.ny.us", + "cc.oh.us", + "cc.ok.us", + "cc.or.us", + "cc.pa.us", + "cc.pr.us", + "cc.ri.us", + "cc.sc.us", + "cc.sd.us", + "cc.tn.us", + "cc.tx.us", + "cc.ut.us", + "cc.vi.us", + "cc.vt.us", + "cc.va.us", + "cc.wa.us", + "cc.wi.us", + "cc.wv.us", + "cc.wy.us", + "lib.ak.us", + "lib.al.us", + "lib.ar.us", + "lib.as.us", + "lib.az.us", + "lib.ca.us", + "lib.co.us", + "lib.ct.us", + "lib.dc.us", + "lib.de.us", + "lib.fl.us", + "lib.ga.us", + "lib.gu.us", + "lib.hi.us", + "lib.ia.us", + "lib.id.us", + "lib.il.us", + "lib.in.us", + "lib.ks.us", + "lib.ky.us", + "lib.la.us", + "lib.ma.us", + "lib.md.us", + "lib.me.us", + "lib.mi.us", + "lib.mn.us", + "lib.mo.us", + "lib.ms.us", + "lib.mt.us", + "lib.nc.us", + "lib.nd.us", + "lib.ne.us", + "lib.nh.us", + "lib.nj.us", + "lib.nm.us", + "lib.nv.us", + "lib.ny.us", + "lib.oh.us", + "lib.ok.us", + "lib.or.us", + "lib.pa.us", + "lib.pr.us", + "lib.ri.us", + "lib.sc.us", + "lib.sd.us", + "lib.tn.us", + "lib.tx.us", + "lib.ut.us", + "lib.vi.us", + "lib.vt.us", + "lib.va.us", + "lib.wa.us", + "lib.wi.us", + "lib.wy.us", + "pvt.k12.ma.us", + "chtr.k12.ma.us", + "paroch.k12.ma.us", + "uy", + "com.uy", + "edu.uy", + "gub.uy", + "mil.uy", + "net.uy", + "org.uy", + "uz", + "co.uz", + "com.uz", + "net.uz", + "org.uz", + "va", + "vc", + "com.vc", + "net.vc", + "org.vc", + "gov.vc", + "mil.vc", + "edu.vc", + "ve", + "arts.ve", + "co.ve", + "com.ve", + "e12.ve", + "edu.ve", + "firm.ve", + "gob.ve", + "gov.ve", + "info.ve", + "int.ve", + "mil.ve", + "net.ve", + "org.ve", + "rec.ve", + "store.ve", + "tec.ve", + "web.ve", + "vg", + "vi", + "co.vi", + "com.vi", + "k12.vi", + "net.vi", + "org.vi", + "vn", + "com.vn", + "net.vn", + "org.vn", + "edu.vn", + "gov.vn", + "int.vn", + "ac.vn", + "biz.vn", + "info.vn", + "name.vn", + "pro.vn", + "health.vn", + "vu", + "com.vu", + "edu.vu", + "net.vu", + "org.vu", + "wf", + "ws", + "com.ws", + "net.ws", + "org.ws", + "gov.ws", + "edu.ws", + "yt", + "xn--mgbaam7a8h", + "xn--y9a3aq", + "xn--54b7fta0cc", + "xn--90ais", + "xn--fiqs8s", + "xn--fiqz9s", + "xn--lgbbat1ad8j", + "xn--wgbh1c", + "xn--node", + "xn--qxam", + "xn--j6w193g", + "xn--h2brj9c", + "xn--mgbbh1a71e", + "xn--fpcrj9c3d", + "xn--gecrj9c", + "xn--s9brj9c", + "xn--45brj9c", + "xn--xkc2dl3a5ee0h", + "xn--mgba3a4f16a", + "xn--mgba3a4fra", + "xn--mgbtx2b", + "xn--mgbayh7gpa", + "xn--3e0b707e", + "xn--80ao21a", + "xn--fzc2c9e2c", + "xn--xkc2al3hye2a", + "xn--mgbc0a9azcg", + "xn--d1alf", + "xn--l1acc", + "xn--mix891f", + "xn--mix082f", + "xn--mgbx4cd0ab", + "xn--mgb9awbf", + "xn--mgbai9azgqp6j", + "xn--mgbai9a5eva00b", + "xn--ygbi2ammx", + "xn--90a3ac", + "xn--o1ac.xn--90a3ac", + "xn--c1avg.xn--90a3ac", + "xn--90azh.xn--90a3ac", + "xn--d1at.xn--90a3ac", + "xn--o1ach.xn--90a3ac", + "xn--80au.xn--90a3ac", + "xn--p1ai", + "xn--wgbl6a", + "xn--mgberp4a5d4ar", + "xn--mgberp4a5d4a87g", + "xn--mgbqly7c0a67fbc", + "xn--mgbqly7cvafr", + "xn--mgbpl2fh", + "xn--yfro4i67o", + "xn--clchc0ea0b2g2a9gcd", + "xn--ogbpf8fl", + "xn--mgbtf8fl", + "xn--o3cw4h", + "xn--pgbs0dh", + "xn--kpry57d", + "xn--kprw13d", + "xn--nnx388a", + "xn--j1amh", + "xn--mgb2ddes", + "xxx", + "*.ye", + "ac.za", + "agric.za", + "alt.za", + "co.za", + "edu.za", + "gov.za", + "grondar.za", + "law.za", + "mil.za", + "net.za", + "ngo.za", + "nis.za", + "nom.za", + "org.za", + "school.za", + "tm.za", + "web.za", + "*.zm", + "*.zw", + "aaa", + "aarp", + "abarth", + "abb", + "abbott", + "abbvie", + "abc", + "able", + "abogado", + "abudhabi", + "academy", + "accenture", + "accountant", + "accountants", + "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", + "aquarelle", + "arab", + "aramco", + "archi", + "army", + "arte", + "asda", + "associates", + "athleta", + "attorney", + "auction", + "audi", + "audible", + "audio", + "auspost", + "author", + "auto", + "autos", + "avianca", + "aws", + "axa", + "azure", + "baby", + "baidu", + "banamex", + "bananarepublic", + "band", + "bank", + "bar", + "barcelona", + "barclaycard", + "barclays", + "barefoot", + "bargains", + "baseball", + "basketball", + "bauhaus", + "bayern", + "bbc", + "bbt", + "bbva", + "bcg", + "bcn", + "beats", + "beauty", + "beer", + "bentley", + "berlin", + "best", + "bestbuy", + "bet", + "bharti", + "bible", + "bid", + "bike", + "bing", + "bingo", + "bio", + "black", + "blackfriday", + "blanco", + "blockbuster", + "blog", + "bloomberg", + "blue", + "bms", + "bmw", + "bnl", + "bnpparibas", + "boats", + "boehringer", + "bofa", + "bom", + "bond", + "boo", + "book", + "booking", + "boots", + "bosch", + "bostik", + "boston", + "bot", + "boutique", + "box", + "bradesco", + "bridgestone", + "broadway", + "broker", + "brother", + "brussels", + "budapest", + "bugatti", + "build", + "builders", + "business", + "buy", + "buzz", + "bzh", + "cab", + "cafe", + "cal", + "call", + "calvinklein", + "camera", + "camp", + "cancerresearch", + "canon", + "capetown", + "capital", + "capitalone", + "car", + "caravan", + "cards", + "care", + "career", + "careers", + "cars", + "cartier", + "casa", + "case", + "caseih", + "cash", + "casino", + "catering", + "catholic", + "cba", + "cbn", + "cbre", + "cbs", + "ceb", + "center", + "ceo", + "cern", + "cfa", + "cfd", + "chanel", + "channel", + "chase", + "chat", + "cheap", + "chintai", + "chloe", + "christmas", + "chrome", + "chrysler", + "church", + "cipriani", + "circle", + "cisco", + "citadel", + "citi", + "citic", + "city", + "cityeats", + "claims", + "cleaning", + "click", + "clinic", + "clinique", + "clothing", + "cloud", + "club", + "clubmed", + "coach", + "codes", + "coffee", + "college", + "cologne", + "comcast", + "commbank", + "community", + "company", + "compare", + "computer", + "comsec", + "condos", + "construction", + "consulting", + "contact", + "contractors", + "cooking", + "cookingchannel", + "cool", + "corsica", + "country", + "coupon", + "coupons", + "courses", + "credit", + "creditcard", + "creditunion", + "cricket", + "crown", + "crs", + "cruise", + "cruises", + "csc", + "cuisinella", + "cymru", + "cyou", + "dabur", + "dad", + "dance", + "date", + "dating", + "datsun", + "day", + "dclk", + "dds", + "deal", + "dealer", + "deals", + "degree", + "delivery", + "dell", + "deloitte", + "delta", + "democrat", + "dental", + "dentist", + "desi", + "design", + "dev", + "dhl", + "diamonds", + "diet", + "digital", + "direct", + "directory", + "discount", + "discover", + "dish", + "diy", + "dnp", + "docs", + "dodge", + "dog", + "doha", + "domains", + "dot", + "download", + "drive", + "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", + "everbank", + "exchange", + "expert", + "exposed", + "express", + "extraspace", + "fage", + "fail", + "fairwinds", + "faith", + "family", + "fan", + "fans", + "farm", + "farmers", + "fashion", + "fast", + "fedex", + "feedback", + "ferrari", + "ferrero", + "fiat", + "fidelity", + "fido", + "film", + "final", + "finance", + "financial", + "fire", + "firestone", + "firmdale", + "fish", + "fishing", + "fit", + "fitness", + "flickr", + "flights", + "flir", + "florist", + "flowers", + "flsmidth", + "fly", + "foo", + "foodnetwork", + "football", + "ford", + "forex", + "forsale", + "forum", + "foundation", + "fox", + "free", + "fresenius", + "frl", + "frogans", + "frontdoor", + "frontier", + "ftr", + "fujitsu", + "fujixerox", + "fun", + "fund", + "furniture", + "futbol", + "fyi", + "gal", + "gallery", + "gallo", + "gallup", + "game", + "games", + "gap", + "garden", + "gbiz", + "gdn", + "gea", + "gent", + "genting", + "george", + "ggee", + "gift", + "gifts", + "gives", + "giving", + "glade", + "glass", + "gle", + "global", + "globo", + "gmail", + "gmbh", + "gmo", + "gmx", + "godaddy", + "gold", + "goldpoint", + "golf", + "goo", + "goodhands", + "goodyear", + "goog", + "google", + "gop", + "got", + "gotv", + "grainger", + "graphics", + "gratis", + "green", + "gripe", + "group", + "guardian", + "gucci", + "guge", + "guide", + "guitars", + "guru", + "hair", + "hamburg", + "hangout", + "haus", + "hbo", + "hdfc", + "hdfcbank", + "health", + "healthcare", + "help", + "helsinki", + "here", + "hermes", + "hgtv", + "hiphop", + "hisamitsu", + "hitachi", + "hiv", + "hkt", + "hockey", + "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", + "industries", + "infiniti", + "ing", + "ink", + "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", + "jlc", + "jll", + "jmp", + "jnj", + "joburg", + "jot", + "joy", + "jpmorgan", + "jprs", + "juegos", + "juniper", + "kaufen", + "kddi", + "kerryhotels", + "kerrylogistics", + "kerryproperties", + "kfh", + "kia", + "kim", + "kinder", + "kindle", + "kitchen", + "kiwi", + "koeln", + "komatsu", + "kosher", + "kpmg", + "kpn", + "krd", + "kred", + "kuokgroup", + "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", + "lidl", + "life", + "lifeinsurance", + "lifestyle", + "lighting", + "like", + "lilly", + "limited", + "limo", + "lincoln", + "linde", + "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", + "makeup", + "man", + "management", + "mango", + "market", + "marketing", + "markets", + "marriott", + "marshalls", + "maserati", + "mattel", + "mba", + "mcd", + "mcdonalds", + "mckinsey", + "med", + "media", + "meet", + "melbourne", + "meme", + "memorial", + "men", + "menu", + "meo", + "metlife", + "miami", + "microsoft", + "mini", + "mint", + "mit", + "mitsubishi", + "mlb", + "mls", + "mma", + "mnet", + "mobily", + "moda", + "moe", + "moi", + "mom", + "monash", + "money", + "monster", + "montblanc", + "mopar", + "mormon", + "mortgage", + "moscow", + "moto", + "motorcycles", + "mov", + "movie", + "movistar", + "msd", + "mtn", + "mtpc", + "mtr", + "multichoice", + "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", + "nissay", + "nokia", + "northwesternmutual", + "norton", + "now", + "nowruz", + "nowtv", + "nra", + "nrw", + "ntt", + "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", + "partners", + "parts", + "party", + "passagens", + "pay", + "payu", + "pccw", + "pet", + "pfizer", + "pharmacy", + "philips", + "photo", + "photography", + "photos", + "physio", + "piaget", + "pics", + "pictet", + "pictures", + "pid", + "pin", + "ping", + "pink", + "pioneer", + "pizza", + "place", + "play", + "playstation", + "plumbing", + "plus", + "pnc", + "pohl", + "poker", + "politie", + "porn", + "pramerica", + "praxi", + "press", + "prime", + "prod", + "productions", + "prof", + "progressive", + "promo", + "properties", + "property", + "protection", + "pru", + "prudential", + "pub", + "pwc", + "qpon", + "quebec", + "quest", + "qvc", + "racing", + "raid", + "read", + "realestate", + "realtor", + "realty", + "recipes", + "red", + "redstone", + "redumbrella", + "rehab", + "reise", + "reisen", + "reit", + "reliance", + "ren", + "rent", + "rentals", + "repair", + "report", + "republican", + "rest", + "restaurant", + "review", + "reviews", + "rexroth", + "rich", + "richardli", + "ricoh", + "rightathome", + "ril", + "rio", + "rip", + "rmit", + "rocher", + "rocks", + "rodeo", + "rogers", + "room", + "rsvp", + "ruhr", + "run", + "rwe", + "ryukyu", + "saarland", + "safe", + "safety", + "sakura", + "sale", + "salon", + "samsclub", + "samsung", + "sandvik", + "sandvikcoromant", + "sanofi", + "sap", + "sapo", + "sarl", + "sas", + "save", + "saxo", + "sbi", + "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", + "singles", + "site", + "ski", + "skin", + "sky", + "skype", + "sling", + "smart", + "smile", + "sncf", + "soccer", + "social", + "softbank", + "software", + "sohu", + "solar", + "solutions", + "song", + "sony", + "soy", + "space", + "spiegel", + "spot", + "spreadbetting", + "srl", + "srt", + "stada", + "staples", + "star", + "starhub", + "statebank", + "statefarm", + "statoil", + "stc", + "stcgroup", + "stockholm", + "storage", + "store", + "stream", + "studio", + "study", + "style", + "sucks", + "supersport", + "supplies", + "supply", + "support", + "surf", + "surgery", + "suzuki", + "swatch", + "swiftcover", + "swiss", + "sydney", + "symantec", + "systems", + "tab", + "taipei", + "talk", + "taobao", + "target", + "tatamotors", + "tatar", + "tattoo", + "tax", + "taxi", + "tci", + "tdk", + "team", + "tech", + "technology", + "telecity", + "telefonica", + "temasek", + "tennis", + "teva", + "thd", + "theater", + "theatre", + "theguardian", + "tiaa", + "tickets", + "tienda", + "tiffany", + "tips", + "tires", + "tirol", + "tjmaxx", + "tjx", + "tkmaxx", + "tmall", + "today", + "tokyo", + "tools", + "top", + "toray", + "toshiba", + "total", + "tours", + "town", + "toyota", + "toys", + "trade", + "trading", + "training", + "travelchannel", + "travelers", + "travelersinsurance", + "trust", + "trv", + "tube", + "tui", + "tunes", + "tushu", + "tvs", + "ubank", + "ubs", + "uconnect", + "unicom", + "university", + "uno", + "uol", + "ups", + "vacations", + "vana", + "vanguard", + "vegas", + "ventures", + "verisign", + "versicherung", + "vet", + "viajes", + "video", + "vig", + "viking", + "villas", + "vin", + "vip", + "virgin", + "visa", + "vision", + "vista", + "vistaprint", + "viva", + "vivo", + "vlaanderen", + "vodka", + "volkswagen", + "volvo", + "vote", + "voting", + "voto", + "voyage", + "vuelos", + "wales", + "walmart", + "walter", + "wang", + "wanggou", + "warman", + "watch", + "watches", + "weather", + "weatherchannel", + "webcam", + "weber", + "website", + "wed", + "wedding", + "weibo", + "weir", + "whoswho", + "wien", + "wiki", + "williamhill", + "win", + "windows", + "wine", + "winners", + "wme", + "wolterskluwer", + "woodside", + "work", + "works", + "world", + "wow", + "wtc", + "wtf", + "xbox", + "xerox", + "xfinity", + "xihuan", + "xin", + "xn--11b4c3d", + "xn--1ck2e1b", + "xn--1qqw23a", + "xn--30rr7y", + "xn--3bst00m", + "xn--3ds443g", + "xn--3oq18vl8pn36a", + "xn--3pxu8k", + "xn--42c2d9a", + "xn--45q11c", + "xn--4gbrim", + "xn--4gq48lf9j", + "xn--55qw42g", + "xn--55qx5d", + "xn--5su34j936bgsg", + "xn--5tzm5g", + "xn--6frz82g", + "xn--6qq986b3xl", + "xn--80adxhks", + "xn--80aqecdr1a", + "xn--80asehdb", + "xn--80aswg", + "xn--8y0a063a", + "xn--9dbq2a", + "xn--9et52u", + "xn--9krt00a", + "xn--b4w605ferd", + "xn--bck1b9a5dre4c", + "xn--c1avg", + "xn--c2br7g", + "xn--cck2b3b", + "xn--cg4bki", + "xn--czr694b", + "xn--czrs0t", + "xn--czru2d", + "xn--d1acj3b", + "xn--eckvdtc9d", + "xn--efvy88h", + "xn--estv75g", + "xn--fct429k", + "xn--fhbei", + "xn--fiq228c5hs", + "xn--fiq64b", + "xn--fjq720a", + "xn--flw351e", + "xn--fzys8d69uvgm", + "xn--g2xx48c", + "xn--gckr3f0f", + "xn--gk3at1e", + "xn--hxt814e", + "xn--i1b6b1a6a2e", + "xn--imr513n", + "xn--io0a7i", + "xn--j1aef", + "xn--jlq61u9w7b", + "xn--jvr189m", + "xn--kcrx77d1x4a", + "xn--kpu716f", + "xn--kput3i", + "xn--mgba3a3ejt", + "xn--mgba7c0bbn0a", + "xn--mgbaakc7dvf", + "xn--mgbab2bd", + "xn--mgbb9fbpob", + "xn--mgbca7dzdo", + "xn--mgbi4ecexp", + "xn--mgbt3dhd", + "xn--mk1bu44c", + "xn--mxtq1m", + "xn--ngbc5azd", + "xn--ngbe9e0a", + "xn--ngbrx", + "xn--nqv7f", + "xn--nqv7fs00ema", + "xn--nyqy26a", + "xn--p1acf", + "xn--pbt977c", + "xn--pssy2u", + "xn--q9jyb4c", + "xn--qcka1pmc", + "xn--rhqv96g", + "xn--rovu88b", + "xn--ses554g", + "xn--t60b56a", + "xn--tckwe", + "xn--tiq49xqyj", + "xn--unup4y", + "xn--vermgensberater-ctb", + "xn--vermgensberatung-pwb", + "xn--vhquv", + "xn--vuq861b", + "xn--w4r85el8fhu5dnra", + "xn--w4rs40l", + "xn--xhq521b", + "xn--zfr164b", + "xperia", + "xyz", + "yachts", + "yahoo", + "yamaxun", + "yandex", + "yodobashi", + "yoga", + "yokohama", + "you", + "youtube", + "yun", + "zappos", + "zara", + "zero", + "zip", + "zippo", + "zone", + "zuerich", + "cloudfront.net", + "ap-northeast-1.compute.amazonaws.com", + "ap-northeast-2.compute.amazonaws.com", + "ap-southeast-1.compute.amazonaws.com", + "ap-southeast-2.compute.amazonaws.com", + "cn-north-1.compute.amazonaws.cn", + "compute-1.amazonaws.com", + "compute.amazonaws.cn", + "compute.amazonaws.com", + "eu-central-1.compute.amazonaws.com", + "eu-west-1.compute.amazonaws.com", + "sa-east-1.compute.amazonaws.com", + "us-east-1.amazonaws.com", + "us-gov-west-1.compute.amazonaws.com", + "us-west-1.compute.amazonaws.com", + "us-west-2.compute.amazonaws.com", + "z-1.compute-1.amazonaws.com", + "z-2.compute-1.amazonaws.com", + "elasticbeanstalk.com", + "elb.amazonaws.com", + "s3.amazonaws.com", + "s3-ap-northeast-1.amazonaws.com", + "s3-ap-northeast-2.amazonaws.com", + "s3-ap-southeast-1.amazonaws.com", + "s3-ap-southeast-2.amazonaws.com", + "s3-eu-central-1.amazonaws.com", + "s3-eu-west-1.amazonaws.com", + "s3-external-1.amazonaws.com", + "s3-external-2.amazonaws.com", + "s3-fips-us-gov-west-1.amazonaws.com", + "s3-sa-east-1.amazonaws.com", + "s3-us-gov-west-1.amazonaws.com", + "s3-us-west-1.amazonaws.com", + "s3-us-west-2.amazonaws.com", + "s3.ap-northeast-2.amazonaws.com", + "s3.cn-north-1.amazonaws.com.cn", + "s3.eu-central-1.amazonaws.com", + "betainabox.com", + "ae.org", + "ar.com", + "br.com", + "cn.com", + "com.de", + "com.se", + "de.com", + "eu.com", + "gb.com", + "gb.net", + "hu.com", + "hu.net", + "jp.net", + "jpn.com", + "kr.com", + "mex.com", + "no.com", + "qc.com", + "ru.com", + "sa.com", + "se.com", + "se.net", + "uk.com", + "uk.net", + "us.com", + "uy.com", + "za.bz", + "za.com", + "africa.com", + "xenapponazure.com", + "gr.com", + "in.net", + "us.org", + "co.com", + "c.la", + "cloudcontrolled.com", + "cloudcontrolapp.com", + "co.ca", + "co.cz", + "c.cdn77.org", + "cdn77-ssl.net", + "r.cdn77.net", + "rsc.cdn77.org", + "ssl.origin.cdn77-secure.org", + "co.nl", + "co.no", + "*.platform.sh", + "cupcake.is", + "dreamhosters.com", + "mydrobo.com", + "duckdns.org", + "dyndns-at-home.com", + "dyndns-at-work.com", + "dyndns-blog.com", + "dyndns-free.com", + "dyndns-home.com", + "dyndns-ip.com", + "dyndns-mail.com", + "dyndns-office.com", + "dyndns-pics.com", + "dyndns-remote.com", + "dyndns-server.com", + "dyndns-web.com", + "dyndns-wiki.com", + "dyndns-work.com", + "dyndns.biz", + "dyndns.info", + "dyndns.org", + "dyndns.tv", + "at-band-camp.net", + "ath.cx", + "barrel-of-knowledge.info", + "barrell-of-knowledge.info", + "better-than.tv", + "blogdns.com", + "blogdns.net", + "blogdns.org", + "blogsite.org", + "boldlygoingnowhere.org", + "broke-it.net", + "buyshouses.net", + "cechire.com", + "dnsalias.com", + "dnsalias.net", + "dnsalias.org", + "dnsdojo.com", + "dnsdojo.net", + "dnsdojo.org", + "does-it.net", + "doesntexist.com", + "doesntexist.org", + "dontexist.com", + "dontexist.net", + "dontexist.org", + "doomdns.com", + "doomdns.org", + "dvrdns.org", + "dyn-o-saur.com", + "dynalias.com", + "dynalias.net", + "dynalias.org", + "dynathome.net", + "dyndns.ws", + "endofinternet.net", + "endofinternet.org", + "endoftheinternet.org", + "est-a-la-maison.com", + "est-a-la-masion.com", + "est-le-patron.com", + "est-mon-blogueur.com", + "for-better.biz", + "for-more.biz", + "for-our.info", + "for-some.biz", + "for-the.biz", + "forgot.her.name", + "forgot.his.name", + "from-ak.com", + "from-al.com", + "from-ar.com", + "from-az.net", + "from-ca.com", + "from-co.net", + "from-ct.com", + "from-dc.com", + "from-de.com", + "from-fl.com", + "from-ga.com", + "from-hi.com", + "from-ia.com", + "from-id.com", + "from-il.com", + "from-in.com", + "from-ks.com", + "from-ky.com", + "from-la.net", + "from-ma.com", + "from-md.com", + "from-me.org", + "from-mi.com", + "from-mn.com", + "from-mo.com", + "from-ms.com", + "from-mt.com", + "from-nc.com", + "from-nd.com", + "from-ne.com", + "from-nh.com", + "from-nj.com", + "from-nm.com", + "from-nv.com", + "from-ny.net", + "from-oh.com", + "from-ok.com", + "from-or.com", + "from-pa.com", + "from-pr.com", + "from-ri.com", + "from-sc.com", + "from-sd.com", + "from-tn.com", + "from-tx.com", + "from-ut.com", + "from-va.com", + "from-vt.com", + "from-wa.com", + "from-wi.com", + "from-wv.com", + "from-wy.com", + "ftpaccess.cc", + "fuettertdasnetz.de", + "game-host.org", + "game-server.cc", + "getmyip.com", + "gets-it.net", + "go.dyndns.org", + "gotdns.com", + "gotdns.org", + "groks-the.info", + "groks-this.info", + "ham-radio-op.net", + "here-for-more.info", + "hobby-site.com", + "hobby-site.org", + "home.dyndns.org", + "homedns.org", + "homeftp.net", + "homeftp.org", + "homeip.net", + "homelinux.com", + "homelinux.net", + "homelinux.org", + "homeunix.com", + "homeunix.net", + "homeunix.org", + "iamallama.com", + "in-the-band.net", + "is-a-anarchist.com", + "is-a-blogger.com", + "is-a-bookkeeper.com", + "is-a-bruinsfan.org", + "is-a-bulls-fan.com", + "is-a-candidate.org", + "is-a-caterer.com", + "is-a-celticsfan.org", + "is-a-chef.com", + "is-a-chef.net", + "is-a-chef.org", + "is-a-conservative.com", + "is-a-cpa.com", + "is-a-cubicle-slave.com", + "is-a-democrat.com", + "is-a-designer.com", + "is-a-doctor.com", + "is-a-financialadvisor.com", + "is-a-geek.com", + "is-a-geek.net", + "is-a-geek.org", + "is-a-green.com", + "is-a-guru.com", + "is-a-hard-worker.com", + "is-a-hunter.com", + "is-a-knight.org", + "is-a-landscaper.com", + "is-a-lawyer.com", + "is-a-liberal.com", + "is-a-libertarian.com", + "is-a-linux-user.org", + "is-a-llama.com", + "is-a-musician.com", + "is-a-nascarfan.com", + "is-a-nurse.com", + "is-a-painter.com", + "is-a-patsfan.org", + "is-a-personaltrainer.com", + "is-a-photographer.com", + "is-a-player.com", + "is-a-republican.com", + "is-a-rockstar.com", + "is-a-socialist.com", + "is-a-soxfan.org", + "is-a-student.com", + "is-a-teacher.com", + "is-a-techie.com", + "is-a-therapist.com", + "is-an-accountant.com", + "is-an-actor.com", + "is-an-actress.com", + "is-an-anarchist.com", + "is-an-artist.com", + "is-an-engineer.com", + "is-an-entertainer.com", + "is-by.us", + "is-certified.com", + "is-found.org", + "is-gone.com", + "is-into-anime.com", + "is-into-cars.com", + "is-into-cartoons.com", + "is-into-games.com", + "is-leet.com", + "is-lost.org", + "is-not-certified.com", + "is-saved.org", + "is-slick.com", + "is-uberleet.com", + "is-very-bad.org", + "is-very-evil.org", + "is-very-good.org", + "is-very-nice.org", + "is-very-sweet.org", + "is-with-theband.com", + "isa-geek.com", + "isa-geek.net", + "isa-geek.org", + "isa-hockeynut.com", + "issmarterthanyou.com", + "isteingeek.de", + "istmein.de", + "kicks-ass.net", + "kicks-ass.org", + "knowsitall.info", + "land-4-sale.us", + "lebtimnetz.de", + "leitungsen.de", + "likes-pie.com", + "likescandy.com", + "merseine.nu", + "mine.nu", + "misconfused.org", + "mypets.ws", + "myphotos.cc", + "neat-url.com", + "office-on-the.net", + "on-the-web.tv", + "podzone.net", + "podzone.org", + "readmyblog.org", + "saves-the-whales.com", + "scrapper-site.net", + "scrapping.cc", + "selfip.biz", + "selfip.com", + "selfip.info", + "selfip.net", + "selfip.org", + "sells-for-less.com", + "sells-for-u.com", + "sells-it.net", + "sellsyourhome.org", + "servebbs.com", + "servebbs.net", + "servebbs.org", + "serveftp.net", + "serveftp.org", + "servegame.org", + "shacknet.nu", + "simple-url.com", + "space-to-rent.com", + "stuff-4-sale.org", + "stuff-4-sale.us", + "teaches-yoga.com", + "thruhere.net", + "traeumtgerade.de", + "webhop.biz", + "webhop.info", + "webhop.net", + "webhop.org", + "worse-than.tv", + "writesthisblog.com", + "dynv6.net", + "eu.org", + "al.eu.org", + "asso.eu.org", + "at.eu.org", + "au.eu.org", + "be.eu.org", + "bg.eu.org", + "ca.eu.org", + "cd.eu.org", + "ch.eu.org", + "cn.eu.org", + "cy.eu.org", + "cz.eu.org", + "de.eu.org", + "dk.eu.org", + "edu.eu.org", + "ee.eu.org", + "es.eu.org", + "fi.eu.org", + "fr.eu.org", + "gr.eu.org", + "hr.eu.org", + "hu.eu.org", + "ie.eu.org", + "il.eu.org", + "in.eu.org", + "int.eu.org", + "is.eu.org", + "it.eu.org", + "jp.eu.org", + "kr.eu.org", + "lt.eu.org", + "lu.eu.org", + "lv.eu.org", + "mc.eu.org", + "me.eu.org", + "mk.eu.org", + "mt.eu.org", + "my.eu.org", + "net.eu.org", + "ng.eu.org", + "nl.eu.org", + "no.eu.org", + "nz.eu.org", + "paris.eu.org", + "pl.eu.org", + "pt.eu.org", + "q-a.eu.org", + "ro.eu.org", + "ru.eu.org", + "se.eu.org", + "si.eu.org", + "sk.eu.org", + "tr.eu.org", + "uk.eu.org", + "us.eu.org", + "apps.fbsbx.com", + "a.ssl.fastly.net", + "b.ssl.fastly.net", + "global.ssl.fastly.net", + "a.prod.fastly.net", + "global.prod.fastly.net", + "firebaseapp.com", + "flynnhub.com", + "service.gov.uk", + "github.io", + "githubusercontent.com", + "githubcloud.com", + "*.api.githubcloud.com", + "*.ext.githubcloud.com", + "gist.githubcloud.com", + "*.githubcloudusercontent.com", + "ro.com", + "appspot.com", + "blogspot.ae", + "blogspot.al", + "blogspot.am", + "blogspot.ba", + "blogspot.be", + "blogspot.bg", + "blogspot.bj", + "blogspot.ca", + "blogspot.cf", + "blogspot.ch", + "blogspot.cl", + "blogspot.co.at", + "blogspot.co.id", + "blogspot.co.il", + "blogspot.co.ke", + "blogspot.co.nz", + "blogspot.co.uk", + "blogspot.co.za", + "blogspot.com", + "blogspot.com.ar", + "blogspot.com.au", + "blogspot.com.br", + "blogspot.com.by", + "blogspot.com.co", + "blogspot.com.cy", + "blogspot.com.ee", + "blogspot.com.eg", + "blogspot.com.es", + "blogspot.com.mt", + "blogspot.com.ng", + "blogspot.com.tr", + "blogspot.com.uy", + "blogspot.cv", + "blogspot.cz", + "blogspot.de", + "blogspot.dk", + "blogspot.fi", + "blogspot.fr", + "blogspot.gr", + "blogspot.hk", + "blogspot.hr", + "blogspot.hu", + "blogspot.ie", + "blogspot.in", + "blogspot.is", + "blogspot.it", + "blogspot.jp", + "blogspot.kr", + "blogspot.li", + "blogspot.lt", + "blogspot.lu", + "blogspot.md", + "blogspot.mk", + "blogspot.mr", + "blogspot.mx", + "blogspot.my", + "blogspot.nl", + "blogspot.no", + "blogspot.pe", + "blogspot.pt", + "blogspot.qa", + "blogspot.re", + "blogspot.ro", + "blogspot.rs", + "blogspot.ru", + "blogspot.se", + "blogspot.sg", + "blogspot.si", + "blogspot.sk", + "blogspot.sn", + "blogspot.td", + "blogspot.tw", + "blogspot.ug", + "blogspot.vn", + "cloudfunctions.net", + "codespot.com", + "googleapis.com", + "googlecode.com", + "pagespeedmobilizer.com", + "withgoogle.com", + "withyoutube.com", + "hashbang.sh", + "herokuapp.com", + "herokussl.com", + "iki.fi", + "biz.at", + "info.at", + "co.pl", + "azurewebsites.net", + "azure-mobile.net", + "cloudapp.net", + "bmoattachments.org", + "4u.com", + "ngrok.io", + "nfshost.com", + "nyc.mn", + "nid.io", + "operaunite.com", + "outsystemscloud.com", + "pagefrontapp.com", + "art.pl", + "gliwice.pl", + "krakow.pl", + "poznan.pl", + "wroc.pl", + "zakopane.pl", + "pantheon.io", + "gotpantheon.com", + "xen.prgmr.com", + "priv.at", + "qa2.com", + "rackmaze.com", + "rackmaze.net", + "rhcloud.com", + "sandcats.io", + "biz.ua", + "co.ua", + "pp.ua", + "sinaapp.com", + "vipsinaapp.com", + "1kapp.com", + "diskstation.me", + "dscloud.biz", + "dscloud.me", + "dscloud.mobi", + "dsmynas.com", + "dsmynas.net", + "dsmynas.org", + "familyds.com", + "familyds.net", + "familyds.org", + "i234.me", + "myds.me", + "synology.me", + "gda.pl", + "gdansk.pl", + "gdynia.pl", + "med.pl", + "sopot.pl", + "hk.com", + "hk.org", + "ltd.hk", + "inc.hk", + "yolasite.com", + "za.net", + "za.org", +} + +var nodeLabels = [...]string{ + "aaa", + "aarp", + "abarth", + "abb", + "abbott", + "abbvie", + "abc", + "able", + "abogado", + "abudhabi", + "ac", + "academy", + "accenture", + "accountant", + "accountants", + "aco", + "active", + "actor", + "ad", + "adac", + "ads", + "adult", + "ae", + "aeg", + "aero", + "aetna", + "af", + "afamilycompany", + "afl", + "africa", + "africamagic", + "ag", + "agakhan", + "agency", + "ai", + "aig", + "aigo", + "airbus", + "airforce", + "airtel", + "akdn", + "al", + "alfaromeo", + "alibaba", + "alipay", + "allfinanz", + "allstate", + "ally", + "alsace", + "alstom", + "am", + "americanexpress", + "americanfamily", + "amex", + "amfam", + "amica", + "amsterdam", + "analytics", + "android", + "anquan", + "anz", + "ao", + "aol", + "apartments", + "app", + "apple", + "aq", + "aquarelle", + "ar", + "arab", + "aramco", + "archi", + "army", + "arpa", + "arte", + "as", + "asda", + "asia", + "associates", + "at", + "athleta", + "attorney", + "au", + "auction", + "audi", + "audible", + "audio", + "auspost", + "author", + "auto", + "autos", + "avianca", + "aw", + "aws", + "ax", + "axa", + "az", + "azure", + "ba", + "baby", + "baidu", + "banamex", + "bananarepublic", + "band", + "bank", + "bar", + "barcelona", + "barclaycard", + "barclays", + "barefoot", + "bargains", + "baseball", + "basketball", + "bauhaus", + "bayern", + "bb", + "bbc", + "bbt", + "bbva", + "bcg", + "bcn", + "bd", + "be", + "beats", + "beauty", + "beer", + "bentley", + "berlin", + "best", + "bestbuy", + "bet", + "bf", + "bg", + "bh", + "bharti", + "bi", + "bible", + "bid", + "bike", + "bing", + "bingo", + "bio", + "biz", + "bj", + "black", + "blackfriday", + "blanco", + "blockbuster", + "blog", + "bloomberg", + "blue", + "bm", + "bms", + "bmw", + "bn", + "bnl", + "bnpparibas", + "bo", + "boats", + "boehringer", + "bofa", + "bom", + "bond", + "boo", + "book", + "booking", + "boots", + "bosch", + "bostik", + "boston", + "bot", + "boutique", + "box", + "br", + "bradesco", + "bridgestone", + "broadway", + "broker", + "brother", + "brussels", + "bs", + "bt", + "budapest", + "bugatti", + "build", + "builders", + "business", + "buy", + "buzz", + "bv", + "bw", + "by", + "bz", + "bzh", + "ca", + "cab", + "cafe", + "cal", + "call", + "calvinklein", + "camera", + "camp", + "cancerresearch", + "canon", + "capetown", + "capital", + "capitalone", + "car", + "caravan", + "cards", + "care", + "career", + "careers", + "cars", + "cartier", + "casa", + "case", + "caseih", + "cash", + "casino", + "cat", + "catering", + "catholic", + "cba", + "cbn", + "cbre", + "cbs", + "cc", + "cd", + "ceb", + "center", + "ceo", + "cern", + "cf", + "cfa", + "cfd", + "cg", + "ch", + "chanel", + "channel", + "chase", + "chat", + "cheap", + "chintai", + "chloe", + "christmas", + "chrome", + "chrysler", + "church", + "ci", + "cipriani", + "circle", + "cisco", + "citadel", + "citi", + "citic", + "city", + "cityeats", + "ck", + "cl", + "claims", + "cleaning", + "click", + "clinic", + "clinique", + "clothing", + "cloud", + "club", + "clubmed", + "cm", + "cn", + "co", + "coach", + "codes", + "coffee", + "college", + "cologne", + "com", + "comcast", + "commbank", + "community", + "company", + "compare", + "computer", + "comsec", + "condos", + "construction", + "consulting", + "contact", + "contractors", + "cooking", + "cookingchannel", + "cool", + "coop", + "corsica", + "country", + "coupon", + "coupons", + "courses", + "cr", + "credit", + "creditcard", + "creditunion", + "cricket", + "crown", + "crs", + "cruise", + "cruises", + "csc", + "cu", + "cuisinella", + "cv", + "cw", + "cx", + "cy", + "cymru", + "cyou", + "cz", + "dabur", + "dad", + "dance", + "date", + "dating", + "datsun", + "day", + "dclk", + "dds", + "de", + "deal", + "dealer", + "deals", + "degree", + "delivery", + "dell", + "deloitte", + "delta", + "democrat", + "dental", + "dentist", + "desi", + "design", + "dev", + "dhl", + "diamonds", + "diet", + "digital", + "direct", + "directory", + "discount", + "discover", + "dish", + "diy", + "dj", + "dk", + "dm", + "dnp", + "do", + "docs", + "dodge", + "dog", + "doha", + "domains", + "dot", + "download", + "drive", + "dstv", + "dtv", + "dubai", + "duck", + "dunlop", + "duns", + "dupont", + "durban", + "dvag", + "dwg", + "dz", + "earth", + "eat", + "ec", + "edeka", + "edu", + "education", + "ee", + "eg", + "email", + "emerck", + "emerson", + "energy", + "engineer", + "engineering", + "enterprises", + "epost", + "epson", + "equipment", + "er", + "ericsson", + "erni", + "es", + "esq", + "estate", + "esurance", + "et", + "etisalat", + "eu", + "eurovision", + "eus", + "events", + "everbank", + "exchange", + "expert", + "exposed", + "express", + "extraspace", + "fage", + "fail", + "fairwinds", + "faith", + "family", + "fan", + "fans", + "farm", + "farmers", + "fashion", + "fast", + "fedex", + "feedback", + "ferrari", + "ferrero", + "fi", + "fiat", + "fidelity", + "fido", + "film", + "final", + "finance", + "financial", + "fire", + "firestone", + "firmdale", + "fish", + "fishing", + "fit", + "fitness", + "fj", + "fk", + "flickr", + "flights", + "flir", + "florist", + "flowers", + "flsmidth", + "fly", + "fm", + "fo", + "foo", + "foodnetwork", + "football", + "ford", + "forex", + "forsale", + "forum", + "foundation", + "fox", + "fr", + "free", + "fresenius", + "frl", + "frogans", + "frontdoor", + "frontier", + "ftr", + "fujitsu", + "fujixerox", + "fun", + "fund", + "furniture", + "futbol", + "fyi", + "ga", + "gal", + "gallery", + "gallo", + "gallup", + "game", + "games", + "gap", + "garden", + "gb", + "gbiz", + "gd", + "gdn", + "ge", + "gea", + "gent", + "genting", + "george", + "gf", + "gg", + "ggee", + "gh", + "gi", + "gift", + "gifts", + "gives", + "giving", + "gl", + "glade", + "glass", + "gle", + "global", + "globo", + "gm", + "gmail", + "gmbh", + "gmo", + "gmx", + "gn", + "godaddy", + "gold", + "goldpoint", + "golf", + "goo", + "goodhands", + "goodyear", + "goog", + "google", + "gop", + "got", + "gotv", + "gov", + "gp", + "gq", + "gr", + "grainger", + "graphics", + "gratis", + "green", + "gripe", + "group", + "gs", + "gt", + "gu", + "guardian", + "gucci", + "guge", + "guide", + "guitars", + "guru", + "gw", + "gy", + "hair", + "hamburg", + "hangout", + "haus", + "hbo", + "hdfc", + "hdfcbank", + "health", + "healthcare", + "help", + "helsinki", + "here", + "hermes", + "hgtv", + "hiphop", + "hisamitsu", + "hitachi", + "hiv", + "hk", + "hkt", + "hm", + "hn", + "hockey", + "holdings", + "holiday", + "homedepot", + "homegoods", + "homes", + "homesense", + "honda", + "honeywell", + "horse", + "host", + "hosting", + "hot", + "hoteles", + "hotmail", + "house", + "how", + "hr", + "hsbc", + "ht", + "htc", + "hu", + "hughes", + "hyatt", + "hyundai", + "ibm", + "icbc", + "ice", + "icu", + "id", + "ie", + "ieee", + "ifm", + "iinet", + "ikano", + "il", + "im", + "imamat", + "imdb", + "immo", + "immobilien", + "in", + "industries", + "infiniti", + "info", + "ing", + "ink", + "institute", + "insurance", + "insure", + "int", + "intel", + "international", + "intuit", + "investments", + "io", + "ipiranga", + "iq", + "ir", + "irish", + "is", + "iselect", + "ismaili", + "ist", + "istanbul", + "it", + "itau", + "itv", + "iveco", + "iwc", + "jaguar", + "java", + "jcb", + "jcp", + "je", + "jeep", + "jetzt", + "jewelry", + "jio", + "jlc", + "jll", + "jm", + "jmp", + "jnj", + "jo", + "jobs", + "joburg", + "jot", + "joy", + "jp", + "jpmorgan", + "jprs", + "juegos", + "juniper", + "kaufen", + "kddi", + "ke", + "kerryhotels", + "kerrylogistics", + "kerryproperties", + "kfh", + "kg", + "kh", + "ki", + "kia", + "kim", + "kinder", + "kindle", + "kitchen", + "kiwi", + "km", + "kn", + "koeln", + "komatsu", + "kosher", + "kp", + "kpmg", + "kpn", + "kr", + "krd", + "kred", + "kuokgroup", + "kw", + "ky", + "kyknet", + "kyoto", + "kz", + "la", + "lacaixa", + "ladbrokes", + "lamborghini", + "lamer", + "lancaster", + "lancia", + "lancome", + "land", + "landrover", + "lanxess", + "lasalle", + "lat", + "latino", + "latrobe", + "law", + "lawyer", + "lb", + "lc", + "lds", + "lease", + "leclerc", + "lefrak", + "legal", + "lego", + "lexus", + "lgbt", + "li", + "liaison", + "lidl", + "life", + "lifeinsurance", + "lifestyle", + "lighting", + "like", + "lilly", + "limited", + "limo", + "lincoln", + "linde", + "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", + "makeup", + "man", + "management", + "mango", + "market", + "marketing", + "markets", + "marriott", + "marshalls", + "maserati", + "mattel", + "mba", + "mc", + "mcd", + "mcdonalds", + "mckinsey", + "md", + "me", + "med", + "media", + "meet", + "melbourne", + "meme", + "memorial", + "men", + "menu", + "meo", + "metlife", + "mg", + "mh", + "miami", + "microsoft", + "mil", + "mini", + "mint", + "mit", + "mitsubishi", + "mk", + "ml", + "mlb", + "mls", + "mm", + "mma", + "mn", + "mnet", + "mo", + "mobi", + "mobily", + "moda", + "moe", + "moi", + "mom", + "monash", + "money", + "monster", + "montblanc", + "mopar", + "mormon", + "mortgage", + "moscow", + "moto", + "motorcycles", + "mov", + "movie", + "movistar", + "mp", + "mq", + "mr", + "ms", + "msd", + "mt", + "mtn", + "mtpc", + "mtr", + "mu", + "multichoice", + "museum", + "mutual", + "mutuelle", + "mv", + "mw", + "mx", + "my", + "mz", + "mzansimagic", + "na", + "nab", + "nadex", + "nagoya", + "name", + "naspers", + "nationwide", + "natura", + "navy", + "nba", + "nc", + "ne", + "nec", + "net", + "netbank", + "netflix", + "network", + "neustar", + "new", + "newholland", + "news", + "next", + "nextdirect", + "nexus", + "nf", + "nfl", + "ng", + "ngo", + "nhk", + "ni", + "nico", + "nike", + "nikon", + "ninja", + "nissan", + "nissay", + "nl", + "no", + "nokia", + "northwesternmutual", + "norton", + "now", + "nowruz", + "nowtv", + "np", + "nr", + "nra", + "nrw", + "ntt", + "nu", + "nyc", + "nz", + "obi", + "observer", + "off", + "office", + "okinawa", + "olayan", + "olayangroup", + "oldnavy", + "ollo", + "om", + "omega", + "one", + "ong", + "onl", + "online", + "onyourside", + "ooo", + "open", + "oracle", + "orange", + "org", + "organic", + "orientexpress", + "origins", + "osaka", + "otsuka", + "ott", + "ovh", + "pa", + "page", + "pamperedchef", + "panasonic", + "panerai", + "paris", + "pars", + "partners", + "parts", + "party", + "passagens", + "pay", + "payu", + "pccw", + "pe", + "pet", + "pf", + "pfizer", + "pg", + "ph", + "pharmacy", + "philips", + "photo", + "photography", + "photos", + "physio", + "piaget", + "pics", + "pictet", + "pictures", + "pid", + "pin", + "ping", + "pink", + "pioneer", + "pizza", + "pk", + "pl", + "place", + "play", + "playstation", + "plumbing", + "plus", + "pm", + "pn", + "pnc", + "pohl", + "poker", + "politie", + "porn", + "post", + "pr", + "pramerica", + "praxi", + "press", + "prime", + "pro", + "prod", + "productions", + "prof", + "progressive", + "promo", + "properties", + "property", + "protection", + "pru", + "prudential", + "ps", + "pt", + "pub", + "pw", + "pwc", + "py", + "qa", + "qpon", + "quebec", + "quest", + "qvc", + "racing", + "raid", + "re", + "read", + "realestate", + "realtor", + "realty", + "recipes", + "red", + "redstone", + "redumbrella", + "rehab", + "reise", + "reisen", + "reit", + "reliance", + "ren", + "rent", + "rentals", + "repair", + "report", + "republican", + "rest", + "restaurant", + "review", + "reviews", + "rexroth", + "rich", + "richardli", + "ricoh", + "rightathome", + "ril", + "rio", + "rip", + "rmit", + "ro", + "rocher", + "rocks", + "rodeo", + "rogers", + "room", + "rs", + "rsvp", + "ru", + "ruhr", + "run", + "rw", + "rwe", + "ryukyu", + "sa", + "saarland", + "safe", + "safety", + "sakura", + "sale", + "salon", + "samsclub", + "samsung", + "sandvik", + "sandvikcoromant", + "sanofi", + "sap", + "sapo", + "sarl", + "sas", + "save", + "saxo", + "sb", + "sbi", + "sbs", + "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", + "sina", + "singles", + "site", + "sj", + "sk", + "ski", + "skin", + "sky", + "skype", + "sl", + "sling", + "sm", + "smart", + "smile", + "sn", + "sncf", + "so", + "soccer", + "social", + "softbank", + "software", + "sohu", + "solar", + "solutions", + "song", + "sony", + "soy", + "space", + "spiegel", + "spot", + "spreadbetting", + "sr", + "srl", + "srt", + "st", + "stada", + "staples", + "star", + "starhub", + "statebank", + "statefarm", + "statoil", + "stc", + "stcgroup", + "stockholm", + "storage", + "store", + "stream", + "studio", + "study", + "style", + "su", + "sucks", + "supersport", + "supplies", + "supply", + "support", + "surf", + "surgery", + "suzuki", + "sv", + "swatch", + "swiftcover", + "swiss", + "sx", + "sy", + "sydney", + "symantec", + "systems", + "sz", + "tab", + "taipei", + "talk", + "taobao", + "target", + "tatamotors", + "tatar", + "tattoo", + "tax", + "taxi", + "tc", + "tci", + "td", + "tdk", + "team", + "tech", + "technology", + "tel", + "telecity", + "telefonica", + "temasek", + "tennis", + "teva", + "tf", + "tg", + "th", + "thd", + "theater", + "theatre", + "theguardian", + "tiaa", + "tickets", + "tienda", + "tiffany", + "tips", + "tires", + "tirol", + "tj", + "tjmaxx", + "tjx", + "tk", + "tkmaxx", + "tl", + "tm", + "tmall", + "tn", + "to", + "today", + "tokyo", + "tools", + "top", + "toray", + "toshiba", + "total", + "tours", + "town", + "toyota", + "toys", + "tr", + "trade", + "trading", + "training", + "travel", + "travelchannel", + "travelers", + "travelersinsurance", + "trust", + "trv", + "tt", + "tube", + "tui", + "tunes", + "tushu", + "tv", + "tvs", + "tw", + "tz", + "ua", + "ubank", + "ubs", + "uconnect", + "ug", + "uk", + "unicom", + "university", + "uno", + "uol", + "ups", + "us", + "uy", + "uz", + "va", + "vacations", + "vana", + "vanguard", + "vc", + "ve", + "vegas", + "ventures", + "verisign", + "versicherung", + "vet", + "vg", + "vi", + "viajes", + "video", + "vig", + "viking", + "villas", + "vin", + "vip", + "virgin", + "visa", + "vision", + "vista", + "vistaprint", + "viva", + "vivo", + "vlaanderen", + "vn", + "vodka", + "volkswagen", + "volvo", + "vote", + "voting", + "voto", + "voyage", + "vu", + "vuelos", + "wales", + "walmart", + "walter", + "wang", + "wanggou", + "warman", + "watch", + "watches", + "weather", + "weatherchannel", + "webcam", + "weber", + "website", + "wed", + "wedding", + "weibo", + "weir", + "wf", + "whoswho", + "wien", + "wiki", + "williamhill", + "win", + "windows", + "wine", + "winners", + "wme", + "wolterskluwer", + "woodside", + "work", + "works", + "world", + "wow", + "ws", + "wtc", + "wtf", + "xbox", + "xerox", + "xfinity", + "xihuan", + "xin", + "xn--11b4c3d", + "xn--1ck2e1b", + "xn--1qqw23a", + "xn--30rr7y", + "xn--3bst00m", + "xn--3ds443g", + "xn--3e0b707e", + "xn--3oq18vl8pn36a", + "xn--3pxu8k", + "xn--42c2d9a", + "xn--45brj9c", + "xn--45q11c", + "xn--4gbrim", + "xn--4gq48lf9j", + "xn--54b7fta0cc", + "xn--55qw42g", + "xn--55qx5d", + "xn--5su34j936bgsg", + "xn--5tzm5g", + "xn--6frz82g", + "xn--6qq986b3xl", + "xn--80adxhks", + "xn--80ao21a", + "xn--80aqecdr1a", + "xn--80asehdb", + "xn--80aswg", + "xn--8y0a063a", + "xn--90a3ac", + "xn--90ais", + "xn--9dbq2a", + "xn--9et52u", + "xn--9krt00a", + "xn--b4w605ferd", + "xn--bck1b9a5dre4c", + "xn--c1avg", + "xn--c2br7g", + "xn--cck2b3b", + "xn--cg4bki", + "xn--clchc0ea0b2g2a9gcd", + "xn--czr694b", + "xn--czrs0t", + "xn--czru2d", + "xn--d1acj3b", + "xn--d1alf", + "xn--eckvdtc9d", + "xn--efvy88h", + "xn--estv75g", + "xn--fct429k", + "xn--fhbei", + "xn--fiq228c5hs", + "xn--fiq64b", + "xn--fiqs8s", + "xn--fiqz9s", + "xn--fjq720a", + "xn--flw351e", + "xn--fpcrj9c3d", + "xn--fzc2c9e2c", + "xn--fzys8d69uvgm", + "xn--g2xx48c", + "xn--gckr3f0f", + "xn--gecrj9c", + "xn--gk3at1e", + "xn--h2brj9c", + "xn--hxt814e", + "xn--i1b6b1a6a2e", + "xn--imr513n", + "xn--io0a7i", + "xn--j1aef", + "xn--j1amh", + "xn--j6w193g", + "xn--jlq61u9w7b", + "xn--jvr189m", + "xn--kcrx77d1x4a", + "xn--kprw13d", + "xn--kpry57d", + "xn--kpu716f", + "xn--kput3i", + "xn--l1acc", + "xn--lgbbat1ad8j", + "xn--mgb2ddes", + "xn--mgb9awbf", + "xn--mgba3a3ejt", + "xn--mgba3a4f16a", + "xn--mgba3a4fra", + "xn--mgba7c0bbn0a", + "xn--mgbaakc7dvf", + "xn--mgbaam7a8h", + "xn--mgbab2bd", + "xn--mgbai9a5eva00b", + "xn--mgbai9azgqp6j", + "xn--mgbayh7gpa", + "xn--mgbb9fbpob", + "xn--mgbbh1a71e", + "xn--mgbc0a9azcg", + "xn--mgbca7dzdo", + "xn--mgberp4a5d4a87g", + "xn--mgberp4a5d4ar", + "xn--mgbi4ecexp", + "xn--mgbpl2fh", + "xn--mgbqly7c0a67fbc", + "xn--mgbqly7cvafr", + "xn--mgbt3dhd", + "xn--mgbtf8fl", + "xn--mgbtx2b", + "xn--mgbx4cd0ab", + "xn--mix082f", + "xn--mix891f", + "xn--mk1bu44c", + "xn--mxtq1m", + "xn--ngbc5azd", + "xn--ngbe9e0a", + "xn--ngbrx", + "xn--nnx388a", + "xn--node", + "xn--nqv7f", + "xn--nqv7fs00ema", + "xn--nyqy26a", + "xn--o3cw4h", + "xn--ogbpf8fl", + "xn--p1acf", + "xn--p1ai", + "xn--pbt977c", + "xn--pgbs0dh", + "xn--pssy2u", + "xn--q9jyb4c", + "xn--qcka1pmc", + "xn--qxam", + "xn--rhqv96g", + "xn--rovu88b", + "xn--s9brj9c", + "xn--ses554g", + "xn--t60b56a", + "xn--tckwe", + "xn--tiq49xqyj", + "xn--unup4y", + "xn--vermgensberater-ctb", + "xn--vermgensberatung-pwb", + "xn--vhquv", + "xn--vuq861b", + "xn--w4r85el8fhu5dnra", + "xn--w4rs40l", + "xn--wgbh1c", + "xn--wgbl6a", + "xn--xhq521b", + "xn--xkc2al3hye2a", + "xn--xkc2dl3a5ee0h", + "xn--y9a3aq", + "xn--yfro4i67o", + "xn--ygbi2ammx", + "xn--zfr164b", + "xperia", + "xxx", + "xyz", + "yachts", + "yahoo", + "yamaxun", + "yandex", + "ye", + "yodobashi", + "yoga", + "yokohama", + "you", + "youtube", + "yt", + "yun", + "za", + "zappos", + "zara", + "zero", + "zip", + "zippo", + "zm", + "zone", + "zuerich", + "zw", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "nom", + "ac", + "blogspot", + "co", + "gov", + "mil", + "net", + "org", + "sch", + "accident-investigation", + "accident-prevention", + "aerobatic", + "aeroclub", + "aerodrome", + "agents", + "air-surveillance", + "air-traffic-control", + "aircraft", + "airline", + "airport", + "airtraffic", + "ambulance", + "amusement", + "association", + "author", + "ballooning", + "broker", + "caa", + "cargo", + "catering", + "certification", + "championship", + "charter", + "civilaviation", + "club", + "conference", + "consultant", + "consulting", + "control", + "council", + "crew", + "design", + "dgca", + "educator", + "emergency", + "engine", + "engineer", + "entertainment", + "equipment", + "exchange", + "express", + "federation", + "flight", + "freight", + "fuel", + "gliding", + "government", + "groundhandling", + "group", + "hanggliding", + "homebuilt", + "insurance", + "journal", + "journalist", + "leasing", + "logistics", + "magazine", + "maintenance", + "media", + "microlight", + "modelling", + "navigation", + "parachuting", + "paragliding", + "passenger-association", + "pilot", + "press", + "production", + "recreation", + "repbody", + "res", + "research", + "rotorcraft", + "safety", + "scientist", + "services", + "show", + "skydiving", + "software", + "student", + "trader", + "trading", + "trainer", + "union", + "workinggroup", + "works", + "com", + "edu", + "gov", + "net", + "org", + "co", + "com", + "net", + "nom", + "org", + "com", + "net", + "off", + "org", + "blogspot", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "blogspot", + "co", + "ed", + "gv", + "it", + "og", + "pb", + "com", + "edu", + "gob", + "gov", + "int", + "mil", + "net", + "org", + "tur", + "blogspot", + "e164", + "in-addr", + "ip6", + "iris", + "uri", + "urn", + "gov", + "ac", + "biz", + "co", + "gv", + "info", + "or", + "priv", + "blogspot", + "act", + "asn", + "com", + "conf", + "edu", + "gov", + "id", + "info", + "net", + "nsw", + "nt", + "org", + "oz", + "qld", + "sa", + "tas", + "vic", + "wa", + "blogspot", + "act", + "nsw", + "nt", + "qld", + "sa", + "tas", + "vic", + "wa", + "qld", + "sa", + "tas", + "vic", + "wa", + "com", + "biz", + "com", + "edu", + "gov", + "info", + "int", + "mil", + "name", + "net", + "org", + "pp", + "pro", + "blogspot", + "co", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "rs", + "unbi", + "unsa", + "biz", + "co", + "com", + "edu", + "gov", + "info", + "net", + "org", + "store", + "tv", + "ac", + "blogspot", + "gov", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "a", + "b", + "blogspot", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "com", + "edu", + "gov", + "net", + "org", + "co", + "com", + "edu", + "or", + "org", + "dscloud", + "dyndns", + "for-better", + "for-more", + "for-some", + "for-the", + "selfip", + "webhop", + "asso", + "barreau", + "blogspot", + "gouv", + "com", + "edu", + "gov", + "net", + "org", + "com", + "edu", + "gob", + "gov", + "int", + "mil", + "net", + "org", + "tv", + "adm", + "adv", + "agr", + "am", + "arq", + "art", + "ato", + "b", + "bio", + "blog", + "bmd", + "cim", + "cng", + "cnt", + "com", + "coop", + "ecn", + "eco", + "edu", + "emp", + "eng", + "esp", + "etc", + "eti", + "far", + "flog", + "fm", + "fnd", + "fot", + "fst", + "g12", + "ggf", + "gov", + "imb", + "ind", + "inf", + "jor", + "jus", + "leg", + "lel", + "mat", + "med", + "mil", + "mp", + "mus", + "net", + "nom", + "not", + "ntr", + "odo", + "org", + "ppg", + "pro", + "psc", + "psi", + "qsl", + "radio", + "rec", + "slg", + "srv", + "taxi", + "teo", + "tmp", + "trd", + "tur", + "tv", + "vet", + "vlog", + "wiki", + "zlg", + "blogspot", + "com", + "edu", + "gov", + "net", + "org", + "com", + "edu", + "gov", + "net", + "org", + "co", + "org", + "com", + "gov", + "mil", + "of", + "blogspot", + "com", + "edu", + "gov", + "net", + "org", + "za", + "ab", + "bc", + "blogspot", + "co", + "gc", + "mb", + "nb", + "nf", + "nl", + "ns", + "nt", + "nu", + "on", + "pe", + "qc", + "sk", + "yk", + "ftpaccess", + "game-server", + "myphotos", + "scrapping", + "gov", + "blogspot", + "blogspot", + "ac", + "asso", + "co", + "com", + "ed", + "edu", + "go", + "gouv", + "int", + "md", + "net", + "or", + "org", + "presse", + "xn--aroport-bya", + "www", + "blogspot", + "co", + "gob", + "gov", + "mil", + "co", + "com", + "gov", + "net", + "ac", + "ah", + "amazonaws", + "bj", + "com", + "cq", + "edu", + "fj", + "gd", + "gov", + "gs", + "gx", + "gz", + "ha", + "hb", + "he", + "hi", + "hk", + "hl", + "hn", + "jl", + "js", + "jx", + "ln", + "mil", + "mo", + "net", + "nm", + "nx", + "org", + "qh", + "sc", + "sd", + "sh", + "sn", + "sx", + "tj", + "tw", + "xj", + "xn--55qx5d", + "xn--io0a7i", + "xn--od0alg", + "xz", + "yn", + "zj", + "compute", + "cn-north-1", + "amazonaws", + "cn-north-1", + "s3", + "arts", + "com", + "edu", + "firm", + "gov", + "info", + "int", + "mil", + "net", + "nom", + "org", + "rec", + "web", + "blogspot", + "1kapp", + "4u", + "africa", + "amazonaws", + "appspot", + "ar", + "betainabox", + "blogdns", + "blogspot", + "br", + "cechire", + "cloudcontrolapp", + "cloudcontrolled", + "cn", + "co", + "codespot", + "de", + "dnsalias", + "dnsdojo", + "doesntexist", + "dontexist", + "doomdns", + "dreamhosters", + "dsmynas", + "dyn-o-saur", + "dynalias", + "dyndns-at-home", + "dyndns-at-work", + "dyndns-blog", + "dyndns-free", + "dyndns-home", + "dyndns-ip", + "dyndns-mail", + "dyndns-office", + "dyndns-pics", + "dyndns-remote", + "dyndns-server", + "dyndns-web", + "dyndns-wiki", + "dyndns-work", + "elasticbeanstalk", + "est-a-la-maison", + "est-a-la-masion", + "est-le-patron", + "est-mon-blogueur", + "eu", + "familyds", + "fbsbx", + "firebaseapp", + "flynnhub", + "from-ak", + "from-al", + "from-ar", + "from-ca", + "from-ct", + "from-dc", + "from-de", + "from-fl", + "from-ga", + "from-hi", + "from-ia", + "from-id", + "from-il", + "from-in", + "from-ks", + "from-ky", + "from-ma", + "from-md", + "from-mi", + "from-mn", + "from-mo", + "from-ms", + "from-mt", + "from-nc", + "from-nd", + "from-ne", + "from-nh", + "from-nj", + "from-nm", + "from-nv", + "from-oh", + "from-ok", + "from-or", + "from-pa", + "from-pr", + "from-ri", + "from-sc", + "from-sd", + "from-tn", + "from-tx", + "from-ut", + "from-va", + "from-vt", + "from-wa", + "from-wi", + "from-wv", + "from-wy", + "gb", + "getmyip", + "githubcloud", + "githubcloudusercontent", + "githubusercontent", + "googleapis", + "googlecode", + "gotdns", + "gotpantheon", + "gr", + "herokuapp", + "herokussl", + "hk", + "hobby-site", + "homelinux", + "homeunix", + "hu", + "iamallama", + "is-a-anarchist", + "is-a-blogger", + "is-a-bookkeeper", + "is-a-bulls-fan", + "is-a-caterer", + "is-a-chef", + "is-a-conservative", + "is-a-cpa", + "is-a-cubicle-slave", + "is-a-democrat", + "is-a-designer", + "is-a-doctor", + "is-a-financialadvisor", + "is-a-geek", + "is-a-green", + "is-a-guru", + "is-a-hard-worker", + "is-a-hunter", + "is-a-landscaper", + "is-a-lawyer", + "is-a-liberal", + "is-a-libertarian", + "is-a-llama", + "is-a-musician", + "is-a-nascarfan", + "is-a-nurse", + "is-a-painter", + "is-a-personaltrainer", + "is-a-photographer", + "is-a-player", + "is-a-republican", + "is-a-rockstar", + "is-a-socialist", + "is-a-student", + "is-a-teacher", + "is-a-techie", + "is-a-therapist", + "is-an-accountant", + "is-an-actor", + "is-an-actress", + "is-an-anarchist", + "is-an-artist", + "is-an-engineer", + "is-an-entertainer", + "is-certified", + "is-gone", + "is-into-anime", + "is-into-cars", + "is-into-cartoons", + "is-into-games", + "is-leet", + "is-not-certified", + "is-slick", + "is-uberleet", + "is-with-theband", + "isa-geek", + "isa-hockeynut", + "issmarterthanyou", + "jpn", + "kr", + "likes-pie", + "likescandy", + "mex", + "mydrobo", + "neat-url", + "nfshost", + "no", + "operaunite", + "outsystemscloud", + "pagefrontapp", + "pagespeedmobilizer", + "prgmr", + "qa2", + "qc", + "rackmaze", + "rhcloud", + "ro", + "ru", + "sa", + "saves-the-whales", + "se", + "selfip", + "sells-for-less", + "sells-for-u", + "servebbs", + "simple-url", + "sinaapp", + "space-to-rent", + "teaches-yoga", + "uk", + "us", + "uy", + "vipsinaapp", + "withgoogle", + "withyoutube", + "writesthisblog", + "xenapponazure", + "yolasite", + "za", + "ap-northeast-2", + "compute", + "compute-1", + "elb", + "eu-central-1", + "s3", + "s3-ap-northeast-1", + "s3-ap-northeast-2", + "s3-ap-southeast-1", + "s3-ap-southeast-2", + "s3-eu-central-1", + "s3-eu-west-1", + "s3-external-1", + "s3-external-2", + "s3-fips-us-gov-west-1", + "s3-sa-east-1", + "s3-us-gov-west-1", + "s3-us-west-1", + "s3-us-west-2", + "us-east-1", + "s3", + "ap-northeast-1", + "ap-northeast-2", + "ap-southeast-1", + "ap-southeast-2", + "eu-central-1", + "eu-west-1", + "sa-east-1", + "us-gov-west-1", + "us-west-1", + "us-west-2", + "z-1", + "z-2", + "s3", + "apps", + "api", + "ext", + "gist", + "xen", + "ac", + "co", + "ed", + "fi", + "go", + "or", + "sa", + "com", + "edu", + "gov", + "inf", + "net", + "org", + "blogspot", + "com", + "edu", + "net", + "org", + "ath", + "gov", + "ac", + "biz", + "com", + "ekloges", + "gov", + "ltd", + "name", + "net", + "org", + "parliament", + "press", + "pro", + "tm", + "blogspot", + "blogspot", + "co", + "blogspot", + "com", + "fuettertdasnetz", + "isteingeek", + "istmein", + "lebtimnetz", + "leitungsen", + "traeumtgerade", + "blogspot", + "com", + "edu", + "gov", + "net", + "org", + "art", + "com", + "edu", + "gob", + "gov", + "mil", + "net", + "org", + "sld", + "web", + "art", + "asso", + "com", + "edu", + "gov", + "net", + "org", + "pol", + "com", + "edu", + "fin", + "gob", + "gov", + "info", + "k12", + "med", + "mil", + "net", + "org", + "pro", + "aip", + "com", + "edu", + "fie", + "gov", + "lib", + "med", + "org", + "pri", + "riik", + "blogspot", + "com", + "edu", + "eun", + "gov", + "mil", + "name", + "net", + "org", + "sci", + "blogspot", + "com", + "edu", + "gob", + "nom", + "org", + "blogspot", + "biz", + "com", + "edu", + "gov", + "info", + "name", + "net", + "org", + "aland", + "blogspot", + "iki", + "aeroport", + "assedic", + "asso", + "avocat", + "avoues", + "blogspot", + "cci", + "chambagri", + "chirurgiens-dentistes", + "com", + "experts-comptables", + "geometre-expert", + "gouv", + "greta", + "huissier-justice", + "medecin", + "nom", + "notaires", + "pharmacien", + "port", + "prd", + "presse", + "tm", + "veterinaire", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "pvt", + "co", + "net", + "org", + "com", + "edu", + "gov", + "mil", + "org", + "com", + "edu", + "gov", + "ltd", + "mod", + "org", + "co", + "com", + "edu", + "net", + "org", + "ac", + "com", + "edu", + "gov", + "net", + "org", + "asso", + "com", + "edu", + "mobi", + "net", + "org", + "blogspot", + "com", + "edu", + "gov", + "net", + "org", + "com", + "edu", + "gob", + "ind", + "mil", + "net", + "org", + "co", + "com", + "edu", + "gov", + "net", + "org", + "blogspot", + "com", + "edu", + "gov", + "idv", + "inc", + "ltd", + "net", + "org", + "xn--55qx5d", + "xn--ciqpn", + "xn--gmq050i", + "xn--gmqw5a", + "xn--io0a7i", + "xn--lcvr32d", + "xn--mk0axi", + "xn--mxtq1m", + "xn--od0alg", + "xn--od0aq3b", + "xn--tn0ag", + "xn--uc0atv", + "xn--uc0ay4a", + "xn--wcvs22d", + "xn--zf0avx", + "com", + "edu", + "gob", + "mil", + "net", + "org", + "blogspot", + "com", + "from", + "iz", + "name", + "adult", + "art", + "asso", + "com", + "coop", + "edu", + "firm", + "gouv", + "info", + "med", + "net", + "org", + "perso", + "pol", + "pro", + "rel", + "shop", + "2000", + "agrar", + "blogspot", + "bolt", + "casino", + "city", + "co", + "erotica", + "erotika", + "film", + "forum", + "games", + "hotel", + "info", + "ingatlan", + "jogasz", + "konyvelo", + "lakas", + "media", + "news", + "org", + "priv", + "reklam", + "sex", + "shop", + "sport", + "suli", + "szex", + "tm", + "tozsde", + "utazas", + "video", + "ac", + "biz", + "co", + "desa", + "go", + "mil", + "my", + "net", + "or", + "sch", + "web", + "blogspot", + "blogspot", + "gov", + "ac", + "co", + "gov", + "idf", + "k12", + "muni", + "net", + "org", + "blogspot", + "ac", + "co", + "com", + "net", + "org", + "tt", + "tv", + "ltd", + "plc", + "ac", + "blogspot", + "co", + "edu", + "firm", + "gen", + "gov", + "ind", + "mil", + "net", + "nic", + "org", + "res", + "barrel-of-knowledge", + "barrell-of-knowledge", + "dyndns", + "for-our", + "groks-the", + "groks-this", + "here-for-more", + "knowsitall", + "selfip", + "webhop", + "eu", + "com", + "github", + "ngrok", + "nid", + "pantheon", + "sandcats", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "ac", + "co", + "gov", + "id", + "net", + "org", + "sch", + "xn--mgba3a4f16a", + "xn--mgba3a4fra", + "blogspot", + "com", + "cupcake", + "edu", + "gov", + "int", + "net", + "org", + "abr", + "abruzzo", + "ag", + "agrigento", + "al", + "alessandria", + "alto-adige", + "altoadige", + "an", + "ancona", + "andria-barletta-trani", + "andria-trani-barletta", + "andriabarlettatrani", + "andriatranibarletta", + "ao", + "aosta", + "aosta-valley", + "aostavalley", + "aoste", + "ap", + "aq", + "aquila", + "ar", + "arezzo", + "ascoli-piceno", + "ascolipiceno", + "asti", + "at", + "av", + "avellino", + "ba", + "balsan", + "bari", + "barletta-trani-andria", + "barlettatraniandria", + "bas", + "basilicata", + "belluno", + "benevento", + "bergamo", + "bg", + "bi", + "biella", + "bl", + "blogspot", + "bn", + "bo", + "bologna", + "bolzano", + "bozen", + "br", + "brescia", + "brindisi", + "bs", + "bt", + "bz", + "ca", + "cagliari", + "cal", + "calabria", + "caltanissetta", + "cam", + "campania", + "campidano-medio", + "campidanomedio", + "campobasso", + "carbonia-iglesias", + "carboniaiglesias", + "carrara-massa", + "carraramassa", + "caserta", + "catania", + "catanzaro", + "cb", + "ce", + "cesena-forli", + "cesenaforli", + "ch", + "chieti", + "ci", + "cl", + "cn", + "co", + "como", + "cosenza", + "cr", + "cremona", + "crotone", + "cs", + "ct", + "cuneo", + "cz", + "dell-ogliastra", + "dellogliastra", + "edu", + "emilia-romagna", + "emiliaromagna", + "emr", + "en", + "enna", + "fc", + "fe", + "fermo", + "ferrara", + "fg", + "fi", + "firenze", + "florence", + "fm", + "foggia", + "forli-cesena", + "forlicesena", + "fr", + "friuli-v-giulia", + "friuli-ve-giulia", + "friuli-vegiulia", + "friuli-venezia-giulia", + "friuli-veneziagiulia", + "friuli-vgiulia", + "friuliv-giulia", + "friulive-giulia", + "friulivegiulia", + "friulivenezia-giulia", + "friuliveneziagiulia", + "friulivgiulia", + "frosinone", + "fvg", + "ge", + "genoa", + "genova", + "go", + "gorizia", + "gov", + "gr", + "grosseto", + "iglesias-carbonia", + "iglesiascarbonia", + "im", + "imperia", + "is", + "isernia", + "kr", + "la-spezia", + "laquila", + "laspezia", + "latina", + "laz", + "lazio", + "lc", + "le", + "lecce", + "lecco", + "li", + "lig", + "liguria", + "livorno", + "lo", + "lodi", + "lom", + "lombardia", + "lombardy", + "lt", + "lu", + "lucania", + "lucca", + "macerata", + "mantova", + "mar", + "marche", + "massa-carrara", + "massacarrara", + "matera", + "mb", + "mc", + "me", + "medio-campidano", + "mediocampidano", + "messina", + "mi", + "milan", + "milano", + "mn", + "mo", + "modena", + "mol", + "molise", + "monza", + "monza-brianza", + "monza-e-della-brianza", + "monzabrianza", + "monzaebrianza", + "monzaedellabrianza", + "ms", + "mt", + "na", + "naples", + "napoli", + "no", + "novara", + "nu", + "nuoro", + "og", + "ogliastra", + "olbia-tempio", + "olbiatempio", + "or", + "oristano", + "ot", + "pa", + "padova", + "padua", + "palermo", + "parma", + "pavia", + "pc", + "pd", + "pe", + "perugia", + "pesaro-urbino", + "pesarourbino", + "pescara", + "pg", + "pi", + "piacenza", + "piedmont", + "piemonte", + "pisa", + "pistoia", + "pmn", + "pn", + "po", + "pordenone", + "potenza", + "pr", + "prato", + "pt", + "pu", + "pug", + "puglia", + "pv", + "pz", + "ra", + "ragusa", + "ravenna", + "rc", + "re", + "reggio-calabria", + "reggio-emilia", + "reggiocalabria", + "reggioemilia", + "rg", + "ri", + "rieti", + "rimini", + "rm", + "rn", + "ro", + "roma", + "rome", + "rovigo", + "sa", + "salerno", + "sar", + "sardegna", + "sardinia", + "sassari", + "savona", + "si", + "sic", + "sicilia", + "sicily", + "siena", + "siracusa", + "so", + "sondrio", + "sp", + "sr", + "ss", + "suedtirol", + "sv", + "ta", + "taa", + "taranto", + "te", + "tempio-olbia", + "tempioolbia", + "teramo", + "terni", + "tn", + "to", + "torino", + "tos", + "toscana", + "tp", + "tr", + "trani-andria-barletta", + "trani-barletta-andria", + "traniandriabarletta", + "tranibarlettaandria", + "trapani", + "trentino", + "trentino-a-adige", + "trentino-aadige", + "trentino-alto-adige", + "trentino-altoadige", + "trentino-s-tirol", + "trentino-stirol", + "trentino-sud-tirol", + "trentino-sudtirol", + "trentino-sued-tirol", + "trentino-suedtirol", + "trentinoa-adige", + "trentinoaadige", + "trentinoalto-adige", + "trentinoaltoadige", + "trentinos-tirol", + "trentinostirol", + "trentinosud-tirol", + "trentinosudtirol", + "trentinosued-tirol", + "trentinosuedtirol", + "trento", + "treviso", + "trieste", + "ts", + "turin", + "tuscany", + "tv", + "ud", + "udine", + "umb", + "umbria", + "urbino-pesaro", + "urbinopesaro", + "va", + "val-d-aosta", + "val-daosta", + "vald-aosta", + "valdaosta", + "valle-aosta", + "valle-d-aosta", + "valle-daosta", + "valleaosta", + "valled-aosta", + "valledaosta", + "vallee-aoste", + "valleeaoste", + "vao", + "varese", + "vb", + "vc", + "vda", + "ve", + "ven", + "veneto", + "venezia", + "venice", + "verbania", + "vercelli", + "verona", + "vi", + "vibo-valentia", + "vibovalentia", + "vicenza", + "viterbo", + "vr", + "vs", + "vt", + "vv", + "co", + "net", + "org", + "com", + "edu", + "gov", + "mil", + "name", + "net", + "org", + "sch", + "ac", + "ad", + "aichi", + "akita", + "aomori", + "blogspot", + "chiba", + "co", + "ed", + "ehime", + "fukui", + "fukuoka", + "fukushima", + "gifu", + "go", + "gr", + "gunma", + "hiroshima", + "hokkaido", + "hyogo", + "ibaraki", + "ishikawa", + "iwate", + "kagawa", + "kagoshima", + "kanagawa", + "kawasaki", + "kitakyushu", + "kobe", + "kochi", + "kumamoto", + "kyoto", + "lg", + "mie", + "miyagi", + "miyazaki", + "nagano", + "nagasaki", + "nagoya", + "nara", + "ne", + "niigata", + "oita", + "okayama", + "okinawa", + "or", + "osaka", + "saga", + "saitama", + "sapporo", + "sendai", + "shiga", + "shimane", + "shizuoka", + "tochigi", + "tokushima", + "tokyo", + "tottori", + "toyama", + "wakayama", + "xn--0trq7p7nn", + "xn--1ctwo", + "xn--1lqs03n", + "xn--1lqs71d", + "xn--2m4a15e", + "xn--32vp30h", + "xn--4it168d", + "xn--4it797k", + "xn--4pvxs", + "xn--5js045d", + "xn--5rtp49c", + "xn--5rtq34k", + "xn--6btw5a", + "xn--6orx2r", + "xn--7t0a264c", + "xn--8ltr62k", + "xn--8pvr4u", + "xn--c3s14m", + "xn--d5qv7z876c", + "xn--djrs72d6uy", + "xn--djty4k", + "xn--efvn9s", + "xn--ehqz56n", + "xn--elqq16h", + "xn--f6qx53a", + "xn--k7yn95e", + "xn--kbrq7o", + "xn--klt787d", + "xn--kltp7d", + "xn--kltx9a", + "xn--klty5x", + "xn--mkru45i", + "xn--nit225k", + "xn--ntso0iqx3a", + "xn--ntsq17g", + "xn--pssu33l", + "xn--qqqt11m", + "xn--rht27z", + "xn--rht3d", + "xn--rht61e", + "xn--rny31h", + "xn--tor131o", + "xn--uist22h", + "xn--uisz3g", + "xn--uuwu58a", + "xn--vgu402c", + "xn--zbx025d", + "yamagata", + "yamaguchi", + "yamanashi", + "yokohama", + "aisai", + "ama", + "anjo", + "asuke", + "chiryu", + "chita", + "fuso", + "gamagori", + "handa", + "hazu", + "hekinan", + "higashiura", + "ichinomiya", + "inazawa", + "inuyama", + "isshiki", + "iwakura", + "kanie", + "kariya", + "kasugai", + "kira", + "kiyosu", + "komaki", + "konan", + "kota", + "mihama", + "miyoshi", + "nishio", + "nisshin", + "obu", + "oguchi", + "oharu", + "okazaki", + "owariasahi", + "seto", + "shikatsu", + "shinshiro", + "shitara", + "tahara", + "takahama", + "tobishima", + "toei", + "togo", + "tokai", + "tokoname", + "toyoake", + "toyohashi", + "toyokawa", + "toyone", + "toyota", + "tsushima", + "yatomi", + "akita", + "daisen", + "fujisato", + "gojome", + "hachirogata", + "happou", + "higashinaruse", + "honjo", + "honjyo", + "ikawa", + "kamikoani", + "kamioka", + "katagami", + "kazuno", + "kitaakita", + "kosaka", + "kyowa", + "misato", + "mitane", + "moriyoshi", + "nikaho", + "noshiro", + "odate", + "oga", + "ogata", + "semboku", + "yokote", + "yurihonjo", + "aomori", + "gonohe", + "hachinohe", + "hashikami", + "hiranai", + "hirosaki", + "itayanagi", + "kuroishi", + "misawa", + "mutsu", + "nakadomari", + "noheji", + "oirase", + "owani", + "rokunohe", + "sannohe", + "shichinohe", + "shingo", + "takko", + "towada", + "tsugaru", + "tsuruta", + "abiko", + "asahi", + "chonan", + "chosei", + "choshi", + "chuo", + "funabashi", + "futtsu", + "hanamigawa", + "ichihara", + "ichikawa", + "ichinomiya", + "inzai", + "isumi", + "kamagaya", + "kamogawa", + "kashiwa", + "katori", + "katsuura", + "kimitsu", + "kisarazu", + "kozaki", + "kujukuri", + "kyonan", + "matsudo", + "midori", + "mihama", + "minamiboso", + "mobara", + "mutsuzawa", + "nagara", + "nagareyama", + "narashino", + "narita", + "noda", + "oamishirasato", + "omigawa", + "onjuku", + "otaki", + "sakae", + "sakura", + "shimofusa", + "shirako", + "shiroi", + "shisui", + "sodegaura", + "sosa", + "tako", + "tateyama", + "togane", + "tohnosho", + "tomisato", + "urayasu", + "yachimata", + "yachiyo", + "yokaichiba", + "yokoshibahikari", + "yotsukaido", + "ainan", + "honai", + "ikata", + "imabari", + "iyo", + "kamijima", + "kihoku", + "kumakogen", + "masaki", + "matsuno", + "matsuyama", + "namikata", + "niihama", + "ozu", + "saijo", + "seiyo", + "shikokuchuo", + "tobe", + "toon", + "uchiko", + "uwajima", + "yawatahama", + "echizen", + "eiheiji", + "fukui", + "ikeda", + "katsuyama", + "mihama", + "minamiechizen", + "obama", + "ohi", + "ono", + "sabae", + "sakai", + "takahama", + "tsuruga", + "wakasa", + "ashiya", + "buzen", + "chikugo", + "chikuho", + "chikujo", + "chikushino", + "chikuzen", + "chuo", + "dazaifu", + "fukuchi", + "hakata", + "higashi", + "hirokawa", + "hisayama", + "iizuka", + "inatsuki", + "kaho", + "kasuga", + "kasuya", + "kawara", + "keisen", + "koga", + "kurate", + "kurogi", + "kurume", + "minami", + "miyako", + "miyama", + "miyawaka", + "mizumaki", + "munakata", + "nakagawa", + "nakama", + "nishi", + "nogata", + "ogori", + "okagaki", + "okawa", + "oki", + "omuta", + "onga", + "onojo", + "oto", + "saigawa", + "sasaguri", + "shingu", + "shinyoshitomi", + "shonai", + "soeda", + "sue", + "tachiarai", + "tagawa", + "takata", + "toho", + "toyotsu", + "tsuiki", + "ukiha", + "umi", + "usui", + "yamada", + "yame", + "yanagawa", + "yukuhashi", + "aizubange", + "aizumisato", + "aizuwakamatsu", + "asakawa", + "bandai", + "date", + "fukushima", + "furudono", + "futaba", + "hanawa", + "higashi", + "hirata", + "hirono", + "iitate", + "inawashiro", + "ishikawa", + "iwaki", + "izumizaki", + "kagamiishi", + "kaneyama", + "kawamata", + "kitakata", + "kitashiobara", + "koori", + "koriyama", + "kunimi", + "miharu", + "mishima", + "namie", + "nango", + "nishiaizu", + "nishigo", + "okuma", + "omotego", + "ono", + "otama", + "samegawa", + "shimogo", + "shirakawa", + "showa", + "soma", + "sukagawa", + "taishin", + "tamakawa", + "tanagura", + "tenei", + "yabuki", + "yamato", + "yamatsuri", + "yanaizu", + "yugawa", + "anpachi", + "ena", + "gifu", + "ginan", + "godo", + "gujo", + "hashima", + "hichiso", + "hida", + "higashishirakawa", + "ibigawa", + "ikeda", + "kakamigahara", + "kani", + "kasahara", + "kasamatsu", + "kawaue", + "kitagata", + "mino", + "minokamo", + "mitake", + "mizunami", + "motosu", + "nakatsugawa", + "ogaki", + "sakahogi", + "seki", + "sekigahara", + "shirakawa", + "tajimi", + "takayama", + "tarui", + "toki", + "tomika", + "wanouchi", + "yamagata", + "yaotsu", + "yoro", + "annaka", + "chiyoda", + "fujioka", + "higashiagatsuma", + "isesaki", + "itakura", + "kanna", + "kanra", + "katashina", + "kawaba", + "kiryu", + "kusatsu", + "maebashi", + "meiwa", + "midori", + "minakami", + "naganohara", + "nakanojo", + "nanmoku", + "numata", + "oizumi", + "ora", + "ota", + "shibukawa", + "shimonita", + "shinto", + "showa", + "takasaki", + "takayama", + "tamamura", + "tatebayashi", + "tomioka", + "tsukiyono", + "tsumagoi", + "ueno", + "yoshioka", + "asaminami", + "daiwa", + "etajima", + "fuchu", + "fukuyama", + "hatsukaichi", + "higashihiroshima", + "hongo", + "jinsekikogen", + "kaita", + "kui", + "kumano", + "kure", + "mihara", + "miyoshi", + "naka", + "onomichi", + "osakikamijima", + "otake", + "saka", + "sera", + "seranishi", + "shinichi", + "shobara", + "takehara", + "abashiri", + "abira", + "aibetsu", + "akabira", + "akkeshi", + "asahikawa", + "ashibetsu", + "ashoro", + "assabu", + "atsuma", + "bibai", + "biei", + "bifuka", + "bihoro", + "biratori", + "chippubetsu", + "chitose", + "date", + "ebetsu", + "embetsu", + "eniwa", + "erimo", + "esan", + "esashi", + "fukagawa", + "fukushima", + "furano", + "furubira", + "haboro", + "hakodate", + "hamatonbetsu", + "hidaka", + "higashikagura", + "higashikawa", + "hiroo", + "hokuryu", + "hokuto", + "honbetsu", + "horokanai", + "horonobe", + "ikeda", + "imakane", + "ishikari", + "iwamizawa", + "iwanai", + "kamifurano", + "kamikawa", + "kamishihoro", + "kamisunagawa", + "kamoenai", + "kayabe", + "kembuchi", + "kikonai", + "kimobetsu", + "kitahiroshima", + "kitami", + "kiyosato", + "koshimizu", + "kunneppu", + "kuriyama", + "kuromatsunai", + "kushiro", + "kutchan", + "kyowa", + "mashike", + "matsumae", + "mikasa", + "minamifurano", + "mombetsu", + "moseushi", + "mukawa", + "muroran", + "naie", + "nakagawa", + "nakasatsunai", + "nakatombetsu", + "nanae", + "nanporo", + "nayoro", + "nemuro", + "niikappu", + "niki", + "nishiokoppe", + "noboribetsu", + "numata", + "obihiro", + "obira", + "oketo", + "okoppe", + "otaru", + "otobe", + "otofuke", + "otoineppu", + "oumu", + "ozora", + "pippu", + "rankoshi", + "rebun", + "rikubetsu", + "rishiri", + "rishirifuji", + "saroma", + "sarufutsu", + "shakotan", + "shari", + "shibecha", + "shibetsu", + "shikabe", + "shikaoi", + "shimamaki", + "shimizu", + "shimokawa", + "shinshinotsu", + "shintoku", + "shiranuka", + "shiraoi", + "shiriuchi", + "sobetsu", + "sunagawa", + "taiki", + "takasu", + "takikawa", + "takinoue", + "teshikaga", + "tobetsu", + "tohma", + "tomakomai", + "tomari", + "toya", + "toyako", + "toyotomi", + "toyoura", + "tsubetsu", + "tsukigata", + "urakawa", + "urausu", + "uryu", + "utashinai", + "wakkanai", + "wassamu", + "yakumo", + "yoichi", + "aioi", + "akashi", + "ako", + "amagasaki", + "aogaki", + "asago", + "ashiya", + "awaji", + "fukusaki", + "goshiki", + "harima", + "himeji", + "ichikawa", + "inagawa", + "itami", + "kakogawa", + "kamigori", + "kamikawa", + "kasai", + "kasuga", + "kawanishi", + "miki", + "minamiawaji", + "nishinomiya", + "nishiwaki", + "ono", + "sanda", + "sannan", + "sasayama", + "sayo", + "shingu", + "shinonsen", + "shiso", + "sumoto", + "taishi", + "taka", + "takarazuka", + "takasago", + "takino", + "tamba", + "tatsuno", + "toyooka", + "yabu", + "yashiro", + "yoka", + "yokawa", + "ami", + "asahi", + "bando", + "chikusei", + "daigo", + "fujishiro", + "hitachi", + "hitachinaka", + "hitachiomiya", + "hitachiota", + "ibaraki", + "ina", + "inashiki", + "itako", + "iwama", + "joso", + "kamisu", + "kasama", + "kashima", + "kasumigaura", + "koga", + "miho", + "mito", + "moriya", + "naka", + "namegata", + "oarai", + "ogawa", + "omitama", + "ryugasaki", + "sakai", + "sakuragawa", + "shimodate", + "shimotsuma", + "shirosato", + "sowa", + "suifu", + "takahagi", + "tamatsukuri", + "tokai", + "tomobe", + "tone", + "toride", + "tsuchiura", + "tsukuba", + "uchihara", + "ushiku", + "yachiyo", + "yamagata", + "yawara", + "yuki", + "anamizu", + "hakui", + "hakusan", + "kaga", + "kahoku", + "kanazawa", + "kawakita", + "komatsu", + "nakanoto", + "nanao", + "nomi", + "nonoichi", + "noto", + "shika", + "suzu", + "tsubata", + "tsurugi", + "uchinada", + "wajima", + "fudai", + "fujisawa", + "hanamaki", + "hiraizumi", + "hirono", + "ichinohe", + "ichinoseki", + "iwaizumi", + "iwate", + "joboji", + "kamaishi", + "kanegasaki", + "karumai", + "kawai", + "kitakami", + "kuji", + "kunohe", + "kuzumaki", + "miyako", + "mizusawa", + "morioka", + "ninohe", + "noda", + "ofunato", + "oshu", + "otsuchi", + "rikuzentakata", + "shiwa", + "shizukuishi", + "sumita", + "tanohata", + "tono", + "yahaba", + "yamada", + "ayagawa", + "higashikagawa", + "kanonji", + "kotohira", + "manno", + "marugame", + "mitoyo", + "naoshima", + "sanuki", + "tadotsu", + "takamatsu", + "tonosho", + "uchinomi", + "utazu", + "zentsuji", + "akune", + "amami", + "hioki", + "isa", + "isen", + "izumi", + "kagoshima", + "kanoya", + "kawanabe", + "kinko", + "kouyama", + "makurazaki", + "matsumoto", + "minamitane", + "nakatane", + "nishinoomote", + "satsumasendai", + "soo", + "tarumizu", + "yusui", + "aikawa", + "atsugi", + "ayase", + "chigasaki", + "ebina", + "fujisawa", + "hadano", + "hakone", + "hiratsuka", + "isehara", + "kaisei", + "kamakura", + "kiyokawa", + "matsuda", + "minamiashigara", + "miura", + "nakai", + "ninomiya", + "odawara", + "oi", + "oiso", + "sagamihara", + "samukawa", + "tsukui", + "yamakita", + "yamato", + "yokosuka", + "yugawara", + "zama", + "zushi", + "city", + "city", + "city", + "aki", + "geisei", + "hidaka", + "higashitsuno", + "ino", + "kagami", + "kami", + "kitagawa", + "kochi", + "mihara", + "motoyama", + "muroto", + "nahari", + "nakamura", + "nankoku", + "nishitosa", + "niyodogawa", + "ochi", + "okawa", + "otoyo", + "otsuki", + "sakawa", + "sukumo", + "susaki", + "tosa", + "tosashimizu", + "toyo", + "tsuno", + "umaji", + "yasuda", + "yusuhara", + "amakusa", + "arao", + "aso", + "choyo", + "gyokuto", + "hitoyoshi", + "kamiamakusa", + "kashima", + "kikuchi", + "kosa", + "kumamoto", + "mashiki", + "mifune", + "minamata", + "minamioguni", + "nagasu", + "nishihara", + "oguni", + "ozu", + "sumoto", + "takamori", + "uki", + "uto", + "yamaga", + "yamato", + "yatsushiro", + "ayabe", + "fukuchiyama", + "higashiyama", + "ide", + "ine", + "joyo", + "kameoka", + "kamo", + "kita", + "kizu", + "kumiyama", + "kyotamba", + "kyotanabe", + "kyotango", + "maizuru", + "minami", + "minamiyamashiro", + "miyazu", + "muko", + "nagaokakyo", + "nakagyo", + "nantan", + "oyamazaki", + "sakyo", + "seika", + "tanabe", + "uji", + "ujitawara", + "wazuka", + "yamashina", + "yawata", + "asahi", + "inabe", + "ise", + "kameyama", + "kawagoe", + "kiho", + "kisosaki", + "kiwa", + "komono", + "kumano", + "kuwana", + "matsusaka", + "meiwa", + "mihama", + "minamiise", + "misugi", + "miyama", + "nabari", + "shima", + "suzuka", + "tado", + "taiki", + "taki", + "tamaki", + "toba", + "tsu", + "udono", + "ureshino", + "watarai", + "yokkaichi", + "furukawa", + "higashimatsushima", + "ishinomaki", + "iwanuma", + "kakuda", + "kami", + "kawasaki", + "kesennuma", + "marumori", + "matsushima", + "minamisanriku", + "misato", + "murata", + "natori", + "ogawara", + "ohira", + "onagawa", + "osaki", + "rifu", + "semine", + "shibata", + "shichikashuku", + "shikama", + "shiogama", + "shiroishi", + "tagajo", + "taiwa", + "tome", + "tomiya", + "wakuya", + "watari", + "yamamoto", + "zao", + "aya", + "ebino", + "gokase", + "hyuga", + "kadogawa", + "kawaminami", + "kijo", + "kitagawa", + "kitakata", + "kitaura", + "kobayashi", + "kunitomi", + "kushima", + "mimata", + "miyakonojo", + "miyazaki", + "morotsuka", + "nichinan", + "nishimera", + "nobeoka", + "saito", + "shiiba", + "shintomi", + "takaharu", + "takanabe", + "takazaki", + "tsuno", + "achi", + "agematsu", + "anan", + "aoki", + "asahi", + "azumino", + "chikuhoku", + "chikuma", + "chino", + "fujimi", + "hakuba", + "hara", + "hiraya", + "iida", + "iijima", + "iiyama", + "iizuna", + "ikeda", + "ikusaka", + "ina", + "karuizawa", + "kawakami", + "kiso", + "kisofukushima", + "kitaaiki", + "komagane", + "komoro", + "matsukawa", + "matsumoto", + "miasa", + "minamiaiki", + "minamimaki", + "minamiminowa", + "minowa", + "miyada", + "miyota", + "mochizuki", + "nagano", + "nagawa", + "nagiso", + "nakagawa", + "nakano", + "nozawaonsen", + "obuse", + "ogawa", + "okaya", + "omachi", + "omi", + "ookuwa", + "ooshika", + "otaki", + "otari", + "sakae", + "sakaki", + "saku", + "sakuho", + "shimosuwa", + "shinanomachi", + "shiojiri", + "suwa", + "suzaka", + "takagi", + "takamori", + "takayama", + "tateshina", + "tatsuno", + "togakushi", + "togura", + "tomi", + "ueda", + "wada", + "yamagata", + "yamanouchi", + "yasaka", + "yasuoka", + "chijiwa", + "futsu", + "goto", + "hasami", + "hirado", + "iki", + "isahaya", + "kawatana", + "kuchinotsu", + "matsuura", + "nagasaki", + "obama", + "omura", + "oseto", + "saikai", + "sasebo", + "seihi", + "shimabara", + "shinkamigoto", + "togitsu", + "tsushima", + "unzen", + "city", + "ando", + "gose", + "heguri", + "higashiyoshino", + "ikaruga", + "ikoma", + "kamikitayama", + "kanmaki", + "kashiba", + "kashihara", + "katsuragi", + "kawai", + "kawakami", + "kawanishi", + "koryo", + "kurotaki", + "mitsue", + "miyake", + "nara", + "nosegawa", + "oji", + "ouda", + "oyodo", + "sakurai", + "sango", + "shimoichi", + "shimokitayama", + "shinjo", + "soni", + "takatori", + "tawaramoto", + "tenkawa", + "tenri", + "uda", + "yamatokoriyama", + "yamatotakada", + "yamazoe", + "yoshino", + "aga", + "agano", + "gosen", + "itoigawa", + "izumozaki", + "joetsu", + "kamo", + "kariwa", + "kashiwazaki", + "minamiuonuma", + "mitsuke", + "muika", + "murakami", + "myoko", + "nagaoka", + "niigata", + "ojiya", + "omi", + "sado", + "sanjo", + "seiro", + "seirou", + "sekikawa", + "shibata", + "tagami", + "tainai", + "tochio", + "tokamachi", + "tsubame", + "tsunan", + "uonuma", + "yahiko", + "yoita", + "yuzawa", + "beppu", + "bungoono", + "bungotakada", + "hasama", + "hiji", + "himeshima", + "hita", + "kamitsue", + "kokonoe", + "kuju", + "kunisaki", + "kusu", + "oita", + "saiki", + "taketa", + "tsukumi", + "usa", + "usuki", + "yufu", + "akaiwa", + "asakuchi", + "bizen", + "hayashima", + "ibara", + "kagamino", + "kasaoka", + "kibichuo", + "kumenan", + "kurashiki", + "maniwa", + "misaki", + "nagi", + "niimi", + "nishiawakura", + "okayama", + "satosho", + "setouchi", + "shinjo", + "shoo", + "soja", + "takahashi", + "tamano", + "tsuyama", + "wake", + "yakage", + "aguni", + "ginowan", + "ginoza", + "gushikami", + "haebaru", + "higashi", + "hirara", + "iheya", + "ishigaki", + "ishikawa", + "itoman", + "izena", + "kadena", + "kin", + "kitadaito", + "kitanakagusuku", + "kumejima", + "kunigami", + "minamidaito", + "motobu", + "nago", + "naha", + "nakagusuku", + "nakijin", + "nanjo", + "nishihara", + "ogimi", + "okinawa", + "onna", + "shimoji", + "taketomi", + "tarama", + "tokashiki", + "tomigusuku", + "tonaki", + "urasoe", + "uruma", + "yaese", + "yomitan", + "yonabaru", + "yonaguni", + "zamami", + "abeno", + "chihayaakasaka", + "chuo", + "daito", + "fujiidera", + "habikino", + "hannan", + "higashiosaka", + "higashisumiyoshi", + "higashiyodogawa", + "hirakata", + "ibaraki", + "ikeda", + "izumi", + "izumiotsu", + "izumisano", + "kadoma", + "kaizuka", + "kanan", + "kashiwara", + "katano", + "kawachinagano", + "kishiwada", + "kita", + "kumatori", + "matsubara", + "minato", + "minoh", + "misaki", + "moriguchi", + "neyagawa", + "nishi", + "nose", + "osakasayama", + "sakai", + "sayama", + "sennan", + "settsu", + "shijonawate", + "shimamoto", + "suita", + "tadaoka", + "taishi", + "tajiri", + "takaishi", + "takatsuki", + "tondabayashi", + "toyonaka", + "toyono", + "yao", + "ariake", + "arita", + "fukudomi", + "genkai", + "hamatama", + "hizen", + "imari", + "kamimine", + "kanzaki", + "karatsu", + "kashima", + "kitagata", + "kitahata", + "kiyama", + "kouhoku", + "kyuragi", + "nishiarita", + "ogi", + "omachi", + "ouchi", + "saga", + "shiroishi", + "taku", + "tara", + "tosu", + "yoshinogari", + "arakawa", + "asaka", + "chichibu", + "fujimi", + "fujimino", + "fukaya", + "hanno", + "hanyu", + "hasuda", + "hatogaya", + "hatoyama", + "hidaka", + "higashichichibu", + "higashimatsuyama", + "honjo", + "ina", + "iruma", + "iwatsuki", + "kamiizumi", + "kamikawa", + "kamisato", + "kasukabe", + "kawagoe", + "kawaguchi", + "kawajima", + "kazo", + "kitamoto", + "koshigaya", + "kounosu", + "kuki", + "kumagaya", + "matsubushi", + "minano", + "misato", + "miyashiro", + "miyoshi", + "moroyama", + "nagatoro", + "namegawa", + "niiza", + "ogano", + "ogawa", + "ogose", + "okegawa", + "omiya", + "otaki", + "ranzan", + "ryokami", + "saitama", + "sakado", + "satte", + "sayama", + "shiki", + "shiraoka", + "soka", + "sugito", + "toda", + "tokigawa", + "tokorozawa", + "tsurugashima", + "urawa", + "warabi", + "yashio", + "yokoze", + "yono", + "yorii", + "yoshida", + "yoshikawa", + "yoshimi", + "city", + "city", + "aisho", + "gamo", + "higashiomi", + "hikone", + "koka", + "konan", + "kosei", + "koto", + "kusatsu", + "maibara", + "moriyama", + "nagahama", + "nishiazai", + "notogawa", + "omihachiman", + "otsu", + "ritto", + "ryuoh", + "takashima", + "takatsuki", + "torahime", + "toyosato", + "yasu", + "akagi", + "ama", + "gotsu", + "hamada", + "higashiizumo", + "hikawa", + "hikimi", + "izumo", + "kakinoki", + "masuda", + "matsue", + "misato", + "nishinoshima", + "ohda", + "okinoshima", + "okuizumo", + "shimane", + "tamayu", + "tsuwano", + "unnan", + "yakumo", + "yasugi", + "yatsuka", + "arai", + "atami", + "fuji", + "fujieda", + "fujikawa", + "fujinomiya", + "fukuroi", + "gotemba", + "haibara", + "hamamatsu", + "higashiizu", + "ito", + "iwata", + "izu", + "izunokuni", + "kakegawa", + "kannami", + "kawanehon", + "kawazu", + "kikugawa", + "kosai", + "makinohara", + "matsuzaki", + "minamiizu", + "mishima", + "morimachi", + "nishiizu", + "numazu", + "omaezaki", + "shimada", + "shimizu", + "shimoda", + "shizuoka", + "susono", + "yaizu", + "yoshida", + "ashikaga", + "bato", + "haga", + "ichikai", + "iwafune", + "kaminokawa", + "kanuma", + "karasuyama", + "kuroiso", + "mashiko", + "mibu", + "moka", + "motegi", + "nasu", + "nasushiobara", + "nikko", + "nishikata", + "nogi", + "ohira", + "ohtawara", + "oyama", + "sakura", + "sano", + "shimotsuke", + "shioya", + "takanezawa", + "tochigi", + "tsuga", + "ujiie", + "utsunomiya", + "yaita", + "aizumi", + "anan", + "ichiba", + "itano", + "kainan", + "komatsushima", + "matsushige", + "mima", + "minami", + "miyoshi", + "mugi", + "nakagawa", + "naruto", + "sanagochi", + "shishikui", + "tokushima", + "wajiki", + "adachi", + "akiruno", + "akishima", + "aogashima", + "arakawa", + "bunkyo", + "chiyoda", + "chofu", + "chuo", + "edogawa", + "fuchu", + "fussa", + "hachijo", + "hachioji", + "hamura", + "higashikurume", + "higashimurayama", + "higashiyamato", + "hino", + "hinode", + "hinohara", + "inagi", + "itabashi", + "katsushika", + "kita", + "kiyose", + "kodaira", + "koganei", + "kokubunji", + "komae", + "koto", + "kouzushima", + "kunitachi", + "machida", + "meguro", + "minato", + "mitaka", + "mizuho", + "musashimurayama", + "musashino", + "nakano", + "nerima", + "ogasawara", + "okutama", + "ome", + "oshima", + "ota", + "setagaya", + "shibuya", + "shinagawa", + "shinjuku", + "suginami", + "sumida", + "tachikawa", + "taito", + "tama", + "toshima", + "chizu", + "hino", + "kawahara", + "koge", + "kotoura", + "misasa", + "nanbu", + "nichinan", + "sakaiminato", + "tottori", + "wakasa", + "yazu", + "yonago", + "asahi", + "fuchu", + "fukumitsu", + "funahashi", + "himi", + "imizu", + "inami", + "johana", + "kamiichi", + "kurobe", + "nakaniikawa", + "namerikawa", + "nanto", + "nyuzen", + "oyabe", + "taira", + "takaoka", + "tateyama", + "toga", + "tonami", + "toyama", + "unazuki", + "uozu", + "yamada", + "arida", + "aridagawa", + "gobo", + "hashimoto", + "hidaka", + "hirogawa", + "inami", + "iwade", + "kainan", + "kamitonda", + "katsuragi", + "kimino", + "kinokawa", + "kitayama", + "koya", + "koza", + "kozagawa", + "kudoyama", + "kushimoto", + "mihama", + "misato", + "nachikatsuura", + "shingu", + "shirahama", + "taiji", + "tanabe", + "wakayama", + "yuasa", + "yura", + "asahi", + "funagata", + "higashine", + "iide", + "kahoku", + "kaminoyama", + "kaneyama", + "kawanishi", + "mamurogawa", + "mikawa", + "murayama", + "nagai", + "nakayama", + "nanyo", + "nishikawa", + "obanazawa", + "oe", + "oguni", + "ohkura", + "oishida", + "sagae", + "sakata", + "sakegawa", + "shinjo", + "shirataka", + "shonai", + "takahata", + "tendo", + "tozawa", + "tsuruoka", + "yamagata", + "yamanobe", + "yonezawa", + "yuza", + "abu", + "hagi", + "hikari", + "hofu", + "iwakuni", + "kudamatsu", + "mitou", + "nagato", + "oshima", + "shimonoseki", + "shunan", + "tabuse", + "tokuyama", + "toyota", + "ube", + "yuu", + "chuo", + "doshi", + "fuefuki", + "fujikawa", + "fujikawaguchiko", + "fujiyoshida", + "hayakawa", + "hokuto", + "ichikawamisato", + "kai", + "kofu", + "koshu", + "kosuge", + "minami-alps", + "minobu", + "nakamichi", + "nanbu", + "narusawa", + "nirasaki", + "nishikatsura", + "oshino", + "otsuki", + "showa", + "tabayama", + "tsuru", + "uenohara", + "yamanakako", + "yamanashi", + "city", + "co", + "blogspot", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "biz", + "com", + "edu", + "gov", + "info", + "net", + "org", + "ass", + "asso", + "com", + "coop", + "edu", + "gouv", + "gov", + "medecin", + "mil", + "nom", + "notaires", + "org", + "pharmaciens", + "prd", + "presse", + "tm", + "veterinaire", + "edu", + "gov", + "net", + "org", + "com", + "edu", + "gov", + "org", + "rep", + "tra", + "ac", + "blogspot", + "busan", + "chungbuk", + "chungnam", + "co", + "daegu", + "daejeon", + "es", + "gangwon", + "go", + "gwangju", + "gyeongbuk", + "gyeonggi", + "gyeongnam", + "hs", + "incheon", + "jeju", + "jeonbuk", + "jeonnam", + "kg", + "mil", + "ms", + "ne", + "or", + "pe", + "re", + "sc", + "seoul", + "ulsan", + "com", + "edu", + "gov", + "net", + "org", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "c", + "com", + "edu", + "gov", + "info", + "int", + "net", + "org", + "per", + "com", + "edu", + "gov", + "net", + "org", + "co", + "com", + "edu", + "gov", + "net", + "org", + "blogspot", + "ac", + "assn", + "com", + "edu", + "gov", + "grp", + "hotel", + "int", + "ltd", + "net", + "ngo", + "org", + "sch", + "soc", + "web", + "com", + "edu", + "gov", + "net", + "org", + "co", + "org", + "blogspot", + "gov", + "blogspot", + "asn", + "com", + "conf", + "edu", + "gov", + "id", + "mil", + "net", + "org", + "com", + "edu", + "gov", + "id", + "med", + "net", + "org", + "plc", + "sch", + "ac", + "co", + "gov", + "net", + "org", + "press", + "asso", + "tm", + "blogspot", + "ac", + "co", + "diskstation", + "dscloud", + "edu", + "gov", + "i234", + "its", + "myds", + "net", + "org", + "priv", + "synology", + "co", + "com", + "edu", + "gov", + "mil", + "nom", + "org", + "prd", + "tm", + "blogspot", + "com", + "edu", + "gov", + "inf", + "name", + "net", + "org", + "com", + "edu", + "gouv", + "gov", + "net", + "org", + "presse", + "edu", + "gov", + "nyc", + "org", + "com", + "edu", + "gov", + "net", + "org", + "dscloud", + "blogspot", + "gov", + "com", + "edu", + "gov", + "net", + "org", + "com", + "edu", + "net", + "org", + "blogspot", + "ac", + "co", + "com", + "gov", + "net", + "or", + "org", + "academy", + "agriculture", + "air", + "airguard", + "alabama", + "alaska", + "amber", + "ambulance", + "american", + "americana", + "americanantiques", + "americanart", + "amsterdam", + "and", + "annefrank", + "anthro", + "anthropology", + "antiques", + "aquarium", + "arboretum", + "archaeological", + "archaeology", + "architecture", + "art", + "artanddesign", + "artcenter", + "artdeco", + "arteducation", + "artgallery", + "arts", + "artsandcrafts", + "asmatart", + "assassination", + "assisi", + "association", + "astronomy", + "atlanta", + "austin", + "australia", + "automotive", + "aviation", + "axis", + "badajoz", + "baghdad", + "bahn", + "bale", + "baltimore", + "barcelona", + "baseball", + "basel", + "baths", + "bauern", + "beauxarts", + "beeldengeluid", + "bellevue", + "bergbau", + "berkeley", + "berlin", + "bern", + "bible", + "bilbao", + "bill", + "birdart", + "birthplace", + "bonn", + "boston", + "botanical", + "botanicalgarden", + "botanicgarden", + "botany", + "brandywinevalley", + "brasil", + "bristol", + "british", + "britishcolumbia", + "broadcast", + "brunel", + "brussel", + "brussels", + "bruxelles", + "building", + "burghof", + "bus", + "bushey", + "cadaques", + "california", + "cambridge", + "can", + "canada", + "capebreton", + "carrier", + "cartoonart", + "casadelamoneda", + "castle", + "castres", + "celtic", + "center", + "chattanooga", + "cheltenham", + "chesapeakebay", + "chicago", + "children", + "childrens", + "childrensgarden", + "chiropractic", + "chocolate", + "christiansburg", + "cincinnati", + "cinema", + "circus", + "civilisation", + "civilization", + "civilwar", + "clinton", + "clock", + "coal", + "coastaldefence", + "cody", + "coldwar", + "collection", + "colonialwilliamsburg", + "coloradoplateau", + "columbia", + "columbus", + "communication", + "communications", + "community", + "computer", + "computerhistory", + "contemporary", + "contemporaryart", + "convent", + "copenhagen", + "corporation", + "corvette", + "costume", + "countryestate", + "county", + "crafts", + "cranbrook", + "creation", + "cultural", + "culturalcenter", + "culture", + "cyber", + "cymru", + "dali", + "dallas", + "database", + "ddr", + "decorativearts", + "delaware", + "delmenhorst", + "denmark", + "depot", + "design", + "detroit", + "dinosaur", + "discovery", + "dolls", + "donostia", + "durham", + "eastafrica", + "eastcoast", + "education", + "educational", + "egyptian", + "eisenbahn", + "elburg", + "elvendrell", + "embroidery", + "encyclopedic", + "england", + "entomology", + "environment", + "environmentalconservation", + "epilepsy", + "essex", + "estate", + "ethnology", + "exeter", + "exhibition", + "family", + "farm", + "farmequipment", + "farmers", + "farmstead", + "field", + "figueres", + "filatelia", + "film", + "fineart", + "finearts", + "finland", + "flanders", + "florida", + "force", + "fortmissoula", + "fortworth", + "foundation", + "francaise", + "frankfurt", + "franziskaner", + "freemasonry", + "freiburg", + "fribourg", + "frog", + "fundacio", + "furniture", + "gallery", + "garden", + "gateway", + "geelvinck", + "gemological", + "geology", + "georgia", + "giessen", + "glas", + "glass", + "gorge", + "grandrapids", + "graz", + "guernsey", + "halloffame", + "hamburg", + "handson", + "harvestcelebration", + "hawaii", + "health", + "heimatunduhren", + "hellas", + "helsinki", + "hembygdsforbund", + "heritage", + "histoire", + "historical", + "historicalsociety", + "historichouses", + "historisch", + "historisches", + "history", + "historyofscience", + "horology", + "house", + "humanities", + "illustration", + "imageandsound", + "indian", + "indiana", + "indianapolis", + "indianmarket", + "intelligence", + "interactive", + "iraq", + "iron", + "isleofman", + "jamison", + "jefferson", + "jerusalem", + "jewelry", + "jewish", + "jewishart", + "jfk", + "journalism", + "judaica", + "judygarland", + "juedisches", + "juif", + "karate", + "karikatur", + "kids", + "koebenhavn", + "koeln", + "kunst", + "kunstsammlung", + "kunstunddesign", + "labor", + "labour", + "lajolla", + "lancashire", + "landes", + "lans", + "larsson", + "lewismiller", + "lincoln", + "linz", + "living", + "livinghistory", + "localhistory", + "london", + "losangeles", + "louvre", + "loyalist", + "lucerne", + "luxembourg", + "luzern", + "mad", + "madrid", + "mallorca", + "manchester", + "mansion", + "mansions", + "manx", + "marburg", + "maritime", + "maritimo", + "maryland", + "marylhurst", + "media", + "medical", + "medizinhistorisches", + "meeres", + "memorial", + "mesaverde", + "michigan", + "midatlantic", + "military", + "mill", + "miners", + "mining", + "minnesota", + "missile", + "missoula", + "modern", + "moma", + "money", + "monmouth", + "monticello", + "montreal", + "moscow", + "motorcycle", + "muenchen", + "muenster", + "mulhouse", + "muncie", + "museet", + "museumcenter", + "museumvereniging", + "music", + "national", + "nationalfirearms", + "nationalheritage", + "nativeamerican", + "naturalhistory", + "naturalhistorymuseum", + "naturalsciences", + "nature", + "naturhistorisches", + "natuurwetenschappen", + "naumburg", + "naval", + "nebraska", + "neues", + "newhampshire", + "newjersey", + "newmexico", + "newport", + "newspaper", + "newyork", + "niepce", + "norfolk", + "north", + "nrw", + "nuernberg", + "nuremberg", + "nyc", + "nyny", + "oceanographic", + "oceanographique", + "omaha", + "online", + "ontario", + "openair", + "oregon", + "oregontrail", + "otago", + "oxford", + "pacific", + "paderborn", + "palace", + "paleo", + "palmsprings", + "panama", + "paris", + "pasadena", + "pharmacy", + "philadelphia", + "philadelphiaarea", + "philately", + "phoenix", + "photography", + "pilots", + "pittsburgh", + "planetarium", + "plantation", + "plants", + "plaza", + "portal", + "portland", + "portlligat", + "posts-and-telecommunications", + "preservation", + "presidio", + "press", + "project", + "public", + "pubol", + "quebec", + "railroad", + "railway", + "research", + "resistance", + "riodejaneiro", + "rochester", + "rockart", + "roma", + "russia", + "saintlouis", + "salem", + "salvadordali", + "salzburg", + "sandiego", + "sanfrancisco", + "santabarbara", + "santacruz", + "santafe", + "saskatchewan", + "satx", + "savannahga", + "schlesisches", + "schoenbrunn", + "schokoladen", + "school", + "schweiz", + "science", + "science-fiction", + "scienceandhistory", + "scienceandindustry", + "sciencecenter", + "sciencecenters", + "sciencehistory", + "sciences", + "sciencesnaturelles", + "scotland", + "seaport", + "settlement", + "settlers", + "shell", + "sherbrooke", + "sibenik", + "silk", + "ski", + "skole", + "society", + "sologne", + "soundandvision", + "southcarolina", + "southwest", + "space", + "spy", + "square", + "stadt", + "stalbans", + "starnberg", + "state", + "stateofdelaware", + "station", + "steam", + "steiermark", + "stjohn", + "stockholm", + "stpetersburg", + "stuttgart", + "suisse", + "surgeonshall", + "surrey", + "svizzera", + "sweden", + "sydney", + "tank", + "tcm", + "technology", + "telekommunikation", + "television", + "texas", + "textile", + "theater", + "time", + "timekeeping", + "topology", + "torino", + "touch", + "town", + "transport", + "tree", + "trolley", + "trust", + "trustee", + "uhren", + "ulm", + "undersea", + "university", + "usa", + "usantiques", + "usarts", + "uscountryestate", + "usculture", + "usdecorativearts", + "usgarden", + "ushistory", + "ushuaia", + "uslivinghistory", + "utah", + "uvic", + "valley", + "vantaa", + "versailles", + "viking", + "village", + "virginia", + "virtual", + "virtuel", + "vlaanderen", + "volkenkunde", + "wales", + "wallonie", + "war", + "washingtondc", + "watch-and-clock", + "watchandclock", + "western", + "westfalen", + "whaling", + "wildlife", + "williamsburg", + "windmill", + "workshop", + "xn--9dbhblg6di", + "xn--comunicaes-v6a2o", + "xn--correios-e-telecomunicaes-ghc29a", + "xn--h1aegh", + "xn--lns-qla", + "york", + "yorkshire", + "yosemite", + "youth", + "zoological", + "zoology", + "aero", + "biz", + "com", + "coop", + "edu", + "gov", + "info", + "int", + "mil", + "museum", + "name", + "net", + "org", + "pro", + "ac", + "biz", + "co", + "com", + "coop", + "edu", + "gov", + "int", + "museum", + "net", + "org", + "blogspot", + "com", + "edu", + "gob", + "net", + "org", + "blogspot", + "com", + "edu", + "gov", + "mil", + "name", + "net", + "org", + "teledata", + "ca", + "cc", + "co", + "com", + "dr", + "in", + "info", + "mobi", + "mx", + "name", + "or", + "org", + "pro", + "school", + "tv", + "us", + "ws", + "her", + "his", + "forgot", + "forgot", + "asso", + "at-band-camp", + "azure-mobile", + "azurewebsites", + "blogdns", + "broke-it", + "buyshouses", + "cdn77", + "cdn77-ssl", + "cloudapp", + "cloudfront", + "cloudfunctions", + "dnsalias", + "dnsdojo", + "does-it", + "dontexist", + "dsmynas", + "dynalias", + "dynathome", + "dynv6", + "endofinternet", + "familyds", + "fastly", + "from-az", + "from-co", + "from-la", + "from-ny", + "gb", + "gets-it", + "ham-radio-op", + "homeftp", + "homeip", + "homelinux", + "homeunix", + "hu", + "in", + "in-the-band", + "is-a-chef", + "is-a-geek", + "isa-geek", + "jp", + "kicks-ass", + "office-on-the", + "podzone", + "rackmaze", + "scrapper-site", + "se", + "selfip", + "sells-it", + "servebbs", + "serveftp", + "thruhere", + "uk", + "webhop", + "za", + "r", + "prod", + "ssl", + "a", + "global", + "a", + "b", + "global", + "arts", + "com", + "firm", + "info", + "net", + "other", + "per", + "rec", + "store", + "web", + "com", + "edu", + "gov", + "i", + "mil", + "mobi", + "name", + "net", + "org", + "sch", + "blogspot", + "ac", + "biz", + "co", + "com", + "edu", + "gob", + "in", + "info", + "int", + "mil", + "net", + "nom", + "org", + "web", + "blogspot", + "bv", + "co", + "aa", + "aarborte", + "aejrie", + "afjord", + "agdenes", + "ah", + "akershus", + "aknoluokta", + "akrehamn", + "al", + "alaheadju", + "alesund", + "algard", + "alstahaug", + "alta", + "alvdal", + "amli", + "amot", + "andasuolo", + "andebu", + "andoy", + "ardal", + "aremark", + "arendal", + "arna", + "aseral", + "asker", + "askim", + "askoy", + "askvoll", + "asnes", + "audnedaln", + "aukra", + "aure", + "aurland", + "aurskog-holand", + "austevoll", + "austrheim", + "averoy", + "badaddja", + "bahcavuotna", + "bahccavuotna", + "baidar", + "bajddar", + "balat", + "balestrand", + "ballangen", + "balsfjord", + "bamble", + "bardu", + "barum", + "batsfjord", + "bearalvahki", + "beardu", + "beiarn", + "berg", + "bergen", + "berlevag", + "bievat", + "bindal", + "birkenes", + "bjarkoy", + "bjerkreim", + "bjugn", + "blogspot", + "bodo", + "bokn", + "bomlo", + "bremanger", + "bronnoy", + "bronnoysund", + "brumunddal", + "bryne", + "bu", + "budejju", + "buskerud", + "bygland", + "bykle", + "cahcesuolo", + "co", + "davvenjarga", + "davvesiida", + "deatnu", + "dep", + "dielddanuorri", + "divtasvuodna", + "divttasvuotna", + "donna", + "dovre", + "drammen", + "drangedal", + "drobak", + "dyroy", + "egersund", + "eid", + "eidfjord", + "eidsberg", + "eidskog", + "eidsvoll", + "eigersund", + "elverum", + "enebakk", + "engerdal", + "etne", + "etnedal", + "evenassi", + "evenes", + "evje-og-hornnes", + "farsund", + "fauske", + "fedje", + "fet", + "fetsund", + "fhs", + "finnoy", + "fitjar", + "fjaler", + "fjell", + "fla", + "flakstad", + "flatanger", + "flekkefjord", + "flesberg", + "flora", + "floro", + "fm", + "folkebibl", + "folldal", + "forde", + "forsand", + "fosnes", + "frana", + "fredrikstad", + "frei", + "frogn", + "froland", + "frosta", + "froya", + "fuoisku", + "fuossko", + "fusa", + "fylkesbibl", + "fyresdal", + "gaivuotna", + "galsa", + "gamvik", + "gangaviika", + "gaular", + "gausdal", + "giehtavuoatna", + "gildeskal", + "giske", + "gjemnes", + "gjerdrum", + "gjerstad", + "gjesdal", + "gjovik", + "gloppen", + "gol", + "gran", + "grane", + "granvin", + "gratangen", + "grimstad", + "grong", + "grue", + "gulen", + "guovdageaidnu", + "ha", + "habmer", + "hadsel", + "hagebostad", + "halden", + "halsa", + "hamar", + "hamaroy", + "hammarfeasta", + "hammerfest", + "hapmir", + "haram", + "hareid", + "harstad", + "hasvik", + "hattfjelldal", + "haugesund", + "hedmark", + "hemne", + "hemnes", + "hemsedal", + "herad", + "hitra", + "hjartdal", + "hjelmeland", + "hl", + "hm", + "hobol", + "hof", + "hokksund", + "hol", + "hole", + "holmestrand", + "holtalen", + "honefoss", + "hordaland", + "hornindal", + "horten", + "hoyanger", + "hoylandet", + "hurdal", + "hurum", + "hvaler", + "hyllestad", + "ibestad", + "idrett", + "inderoy", + "iveland", + "ivgu", + "jan-mayen", + "jessheim", + "jevnaker", + "jolster", + "jondal", + "jorpeland", + "kafjord", + "karasjohka", + "karasjok", + "karlsoy", + "karmoy", + "kautokeino", + "kirkenes", + "klabu", + "klepp", + "kommune", + "kongsberg", + "kongsvinger", + "kopervik", + "kraanghke", + "kragero", + "kristiansand", + "kristiansund", + "krodsherad", + "krokstadelva", + "kvafjord", + "kvalsund", + "kvam", + "kvanangen", + "kvinesdal", + "kvinnherad", + "kviteseid", + "kvitsoy", + "laakesvuemie", + "lahppi", + "langevag", + "lardal", + "larvik", + "lavagis", + "lavangen", + "leangaviika", + "lebesby", + "leikanger", + "leirfjord", + "leirvik", + "leka", + "leksvik", + "lenvik", + "lerdal", + "lesja", + "levanger", + "lier", + "lierne", + "lillehammer", + "lillesand", + "lindas", + "lindesnes", + "loabat", + "lodingen", + "lom", + "loppa", + "lorenskog", + "loten", + "lund", + "lunner", + "luroy", + "luster", + "lyngdal", + "lyngen", + "malatvuopmi", + "malselv", + "malvik", + "mandal", + "marker", + "marnardal", + "masfjorden", + "masoy", + "matta-varjjat", + "meland", + "meldal", + "melhus", + "meloy", + "meraker", + "midsund", + "midtre-gauldal", + "mil", + "mjondalen", + "mo-i-rana", + "moareke", + "modalen", + "modum", + "molde", + "more-og-romsdal", + "mosjoen", + "moskenes", + "moss", + "mosvik", + "mr", + "muosat", + "museum", + "naamesjevuemie", + "namdalseid", + "namsos", + "namsskogan", + "nannestad", + "naroy", + "narviika", + "narvik", + "naustdal", + "navuotna", + "nedre-eiker", + "nesna", + "nesodden", + "nesoddtangen", + "nesseby", + "nesset", + "nissedal", + "nittedal", + "nl", + "nord-aurdal", + "nord-fron", + "nord-odal", + "norddal", + "nordkapp", + "nordland", + "nordre-land", + "nordreisa", + "nore-og-uvdal", + "notodden", + "notteroy", + "nt", + "odda", + "of", + "oksnes", + "ol", + "omasvuotna", + "oppdal", + "oppegard", + "orkanger", + "orkdal", + "orland", + "orskog", + "orsta", + "osen", + "oslo", + "osoyro", + "osteroy", + "ostfold", + "ostre-toten", + "overhalla", + "ovre-eiker", + "oyer", + "oygarden", + "oystre-slidre", + "porsanger", + "porsangu", + "porsgrunn", + "priv", + "rade", + "radoy", + "rahkkeravju", + "raholt", + "raisa", + "rakkestad", + "ralingen", + "rana", + "randaberg", + "rauma", + "rendalen", + "rennebu", + "rennesoy", + "rindal", + "ringebu", + "ringerike", + "ringsaker", + "risor", + "rissa", + "rl", + "roan", + "rodoy", + "rollag", + "romsa", + "romskog", + "roros", + "rost", + "royken", + "royrvik", + "ruovat", + "rygge", + "salangen", + "salat", + "saltdal", + "samnanger", + "sandefjord", + "sandnes", + "sandnessjoen", + "sandoy", + "sarpsborg", + "sauda", + "sauherad", + "sel", + "selbu", + "selje", + "seljord", + "sf", + "siellak", + "sigdal", + "siljan", + "sirdal", + "skanit", + "skanland", + "skaun", + "skedsmo", + "skedsmokorset", + "ski", + "skien", + "skierva", + "skiptvet", + "skjak", + "skjervoy", + "skodje", + "slattum", + "smola", + "snaase", + "snasa", + "snillfjord", + "snoasa", + "sogndal", + "sogne", + "sokndal", + "sola", + "solund", + "somna", + "sondre-land", + "songdalen", + "sor-aurdal", + "sor-fron", + "sor-odal", + "sor-varanger", + "sorfold", + "sorreisa", + "sortland", + "sorum", + "spjelkavik", + "spydeberg", + "st", + "stange", + "stat", + "stathelle", + "stavanger", + "stavern", + "steigen", + "steinkjer", + "stjordal", + "stjordalshalsen", + "stokke", + "stor-elvdal", + "stord", + "stordal", + "storfjord", + "strand", + "stranda", + "stryn", + "sula", + "suldal", + "sund", + "sunndal", + "surnadal", + "svalbard", + "sveio", + "svelvik", + "sykkylven", + "tana", + "tananger", + "telemark", + "time", + "tingvoll", + "tinn", + "tjeldsund", + "tjome", + "tm", + "tokke", + "tolga", + "tonsberg", + "torsken", + "tr", + "trana", + "tranby", + "tranoy", + "troandin", + "trogstad", + "tromsa", + "tromso", + "trondheim", + "trysil", + "tvedestrand", + "tydal", + "tynset", + "tysfjord", + "tysnes", + "tysvar", + "ullensaker", + "ullensvang", + "ulvik", + "unjarga", + "utsira", + "va", + "vaapste", + "vadso", + "vaga", + "vagan", + "vagsoy", + "vaksdal", + "valle", + "vang", + "vanylven", + "vardo", + "varggat", + "varoy", + "vefsn", + "vega", + "vegarshei", + "vennesla", + "verdal", + "verran", + "vestby", + "vestfold", + "vestnes", + "vestre-slidre", + "vestre-toten", + "vestvagoy", + "vevelstad", + "vf", + "vgs", + "vik", + "vikna", + "vindafjord", + "voagat", + "volda", + "voss", + "vossevangen", + "xn--andy-ira", + "xn--asky-ira", + "xn--aurskog-hland-jnb", + "xn--avery-yua", + "xn--bdddj-mrabd", + "xn--bearalvhki-y4a", + "xn--berlevg-jxa", + "xn--bhcavuotna-s4a", + "xn--bhccavuotna-k7a", + "xn--bidr-5nac", + "xn--bievt-0qa", + "xn--bjarky-fya", + "xn--bjddar-pta", + "xn--blt-elab", + "xn--bmlo-gra", + "xn--bod-2na", + "xn--brnny-wuac", + "xn--brnnysund-m8ac", + "xn--brum-voa", + "xn--btsfjord-9za", + "xn--davvenjrga-y4a", + "xn--dnna-gra", + "xn--drbak-wua", + "xn--dyry-ira", + "xn--eveni-0qa01ga", + "xn--finny-yua", + "xn--fjord-lra", + "xn--fl-zia", + "xn--flor-jra", + "xn--frde-gra", + "xn--frna-woa", + "xn--frya-hra", + "xn--ggaviika-8ya47h", + "xn--gildeskl-g0a", + "xn--givuotna-8ya", + "xn--gjvik-wua", + "xn--gls-elac", + "xn--h-2fa", + "xn--hbmer-xqa", + "xn--hcesuolo-7ya35b", + "xn--hgebostad-g3a", + "xn--hmmrfeasta-s4ac", + "xn--hnefoss-q1a", + "xn--hobl-ira", + "xn--holtlen-hxa", + "xn--hpmir-xqa", + "xn--hyanger-q1a", + "xn--hylandet-54a", + "xn--indery-fya", + "xn--jlster-bya", + "xn--jrpeland-54a", + "xn--karmy-yua", + "xn--kfjord-iua", + "xn--klbu-woa", + "xn--koluokta-7ya57h", + "xn--krager-gya", + "xn--kranghke-b0a", + "xn--krdsherad-m8a", + "xn--krehamn-dxa", + "xn--krjohka-hwab49j", + "xn--ksnes-uua", + "xn--kvfjord-nxa", + "xn--kvitsy-fya", + "xn--kvnangen-k0a", + "xn--l-1fa", + "xn--laheadju-7ya", + "xn--langevg-jxa", + "xn--ldingen-q1a", + "xn--leagaviika-52b", + "xn--lesund-hua", + "xn--lgrd-poac", + "xn--lhppi-xqa", + "xn--linds-pra", + "xn--loabt-0qa", + "xn--lrdal-sra", + "xn--lrenskog-54a", + "xn--lt-liac", + "xn--lten-gra", + "xn--lury-ira", + "xn--mely-ira", + "xn--merker-kua", + "xn--mjndalen-64a", + "xn--mlatvuopmi-s4a", + "xn--mli-tla", + "xn--mlselv-iua", + "xn--moreke-jua", + "xn--mosjen-eya", + "xn--mot-tla", + "xn--mre-og-romsdal-qqb", + "xn--msy-ula0h", + "xn--mtta-vrjjat-k7af", + "xn--muost-0qa", + "xn--nmesjevuemie-tcba", + "xn--nry-yla5g", + "xn--nttery-byae", + "xn--nvuotna-hwa", + "xn--oppegrd-ixa", + "xn--ostery-fya", + "xn--osyro-wua", + "xn--porsgu-sta26f", + "xn--rady-ira", + "xn--rdal-poa", + "xn--rde-ula", + "xn--rdy-0nab", + "xn--rennesy-v1a", + "xn--rhkkervju-01af", + "xn--rholt-mra", + "xn--risa-5na", + "xn--risr-ira", + "xn--rland-uua", + "xn--rlingen-mxa", + "xn--rmskog-bya", + "xn--rros-gra", + "xn--rskog-uua", + "xn--rst-0na", + "xn--rsta-fra", + "xn--ryken-vua", + "xn--ryrvik-bya", + "xn--s-1fa", + "xn--sandnessjen-ogb", + "xn--sandy-yua", + "xn--seral-lra", + "xn--sgne-gra", + "xn--skierv-uta", + "xn--skjervy-v1a", + "xn--skjk-soa", + "xn--sknit-yqa", + "xn--sknland-fxa", + "xn--slat-5na", + "xn--slt-elab", + "xn--smla-hra", + "xn--smna-gra", + "xn--snase-nra", + "xn--sndre-land-0cb", + "xn--snes-poa", + "xn--snsa-roa", + "xn--sr-aurdal-l8a", + "xn--sr-fron-q1a", + "xn--sr-odal-q1a", + "xn--sr-varanger-ggb", + "xn--srfold-bya", + "xn--srreisa-q1a", + "xn--srum-gra", + "xn--stfold-9xa", + "xn--stjrdal-s1a", + "xn--stjrdalshalsen-sqb", + "xn--stre-toten-zcb", + "xn--tjme-hra", + "xn--tnsberg-q1a", + "xn--trany-yua", + "xn--trgstad-r1a", + "xn--trna-woa", + "xn--troms-zua", + "xn--tysvr-vra", + "xn--unjrga-rta", + "xn--vads-jra", + "xn--vard-jra", + "xn--vegrshei-c0a", + "xn--vestvgy-ixa6o", + "xn--vg-yiab", + "xn--vgan-qoa", + "xn--vgsy-qoa0j", + "xn--vre-eiker-k8a", + "xn--vrggt-xqad", + "xn--vry-yla5g", + "xn--yer-zna", + "xn--ygarden-p1a", + "xn--ystre-slidre-ujb", + "gs", + "gs", + "nes", + "gs", + "nes", + "gs", + "os", + "valer", + "xn--vler-qoa", + "gs", + "gs", + "os", + "gs", + "heroy", + "sande", + "gs", + "gs", + "bo", + "heroy", + "xn--b-5ga", + "xn--hery-ira", + "gs", + "gs", + "gs", + "gs", + "valer", + "gs", + "gs", + "gs", + "gs", + "bo", + "xn--b-5ga", + "gs", + "gs", + "gs", + "sande", + "gs", + "sande", + "xn--hery-ira", + "xn--vler-qoa", + "biz", + "com", + "edu", + "gov", + "info", + "net", + "org", + "merseine", + "mine", + "shacknet", + "ac", + "co", + "cri", + "geek", + "gen", + "govt", + "health", + "iwi", + "kiwi", + "maori", + "mil", + "net", + "org", + "parliament", + "school", + "xn--mori-qsa", + "blogspot", + "co", + "com", + "edu", + "gov", + "med", + "museum", + "net", + "org", + "pro", + "ae", + "blogdns", + "blogsite", + "bmoattachments", + "boldlygoingnowhere", + "cdn77", + "cdn77-secure", + "dnsalias", + "dnsdojo", + "doesntexist", + "dontexist", + "doomdns", + "dsmynas", + "duckdns", + "dvrdns", + "dynalias", + "dyndns", + "endofinternet", + "endoftheinternet", + "eu", + "familyds", + "from-me", + "game-host", + "gotdns", + "hk", + "hobby-site", + "homedns", + "homeftp", + "homelinux", + "homeunix", + "is-a-bruinsfan", + "is-a-candidate", + "is-a-celticsfan", + "is-a-chef", + "is-a-geek", + "is-a-knight", + "is-a-linux-user", + "is-a-patsfan", + "is-a-soxfan", + "is-found", + "is-lost", + "is-saved", + "is-very-bad", + "is-very-evil", + "is-very-good", + "is-very-nice", + "is-very-sweet", + "isa-geek", + "kicks-ass", + "misconfused", + "podzone", + "readmyblog", + "selfip", + "sellsyourhome", + "servebbs", + "serveftp", + "servegame", + "stuff-4-sale", + "us", + "webhop", + "za", + "c", + "rsc", + "origin", + "ssl", + "go", + "home", + "al", + "asso", + "at", + "au", + "be", + "bg", + "ca", + "cd", + "ch", + "cn", + "cy", + "cz", + "de", + "dk", + "edu", + "ee", + "es", + "fi", + "fr", + "gr", + "hr", + "hu", + "ie", + "il", + "in", + "int", + "is", + "it", + "jp", + "kr", + "lt", + "lu", + "lv", + "mc", + "me", + "mk", + "mt", + "my", + "net", + "ng", + "nl", + "no", + "nz", + "paris", + "pl", + "pt", + "q-a", + "ro", + "ru", + "se", + "si", + "sk", + "tr", + "uk", + "us", + "abo", + "ac", + "com", + "edu", + "gob", + "ing", + "med", + "net", + "nom", + "org", + "sld", + "blogspot", + "com", + "edu", + "gob", + "mil", + "net", + "nom", + "org", + "com", + "edu", + "org", + "com", + "edu", + "gov", + "i", + "mil", + "net", + "ngo", + "org", + "biz", + "com", + "edu", + "fam", + "gob", + "gok", + "gon", + "gop", + "gos", + "gov", + "info", + "net", + "org", + "web", + "agro", + "aid", + "art", + "atm", + "augustow", + "auto", + "babia-gora", + "bedzin", + "beskidy", + "bialowieza", + "bialystok", + "bielawa", + "bieszczady", + "biz", + "boleslawiec", + "bydgoszcz", + "bytom", + "cieszyn", + "co", + "com", + "czeladz", + "czest", + "dlugoleka", + "edu", + "elblag", + "elk", + "gda", + "gdansk", + "gdynia", + "gliwice", + "glogow", + "gmina", + "gniezno", + "gorlice", + "gov", + "grajewo", + "gsm", + "ilawa", + "info", + "jaworzno", + "jelenia-gora", + "jgora", + "kalisz", + "karpacz", + "kartuzy", + "kaszuby", + "katowice", + "kazimierz-dolny", + "kepno", + "ketrzyn", + "klodzko", + "kobierzyce", + "kolobrzeg", + "konin", + "konskowola", + "krakow", + "kutno", + "lapy", + "lebork", + "legnica", + "lezajsk", + "limanowa", + "lomza", + "lowicz", + "lubin", + "lukow", + "mail", + "malbork", + "malopolska", + "mazowsze", + "mazury", + "med", + "media", + "miasta", + "mielec", + "mielno", + "mil", + "mragowo", + "naklo", + "net", + "nieruchomosci", + "nom", + "nowaruda", + "nysa", + "olawa", + "olecko", + "olkusz", + "olsztyn", + "opoczno", + "opole", + "org", + "ostroda", + "ostroleka", + "ostrowiec", + "ostrowwlkp", + "pc", + "pila", + "pisz", + "podhale", + "podlasie", + "polkowice", + "pomorskie", + "pomorze", + "powiat", + "poznan", + "priv", + "prochowice", + "pruszkow", + "przeworsk", + "pulawy", + "radom", + "rawa-maz", + "realestate", + "rel", + "rybnik", + "rzeszow", + "sanok", + "sejny", + "sex", + "shop", + "sklep", + "skoczow", + "slask", + "slupsk", + "sopot", + "sos", + "sosnowiec", + "stalowa-wola", + "starachowice", + "stargard", + "suwalki", + "swidnica", + "swiebodzin", + "swinoujscie", + "szczecin", + "szczytno", + "szkola", + "targi", + "tarnobrzeg", + "tgory", + "tm", + "tourism", + "travel", + "turek", + "turystyka", + "tychy", + "ustka", + "walbrzych", + "warmia", + "warszawa", + "waw", + "wegrow", + "wielun", + "wlocl", + "wloclawek", + "wodzislaw", + "wolomin", + "wroc", + "wroclaw", + "zachpomor", + "zagan", + "zakopane", + "zarow", + "zgora", + "zgorzelec", + "ap", + "griw", + "ic", + "is", + "kmpsp", + "konsulat", + "kppsp", + "kwp", + "kwpsp", + "mup", + "mw", + "oirm", + "oum", + "pa", + "pinb", + "piw", + "po", + "psp", + "psse", + "pup", + "rzgw", + "sa", + "sdn", + "sko", + "so", + "sr", + "starostwo", + "ug", + "ugim", + "um", + "umig", + "upow", + "uppo", + "us", + "uw", + "uzs", + "wif", + "wiih", + "winb", + "wios", + "witd", + "wiw", + "wsa", + "wskr", + "wuoz", + "wzmiuw", + "zp", + "co", + "edu", + "gov", + "net", + "org", + "ac", + "biz", + "com", + "edu", + "est", + "gov", + "info", + "isla", + "name", + "net", + "org", + "pro", + "prof", + "aaa", + "aca", + "acct", + "avocat", + "bar", + "cpa", + "eng", + "jur", + "law", + "med", + "recht", + "com", + "edu", + "gov", + "net", + "org", + "plo", + "sec", + "blogspot", + "com", + "edu", + "gov", + "int", + "net", + "nome", + "org", + "publ", + "belau", + "co", + "ed", + "go", + "ne", + "or", + "com", + "coop", + "edu", + "gov", + "mil", + "net", + "org", + "blogspot", + "com", + "edu", + "gov", + "mil", + "name", + "net", + "org", + "sch", + "asso", + "blogspot", + "com", + "nom", + "arts", + "blogspot", + "com", + "firm", + "info", + "nom", + "nt", + "org", + "rec", + "store", + "tm", + "www", + "ac", + "blogspot", + "co", + "edu", + "gov", + "in", + "org", + "ac", + "adygeya", + "altai", + "amur", + "amursk", + "arkhangelsk", + "astrakhan", + "baikal", + "bashkiria", + "belgorod", + "bir", + "blogspot", + "bryansk", + "buryatia", + "cbg", + "chel", + "chelyabinsk", + "chita", + "chukotka", + "chuvashia", + "cmw", + "com", + "dagestan", + "dudinka", + "e-burg", + "edu", + "fareast", + "gov", + "grozny", + "int", + "irkutsk", + "ivanovo", + "izhevsk", + "jamal", + "jar", + "joshkar-ola", + "k-uralsk", + "kalmykia", + "kaluga", + "kamchatka", + "karelia", + "kazan", + "kchr", + "kemerovo", + "khabarovsk", + "khakassia", + "khv", + "kirov", + "kms", + "koenig", + "komi", + "kostroma", + "krasnoyarsk", + "kuban", + "kurgan", + "kursk", + "kustanai", + "kuzbass", + "lipetsk", + "magadan", + "mari", + "mari-el", + "marine", + "mil", + "mordovia", + "msk", + "murmansk", + "mytis", + "nakhodka", + "nalchik", + "net", + "nkz", + "nnov", + "norilsk", + "nov", + "novosibirsk", + "nsk", + "omsk", + "orenburg", + "org", + "oryol", + "oskol", + "palana", + "penza", + "perm", + "pp", + "ptz", + "pyatigorsk", + "rnd", + "rubtsovsk", + "ryazan", + "sakhalin", + "samara", + "saratov", + "simbirsk", + "smolensk", + "snz", + "spb", + "stavropol", + "stv", + "surgut", + "syzran", + "tambov", + "tatarstan", + "test", + "tom", + "tomsk", + "tsaritsyn", + "tsk", + "tula", + "tuva", + "tver", + "tyumen", + "udm", + "udmurtia", + "ulan-ude", + "vdonsk", + "vladikavkaz", + "vladimir", + "vladivostok", + "volgograd", + "vologda", + "voronezh", + "vrn", + "vyatka", + "yakutia", + "yamal", + "yaroslavl", + "yekaterinburg", + "yuzhno-sakhalinsk", + "zgrad", + "ac", + "co", + "com", + "edu", + "gouv", + "gov", + "int", + "mil", + "net", + "com", + "edu", + "gov", + "med", + "net", + "org", + "pub", + "sch", + "com", + "edu", + "gov", + "net", + "org", + "com", + "edu", + "gov", + "net", + "org", + "com", + "edu", + "gov", + "info", + "med", + "net", + "org", + "tv", + "a", + "ac", + "b", + "bd", + "blogspot", + "brand", + "c", + "com", + "d", + "e", + "f", + "fh", + "fhsk", + "fhv", + "g", + "h", + "i", + "k", + "komforb", + "kommunalforbund", + "komvux", + "l", + "lanbib", + "m", + "n", + "naturbruksgymn", + "o", + "org", + "p", + "parti", + "pp", + "press", + "r", + "s", + "t", + "tm", + "u", + "w", + "x", + "y", + "z", + "blogspot", + "com", + "edu", + "gov", + "net", + "org", + "per", + "com", + "gov", + "hashbang", + "mil", + "net", + "org", + "platform", + "blogspot", + "blogspot", + "com", + "edu", + "gov", + "net", + "org", + "art", + "blogspot", + "com", + "edu", + "gouv", + "org", + "perso", + "univ", + "com", + "net", + "org", + "co", + "com", + "consulado", + "edu", + "embaixada", + "gov", + "mil", + "net", + "org", + "principe", + "saotome", + "store", + "adygeya", + "arkhangelsk", + "balashov", + "bashkiria", + "bryansk", + "dagestan", + "grozny", + "ivanovo", + "kalmykia", + "kaluga", + "karelia", + "khakassia", + "krasnodar", + "kurgan", + "lenug", + "mordovia", + "msk", + "murmansk", + "nalchik", + "nov", + "obninsk", + "penza", + "pokrovsk", + "sochi", + "spb", + "togliatti", + "troitsk", + "tula", + "tuva", + "vladikavkaz", + "vladimir", + "vologda", + "com", + "edu", + "gob", + "org", + "red", + "gov", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "ac", + "co", + "org", + "blogspot", + "ac", + "co", + "go", + "in", + "mi", + "net", + "or", + "ac", + "biz", + "co", + "com", + "edu", + "go", + "gov", + "int", + "mil", + "name", + "net", + "nic", + "org", + "test", + "web", + "gov", + "co", + "com", + "edu", + "gov", + "mil", + "net", + "nom", + "org", + "agrinet", + "com", + "defense", + "edunet", + "ens", + "fin", + "gov", + "ind", + "info", + "intl", + "mincom", + "nat", + "net", + "org", + "perso", + "rnrt", + "rns", + "rnu", + "tourism", + "turen", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "av", + "bbs", + "bel", + "biz", + "com", + "dr", + "edu", + "gen", + "gov", + "info", + "k12", + "kep", + "mil", + "name", + "nc", + "net", + "org", + "pol", + "tel", + "tv", + "web", + "blogspot", + "gov", + "aero", + "biz", + "co", + "com", + "coop", + "edu", + "gov", + "info", + "int", + "jobs", + "mobi", + "museum", + "name", + "net", + "org", + "pro", + "travel", + "better-than", + "dyndns", + "on-the-web", + "worse-than", + "blogspot", + "club", + "com", + "ebiz", + "edu", + "game", + "gov", + "idv", + "mil", + "net", + "org", + "xn--czrw28b", + "xn--uc0atv", + "xn--zf0ao64a", + "ac", + "co", + "go", + "hotel", + "info", + "me", + "mil", + "mobi", + "ne", + "or", + "sc", + "tv", + "biz", + "cherkassy", + "cherkasy", + "chernigov", + "chernihiv", + "chernivtsi", + "chernovtsy", + "ck", + "cn", + "co", + "com", + "cr", + "crimea", + "cv", + "dn", + "dnepropetrovsk", + "dnipropetrovsk", + "dominic", + "donetsk", + "dp", + "edu", + "gov", + "if", + "in", + "ivano-frankivsk", + "kh", + "kharkiv", + "kharkov", + "kherson", + "khmelnitskiy", + "khmelnytskyi", + "kiev", + "kirovograd", + "km", + "kr", + "krym", + "ks", + "kv", + "kyiv", + "lg", + "lt", + "lugansk", + "lutsk", + "lv", + "lviv", + "mk", + "mykolaiv", + "net", + "nikolaev", + "od", + "odesa", + "odessa", + "org", + "pl", + "poltava", + "pp", + "rivne", + "rovno", + "rv", + "sb", + "sebastopol", + "sevastopol", + "sm", + "sumy", + "te", + "ternopil", + "uz", + "uzhgorod", + "vinnica", + "vinnytsia", + "vn", + "volyn", + "yalta", + "zaporizhzhe", + "zaporizhzhia", + "zhitomir", + "zhytomyr", + "zp", + "zt", + "ac", + "blogspot", + "co", + "com", + "go", + "ne", + "or", + "org", + "sc", + "ac", + "co", + "gov", + "ltd", + "me", + "net", + "nhs", + "org", + "plc", + "police", + "sch", + "blogspot", + "service", + "ak", + "al", + "ar", + "as", + "az", + "ca", + "co", + "ct", + "dc", + "de", + "dni", + "fed", + "fl", + "ga", + "gu", + "hi", + "ia", + "id", + "il", + "in", + "is-by", + "isa", + "kids", + "ks", + "ky", + "la", + "land-4-sale", + "ma", + "md", + "me", + "mi", + "mn", + "mo", + "ms", + "mt", + "nc", + "nd", + "ne", + "nh", + "nj", + "nm", + "nsn", + "nv", + "ny", + "oh", + "ok", + "or", + "pa", + "pr", + "ri", + "sc", + "sd", + "stuff-4-sale", + "tn", + "tx", + "ut", + "va", + "vi", + "vt", + "wa", + "wi", + "wv", + "wy", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "chtr", + "paroch", + "pvt", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "k12", + "lib", + "cc", + "cc", + "k12", + "lib", + "com", + "edu", + "gub", + "mil", + "net", + "org", + "blogspot", + "co", + "com", + "net", + "org", + "com", + "edu", + "gov", + "mil", + "net", + "org", + "arts", + "co", + "com", + "e12", + "edu", + "firm", + "gob", + "gov", + "info", + "int", + "mil", + "net", + "org", + "rec", + "store", + "tec", + "web", + "co", + "com", + "k12", + "net", + "org", + "ac", + "biz", + "blogspot", + "com", + "edu", + "gov", + "health", + "info", + "int", + "name", + "net", + "org", + "pro", + "com", + "edu", + "net", + "org", + "com", + "dyndns", + "edu", + "gov", + "mypets", + "net", + "org", + "xn--80au", + "xn--90azh", + "xn--c1avg", + "xn--d1at", + "xn--o1ac", + "xn--o1ach", + "ac", + "agric", + "alt", + "co", + "edu", + "gov", + "grondar", + "law", + "mil", + "net", + "ngo", + "nis", + "nom", + "org", + "school", + "tm", + "web", + "blogspot", +} diff --git a/vendor/golang.org/x/net/trace/events.go b/vendor/golang.org/x/net/trace/events.go new file mode 100644 index 0000000000..e66c7e3282 --- /dev/null +++ b/vendor/golang.org/x/net/trace/events.go @@ -0,0 +1,524 @@ +// 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 trace + +import ( + "bytes" + "fmt" + "html/template" + "io" + "log" + "net/http" + "runtime" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "text/tabwriter" + "time" +) + +var eventsTmpl = template.Must(template.New("events").Funcs(template.FuncMap{ + "elapsed": elapsed, + "trimSpace": strings.TrimSpace, +}).Parse(eventsHTML)) + +const maxEventsPerLog = 100 + +type bucket struct { + MaxErrAge time.Duration + String string +} + +var buckets = []bucket{ + {0, "total"}, + {10 * time.Second, "errs<10s"}, + {1 * time.Minute, "errs<1m"}, + {10 * time.Minute, "errs<10m"}, + {1 * time.Hour, "errs<1h"}, + {10 * time.Hour, "errs<10h"}, + {24000 * time.Hour, "errors"}, +} + +// RenderEvents renders the HTML page typically served at /debug/events. +// It does not do any auth checking; see AuthRequest for the default auth check +// used by the handler registered on http.DefaultServeMux. +// req may be nil. +func RenderEvents(w http.ResponseWriter, req *http.Request, sensitive bool) { + now := time.Now() + data := &struct { + Families []string // family names + Buckets []bucket + Counts [][]int // eventLog count per family/bucket + + // Set when a bucket has been selected. + Family string + Bucket int + EventLogs eventLogs + Expanded bool + }{ + Buckets: buckets, + } + + data.Families = make([]string, 0, len(families)) + famMu.RLock() + for name := range families { + data.Families = append(data.Families, name) + } + famMu.RUnlock() + sort.Strings(data.Families) + + // Count the number of eventLogs in each family for each error age. + data.Counts = make([][]int, len(data.Families)) + for i, name := range data.Families { + // TODO(sameer): move this loop under the family lock. + f := getEventFamily(name) + data.Counts[i] = make([]int, len(data.Buckets)) + for j, b := range data.Buckets { + data.Counts[i][j] = f.Count(now, b.MaxErrAge) + } + } + + if req != nil { + var ok bool + data.Family, data.Bucket, ok = parseEventsArgs(req) + if !ok { + // No-op + } else { + data.EventLogs = getEventFamily(data.Family).Copy(now, buckets[data.Bucket].MaxErrAge) + } + if data.EventLogs != nil { + defer data.EventLogs.Free() + sort.Sort(data.EventLogs) + } + if exp, err := strconv.ParseBool(req.FormValue("exp")); err == nil { + data.Expanded = exp + } + } + + famMu.RLock() + defer famMu.RUnlock() + if err := eventsTmpl.Execute(w, data); err != nil { + log.Printf("net/trace: Failed executing template: %v", err) + } +} + +func parseEventsArgs(req *http.Request) (fam string, b int, ok bool) { + fam, bStr := req.FormValue("fam"), req.FormValue("b") + if fam == "" || bStr == "" { + return "", 0, false + } + b, err := strconv.Atoi(bStr) + if err != nil || b < 0 || b >= len(buckets) { + return "", 0, false + } + return fam, b, true +} + +// An EventLog provides a log of events associated with a specific object. +type EventLog interface { + // Printf formats its arguments with fmt.Sprintf and adds the + // result to the event log. + Printf(format string, a ...interface{}) + + // Errorf is like Printf, but it marks this event as an error. + Errorf(format string, a ...interface{}) + + // Finish declares that this event log is complete. + // The event log should not be used after calling this method. + Finish() +} + +// NewEventLog returns a new EventLog with the specified family name +// and title. +func NewEventLog(family, title string) EventLog { + el := newEventLog() + el.ref() + el.Family, el.Title = family, title + el.Start = time.Now() + el.events = make([]logEntry, 0, maxEventsPerLog) + el.stack = make([]uintptr, 32) + n := runtime.Callers(2, el.stack) + el.stack = el.stack[:n] + + getEventFamily(family).add(el) + return el +} + +func (el *eventLog) Finish() { + getEventFamily(el.Family).remove(el) + el.unref() // matches ref in New +} + +var ( + famMu sync.RWMutex + families = make(map[string]*eventFamily) // family name => family +) + +func getEventFamily(fam string) *eventFamily { + famMu.Lock() + defer famMu.Unlock() + f := families[fam] + if f == nil { + f = &eventFamily{} + families[fam] = f + } + return f +} + +type eventFamily struct { + mu sync.RWMutex + eventLogs eventLogs +} + +func (f *eventFamily) add(el *eventLog) { + f.mu.Lock() + f.eventLogs = append(f.eventLogs, el) + f.mu.Unlock() +} + +func (f *eventFamily) remove(el *eventLog) { + f.mu.Lock() + defer f.mu.Unlock() + for i, el0 := range f.eventLogs { + if el == el0 { + copy(f.eventLogs[i:], f.eventLogs[i+1:]) + f.eventLogs = f.eventLogs[:len(f.eventLogs)-1] + return + } + } +} + +func (f *eventFamily) Count(now time.Time, maxErrAge time.Duration) (n int) { + f.mu.RLock() + defer f.mu.RUnlock() + for _, el := range f.eventLogs { + if el.hasRecentError(now, maxErrAge) { + n++ + } + } + return +} + +func (f *eventFamily) Copy(now time.Time, maxErrAge time.Duration) (els eventLogs) { + f.mu.RLock() + defer f.mu.RUnlock() + els = make(eventLogs, 0, len(f.eventLogs)) + for _, el := range f.eventLogs { + if el.hasRecentError(now, maxErrAge) { + el.ref() + els = append(els, el) + } + } + return +} + +type eventLogs []*eventLog + +// Free calls unref on each element of the list. +func (els eventLogs) Free() { + for _, el := range els { + el.unref() + } +} + +// eventLogs may be sorted in reverse chronological order. +func (els eventLogs) Len() int { return len(els) } +func (els eventLogs) Less(i, j int) bool { return els[i].Start.After(els[j].Start) } +func (els eventLogs) Swap(i, j int) { els[i], els[j] = els[j], els[i] } + +// A logEntry is a timestamped log entry in an event log. +type logEntry struct { + When time.Time + Elapsed time.Duration // since previous event in log + NewDay bool // whether this event is on a different day to the previous event + What string + IsErr bool +} + +// WhenString returns a string representation of the elapsed time of the event. +// It will include the date if midnight was crossed. +func (e logEntry) WhenString() string { + if e.NewDay { + return e.When.Format("2006/01/02 15:04:05.000000") + } + return e.When.Format("15:04:05.000000") +} + +// An eventLog represents an active event log. +type eventLog struct { + // Family is the top-level grouping of event logs to which this belongs. + Family string + + // Title is the title of this event log. + Title string + + // Timing information. + Start time.Time + + // Call stack where this event log was created. + stack []uintptr + + // Append-only sequence of events. + // + // TODO(sameer): change this to a ring buffer to avoid the array copy + // when we hit maxEventsPerLog. + mu sync.RWMutex + events []logEntry + LastErrorTime time.Time + discarded int + + refs int32 // how many buckets this is in +} + +func (el *eventLog) reset() { + // Clear all but the mutex. Mutexes may not be copied, even when unlocked. + el.Family = "" + el.Title = "" + el.Start = time.Time{} + el.stack = nil + el.events = nil + el.LastErrorTime = time.Time{} + el.discarded = 0 + el.refs = 0 +} + +func (el *eventLog) hasRecentError(now time.Time, maxErrAge time.Duration) bool { + if maxErrAge == 0 { + return true + } + el.mu.RLock() + defer el.mu.RUnlock() + return now.Sub(el.LastErrorTime) < maxErrAge +} + +// delta returns the elapsed time since the last event or the log start, +// and whether it spans midnight. +// L >= el.mu +func (el *eventLog) delta(t time.Time) (time.Duration, bool) { + if len(el.events) == 0 { + return t.Sub(el.Start), false + } + prev := el.events[len(el.events)-1].When + return t.Sub(prev), prev.Day() != t.Day() + +} + +func (el *eventLog) Printf(format string, a ...interface{}) { + el.printf(false, format, a...) +} + +func (el *eventLog) Errorf(format string, a ...interface{}) { + el.printf(true, format, a...) +} + +func (el *eventLog) printf(isErr bool, format string, a ...interface{}) { + e := logEntry{When: time.Now(), IsErr: isErr, What: fmt.Sprintf(format, a...)} + el.mu.Lock() + e.Elapsed, e.NewDay = el.delta(e.When) + if len(el.events) < maxEventsPerLog { + el.events = append(el.events, e) + } else { + // Discard the oldest event. + if el.discarded == 0 { + // el.discarded starts at two to count for the event it + // is replacing, plus the next one that we are about to + // drop. + el.discarded = 2 + } else { + el.discarded++ + } + // TODO(sameer): if this causes allocations on a critical path, + // change eventLog.What to be a fmt.Stringer, as in trace.go. + el.events[0].What = fmt.Sprintf("(%d events discarded)", el.discarded) + // The timestamp of the discarded meta-event should be + // the time of the last event it is representing. + el.events[0].When = el.events[1].When + copy(el.events[1:], el.events[2:]) + el.events[maxEventsPerLog-1] = e + } + if e.IsErr { + el.LastErrorTime = e.When + } + el.mu.Unlock() +} + +func (el *eventLog) ref() { + atomic.AddInt32(&el.refs, 1) +} + +func (el *eventLog) unref() { + if atomic.AddInt32(&el.refs, -1) == 0 { + freeEventLog(el) + } +} + +func (el *eventLog) When() string { + return el.Start.Format("2006/01/02 15:04:05.000000") +} + +func (el *eventLog) ElapsedTime() string { + elapsed := time.Since(el.Start) + return fmt.Sprintf("%.6f", elapsed.Seconds()) +} + +func (el *eventLog) Stack() string { + buf := new(bytes.Buffer) + tw := tabwriter.NewWriter(buf, 1, 8, 1, '\t', 0) + printStackRecord(tw, el.stack) + tw.Flush() + return buf.String() +} + +// printStackRecord prints the function + source line information +// for a single stack trace. +// Adapted from runtime/pprof/pprof.go. +func printStackRecord(w io.Writer, stk []uintptr) { + for _, pc := range stk { + f := runtime.FuncForPC(pc) + if f == nil { + continue + } + file, line := f.FileLine(pc) + name := f.Name() + // Hide runtime.goexit and any runtime functions at the beginning. + if strings.HasPrefix(name, "runtime.") { + continue + } + fmt.Fprintf(w, "# %s\t%s:%d\n", name, file, line) + } +} + +func (el *eventLog) Events() []logEntry { + el.mu.RLock() + defer el.mu.RUnlock() + return el.events +} + +// freeEventLogs is a freelist of *eventLog +var freeEventLogs = make(chan *eventLog, 1000) + +// newEventLog returns a event log ready to use. +func newEventLog() *eventLog { + select { + case el := <-freeEventLogs: + return el + default: + return new(eventLog) + } +} + +// freeEventLog adds el to freeEventLogs if there's room. +// This is non-blocking. +func freeEventLog(el *eventLog) { + el.reset() + select { + case freeEventLogs <- el: + default: + } +} + +const eventsHTML = ` + + + events + + + + +

    /debug/events

    + +
  • + {{range $i, $fam := .Families}} + + + + {{range $j, $bucket := $.Buckets}} + {{$n := index $.Counts $i $j}} + + {{end}} + + {{end}} +
    {{$fam}} + {{if $n}}{{end}} + [{{$n}} {{$bucket.String}}] + {{if $n}}{{end}} +
    + +{{if $.EventLogs}} +


    +

    Family: {{$.Family}}

    + +{{if $.Expanded}}{{end}} +[Summary]{{if $.Expanded}}{{end}} + +{{if not $.Expanded}}{{end}} +[Expanded]{{if not $.Expanded}}{{end}} + + + + {{range $el := $.EventLogs}} + + + + + {{if $.Expanded}} + + + + + + {{range $el.Events}} + + + + + + {{end}} + {{end}} + {{end}} +
    WhenElapsed
    {{$el.When}}{{$el.ElapsedTime}}{{$el.Title}} +
    {{$el.Stack|trimSpace}}
    {{.WhenString}}{{elapsed .Elapsed}}.{{if .IsErr}}E{{else}}.{{end}}. {{.What}}
    +{{end}} + + +` diff --git a/vendor/golang.org/x/net/trace/histogram.go b/vendor/golang.org/x/net/trace/histogram.go new file mode 100644 index 0000000000..bb42aa5320 --- /dev/null +++ b/vendor/golang.org/x/net/trace/histogram.go @@ -0,0 +1,356 @@ +// 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 trace + +// This file implements histogramming for RPC statistics collection. + +import ( + "bytes" + "fmt" + "html/template" + "log" + "math" + + "golang.org/x/net/internal/timeseries" +) + +const ( + bucketCount = 38 +) + +// histogram keeps counts of values in buckets that are spaced +// out in powers of 2: 0-1, 2-3, 4-7... +// histogram implements timeseries.Observable +type histogram struct { + sum int64 // running total of measurements + sumOfSquares float64 // square of running total + buckets []int64 // bucketed values for histogram + value int // holds a single value as an optimization + valueCount int64 // number of values recorded for single value +} + +// AddMeasurement records a value measurement observation to the histogram. +func (h *histogram) addMeasurement(value int64) { + // TODO: assert invariant + h.sum += value + h.sumOfSquares += float64(value) * float64(value) + + bucketIndex := getBucket(value) + + if h.valueCount == 0 || (h.valueCount > 0 && h.value == bucketIndex) { + h.value = bucketIndex + h.valueCount++ + } else { + h.allocateBuckets() + h.buckets[bucketIndex]++ + } +} + +func (h *histogram) allocateBuckets() { + if h.buckets == nil { + h.buckets = make([]int64, bucketCount) + h.buckets[h.value] = h.valueCount + h.value = 0 + h.valueCount = -1 + } +} + +func log2(i int64) int { + n := 0 + for ; i >= 0x100; i >>= 8 { + n += 8 + } + for ; i > 0; i >>= 1 { + n += 1 + } + return n +} + +func getBucket(i int64) (index int) { + index = log2(i) - 1 + if index < 0 { + index = 0 + } + if index >= bucketCount { + index = bucketCount - 1 + } + return +} + +// Total returns the number of recorded observations. +func (h *histogram) total() (total int64) { + if h.valueCount >= 0 { + total = h.valueCount + } + for _, val := range h.buckets { + total += int64(val) + } + return +} + +// Average returns the average value of recorded observations. +func (h *histogram) average() float64 { + t := h.total() + if t == 0 { + return 0 + } + return float64(h.sum) / float64(t) +} + +// Variance returns the variance of recorded observations. +func (h *histogram) variance() float64 { + t := float64(h.total()) + if t == 0 { + return 0 + } + s := float64(h.sum) / t + return h.sumOfSquares/t - s*s +} + +// StandardDeviation returns the standard deviation of recorded observations. +func (h *histogram) standardDeviation() float64 { + return math.Sqrt(h.variance()) +} + +// PercentileBoundary estimates the value that the given fraction of recorded +// observations are less than. +func (h *histogram) percentileBoundary(percentile float64) int64 { + total := h.total() + + // Corner cases (make sure result is strictly less than Total()) + if total == 0 { + return 0 + } else if total == 1 { + return int64(h.average()) + } + + percentOfTotal := round(float64(total) * percentile) + var runningTotal int64 + + for i := range h.buckets { + value := h.buckets[i] + runningTotal += value + if runningTotal == percentOfTotal { + // We hit an exact bucket boundary. If the next bucket has data, it is a + // good estimate of the value. If the bucket is empty, we interpolate the + // midpoint between the next bucket's boundary and the next non-zero + // bucket. If the remaining buckets are all empty, then we use the + // boundary for the next bucket as the estimate. + j := uint8(i + 1) + min := bucketBoundary(j) + if runningTotal < total { + for h.buckets[j] == 0 { + j++ + } + } + max := bucketBoundary(j) + return min + round(float64(max-min)/2) + } else if runningTotal > percentOfTotal { + // The value is in this bucket. Interpolate the value. + delta := runningTotal - percentOfTotal + percentBucket := float64(value-delta) / float64(value) + bucketMin := bucketBoundary(uint8(i)) + nextBucketMin := bucketBoundary(uint8(i + 1)) + bucketSize := nextBucketMin - bucketMin + return bucketMin + round(percentBucket*float64(bucketSize)) + } + } + return bucketBoundary(bucketCount - 1) +} + +// Median returns the estimated median of the observed values. +func (h *histogram) median() int64 { + return h.percentileBoundary(0.5) +} + +// Add adds other to h. +func (h *histogram) Add(other timeseries.Observable) { + o := other.(*histogram) + if o.valueCount == 0 { + // Other histogram is empty + } else if h.valueCount >= 0 && o.valueCount > 0 && h.value == o.value { + // Both have a single bucketed value, aggregate them + h.valueCount += o.valueCount + } else { + // Two different values necessitate buckets in this histogram + h.allocateBuckets() + if o.valueCount >= 0 { + h.buckets[o.value] += o.valueCount + } else { + for i := range h.buckets { + h.buckets[i] += o.buckets[i] + } + } + } + h.sumOfSquares += o.sumOfSquares + h.sum += o.sum +} + +// Clear resets the histogram to an empty state, removing all observed values. +func (h *histogram) Clear() { + h.buckets = nil + h.value = 0 + h.valueCount = 0 + h.sum = 0 + h.sumOfSquares = 0 +} + +// CopyFrom copies from other, which must be a *histogram, into h. +func (h *histogram) CopyFrom(other timeseries.Observable) { + o := other.(*histogram) + if o.valueCount == -1 { + h.allocateBuckets() + copy(h.buckets, o.buckets) + } + h.sum = o.sum + h.sumOfSquares = o.sumOfSquares + h.value = o.value + h.valueCount = o.valueCount +} + +// Multiply scales the histogram by the specified ratio. +func (h *histogram) Multiply(ratio float64) { + if h.valueCount == -1 { + for i := range h.buckets { + h.buckets[i] = int64(float64(h.buckets[i]) * ratio) + } + } else { + h.valueCount = int64(float64(h.valueCount) * ratio) + } + h.sum = int64(float64(h.sum) * ratio) + h.sumOfSquares = h.sumOfSquares * ratio +} + +// New creates a new histogram. +func (h *histogram) New() timeseries.Observable { + r := new(histogram) + r.Clear() + return r +} + +func (h *histogram) String() string { + return fmt.Sprintf("%d, %f, %d, %d, %v", + h.sum, h.sumOfSquares, h.value, h.valueCount, h.buckets) +} + +// round returns the closest int64 to the argument +func round(in float64) int64 { + return int64(math.Floor(in + 0.5)) +} + +// bucketBoundary returns the first value in the bucket. +func bucketBoundary(bucket uint8) int64 { + if bucket == 0 { + return 0 + } + return 1 << bucket +} + +// bucketData holds data about a specific bucket for use in distTmpl. +type bucketData struct { + Lower, Upper int64 + N int64 + Pct, CumulativePct float64 + GraphWidth int +} + +// data holds data about a Distribution for use in distTmpl. +type data struct { + Buckets []*bucketData + Count, Median int64 + Mean, StandardDeviation float64 +} + +// maxHTMLBarWidth is the maximum width of the HTML bar for visualizing buckets. +const maxHTMLBarWidth = 350.0 + +// newData returns data representing h for use in distTmpl. +func (h *histogram) newData() *data { + // Force the allocation of buckets to simplify the rendering implementation + h.allocateBuckets() + // We scale the bars on the right so that the largest bar is + // maxHTMLBarWidth pixels in width. + maxBucket := int64(0) + for _, n := range h.buckets { + if n > maxBucket { + maxBucket = n + } + } + total := h.total() + barsizeMult := maxHTMLBarWidth / float64(maxBucket) + var pctMult float64 + if total == 0 { + pctMult = 1.0 + } else { + pctMult = 100.0 / float64(total) + } + + buckets := make([]*bucketData, len(h.buckets)) + runningTotal := int64(0) + for i, n := range h.buckets { + if n == 0 { + continue + } + runningTotal += n + var upperBound int64 + if i < bucketCount-1 { + upperBound = bucketBoundary(uint8(i + 1)) + } else { + upperBound = math.MaxInt64 + } + buckets[i] = &bucketData{ + Lower: bucketBoundary(uint8(i)), + Upper: upperBound, + N: n, + Pct: float64(n) * pctMult, + CumulativePct: float64(runningTotal) * pctMult, + GraphWidth: int(float64(n) * barsizeMult), + } + } + return &data{ + Buckets: buckets, + Count: total, + Median: h.median(), + Mean: h.average(), + StandardDeviation: h.standardDeviation(), + } +} + +func (h *histogram) html() template.HTML { + buf := new(bytes.Buffer) + if err := distTmpl.Execute(buf, h.newData()); err != nil { + buf.Reset() + log.Printf("net/trace: couldn't execute template: %v", err) + } + return template.HTML(buf.String()) +} + +// Input: data +var distTmpl = template.Must(template.New("distTmpl").Parse(` + + + + + + + +
    Count: {{.Count}}Mean: {{printf "%.0f" .Mean}}StdDev: {{printf "%.0f" .StandardDeviation}}Median: {{.Median}}
    +
    + +{{range $b := .Buckets}} +{{if $b}} + + + + + + + + + +{{end}} +{{end}} +
    [{{.Lower}},{{.Upper}}){{.N}}{{printf "%#.3f" .Pct}}%{{printf "%#.3f" .CumulativePct}}%
    +`)) diff --git a/vendor/golang.org/x/net/trace/histogram_test.go b/vendor/golang.org/x/net/trace/histogram_test.go new file mode 100644 index 0000000000..d384b9332d --- /dev/null +++ b/vendor/golang.org/x/net/trace/histogram_test.go @@ -0,0 +1,325 @@ +// 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 trace + +import ( + "math" + "testing" +) + +type sumTest struct { + value int64 + sum int64 + sumOfSquares float64 + total int64 +} + +var sumTests = []sumTest{ + {100, 100, 10000, 1}, + {50, 150, 12500, 2}, + {50, 200, 15000, 3}, + {50, 250, 17500, 4}, +} + +type bucketingTest struct { + in int64 + log int + bucket int +} + +var bucketingTests = []bucketingTest{ + {0, 0, 0}, + {1, 1, 0}, + {2, 2, 1}, + {3, 2, 1}, + {4, 3, 2}, + {1000, 10, 9}, + {1023, 10, 9}, + {1024, 11, 10}, + {1000000, 20, 19}, +} + +type multiplyTest struct { + in int64 + ratio float64 + expectedSum int64 + expectedTotal int64 + expectedSumOfSquares float64 +} + +var multiplyTests = []multiplyTest{ + {15, 2.5, 37, 2, 562.5}, + {128, 4.6, 758, 13, 77953.9}, +} + +type percentileTest struct { + fraction float64 + expected int64 +} + +var percentileTests = []percentileTest{ + {0.25, 48}, + {0.5, 96}, + {0.6, 109}, + {0.75, 128}, + {0.90, 205}, + {0.95, 230}, + {0.99, 256}, +} + +func TestSum(t *testing.T) { + var h histogram + + for _, test := range sumTests { + h.addMeasurement(test.value) + sum := h.sum + if sum != test.sum { + t.Errorf("h.Sum = %v WANT: %v", sum, test.sum) + } + + sumOfSquares := h.sumOfSquares + if sumOfSquares != test.sumOfSquares { + t.Errorf("h.SumOfSquares = %v WANT: %v", sumOfSquares, test.sumOfSquares) + } + + total := h.total() + if total != test.total { + t.Errorf("h.Total = %v WANT: %v", total, test.total) + } + } +} + +func TestMultiply(t *testing.T) { + var h histogram + for i, test := range multiplyTests { + h.addMeasurement(test.in) + h.Multiply(test.ratio) + if h.sum != test.expectedSum { + t.Errorf("#%v: h.sum = %v WANT: %v", i, h.sum, test.expectedSum) + } + if h.total() != test.expectedTotal { + t.Errorf("#%v: h.total = %v WANT: %v", i, h.total(), test.expectedTotal) + } + if h.sumOfSquares != test.expectedSumOfSquares { + t.Errorf("#%v: h.SumOfSquares = %v WANT: %v", i, test.expectedSumOfSquares, h.sumOfSquares) + } + } +} + +func TestBucketingFunctions(t *testing.T) { + for _, test := range bucketingTests { + log := log2(test.in) + if log != test.log { + t.Errorf("log2 = %v WANT: %v", log, test.log) + } + + bucket := getBucket(test.in) + if bucket != test.bucket { + t.Errorf("getBucket = %v WANT: %v", bucket, test.bucket) + } + } +} + +func TestAverage(t *testing.T) { + a := new(histogram) + average := a.average() + if average != 0 { + t.Errorf("Average of empty histogram was %v WANT: 0", average) + } + + a.addMeasurement(1) + a.addMeasurement(1) + a.addMeasurement(3) + const expected = float64(5) / float64(3) + average = a.average() + + if !isApproximate(average, expected) { + t.Errorf("Average = %g WANT: %v", average, expected) + } +} + +func TestStandardDeviation(t *testing.T) { + a := new(histogram) + add(a, 10, 1<<4) + add(a, 10, 1<<5) + add(a, 10, 1<<6) + stdDev := a.standardDeviation() + const expected = 19.95 + + if !isApproximate(stdDev, expected) { + t.Errorf("StandardDeviation = %v WANT: %v", stdDev, expected) + } + + // No values + a = new(histogram) + stdDev = a.standardDeviation() + + if !isApproximate(stdDev, 0) { + t.Errorf("StandardDeviation = %v WANT: 0", stdDev) + } + + add(a, 1, 1<<4) + if !isApproximate(stdDev, 0) { + t.Errorf("StandardDeviation = %v WANT: 0", stdDev) + } + + add(a, 10, 1<<4) + if !isApproximate(stdDev, 0) { + t.Errorf("StandardDeviation = %v WANT: 0", stdDev) + } +} + +func TestPercentileBoundary(t *testing.T) { + a := new(histogram) + add(a, 5, 1<<4) + add(a, 10, 1<<6) + add(a, 5, 1<<7) + + for _, test := range percentileTests { + percentile := a.percentileBoundary(test.fraction) + if percentile != test.expected { + t.Errorf("h.PercentileBoundary (fraction=%v) = %v WANT: %v", test.fraction, percentile, test.expected) + } + } +} + +func TestCopyFrom(t *testing.T) { + a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} + b := histogram{6, 36, []int64{2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39}, 5, -1} + + a.CopyFrom(&b) + + if a.String() != b.String() { + t.Errorf("a.String = %s WANT: %s", a.String(), b.String()) + } +} + +func TestClear(t *testing.T) { + a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} + + a.Clear() + + expected := "0, 0.000000, 0, 0, []" + if a.String() != expected { + t.Errorf("a.String = %s WANT %s", a.String(), expected) + } +} + +func TestNew(t *testing.T) { + a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} + b := a.New() + + expected := "0, 0.000000, 0, 0, []" + if b.(*histogram).String() != expected { + t.Errorf("b.(*histogram).String = %s WANT: %s", b.(*histogram).String(), expected) + } +} + +func TestAdd(t *testing.T) { + // The tests here depend on the associativity of addMeasurement and Add. + // Add empty observation + a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} + b := a.New() + + expected := a.String() + a.Add(b) + if a.String() != expected { + t.Errorf("a.String = %s WANT: %s", a.String(), expected) + } + + // Add same bucketed value, no new buckets + c := new(histogram) + d := new(histogram) + e := new(histogram) + c.addMeasurement(12) + d.addMeasurement(11) + e.addMeasurement(12) + e.addMeasurement(11) + c.Add(d) + if c.String() != e.String() { + t.Errorf("c.String = %s WANT: %s", c.String(), e.String()) + } + + // Add bucketed values + f := new(histogram) + g := new(histogram) + h := new(histogram) + f.addMeasurement(4) + f.addMeasurement(12) + f.addMeasurement(100) + g.addMeasurement(18) + g.addMeasurement(36) + g.addMeasurement(255) + h.addMeasurement(4) + h.addMeasurement(12) + h.addMeasurement(100) + h.addMeasurement(18) + h.addMeasurement(36) + h.addMeasurement(255) + f.Add(g) + if f.String() != h.String() { + t.Errorf("f.String = %q WANT: %q", f.String(), h.String()) + } + + // add buckets to no buckets + i := new(histogram) + j := new(histogram) + k := new(histogram) + j.addMeasurement(18) + j.addMeasurement(36) + j.addMeasurement(255) + k.addMeasurement(18) + k.addMeasurement(36) + k.addMeasurement(255) + i.Add(j) + if i.String() != k.String() { + t.Errorf("i.String = %q WANT: %q", i.String(), k.String()) + } + + // add buckets to single value (no overlap) + l := new(histogram) + m := new(histogram) + n := new(histogram) + l.addMeasurement(0) + m.addMeasurement(18) + m.addMeasurement(36) + m.addMeasurement(255) + n.addMeasurement(0) + n.addMeasurement(18) + n.addMeasurement(36) + n.addMeasurement(255) + l.Add(m) + if l.String() != n.String() { + t.Errorf("l.String = %q WANT: %q", l.String(), n.String()) + } + + // mixed order + o := new(histogram) + p := new(histogram) + o.addMeasurement(0) + o.addMeasurement(2) + o.addMeasurement(0) + p.addMeasurement(0) + p.addMeasurement(0) + p.addMeasurement(2) + if o.String() != p.String() { + t.Errorf("o.String = %q WANT: %q", o.String(), p.String()) + } +} + +func add(h *histogram, times int, val int64) { + for i := 0; i < times; i++ { + h.addMeasurement(val) + } +} + +func isApproximate(x, y float64) bool { + return math.Abs(x-y) < 1e-2 +} diff --git a/vendor/golang.org/x/net/trace/trace.go b/vendor/golang.org/x/net/trace/trace.go new file mode 100644 index 0000000000..dd67007d5b --- /dev/null +++ b/vendor/golang.org/x/net/trace/trace.go @@ -0,0 +1,1062 @@ +// 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 trace implements tracing of requests and long-lived objects. +It exports HTTP interfaces on /debug/requests and /debug/events. + +A trace.Trace provides tracing for short-lived objects, usually requests. +A request handler might be implemented like this: + + func fooHandler(w http.ResponseWriter, req *http.Request) { + tr := trace.New("mypkg.Foo", req.URL.Path) + defer tr.Finish() + ... + tr.LazyPrintf("some event %q happened", str) + ... + if err := somethingImportant(); err != nil { + tr.LazyPrintf("somethingImportant failed: %v", err) + tr.SetError() + } + } + +The /debug/requests HTTP endpoint organizes the traces by family, +errors, and duration. It also provides histogram of request duration +for each family. + +A trace.EventLog provides tracing for long-lived objects, such as RPC +connections. + + // A Fetcher fetches URL paths for a single domain. + type Fetcher struct { + domain string + events trace.EventLog + } + + func NewFetcher(domain string) *Fetcher { + return &Fetcher{ + domain, + trace.NewEventLog("mypkg.Fetcher", domain), + } + } + + func (f *Fetcher) Fetch(path string) (string, error) { + resp, err := http.Get("http://" + f.domain + "/" + path) + if err != nil { + f.events.Errorf("Get(%q) = %v", path, err) + return "", err + } + f.events.Printf("Get(%q) = %s", path, resp.Status) + ... + } + + func (f *Fetcher) Close() error { + f.events.Finish() + return nil + } + +The /debug/events HTTP endpoint organizes the event logs by family and +by time since the last error. The expanded view displays recent log +entries and the log's call stack. +*/ +package trace // import "golang.org/x/net/trace" + +import ( + "bytes" + "fmt" + "html/template" + "io" + "log" + "net" + "net/http" + "runtime" + "sort" + "strconv" + "sync" + "sync/atomic" + "time" + + "golang.org/x/net/context" + "golang.org/x/net/internal/timeseries" +) + +// DebugUseAfterFinish controls whether to debug uses of Trace values after finishing. +// FOR DEBUGGING ONLY. This will slow down the program. +var DebugUseAfterFinish = false + +// AuthRequest determines whether a specific request is permitted to load the +// /debug/requests or /debug/events pages. +// +// It returns two bools; the first indicates whether the page may be viewed at all, +// and the second indicates whether sensitive events will be shown. +// +// AuthRequest may be replaced by a program to customise its authorisation requirements. +// +// The default AuthRequest function returns (true, true) iff the request comes from localhost/127.0.0.1/[::1]. +var AuthRequest = func(req *http.Request) (any, sensitive bool) { + // RemoteAddr is commonly in the form "IP" or "IP:port". + // If it is in the form "IP:port", split off the port. + host, _, err := net.SplitHostPort(req.RemoteAddr) + if err != nil { + host = req.RemoteAddr + } + switch host { + case "localhost", "127.0.0.1", "::1": + return true, true + default: + return false, false + } +} + +func init() { + http.HandleFunc("/debug/requests", func(w http.ResponseWriter, req *http.Request) { + any, sensitive := AuthRequest(req) + if !any { + http.Error(w, "not allowed", http.StatusUnauthorized) + return + } + w.Header().Set("Content-Type", "text/html; charset=utf-8") + Render(w, req, sensitive) + }) + http.HandleFunc("/debug/events", func(w http.ResponseWriter, req *http.Request) { + any, sensitive := AuthRequest(req) + if !any { + http.Error(w, "not allowed", http.StatusUnauthorized) + return + } + w.Header().Set("Content-Type", "text/html; charset=utf-8") + RenderEvents(w, req, sensitive) + }) +} + +// Render renders the HTML page typically served at /debug/requests. +// It does not do any auth checking; see AuthRequest for the default auth check +// used by the handler registered on http.DefaultServeMux. +// req may be nil. +func Render(w io.Writer, req *http.Request, sensitive bool) { + data := &struct { + Families []string + ActiveTraceCount map[string]int + CompletedTraces map[string]*family + + // Set when a bucket has been selected. + Traces traceList + Family string + Bucket int + Expanded bool + Traced bool + Active bool + ShowSensitive bool // whether to show sensitive events + + Histogram template.HTML + HistogramWindow string // e.g. "last minute", "last hour", "all time" + + // If non-zero, the set of traces is a partial set, + // and this is the total number. + Total int + }{ + CompletedTraces: completedTraces, + } + + data.ShowSensitive = sensitive + if req != nil { + // Allow show_sensitive=0 to force hiding of sensitive data for testing. + // This only goes one way; you can't use show_sensitive=1 to see things. + if req.FormValue("show_sensitive") == "0" { + data.ShowSensitive = false + } + + if exp, err := strconv.ParseBool(req.FormValue("exp")); err == nil { + data.Expanded = exp + } + if exp, err := strconv.ParseBool(req.FormValue("rtraced")); err == nil { + data.Traced = exp + } + } + + completedMu.RLock() + data.Families = make([]string, 0, len(completedTraces)) + for fam := range completedTraces { + data.Families = append(data.Families, fam) + } + completedMu.RUnlock() + sort.Strings(data.Families) + + // We are careful here to minimize the time spent locking activeMu, + // since that lock is required every time an RPC starts and finishes. + data.ActiveTraceCount = make(map[string]int, len(data.Families)) + activeMu.RLock() + for fam, s := range activeTraces { + data.ActiveTraceCount[fam] = s.Len() + } + activeMu.RUnlock() + + var ok bool + data.Family, data.Bucket, ok = parseArgs(req) + switch { + case !ok: + // No-op + case data.Bucket == -1: + data.Active = true + n := data.ActiveTraceCount[data.Family] + data.Traces = getActiveTraces(data.Family) + if len(data.Traces) < n { + data.Total = n + } + case data.Bucket < bucketsPerFamily: + if b := lookupBucket(data.Family, data.Bucket); b != nil { + data.Traces = b.Copy(data.Traced) + } + default: + if f := getFamily(data.Family, false); f != nil { + var obs timeseries.Observable + f.LatencyMu.RLock() + switch o := data.Bucket - bucketsPerFamily; o { + case 0: + obs = f.Latency.Minute() + data.HistogramWindow = "last minute" + case 1: + obs = f.Latency.Hour() + data.HistogramWindow = "last hour" + case 2: + obs = f.Latency.Total() + data.HistogramWindow = "all time" + } + f.LatencyMu.RUnlock() + if obs != nil { + data.Histogram = obs.(*histogram).html() + } + } + } + + if data.Traces != nil { + defer data.Traces.Free() + sort.Sort(data.Traces) + } + + completedMu.RLock() + defer completedMu.RUnlock() + if err := pageTmpl.ExecuteTemplate(w, "Page", data); err != nil { + log.Printf("net/trace: Failed executing template: %v", err) + } +} + +func parseArgs(req *http.Request) (fam string, b int, ok bool) { + if req == nil { + return "", 0, false + } + fam, bStr := req.FormValue("fam"), req.FormValue("b") + if fam == "" || bStr == "" { + return "", 0, false + } + b, err := strconv.Atoi(bStr) + if err != nil || b < -1 { + return "", 0, false + } + + return fam, b, true +} + +func lookupBucket(fam string, b int) *traceBucket { + f := getFamily(fam, false) + if f == nil || b < 0 || b >= len(f.Buckets) { + return nil + } + return f.Buckets[b] +} + +type contextKeyT string + +var contextKey = contextKeyT("golang.org/x/net/trace.Trace") + +// NewContext returns a copy of the parent context +// and associates it with a Trace. +func NewContext(ctx context.Context, tr Trace) context.Context { + return context.WithValue(ctx, contextKey, tr) +} + +// FromContext returns the Trace bound to the context, if any. +func FromContext(ctx context.Context) (tr Trace, ok bool) { + tr, ok = ctx.Value(contextKey).(Trace) + return +} + +// Trace represents an active request. +type Trace interface { + // LazyLog adds x to the event log. It will be evaluated each time the + // /debug/requests page is rendered. Any memory referenced by x will be + // pinned until the trace is finished and later discarded. + LazyLog(x fmt.Stringer, sensitive bool) + + // LazyPrintf evaluates its arguments with fmt.Sprintf each time the + // /debug/requests page is rendered. Any memory referenced by a will be + // pinned until the trace is finished and later discarded. + LazyPrintf(format string, a ...interface{}) + + // SetError declares that this trace resulted in an error. + SetError() + + // SetRecycler sets a recycler for the trace. + // f will be called for each event passed to LazyLog at a time when + // it is no longer required, whether while the trace is still active + // and the event is discarded, or when a completed trace is discarded. + SetRecycler(f func(interface{})) + + // SetTraceInfo sets the trace info for the trace. + // This is currently unused. + SetTraceInfo(traceID, spanID uint64) + + // SetMaxEvents sets the maximum number of events that will be stored + // in the trace. This has no effect if any events have already been + // added to the trace. + SetMaxEvents(m int) + + // Finish declares that this trace is complete. + // The trace should not be used after calling this method. + Finish() +} + +type lazySprintf struct { + format string + a []interface{} +} + +func (l *lazySprintf) String() string { + return fmt.Sprintf(l.format, l.a...) +} + +// New returns a new Trace with the specified family and title. +func New(family, title string) Trace { + tr := newTrace() + tr.ref() + tr.Family, tr.Title = family, title + tr.Start = time.Now() + tr.events = make([]event, 0, maxEventsPerTrace) + + activeMu.RLock() + s := activeTraces[tr.Family] + activeMu.RUnlock() + if s == nil { + activeMu.Lock() + s = activeTraces[tr.Family] // check again + if s == nil { + s = new(traceSet) + activeTraces[tr.Family] = s + } + activeMu.Unlock() + } + s.Add(tr) + + // Trigger allocation of the completed trace structure for this family. + // This will cause the family to be present in the request page during + // the first trace of this family. We don't care about the return value, + // nor is there any need for this to run inline, so we execute it in its + // own goroutine, but only if the family isn't allocated yet. + completedMu.RLock() + if _, ok := completedTraces[tr.Family]; !ok { + go allocFamily(tr.Family) + } + completedMu.RUnlock() + + return tr +} + +func (tr *trace) Finish() { + tr.Elapsed = time.Now().Sub(tr.Start) + if DebugUseAfterFinish { + buf := make([]byte, 4<<10) // 4 KB should be enough + n := runtime.Stack(buf, false) + tr.finishStack = buf[:n] + } + + activeMu.RLock() + m := activeTraces[tr.Family] + activeMu.RUnlock() + m.Remove(tr) + + f := getFamily(tr.Family, true) + for _, b := range f.Buckets { + if b.Cond.match(tr) { + b.Add(tr) + } + } + // Add a sample of elapsed time as microseconds to the family's timeseries + h := new(histogram) + h.addMeasurement(tr.Elapsed.Nanoseconds() / 1e3) + f.LatencyMu.Lock() + f.Latency.Add(h) + f.LatencyMu.Unlock() + + tr.unref() // matches ref in New +} + +const ( + bucketsPerFamily = 9 + tracesPerBucket = 10 + maxActiveTraces = 20 // Maximum number of active traces to show. + maxEventsPerTrace = 10 + numHistogramBuckets = 38 +) + +var ( + // The active traces. + activeMu sync.RWMutex + activeTraces = make(map[string]*traceSet) // family -> traces + + // Families of completed traces. + completedMu sync.RWMutex + completedTraces = make(map[string]*family) // family -> traces +) + +type traceSet struct { + mu sync.RWMutex + m map[*trace]bool + + // We could avoid the entire map scan in FirstN by having a slice of all the traces + // ordered by start time, and an index into that from the trace struct, with a periodic + // repack of the slice after enough traces finish; we could also use a skip list or similar. + // However, that would shift some of the expense from /debug/requests time to RPC time, + // which is probably the wrong trade-off. +} + +func (ts *traceSet) Len() int { + ts.mu.RLock() + defer ts.mu.RUnlock() + return len(ts.m) +} + +func (ts *traceSet) Add(tr *trace) { + ts.mu.Lock() + if ts.m == nil { + ts.m = make(map[*trace]bool) + } + ts.m[tr] = true + ts.mu.Unlock() +} + +func (ts *traceSet) Remove(tr *trace) { + ts.mu.Lock() + delete(ts.m, tr) + ts.mu.Unlock() +} + +// FirstN returns the first n traces ordered by time. +func (ts *traceSet) FirstN(n int) traceList { + ts.mu.RLock() + defer ts.mu.RUnlock() + + if n > len(ts.m) { + n = len(ts.m) + } + trl := make(traceList, 0, n) + + // Fast path for when no selectivity is needed. + if n == len(ts.m) { + for tr := range ts.m { + tr.ref() + trl = append(trl, tr) + } + sort.Sort(trl) + return trl + } + + // Pick the oldest n traces. + // This is inefficient. See the comment in the traceSet struct. + for tr := range ts.m { + // Put the first n traces into trl in the order they occur. + // When we have n, sort trl, and thereafter maintain its order. + if len(trl) < n { + tr.ref() + trl = append(trl, tr) + if len(trl) == n { + // This is guaranteed to happen exactly once during this loop. + sort.Sort(trl) + } + continue + } + if tr.Start.After(trl[n-1].Start) { + continue + } + + // Find where to insert this one. + tr.ref() + i := sort.Search(n, func(i int) bool { return trl[i].Start.After(tr.Start) }) + trl[n-1].unref() + copy(trl[i+1:], trl[i:]) + trl[i] = tr + } + + return trl +} + +func getActiveTraces(fam string) traceList { + activeMu.RLock() + s := activeTraces[fam] + activeMu.RUnlock() + if s == nil { + return nil + } + return s.FirstN(maxActiveTraces) +} + +func getFamily(fam string, allocNew bool) *family { + completedMu.RLock() + f := completedTraces[fam] + completedMu.RUnlock() + if f == nil && allocNew { + f = allocFamily(fam) + } + return f +} + +func allocFamily(fam string) *family { + completedMu.Lock() + defer completedMu.Unlock() + f := completedTraces[fam] + if f == nil { + f = newFamily() + completedTraces[fam] = f + } + return f +} + +// family represents a set of trace buckets and associated latency information. +type family struct { + // traces may occur in multiple buckets. + Buckets [bucketsPerFamily]*traceBucket + + // latency time series + LatencyMu sync.RWMutex + Latency *timeseries.MinuteHourSeries +} + +func newFamily() *family { + return &family{ + Buckets: [bucketsPerFamily]*traceBucket{ + {Cond: minCond(0)}, + {Cond: minCond(50 * time.Millisecond)}, + {Cond: minCond(100 * time.Millisecond)}, + {Cond: minCond(200 * time.Millisecond)}, + {Cond: minCond(500 * time.Millisecond)}, + {Cond: minCond(1 * time.Second)}, + {Cond: minCond(10 * time.Second)}, + {Cond: minCond(100 * time.Second)}, + {Cond: errorCond{}}, + }, + Latency: timeseries.NewMinuteHourSeries(func() timeseries.Observable { return new(histogram) }), + } +} + +// traceBucket represents a size-capped bucket of historic traces, +// along with a condition for a trace to belong to the bucket. +type traceBucket struct { + Cond cond + + // Ring buffer implementation of a fixed-size FIFO queue. + mu sync.RWMutex + buf [tracesPerBucket]*trace + start int // < tracesPerBucket + length int // <= tracesPerBucket +} + +func (b *traceBucket) Add(tr *trace) { + b.mu.Lock() + defer b.mu.Unlock() + + i := b.start + b.length + if i >= tracesPerBucket { + i -= tracesPerBucket + } + if b.length == tracesPerBucket { + // "Remove" an element from the bucket. + b.buf[i].unref() + b.start++ + if b.start == tracesPerBucket { + b.start = 0 + } + } + b.buf[i] = tr + if b.length < tracesPerBucket { + b.length++ + } + tr.ref() +} + +// Copy returns a copy of the traces in the bucket. +// If tracedOnly is true, only the traces with trace information will be returned. +// The logs will be ref'd before returning; the caller should call +// the Free method when it is done with them. +// TODO(dsymonds): keep track of traced requests in separate buckets. +func (b *traceBucket) Copy(tracedOnly bool) traceList { + b.mu.RLock() + defer b.mu.RUnlock() + + trl := make(traceList, 0, b.length) + for i, x := 0, b.start; i < b.length; i++ { + tr := b.buf[x] + if !tracedOnly || tr.spanID != 0 { + tr.ref() + trl = append(trl, tr) + } + x++ + if x == b.length { + x = 0 + } + } + return trl +} + +func (b *traceBucket) Empty() bool { + b.mu.RLock() + defer b.mu.RUnlock() + return b.length == 0 +} + +// cond represents a condition on a trace. +type cond interface { + match(t *trace) bool + String() string +} + +type minCond time.Duration + +func (m minCond) match(t *trace) bool { return t.Elapsed >= time.Duration(m) } +func (m minCond) String() string { return fmt.Sprintf("≥%gs", time.Duration(m).Seconds()) } + +type errorCond struct{} + +func (e errorCond) match(t *trace) bool { return t.IsError } +func (e errorCond) String() string { return "errors" } + +type traceList []*trace + +// Free calls unref on each element of the list. +func (trl traceList) Free() { + for _, t := range trl { + t.unref() + } +} + +// traceList may be sorted in reverse chronological order. +func (trl traceList) Len() int { return len(trl) } +func (trl traceList) Less(i, j int) bool { return trl[i].Start.After(trl[j].Start) } +func (trl traceList) Swap(i, j int) { trl[i], trl[j] = trl[j], trl[i] } + +// An event is a timestamped log entry in a trace. +type event struct { + When time.Time + Elapsed time.Duration // since previous event in trace + NewDay bool // whether this event is on a different day to the previous event + Recyclable bool // whether this event was passed via LazyLog + What interface{} // string or fmt.Stringer + Sensitive bool // whether this event contains sensitive information +} + +// WhenString returns a string representation of the elapsed time of the event. +// It will include the date if midnight was crossed. +func (e event) WhenString() string { + if e.NewDay { + return e.When.Format("2006/01/02 15:04:05.000000") + } + return e.When.Format("15:04:05.000000") +} + +// discarded represents a number of discarded events. +// It is stored as *discarded to make it easier to update in-place. +type discarded int + +func (d *discarded) String() string { + return fmt.Sprintf("(%d events discarded)", int(*d)) +} + +// trace represents an active or complete request, +// either sent or received by this program. +type trace struct { + // Family is the top-level grouping of traces to which this belongs. + Family string + + // Title is the title of this trace. + Title string + + // Timing information. + Start time.Time + Elapsed time.Duration // zero while active + + // Trace information if non-zero. + traceID uint64 + spanID uint64 + + // Whether this trace resulted in an error. + IsError bool + + // Append-only sequence of events (modulo discards). + mu sync.RWMutex + events []event + + refs int32 // how many buckets this is in + recycler func(interface{}) + disc discarded // scratch space to avoid allocation + + finishStack []byte // where finish was called, if DebugUseAfterFinish is set +} + +func (tr *trace) reset() { + // Clear all but the mutex. Mutexes may not be copied, even when unlocked. + tr.Family = "" + tr.Title = "" + tr.Start = time.Time{} + tr.Elapsed = 0 + tr.traceID = 0 + tr.spanID = 0 + tr.IsError = false + tr.events = nil + tr.refs = 0 + tr.recycler = nil + tr.disc = 0 + tr.finishStack = nil +} + +// delta returns the elapsed time since the last event or the trace start, +// and whether it spans midnight. +// L >= tr.mu +func (tr *trace) delta(t time.Time) (time.Duration, bool) { + if len(tr.events) == 0 { + return t.Sub(tr.Start), false + } + prev := tr.events[len(tr.events)-1].When + return t.Sub(prev), prev.Day() != t.Day() +} + +func (tr *trace) addEvent(x interface{}, recyclable, sensitive bool) { + if DebugUseAfterFinish && tr.finishStack != nil { + buf := make([]byte, 4<<10) // 4 KB should be enough + n := runtime.Stack(buf, false) + log.Printf("net/trace: trace used after finish:\nFinished at:\n%s\nUsed at:\n%s", tr.finishStack, buf[:n]) + } + + /* + NOTE TO DEBUGGERS + + If you are here because your program panicked in this code, + it is almost definitely the fault of code using this package, + and very unlikely to be the fault of this code. + + The most likely scenario is that some code elsewhere is using + a requestz.Trace after its Finish method is called. + You can temporarily set the DebugUseAfterFinish var + to help discover where that is; do not leave that var set, + since it makes this package much less efficient. + */ + + e := event{When: time.Now(), What: x, Recyclable: recyclable, Sensitive: sensitive} + tr.mu.Lock() + e.Elapsed, e.NewDay = tr.delta(e.When) + if len(tr.events) < cap(tr.events) { + tr.events = append(tr.events, e) + } else { + // Discard the middle events. + di := int((cap(tr.events) - 1) / 2) + if d, ok := tr.events[di].What.(*discarded); ok { + (*d)++ + } else { + // disc starts at two to count for the event it is replacing, + // plus the next one that we are about to drop. + tr.disc = 2 + if tr.recycler != nil && tr.events[di].Recyclable { + go tr.recycler(tr.events[di].What) + } + tr.events[di].What = &tr.disc + } + // The timestamp of the discarded meta-event should be + // the time of the last event it is representing. + tr.events[di].When = tr.events[di+1].When + + if tr.recycler != nil && tr.events[di+1].Recyclable { + go tr.recycler(tr.events[di+1].What) + } + copy(tr.events[di+1:], tr.events[di+2:]) + tr.events[cap(tr.events)-1] = e + } + tr.mu.Unlock() +} + +func (tr *trace) LazyLog(x fmt.Stringer, sensitive bool) { + tr.addEvent(x, true, sensitive) +} + +func (tr *trace) LazyPrintf(format string, a ...interface{}) { + tr.addEvent(&lazySprintf{format, a}, false, false) +} + +func (tr *trace) SetError() { tr.IsError = true } + +func (tr *trace) SetRecycler(f func(interface{})) { + tr.recycler = f +} + +func (tr *trace) SetTraceInfo(traceID, spanID uint64) { + tr.traceID, tr.spanID = traceID, spanID +} + +func (tr *trace) SetMaxEvents(m int) { + // Always keep at least three events: first, discarded count, last. + if len(tr.events) == 0 && m > 3 { + tr.events = make([]event, 0, m) + } +} + +func (tr *trace) ref() { + atomic.AddInt32(&tr.refs, 1) +} + +func (tr *trace) unref() { + if atomic.AddInt32(&tr.refs, -1) == 0 { + if tr.recycler != nil { + // freeTrace clears tr, so we hold tr.recycler and tr.events here. + go func(f func(interface{}), es []event) { + for _, e := range es { + if e.Recyclable { + f(e.What) + } + } + }(tr.recycler, tr.events) + } + + freeTrace(tr) + } +} + +func (tr *trace) When() string { + return tr.Start.Format("2006/01/02 15:04:05.000000") +} + +func (tr *trace) ElapsedTime() string { + t := tr.Elapsed + if t == 0 { + // Active trace. + t = time.Since(tr.Start) + } + return fmt.Sprintf("%.6f", t.Seconds()) +} + +func (tr *trace) Events() []event { + tr.mu.RLock() + defer tr.mu.RUnlock() + return tr.events +} + +var traceFreeList = make(chan *trace, 1000) // TODO(dsymonds): Use sync.Pool? + +// newTrace returns a trace ready to use. +func newTrace() *trace { + select { + case tr := <-traceFreeList: + return tr + default: + return new(trace) + } +} + +// freeTrace adds tr to traceFreeList if there's room. +// This is non-blocking. +func freeTrace(tr *trace) { + if DebugUseAfterFinish { + return // never reuse + } + tr.reset() + select { + case traceFreeList <- tr: + default: + } +} + +func elapsed(d time.Duration) string { + b := []byte(fmt.Sprintf("%.6f", d.Seconds())) + + // For subsecond durations, blank all zeros before decimal point, + // and all zeros between the decimal point and the first non-zero digit. + if d < time.Second { + dot := bytes.IndexByte(b, '.') + for i := 0; i < dot; i++ { + b[i] = ' ' + } + for i := dot + 1; i < len(b); i++ { + if b[i] == '0' { + b[i] = ' ' + } else { + break + } + } + } + + return string(b) +} + +var pageTmpl = template.Must(template.New("Page").Funcs(template.FuncMap{ + "elapsed": elapsed, + "add": func(a, b int) int { return a + b }, +}).Parse(pageHTML)) + +const pageHTML = ` +{{template "Prolog" .}} +{{template "StatusTable" .}} +{{template "Epilog" .}} + +{{define "Prolog"}} + + + /debug/requests + + + + +

    /debug/requests

    +{{end}} {{/* end of Prolog */}} + +{{define "StatusTable"}} + + {{range $fam := .Families}} + + + + {{$n := index $.ActiveTraceCount $fam}} + + + {{$f := index $.CompletedTraces $fam}} + {{range $i, $b := $f.Buckets}} + {{$empty := $b.Empty}} + + {{end}} + + {{$nb := len $f.Buckets}} + + + + + + {{end}} +
    {{$fam}} + {{if $n}}{{end}} + [{{$n}} active] + {{if $n}}{{end}} + + {{if not $empty}}{{end}} + [{{.Cond}}] + {{if not $empty}}{{end}} + + [minute] + + [hour] + + [total] +
    +{{end}} {{/* end of StatusTable */}} + +{{define "Epilog"}} +{{if $.Traces}} +
    +

    Family: {{$.Family}}

    + +{{if or $.Expanded $.Traced}} + [Normal/Summary] +{{else}} + [Normal/Summary] +{{end}} + +{{if or (not $.Expanded) $.Traced}} + [Normal/Expanded] +{{else}} + [Normal/Expanded] +{{end}} + +{{if not $.Active}} + {{if or $.Expanded (not $.Traced)}} + [Traced/Summary] + {{else}} + [Traced/Summary] + {{end}} + {{if or (not $.Expanded) (not $.Traced)}} + [Traced/Expanded] + {{else}} + [Traced/Expanded] + {{end}} +{{end}} + +{{if $.Total}} +

    Showing {{len $.Traces}} of {{$.Total}} traces.

    +{{end}} + + + + + {{range $tr := $.Traces}} + + + + + {{/* TODO: include traceID/spanID */}} + + {{if $.Expanded}} + {{range $tr.Events}} + + + + + + {{end}} + {{end}} + {{end}} +
    + {{if $.Active}}Active{{else}}Completed{{end}} Requests +
    WhenElapsed (s)
    {{$tr.When}}{{$tr.ElapsedTime}}{{$tr.Title}}
    {{.WhenString}}{{elapsed .Elapsed}}{{if or $.ShowSensitive (not .Sensitive)}}... {{.What}}{{else}}[redacted]{{end}}
    +{{end}} {{/* if $.Traces */}} + +{{if $.Histogram}} +

    Latency (µs) of {{$.Family}} over {{$.HistogramWindow}}

    +{{$.Histogram}} +{{end}} {{/* if $.Histogram */}} + + + +{{end}} {{/* end of Epilog */}} +` diff --git a/vendor/golang.org/x/net/trace/trace_test.go b/vendor/golang.org/x/net/trace/trace_test.go new file mode 100644 index 0000000000..14d7c237aa --- /dev/null +++ b/vendor/golang.org/x/net/trace/trace_test.go @@ -0,0 +1,71 @@ +// 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 trace + +import ( + "net/http" + "reflect" + "testing" +) + +type s struct{} + +func (s) String() string { return "lazy string" } + +// TestReset checks whether all the fields are zeroed after reset. +func TestReset(t *testing.T) { + tr := New("foo", "bar") + tr.LazyLog(s{}, false) + tr.LazyPrintf("%d", 1) + tr.SetRecycler(func(_ interface{}) {}) + tr.SetTraceInfo(3, 4) + tr.SetMaxEvents(100) + tr.SetError() + tr.Finish() + + tr.(*trace).reset() + + if !reflect.DeepEqual(tr, new(trace)) { + t.Errorf("reset didn't clear all fields: %+v", tr) + } +} + +// TestResetLog checks whether all the fields are zeroed after reset. +func TestResetLog(t *testing.T) { + el := NewEventLog("foo", "bar") + el.Printf("message") + el.Errorf("error") + el.Finish() + + el.(*eventLog).reset() + + if !reflect.DeepEqual(el, new(eventLog)) { + t.Errorf("reset didn't clear all fields: %+v", el) + } +} + +func TestAuthRequest(t *testing.T) { + testCases := []struct { + host string + want bool + }{ + {host: "192.168.23.1", want: false}, + {host: "192.168.23.1:8080", want: false}, + {host: "malformed remote addr", want: false}, + {host: "localhost", want: true}, + {host: "localhost:8080", want: true}, + {host: "127.0.0.1", want: true}, + {host: "127.0.0.1:8080", want: true}, + {host: "::1", want: true}, + {host: "[::1]:8080", want: true}, + } + for _, tt := range testCases { + req := &http.Request{RemoteAddr: tt.host} + any, sensitive := AuthRequest(req) + if any != tt.want || sensitive != tt.want { + t.Errorf("AuthRequest(%q) = %t, %t; want %t, %t", tt.host, any, sensitive, tt.want, tt.want) + } + } +} diff --git a/vendor/golang.org/x/net/webdav/file.go b/vendor/golang.org/x/net/webdav/file.go new file mode 100644 index 0000000000..9ba1ca16e5 --- /dev/null +++ b/vendor/golang.org/x/net/webdav/file.go @@ -0,0 +1,795 @@ +// 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 webdav + +import ( + "io" + "net/http" + "os" + "path" + "path/filepath" + "strings" + "sync" + "time" + + "golang.org/x/net/webdav/internal/xml" +) + +// slashClean is equivalent to but slightly more efficient than +// path.Clean("/" + name). +func slashClean(name string) string { + if name == "" || name[0] != '/' { + name = "/" + name + } + return path.Clean(name) +} + +// A FileSystem implements access to a collection of named files. The elements +// in a file path are separated by slash ('/', U+002F) characters, regardless +// of host operating system convention. +// +// Each method has the same semantics as the os package's function of the same +// name. +// +// Note that the os.Rename documentation says that "OS-specific restrictions +// might apply". In particular, whether or not renaming a file or directory +// overwriting another existing file or directory is an error is OS-dependent. +type FileSystem interface { + Mkdir(name string, perm os.FileMode) error + OpenFile(name string, flag int, perm os.FileMode) (File, error) + RemoveAll(name string) error + Rename(oldName, newName string) error + Stat(name string) (os.FileInfo, error) +} + +// A File is returned by a FileSystem's OpenFile method and can be served by a +// Handler. +// +// A File may optionally implement the DeadPropsHolder interface, if it can +// load and save dead properties. +type File interface { + http.File + io.Writer +} + +// A Dir implements FileSystem using the native file system restricted to a +// specific directory tree. +// +// While the FileSystem.OpenFile method takes '/'-separated paths, a Dir's +// string value is a filename on the native file system, not a URL, so it is +// separated by filepath.Separator, which isn't necessarily '/'. +// +// An empty Dir is treated as ".". +type Dir string + +func (d Dir) resolve(name string) string { + // This implementation is based on Dir.Open's code in the standard net/http package. + if filepath.Separator != '/' && strings.IndexRune(name, filepath.Separator) >= 0 || + strings.Contains(name, "\x00") { + return "" + } + dir := string(d) + if dir == "" { + dir = "." + } + return filepath.Join(dir, filepath.FromSlash(slashClean(name))) +} + +func (d Dir) Mkdir(name string, perm os.FileMode) error { + if name = d.resolve(name); name == "" { + return os.ErrNotExist + } + return os.Mkdir(name, perm) +} + +func (d Dir) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + if name = d.resolve(name); name == "" { + return nil, os.ErrNotExist + } + f, err := os.OpenFile(name, flag, perm) + if err != nil { + return nil, err + } + return f, nil +} + +func (d Dir) RemoveAll(name string) error { + if name = d.resolve(name); name == "" { + return os.ErrNotExist + } + if name == filepath.Clean(string(d)) { + // Prohibit removing the virtual root directory. + return os.ErrInvalid + } + return os.RemoveAll(name) +} + +func (d Dir) Rename(oldName, newName string) error { + if oldName = d.resolve(oldName); oldName == "" { + return os.ErrNotExist + } + if newName = d.resolve(newName); newName == "" { + return os.ErrNotExist + } + if root := filepath.Clean(string(d)); root == oldName || root == newName { + // Prohibit renaming from or to the virtual root directory. + return os.ErrInvalid + } + return os.Rename(oldName, newName) +} + +func (d Dir) Stat(name string) (os.FileInfo, error) { + if name = d.resolve(name); name == "" { + return nil, os.ErrNotExist + } + return os.Stat(name) +} + +// NewMemFS returns a new in-memory FileSystem implementation. +func NewMemFS() FileSystem { + return &memFS{ + root: memFSNode{ + children: make(map[string]*memFSNode), + mode: 0660 | os.ModeDir, + modTime: time.Now(), + }, + } +} + +// A memFS implements FileSystem, storing all metadata and actual file data +// in-memory. No limits on filesystem size are used, so it is not recommended +// this be used where the clients are untrusted. +// +// Concurrent access is permitted. The tree structure is protected by a mutex, +// and each node's contents and metadata are protected by a per-node mutex. +// +// TODO: Enforce file permissions. +type memFS struct { + mu sync.Mutex + root memFSNode +} + +// TODO: clean up and rationalize the walk/find code. + +// walk walks the directory tree for the fullname, calling f at each step. If f +// returns an error, the walk will be aborted and return that same error. +// +// dir is the directory at that step, frag is the name fragment, and final is +// whether it is the final step. For example, walking "/foo/bar/x" will result +// in 3 calls to f: +// - "/", "foo", false +// - "/foo/", "bar", false +// - "/foo/bar/", "x", true +// The frag argument will be empty only if dir is the root node and the walk +// ends at that root node. +func (fs *memFS) walk(op, fullname string, f func(dir *memFSNode, frag string, final bool) error) error { + original := fullname + fullname = slashClean(fullname) + + // Strip any leading "/"s to make fullname a relative path, as the walk + // starts at fs.root. + if fullname[0] == '/' { + fullname = fullname[1:] + } + dir := &fs.root + + for { + frag, remaining := fullname, "" + i := strings.IndexRune(fullname, '/') + final := i < 0 + if !final { + frag, remaining = fullname[:i], fullname[i+1:] + } + if frag == "" && dir != &fs.root { + panic("webdav: empty path fragment for a clean path") + } + if err := f(dir, frag, final); err != nil { + return &os.PathError{ + Op: op, + Path: original, + Err: err, + } + } + if final { + break + } + child := dir.children[frag] + if child == nil { + return &os.PathError{ + Op: op, + Path: original, + Err: os.ErrNotExist, + } + } + if !child.mode.IsDir() { + return &os.PathError{ + Op: op, + Path: original, + Err: os.ErrInvalid, + } + } + dir, fullname = child, remaining + } + return nil +} + +// find returns the parent of the named node and the relative name fragment +// from the parent to the child. For example, if finding "/foo/bar/baz" then +// parent will be the node for "/foo/bar" and frag will be "baz". +// +// If the fullname names the root node, then parent, frag and err will be zero. +// +// find returns an error if the parent does not already exist or the parent +// isn't a directory, but it will not return an error per se if the child does +// not already exist. The error returned is either nil or an *os.PathError +// whose Op is op. +func (fs *memFS) find(op, fullname string) (parent *memFSNode, frag string, err error) { + err = fs.walk(op, fullname, func(parent0 *memFSNode, frag0 string, final bool) error { + if !final { + return nil + } + if frag0 != "" { + parent, frag = parent0, frag0 + } + return nil + }) + return parent, frag, err +} + +func (fs *memFS) Mkdir(name string, perm os.FileMode) error { + fs.mu.Lock() + defer fs.mu.Unlock() + + dir, frag, err := fs.find("mkdir", name) + if err != nil { + return err + } + if dir == nil { + // We can't create the root. + return os.ErrInvalid + } + if _, ok := dir.children[frag]; ok { + return os.ErrExist + } + dir.children[frag] = &memFSNode{ + children: make(map[string]*memFSNode), + mode: perm.Perm() | os.ModeDir, + modTime: time.Now(), + } + return nil +} + +func (fs *memFS) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + fs.mu.Lock() + defer fs.mu.Unlock() + + dir, frag, err := fs.find("open", name) + if err != nil { + return nil, err + } + var n *memFSNode + if dir == nil { + // We're opening the root. + if flag&(os.O_WRONLY|os.O_RDWR) != 0 { + return nil, os.ErrPermission + } + n, frag = &fs.root, "/" + + } else { + n = dir.children[frag] + if flag&(os.O_SYNC|os.O_APPEND) != 0 { + // memFile doesn't support these flags yet. + return nil, os.ErrInvalid + } + if flag&os.O_CREATE != 0 { + if flag&os.O_EXCL != 0 && n != nil { + return nil, os.ErrExist + } + if n == nil { + n = &memFSNode{ + mode: perm.Perm(), + } + dir.children[frag] = n + } + } + if n == nil { + return nil, os.ErrNotExist + } + if flag&(os.O_WRONLY|os.O_RDWR) != 0 && flag&os.O_TRUNC != 0 { + n.mu.Lock() + n.data = nil + n.mu.Unlock() + } + } + + children := make([]os.FileInfo, 0, len(n.children)) + for cName, c := range n.children { + children = append(children, c.stat(cName)) + } + return &memFile{ + n: n, + nameSnapshot: frag, + childrenSnapshot: children, + }, nil +} + +func (fs *memFS) RemoveAll(name string) error { + fs.mu.Lock() + defer fs.mu.Unlock() + + dir, frag, err := fs.find("remove", name) + if err != nil { + return err + } + if dir == nil { + // We can't remove the root. + return os.ErrInvalid + } + delete(dir.children, frag) + return nil +} + +func (fs *memFS) Rename(oldName, newName string) error { + fs.mu.Lock() + defer fs.mu.Unlock() + + oldName = slashClean(oldName) + newName = slashClean(newName) + if oldName == newName { + return nil + } + if strings.HasPrefix(newName, oldName+"/") { + // We can't rename oldName to be a sub-directory of itself. + return os.ErrInvalid + } + + oDir, oFrag, err := fs.find("rename", oldName) + if err != nil { + return err + } + if oDir == nil { + // We can't rename from the root. + return os.ErrInvalid + } + + nDir, nFrag, err := fs.find("rename", newName) + if err != nil { + return err + } + if nDir == nil { + // We can't rename to the root. + return os.ErrInvalid + } + + oNode, ok := oDir.children[oFrag] + if !ok { + return os.ErrNotExist + } + if oNode.children != nil { + if nNode, ok := nDir.children[nFrag]; ok { + if nNode.children == nil { + return errNotADirectory + } + if len(nNode.children) != 0 { + return errDirectoryNotEmpty + } + } + } + delete(oDir.children, oFrag) + nDir.children[nFrag] = oNode + return nil +} + +func (fs *memFS) Stat(name string) (os.FileInfo, error) { + fs.mu.Lock() + defer fs.mu.Unlock() + + dir, frag, err := fs.find("stat", name) + if err != nil { + return nil, err + } + if dir == nil { + // We're stat'ting the root. + return fs.root.stat("/"), nil + } + if n, ok := dir.children[frag]; ok { + return n.stat(path.Base(name)), nil + } + return nil, os.ErrNotExist +} + +// A memFSNode represents a single entry in the in-memory filesystem and also +// implements os.FileInfo. +type memFSNode struct { + // children is protected by memFS.mu. + children map[string]*memFSNode + + mu sync.Mutex + data []byte + mode os.FileMode + modTime time.Time + deadProps map[xml.Name]Property +} + +func (n *memFSNode) stat(name string) *memFileInfo { + n.mu.Lock() + defer n.mu.Unlock() + return &memFileInfo{ + name: name, + size: int64(len(n.data)), + mode: n.mode, + modTime: n.modTime, + } +} + +func (n *memFSNode) DeadProps() (map[xml.Name]Property, error) { + n.mu.Lock() + defer n.mu.Unlock() + if len(n.deadProps) == 0 { + return nil, nil + } + ret := make(map[xml.Name]Property, len(n.deadProps)) + for k, v := range n.deadProps { + ret[k] = v + } + return ret, nil +} + +func (n *memFSNode) Patch(patches []Proppatch) ([]Propstat, error) { + n.mu.Lock() + defer n.mu.Unlock() + pstat := Propstat{Status: http.StatusOK} + for _, patch := range patches { + for _, p := range patch.Props { + pstat.Props = append(pstat.Props, Property{XMLName: p.XMLName}) + if patch.Remove { + delete(n.deadProps, p.XMLName) + continue + } + if n.deadProps == nil { + n.deadProps = map[xml.Name]Property{} + } + n.deadProps[p.XMLName] = p + } + } + return []Propstat{pstat}, nil +} + +type memFileInfo struct { + name string + size int64 + mode os.FileMode + modTime time.Time +} + +func (f *memFileInfo) Name() string { return f.name } +func (f *memFileInfo) Size() int64 { return f.size } +func (f *memFileInfo) Mode() os.FileMode { return f.mode } +func (f *memFileInfo) ModTime() time.Time { return f.modTime } +func (f *memFileInfo) IsDir() bool { return f.mode.IsDir() } +func (f *memFileInfo) Sys() interface{} { return nil } + +// A memFile is a File implementation for a memFSNode. It is a per-file (not +// per-node) read/write position, and a snapshot of the memFS' tree structure +// (a node's name and children) for that node. +type memFile struct { + n *memFSNode + nameSnapshot string + childrenSnapshot []os.FileInfo + // pos is protected by n.mu. + pos int +} + +// A *memFile implements the optional DeadPropsHolder interface. +var _ DeadPropsHolder = (*memFile)(nil) + +func (f *memFile) DeadProps() (map[xml.Name]Property, error) { return f.n.DeadProps() } +func (f *memFile) Patch(patches []Proppatch) ([]Propstat, error) { return f.n.Patch(patches) } + +func (f *memFile) Close() error { + return nil +} + +func (f *memFile) Read(p []byte) (int, error) { + f.n.mu.Lock() + defer f.n.mu.Unlock() + if f.n.mode.IsDir() { + return 0, os.ErrInvalid + } + if f.pos >= len(f.n.data) { + return 0, io.EOF + } + n := copy(p, f.n.data[f.pos:]) + f.pos += n + return n, nil +} + +func (f *memFile) Readdir(count int) ([]os.FileInfo, error) { + f.n.mu.Lock() + defer f.n.mu.Unlock() + if !f.n.mode.IsDir() { + return nil, os.ErrInvalid + } + old := f.pos + if old >= len(f.childrenSnapshot) { + // The os.File Readdir docs say that at the end of a directory, + // the error is io.EOF if count > 0 and nil if count <= 0. + if count > 0 { + return nil, io.EOF + } + return nil, nil + } + if count > 0 { + f.pos += count + if f.pos > len(f.childrenSnapshot) { + f.pos = len(f.childrenSnapshot) + } + } else { + f.pos = len(f.childrenSnapshot) + old = 0 + } + return f.childrenSnapshot[old:f.pos], nil +} + +func (f *memFile) Seek(offset int64, whence int) (int64, error) { + f.n.mu.Lock() + defer f.n.mu.Unlock() + npos := f.pos + // TODO: How to handle offsets greater than the size of system int? + switch whence { + case os.SEEK_SET: + npos = int(offset) + case os.SEEK_CUR: + npos += int(offset) + case os.SEEK_END: + npos = len(f.n.data) + int(offset) + default: + npos = -1 + } + if npos < 0 { + return 0, os.ErrInvalid + } + f.pos = npos + return int64(f.pos), nil +} + +func (f *memFile) Stat() (os.FileInfo, error) { + return f.n.stat(f.nameSnapshot), nil +} + +func (f *memFile) Write(p []byte) (int, error) { + lenp := len(p) + f.n.mu.Lock() + defer f.n.mu.Unlock() + + if f.n.mode.IsDir() { + return 0, os.ErrInvalid + } + if f.pos < len(f.n.data) { + n := copy(f.n.data[f.pos:], p) + f.pos += n + p = p[n:] + } else if f.pos > len(f.n.data) { + // Write permits the creation of holes, if we've seek'ed past the + // existing end of file. + if f.pos <= cap(f.n.data) { + oldLen := len(f.n.data) + f.n.data = f.n.data[:f.pos] + hole := f.n.data[oldLen:] + for i := range hole { + hole[i] = 0 + } + } else { + d := make([]byte, f.pos, f.pos+len(p)) + copy(d, f.n.data) + f.n.data = d + } + } + + if len(p) > 0 { + // We should only get here if f.pos == len(f.n.data). + f.n.data = append(f.n.data, p...) + f.pos = len(f.n.data) + } + f.n.modTime = time.Now() + return lenp, nil +} + +// moveFiles moves files and/or directories from src to dst. +// +// See section 9.9.4 for when various HTTP status codes apply. +func moveFiles(fs FileSystem, src, dst string, overwrite bool) (status int, err error) { + created := false + if _, err := fs.Stat(dst); err != nil { + if !os.IsNotExist(err) { + return http.StatusForbidden, err + } + created = true + } else if overwrite { + // Section 9.9.3 says that "If a resource exists at the destination + // and the Overwrite header is "T", then prior to performing the move, + // the server must perform a DELETE with "Depth: infinity" on the + // destination resource. + if err := fs.RemoveAll(dst); err != nil { + return http.StatusForbidden, err + } + } else { + return http.StatusPreconditionFailed, os.ErrExist + } + if err := fs.Rename(src, dst); err != nil { + return http.StatusForbidden, err + } + if created { + return http.StatusCreated, nil + } + return http.StatusNoContent, nil +} + +func copyProps(dst, src File) error { + d, ok := dst.(DeadPropsHolder) + if !ok { + return nil + } + s, ok := src.(DeadPropsHolder) + if !ok { + return nil + } + m, err := s.DeadProps() + if err != nil { + return err + } + props := make([]Property, 0, len(m)) + for _, prop := range m { + props = append(props, prop) + } + _, err = d.Patch([]Proppatch{{Props: props}}) + return err +} + +// copyFiles copies files and/or directories from src to dst. +// +// See section 9.8.5 for when various HTTP status codes apply. +func copyFiles(fs FileSystem, src, dst string, overwrite bool, depth int, recursion int) (status int, err error) { + if recursion == 1000 { + return http.StatusInternalServerError, errRecursionTooDeep + } + recursion++ + + // TODO: section 9.8.3 says that "Note that an infinite-depth COPY of /A/ + // into /A/B/ could lead to infinite recursion if not handled correctly." + + srcFile, err := fs.OpenFile(src, os.O_RDONLY, 0) + if err != nil { + if os.IsNotExist(err) { + return http.StatusNotFound, err + } + return http.StatusInternalServerError, err + } + defer srcFile.Close() + srcStat, err := srcFile.Stat() + if err != nil { + if os.IsNotExist(err) { + return http.StatusNotFound, err + } + return http.StatusInternalServerError, err + } + srcPerm := srcStat.Mode() & os.ModePerm + + created := false + if _, err := fs.Stat(dst); err != nil { + if os.IsNotExist(err) { + created = true + } else { + return http.StatusForbidden, err + } + } else { + if !overwrite { + return http.StatusPreconditionFailed, os.ErrExist + } + if err := fs.RemoveAll(dst); err != nil && !os.IsNotExist(err) { + return http.StatusForbidden, err + } + } + + if srcStat.IsDir() { + if err := fs.Mkdir(dst, srcPerm); err != nil { + return http.StatusForbidden, err + } + if depth == infiniteDepth { + children, err := srcFile.Readdir(-1) + if err != nil { + return http.StatusForbidden, err + } + for _, c := range children { + name := c.Name() + s := path.Join(src, name) + d := path.Join(dst, name) + cStatus, cErr := copyFiles(fs, s, d, overwrite, depth, recursion) + if cErr != nil { + // TODO: MultiStatus. + return cStatus, cErr + } + } + } + + } else { + dstFile, err := fs.OpenFile(dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, srcPerm) + if err != nil { + if os.IsNotExist(err) { + return http.StatusConflict, err + } + return http.StatusForbidden, err + + } + _, copyErr := io.Copy(dstFile, srcFile) + propsErr := copyProps(dstFile, srcFile) + closeErr := dstFile.Close() + if copyErr != nil { + return http.StatusInternalServerError, copyErr + } + if propsErr != nil { + return http.StatusInternalServerError, propsErr + } + if closeErr != nil { + return http.StatusInternalServerError, closeErr + } + } + + if created { + return http.StatusCreated, nil + } + return http.StatusNoContent, nil +} + +// walkFS traverses filesystem fs starting at name up to depth levels. +// +// Allowed values for depth are 0, 1 or infiniteDepth. For each visited node, +// walkFS calls walkFn. If a visited file system node is a directory and +// walkFn returns filepath.SkipDir, walkFS will skip traversal of this node. +func walkFS(fs FileSystem, depth int, name string, info os.FileInfo, walkFn filepath.WalkFunc) error { + // This implementation is based on Walk's code in the standard path/filepath package. + err := walkFn(name, info, nil) + if err != nil { + if info.IsDir() && err == filepath.SkipDir { + return nil + } + return err + } + if !info.IsDir() || depth == 0 { + return nil + } + if depth == 1 { + depth = 0 + } + + // Read directory names. + f, err := fs.OpenFile(name, os.O_RDONLY, 0) + if err != nil { + return walkFn(name, info, err) + } + fileInfos, err := f.Readdir(0) + f.Close() + if err != nil { + return walkFn(name, info, err) + } + + for _, fileInfo := range fileInfos { + filename := path.Join(name, fileInfo.Name()) + fileInfo, err := fs.Stat(filename) + if err != nil { + if err := walkFn(filename, fileInfo, err); err != nil && err != filepath.SkipDir { + return err + } + } else { + err = walkFS(fs, depth, filename, fileInfo, walkFn) + if err != nil { + if !fileInfo.IsDir() || err != filepath.SkipDir { + return err + } + } + } + } + return nil +} diff --git a/vendor/golang.org/x/net/webdav/file_test.go b/vendor/golang.org/x/net/webdav/file_test.go new file mode 100644 index 0000000000..99547e16ba --- /dev/null +++ b/vendor/golang.org/x/net/webdav/file_test.go @@ -0,0 +1,1167 @@ +// 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 webdav + +import ( + "fmt" + "io" + "io/ioutil" + "os" + "path" + "path/filepath" + "reflect" + "runtime" + "sort" + "strconv" + "strings" + "testing" + + "golang.org/x/net/webdav/internal/xml" +) + +func TestSlashClean(t *testing.T) { + testCases := []string{ + "", + ".", + "/", + "/./", + "//", + "//.", + "//a", + "/a", + "/a/b/c", + "/a//b/./../c/d/", + "a", + "a/b/c", + } + for _, tc := range testCases { + got := slashClean(tc) + want := path.Clean("/" + tc) + if got != want { + t.Errorf("tc=%q: got %q, want %q", tc, got, want) + } + } +} + +func TestDirResolve(t *testing.T) { + testCases := []struct { + dir, name, want string + }{ + {"/", "", "/"}, + {"/", "/", "/"}, + {"/", ".", "/"}, + {"/", "./a", "/a"}, + {"/", "..", "/"}, + {"/", "..", "/"}, + {"/", "../", "/"}, + {"/", "../.", "/"}, + {"/", "../a", "/a"}, + {"/", "../..", "/"}, + {"/", "../bar/a", "/bar/a"}, + {"/", "../baz/a", "/baz/a"}, + {"/", "...", "/..."}, + {"/", ".../a", "/.../a"}, + {"/", ".../..", "/"}, + {"/", "a", "/a"}, + {"/", "a/./b", "/a/b"}, + {"/", "a/../../b", "/b"}, + {"/", "a/../b", "/b"}, + {"/", "a/b", "/a/b"}, + {"/", "a/b/c/../../d", "/a/d"}, + {"/", "a/b/c/../../../d", "/d"}, + {"/", "a/b/c/../../../../d", "/d"}, + {"/", "a/b/c/d", "/a/b/c/d"}, + + {"/foo/bar", "", "/foo/bar"}, + {"/foo/bar", "/", "/foo/bar"}, + {"/foo/bar", ".", "/foo/bar"}, + {"/foo/bar", "./a", "/foo/bar/a"}, + {"/foo/bar", "..", "/foo/bar"}, + {"/foo/bar", "../", "/foo/bar"}, + {"/foo/bar", "../.", "/foo/bar"}, + {"/foo/bar", "../a", "/foo/bar/a"}, + {"/foo/bar", "../..", "/foo/bar"}, + {"/foo/bar", "../bar/a", "/foo/bar/bar/a"}, + {"/foo/bar", "../baz/a", "/foo/bar/baz/a"}, + {"/foo/bar", "...", "/foo/bar/..."}, + {"/foo/bar", ".../a", "/foo/bar/.../a"}, + {"/foo/bar", ".../..", "/foo/bar"}, + {"/foo/bar", "a", "/foo/bar/a"}, + {"/foo/bar", "a/./b", "/foo/bar/a/b"}, + {"/foo/bar", "a/../../b", "/foo/bar/b"}, + {"/foo/bar", "a/../b", "/foo/bar/b"}, + {"/foo/bar", "a/b", "/foo/bar/a/b"}, + {"/foo/bar", "a/b/c/../../d", "/foo/bar/a/d"}, + {"/foo/bar", "a/b/c/../../../d", "/foo/bar/d"}, + {"/foo/bar", "a/b/c/../../../../d", "/foo/bar/d"}, + {"/foo/bar", "a/b/c/d", "/foo/bar/a/b/c/d"}, + + {"/foo/bar/", "", "/foo/bar"}, + {"/foo/bar/", "/", "/foo/bar"}, + {"/foo/bar/", ".", "/foo/bar"}, + {"/foo/bar/", "./a", "/foo/bar/a"}, + {"/foo/bar/", "..", "/foo/bar"}, + + {"/foo//bar///", "", "/foo/bar"}, + {"/foo//bar///", "/", "/foo/bar"}, + {"/foo//bar///", ".", "/foo/bar"}, + {"/foo//bar///", "./a", "/foo/bar/a"}, + {"/foo//bar///", "..", "/foo/bar"}, + + {"/x/y/z", "ab/c\x00d/ef", ""}, + + {".", "", "."}, + {".", "/", "."}, + {".", ".", "."}, + {".", "./a", "a"}, + {".", "..", "."}, + {".", "..", "."}, + {".", "../", "."}, + {".", "../.", "."}, + {".", "../a", "a"}, + {".", "../..", "."}, + {".", "../bar/a", "bar/a"}, + {".", "../baz/a", "baz/a"}, + {".", "...", "..."}, + {".", ".../a", ".../a"}, + {".", ".../..", "."}, + {".", "a", "a"}, + {".", "a/./b", "a/b"}, + {".", "a/../../b", "b"}, + {".", "a/../b", "b"}, + {".", "a/b", "a/b"}, + {".", "a/b/c/../../d", "a/d"}, + {".", "a/b/c/../../../d", "d"}, + {".", "a/b/c/../../../../d", "d"}, + {".", "a/b/c/d", "a/b/c/d"}, + + {"", "", "."}, + {"", "/", "."}, + {"", ".", "."}, + {"", "./a", "a"}, + {"", "..", "."}, + } + + for _, tc := range testCases { + d := Dir(filepath.FromSlash(tc.dir)) + if got := filepath.ToSlash(d.resolve(tc.name)); got != tc.want { + t.Errorf("dir=%q, name=%q: got %q, want %q", tc.dir, tc.name, got, tc.want) + } + } +} + +func TestWalk(t *testing.T) { + type walkStep struct { + name, frag string + final bool + } + + testCases := []struct { + dir string + want []walkStep + }{ + {"", []walkStep{ + {"", "", true}, + }}, + {"/", []walkStep{ + {"", "", true}, + }}, + {"/a", []walkStep{ + {"", "a", true}, + }}, + {"/a/", []walkStep{ + {"", "a", true}, + }}, + {"/a/b", []walkStep{ + {"", "a", false}, + {"a", "b", true}, + }}, + {"/a/b/", []walkStep{ + {"", "a", false}, + {"a", "b", true}, + }}, + {"/a/b/c", []walkStep{ + {"", "a", false}, + {"a", "b", false}, + {"b", "c", true}, + }}, + // The following test case is the one mentioned explicitly + // in the method description. + {"/foo/bar/x", []walkStep{ + {"", "foo", false}, + {"foo", "bar", false}, + {"bar", "x", true}, + }}, + } + + for _, tc := range testCases { + fs := NewMemFS().(*memFS) + + parts := strings.Split(tc.dir, "/") + for p := 2; p < len(parts); p++ { + d := strings.Join(parts[:p], "/") + if err := fs.Mkdir(d, 0666); err != nil { + t.Errorf("tc.dir=%q: mkdir: %q: %v", tc.dir, d, err) + } + } + + i, prevFrag := 0, "" + err := fs.walk("test", tc.dir, func(dir *memFSNode, frag string, final bool) error { + got := walkStep{ + name: prevFrag, + frag: frag, + final: final, + } + want := tc.want[i] + + if got != want { + return fmt.Errorf("got %+v, want %+v", got, want) + } + i, prevFrag = i+1, frag + return nil + }) + if err != nil { + t.Errorf("tc.dir=%q: %v", tc.dir, err) + } + } +} + +// find appends to ss the names of the named file and its children. It is +// analogous to the Unix find command. +// +// The returned strings are not guaranteed to be in any particular order. +func find(ss []string, fs FileSystem, name string) ([]string, error) { + stat, err := fs.Stat(name) + if err != nil { + return nil, err + } + ss = append(ss, name) + if stat.IsDir() { + f, err := fs.OpenFile(name, os.O_RDONLY, 0) + if err != nil { + return nil, err + } + defer f.Close() + children, err := f.Readdir(-1) + if err != nil { + return nil, err + } + for _, c := range children { + ss, err = find(ss, fs, path.Join(name, c.Name())) + if err != nil { + return nil, err + } + } + } + return ss, nil +} + +func testFS(t *testing.T, fs FileSystem) { + errStr := func(err error) string { + switch { + case os.IsExist(err): + return "errExist" + case os.IsNotExist(err): + return "errNotExist" + case err != nil: + return "err" + } + return "ok" + } + + // The non-"find" non-"stat" test cases should change the file system state. The + // indentation of the "find"s and "stat"s helps distinguish such test cases. + testCases := []string{ + " stat / want dir", + " stat /a want errNotExist", + " stat /d want errNotExist", + " stat /d/e want errNotExist", + "create /a A want ok", + " stat /a want 1", + "create /d/e EEE want errNotExist", + "mk-dir /a want errExist", + "mk-dir /d/m want errNotExist", + "mk-dir /d want ok", + " stat /d want dir", + "create /d/e EEE want ok", + " stat /d/e want 3", + " find / /a /d /d/e", + "create /d/f FFFF want ok", + "create /d/g GGGGGGG want ok", + "mk-dir /d/m want ok", + "mk-dir /d/m want errExist", + "create /d/m/p PPPPP want ok", + " stat /d/e want 3", + " stat /d/f want 4", + " stat /d/g want 7", + " stat /d/h want errNotExist", + " stat /d/m want dir", + " stat /d/m/p want 5", + " find / /a /d /d/e /d/f /d/g /d/m /d/m/p", + "rm-all /d want ok", + " stat /a want 1", + " stat /d want errNotExist", + " stat /d/e want errNotExist", + " stat /d/f want errNotExist", + " stat /d/g want errNotExist", + " stat /d/m want errNotExist", + " stat /d/m/p want errNotExist", + " find / /a", + "mk-dir /d/m want errNotExist", + "mk-dir /d want ok", + "create /d/f FFFF want ok", + "rm-all /d/f want ok", + "mk-dir /d/m want ok", + "rm-all /z want ok", + "rm-all / want err", + "create /b BB want ok", + " stat / want dir", + " stat /a want 1", + " stat /b want 2", + " stat /c want errNotExist", + " stat /d want dir", + " stat /d/m want dir", + " find / /a /b /d /d/m", + "move__ o=F /b /c want ok", + " stat /b want errNotExist", + " stat /c want 2", + " stat /d/m want dir", + " stat /d/n want errNotExist", + " find / /a /c /d /d/m", + "move__ o=F /d/m /d/n want ok", + "create /d/n/q QQQQ want ok", + " stat /d/m want errNotExist", + " stat /d/n want dir", + " stat /d/n/q want 4", + "move__ o=F /d /d/n/z want err", + "move__ o=T /c /d/n/q want ok", + " stat /c want errNotExist", + " stat /d/n/q want 2", + " find / /a /d /d/n /d/n/q", + "create /d/n/r RRRRR want ok", + "mk-dir /u want ok", + "mk-dir /u/v want ok", + "move__ o=F /d/n /u want errExist", + "create /t TTTTTT want ok", + "move__ o=F /d/n /t want errExist", + "rm-all /t want ok", + "move__ o=F /d/n /t want ok", + " stat /d want dir", + " stat /d/n want errNotExist", + " stat /d/n/r want errNotExist", + " stat /t want dir", + " stat /t/q want 2", + " stat /t/r want 5", + " find / /a /d /t /t/q /t/r /u /u/v", + "move__ o=F /t / want errExist", + "move__ o=T /t /u/v want ok", + " stat /u/v/r want 5", + "move__ o=F / /z want err", + " find / /a /d /u /u/v /u/v/q /u/v/r", + " stat /a want 1", + " stat /b want errNotExist", + " stat /c want errNotExist", + " stat /u/v/r want 5", + "copy__ o=F d=0 /a /b want ok", + "copy__ o=T d=0 /a /c want ok", + " stat /a want 1", + " stat /b want 1", + " stat /c want 1", + " stat /u/v/r want 5", + "copy__ o=F d=0 /u/v/r /b want errExist", + " stat /b want 1", + "copy__ o=T d=0 /u/v/r /b want ok", + " stat /a want 1", + " stat /b want 5", + " stat /u/v/r want 5", + "rm-all /a want ok", + "rm-all /b want ok", + "mk-dir /u/v/w want ok", + "create /u/v/w/s SSSSSSSS want ok", + " stat /d want dir", + " stat /d/x want errNotExist", + " stat /d/y want errNotExist", + " stat /u/v/r want 5", + " stat /u/v/w/s want 8", + " find / /c /d /u /u/v /u/v/q /u/v/r /u/v/w /u/v/w/s", + "copy__ o=T d=0 /u/v /d/x want ok", + "copy__ o=T d=∞ /u/v /d/y want ok", + "rm-all /u want ok", + " stat /d/x want dir", + " stat /d/x/q want errNotExist", + " stat /d/x/r want errNotExist", + " stat /d/x/w want errNotExist", + " stat /d/x/w/s want errNotExist", + " stat /d/y want dir", + " stat /d/y/q want 2", + " stat /d/y/r want 5", + " stat /d/y/w want dir", + " stat /d/y/w/s want 8", + " stat /u want errNotExist", + " find / /c /d /d/x /d/y /d/y/q /d/y/r /d/y/w /d/y/w/s", + "copy__ o=F d=∞ /d/y /d/x want errExist", + } + + for i, tc := range testCases { + tc = strings.TrimSpace(tc) + j := strings.IndexByte(tc, ' ') + if j < 0 { + t.Fatalf("test case #%d %q: invalid command", i, tc) + } + op, arg := tc[:j], tc[j+1:] + + switch op { + default: + t.Fatalf("test case #%d %q: invalid operation %q", i, tc, op) + + case "create": + parts := strings.Split(arg, " ") + if len(parts) != 4 || parts[2] != "want" { + t.Fatalf("test case #%d %q: invalid write", i, tc) + } + f, opErr := fs.OpenFile(parts[0], os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if got := errStr(opErr); got != parts[3] { + t.Fatalf("test case #%d %q: OpenFile: got %q (%v), want %q", i, tc, got, opErr, parts[3]) + } + if f != nil { + if _, err := f.Write([]byte(parts[1])); err != nil { + t.Fatalf("test case #%d %q: Write: %v", i, tc, err) + } + if err := f.Close(); err != nil { + t.Fatalf("test case #%d %q: Close: %v", i, tc, err) + } + } + + case "find": + got, err := find(nil, fs, "/") + if err != nil { + t.Fatalf("test case #%d %q: find: %v", i, tc, err) + } + sort.Strings(got) + want := strings.Split(arg, " ") + if !reflect.DeepEqual(got, want) { + t.Fatalf("test case #%d %q:\ngot %s\nwant %s", i, tc, got, want) + } + + case "copy__", "mk-dir", "move__", "rm-all", "stat": + nParts := 3 + switch op { + case "copy__": + nParts = 6 + case "move__": + nParts = 5 + } + parts := strings.Split(arg, " ") + if len(parts) != nParts { + t.Fatalf("test case #%d %q: invalid %s", i, tc, op) + } + + got, opErr := "", error(nil) + switch op { + case "copy__": + depth := 0 + if parts[1] == "d=∞" { + depth = infiniteDepth + } + _, opErr = copyFiles(fs, parts[2], parts[3], parts[0] == "o=T", depth, 0) + case "mk-dir": + opErr = fs.Mkdir(parts[0], 0777) + case "move__": + _, opErr = moveFiles(fs, parts[1], parts[2], parts[0] == "o=T") + case "rm-all": + opErr = fs.RemoveAll(parts[0]) + case "stat": + var stat os.FileInfo + fileName := parts[0] + if stat, opErr = fs.Stat(fileName); opErr == nil { + if stat.IsDir() { + got = "dir" + } else { + got = strconv.Itoa(int(stat.Size())) + } + + if fileName == "/" { + // For a Dir FileSystem, the virtual file system root maps to a + // real file system name like "/tmp/webdav-test012345", which does + // not end with "/". We skip such cases. + } else if statName := stat.Name(); path.Base(fileName) != statName { + t.Fatalf("test case #%d %q: file name %q inconsistent with stat name %q", + i, tc, fileName, statName) + } + } + } + if got == "" { + got = errStr(opErr) + } + + if parts[len(parts)-2] != "want" { + t.Fatalf("test case #%d %q: invalid %s", i, tc, op) + } + if want := parts[len(parts)-1]; got != want { + t.Fatalf("test case #%d %q: got %q (%v), want %q", i, tc, got, opErr, want) + } + } + } +} + +func TestDir(t *testing.T) { + switch runtime.GOOS { + case "nacl": + t.Skip("see golang.org/issue/12004") + case "plan9": + t.Skip("see golang.org/issue/11453") + } + + td, err := ioutil.TempDir("", "webdav-test") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(td) + testFS(t, Dir(td)) +} + +func TestMemFS(t *testing.T) { + testFS(t, NewMemFS()) +} + +func TestMemFSRoot(t *testing.T) { + fs := NewMemFS() + for i := 0; i < 5; i++ { + stat, err := fs.Stat("/") + if err != nil { + t.Fatalf("i=%d: Stat: %v", i, err) + } + if !stat.IsDir() { + t.Fatalf("i=%d: Stat.IsDir is false, want true", i) + } + + f, err := fs.OpenFile("/", os.O_RDONLY, 0) + if err != nil { + t.Fatalf("i=%d: OpenFile: %v", i, err) + } + defer f.Close() + children, err := f.Readdir(-1) + if err != nil { + t.Fatalf("i=%d: Readdir: %v", i, err) + } + if len(children) != i { + t.Fatalf("i=%d: got %d children, want %d", i, len(children), i) + } + + if _, err := f.Write(make([]byte, 1)); err == nil { + t.Fatalf("i=%d: Write: got nil error, want non-nil", i) + } + + if err := fs.Mkdir(fmt.Sprintf("/dir%d", i), 0777); err != nil { + t.Fatalf("i=%d: Mkdir: %v", i, err) + } + } +} + +func TestMemFileReaddir(t *testing.T) { + fs := NewMemFS() + if err := fs.Mkdir("/foo", 0777); err != nil { + t.Fatalf("Mkdir: %v", err) + } + readdir := func(count int) ([]os.FileInfo, error) { + f, err := fs.OpenFile("/foo", os.O_RDONLY, 0) + if err != nil { + t.Fatalf("OpenFile: %v", err) + } + defer f.Close() + return f.Readdir(count) + } + if got, err := readdir(-1); len(got) != 0 || err != nil { + t.Fatalf("readdir(-1): got %d fileInfos with err=%v, want 0, ", len(got), err) + } + if got, err := readdir(+1); len(got) != 0 || err != io.EOF { + t.Fatalf("readdir(+1): got %d fileInfos with err=%v, want 0, EOF", len(got), err) + } +} + +func TestMemFile(t *testing.T) { + testCases := []string{ + "wantData ", + "wantSize 0", + "write abc", + "wantData abc", + "write de", + "wantData abcde", + "wantSize 5", + "write 5*x", + "write 4*y+2*z", + "write 3*st", + "wantData abcdexxxxxyyyyzzststst", + "wantSize 22", + "seek set 4 want 4", + "write EFG", + "wantData abcdEFGxxxyyyyzzststst", + "wantSize 22", + "seek set 2 want 2", + "read cdEF", + "read Gx", + "seek cur 0 want 8", + "seek cur 2 want 10", + "seek cur -1 want 9", + "write J", + "wantData abcdEFGxxJyyyyzzststst", + "wantSize 22", + "seek cur -4 want 6", + "write ghijk", + "wantData abcdEFghijkyyyzzststst", + "wantSize 22", + "read yyyz", + "seek cur 0 want 15", + "write ", + "seek cur 0 want 15", + "read ", + "seek cur 0 want 15", + "seek end -3 want 19", + "write ZZ", + "wantData abcdEFghijkyyyzzstsZZt", + "wantSize 22", + "write 4*A", + "wantData abcdEFghijkyyyzzstsZZAAAA", + "wantSize 25", + "seek end 0 want 25", + "seek end -5 want 20", + "read Z+4*A", + "write 5*B", + "wantData abcdEFghijkyyyzzstsZZAAAABBBBB", + "wantSize 30", + "seek end 10 want 40", + "write C", + "wantData abcdEFghijkyyyzzstsZZAAAABBBBB..........C", + "wantSize 41", + "write D", + "wantData abcdEFghijkyyyzzstsZZAAAABBBBB..........CD", + "wantSize 42", + "seek set 43 want 43", + "write E", + "wantData abcdEFghijkyyyzzstsZZAAAABBBBB..........CD.E", + "wantSize 44", + "seek set 0 want 0", + "write 5*123456789_", + "wantData 123456789_123456789_123456789_123456789_123456789_", + "wantSize 50", + "seek cur 0 want 50", + "seek cur -99 want err", + } + + const filename = "/foo" + fs := NewMemFS() + f, err := fs.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + t.Fatalf("OpenFile: %v", err) + } + defer f.Close() + + for i, tc := range testCases { + j := strings.IndexByte(tc, ' ') + if j < 0 { + t.Fatalf("test case #%d %q: invalid command", i, tc) + } + op, arg := tc[:j], tc[j+1:] + + // Expand an arg like "3*a+2*b" to "aaabb". + parts := strings.Split(arg, "+") + for j, part := range parts { + if k := strings.IndexByte(part, '*'); k >= 0 { + repeatCount, repeatStr := part[:k], part[k+1:] + n, err := strconv.Atoi(repeatCount) + if err != nil { + t.Fatalf("test case #%d %q: invalid repeat count %q", i, tc, repeatCount) + } + parts[j] = strings.Repeat(repeatStr, n) + } + } + arg = strings.Join(parts, "") + + switch op { + default: + t.Fatalf("test case #%d %q: invalid operation %q", i, tc, op) + + case "read": + buf := make([]byte, len(arg)) + if _, err := io.ReadFull(f, buf); err != nil { + t.Fatalf("test case #%d %q: ReadFull: %v", i, tc, err) + } + if got := string(buf); got != arg { + t.Fatalf("test case #%d %q:\ngot %q\nwant %q", i, tc, got, arg) + } + + case "seek": + parts := strings.Split(arg, " ") + if len(parts) != 4 { + t.Fatalf("test case #%d %q: invalid seek", i, tc) + } + + whence := 0 + switch parts[0] { + default: + t.Fatalf("test case #%d %q: invalid seek whence", i, tc) + case "set": + whence = os.SEEK_SET + case "cur": + whence = os.SEEK_CUR + case "end": + whence = os.SEEK_END + } + offset, err := strconv.Atoi(parts[1]) + if err != nil { + t.Fatalf("test case #%d %q: invalid offset %q", i, tc, parts[1]) + } + + if parts[2] != "want" { + t.Fatalf("test case #%d %q: invalid seek", i, tc) + } + if parts[3] == "err" { + _, err := f.Seek(int64(offset), whence) + if err == nil { + t.Fatalf("test case #%d %q: Seek returned nil error, want non-nil", i, tc) + } + } else { + got, err := f.Seek(int64(offset), whence) + if err != nil { + t.Fatalf("test case #%d %q: Seek: %v", i, tc, err) + } + want, err := strconv.Atoi(parts[3]) + if err != nil { + t.Fatalf("test case #%d %q: invalid want %q", i, tc, parts[3]) + } + if got != int64(want) { + t.Fatalf("test case #%d %q: got %d, want %d", i, tc, got, want) + } + } + + case "write": + n, err := f.Write([]byte(arg)) + if err != nil { + t.Fatalf("test case #%d %q: write: %v", i, tc, err) + } + if n != len(arg) { + t.Fatalf("test case #%d %q: write returned %d bytes, want %d", i, tc, n, len(arg)) + } + + case "wantData": + g, err := fs.OpenFile(filename, os.O_RDONLY, 0666) + if err != nil { + t.Fatalf("test case #%d %q: OpenFile: %v", i, tc, err) + } + gotBytes, err := ioutil.ReadAll(g) + if err != nil { + t.Fatalf("test case #%d %q: ReadAll: %v", i, tc, err) + } + for i, c := range gotBytes { + if c == '\x00' { + gotBytes[i] = '.' + } + } + got := string(gotBytes) + if got != arg { + t.Fatalf("test case #%d %q:\ngot %q\nwant %q", i, tc, got, arg) + } + if err := g.Close(); err != nil { + t.Fatalf("test case #%d %q: Close: %v", i, tc, err) + } + + case "wantSize": + n, err := strconv.Atoi(arg) + if err != nil { + t.Fatalf("test case #%d %q: invalid size %q", i, tc, arg) + } + fi, err := fs.Stat(filename) + if err != nil { + t.Fatalf("test case #%d %q: Stat: %v", i, tc, err) + } + if got, want := fi.Size(), int64(n); got != want { + t.Fatalf("test case #%d %q: got %d, want %d", i, tc, got, want) + } + } + } +} + +// TestMemFileWriteAllocs tests that writing N consecutive 1KiB chunks to a +// memFile doesn't allocate a new buffer for each of those N times. Otherwise, +// calling io.Copy(aMemFile, src) is likely to have quadratic complexity. +func TestMemFileWriteAllocs(t *testing.T) { + fs := NewMemFS() + f, err := fs.OpenFile("/xxx", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + t.Fatalf("OpenFile: %v", err) + } + defer f.Close() + + xxx := make([]byte, 1024) + for i := range xxx { + xxx[i] = 'x' + } + + a := testing.AllocsPerRun(100, func() { + f.Write(xxx) + }) + // AllocsPerRun returns an integral value, so we compare the rounded-down + // number to zero. + if a > 0 { + t.Fatalf("%v allocs per run, want 0", a) + } +} + +func BenchmarkMemFileWrite(b *testing.B) { + fs := NewMemFS() + xxx := make([]byte, 1024) + for i := range xxx { + xxx[i] = 'x' + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + f, err := fs.OpenFile("/xxx", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + b.Fatalf("OpenFile: %v", err) + } + for j := 0; j < 100; j++ { + f.Write(xxx) + } + if err := f.Close(); err != nil { + b.Fatalf("Close: %v", err) + } + if err := fs.RemoveAll("/xxx"); err != nil { + b.Fatalf("RemoveAll: %v", err) + } + } +} + +func TestCopyMoveProps(t *testing.T) { + fs := NewMemFS() + create := func(name string) error { + f, err := fs.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + return err + } + _, wErr := f.Write([]byte("contents")) + cErr := f.Close() + if wErr != nil { + return wErr + } + return cErr + } + patch := func(name string, patches ...Proppatch) error { + f, err := fs.OpenFile(name, os.O_RDWR, 0666) + if err != nil { + return err + } + _, pErr := f.(DeadPropsHolder).Patch(patches) + cErr := f.Close() + if pErr != nil { + return pErr + } + return cErr + } + props := func(name string) (map[xml.Name]Property, error) { + f, err := fs.OpenFile(name, os.O_RDWR, 0666) + if err != nil { + return nil, err + } + m, pErr := f.(DeadPropsHolder).DeadProps() + cErr := f.Close() + if pErr != nil { + return nil, pErr + } + if cErr != nil { + return nil, cErr + } + return m, nil + } + + p0 := Property{ + XMLName: xml.Name{Space: "x:", Local: "boat"}, + InnerXML: []byte("pea-green"), + } + p1 := Property{ + XMLName: xml.Name{Space: "x:", Local: "ring"}, + InnerXML: []byte("1 shilling"), + } + p2 := Property{ + XMLName: xml.Name{Space: "x:", Local: "spoon"}, + InnerXML: []byte("runcible"), + } + p3 := Property{ + XMLName: xml.Name{Space: "x:", Local: "moon"}, + InnerXML: []byte("light"), + } + + if err := create("/src"); err != nil { + t.Fatalf("create /src: %v", err) + } + if err := patch("/src", Proppatch{Props: []Property{p0, p1}}); err != nil { + t.Fatalf("patch /src +p0 +p1: %v", err) + } + if _, err := copyFiles(fs, "/src", "/tmp", true, infiniteDepth, 0); err != nil { + t.Fatalf("copyFiles /src /tmp: %v", err) + } + if _, err := moveFiles(fs, "/tmp", "/dst", true); err != nil { + t.Fatalf("moveFiles /tmp /dst: %v", err) + } + if err := patch("/src", Proppatch{Props: []Property{p0}, Remove: true}); err != nil { + t.Fatalf("patch /src -p0: %v", err) + } + if err := patch("/src", Proppatch{Props: []Property{p2}}); err != nil { + t.Fatalf("patch /src +p2: %v", err) + } + if err := patch("/dst", Proppatch{Props: []Property{p1}, Remove: true}); err != nil { + t.Fatalf("patch /dst -p1: %v", err) + } + if err := patch("/dst", Proppatch{Props: []Property{p3}}); err != nil { + t.Fatalf("patch /dst +p3: %v", err) + } + + gotSrc, err := props("/src") + if err != nil { + t.Fatalf("props /src: %v", err) + } + wantSrc := map[xml.Name]Property{ + p1.XMLName: p1, + p2.XMLName: p2, + } + if !reflect.DeepEqual(gotSrc, wantSrc) { + t.Fatalf("props /src:\ngot %v\nwant %v", gotSrc, wantSrc) + } + + gotDst, err := props("/dst") + if err != nil { + t.Fatalf("props /dst: %v", err) + } + wantDst := map[xml.Name]Property{ + p0.XMLName: p0, + p3.XMLName: p3, + } + if !reflect.DeepEqual(gotDst, wantDst) { + t.Fatalf("props /dst:\ngot %v\nwant %v", gotDst, wantDst) + } +} + +func TestWalkFS(t *testing.T) { + testCases := []struct { + desc string + buildfs []string + startAt string + depth int + walkFn filepath.WalkFunc + want []string + }{{ + "just root", + []string{}, + "/", + infiniteDepth, + nil, + []string{ + "/", + }, + }, { + "infinite walk from root", + []string{ + "mkdir /a", + "mkdir /a/b", + "touch /a/b/c", + "mkdir /a/d", + "mkdir /e", + "touch /f", + }, + "/", + infiniteDepth, + nil, + []string{ + "/", + "/a", + "/a/b", + "/a/b/c", + "/a/d", + "/e", + "/f", + }, + }, { + "infinite walk from subdir", + []string{ + "mkdir /a", + "mkdir /a/b", + "touch /a/b/c", + "mkdir /a/d", + "mkdir /e", + "touch /f", + }, + "/a", + infiniteDepth, + nil, + []string{ + "/a", + "/a/b", + "/a/b/c", + "/a/d", + }, + }, { + "depth 1 walk from root", + []string{ + "mkdir /a", + "mkdir /a/b", + "touch /a/b/c", + "mkdir /a/d", + "mkdir /e", + "touch /f", + }, + "/", + 1, + nil, + []string{ + "/", + "/a", + "/e", + "/f", + }, + }, { + "depth 1 walk from subdir", + []string{ + "mkdir /a", + "mkdir /a/b", + "touch /a/b/c", + "mkdir /a/b/g", + "mkdir /a/b/g/h", + "touch /a/b/g/i", + "touch /a/b/g/h/j", + }, + "/a/b", + 1, + nil, + []string{ + "/a/b", + "/a/b/c", + "/a/b/g", + }, + }, { + "depth 0 walk from subdir", + []string{ + "mkdir /a", + "mkdir /a/b", + "touch /a/b/c", + "mkdir /a/b/g", + "mkdir /a/b/g/h", + "touch /a/b/g/i", + "touch /a/b/g/h/j", + }, + "/a/b", + 0, + nil, + []string{ + "/a/b", + }, + }, { + "infinite walk from file", + []string{ + "mkdir /a", + "touch /a/b", + "touch /a/c", + }, + "/a/b", + 0, + nil, + []string{ + "/a/b", + }, + }, { + "infinite walk with skipped subdir", + []string{ + "mkdir /a", + "mkdir /a/b", + "touch /a/b/c", + "mkdir /a/b/g", + "mkdir /a/b/g/h", + "touch /a/b/g/i", + "touch /a/b/g/h/j", + "touch /a/b/z", + }, + "/", + infiniteDepth, + func(path string, info os.FileInfo, err error) error { + if path == "/a/b/g" { + return filepath.SkipDir + } + return nil + }, + []string{ + "/", + "/a", + "/a/b", + "/a/b/c", + "/a/b/z", + }, + }} + for _, tc := range testCases { + fs, err := buildTestFS(tc.buildfs) + if err != nil { + t.Fatalf("%s: cannot create test filesystem: %v", tc.desc, err) + } + var got []string + traceFn := func(path string, info os.FileInfo, err error) error { + if tc.walkFn != nil { + err = tc.walkFn(path, info, err) + if err != nil { + return err + } + } + got = append(got, path) + return nil + } + fi, err := fs.Stat(tc.startAt) + if err != nil { + t.Fatalf("%s: cannot stat: %v", tc.desc, err) + } + err = walkFS(fs, tc.depth, tc.startAt, fi, traceFn) + if err != nil { + t.Errorf("%s:\ngot error %v, want nil", tc.desc, err) + continue + } + sort.Strings(got) + sort.Strings(tc.want) + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("%s:\ngot %q\nwant %q", tc.desc, got, tc.want) + continue + } + } +} + +func buildTestFS(buildfs []string) (FileSystem, error) { + // TODO: Could this be merged with the build logic in TestFS? + + fs := NewMemFS() + for _, b := range buildfs { + op := strings.Split(b, " ") + switch op[0] { + case "mkdir": + err := fs.Mkdir(op[1], os.ModeDir|0777) + if err != nil { + return nil, err + } + case "touch": + f, err := fs.OpenFile(op[1], os.O_RDWR|os.O_CREATE, 0666) + if err != nil { + return nil, err + } + f.Close() + case "write": + f, err := fs.OpenFile(op[1], os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + return nil, err + } + _, err = f.Write([]byte(op[2])) + f.Close() + if err != nil { + return nil, err + } + default: + return nil, fmt.Errorf("unknown file operation %q", op[0]) + } + } + return fs, nil +} diff --git a/vendor/golang.org/x/net/webdav/if.go b/vendor/golang.org/x/net/webdav/if.go new file mode 100644 index 0000000000..416e81cdfd --- /dev/null +++ b/vendor/golang.org/x/net/webdav/if.go @@ -0,0 +1,173 @@ +// 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 webdav + +// The If header is covered by Section 10.4. +// http://www.webdav.org/specs/rfc4918.html#HEADER_If + +import ( + "strings" +) + +// ifHeader is a disjunction (OR) of ifLists. +type ifHeader struct { + lists []ifList +} + +// ifList is a conjunction (AND) of Conditions, and an optional resource tag. +type ifList struct { + resourceTag string + conditions []Condition +} + +// parseIfHeader parses the "If: foo bar" HTTP header. The httpHeader string +// should omit the "If:" prefix and have any "\r\n"s collapsed to a " ", as is +// returned by req.Header.Get("If") for a http.Request req. +func parseIfHeader(httpHeader string) (h ifHeader, ok bool) { + s := strings.TrimSpace(httpHeader) + switch tokenType, _, _ := lex(s); tokenType { + case '(': + return parseNoTagLists(s) + case angleTokenType: + return parseTaggedLists(s) + default: + return ifHeader{}, false + } +} + +func parseNoTagLists(s string) (h ifHeader, ok bool) { + for { + l, remaining, ok := parseList(s) + if !ok { + return ifHeader{}, false + } + h.lists = append(h.lists, l) + if remaining == "" { + return h, true + } + s = remaining + } +} + +func parseTaggedLists(s string) (h ifHeader, ok bool) { + resourceTag, n := "", 0 + for first := true; ; first = false { + tokenType, tokenStr, remaining := lex(s) + switch tokenType { + case angleTokenType: + if !first && n == 0 { + return ifHeader{}, false + } + resourceTag, n = tokenStr, 0 + s = remaining + case '(': + n++ + l, remaining, ok := parseList(s) + if !ok { + return ifHeader{}, false + } + l.resourceTag = resourceTag + h.lists = append(h.lists, l) + if remaining == "" { + return h, true + } + s = remaining + default: + return ifHeader{}, false + } + } +} + +func parseList(s string) (l ifList, remaining string, ok bool) { + tokenType, _, s := lex(s) + if tokenType != '(' { + return ifList{}, "", false + } + for { + tokenType, _, remaining = lex(s) + if tokenType == ')' { + if len(l.conditions) == 0 { + return ifList{}, "", false + } + return l, remaining, true + } + c, remaining, ok := parseCondition(s) + if !ok { + return ifList{}, "", false + } + l.conditions = append(l.conditions, c) + s = remaining + } +} + +func parseCondition(s string) (c Condition, remaining string, ok bool) { + tokenType, tokenStr, s := lex(s) + if tokenType == notTokenType { + c.Not = true + tokenType, tokenStr, s = lex(s) + } + switch tokenType { + case strTokenType, angleTokenType: + c.Token = tokenStr + case squareTokenType: + c.ETag = tokenStr + default: + return Condition{}, "", false + } + return c, s, true +} + +// Single-rune tokens like '(' or ')' have a token type equal to their rune. +// All other tokens have a negative token type. +const ( + errTokenType = rune(-1) + eofTokenType = rune(-2) + strTokenType = rune(-3) + notTokenType = rune(-4) + angleTokenType = rune(-5) + squareTokenType = rune(-6) +) + +func lex(s string) (tokenType rune, tokenStr string, remaining string) { + // The net/textproto Reader that parses the HTTP header will collapse + // Linear White Space that spans multiple "\r\n" lines to a single " ", + // so we don't need to look for '\r' or '\n'. + for len(s) > 0 && (s[0] == '\t' || s[0] == ' ') { + s = s[1:] + } + if len(s) == 0 { + return eofTokenType, "", "" + } + i := 0 +loop: + for ; i < len(s); i++ { + switch s[i] { + case '\t', ' ', '(', ')', '<', '>', '[', ']': + break loop + } + } + + if i != 0 { + tokenStr, remaining = s[:i], s[i:] + if tokenStr == "Not" { + return notTokenType, "", remaining + } + return strTokenType, tokenStr, remaining + } + + j := 0 + switch s[0] { + case '<': + j, tokenType = strings.IndexByte(s, '>'), angleTokenType + case '[': + j, tokenType = strings.IndexByte(s, ']'), squareTokenType + default: + return rune(s[0]), "", s[1:] + } + if j < 0 { + return errTokenType, "", "" + } + return tokenType, s[1:j], s[j+1:] +} diff --git a/vendor/golang.org/x/net/webdav/if_test.go b/vendor/golang.org/x/net/webdav/if_test.go new file mode 100644 index 0000000000..aad61a4010 --- /dev/null +++ b/vendor/golang.org/x/net/webdav/if_test.go @@ -0,0 +1,322 @@ +// 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 webdav + +import ( + "reflect" + "strings" + "testing" +) + +func TestParseIfHeader(t *testing.T) { + // The "section x.y.z" test cases come from section x.y.z of the spec at + // http://www.webdav.org/specs/rfc4918.html + testCases := []struct { + desc string + input string + want ifHeader + }{{ + "bad: empty", + ``, + ifHeader{}, + }, { + "bad: no parens", + `foobar`, + ifHeader{}, + }, { + "bad: empty list #1", + `()`, + ifHeader{}, + }, { + "bad: empty list #2", + `(a) (b c) () (d)`, + ifHeader{}, + }, { + "bad: no list after resource #1", + ``, + ifHeader{}, + }, { + "bad: no list after resource #2", + ` (a)`, + ifHeader{}, + }, { + "bad: no list after resource #3", + ` (a) (b) `, + ifHeader{}, + }, { + "bad: no-tag-list followed by tagged-list", + `(a) (b) (c)`, + ifHeader{}, + }, { + "bad: unfinished list", + `(a`, + ifHeader{}, + }, { + "bad: unfinished ETag", + `([b`, + ifHeader{}, + }, { + "bad: unfinished Notted list", + `(Not a`, + ifHeader{}, + }, { + "bad: double Not", + `(Not Not a)`, + ifHeader{}, + }, { + "good: one list with a Token", + `(a)`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `a`, + }}, + }}, + }, + }, { + "good: one list with an ETag", + `([a])`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + ETag: `a`, + }}, + }}, + }, + }, { + "good: one list with three Nots", + `(Not a Not b Not [d])`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Not: true, + Token: `a`, + }, { + Not: true, + Token: `b`, + }, { + Not: true, + ETag: `d`, + }}, + }}, + }, + }, { + "good: two lists", + `(a) (b)`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `a`, + }}, + }, { + conditions: []Condition{{ + Token: `b`, + }}, + }}, + }, + }, { + "good: two Notted lists", + `(Not a) (Not b)`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Not: true, + Token: `a`, + }}, + }, { + conditions: []Condition{{ + Not: true, + Token: `b`, + }}, + }}, + }, + }, { + "section 7.5.1", + ` + ()`, + ifHeader{ + lists: []ifList{{ + resourceTag: `http://www.example.com/users/f/fielding/index.html`, + conditions: []Condition{{ + Token: `urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6`, + }}, + }}, + }, + }, { + "section 7.5.2 #1", + `()`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf`, + }}, + }}, + }, + }, { + "section 7.5.2 #2", + ` + ()`, + ifHeader{ + lists: []ifList{{ + resourceTag: `http://example.com/locked/`, + conditions: []Condition{{ + Token: `urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf`, + }}, + }}, + }, + }, { + "section 7.5.2 #3", + ` + ()`, + ifHeader{ + lists: []ifList{{ + resourceTag: `http://example.com/locked/member`, + conditions: []Condition{{ + Token: `urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf`, + }}, + }}, + }, + }, { + "section 9.9.6", + `() + ()`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `urn:uuid:fe184f2e-6eec-41d0-c765-01adc56e6bb4`, + }}, + }, { + conditions: []Condition{{ + Token: `urn:uuid:e454f3f3-acdc-452a-56c7-00a5c91e4b77`, + }}, + }}, + }, + }, { + "section 9.10.8", + `()`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `urn:uuid:e71d4fae-5dec-22d6-fea5-00a0c91e6be4`, + }}, + }}, + }, + }, { + "section 10.4.6", + `( + ["I am an ETag"]) + (["I am another ETag"])`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, + }, { + ETag: `"I am an ETag"`, + }}, + }, { + conditions: []Condition{{ + ETag: `"I am another ETag"`, + }}, + }}, + }, + }, { + "section 10.4.7", + `(Not + )`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Not: true, + Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, + }, { + Token: `urn:uuid:58f202ac-22cf-11d1-b12d-002035b29092`, + }}, + }}, + }, + }, { + "section 10.4.8", + `() + (Not )`, + ifHeader{ + lists: []ifList{{ + conditions: []Condition{{ + Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, + }}, + }, { + conditions: []Condition{{ + Not: true, + Token: `DAV:no-lock`, + }}, + }}, + }, + }, { + "section 10.4.9", + ` + ( + [W/"A weak ETag"]) (["strong ETag"])`, + ifHeader{ + lists: []ifList{{ + resourceTag: `/resource1`, + conditions: []Condition{{ + Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, + }, { + ETag: `W/"A weak ETag"`, + }}, + }, { + resourceTag: `/resource1`, + conditions: []Condition{{ + ETag: `"strong ETag"`, + }}, + }}, + }, + }, { + "section 10.4.10", + ` + ()`, + ifHeader{ + lists: []ifList{{ + resourceTag: `http://www.example.com/specs/`, + conditions: []Condition{{ + Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, + }}, + }}, + }, + }, { + "section 10.4.11 #1", + ` (["4217"])`, + ifHeader{ + lists: []ifList{{ + resourceTag: `/specs/rfc2518.doc`, + conditions: []Condition{{ + ETag: `"4217"`, + }}, + }}, + }, + }, { + "section 10.4.11 #2", + ` (Not ["4217"])`, + ifHeader{ + lists: []ifList{{ + resourceTag: `/specs/rfc2518.doc`, + conditions: []Condition{{ + Not: true, + ETag: `"4217"`, + }}, + }}, + }, + }} + + for _, tc := range testCases { + got, ok := parseIfHeader(strings.Replace(tc.input, "\n", "", -1)) + if gotEmpty := reflect.DeepEqual(got, ifHeader{}); gotEmpty == ok { + t.Errorf("%s: should be different: empty header == %t, ok == %t", tc.desc, gotEmpty, ok) + continue + } + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("%s:\ngot %v\nwant %v", tc.desc, got, tc.want) + continue + } + } +} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/README b/vendor/golang.org/x/net/webdav/internal/xml/README new file mode 100644 index 0000000000..89656f4896 --- /dev/null +++ b/vendor/golang.org/x/net/webdav/internal/xml/README @@ -0,0 +1,11 @@ +This is a fork of the encoding/xml package at ca1d6c4, the last commit before +https://go.googlesource.com/go/+/c0d6d33 "encoding/xml: restore Go 1.4 name +space behavior" made late in the lead-up to the Go 1.5 release. + +The list of encoding/xml changes is at +https://go.googlesource.com/go/+log/master/src/encoding/xml + +This fork is temporary, and I (nigeltao) expect to revert it after Go 1.6 is +released. + +See http://golang.org/issue/11841 diff --git a/vendor/golang.org/x/net/webdav/internal/xml/atom_test.go b/vendor/golang.org/x/net/webdav/internal/xml/atom_test.go new file mode 100644 index 0000000000..a71284312a --- /dev/null +++ b/vendor/golang.org/x/net/webdav/internal/xml/atom_test.go @@ -0,0 +1,56 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xml + +import "time" + +var atomValue = &Feed{ + XMLName: Name{"http://www.w3.org/2005/Atom", "feed"}, + Title: "Example Feed", + Link: []Link{{Href: "http://example.org/"}}, + Updated: ParseTime("2003-12-13T18:30:02Z"), + Author: Person{Name: "John Doe"}, + Id: "urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6", + + Entry: []Entry{ + { + Title: "Atom-Powered Robots Run Amok", + Link: []Link{{Href: "http://example.org/2003/12/13/atom03"}}, + Id: "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a", + Updated: ParseTime("2003-12-13T18:30:02Z"), + Summary: NewText("Some text."), + }, + }, +} + +var atomXml = `` + + `` + + `Example Feed` + + `urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6` + + `` + + `John Doe` + + `` + + `Atom-Powered Robots Run Amok` + + `urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a` + + `` + + `2003-12-13T18:30:02Z` + + `` + + `Some text.` + + `` + + `` + +func ParseTime(str string) time.Time { + t, err := time.Parse(time.RFC3339, str) + if err != nil { + panic(err) + } + return t +} + +func NewText(text string) Text { + return Text{ + Body: text, + } +} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/example_test.go b/vendor/golang.org/x/net/webdav/internal/xml/example_test.go new file mode 100644 index 0000000000..becedd5839 --- /dev/null +++ b/vendor/golang.org/x/net/webdav/internal/xml/example_test.go @@ -0,0 +1,151 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xml_test + +import ( + "encoding/xml" + "fmt" + "os" +) + +func ExampleMarshalIndent() { + type Address struct { + City, State string + } + type Person struct { + XMLName xml.Name `xml:"person"` + Id int `xml:"id,attr"` + FirstName string `xml:"name>first"` + LastName string `xml:"name>last"` + Age int `xml:"age"` + Height float32 `xml:"height,omitempty"` + Married bool + Address + Comment string `xml:",comment"` + } + + v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42} + v.Comment = " Need more details. " + v.Address = Address{"Hanga Roa", "Easter Island"} + + output, err := xml.MarshalIndent(v, " ", " ") + if err != nil { + fmt.Printf("error: %v\n", err) + } + + os.Stdout.Write(output) + // Output: + // + // + // John + // Doe + // + // 42 + // false + // Hanga Roa + // Easter Island + // + // +} + +func ExampleEncoder() { + type Address struct { + City, State string + } + type Person struct { + XMLName xml.Name `xml:"person"` + Id int `xml:"id,attr"` + FirstName string `xml:"name>first"` + LastName string `xml:"name>last"` + Age int `xml:"age"` + Height float32 `xml:"height,omitempty"` + Married bool + Address + Comment string `xml:",comment"` + } + + v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42} + v.Comment = " Need more details. " + v.Address = Address{"Hanga Roa", "Easter Island"} + + enc := xml.NewEncoder(os.Stdout) + enc.Indent(" ", " ") + if err := enc.Encode(v); err != nil { + fmt.Printf("error: %v\n", err) + } + + // Output: + // + // + // John + // Doe + // + // 42 + // false + // Hanga Roa + // Easter Island + // + // +} + +// This example demonstrates unmarshaling an XML excerpt into a value with +// some preset fields. Note that the Phone field isn't modified and that +// the XML element is ignored. Also, the Groups field is assigned +// considering the element path provided in its tag. +func ExampleUnmarshal() { + type Email struct { + Where string `xml:"where,attr"` + Addr string + } + type Address struct { + City, State string + } + type Result struct { + XMLName xml.Name `xml:"Person"` + Name string `xml:"FullName"` + Phone string + Email []Email + Groups []string `xml:"Group>Value"` + Address + } + v := Result{Name: "none", Phone: "none"} + + data := ` + + Grace R. Emlin + Example Inc. + + gre@example.com + + + gre@work.com + + + Friends + Squash + + Hanga Roa + Easter Island + + ` + err := xml.Unmarshal([]byte(data), &v) + if err != nil { + fmt.Printf("error: %v", err) + return + } + fmt.Printf("XMLName: %#v\n", v.XMLName) + fmt.Printf("Name: %q\n", v.Name) + fmt.Printf("Phone: %q\n", v.Phone) + fmt.Printf("Email: %v\n", v.Email) + fmt.Printf("Groups: %v\n", v.Groups) + fmt.Printf("Address: %v\n", v.Address) + // Output: + // XMLName: xml.Name{Space:"", Local:"Person"} + // Name: "Grace R. Emlin" + // Phone: "none" + // Email: [{home gre@example.com} {work gre@work.com}] + // Groups: [Friends Squash] + // Address: {Hanga Roa Easter Island} +} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/marshal.go b/vendor/golang.org/x/net/webdav/internal/xml/marshal.go new file mode 100644 index 0000000000..3c3b6aca58 --- /dev/null +++ b/vendor/golang.org/x/net/webdav/internal/xml/marshal.go @@ -0,0 +1,1223 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xml + +import ( + "bufio" + "bytes" + "encoding" + "fmt" + "io" + "reflect" + "strconv" + "strings" +) + +const ( + // A generic XML header suitable for use with the output of Marshal. + // This is not automatically added to any output of this package, + // it is provided as a convenience. + Header = `` + "\n" +) + +// Marshal returns the XML encoding of v. +// +// Marshal handles an array or slice by marshalling each of the elements. +// Marshal handles a pointer by marshalling the value it points at or, if the +// pointer is nil, by writing nothing. Marshal handles an interface value by +// marshalling the value it contains or, if the interface value is nil, by +// writing nothing. Marshal handles all other data by writing one or more XML +// elements containing the data. +// +// The name for the XML elements is taken from, in order of preference: +// - the tag on the XMLName field, if the data is a struct +// - the value of the XMLName field of type xml.Name +// - the tag of the struct field used to obtain the data +// - the name of the struct field used to obtain the data +// - the name of the marshalled type +// +// The XML element for a struct contains marshalled elements for each of the +// exported fields of the struct, with these exceptions: +// - the XMLName field, described above, is omitted. +// - a field with tag "-" is omitted. +// - a field with tag "name,attr" becomes an attribute with +// the given name in the XML element. +// - a field with tag ",attr" becomes an attribute with the +// field name in the XML element. +// - a field with tag ",chardata" is written as character data, +// not as an XML element. +// - a field with tag ",innerxml" is written verbatim, not subject +// to the usual marshalling procedure. +// - a field with tag ",comment" is written as an XML comment, not +// subject to the usual marshalling procedure. It must not contain +// the "--" string within it. +// - a field with a tag including the "omitempty" option is omitted +// if the field value is empty. The empty values are false, 0, any +// nil pointer or interface value, and any array, slice, map, or +// string of length zero. +// - an anonymous struct field is handled as if the fields of its +// value were part of the outer struct. +// +// If a field uses a tag "a>b>c", then the element c will be nested inside +// parent elements a and b. Fields that appear next to each other that name +// the same parent will be enclosed in one XML element. +// +// See MarshalIndent for an example. +// +// Marshal will return an error if asked to marshal a channel, function, or map. +func Marshal(v interface{}) ([]byte, error) { + var b bytes.Buffer + if err := NewEncoder(&b).Encode(v); err != nil { + return nil, err + } + return b.Bytes(), nil +} + +// Marshaler is the interface implemented by objects that can marshal +// themselves into valid XML elements. +// +// MarshalXML encodes the receiver as zero or more XML elements. +// By convention, arrays or slices are typically encoded as a sequence +// of elements, one per entry. +// Using start as the element tag is not required, but doing so +// will enable Unmarshal to match the XML elements to the correct +// struct field. +// One common implementation strategy is to construct a separate +// value with a layout corresponding to the desired XML and then +// to encode it using e.EncodeElement. +// Another common strategy is to use repeated calls to e.EncodeToken +// to generate the XML output one token at a time. +// The sequence of encoded tokens must make up zero or more valid +// XML elements. +type Marshaler interface { + MarshalXML(e *Encoder, start StartElement) error +} + +// MarshalerAttr is the interface implemented by objects that can marshal +// themselves into valid XML attributes. +// +// MarshalXMLAttr returns an XML attribute with the encoded value of the receiver. +// Using name as the attribute name is not required, but doing so +// will enable Unmarshal to match the attribute to the correct +// struct field. +// If MarshalXMLAttr returns the zero attribute Attr{}, no attribute +// will be generated in the output. +// MarshalXMLAttr is used only for struct fields with the +// "attr" option in the field tag. +type MarshalerAttr interface { + MarshalXMLAttr(name Name) (Attr, error) +} + +// MarshalIndent works like Marshal, but each XML element begins on a new +// indented line that starts with prefix and is followed by one or more +// copies of indent according to the nesting depth. +func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) { + var b bytes.Buffer + enc := NewEncoder(&b) + enc.Indent(prefix, indent) + if err := enc.Encode(v); err != nil { + return nil, err + } + return b.Bytes(), nil +} + +// An Encoder writes XML data to an output stream. +type Encoder struct { + p printer +} + +// NewEncoder returns a new encoder that writes to w. +func NewEncoder(w io.Writer) *Encoder { + e := &Encoder{printer{Writer: bufio.NewWriter(w)}} + e.p.encoder = e + return e +} + +// Indent sets the encoder to generate XML in which each element +// begins on a new indented line that starts with prefix and is followed by +// one or more copies of indent according to the nesting depth. +func (enc *Encoder) Indent(prefix, indent string) { + enc.p.prefix = prefix + enc.p.indent = indent +} + +// Encode writes the XML encoding of v to the stream. +// +// See the documentation for Marshal for details about the conversion +// of Go values to XML. +// +// Encode calls Flush before returning. +func (enc *Encoder) Encode(v interface{}) error { + err := enc.p.marshalValue(reflect.ValueOf(v), nil, nil) + if err != nil { + return err + } + return enc.p.Flush() +} + +// EncodeElement writes the XML encoding of v to the stream, +// using start as the outermost tag in the encoding. +// +// See the documentation for Marshal for details about the conversion +// of Go values to XML. +// +// EncodeElement calls Flush before returning. +func (enc *Encoder) EncodeElement(v interface{}, start StartElement) error { + err := enc.p.marshalValue(reflect.ValueOf(v), nil, &start) + if err != nil { + return err + } + return enc.p.Flush() +} + +var ( + begComment = []byte("") + endProcInst = []byte("?>") + endDirective = []byte(">") +) + +// EncodeToken writes the given XML token to the stream. +// It returns an error if StartElement and EndElement tokens are not +// properly matched. +// +// EncodeToken does not call Flush, because usually it is part of a +// larger operation such as Encode or EncodeElement (or a custom +// Marshaler's MarshalXML invoked during those), and those will call +// Flush when finished. Callers that create an Encoder and then invoke +// EncodeToken directly, without using Encode or EncodeElement, need to +// call Flush when finished to ensure that the XML is written to the +// underlying writer. +// +// EncodeToken allows writing a ProcInst with Target set to "xml" only +// as the first token in the stream. +// +// When encoding a StartElement holding an XML namespace prefix +// declaration for a prefix that is not already declared, contained +// elements (including the StartElement itself) will use the declared +// prefix when encoding names with matching namespace URIs. +func (enc *Encoder) EncodeToken(t Token) error { + + p := &enc.p + switch t := t.(type) { + case StartElement: + if err := p.writeStart(&t); err != nil { + return err + } + case EndElement: + if err := p.writeEnd(t.Name); err != nil { + return err + } + case CharData: + escapeText(p, t, false) + case Comment: + if bytes.Contains(t, endComment) { + return fmt.Errorf("xml: EncodeToken of Comment containing --> marker") + } + p.WriteString("") + return p.cachedWriteError() + case ProcInst: + // First token to be encoded which is also a ProcInst with target of xml + // is the xml declaration. The only ProcInst where target of xml is allowed. + if t.Target == "xml" && p.Buffered() != 0 { + return fmt.Errorf("xml: EncodeToken of ProcInst xml target only valid for xml declaration, first token encoded") + } + if !isNameString(t.Target) { + return fmt.Errorf("xml: EncodeToken of ProcInst with invalid Target") + } + if bytes.Contains(t.Inst, endProcInst) { + return fmt.Errorf("xml: EncodeToken of ProcInst containing ?> marker") + } + p.WriteString(" 0 { + p.WriteByte(' ') + p.Write(t.Inst) + } + p.WriteString("?>") + case Directive: + if !isValidDirective(t) { + return fmt.Errorf("xml: EncodeToken of Directive containing wrong < or > markers") + } + p.WriteString("") + default: + return fmt.Errorf("xml: EncodeToken of invalid token type") + + } + return p.cachedWriteError() +} + +// isValidDirective reports whether dir is a valid directive text, +// meaning angle brackets are matched, ignoring comments and strings. +func isValidDirective(dir Directive) bool { + var ( + depth int + inquote uint8 + incomment bool + ) + for i, c := range dir { + switch { + case incomment: + if c == '>' { + if n := 1 + i - len(endComment); n >= 0 && bytes.Equal(dir[n:i+1], endComment) { + incomment = false + } + } + // Just ignore anything in comment + case inquote != 0: + if c == inquote { + inquote = 0 + } + // Just ignore anything within quotes + case c == '\'' || c == '"': + inquote = c + case c == '<': + if i+len(begComment) < len(dir) && bytes.Equal(dir[i:i+len(begComment)], begComment) { + incomment = true + } else { + depth++ + } + case c == '>': + if depth == 0 { + return false + } + depth-- + } + } + return depth == 0 && inquote == 0 && !incomment +} + +// Flush flushes any buffered XML to the underlying writer. +// See the EncodeToken documentation for details about when it is necessary. +func (enc *Encoder) Flush() error { + return enc.p.Flush() +} + +type printer struct { + *bufio.Writer + encoder *Encoder + seq int + indent string + prefix string + depth int + indentedIn bool + putNewline bool + defaultNS string + attrNS map[string]string // map prefix -> name space + attrPrefix map[string]string // map name space -> prefix + prefixes []printerPrefix + tags []Name +} + +// printerPrefix holds a namespace undo record. +// When an element is popped, the prefix record +// is set back to the recorded URL. The empty +// prefix records the URL for the default name space. +// +// The start of an element is recorded with an element +// that has mark=true. +type printerPrefix struct { + prefix string + url string + mark bool +} + +func (p *printer) prefixForNS(url string, isAttr bool) string { + // The "http://www.w3.org/XML/1998/namespace" name space is predefined as "xml" + // and must be referred to that way. + // (The "http://www.w3.org/2000/xmlns/" name space is also predefined as "xmlns", + // but users should not be trying to use that one directly - that's our job.) + if url == xmlURL { + return "xml" + } + if !isAttr && url == p.defaultNS { + // We can use the default name space. + return "" + } + return p.attrPrefix[url] +} + +// defineNS pushes any namespace definition found in the given attribute. +// If ignoreNonEmptyDefault is true, an xmlns="nonempty" +// attribute will be ignored. +func (p *printer) defineNS(attr Attr, ignoreNonEmptyDefault bool) error { + var prefix string + if attr.Name.Local == "xmlns" { + if attr.Name.Space != "" && attr.Name.Space != "xml" && attr.Name.Space != xmlURL { + return fmt.Errorf("xml: cannot redefine xmlns attribute prefix") + } + } else if attr.Name.Space == "xmlns" && attr.Name.Local != "" { + prefix = attr.Name.Local + if attr.Value == "" { + // Technically, an empty XML namespace is allowed for an attribute. + // From http://www.w3.org/TR/xml-names11/#scoping-defaulting: + // + // The attribute value in a namespace declaration for a prefix may be + // empty. This has the effect, within the scope of the declaration, of removing + // any association of the prefix with a namespace name. + // + // However our namespace prefixes here are used only as hints. There's + // no need to respect the removal of a namespace prefix, so we ignore it. + return nil + } + } else { + // Ignore: it's not a namespace definition + return nil + } + if prefix == "" { + if attr.Value == p.defaultNS { + // No need for redefinition. + return nil + } + if attr.Value != "" && ignoreNonEmptyDefault { + // We have an xmlns="..." value but + // it can't define a name space in this context, + // probably because the element has an empty + // name space. In this case, we just ignore + // the name space declaration. + return nil + } + } else if _, ok := p.attrPrefix[attr.Value]; ok { + // There's already a prefix for the given name space, + // so use that. This prevents us from + // having two prefixes for the same name space + // so attrNS and attrPrefix can remain bijective. + return nil + } + p.pushPrefix(prefix, attr.Value) + return nil +} + +// createNSPrefix creates a name space prefix attribute +// to use for the given name space, defining a new prefix +// if necessary. +// If isAttr is true, the prefix is to be created for an attribute +// prefix, which means that the default name space cannot +// be used. +func (p *printer) createNSPrefix(url string, isAttr bool) { + if _, ok := p.attrPrefix[url]; ok { + // We already have a prefix for the given URL. + return + } + switch { + case !isAttr && url == p.defaultNS: + // We can use the default name space. + return + case url == "": + // The only way we can encode names in the empty + // name space is by using the default name space, + // so we must use that. + if p.defaultNS != "" { + // The default namespace is non-empty, so we + // need to set it to empty. + p.pushPrefix("", "") + } + return + case url == xmlURL: + return + } + // TODO If the URL is an existing prefix, we could + // use it as is. That would enable the + // marshaling of elements that had been unmarshaled + // and with a name space prefix that was not found. + // although technically it would be incorrect. + + // Pick a name. We try to use the final element of the path + // but fall back to _. + prefix := strings.TrimRight(url, "/") + if i := strings.LastIndex(prefix, "/"); i >= 0 { + prefix = prefix[i+1:] + } + if prefix == "" || !isName([]byte(prefix)) || strings.Contains(prefix, ":") { + prefix = "_" + } + if strings.HasPrefix(prefix, "xml") { + // xmlanything is reserved. + prefix = "_" + prefix + } + if p.attrNS[prefix] != "" { + // Name is taken. Find a better one. + for p.seq++; ; p.seq++ { + if id := prefix + "_" + strconv.Itoa(p.seq); p.attrNS[id] == "" { + prefix = id + break + } + } + } + + p.pushPrefix(prefix, url) +} + +// writeNamespaces writes xmlns attributes for all the +// namespace prefixes that have been defined in +// the current element. +func (p *printer) writeNamespaces() { + for i := len(p.prefixes) - 1; i >= 0; i-- { + prefix := p.prefixes[i] + if prefix.mark { + return + } + p.WriteString(" ") + if prefix.prefix == "" { + // Default name space. + p.WriteString(`xmlns="`) + } else { + p.WriteString("xmlns:") + p.WriteString(prefix.prefix) + p.WriteString(`="`) + } + EscapeText(p, []byte(p.nsForPrefix(prefix.prefix))) + p.WriteString(`"`) + } +} + +// pushPrefix pushes a new prefix on the prefix stack +// without checking to see if it is already defined. +func (p *printer) pushPrefix(prefix, url string) { + p.prefixes = append(p.prefixes, printerPrefix{ + prefix: prefix, + url: p.nsForPrefix(prefix), + }) + p.setAttrPrefix(prefix, url) +} + +// nsForPrefix returns the name space for the given +// prefix. Note that this is not valid for the +// empty attribute prefix, which always has an empty +// name space. +func (p *printer) nsForPrefix(prefix string) string { + if prefix == "" { + return p.defaultNS + } + return p.attrNS[prefix] +} + +// markPrefix marks the start of an element on the prefix +// stack. +func (p *printer) markPrefix() { + p.prefixes = append(p.prefixes, printerPrefix{ + mark: true, + }) +} + +// popPrefix pops all defined prefixes for the current +// element. +func (p *printer) popPrefix() { + for len(p.prefixes) > 0 { + prefix := p.prefixes[len(p.prefixes)-1] + p.prefixes = p.prefixes[:len(p.prefixes)-1] + if prefix.mark { + break + } + p.setAttrPrefix(prefix.prefix, prefix.url) + } +} + +// setAttrPrefix sets an attribute name space prefix. +// If url is empty, the attribute is removed. +// If prefix is empty, the default name space is set. +func (p *printer) setAttrPrefix(prefix, url string) { + if prefix == "" { + p.defaultNS = url + return + } + if url == "" { + delete(p.attrPrefix, p.attrNS[prefix]) + delete(p.attrNS, prefix) + return + } + if p.attrPrefix == nil { + // Need to define a new name space. + p.attrPrefix = make(map[string]string) + p.attrNS = make(map[string]string) + } + // Remove any old prefix value. This is OK because we maintain a + // strict one-to-one mapping between prefix and URL (see + // defineNS) + delete(p.attrPrefix, p.attrNS[prefix]) + p.attrPrefix[url] = prefix + p.attrNS[prefix] = url +} + +var ( + marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() + marshalerAttrType = reflect.TypeOf((*MarshalerAttr)(nil)).Elem() + textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() +) + +// marshalValue writes one or more XML elements representing val. +// If val was obtained from a struct field, finfo must have its details. +func (p *printer) marshalValue(val reflect.Value, finfo *fieldInfo, startTemplate *StartElement) error { + if startTemplate != nil && startTemplate.Name.Local == "" { + return fmt.Errorf("xml: EncodeElement of StartElement with missing name") + } + + if !val.IsValid() { + return nil + } + if finfo != nil && finfo.flags&fOmitEmpty != 0 && isEmptyValue(val) { + return nil + } + + // Drill into interfaces and pointers. + // This can turn into an infinite loop given a cyclic chain, + // but it matches the Go 1 behavior. + for val.Kind() == reflect.Interface || val.Kind() == reflect.Ptr { + if val.IsNil() { + return nil + } + val = val.Elem() + } + + kind := val.Kind() + typ := val.Type() + + // Check for marshaler. + if val.CanInterface() && typ.Implements(marshalerType) { + return p.marshalInterface(val.Interface().(Marshaler), p.defaultStart(typ, finfo, startTemplate)) + } + if val.CanAddr() { + pv := val.Addr() + if pv.CanInterface() && pv.Type().Implements(marshalerType) { + return p.marshalInterface(pv.Interface().(Marshaler), p.defaultStart(pv.Type(), finfo, startTemplate)) + } + } + + // Check for text marshaler. + if val.CanInterface() && typ.Implements(textMarshalerType) { + return p.marshalTextInterface(val.Interface().(encoding.TextMarshaler), p.defaultStart(typ, finfo, startTemplate)) + } + if val.CanAddr() { + pv := val.Addr() + if pv.CanInterface() && pv.Type().Implements(textMarshalerType) { + return p.marshalTextInterface(pv.Interface().(encoding.TextMarshaler), p.defaultStart(pv.Type(), finfo, startTemplate)) + } + } + + // Slices and arrays iterate over the elements. They do not have an enclosing tag. + if (kind == reflect.Slice || kind == reflect.Array) && typ.Elem().Kind() != reflect.Uint8 { + for i, n := 0, val.Len(); i < n; i++ { + if err := p.marshalValue(val.Index(i), finfo, startTemplate); err != nil { + return err + } + } + return nil + } + + tinfo, err := getTypeInfo(typ) + if err != nil { + return err + } + + // Create start element. + // Precedence for the XML element name is: + // 0. startTemplate + // 1. XMLName field in underlying struct; + // 2. field name/tag in the struct field; and + // 3. type name + var start StartElement + + // explicitNS records whether the element's name space has been + // explicitly set (for example an XMLName field). + explicitNS := false + + if startTemplate != nil { + start.Name = startTemplate.Name + explicitNS = true + start.Attr = append(start.Attr, startTemplate.Attr...) + } else if tinfo.xmlname != nil { + xmlname := tinfo.xmlname + if xmlname.name != "" { + start.Name.Space, start.Name.Local = xmlname.xmlns, xmlname.name + } else if v, ok := xmlname.value(val).Interface().(Name); ok && v.Local != "" { + start.Name = v + } + explicitNS = true + } + if start.Name.Local == "" && finfo != nil { + start.Name.Local = finfo.name + if finfo.xmlns != "" { + start.Name.Space = finfo.xmlns + explicitNS = true + } + } + if start.Name.Local == "" { + name := typ.Name() + if name == "" { + return &UnsupportedTypeError{typ} + } + start.Name.Local = name + } + + // defaultNS records the default name space as set by a xmlns="..." + // attribute. We don't set p.defaultNS because we want to let + // the attribute writing code (in p.defineNS) be solely responsible + // for maintaining that. + defaultNS := p.defaultNS + + // Attributes + for i := range tinfo.fields { + finfo := &tinfo.fields[i] + if finfo.flags&fAttr == 0 { + continue + } + attr, err := p.fieldAttr(finfo, val) + if err != nil { + return err + } + if attr.Name.Local == "" { + continue + } + start.Attr = append(start.Attr, attr) + if attr.Name.Space == "" && attr.Name.Local == "xmlns" { + defaultNS = attr.Value + } + } + if !explicitNS { + // Historic behavior: elements use the default name space + // they are contained in by default. + start.Name.Space = defaultNS + } + // Historic behaviour: an element that's in a namespace sets + // the default namespace for all elements contained within it. + start.setDefaultNamespace() + + if err := p.writeStart(&start); err != nil { + return err + } + + if val.Kind() == reflect.Struct { + err = p.marshalStruct(tinfo, val) + } else { + s, b, err1 := p.marshalSimple(typ, val) + if err1 != nil { + err = err1 + } else if b != nil { + EscapeText(p, b) + } else { + p.EscapeString(s) + } + } + if err != nil { + return err + } + + if err := p.writeEnd(start.Name); err != nil { + return err + } + + return p.cachedWriteError() +} + +// fieldAttr returns the attribute of the given field. +// If the returned attribute has an empty Name.Local, +// it should not be used. +// The given value holds the value containing the field. +func (p *printer) fieldAttr(finfo *fieldInfo, val reflect.Value) (Attr, error) { + fv := finfo.value(val) + name := Name{Space: finfo.xmlns, Local: finfo.name} + if finfo.flags&fOmitEmpty != 0 && isEmptyValue(fv) { + return Attr{}, nil + } + if fv.Kind() == reflect.Interface && fv.IsNil() { + return Attr{}, nil + } + if fv.CanInterface() && fv.Type().Implements(marshalerAttrType) { + attr, err := fv.Interface().(MarshalerAttr).MarshalXMLAttr(name) + return attr, err + } + if fv.CanAddr() { + pv := fv.Addr() + if pv.CanInterface() && pv.Type().Implements(marshalerAttrType) { + attr, err := pv.Interface().(MarshalerAttr).MarshalXMLAttr(name) + return attr, err + } + } + if fv.CanInterface() && fv.Type().Implements(textMarshalerType) { + text, err := fv.Interface().(encoding.TextMarshaler).MarshalText() + if err != nil { + return Attr{}, err + } + return Attr{name, string(text)}, nil + } + if fv.CanAddr() { + pv := fv.Addr() + if pv.CanInterface() && pv.Type().Implements(textMarshalerType) { + text, err := pv.Interface().(encoding.TextMarshaler).MarshalText() + if err != nil { + return Attr{}, err + } + return Attr{name, string(text)}, nil + } + } + // Dereference or skip nil pointer, interface values. + switch fv.Kind() { + case reflect.Ptr, reflect.Interface: + if fv.IsNil() { + return Attr{}, nil + } + fv = fv.Elem() + } + s, b, err := p.marshalSimple(fv.Type(), fv) + if err != nil { + return Attr{}, err + } + if b != nil { + s = string(b) + } + return Attr{name, s}, nil +} + +// defaultStart returns the default start element to use, +// given the reflect type, field info, and start template. +func (p *printer) defaultStart(typ reflect.Type, finfo *fieldInfo, startTemplate *StartElement) StartElement { + var start StartElement + // Precedence for the XML element name is as above, + // except that we do not look inside structs for the first field. + if startTemplate != nil { + start.Name = startTemplate.Name + start.Attr = append(start.Attr, startTemplate.Attr...) + } else if finfo != nil && finfo.name != "" { + start.Name.Local = finfo.name + start.Name.Space = finfo.xmlns + } else if typ.Name() != "" { + start.Name.Local = typ.Name() + } else { + // Must be a pointer to a named type, + // since it has the Marshaler methods. + start.Name.Local = typ.Elem().Name() + } + // Historic behaviour: elements use the name space of + // the element they are contained in by default. + if start.Name.Space == "" { + start.Name.Space = p.defaultNS + } + start.setDefaultNamespace() + return start +} + +// marshalInterface marshals a Marshaler interface value. +func (p *printer) marshalInterface(val Marshaler, start StartElement) error { + // Push a marker onto the tag stack so that MarshalXML + // cannot close the XML tags that it did not open. + p.tags = append(p.tags, Name{}) + n := len(p.tags) + + err := val.MarshalXML(p.encoder, start) + if err != nil { + return err + } + + // Make sure MarshalXML closed all its tags. p.tags[n-1] is the mark. + if len(p.tags) > n { + return fmt.Errorf("xml: %s.MarshalXML wrote invalid XML: <%s> not closed", receiverType(val), p.tags[len(p.tags)-1].Local) + } + p.tags = p.tags[:n-1] + return nil +} + +// marshalTextInterface marshals a TextMarshaler interface value. +func (p *printer) marshalTextInterface(val encoding.TextMarshaler, start StartElement) error { + if err := p.writeStart(&start); err != nil { + return err + } + text, err := val.MarshalText() + if err != nil { + return err + } + EscapeText(p, text) + return p.writeEnd(start.Name) +} + +// writeStart writes the given start element. +func (p *printer) writeStart(start *StartElement) error { + if start.Name.Local == "" { + return fmt.Errorf("xml: start tag with no name") + } + + p.tags = append(p.tags, start.Name) + p.markPrefix() + // Define any name spaces explicitly declared in the attributes. + // We do this as a separate pass so that explicitly declared prefixes + // will take precedence over implicitly declared prefixes + // regardless of the order of the attributes. + ignoreNonEmptyDefault := start.Name.Space == "" + for _, attr := range start.Attr { + if err := p.defineNS(attr, ignoreNonEmptyDefault); err != nil { + return err + } + } + // Define any new name spaces implied by the attributes. + for _, attr := range start.Attr { + name := attr.Name + // From http://www.w3.org/TR/xml-names11/#defaulting + // "Default namespace declarations do not apply directly + // to attribute names; the interpretation of unprefixed + // attributes is determined by the element on which they + // appear." + // This means we don't need to create a new namespace + // when an attribute name space is empty. + if name.Space != "" && !name.isNamespace() { + p.createNSPrefix(name.Space, true) + } + } + p.createNSPrefix(start.Name.Space, false) + + p.writeIndent(1) + p.WriteByte('<') + p.writeName(start.Name, false) + p.writeNamespaces() + for _, attr := range start.Attr { + name := attr.Name + if name.Local == "" || name.isNamespace() { + // Namespaces have already been written by writeNamespaces above. + continue + } + p.WriteByte(' ') + p.writeName(name, true) + p.WriteString(`="`) + p.EscapeString(attr.Value) + p.WriteByte('"') + } + p.WriteByte('>') + return nil +} + +// writeName writes the given name. It assumes +// that p.createNSPrefix(name) has already been called. +func (p *printer) writeName(name Name, isAttr bool) { + if prefix := p.prefixForNS(name.Space, isAttr); prefix != "" { + p.WriteString(prefix) + p.WriteByte(':') + } + p.WriteString(name.Local) +} + +func (p *printer) writeEnd(name Name) error { + if name.Local == "" { + return fmt.Errorf("xml: end tag with no name") + } + if len(p.tags) == 0 || p.tags[len(p.tags)-1].Local == "" { + return fmt.Errorf("xml: end tag without start tag", name.Local) + } + if top := p.tags[len(p.tags)-1]; top != name { + if top.Local != name.Local { + return fmt.Errorf("xml: end tag does not match start tag <%s>", name.Local, top.Local) + } + return fmt.Errorf("xml: end tag in namespace %s does not match start tag <%s> in namespace %s", name.Local, name.Space, top.Local, top.Space) + } + p.tags = p.tags[:len(p.tags)-1] + + p.writeIndent(-1) + p.WriteByte('<') + p.WriteByte('/') + p.writeName(name, false) + p.WriteByte('>') + p.popPrefix() + return nil +} + +func (p *printer) marshalSimple(typ reflect.Type, val reflect.Value) (string, []byte, error) { + switch val.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return strconv.FormatInt(val.Int(), 10), nil, nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return strconv.FormatUint(val.Uint(), 10), nil, nil + case reflect.Float32, reflect.Float64: + return strconv.FormatFloat(val.Float(), 'g', -1, val.Type().Bits()), nil, nil + case reflect.String: + return val.String(), nil, nil + case reflect.Bool: + return strconv.FormatBool(val.Bool()), nil, nil + case reflect.Array: + if typ.Elem().Kind() != reflect.Uint8 { + break + } + // [...]byte + var bytes []byte + if val.CanAddr() { + bytes = val.Slice(0, val.Len()).Bytes() + } else { + bytes = make([]byte, val.Len()) + reflect.Copy(reflect.ValueOf(bytes), val) + } + return "", bytes, nil + case reflect.Slice: + if typ.Elem().Kind() != reflect.Uint8 { + break + } + // []byte + return "", val.Bytes(), nil + } + return "", nil, &UnsupportedTypeError{typ} +} + +var ddBytes = []byte("--") + +func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error { + s := parentStack{p: p} + for i := range tinfo.fields { + finfo := &tinfo.fields[i] + if finfo.flags&fAttr != 0 { + continue + } + vf := finfo.value(val) + + // Dereference or skip nil pointer, interface values. + switch vf.Kind() { + case reflect.Ptr, reflect.Interface: + if !vf.IsNil() { + vf = vf.Elem() + } + } + + switch finfo.flags & fMode { + case fCharData: + if err := s.setParents(&noField, reflect.Value{}); err != nil { + return err + } + if vf.CanInterface() && vf.Type().Implements(textMarshalerType) { + data, err := vf.Interface().(encoding.TextMarshaler).MarshalText() + if err != nil { + return err + } + Escape(p, data) + continue + } + if vf.CanAddr() { + pv := vf.Addr() + if pv.CanInterface() && pv.Type().Implements(textMarshalerType) { + data, err := pv.Interface().(encoding.TextMarshaler).MarshalText() + if err != nil { + return err + } + Escape(p, data) + continue + } + } + var scratch [64]byte + switch vf.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + Escape(p, strconv.AppendInt(scratch[:0], vf.Int(), 10)) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + Escape(p, strconv.AppendUint(scratch[:0], vf.Uint(), 10)) + case reflect.Float32, reflect.Float64: + Escape(p, strconv.AppendFloat(scratch[:0], vf.Float(), 'g', -1, vf.Type().Bits())) + case reflect.Bool: + Escape(p, strconv.AppendBool(scratch[:0], vf.Bool())) + case reflect.String: + if err := EscapeText(p, []byte(vf.String())); err != nil { + return err + } + case reflect.Slice: + if elem, ok := vf.Interface().([]byte); ok { + if err := EscapeText(p, elem); err != nil { + return err + } + } + } + continue + + case fComment: + if err := s.setParents(&noField, reflect.Value{}); err != nil { + return err + } + k := vf.Kind() + if !(k == reflect.String || k == reflect.Slice && vf.Type().Elem().Kind() == reflect.Uint8) { + return fmt.Errorf("xml: bad type for comment field of %s", val.Type()) + } + if vf.Len() == 0 { + continue + } + p.writeIndent(0) + p.WriteString("" is invalid grammar. Make it "- -->" + p.WriteByte(' ') + } + p.WriteString("-->") + continue + + case fInnerXml: + iface := vf.Interface() + switch raw := iface.(type) { + case []byte: + p.Write(raw) + continue + case string: + p.WriteString(raw) + continue + } + + case fElement, fElement | fAny: + if err := s.setParents(finfo, vf); err != nil { + return err + } + } + if err := p.marshalValue(vf, finfo, nil); err != nil { + return err + } + } + if err := s.setParents(&noField, reflect.Value{}); err != nil { + return err + } + return p.cachedWriteError() +} + +var noField fieldInfo + +// return the bufio Writer's cached write error +func (p *printer) cachedWriteError() error { + _, err := p.Write(nil) + return err +} + +func (p *printer) writeIndent(depthDelta int) { + if len(p.prefix) == 0 && len(p.indent) == 0 { + return + } + if depthDelta < 0 { + p.depth-- + if p.indentedIn { + p.indentedIn = false + return + } + p.indentedIn = false + } + if p.putNewline { + p.WriteByte('\n') + } else { + p.putNewline = true + } + if len(p.prefix) > 0 { + p.WriteString(p.prefix) + } + if len(p.indent) > 0 { + for i := 0; i < p.depth; i++ { + p.WriteString(p.indent) + } + } + if depthDelta > 0 { + p.depth++ + p.indentedIn = true + } +} + +type parentStack struct { + p *printer + xmlns string + parents []string +} + +// setParents sets the stack of current parents to those found in finfo. +// It only writes the start elements if vf holds a non-nil value. +// If finfo is &noField, it pops all elements. +func (s *parentStack) setParents(finfo *fieldInfo, vf reflect.Value) error { + xmlns := s.p.defaultNS + if finfo.xmlns != "" { + xmlns = finfo.xmlns + } + commonParents := 0 + if xmlns == s.xmlns { + for ; commonParents < len(finfo.parents) && commonParents < len(s.parents); commonParents++ { + if finfo.parents[commonParents] != s.parents[commonParents] { + break + } + } + } + // Pop off any parents that aren't in common with the previous field. + for i := len(s.parents) - 1; i >= commonParents; i-- { + if err := s.p.writeEnd(Name{ + Space: s.xmlns, + Local: s.parents[i], + }); err != nil { + return err + } + } + s.parents = finfo.parents + s.xmlns = xmlns + if commonParents >= len(s.parents) { + // No new elements to push. + return nil + } + if (vf.Kind() == reflect.Ptr || vf.Kind() == reflect.Interface) && vf.IsNil() { + // The element is nil, so no need for the start elements. + s.parents = s.parents[:commonParents] + return nil + } + // Push any new parents required. + for _, name := range s.parents[commonParents:] { + start := &StartElement{ + Name: Name{ + Space: s.xmlns, + Local: name, + }, + } + // Set the default name space for parent elements + // to match what we do with other elements. + if s.xmlns != s.p.defaultNS { + start.setDefaultNamespace() + } + if err := s.p.writeStart(start); err != nil { + return err + } + } + return nil +} + +// A MarshalXMLError is returned when Marshal encounters a type +// that cannot be converted into XML. +type UnsupportedTypeError struct { + Type reflect.Type +} + +func (e *UnsupportedTypeError) Error() string { + return "xml: unsupported type: " + e.Type.String() +} + +func isEmptyValue(v reflect.Value) bool { + switch v.Kind() { + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + return v.Len() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + } + return false +} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go b/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go new file mode 100644 index 0000000000..5dc78e748b --- /dev/null +++ b/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go @@ -0,0 +1,1939 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xml + +import ( + "bytes" + "errors" + "fmt" + "io" + "reflect" + "strconv" + "strings" + "sync" + "testing" + "time" +) + +type DriveType int + +const ( + HyperDrive DriveType = iota + ImprobabilityDrive +) + +type Passenger struct { + Name []string `xml:"name"` + Weight float32 `xml:"weight"` +} + +type Ship struct { + XMLName struct{} `xml:"spaceship"` + + Name string `xml:"name,attr"` + Pilot string `xml:"pilot,attr"` + Drive DriveType `xml:"drive"` + Age uint `xml:"age"` + Passenger []*Passenger `xml:"passenger"` + secret string +} + +type NamedType string + +type Port struct { + XMLName struct{} `xml:"port"` + Type string `xml:"type,attr,omitempty"` + Comment string `xml:",comment"` + Number string `xml:",chardata"` +} + +type Domain struct { + XMLName struct{} `xml:"domain"` + Country string `xml:",attr,omitempty"` + Name []byte `xml:",chardata"` + Comment []byte `xml:",comment"` +} + +type Book struct { + XMLName struct{} `xml:"book"` + Title string `xml:",chardata"` +} + +type Event struct { + XMLName struct{} `xml:"event"` + Year int `xml:",chardata"` +} + +type Movie struct { + XMLName struct{} `xml:"movie"` + Length uint `xml:",chardata"` +} + +type Pi struct { + XMLName struct{} `xml:"pi"` + Approximation float32 `xml:",chardata"` +} + +type Universe struct { + XMLName struct{} `xml:"universe"` + Visible float64 `xml:",chardata"` +} + +type Particle struct { + XMLName struct{} `xml:"particle"` + HasMass bool `xml:",chardata"` +} + +type Departure struct { + XMLName struct{} `xml:"departure"` + When time.Time `xml:",chardata"` +} + +type SecretAgent struct { + XMLName struct{} `xml:"agent"` + Handle string `xml:"handle,attr"` + Identity string + Obfuscate string `xml:",innerxml"` +} + +type NestedItems struct { + XMLName struct{} `xml:"result"` + Items []string `xml:">item"` + Item1 []string `xml:"Items>item1"` +} + +type NestedOrder struct { + XMLName struct{} `xml:"result"` + Field1 string `xml:"parent>c"` + Field2 string `xml:"parent>b"` + Field3 string `xml:"parent>a"` +} + +type MixedNested struct { + XMLName struct{} `xml:"result"` + A string `xml:"parent1>a"` + B string `xml:"b"` + C string `xml:"parent1>parent2>c"` + D string `xml:"parent1>d"` +} + +type NilTest struct { + A interface{} `xml:"parent1>parent2>a"` + B interface{} `xml:"parent1>b"` + C interface{} `xml:"parent1>parent2>c"` +} + +type Service struct { + XMLName struct{} `xml:"service"` + Domain *Domain `xml:"host>domain"` + Port *Port `xml:"host>port"` + Extra1 interface{} + Extra2 interface{} `xml:"host>extra2"` +} + +var nilStruct *Ship + +type EmbedA struct { + EmbedC + EmbedB EmbedB + FieldA string +} + +type EmbedB struct { + FieldB string + *EmbedC +} + +type EmbedC struct { + FieldA1 string `xml:"FieldA>A1"` + FieldA2 string `xml:"FieldA>A2"` + FieldB string + FieldC string +} + +type NameCasing struct { + XMLName struct{} `xml:"casing"` + Xy string + XY string + XyA string `xml:"Xy,attr"` + XYA string `xml:"XY,attr"` +} + +type NamePrecedence struct { + XMLName Name `xml:"Parent"` + FromTag XMLNameWithoutTag `xml:"InTag"` + FromNameVal XMLNameWithoutTag + FromNameTag XMLNameWithTag + InFieldName string +} + +type XMLNameWithTag struct { + XMLName Name `xml:"InXMLNameTag"` + Value string `xml:",chardata"` +} + +type XMLNameWithNSTag struct { + XMLName Name `xml:"ns InXMLNameWithNSTag"` + Value string `xml:",chardata"` +} + +type XMLNameWithoutTag struct { + XMLName Name + Value string `xml:",chardata"` +} + +type NameInField struct { + Foo Name `xml:"ns foo"` +} + +type AttrTest struct { + Int int `xml:",attr"` + Named int `xml:"int,attr"` + Float float64 `xml:",attr"` + Uint8 uint8 `xml:",attr"` + Bool bool `xml:",attr"` + Str string `xml:",attr"` + Bytes []byte `xml:",attr"` +} + +type OmitAttrTest struct { + Int int `xml:",attr,omitempty"` + Named int `xml:"int,attr,omitempty"` + Float float64 `xml:",attr,omitempty"` + Uint8 uint8 `xml:",attr,omitempty"` + Bool bool `xml:",attr,omitempty"` + Str string `xml:",attr,omitempty"` + Bytes []byte `xml:",attr,omitempty"` +} + +type OmitFieldTest struct { + Int int `xml:",omitempty"` + Named int `xml:"int,omitempty"` + Float float64 `xml:",omitempty"` + Uint8 uint8 `xml:",omitempty"` + Bool bool `xml:",omitempty"` + Str string `xml:",omitempty"` + Bytes []byte `xml:",omitempty"` + Ptr *PresenceTest `xml:",omitempty"` +} + +type AnyTest struct { + XMLName struct{} `xml:"a"` + Nested string `xml:"nested>value"` + AnyField AnyHolder `xml:",any"` +} + +type AnyOmitTest struct { + XMLName struct{} `xml:"a"` + Nested string `xml:"nested>value"` + AnyField *AnyHolder `xml:",any,omitempty"` +} + +type AnySliceTest struct { + XMLName struct{} `xml:"a"` + Nested string `xml:"nested>value"` + AnyField []AnyHolder `xml:",any"` +} + +type AnyHolder struct { + XMLName Name + XML string `xml:",innerxml"` +} + +type RecurseA struct { + A string + B *RecurseB +} + +type RecurseB struct { + A *RecurseA + B string +} + +type PresenceTest struct { + Exists *struct{} +} + +type IgnoreTest struct { + PublicSecret string `xml:"-"` +} + +type MyBytes []byte + +type Data struct { + Bytes []byte + Attr []byte `xml:",attr"` + Custom MyBytes +} + +type Plain struct { + V interface{} +} + +type MyInt int + +type EmbedInt struct { + MyInt +} + +type Strings struct { + X []string `xml:"A>B,omitempty"` +} + +type PointerFieldsTest struct { + XMLName Name `xml:"dummy"` + Name *string `xml:"name,attr"` + Age *uint `xml:"age,attr"` + Empty *string `xml:"empty,attr"` + Contents *string `xml:",chardata"` +} + +type ChardataEmptyTest struct { + XMLName Name `xml:"test"` + Contents *string `xml:",chardata"` +} + +type MyMarshalerTest struct { +} + +var _ Marshaler = (*MyMarshalerTest)(nil) + +func (m *MyMarshalerTest) MarshalXML(e *Encoder, start StartElement) error { + e.EncodeToken(start) + e.EncodeToken(CharData([]byte("hello world"))) + e.EncodeToken(EndElement{start.Name}) + return nil +} + +type MyMarshalerAttrTest struct{} + +var _ MarshalerAttr = (*MyMarshalerAttrTest)(nil) + +func (m *MyMarshalerAttrTest) MarshalXMLAttr(name Name) (Attr, error) { + return Attr{name, "hello world"}, nil +} + +type MyMarshalerValueAttrTest struct{} + +var _ MarshalerAttr = MyMarshalerValueAttrTest{} + +func (m MyMarshalerValueAttrTest) MarshalXMLAttr(name Name) (Attr, error) { + return Attr{name, "hello world"}, nil +} + +type MarshalerStruct struct { + Foo MyMarshalerAttrTest `xml:",attr"` +} + +type MarshalerValueStruct struct { + Foo MyMarshalerValueAttrTest `xml:",attr"` +} + +type InnerStruct struct { + XMLName Name `xml:"testns outer"` +} + +type OuterStruct struct { + InnerStruct + IntAttr int `xml:"int,attr"` +} + +type OuterNamedStruct struct { + InnerStruct + XMLName Name `xml:"outerns test"` + IntAttr int `xml:"int,attr"` +} + +type OuterNamedOrderedStruct struct { + XMLName Name `xml:"outerns test"` + InnerStruct + IntAttr int `xml:"int,attr"` +} + +type OuterOuterStruct struct { + OuterStruct +} + +type NestedAndChardata struct { + AB []string `xml:"A>B"` + Chardata string `xml:",chardata"` +} + +type NestedAndComment struct { + AB []string `xml:"A>B"` + Comment string `xml:",comment"` +} + +type XMLNSFieldStruct struct { + Ns string `xml:"xmlns,attr"` + Body string +} + +type NamedXMLNSFieldStruct struct { + XMLName struct{} `xml:"testns test"` + Ns string `xml:"xmlns,attr"` + Body string +} + +type XMLNSFieldStructWithOmitEmpty struct { + Ns string `xml:"xmlns,attr,omitempty"` + Body string +} + +type NamedXMLNSFieldStructWithEmptyNamespace struct { + XMLName struct{} `xml:"test"` + Ns string `xml:"xmlns,attr"` + Body string +} + +type RecursiveXMLNSFieldStruct struct { + Ns string `xml:"xmlns,attr"` + Body *RecursiveXMLNSFieldStruct `xml:",omitempty"` + Text string `xml:",omitempty"` +} + +func ifaceptr(x interface{}) interface{} { + return &x +} + +var ( + nameAttr = "Sarah" + ageAttr = uint(12) + contentsAttr = "lorem ipsum" +) + +// Unless explicitly stated as such (or *Plain), all of the +// tests below are two-way tests. When introducing new tests, +// please try to make them two-way as well to ensure that +// marshalling and unmarshalling are as symmetrical as feasible. +var marshalTests = []struct { + Value interface{} + ExpectXML string + MarshalOnly bool + UnmarshalOnly bool +}{ + // Test nil marshals to nothing + {Value: nil, ExpectXML: ``, MarshalOnly: true}, + {Value: nilStruct, ExpectXML: ``, MarshalOnly: true}, + + // Test value types + {Value: &Plain{true}, ExpectXML: `true`}, + {Value: &Plain{false}, ExpectXML: `false`}, + {Value: &Plain{int(42)}, ExpectXML: `42`}, + {Value: &Plain{int8(42)}, ExpectXML: `42`}, + {Value: &Plain{int16(42)}, ExpectXML: `42`}, + {Value: &Plain{int32(42)}, ExpectXML: `42`}, + {Value: &Plain{uint(42)}, ExpectXML: `42`}, + {Value: &Plain{uint8(42)}, ExpectXML: `42`}, + {Value: &Plain{uint16(42)}, ExpectXML: `42`}, + {Value: &Plain{uint32(42)}, ExpectXML: `42`}, + {Value: &Plain{float32(1.25)}, ExpectXML: `1.25`}, + {Value: &Plain{float64(1.25)}, ExpectXML: `1.25`}, + {Value: &Plain{uintptr(0xFFDD)}, ExpectXML: `65501`}, + {Value: &Plain{"gopher"}, ExpectXML: `gopher`}, + {Value: &Plain{[]byte("gopher")}, ExpectXML: `gopher`}, + {Value: &Plain{""}, ExpectXML: `</>`}, + {Value: &Plain{[]byte("")}, ExpectXML: `</>`}, + {Value: &Plain{[3]byte{'<', '/', '>'}}, ExpectXML: `</>`}, + {Value: &Plain{NamedType("potato")}, ExpectXML: `potato`}, + {Value: &Plain{[]int{1, 2, 3}}, ExpectXML: `123`}, + {Value: &Plain{[3]int{1, 2, 3}}, ExpectXML: `123`}, + {Value: ifaceptr(true), MarshalOnly: true, ExpectXML: `true`}, + + // Test time. + { + Value: &Plain{time.Unix(1e9, 123456789).UTC()}, + ExpectXML: `2001-09-09T01:46:40.123456789Z`, + }, + + // A pointer to struct{} may be used to test for an element's presence. + { + Value: &PresenceTest{new(struct{})}, + ExpectXML: ``, + }, + { + Value: &PresenceTest{}, + ExpectXML: ``, + }, + + // A pointer to struct{} may be used to test for an element's presence. + { + Value: &PresenceTest{new(struct{})}, + ExpectXML: ``, + }, + { + Value: &PresenceTest{}, + ExpectXML: ``, + }, + + // A []byte field is only nil if the element was not found. + { + Value: &Data{}, + ExpectXML: ``, + UnmarshalOnly: true, + }, + { + Value: &Data{Bytes: []byte{}, Custom: MyBytes{}, Attr: []byte{}}, + ExpectXML: ``, + UnmarshalOnly: true, + }, + + // Check that []byte works, including named []byte types. + { + Value: &Data{Bytes: []byte("ab"), Custom: MyBytes("cd"), Attr: []byte{'v'}}, + ExpectXML: `abcd`, + }, + + // Test innerxml + { + Value: &SecretAgent{ + Handle: "007", + Identity: "James Bond", + Obfuscate: "", + }, + ExpectXML: `James Bond`, + MarshalOnly: true, + }, + { + Value: &SecretAgent{ + Handle: "007", + Identity: "James Bond", + Obfuscate: "James Bond", + }, + ExpectXML: `James Bond`, + UnmarshalOnly: true, + }, + + // Test structs + {Value: &Port{Type: "ssl", Number: "443"}, ExpectXML: `443`}, + {Value: &Port{Number: "443"}, ExpectXML: `443`}, + {Value: &Port{Type: ""}, ExpectXML: ``}, + {Value: &Port{Number: "443", Comment: "https"}, ExpectXML: `443`}, + {Value: &Port{Number: "443", Comment: "add space-"}, ExpectXML: `443`, MarshalOnly: true}, + {Value: &Domain{Name: []byte("google.com&friends")}, ExpectXML: `google.com&friends`}, + {Value: &Domain{Name: []byte("google.com"), Comment: []byte(" &friends ")}, ExpectXML: `google.com`}, + {Value: &Book{Title: "Pride & Prejudice"}, ExpectXML: `Pride & Prejudice`}, + {Value: &Event{Year: -3114}, ExpectXML: `-3114`}, + {Value: &Movie{Length: 13440}, ExpectXML: `13440`}, + {Value: &Pi{Approximation: 3.14159265}, ExpectXML: `3.1415927`}, + {Value: &Universe{Visible: 9.3e13}, ExpectXML: `9.3e+13`}, + {Value: &Particle{HasMass: true}, ExpectXML: `true`}, + {Value: &Departure{When: ParseTime("2013-01-09T00:15:00-09:00")}, ExpectXML: `2013-01-09T00:15:00-09:00`}, + {Value: atomValue, ExpectXML: atomXml}, + { + Value: &Ship{ + Name: "Heart of Gold", + Pilot: "Computer", + Age: 1, + Drive: ImprobabilityDrive, + Passenger: []*Passenger{ + { + Name: []string{"Zaphod", "Beeblebrox"}, + Weight: 7.25, + }, + { + Name: []string{"Trisha", "McMillen"}, + Weight: 5.5, + }, + { + Name: []string{"Ford", "Prefect"}, + Weight: 7, + }, + { + Name: []string{"Arthur", "Dent"}, + Weight: 6.75, + }, + }, + }, + ExpectXML: `` + + `` + strconv.Itoa(int(ImprobabilityDrive)) + `` + + `1` + + `` + + `Zaphod` + + `Beeblebrox` + + `7.25` + + `` + + `` + + `Trisha` + + `McMillen` + + `5.5` + + `` + + `` + + `Ford` + + `Prefect` + + `7` + + `` + + `` + + `Arthur` + + `Dent` + + `6.75` + + `` + + ``, + }, + + // Test a>b + { + Value: &NestedItems{Items: nil, Item1: nil}, + ExpectXML: `` + + `` + + `` + + ``, + }, + { + Value: &NestedItems{Items: []string{}, Item1: []string{}}, + ExpectXML: `` + + `` + + `` + + ``, + MarshalOnly: true, + }, + { + Value: &NestedItems{Items: nil, Item1: []string{"A"}}, + ExpectXML: `` + + `` + + `A` + + `` + + ``, + }, + { + Value: &NestedItems{Items: []string{"A", "B"}, Item1: nil}, + ExpectXML: `` + + `` + + `A` + + `B` + + `` + + ``, + }, + { + Value: &NestedItems{Items: []string{"A", "B"}, Item1: []string{"C"}}, + ExpectXML: `` + + `` + + `A` + + `B` + + `C` + + `` + + ``, + }, + { + Value: &NestedOrder{Field1: "C", Field2: "B", Field3: "A"}, + ExpectXML: `` + + `` + + `C` + + `B` + + `A` + + `` + + ``, + }, + { + Value: &NilTest{A: "A", B: nil, C: "C"}, + ExpectXML: `` + + `` + + `A` + + `C` + + `` + + ``, + MarshalOnly: true, // Uses interface{} + }, + { + Value: &MixedNested{A: "A", B: "B", C: "C", D: "D"}, + ExpectXML: `` + + `A` + + `B` + + `` + + `C` + + `D` + + `` + + ``, + }, + { + Value: &Service{Port: &Port{Number: "80"}}, + ExpectXML: `80`, + }, + { + Value: &Service{}, + ExpectXML: ``, + }, + { + Value: &Service{Port: &Port{Number: "80"}, Extra1: "A", Extra2: "B"}, + ExpectXML: `` + + `80` + + `A` + + `B` + + ``, + MarshalOnly: true, + }, + { + Value: &Service{Port: &Port{Number: "80"}, Extra2: "example"}, + ExpectXML: `` + + `80` + + `example` + + ``, + MarshalOnly: true, + }, + { + Value: &struct { + XMLName struct{} `xml:"space top"` + A string `xml:"x>a"` + B string `xml:"x>b"` + C string `xml:"space x>c"` + C1 string `xml:"space1 x>c"` + D1 string `xml:"space1 x>d"` + E1 string `xml:"x>e"` + }{ + A: "a", + B: "b", + C: "c", + C1: "c1", + D1: "d1", + E1: "e1", + }, + ExpectXML: `` + + `abc` + + `` + + `c1` + + `d1` + + `` + + `` + + `e1` + + `` + + ``, + }, + { + Value: &struct { + XMLName Name + A string `xml:"x>a"` + B string `xml:"x>b"` + C string `xml:"space x>c"` + C1 string `xml:"space1 x>c"` + D1 string `xml:"space1 x>d"` + }{ + XMLName: Name{ + Space: "space0", + Local: "top", + }, + A: "a", + B: "b", + C: "c", + C1: "c1", + D1: "d1", + }, + ExpectXML: `` + + `ab` + + `c` + + `` + + `c1` + + `d1` + + `` + + ``, + }, + { + Value: &struct { + XMLName struct{} `xml:"top"` + B string `xml:"space x>b"` + B1 string `xml:"space1 x>b"` + }{ + B: "b", + B1: "b1", + }, + ExpectXML: `` + + `b` + + `b1` + + ``, + }, + + // Test struct embedding + { + Value: &EmbedA{ + EmbedC: EmbedC{ + FieldA1: "", // Shadowed by A.A + FieldA2: "", // Shadowed by A.A + FieldB: "A.C.B", + FieldC: "A.C.C", + }, + EmbedB: EmbedB{ + FieldB: "A.B.B", + EmbedC: &EmbedC{ + FieldA1: "A.B.C.A1", + FieldA2: "A.B.C.A2", + FieldB: "", // Shadowed by A.B.B + FieldC: "A.B.C.C", + }, + }, + FieldA: "A.A", + }, + ExpectXML: `` + + `A.C.B` + + `A.C.C` + + `` + + `A.B.B` + + `` + + `A.B.C.A1` + + `A.B.C.A2` + + `` + + `A.B.C.C` + + `` + + `A.A` + + ``, + }, + + // Test that name casing matters + { + Value: &NameCasing{Xy: "mixed", XY: "upper", XyA: "mixedA", XYA: "upperA"}, + ExpectXML: `mixedupper`, + }, + + // Test the order in which the XML element name is chosen + { + Value: &NamePrecedence{ + FromTag: XMLNameWithoutTag{Value: "A"}, + FromNameVal: XMLNameWithoutTag{XMLName: Name{Local: "InXMLName"}, Value: "B"}, + FromNameTag: XMLNameWithTag{Value: "C"}, + InFieldName: "D", + }, + ExpectXML: `` + + `A` + + `B` + + `C` + + `D` + + ``, + MarshalOnly: true, + }, + { + Value: &NamePrecedence{ + XMLName: Name{Local: "Parent"}, + FromTag: XMLNameWithoutTag{XMLName: Name{Local: "InTag"}, Value: "A"}, + FromNameVal: XMLNameWithoutTag{XMLName: Name{Local: "FromNameVal"}, Value: "B"}, + FromNameTag: XMLNameWithTag{XMLName: Name{Local: "InXMLNameTag"}, Value: "C"}, + InFieldName: "D", + }, + ExpectXML: `` + + `A` + + `B` + + `C` + + `D` + + ``, + UnmarshalOnly: true, + }, + + // xml.Name works in a plain field as well. + { + Value: &NameInField{Name{Space: "ns", Local: "foo"}}, + ExpectXML: ``, + }, + { + Value: &NameInField{Name{Space: "ns", Local: "foo"}}, + ExpectXML: ``, + UnmarshalOnly: true, + }, + + // Marshaling zero xml.Name uses the tag or field name. + { + Value: &NameInField{}, + ExpectXML: ``, + MarshalOnly: true, + }, + + // Test attributes + { + Value: &AttrTest{ + Int: 8, + Named: 9, + Float: 23.5, + Uint8: 255, + Bool: true, + Str: "str", + Bytes: []byte("byt"), + }, + ExpectXML: ``, + }, + { + Value: &AttrTest{Bytes: []byte{}}, + ExpectXML: ``, + }, + { + Value: &OmitAttrTest{ + Int: 8, + Named: 9, + Float: 23.5, + Uint8: 255, + Bool: true, + Str: "str", + Bytes: []byte("byt"), + }, + ExpectXML: ``, + }, + { + Value: &OmitAttrTest{}, + ExpectXML: ``, + }, + + // pointer fields + { + Value: &PointerFieldsTest{Name: &nameAttr, Age: &ageAttr, Contents: &contentsAttr}, + ExpectXML: `lorem ipsum`, + MarshalOnly: true, + }, + + // empty chardata pointer field + { + Value: &ChardataEmptyTest{}, + ExpectXML: ``, + MarshalOnly: true, + }, + + // omitempty on fields + { + Value: &OmitFieldTest{ + Int: 8, + Named: 9, + Float: 23.5, + Uint8: 255, + Bool: true, + Str: "str", + Bytes: []byte("byt"), + Ptr: &PresenceTest{}, + }, + ExpectXML: `` + + `8` + + `9` + + `23.5` + + `255` + + `true` + + `str` + + `byt` + + `` + + ``, + }, + { + Value: &OmitFieldTest{}, + ExpectXML: ``, + }, + + // Test ",any" + { + ExpectXML: `knownunknown`, + Value: &AnyTest{ + Nested: "known", + AnyField: AnyHolder{ + XMLName: Name{Local: "other"}, + XML: "unknown", + }, + }, + }, + { + Value: &AnyTest{Nested: "known", + AnyField: AnyHolder{ + XML: "", + XMLName: Name{Local: "AnyField"}, + }, + }, + ExpectXML: `known`, + }, + { + ExpectXML: `b`, + Value: &AnyOmitTest{ + Nested: "b", + }, + }, + { + ExpectXML: `bei`, + Value: &AnySliceTest{ + Nested: "b", + AnyField: []AnyHolder{ + { + XMLName: Name{Local: "c"}, + XML: "e", + }, + { + XMLName: Name{Space: "f", Local: "g"}, + XML: "i", + }, + }, + }, + }, + { + ExpectXML: `b`, + Value: &AnySliceTest{ + Nested: "b", + }, + }, + + // Test recursive types. + { + Value: &RecurseA{ + A: "a1", + B: &RecurseB{ + A: &RecurseA{"a2", nil}, + B: "b1", + }, + }, + ExpectXML: `a1a2b1`, + }, + + // Test ignoring fields via "-" tag + { + ExpectXML: ``, + Value: &IgnoreTest{}, + }, + { + ExpectXML: ``, + Value: &IgnoreTest{PublicSecret: "can't tell"}, + MarshalOnly: true, + }, + { + ExpectXML: `ignore me`, + Value: &IgnoreTest{}, + UnmarshalOnly: true, + }, + + // Test escaping. + { + ExpectXML: `dquote: "; squote: '; ampersand: &; less: <; greater: >;`, + Value: &AnyTest{ + Nested: `dquote: "; squote: '; ampersand: &; less: <; greater: >;`, + AnyField: AnyHolder{XMLName: Name{Local: "empty"}}, + }, + }, + { + ExpectXML: `newline: ; cr: ; tab: ;`, + Value: &AnyTest{ + Nested: "newline: \n; cr: \r; tab: \t;", + AnyField: AnyHolder{XMLName: Name{Local: "AnyField"}}, + }, + }, + { + ExpectXML: "1\r2\r\n3\n\r4\n5", + Value: &AnyTest{ + Nested: "1\n2\n3\n\n4\n5", + }, + UnmarshalOnly: true, + }, + { + ExpectXML: `42`, + Value: &EmbedInt{ + MyInt: 42, + }, + }, + // Test omitempty with parent chain; see golang.org/issue/4168. + { + ExpectXML: ``, + Value: &Strings{}, + }, + // Custom marshalers. + { + ExpectXML: `hello world`, + Value: &MyMarshalerTest{}, + }, + { + ExpectXML: ``, + Value: &MarshalerStruct{}, + }, + { + ExpectXML: ``, + Value: &MarshalerValueStruct{}, + }, + { + ExpectXML: ``, + Value: &OuterStruct{IntAttr: 10}, + }, + { + ExpectXML: ``, + Value: &OuterNamedStruct{XMLName: Name{Space: "outerns", Local: "test"}, IntAttr: 10}, + }, + { + ExpectXML: ``, + Value: &OuterNamedOrderedStruct{XMLName: Name{Space: "outerns", Local: "test"}, IntAttr: 10}, + }, + { + ExpectXML: ``, + Value: &OuterOuterStruct{OuterStruct{IntAttr: 10}}, + }, + { + ExpectXML: `test`, + Value: &NestedAndChardata{AB: make([]string, 2), Chardata: "test"}, + }, + { + ExpectXML: ``, + Value: &NestedAndComment{AB: make([]string, 2), Comment: "test"}, + }, + { + ExpectXML: `hello world`, + Value: &XMLNSFieldStruct{Ns: "http://example.com/ns", Body: "hello world"}, + }, + { + ExpectXML: `hello world`, + Value: &NamedXMLNSFieldStruct{Ns: "http://example.com/ns", Body: "hello world"}, + }, + { + ExpectXML: `hello world`, + Value: &NamedXMLNSFieldStruct{Ns: "", Body: "hello world"}, + }, + { + ExpectXML: `hello world`, + Value: &XMLNSFieldStructWithOmitEmpty{Body: "hello world"}, + }, + { + // The xmlns attribute must be ignored because the + // element is in the empty namespace, so it's not possible + // to set the default namespace to something non-empty. + ExpectXML: `hello world`, + Value: &NamedXMLNSFieldStructWithEmptyNamespace{Ns: "foo", Body: "hello world"}, + MarshalOnly: true, + }, + { + ExpectXML: `hello world`, + Value: &RecursiveXMLNSFieldStruct{ + Ns: "foo", + Body: &RecursiveXMLNSFieldStruct{ + Text: "hello world", + }, + }, + }, +} + +func TestMarshal(t *testing.T) { + for idx, test := range marshalTests { + if test.UnmarshalOnly { + continue + } + data, err := Marshal(test.Value) + if err != nil { + t.Errorf("#%d: marshal(%#v): %s", idx, test.Value, err) + continue + } + if got, want := string(data), test.ExpectXML; got != want { + if strings.Contains(want, "\n") { + t.Errorf("#%d: marshal(%#v):\nHAVE:\n%s\nWANT:\n%s", idx, test.Value, got, want) + } else { + t.Errorf("#%d: marshal(%#v):\nhave %#q\nwant %#q", idx, test.Value, got, want) + } + } + } +} + +type AttrParent struct { + X string `xml:"X>Y,attr"` +} + +type BadAttr struct { + Name []string `xml:"name,attr"` +} + +var marshalErrorTests = []struct { + Value interface{} + Err string + Kind reflect.Kind +}{ + { + Value: make(chan bool), + Err: "xml: unsupported type: chan bool", + Kind: reflect.Chan, + }, + { + Value: map[string]string{ + "question": "What do you get when you multiply six by nine?", + "answer": "42", + }, + Err: "xml: unsupported type: map[string]string", + Kind: reflect.Map, + }, + { + Value: map[*Ship]bool{nil: false}, + Err: "xml: unsupported type: map[*xml.Ship]bool", + Kind: reflect.Map, + }, + { + Value: &Domain{Comment: []byte("f--bar")}, + Err: `xml: comments must not contain "--"`, + }, + // Reject parent chain with attr, never worked; see golang.org/issue/5033. + { + Value: &AttrParent{}, + Err: `xml: X>Y chain not valid with attr flag`, + }, + { + Value: BadAttr{[]string{"X", "Y"}}, + Err: `xml: unsupported type: []string`, + }, +} + +var marshalIndentTests = []struct { + Value interface{} + Prefix string + Indent string + ExpectXML string +}{ + { + Value: &SecretAgent{ + Handle: "007", + Identity: "James Bond", + Obfuscate: "", + }, + Prefix: "", + Indent: "\t", + ExpectXML: fmt.Sprintf("\n\tJames Bond\n"), + }, +} + +func TestMarshalErrors(t *testing.T) { + for idx, test := range marshalErrorTests { + data, err := Marshal(test.Value) + if err == nil { + t.Errorf("#%d: marshal(%#v) = [success] %q, want error %v", idx, test.Value, data, test.Err) + continue + } + if err.Error() != test.Err { + t.Errorf("#%d: marshal(%#v) = [error] %v, want %v", idx, test.Value, err, test.Err) + } + if test.Kind != reflect.Invalid { + if kind := err.(*UnsupportedTypeError).Type.Kind(); kind != test.Kind { + t.Errorf("#%d: marshal(%#v) = [error kind] %s, want %s", idx, test.Value, kind, test.Kind) + } + } + } +} + +// Do invertibility testing on the various structures that we test +func TestUnmarshal(t *testing.T) { + for i, test := range marshalTests { + if test.MarshalOnly { + continue + } + if _, ok := test.Value.(*Plain); ok { + continue + } + vt := reflect.TypeOf(test.Value) + dest := reflect.New(vt.Elem()).Interface() + err := Unmarshal([]byte(test.ExpectXML), dest) + + switch fix := dest.(type) { + case *Feed: + fix.Author.InnerXML = "" + for i := range fix.Entry { + fix.Entry[i].Author.InnerXML = "" + } + } + + if err != nil { + t.Errorf("#%d: unexpected error: %#v", i, err) + } else if got, want := dest, test.Value; !reflect.DeepEqual(got, want) { + t.Errorf("#%d: unmarshal(%q):\nhave %#v\nwant %#v", i, test.ExpectXML, got, want) + } + } +} + +func TestMarshalIndent(t *testing.T) { + for i, test := range marshalIndentTests { + data, err := MarshalIndent(test.Value, test.Prefix, test.Indent) + if err != nil { + t.Errorf("#%d: Error: %s", i, err) + continue + } + if got, want := string(data), test.ExpectXML; got != want { + t.Errorf("#%d: MarshalIndent:\nGot:%s\nWant:\n%s", i, got, want) + } + } +} + +type limitedBytesWriter struct { + w io.Writer + remain int // until writes fail +} + +func (lw *limitedBytesWriter) Write(p []byte) (n int, err error) { + if lw.remain <= 0 { + println("error") + return 0, errors.New("write limit hit") + } + if len(p) > lw.remain { + p = p[:lw.remain] + n, _ = lw.w.Write(p) + lw.remain = 0 + return n, errors.New("write limit hit") + } + n, err = lw.w.Write(p) + lw.remain -= n + return n, err +} + +func TestMarshalWriteErrors(t *testing.T) { + var buf bytes.Buffer + const writeCap = 1024 + w := &limitedBytesWriter{&buf, writeCap} + enc := NewEncoder(w) + var err error + var i int + const n = 4000 + for i = 1; i <= n; i++ { + err = enc.Encode(&Passenger{ + Name: []string{"Alice", "Bob"}, + Weight: 5, + }) + if err != nil { + break + } + } + if err == nil { + t.Error("expected an error") + } + if i == n { + t.Errorf("expected to fail before the end") + } + if buf.Len() != writeCap { + t.Errorf("buf.Len() = %d; want %d", buf.Len(), writeCap) + } +} + +func TestMarshalWriteIOErrors(t *testing.T) { + enc := NewEncoder(errWriter{}) + + expectErr := "unwritable" + err := enc.Encode(&Passenger{}) + if err == nil || err.Error() != expectErr { + t.Errorf("EscapeTest = [error] %v, want %v", err, expectErr) + } +} + +func TestMarshalFlush(t *testing.T) { + var buf bytes.Buffer + enc := NewEncoder(&buf) + if err := enc.EncodeToken(CharData("hello world")); err != nil { + t.Fatalf("enc.EncodeToken: %v", err) + } + if buf.Len() > 0 { + t.Fatalf("enc.EncodeToken caused actual write: %q", buf.Bytes()) + } + if err := enc.Flush(); err != nil { + t.Fatalf("enc.Flush: %v", err) + } + if buf.String() != "hello world" { + t.Fatalf("after enc.Flush, buf.String() = %q, want %q", buf.String(), "hello world") + } +} + +var encodeElementTests = []struct { + desc string + value interface{} + start StartElement + expectXML string +}{{ + desc: "simple string", + value: "hello", + start: StartElement{ + Name: Name{Local: "a"}, + }, + expectXML: `hello`, +}, { + desc: "string with added attributes", + value: "hello", + start: StartElement{ + Name: Name{Local: "a"}, + Attr: []Attr{{ + Name: Name{Local: "x"}, + Value: "y", + }, { + Name: Name{Local: "foo"}, + Value: "bar", + }}, + }, + expectXML: `hello`, +}, { + desc: "start element with default name space", + value: struct { + Foo XMLNameWithNSTag + }{ + Foo: XMLNameWithNSTag{ + Value: "hello", + }, + }, + start: StartElement{ + Name: Name{Space: "ns", Local: "a"}, + Attr: []Attr{{ + Name: Name{Local: "xmlns"}, + // "ns" is the name space defined in XMLNameWithNSTag + Value: "ns", + }}, + }, + expectXML: `hello`, +}, { + desc: "start element in name space with different default name space", + value: struct { + Foo XMLNameWithNSTag + }{ + Foo: XMLNameWithNSTag{ + Value: "hello", + }, + }, + start: StartElement{ + Name: Name{Space: "ns2", Local: "a"}, + Attr: []Attr{{ + Name: Name{Local: "xmlns"}, + // "ns" is the name space defined in XMLNameWithNSTag + Value: "ns", + }}, + }, + expectXML: `hello`, +}, { + desc: "XMLMarshaler with start element with default name space", + value: &MyMarshalerTest{}, + start: StartElement{ + Name: Name{Space: "ns2", Local: "a"}, + Attr: []Attr{{ + Name: Name{Local: "xmlns"}, + // "ns" is the name space defined in XMLNameWithNSTag + Value: "ns", + }}, + }, + expectXML: `hello world`, +}} + +func TestEncodeElement(t *testing.T) { + for idx, test := range encodeElementTests { + var buf bytes.Buffer + enc := NewEncoder(&buf) + err := enc.EncodeElement(test.value, test.start) + if err != nil { + t.Fatalf("enc.EncodeElement: %v", err) + } + err = enc.Flush() + if err != nil { + t.Fatalf("enc.Flush: %v", err) + } + if got, want := buf.String(), test.expectXML; got != want { + t.Errorf("#%d(%s): EncodeElement(%#v, %#v):\nhave %#q\nwant %#q", idx, test.desc, test.value, test.start, got, want) + } + } +} + +func BenchmarkMarshal(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + Marshal(atomValue) + } +} + +func BenchmarkUnmarshal(b *testing.B) { + b.ReportAllocs() + xml := []byte(atomXml) + for i := 0; i < b.N; i++ { + Unmarshal(xml, &Feed{}) + } +} + +// golang.org/issue/6556 +func TestStructPointerMarshal(t *testing.T) { + type A struct { + XMLName string `xml:"a"` + B []interface{} + } + type C struct { + XMLName Name + Value string `xml:"value"` + } + + a := new(A) + a.B = append(a.B, &C{ + XMLName: Name{Local: "c"}, + Value: "x", + }) + + b, err := Marshal(a) + if err != nil { + t.Fatal(err) + } + if x := string(b); x != "x" { + t.Fatal(x) + } + var v A + err = Unmarshal(b, &v) + if err != nil { + t.Fatal(err) + } +} + +var encodeTokenTests = []struct { + desc string + toks []Token + want string + err string +}{{ + desc: "start element with name space", + toks: []Token{ + StartElement{Name{"space", "local"}, nil}, + }, + want: ``, +}, { + desc: "start element with no name", + toks: []Token{ + StartElement{Name{"space", ""}, nil}, + }, + err: "xml: start tag with no name", +}, { + desc: "end element with no name", + toks: []Token{ + EndElement{Name{"space", ""}}, + }, + err: "xml: end tag with no name", +}, { + desc: "char data", + toks: []Token{ + CharData("foo"), + }, + want: `foo`, +}, { + desc: "char data with escaped chars", + toks: []Token{ + CharData(" \t\n"), + }, + want: " \n", +}, { + desc: "comment", + toks: []Token{ + Comment("foo"), + }, + want: ``, +}, { + desc: "comment with invalid content", + toks: []Token{ + Comment("foo-->"), + }, + err: "xml: EncodeToken of Comment containing --> marker", +}, { + desc: "proc instruction", + toks: []Token{ + ProcInst{"Target", []byte("Instruction")}, + }, + want: ``, +}, { + desc: "proc instruction with empty target", + toks: []Token{ + ProcInst{"", []byte("Instruction")}, + }, + err: "xml: EncodeToken of ProcInst with invalid Target", +}, { + desc: "proc instruction with bad content", + toks: []Token{ + ProcInst{"", []byte("Instruction?>")}, + }, + err: "xml: EncodeToken of ProcInst with invalid Target", +}, { + desc: "directive", + toks: []Token{ + Directive("foo"), + }, + want: ``, +}, { + desc: "more complex directive", + toks: []Token{ + Directive("DOCTYPE doc [ '> ]"), + }, + want: `'> ]>`, +}, { + desc: "directive instruction with bad name", + toks: []Token{ + Directive("foo>"), + }, + err: "xml: EncodeToken of Directive containing wrong < or > markers", +}, { + desc: "end tag without start tag", + toks: []Token{ + EndElement{Name{"foo", "bar"}}, + }, + err: "xml: end tag without start tag", +}, { + desc: "mismatching end tag local name", + toks: []Token{ + StartElement{Name{"", "foo"}, nil}, + EndElement{Name{"", "bar"}}, + }, + err: "xml: end tag does not match start tag ", + want: ``, +}, { + desc: "mismatching end tag namespace", + toks: []Token{ + StartElement{Name{"space", "foo"}, nil}, + EndElement{Name{"another", "foo"}}, + }, + err: "xml: end tag in namespace another does not match start tag in namespace space", + want: ``, +}, { + desc: "start element with explicit namespace", + toks: []Token{ + StartElement{Name{"space", "local"}, []Attr{ + {Name{"xmlns", "x"}, "space"}, + {Name{"space", "foo"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "start element with explicit namespace and colliding prefix", + toks: []Token{ + StartElement{Name{"space", "local"}, []Attr{ + {Name{"xmlns", "x"}, "space"}, + {Name{"space", "foo"}, "value"}, + {Name{"x", "bar"}, "other"}, + }}, + }, + want: ``, +}, { + desc: "start element using previously defined namespace", + toks: []Token{ + StartElement{Name{"", "local"}, []Attr{ + {Name{"xmlns", "x"}, "space"}, + }}, + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"space", "x"}, "y"}, + }}, + }, + want: ``, +}, { + desc: "nested name space with same prefix", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"xmlns", "x"}, "space1"}, + }}, + StartElement{Name{"", "foo"}, []Attr{ + {Name{"xmlns", "x"}, "space2"}, + }}, + StartElement{Name{"", "foo"}, []Attr{ + {Name{"space1", "a"}, "space1 value"}, + {Name{"space2", "b"}, "space2 value"}, + }}, + EndElement{Name{"", "foo"}}, + EndElement{Name{"", "foo"}}, + StartElement{Name{"", "foo"}, []Attr{ + {Name{"space1", "a"}, "space1 value"}, + {Name{"space2", "b"}, "space2 value"}, + }}, + }, + want: ``, +}, { + desc: "start element defining several prefixes for the same name space", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"xmlns", "a"}, "space"}, + {Name{"xmlns", "b"}, "space"}, + {Name{"space", "x"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "nested element redefines name space", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"xmlns", "x"}, "space"}, + }}, + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"xmlns", "y"}, "space"}, + {Name{"space", "a"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "nested element creates alias for default name space", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + }}, + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"xmlns", "y"}, "space"}, + {Name{"space", "a"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "nested element defines default name space with existing prefix", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"xmlns", "x"}, "space"}, + }}, + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + {Name{"space", "a"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "nested element uses empty attribute name space when default ns defined", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + }}, + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "attr"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "redefine xmlns", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"foo", "xmlns"}, "space"}, + }}, + }, + err: `xml: cannot redefine xmlns attribute prefix`, +}, { + desc: "xmlns with explicit name space #1", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"xml", "xmlns"}, "space"}, + }}, + }, + want: ``, +}, { + desc: "xmlns with explicit name space #2", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{xmlURL, "xmlns"}, "space"}, + }}, + }, + want: ``, +}, { + desc: "empty name space declaration is ignored", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"xmlns", "foo"}, ""}, + }}, + }, + want: ``, +}, { + desc: "attribute with no name is ignored", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"", ""}, "value"}, + }}, + }, + want: ``, +}, { + desc: "namespace URL with non-valid name", + toks: []Token{ + StartElement{Name{"/34", "foo"}, []Attr{ + {Name{"/34", "x"}, "value"}, + }}, + }, + want: `<_:foo xmlns:_="/34" _:x="value">`, +}, { + desc: "nested element resets default namespace to empty", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + }}, + StartElement{Name{"", "foo"}, []Attr{ + {Name{"", "xmlns"}, ""}, + {Name{"", "x"}, "value"}, + {Name{"space", "x"}, "value"}, + }}, + }, + want: ``, +}, { + desc: "nested element requires empty default name space", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + }}, + StartElement{Name{"", "foo"}, nil}, + }, + want: ``, +}, { + desc: "attribute uses name space from xmlns", + toks: []Token{ + StartElement{Name{"some/space", "foo"}, []Attr{ + {Name{"", "attr"}, "value"}, + {Name{"some/space", "other"}, "other value"}, + }}, + }, + want: ``, +}, { + desc: "default name space should not be used by attributes", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + {Name{"xmlns", "bar"}, "space"}, + {Name{"space", "baz"}, "foo"}, + }}, + StartElement{Name{"space", "baz"}, nil}, + EndElement{Name{"space", "baz"}}, + EndElement{Name{"space", "foo"}}, + }, + want: ``, +}, { + desc: "default name space not used by attributes, not explicitly defined", + toks: []Token{ + StartElement{Name{"space", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + {Name{"space", "baz"}, "foo"}, + }}, + StartElement{Name{"space", "baz"}, nil}, + EndElement{Name{"space", "baz"}}, + EndElement{Name{"space", "foo"}}, + }, + want: ``, +}, { + desc: "impossible xmlns declaration", + toks: []Token{ + StartElement{Name{"", "foo"}, []Attr{ + {Name{"", "xmlns"}, "space"}, + }}, + StartElement{Name{"space", "bar"}, []Attr{ + {Name{"space", "attr"}, "value"}, + }}, + }, + want: ``, +}} + +func TestEncodeToken(t *testing.T) { +loop: + for i, tt := range encodeTokenTests { + var buf bytes.Buffer + enc := NewEncoder(&buf) + var err error + for j, tok := range tt.toks { + err = enc.EncodeToken(tok) + if err != nil && j < len(tt.toks)-1 { + t.Errorf("#%d %s token #%d: %v", i, tt.desc, j, err) + continue loop + } + } + errorf := func(f string, a ...interface{}) { + t.Errorf("#%d %s token #%d:%s", i, tt.desc, len(tt.toks)-1, fmt.Sprintf(f, a...)) + } + switch { + case tt.err != "" && err == nil: + errorf(" expected error; got none") + continue + case tt.err == "" && err != nil: + errorf(" got error: %v", err) + continue + case tt.err != "" && err != nil && tt.err != err.Error(): + errorf(" error mismatch; got %v, want %v", err, tt.err) + continue + } + if err := enc.Flush(); err != nil { + errorf(" %v", err) + continue + } + if got := buf.String(); got != tt.want { + errorf("\ngot %v\nwant %v", got, tt.want) + continue + } + } +} + +func TestProcInstEncodeToken(t *testing.T) { + var buf bytes.Buffer + enc := NewEncoder(&buf) + + if err := enc.EncodeToken(ProcInst{"xml", []byte("Instruction")}); err != nil { + t.Fatalf("enc.EncodeToken: expected to be able to encode xml target ProcInst as first token, %s", err) + } + + if err := enc.EncodeToken(ProcInst{"Target", []byte("Instruction")}); err != nil { + t.Fatalf("enc.EncodeToken: expected to be able to add non-xml target ProcInst") + } + + if err := enc.EncodeToken(ProcInst{"xml", []byte("Instruction")}); err == nil { + t.Fatalf("enc.EncodeToken: expected to not be allowed to encode xml target ProcInst when not first token") + } +} + +func TestDecodeEncode(t *testing.T) { + var in, out bytes.Buffer + in.WriteString(` + + + +`) + dec := NewDecoder(&in) + enc := NewEncoder(&out) + for tok, err := dec.Token(); err == nil; tok, err = dec.Token() { + err = enc.EncodeToken(tok) + if err != nil { + t.Fatalf("enc.EncodeToken: Unable to encode token (%#v), %v", tok, err) + } + } +} + +// Issue 9796. Used to fail with GORACE="halt_on_error=1" -race. +func TestRace9796(t *testing.T) { + type A struct{} + type B struct { + C []A `xml:"X>Y"` + } + var wg sync.WaitGroup + for i := 0; i < 2; i++ { + wg.Add(1) + go func() { + Marshal(B{[]A{A{}}}) + wg.Done() + }() + } + wg.Wait() +} + +func TestIsValidDirective(t *testing.T) { + testOK := []string{ + "<>", + "< < > >", + "' '>' >", + " ]>", + " '<' ' doc ANY> ]>", + ">>> a < comment --> [ ] >", + } + testKO := []string{ + "<", + ">", + "", + "< > > < < >", + " -->", + "", + "'", + "", + } + for _, s := range testOK { + if !isValidDirective(Directive(s)) { + t.Errorf("Directive %q is expected to be valid", s) + } + } + for _, s := range testKO { + if isValidDirective(Directive(s)) { + t.Errorf("Directive %q is expected to be invalid", s) + } + } +} + +// Issue 11719. EncodeToken used to silently eat tokens with an invalid type. +func TestSimpleUseOfEncodeToken(t *testing.T) { + var buf bytes.Buffer + enc := NewEncoder(&buf) + if err := enc.EncodeToken(&StartElement{Name: Name{"", "object1"}}); err == nil { + t.Errorf("enc.EncodeToken: pointer type should be rejected") + } + if err := enc.EncodeToken(&EndElement{Name: Name{"", "object1"}}); err == nil { + t.Errorf("enc.EncodeToken: pointer type should be rejected") + } + if err := enc.EncodeToken(StartElement{Name: Name{"", "object2"}}); err != nil { + t.Errorf("enc.EncodeToken: StartElement %s", err) + } + if err := enc.EncodeToken(EndElement{Name: Name{"", "object2"}}); err != nil { + t.Errorf("enc.EncodeToken: EndElement %s", err) + } + if err := enc.EncodeToken(Universe{}); err == nil { + t.Errorf("enc.EncodeToken: invalid type not caught") + } + if err := enc.Flush(); err != nil { + t.Errorf("enc.Flush: %s", err) + } + if buf.Len() == 0 { + t.Errorf("enc.EncodeToken: empty buffer") + } + want := "" + if buf.String() != want { + t.Errorf("enc.EncodeToken: expected %q; got %q", want, buf.String()) + } +} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/read.go b/vendor/golang.org/x/net/webdav/internal/xml/read.go new file mode 100644 index 0000000000..75b9f2ba1b --- /dev/null +++ b/vendor/golang.org/x/net/webdav/internal/xml/read.go @@ -0,0 +1,692 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xml + +import ( + "bytes" + "encoding" + "errors" + "fmt" + "reflect" + "strconv" + "strings" +) + +// BUG(rsc): Mapping between XML elements and data structures is inherently flawed: +// an XML element is an order-dependent collection of anonymous +// values, while a data structure is an order-independent collection +// of named values. +// See package json for a textual representation more suitable +// to data structures. + +// Unmarshal parses the XML-encoded data and stores the result in +// the value pointed to by v, which must be an arbitrary struct, +// slice, or string. Well-formed data that does not fit into v is +// discarded. +// +// Because Unmarshal uses the reflect package, it can only assign +// to exported (upper case) fields. Unmarshal uses a case-sensitive +// comparison to match XML element names to tag values and struct +// field names. +// +// Unmarshal maps an XML element to a struct using the following rules. +// In the rules, the tag of a field refers to the value associated with the +// key 'xml' in the struct field's tag (see the example above). +// +// * If the struct has a field of type []byte or string with tag +// ",innerxml", Unmarshal accumulates the raw XML nested inside the +// element in that field. The rest of the rules still apply. +// +// * If the struct has a field named XMLName of type xml.Name, +// Unmarshal records the element name in that field. +// +// * If the XMLName field has an associated tag of the form +// "name" or "namespace-URL name", the XML element must have +// the given name (and, optionally, name space) or else Unmarshal +// returns an error. +// +// * If the XML element has an attribute whose name matches a +// struct field name with an associated tag containing ",attr" or +// the explicit name in a struct field tag of the form "name,attr", +// Unmarshal records the attribute value in that field. +// +// * If the XML element contains character data, that data is +// accumulated in the first struct field that has tag ",chardata". +// The struct field may have type []byte or string. +// If there is no such field, the character data is discarded. +// +// * If the XML element contains comments, they are accumulated in +// the first struct field that has tag ",comment". The struct +// field may have type []byte or string. If there is no such +// field, the comments are discarded. +// +// * If the XML element contains a sub-element whose name matches +// the prefix of a tag formatted as "a" or "a>b>c", unmarshal +// will descend into the XML structure looking for elements with the +// given names, and will map the innermost elements to that struct +// field. A tag starting with ">" is equivalent to one starting +// with the field name followed by ">". +// +// * If the XML element contains a sub-element whose name matches +// a struct field's XMLName tag and the struct field has no +// explicit name tag as per the previous rule, unmarshal maps +// the sub-element to that struct field. +// +// * If the XML element contains a sub-element whose name matches a +// field without any mode flags (",attr", ",chardata", etc), Unmarshal +// maps the sub-element to that struct field. +// +// * If the XML element contains a sub-element that hasn't matched any +// of the above rules and the struct has a field with tag ",any", +// unmarshal maps the sub-element to that struct field. +// +// * An anonymous struct field is handled as if the fields of its +// value were part of the outer struct. +// +// * A struct field with tag "-" is never unmarshalled into. +// +// Unmarshal maps an XML element to a string or []byte by saving the +// concatenation of that element's character data in the string or +// []byte. The saved []byte is never nil. +// +// Unmarshal maps an attribute value to a string or []byte by saving +// the value in the string or slice. +// +// Unmarshal maps an XML element to a slice by extending the length of +// the slice and mapping the element to the newly created value. +// +// Unmarshal maps an XML element or attribute value to a bool by +// setting it to the boolean value represented by the string. +// +// Unmarshal maps an XML element or attribute value to an integer or +// floating-point field by setting the field to the result of +// interpreting the string value in decimal. There is no check for +// overflow. +// +// Unmarshal maps an XML element to an xml.Name by recording the +// element name. +// +// Unmarshal maps an XML element to a pointer by setting the pointer +// to a freshly allocated value and then mapping the element to that value. +// +func Unmarshal(data []byte, v interface{}) error { + return NewDecoder(bytes.NewReader(data)).Decode(v) +} + +// Decode works like xml.Unmarshal, except it reads the decoder +// stream to find the start element. +func (d *Decoder) Decode(v interface{}) error { + return d.DecodeElement(v, nil) +} + +// DecodeElement works like xml.Unmarshal except that it takes +// a pointer to the start XML element to decode into v. +// It is useful when a client reads some raw XML tokens itself +// but also wants to defer to Unmarshal for some elements. +func (d *Decoder) DecodeElement(v interface{}, start *StartElement) error { + val := reflect.ValueOf(v) + if val.Kind() != reflect.Ptr { + return errors.New("non-pointer passed to Unmarshal") + } + return d.unmarshal(val.Elem(), start) +} + +// An UnmarshalError represents an error in the unmarshalling process. +type UnmarshalError string + +func (e UnmarshalError) Error() string { return string(e) } + +// Unmarshaler is the interface implemented by objects that can unmarshal +// an XML element description of themselves. +// +// UnmarshalXML decodes a single XML element +// beginning with the given start element. +// If it returns an error, the outer call to Unmarshal stops and +// returns that error. +// UnmarshalXML must consume exactly one XML element. +// One common implementation strategy is to unmarshal into +// a separate value with a layout matching the expected XML +// using d.DecodeElement, and then to copy the data from +// that value into the receiver. +// Another common strategy is to use d.Token to process the +// XML object one token at a time. +// UnmarshalXML may not use d.RawToken. +type Unmarshaler interface { + UnmarshalXML(d *Decoder, start StartElement) error +} + +// UnmarshalerAttr is the interface implemented by objects that can unmarshal +// an XML attribute description of themselves. +// +// UnmarshalXMLAttr decodes a single XML attribute. +// If it returns an error, the outer call to Unmarshal stops and +// returns that error. +// UnmarshalXMLAttr is used only for struct fields with the +// "attr" option in the field tag. +type UnmarshalerAttr interface { + UnmarshalXMLAttr(attr Attr) error +} + +// receiverType returns the receiver type to use in an expression like "%s.MethodName". +func receiverType(val interface{}) string { + t := reflect.TypeOf(val) + if t.Name() != "" { + return t.String() + } + return "(" + t.String() + ")" +} + +// unmarshalInterface unmarshals a single XML element into val. +// start is the opening tag of the element. +func (p *Decoder) unmarshalInterface(val Unmarshaler, start *StartElement) error { + // Record that decoder must stop at end tag corresponding to start. + p.pushEOF() + + p.unmarshalDepth++ + err := val.UnmarshalXML(p, *start) + p.unmarshalDepth-- + if err != nil { + p.popEOF() + return err + } + + if !p.popEOF() { + return fmt.Errorf("xml: %s.UnmarshalXML did not consume entire <%s> element", receiverType(val), start.Name.Local) + } + + return nil +} + +// unmarshalTextInterface unmarshals a single XML element into val. +// The chardata contained in the element (but not its children) +// is passed to the text unmarshaler. +func (p *Decoder) unmarshalTextInterface(val encoding.TextUnmarshaler, start *StartElement) error { + var buf []byte + depth := 1 + for depth > 0 { + t, err := p.Token() + if err != nil { + return err + } + switch t := t.(type) { + case CharData: + if depth == 1 { + buf = append(buf, t...) + } + case StartElement: + depth++ + case EndElement: + depth-- + } + } + return val.UnmarshalText(buf) +} + +// unmarshalAttr unmarshals a single XML attribute into val. +func (p *Decoder) unmarshalAttr(val reflect.Value, attr Attr) error { + if val.Kind() == reflect.Ptr { + if val.IsNil() { + val.Set(reflect.New(val.Type().Elem())) + } + val = val.Elem() + } + + if val.CanInterface() && val.Type().Implements(unmarshalerAttrType) { + // This is an unmarshaler with a non-pointer receiver, + // so it's likely to be incorrect, but we do what we're told. + return val.Interface().(UnmarshalerAttr).UnmarshalXMLAttr(attr) + } + if val.CanAddr() { + pv := val.Addr() + if pv.CanInterface() && pv.Type().Implements(unmarshalerAttrType) { + return pv.Interface().(UnmarshalerAttr).UnmarshalXMLAttr(attr) + } + } + + // Not an UnmarshalerAttr; try encoding.TextUnmarshaler. + if val.CanInterface() && val.Type().Implements(textUnmarshalerType) { + // This is an unmarshaler with a non-pointer receiver, + // so it's likely to be incorrect, but we do what we're told. + return val.Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(attr.Value)) + } + if val.CanAddr() { + pv := val.Addr() + if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) { + return pv.Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(attr.Value)) + } + } + + copyValue(val, []byte(attr.Value)) + return nil +} + +var ( + unmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem() + unmarshalerAttrType = reflect.TypeOf((*UnmarshalerAttr)(nil)).Elem() + textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() +) + +// Unmarshal a single XML element into val. +func (p *Decoder) unmarshal(val reflect.Value, start *StartElement) error { + // Find start element if we need it. + if start == nil { + for { + tok, err := p.Token() + if err != nil { + return err + } + if t, ok := tok.(StartElement); ok { + start = &t + break + } + } + } + + // Load value from interface, but only if the result will be + // usefully addressable. + if val.Kind() == reflect.Interface && !val.IsNil() { + e := val.Elem() + if e.Kind() == reflect.Ptr && !e.IsNil() { + val = e + } + } + + if val.Kind() == reflect.Ptr { + if val.IsNil() { + val.Set(reflect.New(val.Type().Elem())) + } + val = val.Elem() + } + + if val.CanInterface() && val.Type().Implements(unmarshalerType) { + // This is an unmarshaler with a non-pointer receiver, + // so it's likely to be incorrect, but we do what we're told. + return p.unmarshalInterface(val.Interface().(Unmarshaler), start) + } + + if val.CanAddr() { + pv := val.Addr() + if pv.CanInterface() && pv.Type().Implements(unmarshalerType) { + return p.unmarshalInterface(pv.Interface().(Unmarshaler), start) + } + } + + if val.CanInterface() && val.Type().Implements(textUnmarshalerType) { + return p.unmarshalTextInterface(val.Interface().(encoding.TextUnmarshaler), start) + } + + if val.CanAddr() { + pv := val.Addr() + if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) { + return p.unmarshalTextInterface(pv.Interface().(encoding.TextUnmarshaler), start) + } + } + + var ( + data []byte + saveData reflect.Value + comment []byte + saveComment reflect.Value + saveXML reflect.Value + saveXMLIndex int + saveXMLData []byte + saveAny reflect.Value + sv reflect.Value + tinfo *typeInfo + err error + ) + + switch v := val; v.Kind() { + default: + return errors.New("unknown type " + v.Type().String()) + + case reflect.Interface: + // TODO: For now, simply ignore the field. In the near + // future we may choose to unmarshal the start + // element on it, if not nil. + return p.Skip() + + case reflect.Slice: + typ := v.Type() + if typ.Elem().Kind() == reflect.Uint8 { + // []byte + saveData = v + break + } + + // Slice of element values. + // Grow slice. + n := v.Len() + if n >= v.Cap() { + ncap := 2 * n + if ncap < 4 { + ncap = 4 + } + new := reflect.MakeSlice(typ, n, ncap) + reflect.Copy(new, v) + v.Set(new) + } + v.SetLen(n + 1) + + // Recur to read element into slice. + if err := p.unmarshal(v.Index(n), start); err != nil { + v.SetLen(n) + return err + } + return nil + + case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.String: + saveData = v + + case reflect.Struct: + typ := v.Type() + if typ == nameType { + v.Set(reflect.ValueOf(start.Name)) + break + } + + sv = v + tinfo, err = getTypeInfo(typ) + if err != nil { + return err + } + + // Validate and assign element name. + if tinfo.xmlname != nil { + finfo := tinfo.xmlname + if finfo.name != "" && finfo.name != start.Name.Local { + return UnmarshalError("expected element type <" + finfo.name + "> but have <" + start.Name.Local + ">") + } + if finfo.xmlns != "" && finfo.xmlns != start.Name.Space { + e := "expected element <" + finfo.name + "> in name space " + finfo.xmlns + " but have " + if start.Name.Space == "" { + e += "no name space" + } else { + e += start.Name.Space + } + return UnmarshalError(e) + } + fv := finfo.value(sv) + if _, ok := fv.Interface().(Name); ok { + fv.Set(reflect.ValueOf(start.Name)) + } + } + + // Assign attributes. + // Also, determine whether we need to save character data or comments. + for i := range tinfo.fields { + finfo := &tinfo.fields[i] + switch finfo.flags & fMode { + case fAttr: + strv := finfo.value(sv) + // Look for attribute. + for _, a := range start.Attr { + if a.Name.Local == finfo.name && (finfo.xmlns == "" || finfo.xmlns == a.Name.Space) { + if err := p.unmarshalAttr(strv, a); err != nil { + return err + } + break + } + } + + case fCharData: + if !saveData.IsValid() { + saveData = finfo.value(sv) + } + + case fComment: + if !saveComment.IsValid() { + saveComment = finfo.value(sv) + } + + case fAny, fAny | fElement: + if !saveAny.IsValid() { + saveAny = finfo.value(sv) + } + + case fInnerXml: + if !saveXML.IsValid() { + saveXML = finfo.value(sv) + if p.saved == nil { + saveXMLIndex = 0 + p.saved = new(bytes.Buffer) + } else { + saveXMLIndex = p.savedOffset() + } + } + } + } + } + + // Find end element. + // Process sub-elements along the way. +Loop: + for { + var savedOffset int + if saveXML.IsValid() { + savedOffset = p.savedOffset() + } + tok, err := p.Token() + if err != nil { + return err + } + switch t := tok.(type) { + case StartElement: + consumed := false + if sv.IsValid() { + consumed, err = p.unmarshalPath(tinfo, sv, nil, &t) + if err != nil { + return err + } + if !consumed && saveAny.IsValid() { + consumed = true + if err := p.unmarshal(saveAny, &t); err != nil { + return err + } + } + } + if !consumed { + if err := p.Skip(); err != nil { + return err + } + } + + case EndElement: + if saveXML.IsValid() { + saveXMLData = p.saved.Bytes()[saveXMLIndex:savedOffset] + if saveXMLIndex == 0 { + p.saved = nil + } + } + break Loop + + case CharData: + if saveData.IsValid() { + data = append(data, t...) + } + + case Comment: + if saveComment.IsValid() { + comment = append(comment, t...) + } + } + } + + if saveData.IsValid() && saveData.CanInterface() && saveData.Type().Implements(textUnmarshalerType) { + if err := saveData.Interface().(encoding.TextUnmarshaler).UnmarshalText(data); err != nil { + return err + } + saveData = reflect.Value{} + } + + if saveData.IsValid() && saveData.CanAddr() { + pv := saveData.Addr() + if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) { + if err := pv.Interface().(encoding.TextUnmarshaler).UnmarshalText(data); err != nil { + return err + } + saveData = reflect.Value{} + } + } + + if err := copyValue(saveData, data); err != nil { + return err + } + + switch t := saveComment; t.Kind() { + case reflect.String: + t.SetString(string(comment)) + case reflect.Slice: + t.Set(reflect.ValueOf(comment)) + } + + switch t := saveXML; t.Kind() { + case reflect.String: + t.SetString(string(saveXMLData)) + case reflect.Slice: + t.Set(reflect.ValueOf(saveXMLData)) + } + + return nil +} + +func copyValue(dst reflect.Value, src []byte) (err error) { + dst0 := dst + + if dst.Kind() == reflect.Ptr { + if dst.IsNil() { + dst.Set(reflect.New(dst.Type().Elem())) + } + dst = dst.Elem() + } + + // Save accumulated data. + switch dst.Kind() { + case reflect.Invalid: + // Probably a comment. + default: + return errors.New("cannot unmarshal into " + dst0.Type().String()) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + itmp, err := strconv.ParseInt(string(src), 10, dst.Type().Bits()) + if err != nil { + return err + } + dst.SetInt(itmp) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + utmp, err := strconv.ParseUint(string(src), 10, dst.Type().Bits()) + if err != nil { + return err + } + dst.SetUint(utmp) + case reflect.Float32, reflect.Float64: + ftmp, err := strconv.ParseFloat(string(src), dst.Type().Bits()) + if err != nil { + return err + } + dst.SetFloat(ftmp) + case reflect.Bool: + value, err := strconv.ParseBool(strings.TrimSpace(string(src))) + if err != nil { + return err + } + dst.SetBool(value) + case reflect.String: + dst.SetString(string(src)) + case reflect.Slice: + if len(src) == 0 { + // non-nil to flag presence + src = []byte{} + } + dst.SetBytes(src) + } + return nil +} + +// unmarshalPath walks down an XML structure looking for wanted +// paths, and calls unmarshal on them. +// The consumed result tells whether XML elements have been consumed +// from the Decoder until start's matching end element, or if it's +// still untouched because start is uninteresting for sv's fields. +func (p *Decoder) unmarshalPath(tinfo *typeInfo, sv reflect.Value, parents []string, start *StartElement) (consumed bool, err error) { + recurse := false +Loop: + for i := range tinfo.fields { + finfo := &tinfo.fields[i] + if finfo.flags&fElement == 0 || len(finfo.parents) < len(parents) || finfo.xmlns != "" && finfo.xmlns != start.Name.Space { + continue + } + for j := range parents { + if parents[j] != finfo.parents[j] { + continue Loop + } + } + if len(finfo.parents) == len(parents) && finfo.name == start.Name.Local { + // It's a perfect match, unmarshal the field. + return true, p.unmarshal(finfo.value(sv), start) + } + if len(finfo.parents) > len(parents) && finfo.parents[len(parents)] == start.Name.Local { + // It's a prefix for the field. Break and recurse + // since it's not ok for one field path to be itself + // the prefix for another field path. + recurse = true + + // We can reuse the same slice as long as we + // don't try to append to it. + parents = finfo.parents[:len(parents)+1] + break + } + } + if !recurse { + // We have no business with this element. + return false, nil + } + // The element is not a perfect match for any field, but one + // or more fields have the path to this element as a parent + // prefix. Recurse and attempt to match these. + for { + var tok Token + tok, err = p.Token() + if err != nil { + return true, err + } + switch t := tok.(type) { + case StartElement: + consumed2, err := p.unmarshalPath(tinfo, sv, parents, &t) + if err != nil { + return true, err + } + if !consumed2 { + if err := p.Skip(); err != nil { + return true, err + } + } + case EndElement: + return true, nil + } + } +} + +// Skip reads tokens until it has consumed the end element +// matching the most recent start element already consumed. +// It recurs if it encounters a start element, so it can be used to +// skip nested structures. +// It returns nil if it finds an end element matching the start +// element; otherwise it returns an error describing the problem. +func (d *Decoder) Skip() error { + for { + tok, err := d.Token() + if err != nil { + return err + } + switch tok.(type) { + case StartElement: + if err := d.Skip(); err != nil { + return err + } + case EndElement: + return nil + } + } +} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/read_test.go b/vendor/golang.org/x/net/webdav/internal/xml/read_test.go new file mode 100644 index 0000000000..02f1e10c33 --- /dev/null +++ b/vendor/golang.org/x/net/webdav/internal/xml/read_test.go @@ -0,0 +1,744 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xml + +import ( + "bytes" + "fmt" + "io" + "reflect" + "strings" + "testing" + "time" +) + +// Stripped down Atom feed data structures. + +func TestUnmarshalFeed(t *testing.T) { + var f Feed + if err := Unmarshal([]byte(atomFeedString), &f); err != nil { + t.Fatalf("Unmarshal: %s", err) + } + if !reflect.DeepEqual(f, atomFeed) { + t.Fatalf("have %#v\nwant %#v", f, atomFeed) + } +} + +// hget http://codereview.appspot.com/rss/mine/rsc +const atomFeedString = ` + +Code Review - My issueshttp://codereview.appspot.com/rietveld<>rietveld: an attempt at pubsubhubbub +2009-10-04T01:35:58+00:00email-address-removedurn:md5:134d9179c41f806be79b3a5f7877d19a + An attempt at adding pubsubhubbub support to Rietveld. +http://code.google.com/p/pubsubhubbub +http://code.google.com/p/rietveld/issues/detail?id=155 + +The server side of the protocol is trivial: + 1. add a &lt;link rel=&quot;hub&quot; href=&quot;hub-server&quot;&gt; tag to all + feeds that will be pubsubhubbubbed. + 2. every time one of those feeds changes, tell the hub + with a simple POST request. + +I have tested this by adding debug prints to a local hub +server and checking that the server got the right publish +requests. + +I can&#39;t quite get the server to work, but I think the bug +is not in my code. I think that the server expects to be +able to grab the feed and see the feed&#39;s actual URL in +the link rel=&quot;self&quot;, but the default value for that drops +the :port from the URL, and I cannot for the life of me +figure out how to get the Atom generator deep inside +django not to do that, or even where it is doing that, +or even what code is running to generate the Atom feed. +(I thought I knew but I added some assert False statements +and it kept running!) + +Ignoring that particular problem, I would appreciate +feedback on the right way to get the two values at +the top of feeds.py marked NOTE(rsc). + + +rietveld: correct tab handling +2009-10-03T23:02:17+00:00email-address-removedurn:md5:0a2a4f19bb815101f0ba2904aed7c35a + This fixes the buggy tab rendering that can be seen at +http://codereview.appspot.com/116075/diff/1/2 + +The fundamental problem was that the tab code was +not being told what column the text began in, so it +didn&#39;t know where to put the tab stops. Another problem +was that some of the code assumed that string byte +offsets were the same as column offsets, which is only +true if there are no tabs. + +In the process of fixing this, I cleaned up the arguments +to Fold and ExpandTabs and renamed them Break and +_ExpandTabs so that I could be sure that I found all the +call sites. I also wanted to verify that ExpandTabs was +not being used from outside intra_region_diff.py. + + + ` + +type Feed struct { + XMLName Name `xml:"http://www.w3.org/2005/Atom feed"` + Title string `xml:"title"` + Id string `xml:"id"` + Link []Link `xml:"link"` + Updated time.Time `xml:"updated,attr"` + Author Person `xml:"author"` + Entry []Entry `xml:"entry"` +} + +type Entry struct { + Title string `xml:"title"` + Id string `xml:"id"` + Link []Link `xml:"link"` + Updated time.Time `xml:"updated"` + Author Person `xml:"author"` + Summary Text `xml:"summary"` +} + +type Link struct { + Rel string `xml:"rel,attr,omitempty"` + Href string `xml:"href,attr"` +} + +type Person struct { + Name string `xml:"name"` + URI string `xml:"uri"` + Email string `xml:"email"` + InnerXML string `xml:",innerxml"` +} + +type Text struct { + Type string `xml:"type,attr,omitempty"` + Body string `xml:",chardata"` +} + +var atomFeed = Feed{ + XMLName: Name{"http://www.w3.org/2005/Atom", "feed"}, + Title: "Code Review - My issues", + Link: []Link{ + {Rel: "alternate", Href: "http://codereview.appspot.com/"}, + {Rel: "self", Href: "http://codereview.appspot.com/rss/mine/rsc"}, + }, + Id: "http://codereview.appspot.com/", + Updated: ParseTime("2009-10-04T01:35:58+00:00"), + Author: Person{ + Name: "rietveld<>", + InnerXML: "rietveld<>", + }, + Entry: []Entry{ + { + Title: "rietveld: an attempt at pubsubhubbub\n", + Link: []Link{ + {Rel: "alternate", Href: "http://codereview.appspot.com/126085"}, + }, + Updated: ParseTime("2009-10-04T01:35:58+00:00"), + Author: Person{ + Name: "email-address-removed", + InnerXML: "email-address-removed", + }, + Id: "urn:md5:134d9179c41f806be79b3a5f7877d19a", + Summary: Text{ + Type: "html", + Body: ` + An attempt at adding pubsubhubbub support to Rietveld. +http://code.google.com/p/pubsubhubbub +http://code.google.com/p/rietveld/issues/detail?id=155 + +The server side of the protocol is trivial: + 1. add a <link rel="hub" href="hub-server"> tag to all + feeds that will be pubsubhubbubbed. + 2. every time one of those feeds changes, tell the hub + with a simple POST request. + +I have tested this by adding debug prints to a local hub +server and checking that the server got the right publish +requests. + +I can't quite get the server to work, but I think the bug +is not in my code. I think that the server expects to be +able to grab the feed and see the feed's actual URL in +the link rel="self", but the default value for that drops +the :port from the URL, and I cannot for the life of me +figure out how to get the Atom generator deep inside +django not to do that, or even where it is doing that, +or even what code is running to generate the Atom feed. +(I thought I knew but I added some assert False statements +and it kept running!) + +Ignoring that particular problem, I would appreciate +feedback on the right way to get the two values at +the top of feeds.py marked NOTE(rsc). + + +`, + }, + }, + { + Title: "rietveld: correct tab handling\n", + Link: []Link{ + {Rel: "alternate", Href: "http://codereview.appspot.com/124106"}, + }, + Updated: ParseTime("2009-10-03T23:02:17+00:00"), + Author: Person{ + Name: "email-address-removed", + InnerXML: "email-address-removed", + }, + Id: "urn:md5:0a2a4f19bb815101f0ba2904aed7c35a", + Summary: Text{ + Type: "html", + Body: ` + This fixes the buggy tab rendering that can be seen at +http://codereview.appspot.com/116075/diff/1/2 + +The fundamental problem was that the tab code was +not being told what column the text began in, so it +didn't know where to put the tab stops. Another problem +was that some of the code assumed that string byte +offsets were the same as column offsets, which is only +true if there are no tabs. + +In the process of fixing this, I cleaned up the arguments +to Fold and ExpandTabs and renamed them Break and +_ExpandTabs so that I could be sure that I found all the +call sites. I also wanted to verify that ExpandTabs was +not being used from outside intra_region_diff.py. + + +`, + }, + }, + }, +} + +const pathTestString = ` + + 1 + + + A + + + B + + + C + D + + <_> + E + + + 2 + +` + +type PathTestItem struct { + Value string +} + +type PathTestA struct { + Items []PathTestItem `xml:">Item1"` + Before, After string +} + +type PathTestB struct { + Other []PathTestItem `xml:"Items>Item1"` + Before, After string +} + +type PathTestC struct { + Values1 []string `xml:"Items>Item1>Value"` + Values2 []string `xml:"Items>Item2>Value"` + Before, After string +} + +type PathTestSet struct { + Item1 []PathTestItem +} + +type PathTestD struct { + Other PathTestSet `xml:"Items"` + Before, After string +} + +type PathTestE struct { + Underline string `xml:"Items>_>Value"` + Before, After string +} + +var pathTests = []interface{}{ + &PathTestA{Items: []PathTestItem{{"A"}, {"D"}}, Before: "1", After: "2"}, + &PathTestB{Other: []PathTestItem{{"A"}, {"D"}}, Before: "1", After: "2"}, + &PathTestC{Values1: []string{"A", "C", "D"}, Values2: []string{"B"}, Before: "1", After: "2"}, + &PathTestD{Other: PathTestSet{Item1: []PathTestItem{{"A"}, {"D"}}}, Before: "1", After: "2"}, + &PathTestE{Underline: "E", Before: "1", After: "2"}, +} + +func TestUnmarshalPaths(t *testing.T) { + for _, pt := range pathTests { + v := reflect.New(reflect.TypeOf(pt).Elem()).Interface() + if err := Unmarshal([]byte(pathTestString), v); err != nil { + t.Fatalf("Unmarshal: %s", err) + } + if !reflect.DeepEqual(v, pt) { + t.Fatalf("have %#v\nwant %#v", v, pt) + } + } +} + +type BadPathTestA struct { + First string `xml:"items>item1"` + Other string `xml:"items>item2"` + Second string `xml:"items"` +} + +type BadPathTestB struct { + Other string `xml:"items>item2>value"` + First string `xml:"items>item1"` + Second string `xml:"items>item1>value"` +} + +type BadPathTestC struct { + First string + Second string `xml:"First"` +} + +type BadPathTestD struct { + BadPathEmbeddedA + BadPathEmbeddedB +} + +type BadPathEmbeddedA struct { + First string +} + +type BadPathEmbeddedB struct { + Second string `xml:"First"` +} + +var badPathTests = []struct { + v, e interface{} +}{ + {&BadPathTestA{}, &TagPathError{reflect.TypeOf(BadPathTestA{}), "First", "items>item1", "Second", "items"}}, + {&BadPathTestB{}, &TagPathError{reflect.TypeOf(BadPathTestB{}), "First", "items>item1", "Second", "items>item1>value"}}, + {&BadPathTestC{}, &TagPathError{reflect.TypeOf(BadPathTestC{}), "First", "", "Second", "First"}}, + {&BadPathTestD{}, &TagPathError{reflect.TypeOf(BadPathTestD{}), "First", "", "Second", "First"}}, +} + +func TestUnmarshalBadPaths(t *testing.T) { + for _, tt := range badPathTests { + err := Unmarshal([]byte(pathTestString), tt.v) + if !reflect.DeepEqual(err, tt.e) { + t.Fatalf("Unmarshal with %#v didn't fail properly:\nhave %#v,\nwant %#v", tt.v, err, tt.e) + } + } +} + +const OK = "OK" +const withoutNameTypeData = ` + +` + +type TestThree struct { + XMLName Name `xml:"Test3"` + Attr string `xml:",attr"` +} + +func TestUnmarshalWithoutNameType(t *testing.T) { + var x TestThree + if err := Unmarshal([]byte(withoutNameTypeData), &x); err != nil { + t.Fatalf("Unmarshal: %s", err) + } + if x.Attr != OK { + t.Fatalf("have %v\nwant %v", x.Attr, OK) + } +} + +func TestUnmarshalAttr(t *testing.T) { + type ParamVal struct { + Int int `xml:"int,attr"` + } + + type ParamPtr struct { + Int *int `xml:"int,attr"` + } + + type ParamStringPtr struct { + Int *string `xml:"int,attr"` + } + + x := []byte(``) + + p1 := &ParamPtr{} + if err := Unmarshal(x, p1); err != nil { + t.Fatalf("Unmarshal: %s", err) + } + if p1.Int == nil { + t.Fatalf("Unmarshal failed in to *int field") + } else if *p1.Int != 1 { + t.Fatalf("Unmarshal with %s failed:\nhave %#v,\n want %#v", x, p1.Int, 1) + } + + p2 := &ParamVal{} + if err := Unmarshal(x, p2); err != nil { + t.Fatalf("Unmarshal: %s", err) + } + if p2.Int != 1 { + t.Fatalf("Unmarshal with %s failed:\nhave %#v,\n want %#v", x, p2.Int, 1) + } + + p3 := &ParamStringPtr{} + if err := Unmarshal(x, p3); err != nil { + t.Fatalf("Unmarshal: %s", err) + } + if p3.Int == nil { + t.Fatalf("Unmarshal failed in to *string field") + } else if *p3.Int != "1" { + t.Fatalf("Unmarshal with %s failed:\nhave %#v,\n want %#v", x, p3.Int, 1) + } +} + +type Tables struct { + HTable string `xml:"http://www.w3.org/TR/html4/ table"` + FTable string `xml:"http://www.w3schools.com/furniture table"` +} + +var tables = []struct { + xml string + tab Tables + ns string +}{ + { + xml: `` + + `hello
    ` + + `world
    ` + + `
    `, + tab: Tables{"hello", "world"}, + }, + { + xml: `` + + `world
    ` + + `hello
    ` + + `
    `, + tab: Tables{"hello", "world"}, + }, + { + xml: `` + + `world` + + `hello` + + ``, + tab: Tables{"hello", "world"}, + }, + { + xml: `` + + `bogus
    ` + + `
    `, + tab: Tables{}, + }, + { + xml: `` + + `only
    ` + + `
    `, + tab: Tables{HTable: "only"}, + ns: "http://www.w3.org/TR/html4/", + }, + { + xml: `` + + `only
    ` + + `
    `, + tab: Tables{FTable: "only"}, + ns: "http://www.w3schools.com/furniture", + }, + { + xml: `` + + `only
    ` + + `
    `, + tab: Tables{}, + ns: "something else entirely", + }, +} + +func TestUnmarshalNS(t *testing.T) { + for i, tt := range tables { + var dst Tables + var err error + if tt.ns != "" { + d := NewDecoder(strings.NewReader(tt.xml)) + d.DefaultSpace = tt.ns + err = d.Decode(&dst) + } else { + err = Unmarshal([]byte(tt.xml), &dst) + } + if err != nil { + t.Errorf("#%d: Unmarshal: %v", i, err) + continue + } + want := tt.tab + if dst != want { + t.Errorf("#%d: dst=%+v, want %+v", i, dst, want) + } + } +} + +func TestRoundTrip(t *testing.T) { + // From issue 7535 + const s = `` + in := bytes.NewBufferString(s) + for i := 0; i < 10; i++ { + out := &bytes.Buffer{} + d := NewDecoder(in) + e := NewEncoder(out) + + for { + t, err := d.Token() + if err == io.EOF { + break + } + if err != nil { + fmt.Println("failed:", err) + return + } + e.EncodeToken(t) + } + e.Flush() + in = out + } + if got := in.String(); got != s { + t.Errorf("have: %q\nwant: %q\n", got, s) + } +} + +func TestMarshalNS(t *testing.T) { + dst := Tables{"hello", "world"} + data, err := Marshal(&dst) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + want := `hello
    world
    ` + str := string(data) + if str != want { + t.Errorf("have: %q\nwant: %q\n", str, want) + } +} + +type TableAttrs struct { + TAttr TAttr +} + +type TAttr struct { + HTable string `xml:"http://www.w3.org/TR/html4/ table,attr"` + FTable string `xml:"http://www.w3schools.com/furniture table,attr"` + Lang string `xml:"http://www.w3.org/XML/1998/namespace lang,attr,omitempty"` + Other1 string `xml:"http://golang.org/xml/ other,attr,omitempty"` + Other2 string `xml:"http://golang.org/xmlfoo/ other,attr,omitempty"` + Other3 string `xml:"http://golang.org/json/ other,attr,omitempty"` + Other4 string `xml:"http://golang.org/2/json/ other,attr,omitempty"` +} + +var tableAttrs = []struct { + xml string + tab TableAttrs + ns string +}{ + { + xml: ``, + tab: TableAttrs{TAttr{HTable: "hello", FTable: "world"}}, + }, + { + xml: ``, + tab: TableAttrs{TAttr{HTable: "hello", FTable: "world"}}, + }, + { + xml: ``, + tab: TableAttrs{TAttr{HTable: "hello", FTable: "world"}}, + }, + { + // Default space does not apply to attribute names. + xml: ``, + tab: TableAttrs{TAttr{HTable: "hello", FTable: ""}}, + }, + { + // Default space does not apply to attribute names. + xml: ``, + tab: TableAttrs{TAttr{HTable: "", FTable: "world"}}, + }, + { + xml: ``, + tab: TableAttrs{}, + }, + { + // Default space does not apply to attribute names. + xml: ``, + tab: TableAttrs{TAttr{HTable: "hello", FTable: ""}}, + ns: "http://www.w3schools.com/furniture", + }, + { + // Default space does not apply to attribute names. + xml: ``, + tab: TableAttrs{TAttr{HTable: "", FTable: "world"}}, + ns: "http://www.w3.org/TR/html4/", + }, + { + xml: ``, + tab: TableAttrs{}, + ns: "something else entirely", + }, +} + +func TestUnmarshalNSAttr(t *testing.T) { + for i, tt := range tableAttrs { + var dst TableAttrs + var err error + if tt.ns != "" { + d := NewDecoder(strings.NewReader(tt.xml)) + d.DefaultSpace = tt.ns + err = d.Decode(&dst) + } else { + err = Unmarshal([]byte(tt.xml), &dst) + } + if err != nil { + t.Errorf("#%d: Unmarshal: %v", i, err) + continue + } + want := tt.tab + if dst != want { + t.Errorf("#%d: dst=%+v, want %+v", i, dst, want) + } + } +} + +func TestMarshalNSAttr(t *testing.T) { + src := TableAttrs{TAttr{"hello", "world", "en_US", "other1", "other2", "other3", "other4"}} + data, err := Marshal(&src) + if err != nil { + t.Fatalf("Marshal: %v", err) + } + want := `` + str := string(data) + if str != want { + t.Errorf("Marshal:\nhave: %#q\nwant: %#q\n", str, want) + } + + var dst TableAttrs + if err := Unmarshal(data, &dst); err != nil { + t.Errorf("Unmarshal: %v", err) + } + + if dst != src { + t.Errorf("Unmarshal = %q, want %q", dst, src) + } +} + +type MyCharData struct { + body string +} + +func (m *MyCharData) UnmarshalXML(d *Decoder, start StartElement) error { + for { + t, err := d.Token() + if err == io.EOF { // found end of element + break + } + if err != nil { + return err + } + if char, ok := t.(CharData); ok { + m.body += string(char) + } + } + return nil +} + +var _ Unmarshaler = (*MyCharData)(nil) + +func (m *MyCharData) UnmarshalXMLAttr(attr Attr) error { + panic("must not call") +} + +type MyAttr struct { + attr string +} + +func (m *MyAttr) UnmarshalXMLAttr(attr Attr) error { + m.attr = attr.Value + return nil +} + +var _ UnmarshalerAttr = (*MyAttr)(nil) + +type MyStruct struct { + Data *MyCharData + Attr *MyAttr `xml:",attr"` + + Data2 MyCharData + Attr2 MyAttr `xml:",attr"` +} + +func TestUnmarshaler(t *testing.T) { + xml := ` + + hello world + howdy world + + ` + + var m MyStruct + if err := Unmarshal([]byte(xml), &m); err != nil { + t.Fatal(err) + } + + if m.Data == nil || m.Attr == nil || m.Data.body != "hello world" || m.Attr.attr != "attr1" || m.Data2.body != "howdy world" || m.Attr2.attr != "attr2" { + t.Errorf("m=%#+v\n", m) + } +} + +type Pea struct { + Cotelydon string +} + +type Pod struct { + Pea interface{} `xml:"Pea"` +} + +// https://golang.org/issue/6836 +func TestUnmarshalIntoInterface(t *testing.T) { + pod := new(Pod) + pod.Pea = new(Pea) + xml := `Green stuff` + err := Unmarshal([]byte(xml), pod) + if err != nil { + t.Fatalf("failed to unmarshal %q: %v", xml, err) + } + pea, ok := pod.Pea.(*Pea) + if !ok { + t.Fatalf("unmarshalled into wrong type: have %T want *Pea", pod.Pea) + } + have, want := pea.Cotelydon, "Green stuff" + if have != want { + t.Errorf("failed to unmarshal into interface, have %q want %q", have, want) + } +} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go b/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go new file mode 100644 index 0000000000..c9a6421f28 --- /dev/null +++ b/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go @@ -0,0 +1,371 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xml + +import ( + "fmt" + "reflect" + "strings" + "sync" +) + +// typeInfo holds details for the xml representation of a type. +type typeInfo struct { + xmlname *fieldInfo + fields []fieldInfo +} + +// fieldInfo holds details for the xml representation of a single field. +type fieldInfo struct { + idx []int + name string + xmlns string + flags fieldFlags + parents []string +} + +type fieldFlags int + +const ( + fElement fieldFlags = 1 << iota + fAttr + fCharData + fInnerXml + fComment + fAny + + fOmitEmpty + + fMode = fElement | fAttr | fCharData | fInnerXml | fComment | fAny +) + +var tinfoMap = make(map[reflect.Type]*typeInfo) +var tinfoLock sync.RWMutex + +var nameType = reflect.TypeOf(Name{}) + +// getTypeInfo returns the typeInfo structure with details necessary +// for marshalling and unmarshalling typ. +func getTypeInfo(typ reflect.Type) (*typeInfo, error) { + tinfoLock.RLock() + tinfo, ok := tinfoMap[typ] + tinfoLock.RUnlock() + if ok { + return tinfo, nil + } + tinfo = &typeInfo{} + if typ.Kind() == reflect.Struct && typ != nameType { + n := typ.NumField() + for i := 0; i < n; i++ { + f := typ.Field(i) + if f.PkgPath != "" || f.Tag.Get("xml") == "-" { + continue // Private field + } + + // For embedded structs, embed its fields. + if f.Anonymous { + t := f.Type + if t.Kind() == reflect.Ptr { + t = t.Elem() + } + if t.Kind() == reflect.Struct { + inner, err := getTypeInfo(t) + if err != nil { + return nil, err + } + if tinfo.xmlname == nil { + tinfo.xmlname = inner.xmlname + } + for _, finfo := range inner.fields { + finfo.idx = append([]int{i}, finfo.idx...) + if err := addFieldInfo(typ, tinfo, &finfo); err != nil { + return nil, err + } + } + continue + } + } + + finfo, err := structFieldInfo(typ, &f) + if err != nil { + return nil, err + } + + if f.Name == "XMLName" { + tinfo.xmlname = finfo + continue + } + + // Add the field if it doesn't conflict with other fields. + if err := addFieldInfo(typ, tinfo, finfo); err != nil { + return nil, err + } + } + } + tinfoLock.Lock() + tinfoMap[typ] = tinfo + tinfoLock.Unlock() + return tinfo, nil +} + +// structFieldInfo builds and returns a fieldInfo for f. +func structFieldInfo(typ reflect.Type, f *reflect.StructField) (*fieldInfo, error) { + finfo := &fieldInfo{idx: f.Index} + + // Split the tag from the xml namespace if necessary. + tag := f.Tag.Get("xml") + if i := strings.Index(tag, " "); i >= 0 { + finfo.xmlns, tag = tag[:i], tag[i+1:] + } + + // Parse flags. + tokens := strings.Split(tag, ",") + if len(tokens) == 1 { + finfo.flags = fElement + } else { + tag = tokens[0] + for _, flag := range tokens[1:] { + switch flag { + case "attr": + finfo.flags |= fAttr + case "chardata": + finfo.flags |= fCharData + case "innerxml": + finfo.flags |= fInnerXml + case "comment": + finfo.flags |= fComment + case "any": + finfo.flags |= fAny + case "omitempty": + finfo.flags |= fOmitEmpty + } + } + + // Validate the flags used. + valid := true + switch mode := finfo.flags & fMode; mode { + case 0: + finfo.flags |= fElement + case fAttr, fCharData, fInnerXml, fComment, fAny: + if f.Name == "XMLName" || tag != "" && mode != fAttr { + valid = false + } + default: + // This will also catch multiple modes in a single field. + valid = false + } + if finfo.flags&fMode == fAny { + finfo.flags |= fElement + } + if finfo.flags&fOmitEmpty != 0 && finfo.flags&(fElement|fAttr) == 0 { + valid = false + } + if !valid { + return nil, fmt.Errorf("xml: invalid tag in field %s of type %s: %q", + f.Name, typ, f.Tag.Get("xml")) + } + } + + // Use of xmlns without a name is not allowed. + if finfo.xmlns != "" && tag == "" { + return nil, fmt.Errorf("xml: namespace without name in field %s of type %s: %q", + f.Name, typ, f.Tag.Get("xml")) + } + + if f.Name == "XMLName" { + // The XMLName field records the XML element name. Don't + // process it as usual because its name should default to + // empty rather than to the field name. + finfo.name = tag + return finfo, nil + } + + if tag == "" { + // If the name part of the tag is completely empty, get + // default from XMLName of underlying struct if feasible, + // or field name otherwise. + if xmlname := lookupXMLName(f.Type); xmlname != nil { + finfo.xmlns, finfo.name = xmlname.xmlns, xmlname.name + } else { + finfo.name = f.Name + } + return finfo, nil + } + + if finfo.xmlns == "" && finfo.flags&fAttr == 0 { + // If it's an element no namespace specified, get the default + // from the XMLName of enclosing struct if possible. + if xmlname := lookupXMLName(typ); xmlname != nil { + finfo.xmlns = xmlname.xmlns + } + } + + // Prepare field name and parents. + parents := strings.Split(tag, ">") + if parents[0] == "" { + parents[0] = f.Name + } + if parents[len(parents)-1] == "" { + return nil, fmt.Errorf("xml: trailing '>' in field %s of type %s", f.Name, typ) + } + finfo.name = parents[len(parents)-1] + if len(parents) > 1 { + if (finfo.flags & fElement) == 0 { + return nil, fmt.Errorf("xml: %s chain not valid with %s flag", tag, strings.Join(tokens[1:], ",")) + } + finfo.parents = parents[:len(parents)-1] + } + + // If the field type has an XMLName field, the names must match + // so that the behavior of both marshalling and unmarshalling + // is straightforward and unambiguous. + if finfo.flags&fElement != 0 { + ftyp := f.Type + xmlname := lookupXMLName(ftyp) + if xmlname != nil && xmlname.name != finfo.name { + return nil, fmt.Errorf("xml: name %q in tag of %s.%s conflicts with name %q in %s.XMLName", + finfo.name, typ, f.Name, xmlname.name, ftyp) + } + } + return finfo, nil +} + +// lookupXMLName returns the fieldInfo for typ's XMLName field +// in case it exists and has a valid xml field tag, otherwise +// it returns nil. +func lookupXMLName(typ reflect.Type) (xmlname *fieldInfo) { + for typ.Kind() == reflect.Ptr { + typ = typ.Elem() + } + if typ.Kind() != reflect.Struct { + return nil + } + for i, n := 0, typ.NumField(); i < n; i++ { + f := typ.Field(i) + if f.Name != "XMLName" { + continue + } + finfo, err := structFieldInfo(typ, &f) + if finfo.name != "" && err == nil { + return finfo + } + // Also consider errors as a non-existent field tag + // and let getTypeInfo itself report the error. + break + } + return nil +} + +func min(a, b int) int { + if a <= b { + return a + } + return b +} + +// addFieldInfo adds finfo to tinfo.fields if there are no +// conflicts, or if conflicts arise from previous fields that were +// obtained from deeper embedded structures than finfo. In the latter +// case, the conflicting entries are dropped. +// A conflict occurs when the path (parent + name) to a field is +// itself a prefix of another path, or when two paths match exactly. +// It is okay for field paths to share a common, shorter prefix. +func addFieldInfo(typ reflect.Type, tinfo *typeInfo, newf *fieldInfo) error { + var conflicts []int +Loop: + // First, figure all conflicts. Most working code will have none. + for i := range tinfo.fields { + oldf := &tinfo.fields[i] + if oldf.flags&fMode != newf.flags&fMode { + continue + } + if oldf.xmlns != "" && newf.xmlns != "" && oldf.xmlns != newf.xmlns { + continue + } + minl := min(len(newf.parents), len(oldf.parents)) + for p := 0; p < minl; p++ { + if oldf.parents[p] != newf.parents[p] { + continue Loop + } + } + if len(oldf.parents) > len(newf.parents) { + if oldf.parents[len(newf.parents)] == newf.name { + conflicts = append(conflicts, i) + } + } else if len(oldf.parents) < len(newf.parents) { + if newf.parents[len(oldf.parents)] == oldf.name { + conflicts = append(conflicts, i) + } + } else { + if newf.name == oldf.name { + conflicts = append(conflicts, i) + } + } + } + // Without conflicts, add the new field and return. + if conflicts == nil { + tinfo.fields = append(tinfo.fields, *newf) + return nil + } + + // If any conflict is shallower, ignore the new field. + // This matches the Go field resolution on embedding. + for _, i := range conflicts { + if len(tinfo.fields[i].idx) < len(newf.idx) { + return nil + } + } + + // Otherwise, if any of them is at the same depth level, it's an error. + for _, i := range conflicts { + oldf := &tinfo.fields[i] + if len(oldf.idx) == len(newf.idx) { + f1 := typ.FieldByIndex(oldf.idx) + f2 := typ.FieldByIndex(newf.idx) + return &TagPathError{typ, f1.Name, f1.Tag.Get("xml"), f2.Name, f2.Tag.Get("xml")} + } + } + + // Otherwise, the new field is shallower, and thus takes precedence, + // so drop the conflicting fields from tinfo and append the new one. + for c := len(conflicts) - 1; c >= 0; c-- { + i := conflicts[c] + copy(tinfo.fields[i:], tinfo.fields[i+1:]) + tinfo.fields = tinfo.fields[:len(tinfo.fields)-1] + } + tinfo.fields = append(tinfo.fields, *newf) + return nil +} + +// A TagPathError represents an error in the unmarshalling process +// caused by the use of field tags with conflicting paths. +type TagPathError struct { + Struct reflect.Type + Field1, Tag1 string + Field2, Tag2 string +} + +func (e *TagPathError) Error() string { + return fmt.Sprintf("%s field %q with tag %q conflicts with field %q with tag %q", e.Struct, e.Field1, e.Tag1, e.Field2, e.Tag2) +} + +// value returns v's field value corresponding to finfo. +// It's equivalent to v.FieldByIndex(finfo.idx), but initializes +// and dereferences pointers as necessary. +func (finfo *fieldInfo) value(v reflect.Value) reflect.Value { + for i, x := range finfo.idx { + if i > 0 { + t := v.Type() + if t.Kind() == reflect.Ptr && t.Elem().Kind() == reflect.Struct { + if v.IsNil() { + v.Set(reflect.New(v.Type().Elem())) + } + v = v.Elem() + } + } + v = v.Field(x) + } + return v +} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/xml.go b/vendor/golang.org/x/net/webdav/internal/xml/xml.go new file mode 100644 index 0000000000..ffab4a70c9 --- /dev/null +++ b/vendor/golang.org/x/net/webdav/internal/xml/xml.go @@ -0,0 +1,1998 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package xml implements a simple XML 1.0 parser that +// understands XML name spaces. +package xml + +// References: +// Annotated XML spec: http://www.xml.com/axml/testaxml.htm +// XML name spaces: http://www.w3.org/TR/REC-xml-names/ + +// TODO(rsc): +// Test error handling. + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "io" + "strconv" + "strings" + "unicode" + "unicode/utf8" +) + +// A SyntaxError represents a syntax error in the XML input stream. +type SyntaxError struct { + Msg string + Line int +} + +func (e *SyntaxError) Error() string { + return "XML syntax error on line " + strconv.Itoa(e.Line) + ": " + e.Msg +} + +// A Name represents an XML name (Local) annotated with a name space +// identifier (Space). In tokens returned by Decoder.Token, the Space +// identifier is given as a canonical URL, not the short prefix used in +// the document being parsed. +// +// As a special case, XML namespace declarations will use the literal +// string "xmlns" for the Space field instead of the fully resolved URL. +// See Encoder.EncodeToken for more information on namespace encoding +// behaviour. +type Name struct { + Space, Local string +} + +// isNamespace reports whether the name is a namespace-defining name. +func (name Name) isNamespace() bool { + return name.Local == "xmlns" || name.Space == "xmlns" +} + +// An Attr represents an attribute in an XML element (Name=Value). +type Attr struct { + Name Name + Value string +} + +// A Token is an interface holding one of the token types: +// StartElement, EndElement, CharData, Comment, ProcInst, or Directive. +type Token interface{} + +// A StartElement represents an XML start element. +type StartElement struct { + Name Name + Attr []Attr +} + +func (e StartElement) Copy() StartElement { + attrs := make([]Attr, len(e.Attr)) + copy(attrs, e.Attr) + e.Attr = attrs + return e +} + +// End returns the corresponding XML end element. +func (e StartElement) End() EndElement { + return EndElement{e.Name} +} + +// setDefaultNamespace sets the namespace of the element +// as the default for all elements contained within it. +func (e *StartElement) setDefaultNamespace() { + if e.Name.Space == "" { + // If there's no namespace on the element, don't + // set the default. Strictly speaking this might be wrong, as + // we can't tell if the element had no namespace set + // or was just using the default namespace. + return + } + // Don't add a default name space if there's already one set. + for _, attr := range e.Attr { + if attr.Name.Space == "" && attr.Name.Local == "xmlns" { + return + } + } + e.Attr = append(e.Attr, Attr{ + Name: Name{ + Local: "xmlns", + }, + Value: e.Name.Space, + }) +} + +// An EndElement represents an XML end element. +type EndElement struct { + Name Name +} + +// A CharData represents XML character data (raw text), +// in which XML escape sequences have been replaced by +// the characters they represent. +type CharData []byte + +func makeCopy(b []byte) []byte { + b1 := make([]byte, len(b)) + copy(b1, b) + return b1 +} + +func (c CharData) Copy() CharData { return CharData(makeCopy(c)) } + +// A Comment represents an XML comment of the form . +// The bytes do not include the comment markers. +type Comment []byte + +func (c Comment) Copy() Comment { return Comment(makeCopy(c)) } + +// A ProcInst represents an XML processing instruction of the form +type ProcInst struct { + Target string + Inst []byte +} + +func (p ProcInst) Copy() ProcInst { + p.Inst = makeCopy(p.Inst) + return p +} + +// A Directive represents an XML directive of the form . +// The bytes do not include the markers. +type Directive []byte + +func (d Directive) Copy() Directive { return Directive(makeCopy(d)) } + +// CopyToken returns a copy of a Token. +func CopyToken(t Token) Token { + switch v := t.(type) { + case CharData: + return v.Copy() + case Comment: + return v.Copy() + case Directive: + return v.Copy() + case ProcInst: + return v.Copy() + case StartElement: + return v.Copy() + } + return t +} + +// A Decoder represents an XML parser reading a particular input stream. +// The parser assumes that its input is encoded in UTF-8. +type Decoder struct { + // Strict defaults to true, enforcing the requirements + // of the XML specification. + // If set to false, the parser allows input containing common + // mistakes: + // * If an element is missing an end tag, the parser invents + // end tags as necessary to keep the return values from Token + // properly balanced. + // * In attribute values and character data, unknown or malformed + // character entities (sequences beginning with &) are left alone. + // + // Setting: + // + // d.Strict = false; + // d.AutoClose = HTMLAutoClose; + // d.Entity = HTMLEntity + // + // creates a parser that can handle typical HTML. + // + // Strict mode does not enforce the requirements of the XML name spaces TR. + // In particular it does not reject name space tags using undefined prefixes. + // Such tags are recorded with the unknown prefix as the name space URL. + Strict bool + + // When Strict == false, AutoClose indicates a set of elements to + // consider closed immediately after they are opened, regardless + // of whether an end element is present. + AutoClose []string + + // Entity can be used to map non-standard entity names to string replacements. + // The parser behaves as if these standard mappings are present in the map, + // regardless of the actual map content: + // + // "lt": "<", + // "gt": ">", + // "amp": "&", + // "apos": "'", + // "quot": `"`, + Entity map[string]string + + // CharsetReader, if non-nil, defines a function to generate + // charset-conversion readers, converting from the provided + // non-UTF-8 charset into UTF-8. If CharsetReader is nil or + // returns an error, parsing stops with an error. One of the + // the CharsetReader's result values must be non-nil. + CharsetReader func(charset string, input io.Reader) (io.Reader, error) + + // DefaultSpace sets the default name space used for unadorned tags, + // as if the entire XML stream were wrapped in an element containing + // the attribute xmlns="DefaultSpace". + DefaultSpace string + + r io.ByteReader + buf bytes.Buffer + saved *bytes.Buffer + stk *stack + free *stack + needClose bool + toClose Name + nextToken Token + nextByte int + ns map[string]string + err error + line int + offset int64 + unmarshalDepth int +} + +// NewDecoder creates a new XML parser reading from r. +// If r does not implement io.ByteReader, NewDecoder will +// do its own buffering. +func NewDecoder(r io.Reader) *Decoder { + d := &Decoder{ + ns: make(map[string]string), + nextByte: -1, + line: 1, + Strict: true, + } + d.switchToReader(r) + return d +} + +// Token returns the next XML token in the input stream. +// At the end of the input stream, Token returns nil, io.EOF. +// +// Slices of bytes in the returned token data refer to the +// parser's internal buffer and remain valid only until the next +// call to Token. To acquire a copy of the bytes, call CopyToken +// or the token's Copy method. +// +// Token expands self-closing elements such as
    +// into separate start and end elements returned by successive calls. +// +// Token guarantees that the StartElement and EndElement +// tokens it returns are properly nested and matched: +// if Token encounters an unexpected end element, +// it will return an error. +// +// Token implements XML name spaces as described by +// http://www.w3.org/TR/REC-xml-names/. Each of the +// Name structures contained in the Token has the Space +// set to the URL identifying its name space when known. +// If Token encounters an unrecognized name space prefix, +// it uses the prefix as the Space rather than report an error. +func (d *Decoder) Token() (t Token, err error) { + if d.stk != nil && d.stk.kind == stkEOF { + err = io.EOF + return + } + if d.nextToken != nil { + t = d.nextToken + d.nextToken = nil + } else if t, err = d.rawToken(); err != nil { + return + } + + if !d.Strict { + if t1, ok := d.autoClose(t); ok { + d.nextToken = t + t = t1 + } + } + switch t1 := t.(type) { + case StartElement: + // In XML name spaces, the translations listed in the + // attributes apply to the element name and + // to the other attribute names, so process + // the translations first. + for _, a := range t1.Attr { + if a.Name.Space == "xmlns" { + v, ok := d.ns[a.Name.Local] + d.pushNs(a.Name.Local, v, ok) + d.ns[a.Name.Local] = a.Value + } + if a.Name.Space == "" && a.Name.Local == "xmlns" { + // Default space for untagged names + v, ok := d.ns[""] + d.pushNs("", v, ok) + d.ns[""] = a.Value + } + } + + d.translate(&t1.Name, true) + for i := range t1.Attr { + d.translate(&t1.Attr[i].Name, false) + } + d.pushElement(t1.Name) + t = t1 + + case EndElement: + d.translate(&t1.Name, true) + if !d.popElement(&t1) { + return nil, d.err + } + t = t1 + } + return +} + +const xmlURL = "http://www.w3.org/XML/1998/namespace" + +// Apply name space translation to name n. +// The default name space (for Space=="") +// applies only to element names, not to attribute names. +func (d *Decoder) translate(n *Name, isElementName bool) { + switch { + case n.Space == "xmlns": + return + case n.Space == "" && !isElementName: + return + case n.Space == "xml": + n.Space = xmlURL + case n.Space == "" && n.Local == "xmlns": + return + } + if v, ok := d.ns[n.Space]; ok { + n.Space = v + } else if n.Space == "" { + n.Space = d.DefaultSpace + } +} + +func (d *Decoder) switchToReader(r io.Reader) { + // Get efficient byte at a time reader. + // Assume that if reader has its own + // ReadByte, it's efficient enough. + // Otherwise, use bufio. + if rb, ok := r.(io.ByteReader); ok { + d.r = rb + } else { + d.r = bufio.NewReader(r) + } +} + +// Parsing state - stack holds old name space translations +// and the current set of open elements. The translations to pop when +// ending a given tag are *below* it on the stack, which is +// more work but forced on us by XML. +type stack struct { + next *stack + kind int + name Name + ok bool +} + +const ( + stkStart = iota + stkNs + stkEOF +) + +func (d *Decoder) push(kind int) *stack { + s := d.free + if s != nil { + d.free = s.next + } else { + s = new(stack) + } + s.next = d.stk + s.kind = kind + d.stk = s + return s +} + +func (d *Decoder) pop() *stack { + s := d.stk + if s != nil { + d.stk = s.next + s.next = d.free + d.free = s + } + return s +} + +// Record that after the current element is finished +// (that element is already pushed on the stack) +// Token should return EOF until popEOF is called. +func (d *Decoder) pushEOF() { + // Walk down stack to find Start. + // It might not be the top, because there might be stkNs + // entries above it. + start := d.stk + for start.kind != stkStart { + start = start.next + } + // The stkNs entries below a start are associated with that + // element too; skip over them. + for start.next != nil && start.next.kind == stkNs { + start = start.next + } + s := d.free + if s != nil { + d.free = s.next + } else { + s = new(stack) + } + s.kind = stkEOF + s.next = start.next + start.next = s +} + +// Undo a pushEOF. +// The element must have been finished, so the EOF should be at the top of the stack. +func (d *Decoder) popEOF() bool { + if d.stk == nil || d.stk.kind != stkEOF { + return false + } + d.pop() + return true +} + +// Record that we are starting an element with the given name. +func (d *Decoder) pushElement(name Name) { + s := d.push(stkStart) + s.name = name +} + +// Record that we are changing the value of ns[local]. +// The old value is url, ok. +func (d *Decoder) pushNs(local string, url string, ok bool) { + s := d.push(stkNs) + s.name.Local = local + s.name.Space = url + s.ok = ok +} + +// Creates a SyntaxError with the current line number. +func (d *Decoder) syntaxError(msg string) error { + return &SyntaxError{Msg: msg, Line: d.line} +} + +// Record that we are ending an element with the given name. +// The name must match the record at the top of the stack, +// which must be a pushElement record. +// After popping the element, apply any undo records from +// the stack to restore the name translations that existed +// before we saw this element. +func (d *Decoder) popElement(t *EndElement) bool { + s := d.pop() + name := t.Name + switch { + case s == nil || s.kind != stkStart: + d.err = d.syntaxError("unexpected end element ") + return false + case s.name.Local != name.Local: + if !d.Strict { + d.needClose = true + d.toClose = t.Name + t.Name = s.name + return true + } + d.err = d.syntaxError("element <" + s.name.Local + "> closed by ") + return false + case s.name.Space != name.Space: + d.err = d.syntaxError("element <" + s.name.Local + "> in space " + s.name.Space + + "closed by in space " + name.Space) + return false + } + + // Pop stack until a Start or EOF is on the top, undoing the + // translations that were associated with the element we just closed. + for d.stk != nil && d.stk.kind != stkStart && d.stk.kind != stkEOF { + s := d.pop() + if s.ok { + d.ns[s.name.Local] = s.name.Space + } else { + delete(d.ns, s.name.Local) + } + } + + return true +} + +// If the top element on the stack is autoclosing and +// t is not the end tag, invent the end tag. +func (d *Decoder) autoClose(t Token) (Token, bool) { + if d.stk == nil || d.stk.kind != stkStart { + return nil, false + } + name := strings.ToLower(d.stk.name.Local) + for _, s := range d.AutoClose { + if strings.ToLower(s) == name { + // This one should be auto closed if t doesn't close it. + et, ok := t.(EndElement) + if !ok || et.Name.Local != name { + return EndElement{d.stk.name}, true + } + break + } + } + return nil, false +} + +var errRawToken = errors.New("xml: cannot use RawToken from UnmarshalXML method") + +// RawToken is like Token but does not verify that +// start and end elements match and does not translate +// name space prefixes to their corresponding URLs. +func (d *Decoder) RawToken() (Token, error) { + if d.unmarshalDepth > 0 { + return nil, errRawToken + } + return d.rawToken() +} + +func (d *Decoder) rawToken() (Token, error) { + if d.err != nil { + return nil, d.err + } + if d.needClose { + // The last element we read was self-closing and + // we returned just the StartElement half. + // Return the EndElement half now. + d.needClose = false + return EndElement{d.toClose}, nil + } + + b, ok := d.getc() + if !ok { + return nil, d.err + } + + if b != '<' { + // Text section. + d.ungetc(b) + data := d.text(-1, false) + if data == nil { + return nil, d.err + } + return CharData(data), nil + } + + if b, ok = d.mustgetc(); !ok { + return nil, d.err + } + switch b { + case '/': + // ' { + d.err = d.syntaxError("invalid characters between ") + return nil, d.err + } + return EndElement{name}, nil + + case '?': + // ' { + break + } + b0 = b + } + data := d.buf.Bytes() + data = data[0 : len(data)-2] // chop ?> + + if target == "xml" { + content := string(data) + ver := procInst("version", content) + if ver != "" && ver != "1.0" { + d.err = fmt.Errorf("xml: unsupported version %q; only version 1.0 is supported", ver) + return nil, d.err + } + enc := procInst("encoding", content) + if enc != "" && enc != "utf-8" && enc != "UTF-8" { + if d.CharsetReader == nil { + d.err = fmt.Errorf("xml: encoding %q declared but Decoder.CharsetReader is nil", enc) + return nil, d.err + } + newr, err := d.CharsetReader(enc, d.r.(io.Reader)) + if err != nil { + d.err = fmt.Errorf("xml: opening charset %q: %v", enc, err) + return nil, d.err + } + if newr == nil { + panic("CharsetReader returned a nil Reader for charset " + enc) + } + d.switchToReader(newr) + } + } + return ProcInst{target, data}, nil + + case '!': + // ' { + break + } + b0, b1 = b1, b + } + data := d.buf.Bytes() + data = data[0 : len(data)-3] // chop --> + return Comment(data), nil + + case '[': // . + data := d.text(-1, true) + if data == nil { + return nil, d.err + } + return CharData(data), nil + } + + // Probably a directive: , , etc. + // We don't care, but accumulate for caller. Quoted angle + // brackets do not count for nesting. + d.buf.Reset() + d.buf.WriteByte(b) + inquote := uint8(0) + depth := 0 + for { + if b, ok = d.mustgetc(); !ok { + return nil, d.err + } + if inquote == 0 && b == '>' && depth == 0 { + break + } + HandleB: + d.buf.WriteByte(b) + switch { + case b == inquote: + inquote = 0 + + case inquote != 0: + // in quotes, no special action + + case b == '\'' || b == '"': + inquote = b + + case b == '>' && inquote == 0: + depth-- + + case b == '<' && inquote == 0: + // Look for ` + +var testEntity = map[string]string{"何": "What", "is-it": "is it?"} + +var rawTokens = []Token{ + CharData("\n"), + ProcInst{"xml", []byte(`version="1.0" encoding="UTF-8"`)}, + CharData("\n"), + Directive(`DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"`), + CharData("\n"), + StartElement{Name{"", "body"}, []Attr{{Name{"xmlns", "foo"}, "ns1"}, {Name{"", "xmlns"}, "ns2"}, {Name{"xmlns", "tag"}, "ns3"}}}, + CharData("\n "), + StartElement{Name{"", "hello"}, []Attr{{Name{"", "lang"}, "en"}}}, + CharData("World <>'\" 白鵬翔"), + EndElement{Name{"", "hello"}}, + CharData("\n "), + StartElement{Name{"", "query"}, []Attr{}}, + CharData("What is it?"), + EndElement{Name{"", "query"}}, + CharData("\n "), + StartElement{Name{"", "goodbye"}, []Attr{}}, + EndElement{Name{"", "goodbye"}}, + CharData("\n "), + StartElement{Name{"", "outer"}, []Attr{{Name{"foo", "attr"}, "value"}, {Name{"xmlns", "tag"}, "ns4"}}}, + CharData("\n "), + StartElement{Name{"", "inner"}, []Attr{}}, + EndElement{Name{"", "inner"}}, + CharData("\n "), + EndElement{Name{"", "outer"}}, + CharData("\n "), + StartElement{Name{"tag", "name"}, []Attr{}}, + CharData("\n "), + CharData("Some text here."), + CharData("\n "), + EndElement{Name{"tag", "name"}}, + CharData("\n"), + EndElement{Name{"", "body"}}, + Comment(" missing final newline "), +} + +var cookedTokens = []Token{ + CharData("\n"), + ProcInst{"xml", []byte(`version="1.0" encoding="UTF-8"`)}, + CharData("\n"), + Directive(`DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"`), + CharData("\n"), + StartElement{Name{"ns2", "body"}, []Attr{{Name{"xmlns", "foo"}, "ns1"}, {Name{"", "xmlns"}, "ns2"}, {Name{"xmlns", "tag"}, "ns3"}}}, + CharData("\n "), + StartElement{Name{"ns2", "hello"}, []Attr{{Name{"", "lang"}, "en"}}}, + CharData("World <>'\" 白鵬翔"), + EndElement{Name{"ns2", "hello"}}, + CharData("\n "), + StartElement{Name{"ns2", "query"}, []Attr{}}, + CharData("What is it?"), + EndElement{Name{"ns2", "query"}}, + CharData("\n "), + StartElement{Name{"ns2", "goodbye"}, []Attr{}}, + EndElement{Name{"ns2", "goodbye"}}, + CharData("\n "), + StartElement{Name{"ns2", "outer"}, []Attr{{Name{"ns1", "attr"}, "value"}, {Name{"xmlns", "tag"}, "ns4"}}}, + CharData("\n "), + StartElement{Name{"ns2", "inner"}, []Attr{}}, + EndElement{Name{"ns2", "inner"}}, + CharData("\n "), + EndElement{Name{"ns2", "outer"}}, + CharData("\n "), + StartElement{Name{"ns3", "name"}, []Attr{}}, + CharData("\n "), + CharData("Some text here."), + CharData("\n "), + EndElement{Name{"ns3", "name"}}, + CharData("\n"), + EndElement{Name{"ns2", "body"}}, + Comment(" missing final newline "), +} + +const testInputAltEncoding = ` + +VALUE` + +var rawTokensAltEncoding = []Token{ + CharData("\n"), + ProcInst{"xml", []byte(`version="1.0" encoding="x-testing-uppercase"`)}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("value"), + EndElement{Name{"", "tag"}}, +} + +var xmlInput = []string{ + // unexpected EOF cases + "<", + "", + "", + "", + // "", // let the Token() caller handle + "", + "", + "", + "", + " c;", + "", + "", + "", + // "", // let the Token() caller handle + "", + "", + "cdata]]>", +} + +func TestRawToken(t *testing.T) { + d := NewDecoder(strings.NewReader(testInput)) + d.Entity = testEntity + testRawToken(t, d, testInput, rawTokens) +} + +const nonStrictInput = ` +non&entity +&unknown;entity +{ +&#zzz; +&なまえ3; +<-gt; +&; +&0a; +` + +var nonStringEntity = map[string]string{"": "oops!", "0a": "oops!"} + +var nonStrictTokens = []Token{ + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("non&entity"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("&unknown;entity"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("{"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("&#zzz;"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("&なまえ3;"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("<-gt;"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("&;"), + EndElement{Name{"", "tag"}}, + CharData("\n"), + StartElement{Name{"", "tag"}, []Attr{}}, + CharData("&0a;"), + EndElement{Name{"", "tag"}}, + CharData("\n"), +} + +func TestNonStrictRawToken(t *testing.T) { + d := NewDecoder(strings.NewReader(nonStrictInput)) + d.Strict = false + testRawToken(t, d, nonStrictInput, nonStrictTokens) +} + +type downCaser struct { + t *testing.T + r io.ByteReader +} + +func (d *downCaser) ReadByte() (c byte, err error) { + c, err = d.r.ReadByte() + if c >= 'A' && c <= 'Z' { + c += 'a' - 'A' + } + return +} + +func (d *downCaser) Read(p []byte) (int, error) { + d.t.Fatalf("unexpected Read call on downCaser reader") + panic("unreachable") +} + +func TestRawTokenAltEncoding(t *testing.T) { + d := NewDecoder(strings.NewReader(testInputAltEncoding)) + d.CharsetReader = func(charset string, input io.Reader) (io.Reader, error) { + if charset != "x-testing-uppercase" { + t.Fatalf("unexpected charset %q", charset) + } + return &downCaser{t, input.(io.ByteReader)}, nil + } + testRawToken(t, d, testInputAltEncoding, rawTokensAltEncoding) +} + +func TestRawTokenAltEncodingNoConverter(t *testing.T) { + d := NewDecoder(strings.NewReader(testInputAltEncoding)) + token, err := d.RawToken() + if token == nil { + t.Fatalf("expected a token on first RawToken call") + } + if err != nil { + t.Fatal(err) + } + token, err = d.RawToken() + if token != nil { + t.Errorf("expected a nil token; got %#v", token) + } + if err == nil { + t.Fatalf("expected an error on second RawToken call") + } + const encoding = "x-testing-uppercase" + if !strings.Contains(err.Error(), encoding) { + t.Errorf("expected error to contain %q; got error: %v", + encoding, err) + } +} + +func testRawToken(t *testing.T, d *Decoder, raw string, rawTokens []Token) { + lastEnd := int64(0) + for i, want := range rawTokens { + start := d.InputOffset() + have, err := d.RawToken() + end := d.InputOffset() + if err != nil { + t.Fatalf("token %d: unexpected error: %s", i, err) + } + if !reflect.DeepEqual(have, want) { + var shave, swant string + if _, ok := have.(CharData); ok { + shave = fmt.Sprintf("CharData(%q)", have) + } else { + shave = fmt.Sprintf("%#v", have) + } + if _, ok := want.(CharData); ok { + swant = fmt.Sprintf("CharData(%q)", want) + } else { + swant = fmt.Sprintf("%#v", want) + } + t.Errorf("token %d = %s, want %s", i, shave, swant) + } + + // Check that InputOffset returned actual token. + switch { + case start < lastEnd: + t.Errorf("token %d: position [%d,%d) for %T is before previous token", i, start, end, have) + case start >= end: + // Special case: EndElement can be synthesized. + if start == end && end == lastEnd { + break + } + t.Errorf("token %d: position [%d,%d) for %T is empty", i, start, end, have) + case end > int64(len(raw)): + t.Errorf("token %d: position [%d,%d) for %T extends beyond input", i, start, end, have) + default: + text := raw[start:end] + if strings.ContainsAny(text, "<>") && (!strings.HasPrefix(text, "<") || !strings.HasSuffix(text, ">")) { + t.Errorf("token %d: misaligned raw token %#q for %T", i, text, have) + } + } + lastEnd = end + } +} + +// Ensure that directives (specifically !DOCTYPE) include the complete +// text of any nested directives, noting that < and > do not change +// nesting depth if they are in single or double quotes. + +var nestedDirectivesInput = ` +]> +">]> +]> +'>]> +]> +'>]> +]> +` + +var nestedDirectivesTokens = []Token{ + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), + Directive(`DOCTYPE [">]`), + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), + Directive(`DOCTYPE ['>]`), + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), + Directive(`DOCTYPE ['>]`), + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), +} + +func TestNestedDirectives(t *testing.T) { + d := NewDecoder(strings.NewReader(nestedDirectivesInput)) + + for i, want := range nestedDirectivesTokens { + have, err := d.Token() + if err != nil { + t.Fatalf("token %d: unexpected error: %s", i, err) + } + if !reflect.DeepEqual(have, want) { + t.Errorf("token %d = %#v want %#v", i, have, want) + } + } +} + +func TestToken(t *testing.T) { + d := NewDecoder(strings.NewReader(testInput)) + d.Entity = testEntity + + for i, want := range cookedTokens { + have, err := d.Token() + if err != nil { + t.Fatalf("token %d: unexpected error: %s", i, err) + } + if !reflect.DeepEqual(have, want) { + t.Errorf("token %d = %#v want %#v", i, have, want) + } + } +} + +func TestSyntax(t *testing.T) { + for i := range xmlInput { + d := NewDecoder(strings.NewReader(xmlInput[i])) + var err error + for _, err = d.Token(); err == nil; _, err = d.Token() { + } + if _, ok := err.(*SyntaxError); !ok { + t.Fatalf(`xmlInput "%s": expected SyntaxError not received`, xmlInput[i]) + } + } +} + +type allScalars struct { + True1 bool + True2 bool + False1 bool + False2 bool + Int int + Int8 int8 + Int16 int16 + Int32 int32 + Int64 int64 + Uint int + Uint8 uint8 + Uint16 uint16 + Uint32 uint32 + Uint64 uint64 + Uintptr uintptr + Float32 float32 + Float64 float64 + String string + PtrString *string +} + +var all = allScalars{ + True1: true, + True2: true, + False1: false, + False2: false, + Int: 1, + Int8: -2, + Int16: 3, + Int32: -4, + Int64: 5, + Uint: 6, + Uint8: 7, + Uint16: 8, + Uint32: 9, + Uint64: 10, + Uintptr: 11, + Float32: 13.0, + Float64: 14.0, + String: "15", + PtrString: &sixteen, +} + +var sixteen = "16" + +const testScalarsInput = ` + true + 1 + false + 0 + 1 + -2 + 3 + -4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12.0 + 13.0 + 14.0 + 15 + 16 +` + +func TestAllScalars(t *testing.T) { + var a allScalars + err := Unmarshal([]byte(testScalarsInput), &a) + + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(a, all) { + t.Errorf("have %+v want %+v", a, all) + } +} + +type item struct { + Field_a string +} + +func TestIssue569(t *testing.T) { + data := `abcd` + var i item + err := Unmarshal([]byte(data), &i) + + if err != nil || i.Field_a != "abcd" { + t.Fatal("Expecting abcd") + } +} + +func TestUnquotedAttrs(t *testing.T) { + data := "" + d := NewDecoder(strings.NewReader(data)) + d.Strict = false + token, err := d.Token() + if _, ok := err.(*SyntaxError); ok { + t.Errorf("Unexpected error: %v", err) + } + if token.(StartElement).Name.Local != "tag" { + t.Errorf("Unexpected tag name: %v", token.(StartElement).Name.Local) + } + attr := token.(StartElement).Attr[0] + if attr.Value != "azAZ09:-_" { + t.Errorf("Unexpected attribute value: %v", attr.Value) + } + if attr.Name.Local != "attr" { + t.Errorf("Unexpected attribute name: %v", attr.Name.Local) + } +} + +func TestValuelessAttrs(t *testing.T) { + tests := [][3]string{ + {"

    ", "p", "nowrap"}, + {"

    ", "p", "nowrap"}, + {"", "input", "checked"}, + {"", "input", "checked"}, + } + for _, test := range tests { + d := NewDecoder(strings.NewReader(test[0])) + d.Strict = false + token, err := d.Token() + if _, ok := err.(*SyntaxError); ok { + t.Errorf("Unexpected error: %v", err) + } + if token.(StartElement).Name.Local != test[1] { + t.Errorf("Unexpected tag name: %v", token.(StartElement).Name.Local) + } + attr := token.(StartElement).Attr[0] + if attr.Value != test[2] { + t.Errorf("Unexpected attribute value: %v", attr.Value) + } + if attr.Name.Local != test[2] { + t.Errorf("Unexpected attribute name: %v", attr.Name.Local) + } + } +} + +func TestCopyTokenCharData(t *testing.T) { + data := []byte("same data") + var tok1 Token = CharData(data) + tok2 := CopyToken(tok1) + if !reflect.DeepEqual(tok1, tok2) { + t.Error("CopyToken(CharData) != CharData") + } + data[1] = 'o' + if reflect.DeepEqual(tok1, tok2) { + t.Error("CopyToken(CharData) uses same buffer.") + } +} + +func TestCopyTokenStartElement(t *testing.T) { + elt := StartElement{Name{"", "hello"}, []Attr{{Name{"", "lang"}, "en"}}} + var tok1 Token = elt + tok2 := CopyToken(tok1) + if tok1.(StartElement).Attr[0].Value != "en" { + t.Error("CopyToken overwrote Attr[0]") + } + if !reflect.DeepEqual(tok1, tok2) { + t.Error("CopyToken(StartElement) != StartElement") + } + tok1.(StartElement).Attr[0] = Attr{Name{"", "lang"}, "de"} + if reflect.DeepEqual(tok1, tok2) { + t.Error("CopyToken(CharData) uses same buffer.") + } +} + +func TestSyntaxErrorLineNum(t *testing.T) { + testInput := "

    Foo

    \n\n

    Bar\n" + d := NewDecoder(strings.NewReader(testInput)) + var err error + for _, err = d.Token(); err == nil; _, err = d.Token() { + } + synerr, ok := err.(*SyntaxError) + if !ok { + t.Error("Expected SyntaxError.") + } + if synerr.Line != 3 { + t.Error("SyntaxError didn't have correct line number.") + } +} + +func TestTrailingRawToken(t *testing.T) { + input := ` ` + d := NewDecoder(strings.NewReader(input)) + var err error + for _, err = d.RawToken(); err == nil; _, err = d.RawToken() { + } + if err != io.EOF { + t.Fatalf("d.RawToken() = _, %v, want _, io.EOF", err) + } +} + +func TestTrailingToken(t *testing.T) { + input := ` ` + d := NewDecoder(strings.NewReader(input)) + var err error + for _, err = d.Token(); err == nil; _, err = d.Token() { + } + if err != io.EOF { + t.Fatalf("d.Token() = _, %v, want _, io.EOF", err) + } +} + +func TestEntityInsideCDATA(t *testing.T) { + input := `` + d := NewDecoder(strings.NewReader(input)) + var err error + for _, err = d.Token(); err == nil; _, err = d.Token() { + } + if err != io.EOF { + t.Fatalf("d.Token() = _, %v, want _, io.EOF", err) + } +} + +var characterTests = []struct { + in string + err string +}{ + {"\x12", "illegal character code U+0012"}, + {"\x0b", "illegal character code U+000B"}, + {"\xef\xbf\xbe", "illegal character code U+FFFE"}, + {"\r\n\x07", "illegal character code U+0007"}, + {"what's up", "expected attribute name in element"}, + {"&abc\x01;", "invalid character entity &abc (no semicolon)"}, + {"&\x01;", "invalid character entity & (no semicolon)"}, + {"&\xef\xbf\xbe;", "invalid character entity &\uFFFE;"}, + {"&hello;", "invalid character entity &hello;"}, +} + +func TestDisallowedCharacters(t *testing.T) { + + for i, tt := range characterTests { + d := NewDecoder(strings.NewReader(tt.in)) + var err error + + for err == nil { + _, err = d.Token() + } + synerr, ok := err.(*SyntaxError) + if !ok { + t.Fatalf("input %d d.Token() = _, %v, want _, *SyntaxError", i, err) + } + if synerr.Msg != tt.err { + t.Fatalf("input %d synerr.Msg wrong: want %q, got %q", i, tt.err, synerr.Msg) + } + } +} + +type procInstEncodingTest struct { + expect, got string +} + +var procInstTests = []struct { + input string + expect [2]string +}{ + {`version="1.0" encoding="utf-8"`, [2]string{"1.0", "utf-8"}}, + {`version="1.0" encoding='utf-8'`, [2]string{"1.0", "utf-8"}}, + {`version="1.0" encoding='utf-8' `, [2]string{"1.0", "utf-8"}}, + {`version="1.0" encoding=utf-8`, [2]string{"1.0", ""}}, + {`encoding="FOO" `, [2]string{"", "FOO"}}, +} + +func TestProcInstEncoding(t *testing.T) { + for _, test := range procInstTests { + if got := procInst("version", test.input); got != test.expect[0] { + t.Errorf("procInst(version, %q) = %q; want %q", test.input, got, test.expect[0]) + } + if got := procInst("encoding", test.input); got != test.expect[1] { + t.Errorf("procInst(encoding, %q) = %q; want %q", test.input, got, test.expect[1]) + } + } +} + +// Ensure that directives with comments include the complete +// text of any nested directives. + +var directivesWithCommentsInput = ` +]> +]> + --> --> []> +` + +var directivesWithCommentsTokens = []Token{ + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), + Directive(`DOCTYPE []`), + CharData("\n"), +} + +func TestDirectivesWithComments(t *testing.T) { + d := NewDecoder(strings.NewReader(directivesWithCommentsInput)) + + for i, want := range directivesWithCommentsTokens { + have, err := d.Token() + if err != nil { + t.Fatalf("token %d: unexpected error: %s", i, err) + } + if !reflect.DeepEqual(have, want) { + t.Errorf("token %d = %#v want %#v", i, have, want) + } + } +} + +// Writer whose Write method always returns an error. +type errWriter struct{} + +func (errWriter) Write(p []byte) (n int, err error) { return 0, fmt.Errorf("unwritable") } + +func TestEscapeTextIOErrors(t *testing.T) { + expectErr := "unwritable" + err := EscapeText(errWriter{}, []byte{'A'}) + + if err == nil || err.Error() != expectErr { + t.Errorf("have %v, want %v", err, expectErr) + } +} + +func TestEscapeTextInvalidChar(t *testing.T) { + input := []byte("A \x00 terminated string.") + expected := "A \uFFFD terminated string." + + buff := new(bytes.Buffer) + if err := EscapeText(buff, input); err != nil { + t.Fatalf("have %v, want nil", err) + } + text := buff.String() + + if text != expected { + t.Errorf("have %v, want %v", text, expected) + } +} + +func TestIssue5880(t *testing.T) { + type T []byte + data, err := Marshal(T{192, 168, 0, 1}) + if err != nil { + t.Errorf("Marshal error: %v", err) + } + if !utf8.Valid(data) { + t.Errorf("Marshal generated invalid UTF-8: %x", data) + } +} diff --git a/vendor/golang.org/x/net/webdav/litmus_test_server.go b/vendor/golang.org/x/net/webdav/litmus_test_server.go new file mode 100644 index 0000000000..514db5dd19 --- /dev/null +++ b/vendor/golang.org/x/net/webdav/litmus_test_server.go @@ -0,0 +1,94 @@ +// 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 ignore + +/* +This program is a server for the WebDAV 'litmus' compliance test at +http://www.webdav.org/neon/litmus/ +To run the test: + +go run litmus_test_server.go + +and separately, from the downloaded litmus-xxx directory: + +make URL=http://localhost:9999/ check +*/ +package main + +import ( + "flag" + "fmt" + "log" + "net/http" + "net/url" + + "golang.org/x/net/webdav" +) + +var port = flag.Int("port", 9999, "server port") + +func main() { + flag.Parse() + log.SetFlags(0) + h := &webdav.Handler{ + FileSystem: webdav.NewMemFS(), + LockSystem: webdav.NewMemLS(), + Logger: func(r *http.Request, err error) { + litmus := r.Header.Get("X-Litmus") + if len(litmus) > 19 { + litmus = litmus[:16] + "..." + } + + switch r.Method { + case "COPY", "MOVE": + dst := "" + if u, err := url.Parse(r.Header.Get("Destination")); err == nil { + dst = u.Path + } + o := r.Header.Get("Overwrite") + log.Printf("%-20s%-10s%-30s%-30so=%-2s%v", litmus, r.Method, r.URL.Path, dst, o, err) + default: + log.Printf("%-20s%-10s%-30s%v", litmus, r.Method, r.URL.Path, err) + } + }, + } + + // The next line would normally be: + // http.Handle("/", h) + // but we wrap that HTTP handler h to cater for a special case. + // + // The propfind_invalid2 litmus test case expects an empty namespace prefix + // declaration to be an error. The FAQ in the webdav litmus test says: + // + // "What does the "propfind_invalid2" test check for?... + // + // If a request was sent with an XML body which included an empty namespace + // prefix declaration (xmlns:ns1=""), then the server must reject that with + // a "400 Bad Request" response, as it is invalid according to the XML + // Namespace specification." + // + // On the other hand, the Go standard library's encoding/xml package + // accepts an empty xmlns namespace, as per the discussion at + // https://github.com/golang/go/issues/8068 + // + // Empty namespaces seem disallowed in the second (2006) edition of the XML + // standard, but allowed in a later edition. The grammar differs between + // http://www.w3.org/TR/2006/REC-xml-names-20060816/#ns-decl and + // http://www.w3.org/TR/REC-xml-names/#dt-prefix + // + // Thus, we assume that the propfind_invalid2 test is obsolete, and + // hard-code the 400 Bad Request response that the test expects. + http.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Header.Get("X-Litmus") == "props: 3 (propfind_invalid2)" { + http.Error(w, "400 Bad Request", http.StatusBadRequest) + return + } + h.ServeHTTP(w, r) + })) + + addr := fmt.Sprintf(":%d", *port) + log.Printf("Serving %v", addr) + log.Fatal(http.ListenAndServe(addr, nil)) +} diff --git a/vendor/golang.org/x/net/webdav/lock.go b/vendor/golang.org/x/net/webdav/lock.go new file mode 100644 index 0000000000..344ac5ceaf --- /dev/null +++ b/vendor/golang.org/x/net/webdav/lock.go @@ -0,0 +1,445 @@ +// 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 webdav + +import ( + "container/heap" + "errors" + "strconv" + "strings" + "sync" + "time" +) + +var ( + // ErrConfirmationFailed is returned by a LockSystem's Confirm method. + ErrConfirmationFailed = errors.New("webdav: confirmation failed") + // ErrForbidden is returned by a LockSystem's Unlock method. + ErrForbidden = errors.New("webdav: forbidden") + // ErrLocked is returned by a LockSystem's Create, Refresh and Unlock methods. + ErrLocked = errors.New("webdav: locked") + // ErrNoSuchLock is returned by a LockSystem's Refresh and Unlock methods. + ErrNoSuchLock = errors.New("webdav: no such lock") +) + +// Condition can match a WebDAV resource, based on a token or ETag. +// Exactly one of Token and ETag should be non-empty. +type Condition struct { + Not bool + Token string + ETag string +} + +// LockSystem manages access to a collection of named resources. The elements +// in a lock name are separated by slash ('/', U+002F) characters, regardless +// of host operating system convention. +type LockSystem interface { + // Confirm confirms that the caller can claim all of the locks specified by + // the given conditions, and that holding the union of all of those locks + // gives exclusive access to all of the named resources. Up to two resources + // can be named. Empty names are ignored. + // + // Exactly one of release and err will be non-nil. If release is non-nil, + // all of the requested locks are held until release is called. Calling + // release does not unlock the lock, in the WebDAV UNLOCK sense, but once + // Confirm has confirmed that a lock claim is valid, that lock cannot be + // Confirmed again until it has been released. + // + // If Confirm returns ErrConfirmationFailed then the Handler will continue + // to try any other set of locks presented (a WebDAV HTTP request can + // present more than one set of locks). If it returns any other non-nil + // error, the Handler will write a "500 Internal Server Error" HTTP status. + Confirm(now time.Time, name0, name1 string, conditions ...Condition) (release func(), err error) + + // Create creates a lock with the given depth, duration, owner and root + // (name). The depth will either be negative (meaning infinite) or zero. + // + // If Create returns ErrLocked then the Handler will write a "423 Locked" + // HTTP status. If it returns any other non-nil error, the Handler will + // write a "500 Internal Server Error" HTTP status. + // + // See http://www.webdav.org/specs/rfc4918.html#rfc.section.9.10.6 for + // when to use each error. + // + // The token returned identifies the created lock. It should be an absolute + // URI as defined by RFC 3986, Section 4.3. In particular, it should not + // contain whitespace. + Create(now time.Time, details LockDetails) (token string, err error) + + // Refresh refreshes the lock with the given token. + // + // If Refresh returns ErrLocked then the Handler will write a "423 Locked" + // HTTP Status. If Refresh returns ErrNoSuchLock then the Handler will write + // a "412 Precondition Failed" HTTP Status. If it returns any other non-nil + // error, the Handler will write a "500 Internal Server Error" HTTP status. + // + // See http://www.webdav.org/specs/rfc4918.html#rfc.section.9.10.6 for + // when to use each error. + Refresh(now time.Time, token string, duration time.Duration) (LockDetails, error) + + // Unlock unlocks the lock with the given token. + // + // If Unlock returns ErrForbidden then the Handler will write a "403 + // Forbidden" HTTP Status. If Unlock returns ErrLocked then the Handler + // will write a "423 Locked" HTTP status. If Unlock returns ErrNoSuchLock + // then the Handler will write a "409 Conflict" HTTP Status. If it returns + // any other non-nil error, the Handler will write a "500 Internal Server + // Error" HTTP status. + // + // See http://www.webdav.org/specs/rfc4918.html#rfc.section.9.11.1 for + // when to use each error. + Unlock(now time.Time, token string) error +} + +// LockDetails are a lock's metadata. +type LockDetails struct { + // Root is the root resource name being locked. For a zero-depth lock, the + // root is the only resource being locked. + Root string + // Duration is the lock timeout. A negative duration means infinite. + Duration time.Duration + // OwnerXML is the verbatim XML given in a LOCK HTTP request. + // + // TODO: does the "verbatim" nature play well with XML namespaces? + // Does the OwnerXML field need to have more structure? See + // https://codereview.appspot.com/175140043/#msg2 + OwnerXML string + // ZeroDepth is whether the lock has zero depth. If it does not have zero + // depth, it has infinite depth. + ZeroDepth bool +} + +// NewMemLS returns a new in-memory LockSystem. +func NewMemLS() LockSystem { + return &memLS{ + byName: make(map[string]*memLSNode), + byToken: make(map[string]*memLSNode), + gen: uint64(time.Now().Unix()), + } +} + +type memLS struct { + mu sync.Mutex + byName map[string]*memLSNode + byToken map[string]*memLSNode + gen uint64 + // byExpiry only contains those nodes whose LockDetails have a finite + // Duration and are yet to expire. + byExpiry byExpiry +} + +func (m *memLS) nextToken() string { + m.gen++ + return strconv.FormatUint(m.gen, 10) +} + +func (m *memLS) collectExpiredNodes(now time.Time) { + for len(m.byExpiry) > 0 { + if now.Before(m.byExpiry[0].expiry) { + break + } + m.remove(m.byExpiry[0]) + } +} + +func (m *memLS) Confirm(now time.Time, name0, name1 string, conditions ...Condition) (func(), error) { + m.mu.Lock() + defer m.mu.Unlock() + m.collectExpiredNodes(now) + + var n0, n1 *memLSNode + if name0 != "" { + if n0 = m.lookup(slashClean(name0), conditions...); n0 == nil { + return nil, ErrConfirmationFailed + } + } + if name1 != "" { + if n1 = m.lookup(slashClean(name1), conditions...); n1 == nil { + return nil, ErrConfirmationFailed + } + } + + // Don't hold the same node twice. + if n1 == n0 { + n1 = nil + } + + if n0 != nil { + m.hold(n0) + } + if n1 != nil { + m.hold(n1) + } + return func() { + m.mu.Lock() + defer m.mu.Unlock() + if n1 != nil { + m.unhold(n1) + } + if n0 != nil { + m.unhold(n0) + } + }, nil +} + +// lookup returns the node n that locks the named resource, provided that n +// matches at least one of the given conditions and that lock isn't held by +// another party. Otherwise, it returns nil. +// +// n may be a parent of the named resource, if n is an infinite depth lock. +func (m *memLS) lookup(name string, conditions ...Condition) (n *memLSNode) { + // TODO: support Condition.Not and Condition.ETag. + for _, c := range conditions { + n = m.byToken[c.Token] + if n == nil || n.held { + continue + } + if name == n.details.Root { + return n + } + if n.details.ZeroDepth { + continue + } + if n.details.Root == "/" || strings.HasPrefix(name, n.details.Root+"/") { + return n + } + } + return nil +} + +func (m *memLS) hold(n *memLSNode) { + if n.held { + panic("webdav: memLS inconsistent held state") + } + n.held = true + if n.details.Duration >= 0 && n.byExpiryIndex >= 0 { + heap.Remove(&m.byExpiry, n.byExpiryIndex) + } +} + +func (m *memLS) unhold(n *memLSNode) { + if !n.held { + panic("webdav: memLS inconsistent held state") + } + n.held = false + if n.details.Duration >= 0 { + heap.Push(&m.byExpiry, n) + } +} + +func (m *memLS) Create(now time.Time, details LockDetails) (string, error) { + m.mu.Lock() + defer m.mu.Unlock() + m.collectExpiredNodes(now) + details.Root = slashClean(details.Root) + + if !m.canCreate(details.Root, details.ZeroDepth) { + return "", ErrLocked + } + n := m.create(details.Root) + n.token = m.nextToken() + m.byToken[n.token] = n + n.details = details + if n.details.Duration >= 0 { + n.expiry = now.Add(n.details.Duration) + heap.Push(&m.byExpiry, n) + } + return n.token, nil +} + +func (m *memLS) Refresh(now time.Time, token string, duration time.Duration) (LockDetails, error) { + m.mu.Lock() + defer m.mu.Unlock() + m.collectExpiredNodes(now) + + n := m.byToken[token] + if n == nil { + return LockDetails{}, ErrNoSuchLock + } + if n.held { + return LockDetails{}, ErrLocked + } + if n.byExpiryIndex >= 0 { + heap.Remove(&m.byExpiry, n.byExpiryIndex) + } + n.details.Duration = duration + if n.details.Duration >= 0 { + n.expiry = now.Add(n.details.Duration) + heap.Push(&m.byExpiry, n) + } + return n.details, nil +} + +func (m *memLS) Unlock(now time.Time, token string) error { + m.mu.Lock() + defer m.mu.Unlock() + m.collectExpiredNodes(now) + + n := m.byToken[token] + if n == nil { + return ErrNoSuchLock + } + if n.held { + return ErrLocked + } + m.remove(n) + return nil +} + +func (m *memLS) canCreate(name string, zeroDepth bool) bool { + return walkToRoot(name, func(name0 string, first bool) bool { + n := m.byName[name0] + if n == nil { + return true + } + if first { + if n.token != "" { + // The target node is already locked. + return false + } + if !zeroDepth { + // The requested lock depth is infinite, and the fact that n exists + // (n != nil) means that a descendent of the target node is locked. + return false + } + } else if n.token != "" && !n.details.ZeroDepth { + // An ancestor of the target node is locked with infinite depth. + return false + } + return true + }) +} + +func (m *memLS) create(name string) (ret *memLSNode) { + walkToRoot(name, func(name0 string, first bool) bool { + n := m.byName[name0] + if n == nil { + n = &memLSNode{ + details: LockDetails{ + Root: name0, + }, + byExpiryIndex: -1, + } + m.byName[name0] = n + } + n.refCount++ + if first { + ret = n + } + return true + }) + return ret +} + +func (m *memLS) remove(n *memLSNode) { + delete(m.byToken, n.token) + n.token = "" + walkToRoot(n.details.Root, func(name0 string, first bool) bool { + x := m.byName[name0] + x.refCount-- + if x.refCount == 0 { + delete(m.byName, name0) + } + return true + }) + if n.byExpiryIndex >= 0 { + heap.Remove(&m.byExpiry, n.byExpiryIndex) + } +} + +func walkToRoot(name string, f func(name0 string, first bool) bool) bool { + for first := true; ; first = false { + if !f(name, first) { + return false + } + if name == "/" { + break + } + name = name[:strings.LastIndex(name, "/")] + if name == "" { + name = "/" + } + } + return true +} + +type memLSNode struct { + // details are the lock metadata. Even if this node's name is not explicitly locked, + // details.Root will still equal the node's name. + details LockDetails + // token is the unique identifier for this node's lock. An empty token means that + // this node is not explicitly locked. + token string + // refCount is the number of self-or-descendent nodes that are explicitly locked. + refCount int + // expiry is when this node's lock expires. + expiry time.Time + // byExpiryIndex is the index of this node in memLS.byExpiry. It is -1 + // if this node does not expire, or has expired. + byExpiryIndex int + // held is whether this node's lock is actively held by a Confirm call. + held bool +} + +type byExpiry []*memLSNode + +func (b *byExpiry) Len() int { + return len(*b) +} + +func (b *byExpiry) Less(i, j int) bool { + return (*b)[i].expiry.Before((*b)[j].expiry) +} + +func (b *byExpiry) Swap(i, j int) { + (*b)[i], (*b)[j] = (*b)[j], (*b)[i] + (*b)[i].byExpiryIndex = i + (*b)[j].byExpiryIndex = j +} + +func (b *byExpiry) Push(x interface{}) { + n := x.(*memLSNode) + n.byExpiryIndex = len(*b) + *b = append(*b, n) +} + +func (b *byExpiry) Pop() interface{} { + i := len(*b) - 1 + n := (*b)[i] + (*b)[i] = nil + n.byExpiryIndex = -1 + *b = (*b)[:i] + return n +} + +const infiniteTimeout = -1 + +// parseTimeout parses the Timeout HTTP header, as per section 10.7. If s is +// empty, an infiniteTimeout is returned. +func parseTimeout(s string) (time.Duration, error) { + if s == "" { + return infiniteTimeout, nil + } + if i := strings.IndexByte(s, ','); i >= 0 { + s = s[:i] + } + s = strings.TrimSpace(s) + if s == "Infinite" { + return infiniteTimeout, nil + } + const pre = "Second-" + if !strings.HasPrefix(s, pre) { + return 0, errInvalidTimeout + } + s = s[len(pre):] + if s == "" || s[0] < '0' || '9' < s[0] { + return 0, errInvalidTimeout + } + n, err := strconv.ParseInt(s, 10, 64) + if err != nil || 1<<32-1 < n { + return 0, errInvalidTimeout + } + return time.Duration(n) * time.Second, nil +} diff --git a/vendor/golang.org/x/net/webdav/lock_test.go b/vendor/golang.org/x/net/webdav/lock_test.go new file mode 100644 index 0000000000..116d6c0d7e --- /dev/null +++ b/vendor/golang.org/x/net/webdav/lock_test.go @@ -0,0 +1,731 @@ +// 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 webdav + +import ( + "fmt" + "math/rand" + "path" + "reflect" + "sort" + "strconv" + "strings" + "testing" + "time" +) + +func TestWalkToRoot(t *testing.T) { + testCases := []struct { + name string + want []string + }{{ + "/a/b/c/d", + []string{ + "/a/b/c/d", + "/a/b/c", + "/a/b", + "/a", + "/", + }, + }, { + "/a", + []string{ + "/a", + "/", + }, + }, { + "/", + []string{ + "/", + }, + }} + + for _, tc := range testCases { + var got []string + if !walkToRoot(tc.name, func(name0 string, first bool) bool { + if first != (len(got) == 0) { + t.Errorf("name=%q: first=%t but len(got)==%d", tc.name, first, len(got)) + return false + } + got = append(got, name0) + return true + }) { + continue + } + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("name=%q:\ngot %q\nwant %q", tc.name, got, tc.want) + } + } +} + +var lockTestDurations = []time.Duration{ + infiniteTimeout, // infiniteTimeout means to never expire. + 0, // A zero duration means to expire immediately. + 100 * time.Hour, // A very large duration will not expire in these tests. +} + +// lockTestNames are the names of a set of mutually compatible locks. For each +// name fragment: +// - _ means no explicit lock. +// - i means a infinite-depth lock, +// - z means a zero-depth lock, +var lockTestNames = []string{ + "/_/_/_/_/z", + "/_/_/i", + "/_/z", + "/_/z/i", + "/_/z/z", + "/_/z/_/i", + "/_/z/_/z", + "/i", + "/z", + "/z/_/i", + "/z/_/z", +} + +func lockTestZeroDepth(name string) bool { + switch name[len(name)-1] { + case 'i': + return false + case 'z': + return true + } + panic(fmt.Sprintf("lock name %q did not end with 'i' or 'z'", name)) +} + +func TestMemLSCanCreate(t *testing.T) { + now := time.Unix(0, 0) + m := NewMemLS().(*memLS) + + for _, name := range lockTestNames { + _, err := m.Create(now, LockDetails{ + Root: name, + Duration: infiniteTimeout, + ZeroDepth: lockTestZeroDepth(name), + }) + if err != nil { + t.Fatalf("creating lock for %q: %v", name, err) + } + } + + wantCanCreate := func(name string, zeroDepth bool) bool { + for _, n := range lockTestNames { + switch { + case n == name: + // An existing lock has the same name as the proposed lock. + return false + case strings.HasPrefix(n, name): + // An existing lock would be a child of the proposed lock, + // which conflicts if the proposed lock has infinite depth. + if !zeroDepth { + return false + } + case strings.HasPrefix(name, n): + // An existing lock would be an ancestor of the proposed lock, + // which conflicts if the ancestor has infinite depth. + if n[len(n)-1] == 'i' { + return false + } + } + } + return true + } + + var check func(int, string) + check = func(recursion int, name string) { + for _, zeroDepth := range []bool{false, true} { + got := m.canCreate(name, zeroDepth) + want := wantCanCreate(name, zeroDepth) + if got != want { + t.Errorf("canCreate name=%q zeroDepth=%t: got %t, want %t", name, zeroDepth, got, want) + } + } + if recursion == 6 { + return + } + if name != "/" { + name += "/" + } + for _, c := range "_iz" { + check(recursion+1, name+string(c)) + } + } + check(0, "/") +} + +func TestMemLSLookup(t *testing.T) { + now := time.Unix(0, 0) + m := NewMemLS().(*memLS) + + badToken := m.nextToken() + t.Logf("badToken=%q", badToken) + + for _, name := range lockTestNames { + token, err := m.Create(now, LockDetails{ + Root: name, + Duration: infiniteTimeout, + ZeroDepth: lockTestZeroDepth(name), + }) + if err != nil { + t.Fatalf("creating lock for %q: %v", name, err) + } + t.Logf("%-15q -> node=%p token=%q", name, m.byName[name], token) + } + + baseNames := append([]string{"/a", "/b/c"}, lockTestNames...) + for _, baseName := range baseNames { + for _, suffix := range []string{"", "/0", "/1/2/3"} { + name := baseName + suffix + + goodToken := "" + base := m.byName[baseName] + if base != nil && (suffix == "" || !lockTestZeroDepth(baseName)) { + goodToken = base.token + } + + for _, token := range []string{badToken, goodToken} { + if token == "" { + continue + } + + got := m.lookup(name, Condition{Token: token}) + want := base + if token == badToken { + want = nil + } + if got != want { + t.Errorf("name=%-20qtoken=%q (bad=%t): got %p, want %p", + name, token, token == badToken, got, want) + } + } + } + } +} + +func TestMemLSConfirm(t *testing.T) { + now := time.Unix(0, 0) + m := NewMemLS().(*memLS) + alice, err := m.Create(now, LockDetails{ + Root: "/alice", + Duration: infiniteTimeout, + ZeroDepth: false, + }) + tweedle, err := m.Create(now, LockDetails{ + Root: "/tweedle", + Duration: infiniteTimeout, + ZeroDepth: false, + }) + if err != nil { + t.Fatalf("Create: %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Create: inconsistent state: %v", err) + } + + // Test a mismatch between name and condition. + _, err = m.Confirm(now, "/tweedle/dee", "", Condition{Token: alice}) + if err != ErrConfirmationFailed { + t.Fatalf("Confirm (mismatch): got %v, want ErrConfirmationFailed", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Confirm (mismatch): inconsistent state: %v", err) + } + + // Test two names (that fall under the same lock) in the one Confirm call. + release, err := m.Confirm(now, "/tweedle/dee", "/tweedle/dum", Condition{Token: tweedle}) + if err != nil { + t.Fatalf("Confirm (twins): %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Confirm (twins): inconsistent state: %v", err) + } + release() + if err := m.consistent(); err != nil { + t.Fatalf("release (twins): inconsistent state: %v", err) + } + + // Test the same two names in overlapping Confirm / release calls. + releaseDee, err := m.Confirm(now, "/tweedle/dee", "", Condition{Token: tweedle}) + if err != nil { + t.Fatalf("Confirm (sequence #0): %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Confirm (sequence #0): inconsistent state: %v", err) + } + + _, err = m.Confirm(now, "/tweedle/dum", "", Condition{Token: tweedle}) + if err != ErrConfirmationFailed { + t.Fatalf("Confirm (sequence #1): got %v, want ErrConfirmationFailed", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Confirm (sequence #1): inconsistent state: %v", err) + } + + releaseDee() + if err := m.consistent(); err != nil { + t.Fatalf("release (sequence #2): inconsistent state: %v", err) + } + + releaseDum, err := m.Confirm(now, "/tweedle/dum", "", Condition{Token: tweedle}) + if err != nil { + t.Fatalf("Confirm (sequence #3): %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Confirm (sequence #3): inconsistent state: %v", err) + } + + // Test that you can't unlock a held lock. + err = m.Unlock(now, tweedle) + if err != ErrLocked { + t.Fatalf("Unlock (sequence #4): got %v, want ErrLocked", err) + } + + releaseDum() + if err := m.consistent(); err != nil { + t.Fatalf("release (sequence #5): inconsistent state: %v", err) + } + + err = m.Unlock(now, tweedle) + if err != nil { + t.Fatalf("Unlock (sequence #6): %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Unlock (sequence #6): inconsistent state: %v", err) + } +} + +func TestMemLSNonCanonicalRoot(t *testing.T) { + now := time.Unix(0, 0) + m := NewMemLS().(*memLS) + token, err := m.Create(now, LockDetails{ + Root: "/foo/./bar//", + Duration: 1 * time.Second, + }) + if err != nil { + t.Fatalf("Create: %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Create: inconsistent state: %v", err) + } + if err := m.Unlock(now, token); err != nil { + t.Fatalf("Unlock: %v", err) + } + if err := m.consistent(); err != nil { + t.Fatalf("Unlock: inconsistent state: %v", err) + } +} + +func TestMemLSExpiry(t *testing.T) { + m := NewMemLS().(*memLS) + testCases := []string{ + "setNow 0", + "create /a.5", + "want /a.5", + "create /c.6", + "want /a.5 /c.6", + "create /a/b.7", + "want /a.5 /a/b.7 /c.6", + "setNow 4", + "want /a.5 /a/b.7 /c.6", + "setNow 5", + "want /a/b.7 /c.6", + "setNow 6", + "want /a/b.7", + "setNow 7", + "want ", + "setNow 8", + "want ", + "create /a.12", + "create /b.13", + "create /c.15", + "create /a/d.16", + "want /a.12 /a/d.16 /b.13 /c.15", + "refresh /a.14", + "want /a.14 /a/d.16 /b.13 /c.15", + "setNow 12", + "want /a.14 /a/d.16 /b.13 /c.15", + "setNow 13", + "want /a.14 /a/d.16 /c.15", + "setNow 14", + "want /a/d.16 /c.15", + "refresh /a/d.20", + "refresh /c.20", + "want /a/d.20 /c.20", + "setNow 20", + "want ", + } + + tokens := map[string]string{} + zTime := time.Unix(0, 0) + now := zTime + for i, tc := range testCases { + j := strings.IndexByte(tc, ' ') + if j < 0 { + t.Fatalf("test case #%d %q: invalid command", i, tc) + } + op, arg := tc[:j], tc[j+1:] + switch op { + default: + t.Fatalf("test case #%d %q: invalid operation %q", i, tc, op) + + case "create", "refresh": + parts := strings.Split(arg, ".") + if len(parts) != 2 { + t.Fatalf("test case #%d %q: invalid create", i, tc) + } + root := parts[0] + d, err := strconv.Atoi(parts[1]) + if err != nil { + t.Fatalf("test case #%d %q: invalid duration", i, tc) + } + dur := time.Unix(0, 0).Add(time.Duration(d) * time.Second).Sub(now) + + switch op { + case "create": + token, err := m.Create(now, LockDetails{ + Root: root, + Duration: dur, + ZeroDepth: true, + }) + if err != nil { + t.Fatalf("test case #%d %q: Create: %v", i, tc, err) + } + tokens[root] = token + + case "refresh": + token := tokens[root] + if token == "" { + t.Fatalf("test case #%d %q: no token for %q", i, tc, root) + } + got, err := m.Refresh(now, token, dur) + if err != nil { + t.Fatalf("test case #%d %q: Refresh: %v", i, tc, err) + } + want := LockDetails{ + Root: root, + Duration: dur, + ZeroDepth: true, + } + if got != want { + t.Fatalf("test case #%d %q:\ngot %v\nwant %v", i, tc, got, want) + } + } + + case "setNow": + d, err := strconv.Atoi(arg) + if err != nil { + t.Fatalf("test case #%d %q: invalid duration", i, tc) + } + now = time.Unix(0, 0).Add(time.Duration(d) * time.Second) + + case "want": + m.mu.Lock() + m.collectExpiredNodes(now) + got := make([]string, 0, len(m.byToken)) + for _, n := range m.byToken { + got = append(got, fmt.Sprintf("%s.%d", + n.details.Root, n.expiry.Sub(zTime)/time.Second)) + } + m.mu.Unlock() + sort.Strings(got) + want := []string{} + if arg != "" { + want = strings.Split(arg, " ") + } + if !reflect.DeepEqual(got, want) { + t.Fatalf("test case #%d %q:\ngot %q\nwant %q", i, tc, got, want) + } + } + + if err := m.consistent(); err != nil { + t.Fatalf("test case #%d %q: inconsistent state: %v", i, tc, err) + } + } +} + +func TestMemLS(t *testing.T) { + now := time.Unix(0, 0) + m := NewMemLS().(*memLS) + rng := rand.New(rand.NewSource(0)) + tokens := map[string]string{} + nConfirm, nCreate, nRefresh, nUnlock := 0, 0, 0, 0 + const N = 2000 + + for i := 0; i < N; i++ { + name := lockTestNames[rng.Intn(len(lockTestNames))] + duration := lockTestDurations[rng.Intn(len(lockTestDurations))] + confirmed, unlocked := false, false + + // If the name was already locked, we randomly confirm/release, refresh + // or unlock it. Otherwise, we create a lock. + token := tokens[name] + if token != "" { + switch rng.Intn(3) { + case 0: + confirmed = true + nConfirm++ + release, err := m.Confirm(now, name, "", Condition{Token: token}) + if err != nil { + t.Fatalf("iteration #%d: Confirm %q: %v", i, name, err) + } + if err := m.consistent(); err != nil { + t.Fatalf("iteration #%d: inconsistent state: %v", i, err) + } + release() + + case 1: + nRefresh++ + if _, err := m.Refresh(now, token, duration); err != nil { + t.Fatalf("iteration #%d: Refresh %q: %v", i, name, err) + } + + case 2: + unlocked = true + nUnlock++ + if err := m.Unlock(now, token); err != nil { + t.Fatalf("iteration #%d: Unlock %q: %v", i, name, err) + } + } + + } else { + nCreate++ + var err error + token, err = m.Create(now, LockDetails{ + Root: name, + Duration: duration, + ZeroDepth: lockTestZeroDepth(name), + }) + if err != nil { + t.Fatalf("iteration #%d: Create %q: %v", i, name, err) + } + } + + if !confirmed { + if duration == 0 || unlocked { + // A zero-duration lock should expire immediately and is + // effectively equivalent to being unlocked. + tokens[name] = "" + } else { + tokens[name] = token + } + } + + if err := m.consistent(); err != nil { + t.Fatalf("iteration #%d: inconsistent state: %v", i, err) + } + } + + if nConfirm < N/10 { + t.Fatalf("too few Confirm calls: got %d, want >= %d", nConfirm, N/10) + } + if nCreate < N/10 { + t.Fatalf("too few Create calls: got %d, want >= %d", nCreate, N/10) + } + if nRefresh < N/10 { + t.Fatalf("too few Refresh calls: got %d, want >= %d", nRefresh, N/10) + } + if nUnlock < N/10 { + t.Fatalf("too few Unlock calls: got %d, want >= %d", nUnlock, N/10) + } +} + +func (m *memLS) consistent() error { + m.mu.Lock() + defer m.mu.Unlock() + + // If m.byName is non-empty, then it must contain an entry for the root "/", + // and its refCount should equal the number of locked nodes. + if len(m.byName) > 0 { + n := m.byName["/"] + if n == nil { + return fmt.Errorf(`non-empty m.byName does not contain the root "/"`) + } + if n.refCount != len(m.byToken) { + return fmt.Errorf("root node refCount=%d, differs from len(m.byToken)=%d", n.refCount, len(m.byToken)) + } + } + + for name, n := range m.byName { + // The map keys should be consistent with the node's copy of the key. + if n.details.Root != name { + return fmt.Errorf("node name %q != byName map key %q", n.details.Root, name) + } + + // A name must be clean, and start with a "/". + if len(name) == 0 || name[0] != '/' { + return fmt.Errorf(`node name %q does not start with "/"`, name) + } + if name != path.Clean(name) { + return fmt.Errorf(`node name %q is not clean`, name) + } + + // A node's refCount should be positive. + if n.refCount <= 0 { + return fmt.Errorf("non-positive refCount for node at name %q", name) + } + + // A node's refCount should be the number of self-or-descendents that + // are locked (i.e. have a non-empty token). + var list []string + for name0, n0 := range m.byName { + // All of lockTestNames' name fragments are one byte long: '_', 'i' or 'z', + // so strings.HasPrefix is equivalent to self-or-descendent name match. + // We don't have to worry about "/foo/bar" being a false positive match + // for "/foo/b". + if strings.HasPrefix(name0, name) && n0.token != "" { + list = append(list, name0) + } + } + if n.refCount != len(list) { + sort.Strings(list) + return fmt.Errorf("node at name %q has refCount %d but locked self-or-descendents are %q (len=%d)", + name, n.refCount, list, len(list)) + } + + // A node n is in m.byToken if it has a non-empty token. + if n.token != "" { + if _, ok := m.byToken[n.token]; !ok { + return fmt.Errorf("node at name %q has token %q but not in m.byToken", name, n.token) + } + } + + // A node n is in m.byExpiry if it has a non-negative byExpiryIndex. + if n.byExpiryIndex >= 0 { + if n.byExpiryIndex >= len(m.byExpiry) { + return fmt.Errorf("node at name %q has byExpiryIndex %d but m.byExpiry has length %d", name, n.byExpiryIndex, len(m.byExpiry)) + } + if n != m.byExpiry[n.byExpiryIndex] { + return fmt.Errorf("node at name %q has byExpiryIndex %d but that indexes a different node", name, n.byExpiryIndex) + } + } + } + + for token, n := range m.byToken { + // The map keys should be consistent with the node's copy of the key. + if n.token != token { + return fmt.Errorf("node token %q != byToken map key %q", n.token, token) + } + + // Every node in m.byToken is in m.byName. + if _, ok := m.byName[n.details.Root]; !ok { + return fmt.Errorf("node at name %q in m.byToken but not in m.byName", n.details.Root) + } + } + + for i, n := range m.byExpiry { + // The slice indices should be consistent with the node's copy of the index. + if n.byExpiryIndex != i { + return fmt.Errorf("node byExpiryIndex %d != byExpiry slice index %d", n.byExpiryIndex, i) + } + + // Every node in m.byExpiry is in m.byName. + if _, ok := m.byName[n.details.Root]; !ok { + return fmt.Errorf("node at name %q in m.byExpiry but not in m.byName", n.details.Root) + } + + // No node in m.byExpiry should be held. + if n.held { + return fmt.Errorf("node at name %q in m.byExpiry is held", n.details.Root) + } + } + return nil +} + +func TestParseTimeout(t *testing.T) { + testCases := []struct { + s string + want time.Duration + wantErr error + }{{ + "", + infiniteTimeout, + nil, + }, { + "Infinite", + infiniteTimeout, + nil, + }, { + "Infinitesimal", + 0, + errInvalidTimeout, + }, { + "infinite", + 0, + errInvalidTimeout, + }, { + "Second-0", + 0 * time.Second, + nil, + }, { + "Second-123", + 123 * time.Second, + nil, + }, { + " Second-456 ", + 456 * time.Second, + nil, + }, { + "Second-4100000000", + 4100000000 * time.Second, + nil, + }, { + "junk", + 0, + errInvalidTimeout, + }, { + "Second-", + 0, + errInvalidTimeout, + }, { + "Second--1", + 0, + errInvalidTimeout, + }, { + "Second--123", + 0, + errInvalidTimeout, + }, { + "Second-+123", + 0, + errInvalidTimeout, + }, { + "Second-0x123", + 0, + errInvalidTimeout, + }, { + "second-123", + 0, + errInvalidTimeout, + }, { + "Second-4294967295", + 4294967295 * time.Second, + nil, + }, { + // Section 10.7 says that "The timeout value for TimeType "Second" + // must not be greater than 2^32-1." + "Second-4294967296", + 0, + errInvalidTimeout, + }, { + // This test case comes from section 9.10.9 of the spec. It says, + // + // "In this request, the client has specified that it desires an + // infinite-length lock, if available, otherwise a timeout of 4.1 + // billion seconds, if available." + // + // The Go WebDAV package always supports infinite length locks, + // and ignores the fallback after the comma. + "Infinite, Second-4100000000", + infiniteTimeout, + nil, + }} + + for _, tc := range testCases { + got, gotErr := parseTimeout(tc.s) + if got != tc.want || gotErr != tc.wantErr { + t.Errorf("parsing %q:\ngot %v, %v\nwant %v, %v", tc.s, got, gotErr, tc.want, tc.wantErr) + } + } +} diff --git a/vendor/golang.org/x/net/webdav/prop.go b/vendor/golang.org/x/net/webdav/prop.go new file mode 100644 index 0000000000..88b9a3a35c --- /dev/null +++ b/vendor/golang.org/x/net/webdav/prop.go @@ -0,0 +1,389 @@ +// 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 webdav + +import ( + "fmt" + "io" + "mime" + "net/http" + "os" + "path/filepath" + "strconv" + + "golang.org/x/net/webdav/internal/xml" +) + +// Proppatch describes a property update instruction as defined in RFC 4918. +// See http://www.webdav.org/specs/rfc4918.html#METHOD_PROPPATCH +type Proppatch struct { + // Remove specifies whether this patch removes properties. If it does not + // remove them, it sets them. + Remove bool + // Props contains the properties to be set or removed. + Props []Property +} + +// Propstat describes a XML propstat element as defined in RFC 4918. +// See http://www.webdav.org/specs/rfc4918.html#ELEMENT_propstat +type Propstat struct { + // Props contains the properties for which Status applies. + Props []Property + + // Status defines the HTTP status code of the properties in Prop. + // Allowed values include, but are not limited to the WebDAV status + // code extensions for HTTP/1.1. + // http://www.webdav.org/specs/rfc4918.html#status.code.extensions.to.http11 + Status int + + // XMLError contains the XML representation of the optional error element. + // XML content within this field must not rely on any predefined + // namespace declarations or prefixes. If empty, the XML error element + // is omitted. + XMLError string + + // ResponseDescription contains the contents of the optional + // responsedescription field. If empty, the XML element is omitted. + ResponseDescription string +} + +// makePropstats returns a slice containing those of x and y whose Props slice +// is non-empty. If both are empty, it returns a slice containing an otherwise +// zero Propstat whose HTTP status code is 200 OK. +func makePropstats(x, y Propstat) []Propstat { + pstats := make([]Propstat, 0, 2) + if len(x.Props) != 0 { + pstats = append(pstats, x) + } + if len(y.Props) != 0 { + pstats = append(pstats, y) + } + if len(pstats) == 0 { + pstats = append(pstats, Propstat{ + Status: http.StatusOK, + }) + } + return pstats +} + +// DeadPropsHolder holds the dead properties of a resource. +// +// Dead properties are those properties that are explicitly defined. In +// comparison, live properties, such as DAV:getcontentlength, are implicitly +// defined by the underlying resource, and cannot be explicitly overridden or +// removed. See the Terminology section of +// http://www.webdav.org/specs/rfc4918.html#rfc.section.3 +// +// There is a whitelist of the names of live properties. This package handles +// all live properties, and will only pass non-whitelisted names to the Patch +// method of DeadPropsHolder implementations. +type DeadPropsHolder interface { + // DeadProps returns a copy of the dead properties held. + DeadProps() (map[xml.Name]Property, error) + + // Patch patches the dead properties held. + // + // Patching is atomic; either all or no patches succeed. It returns (nil, + // non-nil) if an internal server error occurred, otherwise the Propstats + // collectively contain one Property for each proposed patch Property. If + // all patches succeed, Patch returns a slice of length one and a Propstat + // element with a 200 OK HTTP status code. If none succeed, for reasons + // other than an internal server error, no Propstat has status 200 OK. + // + // For more details on when various HTTP status codes apply, see + // http://www.webdav.org/specs/rfc4918.html#PROPPATCH-status + Patch([]Proppatch) ([]Propstat, error) +} + +// liveProps contains all supported, protected DAV: properties. +var liveProps = map[xml.Name]struct { + // findFn implements the propfind function of this property. If nil, + // it indicates a hidden property. + findFn func(FileSystem, LockSystem, string, os.FileInfo) (string, error) + // dir is true if the property applies to directories. + dir bool +}{ + xml.Name{Space: "DAV:", Local: "resourcetype"}: { + findFn: findResourceType, + dir: true, + }, + xml.Name{Space: "DAV:", Local: "displayname"}: { + findFn: findDisplayName, + dir: true, + }, + xml.Name{Space: "DAV:", Local: "getcontentlength"}: { + findFn: findContentLength, + dir: false, + }, + xml.Name{Space: "DAV:", Local: "getlastmodified"}: { + findFn: findLastModified, + dir: false, + }, + xml.Name{Space: "DAV:", Local: "creationdate"}: { + findFn: nil, + dir: false, + }, + xml.Name{Space: "DAV:", Local: "getcontentlanguage"}: { + findFn: nil, + dir: false, + }, + xml.Name{Space: "DAV:", Local: "getcontenttype"}: { + findFn: findContentType, + dir: false, + }, + xml.Name{Space: "DAV:", Local: "getetag"}: { + findFn: findETag, + // findETag implements ETag as the concatenated hex values of a file's + // modification time and size. This is not a reliable synchronization + // mechanism for directories, so we do not advertise getetag for DAV + // collections. + dir: false, + }, + + // TODO: The lockdiscovery property requires LockSystem to list the + // active locks on a resource. + xml.Name{Space: "DAV:", Local: "lockdiscovery"}: {}, + xml.Name{Space: "DAV:", Local: "supportedlock"}: { + findFn: findSupportedLock, + dir: true, + }, +} + +// TODO(nigeltao) merge props and allprop? + +// Props returns the status of the properties named pnames for resource name. +// +// Each Propstat has a unique status and each property name will only be part +// of one Propstat element. +func props(fs FileSystem, ls LockSystem, name string, pnames []xml.Name) ([]Propstat, error) { + f, err := fs.OpenFile(name, os.O_RDONLY, 0) + if err != nil { + return nil, err + } + defer f.Close() + fi, err := f.Stat() + if err != nil { + return nil, err + } + isDir := fi.IsDir() + + var deadProps map[xml.Name]Property + if dph, ok := f.(DeadPropsHolder); ok { + deadProps, err = dph.DeadProps() + if err != nil { + return nil, err + } + } + + pstatOK := Propstat{Status: http.StatusOK} + pstatNotFound := Propstat{Status: http.StatusNotFound} + for _, pn := range pnames { + // If this file has dead properties, check if they contain pn. + if dp, ok := deadProps[pn]; ok { + pstatOK.Props = append(pstatOK.Props, dp) + continue + } + // Otherwise, it must either be a live property or we don't know it. + if prop := liveProps[pn]; prop.findFn != nil && (prop.dir || !isDir) { + innerXML, err := prop.findFn(fs, ls, name, fi) + if err != nil { + return nil, err + } + pstatOK.Props = append(pstatOK.Props, Property{ + XMLName: pn, + InnerXML: []byte(innerXML), + }) + } else { + pstatNotFound.Props = append(pstatNotFound.Props, Property{ + XMLName: pn, + }) + } + } + return makePropstats(pstatOK, pstatNotFound), nil +} + +// Propnames returns the property names defined for resource name. +func propnames(fs FileSystem, ls LockSystem, name string) ([]xml.Name, error) { + f, err := fs.OpenFile(name, os.O_RDONLY, 0) + if err != nil { + return nil, err + } + defer f.Close() + fi, err := f.Stat() + if err != nil { + return nil, err + } + isDir := fi.IsDir() + + var deadProps map[xml.Name]Property + if dph, ok := f.(DeadPropsHolder); ok { + deadProps, err = dph.DeadProps() + if err != nil { + return nil, err + } + } + + pnames := make([]xml.Name, 0, len(liveProps)+len(deadProps)) + for pn, prop := range liveProps { + if prop.findFn != nil && (prop.dir || !isDir) { + pnames = append(pnames, pn) + } + } + for pn := range deadProps { + pnames = append(pnames, pn) + } + return pnames, nil +} + +// Allprop returns the properties defined for resource name and the properties +// named in include. +// +// Note that RFC 4918 defines 'allprop' to return the DAV: properties defined +// within the RFC plus dead properties. Other live properties should only be +// returned if they are named in 'include'. +// +// See http://www.webdav.org/specs/rfc4918.html#METHOD_PROPFIND +func allprop(fs FileSystem, ls LockSystem, name string, include []xml.Name) ([]Propstat, error) { + pnames, err := propnames(fs, ls, name) + if err != nil { + return nil, err + } + // Add names from include if they are not already covered in pnames. + nameset := make(map[xml.Name]bool) + for _, pn := range pnames { + nameset[pn] = true + } + for _, pn := range include { + if !nameset[pn] { + pnames = append(pnames, pn) + } + } + return props(fs, ls, name, pnames) +} + +// Patch patches the properties of resource name. The return values are +// constrained in the same manner as DeadPropsHolder.Patch. +func patch(fs FileSystem, ls LockSystem, name string, patches []Proppatch) ([]Propstat, error) { + conflict := false +loop: + for _, patch := range patches { + for _, p := range patch.Props { + if _, ok := liveProps[p.XMLName]; ok { + conflict = true + break loop + } + } + } + if conflict { + pstatForbidden := Propstat{ + Status: http.StatusForbidden, + XMLError: ``, + } + pstatFailedDep := Propstat{ + Status: StatusFailedDependency, + } + for _, patch := range patches { + for _, p := range patch.Props { + if _, ok := liveProps[p.XMLName]; ok { + pstatForbidden.Props = append(pstatForbidden.Props, Property{XMLName: p.XMLName}) + } else { + pstatFailedDep.Props = append(pstatFailedDep.Props, Property{XMLName: p.XMLName}) + } + } + } + return makePropstats(pstatForbidden, pstatFailedDep), nil + } + + f, err := fs.OpenFile(name, os.O_RDWR, 0) + if err != nil { + return nil, err + } + defer f.Close() + if dph, ok := f.(DeadPropsHolder); ok { + ret, err := dph.Patch(patches) + if err != nil { + return nil, err + } + // http://www.webdav.org/specs/rfc4918.html#ELEMENT_propstat says that + // "The contents of the prop XML element must only list the names of + // properties to which the result in the status element applies." + for _, pstat := range ret { + for i, p := range pstat.Props { + pstat.Props[i] = Property{XMLName: p.XMLName} + } + } + return ret, nil + } + // The file doesn't implement the optional DeadPropsHolder interface, so + // all patches are forbidden. + pstat := Propstat{Status: http.StatusForbidden} + for _, patch := range patches { + for _, p := range patch.Props { + pstat.Props = append(pstat.Props, Property{XMLName: p.XMLName}) + } + } + return []Propstat{pstat}, nil +} + +func findResourceType(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + if fi.IsDir() { + return ``, nil + } + return "", nil +} + +func findDisplayName(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + if slashClean(name) == "/" { + // Hide the real name of a possibly prefixed root directory. + return "", nil + } + return fi.Name(), nil +} + +func findContentLength(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + return strconv.FormatInt(fi.Size(), 10), nil +} + +func findLastModified(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + return fi.ModTime().Format(http.TimeFormat), nil +} + +func findContentType(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + f, err := fs.OpenFile(name, os.O_RDONLY, 0) + if err != nil { + return "", err + } + defer f.Close() + // This implementation is based on serveContent's code in the standard net/http package. + ctype := mime.TypeByExtension(filepath.Ext(name)) + if ctype != "" { + return ctype, nil + } + // Read a chunk to decide between utf-8 text and binary. + var buf [512]byte + n, err := io.ReadFull(f, buf[:]) + if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF { + return "", err + } + ctype = http.DetectContentType(buf[:n]) + // Rewind file. + _, err = f.Seek(0, os.SEEK_SET) + return ctype, err +} + +func findETag(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + // The Apache http 2.4 web server by default concatenates the + // modification time and size of a file. We replicate the heuristic + // with nanosecond granularity. + return fmt.Sprintf(`"%x%x"`, fi.ModTime().UnixNano(), fi.Size()), nil +} + +func findSupportedLock(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + return `` + + `` + + `` + + `` + + ``, nil +} diff --git a/vendor/golang.org/x/net/webdav/prop_test.go b/vendor/golang.org/x/net/webdav/prop_test.go new file mode 100644 index 0000000000..ad4ec5b126 --- /dev/null +++ b/vendor/golang.org/x/net/webdav/prop_test.go @@ -0,0 +1,607 @@ +// 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 webdav + +import ( + "fmt" + "net/http" + "os" + "reflect" + "sort" + "testing" + + "golang.org/x/net/webdav/internal/xml" +) + +func TestMemPS(t *testing.T) { + // calcProps calculates the getlastmodified and getetag DAV: property + // values in pstats for resource name in file-system fs. + calcProps := func(name string, fs FileSystem, ls LockSystem, pstats []Propstat) error { + fi, err := fs.Stat(name) + if err != nil { + return err + } + for _, pst := range pstats { + for i, p := range pst.Props { + switch p.XMLName { + case xml.Name{Space: "DAV:", Local: "getlastmodified"}: + p.InnerXML = []byte(fi.ModTime().Format(http.TimeFormat)) + pst.Props[i] = p + case xml.Name{Space: "DAV:", Local: "getetag"}: + if fi.IsDir() { + continue + } + etag, err := findETag(fs, ls, name, fi) + if err != nil { + return err + } + p.InnerXML = []byte(etag) + pst.Props[i] = p + } + } + } + return nil + } + + const ( + lockEntry = `` + + `` + + `` + + `` + + `` + statForbiddenError = `` + ) + + type propOp struct { + op string + name string + pnames []xml.Name + patches []Proppatch + wantPnames []xml.Name + wantPropstats []Propstat + } + + testCases := []struct { + desc string + noDeadProps bool + buildfs []string + propOp []propOp + }{{ + desc: "propname", + buildfs: []string{"mkdir /dir", "touch /file"}, + propOp: []propOp{{ + op: "propname", + name: "/dir", + wantPnames: []xml.Name{ + xml.Name{Space: "DAV:", Local: "resourcetype"}, + xml.Name{Space: "DAV:", Local: "displayname"}, + xml.Name{Space: "DAV:", Local: "supportedlock"}, + }, + }, { + op: "propname", + name: "/file", + wantPnames: []xml.Name{ + xml.Name{Space: "DAV:", Local: "resourcetype"}, + xml.Name{Space: "DAV:", Local: "displayname"}, + xml.Name{Space: "DAV:", Local: "getcontentlength"}, + xml.Name{Space: "DAV:", Local: "getlastmodified"}, + xml.Name{Space: "DAV:", Local: "getcontenttype"}, + xml.Name{Space: "DAV:", Local: "getetag"}, + xml.Name{Space: "DAV:", Local: "supportedlock"}, + }, + }}, + }, { + desc: "allprop dir and file", + buildfs: []string{"mkdir /dir", "write /file foobarbaz"}, + propOp: []propOp{{ + op: "allprop", + name: "/dir", + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, + InnerXML: []byte(``), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, + InnerXML: []byte("dir"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "supportedlock"}, + InnerXML: []byte(lockEntry), + }}, + }}, + }, { + op: "allprop", + name: "/file", + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, + InnerXML: []byte(""), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, + InnerXML: []byte("file"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getcontentlength"}, + InnerXML: []byte("9"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getlastmodified"}, + InnerXML: nil, // Calculated during test. + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getcontenttype"}, + InnerXML: []byte("text/plain; charset=utf-8"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, + InnerXML: nil, // Calculated during test. + }, { + XMLName: xml.Name{Space: "DAV:", Local: "supportedlock"}, + InnerXML: []byte(lockEntry), + }}, + }}, + }, { + op: "allprop", + name: "/file", + pnames: []xml.Name{ + {"DAV:", "resourcetype"}, + {"foo", "bar"}, + }, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, + InnerXML: []byte(""), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, + InnerXML: []byte("file"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getcontentlength"}, + InnerXML: []byte("9"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getlastmodified"}, + InnerXML: nil, // Calculated during test. + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getcontenttype"}, + InnerXML: []byte("text/plain; charset=utf-8"), + }, { + XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, + InnerXML: nil, // Calculated during test. + }, { + XMLName: xml.Name{Space: "DAV:", Local: "supportedlock"}, + InnerXML: []byte(lockEntry), + }}}, { + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}}, + }, + }}, + }, { + desc: "propfind DAV:resourcetype", + buildfs: []string{"mkdir /dir", "touch /file"}, + propOp: []propOp{{ + op: "propfind", + name: "/dir", + pnames: []xml.Name{{"DAV:", "resourcetype"}}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, + InnerXML: []byte(``), + }}, + }}, + }, { + op: "propfind", + name: "/file", + pnames: []xml.Name{{"DAV:", "resourcetype"}}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, + InnerXML: []byte(""), + }}, + }}, + }}, + }, { + desc: "propfind unsupported DAV properties", + buildfs: []string{"mkdir /dir"}, + propOp: []propOp{{ + op: "propfind", + name: "/dir", + pnames: []xml.Name{{"DAV:", "getcontentlanguage"}}, + wantPropstats: []Propstat{{ + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "getcontentlanguage"}, + }}, + }}, + }, { + op: "propfind", + name: "/dir", + pnames: []xml.Name{{"DAV:", "creationdate"}}, + wantPropstats: []Propstat{{ + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "creationdate"}, + }}, + }}, + }}, + }, { + desc: "propfind getetag for files but not for directories", + buildfs: []string{"mkdir /dir", "touch /file"}, + propOp: []propOp{{ + op: "propfind", + name: "/dir", + pnames: []xml.Name{{"DAV:", "getetag"}}, + wantPropstats: []Propstat{{ + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, + }}, + }}, + }, { + op: "propfind", + name: "/file", + pnames: []xml.Name{{"DAV:", "getetag"}}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, + InnerXML: nil, // Calculated during test. + }}, + }}, + }}, + }, { + desc: "proppatch property on no-dead-properties file system", + buildfs: []string{"mkdir /dir"}, + noDeadProps: true, + propOp: []propOp{{ + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusForbidden, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }, { + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusForbidden, + XMLError: statForbiddenError, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, + }}, + }}, + }}, + }, { + desc: "proppatch dead property", + buildfs: []string{"mkdir /dir"}, + propOp: []propOp{{ + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + InnerXML: []byte("baz"), + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }, { + op: "propfind", + name: "/dir", + pnames: []xml.Name{{Space: "foo", Local: "bar"}}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + InnerXML: []byte("baz"), + }}, + }}, + }}, + }, { + desc: "proppatch dead property with failed dependency", + buildfs: []string{"mkdir /dir"}, + propOp: []propOp{{ + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + InnerXML: []byte("baz"), + }}, + }, { + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, + InnerXML: []byte("xxx"), + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusForbidden, + XMLError: statForbiddenError, + Props: []Property{{ + XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, + }}, + }, { + Status: StatusFailedDependency, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }, { + op: "propfind", + name: "/dir", + pnames: []xml.Name{{Space: "foo", Local: "bar"}}, + wantPropstats: []Propstat{{ + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }}, + }, { + desc: "proppatch remove dead property", + buildfs: []string{"mkdir /dir"}, + propOp: []propOp{{ + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + InnerXML: []byte("baz"), + }, { + XMLName: xml.Name{Space: "spam", Local: "ham"}, + InnerXML: []byte("eggs"), + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }, { + XMLName: xml.Name{Space: "spam", Local: "ham"}, + }}, + }}, + }, { + op: "propfind", + name: "/dir", + pnames: []xml.Name{ + {Space: "foo", Local: "bar"}, + {Space: "spam", Local: "ham"}, + }, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + InnerXML: []byte("baz"), + }, { + XMLName: xml.Name{Space: "spam", Local: "ham"}, + InnerXML: []byte("eggs"), + }}, + }}, + }, { + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Remove: true, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }, { + op: "propfind", + name: "/dir", + pnames: []xml.Name{ + {Space: "foo", Local: "bar"}, + {Space: "spam", Local: "ham"}, + }, + wantPropstats: []Propstat{{ + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }, { + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "spam", Local: "ham"}, + InnerXML: []byte("eggs"), + }}, + }}, + }}, + }, { + desc: "propname with dead property", + buildfs: []string{"touch /file"}, + propOp: []propOp{{ + op: "proppatch", + name: "/file", + patches: []Proppatch{{ + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + InnerXML: []byte("baz"), + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }, { + op: "propname", + name: "/file", + wantPnames: []xml.Name{ + xml.Name{Space: "DAV:", Local: "resourcetype"}, + xml.Name{Space: "DAV:", Local: "displayname"}, + xml.Name{Space: "DAV:", Local: "getcontentlength"}, + xml.Name{Space: "DAV:", Local: "getlastmodified"}, + xml.Name{Space: "DAV:", Local: "getcontenttype"}, + xml.Name{Space: "DAV:", Local: "getetag"}, + xml.Name{Space: "DAV:", Local: "supportedlock"}, + xml.Name{Space: "foo", Local: "bar"}, + }, + }}, + }, { + desc: "proppatch remove unknown dead property", + buildfs: []string{"mkdir /dir"}, + propOp: []propOp{{ + op: "proppatch", + name: "/dir", + patches: []Proppatch{{ + Remove: true, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + wantPropstats: []Propstat{{ + Status: http.StatusOK, + Props: []Property{{ + XMLName: xml.Name{Space: "foo", Local: "bar"}, + }}, + }}, + }}, + }, { + desc: "bad: propfind unknown property", + buildfs: []string{"mkdir /dir"}, + propOp: []propOp{{ + op: "propfind", + name: "/dir", + pnames: []xml.Name{{"foo:", "bar"}}, + wantPropstats: []Propstat{{ + Status: http.StatusNotFound, + Props: []Property{{ + XMLName: xml.Name{Space: "foo:", Local: "bar"}, + }}, + }}, + }}, + }} + + for _, tc := range testCases { + fs, err := buildTestFS(tc.buildfs) + if err != nil { + t.Fatalf("%s: cannot create test filesystem: %v", tc.desc, err) + } + if tc.noDeadProps { + fs = noDeadPropsFS{fs} + } + ls := NewMemLS() + for _, op := range tc.propOp { + desc := fmt.Sprintf("%s: %s %s", tc.desc, op.op, op.name) + if err = calcProps(op.name, fs, ls, op.wantPropstats); err != nil { + t.Fatalf("%s: calcProps: %v", desc, err) + } + + // Call property system. + var propstats []Propstat + switch op.op { + case "propname": + pnames, err := propnames(fs, ls, op.name) + if err != nil { + t.Errorf("%s: got error %v, want nil", desc, err) + continue + } + sort.Sort(byXMLName(pnames)) + sort.Sort(byXMLName(op.wantPnames)) + if !reflect.DeepEqual(pnames, op.wantPnames) { + t.Errorf("%s: pnames\ngot %q\nwant %q", desc, pnames, op.wantPnames) + } + continue + case "allprop": + propstats, err = allprop(fs, ls, op.name, op.pnames) + case "propfind": + propstats, err = props(fs, ls, op.name, op.pnames) + case "proppatch": + propstats, err = patch(fs, ls, op.name, op.patches) + default: + t.Fatalf("%s: %s not implemented", desc, op.op) + } + if err != nil { + t.Errorf("%s: got error %v, want nil", desc, err) + continue + } + // Compare return values from allprop, propfind or proppatch. + for _, pst := range propstats { + sort.Sort(byPropname(pst.Props)) + } + for _, pst := range op.wantPropstats { + sort.Sort(byPropname(pst.Props)) + } + sort.Sort(byStatus(propstats)) + sort.Sort(byStatus(op.wantPropstats)) + if !reflect.DeepEqual(propstats, op.wantPropstats) { + t.Errorf("%s: propstat\ngot %q\nwant %q", desc, propstats, op.wantPropstats) + } + } + } +} + +func cmpXMLName(a, b xml.Name) bool { + if a.Space != b.Space { + return a.Space < b.Space + } + return a.Local < b.Local +} + +type byXMLName []xml.Name + +func (b byXMLName) Len() int { return len(b) } +func (b byXMLName) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b byXMLName) Less(i, j int) bool { return cmpXMLName(b[i], b[j]) } + +type byPropname []Property + +func (b byPropname) Len() int { return len(b) } +func (b byPropname) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b byPropname) Less(i, j int) bool { return cmpXMLName(b[i].XMLName, b[j].XMLName) } + +type byStatus []Propstat + +func (b byStatus) Len() int { return len(b) } +func (b byStatus) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b byStatus) Less(i, j int) bool { return b[i].Status < b[j].Status } + +type noDeadPropsFS struct { + FileSystem +} + +func (fs noDeadPropsFS) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + f, err := fs.FileSystem.OpenFile(name, flag, perm) + if err != nil { + return nil, err + } + return noDeadPropsFile{f}, nil +} + +// noDeadPropsFile wraps a File but strips any optional DeadPropsHolder methods +// provided by the underlying File implementation. +type noDeadPropsFile struct { + f File +} + +func (f noDeadPropsFile) Close() error { return f.f.Close() } +func (f noDeadPropsFile) Read(p []byte) (int, error) { return f.f.Read(p) } +func (f noDeadPropsFile) Readdir(count int) ([]os.FileInfo, error) { return f.f.Readdir(count) } +func (f noDeadPropsFile) Seek(off int64, whence int) (int64, error) { return f.f.Seek(off, whence) } +func (f noDeadPropsFile) Stat() (os.FileInfo, error) { return f.f.Stat() } +func (f noDeadPropsFile) Write(p []byte) (int, error) { return f.f.Write(p) } diff --git a/vendor/golang.org/x/net/webdav/webdav.go b/vendor/golang.org/x/net/webdav/webdav.go new file mode 100644 index 0000000000..df6ef4501b --- /dev/null +++ b/vendor/golang.org/x/net/webdav/webdav.go @@ -0,0 +1,707 @@ +// 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 webdav etc etc TODO. +package webdav // import "golang.org/x/net/webdav" + +import ( + "errors" + "fmt" + "io" + "log" + "net/http" + "net/url" + "os" + "path" + "runtime" + "strings" + "time" +) + +// Package webdav's XML output requires the standard library's encoding/xml +// package version 1.5 or greater. Otherwise, it will produce malformed XML. +// +// As of May 2015, the Go stable release is version 1.4, so we print a message +// to let users know that this golang.org/x/etc package won't work yet. +// +// This package also won't work with Go 1.3 and earlier, but making this +// runtime version check catch all the earlier versions too, and not just +// "1.4.x", isn't worth the complexity. +// +// TODO: delete this check at some point after Go 1.5 is released. +var go1Dot4 = strings.HasPrefix(runtime.Version(), "go1.4.") + +func init() { + if go1Dot4 { + log.Println("package webdav requires Go version 1.5 or greater") + } +} + +type Handler struct { + // Prefix is the URL path prefix to strip from WebDAV resource paths. + Prefix string + // FileSystem is the virtual file system. + FileSystem FileSystem + // LockSystem is the lock management system. + LockSystem LockSystem + // Logger is an optional error logger. If non-nil, it will be called + // for all HTTP requests. + Logger func(*http.Request, error) +} + +func (h *Handler) stripPrefix(p string) (string, int, error) { + if h.Prefix == "" { + return p, http.StatusOK, nil + } + if r := strings.TrimPrefix(p, h.Prefix); len(r) < len(p) { + return r, http.StatusOK, nil + } + return p, http.StatusNotFound, errPrefixMismatch +} + +func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + status, err := http.StatusBadRequest, errUnsupportedMethod + if h.FileSystem == nil { + status, err = http.StatusInternalServerError, errNoFileSystem + } else if h.LockSystem == nil { + status, err = http.StatusInternalServerError, errNoLockSystem + } else { + switch r.Method { + case "OPTIONS": + status, err = h.handleOptions(w, r) + case "GET", "HEAD", "POST": + status, err = h.handleGetHeadPost(w, r) + case "DELETE": + status, err = h.handleDelete(w, r) + case "PUT": + status, err = h.handlePut(w, r) + case "MKCOL": + status, err = h.handleMkcol(w, r) + case "COPY", "MOVE": + status, err = h.handleCopyMove(w, r) + case "LOCK": + status, err = h.handleLock(w, r) + case "UNLOCK": + status, err = h.handleUnlock(w, r) + case "PROPFIND": + status, err = h.handlePropfind(w, r) + case "PROPPATCH": + status, err = h.handleProppatch(w, r) + } + } + + if status != 0 { + w.WriteHeader(status) + if status != http.StatusNoContent { + w.Write([]byte(StatusText(status))) + } + } + if h.Logger != nil { + h.Logger(r, err) + } +} + +func (h *Handler) lock(now time.Time, root string) (token string, status int, err error) { + token, err = h.LockSystem.Create(now, LockDetails{ + Root: root, + Duration: infiniteTimeout, + ZeroDepth: true, + }) + if err != nil { + if err == ErrLocked { + return "", StatusLocked, err + } + return "", http.StatusInternalServerError, err + } + return token, 0, nil +} + +func (h *Handler) confirmLocks(r *http.Request, src, dst string) (release func(), status int, err error) { + hdr := r.Header.Get("If") + if hdr == "" { + // An empty If header means that the client hasn't previously created locks. + // Even if this client doesn't care about locks, we still need to check that + // the resources aren't locked by another client, so we create temporary + // locks that would conflict with another client's locks. These temporary + // locks are unlocked at the end of the HTTP request. + now, srcToken, dstToken := time.Now(), "", "" + if src != "" { + srcToken, status, err = h.lock(now, src) + if err != nil { + return nil, status, err + } + } + if dst != "" { + dstToken, status, err = h.lock(now, dst) + if err != nil { + if srcToken != "" { + h.LockSystem.Unlock(now, srcToken) + } + return nil, status, err + } + } + + return func() { + if dstToken != "" { + h.LockSystem.Unlock(now, dstToken) + } + if srcToken != "" { + h.LockSystem.Unlock(now, srcToken) + } + }, 0, nil + } + + ih, ok := parseIfHeader(hdr) + if !ok { + return nil, http.StatusBadRequest, errInvalidIfHeader + } + // ih is a disjunction (OR) of ifLists, so any ifList will do. + for _, l := range ih.lists { + lsrc := l.resourceTag + if lsrc == "" { + lsrc = src + } else { + u, err := url.Parse(lsrc) + if err != nil { + continue + } + if u.Host != r.Host { + continue + } + lsrc = u.Path + } + release, err = h.LockSystem.Confirm(time.Now(), lsrc, dst, l.conditions...) + if err == ErrConfirmationFailed { + continue + } + if err != nil { + return nil, http.StatusInternalServerError, err + } + return release, 0, nil + } + // Section 10.4.1 says that "If this header is evaluated and all state lists + // fail, then the request must fail with a 412 (Precondition Failed) status." + // We follow the spec even though the cond_put_corrupt_token test case from + // the litmus test warns on seeing a 412 instead of a 423 (Locked). + return nil, http.StatusPreconditionFailed, ErrLocked +} + +func (h *Handler) handleOptions(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + allow := "OPTIONS, LOCK, PUT, MKCOL" + if fi, err := h.FileSystem.Stat(reqPath); err == nil { + if fi.IsDir() { + allow = "OPTIONS, LOCK, DELETE, PROPPATCH, COPY, MOVE, UNLOCK, PROPFIND" + } else { + allow = "OPTIONS, LOCK, GET, HEAD, POST, DELETE, PROPPATCH, COPY, MOVE, UNLOCK, PROPFIND, PUT" + } + } + w.Header().Set("Allow", allow) + // http://www.webdav.org/specs/rfc4918.html#dav.compliance.classes + w.Header().Set("DAV", "1, 2") + // http://msdn.microsoft.com/en-au/library/cc250217.aspx + w.Header().Set("MS-Author-Via", "DAV") + return 0, nil +} + +func (h *Handler) handleGetHeadPost(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + // TODO: check locks for read-only access?? + f, err := h.FileSystem.OpenFile(reqPath, os.O_RDONLY, 0) + if err != nil { + return http.StatusNotFound, err + } + defer f.Close() + fi, err := f.Stat() + if err != nil { + return http.StatusNotFound, err + } + if fi.IsDir() { + return http.StatusMethodNotAllowed, nil + } + etag, err := findETag(h.FileSystem, h.LockSystem, reqPath, fi) + if err != nil { + return http.StatusInternalServerError, err + } + w.Header().Set("ETag", etag) + // Let ServeContent determine the Content-Type header. + http.ServeContent(w, r, reqPath, fi.ModTime(), f) + return 0, nil +} + +func (h *Handler) handleDelete(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + release, status, err := h.confirmLocks(r, reqPath, "") + if err != nil { + return status, err + } + defer release() + + // TODO: return MultiStatus where appropriate. + + // "godoc os RemoveAll" says that "If the path does not exist, RemoveAll + // returns nil (no error)." WebDAV semantics are that it should return a + // "404 Not Found". We therefore have to Stat before we RemoveAll. + if _, err := h.FileSystem.Stat(reqPath); err != nil { + if os.IsNotExist(err) { + return http.StatusNotFound, err + } + return http.StatusMethodNotAllowed, err + } + if err := h.FileSystem.RemoveAll(reqPath); err != nil { + return http.StatusMethodNotAllowed, err + } + return http.StatusNoContent, nil +} + +func (h *Handler) handlePut(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + release, status, err := h.confirmLocks(r, reqPath, "") + if err != nil { + return status, err + } + defer release() + // TODO(rost): Support the If-Match, If-None-Match headers? See bradfitz' + // comments in http.checkEtag. + + f, err := h.FileSystem.OpenFile(reqPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + return http.StatusNotFound, err + } + _, copyErr := io.Copy(f, r.Body) + fi, statErr := f.Stat() + closeErr := f.Close() + // TODO(rost): Returning 405 Method Not Allowed might not be appropriate. + if copyErr != nil { + return http.StatusMethodNotAllowed, copyErr + } + if statErr != nil { + return http.StatusMethodNotAllowed, statErr + } + if closeErr != nil { + return http.StatusMethodNotAllowed, closeErr + } + etag, err := findETag(h.FileSystem, h.LockSystem, reqPath, fi) + if err != nil { + return http.StatusInternalServerError, err + } + w.Header().Set("ETag", etag) + return http.StatusCreated, nil +} + +func (h *Handler) handleMkcol(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + release, status, err := h.confirmLocks(r, reqPath, "") + if err != nil { + return status, err + } + defer release() + + if r.ContentLength > 0 { + return http.StatusUnsupportedMediaType, nil + } + if err := h.FileSystem.Mkdir(reqPath, 0777); err != nil { + if os.IsNotExist(err) { + return http.StatusConflict, err + } + return http.StatusMethodNotAllowed, err + } + return http.StatusCreated, nil +} + +func (h *Handler) handleCopyMove(w http.ResponseWriter, r *http.Request) (status int, err error) { + hdr := r.Header.Get("Destination") + if hdr == "" { + return http.StatusBadRequest, errInvalidDestination + } + u, err := url.Parse(hdr) + if err != nil { + return http.StatusBadRequest, errInvalidDestination + } + if u.Host != r.Host { + return http.StatusBadGateway, errInvalidDestination + } + + src, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + + dst, status, err := h.stripPrefix(u.Path) + if err != nil { + return status, err + } + + if dst == "" { + return http.StatusBadGateway, errInvalidDestination + } + if dst == src { + return http.StatusForbidden, errDestinationEqualsSource + } + + if r.Method == "COPY" { + // Section 7.5.1 says that a COPY only needs to lock the destination, + // not both destination and source. Strictly speaking, this is racy, + // even though a COPY doesn't modify the source, if a concurrent + // operation modifies the source. However, the litmus test explicitly + // checks that COPYing a locked-by-another source is OK. + release, status, err := h.confirmLocks(r, "", dst) + if err != nil { + return status, err + } + defer release() + + // Section 9.8.3 says that "The COPY method on a collection without a Depth + // header must act as if a Depth header with value "infinity" was included". + depth := infiniteDepth + if hdr := r.Header.Get("Depth"); hdr != "" { + depth = parseDepth(hdr) + if depth != 0 && depth != infiniteDepth { + // Section 9.8.3 says that "A client may submit a Depth header on a + // COPY on a collection with a value of "0" or "infinity"." + return http.StatusBadRequest, errInvalidDepth + } + } + return copyFiles(h.FileSystem, src, dst, r.Header.Get("Overwrite") != "F", depth, 0) + } + + release, status, err := h.confirmLocks(r, src, dst) + if err != nil { + return status, err + } + defer release() + + // Section 9.9.2 says that "The MOVE method on a collection must act as if + // a "Depth: infinity" header was used on it. A client must not submit a + // Depth header on a MOVE on a collection with any value but "infinity"." + if hdr := r.Header.Get("Depth"); hdr != "" { + if parseDepth(hdr) != infiniteDepth { + return http.StatusBadRequest, errInvalidDepth + } + } + return moveFiles(h.FileSystem, src, dst, r.Header.Get("Overwrite") == "T") +} + +func (h *Handler) handleLock(w http.ResponseWriter, r *http.Request) (retStatus int, retErr error) { + duration, err := parseTimeout(r.Header.Get("Timeout")) + if err != nil { + return http.StatusBadRequest, err + } + li, status, err := readLockInfo(r.Body) + if err != nil { + return status, err + } + + token, ld, now, created := "", LockDetails{}, time.Now(), false + if li == (lockInfo{}) { + // An empty lockInfo means to refresh the lock. + ih, ok := parseIfHeader(r.Header.Get("If")) + if !ok { + return http.StatusBadRequest, errInvalidIfHeader + } + if len(ih.lists) == 1 && len(ih.lists[0].conditions) == 1 { + token = ih.lists[0].conditions[0].Token + } + if token == "" { + return http.StatusBadRequest, errInvalidLockToken + } + ld, err = h.LockSystem.Refresh(now, token, duration) + if err != nil { + if err == ErrNoSuchLock { + return http.StatusPreconditionFailed, err + } + return http.StatusInternalServerError, err + } + + } else { + // Section 9.10.3 says that "If no Depth header is submitted on a LOCK request, + // then the request MUST act as if a "Depth:infinity" had been submitted." + depth := infiniteDepth + if hdr := r.Header.Get("Depth"); hdr != "" { + depth = parseDepth(hdr) + if depth != 0 && depth != infiniteDepth { + // Section 9.10.3 says that "Values other than 0 or infinity must not be + // used with the Depth header on a LOCK method". + return http.StatusBadRequest, errInvalidDepth + } + } + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + ld = LockDetails{ + Root: reqPath, + Duration: duration, + OwnerXML: li.Owner.InnerXML, + ZeroDepth: depth == 0, + } + token, err = h.LockSystem.Create(now, ld) + if err != nil { + if err == ErrLocked { + return StatusLocked, err + } + return http.StatusInternalServerError, err + } + defer func() { + if retErr != nil { + h.LockSystem.Unlock(now, token) + } + }() + + // Create the resource if it didn't previously exist. + if _, err := h.FileSystem.Stat(reqPath); err != nil { + f, err := h.FileSystem.OpenFile(reqPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if err != nil { + // TODO: detect missing intermediate dirs and return http.StatusConflict? + return http.StatusInternalServerError, err + } + f.Close() + created = true + } + + // http://www.webdav.org/specs/rfc4918.html#HEADER_Lock-Token says that the + // Lock-Token value is a Coded-URL. We add angle brackets. + w.Header().Set("Lock-Token", "<"+token+">") + } + + w.Header().Set("Content-Type", "application/xml; charset=utf-8") + if created { + // This is "w.WriteHeader(http.StatusCreated)" and not "return + // http.StatusCreated, nil" because we write our own (XML) response to w + // and Handler.ServeHTTP would otherwise write "Created". + w.WriteHeader(http.StatusCreated) + } + writeLockInfo(w, token, ld) + return 0, nil +} + +func (h *Handler) handleUnlock(w http.ResponseWriter, r *http.Request) (status int, err error) { + // http://www.webdav.org/specs/rfc4918.html#HEADER_Lock-Token says that the + // Lock-Token value is a Coded-URL. We strip its angle brackets. + t := r.Header.Get("Lock-Token") + if len(t) < 2 || t[0] != '<' || t[len(t)-1] != '>' { + return http.StatusBadRequest, errInvalidLockToken + } + t = t[1 : len(t)-1] + + switch err = h.LockSystem.Unlock(time.Now(), t); err { + case nil: + return http.StatusNoContent, err + case ErrForbidden: + return http.StatusForbidden, err + case ErrLocked: + return StatusLocked, err + case ErrNoSuchLock: + return http.StatusConflict, err + default: + return http.StatusInternalServerError, err + } +} + +func (h *Handler) handlePropfind(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + fi, err := h.FileSystem.Stat(reqPath) + if err != nil { + if os.IsNotExist(err) { + return http.StatusNotFound, err + } + return http.StatusMethodNotAllowed, err + } + depth := infiniteDepth + if hdr := r.Header.Get("Depth"); hdr != "" { + depth = parseDepth(hdr) + if depth == invalidDepth { + return http.StatusBadRequest, errInvalidDepth + } + } + pf, status, err := readPropfind(r.Body) + if err != nil { + return status, err + } + + mw := multistatusWriter{w: w} + + walkFn := func(reqPath string, info os.FileInfo, err error) error { + if err != nil { + return err + } + var pstats []Propstat + if pf.Propname != nil { + pnames, err := propnames(h.FileSystem, h.LockSystem, reqPath) + if err != nil { + return err + } + pstat := Propstat{Status: http.StatusOK} + for _, xmlname := range pnames { + pstat.Props = append(pstat.Props, Property{XMLName: xmlname}) + } + pstats = append(pstats, pstat) + } else if pf.Allprop != nil { + pstats, err = allprop(h.FileSystem, h.LockSystem, reqPath, pf.Prop) + } else { + pstats, err = props(h.FileSystem, h.LockSystem, reqPath, pf.Prop) + } + if err != nil { + return err + } + return mw.write(makePropstatResponse(path.Join(h.Prefix, reqPath), pstats)) + } + + walkErr := walkFS(h.FileSystem, depth, reqPath, fi, walkFn) + closeErr := mw.close() + if walkErr != nil { + return http.StatusInternalServerError, walkErr + } + if closeErr != nil { + return http.StatusInternalServerError, closeErr + } + return 0, nil +} + +func (h *Handler) handleProppatch(w http.ResponseWriter, r *http.Request) (status int, err error) { + reqPath, status, err := h.stripPrefix(r.URL.Path) + if err != nil { + return status, err + } + release, status, err := h.confirmLocks(r, reqPath, "") + if err != nil { + return status, err + } + defer release() + + if _, err := h.FileSystem.Stat(reqPath); err != nil { + if os.IsNotExist(err) { + return http.StatusNotFound, err + } + return http.StatusMethodNotAllowed, err + } + patches, status, err := readProppatch(r.Body) + if err != nil { + return status, err + } + pstats, err := patch(h.FileSystem, h.LockSystem, reqPath, patches) + if err != nil { + return http.StatusInternalServerError, err + } + mw := multistatusWriter{w: w} + writeErr := mw.write(makePropstatResponse(r.URL.Path, pstats)) + closeErr := mw.close() + if writeErr != nil { + return http.StatusInternalServerError, writeErr + } + if closeErr != nil { + return http.StatusInternalServerError, closeErr + } + return 0, nil +} + +func makePropstatResponse(href string, pstats []Propstat) *response { + resp := response{ + Href: []string{(&url.URL{Path: href}).EscapedPath()}, + Propstat: make([]propstat, 0, len(pstats)), + } + for _, p := range pstats { + var xmlErr *xmlError + if p.XMLError != "" { + xmlErr = &xmlError{InnerXML: []byte(p.XMLError)} + } + resp.Propstat = append(resp.Propstat, propstat{ + Status: fmt.Sprintf("HTTP/1.1 %d %s", p.Status, StatusText(p.Status)), + Prop: p.Props, + ResponseDescription: p.ResponseDescription, + Error: xmlErr, + }) + } + return &resp +} + +const ( + infiniteDepth = -1 + invalidDepth = -2 +) + +// parseDepth maps the strings "0", "1" and "infinity" to 0, 1 and +// infiniteDepth. Parsing any other string returns invalidDepth. +// +// Different WebDAV methods have further constraints on valid depths: +// - PROPFIND has no further restrictions, as per section 9.1. +// - COPY accepts only "0" or "infinity", as per section 9.8.3. +// - MOVE accepts only "infinity", as per section 9.9.2. +// - LOCK accepts only "0" or "infinity", as per section 9.10.3. +// These constraints are enforced by the handleXxx methods. +func parseDepth(s string) int { + switch s { + case "0": + return 0 + case "1": + return 1 + case "infinity": + return infiniteDepth + } + return invalidDepth +} + +// http://www.webdav.org/specs/rfc4918.html#status.code.extensions.to.http11 +const ( + StatusMulti = 207 + StatusUnprocessableEntity = 422 + StatusLocked = 423 + StatusFailedDependency = 424 + StatusInsufficientStorage = 507 +) + +func StatusText(code int) string { + switch code { + case StatusMulti: + return "Multi-Status" + case StatusUnprocessableEntity: + return "Unprocessable Entity" + case StatusLocked: + return "Locked" + case StatusFailedDependency: + return "Failed Dependency" + case StatusInsufficientStorage: + return "Insufficient Storage" + } + return http.StatusText(code) +} + +var ( + errDestinationEqualsSource = errors.New("webdav: destination equals source") + errDirectoryNotEmpty = errors.New("webdav: directory not empty") + errInvalidDepth = errors.New("webdav: invalid depth") + errInvalidDestination = errors.New("webdav: invalid destination") + errInvalidIfHeader = errors.New("webdav: invalid If header") + errInvalidLockInfo = errors.New("webdav: invalid lock info") + errInvalidLockToken = errors.New("webdav: invalid lock token") + errInvalidPropfind = errors.New("webdav: invalid propfind") + errInvalidProppatch = errors.New("webdav: invalid proppatch") + errInvalidResponse = errors.New("webdav: invalid response") + errInvalidTimeout = errors.New("webdav: invalid timeout") + errNoFileSystem = errors.New("webdav: no file system") + errNoLockSystem = errors.New("webdav: no lock system") + errNotADirectory = errors.New("webdav: not a directory") + errPrefixMismatch = errors.New("webdav: prefix mismatch") + errRecursionTooDeep = errors.New("webdav: recursion too deep") + errUnsupportedLockInfo = errors.New("webdav: unsupported lock info") + errUnsupportedMethod = errors.New("webdav: unsupported method") +) diff --git a/vendor/golang.org/x/net/webdav/webdav_test.go b/vendor/golang.org/x/net/webdav/webdav_test.go new file mode 100644 index 0000000000..70a3bf2c79 --- /dev/null +++ b/vendor/golang.org/x/net/webdav/webdav_test.go @@ -0,0 +1,242 @@ +// 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 webdav + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/http/httptest" + "net/url" + "os" + "reflect" + "regexp" + "sort" + "strings" + "testing" +) + +// TODO: add tests to check XML responses with the expected prefix path +func TestPrefix(t *testing.T) { + const dst, blah = "Destination", "blah blah blah" + + do := func(method, urlStr string, body io.Reader, wantStatusCode int, headers ...string) error { + req, err := http.NewRequest(method, urlStr, body) + if err != nil { + return err + } + for len(headers) >= 2 { + req.Header.Add(headers[0], headers[1]) + headers = headers[2:] + } + res, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer res.Body.Close() + if res.StatusCode != wantStatusCode { + return fmt.Errorf("got status code %d, want %d", res.StatusCode, wantStatusCode) + } + return nil + } + + prefixes := []string{ + "/", + "/a/", + "/a/b/", + "/a/b/c/", + } + for _, prefix := range prefixes { + fs := NewMemFS() + h := &Handler{ + FileSystem: fs, + LockSystem: NewMemLS(), + } + mux := http.NewServeMux() + if prefix != "/" { + h.Prefix = prefix + } + mux.Handle(prefix, h) + srv := httptest.NewServer(mux) + defer srv.Close() + + // The script is: + // MKCOL /a + // MKCOL /a/b + // PUT /a/b/c + // COPY /a/b/c /a/b/d + // MKCOL /a/b/e + // MOVE /a/b/d /a/b/e/f + // which should yield the (possibly stripped) filenames /a/b/c and + // /a/b/e/f, plus their parent directories. + + wantA := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusMovedPermanently, + "/a/b/": http.StatusNotFound, + "/a/b/c/": http.StatusNotFound, + }[prefix] + if err := do("MKCOL", srv.URL+"/a", nil, wantA); err != nil { + t.Errorf("prefix=%-9q MKCOL /a: %v", prefix, err) + continue + } + + wantB := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusMovedPermanently, + "/a/b/c/": http.StatusNotFound, + }[prefix] + if err := do("MKCOL", srv.URL+"/a/b", nil, wantB); err != nil { + t.Errorf("prefix=%-9q MKCOL /a/b: %v", prefix, err) + continue + } + + wantC := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusCreated, + "/a/b/c/": http.StatusMovedPermanently, + }[prefix] + if err := do("PUT", srv.URL+"/a/b/c", strings.NewReader(blah), wantC); err != nil { + t.Errorf("prefix=%-9q PUT /a/b/c: %v", prefix, err) + continue + } + + wantD := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusCreated, + "/a/b/c/": http.StatusMovedPermanently, + }[prefix] + if err := do("COPY", srv.URL+"/a/b/c", nil, wantD, dst, srv.URL+"/a/b/d"); err != nil { + t.Errorf("prefix=%-9q COPY /a/b/c /a/b/d: %v", prefix, err) + continue + } + + wantE := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusCreated, + "/a/b/c/": http.StatusNotFound, + }[prefix] + if err := do("MKCOL", srv.URL+"/a/b/e", nil, wantE); err != nil { + t.Errorf("prefix=%-9q MKCOL /a/b/e: %v", prefix, err) + continue + } + + wantF := map[string]int{ + "/": http.StatusCreated, + "/a/": http.StatusCreated, + "/a/b/": http.StatusCreated, + "/a/b/c/": http.StatusNotFound, + }[prefix] + if err := do("MOVE", srv.URL+"/a/b/d", nil, wantF, dst, srv.URL+"/a/b/e/f"); err != nil { + t.Errorf("prefix=%-9q MOVE /a/b/d /a/b/e/f: %v", prefix, err) + continue + } + + got, err := find(nil, fs, "/") + if err != nil { + t.Errorf("prefix=%-9q find: %v", prefix, err) + continue + } + sort.Strings(got) + want := map[string][]string{ + "/": []string{"/", "/a", "/a/b", "/a/b/c", "/a/b/e", "/a/b/e/f"}, + "/a/": []string{"/", "/b", "/b/c", "/b/e", "/b/e/f"}, + "/a/b/": []string{"/", "/c", "/e", "/e/f"}, + "/a/b/c/": []string{"/"}, + }[prefix] + if !reflect.DeepEqual(got, want) { + t.Errorf("prefix=%-9q find:\ngot %v\nwant %v", prefix, got, want) + continue + } + } +} + +func TestFilenameEscape(t *testing.T) { + re := regexp.MustCompile(`([^<]*)`) + do := func(method, urlStr string) (string, error) { + req, err := http.NewRequest(method, urlStr, nil) + if err != nil { + return "", err + } + res, err := http.DefaultClient.Do(req) + if err != nil { + return "", err + } + defer res.Body.Close() + + b, err := ioutil.ReadAll(res.Body) + if err != nil { + return "", err + } + m := re.FindStringSubmatch(string(b)) + if len(m) != 2 { + return "", errors.New("D:href not found") + } + + return m[1], nil + } + + testCases := []struct { + name, want string + }{{ + name: `/foo%bar`, + want: `/foo%25bar`, + }, { + name: `/こんにちわ世界`, + want: `/%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%82%8F%E4%B8%96%E7%95%8C`, + }, { + name: `/Program Files/`, + want: `/Program%20Files`, + }, { + name: `/go+lang`, + want: `/go+lang`, + }, { + name: `/go&lang`, + want: `/go&lang`, + }} + fs := NewMemFS() + for _, tc := range testCases { + if strings.HasSuffix(tc.name, "/") { + if err := fs.Mkdir(tc.name, 0755); err != nil { + t.Fatalf("name=%q: Mkdir: %v", tc.name, err) + } + } else { + f, err := fs.OpenFile(tc.name, os.O_CREATE, 0644) + if err != nil { + t.Fatalf("name=%q: OpenFile: %v", tc.name, err) + } + f.Close() + } + } + + srv := httptest.NewServer(&Handler{ + FileSystem: fs, + LockSystem: NewMemLS(), + }) + defer srv.Close() + + u, err := url.Parse(srv.URL) + if err != nil { + t.Fatal(err) + } + + for _, tc := range testCases { + u.Path = tc.name + got, err := do("PROPFIND", u.String()) + if err != nil { + t.Errorf("name=%q: PROPFIND: %v", tc.name, err) + continue + } + if got != tc.want { + t.Errorf("name=%q: got %q, want %q", tc.name, got, tc.want) + } + } +} diff --git a/vendor/golang.org/x/net/webdav/xml.go b/vendor/golang.org/x/net/webdav/xml.go new file mode 100644 index 0000000000..8705cda235 --- /dev/null +++ b/vendor/golang.org/x/net/webdav/xml.go @@ -0,0 +1,469 @@ +// 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 webdav + +// The XML encoding is covered by Section 14. +// http://www.webdav.org/specs/rfc4918.html#xml.element.definitions + +import ( + "bytes" + "fmt" + "io" + "net/http" + "time" + + "golang.org/x/net/webdav/internal/xml" +) + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_lockinfo +type lockInfo struct { + XMLName xml.Name `xml:"lockinfo"` + Exclusive *struct{} `xml:"lockscope>exclusive"` + Shared *struct{} `xml:"lockscope>shared"` + Write *struct{} `xml:"locktype>write"` + Owner owner `xml:"owner"` +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_owner +type owner struct { + InnerXML string `xml:",innerxml"` +} + +func readLockInfo(r io.Reader) (li lockInfo, status int, err error) { + c := &countingReader{r: r} + if err = xml.NewDecoder(c).Decode(&li); err != nil { + if err == io.EOF { + if c.n == 0 { + // An empty body means to refresh the lock. + // http://www.webdav.org/specs/rfc4918.html#refreshing-locks + return lockInfo{}, 0, nil + } + err = errInvalidLockInfo + } + return lockInfo{}, http.StatusBadRequest, err + } + // We only support exclusive (non-shared) write locks. In practice, these are + // the only types of locks that seem to matter. + if li.Exclusive == nil || li.Shared != nil || li.Write == nil { + return lockInfo{}, http.StatusNotImplemented, errUnsupportedLockInfo + } + return li, 0, nil +} + +type countingReader struct { + n int + r io.Reader +} + +func (c *countingReader) Read(p []byte) (int, error) { + n, err := c.r.Read(p) + c.n += n + return n, err +} + +func writeLockInfo(w io.Writer, token string, ld LockDetails) (int, error) { + depth := "infinity" + if ld.ZeroDepth { + depth = "0" + } + timeout := ld.Duration / time.Second + return fmt.Fprintf(w, "\n"+ + "\n"+ + " \n"+ + " \n"+ + " %s\n"+ + " %s\n"+ + " Second-%d\n"+ + " %s\n"+ + " %s\n"+ + "", + depth, ld.OwnerXML, timeout, escape(token), escape(ld.Root), + ) +} + +func escape(s string) string { + for i := 0; i < len(s); i++ { + switch s[i] { + case '"', '&', '\'', '<', '>': + b := bytes.NewBuffer(nil) + xml.EscapeText(b, []byte(s)) + return b.String() + } + } + return s +} + +// Next returns the next token, if any, in the XML stream of d. +// RFC 4918 requires to ignore comments, processing instructions +// and directives. +// http://www.webdav.org/specs/rfc4918.html#property_values +// http://www.webdav.org/specs/rfc4918.html#xml-extensibility +func next(d *xml.Decoder) (xml.Token, error) { + for { + t, err := d.Token() + if err != nil { + return t, err + } + switch t.(type) { + case xml.Comment, xml.Directive, xml.ProcInst: + continue + default: + return t, nil + } + } +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_prop (for propfind) +type propfindProps []xml.Name + +// UnmarshalXML appends the property names enclosed within start to pn. +// +// It returns an error if start does not contain any properties or if +// properties contain values. Character data between properties is ignored. +func (pn *propfindProps) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + for { + t, err := next(d) + if err != nil { + return err + } + switch t.(type) { + case xml.EndElement: + if len(*pn) == 0 { + return fmt.Errorf("%s must not be empty", start.Name.Local) + } + return nil + case xml.StartElement: + name := t.(xml.StartElement).Name + t, err = next(d) + if err != nil { + return err + } + if _, ok := t.(xml.EndElement); !ok { + return fmt.Errorf("unexpected token %T", t) + } + *pn = append(*pn, name) + } + } +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_propfind +type propfind struct { + XMLName xml.Name `xml:"DAV: propfind"` + Allprop *struct{} `xml:"DAV: allprop"` + Propname *struct{} `xml:"DAV: propname"` + Prop propfindProps `xml:"DAV: prop"` + Include propfindProps `xml:"DAV: include"` +} + +func readPropfind(r io.Reader) (pf propfind, status int, err error) { + c := countingReader{r: r} + if err = xml.NewDecoder(&c).Decode(&pf); err != nil { + if err == io.EOF { + if c.n == 0 { + // An empty body means to propfind allprop. + // http://www.webdav.org/specs/rfc4918.html#METHOD_PROPFIND + return propfind{Allprop: new(struct{})}, 0, nil + } + err = errInvalidPropfind + } + return propfind{}, http.StatusBadRequest, err + } + + if pf.Allprop == nil && pf.Include != nil { + return propfind{}, http.StatusBadRequest, errInvalidPropfind + } + if pf.Allprop != nil && (pf.Prop != nil || pf.Propname != nil) { + return propfind{}, http.StatusBadRequest, errInvalidPropfind + } + if pf.Prop != nil && pf.Propname != nil { + return propfind{}, http.StatusBadRequest, errInvalidPropfind + } + if pf.Propname == nil && pf.Allprop == nil && pf.Prop == nil { + return propfind{}, http.StatusBadRequest, errInvalidPropfind + } + return pf, 0, nil +} + +// Property represents a single DAV resource property as defined in RFC 4918. +// See http://www.webdav.org/specs/rfc4918.html#data.model.for.resource.properties +type Property struct { + // XMLName is the fully qualified name that identifies this property. + XMLName xml.Name + + // Lang is an optional xml:lang attribute. + Lang string `xml:"xml:lang,attr,omitempty"` + + // InnerXML contains the XML representation of the property value. + // See http://www.webdav.org/specs/rfc4918.html#property_values + // + // Property values of complex type or mixed-content must have fully + // expanded XML namespaces or be self-contained with according + // XML namespace declarations. They must not rely on any XML + // namespace declarations within the scope of the XML document, + // even including the DAV: namespace. + InnerXML []byte `xml:",innerxml"` +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_error +// See multistatusWriter for the "D:" namespace prefix. +type xmlError struct { + XMLName xml.Name `xml:"D:error"` + InnerXML []byte `xml:",innerxml"` +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_propstat +// See multistatusWriter for the "D:" namespace prefix. +type propstat struct { + Prop []Property `xml:"D:prop>_ignored_"` + Status string `xml:"D:status"` + Error *xmlError `xml:"D:error"` + ResponseDescription string `xml:"D:responsedescription,omitempty"` +} + +// MarshalXML prepends the "D:" namespace prefix on properties in the DAV: namespace +// before encoding. See multistatusWriter. +func (ps propstat) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + for k, prop := range ps.Prop { + if prop.XMLName.Space == "DAV:" { + prop.XMLName = xml.Name{Space: "", Local: "D:" + prop.XMLName.Local} + ps.Prop[k] = prop + } + } + // Distinct type to avoid infinite recursion of MarshalXML. + type newpropstat propstat + return e.EncodeElement(newpropstat(ps), start) +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_response +// See multistatusWriter for the "D:" namespace prefix. +type response struct { + XMLName xml.Name `xml:"D:response"` + Href []string `xml:"D:href"` + Propstat []propstat `xml:"D:propstat"` + Status string `xml:"D:status,omitempty"` + Error *xmlError `xml:"D:error"` + ResponseDescription string `xml:"D:responsedescription,omitempty"` +} + +// MultistatusWriter marshals one or more Responses into a XML +// multistatus response. +// See http://www.webdav.org/specs/rfc4918.html#ELEMENT_multistatus +// TODO(rsto, mpl): As a workaround, the "D:" namespace prefix, defined as +// "DAV:" on this element, is prepended on the nested response, as well as on all +// its nested elements. All property names in the DAV: namespace are prefixed as +// well. This is because some versions of Mini-Redirector (on windows 7) ignore +// elements with a default namespace (no prefixed namespace). A less intrusive fix +// should be possible after golang.org/cl/11074. See https://golang.org/issue/11177 +type multistatusWriter struct { + // ResponseDescription contains the optional responsedescription + // of the multistatus XML element. Only the latest content before + // close will be emitted. Empty response descriptions are not + // written. + responseDescription string + + w http.ResponseWriter + enc *xml.Encoder +} + +// Write validates and emits a DAV response as part of a multistatus response +// element. +// +// It sets the HTTP status code of its underlying http.ResponseWriter to 207 +// (Multi-Status) and populates the Content-Type header. If r is the +// first, valid response to be written, Write prepends the XML representation +// of r with a multistatus tag. Callers must call close after the last response +// has been written. +func (w *multistatusWriter) write(r *response) error { + switch len(r.Href) { + case 0: + return errInvalidResponse + case 1: + if len(r.Propstat) > 0 != (r.Status == "") { + return errInvalidResponse + } + default: + if len(r.Propstat) > 0 || r.Status == "" { + return errInvalidResponse + } + } + err := w.writeHeader() + if err != nil { + return err + } + return w.enc.Encode(r) +} + +// writeHeader writes a XML multistatus start element on w's underlying +// http.ResponseWriter and returns the result of the write operation. +// After the first write attempt, writeHeader becomes a no-op. +func (w *multistatusWriter) writeHeader() error { + if w.enc != nil { + return nil + } + w.w.Header().Add("Content-Type", "text/xml; charset=utf-8") + w.w.WriteHeader(StatusMulti) + _, err := fmt.Fprintf(w.w, ``) + if err != nil { + return err + } + w.enc = xml.NewEncoder(w.w) + return w.enc.EncodeToken(xml.StartElement{ + Name: xml.Name{ + Space: "DAV:", + Local: "multistatus", + }, + Attr: []xml.Attr{{ + Name: xml.Name{Space: "xmlns", Local: "D"}, + Value: "DAV:", + }}, + }) +} + +// Close completes the marshalling of the multistatus response. It returns +// an error if the multistatus response could not be completed. If both the +// return value and field enc of w are nil, then no multistatus response has +// been written. +func (w *multistatusWriter) close() error { + if w.enc == nil { + return nil + } + var end []xml.Token + if w.responseDescription != "" { + name := xml.Name{Space: "DAV:", Local: "responsedescription"} + end = append(end, + xml.StartElement{Name: name}, + xml.CharData(w.responseDescription), + xml.EndElement{Name: name}, + ) + } + end = append(end, xml.EndElement{ + Name: xml.Name{Space: "DAV:", Local: "multistatus"}, + }) + for _, t := range end { + err := w.enc.EncodeToken(t) + if err != nil { + return err + } + } + return w.enc.Flush() +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_prop (for proppatch) +type proppatchProps []Property + +var xmlLangName = xml.Name{Space: "http://www.w3.org/XML/1998/namespace", Local: "lang"} + +func xmlLang(s xml.StartElement, d string) string { + for _, attr := range s.Attr { + if attr.Name == xmlLangName { + return attr.Value + } + } + return d +} + +type xmlValue []byte + +func (v *xmlValue) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + // The XML value of a property can be arbitrary, mixed-content XML. + // To make sure that the unmarshalled value contains all required + // namespaces, we encode all the property value XML tokens into a + // buffer. This forces the encoder to redeclare any used namespaces. + var b bytes.Buffer + e := xml.NewEncoder(&b) + for { + t, err := next(d) + if err != nil { + return err + } + if e, ok := t.(xml.EndElement); ok && e.Name == start.Name { + break + } + if err = e.EncodeToken(t); err != nil { + return err + } + } + err := e.Flush() + if err != nil { + return err + } + *v = b.Bytes() + return nil +} + +// UnmarshalXML appends the property names and values enclosed within start +// to ps. +// +// An xml:lang attribute that is defined either on the DAV:prop or property +// name XML element is propagated to the property's Lang field. +// +// UnmarshalXML returns an error if start does not contain any properties or if +// property values contain syntactically incorrect XML. +func (ps *proppatchProps) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + lang := xmlLang(start, "") + for { + t, err := next(d) + if err != nil { + return err + } + switch elem := t.(type) { + case xml.EndElement: + if len(*ps) == 0 { + return fmt.Errorf("%s must not be empty", start.Name.Local) + } + return nil + case xml.StartElement: + p := Property{ + XMLName: t.(xml.StartElement).Name, + Lang: xmlLang(t.(xml.StartElement), lang), + } + err = d.DecodeElement(((*xmlValue)(&p.InnerXML)), &elem) + if err != nil { + return err + } + *ps = append(*ps, p) + } + } +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_set +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_remove +type setRemove struct { + XMLName xml.Name + Lang string `xml:"xml:lang,attr,omitempty"` + Prop proppatchProps `xml:"DAV: prop"` +} + +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_propertyupdate +type propertyupdate struct { + XMLName xml.Name `xml:"DAV: propertyupdate"` + Lang string `xml:"xml:lang,attr,omitempty"` + SetRemove []setRemove `xml:",any"` +} + +func readProppatch(r io.Reader) (patches []Proppatch, status int, err error) { + var pu propertyupdate + if err = xml.NewDecoder(r).Decode(&pu); err != nil { + return nil, http.StatusBadRequest, err + } + for _, op := range pu.SetRemove { + remove := false + switch op.XMLName { + case xml.Name{Space: "DAV:", Local: "set"}: + // No-op. + case xml.Name{Space: "DAV:", Local: "remove"}: + for _, p := range op.Prop { + if len(p.InnerXML) > 0 { + return nil, http.StatusBadRequest, errInvalidProppatch + } + } + remove = true + default: + return nil, http.StatusBadRequest, errInvalidProppatch + } + patches = append(patches, Proppatch{Remove: remove, Props: op.Prop}) + } + return patches, 0, nil +} diff --git a/vendor/golang.org/x/net/webdav/xml_test.go b/vendor/golang.org/x/net/webdav/xml_test.go new file mode 100644 index 0000000000..bc5641f45d --- /dev/null +++ b/vendor/golang.org/x/net/webdav/xml_test.go @@ -0,0 +1,909 @@ +// 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 webdav + +import ( + "bytes" + "fmt" + "io" + "net/http" + "net/http/httptest" + "reflect" + "sort" + "strings" + "testing" + + "golang.org/x/net/webdav/internal/xml" +) + +func TestReadLockInfo(t *testing.T) { + // The "section x.y.z" test cases come from section x.y.z of the spec at + // http://www.webdav.org/specs/rfc4918.html + testCases := []struct { + desc string + input string + wantLI lockInfo + wantStatus int + }{{ + "bad: junk", + "xxx", + lockInfo{}, + http.StatusBadRequest, + }, { + "bad: invalid owner XML", + "" + + "\n" + + " \n" + + " \n" + + " \n" + + " no end tag \n" + + " \n" + + "", + lockInfo{}, + http.StatusBadRequest, + }, { + "bad: invalid UTF-8", + "" + + "\n" + + " \n" + + " \n" + + " \n" + + " \xff \n" + + " \n" + + "", + lockInfo{}, + http.StatusBadRequest, + }, { + "bad: unfinished XML #1", + "" + + "\n" + + " \n" + + " \n", + lockInfo{}, + http.StatusBadRequest, + }, { + "bad: unfinished XML #2", + "" + + "\n" + + " \n" + + " \n" + + " \n", + lockInfo{}, + http.StatusBadRequest, + }, { + "good: empty", + "", + lockInfo{}, + 0, + }, { + "good: plain-text owner", + "" + + "\n" + + " \n" + + " \n" + + " gopher\n" + + "", + lockInfo{ + XMLName: xml.Name{Space: "DAV:", Local: "lockinfo"}, + Exclusive: new(struct{}), + Write: new(struct{}), + Owner: owner{ + InnerXML: "gopher", + }, + }, + 0, + }, { + "section 9.10.7", + "" + + "\n" + + " \n" + + " \n" + + " \n" + + " http://example.org/~ejw/contact.html\n" + + " \n" + + "", + lockInfo{ + XMLName: xml.Name{Space: "DAV:", Local: "lockinfo"}, + Exclusive: new(struct{}), + Write: new(struct{}), + Owner: owner{ + InnerXML: "\n http://example.org/~ejw/contact.html\n ", + }, + }, + 0, + }} + + for _, tc := range testCases { + li, status, err := readLockInfo(strings.NewReader(tc.input)) + if tc.wantStatus != 0 { + if err == nil { + t.Errorf("%s: got nil error, want non-nil", tc.desc) + continue + } + } else if err != nil { + t.Errorf("%s: %v", tc.desc, err) + continue + } + if !reflect.DeepEqual(li, tc.wantLI) || status != tc.wantStatus { + t.Errorf("%s:\ngot lockInfo=%v, status=%v\nwant lockInfo=%v, status=%v", + tc.desc, li, status, tc.wantLI, tc.wantStatus) + continue + } + } +} + +func TestReadPropfind(t *testing.T) { + testCases := []struct { + desc string + input string + wantPF propfind + wantStatus int + }{{ + desc: "propfind: propname", + input: "" + + "\n" + + " \n" + + "", + wantPF: propfind{ + XMLName: xml.Name{Space: "DAV:", Local: "propfind"}, + Propname: new(struct{}), + }, + }, { + desc: "propfind: empty body means allprop", + input: "", + wantPF: propfind{ + Allprop: new(struct{}), + }, + }, { + desc: "propfind: allprop", + input: "" + + "\n" + + " \n" + + "", + wantPF: propfind{ + XMLName: xml.Name{Space: "DAV:", Local: "propfind"}, + Allprop: new(struct{}), + }, + }, { + desc: "propfind: allprop followed by include", + input: "" + + "\n" + + " \n" + + " \n" + + "", + wantPF: propfind{ + XMLName: xml.Name{Space: "DAV:", Local: "propfind"}, + Allprop: new(struct{}), + Include: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, + }, + }, { + desc: "propfind: include followed by allprop", + input: "" + + "\n" + + " \n" + + " \n" + + "", + wantPF: propfind{ + XMLName: xml.Name{Space: "DAV:", Local: "propfind"}, + Allprop: new(struct{}), + Include: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, + }, + }, { + desc: "propfind: propfind", + input: "" + + "\n" + + " \n" + + "", + wantPF: propfind{ + XMLName: xml.Name{Space: "DAV:", Local: "propfind"}, + Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, + }, + }, { + desc: "propfind: prop with ignored comments", + input: "" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + "", + wantPF: propfind{ + XMLName: xml.Name{Space: "DAV:", Local: "propfind"}, + Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, + }, + }, { + desc: "propfind: propfind with ignored whitespace", + input: "" + + "\n" + + " \n" + + "", + wantPF: propfind{ + XMLName: xml.Name{Space: "DAV:", Local: "propfind"}, + Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, + }, + }, { + desc: "propfind: propfind with ignored mixed-content", + input: "" + + "\n" + + " foobar\n" + + "", + wantPF: propfind{ + XMLName: xml.Name{Space: "DAV:", Local: "propfind"}, + Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, + }, + }, { + desc: "propfind: propname with ignored element (section A.4)", + input: "" + + "\n" + + " \n" + + " *boss*\n" + + "", + wantPF: propfind{ + XMLName: xml.Name{Space: "DAV:", Local: "propfind"}, + Propname: new(struct{}), + }, + }, { + desc: "propfind: bad: junk", + input: "xxx", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: propname and allprop (section A.3)", + input: "" + + "\n" + + " " + + " " + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: propname and prop", + input: "" + + "\n" + + " \n" + + " \n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: allprop and prop", + input: "" + + "\n" + + " \n" + + " \n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: empty propfind with ignored element (section A.4)", + input: "" + + "\n" + + " \n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: empty prop", + input: "" + + "\n" + + " \n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: prop with just chardata", + input: "" + + "\n" + + " foo\n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "bad: interrupted prop", + input: "" + + "\n" + + " \n", + wantStatus: http.StatusBadRequest, + }, { + desc: "bad: malformed end element prop", + input: "" + + "\n" + + " \n", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: property with chardata value", + input: "" + + "\n" + + " bar\n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: property with whitespace value", + input: "" + + "\n" + + " \n" + + "", + wantStatus: http.StatusBadRequest, + }, { + desc: "propfind: bad: include without allprop", + input: "" + + "\n" + + " \n" + + "", + wantStatus: http.StatusBadRequest, + }} + + for _, tc := range testCases { + pf, status, err := readPropfind(strings.NewReader(tc.input)) + if tc.wantStatus != 0 { + if err == nil { + t.Errorf("%s: got nil error, want non-nil", tc.desc) + continue + } + } else if err != nil { + t.Errorf("%s: %v", tc.desc, err) + continue + } + if !reflect.DeepEqual(pf, tc.wantPF) || status != tc.wantStatus { + t.Errorf("%s:\ngot propfind=%v, status=%v\nwant propfind=%v, status=%v", + tc.desc, pf, status, tc.wantPF, tc.wantStatus) + continue + } + } +} + +func TestMultistatusWriter(t *testing.T) { + if go1Dot4 { + t.Skip("TestMultistatusWriter requires Go version 1.5 or greater") + } + + ///The "section x.y.z" test cases come from section x.y.z of the spec at + // http://www.webdav.org/specs/rfc4918.html + testCases := []struct { + desc string + responses []response + respdesc string + writeHeader bool + wantXML string + wantCode int + wantErr error + }{{ + desc: "section 9.2.2 (failed dependency)", + responses: []response{{ + Href: []string{"http://example.com/foo"}, + Propstat: []propstat{{ + Prop: []Property{{ + XMLName: xml.Name{ + Space: "http://ns.example.com/", + Local: "Authors", + }, + }}, + Status: "HTTP/1.1 424 Failed Dependency", + }, { + Prop: []Property{{ + XMLName: xml.Name{ + Space: "http://ns.example.com/", + Local: "Copyright-Owner", + }, + }}, + Status: "HTTP/1.1 409 Conflict", + }}, + ResponseDescription: "Copyright Owner cannot be deleted or altered.", + }}, + wantXML: `` + + `` + + `` + + ` ` + + ` http://example.com/foo` + + ` ` + + ` ` + + ` ` + + ` ` + + ` HTTP/1.1 424 Failed Dependency` + + ` ` + + ` ` + + ` ` + + ` ` + + ` ` + + ` HTTP/1.1 409 Conflict` + + ` ` + + ` Copyright Owner cannot be deleted or altered.` + + `` + + ``, + wantCode: StatusMulti, + }, { + desc: "section 9.6.2 (lock-token-submitted)", + responses: []response{{ + Href: []string{"http://example.com/foo"}, + Status: "HTTP/1.1 423 Locked", + Error: &xmlError{ + InnerXML: []byte(``), + }, + }}, + wantXML: `` + + `` + + `` + + ` ` + + ` http://example.com/foo` + + ` HTTP/1.1 423 Locked` + + ` ` + + ` ` + + ``, + wantCode: StatusMulti, + }, { + desc: "section 9.1.3", + responses: []response{{ + Href: []string{"http://example.com/foo"}, + Propstat: []propstat{{ + Prop: []Property{{ + XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "bigbox"}, + InnerXML: []byte(`` + + `` + + `Box type A` + + ``), + }, { + XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "author"}, + InnerXML: []byte(`` + + `` + + `J.J. Johnson` + + ``), + }}, + Status: "HTTP/1.1 200 OK", + }, { + Prop: []Property{{ + XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "DingALing"}, + }, { + XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "Random"}, + }}, + Status: "HTTP/1.1 403 Forbidden", + ResponseDescription: "The user does not have access to the DingALing property.", + }}, + }}, + respdesc: "There has been an access violation error.", + wantXML: `` + + `` + + `` + + ` ` + + ` http://example.com/foo` + + ` ` + + ` ` + + ` Box type A` + + ` J.J. Johnson` + + ` ` + + ` HTTP/1.1 200 OK` + + ` ` + + ` ` + + ` ` + + ` ` + + ` ` + + ` ` + + ` HTTP/1.1 403 Forbidden` + + ` The user does not have access to the DingALing property.` + + ` ` + + ` ` + + ` There has been an access violation error.` + + ``, + wantCode: StatusMulti, + }, { + desc: "no response written", + // default of http.responseWriter + wantCode: http.StatusOK, + }, { + desc: "no response written (with description)", + respdesc: "too bad", + // default of http.responseWriter + wantCode: http.StatusOK, + }, { + desc: "empty multistatus with header", + writeHeader: true, + wantXML: ``, + wantCode: StatusMulti, + }, { + desc: "bad: no href", + responses: []response{{ + Propstat: []propstat{{ + Prop: []Property{{ + XMLName: xml.Name{ + Space: "http://example.com/", + Local: "foo", + }, + }}, + Status: "HTTP/1.1 200 OK", + }}, + }}, + wantErr: errInvalidResponse, + // default of http.responseWriter + wantCode: http.StatusOK, + }, { + desc: "bad: multiple hrefs and no status", + responses: []response{{ + Href: []string{"http://example.com/foo", "http://example.com/bar"}, + }}, + wantErr: errInvalidResponse, + // default of http.responseWriter + wantCode: http.StatusOK, + }, { + desc: "bad: one href and no propstat", + responses: []response{{ + Href: []string{"http://example.com/foo"}, + }}, + wantErr: errInvalidResponse, + // default of http.responseWriter + wantCode: http.StatusOK, + }, { + desc: "bad: status with one href and propstat", + responses: []response{{ + Href: []string{"http://example.com/foo"}, + Propstat: []propstat{{ + Prop: []Property{{ + XMLName: xml.Name{ + Space: "http://example.com/", + Local: "foo", + }, + }}, + Status: "HTTP/1.1 200 OK", + }}, + Status: "HTTP/1.1 200 OK", + }}, + wantErr: errInvalidResponse, + // default of http.responseWriter + wantCode: http.StatusOK, + }, { + desc: "bad: multiple hrefs and propstat", + responses: []response{{ + Href: []string{ + "http://example.com/foo", + "http://example.com/bar", + }, + Propstat: []propstat{{ + Prop: []Property{{ + XMLName: xml.Name{ + Space: "http://example.com/", + Local: "foo", + }, + }}, + Status: "HTTP/1.1 200 OK", + }}, + }}, + wantErr: errInvalidResponse, + // default of http.responseWriter + wantCode: http.StatusOK, + }} + + n := xmlNormalizer{omitWhitespace: true} +loop: + for _, tc := range testCases { + rec := httptest.NewRecorder() + w := multistatusWriter{w: rec, responseDescription: tc.respdesc} + if tc.writeHeader { + if err := w.writeHeader(); err != nil { + t.Errorf("%s: got writeHeader error %v, want nil", tc.desc, err) + continue + } + } + for _, r := range tc.responses { + if err := w.write(&r); err != nil { + if err != tc.wantErr { + t.Errorf("%s: got write error %v, want %v", + tc.desc, err, tc.wantErr) + } + continue loop + } + } + if err := w.close(); err != tc.wantErr { + t.Errorf("%s: got close error %v, want %v", + tc.desc, err, tc.wantErr) + continue + } + if rec.Code != tc.wantCode { + t.Errorf("%s: got HTTP status code %d, want %d\n", + tc.desc, rec.Code, tc.wantCode) + continue + } + gotXML := rec.Body.String() + eq, err := n.equalXML(strings.NewReader(gotXML), strings.NewReader(tc.wantXML)) + if err != nil { + t.Errorf("%s: equalXML: %v", tc.desc, err) + continue + } + if !eq { + t.Errorf("%s: XML body\ngot %s\nwant %s", tc.desc, gotXML, tc.wantXML) + } + } +} + +func TestReadProppatch(t *testing.T) { + ppStr := func(pps []Proppatch) string { + var outer []string + for _, pp := range pps { + var inner []string + for _, p := range pp.Props { + inner = append(inner, fmt.Sprintf("{XMLName: %q, Lang: %q, InnerXML: %q}", + p.XMLName, p.Lang, p.InnerXML)) + } + outer = append(outer, fmt.Sprintf("{Remove: %t, Props: [%s]}", + pp.Remove, strings.Join(inner, ", "))) + } + return "[" + strings.Join(outer, ", ") + "]" + } + + testCases := []struct { + desc string + input string + wantPP []Proppatch + wantStatus int + }{{ + desc: "proppatch: section 9.2 (with simple property value)", + input: `` + + `` + + `` + + ` ` + + ` somevalue` + + ` ` + + ` ` + + ` ` + + ` ` + + ``, + wantPP: []Proppatch{{ + Props: []Property{{ + xml.Name{Space: "http://ns.example.com/z/", Local: "Authors"}, + "", + []byte(`somevalue`), + }}, + }, { + Remove: true, + Props: []Property{{ + xml.Name{Space: "http://ns.example.com/z/", Local: "Copyright-Owner"}, + "", + nil, + }}, + }}, + }, { + desc: "proppatch: lang attribute on prop", + input: `` + + `` + + `` + + ` ` + + ` ` + + ` ` + + ` ` + + ` ` + + ``, + wantPP: []Proppatch{{ + Props: []Property{{ + xml.Name{Space: "http://example.com/ns", Local: "foo"}, + "en", + nil, + }}, + }}, + }, { + desc: "bad: remove with value", + input: `` + + `` + + `` + + ` ` + + ` ` + + ` ` + + ` Jim Whitehead` + + ` ` + + ` ` + + ` ` + + ``, + wantStatus: http.StatusBadRequest, + }, { + desc: "bad: empty propertyupdate", + input: `` + + `` + + ``, + wantStatus: http.StatusBadRequest, + }, { + desc: "bad: empty prop", + input: `` + + `` + + `` + + ` ` + + ` ` + + ` ` + + ``, + wantStatus: http.StatusBadRequest, + }} + + for _, tc := range testCases { + pp, status, err := readProppatch(strings.NewReader(tc.input)) + if tc.wantStatus != 0 { + if err == nil { + t.Errorf("%s: got nil error, want non-nil", tc.desc) + continue + } + } else if err != nil { + t.Errorf("%s: %v", tc.desc, err) + continue + } + if status != tc.wantStatus { + t.Errorf("%s: got status %d, want %d", tc.desc, status, tc.wantStatus) + continue + } + if !reflect.DeepEqual(pp, tc.wantPP) || status != tc.wantStatus { + t.Errorf("%s: proppatch\ngot %v\nwant %v", tc.desc, ppStr(pp), ppStr(tc.wantPP)) + } + } +} + +func TestUnmarshalXMLValue(t *testing.T) { + testCases := []struct { + desc string + input string + wantVal string + }{{ + desc: "simple char data", + input: "foo", + wantVal: "foo", + }, { + desc: "empty element", + input: "", + wantVal: "", + }, { + desc: "preserve namespace", + input: ``, + wantVal: ``, + }, { + desc: "preserve root element namespace", + input: ``, + wantVal: ``, + }, { + desc: "preserve whitespace", + input: " \t ", + wantVal: " \t ", + }, { + desc: "preserve mixed content", + input: ` a `, + wantVal: ` a `, + }, { + desc: "section 9.2", + input: `` + + `` + + ` Jim Whitehead` + + ` Roy Fielding` + + ``, + wantVal: `` + + ` Jim Whitehead` + + ` Roy Fielding`, + }, { + desc: "section 4.3.1 (mixed content)", + input: `` + + `` + + ` Jane Doe` + + ` ` + + ` mailto:jane.doe@example.com` + + ` http://www.example.com` + + ` ` + + ` Jane has been working way too long on the` + + ` long-awaited revision of ]]>.` + + ` ` + + ``, + wantVal: `` + + ` Jane Doe` + + ` ` + + ` mailto:jane.doe@example.com` + + ` http://www.example.com` + + ` ` + + ` Jane has been working way too long on the` + + ` long-awaited revision of <RFC2518>.` + + ` `, + }} + + var n xmlNormalizer + for _, tc := range testCases { + d := xml.NewDecoder(strings.NewReader(tc.input)) + var v xmlValue + if err := d.Decode(&v); err != nil { + t.Errorf("%s: got error %v, want nil", tc.desc, err) + continue + } + eq, err := n.equalXML(bytes.NewReader(v), strings.NewReader(tc.wantVal)) + if err != nil { + t.Errorf("%s: equalXML: %v", tc.desc, err) + continue + } + if !eq { + t.Errorf("%s:\ngot %s\nwant %s", tc.desc, string(v), tc.wantVal) + } + } +} + +// xmlNormalizer normalizes XML. +type xmlNormalizer struct { + // omitWhitespace instructs to ignore whitespace between element tags. + omitWhitespace bool + // omitComments instructs to ignore XML comments. + omitComments bool +} + +// normalize writes the normalized XML content of r to w. It applies the +// following rules +// +// * Rename namespace prefixes according to an internal heuristic. +// * Remove unnecessary namespace declarations. +// * Sort attributes in XML start elements in lexical order of their +// fully qualified name. +// * Remove XML directives and processing instructions. +// * Remove CDATA between XML tags that only contains whitespace, if +// instructed to do so. +// * Remove comments, if instructed to do so. +// +func (n *xmlNormalizer) normalize(w io.Writer, r io.Reader) error { + d := xml.NewDecoder(r) + e := xml.NewEncoder(w) + for { + t, err := d.Token() + if err != nil { + if t == nil && err == io.EOF { + break + } + return err + } + switch val := t.(type) { + case xml.Directive, xml.ProcInst: + continue + case xml.Comment: + if n.omitComments { + continue + } + case xml.CharData: + if n.omitWhitespace && len(bytes.TrimSpace(val)) == 0 { + continue + } + case xml.StartElement: + start, _ := xml.CopyToken(val).(xml.StartElement) + attr := start.Attr[:0] + for _, a := range start.Attr { + if a.Name.Space == "xmlns" || a.Name.Local == "xmlns" { + continue + } + attr = append(attr, a) + } + sort.Sort(byName(attr)) + start.Attr = attr + t = start + } + err = e.EncodeToken(t) + if err != nil { + return err + } + } + return e.Flush() +} + +// equalXML tests for equality of the normalized XML contents of a and b. +func (n *xmlNormalizer) equalXML(a, b io.Reader) (bool, error) { + var buf bytes.Buffer + if err := n.normalize(&buf, a); err != nil { + return false, err + } + normA := buf.String() + buf.Reset() + if err := n.normalize(&buf, b); err != nil { + return false, err + } + normB := buf.String() + return normA == normB, nil +} + +type byName []xml.Attr + +func (a byName) Len() int { return len(a) } +func (a byName) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byName) Less(i, j int) bool { + if a[i].Name.Space != a[j].Name.Space { + return a[i].Name.Space < a[j].Name.Space + } + return a[i].Name.Local < a[j].Name.Local +} diff --git a/vendor/golang.org/x/net/websocket/client.go b/vendor/golang.org/x/net/websocket/client.go new file mode 100644 index 0000000000..20d1e1e38e --- /dev/null +++ b/vendor/golang.org/x/net/websocket/client.go @@ -0,0 +1,113 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package websocket + +import ( + "bufio" + "crypto/tls" + "io" + "net" + "net/http" + "net/url" +) + +// DialError is an error that occurs while dialling a websocket server. +type DialError struct { + *Config + Err error +} + +func (e *DialError) Error() string { + return "websocket.Dial " + e.Config.Location.String() + ": " + e.Err.Error() +} + +// NewConfig creates a new WebSocket config for client connection. +func NewConfig(server, origin string) (config *Config, err error) { + config = new(Config) + config.Version = ProtocolVersionHybi13 + config.Location, err = url.ParseRequestURI(server) + if err != nil { + return + } + config.Origin, err = url.ParseRequestURI(origin) + if err != nil { + return + } + config.Header = http.Header(make(map[string][]string)) + return +} + +// NewClient creates a new WebSocket client connection over rwc. +func NewClient(config *Config, rwc io.ReadWriteCloser) (ws *Conn, err error) { + br := bufio.NewReader(rwc) + bw := bufio.NewWriter(rwc) + err = hybiClientHandshake(config, br, bw) + if err != nil { + return + } + buf := bufio.NewReadWriter(br, bw) + ws = newHybiClientConn(config, buf, rwc) + return +} + +// Dial opens a new client connection to a WebSocket. +func Dial(url_, protocol, origin string) (ws *Conn, err error) { + config, err := NewConfig(url_, origin) + if err != nil { + return nil, err + } + if protocol != "" { + config.Protocol = []string{protocol} + } + return DialConfig(config) +} + +var portMap = map[string]string{ + "ws": "80", + "wss": "443", +} + +func parseAuthority(location *url.URL) string { + if _, ok := portMap[location.Scheme]; ok { + if _, _, err := net.SplitHostPort(location.Host); err != nil { + return net.JoinHostPort(location.Host, portMap[location.Scheme]) + } + } + return location.Host +} + +// DialConfig opens a new client connection to a WebSocket with a config. +func DialConfig(config *Config) (ws *Conn, err error) { + var client net.Conn + if config.Location == nil { + return nil, &DialError{config, ErrBadWebSocketLocation} + } + if config.Origin == nil { + return nil, &DialError{config, ErrBadWebSocketOrigin} + } + switch config.Location.Scheme { + case "ws": + client, err = net.Dial("tcp", parseAuthority(config.Location)) + + case "wss": + client, err = tls.Dial("tcp", parseAuthority(config.Location), config.TlsConfig) + + default: + err = ErrBadScheme + } + if err != nil { + goto Error + } + + ws, err = NewClient(config, client) + if err != nil { + client.Close() + goto Error + } + return + +Error: + return nil, &DialError{config, err} +} diff --git a/vendor/golang.org/x/net/websocket/exampledial_test.go b/vendor/golang.org/x/net/websocket/exampledial_test.go new file mode 100644 index 0000000000..72bb9d48eb --- /dev/null +++ b/vendor/golang.org/x/net/websocket/exampledial_test.go @@ -0,0 +1,31 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package websocket_test + +import ( + "fmt" + "log" + + "golang.org/x/net/websocket" +) + +// This example demonstrates a trivial client. +func ExampleDial() { + origin := "http://localhost/" + url := "ws://localhost:12345/ws" + ws, err := websocket.Dial(url, "", origin) + if err != nil { + log.Fatal(err) + } + if _, err := ws.Write([]byte("hello, world!\n")); err != nil { + log.Fatal(err) + } + var msg = make([]byte, 512) + var n int + if n, err = ws.Read(msg); err != nil { + log.Fatal(err) + } + fmt.Printf("Received: %s.\n", msg[:n]) +} diff --git a/vendor/golang.org/x/net/websocket/examplehandler_test.go b/vendor/golang.org/x/net/websocket/examplehandler_test.go new file mode 100644 index 0000000000..f22a98fcd4 --- /dev/null +++ b/vendor/golang.org/x/net/websocket/examplehandler_test.go @@ -0,0 +1,26 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package websocket_test + +import ( + "io" + "net/http" + + "golang.org/x/net/websocket" +) + +// Echo the data received on the WebSocket. +func EchoServer(ws *websocket.Conn) { + io.Copy(ws, ws) +} + +// This example demonstrates a trivial echo server. +func ExampleHandler() { + http.Handle("/echo", websocket.Handler(EchoServer)) + err := http.ListenAndServe(":12345", nil) + if err != nil { + panic("ListenAndServe: " + err.Error()) + } +} diff --git a/vendor/golang.org/x/net/websocket/hybi.go b/vendor/golang.org/x/net/websocket/hybi.go new file mode 100644 index 0000000000..60bbc84189 --- /dev/null +++ b/vendor/golang.org/x/net/websocket/hybi.go @@ -0,0 +1,586 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package websocket + +// This file implements a protocol of hybi draft. +// http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17 + +import ( + "bufio" + "bytes" + "crypto/rand" + "crypto/sha1" + "encoding/base64" + "encoding/binary" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "strings" +) + +const ( + websocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" + + closeStatusNormal = 1000 + closeStatusGoingAway = 1001 + closeStatusProtocolError = 1002 + closeStatusUnsupportedData = 1003 + closeStatusFrameTooLarge = 1004 + closeStatusNoStatusRcvd = 1005 + closeStatusAbnormalClosure = 1006 + closeStatusBadMessageData = 1007 + closeStatusPolicyViolation = 1008 + closeStatusTooBigData = 1009 + closeStatusExtensionMismatch = 1010 + + maxControlFramePayloadLength = 125 +) + +var ( + ErrBadMaskingKey = &ProtocolError{"bad masking key"} + ErrBadPongMessage = &ProtocolError{"bad pong message"} + ErrBadClosingStatus = &ProtocolError{"bad closing status"} + ErrUnsupportedExtensions = &ProtocolError{"unsupported extensions"} + ErrNotImplemented = &ProtocolError{"not implemented"} + + handshakeHeader = map[string]bool{ + "Host": true, + "Upgrade": true, + "Connection": true, + "Sec-Websocket-Key": true, + "Sec-Websocket-Origin": true, + "Sec-Websocket-Version": true, + "Sec-Websocket-Protocol": true, + "Sec-Websocket-Accept": true, + } +) + +// A hybiFrameHeader is a frame header as defined in hybi draft. +type hybiFrameHeader struct { + Fin bool + Rsv [3]bool + OpCode byte + Length int64 + MaskingKey []byte + + data *bytes.Buffer +} + +// A hybiFrameReader is a reader for hybi frame. +type hybiFrameReader struct { + reader io.Reader + + header hybiFrameHeader + pos int64 + length int +} + +func (frame *hybiFrameReader) Read(msg []byte) (n int, err error) { + n, err = frame.reader.Read(msg) + if err != nil { + return 0, err + } + if frame.header.MaskingKey != nil { + for i := 0; i < n; i++ { + msg[i] = msg[i] ^ frame.header.MaskingKey[frame.pos%4] + frame.pos++ + } + } + return n, err +} + +func (frame *hybiFrameReader) PayloadType() byte { return frame.header.OpCode } + +func (frame *hybiFrameReader) HeaderReader() io.Reader { + if frame.header.data == nil { + return nil + } + if frame.header.data.Len() == 0 { + return nil + } + return frame.header.data +} + +func (frame *hybiFrameReader) TrailerReader() io.Reader { return nil } + +func (frame *hybiFrameReader) Len() (n int) { return frame.length } + +// A hybiFrameReaderFactory creates new frame reader based on its frame type. +type hybiFrameReaderFactory struct { + *bufio.Reader +} + +// NewFrameReader reads a frame header from the connection, and creates new reader for the frame. +// See Section 5.2 Base Framing protocol for detail. +// http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#section-5.2 +func (buf hybiFrameReaderFactory) NewFrameReader() (frame frameReader, err error) { + hybiFrame := new(hybiFrameReader) + frame = hybiFrame + var header []byte + var b byte + // First byte. FIN/RSV1/RSV2/RSV3/OpCode(4bits) + b, err = buf.ReadByte() + if err != nil { + return + } + header = append(header, b) + hybiFrame.header.Fin = ((header[0] >> 7) & 1) != 0 + for i := 0; i < 3; i++ { + j := uint(6 - i) + hybiFrame.header.Rsv[i] = ((header[0] >> j) & 1) != 0 + } + hybiFrame.header.OpCode = header[0] & 0x0f + + // Second byte. Mask/Payload len(7bits) + b, err = buf.ReadByte() + if err != nil { + return + } + header = append(header, b) + mask := (b & 0x80) != 0 + b &= 0x7f + lengthFields := 0 + switch { + case b <= 125: // Payload length 7bits. + hybiFrame.header.Length = int64(b) + case b == 126: // Payload length 7+16bits + lengthFields = 2 + case b == 127: // Payload length 7+64bits + lengthFields = 8 + } + for i := 0; i < lengthFields; i++ { + b, err = buf.ReadByte() + if err != nil { + return + } + if lengthFields == 8 && i == 0 { // MSB must be zero when 7+64 bits + b &= 0x7f + } + header = append(header, b) + hybiFrame.header.Length = hybiFrame.header.Length*256 + int64(b) + } + if mask { + // Masking key. 4 bytes. + for i := 0; i < 4; i++ { + b, err = buf.ReadByte() + if err != nil { + return + } + header = append(header, b) + hybiFrame.header.MaskingKey = append(hybiFrame.header.MaskingKey, b) + } + } + hybiFrame.reader = io.LimitReader(buf.Reader, hybiFrame.header.Length) + hybiFrame.header.data = bytes.NewBuffer(header) + hybiFrame.length = len(header) + int(hybiFrame.header.Length) + return +} + +// A HybiFrameWriter is a writer for hybi frame. +type hybiFrameWriter struct { + writer *bufio.Writer + + header *hybiFrameHeader +} + +func (frame *hybiFrameWriter) Write(msg []byte) (n int, err error) { + var header []byte + var b byte + if frame.header.Fin { + b |= 0x80 + } + for i := 0; i < 3; i++ { + if frame.header.Rsv[i] { + j := uint(6 - i) + b |= 1 << j + } + } + b |= frame.header.OpCode + header = append(header, b) + if frame.header.MaskingKey != nil { + b = 0x80 + } else { + b = 0 + } + lengthFields := 0 + length := len(msg) + switch { + case length <= 125: + b |= byte(length) + case length < 65536: + b |= 126 + lengthFields = 2 + default: + b |= 127 + lengthFields = 8 + } + header = append(header, b) + for i := 0; i < lengthFields; i++ { + j := uint((lengthFields - i - 1) * 8) + b = byte((length >> j) & 0xff) + header = append(header, b) + } + if frame.header.MaskingKey != nil { + if len(frame.header.MaskingKey) != 4 { + return 0, ErrBadMaskingKey + } + header = append(header, frame.header.MaskingKey...) + frame.writer.Write(header) + data := make([]byte, length) + for i := range data { + data[i] = msg[i] ^ frame.header.MaskingKey[i%4] + } + frame.writer.Write(data) + err = frame.writer.Flush() + return length, err + } + frame.writer.Write(header) + frame.writer.Write(msg) + err = frame.writer.Flush() + return length, err +} + +func (frame *hybiFrameWriter) Close() error { return nil } + +type hybiFrameWriterFactory struct { + *bufio.Writer + needMaskingKey bool +} + +func (buf hybiFrameWriterFactory) NewFrameWriter(payloadType byte) (frame frameWriter, err error) { + frameHeader := &hybiFrameHeader{Fin: true, OpCode: payloadType} + if buf.needMaskingKey { + frameHeader.MaskingKey, err = generateMaskingKey() + if err != nil { + return nil, err + } + } + return &hybiFrameWriter{writer: buf.Writer, header: frameHeader}, nil +} + +type hybiFrameHandler struct { + conn *Conn + payloadType byte +} + +func (handler *hybiFrameHandler) HandleFrame(frame frameReader) (frameReader, error) { + if handler.conn.IsServerConn() { + // The client MUST mask all frames sent to the server. + if frame.(*hybiFrameReader).header.MaskingKey == nil { + handler.WriteClose(closeStatusProtocolError) + return nil, io.EOF + } + } else { + // The server MUST NOT mask all frames. + if frame.(*hybiFrameReader).header.MaskingKey != nil { + handler.WriteClose(closeStatusProtocolError) + return nil, io.EOF + } + } + if header := frame.HeaderReader(); header != nil { + io.Copy(ioutil.Discard, header) + } + switch frame.PayloadType() { + case ContinuationFrame: + frame.(*hybiFrameReader).header.OpCode = handler.payloadType + case TextFrame, BinaryFrame: + handler.payloadType = frame.PayloadType() + case CloseFrame: + return nil, io.EOF + case PingFrame, PongFrame: + b := make([]byte, maxControlFramePayloadLength) + n, err := io.ReadFull(frame, b) + if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF { + return nil, err + } + io.Copy(ioutil.Discard, frame) + if frame.PayloadType() == PingFrame { + if _, err := handler.WritePong(b[:n]); err != nil { + return nil, err + } + } + return nil, nil + } + return frame, nil +} + +func (handler *hybiFrameHandler) WriteClose(status int) (err error) { + handler.conn.wio.Lock() + defer handler.conn.wio.Unlock() + w, err := handler.conn.frameWriterFactory.NewFrameWriter(CloseFrame) + if err != nil { + return err + } + msg := make([]byte, 2) + binary.BigEndian.PutUint16(msg, uint16(status)) + _, err = w.Write(msg) + w.Close() + return err +} + +func (handler *hybiFrameHandler) WritePong(msg []byte) (n int, err error) { + handler.conn.wio.Lock() + defer handler.conn.wio.Unlock() + w, err := handler.conn.frameWriterFactory.NewFrameWriter(PongFrame) + if err != nil { + return 0, err + } + n, err = w.Write(msg) + w.Close() + return n, err +} + +// newHybiConn creates a new WebSocket connection speaking hybi draft protocol. +func newHybiConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { + if buf == nil { + br := bufio.NewReader(rwc) + bw := bufio.NewWriter(rwc) + buf = bufio.NewReadWriter(br, bw) + } + ws := &Conn{config: config, request: request, buf: buf, rwc: rwc, + frameReaderFactory: hybiFrameReaderFactory{buf.Reader}, + frameWriterFactory: hybiFrameWriterFactory{ + buf.Writer, request == nil}, + PayloadType: TextFrame, + defaultCloseStatus: closeStatusNormal} + ws.frameHandler = &hybiFrameHandler{conn: ws} + return ws +} + +// generateMaskingKey generates a masking key for a frame. +func generateMaskingKey() (maskingKey []byte, err error) { + maskingKey = make([]byte, 4) + if _, err = io.ReadFull(rand.Reader, maskingKey); err != nil { + return + } + return +} + +// generateNonce generates a nonce consisting of a randomly selected 16-byte +// value that has been base64-encoded. +func generateNonce() (nonce []byte) { + key := make([]byte, 16) + if _, err := io.ReadFull(rand.Reader, key); err != nil { + panic(err) + } + nonce = make([]byte, 24) + base64.StdEncoding.Encode(nonce, key) + return +} + +// removeZone removes IPv6 zone identifer from host. +// E.g., "[fe80::1%en0]:8080" to "[fe80::1]:8080" +func removeZone(host string) string { + if !strings.HasPrefix(host, "[") { + return host + } + i := strings.LastIndex(host, "]") + if i < 0 { + return host + } + j := strings.LastIndex(host[:i], "%") + if j < 0 { + return host + } + return host[:j] + host[i:] +} + +// getNonceAccept computes the base64-encoded SHA-1 of the concatenation of +// the nonce ("Sec-WebSocket-Key" value) with the websocket GUID string. +func getNonceAccept(nonce []byte) (expected []byte, err error) { + h := sha1.New() + if _, err = h.Write(nonce); err != nil { + return + } + if _, err = h.Write([]byte(websocketGUID)); err != nil { + return + } + expected = make([]byte, 28) + base64.StdEncoding.Encode(expected, h.Sum(nil)) + return +} + +// Client handshake described in draft-ietf-hybi-thewebsocket-protocol-17 +func hybiClientHandshake(config *Config, br *bufio.Reader, bw *bufio.Writer) (err error) { + bw.WriteString("GET " + config.Location.RequestURI() + " HTTP/1.1\r\n") + + // According to RFC 6874, an HTTP client, proxy, or other + // intermediary must remove any IPv6 zone identifier attached + // to an outgoing URI. + bw.WriteString("Host: " + removeZone(config.Location.Host) + "\r\n") + bw.WriteString("Upgrade: websocket\r\n") + bw.WriteString("Connection: Upgrade\r\n") + nonce := generateNonce() + if config.handshakeData != nil { + nonce = []byte(config.handshakeData["key"]) + } + bw.WriteString("Sec-WebSocket-Key: " + string(nonce) + "\r\n") + bw.WriteString("Origin: " + strings.ToLower(config.Origin.String()) + "\r\n") + + if config.Version != ProtocolVersionHybi13 { + return ErrBadProtocolVersion + } + + bw.WriteString("Sec-WebSocket-Version: " + fmt.Sprintf("%d", config.Version) + "\r\n") + if len(config.Protocol) > 0 { + bw.WriteString("Sec-WebSocket-Protocol: " + strings.Join(config.Protocol, ", ") + "\r\n") + } + // TODO(ukai): send Sec-WebSocket-Extensions. + err = config.Header.WriteSubset(bw, handshakeHeader) + if err != nil { + return err + } + + bw.WriteString("\r\n") + if err = bw.Flush(); err != nil { + return err + } + + resp, err := http.ReadResponse(br, &http.Request{Method: "GET"}) + if err != nil { + return err + } + if resp.StatusCode != 101 { + return ErrBadStatus + } + if strings.ToLower(resp.Header.Get("Upgrade")) != "websocket" || + strings.ToLower(resp.Header.Get("Connection")) != "upgrade" { + return ErrBadUpgrade + } + expectedAccept, err := getNonceAccept(nonce) + if err != nil { + return err + } + if resp.Header.Get("Sec-WebSocket-Accept") != string(expectedAccept) { + return ErrChallengeResponse + } + if resp.Header.Get("Sec-WebSocket-Extensions") != "" { + return ErrUnsupportedExtensions + } + offeredProtocol := resp.Header.Get("Sec-WebSocket-Protocol") + if offeredProtocol != "" { + protocolMatched := false + for i := 0; i < len(config.Protocol); i++ { + if config.Protocol[i] == offeredProtocol { + protocolMatched = true + break + } + } + if !protocolMatched { + return ErrBadWebSocketProtocol + } + config.Protocol = []string{offeredProtocol} + } + + return nil +} + +// newHybiClientConn creates a client WebSocket connection after handshake. +func newHybiClientConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser) *Conn { + return newHybiConn(config, buf, rwc, nil) +} + +// A HybiServerHandshaker performs a server handshake using hybi draft protocol. +type hybiServerHandshaker struct { + *Config + accept []byte +} + +func (c *hybiServerHandshaker) ReadHandshake(buf *bufio.Reader, req *http.Request) (code int, err error) { + c.Version = ProtocolVersionHybi13 + if req.Method != "GET" { + return http.StatusMethodNotAllowed, ErrBadRequestMethod + } + // HTTP version can be safely ignored. + + if strings.ToLower(req.Header.Get("Upgrade")) != "websocket" || + !strings.Contains(strings.ToLower(req.Header.Get("Connection")), "upgrade") { + return http.StatusBadRequest, ErrNotWebSocket + } + + key := req.Header.Get("Sec-Websocket-Key") + if key == "" { + return http.StatusBadRequest, ErrChallengeResponse + } + version := req.Header.Get("Sec-Websocket-Version") + switch version { + case "13": + c.Version = ProtocolVersionHybi13 + default: + return http.StatusBadRequest, ErrBadWebSocketVersion + } + var scheme string + if req.TLS != nil { + scheme = "wss" + } else { + scheme = "ws" + } + c.Location, err = url.ParseRequestURI(scheme + "://" + req.Host + req.URL.RequestURI()) + if err != nil { + return http.StatusBadRequest, err + } + protocol := strings.TrimSpace(req.Header.Get("Sec-Websocket-Protocol")) + if protocol != "" { + protocols := strings.Split(protocol, ",") + for i := 0; i < len(protocols); i++ { + c.Protocol = append(c.Protocol, strings.TrimSpace(protocols[i])) + } + } + c.accept, err = getNonceAccept([]byte(key)) + if err != nil { + return http.StatusInternalServerError, err + } + return http.StatusSwitchingProtocols, nil +} + +// Origin parses the Origin header in req. +// If the Origin header is not set, it returns nil and nil. +func Origin(config *Config, req *http.Request) (*url.URL, error) { + var origin string + switch config.Version { + case ProtocolVersionHybi13: + origin = req.Header.Get("Origin") + } + if origin == "" { + return nil, nil + } + return url.ParseRequestURI(origin) +} + +func (c *hybiServerHandshaker) AcceptHandshake(buf *bufio.Writer) (err error) { + if len(c.Protocol) > 0 { + if len(c.Protocol) != 1 { + // You need choose a Protocol in Handshake func in Server. + return ErrBadWebSocketProtocol + } + } + buf.WriteString("HTTP/1.1 101 Switching Protocols\r\n") + buf.WriteString("Upgrade: websocket\r\n") + buf.WriteString("Connection: Upgrade\r\n") + buf.WriteString("Sec-WebSocket-Accept: " + string(c.accept) + "\r\n") + if len(c.Protocol) > 0 { + buf.WriteString("Sec-WebSocket-Protocol: " + c.Protocol[0] + "\r\n") + } + // TODO(ukai): send Sec-WebSocket-Extensions. + if c.Header != nil { + err := c.Header.WriteSubset(buf, handshakeHeader) + if err != nil { + return err + } + } + buf.WriteString("\r\n") + return buf.Flush() +} + +func (c *hybiServerHandshaker) NewServerConn(buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { + return newHybiServerConn(c.Config, buf, rwc, request) +} + +// newHybiServerConn returns a new WebSocket connection speaking hybi draft protocol. +func newHybiServerConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { + return newHybiConn(config, buf, rwc, request) +} diff --git a/vendor/golang.org/x/net/websocket/hybi_test.go b/vendor/golang.org/x/net/websocket/hybi_test.go new file mode 100644 index 0000000000..9504aa2d30 --- /dev/null +++ b/vendor/golang.org/x/net/websocket/hybi_test.go @@ -0,0 +1,608 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package websocket + +import ( + "bufio" + "bytes" + "fmt" + "io" + "net/http" + "net/url" + "strings" + "testing" +) + +// Test the getNonceAccept function with values in +// http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17 +func TestSecWebSocketAccept(t *testing.T) { + nonce := []byte("dGhlIHNhbXBsZSBub25jZQ==") + expected := []byte("s3pPLMBiTxaQ9kYGzzhZRbK+xOo=") + accept, err := getNonceAccept(nonce) + if err != nil { + t.Errorf("getNonceAccept: returned error %v", err) + return + } + if !bytes.Equal(expected, accept) { + t.Errorf("getNonceAccept: expected %q got %q", expected, accept) + } +} + +func TestHybiClientHandshake(t *testing.T) { + type test struct { + url, host string + } + tests := []test{ + {"ws://server.example.com/chat", "server.example.com"}, + {"ws://127.0.0.1/chat", "127.0.0.1"}, + } + if _, err := url.ParseRequestURI("http://[fe80::1%25lo0]"); err == nil { + tests = append(tests, test{"ws://[fe80::1%25lo0]/chat", "[fe80::1]"}) + } + + for _, tt := range tests { + var b bytes.Buffer + bw := bufio.NewWriter(&b) + br := bufio.NewReader(strings.NewReader(`HTTP/1.1 101 Switching Protocols +Upgrade: websocket +Connection: Upgrade +Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= +Sec-WebSocket-Protocol: chat + +`)) + var err error + var config Config + config.Location, err = url.ParseRequestURI(tt.url) + if err != nil { + t.Fatal("location url", err) + } + config.Origin, err = url.ParseRequestURI("http://example.com") + if err != nil { + t.Fatal("origin url", err) + } + config.Protocol = append(config.Protocol, "chat") + config.Protocol = append(config.Protocol, "superchat") + config.Version = ProtocolVersionHybi13 + config.handshakeData = map[string]string{ + "key": "dGhlIHNhbXBsZSBub25jZQ==", + } + if err := hybiClientHandshake(&config, br, bw); err != nil { + t.Fatal("handshake", err) + } + req, err := http.ReadRequest(bufio.NewReader(&b)) + if err != nil { + t.Fatal("read request", err) + } + if req.Method != "GET" { + t.Errorf("request method expected GET, but got %s", req.Method) + } + if req.URL.Path != "/chat" { + t.Errorf("request path expected /chat, but got %s", req.URL.Path) + } + if req.Proto != "HTTP/1.1" { + t.Errorf("request proto expected HTTP/1.1, but got %s", req.Proto) + } + if req.Host != tt.host { + t.Errorf("request host expected %s, but got %s", tt.host, req.Host) + } + var expectedHeader = map[string]string{ + "Connection": "Upgrade", + "Upgrade": "websocket", + "Sec-Websocket-Key": config.handshakeData["key"], + "Origin": config.Origin.String(), + "Sec-Websocket-Protocol": "chat, superchat", + "Sec-Websocket-Version": fmt.Sprintf("%d", ProtocolVersionHybi13), + } + for k, v := range expectedHeader { + if req.Header.Get(k) != v { + t.Errorf("%s expected %s, but got %v", k, v, req.Header.Get(k)) + } + } + } +} + +func TestHybiClientHandshakeWithHeader(t *testing.T) { + b := bytes.NewBuffer([]byte{}) + bw := bufio.NewWriter(b) + br := bufio.NewReader(strings.NewReader(`HTTP/1.1 101 Switching Protocols +Upgrade: websocket +Connection: Upgrade +Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= +Sec-WebSocket-Protocol: chat + +`)) + var err error + config := new(Config) + config.Location, err = url.ParseRequestURI("ws://server.example.com/chat") + if err != nil { + t.Fatal("location url", err) + } + config.Origin, err = url.ParseRequestURI("http://example.com") + if err != nil { + t.Fatal("origin url", err) + } + config.Protocol = append(config.Protocol, "chat") + config.Protocol = append(config.Protocol, "superchat") + config.Version = ProtocolVersionHybi13 + config.Header = http.Header(make(map[string][]string)) + config.Header.Add("User-Agent", "test") + + config.handshakeData = map[string]string{ + "key": "dGhlIHNhbXBsZSBub25jZQ==", + } + err = hybiClientHandshake(config, br, bw) + if err != nil { + t.Errorf("handshake failed: %v", err) + } + req, err := http.ReadRequest(bufio.NewReader(b)) + if err != nil { + t.Fatalf("read request: %v", err) + } + if req.Method != "GET" { + t.Errorf("request method expected GET, but got %q", req.Method) + } + if req.URL.Path != "/chat" { + t.Errorf("request path expected /chat, but got %q", req.URL.Path) + } + if req.Proto != "HTTP/1.1" { + t.Errorf("request proto expected HTTP/1.1, but got %q", req.Proto) + } + if req.Host != "server.example.com" { + t.Errorf("request Host expected server.example.com, but got %v", req.Host) + } + var expectedHeader = map[string]string{ + "Connection": "Upgrade", + "Upgrade": "websocket", + "Sec-Websocket-Key": config.handshakeData["key"], + "Origin": config.Origin.String(), + "Sec-Websocket-Protocol": "chat, superchat", + "Sec-Websocket-Version": fmt.Sprintf("%d", ProtocolVersionHybi13), + "User-Agent": "test", + } + for k, v := range expectedHeader { + if req.Header.Get(k) != v { + t.Errorf(fmt.Sprintf("%s expected %q but got %q", k, v, req.Header.Get(k))) + } + } +} + +func TestHybiServerHandshake(t *testing.T) { + config := new(Config) + handshaker := &hybiServerHandshaker{Config: config} + br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 +Host: server.example.com +Upgrade: websocket +Connection: Upgrade +Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== +Origin: http://example.com +Sec-WebSocket-Protocol: chat, superchat +Sec-WebSocket-Version: 13 + +`)) + req, err := http.ReadRequest(br) + if err != nil { + t.Fatal("request", err) + } + code, err := handshaker.ReadHandshake(br, req) + if err != nil { + t.Errorf("handshake failed: %v", err) + } + if code != http.StatusSwitchingProtocols { + t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code) + } + expectedProtocols := []string{"chat", "superchat"} + if fmt.Sprintf("%v", config.Protocol) != fmt.Sprintf("%v", expectedProtocols) { + t.Errorf("protocol expected %q but got %q", expectedProtocols, config.Protocol) + } + b := bytes.NewBuffer([]byte{}) + bw := bufio.NewWriter(b) + + config.Protocol = config.Protocol[:1] + + err = handshaker.AcceptHandshake(bw) + if err != nil { + t.Errorf("handshake response failed: %v", err) + } + expectedResponse := strings.Join([]string{ + "HTTP/1.1 101 Switching Protocols", + "Upgrade: websocket", + "Connection: Upgrade", + "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", + "Sec-WebSocket-Protocol: chat", + "", ""}, "\r\n") + + if b.String() != expectedResponse { + t.Errorf("handshake expected %q but got %q", expectedResponse, b.String()) + } +} + +func TestHybiServerHandshakeNoSubProtocol(t *testing.T) { + config := new(Config) + handshaker := &hybiServerHandshaker{Config: config} + br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 +Host: server.example.com +Upgrade: websocket +Connection: Upgrade +Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== +Origin: http://example.com +Sec-WebSocket-Version: 13 + +`)) + req, err := http.ReadRequest(br) + if err != nil { + t.Fatal("request", err) + } + code, err := handshaker.ReadHandshake(br, req) + if err != nil { + t.Errorf("handshake failed: %v", err) + } + if code != http.StatusSwitchingProtocols { + t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code) + } + if len(config.Protocol) != 0 { + t.Errorf("len(config.Protocol) expected 0, but got %q", len(config.Protocol)) + } + b := bytes.NewBuffer([]byte{}) + bw := bufio.NewWriter(b) + + err = handshaker.AcceptHandshake(bw) + if err != nil { + t.Errorf("handshake response failed: %v", err) + } + expectedResponse := strings.Join([]string{ + "HTTP/1.1 101 Switching Protocols", + "Upgrade: websocket", + "Connection: Upgrade", + "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", + "", ""}, "\r\n") + + if b.String() != expectedResponse { + t.Errorf("handshake expected %q but got %q", expectedResponse, b.String()) + } +} + +func TestHybiServerHandshakeHybiBadVersion(t *testing.T) { + config := new(Config) + handshaker := &hybiServerHandshaker{Config: config} + br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 +Host: server.example.com +Upgrade: websocket +Connection: Upgrade +Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== +Sec-WebSocket-Origin: http://example.com +Sec-WebSocket-Protocol: chat, superchat +Sec-WebSocket-Version: 9 + +`)) + req, err := http.ReadRequest(br) + if err != nil { + t.Fatal("request", err) + } + code, err := handshaker.ReadHandshake(br, req) + if err != ErrBadWebSocketVersion { + t.Errorf("handshake expected err %q but got %q", ErrBadWebSocketVersion, err) + } + if code != http.StatusBadRequest { + t.Errorf("status expected %q but got %q", http.StatusBadRequest, code) + } +} + +func testHybiFrame(t *testing.T, testHeader, testPayload, testMaskedPayload []byte, frameHeader *hybiFrameHeader) { + b := bytes.NewBuffer([]byte{}) + frameWriterFactory := &hybiFrameWriterFactory{bufio.NewWriter(b), false} + w, _ := frameWriterFactory.NewFrameWriter(TextFrame) + w.(*hybiFrameWriter).header = frameHeader + _, err := w.Write(testPayload) + w.Close() + if err != nil { + t.Errorf("Write error %q", err) + } + var expectedFrame []byte + expectedFrame = append(expectedFrame, testHeader...) + expectedFrame = append(expectedFrame, testMaskedPayload...) + if !bytes.Equal(expectedFrame, b.Bytes()) { + t.Errorf("frame expected %q got %q", expectedFrame, b.Bytes()) + } + frameReaderFactory := &hybiFrameReaderFactory{bufio.NewReader(b)} + r, err := frameReaderFactory.NewFrameReader() + if err != nil { + t.Errorf("Read error %q", err) + } + if header := r.HeaderReader(); header == nil { + t.Errorf("no header") + } else { + actualHeader := make([]byte, r.Len()) + n, err := header.Read(actualHeader) + if err != nil { + t.Errorf("Read header error %q", err) + } else { + if n < len(testHeader) { + t.Errorf("header too short %q got %q", testHeader, actualHeader[:n]) + } + if !bytes.Equal(testHeader, actualHeader[:n]) { + t.Errorf("header expected %q got %q", testHeader, actualHeader[:n]) + } + } + } + if trailer := r.TrailerReader(); trailer != nil { + t.Errorf("unexpected trailer %q", trailer) + } + frame := r.(*hybiFrameReader) + if frameHeader.Fin != frame.header.Fin || + frameHeader.OpCode != frame.header.OpCode || + len(testPayload) != int(frame.header.Length) { + t.Errorf("mismatch %v (%d) vs %v", frameHeader, len(testPayload), frame) + } + payload := make([]byte, len(testPayload)) + _, err = r.Read(payload) + if err != nil && err != io.EOF { + t.Errorf("read %v", err) + } + if !bytes.Equal(testPayload, payload) { + t.Errorf("payload %q vs %q", testPayload, payload) + } +} + +func TestHybiShortTextFrame(t *testing.T) { + frameHeader := &hybiFrameHeader{Fin: true, OpCode: TextFrame} + payload := []byte("hello") + testHybiFrame(t, []byte{0x81, 0x05}, payload, payload, frameHeader) + + payload = make([]byte, 125) + testHybiFrame(t, []byte{0x81, 125}, payload, payload, frameHeader) +} + +func TestHybiShortMaskedTextFrame(t *testing.T) { + frameHeader := &hybiFrameHeader{Fin: true, OpCode: TextFrame, + MaskingKey: []byte{0xcc, 0x55, 0x80, 0x20}} + payload := []byte("hello") + maskedPayload := []byte{0xa4, 0x30, 0xec, 0x4c, 0xa3} + header := []byte{0x81, 0x85} + header = append(header, frameHeader.MaskingKey...) + testHybiFrame(t, header, payload, maskedPayload, frameHeader) +} + +func TestHybiShortBinaryFrame(t *testing.T) { + frameHeader := &hybiFrameHeader{Fin: true, OpCode: BinaryFrame} + payload := []byte("hello") + testHybiFrame(t, []byte{0x82, 0x05}, payload, payload, frameHeader) + + payload = make([]byte, 125) + testHybiFrame(t, []byte{0x82, 125}, payload, payload, frameHeader) +} + +func TestHybiControlFrame(t *testing.T) { + payload := []byte("hello") + + frameHeader := &hybiFrameHeader{Fin: true, OpCode: PingFrame} + testHybiFrame(t, []byte{0x89, 0x05}, payload, payload, frameHeader) + + frameHeader = &hybiFrameHeader{Fin: true, OpCode: PingFrame} + testHybiFrame(t, []byte{0x89, 0x00}, nil, nil, frameHeader) + + frameHeader = &hybiFrameHeader{Fin: true, OpCode: PongFrame} + testHybiFrame(t, []byte{0x8A, 0x05}, payload, payload, frameHeader) + + frameHeader = &hybiFrameHeader{Fin: true, OpCode: PongFrame} + testHybiFrame(t, []byte{0x8A, 0x00}, nil, nil, frameHeader) + + frameHeader = &hybiFrameHeader{Fin: true, OpCode: CloseFrame} + payload = []byte{0x03, 0xe8} // 1000 + testHybiFrame(t, []byte{0x88, 0x02}, payload, payload, frameHeader) +} + +func TestHybiLongFrame(t *testing.T) { + frameHeader := &hybiFrameHeader{Fin: true, OpCode: TextFrame} + payload := make([]byte, 126) + testHybiFrame(t, []byte{0x81, 126, 0x00, 126}, payload, payload, frameHeader) + + payload = make([]byte, 65535) + testHybiFrame(t, []byte{0x81, 126, 0xff, 0xff}, payload, payload, frameHeader) + + payload = make([]byte, 65536) + testHybiFrame(t, []byte{0x81, 127, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00}, payload, payload, frameHeader) +} + +func TestHybiClientRead(t *testing.T) { + wireData := []byte{0x81, 0x05, 'h', 'e', 'l', 'l', 'o', + 0x89, 0x05, 'h', 'e', 'l', 'l', 'o', // ping + 0x81, 0x05, 'w', 'o', 'r', 'l', 'd'} + br := bufio.NewReader(bytes.NewBuffer(wireData)) + bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) + conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, nil) + + msg := make([]byte, 512) + n, err := conn.Read(msg) + if err != nil { + t.Errorf("read 1st frame, error %q", err) + } + if n != 5 { + t.Errorf("read 1st frame, expect 5, got %d", n) + } + if !bytes.Equal(wireData[2:7], msg[:n]) { + t.Errorf("read 1st frame %v, got %v", wireData[2:7], msg[:n]) + } + n, err = conn.Read(msg) + if err != nil { + t.Errorf("read 2nd frame, error %q", err) + } + if n != 5 { + t.Errorf("read 2nd frame, expect 5, got %d", n) + } + if !bytes.Equal(wireData[16:21], msg[:n]) { + t.Errorf("read 2nd frame %v, got %v", wireData[16:21], msg[:n]) + } + n, err = conn.Read(msg) + if err == nil { + t.Errorf("read not EOF") + } + if n != 0 { + t.Errorf("expect read 0, got %d", n) + } +} + +func TestHybiShortRead(t *testing.T) { + wireData := []byte{0x81, 0x05, 'h', 'e', 'l', 'l', 'o', + 0x89, 0x05, 'h', 'e', 'l', 'l', 'o', // ping + 0x81, 0x05, 'w', 'o', 'r', 'l', 'd'} + br := bufio.NewReader(bytes.NewBuffer(wireData)) + bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) + conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, nil) + + step := 0 + pos := 0 + expectedPos := []int{2, 5, 16, 19} + expectedLen := []int{3, 2, 3, 2} + for { + msg := make([]byte, 3) + n, err := conn.Read(msg) + if step >= len(expectedPos) { + if err == nil { + t.Errorf("read not EOF") + } + if n != 0 { + t.Errorf("expect read 0, got %d", n) + } + return + } + pos = expectedPos[step] + endPos := pos + expectedLen[step] + if err != nil { + t.Errorf("read from %d, got error %q", pos, err) + return + } + if n != endPos-pos { + t.Errorf("read from %d, expect %d, got %d", pos, endPos-pos, n) + } + if !bytes.Equal(wireData[pos:endPos], msg[:n]) { + t.Errorf("read from %d, frame %v, got %v", pos, wireData[pos:endPos], msg[:n]) + } + step++ + } +} + +func TestHybiServerRead(t *testing.T) { + wireData := []byte{0x81, 0x85, 0xcc, 0x55, 0x80, 0x20, + 0xa4, 0x30, 0xec, 0x4c, 0xa3, // hello + 0x89, 0x85, 0xcc, 0x55, 0x80, 0x20, + 0xa4, 0x30, 0xec, 0x4c, 0xa3, // ping: hello + 0x81, 0x85, 0xed, 0x83, 0xb4, 0x24, + 0x9a, 0xec, 0xc6, 0x48, 0x89, // world + } + br := bufio.NewReader(bytes.NewBuffer(wireData)) + bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) + conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, new(http.Request)) + + expected := [][]byte{[]byte("hello"), []byte("world")} + + msg := make([]byte, 512) + n, err := conn.Read(msg) + if err != nil { + t.Errorf("read 1st frame, error %q", err) + } + if n != 5 { + t.Errorf("read 1st frame, expect 5, got %d", n) + } + if !bytes.Equal(expected[0], msg[:n]) { + t.Errorf("read 1st frame %q, got %q", expected[0], msg[:n]) + } + + n, err = conn.Read(msg) + if err != nil { + t.Errorf("read 2nd frame, error %q", err) + } + if n != 5 { + t.Errorf("read 2nd frame, expect 5, got %d", n) + } + if !bytes.Equal(expected[1], msg[:n]) { + t.Errorf("read 2nd frame %q, got %q", expected[1], msg[:n]) + } + + n, err = conn.Read(msg) + if err == nil { + t.Errorf("read not EOF") + } + if n != 0 { + t.Errorf("expect read 0, got %d", n) + } +} + +func TestHybiServerReadWithoutMasking(t *testing.T) { + wireData := []byte{0x81, 0x05, 'h', 'e', 'l', 'l', 'o'} + br := bufio.NewReader(bytes.NewBuffer(wireData)) + bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) + conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, new(http.Request)) + // server MUST close the connection upon receiving a non-masked frame. + msg := make([]byte, 512) + _, err := conn.Read(msg) + if err != io.EOF { + t.Errorf("read 1st frame, expect %q, but got %q", io.EOF, err) + } +} + +func TestHybiClientReadWithMasking(t *testing.T) { + wireData := []byte{0x81, 0x85, 0xcc, 0x55, 0x80, 0x20, + 0xa4, 0x30, 0xec, 0x4c, 0xa3, // hello + } + br := bufio.NewReader(bytes.NewBuffer(wireData)) + bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) + conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, nil) + + // client MUST close the connection upon receiving a masked frame. + msg := make([]byte, 512) + _, err := conn.Read(msg) + if err != io.EOF { + t.Errorf("read 1st frame, expect %q, but got %q", io.EOF, err) + } +} + +// Test the hybiServerHandshaker supports firefox implementation and +// checks Connection request header include (but it's not necessary +// equal to) "upgrade" +func TestHybiServerFirefoxHandshake(t *testing.T) { + config := new(Config) + handshaker := &hybiServerHandshaker{Config: config} + br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 +Host: server.example.com +Upgrade: websocket +Connection: keep-alive, upgrade +Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== +Origin: http://example.com +Sec-WebSocket-Protocol: chat, superchat +Sec-WebSocket-Version: 13 + +`)) + req, err := http.ReadRequest(br) + if err != nil { + t.Fatal("request", err) + } + code, err := handshaker.ReadHandshake(br, req) + if err != nil { + t.Errorf("handshake failed: %v", err) + } + if code != http.StatusSwitchingProtocols { + t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code) + } + b := bytes.NewBuffer([]byte{}) + bw := bufio.NewWriter(b) + + config.Protocol = []string{"chat"} + + err = handshaker.AcceptHandshake(bw) + if err != nil { + t.Errorf("handshake response failed: %v", err) + } + expectedResponse := strings.Join([]string{ + "HTTP/1.1 101 Switching Protocols", + "Upgrade: websocket", + "Connection: Upgrade", + "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", + "Sec-WebSocket-Protocol: chat", + "", ""}, "\r\n") + + if b.String() != expectedResponse { + t.Errorf("handshake expected %q but got %q", expectedResponse, b.String()) + } +} diff --git a/vendor/golang.org/x/net/websocket/server.go b/vendor/golang.org/x/net/websocket/server.go new file mode 100644 index 0000000000..0895dea190 --- /dev/null +++ b/vendor/golang.org/x/net/websocket/server.go @@ -0,0 +1,113 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package websocket + +import ( + "bufio" + "fmt" + "io" + "net/http" +) + +func newServerConn(rwc io.ReadWriteCloser, buf *bufio.ReadWriter, req *http.Request, config *Config, handshake func(*Config, *http.Request) error) (conn *Conn, err error) { + var hs serverHandshaker = &hybiServerHandshaker{Config: config} + code, err := hs.ReadHandshake(buf.Reader, req) + if err == ErrBadWebSocketVersion { + fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) + fmt.Fprintf(buf, "Sec-WebSocket-Version: %s\r\n", SupportedProtocolVersion) + buf.WriteString("\r\n") + buf.WriteString(err.Error()) + buf.Flush() + return + } + if err != nil { + fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) + buf.WriteString("\r\n") + buf.WriteString(err.Error()) + buf.Flush() + return + } + if handshake != nil { + err = handshake(config, req) + if err != nil { + code = http.StatusForbidden + fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) + buf.WriteString("\r\n") + buf.Flush() + return + } + } + err = hs.AcceptHandshake(buf.Writer) + if err != nil { + code = http.StatusBadRequest + fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) + buf.WriteString("\r\n") + buf.Flush() + return + } + conn = hs.NewServerConn(buf, rwc, req) + return +} + +// Server represents a server of a WebSocket. +type Server struct { + // Config is a WebSocket configuration for new WebSocket connection. + Config + + // Handshake is an optional function in WebSocket handshake. + // For example, you can check, or don't check Origin header. + // Another example, you can select config.Protocol. + Handshake func(*Config, *http.Request) error + + // Handler handles a WebSocket connection. + Handler +} + +// ServeHTTP implements the http.Handler interface for a WebSocket +func (s Server) ServeHTTP(w http.ResponseWriter, req *http.Request) { + s.serveWebSocket(w, req) +} + +func (s Server) serveWebSocket(w http.ResponseWriter, req *http.Request) { + rwc, buf, err := w.(http.Hijacker).Hijack() + if err != nil { + panic("Hijack failed: " + err.Error()) + } + // The server should abort the WebSocket connection if it finds + // the client did not send a handshake that matches with protocol + // specification. + defer rwc.Close() + conn, err := newServerConn(rwc, buf, req, &s.Config, s.Handshake) + if err != nil { + return + } + if conn == nil { + panic("unexpected nil conn") + } + s.Handler(conn) +} + +// Handler is a simple interface to a WebSocket browser client. +// It checks if Origin header is valid URL by default. +// You might want to verify websocket.Conn.Config().Origin in the func. +// If you use Server instead of Handler, you could call websocket.Origin and +// check the origin in your Handshake func. So, if you want to accept +// non-browser clients, which do not send an Origin header, set a +// Server.Handshake that does not check the origin. +type Handler func(*Conn) + +func checkOrigin(config *Config, req *http.Request) (err error) { + config.Origin, err = Origin(config, req) + if err == nil && config.Origin == nil { + return fmt.Errorf("null origin") + } + return err +} + +// ServeHTTP implements the http.Handler interface for a WebSocket +func (h Handler) ServeHTTP(w http.ResponseWriter, req *http.Request) { + s := Server{Handler: h, Handshake: checkOrigin} + s.serveWebSocket(w, req) +} diff --git a/vendor/golang.org/x/net/websocket/websocket.go b/vendor/golang.org/x/net/websocket/websocket.go new file mode 100644 index 0000000000..e069b33008 --- /dev/null +++ b/vendor/golang.org/x/net/websocket/websocket.go @@ -0,0 +1,414 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package websocket implements a client and server for the WebSocket protocol +// as specified in RFC 6455. +package websocket // import "golang.org/x/net/websocket" + +import ( + "bufio" + "crypto/tls" + "encoding/json" + "errors" + "io" + "io/ioutil" + "net" + "net/http" + "net/url" + "sync" + "time" +) + +const ( + ProtocolVersionHybi13 = 13 + ProtocolVersionHybi = ProtocolVersionHybi13 + SupportedProtocolVersion = "13" + + ContinuationFrame = 0 + TextFrame = 1 + BinaryFrame = 2 + CloseFrame = 8 + PingFrame = 9 + PongFrame = 10 + UnknownFrame = 255 +) + +// ProtocolError represents WebSocket protocol errors. +type ProtocolError struct { + ErrorString string +} + +func (err *ProtocolError) Error() string { return err.ErrorString } + +var ( + ErrBadProtocolVersion = &ProtocolError{"bad protocol version"} + ErrBadScheme = &ProtocolError{"bad scheme"} + ErrBadStatus = &ProtocolError{"bad status"} + ErrBadUpgrade = &ProtocolError{"missing or bad upgrade"} + ErrBadWebSocketOrigin = &ProtocolError{"missing or bad WebSocket-Origin"} + ErrBadWebSocketLocation = &ProtocolError{"missing or bad WebSocket-Location"} + ErrBadWebSocketProtocol = &ProtocolError{"missing or bad WebSocket-Protocol"} + ErrBadWebSocketVersion = &ProtocolError{"missing or bad WebSocket Version"} + ErrChallengeResponse = &ProtocolError{"mismatch challenge/response"} + ErrBadFrame = &ProtocolError{"bad frame"} + ErrBadFrameBoundary = &ProtocolError{"not on frame boundary"} + ErrNotWebSocket = &ProtocolError{"not websocket protocol"} + ErrBadRequestMethod = &ProtocolError{"bad method"} + ErrNotSupported = &ProtocolError{"not supported"} +) + +// Addr is an implementation of net.Addr for WebSocket. +type Addr struct { + *url.URL +} + +// Network returns the network type for a WebSocket, "websocket". +func (addr *Addr) Network() string { return "websocket" } + +// Config is a WebSocket configuration +type Config struct { + // A WebSocket server address. + Location *url.URL + + // A Websocket client origin. + Origin *url.URL + + // WebSocket subprotocols. + Protocol []string + + // WebSocket protocol version. + Version int + + // TLS config for secure WebSocket (wss). + TlsConfig *tls.Config + + // Additional header fields to be sent in WebSocket opening handshake. + Header http.Header + + handshakeData map[string]string +} + +// serverHandshaker is an interface to handle WebSocket server side handshake. +type serverHandshaker interface { + // ReadHandshake reads handshake request message from client. + // Returns http response code and error if any. + ReadHandshake(buf *bufio.Reader, req *http.Request) (code int, err error) + + // AcceptHandshake accepts the client handshake request and sends + // handshake response back to client. + AcceptHandshake(buf *bufio.Writer) (err error) + + // NewServerConn creates a new WebSocket connection. + NewServerConn(buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) (conn *Conn) +} + +// frameReader is an interface to read a WebSocket frame. +type frameReader interface { + // Reader is to read payload of the frame. + io.Reader + + // PayloadType returns payload type. + PayloadType() byte + + // HeaderReader returns a reader to read header of the frame. + HeaderReader() io.Reader + + // TrailerReader returns a reader to read trailer of the frame. + // If it returns nil, there is no trailer in the frame. + TrailerReader() io.Reader + + // Len returns total length of the frame, including header and trailer. + Len() int +} + +// frameReaderFactory is an interface to creates new frame reader. +type frameReaderFactory interface { + NewFrameReader() (r frameReader, err error) +} + +// frameWriter is an interface to write a WebSocket frame. +type frameWriter interface { + // Writer is to write payload of the frame. + io.WriteCloser +} + +// frameWriterFactory is an interface to create new frame writer. +type frameWriterFactory interface { + NewFrameWriter(payloadType byte) (w frameWriter, err error) +} + +type frameHandler interface { + HandleFrame(frame frameReader) (r frameReader, err error) + WriteClose(status int) (err error) +} + +// Conn represents a WebSocket connection. +// +// Multiple goroutines may invoke methods on a Conn simultaneously. +type Conn struct { + config *Config + request *http.Request + + buf *bufio.ReadWriter + rwc io.ReadWriteCloser + + rio sync.Mutex + frameReaderFactory + frameReader + + wio sync.Mutex + frameWriterFactory + + frameHandler + PayloadType byte + defaultCloseStatus int +} + +// Read implements the io.Reader interface: +// it reads data of a frame from the WebSocket connection. +// if msg is not large enough for the frame data, it fills the msg and next Read +// will read the rest of the frame data. +// it reads Text frame or Binary frame. +func (ws *Conn) Read(msg []byte) (n int, err error) { + ws.rio.Lock() + defer ws.rio.Unlock() +again: + if ws.frameReader == nil { + frame, err := ws.frameReaderFactory.NewFrameReader() + if err != nil { + return 0, err + } + ws.frameReader, err = ws.frameHandler.HandleFrame(frame) + if err != nil { + return 0, err + } + if ws.frameReader == nil { + goto again + } + } + n, err = ws.frameReader.Read(msg) + if err == io.EOF { + if trailer := ws.frameReader.TrailerReader(); trailer != nil { + io.Copy(ioutil.Discard, trailer) + } + ws.frameReader = nil + goto again + } + return n, err +} + +// Write implements the io.Writer interface: +// it writes data as a frame to the WebSocket connection. +func (ws *Conn) Write(msg []byte) (n int, err error) { + ws.wio.Lock() + defer ws.wio.Unlock() + w, err := ws.frameWriterFactory.NewFrameWriter(ws.PayloadType) + if err != nil { + return 0, err + } + n, err = w.Write(msg) + w.Close() + if err != nil { + return n, err + } + return n, err +} + +// Close implements the io.Closer interface. +func (ws *Conn) Close() error { + err := ws.frameHandler.WriteClose(ws.defaultCloseStatus) + err1 := ws.rwc.Close() + if err != nil { + return err + } + return err1 +} + +func (ws *Conn) IsClientConn() bool { return ws.request == nil } +func (ws *Conn) IsServerConn() bool { return ws.request != nil } + +// LocalAddr returns the WebSocket Origin for the connection for client, or +// the WebSocket location for server. +func (ws *Conn) LocalAddr() net.Addr { + if ws.IsClientConn() { + return &Addr{ws.config.Origin} + } + return &Addr{ws.config.Location} +} + +// RemoteAddr returns the WebSocket location for the connection for client, or +// the Websocket Origin for server. +func (ws *Conn) RemoteAddr() net.Addr { + if ws.IsClientConn() { + return &Addr{ws.config.Location} + } + return &Addr{ws.config.Origin} +} + +var errSetDeadline = errors.New("websocket: cannot set deadline: not using a net.Conn") + +// SetDeadline sets the connection's network read & write deadlines. +func (ws *Conn) SetDeadline(t time.Time) error { + if conn, ok := ws.rwc.(net.Conn); ok { + return conn.SetDeadline(t) + } + return errSetDeadline +} + +// SetReadDeadline sets the connection's network read deadline. +func (ws *Conn) SetReadDeadline(t time.Time) error { + if conn, ok := ws.rwc.(net.Conn); ok { + return conn.SetReadDeadline(t) + } + return errSetDeadline +} + +// SetWriteDeadline sets the connection's network write deadline. +func (ws *Conn) SetWriteDeadline(t time.Time) error { + if conn, ok := ws.rwc.(net.Conn); ok { + return conn.SetWriteDeadline(t) + } + return errSetDeadline +} + +// Config returns the WebSocket config. +func (ws *Conn) Config() *Config { return ws.config } + +// Request returns the http request upgraded to the WebSocket. +// It is nil for client side. +func (ws *Conn) Request() *http.Request { return ws.request } + +// Codec represents a symmetric pair of functions that implement a codec. +type Codec struct { + Marshal func(v interface{}) (data []byte, payloadType byte, err error) + Unmarshal func(data []byte, payloadType byte, v interface{}) (err error) +} + +// Send sends v marshaled by cd.Marshal as single frame to ws. +func (cd Codec) Send(ws *Conn, v interface{}) (err error) { + data, payloadType, err := cd.Marshal(v) + if err != nil { + return err + } + ws.wio.Lock() + defer ws.wio.Unlock() + w, err := ws.frameWriterFactory.NewFrameWriter(payloadType) + if err != nil { + return err + } + _, err = w.Write(data) + w.Close() + return err +} + +// Receive receives single frame from ws, unmarshaled by cd.Unmarshal and stores in v. +func (cd Codec) Receive(ws *Conn, v interface{}) (err error) { + ws.rio.Lock() + defer ws.rio.Unlock() + if ws.frameReader != nil { + _, err = io.Copy(ioutil.Discard, ws.frameReader) + if err != nil { + return err + } + ws.frameReader = nil + } +again: + frame, err := ws.frameReaderFactory.NewFrameReader() + if err != nil { + return err + } + frame, err = ws.frameHandler.HandleFrame(frame) + if err != nil { + return err + } + if frame == nil { + goto again + } + payloadType := frame.PayloadType() + data, err := ioutil.ReadAll(frame) + if err != nil { + return err + } + return cd.Unmarshal(data, payloadType, v) +} + +func marshal(v interface{}) (msg []byte, payloadType byte, err error) { + switch data := v.(type) { + case string: + return []byte(data), TextFrame, nil + case []byte: + return data, BinaryFrame, nil + } + return nil, UnknownFrame, ErrNotSupported +} + +func unmarshal(msg []byte, payloadType byte, v interface{}) (err error) { + switch data := v.(type) { + case *string: + *data = string(msg) + return nil + case *[]byte: + *data = msg + return nil + } + return ErrNotSupported +} + +/* +Message is a codec to send/receive text/binary data in a frame on WebSocket connection. +To send/receive text frame, use string type. +To send/receive binary frame, use []byte type. + +Trivial usage: + + import "websocket" + + // receive text frame + var message string + websocket.Message.Receive(ws, &message) + + // send text frame + message = "hello" + websocket.Message.Send(ws, message) + + // receive binary frame + var data []byte + websocket.Message.Receive(ws, &data) + + // send binary frame + data = []byte{0, 1, 2} + websocket.Message.Send(ws, data) + +*/ +var Message = Codec{marshal, unmarshal} + +func jsonMarshal(v interface{}) (msg []byte, payloadType byte, err error) { + msg, err = json.Marshal(v) + return msg, TextFrame, err +} + +func jsonUnmarshal(msg []byte, payloadType byte, v interface{}) (err error) { + return json.Unmarshal(msg, v) +} + +/* +JSON is a codec to send/receive JSON data in a frame from a WebSocket connection. + +Trivial usage: + + import "websocket" + + type T struct { + Msg string + Count int + } + + // receive JSON type T + var data T + websocket.JSON.Receive(ws, &data) + + // send JSON type T + websocket.JSON.Send(ws, data) +*/ +var JSON = Codec{jsonMarshal, jsonUnmarshal} diff --git a/vendor/golang.org/x/net/websocket/websocket_test.go b/vendor/golang.org/x/net/websocket/websocket_test.go new file mode 100644 index 0000000000..05b7e5356e --- /dev/null +++ b/vendor/golang.org/x/net/websocket/websocket_test.go @@ -0,0 +1,587 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package websocket + +import ( + "bytes" + "fmt" + "io" + "log" + "net" + "net/http" + "net/http/httptest" + "net/url" + "reflect" + "runtime" + "strings" + "sync" + "testing" + "time" +) + +var serverAddr string +var once sync.Once + +func echoServer(ws *Conn) { + defer ws.Close() + io.Copy(ws, ws) +} + +type Count struct { + S string + N int +} + +func countServer(ws *Conn) { + defer ws.Close() + for { + var count Count + err := JSON.Receive(ws, &count) + if err != nil { + return + } + count.N++ + count.S = strings.Repeat(count.S, count.N) + err = JSON.Send(ws, count) + if err != nil { + return + } + } +} + +type testCtrlAndDataHandler struct { + hybiFrameHandler +} + +func (h *testCtrlAndDataHandler) WritePing(b []byte) (int, error) { + h.hybiFrameHandler.conn.wio.Lock() + defer h.hybiFrameHandler.conn.wio.Unlock() + w, err := h.hybiFrameHandler.conn.frameWriterFactory.NewFrameWriter(PingFrame) + if err != nil { + return 0, err + } + n, err := w.Write(b) + w.Close() + return n, err +} + +func ctrlAndDataServer(ws *Conn) { + defer ws.Close() + h := &testCtrlAndDataHandler{hybiFrameHandler: hybiFrameHandler{conn: ws}} + ws.frameHandler = h + + go func() { + for i := 0; ; i++ { + var b []byte + if i%2 != 0 { // with or without payload + b = []byte(fmt.Sprintf("#%d-CONTROL-FRAME-FROM-SERVER", i)) + } + if _, err := h.WritePing(b); err != nil { + break + } + if _, err := h.WritePong(b); err != nil { // unsolicited pong + break + } + time.Sleep(10 * time.Millisecond) + } + }() + + b := make([]byte, 128) + for { + n, err := ws.Read(b) + if err != nil { + break + } + if _, err := ws.Write(b[:n]); err != nil { + break + } + } +} + +func subProtocolHandshake(config *Config, req *http.Request) error { + for _, proto := range config.Protocol { + if proto == "chat" { + config.Protocol = []string{proto} + return nil + } + } + return ErrBadWebSocketProtocol +} + +func subProtoServer(ws *Conn) { + for _, proto := range ws.Config().Protocol { + io.WriteString(ws, proto) + } +} + +func startServer() { + http.Handle("/echo", Handler(echoServer)) + http.Handle("/count", Handler(countServer)) + http.Handle("/ctrldata", Handler(ctrlAndDataServer)) + subproto := Server{ + Handshake: subProtocolHandshake, + Handler: Handler(subProtoServer), + } + http.Handle("/subproto", subproto) + server := httptest.NewServer(nil) + serverAddr = server.Listener.Addr().String() + log.Print("Test WebSocket server listening on ", serverAddr) +} + +func newConfig(t *testing.T, path string) *Config { + config, _ := NewConfig(fmt.Sprintf("ws://%s%s", serverAddr, path), "http://localhost") + return config +} + +func TestEcho(t *testing.T) { + once.Do(startServer) + + // websocket.Dial() + client, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + conn, err := NewClient(newConfig(t, "/echo"), client) + if err != nil { + t.Errorf("WebSocket handshake error: %v", err) + return + } + + msg := []byte("hello, world\n") + if _, err := conn.Write(msg); err != nil { + t.Errorf("Write: %v", err) + } + var actual_msg = make([]byte, 512) + n, err := conn.Read(actual_msg) + if err != nil { + t.Errorf("Read: %v", err) + } + actual_msg = actual_msg[0:n] + if !bytes.Equal(msg, actual_msg) { + t.Errorf("Echo: expected %q got %q", msg, actual_msg) + } + conn.Close() +} + +func TestAddr(t *testing.T) { + once.Do(startServer) + + // websocket.Dial() + client, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + conn, err := NewClient(newConfig(t, "/echo"), client) + if err != nil { + t.Errorf("WebSocket handshake error: %v", err) + return + } + + ra := conn.RemoteAddr().String() + if !strings.HasPrefix(ra, "ws://") || !strings.HasSuffix(ra, "/echo") { + t.Errorf("Bad remote addr: %v", ra) + } + la := conn.LocalAddr().String() + if !strings.HasPrefix(la, "http://") { + t.Errorf("Bad local addr: %v", la) + } + conn.Close() +} + +func TestCount(t *testing.T) { + once.Do(startServer) + + // websocket.Dial() + client, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + conn, err := NewClient(newConfig(t, "/count"), client) + if err != nil { + t.Errorf("WebSocket handshake error: %v", err) + return + } + + var count Count + count.S = "hello" + if err := JSON.Send(conn, count); err != nil { + t.Errorf("Write: %v", err) + } + if err := JSON.Receive(conn, &count); err != nil { + t.Errorf("Read: %v", err) + } + if count.N != 1 { + t.Errorf("count: expected %d got %d", 1, count.N) + } + if count.S != "hello" { + t.Errorf("count: expected %q got %q", "hello", count.S) + } + if err := JSON.Send(conn, count); err != nil { + t.Errorf("Write: %v", err) + } + if err := JSON.Receive(conn, &count); err != nil { + t.Errorf("Read: %v", err) + } + if count.N != 2 { + t.Errorf("count: expected %d got %d", 2, count.N) + } + if count.S != "hellohello" { + t.Errorf("count: expected %q got %q", "hellohello", count.S) + } + conn.Close() +} + +func TestWithQuery(t *testing.T) { + once.Do(startServer) + + client, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + + config := newConfig(t, "/echo") + config.Location, err = url.ParseRequestURI(fmt.Sprintf("ws://%s/echo?q=v", serverAddr)) + if err != nil { + t.Fatal("location url", err) + } + + ws, err := NewClient(config, client) + if err != nil { + t.Errorf("WebSocket handshake: %v", err) + return + } + ws.Close() +} + +func testWithProtocol(t *testing.T, subproto []string) (string, error) { + once.Do(startServer) + + client, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + + config := newConfig(t, "/subproto") + config.Protocol = subproto + + ws, err := NewClient(config, client) + if err != nil { + return "", err + } + msg := make([]byte, 16) + n, err := ws.Read(msg) + if err != nil { + return "", err + } + ws.Close() + return string(msg[:n]), nil +} + +func TestWithProtocol(t *testing.T) { + proto, err := testWithProtocol(t, []string{"chat"}) + if err != nil { + t.Errorf("SubProto: unexpected error: %v", err) + } + if proto != "chat" { + t.Errorf("SubProto: expected %q, got %q", "chat", proto) + } +} + +func TestWithTwoProtocol(t *testing.T) { + proto, err := testWithProtocol(t, []string{"test", "chat"}) + if err != nil { + t.Errorf("SubProto: unexpected error: %v", err) + } + if proto != "chat" { + t.Errorf("SubProto: expected %q, got %q", "chat", proto) + } +} + +func TestWithBadProtocol(t *testing.T) { + _, err := testWithProtocol(t, []string{"test"}) + if err != ErrBadStatus { + t.Errorf("SubProto: expected %v, got %v", ErrBadStatus, err) + } +} + +func TestHTTP(t *testing.T) { + once.Do(startServer) + + // If the client did not send a handshake that matches the protocol + // specification, the server MUST return an HTTP response with an + // appropriate error code (such as 400 Bad Request) + resp, err := http.Get(fmt.Sprintf("http://%s/echo", serverAddr)) + if err != nil { + t.Errorf("Get: error %#v", err) + return + } + if resp == nil { + t.Error("Get: resp is null") + return + } + if resp.StatusCode != http.StatusBadRequest { + t.Errorf("Get: expected %q got %q", http.StatusBadRequest, resp.StatusCode) + } +} + +func TestTrailingSpaces(t *testing.T) { + // http://code.google.com/p/go/issues/detail?id=955 + // The last runs of this create keys with trailing spaces that should not be + // generated by the client. + once.Do(startServer) + config := newConfig(t, "/echo") + for i := 0; i < 30; i++ { + // body + ws, err := DialConfig(config) + if err != nil { + t.Errorf("Dial #%d failed: %v", i, err) + break + } + ws.Close() + } +} + +func TestDialConfigBadVersion(t *testing.T) { + once.Do(startServer) + config := newConfig(t, "/echo") + config.Version = 1234 + + _, err := DialConfig(config) + + if dialerr, ok := err.(*DialError); ok { + if dialerr.Err != ErrBadProtocolVersion { + t.Errorf("dial expected err %q but got %q", ErrBadProtocolVersion, dialerr.Err) + } + } +} + +func TestSmallBuffer(t *testing.T) { + // http://code.google.com/p/go/issues/detail?id=1145 + // Read should be able to handle reading a fragment of a frame. + once.Do(startServer) + + // websocket.Dial() + client, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + conn, err := NewClient(newConfig(t, "/echo"), client) + if err != nil { + t.Errorf("WebSocket handshake error: %v", err) + return + } + + msg := []byte("hello, world\n") + if _, err := conn.Write(msg); err != nil { + t.Errorf("Write: %v", err) + } + var small_msg = make([]byte, 8) + n, err := conn.Read(small_msg) + if err != nil { + t.Errorf("Read: %v", err) + } + if !bytes.Equal(msg[:len(small_msg)], small_msg) { + t.Errorf("Echo: expected %q got %q", msg[:len(small_msg)], small_msg) + } + var second_msg = make([]byte, len(msg)) + n, err = conn.Read(second_msg) + if err != nil { + t.Errorf("Read: %v", err) + } + second_msg = second_msg[0:n] + if !bytes.Equal(msg[len(small_msg):], second_msg) { + t.Errorf("Echo: expected %q got %q", msg[len(small_msg):], second_msg) + } + conn.Close() +} + +var parseAuthorityTests = []struct { + in *url.URL + out string +}{ + { + &url.URL{ + Scheme: "ws", + Host: "www.google.com", + }, + "www.google.com:80", + }, + { + &url.URL{ + Scheme: "wss", + Host: "www.google.com", + }, + "www.google.com:443", + }, + { + &url.URL{ + Scheme: "ws", + Host: "www.google.com:80", + }, + "www.google.com:80", + }, + { + &url.URL{ + Scheme: "wss", + Host: "www.google.com:443", + }, + "www.google.com:443", + }, + // some invalid ones for parseAuthority. parseAuthority doesn't + // concern itself with the scheme unless it actually knows about it + { + &url.URL{ + Scheme: "http", + Host: "www.google.com", + }, + "www.google.com", + }, + { + &url.URL{ + Scheme: "http", + Host: "www.google.com:80", + }, + "www.google.com:80", + }, + { + &url.URL{ + Scheme: "asdf", + Host: "127.0.0.1", + }, + "127.0.0.1", + }, + { + &url.URL{ + Scheme: "asdf", + Host: "www.google.com", + }, + "www.google.com", + }, +} + +func TestParseAuthority(t *testing.T) { + for _, tt := range parseAuthorityTests { + out := parseAuthority(tt.in) + if out != tt.out { + t.Errorf("got %v; want %v", out, tt.out) + } + } +} + +type closerConn struct { + net.Conn + closed int // count of the number of times Close was called +} + +func (c *closerConn) Close() error { + c.closed++ + return c.Conn.Close() +} + +func TestClose(t *testing.T) { + if runtime.GOOS == "plan9" { + t.Skip("see golang.org/issue/11454") + } + + once.Do(startServer) + + conn, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal("dialing", err) + } + + cc := closerConn{Conn: conn} + + client, err := NewClient(newConfig(t, "/echo"), &cc) + if err != nil { + t.Fatalf("WebSocket handshake: %v", err) + } + + // set the deadline to ten minutes ago, which will have expired by the time + // client.Close sends the close status frame. + conn.SetDeadline(time.Now().Add(-10 * time.Minute)) + + if err := client.Close(); err == nil { + t.Errorf("ws.Close(): expected error, got %v", err) + } + if cc.closed < 1 { + t.Fatalf("ws.Close(): expected underlying ws.rwc.Close to be called > 0 times, got: %v", cc.closed) + } +} + +var originTests = []struct { + req *http.Request + origin *url.URL +}{ + { + req: &http.Request{ + Header: http.Header{ + "Origin": []string{"http://www.example.com"}, + }, + }, + origin: &url.URL{ + Scheme: "http", + Host: "www.example.com", + }, + }, + { + req: &http.Request{}, + }, +} + +func TestOrigin(t *testing.T) { + conf := newConfig(t, "/echo") + conf.Version = ProtocolVersionHybi13 + for i, tt := range originTests { + origin, err := Origin(conf, tt.req) + if err != nil { + t.Error(err) + continue + } + if !reflect.DeepEqual(origin, tt.origin) { + t.Errorf("#%d: got origin %v; want %v", i, origin, tt.origin) + continue + } + } +} + +func TestCtrlAndData(t *testing.T) { + once.Do(startServer) + + c, err := net.Dial("tcp", serverAddr) + if err != nil { + t.Fatal(err) + } + ws, err := NewClient(newConfig(t, "/ctrldata"), c) + if err != nil { + t.Fatal(err) + } + defer ws.Close() + + h := &testCtrlAndDataHandler{hybiFrameHandler: hybiFrameHandler{conn: ws}} + ws.frameHandler = h + + b := make([]byte, 128) + for i := 0; i < 2; i++ { + data := []byte(fmt.Sprintf("#%d-DATA-FRAME-FROM-CLIENT", i)) + if _, err := ws.Write(data); err != nil { + t.Fatalf("#%d: %v", i, err) + } + var ctrl []byte + if i%2 != 0 { // with or without payload + ctrl = []byte(fmt.Sprintf("#%d-CONTROL-FRAME-FROM-CLIENT", i)) + } + if _, err := h.WritePing(ctrl); err != nil { + t.Fatalf("#%d: %v", i, err) + } + n, err := ws.Read(b) + if err != nil { + t.Fatalf("#%d: %v", i, err) + } + if !bytes.Equal(b[:n], data) { + t.Fatalf("#%d: got %v; want %v", i, b[:n], data) + } + } +} diff --git a/vendor/golang.org/x/net/xsrftoken/xsrf.go b/vendor/golang.org/x/net/xsrftoken/xsrf.go new file mode 100644 index 0000000000..8d2187872d --- /dev/null +++ b/vendor/golang.org/x/net/xsrftoken/xsrf.go @@ -0,0 +1,88 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package xsrftoken provides methods for generating and validating secure XSRF tokens. +package xsrftoken // import "golang.org/x/net/xsrftoken" + +import ( + "crypto/hmac" + "crypto/sha1" + "crypto/subtle" + "encoding/base64" + "fmt" + "strconv" + "strings" + "time" +) + +// Timeout is the duration for which XSRF tokens are valid. +// It is exported so clients may set cookie timeouts that match generated tokens. +const Timeout = 24 * time.Hour + +// clean sanitizes a string for inclusion in a token by replacing all ":"s. +func clean(s string) string { + return strings.Replace(s, ":", "_", -1) +} + +// Generate returns a URL-safe secure XSRF token that expires in 24 hours. +// +// key is a secret key for your application. +// userID is a unique identifier for the user. +// actionID is the action the user is taking (e.g. POSTing to a particular path). +func Generate(key, userID, actionID string) string { + return generateTokenAtTime(key, userID, actionID, time.Now()) +} + +// generateTokenAtTime is like Generate, but returns a token that expires 24 hours from now. +func generateTokenAtTime(key, userID, actionID string, now time.Time) string { + // Round time up and convert to milliseconds. + milliTime := (now.UnixNano() + 1e6 - 1) / 1e6 + + h := hmac.New(sha1.New, []byte(key)) + fmt.Fprintf(h, "%s:%s:%d", clean(userID), clean(actionID), milliTime) + + // Get the padded base64 string then removing the padding. + tok := string(h.Sum(nil)) + tok = base64.URLEncoding.EncodeToString([]byte(tok)) + tok = strings.TrimRight(tok, "=") + + return fmt.Sprintf("%s:%d", tok, milliTime) +} + +// Valid reports whether a token is a valid, unexpired token returned by Generate. +func Valid(token, key, userID, actionID string) bool { + return validTokenAtTime(token, key, userID, actionID, time.Now()) +} + +// validTokenAtTime reports whether a token is valid at the given time. +func validTokenAtTime(token, key, userID, actionID string, now time.Time) bool { + // Extract the issue time of the token. + sep := strings.LastIndex(token, ":") + if sep < 0 { + return false + } + millis, err := strconv.ParseInt(token[sep+1:], 10, 64) + if err != nil { + return false + } + issueTime := time.Unix(0, millis*1e6) + + // Check that the token is not expired. + if now.Sub(issueTime) >= Timeout { + return false + } + + // Check that the token is not from the future. + // Allow 1 minute grace period in case the token is being verified on a + // machine whose clock is behind the machine that issued the token. + if issueTime.After(now.Add(1 * time.Minute)) { + return false + } + + expected := generateTokenAtTime(key, userID, actionID, issueTime) + + // Check that the token matches the expected value. + // Use constant time comparison to avoid timing attacks. + return subtle.ConstantTimeCompare([]byte(token), []byte(expected)) == 1 +} diff --git a/vendor/golang.org/x/net/xsrftoken/xsrf_test.go b/vendor/golang.org/x/net/xsrftoken/xsrf_test.go new file mode 100644 index 0000000000..9933f86713 --- /dev/null +++ b/vendor/golang.org/x/net/xsrftoken/xsrf_test.go @@ -0,0 +1,83 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xsrftoken + +import ( + "encoding/base64" + "testing" + "time" +) + +const ( + key = "quay" + userID = "12345678" + actionID = "POST /form" +) + +var ( + now = time.Now() + oneMinuteFromNow = now.Add(1 * time.Minute) +) + +func TestValidToken(t *testing.T) { + tok := generateTokenAtTime(key, userID, actionID, now) + if !validTokenAtTime(tok, key, userID, actionID, oneMinuteFromNow) { + t.Error("One second later: Expected token to be valid") + } + if !validTokenAtTime(tok, key, userID, actionID, now.Add(Timeout-1*time.Nanosecond)) { + t.Error("Just before timeout: Expected token to be valid") + } + if !validTokenAtTime(tok, key, userID, actionID, now.Add(-1*time.Minute+1*time.Millisecond)) { + t.Error("One minute in the past: Expected token to be valid") + } +} + +// TestSeparatorReplacement tests that separators are being correctly substituted +func TestSeparatorReplacement(t *testing.T) { + tok := generateTokenAtTime("foo:bar", "baz", "wah", now) + tok2 := generateTokenAtTime("foo", "bar:baz", "wah", now) + if tok == tok2 { + t.Errorf("Expected generated tokens to be different") + } +} + +func TestInvalidToken(t *testing.T) { + invalidTokenTests := []struct { + name, key, userID, actionID string + t time.Time + }{ + {"Bad key", "foobar", userID, actionID, oneMinuteFromNow}, + {"Bad userID", key, "foobar", actionID, oneMinuteFromNow}, + {"Bad actionID", key, userID, "foobar", oneMinuteFromNow}, + {"Expired", key, userID, actionID, now.Add(Timeout + 1*time.Millisecond)}, + {"More than 1 minute from the future", key, userID, actionID, now.Add(-1*time.Nanosecond - 1*time.Minute)}, + } + + tok := generateTokenAtTime(key, userID, actionID, now) + for _, itt := range invalidTokenTests { + if validTokenAtTime(tok, itt.key, itt.userID, itt.actionID, itt.t) { + t.Errorf("%v: Expected token to be invalid", itt.name) + } + } +} + +// TestValidateBadData primarily tests that no unexpected panics are triggered +// during parsing +func TestValidateBadData(t *testing.T) { + badDataTests := []struct { + name, tok string + }{ + {"Invalid Base64", "ASDab24(@)$*=="}, + {"No delimiter", base64.URLEncoding.EncodeToString([]byte("foobar12345678"))}, + {"Invalid time", base64.URLEncoding.EncodeToString([]byte("foobar:foobar"))}, + {"Wrong length", "1234" + generateTokenAtTime(key, userID, actionID, now)}, + } + + for _, bdt := range badDataTests { + if validTokenAtTime(bdt.tok, key, userID, actionID, oneMinuteFromNow) { + t.Errorf("%v: Expected token to be invalid", bdt.name) + } + } +} diff --git a/vendor/golang.org/x/text/.gitattributes b/vendor/golang.org/x/text/.gitattributes new file mode 100644 index 0000000000..d2f212e5da --- /dev/null +++ b/vendor/golang.org/x/text/.gitattributes @@ -0,0 +1,10 @@ +# Treat all files in this repo as binary, with no git magic updating +# line endings. Windows users contributing to Go will need to use a +# modern version of git and editors capable of LF line endings. +# +# We'll prevent accidental CRLF line endings from entering the repo +# via the git-review gofmt checks. +# +# See golang.org/issue/9281 + +* -text diff --git a/vendor/golang.org/x/text/.gitignore b/vendor/golang.org/x/text/.gitignore new file mode 100644 index 0000000000..5a9d62efd4 --- /dev/null +++ b/vendor/golang.org/x/text/.gitignore @@ -0,0 +1,2 @@ +# Add no patterns to .gitignore except for files generated by the build. +last-change diff --git a/vendor/golang.org/x/text/AUTHORS b/vendor/golang.org/x/text/AUTHORS new file mode 100644 index 0000000000..15167cd746 --- /dev/null +++ b/vendor/golang.org/x/text/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/text/CONTRIBUTING.md b/vendor/golang.org/x/text/CONTRIBUTING.md new file mode 100644 index 0000000000..88dff59bc7 --- /dev/null +++ b/vendor/golang.org/x/text/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# Contributing to Go + +Go is an open source project. + +It is the work of hundreds of contributors. We appreciate your help! + + +## Filing issues + +When [filing an issue](https://golang.org/issue/new), make sure to answer these five questions: + +1. What version of Go are you using (`go version`)? +2. What operating system and processor architecture are you using? +3. What did you do? +4. What did you expect to see? +5. What did you see instead? + +General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker. +The gophers there will answer or ask you to file an issue if you've tripped over a bug. + +## Contributing code + +Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html) +before sending patches. + +**We do not accept GitHub pull requests** +(we use [Gerrit](https://code.google.com/p/gerrit/) instead for code review). + +Unless otherwise noted, the Go source files are distributed under +the BSD-style license found in the LICENSE file. + diff --git a/vendor/golang.org/x/text/CONTRIBUTORS b/vendor/golang.org/x/text/CONTRIBUTORS new file mode 100644 index 0000000000..1c4577e968 --- /dev/null +++ b/vendor/golang.org/x/text/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/text/LICENSE b/vendor/golang.org/x/text/LICENSE new file mode 100644 index 0000000000..6a66aea5ea --- /dev/null +++ b/vendor/golang.org/x/text/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/text/PATENTS b/vendor/golang.org/x/text/PATENTS new file mode 100644 index 0000000000..733099041f --- /dev/null +++ b/vendor/golang.org/x/text/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/text/README b/vendor/golang.org/x/text/README new file mode 100644 index 0000000000..9ec24ea4c6 --- /dev/null +++ b/vendor/golang.org/x/text/README @@ -0,0 +1,3 @@ +This repository holds supplementary Go libraries for text processing, many involving Unicode. + +To submit changes to this repository, see http://golang.org/doc/contribute.html. diff --git a/vendor/golang.org/x/text/cases/cases.go b/vendor/golang.org/x/text/cases/cases.go new file mode 100644 index 0000000000..60a58d514c --- /dev/null +++ b/vendor/golang.org/x/text/cases/cases.go @@ -0,0 +1,129 @@ +// 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. + +//go:generate go run gen.go gen_trieval.go + +// Package cases provides general and language-specific case mappers. +package cases // import "golang.org/x/text/cases" + +import ( + "golang.org/x/text/language" + "golang.org/x/text/transform" +) + +// References: +// - Unicode Reference Manual Chapter 3.13, 4.2, and 5.18. +// - http://www.unicode.org/reports/tr29/ +// - http://www.unicode.org/Public/6.3.0/ucd/CaseFolding.txt +// - http://www.unicode.org/Public/6.3.0/ucd/SpecialCasing.txt +// - http://www.unicode.org/Public/6.3.0/ucd/DerivedCoreProperties.txt +// - http://www.unicode.org/Public/6.3.0/ucd/auxiliary/WordBreakProperty.txt +// - http://www.unicode.org/Public/6.3.0/ucd/auxiliary/WordBreakTest.txt +// - http://userguide.icu-project.org/transforms/casemappings + +// TODO: +// - Case folding +// - Wide and Narrow? +// - Segmenter option for title casing. +// - ASCII fast paths +// - Encode Soft-Dotted property within trie somehow. + +// A Caser transforms given input to a certain case. It implements +// transform.Transformer. +// +// A Caser may be stateful and should therefore not be shared between +// goroutines. +type Caser struct { + t transform.Transformer +} + +// Bytes returns a new byte slice with the result of converting b to the case +// form implemented by c. +func (c Caser) Bytes(b []byte) []byte { + b, _, _ = transform.Bytes(c.t, b) + return b +} + +// String returns a string with the result of transforming s to the case form +// implemented by c. +func (c Caser) String(s string) string { + s, _, _ = transform.String(c.t, s) + return s +} + +// Reset resets the Caser to be reused for new input after a previous call to +// Transform. +func (c Caser) Reset() { c.t.Reset() } + +// Transform implements the Transformer interface and transforms the given input +// to the case form implemented by c. +func (c Caser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + return c.t.Transform(dst, src, atEOF) +} + +// Upper returns a Caser for language-specific uppercasing. +func Upper(t language.Tag, opts ...Option) Caser { + return Caser{makeUpper(t, getOpts(opts...))} +} + +// Lower returns a Caser for language-specific lowercasing. +func Lower(t language.Tag, opts ...Option) Caser { + return Caser{makeLower(t, getOpts(opts...))} +} + +// Title returns a Caser for language-specific title casing. It uses an +// approximation of the default Unicode Word Break algorithm. +func Title(t language.Tag, opts ...Option) Caser { + return Caser{makeTitle(t, getOpts(opts...))} +} + +// Fold returns a Caser that implements Unicode case folding. The returned Caser +// is stateless and safe to use concurrently by multiple goroutines. +// +// Case folding does not normalize the input and may not preserve a normal form. +// Use the collate or search package for more convenient and linguistically +// sound comparisons. Use unicode/precis for string comparisons where security +// aspects are a concern. +func Fold(opts ...Option) Caser { + return Caser{makeFold(getOpts(opts...))} +} + +// An Option is used to modify the behavior of a Caser. +type Option func(o *options) + +var ( + // NoLower disables the lowercasing of non-leading letters for a title + // caser. + NoLower Option = noLower + + // Compact omits mappings in case folding for characters that would grow the + // input. (Unimplemented.) + Compact Option = compact +) + +// TODO: option to preserve a normal form, if applicable? + +type options struct { + noLower bool + simple bool + + // TODO: segmenter, max ignorable, alternative versions, etc. + + noFinalSigma bool // Only used for testing. +} + +func getOpts(o ...Option) (res options) { + for _, f := range o { + f(&res) + } + return +} + +func noLower(o *options) { + o.noLower = true +} + +func compact(o *options) { + o.simple = true +} diff --git a/vendor/golang.org/x/text/cases/context.go b/vendor/golang.org/x/text/cases/context.go new file mode 100644 index 0000000000..0d2e497ebc --- /dev/null +++ b/vendor/golang.org/x/text/cases/context.go @@ -0,0 +1,281 @@ +// 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 cases + +import ( + "golang.org/x/text/transform" +) + +// A context is used for iterating over source bytes, fetching case info and +// writing to a destination buffer. +// +// Casing operations may need more than one rune of context to decide how a rune +// should be cased. Casing implementations should call checkpoint on context +// whenever it is known to be safe to return the runes processed so far. +// +// It is recommended for implementations to not allow for more than 30 case +// ignorables as lookahead (analogous to the limit in norm) and to use state if +// unbounded lookahead is needed for cased runes. +type context struct { + dst, src []byte + atEOF bool + + pDst int // pDst points past the last written rune in dst. + pSrc int // pSrc points to the start of the currently scanned rune. + + // checkpoints safe to return in Transform, where nDst <= pDst and nSrc <= pSrc. + nDst, nSrc int + err error + + sz int // size of current rune + info info // case information of currently scanned rune + + // State preserved across calls to Transform. + isMidWord bool // false if next cased letter needs to be title-cased. +} + +func (c *context) Reset() { + c.isMidWord = false +} + +// ret returns the return values for the Transform method. It checks whether +// there were insufficient bytes in src to complete and introduces an error +// accordingly, if necessary. +func (c *context) ret() (nDst, nSrc int, err error) { + if c.err != nil || c.nSrc == len(c.src) { + return c.nDst, c.nSrc, c.err + } + // This point is only reached by mappers if there was no short destination + // buffer. This means that the source buffer was exhausted and that c.sz was + // set to 0 by next. + if c.atEOF && c.pSrc == len(c.src) { + return c.pDst, c.pSrc, nil + } + return c.nDst, c.nSrc, transform.ErrShortSrc +} + +// checkpoint sets the return value buffer points for Transform to the current +// positions. +func (c *context) checkpoint() { + if c.err == nil { + c.nDst, c.nSrc = c.pDst, c.pSrc+c.sz + } +} + +// unreadRune causes the last rune read by next to be reread on the next +// invocation of next. Only one unreadRune may be called after a call to next. +func (c *context) unreadRune() { + c.sz = 0 +} + +func (c *context) next() bool { + c.pSrc += c.sz + if c.pSrc == len(c.src) || c.err != nil { + c.info, c.sz = 0, 0 + return false + } + v, sz := trie.lookup(c.src[c.pSrc:]) + c.info, c.sz = info(v), sz + if c.sz == 0 { + if c.atEOF { + // A zero size means we have an incomplete rune. If we are atEOF, + // this means it is an illegal rune, which we will consume one + // byte at a time. + c.sz = 1 + } else { + c.err = transform.ErrShortSrc + return false + } + } + return true +} + +// writeBytes adds bytes to dst. +func (c *context) writeBytes(b []byte) bool { + if len(c.dst)-c.pDst < len(b) { + c.err = transform.ErrShortDst + return false + } + // This loop is faster than using copy. + for _, ch := range b { + c.dst[c.pDst] = ch + c.pDst++ + } + return true +} + +// writeString writes the given string to dst. +func (c *context) writeString(s string) bool { + if len(c.dst)-c.pDst < len(s) { + c.err = transform.ErrShortDst + return false + } + // This loop is faster than using copy. + for i := 0; i < len(s); i++ { + c.dst[c.pDst] = s[i] + c.pDst++ + } + return true +} + +// copy writes the current rune to dst. +func (c *context) copy() bool { + return c.writeBytes(c.src[c.pSrc : c.pSrc+c.sz]) +} + +// copyXOR copies the current rune to dst and modifies it by applying the XOR +// pattern of the case info. It is the responsibility of the caller to ensure +// that this is a rune with a XOR pattern defined. +func (c *context) copyXOR() bool { + if !c.copy() { + return false + } + if c.info&xorIndexBit == 0 { + // Fast path for 6-bit XOR pattern, which covers most cases. + c.dst[c.pDst-1] ^= byte(c.info >> xorShift) + } else { + // Interpret XOR bits as an index. + // TODO: test performance for unrolling this loop. Verify that we have + // at least two bytes and at most three. + idx := c.info >> xorShift + for p := c.pDst - 1; ; p-- { + c.dst[p] ^= xorData[idx] + idx-- + if xorData[idx] == 0 { + break + } + } + } + return true +} + +// hasPrefix returns true if src[pSrc:] starts with the given string. +func (c *context) hasPrefix(s string) bool { + b := c.src[c.pSrc:] + if len(b) < len(s) { + return false + } + for i, c := range b[:len(s)] { + if c != s[i] { + return false + } + } + return true +} + +// caseType returns an info with only the case bits, normalized to either +// cLower, cUpper, cTitle or cUncased. +func (c *context) caseType() info { + cm := c.info & 0x7 + if cm < 4 { + return cm + } + if cm >= cXORCase { + // xor the last bit of the rune with the case type bits. + b := c.src[c.pSrc+c.sz-1] + return info(b&1) ^ cm&0x3 + } + if cm == cIgnorableCased { + return cLower + } + return cUncased +} + +// lower writes the lowercase version of the current rune to dst. +func lower(c *context) bool { + ct := c.caseType() + if c.info&hasMappingMask == 0 || ct == cLower { + return c.copy() + } + if c.info&exceptionBit == 0 { + return c.copyXOR() + } + e := exceptions[c.info>>exceptionShift:] + offset := 2 + e[0]&lengthMask // size of header + fold string + if nLower := (e[1] >> lengthBits) & lengthMask; nLower != noChange { + return c.writeString(e[offset : offset+nLower]) + } + return c.copy() +} + +// upper writes the uppercase version of the current rune to dst. +func upper(c *context) bool { + ct := c.caseType() + if c.info&hasMappingMask == 0 || ct == cUpper { + return c.copy() + } + if c.info&exceptionBit == 0 { + return c.copyXOR() + } + e := exceptions[c.info>>exceptionShift:] + offset := 2 + e[0]&lengthMask // size of header + fold string + // Get length of first special case mapping. + n := (e[1] >> lengthBits) & lengthMask + if ct == cTitle { + // The first special case mapping is for lower. Set n to the second. + if n == noChange { + n = 0 + } + n, e = e[1]&lengthMask, e[n:] + } + if n != noChange { + return c.writeString(e[offset : offset+n]) + } + return c.copy() +} + +// title writes the title case version of the current rune to dst. +func title(c *context) bool { + ct := c.caseType() + if c.info&hasMappingMask == 0 || ct == cTitle { + return c.copy() + } + if c.info&exceptionBit == 0 { + if ct == cLower { + return c.copyXOR() + } + return c.copy() + } + // Get the exception data. + e := exceptions[c.info>>exceptionShift:] + offset := 2 + e[0]&lengthMask // size of header + fold string + + nFirst := (e[1] >> lengthBits) & lengthMask + if nTitle := e[1] & lengthMask; nTitle != noChange { + if nFirst != noChange { + e = e[nFirst:] + } + return c.writeString(e[offset : offset+nTitle]) + } + if ct == cLower && nFirst != noChange { + // Use the uppercase version instead. + return c.writeString(e[offset : offset+nFirst]) + } + // Already in correct case. + return c.copy() +} + +// foldFull writes the foldFull version of the current rune to dst. +func foldFull(c *context) bool { + if c.info&hasMappingMask == 0 { + return c.copy() + } + ct := c.caseType() + if c.info&exceptionBit == 0 { + if ct != cLower || c.info&inverseFoldBit != 0 { + return c.copyXOR() + } + return c.copy() + } + e := exceptions[c.info>>exceptionShift:] + n := e[0] & lengthMask + if n == 0 { + if ct == cLower { + return c.copy() + } + n = (e[1] >> lengthBits) & lengthMask + } + return c.writeString(e[2 : 2+n]) +} diff --git a/vendor/golang.org/x/text/cases/context_test.go b/vendor/golang.org/x/text/cases/context_test.go new file mode 100644 index 0000000000..c942b41c97 --- /dev/null +++ b/vendor/golang.org/x/text/cases/context_test.go @@ -0,0 +1,412 @@ +// 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 cases + +import ( + "strings" + "testing" + "unicode" + + "golang.org/x/text/language" + "golang.org/x/text/transform" + "golang.org/x/text/unicode/norm" + "golang.org/x/text/unicode/rangetable" +) + +// The following definitions are taken directly from Chapter 3 of The Unicode +// Standard. + +func propCased(r rune) bool { + return propLower(r) || propUpper(r) || unicode.IsTitle(r) +} + +func propLower(r rune) bool { + return unicode.IsLower(r) || unicode.Is(unicode.Other_Lowercase, r) +} + +func propUpper(r rune) bool { + return unicode.IsUpper(r) || unicode.Is(unicode.Other_Uppercase, r) +} + +func propIgnore(r rune) bool { + if unicode.In(r, unicode.Mn, unicode.Me, unicode.Cf, unicode.Lm, unicode.Sk) { + return true + } + return caseIgnorable[r] +} + +func hasBreakProp(r rune) bool { + // binary search over ranges + lo := 0 + hi := len(breakProp) + for lo < hi { + m := lo + (hi-lo)/2 + bp := &breakProp[m] + if bp.lo <= r && r <= bp.hi { + return true + } + if r < bp.lo { + hi = m + } else { + lo = m + 1 + } + } + return false +} + +func contextFromRune(r rune) *context { + c := context{dst: make([]byte, 128), src: []byte(string(r)), atEOF: true} + c.next() + return &c +} + +func TestCaseProperties(t *testing.T) { + assigned := rangetable.Assigned(UnicodeVersion) + coreVersion := rangetable.Assigned(unicode.Version) + for r := rune(0); r <= lastRuneForTesting; r++ { + if !unicode.In(r, assigned) || !unicode.In(r, coreVersion) { + continue + } + c := contextFromRune(r) + if got, want := c.info.isCaseIgnorable(), propIgnore(r); got != want { + t.Errorf("caseIgnorable(%U): got %v; want %v (%x)", r, got, want, c.info) + } + // New letters may change case types, but existing case pairings should + // not change. See Case Pair Stability in + // http://unicode.org/policies/stability_policy.html. + if rf := unicode.SimpleFold(r); rf != r && unicode.In(rf, assigned) { + if got, want := c.info.isCased(), propCased(r); got != want { + t.Errorf("cased(%U): got %v; want %v (%x)", r, got, want, c.info) + } + if got, want := c.caseType() == cUpper, propUpper(r); got != want { + t.Errorf("upper(%U): got %v; want %v (%x)", r, got, want, c.info) + } + if got, want := c.caseType() == cLower, propLower(r); got != want { + t.Errorf("lower(%U): got %v; want %v (%x)", r, got, want, c.info) + } + } + if got, want := c.info.isBreak(), hasBreakProp(r); got != want { + t.Errorf("isBreak(%U): got %v; want %v (%x)", r, got, want, c.info) + } + } + // TODO: get title case from unicode file. +} + +func TestMapping(t *testing.T) { + assigned := rangetable.Assigned(UnicodeVersion) + coreVersion := rangetable.Assigned(unicode.Version) + apply := func(r rune, f func(c *context) bool) string { + c := contextFromRune(r) + f(c) + return string(c.dst[:c.pDst]) + } + + for r, tt := range special { + if got, want := apply(r, lower), tt.toLower; got != want { + t.Errorf("lowerSpecial:(%U): got %+q; want %+q", r, got, want) + } + if got, want := apply(r, title), tt.toTitle; got != want { + t.Errorf("titleSpecial:(%U): got %+q; want %+q", r, got, want) + } + if got, want := apply(r, upper), tt.toUpper; got != want { + t.Errorf("upperSpecial:(%U): got %+q; want %+q", r, got, want) + } + } + + for r := rune(0); r <= lastRuneForTesting; r++ { + if !unicode.In(r, assigned) || !unicode.In(r, coreVersion) { + continue + } + if rf := unicode.SimpleFold(r); rf == r || !unicode.In(rf, assigned) { + continue + } + if _, ok := special[r]; ok { + continue + } + want := string(unicode.ToLower(r)) + if got := apply(r, lower); got != want { + t.Errorf("lower:%q (%U): got %q %U; want %q %U", r, r, got, []rune(got), want, []rune(want)) + } + + want = string(unicode.ToUpper(r)) + if got := apply(r, upper); got != want { + t.Errorf("upper:%q (%U): got %q %U; want %q %U", r, r, got, []rune(got), want, []rune(want)) + } + + want = string(unicode.ToTitle(r)) + if got := apply(r, title); got != want { + t.Errorf("title:%q (%U): got %q %U; want %q %U", r, r, got, []rune(got), want, []rune(want)) + } + } +} + +func runeFoldData(r rune) (x struct{ simple, full, special string }) { + x = foldMap[r] + if x.simple == "" { + x.simple = string(unicode.ToLower(r)) + } + if x.full == "" { + x.full = string(unicode.ToLower(r)) + } + if x.special == "" { + x.special = x.full + } + return +} + +func TestFoldData(t *testing.T) { + assigned := rangetable.Assigned(UnicodeVersion) + coreVersion := rangetable.Assigned(unicode.Version) + apply := func(r rune, f func(c *context) bool) (string, info) { + c := contextFromRune(r) + f(c) + return string(c.dst[:c.pDst]), c.info.cccType() + } + for r := rune(0); r <= lastRuneForTesting; r++ { + if !unicode.In(r, assigned) || !unicode.In(r, coreVersion) { + continue + } + x := runeFoldData(r) + if got, info := apply(r, foldFull); got != x.full { + t.Errorf("full:%q (%U): got %q %U; want %q %U (ccc=%x)", r, r, got, []rune(got), x.full, []rune(x.full), info) + } + // TODO: special and simple. + } +} + +func TestCCC(t *testing.T) { + assigned := rangetable.Assigned(UnicodeVersion) + normVersion := rangetable.Assigned(norm.Version) + for r := rune(0); r <= lastRuneForTesting; r++ { + if !unicode.In(r, assigned) || !unicode.In(r, normVersion) { + continue + } + c := contextFromRune(r) + + p := norm.NFC.PropertiesString(string(r)) + want := cccOther + switch p.CCC() { + case 0: + want = cccZero + case above: + want = cccAbove + } + if got := c.info.cccType(); got != want { + t.Errorf("%U: got %x; want %x", r, got, want) + } + } +} + +func TestWordBreaks(t *testing.T) { + for i, tt := range breakTest { + parts := strings.Split(tt, "|") + want := "" + for _, s := range parts { + want += Title(language.Und).String(s) + } + src := strings.Join(parts, "") + got := Title(language.Und).String(src) + if got != want { + t.Errorf("%d: title(%q) = %q; want %q", i, src, got, want) + } + } +} + +func TestContext(t *testing.T) { + tests := []struct { + desc string + dstSize int + atEOF bool + src string + out string + nSrc int + err error + ops string + prefixArg string + prefixWant bool + }{{ + desc: "next: past end, atEOF, no checkpoint", + dstSize: 10, + atEOF: true, + src: "12", + out: "", + nSrc: 2, + ops: "next;next;next", + // Test that calling prefix with a non-empty argument when the buffer + // is depleted returns false. + prefixArg: "x", + prefixWant: false, + }, { + desc: "next: not at end, atEOF, no checkpoint", + dstSize: 10, + atEOF: false, + src: "12", + out: "", + nSrc: 0, + err: transform.ErrShortSrc, + ops: "next;next", + prefixArg: "", + prefixWant: true, + }, { + desc: "next: past end, !atEOF, no checkpoint", + dstSize: 10, + atEOF: false, + src: "12", + out: "", + nSrc: 0, + err: transform.ErrShortSrc, + ops: "next;next;next", + prefixArg: "", + prefixWant: true, + }, { + desc: "next: past end, !atEOF, checkpoint", + dstSize: 10, + atEOF: false, + src: "12", + out: "", + nSrc: 2, + ops: "next;next;checkpoint;next", + prefixArg: "", + prefixWant: true, + }, { + desc: "copy: exact count, atEOF, no checkpoint", + dstSize: 2, + atEOF: true, + src: "12", + out: "12", + nSrc: 2, + ops: "next;copy;next;copy;next", + prefixArg: "", + prefixWant: true, + }, { + desc: "copy: past end, !atEOF, no checkpoint", + dstSize: 2, + atEOF: false, + src: "12", + out: "", + nSrc: 0, + err: transform.ErrShortSrc, + ops: "next;copy;next;copy;next", + prefixArg: "", + prefixWant: true, + }, { + desc: "copy: past end, !atEOF, checkpoint", + dstSize: 2, + atEOF: false, + src: "12", + out: "12", + nSrc: 2, + ops: "next;copy;next;copy;checkpoint;next", + prefixArg: "", + prefixWant: true, + }, { + desc: "copy: short dst", + dstSize: 1, + atEOF: false, + src: "12", + out: "", + nSrc: 0, + err: transform.ErrShortDst, + ops: "next;copy;next;copy;checkpoint;next", + prefixArg: "12", + prefixWant: false, + }, { + desc: "copy: short dst, checkpointed", + dstSize: 1, + atEOF: false, + src: "12", + out: "1", + nSrc: 1, + err: transform.ErrShortDst, + ops: "next;copy;checkpoint;next;copy;next", + prefixArg: "", + prefixWant: true, + }, { + desc: "writeString: simple", + dstSize: 3, + atEOF: true, + src: "1", + out: "1ab", + nSrc: 1, + ops: "next;copy;writeab;next", + prefixArg: "", + prefixWant: true, + }, { + desc: "writeString: short dst", + dstSize: 2, + atEOF: true, + src: "12", + out: "", + nSrc: 0, + err: transform.ErrShortDst, + ops: "next;copy;writeab;next", + prefixArg: "2", + prefixWant: true, + }, { + desc: "writeString: simple", + dstSize: 3, + atEOF: true, + src: "12", + out: "1ab", + nSrc: 2, + ops: "next;copy;next;writeab;next", + prefixArg: "", + prefixWant: true, + }, { + desc: "writeString: short dst", + dstSize: 2, + atEOF: true, + src: "12", + out: "", + nSrc: 0, + err: transform.ErrShortDst, + ops: "next;copy;next;writeab;next", + prefixArg: "1", + prefixWant: false, + }, { + desc: "prefix", + dstSize: 2, + atEOF: true, + src: "12", + out: "", + nSrc: 0, + // Context will assign an ErrShortSrc if the input wasn't exhausted. + err: transform.ErrShortSrc, + prefixArg: "12", + prefixWant: true, + }} + for _, tt := range tests { + c := context{dst: make([]byte, tt.dstSize), src: []byte(tt.src), atEOF: tt.atEOF} + + for _, op := range strings.Split(tt.ops, ";") { + switch op { + case "next": + c.next() + case "checkpoint": + c.checkpoint() + case "writeab": + c.writeString("ab") + case "copy": + c.copy() + case "": + default: + t.Fatalf("unknown op %q", op) + } + } + if got := c.hasPrefix(tt.prefixArg); got != tt.prefixWant { + t.Errorf("%s:\nprefix was %v; want %v", tt.desc, got, tt.prefixWant) + } + nDst, nSrc, err := c.ret() + if err != tt.err { + t.Errorf("%s:\nerror was %v; want %v", tt.desc, err, tt.err) + } + if out := string(c.dst[:nDst]); out != tt.out { + t.Errorf("%s:\nout was %q; want %q", tt.desc, out, tt.out) + } + if nSrc != tt.nSrc { + t.Errorf("%s:\nnSrc was %d; want %d", tt.desc, nSrc, tt.nSrc) + } + } +} diff --git a/vendor/golang.org/x/text/cases/example_test.go b/vendor/golang.org/x/text/cases/example_test.go new file mode 100644 index 0000000000..56e6e33eed --- /dev/null +++ b/vendor/golang.org/x/text/cases/example_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 cases_test + +import ( + "fmt" + + "golang.org/x/text/cases" + "golang.org/x/text/language" +) + +func Example() { + src := []string{ + "hello world!", + "i with dot", + "'n ijsberg", + "here comes O'Brian", + } + for _, c := range []cases.Caser{ + cases.Lower(language.Und), + cases.Upper(language.Turkish), + cases.Title(language.Dutch), + cases.Title(language.Und, cases.NoLower), + } { + fmt.Println() + for _, s := range src { + fmt.Println(c.String(s)) + } + } + + // Output: + // hello world! + // i with dot + // 'n ijsberg + // here comes o'brian + // + // HELLO WORLD! + // İ WİTH DOT + // 'N İJSBERG + // HERE COMES O'BRİAN + // + // Hello World! + // I With Dot + // 'n IJsberg + // Here Comes O'brian + // + // Hello World! + // I With Dot + // 'N Ijsberg + // Here Comes O'Brian +} diff --git a/vendor/golang.org/x/text/cases/fold.go b/vendor/golang.org/x/text/cases/fold.go new file mode 100644 index 0000000000..e95bfa8ea2 --- /dev/null +++ b/vendor/golang.org/x/text/cases/fold.go @@ -0,0 +1,26 @@ +// Copyright 2016 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 cases + +import "golang.org/x/text/transform" + +type caseFolder struct{ transform.NopResetter } + +// caseFolder implements the Transformer interface for doing case folding. +func (t *caseFolder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + c := context{dst: dst, src: src, atEOF: atEOF} + for c.next() { + foldFull(&c) + c.checkpoint() + } + return c.ret() +} + +func makeFold(o options) transform.Transformer { + // TODO: Special case folding, through option Language, Special/Turkic, or + // both. + // TODO: Implement Compact options. + return &caseFolder{} +} diff --git a/vendor/golang.org/x/text/cases/fold_test.go b/vendor/golang.org/x/text/cases/fold_test.go new file mode 100644 index 0000000000..dca95e3c23 --- /dev/null +++ b/vendor/golang.org/x/text/cases/fold_test.go @@ -0,0 +1,49 @@ +// Copyright 2016 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 cases + +import "testing" + +func TestFold(t *testing.T) { + testCases := []string{ + "βß\u13f8", // "βssᏰ" + "ab\u13fc\uab7aꭰ", // abᏴᎪᎠ + "affifflast", // affifflast + "Iİiı\u0345", // ii̇iıι + "µµΜΜςσΣΣ", // μμμμσσσσ + } + for _, tc := range testCases { + testEntry := func(name string, c Caser, m func(r rune) string) { + want := "" + for _, r := range tc { + want += m(r) + } + if got := c.String(tc); got != want { + t.Errorf("%s(%s) = %+q; want %+q", name, tc, got, want) + } + dst := make([]byte, 256) // big enough to hold any result + src := []byte(tc) + v := testing.AllocsPerRun(20, func() { + c.Transform(dst, src, true) + }) + if v > 0 { + t.Errorf("%s(%s): number of allocs was %f; want 0", name, tc, v) + } + } + testEntry("FullFold", Fold(), func(r rune) string { + return runeFoldData(r).full + }) + // TODO: + // testEntry("SimpleFold", Fold(Compact), func(r rune) string { + // return runeFoldData(r).simple + // }) + // testEntry("SpecialFold", Fold(Turkic), func(r rune) string { + // return runeFoldData(r).special + // }) + } +} + +func BenchmarkFullFold(b *testing.B) { benchTransformer(b, Fold(), txtNonASCII) } +func BenchmarkFullFoldASCII(b *testing.B) { benchTransformer(b, Fold(), txtASCII) } diff --git a/vendor/golang.org/x/text/cases/gen.go b/vendor/golang.org/x/text/cases/gen.go new file mode 100644 index 0000000000..f46170fca1 --- /dev/null +++ b/vendor/golang.org/x/text/cases/gen.go @@ -0,0 +1,831 @@ +// 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 + +// This program generates the trie for casing operations. The Unicode casing +// algorithm requires the lookup of various properties and mappings for each +// rune. The table generated by this generator combines several of the most +// frequently used of these into a single trie so that they can be accessed +// with a single lookup. +package main + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "log" + "reflect" + "strconv" + "strings" + "unicode" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/triegen" + "golang.org/x/text/internal/ucd" + "golang.org/x/text/unicode/norm" +) + +func main() { + gen.Init() + genTables() + genTablesTest() + gen.Repackage("gen_trieval.go", "trieval.go", "cases") +} + +// runeInfo contains all information for a rune that we care about for casing +// operations. +type runeInfo struct { + Rune rune + + entry info // trie value for this rune. + + CaseMode info + + // Simple case mappings. + Simple [1 + maxCaseMode][]rune + + // Special casing + HasSpecial bool + Conditional bool + Special [1 + maxCaseMode][]rune + + // Folding + FoldSimple rune + FoldSpecial rune + FoldFull []rune + + // TODO: FC_NFKC, or equivalent data. + + // Properties + SoftDotted bool + CaseIgnorable bool + Cased bool + DecomposeGreek bool + BreakType string + BreakCat breakCategory + + // We care mostly about 0, Above, and IotaSubscript. + CCC byte +} + +type breakCategory int + +const ( + breakBreak breakCategory = iota + breakLetter + breakIgnored +) + +// mapping returns the case mapping for the given case type. +func (r *runeInfo) mapping(c info) string { + if r.HasSpecial { + return string(r.Special[c]) + } + if len(r.Simple[c]) != 0 { + return string(r.Simple[c]) + } + return string(r.Rune) +} + +func parse(file string, f func(p *ucd.Parser)) { + ucd.Parse(gen.OpenUCDFile(file), f) +} + +func parseUCD() []runeInfo { + chars := make([]runeInfo, unicode.MaxRune) + + get := func(r rune) *runeInfo { + c := &chars[r] + c.Rune = r + return c + } + + parse("UnicodeData.txt", func(p *ucd.Parser) { + ri := get(p.Rune(0)) + ri.CCC = byte(p.Int(ucd.CanonicalCombiningClass)) + ri.Simple[cLower] = p.Runes(ucd.SimpleLowercaseMapping) + ri.Simple[cUpper] = p.Runes(ucd.SimpleUppercaseMapping) + ri.Simple[cTitle] = p.Runes(ucd.SimpleTitlecaseMapping) + if p.String(ucd.GeneralCategory) == "Lt" { + ri.CaseMode = cTitle + } + }) + + // ; + parse("PropList.txt", func(p *ucd.Parser) { + if p.String(1) == "Soft_Dotted" { + chars[p.Rune(0)].SoftDotted = true + } + }) + + // ; + parse("DerivedCoreProperties.txt", func(p *ucd.Parser) { + ri := get(p.Rune(0)) + switch p.String(1) { + case "Case_Ignorable": + ri.CaseIgnorable = true + case "Cased": + ri.Cased = true + case "Lowercase": + ri.CaseMode = cLower + case "Uppercase": + ri.CaseMode = cUpper + } + }) + + // ; ; ; <upper> ; (<condition_list> ;)? + parse("SpecialCasing.txt", func(p *ucd.Parser) { + // We drop all conditional special casing and deal with them manually in + // the language-specific case mappers. Rune 0x03A3 is the only one with + // a conditional formatting that is not language-specific. However, + // dealing with this letter is tricky, especially in a streaming + // context, so we deal with it in the Caser for Greek specifically. + ri := get(p.Rune(0)) + if p.String(4) == "" { + ri.HasSpecial = true + ri.Special[cLower] = p.Runes(1) + ri.Special[cTitle] = p.Runes(2) + ri.Special[cUpper] = p.Runes(3) + } else { + ri.Conditional = true + } + }) + + // TODO: Use text breaking according to UAX #29. + // <code>; <word break type> + parse("auxiliary/WordBreakProperty.txt", func(p *ucd.Parser) { + ri := get(p.Rune(0)) + ri.BreakType = p.String(1) + + // We collapse the word breaking properties onto the categories we need. + switch p.String(1) { // TODO: officially we need to canonicalize. + case "Format", "MidLetter", "MidNumLet", "Single_Quote": + ri.BreakCat = breakIgnored + case "ALetter", "Hebrew_Letter", "Numeric", "Extend", "ExtendNumLet": + ri.BreakCat = breakLetter + } + }) + + // <code>; <type>; <mapping> + parse("CaseFolding.txt", func(p *ucd.Parser) { + ri := get(p.Rune(0)) + switch p.String(1) { + case "C": + ri.FoldSimple = p.Rune(2) + ri.FoldFull = p.Runes(2) + case "S": + ri.FoldSimple = p.Rune(2) + case "T": + ri.FoldSpecial = p.Rune(2) + case "F": + ri.FoldFull = p.Runes(2) + default: + log.Fatalf("%U: unknown type: %s", p.Rune(0), p.String(1)) + } + }) + + return chars +} + +func genTables() { + chars := parseUCD() + verifyProperties(chars) + + t := triegen.NewTrie("case") + for i := range chars { + c := &chars[i] + makeEntry(c) + t.Insert(rune(i), uint64(c.entry)) + } + + w := gen.NewCodeWriter() + defer w.WriteGoFile("tables.go", "cases") + + gen.WriteUnicodeVersion(w) + + // TODO: write CLDR version after adding a mechanism to detect that the + // tables on which the manually created locale-sensitive casing code is + // based hasn't changed. + + w.WriteVar("xorData", string(xorData)) + w.WriteVar("exceptions", string(exceptionData)) + + sz, err := t.Gen(w, triegen.Compact(&sparseCompacter{})) + if err != nil { + log.Fatal(err) + } + w.Size += sz +} + +func makeEntry(ri *runeInfo) { + if ri.CaseIgnorable { + if ri.Cased { + ri.entry = cIgnorableCased + } else { + ri.entry = cIgnorableUncased + } + } else { + ri.entry = ri.CaseMode + } + + // TODO: handle soft-dotted. + + ccc := cccOther + switch ri.CCC { + case 0: // Not_Reordered + ccc = cccZero + case above: // Above + ccc = cccAbove + } + if ri.BreakCat == breakBreak { + ccc = cccBreak + } + + ri.entry |= ccc + + if ri.CaseMode == cUncased { + return + } + + // Need to do something special. + if ri.CaseMode == cTitle || ri.HasSpecial || ri.mapping(cTitle) != ri.mapping(cUpper) { + makeException(ri) + return + } + if f := string(ri.FoldFull); len(f) > 0 && f != ri.mapping(cUpper) && f != ri.mapping(cLower) { + makeException(ri) + return + } + + // Rune is either lowercase or uppercase. + + orig := string(ri.Rune) + mapped := "" + if ri.CaseMode == cUpper { + mapped = ri.mapping(cLower) + } else { + mapped = ri.mapping(cUpper) + } + + if len(orig) != len(mapped) { + makeException(ri) + return + } + + if string(ri.FoldFull) == ri.mapping(cUpper) { + ri.entry |= inverseFoldBit + } + + n := len(orig) + + // Create per-byte XOR mask. + var b []byte + for i := 0; i < n; i++ { + b = append(b, orig[i]^mapped[i]) + } + + // Remove leading 0 bytes, but keep at least one byte. + for ; len(b) > 1 && b[0] == 0; b = b[1:] { + } + + if len(b) == 1 && b[0]&0xc0 == 0 { + ri.entry |= info(b[0]) << xorShift + return + } + + key := string(b) + x, ok := xorCache[key] + if !ok { + xorData = append(xorData, 0) // for detecting start of sequence + xorData = append(xorData, b...) + + x = len(xorData) - 1 + xorCache[key] = x + } + ri.entry |= info(x<<xorShift) | xorIndexBit +} + +var xorCache = map[string]int{} + +// xorData contains byte-wise XOR data for the least significant bytes of a +// UTF-8 encoded rune. An index points to the last byte. The sequence starts +// with a zero terminator. +var xorData = []byte{} + +// See the comments in gen_trieval.go re "the exceptions slice". +var exceptionData = []byte{0} + +// makeException encodes case mappings that cannot be expressed in a simple +// XOR diff. +func makeException(ri *runeInfo) { + ccc := ri.entry & cccMask + // Set exception bit and retain case type. + ri.entry &= 0x0007 + ri.entry |= exceptionBit + + if len(exceptionData) >= 1<<numExceptionBits { + log.Fatalf("%U:exceptionData too large %x > %d bits", ri.Rune, len(exceptionData), numExceptionBits) + } + + // Set the offset in the exceptionData array. + ri.entry |= info(len(exceptionData) << exceptionShift) + + orig := string(ri.Rune) + tc := ri.mapping(cTitle) + uc := ri.mapping(cUpper) + lc := ri.mapping(cLower) + ff := string(ri.FoldFull) + + // addString sets the length of a string and adds it to the expansions array. + addString := func(s string, b *byte) { + if len(s) == 0 { + // Zero-length mappings exist, but only for conditional casing, + // which we are representing outside of this table. + log.Fatalf("%U: has zero-length mapping.", ri.Rune) + } + *b <<= 3 + if s != orig { + n := len(s) + if n > 7 { + log.Fatalf("%U: mapping larger than 7 (%d)", ri.Rune, n) + } + *b |= byte(n) + exceptionData = append(exceptionData, s...) + } + } + + // byte 0: + exceptionData = append(exceptionData, byte(ccc)|byte(len(ff))) + + // byte 1: + p := len(exceptionData) + exceptionData = append(exceptionData, 0) + + if len(ff) > 7 { // May be zero-length. + log.Fatalf("%U: fold string larger than 7 (%d)", ri.Rune, len(ff)) + } + exceptionData = append(exceptionData, ff...) + ct := ri.CaseMode + if ct != cLower { + addString(lc, &exceptionData[p]) + } + if ct != cUpper { + addString(uc, &exceptionData[p]) + } + if ct != cTitle { + // If title is the same as upper, we set it to the original string so + // that it will be marked as not present. This implies title case is + // the same as upper case. + if tc == uc { + tc = orig + } + addString(tc, &exceptionData[p]) + } +} + +// sparseCompacter is a trie value block Compacter. There are many cases where +// successive runes alternate between lower- and upper-case. This Compacter +// exploits this by adding a special case type where the case value is obtained +// from or-ing it with the least-significant bit of the rune, creating large +// ranges of equal case values that compress well. +type sparseCompacter struct { + sparseBlocks [][]uint16 + sparseOffsets []uint16 + sparseCount int +} + +// makeSparse returns the number of elements that compact block would contain +// as well as the modified values. +func makeSparse(vals []uint64) ([]uint16, int) { + // Copy the values. + values := make([]uint16, len(vals)) + for i, v := range vals { + values[i] = uint16(v) + } + + alt := func(i int, v uint16) uint16 { + if cm := info(v & fullCasedMask); cm == cUpper || cm == cLower { + // Convert cLower or cUpper to cXORCase value, which has the form 11x. + xor := v + xor &^= 1 + xor |= uint16(i&1) ^ (v & 1) + xor |= 0x4 + return xor + } + return v + } + + var count int + var previous uint16 + for i, v := range values { + if v != 0 { + // Try if the unmodified value is equal to the previous. + if v == previous { + continue + } + + // Try if the xor-ed value is equal to the previous value. + a := alt(i, v) + if a == previous { + values[i] = a + continue + } + + // This is a new value. + count++ + + // Use the xor-ed value if it will be identical to the next value. + if p := i + 1; p < len(values) && alt(p, values[p]) == a { + values[i] = a + v = a + } + } + previous = v + } + return values, count +} + +func (s *sparseCompacter) Size(v []uint64) (int, bool) { + _, n := makeSparse(v) + + // We limit using this method to having 16 entries. + if n > 16 { + return 0, false + } + + return 2 + int(reflect.TypeOf(valueRange{}).Size())*n, true +} + +func (s *sparseCompacter) Store(v []uint64) uint32 { + h := uint32(len(s.sparseOffsets)) + values, sz := makeSparse(v) + s.sparseBlocks = append(s.sparseBlocks, values) + s.sparseOffsets = append(s.sparseOffsets, uint16(s.sparseCount)) + s.sparseCount += sz + return h +} + +func (s *sparseCompacter) Handler() string { + // The sparse global variable and its lookup method is defined in gen_trieval.go. + return "sparse.lookup" +} + +func (s *sparseCompacter) Print(w io.Writer) (retErr error) { + p := func(format string, args ...interface{}) { + _, err := fmt.Fprintf(w, format, args...) + if retErr == nil && err != nil { + retErr = err + } + } + + ls := len(s.sparseBlocks) + if ls == len(s.sparseOffsets) { + s.sparseOffsets = append(s.sparseOffsets, uint16(s.sparseCount)) + } + p("// sparseOffsets: %d entries, %d bytes\n", ls+1, (ls+1)*2) + p("var sparseOffsets = %#v\n\n", s.sparseOffsets) + + ns := s.sparseCount + p("// sparseValues: %d entries, %d bytes\n", ns, ns*4) + p("var sparseValues = [%d]valueRange {", ns) + for i, values := range s.sparseBlocks { + p("\n// Block %#x, offset %#x", i, s.sparseOffsets[i]) + var v uint16 + for i, nv := range values { + if nv != v { + if v != 0 { + p(",hi:%#02x},", 0x80+i-1) + } + if nv != 0 { + p("\n{value:%#04x,lo:%#02x", nv, 0x80+i) + } + } + v = nv + } + if v != 0 { + p(",hi:%#02x},", 0x80+len(values)-1) + } + } + p("\n}\n\n") + return +} + +// verifyProperties that properties of the runes that are relied upon in the +// implementation. Each property is marked with an identifier that is referred +// to in the places where it is used. +func verifyProperties(chars []runeInfo) { + for i, c := range chars { + r := rune(i) + + // Rune properties. + + // A.1: modifier never changes on lowercase. [ltLower] + if c.CCC > 0 && unicode.ToLower(r) != r { + log.Fatalf("%U: non-starter changes when lowercased", r) + } + + // A.2: properties of decompositions starting with I or J. [ltLower] + d := norm.NFD.PropertiesString(string(r)).Decomposition() + if len(d) > 0 { + if d[0] == 'I' || d[0] == 'J' { + // A.2.1: we expect at least an ASCII character and a modifier. + if len(d) < 3 { + log.Fatalf("%U: length of decomposition was %d; want >= 3", r, len(d)) + } + + // All subsequent runes are modifiers and all have the same CCC. + runes := []rune(string(d[1:])) + ccc := chars[runes[0]].CCC + + for _, mr := range runes[1:] { + mc := chars[mr] + + // A.2.2: all modifiers have a CCC of Above or less. + if ccc == 0 || ccc > above { + log.Fatalf("%U: CCC of successive rune (%U) was %d; want (0,230]", r, mr, ccc) + } + + // A.2.3: a sequence of modifiers all have the same CCC. + if mc.CCC != ccc { + log.Fatalf("%U: CCC of follow-up modifier (%U) was %d; want %d", r, mr, mc.CCC, ccc) + } + + // A.2.4: for each trailing r, r in [0x300, 0x311] <=> CCC == Above. + if (ccc == above) != (0x300 <= mr && mr <= 0x311) { + log.Fatalf("%U: modifier %U in [U+0300, U+0311] != ccc(%U) == 230", r, mr, mr) + } + + if i += len(string(mr)); i >= len(d) { + break + } + } + } + } + + // A.3: no U+0307 in decomposition of Soft-Dotted rune. [ltUpper] + if unicode.Is(unicode.Soft_Dotted, r) && strings.Contains(string(d), "\u0307") { + log.Fatalf("%U: decomposition of soft-dotted rune may not contain U+0307", r) + } + + // A.4: only rune U+0345 may be of CCC Iota_Subscript. [elUpper] + if c.CCC == iotaSubscript && r != 0x0345 { + log.Fatalf("%U: only rune U+0345 may have CCC Iota_Subscript", r) + } + + // A.5: soft-dotted runes do not have exceptions. + if c.SoftDotted && c.entry&exceptionBit != 0 { + log.Fatalf("%U: soft-dotted has exception", r) + } + + // A.6: Greek decomposition. [elUpper] + if unicode.Is(unicode.Greek, r) { + if b := norm.NFD.PropertiesString(string(r)).Decomposition(); b != nil { + runes := []rune(string(b)) + // A.6.1: If a Greek rune decomposes and the first rune of the + // decomposition is greater than U+00FF, the rune is always + // great and not a modifier. + if f := runes[0]; unicode.IsMark(f) || f > 0xFF && !unicode.Is(unicode.Greek, f) { + log.Fatalf("%U: expeced first rune of Greek decomposition to be letter, found %U", r, f) + } + // A.6.2: Any follow-up rune in a Greek decomposition is a + // modifier of which the first should be gobbled in + // decomposition. + for _, m := range runes[1:] { + switch m { + case 0x0313, 0x0314, 0x0301, 0x0300, 0x0306, 0x0342, 0x0308, 0x0304, 0x345: + default: + log.Fatalf("%U: modifier %U is outside of expeced Greek modifier set", r, m) + } + } + } + } + + // Breaking properties. + + // B.1: all runes with CCC > 0 are of break type Extend. + if c.CCC > 0 && c.BreakType != "Extend" { + log.Fatalf("%U: CCC == %d, but got break type %s; want Extend", r, c.CCC, c.BreakType) + } + + // B.2: all cased runes with c.CCC == 0 are of break type ALetter. + if c.CCC == 0 && c.Cased && c.BreakType != "ALetter" { + log.Fatalf("%U: cased, but got break type %s; want ALetter", r, c.BreakType) + } + + // B.3: letter category. + if c.CCC == 0 && c.BreakCat != breakBreak && !c.CaseIgnorable { + if c.BreakCat != breakLetter { + log.Fatalf("%U: check for letter break type gave %d; want %d", r, c.BreakCat, breakLetter) + } + } + } +} + +func genTablesTest() { + w := &bytes.Buffer{} + + fmt.Fprintln(w, "var (") + printProperties(w, "DerivedCoreProperties.txt", "Case_Ignorable", verifyIgnore) + + // We discard the output as we know we have perfect functions. We run them + // just to verify the properties are correct. + n := printProperties(ioutil.Discard, "DerivedCoreProperties.txt", "Cased", verifyCased) + n += printProperties(ioutil.Discard, "DerivedCoreProperties.txt", "Lowercase", verifyLower) + n += printProperties(ioutil.Discard, "DerivedCoreProperties.txt", "Uppercase", verifyUpper) + if n > 0 { + log.Fatalf("One of the discarded properties does not have a perfect filter.") + } + + // <code>; <lower> ; <title> ; <upper> ; (<condition_list> ;)? + fmt.Fprintln(w, "\tspecial = map[rune]struct{ toLower, toTitle, toUpper string }{") + parse("SpecialCasing.txt", func(p *ucd.Parser) { + // Skip conditional entries. + if p.String(4) != "" { + return + } + r := p.Rune(0) + fmt.Fprintf(w, "\t\t0x%04x: {%q, %q, %q},\n", + r, string(p.Runes(1)), string(p.Runes(2)), string(p.Runes(3))) + }) + fmt.Fprint(w, "\t}\n\n") + + // <code>; <type>; <runes> + table := map[rune]struct{ simple, full, special string }{} + parse("CaseFolding.txt", func(p *ucd.Parser) { + r := p.Rune(0) + t := p.String(1) + v := string(p.Runes(2)) + if t != "T" && v == string(unicode.ToLower(r)) { + return + } + x := table[r] + switch t { + case "C": + x.full = v + x.simple = v + case "S": + x.simple = v + case "F": + x.full = v + case "T": + x.special = v + } + table[r] = x + }) + fmt.Fprintln(w, "\tfoldMap = map[rune]struct{ simple, full, special string }{") + for r := rune(0); r < 0x10FFFF; r++ { + x, ok := table[r] + if !ok { + continue + } + fmt.Fprintf(w, "\t\t0x%04x: {%q, %q, %q},\n", r, x.simple, x.full, x.special) + } + fmt.Fprint(w, "\t}\n\n") + + // Break property + notBreak := map[rune]bool{} + parse("auxiliary/WordBreakProperty.txt", func(p *ucd.Parser) { + switch p.String(1) { + case "Extend", "Format", "MidLetter", "MidNumLet", "Single_Quote", + "ALetter", "Hebrew_Letter", "Numeric", "ExtendNumLet": + notBreak[p.Rune(0)] = true + } + }) + + fmt.Fprintln(w, "\tbreakProp = []struct{ lo, hi rune }{") + inBreak := false + for r := rune(0); r <= lastRuneForTesting; r++ { + if isBreak := !notBreak[r]; isBreak != inBreak { + if isBreak { + fmt.Fprintf(w, "\t\t{0x%x, ", r) + } else { + fmt.Fprintf(w, "0x%x},\n", r-1) + } + inBreak = isBreak + } + } + if inBreak { + fmt.Fprintf(w, "0x%x},\n", lastRuneForTesting) + } + fmt.Fprint(w, "\t}\n\n") + + // Word break test + // Filter out all samples that do not contain cased characters. + cased := map[rune]bool{} + parse("DerivedCoreProperties.txt", func(p *ucd.Parser) { + if p.String(1) == "Cased" { + cased[p.Rune(0)] = true + } + }) + + fmt.Fprintln(w, "\tbreakTest = []string{") + parse("auxiliary/WordBreakTest.txt", func(p *ucd.Parser) { + c := strings.Split(p.String(0), " ") + + const sep = '|' + numCased := 0 + test := "" + for ; len(c) >= 2; c = c[2:] { + if c[0] == "÷" && test != "" { + test += string(sep) + } + i, err := strconv.ParseUint(c[1], 16, 32) + r := rune(i) + if err != nil { + log.Fatalf("Invalid rune %q.", c[1]) + } + if r == sep { + log.Fatalf("Separator %q not allowed in test data. Pick another one.", sep) + } + if cased[r] { + numCased++ + } + test += string(r) + } + if numCased > 1 { + fmt.Fprintf(w, "\t\t%q,\n", test) + } + }) + fmt.Fprintln(w, "\t}") + + fmt.Fprintln(w, ")") + + gen.WriteGoFile("tables_test.go", "cases", w.Bytes()) +} + +// These functions are just used for verification that their definition have not +// changed in the Unicode Standard. + +func verifyCased(r rune) bool { + return verifyLower(r) || verifyUpper(r) || unicode.IsTitle(r) +} + +func verifyLower(r rune) bool { + return unicode.IsLower(r) || unicode.Is(unicode.Other_Lowercase, r) +} + +func verifyUpper(r rune) bool { + return unicode.IsUpper(r) || unicode.Is(unicode.Other_Uppercase, r) +} + +// verifyIgnore is an approximation of the Case_Ignorable property using the +// core unicode package. It is used to reduce the size of the test data. +func verifyIgnore(r rune) bool { + props := []*unicode.RangeTable{ + unicode.Mn, + unicode.Me, + unicode.Cf, + unicode.Lm, + unicode.Sk, + } + for _, p := range props { + if unicode.Is(p, r) { + return true + } + } + return false +} + +// printProperties prints tables of rune properties from the given UCD file. +// A filter func f can be given to exclude certain values. A rune r will have +// the indicated property if it is in the generated table or if f(r). +func printProperties(w io.Writer, file, property string, f func(r rune) bool) int { + verify := map[rune]bool{} + n := 0 + varNameParts := strings.Split(property, "_") + varNameParts[0] = strings.ToLower(varNameParts[0]) + fmt.Fprintf(w, "\t%s = map[rune]bool{\n", strings.Join(varNameParts, "")) + parse(file, func(p *ucd.Parser) { + if p.String(1) == property { + r := p.Rune(0) + verify[r] = true + if !f(r) { + n++ + fmt.Fprintf(w, "\t\t0x%.4x: true,\n", r) + } + } + }) + fmt.Fprint(w, "\t}\n\n") + + // Verify that f is correct, that is, it represents a subset of the property. + for r := rune(0); r <= lastRuneForTesting; r++ { + if !verify[r] && f(r) { + log.Fatalf("Incorrect filter func for property %q.", property) + } + } + return n +} + +// The newCaseTrie, sparseValues and sparseOffsets definitions below are +// placeholders referred to by gen_trieval.go. The real definitions are +// generated by this program and written to tables.go. + +func newCaseTrie(int) int { return 0 } + +var ( + sparseValues [0]valueRange + sparseOffsets [0]uint16 +) diff --git a/vendor/golang.org/x/text/cases/gen_trieval.go b/vendor/golang.org/x/text/cases/gen_trieval.go new file mode 100644 index 0000000000..cf1a99d5e5 --- /dev/null +++ b/vendor/golang.org/x/text/cases/gen_trieval.go @@ -0,0 +1,217 @@ +// 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 + +// This file contains definitions for interpreting the trie value of the case +// trie generated by "go run gen*.go". It is shared by both the generator +// program and the resultant package. Sharing is achieved by the generator +// copying gen_trieval.go to trieval.go and changing what's above this comment. + +// info holds case information for a single rune. It is the value returned +// by a trie lookup. Most mapping information can be stored in a single 16-bit +// value. If not, for example when a rune is mapped to multiple runes, the value +// stores some basic case data and an index into an array with additional data. +// +// The per-rune values have the following format: +// +// if (exception) { +// 15..5 unsigned exception index +// 4 unused +// } else { +// 15..8 XOR pattern or index to XOR pattern for case mapping +// Only 13..8 are used for XOR patterns. +// 7 inverseFold (fold to upper, not to lower) +// 6 index: interpret the XOR pattern as an index +// 5..4 CCC: zero (normal or break), above or other +// } +// 3 exception: interpret this value as an exception index +// (TODO: is this bit necessary? Probably implied from case mode.) +// 2..0 case mode +// +// For the non-exceptional cases, a rune must be either uncased, lowercase or +// uppercase. If the rune is cased, the XOR pattern maps either a lowercase +// rune to uppercase or an uppercase rune to lowercase (applied to the 10 +// least-significant bits of the rune). +// +// See the definitions below for a more detailed description of the various +// bits. +type info uint16 + +const ( + casedMask = 0x0003 + fullCasedMask = 0x0007 + ignorableMask = 0x0006 + ignorableValue = 0x0004 + + inverseFoldBit = 1 << 7 + + exceptionBit = 1 << 3 + exceptionShift = 5 + numExceptionBits = 11 + + xorIndexBit = 1 << 6 + xorShift = 8 + + // There is no mapping if all xor bits and the exception bit are zero. + hasMappingMask = 0xffc0 | exceptionBit +) + +// The case mode bits encodes the case type of a rune. This includes uncased, +// title, upper and lower case and case ignorable. (For a definition of these +// terms see Chapter 3 of The Unicode Standard Core Specification.) In some rare +// cases, a rune can be both cased and case-ignorable. This is encoded by +// cIgnorableCased. A rune of this type is always lower case. Some runes are +// cased while not having a mapping. +// +// A common pattern for scripts in the Unicode standard is for upper and lower +// case runes to alternate for increasing rune values (e.g. the accented Latin +// ranges starting from U+0100 and U+1E00 among others and some Cyrillic +// characters). We use this property by defining a cXORCase mode, where the case +// mode (always upper or lower case) is derived from the rune value. As the XOR +// pattern for case mappings is often identical for successive runes, using +// cXORCase can result in large series of identical trie values. This, in turn, +// allows us to better compress the trie blocks. +const ( + cUncased info = iota // 000 + cTitle // 001 + cLower // 010 + cUpper // 011 + cIgnorableUncased // 100 + cIgnorableCased // 101 // lower case if mappings exist + cXORCase // 11x // case is cLower | ((rune&1) ^ x) + + maxCaseMode = cUpper +) + +func (c info) isCased() bool { + return c&casedMask != 0 +} + +func (c info) isCaseIgnorable() bool { + return c&ignorableMask == ignorableValue +} + +func (c info) isCaseIgnorableAndNonBreakStarter() bool { + return c&(fullCasedMask|cccMask) == (ignorableValue | cccZero) +} + +func (c info) isNotCasedAndNotCaseIgnorable() bool { + return c&fullCasedMask == 0 +} + +func (c info) isCaseIgnorableAndNotCased() bool { + return c&fullCasedMask == cIgnorableUncased +} + +// The case mapping implementation will need to know about various Canonical +// Combining Class (CCC) values. We encode two of these in the trie value: +// cccZero (0) and cccAbove (230). If the value is cccOther, it means that +// CCC(r) > 0, but not 230. A value of cccBreak means that CCC(r) == 0 and that +// the rune also has the break category Break (see below). +const ( + cccBreak info = iota << 4 + cccZero + cccAbove + cccOther + + cccMask = cccBreak | cccZero | cccAbove | cccOther +) + +const ( + starter = 0 + above = 230 + iotaSubscript = 240 +) + +// The exceptions slice holds data that does not fit in a normal info entry. +// The entry is pointed to by the exception index in an entry. It has the +// following format: +// +// Header +// byte 0: +// 7..6 unused +// 5..4 CCC type (same bits as entry) +// 3 unused +// 2..0 length of fold +// +// byte 1: +// 7..6 unused +// 5..3 length of 1st mapping of case type +// 2..0 length of 2nd mapping of case type +// +// case 1st 2nd +// lower -> upper, title +// upper -> lower, title +// title -> lower, upper +// +// Lengths with the value 0x7 indicate no value and implies no change. +// A length of 0 indicates a mapping to zero-length string. +// +// Body bytes: +// case folding bytes +// lowercase mapping bytes +// uppercase mapping bytes +// titlecase mapping bytes +// closure mapping bytes (for NFKC_Casefold). (TODO) +// +// Fallbacks: +// missing fold -> lower +// missing title -> upper +// all missing -> original rune +// +// exceptions starts with a dummy byte to enforce that there is no zero index +// value. +const ( + lengthMask = 0x07 + lengthBits = 3 + noChange = 0 +) + +// References to generated trie. + +var trie = newCaseTrie(0) + +var sparse = sparseBlocks{ + values: sparseValues[:], + offsets: sparseOffsets[:], +} + +// Sparse block lookup code. + +// valueRange is an entry in a sparse block. +type valueRange struct { + value uint16 + lo, hi byte +} + +type sparseBlocks struct { + values []valueRange + offsets []uint16 +} + +// lookup returns the value from values block n for byte b using binary search. +func (s *sparseBlocks) lookup(n uint32, b byte) uint16 { + lo := s.offsets[n] + hi := s.offsets[n+1] + for lo < hi { + m := lo + (hi-lo)/2 + r := s.values[m] + if r.lo <= b && b <= r.hi { + return r.value + } + if b < r.lo { + hi = m + } else { + lo = m + 1 + } + } + return 0 +} + +// lastRuneForTesting is the last rune used for testing. Everything after this +// is boring. +const lastRuneForTesting = rune(0x1FFFF) diff --git a/vendor/golang.org/x/text/cases/info.go b/vendor/golang.org/x/text/cases/info.go new file mode 100644 index 0000000000..669d7ae1fa --- /dev/null +++ b/vendor/golang.org/x/text/cases/info.go @@ -0,0 +1,83 @@ +// 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 cases + +func (c info) cccVal() info { + if c&exceptionBit != 0 { + return info(exceptions[c>>exceptionShift]) & cccMask + } + return c & cccMask +} + +func (c info) cccType() info { + ccc := c.cccVal() + if ccc <= cccZero { + return cccZero + } + return ccc +} + +// TODO: Implement full Unicode breaking algorithm: +// 1) Implement breaking in separate package. +// 2) Use the breaker here. +// 3) Compare table size and performance of using the more generic breaker. +// +// Note that we can extend the current algorithm to be much more accurate. This +// only makes sense, though, if the performance and/or space penalty of using +// the generic breaker is big. Extra data will only be needed for non-cased +// runes, which means there are sufficient bits left in the caseType. +// Also note that the standard breaking algorithm doesn't always make sense +// for title casing. For example, a4a -> A4a, but a"4a -> A"4A (where " stands +// for modifier \u0308). +// ICU prohibits breaking in such cases as well. + +// For the purpose of title casing we use an approximation of the Unicode Word +// Breaking algorithm defined in Annex #29: +// http://www.unicode.org/reports/tr29/#Default_Grapheme_Cluster_Table. +// +// For our approximation, we group the Word Break types into the following +// categories, with associated rules: +// +// 1) Letter: +// ALetter, Hebrew_Letter, Numeric, ExtendNumLet, Extend. +// Rule: Never break between consecutive runes of this category. +// +// 2) Mid: +// Format, MidLetter, MidNumLet, Single_Quote. +// (Cf. case-ignorable: MidLetter, MidNumLet or cat is Mn, Me, Cf, Lm or Sk). +// Rule: Don't break between Letter and Mid, but break between two Mids. +// +// 3) Break: +// Any other category, including NewLine, CR, LF and Double_Quote. These +// categories should always result in a break between two cased letters. +// Rule: Always break. +// +// Note 1: the Katakana and MidNum categories can, in esoteric cases, result in +// preventing a break between two cased letters. For now we will ignore this +// (e.g. [ALetter] [ExtendNumLet] [Katakana] [ExtendNumLet] [ALetter] and +// [ALetter] [Numeric] [MidNum] [Numeric] [ALetter].) +// +// Note 2: the rule for Mid is very approximate, but works in most cases. To +// improve, we could store the categories in the trie value and use a FA to +// manage breaks. See TODO comment above. +// +// Note 3: according to the spec, it is possible for the Extend category to +// introduce breaks between other categories grouped in Letter. However, this +// is undesirable for our purposes. ICU prevents breaks in such cases as well. + +// isBreak returns whether this rune should introduce a break. +func (c info) isBreak() bool { + return c.cccVal() == cccBreak +} + +// isLetter returns whether the rune is of break type ALetter, Hebrew_Letter, +// Numeric, ExtendNumLet, or Extend. +func (c info) isLetter() bool { + ccc := c.cccVal() + if ccc == cccZero { + return !c.isCaseIgnorable() + } + return ccc != cccBreak +} diff --git a/vendor/golang.org/x/text/cases/map.go b/vendor/golang.org/x/text/cases/map.go new file mode 100644 index 0000000000..f2a8e96d09 --- /dev/null +++ b/vendor/golang.org/x/text/cases/map.go @@ -0,0 +1,599 @@ +// 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 cases + +// This file contains the definitions of case mappings for all supported +// languages. The rules for the language-specific tailorings were taken and +// modified from the CLDR transform definitions in common/transforms. + +import ( + "strings" + "unicode" + "unicode/utf8" + + "golang.org/x/text/language" + "golang.org/x/text/transform" + "golang.org/x/text/unicode/norm" +) + +// A mapFunc takes a context set to the current rune and writes the mapped +// version to the same context. It may advance the context to the next rune. It +// returns whether a checkpoint is possible: whether the pDst bytes written to +// dst so far won't need changing as we see more source bytes. +type mapFunc func(*context) bool + +// maxIgnorable defines the maximum number of ignorables to consider for +// lookahead operations. +const maxIgnorable = 30 + +// supported lists the language tags for which we have tailorings. +const supported = "und af az el lt nl tr" + +func init() { + tags := []language.Tag{} + for _, s := range strings.Split(supported, " ") { + tags = append(tags, language.MustParse(s)) + } + matcher = language.NewMatcher(tags) + Supported = language.NewCoverage(tags) +} + +var ( + matcher language.Matcher + + Supported language.Coverage + + // We keep the following lists separate, instead of having a single per- + // language struct, to give the compiler a chance to remove unused code. + + // Some uppercase mappers are stateless, so we can precompute the + // Transformers and save a bit on runtime allocations. + upperFunc = []mapFunc{ + nil, // und + nil, // af + aztrUpper(upper), // az + elUpper, // el + ltUpper(upper), // lt + nil, // nl + aztrUpper(upper), // tr + } + + undUpper transform.Transformer = &undUpperCaser{} + + lowerFunc = []mapFunc{ + lower, // und + lower, // af + aztrLower, // az + lower, // el + ltLower, // lt + lower, // nl + aztrLower, // tr + } + + titleInfos = []struct { + title, lower mapFunc + rewrite func(*context) + }{ + {title, lower, nil}, // und + {title, lower, afnlRewrite}, // af + {aztrUpper(title), aztrLower, nil}, // az + {title, lower, nil}, // el + {ltUpper(title), ltLower, nil}, // lt + {nlTitle, lower, afnlRewrite}, // nl + {aztrUpper(title), aztrLower, nil}, // tr + } +) + +func makeUpper(t language.Tag, o options) transform.Transformer { + _, i, _ := matcher.Match(t) + f := upperFunc[i] + if f == nil { + return undUpper + } + return &simpleCaser{f: f} +} + +func makeLower(t language.Tag, o options) transform.Transformer { + _, i, _ := matcher.Match(t) + f := lowerFunc[i] + if o.noFinalSigma { + return &simpleCaser{f: f} + } + return &lowerCaser{ + first: f, + midWord: finalSigma(f), + } +} + +func makeTitle(t language.Tag, o options) transform.Transformer { + _, i, _ := matcher.Match(t) + x := &titleInfos[i] + lower := x.lower + if o.noLower { + lower = (*context).copy + } else if !o.noFinalSigma { + lower = finalSigma(lower) + } + return &titleCaser{ + title: x.title, + lower: lower, + rewrite: x.rewrite, + } +} + +// TODO: consider a similar special case for the fast majority lower case. This +// is a bit more involved so will require some more precise benchmarking to +// justify it. + +type undUpperCaser struct{ transform.NopResetter } + +// undUpperCaser implements the Transformer interface for doing an upper case +// mapping for the root locale (und). It eliminates the need for an allocation +// as it prevents escaping by not using function pointers. +func (t *undUpperCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + c := context{dst: dst, src: src, atEOF: atEOF} + for c.next() { + upper(&c) + c.checkpoint() + } + return c.ret() +} + +type simpleCaser struct { + context + f mapFunc +} + +// simpleCaser implements the Transformer interface for doing a case operation +// on a rune-by-rune basis. +func (t *simpleCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + t.context = context{dst: dst, src: src, atEOF: atEOF} + c := &t.context + for c.next() && t.f(c) { + c.checkpoint() + } + return c.ret() +} + +// lowerCaser implements the Transformer interface. The default Unicode lower +// casing requires different treatment for the first and subsequent characters +// of a word, most notably to handle the Greek final Sigma. +type lowerCaser struct { + context + + first, midWord mapFunc +} + +func (t *lowerCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + t.context = context{dst: dst, src: src, atEOF: atEOF} + c := &t.context + + for isInterWord := true; c.next(); { + if isInterWord { + if c.info.isCased() { + if !t.first(c) { + break + } + isInterWord = false + } else if !c.copy() { + break + } + } else { + if c.info.isNotCasedAndNotCaseIgnorable() { + if !c.copy() { + break + } + isInterWord = true + } else if !t.midWord(c) { + break + } + } + c.checkpoint() + } + return c.ret() +} + +// titleCaser implements the Transformer interface. Title casing algorithms +// distinguish between the first letter of a word and subsequent letters of the +// same word. It uses state to avoid requiring a potentially infinite lookahead. +type titleCaser struct { + context + + // rune mappings used by the actual casing algorithms. + title, lower mapFunc + + rewrite func(*context) +} + +// Transform implements the standard Unicode title case algorithm as defined in +// Chapter 3 of The Unicode Standard: +// toTitlecase(X): Find the word boundaries in X according to Unicode Standard +// Annex #29, "Unicode Text Segmentation." For each word boundary, find the +// first cased character F following the word boundary. If F exists, map F to +// Titlecase_Mapping(F); then map all characters C between F and the following +// word boundary to Lowercase_Mapping(C). +func (t *titleCaser) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + t.context = context{dst: dst, src: src, atEOF: atEOF, isMidWord: t.isMidWord} + c := &t.context + + if !c.next() { + return c.ret() + } + + for { + p := c.info + if t.rewrite != nil { + t.rewrite(c) + } + + wasMid := p.isCaseIgnorableAndNonBreakStarter() + // Break out of this loop on failure to ensure we do not modify the + // state incorrectly. + if p.isCased() && !p.isCaseIgnorableAndNotCased() { + if !c.isMidWord { + if !t.title(c) { + break + } + c.isMidWord = true + } else if !t.lower(c) { + break + } + } else if !c.copy() { + break + } + + // TODO: make this an "else if" if we can prove that no rune that does + // not match the first condition of the if statement can be a break. + if p.isBreak() { + c.isMidWord = false + } + + // As we save the state of the transformer, it is safe to call + // checkpoint after any successful write. + c.checkpoint() + + if !c.next() { + break + } + if wasMid && c.info.isCaseIgnorableAndNonBreakStarter() { + c.isMidWord = false + } + } + return c.ret() +} + +// finalSigma adds Greek final Sigma handing to another casing function. It +// determines whether a lowercased sigma should be σ or ς, by looking ahead for +// case-ignorables and a cased letters. +func finalSigma(f mapFunc) mapFunc { + return func(c *context) bool { + // ::NFD(); + // # 03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA + // Σ } [:case-ignorable:]* [:cased:] → σ; + // [:cased:] [:case-ignorable:]* { Σ → ς; + // ::Any-Lower; + // ::NFC(); + + if !c.hasPrefix("Σ") { + return f(c) + } + + p := c.pDst + c.writeString("ς") + // We need to do one more iteration after maxIgnorable, as a cased + // letter is not an ignorable and may modify the result. + for i := 0; i < maxIgnorable+1; i++ { + if !c.next() { + return false + } + if !c.info.isCaseIgnorable() { + if c.info.isCased() { + // p+1 is guaranteed to be in bounds: if writing ς was + // successful, p+1 will contain the second byte of ς. If not, + // this function will have returned after c.next returned false. + c.dst[p+1]++ // ς → σ + } + c.unreadRune() + return true + } + // A case ignorable may also introduce a word break, so we may need + // to continue searching even after detecting a break. + c.isMidWord = c.isMidWord && !c.info.isBreak() + c.copy() + } + return true + } +} + +// elUpper implements Greek upper casing, which entails removing a predefined +// set of non-blocked modifiers. Note that these accents should not be removed +// for title casing! +// Example: "Οδός" -> "ΟΔΟΣ". +func elUpper(c *context) bool { + // From CLDR: + // [:Greek:] [^[:ccc=Not_Reordered:][:ccc=Above:]]*? { [\u0313\u0314\u0301\u0300\u0306\u0342\u0308\u0304] → ; + // [:Greek:] [^[:ccc=Not_Reordered:][:ccc=Iota_Subscript:]]*? { \u0345 → ; + + r, _ := utf8.DecodeRune(c.src[c.pSrc:]) + oldPDst := c.pDst + if !upper(c) { + return false + } + if !unicode.Is(unicode.Greek, r) { + return true + } + i := 0 + // Take the properties of the uppercased rune that is already written to the + // destination. This saves us the trouble of having to uppercase the + // decomposed rune again. + if b := norm.NFD.Properties(c.dst[oldPDst:]).Decomposition(); b != nil { + // Restore the destination position and process the decomposed rune. + r, sz := utf8.DecodeRune(b) + if r <= 0xFF { // See A.6.1 + return true + } + c.pDst = oldPDst + // Insert the first rune and ignore the modifiers. See A.6.2. + c.writeBytes(b[:sz]) + i = len(b[sz:]) / 2 // Greek modifiers are always of length 2. + } + + for ; i < maxIgnorable && c.next(); i++ { + switch r, _ := utf8.DecodeRune(c.src[c.pSrc:]); r { + // Above and Iota Subscript + case 0x0300, // U+0300 COMBINING GRAVE ACCENT + 0x0301, // U+0301 COMBINING ACUTE ACCENT + 0x0304, // U+0304 COMBINING MACRON + 0x0306, // U+0306 COMBINING BREVE + 0x0308, // U+0308 COMBINING DIAERESIS + 0x0313, // U+0313 COMBINING COMMA ABOVE + 0x0314, // U+0314 COMBINING REVERSED COMMA ABOVE + 0x0342, // U+0342 COMBINING GREEK PERISPOMENI + 0x0345: // U+0345 COMBINING GREEK YPOGEGRAMMENI + // No-op. Gobble the modifier. + + default: + switch v, _ := trie.lookup(c.src[c.pSrc:]); info(v).cccType() { + case cccZero: + c.unreadRune() + return true + + // We don't need to test for IotaSubscript as the only rune that + // qualifies (U+0345) was already excluded in the switch statement + // above. See A.4. + + case cccAbove: + return c.copy() + default: + // Some other modifier. We're still allowed to gobble Greek + // modifiers after this. + c.copy() + } + } + } + return i == maxIgnorable +} + +func ltLower(c *context) bool { + // From CLDR: + // # Introduce an explicit dot above when lowercasing capital I's and J's + // # whenever there are more accents above. + // # (of the accents used in Lithuanian: grave, acute, tilde above, and ogonek) + // # 0049; 0069 0307; 0049; 0049; lt More_Above; # LATIN CAPITAL LETTER I + // # 004A; 006A 0307; 004A; 004A; lt More_Above; # LATIN CAPITAL LETTER J + // # 012E; 012F 0307; 012E; 012E; lt More_Above; # LATIN CAPITAL LETTER I WITH OGONEK + // # 00CC; 0069 0307 0300; 00CC; 00CC; lt; # LATIN CAPITAL LETTER I WITH GRAVE + // # 00CD; 0069 0307 0301; 00CD; 00CD; lt; # LATIN CAPITAL LETTER I WITH ACUTE + // # 0128; 0069 0307 0303; 0128; 0128; lt; # LATIN CAPITAL LETTER I WITH TILDE + // ::NFD(); + // I } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → i \u0307; + // J } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → j \u0307; + // Į } [^[:ccc=Not_Reordered:][:ccc=Above:]]* [:ccc=Above:] → į \u0307; + // Ì → i \u0307 \u0300; + // Í → i \u0307 \u0301; + // Ĩ → i \u0307 \u0303; + // ::Any-Lower(); + // ::NFC(); + + i := 0 + if r := c.src[c.pSrc]; r < utf8.RuneSelf { + lower(c) + if r != 'I' && r != 'J' { + return true + } + } else { + p := norm.NFD.Properties(c.src[c.pSrc:]) + if d := p.Decomposition(); len(d) >= 3 && (d[0] == 'I' || d[0] == 'J') { + // UTF-8 optimization: the decomposition will only have an above + // modifier if the last rune of the decomposition is in [U+300-U+311]. + // In all other cases, a decomposition starting with I is always + // an I followed by modifiers that are not cased themselves. See A.2. + if d[1] == 0xCC && d[2] <= 0x91 { // A.2.4. + if !c.writeBytes(d[:1]) { + return false + } + c.dst[c.pDst-1] += 'a' - 'A' // lower + + // Assumption: modifier never changes on lowercase. See A.1. + // Assumption: all modifiers added have CCC = Above. See A.2.3. + return c.writeString("\u0307") && c.writeBytes(d[1:]) + } + // In all other cases the additional modifiers will have a CCC + // that is less than 230 (Above). We will insert the U+0307, if + // needed, after these modifiers so that a string in FCD form + // will remain so. See A.2.2. + lower(c) + i = 1 + } else { + return lower(c) + } + } + + for ; i < maxIgnorable && c.next(); i++ { + switch c.info.cccType() { + case cccZero: + c.unreadRune() + return true + case cccAbove: + return c.writeString("\u0307") && c.copy() // See A.1. + default: + c.copy() // See A.1. + } + } + return i == maxIgnorable +} + +func ltUpper(f mapFunc) mapFunc { + return func(c *context) bool { + // From CLDR: + // ::NFD(); + // [:Soft_Dotted:] [^[:ccc=Not_Reordered:][:ccc=Above:]]* { \u0307 → ; + // ::Any-Upper(); + // ::NFC(); + + // TODO: See A.5. A soft-dotted rune never has an exception. This would + // allow us to overload the exception bit and encode this property in + // info. Need to measure performance impact of this. + r, _ := utf8.DecodeRune(c.src[c.pSrc:]) + oldPDst := c.pDst + if !f(c) { + return false + } + if !unicode.Is(unicode.Soft_Dotted, r) { + return true + } + + // We don't need to do an NFD normalization, as a soft-dotted rune never + // contains U+0307. See A.3. + + i := 0 + for ; i < maxIgnorable && c.next(); i++ { + switch c.info.cccType() { + case cccZero: + c.unreadRune() + return true + case cccAbove: + if c.hasPrefix("\u0307") { + // We don't do a full NFC, but rather combine runes for + // some of the common cases. (Returning NFC or + // preserving normal form is neither a requirement nor + // a possibility anyway). + if !c.next() { + return false + } + if c.dst[oldPDst] == 'I' && c.pDst == oldPDst+1 && c.src[c.pSrc] == 0xcc { + s := "" + switch c.src[c.pSrc+1] { + case 0x80: // U+0300 COMBINING GRAVE ACCENT + s = "\u00cc" // U+00CC LATIN CAPITAL LETTER I WITH GRAVE + case 0x81: // U+0301 COMBINING ACUTE ACCENT + s = "\u00cd" // U+00CD LATIN CAPITAL LETTER I WITH ACUTE + case 0x83: // U+0303 COMBINING TILDE + s = "\u0128" // U+0128 LATIN CAPITAL LETTER I WITH TILDE + case 0x88: // U+0308 COMBINING DIAERESIS + s = "\u00cf" // U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS + default: + } + if s != "" { + c.pDst = oldPDst + return c.writeString(s) + } + } + } + return c.copy() + default: + c.copy() + } + } + return i == maxIgnorable + } +} + +func aztrUpper(f mapFunc) mapFunc { + return func(c *context) bool { + // i→İ; + if c.src[c.pSrc] == 'i' { + return c.writeString("İ") + } + return f(c) + } +} + +func aztrLower(c *context) (done bool) { + // From CLDR: + // # I and i-dotless; I-dot and i are case pairs in Turkish and Azeri + // # 0130; 0069; 0130; 0130; tr; # LATIN CAPITAL LETTER I WITH DOT ABOVE + // İ→i; + // # When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i. + // # This matches the behavior of the canonically equivalent I-dot_above + // # 0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE + // # When lowercasing, unless an I is before a dot_above, it turns into a dotless i. + // # 0049; 0131; 0049; 0049; tr Not_Before_Dot; # LATIN CAPITAL LETTER I + // I([^[:ccc=Not_Reordered:][:ccc=Above:]]*)\u0307 → i$1 ; + // I→ı ; + // ::Any-Lower(); + if c.hasPrefix("\u0130") { // İ + return c.writeString("i") + } + if c.src[c.pSrc] != 'I' { + return lower(c) + } + + // We ignore the lower-case I for now, but insert it later when we know + // which form we need. + start := c.pSrc + c.sz + + i := 0 +Loop: + // We check for up to n ignorables before \u0307. As \u0307 is an + // ignorable as well, n is maxIgnorable-1. + for ; i < maxIgnorable && c.next(); i++ { + switch c.info.cccType() { + case cccAbove: + if c.hasPrefix("\u0307") { + return c.writeString("i") && c.writeBytes(c.src[start:c.pSrc]) // ignore U+0307 + } + done = true + break Loop + case cccZero: + c.unreadRune() + done = true + break Loop + default: + // We'll write this rune after we know which starter to use. + } + } + if i == maxIgnorable { + done = true + } + return c.writeString("ı") && c.writeBytes(c.src[start:c.pSrc+c.sz]) && done +} + +func nlTitle(c *context) bool { + // From CLDR: + // # Special titlecasing for Dutch initial "ij". + // ::Any-Title(); + // # Fix up Ij at the beginning of a "word" (per Any-Title, notUAX #29) + // [:^WB=ALetter:] [:WB=Extend:]* [[:WB=MidLetter:][:WB=MidNumLet:]]? { Ij } → IJ ; + if c.src[c.pSrc] != 'I' && c.src[c.pSrc] != 'i' { + return title(c) + } + + if !c.writeString("I") || !c.next() { + return false + } + if c.src[c.pSrc] == 'j' || c.src[c.pSrc] == 'J' { + return c.writeString("J") + } + c.unreadRune() + return true +} + +// Not part of CLDR, but see http://unicode.org/cldr/trac/ticket/7078. +func afnlRewrite(c *context) { + if c.hasPrefix("'") || c.hasPrefix("’") { + c.isMidWord = true + } +} diff --git a/vendor/golang.org/x/text/cases/map_test.go b/vendor/golang.org/x/text/cases/map_test.go new file mode 100644 index 0000000000..5e80625343 --- /dev/null +++ b/vendor/golang.org/x/text/cases/map_test.go @@ -0,0 +1,619 @@ +// 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 cases + +import ( + "bytes" + "strings" + "testing" + + "golang.org/x/text/language" + "golang.org/x/text/transform" + "golang.org/x/text/unicode/norm" +) + +type testCase struct { + lang string + src interface{} // string, []string, or nil to skip test + title interface{} // string, []string, or nil to skip test + lower interface{} // string, []string, or nil to skip test + upper interface{} // string, []string, or nil to skip test + opts options +} + +// We don't support the NoFinalSigma option, but we use it to test the +// underlying lower casers and to be able to compare differences in performance. +func noFinalSigma(o *options) { + o.noFinalSigma = true +} + +var testCases = []testCase{ + 0: { + lang: "und", + src: "abc aBc ABC abC İsıI ΕΣΆΣ", + title: "Abc Abc Abc Abc İsıi Εσάσ", + lower: "abc abc abc abc i\u0307sıi εσάσ", + upper: "ABC ABC ABC ABC İSII ΕΣΆΣ", + opts: getOpts(noFinalSigma), + }, + + 1: { + lang: "und", + src: "abc aBc ABC abC İsıI ΕΣΆΣ Σ _Σ -Σ", + title: "Abc Abc Abc Abc İsıi Εσάς Σ _Σ -Σ", + lower: "abc abc abc abc i\u0307sıi εσάς σ _σ -σ", + upper: "ABC ABC ABC ABC İSII ΕΣΆΣ Σ _Σ -Σ", + }, + + 2: { // Title cased runes. + lang: supported, + src: "DžA", + title: "Dža", + lower: "dža", + upper: "DŽA", + }, + + 3: { + // Title breaking. + lang: supported, + src: []string{ + "FOO CASE TEST", + "DON'T DO THiS", + "χωΡΊΣ χωΡΊΣ^a χωΡΊΣ:a χωΡΊΣ:^a χωΡΊΣ^ όμΩΣ Σ", + "with-hyphens", + "49ers 49ers", + `"capitalize a^a -hyphen 0X _u a_u:a`, + "MidNumLet a.b\u2018c\u2019d\u2024e\ufe52f\uff07f\uff0eg", + "MidNum a,b;c\u037ed\u0589e\u060cf\u2044g\ufe50h", + "\u0345 x\u3031x x\u05d0x \u05d0x a'.a a.a a4,a", + }, + title: []string{ + "Foo Case Test", + "Don't Do This", + "Χωρίς Χωρίσ^A Χωρίσ:a Χωρίσ:^A Χωρίς^ Όμως Σ", + "With-Hyphens", + // Note that 49Ers is correct according to the spec. + // TODO: provide some option to the user to treat different + // characters as cased. + "49Ers 49Ers", + `"Capitalize A^A -Hyphen 0X _U A_u:a`, + "Midnumlet A.b\u2018c\u2019d\u2024e\ufe52f\uff07f\uff0eg", + "Midnum A,B;C\u037eD\u0589E\u060cF\u2044G\ufe50H", + "\u0399 X\u3031X X\u05d0x \u05d0X A'.A A.a A4,A", + }, + }, + + // TODO: These are known deviations from the options{} Unicode Word Breaking + // Algorithm. + // { + // "und", + // "x_\u3031_x a4,4a", + // "X_\u3031_x A4,4a", // Currently is "X_\U3031_X A4,4A". + // "x_\u3031_x a4,4a", + // "X_\u3031_X A4,4A", + // options{}, + // }, + + 4: { + // Tests title options + lang: "und", + src: "abc aBc ABC abC İsıI o'Brien", + title: "Abc ABc ABC AbC İsıI O'Brien", + opts: getOpts(NoLower), + }, + + 5: { + lang: "el", + src: "aBc ΟΔΌΣ Οδός Σο ΣΟ Σ oΣ ΟΣ σ ἕξ \u03ac", + title: "Abc Οδός Οδός Σο Σο Σ Oς Ος Σ Ἕξ \u0386", + lower: "abc οδός οδός σο σο σ oς ος σ ἕξ \u03ac", + upper: "ABC ΟΔΟΣ ΟΔΟΣ ΣΟ ΣΟ Σ OΣ ΟΣ Σ ΕΞ \u0391", // Uppercase removes accents + }, + + 6: { + lang: "tr az", + src: "Isiİ İsıI I\u0307sIiİ İsıI\u0307 I\u0300\u0307", + title: "Isii İsıı I\u0307sıii İsıi I\u0300\u0307", + lower: "ısii isıı isıii isıi \u0131\u0300\u0307", + upper: "ISİİ İSII I\u0307SIİİ İSII\u0307 I\u0300\u0307", + }, + + 7: { + lang: "lt", + src: "I Ï J J̈ Į Į̈ Ì Í Ĩ xi̇̈ xj̇̈ xį̇̈ xi̇̀ xi̇́ xi̇̃ XI XÏ XJ XJ̈ XĮ XĮ̈ XI̟̤", + title: "I Ï J J̈ Į Į̈ Ì Í Ĩ Xi̇̈ Xj̇̈ Xį̇̈ Xi̇̀ Xi̇́ Xi̇̃ Xi Xi̇̈ Xj Xj̇̈ Xį Xį̇̈ Xi̟̤", + lower: "i i̇̈ j j̇̈ į į̇̈ i̇̀ i̇́ i̇̃ xi̇̈ xj̇̈ xį̇̈ xi̇̀ xi̇́ xi̇̃ xi xi̇̈ xj xj̇̈ xį xį̇̈ xi̟̤", + upper: "I Ï J J̈ Į Į̈ Ì Í Ĩ XÏ XJ̈ XĮ̈ XÌ XÍ XĨ XI XÏ XJ XJ̈ XĮ XĮ̈ XI̟̤", + }, + + 8: { + lang: "lt", + src: "\u012e\u0300 \u00cc i\u0307\u0300 i\u0307\u0301 i\u0307\u0303 i\u0307\u0308 i\u0300\u0307", + title: "\u012e\u0300 \u00cc \u00cc \u00cd \u0128 \u00cf I\u0300\u0307", + lower: "\u012f\u0307\u0300 i\u0307\u0300 i\u0307\u0300 i\u0307\u0301 i\u0307\u0303 i\u0307\u0308 i\u0300\u0307", + upper: "\u012e\u0300 \u00cc \u00cc \u00cd \u0128 \u00cf I\u0300\u0307", + }, + + 9: { + lang: "nl", + src: "ijs IJs Ij Ijs İJ İJs aa aA 'ns 'S", + title: "IJs IJs IJ IJs İj İjs Aa Aa 'ns 's", + }, + + // Note: this specification is not currently part of CLDR. The same holds + // for the leading apostrophe handling for Dutch. + // See http://unicode.org/cldr/trac/ticket/7078. + 10: { + lang: "af", + src: "wag 'n bietjie", + title: "Wag 'n Bietjie", + lower: "wag 'n bietjie", + upper: "WAG 'N BIETJIE", + }, +} + +func TestCaseMappings(t *testing.T) { + for i, tt := range testCases { + src, ok := tt.src.([]string) + if !ok { + src = strings.Split(tt.src.(string), " ") + } + + for _, lang := range strings.Split(tt.lang, " ") { + tag := language.MustParse(lang) + testEntry := func(name string, mk func(language.Tag, options) transform.Transformer, gold interface{}) { + c := Caser{mk(tag, tt.opts)} + if gold != nil { + wants, ok := gold.([]string) + if !ok { + wants = strings.Split(gold.(string), " ") + } + for j, want := range wants { + if got := c.String(src[j]); got != want { + t.Errorf("%d:%s:\n%s.String(%+q):\ngot %+q;\nwant %+q", i, lang, name, src[j], got, want) + } + } + } + dst := make([]byte, 256) // big enough to hold any result + src := []byte(strings.Join(src, " ")) + v := testing.AllocsPerRun(20, func() { + c.Transform(dst, src, true) + }) + if v > 1.1 { + t.Errorf("%d:%s:\n%s: number of allocs was %f; want 0", i, lang, name, v) + } + } + testEntry("Upper", makeUpper, tt.upper) + testEntry("Lower", makeLower, tt.lower) + testEntry("Title", makeTitle, tt.title) + } + } +} + +// TestAlloc tests that some mapping methods should not cause any allocation. +func TestAlloc(t *testing.T) { + dst := make([]byte, 256) // big enough to hold any result + src := []byte(txtNonASCII) + + for i, f := range []func() Caser{ + func() Caser { return Upper(language.Und) }, + func() Caser { return Lower(language.Und) }, + func() Caser { return Title(language.Und) }, + } { + var c Caser + v := testing.AllocsPerRun(2, func() { + c = f() + }) + if v > 1 { + // TODO: Right now only Upper has 1 allocation. Special-case Lower + // and Title as well to have less allocations for the root locale. + t.Skipf("%d:init: number of allocs was %f; want 0", i, v) + } + v = testing.AllocsPerRun(2, func() { + c.Transform(dst, src, true) + }) + if v > 0 { + t.Errorf("%d:transform: number of allocs was %f; want 0", i, v) + } + } +} + +func TestShortBuffersAndOverflow(t *testing.T) { + // minBufSize is the size of the buffer by which the casing operation in + // this package are guaranteed to make progress. + const minBufSize = norm.MaxSegmentSize + + for i, tt := range []struct { + desc, src, want string + firstErr error + dstSize, srcSize int + t transform.Transformer + }{{ + desc: "und upper: short dst", + src: "abcdefg", + want: "ABCDEFG", + firstErr: transform.ErrShortDst, + dstSize: 3, + srcSize: minBufSize, + t: Upper(language.Und), + }, { + desc: "und upper: short src", + src: "123é56", + want: "123É56", + firstErr: transform.ErrShortSrc, + dstSize: 4, + srcSize: 4, + t: Upper(language.Und), + }, { + desc: "und upper: no error on short", + src: "12", + want: "12", + firstErr: nil, + dstSize: 1, + srcSize: 1, + t: Upper(language.Und), + }, { + desc: "und lower: short dst", + src: "ABCDEFG", + want: "abcdefg", + firstErr: transform.ErrShortDst, + dstSize: 3, + srcSize: minBufSize, + t: Lower(language.Und), + }, { + desc: "und lower: short src", + src: "123É56", + want: "123é56", + firstErr: transform.ErrShortSrc, + dstSize: 4, + srcSize: 4, + t: Lower(language.Und), + }, { + desc: "und lower: no error on short", + src: "12", + want: "12", + firstErr: nil, + dstSize: 1, + srcSize: 1, + t: Lower(language.Und), + }, { + desc: "final sigma: no error", + src: "ΟΣ", + want: "Ος", + dstSize: minBufSize, + srcSize: minBufSize, + t: Title(language.Und), + }, { + desc: "final sigma: short source", + src: "ΟΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣ", + want: "Οσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσς", + firstErr: transform.ErrShortSrc, + dstSize: minBufSize, + srcSize: 10, + t: Title(language.Und), + }, { + desc: "final sigma: short destination 1", + src: "ΟΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣ", + want: "Οσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσς", + firstErr: transform.ErrShortDst, + dstSize: 10, + srcSize: minBufSize, + t: Title(language.Und), + }, { + desc: "final sigma: short destination 2", + src: "ΟΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣ", + want: "Οσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσς", + firstErr: transform.ErrShortDst, + dstSize: 9, + srcSize: minBufSize, + t: Title(language.Und), + }, { + desc: "final sigma: short destination 3", + src: "ΟΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣΣ", + want: "Οσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσς", + firstErr: transform.ErrShortDst, + dstSize: 8, + srcSize: minBufSize, + t: Title(language.Und), + }, { + desc: "clipped UTF-8 rune", + src: "σσσσσσσσσσσ", + want: "Σσσσσσσσσσσ", + firstErr: transform.ErrShortSrc, + dstSize: minBufSize, + srcSize: 5, + t: Title(language.Und), + }, { + desc: "clipped UTF-8 rune atEOF", + src: "σσσ" + string([]byte{0xC0}), + want: "Σσσ" + string([]byte{0xC0}), + dstSize: minBufSize, + srcSize: minBufSize, + t: Title(language.Und), + }, { + // Note: the choice to change the final sigma at the end in case of + // too many case ignorables is arbitrary. The main reason for this + // choice is that it results in simpler code. + desc: "final sigma: max ignorables", + src: "ΟΣ" + strings.Repeat(".", maxIgnorable) + "a", + want: "Οσ" + strings.Repeat(".", maxIgnorable) + "a", + dstSize: minBufSize, + srcSize: minBufSize, + t: Title(language.Und), + }, { + // Note: the choice to change the final sigma at the end in case of + // too many case ignorables is arbitrary. The main reason for this + // choice is that it results in simpler code. + desc: "final sigma: too many ignorables", + src: "ΟΣ" + strings.Repeat(".", maxIgnorable+1) + "a", + want: "Ος" + strings.Repeat(".", maxIgnorable+1) + "a", + dstSize: minBufSize, + srcSize: len("ΟΣ" + strings.Repeat(".", maxIgnorable+1)), + t: Title(language.Und), + }, { + desc: "el upper: max ignorables", + src: "ο" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0313", + want: "Ο" + strings.Repeat("\u0321", maxIgnorable-1), + dstSize: minBufSize, + srcSize: minBufSize, + t: Upper(language.Greek), + }, { + desc: "el upper: too many ignorables", + src: "ο" + strings.Repeat("\u0321", maxIgnorable) + "\u0313", + want: "Ο" + strings.Repeat("\u0321", maxIgnorable) + "\u0313", + dstSize: minBufSize, + srcSize: len("ο" + strings.Repeat("\u0321", maxIgnorable)), + t: Upper(language.Greek), + }, { + desc: "el upper: short dst", + src: "123ο", + want: "123Ο", + firstErr: transform.ErrShortDst, + dstSize: 3, + srcSize: minBufSize, + t: Upper(language.Greek), + }, { + desc: "lt lower: max ignorables", + src: "I" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0300", + want: "i" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0307\u0300", + dstSize: minBufSize, + srcSize: minBufSize, + t: Lower(language.Lithuanian), + }, { + desc: "lt lower: too many ignorables", + src: "I" + strings.Repeat("\u0321", maxIgnorable) + "\u0300", + want: "i" + strings.Repeat("\u0321", maxIgnorable) + "\u0300", + dstSize: minBufSize, + srcSize: len("I" + strings.Repeat("\u0321", maxIgnorable)), + t: Lower(language.Lithuanian), + }, { + desc: "lt lower: decomposition with short dst buffer 1", + src: "aaaaa\u00cc", // U+00CC LATIN CAPITAL LETTER I GRAVE + firstErr: transform.ErrShortDst, + want: "aaaaai\u0307\u0300", + dstSize: 5, + srcSize: minBufSize, + t: Lower(language.Lithuanian), + }, { + desc: "lt lower: decomposition with short dst buffer 2", + src: "aaaa\u00cc", // U+00CC LATIN CAPITAL LETTER I GRAVE + firstErr: transform.ErrShortDst, + want: "aaaai\u0307\u0300", + dstSize: 5, + srcSize: minBufSize, + t: Lower(language.Lithuanian), + }, { + desc: "lt upper: max ignorables", + src: "i" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0307\u0300", + want: "I" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0300", + dstSize: minBufSize, + srcSize: minBufSize, + t: Upper(language.Lithuanian), + }, { + desc: "lt upper: too many ignorables", + src: "i" + strings.Repeat("\u0321", maxIgnorable) + "\u0307\u0300", + want: "I" + strings.Repeat("\u0321", maxIgnorable) + "\u0307\u0300", + dstSize: minBufSize, + srcSize: len("i" + strings.Repeat("\u0321", maxIgnorable)), + t: Upper(language.Lithuanian), + }, { + desc: "lt upper: short dst", + src: "12i\u0307\u0300", + want: "12\u00cc", + firstErr: transform.ErrShortDst, + dstSize: 3, + srcSize: minBufSize, + t: Upper(language.Lithuanian), + }, { + desc: "aztr lower: max ignorables", + src: "I" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0307\u0300", + want: "i" + strings.Repeat("\u0321", maxIgnorable-1) + "\u0300", + dstSize: minBufSize, + srcSize: minBufSize, + t: Lower(language.Turkish), + }, { + desc: "aztr lower: too many ignorables", + src: "I" + strings.Repeat("\u0321", maxIgnorable) + "\u0307\u0300", + want: "\u0131" + strings.Repeat("\u0321", maxIgnorable) + "\u0307\u0300", + dstSize: minBufSize, + srcSize: len("I" + strings.Repeat("\u0321", maxIgnorable)), + t: Lower(language.Turkish), + }, { + desc: "nl title: pre-IJ cutoff", + src: " ij", + want: " IJ", + firstErr: transform.ErrShortDst, + dstSize: 2, + srcSize: minBufSize, + t: Title(language.Dutch), + }, { + desc: "nl title: mid-IJ cutoff", + src: " ij", + want: " IJ", + firstErr: transform.ErrShortDst, + dstSize: 3, + srcSize: minBufSize, + t: Title(language.Dutch), + }} { + buf := make([]byte, tt.dstSize) + got := []byte{} + var nSrc, nDst int + var err error + for p := 0; p < len(tt.src); p += nSrc { + q := p + tt.srcSize + if q > len(tt.src) { + q = len(tt.src) + } + nDst, nSrc, err = tt.t.Transform(buf, []byte(tt.src[p:q]), q == len(tt.src)) + got = append(got, buf[:nDst]...) + + if p == 0 && err != tt.firstErr { + t.Errorf("%d:%s:\n error was %v; want %v", i, tt.desc, err, tt.firstErr) + break + } + } + if string(got) != tt.want { + t.Errorf("%d:%s:\ngot %+q;\nwant %+q", i, tt.desc, got, tt.want) + } + } +} + +var txtASCII = strings.Repeat("The quick brown fox jumps over the lazy dog. ", 50) + +// Taken from http://creativecommons.org/licenses/by-sa/3.0/vn/ +const txt_vn = `Với các điều kiện sau: Ghi nhận công của tác giả. Nếu bạn sử +dụng, chuyển đổi, hoặc xây dựng dự án từ nội dung được chia sẻ này, bạn phải áp +dụng giấy phép này hoặc một giấy phép khác có các điều khoản tương tự như giấy +phép này cho dự án của bạn. Hiểu rằng: Miễn — Bất kỳ các điều kiện nào trên đây +cũng có thể được miễn bỏ nếu bạn được sự cho phép của người sở hữu bản quyền. +Phạm vi công chúng — Khi tác phẩm hoặc bất kỳ chương nào của tác phẩm đã trong +vùng dành cho công chúng theo quy định của pháp luật thì tình trạng của nó không +bị ảnh hưởng bởi giấy phép trong bất kỳ trường hợp nào.` + +// http://creativecommons.org/licenses/by-sa/2.5/cn/ +const txt_cn = `您可以自由: 复制、发行、展览、表演、放映、 +广播或通过信息网络传播本作品 创作演绎作品 +对本作品进行商业性使用 惟须遵守下列条件: +署名 — 您必须按照作者或者许可人指定的方式对作品进行署名。 +相同方式共享 — 如果您改变、转换本作品或者以本作品为基础进行创作, +您只能采用与本协议相同的许可协议发布基于本作品的演绎作品。` + +// Taken from http://creativecommons.org/licenses/by-sa/1.0/deed.ru +const txt_ru = `При обязательном соблюдении следующих условий: Attribution — Вы +должны атрибутировать произведение (указывать автора и источник) в порядке, +предусмотренном автором или лицензиаром (но только так, чтобы никоим образом не +подразумевалось, что они поддерживают вас или использование вами данного +произведения). Υπό τις ακόλουθες προϋποθέσεις:` + +// Taken from http://creativecommons.org/licenses/by-sa/3.0/gr/ +const txt_gr = `Αναφορά Δημιουργού — Θα πρέπει να κάνετε την αναφορά στο έργο με +τον τρόπο που έχει οριστεί από το δημιουργό ή το χορηγούντο την άδεια (χωρίς +όμως να εννοείται με οποιονδήποτε τρόπο ότι εγκρίνουν εσάς ή τη χρήση του έργου +από εσάς). Παρόμοια Διανομή — Εάν αλλοιώσετε, τροποποιήσετε ή δημιουργήσετε +περαιτέρω βασισμένοι στο έργο θα μπορείτε να διανέμετε το έργο που θα προκύψει +μόνο με την ίδια ή παρόμοια άδεια.` + +const txtNonASCII = txt_vn + txt_cn + txt_ru + txt_gr + +// TODO: Improve ASCII performance. + +func benchFunc(b *testing.B, f func(b []byte) []byte, s string) { + src := []byte(s) + b.SetBytes(int64(len(src))) + for i := 0; i < b.N; i++ { + f(src) + } +} + +func benchTransformer(b *testing.B, t transform.Transformer, s string) { + src := []byte(s) + dst := make([]byte, len(src)) + b.SetBytes(int64(len(src))) + + for i := 0; i < b.N; i++ { + t.Reset() + t.Transform(dst, src, true) + } +} + +var ( + noSigma = options{noFinalSigma: true} +) + +func BenchmarkBytesToLower(b *testing.B) { + benchFunc(b, bytes.ToLower, txtNonASCII) +} + +func BenchmarkSigmaLower(b *testing.B) { + benchTransformer(b, makeLower(language.Und, options{}), txtNonASCII) +} + +func BenchmarkSimpleLower(b *testing.B) { + benchTransformer(b, makeLower(language.Und, noSigma), txtNonASCII) +} + +func BenchmarkBytesToLowerASCII(b *testing.B) { + benchFunc(b, bytes.ToLower, txtASCII) +} + +func BenchmarkSigmaLowerASCII(b *testing.B) { + benchTransformer(b, makeLower(language.Und, options{}), txtASCII) +} + +func BenchmarkSimpleLowerASCII(b *testing.B) { + benchTransformer(b, makeLower(language.Und, noSigma), txtASCII) +} + +func BenchmarkBytesToTitle(b *testing.B) { + benchFunc(b, bytes.ToTitle, txtNonASCII) +} + +func BenchmarkSigmaTitle(b *testing.B) { + benchTransformer(b, makeTitle(language.Und, options{}), txtNonASCII) +} + +func BenchmarkSimpleTitle(b *testing.B) { + benchTransformer(b, makeTitle(language.Und, noSigma), txtNonASCII) +} + +func BenchmarkBytesToTitleASCII(b *testing.B) { + benchFunc(b, bytes.ToTitle, txtASCII) +} + +func BenchmarkSigmaTitleASCII(b *testing.B) { + benchTransformer(b, makeTitle(language.Und, options{}), txtASCII) +} + +func BenchmarkSimpleTitleASCII(b *testing.B) { + benchTransformer(b, makeTitle(language.Und, noSigma), txtASCII) +} + +func BenchmarkBytesUpper(b *testing.B) { + benchFunc(b, bytes.ToUpper, txtNonASCII) +} + +func BenchmarkUpper(b *testing.B) { + benchTransformer(b, Upper(language.Und), txtNonASCII) +} + +func BenchmarkBytesUpperASCII(b *testing.B) { + benchFunc(b, bytes.ToUpper, txtASCII) +} + +func BenchmarkUpperASCII(b *testing.B) { + benchTransformer(b, Upper(language.Und), txtASCII) +} + +func BenchmarkUpperSmall(b *testing.B) { + benchTransformer(b, Upper(language.Und), "При") +} + +func BenchmarkLowerSmall(b *testing.B) { + benchTransformer(b, Lower(language.Und), "При") +} + +func BenchmarkTitleSmall(b *testing.B) { + benchTransformer(b, Title(language.Und), "при") +} diff --git a/vendor/golang.org/x/text/cases/tables.go b/vendor/golang.org/x/text/cases/tables.go new file mode 100644 index 0000000000..d8a6031373 --- /dev/null +++ b/vendor/golang.org/x/text/cases/tables.go @@ -0,0 +1,2120 @@ +// This file was generated by go generate; DO NOT EDIT + +package cases + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "8.0.0" + +var xorData string = "" + // Size: 179 bytes + "\x00\x06\x07\x00\x01?\x00\x0f\x03\x00\x0f\x12\x00\x0f\x1f\x00\x0f\x1d" + + "\x00\x01\x13\x00\x0f\x16\x00\x0f\x0b\x00\x0f3\x00\x0f7\x00\x01#\x00\x0f?" + + "\x00\x0e'\x00\x0f/\x00\x0e>\x00\x0f*\x00\x0c&\x00\x0c*\x00\x0c;\x00\x0c9" + + "\x00\x0c%\x00\x01\x08\x00\x03\x0d\x00\x03\x09\x00\x02\x06\x00\x02\x02" + + "\x00\x02\x0c\x00\x01\x00\x00\x01\x03\x00\x01\x01\x00\x01 \x00\x01\x0c" + + "\x00\x01\x10\x00\x03\x10\x00\x036 \x00\x037 \x00\x0b#\x10\x00\x0b 0\x00" + + "\x0b!\x10\x00\x0b!0\x00\x0b(\x04\x00\x03\x04\x1e\x00\x03\x0a\x00\x02:" + + "\x00\x02>\x00\x02,\x00\x02\x00\x00\x02\x10\x00\x01<\x00\x01&\x00\x01*" + + "\x00\x01.\x00\x010\x003 \x00\x01\x18\x00\x01(" + +var exceptions string = "" + // Size: 1785 bytes + "\x00\x12\x10μΜ\x12\x12ssSSSs\x13\x18i̇i̇\x10\x08I\x13\x18ʼnʼN\x11\x08sS" + + "\x12\x12dždžDž\x12\x12dždžDŽ\x10\x12DŽDž\x12\x12ljljLj\x12\x12ljljLJ\x10\x12LJLj\x12\x12" + + "njnjNj\x12\x12njnjNJ\x10\x12NJNj\x13\x18ǰJ̌\x12\x12dzdzDz\x12\x12dzdzDZ\x10\x12DZDz" + + "\x13\x18ⱥⱥ\x13\x18ⱦⱦ\x10\x18Ȿ\x10\x18Ɀ\x10\x18Ɐ\x10\x18Ɑ\x10\x18Ɒ\x10" + + "\x18Ɜ\x10\x18Ɡ\x10\x18Ɥ\x10\x18Ɦ\x10\x18Ɫ\x10\x18Ɬ\x10\x18Ɱ\x10\x18Ɽ\x10" + + "\x18Ʇ\x10\x18Ʝ\x10\x18Ʞ2\x10ιΙ\x160ΐΪ́\x160ΰΫ́\x12\x10σΣ\x12\x10βΒ" + + "\x12\x10θΘ\x12\x10φΦ\x12\x10πΠ\x12\x10κΚ\x12\x10ρΡ\x12\x10εΕ\x14$եւԵՒԵւ" + + "\x13\x18ẖH̱\x13\x18ẗT̈\x13\x18ẘW̊\x13\x18ẙY̊\x13\x18aʾAʾ\x13\x18ṡṠ" + + "\x12\x10ssß\x14 ὐΥ̓\x160ὒΥ̓̀\x160ὔΥ̓́\x160ὖΥ̓͂\x15+ἀιἈΙᾈ\x15+ἁιἉΙ" + + "ᾉ\x15+ἂιἊΙᾊ\x15+ἃιἋΙᾋ\x15+ἄιἌΙᾌ\x15+ἅιἍΙᾍ\x15+ἆιἎΙᾎ\x15+ἇιἏΙᾏ\x15\x1dἀ" + + "ιᾀἈΙ\x15\x1dἁιᾁἉΙ\x15\x1dἂιᾂἊΙ\x15\x1dἃιᾃἋΙ\x15\x1dἄιᾄἌΙ\x15\x1dἅιᾅἍΙ" + + "\x15\x1dἆιᾆἎΙ\x15\x1dἇιᾇἏΙ\x15+ἠιἨΙᾘ\x15+ἡιἩΙᾙ\x15+ἢιἪΙᾚ\x15+ἣιἫΙᾛ\x15+ἤ" + + "ιἬΙᾜ\x15+ἥιἭΙᾝ\x15+ἦιἮΙᾞ\x15+ἧιἯΙᾟ\x15\x1dἠιᾐἨΙ\x15\x1dἡιᾑἩΙ\x15\x1dἢιᾒ" + + "ἪΙ\x15\x1dἣιᾓἫΙ\x15\x1dἤιᾔἬΙ\x15\x1dἥιᾕἭΙ\x15\x1dἦιᾖἮΙ\x15\x1dἧιᾗἯΙ" + + "\x15+ὠιὨΙᾨ\x15+ὡιὩΙᾩ\x15+ὢιὪΙᾪ\x15+ὣιὫΙᾫ\x15+ὤιὬΙᾬ\x15+ὥιὭΙᾭ\x15+ὦιὮΙᾮ" + + "\x15+ὧιὯΙᾯ\x15\x1dὠιᾠὨΙ\x15\x1dὡιᾡὩΙ\x15\x1dὢιᾢὪΙ\x15\x1dὣιᾣὫΙ\x15\x1dὤι" + + "ᾤὬΙ\x15\x1dὥιᾥὭΙ\x15\x1dὦιᾦὮΙ\x15\x1dὧιᾧὯΙ\x15-ὰιᾺΙᾺͅ\x14#αιΑΙᾼ\x14$άι" + + "ΆΙΆͅ\x14 ᾶΑ͂\x166ᾶιΑ͂Ιᾼ͂\x14\x1cαιᾳΑΙ\x12\x10ιΙ\x15-ὴιῊΙῊͅ\x14#ηιΗΙῌ" + + "\x14$ήιΉΙΉͅ\x14 ῆΗ͂\x166ῆιΗ͂Ιῌ͂\x14\x1cηιῃΗΙ\x160ῒΪ̀\x160ΐΪ́" + + "\x14 ῖΙ͂\x160ῗΪ͂\x160ῢΫ̀\x160ΰΫ́\x14 ῤΡ̓\x14 ῦΥ͂\x160ῧΫ͂" + + "\x15-ὼιῺΙῺͅ\x14#ωιΩΙῼ\x14$ώιΏΙΏͅ\x14 ῶΩ͂\x166ῶιΩ͂Ιῼ͂\x14\x1cωιῳΩΙ\x12" + + "\x10ωω\x11\x08kk\x12\x10åå\x12\x10ɫɫ\x12\x10ɽɽ\x10\x10Ⱥ\x10\x10Ⱦ\x12\x10" + + "ɑɑ\x12\x10ɱɱ\x12\x10ɐɐ\x12\x10ɒɒ\x12\x10ȿȿ\x12\x10ɀɀ\x12\x10ɥɥ\x12\x10ɦ" + + "ɦ\x12\x10ɜɜ\x12\x10ɡɡ\x12\x10ɬɬ\x12\x10ʞʞ\x12\x10ʇʇ\x12\x10ʝʝ\x12\x12ff" + + "FFFf\x12\x12fiFIFi\x12\x12flFLFl\x13\x1bffiFFIFfi\x13\x1bfflFFLFfl\x12" + + "\x12stSTSt\x12\x12stSTSt\x14$մնՄՆՄն\x14$մեՄԵՄե\x14$միՄԻՄի\x14$վնՎՆՎն\x14" + + "$մխՄԽՄխ" + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *caseTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return caseValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := caseIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := caseIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = caseIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := caseIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = caseIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = caseIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *caseTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return caseValues[c0] + } + i := caseIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = caseIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = caseIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *caseTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return caseValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := caseIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := caseIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = caseIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := caseIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = caseIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = caseIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *caseTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return caseValues[c0] + } + i := caseIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = caseIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = caseIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// caseTrie. Total size: 11330 bytes (11.06 KiB). Checksum: 178236e3451623a8. +type caseTrie struct{} + +func newCaseTrie(i int) *caseTrie { + return &caseTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *caseTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 17: + return uint16(caseValues[n<<6+uint32(b)]) + default: + n -= 17 + return uint16(sparse.lookup(n, b)) + } +} + +// caseValues: 19 blocks, 1216 entries, 2432 bytes +// The third block is the zero block. +var caseValues = [1216]uint16{ + // Block 0x0, offset 0x0 + 0x27: 0x0014, + 0x2e: 0x0014, + 0x30: 0x0010, 0x31: 0x0010, 0x32: 0x0010, 0x33: 0x0010, 0x34: 0x0010, 0x35: 0x0010, + 0x36: 0x0010, 0x37: 0x0010, 0x38: 0x0010, 0x39: 0x0010, 0x3a: 0x0014, + // Block 0x1, offset 0x40 + 0x41: 0x2013, 0x42: 0x2013, 0x43: 0x2013, 0x44: 0x2013, 0x45: 0x2013, + 0x46: 0x2013, 0x47: 0x2013, 0x48: 0x2013, 0x49: 0x2013, 0x4a: 0x2013, 0x4b: 0x2013, + 0x4c: 0x2013, 0x4d: 0x2013, 0x4e: 0x2013, 0x4f: 0x2013, 0x50: 0x2013, 0x51: 0x2013, + 0x52: 0x2013, 0x53: 0x2013, 0x54: 0x2013, 0x55: 0x2013, 0x56: 0x2013, 0x57: 0x2013, + 0x58: 0x2013, 0x59: 0x2013, 0x5a: 0x2013, + 0x5e: 0x0004, 0x5f: 0x0010, 0x60: 0x0004, 0x61: 0x2012, 0x62: 0x2012, 0x63: 0x2012, + 0x64: 0x2012, 0x65: 0x2012, 0x66: 0x2012, 0x67: 0x2012, 0x68: 0x2012, 0x69: 0x2012, + 0x6a: 0x2012, 0x6b: 0x2012, 0x6c: 0x2012, 0x6d: 0x2012, 0x6e: 0x2012, 0x6f: 0x2012, + 0x70: 0x2012, 0x71: 0x2012, 0x72: 0x2012, 0x73: 0x2012, 0x74: 0x2012, 0x75: 0x2012, + 0x76: 0x2012, 0x77: 0x2012, 0x78: 0x2012, 0x79: 0x2012, 0x7a: 0x2012, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x0852, 0xc1: 0x0b53, 0xc2: 0x0113, 0xc3: 0x0112, 0xc4: 0x0113, 0xc5: 0x0112, + 0xc6: 0x0b53, 0xc7: 0x0f13, 0xc8: 0x0f12, 0xc9: 0x0e53, 0xca: 0x1153, 0xcb: 0x0713, + 0xcc: 0x0712, 0xcd: 0x0012, 0xce: 0x1453, 0xcf: 0x1753, 0xd0: 0x1a53, 0xd1: 0x0313, + 0xd2: 0x0312, 0xd3: 0x1d53, 0xd4: 0x2053, 0xd5: 0x2352, 0xd6: 0x2653, 0xd7: 0x2653, + 0xd8: 0x0113, 0xd9: 0x0112, 0xda: 0x2952, 0xdb: 0x0012, 0xdc: 0x1d53, 0xdd: 0x2c53, + 0xde: 0x2f52, 0xdf: 0x3253, 0xe0: 0x0113, 0xe1: 0x0112, 0xe2: 0x0113, 0xe3: 0x0112, + 0xe4: 0x0113, 0xe5: 0x0112, 0xe6: 0x3553, 0xe7: 0x0f13, 0xe8: 0x0f12, 0xe9: 0x3853, + 0xea: 0x0012, 0xeb: 0x0012, 0xec: 0x0113, 0xed: 0x0112, 0xee: 0x3553, 0xef: 0x1f13, + 0xf0: 0x1f12, 0xf1: 0x3b53, 0xf2: 0x3e53, 0xf3: 0x0713, 0xf4: 0x0712, 0xf5: 0x0313, + 0xf6: 0x0312, 0xf7: 0x4153, 0xf8: 0x0113, 0xf9: 0x0112, 0xfa: 0x0012, 0xfb: 0x0010, + 0xfc: 0x0113, 0xfd: 0x0112, 0xfe: 0x0012, 0xff: 0x4452, + // Block 0x4, offset 0x100 + 0x100: 0x0010, 0x101: 0x0010, 0x102: 0x0010, 0x103: 0x0010, 0x104: 0x04cb, 0x105: 0x05c9, + 0x106: 0x06ca, 0x107: 0x078b, 0x108: 0x0889, 0x109: 0x098a, 0x10a: 0x0a4b, 0x10b: 0x0b49, + 0x10c: 0x0c4a, 0x10d: 0x0313, 0x10e: 0x0312, 0x10f: 0x1f13, 0x110: 0x1f12, 0x111: 0x0313, + 0x112: 0x0312, 0x113: 0x0713, 0x114: 0x0712, 0x115: 0x0313, 0x116: 0x0312, 0x117: 0x0f13, + 0x118: 0x0f12, 0x119: 0x0313, 0x11a: 0x0312, 0x11b: 0x0713, 0x11c: 0x0712, 0x11d: 0x1452, + 0x11e: 0x0113, 0x11f: 0x0112, 0x120: 0x0113, 0x121: 0x0112, 0x122: 0x0113, 0x123: 0x0112, + 0x124: 0x0113, 0x125: 0x0112, 0x126: 0x0113, 0x127: 0x0112, 0x128: 0x0113, 0x129: 0x0112, + 0x12a: 0x0113, 0x12b: 0x0112, 0x12c: 0x0113, 0x12d: 0x0112, 0x12e: 0x0113, 0x12f: 0x0112, + 0x130: 0x0d0a, 0x131: 0x0e0b, 0x132: 0x0f09, 0x133: 0x100a, 0x134: 0x0113, 0x135: 0x0112, + 0x136: 0x2353, 0x137: 0x4453, 0x138: 0x0113, 0x139: 0x0112, 0x13a: 0x0113, 0x13b: 0x0112, + 0x13c: 0x0113, 0x13d: 0x0112, 0x13e: 0x0113, 0x13f: 0x0112, + // Block 0x5, offset 0x140 + 0x140: 0x136a, 0x141: 0x0313, 0x142: 0x0312, 0x143: 0x0853, 0x144: 0x4753, 0x145: 0x4a53, + 0x146: 0x0113, 0x147: 0x0112, 0x148: 0x0113, 0x149: 0x0112, 0x14a: 0x0113, 0x14b: 0x0112, + 0x14c: 0x0113, 0x14d: 0x0112, 0x14e: 0x0113, 0x14f: 0x0112, 0x150: 0x140a, 0x151: 0x14aa, + 0x152: 0x154a, 0x153: 0x0b52, 0x154: 0x0b52, 0x155: 0x0012, 0x156: 0x0e52, 0x157: 0x1152, + 0x158: 0x0012, 0x159: 0x1752, 0x15a: 0x0012, 0x15b: 0x1a52, 0x15c: 0x15ea, 0x15d: 0x0012, + 0x15e: 0x0012, 0x15f: 0x0012, 0x160: 0x1d52, 0x161: 0x168a, 0x162: 0x0012, 0x163: 0x2052, + 0x164: 0x0012, 0x165: 0x172a, 0x166: 0x17ca, 0x167: 0x0012, 0x168: 0x2652, 0x169: 0x2652, + 0x16a: 0x0012, 0x16b: 0x186a, 0x16c: 0x190a, 0x16d: 0x0012, 0x16e: 0x0012, 0x16f: 0x1d52, + 0x170: 0x0012, 0x171: 0x19aa, 0x172: 0x2c52, 0x173: 0x0012, 0x174: 0x0012, 0x175: 0x3252, + 0x176: 0x0012, 0x177: 0x0012, 0x178: 0x0012, 0x179: 0x0012, 0x17a: 0x0012, 0x17b: 0x0012, + 0x17c: 0x0012, 0x17d: 0x1a4a, 0x17e: 0x0012, 0x17f: 0x0012, + // Block 0x6, offset 0x180 + 0x180: 0x3552, 0x181: 0x0012, 0x182: 0x0012, 0x183: 0x3852, 0x184: 0x0012, 0x185: 0x0012, + 0x186: 0x0012, 0x187: 0x1aea, 0x188: 0x3552, 0x189: 0x4752, 0x18a: 0x3b52, 0x18b: 0x3e52, + 0x18c: 0x4a52, 0x18d: 0x0012, 0x18e: 0x0012, 0x18f: 0x0012, 0x190: 0x0012, 0x191: 0x0012, + 0x192: 0x4152, 0x193: 0x0012, 0x194: 0x0010, 0x195: 0x0012, 0x196: 0x0012, 0x197: 0x0012, + 0x198: 0x0012, 0x199: 0x0012, 0x19a: 0x0012, 0x19b: 0x0012, 0x19c: 0x0012, 0x19d: 0x1b8a, + 0x19e: 0x1c2a, 0x19f: 0x0012, 0x1a0: 0x0012, 0x1a1: 0x0012, 0x1a2: 0x0012, 0x1a3: 0x0012, + 0x1a4: 0x0012, 0x1a5: 0x0012, 0x1a6: 0x0012, 0x1a7: 0x0012, 0x1a8: 0x0012, 0x1a9: 0x0012, + 0x1aa: 0x0012, 0x1ab: 0x0012, 0x1ac: 0x0012, 0x1ad: 0x0012, 0x1ae: 0x0012, 0x1af: 0x0012, + 0x1b0: 0x0015, 0x1b1: 0x0015, 0x1b2: 0x0015, 0x1b3: 0x0015, 0x1b4: 0x0015, 0x1b5: 0x0015, + 0x1b6: 0x0015, 0x1b7: 0x0015, 0x1b8: 0x0015, 0x1b9: 0x0014, 0x1ba: 0x0014, 0x1bb: 0x0014, + 0x1bc: 0x0014, 0x1bd: 0x0014, 0x1be: 0x0014, 0x1bf: 0x0014, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x0024, 0x1c1: 0x0024, 0x1c2: 0x0024, 0x1c3: 0x0024, 0x1c4: 0x0024, 0x1c5: 0x1ccd, + 0x1c6: 0x0024, 0x1c7: 0x0034, 0x1c8: 0x0034, 0x1c9: 0x0034, 0x1ca: 0x0024, 0x1cb: 0x0024, + 0x1cc: 0x0024, 0x1cd: 0x0034, 0x1ce: 0x0034, 0x1cf: 0x0014, 0x1d0: 0x0024, 0x1d1: 0x0024, + 0x1d2: 0x0024, 0x1d3: 0x0034, 0x1d4: 0x0034, 0x1d5: 0x0034, 0x1d6: 0x0034, 0x1d7: 0x0024, + 0x1d8: 0x0034, 0x1d9: 0x0034, 0x1da: 0x0034, 0x1db: 0x0024, 0x1dc: 0x0034, 0x1dd: 0x0034, + 0x1de: 0x0034, 0x1df: 0x0034, 0x1e0: 0x0034, 0x1e1: 0x0034, 0x1e2: 0x0034, 0x1e3: 0x0024, + 0x1e4: 0x0024, 0x1e5: 0x0024, 0x1e6: 0x0024, 0x1e7: 0x0024, 0x1e8: 0x0024, 0x1e9: 0x0024, + 0x1ea: 0x0024, 0x1eb: 0x0024, 0x1ec: 0x0024, 0x1ed: 0x0024, 0x1ee: 0x0024, 0x1ef: 0x0024, + 0x1f0: 0x0113, 0x1f1: 0x0112, 0x1f2: 0x0113, 0x1f3: 0x0112, 0x1f4: 0x0014, 0x1f5: 0x0004, + 0x1f6: 0x0113, 0x1f7: 0x0112, 0x1fa: 0x0015, 0x1fb: 0x4d52, + 0x1fc: 0x5052, 0x1fd: 0x5052, 0x1ff: 0x5353, + // Block 0x8, offset 0x200 + 0x204: 0x0004, 0x205: 0x0004, + 0x206: 0x2a13, 0x207: 0x0014, 0x208: 0x2513, 0x209: 0x2713, 0x20a: 0x2513, + 0x20c: 0x5653, 0x20e: 0x5953, 0x20f: 0x5c53, 0x210: 0x1d8a, 0x211: 0x2013, + 0x212: 0x2013, 0x213: 0x2013, 0x214: 0x2013, 0x215: 0x2013, 0x216: 0x2013, 0x217: 0x2013, + 0x218: 0x2013, 0x219: 0x2013, 0x21a: 0x2013, 0x21b: 0x2013, 0x21c: 0x2013, 0x21d: 0x2013, + 0x21e: 0x2013, 0x21f: 0x2013, 0x220: 0x5f53, 0x221: 0x5f53, 0x223: 0x5f53, + 0x224: 0x5f53, 0x225: 0x5f53, 0x226: 0x5f53, 0x227: 0x5f53, 0x228: 0x5f53, 0x229: 0x5f53, + 0x22a: 0x5f53, 0x22b: 0x5f53, 0x22c: 0x2a12, 0x22d: 0x2512, 0x22e: 0x2712, 0x22f: 0x2512, + 0x230: 0x1f4a, 0x231: 0x2012, 0x232: 0x2012, 0x233: 0x2012, 0x234: 0x2012, 0x235: 0x2012, + 0x236: 0x2012, 0x237: 0x2012, 0x238: 0x2012, 0x239: 0x2012, 0x23a: 0x2012, 0x23b: 0x2012, + 0x23c: 0x2012, 0x23d: 0x2012, 0x23e: 0x2012, 0x23f: 0x2012, + // Block 0x9, offset 0x240 + 0x240: 0x5f52, 0x241: 0x5f52, 0x242: 0x210a, 0x243: 0x5f52, 0x244: 0x5f52, 0x245: 0x5f52, + 0x246: 0x5f52, 0x247: 0x5f52, 0x248: 0x5f52, 0x249: 0x5f52, 0x24a: 0x5f52, 0x24b: 0x5f52, + 0x24c: 0x5652, 0x24d: 0x5952, 0x24e: 0x5c52, 0x24f: 0x1813, 0x250: 0x21ca, 0x251: 0x228a, + 0x252: 0x0013, 0x253: 0x0013, 0x254: 0x0013, 0x255: 0x234a, 0x256: 0x240a, 0x257: 0x1812, + 0x258: 0x0113, 0x259: 0x0112, 0x25a: 0x0113, 0x25b: 0x0112, 0x25c: 0x0113, 0x25d: 0x0112, + 0x25e: 0x0113, 0x25f: 0x0112, 0x260: 0x0113, 0x261: 0x0112, 0x262: 0x0113, 0x263: 0x0112, + 0x264: 0x0113, 0x265: 0x0112, 0x266: 0x0113, 0x267: 0x0112, 0x268: 0x0113, 0x269: 0x0112, + 0x26a: 0x0113, 0x26b: 0x0112, 0x26c: 0x0113, 0x26d: 0x0112, 0x26e: 0x0113, 0x26f: 0x0112, + 0x270: 0x24ca, 0x271: 0x258a, 0x272: 0x0b12, 0x273: 0x5352, 0x274: 0x6253, 0x275: 0x264a, + 0x277: 0x0f13, 0x278: 0x0f12, 0x279: 0x0b13, 0x27a: 0x0113, 0x27b: 0x0112, + 0x27c: 0x0012, 0x27d: 0x4d53, 0x27e: 0x5053, 0x27f: 0x5053, + // Block 0xa, offset 0x280 + 0x280: 0x0812, 0x281: 0x0812, 0x282: 0x0812, 0x283: 0x0812, 0x284: 0x0812, 0x285: 0x0812, + 0x288: 0x0813, 0x289: 0x0813, 0x28a: 0x0813, 0x28b: 0x0813, + 0x28c: 0x0813, 0x28d: 0x0813, 0x290: 0x2f8a, 0x291: 0x0812, + 0x292: 0x30ca, 0x293: 0x0812, 0x294: 0x328a, 0x295: 0x0812, 0x296: 0x344a, 0x297: 0x0812, + 0x299: 0x0813, 0x29b: 0x0813, 0x29d: 0x0813, + 0x29f: 0x0813, 0x2a0: 0x0812, 0x2a1: 0x0812, 0x2a2: 0x0812, 0x2a3: 0x0812, + 0x2a4: 0x0812, 0x2a5: 0x0812, 0x2a6: 0x0812, 0x2a7: 0x0812, 0x2a8: 0x0813, 0x2a9: 0x0813, + 0x2aa: 0x0813, 0x2ab: 0x0813, 0x2ac: 0x0813, 0x2ad: 0x0813, 0x2ae: 0x0813, 0x2af: 0x0813, + 0x2b0: 0x8b52, 0x2b1: 0x8b52, 0x2b2: 0x8e52, 0x2b3: 0x8e52, 0x2b4: 0x9152, 0x2b5: 0x9152, + 0x2b6: 0x9452, 0x2b7: 0x9452, 0x2b8: 0x9752, 0x2b9: 0x9752, 0x2ba: 0x9a52, 0x2bb: 0x9a52, + 0x2bc: 0x4d52, 0x2bd: 0x4d52, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x360a, 0x2c1: 0x37ea, 0x2c2: 0x39ca, 0x2c3: 0x3baa, 0x2c4: 0x3d8a, 0x2c5: 0x3f6a, + 0x2c6: 0x414a, 0x2c7: 0x432a, 0x2c8: 0x4509, 0x2c9: 0x46e9, 0x2ca: 0x48c9, 0x2cb: 0x4aa9, + 0x2cc: 0x4c89, 0x2cd: 0x4e69, 0x2ce: 0x5049, 0x2cf: 0x5229, 0x2d0: 0x540a, 0x2d1: 0x55ea, + 0x2d2: 0x57ca, 0x2d3: 0x59aa, 0x2d4: 0x5b8a, 0x2d5: 0x5d6a, 0x2d6: 0x5f4a, 0x2d7: 0x612a, + 0x2d8: 0x6309, 0x2d9: 0x64e9, 0x2da: 0x66c9, 0x2db: 0x68a9, 0x2dc: 0x6a89, 0x2dd: 0x6c69, + 0x2de: 0x6e49, 0x2df: 0x7029, 0x2e0: 0x720a, 0x2e1: 0x73ea, 0x2e2: 0x75ca, 0x2e3: 0x77aa, + 0x2e4: 0x798a, 0x2e5: 0x7b6a, 0x2e6: 0x7d4a, 0x2e7: 0x7f2a, 0x2e8: 0x8109, 0x2e9: 0x82e9, + 0x2ea: 0x84c9, 0x2eb: 0x86a9, 0x2ec: 0x8889, 0x2ed: 0x8a69, 0x2ee: 0x8c49, 0x2ef: 0x8e29, + 0x2f0: 0x0812, 0x2f1: 0x0812, 0x2f2: 0x900a, 0x2f3: 0x922a, 0x2f4: 0x93ca, + 0x2f6: 0x958a, 0x2f7: 0x96ca, 0x2f8: 0x0813, 0x2f9: 0x0813, 0x2fa: 0x8b53, 0x2fb: 0x8b53, + 0x2fc: 0x9949, 0x2fd: 0x0004, 0x2fe: 0x9aea, 0x2ff: 0x0004, + // Block 0xc, offset 0x300 + 0x300: 0x0004, 0x301: 0x0004, 0x302: 0x9baa, 0x303: 0x9dca, 0x304: 0x9f6a, + 0x306: 0xa12a, 0x307: 0xa26a, 0x308: 0x8e53, 0x309: 0x8e53, 0x30a: 0x9153, 0x30b: 0x9153, + 0x30c: 0xa4e9, 0x30d: 0x0004, 0x30e: 0x0004, 0x30f: 0x0004, 0x310: 0x0812, 0x311: 0x0812, + 0x312: 0xa68a, 0x313: 0xa84a, 0x316: 0xaa0a, 0x317: 0xab4a, + 0x318: 0x0813, 0x319: 0x0813, 0x31a: 0x9453, 0x31b: 0x9453, 0x31d: 0x0004, + 0x31e: 0x0004, 0x31f: 0x0004, 0x320: 0x0812, 0x321: 0x0812, 0x322: 0xad0a, 0x323: 0xaeca, + 0x324: 0xb08a, 0x325: 0x0912, 0x326: 0xb1ca, 0x327: 0xb30a, 0x328: 0x0813, 0x329: 0x0813, + 0x32a: 0x9a53, 0x32b: 0x9a53, 0x32c: 0x0913, 0x32d: 0x0004, 0x32e: 0x0004, 0x32f: 0x0004, + 0x332: 0xb4ca, 0x333: 0xb6ea, 0x334: 0xb88a, + 0x336: 0xba4a, 0x337: 0xbb8a, 0x338: 0x9753, 0x339: 0x9753, 0x33a: 0x4d53, 0x33b: 0x4d53, + 0x33c: 0xbe09, 0x33d: 0x0004, 0x33e: 0x0004, + // Block 0xd, offset 0x340 + 0x342: 0x0013, + 0x347: 0x0013, 0x34a: 0x0012, 0x34b: 0x0013, + 0x34c: 0x0013, 0x34d: 0x0013, 0x34e: 0x0012, 0x34f: 0x0012, 0x350: 0x0013, 0x351: 0x0013, + 0x352: 0x0013, 0x353: 0x0012, 0x355: 0x0013, + 0x359: 0x0013, 0x35a: 0x0013, 0x35b: 0x0013, 0x35c: 0x0013, 0x35d: 0x0013, + 0x364: 0x0013, 0x366: 0xbfab, 0x368: 0x0013, + 0x36a: 0xc06b, 0x36b: 0xc0eb, 0x36c: 0x0013, 0x36d: 0x0013, 0x36f: 0x0012, + 0x370: 0x0013, 0x371: 0x0013, 0x372: 0x9d53, 0x373: 0x0013, 0x374: 0x0012, 0x375: 0x0010, + 0x376: 0x0010, 0x377: 0x0010, 0x378: 0x0010, 0x379: 0x0012, + 0x37c: 0x0012, 0x37d: 0x0012, 0x37e: 0x0013, 0x37f: 0x0013, + // Block 0xe, offset 0x380 + 0x380: 0x1a13, 0x381: 0x1a13, 0x382: 0x1e13, 0x383: 0x1e13, 0x384: 0x1a13, 0x385: 0x1a13, + 0x386: 0x2613, 0x387: 0x2613, 0x388: 0x2a13, 0x389: 0x2a13, 0x38a: 0x2e13, 0x38b: 0x2e13, + 0x38c: 0x2a13, 0x38d: 0x2a13, 0x38e: 0x2613, 0x38f: 0x2613, 0x390: 0xa052, 0x391: 0xa052, + 0x392: 0xa352, 0x393: 0xa352, 0x394: 0xa652, 0x395: 0xa652, 0x396: 0xa352, 0x397: 0xa352, + 0x398: 0xa052, 0x399: 0xa052, 0x39a: 0x1a12, 0x39b: 0x1a12, 0x39c: 0x1e12, 0x39d: 0x1e12, + 0x39e: 0x1a12, 0x39f: 0x1a12, 0x3a0: 0x2612, 0x3a1: 0x2612, 0x3a2: 0x2a12, 0x3a3: 0x2a12, + 0x3a4: 0x2e12, 0x3a5: 0x2e12, 0x3a6: 0x2a12, 0x3a7: 0x2a12, 0x3a8: 0x2612, 0x3a9: 0x2612, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x6552, 0x3c1: 0x6552, 0x3c2: 0x6552, 0x3c3: 0x6552, 0x3c4: 0x6552, 0x3c5: 0x6552, + 0x3c6: 0x6552, 0x3c7: 0x6552, 0x3c8: 0x6552, 0x3c9: 0x6552, 0x3ca: 0x6552, 0x3cb: 0x6552, + 0x3cc: 0x6552, 0x3cd: 0x6552, 0x3ce: 0x6552, 0x3cf: 0x6552, 0x3d0: 0xa952, 0x3d1: 0xa952, + 0x3d2: 0xa952, 0x3d3: 0xa952, 0x3d4: 0xa952, 0x3d5: 0xa952, 0x3d6: 0xa952, 0x3d7: 0xa952, + 0x3d8: 0xa952, 0x3d9: 0xa952, 0x3da: 0xa952, 0x3db: 0xa952, 0x3dc: 0xa952, 0x3dd: 0xa952, + 0x3de: 0xa952, 0x3e0: 0x0113, 0x3e1: 0x0112, 0x3e2: 0xc1ab, 0x3e3: 0x8853, + 0x3e4: 0xc26b, 0x3e5: 0xc32a, 0x3e6: 0xc3aa, 0x3e7: 0x0f13, 0x3e8: 0x0f12, 0x3e9: 0x0313, + 0x3ea: 0x0312, 0x3eb: 0x0713, 0x3ec: 0x0712, 0x3ed: 0xc42b, 0x3ee: 0xc4eb, 0x3ef: 0xc5ab, + 0x3f0: 0xc66b, 0x3f1: 0x0012, 0x3f2: 0x0113, 0x3f3: 0x0112, 0x3f4: 0x0012, 0x3f5: 0x0313, + 0x3f6: 0x0312, 0x3f7: 0x0012, 0x3f8: 0x0012, 0x3f9: 0x0012, 0x3fa: 0x0012, 0x3fb: 0x0012, + 0x3fc: 0x0015, 0x3fd: 0x0015, 0x3fe: 0xc72b, 0x3ff: 0xc7eb, + // Block 0x10, offset 0x400 + 0x400: 0x0113, 0x401: 0x0112, 0x402: 0x0113, 0x403: 0x0112, 0x404: 0x0113, 0x405: 0x0112, + 0x406: 0x0113, 0x407: 0x0112, 0x408: 0x0014, 0x409: 0x0004, 0x40a: 0x0004, 0x40b: 0x0713, + 0x40c: 0x0712, 0x40d: 0xc8ab, 0x40e: 0x0012, 0x40f: 0x0010, 0x410: 0x0113, 0x411: 0x0112, + 0x412: 0x0113, 0x413: 0x0112, 0x414: 0x0012, 0x415: 0x0012, 0x416: 0x0113, 0x417: 0x0112, + 0x418: 0x0113, 0x419: 0x0112, 0x41a: 0x0113, 0x41b: 0x0112, 0x41c: 0x0113, 0x41d: 0x0112, + 0x41e: 0x0113, 0x41f: 0x0112, 0x420: 0x0113, 0x421: 0x0112, 0x422: 0x0113, 0x423: 0x0112, + 0x424: 0x0113, 0x425: 0x0112, 0x426: 0x0113, 0x427: 0x0112, 0x428: 0x0113, 0x429: 0x0112, + 0x42a: 0xc96b, 0x42b: 0xca2b, 0x42c: 0xcaeb, 0x42d: 0xcbab, + 0x430: 0xcc6b, 0x431: 0xcd2b, 0x432: 0xcdeb, 0x433: 0xac53, 0x434: 0x0113, 0x435: 0x0112, + 0x436: 0x0113, 0x437: 0x0112, + // Block 0x11, offset 0x440 + 0x440: 0xceaa, 0x441: 0xcfaa, 0x442: 0xd0aa, 0x443: 0xd1aa, 0x444: 0xd30a, 0x445: 0xd46a, + 0x446: 0xd56a, + 0x453: 0xd66a, 0x454: 0xd82a, 0x455: 0xd9ea, 0x456: 0xdbaa, 0x457: 0xdd6a, + 0x45d: 0x0010, + 0x45e: 0x0034, 0x45f: 0x0010, 0x460: 0x0010, 0x461: 0x0010, 0x462: 0x0010, 0x463: 0x0010, + 0x464: 0x0010, 0x465: 0x0010, 0x466: 0x0010, 0x467: 0x0010, 0x468: 0x0010, + 0x46a: 0x0010, 0x46b: 0x0010, 0x46c: 0x0010, 0x46d: 0x0010, 0x46e: 0x0010, 0x46f: 0x0010, + 0x470: 0x0010, 0x471: 0x0010, 0x472: 0x0010, 0x473: 0x0010, 0x474: 0x0010, 0x475: 0x0010, + 0x476: 0x0010, 0x478: 0x0010, 0x479: 0x0010, 0x47a: 0x0010, 0x47b: 0x0010, + 0x47c: 0x0010, 0x47e: 0x0010, + // Block 0x12, offset 0x480 + 0x482: 0x0010, + 0x487: 0x0010, 0x489: 0x0010, 0x48b: 0x0010, + 0x48d: 0x0010, 0x48e: 0x0010, 0x48f: 0x0010, 0x491: 0x0010, + 0x492: 0x0010, 0x494: 0x0010, 0x497: 0x0010, + 0x499: 0x0010, 0x49b: 0x0010, 0x49d: 0x0010, + 0x49f: 0x0010, 0x4a1: 0x0010, 0x4a2: 0x0010, + 0x4a4: 0x0010, 0x4a7: 0x0010, 0x4a8: 0x0010, 0x4a9: 0x0010, + 0x4aa: 0x0010, 0x4ac: 0x0010, 0x4ad: 0x0010, 0x4ae: 0x0010, 0x4af: 0x0010, + 0x4b0: 0x0010, 0x4b1: 0x0010, 0x4b2: 0x0010, 0x4b4: 0x0010, 0x4b5: 0x0010, + 0x4b6: 0x0010, 0x4b7: 0x0010, 0x4b9: 0x0010, 0x4ba: 0x0010, 0x4bb: 0x0010, + 0x4bc: 0x0010, 0x4be: 0x0010, +} + +// caseIndex: 25 blocks, 1600 entries, 3200 bytes +// Block 0 is the zero block. +var caseIndex = [1600]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x11, 0xc3: 0x12, 0xc4: 0x13, 0xc5: 0x14, 0xc6: 0x01, 0xc7: 0x02, + 0xc8: 0x15, 0xc9: 0x03, 0xca: 0x04, 0xcb: 0x16, 0xcc: 0x17, 0xcd: 0x05, 0xce: 0x06, 0xcf: 0x07, + 0xd0: 0x18, 0xd1: 0x19, 0xd2: 0x1a, 0xd3: 0x1b, 0xd4: 0x1c, 0xd5: 0x1d, 0xd6: 0x1e, 0xd7: 0x1f, + 0xd8: 0x20, 0xd9: 0x21, 0xda: 0x22, 0xdb: 0x23, 0xdc: 0x24, 0xdd: 0x25, 0xde: 0x26, 0xdf: 0x27, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x08, 0xef: 0x09, + 0xf0: 0x14, 0xf3: 0x16, + // Block 0x4, offset 0x100 + 0x120: 0x28, 0x121: 0x29, 0x122: 0x2a, 0x123: 0x2b, 0x124: 0x2c, 0x125: 0x2d, 0x126: 0x2e, 0x127: 0x2f, + 0x128: 0x30, 0x129: 0x31, 0x12a: 0x32, 0x12b: 0x33, 0x12c: 0x34, 0x12d: 0x35, 0x12e: 0x36, 0x12f: 0x37, + 0x130: 0x38, 0x131: 0x39, 0x132: 0x3a, 0x133: 0x3b, 0x134: 0x3c, 0x135: 0x3d, 0x136: 0x3e, 0x137: 0x3f, + 0x138: 0x40, 0x139: 0x41, 0x13a: 0x42, 0x13b: 0x43, 0x13c: 0x44, 0x13d: 0x45, 0x13e: 0x46, 0x13f: 0x47, + // Block 0x5, offset 0x140 + 0x140: 0x48, 0x141: 0x49, 0x142: 0x4a, 0x143: 0x4b, 0x144: 0x22, 0x145: 0x22, 0x146: 0x22, 0x147: 0x22, + 0x148: 0x22, 0x149: 0x4c, 0x14a: 0x4d, 0x14b: 0x4e, 0x14c: 0x4f, 0x14d: 0x50, 0x14e: 0x51, 0x14f: 0x52, + 0x150: 0x53, 0x151: 0x22, 0x152: 0x22, 0x153: 0x22, 0x154: 0x22, 0x155: 0x22, 0x156: 0x22, 0x157: 0x22, + 0x158: 0x22, 0x159: 0x54, 0x15a: 0x55, 0x15b: 0x56, 0x15c: 0x57, 0x15d: 0x58, 0x15e: 0x59, 0x15f: 0x5a, + 0x160: 0x5b, 0x161: 0x5c, 0x162: 0x5d, 0x163: 0x5e, 0x164: 0x5f, 0x165: 0x60, 0x167: 0x61, + 0x168: 0x62, 0x169: 0x63, 0x16a: 0x64, 0x16c: 0x65, 0x16d: 0x66, 0x16e: 0x67, 0x16f: 0x68, + 0x170: 0x69, 0x171: 0x6a, 0x173: 0x6b, 0x174: 0x6c, 0x175: 0x6d, 0x176: 0x6e, 0x177: 0x6f, + 0x178: 0x70, 0x179: 0x70, 0x17a: 0x71, 0x17b: 0x70, 0x17c: 0x72, 0x17d: 0x08, 0x17e: 0x09, 0x17f: 0x0a, + // Block 0x6, offset 0x180 + 0x180: 0x73, 0x181: 0x74, 0x182: 0x75, 0x183: 0x76, 0x184: 0x0b, 0x185: 0x77, 0x186: 0x78, + 0x192: 0x79, 0x193: 0x0c, + 0x1b0: 0x7a, 0x1b1: 0x0d, 0x1b2: 0x70, 0x1b3: 0x7b, 0x1b4: 0x7c, 0x1b5: 0x7d, 0x1b6: 0x7e, 0x1b7: 0x7f, + 0x1b8: 0x80, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x81, 0x1c2: 0x82, 0x1c3: 0x83, 0x1c4: 0x84, 0x1c5: 0x22, 0x1c6: 0x85, + // Block 0x8, offset 0x200 + 0x200: 0x86, 0x201: 0x22, 0x202: 0x22, 0x203: 0x22, 0x204: 0x22, 0x205: 0x22, 0x206: 0x22, 0x207: 0x22, + 0x208: 0x22, 0x209: 0x22, 0x20a: 0x22, 0x20b: 0x22, 0x20c: 0x22, 0x20d: 0x22, 0x20e: 0x22, 0x20f: 0x22, + 0x210: 0x22, 0x211: 0x22, 0x212: 0x87, 0x213: 0x88, 0x214: 0x22, 0x215: 0x22, 0x216: 0x22, 0x217: 0x22, + 0x218: 0x89, 0x219: 0x8a, 0x21a: 0x8b, 0x21b: 0x8c, 0x21c: 0x8d, 0x21d: 0x8e, 0x21e: 0x0e, 0x21f: 0x8f, + 0x220: 0x90, 0x221: 0x91, 0x222: 0x22, 0x223: 0x92, 0x224: 0x93, 0x225: 0x94, 0x226: 0x95, 0x227: 0x96, + 0x228: 0x97, 0x229: 0x98, 0x22a: 0x99, 0x22b: 0x9a, 0x22c: 0x9b, 0x22d: 0x9c, 0x22e: 0x9d, 0x22f: 0x9e, + 0x230: 0x22, 0x231: 0x22, 0x232: 0x22, 0x233: 0x22, 0x234: 0x22, 0x235: 0x22, 0x236: 0x22, 0x237: 0x22, + 0x238: 0x22, 0x239: 0x22, 0x23a: 0x22, 0x23b: 0x22, 0x23c: 0x22, 0x23d: 0x22, 0x23e: 0x22, 0x23f: 0x22, + // Block 0x9, offset 0x240 + 0x240: 0x22, 0x241: 0x22, 0x242: 0x22, 0x243: 0x22, 0x244: 0x22, 0x245: 0x22, 0x246: 0x22, 0x247: 0x22, + 0x248: 0x22, 0x249: 0x22, 0x24a: 0x22, 0x24b: 0x22, 0x24c: 0x22, 0x24d: 0x22, 0x24e: 0x22, 0x24f: 0x22, + 0x250: 0x22, 0x251: 0x22, 0x252: 0x22, 0x253: 0x22, 0x254: 0x22, 0x255: 0x22, 0x256: 0x22, 0x257: 0x22, + 0x258: 0x22, 0x259: 0x22, 0x25a: 0x22, 0x25b: 0x22, 0x25c: 0x22, 0x25d: 0x22, 0x25e: 0x22, 0x25f: 0x22, + 0x260: 0x22, 0x261: 0x22, 0x262: 0x22, 0x263: 0x22, 0x264: 0x22, 0x265: 0x22, 0x266: 0x22, 0x267: 0x22, + 0x268: 0x22, 0x269: 0x22, 0x26a: 0x22, 0x26b: 0x22, 0x26c: 0x22, 0x26d: 0x22, 0x26e: 0x22, 0x26f: 0x22, + 0x270: 0x22, 0x271: 0x22, 0x272: 0x22, 0x273: 0x22, 0x274: 0x22, 0x275: 0x22, 0x276: 0x22, 0x277: 0x22, + 0x278: 0x22, 0x279: 0x22, 0x27a: 0x22, 0x27b: 0x22, 0x27c: 0x22, 0x27d: 0x22, 0x27e: 0x22, 0x27f: 0x22, + // Block 0xa, offset 0x280 + 0x280: 0x22, 0x281: 0x22, 0x282: 0x22, 0x283: 0x22, 0x284: 0x22, 0x285: 0x22, 0x286: 0x22, 0x287: 0x22, + 0x288: 0x22, 0x289: 0x22, 0x28a: 0x22, 0x28b: 0x22, 0x28c: 0x22, 0x28d: 0x22, 0x28e: 0x22, 0x28f: 0x22, + 0x290: 0x22, 0x291: 0x22, 0x292: 0x22, 0x293: 0x22, 0x294: 0x22, 0x295: 0x22, 0x296: 0x22, 0x297: 0x22, + 0x298: 0x22, 0x299: 0x22, 0x29a: 0x22, 0x29b: 0x22, 0x29c: 0x22, 0x29d: 0x22, 0x29e: 0x9f, 0x29f: 0xa0, + // Block 0xb, offset 0x2c0 + 0x2ec: 0x0f, 0x2ed: 0xa1, 0x2ee: 0xa2, 0x2ef: 0xa3, + 0x2f0: 0x22, 0x2f1: 0x22, 0x2f2: 0x22, 0x2f3: 0x22, 0x2f4: 0xa4, 0x2f5: 0xa5, 0x2f6: 0xa6, 0x2f7: 0xa7, + 0x2f8: 0xa8, 0x2f9: 0xa9, 0x2fa: 0x22, 0x2fb: 0xaa, 0x2fc: 0xab, 0x2fd: 0xac, 0x2fe: 0xad, 0x2ff: 0xae, + // Block 0xc, offset 0x300 + 0x300: 0xaf, 0x301: 0xb0, 0x302: 0x22, 0x303: 0xb1, 0x305: 0xb2, 0x307: 0xb3, + 0x30a: 0xb4, 0x30b: 0xb5, 0x30c: 0xb6, 0x30d: 0xb7, 0x30e: 0xb8, 0x30f: 0xb9, + 0x310: 0xba, 0x311: 0xbb, 0x312: 0xbc, 0x314: 0xbd, 0x315: 0xbe, + 0x318: 0x22, 0x319: 0x22, 0x31a: 0x22, 0x31b: 0x22, 0x31c: 0xbf, 0x31d: 0xc0, + 0x320: 0xc1, 0x321: 0xc2, 0x322: 0xc3, 0x323: 0xc4, 0x324: 0xc5, 0x326: 0xc6, + 0x328: 0xc7, 0x329: 0xc8, 0x32a: 0xc9, 0x32b: 0xca, 0x32c: 0x5e, 0x32d: 0xcb, 0x32e: 0xcc, + 0x330: 0x22, 0x331: 0xcd, 0x332: 0xce, 0x333: 0xcf, + // Block 0xd, offset 0x340 + 0x340: 0xd0, 0x341: 0xd1, 0x342: 0xd2, 0x343: 0xd3, 0x344: 0xd4, 0x345: 0xd5, 0x346: 0xd6, 0x347: 0xd7, + 0x348: 0xd8, 0x34a: 0xd9, 0x34b: 0xda, 0x34c: 0xdb, 0x34d: 0xdc, + 0x352: 0xdd, 0x353: 0xde, 0x356: 0xdf, 0x357: 0xe0, + 0x358: 0xe1, 0x359: 0xe2, 0x35a: 0xe3, 0x35b: 0xe4, 0x35c: 0xe5, + 0x362: 0xe6, 0x363: 0xe7, + 0x36b: 0xe8, + // Block 0xe, offset 0x380 + 0x380: 0x22, 0x381: 0x22, 0x382: 0x22, 0x383: 0x22, 0x384: 0x22, 0x385: 0x22, 0x386: 0x22, 0x387: 0x22, + 0x388: 0x22, 0x389: 0x22, 0x38a: 0x22, 0x38b: 0x22, 0x38c: 0x22, 0x38d: 0x22, 0x38e: 0xe9, + 0x390: 0x22, 0x391: 0xea, 0x392: 0x22, 0x393: 0x22, 0x394: 0x22, 0x395: 0xeb, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x22, 0x3c1: 0x22, 0x3c2: 0x22, 0x3c3: 0x22, 0x3c4: 0x22, 0x3c5: 0x22, 0x3c6: 0x22, 0x3c7: 0x22, + 0x3c8: 0x22, 0x3c9: 0x22, 0x3ca: 0x22, 0x3cb: 0x22, 0x3cc: 0x22, 0x3cd: 0x22, 0x3ce: 0x22, 0x3cf: 0x22, + 0x3d0: 0xea, + // Block 0x10, offset 0x400 + 0x410: 0x22, 0x411: 0x22, 0x412: 0x22, 0x413: 0x22, 0x414: 0x22, 0x415: 0x22, 0x416: 0x22, 0x417: 0x22, + 0x418: 0x22, 0x419: 0xec, + // Block 0x11, offset 0x440 + 0x460: 0x22, 0x461: 0x22, 0x462: 0x22, 0x463: 0x22, 0x464: 0x22, 0x465: 0x22, 0x466: 0x22, 0x467: 0x22, + 0x468: 0xe8, 0x469: 0xed, 0x46b: 0xee, 0x46c: 0xef, 0x46d: 0xf0, 0x46e: 0xf1, + 0x47c: 0x22, 0x47d: 0xf2, 0x47e: 0xf3, + // Block 0x12, offset 0x480 + 0x4b0: 0x22, 0x4b1: 0xf4, 0x4b2: 0xf5, + // Block 0x13, offset 0x4c0 + 0x4c5: 0xf6, 0x4c6: 0xf7, + 0x4c9: 0xf8, + 0x4d0: 0xf9, 0x4d1: 0xfa, 0x4d2: 0xfb, 0x4d3: 0xfc, 0x4d4: 0xfd, 0x4d5: 0xfe, 0x4d6: 0xff, 0x4d7: 0x100, + 0x4d8: 0x101, 0x4d9: 0x102, 0x4da: 0x103, 0x4db: 0x104, 0x4dc: 0x105, 0x4dd: 0x106, 0x4de: 0x107, 0x4df: 0x108, + 0x4e8: 0x109, 0x4e9: 0x10a, 0x4ea: 0x10b, + // Block 0x14, offset 0x500 + 0x520: 0x22, 0x521: 0x22, 0x522: 0x22, 0x523: 0x10c, + 0x538: 0x10d, 0x539: 0x10, 0x53a: 0x10e, + // Block 0x15, offset 0x540 + 0x544: 0x10f, 0x545: 0x110, 0x546: 0x111, + 0x54f: 0x112, + // Block 0x16, offset 0x580 + 0x590: 0x0a, 0x591: 0x0b, 0x592: 0x0c, 0x593: 0x0d, 0x594: 0x0e, 0x596: 0x0f, + 0x59b: 0x10, 0x59d: 0x11, 0x59e: 0x12, 0x59f: 0x13, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x113, 0x5c1: 0x114, 0x5c4: 0x114, 0x5c5: 0x114, 0x5c6: 0x114, 0x5c7: 0x115, + // Block 0x18, offset 0x600 + 0x620: 0x15, +} + +// sparseOffsets: 262 entries, 524 bytes +var sparseOffsets = []uint16{0x0, 0x9, 0xf, 0x18, 0x24, 0x2e, 0x3a, 0x3d, 0x41, 0x44, 0x48, 0x52, 0x54, 0x59, 0x69, 0x70, 0x75, 0x83, 0x84, 0x92, 0xa1, 0xab, 0xae, 0xb4, 0xbc, 0xbe, 0xbf, 0xcb, 0xd1, 0xdf, 0xea, 0xf5, 0x100, 0x10c, 0x116, 0x121, 0x12c, 0x138, 0x144, 0x14c, 0x154, 0x15e, 0x168, 0x174, 0x17a, 0x185, 0x18a, 0x192, 0x195, 0x19a, 0x19e, 0x1a2, 0x1a9, 0x1b2, 0x1ba, 0x1bb, 0x1c4, 0x1cb, 0x1d3, 0x1d9, 0x1df, 0x1e4, 0x1e8, 0x1eb, 0x1ed, 0x1f0, 0x1f5, 0x1f6, 0x1f8, 0x1fa, 0x1fc, 0x203, 0x208, 0x20c, 0x215, 0x218, 0x21b, 0x21f, 0x220, 0x22b, 0x22c, 0x22d, 0x232, 0x23f, 0x247, 0x24f, 0x258, 0x261, 0x26a, 0x26f, 0x272, 0x27f, 0x281, 0x288, 0x28a, 0x294, 0x295, 0x2a0, 0x2a8, 0x2af, 0x2b5, 0x2b6, 0x2c4, 0x2c9, 0x2cc, 0x2d1, 0x2d5, 0x2db, 0x2e0, 0x2e3, 0x2e8, 0x2ed, 0x2ee, 0x2f4, 0x2f6, 0x2f7, 0x2f9, 0x2fb, 0x2fe, 0x2ff, 0x301, 0x304, 0x30a, 0x30e, 0x310, 0x316, 0x31d, 0x321, 0x32a, 0x32b, 0x332, 0x336, 0x33b, 0x343, 0x349, 0x34f, 0x359, 0x35e, 0x367, 0x36d, 0x374, 0x378, 0x380, 0x382, 0x384, 0x387, 0x389, 0x38b, 0x38c, 0x38d, 0x38f, 0x391, 0x397, 0x39c, 0x39e, 0x3a4, 0x3a7, 0x3a9, 0x3af, 0x3b4, 0x3b6, 0x3b7, 0x3b8, 0x3b9, 0x3bb, 0x3bd, 0x3bf, 0x3c2, 0x3c4, 0x3c7, 0x3cf, 0x3d2, 0x3d4, 0x3d6, 0x3d7, 0x3d8, 0x3da, 0x3e0, 0x3e2, 0x3e3, 0x3e5, 0x3e7, 0x3e9, 0x3f6, 0x3f7, 0x3f8, 0x3fc, 0x3fe, 0x3ff, 0x400, 0x401, 0x402, 0x406, 0x40a, 0x410, 0x412, 0x419, 0x41c, 0x420, 0x426, 0x42e, 0x434, 0x43a, 0x444, 0x44e, 0x454, 0x45a, 0x460, 0x463, 0x469, 0x46c, 0x474, 0x475, 0x47c, 0x47d, 0x480, 0x481, 0x482, 0x483, 0x484, 0x485, 0x487, 0x489, 0x48b, 0x48f, 0x490, 0x492, 0x493, 0x495, 0x49a, 0x49f, 0x4a3, 0x4a4, 0x4a7, 0x4ab, 0x4b6, 0x4ba, 0x4c2, 0x4c7, 0x4cb, 0x4ce, 0x4d2, 0x4d5, 0x4d8, 0x4dd, 0x4e1, 0x4e5, 0x4e9, 0x4ed, 0x4ef, 0x4f1, 0x4f4, 0x4f6, 0x4ff, 0x504, 0x505, 0x508, 0x509, 0x50a, 0x50c, 0x50d, 0x50e} + +// sparseValues: 1294 entries, 5176 bytes +var sparseValues = [1294]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0004, lo: 0xa8, hi: 0xa8}, + {value: 0x0012, lo: 0xaa, hi: 0xaa}, + {value: 0x0014, lo: 0xad, hi: 0xad}, + {value: 0x0004, lo: 0xaf, hi: 0xaf}, + {value: 0x0004, lo: 0xb4, hi: 0xb4}, + {value: 0x002a, lo: 0xb5, hi: 0xb5}, + {value: 0x0014, lo: 0xb7, hi: 0xb7}, + {value: 0x0004, lo: 0xb8, hi: 0xb8}, + {value: 0x0012, lo: 0xba, hi: 0xba}, + // Block 0x1, offset 0x9 + {value: 0x2013, lo: 0x80, hi: 0x96}, + {value: 0x2013, lo: 0x98, hi: 0x9e}, + {value: 0x00ea, lo: 0x9f, hi: 0x9f}, + {value: 0x2012, lo: 0xa0, hi: 0xb6}, + {value: 0x2012, lo: 0xb8, hi: 0xbe}, + {value: 0x0252, lo: 0xbf, hi: 0xbf}, + // Block 0x2, offset 0xf + {value: 0x0117, lo: 0x80, hi: 0xaf}, + {value: 0x01eb, lo: 0xb0, hi: 0xb0}, + {value: 0x02ea, lo: 0xb1, hi: 0xb1}, + {value: 0x0117, lo: 0xb2, hi: 0xb7}, + {value: 0x0012, lo: 0xb8, hi: 0xb8}, + {value: 0x0316, lo: 0xb9, hi: 0xba}, + {value: 0x0716, lo: 0xbb, hi: 0xbc}, + {value: 0x0316, lo: 0xbd, hi: 0xbe}, + {value: 0x0553, lo: 0xbf, hi: 0xbf}, + // Block 0x3, offset 0x18 + {value: 0x0552, lo: 0x80, hi: 0x80}, + {value: 0x0316, lo: 0x81, hi: 0x82}, + {value: 0x0716, lo: 0x83, hi: 0x84}, + {value: 0x0316, lo: 0x85, hi: 0x86}, + {value: 0x0f16, lo: 0x87, hi: 0x88}, + {value: 0x034a, lo: 0x89, hi: 0x89}, + {value: 0x0117, lo: 0x8a, hi: 0xb7}, + {value: 0x0253, lo: 0xb8, hi: 0xb8}, + {value: 0x0316, lo: 0xb9, hi: 0xba}, + {value: 0x0716, lo: 0xbb, hi: 0xbc}, + {value: 0x0316, lo: 0xbd, hi: 0xbe}, + {value: 0x044a, lo: 0xbf, hi: 0xbf}, + // Block 0x4, offset 0x24 + {value: 0x0117, lo: 0x80, hi: 0x9f}, + {value: 0x2f53, lo: 0xa0, hi: 0xa0}, + {value: 0x0012, lo: 0xa1, hi: 0xa1}, + {value: 0x0117, lo: 0xa2, hi: 0xb3}, + {value: 0x0012, lo: 0xb4, hi: 0xb9}, + {value: 0x10cb, lo: 0xba, hi: 0xba}, + {value: 0x0716, lo: 0xbb, hi: 0xbc}, + {value: 0x2953, lo: 0xbd, hi: 0xbd}, + {value: 0x11cb, lo: 0xbe, hi: 0xbe}, + {value: 0x12ca, lo: 0xbf, hi: 0xbf}, + // Block 0x5, offset 0x2e + {value: 0x0015, lo: 0x80, hi: 0x81}, + {value: 0x0004, lo: 0x82, hi: 0x85}, + {value: 0x0014, lo: 0x86, hi: 0x91}, + {value: 0x0004, lo: 0x92, hi: 0x96}, + {value: 0x0014, lo: 0x97, hi: 0x97}, + {value: 0x0004, lo: 0x98, hi: 0x9f}, + {value: 0x0015, lo: 0xa0, hi: 0xa4}, + {value: 0x0004, lo: 0xa5, hi: 0xab}, + {value: 0x0014, lo: 0xac, hi: 0xac}, + {value: 0x0004, lo: 0xad, hi: 0xad}, + {value: 0x0014, lo: 0xae, hi: 0xae}, + {value: 0x0004, lo: 0xaf, hi: 0xbf}, + // Block 0x6, offset 0x3a + {value: 0x0024, lo: 0x80, hi: 0x94}, + {value: 0x0034, lo: 0x95, hi: 0xbc}, + {value: 0x0024, lo: 0xbd, hi: 0xbf}, + // Block 0x7, offset 0x3d + {value: 0x6553, lo: 0x80, hi: 0x8f}, + {value: 0x2013, lo: 0x90, hi: 0x9f}, + {value: 0x5f53, lo: 0xa0, hi: 0xaf}, + {value: 0x2012, lo: 0xb0, hi: 0xbf}, + // Block 0x8, offset 0x41 + {value: 0x5f52, lo: 0x80, hi: 0x8f}, + {value: 0x6552, lo: 0x90, hi: 0x9f}, + {value: 0x0117, lo: 0xa0, hi: 0xbf}, + // Block 0x9, offset 0x44 + {value: 0x0117, lo: 0x80, hi: 0x81}, + {value: 0x0024, lo: 0x83, hi: 0x87}, + {value: 0x0014, lo: 0x88, hi: 0x89}, + {value: 0x0117, lo: 0x8a, hi: 0xbf}, + // Block 0xa, offset 0x48 + {value: 0x0f13, lo: 0x80, hi: 0x80}, + {value: 0x0316, lo: 0x81, hi: 0x82}, + {value: 0x0716, lo: 0x83, hi: 0x84}, + {value: 0x0316, lo: 0x85, hi: 0x86}, + {value: 0x0f16, lo: 0x87, hi: 0x88}, + {value: 0x0316, lo: 0x89, hi: 0x8a}, + {value: 0x0716, lo: 0x8b, hi: 0x8c}, + {value: 0x0316, lo: 0x8d, hi: 0x8e}, + {value: 0x0f12, lo: 0x8f, hi: 0x8f}, + {value: 0x0117, lo: 0x90, hi: 0xbf}, + // Block 0xb, offset 0x52 + {value: 0x0117, lo: 0x80, hi: 0xaf}, + {value: 0x6553, lo: 0xb1, hi: 0xbf}, + // Block 0xc, offset 0x54 + {value: 0x3013, lo: 0x80, hi: 0x8f}, + {value: 0x6853, lo: 0x90, hi: 0x96}, + {value: 0x0014, lo: 0x99, hi: 0x99}, + {value: 0x6552, lo: 0xa1, hi: 0xaf}, + {value: 0x3012, lo: 0xb0, hi: 0xbf}, + // Block 0xd, offset 0x59 + {value: 0x6852, lo: 0x80, hi: 0x86}, + {value: 0x270a, lo: 0x87, hi: 0x87}, + {value: 0x0034, lo: 0x91, hi: 0x91}, + {value: 0x0024, lo: 0x92, hi: 0x95}, + {value: 0x0034, lo: 0x96, hi: 0x96}, + {value: 0x0024, lo: 0x97, hi: 0x99}, + {value: 0x0034, lo: 0x9a, hi: 0x9b}, + {value: 0x0024, lo: 0x9c, hi: 0xa1}, + {value: 0x0034, lo: 0xa2, hi: 0xa7}, + {value: 0x0024, lo: 0xa8, hi: 0xa9}, + {value: 0x0034, lo: 0xaa, hi: 0xaa}, + {value: 0x0024, lo: 0xab, hi: 0xac}, + {value: 0x0034, lo: 0xad, hi: 0xae}, + {value: 0x0024, lo: 0xaf, hi: 0xaf}, + {value: 0x0034, lo: 0xb0, hi: 0xbd}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0xe, offset 0x69 + {value: 0x0034, lo: 0x81, hi: 0x82}, + {value: 0x0024, lo: 0x84, hi: 0x84}, + {value: 0x0034, lo: 0x85, hi: 0x85}, + {value: 0x0034, lo: 0x87, hi: 0x87}, + {value: 0x0010, lo: 0x90, hi: 0xaa}, + {value: 0x0010, lo: 0xb0, hi: 0xb3}, + {value: 0x0014, lo: 0xb4, hi: 0xb4}, + // Block 0xf, offset 0x70 + {value: 0x0014, lo: 0x80, hi: 0x85}, + {value: 0x0024, lo: 0x90, hi: 0x97}, + {value: 0x0034, lo: 0x98, hi: 0x9a}, + {value: 0x0014, lo: 0x9c, hi: 0x9c}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x10, offset 0x75 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x8a}, + {value: 0x0034, lo: 0x8b, hi: 0x92}, + {value: 0x0024, lo: 0x93, hi: 0x94}, + {value: 0x0034, lo: 0x95, hi: 0x96}, + {value: 0x0024, lo: 0x97, hi: 0x9b}, + {value: 0x0034, lo: 0x9c, hi: 0x9c}, + {value: 0x0024, lo: 0x9d, hi: 0x9e}, + {value: 0x0034, lo: 0x9f, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + {value: 0x0010, lo: 0xab, hi: 0xab}, + {value: 0x0010, lo: 0xae, hi: 0xaf}, + {value: 0x0034, lo: 0xb0, hi: 0xb0}, + {value: 0x0010, lo: 0xb1, hi: 0xbf}, + // Block 0x11, offset 0x83 + {value: 0x0010, lo: 0x80, hi: 0xbf}, + // Block 0x12, offset 0x84 + {value: 0x0010, lo: 0x80, hi: 0x93}, + {value: 0x0010, lo: 0x95, hi: 0x95}, + {value: 0x0024, lo: 0x96, hi: 0x9c}, + {value: 0x0014, lo: 0x9d, hi: 0x9d}, + {value: 0x0024, lo: 0x9f, hi: 0xa2}, + {value: 0x0034, lo: 0xa3, hi: 0xa3}, + {value: 0x0024, lo: 0xa4, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xa6}, + {value: 0x0024, lo: 0xa7, hi: 0xa8}, + {value: 0x0034, lo: 0xaa, hi: 0xaa}, + {value: 0x0024, lo: 0xab, hi: 0xac}, + {value: 0x0034, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xbc}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0x13, offset 0x92 + {value: 0x0014, lo: 0x8f, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0034, lo: 0x91, hi: 0x91}, + {value: 0x0010, lo: 0x92, hi: 0xaf}, + {value: 0x0024, lo: 0xb0, hi: 0xb0}, + {value: 0x0034, lo: 0xb1, hi: 0xb1}, + {value: 0x0024, lo: 0xb2, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + {value: 0x0024, lo: 0xb5, hi: 0xb6}, + {value: 0x0034, lo: 0xb7, hi: 0xb9}, + {value: 0x0024, lo: 0xba, hi: 0xba}, + {value: 0x0034, lo: 0xbb, hi: 0xbc}, + {value: 0x0024, lo: 0xbd, hi: 0xbd}, + {value: 0x0034, lo: 0xbe, hi: 0xbe}, + {value: 0x0024, lo: 0xbf, hi: 0xbf}, + // Block 0x14, offset 0xa1 + {value: 0x0024, lo: 0x80, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x82}, + {value: 0x0024, lo: 0x83, hi: 0x83}, + {value: 0x0034, lo: 0x84, hi: 0x84}, + {value: 0x0024, lo: 0x85, hi: 0x85}, + {value: 0x0034, lo: 0x86, hi: 0x86}, + {value: 0x0024, lo: 0x87, hi: 0x87}, + {value: 0x0034, lo: 0x88, hi: 0x88}, + {value: 0x0024, lo: 0x89, hi: 0x8a}, + {value: 0x0010, lo: 0x8d, hi: 0xbf}, + // Block 0x15, offset 0xab + {value: 0x0010, lo: 0x80, hi: 0xa5}, + {value: 0x0014, lo: 0xa6, hi: 0xb0}, + {value: 0x0010, lo: 0xb1, hi: 0xb1}, + // Block 0x16, offset 0xae + {value: 0x0010, lo: 0x80, hi: 0xaa}, + {value: 0x0024, lo: 0xab, hi: 0xb1}, + {value: 0x0034, lo: 0xb2, hi: 0xb2}, + {value: 0x0024, lo: 0xb3, hi: 0xb3}, + {value: 0x0014, lo: 0xb4, hi: 0xb5}, + {value: 0x0014, lo: 0xba, hi: 0xba}, + // Block 0x17, offset 0xb4 + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0024, lo: 0x96, hi: 0x99}, + {value: 0x0014, lo: 0x9a, hi: 0x9a}, + {value: 0x0024, lo: 0x9b, hi: 0xa3}, + {value: 0x0014, lo: 0xa4, hi: 0xa4}, + {value: 0x0024, lo: 0xa5, hi: 0xa7}, + {value: 0x0014, lo: 0xa8, hi: 0xa8}, + {value: 0x0024, lo: 0xa9, hi: 0xad}, + // Block 0x18, offset 0xbc + {value: 0x0010, lo: 0x80, hi: 0x98}, + {value: 0x0034, lo: 0x99, hi: 0x9b}, + // Block 0x19, offset 0xbe + {value: 0x0010, lo: 0xa0, hi: 0xb4}, + // Block 0x1a, offset 0xbf + {value: 0x0034, lo: 0xa3, hi: 0xa3}, + {value: 0x0024, lo: 0xa4, hi: 0xa5}, + {value: 0x0034, lo: 0xa6, hi: 0xa6}, + {value: 0x0024, lo: 0xa7, hi: 0xa8}, + {value: 0x0034, lo: 0xa9, hi: 0xa9}, + {value: 0x0024, lo: 0xaa, hi: 0xac}, + {value: 0x0034, lo: 0xad, hi: 0xb2}, + {value: 0x0024, lo: 0xb3, hi: 0xb5}, + {value: 0x0034, lo: 0xb6, hi: 0xb6}, + {value: 0x0024, lo: 0xb7, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xba}, + {value: 0x0024, lo: 0xbb, hi: 0xbf}, + // Block 0x1b, offset 0xcb + {value: 0x0014, lo: 0x80, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0xb9}, + {value: 0x0014, lo: 0xba, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x1c, offset 0xd1 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x88}, + {value: 0x0010, lo: 0x89, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0024, lo: 0x91, hi: 0x91}, + {value: 0x0034, lo: 0x92, hi: 0x92}, + {value: 0x0024, lo: 0x93, hi: 0x94}, + {value: 0x0014, lo: 0x95, hi: 0x97}, + {value: 0x0010, lo: 0x98, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0014, lo: 0xb1, hi: 0xb1}, + {value: 0x0010, lo: 0xb2, hi: 0xbf}, + // Block 0x1d, offset 0xdf + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8f, hi: 0x90}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb2}, + {value: 0x0010, lo: 0xb6, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x1e, offset 0xea + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x84}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x8e, hi: 0x8e}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0x9c, hi: 0x9d}, + {value: 0x0010, lo: 0x9f, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xb1}, + // Block 0x1f, offset 0xf5 + {value: 0x0014, lo: 0x81, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8a}, + {value: 0x0010, lo: 0x8f, hi: 0x90}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb6}, + {value: 0x0010, lo: 0xb8, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x20, offset 0x100 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x82}, + {value: 0x0014, lo: 0x87, hi: 0x88}, + {value: 0x0014, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0014, lo: 0x91, hi: 0x91}, + {value: 0x0010, lo: 0x99, hi: 0x9c}, + {value: 0x0010, lo: 0x9e, hi: 0x9e}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0014, lo: 0xb0, hi: 0xb1}, + {value: 0x0010, lo: 0xb2, hi: 0xb4}, + {value: 0x0014, lo: 0xb5, hi: 0xb5}, + // Block 0x21, offset 0x10c + {value: 0x0014, lo: 0x81, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8d}, + {value: 0x0010, lo: 0x8f, hi: 0x91}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x22, offset 0x116 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x85}, + {value: 0x0014, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x89, hi: 0x89}, + {value: 0x0010, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0010, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xb9, hi: 0xb9}, + // Block 0x23, offset 0x121 + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8f, hi: 0x90}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbe}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0x24, offset 0x12c + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x84}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0014, lo: 0x96, hi: 0x96}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0x9c, hi: 0x9d}, + {value: 0x0010, lo: 0x9f, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xb1, hi: 0xb1}, + // Block 0x25, offset 0x138 + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8a}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0x95}, + {value: 0x0010, lo: 0x99, hi: 0x9a}, + {value: 0x0010, lo: 0x9c, hi: 0x9c}, + {value: 0x0010, lo: 0x9e, hi: 0x9f}, + {value: 0x0010, lo: 0xa3, hi: 0xa4}, + {value: 0x0010, lo: 0xa8, hi: 0xaa}, + {value: 0x0010, lo: 0xae, hi: 0xb9}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x26, offset 0x144 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x82}, + {value: 0x0010, lo: 0x86, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + // Block 0x27, offset 0x14c + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb9}, + {value: 0x0010, lo: 0xbd, hi: 0xbd}, + {value: 0x0014, lo: 0xbe, hi: 0xbf}, + // Block 0x28, offset 0x154 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x84}, + {value: 0x0014, lo: 0x86, hi: 0x88}, + {value: 0x0014, lo: 0x8a, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0034, lo: 0x95, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0x9a}, + {value: 0x0010, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + // Block 0x29, offset 0x15e + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbe}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0x2a, offset 0x168 + {value: 0x0010, lo: 0x80, hi: 0x84}, + {value: 0x0014, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x95, hi: 0x96}, + {value: 0x0010, lo: 0x9e, hi: 0x9e}, + {value: 0x0010, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xb1, hi: 0xb2}, + // Block 0x2b, offset 0x174 + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0xba}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x2c, offset 0x17a + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x84}, + {value: 0x0010, lo: 0x86, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x8e, hi: 0x8e}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0x9f, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xba, hi: 0xbf}, + // Block 0x2d, offset 0x185 + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x96}, + {value: 0x0010, lo: 0x9a, hi: 0xb1}, + {value: 0x0010, lo: 0xb3, hi: 0xbb}, + {value: 0x0010, lo: 0xbd, hi: 0xbd}, + // Block 0x2e, offset 0x18a + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0034, lo: 0x8a, hi: 0x8a}, + {value: 0x0010, lo: 0x8f, hi: 0x91}, + {value: 0x0014, lo: 0x92, hi: 0x94}, + {value: 0x0014, lo: 0x96, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0x9f}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + // Block 0x2f, offset 0x192 + {value: 0x0014, lo: 0xb1, hi: 0xb1}, + {value: 0x0014, lo: 0xb4, hi: 0xb7}, + {value: 0x0034, lo: 0xb8, hi: 0xba}, + // Block 0x30, offset 0x195 + {value: 0x0004, lo: 0x86, hi: 0x86}, + {value: 0x0014, lo: 0x87, hi: 0x87}, + {value: 0x0034, lo: 0x88, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8e}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0x31, offset 0x19a + {value: 0x0014, lo: 0xb1, hi: 0xb1}, + {value: 0x0014, lo: 0xb4, hi: 0xb7}, + {value: 0x0034, lo: 0xb8, hi: 0xb9}, + {value: 0x0014, lo: 0xbb, hi: 0xbc}, + // Block 0x32, offset 0x19e + {value: 0x0004, lo: 0x86, hi: 0x86}, + {value: 0x0034, lo: 0x88, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0x33, offset 0x1a2 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0034, lo: 0x98, hi: 0x99}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + {value: 0x0034, lo: 0xb5, hi: 0xb5}, + {value: 0x0034, lo: 0xb7, hi: 0xb7}, + {value: 0x0034, lo: 0xb9, hi: 0xb9}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x34, offset 0x1a9 + {value: 0x0010, lo: 0x80, hi: 0x87}, + {value: 0x0010, lo: 0x89, hi: 0xac}, + {value: 0x0034, lo: 0xb1, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + {value: 0x0014, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xba, hi: 0xbd}, + {value: 0x0014, lo: 0xbe, hi: 0xbe}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0x35, offset 0x1b2 + {value: 0x0034, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0024, lo: 0x82, hi: 0x83}, + {value: 0x0034, lo: 0x84, hi: 0x84}, + {value: 0x0024, lo: 0x86, hi: 0x87}, + {value: 0x0010, lo: 0x88, hi: 0x8c}, + {value: 0x0014, lo: 0x8d, hi: 0x97}, + {value: 0x0014, lo: 0x99, hi: 0xbc}, + // Block 0x36, offset 0x1ba + {value: 0x0034, lo: 0x86, hi: 0x86}, + // Block 0x37, offset 0x1bb + {value: 0x0010, lo: 0xab, hi: 0xac}, + {value: 0x0014, lo: 0xad, hi: 0xb0}, + {value: 0x0010, lo: 0xb1, hi: 0xb1}, + {value: 0x0014, lo: 0xb2, hi: 0xb6}, + {value: 0x0034, lo: 0xb7, hi: 0xb7}, + {value: 0x0010, lo: 0xb8, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbc}, + {value: 0x0014, lo: 0xbd, hi: 0xbe}, + // Block 0x38, offset 0x1c4 + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x96, hi: 0x97}, + {value: 0x0014, lo: 0x98, hi: 0x99}, + {value: 0x0014, lo: 0x9e, hi: 0xa0}, + {value: 0x0010, lo: 0xa2, hi: 0xa4}, + {value: 0x0010, lo: 0xa7, hi: 0xad}, + {value: 0x0014, lo: 0xb1, hi: 0xb4}, + // Block 0x39, offset 0x1cb + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x84}, + {value: 0x0014, lo: 0x85, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x8f, hi: 0x9c}, + {value: 0x0014, lo: 0x9d, hi: 0x9d}, + {value: 0x6c53, lo: 0xa0, hi: 0xbf}, + // Block 0x3a, offset 0x1d3 + {value: 0x7053, lo: 0x80, hi: 0x85}, + {value: 0x7053, lo: 0x87, hi: 0x87}, + {value: 0x7053, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0xba}, + {value: 0x0014, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x3b, offset 0x1d9 + {value: 0x0010, lo: 0x80, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0x98}, + {value: 0x0010, lo: 0x9a, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x3c, offset 0x1df + {value: 0x0010, lo: 0x80, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb5}, + {value: 0x0010, lo: 0xb8, hi: 0xbe}, + // Block 0x3d, offset 0x1e4 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x82, hi: 0x85}, + {value: 0x0010, lo: 0x88, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0xbf}, + // Block 0x3e, offset 0x1e8 + {value: 0x0010, lo: 0x80, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0x95}, + {value: 0x0010, lo: 0x98, hi: 0xbf}, + // Block 0x3f, offset 0x1eb + {value: 0x0010, lo: 0x80, hi: 0x9a}, + {value: 0x0024, lo: 0x9d, hi: 0x9f}, + // Block 0x40, offset 0x1ed + {value: 0x0010, lo: 0x80, hi: 0x8f}, + {value: 0x7453, lo: 0xa0, hi: 0xaf}, + {value: 0x7853, lo: 0xb0, hi: 0xbf}, + // Block 0x41, offset 0x1f0 + {value: 0x7c53, lo: 0x80, hi: 0x8f}, + {value: 0x8053, lo: 0x90, hi: 0x9f}, + {value: 0x7c53, lo: 0xa0, hi: 0xaf}, + {value: 0x0813, lo: 0xb0, hi: 0xb5}, + {value: 0x0892, lo: 0xb8, hi: 0xbd}, + // Block 0x42, offset 0x1f5 + {value: 0x0010, lo: 0x81, hi: 0xbf}, + // Block 0x43, offset 0x1f6 + {value: 0x0010, lo: 0x80, hi: 0xac}, + {value: 0x0010, lo: 0xaf, hi: 0xbf}, + // Block 0x44, offset 0x1f8 + {value: 0x0010, lo: 0x81, hi: 0x9a}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x45, offset 0x1fa + {value: 0x0010, lo: 0x80, hi: 0xaa}, + {value: 0x0010, lo: 0xae, hi: 0xb8}, + // Block 0x46, offset 0x1fc + {value: 0x0010, lo: 0x80, hi: 0x8c}, + {value: 0x0010, lo: 0x8e, hi: 0x91}, + {value: 0x0014, lo: 0x92, hi: 0x93}, + {value: 0x0034, lo: 0x94, hi: 0x94}, + {value: 0x0010, lo: 0xa0, hi: 0xb1}, + {value: 0x0014, lo: 0xb2, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + // Block 0x47, offset 0x203 + {value: 0x0010, lo: 0x80, hi: 0x91}, + {value: 0x0014, lo: 0x92, hi: 0x93}, + {value: 0x0010, lo: 0xa0, hi: 0xac}, + {value: 0x0010, lo: 0xae, hi: 0xb0}, + {value: 0x0014, lo: 0xb2, hi: 0xb3}, + // Block 0x48, offset 0x208 + {value: 0x0014, lo: 0xb4, hi: 0xb5}, + {value: 0x0010, lo: 0xb6, hi: 0xb6}, + {value: 0x0014, lo: 0xb7, hi: 0xbd}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x49, offset 0x20c + {value: 0x0010, lo: 0x80, hi: 0x85}, + {value: 0x0014, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0014, lo: 0x89, hi: 0x91}, + {value: 0x0034, lo: 0x92, hi: 0x92}, + {value: 0x0014, lo: 0x93, hi: 0x93}, + {value: 0x0004, lo: 0x97, hi: 0x97}, + {value: 0x0024, lo: 0x9d, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + // Block 0x4a, offset 0x215 + {value: 0x0014, lo: 0x8b, hi: 0x8e}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x4b, offset 0x218 + {value: 0x0010, lo: 0x80, hi: 0x82}, + {value: 0x0014, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x84, hi: 0xb7}, + // Block 0x4c, offset 0x21b + {value: 0x0010, lo: 0x80, hi: 0xa8}, + {value: 0x0034, lo: 0xa9, hi: 0xa9}, + {value: 0x0010, lo: 0xaa, hi: 0xaa}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0x4d, offset 0x21f + {value: 0x0010, lo: 0x80, hi: 0xb5}, + // Block 0x4e, offset 0x220 + {value: 0x0010, lo: 0x80, hi: 0x9e}, + {value: 0x0014, lo: 0xa0, hi: 0xa2}, + {value: 0x0010, lo: 0xa3, hi: 0xa6}, + {value: 0x0014, lo: 0xa7, hi: 0xa8}, + {value: 0x0010, lo: 0xa9, hi: 0xab}, + {value: 0x0010, lo: 0xb0, hi: 0xb1}, + {value: 0x0014, lo: 0xb2, hi: 0xb2}, + {value: 0x0010, lo: 0xb3, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xb9}, + {value: 0x0024, lo: 0xba, hi: 0xba}, + {value: 0x0034, lo: 0xbb, hi: 0xbb}, + // Block 0x4f, offset 0x22b + {value: 0x0010, lo: 0x86, hi: 0x8f}, + // Block 0x50, offset 0x22c + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0x51, offset 0x22d + {value: 0x0010, lo: 0x80, hi: 0x96}, + {value: 0x0024, lo: 0x97, hi: 0x97}, + {value: 0x0034, lo: 0x98, hi: 0x98}, + {value: 0x0010, lo: 0x99, hi: 0x9a}, + {value: 0x0014, lo: 0x9b, hi: 0x9b}, + // Block 0x52, offset 0x232 + {value: 0x0010, lo: 0x95, hi: 0x95}, + {value: 0x0014, lo: 0x96, hi: 0x96}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0014, lo: 0x98, hi: 0x9e}, + {value: 0x0034, lo: 0xa0, hi: 0xa0}, + {value: 0x0010, lo: 0xa1, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa2}, + {value: 0x0010, lo: 0xa3, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xac}, + {value: 0x0010, lo: 0xad, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb4}, + {value: 0x0024, lo: 0xb5, hi: 0xbc}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0x53, offset 0x23f + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0004, lo: 0xa7, hi: 0xa7}, + {value: 0x0024, lo: 0xb0, hi: 0xb4}, + {value: 0x0034, lo: 0xb5, hi: 0xba}, + {value: 0x0024, lo: 0xbb, hi: 0xbc}, + {value: 0x0034, lo: 0xbd, hi: 0xbd}, + {value: 0x0014, lo: 0xbe, hi: 0xbe}, + // Block 0x54, offset 0x247 + {value: 0x0014, lo: 0x80, hi: 0x83}, + {value: 0x0010, lo: 0x84, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + {value: 0x0010, lo: 0xb5, hi: 0xb5}, + {value: 0x0014, lo: 0xb6, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + {value: 0x0014, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x55, offset 0x24f + {value: 0x0010, lo: 0x80, hi: 0x81}, + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x83}, + {value: 0x0030, lo: 0x84, hi: 0x84}, + {value: 0x0010, lo: 0x85, hi: 0x8b}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0024, lo: 0xab, hi: 0xab}, + {value: 0x0034, lo: 0xac, hi: 0xac}, + {value: 0x0024, lo: 0xad, hi: 0xb3}, + // Block 0x56, offset 0x258 + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa5}, + {value: 0x0010, lo: 0xa6, hi: 0xa7}, + {value: 0x0014, lo: 0xa8, hi: 0xa9}, + {value: 0x0030, lo: 0xaa, hi: 0xaa}, + {value: 0x0034, lo: 0xab, hi: 0xab}, + {value: 0x0014, lo: 0xac, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xbf}, + // Block 0x57, offset 0x261 + {value: 0x0010, lo: 0x80, hi: 0xa5}, + {value: 0x0034, lo: 0xa6, hi: 0xa6}, + {value: 0x0010, lo: 0xa7, hi: 0xa7}, + {value: 0x0014, lo: 0xa8, hi: 0xa9}, + {value: 0x0010, lo: 0xaa, hi: 0xac}, + {value: 0x0014, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xae}, + {value: 0x0014, lo: 0xaf, hi: 0xb1}, + {value: 0x0030, lo: 0xb2, hi: 0xb3}, + // Block 0x58, offset 0x26a + {value: 0x0010, lo: 0x80, hi: 0xab}, + {value: 0x0014, lo: 0xac, hi: 0xb3}, + {value: 0x0010, lo: 0xb4, hi: 0xb5}, + {value: 0x0014, lo: 0xb6, hi: 0xb6}, + {value: 0x0034, lo: 0xb7, hi: 0xb7}, + // Block 0x59, offset 0x26f + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x8d, hi: 0xb7}, + {value: 0x0014, lo: 0xb8, hi: 0xbd}, + // Block 0x5a, offset 0x272 + {value: 0x0024, lo: 0x90, hi: 0x92}, + {value: 0x0034, lo: 0x94, hi: 0x99}, + {value: 0x0024, lo: 0x9a, hi: 0x9b}, + {value: 0x0034, lo: 0x9c, hi: 0x9f}, + {value: 0x0024, lo: 0xa0, hi: 0xa0}, + {value: 0x0010, lo: 0xa1, hi: 0xa1}, + {value: 0x0034, lo: 0xa2, hi: 0xa8}, + {value: 0x0010, lo: 0xa9, hi: 0xac}, + {value: 0x0034, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xb3}, + {value: 0x0024, lo: 0xb4, hi: 0xb4}, + {value: 0x0010, lo: 0xb5, hi: 0xb6}, + {value: 0x0024, lo: 0xb8, hi: 0xb9}, + // Block 0x5b, offset 0x27f + {value: 0x0012, lo: 0x80, hi: 0xab}, + {value: 0x0015, lo: 0xac, hi: 0xbf}, + // Block 0x5c, offset 0x281 + {value: 0x0015, lo: 0x80, hi: 0xaa}, + {value: 0x0012, lo: 0xab, hi: 0xb7}, + {value: 0x0015, lo: 0xb8, hi: 0xb8}, + {value: 0x8452, lo: 0xb9, hi: 0xb9}, + {value: 0x0012, lo: 0xba, hi: 0xbc}, + {value: 0x8852, lo: 0xbd, hi: 0xbd}, + {value: 0x0012, lo: 0xbe, hi: 0xbf}, + // Block 0x5d, offset 0x288 + {value: 0x0012, lo: 0x80, hi: 0x9a}, + {value: 0x0015, lo: 0x9b, hi: 0xbf}, + // Block 0x5e, offset 0x28a + {value: 0x0024, lo: 0x80, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x82}, + {value: 0x0024, lo: 0x83, hi: 0x89}, + {value: 0x0034, lo: 0x8a, hi: 0x8a}, + {value: 0x0024, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x90}, + {value: 0x0024, lo: 0x91, hi: 0xb5}, + {value: 0x0034, lo: 0xbc, hi: 0xbd}, + {value: 0x0024, lo: 0xbe, hi: 0xbe}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0x5f, offset 0x294 + {value: 0x0117, lo: 0x80, hi: 0xbf}, + // Block 0x60, offset 0x295 + {value: 0x0117, lo: 0x80, hi: 0x95}, + {value: 0x28ca, lo: 0x96, hi: 0x96}, + {value: 0x29ca, lo: 0x97, hi: 0x97}, + {value: 0x2aca, lo: 0x98, hi: 0x98}, + {value: 0x2bca, lo: 0x99, hi: 0x99}, + {value: 0x2cca, lo: 0x9a, hi: 0x9a}, + {value: 0x2dca, lo: 0x9b, hi: 0x9b}, + {value: 0x0012, lo: 0x9c, hi: 0x9d}, + {value: 0x2ecb, lo: 0x9e, hi: 0x9e}, + {value: 0x0012, lo: 0x9f, hi: 0x9f}, + {value: 0x0117, lo: 0xa0, hi: 0xbf}, + // Block 0x61, offset 0x2a0 + {value: 0x0812, lo: 0x80, hi: 0x87}, + {value: 0x0813, lo: 0x88, hi: 0x8f}, + {value: 0x0812, lo: 0x90, hi: 0x95}, + {value: 0x0813, lo: 0x98, hi: 0x9d}, + {value: 0x0812, lo: 0xa0, hi: 0xa7}, + {value: 0x0813, lo: 0xa8, hi: 0xaf}, + {value: 0x0812, lo: 0xb0, hi: 0xb7}, + {value: 0x0813, lo: 0xb8, hi: 0xbf}, + // Block 0x62, offset 0x2a8 + {value: 0x0004, lo: 0x8b, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8f}, + {value: 0x0014, lo: 0x98, hi: 0x99}, + {value: 0x0014, lo: 0xa4, hi: 0xa4}, + {value: 0x0014, lo: 0xa7, hi: 0xa7}, + {value: 0x0014, lo: 0xaa, hi: 0xae}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0x63, offset 0x2af + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x94, hi: 0x94}, + {value: 0x0014, lo: 0xa0, hi: 0xa4}, + {value: 0x0014, lo: 0xa6, hi: 0xaf}, + {value: 0x0015, lo: 0xb1, hi: 0xb1}, + {value: 0x0015, lo: 0xbf, hi: 0xbf}, + // Block 0x64, offset 0x2b5 + {value: 0x0015, lo: 0x90, hi: 0x9c}, + // Block 0x65, offset 0x2b6 + {value: 0x0024, lo: 0x90, hi: 0x91}, + {value: 0x0034, lo: 0x92, hi: 0x93}, + {value: 0x0024, lo: 0x94, hi: 0x97}, + {value: 0x0034, lo: 0x98, hi: 0x9a}, + {value: 0x0024, lo: 0x9b, hi: 0x9c}, + {value: 0x0014, lo: 0x9d, hi: 0xa0}, + {value: 0x0024, lo: 0xa1, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa4}, + {value: 0x0034, lo: 0xa5, hi: 0xa6}, + {value: 0x0024, lo: 0xa7, hi: 0xa7}, + {value: 0x0034, lo: 0xa8, hi: 0xa8}, + {value: 0x0024, lo: 0xa9, hi: 0xa9}, + {value: 0x0034, lo: 0xaa, hi: 0xaf}, + {value: 0x0024, lo: 0xb0, hi: 0xb0}, + // Block 0x66, offset 0x2c4 + {value: 0x0016, lo: 0x85, hi: 0x86}, + {value: 0x0012, lo: 0x87, hi: 0x89}, + {value: 0x9d52, lo: 0x8e, hi: 0x8e}, + {value: 0x1013, lo: 0xa0, hi: 0xaf}, + {value: 0x1012, lo: 0xb0, hi: 0xbf}, + // Block 0x67, offset 0x2c9 + {value: 0x0010, lo: 0x80, hi: 0x82}, + {value: 0x0716, lo: 0x83, hi: 0x84}, + {value: 0x0010, lo: 0x85, hi: 0x88}, + // Block 0x68, offset 0x2cc + {value: 0xa053, lo: 0xb6, hi: 0xb7}, + {value: 0xa353, lo: 0xb8, hi: 0xb9}, + {value: 0xa653, lo: 0xba, hi: 0xbb}, + {value: 0xa353, lo: 0xbc, hi: 0xbd}, + {value: 0xa053, lo: 0xbe, hi: 0xbf}, + // Block 0x69, offset 0x2d1 + {value: 0x3013, lo: 0x80, hi: 0x8f}, + {value: 0x6553, lo: 0x90, hi: 0x9f}, + {value: 0xa953, lo: 0xa0, hi: 0xae}, + {value: 0x3012, lo: 0xb0, hi: 0xbf}, + // Block 0x6a, offset 0x2d5 + {value: 0x0117, lo: 0x80, hi: 0xa3}, + {value: 0x0012, lo: 0xa4, hi: 0xa4}, + {value: 0x0716, lo: 0xab, hi: 0xac}, + {value: 0x0316, lo: 0xad, hi: 0xae}, + {value: 0x0024, lo: 0xaf, hi: 0xb1}, + {value: 0x0117, lo: 0xb2, hi: 0xb3}, + // Block 0x6b, offset 0x2db + {value: 0x6c52, lo: 0x80, hi: 0x9f}, + {value: 0x7052, lo: 0xa0, hi: 0xa5}, + {value: 0x7052, lo: 0xa7, hi: 0xa7}, + {value: 0x7052, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0x6c, offset 0x2e0 + {value: 0x0010, lo: 0x80, hi: 0xa7}, + {value: 0x0014, lo: 0xaf, hi: 0xaf}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0x6d, offset 0x2e3 + {value: 0x0010, lo: 0x80, hi: 0x96}, + {value: 0x0010, lo: 0xa0, hi: 0xa6}, + {value: 0x0010, lo: 0xa8, hi: 0xae}, + {value: 0x0010, lo: 0xb0, hi: 0xb6}, + {value: 0x0010, lo: 0xb8, hi: 0xbe}, + // Block 0x6e, offset 0x2e8 + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0010, lo: 0x88, hi: 0x8e}, + {value: 0x0010, lo: 0x90, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0x9e}, + {value: 0x0024, lo: 0xa0, hi: 0xbf}, + // Block 0x6f, offset 0x2ed + {value: 0x0014, lo: 0xaf, hi: 0xaf}, + // Block 0x70, offset 0x2ee + {value: 0x0014, lo: 0x85, hi: 0x85}, + {value: 0x0034, lo: 0xaa, hi: 0xad}, + {value: 0x0030, lo: 0xae, hi: 0xaf}, + {value: 0x0004, lo: 0xb1, hi: 0xb5}, + {value: 0x0014, lo: 0xbb, hi: 0xbb}, + {value: 0x0010, lo: 0xbc, hi: 0xbc}, + // Block 0x71, offset 0x2f4 + {value: 0x0034, lo: 0x99, hi: 0x9a}, + {value: 0x0004, lo: 0x9b, hi: 0x9e}, + // Block 0x72, offset 0x2f6 + {value: 0x0004, lo: 0xbc, hi: 0xbe}, + // Block 0x73, offset 0x2f7 + {value: 0x0010, lo: 0x85, hi: 0xad}, + {value: 0x0010, lo: 0xb1, hi: 0xbf}, + // Block 0x74, offset 0x2f9 + {value: 0x0010, lo: 0x80, hi: 0x8e}, + {value: 0x0010, lo: 0xa0, hi: 0xba}, + // Block 0x75, offset 0x2fb + {value: 0x0010, lo: 0x80, hi: 0x94}, + {value: 0x0014, lo: 0x95, hi: 0x95}, + {value: 0x0010, lo: 0x96, hi: 0xbf}, + // Block 0x76, offset 0x2fe + {value: 0x0010, lo: 0x80, hi: 0x8c}, + // Block 0x77, offset 0x2ff + {value: 0x0010, lo: 0x90, hi: 0xb7}, + {value: 0x0014, lo: 0xb8, hi: 0xbd}, + // Block 0x78, offset 0x301 + {value: 0x0010, lo: 0x80, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8c}, + {value: 0x0010, lo: 0x90, hi: 0xab}, + // Block 0x79, offset 0x304 + {value: 0x0117, lo: 0x80, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xae}, + {value: 0x0024, lo: 0xaf, hi: 0xaf}, + {value: 0x0014, lo: 0xb0, hi: 0xb2}, + {value: 0x0024, lo: 0xb4, hi: 0xbd}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0x7a, offset 0x30a + {value: 0x0117, lo: 0x80, hi: 0x9b}, + {value: 0x0015, lo: 0x9c, hi: 0x9d}, + {value: 0x0024, lo: 0x9e, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x7b, offset 0x30e + {value: 0x0010, lo: 0x80, hi: 0xaf}, + {value: 0x0024, lo: 0xb0, hi: 0xb1}, + // Block 0x7c, offset 0x310 + {value: 0x0004, lo: 0x80, hi: 0x96}, + {value: 0x0014, lo: 0x97, hi: 0x9f}, + {value: 0x0004, lo: 0xa0, hi: 0xa1}, + {value: 0x0117, lo: 0xa2, hi: 0xaf}, + {value: 0x0012, lo: 0xb0, hi: 0xb1}, + {value: 0x0117, lo: 0xb2, hi: 0xbf}, + // Block 0x7d, offset 0x316 + {value: 0x0117, lo: 0x80, hi: 0xaf}, + {value: 0x0015, lo: 0xb0, hi: 0xb0}, + {value: 0x0012, lo: 0xb1, hi: 0xb8}, + {value: 0x0316, lo: 0xb9, hi: 0xba}, + {value: 0x0716, lo: 0xbb, hi: 0xbc}, + {value: 0x8453, lo: 0xbd, hi: 0xbd}, + {value: 0x0117, lo: 0xbe, hi: 0xbf}, + // Block 0x7e, offset 0x31d + {value: 0x0010, lo: 0xb7, hi: 0xb7}, + {value: 0x0015, lo: 0xb8, hi: 0xb9}, + {value: 0x0012, lo: 0xba, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbf}, + // Block 0x7f, offset 0x321 + {value: 0x0010, lo: 0x80, hi: 0x81}, + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x85}, + {value: 0x0034, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x8a}, + {value: 0x0014, lo: 0x8b, hi: 0x8b}, + {value: 0x0010, lo: 0x8c, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xa6}, + {value: 0x0010, lo: 0xa7, hi: 0xa7}, + // Block 0x80, offset 0x32a + {value: 0x0010, lo: 0x80, hi: 0xb3}, + // Block 0x81, offset 0x32b + {value: 0x0010, lo: 0x80, hi: 0x83}, + {value: 0x0034, lo: 0x84, hi: 0x84}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0024, lo: 0xa0, hi: 0xb1}, + {value: 0x0010, lo: 0xb2, hi: 0xb7}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + {value: 0x0010, lo: 0xbd, hi: 0xbd}, + // Block 0x82, offset 0x332 + {value: 0x0010, lo: 0x80, hi: 0xa5}, + {value: 0x0014, lo: 0xa6, hi: 0xaa}, + {value: 0x0034, lo: 0xab, hi: 0xad}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0x83, offset 0x336 + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0014, lo: 0x87, hi: 0x91}, + {value: 0x0010, lo: 0x92, hi: 0x92}, + {value: 0x0030, lo: 0x93, hi: 0x93}, + {value: 0x0010, lo: 0xa0, hi: 0xbc}, + // Block 0x84, offset 0x33b + {value: 0x0014, lo: 0x80, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0xb2}, + {value: 0x0034, lo: 0xb3, hi: 0xb3}, + {value: 0x0010, lo: 0xb4, hi: 0xb5}, + {value: 0x0014, lo: 0xb6, hi: 0xb9}, + {value: 0x0010, lo: 0xba, hi: 0xbb}, + {value: 0x0014, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x85, offset 0x343 + {value: 0x0030, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x8f, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0014, lo: 0xa5, hi: 0xa5}, + {value: 0x0004, lo: 0xa6, hi: 0xa6}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0x86, offset 0x349 + {value: 0x0010, lo: 0x80, hi: 0xa8}, + {value: 0x0014, lo: 0xa9, hi: 0xae}, + {value: 0x0010, lo: 0xaf, hi: 0xb0}, + {value: 0x0014, lo: 0xb1, hi: 0xb2}, + {value: 0x0010, lo: 0xb3, hi: 0xb4}, + {value: 0x0014, lo: 0xb5, hi: 0xb6}, + // Block 0x87, offset 0x34f + {value: 0x0010, lo: 0x80, hi: 0x82}, + {value: 0x0014, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x84, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8c}, + {value: 0x0010, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0004, lo: 0xb0, hi: 0xb0}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + {value: 0x0014, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbd}, + // Block 0x88, offset 0x359 + {value: 0x0024, lo: 0xb0, hi: 0xb0}, + {value: 0x0024, lo: 0xb2, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + {value: 0x0024, lo: 0xb7, hi: 0xb8}, + {value: 0x0024, lo: 0xbe, hi: 0xbf}, + // Block 0x89, offset 0x35e + {value: 0x0024, lo: 0x81, hi: 0x81}, + {value: 0x0004, lo: 0x9d, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xab}, + {value: 0x0014, lo: 0xac, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xaf}, + {value: 0x0010, lo: 0xb2, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb4}, + {value: 0x0010, lo: 0xb5, hi: 0xb5}, + {value: 0x0034, lo: 0xb6, hi: 0xb6}, + // Block 0x8a, offset 0x367 + {value: 0x0010, lo: 0x81, hi: 0x86}, + {value: 0x0010, lo: 0x89, hi: 0x8e}, + {value: 0x0010, lo: 0x91, hi: 0x96}, + {value: 0x0010, lo: 0xa0, hi: 0xa6}, + {value: 0x0010, lo: 0xa8, hi: 0xae}, + {value: 0x0012, lo: 0xb0, hi: 0xbf}, + // Block 0x8b, offset 0x36d + {value: 0x0012, lo: 0x80, hi: 0x92}, + {value: 0xac52, lo: 0x93, hi: 0x93}, + {value: 0x0012, lo: 0x94, hi: 0x9a}, + {value: 0x0004, lo: 0x9b, hi: 0x9b}, + {value: 0x0015, lo: 0x9c, hi: 0x9f}, + {value: 0x0012, lo: 0xa0, hi: 0xa5}, + {value: 0x74d2, lo: 0xb0, hi: 0xbf}, + // Block 0x8c, offset 0x374 + {value: 0x78d2, lo: 0x80, hi: 0x8f}, + {value: 0x7cd2, lo: 0x90, hi: 0x9f}, + {value: 0x80d2, lo: 0xa0, hi: 0xaf}, + {value: 0x7cd2, lo: 0xb0, hi: 0xbf}, + // Block 0x8d, offset 0x378 + {value: 0x0010, lo: 0x80, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xa5}, + {value: 0x0010, lo: 0xa6, hi: 0xa7}, + {value: 0x0014, lo: 0xa8, hi: 0xa8}, + {value: 0x0010, lo: 0xa9, hi: 0xaa}, + {value: 0x0010, lo: 0xac, hi: 0xac}, + {value: 0x0034, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0x8e, offset 0x380 + {value: 0x0010, lo: 0x80, hi: 0xa3}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0x8f, offset 0x382 + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0010, lo: 0x8b, hi: 0xbb}, + // Block 0x90, offset 0x384 + {value: 0x0010, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x83, hi: 0x84}, + {value: 0x0010, lo: 0x86, hi: 0xbf}, + // Block 0x91, offset 0x387 + {value: 0x0010, lo: 0x80, hi: 0xb1}, + {value: 0x0004, lo: 0xb2, hi: 0xbf}, + // Block 0x92, offset 0x389 + {value: 0x0004, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x93, hi: 0xbf}, + // Block 0x93, offset 0x38b + {value: 0x0010, lo: 0x80, hi: 0xbd}, + // Block 0x94, offset 0x38c + {value: 0x0010, lo: 0x90, hi: 0xbf}, + // Block 0x95, offset 0x38d + {value: 0x0010, lo: 0x80, hi: 0x8f}, + {value: 0x0010, lo: 0x92, hi: 0xbf}, + // Block 0x96, offset 0x38f + {value: 0x0010, lo: 0x80, hi: 0x87}, + {value: 0x0010, lo: 0xb0, hi: 0xbb}, + // Block 0x97, offset 0x391 + {value: 0x0014, lo: 0x80, hi: 0x8f}, + {value: 0x0014, lo: 0x93, hi: 0x93}, + {value: 0x0024, lo: 0xa0, hi: 0xa6}, + {value: 0x0034, lo: 0xa7, hi: 0xad}, + {value: 0x0024, lo: 0xae, hi: 0xaf}, + {value: 0x0010, lo: 0xb3, hi: 0xb4}, + // Block 0x98, offset 0x397 + {value: 0x0010, lo: 0x8d, hi: 0x8f}, + {value: 0x0014, lo: 0x92, hi: 0x92}, + {value: 0x0014, lo: 0x95, hi: 0x95}, + {value: 0x0010, lo: 0xb0, hi: 0xb4}, + {value: 0x0010, lo: 0xb6, hi: 0xbf}, + // Block 0x99, offset 0x39c + {value: 0x0010, lo: 0x80, hi: 0xbc}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0x9a, offset 0x39e + {value: 0x0014, lo: 0x87, hi: 0x87}, + {value: 0x0014, lo: 0x8e, hi: 0x8e}, + {value: 0x0014, lo: 0x9a, hi: 0x9a}, + {value: 0x5f53, lo: 0xa1, hi: 0xba}, + {value: 0x0004, lo: 0xbe, hi: 0xbe}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0x9b, offset 0x3a4 + {value: 0x0004, lo: 0x80, hi: 0x80}, + {value: 0x5f52, lo: 0x81, hi: 0x9a}, + {value: 0x0004, lo: 0xb0, hi: 0xb0}, + // Block 0x9c, offset 0x3a7 + {value: 0x0014, lo: 0x9e, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xbe}, + // Block 0x9d, offset 0x3a9 + {value: 0x0010, lo: 0x82, hi: 0x87}, + {value: 0x0010, lo: 0x8a, hi: 0x8f}, + {value: 0x0010, lo: 0x92, hi: 0x97}, + {value: 0x0010, lo: 0x9a, hi: 0x9c}, + {value: 0x0004, lo: 0xa3, hi: 0xa3}, + {value: 0x0014, lo: 0xb9, hi: 0xbb}, + // Block 0x9e, offset 0x3af + {value: 0x0010, lo: 0x80, hi: 0x8b}, + {value: 0x0010, lo: 0x8d, hi: 0xa6}, + {value: 0x0010, lo: 0xa8, hi: 0xba}, + {value: 0x0010, lo: 0xbc, hi: 0xbd}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0x9f, offset 0x3b4 + {value: 0x0010, lo: 0x80, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x9d}, + // Block 0xa0, offset 0x3b6 + {value: 0x0010, lo: 0x80, hi: 0xba}, + // Block 0xa1, offset 0x3b7 + {value: 0x0010, lo: 0x80, hi: 0xb4}, + // Block 0xa2, offset 0x3b8 + {value: 0x0034, lo: 0xbd, hi: 0xbd}, + // Block 0xa3, offset 0x3b9 + {value: 0x0010, lo: 0x80, hi: 0x9c}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0xa4, offset 0x3bb + {value: 0x0010, lo: 0x80, hi: 0x90}, + {value: 0x0034, lo: 0xa0, hi: 0xa0}, + // Block 0xa5, offset 0x3bd + {value: 0x0010, lo: 0x80, hi: 0x9f}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xa6, offset 0x3bf + {value: 0x0010, lo: 0x80, hi: 0x8a}, + {value: 0x0010, lo: 0x90, hi: 0xb5}, + {value: 0x0024, lo: 0xb6, hi: 0xba}, + // Block 0xa7, offset 0x3c2 + {value: 0x0010, lo: 0x80, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0xa8, offset 0x3c4 + {value: 0x0010, lo: 0x80, hi: 0x83}, + {value: 0x0010, lo: 0x88, hi: 0x8f}, + {value: 0x0010, lo: 0x91, hi: 0x95}, + // Block 0xa9, offset 0x3c7 + {value: 0x2813, lo: 0x80, hi: 0x87}, + {value: 0x3813, lo: 0x88, hi: 0x8f}, + {value: 0x2813, lo: 0x90, hi: 0x97}, + {value: 0xaf53, lo: 0x98, hi: 0x9f}, + {value: 0xb253, lo: 0xa0, hi: 0xa7}, + {value: 0x2812, lo: 0xa8, hi: 0xaf}, + {value: 0x3812, lo: 0xb0, hi: 0xb7}, + {value: 0x2812, lo: 0xb8, hi: 0xbf}, + // Block 0xaa, offset 0x3cf + {value: 0xaf52, lo: 0x80, hi: 0x87}, + {value: 0xb252, lo: 0x88, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0xbf}, + // Block 0xab, offset 0x3d2 + {value: 0x0010, lo: 0x80, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + // Block 0xac, offset 0x3d4 + {value: 0x0010, lo: 0x80, hi: 0xa7}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xad, offset 0x3d6 + {value: 0x0010, lo: 0x80, hi: 0xa3}, + // Block 0xae, offset 0x3d7 + {value: 0x0010, lo: 0x80, hi: 0xb6}, + // Block 0xaf, offset 0x3d8 + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0010, lo: 0xa0, hi: 0xa7}, + // Block 0xb0, offset 0x3da + {value: 0x0010, lo: 0x80, hi: 0x85}, + {value: 0x0010, lo: 0x88, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0xb5}, + {value: 0x0010, lo: 0xb7, hi: 0xb8}, + {value: 0x0010, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0xb1, offset 0x3e0 + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0010, lo: 0xa0, hi: 0xb6}, + // Block 0xb2, offset 0x3e2 + {value: 0x0010, lo: 0x80, hi: 0x9e}, + // Block 0xb3, offset 0x3e3 + {value: 0x0010, lo: 0xa0, hi: 0xb2}, + {value: 0x0010, lo: 0xb4, hi: 0xb5}, + // Block 0xb4, offset 0x3e5 + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0010, lo: 0xa0, hi: 0xb9}, + // Block 0xb5, offset 0x3e7 + {value: 0x0010, lo: 0x80, hi: 0xb7}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0xb6, offset 0x3e9 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x83}, + {value: 0x0014, lo: 0x85, hi: 0x86}, + {value: 0x0014, lo: 0x8c, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0014, lo: 0x8e, hi: 0x8e}, + {value: 0x0024, lo: 0x8f, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0x93}, + {value: 0x0010, lo: 0x95, hi: 0x97}, + {value: 0x0010, lo: 0x99, hi: 0xb3}, + {value: 0x0024, lo: 0xb8, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xba}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0xb7, offset 0x3f6 + {value: 0x0010, lo: 0xa0, hi: 0xbc}, + // Block 0xb8, offset 0x3f7 + {value: 0x0010, lo: 0x80, hi: 0x9c}, + // Block 0xb9, offset 0x3f8 + {value: 0x0010, lo: 0x80, hi: 0x87}, + {value: 0x0010, lo: 0x89, hi: 0xa4}, + {value: 0x0024, lo: 0xa5, hi: 0xa5}, + {value: 0x0034, lo: 0xa6, hi: 0xa6}, + // Block 0xba, offset 0x3fc + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0010, lo: 0xa0, hi: 0xb2}, + // Block 0xbb, offset 0x3fe + {value: 0x0010, lo: 0x80, hi: 0x91}, + // Block 0xbc, offset 0x3ff + {value: 0x0010, lo: 0x80, hi: 0x88}, + // Block 0xbd, offset 0x400 + {value: 0x5653, lo: 0x80, hi: 0xb2}, + // Block 0xbe, offset 0x401 + {value: 0x5652, lo: 0x80, hi: 0xb2}, + // Block 0xbf, offset 0x402 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0xb7}, + {value: 0x0014, lo: 0xb8, hi: 0xbf}, + // Block 0xc0, offset 0x406 + {value: 0x0014, lo: 0x80, hi: 0x85}, + {value: 0x0034, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0xc1, offset 0x40a + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb6}, + {value: 0x0010, lo: 0xb7, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xba}, + {value: 0x0014, lo: 0xbd, hi: 0xbd}, + // Block 0xc2, offset 0x410 + {value: 0x0010, lo: 0x90, hi: 0xa8}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0xc3, offset 0x412 + {value: 0x0024, lo: 0x80, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0xa6}, + {value: 0x0014, lo: 0xa7, hi: 0xab}, + {value: 0x0010, lo: 0xac, hi: 0xac}, + {value: 0x0014, lo: 0xad, hi: 0xb2}, + {value: 0x0034, lo: 0xb3, hi: 0xb4}, + {value: 0x0010, lo: 0xb6, hi: 0xbf}, + // Block 0xc4, offset 0x419 + {value: 0x0010, lo: 0x90, hi: 0xb2}, + {value: 0x0034, lo: 0xb3, hi: 0xb3}, + {value: 0x0010, lo: 0xb6, hi: 0xb6}, + // Block 0xc5, offset 0x41c + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0xb5}, + {value: 0x0014, lo: 0xb6, hi: 0xbe}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0xc6, offset 0x420 + {value: 0x0030, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x84}, + {value: 0x0034, lo: 0x8a, hi: 0x8a}, + {value: 0x0014, lo: 0x8b, hi: 0x8c}, + {value: 0x0010, lo: 0x90, hi: 0x9a}, + {value: 0x0010, lo: 0x9c, hi: 0x9c}, + // Block 0xc7, offset 0x426 + {value: 0x0010, lo: 0x80, hi: 0x91}, + {value: 0x0010, lo: 0x93, hi: 0xae}, + {value: 0x0014, lo: 0xaf, hi: 0xb1}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0014, lo: 0xb4, hi: 0xb4}, + {value: 0x0030, lo: 0xb5, hi: 0xb5}, + {value: 0x0034, lo: 0xb6, hi: 0xb6}, + {value: 0x0014, lo: 0xb7, hi: 0xb7}, + // Block 0xc8, offset 0x42e + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0010, lo: 0x88, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8d}, + {value: 0x0010, lo: 0x8f, hi: 0x9d}, + {value: 0x0010, lo: 0x9f, hi: 0xa8}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xc9, offset 0x434 + {value: 0x0010, lo: 0x80, hi: 0x9e}, + {value: 0x0014, lo: 0x9f, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xa2}, + {value: 0x0014, lo: 0xa3, hi: 0xa8}, + {value: 0x0034, lo: 0xa9, hi: 0xaa}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0xca, offset 0x43a + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8f, hi: 0x90}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0xcb, offset 0x444 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x84}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x8b, hi: 0x8c}, + {value: 0x0030, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0x9d, hi: 0xa3}, + {value: 0x0024, lo: 0xa6, hi: 0xac}, + {value: 0x0024, lo: 0xb0, hi: 0xb4}, + // Block 0xcc, offset 0x44e + {value: 0x0010, lo: 0x80, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb8}, + {value: 0x0010, lo: 0xb9, hi: 0xb9}, + {value: 0x0014, lo: 0xba, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbe}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0xcd, offset 0x454 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x84, hi: 0x85}, + {value: 0x0010, lo: 0x87, hi: 0x87}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0xce, offset 0x45a + {value: 0x0010, lo: 0x80, hi: 0xb1}, + {value: 0x0014, lo: 0xb2, hi: 0xb5}, + {value: 0x0010, lo: 0xb8, hi: 0xbb}, + {value: 0x0014, lo: 0xbc, hi: 0xbd}, + {value: 0x0010, lo: 0xbe, hi: 0xbe}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0xcf, offset 0x460 + {value: 0x0034, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x98, hi: 0x9b}, + {value: 0x0014, lo: 0x9c, hi: 0x9d}, + // Block 0xd0, offset 0x463 + {value: 0x0010, lo: 0x80, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbc}, + {value: 0x0014, lo: 0xbd, hi: 0xbd}, + {value: 0x0010, lo: 0xbe, hi: 0xbe}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0xd1, offset 0x469 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x84, hi: 0x84}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0xd2, offset 0x46c + {value: 0x0010, lo: 0x80, hi: 0xaa}, + {value: 0x0014, lo: 0xab, hi: 0xab}, + {value: 0x0010, lo: 0xac, hi: 0xac}, + {value: 0x0014, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xaf}, + {value: 0x0014, lo: 0xb0, hi: 0xb5}, + {value: 0x0030, lo: 0xb6, hi: 0xb6}, + {value: 0x0034, lo: 0xb7, hi: 0xb7}, + // Block 0xd3, offset 0x474 + {value: 0x0010, lo: 0x80, hi: 0x89}, + // Block 0xd4, offset 0x475 + {value: 0x0014, lo: 0x9d, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa5}, + {value: 0x0010, lo: 0xa6, hi: 0xa6}, + {value: 0x0014, lo: 0xa7, hi: 0xaa}, + {value: 0x0034, lo: 0xab, hi: 0xab}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0xd5, offset 0x47c + {value: 0x5f53, lo: 0xa0, hi: 0xbf}, + // Block 0xd6, offset 0x47d + {value: 0x5f52, lo: 0x80, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0xd7, offset 0x480 + {value: 0x0010, lo: 0x80, hi: 0xb8}, + // Block 0xd8, offset 0x481 + {value: 0x0010, lo: 0x80, hi: 0x99}, + // Block 0xd9, offset 0x482 + {value: 0x0010, lo: 0x80, hi: 0xae}, + // Block 0xda, offset 0x483 + {value: 0x0010, lo: 0x80, hi: 0x83}, + // Block 0xdb, offset 0x484 + {value: 0x0010, lo: 0x80, hi: 0x86}, + // Block 0xdc, offset 0x485 + {value: 0x0010, lo: 0x80, hi: 0x9e}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + // Block 0xdd, offset 0x487 + {value: 0x0010, lo: 0x90, hi: 0xad}, + {value: 0x0034, lo: 0xb0, hi: 0xb4}, + // Block 0xde, offset 0x489 + {value: 0x0010, lo: 0x80, hi: 0xaf}, + {value: 0x0024, lo: 0xb0, hi: 0xb6}, + // Block 0xdf, offset 0x48b + {value: 0x0014, lo: 0x80, hi: 0x83}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0010, lo: 0xa3, hi: 0xb7}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0xe0, offset 0x48f + {value: 0x0010, lo: 0x80, hi: 0x8f}, + // Block 0xe1, offset 0x490 + {value: 0x0010, lo: 0x80, hi: 0x84}, + {value: 0x0010, lo: 0x90, hi: 0xbe}, + // Block 0xe2, offset 0x492 + {value: 0x0014, lo: 0x8f, hi: 0x9f}, + // Block 0xe3, offset 0x493 + {value: 0x0010, lo: 0x80, hi: 0xaa}, + {value: 0x0010, lo: 0xb0, hi: 0xbc}, + // Block 0xe4, offset 0x495 + {value: 0x0010, lo: 0x80, hi: 0x88}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0014, lo: 0x9d, hi: 0x9d}, + {value: 0x0034, lo: 0x9e, hi: 0x9e}, + {value: 0x0014, lo: 0xa0, hi: 0xa3}, + // Block 0xe5, offset 0x49a + {value: 0x0030, lo: 0xa5, hi: 0xa6}, + {value: 0x0034, lo: 0xa7, hi: 0xa9}, + {value: 0x0030, lo: 0xad, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xba}, + {value: 0x0034, lo: 0xbb, hi: 0xbf}, + // Block 0xe6, offset 0x49f + {value: 0x0034, lo: 0x80, hi: 0x82}, + {value: 0x0024, lo: 0x85, hi: 0x89}, + {value: 0x0034, lo: 0x8a, hi: 0x8b}, + {value: 0x0024, lo: 0xaa, hi: 0xad}, + // Block 0xe7, offset 0x4a3 + {value: 0x0024, lo: 0x82, hi: 0x84}, + // Block 0xe8, offset 0x4a4 + {value: 0x0013, lo: 0x80, hi: 0x99}, + {value: 0x0012, lo: 0x9a, hi: 0xb3}, + {value: 0x0013, lo: 0xb4, hi: 0xbf}, + // Block 0xe9, offset 0x4a7 + {value: 0x0013, lo: 0x80, hi: 0x8d}, + {value: 0x0012, lo: 0x8e, hi: 0x94}, + {value: 0x0012, lo: 0x96, hi: 0xa7}, + {value: 0x0013, lo: 0xa8, hi: 0xbf}, + // Block 0xea, offset 0x4ab + {value: 0x0013, lo: 0x80, hi: 0x81}, + {value: 0x0012, lo: 0x82, hi: 0x9b}, + {value: 0x0013, lo: 0x9c, hi: 0x9c}, + {value: 0x0013, lo: 0x9e, hi: 0x9f}, + {value: 0x0013, lo: 0xa2, hi: 0xa2}, + {value: 0x0013, lo: 0xa5, hi: 0xa6}, + {value: 0x0013, lo: 0xa9, hi: 0xac}, + {value: 0x0013, lo: 0xae, hi: 0xb5}, + {value: 0x0012, lo: 0xb6, hi: 0xb9}, + {value: 0x0012, lo: 0xbb, hi: 0xbb}, + {value: 0x0012, lo: 0xbd, hi: 0xbf}, + // Block 0xeb, offset 0x4b6 + {value: 0x0012, lo: 0x80, hi: 0x83}, + {value: 0x0012, lo: 0x85, hi: 0x8f}, + {value: 0x0013, lo: 0x90, hi: 0xa9}, + {value: 0x0012, lo: 0xaa, hi: 0xbf}, + // Block 0xec, offset 0x4ba + {value: 0x0012, lo: 0x80, hi: 0x83}, + {value: 0x0013, lo: 0x84, hi: 0x85}, + {value: 0x0013, lo: 0x87, hi: 0x8a}, + {value: 0x0013, lo: 0x8d, hi: 0x94}, + {value: 0x0013, lo: 0x96, hi: 0x9c}, + {value: 0x0012, lo: 0x9e, hi: 0xb7}, + {value: 0x0013, lo: 0xb8, hi: 0xb9}, + {value: 0x0013, lo: 0xbb, hi: 0xbe}, + // Block 0xed, offset 0x4c2 + {value: 0x0013, lo: 0x80, hi: 0x84}, + {value: 0x0013, lo: 0x86, hi: 0x86}, + {value: 0x0013, lo: 0x8a, hi: 0x90}, + {value: 0x0012, lo: 0x92, hi: 0xab}, + {value: 0x0013, lo: 0xac, hi: 0xbf}, + // Block 0xee, offset 0x4c7 + {value: 0x0013, lo: 0x80, hi: 0x85}, + {value: 0x0012, lo: 0x86, hi: 0x9f}, + {value: 0x0013, lo: 0xa0, hi: 0xb9}, + {value: 0x0012, lo: 0xba, hi: 0xbf}, + // Block 0xef, offset 0x4cb + {value: 0x0012, lo: 0x80, hi: 0x93}, + {value: 0x0013, lo: 0x94, hi: 0xad}, + {value: 0x0012, lo: 0xae, hi: 0xbf}, + // Block 0xf0, offset 0x4ce + {value: 0x0012, lo: 0x80, hi: 0x87}, + {value: 0x0013, lo: 0x88, hi: 0xa1}, + {value: 0x0012, lo: 0xa2, hi: 0xbb}, + {value: 0x0013, lo: 0xbc, hi: 0xbf}, + // Block 0xf1, offset 0x4d2 + {value: 0x0013, lo: 0x80, hi: 0x95}, + {value: 0x0012, lo: 0x96, hi: 0xaf}, + {value: 0x0013, lo: 0xb0, hi: 0xbf}, + // Block 0xf2, offset 0x4d5 + {value: 0x0013, lo: 0x80, hi: 0x89}, + {value: 0x0012, lo: 0x8a, hi: 0xa5}, + {value: 0x0013, lo: 0xa8, hi: 0xbf}, + // Block 0xf3, offset 0x4d8 + {value: 0x0013, lo: 0x80, hi: 0x80}, + {value: 0x0012, lo: 0x82, hi: 0x9a}, + {value: 0x0012, lo: 0x9c, hi: 0xa1}, + {value: 0x0013, lo: 0xa2, hi: 0xba}, + {value: 0x0012, lo: 0xbc, hi: 0xbf}, + // Block 0xf4, offset 0x4dd + {value: 0x0012, lo: 0x80, hi: 0x94}, + {value: 0x0012, lo: 0x96, hi: 0x9b}, + {value: 0x0013, lo: 0x9c, hi: 0xb4}, + {value: 0x0012, lo: 0xb6, hi: 0xbf}, + // Block 0xf5, offset 0x4e1 + {value: 0x0012, lo: 0x80, hi: 0x8e}, + {value: 0x0012, lo: 0x90, hi: 0x95}, + {value: 0x0013, lo: 0x96, hi: 0xae}, + {value: 0x0012, lo: 0xb0, hi: 0xbf}, + // Block 0xf6, offset 0x4e5 + {value: 0x0012, lo: 0x80, hi: 0x88}, + {value: 0x0012, lo: 0x8a, hi: 0x8f}, + {value: 0x0013, lo: 0x90, hi: 0xa8}, + {value: 0x0012, lo: 0xaa, hi: 0xbf}, + // Block 0xf7, offset 0x4e9 + {value: 0x0012, lo: 0x80, hi: 0x82}, + {value: 0x0012, lo: 0x84, hi: 0x89}, + {value: 0x0017, lo: 0x8a, hi: 0x8b}, + {value: 0x0010, lo: 0x8e, hi: 0xbf}, + // Block 0xf8, offset 0x4ed + {value: 0x0014, lo: 0x80, hi: 0xb6}, + {value: 0x0014, lo: 0xbb, hi: 0xbf}, + // Block 0xf9, offset 0x4ef + {value: 0x0014, lo: 0x80, hi: 0xac}, + {value: 0x0014, lo: 0xb5, hi: 0xb5}, + // Block 0xfa, offset 0x4f1 + {value: 0x0014, lo: 0x84, hi: 0x84}, + {value: 0x0014, lo: 0x9b, hi: 0x9f}, + {value: 0x0014, lo: 0xa1, hi: 0xaf}, + // Block 0xfb, offset 0x4f4 + {value: 0x0010, lo: 0x80, hi: 0x84}, + {value: 0x0034, lo: 0x90, hi: 0x96}, + // Block 0xfc, offset 0x4f6 + {value: 0x0010, lo: 0x80, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x9f}, + {value: 0x0010, lo: 0xa1, hi: 0xa2}, + {value: 0x0010, lo: 0xa4, hi: 0xa4}, + {value: 0x0010, lo: 0xa7, hi: 0xa7}, + {value: 0x0010, lo: 0xa9, hi: 0xb2}, + {value: 0x0010, lo: 0xb4, hi: 0xb7}, + {value: 0x0010, lo: 0xb9, hi: 0xb9}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + // Block 0xfd, offset 0x4ff + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x8b, hi: 0x9b}, + {value: 0x0010, lo: 0xa1, hi: 0xa3}, + {value: 0x0010, lo: 0xa5, hi: 0xa9}, + {value: 0x0010, lo: 0xab, hi: 0xbb}, + // Block 0xfe, offset 0x504 + {value: 0x0013, lo: 0xb0, hi: 0xbf}, + // Block 0xff, offset 0x505 + {value: 0x0013, lo: 0x80, hi: 0x89}, + {value: 0x0013, lo: 0x90, hi: 0xa9}, + {value: 0x0013, lo: 0xb0, hi: 0xbf}, + // Block 0x100, offset 0x508 + {value: 0x0013, lo: 0x80, hi: 0x89}, + // Block 0x101, offset 0x509 + {value: 0x0004, lo: 0xbb, hi: 0xbf}, + // Block 0x102, offset 0x50a + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0014, lo: 0xa0, hi: 0xbf}, + // Block 0x103, offset 0x50c + {value: 0x0014, lo: 0x80, hi: 0xbf}, + // Block 0x104, offset 0x50d + {value: 0x0014, lo: 0x80, hi: 0xaf}, +} + +// Total table size 13326 bytes (13KiB); checksum: 98FE2994 diff --git a/vendor/golang.org/x/text/cases/tables_test.go b/vendor/golang.org/x/text/cases/tables_test.go new file mode 100644 index 0000000000..14db491c47 --- /dev/null +++ b/vendor/golang.org/x/text/cases/tables_test.go @@ -0,0 +1,1130 @@ +// This file was generated by go generate; DO NOT EDIT + +package cases + +var ( + caseIgnorable = map[rune]bool{ + 0x0027: true, + 0x002e: true, + 0x003a: true, + 0x00b7: true, + 0x0387: true, + 0x05f4: true, + 0x2018: true, + 0x2019: true, + 0x2024: true, + 0x2027: true, + 0xfe13: true, + 0xfe52: true, + 0xfe55: true, + 0xff07: true, + 0xff0e: true, + 0xff1a: true, + } + + special = map[rune]struct{ toLower, toTitle, toUpper string }{ + 0x00df: {"ß", "Ss", "SS"}, + 0x0130: {"i̇", "İ", "İ"}, + 0xfb00: {"ff", "Ff", "FF"}, + 0xfb01: {"fi", "Fi", "FI"}, + 0xfb02: {"fl", "Fl", "FL"}, + 0xfb03: {"ffi", "Ffi", "FFI"}, + 0xfb04: {"ffl", "Ffl", "FFL"}, + 0xfb05: {"ſt", "St", "ST"}, + 0xfb06: {"st", "St", "ST"}, + 0x0587: {"և", "Եւ", "ԵՒ"}, + 0xfb13: {"ﬓ", "Մն", "ՄՆ"}, + 0xfb14: {"ﬔ", "Մե", "ՄԵ"}, + 0xfb15: {"ﬕ", "Մի", "ՄԻ"}, + 0xfb16: {"ﬖ", "Վն", "ՎՆ"}, + 0xfb17: {"ﬗ", "Մխ", "ՄԽ"}, + 0x0149: {"ʼn", "ʼN", "ʼN"}, + 0x0390: {"ΐ", "Ϊ́", "Ϊ́"}, + 0x03b0: {"ΰ", "Ϋ́", "Ϋ́"}, + 0x01f0: {"ǰ", "J̌", "J̌"}, + 0x1e96: {"ẖ", "H̱", "H̱"}, + 0x1e97: {"ẗ", "T̈", "T̈"}, + 0x1e98: {"ẘ", "W̊", "W̊"}, + 0x1e99: {"ẙ", "Y̊", "Y̊"}, + 0x1e9a: {"ẚ", "Aʾ", "Aʾ"}, + 0x1f50: {"ὐ", "Υ̓", "Υ̓"}, + 0x1f52: {"ὒ", "Υ̓̀", "Υ̓̀"}, + 0x1f54: {"ὔ", "Υ̓́", "Υ̓́"}, + 0x1f56: {"ὖ", "Υ̓͂", "Υ̓͂"}, + 0x1fb6: {"ᾶ", "Α͂", "Α͂"}, + 0x1fc6: {"ῆ", "Η͂", "Η͂"}, + 0x1fd2: {"ῒ", "Ϊ̀", "Ϊ̀"}, + 0x1fd3: {"ΐ", "Ϊ́", "Ϊ́"}, + 0x1fd6: {"ῖ", "Ι͂", "Ι͂"}, + 0x1fd7: {"ῗ", "Ϊ͂", "Ϊ͂"}, + 0x1fe2: {"ῢ", "Ϋ̀", "Ϋ̀"}, + 0x1fe3: {"ΰ", "Ϋ́", "Ϋ́"}, + 0x1fe4: {"ῤ", "Ρ̓", "Ρ̓"}, + 0x1fe6: {"ῦ", "Υ͂", "Υ͂"}, + 0x1fe7: {"ῧ", "Ϋ͂", "Ϋ͂"}, + 0x1ff6: {"ῶ", "Ω͂", "Ω͂"}, + 0x1f80: {"ᾀ", "ᾈ", "ἈΙ"}, + 0x1f81: {"ᾁ", "ᾉ", "ἉΙ"}, + 0x1f82: {"ᾂ", "ᾊ", "ἊΙ"}, + 0x1f83: {"ᾃ", "ᾋ", "ἋΙ"}, + 0x1f84: {"ᾄ", "ᾌ", "ἌΙ"}, + 0x1f85: {"ᾅ", "ᾍ", "ἍΙ"}, + 0x1f86: {"ᾆ", "ᾎ", "ἎΙ"}, + 0x1f87: {"ᾇ", "ᾏ", "ἏΙ"}, + 0x1f88: {"ᾀ", "ᾈ", "ἈΙ"}, + 0x1f89: {"ᾁ", "ᾉ", "ἉΙ"}, + 0x1f8a: {"ᾂ", "ᾊ", "ἊΙ"}, + 0x1f8b: {"ᾃ", "ᾋ", "ἋΙ"}, + 0x1f8c: {"ᾄ", "ᾌ", "ἌΙ"}, + 0x1f8d: {"ᾅ", "ᾍ", "ἍΙ"}, + 0x1f8e: {"ᾆ", "ᾎ", "ἎΙ"}, + 0x1f8f: {"ᾇ", "ᾏ", "ἏΙ"}, + 0x1f90: {"ᾐ", "ᾘ", "ἨΙ"}, + 0x1f91: {"ᾑ", "ᾙ", "ἩΙ"}, + 0x1f92: {"ᾒ", "ᾚ", "ἪΙ"}, + 0x1f93: {"ᾓ", "ᾛ", "ἫΙ"}, + 0x1f94: {"ᾔ", "ᾜ", "ἬΙ"}, + 0x1f95: {"ᾕ", "ᾝ", "ἭΙ"}, + 0x1f96: {"ᾖ", "ᾞ", "ἮΙ"}, + 0x1f97: {"ᾗ", "ᾟ", "ἯΙ"}, + 0x1f98: {"ᾐ", "ᾘ", "ἨΙ"}, + 0x1f99: {"ᾑ", "ᾙ", "ἩΙ"}, + 0x1f9a: {"ᾒ", "ᾚ", "ἪΙ"}, + 0x1f9b: {"ᾓ", "ᾛ", "ἫΙ"}, + 0x1f9c: {"ᾔ", "ᾜ", "ἬΙ"}, + 0x1f9d: {"ᾕ", "ᾝ", "ἭΙ"}, + 0x1f9e: {"ᾖ", "ᾞ", "ἮΙ"}, + 0x1f9f: {"ᾗ", "ᾟ", "ἯΙ"}, + 0x1fa0: {"ᾠ", "ᾨ", "ὨΙ"}, + 0x1fa1: {"ᾡ", "ᾩ", "ὩΙ"}, + 0x1fa2: {"ᾢ", "ᾪ", "ὪΙ"}, + 0x1fa3: {"ᾣ", "ᾫ", "ὫΙ"}, + 0x1fa4: {"ᾤ", "ᾬ", "ὬΙ"}, + 0x1fa5: {"ᾥ", "ᾭ", "ὭΙ"}, + 0x1fa6: {"ᾦ", "ᾮ", "ὮΙ"}, + 0x1fa7: {"ᾧ", "ᾯ", "ὯΙ"}, + 0x1fa8: {"ᾠ", "ᾨ", "ὨΙ"}, + 0x1fa9: {"ᾡ", "ᾩ", "ὩΙ"}, + 0x1faa: {"ᾢ", "ᾪ", "ὪΙ"}, + 0x1fab: {"ᾣ", "ᾫ", "ὫΙ"}, + 0x1fac: {"ᾤ", "ᾬ", "ὬΙ"}, + 0x1fad: {"ᾥ", "ᾭ", "ὭΙ"}, + 0x1fae: {"ᾦ", "ᾮ", "ὮΙ"}, + 0x1faf: {"ᾧ", "ᾯ", "ὯΙ"}, + 0x1fb3: {"ᾳ", "ᾼ", "ΑΙ"}, + 0x1fbc: {"ᾳ", "ᾼ", "ΑΙ"}, + 0x1fc3: {"ῃ", "ῌ", "ΗΙ"}, + 0x1fcc: {"ῃ", "ῌ", "ΗΙ"}, + 0x1ff3: {"ῳ", "ῼ", "ΩΙ"}, + 0x1ffc: {"ῳ", "ῼ", "ΩΙ"}, + 0x1fb2: {"ᾲ", "Ὰͅ", "ᾺΙ"}, + 0x1fb4: {"ᾴ", "Άͅ", "ΆΙ"}, + 0x1fc2: {"ῂ", "Ὴͅ", "ῊΙ"}, + 0x1fc4: {"ῄ", "Ήͅ", "ΉΙ"}, + 0x1ff2: {"ῲ", "Ὼͅ", "ῺΙ"}, + 0x1ff4: {"ῴ", "Ώͅ", "ΏΙ"}, + 0x1fb7: {"ᾷ", "ᾼ͂", "Α͂Ι"}, + 0x1fc7: {"ῇ", "ῌ͂", "Η͂Ι"}, + 0x1ff7: {"ῷ", "ῼ͂", "Ω͂Ι"}, + } + + foldMap = map[rune]struct{ simple, full, special string }{ + 0x0049: {"", "", "ı"}, + 0x00b5: {"μ", "μ", ""}, + 0x00df: {"", "ss", ""}, + 0x0130: {"", "i̇", "i"}, + 0x0149: {"", "ʼn", ""}, + 0x017f: {"s", "s", ""}, + 0x01f0: {"", "ǰ", ""}, + 0x0345: {"ι", "ι", ""}, + 0x0390: {"", "ΐ", ""}, + 0x03b0: {"", "ΰ", ""}, + 0x03c2: {"σ", "σ", ""}, + 0x03d0: {"β", "β", ""}, + 0x03d1: {"θ", "θ", ""}, + 0x03d5: {"φ", "φ", ""}, + 0x03d6: {"π", "π", ""}, + 0x03f0: {"κ", "κ", ""}, + 0x03f1: {"ρ", "ρ", ""}, + 0x03f5: {"ε", "ε", ""}, + 0x0587: {"", "եւ", ""}, + 0x13f8: {"Ᏸ", "Ᏸ", ""}, + 0x13f9: {"Ᏹ", "Ᏹ", ""}, + 0x13fa: {"Ᏺ", "Ᏺ", ""}, + 0x13fb: {"Ᏻ", "Ᏻ", ""}, + 0x13fc: {"Ᏼ", "Ᏼ", ""}, + 0x13fd: {"Ᏽ", "Ᏽ", ""}, + 0x1e96: {"", "ẖ", ""}, + 0x1e97: {"", "ẗ", ""}, + 0x1e98: {"", "ẘ", ""}, + 0x1e99: {"", "ẙ", ""}, + 0x1e9a: {"", "aʾ", ""}, + 0x1e9b: {"ṡ", "ṡ", ""}, + 0x1e9e: {"", "ss", ""}, + 0x1f50: {"", "ὐ", ""}, + 0x1f52: {"", "ὒ", ""}, + 0x1f54: {"", "ὔ", ""}, + 0x1f56: {"", "ὖ", ""}, + 0x1f80: {"", "ἀι", ""}, + 0x1f81: {"", "ἁι", ""}, + 0x1f82: {"", "ἂι", ""}, + 0x1f83: {"", "ἃι", ""}, + 0x1f84: {"", "ἄι", ""}, + 0x1f85: {"", "ἅι", ""}, + 0x1f86: {"", "ἆι", ""}, + 0x1f87: {"", "ἇι", ""}, + 0x1f88: {"", "ἀι", ""}, + 0x1f89: {"", "ἁι", ""}, + 0x1f8a: {"", "ἂι", ""}, + 0x1f8b: {"", "ἃι", ""}, + 0x1f8c: {"", "ἄι", ""}, + 0x1f8d: {"", "ἅι", ""}, + 0x1f8e: {"", "ἆι", ""}, + 0x1f8f: {"", "ἇι", ""}, + 0x1f90: {"", "ἠι", ""}, + 0x1f91: {"", "ἡι", ""}, + 0x1f92: {"", "ἢι", ""}, + 0x1f93: {"", "ἣι", ""}, + 0x1f94: {"", "ἤι", ""}, + 0x1f95: {"", "ἥι", ""}, + 0x1f96: {"", "ἦι", ""}, + 0x1f97: {"", "ἧι", ""}, + 0x1f98: {"", "ἠι", ""}, + 0x1f99: {"", "ἡι", ""}, + 0x1f9a: {"", "ἢι", ""}, + 0x1f9b: {"", "ἣι", ""}, + 0x1f9c: {"", "ἤι", ""}, + 0x1f9d: {"", "ἥι", ""}, + 0x1f9e: {"", "ἦι", ""}, + 0x1f9f: {"", "ἧι", ""}, + 0x1fa0: {"", "ὠι", ""}, + 0x1fa1: {"", "ὡι", ""}, + 0x1fa2: {"", "ὢι", ""}, + 0x1fa3: {"", "ὣι", ""}, + 0x1fa4: {"", "ὤι", ""}, + 0x1fa5: {"", "ὥι", ""}, + 0x1fa6: {"", "ὦι", ""}, + 0x1fa7: {"", "ὧι", ""}, + 0x1fa8: {"", "ὠι", ""}, + 0x1fa9: {"", "ὡι", ""}, + 0x1faa: {"", "ὢι", ""}, + 0x1fab: {"", "ὣι", ""}, + 0x1fac: {"", "ὤι", ""}, + 0x1fad: {"", "ὥι", ""}, + 0x1fae: {"", "ὦι", ""}, + 0x1faf: {"", "ὧι", ""}, + 0x1fb2: {"", "ὰι", ""}, + 0x1fb3: {"", "αι", ""}, + 0x1fb4: {"", "άι", ""}, + 0x1fb6: {"", "ᾶ", ""}, + 0x1fb7: {"", "ᾶι", ""}, + 0x1fbc: {"", "αι", ""}, + 0x1fbe: {"ι", "ι", ""}, + 0x1fc2: {"", "ὴι", ""}, + 0x1fc3: {"", "ηι", ""}, + 0x1fc4: {"", "ήι", ""}, + 0x1fc6: {"", "ῆ", ""}, + 0x1fc7: {"", "ῆι", ""}, + 0x1fcc: {"", "ηι", ""}, + 0x1fd2: {"", "ῒ", ""}, + 0x1fd3: {"", "ΐ", ""}, + 0x1fd6: {"", "ῖ", ""}, + 0x1fd7: {"", "ῗ", ""}, + 0x1fe2: {"", "ῢ", ""}, + 0x1fe3: {"", "ΰ", ""}, + 0x1fe4: {"", "ῤ", ""}, + 0x1fe6: {"", "ῦ", ""}, + 0x1fe7: {"", "ῧ", ""}, + 0x1ff2: {"", "ὼι", ""}, + 0x1ff3: {"", "ωι", ""}, + 0x1ff4: {"", "ώι", ""}, + 0x1ff6: {"", "ῶ", ""}, + 0x1ff7: {"", "ῶι", ""}, + 0x1ffc: {"", "ωι", ""}, + 0xab70: {"Ꭰ", "Ꭰ", ""}, + 0xab71: {"Ꭱ", "Ꭱ", ""}, + 0xab72: {"Ꭲ", "Ꭲ", ""}, + 0xab73: {"Ꭳ", "Ꭳ", ""}, + 0xab74: {"Ꭴ", "Ꭴ", ""}, + 0xab75: {"Ꭵ", "Ꭵ", ""}, + 0xab76: {"Ꭶ", "Ꭶ", ""}, + 0xab77: {"Ꭷ", "Ꭷ", ""}, + 0xab78: {"Ꭸ", "Ꭸ", ""}, + 0xab79: {"Ꭹ", "Ꭹ", ""}, + 0xab7a: {"Ꭺ", "Ꭺ", ""}, + 0xab7b: {"Ꭻ", "Ꭻ", ""}, + 0xab7c: {"Ꭼ", "Ꭼ", ""}, + 0xab7d: {"Ꭽ", "Ꭽ", ""}, + 0xab7e: {"Ꭾ", "Ꭾ", ""}, + 0xab7f: {"Ꭿ", "Ꭿ", ""}, + 0xab80: {"Ꮀ", "Ꮀ", ""}, + 0xab81: {"Ꮁ", "Ꮁ", ""}, + 0xab82: {"Ꮂ", "Ꮂ", ""}, + 0xab83: {"Ꮃ", "Ꮃ", ""}, + 0xab84: {"Ꮄ", "Ꮄ", ""}, + 0xab85: {"Ꮅ", "Ꮅ", ""}, + 0xab86: {"Ꮆ", "Ꮆ", ""}, + 0xab87: {"Ꮇ", "Ꮇ", ""}, + 0xab88: {"Ꮈ", "Ꮈ", ""}, + 0xab89: {"Ꮉ", "Ꮉ", ""}, + 0xab8a: {"Ꮊ", "Ꮊ", ""}, + 0xab8b: {"Ꮋ", "Ꮋ", ""}, + 0xab8c: {"Ꮌ", "Ꮌ", ""}, + 0xab8d: {"Ꮍ", "Ꮍ", ""}, + 0xab8e: {"Ꮎ", "Ꮎ", ""}, + 0xab8f: {"Ꮏ", "Ꮏ", ""}, + 0xab90: {"Ꮐ", "Ꮐ", ""}, + 0xab91: {"Ꮑ", "Ꮑ", ""}, + 0xab92: {"Ꮒ", "Ꮒ", ""}, + 0xab93: {"Ꮓ", "Ꮓ", ""}, + 0xab94: {"Ꮔ", "Ꮔ", ""}, + 0xab95: {"Ꮕ", "Ꮕ", ""}, + 0xab96: {"Ꮖ", "Ꮖ", ""}, + 0xab97: {"Ꮗ", "Ꮗ", ""}, + 0xab98: {"Ꮘ", "Ꮘ", ""}, + 0xab99: {"Ꮙ", "Ꮙ", ""}, + 0xab9a: {"Ꮚ", "Ꮚ", ""}, + 0xab9b: {"Ꮛ", "Ꮛ", ""}, + 0xab9c: {"Ꮜ", "Ꮜ", ""}, + 0xab9d: {"Ꮝ", "Ꮝ", ""}, + 0xab9e: {"Ꮞ", "Ꮞ", ""}, + 0xab9f: {"Ꮟ", "Ꮟ", ""}, + 0xaba0: {"Ꮠ", "Ꮠ", ""}, + 0xaba1: {"Ꮡ", "Ꮡ", ""}, + 0xaba2: {"Ꮢ", "Ꮢ", ""}, + 0xaba3: {"Ꮣ", "Ꮣ", ""}, + 0xaba4: {"Ꮤ", "Ꮤ", ""}, + 0xaba5: {"Ꮥ", "Ꮥ", ""}, + 0xaba6: {"Ꮦ", "Ꮦ", ""}, + 0xaba7: {"Ꮧ", "Ꮧ", ""}, + 0xaba8: {"Ꮨ", "Ꮨ", ""}, + 0xaba9: {"Ꮩ", "Ꮩ", ""}, + 0xabaa: {"Ꮪ", "Ꮪ", ""}, + 0xabab: {"Ꮫ", "Ꮫ", ""}, + 0xabac: {"Ꮬ", "Ꮬ", ""}, + 0xabad: {"Ꮭ", "Ꮭ", ""}, + 0xabae: {"Ꮮ", "Ꮮ", ""}, + 0xabaf: {"Ꮯ", "Ꮯ", ""}, + 0xabb0: {"Ꮰ", "Ꮰ", ""}, + 0xabb1: {"Ꮱ", "Ꮱ", ""}, + 0xabb2: {"Ꮲ", "Ꮲ", ""}, + 0xabb3: {"Ꮳ", "Ꮳ", ""}, + 0xabb4: {"Ꮴ", "Ꮴ", ""}, + 0xabb5: {"Ꮵ", "Ꮵ", ""}, + 0xabb6: {"Ꮶ", "Ꮶ", ""}, + 0xabb7: {"Ꮷ", "Ꮷ", ""}, + 0xabb8: {"Ꮸ", "Ꮸ", ""}, + 0xabb9: {"Ꮹ", "Ꮹ", ""}, + 0xabba: {"Ꮺ", "Ꮺ", ""}, + 0xabbb: {"Ꮻ", "Ꮻ", ""}, + 0xabbc: {"Ꮼ", "Ꮼ", ""}, + 0xabbd: {"Ꮽ", "Ꮽ", ""}, + 0xabbe: {"Ꮾ", "Ꮾ", ""}, + 0xabbf: {"Ꮿ", "Ꮿ", ""}, + 0xfb00: {"", "ff", ""}, + 0xfb01: {"", "fi", ""}, + 0xfb02: {"", "fl", ""}, + 0xfb03: {"", "ffi", ""}, + 0xfb04: {"", "ffl", ""}, + 0xfb05: {"", "st", ""}, + 0xfb06: {"", "st", ""}, + 0xfb13: {"", "մն", ""}, + 0xfb14: {"", "մե", ""}, + 0xfb15: {"", "մի", ""}, + 0xfb16: {"", "վն", ""}, + 0xfb17: {"", "մխ", ""}, + } + + breakProp = []struct{ lo, hi rune }{ + {0x0, 0x26}, + {0x28, 0x2d}, + {0x2f, 0x2f}, + {0x3b, 0x40}, + {0x5b, 0x5e}, + {0x60, 0x60}, + {0x7b, 0xa9}, + {0xab, 0xac}, + {0xae, 0xb4}, + {0xb6, 0xb6}, + {0xb8, 0xb9}, + {0xbb, 0xbf}, + {0xd7, 0xd7}, + {0xf7, 0xf7}, + {0x2c2, 0x2c5}, + {0x2d2, 0x2d6}, + {0x2d8, 0x2df}, + {0x2e5, 0x2eb}, + {0x2ed, 0x2ed}, + {0x2ef, 0x2ff}, + {0x375, 0x375}, + {0x378, 0x379}, + {0x37e, 0x37e}, + {0x380, 0x385}, + {0x38b, 0x38b}, + {0x38d, 0x38d}, + {0x3a2, 0x3a2}, + {0x3f6, 0x3f6}, + {0x482, 0x482}, + {0x530, 0x530}, + {0x557, 0x558}, + {0x55a, 0x560}, + {0x588, 0x590}, + {0x5be, 0x5be}, + {0x5c0, 0x5c0}, + {0x5c3, 0x5c3}, + {0x5c6, 0x5c6}, + {0x5c8, 0x5cf}, + {0x5eb, 0x5ef}, + {0x5f5, 0x5ff}, + {0x606, 0x60f}, + {0x61b, 0x61b}, + {0x61d, 0x61f}, + {0x66a, 0x66a}, + {0x66c, 0x66d}, + {0x6d4, 0x6d4}, + {0x6de, 0x6de}, + {0x6e9, 0x6e9}, + {0x6fd, 0x6fe}, + {0x700, 0x70e}, + {0x74b, 0x74c}, + {0x7b2, 0x7bf}, + {0x7f6, 0x7f9}, + {0x7fb, 0x7ff}, + {0x82e, 0x83f}, + {0x85c, 0x89f}, + {0x8b5, 0x8e2}, + {0x964, 0x965}, + {0x970, 0x970}, + {0x984, 0x984}, + {0x98d, 0x98e}, + {0x991, 0x992}, + {0x9a9, 0x9a9}, + {0x9b1, 0x9b1}, + {0x9b3, 0x9b5}, + {0x9ba, 0x9bb}, + {0x9c5, 0x9c6}, + {0x9c9, 0x9ca}, + {0x9cf, 0x9d6}, + {0x9d8, 0x9db}, + {0x9de, 0x9de}, + {0x9e4, 0x9e5}, + {0x9f2, 0xa00}, + {0xa04, 0xa04}, + {0xa0b, 0xa0e}, + {0xa11, 0xa12}, + {0xa29, 0xa29}, + {0xa31, 0xa31}, + {0xa34, 0xa34}, + {0xa37, 0xa37}, + {0xa3a, 0xa3b}, + {0xa3d, 0xa3d}, + {0xa43, 0xa46}, + {0xa49, 0xa4a}, + {0xa4e, 0xa50}, + {0xa52, 0xa58}, + {0xa5d, 0xa5d}, + {0xa5f, 0xa65}, + {0xa76, 0xa80}, + {0xa84, 0xa84}, + {0xa8e, 0xa8e}, + {0xa92, 0xa92}, + {0xaa9, 0xaa9}, + {0xab1, 0xab1}, + {0xab4, 0xab4}, + {0xaba, 0xabb}, + {0xac6, 0xac6}, + {0xaca, 0xaca}, + {0xace, 0xacf}, + {0xad1, 0xadf}, + {0xae4, 0xae5}, + {0xaf0, 0xaf8}, + {0xafa, 0xb00}, + {0xb04, 0xb04}, + {0xb0d, 0xb0e}, + {0xb11, 0xb12}, + {0xb29, 0xb29}, + {0xb31, 0xb31}, + {0xb34, 0xb34}, + {0xb3a, 0xb3b}, + {0xb45, 0xb46}, + {0xb49, 0xb4a}, + {0xb4e, 0xb55}, + {0xb58, 0xb5b}, + {0xb5e, 0xb5e}, + {0xb64, 0xb65}, + {0xb70, 0xb70}, + {0xb72, 0xb81}, + {0xb84, 0xb84}, + {0xb8b, 0xb8d}, + {0xb91, 0xb91}, + {0xb96, 0xb98}, + {0xb9b, 0xb9b}, + {0xb9d, 0xb9d}, + {0xba0, 0xba2}, + {0xba5, 0xba7}, + {0xbab, 0xbad}, + {0xbba, 0xbbd}, + {0xbc3, 0xbc5}, + {0xbc9, 0xbc9}, + {0xbce, 0xbcf}, + {0xbd1, 0xbd6}, + {0xbd8, 0xbe5}, + {0xbf0, 0xbff}, + {0xc04, 0xc04}, + {0xc0d, 0xc0d}, + {0xc11, 0xc11}, + {0xc29, 0xc29}, + {0xc3a, 0xc3c}, + {0xc45, 0xc45}, + {0xc49, 0xc49}, + {0xc4e, 0xc54}, + {0xc57, 0xc57}, + {0xc5b, 0xc5f}, + {0xc64, 0xc65}, + {0xc70, 0xc80}, + {0xc84, 0xc84}, + {0xc8d, 0xc8d}, + {0xc91, 0xc91}, + {0xca9, 0xca9}, + {0xcb4, 0xcb4}, + {0xcba, 0xcbb}, + {0xcc5, 0xcc5}, + {0xcc9, 0xcc9}, + {0xcce, 0xcd4}, + {0xcd7, 0xcdd}, + {0xcdf, 0xcdf}, + {0xce4, 0xce5}, + {0xcf0, 0xcf0}, + {0xcf3, 0xd00}, + {0xd04, 0xd04}, + {0xd0d, 0xd0d}, + {0xd11, 0xd11}, + {0xd3b, 0xd3c}, + {0xd45, 0xd45}, + {0xd49, 0xd49}, + {0xd4f, 0xd56}, + {0xd58, 0xd5e}, + {0xd64, 0xd65}, + {0xd70, 0xd79}, + {0xd80, 0xd81}, + {0xd84, 0xd84}, + {0xd97, 0xd99}, + {0xdb2, 0xdb2}, + {0xdbc, 0xdbc}, + {0xdbe, 0xdbf}, + {0xdc7, 0xdc9}, + {0xdcb, 0xdce}, + {0xdd5, 0xdd5}, + {0xdd7, 0xdd7}, + {0xde0, 0xde5}, + {0xdf0, 0xdf1}, + {0xdf4, 0xe30}, + {0xe32, 0xe33}, + {0xe3b, 0xe46}, + {0xe4f, 0xe4f}, + {0xe5a, 0xeb0}, + {0xeb2, 0xeb3}, + {0xeba, 0xeba}, + {0xebd, 0xec7}, + {0xece, 0xecf}, + {0xeda, 0xeff}, + {0xf01, 0xf17}, + {0xf1a, 0xf1f}, + {0xf2a, 0xf34}, + {0xf36, 0xf36}, + {0xf38, 0xf38}, + {0xf3a, 0xf3d}, + {0xf48, 0xf48}, + {0xf6d, 0xf70}, + {0xf85, 0xf85}, + {0xf98, 0xf98}, + {0xfbd, 0xfc5}, + {0xfc7, 0x102a}, + {0x103f, 0x103f}, + {0x104a, 0x1055}, + {0x105a, 0x105d}, + {0x1061, 0x1061}, + {0x1065, 0x1066}, + {0x106e, 0x1070}, + {0x1075, 0x1081}, + {0x108e, 0x108e}, + {0x109e, 0x109f}, + {0x10c6, 0x10c6}, + {0x10c8, 0x10cc}, + {0x10ce, 0x10cf}, + {0x10fb, 0x10fb}, + {0x1249, 0x1249}, + {0x124e, 0x124f}, + {0x1257, 0x1257}, + {0x1259, 0x1259}, + {0x125e, 0x125f}, + {0x1289, 0x1289}, + {0x128e, 0x128f}, + {0x12b1, 0x12b1}, + {0x12b6, 0x12b7}, + {0x12bf, 0x12bf}, + {0x12c1, 0x12c1}, + {0x12c6, 0x12c7}, + {0x12d7, 0x12d7}, + {0x1311, 0x1311}, + {0x1316, 0x1317}, + {0x135b, 0x135c}, + {0x1360, 0x137f}, + {0x1390, 0x139f}, + {0x13f6, 0x13f7}, + {0x13fe, 0x1400}, + {0x166d, 0x166e}, + {0x1680, 0x1680}, + {0x169b, 0x169f}, + {0x16eb, 0x16ed}, + {0x16f9, 0x16ff}, + {0x170d, 0x170d}, + {0x1715, 0x171f}, + {0x1735, 0x173f}, + {0x1754, 0x175f}, + {0x176d, 0x176d}, + {0x1771, 0x1771}, + {0x1774, 0x17b3}, + {0x17d4, 0x17dc}, + {0x17de, 0x17df}, + {0x17ea, 0x180a}, + {0x180f, 0x180f}, + {0x181a, 0x181f}, + {0x1878, 0x187f}, + {0x18ab, 0x18af}, + {0x18f6, 0x18ff}, + {0x191f, 0x191f}, + {0x192c, 0x192f}, + {0x193c, 0x1945}, + {0x1950, 0x19cf}, + {0x19da, 0x19ff}, + {0x1a1c, 0x1a54}, + {0x1a5f, 0x1a5f}, + {0x1a7d, 0x1a7e}, + {0x1a8a, 0x1a8f}, + {0x1a9a, 0x1aaf}, + {0x1abf, 0x1aff}, + {0x1b4c, 0x1b4f}, + {0x1b5a, 0x1b6a}, + {0x1b74, 0x1b7f}, + {0x1bf4, 0x1bff}, + {0x1c38, 0x1c3f}, + {0x1c4a, 0x1c4c}, + {0x1c7e, 0x1ccf}, + {0x1cd3, 0x1cd3}, + {0x1cf7, 0x1cf7}, + {0x1cfa, 0x1cff}, + {0x1df6, 0x1dfb}, + {0x1f16, 0x1f17}, + {0x1f1e, 0x1f1f}, + {0x1f46, 0x1f47}, + {0x1f4e, 0x1f4f}, + {0x1f58, 0x1f58}, + {0x1f5a, 0x1f5a}, + {0x1f5c, 0x1f5c}, + {0x1f5e, 0x1f5e}, + {0x1f7e, 0x1f7f}, + {0x1fb5, 0x1fb5}, + {0x1fbd, 0x1fbd}, + {0x1fbf, 0x1fc1}, + {0x1fc5, 0x1fc5}, + {0x1fcd, 0x1fcf}, + {0x1fd4, 0x1fd5}, + {0x1fdc, 0x1fdf}, + {0x1fed, 0x1ff1}, + {0x1ff5, 0x1ff5}, + {0x1ffd, 0x200b}, + {0x2010, 0x2017}, + {0x201a, 0x2023}, + {0x2025, 0x2026}, + {0x2028, 0x2029}, + {0x202f, 0x203e}, + {0x2041, 0x2053}, + {0x2055, 0x205f}, + {0x2065, 0x2065}, + {0x2070, 0x2070}, + {0x2072, 0x207e}, + {0x2080, 0x208f}, + {0x209d, 0x20cf}, + {0x20f1, 0x2101}, + {0x2103, 0x2106}, + {0x2108, 0x2109}, + {0x2114, 0x2114}, + {0x2116, 0x2118}, + {0x211e, 0x2123}, + {0x2125, 0x2125}, + {0x2127, 0x2127}, + {0x2129, 0x2129}, + {0x212e, 0x212e}, + {0x213a, 0x213b}, + {0x2140, 0x2144}, + {0x214a, 0x214d}, + {0x214f, 0x215f}, + {0x2189, 0x24b5}, + {0x24ea, 0x2bff}, + {0x2c2f, 0x2c2f}, + {0x2c5f, 0x2c5f}, + {0x2ce5, 0x2cea}, + {0x2cf4, 0x2cff}, + {0x2d26, 0x2d26}, + {0x2d28, 0x2d2c}, + {0x2d2e, 0x2d2f}, + {0x2d68, 0x2d6e}, + {0x2d70, 0x2d7e}, + {0x2d97, 0x2d9f}, + {0x2da7, 0x2da7}, + {0x2daf, 0x2daf}, + {0x2db7, 0x2db7}, + {0x2dbf, 0x2dbf}, + {0x2dc7, 0x2dc7}, + {0x2dcf, 0x2dcf}, + {0x2dd7, 0x2dd7}, + {0x2ddf, 0x2ddf}, + {0x2e00, 0x2e2e}, + {0x2e30, 0x3004}, + {0x3006, 0x3029}, + {0x3030, 0x303a}, + {0x303d, 0x3098}, + {0x309b, 0x3104}, + {0x312e, 0x3130}, + {0x318f, 0x319f}, + {0x31bb, 0x9fff}, + {0xa48d, 0xa4cf}, + {0xa4fe, 0xa4ff}, + {0xa60d, 0xa60f}, + {0xa62c, 0xa63f}, + {0xa673, 0xa673}, + {0xa67e, 0xa67e}, + {0xa6f2, 0xa716}, + {0xa720, 0xa721}, + {0xa789, 0xa78a}, + {0xa7ae, 0xa7af}, + {0xa7b8, 0xa7f6}, + {0xa828, 0xa83f}, + {0xa874, 0xa87f}, + {0xa8c5, 0xa8cf}, + {0xa8da, 0xa8df}, + {0xa8f8, 0xa8fa}, + {0xa8fc, 0xa8fc}, + {0xa8fe, 0xa8ff}, + {0xa92e, 0xa92f}, + {0xa954, 0xa95f}, + {0xa97d, 0xa97f}, + {0xa9c1, 0xa9ce}, + {0xa9da, 0xa9e4}, + {0xa9e6, 0xa9ef}, + {0xa9fa, 0xa9ff}, + {0xaa37, 0xaa3f}, + {0xaa4e, 0xaa4f}, + {0xaa5a, 0xaa7a}, + {0xaa7e, 0xaaaf}, + {0xaab1, 0xaab1}, + {0xaab5, 0xaab6}, + {0xaab9, 0xaabd}, + {0xaac0, 0xaac0}, + {0xaac2, 0xaadf}, + {0xaaf0, 0xaaf1}, + {0xaaf7, 0xab00}, + {0xab07, 0xab08}, + {0xab0f, 0xab10}, + {0xab17, 0xab1f}, + {0xab27, 0xab27}, + {0xab2f, 0xab2f}, + {0xab5b, 0xab5b}, + {0xab66, 0xab6f}, + {0xabeb, 0xabeb}, + {0xabee, 0xabef}, + {0xabfa, 0xabff}, + {0xd7a4, 0xd7af}, + {0xd7c7, 0xd7ca}, + {0xd7fc, 0xfaff}, + {0xfb07, 0xfb12}, + {0xfb18, 0xfb1c}, + {0xfb29, 0xfb29}, + {0xfb37, 0xfb37}, + {0xfb3d, 0xfb3d}, + {0xfb3f, 0xfb3f}, + {0xfb42, 0xfb42}, + {0xfb45, 0xfb45}, + {0xfbb2, 0xfbd2}, + {0xfd3e, 0xfd4f}, + {0xfd90, 0xfd91}, + {0xfdc8, 0xfdef}, + {0xfdfc, 0xfdff}, + {0xfe10, 0xfe12}, + {0xfe14, 0xfe1f}, + {0xfe30, 0xfe32}, + {0xfe35, 0xfe4c}, + {0xfe50, 0xfe51}, + {0xfe53, 0xfe54}, + {0xfe56, 0xfe6f}, + {0xfe75, 0xfe75}, + {0xfefd, 0xfefe}, + {0xff00, 0xff06}, + {0xff08, 0xff0d}, + {0xff0f, 0xff19}, + {0xff1b, 0xff20}, + {0xff3b, 0xff3e}, + {0xff40, 0xff40}, + {0xff5b, 0xff9d}, + {0xffbf, 0xffc1}, + {0xffc8, 0xffc9}, + {0xffd0, 0xffd1}, + {0xffd8, 0xffd9}, + {0xffdd, 0xfff8}, + {0xfffc, 0xffff}, + {0x1000c, 0x1000c}, + {0x10027, 0x10027}, + {0x1003b, 0x1003b}, + {0x1003e, 0x1003e}, + {0x1004e, 0x1004f}, + {0x1005e, 0x1007f}, + {0x100fb, 0x1013f}, + {0x10175, 0x101fc}, + {0x101fe, 0x1027f}, + {0x1029d, 0x1029f}, + {0x102d1, 0x102df}, + {0x102e1, 0x102ff}, + {0x10320, 0x1032f}, + {0x1034b, 0x1034f}, + {0x1037b, 0x1037f}, + {0x1039e, 0x1039f}, + {0x103c4, 0x103c7}, + {0x103d0, 0x103d0}, + {0x103d6, 0x103ff}, + {0x1049e, 0x1049f}, + {0x104aa, 0x104ff}, + {0x10528, 0x1052f}, + {0x10564, 0x105ff}, + {0x10737, 0x1073f}, + {0x10756, 0x1075f}, + {0x10768, 0x107ff}, + {0x10806, 0x10807}, + {0x10809, 0x10809}, + {0x10836, 0x10836}, + {0x10839, 0x1083b}, + {0x1083d, 0x1083e}, + {0x10856, 0x1085f}, + {0x10877, 0x1087f}, + {0x1089f, 0x108df}, + {0x108f3, 0x108f3}, + {0x108f6, 0x108ff}, + {0x10916, 0x1091f}, + {0x1093a, 0x1097f}, + {0x109b8, 0x109bd}, + {0x109c0, 0x109ff}, + {0x10a04, 0x10a04}, + {0x10a07, 0x10a0b}, + {0x10a14, 0x10a14}, + {0x10a18, 0x10a18}, + {0x10a34, 0x10a37}, + {0x10a3b, 0x10a3e}, + {0x10a40, 0x10a5f}, + {0x10a7d, 0x10a7f}, + {0x10a9d, 0x10abf}, + {0x10ac8, 0x10ac8}, + {0x10ae7, 0x10aff}, + {0x10b36, 0x10b3f}, + {0x10b56, 0x10b5f}, + {0x10b73, 0x10b7f}, + {0x10b92, 0x10bff}, + {0x10c49, 0x10c7f}, + {0x10cb3, 0x10cbf}, + {0x10cf3, 0x10fff}, + {0x11047, 0x11065}, + {0x11070, 0x1107e}, + {0x110bb, 0x110bc}, + {0x110be, 0x110cf}, + {0x110e9, 0x110ef}, + {0x110fa, 0x110ff}, + {0x11135, 0x11135}, + {0x11140, 0x1114f}, + {0x11174, 0x11175}, + {0x11177, 0x1117f}, + {0x111c5, 0x111c9}, + {0x111cd, 0x111cf}, + {0x111db, 0x111db}, + {0x111dd, 0x111ff}, + {0x11212, 0x11212}, + {0x11238, 0x1127f}, + {0x11287, 0x11287}, + {0x11289, 0x11289}, + {0x1128e, 0x1128e}, + {0x1129e, 0x1129e}, + {0x112a9, 0x112af}, + {0x112eb, 0x112ef}, + {0x112fa, 0x112ff}, + {0x11304, 0x11304}, + {0x1130d, 0x1130e}, + {0x11311, 0x11312}, + {0x11329, 0x11329}, + {0x11331, 0x11331}, + {0x11334, 0x11334}, + {0x1133a, 0x1133b}, + {0x11345, 0x11346}, + {0x11349, 0x1134a}, + {0x1134e, 0x1134f}, + {0x11351, 0x11356}, + {0x11358, 0x1135c}, + {0x11364, 0x11365}, + {0x1136d, 0x1136f}, + {0x11375, 0x1147f}, + {0x114c6, 0x114c6}, + {0x114c8, 0x114cf}, + {0x114da, 0x1157f}, + {0x115b6, 0x115b7}, + {0x115c1, 0x115d7}, + {0x115de, 0x115ff}, + {0x11641, 0x11643}, + {0x11645, 0x1164f}, + {0x1165a, 0x1167f}, + {0x116b8, 0x116bf}, + {0x116ca, 0x1171c}, + {0x1172c, 0x1172f}, + {0x1173a, 0x1189f}, + {0x118ea, 0x118fe}, + {0x11900, 0x11abf}, + {0x11af9, 0x11fff}, + {0x1239a, 0x123ff}, + {0x1246f, 0x1247f}, + {0x12544, 0x12fff}, + {0x1342f, 0x143ff}, + {0x14647, 0x167ff}, + {0x16a39, 0x16a3f}, + {0x16a5f, 0x16a5f}, + {0x16a6a, 0x16acf}, + {0x16aee, 0x16aef}, + {0x16af5, 0x16aff}, + {0x16b37, 0x16b3f}, + {0x16b44, 0x16b4f}, + {0x16b5a, 0x16b62}, + {0x16b78, 0x16b7c}, + {0x16b90, 0x16eff}, + {0x16f45, 0x16f4f}, + {0x16f7f, 0x16f8e}, + {0x16fa0, 0x1bbff}, + {0x1bc6b, 0x1bc6f}, + {0x1bc7d, 0x1bc7f}, + {0x1bc89, 0x1bc8f}, + {0x1bc9a, 0x1bc9c}, + {0x1bc9f, 0x1bc9f}, + {0x1bca4, 0x1d164}, + {0x1d16a, 0x1d16c}, + {0x1d183, 0x1d184}, + {0x1d18c, 0x1d1a9}, + {0x1d1ae, 0x1d241}, + {0x1d245, 0x1d3ff}, + {0x1d455, 0x1d455}, + {0x1d49d, 0x1d49d}, + {0x1d4a0, 0x1d4a1}, + {0x1d4a3, 0x1d4a4}, + {0x1d4a7, 0x1d4a8}, + {0x1d4ad, 0x1d4ad}, + {0x1d4ba, 0x1d4ba}, + {0x1d4bc, 0x1d4bc}, + {0x1d4c4, 0x1d4c4}, + {0x1d506, 0x1d506}, + {0x1d50b, 0x1d50c}, + {0x1d515, 0x1d515}, + {0x1d51d, 0x1d51d}, + {0x1d53a, 0x1d53a}, + {0x1d53f, 0x1d53f}, + {0x1d545, 0x1d545}, + {0x1d547, 0x1d549}, + {0x1d551, 0x1d551}, + {0x1d6a6, 0x1d6a7}, + {0x1d6c1, 0x1d6c1}, + {0x1d6db, 0x1d6db}, + {0x1d6fb, 0x1d6fb}, + {0x1d715, 0x1d715}, + {0x1d735, 0x1d735}, + {0x1d74f, 0x1d74f}, + {0x1d76f, 0x1d76f}, + {0x1d789, 0x1d789}, + {0x1d7a9, 0x1d7a9}, + {0x1d7c3, 0x1d7c3}, + {0x1d7cc, 0x1d7cd}, + {0x1d800, 0x1d9ff}, + {0x1da37, 0x1da3a}, + {0x1da6d, 0x1da74}, + {0x1da76, 0x1da83}, + {0x1da85, 0x1da9a}, + {0x1daa0, 0x1daa0}, + {0x1dab0, 0x1e7ff}, + {0x1e8c5, 0x1e8cf}, + {0x1e8d7, 0x1edff}, + {0x1ee04, 0x1ee04}, + {0x1ee20, 0x1ee20}, + {0x1ee23, 0x1ee23}, + {0x1ee25, 0x1ee26}, + {0x1ee28, 0x1ee28}, + {0x1ee33, 0x1ee33}, + {0x1ee38, 0x1ee38}, + {0x1ee3a, 0x1ee3a}, + {0x1ee3c, 0x1ee41}, + {0x1ee43, 0x1ee46}, + {0x1ee48, 0x1ee48}, + {0x1ee4a, 0x1ee4a}, + {0x1ee4c, 0x1ee4c}, + {0x1ee50, 0x1ee50}, + {0x1ee53, 0x1ee53}, + {0x1ee55, 0x1ee56}, + {0x1ee58, 0x1ee58}, + {0x1ee5a, 0x1ee5a}, + {0x1ee5c, 0x1ee5c}, + {0x1ee5e, 0x1ee5e}, + {0x1ee60, 0x1ee60}, + {0x1ee63, 0x1ee63}, + {0x1ee65, 0x1ee66}, + {0x1ee6b, 0x1ee6b}, + {0x1ee73, 0x1ee73}, + {0x1ee78, 0x1ee78}, + {0x1ee7d, 0x1ee7d}, + {0x1ee7f, 0x1ee7f}, + {0x1ee8a, 0x1ee8a}, + {0x1ee9c, 0x1eea0}, + {0x1eea4, 0x1eea4}, + {0x1eeaa, 0x1eeaa}, + {0x1eebc, 0x1f12f}, + {0x1f14a, 0x1f14f}, + {0x1f16a, 0x1f16f}, + {0x1f18a, 0x1ffff}, + } + + breakTest = []string{ + "AA", + "ÄA", + "Aa\u2060", + "Äa\u2060", + "Aa|:", + "Äa|:", + "Aa|'", + "Äa|'", + "Aa|'\u2060", + "Äa|'\u2060", + "Aa|,", + "Äa|,", + "a\u2060A", + "a\u2060̈A", + "a\u2060a\u2060", + "a\u2060̈a\u2060", + "a\u2060a|:", + "a\u2060̈a|:", + "a\u2060a|'", + "a\u2060̈a|'", + "a\u2060a|'\u2060", + "a\u2060̈a|'\u2060", + "a\u2060a|,", + "a\u2060̈a|,", + "a:A", + "a:̈A", + "a:a\u2060", + "a:̈a\u2060", + "a:a|:", + "a:̈a|:", + "a:a|'", + "a:̈a|'", + "a:a|'\u2060", + "a:̈a|'\u2060", + "a:a|,", + "a:̈a|,", + "a'A", + "a'̈A", + "a'a\u2060", + "a'̈a\u2060", + "a'a|:", + "a'̈a|:", + "a'a|'", + "a'̈a|'", + "a'a|'\u2060", + "a'̈a|'\u2060", + "a'a|,", + "a'̈a|,", + "a'\u2060A", + "a'\u2060̈A", + "a'\u2060a\u2060", + "a'\u2060̈a\u2060", + "a'\u2060a|:", + "a'\u2060̈a|:", + "a'\u2060a|'", + "a'\u2060̈a|'", + "a'\u2060a|'\u2060", + "a'\u2060̈a|'\u2060", + "a'\u2060a|,", + "a'\u2060̈a|,", + "a|,|A", + "a|,̈|A", + "a|,|a\u2060", + "a|,̈|a\u2060", + "a|,|a|:", + "a|,̈|a|:", + "a|,|a|'", + "a|,̈|a|'", + "a|,|a|'\u2060", + "a|,̈|a|'\u2060", + "a|,|a|,", + "a|,̈|a|,", + "can't", + "can’t", + "ab\u00adby", + "a|$|-|34,567.14|%|b", + "c.d", + "C.d", + "c.D", + "C.D", + "\u2060|c\u2060a\u2060n\u2060'\u2060t\u2060\u2060", + "\u2060|c\u2060a\u2060n\u2060’\u2060t\u2060\u2060", + "\u2060|a\u2060b\u2060\u00ad\u2060b\u2060y\u2060\u2060", + "\u2060|a\u2060|$\u2060|-\u2060|3\u20604\u2060,\u20605\u20606\u20607\u2060.\u20601\u20604\u2060|%\u2060|b\u2060\u2060", + "\u2060|c\u2060.\u2060d\u2060\u2060", + "\u2060|C\u2060.\u2060d\u2060\u2060", + "\u2060|c\u2060.\u2060D\u2060\u2060", + "\u2060|C\u2060.\u2060D\u2060\u2060", + "a|🇦|b", + "1_a|:|:|a", + "1_a|:|.|a", + "1_a|:|,|a", + "1_a|.|:|a", + "1_a|.|.|a", + "1_a|.|,|a", + "1_a|,|:|a", + "1_a|,|.|a", + "1_a|,|,|a", + "a_a|:|:|1", + "a|:|:|a", + "a_1|:|:|a", + "a_a|:|:|a", + "a_a|:|.|1", + "a|:|.|a", + "a_1|:|.|a", + "a_a|:|.|a", + "a_a|:|,|1", + "a|:|,|a", + "a_1|:|,|a", + "a_a|:|,|a", + "a_a|.|:|1", + "a|.|:|a", + "a_1|.|:|a", + "a_a|.|:|a", + "a_a|.|.|1", + "a|.|.|a", + "a_1|.|.|a", + "a_a|.|.|a", + "a_a|.|,|1", + "a|.|,|a", + "a_1|.|,|a", + "a_a|.|,|a", + "a_a|,|:|1", + "a|,|:|a", + "a_1|,|:|a", + "a_a|,|:|a", + "a_a|,|.|1", + "a|,|.|a", + "a_1|,|.|a", + "a_a|,|.|a", + "a_a|,|,|1", + "a|,|,|a", + "a_1|,|,|a", + "a_a|,|,|a", + } +) diff --git a/vendor/golang.org/x/text/cases/trieval.go b/vendor/golang.org/x/text/cases/trieval.go new file mode 100644 index 0000000000..7f2aa5b01b --- /dev/null +++ b/vendor/golang.org/x/text/cases/trieval.go @@ -0,0 +1,213 @@ +// This file was generated by go generate; DO NOT EDIT + +package cases + +// This file contains definitions for interpreting the trie value of the case +// trie generated by "go run gen*.go". It is shared by both the generator +// program and the resultant package. Sharing is achieved by the generator +// copying gen_trieval.go to trieval.go and changing what's above this comment. + +// info holds case information for a single rune. It is the value returned +// by a trie lookup. Most mapping information can be stored in a single 16-bit +// value. If not, for example when a rune is mapped to multiple runes, the value +// stores some basic case data and an index into an array with additional data. +// +// The per-rune values have the following format: +// +// if (exception) { +// 15..5 unsigned exception index +// 4 unused +// } else { +// 15..8 XOR pattern or index to XOR pattern for case mapping +// Only 13..8 are used for XOR patterns. +// 7 inverseFold (fold to upper, not to lower) +// 6 index: interpret the XOR pattern as an index +// 5..4 CCC: zero (normal or break), above or other +// } +// 3 exception: interpret this value as an exception index +// (TODO: is this bit necessary? Probably implied from case mode.) +// 2..0 case mode +// +// For the non-exceptional cases, a rune must be either uncased, lowercase or +// uppercase. If the rune is cased, the XOR pattern maps either a lowercase +// rune to uppercase or an uppercase rune to lowercase (applied to the 10 +// least-significant bits of the rune). +// +// See the definitions below for a more detailed description of the various +// bits. +type info uint16 + +const ( + casedMask = 0x0003 + fullCasedMask = 0x0007 + ignorableMask = 0x0006 + ignorableValue = 0x0004 + + inverseFoldBit = 1 << 7 + + exceptionBit = 1 << 3 + exceptionShift = 5 + numExceptionBits = 11 + + xorIndexBit = 1 << 6 + xorShift = 8 + + // There is no mapping if all xor bits and the exception bit are zero. + hasMappingMask = 0xffc0 | exceptionBit +) + +// The case mode bits encodes the case type of a rune. This includes uncased, +// title, upper and lower case and case ignorable. (For a definition of these +// terms see Chapter 3 of The Unicode Standard Core Specification.) In some rare +// cases, a rune can be both cased and case-ignorable. This is encoded by +// cIgnorableCased. A rune of this type is always lower case. Some runes are +// cased while not having a mapping. +// +// A common pattern for scripts in the Unicode standard is for upper and lower +// case runes to alternate for increasing rune values (e.g. the accented Latin +// ranges starting from U+0100 and U+1E00 among others and some Cyrillic +// characters). We use this property by defining a cXORCase mode, where the case +// mode (always upper or lower case) is derived from the rune value. As the XOR +// pattern for case mappings is often identical for successive runes, using +// cXORCase can result in large series of identical trie values. This, in turn, +// allows us to better compress the trie blocks. +const ( + cUncased info = iota // 000 + cTitle // 001 + cLower // 010 + cUpper // 011 + cIgnorableUncased // 100 + cIgnorableCased // 101 // lower case if mappings exist + cXORCase // 11x // case is cLower | ((rune&1) ^ x) + + maxCaseMode = cUpper +) + +func (c info) isCased() bool { + return c&casedMask != 0 +} + +func (c info) isCaseIgnorable() bool { + return c&ignorableMask == ignorableValue +} + +func (c info) isCaseIgnorableAndNonBreakStarter() bool { + return c&(fullCasedMask|cccMask) == (ignorableValue | cccZero) +} + +func (c info) isNotCasedAndNotCaseIgnorable() bool { + return c&fullCasedMask == 0 +} + +func (c info) isCaseIgnorableAndNotCased() bool { + return c&fullCasedMask == cIgnorableUncased +} + +// The case mapping implementation will need to know about various Canonical +// Combining Class (CCC) values. We encode two of these in the trie value: +// cccZero (0) and cccAbove (230). If the value is cccOther, it means that +// CCC(r) > 0, but not 230. A value of cccBreak means that CCC(r) == 0 and that +// the rune also has the break category Break (see below). +const ( + cccBreak info = iota << 4 + cccZero + cccAbove + cccOther + + cccMask = cccBreak | cccZero | cccAbove | cccOther +) + +const ( + starter = 0 + above = 230 + iotaSubscript = 240 +) + +// The exceptions slice holds data that does not fit in a normal info entry. +// The entry is pointed to by the exception index in an entry. It has the +// following format: +// +// Header +// byte 0: +// 7..6 unused +// 5..4 CCC type (same bits as entry) +// 3 unused +// 2..0 length of fold +// +// byte 1: +// 7..6 unused +// 5..3 length of 1st mapping of case type +// 2..0 length of 2nd mapping of case type +// +// case 1st 2nd +// lower -> upper, title +// upper -> lower, title +// title -> lower, upper +// +// Lengths with the value 0x7 indicate no value and implies no change. +// A length of 0 indicates a mapping to zero-length string. +// +// Body bytes: +// case folding bytes +// lowercase mapping bytes +// uppercase mapping bytes +// titlecase mapping bytes +// closure mapping bytes (for NFKC_Casefold). (TODO) +// +// Fallbacks: +// missing fold -> lower +// missing title -> upper +// all missing -> original rune +// +// exceptions starts with a dummy byte to enforce that there is no zero index +// value. +const ( + lengthMask = 0x07 + lengthBits = 3 + noChange = 0 +) + +// References to generated trie. + +var trie = newCaseTrie(0) + +var sparse = sparseBlocks{ + values: sparseValues[:], + offsets: sparseOffsets[:], +} + +// Sparse block lookup code. + +// valueRange is an entry in a sparse block. +type valueRange struct { + value uint16 + lo, hi byte +} + +type sparseBlocks struct { + values []valueRange + offsets []uint16 +} + +// lookup returns the value from values block n for byte b using binary search. +func (s *sparseBlocks) lookup(n uint32, b byte) uint16 { + lo := s.offsets[n] + hi := s.offsets[n+1] + for lo < hi { + m := lo + (hi-lo)/2 + r := s.values[m] + if r.lo <= b && b <= r.hi { + return r.value + } + if b < r.lo { + hi = m + } else { + lo = m + 1 + } + } + return 0 +} + +// lastRuneForTesting is the last rune used for testing. Everything after this +// is boring. +const lastRuneForTesting = rune(0x1FFFF) diff --git a/vendor/golang.org/x/text/codereview.cfg b/vendor/golang.org/x/text/codereview.cfg new file mode 100644 index 0000000000..3f8b14b64e --- /dev/null +++ b/vendor/golang.org/x/text/codereview.cfg @@ -0,0 +1 @@ +issuerepo: golang/go diff --git a/vendor/golang.org/x/text/collate/build/builder.go b/vendor/golang.org/x/text/collate/build/builder.go new file mode 100644 index 0000000000..54f65f340f --- /dev/null +++ b/vendor/golang.org/x/text/collate/build/builder.go @@ -0,0 +1,699 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package build // import "golang.org/x/text/collate/build" + +import ( + "fmt" + "io" + "log" + "sort" + "strings" + "unicode/utf8" + + "golang.org/x/text/collate/colltab" + "golang.org/x/text/language" + "golang.org/x/text/unicode/norm" +) + +// TODO: optimizations: +// - expandElem is currently 20K. By putting unique colElems in a separate +// table and having a byte array of indexes into this table, we can reduce +// the total size to about 7K. By also factoring out the length bytes, we +// can reduce this to about 6K. +// - trie valueBlocks are currently 100K. There are a lot of sparse blocks +// and many consecutive values with the same stride. This can be further +// compacted. +// - Compress secondary weights into 8 bits. +// - Some LDML specs specify a context element. Currently we simply concatenate +// those. Context can be implemented using the contraction trie. If Builder +// could analyze and detect when using a context makes sense, there is no +// need to expose this construct in the API. + +// A Builder builds a root collation table. The user must specify the +// collation elements for each entry. A common use will be to base the weights +// on those specified in the allkeys* file as provided by the UCA or CLDR. +type Builder struct { + index *trieBuilder + root ordering + locale []*Tailoring + t *table + err error + built bool + + minNonVar int // lowest primary recorded for a variable + varTop int // highest primary recorded for a non-variable + + // indexes used for reusing expansions and contractions + expIndex map[string]int // positions of expansions keyed by their string representation + ctHandle map[string]ctHandle // contraction handles keyed by a concatenation of the suffixes + ctElem map[string]int // contraction elements keyed by their string representation +} + +// A Tailoring builds a collation table based on another collation table. +// The table is defined by specifying tailorings to the underlying table. +// See http://unicode.org/reports/tr35/ for an overview of tailoring +// collation tables. The CLDR contains pre-defined tailorings for a variety +// of languages (See http://www.unicode.org/Public/cldr/<version>/core.zip.) +type Tailoring struct { + id string + builder *Builder + index *ordering + + anchor *entry + before bool +} + +// NewBuilder returns a new Builder. +func NewBuilder() *Builder { + return &Builder{ + index: newTrieBuilder(), + root: makeRootOrdering(), + expIndex: make(map[string]int), + ctHandle: make(map[string]ctHandle), + ctElem: make(map[string]int), + } +} + +// Tailoring returns a Tailoring for the given locale. One should +// have completed all calls to Add before calling Tailoring. +func (b *Builder) Tailoring(loc language.Tag) *Tailoring { + t := &Tailoring{ + id: loc.String(), + builder: b, + index: b.root.clone(), + } + t.index.id = t.id + b.locale = append(b.locale, t) + return t +} + +// Add adds an entry to the collation element table, mapping +// a slice of runes to a sequence of collation elements. +// A collation element is specified as list of weights: []int{primary, secondary, ...}. +// The entries are typically obtained from a collation element table +// as defined in http://www.unicode.org/reports/tr10/#Data_Table_Format. +// Note that the collation elements specified by colelems are only used +// as a guide. The actual weights generated by Builder may differ. +// The argument variables is a list of indices into colelems that should contain +// a value for each colelem that is a variable. (See the reference above.) +func (b *Builder) Add(runes []rune, colelems [][]int, variables []int) error { + str := string(runes) + elems := make([]rawCE, len(colelems)) + for i, ce := range colelems { + if len(ce) == 0 { + break + } + elems[i] = makeRawCE(ce, 0) + if len(ce) == 1 { + elems[i].w[1] = defaultSecondary + } + if len(ce) <= 2 { + elems[i].w[2] = defaultTertiary + } + if len(ce) <= 3 { + elems[i].w[3] = ce[0] + } + } + for i, ce := range elems { + p := ce.w[0] + isvar := false + for _, j := range variables { + if i == j { + isvar = true + } + } + if isvar { + if p >= b.minNonVar && b.minNonVar > 0 { + return fmt.Errorf("primary value %X of variable is larger than the smallest non-variable %X", p, b.minNonVar) + } + if p > b.varTop { + b.varTop = p + } + } else if p > 1 { // 1 is a special primary value reserved for FFFE + if p <= b.varTop { + return fmt.Errorf("primary value %X of non-variable is smaller than the highest variable %X", p, b.varTop) + } + if b.minNonVar == 0 || p < b.minNonVar { + b.minNonVar = p + } + } + } + elems, err := convertLargeWeights(elems) + if err != nil { + return err + } + cccs := []uint8{} + nfd := norm.NFD.String(str) + for i := range nfd { + cccs = append(cccs, norm.NFD.PropertiesString(nfd[i:]).CCC()) + } + if len(cccs) < len(elems) { + if len(cccs) > 2 { + return fmt.Errorf("number of decomposed characters should be greater or equal to the number of collation elements for len(colelems) > 3 (%d < %d)", len(cccs), len(elems)) + } + p := len(elems) - 1 + for ; p > 0 && elems[p].w[0] == 0; p-- { + elems[p].ccc = cccs[len(cccs)-1] + } + for ; p >= 0; p-- { + elems[p].ccc = cccs[0] + } + } else { + for i := range elems { + elems[i].ccc = cccs[i] + } + } + // doNorm in collate.go assumes that the following conditions hold. + if len(elems) > 1 && len(cccs) > 1 && cccs[0] != 0 && cccs[0] != cccs[len(cccs)-1] { + return fmt.Errorf("incompatible CCC values for expansion %X (%d)", runes, cccs) + } + b.root.newEntry(str, elems) + return nil +} + +func (t *Tailoring) setAnchor(anchor string) error { + anchor = norm.NFC.String(anchor) + a := t.index.find(anchor) + if a == nil { + a = t.index.newEntry(anchor, nil) + a.implicit = true + a.modified = true + for _, r := range []rune(anchor) { + e := t.index.find(string(r)) + e.lock = true + } + } + t.anchor = a + return nil +} + +// SetAnchor sets the point after which elements passed in subsequent calls to +// Insert will be inserted. It is equivalent to the reset directive in an LDML +// specification. See Insert for an example. +// SetAnchor supports the following logical reset positions: +// <first_tertiary_ignorable/>, <last_teriary_ignorable/>, <first_primary_ignorable/>, +// and <last_non_ignorable/>. +func (t *Tailoring) SetAnchor(anchor string) error { + if err := t.setAnchor(anchor); err != nil { + return err + } + t.before = false + return nil +} + +// SetAnchorBefore is similar to SetAnchor, except that subsequent calls to +// Insert will insert entries before the anchor. +func (t *Tailoring) SetAnchorBefore(anchor string) error { + if err := t.setAnchor(anchor); err != nil { + return err + } + t.before = true + return nil +} + +// Insert sets the ordering of str relative to the entry set by the previous +// call to SetAnchor or Insert. The argument extend corresponds +// to the extend elements as defined in LDML. A non-empty value for extend +// will cause the collation elements corresponding to extend to be appended +// to the collation elements generated for the entry added by Insert. +// This has the same net effect as sorting str after the string anchor+extend. +// See http://www.unicode.org/reports/tr10/#Tailoring_Example for details +// on parametric tailoring and http://unicode.org/reports/tr35/#Collation_Elements +// for full details on LDML. +// +// Examples: create a tailoring for Swedish, where "ä" is ordered after "z" +// at the primary sorting level: +// t := b.Tailoring("se") +// t.SetAnchor("z") +// t.Insert(colltab.Primary, "ä", "") +// Order "ü" after "ue" at the secondary sorting level: +// t.SetAnchor("ue") +// t.Insert(colltab.Secondary, "ü","") +// or +// t.SetAnchor("u") +// t.Insert(colltab.Secondary, "ü", "e") +// Order "q" afer "ab" at the secondary level and "Q" after "q" +// at the tertiary level: +// t.SetAnchor("ab") +// t.Insert(colltab.Secondary, "q", "") +// t.Insert(colltab.Tertiary, "Q", "") +// Order "b" before "a": +// t.SetAnchorBefore("a") +// t.Insert(colltab.Primary, "b", "") +// Order "0" after the last primary ignorable: +// t.SetAnchor("<last_primary_ignorable/>") +// t.Insert(colltab.Primary, "0", "") +func (t *Tailoring) Insert(level colltab.Level, str, extend string) error { + if t.anchor == nil { + return fmt.Errorf("%s:Insert: no anchor point set for tailoring of %s", t.id, str) + } + str = norm.NFC.String(str) + e := t.index.find(str) + if e == nil { + e = t.index.newEntry(str, nil) + } else if e.logical != noAnchor { + return fmt.Errorf("%s:Insert: cannot reinsert logical reset position %q", t.id, e.str) + } + if e.lock { + return fmt.Errorf("%s:Insert: cannot reinsert element %q", t.id, e.str) + } + a := t.anchor + // Find the first element after the anchor which differs at a level smaller or + // equal to the given level. Then insert at this position. + // See http://unicode.org/reports/tr35/#Collation_Elements, Section 5.14.5 for details. + e.before = t.before + if t.before { + t.before = false + if a.prev == nil { + a.insertBefore(e) + } else { + for a = a.prev; a.level > level; a = a.prev { + } + a.insertAfter(e) + } + e.level = level + } else { + for ; a.level > level; a = a.next { + } + e.level = a.level + if a != e { + a.insertAfter(e) + a.level = level + } else { + // We don't set a to prev itself. This has the effect of the entry + // getting new collation elements that are an increment of itself. + // This is intentional. + a.prev.level = level + } + } + e.extend = norm.NFD.String(extend) + e.exclude = false + e.modified = true + e.elems = nil + t.anchor = e + return nil +} + +func (o *ordering) getWeight(e *entry) []rawCE { + if len(e.elems) == 0 && e.logical == noAnchor { + if e.implicit { + for _, r := range e.runes { + e.elems = append(e.elems, o.getWeight(o.find(string(r)))...) + } + } else if e.before { + count := [colltab.Identity + 1]int{} + a := e + for ; a.elems == nil && !a.implicit; a = a.next { + count[a.level]++ + } + e.elems = []rawCE{makeRawCE(a.elems[0].w, a.elems[0].ccc)} + for i := colltab.Primary; i < colltab.Quaternary; i++ { + if count[i] != 0 { + e.elems[0].w[i] -= count[i] + break + } + } + if e.prev != nil { + o.verifyWeights(e.prev, e, e.prev.level) + } + } else { + prev := e.prev + e.elems = nextWeight(prev.level, o.getWeight(prev)) + o.verifyWeights(e, e.next, e.level) + } + } + return e.elems +} + +func (o *ordering) addExtension(e *entry) { + if ex := o.find(e.extend); ex != nil { + e.elems = append(e.elems, ex.elems...) + } else { + for _, r := range []rune(e.extend) { + e.elems = append(e.elems, o.find(string(r)).elems...) + } + } + e.extend = "" +} + +func (o *ordering) verifyWeights(a, b *entry, level colltab.Level) error { + if level == colltab.Identity || b == nil || b.elems == nil || a.elems == nil { + return nil + } + for i := colltab.Primary; i < level; i++ { + if a.elems[0].w[i] < b.elems[0].w[i] { + return nil + } + } + if a.elems[0].w[level] >= b.elems[0].w[level] { + err := fmt.Errorf("%s:overflow: collation elements of %q (%X) overflows those of %q (%X) at level %d (%X >= %X)", o.id, a.str, a.runes, b.str, b.runes, level, a.elems, b.elems) + log.Println(err) + // TODO: return the error instead, or better, fix the conflicting entry by making room. + } + return nil +} + +func (b *Builder) error(e error) { + if e != nil { + b.err = e + } +} + +func (b *Builder) errorID(locale string, e error) { + if e != nil { + b.err = fmt.Errorf("%s:%v", locale, e) + } +} + +// patchNorm ensures that NFC and NFD counterparts are consistent. +func (o *ordering) patchNorm() { + // Insert the NFD counterparts, if necessary. + for _, e := range o.ordered { + nfd := norm.NFD.String(e.str) + if nfd != e.str { + if e0 := o.find(nfd); e0 != nil && !e0.modified { + e0.elems = e.elems + } else if e.modified && !equalCEArrays(o.genColElems(nfd), e.elems) { + e := o.newEntry(nfd, e.elems) + e.modified = true + } + } + } + // Update unchanged composed forms if one of their parts changed. + for _, e := range o.ordered { + nfd := norm.NFD.String(e.str) + if e.modified || nfd == e.str { + continue + } + if e0 := o.find(nfd); e0 != nil { + e.elems = e0.elems + } else { + e.elems = o.genColElems(nfd) + if norm.NFD.LastBoundary([]byte(nfd)) == 0 { + r := []rune(nfd) + head := string(r[0]) + tail := "" + for i := 1; i < len(r); i++ { + s := norm.NFC.String(head + string(r[i])) + if e0 := o.find(s); e0 != nil && e0.modified { + head = s + } else { + tail += string(r[i]) + } + } + e.elems = append(o.genColElems(head), o.genColElems(tail)...) + } + } + } + // Exclude entries for which the individual runes generate the same collation elements. + for _, e := range o.ordered { + if len(e.runes) > 1 && equalCEArrays(o.genColElems(e.str), e.elems) { + e.exclude = true + } + } +} + +func (b *Builder) buildOrdering(o *ordering) { + for _, e := range o.ordered { + o.getWeight(e) + } + for _, e := range o.ordered { + o.addExtension(e) + } + o.patchNorm() + o.sort() + simplify(o) + b.processExpansions(o) // requires simplify + b.processContractions(o) // requires simplify + + t := newNode() + for e := o.front(); e != nil; e, _ = e.nextIndexed() { + if !e.skip() { + ce, err := e.encode() + b.errorID(o.id, err) + t.insert(e.runes[0], ce) + } + } + o.handle = b.index.addTrie(t) +} + +func (b *Builder) build() (*table, error) { + if b.built { + return b.t, b.err + } + b.built = true + b.t = &table{ + maxContractLen: utf8.UTFMax, + variableTop: uint32(b.varTop), + } + + b.buildOrdering(&b.root) + b.t.root = b.root.handle + for _, t := range b.locale { + b.buildOrdering(t.index) + if b.err != nil { + break + } + } + i, err := b.index.generate() + b.t.index = *i + b.error(err) + return b.t, b.err +} + +// Build builds the root Collator. +// TODO: return Weighter instead +func (b *Builder) Build() (colltab.Weighter, error) { + t, err := b.build() + if err != nil { + return nil, err + } + table := colltab.Init(t) + if table == nil { + panic("generated table of incompatible type") + } + return table, nil +} + +// Build builds a Collator for Tailoring t. +func (t *Tailoring) Build() (colltab.Weighter, error) { + // TODO: implement. + return nil, nil +} + +// Print prints the tables for b and all its Tailorings as a Go file +// that can be included in the Collate package. +func (b *Builder) Print(w io.Writer) (n int, err error) { + p := func(nn int, e error) { + n += nn + if err == nil { + err = e + } + } + t, err := b.build() + if err != nil { + return 0, err + } + p(fmt.Fprintf(w, `var availableLocales = "und`)) + for _, loc := range b.locale { + if loc.id != "und" { + p(fmt.Fprintf(w, ",%s", loc.id)) + } + } + p(fmt.Fprint(w, "\"\n\n")) + p(fmt.Fprintf(w, "const varTop = 0x%x\n\n", b.varTop)) + p(fmt.Fprintln(w, "var locales = [...]tableIndex{")) + for _, loc := range b.locale { + if loc.id == "und" { + p(t.fprintIndex(w, loc.index.handle, loc.id)) + } + } + for _, loc := range b.locale { + if loc.id != "und" { + p(t.fprintIndex(w, loc.index.handle, loc.id)) + } + } + p(fmt.Fprint(w, "}\n\n")) + n, _, err = t.fprint(w, "main") + return +} + +// reproducibleFromNFKD checks whether the given expansion could be generated +// from an NFKD expansion. +func reproducibleFromNFKD(e *entry, exp, nfkd []rawCE) bool { + // Length must be equal. + if len(exp) != len(nfkd) { + return false + } + for i, ce := range exp { + // Primary and secondary values should be equal. + if ce.w[0] != nfkd[i].w[0] || ce.w[1] != nfkd[i].w[1] { + return false + } + // Tertiary values should be equal to maxTertiary for third element onwards. + // TODO: there seem to be a lot of cases in CLDR (e.g. ㏭ in zh.xml) that can + // simply be dropped. Try this out by dropping the following code. + if i >= 2 && ce.w[2] != maxTertiary { + return false + } + if _, err := makeCE(ce); err != nil { + // Simply return false. The error will be caught elsewhere. + return false + } + } + return true +} + +func simplify(o *ordering) { + // Runes that are a starter of a contraction should not be removed. + // (To date, there is only Kannada character 0CCA.) + keep := make(map[rune]bool) + for e := o.front(); e != nil; e, _ = e.nextIndexed() { + if len(e.runes) > 1 { + keep[e.runes[0]] = true + } + } + // Tag entries for which the runes NFKD decompose to identical values. + for e := o.front(); e != nil; e, _ = e.nextIndexed() { + s := e.str + nfkd := norm.NFKD.String(s) + nfd := norm.NFD.String(s) + if e.decompose || len(e.runes) > 1 || len(e.elems) == 1 || keep[e.runes[0]] || nfkd == nfd { + continue + } + if reproducibleFromNFKD(e, e.elems, o.genColElems(nfkd)) { + e.decompose = true + } + } +} + +// appendExpansion converts the given collation sequence to +// collation elements and adds them to the expansion table. +// It returns an index to the expansion table. +func (b *Builder) appendExpansion(e *entry) int { + t := b.t + i := len(t.expandElem) + ce := uint32(len(e.elems)) + t.expandElem = append(t.expandElem, ce) + for _, w := range e.elems { + ce, err := makeCE(w) + if err != nil { + b.error(err) + return -1 + } + t.expandElem = append(t.expandElem, ce) + } + return i +} + +// processExpansions extracts data necessary to generate +// the extraction tables. +func (b *Builder) processExpansions(o *ordering) { + for e := o.front(); e != nil; e, _ = e.nextIndexed() { + if !e.expansion() { + continue + } + key := fmt.Sprintf("%v", e.elems) + i, ok := b.expIndex[key] + if !ok { + i = b.appendExpansion(e) + b.expIndex[key] = i + } + e.expansionIndex = i + } +} + +func (b *Builder) processContractions(o *ordering) { + // Collate contractions per starter rune. + starters := []rune{} + cm := make(map[rune][]*entry) + for e := o.front(); e != nil; e, _ = e.nextIndexed() { + if e.contraction() { + if len(e.str) > b.t.maxContractLen { + b.t.maxContractLen = len(e.str) + } + r := e.runes[0] + if _, ok := cm[r]; !ok { + starters = append(starters, r) + } + cm[r] = append(cm[r], e) + } + } + // Add entries of single runes that are at a start of a contraction. + for e := o.front(); e != nil; e, _ = e.nextIndexed() { + if !e.contraction() { + r := e.runes[0] + if _, ok := cm[r]; ok { + cm[r] = append(cm[r], e) + } + } + } + // Build the tries for the contractions. + t := b.t + for _, r := range starters { + l := cm[r] + // Compute suffix strings. There are 31 different contraction suffix + // sets for 715 contractions and 82 contraction starter runes as of + // version 6.0.0. + sufx := []string{} + hasSingle := false + for _, e := range l { + if len(e.runes) > 1 { + sufx = append(sufx, string(e.runes[1:])) + } else { + hasSingle = true + } + } + if !hasSingle { + b.error(fmt.Errorf("no single entry for starter rune %U found", r)) + continue + } + // Unique the suffix set. + sort.Strings(sufx) + key := strings.Join(sufx, "\n") + handle, ok := b.ctHandle[key] + if !ok { + var err error + handle, err = t.contractTries.appendTrie(sufx) + if err != nil { + b.error(err) + } + b.ctHandle[key] = handle + } + // Bucket sort entries in index order. + es := make([]*entry, len(l)) + for _, e := range l { + var p, sn int + if len(e.runes) > 1 { + str := []byte(string(e.runes[1:])) + p, sn = t.contractTries.lookup(handle, str) + if sn != len(str) { + log.Fatalf("%s: processContractions: unexpected length for '%X'; len=%d; want %d", o.id, e.runes, sn, len(str)) + } + } + if es[p] != nil { + log.Fatalf("%s: multiple contractions for position %d for rune %U", o.id, p, e.runes[0]) + } + es[p] = e + } + // Create collation elements for contractions. + elems := []uint32{} + for _, e := range es { + ce, err := e.encodeBase() + b.errorID(o.id, err) + elems = append(elems, ce) + } + key = fmt.Sprintf("%v", elems) + i, ok := b.ctElem[key] + if !ok { + i = len(t.contractElem) + b.ctElem[key] = i + t.contractElem = append(t.contractElem, elems...) + } + // Store info in entry for starter rune. + es[0].contractionIndex = i + es[0].contractionHandle = handle + } +} diff --git a/vendor/golang.org/x/text/collate/build/builder_test.go b/vendor/golang.org/x/text/collate/build/builder_test.go new file mode 100644 index 0000000000..568309798e --- /dev/null +++ b/vendor/golang.org/x/text/collate/build/builder_test.go @@ -0,0 +1,290 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package build + +import "testing" + +// cjk returns an implicit collation element for a CJK rune. +func cjk(r rune) []rawCE { + // A CJK character C is represented in the DUCET as + // [.AAAA.0020.0002.C][.BBBB.0000.0000.C] + // Where AAAA is the most significant 15 bits plus a base value. + // Any base value will work for the test, so we pick the common value of FB40. + const base = 0xFB40 + return []rawCE{ + {w: []int{base + int(r>>15), defaultSecondary, defaultTertiary, int(r)}}, + {w: []int{int(r&0x7FFF) | 0x8000, 0, 0, int(r)}}, + } +} + +func pCE(p int) []rawCE { + return mkCE([]int{p, defaultSecondary, defaultTertiary, 0}, 0) +} + +func pqCE(p, q int) []rawCE { + return mkCE([]int{p, defaultSecondary, defaultTertiary, q}, 0) +} + +func ptCE(p, t int) []rawCE { + return mkCE([]int{p, defaultSecondary, t, 0}, 0) +} + +func ptcCE(p, t int, ccc uint8) []rawCE { + return mkCE([]int{p, defaultSecondary, t, 0}, ccc) +} + +func sCE(s int) []rawCE { + return mkCE([]int{0, s, defaultTertiary, 0}, 0) +} + +func stCE(s, t int) []rawCE { + return mkCE([]int{0, s, t, 0}, 0) +} + +func scCE(s int, ccc uint8) []rawCE { + return mkCE([]int{0, s, defaultTertiary, 0}, ccc) +} + +func mkCE(w []int, ccc uint8) []rawCE { + return []rawCE{rawCE{w, ccc}} +} + +// ducetElem is used to define test data that is used to generate a table. +type ducetElem struct { + str string + ces []rawCE +} + +func newBuilder(t *testing.T, ducet []ducetElem) *Builder { + b := NewBuilder() + for _, e := range ducet { + ces := [][]int{} + for _, ce := range e.ces { + ces = append(ces, ce.w) + } + if err := b.Add([]rune(e.str), ces, nil); err != nil { + t.Errorf(err.Error()) + } + } + b.t = &table{} + b.root.sort() + return b +} + +type convertTest struct { + in, out []rawCE + err bool +} + +var convLargeTests = []convertTest{ + {pCE(0xFB39), pCE(0xFB39), false}, + {cjk(0x2F9B2), pqCE(0x3F9B2, 0x2F9B2), false}, + {pCE(0xFB40), pCE(0), true}, + {append(pCE(0xFB40), pCE(0)[0]), pCE(0), true}, + {pCE(0xFFFE), pCE(illegalOffset), false}, + {pCE(0xFFFF), pCE(illegalOffset + 1), false}, +} + +func TestConvertLarge(t *testing.T) { + for i, tt := range convLargeTests { + e := new(entry) + for _, ce := range tt.in { + e.elems = append(e.elems, makeRawCE(ce.w, ce.ccc)) + } + elems, err := convertLargeWeights(e.elems) + if tt.err { + if err == nil { + t.Errorf("%d: expected error; none found", i) + } + continue + } else if err != nil { + t.Errorf("%d: unexpected error: %v", i, err) + } + if !equalCEArrays(elems, tt.out) { + t.Errorf("%d: conversion was %x; want %x", i, elems, tt.out) + } + } +} + +// Collation element table for simplify tests. +var simplifyTest = []ducetElem{ + {"\u0300", sCE(30)}, // grave + {"\u030C", sCE(40)}, // caron + {"A", ptCE(100, 8)}, + {"D", ptCE(104, 8)}, + {"E", ptCE(105, 8)}, + {"I", ptCE(110, 8)}, + {"z", ptCE(130, 8)}, + {"\u05F2", append(ptCE(200, 4), ptCE(200, 4)[0])}, + {"\u05B7", sCE(80)}, + {"\u00C0", append(ptCE(100, 8), sCE(30)...)}, // A with grave, can be removed + {"\u00C8", append(ptCE(105, 8), sCE(30)...)}, // E with grave + {"\uFB1F", append(ptCE(200, 4), ptCE(200, 4)[0], sCE(80)[0])}, // eliminated by NFD + {"\u00C8\u0302", ptCE(106, 8)}, // block previous from simplifying + {"\u01C5", append(ptCE(104, 9), ptCE(130, 4)[0], stCE(40, maxTertiary)[0])}, // eliminated by NFKD + // no removal: tertiary value of third element is not maxTertiary + {"\u2162", append(ptCE(110, 9), ptCE(110, 4)[0], ptCE(110, 8)[0])}, +} + +var genColTests = []ducetElem{ + {"\uFA70", pqCE(0x1FA70, 0xFA70)}, + {"A\u0300", append(ptCE(100, 8), sCE(30)...)}, + {"A\u0300\uFA70", append(ptCE(100, 8), sCE(30)[0], pqCE(0x1FA70, 0xFA70)[0])}, + {"A\u0300A\u0300", append(ptCE(100, 8), sCE(30)[0], ptCE(100, 8)[0], sCE(30)[0])}, +} + +func TestGenColElems(t *testing.T) { + b := newBuilder(t, simplifyTest[:5]) + + for i, tt := range genColTests { + res := b.root.genColElems(tt.str) + if !equalCEArrays(tt.ces, res) { + t.Errorf("%d: result %X; want %X", i, res, tt.ces) + } + } +} + +type strArray []string + +func (sa strArray) contains(s string) bool { + for _, e := range sa { + if e == s { + return true + } + } + return false +} + +var simplifyRemoved = strArray{"\u00C0", "\uFB1F"} +var simplifyMarked = strArray{"\u01C5"} + +func TestSimplify(t *testing.T) { + b := newBuilder(t, simplifyTest) + o := &b.root + simplify(o) + + for i, tt := range simplifyTest { + if simplifyRemoved.contains(tt.str) { + continue + } + e := o.find(tt.str) + if e.str != tt.str || !equalCEArrays(e.elems, tt.ces) { + t.Errorf("%d: found element %s -> %X; want %s -> %X", i, e.str, e.elems, tt.str, tt.ces) + break + } + } + var i, k int + for e := o.front(); e != nil; e, _ = e.nextIndexed() { + gold := simplifyMarked.contains(e.str) + if gold { + k++ + } + if gold != e.decompose { + t.Errorf("%d: %s has decompose %v; want %v", i, e.str, e.decompose, gold) + } + i++ + } + if k != len(simplifyMarked) { + t.Errorf(" an entry that should be marked as decompose was deleted") + } +} + +var expandTest = []ducetElem{ + {"\u0300", append(scCE(29, 230), scCE(30, 230)...)}, + {"\u00C0", append(ptCE(100, 8), scCE(30, 230)...)}, + {"\u00C8", append(ptCE(105, 8), scCE(30, 230)...)}, + {"\u00C9", append(ptCE(105, 8), scCE(30, 230)...)}, // identical expansion + {"\u05F2", append(ptCE(200, 4), ptCE(200, 4)[0], ptCE(200, 4)[0])}, + {"\u01FF", append(ptCE(200, 4), ptcCE(201, 4, 0)[0], scCE(30, 230)[0])}, +} + +func TestExpand(t *testing.T) { + const ( + totalExpansions = 5 + totalElements = 2 + 2 + 2 + 3 + 3 + totalExpansions + ) + b := newBuilder(t, expandTest) + o := &b.root + b.processExpansions(o) + + e := o.front() + for _, tt := range expandTest { + exp := b.t.expandElem[e.expansionIndex:] + if int(exp[0]) != len(tt.ces) { + t.Errorf("%U: len(expansion)==%d; want %d", []rune(tt.str)[0], exp[0], len(tt.ces)) + } + exp = exp[1:] + for j, w := range tt.ces { + if ce, _ := makeCE(w); exp[j] != ce { + t.Errorf("%U: element %d is %X; want %X", []rune(tt.str)[0], j, exp[j], ce) + } + } + e, _ = e.nextIndexed() + } + // Verify uniquing. + if len(b.t.expandElem) != totalElements { + t.Errorf("len(expandElem)==%d; want %d", len(b.t.expandElem), totalElements) + } +} + +var contractTest = []ducetElem{ + {"abc", pCE(102)}, + {"abd", pCE(103)}, + {"a", pCE(100)}, + {"ab", pCE(101)}, + {"ac", pCE(104)}, + {"bcd", pCE(202)}, + {"b", pCE(200)}, + {"bc", pCE(201)}, + {"bd", pCE(203)}, + // shares suffixes with a* + {"Ab", pCE(301)}, + {"A", pCE(300)}, + {"Ac", pCE(304)}, + {"Abc", pCE(302)}, + {"Abd", pCE(303)}, + // starter to be ignored + {"z", pCE(1000)}, +} + +func TestContract(t *testing.T) { + const ( + totalElements = 5 + 5 + 4 + ) + b := newBuilder(t, contractTest) + o := &b.root + b.processContractions(o) + + indexMap := make(map[int]bool) + handleMap := make(map[rune]*entry) + for e := o.front(); e != nil; e, _ = e.nextIndexed() { + if e.contractionHandle.n > 0 { + handleMap[e.runes[0]] = e + indexMap[e.contractionHandle.index] = true + } + } + // Verify uniquing. + if len(indexMap) != 2 { + t.Errorf("number of tries is %d; want %d", len(indexMap), 2) + } + for _, tt := range contractTest { + e, ok := handleMap[[]rune(tt.str)[0]] + if !ok { + continue + } + str := tt.str[1:] + offset, n := b.t.contractTries.lookup(e.contractionHandle, []byte(str)) + if len(str) != n { + t.Errorf("%s: bytes consumed==%d; want %d", tt.str, n, len(str)) + } + ce := b.t.contractElem[offset+e.contractionIndex] + if want, _ := makeCE(tt.ces[0]); want != ce { + t.Errorf("%s: element %X; want %X", tt.str, ce, want) + } + } + if len(b.t.contractElem) != totalElements { + t.Errorf("len(expandElem)==%d; want %d", len(b.t.contractElem), totalElements) + } +} diff --git a/vendor/golang.org/x/text/collate/build/colelem.go b/vendor/golang.org/x/text/collate/build/colelem.go new file mode 100644 index 0000000000..01d5e67a12 --- /dev/null +++ b/vendor/golang.org/x/text/collate/build/colelem.go @@ -0,0 +1,294 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package build + +import ( + "fmt" + "unicode" + + "golang.org/x/text/collate/colltab" +) + +const ( + defaultSecondary = 0x20 + defaultTertiary = 0x2 + maxTertiary = 0x1F +) + +type rawCE struct { + w []int + ccc uint8 +} + +func makeRawCE(w []int, ccc uint8) rawCE { + ce := rawCE{w: make([]int, 4), ccc: ccc} + copy(ce.w, w) + return ce +} + +// A collation element is represented as an uint32. +// In the typical case, a rune maps to a single collation element. If a rune +// can be the start of a contraction or expands into multiple collation elements, +// then the collation element that is associated with a rune will have a special +// form to represent such m to n mappings. Such special collation elements +// have a value >= 0x80000000. + +const ( + maxPrimaryBits = 21 + maxSecondaryBits = 12 + maxTertiaryBits = 8 +) + +func makeCE(ce rawCE) (uint32, error) { + v, e := colltab.MakeElem(ce.w[0], ce.w[1], ce.w[2], ce.ccc) + return uint32(v), e +} + +// For contractions, collation elements are of the form +// 110bbbbb bbbbbbbb iiiiiiii iiiinnnn, where +// - n* is the size of the first node in the contraction trie. +// - i* is the index of the first node in the contraction trie. +// - b* is the offset into the contraction collation element table. +// See contract.go for details on the contraction trie. +const ( + contractID = 0xC0000000 + maxNBits = 4 + maxTrieIndexBits = 12 + maxContractOffsetBits = 13 +) + +func makeContractIndex(h ctHandle, offset int) (uint32, error) { + if h.n >= 1<<maxNBits { + return 0, fmt.Errorf("size of contraction trie node too large: %d >= %d", h.n, 1<<maxNBits) + } + if h.index >= 1<<maxTrieIndexBits { + return 0, fmt.Errorf("size of contraction trie offset too large: %d >= %d", h.index, 1<<maxTrieIndexBits) + } + if offset >= 1<<maxContractOffsetBits { + return 0, fmt.Errorf("contraction offset out of bounds: %x >= %x", offset, 1<<maxContractOffsetBits) + } + ce := uint32(contractID) + ce += uint32(offset << (maxNBits + maxTrieIndexBits)) + ce += uint32(h.index << maxNBits) + ce += uint32(h.n) + return ce, nil +} + +// For expansions, collation elements are of the form +// 11100000 00000000 bbbbbbbb bbbbbbbb, +// where b* is the index into the expansion sequence table. +const ( + expandID = 0xE0000000 + maxExpandIndexBits = 16 +) + +func makeExpandIndex(index int) (uint32, error) { + if index >= 1<<maxExpandIndexBits { + return 0, fmt.Errorf("expansion index out of bounds: %x >= %x", index, 1<<maxExpandIndexBits) + } + return expandID + uint32(index), nil +} + +// Each list of collation elements corresponding to an expansion starts with +// a header indicating the length of the sequence. +func makeExpansionHeader(n int) (uint32, error) { + return uint32(n), nil +} + +// Some runes can be expanded using NFKD decomposition. Instead of storing the full +// sequence of collation elements, we decompose the rune and lookup the collation +// elements for each rune in the decomposition and modify the tertiary weights. +// The collation element, in this case, is of the form +// 11110000 00000000 wwwwwwww vvvvvvvv, where +// - v* is the replacement tertiary weight for the first rune, +// - w* is the replacement tertiary weight for the second rune, +// Tertiary weights of subsequent runes should be replaced with maxTertiary. +// See http://www.unicode.org/reports/tr10/#Compatibility_Decompositions for more details. +const ( + decompID = 0xF0000000 +) + +func makeDecompose(t1, t2 int) (uint32, error) { + if t1 >= 256 || t1 < 0 { + return 0, fmt.Errorf("first tertiary weight out of bounds: %d >= 256", t1) + } + if t2 >= 256 || t2 < 0 { + return 0, fmt.Errorf("second tertiary weight out of bounds: %d >= 256", t2) + } + return uint32(t2<<8+t1) + decompID, nil +} + +const ( + // These constants were taken from http://www.unicode.org/versions/Unicode6.0.0/ch12.pdf. + minUnified rune = 0x4E00 + maxUnified = 0x9FFF + minCompatibility = 0xF900 + maxCompatibility = 0xFAFF + minRare = 0x3400 + maxRare = 0x4DBF +) +const ( + commonUnifiedOffset = 0x10000 + rareUnifiedOffset = 0x20000 // largest rune in common is U+FAFF + otherOffset = 0x50000 // largest rune in rare is U+2FA1D + illegalOffset = otherOffset + int(unicode.MaxRune) + maxPrimary = illegalOffset + 1 +) + +// implicitPrimary returns the primary weight for the a rune +// for which there is no entry for the rune in the collation table. +// We take a different approach from the one specified in +// http://unicode.org/reports/tr10/#Implicit_Weights, +// but preserve the resulting relative ordering of the runes. +func implicitPrimary(r rune) int { + if unicode.Is(unicode.Ideographic, r) { + if r >= minUnified && r <= maxUnified { + // The most common case for CJK. + return int(r) + commonUnifiedOffset + } + if r >= minCompatibility && r <= maxCompatibility { + // This will typically not hit. The DUCET explicitly specifies mappings + // for all characters that do not decompose. + return int(r) + commonUnifiedOffset + } + return int(r) + rareUnifiedOffset + } + return int(r) + otherOffset +} + +// convertLargeWeights converts collation elements with large +// primaries (either double primaries or for illegal runes) +// to our own representation. +// A CJK character C is represented in the DUCET as +// [.FBxx.0020.0002.C][.BBBB.0000.0000.C] +// We will rewrite these characters to a single CE. +// We assume the CJK values start at 0x8000. +// See http://unicode.org/reports/tr10/#Implicit_Weights +func convertLargeWeights(elems []rawCE) (res []rawCE, err error) { + const ( + cjkPrimaryStart = 0xFB40 + rarePrimaryStart = 0xFB80 + otherPrimaryStart = 0xFBC0 + illegalPrimary = 0xFFFE + highBitsMask = 0x3F + lowBitsMask = 0x7FFF + lowBitsFlag = 0x8000 + shiftBits = 15 + ) + for i := 0; i < len(elems); i++ { + ce := elems[i].w + p := ce[0] + if p < cjkPrimaryStart { + continue + } + if p > 0xFFFF { + return elems, fmt.Errorf("found primary weight %X; should be <= 0xFFFF", p) + } + if p >= illegalPrimary { + ce[0] = illegalOffset + p - illegalPrimary + } else { + if i+1 >= len(elems) { + return elems, fmt.Errorf("second part of double primary weight missing: %v", elems) + } + if elems[i+1].w[0]&lowBitsFlag == 0 { + return elems, fmt.Errorf("malformed second part of double primary weight: %v", elems) + } + np := ((p & highBitsMask) << shiftBits) + elems[i+1].w[0]&lowBitsMask + switch { + case p < rarePrimaryStart: + np += commonUnifiedOffset + case p < otherPrimaryStart: + np += rareUnifiedOffset + default: + p += otherOffset + } + ce[0] = np + for j := i + 1; j+1 < len(elems); j++ { + elems[j] = elems[j+1] + } + elems = elems[:len(elems)-1] + } + } + return elems, nil +} + +// nextWeight computes the first possible collation weights following elems +// for the given level. +func nextWeight(level colltab.Level, elems []rawCE) []rawCE { + if level == colltab.Identity { + next := make([]rawCE, len(elems)) + copy(next, elems) + return next + } + next := []rawCE{makeRawCE(elems[0].w, elems[0].ccc)} + next[0].w[level]++ + if level < colltab.Secondary { + next[0].w[colltab.Secondary] = defaultSecondary + } + if level < colltab.Tertiary { + next[0].w[colltab.Tertiary] = defaultTertiary + } + // Filter entries that cannot influence ordering. + for _, ce := range elems[1:] { + skip := true + for i := colltab.Primary; i < level; i++ { + skip = skip && ce.w[i] == 0 + } + if !skip { + next = append(next, ce) + } + } + return next +} + +func nextVal(elems []rawCE, i int, level colltab.Level) (index, value int) { + for ; i < len(elems) && elems[i].w[level] == 0; i++ { + } + if i < len(elems) { + return i, elems[i].w[level] + } + return i, 0 +} + +// compareWeights returns -1 if a < b, 1 if a > b, or 0 otherwise. +// It also returns the collation level at which the difference is found. +func compareWeights(a, b []rawCE) (result int, level colltab.Level) { + for level := colltab.Primary; level < colltab.Identity; level++ { + var va, vb int + for ia, ib := 0, 0; ia < len(a) || ib < len(b); ia, ib = ia+1, ib+1 { + ia, va = nextVal(a, ia, level) + ib, vb = nextVal(b, ib, level) + if va != vb { + if va < vb { + return -1, level + } else { + return 1, level + } + } + } + } + return 0, colltab.Identity +} + +func equalCE(a, b rawCE) bool { + for i := 0; i < 3; i++ { + if b.w[i] != a.w[i] { + return false + } + } + return true +} + +func equalCEArrays(a, b []rawCE) bool { + if len(a) != len(b) { + return false + } + for i := range a { + if !equalCE(a[i], b[i]) { + return false + } + } + return true +} diff --git a/vendor/golang.org/x/text/collate/build/colelem_test.go b/vendor/golang.org/x/text/collate/build/colelem_test.go new file mode 100644 index 0000000000..57066b065c --- /dev/null +++ b/vendor/golang.org/x/text/collate/build/colelem_test.go @@ -0,0 +1,215 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package build + +import ( + "testing" + + "golang.org/x/text/collate/colltab" +) + +type ceTest struct { + f func(in []int) (uint32, error) + arg []int + val uint32 +} + +func normalCE(in []int) (ce uint32, err error) { + return makeCE(rawCE{w: in[:3], ccc: uint8(in[3])}) +} + +func expandCE(in []int) (ce uint32, err error) { + return makeExpandIndex(in[0]) +} + +func contractCE(in []int) (ce uint32, err error) { + return makeContractIndex(ctHandle{in[0], in[1]}, in[2]) +} + +func decompCE(in []int) (ce uint32, err error) { + return makeDecompose(in[0], in[1]) +} + +var ceTests = []ceTest{ + {normalCE, []int{0, 0, 0, 0}, 0xA0000000}, + {normalCE, []int{0, 0x28, 3, 0}, 0xA0002803}, + {normalCE, []int{0, 0x28, 3, 0xFF}, 0xAFF02803}, + {normalCE, []int{100, defaultSecondary, 3, 0}, 0x0000C883}, + // non-ignorable primary with non-default secondary + {normalCE, []int{100, 0x28, defaultTertiary, 0}, 0x4000C828}, + {normalCE, []int{100, defaultSecondary + 8, 3, 0}, 0x0000C983}, + {normalCE, []int{100, 0, 3, 0}, 0xFFFF}, // non-ignorable primary with non-supported secondary + {normalCE, []int{100, 1, 3, 0}, 0xFFFF}, + {normalCE, []int{1 << maxPrimaryBits, defaultSecondary, 0, 0}, 0xFFFF}, + {normalCE, []int{0, 1 << maxSecondaryBits, 0, 0}, 0xFFFF}, + {normalCE, []int{100, defaultSecondary, 1 << maxTertiaryBits, 0}, 0xFFFF}, + {normalCE, []int{0x123, defaultSecondary, 8, 0xFF}, 0x88FF0123}, + {normalCE, []int{0x123, defaultSecondary + 1, 8, 0xFF}, 0xFFFF}, + + {contractCE, []int{0, 0, 0}, 0xC0000000}, + {contractCE, []int{1, 1, 1}, 0xC0010011}, + {contractCE, []int{1, (1 << maxNBits) - 1, 1}, 0xC001001F}, + {contractCE, []int{(1 << maxTrieIndexBits) - 1, 1, 1}, 0xC001FFF1}, + {contractCE, []int{1, 1, (1 << maxContractOffsetBits) - 1}, 0xDFFF0011}, + {contractCE, []int{1, (1 << maxNBits), 1}, 0xFFFF}, + {contractCE, []int{(1 << maxTrieIndexBits), 1, 1}, 0xFFFF}, + {contractCE, []int{1, (1 << maxContractOffsetBits), 1}, 0xFFFF}, + + {expandCE, []int{0}, 0xE0000000}, + {expandCE, []int{5}, 0xE0000005}, + {expandCE, []int{(1 << maxExpandIndexBits) - 1}, 0xE000FFFF}, + {expandCE, []int{1 << maxExpandIndexBits}, 0xFFFF}, + + {decompCE, []int{0, 0}, 0xF0000000}, + {decompCE, []int{1, 1}, 0xF0000101}, + {decompCE, []int{0x1F, 0x1F}, 0xF0001F1F}, + {decompCE, []int{256, 0x1F}, 0xFFFF}, + {decompCE, []int{0x1F, 256}, 0xFFFF}, +} + +func TestColElem(t *testing.T) { + for i, tt := range ceTests { + in := make([]int, len(tt.arg)) + copy(in, tt.arg) + ce, err := tt.f(in) + if tt.val == 0xFFFF { + if err == nil { + t.Errorf("%d: expected error for args %x", i, tt.arg) + } + continue + } + if err != nil { + t.Errorf("%d: unexpected error: %v", i, err.Error()) + } + if ce != tt.val { + t.Errorf("%d: colElem=%X; want %X", i, ce, tt.val) + } + } +} + +func mkRawCES(in [][]int) []rawCE { + out := []rawCE{} + for _, w := range in { + out = append(out, rawCE{w: w}) + } + return out +} + +type weightsTest struct { + a, b [][]int + level colltab.Level + result int +} + +var nextWeightTests = []weightsTest{ + { + a: [][]int{{100, 20, 5, 0}}, + b: [][]int{{101, defaultSecondary, defaultTertiary, 0}}, + level: colltab.Primary, + }, + { + a: [][]int{{100, 20, 5, 0}}, + b: [][]int{{100, 21, defaultTertiary, 0}}, + level: colltab.Secondary, + }, + { + a: [][]int{{100, 20, 5, 0}}, + b: [][]int{{100, 20, 6, 0}}, + level: colltab.Tertiary, + }, + { + a: [][]int{{100, 20, 5, 0}}, + b: [][]int{{100, 20, 5, 0}}, + level: colltab.Identity, + }, +} + +var extra = [][]int{{200, 32, 8, 0}, {0, 32, 8, 0}, {0, 0, 8, 0}, {0, 0, 0, 0}} + +func TestNextWeight(t *testing.T) { + for i, tt := range nextWeightTests { + test := func(l colltab.Level, tt weightsTest, a, gold [][]int) { + res := nextWeight(tt.level, mkRawCES(a)) + if !equalCEArrays(mkRawCES(gold), res) { + t.Errorf("%d:%d: expected weights %d; found %d", i, l, gold, res) + } + } + test(-1, tt, tt.a, tt.b) + for l := colltab.Primary; l <= colltab.Tertiary; l++ { + if tt.level <= l { + test(l, tt, append(tt.a, extra[l]), tt.b) + } else { + test(l, tt, append(tt.a, extra[l]), append(tt.b, extra[l])) + } + } + } +} + +var compareTests = []weightsTest{ + { + [][]int{{100, 20, 5, 0}}, + [][]int{{100, 20, 5, 0}}, + colltab.Identity, + 0, + }, + { + [][]int{{100, 20, 5, 0}, extra[0]}, + [][]int{{100, 20, 5, 1}}, + colltab.Primary, + 1, + }, + { + [][]int{{100, 20, 5, 0}}, + [][]int{{101, 20, 5, 0}}, + colltab.Primary, + -1, + }, + { + [][]int{{101, 20, 5, 0}}, + [][]int{{100, 20, 5, 0}}, + colltab.Primary, + 1, + }, + { + [][]int{{100, 0, 0, 0}, {0, 20, 5, 0}}, + [][]int{{0, 20, 5, 0}, {100, 0, 0, 0}}, + colltab.Identity, + 0, + }, + { + [][]int{{100, 20, 5, 0}}, + [][]int{{100, 21, 5, 0}}, + colltab.Secondary, + -1, + }, + { + [][]int{{100, 20, 5, 0}}, + [][]int{{100, 20, 2, 0}}, + colltab.Tertiary, + 1, + }, + { + [][]int{{100, 20, 5, 1}}, + [][]int{{100, 20, 5, 2}}, + colltab.Quaternary, + -1, + }, +} + +func TestCompareWeights(t *testing.T) { + for i, tt := range compareTests { + test := func(tt weightsTest, a, b [][]int) { + res, level := compareWeights(mkRawCES(a), mkRawCES(b)) + if res != tt.result { + t.Errorf("%d: expected comparisson result %d; found %d", i, tt.result, res) + } + if level != tt.level { + t.Errorf("%d: expected level %d; found %d", i, tt.level, level) + } + } + test(tt, tt.a, tt.b) + test(tt, append(tt.a, extra[0]), append(tt.b, extra[0])) + } +} diff --git a/vendor/golang.org/x/text/collate/build/contract.go b/vendor/golang.org/x/text/collate/build/contract.go new file mode 100644 index 0000000000..868665061e --- /dev/null +++ b/vendor/golang.org/x/text/collate/build/contract.go @@ -0,0 +1,307 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package build + +import ( + "fmt" + "io" + "reflect" + "sort" + "strings" +) + +// This file contains code for detecting contractions and generating +// the necessary tables. +// Any Unicode Collation Algorithm (UCA) table entry that has more than +// one rune one the left-hand side is called a contraction. +// See http://www.unicode.org/reports/tr10/#Contractions for more details. +// +// We define the following terms: +// initial: a rune that appears as the first rune in a contraction. +// suffix: a sequence of runes succeeding the initial rune +// in a given contraction. +// non-initial: a rune that appears in a suffix. +// +// A rune may be both a initial and a non-initial and may be so in +// many contractions. An initial may typically also appear by itself. +// In case of ambiguities, the UCA requires we match the longest +// contraction. +// +// Many contraction rules share the same set of possible suffixes. +// We store sets of suffixes in a trie that associates an index with +// each suffix in the set. This index can be used to look up a +// collation element associated with the (starter rune, suffix) pair. +// +// The trie is defined on a UTF-8 byte sequence. +// The overall trie is represented as an array of ctEntries. Each node of the trie +// is represented as a subsequence of ctEntries, where each entry corresponds to +// a possible match of a next character in the search string. An entry +// also includes the length and offset to the next sequence of entries +// to check in case of a match. + +const ( + final = 0 + noIndex = 0xFF +) + +// ctEntry associates to a matching byte an offset and/or next sequence of +// bytes to check. A ctEntry c is called final if a match means that the +// longest suffix has been found. An entry c is final if c.n == 0. +// A single final entry can match a range of characters to an offset. +// A non-final entry always matches a single byte. Note that a non-final +// entry might still resemble a completed suffix. +// Examples: +// The suffix strings "ab" and "ac" can be represented as: +// []ctEntry{ +// {'a', 1, 1, noIndex}, // 'a' by itself does not match, so i is 0xFF. +// {'b', 'c', 0, 1}, // "ab" -> 1, "ac" -> 2 +// } +// +// The suffix strings "ab", "abc", "abd", and "abcd" can be represented as: +// []ctEntry{ +// {'a', 1, 1, noIndex}, // 'a' must be followed by 'b'. +// {'b', 1, 2, 1}, // "ab" -> 1, may be followed by 'c' or 'd'. +// {'d', 'd', final, 3}, // "abd" -> 3 +// {'c', 4, 1, 2}, // "abc" -> 2, may be followed by 'd'. +// {'d', 'd', final, 4}, // "abcd" -> 4 +// } +// See genStateTests in contract_test.go for more examples. +type ctEntry struct { + l uint8 // non-final: byte value to match; final: lowest match in range. + h uint8 // non-final: relative index to next block; final: highest match in range. + n uint8 // non-final: length of next block; final: final + i uint8 // result offset. Will be noIndex if more bytes are needed to complete. +} + +// contractTrieSet holds a set of contraction tries. The tries are stored +// consecutively in the entry field. +type contractTrieSet []struct{ l, h, n, i uint8 } + +// ctHandle is used to identify a trie in the trie set, consisting in an offset +// in the array and the size of the first node. +type ctHandle struct { + index, n int +} + +// appendTrie adds a new trie for the given suffixes to the trie set and returns +// a handle to it. The handle will be invalid on error. +func (ct *contractTrieSet) appendTrie(suffixes []string) (ctHandle, error) { + es := make([]stridx, len(suffixes)) + for i, s := range suffixes { + es[i].str = s + } + sort.Sort(offsetSort(es)) + for i := range es { + es[i].index = i + 1 + } + sort.Sort(genidxSort(es)) + i := len(*ct) + n, err := ct.genStates(es) + if err != nil { + *ct = (*ct)[:i] + return ctHandle{}, err + } + return ctHandle{i, n}, nil +} + +// genStates generates ctEntries for a given suffix set and returns +// the number of entries for the first node. +func (ct *contractTrieSet) genStates(sis []stridx) (int, error) { + if len(sis) == 0 { + return 0, fmt.Errorf("genStates: list of suffices must be non-empty") + } + start := len(*ct) + // create entries for differing first bytes. + for _, si := range sis { + s := si.str + if len(s) == 0 { + continue + } + added := false + c := s[0] + if len(s) > 1 { + for j := len(*ct) - 1; j >= start; j-- { + if (*ct)[j].l == c { + added = true + break + } + } + if !added { + *ct = append(*ct, ctEntry{l: c, i: noIndex}) + } + } else { + for j := len(*ct) - 1; j >= start; j-- { + // Update the offset for longer suffixes with the same byte. + if (*ct)[j].l == c { + (*ct)[j].i = uint8(si.index) + added = true + } + // Extend range of final ctEntry, if possible. + if (*ct)[j].h+1 == c { + (*ct)[j].h = c + added = true + } + } + if !added { + *ct = append(*ct, ctEntry{l: c, h: c, n: final, i: uint8(si.index)}) + } + } + } + n := len(*ct) - start + // Append nodes for the remainder of the suffixes for each ctEntry. + sp := 0 + for i, end := start, len(*ct); i < end; i++ { + fe := (*ct)[i] + if fe.h == 0 { // uninitialized non-final + ln := len(*ct) - start - n + if ln > 0xFF { + return 0, fmt.Errorf("genStates: relative block offset too large: %d > 255", ln) + } + fe.h = uint8(ln) + // Find first non-final strings with same byte as current entry. + for ; sis[sp].str[0] != fe.l; sp++ { + } + se := sp + 1 + for ; se < len(sis) && len(sis[se].str) > 1 && sis[se].str[0] == fe.l; se++ { + } + sl := sis[sp:se] + sp = se + for i, si := range sl { + sl[i].str = si.str[1:] + } + nn, err := ct.genStates(sl) + if err != nil { + return 0, err + } + fe.n = uint8(nn) + (*ct)[i] = fe + } + } + sort.Sort(entrySort((*ct)[start : start+n])) + return n, nil +} + +// There may be both a final and non-final entry for a byte if the byte +// is implied in a range of matches in the final entry. +// We need to ensure that the non-final entry comes first in that case. +type entrySort contractTrieSet + +func (fe entrySort) Len() int { return len(fe) } +func (fe entrySort) Swap(i, j int) { fe[i], fe[j] = fe[j], fe[i] } +func (fe entrySort) Less(i, j int) bool { + return fe[i].l > fe[j].l +} + +// stridx is used for sorting suffixes and their associated offsets. +type stridx struct { + str string + index int +} + +// For computing the offsets, we first sort by size, and then by string. +// This ensures that strings that only differ in the last byte by 1 +// are sorted consecutively in increasing order such that they can +// be packed as a range in a final ctEntry. +type offsetSort []stridx + +func (si offsetSort) Len() int { return len(si) } +func (si offsetSort) Swap(i, j int) { si[i], si[j] = si[j], si[i] } +func (si offsetSort) Less(i, j int) bool { + if len(si[i].str) != len(si[j].str) { + return len(si[i].str) > len(si[j].str) + } + return si[i].str < si[j].str +} + +// For indexing, we want to ensure that strings are sorted in string order, where +// for strings with the same prefix, we put longer strings before shorter ones. +type genidxSort []stridx + +func (si genidxSort) Len() int { return len(si) } +func (si genidxSort) Swap(i, j int) { si[i], si[j] = si[j], si[i] } +func (si genidxSort) Less(i, j int) bool { + if strings.HasPrefix(si[j].str, si[i].str) { + return false + } + if strings.HasPrefix(si[i].str, si[j].str) { + return true + } + return si[i].str < si[j].str +} + +// lookup matches the longest suffix in str and returns the associated offset +// and the number of bytes consumed. +func (ct *contractTrieSet) lookup(h ctHandle, str []byte) (index, ns int) { + states := (*ct)[h.index:] + p := 0 + n := h.n + for i := 0; i < n && p < len(str); { + e := states[i] + c := str[p] + if c >= e.l { + if e.l == c { + p++ + if e.i != noIndex { + index, ns = int(e.i), p + } + if e.n != final { + // set to new state + i, states, n = 0, states[int(e.h)+n:], int(e.n) + } else { + return + } + continue + } else if e.n == final && c <= e.h { + p++ + return int(c-e.l) + int(e.i), p + } + } + i++ + } + return +} + +// print writes the contractTrieSet t as compilable Go code to w. It returns +// the total number of bytes written and the size of the resulting data structure in bytes. +func (t *contractTrieSet) print(w io.Writer, name string) (n, size int, err error) { + update3 := func(nn, sz int, e error) { + n += nn + if err == nil { + err = e + } + size += sz + } + update2 := func(nn int, e error) { update3(nn, 0, e) } + + update3(t.printArray(w, name)) + update2(fmt.Fprintf(w, "var %sContractTrieSet = ", name)) + update3(t.printStruct(w, name)) + update2(fmt.Fprintln(w)) + return +} + +func (ct contractTrieSet) printArray(w io.Writer, name string) (n, size int, err error) { + p := func(f string, a ...interface{}) { + nn, e := fmt.Fprintf(w, f, a...) + n += nn + if err == nil { + err = e + } + } + size = len(ct) * 4 + p("// %sCTEntries: %d entries, %d bytes\n", name, len(ct), size) + p("var %sCTEntries = [%d]struct{l,h,n,i uint8}{\n", name, len(ct)) + for _, fe := range ct { + p("\t{0x%X, 0x%X, %d, %d},\n", fe.l, fe.h, fe.n, fe.i) + } + p("}\n") + return +} + +func (ct contractTrieSet) printStruct(w io.Writer, name string) (n, size int, err error) { + n, err = fmt.Fprintf(w, "contractTrieSet( %sCTEntries[:] )", name) + size = int(reflect.TypeOf(ct).Size()) + return +} diff --git a/vendor/golang.org/x/text/collate/build/contract_test.go b/vendor/golang.org/x/text/collate/build/contract_test.go new file mode 100644 index 0000000000..0fc944d34b --- /dev/null +++ b/vendor/golang.org/x/text/collate/build/contract_test.go @@ -0,0 +1,264 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package build + +import ( + "bytes" + "sort" + "testing" +) + +var largetosmall = []stridx{ + {"a", 5}, + {"ab", 4}, + {"abc", 3}, + {"abcd", 2}, + {"abcde", 1}, + {"abcdef", 0}, +} + +var offsetSortTests = [][]stridx{ + { + {"bcde", 1}, + {"bc", 5}, + {"ab", 4}, + {"bcd", 3}, + {"abcd", 0}, + {"abc", 2}, + }, + largetosmall, +} + +func TestOffsetSort(t *testing.T) { + for i, st := range offsetSortTests { + sort.Sort(offsetSort(st)) + for j, si := range st { + if j != si.index { + t.Errorf("%d: failed: %v", i, st) + } + } + } + for i, tt := range genStateTests { + // ensure input is well-formed + sort.Sort(offsetSort(tt.in)) + for j, si := range tt.in { + if si.index != j+1 { + t.Errorf("%dth sort failed: %v", i, tt.in) + } + } + } +} + +var genidxtest1 = []stridx{ + {"bcde", 3}, + {"bc", 6}, + {"ab", 2}, + {"bcd", 5}, + {"abcd", 0}, + {"abc", 1}, + {"bcdf", 4}, +} + +var genidxSortTests = [][]stridx{ + genidxtest1, + largetosmall, +} + +func TestGenIdxSort(t *testing.T) { + for i, st := range genidxSortTests { + sort.Sort(genidxSort(st)) + for j, si := range st { + if j != si.index { + t.Errorf("%dth sort failed %v", i, st) + break + } + } + } +} + +var entrySortTests = []contractTrieSet{ + { + {10, 0, 1, 3}, + {99, 0, 1, 0}, + {20, 50, 0, 2}, + {30, 0, 1, 1}, + }, +} + +func TestEntrySort(t *testing.T) { + for i, et := range entrySortTests { + sort.Sort(entrySort(et)) + for j, fe := range et { + if j != int(fe.i) { + t.Errorf("%dth sort failed %v", i, et) + break + } + } + } +} + +type GenStateTest struct { + in []stridx + firstBlockLen int + out contractTrieSet +} + +var genStateTests = []GenStateTest{ + {[]stridx{ + {"abc", 1}, + }, + 1, + contractTrieSet{ + {'a', 0, 1, noIndex}, + {'b', 0, 1, noIndex}, + {'c', 'c', final, 1}, + }, + }, + {[]stridx{ + {"abc", 1}, + {"abd", 2}, + {"abe", 3}, + }, + 1, + contractTrieSet{ + {'a', 0, 1, noIndex}, + {'b', 0, 1, noIndex}, + {'c', 'e', final, 1}, + }, + }, + {[]stridx{ + {"abc", 1}, + {"ab", 2}, + {"a", 3}, + }, + 1, + contractTrieSet{ + {'a', 0, 1, 3}, + {'b', 0, 1, 2}, + {'c', 'c', final, 1}, + }, + }, + {[]stridx{ + {"abc", 1}, + {"abd", 2}, + {"ab", 3}, + {"ac", 4}, + {"a", 5}, + {"b", 6}, + }, + 2, + contractTrieSet{ + {'b', 'b', final, 6}, + {'a', 0, 2, 5}, + {'c', 'c', final, 4}, + {'b', 0, 1, 3}, + {'c', 'd', final, 1}, + }, + }, + {[]stridx{ + {"bcde", 2}, + {"bc", 7}, + {"ab", 6}, + {"bcd", 5}, + {"abcd", 1}, + {"abc", 4}, + {"bcdf", 3}, + }, + 2, + contractTrieSet{ + {'b', 3, 1, noIndex}, + {'a', 0, 1, noIndex}, + {'b', 0, 1, 6}, + {'c', 0, 1, 4}, + {'d', 'd', final, 1}, + {'c', 0, 1, 7}, + {'d', 0, 1, 5}, + {'e', 'f', final, 2}, + }, + }, +} + +func TestGenStates(t *testing.T) { + for i, tt := range genStateTests { + si := []stridx{} + for _, e := range tt.in { + si = append(si, e) + } + // ensure input is well-formed + sort.Sort(genidxSort(si)) + ct := contractTrieSet{} + n, _ := ct.genStates(si) + if nn := tt.firstBlockLen; nn != n { + t.Errorf("%d: block len %v; want %v", i, n, nn) + } + if lv, lw := len(ct), len(tt.out); lv != lw { + t.Errorf("%d: len %v; want %v", i, lv, lw) + continue + } + for j, fe := range tt.out { + const msg = "%d:%d: value %s=%v; want %v" + if fe.l != ct[j].l { + t.Errorf(msg, i, j, "l", ct[j].l, fe.l) + } + if fe.h != ct[j].h { + t.Errorf(msg, i, j, "h", ct[j].h, fe.h) + } + if fe.n != ct[j].n { + t.Errorf(msg, i, j, "n", ct[j].n, fe.n) + } + if fe.i != ct[j].i { + t.Errorf(msg, i, j, "i", ct[j].i, fe.i) + } + } + } +} + +func TestLookupContraction(t *testing.T) { + for i, tt := range genStateTests { + input := []string{} + for _, e := range tt.in { + input = append(input, e.str) + } + cts := contractTrieSet{} + h, _ := cts.appendTrie(input) + for j, si := range tt.in { + str := si.str + for _, s := range []string{str, str + "X"} { + msg := "%d:%d: %s(%s) %v; want %v" + idx, sn := cts.lookup(h, []byte(s)) + if idx != si.index { + t.Errorf(msg, i, j, "index", s, idx, si.index) + } + if sn != len(str) { + t.Errorf(msg, i, j, "sn", s, sn, len(str)) + } + } + } + } +} + +func TestPrintContractionTrieSet(t *testing.T) { + testdata := contractTrieSet(genStateTests[4].out) + buf := &bytes.Buffer{} + testdata.print(buf, "test") + if contractTrieOutput != buf.String() { + t.Errorf("output differs; found\n%s", buf.String()) + println(string(buf.Bytes())) + } +} + +const contractTrieOutput = `// testCTEntries: 8 entries, 32 bytes +var testCTEntries = [8]struct{l,h,n,i uint8}{ + {0x62, 0x3, 1, 255}, + {0x61, 0x0, 1, 255}, + {0x62, 0x0, 1, 6}, + {0x63, 0x0, 1, 4}, + {0x64, 0x64, 0, 1}, + {0x63, 0x0, 1, 7}, + {0x64, 0x0, 1, 5}, + {0x65, 0x66, 0, 2}, +} +var testContractTrieSet = contractTrieSet( testCTEntries[:] ) +` diff --git a/vendor/golang.org/x/text/collate/build/order.go b/vendor/golang.org/x/text/collate/build/order.go new file mode 100644 index 0000000000..34801d812d --- /dev/null +++ b/vendor/golang.org/x/text/collate/build/order.go @@ -0,0 +1,393 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package build + +import ( + "fmt" + "log" + "sort" + "strings" + "unicode" + + "golang.org/x/text/collate/colltab" + "golang.org/x/text/unicode/norm" +) + +type logicalAnchor int + +const ( + firstAnchor logicalAnchor = -1 + noAnchor = 0 + lastAnchor = 1 +) + +// entry is used to keep track of a single entry in the collation element table +// during building. Examples of entries can be found in the Default Unicode +// Collation Element Table. +// See http://www.unicode.org/Public/UCA/6.0.0/allkeys.txt. +type entry struct { + str string // same as string(runes) + runes []rune + elems []rawCE // the collation elements + extend string // weights of extend to be appended to elems + before bool // weights relative to next instead of previous. + lock bool // entry is used in extension and can no longer be moved. + + // prev, next, and level are used to keep track of tailorings. + prev, next *entry + level colltab.Level // next differs at this level + skipRemove bool // do not unlink when removed + + decompose bool // can use NFKD decomposition to generate elems + exclude bool // do not include in table + implicit bool // derived, is not included in the list + modified bool // entry was modified in tailoring + logical logicalAnchor + + expansionIndex int // used to store index into expansion table + contractionHandle ctHandle + contractionIndex int // index into contraction elements +} + +func (e *entry) String() string { + return fmt.Sprintf("%X (%q) -> %X (ch:%x; ci:%d, ei:%d)", + e.runes, e.str, e.elems, e.contractionHandle, e.contractionIndex, e.expansionIndex) +} + +func (e *entry) skip() bool { + return e.contraction() +} + +func (e *entry) expansion() bool { + return !e.decompose && len(e.elems) > 1 +} + +func (e *entry) contraction() bool { + return len(e.runes) > 1 +} + +func (e *entry) contractionStarter() bool { + return e.contractionHandle.n != 0 +} + +// nextIndexed gets the next entry that needs to be stored in the table. +// It returns the entry and the collation level at which the next entry differs +// from the current entry. +// Entries that can be explicitly derived and logical reset positions are +// examples of entries that will not be indexed. +func (e *entry) nextIndexed() (*entry, colltab.Level) { + level := e.level + for e = e.next; e != nil && (e.exclude || len(e.elems) == 0); e = e.next { + if e.level < level { + level = e.level + } + } + return e, level +} + +// remove unlinks entry e from the sorted chain and clears the collation +// elements. e may not be at the front or end of the list. This should always +// be the case, as the front and end of the list are always logical anchors, +// which may not be removed. +func (e *entry) remove() { + if e.logical != noAnchor { + log.Fatalf("may not remove anchor %q", e.str) + } + // TODO: need to set e.prev.level to e.level if e.level is smaller? + e.elems = nil + if !e.skipRemove { + if e.prev != nil { + e.prev.next = e.next + } + if e.next != nil { + e.next.prev = e.prev + } + } + e.skipRemove = false +} + +// insertAfter inserts n after e. +func (e *entry) insertAfter(n *entry) { + if e == n { + panic("e == anchor") + } + if e == nil { + panic("unexpected nil anchor") + } + n.remove() + n.decompose = false // redo decomposition test + + n.next = e.next + n.prev = e + if e.next != nil { + e.next.prev = n + } + e.next = n +} + +// insertBefore inserts n before e. +func (e *entry) insertBefore(n *entry) { + if e == n { + panic("e == anchor") + } + if e == nil { + panic("unexpected nil anchor") + } + n.remove() + n.decompose = false // redo decomposition test + + n.prev = e.prev + n.next = e + if e.prev != nil { + e.prev.next = n + } + e.prev = n +} + +func (e *entry) encodeBase() (ce uint32, err error) { + switch { + case e.expansion(): + ce, err = makeExpandIndex(e.expansionIndex) + default: + if e.decompose { + log.Fatal("decompose should be handled elsewhere") + } + ce, err = makeCE(e.elems[0]) + } + return +} + +func (e *entry) encode() (ce uint32, err error) { + if e.skip() { + log.Fatal("cannot build colElem for entry that should be skipped") + } + switch { + case e.decompose: + t1 := e.elems[0].w[2] + t2 := 0 + if len(e.elems) > 1 { + t2 = e.elems[1].w[2] + } + ce, err = makeDecompose(t1, t2) + case e.contractionStarter(): + ce, err = makeContractIndex(e.contractionHandle, e.contractionIndex) + default: + if len(e.runes) > 1 { + log.Fatal("colElem: contractions are handled in contraction trie") + } + ce, err = e.encodeBase() + } + return +} + +// entryLess returns true if a sorts before b and false otherwise. +func entryLess(a, b *entry) bool { + if res, _ := compareWeights(a.elems, b.elems); res != 0 { + return res == -1 + } + if a.logical != noAnchor { + return a.logical == firstAnchor + } + if b.logical != noAnchor { + return b.logical == lastAnchor + } + return a.str < b.str +} + +type sortedEntries []*entry + +func (s sortedEntries) Len() int { + return len(s) +} + +func (s sortedEntries) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s sortedEntries) Less(i, j int) bool { + return entryLess(s[i], s[j]) +} + +type ordering struct { + id string + entryMap map[string]*entry + ordered []*entry + handle *trieHandle +} + +// insert inserts e into both entryMap and ordered. +// Note that insert simply appends e to ordered. To reattain a sorted +// order, o.sort() should be called. +func (o *ordering) insert(e *entry) { + if e.logical == noAnchor { + o.entryMap[e.str] = e + } else { + // Use key format as used in UCA rules. + o.entryMap[fmt.Sprintf("[%s]", e.str)] = e + // Also add index entry for XML format. + o.entryMap[fmt.Sprintf("<%s/>", strings.Replace(e.str, " ", "_", -1))] = e + } + o.ordered = append(o.ordered, e) +} + +// newEntry creates a new entry for the given info and inserts it into +// the index. +func (o *ordering) newEntry(s string, ces []rawCE) *entry { + e := &entry{ + runes: []rune(s), + elems: ces, + str: s, + } + o.insert(e) + return e +} + +// find looks up and returns the entry for the given string. +// It returns nil if str is not in the index and if an implicit value +// cannot be derived, that is, if str represents more than one rune. +func (o *ordering) find(str string) *entry { + e := o.entryMap[str] + if e == nil { + r := []rune(str) + if len(r) == 1 { + const ( + firstHangul = 0xAC00 + lastHangul = 0xD7A3 + ) + if r[0] >= firstHangul && r[0] <= lastHangul { + ce := []rawCE{} + nfd := norm.NFD.String(str) + for _, r := range nfd { + ce = append(ce, o.find(string(r)).elems...) + } + e = o.newEntry(nfd, ce) + } else { + e = o.newEntry(string(r[0]), []rawCE{ + {w: []int{ + implicitPrimary(r[0]), + defaultSecondary, + defaultTertiary, + int(r[0]), + }, + }, + }) + e.modified = true + } + e.exclude = true // do not index implicits + } + } + return e +} + +// makeRootOrdering returns a newly initialized ordering value and populates +// it with a set of logical reset points that can be used as anchors. +// The anchors first_tertiary_ignorable and __END__ will always sort at +// the beginning and end, respectively. This means that prev and next are non-nil +// for any indexed entry. +func makeRootOrdering() ordering { + const max = unicode.MaxRune + o := ordering{ + entryMap: make(map[string]*entry), + } + insert := func(typ logicalAnchor, s string, ce []int) { + e := &entry{ + elems: []rawCE{{w: ce}}, + str: s, + exclude: true, + logical: typ, + } + o.insert(e) + } + insert(firstAnchor, "first tertiary ignorable", []int{0, 0, 0, 0}) + insert(lastAnchor, "last tertiary ignorable", []int{0, 0, 0, max}) + insert(lastAnchor, "last primary ignorable", []int{0, defaultSecondary, defaultTertiary, max}) + insert(lastAnchor, "last non ignorable", []int{maxPrimary, defaultSecondary, defaultTertiary, max}) + insert(lastAnchor, "__END__", []int{1 << maxPrimaryBits, defaultSecondary, defaultTertiary, max}) + return o +} + +// patchForInsert eleminates entries from the list with more than one collation element. +// The next and prev fields of the eliminated entries still point to appropriate +// values in the newly created list. +// It requires that sort has been called. +func (o *ordering) patchForInsert() { + for i := 0; i < len(o.ordered)-1; { + e := o.ordered[i] + lev := e.level + n := e.next + for ; n != nil && len(n.elems) > 1; n = n.next { + if n.level < lev { + lev = n.level + } + n.skipRemove = true + } + for ; o.ordered[i] != n; i++ { + o.ordered[i].level = lev + o.ordered[i].next = n + o.ordered[i+1].prev = e + } + } +} + +// clone copies all ordering of es into a new ordering value. +func (o *ordering) clone() *ordering { + o.sort() + oo := ordering{ + entryMap: make(map[string]*entry), + } + for _, e := range o.ordered { + ne := &entry{ + runes: e.runes, + elems: e.elems, + str: e.str, + decompose: e.decompose, + exclude: e.exclude, + logical: e.logical, + } + oo.insert(ne) + } + oo.sort() // link all ordering. + oo.patchForInsert() + return &oo +} + +// front returns the first entry to be indexed. +// It assumes that sort() has been called. +func (o *ordering) front() *entry { + e := o.ordered[0] + if e.prev != nil { + log.Panicf("unexpected first entry: %v", e) + } + // The first entry is always a logical position, which should not be indexed. + e, _ = e.nextIndexed() + return e +} + +// sort sorts all ordering based on their collation elements and initializes +// the prev, next, and level fields accordingly. +func (o *ordering) sort() { + sort.Sort(sortedEntries(o.ordered)) + l := o.ordered + for i := 1; i < len(l); i++ { + k := i - 1 + l[k].next = l[i] + _, l[k].level = compareWeights(l[k].elems, l[i].elems) + l[i].prev = l[k] + } +} + +// genColElems generates a collation element array from the runes in str. This +// assumes that all collation elements have already been added to the Builder. +func (o *ordering) genColElems(str string) []rawCE { + elems := []rawCE{} + for _, r := range []rune(str) { + for _, ce := range o.find(string(r)).elems { + if ce.w[0] != 0 || ce.w[1] != 0 || ce.w[2] != 0 { + elems = append(elems, ce) + } + } + } + return elems +} diff --git a/vendor/golang.org/x/text/collate/build/order_test.go b/vendor/golang.org/x/text/collate/build/order_test.go new file mode 100644 index 0000000000..531795ba14 --- /dev/null +++ b/vendor/golang.org/x/text/collate/build/order_test.go @@ -0,0 +1,229 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package build + +import ( + "strconv" + "testing" + + "golang.org/x/text/collate/colltab" +) + +type entryTest struct { + f func(in []int) (uint32, error) + arg []int + val uint32 +} + +// makeList returns a list of entries of length n+2, with n normal +// entries plus a leading and trailing anchor. +func makeList(n int) []*entry { + es := make([]*entry, n+2) + weights := []rawCE{{w: []int{100, 20, 5, 0}}} + for i := range es { + runes := []rune{rune(i)} + es[i] = &entry{ + runes: runes, + elems: weights, + } + weights = nextWeight(colltab.Primary, weights) + } + for i := 1; i < len(es); i++ { + es[i-1].next = es[i] + es[i].prev = es[i-1] + _, es[i-1].level = compareWeights(es[i-1].elems, es[i].elems) + } + es[0].exclude = true + es[0].logical = firstAnchor + es[len(es)-1].exclude = true + es[len(es)-1].logical = lastAnchor + return es +} + +func TestNextIndexed(t *testing.T) { + const n = 5 + es := makeList(n) + for i := int64(0); i < 1<<n; i++ { + mask := strconv.FormatInt(i+(1<<n), 2) + for i, c := range mask { + es[i].exclude = c == '1' + } + e := es[0] + for i, c := range mask { + if c == '0' { + e, _ = e.nextIndexed() + if e != es[i] { + t.Errorf("%d: expected entry %d; found %d", i, es[i].elems, e.elems) + } + } + } + if e, _ = e.nextIndexed(); e != nil { + t.Errorf("%d: expected nil entry; found %d", i, e.elems) + } + } +} + +func TestRemove(t *testing.T) { + const n = 5 + for i := int64(0); i < 1<<n; i++ { + es := makeList(n) + mask := strconv.FormatInt(i+(1<<n), 2) + for i, c := range mask { + if c == '0' { + es[i].remove() + } + } + e := es[0] + for i, c := range mask { + if c == '1' { + if e != es[i] { + t.Errorf("%d: expected entry %d; found %d", i, es[i].elems, e.elems) + } + e, _ = e.nextIndexed() + } + } + if e != nil { + t.Errorf("%d: expected nil entry; found %d", i, e.elems) + } + } +} + +// nextPerm generates the next permutation of the array. The starting +// permutation is assumed to be a list of integers sorted in increasing order. +// It returns false if there are no more permuations left. +func nextPerm(a []int) bool { + i := len(a) - 2 + for ; i >= 0; i-- { + if a[i] < a[i+1] { + break + } + } + if i < 0 { + return false + } + for j := len(a) - 1; j >= i; j-- { + if a[j] > a[i] { + a[i], a[j] = a[j], a[i] + break + } + } + for j := i + 1; j < (len(a)+i+1)/2; j++ { + a[j], a[len(a)+i-j] = a[len(a)+i-j], a[j] + } + return true +} + +func TestInsertAfter(t *testing.T) { + const n = 5 + orig := makeList(n) + perm := make([]int, n) + for i := range perm { + perm[i] = i + 1 + } + for ok := true; ok; ok = nextPerm(perm) { + es := makeList(n) + last := es[0] + for _, i := range perm { + last.insertAfter(es[i]) + last = es[i] + } + for _, e := range es { + e.elems = es[0].elems + } + e := es[0] + for _, i := range perm { + e, _ = e.nextIndexed() + if e.runes[0] != orig[i].runes[0] { + t.Errorf("%d:%d: expected entry %X; found %X", perm, i, orig[i].runes, e.runes) + break + } + } + } +} + +func TestInsertBefore(t *testing.T) { + const n = 5 + orig := makeList(n) + perm := make([]int, n) + for i := range perm { + perm[i] = i + 1 + } + for ok := true; ok; ok = nextPerm(perm) { + es := makeList(n) + last := es[len(es)-1] + for _, i := range perm { + last.insertBefore(es[i]) + last = es[i] + } + for _, e := range es { + e.elems = es[0].elems + } + e := es[0] + for i := n - 1; i >= 0; i-- { + e, _ = e.nextIndexed() + if e.runes[0] != rune(perm[i]) { + t.Errorf("%d:%d: expected entry %X; found %X", perm, i, orig[i].runes, e.runes) + break + } + } + } +} + +type entryLessTest struct { + a, b *entry + res bool +} + +var ( + w1 = []rawCE{{w: []int{100, 20, 5, 5}}} + w2 = []rawCE{{w: []int{101, 20, 5, 5}}} +) + +var entryLessTests = []entryLessTest{ + {&entry{str: "a", elems: w1}, + &entry{str: "a", elems: w1}, + false, + }, + {&entry{str: "a", elems: w1}, + &entry{str: "a", elems: w2}, + true, + }, + {&entry{str: "a", elems: w1}, + &entry{str: "b", elems: w1}, + true, + }, + {&entry{str: "a", elems: w2}, + &entry{str: "a", elems: w1}, + false, + }, + {&entry{str: "c", elems: w1}, + &entry{str: "b", elems: w1}, + false, + }, + {&entry{str: "a", elems: w1, logical: firstAnchor}, + &entry{str: "a", elems: w1}, + true, + }, + {&entry{str: "a", elems: w1}, + &entry{str: "b", elems: w1, logical: firstAnchor}, + false, + }, + {&entry{str: "b", elems: w1}, + &entry{str: "a", elems: w1, logical: lastAnchor}, + true, + }, + {&entry{str: "a", elems: w1, logical: lastAnchor}, + &entry{str: "c", elems: w1}, + false, + }, +} + +func TestEntryLess(t *testing.T) { + for i, tt := range entryLessTests { + if res := entryLess(tt.a, tt.b); res != tt.res { + t.Errorf("%d: was %v; want %v", i, res, tt.res) + } + } +} diff --git a/vendor/golang.org/x/text/collate/build/table.go b/vendor/golang.org/x/text/collate/build/table.go new file mode 100644 index 0000000000..3aaf37c374 --- /dev/null +++ b/vendor/golang.org/x/text/collate/build/table.go @@ -0,0 +1,120 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package build + +import ( + "fmt" + "io" + "reflect" +) + +// table is an intermediate structure that roughly resembles the table in collate. +// It implements the non-exported interface collate.tableInitializer +type table struct { + index trie // main trie + root *trieHandle + + // expansion info + expandElem []uint32 + + // contraction info + contractTries contractTrieSet + contractElem []uint32 + maxContractLen int + variableTop uint32 +} + +func (t *table) TrieIndex() []uint16 { + return t.index.index +} + +func (t *table) TrieValues() []uint32 { + return t.index.values +} + +func (t *table) FirstBlockOffsets() (i, v uint16) { + return t.root.lookupStart, t.root.valueStart +} + +func (t *table) ExpandElems() []uint32 { + return t.expandElem +} + +func (t *table) ContractTries() []struct{ l, h, n, i uint8 } { + return t.contractTries +} + +func (t *table) ContractElems() []uint32 { + return t.contractElem +} + +func (t *table) MaxContractLen() int { + return t.maxContractLen +} + +func (t *table) VariableTop() uint32 { + return t.variableTop +} + +// print writes the table as Go compilable code to w. It prefixes the +// variable names with name. It returns the number of bytes written +// and the size of the resulting table. +func (t *table) fprint(w io.Writer, name string) (n, size int, err error) { + update := func(nn, sz int, e error) { + n += nn + if err == nil { + err = e + } + size += sz + } + // Write arrays needed for the structure. + update(printColElems(w, t.expandElem, name+"ExpandElem")) + update(printColElems(w, t.contractElem, name+"ContractElem")) + update(t.index.printArrays(w, name)) + update(t.contractTries.printArray(w, name)) + + nn, e := fmt.Fprintf(w, "// Total size of %sTable is %d bytes\n", name, size) + update(nn, 0, e) + return +} + +func (t *table) fprintIndex(w io.Writer, h *trieHandle, id string) (n int, err error) { + p := func(f string, a ...interface{}) { + nn, e := fmt.Fprintf(w, f, a...) + n += nn + if err == nil { + err = e + } + } + p("\t{ // %s\n", id) + p("\t\tlookupOffset: 0x%x,\n", h.lookupStart) + p("\t\tvaluesOffset: 0x%x,\n", h.valueStart) + p("\t},\n") + return +} + +func printColElems(w io.Writer, a []uint32, name string) (n, sz int, err error) { + p := func(f string, a ...interface{}) { + nn, e := fmt.Fprintf(w, f, a...) + n += nn + if err == nil { + err = e + } + } + sz = len(a) * int(reflect.TypeOf(uint32(0)).Size()) + p("// %s: %d entries, %d bytes\n", name, len(a), sz) + p("var %s = [%d]uint32 {", name, len(a)) + for i, c := range a { + switch { + case i%64 == 0: + p("\n\t// Block %d, offset 0x%x\n", i/64, i) + case (i%64)%6 == 0: + p("\n\t") + } + p("0x%.8X, ", c) + } + p("\n}\n\n") + return +} diff --git a/vendor/golang.org/x/text/collate/build/trie.go b/vendor/golang.org/x/text/collate/build/trie.go new file mode 100644 index 0000000000..9404a3465b --- /dev/null +++ b/vendor/golang.org/x/text/collate/build/trie.go @@ -0,0 +1,290 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// The trie in this file is used to associate the first full character +// in a UTF-8 string to a collation element. +// All but the last byte in a UTF-8 byte sequence are +// used to look up offsets in the index table to be used for the next byte. +// The last byte is used to index into a table of collation elements. +// This file contains the code for the generation of the trie. + +package build + +import ( + "fmt" + "hash/fnv" + "io" + "reflect" +) + +const ( + blockSize = 64 + blockOffset = 2 // Subtract 2 blocks to compensate for the 0x80 added to continuation bytes. +) + +type trieHandle struct { + lookupStart uint16 // offset in table for first byte + valueStart uint16 // offset in table for first byte +} + +type trie struct { + index []uint16 + values []uint32 +} + +// trieNode is the intermediate trie structure used for generating a trie. +type trieNode struct { + index []*trieNode + value []uint32 + b byte + refValue uint16 + refIndex uint16 +} + +func newNode() *trieNode { + return &trieNode{ + index: make([]*trieNode, 64), + value: make([]uint32, 128), // root node size is 128 instead of 64 + } +} + +func (n *trieNode) isInternal() bool { + return n.value != nil +} + +func (n *trieNode) insert(r rune, value uint32) { + const maskx = 0x3F // mask out two most-significant bits + str := string(r) + if len(str) == 1 { + n.value[str[0]] = value + return + } + for i := 0; i < len(str)-1; i++ { + b := str[i] & maskx + if n.index == nil { + n.index = make([]*trieNode, blockSize) + } + nn := n.index[b] + if nn == nil { + nn = &trieNode{} + nn.b = b + n.index[b] = nn + } + n = nn + } + if n.value == nil { + n.value = make([]uint32, blockSize) + } + b := str[len(str)-1] & maskx + n.value[b] = value +} + +type trieBuilder struct { + t *trie + + roots []*trieHandle + + lookupBlocks []*trieNode + valueBlocks []*trieNode + + lookupBlockIdx map[uint32]*trieNode + valueBlockIdx map[uint32]*trieNode +} + +func newTrieBuilder() *trieBuilder { + index := &trieBuilder{} + index.lookupBlocks = make([]*trieNode, 0) + index.valueBlocks = make([]*trieNode, 0) + index.lookupBlockIdx = make(map[uint32]*trieNode) + index.valueBlockIdx = make(map[uint32]*trieNode) + // The third nil is the default null block. The other two blocks + // are used to guarantee an offset of at least 3 for each block. + index.lookupBlocks = append(index.lookupBlocks, nil, nil, nil) + index.t = &trie{} + return index +} + +func (b *trieBuilder) computeOffsets(n *trieNode) *trieNode { + hasher := fnv.New32() + if n.index != nil { + for i, nn := range n.index { + var vi, vv uint16 + if nn != nil { + nn = b.computeOffsets(nn) + n.index[i] = nn + vi = nn.refIndex + vv = nn.refValue + } + hasher.Write([]byte{byte(vi >> 8), byte(vi)}) + hasher.Write([]byte{byte(vv >> 8), byte(vv)}) + } + h := hasher.Sum32() + nn, ok := b.lookupBlockIdx[h] + if !ok { + n.refIndex = uint16(len(b.lookupBlocks)) - blockOffset + b.lookupBlocks = append(b.lookupBlocks, n) + b.lookupBlockIdx[h] = n + } else { + n = nn + } + } else { + for _, v := range n.value { + hasher.Write([]byte{byte(v >> 24), byte(v >> 16), byte(v >> 8), byte(v)}) + } + h := hasher.Sum32() + nn, ok := b.valueBlockIdx[h] + if !ok { + n.refValue = uint16(len(b.valueBlocks)) - blockOffset + n.refIndex = n.refValue + b.valueBlocks = append(b.valueBlocks, n) + b.valueBlockIdx[h] = n + } else { + n = nn + } + } + return n +} + +func (b *trieBuilder) addStartValueBlock(n *trieNode) uint16 { + hasher := fnv.New32() + for _, v := range n.value[:2*blockSize] { + hasher.Write([]byte{byte(v >> 24), byte(v >> 16), byte(v >> 8), byte(v)}) + } + h := hasher.Sum32() + nn, ok := b.valueBlockIdx[h] + if !ok { + n.refValue = uint16(len(b.valueBlocks)) + n.refIndex = n.refValue + b.valueBlocks = append(b.valueBlocks, n) + // Add a dummy block to accommodate the double block size. + b.valueBlocks = append(b.valueBlocks, nil) + b.valueBlockIdx[h] = n + } else { + n = nn + } + return n.refValue +} + +func genValueBlock(t *trie, n *trieNode) { + if n != nil { + for _, v := range n.value { + t.values = append(t.values, v) + } + } +} + +func genLookupBlock(t *trie, n *trieNode) { + for _, nn := range n.index { + v := uint16(0) + if nn != nil { + if n.index != nil { + v = nn.refIndex + } else { + v = nn.refValue + } + } + t.index = append(t.index, v) + } +} + +func (b *trieBuilder) addTrie(n *trieNode) *trieHandle { + h := &trieHandle{} + b.roots = append(b.roots, h) + h.valueStart = b.addStartValueBlock(n) + if len(b.roots) == 1 { + // We insert a null block after the first start value block. + // This ensures that continuation bytes UTF-8 sequences of length + // greater than 2 will automatically hit a null block if there + // was an undefined entry. + b.valueBlocks = append(b.valueBlocks, nil) + } + n = b.computeOffsets(n) + // Offset by one extra block as the first byte starts at 0xC0 instead of 0x80. + h.lookupStart = n.refIndex - 1 + return h +} + +// generate generates and returns the trie for n. +func (b *trieBuilder) generate() (t *trie, err error) { + t = b.t + if len(b.valueBlocks) >= 1<<16 { + return nil, fmt.Errorf("maximum number of value blocks exceeded (%d > %d)", len(b.valueBlocks), 1<<16) + } + if len(b.lookupBlocks) >= 1<<16 { + return nil, fmt.Errorf("maximum number of lookup blocks exceeded (%d > %d)", len(b.lookupBlocks), 1<<16) + } + genValueBlock(t, b.valueBlocks[0]) + genValueBlock(t, &trieNode{value: make([]uint32, 64)}) + for i := 2; i < len(b.valueBlocks); i++ { + genValueBlock(t, b.valueBlocks[i]) + } + n := &trieNode{index: make([]*trieNode, 64)} + genLookupBlock(t, n) + genLookupBlock(t, n) + genLookupBlock(t, n) + for i := 3; i < len(b.lookupBlocks); i++ { + genLookupBlock(t, b.lookupBlocks[i]) + } + return b.t, nil +} + +func (t *trie) printArrays(w io.Writer, name string) (n, size int, err error) { + p := func(f string, a ...interface{}) { + nn, e := fmt.Fprintf(w, f, a...) + n += nn + if err == nil { + err = e + } + } + nv := len(t.values) + p("// %sValues: %d entries, %d bytes\n", name, nv, nv*4) + p("// Block 2 is the null block.\n") + p("var %sValues = [%d]uint32 {", name, nv) + var printnewline bool + for i, v := range t.values { + if i%blockSize == 0 { + p("\n\t// Block %#x, offset %#x", i/blockSize, i) + } + if i%4 == 0 { + printnewline = true + } + if v != 0 { + if printnewline { + p("\n\t") + printnewline = false + } + p("%#04x:%#08x, ", i, v) + } + } + p("\n}\n\n") + ni := len(t.index) + p("// %sLookup: %d entries, %d bytes\n", name, ni, ni*2) + p("// Block 0 is the null block.\n") + p("var %sLookup = [%d]uint16 {", name, ni) + printnewline = false + for i, v := range t.index { + if i%blockSize == 0 { + p("\n\t// Block %#x, offset %#x", i/blockSize, i) + } + if i%8 == 0 { + printnewline = true + } + if v != 0 { + if printnewline { + p("\n\t") + printnewline = false + } + p("%#03x:%#02x, ", i, v) + } + } + p("\n}\n\n") + return n, nv*4 + ni*2, err +} + +func (t *trie) printStruct(w io.Writer, handle *trieHandle, name string) (n, sz int, err error) { + const msg = "trie{ %sLookup[%d:], %sValues[%d:], %sLookup[:], %sValues[:]}" + n, err = fmt.Fprintf(w, msg, name, handle.lookupStart*blockSize, name, handle.valueStart*blockSize, name, name) + sz += int(reflect.TypeOf(trie{}).Size()) + return +} diff --git a/vendor/golang.org/x/text/collate/build/trie_test.go b/vendor/golang.org/x/text/collate/build/trie_test.go new file mode 100644 index 0000000000..4d4f6e4d14 --- /dev/null +++ b/vendor/golang.org/x/text/collate/build/trie_test.go @@ -0,0 +1,107 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package build + +import ( + "bytes" + "fmt" + "testing" +) + +// We take the smallest, largest and an arbitrary value for each +// of the UTF-8 sequence lengths. +var testRunes = []rune{ + 0x01, 0x0C, 0x7F, // 1-byte sequences + 0x80, 0x100, 0x7FF, // 2-byte sequences + 0x800, 0x999, 0xFFFF, // 3-byte sequences + 0x10000, 0x10101, 0x10FFFF, // 4-byte sequences + 0x200, 0x201, 0x202, 0x210, 0x215, // five entries in one sparse block +} + +func makeTestTrie(t *testing.T) trie { + n := newNode() + for i, r := range testRunes { + n.insert(r, uint32(i)) + } + idx := newTrieBuilder() + idx.addTrie(n) + tr, err := idx.generate() + if err != nil { + t.Errorf(err.Error()) + } + return *tr +} + +func TestGenerateTrie(t *testing.T) { + testdata := makeTestTrie(t) + buf := &bytes.Buffer{} + testdata.printArrays(buf, "test") + fmt.Fprintf(buf, "var testTrie = ") + testdata.printStruct(buf, &trieHandle{19, 0}, "test") + if output != buf.String() { + t.Error("output differs") + } +} + +var output = `// testValues: 832 entries, 3328 bytes +// Block 2 is the null block. +var testValues = [832]uint32 { + // Block 0x0, offset 0x0 + 0x000c:0x00000001, + // Block 0x1, offset 0x40 + 0x007f:0x00000002, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0x00c0:0x00000003, + // Block 0x4, offset 0x100 + 0x0100:0x00000004, + // Block 0x5, offset 0x140 + 0x0140:0x0000000c, 0x0141:0x0000000d, 0x0142:0x0000000e, + 0x0150:0x0000000f, + 0x0155:0x00000010, + // Block 0x6, offset 0x180 + 0x01bf:0x00000005, + // Block 0x7, offset 0x1c0 + 0x01c0:0x00000006, + // Block 0x8, offset 0x200 + 0x0219:0x00000007, + // Block 0x9, offset 0x240 + 0x027f:0x00000008, + // Block 0xa, offset 0x280 + 0x0280:0x00000009, + // Block 0xb, offset 0x2c0 + 0x02c1:0x0000000a, + // Block 0xc, offset 0x300 + 0x033f:0x0000000b, +} + +// testLookup: 640 entries, 1280 bytes +// Block 0 is the null block. +var testLookup = [640]uint16 { + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0x0e0:0x05, 0x0e6:0x06, + // Block 0x4, offset 0x100 + 0x13f:0x07, + // Block 0x5, offset 0x140 + 0x140:0x08, 0x144:0x09, + // Block 0x6, offset 0x180 + 0x190:0x03, + // Block 0x7, offset 0x1c0 + 0x1ff:0x0a, + // Block 0x8, offset 0x200 + 0x20f:0x05, + // Block 0x9, offset 0x240 + 0x242:0x01, 0x244:0x02, + 0x248:0x03, + 0x25f:0x04, + 0x260:0x01, + 0x26f:0x02, + 0x270:0x04, 0x274:0x06, +} + +var testTrie = trie{ testLookup[1216:], testValues[0:], testLookup[:], testValues[:]}` diff --git a/vendor/golang.org/x/text/collate/collate.go b/vendor/golang.org/x/text/collate/collate.go new file mode 100644 index 0000000000..a0f04ffe26 --- /dev/null +++ b/vendor/golang.org/x/text/collate/collate.go @@ -0,0 +1,405 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// TODO: remove hard-coded versions when we have implemented fractional weights. +// The current implementation is incompatible with later CLDR versions. +//go:generate go run maketables.go -cldr=23 -unicode=6.2.0 + +// Package collate contains types for comparing and sorting Unicode strings +// according to a given collation order. Package locale provides a high-level +// interface to collation. Users should typically use that package instead. +package collate // import "golang.org/x/text/collate" + +import ( + "bytes" + "strings" + + "golang.org/x/text/collate/colltab" + newcolltab "golang.org/x/text/internal/colltab" + "golang.org/x/text/language" +) + +// Collator provides functionality for comparing strings for a given +// collation order. +type Collator struct { + options + + sorter sorter + + _iter [2]iter +} + +func (c *Collator) iter(i int) *iter { + // TODO: evaluate performance for making the second iterator optional. + return &c._iter[i] +} + +// Supported returns the list of languages for which collating differs from its parent. +func Supported() []language.Tag { + // TODO: use language.Coverage instead. + + t := make([]language.Tag, len(tags)) + copy(t, tags) + return t +} + +func init() { + ids := strings.Split(availableLocales, ",") + tags = make([]language.Tag, len(ids)) + for i, s := range ids { + tags[i] = language.Raw.MustParse(s) + } +} + +var tags []language.Tag + +// New returns a new Collator initialized for the given locale. +func New(t language.Tag, o ...Option) *Collator { + index := newcolltab.MatchLang(t, tags) + c := newCollator(colltab.Init(locales[index])) + + // Set options from the user-supplied tag. + c.setFromTag(t) + + // Set the user-supplied options. + c.setOptions(o) + + c.init() + return c +} + +// NewFromTable returns a new Collator for the given Weighter. +func NewFromTable(w colltab.Weighter, o ...Option) *Collator { + c := newCollator(w) + c.setOptions(o) + c.init() + return c +} + +func (c *Collator) init() { + if c.numeric { + c.t = colltab.NewNumericWeighter(c.t) + } + c._iter[0].init(c) + c._iter[1].init(c) +} + +// Buffer holds keys generated by Key and KeyString. +type Buffer struct { + buf [4096]byte + key []byte +} + +func (b *Buffer) init() { + if b.key == nil { + b.key = b.buf[:0] + } +} + +// Reset clears the buffer from previous results generated by Key and KeyString. +func (b *Buffer) Reset() { + b.key = b.key[:0] +} + +// Compare returns an integer comparing the two byte slices. +// The result will be 0 if a==b, -1 if a < b, and +1 if a > b. +func (c *Collator) Compare(a, b []byte) int { + // TODO: skip identical prefixes once we have a fast way to detect if a rune is + // part of a contraction. This would lead to roughly a 10% speedup for the colcmp regtest. + c.iter(0).SetInput(a) + c.iter(1).SetInput(b) + if res := c.compare(); res != 0 { + return res + } + if !c.ignore[colltab.Identity] { + return bytes.Compare(a, b) + } + return 0 +} + +// CompareString returns an integer comparing the two strings. +// The result will be 0 if a==b, -1 if a < b, and +1 if a > b. +func (c *Collator) CompareString(a, b string) int { + // TODO: skip identical prefixes once we have a fast way to detect if a rune is + // part of a contraction. This would lead to roughly a 10% speedup for the colcmp regtest. + c.iter(0).SetInputString(a) + c.iter(1).SetInputString(b) + if res := c.compare(); res != 0 { + return res + } + if !c.ignore[colltab.Identity] { + if a < b { + return -1 + } else if a > b { + return 1 + } + } + return 0 +} + +func compareLevel(f func(i *iter) int, a, b *iter) int { + a.pce = 0 + b.pce = 0 + for { + va := f(a) + vb := f(b) + if va != vb { + if va < vb { + return -1 + } + return 1 + } else if va == 0 { + break + } + } + return 0 +} + +func (c *Collator) compare() int { + ia, ib := c.iter(0), c.iter(1) + // Process primary level + if c.alternate != altShifted { + // TODO: implement script reordering + if res := compareLevel((*iter).nextPrimary, ia, ib); res != 0 { + return res + } + } else { + // TODO: handle shifted + } + if !c.ignore[colltab.Secondary] { + f := (*iter).nextSecondary + if c.backwards { + f = (*iter).prevSecondary + } + if res := compareLevel(f, ia, ib); res != 0 { + return res + } + } + // TODO: special case handling (Danish?) + if !c.ignore[colltab.Tertiary] || c.caseLevel { + if res := compareLevel((*iter).nextTertiary, ia, ib); res != 0 { + return res + } + if !c.ignore[colltab.Quaternary] { + if res := compareLevel((*iter).nextQuaternary, ia, ib); res != 0 { + return res + } + } + } + return 0 +} + +// Key returns the collation key for str. +// Passing the buffer buf may avoid memory allocations. +// The returned slice will point to an allocation in Buffer and will remain +// valid until the next call to buf.Reset(). +func (c *Collator) Key(buf *Buffer, str []byte) []byte { + // See http://www.unicode.org/reports/tr10/#Main_Algorithm for more details. + buf.init() + return c.key(buf, c.getColElems(str)) +} + +// KeyFromString returns the collation key for str. +// Passing the buffer buf may avoid memory allocations. +// The returned slice will point to an allocation in Buffer and will retain +// valid until the next call to buf.ResetKeys(). +func (c *Collator) KeyFromString(buf *Buffer, str string) []byte { + // See http://www.unicode.org/reports/tr10/#Main_Algorithm for more details. + buf.init() + return c.key(buf, c.getColElemsString(str)) +} + +func (c *Collator) key(buf *Buffer, w []colltab.Elem) []byte { + processWeights(c.alternate, c.t.Top(), w) + kn := len(buf.key) + c.keyFromElems(buf, w) + return buf.key[kn:] +} + +func (c *Collator) getColElems(str []byte) []colltab.Elem { + i := c.iter(0) + i.SetInput(str) + for i.Next() { + } + return i.Elems +} + +func (c *Collator) getColElemsString(str string) []colltab.Elem { + i := c.iter(0) + i.SetInputString(str) + for i.Next() { + } + return i.Elems +} + +type iter struct { + wa [512]colltab.Elem + + newcolltab.Iter + pce int +} + +func (i *iter) init(c *Collator) { + i.Weighter = c.t + i.Elems = i.wa[:0] +} + +func (i *iter) nextPrimary() int { + for { + for ; i.pce < i.N; i.pce++ { + if v := i.Elems[i.pce].Primary(); v != 0 { + i.pce++ + return v + } + } + if !i.Next() { + return 0 + } + } + panic("should not reach here") +} + +func (i *iter) nextSecondary() int { + for ; i.pce < len(i.Elems); i.pce++ { + if v := i.Elems[i.pce].Secondary(); v != 0 { + i.pce++ + return v + } + } + return 0 +} + +func (i *iter) prevSecondary() int { + for ; i.pce < len(i.Elems); i.pce++ { + if v := i.Elems[len(i.Elems)-i.pce-1].Secondary(); v != 0 { + i.pce++ + return v + } + } + return 0 +} + +func (i *iter) nextTertiary() int { + for ; i.pce < len(i.Elems); i.pce++ { + if v := i.Elems[i.pce].Tertiary(); v != 0 { + i.pce++ + return int(v) + } + } + return 0 +} + +func (i *iter) nextQuaternary() int { + for ; i.pce < len(i.Elems); i.pce++ { + if v := i.Elems[i.pce].Quaternary(); v != 0 { + i.pce++ + return v + } + } + return 0 +} + +func appendPrimary(key []byte, p int) []byte { + // Convert to variable length encoding; supports up to 23 bits. + if p <= 0x7FFF { + key = append(key, uint8(p>>8), uint8(p)) + } else { + key = append(key, uint8(p>>16)|0x80, uint8(p>>8), uint8(p)) + } + return key +} + +// keyFromElems converts the weights ws to a compact sequence of bytes. +// The result will be appended to the byte buffer in buf. +func (c *Collator) keyFromElems(buf *Buffer, ws []colltab.Elem) { + for _, v := range ws { + if w := v.Primary(); w > 0 { + buf.key = appendPrimary(buf.key, w) + } + } + if !c.ignore[colltab.Secondary] { + buf.key = append(buf.key, 0, 0) + // TODO: we can use one 0 if we can guarantee that all non-zero weights are > 0xFF. + if !c.backwards { + for _, v := range ws { + if w := v.Secondary(); w > 0 { + buf.key = append(buf.key, uint8(w>>8), uint8(w)) + } + } + } else { + for i := len(ws) - 1; i >= 0; i-- { + if w := ws[i].Secondary(); w > 0 { + buf.key = append(buf.key, uint8(w>>8), uint8(w)) + } + } + } + } else if c.caseLevel { + buf.key = append(buf.key, 0, 0) + } + if !c.ignore[colltab.Tertiary] || c.caseLevel { + buf.key = append(buf.key, 0, 0) + for _, v := range ws { + if w := v.Tertiary(); w > 0 { + buf.key = append(buf.key, uint8(w)) + } + } + // Derive the quaternary weights from the options and other levels. + // Note that we represent MaxQuaternary as 0xFF. The first byte of the + // representation of a primary weight is always smaller than 0xFF, + // so using this single byte value will compare correctly. + if !c.ignore[colltab.Quaternary] && c.alternate >= altShifted { + if c.alternate == altShiftTrimmed { + lastNonFFFF := len(buf.key) + buf.key = append(buf.key, 0) + for _, v := range ws { + if w := v.Quaternary(); w == colltab.MaxQuaternary { + buf.key = append(buf.key, 0xFF) + } else if w > 0 { + buf.key = appendPrimary(buf.key, w) + lastNonFFFF = len(buf.key) + } + } + buf.key = buf.key[:lastNonFFFF] + } else { + buf.key = append(buf.key, 0) + for _, v := range ws { + if w := v.Quaternary(); w == colltab.MaxQuaternary { + buf.key = append(buf.key, 0xFF) + } else if w > 0 { + buf.key = appendPrimary(buf.key, w) + } + } + } + } + } +} + +func processWeights(vw alternateHandling, top uint32, wa []colltab.Elem) { + ignore := false + vtop := int(top) + switch vw { + case altShifted, altShiftTrimmed: + for i := range wa { + if p := wa[i].Primary(); p <= vtop && p != 0 { + wa[i] = colltab.MakeQuaternary(p) + ignore = true + } else if p == 0 { + if ignore { + wa[i] = colltab.Ignore + } + } else { + ignore = false + } + } + case altBlanked: + for i := range wa { + if p := wa[i].Primary(); p <= vtop && (ignore || p != 0) { + wa[i] = colltab.Ignore + ignore = true + } else { + ignore = false + } + } + } +} diff --git a/vendor/golang.org/x/text/collate/collate_test.go b/vendor/golang.org/x/text/collate/collate_test.go new file mode 100644 index 0000000000..a79ef4bebb --- /dev/null +++ b/vendor/golang.org/x/text/collate/collate_test.go @@ -0,0 +1,479 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package collate + +import ( + "bytes" + "testing" + + "golang.org/x/text/collate/colltab" + "golang.org/x/text/language" +) + +type weightsTest struct { + opt opts + in, out ColElems +} + +type opts struct { + lev int + alt alternateHandling + top int + + backwards bool + caseLevel bool +} + +// ignore returns an initialized boolean array based on the given Level. +// A negative value means using the default setting of quaternary. +func ignore(level colltab.Level) (ignore [colltab.NumLevels]bool) { + if level < 0 { + level = colltab.Quaternary + } + for i := range ignore { + ignore[i] = level < colltab.Level(i) + } + return ignore +} + +func makeCE(w []int) colltab.Elem { + ce, err := colltab.MakeElem(w[0], w[1], w[2], uint8(w[3])) + if err != nil { + panic(err) + } + return ce +} + +func (o opts) collator() *Collator { + c := &Collator{ + options: options{ + ignore: ignore(colltab.Level(o.lev - 1)), + alternate: o.alt, + backwards: o.backwards, + caseLevel: o.caseLevel, + variableTop: uint32(o.top), + }, + } + return c +} + +const ( + maxQ = 0x1FFFFF +) + +func wpq(p, q int) Weights { + return W(p, defaults.Secondary, defaults.Tertiary, q) +} + +func wsq(s, q int) Weights { + return W(0, s, defaults.Tertiary, q) +} + +func wq(q int) Weights { + return W(0, 0, 0, q) +} + +var zero = W(0, 0, 0, 0) + +var processTests = []weightsTest{ + // Shifted + { // simple sequence of non-variables + opt: opts{alt: altShifted, top: 100}, + in: ColElems{W(200), W(300), W(400)}, + out: ColElems{wpq(200, maxQ), wpq(300, maxQ), wpq(400, maxQ)}, + }, + { // first is a variable + opt: opts{alt: altShifted, top: 250}, + in: ColElems{W(200), W(300), W(400)}, + out: ColElems{wq(200), wpq(300, maxQ), wpq(400, maxQ)}, + }, + { // all but first are variable + opt: opts{alt: altShifted, top: 999}, + in: ColElems{W(1000), W(200), W(300), W(400)}, + out: ColElems{wpq(1000, maxQ), wq(200), wq(300), wq(400)}, + }, + { // first is a modifier + opt: opts{alt: altShifted, top: 999}, + in: ColElems{W(0, 10), W(1000)}, + out: ColElems{wsq(10, maxQ), wpq(1000, maxQ)}, + }, + { // primary ignorables + opt: opts{alt: altShifted, top: 250}, + in: ColElems{W(200), W(0, 10), W(300), W(0, 15), W(400)}, + out: ColElems{wq(200), zero, wpq(300, maxQ), wsq(15, maxQ), wpq(400, maxQ)}, + }, + { // secondary ignorables + opt: opts{alt: altShifted, top: 250}, + in: ColElems{W(200), W(0, 0, 10), W(300), W(0, 0, 15), W(400)}, + out: ColElems{wq(200), zero, wpq(300, maxQ), W(0, 0, 15, maxQ), wpq(400, maxQ)}, + }, + { // tertiary ignorables, no change + opt: opts{alt: altShifted, top: 250}, + in: ColElems{W(200), zero, W(300), zero, W(400)}, + out: ColElems{wq(200), zero, wpq(300, maxQ), zero, wpq(400, maxQ)}, + }, + + // ShiftTrimmed (same as Shifted) + { // simple sequence of non-variables + opt: opts{alt: altShiftTrimmed, top: 100}, + in: ColElems{W(200), W(300), W(400)}, + out: ColElems{wpq(200, maxQ), wpq(300, maxQ), wpq(400, maxQ)}, + }, + { // first is a variable + opt: opts{alt: altShiftTrimmed, top: 250}, + in: ColElems{W(200), W(300), W(400)}, + out: ColElems{wq(200), wpq(300, maxQ), wpq(400, maxQ)}, + }, + { // all but first are variable + opt: opts{alt: altShiftTrimmed, top: 999}, + in: ColElems{W(1000), W(200), W(300), W(400)}, + out: ColElems{wpq(1000, maxQ), wq(200), wq(300), wq(400)}, + }, + { // first is a modifier + opt: opts{alt: altShiftTrimmed, top: 999}, + in: ColElems{W(0, 10), W(1000)}, + out: ColElems{wsq(10, maxQ), wpq(1000, maxQ)}, + }, + { // primary ignorables + opt: opts{alt: altShiftTrimmed, top: 250}, + in: ColElems{W(200), W(0, 10), W(300), W(0, 15), W(400)}, + out: ColElems{wq(200), zero, wpq(300, maxQ), wsq(15, maxQ), wpq(400, maxQ)}, + }, + { // secondary ignorables + opt: opts{alt: altShiftTrimmed, top: 250}, + in: ColElems{W(200), W(0, 0, 10), W(300), W(0, 0, 15), W(400)}, + out: ColElems{wq(200), zero, wpq(300, maxQ), W(0, 0, 15, maxQ), wpq(400, maxQ)}, + }, + { // tertiary ignorables, no change + opt: opts{alt: altShiftTrimmed, top: 250}, + in: ColElems{W(200), zero, W(300), zero, W(400)}, + out: ColElems{wq(200), zero, wpq(300, maxQ), zero, wpq(400, maxQ)}, + }, + + // Blanked + { // simple sequence of non-variables + opt: opts{alt: altBlanked, top: 100}, + in: ColElems{W(200), W(300), W(400)}, + out: ColElems{W(200), W(300), W(400)}, + }, + { // first is a variable + opt: opts{alt: altBlanked, top: 250}, + in: ColElems{W(200), W(300), W(400)}, + out: ColElems{zero, W(300), W(400)}, + }, + { // all but first are variable + opt: opts{alt: altBlanked, top: 999}, + in: ColElems{W(1000), W(200), W(300), W(400)}, + out: ColElems{W(1000), zero, zero, zero}, + }, + { // first is a modifier + opt: opts{alt: altBlanked, top: 999}, + in: ColElems{W(0, 10), W(1000)}, + out: ColElems{W(0, 10), W(1000)}, + }, + { // primary ignorables + opt: opts{alt: altBlanked, top: 250}, + in: ColElems{W(200), W(0, 10), W(300), W(0, 15), W(400)}, + out: ColElems{zero, zero, W(300), W(0, 15), W(400)}, + }, + { // secondary ignorables + opt: opts{alt: altBlanked, top: 250}, + in: ColElems{W(200), W(0, 0, 10), W(300), W(0, 0, 15), W(400)}, + out: ColElems{zero, zero, W(300), W(0, 0, 15), W(400)}, + }, + { // tertiary ignorables, no change + opt: opts{alt: altBlanked, top: 250}, + in: ColElems{W(200), zero, W(300), zero, W(400)}, + out: ColElems{zero, zero, W(300), zero, W(400)}, + }, + + // Non-ignorable: input is always equal to output. + { // all but first are variable + opt: opts{alt: altNonIgnorable, top: 999}, + in: ColElems{W(1000), W(200), W(300), W(400)}, + out: ColElems{W(1000), W(200), W(300), W(400)}, + }, + { // primary ignorables + opt: opts{alt: altNonIgnorable, top: 250}, + in: ColElems{W(200), W(0, 10), W(300), W(0, 15), W(400)}, + out: ColElems{W(200), W(0, 10), W(300), W(0, 15), W(400)}, + }, + { // secondary ignorables + opt: opts{alt: altNonIgnorable, top: 250}, + in: ColElems{W(200), W(0, 0, 10), W(300), W(0, 0, 15), W(400)}, + out: ColElems{W(200), W(0, 0, 10), W(300), W(0, 0, 15), W(400)}, + }, + { // tertiary ignorables, no change + opt: opts{alt: altNonIgnorable, top: 250}, + in: ColElems{W(200), zero, W(300), zero, W(400)}, + out: ColElems{W(200), zero, W(300), zero, W(400)}, + }, +} + +func TestProcessWeights(t *testing.T) { + for i, tt := range processTests { + in := convertFromWeights(tt.in) + out := convertFromWeights(tt.out) + processWeights(tt.opt.alt, uint32(tt.opt.top), in) + for j, w := range in { + if w != out[j] { + t.Errorf("%d: Weights %d was %v; want %v", i, j, w, out[j]) + } + } + } +} + +type keyFromElemTest struct { + opt opts + in ColElems + out []byte +} + +var defS = byte(defaults.Secondary) +var defT = byte(defaults.Tertiary) + +const sep = 0 // separator byte + +var keyFromElemTests = []keyFromElemTest{ + { // simple primary and secondary weights. + opts{alt: altShifted}, + ColElems{W(0x200), W(0x7FFF), W(0, 0x30), W(0x100)}, + []byte{0x2, 0, 0x7F, 0xFF, 0x1, 0x00, // primary + sep, sep, 0, defS, 0, defS, 0, 0x30, 0, defS, // secondary + sep, sep, defT, defT, defT, defT, // tertiary + sep, 0xFF, 0xFF, 0xFF, 0xFF, // quaternary + }, + }, + { // same as first, but with zero element that need to be removed + opts{alt: altShifted}, + ColElems{W(0x200), zero, W(0x7FFF), W(0, 0x30), zero, W(0x100)}, + []byte{0x2, 0, 0x7F, 0xFF, 0x1, 0x00, // primary + sep, sep, 0, defS, 0, defS, 0, 0x30, 0, defS, // secondary + sep, sep, defT, defT, defT, defT, // tertiary + sep, 0xFF, 0xFF, 0xFF, 0xFF, // quaternary + }, + }, + { // same as first, with large primary values + opts{alt: altShifted}, + ColElems{W(0x200), W(0x8000), W(0, 0x30), W(0x12345)}, + []byte{0x2, 0, 0x80, 0x80, 0x00, 0x81, 0x23, 0x45, // primary + sep, sep, 0, defS, 0, defS, 0, 0x30, 0, defS, // secondary + sep, sep, defT, defT, defT, defT, // tertiary + sep, 0xFF, 0xFF, 0xFF, 0xFF, // quaternary + }, + }, + { // same as first, but with the secondary level backwards + opts{alt: altShifted, backwards: true}, + ColElems{W(0x200), W(0x7FFF), W(0, 0x30), W(0x100)}, + []byte{0x2, 0, 0x7F, 0xFF, 0x1, 0x00, // primary + sep, sep, 0, defS, 0, 0x30, 0, defS, 0, defS, // secondary + sep, sep, defT, defT, defT, defT, // tertiary + sep, 0xFF, 0xFF, 0xFF, 0xFF, // quaternary + }, + }, + { // same as first, ignoring quaternary level + opts{alt: altShifted, lev: 3}, + ColElems{W(0x200), zero, W(0x7FFF), W(0, 0x30), zero, W(0x100)}, + []byte{0x2, 0, 0x7F, 0xFF, 0x1, 0x00, // primary + sep, sep, 0, defS, 0, defS, 0, 0x30, 0, defS, // secondary + sep, sep, defT, defT, defT, defT, // tertiary + }, + }, + { // same as first, ignoring tertiary level + opts{alt: altShifted, lev: 2}, + ColElems{W(0x200), zero, W(0x7FFF), W(0, 0x30), zero, W(0x100)}, + []byte{0x2, 0, 0x7F, 0xFF, 0x1, 0x00, // primary + sep, sep, 0, defS, 0, defS, 0, 0x30, 0, defS, // secondary + }, + }, + { // same as first, ignoring secondary level + opts{alt: altShifted, lev: 1}, + ColElems{W(0x200), zero, W(0x7FFF), W(0, 0x30), zero, W(0x100)}, + []byte{0x2, 0, 0x7F, 0xFF, 0x1, 0x00}, + }, + { // simple primary and secondary weights. + opts{alt: altShiftTrimmed, top: 0x250}, + ColElems{W(0x300), W(0x200), W(0x7FFF), W(0, 0x30), W(0x800)}, + []byte{0x3, 0, 0x7F, 0xFF, 0x8, 0x00, // primary + sep, sep, 0, defS, 0, defS, 0, 0x30, 0, defS, // secondary + sep, sep, defT, defT, defT, defT, // tertiary + sep, 0xFF, 0x2, 0, // quaternary + }, + }, + { // as first, primary with case level enabled + opts{alt: altShifted, lev: 1, caseLevel: true}, + ColElems{W(0x200), W(0x7FFF), W(0, 0x30), W(0x100)}, + []byte{0x2, 0, 0x7F, 0xFF, 0x1, 0x00, // primary + sep, sep, // secondary + sep, sep, defT, defT, defT, defT, // tertiary + }, + }, +} + +func TestKeyFromElems(t *testing.T) { + buf := Buffer{} + for i, tt := range keyFromElemTests { + buf.Reset() + in := convertFromWeights(tt.in) + processWeights(tt.opt.alt, uint32(tt.opt.top), in) + tt.opt.collator().keyFromElems(&buf, in) + res := buf.key + if len(res) != len(tt.out) { + t.Errorf("%d: len(ws) was %d; want %d (%X should be %X)", i, len(res), len(tt.out), res, tt.out) + } + n := len(res) + if len(tt.out) < n { + n = len(tt.out) + } + for j, c := range res[:n] { + if c != tt.out[j] { + t.Errorf("%d: byte %d was %X; want %X", i, j, c, tt.out[j]) + } + } + } +} + +func TestGetColElems(t *testing.T) { + for i, tt := range appendNextTests { + c, err := makeTable(tt.in) + if err != nil { + // error is reported in TestAppendNext + continue + } + // Create one large test per table + str := make([]byte, 0, 4000) + out := ColElems{} + for len(str) < 3000 { + for _, chk := range tt.chk { + str = append(str, chk.in[:chk.n]...) + out = append(out, chk.out...) + } + } + for j, chk := range append(tt.chk, check{string(str), len(str), out}) { + out := convertFromWeights(chk.out) + ce := c.getColElems([]byte(chk.in)[:chk.n]) + if len(ce) != len(out) { + t.Errorf("%d:%d: len(ws) was %d; want %d", i, j, len(ce), len(out)) + continue + } + cnt := 0 + for k, w := range ce { + w, _ = colltab.MakeElem(w.Primary(), w.Secondary(), int(w.Tertiary()), 0) + if w != out[k] { + t.Errorf("%d:%d: Weights %d was %X; want %X", i, j, k, w, out[k]) + cnt++ + } + if cnt > 10 { + break + } + } + } + } +} + +type keyTest struct { + in string + out []byte +} + +var keyTests = []keyTest{ + {"abc", + []byte{0, 100, 0, 200, 1, 44, 0, 0, 0, 32, 0, 32, 0, 32, 0, 0, 2, 2, 2, 0, 255, 255, 255}, + }, + {"a\u0301", + []byte{0, 102, 0, 0, 0, 32, 0, 0, 2, 0, 255}, + }, + {"aaaaa", + []byte{0, 100, 0, 100, 0, 100, 0, 100, 0, 100, 0, 0, + 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 0, + 2, 2, 2, 2, 2, 0, + 255, 255, 255, 255, 255, + }, + }, +} + +func TestKey(t *testing.T) { + c, _ := makeTable(appendNextTests[4].in) + c.alternate = altShifted + c.ignore = ignore(colltab.Quaternary) + buf := Buffer{} + keys1 := [][]byte{} + keys2 := [][]byte{} + for _, tt := range keyTests { + keys1 = append(keys1, c.Key(&buf, []byte(tt.in))) + keys2 = append(keys2, c.KeyFromString(&buf, tt.in)) + } + // Separate generation from testing to ensure buffers are not overwritten. + for i, tt := range keyTests { + if !bytes.Equal(keys1[i], tt.out) { + t.Errorf("%d: Key(%q) = %d; want %d", i, tt.in, keys1[i], tt.out) + } + if !bytes.Equal(keys2[i], tt.out) { + t.Errorf("%d: KeyFromString(%q) = %d; want %d", i, tt.in, keys2[i], tt.out) + } + } +} + +type compareTest struct { + a, b string + res int // comparison result +} + +var compareTests = []compareTest{ + {"a\u0301", "a", 1}, + {"a\u0301b", "ab", 1}, + {"a", "a\u0301", -1}, + {"ab", "a\u0301b", -1}, + {"bc", "a\u0301c", 1}, + {"ab", "aB", -1}, + {"a\u0301", "a\u0301", 0}, + {"a", "a", 0}, + // Only clip prefixes of whole runes. + {"\u302E", "\u302F", 1}, + // Don't clip prefixes when last rune of prefix may be part of contraction. + {"a\u035E", "a\u0301\u035F", -1}, + {"a\u0301\u035Fb", "a\u0301\u035F", -1}, +} + +func TestCompare(t *testing.T) { + c, _ := makeTable(appendNextTests[4].in) + for i, tt := range compareTests { + if res := c.Compare([]byte(tt.a), []byte(tt.b)); res != tt.res { + t.Errorf("%d: Compare(%q, %q) == %d; want %d", i, tt.a, tt.b, res, tt.res) + } + if res := c.CompareString(tt.a, tt.b); res != tt.res { + t.Errorf("%d: CompareString(%q, %q) == %d; want %d", i, tt.a, tt.b, res, tt.res) + } + } +} + +func TestNumeric(t *testing.T) { + c := New(language.English, Loose, Numeric) + + for i, tt := range []struct { + a, b string + want int + }{ + {"1", "2", -1}, + {"2", "12", -1}, + {"2", "12", -1}, // Fullwidth is sorted as usual. + {"₂", "₁₂", 1}, // Subscript is not sorted as numbers. + {"②", "①②", 1}, // Circled is not sorted as numbers. + { // Imperial Aramaic, is not sorted as number. + "\U00010859", + "\U00010858\U00010859", + 1, + }, + {"12", "2", 1}, + {"A-1", "A-2", -1}, + {"A-2", "A-12", -1}, + {"A-12", "A-2", 1}, + {"A-0001", "A-1", 0}, + } { + if got := c.CompareString(tt.a, tt.b); got != tt.want { + t.Errorf("%d: CompareString(%s, %s) = %d; want %d", i, tt.a, tt.b, got, tt.want) + } + } +} diff --git a/vendor/golang.org/x/text/collate/colltab/collate_test.go b/vendor/golang.org/x/text/collate/colltab/collate_test.go new file mode 100644 index 0000000000..580c85c22d --- /dev/null +++ b/vendor/golang.org/x/text/collate/colltab/collate_test.go @@ -0,0 +1,121 @@ +// 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 colltab_test + +// This file contains tests which need to import package collate, which causes +// an import cycle when done within package colltab itself. + +import ( + "bytes" + "testing" + "unicode" + + "golang.org/x/text/collate" + "golang.org/x/text/language" + "golang.org/x/text/unicode/rangetable" +) + +// assigned is used to only test runes that are inside the scope of the Unicode +// version used to generation the collation table. +var assigned = rangetable.Assigned(collate.UnicodeVersion) + +func TestNonDigits(t *testing.T) { + c := collate.New(language.English, collate.Loose, collate.Numeric) + + // Verify that all non-digit numbers sort outside of the number range. + for r, hi := rune(unicode.N.R16[0].Lo), rune(unicode.N.R32[0].Hi); r <= hi; r++ { + if unicode.In(r, unicode.Nd) || !unicode.In(r, assigned) { + continue + } + if a := string(r); c.CompareString(a, "0") != -1 && c.CompareString(a, "999999") != 1 { + t.Errorf("%+q non-digit number is collated as digit", a) + } + } +} + +func TestNumericCompare(t *testing.T) { + c := collate.New(language.English, collate.Loose, collate.Numeric) + + // Iterate over all digits. + for _, r16 := range unicode.Nd.R16 { + testDigitCompare(t, c, rune(r16.Lo), rune(r16.Hi)) + } + for _, r32 := range unicode.Nd.R32 { + testDigitCompare(t, c, rune(r32.Lo), rune(r32.Hi)) + } +} + +func testDigitCompare(t *testing.T, c *collate.Collator, zero, nine rune) { + if !unicode.In(zero, assigned) { + return + } + n := int(nine - zero + 1) + if n%10 != 0 { + t.Fatalf("len([%+q, %+q]) = %d; want a multiple of 10", zero, nine, n) + } + for _, tt := range []struct { + prefix string + b [11]string + }{ + { + prefix: "", + b: [11]string{ + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", + }, + }, + { + prefix: "1", + b: [11]string{ + "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", + }, + }, + { + prefix: "0", + b: [11]string{ + "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", + }, + }, + { + prefix: "00", + b: [11]string{ + "000", "001", "002", "003", "004", "005", "006", "007", "008", "009", "010", + }, + }, + { + prefix: "9", + b: [11]string{ + "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "100", + }, + }, + } { + for k := 0; k <= n; k++ { + i := k % 10 + a := tt.prefix + string(zero+rune(i)) + for j, b := range tt.b { + want := 0 + switch { + case i < j: + want = -1 + case i > j: + want = 1 + } + got := c.CompareString(a, b) + if got != want { + t.Errorf("Compare(%+q, %+q) = %d; want %d", a, b, got, want) + return + } + } + } + } +} + +func BenchmarkNumericWeighter(b *testing.B) { + c := collate.New(language.English, collate.Numeric) + input := bytes.Repeat([]byte("Testing, testing 123..."), 100) + b.SetBytes(int64(2 * len(input))) + for i := 0; i < b.N; i++ { + c.Compare(input, input) + } +} diff --git a/vendor/golang.org/x/text/collate/colltab/collelem.go b/vendor/golang.org/x/text/collate/colltab/collelem.go new file mode 100644 index 0000000000..880952c3e9 --- /dev/null +++ b/vendor/golang.org/x/text/collate/colltab/collelem.go @@ -0,0 +1,371 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package colltab + +import ( + "fmt" + "unicode" +) + +// Level identifies the collation comparison level. +// The primary level corresponds to the basic sorting of text. +// The secondary level corresponds to accents and related linguistic elements. +// The tertiary level corresponds to casing and related concepts. +// The quaternary level is derived from the other levels by the +// various algorithms for handling variable elements. +type Level int + +const ( + Primary Level = iota + Secondary + Tertiary + Quaternary + Identity + + NumLevels +) + +const ( + defaultSecondary = 0x20 + defaultTertiary = 0x2 + maxTertiary = 0x1F + MaxQuaternary = 0x1FFFFF // 21 bits. +) + +// Elem is a representation of a collation element. This API provides ways to encode +// and decode Elems. Implementations of collation tables may use values greater +// or equal to PrivateUse for their own purposes. However, these should never be +// returned by AppendNext. +type Elem uint32 + +const ( + maxCE Elem = 0xAFFFFFFF + PrivateUse = minContract + minContract = 0xC0000000 + maxContract = 0xDFFFFFFF + minExpand = 0xE0000000 + maxExpand = 0xEFFFFFFF + minDecomp = 0xF0000000 +) + +type ceType int + +const ( + ceNormal ceType = iota // ceNormal includes implicits (ce == 0) + ceContractionIndex // rune can be a start of a contraction + ceExpansionIndex // rune expands into a sequence of collation elements + ceDecompose // rune expands using NFKC decomposition +) + +func (ce Elem) ctype() ceType { + if ce <= maxCE { + return ceNormal + } + if ce <= maxContract { + return ceContractionIndex + } else { + if ce <= maxExpand { + return ceExpansionIndex + } + return ceDecompose + } + panic("should not reach here") + return ceType(-1) +} + +// For normal collation elements, we assume that a collation element either has +// a primary or non-default secondary value, not both. +// Collation elements with a primary value are of the form +// 01pppppp pppppppp ppppppp0 ssssssss +// - p* is primary collation value +// - s* is the secondary collation value +// 00pppppp pppppppp ppppppps sssttttt, where +// - p* is primary collation value +// - s* offset of secondary from default value. +// - t* is the tertiary collation value +// 100ttttt cccccccc pppppppp pppppppp +// - t* is the tertiar collation value +// - c* is the cannonical combining class +// - p* is the primary collation value +// Collation elements with a secondary value are of the form +// 1010cccc ccccssss ssssssss tttttttt, where +// - c* is the canonical combining class +// - s* is the secondary collation value +// - t* is the tertiary collation value +// 11qqqqqq qqqqqqqq qqqqqqq0 00000000 +// - q* quaternary value +const ( + ceTypeMask = 0xC0000000 + ceTypeMaskExt = 0xE0000000 + ceIgnoreMask = 0xF00FFFFF + ceType1 = 0x40000000 + ceType2 = 0x00000000 + ceType3or4 = 0x80000000 + ceType4 = 0xA0000000 + ceTypeQ = 0xC0000000 + Ignore = ceType4 + firstNonPrimary = 0x80000000 + lastSpecialPrimary = 0xA0000000 + secondaryMask = 0x80000000 + hasTertiaryMask = 0x40000000 + primaryValueMask = 0x3FFFFE00 + maxPrimaryBits = 21 + compactPrimaryBits = 16 + maxSecondaryBits = 12 + maxTertiaryBits = 8 + maxCCCBits = 8 + maxSecondaryCompactBits = 8 + maxSecondaryDiffBits = 4 + maxTertiaryCompactBits = 5 + primaryShift = 9 + compactSecondaryShift = 5 + minCompactSecondary = defaultSecondary - 4 +) + +func makeImplicitCE(primary int) Elem { + return ceType1 | Elem(primary<<primaryShift) | defaultSecondary +} + +// MakeElem returns an Elem for the given values. It will return an error +// if the given combination of values is invalid. +func MakeElem(primary, secondary, tertiary int, ccc uint8) (Elem, error) { + if w := primary; w >= 1<<maxPrimaryBits || w < 0 { + return 0, fmt.Errorf("makeCE: primary weight out of bounds: %x >= %x", w, 1<<maxPrimaryBits) + } + if w := secondary; w >= 1<<maxSecondaryBits || w < 0 { + return 0, fmt.Errorf("makeCE: secondary weight out of bounds: %x >= %x", w, 1<<maxSecondaryBits) + } + if w := tertiary; w >= 1<<maxTertiaryBits || w < 0 { + return 0, fmt.Errorf("makeCE: tertiary weight out of bounds: %x >= %x", w, 1<<maxTertiaryBits) + } + ce := Elem(0) + if primary != 0 { + if ccc != 0 { + if primary >= 1<<compactPrimaryBits { + return 0, fmt.Errorf("makeCE: primary weight with non-zero CCC out of bounds: %x >= %x", primary, 1<<compactPrimaryBits) + } + if secondary != defaultSecondary { + return 0, fmt.Errorf("makeCE: cannot combine non-default secondary value (%x) with non-zero CCC (%x)", secondary, ccc) + } + ce = Elem(tertiary << (compactPrimaryBits + maxCCCBits)) + ce |= Elem(ccc) << compactPrimaryBits + ce |= Elem(primary) + ce |= ceType3or4 + } else if tertiary == defaultTertiary { + if secondary >= 1<<maxSecondaryCompactBits { + return 0, fmt.Errorf("makeCE: secondary weight with non-zero primary out of bounds: %x >= %x", secondary, 1<<maxSecondaryCompactBits) + } + ce = Elem(primary<<(maxSecondaryCompactBits+1) + secondary) + ce |= ceType1 + } else { + d := secondary - defaultSecondary + maxSecondaryDiffBits + if d >= 1<<maxSecondaryDiffBits || d < 0 { + return 0, fmt.Errorf("makeCE: secondary weight diff out of bounds: %x < 0 || %x > %x", d, d, 1<<maxSecondaryDiffBits) + } + if tertiary >= 1<<maxTertiaryCompactBits { + return 0, fmt.Errorf("makeCE: tertiary weight with non-zero primary out of bounds: %x > %x", tertiary, 1<<maxTertiaryCompactBits) + } + ce = Elem(primary<<maxSecondaryDiffBits + d) + ce = ce<<maxTertiaryCompactBits + Elem(tertiary) + } + } else { + ce = Elem(secondary<<maxTertiaryBits + tertiary) + ce += Elem(ccc) << (maxSecondaryBits + maxTertiaryBits) + ce |= ceType4 + } + return ce, nil +} + +// MakeQuaternary returns an Elem with the given quaternary value. +func MakeQuaternary(v int) Elem { + return ceTypeQ | Elem(v<<primaryShift) +} + +// Mask sets weights for any level smaller than l to 0. +// The resulting Elem can be used to test for equality with +// other Elems to which the same mask has been applied. +func (ce Elem) Mask(l Level) uint32 { + return 0 +} + +// CCC returns the canonical combining class associated with the underlying character, +// if applicable, or 0 otherwise. +func (ce Elem) CCC() uint8 { + if ce&ceType3or4 != 0 { + if ce&ceType4 == ceType3or4 { + return uint8(ce >> 16) + } + return uint8(ce >> 20) + } + return 0 +} + +// Primary returns the primary collation weight for ce. +func (ce Elem) Primary() int { + if ce >= firstNonPrimary { + if ce > lastSpecialPrimary { + return 0 + } + return int(uint16(ce)) + } + return int(ce&primaryValueMask) >> primaryShift +} + +// Secondary returns the secondary collation weight for ce. +func (ce Elem) Secondary() int { + switch ce & ceTypeMask { + case ceType1: + return int(uint8(ce)) + case ceType2: + return minCompactSecondary + int((ce>>compactSecondaryShift)&0xF) + case ceType3or4: + if ce < ceType4 { + return defaultSecondary + } + return int(ce>>8) & 0xFFF + case ceTypeQ: + return 0 + } + panic("should not reach here") +} + +// Tertiary returns the tertiary collation weight for ce. +func (ce Elem) Tertiary() uint8 { + if ce&hasTertiaryMask == 0 { + if ce&ceType3or4 == 0 { + return uint8(ce & 0x1F) + } + if ce&ceType4 == ceType4 { + return uint8(ce) + } + return uint8(ce>>24) & 0x1F // type 2 + } else if ce&ceTypeMask == ceType1 { + return defaultTertiary + } + // ce is a quaternary value. + return 0 +} + +func (ce Elem) updateTertiary(t uint8) Elem { + if ce&ceTypeMask == ceType1 { + // convert to type 4 + nce := ce & primaryValueMask + nce |= Elem(uint8(ce)-minCompactSecondary) << compactSecondaryShift + ce = nce + } else if ce&ceTypeMaskExt == ceType3or4 { + ce &= ^Elem(maxTertiary << 24) + return ce | (Elem(t) << 24) + } else { + // type 2 or 4 + ce &= ^Elem(maxTertiary) + } + return ce | Elem(t) +} + +// Quaternary returns the quaternary value if explicitly specified, +// 0 if ce == Ignore, or MaxQuaternary otherwise. +// Quaternary values are used only for shifted variants. +func (ce Elem) Quaternary() int { + if ce&ceTypeMask == ceTypeQ { + return int(ce&primaryValueMask) >> primaryShift + } else if ce&ceIgnoreMask == Ignore { + return 0 + } + return MaxQuaternary +} + +// Weight returns the collation weight for the given level. +func (ce Elem) Weight(l Level) int { + switch l { + case Primary: + return ce.Primary() + case Secondary: + return ce.Secondary() + case Tertiary: + return int(ce.Tertiary()) + case Quaternary: + return ce.Quaternary() + } + return 0 // return 0 (ignore) for undefined levels. +} + +// For contractions, collation elements are of the form +// 110bbbbb bbbbbbbb iiiiiiii iiiinnnn, where +// - n* is the size of the first node in the contraction trie. +// - i* is the index of the first node in the contraction trie. +// - b* is the offset into the contraction collation element table. +// See contract.go for details on the contraction trie. +const ( + maxNBits = 4 + maxTrieIndexBits = 12 + maxContractOffsetBits = 13 +) + +func splitContractIndex(ce Elem) (index, n, offset int) { + n = int(ce & (1<<maxNBits - 1)) + ce >>= maxNBits + index = int(ce & (1<<maxTrieIndexBits - 1)) + ce >>= maxTrieIndexBits + offset = int(ce & (1<<maxContractOffsetBits - 1)) + return +} + +// For expansions, Elems are of the form 11100000 00000000 bbbbbbbb bbbbbbbb, +// where b* is the index into the expansion sequence table. +const maxExpandIndexBits = 16 + +func splitExpandIndex(ce Elem) (index int) { + return int(uint16(ce)) +} + +// Some runes can be expanded using NFKD decomposition. Instead of storing the full +// sequence of collation elements, we decompose the rune and lookup the collation +// elements for each rune in the decomposition and modify the tertiary weights. +// The Elem, in this case, is of the form 11110000 00000000 wwwwwwww vvvvvvvv, where +// - v* is the replacement tertiary weight for the first rune, +// - w* is the replacement tertiary weight for the second rune, +// Tertiary weights of subsequent runes should be replaced with maxTertiary. +// See http://www.unicode.org/reports/tr10/#Compatibility_Decompositions for more details. +func splitDecompose(ce Elem) (t1, t2 uint8) { + return uint8(ce), uint8(ce >> 8) +} + +const ( + // These constants were taken from http://www.unicode.org/versions/Unicode6.0.0/ch12.pdf. + minUnified rune = 0x4E00 + maxUnified = 0x9FFF + minCompatibility = 0xF900 + maxCompatibility = 0xFAFF + minRare = 0x3400 + maxRare = 0x4DBF +) +const ( + commonUnifiedOffset = 0x10000 + rareUnifiedOffset = 0x20000 // largest rune in common is U+FAFF + otherOffset = 0x50000 // largest rune in rare is U+2FA1D + illegalOffset = otherOffset + int(unicode.MaxRune) + maxPrimary = illegalOffset + 1 +) + +// implicitPrimary returns the primary weight for the a rune +// for which there is no entry for the rune in the collation table. +// We take a different approach from the one specified in +// http://unicode.org/reports/tr10/#Implicit_Weights, +// but preserve the resulting relative ordering of the runes. +func implicitPrimary(r rune) int { + if unicode.Is(unicode.Ideographic, r) { + if r >= minUnified && r <= maxUnified { + // The most common case for CJK. + return int(r) + commonUnifiedOffset + } + if r >= minCompatibility && r <= maxCompatibility { + // This will typically not hit. The DUCET explicitly specifies mappings + // for all characters that do not decompose. + return int(r) + commonUnifiedOffset + } + return int(r) + rareUnifiedOffset + } + return int(r) + otherOffset +} diff --git a/vendor/golang.org/x/text/collate/colltab/collelem_test.go b/vendor/golang.org/x/text/collate/colltab/collelem_test.go new file mode 100644 index 0000000000..f131ecc32d --- /dev/null +++ b/vendor/golang.org/x/text/collate/colltab/collelem_test.go @@ -0,0 +1,183 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package colltab + +import ( + "fmt" + "testing" + "unicode" +) + +func (e Elem) String() string { + q := "" + if v := e.Quaternary(); v == MaxQuaternary { + q = "max" + } else { + q = fmt.Sprint(v) + } + return fmt.Sprintf("[%d, %d, %d, %s]", + e.Primary(), + e.Secondary(), + e.Tertiary(), + q) +} + +type ceTest struct { + f func(inout []int) (Elem, ceType) + arg []int +} + +func makeCE(weights []int) Elem { + ce, _ := MakeElem(weights[0], weights[1], weights[2], uint8(weights[3])) + return ce +} + +var defaultValues = []int{0, defaultSecondary, defaultTertiary, 0} + +func e(w ...int) Elem { + return makeCE(append(w, defaultValues[len(w):]...)) +} + +func makeContractIndex(index, n, offset int) Elem { + const ( + contractID = 0xC0000000 + maxNBits = 4 + maxTrieIndexBits = 12 + maxContractOffsetBits = 13 + ) + ce := Elem(contractID) + ce += Elem(offset << (maxNBits + maxTrieIndexBits)) + ce += Elem(index << maxNBits) + ce += Elem(n) + return ce +} + +func makeExpandIndex(index int) Elem { + const expandID = 0xE0000000 + return expandID + Elem(index) +} + +func makeDecompose(t1, t2 int) Elem { + const decompID = 0xF0000000 + return Elem(t2<<8+t1) + decompID +} + +func normalCE(inout []int) (ce Elem, t ceType) { + ce = makeCE(inout) + inout[0] = ce.Primary() + inout[1] = ce.Secondary() + inout[2] = int(ce.Tertiary()) + inout[3] = int(ce.CCC()) + return ce, ceNormal +} + +func expandCE(inout []int) (ce Elem, t ceType) { + ce = makeExpandIndex(inout[0]) + inout[0] = splitExpandIndex(ce) + return ce, ceExpansionIndex +} + +func contractCE(inout []int) (ce Elem, t ceType) { + ce = makeContractIndex(inout[0], inout[1], inout[2]) + i, n, o := splitContractIndex(ce) + inout[0], inout[1], inout[2] = i, n, o + return ce, ceContractionIndex +} + +func decompCE(inout []int) (ce Elem, t ceType) { + ce = makeDecompose(inout[0], inout[1]) + t1, t2 := splitDecompose(ce) + inout[0], inout[1] = int(t1), int(t2) + return ce, ceDecompose +} + +var ceTests = []ceTest{ + {normalCE, []int{0, 0, 0, 0}}, + {normalCE, []int{0, 30, 3, 0}}, + {normalCE, []int{0, 30, 3, 0xFF}}, + {normalCE, []int{100, defaultSecondary, defaultTertiary, 0}}, + {normalCE, []int{100, defaultSecondary, defaultTertiary, 0xFF}}, + {normalCE, []int{100, defaultSecondary, 3, 0}}, + {normalCE, []int{0x123, defaultSecondary, 8, 0xFF}}, + + {contractCE, []int{0, 0, 0}}, + {contractCE, []int{1, 1, 1}}, + {contractCE, []int{1, (1 << maxNBits) - 1, 1}}, + {contractCE, []int{(1 << maxTrieIndexBits) - 1, 1, 1}}, + {contractCE, []int{1, 1, (1 << maxContractOffsetBits) - 1}}, + + {expandCE, []int{0}}, + {expandCE, []int{5}}, + {expandCE, []int{(1 << maxExpandIndexBits) - 1}}, + + {decompCE, []int{0, 0}}, + {decompCE, []int{1, 1}}, + {decompCE, []int{0x1F, 0x1F}}, +} + +func TestColElem(t *testing.T) { + for i, tt := range ceTests { + inout := make([]int, len(tt.arg)) + copy(inout, tt.arg) + ce, typ := tt.f(inout) + if ce.ctype() != typ { + t.Errorf("%d: type is %d; want %d (ColElem: %X)", i, ce.ctype(), typ, ce) + } + for j, a := range tt.arg { + if inout[j] != a { + t.Errorf("%d: argument %d is %X; want %X (ColElem: %X)", i, j, inout[j], a, ce) + } + } + } +} + +type implicitTest struct { + r rune + p int +} + +var implicitTests = []implicitTest{ + {0x33FF, 0x533FF}, + {0x3400, 0x23400}, + {0x4DC0, 0x54DC0}, + {0x4DFF, 0x54DFF}, + {0x4E00, 0x14E00}, + {0x9FCB, 0x19FCB}, + {0xA000, 0x5A000}, + {0xF8FF, 0x5F8FF}, + {0xF900, 0x1F900}, + {0xFA23, 0x1FA23}, + {0xFAD9, 0x1FAD9}, + {0xFB00, 0x5FB00}, + {0x20000, 0x40000}, + {0x2B81C, 0x4B81C}, + {unicode.MaxRune, 0x15FFFF}, // maximum primary value +} + +func TestImplicit(t *testing.T) { + for _, tt := range implicitTests { + if p := implicitPrimary(tt.r); p != tt.p { + t.Errorf("%U: was %X; want %X", tt.r, p, tt.p) + } + } +} + +func TestUpdateTertiary(t *testing.T) { + tests := []struct { + in, out Elem + t uint8 + }{ + {0x4000FE20, 0x0000FE8A, 0x0A}, + {0x4000FE21, 0x0000FEAA, 0x0A}, + {0x0000FE8B, 0x0000FE83, 0x03}, + {0x82FF0188, 0x9BFF0188, 0x1B}, + {0xAFF0CC02, 0xAFF0CC1B, 0x1B}, + } + for i, tt := range tests { + if out := tt.in.updateTertiary(tt.t); out != tt.out { + t.Errorf("%d: was %X; want %X", i, out, tt.out) + } + } +} diff --git a/vendor/golang.org/x/text/collate/colltab/colltab.go b/vendor/golang.org/x/text/collate/colltab/colltab.go new file mode 100644 index 0000000000..867d2d0713 --- /dev/null +++ b/vendor/golang.org/x/text/collate/colltab/colltab.go @@ -0,0 +1,31 @@ +// Copyright 2013 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 colltab // import "golang.org/x/text/collate/colltab" + +// A Weighter can be used as a source for Collator and Searcher. +type Weighter interface { + // Start finds the start of the segment that includes position p. + Start(p int, b []byte) int + + // StartString finds the start of the segment that includes position p. + StartString(p int, s string) int + + // AppendNext appends Elems to buf corresponding to the longest match + // of a single character or contraction from the start of s. + // It returns the new buf and the number of bytes consumed. + AppendNext(buf []Elem, s []byte) (ce []Elem, n int) + + // AppendNextString appends Elems to buf corresponding to the longest match + // of a single character or contraction from the start of s. + // It returns the new buf and the number of bytes consumed. + AppendNextString(buf []Elem, s string) (ce []Elem, n int) + + // Domain returns a slice of all single characters and contractions for which + // collation elements are defined in this table. + Domain() []string + + // Top returns the highest variable primary value. + Top() uint32 +} diff --git a/vendor/golang.org/x/text/collate/colltab/colltab_test.go b/vendor/golang.org/x/text/collate/colltab/colltab_test.go new file mode 100644 index 0000000000..b5f8487b33 --- /dev/null +++ b/vendor/golang.org/x/text/collate/colltab/colltab_test.go @@ -0,0 +1,42 @@ +// 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 colltab + +// testWeighter is a simple Weighter that returns weights from a user-defined map. +type testWeighter map[string][]Elem + +func (t testWeighter) Start(int, []byte) int { return 0 } +func (t testWeighter) StartString(int, string) int { return 0 } +func (t testWeighter) Domain() []string { return nil } +func (t testWeighter) Top() uint32 { return 0 } + +// maxContractBytes is the maximum length of any key in the map. +const maxContractBytes = 10 + +func (t testWeighter) AppendNext(buf []Elem, s []byte) ([]Elem, int) { + n := len(s) + if n > maxContractBytes { + n = maxContractBytes + } + for i := n; i > 0; i-- { + if e, ok := t[string(s[:i])]; ok { + return append(buf, e...), i + } + } + panic("incomplete testWeighter: could not find " + string(s)) +} + +func (t testWeighter) AppendNextString(buf []Elem, s string) ([]Elem, int) { + n := len(s) + if n > maxContractBytes { + n = maxContractBytes + } + for i := n; i > 0; i-- { + if e, ok := t[s[:i]]; ok { + return append(buf, e...), i + } + } + panic("incomplete testWeighter: could not find " + s) +} diff --git a/vendor/golang.org/x/text/collate/colltab/contract.go b/vendor/golang.org/x/text/collate/colltab/contract.go new file mode 100644 index 0000000000..86158d0026 --- /dev/null +++ b/vendor/golang.org/x/text/collate/colltab/contract.go @@ -0,0 +1,145 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package colltab + +import "unicode/utf8" + +// For a description of contractTrieSet, see exp/locale/collate/build/contract.go. + +type contractTrieSet []struct{ l, h, n, i uint8 } + +// ctScanner is used to match a trie to an input sequence. +// A contraction may match a non-contiguous sequence of bytes in an input string. +// For example, if there is a contraction for <a, combining_ring>, it should match +// the sequence <a, combining_cedilla, combining_ring>, as combining_cedilla does +// not block combining_ring. +// ctScanner does not automatically skip over non-blocking non-starters, but rather +// retains the state of the last match and leaves it up to the user to continue +// the match at the appropriate points. +type ctScanner struct { + states contractTrieSet + s []byte + n int + index int + pindex int + done bool +} + +type ctScannerString struct { + states contractTrieSet + s string + n int + index int + pindex int + done bool +} + +func (t contractTrieSet) scanner(index, n int, b []byte) ctScanner { + return ctScanner{s: b, states: t[index:], n: n} +} + +func (t contractTrieSet) scannerString(index, n int, str string) ctScannerString { + return ctScannerString{s: str, states: t[index:], n: n} +} + +// result returns the offset i and bytes consumed p so far. If no suffix +// matched, i and p will be 0. +func (s *ctScanner) result() (i, p int) { + return s.index, s.pindex +} + +func (s *ctScannerString) result() (i, p int) { + return s.index, s.pindex +} + +const ( + final = 0 + noIndex = 0xFF +) + +// scan matches the longest suffix at the current location in the input +// and returns the number of bytes consumed. +func (s *ctScanner) scan(p int) int { + pr := p // the p at the rune start + str := s.s + states, n := s.states, s.n + for i := 0; i < n && p < len(str); { + e := states[i] + c := str[p] + // TODO: a significant number of contractions are of a form that + // cannot match discontiguous UTF-8 in a normalized string. We could let + // a negative value of e.n mean that we can set s.done = true and avoid + // the need for additional matches. + if c >= e.l { + if e.l == c { + p++ + if e.i != noIndex { + s.index = int(e.i) + s.pindex = p + } + if e.n != final { + i, states, n = 0, states[int(e.h)+n:], int(e.n) + if p >= len(str) || utf8.RuneStart(str[p]) { + s.states, s.n, pr = states, n, p + } + } else { + s.done = true + return p + } + continue + } else if e.n == final && c <= e.h { + p++ + s.done = true + s.index = int(c-e.l) + int(e.i) + s.pindex = p + return p + } + } + i++ + } + return pr +} + +// scan is a verbatim copy of ctScanner.scan. +func (s *ctScannerString) scan(p int) int { + pr := p // the p at the rune start + str := s.s + states, n := s.states, s.n + for i := 0; i < n && p < len(str); { + e := states[i] + c := str[p] + // TODO: a significant number of contractions are of a form that + // cannot match discontiguous UTF-8 in a normalized string. We could let + // a negative value of e.n mean that we can set s.done = true and avoid + // the need for additional matches. + if c >= e.l { + if e.l == c { + p++ + if e.i != noIndex { + s.index = int(e.i) + s.pindex = p + } + if e.n != final { + i, states, n = 0, states[int(e.h)+n:], int(e.n) + if p >= len(str) || utf8.RuneStart(str[p]) { + s.states, s.n, pr = states, n, p + } + } else { + s.done = true + return p + } + continue + } else if e.n == final && c <= e.h { + p++ + s.done = true + s.index = int(c-e.l) + int(e.i) + s.pindex = p + return p + } + } + i++ + } + return pr +} diff --git a/vendor/golang.org/x/text/collate/colltab/contract_test.go b/vendor/golang.org/x/text/collate/colltab/contract_test.go new file mode 100644 index 0000000000..a8da4e013e --- /dev/null +++ b/vendor/golang.org/x/text/collate/colltab/contract_test.go @@ -0,0 +1,132 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package colltab + +import ( + "testing" +) + +type lookupStrings struct { + str string + offset int + n int // bytes consumed from input +} + +type LookupTest struct { + lookup []lookupStrings + n int + tries contractTrieSet +} + +var lookupTests = []LookupTest{ + {[]lookupStrings{ + {"abc", 1, 3}, + {"a", 0, 0}, + {"b", 0, 0}, + {"c", 0, 0}, + {"d", 0, 0}, + }, + 1, + contractTrieSet{ + {'a', 0, 1, 0xFF}, + {'b', 0, 1, 0xFF}, + {'c', 'c', 0, 1}, + }, + }, + {[]lookupStrings{ + {"abc", 1, 3}, + {"abd", 2, 3}, + {"abe", 3, 3}, + {"a", 0, 0}, + {"ab", 0, 0}, + {"d", 0, 0}, + {"f", 0, 0}, + }, + 1, + contractTrieSet{ + {'a', 0, 1, 0xFF}, + {'b', 0, 1, 0xFF}, + {'c', 'e', 0, 1}, + }, + }, + {[]lookupStrings{ + {"abc", 1, 3}, + {"ab", 2, 2}, + {"a", 3, 1}, + {"abcd", 1, 3}, + {"abe", 2, 2}, + }, + 1, + contractTrieSet{ + {'a', 0, 1, 3}, + {'b', 0, 1, 2}, + {'c', 'c', 0, 1}, + }, + }, + {[]lookupStrings{ + {"abc", 1, 3}, + {"abd", 2, 3}, + {"ab", 3, 2}, + {"ac", 4, 2}, + {"a", 5, 1}, + {"b", 6, 1}, + {"ba", 6, 1}, + }, + 2, + contractTrieSet{ + {'b', 'b', 0, 6}, + {'a', 0, 2, 5}, + {'c', 'c', 0, 4}, + {'b', 0, 1, 3}, + {'c', 'd', 0, 1}, + }, + }, + {[]lookupStrings{ + {"bcde", 2, 4}, + {"bc", 7, 2}, + {"ab", 6, 2}, + {"bcd", 5, 3}, + {"abcd", 1, 4}, + {"abc", 4, 3}, + {"bcdf", 3, 4}, + }, + 2, + contractTrieSet{ + {'b', 3, 1, 0xFF}, + {'a', 0, 1, 0xFF}, + {'b', 0, 1, 6}, + {'c', 0, 1, 4}, + {'d', 'd', 0, 1}, + {'c', 0, 1, 7}, + {'d', 0, 1, 5}, + {'e', 'f', 0, 2}, + }, + }, +} + +func lookup(c *contractTrieSet, nnode int, s []uint8) (i, n int) { + scan := c.scanner(0, nnode, s) + scan.scan(0) + return scan.result() +} + +func TestLookupContraction(t *testing.T) { + for i, tt := range lookupTests { + cts := contractTrieSet(tt.tries) + for j, lu := range tt.lookup { + str := lu.str + for _, s := range []string{str, str + "X"} { + const msg = `%d:%d: %s of "%s" %v; want %v` + offset, n := lookup(&cts, tt.n, []byte(s)) + if offset != lu.offset { + t.Errorf(msg, i, j, "offset", s, offset, lu.offset) + } + if n != lu.n { + t.Errorf(msg, i, j, "bytes consumed", s, n, len(str)) + } + } + } + } +} diff --git a/vendor/golang.org/x/text/collate/colltab/export.go b/vendor/golang.org/x/text/collate/colltab/export.go new file mode 100644 index 0000000000..257ea2a8d0 --- /dev/null +++ b/vendor/golang.org/x/text/collate/colltab/export.go @@ -0,0 +1,36 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package colltab + +// Init is for internal use only. +func Init(data interface{}) Weighter { + init, ok := data.(tableInitializer) + if !ok { + return nil + } + t := &table{} + loff, voff := init.FirstBlockOffsets() + t.index.index = init.TrieIndex() + t.index.index0 = t.index.index[blockSize*int(loff):] + t.index.values = init.TrieValues() + t.index.values0 = t.index.values[blockSize*int(voff):] + t.expandElem = init.ExpandElems() + t.contractTries = init.ContractTries() + t.contractElem = init.ContractElems() + t.maxContractLen = init.MaxContractLen() + t.variableTop = init.VariableTop() + return t +} + +type tableInitializer interface { + TrieIndex() []uint16 + TrieValues() []uint32 + FirstBlockOffsets() (lookup, value uint16) + ExpandElems() []uint32 + ContractTries() []struct{ l, h, n, i uint8 } + ContractElems() []uint32 + MaxContractLen() int + VariableTop() uint32 +} diff --git a/vendor/golang.org/x/text/collate/colltab/numeric.go b/vendor/golang.org/x/text/collate/colltab/numeric.go new file mode 100644 index 0000000000..38c255cb47 --- /dev/null +++ b/vendor/golang.org/x/text/collate/colltab/numeric.go @@ -0,0 +1,236 @@ +// 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 colltab + +import ( + "unicode" + "unicode/utf8" +) + +// NewNumericWeighter wraps w to replace individual digits to sort based on their +// numeric value. +// +// Weighter w must have a free primary weight after the primary weight for 9. +// If this is not the case, numeric value will sort at the same primary level +// as the first primary sorting after 9. +func NewNumericWeighter(w Weighter) Weighter { + getElem := func(s string) Elem { + elems, _ := w.AppendNextString(nil, s) + return elems[0] + } + nine := getElem("9") + + // Numbers should order before zero, but the DUCET has no room for this. + // TODO: move before zero once we use fractional collation elements. + ns, _ := MakeElem(nine.Primary()+1, nine.Secondary(), int(nine.Tertiary()), 0) + + return &numericWeighter{ + Weighter: w, + + // We assume that w sorts digits of different kinds in order of numeric + // value and that the tertiary weight order is preserved. + // + // TODO: evaluate whether it is worth basing the ranges on the Elem + // encoding itself once the move to fractional weights is complete. + zero: getElem("0"), + zeroSpecialLo: getElem("0"), // U+FF10 FULLWIDTH DIGIT ZERO + zeroSpecialHi: getElem("₀"), // U+2080 SUBSCRIPT ZERO + nine: nine, + nineSpecialHi: getElem("₉"), // U+2089 SUBSCRIPT NINE + numberStart: ns, + } +} + +// A numericWeighter translates a stream of digits into a stream of weights +// representing the numeric value. +type numericWeighter struct { + Weighter + + // The Elems below all demarcate boundaries of specific ranges. With the + // current element encoding digits are in two ranges: normal (default + // tertiary value) and special. For most languages, digits have collation + // elements in the normal range. + // + // Note: the range tests are very specific for the element encoding used by + // this implementation. The tests in collate_test.go are designed to fail + // if this code is not updated when an encoding has changed. + + zero Elem // normal digit zero + zeroSpecialLo Elem // special digit zero, low tertiary value + zeroSpecialHi Elem // special digit zero, high tertiary value + nine Elem // normal digit nine + nineSpecialHi Elem // special digit nine + numberStart Elem +} + +// AppendNext calls the namesake of the underlying weigher, but replaces single +// digits with weights representing their value. +func (nw *numericWeighter) AppendNext(buf []Elem, s []byte) (ce []Elem, n int) { + ce, n = nw.Weighter.AppendNext(buf, s) + nc := numberConverter{ + elems: buf, + w: nw, + b: s, + } + isZero, ok := nc.checkNextDigit(ce) + if !ok { + return ce, n + } + // ce might have been grown already, so take it instead of buf. + nc.init(ce, len(buf), isZero) + for n < len(s) { + ce, sz := nw.Weighter.AppendNext(nc.elems, s[n:]) + nc.b = s + n += sz + if !nc.update(ce) { + break + } + } + return nc.result(), n +} + +// AppendNextString calls the namesake of the underlying weigher, but replaces +// single digits with weights representing their value. +func (nw *numericWeighter) AppendNextString(buf []Elem, s string) (ce []Elem, n int) { + ce, n = nw.Weighter.AppendNextString(buf, s) + nc := numberConverter{ + elems: buf, + w: nw, + s: s, + } + isZero, ok := nc.checkNextDigit(ce) + if !ok { + return ce, n + } + nc.init(ce, len(buf), isZero) + for n < len(s) { + ce, sz := nw.Weighter.AppendNextString(nc.elems, s[n:]) + nc.s = s + n += sz + if !nc.update(ce) { + break + } + } + return nc.result(), n +} + +type numberConverter struct { + w *numericWeighter + + elems []Elem + nDigits int + lenIndex int + + s string // set if the input was of type string + b []byte // set if the input was of type []byte +} + +// init completes initialization of a numberConverter and prepares it for adding +// more digits. elems is assumed to have a digit starting at oldLen. +func (nc *numberConverter) init(elems []Elem, oldLen int, isZero bool) { + // Insert a marker indicating the start of a number and and a placeholder + // for the number of digits. + if isZero { + elems = append(elems[:oldLen], nc.w.numberStart, 0) + } else { + elems = append(elems, 0, 0) + copy(elems[oldLen+2:], elems[oldLen:]) + elems[oldLen] = nc.w.numberStart + elems[oldLen+1] = 0 + + nc.nDigits = 1 + } + nc.elems = elems + nc.lenIndex = oldLen + 1 +} + +// checkNextDigit reports whether bufNew adds a single digit relative to the old +// buffer. If it does, it also reports whether this digit is zero. +func (nc *numberConverter) checkNextDigit(bufNew []Elem) (isZero, ok bool) { + if len(nc.elems) >= len(bufNew) { + return false, false + } + e := bufNew[len(nc.elems)] + if e < nc.w.zeroSpecialLo || nc.w.nine < e { + // Not a number. + return false, false + } + if e < nc.w.zero { + if e > nc.w.nineSpecialHi { + // Not a number. + return false, false + } + if !nc.isDigit() { + return false, false + } + isZero = e <= nc.w.zeroSpecialHi + } else { + // This is the common case if we encounter a digit. + isZero = e == nc.w.zero + } + // Test the remaining added collation elements have a zero primary value. + if n := len(bufNew) - len(nc.elems); n > 1 { + for i := len(nc.elems) + 1; i < len(bufNew); i++ { + if bufNew[i].Primary() != 0 { + return false, false + } + } + // In some rare cases, collation elements will encode runes in + // unicode.No as a digit. For example Ethiopic digits (U+1369 - U+1371) + // are not in Nd. Also some digits that clearly belong in unicode.No, + // like U+0C78 TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR, have + // collation elements indistinguishable from normal digits. + // Unfortunately, this means we need to make this check for nearly all + // non-Latin digits. + // + // TODO: check the performance impact and find something better if it is + // an issue. + if !nc.isDigit() { + return false, false + } + } + return isZero, true +} + +func (nc *numberConverter) isDigit() bool { + if nc.b != nil { + r, _ := utf8.DecodeRune(nc.b) + return unicode.In(r, unicode.Nd) + } + r, _ := utf8.DecodeRuneInString(nc.s) + return unicode.In(r, unicode.Nd) +} + +// We currently support a maximum of about 2M digits (the number of primary +// values). Such numbers will compare correctly against small numbers, but their +// comparison against other large numbers is undefined. +// +// TODO: define a proper fallback, such as comparing large numbers textually or +// actually allowing numbers of unlimited length. +// +// TODO: cap this to a lower number (like 100) and maybe allow a larger number +// in an option? +const maxDigits = 1<<maxPrimaryBits - 1 + +func (nc *numberConverter) update(elems []Elem) bool { + isZero, ok := nc.checkNextDigit(elems) + if nc.nDigits == 0 && isZero { + return true + } + nc.elems = elems + if !ok { + return false + } + nc.nDigits++ + return nc.nDigits < maxDigits +} + +// result fills in the length element for the digit sequence and returns the +// completed collation elements. +func (nc *numberConverter) result() []Elem { + e, _ := MakeElem(nc.nDigits, defaultSecondary, defaultTertiary, 0) + nc.elems[nc.lenIndex] = e + return nc.elems +} diff --git a/vendor/golang.org/x/text/collate/colltab/numeric_test.go b/vendor/golang.org/x/text/collate/colltab/numeric_test.go new file mode 100644 index 0000000000..f55a2283d7 --- /dev/null +++ b/vendor/golang.org/x/text/collate/colltab/numeric_test.go @@ -0,0 +1,157 @@ +// 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 colltab + +import ( + "reflect" + "strings" + "testing" +) + +const ( + digSec = defaultSecondary + digTert = defaultTertiary +) + +var tPlus3 = e(0, 50, digTert+3) + +// numWeighter is a testWeighter used for testing numericWeighter. +var numWeighter = testWeighter{ + "0": p(100), + "0": []Elem{e(100, digSec, digTert+1)}, // U+FF10 FULLWIDTH DIGIT ZERO + "₀": []Elem{e(100, digSec, digTert+5)}, // U+2080 SUBSCRIPT ZERO + + "1": p(101), + // Allow non-primary collation elements to be inserted. + "١": append(p(101), tPlus3), // U+0661 ARABIC-INDIC DIGIT ONE + // Allow varying tertiary weight if the number is Nd. + "1": []Elem{e(101, digSec, digTert+1)}, // U+FF11 FULLWIDTH DIGIT ONE + "2": p(102), + // Allow non-primary collation elements to be inserted. + "٢": append(p(102), tPlus3), // U+0662 ARABIC-INDIC DIGIT TWO + // Varying tertiary weights should be ignored. + "2": []Elem{e(102, digSec, digTert+3)}, // U+FF12 FULLWIDTH DIGIT TWO + "3": p(103), + "4": p(104), + "5": p(105), + "6": p(106), + "7": p(107), + // Weights must be strictly monotonically increasing, but do not need to be + // consecutive. + "8": p(118), + "9": p(119), + // Allow non-primary collation elements to be inserted. + "٩": append(p(119), tPlus3), // U+0669 ARABIC-INDIC DIGIT NINE + // Varying tertiary weights should be ignored. + "9": []Elem{e(119, digSec, digTert+1)}, // U+FF19 FULLWIDTH DIGIT NINE + "₉": []Elem{e(119, digSec, digTert+5)}, // U+2089 SUBSCRIPT NINE + + "a": p(5), + "b": p(6), + "c": p(8, 2), + + "klm": p(99), + + "nop": p(121), + + "x": p(200), + "y": p(201), +} + +func p(w ...int) (elems []Elem) { + for _, x := range w { + e, _ := MakeElem(x, digSec, digTert, 0) + elems = append(elems, e) + } + return elems +} + +func TestNumericAppendNext(t *testing.T) { + for _, tt := range []struct { + in string + w []Elem + }{ + {"a", p(5)}, + {"klm", p(99)}, + {"aa", p(5, 5)}, + {"1", p(120, 1, 101)}, + {"0", p(120, 0)}, + {"01", p(120, 1, 101)}, + {"0001", p(120, 1, 101)}, + {"10", p(120, 2, 101, 100)}, + {"99", p(120, 2, 119, 119)}, + {"9999", p(120, 4, 119, 119, 119, 119)}, + {"1a", p(120, 1, 101, 5)}, + {"0b", p(120, 0, 6)}, + {"01c", p(120, 1, 101, 8, 2)}, + {"10x", p(120, 2, 101, 100, 200)}, + {"99y", p(120, 2, 119, 119, 201)}, + {"9999nop", p(120, 4, 119, 119, 119, 119, 121)}, + + // Allow follow-up collation elements if they have a zero non-primary. + {"١٢٩", []Elem{e(120), e(3), e(101), tPlus3, e(102), tPlus3, e(119), tPlus3}}, + { + "129", + []Elem{ + e(120), e(3), + e(101, digSec, digTert+1), + e(102, digSec, digTert+3), + e(119, digSec, digTert+1), + }, + }, + + // Ensure AppendNext* adds to the given buffer. + {"a10", p(5, 120, 2, 101, 100)}, + } { + nw := NewNumericWeighter(numWeighter) + + b := []byte(tt.in) + got := []Elem(nil) + for n, sz := 0, 0; n < len(b); { + got, sz = nw.AppendNext(got, b[n:]) + n += sz + } + if !reflect.DeepEqual(got, tt.w) { + t.Errorf("AppendNext(%q) =\n%v; want\n%v", tt.in, got, tt.w) + } + + got = nil + for n, sz := 0, 0; n < len(tt.in); { + got, sz = nw.AppendNextString(got, tt.in[n:]) + n += sz + } + if !reflect.DeepEqual(got, tt.w) { + t.Errorf("AppendNextString(%q) =\n%v; want\n%v", tt.in, got, tt.w) + } + } +} + +func TestNumericOverflow(t *testing.T) { + manyDigits := strings.Repeat("9", maxDigits+1) + "a" + + nw := NewNumericWeighter(numWeighter) + + got, n := nw.AppendNextString(nil, manyDigits) + + if n != maxDigits { + t.Errorf("n: got %d; want %d", n, maxDigits) + } + + if got[1].Primary() != maxDigits { + t.Errorf("primary(e[1]): got %d; want %d", n, maxDigits) + } +} + +func TestNumericWeighterAlloc(t *testing.T) { + buf := make([]Elem, 100) + w := NewNumericWeighter(numWeighter) + s := "1234567890a" + + nNormal := testing.AllocsPerRun(3, func() { numWeighter.AppendNextString(buf, s) }) + nNumeric := testing.AllocsPerRun(3, func() { w.AppendNextString(buf, s) }) + if n := nNumeric - nNormal; n > 0 { + t.Errorf("got %f; want 0", n) + } +} diff --git a/vendor/golang.org/x/text/collate/colltab/table.go b/vendor/golang.org/x/text/collate/colltab/table.go new file mode 100644 index 0000000000..1a3a5c0f36 --- /dev/null +++ b/vendor/golang.org/x/text/collate/colltab/table.go @@ -0,0 +1,275 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package colltab + +import ( + "unicode/utf8" + + "golang.org/x/text/unicode/norm" +) + +// table holds all collation data for a given collation ordering. +type table struct { + index trie // main trie + + // expansion info + expandElem []uint32 + + // contraction info + contractTries contractTrieSet + contractElem []uint32 + maxContractLen int + variableTop uint32 +} + +func (t *table) AppendNext(w []Elem, b []byte) (res []Elem, n int) { + return t.appendNext(w, source{bytes: b}) +} + +func (t *table) AppendNextString(w []Elem, s string) (res []Elem, n int) { + return t.appendNext(w, source{str: s}) +} + +func (t *table) Start(p int, b []byte) int { + // TODO: implement + panic("not implemented") +} + +func (t *table) StartString(p int, s string) int { + // TODO: implement + panic("not implemented") +} + +func (t *table) Domain() []string { + // TODO: implement + panic("not implemented") +} + +func (t *table) Top() uint32 { + return t.variableTop +} + +type source struct { + str string + bytes []byte +} + +func (src *source) lookup(t *table) (ce Elem, sz int) { + if src.bytes == nil { + return t.index.lookupString(src.str) + } + return t.index.lookup(src.bytes) +} + +func (src *source) tail(sz int) { + if src.bytes == nil { + src.str = src.str[sz:] + } else { + src.bytes = src.bytes[sz:] + } +} + +func (src *source) nfd(buf []byte, end int) []byte { + if src.bytes == nil { + return norm.NFD.AppendString(buf[:0], src.str[:end]) + } + return norm.NFD.Append(buf[:0], src.bytes[:end]...) +} + +func (src *source) rune() (r rune, sz int) { + if src.bytes == nil { + return utf8.DecodeRuneInString(src.str) + } + return utf8.DecodeRune(src.bytes) +} + +func (src *source) properties(f norm.Form) norm.Properties { + if src.bytes == nil { + return f.PropertiesString(src.str) + } + return f.Properties(src.bytes) +} + +// appendNext appends the weights corresponding to the next rune or +// contraction in s. If a contraction is matched to a discontinuous +// sequence of runes, the weights for the interstitial runes are +// appended as well. It returns a new slice that includes the appended +// weights and the number of bytes consumed from s. +func (t *table) appendNext(w []Elem, src source) (res []Elem, n int) { + ce, sz := src.lookup(t) + tp := ce.ctype() + if tp == ceNormal { + if ce == 0 { + r, _ := src.rune() + const ( + hangulSize = 3 + firstHangul = 0xAC00 + lastHangul = 0xD7A3 + ) + if r >= firstHangul && r <= lastHangul { + // TODO: performance can be considerably improved here. + n = sz + var buf [16]byte // Used for decomposing Hangul. + for b := src.nfd(buf[:0], hangulSize); len(b) > 0; b = b[sz:] { + ce, sz = t.index.lookup(b) + w = append(w, ce) + } + return w, n + } + ce = makeImplicitCE(implicitPrimary(r)) + } + w = append(w, ce) + } else if tp == ceExpansionIndex { + w = t.appendExpansion(w, ce) + } else if tp == ceContractionIndex { + n := 0 + src.tail(sz) + if src.bytes == nil { + w, n = t.matchContractionString(w, ce, src.str) + } else { + w, n = t.matchContraction(w, ce, src.bytes) + } + sz += n + } else if tp == ceDecompose { + // Decompose using NFKD and replace tertiary weights. + t1, t2 := splitDecompose(ce) + i := len(w) + nfkd := src.properties(norm.NFKD).Decomposition() + for p := 0; len(nfkd) > 0; nfkd = nfkd[p:] { + w, p = t.appendNext(w, source{bytes: nfkd}) + } + w[i] = w[i].updateTertiary(t1) + if i++; i < len(w) { + w[i] = w[i].updateTertiary(t2) + for i++; i < len(w); i++ { + w[i] = w[i].updateTertiary(maxTertiary) + } + } + } + return w, sz +} + +func (t *table) appendExpansion(w []Elem, ce Elem) []Elem { + i := splitExpandIndex(ce) + n := int(t.expandElem[i]) + i++ + for _, ce := range t.expandElem[i : i+n] { + w = append(w, Elem(ce)) + } + return w +} + +func (t *table) matchContraction(w []Elem, ce Elem, suffix []byte) ([]Elem, int) { + index, n, offset := splitContractIndex(ce) + + scan := t.contractTries.scanner(index, n, suffix) + buf := [norm.MaxSegmentSize]byte{} + bufp := 0 + p := scan.scan(0) + + if !scan.done && p < len(suffix) && suffix[p] >= utf8.RuneSelf { + // By now we should have filtered most cases. + p0 := p + bufn := 0 + rune := norm.NFD.Properties(suffix[p:]) + p += rune.Size() + if rune.LeadCCC() != 0 { + prevCC := rune.TrailCCC() + // A gap may only occur in the last normalization segment. + // This also ensures that len(scan.s) < norm.MaxSegmentSize. + if end := norm.NFD.FirstBoundary(suffix[p:]); end != -1 { + scan.s = suffix[:p+end] + } + for p < len(suffix) && !scan.done && suffix[p] >= utf8.RuneSelf { + rune = norm.NFD.Properties(suffix[p:]) + if ccc := rune.LeadCCC(); ccc == 0 || prevCC >= ccc { + break + } + prevCC = rune.TrailCCC() + if pp := scan.scan(p); pp != p { + // Copy the interstitial runes for later processing. + bufn += copy(buf[bufn:], suffix[p0:p]) + if scan.pindex == pp { + bufp = bufn + } + p, p0 = pp, pp + } else { + p += rune.Size() + } + } + } + } + // Append weights for the matched contraction, which may be an expansion. + i, n := scan.result() + ce = Elem(t.contractElem[i+offset]) + if ce.ctype() == ceNormal { + w = append(w, ce) + } else { + w = t.appendExpansion(w, ce) + } + // Append weights for the runes in the segment not part of the contraction. + for b, p := buf[:bufp], 0; len(b) > 0; b = b[p:] { + w, p = t.appendNext(w, source{bytes: b}) + } + return w, n +} + +// TODO: unify the two implementations. This is best done after first simplifying +// the algorithm taking into account the inclusion of both NFC and NFD forms +// in the table. +func (t *table) matchContractionString(w []Elem, ce Elem, suffix string) ([]Elem, int) { + index, n, offset := splitContractIndex(ce) + + scan := t.contractTries.scannerString(index, n, suffix) + buf := [norm.MaxSegmentSize]byte{} + bufp := 0 + p := scan.scan(0) + + if !scan.done && p < len(suffix) && suffix[p] >= utf8.RuneSelf { + // By now we should have filtered most cases. + p0 := p + bufn := 0 + rune := norm.NFD.PropertiesString(suffix[p:]) + p += rune.Size() + if rune.LeadCCC() != 0 { + prevCC := rune.TrailCCC() + // A gap may only occur in the last normalization segment. + // This also ensures that len(scan.s) < norm.MaxSegmentSize. + if end := norm.NFD.FirstBoundaryInString(suffix[p:]); end != -1 { + scan.s = suffix[:p+end] + } + for p < len(suffix) && !scan.done && suffix[p] >= utf8.RuneSelf { + rune = norm.NFD.PropertiesString(suffix[p:]) + if ccc := rune.LeadCCC(); ccc == 0 || prevCC >= ccc { + break + } + prevCC = rune.TrailCCC() + if pp := scan.scan(p); pp != p { + // Copy the interstitial runes for later processing. + bufn += copy(buf[bufn:], suffix[p0:p]) + if scan.pindex == pp { + bufp = bufn + } + p, p0 = pp, pp + } else { + p += rune.Size() + } + } + } + } + // Append weights for the matched contraction, which may be an expansion. + i, n := scan.result() + ce = Elem(t.contractElem[i+offset]) + if ce.ctype() == ceNormal { + w = append(w, ce) + } else { + w = t.appendExpansion(w, ce) + } + // Append weights for the runes in the segment not part of the contraction. + for b, p := buf[:bufp], 0; len(b) > 0; b = b[p:] { + w, p = t.appendNext(w, source{bytes: b}) + } + return w, n +} diff --git a/vendor/golang.org/x/text/collate/colltab/trie.go b/vendor/golang.org/x/text/collate/colltab/trie.go new file mode 100644 index 0000000000..f95b4abea4 --- /dev/null +++ b/vendor/golang.org/x/text/collate/colltab/trie.go @@ -0,0 +1,159 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// The trie in this file is used to associate the first full character in an +// UTF-8 string to a collation element. All but the last byte in a UTF-8 byte +// sequence are used to lookup offsets in the index table to be used for the +// next byte. The last byte is used to index into a table of collation elements. +// For a full description, see go.text/collate/build/trie.go. + +package colltab + +const blockSize = 64 + +type trie struct { + index0 []uint16 // index for first byte (0xC0-0xFF) + values0 []uint32 // index for first byte (0x00-0x7F) + index []uint16 + values []uint32 +} + +const ( + t1 = 0x00 // 0000 0000 + tx = 0x80 // 1000 0000 + t2 = 0xC0 // 1100 0000 + t3 = 0xE0 // 1110 0000 + t4 = 0xF0 // 1111 0000 + t5 = 0xF8 // 1111 1000 + t6 = 0xFC // 1111 1100 + te = 0xFE // 1111 1110 +) + +func (t *trie) lookupValue(n uint16, b byte) Elem { + return Elem(t.values[int(n)<<6+int(b)]) +} + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *trie) lookup(s []byte) (v Elem, sz int) { + c0 := s[0] + switch { + case c0 < tx: + return Elem(t.values0[c0]), 1 + case c0 < t2: + return 0, 1 + case c0 < t3: + if len(s) < 2 { + return 0, 0 + } + i := t.index0[c0] + c1 := s[1] + if c1 < tx || t2 <= c1 { + return 0, 1 + } + return t.lookupValue(i, c1), 2 + case c0 < t4: + if len(s) < 3 { + return 0, 0 + } + i := t.index0[c0] + c1 := s[1] + if c1 < tx || t2 <= c1 { + return 0, 1 + } + o := int(i)<<6 + int(c1) + i = t.index[o] + c2 := s[2] + if c2 < tx || t2 <= c2 { + return 0, 2 + } + return t.lookupValue(i, c2), 3 + case c0 < t5: + if len(s) < 4 { + return 0, 0 + } + i := t.index0[c0] + c1 := s[1] + if c1 < tx || t2 <= c1 { + return 0, 1 + } + o := int(i)<<6 + int(c1) + i = t.index[o] + c2 := s[2] + if c2 < tx || t2 <= c2 { + return 0, 2 + } + o = int(i)<<6 + int(c2) + i = t.index[o] + c3 := s[3] + if c3 < tx || t2 <= c3 { + return 0, 3 + } + return t.lookupValue(i, c3), 4 + } + // Illegal rune + return 0, 1 +} + +// The body of lookupString is a verbatim copy of that of lookup. +func (t *trie) lookupString(s string) (v Elem, sz int) { + c0 := s[0] + switch { + case c0 < tx: + return Elem(t.values0[c0]), 1 + case c0 < t2: + return 0, 1 + case c0 < t3: + if len(s) < 2 { + return 0, 0 + } + i := t.index0[c0] + c1 := s[1] + if c1 < tx || t2 <= c1 { + return 0, 1 + } + return t.lookupValue(i, c1), 2 + case c0 < t4: + if len(s) < 3 { + return 0, 0 + } + i := t.index0[c0] + c1 := s[1] + if c1 < tx || t2 <= c1 { + return 0, 1 + } + o := int(i)<<6 + int(c1) + i = t.index[o] + c2 := s[2] + if c2 < tx || t2 <= c2 { + return 0, 2 + } + return t.lookupValue(i, c2), 3 + case c0 < t5: + if len(s) < 4 { + return 0, 0 + } + i := t.index0[c0] + c1 := s[1] + if c1 < tx || t2 <= c1 { + return 0, 1 + } + o := int(i)<<6 + int(c1) + i = t.index[o] + c2 := s[2] + if c2 < tx || t2 <= c2 { + return 0, 2 + } + o = int(i)<<6 + int(c2) + i = t.index[o] + c3 := s[3] + if c3 < tx || t2 <= c3 { + return 0, 3 + } + return t.lookupValue(i, c3), 4 + } + // Illegal rune + return 0, 1 +} diff --git a/vendor/golang.org/x/text/collate/colltab/trie_test.go b/vendor/golang.org/x/text/collate/colltab/trie_test.go new file mode 100644 index 0000000000..85e24220d6 --- /dev/null +++ b/vendor/golang.org/x/text/collate/colltab/trie_test.go @@ -0,0 +1,106 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package colltab + +import ( + "testing" +) + +// We take the smallest, largest and an arbitrary value for each +// of the UTF-8 sequence lengths. +var testRunes = []rune{ + 0x01, 0x0C, 0x7F, // 1-byte sequences + 0x80, 0x100, 0x7FF, // 2-byte sequences + 0x800, 0x999, 0xFFFF, // 3-byte sequences + 0x10000, 0x10101, 0x10FFFF, // 4-byte sequences + 0x200, 0x201, 0x202, 0x210, 0x215, // five entries in one sparse block +} + +// Test cases for illegal runes. +type trietest struct { + size int + bytes []byte +} + +var tests = []trietest{ + // illegal runes + {1, []byte{0x80}}, + {1, []byte{0xFF}}, + {1, []byte{t2, tx - 1}}, + {1, []byte{t2, t2}}, + {2, []byte{t3, tx, tx - 1}}, + {2, []byte{t3, tx, t2}}, + {1, []byte{t3, tx - 1, tx}}, + {3, []byte{t4, tx, tx, tx - 1}}, + {3, []byte{t4, tx, tx, t2}}, + {1, []byte{t4, t2, tx, tx - 1}}, + {2, []byte{t4, tx, t2, tx - 1}}, + + // short runes + {0, []byte{t2}}, + {0, []byte{t3, tx}}, + {0, []byte{t4, tx, tx}}, + + // we only support UTF-8 up to utf8.UTFMax bytes (4 bytes) + {1, []byte{t5, tx, tx, tx, tx}}, + {1, []byte{t6, tx, tx, tx, tx, tx}}, +} + +func TestLookupTrie(t *testing.T) { + for i, r := range testRunes { + b := []byte(string(r)) + v, sz := testTrie.lookup(b) + if int(v) != i { + t.Errorf("lookup(%U): found value %#x, expected %#x", r, v, i) + } + if sz != len(b) { + t.Errorf("lookup(%U): found size %d, expected %d", r, sz, len(b)) + } + } + for i, tt := range tests { + v, sz := testTrie.lookup(tt.bytes) + if int(v) != 0 { + t.Errorf("lookup of illegal rune, case %d: found value %#x, expected 0", i, v) + } + if sz != tt.size { + t.Errorf("lookup of illegal rune, case %d: found size %d, expected %d", i, sz, tt.size) + } + } +} + +// test data is taken from exp/collate/locale/build/trie_test.go +var testValues = [832]uint32{ + 0x000c: 0x00000001, + 0x007f: 0x00000002, + 0x00c0: 0x00000003, + 0x0100: 0x00000004, + 0x0140: 0x0000000c, 0x0141: 0x0000000d, 0x0142: 0x0000000e, + 0x0150: 0x0000000f, + 0x0155: 0x00000010, + 0x01bf: 0x00000005, + 0x01c0: 0x00000006, + 0x0219: 0x00000007, + 0x027f: 0x00000008, + 0x0280: 0x00000009, + 0x02c1: 0x0000000a, + 0x033f: 0x0000000b, +} + +var testLookup = [640]uint16{ + 0x0e0: 0x05, 0x0e6: 0x06, + 0x13f: 0x07, + 0x140: 0x08, 0x144: 0x09, + 0x190: 0x03, + 0x1ff: 0x0a, + 0x20f: 0x05, + 0x242: 0x01, 0x244: 0x02, + 0x248: 0x03, + 0x25f: 0x04, + 0x260: 0x01, + 0x26f: 0x02, + 0x270: 0x04, 0x274: 0x06, +} + +var testTrie = trie{testLookup[6*blockSize:], testValues[:], testLookup[:], testValues[:]} diff --git a/vendor/golang.org/x/text/collate/export_test.go b/vendor/golang.org/x/text/collate/export_test.go new file mode 100644 index 0000000000..c1d19847b1 --- /dev/null +++ b/vendor/golang.org/x/text/collate/export_test.go @@ -0,0 +1,51 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package collate + +// Export for testing. +// TODO: no longer necessary. Remove at some point. + +import ( + "fmt" + + "golang.org/x/text/collate/colltab" +) + +const ( + defaultSecondary = 0x20 + defaultTertiary = 0x2 +) + +type Weights struct { + Primary, Secondary, Tertiary, Quaternary int +} + +func W(ce ...int) Weights { + w := Weights{ce[0], defaultSecondary, defaultTertiary, 0} + if len(ce) > 1 { + w.Secondary = ce[1] + } + if len(ce) > 2 { + w.Tertiary = ce[2] + } + if len(ce) > 3 { + w.Quaternary = ce[3] + } + return w +} +func (w Weights) String() string { + return fmt.Sprintf("[%X.%X.%X.%X]", w.Primary, w.Secondary, w.Tertiary, w.Quaternary) +} + +func convertFromWeights(ws []Weights) []colltab.Elem { + out := make([]colltab.Elem, len(ws)) + for i, w := range ws { + out[i], _ = colltab.MakeElem(w.Primary, w.Secondary, w.Tertiary, 0) + if out[i] == colltab.Ignore && w.Quaternary > 0 { + out[i] = colltab.MakeQuaternary(w.Quaternary) + } + } + return out +} diff --git a/vendor/golang.org/x/text/collate/index.go b/vendor/golang.org/x/text/collate/index.go new file mode 100644 index 0000000000..1c3191b05c --- /dev/null +++ b/vendor/golang.org/x/text/collate/index.go @@ -0,0 +1,44 @@ +// Copyright 2013 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 collate + +// tableIndex holds information for constructing a table +// for a certain locale based on the main table. +type tableIndex struct { + lookupOffset uint32 + valuesOffset uint32 +} + +func (t tableIndex) TrieIndex() []uint16 { + return mainLookup[:] +} + +func (t tableIndex) TrieValues() []uint32 { + return mainValues[:] +} + +func (t tableIndex) FirstBlockOffsets() (lookup, value uint16) { + return uint16(t.lookupOffset), uint16(t.valuesOffset) +} + +func (t tableIndex) ExpandElems() []uint32 { + return mainExpandElem[:] +} + +func (t tableIndex) ContractTries() []struct{ l, h, n, i uint8 } { + return mainCTEntries[:] +} + +func (t tableIndex) ContractElems() []uint32 { + return mainContractElem[:] +} + +func (t tableIndex) MaxContractLen() int { + return 18 // TODO: generate +} + +func (t tableIndex) VariableTop() uint32 { + return varTop +} diff --git a/vendor/golang.org/x/text/collate/maketables.go b/vendor/golang.org/x/text/collate/maketables.go new file mode 100644 index 0000000000..8878d4a873 --- /dev/null +++ b/vendor/golang.org/x/text/collate/maketables.go @@ -0,0 +1,541 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +// Collation table generator. +// Data read from the web. + +package main + +import ( + "archive/zip" + "bufio" + "bytes" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "os" + "regexp" + "sort" + "strconv" + "strings" + "unicode/utf8" + + "golang.org/x/text/collate" + "golang.org/x/text/collate/build" + "golang.org/x/text/collate/colltab" + "golang.org/x/text/internal/gen" + "golang.org/x/text/language" + "golang.org/x/text/unicode/cldr" +) + +var ( + test = flag.Bool("test", false, + "test existing tables; can be used to compare web data with package data.") + short = flag.Bool("short", false, `Use "short" alternatives, when available.`) + draft = flag.Bool("draft", false, `Use draft versions, when available.`) + tags = flag.String("tags", "", "build tags to be included after +build directive") + pkg = flag.String("package", "collate", + "the name of the package in which the generated file is to be included") + + tables = flagStringSetAllowAll("tables", "collate", "collate,chars", + "comma-spearated list of tables to generate.") + exclude = flagStringSet("exclude", "zh2", "", + "comma-separated list of languages to exclude.") + include = flagStringSet("include", "", "", + "comma-separated list of languages to include. Include trumps exclude.") + types = flagStringSetAllowAll("types", "", "", + "comma-separated list of types that should be included.") +) + +// stringSet implements an ordered set based on a list. It implements flag.Value +// to allow a set to be specified as a comma-separated list. +type stringSet struct { + s []string + allowed *stringSet + dirty bool // needs compaction if true + all bool + allowAll bool +} + +func flagStringSet(name, def, allowed, usage string) *stringSet { + ss := &stringSet{} + if allowed != "" { + usage += fmt.Sprintf(" (allowed values: any of %s)", allowed) + ss.allowed = &stringSet{} + failOnError(ss.allowed.Set(allowed)) + } + ss.Set(def) + flag.Var(ss, name, usage) + return ss +} + +func flagStringSetAllowAll(name, def, allowed, usage string) *stringSet { + ss := &stringSet{allowAll: true} + if allowed == "" { + flag.Var(ss, name, usage+fmt.Sprintf(` Use "all" to select all.`)) + } else { + ss.allowed = &stringSet{} + failOnError(ss.allowed.Set(allowed)) + flag.Var(ss, name, usage+fmt.Sprintf(` (allowed values: "all" or any of %s)`, allowed)) + } + ss.Set(def) + return ss +} + +func (ss stringSet) Len() int { + return len(ss.s) +} + +func (ss stringSet) String() string { + return strings.Join(ss.s, ",") +} + +func (ss *stringSet) Set(s string) error { + if ss.allowAll && s == "all" { + ss.s = nil + ss.all = true + return nil + } + ss.s = ss.s[:0] + for _, s := range strings.Split(s, ",") { + if s := strings.TrimSpace(s); s != "" { + if ss.allowed != nil && !ss.allowed.contains(s) { + return fmt.Errorf("unsupported value %q; must be one of %s", s, ss.allowed) + } + ss.add(s) + } + } + ss.compact() + return nil +} + +func (ss *stringSet) add(s string) { + ss.s = append(ss.s, s) + ss.dirty = true +} + +func (ss *stringSet) values() []string { + ss.compact() + return ss.s +} + +func (ss *stringSet) contains(s string) bool { + if ss.all { + return true + } + for _, v := range ss.s { + if v == s { + return true + } + } + return false +} + +func (ss *stringSet) compact() { + if !ss.dirty { + return + } + a := ss.s + sort.Strings(a) + k := 0 + for i := 1; i < len(a); i++ { + if a[k] != a[i] { + a[k+1] = a[i] + k++ + } + } + ss.s = a[:k+1] + ss.dirty = false +} + +func skipLang(l string) bool { + if include.Len() > 0 { + return !include.contains(l) + } + return exclude.contains(l) +} + +// altInclude returns a list of alternatives (for the LDML alt attribute) +// in order of preference. An empty string in this list indicates the +// default entry. +func altInclude() []string { + l := []string{} + if *short { + l = append(l, "short") + } + l = append(l, "") + // TODO: handle draft using cldr.SetDraftLevel + if *draft { + l = append(l, "proposed") + } + return l +} + +func failOnError(e error) { + if e != nil { + log.Panic(e) + } +} + +func openArchive() *zip.Reader { + f := gen.OpenCLDRCoreZip() + buffer, err := ioutil.ReadAll(f) + f.Close() + failOnError(err) + archive, err := zip.NewReader(bytes.NewReader(buffer), int64(len(buffer))) + failOnError(err) + return archive +} + +// parseUCA parses a Default Unicode Collation Element Table of the format +// specified in http://www.unicode.org/reports/tr10/#File_Format. +// It returns the variable top. +func parseUCA(builder *build.Builder) { + var r io.ReadCloser + var err error + for _, f := range openArchive().File { + if strings.HasSuffix(f.Name, "allkeys_CLDR.txt") { + r, err = f.Open() + } + } + if r == nil { + log.Fatal("File allkeys_CLDR.txt not found in archive.") + } + failOnError(err) + defer r.Close() + scanner := bufio.NewScanner(r) + colelem := regexp.MustCompile(`\[([.*])([0-9A-F.]+)\]`) + for i := 1; scanner.Scan(); i++ { + line := scanner.Text() + if len(line) == 0 || line[0] == '#' { + continue + } + if line[0] == '@' { + // parse properties + switch { + case strings.HasPrefix(line[1:], "version "): + a := strings.Split(line[1:], " ") + if a[1] != gen.UnicodeVersion() { + log.Fatalf("incompatible version %s; want %s", a[1], gen.UnicodeVersion()) + } + case strings.HasPrefix(line[1:], "backwards "): + log.Fatalf("%d: unsupported option backwards", i) + default: + log.Printf("%d: unknown option %s", i, line[1:]) + } + } else { + // parse entries + part := strings.Split(line, " ; ") + if len(part) != 2 { + log.Fatalf("%d: production rule without ';': %v", i, line) + } + lhs := []rune{} + for _, v := range strings.Split(part[0], " ") { + if v == "" { + continue + } + lhs = append(lhs, rune(convHex(i, v))) + } + var n int + var vars []int + rhs := [][]int{} + for i, m := range colelem.FindAllStringSubmatch(part[1], -1) { + n += len(m[0]) + elem := []int{} + for _, h := range strings.Split(m[2], ".") { + elem = append(elem, convHex(i, h)) + } + if m[1] == "*" { + vars = append(vars, i) + } + rhs = append(rhs, elem) + } + if len(part[1]) < n+3 || part[1][n+1] != '#' { + log.Fatalf("%d: expected comment; found %s", i, part[1][n:]) + } + if *test { + testInput.add(string(lhs)) + } + failOnError(builder.Add(lhs, rhs, vars)) + } + } + if scanner.Err() != nil { + log.Fatal(scanner.Err()) + } +} + +func convHex(line int, s string) int { + r, e := strconv.ParseInt(s, 16, 32) + if e != nil { + log.Fatalf("%d: %v", line, e) + } + return int(r) +} + +var testInput = stringSet{} + +var charRe = regexp.MustCompile(`&#x([0-9A-F]*);`) +var tagRe = regexp.MustCompile(`<([a-z_]*) */>`) + +var mainLocales = []string{} + +// charsets holds a list of exemplar characters per category. +type charSets map[string][]string + +func (p charSets) fprint(w io.Writer) { + fmt.Fprintln(w, "[exN]string{") + for i, k := range []string{"", "contractions", "punctuation", "auxiliary", "currencySymbol", "index"} { + if set := p[k]; len(set) != 0 { + fmt.Fprintf(w, "\t\t%d: %q,\n", i, strings.Join(set, " ")) + } + } + fmt.Fprintln(w, "\t},") +} + +var localeChars = make(map[string]charSets) + +const exemplarHeader = ` +type exemplarType int +const ( + exCharacters exemplarType = iota + exContractions + exPunctuation + exAuxiliary + exCurrency + exIndex + exN +) +` + +func printExemplarCharacters(w io.Writer) { + fmt.Fprintln(w, exemplarHeader) + fmt.Fprintln(w, "var exemplarCharacters = map[string][exN]string{") + for _, loc := range mainLocales { + fmt.Fprintf(w, "\t%q: ", loc) + localeChars[loc].fprint(w) + } + fmt.Fprintln(w, "}") +} + +func decodeCLDR(d *cldr.Decoder) *cldr.CLDR { + r := gen.OpenCLDRCoreZip() + data, err := d.DecodeZip(r) + failOnError(err) + return data +} + +// parseMain parses XML files in the main directory of the CLDR core.zip file. +func parseMain() { + d := &cldr.Decoder{} + d.SetDirFilter("main") + d.SetSectionFilter("characters") + data := decodeCLDR(d) + for _, loc := range data.Locales() { + x := data.RawLDML(loc) + if skipLang(x.Identity.Language.Type) { + continue + } + if x.Characters != nil { + x, _ = data.LDML(loc) + loc = language.Make(loc).String() + for _, ec := range x.Characters.ExemplarCharacters { + if ec.Draft != "" { + continue + } + if _, ok := localeChars[loc]; !ok { + mainLocales = append(mainLocales, loc) + localeChars[loc] = make(charSets) + } + localeChars[loc][ec.Type] = parseCharacters(ec.Data()) + } + } + } +} + +func parseCharacters(chars string) []string { + parseSingle := func(s string) (r rune, tail string, escaped bool) { + if s[0] == '\\' { + return rune(s[1]), s[2:], true + } + r, sz := utf8.DecodeRuneInString(s) + return r, s[sz:], false + } + chars = strings.TrimSpace(chars) + if n := len(chars) - 1; chars[n] == ']' && chars[0] == '[' { + chars = chars[1:n] + } + list := []string{} + var r, last, end rune + for len(chars) > 0 { + if chars[0] == '{' { // character sequence + buf := []rune{} + for chars = chars[1:]; len(chars) > 0; { + r, chars, _ = parseSingle(chars) + if r == '}' { + break + } + if r == ' ' { + log.Fatalf("space not supported in sequence %q", chars) + } + buf = append(buf, r) + } + list = append(list, string(buf)) + last = 0 + } else { // single character + escaped := false + r, chars, escaped = parseSingle(chars) + if r != ' ' { + if r == '-' && !escaped { + if last == 0 { + log.Fatal("'-' should be preceded by a character") + } + end, chars, _ = parseSingle(chars) + for ; last <= end; last++ { + list = append(list, string(last)) + } + last = 0 + } else { + list = append(list, string(r)) + last = r + } + } + } + } + return list +} + +var fileRe = regexp.MustCompile(`.*/collation/(.*)\.xml`) + +// parseCollation parses XML files in the collation directory of the CLDR core.zip file. +func parseCollation(b *build.Builder) { + d := &cldr.Decoder{} + d.SetDirFilter("collation") + data := decodeCLDR(d) + for _, loc := range data.Locales() { + x, err := data.LDML(loc) + failOnError(err) + if skipLang(x.Identity.Language.Type) { + continue + } + cs := x.Collations.Collation + sl := cldr.MakeSlice(&cs) + if len(types.s) == 0 { + sl.SelectAnyOf("type", x.Collations.Default()) + } else if !types.all { + sl.SelectAnyOf("type", types.s...) + } + sl.SelectOnePerGroup("alt", altInclude()) + + for _, c := range cs { + id, err := language.Parse(loc) + if err != nil { + fmt.Fprintf(os.Stderr, "invalid locale: %q", err) + continue + } + // Support both old- and new-style defaults. + d := c.Type + if x.Collations.DefaultCollation == nil { + d = x.Collations.Default() + } else { + d = x.Collations.DefaultCollation.Data() + } + // We assume tables are being built either for search or collation, + // but not both. For search the default is always "search". + if d != c.Type && c.Type != "search" { + id, err = id.SetTypeForKey("co", c.Type) + failOnError(err) + } + t := b.Tailoring(id) + c.Process(processor{t}) + } + } +} + +type processor struct { + t *build.Tailoring +} + +func (p processor) Reset(anchor string, before int) (err error) { + if before != 0 { + err = p.t.SetAnchorBefore(anchor) + } else { + err = p.t.SetAnchor(anchor) + } + failOnError(err) + return nil +} + +func (p processor) Insert(level int, str, context, extend string) error { + str = context + str + if *test { + testInput.add(str) + } + // TODO: mimic bug in old maketables: remove. + err := p.t.Insert(colltab.Level(level-1), str, context+extend) + failOnError(err) + return nil +} + +func (p processor) Index(id string) { +} + +func testCollator(c *collate.Collator) { + c0 := collate.New(language.Und) + + // iterator over all characters for all locales and check + // whether Key is equal. + buf := collate.Buffer{} + + // Add all common and not too uncommon runes to the test set. + for i := rune(0); i < 0x30000; i++ { + testInput.add(string(i)) + } + for i := rune(0xE0000); i < 0xF0000; i++ { + testInput.add(string(i)) + } + for _, str := range testInput.values() { + k0 := c0.KeyFromString(&buf, str) + k := c.KeyFromString(&buf, str) + if !bytes.Equal(k0, k) { + failOnError(fmt.Errorf("test:%U: keys differ (%x vs %x)", []rune(str), k0, k)) + } + buf.Reset() + } + fmt.Println("PASS") +} + +func main() { + gen.Init() + b := build.NewBuilder() + parseUCA(b) + if tables.contains("chars") { + parseMain() + } + parseCollation(b) + + c, err := b.Build() + failOnError(err) + + if *test { + testCollator(collate.NewFromTable(c)) + } else { + w := &bytes.Buffer{} + + gen.WriteUnicodeVersion(w) + gen.WriteCLDRVersion(w) + + if tables.contains("collate") { + _, err = b.Print(w) + failOnError(err) + } + if tables.contains("chars") { + printExemplarCharacters(w) + } + gen.WriteGoFile("tables.go", *pkg, w.Bytes()) + } +} diff --git a/vendor/golang.org/x/text/collate/option.go b/vendor/golang.org/x/text/collate/option.go new file mode 100644 index 0000000000..9d9a8467f3 --- /dev/null +++ b/vendor/golang.org/x/text/collate/option.go @@ -0,0 +1,239 @@ +// 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 collate + +import ( + "sort" + + "golang.org/x/text/collate/colltab" + "golang.org/x/text/language" + "golang.org/x/text/unicode/norm" +) + +// newCollator creates a new collator with default options configured. +func newCollator(t colltab.Weighter) *Collator { + // Initialize a collator with default options. + c := &Collator{ + options: options{ + ignore: [colltab.NumLevels]bool{ + colltab.Quaternary: true, + colltab.Identity: true, + }, + f: norm.NFD, + t: t, + }, + } + + // TODO: store vt in tags or remove. + c.variableTop = t.Top() + + return c +} + +// An Option is used to change the behavior of a Collator. Options override the +// settings passed through the locale identifier. +type Option struct { + priority int + f func(o *options) +} + +type prioritizedOptions []Option + +func (p prioritizedOptions) Len() int { + return len(p) +} + +func (p prioritizedOptions) Swap(i, j int) { + p[i], p[j] = p[j], p[i] +} + +func (p prioritizedOptions) Less(i, j int) bool { + return p[i].priority < p[j].priority +} + +type options struct { + // ignore specifies which levels to ignore. + ignore [colltab.NumLevels]bool + + // caseLevel is true if there is an additional level of case matching + // between the secondary and tertiary levels. + caseLevel bool + + // backwards specifies the order of sorting at the secondary level. + // This option exists predominantly to support reverse sorting of accents in French. + backwards bool + + // numeric specifies whether any sequence of decimal digits (category is Nd) + // is sorted at a primary level with its numeric value. + // For example, "A-21" < "A-123". + // This option is set by wrapping the main Weighter with NewNumericWeighter. + numeric bool + + // alternate specifies an alternative handling of variables. + alternate alternateHandling + + // variableTop is the largest primary value that is considered to be + // variable. + variableTop uint32 + + t colltab.Weighter + + f norm.Form +} + +func (o *options) setOptions(opts []Option) { + sort.Sort(prioritizedOptions(opts)) + for _, x := range opts { + x.f(o) + } +} + +// OptionsFromTag extracts the BCP47 collation options from the tag and +// configures a collator accordingly. These options are set before any other +// option. +func OptionsFromTag(t language.Tag) Option { + return Option{0, func(o *options) { + o.setFromTag(t) + }} +} + +func (o *options) setFromTag(t language.Tag) { + o.caseLevel = ldmlBool(t, o.caseLevel, "kc") + o.backwards = ldmlBool(t, o.backwards, "kb") + o.numeric = ldmlBool(t, o.numeric, "kn") + + // Extract settings from the BCP47 u extension. + switch t.TypeForKey("ks") { // strength + case "level1": + o.ignore[colltab.Secondary] = true + o.ignore[colltab.Tertiary] = true + case "level2": + o.ignore[colltab.Tertiary] = true + case "level3", "": + // The default. + case "level4": + o.ignore[colltab.Quaternary] = false + case "identic": + o.ignore[colltab.Quaternary] = false + o.ignore[colltab.Identity] = false + } + + switch t.TypeForKey("ka") { + case "shifted": + o.alternate = altShifted + // The following two types are not official BCP47, but we support them to + // give access to this otherwise hidden functionality. The name blanked is + // derived from the LDML name blanked and posix reflects the main use of + // the shift-trimmed option. + case "blanked": + o.alternate = altBlanked + case "posix": + o.alternate = altShiftTrimmed + } + + // TODO: caseFirst ("kf"), reorder ("kr"), and maybe variableTop ("vt"). + + // Not used: + // - normalization ("kk", not necessary for this implementation) + // - hiraganaQuatenary ("kh", obsolete) +} + +func ldmlBool(t language.Tag, old bool, key string) bool { + switch t.TypeForKey(key) { + case "true": + return true + case "false": + return false + default: + return old + } +} + +var ( + // IgnoreCase sets case-insensitive comparison. + IgnoreCase Option = ignoreCase + ignoreCase = Option{3, ignoreCaseF} + + // IgnoreDiacritics causes diacritical marks to be ignored. ("o" == "ö"). + IgnoreDiacritics Option = ignoreDiacritics + ignoreDiacritics = Option{3, ignoreDiacriticsF} + + // IgnoreWidth causes full-width characters to match their half-width + // equivalents. + IgnoreWidth Option = ignoreWidth + ignoreWidth = Option{2, ignoreWidthF} + + // Loose sets the collator to ignore diacritics, case and weight. + Loose Option = loose + loose = Option{4, looseF} + + // Force ordering if strings are equivalent but not equal. + Force Option = force + force = Option{5, forceF} + + // Numeric specifies that numbers should sort numerically ("2" < "12"). + Numeric Option = numeric + numeric = Option{5, numericF} +) + +func ignoreWidthF(o *options) { + o.ignore[colltab.Tertiary] = true + o.caseLevel = true +} + +func ignoreDiacriticsF(o *options) { + o.ignore[colltab.Secondary] = true +} + +func ignoreCaseF(o *options) { + o.ignore[colltab.Tertiary] = true + o.caseLevel = false +} + +func looseF(o *options) { + ignoreWidthF(o) + ignoreDiacriticsF(o) + ignoreCaseF(o) +} + +func forceF(o *options) { + o.ignore[colltab.Identity] = false +} + +func numericF(o *options) { o.numeric = true } + +// Reorder overrides the pre-defined ordering of scripts and character sets. +func Reorder(s ...string) Option { + // TODO: need fractional weights to implement this. + panic("TODO: implement") +} + +// TODO: consider making these public again. These options cannot be fully +// specified in BCP47, so an API interface seems warranted. Still a higher-level +// interface would be nice (e.g. a POSIX option for enabling altShiftTrimmed) + +// alternateHandling identifies the various ways in which variables are handled. +// A rune with a primary weight lower than the variable top is considered a +// variable. +// See http://www.unicode.org/reports/tr10/#Variable_Weighting for details. +type alternateHandling int + +const ( + // altNonIgnorable turns off special handling of variables. + altNonIgnorable alternateHandling = iota + + // altBlanked sets variables and all subsequent primary ignorables to be + // ignorable at all levels. This is identical to removing all variables + // and subsequent primary ignorables from the input. + altBlanked + + // altShifted sets variables to be ignorable for levels one through three and + // adds a fourth level based on the values of the ignored levels. + altShifted + + // altShiftTrimmed is a slight variant of altShifted that is used to + // emulate POSIX. + altShiftTrimmed +) diff --git a/vendor/golang.org/x/text/collate/option_test.go b/vendor/golang.org/x/text/collate/option_test.go new file mode 100644 index 0000000000..ac5d0d752c --- /dev/null +++ b/vendor/golang.org/x/text/collate/option_test.go @@ -0,0 +1,184 @@ +// 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 collate + +import ( + "reflect" + "testing" + + "golang.org/x/text/collate/colltab" + "golang.org/x/text/language" +) + +var ( + defaultIgnore = ignore(colltab.Tertiary) + defaultTable = colltab.Init(locales[0]) +) + +func TestOptions(t *testing.T) { + for i, tt := range []struct { + in []Option + out options + }{ + 0: { + out: options{ + ignore: defaultIgnore, + }, + }, + 1: { + in: []Option{IgnoreDiacritics}, + out: options{ + ignore: [colltab.NumLevels]bool{false, true, false, true, true}, + }, + }, + 2: { + in: []Option{IgnoreCase, IgnoreDiacritics}, + out: options{ + ignore: ignore(colltab.Primary), + }, + }, + 3: { + in: []Option{ignoreDiacritics, IgnoreWidth}, + out: options{ + ignore: ignore(colltab.Primary), + caseLevel: true, + }, + }, + 4: { + in: []Option{IgnoreWidth, ignoreDiacritics}, + out: options{ + ignore: ignore(colltab.Primary), + caseLevel: true, + }, + }, + 5: { + in: []Option{IgnoreCase, IgnoreWidth}, + out: options{ + ignore: ignore(colltab.Secondary), + }, + }, + 6: { + in: []Option{IgnoreCase, IgnoreWidth, Loose}, + out: options{ + ignore: ignore(colltab.Primary), + }, + }, + 7: { + in: []Option{Force, IgnoreCase, IgnoreWidth, Loose}, + out: options{ + ignore: [colltab.NumLevels]bool{false, true, true, true, false}, + }, + }, + 8: { + in: []Option{IgnoreDiacritics, IgnoreCase}, + out: options{ + ignore: ignore(colltab.Primary), + }, + }, + 9: { + in: []Option{Numeric}, + out: options{ + ignore: defaultIgnore, + numeric: true, + }, + }, + 10: { + in: []Option{OptionsFromTag(language.MustParse("und-u-ks-level1"))}, + out: options{ + ignore: ignore(colltab.Primary), + }, + }, + 11: { + in: []Option{OptionsFromTag(language.MustParse("und-u-ks-level4"))}, + out: options{ + ignore: ignore(colltab.Quaternary), + }, + }, + 12: { + in: []Option{OptionsFromTag(language.MustParse("und-u-ks-identic"))}, + out: options{}, + }, + 13: { + in: []Option{ + OptionsFromTag(language.MustParse("und-u-kn-true-kb-true-kc-true")), + }, + out: options{ + ignore: defaultIgnore, + caseLevel: true, + backwards: true, + numeric: true, + }, + }, + 14: { + in: []Option{ + OptionsFromTag(language.MustParse("und-u-kn-true-kb-true-kc-true")), + OptionsFromTag(language.MustParse("und-u-kn-false-kb-false-kc-false")), + }, + out: options{ + ignore: defaultIgnore, + }, + }, + 15: { + in: []Option{ + OptionsFromTag(language.MustParse("und-u-kn-true-kb-true-kc-true")), + OptionsFromTag(language.MustParse("und-u-kn-foo-kb-foo-kc-foo")), + }, + out: options{ + ignore: defaultIgnore, + caseLevel: true, + backwards: true, + numeric: true, + }, + }, + 16: { // Normal options take precedence over tag options. + in: []Option{ + Numeric, IgnoreCase, + OptionsFromTag(language.MustParse("und-u-kn-false-kc-true")), + }, + out: options{ + ignore: ignore(colltab.Secondary), + caseLevel: false, + numeric: true, + }, + }, + 17: { + in: []Option{ + OptionsFromTag(language.MustParse("und-u-ka-shifted")), + }, + out: options{ + ignore: defaultIgnore, + alternate: altShifted, + }, + }, + 18: { + in: []Option{ + OptionsFromTag(language.MustParse("und-u-ka-blanked")), + }, + out: options{ + ignore: defaultIgnore, + alternate: altBlanked, + }, + }, + 19: { + in: []Option{ + OptionsFromTag(language.MustParse("und-u-ka-posix")), + }, + out: options{ + ignore: defaultIgnore, + alternate: altShiftTrimmed, + }, + }, + } { + c := newCollator(defaultTable) + c.t = nil + c.variableTop = 0 + c.f = 0 + + c.setOptions(tt.in) + if !reflect.DeepEqual(c.options, tt.out) { + t.Errorf("%d: got %v; want %v", i, c.options, tt.out) + } + } + +} diff --git a/vendor/golang.org/x/text/collate/reg_test.go b/vendor/golang.org/x/text/collate/reg_test.go new file mode 100644 index 0000000000..1ac5fedc8a --- /dev/null +++ b/vendor/golang.org/x/text/collate/reg_test.go @@ -0,0 +1,230 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package collate + +import ( + "archive/zip" + "bufio" + "bytes" + "flag" + "io" + "io/ioutil" + "log" + "path" + "regexp" + "strconv" + "strings" + "testing" + "unicode/utf8" + + "golang.org/x/text/collate/build" + "golang.org/x/text/internal/gen" + "golang.org/x/text/language" +) + +var long = flag.Bool("long", false, + "run time-consuming tests, such as tests that fetch data online") + +// This regression test runs tests for the test files in CollationTest.zip +// (taken from http://www.unicode.org/Public/UCA/<gen.UnicodeVersion()>/). +// +// The test files have the following form: +// # header +// 0009 0021; # ('\u0009') <CHARACTER TABULATION> [| | | 0201 025E] +// 0009 003F; # ('\u0009') <CHARACTER TABULATION> [| | | 0201 0263] +// 000A 0021; # ('\u000A') <LINE FEED (LF)> [| | | 0202 025E] +// 000A 003F; # ('\u000A') <LINE FEED (LF)> [| | | 0202 0263] +// +// The part before the semicolon is the hex representation of a sequence +// of runes. After the hash mark is a comment. The strings +// represented by rune sequence are in the file in sorted order, as +// defined by the DUCET. + +type Test struct { + name string + str [][]byte + comment []string +} + +var versionRe = regexp.MustCompile(`# UCA Version: (.*)\n?$`) +var testRe = regexp.MustCompile(`^([\dA-F ]+);.*# (.*)\n?$`) + +func TestCollation(t *testing.T) { + if !gen.IsLocal() && !*long { + t.Skip("skipping test to prevent downloading; to run use -long or use -local to specify a local source") + } + t.Skip("must first update to new file format to support test") + for _, test := range loadTestData() { + doTest(t, test) + } +} + +func Error(e error) { + if e != nil { + log.Fatal(e) + } +} + +// parseUCA parses a Default Unicode Collation Element Table of the format +// specified in http://www.unicode.org/reports/tr10/#File_Format. +// It returns the variable top. +func parseUCA(builder *build.Builder) { + r := gen.OpenUnicodeFile("UCA", "", "allkeys.txt") + defer r.Close() + input := bufio.NewReader(r) + colelem := regexp.MustCompile(`\[([.*])([0-9A-F.]+)\]`) + for i := 1; true; i++ { + l, prefix, err := input.ReadLine() + if err == io.EOF { + break + } + Error(err) + line := string(l) + if prefix { + log.Fatalf("%d: buffer overflow", i) + } + if len(line) == 0 || line[0] == '#' { + continue + } + if line[0] == '@' { + if strings.HasPrefix(line[1:], "version ") { + if v := strings.Split(line[1:], " ")[1]; v != gen.UnicodeVersion() { + log.Fatalf("incompatible version %s; want %s", v, gen.UnicodeVersion()) + } + } + } else { + // parse entries + part := strings.Split(line, " ; ") + if len(part) != 2 { + log.Fatalf("%d: production rule without ';': %v", i, line) + } + lhs := []rune{} + for _, v := range strings.Split(part[0], " ") { + if v != "" { + lhs = append(lhs, rune(convHex(i, v))) + } + } + vars := []int{} + rhs := [][]int{} + for i, m := range colelem.FindAllStringSubmatch(part[1], -1) { + if m[1] == "*" { + vars = append(vars, i) + } + elem := []int{} + for _, h := range strings.Split(m[2], ".") { + elem = append(elem, convHex(i, h)) + } + rhs = append(rhs, elem) + } + builder.Add(lhs, rhs, vars) + } + } +} + +func convHex(line int, s string) int { + r, e := strconv.ParseInt(s, 16, 32) + if e != nil { + log.Fatalf("%d: %v", line, e) + } + return int(r) +} + +func loadTestData() []Test { + f := gen.OpenUnicodeFile("UCA", "", "CollationTest.zip") + buffer, err := ioutil.ReadAll(f) + f.Close() + Error(err) + archive, err := zip.NewReader(bytes.NewReader(buffer), int64(len(buffer))) + Error(err) + tests := []Test{} + for _, f := range archive.File { + // Skip the short versions, which are simply duplicates of the long versions. + if strings.Contains(f.Name, "SHORT") || f.FileInfo().IsDir() { + continue + } + ff, err := f.Open() + Error(err) + defer ff.Close() + scanner := bufio.NewScanner(ff) + test := Test{name: path.Base(f.Name)} + for scanner.Scan() { + line := scanner.Text() + if len(line) <= 1 || line[0] == '#' { + if m := versionRe.FindStringSubmatch(line); m != nil { + if m[1] != gen.UnicodeVersion() { + log.Printf("warning:%s: version is %s; want %s", f.Name, m[1], gen.UnicodeVersion()) + } + } + continue + } + m := testRe.FindStringSubmatch(line) + if m == nil || len(m) < 3 { + log.Fatalf(`Failed to parse: "%s" result: %#v`, line, m) + } + str := []byte{} + // In the regression test data (unpaired) surrogates are assigned a weight + // corresponding to their code point value. However, utf8.DecodeRune, + // which is used to compute the implicit weight, assigns FFFD to surrogates. + // We therefore skip tests with surrogates. This skips about 35 entries + // per test. + valid := true + for _, split := range strings.Split(m[1], " ") { + r, err := strconv.ParseUint(split, 16, 64) + Error(err) + valid = valid && utf8.ValidRune(rune(r)) + str = append(str, string(rune(r))...) + } + if valid { + test.str = append(test.str, str) + test.comment = append(test.comment, m[2]) + } + } + if scanner.Err() != nil { + log.Fatal(scanner.Err()) + } + tests = append(tests, test) + } + return tests +} + +var errorCount int + +func runes(b []byte) []rune { + return []rune(string(b)) +} + +var shifted = language.MustParse("und-u-ka-shifted-ks-level4") + +func doTest(t *testing.T, tc Test) { + bld := build.NewBuilder() + parseUCA(bld) + w, err := bld.Build() + Error(err) + var tag language.Tag + if !strings.Contains(tc.name, "NON_IGNOR") { + tag = shifted + } + c := NewFromTable(w, OptionsFromTag(tag)) + b := &Buffer{} + prev := tc.str[0] + for i := 1; i < len(tc.str); i++ { + b.Reset() + s := tc.str[i] + ka := c.Key(b, prev) + kb := c.Key(b, s) + if r := bytes.Compare(ka, kb); r == 1 { + t.Errorf("%s:%d: Key(%.4X) < Key(%.4X) (%X < %X) == %d; want -1 or 0", tc.name, i, []rune(string(prev)), []rune(string(s)), ka, kb, r) + prev = s + continue + } + if r := c.Compare(prev, s); r == 1 { + t.Errorf("%s:%d: Compare(%.4X, %.4X) == %d; want -1 or 0", tc.name, i, runes(prev), runes(s), r) + } + if r := c.Compare(s, prev); r == -1 { + t.Errorf("%s:%d: Compare(%.4X, %.4X) == %d; want 1 or 0", tc.name, i, runes(s), runes(prev), r) + } + prev = s + } +} diff --git a/vendor/golang.org/x/text/collate/sort.go b/vendor/golang.org/x/text/collate/sort.go new file mode 100644 index 0000000000..62f1e75a3c --- /dev/null +++ b/vendor/golang.org/x/text/collate/sort.go @@ -0,0 +1,81 @@ +// Copyright 2013 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 collate + +import ( + "bytes" + "sort" +) + +const ( + maxSortBuffer = 40960 + maxSortEntries = 4096 +) + +type swapper interface { + Swap(i, j int) +} + +type sorter struct { + buf *Buffer + keys [][]byte + src swapper +} + +func (s *sorter) init(n int) { + if s.buf == nil { + s.buf = &Buffer{} + s.buf.init() + } + if cap(s.keys) < n { + s.keys = make([][]byte, n) + } + s.keys = s.keys[0:n] +} + +func (s *sorter) sort(src swapper) { + s.src = src + sort.Sort(s) +} + +func (s sorter) Len() int { + return len(s.keys) +} + +func (s sorter) Less(i, j int) bool { + return bytes.Compare(s.keys[i], s.keys[j]) == -1 +} + +func (s sorter) Swap(i, j int) { + s.keys[i], s.keys[j] = s.keys[j], s.keys[i] + s.src.Swap(i, j) +} + +// A Lister can be sorted by Collator's Sort method. +type Lister interface { + Len() int + Swap(i, j int) + // Bytes returns the bytes of the text at index i. + Bytes(i int) []byte +} + +// Sort uses sort.Sort to sort the strings represented by x using the rules of c. +func (c *Collator) Sort(x Lister) { + n := x.Len() + c.sorter.init(n) + for i := 0; i < n; i++ { + c.sorter.keys[i] = c.Key(c.sorter.buf, x.Bytes(i)) + } + c.sorter.sort(x) +} + +// SortStrings uses sort.Sort to sort the strings in x using the rules of c. +func (c *Collator) SortStrings(x []string) { + c.sorter.init(len(x)) + for i, s := range x { + c.sorter.keys[i] = c.KeyFromString(c.sorter.buf, s) + } + c.sorter.sort(sort.StringSlice(x)) +} diff --git a/vendor/golang.org/x/text/collate/sort_test.go b/vendor/golang.org/x/text/collate/sort_test.go new file mode 100644 index 0000000000..d9e7f31cc9 --- /dev/null +++ b/vendor/golang.org/x/text/collate/sort_test.go @@ -0,0 +1,55 @@ +// Copyright 2013 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 collate_test + +import ( + "fmt" + "testing" + + "golang.org/x/text/collate" + "golang.org/x/text/language" +) + +func ExampleCollator_Strings() { + c := collate.New(language.Und) + strings := []string{ + "ad", + "ab", + "äb", + "ac", + } + c.SortStrings(strings) + fmt.Println(strings) + // Output: [ab äb ac ad] +} + +type sorter []string + +func (s sorter) Len() int { + return len(s) +} + +func (s sorter) Swap(i, j int) { + s[j], s[i] = s[i], s[j] +} + +func (s sorter) Bytes(i int) []byte { + return []byte(s[i]) +} + +func TestSort(t *testing.T) { + c := collate.New(language.English) + strings := []string{ + "bcd", + "abc", + "ddd", + } + c.Sort(sorter(strings)) + res := fmt.Sprint(strings) + want := "[abc bcd ddd]" + if res != want { + t.Errorf("found %s; want %s", res, want) + } +} diff --git a/vendor/golang.org/x/text/collate/table_test.go b/vendor/golang.org/x/text/collate/table_test.go new file mode 100644 index 0000000000..7e1e9cf7aa --- /dev/null +++ b/vendor/golang.org/x/text/collate/table_test.go @@ -0,0 +1,291 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package collate + +import ( + "testing" + + "golang.org/x/text/collate/build" + "golang.org/x/text/collate/colltab" + "golang.org/x/text/unicode/norm" +) + +type ColElems []Weights + +type input struct { + str string + ces [][]int +} + +type check struct { + in string + n int + out ColElems +} + +type tableTest struct { + in []input + chk []check +} + +func w(ce ...int) Weights { + return W(ce...) +} + +var defaults = w(0) + +func pt(p, t int) []int { + return []int{p, defaults.Secondary, t} +} + +func makeTable(in []input) (*Collator, error) { + b := build.NewBuilder() + for _, r := range in { + if e := b.Add([]rune(r.str), r.ces, nil); e != nil { + panic(e) + } + } + t, err := b.Build() + if err != nil { + return nil, err + } + return NewFromTable(t), nil +} + +// modSeq holds a seqeunce of modifiers in increasing order of CCC long enough +// to cause a segment overflow if not handled correctly. The last rune in this +// list has a CCC of 214. +var modSeq = []rune{ + 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, 0x05B8, 0x05B9, 0x05BB, + 0x05BC, 0x05BD, 0x05BF, 0x05C1, 0x05C2, 0xFB1E, 0x064B, 0x064C, 0x064D, 0x064E, + 0x064F, 0x0650, 0x0651, 0x0652, 0x0670, 0x0711, 0x0C55, 0x0C56, 0x0E38, 0x0E48, + 0x0EB8, 0x0EC8, 0x0F71, 0x0F72, 0x0F74, 0x0321, 0x1DCE, +} + +var mods []input +var modW = func() ColElems { + ws := ColElems{} + for _, r := range modSeq { + rune := norm.NFC.PropertiesString(string(r)) + ws = append(ws, w(0, int(rune.CCC()))) + mods = append(mods, input{string(r), [][]int{{0, int(rune.CCC())}}}) + } + return ws +}() + +var appendNextTests = []tableTest{ + { // test getWeights + []input{ + {"a", [][]int{{100}}}, + {"b", [][]int{{105}}}, + {"c", [][]int{{110}}}, + {"ß", [][]int{{120}}}, + }, + []check{ + {"a", 1, ColElems{w(100)}}, + {"b", 1, ColElems{w(105)}}, + {"c", 1, ColElems{w(110)}}, + {"d", 1, ColElems{w(0x50064)}}, + {"ab", 1, ColElems{w(100)}}, + {"bc", 1, ColElems{w(105)}}, + {"dd", 1, ColElems{w(0x50064)}}, + {"ß", 2, ColElems{w(120)}}, + }, + }, + { // test expansion + []input{ + {"u", [][]int{{100}}}, + {"U", [][]int{{100}, {0, 25}}}, + {"w", [][]int{{100}, {100}}}, + {"W", [][]int{{100}, {0, 25}, {100}, {0, 25}}}, + }, + []check{ + {"u", 1, ColElems{w(100)}}, + {"U", 1, ColElems{w(100), w(0, 25)}}, + {"w", 1, ColElems{w(100), w(100)}}, + {"W", 1, ColElems{w(100), w(0, 25), w(100), w(0, 25)}}, + }, + }, + { // test decompose + []input{ + {"D", [][]int{pt(104, 8)}}, + {"z", [][]int{pt(130, 8)}}, + {"\u030C", [][]int{{0, 40}}}, // Caron + {"\u01C5", [][]int{pt(104, 9), pt(130, 4), {0, 40, 0x1F}}}, // Dž = D+z+caron + }, + []check{ + {"\u01C5", 2, ColElems{w(pt(104, 9)...), w(pt(130, 4)...), w(0, 40, 0x1F)}}, + }, + }, + { // test basic contraction + []input{ + {"a", [][]int{{100}}}, + {"ab", [][]int{{101}}}, + {"aab", [][]int{{101}, {101}}}, + {"abc", [][]int{{102}}}, + {"b", [][]int{{200}}}, + {"c", [][]int{{300}}}, + {"d", [][]int{{400}}}, + }, + []check{ + {"a", 1, ColElems{w(100)}}, + {"aa", 1, ColElems{w(100)}}, + {"aac", 1, ColElems{w(100)}}, + {"d", 1, ColElems{w(400)}}, + {"ab", 2, ColElems{w(101)}}, + {"abb", 2, ColElems{w(101)}}, + {"aab", 3, ColElems{w(101), w(101)}}, + {"aaba", 3, ColElems{w(101), w(101)}}, + {"abc", 3, ColElems{w(102)}}, + {"abcd", 3, ColElems{w(102)}}, + }, + }, + { // test discontinuous contraction + append(mods, []input{ + // modifiers; secondary weight equals ccc + {"\u0316", [][]int{{0, 220}}}, + {"\u0317", [][]int{{0, 220}, {0, 220}}}, + {"\u302D", [][]int{{0, 222}}}, + {"\u302E", [][]int{{0, 225}}}, // used as starter + {"\u302F", [][]int{{0, 224}}}, // used as starter + {"\u18A9", [][]int{{0, 228}}}, + {"\u0300", [][]int{{0, 230}}}, + {"\u0301", [][]int{{0, 230}}}, + {"\u0315", [][]int{{0, 232}}}, + {"\u031A", [][]int{{0, 232}}}, + {"\u035C", [][]int{{0, 233}}}, + {"\u035F", [][]int{{0, 233}}}, + {"\u035D", [][]int{{0, 234}}}, + {"\u035E", [][]int{{0, 234}}}, + {"\u0345", [][]int{{0, 240}}}, + + // starters + {"a", [][]int{{100}}}, + {"b", [][]int{{200}}}, + {"c", [][]int{{300}}}, + {"\u03B1", [][]int{{900}}}, + {"\x01", [][]int{{0, 0, 0, 0}}}, + + // contractions + {"a\u0300", [][]int{{101}}}, + {"a\u0301", [][]int{{102}}}, + {"a\u035E", [][]int{{110}}}, + {"a\u035Eb\u035E", [][]int{{115}}}, + {"ac\u035Eaca\u035E", [][]int{{116}}}, + {"a\u035Db\u035D", [][]int{{117}}}, + {"a\u0301\u035Db", [][]int{{120}}}, + {"a\u0301\u035F", [][]int{{121}}}, + {"a\u0301\u035Fb", [][]int{{119}}}, + {"\u03B1\u0345", [][]int{{901}, {902}}}, + {"\u302E\u302F", [][]int{{0, 131}, {0, 131}}}, + {"\u302F\u18A9", [][]int{{0, 130}}}, + }...), + []check{ + {"a\x01\u0300", 1, ColElems{w(100)}}, + {"ab", 1, ColElems{w(100)}}, // closing segment + {"a\u0316\u0300b", 5, ColElems{w(101), w(0, 220)}}, // closing segment + {"a\u0316\u0300", 5, ColElems{w(101), w(0, 220)}}, // no closing segment + {"a\u0316\u0300\u035Cb", 5, ColElems{w(101), w(0, 220)}}, // completes before segment end + {"a\u0316\u0300\u035C", 5, ColElems{w(101), w(0, 220)}}, // completes before segment end + + {"a\u0316\u0301b", 5, ColElems{w(102), w(0, 220)}}, // closing segment + {"a\u0316\u0301", 5, ColElems{w(102), w(0, 220)}}, // no closing segment + {"a\u0316\u0301\u035Cb", 5, ColElems{w(102), w(0, 220)}}, // completes before segment end + {"a\u0316\u0301\u035C", 5, ColElems{w(102), w(0, 220)}}, // completes before segment end + + // match blocked by modifier with same ccc + {"a\u0301\u0315\u031A\u035Fb", 3, ColElems{w(102)}}, + + // multiple gaps + {"a\u0301\u035Db", 6, ColElems{w(120)}}, + {"a\u0301\u035F", 5, ColElems{w(121)}}, + {"a\u0301\u035Fb", 6, ColElems{w(119)}}, + {"a\u0316\u0301\u035F", 7, ColElems{w(121), w(0, 220)}}, + {"a\u0301\u0315\u035Fb", 7, ColElems{w(121), w(0, 232)}}, + {"a\u0316\u0301\u0315\u035Db", 5, ColElems{w(102), w(0, 220)}}, + {"a\u0316\u0301\u0315\u035F", 9, ColElems{w(121), w(0, 220), w(0, 232)}}, + {"a\u0316\u0301\u0315\u035Fb", 9, ColElems{w(121), w(0, 220), w(0, 232)}}, + {"a\u0316\u0301\u0315\u035F\u035D", 9, ColElems{w(121), w(0, 220), w(0, 232)}}, + {"a\u0316\u0301\u0315\u035F\u035Db", 9, ColElems{w(121), w(0, 220), w(0, 232)}}, + + // handling of segment overflow + { // just fits within segment + "a" + string(modSeq[:30]) + "\u0301", + 3 + len(string(modSeq[:30])), + append(ColElems{w(102)}, modW[:30]...), + }, + {"a" + string(modSeq[:31]) + "\u0301", 1, ColElems{w(100)}}, // overflow + {"a" + string(modSeq) + "\u0301", 1, ColElems{w(100)}}, + { // just fits within segment with two interstitial runes + "a" + string(modSeq[:28]) + "\u0301\u0315\u035F", + 7 + len(string(modSeq[:28])), + append(append(ColElems{w(121)}, modW[:28]...), w(0, 232)), + }, + { // second half does not fit within segment + "a" + string(modSeq[:29]) + "\u0301\u0315\u035F", + 3 + len(string(modSeq[:29])), + append(ColElems{w(102)}, modW[:29]...), + }, + + // discontinuity can only occur in last normalization segment + {"a\u035Eb\u035E", 6, ColElems{w(115)}}, + {"a\u0316\u035Eb\u035E", 5, ColElems{w(110), w(0, 220)}}, + {"a\u035Db\u035D", 6, ColElems{w(117)}}, + {"a\u0316\u035Db\u035D", 1, ColElems{w(100)}}, + {"a\u035Eb\u0316\u035E", 8, ColElems{w(115), w(0, 220)}}, + {"a\u035Db\u0316\u035D", 8, ColElems{w(117), w(0, 220)}}, + {"ac\u035Eaca\u035E", 9, ColElems{w(116)}}, + {"a\u0316c\u035Eaca\u035E", 1, ColElems{w(100)}}, + {"ac\u035Eac\u0316a\u035E", 1, ColElems{w(100)}}, + + // expanding contraction + {"\u03B1\u0345", 4, ColElems{w(901), w(902)}}, + + // Theoretical possibilities + // contraction within a gap + {"a\u302F\u18A9\u0301", 9, ColElems{w(102), w(0, 130)}}, + // expansion within a gap + {"a\u0317\u0301", 5, ColElems{w(102), w(0, 220), w(0, 220)}}, + // repeating CCC blocks last modifier + {"a\u302E\u302F\u0301", 1, ColElems{w(100)}}, + // The trailing combining characters (with lower CCC) should block the first one. + // TODO: make the following pass. + // {"a\u035E\u0316\u0316", 1, ColElems{w(100)}}, + {"a\u035F\u035Eb", 5, ColElems{w(110), w(0, 233)}}, + // Last combiner should match after normalization. + // TODO: make the following pass. + // {"a\u035D\u0301", 3, ColElems{w(102), w(0, 234)}}, + // The first combiner is blocking the second one as they have the same CCC. + {"a\u035D\u035Eb", 1, ColElems{w(100)}}, + }, + }, +} + +func TestAppendNext(t *testing.T) { + for i, tt := range appendNextTests { + c, err := makeTable(tt.in) + if err != nil { + t.Errorf("%d: error creating table: %v", i, err) + continue + } + for j, chk := range tt.chk { + ws, n := c.t.AppendNext(nil, []byte(chk.in)) + if n != chk.n { + t.Errorf("%d:%d: bytes consumed was %d; want %d", i, j, n, chk.n) + } + out := convertFromWeights(chk.out) + if len(ws) != len(out) { + t.Errorf("%d:%d: len(ws) was %d; want %d (%X vs %X)\n%X", i, j, len(ws), len(out), ws, out, chk.in) + continue + } + for k, w := range ws { + w, _ = colltab.MakeElem(w.Primary(), w.Secondary(), int(w.Tertiary()), 0) + if w != out[k] { + t.Errorf("%d:%d: Weights %d was %X; want %X", i, j, k, w, out[k]) + } + } + } + } +} diff --git a/vendor/golang.org/x/text/collate/tables.go b/vendor/golang.org/x/text/collate/tables.go new file mode 100644 index 0000000000..f6d31f1cf5 --- /dev/null +++ b/vendor/golang.org/x/text/collate/tables.go @@ -0,0 +1,73207 @@ +// This file was generated by go generate; DO NOT EDIT + +package collate + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "6.2.0" + +// CLDRVersion is the CLDR version from which the tables in this package are derived. +const CLDRVersion = "23" + +var availableLocales = "und,aa,af,ar,as,az,be,bg,bn,bs,bs-Cyrl,ca,cs,cy,da,de,dz,ee,el,en,en-US,en-US-u-va-posix,eo,es,et,fa,fa-AF,fi,fil,fo,fr,fr-CA,gu,ha,haw,he,hi,hr,hu,hy,ig,is,ja,kk,kl,km,kn,ko,kok,ln,lt,lv,mk,ml,mr,mt,my,nb,nn,nso,om,or,pa,pl,ps,ro,ru,se,si,sk,sl,sq,sr,sr-Latn,ssy,sv,ta,te,th,tn,to,tr,uk,ur,vi,wae,yo,zh,zh-Hant" + +const varTop = 0x30e + +var locales = [...]tableIndex{ + { // und + lookupOffset: 0x15, + valuesOffset: 0x0, + }, + { // aa + lookupOffset: 0x1c, + valuesOffset: 0x1b4, + }, + { // af + lookupOffset: 0x1d, + valuesOffset: 0x0, + }, + { // ar + lookupOffset: 0x1f, + valuesOffset: 0x0, + }, + { // as + lookupOffset: 0x21, + valuesOffset: 0x0, + }, + { // az + lookupOffset: 0x27, + valuesOffset: 0x1d7, + }, + { // be + lookupOffset: 0x28, + valuesOffset: 0x0, + }, + { // bg + lookupOffset: 0x15, + valuesOffset: 0x0, + }, + { // bn + lookupOffset: 0x2a, + valuesOffset: 0x0, + }, + { // bs + lookupOffset: 0x15, + valuesOffset: 0x0, + }, + { // bs-Cyrl + lookupOffset: 0x15, + valuesOffset: 0x0, + }, + { // ca + lookupOffset: 0x2b, + valuesOffset: 0x1ec, + }, + { // cs + lookupOffset: 0x2d, + valuesOffset: 0x1f0, + }, + { // cy + lookupOffset: 0x15, + valuesOffset: 0x1f5, + }, + { // da + lookupOffset: 0x30, + valuesOffset: 0x1f7, + }, + { // de + lookupOffset: 0x15, + valuesOffset: 0x0, + }, + { // dz + lookupOffset: 0x32, + valuesOffset: 0x0, + }, + { // ee + lookupOffset: 0x38, + valuesOffset: 0x204, + }, + { // el + lookupOffset: 0x15, + valuesOffset: 0x0, + }, + { // en + lookupOffset: 0x15, + valuesOffset: 0x0, + }, + { // en-US + lookupOffset: 0x15, + valuesOffset: 0x0, + }, + { // en-US-u-va-posix + lookupOffset: 0x3f, + valuesOffset: 0x213, + }, + { // eo + lookupOffset: 0x40, + valuesOffset: 0x235, + }, + { // es + lookupOffset: 0x41, + valuesOffset: 0x239, + }, + { // et + lookupOffset: 0x47, + valuesOffset: 0x23c, + }, + { // fa + lookupOffset: 0x49, + valuesOffset: 0x0, + }, + { // fa-AF + lookupOffset: 0x15, + valuesOffset: 0x0, + }, + { // fi + lookupOffset: 0x4c, + valuesOffset: 0x254, + }, + { // fil + lookupOffset: 0x41, + valuesOffset: 0x25f, + }, + { // fo + lookupOffset: 0x30, + valuesOffset: 0x1f7, + }, + { // fr + lookupOffset: 0x15, + valuesOffset: 0x0, + }, + { // fr-CA + lookupOffset: 0x15, + valuesOffset: 0x0, + }, + { // gu + lookupOffset: 0x4e, + valuesOffset: 0x0, + }, + { // ha + lookupOffset: 0x4f, + valuesOffset: 0x262, + }, + { // haw + lookupOffset: 0x56, + valuesOffset: 0x267, + }, + { // he + lookupOffset: 0x57, + valuesOffset: 0x0, + }, + { // hi + lookupOffset: 0x59, + valuesOffset: 0x0, + }, + { // hr + lookupOffset: 0x5b, + valuesOffset: 0x27e, + }, + { // hu + lookupOffset: 0x5d, + valuesOffset: 0x284, + }, + { // hy + lookupOffset: 0x5e, + valuesOffset: 0x0, + }, + { // ig + lookupOffset: 0x60, + valuesOffset: 0x28c, + }, + { // is + lookupOffset: 0x62, + valuesOffset: 0x290, + }, + { // ja + lookupOffset: 0x6e, + valuesOffset: 0x0, + }, + { // kk + lookupOffset: 0x6f, + valuesOffset: 0x0, + }, + { // kl + lookupOffset: 0x70, + valuesOffset: 0x401, + }, + { // km + lookupOffset: 0x72, + valuesOffset: 0x0, + }, + { // kn + lookupOffset: 0x74, + valuesOffset: 0x0, + }, + { // ko + lookupOffset: 0x80, + valuesOffset: 0x0, + }, + { // kok + lookupOffset: 0x82, + valuesOffset: 0x0, + }, + { // ln + lookupOffset: 0x83, + valuesOffset: 0x0, + }, + { // lt + lookupOffset: 0x89, + valuesOffset: 0x55f, + }, + { // lv + lookupOffset: 0x8b, + valuesOffset: 0x56d, + }, + { // mk + lookupOffset: 0x15, + valuesOffset: 0x0, + }, + { // ml + lookupOffset: 0x8d, + valuesOffset: 0x0, + }, + { // mr + lookupOffset: 0x8f, + valuesOffset: 0x0, + }, + { // mt + lookupOffset: 0x92, + valuesOffset: 0x575, + }, + { // my + lookupOffset: 0x94, + valuesOffset: 0x0, + }, + { // nb + lookupOffset: 0x30, + valuesOffset: 0x57e, + }, + { // nn + lookupOffset: 0x30, + valuesOffset: 0x57e, + }, + { // nso + lookupOffset: 0x96, + valuesOffset: 0x580, + }, + { // om + lookupOffset: 0x15, + valuesOffset: 0x586, + }, + { // or + lookupOffset: 0x98, + valuesOffset: 0x0, + }, + { // pa + lookupOffset: 0x9a, + valuesOffset: 0x0, + }, + { // pl + lookupOffset: 0x9c, + valuesOffset: 0x58c, + }, + { // ps + lookupOffset: 0x9f, + valuesOffset: 0x0, + }, + { // ro + lookupOffset: 0xa1, + valuesOffset: 0x59e, + }, + { // ru + lookupOffset: 0x15, + valuesOffset: 0x0, + }, + { // se + lookupOffset: 0xa3, + valuesOffset: 0x5a5, + }, + { // si + lookupOffset: 0xa5, + valuesOffset: 0x0, + }, + { // sk + lookupOffset: 0xa7, + valuesOffset: 0x5b2, + }, + { // sl + lookupOffset: 0xa8, + valuesOffset: 0x5b7, + }, + { // sq + lookupOffset: 0xaa, + valuesOffset: 0x5ba, + }, + { // sr + lookupOffset: 0x15, + valuesOffset: 0x0, + }, + { // sr-Latn + lookupOffset: 0x15, + valuesOffset: 0x0, + }, + { // ssy + lookupOffset: 0x1c, + valuesOffset: 0x1b4, + }, + { // sv + lookupOffset: 0xac, + valuesOffset: 0x5be, + }, + { // ta + lookupOffset: 0xae, + valuesOffset: 0x0, + }, + { // te + lookupOffset: 0xb0, + valuesOffset: 0x0, + }, + { // th + lookupOffset: 0xb2, + valuesOffset: 0x0, + }, + { // tn + lookupOffset: 0x96, + valuesOffset: 0x580, + }, + { // to + lookupOffset: 0xb4, + valuesOffset: 0x5c9, + }, + { // tr + lookupOffset: 0xba, + valuesOffset: 0x5d5, + }, + { // uk + lookupOffset: 0xbb, + valuesOffset: 0x0, + }, + { // ur + lookupOffset: 0xbd, + valuesOffset: 0x0, + }, + { // vi + lookupOffset: 0xbf, + valuesOffset: 0x5e4, + }, + { // wae + lookupOffset: 0xc0, + valuesOffset: 0x5f8, + }, + { // yo + lookupOffset: 0xc2, + valuesOffset: 0x5fb, + }, + { // zh + lookupOffset: 0xdc, + valuesOffset: 0x600, + }, + { // zh-Hant + lookupOffset: 0xf5, + valuesOffset: 0x600, + }, +} + +// mainExpandElem: 46754 entries, 187016 bytes +var mainExpandElem = [46754]uint32{ + // Block 0, offset 0x0 + 0x00000002, 0xAE604702, 0xAE603202, 0x00000002, 0xA000A51A, 0xA000BA1A, + 0x00000002, 0xA000A91A, 0xA000BA1A, 0x00000002, 0xA000AD1A, 0xA000BA1A, + 0x00000002, 0xA000B21A, 0xA000BA1A, 0x00000002, 0xA000B61A, 0xA000BA1A, + 0x00000002, 0xA000BA1A, 0xA000D11A, 0x00000004, 0x0003F484, 0x0029CE84, + 0x0029CC84, 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, 0x0029CE84, + 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, 0x0029D084, 0x0003F69F, + 0x00000004, 0x0003F484, 0x0029CE84, 0x0029D284, 0x0003F69F, 0x00000004, + 0x0003F484, 0x0029CE84, 0x0029D484, 0x0003F69F, 0x00000004, 0x0003F484, + 0x0029CE84, 0x0029D684, 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, + 0x0029D884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, 0x0029DA84, + 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, + // Block 1, offset 0x40 + 0x0029DC84, 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, 0x0029DE84, + 0x0003F69F, 0x00000004, 0x0003F484, 0x0029D084, 0x0029CC84, 0x0003F69F, + 0x00000004, 0x0003F484, 0x0062AC84, 0x0063A884, 0x0003F69F, 0x00000004, + 0x0003F484, 0x0062B084, 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, + 0x0062B284, 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062B684, + 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062B884, 0x0063A884, + 0x0003F69F, 0x00000004, 0x0003F484, 0x0062BA84, 0x0063A884, 0x0003F69F, + 0x00000004, 0x0003F484, 0x0062BE84, 0x0063A884, 0x0003F69F, 0x00000004, + 0x0003F484, 0x0062C284, 0x0063A884, 0x0003F69F, 0x00000007, 0x0003F484, + 0x0062C284, 0x0063B884, 0x0062C484, 0x0063B084, 0x00646A84, 0x0003F69F, + 0x00000006, 0x0003F484, 0x0062C284, 0x0063B884, + // Block 2, offset 0x80 + 0x0062D084, 0x0063C284, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062C484, + 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062C484, 0x0063C284, + 0x0003F69F, 0x00000004, 0x0003F484, 0x0062C884, 0x0063A884, 0x0003F69F, + 0x00000004, 0x0003F484, 0x0062CA84, 0x0063A884, 0x0003F69F, 0x00000004, + 0x0003F484, 0x0062CC84, 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, + 0x0062CE84, 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062D084, + 0x0063A884, 0x0003F69F, 0x00000004, 0x00050E84, 0x00050E84, 0x00050E84, + 0x00050E9F, 0x00000002, 0x40062C20, 0xAE603202, 0x00000002, 0x40062C20, + 0xAE603502, 0x00000002, 0x40062C20, 0xAE604502, 0x00000002, 0x40063620, + 0xAE603202, 0x00000002, 0x40063620, 0xAE603502, 0x00000002, 0x40063620, + 0xAE604502, 0x00000002, 0x40063820, 0xAE603202, + // Block 3, offset 0xc0 + 0x00000002, 0x40063820, 0xAE603502, 0x00000002, 0x40063820, 0xAE604502, + 0x00000002, 0x40084420, 0xA0105402, 0x00000002, 0x40084620, 0xA0105402, + 0x00000002, 0x40084C20, 0xA0105402, 0x00000002, 0x4008B820, 0xA0105402, + 0x00000002, 0x4008BC20, 0xA0105402, 0x00000002, 0x4008C020, 0xA0105402, + 0x00000002, 0x40091E20, 0xA0105402, 0x00000002, 0x40092620, 0xA0105402, + 0x00000002, 0x40092A20, 0xA0105402, 0x00000002, 0x40094020, 0xA0105402, + 0x00000002, 0x40094220, 0xA0105402, 0x00000002, 0x40094420, 0xA0105402, + 0x00000002, 0x40097820, 0xA0105402, 0x00000002, 0x40097A20, 0xA0105402, + 0x00000004, 0x00098484, 0x00098484, 0x00098484, 0x0009849F, 0x00000002, + 0x40099E20, 0xA0105402, 0x00000002, 0x4009AA20, 0xA0105402, 0x00000002, + 0x4009AC20, 0xA0105402, 0x00000002, 0x4009B020, + // Block 4, offset 0x100 + 0xA0105402, 0x00000002, 0x4009B820, 0xA0105402, 0x00000002, 0x4009DE20, + 0xA0105402, 0x00000002, 0x4009E220, 0xA0105402, 0x00000002, 0x4009E420, + 0xA0105402, 0x00000002, 0x4009F420, 0xA0105402, 0x00000002, 0x4009F620, + 0xA0105402, 0x00000002, 0x4009F820, 0xA0105402, 0x00000002, 0x4009FA20, + 0xA0105402, 0x00000002, 0x4009FC20, 0xA0105402, 0x00000002, 0x4009FE20, + 0xA0105402, 0x00000002, 0x400A0020, 0xA0105402, 0x00000002, 0x400A0220, + 0xA0105402, 0x00000002, 0x400A0820, 0xA0105402, 0x00000002, 0x400A0A20, + 0xA0105402, 0x00000002, 0x400A0C20, 0xA0105402, 0x00000002, 0x400A0E20, + 0xA0105402, 0x00000002, 0x400A1E20, 0xA0105402, 0x00000002, 0x400A2020, + 0xA0105402, 0x00000002, 0x400A4020, 0xA0105402, 0x00000002, 0x400A4C20, + 0xA0105402, 0x00000002, 0x400A4E20, 0xA0105402, + // Block 5, offset 0x140 + 0x00000002, 0x400A5220, 0xA0105402, 0x00000002, 0x400A5820, 0xA0105402, + 0x00000002, 0x400A5A20, 0xA0105402, 0x00000002, 0x400A5C20, 0xA0105402, + 0x00000002, 0x400A5E20, 0xA0105402, 0x00000002, 0x40164620, 0xA0105402, + 0x00000002, 0x4027CE20, 0xA0012802, 0x00000002, 0x4027D020, 0xA0012802, + 0x00000002, 0x4027D420, 0xA0812802, 0x00000002, 0x4027D820, 0xA0812802, + 0x00000002, 0x4029CC20, 0xA0013F02, 0x00000002, 0x4029CC20, 0xA0014002, + 0x00000002, 0x4029CC20, 0xA0014202, 0x00000002, 0x4029CC20, 0xA0014402, + 0x00000002, 0x4029CC20, 0xA0014502, 0x00000002, 0x4029CC20, 0xA0014602, + 0x00000002, 0x4029CC20, 0xA0014702, 0x00000002, 0x4029CC20, 0xA0014802, + 0x00000002, 0x4029CC20, 0xA0014902, 0x00000002, 0x4029CC20, 0xA0014A02, + 0x00000002, 0x4029CC20, 0xA0014B02, 0x00000002, + // Block 6, offset 0x180 + 0x4029CC20, 0xA0014B02, 0x00000002, 0x4029CC20, 0xA0014C02, 0x00000002, + 0x4029CC20, 0xA0014D02, 0x00000002, 0x4029CC20, 0xA0014E02, 0x00000002, + 0x4029CC20, 0xA0014F02, 0x00000002, 0x4029CC20, 0xA0015002, 0x00000002, + 0x4029CC20, 0xA0015102, 0x00000002, 0x4029CC20, 0xA0015202, 0x00000002, + 0x4029CC20, 0xA0015302, 0x00000002, 0x4029CC20, 0xA0015402, 0x00000002, + 0x4029CC20, 0xA0015502, 0x00000002, 0x4029CC20, 0xA0015602, 0x00000002, + 0x0029CC84, 0xA0015604, 0x00000002, 0x4029CC20, 0xA0015702, 0x00000002, + 0x4029CC20, 0xA0015802, 0x00000002, 0x4029CC20, 0xA0015902, 0x00000002, + 0x4029CC20, 0xA0015A02, 0x00000002, 0x4029CC20, 0xA0015B02, 0x00000002, + 0x4029CC20, 0xA0015C02, 0x00000002, 0x4029CC20, 0xA0015D02, 0x00000002, + 0x4029CC20, 0xA0015E02, 0x00000002, 0x4029CC20, + // Block 7, offset 0x1c0 + 0xA0015F02, 0x00000002, 0x4029CC20, 0xA0016002, 0x00000002, 0x4029CC20, + 0xA0016102, 0x00000002, 0x4029CC20, 0xA0016202, 0x00000002, 0x4029CC20, + 0xA0016302, 0x00000002, 0x4029CC20, 0xA0016402, 0x00000002, 0x4029CC20, + 0xA0016502, 0x00000002, 0x4029CC20, 0xA0016602, 0x00000002, 0x4029CC20, + 0xA0016802, 0x00000002, 0x4029CC20, 0xA0017202, 0x00000002, 0x4029CC20, + 0xA0017302, 0x00000002, 0x4029CC20, 0xA0017402, 0x00000003, 0x0029CC9E, + 0x0009589E, 0x0029D29E, 0x00000002, 0x4029CE20, 0xA0013F02, 0x00000002, + 0x4029CE20, 0xA0014002, 0x00000002, 0x4029CE20, 0xA0014102, 0x00000002, + 0x4029CE20, 0xA0014202, 0x00000002, 0x4029CE20, 0xA0014302, 0x00000002, + 0x4029CE20, 0xA0014402, 0x00000002, 0x4029CE20, 0xA0014502, 0x00000002, + 0x4029CE20, 0xA0014602, 0x00000002, 0x4029CE20, + // Block 8, offset 0x200 + 0xA0014702, 0x00000002, 0x4029CE20, 0xA0014802, 0x00000002, 0x4029CE20, + 0xA0014902, 0x00000002, 0x4029CE20, 0xA0014A02, 0x00000002, 0x4029CE20, + 0xA0014B02, 0x00000002, 0x4029CE20, 0xA0014B02, 0x00000002, 0x4029CE20, + 0xA0014B02, 0x00000002, 0x4029CE20, 0xA0014C02, 0x00000002, 0x4029CE20, + 0xA0014D02, 0x00000002, 0x4029CE20, 0xA0014E02, 0x00000002, 0x4029CE20, + 0xA0014F02, 0x00000002, 0x4029CE20, 0xA0015002, 0x00000002, 0x4029CE20, + 0xA0015102, 0x00000002, 0x4029CE20, 0xA0015102, 0x00000002, 0x4029CE20, + 0xA0015202, 0x00000002, 0x4029CE20, 0xA0015302, 0x00000002, 0x4029CE20, + 0xA0015402, 0x00000002, 0x4029CE20, 0xA0015502, 0x00000002, 0x4029CE20, + 0xA0015602, 0x00000002, 0x0029CE84, 0xA0015604, 0x00000002, 0x4029CE20, + 0xA0015702, 0x00000002, 0x4029CE20, 0xA0015802, + // Block 9, offset 0x240 + 0x00000002, 0x4029CE20, 0xA0015902, 0x00000002, 0x4029CE20, 0xA0015A02, + 0x00000002, 0x4029CE20, 0xA0015B02, 0x00000002, 0x4029CE20, 0xA0015C02, + 0x00000002, 0x4029CE20, 0xA0015D02, 0x00000002, 0x4029CE20, 0xA0015E02, + 0x00000002, 0x4029CE20, 0xA0015F02, 0x00000002, 0x4029CE20, 0xA0016002, + 0x00000002, 0x4029CE20, 0xA0016102, 0x00000002, 0x4029CE20, 0xA0016202, + 0x00000002, 0x4029CE20, 0xA0016302, 0x00000002, 0x4029CE20, 0xA0016402, + 0x00000002, 0x4029CE20, 0xA0016502, 0x00000002, 0x4029CE20, 0xA0016602, + 0x00000002, 0x4029CE20, 0xA0016702, 0x00000002, 0x4029CE20, 0xA0016802, + 0x00000002, 0x4029CE20, 0xA0016802, 0x00000002, 0x4029CE20, 0xA0016802, + 0x00000002, 0x4029CE20, 0xA0016802, 0x00000002, 0x4029CE20, 0xA0016A02, + 0x00000002, 0x4029CE20, 0xA0016B02, 0x00000002, + // Block 10, offset 0x280 + 0x4029CE20, 0xA0016C02, 0x00000002, 0x4029CE20, 0xA0016C02, 0x00000002, + 0x4029CE20, 0xA0016C02, 0x00000002, 0x4029CE20, 0xA0016C02, 0x00000002, + 0x4029CE20, 0xA0016C02, 0x00000002, 0x4029CE20, 0xA0016C02, 0x00000002, + 0x4029CE20, 0xA0016D02, 0x00000002, 0x4029CE20, 0xA0016E02, 0x00000002, + 0x4029CE20, 0xA0016F02, 0x00000002, 0x4029CE20, 0xA0017002, 0x00000002, + 0x4029CE20, 0xA0017102, 0x00000002, 0x4029CE20, 0xA0017202, 0x00000002, + 0x4029CE20, 0xA0017302, 0x00000002, 0x4029CE20, 0xA0017402, 0x00000002, + 0x4029CE20, 0xA0017502, 0x00000002, 0x4029CE20, 0xA0017602, 0x00000002, + 0x4029CE20, 0xA0017702, 0x00000004, 0x0029CE9E, 0x0009589E, 0x0029CE9E, + 0x0029CC9E, 0x00000003, 0x0029CE9E, 0x0009589E, 0x0029D09E, 0x00000003, + 0x0029CE9E, 0x0009589E, 0x0029D29E, 0x00000003, + // Block 11, offset 0x2c0 + 0x0029CE9E, 0x0009589E, 0x0029D49E, 0x00000003, 0x0029CE9E, 0x0009589E, + 0x0029D69E, 0x00000003, 0x0029CE9E, 0x0009589E, 0x0029D89E, 0x00000003, + 0x0029CE9E, 0x0009589E, 0x0029DA9E, 0x00000003, 0x0029CE9E, 0x0009589E, + 0x0029DC9E, 0x00000003, 0x0029CE9E, 0x0009589E, 0x0029DE9E, 0x00000002, + 0x0029CE86, 0x0029CC86, 0x00000002, 0x0029CE86, 0x0029CC86, 0x00000002, + 0x0029CE86, 0x0029CC86, 0x00000002, 0x0029CE86, 0x0029CC86, 0x00000002, + 0x0029CE86, 0x0029CC86, 0x00000002, 0x0029CE86, 0x0029CE86, 0x00000002, + 0x0029CE86, 0x0029D086, 0x00000002, 0x0029CE86, 0x0029D286, 0x00000002, + 0x0029CE86, 0x0029D486, 0x00000002, 0x0029CE86, 0x0029D686, 0x00000002, + 0x0029CE86, 0x0029D886, 0x00000002, 0x0029CE86, 0x0029DA86, 0x00000002, + 0x0029CE86, 0x0029DC86, 0x00000002, 0x0029CE86, + // Block 12, offset 0x300 + 0x0029DE86, 0x00000002, 0x4029D020, 0xA0013F02, 0x00000002, 0x4029D020, + 0xA0014002, 0x00000002, 0x4029D020, 0xA0014102, 0x00000002, 0x4029D020, + 0xA0014202, 0x00000002, 0x4029D020, 0xA0014302, 0x00000002, 0x4029D020, + 0xA0014402, 0x00000002, 0x4029D020, 0xA0014502, 0x00000002, 0x4029D020, + 0xA0014602, 0x00000002, 0x4029D020, 0xA0014702, 0x00000002, 0x4029D020, + 0xA0014802, 0x00000002, 0x4029D020, 0xA0014902, 0x00000002, 0x4029D020, + 0xA0014A02, 0x00000002, 0x4029D020, 0xA0014B02, 0x00000002, 0x4029D020, + 0xA0014B02, 0x00000002, 0x4029D020, 0xA0014B02, 0x00000002, 0x4029D020, + 0xA0014C02, 0x00000002, 0x4029D020, 0xA0014D02, 0x00000002, 0x4029D020, + 0xA0014E02, 0x00000002, 0x4029D020, 0xA0014F02, 0x00000002, 0x4029D020, + 0xA0015002, 0x00000002, 0x4029D020, 0xA0015102, + // Block 13, offset 0x340 + 0x00000002, 0x4029D020, 0xA0015202, 0x00000002, 0x4029D020, 0xA0015302, + 0x00000002, 0x4029D020, 0xA0015402, 0x00000002, 0x4029D020, 0xA0015502, + 0x00000002, 0x4029D020, 0xA0015602, 0x00000002, 0x0029D084, 0xA0015604, + 0x00000002, 0x4029D020, 0xA0015702, 0x00000002, 0x4029D020, 0xA0015802, + 0x00000002, 0x4029D020, 0xA0015902, 0x00000002, 0x4029D020, 0xA0015A02, + 0x00000002, 0x4029D020, 0xA0015B02, 0x00000002, 0x4029D020, 0xA0015C02, + 0x00000002, 0x4029D020, 0xA0015D02, 0x00000002, 0x4029D020, 0xA0015E02, + 0x00000002, 0x4029D020, 0xA0015F02, 0x00000002, 0x4029D020, 0xA0016002, + 0x00000002, 0x4029D020, 0xA0016102, 0x00000002, 0x4029D020, 0xA0016202, + 0x00000002, 0x4029D020, 0xA0016302, 0x00000002, 0x4029D020, 0xA0016402, + 0x00000002, 0x4029D020, 0xA0016502, 0x00000002, + // Block 14, offset 0x380 + 0x4029D020, 0xA0016602, 0x00000002, 0x4029D020, 0xA0016702, 0x00000002, + 0x4029D020, 0xA0016802, 0x00000002, 0x4029D020, 0xA0016802, 0x00000002, + 0x4029D020, 0xA0016802, 0x00000002, 0x4029D020, 0xA0016802, 0x00000002, + 0x4029D020, 0xA0016B02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, + 0x4029D020, 0xA0016C02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, + 0x4029D020, 0xA0016C02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, + 0x4029D020, 0xA0016C02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, + 0x4029D020, 0xA0016C02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, + 0x4029D020, 0xA0016E02, 0x00000002, 0x4029D020, 0xA0016F02, 0x00000002, + 0x4029D020, 0xA0017002, 0x00000002, 0x4029D020, 0xA0017102, 0x00000002, + 0x4029D020, 0xA0017202, 0x00000002, 0x4029D020, + // Block 15, offset 0x3c0 + 0xA0017302, 0x00000002, 0x4029D020, 0xA0017402, 0x00000002, 0x4029D020, + 0xA0017502, 0x00000002, 0x4029D020, 0xA0017602, 0x00000002, 0x4029D020, + 0xA0017702, 0x00000003, 0x0029D09E, 0x0009589E, 0x0029D29E, 0x00000003, + 0x0029D09E, 0x0009589E, 0x0029D69E, 0x00000002, 0x0029D086, 0x0029CC86, + 0x00000002, 0x0029D086, 0x0029CC86, 0x00000002, 0x4029D220, 0xA0013F02, + 0x00000002, 0x4029D220, 0xA0014002, 0x00000002, 0x4029D220, 0xA0014102, + 0x00000002, 0x4029D220, 0xA0014202, 0x00000002, 0x4029D220, 0xA0014302, + 0x00000002, 0x4029D220, 0xA0014402, 0x00000002, 0x4029D220, 0xA0014502, + 0x00000002, 0x4029D220, 0xA0014602, 0x00000002, 0x4029D220, 0xA0014702, + 0x00000002, 0x4029D220, 0xA0014802, 0x00000002, 0x4029D220, 0xA0014902, + 0x00000002, 0x4029D220, 0xA0014A02, 0x00000002, + // Block 16, offset 0x400 + 0x4029D220, 0xA0014B02, 0x00000002, 0x4029D220, 0xA0014B02, 0x00000002, + 0x4029D220, 0xA0014B02, 0x00000002, 0x4029D220, 0xA0014C02, 0x00000002, + 0x4029D220, 0xA0014D02, 0x00000002, 0x4029D220, 0xA0014E02, 0x00000002, + 0x4029D220, 0xA0014F02, 0x00000002, 0x4029D220, 0xA0015002, 0x00000002, + 0x4029D220, 0xA0015102, 0x00000002, 0x4029D220, 0xA0015202, 0x00000002, + 0x4029D220, 0xA0015302, 0x00000002, 0x4029D220, 0xA0015402, 0x00000002, + 0x4029D220, 0xA0015502, 0x00000002, 0x4029D220, 0xA0015602, 0x00000002, + 0x0029D284, 0xA0015604, 0x00000002, 0x4029D220, 0xA0015702, 0x00000002, + 0x4029D220, 0xA0015802, 0x00000002, 0x4029D220, 0xA0015902, 0x00000002, + 0x4029D220, 0xA0015A02, 0x00000002, 0x4029D220, 0xA0015B02, 0x00000002, + 0x4029D220, 0xA0015C02, 0x00000002, 0x4029D220, + // Block 17, offset 0x440 + 0xA0015D02, 0x00000002, 0x4029D220, 0xA0015E02, 0x00000002, 0x4029D220, + 0xA0015F02, 0x00000002, 0x4029D220, 0xA0016002, 0x00000002, 0x4029D220, + 0xA0016102, 0x00000002, 0x4029D220, 0xA0016202, 0x00000002, 0x4029D220, + 0xA0016302, 0x00000002, 0x4029D220, 0xA0016402, 0x00000002, 0x4029D220, + 0xA0016502, 0x00000002, 0x4029D220, 0xA0016602, 0x00000002, 0x4029D220, + 0xA0016702, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, + 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, + 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, + 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, + 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, + 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, + // Block 18, offset 0x480 + 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, + 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016E02, + 0x00000002, 0x4029D220, 0xA0016F02, 0x00000002, 0x4029D220, 0xA0017002, + 0x00000002, 0x4029D220, 0xA0017102, 0x00000002, 0x4029D220, 0xA0017202, + 0x00000002, 0x4029D220, 0xA0017302, 0x00000002, 0x4029D220, 0xA0017402, + 0x00000002, 0x4029D220, 0xA0017502, 0x00000002, 0x4029D220, 0xA0017602, + 0x00000002, 0x4029D220, 0xA0017702, 0x00000003, 0x0029D29E, 0x0009589E, + 0x0029D49E, 0x00000003, 0x0029D29E, 0x0009589E, 0x0029D69E, 0x00000003, + 0x0029D29E, 0x0009589E, 0x0029DC9E, 0x00000002, 0x0029D286, 0x0029CC86, + 0x00000002, 0x4029D420, 0xA0013F02, 0x00000002, 0x4029D420, 0xA0014002, + 0x00000002, 0x4029D420, 0xA0014102, 0x00000002, + // Block 19, offset 0x4c0 + 0x4029D420, 0xA0014202, 0x00000002, 0x4029D420, 0xA0014302, 0x00000002, + 0x4029D420, 0xA0014402, 0x00000002, 0x4029D420, 0xA0014502, 0x00000002, + 0x4029D420, 0xA0014602, 0x00000002, 0x4029D420, 0xA0014702, 0x00000002, + 0x4029D420, 0xA0014802, 0x00000002, 0x4029D420, 0xA0014902, 0x00000002, + 0x4029D420, 0xA0014A02, 0x00000002, 0x4029D420, 0xA0014B02, 0x00000002, + 0x4029D420, 0xA0014C02, 0x00000002, 0x4029D420, 0xA0014D02, 0x00000002, + 0x4029D420, 0xA0014E02, 0x00000002, 0x4029D420, 0xA0014F02, 0x00000002, + 0x4029D420, 0xA0015002, 0x00000002, 0x4029D420, 0xA0015102, 0x00000002, + 0x4029D420, 0xA0015202, 0x00000002, 0x4029D420, 0xA0015302, 0x00000002, + 0x4029D420, 0xA0015402, 0x00000002, 0x4029D420, 0xA0015502, 0x00000002, + 0x4029D420, 0xA0015602, 0x00000002, 0x0029D484, + // Block 20, offset 0x500 + 0xA0015604, 0x00000002, 0x4029D420, 0xA0015702, 0x00000002, 0x4029D420, + 0xA0015802, 0x00000002, 0x4029D420, 0xA0015902, 0x00000002, 0x4029D420, + 0xA0015A02, 0x00000002, 0x4029D420, 0xA0015B02, 0x00000002, 0x4029D420, + 0xA0015C02, 0x00000002, 0x4029D420, 0xA0015D02, 0x00000002, 0x4029D420, + 0xA0015E02, 0x00000002, 0x4029D420, 0xA0015F02, 0x00000002, 0x4029D420, + 0xA0016002, 0x00000002, 0x4029D420, 0xA0016102, 0x00000002, 0x4029D420, + 0xA0016202, 0x00000002, 0x4029D420, 0xA0016302, 0x00000002, 0x4029D420, + 0xA0016402, 0x00000002, 0x4029D420, 0xA0016502, 0x00000002, 0x4029D420, + 0xA0016602, 0x00000002, 0x4029D420, 0xA0016702, 0x00000002, 0x4029D420, + 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, + 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, + // Block 21, offset 0x540 + 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, + 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, + 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, + 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, + 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, + 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0017002, + 0x00000002, 0x4029D420, 0xA0017102, 0x00000002, 0x4029D420, 0xA0017202, + 0x00000002, 0x4029D420, 0xA0017302, 0x00000002, 0x4029D420, 0xA0017402, + 0x00000002, 0x4029D420, 0xA0017502, 0x00000002, 0x4029D420, 0xA0017602, + 0x00000002, 0x4029D420, 0xA0017702, 0x00000003, 0x0029D49E, 0x0009589E, + 0x0029D69E, 0x00000002, 0x0029D486, 0x0029CC86, + // Block 22, offset 0x580 + 0x00000002, 0x4029D620, 0xA0013F02, 0x00000002, 0x4029D620, 0xA0014002, + 0x00000002, 0x4029D620, 0xA0014102, 0x00000002, 0x4029D620, 0xA0014202, + 0x00000002, 0x4029D620, 0xA0014302, 0x00000002, 0x4029D620, 0xA0014402, + 0x00000002, 0x4029D620, 0xA0014502, 0x00000002, 0x4029D620, 0xA0014602, + 0x00000002, 0x4029D620, 0xA0014702, 0x00000002, 0x4029D620, 0xA0014802, + 0x00000002, 0x4029D620, 0xA0014902, 0x00000002, 0x4029D620, 0xA0014A02, + 0x00000002, 0x4029D620, 0xA0014B02, 0x00000002, 0x4029D620, 0xA0014C02, + 0x00000002, 0x4029D620, 0xA0014D02, 0x00000002, 0x4029D620, 0xA0014E02, + 0x00000002, 0x4029D620, 0xA0014F02, 0x00000002, 0x4029D620, 0xA0015002, + 0x00000002, 0x4029D620, 0xA0015102, 0x00000002, 0x4029D620, 0xA0015202, + 0x00000002, 0x4029D620, 0xA0015302, 0x00000002, + // Block 23, offset 0x5c0 + 0x4029D620, 0xA0015402, 0x00000002, 0x4029D620, 0xA0015502, 0x00000002, + 0x4029D620, 0xA0015602, 0x00000002, 0x0029D684, 0xA0015604, 0x00000002, + 0x4029D620, 0xA0015702, 0x00000002, 0x4029D620, 0xA0015802, 0x00000002, + 0x4029D620, 0xA0015902, 0x00000002, 0x4029D620, 0xA0015A02, 0x00000002, + 0x4029D620, 0xA0015B02, 0x00000002, 0x4029D620, 0xA0015C02, 0x00000002, + 0x4029D620, 0xA0015D02, 0x00000002, 0x4029D620, 0xA0015E02, 0x00000002, + 0x4029D620, 0xA0015F02, 0x00000002, 0x4029D620, 0xA0016002, 0x00000002, + 0x4029D620, 0xA0016102, 0x00000002, 0x4029D620, 0xA0016202, 0x00000002, + 0x4029D620, 0xA0016302, 0x00000002, 0x4029D620, 0xA0016402, 0x00000002, + 0x4029D620, 0xA0016502, 0x00000002, 0x4029D620, 0xA0016602, 0x00000002, + 0x4029D620, 0xA0016702, 0x00000002, 0x4029D620, + // Block 24, offset 0x600 + 0xA0016802, 0x00000002, 0x4029D620, 0xA0016802, 0x00000002, 0x4029D620, + 0xA0016802, 0x00000002, 0x4029D620, 0xA0016802, 0x00000002, 0x4029D620, + 0xA0016802, 0x00000002, 0x4029D620, 0xA0016A02, 0x00000002, 0x4029D620, + 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, + 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, + 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, + 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, + 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, + 0xA0016C02, 0x00000002, 0x4029D620, 0xA0017202, 0x00000002, 0x4029D620, + 0xA0017302, 0x00000002, 0x4029D620, 0xA0017402, 0x00000002, 0x4029D620, + 0xA0017502, 0x00000002, 0x4029D620, 0xA0017702, + // Block 25, offset 0x640 + 0x00000003, 0x0029D69E, 0x0009589E, 0x0029D89E, 0x00000003, 0x0029D69E, + 0x0009589E, 0x0029DC9E, 0x00000002, 0x0029D686, 0x0029CC86, 0x00000002, + 0x4029D820, 0xA0013F02, 0x00000002, 0x4029D820, 0xA0014002, 0x00000002, + 0x4029D820, 0xA0014102, 0x00000002, 0x4029D820, 0xA0014202, 0x00000002, + 0x4029D820, 0xA0014302, 0x00000002, 0x4029D820, 0xA0014402, 0x00000002, + 0x4029D820, 0xA0014502, 0x00000002, 0x4029D820, 0xA0014602, 0x00000002, + 0x4029D820, 0xA0014702, 0x00000002, 0x4029D820, 0xA0014802, 0x00000002, + 0x4029D820, 0xA0014902, 0x00000002, 0x4029D820, 0xA0014A02, 0x00000002, + 0x4029D820, 0xA0014B02, 0x00000002, 0x4029D820, 0xA0014C02, 0x00000002, + 0x4029D820, 0xA0014D02, 0x00000002, 0x4029D820, 0xA0014E02, 0x00000002, + 0x4029D820, 0xA0014F02, 0x00000002, 0x4029D820, + // Block 26, offset 0x680 + 0xA0015002, 0x00000002, 0x4029D820, 0xA0015102, 0x00000002, 0x4029D820, + 0xA0015202, 0x00000002, 0x4029D820, 0xA0015302, 0x00000002, 0x4029D820, + 0xA0015402, 0x00000002, 0x4029D820, 0xA0015502, 0x00000002, 0x4029D820, + 0xA0015602, 0x00000002, 0x0029D884, 0xA0015604, 0x00000002, 0x4029D820, + 0xA0015702, 0x00000002, 0x4029D820, 0xA0015802, 0x00000002, 0x4029D820, + 0xA0015902, 0x00000002, 0x4029D820, 0xA0015A02, 0x00000002, 0x4029D820, + 0xA0015B02, 0x00000002, 0x4029D820, 0xA0015C02, 0x00000002, 0x4029D820, + 0xA0015D02, 0x00000002, 0x4029D820, 0xA0015E02, 0x00000002, 0x4029D820, + 0xA0015F02, 0x00000002, 0x4029D820, 0xA0016002, 0x00000002, 0x4029D820, + 0xA0016102, 0x00000002, 0x4029D820, 0xA0016202, 0x00000002, 0x4029D820, + 0xA0016302, 0x00000002, 0x4029D820, 0xA0016402, + // Block 27, offset 0x6c0 + 0x00000002, 0x4029D820, 0xA0016502, 0x00000002, 0x4029D820, 0xA0016602, + 0x00000002, 0x4029D820, 0xA0016702, 0x00000002, 0x4029D820, 0xA0016902, + 0x00000002, 0x4029D820, 0xA0016C02, 0x00000002, 0x4029D820, 0xA0016C02, + 0x00000002, 0x4029D820, 0xA0016C02, 0x00000002, 0x4029D820, 0xA0016C02, + 0x00000002, 0x4029D820, 0xA0016C02, 0x00000002, 0x4029D820, 0xA0016C02, + 0x00000002, 0x4029D820, 0xA0016C02, 0x00000002, 0x4029D820, 0xA0017202, + 0x00000002, 0x4029D820, 0xA0017302, 0x00000002, 0x4029D820, 0xA0017402, + 0x00000002, 0x4029D820, 0xA0017502, 0x00000002, 0x4029D820, 0xA0017702, + 0x00000002, 0x0029D886, 0x0029CC86, 0x00000002, 0x4029DA20, 0xA0013F02, + 0x00000002, 0x4029DA20, 0xA0014002, 0x00000002, 0x4029DA20, 0xA0014102, + 0x00000002, 0x4029DA20, 0xA0014202, 0x00000002, + // Block 28, offset 0x700 + 0x4029DA20, 0xA0014302, 0x00000002, 0x4029DA20, 0xA0014402, 0x00000002, + 0x4029DA20, 0xA0014502, 0x00000002, 0x4029DA20, 0xA0014602, 0x00000002, + 0x4029DA20, 0xA0014702, 0x00000002, 0x4029DA20, 0xA0014802, 0x00000002, + 0x4029DA20, 0xA0014902, 0x00000002, 0x4029DA20, 0xA0014A02, 0x00000002, + 0x4029DA20, 0xA0014B02, 0x00000002, 0x4029DA20, 0xA0014C02, 0x00000002, + 0x4029DA20, 0xA0014D02, 0x00000002, 0x4029DA20, 0xA0014E02, 0x00000002, + 0x4029DA20, 0xA0014F02, 0x00000002, 0x4029DA20, 0xA0015002, 0x00000002, + 0x4029DA20, 0xA0015102, 0x00000002, 0x4029DA20, 0xA0015202, 0x00000002, + 0x4029DA20, 0xA0015302, 0x00000002, 0x4029DA20, 0xA0015402, 0x00000002, + 0x4029DA20, 0xA0015502, 0x00000002, 0x4029DA20, 0xA0015602, 0x00000002, + 0x0029DA84, 0xA0015604, 0x00000002, 0x4029DA20, + // Block 29, offset 0x740 + 0xA0015702, 0x00000002, 0x4029DA20, 0xA0015802, 0x00000002, 0x4029DA20, + 0xA0015902, 0x00000002, 0x4029DA20, 0xA0015A02, 0x00000002, 0x4029DA20, + 0xA0015B02, 0x00000002, 0x4029DA20, 0xA0015C02, 0x00000002, 0x4029DA20, + 0xA0015D02, 0x00000002, 0x4029DA20, 0xA0015E02, 0x00000002, 0x4029DA20, + 0xA0015F02, 0x00000002, 0x4029DA20, 0xA0016002, 0x00000002, 0x4029DA20, + 0xA0016102, 0x00000002, 0x4029DA20, 0xA0016202, 0x00000002, 0x4029DA20, + 0xA0016302, 0x00000002, 0x4029DA20, 0xA0016402, 0x00000002, 0x4029DA20, + 0xA0016502, 0x00000002, 0x4029DA20, 0xA0016602, 0x00000002, 0x4029DA20, + 0xA0016702, 0x00000002, 0x4029DA20, 0xA0016C02, 0x00000002, 0x4029DA20, + 0xA0016C02, 0x00000002, 0x4029DA20, 0xA0016C02, 0x00000002, 0x4029DA20, + 0xA0016C02, 0x00000002, 0x4029DA20, 0xA0016C02, + // Block 30, offset 0x780 + 0x00000002, 0x4029DA20, 0xA0016C02, 0x00000002, 0x4029DA20, 0xA0016C02, + 0x00000002, 0x4029DA20, 0xA0016C02, 0x00000002, 0x4029DA20, 0xA0017202, + 0x00000002, 0x4029DA20, 0xA0017302, 0x00000002, 0x4029DA20, 0xA0017402, + 0x00000002, 0x4029DA20, 0xA0017502, 0x00000002, 0x4029DA20, 0xA0017702, + 0x00000003, 0x0029DA9E, 0x0009589E, 0x0029DC9E, 0x00000002, 0x0029DA86, + 0x0029CC86, 0x00000002, 0x4029DC20, 0xA0013F02, 0x00000002, 0x4029DC20, + 0xA0014002, 0x00000002, 0x4029DC20, 0xA0014102, 0x00000002, 0x4029DC20, + 0xA0014202, 0x00000002, 0x4029DC20, 0xA0014302, 0x00000002, 0x4029DC20, + 0xA0014402, 0x00000002, 0x4029DC20, 0xA0014502, 0x00000002, 0x4029DC20, + 0xA0014602, 0x00000002, 0x4029DC20, 0xA0014702, 0x00000002, 0x4029DC20, + 0xA0014802, 0x00000002, 0x4029DC20, 0xA0014902, + // Block 31, offset 0x7c0 + 0x00000002, 0x4029DC20, 0xA0014A02, 0x00000002, 0x4029DC20, 0xA0014B02, + 0x00000002, 0x4029DC20, 0xA0014C02, 0x00000002, 0x4029DC20, 0xA0014D02, + 0x00000002, 0x4029DC20, 0xA0014E02, 0x00000002, 0x4029DC20, 0xA0014F02, + 0x00000002, 0x4029DC20, 0xA0015002, 0x00000002, 0x4029DC20, 0xA0015102, + 0x00000002, 0x4029DC20, 0xA0015202, 0x00000002, 0x4029DC20, 0xA0015302, + 0x00000002, 0x4029DC20, 0xA0015402, 0x00000002, 0x4029DC20, 0xA0015502, + 0x00000002, 0x4029DC20, 0xA0015602, 0x00000002, 0x0029DC84, 0xA0015604, + 0x00000002, 0x4029DC20, 0xA0015702, 0x00000002, 0x4029DC20, 0xA0015802, + 0x00000002, 0x4029DC20, 0xA0015902, 0x00000002, 0x4029DC20, 0xA0015A02, + 0x00000002, 0x4029DC20, 0xA0015B02, 0x00000002, 0x4029DC20, 0xA0015C02, + 0x00000002, 0x4029DC20, 0xA0015D02, 0x00000002, + // Block 32, offset 0x800 + 0x4029DC20, 0xA0015E02, 0x00000002, 0x4029DC20, 0xA0015F02, 0x00000002, + 0x4029DC20, 0xA0016002, 0x00000002, 0x4029DC20, 0xA0016102, 0x00000002, + 0x4029DC20, 0xA0016202, 0x00000002, 0x4029DC20, 0xA0016302, 0x00000002, + 0x4029DC20, 0xA0016402, 0x00000002, 0x4029DC20, 0xA0016502, 0x00000002, + 0x4029DC20, 0xA0016602, 0x00000002, 0x4029DC20, 0xA0016702, 0x00000002, + 0x4029DC20, 0xA0016C02, 0x00000002, 0x4029DC20, 0xA0016C02, 0x00000002, + 0x4029DC20, 0xA0016C02, 0x00000002, 0x4029DC20, 0xA0016C02, 0x00000002, + 0x4029DC20, 0xA0016C02, 0x00000002, 0x4029DC20, 0xA0016C02, 0x00000002, + 0x4029DC20, 0xA0016C02, 0x00000002, 0x4029DC20, 0xA0017202, 0x00000002, + 0x4029DC20, 0xA0017302, 0x00000002, 0x4029DC20, 0xA0017402, 0x00000002, + 0x4029DC20, 0xA0017502, 0x00000002, 0x4029DC20, + // Block 33, offset 0x840 + 0xA0017702, 0x00000002, 0x0029DC86, 0x0029CC86, 0x00000002, 0x4029DE20, + 0xA0013F02, 0x00000002, 0x4029DE20, 0xA0014002, 0x00000002, 0x4029DE20, + 0xA0014102, 0x00000002, 0x4029DE20, 0xA0014202, 0x00000002, 0x4029DE20, + 0xA0014302, 0x00000002, 0x4029DE20, 0xA0014402, 0x00000002, 0x4029DE20, + 0xA0014502, 0x00000002, 0x4029DE20, 0xA0014602, 0x00000002, 0x4029DE20, + 0xA0014702, 0x00000002, 0x4029DE20, 0xA0014802, 0x00000002, 0x4029DE20, + 0xA0014902, 0x00000002, 0x4029DE20, 0xA0014A02, 0x00000002, 0x4029DE20, + 0xA0014B02, 0x00000002, 0x4029DE20, 0xA0014C02, 0x00000002, 0x4029DE20, + 0xA0014D02, 0x00000002, 0x4029DE20, 0xA0014E02, 0x00000002, 0x4029DE20, + 0xA0014F02, 0x00000002, 0x4029DE20, 0xA0015002, 0x00000002, 0x4029DE20, + 0xA0015102, 0x00000002, 0x4029DE20, 0xA0015202, + // Block 34, offset 0x880 + 0x00000002, 0x4029DE20, 0xA0015302, 0x00000002, 0x4029DE20, 0xA0015402, + 0x00000002, 0x4029DE20, 0xA0015502, 0x00000002, 0x4029DE20, 0xA0015602, + 0x00000002, 0x0029DE84, 0xA0015604, 0x00000002, 0x4029DE20, 0xA0015702, + 0x00000002, 0x4029DE20, 0xA0015802, 0x00000002, 0x4029DE20, 0xA0015902, + 0x00000002, 0x4029DE20, 0xA0015A02, 0x00000002, 0x4029DE20, 0xA0015B02, + 0x00000002, 0x4029DE20, 0xA0015C02, 0x00000002, 0x4029DE20, 0xA0015D02, + 0x00000002, 0x4029DE20, 0xA0015E02, 0x00000002, 0x4029DE20, 0xA0015F02, + 0x00000002, 0x4029DE20, 0xA0016002, 0x00000002, 0x4029DE20, 0xA0016102, + 0x00000002, 0x4029DE20, 0xA0016202, 0x00000002, 0x4029DE20, 0xA0016302, + 0x00000002, 0x4029DE20, 0xA0016402, 0x00000002, 0x4029DE20, 0xA0016502, + 0x00000002, 0x4029DE20, 0xA0016602, 0x00000002, + // Block 35, offset 0x8c0 + 0x4029DE20, 0xA0016702, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, + 0x4029DE20, 0xA0016C02, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, + 0x4029DE20, 0xA0016C02, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, + 0x4029DE20, 0xA0016C02, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, + 0x4029DE20, 0xA0016C02, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, + 0x4029DE20, 0xA0017202, 0x00000002, 0x4029DE20, 0xA0017302, 0x00000002, + 0x4029DE20, 0xA0017402, 0x00000002, 0x4029DE20, 0xA0017502, 0x00000002, + 0x4029DE20, 0xA0017702, 0x00000002, 0x402BDE20, 0xAE603202, 0x00000002, + 0x002BDE88, 0xAE603202, 0x00000002, 0x402BDE20, 0xAE603502, 0x00000002, + 0x002BDE88, 0xAE603502, 0x00000002, 0x402BDE20, 0xAE603702, 0x00000002, + 0x002BDE88, 0xAE603702, 0x00000003, 0x402BDE20, + // Block 36, offset 0x900 + 0xAE603702, 0xAE603202, 0x00000003, 0x002BDE88, 0xAE603702, 0xAE603202, + 0x00000003, 0x402BDE20, 0xAE603702, 0xAE603502, 0x00000003, 0x002BDE88, + 0xAE603702, 0xAE603502, 0x00000003, 0x402BDE20, 0xAE603702, 0xAE604E02, + 0x00000003, 0x002BDE88, 0xAE603702, 0xAE604E02, 0x00000003, 0x402BDE20, + 0xAE603702, 0xAE606402, 0x00000003, 0x002BDE88, 0xAE603702, 0xAE606402, + 0x00000002, 0x402BDE20, 0xAE603C02, 0x00000002, 0x002BDE88, 0xAE603C02, + 0x00000003, 0x402BDE20, 0xAE603C02, 0xAE603202, 0x00000003, 0x002BDE88, + 0xAE603C02, 0xAE603202, 0x00000003, 0x402BDE20, 0xAE603C02, 0xAE603502, + 0x00000003, 0x002BDE88, 0xAE603C02, 0xAE603502, 0x00000003, 0x402BDE20, + 0xAE603C02, 0xAE604E02, 0x00000003, 0x002BDE88, 0xAE603C02, 0xAE604E02, + 0x00000003, 0x402BDE20, 0xAE603C02, 0xAE606402, + // Block 37, offset 0x940 + 0x00000003, 0x002BDE88, 0xAE603C02, 0xAE606402, 0x00000002, 0x402BDE20, + 0xAE604102, 0x00000002, 0x002BDE88, 0xAE604102, 0x00000002, 0x402BDE20, + 0xAE604302, 0x00000002, 0x002BDE88, 0xAE604302, 0x00000003, 0x402BDE20, + 0xAE604302, 0xAE603202, 0x00000003, 0x002BDE88, 0xAE604302, 0xAE603202, + 0x00000002, 0x402BDE20, 0xAE604702, 0x00000002, 0x002BDE88, 0xAE604702, + 0x00000003, 0x402BDE20, 0xAE604702, 0xAE605B02, 0x00000003, 0x002BDE88, + 0xAE604702, 0xAE605B02, 0x00000002, 0x402BDE20, 0xAE604E02, 0x00000002, + 0x002BDE88, 0xAE604E02, 0x00000002, 0x402BDE20, 0xAE605202, 0x00000002, + 0x002BDE88, 0xAE605202, 0x00000003, 0x402BDE20, 0xAE605202, 0xAE605B02, + 0x00000003, 0x002BDE88, 0xAE605202, 0xAE605B02, 0x00000002, 0x402BDE20, + 0xACA05902, 0x00000002, 0x002BDE88, 0xACA05902, + // Block 38, offset 0x980 + 0x00000002, 0x402BDE20, 0xAE605B02, 0x00000002, 0x002BDE88, 0xAE605B02, + 0x00000002, 0x402BDE20, 0xAE606402, 0x00000002, 0x002BDE88, 0xAE606402, + 0x00000002, 0x402BDE20, 0xAE606502, 0x00000002, 0x002BDE88, 0xAE606502, + 0x00000002, 0x402BDE20, 0xAE606702, 0x00000002, 0x002BDE88, 0xAE606702, + 0x00000002, 0x402BDE20, 0xADC07002, 0x00000002, 0x002BDE88, 0xADC07002, + 0x00000003, 0x402BDE20, 0xADC07002, 0xAE603702, 0x00000003, 0x002BDE88, + 0xADC07002, 0xAE603702, 0x00000003, 0x402BDE20, 0xADC07002, 0xAE603C02, + 0x00000003, 0x002BDE88, 0xADC07002, 0xAE603C02, 0x00000002, 0x402BDE20, + 0xADC07602, 0x00000002, 0x002BDE88, 0xADC07602, 0x00000002, 0x84E615EF, + 0xAE613904, 0x00000004, 0x002BDE9C, 0x0002E49C, 0x002E829C, 0x0002E49C, + 0x00000003, 0x002BDE84, 0x0004E284, 0x002C3A84, + // Block 39, offset 0x9c0 + 0x00000003, 0x002BDE84, 0x0004E284, 0x002FE684, 0x00000003, 0x002BDE8A, + 0x0004E284, 0x002FE68A, 0x00000003, 0x002BDE9D, 0x0009569C, 0x002E829C, + 0x00000002, 0x002BDE84, 0x002BDE84, 0x00000002, 0x002BDE8A, 0x002BDE8A, + 0x00000002, 0x002BDE9D, 0x002C0A9D, 0x00000003, 0x002BDE84, 0xA0013904, + 0x002C9884, 0x00000003, 0x84E615EF, 0xAE613904, 0x84E6164C, 0x00000003, + 0x002BDE8A, 0xA0013904, 0x002C988A, 0x00000003, 0x002BDE94, 0xA0013914, + 0x002C9894, 0x00000004, 0x002BDE84, 0xA0013904, 0x002C9884, 0xAE603202, + 0x00000004, 0x002BDE8A, 0xA0013904, 0x002C988A, 0xAE603202, 0x00000004, + 0x002BDE84, 0xA0013904, 0x002C9884, 0xAE605B02, 0x00000004, 0x002BDE8A, + 0xA0013904, 0x002C988A, 0xAE605B02, 0x00000002, 0x84E615EF, 0x84E61771, + 0x00000002, 0x002BDE84, 0x002EE284, 0x00000002, + // Block 40, offset 0xa00 + 0x002BDE8A, 0x002EE28A, 0x00000002, 0x002BDE84, 0x00306C84, 0x00000002, + 0x002BDE8A, 0x00306C8A, 0x00000002, 0x84E615EF, 0x84E6185F, 0x00000002, + 0x002BDE84, 0x0030BE84, 0x00000002, 0x002BDE8A, 0x0030BE8A, 0x00000003, + 0x002BDE84, 0xA0013904, 0x0030BE84, 0x00000003, 0x002BDE8A, 0xA0013904, + 0x0030BE8A, 0x00000002, 0x002BDE84, 0x00310084, 0x00000002, 0x002BDE8A, + 0x0031008A, 0x00000002, 0x402C0A20, 0xAE605202, 0x00000002, 0x002C0A88, + 0xAE605202, 0x00000002, 0x402C0A20, 0xADC07002, 0x00000002, 0x002C0A88, + 0xADC07002, 0x00000002, 0x402C0A20, 0xADC07B02, 0x00000002, 0x002C0A88, + 0xADC07B02, 0x00000003, 0x002C0A9C, 0x002BDE9C, 0x002F7A9C, 0x00000002, + 0x402C3A20, 0xAE603202, 0x00000002, 0x002C3A88, 0xAE603202, 0x00000002, + 0x402C3A20, 0xAE603C02, 0x00000002, 0x002C3A88, + // Block 41, offset 0xa40 + 0xAE603C02, 0x00000002, 0x402C3A20, 0xAE604102, 0x00000002, 0x002C3A88, + 0xAE604102, 0x00000002, 0x402C3A20, 0xAE605202, 0x00000002, 0x002C3A88, + 0xAE605202, 0x00000002, 0x402C3A20, 0xACA05602, 0x00000002, 0x84E6161D, + 0xAE605604, 0x00000002, 0x002C3A88, 0xACA05602, 0x00000003, 0x402C3A20, + 0xACA05602, 0xAE603202, 0x00000003, 0x002C3A88, 0xACA05602, 0xAE603202, + 0x00000003, 0x002C3A84, 0x0004E284, 0x002EE284, 0x00000003, 0x002C3A84, + 0x0004E284, 0x00306C84, 0x00000004, 0x002C3A9D, 0x0009569C, 0x002DFE9C, + 0x002D229C, 0x00000003, 0x002C3A9C, 0x002BDE9C, 0x002E229C, 0x00000002, + 0x002C3A9D, 0x002E229D, 0x00000003, 0x002C3A9C, 0x002E829C, 0x0029D09C, + 0x00000003, 0x002C3A9C, 0x002E829C, 0x0029D29C, 0x00000003, 0x002C3A9D, + 0x002EE29C, 0x0002E49C, 0x00000004, 0x002C3A9D, + // Block 42, offset 0xa80 + 0x002EE29D, 0x002EE29D, 0x002E229D, 0x00000002, 0x402C6220, 0xAE604102, + 0x00000002, 0x002C6288, 0xAE604102, 0x00000002, 0x402C6220, 0xAE605202, + 0x00000002, 0x002C6288, 0xAE605202, 0x00000002, 0x402C6220, 0xACA05602, + 0x00000002, 0x002C6288, 0xACA05602, 0x00000002, 0x402C6220, 0xADC07002, + 0x00000002, 0x002C6288, 0xADC07002, 0x00000002, 0x402C6220, 0xADC07802, + 0x00000002, 0x002C6288, 0xADC07802, 0x00000002, 0x402C6220, 0xADC07B02, + 0x00000002, 0x002C6288, 0xADC07B02, 0x00000002, 0x402C6220, 0xA0007D02, + 0x00000002, 0x002C6288, 0xA0007D02, 0x00000002, 0x002C6284, 0xA0013904, + 0x00000002, 0x84E61631, 0xAE613904, 0x00000002, 0x002C628A, 0xA0013904, + 0x00000002, 0x84E61631, 0xAE613A04, 0x00000002, 0x002C6284, 0xA0013A04, + 0x00000002, 0x002C628A, 0xA0013A04, 0x00000002, + // Block 43, offset 0xac0 + 0x002C6284, 0x002C0A84, 0x00000003, 0x002C629C, 0x002E829C, 0x0029D09C, + 0x00000003, 0x002C629C, 0x002E829C, 0x0029D29C, 0x00000002, 0x002C6284, + 0x00312A84, 0x00000003, 0x002C6284, 0x00312A84, 0xA0004104, 0x00000003, + 0x002C628A, 0x00312A84, 0xA0004104, 0x00000003, 0x002C628A, 0x00312A8A, + 0xA0004104, 0x00000002, 0x002C6284, 0x00315084, 0x00000002, 0x002C6284, + 0x00316484, 0x00000002, 0x402C9820, 0xAE603202, 0x00000002, 0x002C9888, + 0xAE603202, 0x00000002, 0x402C9820, 0xAE603502, 0x00000002, 0x002C9888, + 0xAE603502, 0x00000002, 0x402C9820, 0xAE603702, 0x00000002, 0x002C9888, + 0xAE603702, 0x00000002, 0x402C9820, 0xAE603C02, 0x00000002, 0x002C9888, + 0xAE603C02, 0x00000003, 0x402C9820, 0xAE603C02, 0xAE603202, 0x00000003, + 0x002C9888, 0xAE603C02, 0xAE603202, 0x00000003, + // Block 44, offset 0xb00 + 0x402C9820, 0xAE603C02, 0xAE603502, 0x00000003, 0x002C9888, 0xAE603C02, + 0xAE603502, 0x00000003, 0x402C9820, 0xAE603C02, 0xAE604E02, 0x00000003, + 0x002C9888, 0xAE603C02, 0xAE604E02, 0x00000003, 0x402C9820, 0xAE603C02, + 0xAE606402, 0x00000003, 0x002C9888, 0xAE603C02, 0xAE606402, 0x00000002, + 0x402C9820, 0xAE604102, 0x00000002, 0x002C9888, 0xAE604102, 0x00000002, + 0x402C9820, 0xAE604702, 0x00000002, 0x002C9888, 0xAE604702, 0x00000002, + 0x402C9820, 0xAE604E02, 0x00000002, 0x002C9888, 0xAE604E02, 0x00000002, + 0x402C9820, 0xAE605202, 0x00000002, 0x002C9888, 0xAE605202, 0x00000002, + 0x402C9820, 0xACA05602, 0x00000002, 0x002C9888, 0xACA05602, 0x00000003, + 0x402C9820, 0xACA05602, 0xAE603702, 0x00000003, 0x002C9888, 0xACA05602, + 0xAE603702, 0x00000002, 0x402C9820, 0xACA05902, + // Block 45, offset 0xb40 + 0x00000002, 0x002C9888, 0xACA05902, 0x00000002, 0x402C9820, 0xAE605B02, + 0x00000002, 0x002C9888, 0xAE605B02, 0x00000003, 0x402C9820, 0xAE605B02, + 0xAE603202, 0x00000003, 0x002C9888, 0xAE605B02, 0xAE603202, 0x00000003, + 0x402C9820, 0xAE605B02, 0xAE603502, 0x00000003, 0x002C9888, 0xAE605B02, + 0xAE603502, 0x00000002, 0x402C9820, 0xAE606402, 0x00000002, 0x002C9888, + 0xAE606402, 0x00000002, 0x402C9820, 0xAE606502, 0x00000002, 0x002C9888, + 0xAE606502, 0x00000002, 0x402C9820, 0xAE606702, 0x00000002, 0x002C9888, + 0xAE606702, 0x00000002, 0x402C9820, 0xADC07002, 0x00000002, 0x002C9888, + 0xADC07002, 0x00000003, 0x402C9820, 0xADC07002, 0xAE603C02, 0x00000003, + 0x002C9888, 0xADC07002, 0xAE603C02, 0x00000002, 0x402C9820, 0xADC07802, + 0x00000002, 0x002C9888, 0xADC07802, 0x00000002, + // Block 46, offset 0xb80 + 0x402C9820, 0xADC07A02, 0x00000002, 0x002C9888, 0xADC07A02, 0x00000003, + 0x002C989C, 0x002F7A9C, 0x002D229C, 0x00000002, 0x402D0820, 0xAE605202, + 0x00000002, 0x002D0888, 0xAE605202, 0x00000002, 0x002D0884, 0xA0013A04, + 0x00000002, 0x002D088A, 0xA0013A04, 0x00000003, 0x002D088A, 0x002BDE8A, + 0x0030F68A, 0x00000003, 0x002D0884, 0x002D0884, 0x002D9A84, 0x00000003, + 0x002D0884, 0x002D0884, 0x002E2284, 0x00000002, 0x002D0884, 0x002EDA84, + 0x00000004, 0x002D089D, 0x002F7A9D, 0x002C989D, 0x002C989D, 0x00000002, + 0x402D2220, 0xAE603202, 0x00000002, 0x002D2288, 0xAE603202, 0x00000002, + 0x402D2220, 0xAE603702, 0x00000002, 0x002D2288, 0xAE603702, 0x00000002, + 0x402D2220, 0xAE603C02, 0x00000002, 0x002D2288, 0xAE603C02, 0x00000002, + 0x402D2220, 0xAE604102, 0x00000002, 0x002D2288, + // Block 47, offset 0xbc0 + 0xAE604102, 0x00000002, 0x402D2220, 0xAE605202, 0x00000002, 0x002D2288, + 0xAE605202, 0x00000002, 0x402D2220, 0xACA05602, 0x00000002, 0x002D2288, + 0xACA05602, 0x00000002, 0x402D2220, 0xAE605B02, 0x00000002, 0x002D2288, + 0xAE605B02, 0x00000002, 0x002D2284, 0xA0006104, 0x00000002, 0x002D228A, + 0xA0006104, 0x00000002, 0x002D2284, 0xA0013A04, 0x00000002, 0x002D228A, + 0xA0013A04, 0x00000003, 0x002D229C, 0x002BDE9C, 0x002E229C, 0x00000003, + 0x002D229D, 0x002D689D, 0x00312A9C, 0x00000003, 0x002D229D, 0x002F2C9D, + 0x002BDE9C, 0x00000002, 0x402D6820, 0xAE603C02, 0x00000002, 0x002D6888, + 0xAE603C02, 0x00000002, 0x402D6820, 0xAE604102, 0x00000002, 0x002D6888, + 0xAE604102, 0x00000002, 0x402D6820, 0xAE604702, 0x00000002, 0x002D6888, + 0xAE604702, 0x00000002, 0x402D6820, 0xAE605202, + // Block 48, offset 0xc00 + 0x00000002, 0x002D6888, 0xAE605202, 0x00000002, 0x402D6820, 0xACA05602, + 0x00000002, 0x002D6888, 0xACA05602, 0x00000002, 0x402D6820, 0xADC07002, + 0x00000002, 0x002D6888, 0xADC07002, 0x00000002, 0x402D6820, 0xADC07902, + 0x00000002, 0x002D6888, 0xADC07902, 0x00000002, 0x402D6820, 0xADC07B02, + 0x00000002, 0x402D6820, 0xA0007D02, 0x00000002, 0x002D6888, 0xA0007D02, + 0x00000003, 0x002D689C, 0x002F2C9D, 0x002BDE9C, 0x00000002, 0x402D9A20, + 0xAE603202, 0x00000002, 0x002D9A88, 0xAE603202, 0x00000002, 0x402D9A20, + 0xAE603502, 0x00000002, 0x002D9A88, 0xAE603502, 0x00000002, 0x402D9A20, + 0xAE603702, 0x00000002, 0x002D9A88, 0xAE603702, 0x00000002, 0x402D9A20, + 0xAE603C02, 0x00000002, 0x002D9A88, 0xAE603C02, 0x00000002, 0x402D9A20, + 0xAE604102, 0x00000002, 0x002D9A88, 0xAE604102, + // Block 49, offset 0xc40 + 0x00000002, 0x402D9A20, 0xAE604702, 0x00000002, 0x002D9A88, 0xAE604702, + 0x00000003, 0x402D9A20, 0xAE604702, 0xAE603202, 0x00000003, 0x002D9A88, + 0xAE604702, 0xAE603202, 0x00000002, 0x402D9A20, 0xAE604E02, 0x00000002, + 0x002D9A88, 0xAE604E02, 0x00000002, 0x002D9A88, 0xAE605202, 0x00000002, + 0x402D9A20, 0xACA05902, 0x00000002, 0x002D9A88, 0xACA05902, 0x00000002, + 0x402D9A20, 0xAE605B02, 0x00000002, 0x002D9A88, 0xAE605B02, 0x00000002, + 0x402D9A20, 0xAE606402, 0x00000002, 0x002D9A88, 0xAE606402, 0x00000002, + 0x402D9A20, 0xAE606502, 0x00000002, 0x002D9A88, 0xAE606502, 0x00000002, + 0x402D9A20, 0xAE606702, 0x00000002, 0x002D9A88, 0xAE606702, 0x00000002, + 0x402D9A20, 0xADC07002, 0x00000002, 0x002D9A88, 0xADC07002, 0x00000002, + 0x402D9A20, 0xADC07A02, 0x00000002, 0x002D9A88, + // Block 50, offset 0xc80 + 0xADC07A02, 0x00000002, 0x002D9A9D, 0x002C3A9D, 0x00000002, 0x002D9A9D, + 0x002C629D, 0x00000002, 0x402DCC20, 0xAE603C02, 0x00000002, 0x002DCC88, + 0xAE603C02, 0x00000002, 0x402DCC20, 0xAE604102, 0x00000002, 0x402DFE20, + 0xAE603202, 0x00000002, 0x002DFE88, 0xAE603202, 0x00000002, 0x402DFE20, + 0xAE604102, 0x00000002, 0x002DFE88, 0xAE604102, 0x00000002, 0x402DFE20, + 0xACA05602, 0x00000002, 0x002DFE88, 0xACA05602, 0x00000002, 0x002DFE84, + 0xA0006104, 0x00000002, 0x002DFE8A, 0xA0006104, 0x00000002, 0x402DFE20, + 0xADC07002, 0x00000002, 0x002DFE88, 0xADC07002, 0x00000002, 0x402DFE20, + 0xADC07B02, 0x00000002, 0x002DFE88, 0xADC07B02, 0x00000004, 0x002DFE9C, + 0x002C3A9C, 0x002BDE9C, 0x002E229C, 0x00000003, 0x002DFE9C, 0x002D689D, + 0x00312A9C, 0x00000003, 0x002DFE9C, 0x002E829C, + // Block 51, offset 0xcc0 + 0x0029D09C, 0x00000003, 0x002DFE9C, 0x002E829C, 0x0029D29C, 0x00000003, + 0x002DFE9C, 0x002F2C9D, 0x002BDE9C, 0x00000002, 0x402E2220, 0xAE603202, + 0x00000002, 0x002E2288, 0xAE603202, 0x00000002, 0x402E2220, 0xAE604102, + 0x00000002, 0x002E2288, 0xAE604102, 0x00000002, 0x402E2220, 0xACA05602, + 0x00000002, 0x002E2288, 0xACA05602, 0x00000002, 0x402E2220, 0xADC07002, + 0x00000002, 0x002E2288, 0xADC07002, 0x00000003, 0x402E2220, 0xADC07002, + 0xAE605B02, 0x00000003, 0x002E2288, 0xADC07002, 0xAE605B02, 0x00000002, + 0x402E2220, 0xADC07802, 0x00000002, 0x002E2288, 0xADC07802, 0x00000002, + 0x402E2220, 0xADC07B02, 0x00000002, 0x002E2288, 0xADC07B02, 0x00000002, + 0x402E2220, 0xA0007D02, 0x00000002, 0x002E2288, 0xA0007D02, 0x00000002, + 0x402E2220, 0xA0013902, 0x00000002, 0x402E2220, + // Block 52, offset 0xd00 + 0xA0013902, 0x00000002, 0x002E2288, 0xA0013902, 0x00000002, 0x002E2288, + 0xA0013902, 0x00000002, 0x002E2284, 0x002E2284, 0x00000002, 0x002E228A, + 0x002E228A, 0x00000003, 0x002E229C, 0x002EE29C, 0x002D229C, 0x00000002, + 0x002E2284, 0x002FE684, 0x00000003, 0x002E229D, 0x00302C9D, 0x002C629D, + 0x00000002, 0x002E2284, 0x00312A84, 0x00000002, 0x402E8220, 0xAE603202, + 0x00000002, 0x002E8288, 0xAE603202, 0x00000002, 0x402E8220, 0xAE605202, + 0x00000002, 0x002E8288, 0xAE605202, 0x00000002, 0x402E8220, 0xADC07002, + 0x00000002, 0x002E8288, 0xADC07002, 0x00000003, 0x002E829C, 0x0009569C, + 0x002FE69C, 0x00000004, 0x002E829C, 0x0009569C, 0x002FE69C, 0x0029D09C, + 0x00000003, 0x002E829D, 0x002D689D, 0x00312A9C, 0x00000003, 0x002E829C, + 0x002D9A9C, 0x002E229C, 0x00000003, 0x002E829C, + // Block 53, offset 0xd40 + 0x002E829C, 0x0029D09C, 0x00000003, 0x002E829C, 0x002E829C, 0x0029D29C, + 0x00000003, 0x002E829C, 0x002EE29C, 0x002E229C, 0x00000003, 0x002E829D, + 0x002F2C9D, 0x002BDE9C, 0x00000002, 0x402E9E20, 0xAE603202, 0x00000002, + 0x002E9E88, 0xAE603202, 0x00000002, 0x402E9E20, 0xAE603502, 0x00000002, + 0x002E9E88, 0xAE603502, 0x00000002, 0x402E9E20, 0xAE604102, 0x00000002, + 0x002E9E88, 0xAE604102, 0x00000002, 0x402E9E20, 0xAE604E02, 0x00000002, + 0x002E9E88, 0xAE604E02, 0x00000002, 0x402E9E20, 0xAE605202, 0x00000002, + 0x002E9E88, 0xAE605202, 0x00000002, 0x402E9E20, 0xACA05602, 0x00000002, + 0x002E9E88, 0xACA05602, 0x00000002, 0x002E9E84, 0xA0006104, 0x00000002, + 0x002E9E8A, 0xA0006104, 0x00000002, 0x402E9E20, 0xADC07002, 0x00000002, + 0x002E9E88, 0xADC07002, 0x00000002, 0x402E9E20, + // Block 54, offset 0xd80 + 0xADC07802, 0x00000002, 0x002E9E88, 0xADC07802, 0x00000002, 0x402E9E20, + 0xADC07B02, 0x00000002, 0x002E9E88, 0xADC07B02, 0x00000003, 0x002E9E9D, + 0x002C989D, 0x0030E29D, 0x00000002, 0x002E9E9D, 0x002D229D, 0x00000002, + 0x402EE220, 0xAE603202, 0x00000002, 0x002EE288, 0xAE603202, 0x00000002, + 0x402EE220, 0xAE603502, 0x00000002, 0x002EE288, 0xAE603502, 0x00000002, + 0x402EE220, 0xAE603702, 0x00000002, 0x002EE288, 0xAE603702, 0x00000002, + 0x402EE220, 0xAE603C02, 0x00000002, 0x002EE288, 0xAE603C02, 0x00000003, + 0x402EE220, 0xAE603C02, 0xAE603202, 0x00000003, 0x002EE288, 0xAE603C02, + 0xAE603202, 0x00000003, 0x402EE220, 0xAE603C02, 0xAE603502, 0x00000003, + 0x002EE288, 0xAE603C02, 0xAE603502, 0x00000003, 0x402EE220, 0xAE603C02, + 0xAE604E02, 0x00000003, 0x002EE288, 0xAE603C02, + // Block 55, offset 0xdc0 + 0xAE604E02, 0x00000003, 0x402EE220, 0xAE603C02, 0xAE606402, 0x00000003, + 0x002EE288, 0xAE603C02, 0xAE606402, 0x00000002, 0x402EE220, 0xAE604102, + 0x00000002, 0x002EE288, 0xAE604102, 0x00000002, 0x402EE220, 0xAE604702, + 0x00000002, 0x002EE288, 0xAE604702, 0x00000003, 0x402EE220, 0xAE604702, + 0xAE605B02, 0x00000003, 0x002EE288, 0xAE604702, 0xAE605B02, 0x00000002, + 0x402EE220, 0xAE604D02, 0x00000002, 0x002EE288, 0xAE604D02, 0x00000002, + 0x402EE220, 0xAE604E02, 0x00000002, 0x002EE288, 0xAE604E02, 0x00000003, + 0x402EE220, 0xAE604E02, 0xAE603202, 0x00000003, 0x002EE288, 0xAE604E02, + 0xAE603202, 0x00000003, 0x402EE220, 0xAE604E02, 0xAE604702, 0x00000003, + 0x002EE288, 0xAE604E02, 0xAE604702, 0x00000003, 0x402EE220, 0xAE604E02, + 0xAE605B02, 0x00000003, 0x002EE288, 0xAE604E02, + // Block 56, offset 0xe00 + 0xAE605B02, 0x00000002, 0x402EE220, 0xAE605202, 0x00000002, 0x002EE288, + 0xAE605202, 0x00000003, 0x402EE220, 0xAE605202, 0xAE605B02, 0x00000003, + 0x002EE288, 0xAE605202, 0xAE605B02, 0x00000002, 0x402EE220, 0xA0005402, + 0x00000002, 0x002EE288, 0xA0005402, 0x00000003, 0x402EE220, 0xA0005402, + 0xAE603202, 0x00000003, 0x002EE288, 0xA0005402, 0xAE603202, 0x00000002, + 0x402EE220, 0xACA05902, 0x00000002, 0x002EE288, 0xACA05902, 0x00000003, + 0x402EE220, 0xACA05902, 0xAE605B02, 0x00000003, 0x002EE288, 0xACA05902, + 0xAE605B02, 0x00000002, 0x402EE220, 0xAE605B02, 0x00000002, 0x002EE288, + 0xAE605B02, 0x00000003, 0x402EE220, 0xAE605B02, 0xAE603202, 0x00000003, + 0x002EE288, 0xAE605B02, 0xAE603202, 0x00000003, 0x402EE220, 0xAE605B02, + 0xAE603502, 0x00000003, 0x002EE288, 0xAE605B02, + // Block 57, offset 0xe40 + 0xAE603502, 0x00000002, 0x402EE220, 0xAE606402, 0x00000002, 0x002EE288, + 0xAE606402, 0x00000002, 0x402EE220, 0xAE606502, 0x00000002, 0x002EE288, + 0xAE606502, 0x00000002, 0x402EE220, 0xAE606702, 0x00000002, 0x002EE288, + 0xAE606702, 0x00000002, 0x402EE220, 0xAD806802, 0x00000002, 0x002EE288, + 0xAD806802, 0x00000003, 0x402EE220, 0xAD806802, 0xAE603202, 0x00000003, + 0x002EE288, 0xAD806802, 0xAE603202, 0x00000003, 0x402EE220, 0xAD806802, + 0xAE603502, 0x00000003, 0x002EE288, 0xAD806802, 0xAE603502, 0x00000003, + 0x402EE220, 0xAD806802, 0xAE604E02, 0x00000003, 0x002EE288, 0xAD806802, + 0xAE604E02, 0x00000003, 0x402EE220, 0xAD806802, 0xAE606402, 0x00000003, + 0x002EE288, 0xAD806802, 0xAE606402, 0x00000003, 0x402EE220, 0xAD806802, + 0xADC07002, 0x00000003, 0x002EE288, 0xAD806802, + // Block 58, offset 0xe80 + 0xADC07002, 0x00000002, 0x402EE220, 0xADC07002, 0x00000002, 0x002EE288, + 0xADC07002, 0x00000003, 0x402EE220, 0xADC07002, 0xAE603C02, 0x00000003, + 0x002EE288, 0xADC07002, 0xAE603C02, 0x00000003, 0x002EE284, 0xA0013904, + 0x002C9884, 0x00000003, 0x002EE28A, 0xA0013904, 0x002C988A, 0x00000003, + 0x002EE294, 0xA0013914, 0x002C9894, 0x00000002, 0x002EE29D, 0x002DFE9D, + 0x00000002, 0x002EE284, 0x002EE284, 0x00000002, 0x002EE28A, 0x002EE28A, + 0x00000002, 0x402F2C20, 0xAE603202, 0x00000002, 0x002F2C88, 0xAE603202, + 0x00000002, 0x402F2C20, 0xAE605202, 0x00000002, 0x002F2C88, 0xAE605202, + 0x00000004, 0x002F2C9C, 0x0002E49C, 0x002E829C, 0x0002E49C, 0x00000002, + 0x002F2C9D, 0x002BDE9D, 0x00000003, 0x002F2C9D, 0x002F2C9D, 0x002E829D, + 0x00000003, 0x002F2C9D, 0x002F2C9D, 0x0030BE9D, + // Block 59, offset 0xec0 + 0x00000003, 0x002F2C9D, 0x00302C9D, 0x002C989D, 0x00000002, 0x002F5684, + 0x002F2C84, 0x00000002, 0x402F7A20, 0xAE603202, 0x00000002, 0x002F7A88, + 0xAE603202, 0x00000002, 0x402F7A20, 0xAE604102, 0x00000002, 0x002F7A88, + 0xAE604102, 0x00000002, 0x402F7A20, 0xAE605202, 0x00000002, 0x002F7A88, + 0xAE605202, 0x00000002, 0x402F7A20, 0xACA05602, 0x00000002, 0x002F7A88, + 0xACA05602, 0x00000002, 0x002F7A84, 0xA0006104, 0x00000002, 0x002F7A8A, + 0xA0006104, 0x00000002, 0x402F7A20, 0xAE606502, 0x00000002, 0x002F7A88, + 0xAE606502, 0x00000002, 0x402F7A20, 0xAE606702, 0x00000002, 0x002F7A88, + 0xAE606702, 0x00000002, 0x402F7A20, 0xADC07002, 0x00000002, 0x002F7A88, + 0xADC07002, 0x00000003, 0x402F7A20, 0xADC07002, 0xAE605B02, 0x00000003, + 0x002F7A88, 0xADC07002, 0xAE605B02, 0x00000002, + // Block 60, offset 0xf00 + 0x402F7A20, 0xADC07B02, 0x00000002, 0x002F7A88, 0xADC07B02, 0x00000002, + 0x002F7A84, 0xA0013A04, 0x00000002, 0x002F7A8A, 0xA0013A04, 0x00000003, + 0x002F7A9C, 0x002BDE9C, 0x002C629C, 0x00000005, 0x002F7A9C, 0x002BDE9C, + 0x002C629C, 0x0009569C, 0x002FE69C, 0x00000006, 0x002F7A9C, 0x002BDE9C, + 0x002C629C, 0x0009569C, 0x002FE69C, 0x0029D09C, 0x00000002, 0x402FE620, + 0xAE603202, 0x00000002, 0x002FE688, 0xAE603202, 0x00000003, 0x402FE620, + 0xAE603202, 0xAE605202, 0x00000003, 0x002FE688, 0xAE603202, 0xAE605202, + 0x00000002, 0x402FE620, 0xAE603C02, 0x00000002, 0x002FE688, 0xAE603C02, + 0x00000002, 0x402FE620, 0xAE604102, 0x00000002, 0x002FE688, 0xAE604102, + 0x00000003, 0x402FE620, 0xAE604102, 0xAE605202, 0x00000003, 0x002FE688, + 0xAE604102, 0xAE605202, 0x00000002, 0x402FE620, + // Block 61, offset 0xf40 + 0xAE605202, 0x00000002, 0x002FE688, 0xAE605202, 0x00000002, 0x402FE620, + 0xACA05602, 0x00000002, 0x002FE688, 0xACA05602, 0x00000002, 0x002FE684, + 0xA0006104, 0x00000002, 0x002FE68A, 0xA0006104, 0x00000002, 0x402FE620, + 0xADC07002, 0x00000002, 0x002FE688, 0xADC07002, 0x00000003, 0x402FE620, + 0xADC07002, 0xAE605202, 0x00000003, 0x002FE688, 0xADC07002, 0xAE605202, + 0x00000002, 0x402FE620, 0xADC07702, 0x00000002, 0x002FE688, 0xADC07702, + 0x00000002, 0x002FE684, 0xA0013A04, 0x00000002, 0x84E617F3, 0xAE613A04, + 0x00000002, 0x002FE684, 0xA0013A04, 0x00000002, 0x002FE68A, 0xA0013A04, + 0x00000003, 0x002FE684, 0xA0013A04, 0xAE605202, 0x00000002, 0x002FE69D, + 0x002BDE9D, 0x00000003, 0x002FE69D, 0x002EE29D, 0x002FE69D, 0x00000003, + 0x002FE684, 0xA0013904, 0x002FE684, 0x00000003, + // Block 62, offset 0xf80 + 0x002FE68A, 0xA0013904, 0x002FE68A, 0x00000003, 0x002FE684, 0xA0013A04, + 0x00302C84, 0x00000002, 0x40302C20, 0xAE604102, 0x00000002, 0x00302C88, + 0xAE604102, 0x00000002, 0x40302C20, 0xAE604702, 0x00000002, 0x40302C20, + 0xAE605202, 0x00000002, 0x00302C88, 0xAE605202, 0x00000002, 0x40302C20, + 0xACA05602, 0x00000002, 0x00302C88, 0xACA05602, 0x00000002, 0x40302C20, + 0xADC07002, 0x00000002, 0x00302C88, 0xADC07002, 0x00000002, 0x40302C20, + 0xADC07702, 0x00000002, 0x00302C88, 0xADC07702, 0x00000002, 0x40302C20, + 0xADC07802, 0x00000002, 0x00302C88, 0xADC07802, 0x00000002, 0x40302C20, + 0xADC07B02, 0x00000002, 0x00302C88, 0xADC07B02, 0x00000002, 0x00302C84, + 0xA0013A04, 0x00000002, 0x00302C8A, 0xA0013A04, 0x00000002, 0x00302C84, + 0x002C5684, 0x00000003, 0x00302C8A, 0x002C988A, + // Block 63, offset 0xfc0 + 0x002E228A, 0x00000003, 0x00302C84, 0xA0013904, 0x002D6884, 0x00000003, + 0x00302C9D, 0x002D689D, 0x00312A9C, 0x00000002, 0x00302C84, 0x002FE684, + 0x00000002, 0x00302C84, 0x002FE684, 0x00000002, 0x00302C84, 0x00300884, + 0x00000002, 0x00302C84, 0x00312A84, 0x00000002, 0x00302C8A, 0x00312A84, + 0x00000002, 0x40306C20, 0xAE603202, 0x00000002, 0x00306C88, 0xAE603202, + 0x00000002, 0x40306C20, 0xAE603502, 0x00000002, 0x00306C88, 0xAE603502, + 0x00000002, 0x40306C20, 0xAE603702, 0x00000002, 0x00306C88, 0xAE603702, + 0x00000002, 0x40306C20, 0xAE603C02, 0x00000002, 0x00306C88, 0xAE603C02, + 0x00000002, 0x40306C20, 0xAE604102, 0x00000002, 0x00306C88, 0xAE604102, + 0x00000002, 0x40306C20, 0xAE604302, 0x00000002, 0x00306C88, 0xAE604302, + 0x00000002, 0x40306C20, 0xAE604702, 0x00000002, + // Block 64, offset 0x1000 + 0x00306C88, 0xAE604702, 0x00000003, 0x40306C20, 0xAE604702, 0xAE603202, + 0x00000003, 0x00306C88, 0xAE604702, 0xAE603202, 0x00000003, 0x40306C20, + 0xAE604702, 0xAE603502, 0x00000003, 0x00306C88, 0xAE604702, 0xAE603502, + 0x00000003, 0x40306C20, 0xAE604702, 0xAE604102, 0x00000003, 0x00306C88, + 0xAE604702, 0xAE604102, 0x00000003, 0x40306C20, 0xAE604702, 0xAE605B02, + 0x00000003, 0x00306C88, 0xAE604702, 0xAE605B02, 0x00000002, 0x40306C20, + 0xAE604D02, 0x00000002, 0x00306C88, 0xAE604D02, 0x00000002, 0x40306C20, + 0xAE604E02, 0x00000002, 0x00306C88, 0xAE604E02, 0x00000003, 0x40306C20, + 0xAE604E02, 0xAE603202, 0x00000003, 0x00306C88, 0xAE604E02, 0xAE603202, + 0x00000002, 0x40306C20, 0xACA05902, 0x00000002, 0x00306C88, 0xACA05902, + 0x00000002, 0x40306C20, 0xAE605B02, 0x00000002, + // Block 65, offset 0x1040 + 0x00306C88, 0xAE605B02, 0x00000003, 0x40306C20, 0xAE605B02, 0xAE604702, + 0x00000003, 0x00306C88, 0xAE605B02, 0xAE604702, 0x00000002, 0x40306C20, + 0xAE606402, 0x00000002, 0x00306C88, 0xAE606402, 0x00000002, 0x40306C20, + 0xAE606502, 0x00000002, 0x00306C88, 0xAE606502, 0x00000002, 0x40306C20, + 0xAE606702, 0x00000002, 0x00306C88, 0xAE606702, 0x00000002, 0x40306C20, + 0xAD806802, 0x00000002, 0x00306C88, 0xAD806802, 0x00000003, 0x40306C20, + 0xAD806802, 0xAE603202, 0x00000003, 0x00306C88, 0xAD806802, 0xAE603202, + 0x00000003, 0x40306C20, 0xAD806802, 0xAE603502, 0x00000003, 0x00306C88, + 0xAD806802, 0xAE603502, 0x00000003, 0x40306C20, 0xAD806802, 0xAE604E02, + 0x00000003, 0x00306C88, 0xAD806802, 0xAE604E02, 0x00000003, 0x40306C20, + 0xAD806802, 0xAE606402, 0x00000003, 0x00306C88, + // Block 66, offset 0x1080 + 0xAD806802, 0xAE606402, 0x00000003, 0x40306C20, 0xAD806802, 0xADC07002, + 0x00000003, 0x00306C88, 0xAD806802, 0xADC07002, 0x00000002, 0x40306C20, + 0xADC07002, 0x00000002, 0x00306C88, 0xADC07002, 0x00000002, 0x40306C20, + 0xADC07502, 0x00000002, 0x00306C88, 0xADC07502, 0x00000002, 0x40306C20, + 0xADC07802, 0x00000002, 0x00306C88, 0xADC07802, 0x00000002, 0x40306C20, + 0xADC07A02, 0x00000002, 0x00306C88, 0xADC07A02, 0x00000003, 0x00306C9D, + 0x002F2C9D, 0x0002BA9C, 0x00000002, 0x4030BE20, 0xAE604E02, 0x00000002, + 0x0030BE88, 0xAE604E02, 0x00000002, 0x4030BE20, 0xADC07002, 0x00000002, + 0x0030BE88, 0xADC07002, 0x00000003, 0x0030BE9D, 0x0009569C, 0x002E829C, + 0x00000004, 0x0030BE84, 0x002D9A84, 0x002D9A84, 0x002D9A9F, 0x00000004, + 0x0030BE8A, 0x002D9A8A, 0x002D9A8A, 0x002D9A9F, + // Block 67, offset 0x10c0 + 0x00000002, 0x0030BE9D, 0x002FE69D, 0x00000002, 0x0030BE84, 0x00310084, + 0x00000002, 0x0030BE8A, 0x0031008A, 0x00000002, 0x4030E220, 0xAE603202, + 0x00000002, 0x0030E288, 0xAE603202, 0x00000002, 0x4030E220, 0xAE603502, + 0x00000002, 0x0030E288, 0xAE603502, 0x00000002, 0x4030E220, 0xAE603C02, + 0x00000002, 0x0030E288, 0xAE603C02, 0x00000002, 0x4030E220, 0xAE604302, + 0x00000002, 0x4030E220, 0xAE604702, 0x00000002, 0x0030E288, 0xAE604702, + 0x00000002, 0x4030E220, 0xAE605202, 0x00000002, 0x0030E288, 0xAE605202, + 0x00000002, 0x4030E220, 0xADC07002, 0x00000002, 0x0030E288, 0xADC07002, + 0x00000002, 0x0030E29D, 0x002C3A9D, 0x00000002, 0x4030F620, 0xAE604702, + 0x00000002, 0x0030F688, 0xAE604702, 0x00000002, 0x4030F620, 0xAE605202, + 0x00000002, 0x0030F688, 0xAE605202, 0x00000002, + // Block 68, offset 0x1100 + 0x40310020, 0xAE603202, 0x00000002, 0x00310088, 0xAE603202, 0x00000002, + 0x40310020, 0xAE603502, 0x00000002, 0x00310088, 0xAE603502, 0x00000002, + 0x40310020, 0xAE603C02, 0x00000002, 0x00310088, 0xAE603C02, 0x00000002, + 0x40310020, 0xAE604302, 0x00000002, 0x40310020, 0xAE604702, 0x00000002, + 0x00310088, 0xAE604702, 0x00000002, 0x40310020, 0xAE604E02, 0x00000002, + 0x00310088, 0xAE604E02, 0x00000002, 0x40310020, 0xAE605202, 0x00000002, + 0x00310088, 0xAE605202, 0x00000002, 0x40310020, 0xAE605B02, 0x00000002, + 0x00310088, 0xAE605B02, 0x00000002, 0x40310020, 0xAE606402, 0x00000002, + 0x00310088, 0xAE606402, 0x00000002, 0x40310020, 0xADC07002, 0x00000002, + 0x00310088, 0xADC07002, 0x00000002, 0x40312A20, 0xAE603202, 0x00000002, + 0x00312A88, 0xAE603202, 0x00000002, 0x40312A20, + // Block 69, offset 0x1140 + 0xAE603C02, 0x00000002, 0x00312A88, 0xAE603C02, 0x00000002, 0x40312A20, + 0xAE604102, 0x00000002, 0x00312A88, 0xAE604102, 0x00000002, 0x40312A20, + 0xAE605202, 0x00000002, 0x00312A88, 0xAE605202, 0x00000002, 0x40312A20, + 0xADC07002, 0x00000002, 0x00312A88, 0xADC07002, 0x00000002, 0x40312A20, + 0xADC07B02, 0x00000002, 0x00312A88, 0xADC07B02, 0x00000002, 0x00312A84, + 0x0030E284, 0x00000002, 0x40316420, 0xAE604102, 0x00000002, 0x00316488, + 0xAE604102, 0x00000002, 0x40325220, 0xAE602202, 0x00000002, 0x00325288, + 0xAE602202, 0x00000003, 0x40325220, 0xAE602202, 0xAE603202, 0x00000003, + 0x00325288, 0xAE602202, 0xAE603202, 0x00000004, 0x40325220, 0xAE602202, + 0xAE603202, 0xAF007F02, 0x00000004, 0x00325288, 0xAE602202, 0xAE603202, + 0xAF007F02, 0x00000003, 0x40325220, 0xAE602202, + // Block 70, offset 0x1180 + 0xAE603502, 0x00000003, 0x00325288, 0xAE602202, 0xAE603502, 0x00000004, + 0x40325220, 0xAE602202, 0xAE603502, 0xAF007F02, 0x00000004, 0x00325288, + 0xAE602202, 0xAE603502, 0xAF007F02, 0x00000003, 0x40325220, 0xAE602202, + 0xAE604502, 0x00000003, 0x00325288, 0xAE602202, 0xAE604502, 0x00000004, + 0x40325220, 0xAE602202, 0xAE604502, 0xAF007F02, 0x00000004, 0x00325288, + 0xAE602202, 0xAE604502, 0xAF007F02, 0x00000003, 0x40325220, 0xAE602202, + 0xAF007F02, 0x00000003, 0x00325288, 0xAE602202, 0xAF007F02, 0x00000002, + 0x40325220, 0xAE602A02, 0x00000002, 0x00325288, 0xAE602A02, 0x00000003, + 0x40325220, 0xAE602A02, 0xAE603202, 0x00000003, 0x00325288, 0xAE602A02, + 0xAE603202, 0x00000004, 0x40325220, 0xAE602A02, 0xAE603202, 0xAF007F02, + 0x00000004, 0x00325288, 0xAE602A02, 0xAE603202, + // Block 71, offset 0x11c0 + 0xAF007F02, 0x00000003, 0x40325220, 0xAE602A02, 0xAE603502, 0x00000003, + 0x00325288, 0xAE602A02, 0xAE603502, 0x00000004, 0x40325220, 0xAE602A02, + 0xAE603502, 0xAF007F02, 0x00000004, 0x00325288, 0xAE602A02, 0xAE603502, + 0xAF007F02, 0x00000003, 0x40325220, 0xAE602A02, 0xAE604502, 0x00000003, + 0x00325288, 0xAE602A02, 0xAE604502, 0x00000004, 0x40325220, 0xAE602A02, + 0xAE604502, 0xAF007F02, 0x00000004, 0x00325288, 0xAE602A02, 0xAE604502, + 0xAF007F02, 0x00000003, 0x40325220, 0xAE602A02, 0xAF007F02, 0x00000003, + 0x00325288, 0xAE602A02, 0xAF007F02, 0x00000002, 0x40325220, 0xAE603202, + 0x00000002, 0x00325288, 0xAE603202, 0x00000003, 0x40325220, 0xAE603202, + 0xAF007F02, 0x00000002, 0x40325220, 0xAE603502, 0x00000002, 0x00325288, + 0xAE603502, 0x00000003, 0x40325220, 0xAE603502, + // Block 72, offset 0x1200 + 0xAF007F02, 0x00000002, 0x40325220, 0xAE603702, 0x00000002, 0x00325288, + 0xAE603702, 0x00000002, 0x40325220, 0xAE604502, 0x00000003, 0x40325220, + 0xAE604502, 0xAF007F02, 0x00000002, 0x40325220, 0xAE605B02, 0x00000002, + 0x00325288, 0xAE605B02, 0x00000002, 0x40325220, 0xAF007F02, 0x00000002, + 0x00325288, 0xAF007F02, 0x00000002, 0x40325C20, 0xAE602202, 0x00000002, + 0x00325C88, 0xAE602202, 0x00000003, 0x40325C20, 0xAE602202, 0xAE603202, + 0x00000003, 0x00325C88, 0xAE602202, 0xAE603202, 0x00000003, 0x40325C20, + 0xAE602202, 0xAE603502, 0x00000003, 0x00325C88, 0xAE602202, 0xAE603502, + 0x00000002, 0x40325C20, 0xAE602A02, 0x00000002, 0x00325C88, 0xAE602A02, + 0x00000003, 0x40325C20, 0xAE602A02, 0xAE603202, 0x00000003, 0x00325C88, + 0xAE602A02, 0xAE603202, 0x00000003, 0x40325C20, + // Block 73, offset 0x1240 + 0xAE602A02, 0xAE603502, 0x00000003, 0x00325C88, 0xAE602A02, 0xAE603502, + 0x00000002, 0x40325C20, 0xAE603202, 0x00000002, 0x00325C88, 0xAE603202, + 0x00000002, 0x40325C20, 0xAE603502, 0x00000002, 0x00325C88, 0xAE603502, + 0x00000002, 0x40326820, 0xAE602202, 0x00000002, 0x00326888, 0xAE602202, + 0x00000003, 0x40326820, 0xAE602202, 0xAE603202, 0x00000003, 0x00326888, + 0xAE602202, 0xAE603202, 0x00000004, 0x40326820, 0xAE602202, 0xAE603202, + 0xAF007F02, 0x00000004, 0x00326888, 0xAE602202, 0xAE603202, 0xAF007F02, + 0x00000003, 0x40326820, 0xAE602202, 0xAE603502, 0x00000003, 0x00326888, + 0xAE602202, 0xAE603502, 0x00000004, 0x40326820, 0xAE602202, 0xAE603502, + 0xAF007F02, 0x00000004, 0x00326888, 0xAE602202, 0xAE603502, 0xAF007F02, + 0x00000003, 0x40326820, 0xAE602202, 0xAE604502, + // Block 74, offset 0x1280 + 0x00000003, 0x00326888, 0xAE602202, 0xAE604502, 0x00000004, 0x40326820, + 0xAE602202, 0xAE604502, 0xAF007F02, 0x00000004, 0x00326888, 0xAE602202, + 0xAE604502, 0xAF007F02, 0x00000003, 0x40326820, 0xAE602202, 0xAF007F02, + 0x00000003, 0x00326888, 0xAE602202, 0xAF007F02, 0x00000002, 0x40326820, + 0xAE602A02, 0x00000002, 0x00326888, 0xAE602A02, 0x00000003, 0x40326820, + 0xAE602A02, 0xAE603202, 0x00000003, 0x00326888, 0xAE602A02, 0xAE603202, + 0x00000004, 0x40326820, 0xAE602A02, 0xAE603202, 0xAF007F02, 0x00000004, + 0x00326888, 0xAE602A02, 0xAE603202, 0xAF007F02, 0x00000003, 0x40326820, + 0xAE602A02, 0xAE603502, 0x00000003, 0x00326888, 0xAE602A02, 0xAE603502, + 0x00000004, 0x40326820, 0xAE602A02, 0xAE603502, 0xAF007F02, 0x00000004, + 0x00326888, 0xAE602A02, 0xAE603502, 0xAF007F02, + // Block 75, offset 0x12c0 + 0x00000003, 0x40326820, 0xAE602A02, 0xAE604502, 0x00000003, 0x00326888, + 0xAE602A02, 0xAE604502, 0x00000004, 0x40326820, 0xAE602A02, 0xAE604502, + 0xAF007F02, 0x00000004, 0x00326888, 0xAE602A02, 0xAE604502, 0xAF007F02, + 0x00000003, 0x40326820, 0xAE602A02, 0xAF007F02, 0x00000003, 0x00326888, + 0xAE602A02, 0xAF007F02, 0x00000002, 0x40326820, 0xAE603202, 0x00000002, + 0x00326888, 0xAE603202, 0x00000003, 0x40326820, 0xAE603202, 0xAF007F02, + 0x00000002, 0x40326820, 0xAE603502, 0x00000002, 0x00326888, 0xAE603502, + 0x00000003, 0x40326820, 0xAE603502, 0xAF007F02, 0x00000002, 0x40326820, + 0xAE604502, 0x00000003, 0x40326820, 0xAE604502, 0xAF007F02, 0x00000002, + 0x40326820, 0xAF007F02, 0x00000002, 0x00326888, 0xAF007F02, 0x00000002, + 0x40326C20, 0xAE602202, 0x00000002, 0x00326C88, + // Block 76, offset 0x1300 + 0xAE602202, 0x00000003, 0x40326C20, 0xAE602202, 0xAE603202, 0x00000003, + 0x00326C88, 0xAE602202, 0xAE603202, 0x00000003, 0x40326C20, 0xAE602202, + 0xAE603502, 0x00000003, 0x00326C88, 0xAE602202, 0xAE603502, 0x00000003, + 0x40326C20, 0xAE602202, 0xAE604502, 0x00000003, 0x00326C88, 0xAE602202, + 0xAE604502, 0x00000002, 0x40326C20, 0xAE602A02, 0x00000002, 0x00326C88, + 0xAE602A02, 0x00000003, 0x40326C20, 0xAE602A02, 0xAE603202, 0x00000003, + 0x00326C88, 0xAE602A02, 0xAE603202, 0x00000003, 0x40326C20, 0xAE602A02, + 0xAE603502, 0x00000003, 0x00326C88, 0xAE602A02, 0xAE603502, 0x00000003, + 0x40326C20, 0xAE602A02, 0xAE604502, 0x00000003, 0x00326C88, 0xAE602A02, + 0xAE604502, 0x00000002, 0x40326C20, 0xAE603202, 0x00000002, 0x00326C88, + 0xAE603202, 0x00000002, 0x40326C20, 0xAE603502, + // Block 77, offset 0x1340 + 0x00000002, 0x00326C88, 0xAE603502, 0x00000002, 0x40326C20, 0xAE603702, + 0x00000002, 0x00326C88, 0xAE603702, 0x00000002, 0x40326C20, 0xAE604502, + 0x00000002, 0x40326C20, 0xAE604702, 0x00000002, 0x00326C88, 0xAE604702, + 0x00000003, 0x40326C20, 0xAE604702, 0xAE603202, 0x00000003, 0x40326C20, + 0xAE604702, 0xAE603502, 0x00000003, 0x40326C20, 0xAE604702, 0xAE604502, + 0x00000002, 0x40326C20, 0xAE605B02, 0x00000002, 0x00326C88, 0xAE605B02, + 0x00000003, 0x00327084, 0x00325284, 0x00326C84, 0x00000003, 0x0032708A, + 0x00325284, 0x00326C84, 0x00000002, 0x40327C20, 0xAE602202, 0x00000002, + 0x00327C88, 0xAE602202, 0x00000003, 0x40327C20, 0xAE602202, 0xAE603202, + 0x00000003, 0x00327C88, 0xAE602202, 0xAE603202, 0x00000003, 0x40327C20, + 0xAE602202, 0xAE603502, 0x00000003, 0x00327C88, + // Block 78, offset 0x1380 + 0xAE602202, 0xAE603502, 0x00000002, 0x40327C20, 0xAE602A02, 0x00000002, + 0x00327C88, 0xAE602A02, 0x00000003, 0x40327C20, 0xAE602A02, 0xAE603202, + 0x00000003, 0x00327C88, 0xAE602A02, 0xAE603202, 0x00000003, 0x40327C20, + 0xAE602A02, 0xAE603502, 0x00000003, 0x00327C88, 0xAE602A02, 0xAE603502, + 0x00000002, 0x40327C20, 0xAE603202, 0x00000002, 0x00327C88, 0xAE603202, + 0x00000002, 0x40327C20, 0xAE603502, 0x00000002, 0x00327C88, 0xAE603502, + 0x00000002, 0x40328820, 0xAE602202, 0x00000002, 0x40328820, 0xAE602A02, + 0x00000002, 0x00328888, 0xAE602A02, 0x00000002, 0x40329820, 0xAE602202, + 0x00000003, 0x40329820, 0xAE602202, 0xAE603202, 0x00000003, 0x40329820, + 0xAE602202, 0xAE603502, 0x00000003, 0x40329820, 0xAE602202, 0xAE604502, + 0x00000002, 0x40329820, 0xAE602A02, 0x00000002, + // Block 79, offset 0x13c0 + 0x00329888, 0xAE602A02, 0x00000003, 0x40329820, 0xAE602A02, 0xAE603202, + 0x00000003, 0x00329888, 0xAE602A02, 0xAE603202, 0x00000003, 0x40329820, + 0xAE602A02, 0xAE603502, 0x00000003, 0x00329888, 0xAE602A02, 0xAE603502, + 0x00000003, 0x40329820, 0xAE602A02, 0xAE604502, 0x00000003, 0x00329888, + 0xAE602A02, 0xAE604502, 0x00000002, 0x40329820, 0xAE603202, 0x00000002, + 0x00329888, 0xAE603202, 0x00000002, 0x40329820, 0xAE603502, 0x00000002, + 0x00329888, 0xAE603502, 0x00000002, 0x40329820, 0xAE603702, 0x00000002, + 0x00329888, 0xAE603702, 0x00000002, 0x40329820, 0xAE604502, 0x00000002, + 0x40329820, 0xAE604702, 0x00000002, 0x00329888, 0xAE604702, 0x00000003, + 0x40329820, 0xAE604702, 0xAE603202, 0x00000003, 0x40329820, 0xAE604702, + 0xAE603502, 0x00000003, 0x40329820, 0xAE604702, + // Block 80, offset 0x1400 + 0xAE604502, 0x00000002, 0x40329820, 0xAE605B02, 0x00000002, 0x00329888, + 0xAE605B02, 0x00000002, 0x4032A220, 0xAE602202, 0x00000002, 0x0032A288, + 0xAE602202, 0x00000003, 0x4032A220, 0xAE602202, 0xAE603202, 0x00000003, + 0x0032A288, 0xAE602202, 0xAE603202, 0x00000004, 0x4032A220, 0xAE602202, + 0xAE603202, 0xAF007F02, 0x00000004, 0x0032A288, 0xAE602202, 0xAE603202, + 0xAF007F02, 0x00000003, 0x4032A220, 0xAE602202, 0xAE603502, 0x00000003, + 0x0032A288, 0xAE602202, 0xAE603502, 0x00000004, 0x4032A220, 0xAE602202, + 0xAE603502, 0xAF007F02, 0x00000004, 0x0032A288, 0xAE602202, 0xAE603502, + 0xAF007F02, 0x00000003, 0x4032A220, 0xAE602202, 0xAE604502, 0x00000003, + 0x0032A288, 0xAE602202, 0xAE604502, 0x00000004, 0x4032A220, 0xAE602202, + 0xAE604502, 0xAF007F02, 0x00000004, 0x0032A288, + // Block 81, offset 0x1440 + 0xAE602202, 0xAE604502, 0xAF007F02, 0x00000003, 0x4032A220, 0xAE602202, + 0xAF007F02, 0x00000003, 0x0032A288, 0xAE602202, 0xAF007F02, 0x00000002, + 0x4032A220, 0xAE602A02, 0x00000002, 0x0032A288, 0xAE602A02, 0x00000003, + 0x4032A220, 0xAE602A02, 0xAE603202, 0x00000003, 0x0032A288, 0xAE602A02, + 0xAE603202, 0x00000004, 0x4032A220, 0xAE602A02, 0xAE603202, 0xAF007F02, + 0x00000004, 0x0032A288, 0xAE602A02, 0xAE603202, 0xAF007F02, 0x00000003, + 0x4032A220, 0xAE602A02, 0xAE603502, 0x00000003, 0x0032A288, 0xAE602A02, + 0xAE603502, 0x00000004, 0x4032A220, 0xAE602A02, 0xAE603502, 0xAF007F02, + 0x00000004, 0x0032A288, 0xAE602A02, 0xAE603502, 0xAF007F02, 0x00000003, + 0x4032A220, 0xAE602A02, 0xAE604502, 0x00000003, 0x0032A288, 0xAE602A02, + 0xAE604502, 0x00000004, 0x4032A220, 0xAE602A02, + // Block 82, offset 0x1480 + 0xAE604502, 0xAF007F02, 0x00000004, 0x0032A288, 0xAE602A02, 0xAE604502, + 0xAF007F02, 0x00000003, 0x4032A220, 0xAE602A02, 0xAF007F02, 0x00000003, + 0x0032A288, 0xAE602A02, 0xAF007F02, 0x00000002, 0x4032A220, 0xAE603202, + 0x00000002, 0x0032A288, 0xAE603202, 0x00000003, 0x4032A220, 0xAE603202, + 0xAF007F02, 0x00000002, 0x4032A220, 0xAE603502, 0x00000002, 0x0032A288, + 0xAE603502, 0x00000003, 0x4032A220, 0xAE603502, 0xAF007F02, 0x00000002, + 0x4032A220, 0xAE604502, 0x00000003, 0x4032A220, 0xAE604502, 0xAF007F02, + 0x00000002, 0x4032A220, 0xAF007F02, 0x00000002, 0x0032A288, 0xAF007F02, + 0x00000003, 0x0032C084, 0x0032AA84, 0x0032BE84, 0x00000002, 0x00336284, + 0xA0013A04, 0x00000002, 0x0033628A, 0xA0013A04, 0x00000002, 0x4033B220, + 0xAE603502, 0x00000002, 0x0033B288, 0xAE603502, + // Block 83, offset 0x14c0 + 0x00000002, 0x4033B220, 0xAE604702, 0x00000002, 0x0033B288, 0xAE604702, + 0x00000002, 0x4033CA20, 0xAE603702, 0x00000002, 0x0033CA88, 0xAE603702, + 0x00000002, 0x40341420, 0xAE603502, 0x00000002, 0x00341488, 0xAE603502, + 0x00000002, 0x40341420, 0xAE605B02, 0x00000002, 0x00341488, 0xAE605B02, + 0x00000002, 0x84E61A9D, 0x84E61AA6, 0x00000002, 0x40357220, 0xAE605B02, + 0x00000002, 0x00357288, 0xAE605B02, 0x00000002, 0x40389020, 0xA1108C02, + 0x00000002, 0x40389020, 0xA1208D02, 0x00000002, 0x40389020, 0xA1509202, + 0x00000002, 0x40389220, 0xA1509202, 0x00000002, 0x40389220, 0xA1709502, + 0x00000002, 0x40389420, 0xA1509202, 0x00000002, 0x40389620, 0xA1509202, + 0x00000002, 0x40389820, 0xA1509202, 0x00000002, 0x40389A20, 0xA1308E02, + 0x00000002, 0x40389A20, 0xA1509202, 0x00000002, + // Block 84, offset 0x1500 + 0x00389A84, 0x00389A84, 0x00000002, 0x00389A84, 0x0038A284, 0x00000002, + 0x40389C20, 0xA1509202, 0x00000002, 0x4038A020, 0xA1509202, 0x00000002, + 0x4038A220, 0xA0E08902, 0x00000002, 0x4038A220, 0xA1509202, 0x00000002, + 0x0038A284, 0x0038A284, 0x00000003, 0x0038A284, 0x0038A284, 0xA1108C02, + 0x00000002, 0x4038A420, 0xA1509202, 0x00000002, 0x0038A499, 0xA1509202, + 0x00000002, 0x4038A420, 0xA1709502, 0x00000002, 0x4038A620, 0xA1509202, + 0x00000002, 0x4038A820, 0xA1509202, 0x00000002, 0x4038AA20, 0xA1509202, + 0x00000002, 0x4038AC20, 0xA1509202, 0x00000002, 0x4038B020, 0xA1509202, + 0x00000002, 0x0038B099, 0xA1509202, 0x00000002, 0x4038B020, 0xA1709502, + 0x00000002, 0x4038B220, 0xA1509202, 0x00000002, 0x4038B420, 0xA1509202, + 0x00000002, 0x4038B620, 0xA1509202, 0x00000002, + // Block 85, offset 0x1540 + 0x4038B820, 0xA1909002, 0x00000002, 0x4038B820, 0xA1809102, 0x00000002, + 0x4038B820, 0xA1509202, 0x00000003, 0x4038B820, 0xA1509202, 0xA1909002, + 0x00000003, 0x4038B820, 0xA1509202, 0xA1809102, 0x00000002, 0x4038BA20, + 0xA1509202, 0x00000002, 0x00391C84, 0xA0013A04, 0x00000002, 0x00393099, + 0x00393899, 0x00000002, 0x0039309A, 0x0039389A, 0x00000002, 0x00393097, + 0x00396497, 0x00000002, 0x0039309A, 0x0039649A, 0x00000002, 0x00393097, + 0x00397297, 0x00000002, 0x0039309A, 0x0039729A, 0x00000002, 0x00393097, + 0x00397497, 0x00000002, 0x00393099, 0x0039A499, 0x00000002, 0x00393099, + 0x0039A699, 0x00000002, 0x00393097, 0x003A4E97, 0x00000002, 0x00393098, + 0x003A4E98, 0x00000002, 0x00393099, 0x003A4E99, 0x00000002, 0x0039309A, + 0x003A4E9A, 0x00000002, 0x00393099, 0x003A5699, + // Block 86, offset 0x1580 + 0x00000002, 0x00393097, 0x003A6897, 0x00000002, 0x00393098, 0x003A6898, + 0x00000002, 0x00393099, 0x003A7299, 0x00000002, 0x0039309A, 0x003A729A, + 0x00000002, 0x00393099, 0x003A7499, 0x00000002, 0x0039309A, 0x003A749A, + 0x00000002, 0x00393099, 0x003A7A99, 0x00000002, 0x0039309A, 0x003A7A9A, + 0x00000002, 0x00393099, 0x003A7C99, 0x00000002, 0x0039309A, 0x003A7C9A, + 0x00000002, 0x00393099, 0x003A7E99, 0x00000002, 0x0039309A, 0x003A7E9A, + 0x00000002, 0x00393097, 0x003A8E97, 0x00000002, 0x00393099, 0x003A8E99, + 0x00000002, 0x00393099, 0x003A8E99, 0x00000002, 0x0039309A, 0x003A8E9A, + 0x00000002, 0x0039309A, 0x003A8E9A, 0x00000002, 0x00393099, 0x003A9099, + 0x00000002, 0x0039309A, 0x003A909A, 0x00000002, 0x00393097, 0x003A9897, + 0x00000002, 0x00393099, 0x003A9899, 0x00000002, + // Block 87, offset 0x15c0 + 0x0039309A, 0x003A989A, 0x00000004, 0x0039389A, 0x003A1A9A, 0x00393C9A, + 0x0039A49A, 0x00000004, 0x0039389A, 0x003A409A, 0x003A409A, 0x003A689A, + 0x00000003, 0x00393C99, 0x00397299, 0x003A9099, 0x00000003, 0x00393C99, + 0x00397499, 0x003A9099, 0x00000003, 0x00395697, 0x00396497, 0x003A4E97, + 0x00000003, 0x00395699, 0x00396499, 0x003A8E99, 0x00000003, 0x00395699, + 0x00396499, 0x003A9099, 0x00000003, 0x00395697, 0x00397297, 0x00396497, + 0x00000003, 0x00395699, 0x00397299, 0x00396499, 0x00000003, 0x00395697, + 0x00397297, 0x003A4E97, 0x00000003, 0x00395697, 0x00397497, 0x003A4E97, + 0x00000003, 0x00395699, 0x00397499, 0x003A8E99, 0x00000003, 0x00395699, + 0x00397499, 0x003A9099, 0x00000003, 0x00395697, 0x003A4E97, 0x00396497, + 0x00000003, 0x00395697, 0x003A4E97, 0x00397297, + // Block 88, offset 0x1600 + 0x00000003, 0x00395697, 0x003A4E97, 0x00397497, 0x00000003, 0x00395699, + 0x003A4E99, 0x003A8E99, 0x00000003, 0x00395699, 0x003A4E99, 0x003A9099, + 0x00000003, 0x00396499, 0x00397299, 0x003A8E99, 0x00000003, 0x00396499, + 0x00397299, 0x003A9099, 0x00000008, 0x0039649A, 0x003A409A, 0x0002129A, + 0x0039649A, 0x003A409A, 0x0039389A, 0x003A409A, 0x003A689A, 0x00000003, + 0x00396497, 0x003A4E97, 0x00397297, 0x00000003, 0x00396499, 0x003A4E99, + 0x00397299, 0x00000003, 0x00396499, 0x003A4E99, 0x003A8E99, 0x00000003, + 0x00396499, 0x003A4E99, 0x003A9099, 0x00000003, 0x00397299, 0x00396499, + 0x003A9099, 0x00000003, 0x00397299, 0x003A4E99, 0x003A8E99, 0x00000003, + 0x00397299, 0x003A4E99, 0x003A9099, 0x00000004, 0x0039A49A, 0x0039C69A, + 0x003A749A, 0x003A409A, 0x00000003, 0x0039C697, + // Block 89, offset 0x1640 + 0x00396497, 0x00397297, 0x00000003, 0x0039C699, 0x00396499, 0x003A8E99, + 0x00000003, 0x0039C697, 0x00397297, 0x00396497, 0x00000003, 0x0039C699, + 0x00397499, 0x003A8E99, 0x00000003, 0x0039C699, 0x00397499, 0x003A9099, + 0x00000003, 0x0039C697, 0x003A4E97, 0x00396497, 0x00000003, 0x0039C697, + 0x003A4E97, 0x00397297, 0x00000003, 0x0039C699, 0x003A4E99, 0x00397299, + 0x00000003, 0x0039C697, 0x003A4E97, 0x003A4E97, 0x00000003, 0x0039C699, + 0x003A4E99, 0x003A4E99, 0x00000003, 0x0039C899, 0x00396499, 0x003A9099, + 0x00000003, 0x0039C897, 0x00397297, 0x003A4E97, 0x00000003, 0x0039C899, + 0x00397299, 0x003A4E99, 0x00000003, 0x0039C899, 0x00397299, 0x003A9099, + 0x00000003, 0x0039C897, 0x003A4E97, 0x00397497, 0x00000003, 0x0039C899, + 0x003A4E99, 0x00397499, 0x00000003, 0x0039C897, + // Block 90, offset 0x1680 + 0x003A4E97, 0x003A4E97, 0x00000003, 0x0039C899, 0x003A4E99, 0x003A4E99, + 0x00000003, 0x0039DC97, 0x00397297, 0x00397297, 0x00000003, 0x0039DC99, + 0x00397299, 0x00397299, 0x00000003, 0x0039DC99, 0x00397299, 0x003A9099, + 0x00000004, 0x0039DC9A, 0x003A409A, 0x0039EE9A, 0x003A4E9A, 0x00000003, + 0x0039DC9A, 0x003A409A, 0x003A8E9A, 0x00000012, 0x0039DC9A, 0x003A409A, + 0x003A8E9A, 0x0002129A, 0x0039389A, 0x003A409A, 0x003A409A, 0x003A689A, + 0x0002129A, 0x0039EE9A, 0x003A409A, 0x003A909A, 0x003A689A, 0x0002129A, + 0x003A749A, 0x0039C69A, 0x003A409A, 0x003A4E9A, 0x00000003, 0x0039DC9A, + 0x003A409A, 0x003AAA9A, 0x00000003, 0x0039DC97, 0x003A4E97, 0x003A4E97, + 0x00000003, 0x0039DC99, 0x003A4E99, 0x003A4E99, 0x00000003, 0x0039DE99, + 0x00397299, 0x003A8E99, 0x00000003, 0x0039DE99, + // Block 91, offset 0x16c0 + 0x00397299, 0x003A9099, 0x00000003, 0x0039DE97, 0x00397497, 0x003A4E97, + 0x00000003, 0x0039DE99, 0x00397499, 0x003A4E99, 0x00000003, 0x0039E697, + 0x003A4E97, 0x00397297, 0x00000003, 0x0039E699, 0x003A4E99, 0x00397299, + 0x00000003, 0x0039E697, 0x003A4E97, 0x003A4E97, 0x00000003, 0x0039E699, + 0x003A4E99, 0x003A9099, 0x00000003, 0x0039EE97, 0x00396497, 0x003A4E97, + 0x00000003, 0x0039EE99, 0x00396499, 0x003A4E99, 0x00000004, 0x0039EE9A, + 0x003A409A, 0x003A909A, 0x003A689A, 0x00000003, 0x0039EE97, 0x003A4E97, + 0x003A4E97, 0x00000003, 0x0039EE99, 0x003A4E99, 0x003A4E99, 0x00000003, + 0x0039EE99, 0x003A4E99, 0x003A8E99, 0x00000003, 0x0039EE99, 0x003A4E99, + 0x003A9099, 0x00000003, 0x0039F099, 0x003A4E99, 0x003A4E99, 0x00000003, + 0x0039F099, 0x003A4E99, 0x003A8E99, 0x00000003, + // Block 92, offset 0x1700 + 0x0039F099, 0x003A4E99, 0x003A9099, 0x00000003, 0x0039FC97, 0x00397497, + 0x003A4E97, 0x00000003, 0x0039FC99, 0x00397499, 0x003A4E99, 0x00000003, + 0x0039FC99, 0x003A4E99, 0x003A9099, 0x00000003, 0x003A129A, 0x003A409A, + 0x003AAA9A, 0x00000003, 0x003A1297, 0x003A4E97, 0x00397297, 0x00000003, + 0x003A1299, 0x003A4E99, 0x00397299, 0x00000003, 0x003A1299, 0x003A4E99, + 0x003A4E99, 0x00000003, 0x003A1299, 0x003A4E99, 0x003A9099, 0x00000003, + 0x003A1A97, 0x003A4E97, 0x003A4E97, 0x00000003, 0x003A1A99, 0x003A4E99, + 0x003A4E99, 0x00000003, 0x003A1A99, 0x003A4E99, 0x003A9099, 0x00000002, + 0x003A4099, 0x00391E99, 0x00000002, 0x003A409A, 0x00391E9A, 0x00000002, + 0x003A4099, 0x00392099, 0x00000002, 0x003A409A, 0x0039209A, 0x00000002, + 0x003A4099, 0x00392899, 0x00000002, 0x003A409A, + // Block 93, offset 0x1740 + 0x0039289A, 0x00000003, 0x003A4097, 0x00396497, 0x00396497, 0x00000003, + 0x003A4099, 0x00396499, 0x00396499, 0x00000003, 0x003A4097, 0x00396497, + 0x003A4E97, 0x00000003, 0x003A4099, 0x00396499, 0x003A4E99, 0x00000003, + 0x003A4099, 0x00396499, 0x003A9099, 0x00000003, 0x003A4097, 0x00397297, + 0x003A4E97, 0x00000003, 0x003A4099, 0x00397299, 0x003A4E99, 0x00000003, + 0x003A4099, 0x00397299, 0x003A8E99, 0x00000003, 0x003A4099, 0x00397299, + 0x003A9099, 0x00000003, 0x003A4097, 0x00397497, 0x003A4E97, 0x00000003, + 0x003A4099, 0x00397499, 0x003A4E99, 0x00000003, 0x003A4097, 0x003A4E97, + 0x00397297, 0x00000003, 0x003A4099, 0x003A4E99, 0x00397299, 0x00000003, + 0x003A4099, 0x003A4E99, 0x003A9099, 0x00000002, 0x003A4E84, 0xA0013A04, + 0x00000003, 0x003A4E97, 0x00396497, 0x00397297, + // Block 94, offset 0x1780 + 0x00000003, 0x003A4E97, 0x00396497, 0x00397497, 0x00000003, 0x003A4E97, + 0x00396497, 0x003A4E97, 0x00000003, 0x003A4E99, 0x00396499, 0x003A9099, + 0x00000003, 0x003A4E97, 0x00397297, 0x00396497, 0x00000003, 0x003A4E97, + 0x00397297, 0x003A4E97, 0x00000004, 0x003A4E9A, 0x0039729A, 0x003A4E9A, + 0x0039889A, 0x00000003, 0x003A4E99, 0x00397299, 0x003A9099, 0x00000003, + 0x003A4E97, 0x00397497, 0x00396497, 0x00000003, 0x003A4E97, 0x00397497, + 0x003A4E97, 0x00000003, 0x003A4E99, 0x00397499, 0x003A9099, 0x00000003, + 0x003A4E99, 0x003A4E99, 0x003A9099, 0x00000003, 0x003A5697, 0x00396497, + 0x00397297, 0x00000003, 0x003A5699, 0x00396499, 0x00397299, 0x00000003, + 0x003A5697, 0x00396497, 0x003A4E97, 0x00000003, 0x003A5699, 0x00396499, + 0x003A4E99, 0x00000003, 0x003A5699, 0x00396499, + // Block 95, offset 0x17c0 + 0x003A8E99, 0x00000003, 0x003A5699, 0x00396499, 0x003A9099, 0x00000003, + 0x003A5697, 0x00397297, 0x003A4E97, 0x00000003, 0x003A5699, 0x00397299, + 0x003A8E99, 0x00000003, 0x003A5699, 0x00397299, 0x003A9099, 0x00000003, + 0x003A5699, 0x003A4E99, 0x003A8E99, 0x00000003, 0x003A5699, 0x003A4E99, + 0x003A9099, 0x00000003, 0x003A6897, 0x003A4E97, 0x00396497, 0x00000003, + 0x003A6897, 0x003A4E97, 0x003A4E97, 0x00000002, 0x403A6C20, 0xAE60BE02, + 0x00000002, 0x403A7220, 0xAE60BE02, 0x00000004, 0x003A749A, 0x0039C69A, + 0x003A409A, 0x003A4E9A, 0x00000003, 0x003A9099, 0x00396499, 0x003A9099, + 0x00000003, 0x003A9099, 0x00397299, 0x003A9099, 0x00000003, 0x003A9097, + 0x003A4E97, 0x003A4E97, 0x00000003, 0x003A9099, 0x003A4E99, 0x003A4E99, + 0x00000003, 0x003A9099, 0x003A4E99, 0x003A9099, + // Block 96, offset 0x1800 + 0x00000002, 0x403AAA20, 0xAE60BE02, 0x00000002, 0x003AB284, 0xA0013C04, + 0x00000002, 0x003AB484, 0xA0013A04, 0x00000002, 0x003AB484, 0xA0013C04, + 0x00000002, 0x003AB884, 0xA0013C04, 0x00000002, 0x003AC484, 0xA0013A04, + 0x00000002, 0x003AD884, 0xA0013A04, 0x00000002, 0x003B9484, 0xA0013904, + 0x00000002, 0x003B9684, 0xA0013904, 0x00000002, 0x003B9A84, 0xA0013904, + 0x00000002, 0x403FEC20, 0xA070F102, 0x00000002, 0x403FEE20, 0xA070F102, + 0x00000002, 0x403FF020, 0xA070F102, 0x00000002, 0x403FFC20, 0xA070F102, + 0x00000002, 0x40400A20, 0xA070F102, 0x00000002, 0x40400E20, 0xA070F102, + 0x00000002, 0x40401A20, 0xA070F102, 0x00000002, 0x40401E20, 0xA070F102, + 0x00000002, 0x40402820, 0xA070F102, 0x00000002, 0x40402C20, 0xA070F102, + 0x00000002, 0x40403020, 0xA070F102, 0x00000002, + // Block 97, offset 0x1840 + 0x4040B020, 0xA070F102, 0x00000002, 0x4040B220, 0xA070F102, 0x00000002, + 0x0040B684, 0x0040F884, 0x00000002, 0x4040CA20, 0xA070F102, 0x00000002, + 0x40411620, 0xA070F102, 0x00000002, 0x40411E20, 0xA070F102, 0x00000002, + 0x40412020, 0xA070F102, 0x00000002, 0x40412A20, 0xA070F102, 0x00000002, + 0x40414620, 0xA070F102, 0x00000002, 0x40415420, 0xA070F102, 0x00000002, + 0x40422A20, 0xA070F102, 0x00000002, 0x40422C20, 0xA070F102, 0x00000002, + 0x00442284, 0x00449084, 0x00000002, 0x00443E84, 0x00449084, 0x00000002, + 0x00444884, 0x00449084, 0x00000002, 0x00445884, 0x00449084, 0x00000002, + 0x00445884, 0x00449084, 0x00000002, 0x00445A84, 0x00449084, 0x00000002, + 0x00446684, 0x00449084, 0x00000002, 0x4046AA20, 0xA070F102, 0x00000002, + 0x4046AC20, 0xA070F102, 0x00000002, 0x4046BE20, + // Block 98, offset 0x1880 + 0xA070F102, 0x00000002, 0x40491020, 0x40498420, 0x00000002, 0x40491020, + 0x40498620, 0x00000002, 0x40491020, 0x40498820, 0x00000002, 0x40491020, + 0x40498A20, 0x00000002, 0x40491020, 0x40498C20, 0x00000002, 0x40491220, + 0x40498420, 0x00000002, 0x40491220, 0x40498620, 0x00000002, 0x40491220, + 0x40498820, 0x00000002, 0x40491220, 0x40498A20, 0x00000002, 0x40491220, + 0x40498C20, 0x00000002, 0x40491420, 0x40498420, 0x00000002, 0x40491420, + 0x40498620, 0x00000002, 0x40491420, 0x40498820, 0x00000002, 0x40491420, + 0x40498A20, 0x00000002, 0x40491420, 0x40498C20, 0x00000002, 0x40491620, + 0x40498420, 0x00000002, 0x40491620, 0x40498620, 0x00000002, 0x40491620, + 0x40498820, 0x00000002, 0x40491620, 0x40498A20, 0x00000002, 0x40491620, + 0x40498C20, 0x00000002, 0x40491820, 0x40498420, + // Block 99, offset 0x18c0 + 0x00000002, 0x40491820, 0x40498620, 0x00000002, 0x40491820, 0x40498820, + 0x00000002, 0x40491820, 0x40498A20, 0x00000002, 0x40491820, 0x40498C20, + 0x00000002, 0x40491A20, 0x40498420, 0x00000002, 0x40491A20, 0x40498620, + 0x00000002, 0x40491A20, 0x40498820, 0x00000002, 0x40491A20, 0x40498A20, + 0x00000002, 0x40491A20, 0x40498C20, 0x00000002, 0x40491C20, 0x40498420, + 0x00000002, 0x40491C20, 0x40498620, 0x00000002, 0x40491C20, 0x40498820, + 0x00000002, 0x40491C20, 0x40498A20, 0x00000002, 0x40491C20, 0x40498C20, + 0x00000002, 0x40491E20, 0x40498420, 0x00000002, 0x40491E20, 0x40498620, + 0x00000002, 0x40491E20, 0x40498820, 0x00000002, 0x40491E20, 0x40498A20, + 0x00000002, 0x40491E20, 0x40498C20, 0x00000002, 0x40492020, 0x40498420, + 0x00000002, 0x40492020, 0x40498620, 0x00000002, + // Block 100, offset 0x1900 + 0x40492020, 0x40498820, 0x00000002, 0x40492020, 0x40498A20, 0x00000002, + 0x40492020, 0x40498C20, 0x00000002, 0x40492220, 0x40498420, 0x00000002, + 0x40492220, 0x40498620, 0x00000002, 0x40492220, 0x40498820, 0x00000002, + 0x40492220, 0x40498A20, 0x00000002, 0x40492220, 0x40498C20, 0x00000002, + 0x40492420, 0x40498420, 0x00000002, 0x40492420, 0x40498620, 0x00000002, + 0x40492420, 0x40498820, 0x00000002, 0x40492420, 0x40498A20, 0x00000002, + 0x40492420, 0x40498C20, 0x00000002, 0x40492620, 0x40498420, 0x00000002, + 0x40492620, 0x40498620, 0x00000002, 0x40492620, 0x40498820, 0x00000002, + 0x40492620, 0x40498A20, 0x00000002, 0x40492620, 0x40498C20, 0x00000002, + 0x40492820, 0x40498420, 0x00000002, 0x40492820, 0x40498620, 0x00000002, + 0x40492820, 0x40498820, 0x00000002, 0x40492820, + // Block 101, offset 0x1940 + 0x40498A20, 0x00000002, 0x40492820, 0x40498C20, 0x00000002, 0x40492A20, + 0x40498420, 0x00000002, 0x40492A20, 0x40498620, 0x00000002, 0x40492A20, + 0x40498820, 0x00000002, 0x40492A20, 0x40498A20, 0x00000002, 0x40492A20, + 0x40498C20, 0x00000002, 0x40492C20, 0x40498420, 0x00000002, 0x40492C20, + 0x40498620, 0x00000002, 0x40492C20, 0x40498820, 0x00000002, 0x40492C20, + 0x40498A20, 0x00000002, 0x40492C20, 0x40498C20, 0x00000002, 0x40492E20, + 0x40498420, 0x00000002, 0x40492E20, 0x40498620, 0x00000002, 0x40492E20, + 0x40498820, 0x00000002, 0x40492E20, 0x40498A20, 0x00000002, 0x40492E20, + 0x40498C20, 0x00000002, 0x40493020, 0x40498420, 0x00000002, 0x40493020, + 0x40498620, 0x00000002, 0x40493020, 0x40498820, 0x00000002, 0x40493020, + 0x40498A20, 0x00000002, 0x40493020, 0x40498C20, + // Block 102, offset 0x1980 + 0x00000002, 0x40493220, 0x40498420, 0x00000002, 0x40493220, 0x40498620, + 0x00000002, 0x40493220, 0x40498820, 0x00000002, 0x40493220, 0x40498A20, + 0x00000002, 0x40493220, 0x40498C20, 0x00000002, 0x40493420, 0x40498420, + 0x00000002, 0x40493420, 0x40498620, 0x00000002, 0x40493420, 0x40498820, + 0x00000002, 0x40493420, 0x40498A20, 0x00000002, 0x40493420, 0x40498C20, + 0x00000002, 0x40493620, 0x40498420, 0x00000002, 0x40493620, 0x40498620, + 0x00000002, 0x40493620, 0x40498820, 0x00000002, 0x40493620, 0x40498A20, + 0x00000002, 0x40493620, 0x40498C20, 0x00000002, 0x40493820, 0x40498420, + 0x00000002, 0x40493820, 0x40498620, 0x00000002, 0x40493820, 0x40498820, + 0x00000002, 0x40493820, 0x40498A20, 0x00000002, 0x40493820, 0x40498C20, + 0x00000002, 0x40493A20, 0x40498420, 0x00000002, + // Block 103, offset 0x19c0 + 0x40493A20, 0x40498620, 0x00000002, 0x40493A20, 0x40498820, 0x00000002, + 0x40493A20, 0x40498A20, 0x00000002, 0x40493A20, 0x40498C20, 0x00000002, + 0x40493C20, 0x40498420, 0x00000002, 0x40493C20, 0x40498620, 0x00000002, + 0x40493C20, 0x40498820, 0x00000002, 0x40493C20, 0x40498A20, 0x00000002, + 0x40493C20, 0x40498C20, 0x00000002, 0x40493E20, 0x40498420, 0x00000002, + 0x40493E20, 0x40498620, 0x00000002, 0x40493E20, 0x40498820, 0x00000002, + 0x40493E20, 0x40498A20, 0x00000002, 0x40493E20, 0x40498C20, 0x00000002, + 0x40494020, 0x40498420, 0x00000002, 0x40494020, 0x40498620, 0x00000002, + 0x40494020, 0x40498820, 0x00000002, 0x40494020, 0x40498A20, 0x00000002, + 0x40494020, 0x40498C20, 0x00000002, 0x40494220, 0x40498420, 0x00000002, + 0x40494220, 0x40498620, 0x00000002, 0x40494220, + // Block 104, offset 0x1a00 + 0x40498820, 0x00000002, 0x40494220, 0x40498A20, 0x00000002, 0x40494220, + 0x40498C20, 0x00000002, 0x40494420, 0x40498420, 0x00000002, 0x40494420, + 0x40498620, 0x00000002, 0x40494420, 0x40498820, 0x00000002, 0x40494420, + 0x40498A20, 0x00000002, 0x40494420, 0x40498C20, 0x00000002, 0x40494620, + 0x40498420, 0x00000002, 0x40494620, 0x40498620, 0x00000002, 0x40494620, + 0x40498820, 0x00000002, 0x40494620, 0x40498A20, 0x00000002, 0x40494620, + 0x40498C20, 0x00000002, 0x40494820, 0x40498420, 0x00000002, 0x40494820, + 0x40498620, 0x00000002, 0x40494820, 0x40498820, 0x00000002, 0x40494820, + 0x40498A20, 0x00000002, 0x40494820, 0x40498C20, 0x00000002, 0x40494A20, + 0x40498420, 0x00000002, 0x40494A20, 0x40498620, 0x00000002, 0x40494A20, + 0x40498820, 0x00000002, 0x40494A20, 0x40498A20, + // Block 105, offset 0x1a40 + 0x00000002, 0x40494A20, 0x40498C20, 0x00000002, 0x40494C20, 0x40498420, + 0x00000002, 0x40494C20, 0x40498620, 0x00000002, 0x40494C20, 0x40498820, + 0x00000002, 0x40494C20, 0x40498A20, 0x00000002, 0x40494C20, 0x40498C20, + 0x00000002, 0x40494E20, 0x40498420, 0x00000002, 0x40494E20, 0x40498620, + 0x00000002, 0x40494E20, 0x40498820, 0x00000002, 0x40494E20, 0x40498A20, + 0x00000002, 0x40494E20, 0x40498C20, 0x00000002, 0x40495020, 0x40498420, + 0x00000002, 0x40495020, 0x40498620, 0x00000002, 0x40495020, 0x40498820, + 0x00000002, 0x40495020, 0x40498A20, 0x00000002, 0x40495020, 0x40498C20, + 0x00000002, 0x40495220, 0x40498420, 0x00000002, 0x40495220, 0x40498620, + 0x00000002, 0x40495220, 0x40498820, 0x00000002, 0x40495220, 0x40498A20, + 0x00000002, 0x40495220, 0x40498C20, 0x00000002, + // Block 106, offset 0x1a80 + 0x40495420, 0x40498420, 0x00000002, 0x40495420, 0x40498620, 0x00000002, + 0x40495420, 0x40498820, 0x00000002, 0x40495420, 0x40498A20, 0x00000002, + 0x40495420, 0x40498C20, 0x00000002, 0x40495620, 0x40498420, 0x00000002, + 0x40495620, 0x40498620, 0x00000002, 0x40495620, 0x40498820, 0x00000002, + 0x40495620, 0x40498A20, 0x00000002, 0x40495620, 0x40498C20, 0x00000002, + 0x40495820, 0x40498420, 0x00000002, 0x40495820, 0x40498620, 0x00000002, + 0x40495820, 0x40498820, 0x00000002, 0x40495820, 0x40498A20, 0x00000002, + 0x40495820, 0x40498C20, 0x00000002, 0x40495A20, 0x40498420, 0x00000002, + 0x40495A20, 0x40498620, 0x00000002, 0x40495A20, 0x40498820, 0x00000002, + 0x40495A20, 0x40498A20, 0x00000002, 0x40495A20, 0x40498C20, 0x00000002, + 0x40495C20, 0x40498420, 0x00000002, 0x40495C20, + // Block 107, offset 0x1ac0 + 0x40498620, 0x00000002, 0x40495C20, 0x40498820, 0x00000002, 0x40495C20, + 0x40498A20, 0x00000002, 0x40495C20, 0x40498C20, 0x00000002, 0x40495E20, + 0x40498420, 0x00000002, 0x40495E20, 0x40498620, 0x00000002, 0x40495E20, + 0x40498820, 0x00000002, 0x40495E20, 0x40498A20, 0x00000002, 0x40495E20, + 0x40498C20, 0x00000002, 0x40496020, 0x40498420, 0x00000002, 0x40496020, + 0x40498620, 0x00000002, 0x40496020, 0x40498820, 0x00000002, 0x40496020, + 0x40498A20, 0x00000002, 0x40496020, 0x40498C20, 0x00000002, 0x40496220, + 0x40498420, 0x00000002, 0x40496220, 0x40498620, 0x00000002, 0x40496220, + 0x40498820, 0x00000002, 0x40496220, 0x40498A20, 0x00000002, 0x40496220, + 0x40498C20, 0x00000002, 0x40496420, 0x40498420, 0x00000002, 0x40496420, + 0x40498620, 0x00000002, 0x40496420, 0x40498820, + // Block 108, offset 0x1b00 + 0x00000002, 0x40496420, 0x40498A20, 0x00000002, 0x40496420, 0x40498C20, + 0x00000002, 0x40496620, 0x40498420, 0x00000002, 0x40496620, 0x40498620, + 0x00000002, 0x40496620, 0x40498820, 0x00000002, 0x40496620, 0x40498A20, + 0x00000002, 0x40496620, 0x40498C20, 0x00000002, 0x40496820, 0x40498420, + 0x00000002, 0x40496820, 0x40498620, 0x00000002, 0x40496820, 0x40498820, + 0x00000002, 0x40496820, 0x40498A20, 0x00000002, 0x40496820, 0x40498C20, + 0x00000002, 0x40496A20, 0x40498420, 0x00000002, 0x40496A20, 0x40498620, + 0x00000002, 0x40496A20, 0x40498820, 0x00000002, 0x40496A20, 0x40498A20, + 0x00000002, 0x40496A20, 0x40498C20, 0x00000002, 0x40499020, 0x4049E620, + 0x00000002, 0x40499020, 0x4049E820, 0x00000002, 0x40499020, 0x4049EA20, + 0x00000002, 0x40499020, 0x4049EC20, 0x00000002, + // Block 109, offset 0x1b40 + 0x40499020, 0x4049EE20, 0x00000002, 0x40499220, 0x4049E620, 0x00000002, + 0x40499220, 0x4049E820, 0x00000002, 0x40499220, 0x4049EA20, 0x00000002, + 0x40499220, 0x4049EC20, 0x00000002, 0x40499220, 0x4049EE20, 0x00000002, + 0x40499420, 0x4049E620, 0x00000002, 0x40499420, 0x4049E820, 0x00000002, + 0x40499420, 0x4049EA20, 0x00000002, 0x40499420, 0x4049EC20, 0x00000002, + 0x40499420, 0x4049EE20, 0x00000002, 0x40499620, 0x4049E620, 0x00000002, + 0x40499620, 0x4049E820, 0x00000002, 0x40499620, 0x4049EA20, 0x00000002, + 0x40499620, 0x4049EC20, 0x00000002, 0x40499620, 0x4049EE20, 0x00000002, + 0x40499820, 0x4049E620, 0x00000002, 0x40499820, 0x4049E820, 0x00000002, + 0x40499820, 0x4049EA20, 0x00000002, 0x40499820, 0x4049EC20, 0x00000002, + 0x40499820, 0x4049EE20, 0x00000002, 0x40499A20, + // Block 110, offset 0x1b80 + 0x4049E620, 0x00000002, 0x40499A20, 0x4049E820, 0x00000002, 0x40499A20, + 0x4049EA20, 0x00000002, 0x40499A20, 0x4049EC20, 0x00000002, 0x40499A20, + 0x4049EE20, 0x00000002, 0x40499C20, 0x4049E620, 0x00000002, 0x40499C20, + 0x4049E820, 0x00000002, 0x40499C20, 0x4049EA20, 0x00000002, 0x40499C20, + 0x4049EC20, 0x00000002, 0x40499C20, 0x4049EE20, 0x00000002, 0x40499E20, + 0x4049E620, 0x00000002, 0x40499E20, 0x4049E820, 0x00000002, 0x40499E20, + 0x4049EA20, 0x00000002, 0x40499E20, 0x4049EC20, 0x00000002, 0x40499E20, + 0x4049EE20, 0x00000002, 0x4049A020, 0x4049E620, 0x00000002, 0x4049A020, + 0x4049E820, 0x00000002, 0x4049A020, 0x4049EA20, 0x00000002, 0x4049A020, + 0x4049EC20, 0x00000002, 0x4049A020, 0x4049EE20, 0x00000002, 0x4049A220, + 0x4049E620, 0x00000002, 0x4049A220, 0x4049E820, + // Block 111, offset 0x1bc0 + 0x00000002, 0x4049A220, 0x4049EA20, 0x00000002, 0x4049A220, 0x4049EC20, + 0x00000002, 0x4049A220, 0x4049EE20, 0x00000002, 0x4049A420, 0x4049E620, + 0x00000002, 0x4049A420, 0x4049E820, 0x00000002, 0x4049A420, 0x4049EA20, + 0x00000002, 0x4049A420, 0x4049EC20, 0x00000002, 0x4049A420, 0x4049EE20, + 0x00000002, 0x4049A620, 0x4049E620, 0x00000002, 0x4049A620, 0x4049E820, + 0x00000002, 0x4049A620, 0x4049EA20, 0x00000002, 0x4049A620, 0x4049EC20, + 0x00000002, 0x4049A620, 0x4049EE20, 0x00000002, 0x4049A820, 0x4049E620, + 0x00000002, 0x4049A820, 0x4049E820, 0x00000002, 0x4049A820, 0x4049EA20, + 0x00000002, 0x4049A820, 0x4049EC20, 0x00000002, 0x4049A820, 0x4049EE20, + 0x00000002, 0x4049AA20, 0x4049E620, 0x00000002, 0x4049AA20, 0x4049E820, + 0x00000002, 0x4049AA20, 0x4049EA20, 0x00000002, + // Block 112, offset 0x1c00 + 0x4049AA20, 0x4049EC20, 0x00000002, 0x4049AA20, 0x4049EE20, 0x00000002, + 0x4049AC20, 0x4049E620, 0x00000002, 0x4049AC20, 0x4049E820, 0x00000002, + 0x4049AC20, 0x4049EA20, 0x00000002, 0x4049AC20, 0x4049EC20, 0x00000002, + 0x4049AC20, 0x4049EE20, 0x00000002, 0x4049AE20, 0x4049E620, 0x00000002, + 0x4049AE20, 0x4049E820, 0x00000002, 0x4049AE20, 0x4049EA20, 0x00000002, + 0x4049AE20, 0x4049EC20, 0x00000002, 0x4049AE20, 0x4049EE20, 0x00000002, + 0x4049B020, 0x4049E620, 0x00000002, 0x4049B020, 0x4049E820, 0x00000002, + 0x4049B020, 0x4049EA20, 0x00000002, 0x4049B020, 0x4049EC20, 0x00000002, + 0x4049B020, 0x4049EE20, 0x00000002, 0x4049B220, 0x4049E620, 0x00000002, + 0x4049B220, 0x4049E820, 0x00000002, 0x4049B220, 0x4049EA20, 0x00000002, + 0x4049B220, 0x4049EC20, 0x00000002, 0x4049B220, + // Block 113, offset 0x1c40 + 0x4049EE20, 0x00000002, 0x4049B420, 0x4049E620, 0x00000002, 0x4049B420, + 0x4049E820, 0x00000002, 0x4049B420, 0x4049EA20, 0x00000002, 0x4049B420, + 0x4049EC20, 0x00000002, 0x4049B420, 0x4049EE20, 0x00000002, 0x4049B620, + 0x4049E620, 0x00000002, 0x4049B620, 0x4049E820, 0x00000002, 0x4049B620, + 0x4049EA20, 0x00000002, 0x4049B620, 0x4049EC20, 0x00000002, 0x4049B620, + 0x4049EE20, 0x00000002, 0x4049B820, 0x4049E620, 0x00000002, 0x4049B820, + 0x4049E820, 0x00000002, 0x4049B820, 0x4049EA20, 0x00000002, 0x4049B820, + 0x4049EC20, 0x00000002, 0x4049B820, 0x4049EE20, 0x00000002, 0x4049BA20, + 0x4049E620, 0x00000002, 0x4049BA20, 0x4049E820, 0x00000002, 0x4049BA20, + 0x4049EA20, 0x00000002, 0x4049BA20, 0x4049EC20, 0x00000002, 0x4049BA20, + 0x4049EE20, 0x00000002, 0x4049BC20, 0x4049E620, + // Block 114, offset 0x1c80 + 0x00000002, 0x4049BC20, 0x4049E820, 0x00000002, 0x4049BC20, 0x4049EA20, + 0x00000002, 0x4049BC20, 0x4049EC20, 0x00000002, 0x4049BC20, 0x4049EE20, + 0x00000002, 0x4049BE20, 0x4049E620, 0x00000002, 0x4049BE20, 0x4049E820, + 0x00000002, 0x4049BE20, 0x4049EA20, 0x00000002, 0x4049BE20, 0x4049EC20, + 0x00000002, 0x4049BE20, 0x4049EE20, 0x00000002, 0x4049C020, 0x4049E620, + 0x00000002, 0x4049C020, 0x4049E820, 0x00000002, 0x4049C020, 0x4049EA20, + 0x00000002, 0x4049C020, 0x4049EC20, 0x00000002, 0x4049C020, 0x4049EE20, + 0x00000002, 0x4049C220, 0x4049E620, 0x00000002, 0x4049C220, 0x4049E820, + 0x00000002, 0x4049C220, 0x4049EA20, 0x00000002, 0x4049C220, 0x4049EC20, + 0x00000002, 0x4049C220, 0x4049EE20, 0x00000003, 0x0049C484, 0x0049AC84, + 0x4049E620, 0x00000003, 0x0049C484, 0x0049AC84, + // Block 115, offset 0x1cc0 + 0x4049E820, 0x00000003, 0x0049C484, 0x0049AC84, 0x4049EA20, 0x00000003, + 0x0049C484, 0x0049AC84, 0x4049EC20, 0x00000003, 0x0049C484, 0x0049AC84, + 0x4049EE20, 0x00000003, 0x0049C484, 0x0049BA84, 0x4049E620, 0x00000003, + 0x0049C484, 0x0049BA84, 0x4049E820, 0x00000003, 0x0049C484, 0x0049BA84, + 0x4049EA20, 0x00000003, 0x0049C484, 0x0049BA84, 0x4049EC20, 0x00000003, + 0x0049C484, 0x0049BA84, 0x4049EE20, 0x00000002, 0x4049C420, 0x4049E620, + 0x00000002, 0x4049C420, 0x4049E820, 0x00000002, 0x4049C420, 0x4049EA20, + 0x00000002, 0x4049C420, 0x4049EC20, 0x00000002, 0x4049C420, 0x4049EE20, + 0x00000002, 0x4049C620, 0x4049E620, 0x00000002, 0x4049C620, 0x4049E820, + 0x00000002, 0x4049C620, 0x4049EA20, 0x00000002, 0x4049C620, 0x4049EC20, + 0x00000002, 0x4049C620, 0x4049EE20, 0x00000002, + // Block 116, offset 0x1d00 + 0x4049C820, 0x4049E620, 0x00000002, 0x4049C820, 0x4049E820, 0x00000002, + 0x4049C820, 0x4049EA20, 0x00000002, 0x4049C820, 0x4049EC20, 0x00000002, + 0x4049C820, 0x4049EE20, 0x00000002, 0x4049F020, 0x404A5A20, 0x00000002, + 0x4049F020, 0x404A5C20, 0x00000002, 0x4049F020, 0x404A6220, 0x00000002, + 0x4049F020, 0x404A6620, 0x00000002, 0x4049F020, 0x404A6820, 0x00000002, + 0x4049F220, 0x404A5A20, 0x00000002, 0x4049F220, 0x404A5C20, 0x00000002, + 0x4049F220, 0x404A6220, 0x00000002, 0x4049F220, 0x404A6620, 0x00000002, + 0x4049F220, 0x404A6820, 0x00000002, 0x4049F420, 0x404A5A20, 0x00000002, + 0x4049F420, 0x404A5C20, 0x00000002, 0x4049F420, 0x404A6220, 0x00000002, + 0x4049F420, 0x404A6620, 0x00000002, 0x4049F420, 0x404A6820, 0x00000002, + 0x4049F620, 0x404A5A20, 0x00000002, 0x4049F620, + // Block 117, offset 0x1d40 + 0x404A5C20, 0x00000002, 0x4049F620, 0x404A6220, 0x00000002, 0x4049F620, + 0x404A6620, 0x00000002, 0x4049F620, 0x404A6820, 0x00000002, 0x4049F820, + 0x404A5A20, 0x00000002, 0x4049F820, 0x404A5C20, 0x00000002, 0x4049F820, + 0x404A6220, 0x00000002, 0x4049F820, 0x404A6620, 0x00000002, 0x4049F820, + 0x404A6820, 0x00000002, 0x4049FA20, 0x404A5A20, 0x00000002, 0x4049FA20, + 0x404A5C20, 0x00000002, 0x4049FA20, 0x404A6220, 0x00000002, 0x4049FA20, + 0x404A6620, 0x00000002, 0x4049FA20, 0x404A6820, 0x00000002, 0x4049FC20, + 0x404A5A20, 0x00000002, 0x4049FC20, 0x404A5C20, 0x00000002, 0x4049FC20, + 0x404A6220, 0x00000002, 0x4049FC20, 0x404A6620, 0x00000002, 0x4049FC20, + 0x404A6820, 0x00000002, 0x4049FE20, 0x404A5A20, 0x00000002, 0x4049FE20, + 0x404A5C20, 0x00000002, 0x4049FE20, 0x404A6220, + // Block 118, offset 0x1d80 + 0x00000002, 0x4049FE20, 0x404A6620, 0x00000002, 0x4049FE20, 0x404A6820, + 0x00000002, 0x404A0020, 0x404A5A20, 0x00000002, 0x404A0020, 0x404A5C20, + 0x00000002, 0x404A0020, 0x404A6220, 0x00000002, 0x404A0020, 0x404A6620, + 0x00000002, 0x404A0020, 0x404A6820, 0x00000002, 0x404A0220, 0x404A5A20, + 0x00000002, 0x404A0220, 0x404A5C20, 0x00000002, 0x404A0220, 0x404A6220, + 0x00000002, 0x404A0220, 0x404A6620, 0x00000002, 0x404A0220, 0x404A6820, + 0x00000002, 0x404A0420, 0x404A5A20, 0x00000002, 0x404A0420, 0x404A5C20, + 0x00000002, 0x404A0420, 0x404A6220, 0x00000002, 0x404A0420, 0x404A6620, + 0x00000002, 0x404A0420, 0x404A6820, 0x00000002, 0x404A0620, 0x404A5A20, + 0x00000002, 0x404A0620, 0x404A5C20, 0x00000002, 0x404A0620, 0x404A6220, + 0x00000002, 0x404A0620, 0x404A6620, 0x00000002, + // Block 119, offset 0x1dc0 + 0x404A0620, 0x404A6820, 0x00000002, 0x404A0820, 0x404A5A20, 0x00000002, + 0x404A0820, 0x404A5C20, 0x00000002, 0x404A0820, 0x404A6220, 0x00000002, + 0x404A0820, 0x404A6620, 0x00000002, 0x404A0820, 0x404A6820, 0x00000002, + 0x404A0A20, 0x404A5A20, 0x00000002, 0x404A0A20, 0x404A5C20, 0x00000002, + 0x404A0A20, 0x404A6220, 0x00000002, 0x404A0A20, 0x404A6620, 0x00000002, + 0x404A0A20, 0x404A6820, 0x00000002, 0x404A0C20, 0x404A5A20, 0x00000002, + 0x404A0C20, 0x404A5C20, 0x00000002, 0x404A0C20, 0x404A6220, 0x00000002, + 0x404A0C20, 0x404A6620, 0x00000002, 0x404A0C20, 0x404A6820, 0x00000002, + 0x404A0E20, 0x404A5A20, 0x00000002, 0x404A0E20, 0x404A5C20, 0x00000002, + 0x404A0E20, 0x404A6220, 0x00000002, 0x404A0E20, 0x404A6620, 0x00000002, + 0x404A0E20, 0x404A6820, 0x00000002, 0x404A1020, + // Block 120, offset 0x1e00 + 0x404A5A20, 0x00000002, 0x404A1020, 0x404A5C20, 0x00000002, 0x404A1020, + 0x404A6220, 0x00000002, 0x404A1020, 0x404A6620, 0x00000002, 0x404A1020, + 0x404A6820, 0x00000002, 0x404A1220, 0x404A5A20, 0x00000002, 0x404A1220, + 0x404A5C20, 0x00000002, 0x404A1220, 0x404A6220, 0x00000002, 0x404A1220, + 0x404A6620, 0x00000002, 0x404A1220, 0x404A6820, 0x00000002, 0x404A1420, + 0x404A5A20, 0x00000002, 0x404A1420, 0x404A5C20, 0x00000002, 0x404A1420, + 0x404A6220, 0x00000002, 0x404A1420, 0x404A6620, 0x00000002, 0x404A1420, + 0x404A6820, 0x00000002, 0x404A1620, 0x404A5A20, 0x00000002, 0x404A1620, + 0x404A5C20, 0x00000002, 0x404A1620, 0x404A6220, 0x00000002, 0x404A1620, + 0x404A6620, 0x00000002, 0x404A1620, 0x404A6820, 0x00000002, 0x404A1820, + 0x404A5A20, 0x00000002, 0x404A1820, 0x404A5C20, + // Block 121, offset 0x1e40 + 0x00000002, 0x404A1820, 0x404A6220, 0x00000002, 0x404A1820, 0x404A6620, + 0x00000002, 0x404A1820, 0x404A6820, 0x00000002, 0x404A1A20, 0x404A5A20, + 0x00000002, 0x404A1A20, 0x404A5C20, 0x00000002, 0x404A1A20, 0x404A6220, + 0x00000002, 0x404A1A20, 0x404A6620, 0x00000002, 0x404A1A20, 0x404A6820, + 0x00000002, 0x404A1C20, 0x404A5A20, 0x00000002, 0x404A1C20, 0x404A5C20, + 0x00000002, 0x404A1C20, 0x404A6220, 0x00000002, 0x404A1C20, 0x404A6620, + 0x00000002, 0x404A1C20, 0x404A6820, 0x00000002, 0x404A1E20, 0x404A5A20, + 0x00000002, 0x404A1E20, 0x404A5C20, 0x00000002, 0x404A1E20, 0x404A6220, + 0x00000002, 0x404A1E20, 0x404A6620, 0x00000002, 0x404A1E20, 0x404A6820, + 0x00000002, 0x404A2020, 0x404A5A20, 0x00000002, 0x404A2020, 0x404A5C20, + 0x00000002, 0x404A2020, 0x404A6220, 0x00000002, + // Block 122, offset 0x1e80 + 0x404A2020, 0x404A6620, 0x00000002, 0x404A2020, 0x404A6820, 0x00000002, + 0x404A2220, 0x404A5A20, 0x00000002, 0x404A2220, 0x404A5C20, 0x00000002, + 0x404A2220, 0x404A6220, 0x00000002, 0x404A2220, 0x404A6620, 0x00000002, + 0x404A2220, 0x404A6820, 0x00000002, 0x404A2420, 0x404A5A20, 0x00000002, + 0x404A2420, 0x404A5C20, 0x00000002, 0x404A2420, 0x404A6220, 0x00000002, + 0x404A2420, 0x404A6620, 0x00000002, 0x404A2420, 0x404A6820, 0x00000002, + 0x404A2620, 0x404A5A20, 0x00000002, 0x404A2620, 0x404A5C20, 0x00000002, + 0x404A2620, 0x404A6220, 0x00000002, 0x404A2620, 0x404A6620, 0x00000002, + 0x404A2620, 0x404A6820, 0x00000002, 0x404A2820, 0x404A5A20, 0x00000002, + 0x404A2820, 0x404A5C20, 0x00000002, 0x404A2820, 0x404A6220, 0x00000002, + 0x404A2820, 0x404A6620, 0x00000002, 0x404A2820, + // Block 123, offset 0x1ec0 + 0x404A6820, 0x00000002, 0x404A2A20, 0x404A5A20, 0x00000002, 0x404A2A20, + 0x404A5C20, 0x00000002, 0x404A2A20, 0x404A6220, 0x00000002, 0x404A2A20, + 0x404A6620, 0x00000002, 0x404A2A20, 0x404A6820, 0x00000002, 0x404A2C20, + 0x404A5A20, 0x00000002, 0x404A2C20, 0x404A5C20, 0x00000002, 0x404A2C20, + 0x404A6220, 0x00000002, 0x404A2C20, 0x404A6620, 0x00000002, 0x404A2C20, + 0x404A6820, 0x00000002, 0x404A2E20, 0x404A5A20, 0x00000002, 0x404A2E20, + 0x404A5C20, 0x00000002, 0x404A2E20, 0x404A6220, 0x00000002, 0x404A2E20, + 0x404A6620, 0x00000002, 0x404A2E20, 0x404A6820, 0x00000002, 0x404A3020, + 0x404A5A20, 0x00000002, 0x404A3020, 0x404A5C20, 0x00000002, 0x404A3020, + 0x404A6220, 0x00000002, 0x404A3020, 0x404A6620, 0x00000002, 0x404A3020, + 0x404A6820, 0x00000002, 0x404A3220, 0x404A5A20, + // Block 124, offset 0x1f00 + 0x00000002, 0x404A3220, 0x404A5C20, 0x00000002, 0x404A3220, 0x404A6220, + 0x00000002, 0x404A3220, 0x404A6620, 0x00000002, 0x404A3220, 0x404A6820, + 0x00000002, 0x404A3420, 0x404A5A20, 0x00000002, 0x404A3420, 0x404A5C20, + 0x00000002, 0x404A3420, 0x404A6220, 0x00000002, 0x404A3420, 0x404A6620, + 0x00000002, 0x404A3420, 0x404A6820, 0x00000002, 0x404A3620, 0x404A5A20, + 0x00000002, 0x404A3620, 0x404A5C20, 0x00000002, 0x404A3620, 0x404A6220, + 0x00000002, 0x404A3620, 0x404A6620, 0x00000002, 0x404A3620, 0x404A6820, + 0x00000002, 0x404A3820, 0x404A5A20, 0x00000002, 0x404A3820, 0x404A5C20, + 0x00000002, 0x404A3820, 0x404A6220, 0x00000002, 0x404A3820, 0x404A6620, + 0x00000002, 0x404A3820, 0x404A6820, 0x00000002, 0x404A3A20, 0x404A5A20, + 0x00000002, 0x404A3A20, 0x404A5C20, 0x00000002, + // Block 125, offset 0x1f40 + 0x404A3A20, 0x404A6220, 0x00000002, 0x404A3A20, 0x404A6620, 0x00000002, + 0x404A3A20, 0x404A6820, 0x00000002, 0x404A3C20, 0x404A5A20, 0x00000002, + 0x404A3C20, 0x404A5C20, 0x00000002, 0x404A3C20, 0x404A6220, 0x00000002, + 0x404A3C20, 0x404A6620, 0x00000002, 0x404A3C20, 0x404A6820, 0x00000002, + 0x404A3E20, 0x404A5A20, 0x00000002, 0x404A3E20, 0x404A5C20, 0x00000002, + 0x404A3E20, 0x404A6220, 0x00000002, 0x404A3E20, 0x404A6620, 0x00000002, + 0x404A3E20, 0x404A6820, 0x00000002, 0x404A4020, 0x404A5A20, 0x00000002, + 0x404A4020, 0x404A5C20, 0x00000002, 0x404A4020, 0x404A6220, 0x00000002, + 0x404A4020, 0x404A6620, 0x00000002, 0x404A4020, 0x404A6820, 0x00000002, + 0x404A4220, 0x404A5A20, 0x00000002, 0x404A4220, 0x404A5C20, 0x00000002, + 0x404A4220, 0x404A6220, 0x00000002, 0x404A4220, + // Block 126, offset 0x1f80 + 0x404A6620, 0x00000002, 0x404A4220, 0x404A6820, 0x00000002, 0x404A4420, + 0x404A5A20, 0x00000002, 0x404A4420, 0x404A5C20, 0x00000002, 0x404A4420, + 0x404A6220, 0x00000002, 0x404A4420, 0x404A6620, 0x00000002, 0x404A4420, + 0x404A6820, 0x00000002, 0x404A4620, 0x404A5A20, 0x00000002, 0x404A4620, + 0x404A5C20, 0x00000002, 0x404A4620, 0x404A6220, 0x00000002, 0x404A4620, + 0x404A6620, 0x00000002, 0x404A4620, 0x404A6820, 0x00000002, 0x404A4820, + 0x404A5A20, 0x00000002, 0x404A4820, 0x404A5C20, 0x00000002, 0x404A4820, + 0x404A6220, 0x00000002, 0x404A4820, 0x404A6620, 0x00000002, 0x404A4820, + 0x404A6820, 0x00000002, 0x404A4A20, 0x404A5A20, 0x00000002, 0x404A4A20, + 0x404A5C20, 0x00000002, 0x404A4A20, 0x404A6220, 0x00000002, 0x404A4A20, + 0x404A6620, 0x00000002, 0x404A4A20, 0x404A6820, + // Block 127, offset 0x1fc0 + 0x00000002, 0x404A4C20, 0x404A5A20, 0x00000002, 0x404A4C20, 0x404A5C20, + 0x00000002, 0x404A4C20, 0x404A6220, 0x00000002, 0x404A4C20, 0x404A6620, + 0x00000002, 0x404A4C20, 0x404A6820, 0x00000002, 0x404A4E20, 0x404A5A20, + 0x00000002, 0x404A4E20, 0x404A5C20, 0x00000002, 0x404A4E20, 0x404A6220, + 0x00000002, 0x404A4E20, 0x404A6620, 0x00000002, 0x404A4E20, 0x404A6820, + 0x00000002, 0x404A7620, 0x404AF820, 0x00000002, 0x404A7820, 0x404AF820, + 0x00000002, 0x404A8020, 0x404B0020, 0x00000002, 0x404A8220, 0x404B0020, + 0x00000002, 0x404AA020, 0x404B0020, 0x00000002, 0x404AA220, 0x404B0020, + 0x00000002, 0x404AB020, 0x404B0020, 0x00000002, 0x404AB220, 0x404B0020, + 0x00000002, 0x404AC020, 0x404B0020, 0x00000002, 0x404AC220, 0x404B0020, + 0x00000002, 0x404AD020, 0x404B0020, 0x00000002, + // Block 128, offset 0x2000 + 0x404AD220, 0x404B0020, 0x00000002, 0x004AD684, 0xA0013A04, 0x00000002, + 0x004AE684, 0xA0013A04, 0x00000002, 0x004AE884, 0xA0013A04, 0x00000002, + 0x004AEA84, 0xA0013A04, 0x00000002, 0x404AEA20, 0x8281258D, 0x00000002, + 0x404AEA20, 0x82812591, 0x00000002, 0x404AF020, 0x8281258D, 0x00000002, + 0x404AF020, 0x82812591, 0x00000003, 0x004B0284, 0x004B3084, 0xA000F304, + 0x00000003, 0x004EA684, 0x004F1484, 0x004EA684, 0x00000002, 0x0050AE84, + 0x0050DA84, 0x00000003, 0x0050AE84, 0x0050DA84, 0x0050F084, 0x00000003, + 0x00514E84, 0x00519A84, 0x00514E84, 0x00000002, 0x005ADA84, 0xA0013904, + 0x00000002, 0x005ADC84, 0xA0013904, 0x00000002, 0x005ADC84, 0xA0013A04, + 0x00000002, 0x005ADE84, 0xA0013904, 0x00000002, 0x005ADE84, 0x005ADE84, + 0x00000002, 0x005AE084, 0xA0013904, 0x00000002, + // Block 129, offset 0x2040 + 0x005AE084, 0xA0013A04, 0x00000002, 0x005AE084, 0xA0013C04, 0x00000002, + 0x005AE084, 0xA0013D04, 0x00000002, 0x005AE884, 0xA0013904, 0x00000002, + 0x005AE884, 0xA0013A04, 0x00000002, 0x005AE884, 0xA0013C04, 0x00000002, + 0x005AE884, 0xA0013D04, 0x00000002, 0x005AEC84, 0xA0013904, 0x00000002, + 0x005AEE84, 0xA0013904, 0x00000002, 0x005AEE84, 0xA0013A04, 0x00000002, + 0x005AEE84, 0xA0013C04, 0x00000002, 0x005AF084, 0xA0013904, 0x00000002, + 0x005AF084, 0xA0013A04, 0x00000002, 0x005AF284, 0xA0013904, 0x00000002, + 0x005AF484, 0xA0013904, 0x00000002, 0x005AF684, 0xA0013904, 0x00000002, + 0x005AF684, 0x005B0884, 0x00000002, 0x005AFA84, 0xA0013904, 0x00000002, + 0x005AFE84, 0xA0013904, 0x00000002, 0x005AFE84, 0xA0013A04, 0x00000002, + 0x005AFE84, 0xA0013C04, 0x00000002, 0x005AFE84, + // Block 130, offset 0x2080 + 0xA0013D04, 0x00000002, 0x005AFE84, 0xA0013E04, 0x00000002, 0x005B0084, + 0xA0013904, 0x00000002, 0x005B0084, 0xA0013A04, 0x00000002, 0x005B0284, + 0xA0013904, 0x00000002, 0x005B0284, 0xA0013A04, 0x00000002, 0x005B0684, + 0xA0013904, 0x00000002, 0x005B0684, 0xA0013A04, 0x00000004, 0x005B0684, + 0xA0013904, 0x005B0684, 0xA0013904, 0x00000002, 0x005B0884, 0xA0013904, + 0x00000002, 0x005B0A84, 0xA0013904, 0x00000002, 0x005B2484, 0xA0013904, + 0x00000002, 0x005B2484, 0xA0013A04, 0x00000002, 0x005B2684, 0xA0013904, + 0x00000002, 0x005B2A84, 0xA0013904, 0x00000002, 0x005B3084, 0xA0013904, + 0x00000002, 0x005B3284, 0xA0013904, 0x00000002, 0x005B3484, 0xA0013904, + 0x00000002, 0x005B3684, 0xA0013904, 0x00000002, 0x005B3884, 0xA0013904, + 0x00000002, 0x005B3A84, 0xA0013904, 0x00000002, + // Block 131, offset 0x20c0 + 0x005B3E84, 0xA0013904, 0x00000002, 0x005B4084, 0xA0013904, 0x00000002, + 0x005B4284, 0xA0013904, 0x00000002, 0x005B4484, 0xA0013904, 0x00000002, + 0x005B4684, 0xA0013904, 0x00000002, 0x005B4884, 0xA0013904, 0x00000002, + 0x005B5284, 0xA0013904, 0x00000002, 0x005B5484, 0xA0013904, 0x00000002, + 0x005B5684, 0xA0013904, 0x00000002, 0x005B5884, 0xA0013904, 0x00000002, + 0x005B5C84, 0xA0013904, 0x00000002, 0x005B6484, 0xA0013904, 0x00000002, + 0x005B6684, 0xA0013904, 0x00000002, 0x005B6884, 0xA0013904, 0x00000002, + 0x005B6A84, 0xA0013904, 0x00000002, 0x005B6C84, 0xA0013904, 0x00000002, + 0x005B7484, 0xA0013904, 0x00000002, 0x005B7684, 0xA0013904, 0x00000002, + 0x005B7884, 0xA0013904, 0x00000002, 0x005B7A84, 0xA0013904, 0x00000002, + 0x005B9884, 0x005D9684, 0x00000002, 0x005BBC84, + // Block 132, offset 0x2100 + 0x005D9684, 0x00000002, 0x005BE684, 0x005D9684, 0x00000002, 0x005C0E84, + 0x005D9884, 0x00000002, 0x005C2484, 0x005D9684, 0x00000002, 0x005C3084, + 0x005D9884, 0x00000002, 0x005C3484, 0x005D9884, 0x00000002, 0x005C4084, + 0x005D9684, 0x00000002, 0x005C8A84, 0x005D9684, 0x00000002, 0x005CE884, + 0x005D9684, 0x00000002, 0x005D1684, 0x005D9684, 0x00000002, 0x005D2284, + 0x005D9884, 0x00000002, 0x005D3084, 0x005D9684, 0x00000004, 0x0062C486, + 0x0063C286, 0x0062C286, 0x0063CE86, 0x00000005, 0x0062C886, 0x0063A886, + 0x00648286, 0x0062AC86, 0x0063B886, 0x00000003, 0x0065769C, 0x0027D69C, + 0x0065CA9C, 0x00000005, 0x0065769C, 0x0065AA9C, 0xA001291C, 0x0027D69C, + 0x00659E9C, 0x00000004, 0x0065769C, 0x0065CA9C, 0x0065AE9C, 0x0065769C, + 0x00000005, 0x0065769C, 0x0065D89C, 0x0065B09C, + // Block 133, offset 0x2140 + 0xA001291C, 0x0065769C, 0x00000005, 0x0065789C, 0x0065A29C, 0x0065D89C, + 0x0065869C, 0xA001281C, 0x00000003, 0x0065789C, 0x0065D89C, 0x0065989C, + 0x00000002, 0x00657A8E, 0xA0812802, 0x00000002, 0x00657A91, 0xA0812802, + 0x00000003, 0x00657A9C, 0x0065809C, 0x0065D89C, 0x00000004, 0x00657E9C, + 0x0027D69C, 0x0065829C, 0x0027D69C, 0x00000006, 0x00657E9C, 0x0065909C, + 0x0065869C, 0x0027D69C, 0x00659E9C, 0xA001281C, 0x00000003, 0x0065809C, + 0x0027D69C, 0x0065B89C, 0x00000003, 0x0065809C, 0x0065D89C, 0x0065909C, + 0x00000002, 0x0065828E, 0xA0812802, 0x00000002, 0x00658291, 0xA0812802, + 0x00000003, 0x0065829C, 0x0065789C, 0x0065C89C, 0x00000004, 0x0065829C, + 0x0065C69C, 0x00659A9C, 0x00659E9C, 0x00000004, 0x0065829C, 0x0065CE9C, + 0x0065C89C, 0x0027D69C, 0x00000004, 0x0065829C, + // Block 134, offset 0x2180 + 0xA001281C, 0x0065CE9C, 0x0065D89C, 0x00000004, 0x0065829C, 0xA001281C, + 0x0065D89C, 0x0065B49C, 0x00000002, 0x0065848E, 0xA0812802, 0x00000002, + 0x00658491, 0xA0812802, 0x00000004, 0x0065849C, 0xA001281C, 0x0065829C, + 0xA001281C, 0x00000004, 0x0065849C, 0xA001281C, 0x0065A29C, 0x0027D69C, + 0x00000004, 0x0065849C, 0x0065C09C, 0x0065C89C, 0x0027D69C, 0x00000006, + 0x0065849C, 0xA001281C, 0x0065CA9C, 0x0065969C, 0xA001281C, 0x0027D69C, + 0x00000006, 0x0065849C, 0x0065CE9C, 0x0065869C, 0xA001281C, 0x0065C69C, + 0x0065B89C, 0x00000006, 0x0065849C, 0x0065CE9C, 0x0065BA9C, 0x0027D69C, + 0x00659E9C, 0x0065CA9C, 0x00000005, 0x0065849C, 0x0065CE9C, 0x0065D09C, + 0x00659A9C, 0x00659E9C, 0x00000002, 0x0065868E, 0xA0812802, 0x00000002, + 0x00658691, 0xA0812802, 0x00000004, 0x0065869C, + // Block 135, offset 0x21c0 + 0xA001281C, 0x0065C69C, 0x0065B89C, 0x00000006, 0x0065869C, 0xA001281C, + 0x0065C69C, 0x0065B89C, 0x00659E9C, 0x0065D89C, 0x00000006, 0x0065869C, + 0x0065CA9C, 0x0065929C, 0xA001281C, 0x0065789C, 0x0065CE9C, 0x00000004, + 0x0065869C, 0x0065CE9C, 0x0027D69C, 0x0065A69C, 0x00000002, 0x0065888E, + 0xA0812802, 0x00000002, 0x00658891, 0xA0812802, 0x00000003, 0x0065889C, + 0x0027D69C, 0x0065909C, 0x00000002, 0x00658A8E, 0xA0812802, 0x00000002, + 0x00658A91, 0xA0812802, 0x00000004, 0x00658A9C, 0x0027D69C, 0x0065B29C, + 0xA001291C, 0x00000003, 0x00658A9C, 0x0065CA9C, 0x0065A09C, 0x00000002, + 0x00658C8E, 0xA0812802, 0x00000002, 0x00658C91, 0xA0812802, 0x00000004, + 0x00658C9C, 0x0065789C, 0x0065869C, 0x0065CA9C, 0x00000005, 0x00658C9C, + 0x0065D89C, 0x0065989C, 0x0027D69C, 0x0065B89C, + // Block 136, offset 0x2200 + 0x00000002, 0x00658E8E, 0xA0812802, 0x00000002, 0x00658E91, 0xA0812802, + 0x00000002, 0x00658E84, 0x0065BA84, 0x00000005, 0x00658E9C, 0x0065C89C, + 0x0065D89C, 0x0065869C, 0xA001281C, 0x00000002, 0x0065908E, 0xA0812802, + 0x00000002, 0x00659091, 0xA0812802, 0x00000002, 0x0065928E, 0xA0812802, + 0x00000002, 0x00659291, 0xA0812802, 0x00000003, 0x0065929C, 0x0065D89C, + 0x0065989C, 0x00000003, 0x0065929C, 0x0065D89C, 0x00659E9C, 0x00000002, + 0x0065948E, 0xA0812802, 0x00000002, 0x00659491, 0xA0812802, 0x00000002, + 0x0065968E, 0xA0812802, 0x00000002, 0x00659691, 0xA0812802, 0x00000004, + 0x0065969C, 0xA001281C, 0x0027D69C, 0x0065909C, 0x00000002, 0x0065988E, + 0xA0812802, 0x00000002, 0x00659891, 0xA0812802, 0x00000002, 0x00659A8E, + 0xA0812802, 0x00000002, 0x00659A91, 0xA0812802, + // Block 137, offset 0x2240 + 0x00000002, 0x00659C8E, 0xA0812802, 0x00000002, 0x00659C91, 0xA0812802, + 0x00000003, 0x00659C9C, 0xA001281C, 0x00658E9C, 0x00000002, 0x00659E8E, + 0xA0812802, 0x00000002, 0x00659E91, 0xA0812802, 0x00000003, 0x00659E9C, + 0xA001281C, 0x0065CA9C, 0x00000003, 0x0065A89C, 0x00659A9C, 0x00659E9C, + 0x00000002, 0x0065AA8E, 0xA0812802, 0x00000002, 0x0065AA91, 0xA0812802, + 0x00000002, 0x0065AA8E, 0xA0812902, 0x00000002, 0x0065AA91, 0xA0812902, + 0x00000006, 0x0065AA9C, 0xA001291C, 0x0027D69C, 0x0065929C, 0x0065D89C, + 0x00659E9C, 0x00000004, 0x0065AA9C, 0xA001291C, 0x0027D69C, 0x00659A9C, + 0x00000005, 0x0065AA9C, 0xA001281C, 0x0027D69C, 0x0065CC9C, 0x0065CA9C, + 0x00000003, 0x0065AA9C, 0x0065789C, 0x00659A9C, 0x00000002, 0x0065AC8E, + 0xA0812802, 0x00000002, 0x0065AC91, 0xA0812802, + // Block 138, offset 0x2280 + 0x00000002, 0x0065AC8E, 0xA0812902, 0x00000002, 0x0065AC91, 0xA0812902, + 0x00000006, 0x0065AC9C, 0xA001291C, 0x0065769C, 0x0065909C, 0x00659E9C, + 0x0065CA9C, 0x00000004, 0x0065AC9C, 0xA001291C, 0x0065869C, 0x0065CA9C, + 0x00000003, 0x0065AC9C, 0xA001291C, 0x00658A9C, 0x00000003, 0x0065AC9C, + 0xA001281C, 0x0065CA9C, 0x00000002, 0x0065AE8E, 0xA0812802, 0x00000002, + 0x0065AE91, 0xA0812802, 0x00000002, 0x0065AE8E, 0xA0812902, 0x00000002, + 0x0065AE91, 0xA0812902, 0x00000006, 0x0065AE9C, 0x0065769C, 0x0065C69C, + 0x00659A9C, 0x00659E9C, 0xA001281C, 0x00000004, 0x0065AE9C, 0x0065789C, + 0x0027D69C, 0x00659E9C, 0x00000006, 0x0065AE9C, 0xA001281C, 0x00659A9C, + 0x00658E9C, 0x00657E9C, 0x0065CA9C, 0x00000003, 0x0065AE9C, 0x0065C69C, + 0x0065D89C, 0x00000002, 0x0065B08E, 0xA0812802, + // Block 139, offset 0x22c0 + 0x00000002, 0x0065B091, 0xA0812802, 0x00000002, 0x0065B08E, 0xA0812902, + 0x00000002, 0x0065B091, 0xA0812902, 0x00000005, 0x0065B09C, 0xA001291C, + 0x0027D69C, 0x00658E9C, 0xA001281C, 0x00000004, 0x0065B09C, 0xA001281C, + 0x0027D69C, 0x0065969C, 0x00000005, 0x0065B09C, 0x0065869C, 0x0065969C, + 0x0027D69C, 0x0065CA9C, 0x00000003, 0x0065B09C, 0xA001291C, 0x0065949C, + 0x00000004, 0x0065B09C, 0xA001291C, 0x0065A29C, 0x0065AC9C, 0x00000003, + 0x0065B09C, 0x0065CA9C, 0x00659A9C, 0x00000004, 0x0065B09C, 0xA001291C, + 0x0065D89C, 0x0065909C, 0x00000002, 0x0065B28E, 0xA0812802, 0x00000002, + 0x0065B291, 0xA0812802, 0x00000002, 0x0065B28E, 0xA0812902, 0x00000002, + 0x0065B291, 0xA0812902, 0x00000003, 0x0065B29C, 0x0027D69C, 0x0065CA9C, + 0x00000003, 0x0065B29C, 0x0027D69C, 0x0065D89C, + // Block 140, offset 0x2300 + 0x00000005, 0x0065B29C, 0xA001291C, 0x0065789C, 0x0065D89C, 0x00659E9C, + 0x00000004, 0x0065B29C, 0xA001281C, 0x0065CA9C, 0x00659E9C, 0x00000005, + 0x0065B29C, 0xA001291C, 0x0065D89C, 0x00659E9C, 0xA001281C, 0x00000004, + 0x0065B49C, 0x0065789C, 0x0065869C, 0x0065CE9C, 0x00000003, 0x0065B49C, + 0x0065789C, 0x0065CA9C, 0x00000002, 0x0065B484, 0x00659084, 0x00000003, + 0x0065B49C, 0x00659A9C, 0x0065AA9C, 0x00000003, 0x0065B49C, 0x0065CA9C, + 0x0065869C, 0x00000005, 0x0065B49C, 0x0065D89C, 0x00658E9C, 0x0065C49C, + 0x0065D89C, 0x00000004, 0x0065B69C, 0x0065869C, 0x0065CE9C, 0x0065D89C, + 0x00000006, 0x0065B69C, 0x0065C89C, 0x0065AA9C, 0xA001281C, 0x0027D69C, + 0x0065CA9C, 0x00000004, 0x0065BA9C, 0x0027D69C, 0x00659E9C, 0x0065CA9C, + 0x00000003, 0x0065BA9C, 0x0065829C, 0xA001281C, + // Block 141, offset 0x2340 + 0x00000005, 0x0065BA9C, 0x0065829C, 0xA001281C, 0x00659E9C, 0x0065D89C, + 0x00000004, 0x0065BE9C, 0x0027D69C, 0x00659E9C, 0xA001281C, 0x00000003, + 0x0065BE9C, 0x0027D69C, 0x0065CA9C, 0x00000003, 0x0065C09C, 0x0065769C, + 0x0065D89C, 0x00000004, 0x0065C89C, 0x00659A9C, 0x00659E9C, 0x0065CA9C, + 0x00000005, 0x0065CA9C, 0x0027D69C, 0x0065AE9C, 0xA001281C, 0x0065CA9C, + 0x00000004, 0x0065CA9C, 0x0065AC9C, 0xA001291C, 0x0027D69C, 0x00000006, + 0x0065CC9C, 0x0065D89C, 0x00659E9C, 0x0065889C, 0xA001281C, 0x0065D89C, + 0x00000002, 0x0065D091, 0xA0812802, 0x00000003, 0x0065D09C, 0x00659A9C, + 0x00659E9C, 0x00000002, 0x0065D291, 0xA0812802, 0x00000002, 0x0065D491, + 0xA0812802, 0x00000002, 0x0065D691, 0xA0812802, 0x00000002, 0x0065DA84, + 0xA0013A04, 0x00000002, 0x0065EC84, 0xA0013A04, + // Block 142, offset 0x2380 + 0x00000002, 0x0065F684, 0xA0013A04, 0x00000002, 0x00660684, 0xA0013A04, + 0x00000002, 0x00661284, 0xA0013A04, 0x00000002, 0x00661484, 0xA0013A04, + 0x00000002, 0x00661C84, 0xA0013A04, 0x00000002, 0x00661E84, 0xA0013A04, + 0x00000002, 0x00662284, 0xA0013A04, 0x00000002, 0x00663884, 0xA0013A04, + 0x00000002, 0x00663896, 0xA0013A16, 0x00000002, 0x00663A84, 0xA0013A04, + 0x00000002, 0x00663A84, 0xA0013C04, 0x00000002, 0x0075C284, 0xA0013904, + 0x00000002, 0x00862084, 0xA0013904, 0x00000002, 0x00862284, 0xA0013904, + 0x00000002, 0x00862484, 0xA0013904, 0x00000002, 0x00862684, 0xA0013904, + 0x00000002, 0x00862884, 0xA0013904, 0x00000002, 0x00862A84, 0xA0013904, + 0x00000002, 0x00862C84, 0xA0013904, 0x00000002, 0x00862C84, 0xA0013A04, + 0x00000002, 0x00862E84, 0xA0013904, 0x00000002, + // Block 143, offset 0x23c0 + 0x00863084, 0xA0013904, 0x00000002, 0x00863284, 0xA0013904, 0x00000002, + 0x00863284, 0xA0013A04, 0x00000002, 0x00863484, 0xA0013904, 0x00000002, + 0x00863484, 0xA0013A04, 0x00000002, 0x00863684, 0xA0013904, 0x00000002, + 0x00863684, 0xA0013A04, 0x00000002, 0x00863884, 0xA0013904, 0x00000002, + 0x00863A84, 0xA0013904, 0x00000002, 0x00863C84, 0xA0013904, 0x00000002, + 0x00863E84, 0xA0013904, 0x00000002, 0x00863E84, 0xA0013A04, 0x00000002, + 0x00863E84, 0xA0013C04, 0x00000002, 0x00864084, 0xA0013904, 0x00000002, + 0x00864284, 0xA0013904, 0x00000002, 0x00864484, 0xA0013904, 0x00000002, + 0x00864684, 0xA0013904, 0x00000002, 0x00864684, 0xA0013A04, 0x00000002, + 0x00864884, 0xA0013904, 0x00000002, 0x00864884, 0xA0013A04, 0x00000002, + 0x00864A84, 0xA0013904, 0x00000002, 0x00864C84, + // Block 144, offset 0x2400 + 0xA0013904, 0x00000002, 0x029C6C84, 0xA0013904, 0x00000002, 0x029CB284, + 0xA0013904, 0x00000002, 0x02A30484, 0xA0013904, 0x00000002, 0x02A3C084, + 0xA0013904, 0x00000002, 0x02A40084, 0xA0013904, 0x00000002, 0x02A6B884, + 0xA0013904, 0x00000002, 0x02A6D284, 0xA0013904, 0x00000002, 0x02A70484, + 0xA0013904, 0x00000002, 0x02B81E84, 0xA0013904, 0x00000002, 0x02B81E84, + 0xA0013A04, 0x00000002, 0x02B84484, 0xA0013904, 0x00000002, 0x02B84684, + 0xA0013904, 0x00000002, 0x02BEA084, 0xA0013904, 0x00000002, 0x02BF8684, + 0xA0013904, 0x00000002, 0x02CBCA84, 0xA0013904, 0x00000002, 0x02CE1084, + 0xA0013904, 0x00000004, 0x02D0549C, 0x02BE1E9C, 0x029E349C, 0x02F27C9C, + 0x00000002, 0x02D6F484, 0xA0013904, 0x00000002, 0x02E45684, 0xA0013904, + 0x00000002, 0x02E4B684, 0xA0013904, 0x00000002, + // Block 145, offset 0x2440 + 0x02E71684, 0xA0013904, 0x00000002, 0x02EB1684, 0xA0013904, 0x00000002, + 0x02EDDC84, 0xA0013904, 0x00000002, 0x02F27484, 0xA0013904, 0x00000002, + 0x02F5F284, 0xA0013904, 0x00000002, 0x02FEA484, 0xA0013904, 0x00000002, + 0x02FEA684, 0xA0013904, 0x00000002, 0x02FEA684, 0xA0013A04, 0x00000002, + 0x02FF1484, 0xA0013904, 0x00000002, 0x02FF1484, 0xA0013A04, 0x00000002, + 0x0300FE84, 0xA0013904, 0x00000002, 0x03011284, 0xA0013904, 0x00000002, + 0x0303F884, 0xA0013904, 0x00000002, 0x0304F284, 0xA0013904, 0x00000002, + 0x0304F284, 0xA0013A04, 0x00000002, 0x0313A484, 0xA0013904, 0x00000002, + 0x031B6684, 0xA0013904, 0x00000002, 0x031F6C84, 0xA0013904, 0x00000002, + 0x031F6C84, 0xA0013A04, 0x00000002, 0x03212284, 0xA0013904, 0x00000002, + 0x032C3884, 0xA0013904, 0x00000002, 0x032DD084, + // Block 146, offset 0x2480 + 0xA0013904, 0x00000002, 0x0331C084, 0xA0013904, 0x00000002, 0x03332C84, + 0xA0013904, 0x00000002, 0x03355084, 0xA0013904, 0x00000002, 0x03367884, + 0xA0013904, 0x00000002, 0x033CEA84, 0xA0013904, 0x00000002, 0x033E9484, + 0xA0013904, 0x00000002, 0x033EA484, 0xA0013904, 0x00000002, 0x033F1A84, + 0xA0013904, 0x00000002, 0x033F3884, 0xA0013904, 0x00000002, 0x033F3884, + 0xA0013A04, 0x00000003, 0x0003F484, 0x002C9884, 0x0003F69F, 0x00000003, + 0x0003F484, 0x002C988A, 0x0003F69F, 0x00000003, 0x0003F484, 0x002D6884, + 0x0003F69F, 0x00000003, 0x0003F484, 0x002D688A, 0x0003F69F, 0x00000003, + 0x0003F484, 0x002D9A84, 0x0003F69F, 0x00000003, 0x0003F484, 0x002D9A8A, + 0x0003F69F, 0x00000003, 0x0003F484, 0x002DFE84, 0x0003F69F, 0x00000003, + 0x0003F484, 0x002DFE8A, 0x0003F69F, 0x00000003, + // Block 147, offset 0x24c0 + 0x0003F484, 0x002EE284, 0x0003F69F, 0x00000003, 0x0003F484, 0x002EE28A, + 0x0003F69F, 0x00000003, 0x0003F484, 0x002F5684, 0x0003F69F, 0x00000003, + 0x0003F484, 0x002F568A, 0x0003F69F, 0x00000003, 0x0003F484, 0x002F7A84, + 0x0003F69F, 0x00000003, 0x0003F484, 0x002F7A8A, 0x0003F69F, 0x00000003, + 0x0003F484, 0x002FE684, 0x0003F69F, 0x00000003, 0x0003F484, 0x002FE68A, + 0x0003F69F, 0x00000003, 0x0003F484, 0x00302C84, 0x0003F69F, 0x00000003, + 0x0003F484, 0x00302C8A, 0x0003F69F, 0x00000003, 0x0003F484, 0x0030F684, + 0x0003F69F, 0x00000003, 0x0003F484, 0x0030F68A, 0x0003F69F, 0x00000003, + 0x0004B084, 0x002FE68A, 0x0004B29F, 0x00000002, 0x002C0A9D, 0x002F569C, + 0x00000002, 0x402C0C20, 0xAE604102, 0x00000002, 0x002C0C83, 0xAE604102, + 0x00000002, 0x402C0C20, 0xAE604702, 0x00000002, + // Block 148, offset 0x2500 + 0x402C0C20, 0xAE605202, 0x00000002, 0x002C0C83, 0xAE605202, 0x00000002, + 0x402C0C20, 0xACA05602, 0x00000002, 0x002C0C83, 0xACA05602, 0x00000002, + 0x402C0C20, 0xADC07002, 0x00000002, 0x002C0C83, 0xADC07002, 0x00000002, + 0x402C0C20, 0xADC07702, 0x00000002, 0x002C0C83, 0xADC07702, 0x00000002, + 0x402C0C20, 0xADC07802, 0x00000002, 0x002C0C83, 0xADC07802, 0x00000002, + 0x402C0C20, 0xADC07B02, 0x00000002, 0x002C0C83, 0xADC07B02, 0x00000002, + 0x402C0E20, 0xAE603202, 0x00000002, 0x002C0E83, 0xAE603202, 0x00000003, + 0x402C0E20, 0xAE603202, 0xAE605202, 0x00000003, 0x002C0E83, 0xAE603202, + 0xAE605202, 0x00000002, 0x402C0E20, 0xAE603C02, 0x00000002, 0x002C0E83, + 0xAE603C02, 0x00000002, 0x402C0E20, 0xAE604102, 0x00000002, 0x002C0E83, + 0xAE604102, 0x00000003, 0x402C0E20, 0xAE604102, + // Block 149, offset 0x2540 + 0xAE605202, 0x00000003, 0x002C0E83, 0xAE604102, 0xAE605202, 0x00000002, + 0x402C0E20, 0xAE605202, 0x00000002, 0x002C0E83, 0xAE605202, 0x00000002, + 0x402C0E20, 0xACA05602, 0x00000002, 0x002C0E83, 0xACA05602, 0x00000002, + 0x402C0E20, 0xADC07002, 0x00000002, 0x002C0E83, 0xADC07002, 0x00000003, + 0x402C0E20, 0xADC07002, 0xAE605202, 0x00000003, 0x002C0E83, 0xADC07002, + 0xAE605202, 0x00000002, 0x402C0E20, 0xADC07702, 0x00000002, 0x002C0E83, + 0xADC07702, 0x00000002, 0x402C1020, 0xAE603202, 0x00000002, 0x002C1083, + 0xAE603202, 0x00000002, 0x402C1020, 0xAE603502, 0x00000002, 0x002C1083, + 0xAE603502, 0x00000002, 0x402C1020, 0xAE603702, 0x00000002, 0x002C1083, + 0xAE603702, 0x00000002, 0x402C1020, 0xAE603C02, 0x00000002, 0x002C1083, + 0xAE603C02, 0x00000003, 0x402C1020, 0xAE603C02, + // Block 150, offset 0x2580 + 0xAE603202, 0x00000003, 0x002C1083, 0xAE603C02, 0xAE603202, 0x00000003, + 0x402C1020, 0xAE603C02, 0xAE603502, 0x00000003, 0x002C1083, 0xAE603C02, + 0xAE603502, 0x00000003, 0x402C1020, 0xAE603C02, 0xAE604E02, 0x00000003, + 0x002C1083, 0xAE603C02, 0xAE604E02, 0x00000003, 0x402C1020, 0xAE603C02, + 0xAE606402, 0x00000003, 0x002C1083, 0xAE603C02, 0xAE606402, 0x00000002, + 0x402C1020, 0xAE604102, 0x00000002, 0x002C1083, 0xAE604102, 0x00000002, + 0x402C1020, 0xAE604702, 0x00000002, 0x002C1083, 0xAE604702, 0x00000002, + 0x402C1020, 0xAE604E02, 0x00000002, 0x002C1083, 0xAE604E02, 0x00000002, + 0x402C1020, 0xAE605202, 0x00000002, 0x002C1083, 0xAE605202, 0x00000002, + 0x402C1020, 0xACA05602, 0x00000002, 0x002C1083, 0xACA05602, 0x00000003, + 0x402C1020, 0xACA05602, 0xAE603702, 0x00000003, + // Block 151, offset 0x25c0 + 0x002C1083, 0xACA05602, 0xAE603702, 0x00000002, 0x402C1020, 0xACA05902, + 0x00000002, 0x002C1083, 0xACA05902, 0x00000002, 0x402C1020, 0xAE605B02, + 0x00000002, 0x002C1083, 0xAE605B02, 0x00000003, 0x402C1020, 0xAE605B02, + 0xAE603202, 0x00000003, 0x002C1083, 0xAE605B02, 0xAE603202, 0x00000003, + 0x402C1020, 0xAE605B02, 0xAE603502, 0x00000003, 0x002C1083, 0xAE605B02, + 0xAE603502, 0x00000002, 0x402C1020, 0xAE606402, 0x00000002, 0x002C1083, + 0xAE606402, 0x00000002, 0x402C1020, 0xAE606502, 0x00000002, 0x002C1083, + 0xAE606502, 0x00000002, 0x402C1020, 0xAE606702, 0x00000002, 0x002C1083, + 0xAE606702, 0x00000002, 0x402C1020, 0xADC07002, 0x00000002, 0x002C1083, + 0xADC07002, 0x00000003, 0x402C1020, 0xADC07002, 0xAE603C02, 0x00000003, + 0x002C1083, 0xADC07002, 0xAE603C02, 0x00000002, + // Block 152, offset 0x2600 + 0x402C1020, 0xADC07802, 0x00000002, 0x002C1083, 0xADC07802, 0x00000002, + 0x402C1020, 0xADC07A02, 0x00000002, 0x002C1083, 0xADC07A02, 0x00000002, + 0x402C3C20, 0xAE603202, 0x00000002, 0x002C3C83, 0xAE603202, 0x00000002, + 0x402C3C20, 0xAE604102, 0x00000002, 0x002C3C83, 0xAE604102, 0x00000002, + 0x402C3C20, 0xACA05602, 0x00000002, 0x002C3C83, 0xACA05602, 0x00000002, + 0x402C3C20, 0xADC07002, 0x00000002, 0x002C3C83, 0xADC07002, 0x00000002, + 0x402C3C20, 0xADC07B02, 0x00000002, 0x002C3C83, 0xADC07B02, 0x00000002, + 0x402C3E20, 0xAE604702, 0x00000002, 0x002C3E83, 0xAE604702, 0x00000002, + 0x402C3E20, 0xAE605202, 0x00000002, 0x002C3E83, 0xAE605202, 0x00000002, + 0x402C4020, 0xAE603202, 0x00000002, 0x002C4083, 0xAE603202, 0x00000002, + 0x402C4020, 0xAE603502, 0x00000002, 0x002C4083, + // Block 153, offset 0x2640 + 0xAE603502, 0x00000002, 0x402C4020, 0xAE603702, 0x00000002, 0x002C4083, + 0xAE603702, 0x00000002, 0x402C4020, 0xAE603C02, 0x00000002, 0x002C4083, + 0xAE603C02, 0x00000002, 0x402C4020, 0xAE604102, 0x00000002, 0x002C4083, + 0xAE604102, 0x00000002, 0x402C4020, 0xAE604702, 0x00000002, 0x002C4083, + 0xAE604702, 0x00000003, 0x402C4020, 0xAE604702, 0xAE603202, 0x00000003, + 0x002C4083, 0xAE604702, 0xAE603202, 0x00000002, 0x402C4020, 0xAE604E02, + 0x00000002, 0x002C4083, 0xAE604E02, 0x00000002, 0x002C4083, 0xAE605202, + 0x00000002, 0x402C4020, 0xACA05902, 0x00000002, 0x002C4083, 0xACA05902, + 0x00000002, 0x402C4020, 0xAE605B02, 0x00000002, 0x002C4083, 0xAE605B02, + 0x00000002, 0x402C4020, 0xAE606402, 0x00000002, 0x002C4083, 0xAE606402, + 0x00000002, 0x402C4020, 0xAE606502, 0x00000002, + // Block 154, offset 0x2680 + 0x002C4083, 0xAE606502, 0x00000002, 0x402C4020, 0xAE606702, 0x00000002, + 0x002C4083, 0xAE606702, 0x00000002, 0x402C4020, 0xADC07002, 0x00000002, + 0x002C4083, 0xADC07002, 0x00000002, 0x402C4020, 0xADC07A02, 0x00000002, + 0x002C4083, 0xADC07A02, 0x00000002, 0x402C6620, 0xAE603202, 0x00000002, + 0x002C6683, 0xAE603202, 0x00000002, 0x402C6620, 0xAE604102, 0x00000002, + 0x002C6683, 0xAE604102, 0x00000002, 0x402C6620, 0xAE605202, 0x00000002, + 0x002C6683, 0xAE605202, 0x00000002, 0x402C6620, 0xACA05602, 0x00000002, + 0x002C6683, 0xACA05602, 0x00000002, 0x402C6620, 0xAE606502, 0x00000002, + 0x002C6683, 0xAE606502, 0x00000002, 0x402C6620, 0xAE606702, 0x00000002, + 0x002C6683, 0xAE606702, 0x00000002, 0x402C6620, 0xADC07002, 0x00000002, + 0x002C6683, 0xADC07002, 0x00000003, 0x402C6620, + // Block 155, offset 0x26c0 + 0xADC07002, 0xAE605B02, 0x00000003, 0x002C6683, 0xADC07002, 0xAE605B02, + 0x00000002, 0x402C6620, 0xADC07B02, 0x00000002, 0x002C6683, 0xADC07B02, + 0x00000002, 0x002C989C, 0x0030BE9D, 0x00000002, 0x002D0884, 0x002D9A84, + 0x00000002, 0x402D2420, 0xAE603202, 0x00000002, 0x002D2483, 0xAE603202, + 0x00000002, 0x402D2420, 0xAE603502, 0x00000002, 0x002D2483, 0xAE603502, + 0x00000002, 0x402D2420, 0xAE603702, 0x00000002, 0x002D2483, 0xAE603702, + 0x00000002, 0x402D2420, 0xAE603C02, 0x00000002, 0x002D2483, 0xAE603C02, + 0x00000003, 0x402D2420, 0xAE603C02, 0xAE603202, 0x00000003, 0x002D2483, + 0xAE603C02, 0xAE603202, 0x00000003, 0x402D2420, 0xAE603C02, 0xAE603502, + 0x00000003, 0x002D2483, 0xAE603C02, 0xAE603502, 0x00000003, 0x402D2420, + 0xAE603C02, 0xAE604E02, 0x00000003, 0x002D2483, + // Block 156, offset 0x2700 + 0xAE603C02, 0xAE604E02, 0x00000003, 0x402D2420, 0xAE603C02, 0xAE606402, + 0x00000003, 0x002D2483, 0xAE603C02, 0xAE606402, 0x00000002, 0x402D2420, + 0xAE604102, 0x00000002, 0x002D2483, 0xAE604102, 0x00000002, 0x402D2420, + 0xAE604702, 0x00000002, 0x002D2483, 0xAE604702, 0x00000003, 0x402D2420, + 0xAE604702, 0xAE605B02, 0x00000003, 0x002D2483, 0xAE604702, 0xAE605B02, + 0x00000002, 0x402D2420, 0xAE604D02, 0x00000002, 0x002D2483, 0xAE604D02, + 0x00000002, 0x402D2420, 0xAE604E02, 0x00000002, 0x002D2483, 0xAE604E02, + 0x00000003, 0x402D2420, 0xAE604E02, 0xAE603202, 0x00000003, 0x002D2483, + 0xAE604E02, 0xAE603202, 0x00000003, 0x402D2420, 0xAE604E02, 0xAE604702, + 0x00000003, 0x002D2483, 0xAE604E02, 0xAE604702, 0x00000003, 0x402D2420, + 0xAE604E02, 0xAE605B02, 0x00000003, 0x002D2483, + // Block 157, offset 0x2740 + 0xAE604E02, 0xAE605B02, 0x00000002, 0x402D2420, 0xAE605202, 0x00000002, + 0x002D2483, 0xAE605202, 0x00000003, 0x402D2420, 0xAE605202, 0xAE605B02, + 0x00000003, 0x002D2483, 0xAE605202, 0xAE605B02, 0x00000002, 0x402D2420, + 0xACA05902, 0x00000002, 0x002D2483, 0xACA05902, 0x00000003, 0x402D2420, + 0xACA05902, 0xAE605B02, 0x00000003, 0x002D2483, 0xACA05902, 0xAE605B02, + 0x00000002, 0x402D2420, 0xAE605B02, 0x00000002, 0x002D2483, 0xAE605B02, + 0x00000003, 0x402D2420, 0xAE605B02, 0xAE603202, 0x00000003, 0x002D2483, + 0xAE605B02, 0xAE603202, 0x00000003, 0x402D2420, 0xAE605B02, 0xAE603502, + 0x00000003, 0x002D2483, 0xAE605B02, 0xAE603502, 0x00000002, 0x402D2420, + 0xAE606402, 0x00000002, 0x002D2483, 0xAE606402, 0x00000002, 0x402D2420, + 0xAE606502, 0x00000002, 0x002D2483, 0xAE606502, + // Block 158, offset 0x2780 + 0x00000002, 0x402D2420, 0xAE606702, 0x00000002, 0x002D2483, 0xAE606702, + 0x00000002, 0x402D2420, 0xAD806802, 0x00000002, 0x002D2483, 0xAD806802, + 0x00000003, 0x402D2420, 0xAD806802, 0xAE603202, 0x00000003, 0x002D2483, + 0xAD806802, 0xAE603202, 0x00000003, 0x402D2420, 0xAD806802, 0xAE603502, + 0x00000003, 0x002D2483, 0xAD806802, 0xAE603502, 0x00000003, 0x402D2420, + 0xAD806802, 0xAE604E02, 0x00000003, 0x002D2483, 0xAD806802, 0xAE604E02, + 0x00000003, 0x402D2420, 0xAD806802, 0xAE606402, 0x00000003, 0x002D2483, + 0xAD806802, 0xAE606402, 0x00000003, 0x402D2420, 0xAD806802, 0xADC07002, + 0x00000003, 0x002D2483, 0xAD806802, 0xADC07002, 0x00000002, 0x402D2420, + 0xADC07002, 0x00000002, 0x002D2483, 0xADC07002, 0x00000003, 0x402D2420, + 0xADC07002, 0xAE603C02, 0x00000003, 0x002D2483, + // Block 159, offset 0x27c0 + 0xADC07002, 0xAE603C02, 0x00000002, 0x002D689C, 0x002BDE9C, 0x00000002, + 0x002D689D, 0x002D229C, 0x00000002, 0x002D689D, 0x002F2C9D, 0x00000002, + 0x002D689D, 0x0030BE9D, 0x00000002, 0x002D689D, 0x00312A9C, 0x00000002, + 0x002D9A84, 0x002D9A9F, 0x00000002, 0x002D9A8A, 0x002D9A9F, 0x00000003, + 0x002D9A84, 0x002D9A84, 0x002D9A9F, 0x00000003, 0x002D9A8A, 0x002D9A8A, + 0x002D9A9F, 0x00000002, 0x002D9A84, 0x002DCC84, 0x00000002, 0x002D9A8A, + 0x002DCC8A, 0x00000002, 0x002D9A9C, 0x002E9E9C, 0x00000002, 0x002D9A9D, + 0x00306C9D, 0x00000002, 0x002D9A84, 0x0030BE9F, 0x00000002, 0x002D9A8A, + 0x0030BE9F, 0x00000002, 0x002D9A84, 0x0030F69F, 0x00000002, 0x002D9A8A, + 0x0030F69F, 0x00000002, 0x002DFE9C, 0x002BDE9D, 0x00000002, 0x002DFE9D, + 0x002C0A9D, 0x00000002, 0x002DFE9C, 0x002D229C, + // Block 160, offset 0x2800 + 0x00000002, 0x002DFE9D, 0x002DFE9D, 0x00000002, 0x002DFE9C, 0x002E229C, + 0x00000002, 0x002DFE9C, 0x002E829C, 0x00000002, 0x002DFE9D, 0x002E829D, + 0x00000002, 0x002DFE9C, 0x00302C9C, 0x00000002, 0x002DFE9C, 0x0030BE9D, + 0x00000002, 0x002DFE9C, 0x0030E29D, 0x00000002, 0x002DFE9C, 0x0032A29D, + 0x00000002, 0x002E229C, 0x0030F69C, 0x00000002, 0x002E829C, 0x002FE69C, + 0x00000002, 0x002E9E8A, 0x002EE284, 0x00000002, 0x002E9E9C, 0x002FE69C, + 0x00000002, 0x002EE29C, 0x0030BE9D, 0x00000002, 0x002F2C9D, 0x002D689D, + 0x00000002, 0x002F2C9D, 0x002F7A9D, 0x00000002, 0x002F2C9C, 0x002FE69C, + 0x00000002, 0x002FE69D, 0x002C629D, 0x00000002, 0x002FE694, 0x002E8294, + 0x00000002, 0x002FE69C, 0x002F7A9C, 0x00000002, 0x002FE69D, 0x002FE69D, + 0x00000002, 0x002FE684, 0x00302C84, 0x00000002, + // Block 161, offset 0x2840 + 0x002FE69D, 0x0030BE9C, 0x00000002, 0x00302C94, 0x002E8294, 0x00000002, + 0x0030BE84, 0x002D9A9F, 0x00000002, 0x0030BE8A, 0x002D9A9F, 0x00000003, + 0x0030BE84, 0x002D9A84, 0x002D9A9F, 0x00000003, 0x0030BE8A, 0x002D9A8A, + 0x002D9A9F, 0x00000002, 0x4030E420, 0xAE603C02, 0x00000002, 0x0030E483, + 0xAE603C02, 0x00000002, 0x4030E420, 0xAE604102, 0x00000002, 0x0030E483, + 0xAE604102, 0x00000002, 0x4030E420, 0xAE604702, 0x00000002, 0x0030E483, + 0xAE604702, 0x00000002, 0x4030E420, 0xAE605202, 0x00000002, 0x0030E483, + 0xAE605202, 0x00000002, 0x4030E420, 0xACA05602, 0x00000002, 0x0030E483, + 0xACA05602, 0x00000002, 0x4030E420, 0xADC07002, 0x00000002, 0x0030E483, + 0xADC07002, 0x00000002, 0x4030E420, 0xADC07902, 0x00000002, 0x0030E483, + 0xADC07902, 0x00000002, 0x4030E420, 0xADC07B02, + // Block 162, offset 0x2880 + 0x00000002, 0x0030F684, 0x002D9A9F, 0x00000002, 0x0030F68A, 0x002D9A9F, + 0x00000003, 0x0030F684, 0x002D9A84, 0x002D9A9F, 0x00000003, 0x0030F68A, + 0x002D9A8A, 0x002D9A9F, 0x00000002, 0x0032769C, 0x002FE69C, 0x00000002, + 0x00393C99, 0x003A8E99, 0x00000002, 0x00393C9A, 0x003A8E9A, 0x00000002, + 0x00395699, 0x003A8E99, 0x00000002, 0x0039569A, 0x003A8E9A, 0x00000002, + 0x00395899, 0x003A8E99, 0x00000002, 0x0039589A, 0x003A8E9A, 0x00000002, + 0x00396499, 0x003A8E99, 0x00000002, 0x0039649A, 0x003A8E9A, 0x00000002, + 0x00397299, 0x003A8E99, 0x00000002, 0x0039729A, 0x003A8E9A, 0x00000002, + 0x00397499, 0x003A8E99, 0x00000002, 0x0039749A, 0x003A8E9A, 0x00000002, + 0x0039C699, 0x003A8E99, 0x00000002, 0x0039C69A, 0x003A8E9A, 0x00000002, + 0x0039C899, 0x003A8E99, 0x00000002, 0x0039C89A, + // Block 163, offset 0x28c0 + 0x003A8E9A, 0x00000002, 0x0039DC99, 0x003A8E99, 0x00000002, 0x0039DC9A, + 0x003A8E9A, 0x00000002, 0x0039DE99, 0x003A8E99, 0x00000002, 0x0039DE9A, + 0x003A8E9A, 0x00000002, 0x0039E699, 0x003A8E99, 0x00000002, 0x0039E69A, + 0x003A8E9A, 0x00000002, 0x0039EE99, 0x003A8E99, 0x00000002, 0x0039EE9A, + 0x003A8E9A, 0x00000002, 0x0039F099, 0x003A8E99, 0x00000002, 0x0039F09A, + 0x003A8E9A, 0x00000002, 0x0039FC99, 0x003A8E99, 0x00000002, 0x0039FC9A, + 0x003A8E9A, 0x00000002, 0x003A1299, 0x003A8E99, 0x00000002, 0x003A129A, + 0x003A8E9A, 0x00000002, 0x003A1A99, 0x003A8E99, 0x00000002, 0x003A1A9A, + 0x003A8E9A, 0x00000002, 0x003A4099, 0x003A8E99, 0x00000002, 0x003A409A, + 0x003A8E9A, 0x00000002, 0x003A4E9A, 0x003A8E9A, 0x00000002, 0x003A5699, + 0x003A8E99, 0x00000002, 0x003A569A, 0x003A8E9A, + // Block 164, offset 0x2900 + 0x00000002, 0x003A689A, 0x003A8E9A, 0x00000002, 0x003A9099, 0x003A8E99, + 0x00000002, 0x003A909A, 0x003A8E9A, 0x00000002, 0x402D6A20, 0xAE604702, + 0x00000002, 0x002D6A83, 0xAE604702, 0x00000002, 0x402D6A20, 0xAE605202, + 0x00000002, 0x002D6A83, 0xAE605202, 0x00000002, 0x002D9883, 0xAE603202, + 0x00000002, 0x002D9883, 0xAE603502, 0x00000002, 0x002D9883, 0xAE603702, + 0x00000002, 0x002D9883, 0xAE603C02, 0x00000002, 0x002D9883, 0xAE604102, + 0x00000002, 0x002D9883, 0xAE604702, 0x00000003, 0x002D9883, 0xAE604702, + 0xAE603202, 0x00000002, 0x002D9883, 0xAE604E02, 0x00000002, 0x002D9883, + 0xACA05902, 0x00000002, 0x002D9883, 0xAE605B02, 0x00000002, 0x002D9883, + 0xAE606402, 0x00000002, 0x002D9883, 0xAE606502, 0x00000002, 0x002D9883, + 0xAE606702, 0x00000002, 0x002D9883, 0xADC07002, + // Block 165, offset 0x2940 + 0x00000002, 0x002D9883, 0xADC07A02, 0x00000002, 0x402EE420, 0xAE604E02, + 0x00000002, 0x002EE483, 0xAE604E02, 0x00000002, 0x402EE420, 0xAE605B02, + 0x00000002, 0x002EE483, 0xAE605B02, 0x00000002, 0x40306E20, 0xAE603202, + 0x00000002, 0x00306E83, 0xAE603202, 0x00000002, 0x40306E20, 0xAE603502, + 0x00000002, 0x00306E83, 0xAE603502, 0x00000002, 0x40306E20, 0xAE604102, + 0x00000002, 0x00306E83, 0xAE604102, 0x00000002, 0x40306E20, 0xAE605B02, + 0x00000002, 0x00306E83, 0xAE605B02, 0x00000002, 0x402FE820, 0xAE605202, + 0x00000002, 0x002FE883, 0xAE605202, 0x00000002, 0x002C6294, 0xA0013914, + 0x00000002, 0x00302C83, 0x402D6820, 0x00000002, 0x00302C89, 0x002D6888, + 0x00000002, 0x40310021, 0xAE603202, 0x00000002, 0x003100A3, 0xAE603202, + 0x00000002, 0x40310021, 0xAE603502, 0x00000002, + // Block 166, offset 0x2980 + 0x003100A3, 0xAE603502, 0x00000002, 0x40310021, 0xAE604102, 0x00000002, + 0x003100A3, 0xAE604102, 0x00000002, 0x40310021, 0xAE605B02, 0x00000002, + 0x003100A3, 0xAE605B02, 0x00000002, 0x40320C20, 0xAE603202, 0x00000002, + 0x00320C83, 0xAE603202, 0x00000002, 0x40320C20, 0xAE605B02, 0x00000002, + 0x00320C83, 0xAE605B02, 0x00000002, 0x40320C21, 0xAE605B02, 0x00000002, + 0x00320CA3, 0xAE605B02, 0x00000002, 0x40320E20, 0xAE603202, 0x00000002, + 0x00320E83, 0xAE603202, 0x00000002, 0x40320E21, 0xAE604E02, 0x00000002, + 0x00320EA3, 0xAE604E02, 0x00000002, 0x40320E21, 0xAE605B02, 0x00000002, + 0x00320EA3, 0xAE605B02, 0x00000002, 0x40321020, 0xAE603202, 0x00000002, + 0x00321083, 0xAE603202, 0x00000002, 0x404A7620, 0x838225B3, 0x00000004, + 0x004A8083, 0x404AB020, 0x404A8020, 0x404AFA20, + // Block 167, offset 0x29c0 + 0x00000004, 0x004A8084, 0x404AB020, 0x404A8020, 0x404AFA20, 0x00000004, + 0x004A8083, 0x404AB420, 0x404A8020, 0x404AFA20, 0x00000004, 0x004A8084, + 0x404AB420, 0x404A8020, 0x404AFA20, 0x00000004, 0x004A8083, 0x404AFA20, + 0x404A8020, 0x404AFA20, 0x00000004, 0x004A8084, 0x404AFA20, 0x404A8020, + 0x404AFA20, 0x00000002, 0x404A8020, 0x828225B5, 0x00000004, 0x004AB083, + 0x404A8020, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AB084, 0x404A8020, + 0x404A8020, 0x404AFA20, 0x00000004, 0x004AB083, 0x404A8420, 0x404A8020, + 0x404AFA20, 0x00000004, 0x004AB084, 0x404A8420, 0x404A8020, 0x404AFA20, + 0x00000004, 0x004AB083, 0x404AB820, 0x404A8020, 0x404AFA20, 0x00000004, + 0x004AB084, 0x404AB820, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AB083, + 0x404AC020, 0x404A8020, 0x404AFA20, 0x00000004, + // Block 168, offset 0x2a00 + 0x004AB084, 0x404AC020, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AB083, + 0x404AC420, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AB084, 0x404AC420, + 0x404A8020, 0x404AFA20, 0x00000002, 0x404AB020, 0x828225B5, 0x00000002, + 0x004AB083, 0x828225B5, 0x00000004, 0x004AC083, 0x404A8020, 0x404A8020, + 0x404AFA20, 0x00000004, 0x004AC084, 0x404A8020, 0x404A8020, 0x404AFA20, + 0x00000004, 0x004AC083, 0x404AB020, 0x404A8020, 0x404AFA20, 0x00000004, + 0x004AC084, 0x404AB020, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AC083, + 0x404AFA20, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AC084, 0x404AFA20, + 0x404A8020, 0x404AFA20, 0x00000002, 0x404AC020, 0x828225B5, 0x00000004, + 0x004AC483, 0x404A8420, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AC484, + 0x404A8420, 0x404A8020, 0x404AFA20, 0x00000004, + // Block 169, offset 0x2a40 + 0x004AC483, 0x404AB020, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AC484, + 0x404AB020, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AC483, 0x404AB420, + 0x404A8020, 0x404AFA20, 0x00000004, 0x004AC484, 0x404AB420, 0x404A8020, + 0x404AFA20, 0x00000002, 0x404AD020, 0x828225B5, 0x00000004, 0x004AE083, + 0x404A8020, 0x404A8020, 0x404AFA20, 0x00000004, 0x004AE084, 0x404A8020, + 0x404A8020, 0x404AFA20, 0x00000004, 0x004AE083, 0x404AB020, 0x404A8020, + 0x404AFA20, 0x00000004, 0x004AE084, 0x404AB020, 0x404A8020, 0x404AFA20, + 0x00000004, 0x004AE083, 0x404AC020, 0x404A8020, 0x404AFA20, 0x00000004, + 0x004AE084, 0x404AC020, 0x404A8020, 0x404AFA20, 0x00000002, 0x404AEA20, + 0x8281258B, 0x00000002, 0x404AF020, 0x8281258B, 0x00000002, 0x82822599, + 0x838225B3, 0x00000002, 0x8282259B, 0x828225B5, + // Block 170, offset 0x2a80 + 0x00000002, 0x828225A3, 0x828225B5, 0x00000002, 0x838225A3, 0x828225B5, + 0x00000002, 0x828225A7, 0x828225B5, 0x00000002, 0x828225AB, 0x828225B5, + 0x00000002, 0x402BDE20, 0xAE604202, 0x00000002, 0x002BDE88, 0xAE604202, + 0x00000003, 0x402BDE20, 0xAE604202, 0xAE603202, 0x00000003, 0x002BDE88, + 0xAE604202, 0xAE603202, 0x00000003, 0x402BDE20, 0xAE604202, 0xAE603502, + 0x00000003, 0x002BDE88, 0xAE604202, 0xAE603502, 0x00000003, 0x402BDE20, + 0xAE604202, 0xAE604E02, 0x00000003, 0x002BDE88, 0xAE604202, 0xAE604E02, + 0x00000003, 0x402BDE20, 0xAE604202, 0xAE606402, 0x00000003, 0x002BDE88, + 0xAE604202, 0xAE606402, 0x00000003, 0x402BDE20, 0xADC07002, 0xAE604202, + 0x00000003, 0x002BDE88, 0xADC07002, 0xAE604202, 0x00000002, 0x402C3A20, + 0xAE604202, 0x00000002, 0x002C3A88, 0xAE604202, + // Block 171, offset 0x2ac0 + 0x00000002, 0x402C9820, 0xAE604202, 0x00000002, 0x002C9888, 0xAE604202, + 0x00000003, 0x402C9820, 0xAE604202, 0xAE603202, 0x00000003, 0x002C9888, + 0xAE604202, 0xAE603202, 0x00000003, 0x402C9820, 0xAE604202, 0xAE603502, + 0x00000003, 0x002C9888, 0xAE604202, 0xAE603502, 0x00000003, 0x402C9820, + 0xAE604202, 0xAE604E02, 0x00000003, 0x002C9888, 0xAE604202, 0xAE604E02, + 0x00000003, 0x402C9820, 0xAE604202, 0xAE606402, 0x00000003, 0x002C9888, + 0xAE604202, 0xAE606402, 0x00000003, 0x402C9820, 0xADC07002, 0xAE604202, + 0x00000003, 0x002C9888, 0xADC07002, 0xAE604202, 0x00000002, 0x402D2220, + 0xAE604202, 0x00000002, 0x002D2288, 0xAE604202, 0x00000002, 0x402D6820, + 0xAE604202, 0x00000002, 0x002D6888, 0xAE604202, 0x00000002, 0x402D9A20, + 0xAE604202, 0x00000002, 0x002D9A88, 0xAE604202, + // Block 172, offset 0x2b00 + 0x00000002, 0x402DCC20, 0xAE604202, 0x00000002, 0x002DCC88, 0xAE604202, + 0x00000002, 0x402EE220, 0xAE604202, 0x00000002, 0x002EE288, 0xAE604202, + 0x00000003, 0x402EE220, 0xAE604202, 0xAE603202, 0x00000003, 0x002EE288, + 0xAE604202, 0xAE603202, 0x00000003, 0x402EE220, 0xAE604202, 0xAE603502, + 0x00000003, 0x002EE288, 0xAE604202, 0xAE603502, 0x00000003, 0x402EE220, + 0xAE604202, 0xAE604E02, 0x00000003, 0x002EE288, 0xAE604202, 0xAE604E02, + 0x00000003, 0x402EE220, 0xAE604202, 0xAE606402, 0x00000003, 0x002EE288, + 0xAE604202, 0xAE606402, 0x00000003, 0x402EE220, 0xADC07002, 0xAE604202, + 0x00000003, 0x002EE288, 0xADC07002, 0xAE604202, 0x00000002, 0x402FE620, + 0xAE604202, 0x00000002, 0x002FE688, 0xAE604202, 0x00000002, 0x40306C20, + 0xAE604202, 0x00000002, 0x00306C88, 0xAE604202, + // Block 173, offset 0x2b40 + 0x00000002, 0x4030E220, 0xAE604202, 0x00000002, 0x0030E288, 0xAE604202, + 0x00000002, 0x40310020, 0xAE604202, 0x00000002, 0x00310088, 0xAE604202, + 0x00000002, 0x40312A20, 0xAE604202, 0x00000002, 0x00312A88, 0xAE604202, + 0x00000003, 0x00026C84, 0x00026C84, 0x0009429F, 0x00000002, 0x0002BA84, + 0x0002BA9F, 0x00000002, 0x0002BA84, 0x0002C49F, 0x00000002, 0x0002C484, + 0x0002BA9F, 0x00000002, 0x0002C484, 0x0002C49F, 0x00000002, 0x0002E484, + 0x0002E49F, 0x00000002, 0x0002E496, 0x0002E49F, 0x00000003, 0x0002E484, + 0x0002E484, 0x0002E49F, 0x00000003, 0x0002E496, 0x0002E496, 0x0002E49F, + 0x00000003, 0x0003F484, 0x0029CE84, 0x0003F69F, 0x00000003, 0x0003F484, + 0x0029D084, 0x0003F69F, 0x00000003, 0x0003F484, 0x0029D284, 0x0003F69F, + 0x00000003, 0x0003F484, 0x0029D484, 0x0003F69F, + // Block 174, offset 0x2b80 + 0x00000003, 0x0003F484, 0x0029D684, 0x0003F69F, 0x00000003, 0x0003F484, + 0x0029D884, 0x0003F69F, 0x00000003, 0x0003F484, 0x0029DA84, 0x0003F69F, + 0x00000003, 0x0003F484, 0x0029DC84, 0x0003F69F, 0x00000003, 0x0003F484, + 0x0029DE84, 0x0003F69F, 0x00000003, 0x0003F484, 0x002BDE84, 0x0003F69F, + 0x00000003, 0x0003F484, 0x002BDE8A, 0x0003F69F, 0x00000003, 0x0003F484, + 0x002C0A84, 0x0003F69F, 0x00000003, 0x0003F484, 0x002C0A8A, 0x0003F69F, + 0x00000003, 0x0003F484, 0x002C3A84, 0x0003F69F, 0x00000003, 0x0003F484, + 0x002C3A8A, 0x0003F69F, 0x00000003, 0x0003F484, 0x002C6284, 0x0003F69F, + 0x00000003, 0x0003F484, 0x002C628A, 0x0003F69F, 0x00000003, 0x0003F484, + 0x002D0884, 0x0003F69F, 0x00000003, 0x0003F484, 0x002D088A, 0x0003F69F, + 0x00000003, 0x0003F484, 0x002D2284, 0x0003F69F, + // Block 175, offset 0x2bc0 + 0x00000003, 0x0003F484, 0x002D228A, 0x0003F69F, 0x00000003, 0x0003F484, + 0x002DCC84, 0x0003F69F, 0x00000003, 0x0003F484, 0x002DCC8A, 0x0003F69F, + 0x00000003, 0x0003F484, 0x002E2284, 0x0003F69F, 0x00000003, 0x0003F484, + 0x002E228A, 0x0003F69F, 0x00000003, 0x0003F484, 0x002E8284, 0x0003F69F, + 0x00000003, 0x0003F484, 0x002E828A, 0x0003F69F, 0x00000003, 0x0003F484, + 0x002E9E84, 0x0003F69F, 0x00000003, 0x0003F484, 0x002E9E8A, 0x0003F69F, + 0x00000003, 0x0003F484, 0x002F2C84, 0x0003F69F, 0x00000003, 0x0003F484, + 0x002F2C8A, 0x0003F69F, 0x00000003, 0x0003F484, 0x00306C84, 0x0003F69F, + 0x00000003, 0x0003F484, 0x00306C8A, 0x0003F69F, 0x00000003, 0x0003F484, + 0x0030BE84, 0x0003F69F, 0x00000003, 0x0003F484, 0x0030BE8A, 0x0003F69F, + 0x00000003, 0x0003F484, 0x0030E284, 0x0003F69F, + // Block 176, offset 0x2c00 + 0x00000003, 0x0003F484, 0x0030E28A, 0x0003F69F, 0x00000003, 0x0003F484, + 0x00310084, 0x0003F69F, 0x00000003, 0x0003F484, 0x0031008A, 0x0003F69F, + 0x00000003, 0x0003F484, 0x00312A84, 0x0003F69F, 0x00000003, 0x0003F484, + 0x00312A8A, 0x0003F69F, 0x00000003, 0x0003F484, 0x0062AC84, 0x0003F69F, + 0x00000003, 0x0003F484, 0x0062B084, 0x0003F69F, 0x00000003, 0x0003F484, + 0x0062B284, 0x0003F69F, 0x00000003, 0x0003F484, 0x0062B684, 0x0003F69F, + 0x00000003, 0x0003F484, 0x0062B884, 0x0003F69F, 0x00000003, 0x0003F484, + 0x0062BA84, 0x0003F69F, 0x00000003, 0x0003F484, 0x0062BE84, 0x0003F69F, + 0x00000003, 0x0003F484, 0x0062C284, 0x0003F69F, 0x00000003, 0x0003F484, + 0x0062C484, 0x0003F69F, 0x00000003, 0x0003F484, 0x0062C884, 0x0003F69F, + 0x00000003, 0x0003F484, 0x0062CA84, 0x0003F69F, + // Block 177, offset 0x2c40 + 0x00000003, 0x0003F484, 0x0062CC84, 0x0003F69F, 0x00000003, 0x0003F484, + 0x0062CE84, 0x0003F69F, 0x00000003, 0x0003F484, 0x0062D084, 0x0003F69F, + 0x00000003, 0x0003F484, 0x029C0084, 0x0003F69F, 0x00000003, 0x0003F484, + 0x029C0684, 0x0003F69F, 0x00000003, 0x0003F484, 0x029C1284, 0x0003F69F, + 0x00000003, 0x0003F484, 0x029CBA84, 0x0003F69F, 0x00000003, 0x0003F484, + 0x029D1884, 0x0003F69F, 0x00000003, 0x0003F484, 0x029D2884, 0x0003F69F, + 0x00000003, 0x0003F484, 0x029DC684, 0x0003F69F, 0x00000003, 0x0003F484, + 0x029E0284, 0x0003F69F, 0x00000003, 0x0003F484, 0x029E2284, 0x0003F69F, + 0x00000003, 0x0003F484, 0x02A2D684, 0x0003F69F, 0x00000003, 0x0003F484, + 0x02A2DA84, 0x0003F69F, 0x00000003, 0x0003F484, 0x02A56884, 0x0003F69F, + 0x00000003, 0x0003F484, 0x02A68284, 0x0003F69F, + // Block 178, offset 0x2c80 + 0x00000003, 0x0003F484, 0x02A6A884, 0x0003F69F, 0x00000003, 0x0003F484, + 0x02A81A84, 0x0003F69F, 0x00000003, 0x0003F484, 0x02A8F884, 0x0003F69F, + 0x00000003, 0x0003F484, 0x02ADB684, 0x0003F69F, 0x00000003, 0x0003F484, + 0x02AE3E84, 0x0003F69F, 0x00000003, 0x0003F484, 0x02B6CC84, 0x0003F69F, + 0x00000003, 0x0003F484, 0x02CBCA84, 0x0003F69F, 0x00000003, 0x0003F484, + 0x02CE1084, 0x0003F69F, 0x00000003, 0x0003F484, 0x02CE1284, 0x0003F69F, + 0x00000003, 0x0003F484, 0x02CE5084, 0x0003F69F, 0x00000003, 0x0003F484, + 0x02D05484, 0x0003F69F, 0x00000003, 0x0003F484, 0x02D86884, 0x0003F69F, + 0x00000003, 0x0003F484, 0x02E0D684, 0x0003F69F, 0x00000003, 0x0003F484, + 0x02E4F284, 0x0003F69F, 0x00000003, 0x0003F484, 0x02EDC684, 0x0003F69F, + 0x00000003, 0x0003F484, 0x02F27C84, 0x0003F69F, + // Block 179, offset 0x2cc0 + 0x00000003, 0x0003F484, 0x02F2BA84, 0x0003F69F, 0x00000003, 0x0003F484, + 0x02F2DA84, 0x0003F69F, 0x00000003, 0x0003F484, 0x0303D484, 0x0003F69F, + 0x00000003, 0x0003F484, 0x0303E684, 0x0003F69F, 0x00000003, 0x0003F484, + 0x03194284, 0x0003F69F, 0x00000003, 0x0003F484, 0x03198E84, 0x0003F69F, + 0x00000003, 0x0003F484, 0x0323A284, 0x0003F69F, 0x00000002, 0x00070484, + 0x002C3A8A, 0x00000002, 0x00070484, 0x002D088A, 0x00000002, 0x00094284, + 0x0009429F, 0x00000003, 0x00094284, 0x00094284, 0x0009429F, 0x00000002, + 0x0029CC84, 0x0002409F, 0x00000002, 0x0029CC84, 0x0002E49F, 0x00000002, + 0x0029CC84, 0x02E1729F, 0x00000002, 0x0029CE84, 0x0002409F, 0x00000002, + 0x0029CE84, 0x0002E49F, 0x00000002, 0x0029CE9E, 0x0009589E, 0x00000002, + 0x0029CE86, 0x0029CC86, 0x00000003, 0x0029CE84, + // Block 180, offset 0x2d00 + 0x0029CC84, 0x0002E49F, 0x00000003, 0x0029CE84, 0x0029CC84, 0x02CBCA9F, + 0x00000003, 0x0029CE84, 0x0029CC84, 0x02CE109F, 0x00000003, 0x0029CE84, + 0x0029CC84, 0x02E1729F, 0x00000002, 0x0029CE86, 0x0029CE86, 0x00000003, + 0x0029CE84, 0x0029CE84, 0x0002E49F, 0x00000003, 0x0029CE84, 0x0029CE84, + 0x02CBCA9F, 0x00000003, 0x0029CE84, 0x0029CE84, 0x02CE109F, 0x00000003, + 0x0029CE84, 0x0029CE84, 0x02E1729F, 0x00000002, 0x0029CE86, 0x0029D086, + 0x00000003, 0x0029CE84, 0x0029D084, 0x0002E49F, 0x00000003, 0x0029CE84, + 0x0029D084, 0x02CBCA9F, 0x00000003, 0x0029CE84, 0x0029D084, 0x02CE109F, + 0x00000003, 0x0029CE84, 0x0029D084, 0x02E1729F, 0x00000002, 0x0029CE86, + 0x0029D286, 0x00000003, 0x0029CE84, 0x0029D284, 0x0002E49F, 0x00000003, + 0x0029CE84, 0x0029D284, 0x02CBCA9F, 0x00000003, + // Block 181, offset 0x2d40 + 0x0029CE84, 0x0029D284, 0x02E1729F, 0x00000002, 0x0029CE86, 0x0029D486, + 0x00000003, 0x0029CE84, 0x0029D484, 0x0002E49F, 0x00000003, 0x0029CE84, + 0x0029D484, 0x02CBCA9F, 0x00000003, 0x0029CE84, 0x0029D484, 0x02E1729F, + 0x00000002, 0x0029CE86, 0x0029D686, 0x00000003, 0x0029CE84, 0x0029D684, + 0x0002E49F, 0x00000003, 0x0029CE84, 0x0029D684, 0x02CBCA9F, 0x00000003, + 0x0029CE84, 0x0029D684, 0x02E1729F, 0x00000002, 0x0029CE86, 0x0029D886, + 0x00000003, 0x0029CE84, 0x0029D884, 0x0002E49F, 0x00000003, 0x0029CE84, + 0x0029D884, 0x02CBCA9F, 0x00000003, 0x0029CE84, 0x0029D884, 0x02E1729F, + 0x00000002, 0x0029CE86, 0x0029DA86, 0x00000003, 0x0029CE84, 0x0029DA84, + 0x0002E49F, 0x00000003, 0x0029CE84, 0x0029DA84, 0x02CBCA9F, 0x00000003, + 0x0029CE84, 0x0029DA84, 0x02E1729F, 0x00000002, + // Block 182, offset 0x2d80 + 0x0029CE86, 0x0029DC86, 0x00000003, 0x0029CE84, 0x0029DC84, 0x0002E49F, + 0x00000003, 0x0029CE84, 0x0029DC84, 0x02CBCA9F, 0x00000003, 0x0029CE84, + 0x0029DC84, 0x02E1729F, 0x00000002, 0x0029CE86, 0x0029DE86, 0x00000003, + 0x0029CE84, 0x0029DE84, 0x0002E49F, 0x00000003, 0x0029CE84, 0x0029DE84, + 0x02CBCA9F, 0x00000003, 0x0029CE84, 0x0029DE84, 0x02E1729F, 0x00000002, + 0x0029CE84, 0x02CBCA9F, 0x00000002, 0x0029CE84, 0x02CE109F, 0x00000002, + 0x0029CE84, 0x02E1729F, 0x00000002, 0x0029D084, 0x0002409F, 0x00000002, + 0x0029D084, 0x0002E49F, 0x00000002, 0x0029D086, 0x0029CC86, 0x00000003, + 0x0029D084, 0x0029CC84, 0x0002E49F, 0x00000003, 0x0029D084, 0x0029CC84, + 0x02CBCA9F, 0x00000003, 0x0029D084, 0x0029CC84, 0x02E1729F, 0x00000002, + 0x0029D086, 0x0029CE86, 0x00000003, 0x0029D084, + // Block 183, offset 0x2dc0 + 0x0029CE84, 0x02CBCA9F, 0x00000003, 0x0029D084, 0x0029CE84, 0x02E1729F, + 0x00000002, 0x0029D086, 0x0029D086, 0x00000003, 0x0029D084, 0x0029D084, + 0x02CBCA9F, 0x00000003, 0x0029D084, 0x0029D084, 0x02E1729F, 0x00000002, + 0x0029D086, 0x0029D286, 0x00000003, 0x0029D084, 0x0029D284, 0x02CBCA9F, + 0x00000003, 0x0029D084, 0x0029D284, 0x02E1729F, 0x00000002, 0x0029D086, + 0x0029D486, 0x00000003, 0x0029D084, 0x0029D484, 0x02CBCA9F, 0x00000003, + 0x0029D084, 0x0029D484, 0x02E1729F, 0x00000002, 0x0029D086, 0x0029D686, + 0x00000003, 0x0029D084, 0x0029D684, 0x02CBCA9F, 0x00000002, 0x0029D086, + 0x0029D886, 0x00000003, 0x0029D084, 0x0029D884, 0x02CBCA9F, 0x00000002, + 0x0029D086, 0x0029DA86, 0x00000003, 0x0029D084, 0x0029DA84, 0x02CBCA9F, + 0x00000002, 0x0029D086, 0x0029DC86, 0x00000003, + // Block 184, offset 0x2e00 + 0x0029D084, 0x0029DC84, 0x02CBCA9F, 0x00000002, 0x0029D086, 0x0029DE86, + 0x00000003, 0x0029D084, 0x0029DE84, 0x02CBCA9F, 0x00000002, 0x0029D084, + 0x02CBCA9F, 0x00000002, 0x0029D084, 0x02CE109F, 0x00000002, 0x0029D084, + 0x02E1729F, 0x00000002, 0x0029D284, 0x0002409F, 0x00000002, 0x0029D284, + 0x0002E49F, 0x00000002, 0x0029D286, 0x0029CC86, 0x00000003, 0x0029D284, + 0x0029CC84, 0x02CBCA9F, 0x00000002, 0x0029D286, 0x0029CE86, 0x00000003, + 0x0029D284, 0x0029CE84, 0x02CBCA9F, 0x00000002, 0x0029D286, 0x0029D086, + 0x00000002, 0x0029D286, 0x0029D286, 0x00000002, 0x0029D286, 0x0029D486, + 0x00000002, 0x0029D286, 0x0029D686, 0x00000002, 0x0029D286, 0x0029D886, + 0x00000002, 0x0029D286, 0x0029DA86, 0x00000002, 0x0029D286, 0x0029DC86, + 0x00000002, 0x0029D286, 0x0029DE86, 0x00000002, + // Block 185, offset 0x2e40 + 0x0029D284, 0x02CBCA9F, 0x00000002, 0x0029D284, 0x02CE109F, 0x00000002, + 0x0029D284, 0x02E1729F, 0x00000002, 0x0029D484, 0x0002409F, 0x00000002, + 0x0029D484, 0x0002E49F, 0x00000002, 0x0029D486, 0x0029CC86, 0x00000002, + 0x0029D486, 0x0029CE86, 0x00000002, 0x0029D486, 0x0029D086, 0x00000002, + 0x0029D486, 0x0029D286, 0x00000002, 0x0029D486, 0x0029D486, 0x00000002, + 0x0029D486, 0x0029D686, 0x00000002, 0x0029D486, 0x0029D886, 0x00000002, + 0x0029D486, 0x0029DA86, 0x00000002, 0x0029D486, 0x0029DC86, 0x00000002, + 0x0029D486, 0x0029DE86, 0x00000002, 0x0029D484, 0x02CBCA9F, 0x00000002, + 0x0029D484, 0x02CE109F, 0x00000002, 0x0029D484, 0x02E1729F, 0x00000002, + 0x0029D684, 0x0002409F, 0x00000002, 0x0029D684, 0x0002E49F, 0x00000002, + 0x0029D686, 0x0029CC86, 0x00000002, 0x0029D684, + // Block 186, offset 0x2e80 + 0x02CBCA9F, 0x00000002, 0x0029D684, 0x02CE109F, 0x00000002, 0x0029D684, + 0x02E1729F, 0x00000002, 0x0029D884, 0x0002409F, 0x00000002, 0x0029D884, + 0x0002E49F, 0x00000002, 0x0029D884, 0x02CBCA9F, 0x00000002, 0x0029D884, + 0x02CE109F, 0x00000002, 0x0029D884, 0x02E1729F, 0x00000002, 0x0029DA84, + 0x0002409F, 0x00000002, 0x0029DA84, 0x0002E49F, 0x00000002, 0x0029DA84, + 0x02CBCA9F, 0x00000002, 0x0029DA84, 0x02CE109F, 0x00000002, 0x0029DA84, + 0x02E1729F, 0x00000002, 0x0029DC84, 0x0002409F, 0x00000002, 0x0029DC84, + 0x0002E49F, 0x00000002, 0x0029DC84, 0x02CBCA9F, 0x00000002, 0x0029DC84, + 0x02CE109F, 0x00000002, 0x0029DC84, 0x02E1729F, 0x00000002, 0x0029DE84, + 0x0002409F, 0x00000002, 0x0029DE84, 0x0002E49F, 0x00000002, 0x0029DE84, + 0x02CBCA9F, 0x00000002, 0x0029DE84, 0x02CE109F, + // Block 187, offset 0x2ec0 + 0x00000002, 0x0029DE84, 0x02E1729F, 0x00000002, 0x002BDE9D, 0x00306C9D, + 0x00000002, 0x002BDE84, 0x0031E284, 0x00000002, 0x402C1820, 0xA0105402, + 0x00000002, 0x402C1A20, 0xA0105402, 0x00000002, 0x402C1C20, 0xA0105402, + 0x00000002, 0x402C2220, 0xAE603202, 0x00000002, 0x402C2220, 0xAE603502, + 0x00000002, 0x402C2220, 0xAE603702, 0x00000003, 0x402C2220, 0xAE603702, + 0xAE603202, 0x00000003, 0x402C2220, 0xAE603702, 0xAE603502, 0x00000003, + 0x402C2220, 0xAE603702, 0xAE604E02, 0x00000003, 0x402C2220, 0xAE603702, + 0xAE606402, 0x00000002, 0x402C2220, 0xAE603C02, 0x00000003, 0x402C2220, + 0xAE603C02, 0xAE603202, 0x00000003, 0x402C2220, 0xAE603C02, 0xAE603502, + 0x00000003, 0x402C2220, 0xAE603C02, 0xAE604E02, 0x00000003, 0x402C2220, + 0xAE603C02, 0xAE606402, 0x00000002, 0x402C2220, + // Block 188, offset 0x2f00 + 0xAE604102, 0x00000002, 0x402C2220, 0xAE604302, 0x00000003, 0x402C2220, + 0xAE604302, 0xAE603202, 0x00000002, 0x402C2220, 0xAE604702, 0x00000003, + 0x402C2220, 0xAE604702, 0xAE605B02, 0x00000002, 0x402C2220, 0xAE604E02, + 0x00000002, 0x402C2220, 0xAE605202, 0x00000003, 0x402C2220, 0xAE605202, + 0xAE605B02, 0x00000002, 0x402C2220, 0xACA05902, 0x00000002, 0x402C2220, + 0xAE605B02, 0x00000002, 0x402C2220, 0xAE606402, 0x00000002, 0x402C2220, + 0xAE606502, 0x00000002, 0x402C2220, 0xAE606702, 0x00000002, 0x402C2220, + 0xADC07002, 0x00000003, 0x402C2220, 0xADC07002, 0xAE603702, 0x00000003, + 0x402C2220, 0xADC07002, 0xAE603C02, 0x00000002, 0x402C2220, 0xADC07602, + 0x00000002, 0x402C2420, 0xAE605202, 0x00000002, 0x402C2420, 0xADC07002, + 0x00000002, 0x402C2420, 0xADC07B02, 0x00000002, + // Block 189, offset 0x2f40 + 0x402C2620, 0xAE603202, 0x00000002, 0x402C2620, 0xAE603C02, 0x00000002, + 0x402C2620, 0xAE604102, 0x00000002, 0x402C2620, 0xAE605202, 0x00000002, + 0x402C2620, 0xACA05602, 0x00000003, 0x402C2620, 0xACA05602, 0xAE603202, + 0x00000002, 0x402C2820, 0xAE604102, 0x00000002, 0x402C2820, 0xAE605202, + 0x00000002, 0x402C2820, 0xACA05602, 0x00000002, 0x402C2820, 0xADC07002, + 0x00000002, 0x402C2820, 0xADC07802, 0x00000002, 0x402C2820, 0xADC07B02, + 0x00000002, 0x402C2A20, 0xAE603202, 0x00000002, 0x402C2A20, 0xAE603502, + 0x00000002, 0x402C2A20, 0xAE603702, 0x00000002, 0x402C2A20, 0xAE603C02, + 0x00000003, 0x402C2A20, 0xAE603C02, 0xAE603202, 0x00000003, 0x402C2A20, + 0xAE603C02, 0xAE603502, 0x00000003, 0x402C2A20, 0xAE603C02, 0xAE604E02, + 0x00000003, 0x402C2A20, 0xAE603C02, 0xAE606402, + // Block 190, offset 0x2f80 + 0x00000002, 0x402C2A20, 0xAE604102, 0x00000002, 0x402C2A20, 0xAE604702, + 0x00000002, 0x402C2A20, 0xAE604E02, 0x00000002, 0x402C2A20, 0xAE605202, + 0x00000002, 0x402C2A20, 0xACA05602, 0x00000003, 0x402C2A20, 0xACA05602, + 0xAE603702, 0x00000002, 0x402C2A20, 0xACA05902, 0x00000002, 0x402C2A20, + 0xAE605B02, 0x00000003, 0x402C2A20, 0xAE605B02, 0xAE603202, 0x00000003, + 0x402C2A20, 0xAE605B02, 0xAE603502, 0x00000002, 0x402C2A20, 0xAE606402, + 0x00000002, 0x402C2A20, 0xAE606502, 0x00000002, 0x402C2A20, 0xAE606702, + 0x00000002, 0x402C2A20, 0xADC07002, 0x00000003, 0x402C2A20, 0xADC07002, + 0xAE603C02, 0x00000002, 0x402C2A20, 0xADC07802, 0x00000002, 0x402C2A20, + 0xADC07A02, 0x00000002, 0x402C2C20, 0xAE605202, 0x00000002, 0x402C2E20, + 0xAE603202, 0x00000002, 0x402C2E20, 0xAE603702, + // Block 191, offset 0x2fc0 + 0x00000002, 0x402C2E20, 0xAE603C02, 0x00000002, 0x402C2E20, 0xAE604102, + 0x00000002, 0x402C2E20, 0xAE605202, 0x00000002, 0x402C2E20, 0xACA05602, + 0x00000002, 0x402C2E20, 0xAE605B02, 0x00000002, 0x402C3020, 0xAE603C02, + 0x00000002, 0x402C3020, 0xAE604102, 0x00000002, 0x402C3020, 0xAE604702, + 0x00000002, 0x402C3020, 0xAE605202, 0x00000002, 0x402C3020, 0xACA05602, + 0x00000002, 0x402C3020, 0xADC07002, 0x00000002, 0x402C3020, 0xADC07902, + 0x00000002, 0x402C3220, 0xAE603202, 0x00000002, 0x402C3220, 0xAE603502, + 0x00000002, 0x402C3220, 0xAE603702, 0x00000002, 0x402C3220, 0xAE603C02, + 0x00000002, 0x402C3220, 0xAE604102, 0x00000002, 0x402C3220, 0xAE604702, + 0x00000003, 0x402C3220, 0xAE604702, 0xAE603202, 0x00000002, 0x402C3220, + 0xAE604E02, 0x00000002, 0x402C3220, 0xAE605202, + // Block 192, offset 0x3000 + 0x00000002, 0x402C3220, 0xACA05902, 0x00000002, 0x402C3220, 0xAE605B02, + 0x00000002, 0x402C3220, 0xAE606402, 0x00000002, 0x402C3220, 0xAE606502, + 0x00000002, 0x402C3220, 0xAE606702, 0x00000002, 0x402C3220, 0xADC07002, + 0x00000002, 0x402C3220, 0xADC07A02, 0x00000002, 0x402C3420, 0xAE603C02, + 0x00000002, 0x402C3620, 0xAE603202, 0x00000002, 0x402C3620, 0xAE604102, + 0x00000002, 0x402C3620, 0xACA05602, 0x00000002, 0x402C3620, 0xADC07002, + 0x00000002, 0x402C3620, 0xADC07B02, 0x00000002, 0x402C3820, 0xAE603202, + 0x00000002, 0x402C3820, 0xAE604102, 0x00000002, 0x402C3820, 0xACA05602, + 0x00000002, 0x402C3820, 0xADC07002, 0x00000003, 0x402C3820, 0xADC07002, + 0xAE605B02, 0x00000002, 0x402C3820, 0xADC07802, 0x00000002, 0x402C3820, + 0xADC07B02, 0x00000002, 0x402C3A20, 0xAE603202, + // Block 193, offset 0x3040 + 0x00000002, 0x402C3A20, 0xAE605202, 0x00000002, 0x402C3A20, 0xADC07002, + 0x00000002, 0x002C3A9C, 0x002C3A9C, 0x00000002, 0x002C3A8C, 0x002C628C, + 0x00000002, 0x002C3A9C, 0x002C629C, 0x00000002, 0x002C3A9C, 0x002E829C, + 0x00000002, 0x402C3C20, 0xAE603202, 0x00000002, 0x402C3C20, 0xAE603502, + 0x00000002, 0x402C3C20, 0xAE604102, 0x00000002, 0x402C3C20, 0xAE604E02, + 0x00000002, 0x402C3C20, 0xAE605202, 0x00000002, 0x402C3C20, 0xACA05602, + 0x00000002, 0x402C3C20, 0xADC07002, 0x00000002, 0x402C3C20, 0xADC07802, + 0x00000002, 0x402C3C20, 0xADC07B02, 0x00000002, 0x402C3E20, 0xAE603202, + 0x00000002, 0x402C3E20, 0xAE603502, 0x00000002, 0x402C3E20, 0xAE603702, + 0x00000002, 0x402C3E20, 0xAE603C02, 0x00000003, 0x402C3E20, 0xAE603C02, + 0xAE603202, 0x00000003, 0x402C3E20, 0xAE603C02, + // Block 194, offset 0x3080 + 0xAE603502, 0x00000003, 0x402C3E20, 0xAE603C02, 0xAE604E02, 0x00000003, + 0x402C3E20, 0xAE603C02, 0xAE606402, 0x00000002, 0x402C3E20, 0xAE604102, + 0x00000002, 0x402C3E20, 0xAE604702, 0x00000003, 0x402C3E20, 0xAE604702, + 0xAE605B02, 0x00000002, 0x402C3E20, 0xAE604D02, 0x00000002, 0x402C3E20, + 0xAE604E02, 0x00000003, 0x402C3E20, 0xAE604E02, 0xAE603202, 0x00000003, + 0x402C3E20, 0xAE604E02, 0xAE604702, 0x00000003, 0x402C3E20, 0xAE604E02, + 0xAE605B02, 0x00000002, 0x402C3E20, 0xAE605202, 0x00000003, 0x402C3E20, + 0xAE605202, 0xAE605B02, 0x00000002, 0x402C3E20, 0xACA05902, 0x00000003, + 0x402C3E20, 0xACA05902, 0xAE605B02, 0x00000002, 0x402C3E20, 0xAE605B02, + 0x00000003, 0x402C3E20, 0xAE605B02, 0xAE603202, 0x00000003, 0x402C3E20, + 0xAE605B02, 0xAE603502, 0x00000002, 0x402C3E20, + // Block 195, offset 0x30c0 + 0xAE606402, 0x00000002, 0x402C3E20, 0xAE606502, 0x00000002, 0x402C3E20, + 0xAE606702, 0x00000002, 0x402C3E20, 0xAD806802, 0x00000003, 0x402C3E20, + 0xAD806802, 0xAE603202, 0x00000003, 0x402C3E20, 0xAD806802, 0xAE603502, + 0x00000003, 0x402C3E20, 0xAD806802, 0xAE604E02, 0x00000003, 0x402C3E20, + 0xAD806802, 0xAE606402, 0x00000003, 0x402C3E20, 0xAD806802, 0xADC07002, + 0x00000002, 0x402C3E20, 0xADC07002, 0x00000003, 0x402C3E20, 0xADC07002, + 0xAE603C02, 0x00000002, 0x402C4020, 0xAE603202, 0x00000002, 0x402C4020, + 0xAE605202, 0x00000002, 0x402C4420, 0xAE603202, 0x00000002, 0x402C4420, + 0xAE604102, 0x00000002, 0x402C4420, 0xAE605202, 0x00000002, 0x402C4420, + 0xACA05602, 0x00000002, 0x402C4420, 0xAE606502, 0x00000002, 0x402C4420, + 0xAE606702, 0x00000002, 0x402C4420, 0xADC07002, + // Block 196, offset 0x3100 + 0x00000003, 0x402C4420, 0xADC07002, 0xAE605B02, 0x00000002, 0x402C4420, + 0xADC07B02, 0x00000002, 0x402C4620, 0xAE603202, 0x00000003, 0x402C4620, + 0xAE603202, 0xAE605202, 0x00000002, 0x402C4620, 0xAE603C02, 0x00000002, + 0x402C4620, 0xAE604102, 0x00000003, 0x402C4620, 0xAE604102, 0xAE605202, + 0x00000002, 0x402C4620, 0xAE605202, 0x00000002, 0x402C4620, 0xACA05602, + 0x00000002, 0x402C4620, 0xADC07002, 0x00000003, 0x402C4620, 0xADC07002, + 0xAE605202, 0x00000002, 0x402C4620, 0xADC07702, 0x00000002, 0x402C4820, + 0xAE604102, 0x00000002, 0x402C4820, 0xAE605202, 0x00000002, 0x402C4820, + 0xACA05602, 0x00000002, 0x402C4820, 0xADC07002, 0x00000002, 0x402C4820, + 0xADC07702, 0x00000002, 0x402C4820, 0xADC07802, 0x00000002, 0x402C4820, + 0xADC07B02, 0x00000002, 0x402C4A20, 0xAE603202, + // Block 197, offset 0x3140 + 0x00000002, 0x402C4A20, 0xAE603502, 0x00000002, 0x402C4A20, 0xAE603702, + 0x00000002, 0x402C4A20, 0xAE603C02, 0x00000002, 0x402C4A20, 0xAE604102, + 0x00000002, 0x402C4A20, 0xAE604302, 0x00000002, 0x402C4A20, 0xAE604702, + 0x00000003, 0x402C4A20, 0xAE604702, 0xAE603202, 0x00000003, 0x402C4A20, + 0xAE604702, 0xAE603502, 0x00000003, 0x402C4A20, 0xAE604702, 0xAE604102, + 0x00000003, 0x402C4A20, 0xAE604702, 0xAE605B02, 0x00000002, 0x402C4A20, + 0xAE604D02, 0x00000002, 0x402C4A20, 0xAE604E02, 0x00000003, 0x402C4A20, + 0xAE604E02, 0xAE603202, 0x00000002, 0x402C4A20, 0xACA05902, 0x00000002, + 0x402C4A20, 0xAE605B02, 0x00000003, 0x402C4A20, 0xAE605B02, 0xAE604702, + 0x00000002, 0x402C4A20, 0xAE606402, 0x00000002, 0x402C4A20, 0xAE606502, + 0x00000002, 0x402C4A20, 0xAE606702, 0x00000002, + // Block 198, offset 0x3180 + 0x402C4A20, 0xAD806802, 0x00000003, 0x402C4A20, 0xAD806802, 0xAE603202, + 0x00000003, 0x402C4A20, 0xAD806802, 0xAE603502, 0x00000003, 0x402C4A20, + 0xAD806802, 0xAE604E02, 0x00000003, 0x402C4A20, 0xAD806802, 0xAE606402, + 0x00000003, 0x402C4A20, 0xAD806802, 0xADC07002, 0x00000002, 0x402C4A20, + 0xADC07002, 0x00000002, 0x402C4A20, 0xADC07502, 0x00000002, 0x402C4A20, + 0xADC07802, 0x00000002, 0x402C4A20, 0xADC07A02, 0x00000002, 0x402C4C20, + 0xAE604E02, 0x00000002, 0x402C4C20, 0xADC07002, 0x00000002, 0x402C4E20, + 0xAE603202, 0x00000002, 0x402C4E20, 0xAE603502, 0x00000002, 0x402C4E20, + 0xAE603C02, 0x00000002, 0x402C4E20, 0xAE604702, 0x00000002, 0x402C4E20, + 0xAE605202, 0x00000002, 0x402C4E20, 0xADC07002, 0x00000002, 0x402C5020, + 0xAE604702, 0x00000002, 0x402C5020, 0xAE605202, + // Block 199, offset 0x31c0 + 0x00000002, 0x402C5220, 0xAE603202, 0x00000002, 0x402C5220, 0xAE603502, + 0x00000002, 0x402C5220, 0xAE603C02, 0x00000002, 0x402C5220, 0xAE604702, + 0x00000002, 0x402C5220, 0xAE604E02, 0x00000002, 0x402C5220, 0xAE605202, + 0x00000002, 0x402C5220, 0xAE605B02, 0x00000002, 0x402C5220, 0xAE606402, + 0x00000002, 0x402C5220, 0xADC07002, 0x00000002, 0x402C5420, 0xAE603202, + 0x00000002, 0x402C5420, 0xAE603C02, 0x00000002, 0x402C5420, 0xAE604102, + 0x00000002, 0x402C5420, 0xAE605202, 0x00000002, 0x402C5420, 0xADC07002, + 0x00000002, 0x402C5420, 0xADC07B02, 0x00000002, 0x402C6220, 0xAE603202, + 0x00000002, 0x402C6220, 0xAE603502, 0x00000002, 0x402C6220, 0xAE603702, + 0x00000003, 0x402C6220, 0xAE603702, 0xAE603202, 0x00000003, 0x402C6220, + 0xAE603702, 0xAE603502, 0x00000003, 0x402C6220, + // Block 200, offset 0x3200 + 0xAE603702, 0xAE604E02, 0x00000003, 0x402C6220, 0xAE603702, 0xAE606402, + 0x00000002, 0x402C6220, 0xAE603C02, 0x00000003, 0x402C6220, 0xAE603C02, + 0xAE603202, 0x00000003, 0x402C6220, 0xAE603C02, 0xAE603502, 0x00000003, + 0x402C6220, 0xAE603C02, 0xAE604E02, 0x00000003, 0x402C6220, 0xAE603C02, + 0xAE606402, 0x00000002, 0x402C6220, 0xAE604102, 0x00000002, 0x402C6220, + 0xAE604302, 0x00000003, 0x402C6220, 0xAE604302, 0xAE603202, 0x00000002, + 0x402C6220, 0xAE604702, 0x00000003, 0x402C6220, 0xAE604702, 0xAE605B02, + 0x00000002, 0x402C6220, 0xAE604E02, 0x00000002, 0x402C6220, 0xAE605202, + 0x00000003, 0x402C6220, 0xAE605202, 0xAE605B02, 0x00000002, 0x402C6220, + 0xACA05902, 0x00000002, 0x402C6220, 0xAE605B02, 0x00000002, 0x402C6220, + 0xAE606402, 0x00000002, 0x402C6220, 0xAE606502, + // Block 201, offset 0x3240 + 0x00000002, 0x402C6220, 0xAE606702, 0x00000002, 0x402C6220, 0xADC07002, + 0x00000003, 0x402C6220, 0xADC07002, 0xAE603702, 0x00000003, 0x402C6220, + 0xADC07002, 0xAE603C02, 0x00000002, 0x402C6220, 0xADC07602, 0x00000002, + 0x002C629C, 0x002BDE9C, 0x00000002, 0x002C629C, 0x002C0A9D, 0x00000002, + 0x002C629D, 0x002DCC9D, 0x00000002, 0x002C629C, 0x002E229C, 0x00000002, + 0x002C629C, 0x002E829C, 0x00000002, 0x002C6284, 0x00312A84, 0x00000002, + 0x002C628A, 0x00312A84, 0x00000002, 0x002C628A, 0x00312A8A, 0x00000002, + 0x402C6420, 0xAE605202, 0x00000002, 0x402C6420, 0xADC07002, 0x00000002, + 0x402C6420, 0xADC07B02, 0x00000002, 0x402C6620, 0xAE603202, 0x00000002, + 0x402C6620, 0xAE603C02, 0x00000002, 0x402C6620, 0xAE604102, 0x00000002, + 0x402C6620, 0xAE605202, 0x00000002, 0x402C6620, + // Block 202, offset 0x3280 + 0xACA05602, 0x00000003, 0x402C6620, 0xACA05602, 0xAE603202, 0x00000002, + 0x402C6820, 0xAE604102, 0x00000002, 0x402C6820, 0xAE605202, 0x00000002, + 0x402C6820, 0xACA05602, 0x00000002, 0x402C6820, 0xADC07002, 0x00000002, + 0x402C6820, 0xADC07802, 0x00000002, 0x402C6820, 0xADC07B02, 0x00000002, + 0x402C6A20, 0xAE603202, 0x00000002, 0x402C6A20, 0xAE603502, 0x00000002, + 0x402C6A20, 0xAE603702, 0x00000002, 0x402C6A20, 0xAE603C02, 0x00000003, + 0x402C6A20, 0xAE603C02, 0xAE603202, 0x00000003, 0x402C6A20, 0xAE603C02, + 0xAE603502, 0x00000003, 0x402C6A20, 0xAE603C02, 0xAE604E02, 0x00000003, + 0x402C6A20, 0xAE603C02, 0xAE606402, 0x00000002, 0x402C6A20, 0xAE604102, + 0x00000002, 0x402C6A20, 0xAE604702, 0x00000002, 0x402C6A20, 0xAE604E02, + 0x00000002, 0x402C6A20, 0xAE605202, 0x00000002, + // Block 203, offset 0x32c0 + 0x402C6A20, 0xACA05602, 0x00000003, 0x402C6A20, 0xACA05602, 0xAE603702, + 0x00000002, 0x402C6A20, 0xACA05902, 0x00000002, 0x402C6A20, 0xAE605B02, + 0x00000003, 0x402C6A20, 0xAE605B02, 0xAE603202, 0x00000003, 0x402C6A20, + 0xAE605B02, 0xAE603502, 0x00000002, 0x402C6A20, 0xAE606402, 0x00000002, + 0x402C6A20, 0xAE606502, 0x00000002, 0x402C6A20, 0xAE606702, 0x00000002, + 0x402C6A20, 0xADC07002, 0x00000003, 0x402C6A20, 0xADC07002, 0xAE603C02, + 0x00000002, 0x402C6A20, 0xADC07802, 0x00000002, 0x402C6A20, 0xADC07A02, + 0x00000002, 0x402C6C20, 0xAE605202, 0x00000002, 0x402C6E20, 0xAE603202, + 0x00000002, 0x402C6E20, 0xAE603702, 0x00000002, 0x402C6E20, 0xAE603C02, + 0x00000002, 0x402C6E20, 0xAE604102, 0x00000002, 0x402C6E20, 0xAE605202, + 0x00000002, 0x402C6E20, 0xACA05602, 0x00000002, + // Block 204, offset 0x3300 + 0x402C6E20, 0xAE605B02, 0x00000002, 0x402C7020, 0xAE603C02, 0x00000002, + 0x402C7020, 0xAE604102, 0x00000002, 0x402C7020, 0xAE604702, 0x00000002, + 0x402C7020, 0xAE605202, 0x00000002, 0x402C7020, 0xACA05602, 0x00000002, + 0x402C7020, 0xADC07002, 0x00000002, 0x402C7020, 0xADC07902, 0x00000002, + 0x402C7020, 0xADC07B02, 0x00000002, 0x402C7220, 0xAE603202, 0x00000002, + 0x402C7220, 0xAE603502, 0x00000002, 0x402C7220, 0xAE603702, 0x00000002, + 0x402C7220, 0xAE603C02, 0x00000002, 0x402C7220, 0xAE604102, 0x00000002, + 0x402C7220, 0xAE604702, 0x00000003, 0x402C7220, 0xAE604702, 0xAE603202, + 0x00000002, 0x402C7220, 0xAE604E02, 0x00000002, 0x402C7220, 0xACA05902, + 0x00000002, 0x402C7220, 0xAE605B02, 0x00000002, 0x402C7220, 0xAE606402, + 0x00000002, 0x402C7220, 0xAE606502, 0x00000002, + // Block 205, offset 0x3340 + 0x402C7220, 0xAE606702, 0x00000002, 0x402C7220, 0xADC07002, 0x00000002, + 0x402C7220, 0xADC07A02, 0x00000002, 0x402C7420, 0xAE603C02, 0x00000002, + 0x402C7420, 0xAE604102, 0x00000002, 0x402C7620, 0xAE603202, 0x00000002, + 0x402C7620, 0xAE604102, 0x00000002, 0x402C7620, 0xACA05602, 0x00000002, + 0x402C7620, 0xADC07002, 0x00000002, 0x402C7620, 0xADC07B02, 0x00000002, + 0x402C7820, 0xAE603202, 0x00000002, 0x402C7820, 0xAE604102, 0x00000002, + 0x402C7820, 0xACA05602, 0x00000002, 0x402C7820, 0xADC07002, 0x00000003, + 0x402C7820, 0xADC07002, 0xAE605B02, 0x00000002, 0x402C7820, 0xADC07802, + 0x00000002, 0x402C7820, 0xADC07B02, 0x00000002, 0x402C7A20, 0xAE603202, + 0x00000002, 0x402C7A20, 0xAE605202, 0x00000002, 0x402C7A20, 0xADC07002, + 0x00000002, 0x402C7C20, 0xAE603202, 0x00000002, + // Block 206, offset 0x3380 + 0x402C7C20, 0xAE603502, 0x00000002, 0x402C7C20, 0xAE604102, 0x00000002, + 0x402C7C20, 0xAE604E02, 0x00000002, 0x402C7C20, 0xAE605202, 0x00000002, + 0x402C7C20, 0xACA05602, 0x00000002, 0x402C7C20, 0xADC07002, 0x00000002, + 0x402C7C20, 0xADC07802, 0x00000002, 0x402C7C20, 0xADC07B02, 0x00000002, + 0x402C7E20, 0xAE603202, 0x00000002, 0x402C7E20, 0xAE603502, 0x00000002, + 0x402C7E20, 0xAE603702, 0x00000002, 0x402C7E20, 0xAE603C02, 0x00000003, + 0x402C7E20, 0xAE603C02, 0xAE603202, 0x00000003, 0x402C7E20, 0xAE603C02, + 0xAE603502, 0x00000003, 0x402C7E20, 0xAE603C02, 0xAE604E02, 0x00000003, + 0x402C7E20, 0xAE603C02, 0xAE606402, 0x00000002, 0x402C7E20, 0xAE604102, + 0x00000002, 0x402C7E20, 0xAE604702, 0x00000003, 0x402C7E20, 0xAE604702, + 0xAE605B02, 0x00000002, 0x402C7E20, 0xAE604D02, + // Block 207, offset 0x33c0 + 0x00000002, 0x402C7E20, 0xAE604E02, 0x00000003, 0x402C7E20, 0xAE604E02, + 0xAE603202, 0x00000003, 0x402C7E20, 0xAE604E02, 0xAE604702, 0x00000003, + 0x402C7E20, 0xAE604E02, 0xAE605B02, 0x00000002, 0x402C7E20, 0xAE605202, + 0x00000003, 0x402C7E20, 0xAE605202, 0xAE605B02, 0x00000002, 0x402C7E20, + 0xACA05902, 0x00000003, 0x402C7E20, 0xACA05902, 0xAE605B02, 0x00000002, + 0x402C7E20, 0xAE605B02, 0x00000003, 0x402C7E20, 0xAE605B02, 0xAE603202, + 0x00000003, 0x402C7E20, 0xAE605B02, 0xAE603502, 0x00000002, 0x402C7E20, + 0xAE606402, 0x00000002, 0x402C7E20, 0xAE606502, 0x00000002, 0x402C7E20, + 0xAE606702, 0x00000002, 0x402C7E20, 0xAD806802, 0x00000003, 0x402C7E20, + 0xAD806802, 0xAE603202, 0x00000003, 0x402C7E20, 0xAD806802, 0xAE603502, + 0x00000003, 0x402C7E20, 0xAD806802, 0xAE604E02, + // Block 208, offset 0x3400 + 0x00000003, 0x402C7E20, 0xAD806802, 0xAE606402, 0x00000003, 0x402C7E20, + 0xAD806802, 0xADC07002, 0x00000002, 0x402C7E20, 0xADC07002, 0x00000003, + 0x402C7E20, 0xADC07002, 0xAE603C02, 0x00000002, 0x402C8020, 0xAE603202, + 0x00000002, 0x402C8020, 0xAE605202, 0x00000002, 0x402C8420, 0xAE603202, + 0x00000002, 0x402C8420, 0xAE604102, 0x00000002, 0x402C8420, 0xAE605202, + 0x00000002, 0x402C8420, 0xACA05602, 0x00000002, 0x402C8420, 0xAE606502, + 0x00000002, 0x402C8420, 0xAE606702, 0x00000002, 0x402C8420, 0xADC07002, + 0x00000003, 0x402C8420, 0xADC07002, 0xAE605B02, 0x00000002, 0x402C8420, + 0xADC07B02, 0x00000002, 0x402C8620, 0xAE603202, 0x00000003, 0x402C8620, + 0xAE603202, 0xAE605202, 0x00000002, 0x402C8620, 0xAE603C02, 0x00000002, + 0x402C8620, 0xAE604102, 0x00000003, 0x402C8620, + // Block 209, offset 0x3440 + 0xAE604102, 0xAE605202, 0x00000002, 0x402C8620, 0xAE605202, 0x00000002, + 0x402C8620, 0xACA05602, 0x00000002, 0x402C8620, 0xADC07002, 0x00000003, + 0x402C8620, 0xADC07002, 0xAE605202, 0x00000002, 0x402C8620, 0xADC07702, + 0x00000002, 0x402C8820, 0xAE604102, 0x00000002, 0x402C8820, 0xAE604702, + 0x00000002, 0x402C8820, 0xAE605202, 0x00000002, 0x402C8820, 0xACA05602, + 0x00000002, 0x402C8820, 0xADC07002, 0x00000002, 0x402C8820, 0xADC07702, + 0x00000002, 0x402C8820, 0xADC07802, 0x00000002, 0x402C8820, 0xADC07B02, + 0x00000002, 0x402C8A20, 0xAE603202, 0x00000002, 0x402C8A20, 0xAE603502, + 0x00000002, 0x402C8A20, 0xAE603702, 0x00000002, 0x402C8A20, 0xAE603C02, + 0x00000002, 0x402C8A20, 0xAE604102, 0x00000002, 0x402C8A20, 0xAE604302, + 0x00000002, 0x402C8A20, 0xAE604702, 0x00000003, + // Block 210, offset 0x3480 + 0x402C8A20, 0xAE604702, 0xAE603202, 0x00000003, 0x402C8A20, 0xAE604702, + 0xAE603502, 0x00000003, 0x402C8A20, 0xAE604702, 0xAE604102, 0x00000003, + 0x402C8A20, 0xAE604702, 0xAE605B02, 0x00000002, 0x402C8A20, 0xAE604D02, + 0x00000002, 0x402C8A20, 0xAE604E02, 0x00000003, 0x402C8A20, 0xAE604E02, + 0xAE603202, 0x00000002, 0x402C8A20, 0xACA05902, 0x00000002, 0x402C8A20, + 0xAE605B02, 0x00000003, 0x402C8A20, 0xAE605B02, 0xAE604702, 0x00000002, + 0x402C8A20, 0xAE606402, 0x00000002, 0x402C8A20, 0xAE606502, 0x00000002, + 0x402C8A20, 0xAE606702, 0x00000002, 0x402C8A20, 0xAD806802, 0x00000003, + 0x402C8A20, 0xAD806802, 0xAE603202, 0x00000003, 0x402C8A20, 0xAD806802, + 0xAE603502, 0x00000003, 0x402C8A20, 0xAD806802, 0xAE604E02, 0x00000003, + 0x402C8A20, 0xAD806802, 0xAE606402, 0x00000003, + // Block 211, offset 0x34c0 + 0x402C8A20, 0xAD806802, 0xADC07002, 0x00000002, 0x402C8A20, 0xADC07002, + 0x00000002, 0x402C8A20, 0xADC07502, 0x00000002, 0x402C8A20, 0xADC07802, + 0x00000002, 0x402C8A20, 0xADC07A02, 0x00000002, 0x402C8C20, 0xAE604E02, + 0x00000002, 0x402C8C20, 0xADC07002, 0x00000002, 0x402C8E20, 0xAE603202, + 0x00000002, 0x402C8E20, 0xAE603502, 0x00000002, 0x402C8E20, 0xAE603C02, + 0x00000002, 0x402C8E20, 0xAE604302, 0x00000002, 0x402C8E20, 0xAE604702, + 0x00000002, 0x402C8E20, 0xAE605202, 0x00000002, 0x402C8E20, 0xADC07002, + 0x00000002, 0x402C9020, 0xAE604702, 0x00000002, 0x402C9020, 0xAE605202, + 0x00000002, 0x402C9220, 0xAE603202, 0x00000002, 0x402C9220, 0xAE603502, + 0x00000002, 0x402C9220, 0xAE603C02, 0x00000002, 0x402C9220, 0xAE604302, + 0x00000002, 0x402C9220, 0xAE604702, 0x00000002, + // Block 212, offset 0x3500 + 0x402C9220, 0xAE604E02, 0x00000002, 0x402C9220, 0xAE605202, 0x00000002, + 0x402C9220, 0xAE605B02, 0x00000002, 0x402C9220, 0xAE606402, 0x00000002, + 0x402C9220, 0xADC07002, 0x00000002, 0x402C9420, 0xAE603202, 0x00000002, + 0x402C9420, 0xAE603C02, 0x00000002, 0x402C9420, 0xAE604102, 0x00000002, + 0x402C9420, 0xAE605202, 0x00000002, 0x402C9420, 0xADC07002, 0x00000002, + 0x402C9420, 0xADC07B02, 0x00000002, 0x002D0884, 0x002D0884, 0x00000002, + 0x002D0884, 0x002E2284, 0x00000002, 0x002D089C, 0x002E829C, 0x00000002, + 0x002D229D, 0x002C0A9D, 0x00000002, 0x002D229D, 0x0031009C, 0x00000002, + 0x002E2284, 0x002DCC84, 0x00000002, 0x002E228A, 0x002DCC84, 0x00000002, + 0x002E228A, 0x002DCC8A, 0x00000002, 0x002E229C, 0x002E829C, 0x00000002, + 0x002E229C, 0x002E9E9C, 0x00000002, 0x002E829C, + // Block 213, offset 0x3540 + 0x0029D09C, 0x00000002, 0x002E829C, 0x0029D29C, 0x00000002, 0x002E829C, + 0x002BDE9D, 0x00000002, 0x002E829C, 0x002C0A9C, 0x00000002, 0x002E829D, + 0x002C0A9D, 0x00000002, 0x002E8294, 0x002C3A94, 0x00000002, 0x002E8294, + 0x002C6294, 0x00000002, 0x002E829C, 0x002D229C, 0x00000002, 0x002E829C, + 0x002E229C, 0x00000002, 0x002E829C, 0x002E829C, 0x00000002, 0x002E829C, + 0x0030BE9D, 0x00000002, 0x002E829D, 0x0030BE9D, 0x00000002, 0x002E829D, + 0x0030BE9D, 0x00000002, 0x002E829C, 0x0030E29D, 0x00000002, 0x002E829D, + 0x0030E29D, 0x00000002, 0x002E829D, 0x0032A29D, 0x00000002, 0x002E9E9C, + 0x002BDE9D, 0x00000002, 0x002E9E9C, 0x002D089D, 0x00000002, 0x002E9E84, + 0x002DCC84, 0x00000002, 0x002E9E8A, 0x002DCC84, 0x00000002, 0x002E9E8A, + 0x002DCC8A, 0x00000002, 0x002E9E9C, 0x002E829C, + // Block 214, offset 0x3580 + 0x00000002, 0x002E9E9C, 0x0030BE9D, 0x00000002, 0x002E9E9C, 0x0030E29D, + 0x00000002, 0x002F2C9C, 0x002BDE9D, 0x00000002, 0x002F2C9D, 0x002BDE9C, + 0x00000002, 0x002F2C9C, 0x002C3A9C, 0x00000002, 0x002F2C9C, 0x002D089D, + 0x00000002, 0x002F2C9C, 0x0030BE9D, 0x00000002, 0x002F2C9C, 0x0030E29D, + 0x00000002, 0x0030E29D, 0x002C0A9C, 0x00000002, 0x0030E29D, 0x002C3A9D, + 0x00000002, 0x0030E28C, 0x00312A8C, 0x00000002, 0x0031DE84, 0x002E9E84, + 0x00000002, 0x0032769C, 0x002BDE9D, 0x00000002, 0x0032769C, 0x002D089D, + 0x00000002, 0x0032769C, 0x002D229C, 0x00000002, 0x0032769C, 0x002E229C, + 0x00000002, 0x0032769C, 0x002E829C, 0x00000002, 0x0032769C, 0x0030BE9D, + 0x00000002, 0x0032769C, 0x0030E29D, 0x00000002, 0x40302620, 0xAE605202, + 0x00000002, 0x00302683, 0xAE605202, 0x00000002, + // Block 215, offset 0x35c0 + 0x40302820, 0xAE603202, 0x00000002, 0x00302883, 0xAE603202, 0x00000002, + 0x40302820, 0xAE603C02, 0x00000002, 0x00302883, 0xAE603C02, 0x00000002, + 0x40302820, 0xAE605202, 0x00000002, 0x00302883, 0xAE605202, 0x00000002, + 0x40302820, 0xADC07002, 0x00000002, 0x00302883, 0xADC07002, 0x00000002, + 0x40302820, 0xADC07B02, 0x00000002, 0x00302883, 0xADC07B02, 0x00000002, + 0x4030BE21, 0xAE603202, 0x00000002, 0x0030BEA3, 0xAE603202, 0x00000002, + 0x4030BE21, 0xAE603502, 0x00000002, 0x0030BEA3, 0xAE603502, 0x00000002, + 0x4030BE21, 0xAE603C02, 0x00000002, 0x0030BEA3, 0xAE603C02, 0x00000002, + 0x4030BE21, 0xAE604302, 0x00000002, 0x4030BE21, 0xAE604702, 0x00000002, + 0x0030BEA3, 0xAE604702, 0x00000002, 0x4030BE21, 0xAE605202, 0x00000002, + 0x0030BEA3, 0xAE605202, 0x00000002, 0x4030BE21, + // Block 216, offset 0x3600 + 0xADC07002, 0x00000002, 0x0030BEA3, 0xADC07002, 0x00000002, 0x4030EE20, + 0xAE603202, 0x00000002, 0x0030EE83, 0xAE603202, 0x00000002, 0x4030EE20, + 0xAE603C02, 0x00000002, 0x0030EE83, 0xAE603C02, 0x00000002, 0x4030EE20, + 0xAE604702, 0x00000002, 0x0030EE83, 0xAE604702, 0x00000002, 0x4030EE20, + 0xAE605B02, 0x00000002, 0x0030EE83, 0xAE605B02, 0x00000002, 0x4030EE20, + 0xAD806802, 0x00000002, 0x0030EE83, 0xAD806802, 0x00000002, 0x4030F020, + 0xAE605B02, 0x00000002, 0x0030F083, 0xAE605B02, 0x00000002, 0x4030F220, + 0xAE605B02, 0x00000002, 0x0030F283, 0xAE605B02, 0x00000002, 0x4030F420, + 0xAE603202, 0x00000002, 0x0030F483, 0xAE603202, 0x00000002, 0x4030F420, + 0xAE603502, 0x00000002, 0x0030F483, 0xAE603502, 0x00000002, 0x4030F420, + 0xAE604102, 0x00000002, 0x0030F483, 0xAE604102, + // Block 217, offset 0x3640 + 0x00000002, 0x4030F420, 0xAE605B02, 0x00000002, 0x0030F483, 0xAE605B02, + 0x00000002, 0xA000B218, 0xA000BA18, 0x00000002, 0xA000B618, 0xA000BA18, + 0x00000002, 0x00393899, 0xA000A219, 0x00000002, 0x0039389A, 0xA000A21A, + 0x00000002, 0x00393C97, 0x003A6897, 0x00000002, 0x00393C98, 0x003A6898, + 0x00000002, 0x00393C99, 0x003A9099, 0x00000002, 0x00393C9A, 0x003A909A, + 0x00000002, 0x00395697, 0x003A6897, 0x00000002, 0x00395698, 0x003A6898, + 0x00000002, 0x00395699, 0x003A9099, 0x00000002, 0x0039569A, 0x003A909A, + 0x00000002, 0x00395898, 0x003A6898, 0x00000002, 0x00395899, 0x003A9099, + 0x00000002, 0x0039589A, 0x003A909A, 0x00000002, 0x00396499, 0x003A9099, + 0x00000002, 0x0039649A, 0x003A909A, 0x00000002, 0x00397299, 0x003A9099, + 0x00000002, 0x0039729A, 0x003A909A, 0x00000002, + // Block 218, offset 0x3680 + 0x00397499, 0x003A9099, 0x00000002, 0x0039749A, 0x003A909A, 0x00000002, + 0x0039C697, 0x003A6897, 0x00000002, 0x0039C698, 0x003A6898, 0x00000002, + 0x0039C699, 0x003A9099, 0x00000002, 0x0039C69A, 0x003A909A, 0x00000002, + 0x0039C897, 0x003A6897, 0x00000002, 0x0039C898, 0x003A6898, 0x00000002, + 0x0039C899, 0x003A9099, 0x00000002, 0x0039C89A, 0x003A909A, 0x00000002, + 0x0039DC99, 0x003A9099, 0x00000002, 0x0039DC9A, 0x003A909A, 0x00000002, + 0x0039DE99, 0x003A9099, 0x00000002, 0x0039DE9A, 0x003A909A, 0x00000002, + 0x0039E699, 0x003A9099, 0x00000002, 0x0039E69A, 0x003A909A, 0x00000002, + 0x0039EE99, 0x003A9099, 0x00000002, 0x0039EE9A, 0x003A909A, 0x00000002, + 0x0039F099, 0x003A9099, 0x00000002, 0x0039F09A, 0x003A909A, 0x00000002, + 0x0039FC99, 0x003A9099, 0x00000002, 0x0039FC9A, + // Block 219, offset 0x36c0 + 0x003A909A, 0x00000002, 0x003A1299, 0x003A9099, 0x00000002, 0x003A129A, + 0x003A909A, 0x00000002, 0x003A1A99, 0x00393899, 0x00000002, 0x003A1A9A, + 0x0039389A, 0x00000002, 0x003A1A97, 0x00396497, 0x00000002, 0x003A1A9A, + 0x0039649A, 0x00000002, 0x003A1A97, 0x00397297, 0x00000002, 0x003A1A9A, + 0x0039729A, 0x00000002, 0x003A1A97, 0x00397497, 0x00000002, 0x003A1A9A, + 0x0039749A, 0x00000002, 0x003A1A97, 0x003A4097, 0x00000002, 0x003A1A98, + 0x003A4098, 0x00000002, 0x003A1A99, 0x003A4099, 0x00000002, 0x003A1A9A, + 0x003A409A, 0x00000002, 0x003A1A97, 0x003A4E97, 0x00000002, 0x003A1A98, + 0x003A4E98, 0x00000002, 0x003A1A99, 0x003A4E99, 0x00000002, 0x003A1A9A, + 0x003A4E9A, 0x00000002, 0x003A1A99, 0x003A9099, 0x00000002, 0x003A1A9A, + 0x003A909A, 0x00000002, 0x003A4097, 0x003A6897, + // Block 220, offset 0x3700 + 0x00000002, 0x003A4099, 0x003A9099, 0x00000002, 0x003A409A, 0x003A909A, + 0x00000002, 0x003A4E9A, 0x003A909A, 0x00000002, 0x003A5697, 0x003A6897, + 0x00000002, 0x003A5698, 0x003A6898, 0x00000002, 0x003A5699, 0x003A9099, + 0x00000002, 0x003A569A, 0x003A909A, 0x00000002, 0x003A6897, 0xA000D117, + 0x00000002, 0x003A6897, 0x00396497, 0x00000002, 0x003A689A, 0x0039649A, + 0x00000002, 0x003A6897, 0x003A4E97, 0x00000002, 0x003A689A, 0x003A4E9A, + 0x00000002, 0x003A689A, 0x003A909A, 0x00000002, 0x003A7299, 0xA000BE19, + 0x00000002, 0x003A729A, 0xA000BE1A, 0x00000002, 0x403A8822, 0xAE60BE02, + 0x00000002, 0x003A8E99, 0xA000D119, 0x00000002, 0x003A8E9A, 0xA000D11A, + 0x00000002, 0x003A9084, 0x00391C84, 0x00000002, 0x003A9097, 0x00396497, + 0x00000002, 0x003A909A, 0x0039649A, 0x00000002, + // Block 221, offset 0x3740 + 0x003A9097, 0x00397297, 0x00000002, 0x003A909A, 0x0039729A, 0x00000002, + 0x003A9097, 0x00397497, 0x00000002, 0x003A909A, 0x0039749A, 0x00000002, + 0x003A9099, 0x0039A499, 0x00000002, 0x003A9099, 0x0039A699, 0x00000002, + 0x003A9097, 0x003A4E97, 0x00000002, 0x003A9098, 0x003A4E98, 0x00000002, + 0x003A9099, 0x003A4E99, 0x00000002, 0x003A909A, 0x003A4E9A, 0x00000002, + 0x003A9099, 0x003A5699, 0x00000002, 0x003A9097, 0x003A6897, 0x00000002, + 0x003A9098, 0x003A6898, 0x00000002, 0x003A9099, 0x003A9099, 0x00000002, + 0x003A909A, 0x003A909A, 0x00000002, 0x403A9222, 0xAE60BE02, 0x00000002, + 0x003AAA99, 0xA000BE19, 0x00000002, 0x003AAA9A, 0xA000BE1A, 0x00000002, + 0x402C6221, 0x40021220, 0x00000002, 0x002C62A3, 0x40021220, 0x00000002, + 0x402D2221, 0x40021220, 0x00000002, 0x002D22A3, + // Block 222, offset 0x3780 + 0x40021220, 0x00000002, 0x402E9E21, 0x40021220, 0x00000002, 0x002E9EA3, + 0x40021220, 0x00000002, 0x40302C21, 0x40021220, 0x00000002, 0x00302CA3, + 0x40021220, 0x00000002, 0x40312A21, 0x40021220, 0x00000002, 0x00312AA3, + 0x40021220, 0x00000003, 0x40312A21, 0x40021220, 0xAE604102, 0x00000003, + 0x00312AA3, 0x40021220, 0xAE604102, 0x00000002, 0x40320E20, 0xAE605B02, + 0x00000002, 0x00320E83, 0xAE605B02, 0x00000002, 0x40320E21, 0xAE603202, + 0x00000002, 0x00320EA3, 0xAE603202, 0x00000002, 0x40321020, 0xAE604E02, + 0x00000002, 0x00321083, 0xAE604E02, 0x00000002, 0x40321020, 0xAE605B02, + 0x00000002, 0x00321083, 0xAE605B02, 0x00000002, 0x40321021, 0xAE603202, + 0x00000002, 0x003210A3, 0xAE603202, 0x00000002, 0x002BDE83, 0xAE603202, + 0x00000002, 0x002BDE83, 0xAE603502, 0x00000002, + // Block 223, offset 0x37c0 + 0x002BDE83, 0xAE603702, 0x00000003, 0x002BDE83, 0xAE603702, 0xAE603202, + 0x00000003, 0x002BDE83, 0xAE603702, 0xAE603502, 0x00000003, 0x002BDE83, + 0xAE603702, 0xAE604E02, 0x00000003, 0x002BDE83, 0xAE603702, 0xAE606402, + 0x00000002, 0x002BDE83, 0xAE603C02, 0x00000003, 0x002BDE83, 0xAE603C02, + 0xAE603202, 0x00000003, 0x002BDE83, 0xAE603C02, 0xAE603502, 0x00000003, + 0x002BDE83, 0xAE603C02, 0xAE604E02, 0x00000003, 0x002BDE83, 0xAE603C02, + 0xAE606402, 0x00000002, 0x002BDE83, 0xAE604102, 0x00000002, 0x002BDE83, + 0xAE604302, 0x00000003, 0x002BDE83, 0xAE604302, 0xAE603202, 0x00000002, + 0x002BDE83, 0xAE604702, 0x00000003, 0x002BDE83, 0xAE604702, 0xAE605B02, + 0x00000002, 0x002BDE83, 0xAE604E02, 0x00000002, 0x002BDE83, 0xAE605202, + 0x00000003, 0x002BDE83, 0xAE605202, 0xAE605B02, + // Block 224, offset 0x3800 + 0x00000002, 0x002BDE83, 0xACA05902, 0x00000002, 0x002BDE83, 0xAE605B02, + 0x00000002, 0x002BDE83, 0xAE606402, 0x00000002, 0x002BDE83, 0xAE606502, + 0x00000002, 0x002BDE83, 0xAE606702, 0x00000002, 0x002BDE83, 0xADC07002, + 0x00000003, 0x002BDE83, 0xADC07002, 0xAE603702, 0x00000003, 0x002BDE83, + 0xADC07002, 0xAE603C02, 0x00000002, 0x002BDE83, 0xADC07602, 0x00000002, + 0x402BE020, 0xAE603202, 0x00000002, 0x002BE083, 0xAE603202, 0x00000002, + 0x402BE020, 0xAE603502, 0x00000002, 0x002BE083, 0xAE603502, 0x00000002, + 0x402BE020, 0xAE603702, 0x00000002, 0x002BE083, 0xAE603702, 0x00000002, + 0x402BE020, 0xAE603C02, 0x00000002, 0x002BE083, 0xAE603C02, 0x00000003, + 0x402BE020, 0xAE603C02, 0xAE603202, 0x00000003, 0x002BE083, 0xAE603C02, + 0xAE603202, 0x00000003, 0x402BE020, 0xAE603C02, + // Block 225, offset 0x3840 + 0xAE603502, 0x00000003, 0x002BE083, 0xAE603C02, 0xAE603502, 0x00000003, + 0x402BE020, 0xAE603C02, 0xAE604E02, 0x00000003, 0x002BE083, 0xAE603C02, + 0xAE604E02, 0x00000003, 0x402BE020, 0xAE603C02, 0xAE606402, 0x00000003, + 0x002BE083, 0xAE603C02, 0xAE606402, 0x00000002, 0x402BE020, 0xAE604102, + 0x00000002, 0x002BE083, 0xAE604102, 0x00000002, 0x402BE020, 0xAE604702, + 0x00000002, 0x002BE083, 0xAE604702, 0x00000002, 0x402BE020, 0xAE604E02, + 0x00000002, 0x002BE083, 0xAE604E02, 0x00000002, 0x402BE020, 0xAE605202, + 0x00000002, 0x002BE083, 0xAE605202, 0x00000002, 0x402BE020, 0xACA05602, + 0x00000002, 0x002BE083, 0xACA05602, 0x00000003, 0x402BE020, 0xACA05602, + 0xAE603702, 0x00000003, 0x002BE083, 0xACA05602, 0xAE603702, 0x00000002, + 0x402BE020, 0xACA05902, 0x00000002, 0x002BE083, + // Block 226, offset 0x3880 + 0xACA05902, 0x00000002, 0x402BE020, 0xAE605B02, 0x00000002, 0x002BE083, + 0xAE605B02, 0x00000003, 0x402BE020, 0xAE605B02, 0xAE603202, 0x00000003, + 0x002BE083, 0xAE605B02, 0xAE603202, 0x00000003, 0x402BE020, 0xAE605B02, + 0xAE603502, 0x00000003, 0x002BE083, 0xAE605B02, 0xAE603502, 0x00000002, + 0x402BE020, 0xAE606402, 0x00000002, 0x002BE083, 0xAE606402, 0x00000002, + 0x402BE020, 0xAE606502, 0x00000002, 0x002BE083, 0xAE606502, 0x00000002, + 0x402BE020, 0xAE606702, 0x00000002, 0x002BE083, 0xAE606702, 0x00000002, + 0x402BE020, 0xADC07002, 0x00000002, 0x002BE083, 0xADC07002, 0x00000003, + 0x402BE020, 0xADC07002, 0xAE603C02, 0x00000003, 0x002BE083, 0xADC07002, + 0xAE603C02, 0x00000002, 0x402BE020, 0xADC07802, 0x00000002, 0x002BE083, + 0xADC07802, 0x00000002, 0x402BE020, 0xADC07A02, + // Block 227, offset 0x38c0 + 0x00000002, 0x002BE083, 0xADC07A02, 0x00000002, 0x402BE220, 0xAE603202, + 0x00000002, 0x002BE283, 0xAE603202, 0x00000002, 0x402BE220, 0xAE603502, + 0x00000002, 0x002BE283, 0xAE603502, 0x00000002, 0x402BE220, 0xAE603702, + 0x00000002, 0x002BE283, 0xAE603702, 0x00000002, 0x402BE220, 0xAE603C02, + 0x00000002, 0x002BE283, 0xAE603C02, 0x00000002, 0x402BE220, 0xAE604102, + 0x00000002, 0x002BE283, 0xAE604102, 0x00000002, 0x402BE220, 0xAE604702, + 0x00000002, 0x002BE283, 0xAE604702, 0x00000003, 0x402BE220, 0xAE604702, + 0xAE603202, 0x00000003, 0x002BE283, 0xAE604702, 0xAE603202, 0x00000002, + 0x402BE220, 0xAE604E02, 0x00000002, 0x002BE283, 0xAE604E02, 0x00000002, + 0x002BE283, 0xAE605202, 0x00000002, 0x402BE220, 0xACA05902, 0x00000002, + 0x002BE283, 0xACA05902, 0x00000002, 0x402BE220, + // Block 228, offset 0x3900 + 0xAE605B02, 0x00000002, 0x002BE283, 0xAE605B02, 0x00000002, 0x402BE220, + 0xAE606402, 0x00000002, 0x002BE283, 0xAE606402, 0x00000002, 0x402BE220, + 0xAE606502, 0x00000002, 0x002BE283, 0xAE606502, 0x00000002, 0x402BE220, + 0xAE606702, 0x00000002, 0x002BE283, 0xAE606702, 0x00000002, 0x402BE220, + 0xADC07002, 0x00000002, 0x002BE283, 0xADC07002, 0x00000002, 0x402BE220, + 0xADC07A02, 0x00000002, 0x002BE283, 0xADC07A02, 0x00000002, 0x402BE420, + 0xAE603202, 0x00000002, 0x002BE483, 0xAE603202, 0x00000002, 0x402BE420, + 0xAE603502, 0x00000002, 0x002BE483, 0xAE603502, 0x00000002, 0x402BE420, + 0xAE603702, 0x00000002, 0x002BE483, 0xAE603702, 0x00000002, 0x402BE420, + 0xAE603C02, 0x00000002, 0x002BE483, 0xAE603C02, 0x00000003, 0x402BE420, + 0xAE603C02, 0xAE603202, 0x00000003, 0x002BE483, + // Block 229, offset 0x3940 + 0xAE603C02, 0xAE603202, 0x00000003, 0x402BE420, 0xAE603C02, 0xAE603502, + 0x00000003, 0x002BE483, 0xAE603C02, 0xAE603502, 0x00000003, 0x402BE420, + 0xAE603C02, 0xAE604E02, 0x00000003, 0x002BE483, 0xAE603C02, 0xAE604E02, + 0x00000003, 0x402BE420, 0xAE603C02, 0xAE606402, 0x00000003, 0x002BE483, + 0xAE603C02, 0xAE606402, 0x00000002, 0x402BE420, 0xAE604102, 0x00000002, + 0x002BE483, 0xAE604102, 0x00000002, 0x402BE420, 0xAE604702, 0x00000002, + 0x002BE483, 0xAE604702, 0x00000003, 0x402BE420, 0xAE604702, 0xAE605B02, + 0x00000003, 0x002BE483, 0xAE604702, 0xAE605B02, 0x00000002, 0x402BE420, + 0xAE604D02, 0x00000002, 0x002BE483, 0xAE604D02, 0x00000002, 0x402BE420, + 0xAE604E02, 0x00000002, 0x002BE483, 0xAE604E02, 0x00000003, 0x402BE420, + 0xAE604E02, 0xAE603202, 0x00000003, 0x002BE483, + // Block 230, offset 0x3980 + 0xAE604E02, 0xAE603202, 0x00000003, 0x402BE420, 0xAE604E02, 0xAE604702, + 0x00000003, 0x002BE483, 0xAE604E02, 0xAE604702, 0x00000003, 0x402BE420, + 0xAE604E02, 0xAE605B02, 0x00000003, 0x002BE483, 0xAE604E02, 0xAE605B02, + 0x00000002, 0x402BE420, 0xAE605202, 0x00000002, 0x002BE483, 0xAE605202, + 0x00000003, 0x402BE420, 0xAE605202, 0xAE605B02, 0x00000003, 0x002BE483, + 0xAE605202, 0xAE605B02, 0x00000002, 0x402BE420, 0xACA05902, 0x00000002, + 0x002BE483, 0xACA05902, 0x00000003, 0x402BE420, 0xACA05902, 0xAE605B02, + 0x00000003, 0x002BE483, 0xACA05902, 0xAE605B02, 0x00000002, 0x402BE420, + 0xAE605B02, 0x00000002, 0x002BE483, 0xAE605B02, 0x00000003, 0x402BE420, + 0xAE605B02, 0xAE603202, 0x00000003, 0x002BE483, 0xAE605B02, 0xAE603202, + 0x00000003, 0x402BE420, 0xAE605B02, 0xAE603502, + // Block 231, offset 0x39c0 + 0x00000003, 0x002BE483, 0xAE605B02, 0xAE603502, 0x00000002, 0x402BE420, + 0xAE606402, 0x00000002, 0x002BE483, 0xAE606402, 0x00000002, 0x402BE420, + 0xAE606502, 0x00000002, 0x002BE483, 0xAE606502, 0x00000002, 0x402BE420, + 0xAE606702, 0x00000002, 0x002BE483, 0xAE606702, 0x00000002, 0x402BE420, + 0xAD806802, 0x00000002, 0x002BE483, 0xAD806802, 0x00000003, 0x402BE420, + 0xAD806802, 0xAE603202, 0x00000003, 0x002BE483, 0xAD806802, 0xAE603202, + 0x00000003, 0x402BE420, 0xAD806802, 0xAE603502, 0x00000003, 0x002BE483, + 0xAD806802, 0xAE603502, 0x00000003, 0x402BE420, 0xAD806802, 0xAE604E02, + 0x00000003, 0x002BE483, 0xAD806802, 0xAE604E02, 0x00000003, 0x402BE420, + 0xAD806802, 0xAE606402, 0x00000003, 0x002BE483, 0xAD806802, 0xAE606402, + 0x00000003, 0x402BE420, 0xAD806802, 0xADC07002, + // Block 232, offset 0x3a00 + 0x00000003, 0x002BE483, 0xAD806802, 0xADC07002, 0x00000002, 0x402BE420, + 0xADC07002, 0x00000002, 0x002BE483, 0xADC07002, 0x00000003, 0x402BE420, + 0xADC07002, 0xAE603C02, 0x00000003, 0x002BE483, 0xADC07002, 0xAE603C02, + 0x00000002, 0x402BE620, 0xAE603202, 0x00000002, 0x002BE683, 0xAE603202, + 0x00000002, 0x402BE620, 0xAE603502, 0x00000002, 0x002BE683, 0xAE603502, + 0x00000002, 0x402BE620, 0xAE603702, 0x00000002, 0x002BE683, 0xAE603702, + 0x00000002, 0x402BE620, 0xAE603C02, 0x00000002, 0x002BE683, 0xAE603C02, + 0x00000002, 0x402BE620, 0xAE604102, 0x00000002, 0x002BE683, 0xAE604102, + 0x00000002, 0x402BE620, 0xAE604302, 0x00000002, 0x002BE683, 0xAE604302, + 0x00000002, 0x402BE620, 0xAE604702, 0x00000002, 0x002BE683, 0xAE604702, + 0x00000003, 0x402BE620, 0xAE604702, 0xAE603202, + // Block 233, offset 0x3a40 + 0x00000003, 0x002BE683, 0xAE604702, 0xAE603202, 0x00000003, 0x402BE620, + 0xAE604702, 0xAE603502, 0x00000003, 0x002BE683, 0xAE604702, 0xAE603502, + 0x00000003, 0x402BE620, 0xAE604702, 0xAE604102, 0x00000003, 0x002BE683, + 0xAE604702, 0xAE604102, 0x00000003, 0x402BE620, 0xAE604702, 0xAE605B02, + 0x00000003, 0x002BE683, 0xAE604702, 0xAE605B02, 0x00000002, 0x402BE620, + 0xAE604D02, 0x00000002, 0x002BE683, 0xAE604D02, 0x00000002, 0x402BE620, + 0xAE604E02, 0x00000002, 0x002BE683, 0xAE604E02, 0x00000003, 0x402BE620, + 0xAE604E02, 0xAE603202, 0x00000003, 0x002BE683, 0xAE604E02, 0xAE603202, + 0x00000002, 0x402BE620, 0xACA05902, 0x00000002, 0x002BE683, 0xACA05902, + 0x00000002, 0x402BE620, 0xAE605B02, 0x00000002, 0x002BE683, 0xAE605B02, + 0x00000003, 0x402BE620, 0xAE605B02, 0xAE604702, + // Block 234, offset 0x3a80 + 0x00000003, 0x002BE683, 0xAE605B02, 0xAE604702, 0x00000002, 0x402BE620, + 0xAE606402, 0x00000002, 0x002BE683, 0xAE606402, 0x00000002, 0x402BE620, + 0xAE606502, 0x00000002, 0x002BE683, 0xAE606502, 0x00000002, 0x402BE620, + 0xAE606702, 0x00000002, 0x002BE683, 0xAE606702, 0x00000002, 0x402BE620, + 0xAD806802, 0x00000002, 0x002BE683, 0xAD806802, 0x00000003, 0x402BE620, + 0xAD806802, 0xAE603202, 0x00000003, 0x002BE683, 0xAD806802, 0xAE603202, + 0x00000003, 0x402BE620, 0xAD806802, 0xAE603502, 0x00000003, 0x002BE683, + 0xAD806802, 0xAE603502, 0x00000003, 0x402BE620, 0xAD806802, 0xAE604E02, + 0x00000003, 0x002BE683, 0xAD806802, 0xAE604E02, 0x00000003, 0x402BE620, + 0xAD806802, 0xAE606402, 0x00000003, 0x002BE683, 0xAD806802, 0xAE606402, + 0x00000003, 0x402BE620, 0xAD806802, 0xADC07002, + // Block 235, offset 0x3ac0 + 0x00000003, 0x002BE683, 0xAD806802, 0xADC07002, 0x00000002, 0x402BE620, + 0xADC07002, 0x00000002, 0x002BE683, 0xADC07002, 0x00000002, 0x402BE620, + 0xADC07502, 0x00000002, 0x002BE683, 0xADC07502, 0x00000002, 0x402BE620, + 0xADC07802, 0x00000002, 0x002BE683, 0xADC07802, 0x00000002, 0x402BE620, + 0xADC07A02, 0x00000002, 0x002BE683, 0xADC07A02, 0x00000002, 0x402BE820, + 0xAE603C02, 0x00000002, 0x002BE883, 0xAE603C02, 0x00000002, 0x402BE820, + 0xAE604102, 0x00000002, 0x002BE883, 0xAE604102, 0x00000002, 0x402BE820, + 0xAE604702, 0x00000002, 0x002BE883, 0xAE604702, 0x00000002, 0x402BE820, + 0xAE605202, 0x00000002, 0x002BE883, 0xAE605202, 0x00000002, 0x402BE820, + 0xACA05602, 0x00000002, 0x002BE883, 0xACA05602, 0x00000002, 0x402BE820, + 0xADC07002, 0x00000002, 0x002BE883, 0xADC07002, + // Block 236, offset 0x3b00 + 0x00000002, 0x402BE820, 0xADC07902, 0x00000002, 0x002BE883, 0xADC07902, + 0x00000002, 0x402BE820, 0xADC07B02, 0x00000002, 0x402BEA20, 0xAE603202, + 0x00000002, 0x002BEA83, 0xAE603202, 0x00000002, 0x402BEA20, 0xAE604102, + 0x00000002, 0x002BEA83, 0xAE604102, 0x00000002, 0x402BEA20, 0xACA05602, + 0x00000002, 0x002BEA83, 0xACA05602, 0x00000002, 0x402BEA20, 0xADC07002, + 0x00000002, 0x002BEA83, 0xADC07002, 0x00000002, 0x402BEA20, 0xADC07B02, + 0x00000002, 0x002BEA83, 0xADC07B02, 0x00000002, 0x402BEC20, 0xAE603202, + 0x00000002, 0x002BEC83, 0xAE603202, 0x00000002, 0x402BEC20, 0xAE604102, + 0x00000002, 0x002BEC83, 0xAE604102, 0x00000002, 0x402BEC20, 0xACA05602, + 0x00000002, 0x002BEC83, 0xACA05602, 0x00000002, 0x402BEC20, 0xADC07002, + 0x00000002, 0x002BEC83, 0xADC07002, 0x00000003, + // Block 237, offset 0x3b40 + 0x402BEC20, 0xADC07002, 0xAE605B02, 0x00000003, 0x002BEC83, 0xADC07002, + 0xAE605B02, 0x00000002, 0x402BEC20, 0xADC07802, 0x00000002, 0x002BEC83, + 0xADC07802, 0x00000002, 0x402BEC20, 0xADC07B02, 0x00000002, 0x002BEC83, + 0xADC07B02, 0x00000002, 0x402BEE20, 0xAE603202, 0x00000002, 0x002BEE83, + 0xAE603202, 0x00000002, 0x402BEE20, 0xAE605202, 0x00000002, 0x002BEE83, + 0xAE605202, 0x00000002, 0x402BEE20, 0xADC07002, 0x00000002, 0x002BEE83, + 0xADC07002, 0x00000002, 0x402BF020, 0xAE603202, 0x00000002, 0x002BF083, + 0xAE603202, 0x00000002, 0x402BF020, 0xAE603502, 0x00000002, 0x002BF083, + 0xAE603502, 0x00000002, 0x402BF020, 0xAE604102, 0x00000002, 0x002BF083, + 0xAE604102, 0x00000002, 0x402BF020, 0xAE604E02, 0x00000002, 0x002BF083, + 0xAE604E02, 0x00000002, 0x402BF020, 0xAE605202, + // Block 238, offset 0x3b80 + 0x00000002, 0x002BF083, 0xAE605202, 0x00000002, 0x402BF020, 0xACA05602, + 0x00000002, 0x002BF083, 0xACA05602, 0x00000002, 0x402BF020, 0xADC07002, + 0x00000002, 0x002BF083, 0xADC07002, 0x00000002, 0x402BF020, 0xADC07802, + 0x00000002, 0x002BF083, 0xADC07802, 0x00000002, 0x402BF020, 0xADC07B02, + 0x00000002, 0x002BF083, 0xADC07B02, 0x00000002, 0x402BF220, 0xAE603202, + 0x00000002, 0x002BF283, 0xAE603202, 0x00000002, 0x402BF220, 0xAE605202, + 0x00000002, 0x002BF283, 0xAE605202, 0x00000002, 0x402BF420, 0xAE603202, + 0x00000002, 0x002BF483, 0xAE603202, 0x00000002, 0x402BF420, 0xAE603502, + 0x00000002, 0x002BF483, 0xAE603502, 0x00000002, 0x402BF420, 0xAE603C02, + 0x00000002, 0x002BF483, 0xAE603C02, 0x00000002, 0x402BF420, 0xAE604302, + 0x00000002, 0x402BF420, 0xAE604702, 0x00000002, + // Block 239, offset 0x3bc0 + 0x002BF483, 0xAE604702, 0x00000002, 0x402BF420, 0xAE605202, 0x00000002, + 0x002BF483, 0xAE605202, 0x00000002, 0x402BF420, 0xADC07002, 0x00000002, + 0x002BF483, 0xADC07002, 0x00000002, 0x402C3E20, 0xACA05602, 0x00000002, + 0x002C3E83, 0xACA05602, 0x00000002, 0x002C3C83, 0x402C3C20, 0x00000002, + 0x002C3C85, 0x402C3C20, 0x00000002, 0x002C3C87, 0x002C3C86, 0x00000002, + 0x002C6483, 0x402C6420, 0x00000002, 0x002C6485, 0x402C6420, 0x00000002, + 0x002C6487, 0x002C6486, 0x00000002, 0x002C6683, 0x402C6620, 0x00000002, + 0x002C6685, 0x402C6620, 0x00000002, 0x002C6687, 0x002C6686, 0x00000002, + 0x002D2483, 0x402D2420, 0x00000002, 0x002D2485, 0x402D2420, 0x00000002, + 0x002D2487, 0x002D2486, 0x00000002, 0x002E2483, 0x402E2420, 0x00000002, + 0x002E2485, 0x402E2420, 0x00000002, 0x002E2487, + // Block 240, offset 0x3c00 + 0x002E2486, 0x00000002, 0x002EA083, 0x402EA020, 0x00000002, 0x002EA085, + 0x402EA020, 0x00000002, 0x002EA087, 0x002EA086, 0x00000002, 0x002FE883, + 0x402FE820, 0x00000002, 0x002FE885, 0x402FE820, 0x00000002, 0x002FE887, + 0x002FE886, 0x00000002, 0x00302E83, 0x40302E20, 0x00000002, 0x00302E85, + 0x40302E20, 0x00000002, 0x00302E87, 0x00302E86, 0x00000002, 0x00312C83, + 0x40312C20, 0x00000002, 0x00312C85, 0x40312C20, 0x00000002, 0x00312C87, + 0x00312C86, 0x00000002, 0x402EE420, 0xAE603C02, 0x00000002, 0x002EE483, + 0xAE603C02, 0x00000002, 0x402EE420, 0xAD806802, 0x00000002, 0x002EE483, + 0xAD806802, 0x00000002, 0x40306E20, 0xAD806802, 0x00000002, 0x00306E83, + 0xAD806802, 0x00000002, 0x402C0820, 0xAE603702, 0x00000002, 0x002C0883, + 0xAE603702, 0x00000002, 0x402C0820, 0xAE603C02, + // Block 241, offset 0x3c40 + 0x00000002, 0x002C0883, 0xAE603C02, 0x00000002, 0x402D0620, 0xAE603C02, + 0x00000002, 0x002D0683, 0xAE603C02, 0x00000002, 0x402D0620, 0xAE605B02, + 0x00000002, 0x002D0683, 0xAE605B02, 0x00000002, 0x402DCA20, 0xAE604702, + 0x00000002, 0x002DCA83, 0xAE604702, 0x00000002, 0x402F2A20, 0xAE603C02, + 0x00000002, 0x002F2A83, 0xAE603C02, 0x00000002, 0x402F2A20, 0xAE604E02, + 0x00000002, 0x002F2A83, 0xAE604E02, 0x00000002, 0x402F2A20, 0xAE605B02, + 0x00000002, 0x002F2A83, 0xAE605B02, 0x00000002, 0x402F2A20, 0xAD806802, + 0x00000002, 0x002F2A83, 0xAD806802, 0x00000002, 0x4030BC20, 0xAE604702, + 0x00000002, 0x0030BC83, 0xAE604702, 0x00000002, 0x4030BC20, 0xAE604E02, + 0x00000002, 0x0030BC83, 0xAE604E02, 0x00000002, 0x4030BC20, 0xAD806802, + 0x00000002, 0x0030BC83, 0xAD806802, 0x00000002, + // Block 242, offset 0x3c80 + 0x40320E20, 0xAE604E02, 0x00000002, 0x00320E83, 0xAE604E02, 0x00000003, + 0x0004B084, 0x029C1284, 0x0004B29F, 0x00000003, 0x0004B084, 0x029D1884, + 0x0004B29F, 0x00000003, 0x0004B084, 0x02A5BA84, 0x0004B29F, 0x00000003, + 0x0004B084, 0x02B71284, 0x0004B29F, 0x00000003, 0x0004B084, 0x02C4A684, + 0x0004B29F, 0x00000003, 0x0004B084, 0x02CAAE84, 0x0004B29F, 0x00000003, + 0x0004B084, 0x02CE5884, 0x0004B29F, 0x00000003, 0x0004B084, 0x02E17284, + 0x0004B29F, 0x00000003, 0x0004B084, 0x02EDAE84, 0x0004B29F, 0x00000002, + 0x0065768E, 0x0065768F, 0x00000002, 0x0065768E, 0x00657691, 0x00000002, + 0x00657690, 0x0065768F, 0x00000002, 0x00657690, 0x00657691, 0x00000002, + 0x0065768E, 0x0065828F, 0x00000002, 0x0065768E, 0x00658291, 0x00000003, + 0x0065768E, 0x00658291, 0xA0812802, 0x00000002, + // Block 243, offset 0x3cc0 + 0x0065768E, 0x00658C91, 0x00000003, 0x0065768E, 0x00658C91, 0xA0812802, + 0x00000002, 0x0065768E, 0x00659691, 0x00000003, 0x0065768E, 0x00659691, + 0xA0812802, 0x00000002, 0x0065768E, 0x0065A091, 0x00000002, 0x0065768E, + 0x0065AA8F, 0x00000002, 0x0065768E, 0x0065AA91, 0x00000003, 0x0065768E, + 0x0065AA91, 0xA0812802, 0x00000003, 0x0065768E, 0x0065AA91, 0xA0812902, + 0x00000002, 0x0065768E, 0x0065B491, 0x00000002, 0x0065768E, 0x0065BE8F, + 0x00000002, 0x0065768E, 0x0065BE91, 0x00000002, 0x0065768E, 0x0065C68F, + 0x00000002, 0x0065768E, 0x0065C691, 0x00000002, 0x0065768E, 0x0065D08F, + 0x00000002, 0x0065768E, 0x0065D091, 0x00000003, 0x0065768E, 0x0065D091, + 0xA0812802, 0x00000002, 0x0065788E, 0x0065788F, 0x00000002, 0x0065788E, + 0x00657891, 0x00000002, 0x00657890, 0x0065788F, + // Block 244, offset 0x3d00 + 0x00000002, 0x00657890, 0x00657891, 0x00000002, 0x0065788E, 0x00658491, + 0x00000003, 0x0065788E, 0x00658491, 0xA0812802, 0x00000002, 0x0065788E, + 0x00658E8F, 0x00000002, 0x0065788E, 0x00658E91, 0x00000003, 0x0065788E, + 0x00658E91, 0xA0812802, 0x00000002, 0x0065788E, 0x00659891, 0x00000003, + 0x0065788E, 0x00659891, 0xA0812802, 0x00000002, 0x0065788E, 0x0065A291, + 0x00000002, 0x0065788E, 0x0065AC8F, 0x00000002, 0x0065788E, 0x0065AC91, + 0x00000003, 0x0065788E, 0x0065AC91, 0xA0812802, 0x00000003, 0x0065788E, + 0x0065AC91, 0xA0812902, 0x00000002, 0x0065788E, 0x0065B691, 0x00000002, + 0x0065788E, 0x0065C88F, 0x00000002, 0x0065788E, 0x0065C891, 0x00000002, + 0x0065788E, 0x0065D291, 0x00000003, 0x0065788E, 0x0065D291, 0xA0812802, + 0x00000002, 0x00657A8E, 0x00657A8F, 0x00000002, + // Block 245, offset 0x3d40 + 0x00657A8E, 0x00657A91, 0x00000002, 0x00657A90, 0x00657A8F, 0x00000002, + 0x00657A90, 0x00657A91, 0x00000003, 0x00657A8E, 0x00657A91, 0xA0812802, + 0x00000003, 0x00657A90, 0x00657A8F, 0xA0812802, 0x00000003, 0x00657A90, + 0x00657A91, 0xA0812802, 0x00000004, 0x00657A90, 0x00657A91, 0xA0812802, + 0xA0812802, 0x00000002, 0x00657A8E, 0x0065868F, 0x00000002, 0x00657A8E, + 0x00658691, 0x00000003, 0x00657A8E, 0x00658691, 0xA0812802, 0x00000002, + 0x00657A8E, 0x0065908F, 0x00000002, 0x00657A8E, 0x00659091, 0x00000003, + 0x00657A8E, 0x00659091, 0xA0812802, 0x00000002, 0x00657A8E, 0x00659A8F, + 0x00000002, 0x00657A8E, 0x00659A91, 0x00000003, 0x00657A8E, 0x00659A91, + 0xA0812802, 0x00000002, 0x00657A8E, 0x0065A48F, 0x00000002, 0x00657A8E, + 0x0065A491, 0x00000002, 0x00657A8E, 0x0065AE8F, + // Block 246, offset 0x3d80 + 0x00000002, 0x00657A8E, 0x0065AE91, 0x00000003, 0x00657A8E, 0x0065AE91, + 0xA0812802, 0x00000003, 0x00657A8E, 0x0065AE91, 0xA0812902, 0x00000002, + 0x00657A8E, 0x0065B88F, 0x00000002, 0x00657A8E, 0x0065B891, 0x00000002, + 0x00657A8E, 0x0065C08F, 0x00000002, 0x00657A8E, 0x0065C091, 0x00000002, + 0x00657A8E, 0x0065CA8F, 0x00000002, 0x00657A8E, 0x0065CA91, 0x00000002, + 0x00657E8E, 0x00657E8F, 0x00000002, 0x00657E8E, 0x00657E91, 0x00000002, + 0x00657E90, 0x00657E8F, 0x00000002, 0x00657E90, 0x00657E91, 0x00000002, + 0x00657E8E, 0x0065888F, 0x00000002, 0x00657E8E, 0x00658891, 0x00000003, + 0x00657E8E, 0x00658891, 0xA0812802, 0x00000002, 0x00657E8E, 0x00659291, + 0x00000003, 0x00657E8E, 0x00659291, 0xA0812802, 0x00000002, 0x00657E8E, + 0x00659C91, 0x00000003, 0x00657E8E, 0x00659C91, + // Block 247, offset 0x3dc0 + 0xA0812802, 0x00000002, 0x00657E8E, 0x0065A691, 0x00000002, 0x00657E8E, + 0x0065B08F, 0x00000002, 0x00657E8E, 0x0065B091, 0x00000003, 0x00657E8E, + 0x0065B091, 0xA0812802, 0x00000003, 0x00657E8E, 0x0065B091, 0xA0812902, + 0x00000002, 0x00657E8E, 0x0065BA91, 0x00000002, 0x00657E8E, 0x0065CC8F, + 0x00000002, 0x00657E8E, 0x0065CC91, 0x00000002, 0x00657E8E, 0x0065D491, + 0x00000003, 0x00657E8E, 0x0065D491, 0xA0812802, 0x00000002, 0x0065808E, + 0x0065808F, 0x00000002, 0x0065808E, 0x00658091, 0x00000002, 0x00658090, + 0x0065808F, 0x00000002, 0x00658090, 0x00658091, 0x00000002, 0x0065808E, + 0x00658A91, 0x00000003, 0x0065808E, 0x00658A91, 0xA0812802, 0x00000002, + 0x0065808E, 0x00659491, 0x00000003, 0x0065808E, 0x00659491, 0xA0812802, + 0x00000002, 0x0065808E, 0x00659E8F, 0x00000002, + // Block 248, offset 0x3e00 + 0x0065808E, 0x00659E91, 0x00000003, 0x0065808E, 0x00659E91, 0xA0812802, + 0x00000002, 0x0065808E, 0x0065A891, 0x00000002, 0x0065808E, 0x0065B28F, + 0x00000002, 0x0065808E, 0x0065B291, 0x00000003, 0x0065808E, 0x0065B291, + 0xA0812802, 0x00000003, 0x0065808E, 0x0065B291, 0xA0812902, 0x00000002, + 0x0065808E, 0x0065BC91, 0x00000002, 0x0065808E, 0x0065C48F, 0x00000002, + 0x0065808E, 0x0065C491, 0x00000002, 0x0065808E, 0x0065CE8F, 0x00000002, + 0x0065808E, 0x0065CE91, 0x00000002, 0x0065808E, 0x0065D691, 0x00000003, + 0x0065808E, 0x0065D691, 0xA0812802, 0x00000002, 0x00658290, 0x0065828F, + 0x00000002, 0x00658290, 0x00658291, 0x00000003, 0x0065848F, 0x00658291, + 0xA0812802, 0x00000002, 0x00658490, 0x00658491, 0x00000003, 0x00658490, + 0x00658491, 0xA0812802, 0x00000004, 0x00658490, + // Block 249, offset 0x3e40 + 0x00658491, 0xA0812802, 0xA0812802, 0x00000002, 0x00658690, 0x0065868F, + 0x00000002, 0x00658690, 0x00658691, 0x00000003, 0x00658690, 0x0065868F, + 0xA0812802, 0x00000003, 0x00658690, 0x00658691, 0xA0812802, 0x00000004, + 0x00658690, 0x00658691, 0xA0812802, 0xA0812802, 0x00000002, 0x00658890, + 0x0065888F, 0x00000002, 0x00658890, 0x00658891, 0x00000003, 0x00658A8F, + 0x00658891, 0xA0812802, 0x00000002, 0x00658A90, 0x00658A91, 0x00000003, + 0x00658A90, 0x00658A91, 0xA0812802, 0x00000004, 0x00658A90, 0x00658A91, + 0xA0812802, 0xA0812802, 0x00000002, 0x40658A21, 0x00659E91, 0x00000002, + 0x00658C90, 0x00658C91, 0x00000003, 0x00658C90, 0x00658C91, 0xA0812802, + 0x00000004, 0x00658C90, 0x00658C91, 0xA0812802, 0xA0812802, 0x00000002, + 0x00658E90, 0x00658E8F, 0x00000002, 0x00658E90, + // Block 250, offset 0x3e80 + 0x00658E91, 0x00000003, 0x00658E90, 0x00658E8F, 0xA0812802, 0x00000003, + 0x00658E90, 0x00658E91, 0xA0812802, 0x00000004, 0x00658E90, 0x00658E91, + 0xA0812802, 0xA0812802, 0x00000002, 0x00659090, 0x0065908F, 0x00000002, + 0x00659090, 0x00659091, 0x00000003, 0x00659090, 0x0065908F, 0xA0812802, + 0x00000003, 0x00659090, 0x00659091, 0xA0812802, 0x00000004, 0x00659090, + 0x00659091, 0xA0812802, 0xA0812802, 0x00000002, 0x00659290, 0x00659291, + 0x00000003, 0x00659290, 0x00659291, 0xA0812802, 0x00000004, 0x00659290, + 0x00659291, 0xA0812802, 0xA0812802, 0x00000002, 0x00659490, 0x00659491, + 0x00000003, 0x00659490, 0x00659491, 0xA0812802, 0x00000004, 0x00659490, + 0x00659491, 0xA0812802, 0xA0812802, 0x00000002, 0x00659690, 0x00659691, + 0x00000003, 0x00659690, 0x00659691, 0xA0812802, + // Block 251, offset 0x3ec0 + 0x00000004, 0x00659690, 0x00659691, 0xA0812802, 0xA0812802, 0x00000002, + 0x00659890, 0x00659891, 0x00000003, 0x00659890, 0x00659891, 0xA0812802, + 0x00000004, 0x00659890, 0x00659891, 0xA0812802, 0xA0812802, 0x00000002, + 0x00659A90, 0x00659A8F, 0x00000002, 0x00659A90, 0x00659A91, 0x00000003, + 0x00659A90, 0x00659A8F, 0xA0812802, 0x00000003, 0x00659A90, 0x00659A91, + 0xA0812802, 0x00000004, 0x00659A90, 0x00659A91, 0xA0812802, 0xA0812802, + 0x00000002, 0x00659C90, 0x00659C91, 0x00000003, 0x00659C90, 0x00659C91, + 0xA0812802, 0x00000004, 0x00659C90, 0x00659C91, 0xA0812802, 0xA0812802, + 0x00000002, 0x00659E90, 0x00659E8F, 0x00000002, 0x00659E90, 0x00659E91, + 0x00000003, 0x00659E90, 0x00659E8F, 0xA0812802, 0x00000003, 0x00659E90, + 0x00659E91, 0xA0812802, 0x00000004, 0x00659E90, + // Block 252, offset 0x3f00 + 0x00659E91, 0xA0812802, 0xA0812802, 0x00000002, 0x0065A090, 0x0065A091, + 0x00000002, 0x0065A290, 0x0065A291, 0x00000002, 0x0065A490, 0x0065A48F, + 0x00000002, 0x0065A490, 0x0065A491, 0x00000002, 0x0065A690, 0x0065A691, + 0x00000002, 0x0065A890, 0x0065A891, 0x00000002, 0x0065AA90, 0x0065AA8F, + 0x00000002, 0x0065AA90, 0x0065AA91, 0x00000003, 0x0065AA90, 0x0065AA8F, + 0xA0812802, 0x00000003, 0x0065AA90, 0x0065AA91, 0xA0812802, 0x00000004, + 0x0065AA90, 0x0065AA91, 0xA0812802, 0xA0812802, 0x00000003, 0x0065AA90, + 0x0065AA91, 0xA0812902, 0x00000004, 0x0065AA90, 0x0065AA91, 0xA0812902, + 0xA0812802, 0x00000002, 0x0065AC90, 0x0065AC8F, 0x00000002, 0x0065AC90, + 0x0065AC91, 0x00000003, 0x0065AC90, 0x0065AC8F, 0xA0812802, 0x00000003, + 0x0065AC90, 0x0065AC91, 0xA0812802, 0x00000004, + // Block 253, offset 0x3f40 + 0x0065AC90, 0x0065AC91, 0xA0812802, 0xA0812802, 0x00000003, 0x0065AC90, + 0x0065AC91, 0xA0812902, 0x00000004, 0x0065AC90, 0x0065AC91, 0xA0812902, + 0xA0812802, 0x00000002, 0x0065AE90, 0x0065AE8F, 0x00000002, 0x0065AE90, + 0x0065AE91, 0x00000003, 0x0065AE90, 0x0065AE8F, 0xA0812802, 0x00000003, + 0x0065AE90, 0x0065AE91, 0xA0812802, 0x00000004, 0x0065AE90, 0x0065AE91, + 0xA0812802, 0xA0812802, 0x00000003, 0x0065AE90, 0x0065AE91, 0xA0812902, + 0x00000004, 0x0065AE90, 0x0065AE91, 0xA0812902, 0xA0812802, 0x00000002, + 0x0065B090, 0x0065B08F, 0x00000002, 0x0065B090, 0x0065B091, 0x00000003, + 0x0065B090, 0x0065B08F, 0xA0812802, 0x00000003, 0x0065B090, 0x0065B091, + 0xA0812802, 0x00000004, 0x0065B090, 0x0065B091, 0xA0812802, 0xA0812802, + 0x00000003, 0x0065B090, 0x0065B091, 0xA0812902, + // Block 254, offset 0x3f80 + 0x00000004, 0x0065B090, 0x0065B091, 0xA0812902, 0xA0812802, 0x00000002, + 0x0065B290, 0x0065B28F, 0x00000002, 0x0065B290, 0x0065B291, 0x00000003, + 0x0065B290, 0x0065B28F, 0xA0812802, 0x00000003, 0x0065B290, 0x0065B291, + 0xA0812802, 0x00000004, 0x0065B290, 0x0065B291, 0xA0812802, 0xA0812802, + 0x00000003, 0x0065B290, 0x0065B291, 0xA0812902, 0x00000004, 0x0065B290, + 0x0065B291, 0xA0812902, 0xA0812802, 0x00000002, 0x0065B490, 0x0065B491, + 0x00000002, 0x0065B690, 0x0065B691, 0x00000002, 0x0065B890, 0x0065B88F, + 0x00000002, 0x0065B890, 0x0065B891, 0x00000002, 0x0065BA90, 0x0065BA91, + 0x00000002, 0x0065BC90, 0x0065BC91, 0x00000002, 0x0065BE90, 0x0065BE8F, + 0x00000002, 0x0065BE90, 0x0065BE91, 0x00000002, 0x0065C090, 0x0065C08F, + 0x00000002, 0x0065C090, 0x0065C091, 0x00000002, + // Block 255, offset 0x3fc0 + 0x0065C490, 0x0065C48F, 0x00000002, 0x0065C490, 0x0065C491, 0x00000002, + 0x4065C421, 0x0065C891, 0x00000002, 0x0065C690, 0x0065C68F, 0x00000002, + 0x0065C690, 0x0065C691, 0x00000002, 0x0065C890, 0x0065C88F, 0x00000002, + 0x0065C890, 0x0065C891, 0x00000002, 0x0065CA90, 0x0065CA8F, 0x00000002, + 0x0065CA90, 0x0065CA91, 0x00000002, 0x0065CC90, 0x0065CC8F, 0x00000002, + 0x0065CC90, 0x0065CC91, 0x00000002, 0x0065CE90, 0x0065CE8F, 0x00000002, + 0x0065CE90, 0x0065CE91, 0x00000002, 0x0065D090, 0x0065D08F, 0x00000002, + 0x0065D090, 0x0065D091, 0x00000003, 0x0065D090, 0x0065D08F, 0xA0812802, + 0x00000003, 0x0065D090, 0x0065D091, 0xA0812802, 0x00000004, 0x0065D090, + 0x0065D091, 0xA0812802, 0xA0812802, 0x00000002, 0x0065D290, 0x0065D291, + 0x00000003, 0x0065D290, 0x0065D291, 0xA0812802, + // Block 256, offset 0x4000 + 0x00000004, 0x0065D290, 0x0065D291, 0xA0812802, 0xA0812802, 0x00000002, + 0x0065D490, 0x0065D491, 0x00000003, 0x0065D490, 0x0065D491, 0xA0812802, + 0x00000004, 0x0065D490, 0x0065D491, 0xA0812802, 0xA0812802, 0x00000002, + 0x0065D690, 0x0065D691, 0x00000003, 0x0065D690, 0x0065D691, 0xA0812802, + 0x00000004, 0x0065D690, 0x0065D691, 0xA0812802, 0xA0812802, 0x00000002, + 0x0065D890, 0x0065D891, 0x00000002, 0x02B24E9C, 0x02D6C69C, 0x00000002, + 0x02BCE69C, 0x02C4209C, 0x00000002, 0x02CC1C9C, 0x02D9769C, 0x00000002, + 0x02CC5A9C, 0x02A9189C, 0x00000003, 0x00032683, 0x404FDA20, 0x40032620, + 0x00000003, 0x404FD821, 0x82092817, 0x404FA420, 0x00000003, 0x404FD821, + 0x82092817, 0x404FA620, 0x00000003, 0x404FD821, 0x82092817, 0x404FA820, + 0x00000003, 0x404FD821, 0x82092817, 0x404FAA20, + // Block 257, offset 0x4040 + 0x00000003, 0x404FD821, 0x82092817, 0x404FAC20, 0x00000003, 0x404FD821, + 0x82092817, 0x404FAE20, 0x00000003, 0x404FD821, 0x82092817, 0x404FB020, + 0x00000003, 0x404FD821, 0x82092817, 0x404FB220, 0x00000003, 0x404FD821, + 0x82092817, 0x404FB420, 0x00000003, 0x404FD821, 0x82092817, 0x404FB620, + 0x00000003, 0x404FD821, 0x82092817, 0x404FB820, 0x00000003, 0x404FD821, + 0x82092817, 0x404FBA20, 0x00000003, 0x404FD821, 0x82092817, 0x404FBC20, + 0x00000003, 0x404FD821, 0x82092817, 0x404FBE20, 0x00000003, 0x404FD821, + 0x82092817, 0x404FC020, 0x00000003, 0x404FD821, 0x82092817, 0x404FC220, + 0x00000003, 0x404FD821, 0x82092817, 0x404FC420, 0x00000003, 0x404FD821, + 0x82092817, 0x404FC620, 0x00000003, 0x404FD821, 0x82092817, 0x404FC820, + 0x00000003, 0x404FD821, 0x82092817, 0x404FCA20, + // Block 258, offset 0x4080 + 0x00000003, 0x404FD821, 0x82092817, 0x404FCC20, 0x00000003, 0x404FD821, + 0x82092817, 0x404FCE20, 0x00000003, 0x404FD821, 0x82092817, 0x404FD020, + 0x00000003, 0x404FD821, 0x82092817, 0x404FD220, 0x00000003, 0x404FD821, + 0x82092817, 0x404FD420, 0x00000003, 0x404FD821, 0x82092817, 0x404FD620, + 0x00000003, 0x404FD821, 0x82092817, 0x404FD820, 0x00000003, 0x404FD821, + 0x82092817, 0x404FDA20, 0x00000003, 0x404FD821, 0x82092817, 0x404FDA20, + 0x00000003, 0x404FD821, 0x82092817, 0x404FDC20, 0x00000003, 0x404FD821, + 0x82092817, 0x404FDC20, 0x00000003, 0x404FD821, 0x82092817, 0x404FDC20, + 0x00000003, 0x404FD821, 0x82092817, 0x404FDE20, 0x00000003, 0x404FD821, + 0x82092817, 0x404FDE20, 0x00000003, 0x404FD821, 0x82092817, 0x404FE020, + 0x00000003, 0x404FD821, 0x82092817, 0x404FE220, + // Block 259, offset 0x40c0 + 0x00000003, 0x404FD821, 0x82092817, 0x404FE420, 0x00000003, 0x404FD821, + 0x82092817, 0x404FE620, 0x00000003, 0x404FD821, 0x82092817, 0x404FE820, + 0x00000002, 0x404FE820, 0x40500E20, 0x00000002, 0x404FE821, 0x40501020, + 0x00000002, 0x404FE821, 0x40501220, 0x00000002, 0x404FE821, 0x40501820, + 0x00000003, 0x004FE8A3, 0x40501820, 0x404FA420, 0x00000002, 0x404FE821, + 0x40501A20, 0x00000003, 0x004FE8A3, 0x40501A20, 0x404FDC20, 0x00000002, + 0x404FE821, 0x40502620, 0x00000002, 0x404FE821, 0x40502820, 0x00000002, + 0x404FE821, 0x40502A20, 0x00000002, 0x004FE8A3, 0x40502A20, 0x00000002, + 0x404FE821, 0x40502C20, 0x00000002, 0x4062AC21, 0x4063A820, 0x00000002, + 0x4062AC22, 0x4063A820, 0x00000002, 0x4062AC23, 0x4063A820, 0x00000002, + 0x4062AC24, 0x4063A820, 0x00000002, 0x4062AC25, + // Block 260, offset 0x4100 + 0x4063A820, 0x00000002, 0x4062AC26, 0x4063A820, 0x00000002, 0x4062AC27, + 0x4063A820, 0x00000002, 0x4062AC28, 0x4063A820, 0x00000002, 0x4062AC29, + 0x4063A820, 0x00000002, 0x4062AC2A, 0x4063A820, 0x00000002, 0x4062AC2B, + 0x4063A820, 0x00000002, 0x4062AC2C, 0x4063A820, 0x00000002, 0x4062AC2D, + 0x4063A820, 0x00000002, 0x4062AC2E, 0x4063A820, 0x00000002, 0x4062AC2F, + 0x4063A820, 0x00000002, 0x4062AC30, 0x4063A820, 0x00000002, 0x4062AC31, + 0x4063A820, 0x00000002, 0x4062AC32, 0x4063A820, 0x00000002, 0x4062AC33, + 0x4063A820, 0x00000002, 0x4062AC34, 0x4063A820, 0x00000002, 0x4062AC35, + 0x4063A820, 0x00000002, 0x4062AC36, 0x4063A820, 0x00000002, 0x4062AC37, + 0x4063A820, 0x00000002, 0x4062AC38, 0x4063A820, 0x00000002, 0x4062AC39, + 0x4063A820, 0x00000002, 0x4062AC3A, 0x4063A820, + // Block 261, offset 0x4140 + 0x00000002, 0x4062AC3B, 0x4063A820, 0x00000002, 0x4062AC3C, 0x4063A820, + 0x00000002, 0x4062AC3D, 0x4063A820, 0x00000002, 0x4062AC3E, 0x4063A820, + 0x00000002, 0x4062AC3F, 0x4063A820, 0x00000002, 0x4062AC40, 0x4063A820, + 0x00000002, 0x4062AC41, 0x4063A820, 0x00000002, 0x4062AC42, 0x4063A820, + 0x00000002, 0x4062AC43, 0x4063A820, 0x00000002, 0x4062AC44, 0x4063A820, + 0x00000002, 0x4062AC45, 0x4063A820, 0x00000002, 0x4062AC46, 0x4063A820, + 0x00000002, 0x4062AC47, 0x4063A820, 0x00000002, 0x4062AC48, 0x4063A820, + 0x00000002, 0x4062AC49, 0x4063A820, 0x00000002, 0x4062AC4A, 0x4063A820, + 0x00000002, 0x4062AC4B, 0x4063A820, 0x00000002, 0x4062AC4C, 0x4063A820, + 0x00000003, 0x4062AC21, 0x4063A820, 0x40646420, 0x00000003, 0x4062AC22, + 0x4063A820, 0x40646420, 0x00000003, 0x4062AC23, + // Block 262, offset 0x4180 + 0x4063A820, 0x40646420, 0x00000003, 0x4062AC24, 0x4063A820, 0x40646420, + 0x00000003, 0x4062AC25, 0x4063A820, 0x40646420, 0x00000003, 0x4062AC26, + 0x4063A820, 0x40646420, 0x00000003, 0x4062AC27, 0x4063A820, 0x40646420, + 0x00000003, 0x4062AC28, 0x4063A820, 0x40646420, 0x00000003, 0x4062AC29, + 0x4063A820, 0x40646420, 0x00000003, 0x4062AC2A, 0x4063A820, 0x40646420, + 0x00000003, 0x4062AC2B, 0x4063A820, 0x40646420, 0x00000003, 0x4062AC2C, + 0x4063A820, 0x40646420, 0x00000003, 0x4062AC2D, 0x4063A820, 0x40646420, + 0x00000003, 0x4062AC2E, 0x4063A820, 0x40646420, 0x00000003, 0x4062AC2F, + 0x4063A820, 0x40646420, 0x00000003, 0x4062AC30, 0x4063A820, 0x40646420, + 0x00000003, 0x4062AC31, 0x4063A820, 0x40646420, 0x00000003, 0x4062AC21, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC22, + // Block 263, offset 0x41c0 + 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC23, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062AC24, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC25, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC26, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062AC27, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC28, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC29, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062AC2A, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC2B, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC2C, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062AC2D, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC2E, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC2F, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062AC30, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC31, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC32, + // Block 264, offset 0x4200 + 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC33, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062AC34, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC35, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC36, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062AC37, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC38, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC39, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062AC3A, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC3B, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC3C, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062AC3D, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC3E, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC3F, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062AC40, 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC41, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC42, + // Block 265, offset 0x4240 + 0x4063A820, 0x40646A20, 0x00000003, 0x4062AC43, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062AC21, 0x4063A820, 0x40647220, 0x00000003, 0x4062AC22, + 0x4063A820, 0x40647220, 0x00000003, 0x4062AC23, 0x4063A820, 0x40647220, + 0x00000003, 0x4062AC24, 0x4063A820, 0x40647220, 0x00000003, 0x4062AC25, + 0x4063A820, 0x40647220, 0x00000003, 0x4062AC26, 0x4063A820, 0x40647220, + 0x00000003, 0x4062AC27, 0x4063A820, 0x40647220, 0x00000003, 0x4062AC28, + 0x4063A820, 0x40647220, 0x00000003, 0x4062AC29, 0x4063A820, 0x40647220, + 0x00000003, 0x4062AC2A, 0x4063A820, 0x40647220, 0x00000003, 0x4062AC2B, + 0x4063A820, 0x40647220, 0x00000003, 0x4062AC2C, 0x4063A820, 0x40647220, + 0x00000003, 0x4062AC2D, 0x4063A820, 0x40647220, 0x00000003, 0x4062AC2E, + 0x4063A820, 0x40647220, 0x00000003, 0x4062AC2F, + // Block 266, offset 0x4280 + 0x4063A820, 0x40647220, 0x00000003, 0x4062AC30, 0x4063A820, 0x40647220, + 0x00000003, 0x4062AC21, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC22, + 0x4063A820, 0x40648220, 0x00000003, 0x4062AC23, 0x4063A820, 0x40648220, + 0x00000003, 0x4062AC24, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC25, + 0x4063A820, 0x40648220, 0x00000003, 0x4062AC26, 0x4063A820, 0x40648220, + 0x00000003, 0x4062AC27, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC28, + 0x4063A820, 0x40648220, 0x00000003, 0x4062AC29, 0x4063A820, 0x40648220, + 0x00000003, 0x4062AC2A, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC2B, + 0x4063A820, 0x40648220, 0x00000003, 0x4062AC2C, 0x4063A820, 0x40648220, + 0x00000003, 0x4062AC2D, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC2E, + 0x4063A820, 0x40648220, 0x00000003, 0x4062AC2F, + // Block 267, offset 0x42c0 + 0x4063A820, 0x40648220, 0x00000003, 0x4062AC30, 0x4063A820, 0x40648220, + 0x00000003, 0x4062AC31, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC32, + 0x4063A820, 0x40648220, 0x00000003, 0x4062AC33, 0x4063A820, 0x40648220, + 0x00000003, 0x4062AC34, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC35, + 0x4063A820, 0x40648220, 0x00000003, 0x4062AC36, 0x4063A820, 0x40648220, + 0x00000003, 0x4062AC37, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC38, + 0x4063A820, 0x40648220, 0x00000003, 0x4062AC39, 0x4063A820, 0x40648220, + 0x00000003, 0x4062AC3A, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC3B, + 0x4063A820, 0x40648220, 0x00000003, 0x4062AC3C, 0x4063A820, 0x40648220, + 0x00000003, 0x4062AC3D, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC3E, + 0x4063A820, 0x40648220, 0x00000003, 0x4062AC3F, + // Block 268, offset 0x4300 + 0x4063A820, 0x40648220, 0x00000003, 0x4062AC40, 0x4063A820, 0x40648220, + 0x00000003, 0x4062AC41, 0x4063A820, 0x40648220, 0x00000003, 0x4062AC42, + 0x4063A820, 0x40648220, 0x00000003, 0x4062AC43, 0x4063A820, 0x40648220, + 0x00000003, 0x4062AC21, 0x4063A820, 0x40648420, 0x00000003, 0x4062AC22, + 0x4063A820, 0x40648420, 0x00000003, 0x4062AC23, 0x4063A820, 0x40648420, + 0x00000003, 0x4062AC24, 0x4063A820, 0x40648420, 0x00000003, 0x4062AC25, + 0x4063A820, 0x40648420, 0x00000003, 0x4062AC26, 0x4063A820, 0x40648420, + 0x00000003, 0x4062AC27, 0x4063A820, 0x40648420, 0x00000003, 0x4062AC21, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC22, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062AC23, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC24, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC25, + // Block 269, offset 0x4340 + 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC26, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062AC27, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC28, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC29, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062AC2A, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC2B, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC2C, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062AC2D, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC2E, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC2F, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062AC30, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC31, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC32, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062AC33, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC34, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC35, + // Block 270, offset 0x4380 + 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC36, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062AC37, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC38, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC39, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062AC3A, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC3B, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC3C, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062AC3D, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC3E, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC3F, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062AC40, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC41, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC42, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062AC43, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC44, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC45, + // Block 271, offset 0x43c0 + 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC46, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062AC47, 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC48, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062AC49, 0x4063A820, 0x40648C20, + 0x00000002, 0x4062AC21, 0x4063AA20, 0x00000002, 0x4062AC22, 0x4063AA20, + 0x00000002, 0x4062AC23, 0x4063AA20, 0x00000002, 0x4062AC24, 0x4063AA20, + 0x00000002, 0x4062AC25, 0x4063AA20, 0x00000002, 0x4062AC26, 0x4063AA20, + 0x00000002, 0x4062AC27, 0x4063AA20, 0x00000002, 0x4062AC28, 0x4063AA20, + 0x00000002, 0x4062AC29, 0x4063AA20, 0x00000002, 0x4062AC2A, 0x4063AA20, + 0x00000002, 0x4062AC2B, 0x4063AA20, 0x00000002, 0x4062AC2C, 0x4063AA20, + 0x00000002, 0x4062AC2D, 0x4063AA20, 0x00000002, 0x4062AC2E, 0x4063AA20, + 0x00000002, 0x4062AC2F, 0x4063AA20, 0x00000002, + // Block 272, offset 0x4400 + 0x4062AC30, 0x4063AA20, 0x00000002, 0x4062AC31, 0x4063AA20, 0x00000002, + 0x4062AC32, 0x4063AA20, 0x00000002, 0x4062AC33, 0x4063AA20, 0x00000002, + 0x4062AC34, 0x4063AA20, 0x00000002, 0x4062AC35, 0x4063AA20, 0x00000002, + 0x4062AC36, 0x4063AA20, 0x00000002, 0x4062AC37, 0x4063AA20, 0x00000002, + 0x4062AC38, 0x4063AA20, 0x00000002, 0x4062AC39, 0x4063AA20, 0x00000002, + 0x4062AC3A, 0x4063AA20, 0x00000003, 0x4062AC21, 0x4063AA20, 0x40646420, + 0x00000003, 0x4062AC22, 0x4063AA20, 0x40646420, 0x00000003, 0x4062AC21, + 0x4063AA20, 0x40648C20, 0x00000003, 0x4062AC22, 0x4063AA20, 0x40648C20, + 0x00000003, 0x4062AC23, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062AC24, + 0x4063AA20, 0x40648C20, 0x00000003, 0x4062AC25, 0x4063AA20, 0x40648C20, + 0x00000003, 0x4062AC26, 0x4063AA20, 0x40648C20, + // Block 273, offset 0x4440 + 0x00000003, 0x4062AC21, 0x4063AC20, 0x40646420, 0x00000002, 0x4062AC21, + 0x4063B020, 0x00000002, 0x4062AC22, 0x4063B020, 0x00000002, 0x4062AC23, + 0x4063B020, 0x00000002, 0x4062AC24, 0x4063B020, 0x00000002, 0x4062AC25, + 0x4063B020, 0x00000002, 0x4062AC26, 0x4063B020, 0x00000002, 0x4062AC27, + 0x4063B020, 0x00000002, 0x4062AC28, 0x4063B020, 0x00000002, 0x4062AC29, + 0x4063B020, 0x00000002, 0x4062AC2A, 0x4063B020, 0x00000002, 0x4062AC2B, + 0x4063B020, 0x00000002, 0x4062AC2C, 0x4063B020, 0x00000002, 0x4062AC2D, + 0x4063B020, 0x00000002, 0x4062AC2E, 0x4063B020, 0x00000002, 0x4062AC2F, + 0x4063B020, 0x00000002, 0x4062AC30, 0x4063B020, 0x00000002, 0x4062AC31, + 0x4063B020, 0x00000002, 0x4062AC32, 0x4063B020, 0x00000002, 0x4062AC33, + 0x4063B020, 0x00000002, 0x4062AC34, 0x4063B020, + // Block 274, offset 0x4480 + 0x00000002, 0x4062AC35, 0x4063B020, 0x00000002, 0x4062AC36, 0x4063B020, + 0x00000002, 0x4062AC37, 0x4063B020, 0x00000002, 0x4062AC38, 0x4063B020, + 0x00000002, 0x4062AC39, 0x4063B020, 0x00000002, 0x4062AC3A, 0x4063B020, + 0x00000002, 0x4062AC3B, 0x4063B020, 0x00000002, 0x4062AC3C, 0x4063B020, + 0x00000002, 0x4062AC3D, 0x4063B020, 0x00000002, 0x4062AC3E, 0x4063B020, + 0x00000003, 0x4062AC21, 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC22, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC23, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062AC24, 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC25, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC26, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062AC27, 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC28, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC29, + // Block 275, offset 0x44c0 + 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC2A, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062AC2B, 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC2C, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC2D, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062AC2E, 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC2F, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC30, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062AC31, 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC32, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062AC21, 0x4063B020, 0x40647220, + 0x00000003, 0x4062AC22, 0x4063B020, 0x40647220, 0x00000003, 0x4062AC23, + 0x4063B020, 0x40647220, 0x00000003, 0x4062AC24, 0x4063B020, 0x40647220, + 0x00000003, 0x4062AC25, 0x4063B020, 0x40647220, 0x00000003, 0x4062AC26, + 0x4063B020, 0x40647220, 0x00000003, 0x4062AC27, + // Block 276, offset 0x4500 + 0x4063B020, 0x40647220, 0x00000003, 0x4062AC21, 0x4063B020, 0x40648220, + 0x00000003, 0x4062AC22, 0x4063B020, 0x40648220, 0x00000003, 0x4062AC23, + 0x4063B020, 0x40648220, 0x00000003, 0x4062AC24, 0x4063B020, 0x40648220, + 0x00000003, 0x4062AC25, 0x4063B020, 0x40648220, 0x00000003, 0x4062AC26, + 0x4063B020, 0x40648220, 0x00000003, 0x4062AC27, 0x4063B020, 0x40648220, + 0x00000003, 0x4062AC28, 0x4063B020, 0x40648220, 0x00000003, 0x4062AC29, + 0x4063B020, 0x40648220, 0x00000003, 0x4062AC21, 0x4063B020, 0x40648420, + 0x00000003, 0x4062AC22, 0x4063B020, 0x40648420, 0x00000003, 0x4062AC23, + 0x4063B020, 0x40648420, 0x00000003, 0x4062AC24, 0x4063B020, 0x40648420, + 0x00000003, 0x4062AC25, 0x4063B020, 0x40648420, 0x00000002, 0x4062AC21, + 0x4063B220, 0x00000002, 0x4062AC22, 0x4063B220, + // Block 277, offset 0x4540 + 0x00000002, 0x4062AC23, 0x4063B220, 0x00000003, 0x4062AC21, 0x4063B420, + 0x40646420, 0x00000003, 0x4062AC22, 0x4063B420, 0x40646420, 0x00000003, + 0x4062AC23, 0x4063B420, 0x40646420, 0x00000003, 0x4062AC24, 0x4063B420, + 0x40646420, 0x00000003, 0x4062AC25, 0x4063B420, 0x40646420, 0x00000003, + 0x4062AC26, 0x4063B420, 0x40646420, 0x00000003, 0x4062AC27, 0x4063B420, + 0x40646420, 0x00000003, 0x4062AC28, 0x4063B420, 0x40646420, 0x00000003, + 0x4062AC29, 0x4063B420, 0x40646420, 0x00000003, 0x4062AC2A, 0x4063B420, + 0x40646420, 0x00000003, 0x4062AC2B, 0x4063B420, 0x40646420, 0x00000003, + 0x4062AC2C, 0x4063B420, 0x40646420, 0x00000003, 0x4062AC2D, 0x4063B420, + 0x40646420, 0x00000003, 0x4062AC21, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062AC22, 0x4063B420, 0x40646A20, 0x00000003, + // Block 278, offset 0x4580 + 0x4062AC23, 0x4063B420, 0x40646A20, 0x00000003, 0x4062AC24, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062AC25, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062AC26, 0x4063B420, 0x40646A20, 0x00000003, 0x4062AC27, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062AC28, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062AC29, 0x4063B420, 0x40646A20, 0x00000003, 0x4062AC2A, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062AC2B, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062AC2C, 0x4063B420, 0x40646A20, 0x00000003, 0x4062AC2D, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062AC2E, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062AC2F, 0x4063B420, 0x40646A20, 0x00000003, 0x4062AC30, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062AC31, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062AC32, 0x4063B420, 0x40646A20, 0x00000003, + // Block 279, offset 0x45c0 + 0x4062AC33, 0x4063B420, 0x40646A20, 0x00000003, 0x4062AC34, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062AC21, 0x4063B420, 0x40647220, 0x00000003, + 0x4062AC22, 0x4063B420, 0x40647220, 0x00000003, 0x4062AC23, 0x4063B420, + 0x40647220, 0x00000003, 0x4062AC24, 0x4063B420, 0x40647220, 0x00000003, + 0x4062AC25, 0x4063B420, 0x40647220, 0x00000003, 0x4062AC26, 0x4063B420, + 0x40647220, 0x00000003, 0x4062AC27, 0x4063B420, 0x40647220, 0x00000003, + 0x4062AC28, 0x4063B420, 0x40647220, 0x00000003, 0x4062AC29, 0x4063B420, + 0x40647220, 0x00000003, 0x4062AC21, 0x4063B420, 0x40648220, 0x00000003, + 0x4062AC22, 0x4063B420, 0x40648220, 0x00000003, 0x4062AC23, 0x4063B420, + 0x40648220, 0x00000003, 0x4062AC24, 0x4063B420, 0x40648220, 0x00000003, + 0x4062AC25, 0x4063B420, 0x40648220, 0x00000003, + // Block 280, offset 0x4600 + 0x4062AC26, 0x4063B420, 0x40648220, 0x00000003, 0x4062AC27, 0x4063B420, + 0x40648220, 0x00000003, 0x4062AC28, 0x4063B420, 0x40648220, 0x00000003, + 0x4062AC29, 0x4063B420, 0x40648220, 0x00000003, 0x4062AC2A, 0x4063B420, + 0x40648220, 0x00000003, 0x4062AC2B, 0x4063B420, 0x40648220, 0x00000003, + 0x4062AC2C, 0x4063B420, 0x40648220, 0x00000003, 0x4062AC2D, 0x4063B420, + 0x40648220, 0x00000003, 0x4062AC2E, 0x4063B420, 0x40648220, 0x00000003, + 0x4062AC2F, 0x4063B420, 0x40648220, 0x00000003, 0x4062AC21, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC22, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC23, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC24, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC25, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC26, 0x4063B420, 0x40648C20, 0x00000003, + // Block 281, offset 0x4640 + 0x4062AC27, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC28, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC29, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC2A, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC2B, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC2C, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC2D, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC2E, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC2F, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC30, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC31, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC32, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC33, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC34, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC35, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC36, 0x4063B420, 0x40648C20, 0x00000003, + // Block 282, offset 0x4680 + 0x4062AC37, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC38, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC39, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC3A, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC3B, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC3C, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC3D, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC3E, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC3F, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC40, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC41, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC42, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC43, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC44, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC45, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC46, 0x4063B420, 0x40648C20, 0x00000003, + // Block 283, offset 0x46c0 + 0x4062AC47, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC48, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC49, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC4A, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC4B, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC4C, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC4D, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC4E, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC4F, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC50, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC51, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC52, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC53, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC54, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC55, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC56, 0x4063B420, 0x40648C20, 0x00000003, + // Block 284, offset 0x4700 + 0x4062AC57, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC58, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC59, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC5A, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC5B, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC5C, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC5D, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC5E, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062AC5F, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062AC60, 0x4063B420, 0x40648C20, 0x00000003, 0x4062AC61, 0x4063B420, + 0x40648C20, 0x00000002, 0x4062AC21, 0x4063B620, 0x00000002, 0x4062AC22, + 0x4063B620, 0x00000002, 0x4062AC23, 0x4063B620, 0x00000002, 0x4062AC24, + 0x4063B620, 0x00000002, 0x4062AC25, 0x4063B620, 0x00000002, 0x4062AC26, + 0x4063B620, 0x00000002, 0x4062AC27, 0x4063B620, + // Block 285, offset 0x4740 + 0x00000002, 0x4062AC28, 0x4063B620, 0x00000002, 0x4062AC29, 0x4063B620, + 0x00000002, 0x4062AC2A, 0x4063B620, 0x00000002, 0x4062AC2B, 0x4063B620, + 0x00000002, 0x4062AC2C, 0x4063B620, 0x00000002, 0x4062AC2D, 0x4063B620, + 0x00000002, 0x4062AC2E, 0x4063B620, 0x00000002, 0x4062AC2F, 0x4063B620, + 0x00000002, 0x4062AC30, 0x4063B620, 0x00000002, 0x4062AC31, 0x4063B620, + 0x00000002, 0x4062AC32, 0x4063B620, 0x00000002, 0x4062AC33, 0x4063B620, + 0x00000002, 0x4062AC34, 0x4063B620, 0x00000002, 0x4062AC35, 0x4063B620, + 0x00000002, 0x4062AC36, 0x4063B620, 0x00000002, 0x4062AC37, 0x4063B620, + 0x00000002, 0x4062AC38, 0x4063B620, 0x00000002, 0x4062AC39, 0x4063B620, + 0x00000002, 0x4062AC3A, 0x4063B620, 0x00000002, 0x4062AC3B, 0x4063B620, + 0x00000002, 0x4062AC3C, 0x4063B620, 0x00000002, + // Block 286, offset 0x4780 + 0x4062AC3D, 0x4063B620, 0x00000002, 0x4062AC3E, 0x4063B620, 0x00000002, + 0x4062AC3F, 0x4063B620, 0x00000002, 0x4062AC40, 0x4063B620, 0x00000002, + 0x4062AC41, 0x4063B620, 0x00000002, 0x4062AC42, 0x4063B620, 0x00000002, + 0x4062AC43, 0x4063B620, 0x00000002, 0x4062AC44, 0x4063B620, 0x00000002, + 0x4062AC21, 0x4063B820, 0x00000002, 0x4062AC22, 0x4063B820, 0x00000002, + 0x4062AC23, 0x4063B820, 0x00000002, 0x4062AC24, 0x4063B820, 0x00000002, + 0x4062AC25, 0x4063B820, 0x00000002, 0x4062AC26, 0x4063B820, 0x00000002, + 0x4062AC27, 0x4063B820, 0x00000002, 0x4062AC28, 0x4063B820, 0x00000002, + 0x4062AC29, 0x4063B820, 0x00000002, 0x4062AC2A, 0x4063B820, 0x00000002, + 0x4062AC2B, 0x4063B820, 0x00000002, 0x4062AC2C, 0x4063B820, 0x00000002, + 0x4062AC2D, 0x4063B820, 0x00000002, 0x4062AC2E, + // Block 287, offset 0x47c0 + 0x4063B820, 0x00000002, 0x4062AC2F, 0x4063B820, 0x00000002, 0x4062AC30, + 0x4063B820, 0x00000002, 0x4062AC31, 0x4063B820, 0x00000002, 0x4062AC32, + 0x4063B820, 0x00000002, 0x4062AC33, 0x4063B820, 0x00000002, 0x4062AC34, + 0x4063B820, 0x00000002, 0x4062AC35, 0x4063B820, 0x00000002, 0x4062AC36, + 0x4063B820, 0x00000002, 0x4062AC37, 0x4063B820, 0x00000002, 0x4062AC38, + 0x4063B820, 0x00000002, 0x4062AC39, 0x4063B820, 0x00000002, 0x4062AC3A, + 0x4063B820, 0x00000002, 0x4062AC3B, 0x4063B820, 0x00000002, 0x4062AC3C, + 0x4063B820, 0x00000002, 0x4062AC3D, 0x4063B820, 0x00000002, 0x4062AC3E, + 0x4063B820, 0x00000002, 0x4062AC3F, 0x4063B820, 0x00000002, 0x4062AC40, + 0x4063B820, 0x00000002, 0x4062AC41, 0x4063B820, 0x00000002, 0x4062AC42, + 0x4063B820, 0x00000002, 0x4062AC43, 0x4063B820, + // Block 288, offset 0x4800 + 0x00000002, 0x4062AC44, 0x4063B820, 0x00000002, 0x4062AC45, 0x4063B820, + 0x00000002, 0x4062AC46, 0x4063B820, 0x00000002, 0x4062AC47, 0x4063B820, + 0x00000002, 0x4062AC48, 0x4063B820, 0x00000002, 0x4062AC49, 0x4063B820, + 0x00000002, 0x4062AC4A, 0x4063B820, 0x00000002, 0x4062AC4B, 0x4063B820, + 0x00000002, 0x4062AC4C, 0x4063B820, 0x00000002, 0x4062AC4D, 0x4063B820, + 0x00000002, 0x4062AC4E, 0x4063B820, 0x00000002, 0x4062AC4F, 0x4063B820, + 0x00000002, 0x4062AC50, 0x4063B820, 0x00000002, 0x4062AC51, 0x4063B820, + 0x00000002, 0x4062AC52, 0x4063B820, 0x00000002, 0x4062AC53, 0x4063B820, + 0x00000002, 0x4062AC54, 0x4063B820, 0x00000002, 0x4062AC55, 0x4063B820, + 0x00000002, 0x4062AC56, 0x4063B820, 0x00000002, 0x4062AC57, 0x4063B820, + 0x00000002, 0x4062AC58, 0x4063B820, 0x00000002, + // Block 289, offset 0x4840 + 0x4062AC59, 0x4063B820, 0x00000002, 0x4062AC5A, 0x4063B820, 0x00000002, + 0x4062AC5B, 0x4063B820, 0x00000002, 0x4062AC5C, 0x4063B820, 0x00000002, + 0x4062AC5D, 0x4063B820, 0x00000002, 0x4062AC5E, 0x4063B820, 0x00000002, + 0x4062AC5F, 0x4063B820, 0x00000002, 0x4062AC60, 0x4063B820, 0x00000002, + 0x4062AC61, 0x4063B820, 0x00000002, 0x4062AC62, 0x4063B820, 0x00000002, + 0x4062AC63, 0x4063B820, 0x00000003, 0x4062AC21, 0x4063B820, 0x40646420, + 0x00000003, 0x4062AC22, 0x4063B820, 0x40646420, 0x00000003, 0x4062AC23, + 0x4063B820, 0x40646420, 0x00000003, 0x4062AC24, 0x4063B820, 0x40646420, + 0x00000003, 0x4062AC25, 0x4063B820, 0x40646420, 0x00000003, 0x4062AC26, + 0x4063B820, 0x40646420, 0x00000003, 0x4062AC27, 0x4063B820, 0x40646420, + 0x00000003, 0x4062AC28, 0x4063B820, 0x40646420, + // Block 290, offset 0x4880 + 0x00000003, 0x4062AC29, 0x4063B820, 0x40646420, 0x00000003, 0x4062AC2A, + 0x4063B820, 0x40646420, 0x00000003, 0x4062AC2B, 0x4063B820, 0x40646420, + 0x00000003, 0x4062AC2C, 0x4063B820, 0x40646420, 0x00000003, 0x4062AC21, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC22, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062AC23, 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC24, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC25, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062AC26, 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC27, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC28, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062AC29, 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC2A, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC2B, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062AC2C, 0x4063B820, 0x40646A20, + // Block 291, offset 0x48c0 + 0x00000003, 0x4062AC2D, 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC2E, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC2F, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062AC30, 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC31, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC32, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062AC33, 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC34, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC35, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062AC36, 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC37, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062AC38, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062AC21, 0x4063B820, 0x40647220, 0x00000003, 0x4062AC22, + 0x4063B820, 0x40647220, 0x00000003, 0x4062AC23, 0x4063B820, 0x40647220, + 0x00000003, 0x4062AC24, 0x4063B820, 0x40647220, + // Block 292, offset 0x4900 + 0x00000003, 0x4062AC25, 0x4063B820, 0x40647220, 0x00000003, 0x4062AC26, + 0x4063B820, 0x40647220, 0x00000003, 0x4062AC21, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062AC22, 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC23, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC24, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062AC25, 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC26, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC27, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062AC28, 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC29, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC2A, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062AC2B, 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC2C, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC2D, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062AC2E, 0x4063B820, 0x40648C20, + // Block 293, offset 0x4940 + 0x00000003, 0x4062AC2F, 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC30, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC31, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062AC32, 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC33, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC34, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062AC35, 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC36, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC37, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062AC38, 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC39, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC3A, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062AC3B, 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC3C, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062AC21, 0x4063B820, 0x40648E20, + 0x00000002, 0x4062AC21, 0x4063BA20, 0x00000002, + // Block 294, offset 0x4980 + 0x4062AC22, 0x4063BA20, 0x00000002, 0x4062AC23, 0x4063BA20, 0x00000002, + 0x4062AC24, 0x4063BA20, 0x00000002, 0x4062AC25, 0x4063BA20, 0x00000002, + 0x4062AC26, 0x4063BA20, 0x00000002, 0x4062AC27, 0x4063BA20, 0x00000002, + 0x4062AC28, 0x4063BA20, 0x00000002, 0x4062AC29, 0x4063BA20, 0x00000002, + 0x4062AC2A, 0x4063BA20, 0x00000002, 0x4062AC2B, 0x4063BA20, 0x00000002, + 0x4062AC2C, 0x4063BA20, 0x00000002, 0x4062AC2D, 0x4063BA20, 0x00000002, + 0x4062AC2E, 0x4063BA20, 0x00000002, 0x4062AC2F, 0x4063BA20, 0x00000002, + 0x4062AC30, 0x4063BA20, 0x00000002, 0x4062AC31, 0x4063BA20, 0x00000002, + 0x4062AC32, 0x4063BA20, 0x00000002, 0x4062AC33, 0x4063BA20, 0x00000002, + 0x4062AC34, 0x4063BA20, 0x00000002, 0x4062AC35, 0x4063BA20, 0x00000002, + 0x4062AC36, 0x4063BA20, 0x00000002, 0x4062AC37, + // Block 295, offset 0x49c0 + 0x4063BA20, 0x00000002, 0x4062AC38, 0x4063BA20, 0x00000002, 0x4062AC39, + 0x4063BA20, 0x00000003, 0x4062AC21, 0x4063BA20, 0x40646420, 0x00000003, + 0x4062AC22, 0x4063BA20, 0x40646420, 0x00000003, 0x4062AC23, 0x4063BA20, + 0x40646420, 0x00000003, 0x4062AC24, 0x4063BA20, 0x40646420, 0x00000003, + 0x4062AC25, 0x4063BA20, 0x40646420, 0x00000003, 0x4062AC26, 0x4063BA20, + 0x40646420, 0x00000003, 0x4062AC27, 0x4063BA20, 0x40646420, 0x00000003, + 0x4062AC28, 0x4063BA20, 0x40646420, 0x00000003, 0x4062AC29, 0x4063BA20, + 0x40646420, 0x00000003, 0x4062AC21, 0x4063BA20, 0x40646A20, 0x00000003, + 0x4062AC22, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC23, 0x4063BA20, + 0x40646A20, 0x00000003, 0x4062AC24, 0x4063BA20, 0x40646A20, 0x00000003, + 0x4062AC25, 0x4063BA20, 0x40646A20, 0x00000003, + // Block 296, offset 0x4a00 + 0x4062AC26, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC27, 0x4063BA20, + 0x40646A20, 0x00000003, 0x4062AC28, 0x4063BA20, 0x40646A20, 0x00000003, + 0x4062AC29, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC2A, 0x4063BA20, + 0x40646A20, 0x00000003, 0x4062AC2B, 0x4063BA20, 0x40646A20, 0x00000003, + 0x4062AC2C, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC2D, 0x4063BA20, + 0x40646A20, 0x00000003, 0x4062AC2E, 0x4063BA20, 0x40646A20, 0x00000003, + 0x4062AC2F, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC30, 0x4063BA20, + 0x40646A20, 0x00000003, 0x4062AC31, 0x4063BA20, 0x40646A20, 0x00000003, + 0x4062AC32, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC33, 0x4063BA20, + 0x40646A20, 0x00000003, 0x4062AC34, 0x4063BA20, 0x40646A20, 0x00000003, + 0x4062AC35, 0x4063BA20, 0x40646A20, 0x00000003, + // Block 297, offset 0x4a40 + 0x4062AC36, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC37, 0x4063BA20, + 0x40646A20, 0x00000003, 0x4062AC38, 0x4063BA20, 0x40646A20, 0x00000003, + 0x4062AC39, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC3A, 0x4063BA20, + 0x40646A20, 0x00000003, 0x4062AC3B, 0x4063BA20, 0x40646A20, 0x00000003, + 0x4062AC3C, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC3D, 0x4063BA20, + 0x40646A20, 0x00000003, 0x4062AC3E, 0x4063BA20, 0x40646A20, 0x00000003, + 0x4062AC3F, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062AC21, 0x4063BA20, + 0x40647220, 0x00000003, 0x4062AC22, 0x4063BA20, 0x40647220, 0x00000003, + 0x4062AC23, 0x4063BA20, 0x40647220, 0x00000003, 0x4062AC24, 0x4063BA20, + 0x40647220, 0x00000003, 0x4062AC25, 0x4063BA20, 0x40647220, 0x00000003, + 0x4062AC26, 0x4063BA20, 0x40647220, 0x00000003, + // Block 298, offset 0x4a80 + 0x4062AC27, 0x4063BA20, 0x40647220, 0x00000003, 0x4062AC28, 0x4063BA20, + 0x40647220, 0x00000003, 0x4062AC29, 0x4063BA20, 0x40647220, 0x00000003, + 0x4062AC2A, 0x4063BA20, 0x40647220, 0x00000003, 0x4062AC21, 0x4063BA20, + 0x40648C20, 0x00000003, 0x4062AC22, 0x4063BA20, 0x40648C20, 0x00000003, + 0x4062AC23, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062AC24, 0x4063BA20, + 0x40648C20, 0x00000003, 0x4062AC25, 0x4063BA20, 0x40648C20, 0x00000003, + 0x4062AC26, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062AC27, 0x4063BA20, + 0x40648C20, 0x00000003, 0x4062AC28, 0x4063BA20, 0x40648C20, 0x00000003, + 0x4062AC29, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062AC2A, 0x4063BA20, + 0x40648C20, 0x00000003, 0x4062AC2B, 0x4063BA20, 0x40648C20, 0x00000003, + 0x4062AC2C, 0x4063BA20, 0x40648C20, 0x00000003, + // Block 299, offset 0x4ac0 + 0x4062AC2D, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062AC2E, 0x4063BA20, + 0x40648C20, 0x00000003, 0x4062AC2F, 0x4063BA20, 0x40648C20, 0x00000003, + 0x4062AC30, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062AC31, 0x4063BA20, + 0x40648C20, 0x00000003, 0x4062AC32, 0x4063BA20, 0x40648C20, 0x00000003, + 0x4062AC33, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062AC34, 0x4063BA20, + 0x40648C20, 0x00000003, 0x4062AC35, 0x4063BA20, 0x40648C20, 0x00000003, + 0x4062AC36, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062AC37, 0x4063BA20, + 0x40648C20, 0x00000003, 0x4062AC38, 0x4063BA20, 0x40648C20, 0x00000002, + 0x4062AC21, 0x4063BC20, 0x00000002, 0x4062AC22, 0x4063BC20, 0x00000002, + 0x4062AC23, 0x4063BC20, 0x00000002, 0x4062AC24, 0x4063BC20, 0x00000002, + 0x4062AC25, 0x4063BC20, 0x00000002, 0x4062AC26, + // Block 300, offset 0x4b00 + 0x4063BC20, 0x00000002, 0x4062AC27, 0x4063BC20, 0x00000002, 0x4062AC21, + 0x4063BE20, 0x00000002, 0x4062AC22, 0x4063BE20, 0x00000002, 0x4062AC23, + 0x4063BE20, 0x00000002, 0x4062AC24, 0x4063BE20, 0x00000002, 0x4062AC25, + 0x4063BE20, 0x00000002, 0x4062AC26, 0x4063BE20, 0x00000002, 0x4062AC27, + 0x4063BE20, 0x00000002, 0x4062AC28, 0x4063BE20, 0x00000002, 0x4062AC29, + 0x4063BE20, 0x00000002, 0x4062AC2A, 0x4063BE20, 0x00000002, 0x4062AC2B, + 0x4063BE20, 0x00000002, 0x4062AC2C, 0x4063BE20, 0x00000002, 0x4062AC2D, + 0x4063BE20, 0x00000002, 0x4062AC2E, 0x4063BE20, 0x00000002, 0x4062AC2F, + 0x4063BE20, 0x00000002, 0x4062AC30, 0x4063BE20, 0x00000003, 0x4062AC21, + 0x4063BE20, 0x40646420, 0x00000003, 0x4062AC21, 0x4063BE20, 0x40648C20, + 0x00000003, 0x4062AC22, 0x4063BE20, 0x40648C20, + // Block 301, offset 0x4b40 + 0x00000003, 0x4062AC23, 0x4063BE20, 0x40648C20, 0x00000003, 0x4062AC24, + 0x4063BE20, 0x40648C20, 0x00000003, 0x4062AC25, 0x4063BE20, 0x40648C20, + 0x00000003, 0x4062AC26, 0x4063BE20, 0x40648C20, 0x00000003, 0x4062AC27, + 0x4063BE20, 0x40648C20, 0x00000003, 0x4062AC28, 0x4063BE20, 0x40648C20, + 0x00000002, 0x4062AC21, 0x4063C020, 0x00000002, 0x4062AC22, 0x4063C020, + 0x00000002, 0x4062AC23, 0x4063C020, 0x00000002, 0x4062AC24, 0x4063C020, + 0x00000002, 0x4062AC25, 0x4063C020, 0x00000002, 0x4062AC26, 0x4063C020, + 0x00000002, 0x4062AC27, 0x4063C020, 0x00000002, 0x4062AC28, 0x4063C020, + 0x00000002, 0x4062AC29, 0x4063C020, 0x00000002, 0x4062AC2A, 0x4063C020, + 0x00000002, 0x4062AC2B, 0x4063C020, 0x00000002, 0x4062AC2C, 0x4063C020, + 0x00000002, 0x4062AC2D, 0x4063C020, 0x00000002, + // Block 302, offset 0x4b80 + 0x4062AC2E, 0x4063C020, 0x00000002, 0x4062AC2F, 0x4063C020, 0x00000002, + 0x4062AC30, 0x4063C020, 0x00000002, 0x4062AC31, 0x4063C020, 0x00000002, + 0x4062AC32, 0x4063C020, 0x00000002, 0x4062AC33, 0x4063C020, 0x00000002, + 0x4062AC34, 0x4063C020, 0x00000002, 0x4062AC35, 0x4063C020, 0x00000002, + 0x4062AC36, 0x4063C020, 0x00000002, 0x4062AC37, 0x4063C020, 0x00000002, + 0x4062AC38, 0x4063C020, 0x00000002, 0x4062AC39, 0x4063C020, 0x00000002, + 0x4062AC3A, 0x4063C020, 0x00000002, 0x4062AC3B, 0x4063C020, 0x00000002, + 0x4062AC3C, 0x4063C020, 0x00000002, 0x4062AC3D, 0x4063C020, 0x00000002, + 0x4062AC3E, 0x4063C020, 0x00000002, 0x4062AC3F, 0x4063C020, 0x00000002, + 0x4062AC40, 0x4063C020, 0x00000002, 0x4062AC41, 0x4063C020, 0x00000002, + 0x4062AC42, 0x4063C020, 0x00000002, 0x4062AC43, + // Block 303, offset 0x4bc0 + 0x4063C020, 0x00000002, 0x4062AC44, 0x4063C020, 0x00000002, 0x4062AC45, + 0x4063C020, 0x00000002, 0x4062AC46, 0x4063C020, 0x00000002, 0x4062AC47, + 0x4063C020, 0x00000002, 0x4062AC48, 0x4063C020, 0x00000002, 0x4062AC49, + 0x4063C020, 0x00000002, 0x4062AC4A, 0x4063C020, 0x00000002, 0x4062AC4B, + 0x4063C020, 0x00000002, 0x4062AC4C, 0x4063C020, 0x00000002, 0x4062AC21, + 0x4063C220, 0x00000002, 0x4062AC22, 0x4063C220, 0x00000002, 0x4062AC23, + 0x4063C220, 0x00000002, 0x4062AC24, 0x4063C220, 0x00000002, 0x4062AC25, + 0x4063C220, 0x00000002, 0x4062AC26, 0x4063C220, 0x00000002, 0x4062AC27, + 0x4063C220, 0x00000002, 0x4062AC28, 0x4063C220, 0x00000002, 0x4062AC29, + 0x4063C220, 0x00000002, 0x4062AC2A, 0x4063C220, 0x00000002, 0x4062AC2B, + 0x4063C220, 0x00000002, 0x4062AC2C, 0x4063C220, + // Block 304, offset 0x4c00 + 0x00000002, 0x4062AC2D, 0x4063C220, 0x00000002, 0x4062AC2E, 0x4063C220, + 0x00000002, 0x4062AC2F, 0x4063C220, 0x00000002, 0x4062AC30, 0x4063C220, + 0x00000002, 0x4062AC31, 0x4063C220, 0x00000002, 0x4062AC32, 0x4063C220, + 0x00000002, 0x4062AC33, 0x4063C220, 0x00000002, 0x4062AC34, 0x4063C220, + 0x00000002, 0x4062AC35, 0x4063C220, 0x00000002, 0x4062AC36, 0x4063C220, + 0x00000002, 0x4062AC37, 0x4063C220, 0x00000002, 0x4062AC38, 0x4063C220, + 0x00000002, 0x4062AC39, 0x4063C220, 0x00000002, 0x4062AC3A, 0x4063C220, + 0x00000002, 0x4062AC3B, 0x4063C220, 0x00000002, 0x4062AC3C, 0x4063C220, + 0x00000002, 0x4062AC3D, 0x4063C220, 0x00000002, 0x4062AC3E, 0x4063C220, + 0x00000002, 0x4062AC3F, 0x4063C220, 0x00000002, 0x4062AC40, 0x4063C220, + 0x00000002, 0x4062AC41, 0x4063C220, 0x00000002, + // Block 305, offset 0x4c40 + 0x4062AC42, 0x4063C220, 0x00000002, 0x4062AC43, 0x4063C220, 0x00000002, + 0x4062AC44, 0x4063C220, 0x00000002, 0x4062AC45, 0x4063C220, 0x00000002, + 0x4062AC46, 0x4063C220, 0x00000002, 0x4062AC47, 0x4063C220, 0x00000002, + 0x4062AC48, 0x4063C220, 0x00000002, 0x4062AC49, 0x4063C220, 0x00000002, + 0x4062AC4A, 0x4063C220, 0x00000002, 0x4062AC4B, 0x4063C220, 0x00000002, + 0x4062AC4C, 0x4063C220, 0x00000002, 0x4062AC4D, 0x4063C220, 0x00000002, + 0x4062AC4E, 0x4063C220, 0x00000002, 0x4062AC4F, 0x4063C220, 0x00000002, + 0x4062AC50, 0x4063C220, 0x00000002, 0x4062AC51, 0x4063C220, 0x00000002, + 0x4062AC52, 0x4063C220, 0x00000002, 0x4062AC53, 0x4063C220, 0x00000002, + 0x4062AC54, 0x4063C220, 0x00000002, 0x4062AC55, 0x4063C220, 0x00000002, + 0x4062AC56, 0x4063C220, 0x00000002, 0x4062AC57, + // Block 306, offset 0x4c80 + 0x4063C220, 0x00000002, 0x4062AC58, 0x4063C220, 0x00000002, 0x4062AC59, + 0x4063C220, 0x00000002, 0x4062AC5A, 0x4063C220, 0x00000002, 0x4062AC5B, + 0x4063C220, 0x00000002, 0x4062AC5C, 0x4063C220, 0x00000002, 0x4062AC5D, + 0x4063C220, 0x00000002, 0x4062AC5E, 0x4063C220, 0x00000002, 0x4062AC5F, + 0x4063C220, 0x00000002, 0x4062AC60, 0x4063C220, 0x00000002, 0x4062AC61, + 0x4063C220, 0x00000002, 0x4062AC62, 0x4063C220, 0x00000002, 0x4062AC63, + 0x4063C220, 0x00000002, 0x4062AC64, 0x4063C220, 0x00000002, 0x4062AC65, + 0x4063C220, 0x00000002, 0x4062AC66, 0x4063C220, 0x00000002, 0x4062AC67, + 0x4063C220, 0x00000002, 0x4062AC68, 0x4063C220, 0x00000002, 0x4062AC69, + 0x4063C220, 0x00000002, 0x4062AC6A, 0x4063C220, 0x00000002, 0x4062AC6B, + 0x4063C220, 0x00000002, 0x4062AC6C, 0x4063C220, + // Block 307, offset 0x4cc0 + 0x00000002, 0x4062AC6D, 0x4063C220, 0x00000002, 0x4062AC6E, 0x4063C220, + 0x00000002, 0x4062AC6F, 0x4063C220, 0x00000002, 0x4062AC70, 0x4063C220, + 0x00000002, 0x4062AC71, 0x4063C220, 0x00000002, 0x4062AC72, 0x4063C220, + 0x00000002, 0x4062AC73, 0x4063C220, 0x00000002, 0x4062AC74, 0x4063C220, + 0x00000002, 0x4062AC75, 0x4063C220, 0x00000002, 0x4062AC76, 0x4063C220, + 0x00000002, 0x4062AC77, 0x4063C220, 0x00000002, 0x4062AC78, 0x4063C220, + 0x00000002, 0x4062AC79, 0x4063C220, 0x00000002, 0x4062AC7A, 0x4063C220, + 0x00000002, 0x4062AC7B, 0x4063C220, 0x00000002, 0x4062AC7C, 0x4063C220, + 0x00000002, 0x4062AC7D, 0x4063C220, 0x00000002, 0x4062AC7E, 0x4063C220, + 0x00000002, 0x4062AC7F, 0x4063C220, 0x00000002, 0x4062AC80, 0x4063C220, + 0x00000002, 0x4062AC81, 0x4063C220, 0x00000002, + // Block 308, offset 0x4d00 + 0x4062AC82, 0x4063C220, 0x00000002, 0x4062AC83, 0x4063C220, 0x00000002, + 0x4062AC84, 0x4063C220, 0x00000002, 0x4062AC85, 0x4063C220, 0x00000002, + 0x4062AC86, 0x4063C220, 0x00000002, 0x4062AC87, 0x4063C220, 0x00000003, + 0x4062AC21, 0x4063C220, 0x40646420, 0x00000003, 0x4062AC22, 0x4063C220, + 0x40646420, 0x00000003, 0x4062AC23, 0x4063C220, 0x40646420, 0x00000003, + 0x4062AC24, 0x4063C220, 0x40646420, 0x00000003, 0x4062AC25, 0x4063C220, + 0x40646420, 0x00000003, 0x4062AC26, 0x4063C220, 0x40646420, 0x00000003, + 0x4062AC27, 0x4063C220, 0x40646420, 0x00000003, 0x4062AC28, 0x4063C220, + 0x40646420, 0x00000003, 0x4062AC29, 0x4063C220, 0x40646420, 0x00000003, + 0x4062AC2A, 0x4063C220, 0x40646420, 0x00000003, 0x4062AC21, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062AC22, 0x4063C220, + // Block 309, offset 0x4d40 + 0x40646A20, 0x00000003, 0x4062AC23, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062AC24, 0x4063C220, 0x40646A20, 0x00000003, 0x4062AC25, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062AC26, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062AC27, 0x4063C220, 0x40646A20, 0x00000003, 0x4062AC28, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062AC29, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062AC21, 0x4063C220, 0x40647220, 0x00000003, 0x4062AC22, 0x4063C220, + 0x40647220, 0x00000003, 0x4062AC23, 0x4063C220, 0x40647220, 0x00000003, + 0x4062AC24, 0x4063C220, 0x40647220, 0x00000003, 0x4062AC25, 0x4063C220, + 0x40647220, 0x00000003, 0x4062AC26, 0x4063C220, 0x40647220, 0x00000003, + 0x4062AC27, 0x4063C220, 0x40647220, 0x00000003, 0x4062AC28, 0x4063C220, + 0x40647220, 0x00000003, 0x4062AC21, 0x4063C220, + // Block 310, offset 0x4d80 + 0x40648C20, 0x00000003, 0x4062AC22, 0x4063C220, 0x40648C20, 0x00000003, + 0x4062AC23, 0x4063C220, 0x40648C20, 0x00000003, 0x4062AC24, 0x4063C220, + 0x40648C20, 0x00000003, 0x4062AC25, 0x4063C220, 0x40648C20, 0x00000003, + 0x4062AC26, 0x4063C220, 0x40648C20, 0x00000003, 0x4062AC27, 0x4063C220, + 0x40648C20, 0x00000003, 0x4062AC21, 0x4063C420, 0x40646A20, 0x00000003, + 0x4062AC22, 0x4063C420, 0x40646A20, 0x00000003, 0x4062AC23, 0x4063C420, + 0x40646A20, 0x00000003, 0x4062AC24, 0x4063C420, 0x40646A20, 0x00000003, + 0x4062AC25, 0x4063C420, 0x40646A20, 0x00000003, 0x4062AC26, 0x4063C420, + 0x40646A20, 0x00000003, 0x4062AC27, 0x4063C420, 0x40646A20, 0x00000003, + 0x4062AC28, 0x4063C420, 0x40646A20, 0x00000003, 0x4062AC29, 0x4063C420, + 0x40646A20, 0x00000003, 0x4062AC2A, 0x4063C420, + // Block 311, offset 0x4dc0 + 0x40646A20, 0x00000003, 0x4062AC2B, 0x4063C420, 0x40646A20, 0x00000003, + 0x4062AC2C, 0x4063C420, 0x40646A20, 0x00000003, 0x4062AC2D, 0x4063C420, + 0x40646A20, 0x00000003, 0x4062AC2E, 0x4063C420, 0x40646A20, 0x00000003, + 0x4062AC2F, 0x4063C420, 0x40646A20, 0x00000003, 0x4062AC30, 0x4063C420, + 0x40646A20, 0x00000003, 0x4062AC21, 0x4063C420, 0x40647220, 0x00000003, + 0x4062AC22, 0x4063C420, 0x40647220, 0x00000003, 0x4062AC23, 0x4063C420, + 0x40647220, 0x00000003, 0x4062AC24, 0x4063C420, 0x40647220, 0x00000003, + 0x4062AC25, 0x4063C420, 0x40647220, 0x00000002, 0x4062AC21, 0x4063C620, + 0x00000002, 0x4062AC22, 0x4063C620, 0x00000002, 0x4062AC23, 0x4063C620, + 0x00000002, 0x4062AC24, 0x4063C620, 0x00000002, 0x4062AC25, 0x4063C620, + 0x00000002, 0x4062AC26, 0x4063C620, 0x00000002, + // Block 312, offset 0x4e00 + 0x4062AC27, 0x4063C620, 0x00000002, 0x4062AC28, 0x4063C620, 0x00000002, + 0x4062AC29, 0x4063C620, 0x00000002, 0x4062AC2A, 0x4063C620, 0x00000002, + 0x4062AC2B, 0x4063C620, 0x00000002, 0x4062AC2C, 0x4063C620, 0x00000002, + 0x4062AC2D, 0x4063C620, 0x00000002, 0x4062AC2E, 0x4063C620, 0x00000002, + 0x4062AC2F, 0x4063C620, 0x00000002, 0x4062AC30, 0x4063C620, 0x00000002, + 0x4062AC31, 0x4063C620, 0x00000002, 0x4062AC32, 0x4063C620, 0x00000002, + 0x4062AC33, 0x4063C620, 0x00000002, 0x4062AC34, 0x4063C620, 0x00000002, + 0x4062AC21, 0x4063C820, 0x00000002, 0x4062AC22, 0x4063C820, 0x00000002, + 0x4062AC23, 0x4063C820, 0x00000002, 0x4062AC24, 0x4063C820, 0x00000002, + 0x4062AC21, 0x4063CA20, 0x00000002, 0x4062AC22, 0x4063CA20, 0x00000002, + 0x4062AC23, 0x4063CA20, 0x00000002, 0x4062AC24, + // Block 313, offset 0x4e40 + 0x4063CA20, 0x00000002, 0x4062AC25, 0x4063CA20, 0x00000002, 0x4062AC26, + 0x4063CA20, 0x00000002, 0x4062AC27, 0x4063CA20, 0x00000002, 0x4062AC28, + 0x4063CA20, 0x00000002, 0x4062AC29, 0x4063CA20, 0x00000002, 0x4062AC2A, + 0x4063CA20, 0x00000002, 0x4062AC2B, 0x4063CA20, 0x00000002, 0x4062AC2C, + 0x4063CA20, 0x00000002, 0x4062AC2D, 0x4063CA20, 0x00000002, 0x4062AC2E, + 0x4063CA20, 0x00000002, 0x4062AC2F, 0x4063CA20, 0x00000002, 0x4062AC30, + 0x4063CA20, 0x00000002, 0x4062AC31, 0x4063CA20, 0x00000002, 0x4062AC32, + 0x4063CA20, 0x00000002, 0x4062AC33, 0x4063CA20, 0x00000002, 0x4062AC34, + 0x4063CA20, 0x00000002, 0x4062AC35, 0x4063CA20, 0x00000002, 0x4062AC36, + 0x4063CA20, 0x00000002, 0x4062AC37, 0x4063CA20, 0x00000002, 0x4062AC38, + 0x4063CA20, 0x00000002, 0x4062AC39, 0x4063CA20, + // Block 314, offset 0x4e80 + 0x00000002, 0x4062AC3A, 0x4063CA20, 0x00000002, 0x4062AC3B, 0x4063CA20, + 0x00000002, 0x4062AC3C, 0x4063CA20, 0x00000002, 0x4062AC3D, 0x4063CA20, + 0x00000002, 0x4062AC3E, 0x4063CA20, 0x00000002, 0x4062AC3F, 0x4063CA20, + 0x00000002, 0x4062AC40, 0x4063CA20, 0x00000003, 0x4062AC21, 0x4063CA20, + 0x40646A20, 0x00000003, 0x4062AC22, 0x4063CA20, 0x40646A20, 0x00000003, + 0x4062AC23, 0x4063CA20, 0x40646A20, 0x00000003, 0x4062AC24, 0x4063CA20, + 0x40646A20, 0x00000003, 0x4062AC25, 0x4063CA20, 0x40646A20, 0x00000003, + 0x4062AC26, 0x4063CA20, 0x40646A20, 0x00000003, 0x4062AC27, 0x4063CA20, + 0x40646A20, 0x00000003, 0x4062AC28, 0x4063CA20, 0x40646A20, 0x00000003, + 0x4062AC21, 0x4063CA20, 0x40647220, 0x00000003, 0x4062AC21, 0x4063CC20, + 0x40646420, 0x00000003, 0x4062AC22, 0x4063CC20, + // Block 315, offset 0x4ec0 + 0x40646420, 0x00000003, 0x4062AC23, 0x4063CC20, 0x40646420, 0x00000003, + 0x4062AC24, 0x4063CC20, 0x40646420, 0x00000003, 0x4062AC25, 0x4063CC20, + 0x40646420, 0x00000003, 0x4062AC26, 0x4063CC20, 0x40646420, 0x00000003, + 0x4062AC27, 0x4063CC20, 0x40646420, 0x00000003, 0x4062AC28, 0x4063CC20, + 0x40646420, 0x00000003, 0x4062AC29, 0x4063CC20, 0x40646420, 0x00000003, + 0x4062AC2A, 0x4063CC20, 0x40646420, 0x00000003, 0x4062AC2B, 0x4063CC20, + 0x40646420, 0x00000003, 0x4062AC21, 0x4063CC20, 0x40646A20, 0x00000003, + 0x4062AC22, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062AC23, 0x4063CC20, + 0x40646A20, 0x00000003, 0x4062AC24, 0x4063CC20, 0x40646A20, 0x00000003, + 0x4062AC25, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062AC26, 0x4063CC20, + 0x40646A20, 0x00000003, 0x4062AC27, 0x4063CC20, + // Block 316, offset 0x4f00 + 0x40646A20, 0x00000003, 0x4062AC28, 0x4063CC20, 0x40646A20, 0x00000003, + 0x4062AC29, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062AC2A, 0x4063CC20, + 0x40646A20, 0x00000003, 0x4062AC2B, 0x4063CC20, 0x40646A20, 0x00000003, + 0x4062AC2C, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062AC2D, 0x4063CC20, + 0x40646A20, 0x00000003, 0x4062AC2E, 0x4063CC20, 0x40646A20, 0x00000003, + 0x4062AC2F, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062AC30, 0x4063CC20, + 0x40646A20, 0x00000003, 0x4062AC31, 0x4063CC20, 0x40646A20, 0x00000003, + 0x4062AC32, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062AC33, 0x4063CC20, + 0x40646A20, 0x00000003, 0x4062AC34, 0x4063CC20, 0x40646A20, 0x00000003, + 0x4062AC35, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062AC36, 0x4063CC20, + 0x40646A20, 0x00000003, 0x4062AC37, 0x4063CC20, + // Block 317, offset 0x4f40 + 0x40646A20, 0x00000003, 0x4062AC38, 0x4063CC20, 0x40646A20, 0x00000003, + 0x4062AC39, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062AC21, 0x4063CC20, + 0x40648220, 0x00000003, 0x4062AC22, 0x4063CC20, 0x40648220, 0x00000003, + 0x4062AC23, 0x4063CC20, 0x40648220, 0x00000003, 0x4062AC24, 0x4063CC20, + 0x40648220, 0x00000003, 0x4062AC25, 0x4063CC20, 0x40648220, 0x00000003, + 0x4062AC26, 0x4063CC20, 0x40648220, 0x00000003, 0x4062AC27, 0x4063CC20, + 0x40648220, 0x00000003, 0x4062AC28, 0x4063CC20, 0x40648220, 0x00000003, + 0x4062AC29, 0x4063CC20, 0x40648220, 0x00000003, 0x4062AC2A, 0x4063CC20, + 0x40648220, 0x00000003, 0x4062AC2B, 0x4063CC20, 0x40648220, 0x00000003, + 0x4062AC2C, 0x4063CC20, 0x40648220, 0x00000003, 0x4062AC2D, 0x4063CC20, + 0x40648220, 0x00000003, 0x4062AC2E, 0x4063CC20, + // Block 318, offset 0x4f80 + 0x40648220, 0x00000003, 0x4062AC2F, 0x4063CC20, 0x40648220, 0x00000003, + 0x4062AC30, 0x4063CC20, 0x40648220, 0x00000003, 0x4062AC31, 0x4063CC20, + 0x40648220, 0x00000003, 0x4062AC32, 0x4063CC20, 0x40648220, 0x00000003, + 0x4062AC21, 0x4063CC20, 0x40648420, 0x00000003, 0x4062AC22, 0x4063CC20, + 0x40648420, 0x00000003, 0x4062AC23, 0x4063CC20, 0x40648420, 0x00000003, + 0x4062AC24, 0x4063CC20, 0x40648420, 0x00000003, 0x4062AC25, 0x4063CC20, + 0x40648420, 0x00000003, 0x4062AC26, 0x4063CC20, 0x40648420, 0x00000003, + 0x4062AC27, 0x4063CC20, 0x40648420, 0x00000003, 0x4062AC28, 0x4063CC20, + 0x40648420, 0x00000003, 0x4062AC29, 0x4063CC20, 0x40648420, 0x00000003, + 0x4062AC2A, 0x4063CC20, 0x40648420, 0x00000003, 0x4062AC2B, 0x4063CC20, + 0x40648420, 0x00000003, 0x4062AC2C, 0x4063CC20, + // Block 319, offset 0x4fc0 + 0x40648420, 0x00000003, 0x4062AC2D, 0x4063CC20, 0x40648420, 0x00000003, + 0x4062AC21, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062AC22, 0x4063CC20, + 0x40648C20, 0x00000003, 0x4062AC23, 0x4063CC20, 0x40648C20, 0x00000003, + 0x4062AC24, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062AC25, 0x4063CC20, + 0x40648C20, 0x00000003, 0x4062AC26, 0x4063CC20, 0x40648C20, 0x00000002, + 0x4062AC21, 0x4063D020, 0x00000002, 0x4062AC22, 0x4063D020, 0x00000002, + 0x4062AC23, 0x4063D020, 0x00000002, 0x4062AC24, 0x4063D020, 0x00000002, + 0x4062AC25, 0x4063D020, 0x00000002, 0x4062AC26, 0x4063D020, 0x00000002, + 0x4062AC27, 0x4063D020, 0x00000002, 0x4062AC28, 0x4063D020, 0x00000002, + 0x4062AC29, 0x4063D020, 0x00000002, 0x4062AC2A, 0x4063D020, 0x00000002, + 0x4062AC2B, 0x4063D020, 0x00000002, 0x4062AC2C, + // Block 320, offset 0x5000 + 0x4063D020, 0x00000002, 0x4062AC2D, 0x4063D020, 0x00000002, 0x4062AC2E, + 0x4063D020, 0x00000002, 0x4062AC2F, 0x4063D020, 0x00000002, 0x4062AC30, + 0x4063D020, 0x00000002, 0x4062AC31, 0x4063D020, 0x00000002, 0x4062AC32, + 0x4063D020, 0x00000002, 0x4062AC33, 0x4063D020, 0x00000002, 0x4062AC34, + 0x4063D020, 0x00000002, 0x4062AC35, 0x4063D020, 0x00000002, 0x4062AC36, + 0x4063D020, 0x00000002, 0x4062AC37, 0x4063D020, 0x00000002, 0x4062AC38, + 0x4063D020, 0x00000002, 0x4062AC39, 0x4063D020, 0x00000002, 0x4062AC3A, + 0x4063D020, 0x00000002, 0x4062AC3B, 0x4063D020, 0x00000002, 0x4062AC3C, + 0x4063D020, 0x00000002, 0x4062AC3D, 0x4063D020, 0x00000002, 0x4062AC3E, + 0x4063D020, 0x00000002, 0x4062AC3F, 0x4063D020, 0x00000002, 0x4062AC40, + 0x4063D020, 0x00000002, 0x4062AC41, 0x4063D020, + // Block 321, offset 0x5040 + 0x00000002, 0x4062AC42, 0x4063D020, 0x00000002, 0x4062AC43, 0x4063D020, + 0x00000002, 0x4062AC44, 0x4063D020, 0x00000002, 0x4062AC45, 0x4063D020, + 0x00000002, 0x4062AC46, 0x4063D020, 0x00000002, 0x4062AC47, 0x4063D020, + 0x00000002, 0x4062AC48, 0x4063D020, 0x00000002, 0x4062AC49, 0x4063D020, + 0x00000002, 0x4062AC4A, 0x4063D020, 0x00000002, 0x4062AC4B, 0x4063D020, + 0x00000002, 0x4062AC4C, 0x4063D020, 0x00000002, 0x4062AC4D, 0x4063D020, + 0x00000002, 0x4062AC4E, 0x4063D020, 0x00000002, 0x4062AC4F, 0x4063D020, + 0x00000002, 0x4062AC50, 0x4063D020, 0x00000002, 0x4062AC51, 0x4063D020, + 0x00000002, 0x4062AC52, 0x4063D020, 0x00000002, 0x4062AC53, 0x4063D020, + 0x00000002, 0x4062AC54, 0x4063D020, 0x00000002, 0x4062AC55, 0x4063D020, + 0x00000002, 0x4062AC56, 0x4063D020, 0x00000002, + // Block 322, offset 0x5080 + 0x4062AC57, 0x4063D020, 0x00000002, 0x4062AC58, 0x4063D020, 0x00000002, + 0x4062AC59, 0x4063D020, 0x00000002, 0x4062AC5A, 0x4063D020, 0x00000002, + 0x4062AC5B, 0x4063D020, 0x00000002, 0x4062AC5C, 0x4063D020, 0x00000002, + 0x4062AC5D, 0x4063D020, 0x00000002, 0x4062AC5E, 0x4063D020, 0x00000002, + 0x4062AC5F, 0x4063D020, 0x00000002, 0x4062AC60, 0x4063D020, 0x00000002, + 0x4062AC61, 0x4063D020, 0x00000002, 0x4062AC62, 0x4063D020, 0x00000002, + 0x4062AC63, 0x4063D020, 0x00000002, 0x4062AC64, 0x4063D020, 0x00000002, + 0x4062AC65, 0x4063D020, 0x00000002, 0x4062AC66, 0x4063D020, 0x00000002, + 0x4062AC67, 0x4063D020, 0x00000002, 0x4062AC68, 0x4063D020, 0x00000002, + 0x4062AC69, 0x4063D020, 0x00000002, 0x4062AC6A, 0x4063D020, 0x00000002, + 0x4062AC6B, 0x4063D020, 0x00000002, 0x4062AC6C, + // Block 323, offset 0x50c0 + 0x4063D020, 0x00000002, 0x4062AC6D, 0x4063D020, 0x00000002, 0x4062AC6E, + 0x4063D020, 0x00000002, 0x4062AC6F, 0x4063D020, 0x00000002, 0x4062AC70, + 0x4063D020, 0x00000002, 0x4062AC71, 0x4063D020, 0x00000002, 0x4062AC72, + 0x4063D020, 0x00000002, 0x4062AC73, 0x4063D020, 0x00000002, 0x4062AC74, + 0x4063D020, 0x00000002, 0x4062AC75, 0x4063D020, 0x00000002, 0x4062AC76, + 0x4063D020, 0x00000002, 0x4062AC77, 0x4063D020, 0x00000002, 0x4062AC78, + 0x4063D020, 0x00000002, 0x4062AC79, 0x4063D020, 0x00000002, 0x4062AC7A, + 0x4063D020, 0x00000002, 0x4062AC7B, 0x4063D020, 0x00000002, 0x4062AC7C, + 0x4063D020, 0x00000002, 0x4062AC7D, 0x4063D020, 0x00000002, 0x4062AC7E, + 0x4063D020, 0x00000002, 0x4062AC7F, 0x4063D020, 0x00000002, 0x4062AC80, + 0x4063D020, 0x00000002, 0x4062AC81, 0x4063D020, + // Block 324, offset 0x5100 + 0x00000002, 0x4062AC82, 0x4063D020, 0x00000002, 0x4062AC83, 0x4063D020, + 0x00000002, 0x4062AC84, 0x4063D020, 0x00000003, 0x4062AC21, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062AC21, 0x4063D020, 0x40647220, 0x00000003, + 0x4062AC22, 0x4063D020, 0x40647220, 0x00000003, 0x4062AC23, 0x4063D020, + 0x40647220, 0x00000003, 0x4062AC24, 0x4063D020, 0x40647220, 0x00000003, + 0x4062AC25, 0x4063D020, 0x40647220, 0x00000003, 0x4062AC26, 0x4063D020, + 0x40647220, 0x00000003, 0x4062AC21, 0x4063D020, 0x40648220, 0x00000003, + 0x4062AE21, 0x4063D020, 0x40646420, 0x00000002, 0x4062B021, 0x4063A820, + 0x00000002, 0x4062B022, 0x4063A820, 0x00000002, 0x4062B023, 0x4063A820, + 0x00000002, 0x4062B024, 0x4063A820, 0x00000002, 0x4062B025, 0x4063A820, + 0x00000002, 0x4062B026, 0x4063A820, 0x00000002, + // Block 325, offset 0x5140 + 0x4062B027, 0x4063A820, 0x00000002, 0x4062B028, 0x4063A820, 0x00000002, + 0x4062B029, 0x4063A820, 0x00000002, 0x4062B02A, 0x4063A820, 0x00000002, + 0x4062B02B, 0x4063A820, 0x00000003, 0x4062B021, 0x4063A820, 0x40646420, + 0x00000003, 0x4062B021, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B022, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062B023, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062B024, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B025, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062B026, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062B027, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B021, + 0x4063A820, 0x40647220, 0x00000003, 0x4062B022, 0x4063A820, 0x40647220, + 0x00000003, 0x4062B021, 0x4063A820, 0x40648220, 0x00000003, 0x4062B022, + 0x4063A820, 0x40648220, 0x00000003, 0x4062B023, + // Block 326, offset 0x5180 + 0x4063A820, 0x40648220, 0x00000003, 0x4062B024, 0x4063A820, 0x40648220, + 0x00000003, 0x4062B025, 0x4063A820, 0x40648220, 0x00000003, 0x4062B026, + 0x4063A820, 0x40648220, 0x00000003, 0x4062B027, 0x4063A820, 0x40648220, + 0x00000003, 0x4062B021, 0x4063A820, 0x40648420, 0x00000003, 0x4062B022, + 0x4063A820, 0x40648420, 0x00000003, 0x4062B021, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062B022, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B023, + 0x4063A820, 0x40648C20, 0x00000002, 0x4062B021, 0x4063AA20, 0x00000002, + 0x4062B022, 0x4063AA20, 0x00000002, 0x4062B023, 0x4063AA20, 0x00000002, + 0x4062B024, 0x4063AA20, 0x00000002, 0x4062B025, 0x4063AA20, 0x00000002, + 0x4062B026, 0x4063AA20, 0x00000002, 0x4062B027, 0x4063AA20, 0x00000002, + 0x4062B028, 0x4063AA20, 0x00000002, 0x4062B029, + // Block 327, offset 0x51c0 + 0x4063AA20, 0x00000002, 0x4062B02A, 0x4063AA20, 0x00000002, 0x4062B021, + 0x4063B420, 0x00000003, 0x4062B021, 0x4063B420, 0x40646420, 0x00000003, + 0x4062B021, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B022, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062B023, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062B024, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B021, 0x4063B420, + 0x40648220, 0x00000003, 0x4062B022, 0x4063B420, 0x40648220, 0x00000003, + 0x4062B023, 0x4063B420, 0x40648220, 0x00000003, 0x4062B024, 0x4063B420, + 0x40648220, 0x00000003, 0x4062B021, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062B022, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B023, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062B024, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062B025, 0x4063B420, 0x40648C20, 0x00000003, + // Block 328, offset 0x5200 + 0x4062B026, 0x4063B420, 0x40648C20, 0x00000002, 0x4062B021, 0x4063B820, + 0x00000002, 0x4062B022, 0x4063B820, 0x00000002, 0x4062B023, 0x4063B820, + 0x00000002, 0x4062B024, 0x4063B820, 0x00000002, 0x4062B025, 0x4063B820, + 0x00000002, 0x4062B026, 0x4063B820, 0x00000002, 0x4062B027, 0x4063B820, + 0x00000002, 0x4062B028, 0x4063B820, 0x00000002, 0x4062B029, 0x4063B820, + 0x00000002, 0x4062B02A, 0x4063B820, 0x00000002, 0x4062B02B, 0x4063B820, + 0x00000002, 0x4062B02C, 0x4063B820, 0x00000003, 0x4062B021, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062B022, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062B023, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B024, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062B025, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062B026, 0x4063B820, 0x40648C20, 0x00000003, + // Block 329, offset 0x5240 + 0x4062B027, 0x4063B820, 0x40648C20, 0x00000002, 0x4062B021, 0x4063BE20, + 0x00000002, 0x4062B022, 0x4063BE20, 0x00000002, 0x4062B023, 0x4063BE20, + 0x00000002, 0x4062B021, 0x4063C020, 0x00000002, 0x4062B022, 0x4063C020, + 0x00000002, 0x4062B023, 0x4063C020, 0x00000002, 0x4062B024, 0x4063C020, + 0x00000002, 0x4062B025, 0x4063C020, 0x00000002, 0x4062B026, 0x4063C020, + 0x00000002, 0x4062B027, 0x4063C020, 0x00000002, 0x4062B021, 0x4063C220, + 0x00000002, 0x4062B022, 0x4063C220, 0x00000003, 0x4062B021, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062B021, 0x4063C220, 0x40647220, 0x00000003, + 0x4062B022, 0x4063C220, 0x40647220, 0x00000003, 0x4062B023, 0x4063C220, + 0x40647220, 0x00000002, 0x4062B021, 0x4063CA20, 0x00000002, 0x4062B022, + 0x4063CA20, 0x00000002, 0x4062B023, 0x4063CA20, + // Block 330, offset 0x5280 + 0x00000002, 0x4062B024, 0x4063CA20, 0x00000003, 0x4062B021, 0x4063CA20, + 0x40646420, 0x00000003, 0x4062B021, 0x4063CC20, 0x40648C20, 0x00000002, + 0x4062B021, 0x4063D020, 0x00000002, 0x4062B022, 0x4063D020, 0x00000002, + 0x4062B023, 0x4063D020, 0x00000002, 0x4062B024, 0x4063D020, 0x00000002, + 0x4062B025, 0x4063D020, 0x00000002, 0x4062B026, 0x4063D020, 0x00000002, + 0x4062B027, 0x4063D020, 0x00000002, 0x4062B028, 0x4063D020, 0x00000003, + 0x4062B021, 0x4063D020, 0x40646420, 0x00000003, 0x4062B022, 0x4063D020, + 0x40646420, 0x00000003, 0x4062B023, 0x4063D020, 0x40646420, 0x00000003, + 0x4062B024, 0x4063D020, 0x40646420, 0x00000002, 0x4062B221, 0x4063A820, + 0x00000002, 0x4062B222, 0x4063A820, 0x00000002, 0x4062B223, 0x4063A820, + 0x00000003, 0x4062B221, 0x4063A820, 0x40646A20, + // Block 331, offset 0x52c0 + 0x00000003, 0x4062B222, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B223, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062B224, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062B225, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B226, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062B227, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062B228, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B229, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062B22A, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062B22B, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B22C, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062B22D, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062B22E, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B22F, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062B230, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062B231, 0x4063A820, 0x40646A20, + // Block 332, offset 0x5300 + 0x00000003, 0x4062B232, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B233, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062B234, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062B235, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B236, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062B237, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062B238, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B239, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062B23A, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062B23B, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B23C, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062B23D, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062B221, 0x4063A820, 0x40647220, 0x00000003, 0x4062B222, + 0x4063A820, 0x40647220, 0x00000003, 0x4062B223, 0x4063A820, 0x40647220, + 0x00000003, 0x4062B224, 0x4063A820, 0x40647220, + // Block 333, offset 0x5340 + 0x00000003, 0x4062B225, 0x4063A820, 0x40647220, 0x00000003, 0x4062B226, + 0x4063A820, 0x40647220, 0x00000003, 0x4062B227, 0x4063A820, 0x40647220, + 0x00000003, 0x4062B228, 0x4063A820, 0x40647220, 0x00000003, 0x4062B229, + 0x4063A820, 0x40647220, 0x00000003, 0x4062B22A, 0x4063A820, 0x40647220, + 0x00000003, 0x4062B221, 0x4063A820, 0x40648220, 0x00000003, 0x4062B222, + 0x4063A820, 0x40648220, 0x00000003, 0x4062B223, 0x4063A820, 0x40648220, + 0x00000003, 0x4062B224, 0x4063A820, 0x40648220, 0x00000003, 0x4062B225, + 0x4063A820, 0x40648220, 0x00000003, 0x4062B226, 0x4063A820, 0x40648220, + 0x00000003, 0x4062B227, 0x4063A820, 0x40648220, 0x00000003, 0x4062B228, + 0x4063A820, 0x40648220, 0x00000003, 0x4062B229, 0x4063A820, 0x40648220, + 0x00000003, 0x4062B22A, 0x4063A820, 0x40648220, + // Block 334, offset 0x5380 + 0x00000003, 0x4062B22B, 0x4063A820, 0x40648220, 0x00000003, 0x4062B22C, + 0x4063A820, 0x40648220, 0x00000003, 0x4062B22D, 0x4063A820, 0x40648220, + 0x00000003, 0x4062B22E, 0x4063A820, 0x40648220, 0x00000003, 0x4062B22F, + 0x4063A820, 0x40648220, 0x00000003, 0x4062B230, 0x4063A820, 0x40648220, + 0x00000003, 0x4062B231, 0x4063A820, 0x40648220, 0x00000003, 0x4062B232, + 0x4063A820, 0x40648220, 0x00000003, 0x4062B233, 0x4063A820, 0x40648220, + 0x00000003, 0x4062B234, 0x4063A820, 0x40648220, 0x00000003, 0x4062B235, + 0x4063A820, 0x40648220, 0x00000003, 0x4062B236, 0x4063A820, 0x40648220, + 0x00000003, 0x4062B237, 0x4063A820, 0x40648220, 0x00000003, 0x4062B238, + 0x4063A820, 0x40648220, 0x00000003, 0x4062B239, 0x4063A820, 0x40648220, + 0x00000003, 0x4062B23A, 0x4063A820, 0x40648220, + // Block 335, offset 0x53c0 + 0x00000003, 0x4062B23B, 0x4063A820, 0x40648220, 0x00000003, 0x4062B23C, + 0x4063A820, 0x40648220, 0x00000003, 0x4062B23D, 0x4063A820, 0x40648220, + 0x00000003, 0x4062B221, 0x4063A820, 0x40648420, 0x00000003, 0x4062B222, + 0x4063A820, 0x40648420, 0x00000003, 0x4062B223, 0x4063A820, 0x40648420, + 0x00000003, 0x4062B224, 0x4063A820, 0x40648420, 0x00000003, 0x4062B225, + 0x4063A820, 0x40648420, 0x00000003, 0x4062B221, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062B222, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B223, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062B224, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062B225, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B226, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062B227, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062B228, 0x4063A820, 0x40648C20, + // Block 336, offset 0x5400 + 0x00000003, 0x4062B229, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B22A, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062B22B, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062B22C, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B22D, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062B22E, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062B22F, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B230, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062B231, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062B232, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B233, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062B234, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062B235, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B236, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062B237, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062B238, 0x4063A820, 0x40648C20, + // Block 337, offset 0x5440 + 0x00000003, 0x4062B239, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B23A, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062B23B, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062B23C, 0x4063A820, 0x40648C20, 0x00000002, 0x4062B221, + 0x4063AA20, 0x00000002, 0x4062B222, 0x4063AA20, 0x00000002, 0x4062B223, + 0x4063AA20, 0x00000002, 0x4062B224, 0x4063AA20, 0x00000002, 0x4062B225, + 0x4063AA20, 0x00000002, 0x4062B226, 0x4063AA20, 0x00000002, 0x4062B227, + 0x4063AA20, 0x00000002, 0x4062B228, 0x4063AA20, 0x00000002, 0x4062B229, + 0x4063AA20, 0x00000002, 0x4062B22A, 0x4063AA20, 0x00000002, 0x4062B22B, + 0x4063AA20, 0x00000002, 0x4062B22C, 0x4063AA20, 0x00000002, 0x4062B22D, + 0x4063AA20, 0x00000002, 0x4062B22E, 0x4063AA20, 0x00000002, 0x4062B22F, + 0x4063AA20, 0x00000002, 0x4062B230, 0x4063AA20, + // Block 338, offset 0x5480 + 0x00000002, 0x4062B231, 0x4063AA20, 0x00000002, 0x4062B232, 0x4063AA20, + 0x00000002, 0x4062B233, 0x4063AA20, 0x00000002, 0x4062B234, 0x4063AA20, + 0x00000002, 0x4062B235, 0x4063AA20, 0x00000002, 0x4062B236, 0x4063AA20, + 0x00000003, 0x4062B221, 0x4063AA20, 0x40646420, 0x00000003, 0x4062B221, + 0x4063B020, 0x40646420, 0x00000003, 0x4062B222, 0x4063B020, 0x40646420, + 0x00000002, 0x4062B221, 0x4063B820, 0x00000002, 0x4062B222, 0x4063B820, + 0x00000002, 0x4062B223, 0x4063B820, 0x00000002, 0x4062B224, 0x4063B820, + 0x00000002, 0x4062B225, 0x4063B820, 0x00000002, 0x4062B226, 0x4063B820, + 0x00000002, 0x4062B227, 0x4063B820, 0x00000002, 0x4062B228, 0x4063B820, + 0x00000002, 0x4062B229, 0x4063B820, 0x00000002, 0x4062B22A, 0x4063B820, + 0x00000002, 0x4062B22B, 0x4063B820, 0x00000002, + // Block 339, offset 0x54c0 + 0x4062B22C, 0x4063B820, 0x00000002, 0x4062B22D, 0x4063B820, 0x00000002, + 0x4062B22E, 0x4063B820, 0x00000002, 0x4062B22F, 0x4063B820, 0x00000002, + 0x4062B230, 0x4063B820, 0x00000002, 0x4062B231, 0x4063B820, 0x00000002, + 0x4062B232, 0x4063B820, 0x00000002, 0x4062B233, 0x4063B820, 0x00000002, + 0x4062B234, 0x4063B820, 0x00000002, 0x4062B235, 0x4063B820, 0x00000002, + 0x4062B236, 0x4063B820, 0x00000002, 0x4062B237, 0x4063B820, 0x00000002, + 0x4062B238, 0x4063B820, 0x00000002, 0x4062B239, 0x4063B820, 0x00000002, + 0x4062B23A, 0x4063B820, 0x00000002, 0x4062B23B, 0x4063B820, 0x00000002, + 0x4062B23C, 0x4063B820, 0x00000002, 0x4062B23D, 0x4063B820, 0x00000002, + 0x4062B23E, 0x4063B820, 0x00000002, 0x4062B23F, 0x4063B820, 0x00000002, + 0x4062B240, 0x4063B820, 0x00000002, 0x4062B241, + // Block 340, offset 0x5500 + 0x4063B820, 0x00000002, 0x4062B242, 0x4063B820, 0x00000002, 0x4062B243, + 0x4063B820, 0x00000002, 0x4062B244, 0x4063B820, 0x00000002, 0x4062B245, + 0x4063B820, 0x00000002, 0x4062B246, 0x4063B820, 0x00000002, 0x4062B247, + 0x4063B820, 0x00000002, 0x4062B248, 0x4063B820, 0x00000002, 0x4062B249, + 0x4063B820, 0x00000002, 0x4062B24A, 0x4063B820, 0x00000002, 0x4062B24B, + 0x4063B820, 0x00000002, 0x4062B24C, 0x4063B820, 0x00000002, 0x4062B24D, + 0x4063B820, 0x00000002, 0x4062B24E, 0x4063B820, 0x00000002, 0x4062B24F, + 0x4063B820, 0x00000002, 0x4062B250, 0x4063B820, 0x00000002, 0x4062B251, + 0x4063B820, 0x00000002, 0x4062B252, 0x4063B820, 0x00000002, 0x4062B253, + 0x4063B820, 0x00000002, 0x4062B254, 0x4063B820, 0x00000002, 0x4062B255, + 0x4063B820, 0x00000002, 0x4062B256, 0x4063B820, + // Block 341, offset 0x5540 + 0x00000002, 0x4062B257, 0x4063B820, 0x00000002, 0x4062B258, 0x4063B820, + 0x00000002, 0x4062B259, 0x4063B820, 0x00000002, 0x4062B25A, 0x4063B820, + 0x00000002, 0x4062B25B, 0x4063B820, 0x00000003, 0x4062B221, 0x4063B820, + 0x40646420, 0x00000003, 0x4062B222, 0x4063B820, 0x40646420, 0x00000003, + 0x4062B223, 0x4063B820, 0x40646420, 0x00000003, 0x4062B224, 0x4063B820, + 0x40646420, 0x00000003, 0x4062B225, 0x4063B820, 0x40646420, 0x00000003, + 0x4062B226, 0x4063B820, 0x40646420, 0x00000003, 0x4062B227, 0x4063B820, + 0x40646420, 0x00000003, 0x4062B228, 0x4063B820, 0x40646420, 0x00000003, + 0x4062B229, 0x4063B820, 0x40646420, 0x00000003, 0x4062B22A, 0x4063B820, + 0x40646420, 0x00000003, 0x4062B22B, 0x4063B820, 0x40646420, 0x00000003, + 0x4062B22C, 0x4063B820, 0x40646420, 0x00000003, + // Block 342, offset 0x5580 + 0x4062B221, 0x4063B820, 0x40646A20, 0x00000003, 0x4062B222, 0x4063B820, + 0x40646A20, 0x00000003, 0x4062B223, 0x4063B820, 0x40646A20, 0x00000003, + 0x4062B224, 0x4063B820, 0x40646A20, 0x00000003, 0x4062B225, 0x4063B820, + 0x40646A20, 0x00000003, 0x4062B226, 0x4063B820, 0x40646A20, 0x00000003, + 0x4062B227, 0x4063B820, 0x40646A20, 0x00000003, 0x4062B228, 0x4063B820, + 0x40646A20, 0x00000003, 0x4062B229, 0x4063B820, 0x40646A20, 0x00000003, + 0x4062B22A, 0x4063B820, 0x40646A20, 0x00000003, 0x4062B22B, 0x4063B820, + 0x40646A20, 0x00000003, 0x4062B22C, 0x4063B820, 0x40646A20, 0x00000003, + 0x4062B22D, 0x4063B820, 0x40646A20, 0x00000003, 0x4062B221, 0x4063B820, + 0x40647220, 0x00000003, 0x4062B222, 0x4063B820, 0x40647220, 0x00000003, + 0x4062B223, 0x4063B820, 0x40647220, 0x00000003, + // Block 343, offset 0x55c0 + 0x4062B224, 0x4063B820, 0x40647220, 0x00000003, 0x4062B221, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062B222, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062B223, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B224, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062B225, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062B226, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B227, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062B228, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062B229, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B22A, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062B22B, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062B22C, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B22D, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062B22E, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062B22F, 0x4063B820, 0x40648C20, 0x00000003, + // Block 344, offset 0x5600 + 0x4062B230, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B231, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062B232, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062B233, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B234, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062B235, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062B236, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B237, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062B238, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062B239, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B23A, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062B23B, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062B23C, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B23D, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062B23E, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062B23F, 0x4063B820, 0x40648C20, 0x00000003, + // Block 345, offset 0x5640 + 0x4062B240, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B241, 0x4063B820, + 0x40648C20, 0x00000002, 0x4062B221, 0x4063C220, 0x00000002, 0x4062B222, + 0x4063C220, 0x00000002, 0x4062B223, 0x4063C220, 0x00000002, 0x4062B224, + 0x4063C220, 0x00000002, 0x4062B225, 0x4063C220, 0x00000002, 0x4062B226, + 0x4063C220, 0x00000002, 0x4062B227, 0x4063C220, 0x00000002, 0x4062B228, + 0x4063C220, 0x00000002, 0x4062B229, 0x4063C220, 0x00000002, 0x4062B22A, + 0x4063C220, 0x00000002, 0x4062B22B, 0x4063C220, 0x00000002, 0x4062B22C, + 0x4063C220, 0x00000002, 0x4062B22D, 0x4063C220, 0x00000002, 0x4062B22E, + 0x4063C220, 0x00000002, 0x4062B22F, 0x4063C220, 0x00000002, 0x4062B230, + 0x4063C220, 0x00000002, 0x4062B231, 0x4063C220, 0x00000003, 0x4062B221, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062B222, + // Block 346, offset 0x5680 + 0x4063C220, 0x40646A20, 0x00000003, 0x4062B223, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062B224, 0x4063C220, 0x40646A20, 0x00000003, 0x4062B225, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062B226, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062B227, 0x4063C220, 0x40646A20, 0x00000003, 0x4062B228, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062B221, 0x4063C220, 0x40647220, + 0x00000003, 0x4062B221, 0x4063CC20, 0x40646420, 0x00000003, 0x4062B221, + 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B222, 0x4063CC20, 0x40648C20, + 0x00000003, 0x4062B223, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B224, + 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B225, 0x4063CC20, 0x40648C20, + 0x00000003, 0x4062B226, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B227, + 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B228, + // Block 347, offset 0x56c0 + 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B229, 0x4063CC20, 0x40648C20, + 0x00000003, 0x4062B22A, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B22B, + 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B22C, 0x4063CC20, 0x40648C20, + 0x00000003, 0x4062B22D, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B22E, + 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B22F, 0x4063CC20, 0x40648C20, + 0x00000003, 0x4062B230, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B231, + 0x4063CC20, 0x40648C20, 0x00000002, 0x4062B621, 0x4063A820, 0x00000002, + 0x4062B622, 0x4063A820, 0x00000002, 0x4062B623, 0x4063A820, 0x00000002, + 0x4062B624, 0x4063A820, 0x00000002, 0x4062B625, 0x4063A820, 0x00000002, + 0x4062B626, 0x4063A820, 0x00000002, 0x4062B627, 0x4063A820, 0x00000002, + 0x4062B628, 0x4063A820, 0x00000002, 0x4062B629, + // Block 348, offset 0x5700 + 0x4063A820, 0x00000002, 0x4062B62A, 0x4063A820, 0x00000002, 0x4062B62B, + 0x4063A820, 0x00000002, 0x4062B62C, 0x4063A820, 0x00000002, 0x4062B62D, + 0x4063A820, 0x00000002, 0x4062B62E, 0x4063A820, 0x00000002, 0x4062B62F, + 0x4063A820, 0x00000002, 0x4062B630, 0x4063A820, 0x00000002, 0x4062B631, + 0x4063A820, 0x00000003, 0x4062B621, 0x4063A820, 0x40646420, 0x00000003, + 0x4062B622, 0x4063A820, 0x40646420, 0x00000003, 0x4062B623, 0x4063A820, + 0x40646420, 0x00000003, 0x4062B624, 0x4063A820, 0x40646420, 0x00000003, + 0x4062B625, 0x4063A820, 0x40646420, 0x00000003, 0x4062B626, 0x4063A820, + 0x40646420, 0x00000003, 0x4062B627, 0x4063A820, 0x40646420, 0x00000003, + 0x4062B628, 0x4063A820, 0x40646420, 0x00000003, 0x4062B629, 0x4063A820, + 0x40646420, 0x00000003, 0x4062B621, 0x4063A820, + // Block 349, offset 0x5740 + 0x40646A20, 0x00000003, 0x4062B622, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062B623, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B624, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062B625, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062B626, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B627, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062B628, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062B629, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B62A, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062B62B, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062B62C, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B62D, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062B62E, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062B62F, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B621, 0x4063A820, + 0x40647220, 0x00000003, 0x4062B622, 0x4063A820, + // Block 350, offset 0x5780 + 0x40647220, 0x00000003, 0x4062B623, 0x4063A820, 0x40647220, 0x00000003, + 0x4062B624, 0x4063A820, 0x40647220, 0x00000003, 0x4062B621, 0x4063A820, + 0x40648220, 0x00000003, 0x4062B622, 0x4063A820, 0x40648220, 0x00000003, + 0x4062B623, 0x4063A820, 0x40648220, 0x00000003, 0x4062B624, 0x4063A820, + 0x40648220, 0x00000003, 0x4062B625, 0x4063A820, 0x40648220, 0x00000003, + 0x4062B626, 0x4063A820, 0x40648220, 0x00000003, 0x4062B627, 0x4063A820, + 0x40648220, 0x00000003, 0x4062B628, 0x4063A820, 0x40648220, 0x00000003, + 0x4062B629, 0x4063A820, 0x40648220, 0x00000003, 0x4062B62A, 0x4063A820, + 0x40648220, 0x00000003, 0x4062B62B, 0x4063A820, 0x40648220, 0x00000003, + 0x4062B62C, 0x4063A820, 0x40648220, 0x00000003, 0x4062B621, 0x4063A820, + 0x40648420, 0x00000003, 0x4062B622, 0x4063A820, + // Block 351, offset 0x57c0 + 0x40648420, 0x00000003, 0x4062B623, 0x4063A820, 0x40648420, 0x00000003, + 0x4062B624, 0x4063A820, 0x40648420, 0x00000003, 0x4062B621, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062B622, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062B623, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B624, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062B625, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062B626, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B627, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062B628, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062B629, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B62A, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062B62B, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062B62C, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B62D, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062B62E, 0x4063A820, + // Block 352, offset 0x5800 + 0x40648C20, 0x00000002, 0x4062B621, 0x4063AA20, 0x00000002, 0x4062B622, + 0x4063AA20, 0x00000002, 0x4062B623, 0x4063AA20, 0x00000002, 0x4062B624, + 0x4063AA20, 0x00000002, 0x4062B625, 0x4063AA20, 0x00000002, 0x4062B626, + 0x4063AA20, 0x00000003, 0x4062B621, 0x4063AA20, 0x40648C20, 0x00000003, + 0x4062B621, 0x4063AC20, 0x40646420, 0x00000003, 0x4062B622, 0x4063AC20, + 0x40646420, 0x00000003, 0x4062B623, 0x4063AC20, 0x40646420, 0x00000003, + 0x4062B621, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062B622, 0x4063AC20, + 0x40648C20, 0x00000003, 0x4062B623, 0x4063AC20, 0x40648C20, 0x00000003, + 0x4062B624, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062B625, 0x4063AC20, + 0x40648C20, 0x00000003, 0x4062B626, 0x4063AC20, 0x40648C20, 0x00000003, + 0x4062B627, 0x4063AC20, 0x40648C20, 0x00000003, + // Block 353, offset 0x5840 + 0x4062B628, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062B629, 0x4063AC20, + 0x40648C20, 0x00000003, 0x4062B62A, 0x4063AC20, 0x40648C20, 0x00000003, + 0x4062B62B, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062B62C, 0x4063AC20, + 0x40648C20, 0x00000003, 0x4062B62D, 0x4063AC20, 0x40648C20, 0x00000003, + 0x4062B62E, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062B62F, 0x4063AC20, + 0x40648C20, 0x00000003, 0x4062B630, 0x4063AC20, 0x40648C20, 0x00000003, + 0x4062B631, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062B632, 0x4063AC20, + 0x40648C20, 0x00000003, 0x4062B633, 0x4063AC20, 0x40648C20, 0x00000002, + 0x4062B621, 0x4063B420, 0x00000002, 0x4062B622, 0x4063B420, 0x00000002, + 0x4062B623, 0x4063B420, 0x00000002, 0x4062B624, 0x4063B420, 0x00000002, + 0x4062B625, 0x4063B420, 0x00000002, 0x4062B626, + // Block 354, offset 0x5880 + 0x4063B420, 0x00000002, 0x4062B627, 0x4063B420, 0x00000002, 0x4062B628, + 0x4063B420, 0x00000002, 0x4062B629, 0x4063B420, 0x00000002, 0x4062B62A, + 0x4063B420, 0x00000002, 0x4062B62B, 0x4063B420, 0x00000002, 0x4062B62C, + 0x4063B420, 0x00000002, 0x4062B62D, 0x4063B420, 0x00000002, 0x4062B62E, + 0x4063B420, 0x00000002, 0x4062B62F, 0x4063B420, 0x00000002, 0x4062B630, + 0x4063B420, 0x00000002, 0x4062B631, 0x4063B420, 0x00000002, 0x4062B632, + 0x4063B420, 0x00000002, 0x4062B633, 0x4063B420, 0x00000002, 0x4062B634, + 0x4063B420, 0x00000002, 0x4062B635, 0x4063B420, 0x00000002, 0x4062B636, + 0x4063B420, 0x00000002, 0x4062B637, 0x4063B420, 0x00000002, 0x4062B638, + 0x4063B420, 0x00000002, 0x4062B639, 0x4063B420, 0x00000002, 0x4062B63A, + 0x4063B420, 0x00000002, 0x4062B63B, 0x4063B420, + // Block 355, offset 0x58c0 + 0x00000002, 0x4062B63C, 0x4063B420, 0x00000002, 0x4062B63D, 0x4063B420, + 0x00000003, 0x4062B621, 0x4063B420, 0x40646420, 0x00000003, 0x4062B622, + 0x4063B420, 0x40646420, 0x00000003, 0x4062B623, 0x4063B420, 0x40646420, + 0x00000003, 0x4062B624, 0x4063B420, 0x40646420, 0x00000003, 0x4062B625, + 0x4063B420, 0x40646420, 0x00000003, 0x4062B626, 0x4063B420, 0x40646420, + 0x00000003, 0x4062B627, 0x4063B420, 0x40646420, 0x00000003, 0x4062B628, + 0x4063B420, 0x40646420, 0x00000003, 0x4062B629, 0x4063B420, 0x40646420, + 0x00000003, 0x4062B62A, 0x4063B420, 0x40646420, 0x00000003, 0x4062B62B, + 0x4063B420, 0x40646420, 0x00000003, 0x4062B62C, 0x4063B420, 0x40646420, + 0x00000003, 0x4062B62D, 0x4063B420, 0x40646420, 0x00000003, 0x4062B621, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062B622, + // Block 356, offset 0x5900 + 0x4063B420, 0x40646A20, 0x00000003, 0x4062B623, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062B624, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B625, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062B626, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062B627, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B628, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062B629, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062B62A, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B62B, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062B62C, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062B62D, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B62E, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062B62F, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062B630, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B631, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062B632, + // Block 357, offset 0x5940 + 0x4063B420, 0x40646A20, 0x00000003, 0x4062B633, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062B621, 0x4063B420, 0x40647220, 0x00000003, 0x4062B622, + 0x4063B420, 0x40647220, 0x00000003, 0x4062B623, 0x4063B420, 0x40647220, + 0x00000003, 0x4062B624, 0x4063B420, 0x40647220, 0x00000003, 0x4062B625, + 0x4063B420, 0x40647220, 0x00000003, 0x4062B626, 0x4063B420, 0x40647220, + 0x00000003, 0x4062B627, 0x4063B420, 0x40647220, 0x00000003, 0x4062B628, + 0x4063B420, 0x40647220, 0x00000003, 0x4062B629, 0x4063B420, 0x40647220, + 0x00000003, 0x4062B621, 0x4063B420, 0x40648220, 0x00000003, 0x4062B622, + 0x4063B420, 0x40648220, 0x00000003, 0x4062B623, 0x4063B420, 0x40648220, + 0x00000003, 0x4062B624, 0x4063B420, 0x40648220, 0x00000003, 0x4062B625, + 0x4063B420, 0x40648220, 0x00000003, 0x4062B626, + // Block 358, offset 0x5980 + 0x4063B420, 0x40648220, 0x00000003, 0x4062B627, 0x4063B420, 0x40648220, + 0x00000003, 0x4062B628, 0x4063B420, 0x40648220, 0x00000003, 0x4062B621, + 0x4063B420, 0x40648420, 0x00000003, 0x4062B622, 0x4063B420, 0x40648420, + 0x00000003, 0x4062B623, 0x4063B420, 0x40648420, 0x00000003, 0x4062B621, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062B622, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062B623, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B624, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062B625, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062B626, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B627, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062B628, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062B629, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B62A, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062B62B, + // Block 359, offset 0x59c0 + 0x4063B420, 0x40648C20, 0x00000003, 0x4062B62C, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062B62D, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B62E, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062B62F, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062B630, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B631, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062B632, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062B633, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B634, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062B635, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062B636, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B637, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062B638, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062B639, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B63A, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062B63B, + // Block 360, offset 0x5a00 + 0x4063B420, 0x40648C20, 0x00000003, 0x4062B63C, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062B63D, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B63E, + 0x4063B420, 0x40648C20, 0x00000002, 0x4062B621, 0x4063B620, 0x00000002, + 0x4062B622, 0x4063B620, 0x00000002, 0x4062B623, 0x4063B620, 0x00000002, + 0x4062B624, 0x4063B620, 0x00000002, 0x4062B625, 0x4063B620, 0x00000002, + 0x4062B626, 0x4063B620, 0x00000002, 0x4062B627, 0x4063B620, 0x00000002, + 0x4062B621, 0x4063B820, 0x00000002, 0x4062B622, 0x4063B820, 0x00000002, + 0x4062B623, 0x4063B820, 0x00000002, 0x4062B624, 0x4063B820, 0x00000002, + 0x4062B625, 0x4063B820, 0x00000002, 0x4062B626, 0x4063B820, 0x00000002, + 0x4062B627, 0x4063B820, 0x00000002, 0x4062B628, 0x4063B820, 0x00000002, + 0x4062B629, 0x4063B820, 0x00000002, 0x4062B62A, + // Block 361, offset 0x5a40 + 0x4063B820, 0x00000002, 0x4062B62B, 0x4063B820, 0x00000002, 0x4062B62C, + 0x4063B820, 0x00000002, 0x4062B62D, 0x4063B820, 0x00000002, 0x4062B62E, + 0x4063B820, 0x00000002, 0x4062B62F, 0x4063B820, 0x00000002, 0x4062B630, + 0x4063B820, 0x00000002, 0x4062B631, 0x4063B820, 0x00000002, 0x4062B632, + 0x4063B820, 0x00000002, 0x4062B633, 0x4063B820, 0x00000002, 0x4062B634, + 0x4063B820, 0x00000002, 0x4062B635, 0x4063B820, 0x00000002, 0x4062B636, + 0x4063B820, 0x00000002, 0x4062B637, 0x4063B820, 0x00000002, 0x4062B638, + 0x4063B820, 0x00000002, 0x4062B639, 0x4063B820, 0x00000002, 0x4062B63A, + 0x4063B820, 0x00000002, 0x4062B63B, 0x4063B820, 0x00000002, 0x4062B63C, + 0x4063B820, 0x00000002, 0x4062B63D, 0x4063B820, 0x00000002, 0x4062B63E, + 0x4063B820, 0x00000002, 0x4062B63F, 0x4063B820, + // Block 362, offset 0x5a80 + 0x00000003, 0x4062B621, 0x4063B820, 0x40646420, 0x00000003, 0x4062B622, + 0x4063B820, 0x40646420, 0x00000003, 0x4062B623, 0x4063B820, 0x40646420, + 0x00000003, 0x4062B624, 0x4063B820, 0x40646420, 0x00000003, 0x4062B625, + 0x4063B820, 0x40646420, 0x00000003, 0x4062B626, 0x4063B820, 0x40646420, + 0x00000003, 0x4062B627, 0x4063B820, 0x40646420, 0x00000003, 0x4062B628, + 0x4063B820, 0x40646420, 0x00000003, 0x4062B629, 0x4063B820, 0x40646420, + 0x00000003, 0x4062B62A, 0x4063B820, 0x40646420, 0x00000003, 0x4062B62B, + 0x4063B820, 0x40646420, 0x00000003, 0x4062B62C, 0x4063B820, 0x40646420, + 0x00000003, 0x4062B62D, 0x4063B820, 0x40646420, 0x00000003, 0x4062B62E, + 0x4063B820, 0x40646420, 0x00000003, 0x4062B621, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062B621, 0x4063B820, 0x40648C20, + // Block 363, offset 0x5ac0 + 0x00000003, 0x4062B622, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B623, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062B624, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062B625, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B626, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062B627, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062B628, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B629, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062B62A, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062B62B, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B62C, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062B62D, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062B62E, 0x4063B820, 0x40648C20, 0x00000002, 0x4062B621, + 0x4063BE20, 0x00000002, 0x4062B622, 0x4063BE20, 0x00000002, 0x4062B623, + 0x4063BE20, 0x00000002, 0x4062B624, 0x4063BE20, + // Block 364, offset 0x5b00 + 0x00000002, 0x4062B625, 0x4063BE20, 0x00000002, 0x4062B626, 0x4063BE20, + 0x00000002, 0x4062B627, 0x4063BE20, 0x00000002, 0x4062B628, 0x4063BE20, + 0x00000002, 0x4062B629, 0x4063BE20, 0x00000002, 0x4062B62A, 0x4063BE20, + 0x00000002, 0x4062B62B, 0x4063BE20, 0x00000002, 0x4062B62C, 0x4063BE20, + 0x00000002, 0x4062B62D, 0x4063BE20, 0x00000002, 0x4062B62E, 0x4063BE20, + 0x00000002, 0x4062B62F, 0x4063BE20, 0x00000002, 0x4062B630, 0x4063BE20, + 0x00000002, 0x4062B631, 0x4063BE20, 0x00000002, 0x4062B632, 0x4063BE20, + 0x00000002, 0x4062B633, 0x4063BE20, 0x00000002, 0x4062B621, 0x4063C020, + 0x00000002, 0x4062B622, 0x4063C020, 0x00000002, 0x4062B623, 0x4063C020, + 0x00000002, 0x4062B624, 0x4063C020, 0x00000002, 0x4062B625, 0x4063C020, + 0x00000002, 0x4062B626, 0x4063C020, 0x00000002, + // Block 365, offset 0x5b40 + 0x4062B627, 0x4063C020, 0x00000002, 0x4062B628, 0x4063C020, 0x00000002, + 0x4062B629, 0x4063C020, 0x00000002, 0x4062B62A, 0x4063C020, 0x00000002, + 0x4062B62B, 0x4063C020, 0x00000002, 0x4062B62C, 0x4063C020, 0x00000002, + 0x4062B62D, 0x4063C020, 0x00000002, 0x4062B62E, 0x4063C020, 0x00000002, + 0x4062B62F, 0x4063C020, 0x00000002, 0x4062B630, 0x4063C020, 0x00000002, + 0x4062B631, 0x4063C020, 0x00000002, 0x4062B632, 0x4063C020, 0x00000002, + 0x4062B633, 0x4063C020, 0x00000002, 0x4062B634, 0x4063C020, 0x00000002, + 0x4062B635, 0x4063C020, 0x00000002, 0x4062B636, 0x4063C020, 0x00000002, + 0x4062B637, 0x4063C020, 0x00000002, 0x4062B638, 0x4063C020, 0x00000003, + 0x4062B621, 0x4063C020, 0x40648C20, 0x00000003, 0x4062B622, 0x4063C020, + 0x40648C20, 0x00000002, 0x4062B621, 0x4063C220, + // Block 366, offset 0x5b80 + 0x00000002, 0x4062B622, 0x4063C220, 0x00000002, 0x4062B623, 0x4063C220, + 0x00000002, 0x4062B624, 0x4063C220, 0x00000002, 0x4062B625, 0x4063C220, + 0x00000002, 0x4062B626, 0x4063C220, 0x00000002, 0x4062B627, 0x4063C220, + 0x00000002, 0x4062B628, 0x4063C220, 0x00000002, 0x4062B629, 0x4063C220, + 0x00000002, 0x4062B62A, 0x4063C220, 0x00000002, 0x4062B62B, 0x4063C220, + 0x00000002, 0x4062B62C, 0x4063C220, 0x00000002, 0x4062B62D, 0x4063C220, + 0x00000002, 0x4062B62E, 0x4063C220, 0x00000002, 0x4062B62F, 0x4063C220, + 0x00000002, 0x4062B630, 0x4063C220, 0x00000002, 0x4062B631, 0x4063C220, + 0x00000002, 0x4062B632, 0x4063C220, 0x00000002, 0x4062B633, 0x4063C220, + 0x00000002, 0x4062B634, 0x4063C220, 0x00000002, 0x4062B621, 0x4063CA20, + 0x00000002, 0x4062B622, 0x4063CA20, 0x00000002, + // Block 367, offset 0x5bc0 + 0x4062B623, 0x4063CA20, 0x00000002, 0x4062B624, 0x4063CA20, 0x00000002, + 0x4062B625, 0x4063CA20, 0x00000002, 0x4062B626, 0x4063CA20, 0x00000002, + 0x4062B627, 0x4063CA20, 0x00000002, 0x4062B628, 0x4063CA20, 0x00000002, + 0x4062B629, 0x4063CA20, 0x00000002, 0x4062B62A, 0x4063CA20, 0x00000002, + 0x4062B62B, 0x4063CA20, 0x00000002, 0x4062B62C, 0x4063CA20, 0x00000002, + 0x4062B62D, 0x4063CA20, 0x00000002, 0x4062B62E, 0x4063CA20, 0x00000002, + 0x4062B62F, 0x4063CA20, 0x00000002, 0x4062B630, 0x4063CA20, 0x00000002, + 0x4062B631, 0x4063CA20, 0x00000002, 0x4062B632, 0x4063CA20, 0x00000002, + 0x4062B633, 0x4063CA20, 0x00000003, 0x4062B621, 0x4063CA20, 0x40646420, + 0x00000003, 0x4062B622, 0x4063CA20, 0x40646420, 0x00000003, 0x4062B623, + 0x4063CA20, 0x40646420, 0x00000003, 0x4062B624, + // Block 368, offset 0x5c00 + 0x4063CA20, 0x40646420, 0x00000003, 0x4062B621, 0x4063CA20, 0x40646A20, + 0x00000003, 0x4062B622, 0x4063CA20, 0x40646A20, 0x00000003, 0x4062B623, + 0x4063CA20, 0x40646A20, 0x00000003, 0x4062B624, 0x4063CA20, 0x40646A20, + 0x00000003, 0x4062B625, 0x4063CA20, 0x40646A20, 0x00000003, 0x4062B626, + 0x4063CA20, 0x40646A20, 0x00000003, 0x4062B627, 0x4063CA20, 0x40646A20, + 0x00000003, 0x4062B621, 0x4063CA20, 0x40647220, 0x00000003, 0x4062B622, + 0x4063CA20, 0x40647220, 0x00000003, 0x4062B623, 0x4063CA20, 0x40647220, + 0x00000003, 0x4062B624, 0x4063CA20, 0x40647220, 0x00000003, 0x4062B625, + 0x4063CA20, 0x40647220, 0x00000003, 0x4062B621, 0x4063CA20, 0x40648C20, + 0x00000003, 0x4062B622, 0x4063CA20, 0x40648C20, 0x00000003, 0x4062B623, + 0x4063CA20, 0x40648C20, 0x00000003, 0x4062B621, + // Block 369, offset 0x5c40 + 0x4063CC20, 0x40646420, 0x00000003, 0x4062B622, 0x4063CC20, 0x40646420, + 0x00000003, 0x4062B623, 0x4063CC20, 0x40646420, 0x00000003, 0x4062B621, + 0x4063CC20, 0x40648220, 0x00000003, 0x4062B622, 0x4063CC20, 0x40648220, + 0x00000003, 0x4062B623, 0x4063CC20, 0x40648220, 0x00000003, 0x4062B624, + 0x4063CC20, 0x40648220, 0x00000003, 0x4062B621, 0x4063CC20, 0x40648C20, + 0x00000003, 0x4062B622, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B623, + 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B624, 0x4063CC20, 0x40648C20, + 0x00000003, 0x4062B625, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B626, + 0x4063CC20, 0x40648C20, 0x00000003, 0x4062B627, 0x4063CC20, 0x40648C20, + 0x00000003, 0x4062B628, 0x4063CC20, 0x40648C20, 0x00000002, 0x4062B621, + 0x4063D020, 0x00000002, 0x4062B622, 0x4063D020, + // Block 370, offset 0x5c80 + 0x00000002, 0x4062B623, 0x4063D020, 0x00000002, 0x4062B624, 0x4063D020, + 0x00000002, 0x4062B625, 0x4063D020, 0x00000002, 0x4062B626, 0x4063D020, + 0x00000002, 0x4062B627, 0x4063D020, 0x00000002, 0x4062B628, 0x4063D020, + 0x00000002, 0x4062B629, 0x4063D020, 0x00000002, 0x4062B62A, 0x4063D020, + 0x00000002, 0x4062B62B, 0x4063D020, 0x00000002, 0x4062B62C, 0x4063D020, + 0x00000002, 0x4062B62D, 0x4063D020, 0x00000002, 0x4062B62E, 0x4063D020, + 0x00000002, 0x4062B62F, 0x4063D020, 0x00000002, 0x4062B630, 0x4063D020, + 0x00000002, 0x4062B631, 0x4063D020, 0x00000002, 0x4062B632, 0x4063D020, + 0x00000002, 0x4062B633, 0x4063D020, 0x00000002, 0x4062B634, 0x4063D020, + 0x00000002, 0x4062B635, 0x4063D020, 0x00000002, 0x4062B636, 0x4063D020, + 0x00000002, 0x4062B637, 0x4063D020, 0x00000002, + // Block 371, offset 0x5cc0 + 0x4062B638, 0x4063D020, 0x00000002, 0x4062B639, 0x4063D020, 0x00000002, + 0x4062B63A, 0x4063D020, 0x00000002, 0x4062B63B, 0x4063D020, 0x00000002, + 0x4062B63C, 0x4063D020, 0x00000002, 0x4062B63D, 0x4063D020, 0x00000002, + 0x4062B63E, 0x4063D020, 0x00000002, 0x4062B63F, 0x4063D020, 0x00000002, + 0x4062B640, 0x4063D020, 0x00000002, 0x4062B641, 0x4063D020, 0x00000002, + 0x4062B642, 0x4063D020, 0x00000002, 0x4062B643, 0x4063D020, 0x00000002, + 0x4062B644, 0x4063D020, 0x00000002, 0x4062B645, 0x4063D020, 0x00000002, + 0x4062B646, 0x4063D020, 0x00000002, 0x4062B647, 0x4063D020, 0x00000003, + 0x4062B621, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B622, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062B623, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062B624, 0x4063D020, 0x40646A20, 0x00000003, + // Block 372, offset 0x5d00 + 0x4062B625, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B626, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062B627, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062B628, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B629, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062B62A, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062B62B, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B62C, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062B62D, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062B62E, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B62F, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062B630, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062B631, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B632, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062B633, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062B634, 0x4063D020, 0x40646A20, 0x00000003, + // Block 373, offset 0x5d40 + 0x4062B635, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B621, 0x4063D020, + 0x40648220, 0x00000003, 0x4062B622, 0x4063D020, 0x40648220, 0x00000003, + 0x4062B623, 0x4063D020, 0x40648220, 0x00000003, 0x4062B624, 0x4063D020, + 0x40648220, 0x00000003, 0x4062B625, 0x4063D020, 0x40648220, 0x00000003, + 0x4062B626, 0x4063D020, 0x40648220, 0x00000003, 0x4062B621, 0x4063D020, + 0x40648420, 0x00000003, 0x4062B622, 0x4063D020, 0x40648420, 0x00000003, + 0x4062B623, 0x4063D020, 0x40648420, 0x00000003, 0x4062B624, 0x4063D020, + 0x40648420, 0x00000003, 0x4062B625, 0x4063D020, 0x40648420, 0x00000002, + 0x4062B821, 0x4063A820, 0x00000002, 0x4062B822, 0x4063A820, 0x00000002, + 0x4062B823, 0x4063A820, 0x00000002, 0x4062B824, 0x4063A820, 0x00000002, + 0x4062B825, 0x4063A820, 0x00000002, 0x4062B826, + // Block 374, offset 0x5d80 + 0x4063A820, 0x00000002, 0x4062B827, 0x4063A820, 0x00000002, 0x4062B828, + 0x4063A820, 0x00000002, 0x4062B829, 0x4063A820, 0x00000002, 0x4062B82A, + 0x4063A820, 0x00000002, 0x4062B82B, 0x4063A820, 0x00000002, 0x4062B82C, + 0x4063A820, 0x00000002, 0x4062B82D, 0x4063A820, 0x00000002, 0x4062B82E, + 0x4063A820, 0x00000003, 0x4062B821, 0x4063A820, 0x40646420, 0x00000003, + 0x4062B822, 0x4063A820, 0x40646420, 0x00000003, 0x4062B823, 0x4063A820, + 0x40646420, 0x00000003, 0x4062B824, 0x4063A820, 0x40646420, 0x00000003, + 0x4062B825, 0x4063A820, 0x40646420, 0x00000003, 0x4062B826, 0x4063A820, + 0x40646420, 0x00000003, 0x4062B827, 0x4063A820, 0x40646420, 0x00000003, + 0x4062B828, 0x4063A820, 0x40646420, 0x00000003, 0x4062B821, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062B822, 0x4063A820, + // Block 375, offset 0x5dc0 + 0x40646A20, 0x00000003, 0x4062B823, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062B824, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B825, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062B826, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062B827, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B828, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062B829, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062B82A, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B82B, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062B82C, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062B82D, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B82E, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062B82F, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062B830, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B831, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062B832, 0x4063A820, + // Block 376, offset 0x5e00 + 0x40646A20, 0x00000003, 0x4062B833, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062B834, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B835, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062B836, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062B837, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B838, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062B839, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062B83A, 0x4063A820, 0x40646A20, 0x00000003, 0x4062B83B, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062B83C, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062B821, 0x4063A820, 0x40647220, 0x00000003, 0x4062B822, 0x4063A820, + 0x40647220, 0x00000003, 0x4062B823, 0x4063A820, 0x40647220, 0x00000003, + 0x4062B824, 0x4063A820, 0x40647220, 0x00000003, 0x4062B825, 0x4063A820, + 0x40647220, 0x00000003, 0x4062B826, 0x4063A820, + // Block 377, offset 0x5e40 + 0x40647220, 0x00000003, 0x4062B827, 0x4063A820, 0x40647220, 0x00000003, + 0x4062B828, 0x4063A820, 0x40647220, 0x00000003, 0x4062B829, 0x4063A820, + 0x40647220, 0x00000003, 0x4062B821, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062B822, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B823, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062B824, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062B825, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B826, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062B827, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062B828, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B829, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062B82A, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062B82B, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B82C, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062B82D, 0x4063A820, + // Block 378, offset 0x5e80 + 0x40648C20, 0x00000003, 0x4062B82E, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062B82F, 0x4063A820, 0x40648C20, 0x00000003, 0x4062B830, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062B831, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062B832, 0x4063A820, 0x40648C20, 0x00000002, 0x4062B821, 0x4063AA20, + 0x00000002, 0x4062B822, 0x4063AA20, 0x00000002, 0x4062B823, 0x4063AA20, + 0x00000002, 0x4062B824, 0x4063AA20, 0x00000002, 0x4062B825, 0x4063AA20, + 0x00000002, 0x4062B826, 0x4063AA20, 0x00000002, 0x4062B827, 0x4063AA20, + 0x00000002, 0x4062B828, 0x4063AA20, 0x00000002, 0x4062B829, 0x4063AA20, + 0x00000002, 0x4062B82A, 0x4063AA20, 0x00000002, 0x4062B82B, 0x4063AA20, + 0x00000002, 0x4062B82C, 0x4063AA20, 0x00000002, 0x4062B82D, 0x4063AA20, + 0x00000002, 0x4062B82E, 0x4063AA20, 0x00000002, + // Block 379, offset 0x5ec0 + 0x4062B82F, 0x4063AA20, 0x00000002, 0x4062B830, 0x4063AA20, 0x00000002, + 0x4062B831, 0x4063AA20, 0x00000002, 0x4062B832, 0x4063AA20, 0x00000002, + 0x4062B833, 0x4063AA20, 0x00000002, 0x4062B834, 0x4063AA20, 0x00000002, + 0x4062B835, 0x4063AA20, 0x00000002, 0x4062B836, 0x4063AA20, 0x00000002, + 0x4062B837, 0x4063AA20, 0x00000003, 0x4062B821, 0x4063AA20, 0x40646420, + 0x00000003, 0x4062B822, 0x4063AA20, 0x40646420, 0x00000003, 0x4062B823, + 0x4063AA20, 0x40646420, 0x00000003, 0x4062B824, 0x4063AA20, 0x40646420, + 0x00000003, 0x4062B825, 0x4063AA20, 0x40646420, 0x00000003, 0x4062B826, + 0x4063AA20, 0x40646420, 0x00000003, 0x4062B827, 0x4063AA20, 0x40646420, + 0x00000003, 0x4062B828, 0x4063AA20, 0x40646420, 0x00000003, 0x4062B821, + 0x4063AA20, 0x40648C20, 0x00000003, 0x4062B822, + // Block 380, offset 0x5f00 + 0x4063AA20, 0x40648C20, 0x00000003, 0x4062B823, 0x4063AA20, 0x40648C20, + 0x00000003, 0x4062B824, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062B825, + 0x4063AA20, 0x40648C20, 0x00000003, 0x4062B826, 0x4063AA20, 0x40648C20, + 0x00000003, 0x4062B827, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062B828, + 0x4063AA20, 0x40648C20, 0x00000003, 0x4062B829, 0x4063AA20, 0x40648C20, + 0x00000003, 0x4062B82A, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062B821, + 0x4063B420, 0x40646420, 0x00000003, 0x4062B822, 0x4063B420, 0x40646420, + 0x00000003, 0x4062B823, 0x4063B420, 0x40646420, 0x00000003, 0x4062B824, + 0x4063B420, 0x40646420, 0x00000003, 0x4062B821, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062B822, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B823, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062B824, + // Block 381, offset 0x5f40 + 0x4063B420, 0x40646A20, 0x00000003, 0x4062B825, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062B826, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B827, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062B828, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062B829, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B82A, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062B82B, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062B82C, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B82D, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062B82E, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062B82F, 0x4063B420, 0x40646A20, 0x00000003, 0x4062B830, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062B821, 0x4063B420, 0x40647220, + 0x00000003, 0x4062B822, 0x4063B420, 0x40647220, 0x00000003, 0x4062B823, + 0x4063B420, 0x40647220, 0x00000003, 0x4062B824, + // Block 382, offset 0x5f80 + 0x4063B420, 0x40647220, 0x00000003, 0x4062B821, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062B822, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B823, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062B824, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062B825, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B826, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062B827, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062B828, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B829, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062B82A, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062B82B, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B82C, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062B82D, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062B82E, 0x4063B420, 0x40648C20, 0x00000003, 0x4062B82F, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062B830, + // Block 383, offset 0x5fc0 + 0x4063B420, 0x40648C20, 0x00000002, 0x4062B821, 0x4063B620, 0x00000002, + 0x4062B821, 0x4063B820, 0x00000002, 0x4062B822, 0x4063B820, 0x00000002, + 0x4062B823, 0x4063B820, 0x00000002, 0x4062B824, 0x4063B820, 0x00000002, + 0x4062B825, 0x4063B820, 0x00000002, 0x4062B826, 0x4063B820, 0x00000002, + 0x4062B827, 0x4063B820, 0x00000002, 0x4062B828, 0x4063B820, 0x00000002, + 0x4062B829, 0x4063B820, 0x00000002, 0x4062B82A, 0x4063B820, 0x00000002, + 0x4062B82B, 0x4063B820, 0x00000002, 0x4062B82C, 0x4063B820, 0x00000002, + 0x4062B82D, 0x4063B820, 0x00000002, 0x4062B82E, 0x4063B820, 0x00000002, + 0x4062B82F, 0x4063B820, 0x00000002, 0x4062B830, 0x4063B820, 0x00000002, + 0x4062B831, 0x4063B820, 0x00000002, 0x4062B832, 0x4063B820, 0x00000002, + 0x4062B833, 0x4063B820, 0x00000002, 0x4062B834, + // Block 384, offset 0x6000 + 0x4063B820, 0x00000002, 0x4062B835, 0x4063B820, 0x00000002, 0x4062B836, + 0x4063B820, 0x00000002, 0x4062B837, 0x4063B820, 0x00000002, 0x4062B838, + 0x4063B820, 0x00000002, 0x4062B839, 0x4063B820, 0x00000002, 0x4062B83A, + 0x4063B820, 0x00000002, 0x4062B83B, 0x4063B820, 0x00000002, 0x4062B83C, + 0x4063B820, 0x00000002, 0x4062B83D, 0x4063B820, 0x00000002, 0x4062B83E, + 0x4063B820, 0x00000002, 0x4062B83F, 0x4063B820, 0x00000002, 0x4062B840, + 0x4063B820, 0x00000002, 0x4062B841, 0x4063B820, 0x00000002, 0x4062B842, + 0x4063B820, 0x00000002, 0x4062B843, 0x4063B820, 0x00000002, 0x4062B844, + 0x4063B820, 0x00000002, 0x4062B845, 0x4063B820, 0x00000002, 0x4062B846, + 0x4063B820, 0x00000002, 0x4062B847, 0x4063B820, 0x00000003, 0x4062B821, + 0x4063B820, 0x40646420, 0x00000003, 0x4062B822, + // Block 385, offset 0x6040 + 0x4063B820, 0x40646420, 0x00000003, 0x4062B823, 0x4063B820, 0x40646420, + 0x00000003, 0x4062B824, 0x4063B820, 0x40646420, 0x00000003, 0x4062B825, + 0x4063B820, 0x40646420, 0x00000003, 0x4062B826, 0x4063B820, 0x40646420, + 0x00000003, 0x4062B827, 0x4063B820, 0x40646420, 0x00000003, 0x4062B828, + 0x4063B820, 0x40646420, 0x00000003, 0x4062B829, 0x4063B820, 0x40646420, + 0x00000003, 0x4062B821, 0x4063B820, 0x40647220, 0x00000003, 0x4062B822, + 0x4063B820, 0x40647220, 0x00000003, 0x4062B821, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062B822, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B823, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062B824, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062B825, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B826, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062B827, + // Block 386, offset 0x6080 + 0x4063B820, 0x40648C20, 0x00000003, 0x4062B828, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062B829, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B82A, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062B82B, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062B82C, 0x4063B820, 0x40648C20, 0x00000003, 0x4062B82D, + 0x4063B820, 0x40648C20, 0x00000002, 0x4062B821, 0x4063C020, 0x00000002, + 0x4062B822, 0x4063C020, 0x00000002, 0x4062B823, 0x4063C020, 0x00000002, + 0x4062B824, 0x4063C020, 0x00000002, 0x4062B825, 0x4063C020, 0x00000002, + 0x4062B826, 0x4063C020, 0x00000002, 0x4062B827, 0x4063C020, 0x00000002, + 0x4062B828, 0x4063C020, 0x00000002, 0x4062B829, 0x4063C020, 0x00000002, + 0x4062B82A, 0x4063C020, 0x00000002, 0x4062B82B, 0x4063C020, 0x00000002, + 0x4062B82C, 0x4063C020, 0x00000002, 0x4062B82D, + // Block 387, offset 0x60c0 + 0x4063C020, 0x00000002, 0x4062B82E, 0x4063C020, 0x00000002, 0x4062B82F, + 0x4063C020, 0x00000002, 0x4062B830, 0x4063C020, 0x00000002, 0x4062B821, + 0x4063C220, 0x00000002, 0x4062B822, 0x4063C220, 0x00000002, 0x4062B823, + 0x4063C220, 0x00000002, 0x4062B824, 0x4063C220, 0x00000002, 0x4062B825, + 0x4063C220, 0x00000002, 0x4062B826, 0x4063C220, 0x00000002, 0x4062B827, + 0x4063C220, 0x00000002, 0x4062B828, 0x4063C220, 0x00000002, 0x4062B829, + 0x4063C220, 0x00000002, 0x4062B82A, 0x4063C220, 0x00000002, 0x4062B82B, + 0x4063C220, 0x00000002, 0x4062B82C, 0x4063C220, 0x00000002, 0x4062B82D, + 0x4063C220, 0x00000002, 0x4062B82E, 0x4063C220, 0x00000002, 0x4062B82F, + 0x4063C220, 0x00000002, 0x4062B830, 0x4063C220, 0x00000002, 0x4062B831, + 0x4063C220, 0x00000002, 0x4062B832, 0x4063C220, + // Block 388, offset 0x6100 + 0x00000002, 0x4062B833, 0x4063C220, 0x00000002, 0x4062B834, 0x4063C220, + 0x00000002, 0x4062B835, 0x4063C220, 0x00000002, 0x4062B836, 0x4063C220, + 0x00000002, 0x4062B837, 0x4063C220, 0x00000002, 0x4062B838, 0x4063C220, + 0x00000002, 0x4062B839, 0x4063C220, 0x00000002, 0x4062B83A, 0x4063C220, + 0x00000002, 0x4062B83B, 0x4063C220, 0x00000003, 0x4062B821, 0x4063C220, + 0x40646420, 0x00000003, 0x4062B822, 0x4063C220, 0x40646420, 0x00000003, + 0x4062B823, 0x4063C220, 0x40646420, 0x00000003, 0x4062B821, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062B822, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062B823, 0x4063C220, 0x40646A20, 0x00000003, 0x4062B824, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062B825, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062B826, 0x4063C220, 0x40646A20, 0x00000003, + // Block 389, offset 0x6140 + 0x4062B827, 0x4063C220, 0x40646A20, 0x00000003, 0x4062B828, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062B829, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062B82A, 0x4063C220, 0x40646A20, 0x00000003, 0x4062B82B, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062B82C, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062B82D, 0x4063C220, 0x40646A20, 0x00000003, 0x4062B82E, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062B82F, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062B830, 0x4063C220, 0x40646A20, 0x00000003, 0x4062B831, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062B832, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062B833, 0x4063C220, 0x40646A20, 0x00000003, 0x4062B821, 0x4063C220, + 0x40647220, 0x00000003, 0x4062B822, 0x4063C220, 0x40647220, 0x00000003, + 0x4062B823, 0x4063C220, 0x40647220, 0x00000002, + // Block 390, offset 0x6180 + 0x4062B821, 0x4063D020, 0x00000002, 0x4062B822, 0x4063D020, 0x00000002, + 0x4062B823, 0x4063D020, 0x00000002, 0x4062B824, 0x4063D020, 0x00000002, + 0x4062B825, 0x4063D020, 0x00000002, 0x4062B826, 0x4063D020, 0x00000002, + 0x4062B827, 0x4063D020, 0x00000002, 0x4062B828, 0x4063D020, 0x00000002, + 0x4062B829, 0x4063D020, 0x00000002, 0x4062B82A, 0x4063D020, 0x00000002, + 0x4062B82B, 0x4063D020, 0x00000002, 0x4062B82C, 0x4063D020, 0x00000002, + 0x4062B82D, 0x4063D020, 0x00000002, 0x4062B82E, 0x4063D020, 0x00000002, + 0x4062B82F, 0x4063D020, 0x00000002, 0x4062B830, 0x4063D020, 0x00000002, + 0x4062B831, 0x4063D020, 0x00000002, 0x4062B832, 0x4063D020, 0x00000002, + 0x4062B833, 0x4063D020, 0x00000002, 0x4062B834, 0x4063D020, 0x00000002, + 0x4062B835, 0x4063D020, 0x00000002, 0x4062B836, + // Block 391, offset 0x61c0 + 0x4063D020, 0x00000002, 0x4062B837, 0x4063D020, 0x00000002, 0x4062B838, + 0x4063D020, 0x00000002, 0x4062B839, 0x4063D020, 0x00000002, 0x4062B83A, + 0x4063D020, 0x00000002, 0x4062B83B, 0x4063D020, 0x00000002, 0x4062B83C, + 0x4063D020, 0x00000002, 0x4062B83D, 0x4063D020, 0x00000002, 0x4062B83E, + 0x4063D020, 0x00000002, 0x4062B83F, 0x4063D020, 0x00000002, 0x4062B840, + 0x4063D020, 0x00000002, 0x4062B841, 0x4063D020, 0x00000003, 0x4062B821, + 0x4063D020, 0x40646A20, 0x00000003, 0x4062B822, 0x4063D020, 0x40646A20, + 0x00000003, 0x4062B823, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B824, + 0x4063D020, 0x40646A20, 0x00000003, 0x4062B825, 0x4063D020, 0x40646A20, + 0x00000003, 0x4062B826, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B827, + 0x4063D020, 0x40646A20, 0x00000003, 0x4062B828, + // Block 392, offset 0x6200 + 0x4063D020, 0x40646A20, 0x00000003, 0x4062B829, 0x4063D020, 0x40646A20, + 0x00000003, 0x4062B82A, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B82B, + 0x4063D020, 0x40646A20, 0x00000003, 0x4062B82C, 0x4063D020, 0x40646A20, + 0x00000003, 0x4062B82D, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B82E, + 0x4063D020, 0x40646A20, 0x00000003, 0x4062B82F, 0x4063D020, 0x40646A20, + 0x00000003, 0x4062B830, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B831, + 0x4063D020, 0x40646A20, 0x00000003, 0x4062B832, 0x4063D020, 0x40646A20, + 0x00000003, 0x4062B833, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B834, + 0x4063D020, 0x40646A20, 0x00000003, 0x4062B835, 0x4063D020, 0x40646A20, + 0x00000003, 0x4062B836, 0x4063D020, 0x40646A20, 0x00000003, 0x4062B837, + 0x4063D020, 0x40646A20, 0x00000003, 0x4062B821, + // Block 393, offset 0x6240 + 0x4063D020, 0x40647220, 0x00000003, 0x4062B822, 0x4063D020, 0x40647220, + 0x00000003, 0x4062B823, 0x4063D020, 0x40647220, 0x00000003, 0x4062B824, + 0x4063D020, 0x40647220, 0x00000003, 0x4062B825, 0x4063D020, 0x40647220, + 0x00000003, 0x4062BA21, 0x4063A820, 0x40646420, 0x00000003, 0x4062BA22, + 0x4063A820, 0x40646420, 0x00000003, 0x4062BA23, 0x4063A820, 0x40646420, + 0x00000003, 0x4062BA24, 0x4063A820, 0x40646420, 0x00000003, 0x4062BA25, + 0x4063A820, 0x40646420, 0x00000003, 0x4062BA26, 0x4063A820, 0x40646420, + 0x00000003, 0x4062BA27, 0x4063A820, 0x40646420, 0x00000003, 0x4062BA28, + 0x4063A820, 0x40646420, 0x00000003, 0x4062BA29, 0x4063A820, 0x40646420, + 0x00000003, 0x4062BA2A, 0x4063A820, 0x40646420, 0x00000003, 0x4062BA2B, + 0x4063A820, 0x40646420, 0x00000003, 0x4062BA2C, + // Block 394, offset 0x6280 + 0x4063A820, 0x40646420, 0x00000003, 0x4062BA2D, 0x4063A820, 0x40646420, + 0x00000003, 0x4062BA2E, 0x4063A820, 0x40646420, 0x00000003, 0x4062BA2F, + 0x4063A820, 0x40646420, 0x00000003, 0x4062BA30, 0x4063A820, 0x40646420, + 0x00000003, 0x4062BA31, 0x4063A820, 0x40646420, 0x00000003, 0x4062BA32, + 0x4063A820, 0x40646420, 0x00000003, 0x4062BA33, 0x4063A820, 0x40646420, + 0x00000003, 0x4062BA34, 0x4063A820, 0x40646420, 0x00000003, 0x4062BA35, + 0x4063A820, 0x40646420, 0x00000003, 0x4062BA36, 0x4063A820, 0x40646420, + 0x00000003, 0x4062BA37, 0x4063A820, 0x40646420, 0x00000003, 0x4062BA38, + 0x4063A820, 0x40646420, 0x00000003, 0x4062BA39, 0x4063A820, 0x40646420, + 0x00000003, 0x4062BA21, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA22, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA23, + // Block 395, offset 0x62c0 + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA24, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062BA25, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA26, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA27, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062BA28, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA29, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA2A, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062BA2B, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA2C, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA2D, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062BA2E, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA2F, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA30, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062BA31, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA32, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA33, + // Block 396, offset 0x6300 + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA34, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062BA35, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA36, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA37, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062BA38, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA39, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA3A, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062BA3B, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA3C, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA3D, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062BA3E, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA3F, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA40, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062BA41, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BA21, + 0x4063A820, 0x40647220, 0x00000003, 0x4062BA22, + // Block 397, offset 0x6340 + 0x4063A820, 0x40647220, 0x00000003, 0x4062BA23, 0x4063A820, 0x40647220, + 0x00000003, 0x4062BA24, 0x4063A820, 0x40647220, 0x00000003, 0x4062BA25, + 0x4063A820, 0x40647220, 0x00000003, 0x4062BA26, 0x4063A820, 0x40647220, + 0x00000003, 0x4062BA27, 0x4063A820, 0x40647220, 0x00000003, 0x4062BA28, + 0x4063A820, 0x40647220, 0x00000003, 0x4062BA29, 0x4063A820, 0x40647220, + 0x00000003, 0x4062BA2A, 0x4063A820, 0x40647220, 0x00000003, 0x4062BA2B, + 0x4063A820, 0x40647220, 0x00000003, 0x4062BA2C, 0x4063A820, 0x40647220, + 0x00000003, 0x4062BA2D, 0x4063A820, 0x40647220, 0x00000003, 0x4062BA2E, + 0x4063A820, 0x40647220, 0x00000003, 0x4062BA2F, 0x4063A820, 0x40647220, + 0x00000003, 0x4062BA30, 0x4063A820, 0x40647220, 0x00000003, 0x4062BA21, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA22, + // Block 398, offset 0x6380 + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA23, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BA24, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA25, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA26, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BA27, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA28, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA29, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BA2A, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA2B, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA2C, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BA2D, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA2E, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA2F, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BA30, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA31, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA32, + // Block 399, offset 0x63c0 + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA33, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BA34, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA35, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA36, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BA37, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA38, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA39, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BA3A, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA3B, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA3C, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BA3D, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA3E, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA3F, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BA40, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA41, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA42, + // Block 400, offset 0x6400 + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA43, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BA44, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA45, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA46, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BA47, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA48, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BA49, 0x4063A820, 0x40648C20, + 0x00000002, 0x4062BA21, 0x4063AA20, 0x00000002, 0x4062BA22, 0x4063AA20, + 0x00000002, 0x4062BA23, 0x4063AA20, 0x00000002, 0x4062BA24, 0x4063AA20, + 0x00000002, 0x4062BA25, 0x4063AA20, 0x00000002, 0x4062BA26, 0x4063AA20, + 0x00000002, 0x4062BA27, 0x4063AA20, 0x00000002, 0x4062BA28, 0x4063AA20, + 0x00000002, 0x4062BA29, 0x4063AA20, 0x00000002, 0x4062BA2A, 0x4063AA20, + 0x00000002, 0x4062BA2B, 0x4063AA20, 0x00000002, + // Block 401, offset 0x6440 + 0x4062BA2C, 0x4063AA20, 0x00000002, 0x4062BA2D, 0x4063AA20, 0x00000002, + 0x4062BA2E, 0x4063AA20, 0x00000002, 0x4062BA2F, 0x4063AA20, 0x00000002, + 0x4062BA30, 0x4063AA20, 0x00000002, 0x4062BA31, 0x4063AA20, 0x00000002, + 0x4062BA32, 0x4063AA20, 0x00000002, 0x4062BA33, 0x4063AA20, 0x00000002, + 0x4062BA34, 0x4063AA20, 0x00000002, 0x4062BA35, 0x4063AA20, 0x00000002, + 0x4062BA36, 0x4063AA20, 0x00000002, 0x4062BA37, 0x4063AA20, 0x00000002, + 0x4062BA38, 0x4063AA20, 0x00000003, 0x4062BA21, 0x4063AA20, 0x40646420, + 0x00000003, 0x4062BA22, 0x4063AA20, 0x40646420, 0x00000003, 0x4062BA23, + 0x4063AA20, 0x40646420, 0x00000003, 0x4062BA24, 0x4063AA20, 0x40646420, + 0x00000003, 0x4062BA25, 0x4063AA20, 0x40646420, 0x00000003, 0x4062BA26, + 0x4063AA20, 0x40646420, 0x00000003, 0x4062BA27, + // Block 402, offset 0x6480 + 0x4063AA20, 0x40646420, 0x00000003, 0x4062BA28, 0x4063AA20, 0x40646420, + 0x00000003, 0x4062BA29, 0x4063AA20, 0x40646420, 0x00000003, 0x4062BA21, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BA22, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BA23, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BA24, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BA25, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BA26, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BA27, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BA28, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BA29, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BA2A, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BA2B, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BA2C, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BA2D, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BA2E, + // Block 403, offset 0x64c0 + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BA21, 0x4063B020, 0x40647220, + 0x00000003, 0x4062BA22, 0x4063B020, 0x40647220, 0x00000003, 0x4062BA23, + 0x4063B020, 0x40647220, 0x00000003, 0x4062BA24, 0x4063B020, 0x40647220, + 0x00000003, 0x4062BA25, 0x4063B020, 0x40647220, 0x00000003, 0x4062BA26, + 0x4063B020, 0x40647220, 0x00000003, 0x4062BA21, 0x4063B020, 0x40648220, + 0x00000003, 0x4062BA22, 0x4063B020, 0x40648220, 0x00000003, 0x4062BA23, + 0x4063B020, 0x40648220, 0x00000003, 0x4062BA24, 0x4063B020, 0x40648220, + 0x00000003, 0x4062BA25, 0x4063B020, 0x40648220, 0x00000003, 0x4062BA26, + 0x4063B020, 0x40648220, 0x00000003, 0x4062BA27, 0x4063B020, 0x40648220, + 0x00000003, 0x4062BA28, 0x4063B020, 0x40648220, 0x00000003, 0x4062BA29, + 0x4063B020, 0x40648220, 0x00000003, 0x4062BA2A, + // Block 404, offset 0x6500 + 0x4063B020, 0x40648220, 0x00000003, 0x4062BA2B, 0x4063B020, 0x40648220, + 0x00000003, 0x4062BA2C, 0x4063B020, 0x40648220, 0x00000003, 0x4062BA21, + 0x4063B020, 0x40648420, 0x00000003, 0x4062BA22, 0x4063B020, 0x40648420, + 0x00000003, 0x4062BA21, 0x4063B420, 0x40646420, 0x00000003, 0x4062BA22, + 0x4063B420, 0x40646420, 0x00000003, 0x4062BA23, 0x4063B420, 0x40646420, + 0x00000003, 0x4062BA24, 0x4063B420, 0x40646420, 0x00000003, 0x4062BA25, + 0x4063B420, 0x40646420, 0x00000003, 0x4062BA26, 0x4063B420, 0x40646420, + 0x00000003, 0x4062BA27, 0x4063B420, 0x40646420, 0x00000003, 0x4062BA28, + 0x4063B420, 0x40646420, 0x00000003, 0x4062BA29, 0x4063B420, 0x40646420, + 0x00000003, 0x4062BA2A, 0x4063B420, 0x40646420, 0x00000003, 0x4062BA2B, + 0x4063B420, 0x40646420, 0x00000003, 0x4062BA2C, + // Block 405, offset 0x6540 + 0x4063B420, 0x40646420, 0x00000003, 0x4062BA2D, 0x4063B420, 0x40646420, + 0x00000003, 0x4062BA2E, 0x4063B420, 0x40646420, 0x00000003, 0x4062BA2F, + 0x4063B420, 0x40646420, 0x00000003, 0x4062BA30, 0x4063B420, 0x40646420, + 0x00000003, 0x4062BA31, 0x4063B420, 0x40646420, 0x00000003, 0x4062BA21, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA22, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062BA23, 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA24, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA25, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062BA26, 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA27, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA28, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062BA29, 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA2A, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA2B, + // Block 406, offset 0x6580 + 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA2C, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062BA2D, 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA2E, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062BA2F, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062BA21, 0x4063B420, 0x40647220, 0x00000003, 0x4062BA22, + 0x4063B420, 0x40647220, 0x00000003, 0x4062BA23, 0x4063B420, 0x40647220, + 0x00000003, 0x4062BA24, 0x4063B420, 0x40647220, 0x00000003, 0x4062BA25, + 0x4063B420, 0x40647220, 0x00000003, 0x4062BA26, 0x4063B420, 0x40647220, + 0x00000003, 0x4062BA21, 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA22, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA23, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062BA24, 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA25, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA26, + // Block 407, offset 0x65c0 + 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA27, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062BA28, 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA29, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA2A, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062BA2B, 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA2C, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA2D, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062BA2E, 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA2F, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA30, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062BA31, 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA32, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA33, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062BA34, 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA35, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA36, + // Block 408, offset 0x6600 + 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA37, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062BA38, 0x4063B420, 0x40648C20, 0x00000003, 0x4062BA39, + 0x4063B420, 0x40648C20, 0x00000002, 0x4062BA21, 0x4063B820, 0x00000002, + 0x4062BA22, 0x4063B820, 0x00000002, 0x4062BA23, 0x4063B820, 0x00000002, + 0x4062BA24, 0x4063B820, 0x00000002, 0x4062BA25, 0x4063B820, 0x00000002, + 0x4062BA26, 0x4063B820, 0x00000002, 0x4062BA27, 0x4063B820, 0x00000002, + 0x4062BA28, 0x4063B820, 0x00000002, 0x4062BA29, 0x4063B820, 0x00000002, + 0x4062BA2A, 0x4063B820, 0x00000002, 0x4062BA2B, 0x4063B820, 0x00000002, + 0x4062BA2C, 0x4063B820, 0x00000002, 0x4062BA2D, 0x4063B820, 0x00000002, + 0x4062BA2E, 0x4063B820, 0x00000002, 0x4062BA2F, 0x4063B820, 0x00000002, + 0x4062BA30, 0x4063B820, 0x00000002, 0x4062BA31, + // Block 409, offset 0x6640 + 0x4063B820, 0x00000002, 0x4062BA32, 0x4063B820, 0x00000002, 0x4062BA33, + 0x4063B820, 0x00000002, 0x4062BA34, 0x4063B820, 0x00000002, 0x4062BA35, + 0x4063B820, 0x00000002, 0x4062BA36, 0x4063B820, 0x00000002, 0x4062BA37, + 0x4063B820, 0x00000003, 0x4062BA21, 0x4063B820, 0x40646420, 0x00000003, + 0x4062BA22, 0x4063B820, 0x40646420, 0x00000003, 0x4062BA23, 0x4063B820, + 0x40646420, 0x00000003, 0x4062BA24, 0x4063B820, 0x40646420, 0x00000003, + 0x4062BA25, 0x4063B820, 0x40646420, 0x00000003, 0x4062BA26, 0x4063B820, + 0x40646420, 0x00000003, 0x4062BA27, 0x4063B820, 0x40646420, 0x00000003, + 0x4062BA28, 0x4063B820, 0x40646420, 0x00000003, 0x4062BA29, 0x4063B820, + 0x40646420, 0x00000003, 0x4062BA2A, 0x4063B820, 0x40646420, 0x00000003, + 0x4062BA2B, 0x4063B820, 0x40646420, 0x00000003, + // Block 410, offset 0x6680 + 0x4062BA2C, 0x4063B820, 0x40646420, 0x00000003, 0x4062BA2D, 0x4063B820, + 0x40646420, 0x00000003, 0x4062BA2E, 0x4063B820, 0x40646420, 0x00000003, + 0x4062BA2F, 0x4063B820, 0x40646420, 0x00000003, 0x4062BA30, 0x4063B820, + 0x40646420, 0x00000003, 0x4062BA31, 0x4063B820, 0x40646420, 0x00000003, + 0x4062BA32, 0x4063B820, 0x40646420, 0x00000003, 0x4062BA33, 0x4063B820, + 0x40646420, 0x00000003, 0x4062BA34, 0x4063B820, 0x40646420, 0x00000003, + 0x4062BA35, 0x4063B820, 0x40646420, 0x00000003, 0x4062BA36, 0x4063B820, + 0x40646420, 0x00000003, 0x4062BA37, 0x4063B820, 0x40646420, 0x00000003, + 0x4062BA38, 0x4063B820, 0x40646420, 0x00000003, 0x4062BA39, 0x4063B820, + 0x40646420, 0x00000003, 0x4062BA3A, 0x4063B820, 0x40646420, 0x00000003, + 0x4062BA21, 0x4063B820, 0x40646A20, 0x00000003, + // Block 411, offset 0x66c0 + 0x4062BA21, 0x4063B820, 0x40647220, 0x00000003, 0x4062BA21, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062BA22, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062BA23, 0x4063B820, 0x40648C20, 0x00000003, 0x4062BA24, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062BA25, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062BA26, 0x4063B820, 0x40648C20, 0x00000003, 0x4062BA27, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062BA28, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062BA29, 0x4063B820, 0x40648C20, 0x00000003, 0x4062BA2A, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062BA2B, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062BA2C, 0x4063B820, 0x40648C20, 0x00000003, 0x4062BA2D, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062BA2E, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062BA2F, 0x4063B820, 0x40648C20, 0x00000003, + // Block 412, offset 0x6700 + 0x4062BA30, 0x4063B820, 0x40648C20, 0x00000003, 0x4062BA31, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062BA32, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062BA33, 0x4063B820, 0x40648C20, 0x00000003, 0x4062BA34, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062BA35, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062BA36, 0x4063B820, 0x40648C20, 0x00000002, 0x4062BA21, 0x4063C220, + 0x00000002, 0x4062BA22, 0x4063C220, 0x00000002, 0x4062BA23, 0x4063C220, + 0x00000002, 0x4062BA24, 0x4063C220, 0x00000002, 0x4062BA25, 0x4063C220, + 0x00000002, 0x4062BA26, 0x4063C220, 0x00000002, 0x4062BA27, 0x4063C220, + 0x00000002, 0x4062BA28, 0x4063C220, 0x00000002, 0x4062BA29, 0x4063C220, + 0x00000002, 0x4062BA2A, 0x4063C220, 0x00000002, 0x4062BA2B, 0x4063C220, + 0x00000002, 0x4062BA2C, 0x4063C220, 0x00000002, + // Block 413, offset 0x6740 + 0x4062BA2D, 0x4063C220, 0x00000002, 0x4062BA2E, 0x4063C220, 0x00000002, + 0x4062BA2F, 0x4063C220, 0x00000002, 0x4062BA30, 0x4063C220, 0x00000002, + 0x4062BA31, 0x4063C220, 0x00000002, 0x4062BA32, 0x4063C220, 0x00000002, + 0x4062BA33, 0x4063C220, 0x00000002, 0x4062BA34, 0x4063C220, 0x00000002, + 0x4062BA35, 0x4063C220, 0x00000002, 0x4062BA36, 0x4063C220, 0x00000002, + 0x4062BA37, 0x4063C220, 0x00000002, 0x4062BA38, 0x4063C220, 0x00000002, + 0x4062BA39, 0x4063C220, 0x00000002, 0x4062BA3A, 0x4063C220, 0x00000002, + 0x4062BA3B, 0x4063C220, 0x00000002, 0x4062BA3C, 0x4063C220, 0x00000002, + 0x4062BA3D, 0x4063C220, 0x00000002, 0x4062BA3E, 0x4063C220, 0x00000002, + 0x4062BA3F, 0x4063C220, 0x00000002, 0x4062BA40, 0x4063C220, 0x00000002, + 0x4062BA41, 0x4063C220, 0x00000002, 0x4062BA42, + // Block 414, offset 0x6780 + 0x4063C220, 0x00000002, 0x4062BA43, 0x4063C220, 0x00000002, 0x4062BA44, + 0x4063C220, 0x00000002, 0x4062BA45, 0x4063C220, 0x00000002, 0x4062BA46, + 0x4063C220, 0x00000002, 0x4062BA47, 0x4063C220, 0x00000002, 0x4062BA48, + 0x4063C220, 0x00000002, 0x4062BA49, 0x4063C220, 0x00000002, 0x4062BA4A, + 0x4063C220, 0x00000002, 0x4062BA4B, 0x4063C220, 0x00000002, 0x4062BA4C, + 0x4063C220, 0x00000002, 0x4062BA4D, 0x4063C220, 0x00000002, 0x4062BA4E, + 0x4063C220, 0x00000002, 0x4062BA4F, 0x4063C220, 0x00000002, 0x4062BA50, + 0x4063C220, 0x00000002, 0x4062BA51, 0x4063C220, 0x00000002, 0x4062BA52, + 0x4063C220, 0x00000002, 0x4062BA53, 0x4063C220, 0x00000002, 0x4062BA54, + 0x4063C220, 0x00000002, 0x4062BA55, 0x4063C220, 0x00000002, 0x4062BA56, + 0x4063C220, 0x00000002, 0x4062BA57, 0x4063C220, + // Block 415, offset 0x67c0 + 0x00000002, 0x4062BA58, 0x4063C220, 0x00000002, 0x4062BA59, 0x4063C220, + 0x00000002, 0x4062BA5A, 0x4063C220, 0x00000002, 0x4062BA5B, 0x4063C220, + 0x00000002, 0x4062BA5C, 0x4063C220, 0x00000002, 0x4062BA5D, 0x4063C220, + 0x00000002, 0x4062BA5E, 0x4063C220, 0x00000002, 0x4062BA5F, 0x4063C220, + 0x00000002, 0x4062BA60, 0x4063C220, 0x00000002, 0x4062BA61, 0x4063C220, + 0x00000002, 0x4062BA62, 0x4063C220, 0x00000002, 0x4062BA63, 0x4063C220, + 0x00000002, 0x4062BA64, 0x4063C220, 0x00000002, 0x4062BA65, 0x4063C220, + 0x00000003, 0x4062BA21, 0x4063C220, 0x40646420, 0x00000003, 0x4062BA21, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA22, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062BA23, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA24, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA25, + // Block 416, offset 0x6800 + 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA26, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062BA27, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA28, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA29, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062BA2A, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA2B, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA2C, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062BA2D, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA2E, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA2F, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062BA30, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA31, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA32, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062BA33, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA34, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA35, + // Block 417, offset 0x6840 + 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA36, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062BA37, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA38, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA39, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062BA3A, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA3B, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA3C, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062BA3D, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA3E, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA3F, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062BA40, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA41, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA42, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062BA43, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA44, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA45, + // Block 418, offset 0x6880 + 0x4063C220, 0x40646A20, 0x00000003, 0x4062BA46, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062BA21, 0x4063C220, 0x40647220, 0x00000003, 0x4062BA22, + 0x4063C220, 0x40647220, 0x00000003, 0x4062BA23, 0x4063C220, 0x40647220, + 0x00000003, 0x4062BA24, 0x4063C220, 0x40647220, 0x00000003, 0x4062BA25, + 0x4063C220, 0x40647220, 0x00000003, 0x4062BA26, 0x4063C220, 0x40647220, + 0x00000003, 0x4062BA27, 0x4063C220, 0x40647220, 0x00000003, 0x4062BA28, + 0x4063C220, 0x40647220, 0x00000003, 0x4062BA29, 0x4063C220, 0x40647220, + 0x00000003, 0x4062BA2A, 0x4063C220, 0x40647220, 0x00000003, 0x4062BA2B, + 0x4063C220, 0x40647220, 0x00000003, 0x4062BA2C, 0x4063C220, 0x40647220, + 0x00000003, 0x4062BA21, 0x4063C220, 0x40648C20, 0x00000003, 0x4062BA22, + 0x4063C220, 0x40648C20, 0x00000003, 0x4062BA23, + // Block 419, offset 0x68c0 + 0x4063C220, 0x40648C20, 0x00000003, 0x4062BA24, 0x4063C220, 0x40648C20, + 0x00000003, 0x4062BA25, 0x4063C220, 0x40648C20, 0x00000003, 0x4062BA26, + 0x4063C220, 0x40648C20, 0x00000003, 0x4062BA27, 0x4063C220, 0x40648C20, + 0x00000003, 0x4062BA28, 0x4063C220, 0x40648C20, 0x00000003, 0x4062BA29, + 0x4063C220, 0x40648C20, 0x00000002, 0x4062BA21, 0x4063D020, 0x00000002, + 0x4062BA22, 0x4063D020, 0x00000002, 0x4062BA23, 0x4063D020, 0x00000002, + 0x4062BA24, 0x4063D020, 0x00000002, 0x4062BA25, 0x4063D020, 0x00000002, + 0x4062BA26, 0x4063D020, 0x00000002, 0x4062BA27, 0x4063D020, 0x00000002, + 0x4062BA28, 0x4063D020, 0x00000002, 0x4062BA29, 0x4063D020, 0x00000002, + 0x4062BA2A, 0x4063D020, 0x00000002, 0x4062BA2B, 0x4063D020, 0x00000002, + 0x4062BA2C, 0x4063D020, 0x00000002, 0x4062BA2D, + // Block 420, offset 0x6900 + 0x4063D020, 0x00000002, 0x4062BA2E, 0x4063D020, 0x00000002, 0x4062BA2F, + 0x4063D020, 0x00000002, 0x4062BA30, 0x4063D020, 0x00000002, 0x4062BA31, + 0x4063D020, 0x00000002, 0x4062BA32, 0x4063D020, 0x00000002, 0x4062BA33, + 0x4063D020, 0x00000002, 0x4062BA34, 0x4063D020, 0x00000002, 0x4062BA35, + 0x4063D020, 0x00000002, 0x4062BA36, 0x4063D020, 0x00000002, 0x4062BA37, + 0x4063D020, 0x00000002, 0x4062BA38, 0x4063D020, 0x00000002, 0x4062BA39, + 0x4063D020, 0x00000002, 0x4062BA3A, 0x4063D020, 0x00000002, 0x4062BA3B, + 0x4063D020, 0x00000002, 0x4062BA3C, 0x4063D020, 0x00000002, 0x4062BA3D, + 0x4063D020, 0x00000002, 0x4062BA3E, 0x4063D020, 0x00000002, 0x4062BA3F, + 0x4063D020, 0x00000002, 0x4062BA40, 0x4063D020, 0x00000002, 0x4062BA41, + 0x4063D020, 0x00000002, 0x4062BA42, 0x4063D020, + // Block 421, offset 0x6940 + 0x00000002, 0x4062BA43, 0x4063D020, 0x00000002, 0x4062BA44, 0x4063D020, + 0x00000002, 0x4062BA45, 0x4063D020, 0x00000002, 0x4062BA46, 0x4063D020, + 0x00000002, 0x4062BA47, 0x4063D020, 0x00000002, 0x4062BA48, 0x4063D020, + 0x00000002, 0x4062BA49, 0x4063D020, 0x00000002, 0x4062BA4A, 0x4063D020, + 0x00000002, 0x4062BA4B, 0x4063D020, 0x00000002, 0x4062BA4C, 0x4063D020, + 0x00000002, 0x4062BA4D, 0x4063D020, 0x00000002, 0x4062BA4E, 0x4063D020, + 0x00000002, 0x4062BA4F, 0x4063D020, 0x00000002, 0x4062BA50, 0x4063D020, + 0x00000002, 0x4062BA51, 0x4063D020, 0x00000002, 0x4062BA52, 0x4063D020, + 0x00000002, 0x4062BA53, 0x4063D020, 0x00000002, 0x4062BA54, 0x4063D020, + 0x00000002, 0x4062BA55, 0x4063D020, 0x00000002, 0x4062BA56, 0x4063D020, + 0x00000002, 0x4062BA57, 0x4063D020, 0x00000002, + // Block 422, offset 0x6980 + 0x4062BA58, 0x4063D020, 0x00000002, 0x4062BA59, 0x4063D020, 0x00000002, + 0x4062BA5A, 0x4063D020, 0x00000002, 0x4062BA5B, 0x4063D020, 0x00000002, + 0x4062BA5C, 0x4063D020, 0x00000002, 0x4062BA5D, 0x4063D020, 0x00000002, + 0x4062BA5E, 0x4063D020, 0x00000002, 0x4062BA5F, 0x4063D020, 0x00000002, + 0x4062BA60, 0x4063D020, 0x00000002, 0x4062BA61, 0x4063D020, 0x00000002, + 0x4062BA62, 0x4063D020, 0x00000002, 0x4062BA63, 0x4063D020, 0x00000002, + 0x4062BA64, 0x4063D020, 0x00000002, 0x4062BA65, 0x4063D020, 0x00000002, + 0x4062BA66, 0x4063D020, 0x00000002, 0x4062BA67, 0x4063D020, 0x00000002, + 0x4062BA68, 0x4063D020, 0x00000002, 0x4062BA69, 0x4063D020, 0x00000002, + 0x4062BA6A, 0x4063D020, 0x00000002, 0x4062BA6B, 0x4063D020, 0x00000002, + 0x4062BA6C, 0x4063D020, 0x00000002, 0x4062BA6D, + // Block 423, offset 0x69c0 + 0x4063D020, 0x00000002, 0x4062BA6E, 0x4063D020, 0x00000002, 0x4062BA6F, + 0x4063D020, 0x00000002, 0x4062BA70, 0x4063D020, 0x00000002, 0x4062BA71, + 0x4063D020, 0x00000002, 0x4062BA72, 0x4063D020, 0x00000002, 0x4062BA73, + 0x4063D020, 0x00000002, 0x4062BA74, 0x4063D020, 0x00000002, 0x4062BA75, + 0x4063D020, 0x00000003, 0x4062BA21, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BA22, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BA23, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BA24, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BA25, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BA26, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BA27, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BA28, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BA29, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BA2A, 0x4063D020, + // Block 424, offset 0x6a00 + 0x40646A20, 0x00000003, 0x4062BA2B, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BA2C, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BA2D, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BA2E, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BA2F, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BA30, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BA31, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BA32, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BA33, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BA34, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BA35, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BA36, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BA37, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BA38, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BA39, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BA3A, 0x4063D020, + // Block 425, offset 0x6a40 + 0x40646A20, 0x00000003, 0x4062BA3B, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BA21, 0x4063D020, 0x40648C20, 0x00000003, 0x4062BA22, 0x4063D020, + 0x40648C20, 0x00000003, 0x4062BA23, 0x4063D020, 0x40648C20, 0x00000003, + 0x4062BA24, 0x4063D020, 0x40648C20, 0x00000003, 0x4062BA25, 0x4063D020, + 0x40648C20, 0x00000003, 0x4062BA26, 0x4063D020, 0x40648C20, 0x00000003, + 0x4062BA27, 0x4063D020, 0x40648C20, 0x00000003, 0x4062BA28, 0x4063D020, + 0x40648C20, 0x00000002, 0x4062BE21, 0x4063A820, 0x00000002, 0x4062BE22, + 0x4063A820, 0x00000002, 0x4062BE23, 0x4063A820, 0x00000002, 0x4062BE24, + 0x4063A820, 0x00000002, 0x4062BE25, 0x4063A820, 0x00000002, 0x4062BE26, + 0x4063A820, 0x00000002, 0x4062BE27, 0x4063A820, 0x00000002, 0x4062BE28, + 0x4063A820, 0x00000002, 0x4062BE29, 0x4063A820, + // Block 426, offset 0x6a80 + 0x00000002, 0x4062BE2A, 0x4063A820, 0x00000002, 0x4062BE2B, 0x4063A820, + 0x00000002, 0x4062BE2C, 0x4063A820, 0x00000002, 0x4062BE2D, 0x4063A820, + 0x00000002, 0x4062BE2E, 0x4063A820, 0x00000002, 0x4062BE2F, 0x4063A820, + 0x00000002, 0x4062BE30, 0x4063A820, 0x00000002, 0x4062BE31, 0x4063A820, + 0x00000002, 0x4062BE32, 0x4063A820, 0x00000002, 0x4062BE33, 0x4063A820, + 0x00000002, 0x4062BE34, 0x4063A820, 0x00000002, 0x4062BE35, 0x4063A820, + 0x00000002, 0x4062BE36, 0x4063A820, 0x00000002, 0x4062BE37, 0x4063A820, + 0x00000002, 0x4062BE38, 0x4063A820, 0x00000002, 0x4062BE39, 0x4063A820, + 0x00000002, 0x4062BE3A, 0x4063A820, 0x00000002, 0x4062BE3B, 0x4063A820, + 0x00000002, 0x4062BE3C, 0x4063A820, 0x00000002, 0x4062BE3D, 0x4063A820, + 0x00000002, 0x4062BE3E, 0x4063A820, 0x00000002, + // Block 427, offset 0x6ac0 + 0x4062BE3F, 0x4063A820, 0x00000002, 0x4062BE40, 0x4063A820, 0x00000002, + 0x4062BE41, 0x4063A820, 0x00000002, 0x4062BE42, 0x4063A820, 0x00000002, + 0x4062BE43, 0x4063A820, 0x00000002, 0x4062BE44, 0x4063A820, 0x00000002, + 0x4062BE45, 0x4063A820, 0x00000002, 0x4062BE46, 0x4063A820, 0x00000002, + 0x4062BE47, 0x4063A820, 0x00000002, 0x4062BE48, 0x4063A820, 0x00000002, + 0x4062BE49, 0x4063A820, 0x00000002, 0x4062BE4A, 0x4063A820, 0x00000002, + 0x4062BE4B, 0x4063A820, 0x00000002, 0x4062BE4C, 0x4063A820, 0x00000002, + 0x4062BE4D, 0x4063A820, 0x00000002, 0x4062BE4E, 0x4063A820, 0x00000002, + 0x4062BE4F, 0x4063A820, 0x00000002, 0x4062BE50, 0x4063A820, 0x00000002, + 0x4062BE51, 0x4063A820, 0x00000002, 0x4062BE52, 0x4063A820, 0x00000002, + 0x4062BE53, 0x4063A820, 0x00000002, 0x4062BE54, + // Block 428, offset 0x6b00 + 0x4063A820, 0x00000002, 0x4062BE55, 0x4063A820, 0x00000002, 0x4062BE56, + 0x4063A820, 0x00000002, 0x4062BE57, 0x4063A820, 0x00000002, 0x4062BE58, + 0x4063A820, 0x00000002, 0x4062BE59, 0x4063A820, 0x00000002, 0x4062BE5A, + 0x4063A820, 0x00000002, 0x4062BE5B, 0x4063A820, 0x00000002, 0x4062BE5C, + 0x4063A820, 0x00000002, 0x4062BE5D, 0x4063A820, 0x00000002, 0x4062BE5E, + 0x4063A820, 0x00000002, 0x4062BE5F, 0x4063A820, 0x00000002, 0x4062BE60, + 0x4063A820, 0x00000002, 0x4062BE61, 0x4063A820, 0x00000002, 0x4062BE62, + 0x4063A820, 0x00000002, 0x4062BE63, 0x4063A820, 0x00000002, 0x4062BE64, + 0x4063A820, 0x00000002, 0x4062BE65, 0x4063A820, 0x00000002, 0x4062BE66, + 0x4063A820, 0x00000002, 0x4062BE67, 0x4063A820, 0x00000002, 0x4062BE68, + 0x4063A820, 0x00000002, 0x4062BE69, 0x4063A820, + // Block 429, offset 0x6b40 + 0x00000002, 0x4062BE6A, 0x4063A820, 0x00000002, 0x4062BE6B, 0x4063A820, + 0x00000002, 0x4062BE6C, 0x4063A820, 0x00000002, 0x4062BE6D, 0x4063A820, + 0x00000002, 0x4062BE6E, 0x4063A820, 0x00000002, 0x4062BE6F, 0x4063A820, + 0x00000003, 0x4062BE21, 0x4063A820, 0x40646420, 0x00000003, 0x4062BE22, + 0x4063A820, 0x40646420, 0x00000003, 0x4062BE23, 0x4063A820, 0x40646420, + 0x00000003, 0x4062BE24, 0x4063A820, 0x40646420, 0x00000003, 0x4062BE25, + 0x4063A820, 0x40646420, 0x00000003, 0x4062BE26, 0x4063A820, 0x40646420, + 0x00000003, 0x4062BE21, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE22, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE23, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062BE24, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE25, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE26, + // Block 430, offset 0x6b80 + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE27, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062BE28, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE29, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE2A, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062BE2B, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE2C, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE2D, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062BE2E, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE2F, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE30, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062BE31, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE32, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE33, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062BE34, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE35, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE36, + // Block 431, offset 0x6bc0 + 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE37, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062BE38, 0x4063A820, 0x40646A20, 0x00000003, 0x4062BE21, + 0x4063A820, 0x40647220, 0x00000003, 0x4062BE22, 0x4063A820, 0x40647220, + 0x00000003, 0x4062BE23, 0x4063A820, 0x40647220, 0x00000003, 0x4062BE24, + 0x4063A820, 0x40647220, 0x00000003, 0x4062BE25, 0x4063A820, 0x40647220, + 0x00000003, 0x4062BE21, 0x4063A820, 0x40648220, 0x00000003, 0x4062BE22, + 0x4063A820, 0x40648220, 0x00000003, 0x4062BE23, 0x4063A820, 0x40648220, + 0x00000003, 0x4062BE24, 0x4063A820, 0x40648220, 0x00000003, 0x4062BE25, + 0x4063A820, 0x40648220, 0x00000003, 0x4062BE26, 0x4063A820, 0x40648220, + 0x00000003, 0x4062BE27, 0x4063A820, 0x40648220, 0x00000003, 0x4062BE28, + 0x4063A820, 0x40648220, 0x00000003, 0x4062BE29, + // Block 432, offset 0x6c00 + 0x4063A820, 0x40648220, 0x00000003, 0x4062BE2A, 0x4063A820, 0x40648220, + 0x00000003, 0x4062BE21, 0x4063A820, 0x40648420, 0x00000003, 0x4062BE22, + 0x4063A820, 0x40648420, 0x00000003, 0x4062BE23, 0x4063A820, 0x40648420, + 0x00000003, 0x4062BE24, 0x4063A820, 0x40648420, 0x00000003, 0x4062BE25, + 0x4063A820, 0x40648420, 0x00000003, 0x4062BE26, 0x4063A820, 0x40648420, + 0x00000003, 0x4062BE27, 0x4063A820, 0x40648420, 0x00000003, 0x4062BE28, + 0x4063A820, 0x40648420, 0x00000003, 0x4062BE29, 0x4063A820, 0x40648420, + 0x00000003, 0x4062BE2A, 0x4063A820, 0x40648420, 0x00000003, 0x4062BE2B, + 0x4063A820, 0x40648420, 0x00000003, 0x4062BE21, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BE22, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE23, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE24, + // Block 433, offset 0x6c40 + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE25, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BE26, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE27, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE28, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BE29, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE2A, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE2B, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BE2C, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE2D, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE2E, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BE2F, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE30, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE31, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BE32, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE33, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE34, + // Block 434, offset 0x6c80 + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE35, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BE36, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE37, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE38, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BE39, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE3A, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE3B, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BE3C, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE3D, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE3E, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BE3F, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE40, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE41, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BE42, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE43, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE44, + // Block 435, offset 0x6cc0 + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE45, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062BE46, 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE47, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062BE48, 0x4063A820, 0x40648C20, + 0x00000002, 0x4062BE21, 0x4063AA20, 0x00000002, 0x4062BE22, 0x4063AA20, + 0x00000002, 0x4062BE23, 0x4063AA20, 0x00000002, 0x4062BE24, 0x4063AA20, + 0x00000003, 0x4062BE21, 0x4063AA20, 0x40646420, 0x00000003, 0x4062BE22, + 0x4063AA20, 0x40646420, 0x00000003, 0x4062BE23, 0x4063AA20, 0x40646420, + 0x00000003, 0x4062BE24, 0x4063AA20, 0x40646420, 0x00000003, 0x4062BE25, + 0x4063AA20, 0x40646420, 0x00000003, 0x4062BE26, 0x4063AA20, 0x40646420, + 0x00000003, 0x4062BE27, 0x4063AA20, 0x40646420, 0x00000003, 0x4062BE21, + 0x4063AA20, 0x40648C20, 0x00000003, 0x4062BE22, + // Block 436, offset 0x6d00 + 0x4063AA20, 0x40648C20, 0x00000003, 0x4062BE23, 0x4063AA20, 0x40648C20, + 0x00000003, 0x4062BE24, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062BE25, + 0x4063AA20, 0x40648C20, 0x00000003, 0x4062BE26, 0x4063AA20, 0x40648C20, + 0x00000002, 0x4062BE21, 0x4063B020, 0x00000002, 0x4062BE22, 0x4063B020, + 0x00000002, 0x4062BE23, 0x4063B020, 0x00000002, 0x4062BE24, 0x4063B020, + 0x00000002, 0x4062BE25, 0x4063B020, 0x00000002, 0x4062BE26, 0x4063B020, + 0x00000002, 0x4062BE27, 0x4063B020, 0x00000002, 0x4062BE28, 0x4063B020, + 0x00000002, 0x4062BE29, 0x4063B020, 0x00000002, 0x4062BE2A, 0x4063B020, + 0x00000002, 0x4062BE2B, 0x4063B020, 0x00000002, 0x4062BE2C, 0x4063B020, + 0x00000002, 0x4062BE2D, 0x4063B020, 0x00000002, 0x4062BE2E, 0x4063B020, + 0x00000002, 0x4062BE2F, 0x4063B020, 0x00000002, + // Block 437, offset 0x6d40 + 0x4062BE30, 0x4063B020, 0x00000002, 0x4062BE31, 0x4063B020, 0x00000002, + 0x4062BE32, 0x4063B020, 0x00000002, 0x4062BE33, 0x4063B020, 0x00000002, + 0x4062BE34, 0x4063B020, 0x00000002, 0x4062BE35, 0x4063B020, 0x00000002, + 0x4062BE36, 0x4063B020, 0x00000002, 0x4062BE37, 0x4063B020, 0x00000002, + 0x4062BE38, 0x4063B020, 0x00000002, 0x4062BE39, 0x4063B020, 0x00000002, + 0x4062BE3A, 0x4063B020, 0x00000002, 0x4062BE3B, 0x4063B020, 0x00000002, + 0x4062BE3C, 0x4063B020, 0x00000002, 0x4062BE3D, 0x4063B020, 0x00000002, + 0x4062BE3E, 0x4063B020, 0x00000002, 0x4062BE3F, 0x4063B020, 0x00000002, + 0x4062BE40, 0x4063B020, 0x00000002, 0x4062BE41, 0x4063B020, 0x00000002, + 0x4062BE42, 0x4063B020, 0x00000002, 0x4062BE43, 0x4063B020, 0x00000002, + 0x4062BE44, 0x4063B020, 0x00000002, 0x4062BE45, + // Block 438, offset 0x6d80 + 0x4063B020, 0x00000002, 0x4062BE46, 0x4063B020, 0x00000002, 0x4062BE47, + 0x4063B020, 0x00000002, 0x4062BE48, 0x4063B020, 0x00000003, 0x4062BE21, + 0x4063B020, 0x40646420, 0x00000003, 0x4062BE22, 0x4063B020, 0x40646420, + 0x00000003, 0x4062BE23, 0x4063B020, 0x40646420, 0x00000003, 0x4062BE24, + 0x4063B020, 0x40646420, 0x00000003, 0x4062BE25, 0x4063B020, 0x40646420, + 0x00000003, 0x4062BE26, 0x4063B020, 0x40646420, 0x00000003, 0x4062BE27, + 0x4063B020, 0x40646420, 0x00000003, 0x4062BE28, 0x4063B020, 0x40646420, + 0x00000003, 0x4062BE29, 0x4063B020, 0x40646420, 0x00000003, 0x4062BE2A, + 0x4063B020, 0x40646420, 0x00000003, 0x4062BE2B, 0x4063B020, 0x40646420, + 0x00000003, 0x4062BE2C, 0x4063B020, 0x40646420, 0x00000003, 0x4062BE2D, + 0x4063B020, 0x40646420, 0x00000003, 0x4062BE2E, + // Block 439, offset 0x6dc0 + 0x4063B020, 0x40646420, 0x00000003, 0x4062BE2F, 0x4063B020, 0x40646420, + 0x00000003, 0x4062BE30, 0x4063B020, 0x40646420, 0x00000003, 0x4062BE31, + 0x4063B020, 0x40646420, 0x00000003, 0x4062BE32, 0x4063B020, 0x40646420, + 0x00000003, 0x4062BE33, 0x4063B020, 0x40646420, 0x00000003, 0x4062BE34, + 0x4063B020, 0x40646420, 0x00000003, 0x4062BE35, 0x4063B020, 0x40646420, + 0x00000003, 0x4062BE36, 0x4063B020, 0x40646420, 0x00000003, 0x4062BE21, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE22, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BE23, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE24, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE25, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BE26, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE27, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE28, + // Block 440, offset 0x6e00 + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE29, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BE2A, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE2B, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE2C, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BE2D, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE2E, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE2F, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BE30, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE31, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE32, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BE33, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE34, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE35, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BE36, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE37, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE38, + // Block 441, offset 0x6e40 + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE39, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BE3A, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE3B, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE3C, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BE3D, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE3E, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE3F, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BE40, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE41, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE42, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BE43, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE44, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE45, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BE46, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE47, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE48, + // Block 442, offset 0x6e80 + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE49, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BE4A, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE4B, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE4C, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BE4D, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE4E, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE4F, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062BE50, 0x4063B020, 0x40646A20, 0x00000003, 0x4062BE21, + 0x4063B020, 0x40647220, 0x00000003, 0x4062BE22, 0x4063B020, 0x40647220, + 0x00000003, 0x4062BE23, 0x4063B020, 0x40647220, 0x00000003, 0x4062BE24, + 0x4063B020, 0x40647220, 0x00000003, 0x4062BE25, 0x4063B020, 0x40647220, + 0x00000003, 0x4062BE26, 0x4063B020, 0x40647220, 0x00000003, 0x4062BE27, + 0x4063B020, 0x40647220, 0x00000003, 0x4062BE28, + // Block 443, offset 0x6ec0 + 0x4063B020, 0x40647220, 0x00000003, 0x4062BE29, 0x4063B020, 0x40647220, + 0x00000003, 0x4062BE2A, 0x4063B020, 0x40647220, 0x00000003, 0x4062BE2B, + 0x4063B020, 0x40647220, 0x00000003, 0x4062BE2C, 0x4063B020, 0x40647220, + 0x00000003, 0x4062BE2D, 0x4063B020, 0x40647220, 0x00000003, 0x4062BE2E, + 0x4063B020, 0x40647220, 0x00000003, 0x4062BE2F, 0x4063B020, 0x40647220, + 0x00000003, 0x4062BE30, 0x4063B020, 0x40647220, 0x00000003, 0x4062BE31, + 0x4063B020, 0x40647220, 0x00000003, 0x4062BE32, 0x4063B020, 0x40647220, + 0x00000003, 0x4062BE33, 0x4063B020, 0x40647220, 0x00000003, 0x4062BE34, + 0x4063B020, 0x40647220, 0x00000003, 0x4062BE35, 0x4063B020, 0x40647220, + 0x00000003, 0x4062BE21, 0x4063B020, 0x40648220, 0x00000003, 0x4062BE22, + 0x4063B020, 0x40648220, 0x00000003, 0x4062BE23, + // Block 444, offset 0x6f00 + 0x4063B020, 0x40648220, 0x00000003, 0x4062BE24, 0x4063B020, 0x40648220, + 0x00000003, 0x4062BE25, 0x4063B020, 0x40648220, 0x00000003, 0x4062BE26, + 0x4063B020, 0x40648220, 0x00000003, 0x4062BE27, 0x4063B020, 0x40648220, + 0x00000003, 0x4062BE28, 0x4063B020, 0x40648220, 0x00000003, 0x4062BE29, + 0x4063B020, 0x40648220, 0x00000003, 0x4062BE2A, 0x4063B020, 0x40648220, + 0x00000003, 0x4062BE2B, 0x4063B020, 0x40648220, 0x00000003, 0x4062BE2C, + 0x4063B020, 0x40648220, 0x00000003, 0x4062BE2D, 0x4063B020, 0x40648220, + 0x00000003, 0x4062BE2E, 0x4063B020, 0x40648220, 0x00000003, 0x4062BE2F, + 0x4063B020, 0x40648220, 0x00000003, 0x4062BE21, 0x4063B020, 0x40648420, + 0x00000003, 0x4062BE22, 0x4063B020, 0x40648420, 0x00000003, 0x4062BE23, + 0x4063B020, 0x40648420, 0x00000003, 0x4062BE24, + // Block 445, offset 0x6f40 + 0x4063B020, 0x40648420, 0x00000003, 0x4062BE25, 0x4063B020, 0x40648420, + 0x00000003, 0x4062BE26, 0x4063B020, 0x40648420, 0x00000003, 0x4062BE27, + 0x4063B020, 0x40648420, 0x00000003, 0x4062BE28, 0x4063B020, 0x40648420, + 0x00000003, 0x4062BE29, 0x4063B020, 0x40648420, 0x00000003, 0x4062BE2A, + 0x4063B020, 0x40648420, 0x00000003, 0x4062BE21, 0x4063B020, 0x40648C20, + 0x00000003, 0x4062BE22, 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE23, + 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE24, 0x4063B020, 0x40648C20, + 0x00000003, 0x4062BE25, 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE26, + 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE27, 0x4063B020, 0x40648C20, + 0x00000003, 0x4062BE28, 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE29, + 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE2A, + // Block 446, offset 0x6f80 + 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE2B, 0x4063B020, 0x40648C20, + 0x00000003, 0x4062BE2C, 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE2D, + 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE2E, 0x4063B020, 0x40648C20, + 0x00000003, 0x4062BE2F, 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE30, + 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE31, 0x4063B020, 0x40648C20, + 0x00000003, 0x4062BE32, 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE33, + 0x4063B020, 0x40648C20, 0x00000003, 0x4062BE34, 0x4063B020, 0x40648C20, + 0x00000002, 0x4062BE21, 0x4063B220, 0x00000002, 0x4062BE22, 0x4063B220, + 0x00000002, 0x4062BE23, 0x4063B220, 0x00000002, 0x4062BE24, 0x4063B220, + 0x00000002, 0x4062BE25, 0x4063B220, 0x00000002, 0x4062BE26, 0x4063B220, + 0x00000002, 0x4062BE27, 0x4063B220, 0x00000002, + // Block 447, offset 0x6fc0 + 0x4062BE28, 0x4063B220, 0x00000002, 0x4062BE29, 0x4063B220, 0x00000002, + 0x4062BE2A, 0x4063B220, 0x00000002, 0x4062BE2B, 0x4063B220, 0x00000002, + 0x4062BE2C, 0x4063B220, 0x00000002, 0x4062BE21, 0x4063B820, 0x00000002, + 0x4062BE22, 0x4063B820, 0x00000002, 0x4062BE23, 0x4063B820, 0x00000002, + 0x4062BE24, 0x4063B820, 0x00000002, 0x4062BE25, 0x4063B820, 0x00000002, + 0x4062BE26, 0x4063B820, 0x00000002, 0x4062BE27, 0x4063B820, 0x00000002, + 0x4062BE28, 0x4063B820, 0x00000002, 0x4062BE29, 0x4063B820, 0x00000002, + 0x4062BE2A, 0x4063B820, 0x00000002, 0x4062BE2B, 0x4063B820, 0x00000002, + 0x4062BE2C, 0x4063B820, 0x00000002, 0x4062BE2D, 0x4063B820, 0x00000002, + 0x4062BE2E, 0x4063B820, 0x00000002, 0x4062BE2F, 0x4063B820, 0x00000002, + 0x4062BE30, 0x4063B820, 0x00000002, 0x4062BE31, + // Block 448, offset 0x7000 + 0x4063B820, 0x00000002, 0x4062BE32, 0x4063B820, 0x00000002, 0x4062BE33, + 0x4063B820, 0x00000002, 0x4062BE34, 0x4063B820, 0x00000002, 0x4062BE35, + 0x4063B820, 0x00000002, 0x4062BE36, 0x4063B820, 0x00000002, 0x4062BE37, + 0x4063B820, 0x00000002, 0x4062BE38, 0x4063B820, 0x00000002, 0x4062BE39, + 0x4063B820, 0x00000002, 0x4062BE3A, 0x4063B820, 0x00000002, 0x4062BE3B, + 0x4063B820, 0x00000002, 0x4062BE3C, 0x4063B820, 0x00000002, 0x4062BE3D, + 0x4063B820, 0x00000002, 0x4062BE3E, 0x4063B820, 0x00000002, 0x4062BE3F, + 0x4063B820, 0x00000002, 0x4062BE40, 0x4063B820, 0x00000002, 0x4062BE41, + 0x4063B820, 0x00000002, 0x4062BE42, 0x4063B820, 0x00000002, 0x4062BE43, + 0x4063B820, 0x00000002, 0x4062BE44, 0x4063B820, 0x00000002, 0x4062BE45, + 0x4063B820, 0x00000002, 0x4062BE46, 0x4063B820, + // Block 449, offset 0x7040 + 0x00000002, 0x4062BE47, 0x4063B820, 0x00000002, 0x4062BE48, 0x4063B820, + 0x00000002, 0x4062BE49, 0x4063B820, 0x00000002, 0x4062BE4A, 0x4063B820, + 0x00000002, 0x4062BE4B, 0x4063B820, 0x00000002, 0x4062BE4C, 0x4063B820, + 0x00000002, 0x4062BE4D, 0x4063B820, 0x00000002, 0x4062BE4E, 0x4063B820, + 0x00000002, 0x4062BE4F, 0x4063B820, 0x00000002, 0x4062BE50, 0x4063B820, + 0x00000002, 0x4062BE51, 0x4063B820, 0x00000002, 0x4062BE52, 0x4063B820, + 0x00000002, 0x4062BE53, 0x4063B820, 0x00000002, 0x4062BE54, 0x4063B820, + 0x00000002, 0x4062BE55, 0x4063B820, 0x00000002, 0x4062BE56, 0x4063B820, + 0x00000002, 0x4062BE57, 0x4063B820, 0x00000002, 0x4062BE58, 0x4063B820, + 0x00000002, 0x4062BE59, 0x4063B820, 0x00000002, 0x4062BE5A, 0x4063B820, + 0x00000002, 0x4062BE5B, 0x4063B820, 0x00000002, + // Block 450, offset 0x7080 + 0x4062BE5C, 0x4063B820, 0x00000003, 0x4062BE21, 0x4063B820, 0x40646420, + 0x00000003, 0x4062BE22, 0x4063B820, 0x40646420, 0x00000003, 0x4062BE23, + 0x4063B820, 0x40646420, 0x00000003, 0x4062BE24, 0x4063B820, 0x40646420, + 0x00000003, 0x4062BE25, 0x4063B820, 0x40646420, 0x00000003, 0x4062BE26, + 0x4063B820, 0x40646420, 0x00000003, 0x4062BE27, 0x4063B820, 0x40646420, + 0x00000003, 0x4062BE28, 0x4063B820, 0x40646420, 0x00000003, 0x4062BE29, + 0x4063B820, 0x40646420, 0x00000003, 0x4062BE2A, 0x4063B820, 0x40646420, + 0x00000003, 0x4062BE2B, 0x4063B820, 0x40646420, 0x00000003, 0x4062BE21, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062BE22, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062BE23, 0x4063B820, 0x40646A20, 0x00000003, 0x4062BE24, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062BE25, + // Block 451, offset 0x70c0 + 0x4063B820, 0x40646A20, 0x00000003, 0x4062BE26, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062BE27, 0x4063B820, 0x40646A20, 0x00000003, 0x4062BE28, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062BE21, 0x4063B820, 0x40647220, + 0x00000003, 0x4062BE22, 0x4063B820, 0x40647220, 0x00000003, 0x4062BE23, + 0x4063B820, 0x40647220, 0x00000003, 0x4062BE21, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062BE22, 0x4063B820, 0x40648C20, 0x00000003, 0x4062BE23, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062BE24, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062BE25, 0x4063B820, 0x40648C20, 0x00000003, 0x4062BE26, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062BE27, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062BE28, 0x4063B820, 0x40648C20, 0x00000003, 0x4062BE29, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062BE2A, + // Block 452, offset 0x7100 + 0x4063B820, 0x40648C20, 0x00000003, 0x4062BE2B, 0x4063B820, 0x40648C20, + 0x00000002, 0x4062BE21, 0x4063BC20, 0x00000002, 0x4062BE22, 0x4063BC20, + 0x00000002, 0x4062BE23, 0x4063BC20, 0x00000002, 0x4062BE24, 0x4063BC20, + 0x00000002, 0x4062BE25, 0x4063BC20, 0x00000002, 0x4062BE26, 0x4063BC20, + 0x00000002, 0x4062BE27, 0x4063BC20, 0x00000002, 0x4062BE21, 0x4063BE20, + 0x00000002, 0x4062BE22, 0x4063BE20, 0x00000002, 0x4062BE21, 0x4063C220, + 0x00000002, 0x4062BE22, 0x4063C220, 0x00000002, 0x4062BE23, 0x4063C220, + 0x00000002, 0x4062BE24, 0x4063C220, 0x00000002, 0x4062BE25, 0x4063C220, + 0x00000002, 0x4062BE26, 0x4063C220, 0x00000002, 0x4062BE27, 0x4063C220, + 0x00000002, 0x4062BE28, 0x4063C220, 0x00000002, 0x4062BE29, 0x4063C220, + 0x00000002, 0x4062BE2A, 0x4063C220, 0x00000002, + // Block 453, offset 0x7140 + 0x4062BE2B, 0x4063C220, 0x00000002, 0x4062BE2C, 0x4063C220, 0x00000002, + 0x4062BE2D, 0x4063C220, 0x00000002, 0x4062BE2E, 0x4063C220, 0x00000002, + 0x4062BE2F, 0x4063C220, 0x00000002, 0x4062BE30, 0x4063C220, 0x00000002, + 0x4062BE31, 0x4063C220, 0x00000002, 0x4062BE32, 0x4063C220, 0x00000002, + 0x4062BE33, 0x4063C220, 0x00000002, 0x4062BE34, 0x4063C220, 0x00000002, + 0x4062BE35, 0x4063C220, 0x00000002, 0x4062BE36, 0x4063C220, 0x00000002, + 0x4062BE37, 0x4063C220, 0x00000002, 0x4062BE38, 0x4063C220, 0x00000002, + 0x4062BE39, 0x4063C220, 0x00000002, 0x4062BE3A, 0x4063C220, 0x00000002, + 0x4062BE3B, 0x4063C220, 0x00000002, 0x4062BE3C, 0x4063C220, 0x00000002, + 0x4062BE3D, 0x4063C220, 0x00000002, 0x4062BE3E, 0x4063C220, 0x00000002, + 0x4062BE3F, 0x4063C220, 0x00000002, 0x4062BE40, + // Block 454, offset 0x7180 + 0x4063C220, 0x00000002, 0x4062BE41, 0x4063C220, 0x00000002, 0x4062BE42, + 0x4063C220, 0x00000002, 0x4062BE43, 0x4063C220, 0x00000002, 0x4062BE44, + 0x4063C220, 0x00000002, 0x4062BE45, 0x4063C220, 0x00000002, 0x4062BE46, + 0x4063C220, 0x00000002, 0x4062BE47, 0x4063C220, 0x00000002, 0x4062BE48, + 0x4063C220, 0x00000002, 0x4062BE49, 0x4063C220, 0x00000002, 0x4062BE4A, + 0x4063C220, 0x00000002, 0x4062BE4B, 0x4063C220, 0x00000002, 0x4062BE4C, + 0x4063C220, 0x00000002, 0x4062BE4D, 0x4063C220, 0x00000002, 0x4062BE4E, + 0x4063C220, 0x00000002, 0x4062BE4F, 0x4063C220, 0x00000002, 0x4062BE50, + 0x4063C220, 0x00000002, 0x4062BE51, 0x4063C220, 0x00000002, 0x4062BE52, + 0x4063C220, 0x00000002, 0x4062BE53, 0x4063C220, 0x00000002, 0x4062BE54, + 0x4063C220, 0x00000002, 0x4062BE55, 0x4063C220, + // Block 455, offset 0x71c0 + 0x00000002, 0x4062BE56, 0x4063C220, 0x00000002, 0x4062BE57, 0x4063C220, + 0x00000002, 0x4062BE58, 0x4063C220, 0x00000002, 0x4062BE59, 0x4063C220, + 0x00000002, 0x4062BE5A, 0x4063C220, 0x00000002, 0x4062BE5B, 0x4063C220, + 0x00000002, 0x4062BE5C, 0x4063C220, 0x00000002, 0x4062BE5D, 0x4063C220, + 0x00000002, 0x4062BE5E, 0x4063C220, 0x00000002, 0x4062BE5F, 0x4063C220, + 0x00000002, 0x4062BE60, 0x4063C220, 0x00000002, 0x4062BE61, 0x4063C220, + 0x00000002, 0x4062BE62, 0x4063C220, 0x00000002, 0x4062BE63, 0x4063C220, + 0x00000002, 0x4062BE64, 0x4063C220, 0x00000002, 0x4062BE65, 0x4063C220, + 0x00000002, 0x4062BE66, 0x4063C220, 0x00000002, 0x4062BE67, 0x4063C220, + 0x00000002, 0x4062BE68, 0x4063C220, 0x00000002, 0x4062BE69, 0x4063C220, + 0x00000002, 0x4062BE6A, 0x4063C220, 0x00000002, + // Block 456, offset 0x7200 + 0x4062BE6B, 0x4063C220, 0x00000002, 0x4062BE6C, 0x4063C220, 0x00000002, + 0x4062BE6D, 0x4063C220, 0x00000002, 0x4062BE6E, 0x4063C220, 0x00000002, + 0x4062BE6F, 0x4063C220, 0x00000002, 0x4062BE70, 0x4063C220, 0x00000002, + 0x4062BE71, 0x4063C220, 0x00000002, 0x4062BE72, 0x4063C220, 0x00000003, + 0x4062BE21, 0x4063C220, 0x40646420, 0x00000003, 0x4062BE22, 0x4063C220, + 0x40646420, 0x00000003, 0x4062BE23, 0x4063C220, 0x40646420, 0x00000003, + 0x4062BE24, 0x4063C220, 0x40646420, 0x00000003, 0x4062BE25, 0x4063C220, + 0x40646420, 0x00000003, 0x4062BE26, 0x4063C220, 0x40646420, 0x00000003, + 0x4062BE27, 0x4063C220, 0x40646420, 0x00000003, 0x4062BE28, 0x4063C220, + 0x40646420, 0x00000003, 0x4062BE29, 0x4063C220, 0x40646420, 0x00000003, + 0x4062BE2A, 0x4063C220, 0x40646420, 0x00000003, + // Block 457, offset 0x7240 + 0x4062BE2B, 0x4063C220, 0x40646420, 0x00000003, 0x4062BE2C, 0x4063C220, + 0x40646420, 0x00000003, 0x4062BE2D, 0x4063C220, 0x40646420, 0x00000003, + 0x4062BE2E, 0x4063C220, 0x40646420, 0x00000003, 0x4062BE2F, 0x4063C220, + 0x40646420, 0x00000003, 0x4062BE30, 0x4063C220, 0x40646420, 0x00000003, + 0x4062BE31, 0x4063C220, 0x40646420, 0x00000003, 0x4062BE32, 0x4063C220, + 0x40646420, 0x00000003, 0x4062BE33, 0x4063C220, 0x40646420, 0x00000003, + 0x4062BE21, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE22, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062BE23, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062BE24, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE25, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062BE26, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062BE27, 0x4063C220, 0x40646A20, 0x00000003, + // Block 458, offset 0x7280 + 0x4062BE28, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE29, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062BE2A, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062BE2B, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE2C, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062BE2D, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062BE2E, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE2F, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062BE30, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062BE31, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE32, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062BE33, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062BE34, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE35, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062BE36, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062BE37, 0x4063C220, 0x40646A20, 0x00000003, + // Block 459, offset 0x72c0 + 0x4062BE38, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE39, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062BE3A, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062BE3B, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE3C, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062BE3D, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062BE3E, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE3F, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062BE40, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062BE41, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE42, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062BE43, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062BE44, 0x4063C220, 0x40646A20, 0x00000003, 0x4062BE21, 0x4063C220, + 0x40647220, 0x00000003, 0x4062BE22, 0x4063C220, 0x40647220, 0x00000003, + 0x4062BE23, 0x4063C220, 0x40647220, 0x00000003, + // Block 460, offset 0x7300 + 0x4062BE24, 0x4063C220, 0x40647220, 0x00000003, 0x4062BE25, 0x4063C220, + 0x40647220, 0x00000003, 0x4062BE21, 0x4063C220, 0x40648C20, 0x00000003, + 0x4062BE22, 0x4063C220, 0x40648C20, 0x00000003, 0x4062BE23, 0x4063C220, + 0x40648C20, 0x00000003, 0x4062BE24, 0x4063C220, 0x40648C20, 0x00000002, + 0x4062BE21, 0x4063C820, 0x00000002, 0x4062BE22, 0x4063C820, 0x00000002, + 0x4062BE23, 0x4063C820, 0x00000003, 0x4062BE21, 0x4063CC20, 0x40647220, + 0x00000003, 0x4062BE22, 0x4063CC20, 0x40647220, 0x00000003, 0x4062BE23, + 0x4063CC20, 0x40647220, 0x00000003, 0x4062BE24, 0x4063CC20, 0x40647220, + 0x00000003, 0x4062BE21, 0x4063CC20, 0x40648420, 0x00000003, 0x4062BE22, + 0x4063CC20, 0x40648420, 0x00000003, 0x4062BE23, 0x4063CC20, 0x40648420, + 0x00000003, 0x4062BE24, 0x4063CC20, 0x40648420, + // Block 461, offset 0x7340 + 0x00000003, 0x4062BE25, 0x4063CC20, 0x40648420, 0x00000003, 0x4062BE26, + 0x4063CC20, 0x40648420, 0x00000003, 0x4062BE27, 0x4063CC20, 0x40648420, + 0x00000003, 0x4062BE28, 0x4063CC20, 0x40648420, 0x00000003, 0x4062BE21, + 0x4063CC20, 0x40648C20, 0x00000003, 0x4062BE22, 0x4063CC20, 0x40648C20, + 0x00000003, 0x4062BE23, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062BE24, + 0x4063CC20, 0x40648C20, 0x00000003, 0x4062BE25, 0x4063CC20, 0x40648C20, + 0x00000003, 0x4062BE26, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062BE27, + 0x4063CC20, 0x40648C20, 0x00000003, 0x4062BE28, 0x4063CC20, 0x40648C20, + 0x00000003, 0x4062BE29, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062BE2A, + 0x4063CC20, 0x40648C20, 0x00000003, 0x4062BE2B, 0x4063CC20, 0x40648C20, + 0x00000003, 0x4062BE2C, 0x4063CC20, 0x40648C20, + // Block 462, offset 0x7380 + 0x00000002, 0x4062BE21, 0x4063D020, 0x00000002, 0x4062BE22, 0x4063D020, + 0x00000002, 0x4062BE23, 0x4063D020, 0x00000002, 0x4062BE24, 0x4063D020, + 0x00000002, 0x4062BE25, 0x4063D020, 0x00000002, 0x4062BE26, 0x4063D020, + 0x00000002, 0x4062BE27, 0x4063D020, 0x00000002, 0x4062BE28, 0x4063D020, + 0x00000002, 0x4062BE29, 0x4063D020, 0x00000002, 0x4062BE2A, 0x4063D020, + 0x00000002, 0x4062BE2B, 0x4063D020, 0x00000002, 0x4062BE2C, 0x4063D020, + 0x00000002, 0x4062BE2D, 0x4063D020, 0x00000002, 0x4062BE2E, 0x4063D020, + 0x00000002, 0x4062BE2F, 0x4063D020, 0x00000002, 0x4062BE30, 0x4063D020, + 0x00000002, 0x4062BE31, 0x4063D020, 0x00000002, 0x4062BE32, 0x4063D020, + 0x00000002, 0x4062BE33, 0x4063D020, 0x00000002, 0x4062BE34, 0x4063D020, + 0x00000002, 0x4062BE35, 0x4063D020, 0x00000002, + // Block 463, offset 0x73c0 + 0x4062BE36, 0x4063D020, 0x00000002, 0x4062BE37, 0x4063D020, 0x00000002, + 0x4062BE38, 0x4063D020, 0x00000002, 0x4062BE39, 0x4063D020, 0x00000002, + 0x4062BE3A, 0x4063D020, 0x00000002, 0x4062BE3B, 0x4063D020, 0x00000002, + 0x4062BE3C, 0x4063D020, 0x00000002, 0x4062BE3D, 0x4063D020, 0x00000002, + 0x4062BE3E, 0x4063D020, 0x00000002, 0x4062BE3F, 0x4063D020, 0x00000002, + 0x4062BE40, 0x4063D020, 0x00000002, 0x4062BE41, 0x4063D020, 0x00000002, + 0x4062BE42, 0x4063D020, 0x00000002, 0x4062BE43, 0x4063D020, 0x00000002, + 0x4062BE44, 0x4063D020, 0x00000002, 0x4062BE45, 0x4063D020, 0x00000002, + 0x4062BE46, 0x4063D020, 0x00000002, 0x4062BE47, 0x4063D020, 0x00000002, + 0x4062BE48, 0x4063D020, 0x00000002, 0x4062BE49, 0x4063D020, 0x00000002, + 0x4062BE4A, 0x4063D020, 0x00000002, 0x4062BE4B, + // Block 464, offset 0x7400 + 0x4063D020, 0x00000002, 0x4062BE4C, 0x4063D020, 0x00000002, 0x4062BE4D, + 0x4063D020, 0x00000003, 0x4062BE21, 0x4063D020, 0x40646420, 0x00000003, + 0x4062BE22, 0x4063D020, 0x40646420, 0x00000003, 0x4062BE23, 0x4063D020, + 0x40646420, 0x00000003, 0x4062BE24, 0x4063D020, 0x40646420, 0x00000003, + 0x4062BE25, 0x4063D020, 0x40646420, 0x00000003, 0x4062BE26, 0x4063D020, + 0x40646420, 0x00000003, 0x4062BE27, 0x4063D020, 0x40646420, 0x00000003, + 0x4062BE28, 0x4063D020, 0x40646420, 0x00000003, 0x4062BE29, 0x4063D020, + 0x40646420, 0x00000003, 0x4062BE2A, 0x4063D020, 0x40646420, 0x00000003, + 0x4062BE2B, 0x4063D020, 0x40646420, 0x00000003, 0x4062BE2C, 0x4063D020, + 0x40646420, 0x00000003, 0x4062BE2D, 0x4063D020, 0x40646420, 0x00000003, + 0x4062BE2E, 0x4063D020, 0x40646420, 0x00000003, + // Block 465, offset 0x7440 + 0x4062BE2F, 0x4063D020, 0x40646420, 0x00000003, 0x4062BE30, 0x4063D020, + 0x40646420, 0x00000003, 0x4062BE31, 0x4063D020, 0x40646420, 0x00000003, + 0x4062BE32, 0x4063D020, 0x40646420, 0x00000003, 0x4062BE21, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BE22, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BE23, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE24, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BE25, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BE26, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE27, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BE28, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BE29, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE2A, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BE2B, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BE2C, 0x4063D020, 0x40646A20, 0x00000003, + // Block 466, offset 0x7480 + 0x4062BE2D, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE2E, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BE2F, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BE30, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE31, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BE32, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BE33, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE34, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BE35, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BE36, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE37, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BE38, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BE39, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE3A, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BE3B, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BE3C, 0x4063D020, 0x40646A20, 0x00000003, + // Block 467, offset 0x74c0 + 0x4062BE3D, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE3E, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BE3F, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062BE40, 0x4063D020, 0x40646A20, 0x00000003, 0x4062BE41, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062BE21, 0x4063D020, 0x40647220, 0x00000003, + 0x4062BE22, 0x4063D020, 0x40647220, 0x00000003, 0x4062BE23, 0x4063D020, + 0x40647220, 0x00000003, 0x4062BE24, 0x4063D020, 0x40647220, 0x00000003, + 0x4062BE25, 0x4063D020, 0x40647220, 0x00000003, 0x4062BE26, 0x4063D020, + 0x40647220, 0x00000003, 0x4062BE21, 0x4063D020, 0x40648220, 0x00000003, + 0x4062BE22, 0x4063D020, 0x40648220, 0x00000003, 0x4062BE23, 0x4063D020, + 0x40648220, 0x00000003, 0x4062BE24, 0x4063D020, 0x40648220, 0x00000003, + 0x4062BE25, 0x4063D020, 0x40648220, 0x00000003, + // Block 468, offset 0x7500 + 0x4062BE26, 0x4063D020, 0x40648220, 0x00000003, 0x4062BE27, 0x4063D020, + 0x40648220, 0x00000003, 0x4062BE28, 0x4063D020, 0x40648220, 0x00000003, + 0x4062BE29, 0x4063D020, 0x40648220, 0x00000003, 0x4062BE2A, 0x4063D020, + 0x40648220, 0x00000003, 0x4062BE2B, 0x4063D020, 0x40648220, 0x00000003, + 0x4062BE2C, 0x4063D020, 0x40648220, 0x00000003, 0x4062BE2D, 0x4063D020, + 0x40648220, 0x00000003, 0x4062BE2E, 0x4063D020, 0x40648220, 0x00000003, + 0x4062BE2F, 0x4063D020, 0x40648220, 0x00000003, 0x4062BE21, 0x4063D020, + 0x40648420, 0x00000003, 0x4062BE22, 0x4063D020, 0x40648420, 0x00000003, + 0x4062BE23, 0x4063D020, 0x40648420, 0x00000003, 0x4062C021, 0x4063A820, + 0x40648C20, 0x00000002, 0x4062C021, 0x4063D020, 0x00000002, 0x4062C221, + 0x4063A820, 0x00000002, 0x4062C222, 0x4063A820, + // Block 469, offset 0x7540 + 0x00000002, 0x4062C223, 0x4063A820, 0x00000002, 0x4062C224, 0x4063A820, + 0x00000002, 0x4062C225, 0x4063A820, 0x00000002, 0x4062C226, 0x4063A820, + 0x00000002, 0x4062C227, 0x4063A820, 0x00000002, 0x4062C228, 0x4063A820, + 0x00000002, 0x4062C229, 0x4063A820, 0x00000002, 0x4062C22A, 0x4063A820, + 0x00000002, 0x4062C22B, 0x4063A820, 0x00000002, 0x4062C22C, 0x4063A820, + 0x00000002, 0x4062C22D, 0x4063A820, 0x00000002, 0x4062C22E, 0x4063A820, + 0x00000002, 0x4062C22F, 0x4063A820, 0x00000002, 0x4062C230, 0x4063A820, + 0x00000002, 0x4062C231, 0x4063A820, 0x00000002, 0x4062C232, 0x4063A820, + 0x00000002, 0x4062C233, 0x4063A820, 0x00000002, 0x4062C234, 0x4063A820, + 0x00000002, 0x4062C235, 0x4063A820, 0x00000002, 0x4062C236, 0x4063A820, + 0x00000002, 0x4062C237, 0x4063A820, 0x00000002, + // Block 470, offset 0x7580 + 0x4062C238, 0x4063A820, 0x00000002, 0x4062C239, 0x4063A820, 0x00000002, + 0x4062C23A, 0x4063A820, 0x00000002, 0x4062C23B, 0x4063A820, 0x00000002, + 0x4062C23C, 0x4063A820, 0x00000002, 0x4062C23D, 0x4063A820, 0x00000003, + 0x4062C221, 0x4063A820, 0x40646420, 0x00000003, 0x4062C222, 0x4063A820, + 0x40646420, 0x00000003, 0x4062C223, 0x4063A820, 0x40646420, 0x00000003, + 0x4062C224, 0x4063A820, 0x40646420, 0x00000003, 0x4062C225, 0x4063A820, + 0x40646420, 0x00000003, 0x4062C226, 0x4063A820, 0x40646420, 0x00000003, + 0x4062C227, 0x4063A820, 0x40646420, 0x00000003, 0x4062C228, 0x4063A820, + 0x40646420, 0x00000003, 0x4062C229, 0x4063A820, 0x40646420, 0x00000003, + 0x4062C22A, 0x4063A820, 0x40646420, 0x00000003, 0x4062C22B, 0x4063A820, + 0x40646420, 0x00000003, 0x4062C22C, 0x4063A820, + // Block 471, offset 0x75c0 + 0x40646420, 0x00000003, 0x4062C22D, 0x4063A820, 0x40646420, 0x00000003, + 0x4062C22E, 0x4063A820, 0x40646420, 0x00000003, 0x4062C22F, 0x4063A820, + 0x40646420, 0x00000003, 0x4062C230, 0x4063A820, 0x40646420, 0x00000003, + 0x4062C231, 0x4063A820, 0x40646420, 0x00000003, 0x4062C232, 0x4063A820, + 0x40646420, 0x00000003, 0x4062C233, 0x4063A820, 0x40646420, 0x00000003, + 0x4062C234, 0x4063A820, 0x40646420, 0x00000003, 0x4062C235, 0x4063A820, + 0x40646420, 0x00000003, 0x4062C236, 0x4063A820, 0x40646420, 0x00000003, + 0x4062C237, 0x4063A820, 0x40646420, 0x00000003, 0x4062C238, 0x4063A820, + 0x40646420, 0x00000003, 0x4062C239, 0x4063A820, 0x40646420, 0x00000003, + 0x4062C221, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C222, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062C223, 0x4063A820, + // Block 472, offset 0x7600 + 0x40646A20, 0x00000003, 0x4062C224, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062C225, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C226, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062C227, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062C228, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C229, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062C22A, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062C22B, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C22C, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062C22D, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062C22E, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C221, 0x4063A820, + 0x40647220, 0x00000003, 0x4062C222, 0x4063A820, 0x40647220, 0x00000003, + 0x4062C223, 0x4063A820, 0x40647220, 0x00000003, 0x4062C224, 0x4063A820, + 0x40647220, 0x00000003, 0x4062C225, 0x4063A820, + // Block 473, offset 0x7640 + 0x40647220, 0x00000003, 0x4062C226, 0x4063A820, 0x40647220, 0x00000003, + 0x4062C227, 0x4063A820, 0x40647220, 0x00000003, 0x4062C228, 0x4063A820, + 0x40647220, 0x00000003, 0x4062C229, 0x4063A820, 0x40647220, 0x00000003, + 0x4062C22A, 0x4063A820, 0x40647220, 0x00000003, 0x4062C22B, 0x4063A820, + 0x40647220, 0x00000003, 0x4062C22C, 0x4063A820, 0x40647220, 0x00000003, + 0x4062C221, 0x4063A820, 0x40648220, 0x00000003, 0x4062C222, 0x4063A820, + 0x40648220, 0x00000003, 0x4062C223, 0x4063A820, 0x40648220, 0x00000003, + 0x4062C224, 0x4063A820, 0x40648220, 0x00000003, 0x4062C225, 0x4063A820, + 0x40648220, 0x00000003, 0x4062C226, 0x4063A820, 0x40648220, 0x00000003, + 0x4062C227, 0x4063A820, 0x40648220, 0x00000003, 0x4062C228, 0x4063A820, + 0x40648220, 0x00000003, 0x4062C229, 0x4063A820, + // Block 474, offset 0x7680 + 0x40648220, 0x00000003, 0x4062C22A, 0x4063A820, 0x40648220, 0x00000003, + 0x4062C22B, 0x4063A820, 0x40648220, 0x00000003, 0x4062C22C, 0x4063A820, + 0x40648220, 0x00000003, 0x4062C22D, 0x4063A820, 0x40648220, 0x00000003, + 0x4062C22E, 0x4063A820, 0x40648220, 0x00000003, 0x4062C22F, 0x4063A820, + 0x40648220, 0x00000003, 0x4062C230, 0x4063A820, 0x40648220, 0x00000003, + 0x4062C231, 0x4063A820, 0x40648220, 0x00000003, 0x4062C232, 0x4063A820, + 0x40648220, 0x00000003, 0x4062C233, 0x4063A820, 0x40648220, 0x00000003, + 0x4062C221, 0x4063A820, 0x40648420, 0x00000003, 0x4062C222, 0x4063A820, + 0x40648420, 0x00000003, 0x4062C223, 0x4063A820, 0x40648420, 0x00000003, + 0x4062C224, 0x4063A820, 0x40648420, 0x00000003, 0x4062C221, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062C222, 0x4063A820, + // Block 475, offset 0x76c0 + 0x40648C20, 0x00000003, 0x4062C223, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062C224, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C225, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062C226, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062C227, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C228, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062C229, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062C22A, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C22B, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062C22C, 0x4063A820, 0x40648C20, 0x00000002, + 0x4062C221, 0x4063AA20, 0x00000002, 0x4062C222, 0x4063AA20, 0x00000002, + 0x4062C223, 0x4063AA20, 0x00000002, 0x4062C224, 0x4063AA20, 0x00000002, + 0x4062C225, 0x4063AA20, 0x00000002, 0x4062C226, 0x4063AA20, 0x00000002, + 0x4062C227, 0x4063AA20, 0x00000002, 0x4062C228, + // Block 476, offset 0x7700 + 0x4063AA20, 0x00000002, 0x4062C229, 0x4063AA20, 0x00000002, 0x4062C22A, + 0x4063AA20, 0x00000002, 0x4062C22B, 0x4063AA20, 0x00000002, 0x4062C22C, + 0x4063AA20, 0x00000002, 0x4062C22D, 0x4063AA20, 0x00000002, 0x4062C22E, + 0x4063AA20, 0x00000002, 0x4062C22F, 0x4063AA20, 0x00000002, 0x4062C230, + 0x4063AA20, 0x00000002, 0x4062C231, 0x4063AA20, 0x00000002, 0x4062C232, + 0x4063AA20, 0x00000002, 0x4062C233, 0x4063AA20, 0x00000002, 0x4062C234, + 0x4063AA20, 0x00000002, 0x4062C235, 0x4063AA20, 0x00000002, 0x4062C236, + 0x4063AA20, 0x00000002, 0x4062C237, 0x4063AA20, 0x00000002, 0x4062C238, + 0x4063AA20, 0x00000002, 0x4062C239, 0x4063AA20, 0x00000002, 0x4062C23A, + 0x4063AA20, 0x00000002, 0x4062C23B, 0x4063AA20, 0x00000002, 0x4062C23C, + 0x4063AA20, 0x00000002, 0x4062C23D, 0x4063AA20, + // Block 477, offset 0x7740 + 0x00000002, 0x4062C23E, 0x4063AA20, 0x00000002, 0x4062C23F, 0x4063AA20, + 0x00000003, 0x4062C221, 0x4063AA20, 0x40646420, 0x00000003, 0x4062C222, + 0x4063AA20, 0x40646420, 0x00000003, 0x4062C223, 0x4063AA20, 0x40646420, + 0x00000003, 0x4062C224, 0x4063AA20, 0x40646420, 0x00000003, 0x4062C225, + 0x4063AA20, 0x40646420, 0x00000003, 0x4062C226, 0x4063AA20, 0x40646420, + 0x00000003, 0x4062C227, 0x4063AA20, 0x40646420, 0x00000003, 0x4062C228, + 0x4063AA20, 0x40646420, 0x00000003, 0x4062C229, 0x4063AA20, 0x40646420, + 0x00000003, 0x4062C22A, 0x4063AA20, 0x40646420, 0x00000003, 0x4062C22B, + 0x4063AA20, 0x40646420, 0x00000003, 0x4062C221, 0x4063AA20, 0x40648C20, + 0x00000003, 0x4062C222, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062C223, + 0x4063AA20, 0x40648C20, 0x00000003, 0x4062C224, + // Block 478, offset 0x7780 + 0x4063AA20, 0x40648C20, 0x00000003, 0x4062C225, 0x4063AA20, 0x40648C20, + 0x00000003, 0x4062C226, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062C227, + 0x4063AA20, 0x40648C20, 0x00000003, 0x4062C228, 0x4063AA20, 0x40648C20, + 0x00000002, 0x4062C221, 0x4063AC20, 0x00000002, 0x4062C222, 0x4063AC20, + 0x00000002, 0x4062C223, 0x4063AC20, 0x00000002, 0x4062C224, 0x4063AC20, + 0x00000002, 0x4062C225, 0x4063AC20, 0x00000002, 0x4062C226, 0x4063AC20, + 0x00000002, 0x4062C227, 0x4063AC20, 0x00000002, 0x4062C228, 0x4063AC20, + 0x00000002, 0x4062C229, 0x4063AC20, 0x00000002, 0x4062C22A, 0x4063AC20, + 0x00000002, 0x4062C22B, 0x4063AC20, 0x00000003, 0x4062C221, 0x4063AC20, + 0x40646420, 0x00000003, 0x4062C222, 0x4063AC20, 0x40646420, 0x00000003, + 0x4062C223, 0x4063AC20, 0x40646420, 0x00000003, + // Block 479, offset 0x77c0 + 0x4062C224, 0x4063AC20, 0x40646420, 0x00000003, 0x4062C225, 0x4063AC20, + 0x40646420, 0x00000003, 0x4062C226, 0x4063AC20, 0x40646420, 0x00000003, + 0x4062C227, 0x4063AC20, 0x40646420, 0x00000003, 0x4062C228, 0x4063AC20, + 0x40646420, 0x00000003, 0x4062C229, 0x4063AC20, 0x40646420, 0x00000003, + 0x4062C22A, 0x4063AC20, 0x40646420, 0x00000003, 0x4062C22B, 0x4063AC20, + 0x40646420, 0x00000003, 0x4062C22C, 0x4063AC20, 0x40646420, 0x00000003, + 0x4062C22D, 0x4063AC20, 0x40646420, 0x00000003, 0x4062C22E, 0x4063AC20, + 0x40646420, 0x00000003, 0x4062C22F, 0x4063AC20, 0x40646420, 0x00000003, + 0x4062C221, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C222, 0x4063AC20, + 0x40648C20, 0x00000003, 0x4062C223, 0x4063AC20, 0x40648C20, 0x00000003, + 0x4062C224, 0x4063AC20, 0x40648C20, 0x00000003, + // Block 480, offset 0x7800 + 0x4062C225, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C226, 0x4063AC20, + 0x40648C20, 0x00000003, 0x4062C227, 0x4063AC20, 0x40648C20, 0x00000003, + 0x4062C228, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C229, 0x4063AC20, + 0x40648C20, 0x00000003, 0x4062C22A, 0x4063AC20, 0x40648C20, 0x00000003, + 0x4062C22B, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C22C, 0x4063AC20, + 0x40648C20, 0x00000003, 0x4062C22D, 0x4063AC20, 0x40648C20, 0x00000003, + 0x4062C22E, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C22F, 0x4063AC20, + 0x40648C20, 0x00000003, 0x4062C230, 0x4063AC20, 0x40648C20, 0x00000003, + 0x4062C231, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C232, 0x4063AC20, + 0x40648C20, 0x00000003, 0x4062C233, 0x4063AC20, 0x40648C20, 0x00000003, + 0x4062C234, 0x4063AC20, 0x40648C20, 0x00000003, + // Block 481, offset 0x7840 + 0x4062C235, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C236, 0x4063AC20, + 0x40648C20, 0x00000003, 0x4062C237, 0x4063AC20, 0x40648C20, 0x00000003, + 0x4062C238, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C239, 0x4063AC20, + 0x40648C20, 0x00000003, 0x4062C23A, 0x4063AC20, 0x40648C20, 0x00000003, + 0x4062C23B, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C23C, 0x4063AC20, + 0x40648C20, 0x00000003, 0x4062C23D, 0x4063AC20, 0x40648C20, 0x00000003, + 0x4062C23E, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C23F, 0x4063AC20, + 0x40648C20, 0x00000003, 0x4062C240, 0x4063AC20, 0x40648C20, 0x00000003, + 0x4062C241, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062C242, 0x4063AC20, + 0x40648C20, 0x00000002, 0x4062C221, 0x4063B020, 0x00000002, 0x4062C222, + 0x4063B020, 0x00000002, 0x4062C223, 0x4063B020, + // Block 482, offset 0x7880 + 0x00000002, 0x4062C224, 0x4063B020, 0x00000002, 0x4062C225, 0x4063B020, + 0x00000002, 0x4062C226, 0x4063B020, 0x00000002, 0x4062C227, 0x4063B020, + 0x00000002, 0x4062C228, 0x4063B020, 0x00000002, 0x4062C229, 0x4063B020, + 0x00000002, 0x4062C22A, 0x4063B020, 0x00000002, 0x4062C22B, 0x4063B020, + 0x00000002, 0x4062C22C, 0x4063B020, 0x00000002, 0x4062C22D, 0x4063B020, + 0x00000002, 0x4062C22E, 0x4063B020, 0x00000003, 0x4062C221, 0x4063B020, + 0x40646420, 0x00000003, 0x4062C222, 0x4063B020, 0x40646420, 0x00000003, + 0x4062C223, 0x4063B020, 0x40646420, 0x00000003, 0x4062C224, 0x4063B020, + 0x40646420, 0x00000003, 0x4062C225, 0x4063B020, 0x40646420, 0x00000003, + 0x4062C226, 0x4063B020, 0x40646420, 0x00000003, 0x4062C221, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C222, 0x4063B020, + // Block 483, offset 0x78c0 + 0x40646A20, 0x00000003, 0x4062C223, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C224, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C225, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C226, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C227, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C228, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C229, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C22A, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C22B, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C22C, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C22D, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C221, 0x4063B020, + 0x40647220, 0x00000003, 0x4062C222, 0x4063B020, 0x40647220, 0x00000003, + 0x4062C223, 0x4063B020, 0x40647220, 0x00000003, 0x4062C221, 0x4063B020, + 0x40648220, 0x00000003, 0x4062C222, 0x4063B020, + // Block 484, offset 0x7900 + 0x40648220, 0x00000003, 0x4062C223, 0x4063B020, 0x40648220, 0x00000003, + 0x4062C224, 0x4063B020, 0x40648220, 0x00000003, 0x4062C225, 0x4063B020, + 0x40648220, 0x00000003, 0x4062C226, 0x4063B020, 0x40648220, 0x00000003, + 0x4062C227, 0x4063B020, 0x40648220, 0x00000003, 0x4062C228, 0x4063B020, + 0x40648220, 0x00000003, 0x4062C229, 0x4063B020, 0x40648220, 0x00000003, + 0x4062C22A, 0x4063B020, 0x40648220, 0x00000003, 0x4062C22B, 0x4063B020, + 0x40648220, 0x00000003, 0x4062C22C, 0x4063B020, 0x40648220, 0x00000003, + 0x4062C221, 0x4063B020, 0x40648420, 0x00000003, 0x4062C222, 0x4063B020, + 0x40648420, 0x00000003, 0x4062C223, 0x4063B020, 0x40648420, 0x00000003, + 0x4062C224, 0x4063B020, 0x40648420, 0x00000002, 0x4062C221, 0x4063B220, + 0x00000002, 0x4062C222, 0x4063B220, 0x00000003, + // Block 485, offset 0x7940 + 0x4062C221, 0x4063B220, 0x40646A20, 0x00000002, 0x4062C221, 0x4063B420, + 0x00000002, 0x4062C222, 0x4063B420, 0x00000002, 0x4062C223, 0x4063B420, + 0x00000002, 0x4062C224, 0x4063B420, 0x00000002, 0x4062C225, 0x4063B420, + 0x00000002, 0x4062C226, 0x4063B420, 0x00000002, 0x4062C227, 0x4063B420, + 0x00000002, 0x4062C228, 0x4063B420, 0x00000002, 0x4062C229, 0x4063B420, + 0x00000002, 0x4062C22A, 0x4063B420, 0x00000002, 0x4062C22B, 0x4063B420, + 0x00000002, 0x4062C22C, 0x4063B420, 0x00000002, 0x4062C22D, 0x4063B420, + 0x00000002, 0x4062C22E, 0x4063B420, 0x00000003, 0x4062C221, 0x4063B420, + 0x40646420, 0x00000003, 0x4062C222, 0x4063B420, 0x40646420, 0x00000003, + 0x4062C223, 0x4063B420, 0x40646420, 0x00000003, 0x4062C224, 0x4063B420, + 0x40646420, 0x00000003, 0x4062C225, 0x4063B420, + // Block 486, offset 0x7980 + 0x40646420, 0x00000003, 0x4062C226, 0x4063B420, 0x40646420, 0x00000003, + 0x4062C227, 0x4063B420, 0x40646420, 0x00000003, 0x4062C228, 0x4063B420, + 0x40646420, 0x00000003, 0x4062C229, 0x4063B420, 0x40646420, 0x00000003, + 0x4062C22A, 0x4063B420, 0x40646420, 0x00000003, 0x4062C22B, 0x4063B420, + 0x40646420, 0x00000003, 0x4062C22C, 0x4063B420, 0x40646420, 0x00000003, + 0x4062C22D, 0x4063B420, 0x40646420, 0x00000003, 0x4062C221, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062C222, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062C223, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C224, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062C225, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062C226, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C227, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062C228, 0x4063B420, + // Block 487, offset 0x79c0 + 0x40646A20, 0x00000003, 0x4062C229, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062C22A, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C22B, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062C22C, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062C22D, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C22E, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062C22F, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062C230, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C231, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062C232, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062C233, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C234, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062C235, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062C236, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C237, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062C238, 0x4063B420, + // Block 488, offset 0x7a00 + 0x40646A20, 0x00000003, 0x4062C239, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062C23A, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C23B, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062C23C, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062C23D, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C23E, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062C23F, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062C240, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C241, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062C242, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062C243, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C244, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062C245, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062C246, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C247, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062C248, 0x4063B420, + // Block 489, offset 0x7a40 + 0x40646A20, 0x00000003, 0x4062C249, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062C24A, 0x4063B420, 0x40646A20, 0x00000003, 0x4062C24B, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062C24C, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062C221, 0x4063B420, 0x40647220, 0x00000003, 0x4062C222, 0x4063B420, + 0x40647220, 0x00000003, 0x4062C223, 0x4063B420, 0x40647220, 0x00000003, + 0x4062C224, 0x4063B420, 0x40647220, 0x00000003, 0x4062C225, 0x4063B420, + 0x40647220, 0x00000003, 0x4062C221, 0x4063B420, 0x40648220, 0x00000003, + 0x4062C222, 0x4063B420, 0x40648220, 0x00000003, 0x4062C223, 0x4063B420, + 0x40648220, 0x00000003, 0x4062C224, 0x4063B420, 0x40648220, 0x00000003, + 0x4062C225, 0x4063B420, 0x40648220, 0x00000003, 0x4062C226, 0x4063B420, + 0x40648220, 0x00000003, 0x4062C227, 0x4063B420, + // Block 490, offset 0x7a80 + 0x40648220, 0x00000003, 0x4062C228, 0x4063B420, 0x40648220, 0x00000003, + 0x4062C229, 0x4063B420, 0x40648220, 0x00000003, 0x4062C22A, 0x4063B420, + 0x40648220, 0x00000003, 0x4062C22B, 0x4063B420, 0x40648220, 0x00000003, + 0x4062C22C, 0x4063B420, 0x40648220, 0x00000003, 0x4062C22D, 0x4063B420, + 0x40648220, 0x00000003, 0x4062C22E, 0x4063B420, 0x40648220, 0x00000003, + 0x4062C22F, 0x4063B420, 0x40648220, 0x00000003, 0x4062C230, 0x4063B420, + 0x40648220, 0x00000003, 0x4062C231, 0x4063B420, 0x40648220, 0x00000003, + 0x4062C232, 0x4063B420, 0x40648220, 0x00000003, 0x4062C233, 0x4063B420, + 0x40648220, 0x00000003, 0x4062C234, 0x4063B420, 0x40648220, 0x00000003, + 0x4062C235, 0x4063B420, 0x40648220, 0x00000003, 0x4062C236, 0x4063B420, + 0x40648220, 0x00000003, 0x4062C221, 0x4063B420, + // Block 491, offset 0x7ac0 + 0x40648420, 0x00000003, 0x4062C222, 0x4063B420, 0x40648420, 0x00000003, + 0x4062C223, 0x4063B420, 0x40648420, 0x00000003, 0x4062C224, 0x4063B420, + 0x40648420, 0x00000003, 0x4062C225, 0x4063B420, 0x40648420, 0x00000003, + 0x4062C226, 0x4063B420, 0x40648420, 0x00000003, 0x4062C227, 0x4063B420, + 0x40648420, 0x00000003, 0x4062C221, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062C222, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C223, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062C224, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062C225, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C226, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062C227, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062C228, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C229, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062C22A, 0x4063B420, + // Block 492, offset 0x7b00 + 0x40648C20, 0x00000003, 0x4062C22B, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062C22C, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C22D, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062C22E, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062C22F, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C230, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062C231, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062C232, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C233, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062C234, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062C235, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C236, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062C237, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062C238, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C239, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062C23A, 0x4063B420, + // Block 493, offset 0x7b40 + 0x40648C20, 0x00000003, 0x4062C23B, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062C23C, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C23D, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062C23E, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062C23F, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C240, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062C241, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062C242, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C243, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062C244, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062C245, 0x4063B420, 0x40648C20, 0x00000003, 0x4062C246, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062C247, 0x4063B420, 0x40648C20, 0x00000002, + 0x4062C221, 0x4063B620, 0x00000002, 0x4062C222, 0x4063B620, 0x00000002, + 0x4062C223, 0x4063B620, 0x00000002, 0x4062C224, + // Block 494, offset 0x7b80 + 0x4063B620, 0x00000002, 0x4062C225, 0x4063B620, 0x00000002, 0x4062C226, + 0x4063B620, 0x00000002, 0x4062C227, 0x4063B620, 0x00000002, 0x4062C228, + 0x4063B620, 0x00000002, 0x4062C229, 0x4063B620, 0x00000002, 0x4062C22A, + 0x4063B620, 0x00000002, 0x4062C22B, 0x4063B620, 0x00000002, 0x4062C22C, + 0x4063B620, 0x00000002, 0x4062C22D, 0x4063B620, 0x00000002, 0x4062C22E, + 0x4063B620, 0x00000002, 0x4062C22F, 0x4063B620, 0x00000002, 0x4062C230, + 0x4063B620, 0x00000002, 0x4062C231, 0x4063B620, 0x00000002, 0x4062C232, + 0x4063B620, 0x00000002, 0x4062C233, 0x4063B620, 0x00000002, 0x4062C234, + 0x4063B620, 0x00000002, 0x4062C235, 0x4063B620, 0x00000002, 0x4062C236, + 0x4063B620, 0x00000002, 0x4062C237, 0x4063B620, 0x00000002, 0x4062C238, + 0x4063B620, 0x00000002, 0x4062C239, 0x4063B620, + // Block 495, offset 0x7bc0 + 0x00000002, 0x4062C23A, 0x4063B620, 0x00000002, 0x4062C23B, 0x4063B620, + 0x00000002, 0x4062C23C, 0x4063B620, 0x00000002, 0x4062C23D, 0x4063B620, + 0x00000002, 0x4062C23E, 0x4063B620, 0x00000002, 0x4062C23F, 0x4063B620, + 0x00000002, 0x4062C240, 0x4063B620, 0x00000002, 0x4062C241, 0x4063B620, + 0x00000002, 0x4062C242, 0x4063B620, 0x00000002, 0x4062C243, 0x4063B620, + 0x00000002, 0x4062C244, 0x4063B620, 0x00000002, 0x4062C245, 0x4063B620, + 0x00000002, 0x4062C246, 0x4063B620, 0x00000002, 0x4062C247, 0x4063B620, + 0x00000002, 0x4062C221, 0x4063B820, 0x00000002, 0x4062C222, 0x4063B820, + 0x00000002, 0x4062C223, 0x4063B820, 0x00000002, 0x4062C224, 0x4063B820, + 0x00000002, 0x4062C225, 0x4063B820, 0x00000002, 0x4062C226, 0x4063B820, + 0x00000002, 0x4062C227, 0x4063B820, 0x00000002, + // Block 496, offset 0x7c00 + 0x4062C228, 0x4063B820, 0x00000002, 0x4062C229, 0x4063B820, 0x00000002, + 0x4062C22A, 0x4063B820, 0x00000002, 0x4062C22B, 0x4063B820, 0x00000002, + 0x4062C22C, 0x4063B820, 0x00000002, 0x4062C22D, 0x4063B820, 0x00000002, + 0x4062C22E, 0x4063B820, 0x00000002, 0x4062C22F, 0x4063B820, 0x00000002, + 0x4062C230, 0x4063B820, 0x00000002, 0x4062C231, 0x4063B820, 0x00000002, + 0x4062C232, 0x4063B820, 0x00000002, 0x4062C233, 0x4063B820, 0x00000002, + 0x4062C234, 0x4063B820, 0x00000002, 0x4062C235, 0x4063B820, 0x00000002, + 0x4062C236, 0x4063B820, 0x00000002, 0x4062C237, 0x4063B820, 0x00000002, + 0x4062C238, 0x4063B820, 0x00000002, 0x4062C239, 0x4063B820, 0x00000002, + 0x4062C23A, 0x4063B820, 0x00000002, 0x4062C23B, 0x4063B820, 0x00000002, + 0x4062C23C, 0x4063B820, 0x00000002, 0x4062C23D, + // Block 497, offset 0x7c40 + 0x4063B820, 0x00000002, 0x4062C23E, 0x4063B820, 0x00000002, 0x4062C23F, + 0x4063B820, 0x00000002, 0x4062C240, 0x4063B820, 0x00000002, 0x4062C241, + 0x4063B820, 0x00000002, 0x4062C242, 0x4063B820, 0x00000002, 0x4062C243, + 0x4063B820, 0x00000002, 0x4062C244, 0x4063B820, 0x00000002, 0x4062C245, + 0x4063B820, 0x00000002, 0x4062C246, 0x4063B820, 0x00000002, 0x4062C247, + 0x4063B820, 0x00000002, 0x4062C248, 0x4063B820, 0x00000002, 0x4062C249, + 0x4063B820, 0x00000002, 0x4062C24A, 0x4063B820, 0x00000002, 0x4062C24B, + 0x4063B820, 0x00000002, 0x4062C24C, 0x4063B820, 0x00000002, 0x4062C24D, + 0x4063B820, 0x00000002, 0x4062C24E, 0x4063B820, 0x00000002, 0x4062C24F, + 0x4063B820, 0x00000002, 0x4062C250, 0x4063B820, 0x00000002, 0x4062C251, + 0x4063B820, 0x00000002, 0x4062C252, 0x4063B820, + // Block 498, offset 0x7c80 + 0x00000002, 0x4062C253, 0x4063B820, 0x00000002, 0x4062C254, 0x4063B820, + 0x00000002, 0x4062C255, 0x4063B820, 0x00000002, 0x4062C256, 0x4063B820, + 0x00000003, 0x4062C221, 0x4063B820, 0x40646420, 0x00000003, 0x4062C222, + 0x4063B820, 0x40646420, 0x00000003, 0x4062C223, 0x4063B820, 0x40646420, + 0x00000003, 0x4062C224, 0x4063B820, 0x40646420, 0x00000003, 0x4062C225, + 0x4063B820, 0x40646420, 0x00000003, 0x4062C221, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062C222, 0x4063B820, 0x40646A20, 0x00000003, 0x4062C223, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062C224, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062C225, 0x4063B820, 0x40646A20, 0x00000003, 0x4062C226, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062C227, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062C228, 0x4063B820, 0x40646A20, + // Block 499, offset 0x7cc0 + 0x00000003, 0x4062C229, 0x4063B820, 0x40646A20, 0x00000003, 0x4062C22A, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062C22B, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062C22C, 0x4063B820, 0x40646A20, 0x00000003, 0x4062C22D, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062C22E, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062C22F, 0x4063B820, 0x40646A20, 0x00000003, 0x4062C230, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062C231, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062C221, 0x4063B820, 0x40647220, 0x00000003, 0x4062C222, + 0x4063B820, 0x40647220, 0x00000003, 0x4062C223, 0x4063B820, 0x40647220, + 0x00000003, 0x4062C221, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C222, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062C223, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062C224, 0x4063B820, 0x40648C20, + // Block 500, offset 0x7d00 + 0x00000003, 0x4062C225, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C226, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062C227, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062C228, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C229, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062C22A, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062C22B, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C22C, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062C22D, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062C22E, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C22F, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062C230, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062C231, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C232, + 0x4063B820, 0x40648C20, 0x00000002, 0x4062C221, 0x4063BA20, 0x00000002, + 0x4062C222, 0x4063BA20, 0x00000002, 0x4062C223, + // Block 501, offset 0x7d40 + 0x4063BA20, 0x00000002, 0x4062C224, 0x4063BA20, 0x00000002, 0x4062C225, + 0x4063BA20, 0x00000002, 0x4062C226, 0x4063BA20, 0x00000002, 0x4062C227, + 0x4063BA20, 0x00000002, 0x4062C228, 0x4063BA20, 0x00000002, 0x4062C229, + 0x4063BA20, 0x00000002, 0x4062C22A, 0x4063BA20, 0x00000002, 0x4062C22B, + 0x4063BA20, 0x00000002, 0x4062C22C, 0x4063BA20, 0x00000002, 0x4062C22D, + 0x4063BA20, 0x00000002, 0x4062C22E, 0x4063BA20, 0x00000002, 0x4062C22F, + 0x4063BA20, 0x00000002, 0x4062C230, 0x4063BA20, 0x00000002, 0x4062C231, + 0x4063BA20, 0x00000003, 0x4062C221, 0x4063BA20, 0x40646A20, 0x00000003, + 0x4062C222, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062C223, 0x4063BA20, + 0x40646A20, 0x00000003, 0x4062C224, 0x4063BA20, 0x40646A20, 0x00000003, + 0x4062C225, 0x4063BA20, 0x40646A20, 0x00000003, + // Block 502, offset 0x7d80 + 0x4062C226, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062C227, 0x4063BA20, + 0x40646A20, 0x00000003, 0x4062C228, 0x4063BA20, 0x40646A20, 0x00000003, + 0x4062C229, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062C22A, 0x4063BA20, + 0x40646A20, 0x00000003, 0x4062C22B, 0x4063BA20, 0x40646A20, 0x00000003, + 0x4062C22C, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062C22D, 0x4063BA20, + 0x40646A20, 0x00000003, 0x4062C22E, 0x4063BA20, 0x40646A20, 0x00000003, + 0x4062C22F, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062C230, 0x4063BA20, + 0x40646A20, 0x00000003, 0x4062C231, 0x4063BA20, 0x40646A20, 0x00000003, + 0x4062C232, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062C233, 0x4063BA20, + 0x40646A20, 0x00000003, 0x4062C234, 0x4063BA20, 0x40646A20, 0x00000003, + 0x4062C235, 0x4063BA20, 0x40646A20, 0x00000003, + // Block 503, offset 0x7dc0 + 0x4062C236, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062C237, 0x4063BA20, + 0x40646A20, 0x00000003, 0x4062C238, 0x4063BA20, 0x40646A20, 0x00000003, + 0x4062C239, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062C23A, 0x4063BA20, + 0x40646A20, 0x00000003, 0x4062C221, 0x4063BA20, 0x40647220, 0x00000003, + 0x4062C221, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062C222, 0x4063BA20, + 0x40648C20, 0x00000003, 0x4062C223, 0x4063BA20, 0x40648C20, 0x00000003, + 0x4062C224, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062C225, 0x4063BA20, + 0x40648C20, 0x00000003, 0x4062C226, 0x4063BA20, 0x40648C20, 0x00000003, + 0x4062C227, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062C228, 0x4063BA20, + 0x40648C20, 0x00000002, 0x4062C221, 0x4063BC20, 0x00000002, 0x4062C222, + 0x4063BC20, 0x00000002, 0x4062C223, 0x4063BC20, + // Block 504, offset 0x7e00 + 0x00000002, 0x4062C224, 0x4063BC20, 0x00000002, 0x4062C225, 0x4063BC20, + 0x00000002, 0x4062C221, 0x4063BE20, 0x00000002, 0x4062C222, 0x4063BE20, + 0x00000002, 0x4062C223, 0x4063BE20, 0x00000002, 0x4062C224, 0x4063BE20, + 0x00000002, 0x4062C225, 0x4063BE20, 0x00000002, 0x4062C226, 0x4063BE20, + 0x00000002, 0x4062C227, 0x4063BE20, 0x00000002, 0x4062C228, 0x4063BE20, + 0x00000002, 0x4062C229, 0x4063BE20, 0x00000002, 0x4062C22A, 0x4063BE20, + 0x00000002, 0x4062C22B, 0x4063BE20, 0x00000002, 0x4062C22C, 0x4063BE20, + 0x00000002, 0x4062C22D, 0x4063BE20, 0x00000002, 0x4062C22E, 0x4063BE20, + 0x00000002, 0x4062C221, 0x4063C020, 0x00000002, 0x4062C222, 0x4063C020, + 0x00000002, 0x4062C223, 0x4063C020, 0x00000002, 0x4062C224, 0x4063C020, + 0x00000002, 0x4062C225, 0x4063C020, 0x00000002, + // Block 505, offset 0x7e40 + 0x4062C226, 0x4063C020, 0x00000002, 0x4062C227, 0x4063C020, 0x00000002, + 0x4062C228, 0x4063C020, 0x00000002, 0x4062C229, 0x4063C020, 0x00000002, + 0x4062C22A, 0x4063C020, 0x00000002, 0x4062C22B, 0x4063C020, 0x00000002, + 0x4062C22C, 0x4063C020, 0x00000002, 0x4062C22D, 0x4063C020, 0x00000002, + 0x4062C22E, 0x4063C020, 0x00000002, 0x4062C22F, 0x4063C020, 0x00000002, + 0x4062C230, 0x4063C020, 0x00000002, 0x4062C231, 0x4063C020, 0x00000002, + 0x4062C232, 0x4063C020, 0x00000002, 0x4062C233, 0x4063C020, 0x00000002, + 0x4062C234, 0x4063C020, 0x00000002, 0x4062C235, 0x4063C020, 0x00000002, + 0x4062C236, 0x4063C020, 0x00000002, 0x4062C237, 0x4063C020, 0x00000002, + 0x4062C238, 0x4063C020, 0x00000002, 0x4062C239, 0x4063C020, 0x00000002, + 0x4062C23A, 0x4063C020, 0x00000002, 0x4062C23B, + // Block 506, offset 0x7e80 + 0x4063C020, 0x00000002, 0x4062C23C, 0x4063C020, 0x00000002, 0x4062C23D, + 0x4063C020, 0x00000002, 0x4062C23E, 0x4063C020, 0x00000002, 0x4062C23F, + 0x4063C020, 0x00000002, 0x4062C240, 0x4063C020, 0x00000002, 0x4062C241, + 0x4063C020, 0x00000002, 0x4062C242, 0x4063C020, 0x00000002, 0x4062C243, + 0x4063C020, 0x00000002, 0x4062C244, 0x4063C020, 0x00000002, 0x4062C245, + 0x4063C020, 0x00000002, 0x4062C246, 0x4063C020, 0x00000002, 0x4062C247, + 0x4063C020, 0x00000002, 0x4062C248, 0x4063C020, 0x00000002, 0x4062C249, + 0x4063C020, 0x00000002, 0x4062C24A, 0x4063C020, 0x00000002, 0x4062C24B, + 0x4063C020, 0x00000002, 0x4062C24C, 0x4063C020, 0x00000003, 0x4062C221, + 0x4063C020, 0x40646420, 0x00000003, 0x4062C222, 0x4063C020, 0x40646420, + 0x00000003, 0x4062C223, 0x4063C020, 0x40646420, + // Block 507, offset 0x7ec0 + 0x00000003, 0x4062C224, 0x4063C020, 0x40646420, 0x00000003, 0x4062C225, + 0x4063C020, 0x40646420, 0x00000003, 0x4062C226, 0x4063C020, 0x40646420, + 0x00000003, 0x4062C227, 0x4063C020, 0x40646420, 0x00000003, 0x4062C228, + 0x4063C020, 0x40646420, 0x00000003, 0x4062C221, 0x4063C020, 0x40648C20, + 0x00000003, 0x4062C222, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C223, + 0x4063C020, 0x40648C20, 0x00000003, 0x4062C224, 0x4063C020, 0x40648C20, + 0x00000003, 0x4062C225, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C226, + 0x4063C020, 0x40648C20, 0x00000003, 0x4062C227, 0x4063C020, 0x40648C20, + 0x00000003, 0x4062C228, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C229, + 0x4063C020, 0x40648C20, 0x00000003, 0x4062C22A, 0x4063C020, 0x40648C20, + 0x00000003, 0x4062C22B, 0x4063C020, 0x40648C20, + // Block 508, offset 0x7f00 + 0x00000003, 0x4062C22C, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C22D, + 0x4063C020, 0x40648C20, 0x00000003, 0x4062C22E, 0x4063C020, 0x40648C20, + 0x00000003, 0x4062C22F, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C230, + 0x4063C020, 0x40648C20, 0x00000003, 0x4062C231, 0x4063C020, 0x40648C20, + 0x00000003, 0x4062C232, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C233, + 0x4063C020, 0x40648C20, 0x00000003, 0x4062C234, 0x4063C020, 0x40648C20, + 0x00000003, 0x4062C235, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C236, + 0x4063C020, 0x40648C20, 0x00000003, 0x4062C237, 0x4063C020, 0x40648C20, + 0x00000003, 0x4062C238, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C239, + 0x4063C020, 0x40648C20, 0x00000003, 0x4062C23A, 0x4063C020, 0x40648C20, + 0x00000003, 0x4062C23B, 0x4063C020, 0x40648C20, + // Block 509, offset 0x7f40 + 0x00000003, 0x4062C23C, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C23D, + 0x4063C020, 0x40648C20, 0x00000003, 0x4062C23E, 0x4063C020, 0x40648C20, + 0x00000003, 0x4062C23F, 0x4063C020, 0x40648C20, 0x00000003, 0x4062C240, + 0x4063C020, 0x40648C20, 0x00000003, 0x4062C241, 0x4063C020, 0x40648C20, + 0x00000002, 0x4062C221, 0x4063C220, 0x00000002, 0x4062C222, 0x4063C220, + 0x00000002, 0x4062C223, 0x4063C220, 0x00000002, 0x4062C224, 0x4063C220, + 0x00000002, 0x4062C225, 0x4063C220, 0x00000002, 0x4062C226, 0x4063C220, + 0x00000002, 0x4062C227, 0x4063C220, 0x00000002, 0x4062C228, 0x4063C220, + 0x00000002, 0x4062C229, 0x4063C220, 0x00000002, 0x4062C22A, 0x4063C220, + 0x00000002, 0x4062C22B, 0x4063C220, 0x00000002, 0x4062C22C, 0x4063C220, + 0x00000002, 0x4062C22D, 0x4063C220, 0x00000002, + // Block 510, offset 0x7f80 + 0x4062C22E, 0x4063C220, 0x00000002, 0x4062C22F, 0x4063C220, 0x00000002, + 0x4062C230, 0x4063C220, 0x00000002, 0x4062C231, 0x4063C220, 0x00000002, + 0x4062C232, 0x4063C220, 0x00000002, 0x4062C233, 0x4063C220, 0x00000002, + 0x4062C234, 0x4063C220, 0x00000002, 0x4062C235, 0x4063C220, 0x00000002, + 0x4062C236, 0x4063C220, 0x00000002, 0x4062C237, 0x4063C220, 0x00000002, + 0x4062C238, 0x4063C220, 0x00000002, 0x4062C239, 0x4063C220, 0x00000002, + 0x4062C23A, 0x4063C220, 0x00000002, 0x4062C23B, 0x4063C220, 0x00000002, + 0x4062C23C, 0x4063C220, 0x00000002, 0x4062C23D, 0x4063C220, 0x00000002, + 0x4062C23E, 0x4063C220, 0x00000002, 0x4062C23F, 0x4063C220, 0x00000002, + 0x4062C240, 0x4063C220, 0x00000002, 0x4062C241, 0x4063C220, 0x00000002, + 0x4062C242, 0x4063C220, 0x00000002, 0x4062C243, + // Block 511, offset 0x7fc0 + 0x4063C220, 0x00000002, 0x4062C244, 0x4063C220, 0x00000002, 0x4062C245, + 0x4063C220, 0x00000002, 0x4062C246, 0x4063C220, 0x00000002, 0x4062C247, + 0x4063C220, 0x00000002, 0x4062C248, 0x4063C220, 0x00000002, 0x4062C249, + 0x4063C220, 0x00000002, 0x4062C24A, 0x4063C220, 0x00000002, 0x4062C24B, + 0x4063C220, 0x00000002, 0x4062C24C, 0x4063C220, 0x00000002, 0x4062C24D, + 0x4063C220, 0x00000002, 0x4062C24E, 0x4063C220, 0x00000002, 0x4062C24F, + 0x4063C220, 0x00000002, 0x4062C250, 0x4063C220, 0x00000002, 0x4062C251, + 0x4063C220, 0x00000002, 0x4062C252, 0x4063C220, 0x00000002, 0x4062C253, + 0x4063C220, 0x00000002, 0x4062C254, 0x4063C220, 0x00000003, 0x4062C221, + 0x4063C220, 0x40646420, 0x00000003, 0x4062C222, 0x4063C220, 0x40646420, + 0x00000003, 0x4062C223, 0x4063C220, 0x40646420, + // Block 512, offset 0x8000 + 0x00000003, 0x4062C224, 0x4063C220, 0x40646420, 0x00000003, 0x4062C225, + 0x4063C220, 0x40646420, 0x00000003, 0x4062C226, 0x4063C220, 0x40646420, + 0x00000003, 0x4062C227, 0x4063C220, 0x40646420, 0x00000003, 0x4062C228, + 0x4063C220, 0x40646420, 0x00000003, 0x4062C229, 0x4063C220, 0x40646420, + 0x00000003, 0x4062C22A, 0x4063C220, 0x40646420, 0x00000003, 0x4062C221, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062C222, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062C223, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C224, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062C225, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062C226, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C227, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062C228, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062C229, 0x4063C220, 0x40646A20, + // Block 513, offset 0x8040 + 0x00000003, 0x4062C22A, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C22B, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062C22C, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062C22D, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C22E, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062C22F, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062C230, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C231, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062C232, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062C221, 0x4063C220, 0x40647220, 0x00000003, 0x4062C222, + 0x4063C220, 0x40647220, 0x00000003, 0x4062C223, 0x4063C220, 0x40647220, + 0x00000003, 0x4062C221, 0x4063C220, 0x40648C20, 0x00000003, 0x4062C222, + 0x4063C220, 0x40648C20, 0x00000003, 0x4062C221, 0x4063C420, 0x40646A20, + 0x00000003, 0x4062C222, 0x4063C420, 0x40646A20, + // Block 514, offset 0x8080 + 0x00000003, 0x4062C223, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C224, + 0x4063C420, 0x40646A20, 0x00000003, 0x4062C225, 0x4063C420, 0x40646A20, + 0x00000003, 0x4062C226, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C227, + 0x4063C420, 0x40646A20, 0x00000003, 0x4062C228, 0x4063C420, 0x40646A20, + 0x00000003, 0x4062C229, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C22A, + 0x4063C420, 0x40646A20, 0x00000003, 0x4062C22B, 0x4063C420, 0x40646A20, + 0x00000003, 0x4062C22C, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C22D, + 0x4063C420, 0x40646A20, 0x00000003, 0x4062C22E, 0x4063C420, 0x40646A20, + 0x00000003, 0x4062C22F, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C230, + 0x4063C420, 0x40646A20, 0x00000003, 0x4062C231, 0x4063C420, 0x40646A20, + 0x00000003, 0x4062C232, 0x4063C420, 0x40646A20, + // Block 515, offset 0x80c0 + 0x00000003, 0x4062C233, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C234, + 0x4063C420, 0x40646A20, 0x00000003, 0x4062C235, 0x4063C420, 0x40646A20, + 0x00000003, 0x4062C236, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C237, + 0x4063C420, 0x40646A20, 0x00000003, 0x4062C238, 0x4063C420, 0x40646A20, + 0x00000003, 0x4062C239, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C23A, + 0x4063C420, 0x40646A20, 0x00000003, 0x4062C23B, 0x4063C420, 0x40646A20, + 0x00000003, 0x4062C23C, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C23D, + 0x4063C420, 0x40646A20, 0x00000003, 0x4062C23E, 0x4063C420, 0x40646A20, + 0x00000003, 0x4062C23F, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C240, + 0x4063C420, 0x40646A20, 0x00000003, 0x4062C241, 0x4063C420, 0x40646A20, + 0x00000003, 0x4062C242, 0x4063C420, 0x40646A20, + // Block 516, offset 0x8100 + 0x00000003, 0x4062C243, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C244, + 0x4063C420, 0x40646A20, 0x00000003, 0x4062C245, 0x4063C420, 0x40646A20, + 0x00000003, 0x4062C246, 0x4063C420, 0x40646A20, 0x00000003, 0x4062C247, + 0x4063C420, 0x40646A20, 0x00000003, 0x4062C248, 0x4063C420, 0x40646A20, + 0x00000003, 0x4062C221, 0x4063C420, 0x40647220, 0x00000003, 0x4062C222, + 0x4063C420, 0x40647220, 0x00000003, 0x4062C223, 0x4063C420, 0x40647220, + 0x00000003, 0x4062C224, 0x4063C420, 0x40647220, 0x00000003, 0x4062C225, + 0x4063C420, 0x40647220, 0x00000002, 0x4062C221, 0x4063C820, 0x00000002, + 0x4062C222, 0x4063C820, 0x00000002, 0x4062C223, 0x4063C820, 0x00000002, + 0x4062C224, 0x4063C820, 0x00000002, 0x4062C225, 0x4063C820, 0x00000002, + 0x4062C226, 0x4063C820, 0x00000002, 0x4062C227, + // Block 517, offset 0x8140 + 0x4063C820, 0x00000002, 0x4062C228, 0x4063C820, 0x00000002, 0x4062C229, + 0x4063C820, 0x00000002, 0x4062C22A, 0x4063C820, 0x00000002, 0x4062C22B, + 0x4063C820, 0x00000002, 0x4062C22C, 0x4063C820, 0x00000002, 0x4062C22D, + 0x4063C820, 0x00000002, 0x4062C22E, 0x4063C820, 0x00000002, 0x4062C22F, + 0x4063C820, 0x00000002, 0x4062C230, 0x4063C820, 0x00000002, 0x4062C231, + 0x4063C820, 0x00000002, 0x4062C232, 0x4063C820, 0x00000002, 0x4062C233, + 0x4063C820, 0x00000002, 0x4062C234, 0x4063C820, 0x00000002, 0x4062C235, + 0x4063C820, 0x00000002, 0x4062C236, 0x4063C820, 0x00000002, 0x4062C237, + 0x4063C820, 0x00000002, 0x4062C238, 0x4063C820, 0x00000002, 0x4062C239, + 0x4063C820, 0x00000002, 0x4062C23A, 0x4063C820, 0x00000002, 0x4062C23B, + 0x4063C820, 0x00000002, 0x4062C23C, 0x4063C820, + // Block 518, offset 0x8180 + 0x00000002, 0x4062C23D, 0x4063C820, 0x00000002, 0x4062C23E, 0x4063C820, + 0x00000002, 0x4062C23F, 0x4063C820, 0x00000002, 0x4062C240, 0x4063C820, + 0x00000002, 0x4062C241, 0x4063C820, 0x00000002, 0x4062C242, 0x4063C820, + 0x00000002, 0x4062C243, 0x4063C820, 0x00000002, 0x4062C244, 0x4063C820, + 0x00000002, 0x4062C245, 0x4063C820, 0x00000002, 0x4062C246, 0x4063C820, + 0x00000002, 0x4062C247, 0x4063C820, 0x00000002, 0x4062C221, 0x4063CA20, + 0x00000002, 0x4062C222, 0x4063CA20, 0x00000002, 0x4062C223, 0x4063CA20, + 0x00000002, 0x4062C224, 0x4063CA20, 0x00000002, 0x4062C225, 0x4063CA20, + 0x00000002, 0x4062C226, 0x4063CA20, 0x00000002, 0x4062C227, 0x4063CA20, + 0x00000002, 0x4062C228, 0x4063CA20, 0x00000002, 0x4062C229, 0x4063CA20, + 0x00000002, 0x4062C22A, 0x4063CA20, 0x00000002, + // Block 519, offset 0x81c0 + 0x4062C22B, 0x4063CA20, 0x00000002, 0x4062C22C, 0x4063CA20, 0x00000002, + 0x4062C22D, 0x4063CA20, 0x00000002, 0x4062C22E, 0x4063CA20, 0x00000002, + 0x4062C22F, 0x4063CA20, 0x00000002, 0x4062C230, 0x4063CA20, 0x00000002, + 0x4062C231, 0x4063CA20, 0x00000002, 0x4062C232, 0x4063CA20, 0x00000002, + 0x4062C233, 0x4063CA20, 0x00000002, 0x4062C234, 0x4063CA20, 0x00000002, + 0x4062C235, 0x4063CA20, 0x00000002, 0x4062C236, 0x4063CA20, 0x00000002, + 0x4062C237, 0x4063CA20, 0x00000002, 0x4062C238, 0x4063CA20, 0x00000002, + 0x4062C239, 0x4063CA20, 0x00000002, 0x4062C23A, 0x4063CA20, 0x00000002, + 0x4062C23B, 0x4063CA20, 0x00000002, 0x4062C23C, 0x4063CA20, 0x00000002, + 0x4062C23D, 0x4063CA20, 0x00000002, 0x4062C23E, 0x4063CA20, 0x00000002, + 0x4062C23F, 0x4063CA20, 0x00000002, 0x4062C240, + // Block 520, offset 0x8200 + 0x4063CA20, 0x00000002, 0x4062C241, 0x4063CA20, 0x00000002, 0x4062C242, + 0x4063CA20, 0x00000002, 0x4062C243, 0x4063CA20, 0x00000002, 0x4062C244, + 0x4063CA20, 0x00000002, 0x4062C245, 0x4063CA20, 0x00000002, 0x4062C246, + 0x4063CA20, 0x00000002, 0x4062C247, 0x4063CA20, 0x00000002, 0x4062C248, + 0x4063CA20, 0x00000002, 0x4062C249, 0x4063CA20, 0x00000002, 0x4062C24A, + 0x4063CA20, 0x00000002, 0x4062C24B, 0x4063CA20, 0x00000002, 0x4062C24C, + 0x4063CA20, 0x00000002, 0x4062C24D, 0x4063CA20, 0x00000002, 0x4062C24E, + 0x4063CA20, 0x00000002, 0x4062C24F, 0x4063CA20, 0x00000002, 0x4062C250, + 0x4063CA20, 0x00000002, 0x4062C251, 0x4063CA20, 0x00000002, 0x4062C252, + 0x4063CA20, 0x00000002, 0x4062C253, 0x4063CA20, 0x00000002, 0x4062C254, + 0x4063CA20, 0x00000002, 0x4062C255, 0x4063CA20, + // Block 521, offset 0x8240 + 0x00000002, 0x4062C256, 0x4063CA20, 0x00000002, 0x4062C257, 0x4063CA20, + 0x00000002, 0x4062C258, 0x4063CA20, 0x00000002, 0x4062C259, 0x4063CA20, + 0x00000002, 0x4062C25A, 0x4063CA20, 0x00000002, 0x4062C25B, 0x4063CA20, + 0x00000002, 0x4062C25C, 0x4063CA20, 0x00000002, 0x4062C25D, 0x4063CA20, + 0x00000002, 0x4062C25E, 0x4063CA20, 0x00000002, 0x4062C25F, 0x4063CA20, + 0x00000002, 0x4062C260, 0x4063CA20, 0x00000002, 0x4062C261, 0x4063CA20, + 0x00000002, 0x4062C262, 0x4063CA20, 0x00000002, 0x4062C263, 0x4063CA20, + 0x00000002, 0x4062C264, 0x4063CA20, 0x00000002, 0x4062C265, 0x4063CA20, + 0x00000002, 0x4062C266, 0x4063CA20, 0x00000002, 0x4062C267, 0x4063CA20, + 0x00000002, 0x4062C268, 0x4063CA20, 0x00000002, 0x4062C269, 0x4063CA20, + 0x00000002, 0x4062C26A, 0x4063CA20, 0x00000002, + // Block 522, offset 0x8280 + 0x4062C26B, 0x4063CA20, 0x00000002, 0x4062C26C, 0x4063CA20, 0x00000002, + 0x4062C26D, 0x4063CA20, 0x00000003, 0x4062C221, 0x4063CA20, 0x40646420, + 0x00000003, 0x4062C222, 0x4063CA20, 0x40646420, 0x00000003, 0x4062C223, + 0x4063CA20, 0x40646420, 0x00000003, 0x4062C224, 0x4063CA20, 0x40646420, + 0x00000003, 0x4062C225, 0x4063CA20, 0x40646420, 0x00000003, 0x4062C221, + 0x4063CA20, 0x40646A20, 0x00000003, 0x4062C222, 0x4063CA20, 0x40646A20, + 0x00000003, 0x4062C223, 0x4063CA20, 0x40646A20, 0x00000003, 0x4062C224, + 0x4063CA20, 0x40646A20, 0x00000003, 0x4062C225, 0x4063CA20, 0x40646A20, + 0x00000003, 0x4062C226, 0x4063CA20, 0x40646A20, 0x00000003, 0x4062C227, + 0x4063CA20, 0x40646A20, 0x00000003, 0x4062C228, 0x4063CA20, 0x40646A20, + 0x00000003, 0x4062C229, 0x4063CA20, 0x40646A20, + // Block 523, offset 0x82c0 + 0x00000003, 0x4062C22A, 0x4063CA20, 0x40646A20, 0x00000003, 0x4062C22B, + 0x4063CA20, 0x40646A20, 0x00000003, 0x4062C221, 0x4063CA20, 0x40647220, + 0x00000003, 0x4062C222, 0x4063CA20, 0x40647220, 0x00000003, 0x4062C223, + 0x4063CA20, 0x40647220, 0x00000003, 0x4062C221, 0x4063CA20, 0x40648C20, + 0x00000003, 0x4062C222, 0x4063CA20, 0x40648C20, 0x00000003, 0x4062C223, + 0x4063CA20, 0x40648C20, 0x00000003, 0x4062C224, 0x4063CA20, 0x40648C20, + 0x00000003, 0x4062C225, 0x4063CA20, 0x40648C20, 0x00000003, 0x4062C221, + 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C222, 0x4063CC20, 0x40646A20, + 0x00000003, 0x4062C223, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C224, + 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C225, 0x4063CC20, 0x40646A20, + 0x00000003, 0x4062C226, 0x4063CC20, 0x40646A20, + // Block 524, offset 0x8300 + 0x00000003, 0x4062C227, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C228, + 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C229, 0x4063CC20, 0x40646A20, + 0x00000003, 0x4062C22A, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C22B, + 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C22C, 0x4063CC20, 0x40646A20, + 0x00000003, 0x4062C22D, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C22E, + 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C22F, 0x4063CC20, 0x40646A20, + 0x00000003, 0x4062C230, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C231, + 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C232, 0x4063CC20, 0x40646A20, + 0x00000003, 0x4062C233, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C234, + 0x4063CC20, 0x40646A20, 0x00000003, 0x4062C221, 0x4063CC20, 0x40647220, + 0x00000003, 0x4062C222, 0x4063CC20, 0x40647220, + // Block 525, offset 0x8340 + 0x00000003, 0x4062C221, 0x4063CC20, 0x40648220, 0x00000003, 0x4062C222, + 0x4063CC20, 0x40648220, 0x00000003, 0x4062C223, 0x4063CC20, 0x40648220, + 0x00000003, 0x4062C224, 0x4063CC20, 0x40648220, 0x00000003, 0x4062C225, + 0x4063CC20, 0x40648220, 0x00000003, 0x4062C226, 0x4063CC20, 0x40648220, + 0x00000003, 0x4062C227, 0x4063CC20, 0x40648220, 0x00000003, 0x4062C228, + 0x4063CC20, 0x40648220, 0x00000003, 0x4062C229, 0x4063CC20, 0x40648220, + 0x00000003, 0x4062C22A, 0x4063CC20, 0x40648220, 0x00000003, 0x4062C22B, + 0x4063CC20, 0x40648220, 0x00000003, 0x4062C221, 0x4063CC20, 0x40648420, + 0x00000003, 0x4062C222, 0x4063CC20, 0x40648420, 0x00000003, 0x4062C223, + 0x4063CC20, 0x40648420, 0x00000003, 0x4062C224, 0x4063CC20, 0x40648420, + 0x00000003, 0x4062C225, 0x4063CC20, 0x40648420, + // Block 526, offset 0x8380 + 0x00000003, 0x4062C226, 0x4063CC20, 0x40648420, 0x00000003, 0x4062C221, + 0x4063CC20, 0x40648C20, 0x00000003, 0x4062C222, 0x4063CC20, 0x40648C20, + 0x00000003, 0x4062C223, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062C224, + 0x4063CC20, 0x40648C20, 0x00000002, 0x4062C221, 0x4063CE20, 0x00000002, + 0x4062C222, 0x4063CE20, 0x00000002, 0x4062C223, 0x4063CE20, 0x00000002, + 0x4062C224, 0x4063CE20, 0x00000002, 0x4062C225, 0x4063CE20, 0x00000002, + 0x4062C226, 0x4063CE20, 0x00000002, 0x4062C227, 0x4063CE20, 0x00000002, + 0x4062C228, 0x4063CE20, 0x00000002, 0x4062C229, 0x4063CE20, 0x00000002, + 0x4062C22A, 0x4063CE20, 0x00000002, 0x4062C22B, 0x4063CE20, 0x00000002, + 0x4062C22C, 0x4063CE20, 0x00000002, 0x4062C22D, 0x4063CE20, 0x00000002, + 0x4062C22E, 0x4063CE20, 0x00000002, 0x4062C22F, + // Block 527, offset 0x83c0 + 0x4063CE20, 0x00000002, 0x4062C230, 0x4063CE20, 0x00000002, 0x4062C231, + 0x4063CE20, 0x00000002, 0x4062C232, 0x4063CE20, 0x00000002, 0x4062C233, + 0x4063CE20, 0x00000002, 0x4062C234, 0x4063CE20, 0x00000002, 0x4062C235, + 0x4063CE20, 0x00000002, 0x4062C236, 0x4063CE20, 0x00000002, 0x4062C237, + 0x4063CE20, 0x00000002, 0x4062C238, 0x4063CE20, 0x00000002, 0x4062C239, + 0x4063CE20, 0x00000002, 0x4062C23A, 0x4063CE20, 0x00000002, 0x4062C23B, + 0x4063CE20, 0x00000002, 0x4062C23C, 0x4063CE20, 0x00000002, 0x4062C23D, + 0x4063CE20, 0x00000002, 0x4062C221, 0x4063D020, 0x00000002, 0x4062C222, + 0x4063D020, 0x00000002, 0x4062C223, 0x4063D020, 0x00000002, 0x4062C224, + 0x4063D020, 0x00000002, 0x4062C225, 0x4063D020, 0x00000002, 0x4062C226, + 0x4063D020, 0x00000002, 0x4062C227, 0x4063D020, + // Block 528, offset 0x8400 + 0x00000002, 0x4062C228, 0x4063D020, 0x00000002, 0x4062C229, 0x4063D020, + 0x00000002, 0x4062C22A, 0x4063D020, 0x00000002, 0x4062C22B, 0x4063D020, + 0x00000002, 0x4062C22C, 0x4063D020, 0x00000002, 0x4062C22D, 0x4063D020, + 0x00000002, 0x4062C22E, 0x4063D020, 0x00000002, 0x4062C22F, 0x4063D020, + 0x00000002, 0x4062C230, 0x4063D020, 0x00000002, 0x4062C231, 0x4063D020, + 0x00000002, 0x4062C232, 0x4063D020, 0x00000002, 0x4062C233, 0x4063D020, + 0x00000002, 0x4062C234, 0x4063D020, 0x00000002, 0x4062C235, 0x4063D020, + 0x00000002, 0x4062C236, 0x4063D020, 0x00000002, 0x4062C237, 0x4063D020, + 0x00000002, 0x4062C238, 0x4063D020, 0x00000002, 0x4062C239, 0x4063D020, + 0x00000002, 0x4062C23A, 0x4063D020, 0x00000002, 0x4062C23B, 0x4063D020, + 0x00000002, 0x4062C23C, 0x4063D020, 0x00000002, + // Block 529, offset 0x8440 + 0x4062C23D, 0x4063D020, 0x00000002, 0x4062C23E, 0x4063D020, 0x00000002, + 0x4062C23F, 0x4063D020, 0x00000002, 0x4062C240, 0x4063D020, 0x00000002, + 0x4062C241, 0x4063D020, 0x00000002, 0x4062C242, 0x4063D020, 0x00000002, + 0x4062C243, 0x4063D020, 0x00000003, 0x4062C221, 0x4063D020, 0x40646420, + 0x00000003, 0x4062C222, 0x4063D020, 0x40646420, 0x00000003, 0x4062C223, + 0x4063D020, 0x40646420, 0x00000003, 0x4062C224, 0x4063D020, 0x40646420, + 0x00000003, 0x4062C225, 0x4063D020, 0x40646420, 0x00000003, 0x4062C226, + 0x4063D020, 0x40646420, 0x00000003, 0x4062C227, 0x4063D020, 0x40646420, + 0x00000003, 0x4062C228, 0x4063D020, 0x40646420, 0x00000003, 0x4062C229, + 0x4063D020, 0x40646420, 0x00000003, 0x4062C221, 0x4063D020, 0x40646A20, + 0x00000003, 0x4062C222, 0x4063D020, 0x40646A20, + // Block 530, offset 0x8480 + 0x00000003, 0x4062C223, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C224, + 0x4063D020, 0x40646A20, 0x00000003, 0x4062C225, 0x4063D020, 0x40646A20, + 0x00000003, 0x4062C226, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C227, + 0x4063D020, 0x40646A20, 0x00000003, 0x4062C228, 0x4063D020, 0x40646A20, + 0x00000003, 0x4062C229, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C22A, + 0x4063D020, 0x40646A20, 0x00000003, 0x4062C22B, 0x4063D020, 0x40646A20, + 0x00000003, 0x4062C22C, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C22D, + 0x4063D020, 0x40646A20, 0x00000003, 0x4062C22E, 0x4063D020, 0x40646A20, + 0x00000003, 0x4062C22F, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C230, + 0x4063D020, 0x40646A20, 0x00000003, 0x4062C231, 0x4063D020, 0x40646A20, + 0x00000003, 0x4062C232, 0x4063D020, 0x40646A20, + // Block 531, offset 0x84c0 + 0x00000003, 0x4062C233, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C234, + 0x4063D020, 0x40646A20, 0x00000003, 0x4062C235, 0x4063D020, 0x40646A20, + 0x00000003, 0x4062C236, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C237, + 0x4063D020, 0x40646A20, 0x00000003, 0x4062C238, 0x4063D020, 0x40646A20, + 0x00000003, 0x4062C239, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C23A, + 0x4063D020, 0x40646A20, 0x00000003, 0x4062C23B, 0x4063D020, 0x40646A20, + 0x00000003, 0x4062C23C, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C221, + 0x4063D020, 0x40647220, 0x00000003, 0x4062C222, 0x4063D020, 0x40647220, + 0x00000003, 0x4062C223, 0x4063D020, 0x40647220, 0x00000003, 0x4062C224, + 0x4063D020, 0x40647220, 0x00000003, 0x4062C225, 0x4063D020, 0x40647220, + 0x00000003, 0x4062C226, 0x4063D020, 0x40647220, + // Block 532, offset 0x8500 + 0x00000003, 0x4062C227, 0x4063D020, 0x40647220, 0x00000003, 0x4062C228, + 0x4063D020, 0x40647220, 0x00000003, 0x4062C229, 0x4063D020, 0x40647220, + 0x00000003, 0x4062C22A, 0x4063D020, 0x40647220, 0x00000003, 0x4062C22B, + 0x4063D020, 0x40647220, 0x00000003, 0x4062C221, 0x4063D020, 0x40648220, + 0x00000003, 0x4062C222, 0x4063D020, 0x40648220, 0x00000003, 0x4062C223, + 0x4063D020, 0x40648220, 0x00000003, 0x4062C224, 0x4063D020, 0x40648220, + 0x00000003, 0x4062C225, 0x4063D020, 0x40648220, 0x00000003, 0x4062C226, + 0x4063D020, 0x40648220, 0x00000003, 0x4062C227, 0x4063D020, 0x40648220, + 0x00000003, 0x4062C228, 0x4063D020, 0x40648220, 0x00000003, 0x4062C229, + 0x4063D020, 0x40648220, 0x00000003, 0x4062C22A, 0x4063D020, 0x40648220, + 0x00000003, 0x4062C22B, 0x4063D020, 0x40648220, + // Block 533, offset 0x8540 + 0x00000003, 0x4062C22C, 0x4063D020, 0x40648220, 0x00000003, 0x4062C221, + 0x4063D020, 0x40648420, 0x00000003, 0x4062C222, 0x4063D020, 0x40648420, + 0x00000003, 0x4062C223, 0x4063D020, 0x40648420, 0x00000003, 0x4062C221, + 0x4063D020, 0x40648C20, 0x00000003, 0x4062C222, 0x4063D020, 0x40648C20, + 0x00000003, 0x4062C223, 0x4063D020, 0x40648C20, 0x00000003, 0x4062C224, + 0x4063D020, 0x40648C20, 0x00000003, 0x4062C225, 0x4063D020, 0x40648C20, + 0x00000002, 0x4062C421, 0x4063A820, 0x00000002, 0x4062C422, 0x4063A820, + 0x00000002, 0x4062C423, 0x4063A820, 0x00000002, 0x4062C424, 0x4063A820, + 0x00000002, 0x4062C425, 0x4063A820, 0x00000002, 0x4062C426, 0x4063A820, + 0x00000002, 0x4062C427, 0x4063A820, 0x00000002, 0x4062C428, 0x4063A820, + 0x00000002, 0x4062C429, 0x4063A820, 0x00000002, + // Block 534, offset 0x8580 + 0x4062C42A, 0x4063A820, 0x00000002, 0x4062C42B, 0x4063A820, 0x00000002, + 0x4062C42C, 0x4063A820, 0x00000002, 0x4062C42D, 0x4063A820, 0x00000002, + 0x4062C42E, 0x4063A820, 0x00000002, 0x4062C42F, 0x4063A820, 0x00000002, + 0x4062C430, 0x4063A820, 0x00000002, 0x4062C431, 0x4063A820, 0x00000002, + 0x4062C432, 0x4063A820, 0x00000002, 0x4062C433, 0x4063A820, 0x00000002, + 0x4062C434, 0x4063A820, 0x00000002, 0x4062C435, 0x4063A820, 0x00000002, + 0x4062C436, 0x4063A820, 0x00000002, 0x4062C437, 0x4063A820, 0x00000002, + 0x4062C438, 0x4063A820, 0x00000002, 0x4062C439, 0x4063A820, 0x00000002, + 0x4062C43A, 0x4063A820, 0x00000002, 0x4062C43B, 0x4063A820, 0x00000002, + 0x4062C43C, 0x4063A820, 0x00000002, 0x4062C43D, 0x4063A820, 0x00000002, + 0x4062C43E, 0x4063A820, 0x00000002, 0x4062C43F, + // Block 535, offset 0x85c0 + 0x4063A820, 0x00000002, 0x4062C440, 0x4063A820, 0x00000002, 0x4062C441, + 0x4063A820, 0x00000002, 0x4062C442, 0x4063A820, 0x00000002, 0x4062C443, + 0x4063A820, 0x00000002, 0x4062C444, 0x4063A820, 0x00000002, 0x4062C445, + 0x4063A820, 0x00000002, 0x4062C446, 0x4063A820, 0x00000002, 0x4062C447, + 0x4063A820, 0x00000002, 0x4062C448, 0x4063A820, 0x00000002, 0x4062C449, + 0x4063A820, 0x00000002, 0x4062C44A, 0x4063A820, 0x00000002, 0x4062C44B, + 0x4063A820, 0x00000002, 0x4062C44C, 0x4063A820, 0x00000002, 0x4062C44D, + 0x4063A820, 0x00000002, 0x4062C44E, 0x4063A820, 0x00000002, 0x4062C44F, + 0x4063A820, 0x00000002, 0x4062C450, 0x4063A820, 0x00000002, 0x4062C451, + 0x4063A820, 0x00000002, 0x4062C452, 0x4063A820, 0x00000002, 0x4062C453, + 0x4063A820, 0x00000002, 0x4062C454, 0x4063A820, + // Block 536, offset 0x8600 + 0x00000003, 0x4062C421, 0x4063A820, 0x40646420, 0x00000003, 0x4062C422, + 0x4063A820, 0x40646420, 0x00000003, 0x4062C423, 0x4063A820, 0x40646420, + 0x00000003, 0x4062C424, 0x4063A820, 0x40646420, 0x00000003, 0x4062C425, + 0x4063A820, 0x40646420, 0x00000003, 0x4062C426, 0x4063A820, 0x40646420, + 0x00000003, 0x4062C427, 0x4063A820, 0x40646420, 0x00000003, 0x4062C428, + 0x4063A820, 0x40646420, 0x00000003, 0x4062C429, 0x4063A820, 0x40646420, + 0x00000003, 0x4062C42A, 0x4063A820, 0x40646420, 0x00000003, 0x4062C42B, + 0x4063A820, 0x40646420, 0x00000003, 0x4062C42C, 0x4063A820, 0x40646420, + 0x00000003, 0x4062C42D, 0x4063A820, 0x40646420, 0x00000003, 0x4062C42E, + 0x4063A820, 0x40646420, 0x00000003, 0x4062C42F, 0x4063A820, 0x40646420, + 0x00000003, 0x4062C430, 0x4063A820, 0x40646420, + // Block 537, offset 0x8640 + 0x00000003, 0x4062C431, 0x4063A820, 0x40646420, 0x00000003, 0x4062C432, + 0x4063A820, 0x40646420, 0x00000003, 0x4062C433, 0x4063A820, 0x40646420, + 0x00000003, 0x4062C434, 0x4063A820, 0x40646420, 0x00000003, 0x4062C435, + 0x4063A820, 0x40646420, 0x00000003, 0x4062C421, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062C422, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C423, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062C424, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062C425, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C426, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062C427, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062C428, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C421, + 0x4063A820, 0x40648220, 0x00000003, 0x4062C422, 0x4063A820, 0x40648220, + 0x00000003, 0x4062C423, 0x4063A820, 0x40648220, + // Block 538, offset 0x8680 + 0x00000003, 0x4062C424, 0x4063A820, 0x40648220, 0x00000003, 0x4062C425, + 0x4063A820, 0x40648220, 0x00000003, 0x4062C426, 0x4063A820, 0x40648220, + 0x00000003, 0x4062C427, 0x4063A820, 0x40648220, 0x00000003, 0x4062C428, + 0x4063A820, 0x40648220, 0x00000003, 0x4062C429, 0x4063A820, 0x40648220, + 0x00000003, 0x4062C421, 0x4063A820, 0x40648420, 0x00000003, 0x4062C422, + 0x4063A820, 0x40648420, 0x00000003, 0x4062C423, 0x4063A820, 0x40648420, + 0x00000003, 0x4062C424, 0x4063A820, 0x40648420, 0x00000003, 0x4062C425, + 0x4063A820, 0x40648420, 0x00000003, 0x4062C426, 0x4063A820, 0x40648420, + 0x00000003, 0x4062C421, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C422, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062C423, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062C424, 0x4063A820, 0x40648C20, + // Block 539, offset 0x86c0 + 0x00000003, 0x4062C425, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C426, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062C427, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062C428, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C429, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062C42A, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062C42B, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C42C, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062C42D, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062C42E, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C42F, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062C430, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062C431, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C432, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062C433, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062C434, 0x4063A820, 0x40648C20, + // Block 540, offset 0x8700 + 0x00000003, 0x4062C435, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C436, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062C437, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062C438, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C439, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062C43A, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062C43B, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C43C, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062C43D, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062C43E, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C43F, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062C440, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062C441, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C442, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062C443, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062C444, 0x4063A820, 0x40648C20, + // Block 541, offset 0x8740 + 0x00000003, 0x4062C445, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C446, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062C447, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062C448, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C449, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062C44A, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062C44B, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C44C, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062C44D, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062C44E, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C44F, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062C450, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062C451, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C452, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062C453, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062C454, 0x4063A820, 0x40648C20, + // Block 542, offset 0x8780 + 0x00000003, 0x4062C455, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C456, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062C457, 0x4063A820, 0x40648C20, + 0x00000002, 0x4062C421, 0x4063AA20, 0x00000002, 0x4062C422, 0x4063AA20, + 0x00000002, 0x4062C423, 0x4063AA20, 0x00000002, 0x4062C424, 0x4063AA20, + 0x00000002, 0x4062C425, 0x4063AA20, 0x00000002, 0x4062C426, 0x4063AA20, + 0x00000002, 0x4062C427, 0x4063AA20, 0x00000002, 0x4062C428, 0x4063AA20, + 0x00000002, 0x4062C429, 0x4063AA20, 0x00000002, 0x4062C42A, 0x4063AA20, + 0x00000002, 0x4062C42B, 0x4063AA20, 0x00000002, 0x4062C42C, 0x4063AA20, + 0x00000002, 0x4062C42D, 0x4063AA20, 0x00000002, 0x4062C42E, 0x4063AA20, + 0x00000002, 0x4062C42F, 0x4063AA20, 0x00000002, 0x4062C430, 0x4063AA20, + 0x00000002, 0x4062C431, 0x4063AA20, 0x00000002, + // Block 543, offset 0x87c0 + 0x4062C432, 0x4063AA20, 0x00000002, 0x4062C433, 0x4063AA20, 0x00000002, + 0x4062C434, 0x4063AA20, 0x00000002, 0x4062C435, 0x4063AA20, 0x00000002, + 0x4062C436, 0x4063AA20, 0x00000002, 0x4062C437, 0x4063AA20, 0x00000003, + 0x4062C421, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062C422, 0x4063AA20, + 0x40648C20, 0x00000003, 0x4062C423, 0x4063AA20, 0x40648C20, 0x00000003, + 0x4062C424, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062C425, 0x4063AA20, + 0x40648C20, 0x00000003, 0x4062C426, 0x4063AA20, 0x40648C20, 0x00000003, + 0x4062C427, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062C428, 0x4063AA20, + 0x40648C20, 0x00000002, 0x4062C421, 0x4063B020, 0x00000002, 0x4062C422, + 0x4063B020, 0x00000002, 0x4062C423, 0x4063B020, 0x00000002, 0x4062C424, + 0x4063B020, 0x00000002, 0x4062C425, 0x4063B020, + // Block 544, offset 0x8800 + 0x00000002, 0x4062C426, 0x4063B020, 0x00000002, 0x4062C427, 0x4063B020, + 0x00000002, 0x4062C428, 0x4063B020, 0x00000002, 0x4062C429, 0x4063B020, + 0x00000002, 0x4062C42A, 0x4063B020, 0x00000002, 0x4062C42B, 0x4063B020, + 0x00000002, 0x4062C42C, 0x4063B020, 0x00000002, 0x4062C42D, 0x4063B020, + 0x00000002, 0x4062C42E, 0x4063B020, 0x00000002, 0x4062C42F, 0x4063B020, + 0x00000002, 0x4062C430, 0x4063B020, 0x00000002, 0x4062C431, 0x4063B020, + 0x00000002, 0x4062C432, 0x4063B020, 0x00000002, 0x4062C433, 0x4063B020, + 0x00000002, 0x4062C434, 0x4063B020, 0x00000002, 0x4062C435, 0x4063B020, + 0x00000002, 0x4062C436, 0x4063B020, 0x00000002, 0x4062C437, 0x4063B020, + 0x00000002, 0x4062C438, 0x4063B020, 0x00000002, 0x4062C439, 0x4063B020, + 0x00000002, 0x4062C43A, 0x4063B020, 0x00000002, + // Block 545, offset 0x8840 + 0x4062C43B, 0x4063B020, 0x00000002, 0x4062C43C, 0x4063B020, 0x00000002, + 0x4062C43D, 0x4063B020, 0x00000002, 0x4062C43E, 0x4063B020, 0x00000002, + 0x4062C43F, 0x4063B020, 0x00000002, 0x4062C440, 0x4063B020, 0x00000002, + 0x4062C441, 0x4063B020, 0x00000002, 0x4062C442, 0x4063B020, 0x00000002, + 0x4062C443, 0x4063B020, 0x00000002, 0x4062C444, 0x4063B020, 0x00000002, + 0x4062C445, 0x4063B020, 0x00000002, 0x4062C446, 0x4063B020, 0x00000002, + 0x4062C447, 0x4063B020, 0x00000002, 0x4062C448, 0x4063B020, 0x00000002, + 0x4062C449, 0x4063B020, 0x00000002, 0x4062C44A, 0x4063B020, 0x00000002, + 0x4062C44B, 0x4063B020, 0x00000002, 0x4062C44C, 0x4063B020, 0x00000002, + 0x4062C44D, 0x4063B020, 0x00000002, 0x4062C44E, 0x4063B020, 0x00000003, + 0x4062C421, 0x4063B020, 0x40646420, 0x00000003, + // Block 546, offset 0x8880 + 0x4062C422, 0x4063B020, 0x40646420, 0x00000003, 0x4062C423, 0x4063B020, + 0x40646420, 0x00000003, 0x4062C424, 0x4063B020, 0x40646420, 0x00000003, + 0x4062C425, 0x4063B020, 0x40646420, 0x00000003, 0x4062C426, 0x4063B020, + 0x40646420, 0x00000003, 0x4062C427, 0x4063B020, 0x40646420, 0x00000003, + 0x4062C428, 0x4063B020, 0x40646420, 0x00000003, 0x4062C429, 0x4063B020, + 0x40646420, 0x00000003, 0x4062C42A, 0x4063B020, 0x40646420, 0x00000003, + 0x4062C42B, 0x4063B020, 0x40646420, 0x00000003, 0x4062C42C, 0x4063B020, + 0x40646420, 0x00000003, 0x4062C42D, 0x4063B020, 0x40646420, 0x00000003, + 0x4062C42E, 0x4063B020, 0x40646420, 0x00000003, 0x4062C42F, 0x4063B020, + 0x40646420, 0x00000003, 0x4062C430, 0x4063B020, 0x40646420, 0x00000003, + 0x4062C431, 0x4063B020, 0x40646420, 0x00000003, + // Block 547, offset 0x88c0 + 0x4062C432, 0x4063B020, 0x40646420, 0x00000003, 0x4062C433, 0x4063B020, + 0x40646420, 0x00000003, 0x4062C434, 0x4063B020, 0x40646420, 0x00000003, + 0x4062C435, 0x4063B020, 0x40646420, 0x00000003, 0x4062C436, 0x4063B020, + 0x40646420, 0x00000003, 0x4062C437, 0x4063B020, 0x40646420, 0x00000003, + 0x4062C438, 0x4063B020, 0x40646420, 0x00000003, 0x4062C439, 0x4063B020, + 0x40646420, 0x00000003, 0x4062C43A, 0x4063B020, 0x40646420, 0x00000003, + 0x4062C43B, 0x4063B020, 0x40646420, 0x00000003, 0x4062C43C, 0x4063B020, + 0x40646420, 0x00000003, 0x4062C43D, 0x4063B020, 0x40646420, 0x00000003, + 0x4062C43E, 0x4063B020, 0x40646420, 0x00000003, 0x4062C43F, 0x4063B020, + 0x40646420, 0x00000003, 0x4062C421, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C422, 0x4063B020, 0x40646A20, 0x00000003, + // Block 548, offset 0x8900 + 0x4062C423, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C424, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C425, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C426, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C427, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C428, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C429, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C42A, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C42B, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C42C, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C42D, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C42E, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C42F, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C430, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C431, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C432, 0x4063B020, 0x40646A20, 0x00000003, + // Block 549, offset 0x8940 + 0x4062C433, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C434, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C435, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C436, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C437, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C438, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C439, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C43A, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C43B, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C43C, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C43D, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C43E, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C43F, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C440, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C441, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C442, 0x4063B020, 0x40646A20, 0x00000003, + // Block 550, offset 0x8980 + 0x4062C443, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C444, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C445, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C446, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C447, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C448, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C449, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C44A, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C44B, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C44C, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C44D, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C44E, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C44F, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C450, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C451, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C452, 0x4063B020, 0x40646A20, 0x00000003, + // Block 551, offset 0x89c0 + 0x4062C453, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C454, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C455, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C456, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C457, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C458, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C459, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C45A, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C45B, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C45C, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C45D, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C45E, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C45F, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C460, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C461, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C462, 0x4063B020, 0x40646A20, 0x00000003, + // Block 552, offset 0x8a00 + 0x4062C463, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C464, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C465, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C466, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C467, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C468, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C469, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C46A, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C46B, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C46C, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C46D, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C46E, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C46F, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C470, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062C471, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062C421, 0x4063B020, 0x40647220, 0x00000003, + // Block 553, offset 0x8a40 + 0x4062C422, 0x4063B020, 0x40647220, 0x00000003, 0x4062C423, 0x4063B020, + 0x40647220, 0x00000003, 0x4062C424, 0x4063B020, 0x40647220, 0x00000003, + 0x4062C425, 0x4063B020, 0x40647220, 0x00000003, 0x4062C426, 0x4063B020, + 0x40647220, 0x00000003, 0x4062C427, 0x4063B020, 0x40647220, 0x00000003, + 0x4062C428, 0x4063B020, 0x40647220, 0x00000003, 0x4062C429, 0x4063B020, + 0x40647220, 0x00000003, 0x4062C42A, 0x4063B020, 0x40647220, 0x00000003, + 0x4062C42B, 0x4063B020, 0x40647220, 0x00000003, 0x4062C421, 0x4063B020, + 0x40648220, 0x00000003, 0x4062C422, 0x4063B020, 0x40648220, 0x00000003, + 0x4062C423, 0x4063B020, 0x40648220, 0x00000003, 0x4062C424, 0x4063B020, + 0x40648220, 0x00000003, 0x4062C425, 0x4063B020, 0x40648220, 0x00000003, + 0x4062C426, 0x4063B020, 0x40648220, 0x00000003, + // Block 554, offset 0x8a80 + 0x4062C427, 0x4063B020, 0x40648220, 0x00000003, 0x4062C428, 0x4063B020, + 0x40648220, 0x00000003, 0x4062C429, 0x4063B020, 0x40648220, 0x00000003, + 0x4062C42A, 0x4063B020, 0x40648220, 0x00000003, 0x4062C42B, 0x4063B020, + 0x40648220, 0x00000003, 0x4062C42C, 0x4063B020, 0x40648220, 0x00000003, + 0x4062C42D, 0x4063B020, 0x40648220, 0x00000003, 0x4062C42E, 0x4063B020, + 0x40648220, 0x00000003, 0x4062C42F, 0x4063B020, 0x40648220, 0x00000003, + 0x4062C430, 0x4063B020, 0x40648220, 0x00000003, 0x4062C431, 0x4063B020, + 0x40648220, 0x00000003, 0x4062C432, 0x4063B020, 0x40648220, 0x00000003, + 0x4062C433, 0x4063B020, 0x40648220, 0x00000003, 0x4062C434, 0x4063B020, + 0x40648220, 0x00000003, 0x4062C421, 0x4063B020, 0x40648420, 0x00000003, + 0x4062C422, 0x4063B020, 0x40648420, 0x00000003, + // Block 555, offset 0x8ac0 + 0x4062C423, 0x4063B020, 0x40648420, 0x00000003, 0x4062C424, 0x4063B020, + 0x40648420, 0x00000003, 0x4062C425, 0x4063B020, 0x40648420, 0x00000003, + 0x4062C426, 0x4063B020, 0x40648420, 0x00000003, 0x4062C427, 0x4063B020, + 0x40648420, 0x00000003, 0x4062C428, 0x4063B020, 0x40648420, 0x00000003, + 0x4062C429, 0x4063B020, 0x40648420, 0x00000003, 0x4062C421, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C422, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C423, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C424, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C425, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C426, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C427, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C428, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C429, 0x4063B020, 0x40648C20, 0x00000003, + // Block 556, offset 0x8b00 + 0x4062C42A, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C42B, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C42C, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C42D, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C42E, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C42F, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C430, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C431, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C432, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C433, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C434, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C435, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C436, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C437, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C438, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C439, 0x4063B020, 0x40648C20, 0x00000003, + // Block 557, offset 0x8b40 + 0x4062C43A, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C43B, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C43C, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C43D, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C43E, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C43F, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C440, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C441, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C442, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C443, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C444, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C445, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C446, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C447, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C448, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C449, 0x4063B020, 0x40648C20, 0x00000003, + // Block 558, offset 0x8b80 + 0x4062C44A, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C44B, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C44C, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C44D, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C44E, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C44F, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C450, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C451, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C452, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C453, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C454, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C455, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C456, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C457, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C458, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C459, 0x4063B020, 0x40648C20, 0x00000003, + // Block 559, offset 0x8bc0 + 0x4062C45A, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C45B, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C45C, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C45D, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C45E, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C45F, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C460, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C461, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C462, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C463, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C464, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C465, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C466, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C467, 0x4063B020, + 0x40648C20, 0x00000003, 0x4062C468, 0x4063B020, 0x40648C20, 0x00000003, + 0x4062C469, 0x4063B020, 0x40648C20, 0x00000003, + // Block 560, offset 0x8c00 + 0x4062C46A, 0x4063B020, 0x40648C20, 0x00000002, 0x4062C421, 0x4063B220, + 0x00000002, 0x4062C422, 0x4063B220, 0x00000002, 0x4062C423, 0x4063B220, + 0x00000002, 0x4062C424, 0x4063B220, 0x00000002, 0x4062C425, 0x4063B220, + 0x00000002, 0x4062C426, 0x4063B220, 0x00000002, 0x4062C427, 0x4063B220, + 0x00000002, 0x4062C428, 0x4063B220, 0x00000002, 0x4062C429, 0x4063B220, + 0x00000002, 0x4062C42A, 0x4063B220, 0x00000002, 0x4062C42B, 0x4063B220, + 0x00000002, 0x4062C42C, 0x4063B220, 0x00000002, 0x4062C42D, 0x4063B220, + 0x00000002, 0x4062C42E, 0x4063B220, 0x00000002, 0x4062C42F, 0x4063B220, + 0x00000002, 0x4062C430, 0x4063B220, 0x00000002, 0x4062C431, 0x4063B220, + 0x00000002, 0x4062C432, 0x4063B220, 0x00000002, 0x4062C433, 0x4063B220, + 0x00000002, 0x4062C434, 0x4063B220, 0x00000002, + // Block 561, offset 0x8c40 + 0x4062C435, 0x4063B220, 0x00000002, 0x4062C436, 0x4063B220, 0x00000002, + 0x4062C437, 0x4063B220, 0x00000002, 0x4062C438, 0x4063B220, 0x00000002, + 0x4062C439, 0x4063B220, 0x00000002, 0x4062C43A, 0x4063B220, 0x00000002, + 0x4062C43B, 0x4063B220, 0x00000002, 0x4062C43C, 0x4063B220, 0x00000002, + 0x4062C43D, 0x4063B220, 0x00000002, 0x4062C43E, 0x4063B220, 0x00000002, + 0x4062C43F, 0x4063B220, 0x00000002, 0x4062C440, 0x4063B220, 0x00000002, + 0x4062C441, 0x4063B220, 0x00000002, 0x4062C442, 0x4063B220, 0x00000002, + 0x4062C443, 0x4063B220, 0x00000002, 0x4062C444, 0x4063B220, 0x00000002, + 0x4062C445, 0x4063B220, 0x00000002, 0x4062C446, 0x4063B220, 0x00000002, + 0x4062C447, 0x4063B220, 0x00000002, 0x4062C448, 0x4063B220, 0x00000002, + 0x4062C421, 0x4063B820, 0x00000002, 0x4062C422, + // Block 562, offset 0x8c80 + 0x4063B820, 0x00000002, 0x4062C423, 0x4063B820, 0x00000002, 0x4062C424, + 0x4063B820, 0x00000002, 0x4062C425, 0x4063B820, 0x00000002, 0x4062C426, + 0x4063B820, 0x00000002, 0x4062C427, 0x4063B820, 0x00000002, 0x4062C428, + 0x4063B820, 0x00000002, 0x4062C429, 0x4063B820, 0x00000002, 0x4062C42A, + 0x4063B820, 0x00000002, 0x4062C42B, 0x4063B820, 0x00000002, 0x4062C42C, + 0x4063B820, 0x00000002, 0x4062C42D, 0x4063B820, 0x00000002, 0x4062C42E, + 0x4063B820, 0x00000002, 0x4062C42F, 0x4063B820, 0x00000002, 0x4062C430, + 0x4063B820, 0x00000002, 0x4062C431, 0x4063B820, 0x00000002, 0x4062C432, + 0x4063B820, 0x00000002, 0x4062C433, 0x4063B820, 0x00000002, 0x4062C434, + 0x4063B820, 0x00000002, 0x4062C435, 0x4063B820, 0x00000002, 0x4062C436, + 0x4063B820, 0x00000002, 0x4062C437, 0x4063B820, + // Block 563, offset 0x8cc0 + 0x00000002, 0x4062C438, 0x4063B820, 0x00000002, 0x4062C439, 0x4063B820, + 0x00000002, 0x4062C43A, 0x4063B820, 0x00000002, 0x4062C43B, 0x4063B820, + 0x00000002, 0x4062C43C, 0x4063B820, 0x00000002, 0x4062C43D, 0x4063B820, + 0x00000002, 0x4062C43E, 0x4063B820, 0x00000002, 0x4062C43F, 0x4063B820, + 0x00000002, 0x4062C440, 0x4063B820, 0x00000002, 0x4062C441, 0x4063B820, + 0x00000002, 0x4062C442, 0x4063B820, 0x00000002, 0x4062C443, 0x4063B820, + 0x00000002, 0x4062C444, 0x4063B820, 0x00000002, 0x4062C445, 0x4063B820, + 0x00000002, 0x4062C446, 0x4063B820, 0x00000002, 0x4062C447, 0x4063B820, + 0x00000002, 0x4062C448, 0x4063B820, 0x00000002, 0x4062C449, 0x4063B820, + 0x00000002, 0x4062C44A, 0x4063B820, 0x00000002, 0x4062C44B, 0x4063B820, + 0x00000002, 0x4062C44C, 0x4063B820, 0x00000002, + // Block 564, offset 0x8d00 + 0x4062C44D, 0x4063B820, 0x00000002, 0x4062C44E, 0x4063B820, 0x00000002, + 0x4062C44F, 0x4063B820, 0x00000002, 0x4062C450, 0x4063B820, 0x00000002, + 0x4062C451, 0x4063B820, 0x00000002, 0x4062C452, 0x4063B820, 0x00000002, + 0x4062C453, 0x4063B820, 0x00000002, 0x4062C454, 0x4063B820, 0x00000002, + 0x4062C455, 0x4063B820, 0x00000002, 0x4062C456, 0x4063B820, 0x00000002, + 0x4062C457, 0x4063B820, 0x00000002, 0x4062C458, 0x4063B820, 0x00000002, + 0x4062C459, 0x4063B820, 0x00000002, 0x4062C45A, 0x4063B820, 0x00000002, + 0x4062C45B, 0x4063B820, 0x00000002, 0x4062C45C, 0x4063B820, 0x00000002, + 0x4062C45D, 0x4063B820, 0x00000002, 0x4062C45E, 0x4063B820, 0x00000002, + 0x4062C45F, 0x4063B820, 0x00000002, 0x4062C460, 0x4063B820, 0x00000002, + 0x4062C461, 0x4063B820, 0x00000002, 0x4062C462, + // Block 565, offset 0x8d40 + 0x4063B820, 0x00000002, 0x4062C463, 0x4063B820, 0x00000002, 0x4062C464, + 0x4063B820, 0x00000002, 0x4062C465, 0x4063B820, 0x00000002, 0x4062C466, + 0x4063B820, 0x00000002, 0x4062C467, 0x4063B820, 0x00000002, 0x4062C468, + 0x4063B820, 0x00000002, 0x4062C469, 0x4063B820, 0x00000002, 0x4062C46A, + 0x4063B820, 0x00000002, 0x4062C46B, 0x4063B820, 0x00000002, 0x4062C46C, + 0x4063B820, 0x00000002, 0x4062C46D, 0x4063B820, 0x00000002, 0x4062C46E, + 0x4063B820, 0x00000002, 0x4062C46F, 0x4063B820, 0x00000002, 0x4062C470, + 0x4063B820, 0x00000003, 0x4062C421, 0x4063B820, 0x40646420, 0x00000003, + 0x4062C422, 0x4063B820, 0x40646420, 0x00000003, 0x4062C423, 0x4063B820, + 0x40646420, 0x00000003, 0x4062C424, 0x4063B820, 0x40646420, 0x00000003, + 0x4062C425, 0x4063B820, 0x40646420, 0x00000003, + // Block 566, offset 0x8d80 + 0x4062C421, 0x4063B820, 0x40646A20, 0x00000003, 0x4062C422, 0x4063B820, + 0x40646A20, 0x00000003, 0x4062C423, 0x4063B820, 0x40646A20, 0x00000003, + 0x4062C421, 0x4063B820, 0x40647220, 0x00000003, 0x4062C422, 0x4063B820, + 0x40647220, 0x00000003, 0x4062C423, 0x4063B820, 0x40647220, 0x00000003, + 0x4062C421, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C422, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062C423, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062C424, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C425, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062C426, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062C427, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C428, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062C429, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062C42A, 0x4063B820, 0x40648C20, 0x00000003, + // Block 567, offset 0x8dc0 + 0x4062C42B, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C42C, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062C42D, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062C42E, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C42F, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062C430, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062C431, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C432, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062C433, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062C434, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C435, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062C436, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062C437, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C438, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062C439, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062C43A, 0x4063B820, 0x40648C20, 0x00000003, + // Block 568, offset 0x8e00 + 0x4062C43B, 0x4063B820, 0x40648C20, 0x00000002, 0x4062C421, 0x4063BA20, + 0x00000002, 0x4062C422, 0x4063BA20, 0x00000002, 0x4062C423, 0x4063BA20, + 0x00000002, 0x4062C424, 0x4063BA20, 0x00000002, 0x4062C425, 0x4063BA20, + 0x00000002, 0x4062C426, 0x4063BA20, 0x00000002, 0x4062C427, 0x4063BA20, + 0x00000002, 0x4062C428, 0x4063BA20, 0x00000002, 0x4062C429, 0x4063BA20, + 0x00000002, 0x4062C421, 0x4063BE20, 0x00000002, 0x4062C421, 0x4063C220, + 0x00000002, 0x4062C422, 0x4063C220, 0x00000002, 0x4062C423, 0x4063C220, + 0x00000002, 0x4062C424, 0x4063C220, 0x00000002, 0x4062C425, 0x4063C220, + 0x00000002, 0x4062C426, 0x4063C220, 0x00000002, 0x4062C427, 0x4063C220, + 0x00000002, 0x4062C428, 0x4063C220, 0x00000002, 0x4062C429, 0x4063C220, + 0x00000002, 0x4062C42A, 0x4063C220, 0x00000002, + // Block 569, offset 0x8e40 + 0x4062C42B, 0x4063C220, 0x00000002, 0x4062C42C, 0x4063C220, 0x00000002, + 0x4062C42D, 0x4063C220, 0x00000002, 0x4062C42E, 0x4063C220, 0x00000002, + 0x4062C42F, 0x4063C220, 0x00000002, 0x4062C430, 0x4063C220, 0x00000002, + 0x4062C431, 0x4063C220, 0x00000002, 0x4062C432, 0x4063C220, 0x00000002, + 0x4062C433, 0x4063C220, 0x00000002, 0x4062C434, 0x4063C220, 0x00000002, + 0x4062C435, 0x4063C220, 0x00000002, 0x4062C436, 0x4063C220, 0x00000002, + 0x4062C437, 0x4063C220, 0x00000002, 0x4062C438, 0x4063C220, 0x00000002, + 0x4062C439, 0x4063C220, 0x00000002, 0x4062C43A, 0x4063C220, 0x00000002, + 0x4062C43B, 0x4063C220, 0x00000002, 0x4062C43C, 0x4063C220, 0x00000002, + 0x4062C43D, 0x4063C220, 0x00000002, 0x4062C43E, 0x4063C220, 0x00000002, + 0x4062C43F, 0x4063C220, 0x00000002, 0x4062C440, + // Block 570, offset 0x8e80 + 0x4063C220, 0x00000002, 0x4062C441, 0x4063C220, 0x00000002, 0x4062C442, + 0x4063C220, 0x00000002, 0x4062C443, 0x4063C220, 0x00000002, 0x4062C444, + 0x4063C220, 0x00000002, 0x4062C445, 0x4063C220, 0x00000002, 0x4062C446, + 0x4063C220, 0x00000002, 0x4062C447, 0x4063C220, 0x00000002, 0x4062C448, + 0x4063C220, 0x00000002, 0x4062C449, 0x4063C220, 0x00000002, 0x4062C44A, + 0x4063C220, 0x00000002, 0x4062C44B, 0x4063C220, 0x00000002, 0x4062C44C, + 0x4063C220, 0x00000002, 0x4062C44D, 0x4063C220, 0x00000002, 0x4062C44E, + 0x4063C220, 0x00000002, 0x4062C44F, 0x4063C220, 0x00000002, 0x4062C450, + 0x4063C220, 0x00000002, 0x4062C451, 0x4063C220, 0x00000002, 0x4062C452, + 0x4063C220, 0x00000002, 0x4062C453, 0x4063C220, 0x00000002, 0x4062C454, + 0x4063C220, 0x00000002, 0x4062C455, 0x4063C220, + // Block 571, offset 0x8ec0 + 0x00000002, 0x4062C456, 0x4063C220, 0x00000002, 0x4062C457, 0x4063C220, + 0x00000002, 0x4062C458, 0x4063C220, 0x00000002, 0x4062C459, 0x4063C220, + 0x00000002, 0x4062C45A, 0x4063C220, 0x00000002, 0x4062C45B, 0x4063C220, + 0x00000002, 0x4062C45C, 0x4063C220, 0x00000002, 0x4062C45D, 0x4063C220, + 0x00000002, 0x4062C45E, 0x4063C220, 0x00000003, 0x4062C421, 0x4063C220, + 0x40646420, 0x00000003, 0x4062C422, 0x4063C220, 0x40646420, 0x00000003, + 0x4062C421, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C422, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062C423, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062C424, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C425, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062C426, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062C427, 0x4063C220, 0x40646A20, 0x00000003, + // Block 572, offset 0x8f00 + 0x4062C428, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C429, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062C42A, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062C42B, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C42C, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062C42D, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062C42E, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C42F, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062C430, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062C431, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C432, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062C433, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062C434, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C435, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062C436, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062C437, 0x4063C220, 0x40646A20, 0x00000003, + // Block 573, offset 0x8f40 + 0x4062C438, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C439, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062C43A, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062C43B, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C43C, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062C43D, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062C43E, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C43F, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062C440, 0x4063C220, 0x40646A20, 0x00000003, + 0x4062C441, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C442, 0x4063C220, + 0x40646A20, 0x00000003, 0x4062C421, 0x4063C220, 0x40647220, 0x00000003, + 0x4062C422, 0x4063C220, 0x40647220, 0x00000003, 0x4062C421, 0x4063C220, + 0x40648C20, 0x00000003, 0x4062C422, 0x4063C220, 0x40648C20, 0x00000003, + 0x4062C423, 0x4063C220, 0x40648C20, 0x00000003, + // Block 574, offset 0x8f80 + 0x4062C424, 0x4063C220, 0x40648C20, 0x00000003, 0x4062C425, 0x4063C220, + 0x40648C20, 0x00000003, 0x4062C421, 0x4063CC20, 0x40646420, 0x00000003, + 0x4062C422, 0x4063CC20, 0x40646420, 0x00000003, 0x4062C423, 0x4063CC20, + 0x40646420, 0x00000003, 0x4062C421, 0x4063CC20, 0x40647220, 0x00000003, + 0x4062C422, 0x4063CC20, 0x40647220, 0x00000003, 0x4062C421, 0x4063CC20, + 0x40648420, 0x00000003, 0x4062C422, 0x4063CC20, 0x40648420, 0x00000003, + 0x4062C423, 0x4063CC20, 0x40648420, 0x00000003, 0x4062C424, 0x4063CC20, + 0x40648420, 0x00000003, 0x4062C425, 0x4063CC20, 0x40648420, 0x00000003, + 0x4062C421, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062C422, 0x4063CC20, + 0x40648C20, 0x00000003, 0x4062C423, 0x4063CC20, 0x40648C20, 0x00000003, + 0x4062C424, 0x4063CC20, 0x40648C20, 0x00000003, + // Block 575, offset 0x8fc0 + 0x4062C425, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062C426, 0x4063CC20, + 0x40648C20, 0x00000003, 0x4062C427, 0x4063CC20, 0x40648C20, 0x00000003, + 0x4062C428, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062C429, 0x4063CC20, + 0x40648C20, 0x00000003, 0x4062C42A, 0x4063CC20, 0x40648C20, 0x00000003, + 0x4062C42B, 0x4063CC20, 0x40648C20, 0x00000003, 0x4062C42C, 0x4063CC20, + 0x40648C20, 0x00000003, 0x4062C42D, 0x4063CC20, 0x40648C20, 0x00000003, + 0x4062C42E, 0x4063CC20, 0x40648C20, 0x00000002, 0x4062C421, 0x4063D020, + 0x00000002, 0x4062C422, 0x4063D020, 0x00000002, 0x4062C423, 0x4063D020, + 0x00000002, 0x4062C424, 0x4063D020, 0x00000002, 0x4062C425, 0x4063D020, + 0x00000002, 0x4062C426, 0x4063D020, 0x00000002, 0x4062C427, 0x4063D020, + 0x00000002, 0x4062C428, 0x4063D020, 0x00000002, + // Block 576, offset 0x9000 + 0x4062C429, 0x4063D020, 0x00000002, 0x4062C42A, 0x4063D020, 0x00000002, + 0x4062C42B, 0x4063D020, 0x00000002, 0x4062C42C, 0x4063D020, 0x00000002, + 0x4062C42D, 0x4063D020, 0x00000002, 0x4062C42E, 0x4063D020, 0x00000002, + 0x4062C42F, 0x4063D020, 0x00000002, 0x4062C430, 0x4063D020, 0x00000002, + 0x4062C431, 0x4063D020, 0x00000002, 0x4062C432, 0x4063D020, 0x00000002, + 0x4062C433, 0x4063D020, 0x00000002, 0x4062C434, 0x4063D020, 0x00000002, + 0x4062C435, 0x4063D020, 0x00000002, 0x4062C436, 0x4063D020, 0x00000002, + 0x4062C437, 0x4063D020, 0x00000002, 0x4062C438, 0x4063D020, 0x00000002, + 0x4062C439, 0x4063D020, 0x00000002, 0x4062C43A, 0x4063D020, 0x00000002, + 0x4062C43B, 0x4063D020, 0x00000002, 0x4062C43C, 0x4063D020, 0x00000002, + 0x4062C43D, 0x4063D020, 0x00000002, 0x4062C43E, + // Block 577, offset 0x9040 + 0x4063D020, 0x00000002, 0x4062C43F, 0x4063D020, 0x00000002, 0x4062C440, + 0x4063D020, 0x00000002, 0x4062C441, 0x4063D020, 0x00000002, 0x4062C442, + 0x4063D020, 0x00000002, 0x4062C443, 0x4063D020, 0x00000002, 0x4062C444, + 0x4063D020, 0x00000002, 0x4062C445, 0x4063D020, 0x00000002, 0x4062C446, + 0x4063D020, 0x00000002, 0x4062C447, 0x4063D020, 0x00000002, 0x4062C448, + 0x4063D020, 0x00000002, 0x4062C449, 0x4063D020, 0x00000002, 0x4062C44A, + 0x4063D020, 0x00000002, 0x4062C44B, 0x4063D020, 0x00000002, 0x4062C44C, + 0x4063D020, 0x00000002, 0x4062C44D, 0x4063D020, 0x00000002, 0x4062C44E, + 0x4063D020, 0x00000002, 0x4062C44F, 0x4063D020, 0x00000002, 0x4062C450, + 0x4063D020, 0x00000003, 0x4062C421, 0x4063D020, 0x40646420, 0x00000003, + 0x4062C422, 0x4063D020, 0x40646420, 0x00000003, + // Block 578, offset 0x9080 + 0x4062C423, 0x4063D020, 0x40646420, 0x00000003, 0x4062C424, 0x4063D020, + 0x40646420, 0x00000003, 0x4062C425, 0x4063D020, 0x40646420, 0x00000003, + 0x4062C426, 0x4063D020, 0x40646420, 0x00000003, 0x4062C421, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062C422, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062C423, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C424, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062C425, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062C426, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C427, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062C428, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062C429, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C42A, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062C42B, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062C42C, 0x4063D020, 0x40646A20, 0x00000003, + // Block 579, offset 0x90c0 + 0x4062C42D, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C42E, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062C42F, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062C430, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C431, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062C432, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062C433, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C434, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062C435, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062C436, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C437, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062C438, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062C439, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C43A, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062C43B, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062C43C, 0x4063D020, 0x40646A20, 0x00000003, + // Block 580, offset 0x9100 + 0x4062C43D, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C43E, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062C43F, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062C440, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C441, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062C442, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062C443, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C444, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062C445, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062C446, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C447, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062C448, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062C449, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C44A, 0x4063D020, + 0x40646A20, 0x00000003, 0x4062C44B, 0x4063D020, 0x40646A20, 0x00000003, + 0x4062C44C, 0x4063D020, 0x40646A20, 0x00000003, + // Block 581, offset 0x9140 + 0x4062C421, 0x4063D020, 0x40647220, 0x00000003, 0x4062C422, 0x4063D020, + 0x40647220, 0x00000003, 0x4062C423, 0x4063D020, 0x40647220, 0x00000003, + 0x4062C424, 0x4063D020, 0x40647220, 0x00000003, 0x4062C425, 0x4063D020, + 0x40647220, 0x00000003, 0x4062C426, 0x4063D020, 0x40647220, 0x00000003, + 0x4062C427, 0x4063D020, 0x40647220, 0x00000003, 0x4062C428, 0x4063D020, + 0x40647220, 0x00000003, 0x4062C429, 0x4063D020, 0x40647220, 0x00000003, + 0x4062C42A, 0x4063D020, 0x40647220, 0x00000003, 0x4062C42B, 0x4063D020, + 0x40647220, 0x00000003, 0x4062C42C, 0x4063D020, 0x40647220, 0x00000003, + 0x4062C42D, 0x4063D020, 0x40647220, 0x00000003, 0x4062C42E, 0x4063D020, + 0x40647220, 0x00000003, 0x4062C42F, 0x4063D020, 0x40647220, 0x00000003, + 0x4062C430, 0x4063D020, 0x40647220, 0x00000003, + // Block 582, offset 0x9180 + 0x4062C431, 0x4063D020, 0x40647220, 0x00000003, 0x4062C432, 0x4063D020, + 0x40647220, 0x00000003, 0x4062C433, 0x4063D020, 0x40647220, 0x00000003, + 0x4062C434, 0x4063D020, 0x40647220, 0x00000003, 0x4062C421, 0x4063D020, + 0x40648220, 0x00000003, 0x4062C422, 0x4063D020, 0x40648220, 0x00000003, + 0x4062C423, 0x4063D020, 0x40648220, 0x00000003, 0x4062C421, 0x4063D020, + 0x40648420, 0x00000003, 0x4062C422, 0x4063D020, 0x40648420, 0x00000003, + 0x4062C423, 0x4063D020, 0x40648420, 0x00000003, 0x4062C424, 0x4063D020, + 0x40648420, 0x00000003, 0x4062C425, 0x4063D020, 0x40648420, 0x00000003, + 0x4062C426, 0x4063D020, 0x40648420, 0x00000003, 0x4062C427, 0x4063D020, + 0x40648420, 0x00000003, 0x4062C428, 0x4063D020, 0x40648420, 0x00000003, + 0x4062C421, 0x4063D020, 0x40648C20, 0x00000003, + // Block 583, offset 0x91c0 + 0x4062C422, 0x4063D020, 0x40648C20, 0x00000003, 0x4062C423, 0x4063D020, + 0x40648C20, 0x00000003, 0x4062C424, 0x4063D020, 0x40648C20, 0x00000003, + 0x4062C425, 0x4063D020, 0x40648C20, 0x00000003, 0x4062C426, 0x4063D020, + 0x40648C20, 0x00000003, 0x4062C427, 0x4063D020, 0x40648C20, 0x00000002, + 0x4062C821, 0x4063A820, 0x00000002, 0x4062C822, 0x4063A820, 0x00000002, + 0x4062C823, 0x4063A820, 0x00000002, 0x4062C824, 0x4063A820, 0x00000002, + 0x4062C825, 0x4063A820, 0x00000002, 0x4062C826, 0x4063A820, 0x00000002, + 0x4062C827, 0x4063A820, 0x00000002, 0x4062C828, 0x4063A820, 0x00000002, + 0x4062C829, 0x4063A820, 0x00000002, 0x4062C82A, 0x4063A820, 0x00000002, + 0x4062C82B, 0x4063A820, 0x00000002, 0x4062C82C, 0x4063A820, 0x00000002, + 0x4062C82D, 0x4063A820, 0x00000002, 0x4062C82E, + // Block 584, offset 0x9200 + 0x4063A820, 0x00000002, 0x4062C82F, 0x4063A820, 0x00000002, 0x4062C830, + 0x4063A820, 0x00000002, 0x4062C831, 0x4063A820, 0x00000002, 0x4062C832, + 0x4063A820, 0x00000002, 0x4062C833, 0x4063A820, 0x00000002, 0x4062C834, + 0x4063A820, 0x00000002, 0x4062C835, 0x4063A820, 0x00000002, 0x4062C836, + 0x4063A820, 0x00000003, 0x4062C821, 0x4063A820, 0x40646420, 0x00000003, + 0x4062C822, 0x4063A820, 0x40646420, 0x00000003, 0x4062C823, 0x4063A820, + 0x40646420, 0x00000003, 0x4062C824, 0x4063A820, 0x40646420, 0x00000003, + 0x4062C825, 0x4063A820, 0x40646420, 0x00000003, 0x4062C826, 0x4063A820, + 0x40646420, 0x00000003, 0x4062C827, 0x4063A820, 0x40646420, 0x00000003, + 0x4062C828, 0x4063A820, 0x40646420, 0x00000003, 0x4062C829, 0x4063A820, + 0x40646420, 0x00000003, 0x4062C82A, 0x4063A820, + // Block 585, offset 0x9240 + 0x40646420, 0x00000003, 0x4062C821, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062C822, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C823, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062C824, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062C825, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C826, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062C827, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062C828, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C829, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062C82A, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062C82B, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C82C, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062C82D, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062C82E, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C82F, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062C830, 0x4063A820, + // Block 586, offset 0x9280 + 0x40646A20, 0x00000003, 0x4062C831, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062C832, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C833, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062C834, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062C835, 0x4063A820, 0x40646A20, 0x00000003, 0x4062C836, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062C837, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062C821, 0x4063A820, 0x40647220, 0x00000003, 0x4062C822, 0x4063A820, + 0x40647220, 0x00000003, 0x4062C823, 0x4063A820, 0x40647220, 0x00000003, + 0x4062C824, 0x4063A820, 0x40647220, 0x00000003, 0x4062C825, 0x4063A820, + 0x40647220, 0x00000003, 0x4062C826, 0x4063A820, 0x40647220, 0x00000003, + 0x4062C827, 0x4063A820, 0x40647220, 0x00000003, 0x4062C821, 0x4063A820, + 0x40648220, 0x00000003, 0x4062C822, 0x4063A820, + // Block 587, offset 0x92c0 + 0x40648220, 0x00000003, 0x4062C823, 0x4063A820, 0x40648220, 0x00000003, + 0x4062C824, 0x4063A820, 0x40648220, 0x00000003, 0x4062C825, 0x4063A820, + 0x40648220, 0x00000003, 0x4062C826, 0x4063A820, 0x40648220, 0x00000003, + 0x4062C827, 0x4063A820, 0x40648220, 0x00000003, 0x4062C828, 0x4063A820, + 0x40648220, 0x00000003, 0x4062C829, 0x4063A820, 0x40648220, 0x00000003, + 0x4062C82A, 0x4063A820, 0x40648220, 0x00000003, 0x4062C82B, 0x4063A820, + 0x40648220, 0x00000003, 0x4062C82C, 0x4063A820, 0x40648220, 0x00000003, + 0x4062C82D, 0x4063A820, 0x40648220, 0x00000003, 0x4062C82E, 0x4063A820, + 0x40648220, 0x00000003, 0x4062C82F, 0x4063A820, 0x40648220, 0x00000003, + 0x4062C830, 0x4063A820, 0x40648220, 0x00000003, 0x4062C831, 0x4063A820, + 0x40648220, 0x00000003, 0x4062C832, 0x4063A820, + // Block 588, offset 0x9300 + 0x40648220, 0x00000003, 0x4062C833, 0x4063A820, 0x40648220, 0x00000003, + 0x4062C834, 0x4063A820, 0x40648220, 0x00000003, 0x4062C835, 0x4063A820, + 0x40648220, 0x00000003, 0x4062C836, 0x4063A820, 0x40648220, 0x00000003, + 0x4062C837, 0x4063A820, 0x40648220, 0x00000003, 0x4062C838, 0x4063A820, + 0x40648220, 0x00000003, 0x4062C839, 0x4063A820, 0x40648220, 0x00000003, + 0x4062C83A, 0x4063A820, 0x40648220, 0x00000003, 0x4062C821, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062C822, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062C823, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C824, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062C825, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062C826, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C827, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062C828, 0x4063A820, + // Block 589, offset 0x9340 + 0x40648C20, 0x00000003, 0x4062C829, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062C82A, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C82B, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062C82C, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062C82D, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C82E, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062C82F, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062C830, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C831, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062C832, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062C833, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C834, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062C835, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062C836, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C837, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062C838, 0x4063A820, + // Block 590, offset 0x9380 + 0x40648C20, 0x00000003, 0x4062C839, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062C83A, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C83B, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062C83C, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062C83D, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C83E, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062C83F, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062C840, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C841, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062C842, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062C843, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C844, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062C845, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062C846, 0x4063A820, 0x40648C20, 0x00000003, 0x4062C847, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062C848, 0x4063A820, + // Block 591, offset 0x93c0 + 0x40648C20, 0x00000003, 0x4062C849, 0x4063A820, 0x40648C20, 0x00000002, + 0x4062C821, 0x4063AA20, 0x00000002, 0x4062C822, 0x4063AA20, 0x00000002, + 0x4062C823, 0x4063AA20, 0x00000002, 0x4062C824, 0x4063AA20, 0x00000002, + 0x4062C825, 0x4063AA20, 0x00000002, 0x4062C826, 0x4063AA20, 0x00000002, + 0x4062C827, 0x4063AA20, 0x00000002, 0x4062C828, 0x4063AA20, 0x00000002, + 0x4062C829, 0x4063AA20, 0x00000002, 0x4062C82A, 0x4063AA20, 0x00000002, + 0x4062C82B, 0x4063AA20, 0x00000002, 0x4062C82C, 0x4063AA20, 0x00000002, + 0x4062C82D, 0x4063AA20, 0x00000002, 0x4062C82E, 0x4063AA20, 0x00000003, + 0x4062C821, 0x4063AA20, 0x40646420, 0x00000003, 0x4062C822, 0x4063AA20, + 0x40646420, 0x00000003, 0x4062C823, 0x4063AA20, 0x40646420, 0x00000003, + 0x4062C824, 0x4063AA20, 0x40646420, 0x00000003, + // Block 592, offset 0x9400 + 0x4062C825, 0x4063AA20, 0x40646420, 0x00000003, 0x4062C826, 0x4063AA20, + 0x40646420, 0x00000003, 0x4062C827, 0x4063AA20, 0x40646420, 0x00000003, + 0x4062C828, 0x4063AA20, 0x40646420, 0x00000003, 0x4062C829, 0x4063AA20, + 0x40646420, 0x00000003, 0x4062C82A, 0x4063AA20, 0x40646420, 0x00000002, + 0x4062C821, 0x4063B020, 0x00000002, 0x4062C822, 0x4063B020, 0x00000002, + 0x4062C823, 0x4063B020, 0x00000002, 0x4062C824, 0x4063B020, 0x00000002, + 0x4062C825, 0x4063B020, 0x00000002, 0x4062C826, 0x4063B020, 0x00000002, + 0x4062C827, 0x4063B020, 0x00000002, 0x4062C828, 0x4063B020, 0x00000002, + 0x4062C829, 0x4063B020, 0x00000003, 0x4062C821, 0x4063B020, 0x40646420, + 0x00000003, 0x4062C822, 0x4063B020, 0x40646420, 0x00000003, 0x4062C823, + 0x4063B020, 0x40646420, 0x00000003, 0x4062C824, + // Block 593, offset 0x9440 + 0x4063B020, 0x40646420, 0x00000003, 0x4062C825, 0x4063B020, 0x40646420, + 0x00000003, 0x4062C826, 0x4063B020, 0x40646420, 0x00000003, 0x4062C827, + 0x4063B020, 0x40646420, 0x00000003, 0x4062C828, 0x4063B020, 0x40646420, + 0x00000003, 0x4062C829, 0x4063B020, 0x40646420, 0x00000003, 0x4062C82A, + 0x4063B020, 0x40646420, 0x00000003, 0x4062C82B, 0x4063B020, 0x40646420, + 0x00000003, 0x4062C82C, 0x4063B020, 0x40646420, 0x00000003, 0x4062C82D, + 0x4063B020, 0x40646420, 0x00000003, 0x4062C82E, 0x4063B020, 0x40646420, + 0x00000003, 0x4062C82F, 0x4063B020, 0x40646420, 0x00000003, 0x4062C830, + 0x4063B020, 0x40646420, 0x00000003, 0x4062C831, 0x4063B020, 0x40646420, + 0x00000003, 0x4062C832, 0x4063B020, 0x40646420, 0x00000003, 0x4062C833, + 0x4063B020, 0x40646420, 0x00000003, 0x4062C834, + // Block 594, offset 0x9480 + 0x4063B020, 0x40646420, 0x00000003, 0x4062C835, 0x4063B020, 0x40646420, + 0x00000003, 0x4062C836, 0x4063B020, 0x40646420, 0x00000003, 0x4062C837, + 0x4063B020, 0x40646420, 0x00000003, 0x4062C821, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062C822, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C823, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062C824, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062C825, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C826, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062C827, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062C828, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C829, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062C82A, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062C82B, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C82C, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062C82D, + // Block 595, offset 0x94c0 + 0x4063B020, 0x40646A20, 0x00000003, 0x4062C82E, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062C82F, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C830, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062C831, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062C832, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C833, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062C834, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062C835, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C836, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062C837, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062C838, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C839, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062C83A, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062C83B, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C83C, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062C83D, + // Block 596, offset 0x9500 + 0x4063B020, 0x40646A20, 0x00000003, 0x4062C83E, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062C83F, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C840, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062C841, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062C842, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C843, + 0x4063B020, 0x40646A20, 0x00000003, 0x4062C844, 0x4063B020, 0x40646A20, + 0x00000003, 0x4062C845, 0x4063B020, 0x40646A20, 0x00000003, 0x4062C821, + 0x4063B020, 0x40647220, 0x00000003, 0x4062C822, 0x4063B020, 0x40647220, + 0x00000003, 0x4062C823, 0x4063B020, 0x40647220, 0x00000003, 0x4062C824, + 0x4063B020, 0x40647220, 0x00000003, 0x4062C825, 0x4063B020, 0x40647220, + 0x00000003, 0x4062C826, 0x4063B020, 0x40647220, 0x00000003, 0x4062C827, + 0x4063B020, 0x40647220, 0x00000003, 0x4062C828, + // Block 597, offset 0x9540 + 0x4063B020, 0x40647220, 0x00000003, 0x4062C829, 0x4063B020, 0x40647220, + 0x00000003, 0x4062C82A, 0x4063B020, 0x40647220, 0x00000003, 0x4062C82B, + 0x4063B020, 0x40647220, 0x00000003, 0x4062C82C, 0x4063B020, 0x40647220, + 0x00000003, 0x4062C82D, 0x4063B020, 0x40647220, 0x00000003, 0x4062C82E, + 0x4063B020, 0x40647220, 0x00000003, 0x4062C82F, 0x4063B020, 0x40647220, + 0x00000003, 0x4062C830, 0x4063B020, 0x40647220, 0x00000003, 0x4062C831, + 0x4063B020, 0x40647220, 0x00000003, 0x4062C832, 0x4063B020, 0x40647220, + 0x00000003, 0x4062C833, 0x4063B020, 0x40647220, 0x00000003, 0x4062C834, + 0x4063B020, 0x40647220, 0x00000003, 0x4062C821, 0x4063B020, 0x40648220, + 0x00000003, 0x4062C822, 0x4063B020, 0x40648220, 0x00000003, 0x4062C823, + 0x4063B020, 0x40648220, 0x00000003, 0x4062C824, + // Block 598, offset 0x9580 + 0x4063B020, 0x40648220, 0x00000003, 0x4062C825, 0x4063B020, 0x40648220, + 0x00000003, 0x4062C826, 0x4063B020, 0x40648220, 0x00000003, 0x4062C827, + 0x4063B020, 0x40648220, 0x00000003, 0x4062C828, 0x4063B020, 0x40648220, + 0x00000003, 0x4062C829, 0x4063B020, 0x40648220, 0x00000003, 0x4062C82A, + 0x4063B020, 0x40648220, 0x00000003, 0x4062C82B, 0x4063B020, 0x40648220, + 0x00000003, 0x4062C82C, 0x4063B020, 0x40648220, 0x00000003, 0x4062C82D, + 0x4063B020, 0x40648220, 0x00000003, 0x4062C82E, 0x4063B020, 0x40648220, + 0x00000003, 0x4062C82F, 0x4063B020, 0x40648220, 0x00000003, 0x4062C830, + 0x4063B020, 0x40648220, 0x00000003, 0x4062C831, 0x4063B020, 0x40648220, + 0x00000003, 0x4062C832, 0x4063B020, 0x40648220, 0x00000003, 0x4062C821, + 0x4063B020, 0x40648420, 0x00000003, 0x4062C822, + // Block 599, offset 0x95c0 + 0x4063B020, 0x40648420, 0x00000003, 0x4062C823, 0x4063B020, 0x40648420, + 0x00000003, 0x4062C824, 0x4063B020, 0x40648420, 0x00000003, 0x4062C825, + 0x4063B020, 0x40648420, 0x00000003, 0x4062C826, 0x4063B020, 0x40648420, + 0x00000003, 0x4062C827, 0x4063B020, 0x40648420, 0x00000003, 0x4062C828, + 0x4063B020, 0x40648420, 0x00000003, 0x4062C829, 0x4063B020, 0x40648420, + 0x00000003, 0x4062C82A, 0x4063B020, 0x40648420, 0x00000003, 0x4062C82B, + 0x4063B020, 0x40648420, 0x00000003, 0x4062C82C, 0x4063B020, 0x40648420, + 0x00000003, 0x4062C82D, 0x4063B020, 0x40648420, 0x00000003, 0x4062C82E, + 0x4063B020, 0x40648420, 0x00000003, 0x4062C82F, 0x4063B020, 0x40648420, + 0x00000003, 0x4062C821, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C822, + 0x4063B020, 0x40648C20, 0x00000003, 0x4062C823, + // Block 600, offset 0x9600 + 0x4063B020, 0x40648C20, 0x00000003, 0x4062C824, 0x4063B020, 0x40648C20, + 0x00000003, 0x4062C825, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C826, + 0x4063B020, 0x40648C20, 0x00000003, 0x4062C827, 0x4063B020, 0x40648C20, + 0x00000003, 0x4062C828, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C829, + 0x4063B020, 0x40648C20, 0x00000003, 0x4062C82A, 0x4063B020, 0x40648C20, + 0x00000003, 0x4062C82B, 0x4063B020, 0x40648C20, 0x00000003, 0x4062C82C, + 0x4063B020, 0x40648C20, 0x00000002, 0x4062C821, 0x4063B220, 0x00000002, + 0x4062C822, 0x4063B220, 0x00000002, 0x4062C823, 0x4063B220, 0x00000002, + 0x4062C824, 0x4063B220, 0x00000002, 0x4062C825, 0x4063B220, 0x00000002, + 0x4062C826, 0x4063B220, 0x00000002, 0x4062C827, 0x4063B220, 0x00000002, + 0x4062C828, 0x4063B220, 0x00000002, 0x4062C829, + // Block 601, offset 0x9640 + 0x4063B220, 0x00000002, 0x4062C82A, 0x4063B220, 0x00000002, 0x4062C82B, + 0x4063B220, 0x00000002, 0x4062C82C, 0x4063B220, 0x00000002, 0x4062C82D, + 0x4063B220, 0x00000002, 0x4062C82E, 0x4063B220, 0x00000002, 0x4062C82F, + 0x4063B220, 0x00000002, 0x4062C830, 0x4063B220, 0x00000002, 0x4062C831, + 0x4063B220, 0x00000002, 0x4062C832, 0x4063B220, 0x00000002, 0x4062C833, + 0x4063B220, 0x00000002, 0x4062C834, 0x4063B220, 0x00000002, 0x4062C821, + 0x4063B820, 0x00000002, 0x4062C822, 0x4063B820, 0x00000002, 0x4062C823, + 0x4063B820, 0x00000002, 0x4062C824, 0x4063B820, 0x00000002, 0x4062C825, + 0x4063B820, 0x00000002, 0x4062C826, 0x4063B820, 0x00000002, 0x4062C827, + 0x4063B820, 0x00000002, 0x4062C828, 0x4063B820, 0x00000002, 0x4062C829, + 0x4063B820, 0x00000002, 0x4062C82A, 0x4063B820, + // Block 602, offset 0x9680 + 0x00000002, 0x4062C82B, 0x4063B820, 0x00000002, 0x4062C82C, 0x4063B820, + 0x00000002, 0x4062C82D, 0x4063B820, 0x00000002, 0x4062C82E, 0x4063B820, + 0x00000002, 0x4062C82F, 0x4063B820, 0x00000002, 0x4062C830, 0x4063B820, + 0x00000002, 0x4062C831, 0x4063B820, 0x00000002, 0x4062C832, 0x4063B820, + 0x00000002, 0x4062C833, 0x4063B820, 0x00000002, 0x4062C834, 0x4063B820, + 0x00000002, 0x4062C835, 0x4063B820, 0x00000002, 0x4062C836, 0x4063B820, + 0x00000002, 0x4062C837, 0x4063B820, 0x00000002, 0x4062C838, 0x4063B820, + 0x00000002, 0x4062C839, 0x4063B820, 0x00000002, 0x4062C83A, 0x4063B820, + 0x00000002, 0x4062C83B, 0x4063B820, 0x00000002, 0x4062C83C, 0x4063B820, + 0x00000002, 0x4062C83D, 0x4063B820, 0x00000002, 0x4062C83E, 0x4063B820, + 0x00000002, 0x4062C83F, 0x4063B820, 0x00000002, + // Block 603, offset 0x96c0 + 0x4062C840, 0x4063B820, 0x00000002, 0x4062C841, 0x4063B820, 0x00000002, + 0x4062C842, 0x4063B820, 0x00000002, 0x4062C843, 0x4063B820, 0x00000002, + 0x4062C844, 0x4063B820, 0x00000002, 0x4062C845, 0x4063B820, 0x00000002, + 0x4062C846, 0x4063B820, 0x00000002, 0x4062C847, 0x4063B820, 0x00000002, + 0x4062C848, 0x4063B820, 0x00000002, 0x4062C849, 0x4063B820, 0x00000002, + 0x4062C84A, 0x4063B820, 0x00000002, 0x4062C84B, 0x4063B820, 0x00000002, + 0x4062C84C, 0x4063B820, 0x00000002, 0x4062C84D, 0x4063B820, 0x00000002, + 0x4062C84E, 0x4063B820, 0x00000002, 0x4062C84F, 0x4063B820, 0x00000002, + 0x4062C850, 0x4063B820, 0x00000002, 0x4062C851, 0x4063B820, 0x00000002, + 0x4062C852, 0x4063B820, 0x00000002, 0x4062C853, 0x4063B820, 0x00000002, + 0x4062C854, 0x4063B820, 0x00000002, 0x4062C855, + // Block 604, offset 0x9700 + 0x4063B820, 0x00000002, 0x4062C856, 0x4063B820, 0x00000002, 0x4062C857, + 0x4063B820, 0x00000002, 0x4062C858, 0x4063B820, 0x00000003, 0x4062C821, + 0x4063B820, 0x40646420, 0x00000003, 0x4062C822, 0x4063B820, 0x40646420, + 0x00000003, 0x4062C823, 0x4063B820, 0x40646420, 0x00000003, 0x4062C824, + 0x4063B820, 0x40646420, 0x00000003, 0x4062C825, 0x4063B820, 0x40646420, + 0x00000003, 0x4062C826, 0x4063B820, 0x40646420, 0x00000003, 0x4062C827, + 0x4063B820, 0x40646420, 0x00000003, 0x4062C828, 0x4063B820, 0x40646420, + 0x00000003, 0x4062C829, 0x4063B820, 0x40646420, 0x00000003, 0x4062C82A, + 0x4063B820, 0x40646420, 0x00000003, 0x4062C82B, 0x4063B820, 0x40646420, + 0x00000003, 0x4062C82C, 0x4063B820, 0x40646420, 0x00000003, 0x4062C821, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062C822, + // Block 605, offset 0x9740 + 0x4063B820, 0x40646A20, 0x00000003, 0x4062C823, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062C824, 0x4063B820, 0x40646A20, 0x00000003, 0x4062C825, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062C821, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062C822, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C823, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062C824, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062C825, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C826, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062C827, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062C828, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C829, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062C82A, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062C82B, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C82C, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062C82D, + // Block 606, offset 0x9780 + 0x4063B820, 0x40648C20, 0x00000003, 0x4062C82E, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062C82F, 0x4063B820, 0x40648C20, 0x00000003, 0x4062C821, + 0x4063BA20, 0x40647220, 0x00000002, 0x4062C821, 0x4063BE20, 0x00000002, + 0x4062C822, 0x4063BE20, 0x00000002, 0x4062C823, 0x4063BE20, 0x00000002, + 0x4062C824, 0x4063BE20, 0x00000002, 0x4062C825, 0x4063BE20, 0x00000002, + 0x4062C826, 0x4063BE20, 0x00000002, 0x4062C827, 0x4063BE20, 0x00000002, + 0x4062C828, 0x4063BE20, 0x00000002, 0x4062C829, 0x4063BE20, 0x00000002, + 0x4062C82A, 0x4063BE20, 0x00000002, 0x4062C82B, 0x4063BE20, 0x00000002, + 0x4062C821, 0x4063C220, 0x00000002, 0x4062C822, 0x4063C220, 0x00000002, + 0x4062C823, 0x4063C220, 0x00000002, 0x4062C824, 0x4063C220, 0x00000002, + 0x4062C825, 0x4063C220, 0x00000002, 0x4062C826, + // Block 607, offset 0x97c0 + 0x4063C220, 0x00000002, 0x4062C827, 0x4063C220, 0x00000002, 0x4062C828, + 0x4063C220, 0x00000002, 0x4062C829, 0x4063C220, 0x00000002, 0x4062C82A, + 0x4063C220, 0x00000002, 0x4062C82B, 0x4063C220, 0x00000002, 0x4062C82C, + 0x4063C220, 0x00000002, 0x4062C82D, 0x4063C220, 0x00000002, 0x4062C82E, + 0x4063C220, 0x00000002, 0x4062C82F, 0x4063C220, 0x00000002, 0x4062C830, + 0x4063C220, 0x00000002, 0x4062C831, 0x4063C220, 0x00000002, 0x4062C832, + 0x4063C220, 0x00000002, 0x4062C833, 0x4063C220, 0x00000002, 0x4062C834, + 0x4063C220, 0x00000002, 0x4062C835, 0x4063C220, 0x00000002, 0x4062C836, + 0x4063C220, 0x00000002, 0x4062C837, 0x4063C220, 0x00000002, 0x4062C838, + 0x4063C220, 0x00000002, 0x4062C839, 0x4063C220, 0x00000002, 0x4062C83A, + 0x4063C220, 0x00000002, 0x4062C83B, 0x4063C220, + // Block 608, offset 0x9800 + 0x00000002, 0x4062C83C, 0x4063C220, 0x00000002, 0x4062C83D, 0x4063C220, + 0x00000002, 0x4062C83E, 0x4063C220, 0x00000002, 0x4062C83F, 0x4063C220, + 0x00000002, 0x4062C840, 0x4063C220, 0x00000002, 0x4062C841, 0x4063C220, + 0x00000002, 0x4062C842, 0x4063C220, 0x00000002, 0x4062C843, 0x4063C220, + 0x00000002, 0x4062C844, 0x4063C220, 0x00000002, 0x4062C845, 0x4063C220, + 0x00000002, 0x4062C846, 0x4063C220, 0x00000002, 0x4062C847, 0x4063C220, + 0x00000002, 0x4062C848, 0x4063C220, 0x00000002, 0x4062C849, 0x4063C220, + 0x00000002, 0x4062C84A, 0x4063C220, 0x00000002, 0x4062C84B, 0x4063C220, + 0x00000002, 0x4062C84C, 0x4063C220, 0x00000002, 0x4062C84D, 0x4063C220, + 0x00000002, 0x4062C84E, 0x4063C220, 0x00000002, 0x4062C84F, 0x4063C220, + 0x00000002, 0x4062C850, 0x4063C220, 0x00000002, + // Block 609, offset 0x9840 + 0x4062C851, 0x4063C220, 0x00000002, 0x4062C852, 0x4063C220, 0x00000002, + 0x4062C853, 0x4063C220, 0x00000003, 0x4062C821, 0x4063C220, 0x40646420, + 0x00000003, 0x4062C822, 0x4063C220, 0x40646420, 0x00000003, 0x4062C823, + 0x4063C220, 0x40646420, 0x00000003, 0x4062C824, 0x4063C220, 0x40646420, + 0x00000003, 0x4062C825, 0x4063C220, 0x40646420, 0x00000003, 0x4062C826, + 0x4063C220, 0x40646420, 0x00000003, 0x4062C827, 0x4063C220, 0x40646420, + 0x00000003, 0x4062C828, 0x4063C220, 0x40646420, 0x00000003, 0x4062C829, + 0x4063C220, 0x40646420, 0x00000003, 0x4062C82A, 0x4063C220, 0x40646420, + 0x00000003, 0x4062C82B, 0x4063C220, 0x40646420, 0x00000003, 0x4062C82C, + 0x4063C220, 0x40646420, 0x00000003, 0x4062C82D, 0x4063C220, 0x40646420, + 0x00000003, 0x4062C82E, 0x4063C220, 0x40646420, + // Block 610, offset 0x9880 + 0x00000003, 0x4062C82F, 0x4063C220, 0x40646420, 0x00000003, 0x4062C830, + 0x4063C220, 0x40646420, 0x00000003, 0x4062C831, 0x4063C220, 0x40646420, + 0x00000003, 0x4062C821, 0x4063C220, 0x40646A20, 0x00000003, 0x4062C822, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062C823, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062C821, 0x4063C220, 0x40647220, 0x00000003, 0x4062C822, + 0x4063C220, 0x40647220, 0x00000003, 0x4062C823, 0x4063C220, 0x40647220, + 0x00000003, 0x4062C824, 0x4063C220, 0x40647220, 0x00000003, 0x4062C821, + 0x4063C220, 0x40648C20, 0x00000003, 0x4062C822, 0x4063C220, 0x40648C20, + 0x00000003, 0x4062C823, 0x4063C220, 0x40648C20, 0x00000003, 0x4062C824, + 0x4063C220, 0x40648C20, 0x00000003, 0x4062C825, 0x4063C220, 0x40648C20, + 0x00000003, 0x4062C826, 0x4063C220, 0x40648C20, + // Block 611, offset 0x98c0 + 0x00000003, 0x4062C827, 0x4063C220, 0x40648C20, 0x00000003, 0x4062C828, + 0x4063C220, 0x40648C20, 0x00000003, 0x4062C829, 0x4063C220, 0x40648C20, + 0x00000002, 0x4062C821, 0x4063C620, 0x00000002, 0x4062C822, 0x4063C620, + 0x00000002, 0x4062C823, 0x4063C620, 0x00000002, 0x4062C824, 0x4063C620, + 0x00000002, 0x4062C825, 0x4063C620, 0x00000002, 0x4062C826, 0x4063C620, + 0x00000002, 0x4062C827, 0x4063C620, 0x00000002, 0x4062C828, 0x4063C620, + 0x00000002, 0x4062C829, 0x4063C620, 0x00000002, 0x4062C821, 0x4063C820, + 0x00000002, 0x4062C822, 0x4063C820, 0x00000002, 0x4062C823, 0x4063C820, + 0x00000002, 0x4062C824, 0x4063C820, 0x00000002, 0x4062C825, 0x4063C820, + 0x00000002, 0x4062C826, 0x4063C820, 0x00000002, 0x4062C827, 0x4063C820, + 0x00000002, 0x4062C828, 0x4063C820, 0x00000002, + // Block 612, offset 0x9900 + 0x4062C829, 0x4063C820, 0x00000002, 0x4062C82A, 0x4063C820, 0x00000002, + 0x4062C82B, 0x4063C820, 0x00000002, 0x4062C82C, 0x4063C820, 0x00000002, + 0x4062C82D, 0x4063C820, 0x00000002, 0x4062C82E, 0x4063C820, 0x00000002, + 0x4062C82F, 0x4063C820, 0x00000002, 0x4062C830, 0x4063C820, 0x00000002, + 0x4062C831, 0x4063C820, 0x00000003, 0x4062C821, 0x4063CC20, 0x40646420, + 0x00000003, 0x4062C822, 0x4063CC20, 0x40646420, 0x00000003, 0x4062C823, + 0x4063CC20, 0x40646420, 0x00000003, 0x4062C824, 0x4063CC20, 0x40646420, + 0x00000003, 0x4062C825, 0x4063CC20, 0x40646420, 0x00000003, 0x4062C826, + 0x4063CC20, 0x40646420, 0x00000003, 0x4062C827, 0x4063CC20, 0x40646420, + 0x00000003, 0x4062C821, 0x4063CC20, 0x40648C20, 0x00000002, 0x4062C821, + 0x4063D020, 0x00000002, 0x4062C822, 0x4063D020, + // Block 613, offset 0x9940 + 0x00000002, 0x4062C823, 0x4063D020, 0x00000002, 0x4062C824, 0x4063D020, + 0x00000002, 0x4062C825, 0x4063D020, 0x00000002, 0x4062C826, 0x4063D020, + 0x00000002, 0x4062C827, 0x4063D020, 0x00000002, 0x4062C828, 0x4063D020, + 0x00000002, 0x4062C829, 0x4063D020, 0x00000002, 0x4062C82A, 0x4063D020, + 0x00000002, 0x4062C82B, 0x4063D020, 0x00000002, 0x4062C82C, 0x4063D020, + 0x00000002, 0x4062C82D, 0x4063D020, 0x00000002, 0x4062C82E, 0x4063D020, + 0x00000002, 0x4062C82F, 0x4063D020, 0x00000002, 0x4062C830, 0x4063D020, + 0x00000002, 0x4062C831, 0x4063D020, 0x00000002, 0x4062C832, 0x4063D020, + 0x00000002, 0x4062C833, 0x4063D020, 0x00000002, 0x4062C834, 0x4063D020, + 0x00000002, 0x4062C835, 0x4063D020, 0x00000002, 0x4062C836, 0x4063D020, + 0x00000002, 0x4062C837, 0x4063D020, 0x00000002, + // Block 614, offset 0x9980 + 0x4062C838, 0x4063D020, 0x00000002, 0x4062C839, 0x4063D020, 0x00000002, + 0x4062C83A, 0x4063D020, 0x00000002, 0x4062C83B, 0x4063D020, 0x00000002, + 0x4062C83C, 0x4063D020, 0x00000002, 0x4062C83D, 0x4063D020, 0x00000002, + 0x4062C83E, 0x4063D020, 0x00000002, 0x4062C83F, 0x4063D020, 0x00000002, + 0x4062C840, 0x4063D020, 0x00000002, 0x4062C841, 0x4063D020, 0x00000002, + 0x4062C842, 0x4063D020, 0x00000002, 0x4062C843, 0x4063D020, 0x00000002, + 0x4062C844, 0x4063D020, 0x00000002, 0x4062C845, 0x4063D020, 0x00000002, + 0x4062C846, 0x4063D020, 0x00000002, 0x4062C847, 0x4063D020, 0x00000002, + 0x4062C848, 0x4063D020, 0x00000002, 0x4062C849, 0x4063D020, 0x00000002, + 0x4062C84A, 0x4063D020, 0x00000003, 0x4062C821, 0x4063D020, 0x40646420, + 0x00000003, 0x4062C822, 0x4063D020, 0x40646420, + // Block 615, offset 0x99c0 + 0x00000003, 0x4062C823, 0x4063D020, 0x40646420, 0x00000003, 0x4062C824, + 0x4063D020, 0x40646420, 0x00000003, 0x4062C821, 0x4063D020, 0x40646A20, + 0x00000003, 0x4062C822, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C823, + 0x4063D020, 0x40646A20, 0x00000003, 0x4062C824, 0x4063D020, 0x40646A20, + 0x00000003, 0x4062C825, 0x4063D020, 0x40646A20, 0x00000003, 0x4062C821, + 0x4063D020, 0x40647220, 0x00000003, 0x4062C822, 0x4063D020, 0x40647220, + 0x00000003, 0x4062C823, 0x4063D020, 0x40647220, 0x00000003, 0x4062C821, + 0x4063D020, 0x40648220, 0x00000003, 0x4062C822, 0x4063D020, 0x40648220, + 0x00000003, 0x4062C823, 0x4063D020, 0x40648220, 0x00000003, 0x4062C824, + 0x4063D020, 0x40648220, 0x00000003, 0x4062C825, 0x4063D020, 0x40648220, + 0x00000003, 0x4062C826, 0x4063D020, 0x40648220, + // Block 616, offset 0x9a00 + 0x00000003, 0x4062C827, 0x4063D020, 0x40648220, 0x00000003, 0x4062C828, + 0x4063D020, 0x40648220, 0x00000003, 0x4062C829, 0x4063D020, 0x40648220, + 0x00000003, 0x4062C82A, 0x4063D020, 0x40648220, 0x00000003, 0x4062C82B, + 0x4063D020, 0x40648220, 0x00000003, 0x4062C82C, 0x4063D020, 0x40648220, + 0x00000003, 0x4062C82D, 0x4063D020, 0x40648220, 0x00000003, 0x4062C82E, + 0x4063D020, 0x40648220, 0x00000003, 0x4062C82F, 0x4063D020, 0x40648220, + 0x00000003, 0x4062C830, 0x4063D020, 0x40648220, 0x00000003, 0x4062C821, + 0x4063D020, 0x40648420, 0x00000003, 0x4062C821, 0x4063D020, 0x40648C20, + 0x00000003, 0x4062C822, 0x4063D020, 0x40648C20, 0x00000002, 0x4062CA21, + 0x4063BC20, 0x00000002, 0x4062CA22, 0x4063BC20, 0x00000002, 0x4062CA23, + 0x4063BC20, 0x00000002, 0x4062CC21, 0x4063A820, + // Block 617, offset 0x9a40 + 0x00000002, 0x4062CC22, 0x4063A820, 0x00000002, 0x4062CC23, 0x4063A820, + 0x00000002, 0x4062CC24, 0x4063A820, 0x00000002, 0x4062CC25, 0x4063A820, + 0x00000002, 0x4062CC26, 0x4063A820, 0x00000002, 0x4062CC27, 0x4063A820, + 0x00000002, 0x4062CC28, 0x4063A820, 0x00000002, 0x4062CC29, 0x4063A820, + 0x00000002, 0x4062CC2A, 0x4063A820, 0x00000002, 0x4062CC2B, 0x4063A820, + 0x00000002, 0x4062CC2C, 0x4063A820, 0x00000002, 0x4062CC2D, 0x4063A820, + 0x00000002, 0x4062CC2E, 0x4063A820, 0x00000002, 0x4062CC2F, 0x4063A820, + 0x00000002, 0x4062CC30, 0x4063A820, 0x00000002, 0x4062CC31, 0x4063A820, + 0x00000002, 0x4062CC32, 0x4063A820, 0x00000002, 0x4062CC33, 0x4063A820, + 0x00000002, 0x4062CC34, 0x4063A820, 0x00000002, 0x4062CC35, 0x4063A820, + 0x00000002, 0x4062CC36, 0x4063A820, 0x00000002, + // Block 618, offset 0x9a80 + 0x4062CC37, 0x4063A820, 0x00000002, 0x4062CC38, 0x4063A820, 0x00000002, + 0x4062CC39, 0x4063A820, 0x00000002, 0x4062CC3A, 0x4063A820, 0x00000002, + 0x4062CC3B, 0x4063A820, 0x00000003, 0x4062CC21, 0x4063A820, 0x40646420, + 0x00000003, 0x4062CC22, 0x4063A820, 0x40646420, 0x00000003, 0x4062CC23, + 0x4063A820, 0x40646420, 0x00000003, 0x4062CC24, 0x4063A820, 0x40646420, + 0x00000003, 0x4062CC25, 0x4063A820, 0x40646420, 0x00000003, 0x4062CC26, + 0x4063A820, 0x40646420, 0x00000003, 0x4062CC27, 0x4063A820, 0x40646420, + 0x00000003, 0x4062CC28, 0x4063A820, 0x40646420, 0x00000003, 0x4062CC29, + 0x4063A820, 0x40646420, 0x00000003, 0x4062CC2A, 0x4063A820, 0x40646420, + 0x00000003, 0x4062CC2B, 0x4063A820, 0x40646420, 0x00000003, 0x4062CC2C, + 0x4063A820, 0x40646420, 0x00000003, 0x4062CC2D, + // Block 619, offset 0x9ac0 + 0x4063A820, 0x40646420, 0x00000003, 0x4062CC2E, 0x4063A820, 0x40646420, + 0x00000003, 0x4062CC2F, 0x4063A820, 0x40646420, 0x00000003, 0x4062CC30, + 0x4063A820, 0x40646420, 0x00000003, 0x4062CC31, 0x4063A820, 0x40646420, + 0x00000003, 0x4062CC32, 0x4063A820, 0x40646420, 0x00000003, 0x4062CC33, + 0x4063A820, 0x40646420, 0x00000003, 0x4062CC34, 0x4063A820, 0x40646420, + 0x00000003, 0x4062CC35, 0x4063A820, 0x40646420, 0x00000003, 0x4062CC36, + 0x4063A820, 0x40646420, 0x00000003, 0x4062CC37, 0x4063A820, 0x40646420, + 0x00000003, 0x4062CC21, 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC22, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC23, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062CC24, 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC25, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC26, + // Block 620, offset 0x9b00 + 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC27, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062CC28, 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC29, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC2A, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062CC2B, 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC2C, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC2D, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062CC2E, 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC2F, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062CC21, 0x4063A820, 0x40647220, + 0x00000003, 0x4062CC22, 0x4063A820, 0x40647220, 0x00000003, 0x4062CC23, + 0x4063A820, 0x40647220, 0x00000003, 0x4062CC21, 0x4063A820, 0x40648220, + 0x00000003, 0x4062CC22, 0x4063A820, 0x40648220, 0x00000003, 0x4062CC23, + 0x4063A820, 0x40648220, 0x00000003, 0x4062CC24, + // Block 621, offset 0x9b40 + 0x4063A820, 0x40648220, 0x00000003, 0x4062CC25, 0x4063A820, 0x40648220, + 0x00000003, 0x4062CC26, 0x4063A820, 0x40648220, 0x00000003, 0x4062CC27, + 0x4063A820, 0x40648220, 0x00000003, 0x4062CC21, 0x4063A820, 0x40648420, + 0x00000003, 0x4062CC22, 0x4063A820, 0x40648420, 0x00000003, 0x4062CC23, + 0x4063A820, 0x40648420, 0x00000003, 0x4062CC24, 0x4063A820, 0x40648420, + 0x00000003, 0x4062CC25, 0x4063A820, 0x40648420, 0x00000003, 0x4062CC26, + 0x4063A820, 0x40648420, 0x00000003, 0x4062CC21, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062CC22, 0x4063A820, 0x40648C20, 0x00000003, 0x4062CC23, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062CC24, 0x4063A820, 0x40648C20, + 0x00000003, 0x4062CC25, 0x4063A820, 0x40648C20, 0x00000003, 0x4062CC26, + 0x4063A820, 0x40648C20, 0x00000003, 0x4062CC27, + // Block 622, offset 0x9b80 + 0x4063A820, 0x40648C20, 0x00000003, 0x4062CC28, 0x4063A820, 0x40648C20, + 0x00000002, 0x4062CC21, 0x4063AA20, 0x00000002, 0x4062CC22, 0x4063AA20, + 0x00000002, 0x4062CC23, 0x4063AA20, 0x00000002, 0x4062CC24, 0x4063AA20, + 0x00000002, 0x4062CC25, 0x4063AA20, 0x00000002, 0x4062CC26, 0x4063AA20, + 0x00000002, 0x4062CC27, 0x4063AA20, 0x00000002, 0x4062CC28, 0x4063AA20, + 0x00000002, 0x4062CC29, 0x4063AA20, 0x00000002, 0x4062CC2A, 0x4063AA20, + 0x00000002, 0x4062CC2B, 0x4063AA20, 0x00000002, 0x4062CC2C, 0x4063AA20, + 0x00000002, 0x4062CC2D, 0x4063AA20, 0x00000002, 0x4062CC2E, 0x4063AA20, + 0x00000002, 0x4062CC2F, 0x4063AA20, 0x00000002, 0x4062CC30, 0x4063AA20, + 0x00000002, 0x4062CC31, 0x4063AA20, 0x00000002, 0x4062CC32, 0x4063AA20, + 0x00000002, 0x4062CC33, 0x4063AA20, 0x00000002, + // Block 623, offset 0x9bc0 + 0x4062CC34, 0x4063AA20, 0x00000002, 0x4062CC35, 0x4063AA20, 0x00000003, + 0x4062CC21, 0x4063AA20, 0x40646420, 0x00000003, 0x4062CC22, 0x4063AA20, + 0x40646420, 0x00000003, 0x4062CC21, 0x4063AA20, 0x40648C20, 0x00000003, + 0x4062CC22, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062CC23, 0x4063AA20, + 0x40648C20, 0x00000002, 0x4062CC21, 0x4063B020, 0x00000002, 0x4062CC21, + 0x4063B820, 0x00000002, 0x4062CC22, 0x4063B820, 0x00000002, 0x4062CC23, + 0x4063B820, 0x00000002, 0x4062CC24, 0x4063B820, 0x00000003, 0x4062CC21, + 0x4063B820, 0x40646A20, 0x00000003, 0x4062CC22, 0x4063B820, 0x40646A20, + 0x00000003, 0x4062CC23, 0x4063B820, 0x40646A20, 0x00000003, 0x4062CC21, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062CC22, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062CC23, 0x4063B820, 0x40648C20, + // Block 624, offset 0x9c00 + 0x00000003, 0x4062CC24, 0x4063B820, 0x40648C20, 0x00000003, 0x4062CC25, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062CC26, 0x4063B820, 0x40648C20, + 0x00000003, 0x4062CC27, 0x4063B820, 0x40648C20, 0x00000003, 0x4062CC28, + 0x4063B820, 0x40648C20, 0x00000003, 0x4062CC29, 0x4063B820, 0x40648C20, + 0x00000002, 0x4062CC21, 0x4063BE20, 0x00000002, 0x4062CC22, 0x4063BE20, + 0x00000002, 0x4062CC23, 0x4063BE20, 0x00000002, 0x4062CC24, 0x4063BE20, + 0x00000002, 0x4062CC25, 0x4063BE20, 0x00000002, 0x4062CC26, 0x4063BE20, + 0x00000002, 0x4062CC27, 0x4063BE20, 0x00000002, 0x4062CC21, 0x4063C220, + 0x00000002, 0x4062CC22, 0x4063C220, 0x00000002, 0x4062CC23, 0x4063C220, + 0x00000002, 0x4062CC24, 0x4063C220, 0x00000002, 0x4062CC25, 0x4063C220, + 0x00000002, 0x4062CC26, 0x4063C220, 0x00000002, + // Block 625, offset 0x9c40 + 0x4062CC27, 0x4063C220, 0x00000002, 0x4062CC28, 0x4063C220, 0x00000002, + 0x4062CC29, 0x4063C220, 0x00000003, 0x4062CC21, 0x4063C220, 0x40648C20, + 0x00000003, 0x4062CC21, 0x4063CC20, 0x40646420, 0x00000003, 0x4062CC22, + 0x4063CC20, 0x40646420, 0x00000003, 0x4062CC23, 0x4063CC20, 0x40646420, + 0x00000003, 0x4062CC21, 0x4063CC20, 0x40648220, 0x00000002, 0x4062CE21, + 0x4063A820, 0x00000002, 0x4062CE22, 0x4063A820, 0x00000002, 0x4062CE23, + 0x4063A820, 0x00000002, 0x4062CE24, 0x4063A820, 0x00000002, 0x4062CE25, + 0x4063A820, 0x00000002, 0x4062CE26, 0x4063A820, 0x00000002, 0x4062CE27, + 0x4063A820, 0x00000002, 0x4062CE28, 0x4063A820, 0x00000002, 0x4062CE29, + 0x4063A820, 0x00000002, 0x4062CE2A, 0x4063A820, 0x00000002, 0x4062CE2B, + 0x4063A820, 0x00000002, 0x4062CE2C, 0x4063A820, + // Block 626, offset 0x9c80 + 0x00000002, 0x4062CE2D, 0x4063A820, 0x00000002, 0x4062CE2E, 0x4063A820, + 0x00000002, 0x4062CE2F, 0x4063A820, 0x00000002, 0x4062CE30, 0x4063A820, + 0x00000002, 0x4062CE31, 0x4063A820, 0x00000002, 0x4062CE32, 0x4063A820, + 0x00000002, 0x4062CE33, 0x4063A820, 0x00000002, 0x4062CE34, 0x4063A820, + 0x00000002, 0x4062CE35, 0x4063A820, 0x00000002, 0x4062CE36, 0x4063A820, + 0x00000002, 0x4062CE37, 0x4063A820, 0x00000002, 0x4062CE38, 0x4063A820, + 0x00000002, 0x4062CE39, 0x4063A820, 0x00000002, 0x4062CE3A, 0x4063A820, + 0x00000002, 0x4062CE3B, 0x4063A820, 0x00000002, 0x4062CE3C, 0x4063A820, + 0x00000002, 0x4062CE3D, 0x4063A820, 0x00000002, 0x4062CE3E, 0x4063A820, + 0x00000003, 0x4062CE21, 0x4063A820, 0x40646A20, 0x00000003, 0x4062CE22, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062CE23, + // Block 627, offset 0x9cc0 + 0x4063A820, 0x40646A20, 0x00000003, 0x4062CE24, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062CE25, 0x4063A820, 0x40646A20, 0x00000003, 0x4062CE26, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062CE27, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062CE28, 0x4063A820, 0x40646A20, 0x00000003, 0x4062CE29, + 0x4063A820, 0x40646A20, 0x00000003, 0x4062CE2A, 0x4063A820, 0x40646A20, + 0x00000003, 0x4062CE21, 0x4063A820, 0x40647220, 0x00000003, 0x4062CE22, + 0x4063A820, 0x40647220, 0x00000003, 0x4062CE23, 0x4063A820, 0x40647220, + 0x00000003, 0x4062CE24, 0x4063A820, 0x40647220, 0x00000003, 0x4062CE25, + 0x4063A820, 0x40647220, 0x00000002, 0x4062CE21, 0x4063AA20, 0x00000002, + 0x4062CE22, 0x4063AA20, 0x00000002, 0x4062CE23, 0x4063AA20, 0x00000002, + 0x4062CE24, 0x4063AA20, 0x00000002, 0x4062CE25, + // Block 628, offset 0x9d00 + 0x4063AA20, 0x00000002, 0x4062CE26, 0x4063AA20, 0x00000002, 0x4062CE27, + 0x4063AA20, 0x00000002, 0x4062CE28, 0x4063AA20, 0x00000002, 0x4062CE29, + 0x4063AA20, 0x00000002, 0x4062CE2A, 0x4063AA20, 0x00000002, 0x4062CE2B, + 0x4063AA20, 0x00000002, 0x4062CE2C, 0x4063AA20, 0x00000002, 0x4062CE2D, + 0x4063AA20, 0x00000002, 0x4062CE2E, 0x4063AA20, 0x00000002, 0x4062CE2F, + 0x4063AA20, 0x00000002, 0x4062CE30, 0x4063AA20, 0x00000003, 0x4062CE21, + 0x4063AA20, 0x40648C20, 0x00000003, 0x4062CE22, 0x4063AA20, 0x40648C20, + 0x00000003, 0x4062CE23, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062CE24, + 0x4063AA20, 0x40648C20, 0x00000003, 0x4062CE25, 0x4063AA20, 0x40648C20, + 0x00000003, 0x4062CE26, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062CE27, + 0x4063AA20, 0x40648C20, 0x00000003, 0x4062CE28, + // Block 629, offset 0x9d40 + 0x4063AA20, 0x40648C20, 0x00000003, 0x4062CE21, 0x4063AC20, 0x40646420, + 0x00000003, 0x4062CE21, 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE22, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE23, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062CE24, 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE25, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE26, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062CE27, 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE28, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE29, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062CE2A, 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE2B, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE2C, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062CE2D, 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE2E, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE2F, + // Block 630, offset 0x9d80 + 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE30, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062CE31, 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE32, + 0x4063B420, 0x40646A20, 0x00000003, 0x4062CE33, 0x4063B420, 0x40646A20, + 0x00000003, 0x4062CE21, 0x4063B420, 0x40648220, 0x00000003, 0x4062CE22, + 0x4063B420, 0x40648220, 0x00000003, 0x4062CE23, 0x4063B420, 0x40648220, + 0x00000003, 0x4062CE21, 0x4063B420, 0x40648C20, 0x00000003, 0x4062CE22, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062CE23, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062CE24, 0x4063B420, 0x40648C20, 0x00000003, 0x4062CE25, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062CE26, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062CE27, 0x4063B420, 0x40648C20, 0x00000003, 0x4062CE28, + 0x4063B420, 0x40648C20, 0x00000003, 0x4062CE29, + // Block 631, offset 0x9dc0 + 0x4063B420, 0x40648C20, 0x00000003, 0x4062CE2A, 0x4063B420, 0x40648C20, + 0x00000003, 0x4062CE2B, 0x4063B420, 0x40648C20, 0x00000002, 0x4062CE21, + 0x4063B620, 0x00000002, 0x4062CE22, 0x4063B620, 0x00000002, 0x4062CE23, + 0x4063B620, 0x00000002, 0x4062CE24, 0x4063B620, 0x00000002, 0x4062CE25, + 0x4063B620, 0x00000002, 0x4062CE26, 0x4063B620, 0x00000002, 0x4062CE27, + 0x4063B620, 0x00000002, 0x4062CE28, 0x4063B620, 0x00000002, 0x4062CE29, + 0x4063B620, 0x00000002, 0x4062CE2A, 0x4063B620, 0x00000002, 0x4062CE2B, + 0x4063B620, 0x00000002, 0x4062CE2C, 0x4063B620, 0x00000002, 0x4062CE2D, + 0x4063B620, 0x00000002, 0x4062CE2E, 0x4063B620, 0x00000002, 0x4062CE21, + 0x4063B820, 0x00000002, 0x4062CE22, 0x4063B820, 0x00000002, 0x4062CE23, + 0x4063B820, 0x00000002, 0x4062CE24, 0x4063B820, + // Block 632, offset 0x9e00 + 0x00000002, 0x4062CE25, 0x4063B820, 0x00000002, 0x4062CE26, 0x4063B820, + 0x00000002, 0x4062CE27, 0x4063B820, 0x00000002, 0x4062CE28, 0x4063B820, + 0x00000002, 0x4062CE29, 0x4063B820, 0x00000002, 0x4062CE2A, 0x4063B820, + 0x00000002, 0x4062CE2B, 0x4063B820, 0x00000002, 0x4062CE2C, 0x4063B820, + 0x00000002, 0x4062CE2D, 0x4063B820, 0x00000002, 0x4062CE2E, 0x4063B820, + 0x00000002, 0x4062CE2F, 0x4063B820, 0x00000002, 0x4062CE30, 0x4063B820, + 0x00000002, 0x4062CE31, 0x4063B820, 0x00000002, 0x4062CE32, 0x4063B820, + 0x00000002, 0x4062CE33, 0x4063B820, 0x00000002, 0x4062CE34, 0x4063B820, + 0x00000002, 0x4062CE35, 0x4063B820, 0x00000002, 0x4062CE36, 0x4063B820, + 0x00000002, 0x4062CE37, 0x4063B820, 0x00000002, 0x4062CE38, 0x4063B820, + 0x00000002, 0x4062CE39, 0x4063B820, 0x00000002, + // Block 633, offset 0x9e40 + 0x4062CE3A, 0x4063B820, 0x00000002, 0x4062CE3B, 0x4063B820, 0x00000002, + 0x4062CE3C, 0x4063B820, 0x00000002, 0x4062CE3D, 0x4063B820, 0x00000002, + 0x4062CE3E, 0x4063B820, 0x00000002, 0x4062CE3F, 0x4063B820, 0x00000002, + 0x4062CE40, 0x4063B820, 0x00000002, 0x4062CE41, 0x4063B820, 0x00000002, + 0x4062CE42, 0x4063B820, 0x00000002, 0x4062CE43, 0x4063B820, 0x00000002, + 0x4062CE44, 0x4063B820, 0x00000002, 0x4062CE45, 0x4063B820, 0x00000002, + 0x4062CE46, 0x4063B820, 0x00000002, 0x4062CE47, 0x4063B820, 0x00000003, + 0x4062CE21, 0x4063B820, 0x40646420, 0x00000003, 0x4062CE22, 0x4063B820, + 0x40646420, 0x00000003, 0x4062CE23, 0x4063B820, 0x40646420, 0x00000003, + 0x4062CE24, 0x4063B820, 0x40646420, 0x00000003, 0x4062CE25, 0x4063B820, + 0x40646420, 0x00000002, 0x4062CE21, 0x4063C020, + // Block 634, offset 0x9e80 + 0x00000002, 0x4062CE22, 0x4063C020, 0x00000002, 0x4062CE23, 0x4063C020, + 0x00000002, 0x4062CE24, 0x4063C020, 0x00000002, 0x4062CE25, 0x4063C020, + 0x00000002, 0x4062CE26, 0x4063C020, 0x00000002, 0x4062CE27, 0x4063C020, + 0x00000002, 0x4062CE28, 0x4063C020, 0x00000002, 0x4062CE29, 0x4063C020, + 0x00000002, 0x4062CE2A, 0x4063C020, 0x00000002, 0x4062CE2B, 0x4063C020, + 0x00000002, 0x4062CE2C, 0x4063C020, 0x00000002, 0x4062CE2D, 0x4063C020, + 0x00000002, 0x4062CE2E, 0x4063C020, 0x00000002, 0x4062CE2F, 0x4063C020, + 0x00000002, 0x4062CE30, 0x4063C020, 0x00000002, 0x4062CE31, 0x4063C020, + 0x00000002, 0x4062CE32, 0x4063C020, 0x00000002, 0x4062CE33, 0x4063C020, + 0x00000002, 0x4062CE34, 0x4063C020, 0x00000002, 0x4062CE35, 0x4063C020, + 0x00000002, 0x4062CE36, 0x4063C020, 0x00000002, + // Block 635, offset 0x9ec0 + 0x4062CE37, 0x4063C020, 0x00000002, 0x4062CE38, 0x4063C020, 0x00000002, + 0x4062CE39, 0x4063C020, 0x00000002, 0x4062CE3A, 0x4063C020, 0x00000002, + 0x4062CE3B, 0x4063C020, 0x00000003, 0x4062CE21, 0x4063C220, 0x40648220, + 0x00000003, 0x4062CE22, 0x4063C220, 0x40648220, 0x00000003, 0x4062CE23, + 0x4063C220, 0x40648220, 0x00000003, 0x4062CE21, 0x4063C220, 0x40648C20, + 0x00000003, 0x4062CE22, 0x4063C220, 0x40648C20, 0x00000003, 0x4062CE23, + 0x4063C220, 0x40648C20, 0x00000003, 0x4062CE24, 0x4063C220, 0x40648C20, + 0x00000003, 0x4062CE25, 0x4063C220, 0x40648C20, 0x00000003, 0x4062CE26, + 0x4063C220, 0x40648C20, 0x00000003, 0x4062CE27, 0x4063C220, 0x40648C20, + 0x00000002, 0x4062CE21, 0x4063D020, 0x00000002, 0x4062CE22, 0x4063D020, + 0x00000002, 0x4062CE23, 0x4063D020, 0x00000002, + // Block 636, offset 0x9f00 + 0x4062CE24, 0x4063D020, 0x00000002, 0x4062CE25, 0x4063D020, 0x00000002, + 0x4062CE26, 0x4063D020, 0x00000002, 0x4062CE27, 0x4063D020, 0x00000002, + 0x4062CE28, 0x4063D020, 0x00000002, 0x4062CE29, 0x4063D020, 0x00000002, + 0x4062CE2A, 0x4063D020, 0x00000002, 0x4062CE2B, 0x4063D020, 0x00000003, + 0x4062CE21, 0x4063D020, 0x40646420, 0x00000003, 0x4062CE21, 0x4063D020, + 0x40647220, 0x00000003, 0x4062CE22, 0x4063D020, 0x40647220, 0x00000003, + 0x4062CE23, 0x4063D020, 0x40647220, 0x00000003, 0x4062CE24, 0x4063D020, + 0x40647220, 0x00000003, 0x4062CE25, 0x4063D020, 0x40647220, 0x00000003, + 0x4062CE26, 0x4063D020, 0x40647220, 0x00000003, 0x4062CE27, 0x4063D020, + 0x40647220, 0x00000003, 0x4062CE28, 0x4063D020, 0x40647220, 0x00000003, + 0x4062CE29, 0x4063D020, 0x40647220, 0x00000003, + // Block 637, offset 0x9f40 + 0x4062CE2A, 0x4063D020, 0x40647220, 0x00000003, 0x4062CE2B, 0x4063D020, + 0x40647220, 0x00000003, 0x4062CE2C, 0x4063D020, 0x40647220, 0x00000003, + 0x4062CE2D, 0x4063D020, 0x40647220, 0x00000003, 0x4062CE2E, 0x4063D020, + 0x40647220, 0x00000003, 0x4062CE2F, 0x4063D020, 0x40647220, 0x00000003, + 0x4062CE30, 0x4063D020, 0x40647220, 0x00000003, 0x4062CE31, 0x4063D020, + 0x40647220, 0x00000003, 0x4062CE32, 0x4063D020, 0x40647220, 0x00000003, + 0x4062CE33, 0x4063D020, 0x40647220, 0x00000003, 0x4062CE34, 0x4063D020, + 0x40647220, 0x00000003, 0x4062CE35, 0x4063D020, 0x40647220, 0x00000003, + 0x4062CE36, 0x4063D020, 0x40647220, 0x00000003, 0x4062CE21, 0x4063D020, + 0x40648420, 0x00000003, 0x4062CE22, 0x4063D020, 0x40648420, 0x00000003, + 0x4062CE23, 0x4063D020, 0x40648420, 0x00000002, + // Block 638, offset 0x9f80 + 0x4062D021, 0x4063A820, 0x00000002, 0x4062D022, 0x4063A820, 0x00000002, + 0x4062D023, 0x4063A820, 0x00000002, 0x4062D024, 0x4063A820, 0x00000002, + 0x4062D025, 0x4063A820, 0x00000002, 0x4062D026, 0x4063A820, 0x00000002, + 0x4062D027, 0x4063A820, 0x00000002, 0x4062D028, 0x4063A820, 0x00000002, + 0x4062D029, 0x4063A820, 0x00000002, 0x4062D02A, 0x4063A820, 0x00000002, + 0x4062D02B, 0x4063A820, 0x00000002, 0x4062D02C, 0x4063A820, 0x00000002, + 0x4062D02D, 0x4063A820, 0x00000002, 0x4062D02E, 0x4063A820, 0x00000002, + 0x4062D02F, 0x4063A820, 0x00000002, 0x4062D030, 0x4063A820, 0x00000002, + 0x4062D031, 0x4063A820, 0x00000002, 0x4062D032, 0x4063A820, 0x00000002, + 0x4062D033, 0x4063A820, 0x00000002, 0x4062D034, 0x4063A820, 0x00000002, + 0x4062D035, 0x4063A820, 0x00000002, 0x4062D036, + // Block 639, offset 0x9fc0 + 0x4063A820, 0x00000003, 0x4062D021, 0x4063A820, 0x40646420, 0x00000003, + 0x4062D022, 0x4063A820, 0x40646420, 0x00000003, 0x4062D023, 0x4063A820, + 0x40646420, 0x00000003, 0x4062D024, 0x4063A820, 0x40646420, 0x00000003, + 0x4062D025, 0x4063A820, 0x40646420, 0x00000003, 0x4062D026, 0x4063A820, + 0x40646420, 0x00000003, 0x4062D027, 0x4063A820, 0x40646420, 0x00000003, + 0x4062D028, 0x4063A820, 0x40646420, 0x00000003, 0x4062D029, 0x4063A820, + 0x40646420, 0x00000003, 0x4062D02A, 0x4063A820, 0x40646420, 0x00000003, + 0x4062D02B, 0x4063A820, 0x40646420, 0x00000003, 0x4062D021, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062D022, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062D023, 0x4063A820, 0x40646A20, 0x00000003, 0x4062D024, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062D025, 0x4063A820, + // Block 640, offset 0xa000 + 0x40646A20, 0x00000003, 0x4062D026, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062D027, 0x4063A820, 0x40646A20, 0x00000003, 0x4062D028, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062D029, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062D02A, 0x4063A820, 0x40646A20, 0x00000003, 0x4062D02B, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062D02C, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062D02D, 0x4063A820, 0x40646A20, 0x00000003, 0x4062D02E, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062D02F, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062D030, 0x4063A820, 0x40646A20, 0x00000003, 0x4062D031, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062D032, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062D033, 0x4063A820, 0x40646A20, 0x00000003, 0x4062D034, 0x4063A820, + 0x40646A20, 0x00000003, 0x4062D035, 0x4063A820, + // Block 641, offset 0xa040 + 0x40646A20, 0x00000003, 0x4062D036, 0x4063A820, 0x40646A20, 0x00000003, + 0x4062D037, 0x4063A820, 0x40646A20, 0x00000003, 0x4062D021, 0x4063A820, + 0x40647220, 0x00000003, 0x4062D022, 0x4063A820, 0x40647220, 0x00000003, + 0x4062D023, 0x4063A820, 0x40647220, 0x00000003, 0x4062D021, 0x4063A820, + 0x40648220, 0x00000003, 0x4062D022, 0x4063A820, 0x40648220, 0x00000003, + 0x4062D023, 0x4063A820, 0x40648220, 0x00000003, 0x4062D024, 0x4063A820, + 0x40648220, 0x00000003, 0x4062D025, 0x4063A820, 0x40648220, 0x00000003, + 0x4062D026, 0x4063A820, 0x40648220, 0x00000003, 0x4062D027, 0x4063A820, + 0x40648220, 0x00000003, 0x4062D028, 0x4063A820, 0x40648220, 0x00000003, + 0x4062D029, 0x4063A820, 0x40648220, 0x00000003, 0x4062D02A, 0x4063A820, + 0x40648220, 0x00000003, 0x4062D02B, 0x4063A820, + // Block 642, offset 0xa080 + 0x40648220, 0x00000003, 0x4062D02C, 0x4063A820, 0x40648220, 0x00000003, + 0x4062D02D, 0x4063A820, 0x40648220, 0x00000003, 0x4062D02E, 0x4063A820, + 0x40648220, 0x00000003, 0x4062D02F, 0x4063A820, 0x40648220, 0x00000003, + 0x4062D030, 0x4063A820, 0x40648220, 0x00000003, 0x4062D031, 0x4063A820, + 0x40648220, 0x00000003, 0x4062D021, 0x4063A820, 0x40648420, 0x00000003, + 0x4062D022, 0x4063A820, 0x40648420, 0x00000003, 0x4062D023, 0x4063A820, + 0x40648420, 0x00000003, 0x4062D024, 0x4063A820, 0x40648420, 0x00000003, + 0x4062D025, 0x4063A820, 0x40648420, 0x00000003, 0x4062D026, 0x4063A820, + 0x40648420, 0x00000003, 0x4062D027, 0x4063A820, 0x40648420, 0x00000003, + 0x4062D028, 0x4063A820, 0x40648420, 0x00000003, 0x4062D029, 0x4063A820, + 0x40648420, 0x00000003, 0x4062D02A, 0x4063A820, + // Block 643, offset 0xa0c0 + 0x40648420, 0x00000003, 0x4062D02B, 0x4063A820, 0x40648420, 0x00000003, + 0x4062D02C, 0x4063A820, 0x40648420, 0x00000003, 0x4062D02D, 0x4063A820, + 0x40648420, 0x00000003, 0x4062D02E, 0x4063A820, 0x40648420, 0x00000003, + 0x4062D021, 0x4063A820, 0x40648C20, 0x00000003, 0x4062D022, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062D023, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062D024, 0x4063A820, 0x40648C20, 0x00000003, 0x4062D025, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062D026, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062D027, 0x4063A820, 0x40648C20, 0x00000003, 0x4062D028, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062D029, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062D02A, 0x4063A820, 0x40648C20, 0x00000003, 0x4062D02B, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062D02C, 0x4063A820, + // Block 644, offset 0xa100 + 0x40648C20, 0x00000003, 0x4062D02D, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062D02E, 0x4063A820, 0x40648C20, 0x00000003, 0x4062D02F, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062D030, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062D031, 0x4063A820, 0x40648C20, 0x00000003, 0x4062D032, 0x4063A820, + 0x40648C20, 0x00000003, 0x4062D033, 0x4063A820, 0x40648C20, 0x00000003, + 0x4062D034, 0x4063A820, 0x40648C20, 0x00000002, 0x4062D021, 0x4063AA20, + 0x00000002, 0x4062D022, 0x4063AA20, 0x00000002, 0x4062D023, 0x4063AA20, + 0x00000002, 0x4062D024, 0x4063AA20, 0x00000002, 0x4062D025, 0x4063AA20, + 0x00000002, 0x4062D026, 0x4063AA20, 0x00000002, 0x4062D027, 0x4063AA20, + 0x00000002, 0x4062D028, 0x4063AA20, 0x00000002, 0x4062D029, 0x4063AA20, + 0x00000002, 0x4062D02A, 0x4063AA20, 0x00000002, + // Block 645, offset 0xa140 + 0x4062D02B, 0x4063AA20, 0x00000002, 0x4062D02C, 0x4063AA20, 0x00000002, + 0x4062D02D, 0x4063AA20, 0x00000002, 0x4062D02E, 0x4063AA20, 0x00000002, + 0x4062D02F, 0x4063AA20, 0x00000002, 0x4062D030, 0x4063AA20, 0x00000002, + 0x4062D031, 0x4063AA20, 0x00000002, 0x4062D032, 0x4063AA20, 0x00000002, + 0x4062D033, 0x4063AA20, 0x00000002, 0x4062D034, 0x4063AA20, 0x00000002, + 0x4062D035, 0x4063AA20, 0x00000002, 0x4062D036, 0x4063AA20, 0x00000002, + 0x4062D037, 0x4063AA20, 0x00000002, 0x4062D038, 0x4063AA20, 0x00000002, + 0x4062D039, 0x4063AA20, 0x00000002, 0x4062D03A, 0x4063AA20, 0x00000002, + 0x4062D03B, 0x4063AA20, 0x00000002, 0x4062D03C, 0x4063AA20, 0x00000002, + 0x4062D03D, 0x4063AA20, 0x00000003, 0x4062D021, 0x4063AA20, 0x40646420, + 0x00000003, 0x4062D022, 0x4063AA20, 0x40646420, + // Block 646, offset 0xa180 + 0x00000003, 0x4062D023, 0x4063AA20, 0x40646420, 0x00000003, 0x4062D024, + 0x4063AA20, 0x40646420, 0x00000003, 0x4062D021, 0x4063AA20, 0x40648C20, + 0x00000003, 0x4062D022, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062D023, + 0x4063AA20, 0x40648C20, 0x00000003, 0x4062D024, 0x4063AA20, 0x40648C20, + 0x00000003, 0x4062D025, 0x4063AA20, 0x40648C20, 0x00000003, 0x4062D026, + 0x4063AA20, 0x40648C20, 0x00000003, 0x4062D021, 0x4063AC20, 0x40648C20, + 0x00000003, 0x4062D022, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062D023, + 0x4063AC20, 0x40648C20, 0x00000003, 0x4062D024, 0x4063AC20, 0x40648C20, + 0x00000003, 0x4062D025, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062D026, + 0x4063AC20, 0x40648C20, 0x00000003, 0x4062D027, 0x4063AC20, 0x40648C20, + 0x00000003, 0x4062D028, 0x4063AC20, 0x40648C20, + // Block 647, offset 0xa1c0 + 0x00000003, 0x4062D029, 0x4063AC20, 0x40648C20, 0x00000003, 0x4062D02A, + 0x4063AC20, 0x40648C20, 0x00000002, 0x4062D021, 0x4063B020, 0x00000002, + 0x4062D022, 0x4063B020, 0x00000002, 0x4062D023, 0x4063B020, 0x00000002, + 0x4062D024, 0x4063B020, 0x00000002, 0x4062D025, 0x4063B020, 0x00000003, + 0x4062D021, 0x4063B020, 0x40646A20, 0x00000003, 0x4062D022, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062D023, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062D024, 0x4063B020, 0x40646A20, 0x00000003, 0x4062D025, 0x4063B020, + 0x40646A20, 0x00000003, 0x4062D026, 0x4063B020, 0x40646A20, 0x00000003, + 0x4062D027, 0x4063B020, 0x40646A20, 0x00000003, 0x4062D021, 0x4063B020, + 0x40647220, 0x00000003, 0x4062D021, 0x4063B020, 0x40648220, 0x00000003, + 0x4062D022, 0x4063B020, 0x40648220, 0x00000003, + // Block 648, offset 0xa200 + 0x4062D023, 0x4063B020, 0x40648220, 0x00000003, 0x4062D024, 0x4063B020, + 0x40648220, 0x00000003, 0x4062D025, 0x4063B020, 0x40648220, 0x00000003, + 0x4062D021, 0x4063B420, 0x40646420, 0x00000003, 0x4062D022, 0x4063B420, + 0x40646420, 0x00000003, 0x4062D023, 0x4063B420, 0x40646420, 0x00000003, + 0x4062D024, 0x4063B420, 0x40646420, 0x00000003, 0x4062D025, 0x4063B420, + 0x40646420, 0x00000003, 0x4062D026, 0x4063B420, 0x40646420, 0x00000003, + 0x4062D027, 0x4063B420, 0x40646420, 0x00000003, 0x4062D028, 0x4063B420, + 0x40646420, 0x00000003, 0x4062D021, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062D022, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D023, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062D024, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062D025, 0x4063B420, 0x40646A20, 0x00000003, + // Block 649, offset 0xa240 + 0x4062D026, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D027, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062D028, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062D029, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D02A, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062D02B, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062D02C, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D02D, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062D02E, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062D02F, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D030, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062D031, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062D032, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D033, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062D034, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062D035, 0x4063B420, 0x40646A20, 0x00000003, + // Block 650, offset 0xa280 + 0x4062D036, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D037, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062D038, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062D039, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D03A, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062D03B, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062D03C, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D03D, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062D03E, 0x4063B420, 0x40646A20, 0x00000003, + 0x4062D03F, 0x4063B420, 0x40646A20, 0x00000003, 0x4062D040, 0x4063B420, + 0x40646A20, 0x00000003, 0x4062D021, 0x4063B420, 0x40647220, 0x00000003, + 0x4062D022, 0x4063B420, 0x40647220, 0x00000003, 0x4062D023, 0x4063B420, + 0x40647220, 0x00000003, 0x4062D024, 0x4063B420, 0x40647220, 0x00000003, + 0x4062D025, 0x4063B420, 0x40647220, 0x00000003, + // Block 651, offset 0xa2c0 + 0x4062D026, 0x4063B420, 0x40647220, 0x00000003, 0x4062D021, 0x4063B420, + 0x40648220, 0x00000003, 0x4062D021, 0x4063B420, 0x40648420, 0x00000003, + 0x4062D022, 0x4063B420, 0x40648420, 0x00000003, 0x4062D023, 0x4063B420, + 0x40648420, 0x00000003, 0x4062D024, 0x4063B420, 0x40648420, 0x00000003, + 0x4062D025, 0x4063B420, 0x40648420, 0x00000003, 0x4062D026, 0x4063B420, + 0x40648420, 0x00000003, 0x4062D027, 0x4063B420, 0x40648420, 0x00000003, + 0x4062D028, 0x4063B420, 0x40648420, 0x00000003, 0x4062D029, 0x4063B420, + 0x40648420, 0x00000003, 0x4062D02A, 0x4063B420, 0x40648420, 0x00000003, + 0x4062D02B, 0x4063B420, 0x40648420, 0x00000003, 0x4062D02C, 0x4063B420, + 0x40648420, 0x00000003, 0x4062D02D, 0x4063B420, 0x40648420, 0x00000003, + 0x4062D02E, 0x4063B420, 0x40648420, 0x00000003, + // Block 652, offset 0xa300 + 0x4062D02F, 0x4063B420, 0x40648420, 0x00000003, 0x4062D030, 0x4063B420, + 0x40648420, 0x00000003, 0x4062D031, 0x4063B420, 0x40648420, 0x00000003, + 0x4062D032, 0x4063B420, 0x40648420, 0x00000003, 0x4062D033, 0x4063B420, + 0x40648420, 0x00000003, 0x4062D021, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062D022, 0x4063B420, 0x40648C20, 0x00000003, 0x4062D023, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062D024, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062D025, 0x4063B420, 0x40648C20, 0x00000003, 0x4062D026, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062D027, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062D028, 0x4063B420, 0x40648C20, 0x00000003, 0x4062D029, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062D02A, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062D02B, 0x4063B420, 0x40648C20, 0x00000003, + // Block 653, offset 0xa340 + 0x4062D02C, 0x4063B420, 0x40648C20, 0x00000003, 0x4062D02D, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062D02E, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062D02F, 0x4063B420, 0x40648C20, 0x00000003, 0x4062D030, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062D031, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062D032, 0x4063B420, 0x40648C20, 0x00000003, 0x4062D033, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062D034, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062D035, 0x4063B420, 0x40648C20, 0x00000003, 0x4062D036, 0x4063B420, + 0x40648C20, 0x00000003, 0x4062D037, 0x4063B420, 0x40648C20, 0x00000003, + 0x4062D038, 0x4063B420, 0x40648C20, 0x00000003, 0x4062D039, 0x4063B420, + 0x40648C20, 0x00000002, 0x4062D021, 0x4063B620, 0x00000002, 0x4062D022, + 0x4063B620, 0x00000002, 0x4062D023, 0x4063B620, + // Block 654, offset 0xa380 + 0x00000002, 0x4062D024, 0x4063B620, 0x00000002, 0x4062D025, 0x4063B620, + 0x00000002, 0x4062D026, 0x4063B620, 0x00000002, 0x4062D027, 0x4063B620, + 0x00000002, 0x4062D028, 0x4063B620, 0x00000002, 0x4062D029, 0x4063B620, + 0x00000002, 0x4062D02A, 0x4063B620, 0x00000002, 0x4062D02B, 0x4063B620, + 0x00000002, 0x4062D02C, 0x4063B620, 0x00000002, 0x4062D02D, 0x4063B620, + 0x00000002, 0x4062D02E, 0x4063B620, 0x00000002, 0x4062D02F, 0x4063B620, + 0x00000002, 0x4062D030, 0x4063B620, 0x00000002, 0x4062D031, 0x4063B620, + 0x00000002, 0x4062D021, 0x4063B820, 0x00000002, 0x4062D022, 0x4063B820, + 0x00000002, 0x4062D023, 0x4063B820, 0x00000002, 0x4062D024, 0x4063B820, + 0x00000002, 0x4062D025, 0x4063B820, 0x00000002, 0x4062D026, 0x4063B820, + 0x00000002, 0x4062D027, 0x4063B820, 0x00000002, + // Block 655, offset 0xa3c0 + 0x4062D028, 0x4063B820, 0x00000002, 0x4062D029, 0x4063B820, 0x00000002, + 0x4062D02A, 0x4063B820, 0x00000002, 0x4062D02B, 0x4063B820, 0x00000002, + 0x4062D02C, 0x4063B820, 0x00000002, 0x4062D02D, 0x4063B820, 0x00000002, + 0x4062D02E, 0x4063B820, 0x00000002, 0x4062D02F, 0x4063B820, 0x00000002, + 0x4062D030, 0x4063B820, 0x00000002, 0x4062D031, 0x4063B820, 0x00000002, + 0x4062D032, 0x4063B820, 0x00000002, 0x4062D033, 0x4063B820, 0x00000002, + 0x4062D034, 0x4063B820, 0x00000002, 0x4062D035, 0x4063B820, 0x00000002, + 0x4062D036, 0x4063B820, 0x00000002, 0x4062D037, 0x4063B820, 0x00000002, + 0x4062D038, 0x4063B820, 0x00000002, 0x4062D039, 0x4063B820, 0x00000002, + 0x4062D03A, 0x4063B820, 0x00000002, 0x4062D03B, 0x4063B820, 0x00000002, + 0x4062D03C, 0x4063B820, 0x00000002, 0x4062D03D, + // Block 656, offset 0xa400 + 0x4063B820, 0x00000002, 0x4062D03E, 0x4063B820, 0x00000002, 0x4062D03F, + 0x4063B820, 0x00000002, 0x4062D040, 0x4063B820, 0x00000002, 0x4062D041, + 0x4063B820, 0x00000002, 0x4062D042, 0x4063B820, 0x00000002, 0x4062D043, + 0x4063B820, 0x00000002, 0x4062D044, 0x4063B820, 0x00000002, 0x4062D045, + 0x4063B820, 0x00000002, 0x4062D046, 0x4063B820, 0x00000002, 0x4062D047, + 0x4063B820, 0x00000002, 0x4062D048, 0x4063B820, 0x00000002, 0x4062D049, + 0x4063B820, 0x00000002, 0x4062D04A, 0x4063B820, 0x00000002, 0x4062D04B, + 0x4063B820, 0x00000002, 0x4062D04C, 0x4063B820, 0x00000002, 0x4062D04D, + 0x4063B820, 0x00000002, 0x4062D04E, 0x4063B820, 0x00000002, 0x4062D04F, + 0x4063B820, 0x00000002, 0x4062D050, 0x4063B820, 0x00000002, 0x4062D051, + 0x4063B820, 0x00000002, 0x4062D052, 0x4063B820, + // Block 657, offset 0xa440 + 0x00000002, 0x4062D053, 0x4063B820, 0x00000002, 0x4062D054, 0x4063B820, + 0x00000002, 0x4062D055, 0x4063B820, 0x00000002, 0x4062D056, 0x4063B820, + 0x00000002, 0x4062D057, 0x4063B820, 0x00000002, 0x4062D058, 0x4063B820, + 0x00000002, 0x4062D059, 0x4063B820, 0x00000002, 0x4062D05A, 0x4063B820, + 0x00000002, 0x4062D05B, 0x4063B820, 0x00000003, 0x4062D021, 0x4063B820, + 0x40646420, 0x00000003, 0x4062D022, 0x4063B820, 0x40646420, 0x00000003, + 0x4062D023, 0x4063B820, 0x40646420, 0x00000003, 0x4062D021, 0x4063B820, + 0x40646A20, 0x00000003, 0x4062D022, 0x4063B820, 0x40646A20, 0x00000003, + 0x4062D023, 0x4063B820, 0x40646A20, 0x00000003, 0x4062D024, 0x4063B820, + 0x40646A20, 0x00000003, 0x4062D025, 0x4063B820, 0x40646A20, 0x00000003, + 0x4062D026, 0x4063B820, 0x40646A20, 0x00000003, + // Block 658, offset 0xa480 + 0x4062D027, 0x4063B820, 0x40646A20, 0x00000003, 0x4062D028, 0x4063B820, + 0x40646A20, 0x00000003, 0x4062D029, 0x4063B820, 0x40646A20, 0x00000003, + 0x4062D02A, 0x4063B820, 0x40646A20, 0x00000003, 0x4062D02B, 0x4063B820, + 0x40646A20, 0x00000003, 0x4062D021, 0x4063B820, 0x40647220, 0x00000003, + 0x4062D022, 0x4063B820, 0x40647220, 0x00000003, 0x4062D023, 0x4063B820, + 0x40647220, 0x00000003, 0x4062D024, 0x4063B820, 0x40647220, 0x00000003, + 0x4062D021, 0x4063B820, 0x40648C20, 0x00000003, 0x4062D022, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062D023, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062D024, 0x4063B820, 0x40648C20, 0x00000003, 0x4062D025, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062D026, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062D027, 0x4063B820, 0x40648C20, 0x00000003, + // Block 659, offset 0xa4c0 + 0x4062D028, 0x4063B820, 0x40648C20, 0x00000003, 0x4062D029, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062D02A, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062D02B, 0x4063B820, 0x40648C20, 0x00000003, 0x4062D02C, 0x4063B820, + 0x40648C20, 0x00000003, 0x4062D02D, 0x4063B820, 0x40648C20, 0x00000003, + 0x4062D02E, 0x4063B820, 0x40648C20, 0x00000003, 0x4062D02F, 0x4063B820, + 0x40648C20, 0x00000002, 0x4062D021, 0x4063BA20, 0x00000002, 0x4062D022, + 0x4063BA20, 0x00000002, 0x4062D023, 0x4063BA20, 0x00000002, 0x4062D024, + 0x4063BA20, 0x00000002, 0x4062D025, 0x4063BA20, 0x00000002, 0x4062D026, + 0x4063BA20, 0x00000002, 0x4062D027, 0x4063BA20, 0x00000002, 0x4062D028, + 0x4063BA20, 0x00000002, 0x4062D029, 0x4063BA20, 0x00000002, 0x4062D02A, + 0x4063BA20, 0x00000002, 0x4062D02B, 0x4063BA20, + // Block 660, offset 0xa500 + 0x00000002, 0x4062D02C, 0x4063BA20, 0x00000002, 0x4062D02D, 0x4063BA20, + 0x00000002, 0x4062D02E, 0x4063BA20, 0x00000002, 0x4062D02F, 0x4063BA20, + 0x00000002, 0x4062D030, 0x4063BA20, 0x00000002, 0x4062D031, 0x4063BA20, + 0x00000002, 0x4062D032, 0x4063BA20, 0x00000002, 0x4062D033, 0x4063BA20, + 0x00000002, 0x4062D034, 0x4063BA20, 0x00000002, 0x4062D035, 0x4063BA20, + 0x00000003, 0x4062D021, 0x4063BA20, 0x40646420, 0x00000003, 0x4062D022, + 0x4063BA20, 0x40646420, 0x00000003, 0x4062D023, 0x4063BA20, 0x40646420, + 0x00000003, 0x4062D024, 0x4063BA20, 0x40646420, 0x00000003, 0x4062D025, + 0x4063BA20, 0x40646420, 0x00000003, 0x4062D026, 0x4063BA20, 0x40646420, + 0x00000003, 0x4062D027, 0x4063BA20, 0x40646420, 0x00000003, 0x4062D028, + 0x4063BA20, 0x40646420, 0x00000003, 0x4062D029, + // Block 661, offset 0xa540 + 0x4063BA20, 0x40646420, 0x00000003, 0x4062D021, 0x4063BA20, 0x40646A20, + 0x00000003, 0x4062D022, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D023, + 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D024, 0x4063BA20, 0x40646A20, + 0x00000003, 0x4062D025, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D026, + 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D027, 0x4063BA20, 0x40646A20, + 0x00000003, 0x4062D028, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D029, + 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D02A, 0x4063BA20, 0x40646A20, + 0x00000003, 0x4062D02B, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D02C, + 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D02D, 0x4063BA20, 0x40646A20, + 0x00000003, 0x4062D02E, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D02F, + 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D030, + // Block 662, offset 0xa580 + 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D031, 0x4063BA20, 0x40646A20, + 0x00000003, 0x4062D032, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D033, + 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D034, 0x4063BA20, 0x40646A20, + 0x00000003, 0x4062D035, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D036, + 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D037, 0x4063BA20, 0x40646A20, + 0x00000003, 0x4062D038, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D039, + 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D03A, 0x4063BA20, 0x40646A20, + 0x00000003, 0x4062D03B, 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D03C, + 0x4063BA20, 0x40646A20, 0x00000003, 0x4062D03D, 0x4063BA20, 0x40646A20, + 0x00000003, 0x4062D021, 0x4063BA20, 0x40647220, 0x00000003, 0x4062D022, + 0x4063BA20, 0x40647220, 0x00000003, 0x4062D023, + // Block 663, offset 0xa5c0 + 0x4063BA20, 0x40647220, 0x00000003, 0x4062D024, 0x4063BA20, 0x40647220, + 0x00000003, 0x4062D025, 0x4063BA20, 0x40647220, 0x00000003, 0x4062D026, + 0x4063BA20, 0x40647220, 0x00000003, 0x4062D021, 0x4063BA20, 0x40648C20, + 0x00000003, 0x4062D022, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D023, + 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D024, 0x4063BA20, 0x40648C20, + 0x00000003, 0x4062D025, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D026, + 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D027, 0x4063BA20, 0x40648C20, + 0x00000003, 0x4062D028, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D029, + 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D02A, 0x4063BA20, 0x40648C20, + 0x00000003, 0x4062D02B, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D02C, + 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D02D, + // Block 664, offset 0xa600 + 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D02E, 0x4063BA20, 0x40648C20, + 0x00000003, 0x4062D02F, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D030, + 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D031, 0x4063BA20, 0x40648C20, + 0x00000003, 0x4062D032, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D033, + 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D034, 0x4063BA20, 0x40648C20, + 0x00000003, 0x4062D035, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D036, + 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D037, 0x4063BA20, 0x40648C20, + 0x00000003, 0x4062D038, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D039, + 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D03A, 0x4063BA20, 0x40648C20, + 0x00000003, 0x4062D03B, 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D03C, + 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D03D, + // Block 665, offset 0xa640 + 0x4063BA20, 0x40648C20, 0x00000003, 0x4062D03E, 0x4063BA20, 0x40648C20, + 0x00000003, 0x4062D03F, 0x4063BA20, 0x40648C20, 0x00000002, 0x4062D021, + 0x4063BE20, 0x00000002, 0x4062D022, 0x4063BE20, 0x00000002, 0x4062D023, + 0x4063BE20, 0x00000002, 0x4062D024, 0x4063BE20, 0x00000002, 0x4062D025, + 0x4063BE20, 0x00000002, 0x4062D026, 0x4063BE20, 0x00000002, 0x4062D027, + 0x4063BE20, 0x00000002, 0x4062D028, 0x4063BE20, 0x00000002, 0x4062D029, + 0x4063BE20, 0x00000002, 0x4062D02A, 0x4063BE20, 0x00000002, 0x4062D02B, + 0x4063BE20, 0x00000002, 0x4062D02C, 0x4063BE20, 0x00000002, 0x4062D02D, + 0x4063BE20, 0x00000002, 0x4062D02E, 0x4063BE20, 0x00000002, 0x4062D02F, + 0x4063BE20, 0x00000002, 0x4062D030, 0x4063BE20, 0x00000002, 0x4062D031, + 0x4063BE20, 0x00000002, 0x4062D032, 0x4063BE20, + // Block 666, offset 0xa680 + 0x00000002, 0x4062D033, 0x4063BE20, 0x00000002, 0x4062D034, 0x4063BE20, + 0x00000002, 0x4062D035, 0x4063BE20, 0x00000002, 0x4062D036, 0x4063BE20, + 0x00000002, 0x4062D037, 0x4063BE20, 0x00000002, 0x4062D038, 0x4063BE20, + 0x00000002, 0x4062D039, 0x4063BE20, 0x00000002, 0x4062D03A, 0x4063BE20, + 0x00000002, 0x4062D03B, 0x4063BE20, 0x00000002, 0x4062D03C, 0x4063BE20, + 0x00000002, 0x4062D03D, 0x4063BE20, 0x00000003, 0x4062D021, 0x4063BE20, + 0x40646420, 0x00000003, 0x4062D022, 0x4063BE20, 0x40646420, 0x00000003, + 0x4062D023, 0x4063BE20, 0x40646420, 0x00000003, 0x4062D021, 0x4063BE20, + 0x40648C20, 0x00000003, 0x4062D022, 0x4063BE20, 0x40648C20, 0x00000003, + 0x4062D023, 0x4063BE20, 0x40648C20, 0x00000003, 0x4062D024, 0x4063BE20, + 0x40648C20, 0x00000003, 0x4062D025, 0x4063BE20, + // Block 667, offset 0xa6c0 + 0x40648C20, 0x00000003, 0x4062D026, 0x4063BE20, 0x40648C20, 0x00000002, + 0x4062D021, 0x4063C020, 0x00000002, 0x4062D022, 0x4063C020, 0x00000002, + 0x4062D023, 0x4063C020, 0x00000002, 0x4062D024, 0x4063C020, 0x00000002, + 0x4062D025, 0x4063C020, 0x00000002, 0x4062D026, 0x4063C020, 0x00000002, + 0x4062D027, 0x4063C020, 0x00000002, 0x4062D028, 0x4063C020, 0x00000002, + 0x4062D029, 0x4063C020, 0x00000002, 0x4062D02A, 0x4063C020, 0x00000002, + 0x4062D02B, 0x4063C020, 0x00000002, 0x4062D02C, 0x4063C020, 0x00000002, + 0x4062D02D, 0x4063C020, 0x00000002, 0x4062D02E, 0x4063C020, 0x00000002, + 0x4062D02F, 0x4063C020, 0x00000002, 0x4062D030, 0x4063C020, 0x00000002, + 0x4062D031, 0x4063C020, 0x00000002, 0x4062D032, 0x4063C020, 0x00000002, + 0x4062D033, 0x4063C020, 0x00000002, 0x4062D034, + // Block 668, offset 0xa700 + 0x4063C020, 0x00000002, 0x4062D035, 0x4063C020, 0x00000002, 0x4062D021, + 0x4063C220, 0x00000002, 0x4062D022, 0x4063C220, 0x00000002, 0x4062D023, + 0x4063C220, 0x00000002, 0x4062D024, 0x4063C220, 0x00000002, 0x4062D025, + 0x4063C220, 0x00000002, 0x4062D026, 0x4063C220, 0x00000002, 0x4062D027, + 0x4063C220, 0x00000002, 0x4062D028, 0x4063C220, 0x00000002, 0x4062D029, + 0x4063C220, 0x00000002, 0x4062D02A, 0x4063C220, 0x00000002, 0x4062D02B, + 0x4063C220, 0x00000002, 0x4062D02C, 0x4063C220, 0x00000002, 0x4062D02D, + 0x4063C220, 0x00000002, 0x4062D02E, 0x4063C220, 0x00000002, 0x4062D02F, + 0x4063C220, 0x00000002, 0x4062D030, 0x4063C220, 0x00000002, 0x4062D031, + 0x4063C220, 0x00000002, 0x4062D032, 0x4063C220, 0x00000002, 0x4062D033, + 0x4063C220, 0x00000002, 0x4062D034, 0x4063C220, + // Block 669, offset 0xa740 + 0x00000002, 0x4062D035, 0x4063C220, 0x00000002, 0x4062D036, 0x4063C220, + 0x00000002, 0x4062D037, 0x4063C220, 0x00000002, 0x4062D038, 0x4063C220, + 0x00000003, 0x4062D021, 0x4063C220, 0x40646A20, 0x00000003, 0x4062D022, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062D023, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062D024, 0x4063C220, 0x40646A20, 0x00000003, 0x4062D025, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062D026, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062D027, 0x4063C220, 0x40646A20, 0x00000003, 0x4062D028, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062D029, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062D02A, 0x4063C220, 0x40646A20, 0x00000003, 0x4062D02B, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062D02C, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062D02D, 0x4063C220, 0x40646A20, + // Block 670, offset 0xa780 + 0x00000003, 0x4062D02E, 0x4063C220, 0x40646A20, 0x00000003, 0x4062D02F, + 0x4063C220, 0x40646A20, 0x00000003, 0x4062D030, 0x4063C220, 0x40646A20, + 0x00000003, 0x4062D021, 0x4063C220, 0x40647220, 0x00000003, 0x4062D021, + 0x4063C220, 0x40648C20, 0x00000003, 0x4062D021, 0x4063C420, 0x40646A20, + 0x00000003, 0x4062D022, 0x4063C420, 0x40646A20, 0x00000003, 0x4062D023, + 0x4063C420, 0x40646A20, 0x00000003, 0x4062D024, 0x4063C420, 0x40646A20, + 0x00000003, 0x4062D025, 0x4063C420, 0x40646A20, 0x00000003, 0x4062D026, + 0x4063C420, 0x40646A20, 0x00000003, 0x4062D027, 0x4063C420, 0x40646A20, + 0x00000002, 0x4062D021, 0x4063C620, 0x00000002, 0x4062D022, 0x4063C620, + 0x00000002, 0x4062D023, 0x4063C620, 0x00000002, 0x4062D024, 0x4063C620, + 0x00000002, 0x4062D025, 0x4063C620, 0x00000002, + // Block 671, offset 0xa7c0 + 0x4062D026, 0x4063C620, 0x00000002, 0x4062D027, 0x4063C620, 0x00000002, + 0x4062D021, 0x4063C820, 0x00000002, 0x4062D022, 0x4063C820, 0x00000002, + 0x4062D023, 0x4063C820, 0x00000002, 0x4062D024, 0x4063C820, 0x00000002, + 0x4062D025, 0x4063C820, 0x00000002, 0x4062D026, 0x4063C820, 0x00000002, + 0x4062D027, 0x4063C820, 0x00000002, 0x4062D028, 0x4063C820, 0x00000002, + 0x4062D029, 0x4063C820, 0x00000002, 0x4062D02A, 0x4063C820, 0x00000002, + 0x4062D021, 0x4063CA20, 0x00000002, 0x4062D022, 0x4063CA20, 0x00000002, + 0x4062D023, 0x4063CA20, 0x00000002, 0x4062D024, 0x4063CA20, 0x00000002, + 0x4062D025, 0x4063CA20, 0x00000002, 0x4062D026, 0x4063CA20, 0x00000002, + 0x4062D027, 0x4063CA20, 0x00000002, 0x4062D028, 0x4063CA20, 0x00000002, + 0x4062D029, 0x4063CA20, 0x00000002, 0x4062D02A, + // Block 672, offset 0xa800 + 0x4063CA20, 0x00000003, 0x4062D021, 0x4063CA20, 0x40647220, 0x00000003, + 0x4062D022, 0x4063CA20, 0x40647220, 0x00000003, 0x4062D023, 0x4063CA20, + 0x40647220, 0x00000003, 0x4062D024, 0x4063CA20, 0x40647220, 0x00000003, + 0x4062D021, 0x4063CA20, 0x40648C20, 0x00000003, 0x4062D022, 0x4063CA20, + 0x40648C20, 0x00000003, 0x4062D023, 0x4063CA20, 0x40648C20, 0x00000003, + 0x4062D024, 0x4063CA20, 0x40648C20, 0x00000003, 0x4062D025, 0x4063CA20, + 0x40648C20, 0x00000003, 0x4062D026, 0x4063CA20, 0x40648C20, 0x00000003, + 0x4062D027, 0x4063CA20, 0x40648C20, 0x00000003, 0x4062D021, 0x4063CC20, + 0x40646420, 0x00000003, 0x4062D021, 0x4063CC20, 0x40646A20, 0x00000003, + 0x4062D022, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062D023, 0x4063CC20, + 0x40646A20, 0x00000003, 0x4062D024, 0x4063CC20, + // Block 673, offset 0xa840 + 0x40646A20, 0x00000003, 0x4062D025, 0x4063CC20, 0x40646A20, 0x00000003, + 0x4062D026, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062D027, 0x4063CC20, + 0x40646A20, 0x00000003, 0x4062D028, 0x4063CC20, 0x40646A20, 0x00000003, + 0x4062D029, 0x4063CC20, 0x40646A20, 0x00000003, 0x4062D02A, 0x4063CC20, + 0x40646A20, 0x00000003, 0x4062D021, 0x4063CC20, 0x40647220, 0x00000003, + 0x4062D022, 0x4063CC20, 0x40647220, 0x00000003, 0x4062D023, 0x4063CC20, + 0x40647220, 0x00000003, 0x4062D024, 0x4063CC20, 0x40647220, 0x00000003, + 0x4062D025, 0x4063CC20, 0x40647220, 0x00000003, 0x4062D026, 0x4063CC20, + 0x40647220, 0x00000003, 0x4062D027, 0x4063CC20, 0x40647220, 0x00000003, + 0x4062D028, 0x4063CC20, 0x40647220, 0x00000003, 0x4062D029, 0x4063CC20, + 0x40647220, 0x00000003, 0x4062D021, 0x4063CC20, + // Block 674, offset 0xa880 + 0x40648220, 0x00000003, 0x4062D022, 0x4063CC20, 0x40648220, 0x00000003, + 0x4062D023, 0x4063CC20, 0x40648220, 0x00000003, 0x4062D024, 0x4063CC20, + 0x40648220, 0x00000003, 0x4062D021, 0x4063CC20, 0x40648420, 0x00000003, + 0x4062D022, 0x4063CC20, 0x40648420, 0x00000003, 0x4062D023, 0x4063CC20, + 0x40648420, 0x00000003, 0x4062D024, 0x4063CC20, 0x40648420, 0x00000003, + 0x4062D025, 0x4063CC20, 0x40648420, 0x00000003, 0x4062D026, 0x4063CC20, + 0x40648420, 0x00000003, 0x4062D027, 0x4063CC20, 0x40648420, 0x00000003, + 0x4062D028, 0x4063CC20, 0x40648420, 0x00000003, 0x4062D021, 0x4063CC20, + 0x40648C20, 0x00000002, 0x4062D021, 0x4063CE20, 0x00000002, 0x4062D022, + 0x4063CE20, 0x00000002, 0x4062D023, 0x4063CE20, 0x00000002, 0x4062D024, + 0x4063CE20, 0x00000002, 0x4062D025, 0x4063CE20, + // Block 675, offset 0xa8c0 + 0x00000002, 0x4062D026, 0x4063CE20, 0x00000002, 0x4062D027, 0x4063CE20, + 0x00000002, 0x4062D028, 0x4063CE20, 0x00000002, 0x4062D029, 0x4063CE20, + 0x00000002, 0x4062D02A, 0x4063CE20, 0x00000002, 0x4062D02B, 0x4063CE20, + 0x00000002, 0x4062D02C, 0x4063CE20, 0x00000002, 0x4062D02D, 0x4063CE20, + 0x00000002, 0x4062D02E, 0x4063CE20, 0x00000002, 0x4062D02F, 0x4063CE20, + 0x00000002, 0x4062D030, 0x4063CE20, 0x00000002, 0x4062D031, 0x4063CE20, + 0x00000002, 0x4062D032, 0x4063CE20, 0x00000002, 0x4062D033, 0x4063CE20, + 0x00000002, 0x4062D034, 0x4063CE20, 0x00000002, 0x4062D035, 0x4063CE20, + 0x00000002, 0x4062D036, 0x4063CE20, 0x00000002, 0x4062D037, 0x4063CE20, + 0x00000002, 0x4062D038, 0x4063CE20, 0x00000002, 0x4062D039, 0x4063CE20, + 0x00000002, 0x4062D03A, 0x4063CE20, 0x00000002, + // Block 676, offset 0xa900 + 0x4062D03B, 0x4063CE20, 0x00000002, 0x4062D03C, 0x4063CE20, 0x00000002, + 0x4062D03D, 0x4063CE20, 0x00000002, 0x4062D03E, 0x4063CE20, 0x00000002, + 0x4062D03F, 0x4063CE20, 0x00000003, 0x4062D021, 0x4063D020, 0x40647220, + 0x00000003, 0x4062D022, 0x4063D020, 0x40647220, 0x00000003, 0x4062D023, + 0x4063D020, 0x40647220, 0x00000003, 0x4062D024, 0x4063D020, 0x40647220, + 0x00000003, 0x4062D025, 0x4063D020, 0x40647220, 0x00000003, 0x4062D026, + 0x4063D020, 0x40647220, 0x00000002, 0x40403C20, 0xA070F102, 0x00000002, + 0x402D9A22, 0xAE603202, 0x00000002, 0x002D9AC3, 0xAE603202, 0x00000002, + 0x402D9A22, 0xAE603502, 0x00000002, 0x002D9AC3, 0xAE603502, 0x00000002, + 0x402D9A22, 0xAE603C02, 0x00000002, 0x002D9AC3, 0xAE603C02, 0x00000002, + 0x402D9A22, 0xAE604302, 0x00000002, 0x402D9A22, + // Block 677, offset 0xa940 + 0xAE604702, 0x00000002, 0x002D9AC3, 0xAE604702, 0x00000002, 0x402D9A22, + 0xAE604E02, 0x00000002, 0x002D9AC3, 0xAE604E02, 0x00000002, 0x402D9A22, + 0xAE605202, 0x00000002, 0x002D9AC3, 0xAE605202, 0x00000002, 0x402D9A22, + 0xAE605B02, 0x00000002, 0x002D9AC3, 0xAE605B02, 0x00000002, 0x402D9A22, + 0xAE606402, 0x00000002, 0x002D9AC3, 0xAE606402, 0x00000002, 0x402D9A22, + 0xADC07002, 0x00000002, 0x002D9AC3, 0xADC07002, 0x00000002, 0x40306C22, + 0xAE604702, 0x00000002, 0x00306CC3, 0xAE604702, 0x00000002, 0x40302A20, + 0xAE605202, 0x00000002, 0x00302A83, 0xAE605202, 0x00000002, 0x40442221, + 0x82092248, 0x00000002, 0x004422A3, 0x82092248, 0x00000002, 0x40443E21, + 0x82092248, 0x00000002, 0x00443EA3, 0x82092248, 0x00000002, 0x00444883, + 0x82092248, 0x00000002, 0x40444821, 0x82092248, + // Block 678, offset 0xa980 + 0x00000002, 0x004448A3, 0x82092248, 0x00000002, 0x40445421, 0x82092248, + 0x00000002, 0x40445821, 0x82092248, 0x00000002, 0x004458A3, 0x82092248, + 0x00000002, 0x40445A21, 0x82092248, 0x00000002, 0x00445AA3, 0x82092248, + 0x00000002, 0x40446621, 0x82092248, 0x00000002, 0x004466A3, 0x82092248, + 0x00000002, 0x402D6820, 0xA0007D02, 0x00000002, 0x002D6894, 0xA0007D14, + 0x00000005, 0x404E6020, 0x404E8420, 0x404E2420, 0x8209278B, 0x404F3020, + 0x00000006, 0x404E6A20, 0x8209278B, 0x404E6A20, 0x404EEE20, 0x404E7220, + 0x8209278B, 0x00000006, 0x404E6A21, 0x40510E20, 0x404EE620, 0x404EEE20, + 0x404E1420, 0x8209278B, 0x00000004, 0x404E8C21, 0x40510A20, 0x404EFE20, + 0x404F2E20, 0x00000006, 0x404E9420, 0x404E1420, 0x8209278B, 0x404E8220, + 0x404E1420, 0x8209278B, 0x00000005, 0x404E9420, + // Block 679, offset 0xa9c0 + 0x404E1420, 0x8209278B, 0x404E8820, 0x404EDE20, 0x0000000A, 0x404E9421, + 0x404E4820, 0x8209278B, 0x404F3020, 0x404E1420, 0x404EFE20, 0x404EDE20, + 0x404E2420, 0x8209278B, 0x404F3020, 0x00000003, 0x404EA620, 0x404E8420, + 0x404EEA20, 0x00000003, 0x404EA620, 0x8209278A, 0x404EA620, 0x00000002, + 0x004EC283, 0x404EE620, 0x00000002, 0x404EC221, 0x404EE620, 0x00000002, + 0x004EC283, 0x404EEA20, 0x00000002, 0x004EC283, 0x404EEE20, 0x00000003, + 0x004EC283, 0x404EEE20, 0x404F0C20, 0x00000002, 0x004EC283, 0x404EF420, + 0x00000002, 0x004EC283, 0x404EFE20, 0x00000002, 0x004EC284, 0x404EFE20, + 0x00000003, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x00000005, 0x004EC283, + 0x404EFE20, 0x404EDE20, 0x404E1420, 0x8209278A, 0x00000005, 0x004EC284, + 0x404EFE20, 0x404EDE20, 0x404E1420, 0x8209278A, + // Block 680, offset 0xaa00 + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E1420, 0x8209278B, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E1420, 0x8209278B, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E1820, 0x8209278A, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E1820, 0x8209278A, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E1820, 0x8209278B, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E1820, 0x8209278B, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E1C20, 0x8209278A, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E1C20, 0x8209278A, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E1C20, 0x8209278B, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E1C20, 0x8209278B, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + // Block 681, offset 0xaa40 + 0x404E2220, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404E2220, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404E2220, 0x8209278B, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404E2220, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404E2420, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404E2420, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404E2420, 0x8209278B, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404E2420, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404E2820, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404E2820, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404E2820, 0x8209278B, 0x00000005, 0x004EC284, + // Block 682, offset 0xaa80 + 0x404EFE20, 0x404EDE20, 0x404E2820, 0x8209278B, 0x00000005, 0x004EC283, + 0x404EFE20, 0x404EDE20, 0x404E2E20, 0x8209278A, 0x00000005, 0x004EC284, + 0x404EFE20, 0x404EDE20, 0x404E2E20, 0x8209278A, 0x00000005, 0x004EC283, + 0x404EFE20, 0x404EDE20, 0x404E2E20, 0x8209278B, 0x00000005, 0x004EC284, + 0x404EFE20, 0x404EDE20, 0x404E2E20, 0x8209278B, 0x00000005, 0x004EC283, + 0x404EFE20, 0x404EDE20, 0x404E3220, 0x8209278A, 0x00000005, 0x004EC284, + 0x404EFE20, 0x404EDE20, 0x404E3220, 0x8209278A, 0x00000005, 0x004EC283, + 0x404EFE20, 0x404EDE20, 0x404E3220, 0x8209278B, 0x00000005, 0x004EC284, + 0x404EFE20, 0x404EDE20, 0x404E3220, 0x8209278B, 0x00000005, 0x004EC283, + 0x404EFE20, 0x404EDE20, 0x404E4220, 0x8209278A, 0x00000005, 0x004EC284, + 0x404EFE20, 0x404EDE20, 0x404E4220, 0x8209278A, + // Block 683, offset 0xaac0 + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E4220, 0x8209278B, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E4220, 0x8209278B, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E4820, 0x8209278A, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E4820, 0x8209278A, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E4820, 0x8209278B, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E4820, 0x8209278B, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E4A20, 0x8209278A, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E4A20, 0x8209278A, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E4A20, 0x8209278B, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E4A20, 0x8209278B, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + // Block 684, offset 0xab00 + 0x404E4E20, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404E4E20, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404E4E20, 0x8209278B, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404E4E20, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404E5220, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404E5220, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404E5220, 0x8209278B, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404E5220, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404E5620, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404E5620, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404E5620, 0x8209278B, 0x00000005, 0x004EC284, + // Block 685, offset 0xab40 + 0x404EFE20, 0x404EDE20, 0x404E5620, 0x8209278B, 0x00000005, 0x004EC283, + 0x404EFE20, 0x404EDE20, 0x404E5A20, 0x8209278A, 0x00000005, 0x004EC284, + 0x404EFE20, 0x404EDE20, 0x404E5A20, 0x8209278A, 0x00000005, 0x004EC283, + 0x404EFE20, 0x404EDE20, 0x404E5A20, 0x8209278B, 0x00000005, 0x004EC284, + 0x404EFE20, 0x404EDE20, 0x404E5A20, 0x8209278B, 0x00000005, 0x004EC283, + 0x404EFE20, 0x404EDE20, 0x404E5E20, 0x8209278A, 0x00000005, 0x004EC284, + 0x404EFE20, 0x404EDE20, 0x404E5E20, 0x8209278A, 0x00000005, 0x004EC283, + 0x404EFE20, 0x404EDE20, 0x404E5E20, 0x8209278B, 0x00000005, 0x004EC284, + 0x404EFE20, 0x404EDE20, 0x404E5E20, 0x8209278B, 0x00000005, 0x004EC283, + 0x404EFE20, 0x404EDE20, 0x404E6020, 0x8209278A, 0x00000005, 0x004EC284, + 0x404EFE20, 0x404EDE20, 0x404E6020, 0x8209278A, + // Block 686, offset 0xab80 + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E6020, 0x8209278B, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E6020, 0x8209278B, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E6220, 0x8209278A, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E6220, 0x8209278A, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E6220, 0x8209278B, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E6220, 0x8209278B, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E6620, 0x8209278A, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E6620, 0x8209278A, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E6620, 0x8209278B, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E6620, 0x8209278B, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + // Block 687, offset 0xabc0 + 0x404E6A20, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404E6A20, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404E6A20, 0x8209278B, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404E6A20, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404E7220, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404E7220, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404E7220, 0x8209278B, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404E7220, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404E7420, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404E7420, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404E7420, 0x8209278B, 0x00000005, 0x004EC284, + // Block 688, offset 0xac00 + 0x404EFE20, 0x404EDE20, 0x404E7420, 0x8209278B, 0x00000005, 0x004EC283, + 0x404EFE20, 0x404EDE20, 0x404E7E20, 0x8209278A, 0x00000005, 0x004EC284, + 0x404EFE20, 0x404EDE20, 0x404E7E20, 0x8209278A, 0x00000005, 0x004EC283, + 0x404EFE20, 0x404EDE20, 0x404E7E20, 0x8209278B, 0x00000005, 0x004EC284, + 0x404EFE20, 0x404EDE20, 0x404E7E20, 0x8209278B, 0x00000005, 0x004EC283, + 0x404EFE20, 0x404EDE20, 0x404E8220, 0x8209278A, 0x00000005, 0x004EC284, + 0x404EFE20, 0x404EDE20, 0x404E8220, 0x8209278A, 0x00000005, 0x004EC283, + 0x404EFE20, 0x404EDE20, 0x404E8220, 0x8209278B, 0x00000005, 0x004EC284, + 0x404EFE20, 0x404EDE20, 0x404E8220, 0x8209278B, 0x00000005, 0x004EC283, + 0x404EFE20, 0x404EDE20, 0x404E8420, 0x8209278A, 0x00000005, 0x004EC284, + 0x404EFE20, 0x404EDE20, 0x404E8420, 0x8209278A, + // Block 689, offset 0xac40 + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E8420, 0x8209278B, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E8420, 0x8209278B, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E8820, 0x8209278A, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E8820, 0x8209278A, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E8820, 0x8209278B, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E8820, 0x8209278B, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E8C20, 0x8209278A, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E8C20, 0x8209278A, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, 0x404E8C20, 0x8209278B, + 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, 0x404E8C20, 0x8209278B, + 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + // Block 690, offset 0xac80 + 0x404E9420, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404E9420, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404E9420, 0x8209278B, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404E9420, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404EA620, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404EA620, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404EA620, 0x8209278B, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404EA620, 0x8209278B, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404EAA20, 0x8209278A, 0x00000005, 0x004EC284, 0x404EFE20, 0x404EDE20, + 0x404EAA20, 0x8209278A, 0x00000005, 0x004EC283, 0x404EFE20, 0x404EDE20, + 0x404EAA20, 0x8209278B, 0x00000005, 0x004EC284, + // Block 691, offset 0xacc0 + 0x404EFE20, 0x404EDE20, 0x404EAA20, 0x8209278B, 0x00000004, 0x004EC283, + 0x404EFE20, 0x404EDE20, 0x8209278B, 0x00000006, 0x404EFE20, 0x404EDE20, + 0x404E1420, 0x8209278B, 0x404E1420, 0x40510420, 0x00000002, 0x402C9A20, + 0xAE603202, 0x00000002, 0x002C9A83, 0xAE603202, 0x00000002, 0x402C9A20, + 0xAE603502, 0x00000002, 0x002C9A83, 0xAE603502, 0x00000002, 0x402C9A20, + 0xAE604E02, 0x00000002, 0x002C9A83, 0xAE604E02, 0x00000002, 0x402C9A20, + 0xAE606402, 0x00000002, 0x002C9A83, 0xAE606402, 0x00000002, 0x402C9A20, + 0xADC07002, 0x00000002, 0x002C9A83, 0xADC07002, 0x00000002, 0x402EE420, + 0xAE603202, 0x00000002, 0x002EE483, 0xAE603202, 0x00000002, 0x402EE420, + 0xAE603502, 0x00000002, 0x002EE483, 0xAE603502, 0x00000002, 0x402EE420, + 0xAE606402, 0x00000002, 0x002EE483, 0xAE606402, + // Block 692, offset 0xad00 + 0x00000002, 0x402EE420, 0xADC07002, 0x00000002, 0x002EE483, 0xADC07002, + 0x00000002, 0x40411620, 0xA000FA02, 0x00000002, 0x40411E20, 0xA000FA02, + 0x00000002, 0x40412020, 0xA000FA02, 0x00000002, 0x40412A20, 0xA000FA02, + 0x00000002, 0x40414620, 0xA000FA02, 0x00000002, 0x40415420, 0xA000FA02, + 0x00000002, 0x403A6822, 0xAE60BE02, 0x00000002, 0x003A7C84, 0x00391C84, + 0x00000002, 0x003A7C9A, 0x00391C9A, 0x00000002, 0x40320820, 0xAE603202, + 0x00000002, 0x00320883, 0xAE603202, 0x00000002, 0x40320A20, 0xAE603202, + 0x00000002, 0x00320A83, 0xAE603202, 0x00000002, 0x40320A20, 0xAE605B02, + 0x00000002, 0x00320A83, 0xAE605B02, 0x00000002, 0x40320E21, 0xAE603702, + 0x00000002, 0x00320EA3, 0xAE603702, 0x00000002, 0x40320E21, 0xAE603C02, + 0x00000002, 0x00320EA3, 0xAE603C02, 0x00000002, + // Block 693, offset 0xad40 + 0x40321022, 0xAE603202, 0x00000002, 0x003210C3, 0xAE603202, 0x00000002, + 0x40321022, 0xAE604702, 0x00000002, 0x003210C3, 0xAE604702, 0x00000002, + 0x40321022, 0xAE605B02, 0x00000002, 0x003210C3, 0xAE605B02, 0x00000002, + 0x40321022, 0xAD806802, 0x00000002, 0x003210C3, 0xAD806802, 0x00000002, + 0x40321023, 0xAE603202, 0x00000002, 0x003210E3, 0xAE603202, 0x00000002, + 0x40321023, 0xAE603502, 0x00000002, 0x003210E3, 0xAE603502, 0x00000002, + 0x40321023, 0xAE604E02, 0x00000002, 0x003210E3, 0xAE604E02, 0x00000002, + 0x40321023, 0xAE606402, 0x00000002, 0x003210E3, 0xAE606402, 0x00000002, + 0x40321023, 0xADC07002, 0x00000002, 0x003210E3, 0xADC07002, 0x00000002, + 0x40321024, 0xAE605B02, 0x00000002, 0x00321103, 0xAE605B02, 0x00000002, + 0x402C6020, 0xAE603202, 0x00000002, 0x002C6083, + // Block 694, offset 0xad80 + 0xAE603202, 0x00000002, 0x40321024, 0xAE603202, 0x00000002, 0x00321103, + 0xAE603202, 0x00000002, 0x40321024, 0xAE603502, 0x00000002, 0x00321103, + 0xAE603502, 0x00000002, 0x40321024, 0xAE604E02, 0x00000002, 0x00321103, + 0xAE604E02, 0x00000002, 0x40321024, 0xAE606402, 0x00000002, 0x00321103, + 0xAE606402, 0x00000002, 0x40321024, 0xADC07002, 0x00000002, 0x00321103, + 0xADC07002, 0x00000002, 0x00497283, 0x40496C20, 0x00000002, 0x00497284, + 0x40496C20, 0x00000002, 0x402BDE21, 0xAE603702, 0x00000002, 0x002BDEA3, + 0xAE603702, 0x00000002, 0x402BDE21, 0xAE603C02, 0x00000002, 0x002BDEA3, + 0xAE603C02, 0x00000002, 0x402BDE21, 0xAE604302, 0x00000002, 0x002BDEA3, + 0xAE604302, 0x00000002, 0x402BDE22, 0xAE604702, 0x00000002, 0x002BDEC3, + 0xAE604702, 0x00000002, 0x402BDE22, 0xAE605202, + // Block 695, offset 0xadc0 + 0x00000002, 0x002BDEC3, 0xAE605202, 0x00000002, 0x402C9821, 0xAE603C02, + 0x00000002, 0x002C98A3, 0xAE603C02, 0x00000002, 0x402C9822, 0xAE603202, + 0x00000002, 0x002C98C3, 0xAE603202, 0x00000002, 0x402C9822, 0xAE603502, + 0x00000002, 0x002C98C3, 0xAE603502, 0x00000002, 0x402D9A21, 0xAE604702, + 0x00000002, 0x002D9AA3, 0xAE604702, 0x00000002, 0x402EE221, 0xAE603C02, + 0x00000002, 0x002EE2A3, 0xAE603C02, 0x00000002, 0x402EE221, 0xAE604E02, + 0x00000002, 0x002EE2A3, 0xAE604E02, 0x00000002, 0x402EE221, 0xAD806802, + 0x00000002, 0x002EE2A3, 0xAD806802, 0x00000002, 0x402EE222, 0xAE603202, + 0x00000002, 0x002EE2C3, 0xAE603202, 0x00000002, 0x402EE222, 0xAE603502, + 0x00000002, 0x002EE2C3, 0xAE603502, 0x00000002, 0x402EE222, 0xAE604702, + 0x00000002, 0x002EE2C3, 0xAE604702, 0x00000002, + // Block 696, offset 0xae00 + 0x402EE222, 0xAE604E02, 0x00000002, 0x002EE2C3, 0xAE604E02, 0x00000002, + 0x402EE222, 0xAE605202, 0x00000002, 0x002EE2C3, 0xAE605202, 0x00000002, + 0x402EE222, 0xACA05902, 0x00000002, 0x002EE2C3, 0xACA05902, 0x00000002, + 0x40306C21, 0xAE604702, 0x00000002, 0x00306CA3, 0xAE604702, 0x00000002, + 0x40306C21, 0xAE604E02, 0x00000002, 0x00306CA3, 0xAE604E02, 0x00000002, + 0x40306C21, 0xAD806802, 0x00000002, 0x00306CA3, 0xAD806802, 0x00000002, + 0xA000AD18, 0xA000BA18, 0x00000002, 0x00393C97, 0x00396497, 0x00000002, + 0x00393C9A, 0x0039649A, 0x00000002, 0x00393C97, 0x00397297, 0x00000002, + 0x00393C9A, 0x0039729A, 0x00000002, 0x00393C97, 0x00397497, 0x00000002, + 0x00393C9A, 0x0039749A, 0x00000002, 0x00393C99, 0x0039A499, 0x00000002, + 0x00393C99, 0x0039A699, 0x00000002, 0x00393C97, + // Block 697, offset 0xae40 + 0x003A4E97, 0x00000002, 0x00393C98, 0x003A4E98, 0x00000002, 0x00393C99, + 0x003A4E99, 0x00000002, 0x00393C9A, 0x003A4E9A, 0x00000002, 0x00393C99, + 0x003A5699, 0x00000002, 0x00395697, 0x00396497, 0x00000002, 0x0039569A, + 0x0039649A, 0x00000002, 0x00395697, 0x00397297, 0x00000002, 0x0039569A, + 0x0039729A, 0x00000002, 0x00395697, 0x00397497, 0x00000002, 0x0039569A, + 0x0039749A, 0x00000002, 0x00395699, 0x0039A499, 0x00000002, 0x00395699, + 0x0039A699, 0x00000002, 0x00395697, 0x003A4E97, 0x00000002, 0x00395698, + 0x003A4E98, 0x00000002, 0x00395699, 0x003A4E99, 0x00000002, 0x0039569A, + 0x003A4E9A, 0x00000002, 0x00395699, 0x003A5699, 0x00000002, 0x0039589A, + 0x0039649A, 0x00000002, 0x00395899, 0x0039A499, 0x00000002, 0x00395899, + 0x0039A699, 0x00000002, 0x00395897, 0x003A4E97, + // Block 698, offset 0xae80 + 0x00000002, 0x00395898, 0x003A4E98, 0x00000002, 0x00395899, 0x003A4E99, + 0x00000002, 0x0039589A, 0x003A4E9A, 0x00000002, 0x00395899, 0x003A5699, + 0x00000002, 0x00396497, 0x00397297, 0x00000002, 0x0039649A, 0x0039729A, + 0x00000002, 0x00396497, 0x003A4E97, 0x00000002, 0x0039649A, 0x003A4E9A, + 0x00000002, 0x00397297, 0x00396497, 0x00000002, 0x0039729A, 0x0039649A, + 0x00000002, 0x00397297, 0x003A4E97, 0x00000002, 0x0039729A, 0x003A4E9A, + 0x00000002, 0x00397497, 0x00396497, 0x00000002, 0x0039749A, 0x0039649A, + 0x00000002, 0x0039749A, 0x0039729A, 0x00000002, 0x00397497, 0x003A4E97, + 0x00000002, 0x0039749A, 0x003A4E9A, 0x00000002, 0x00398A9A, 0xA000D11A, + 0x00000002, 0x0039A49A, 0xA000D11A, 0x00000002, 0x0039C697, 0x00396497, + 0x00000002, 0x0039C698, 0x00396498, 0x00000002, + // Block 699, offset 0xaec0 + 0x0039C69A, 0x0039649A, 0x00000002, 0x0039C697, 0x00397297, 0x00000002, + 0x0039C698, 0x00397298, 0x00000002, 0x0039C69A, 0x0039729A, 0x00000002, + 0x0039C697, 0x00397497, 0x00000002, 0x0039C698, 0x00397498, 0x00000002, + 0x0039C69A, 0x0039749A, 0x00000002, 0x0039C699, 0x0039A499, 0x00000002, + 0x0039C69A, 0x0039A49A, 0x00000002, 0x0039C697, 0x003A4E97, 0x00000002, + 0x0039C698, 0x003A4E98, 0x00000002, 0x0039C69A, 0x003A4E9A, 0x00000002, + 0x0039C897, 0x00396497, 0x00000002, 0x0039C898, 0x00396498, 0x00000002, + 0x0039C899, 0x00396499, 0x00000002, 0x0039C89A, 0x0039649A, 0x00000002, + 0x0039C897, 0x00397297, 0x00000002, 0x0039C898, 0x00397298, 0x00000002, + 0x0039C899, 0x00397299, 0x00000002, 0x0039C89A, 0x0039729A, 0x00000002, + 0x0039C897, 0x00397497, 0x00000002, 0x0039C898, + // Block 700, offset 0xaf00 + 0x00397498, 0x00000002, 0x0039C899, 0x00397499, 0x00000002, 0x0039C89A, + 0x0039749A, 0x00000002, 0x0039C899, 0x0039A499, 0x00000002, 0x0039C89A, + 0x0039A49A, 0x00000002, 0x0039C897, 0x003A4E97, 0x00000002, 0x0039C898, + 0x003A4E98, 0x00000002, 0x0039C899, 0x003A4E99, 0x00000002, 0x0039C89A, + 0x003A4E9A, 0x00000002, 0x0039DC97, 0x00397297, 0x00000002, 0x0039DC9A, + 0x0039729A, 0x00000002, 0x0039DC97, 0x00397497, 0x00000002, 0x0039DC99, + 0x0039A499, 0x00000002, 0x0039DC9A, 0x0039A49A, 0x00000002, 0x0039DC97, + 0x003A4E97, 0x00000002, 0x0039DC9A, 0x003A4E9A, 0x00000002, 0x0039DE97, + 0x00396497, 0x00000002, 0x0039DE9A, 0x0039649A, 0x00000002, 0x0039DE97, + 0x00397297, 0x00000002, 0x0039DE9A, 0x0039729A, 0x00000002, 0x0039DE97, + 0x00397497, 0x00000002, 0x0039DE9A, 0x0039749A, + // Block 701, offset 0xaf40 + 0x00000002, 0x0039DE99, 0x0039A499, 0x00000002, 0x0039DE9A, 0x0039A49A, + 0x00000002, 0x0039DE97, 0x003A4E97, 0x00000002, 0x0039DE9A, 0x003A4E9A, + 0x00000002, 0x0039E697, 0x00397297, 0x00000002, 0x0039E69A, 0x0039729A, + 0x00000002, 0x0039E697, 0x003A4E97, 0x00000002, 0x0039E698, 0x003A4E98, + 0x00000002, 0x0039E69A, 0x003A4E9A, 0x00000002, 0x0039E897, 0x003A4E97, + 0x00000002, 0x0039E898, 0x003A4E98, 0x00000002, 0x0039E89A, 0x003A4E9A, + 0x00000002, 0x0039EE97, 0x00396497, 0x00000002, 0x0039EE9A, 0x0039649A, + 0x00000002, 0x0039EE97, 0x003A4E97, 0x00000002, 0x0039EE9A, 0x003A4E9A, + 0x00000002, 0x0039F097, 0x00396497, 0x00000002, 0x0039F09A, 0x0039649A, + 0x00000002, 0x0039F097, 0x003A4E97, 0x00000002, 0x0039F09A, 0x003A4E9A, + 0x00000002, 0x0039FC97, 0x00396497, 0x00000002, + // Block 702, offset 0xaf80 + 0x0039FC9A, 0x0039649A, 0x00000002, 0x0039FC97, 0x00397297, 0x00000002, + 0x0039FC9A, 0x0039729A, 0x00000002, 0x0039FC97, 0x00397497, 0x00000002, + 0x0039FC9A, 0x0039749A, 0x00000002, 0x0039FC97, 0x003A4E97, 0x00000002, + 0x0039FC9A, 0x003A4E9A, 0x00000002, 0x003A1297, 0x00397297, 0x00000002, + 0x003A129A, 0x0039729A, 0x00000002, 0x003A1297, 0x003A4E97, 0x00000002, + 0x003A129A, 0x003A4E9A, 0x00000002, 0x003A4099, 0x00393899, 0x00000002, + 0x003A409A, 0x0039389A, 0x00000002, 0x003A4097, 0x00396497, 0x00000002, + 0x003A409A, 0x0039649A, 0x00000002, 0x003A4097, 0x00397297, 0x00000002, + 0x003A409A, 0x0039729A, 0x00000002, 0x003A4097, 0x00397497, 0x00000002, + 0x003A409A, 0x0039749A, 0x00000002, 0x003A4097, 0x003A4E97, 0x00000002, + 0x003A4098, 0x003A4E98, 0x00000002, 0x003A4099, + // Block 703, offset 0xafc0 + 0x003A4E99, 0x00000002, 0x003A409A, 0x003A4E9A, 0x00000002, 0x003A4E99, + 0x00393899, 0x00000002, 0x003A4E97, 0x00396497, 0x00000002, 0x003A4E9A, + 0x0039649A, 0x00000002, 0x003A4E97, 0x00397297, 0x00000002, 0x003A4E9A, + 0x0039729A, 0x00000002, 0x003A4E97, 0x00397497, 0x00000002, 0x003A4E9A, + 0x0039749A, 0x00000002, 0x003A4E97, 0x003A4E97, 0x00000002, 0x003A4E99, + 0x003A4E99, 0x00000002, 0x003A4E9A, 0x003A4E9A, 0x00000002, 0x003A5697, + 0x00396497, 0x00000002, 0x003A569A, 0x0039649A, 0x00000002, 0x003A5697, + 0x00397297, 0x00000002, 0x003A569A, 0x0039729A, 0x00000002, 0x003A5697, + 0x00397497, 0x00000002, 0x003A569A, 0x0039749A, 0x00000002, 0x003A5699, + 0x0039A499, 0x00000002, 0x003A5699, 0x0039A699, 0x00000002, 0x003A5697, + 0x003A4E97, 0x00000002, 0x003A5698, 0x003A4E98, + // Block 704, offset 0xb000 + 0x00000002, 0x003A5699, 0x003A4E99, 0x00000002, 0x003A569A, 0x003A4E9A, + 0x00000002, 0x003A5699, 0x003A5699, 0x00000002, 0x403A7220, 0xA000C602, + 0x00000002, 0x003A7484, 0x00391C84, 0x00000002, 0xAE604702, 0xAE603802, + 0x00000002, 0x40062C20, 0xAE603802, 0x00000002, 0x40063620, 0xAE603802, + 0x00000002, 0x40063820, 0xAE603802, 0x00000002, 0x402BDE20, 0xAE603602, + 0x00000002, 0x002BDE88, 0xAE603602, 0x00000002, 0x402BDE20, 0xAE603702, + 0x00000002, 0x002BDE88, 0xAE603702, 0x00000002, 0x402BDE20, 0xAE603802, + 0x00000002, 0x002BDE88, 0xAE603802, 0x00000002, 0x402BDE20, 0xAE603902, + 0x00000002, 0x002BDE88, 0xAE603902, 0x00000003, 0x402BDE20, 0xAE604302, + 0xAE603802, 0x00000003, 0x002BDE88, 0xAE604302, 0xAE603802, 0x00000004, + 0x002BDE84, 0xA0013904, 0x002C9884, 0xAE603802, + // Block 705, offset 0xb040 + 0x00000004, 0x002BDE8A, 0xA0013904, 0x002C988A, 0xAE603802, 0x00000002, + 0x402BE020, 0xAE603602, 0x00000002, 0x002BE083, 0xAE603602, 0x00000002, + 0x402BE020, 0xAE603702, 0x00000002, 0x002BE083, 0xAE603702, 0x00000002, + 0x402BE020, 0xAE603802, 0x00000002, 0x002BE083, 0xAE603802, 0x00000002, + 0x402BE020, 0xAE603902, 0x00000002, 0x002BE083, 0xAE603902, 0x00000002, + 0x402BE220, 0xAE603602, 0x00000002, 0x002BE283, 0xAE603602, 0x00000002, + 0x402BE220, 0xAE603702, 0x00000002, 0x002BE283, 0xAE603702, 0x00000002, + 0x402BE220, 0xAE603802, 0x00000002, 0x002BE283, 0xAE603802, 0x00000002, + 0x402BE220, 0xAE603902, 0x00000002, 0x002BE283, 0xAE603902, 0x00000002, + 0x402C0A20, 0xAE603902, 0x00000002, 0x002C0A88, 0xAE603902, 0x00000002, + 0x402C3A20, 0xAE603802, 0x00000002, 0x002C3A88, + // Block 706, offset 0xb080 + 0xAE603802, 0x00000003, 0x402C3A20, 0xACA05602, 0xAE603802, 0x00000003, + 0x002C3A88, 0xACA05602, 0xAE603802, 0x00000002, 0x402C6220, 0xAE603902, + 0x00000002, 0x002C6288, 0xAE603902, 0x00000002, 0x402C9820, 0xAE603602, + 0x00000002, 0x002C9888, 0xAE603602, 0x00000002, 0x402C9820, 0xAE603702, + 0x00000002, 0x002C9888, 0xAE603702, 0x00000002, 0x402C9820, 0xAE603802, + 0x00000002, 0x002C9888, 0xAE603802, 0x00000002, 0x402C9820, 0xAE603902, + 0x00000002, 0x002C9888, 0xAE603902, 0x00000003, 0x402C9820, 0xAE605B02, + 0xAE603802, 0x00000003, 0x002C9888, 0xAE605B02, 0xAE603802, 0x00000002, + 0x402C9A20, 0xAE603602, 0x00000002, 0x002C9A83, 0xAE603602, 0x00000002, + 0x402C9A20, 0xAE603702, 0x00000002, 0x002C9A83, 0xAE603702, 0x00000002, + 0x402C9A20, 0xAE603802, 0x00000002, 0x002C9A83, + // Block 707, offset 0xb0c0 + 0xAE603802, 0x00000002, 0x402C9A20, 0xAE603902, 0x00000002, 0x002C9A83, + 0xAE603902, 0x00000002, 0x402D2220, 0xAE603802, 0x00000002, 0x002D2288, + 0xAE603802, 0x00000002, 0x402D6820, 0xAE603902, 0x00000002, 0x002D6888, + 0xAE603902, 0x00000002, 0x402D9A20, 0xAE603602, 0x00000002, 0x002D9A88, + 0xAE603602, 0x00000002, 0x402D9A20, 0xAE603702, 0x00000002, 0x002D9A88, + 0xAE603702, 0x00000002, 0x402D9A20, 0xAE603802, 0x00000002, 0x002D9A88, + 0xAE603802, 0x00000002, 0x402D9A20, 0xAE603902, 0x00000002, 0x002D9A88, + 0xAE603902, 0x00000003, 0x402D9A20, 0xAE604702, 0xAE603802, 0x00000003, + 0x002D9A88, 0xAE604702, 0xAE603802, 0x00000002, 0x402DFE20, 0xAE603802, + 0x00000002, 0x002DFE88, 0xAE603802, 0x00000002, 0x402DFE20, 0xAE603902, + 0x00000002, 0x002DFE88, 0xAE603902, 0x00000002, + // Block 708, offset 0xb100 + 0x402E2220, 0xAE603802, 0x00000002, 0x002E2288, 0xAE603802, 0x00000002, + 0x402E2220, 0xAE603902, 0x00000002, 0x002E2288, 0xAE603902, 0x00000003, + 0x402E2220, 0xAE603902, 0xAE605B02, 0x00000003, 0x002E2288, 0xAE603902, + 0xAE605B02, 0x00000002, 0x402E8220, 0xAE603802, 0x00000002, 0x002E8288, + 0xAE603802, 0x00000002, 0x402E8220, 0xAE603902, 0x00000002, 0x002E8288, + 0xAE603902, 0x00000002, 0x402E9E20, 0xAE603702, 0x00000002, 0x002E9E88, + 0xAE603702, 0x00000002, 0x402E9E20, 0xAE603802, 0x00000002, 0x002E9E88, + 0xAE603802, 0x00000002, 0x402E9E20, 0xAE603902, 0x00000002, 0x002E9E88, + 0xAE603902, 0x00000002, 0x402EE220, 0xAE603602, 0x00000002, 0x002EE288, + 0xAE603602, 0x00000002, 0x402EE220, 0xAE603702, 0x00000002, 0x002EE288, + 0xAE603702, 0x00000003, 0x402EE220, 0xAE603702, + // Block 709, offset 0xb140 + 0xAE603802, 0x00000003, 0x002EE288, 0xAE603702, 0xAE603802, 0x00000003, + 0x402EE220, 0xAE603702, 0xAE604702, 0x00000003, 0x002EE288, 0xAE603702, + 0xAE604702, 0x00000003, 0x402EE220, 0xAE603702, 0xAE605B02, 0x00000003, + 0x002EE288, 0xAE603702, 0xAE605B02, 0x00000002, 0x402EE220, 0xAE603802, + 0x00000002, 0x002EE288, 0xAE603802, 0x00000002, 0x402EE220, 0xAE603902, + 0x00000002, 0x002EE288, 0xAE603902, 0x00000003, 0x402EE220, 0xA0005402, + 0xAE603802, 0x00000003, 0x002EE288, 0xA0005402, 0xAE603802, 0x00000003, + 0x402EE220, 0xAE605B02, 0xAE603802, 0x00000003, 0x002EE288, 0xAE605B02, + 0xAE603802, 0x00000002, 0x402EE420, 0xAE603602, 0x00000002, 0x002EE483, + 0xAE603602, 0x00000002, 0x402EE420, 0xAE603702, 0x00000002, 0x002EE483, + 0xAE603702, 0x00000002, 0x402EE420, 0xAE603802, + // Block 710, offset 0xb180 + 0x00000002, 0x002EE483, 0xAE603802, 0x00000002, 0x402EE420, 0xAE603902, + 0x00000002, 0x002EE483, 0xAE603902, 0x00000002, 0x402EE620, 0xAE603502, + 0x00000002, 0x002EE683, 0xAE603502, 0x00000002, 0x402EE620, 0xAE603602, + 0x00000002, 0x002EE683, 0xAE603602, 0x00000002, 0x402EE620, 0xAE603702, + 0x00000002, 0x002EE683, 0xAE603702, 0x00000002, 0x402EE620, 0xAE603802, + 0x00000002, 0x002EE683, 0xAE603802, 0x00000002, 0x402EE620, 0xAE603902, + 0x00000002, 0x002EE683, 0xAE603902, 0x00000002, 0x402F2C20, 0xAE603802, + 0x00000002, 0x002F2C88, 0xAE603802, 0x00000002, 0x402F7A20, 0xAE603802, + 0x00000002, 0x002F7A88, 0xAE603802, 0x00000002, 0x402F7A20, 0xAE603902, + 0x00000002, 0x002F7A88, 0xAE603902, 0x00000003, 0x402F7A20, 0xAE603902, + 0xAE605B02, 0x00000003, 0x002F7A88, 0xAE603902, + // Block 711, offset 0xb1c0 + 0xAE605B02, 0x00000002, 0x402FE620, 0xAE603802, 0x00000002, 0x002FE688, + 0xAE603802, 0x00000003, 0x402FE620, 0xAE603802, 0xAE605202, 0x00000003, + 0x002FE688, 0xAE603802, 0xAE605202, 0x00000002, 0x402FE620, 0xAE603902, + 0x00000002, 0x002FE688, 0xAE603902, 0x00000003, 0x402FE620, 0xAE603902, + 0xAE605202, 0x00000003, 0x002FE688, 0xAE603902, 0xAE605202, 0x00000002, + 0x40302C20, 0xAE603902, 0x00000002, 0x00302C88, 0xAE603902, 0x00000002, + 0x40306C20, 0xAE603602, 0x00000002, 0x00306C88, 0xAE603602, 0x00000002, + 0x40306C20, 0xAE603702, 0x00000002, 0x00306C88, 0xAE603702, 0x00000003, + 0x40306C20, 0xAE603702, 0xAE603802, 0x00000003, 0x00306C88, 0xAE603702, + 0xAE603802, 0x00000002, 0x40306C20, 0xAE603802, 0x00000002, 0x00306C88, + 0xAE603802, 0x00000002, 0x40306C20, 0xAE603902, + // Block 712, offset 0xb200 + 0x00000002, 0x00306C88, 0xAE603902, 0x00000003, 0x40306C20, 0xAE604702, + 0xAE603802, 0x00000003, 0x00306C88, 0xAE604702, 0xAE603802, 0x00000002, + 0x40306E20, 0xAE603602, 0x00000002, 0x00306E83, 0xAE603602, 0x00000002, + 0x40306E20, 0xAE603702, 0x00000002, 0x00306E83, 0xAE603702, 0x00000002, + 0x40306E20, 0xAE603802, 0x00000002, 0x00306E83, 0xAE603802, 0x00000002, + 0x40306E20, 0xAE603902, 0x00000002, 0x00306E83, 0xAE603902, 0x00000002, + 0x4030BE20, 0xAE603702, 0x00000002, 0x0030BE88, 0xAE603702, 0x00000002, + 0x4030BE20, 0xAE603902, 0x00000002, 0x0030BE88, 0xAE603902, 0x00000002, + 0x4030E220, 0xAE603802, 0x00000002, 0x0030E288, 0xAE603802, 0x00000002, + 0x4030E220, 0xAE603902, 0x00000002, 0x0030E288, 0xAE603902, 0x00000002, + 0x40310020, 0xAE603602, 0x00000002, 0x00310088, + // Block 713, offset 0xb240 + 0xAE603602, 0x00000002, 0x40310020, 0xAE603702, 0x00000002, 0x00310088, + 0xAE603702, 0x00000002, 0x40310020, 0xAE603802, 0x00000002, 0x00310088, + 0xAE603802, 0x00000002, 0x40310020, 0xAE603902, 0x00000002, 0x00310088, + 0xAE603902, 0x00000002, 0x40312A20, 0xAE603802, 0x00000002, 0x00312A88, + 0xAE603802, 0x00000002, 0x40312A20, 0xAE603902, 0x00000002, 0x00312A88, + 0xAE603902, 0x00000003, 0x40325220, 0xAE602202, 0xAE603802, 0x00000003, + 0x00325288, 0xAE602202, 0xAE603802, 0x00000004, 0x40325220, 0xAE602202, + 0xAE603802, 0xAF007F02, 0x00000004, 0x00325288, 0xAE602202, 0xAE603802, + 0xAF007F02, 0x00000003, 0x40325220, 0xAE602A02, 0xAE603802, 0x00000003, + 0x00325288, 0xAE602A02, 0xAE603802, 0x00000004, 0x40325220, 0xAE602A02, + 0xAE603802, 0xAF007F02, 0x00000004, 0x00325288, + // Block 714, offset 0xb280 + 0xAE602A02, 0xAE603802, 0xAF007F02, 0x00000002, 0x40325220, 0xAE603802, + 0x00000002, 0x00325288, 0xAE603802, 0x00000003, 0x40325220, 0xAE603802, + 0xAF007F02, 0x00000003, 0x40325C20, 0xAE602202, 0xAE603802, 0x00000003, + 0x00325C88, 0xAE602202, 0xAE603802, 0x00000003, 0x40325C20, 0xAE602A02, + 0xAE603802, 0x00000003, 0x00325C88, 0xAE602A02, 0xAE603802, 0x00000002, + 0x40325C20, 0xAE603802, 0x00000002, 0x00325C88, 0xAE603802, 0x00000003, + 0x40326820, 0xAE602202, 0xAE603802, 0x00000003, 0x00326888, 0xAE602202, + 0xAE603802, 0x00000004, 0x40326820, 0xAE602202, 0xAE603802, 0xAF007F02, + 0x00000004, 0x00326888, 0xAE602202, 0xAE603802, 0xAF007F02, 0x00000003, + 0x40326820, 0xAE602A02, 0xAE603802, 0x00000003, 0x00326888, 0xAE602A02, + 0xAE603802, 0x00000004, 0x40326820, 0xAE602A02, + // Block 715, offset 0xb2c0 + 0xAE603802, 0xAF007F02, 0x00000004, 0x00326888, 0xAE602A02, 0xAE603802, + 0xAF007F02, 0x00000002, 0x40326820, 0xAE603802, 0x00000002, 0x00326888, + 0xAE603802, 0x00000003, 0x40326820, 0xAE603802, 0xAF007F02, 0x00000003, + 0x40326C20, 0xAE602202, 0xAE603802, 0x00000003, 0x00326C88, 0xAE602202, + 0xAE603802, 0x00000003, 0x40326C20, 0xAE602A02, 0xAE603802, 0x00000003, + 0x00326C88, 0xAE602A02, 0xAE603802, 0x00000002, 0x40326C20, 0xAE603802, + 0x00000002, 0x00326C88, 0xAE603802, 0x00000003, 0x40326C20, 0xAE604702, + 0xAE603802, 0x00000003, 0x40327C20, 0xAE602202, 0xAE603802, 0x00000003, + 0x00327C88, 0xAE602202, 0xAE603802, 0x00000003, 0x40327C20, 0xAE602A02, + 0xAE603802, 0x00000003, 0x00327C88, 0xAE602A02, 0xAE603802, 0x00000002, + 0x40327C20, 0xAE603802, 0x00000002, 0x00327C88, + // Block 716, offset 0xb300 + 0xAE603802, 0x00000003, 0x40329820, 0xAE602202, 0xAE603802, 0x00000003, + 0x40329820, 0xAE602A02, 0xAE603802, 0x00000003, 0x00329888, 0xAE602A02, + 0xAE603802, 0x00000002, 0x40329820, 0xAE603802, 0x00000002, 0x00329888, + 0xAE603802, 0x00000003, 0x40329820, 0xAE604702, 0xAE603802, 0x00000003, + 0x4032A220, 0xAE602202, 0xAE603802, 0x00000003, 0x0032A288, 0xAE602202, + 0xAE603802, 0x00000004, 0x4032A220, 0xAE602202, 0xAE603802, 0xAF007F02, + 0x00000004, 0x0032A288, 0xAE602202, 0xAE603802, 0xAF007F02, 0x00000003, + 0x4032A220, 0xAE602A02, 0xAE603802, 0x00000003, 0x0032A288, 0xAE602A02, + 0xAE603802, 0x00000004, 0x4032A220, 0xAE602A02, 0xAE603802, 0xAF007F02, + 0x00000004, 0x0032A288, 0xAE602A02, 0xAE603802, 0xAF007F02, 0x00000002, + 0x4032A220, 0xAE603802, 0x00000002, 0x0032A288, + // Block 717, offset 0xb340 + 0xAE603802, 0x00000003, 0x4032A220, 0xAE603802, 0xAF007F02, 0x00000002, + 0x402BDE20, 0xAE603202, 0x00000002, 0x402C9820, 0xAE603202, 0x00000002, + 0x402D9A20, 0xAE603202, 0x00000002, 0x402EE220, 0xAE603202, 0x00000002, + 0x40306C20, 0xAE603202, 0x00000002, 0x402C9A20, 0xAE603C02, 0x00000002, + 0x002C9A83, 0xAE603C02, 0x00000003, 0x0003F483, 0x6C030A20, 0x4003F620, + 0x00000003, 0x0003F483, 0x6C110E20, 0x4003F620, 0x00000003, 0x0003F483, + 0x6C272220, 0x4003F620, 0x00000003, 0x0003F483, 0x6C37B420, 0x4003F620, + 0x00000003, 0x0003F483, 0x6C549820, 0x4003F620, 0x00000003, 0x0003F483, + 0x6C5D8420, 0x4003F620, 0x00000003, 0x0003F483, 0x6C61F420, 0x4003F620, + 0x00000003, 0x0003F483, 0x6C64CA20, 0x4003F620, 0x00000003, 0x0003F483, + 0x6C6C2E20, 0x4003F620, 0x00000003, 0x0003F483, + // Block 718, offset 0xb380 + 0x6C6F9A20, 0x4003F620, 0x00000003, 0x0003F483, 0x6C814020, 0x4003F620, + 0x00000003, 0x0003F483, 0x6C8F2420, 0x4003F620, 0x00000003, 0x0003F483, + 0x6C9FE620, 0x4003F620, 0x00000003, 0x0003F483, 0x6CA25C20, 0x4003F620, + 0x00000003, 0x0003F483, 0x6CB4C620, 0x4003F620, 0x00000003, 0x0003F483, + 0x6CB6C820, 0x4003F620, 0x00000003, 0x0003F483, 0x6CC63620, 0x4003F620, + 0x00000003, 0x0003F483, 0x6CC9F220, 0x4003F620, 0x00000003, 0x0003F483, + 0x6CCF3620, 0x4003F620, 0x00000003, 0x0003F483, 0x6CD22420, 0x4003F620, + 0x00000003, 0x0003F483, 0x6CD70220, 0x4003F620, 0x00000003, 0x0003F483, + 0x6CD87420, 0x4003F620, 0x00000003, 0x0003F483, 0x6CE27020, 0x4003F620, + 0x00000003, 0x0003F483, 0x6CE91020, 0x4003F620, 0x00000003, 0x0003F483, + 0x6CF41420, 0x4003F620, 0x00000003, 0x0003F483, + // Block 719, offset 0xb3c0 + 0x6D007020, 0x4003F620, 0x00000003, 0x0003F483, 0x6D04B220, 0x4003F620, + 0x00000003, 0x0003F483, 0x6D08F820, 0x4003F620, 0x00000003, 0x0003F483, + 0x6D13B620, 0x4003F620, 0x00000003, 0x0003F483, 0x6D1F9820, 0x4003F620, + 0x00000003, 0x0003F483, 0x6D266820, 0x4003F620, 0x00000003, 0x0003F483, + 0x6D357020, 0x4003F620, 0x00000003, 0x0003F483, 0x6D399220, 0x4003F620, + 0x00000003, 0x0003F483, 0x6D3AC620, 0x4003F620, 0x00000003, 0x0003F483, + 0x6D3E6020, 0x4003F620, 0x00000003, 0x0003F483, 0x6D3F2A20, 0x4003F620, + 0x00000003, 0x0004B083, 0x6C011220, 0x4004B220, 0x00000003, 0x0004B083, + 0x6C044020, 0x4004B220, 0x00000003, 0x0004B083, 0x6C079220, 0x4004B220, + 0x00000003, 0x0004B083, 0x6C26E020, 0x4004B220, 0x00000003, 0x0004B083, + 0x6C2A1220, 0x4004B220, 0x00000003, 0x0004B083, + // Block 720, offset 0xb400 + 0x6C2D0A20, 0x4004B220, 0x00000003, 0x0004B083, 0x6C37B420, 0x4004B220, + 0x00000003, 0x0004B083, 0x6CC9F220, 0x4004B220, 0x00000003, 0x0004B083, + 0x6CD16420, 0x4004B220, 0x00000003, 0x0029CE83, 0x4029CC20, 0x6C2D0A20, + 0x00000003, 0x0029CE83, 0x4029CC20, 0x6CC63620, 0x00000003, 0x0029CE83, + 0x4029CC20, 0x6D266820, 0x00000003, 0x0029CE83, 0x4029CE20, 0x6C2D0A20, + 0x00000003, 0x0029CE83, 0x4029CE20, 0x6CC63620, 0x00000003, 0x0029CE83, + 0x4029CE20, 0x6D266820, 0x00000003, 0x0029CE83, 0x4029D020, 0x6C2D0A20, + 0x00000003, 0x0029CE83, 0x4029D020, 0x6CC63620, 0x00000003, 0x0029CE83, + 0x4029D020, 0x6D266820, 0x00000003, 0x0029CE83, 0x4029D220, 0x6C2D0A20, + 0x00000003, 0x0029CE83, 0x4029D220, 0x6CC63620, 0x00000003, 0x0029CE83, + 0x4029D420, 0x6C2D0A20, 0x00000003, 0x0029CE83, + // Block 721, offset 0xb440 + 0x4029D420, 0x6CC63620, 0x00000003, 0x0029CE83, 0x4029D620, 0x6C2D0A20, + 0x00000003, 0x0029CE83, 0x4029D620, 0x6CC63620, 0x00000003, 0x0029CE83, + 0x4029D820, 0x6C2D0A20, 0x00000003, 0x0029CE83, 0x4029D820, 0x6CC63620, + 0x00000003, 0x0029CE83, 0x4029DA20, 0x6C2D0A20, 0x00000003, 0x0029CE83, + 0x4029DA20, 0x6CC63620, 0x00000003, 0x0029CE83, 0x4029DC20, 0x6C2D0A20, + 0x00000003, 0x0029CE83, 0x4029DC20, 0x6CC63620, 0x00000003, 0x0029CE83, + 0x4029DE20, 0x6C2D0A20, 0x00000003, 0x0029CE83, 0x4029DE20, 0x6CC63620, + 0x00000003, 0x0029D083, 0x4029CC20, 0x6C2D0A20, 0x00000003, 0x0029D083, + 0x4029CC20, 0x6CC63620, 0x00000003, 0x0029D083, 0x4029CE20, 0x6C2D0A20, + 0x00000003, 0x0029D083, 0x4029CE20, 0x6CC63620, 0x00000003, 0x0029D083, + 0x4029D020, 0x6C2D0A20, 0x00000003, 0x0029D083, + // Block 722, offset 0xb480 + 0x4029D020, 0x6CC63620, 0x00000003, 0x0029D083, 0x4029D220, 0x6C2D0A20, + 0x00000003, 0x0029D083, 0x4029D220, 0x6CC63620, 0x00000003, 0x0029D083, + 0x4029D420, 0x6C2D0A20, 0x00000003, 0x0029D083, 0x4029D420, 0x6CC63620, + 0x00000003, 0x0029D083, 0x4029D620, 0x6CC63620, 0x00000003, 0x0029D083, + 0x4029D820, 0x6CC63620, 0x00000003, 0x0029D083, 0x4029DA20, 0x6CC63620, + 0x00000003, 0x0029D083, 0x4029DC20, 0x6CC63620, 0x00000003, 0x0029D083, + 0x4029DE20, 0x6CC63620, 0x00000003, 0x0029D283, 0x4029CC20, 0x6CC63620, + 0x00000003, 0x0029D283, 0x4029CE20, 0x6CC63620, 0x00000002, 0x402BDE1C, + 0xAE604702, 0x00000002, 0x002BDE03, 0xAE604702, 0x00000002, 0x402BDE1C, + 0xAE605202, 0x00000002, 0x002BDE03, 0xAE605202, 0x00000002, 0x402BDE1D, + 0xAE603702, 0x00000002, 0x002BDE23, 0xAE603702, + // Block 723, offset 0xb4c0 + 0x00000002, 0x402BDE1D, 0xAE603C02, 0x00000002, 0x002BDE23, 0xAE603C02, + 0x00000002, 0x402BDE1D, 0xAE604302, 0x00000002, 0x002BDE23, 0xAE604302, + 0x00000002, 0x402BDE1F, 0xAE603702, 0x00000002, 0x002BDE63, 0xAE603702, + 0x00000002, 0x402BDE1F, 0xAE603C02, 0x00000002, 0x002BDE63, 0xAE603C02, + 0x00000002, 0x402C981C, 0xAE603202, 0x00000002, 0x002C9803, 0xAE603202, + 0x00000002, 0x402C981C, 0xAE603502, 0x00000002, 0x002C9803, 0xAE603502, + 0x00000002, 0x402D9A1D, 0xAE604702, 0x00000002, 0x002D9A23, 0xAE604702, + 0x00000002, 0x402EE21C, 0xAE603202, 0x00000002, 0x002EE203, 0xAE603202, + 0x00000002, 0x402EE21C, 0xAE603502, 0x00000002, 0x002EE203, 0xAE603502, + 0x00000002, 0x402EE21C, 0xAE604702, 0x00000002, 0x002EE203, 0xAE604702, + 0x00000002, 0x402EE21C, 0xAE604E02, 0x00000002, + // Block 724, offset 0xb500 + 0x002EE203, 0xAE604E02, 0x00000002, 0x402EE21C, 0xAE605202, 0x00000002, + 0x002EE203, 0xAE605202, 0x00000002, 0x402EE21C, 0xACA05902, 0x00000002, + 0x002EE203, 0xACA05902, 0x00000002, 0x402EE21D, 0xAE603C02, 0x00000002, + 0x002EE223, 0xAE603C02, 0x00000002, 0x402EE21D, 0xAE604E02, 0x00000002, + 0x002EE223, 0xAE604E02, 0x00000002, 0x402EE21D, 0xAD806802, 0x00000002, + 0x002EE223, 0xAD806802, 0x00000002, 0x402EE21F, 0xAE603C02, 0x00000002, + 0x002EE263, 0xAE603C02, 0x00000002, 0x402EE21F, 0xAD806802, 0x00000002, + 0x002EE263, 0xAD806802, 0x00000002, 0x40306C1C, 0xAE604702, 0x00000002, + 0x00306C03, 0xAE604702, 0x00000002, 0x40306C1D, 0xAE604E02, 0x00000002, + 0x00306C23, 0xAE604E02, 0x00000002, 0x40306C1D, 0xAD806802, 0x00000002, + 0x00306C23, 0xAD806802, 0x00000002, 0x40306C1F, + // Block 725, offset 0xb540 + 0xAD806802, 0x00000002, 0x00306C63, 0xAD806802, 0x00000004, 0x2D399283, + 0x6CD2FC20, 0x6C5B8A20, 0x6CCF3620, 0x00000003, 0x0003F483, 0x6C000220, + 0x4003F620, 0x00000003, 0x0003F483, 0x6C003620, 0x4003F620, 0x00000003, + 0x0003F483, 0x6C006220, 0x4003F620, 0x00000003, 0x0003F483, 0x6C007420, + 0x4003F620, 0x00000003, 0x0003F483, 0x6C008820, 0x4003F620, 0x00000003, + 0x0003F483, 0x6C00B620, 0x4003F620, 0x00000003, 0x0003F483, 0x6C00DC20, + 0x4003F620, 0x00000003, 0x0003F483, 0x6C018420, 0x4003F620, 0x00000003, + 0x0003F483, 0x6C028820, 0x4003F620, 0x00000003, 0x0003F483, 0x6C02D820, + 0x4003F620, 0x00000003, 0x0003F483, 0x6C049620, 0x4003F620, 0x00000003, + 0x0003F483, 0x6C049C20, 0x4003F620, 0x00000003, 0x0003F483, 0x6C049E20, + 0x4003F620, 0x00000003, 0x0003F483, 0x6C04C620, + // Block 726, offset 0xb580 + 0x4003F620, 0x00000003, 0x0003F483, 0x6C04D020, 0x4003F620, 0x00000003, + 0x0003F483, 0x6C05E620, 0x4003F620, 0x00000003, 0x0003F483, 0x6C079020, + 0x4003F620, 0x00000003, 0x0003F483, 0x6C0BA020, 0x4003F620, 0x00000003, + 0x0003F483, 0x6C0BC020, 0x4003F620, 0x00000003, 0x0003F483, 0x6C0E3E20, + 0x4003F620, 0x00000003, 0x0003F483, 0x6C127420, 0x4003F620, 0x00000003, + 0x0003F483, 0x6C147E20, 0x4003F620, 0x00000003, 0x0003F483, 0x6C148220, + 0x4003F620, 0x00000003, 0x0003F483, 0x6C185220, 0x4003F620, 0x00000003, + 0x0003F483, 0x6C2BB220, 0x4003F620, 0x00000003, 0x0003F483, 0x6C2CA220, + 0x4003F620, 0x00000003, 0x0003F483, 0x6C2FD820, 0x4003F620, 0x00000003, + 0x0003F483, 0x6C3CEE20, 0x4003F620, 0x00000003, 0x0003F483, 0x6C41DC20, + 0x4003F620, 0x00000003, 0x0003F483, 0x6C741620, + // Block 727, offset 0xb5c0 + 0x4003F620, 0x00000003, 0x0003F483, 0x6C791620, 0x4003F620, 0x00000003, + 0x0003F483, 0x6C7DE020, 0x4003F620, 0x00000003, 0x0003F483, 0x6C86F020, + 0x4003F620, 0x00000003, 0x0003F483, 0x6CA6A420, 0x4003F620, 0x00000003, + 0x0003F483, 0x6D0F3820, 0x4003F620, 0x00000003, 0x0003F483, 0x6D2EFA20, + 0x4003F620, 0x00000003, 0x0004B083, 0x6C007420, 0x4004B220, 0x00000003, + 0x0004B083, 0x6C00DC20, 0x4004B220, 0x00000003, 0x0004B083, 0x6C093E20, + 0x4004B220, 0x00000003, 0x0004B083, 0x6C096620, 0x4004B220, 0x00000003, + 0x0004B083, 0x6C0FC420, 0x4004B220, 0x00000003, 0x0004B083, 0x6C555C20, + 0x4004B220, 0x00000003, 0x0004B083, 0x6C9AC020, 0x4004B220, 0x00000003, + 0x0004B083, 0x6CA4CC20, 0x4004B220, 0x00000003, 0x0004B083, 0x6CB9B020, + 0x4004B220, 0x00000003, 0x0029CE83, 0x4029CC20, + // Block 728, offset 0xb600 + 0x6C049620, 0x00000003, 0x0029CE83, 0x4029CC20, 0x6C049C20, 0x00000003, + 0x0029CE83, 0x4029CC20, 0x6C555C20, 0x00000003, 0x0029CE83, 0x4029CE20, + 0x6C049620, 0x00000003, 0x0029CE83, 0x4029CE20, 0x6C049C20, 0x00000003, + 0x0029CE83, 0x4029CE20, 0x6C555C20, 0x00000003, 0x0029CE83, 0x4029D020, + 0x6C049620, 0x00000003, 0x0029CE83, 0x4029D020, 0x6C049C20, 0x00000003, + 0x0029CE83, 0x4029D020, 0x6C555C20, 0x00000003, 0x0029CE83, 0x4029D220, + 0x6C049620, 0x00000003, 0x0029CE83, 0x4029D220, 0x6C555C20, 0x00000003, + 0x0029CE83, 0x4029D420, 0x6C049620, 0x00000003, 0x0029CE83, 0x4029D420, + 0x6C555C20, 0x00000003, 0x0029CE83, 0x4029D620, 0x6C049620, 0x00000003, + 0x0029CE83, 0x4029D620, 0x6C555C20, 0x00000003, 0x0029CE83, 0x4029D820, + 0x6C049620, 0x00000003, 0x0029CE83, 0x4029D820, + // Block 729, offset 0xb640 + 0x6C555C20, 0x00000003, 0x0029CE83, 0x4029DA20, 0x6C049620, 0x00000003, + 0x0029CE83, 0x4029DA20, 0x6C555C20, 0x00000003, 0x0029CE83, 0x4029DC20, + 0x6C049620, 0x00000003, 0x0029CE83, 0x4029DC20, 0x6C555C20, 0x00000003, + 0x0029CE83, 0x4029DE20, 0x6C049620, 0x00000003, 0x0029CE83, 0x4029DE20, + 0x6C555C20, 0x00000003, 0x0029D083, 0x4029CC20, 0x6C049620, 0x00000003, + 0x0029D083, 0x4029CC20, 0x6C555C20, 0x00000003, 0x0029D083, 0x4029CE20, + 0x6C049620, 0x00000003, 0x0029D083, 0x4029CE20, 0x6C555C20, 0x00000003, + 0x0029D083, 0x4029D020, 0x6C049620, 0x00000003, 0x0029D083, 0x4029D020, + 0x6C555C20, 0x00000003, 0x0029D083, 0x4029D220, 0x6C049620, 0x00000003, + 0x0029D083, 0x4029D220, 0x6C555C20, 0x00000003, 0x0029D083, 0x4029D420, + 0x6C049620, 0x00000003, 0x0029D083, 0x4029D420, + // Block 730, offset 0xb680 + 0x6C555C20, 0x00000003, 0x0029D083, 0x4029D620, 0x6C049620, 0x00000003, + 0x0029D083, 0x4029D820, 0x6C049620, 0x00000003, 0x0029D083, 0x4029DA20, + 0x6C049620, 0x00000003, 0x0029D083, 0x4029DC20, 0x6C049620, 0x00000003, + 0x0029D083, 0x4029DE20, 0x6C049620, 0x00000003, 0x0029D283, 0x4029CC20, + 0x6C049620, 0x00000003, 0x0029D283, 0x4029CE20, 0x6C049620, 0x00000004, + 0x2C741683, 0x6C111820, 0x6C0BD220, 0x6C3CEE20, +} + +// mainContractElem: 4021 entries, 16084 bytes +var mainContractElem = [4021]uint32{ + // Block 0, offset 0x0 + 0x402E2220, 0xE0000CFB, 0xE0000CFB, 0x002E2288, 0xE0000D01, 0xE0000D01, + 0x40332220, 0x40332A20, 0x40333220, 0x00332288, 0x00332A88, 0x00333288, + 0x40333A20, 0x40334220, 0x00333A88, 0x00334288, 0x40336220, 0x4033A220, + 0x4033A220, 0x00336288, 0x0033A288, 0x0033A288, 0x4033B220, 0x4033BA20, + 0x0033B288, 0x0033BA88, 0x4033CA20, 0x4033D420, 0x0033CA88, 0x0033D488, + 0x4033E420, 0x4033F220, 0x0033E488, 0x0033F288, 0x40341420, 0x40343E20, + 0x40342420, 0x00341488, 0x00343E88, 0x00342488, 0x40342C20, 0x40343620, + 0x00342C88, 0x00343688, 0x4034EE20, 0x4034F620, 0x0034EE88, 0x0034F688, + 0x4034FE20, 0x40350620, 0x0034FE88, 0x00350688, 0x40345020, 0x40356A20, + 0x40356A20, 0x00345088, 0x00356A88, 0x00356A88, 0x40357220, 0x40357A20, + 0x40358220, 0x40358A20, 0x00357288, 0x00357A88, + // Block 1, offset 0x40 + 0x00358288, 0x00358A88, 0x40361820, 0x40362220, 0x00361888, 0x00362288, + 0x40367E20, 0x40368620, 0x00367E88, 0x00368688, 0x4036A820, 0x4036B020, + 0x0036A888, 0x0036B088, 0x40371420, 0x40371C20, 0x00371488, 0x00371C88, + 0x40393820, 0x40391E20, 0x40392020, 0x40392820, 0x403A7420, 0x40392620, + 0x403A9020, 0x40393020, 0x4040F020, 0x4040F420, 0x4040F620, 0x40426E20, + 0x40427220, 0x40427020, 0x40427420, 0x40429020, 0x40429420, 0x4042D020, + 0x4042D620, 0x4042DA20, 0x4042D220, 0x4042D820, 0x40435E20, 0x40436220, + 0x4043E020, 0x4043E220, 0x4043F020, 0x4043F820, 0x4043F620, 0x4043F220, + 0x4043F420, 0x4043F620, 0x4043F820, 0x40448220, 0x40448820, 0x40448C20, + 0x40448420, 0x40448A20, 0x40451E20, 0x40452620, 0x40452020, 0x40452420, + 0x40452820, 0x40452420, 0x40452620, 0x40498420, + // Block 2, offset 0x80 + 0xE0001881, 0xE0001890, 0xE000189F, 0xE00018AE, 0xE00018BD, 0xE00018CC, + 0xE00018DB, 0xE00018EA, 0xE00018F9, 0xE0001908, 0xE0001917, 0xE0001926, + 0xE0001935, 0xE0001944, 0xE0001953, 0xE0001962, 0xE0001971, 0xE0001980, + 0xE000198F, 0xE000199E, 0xE00019AD, 0xE00019BC, 0xE00019CB, 0xE00019DA, + 0xE00019E9, 0xE00019F8, 0xE0001A07, 0xE0001A16, 0xE0001A25, 0xE0001A34, + 0xE0001A43, 0xE0001A52, 0xE0001A61, 0xE0001A70, 0xE0001A7F, 0xE0001A8E, + 0xE0001A9D, 0xE0001AAC, 0xE0001ABB, 0xE0001ACA, 0xE0001AD9, 0xE0001AE8, + 0xE0001AF7, 0xE0001B06, 0xE0001B15, 0xE0001B24, 0x40498620, 0xE0001884, + 0xE0001893, 0xE00018A2, 0xE00018B1, 0xE00018C0, 0xE00018CF, 0xE00018DE, + 0xE00018ED, 0xE00018FC, 0xE000190B, 0xE000191A, 0xE0001929, 0xE0001938, + 0xE0001947, 0xE0001956, 0xE0001965, 0xE0001974, + // Block 3, offset 0xc0 + 0xE0001983, 0xE0001992, 0xE00019A1, 0xE00019B0, 0xE00019BF, 0xE00019CE, + 0xE00019DD, 0xE00019EC, 0xE00019FB, 0xE0001A0A, 0xE0001A19, 0xE0001A28, + 0xE0001A37, 0xE0001A46, 0xE0001A55, 0xE0001A64, 0xE0001A73, 0xE0001A82, + 0xE0001A91, 0xE0001AA0, 0xE0001AAF, 0xE0001ABE, 0xE0001ACD, 0xE0001ADC, + 0xE0001AEB, 0xE0001AFA, 0xE0001B09, 0xE0001B18, 0xE0001B27, 0x40498820, + 0xE0001887, 0xE0001896, 0xE00018A5, 0xE00018B4, 0xE00018C3, 0xE00018D2, + 0xE00018E1, 0xE00018F0, 0xE00018FF, 0xE000190E, 0xE000191D, 0xE000192C, + 0xE000193B, 0xE000194A, 0xE0001959, 0xE0001968, 0xE0001977, 0xE0001986, + 0xE0001995, 0xE00019A4, 0xE00019B3, 0xE00019C2, 0xE00019D1, 0xE00019E0, + 0xE00019EF, 0xE00019FE, 0xE0001A0D, 0xE0001A1C, 0xE0001A2B, 0xE0001A3A, + 0xE0001A49, 0xE0001A58, 0xE0001A67, 0xE0001A76, + // Block 4, offset 0x100 + 0xE0001A85, 0xE0001A94, 0xE0001AA3, 0xE0001AB2, 0xE0001AC1, 0xE0001AD0, + 0xE0001ADF, 0xE0001AEE, 0xE0001AFD, 0xE0001B0C, 0xE0001B1B, 0xE0001B2A, + 0x40498A20, 0xE000188A, 0xE0001899, 0xE00018A8, 0xE00018B7, 0xE00018C6, + 0xE00018D5, 0xE00018E4, 0xE00018F3, 0xE0001902, 0xE0001911, 0xE0001920, + 0xE000192F, 0xE000193E, 0xE000194D, 0xE000195C, 0xE000196B, 0xE000197A, + 0xE0001989, 0xE0001998, 0xE00019A7, 0xE00019B6, 0xE00019C5, 0xE00019D4, + 0xE00019E3, 0xE00019F2, 0xE0001A01, 0xE0001A10, 0xE0001A1F, 0xE0001A2E, + 0xE0001A3D, 0xE0001A4C, 0xE0001A5B, 0xE0001A6A, 0xE0001A79, 0xE0001A88, + 0xE0001A97, 0xE0001AA6, 0xE0001AB5, 0xE0001AC4, 0xE0001AD3, 0xE0001AE2, + 0xE0001AF1, 0xE0001B00, 0xE0001B0F, 0xE0001B1E, 0xE0001B2D, 0x40498C20, + 0xE000188D, 0xE000189C, 0xE00018AB, 0xE00018BA, + // Block 5, offset 0x140 + 0xE00018C9, 0xE00018D8, 0xE00018E7, 0xE00018F6, 0xE0001905, 0xE0001914, + 0xE0001923, 0xE0001932, 0xE0001941, 0xE0001950, 0xE000195F, 0xE000196E, + 0xE000197D, 0xE000198C, 0xE000199B, 0xE00019AA, 0xE00019B9, 0xE00019C8, + 0xE00019D7, 0xE00019E6, 0xE00019F5, 0xE0001A04, 0xE0001A13, 0xE0001A22, + 0xE0001A31, 0xE0001A40, 0xE0001A4F, 0xE0001A5E, 0xE0001A6D, 0xE0001A7C, + 0xE0001A8B, 0xE0001A9A, 0xE0001AA9, 0xE0001AB8, 0xE0001AC7, 0xE0001AD6, + 0xE0001AE5, 0xE0001AF4, 0xE0001B03, 0xE0001B12, 0xE0001B21, 0xE0001B30, + 0xA0010502, 0x40497420, 0x4049E620, 0xE0001B42, 0xE0001B51, 0xE0001B60, + 0xE0001B6F, 0xE0001B7E, 0xE0001B9C, 0xE0001BBA, 0xE0001BC9, 0xE0001BD8, + 0xE0001BE7, 0xE0001BF6, 0xE0001C05, 0xE0001C14, 0xE0001C23, 0xE0001C32, + 0xE0001C41, 0xE0001C50, 0xE0001C5F, 0xE0001C6E, + // Block 6, offset 0x180 + 0xE0001C7D, 0xE0001C8C, 0xE0001C9B, 0xE0001CAA, 0xE0001B8D, 0xE0001CE1, + 0xE0001CF0, 0xE0001CFF, 0xE0001CB9, 0xE0001CCD, 0xE0001B33, 0xE0001BAB, + 0x4049E820, 0xE0001B45, 0xE0001B54, 0xE0001B63, 0xE0001B72, 0xE0001B81, + 0xE0001B9F, 0xE0001BBD, 0xE0001BCC, 0xE0001BDB, 0xE0001BEA, 0xE0001BF9, + 0xE0001C08, 0xE0001C17, 0xE0001C26, 0xE0001C35, 0xE0001C44, 0xE0001C53, + 0xE0001C62, 0xE0001C71, 0xE0001C80, 0xE0001C8F, 0xE0001C9E, 0xE0001CAD, + 0xE0001B90, 0xE0001CE4, 0xE0001CF3, 0xE0001D02, 0xE0001CBD, 0xE0001CD1, + 0xE0001B36, 0xE0001BAE, 0x4049EA20, 0xE0001B48, 0xE0001B57, 0xE0001B66, + 0xE0001B75, 0xE0001B84, 0xE0001BA2, 0xE0001BC0, 0xE0001BCF, 0xE0001BDE, + 0xE0001BED, 0xE0001BFC, 0xE0001C0B, 0xE0001C1A, 0xE0001C29, 0xE0001C38, + 0xE0001C47, 0xE0001C56, 0xE0001C65, 0xE0001C74, + // Block 7, offset 0x1c0 + 0xE0001C83, 0xE0001C92, 0xE0001CA1, 0xE0001CB0, 0xE0001B93, 0xE0001CE7, + 0xE0001CF6, 0xE0001D05, 0xE0001CC1, 0xE0001CD5, 0xE0001B39, 0xE0001BB1, + 0x4049EC20, 0xE0001B4B, 0xE0001B5A, 0xE0001B69, 0xE0001B78, 0xE0001B87, + 0xE0001BA5, 0xE0001BC3, 0xE0001BD2, 0xE0001BE1, 0xE0001BF0, 0xE0001BFF, + 0xE0001C0E, 0xE0001C1D, 0xE0001C2C, 0xE0001C3B, 0xE0001C4A, 0xE0001C59, + 0xE0001C68, 0xE0001C77, 0xE0001C86, 0xE0001C95, 0xE0001CA4, 0xE0001CB3, + 0xE0001B96, 0xE0001CEA, 0xE0001CF9, 0xE0001D08, 0xE0001CC5, 0xE0001CD9, + 0xE0001B3C, 0xE0001BB4, 0x4049EE20, 0xE0001B4E, 0xE0001B5D, 0xE0001B6C, + 0xE0001B7B, 0xE0001B8A, 0xE0001BA8, 0xE0001BC6, 0xE0001BD5, 0xE0001BE4, + 0xE0001BF3, 0xE0001C02, 0xE0001C11, 0xE0001C20, 0xE0001C2F, 0xE0001C3E, + 0xE0001C4D, 0xE0001C5C, 0xE0001C6B, 0xE0001C7A, + // Block 8, offset 0x200 + 0xE0001C89, 0xE0001C98, 0xE0001CA7, 0xE0001CB6, 0xE0001B99, 0xE0001CED, + 0xE0001CFC, 0xE0001D0B, 0xE0001CC9, 0xE0001CDD, 0xE0001B3F, 0xE0001BB7, + 0xA0010B02, 0x4049D220, 0x404A5A20, 0xE0001D0E, 0xE0001D1D, 0xE0001D2C, + 0xE0001D3B, 0xE0001D4A, 0xE0001D59, 0xE0001D68, 0xE0001D77, 0xE0001D86, + 0xE0001D95, 0xE0001DA4, 0xE0001DB3, 0xE0001DC2, 0xE0001DD1, 0xE0001DE0, + 0xE0001DEF, 0xE0001DFE, 0xE0001E0D, 0xE0001E1C, 0xE0001E2B, 0xE0001E3A, + 0xE0001E49, 0xE0001E58, 0xE0001E67, 0xE0001E76, 0xE0001E85, 0xE0001E94, + 0xE0001EA3, 0xE0001EB2, 0xE0001EC1, 0xE0001ED0, 0xE0001EDF, 0xE0001EEE, + 0xE0001EFD, 0xE0001F0C, 0xE0001F1B, 0xE0001F2A, 0xE0001F39, 0xE0001F48, + 0xE0001F57, 0xE0001F66, 0xE0001F75, 0xE0001F84, 0xE0001F93, 0xE0001FA2, + 0xE0001FB1, 0xE0001FC0, 0xE0001FCF, 0x404A5C20, + // Block 9, offset 0x240 + 0xE0001D11, 0xE0001D20, 0xE0001D2F, 0xE0001D3E, 0xE0001D4D, 0xE0001D5C, + 0xE0001D6B, 0xE0001D7A, 0xE0001D89, 0xE0001D98, 0xE0001DA7, 0xE0001DB6, + 0xE0001DC5, 0xE0001DD4, 0xE0001DE3, 0xE0001DF2, 0xE0001E01, 0xE0001E10, + 0xE0001E1F, 0xE0001E2E, 0xE0001E3D, 0xE0001E4C, 0xE0001E5B, 0xE0001E6A, + 0xE0001E79, 0xE0001E88, 0xE0001E97, 0xE0001EA6, 0xE0001EB5, 0xE0001EC4, + 0xE0001ED3, 0xE0001EE2, 0xE0001EF1, 0xE0001F00, 0xE0001F0F, 0xE0001F1E, + 0xE0001F2D, 0xE0001F3C, 0xE0001F4B, 0xE0001F5A, 0xE0001F69, 0xE0001F78, + 0xE0001F87, 0xE0001F96, 0xE0001FA5, 0xE0001FB4, 0xE0001FC3, 0xE0001FD2, + 0x404A6220, 0xE0001D14, 0xE0001D23, 0xE0001D32, 0xE0001D41, 0xE0001D50, + 0xE0001D5F, 0xE0001D6E, 0xE0001D7D, 0xE0001D8C, 0xE0001D9B, 0xE0001DAA, + 0xE0001DB9, 0xE0001DC8, 0xE0001DD7, 0xE0001DE6, + // Block 10, offset 0x280 + 0xE0001DF5, 0xE0001E04, 0xE0001E13, 0xE0001E22, 0xE0001E31, 0xE0001E40, + 0xE0001E4F, 0xE0001E5E, 0xE0001E6D, 0xE0001E7C, 0xE0001E8B, 0xE0001E9A, + 0xE0001EA9, 0xE0001EB8, 0xE0001EC7, 0xE0001ED6, 0xE0001EE5, 0xE0001EF4, + 0xE0001F03, 0xE0001F12, 0xE0001F21, 0xE0001F30, 0xE0001F3F, 0xE0001F4E, + 0xE0001F5D, 0xE0001F6C, 0xE0001F7B, 0xE0001F8A, 0xE0001F99, 0xE0001FA8, + 0xE0001FB7, 0xE0001FC6, 0xE0001FD5, 0x404A6620, 0xE0001D17, 0xE0001D26, + 0xE0001D35, 0xE0001D44, 0xE0001D53, 0xE0001D62, 0xE0001D71, 0xE0001D80, + 0xE0001D8F, 0xE0001D9E, 0xE0001DAD, 0xE0001DBC, 0xE0001DCB, 0xE0001DDA, + 0xE0001DE9, 0xE0001DF8, 0xE0001E07, 0xE0001E16, 0xE0001E25, 0xE0001E34, + 0xE0001E43, 0xE0001E52, 0xE0001E61, 0xE0001E70, 0xE0001E7F, 0xE0001E8E, + 0xE0001E9D, 0xE0001EAC, 0xE0001EBB, 0xE0001ECA, + // Block 11, offset 0x2c0 + 0xE0001ED9, 0xE0001EE8, 0xE0001EF7, 0xE0001F06, 0xE0001F15, 0xE0001F24, + 0xE0001F33, 0xE0001F42, 0xE0001F51, 0xE0001F60, 0xE0001F6F, 0xE0001F7E, + 0xE0001F8D, 0xE0001F9C, 0xE0001FAB, 0xE0001FBA, 0xE0001FC9, 0xE0001FD8, + 0x404A6820, 0xE0001D1A, 0xE0001D29, 0xE0001D38, 0xE0001D47, 0xE0001D56, + 0xE0001D65, 0xE0001D74, 0xE0001D83, 0xE0001D92, 0xE0001DA1, 0xE0001DB0, + 0xE0001DBF, 0xE0001DCE, 0xE0001DDD, 0xE0001DEC, 0xE0001DFB, 0xE0001E0A, + 0xE0001E19, 0xE0001E28, 0xE0001E37, 0xE0001E46, 0xE0001E55, 0xE0001E64, + 0xE0001E73, 0xE0001E82, 0xE0001E91, 0xE0001EA0, 0xE0001EAF, 0xE0001EBE, + 0xE0001ECD, 0xE0001EDC, 0xE0001EEB, 0xE0001EFA, 0xE0001F09, 0xE0001F18, + 0xE0001F27, 0xE0001F36, 0xE0001F45, 0xE0001F54, 0xE0001F63, 0xE0001F72, + 0xE0001F81, 0xE0001F90, 0xE0001F9F, 0xE0001FAE, + // Block 12, offset 0x300 + 0xE0001FBD, 0xE0001FCC, 0xE0001FDB, 0x404AEA20, 0xE000200E, 0xE0002011, + 0x404B2620, 0x404B2420, 0x404B2620, 0x404AF020, 0xE0002014, 0xE0002017, + 0x404B2A20, 0x404B2820, 0x404B2A20, 0x8281258B, 0x8281258D, 0x82812591, + 0x8281258F, 0x404ECA20, 0x404ECC20, 0x404F9C20, 0x404F9620, 0x404F9E20, + 0x404F9820, 0x40522620, 0x40522820, 0x40522A20, 0x40522C20, 0x40522E20, + 0x40523020, 0x40523220, 0x40523420, 0x40523620, 0x40523820, 0x40523E20, + 0x40524020, 0x40529C20, 0x40529E20, 0x4052A020, 0x4052A220, 0x4052A420, + 0x4052A820, 0x4052A620, 0x4052AA20, 0x4052AC20, 0x4052AE20, 0x4040B620, + 0x4040B420, 0x40409820, 0x4040DC20, 0x402C3A20, 0x402C3C20, 0x002C3A88, + 0x002C3C83, 0x402D2220, 0x402D2420, 0x002D2288, 0x002D2483, 0x002D9883, + 0x002D9A83, 0x402EE220, 0x402EE420, 0x002EE288, + // Block 13, offset 0x340 + 0x002EE483, 0x402FE620, 0x402FE820, 0x002FE688, 0x002FE883, 0x40306C20, + 0x40306E20, 0x00306C88, 0x00306E83, 0x4033B220, 0x4033BA20, 0x4033B420, + 0x0033B288, 0x0033BA88, 0x0033B483, 0x402E2220, 0x402E2221, 0x402E2221, + 0x002E2288, 0x002E22A3, 0x002E22A3, 0x402C3A20, 0x402C3C20, 0x002D6A83, + 0x402D6A20, 0x002C3A88, 0x002C3C83, 0x002D6A85, 0x002D6A84, 0x402F7A20, + 0x402F7C20, 0x002F7A88, 0x002F7C83, 0x40312A20, 0x40312C20, 0x00312A88, + 0x00312C83, 0x002C3A88, 0x002C3C84, 0x002C3C83, 0x402C6220, 0x402C6420, + 0x002C6288, 0x002C6484, 0x002C6483, 0x402D0820, 0x402D0A20, 0x002D0888, + 0x002D0A84, 0x002D0A83, 0x402E9E20, 0x402D2420, 0x002E9E88, 0x002D2484, + 0x002D2483, 0x402E2220, 0xE0000CFB, 0xE0000CFB, 0x402E2420, 0x002E2288, + 0xE0000D01, 0xE0000D01, 0x002E2484, 0x002E2483, + // Block 14, offset 0x380 + 0x402F2C20, 0x402F2E20, 0x002F2C88, 0x002F2E84, 0x002F2E83, 0x002F7A88, + 0x002F7C84, 0x002F7C83, 0x40302C20, 0x40302E20, 0x00302C88, 0x00302E84, + 0x00302E83, 0x40306C20, 0x40310021, 0x40310022, 0x00306C88, 0x003100A3, + 0x003100C3, 0x402BDE20, 0x40320C21, 0x40321020, 0x00321084, 0x002BDE88, + 0x00320CA3, 0x00321083, 0x00321086, 0x00321085, 0x402C9820, 0x40320C22, + 0x002C9888, 0x00320CC3, 0x402EE220, 0x40320E21, 0x40320E22, 0x002EE288, + 0x00320EA3, 0x00320EC3, 0xAE611302, 0x404A7621, 0x404A7C21, 0x404AB020, + 0x404ACC20, 0x404ACE20, 0x404AD020, 0x404AD220, 0x404AD420, 0x404ADA20, + 0x404A8220, 0x404A8420, 0xE00029DC, 0xE00029E1, 0x404A8620, 0x404A8820, + 0x404A8A20, 0x404A8C20, 0x404A8E20, 0x404A9020, 0x404A9220, 0x404A9420, + 0x404A9620, 0x404A9820, 0x404A9A20, 0x404A9C20, + // Block 15, offset 0x3c0 + 0x404A8620, 0x404A8820, 0xE00029E6, 0xE00029EB, 0x404A8A20, 0x404A8C20, + 0x404A8E20, 0x404A9020, 0x404ABA20, 0x404ABC20, 0xE00029F0, 0xE00029F5, + 0x404ABE20, 0x404AC020, 0x404AC220, 0x404AC420, 0x404AC620, 0x404AC820, + 0x404ACA20, 0x404AD620, 0x404AD820, 0x404AC220, 0x404AC420, 0xE00029FA, + 0xE00029FF, 0x404AC620, 0x404AC820, 0x404ACA20, 0x404ACC20, 0x404ACE20, + 0x404AD020, 0x404AD220, 0x404AD420, 0x404AD620, 0x404AD820, 0x404ADA20, + 0x404ADC20, 0x404AC620, 0x404AC820, 0xE0002A04, 0xE0002A09, 0x404ACA20, + 0x404ACC20, 0x404ACE20, 0x404AD020, 0x404AD220, 0x404AD420, 0x404AD620, + 0x404AD820, 0x404ADC20, 0x404A7820, 0x404AC020, 0x404A9E20, 0xE0002A14, + 0xE0002A19, 0x404AA020, 0x404AA220, 0x404AA420, 0x404AA620, 0x404AA820, + 0x404AAA20, 0x404AAC20, 0x004AA283, 0x404AAE20, + // Block 16, offset 0x400 + 0x404AB020, 0x404AB220, 0x404ACC20, 0xE0002A1E, 0xE0002A23, 0x404ACE20, + 0x404AD020, 0x404AD220, 0x404AD420, 0x404AD620, 0x404AD820, 0x404ADA20, + 0x404ADC20, 0x004ACE83, 0x404A8220, 0x404AE820, 0x404AA420, 0x404A9A20, + 0x404A9E20, 0x404AB420, 0x404B1420, 0x404AE420, 0x404AD220, 0x404AD820, + 0x404AEA20, 0x404A9020, 0x404AB620, 0x404B1620, 0x404B1620, 0x404B1820, + 0xE0002A28, 0xE0002A2D, 0x404B1A20, 0x404B1C20, 0x404B1E20, 0x404B2020, + 0x404B2220, 0x404B2420, 0x404B2620, 0x404B2820, 0x404B2A20, 0x004B1E83, + 0x404A8420, 0x404AEA20, 0x404AA620, 0x404AA020, 0x404AB820, 0x404B1820, + 0x404AE620, 0x404AD420, 0x404B2C20, 0x404B2E20, 0x404B3020, 0x404A7A20, + 0x404A8C20, 0x404AAC20, 0x404ACC20, 0x404ADC20, 0x404AE020, 0x404AF620, + 0x404AE820, 0x404A7C20, 0x404AE220, 0x404A9E20, + // Block 17, offset 0x440 + 0x404A9620, 0x404A9A20, 0x404AAE20, 0x404B0E20, 0x404AE020, 0x404AFC20, + 0x404ADE20, 0x404ACE20, 0x404AD620, 0x404AEE20, 0x404A7E20, 0x404AE420, + 0x404AA020, 0x404A8E20, 0x404A9820, 0x404AB020, 0x404B1020, 0x404ADA20, + 0x404AFE20, 0x404B0020, 0x404AC420, 0x404AB420, 0x404AB620, 0x404AB820, + 0x404ABA20, 0x404ABC20, 0x404ABE20, 0x404AC020, 0x404A9220, 0xE0002A35, + 0xE0002A3A, 0x404A9420, 0x404A9620, 0x404A9820, 0x404A9A20, 0x404A9C20, + 0x404ADE20, 0x404AE020, 0xE0002A3F, 0xE0002A44, 0x404AE220, 0x404AE420, + 0x404AE620, 0x404AE820, 0x404AEA20, 0x404AEC20, 0x404ACA20, 0x404ACC20, + 0xE0002A49, 0xE0002A4E, 0x404ACE20, 0x404AD020, 0x404AD220, 0x404AD420, + 0x404AD620, 0x404AD820, 0x404ADA20, 0x404ADC20, 0x404ADE20, 0x004AD283, + 0x404A7E20, 0x404A8E20, 0x404A9220, 0x404A9820, + // Block 18, offset 0x480 + 0x404AAE20, 0x404ACE20, 0x404AD220, 0x404AFA20, 0x404A8020, 0x404AE620, + 0x404AA220, 0x404A9C20, 0x404AB220, 0x404B1220, 0x404AE220, 0x404ADC20, + 0x404B0020, 0x404AE020, 0x404AD020, 0x404AE020, 0x404AC220, 0x404AC420, + 0xE0002A56, 0xE0002A5B, 0x404AC620, 0x404AC820, 0x404ACA20, 0x404ACC20, + 0x404ACE20, 0x404AD020, 0x404AD220, 0x404AD420, 0x404AD620, 0x404AD820, + 0x404ADA20, 0x404ADC20, 0x004ACC83, 0x404ADE20, 0x404AE020, 0x404AEE20, + 0x404AF020, 0xE0002A60, 0xE0002A65, 0x404AF220, 0x404AF420, 0x404AF620, + 0x404AF820, 0x404AFA20, 0x404AFC20, 0x404AFE20, 0x404B0020, 0x404B0220, + 0x404B0420, 0x404B0620, 0x404B0820, 0x404B0A20, 0x004AF883, 0x404B0C20, + 0x404ADE20, 0x404AE020, 0xE0002A6A, 0xE0002A6F, 0x404AE220, 0x404AE420, + 0x404AE620, 0x404AE820, 0x404AEA20, 0x404AEC20, + // Block 19, offset 0x4c0 + 0x404AEE20, 0x404AF020, 0x404AF220, 0x404AF420, 0x404AF620, 0x004AE883, + 0x404AF820, 0x404AFA20, 0x404A8020, 0x404A9020, 0x404A9420, 0x404AB020, + 0x404ABE20, 0x404AD020, 0x404AD420, 0x404A8020, 0x404AB220, 0x404AB420, + 0xE00029BB, 0xE00029C0, 0x404AB620, 0x404AB820, 0x404ABA20, 0x404ABC20, + 0x404ABE20, 0x404AC020, 0x404AC220, 0x404AC420, 0x404AC620, 0x404AC820, + 0x404ACA20, 0x004ABA83, 0x404AB620, 0x404AB820, 0xE00029C5, 0xE00029CA, + 0x404ABA20, 0x404ABC20, 0x404ABE20, 0x404AC020, 0x404AC220, 0x404AC420, + 0x404AC620, 0x404AC820, 0x004ABE83, 0x404AFC20, 0x404AFE20, 0xE00029CF, + 0xE00029D4, 0x404B0020, 0x404B0220, 0x404B0420, 0x404B0620, 0x404B0820, + 0x404B0A20, 0x404B0C20, 0x404B0E20, 0x404B1020, 0x404B1220, 0x404B1420, + 0x404A8A20, 0x404A9620, 0x404AAA20, 0x404ACA20, + // Block 20, offset 0x500 + 0x404ADA20, 0x404ADE20, 0x404AE620, 0x404AF420, 0xAE611602, 0x404A9421, + 0xAE611402, 0x404AB821, 0x404ABC21, 0x828225B1, 0xE000200E, 0xE0002011, + 0x404B2620, 0xE0002A74, 0xE000200E, 0xE0002011, 0x404B2420, 0x404B2620, + 0x828225B2, 0xE0002014, 0xE0002017, 0x404B2A20, 0xE0002A77, 0xE0002014, + 0xE0002017, 0x404B2820, 0x404B2A20, 0xAE610F02, 0x8281258D, 0x82812591, + 0x8281258F, 0x002D2288, 0x002D2484, 0x002D2483, 0x402DFE20, 0x402E0020, + 0x002DFE88, 0x002E0084, 0x002E0083, 0x402E9E20, 0x402EA020, 0x002E9E88, + 0x002EA084, 0x002EA083, 0x402C7820, 0xE0000CFB, 0xE0000CFB, 0x402C3820, + 0xE0000D01, 0xE0000D01, 0x402D6820, 0x402D6A20, 0x002D6888, 0x002D6A83, + 0x402DCC20, 0x402DCE20, 0x002DCC88, 0x002DCE83, 0x002E9E88, 0x002EA083, + 0x402FE620, 0x40302620, 0x002FE688, 0x00302683, + // Block 21, offset 0x540 + 0x40302820, 0x40302A20, 0x00302883, 0x00302A83, 0x402EE220, 0x4030EE20, + 0x4030F220, 0x002EE288, 0x0030EE83, 0x0030F283, 0x402BDE20, 0x4030F020, + 0x002BDE88, 0x0030F083, 0x40306C20, 0x4030F420, 0x00306C88, 0x0030F483, + 0x40393820, 0x40393620, 0x40393A21, 0x40393A23, 0x403A7420, 0x40393A25, + 0x403A9220, 0x40393A26, 0x403A9221, 0x00393B43, 0x403A9223, 0x00393B44, + 0x403A8821, 0x403A8825, 0x40306C20, 0x40310021, 0x00306C88, 0x003100A3, + 0x402BDE20, 0x40320E20, 0x40320C20, 0x002BDE88, 0x00320E83, 0x00320C83, + 0x402EE220, 0x40321020, 0x002EE288, 0x00321083, 0x402E9E20, 0x402EA020, + 0x402EA220, 0x002E9E88, 0x002EA083, 0x002EA284, 0x002EA283, 0x002FE688, + 0x002FE884, 0x002FE883, 0x4031DE20, 0x00310286, 0x00310283, 0x4003D220, + 0x00310287, 0x00310284, 0x402BEC20, 0xE0000CFB, + // Block 22, offset 0x580 + 0xE0000CFB, 0x002BEC83, 0xE0000D01, 0xE0000D01, 0x402C3A20, 0x402C3E20, + 0x402C3C20, 0x002C3A88, 0x002C3E83, 0x002C3C83, 0x402C6220, 0x402C6420, + 0x402C6420, 0x002C6288, 0x002C6486, 0x002C6484, 0x002C6486, 0x002C6484, + 0x002E2288, 0xE0000D01, 0xE0000D01, 0x002E2486, 0x002E2484, 0x002E9E88, + 0x002EA086, 0x002EA084, 0x402C3A20, 0xE0003BD4, 0x402C3C20, 0x002C3A88, + 0xE0003BDA, 0xE0003BD7, 0x002C3C86, 0x002C3C84, 0x402C6220, 0xE0003BE6, + 0xE0003BDD, 0x402C6620, 0x402C6420, 0x002C6288, 0xE0003BEC, 0xE0003BE9, + 0xE0003BE3, 0x002C6686, 0xE0003BE0, 0x002C6684, 0x002C6486, 0x002C6484, + 0x402D2220, 0xE0003BEF, 0x402D2420, 0x002D2288, 0xE0003BF5, 0xE0003BF2, + 0x002D2486, 0x002D2484, 0x402E2220, 0xE0003BF8, 0xE0000CFB, 0xE0000CFB, + 0x402E2420, 0x002E2288, 0xE0003BFE, 0xE0003BFB, + // Block 23, offset 0x5c0 + 0xE0000D01, 0xE0000D01, 0x002E2486, 0x002E2484, 0x402E9E20, 0xE0003C01, + 0x402EA020, 0x002E9E88, 0xE0003C07, 0xE0003C04, 0x002EA086, 0x002EA084, + 0x402EE220, 0x402EE420, 0x402EE421, 0x002EE288, 0x002EE483, 0x002EE4A3, + 0x402FE620, 0xE0003C0A, 0x402FE820, 0x002FE688, 0xE0003C10, 0xE0003C0D, + 0x002FE886, 0x002FE884, 0x40302C20, 0xE0003C13, 0x40302E20, 0x00302C88, + 0xE0003C19, 0xE0003C16, 0x00302E86, 0x00302E84, 0x40306C20, 0x40306E20, + 0x40306E21, 0x00306C88, 0x00306E83, 0x00306EA3, 0x40312A20, 0xE0003C1C, + 0x40312C20, 0x00312A88, 0xE0003C22, 0xE0003C1F, 0x00312C86, 0x00312C84, + 0x00384A88, 0x00388A83, 0x402C3A20, 0x402C0C20, 0x002C3A88, 0x002C0C84, + 0x002C0C83, 0x402D2220, 0x402D2420, 0x402D2620, 0x402D2820, 0x002D2288, + 0x002D2484, 0x002D2684, 0x002D2884, 0x002D2483, + // Block 24, offset 0x600 + 0x002D2683, 0x002D2883, 0x402D9A20, 0x402D9C20, 0x002D9A88, 0x002D9C83, + 0x402DFE20, 0x402E0020, 0x402E0220, 0x002DFE88, 0x002E0084, 0x002E0284, + 0x002E0083, 0x002E0283, 0x402E9E20, 0x402EA020, 0x402EA220, 0x402EA420, + 0x002E9E88, 0x002EA083, 0x002EA284, 0x002EA484, 0x002EA283, 0x002EA483, + 0x402BDE20, 0x402C0820, 0x40320C21, 0x40321020, 0x002BDE88, 0x002C0883, + 0x00320CA3, 0x00321083, 0x402C9820, 0x402D0620, 0x002C9888, 0x002D0683, + 0x402D9A20, 0x402DCA20, 0x002D9A88, 0x002DCA83, 0x402EE220, 0x402F2A20, + 0x40320E20, 0x002EE288, 0x002F2A83, 0x00320E83, 0x40306C20, 0x4030BC20, + 0x00306C88, 0x0030BC83, 0x40310020, 0x40312820, 0x00310088, 0x00312883, + 0x0065768F, 0xE0003CAF, 0xE0003CA9, 0x0065768F, 0xE0003CA9, 0xE0003CAF, + 0x00657691, 0xE0003CB2, 0xE0003CAC, 0x00657691, + // Block 25, offset 0x640 + 0xE0003CAC, 0xE0003CB2, 0x0065828F, 0xE0003E2D, 0xE0003CB5, 0x0065828F, + 0xE0003CB5, 0xE0003E2D, 0x00658291, 0xE0003E33, 0xE0003CBB, 0xE0003E30, + 0xE0003CB8, 0x00658291, 0xE0003CBB, 0xE0003E33, 0xE0003CB8, 0xE0003E30, + 0x00658291, 0xE0003CB8, 0xE0003E30, 0xE000216D, 0xE0003E33, 0xE0003CBB, + 0xE000216D, 0xE0003CBB, 0xE0003E33, 0x00658C91, 0xE0003E76, 0xE0003E72, + 0xE0003CC2, 0xE0003E72, 0xE0003E6F, 0xE0003E72, 0xE0003CBF, 0x00658C91, + 0xE0003E76, 0xE0003CC2, 0xE0003E72, 0xE0003E72, 0xE0003CBF, 0xE0003E6F, + 0xE0003E72, 0x00658C91, 0xE0003E72, 0xE0003CBF, 0xE0003E6F, 0xE0003E72, + 0xE00021F2, 0xE0003E72, 0xE0003E76, 0xE0003CC2, 0xE00021F2, 0xE0003CC2, + 0xE0003E72, 0xE0003E76, 0x00659691, 0xE0003EC0, 0xE0003EBC, 0xE0003CC9, + 0xE0003EBC, 0xE0003EB9, 0xE0003EBC, 0xE0003CC6, + // Block 26, offset 0x680 + 0x00659691, 0xE0003EC0, 0xE0003CC9, 0xE0003EBC, 0xE0003EBC, 0xE0003CC6, + 0xE0003EB9, 0xE0003EBC, 0x00659691, 0xE0003EBC, 0xE0003CC6, 0xE0003EB9, + 0xE0003EBC, 0xE000222C, 0xE0003EBC, 0xE0003EC0, 0xE0003CC9, 0xE000222C, + 0xE0003CC9, 0xE0003EBC, 0xE0003EC0, 0x0065A091, 0xE0003F03, 0xE0003CCD, + 0x0065A091, 0xE0003CCD, 0xE0003F03, 0x0065AA8F, 0xE0003F1B, 0xE0003CD0, + 0xE0003F15, 0xE0003F1B, 0x0065AA91, 0xE0003F23, 0xE0003F2C, 0xE0003F1F, + 0xE0003CD6, 0xE0003F28, 0xE0003CDA, 0xE0003F1F, 0xE0003F18, 0xE0003F1F, + 0xE0003CD3, 0x0065AA91, 0xE0003F23, 0xE0003F2C, 0xE0003CD6, 0xE0003F1F, + 0xE0003CDA, 0xE0003F28, 0xE0003F1F, 0xE0003CD3, 0xE0003F18, 0xE0003F1F, + 0x0065AA91, 0xE0003F1F, 0xE0003CD3, 0xE0003F18, 0xE0003F1F, 0xE000225B, + 0xE0003F1F, 0xE0003F23, 0xE0003CD6, 0xE000225B, + // Block 27, offset 0x6c0 + 0xE0003CD6, 0xE0003F1F, 0xE0003F23, 0xE0002261, 0xE0003F28, 0xE0003F2C, + 0xE0003CDA, 0xE0002261, 0xE0003CDA, 0xE0003F28, 0xE0003F2C, 0x0065B491, + 0xE0003FA1, 0xE0003CDE, 0x0065B491, 0xE0003CDE, 0xE0003FA1, 0x0065BE8F, + 0xE0003FB3, 0xE0003CE1, 0x0065BE8F, 0xE0003CE1, 0xE0003FB3, 0x0065BE91, + 0xE0003FB6, 0xE0003CE4, 0x0065BE91, 0xE0003CE4, 0xE0003FB6, 0x0065C68F, + 0xE0003CE7, 0xE0003FC8, 0x0065C691, 0xE0003FCB, 0xE0003CEA, 0x0065C691, + 0xE0003CEA, 0xE0003FCB, 0x0065D08F, 0xE0003FEC, 0xE0003FE6, 0xE0003FEC, + 0xE0003CED, 0x0065D08F, 0xE0003FEC, 0xE0003CED, 0xE0003FE6, 0xE0003FEC, + 0x0065D091, 0xE0003FF0, 0xE0003FE9, 0xE0003FF0, 0xE0003CF0, 0x0065D091, + 0xE0003FF4, 0xE0003CF3, 0xE0003FF0, 0xE0003FF0, 0xE0003CF0, 0xE0003FE9, + 0xE0003FF0, 0x0065D091, 0xE0003FF0, 0xE0003CF0, + // Block 28, offset 0x700 + 0xE0003FE9, 0xE0003FF0, 0xE000236A, 0xE0003CF3, 0xE0003FF0, 0xE0003FF4, + 0x0065788F, 0xE0003CFD, 0xE0003CF7, 0x0065788F, 0xE0003CF7, 0xE0003CFD, + 0x00657891, 0xE0003D00, 0xE0003CFA, 0x00657891, 0xE0003CFA, 0xE0003D00, + 0x00658491, 0xE0003E3E, 0xE0003E3A, 0xE0003D06, 0xE0003E3A, 0xE0003E37, + 0xE0003E3A, 0xE0003D03, 0x00658491, 0xE0003E3E, 0xE0003D06, 0xE0003E3A, + 0xE0003E3A, 0xE0003D03, 0xE0003E37, 0xE0003E3A, 0x00658491, 0xE0003E3A, + 0xE0003D03, 0xE0003E37, 0xE0003E3A, 0xE000218B, 0xE0003E3A, 0xE0003E3E, + 0xE0003D06, 0xE000218B, 0xE0003D06, 0xE0003E3A, 0xE0003E3E, 0x00658E8F, + 0xE0003E81, 0xE0003D0A, 0xE0003E7B, 0xE0003E81, 0x00658E91, 0xE0003E89, + 0xE0003E85, 0xE0003D10, 0xE0003E85, 0xE0003E7E, 0xE0003E85, 0xE0003D0D, + 0x00658E91, 0xE0003E89, 0xE0003D10, 0xE0003E85, + // Block 29, offset 0x740 + 0xE0003E85, 0xE0003D0D, 0xE0003E7E, 0xE0003E85, 0x00658E91, 0xE0003E85, + 0xE0003D0D, 0xE0003E7E, 0xE0003E85, 0xE0002203, 0xE0003E85, 0xE0003E89, + 0xE0003D10, 0xE0002203, 0xE0003D10, 0xE0003E85, 0xE0003E89, 0x00659891, + 0xE0003ECC, 0xE0003EC8, 0xE0003D17, 0xE0003EC8, 0xE0003EC5, 0xE0003EC8, + 0xE0003D14, 0x00659891, 0xE0003ECC, 0xE0003D17, 0xE0003EC8, 0xE0003EC8, + 0xE0003D14, 0xE0003EC5, 0xE0003EC8, 0x00659891, 0xE0003EC8, 0xE0003D14, + 0xE0003EC5, 0xE0003EC8, 0xE0002237, 0xE0003EC8, 0xE0003ECC, 0xE0003D17, + 0xE0002237, 0xE0003D17, 0xE0003EC8, 0xE0003ECC, 0x0065A291, 0xE0003F06, + 0xE0003D1B, 0x0065A291, 0xE0003D1B, 0xE0003F06, 0x0065AC8F, 0xE0003F37, + 0xE0003D1E, 0xE0003F31, 0xE0003F37, 0x0065AC91, 0xE0003F3F, 0xE0003F48, + 0xE0003F3B, 0xE0003D24, 0xE0003F44, 0xE0003D28, + // Block 30, offset 0x780 + 0xE0003F3B, 0xE0003F34, 0xE0003F3B, 0xE0003D21, 0x0065AC91, 0xE0003F3F, + 0xE0003F48, 0xE0003D24, 0xE0003F3B, 0xE0003D28, 0xE0003F44, 0xE0003F3B, + 0xE0003D21, 0xE0003F34, 0xE0003F3B, 0x0065AC91, 0xE0003F3B, 0xE0003D21, + 0xE0003F34, 0xE0003F3B, 0xE000227D, 0xE0003F3B, 0xE0003F3F, 0xE0003D24, + 0xE000227D, 0xE0003D24, 0xE0003F3B, 0xE0003F3F, 0xE0002283, 0xE0003F44, + 0xE0003F48, 0xE0003D28, 0xE0002283, 0xE0003D28, 0xE0003F44, 0xE0003F48, + 0x0065B691, 0xE0003FA4, 0xE0003D2C, 0x0065B691, 0xE0003D2C, 0xE0003FA4, + 0x0065C88F, 0xE0003D2F, 0xE0003FCE, 0x0065C891, 0xE0003FD1, 0xE0003D32, + 0x0065C891, 0xE0003D32, 0xE0003FD1, 0x0065D291, 0xE0003FFC, 0xE0003FF9, + 0xE0003FFC, 0xE0003D35, 0x0065D291, 0xE0004000, 0xE0003D38, 0xE0003FFC, + 0xE0003FFC, 0xE0003D35, 0xE0003FF9, 0xE0003FFC, + // Block 31, offset 0x7c0 + 0xE0002371, 0xE0003D38, 0xE0003FFC, 0xE0004000, 0x00657A8F, 0xE0003D4C, + 0xE0003D42, 0xE0003D4C, 0xE0003D3C, 0x00657A8F, 0xE0003D4C, 0xE0003D3C, + 0xE0003D42, 0xE0003D4C, 0x00657A91, 0xE0003D54, 0xE0003D50, 0xE0003D48, + 0xE0003D50, 0xE0003D45, 0xE0003D50, 0xE0003D3F, 0x00657A91, 0xE0003D54, + 0xE0003D48, 0xE0003D50, 0xE0003D50, 0xE0003D3F, 0xE0003D45, 0xE0003D50, + 0x00657A91, 0xE0003D50, 0xE0003D3F, 0xE0003D45, 0xE0003D50, 0xE000214F, + 0xE0003D50, 0xE0003D54, 0xE0003D48, 0xE000214F, 0xE0003D48, 0xE0003D50, + 0xE0003D54, 0x0065868F, 0xE0003E49, 0xE0003D59, 0xE0003E43, 0xE0003E49, + 0x00658691, 0xE0003E51, 0xE0003E4D, 0xE0003D5F, 0xE0003E4D, 0xE0003E46, + 0xE0003E4D, 0xE0003D5C, 0x00658691, 0xE0003E51, 0xE0003D5F, 0xE0003E4D, + 0xE0003E4D, 0xE0003D5C, 0xE0003E46, 0xE0003E4D, + // Block 32, offset 0x800 + 0x00658691, 0xE0003E4D, 0xE0003D5C, 0xE0003E46, 0xE0003E4D, 0xE00021BB, + 0xE0003E4D, 0xE0003E51, 0xE0003D5F, 0xE00021BB, 0xE0003D5F, 0xE0003E4D, + 0xE0003E51, 0x0065908F, 0xE0003E94, 0xE0003D63, 0xE0003E8E, 0xE0003E94, + 0x00659091, 0xE0003E9C, 0xE0003E98, 0xE0003D69, 0xE0003E98, 0xE0003E91, + 0xE0003E98, 0xE0003D66, 0x00659091, 0xE0003E9C, 0xE0003D69, 0xE0003E98, + 0xE0003E98, 0xE0003D66, 0xE0003E91, 0xE0003E98, 0x00659091, 0xE0003E98, + 0xE0003D66, 0xE0003E91, 0xE0003E98, 0xE0002212, 0xE0003E98, 0xE0003E9C, + 0xE0003D69, 0xE0002212, 0xE0003D69, 0xE0003E98, 0xE0003E9C, 0x00659A8F, + 0xE0003ED7, 0xE0003ED1, 0xE0003ED7, 0xE0003D6D, 0x00659A8F, 0xE0003ED7, + 0xE0003D6D, 0xE0003ED1, 0xE0003ED7, 0x00659A91, 0xE0003EDF, 0xE0003EDB, + 0xE0003D73, 0xE0003EDB, 0xE0003ED4, 0xE0003EDB, + // Block 33, offset 0x840 + 0xE0003D70, 0x00659A91, 0xE0003EDF, 0xE0003D73, 0xE0003EDB, 0xE0003EDB, + 0xE0003D70, 0xE0003ED4, 0xE0003EDB, 0x00659A91, 0xE0003EDB, 0xE0003D70, + 0xE0003ED4, 0xE0003EDB, 0xE000223D, 0xE0003EDB, 0xE0003EDF, 0xE0003D73, + 0xE000223D, 0xE0003D73, 0xE0003EDB, 0xE0003EDF, 0x0065A48F, 0xE0003D77, + 0xE0003F09, 0x0065A491, 0xE0003F0C, 0xE0003D7A, 0x0065A491, 0xE0003D7A, + 0xE0003F0C, 0x0065AE8F, 0xE0003F53, 0xE0003D7D, 0xE0003F4D, 0xE0003F53, + 0x0065AE91, 0xE0003F5B, 0xE0003F64, 0xE0003F57, 0xE0003D83, 0xE0003F60, + 0xE0003D87, 0xE0003F57, 0xE0003F50, 0xE0003F57, 0xE0003D80, 0x0065AE91, + 0xE0003F5B, 0xE0003F64, 0xE0003D83, 0xE0003F57, 0xE0003D87, 0xE0003F60, + 0xE0003F57, 0xE0003D80, 0xE0003F50, 0xE0003F57, 0x0065AE91, 0xE0003F57, + 0xE0003D80, 0xE0003F50, 0xE0003F57, 0xE000229D, + // Block 34, offset 0x880 + 0xE0003F57, 0xE0003F5B, 0xE0003D83, 0xE000229D, 0xE0003D83, 0xE0003F57, + 0xE0003F5B, 0xE00022A3, 0xE0003F60, 0xE0003F64, 0xE0003D87, 0xE00022A3, + 0xE0003D87, 0xE0003F60, 0xE0003F64, 0x0065B88F, 0xE0003D8B, 0xE0003FA7, + 0x0065B891, 0xE0003FAA, 0xE0003D8E, 0x0065B891, 0xE0003D8E, 0xE0003FAA, + 0x0065C08F, 0xE0003FB9, 0xE0003D91, 0x0065C08F, 0xE0003D91, 0xE0003FB9, + 0x0065C091, 0xE0003FBC, 0xE0003D94, 0x0065C091, 0xE0003D94, 0xE0003FBC, + 0x0065CA8F, 0xE0003D97, 0xE0003FD4, 0x0065CA91, 0xE0003FD7, 0xE0003D9A, + 0x0065CA91, 0xE0003D9A, 0xE0003FD7, 0x00657E8F, 0xE0003DA3, 0xE0003D9D, + 0x00657E8F, 0xE0003D9D, 0xE0003DA3, 0x00657E91, 0xE0003DA6, 0xE0003DA0, + 0x00657E91, 0xE0003DA0, 0xE0003DA6, 0x0065888F, 0xE0003E56, 0xE0003DA9, + 0x0065888F, 0xE0003DA9, 0xE0003E56, 0x00658891, + // Block 35, offset 0x8c0 + 0xE0003E5C, 0xE0003DAF, 0xE0003E59, 0xE0003DAC, 0x00658891, 0xE0003DAF, + 0xE0003E5C, 0xE0003DAC, 0xE0003E59, 0x00658891, 0xE0003DAC, 0xE0003E59, + 0xE00021D9, 0xE0003E5C, 0xE0003DAF, 0xE00021D9, 0xE0003DAF, 0xE0003E5C, + 0x00659291, 0xE0003EA8, 0xE0003EA4, 0xE0003DB6, 0xE0003EA4, 0xE0003EA1, + 0xE0003EA4, 0xE0003DB3, 0x00659291, 0xE0003EA8, 0xE0003DB6, 0xE0003EA4, + 0xE0003EA4, 0xE0003DB3, 0xE0003EA1, 0xE0003EA4, 0x00659291, 0xE0003EA4, + 0xE0003DB3, 0xE0003EA1, 0xE0003EA4, 0xE0002218, 0xE0003EA4, 0xE0003EA8, + 0xE0003DB6, 0xE0002218, 0xE0003DB6, 0xE0003EA4, 0xE0003EA8, 0x00659C91, + 0xE0003EEB, 0xE0003EE7, 0xE0003DBD, 0xE0003EE7, 0xE0003EE4, 0xE0003EE7, + 0xE0003DBA, 0x00659C91, 0xE0003EEB, 0xE0003DBD, 0xE0003EE7, 0xE0003EE7, + 0xE0003DBA, 0xE0003EE4, 0xE0003EE7, 0x00659C91, + // Block 36, offset 0x900 + 0xE0003EE7, 0xE0003DBA, 0xE0003EE4, 0xE0003EE7, 0xE0002243, 0xE0003EE7, + 0xE0003EEB, 0xE0003DBD, 0xE0002243, 0xE0003DBD, 0xE0003EE7, 0xE0003EEB, + 0x0065A691, 0xE0003F0F, 0xE0003DC1, 0x0065A691, 0xE0003DC1, 0xE0003F0F, + 0x0065B08F, 0xE0003F6F, 0xE0003DC4, 0xE0003F69, 0xE0003F6F, 0x0065B091, + 0xE0003F77, 0xE0003F80, 0xE0003F73, 0xE0003DCA, 0xE0003F7C, 0xE0003DCE, + 0xE0003F73, 0xE0003F6C, 0xE0003F73, 0xE0003DC7, 0x0065B091, 0xE0003F77, + 0xE0003F80, 0xE0003DCA, 0xE0003F73, 0xE0003DCE, 0xE0003F7C, 0xE0003F73, + 0xE0003DC7, 0xE0003F6C, 0xE0003F73, 0x0065B091, 0xE0003F73, 0xE0003DC7, + 0xE0003F6C, 0xE0003F73, 0xE00022C0, 0xE0003F73, 0xE0003F77, 0xE0003DCA, + 0xE00022C0, 0xE0003DCA, 0xE0003F73, 0xE0003F77, 0xE00022C6, 0xE0003F7C, + 0xE0003F80, 0xE0003DCE, 0xE00022C6, 0xE0003DCE, + // Block 37, offset 0x940 + 0xE0003F7C, 0xE0003F80, 0x0065BA91, 0xE0003FAD, 0xE0003DD2, 0x0065BA91, + 0xE0003DD2, 0xE0003FAD, 0x0065CC8F, 0xE0003DD5, 0xE0003FDA, 0x0065CC91, + 0xE0003FDD, 0xE0003DD8, 0x0065CC91, 0xE0003DD8, 0xE0003FDD, 0x0065D491, + 0xE0004008, 0xE0004005, 0xE0004008, 0xE0003DDB, 0x0065D491, 0xE000400C, + 0xE0003DDE, 0xE0004008, 0xE0004008, 0xE0003DDB, 0xE0004005, 0xE0004008, + 0xE0002374, 0xE0003DDE, 0xE0004008, 0xE000400C, 0x0065808F, 0xE0003DE8, + 0xE0003DE2, 0x0065808F, 0xE0003DE2, 0xE0003DE8, 0x00658091, 0xE0003DEB, + 0xE0003DE5, 0x00658091, 0xE0003DE5, 0xE0003DEB, 0x00658A91, 0xE0003E67, + 0xE0003E63, 0xE0003DF1, 0xE0003E63, 0xE0003E60, 0xE0003E63, 0xE0003DEE, + 0x00658A91, 0xE0003E67, 0xE0003DF1, 0xE0003E63, 0xE0003E63, 0xE0003DEE, + 0xE0003E60, 0xE0003E63, 0x00658A91, 0xE0003E63, + // Block 38, offset 0x980 + 0xE0003DEE, 0xE0003E60, 0xE0003E63, 0xE00021E3, 0xE0003E63, 0xE0003E67, + 0xE0003DF1, 0xE00021E3, 0xE0003DF1, 0xE0003E63, 0xE0003E67, 0x00659491, + 0xE0003EB4, 0xE0003EB0, 0xE0003DF8, 0xE0003EB0, 0xE0003EAD, 0xE0003EB0, + 0xE0003DF5, 0x00659491, 0xE0003EB4, 0xE0003DF8, 0xE0003EB0, 0xE0003EB0, + 0xE0003DF5, 0xE0003EAD, 0xE0003EB0, 0x00659491, 0xE0003EB0, 0xE0003DF5, + 0xE0003EAD, 0xE0003EB0, 0xE0002226, 0xE0003EB0, 0xE0003EB4, 0xE0003DF8, + 0xE0002226, 0xE0003DF8, 0xE0003EB0, 0xE0003EB4, 0x00659E8F, 0xE0003EF6, + 0xE0003DFC, 0xE0003EF0, 0xE0003EF6, 0x00659E91, 0xE0003EFE, 0xE0003EFA, + 0xE0003E02, 0xE0003EFA, 0xE0003EF3, 0xE0003EFA, 0xE0003DFF, 0x00659E91, + 0xE0003EFE, 0xE0003E02, 0xE0003EFA, 0xE0003EFA, 0xE0003DFF, 0xE0003EF3, + 0xE0003EFA, 0x00659E91, 0xE0003EFA, 0xE0003DFF, + // Block 39, offset 0x9c0 + 0xE0003EF3, 0xE0003EFA, 0xE000224D, 0xE0003EFA, 0xE0003EFE, 0xE0003E02, + 0xE000224D, 0xE0003E02, 0xE0003EFA, 0xE0003EFE, 0x0065A891, 0xE0003F12, + 0xE0003E06, 0x0065A891, 0xE0003E06, 0xE0003F12, 0x0065B28F, 0xE0003F8B, + 0xE0003E09, 0xE0003F85, 0xE0003F8B, 0x0065B291, 0xE0003F93, 0xE0003F9C, + 0xE0003F8F, 0xE0003E0F, 0xE0003F98, 0xE0003E13, 0xE0003F8F, 0xE0003F88, + 0xE0003F8F, 0xE0003E0C, 0x0065B291, 0xE0003F93, 0xE0003F9C, 0xE0003E0F, + 0xE0003F8F, 0xE0003E13, 0xE0003F98, 0xE0003F8F, 0xE0003E0C, 0xE0003F88, + 0xE0003F8F, 0x0065B291, 0xE0003F8F, 0xE0003E0C, 0xE0003F88, 0xE0003F8F, + 0xE00022EF, 0xE0003F8F, 0xE0003F93, 0xE0003E0F, 0xE00022EF, 0xE0003E0F, + 0xE0003F8F, 0xE0003F93, 0xE00022F5, 0xE0003F98, 0xE0003F9C, 0xE0003E13, + 0xE00022F5, 0xE0003E13, 0xE0003F98, 0xE0003F9C, + // Block 40, offset 0xa00 + 0x0065BC91, 0xE0003FB0, 0xE0003E17, 0x0065BC91, 0xE0003E17, 0xE0003FB0, + 0x0065C48F, 0xE0003FBF, 0xE0003E1A, 0x0065C48F, 0xE0003E1A, 0xE0003FBF, + 0x0065C491, 0xE0003FC2, 0xE0003E1D, 0x0065C491, 0xE0003E1D, 0xE0003FC2, + 0x0065CE8F, 0xE0003E20, 0xE0003FE0, 0x0065CE91, 0xE0003FE3, 0xE0003E23, + 0x0065CE91, 0xE0003E23, 0xE0003FE3, 0x0065D691, 0xE0004014, 0xE0004011, + 0xE0004014, 0xE0003E26, 0x0065D691, 0xE0004018, 0xE0003E29, 0xE0004014, + 0xE0004014, 0xE0003E26, 0xE0004011, 0xE0004014, 0x0065D691, 0xE0004014, + 0xE0003E26, 0xE0004011, 0xE0004014, 0xE0002377, 0xE0003E29, 0xE0004014, + 0xE0004018, 0x0065D891, 0xE000401D, 0x40368C20, 0x40343620, 0x00368C83, + 0x00343688, 0x002DFE88, 0x002F56A3, 0x402BDE20, 0x40320C21, 0x40321020, + 0x002BDE88, 0x00320CA3, 0x00321083, 0x404FA420, + // Block 41, offset 0xa40 + 0xE0004030, 0x404FA620, 0xE0004034, 0x404FA820, 0xE0004038, 0x404FAA20, + 0xE000403C, 0x404FAC20, 0xE0004040, 0x404FAE20, 0xE0004044, 0x404FB020, + 0xE0004048, 0x404FB220, 0xE000404C, 0x404FB420, 0xE0004050, 0x404FB620, + 0xE0004054, 0x404FB820, 0xE0004058, 0x404FBA20, 0xE000405C, 0x404FBC20, + 0xE0004060, 0x404FBE20, 0xE0004064, 0x404FC020, 0xE0004068, 0x404FC220, + 0xE000406C, 0x404FC420, 0xE0004070, 0x404FC620, 0xE0004074, 0x404FC820, + 0xE0004078, 0x404FCA20, 0xE000407C, 0x404FCC20, 0xE0004080, 0x404FCE20, + 0xE0004084, 0x404FD020, 0xE0004088, 0x404FD220, 0xE000408C, 0x404FD420, + 0xE0004090, 0x404FD620, 0xE0004094, 0x404FD820, 0xE0004098, 0x404FDA20, + 0xE000409C, 0x404FDA20, 0xE00040A0, 0x404FDC20, 0xE00040A4, 0x404FDC20, + 0xE00040A8, 0x404FDC20, 0xE00040AC, 0x404FDE20, + // Block 42, offset 0xa80 + 0xE00040B0, 0x404FDE20, 0xE00040B4, 0x404FE020, 0xE00040B8, 0x404FE220, + 0xE00040BC, 0x404FE420, 0xE00040C0, 0x404FE620, 0xE00040C4, 0x404FE820, + 0xE00040C8, 0x40501820, 0x40502E20, 0x40503820, 0x40500E20, 0x40503220, + 0x40501020, 0x40503620, 0x40502420, 0x40503A20, 0x40502A20, 0x40503C20, + 0x403FEC20, 0x40403E20, 0xAE605202, 0xAE603502, 0xAE603202, 0xAE604E02, + 0x402BDE20, 0x402BDE21, 0x002BDE88, 0x002BDEA3, 0x402C9820, 0x402C9822, + 0x402C9821, 0x002C9888, 0x002C98C3, 0x002C98A3, 0x402D9A20, 0x402D9A21, + 0x002D9A88, 0x002D9AA3, 0x40306C20, 0x40306C22, 0x40306C21, 0x00306C88, + 0x00306CC3, 0x00306CA3, 0x402C3A20, 0x402C6020, 0x002C3A88, 0x002C6083, + 0x402D2220, 0x402D6620, 0x002D2288, 0x002D6683, 0x402DFE20, 0x402E2020, + 0x002DFE88, 0x002E2083, 0x402E2220, 0xE0000CFB, + // Block 43, offset 0xac0 + 0x402E8020, 0xE0000CFB, 0x002E2288, 0xE0000D01, 0x002E8083, 0xE0000D01, + 0x402E9E20, 0x402EE020, 0x002E9E88, 0x002EE083, 0x402F7A20, 0x402FE420, + 0x002F7A88, 0x002FE483, 0x402FE620, 0x40302A20, 0x002FE688, 0x00302A83, + 0x40312A20, 0x40316220, 0x00312A88, 0x00316283, 0x40442220, 0xE000A96E, + 0x40443E20, 0xE000A974, 0xE000A980, 0xE000A97A, 0x40444820, 0xE000A97D, + 0x40445820, 0xE000A986, 0x40445A20, 0xE000A98C, 0x40446620, 0xE000A992, + 0x40448220, 0x40448820, 0x00448C83, 0x403FFC20, 0x40404020, 0x002C3A88, + 0x402C3820, 0x402C3A20, 0x002C3883, 0x002D2288, 0x402D6620, 0x002D6683, + 0x402D2020, 0x402D2220, 0x002D6684, 0x002D6685, 0x002D2083, 0x00312A88, + 0x40312820, 0x40312A20, 0x00312883, 0x404E6020, 0xE000A99E, 0x404FFE20, + 0x404FFE21, 0x404E6A20, 0xE000A9A4, 0x40502820, + // Block 44, offset 0xb00 + 0x40502821, 0x404E9420, 0xE000A9BE, 0xE000A9B7, 0x4050AC20, 0x4050AC21, + 0x4005B820, 0xE000A9C4, 0x404EA620, 0xE000A9CF, 0x4050C820, 0x4050C821, + 0xE000A9E0, 0xE000A9E3, 0xE000A9E7, 0xE000A9F0, 0xE000A9F4, 0xE000AA00, + 0xE000AA0C, 0xE000AA18, 0xE000AA24, 0xE000AA30, 0xE000AA3C, 0xE000AA48, + 0xE000AA54, 0xE000AA60, 0xE000AA6C, 0xE000AA78, 0xE000AA84, 0xE000AA90, + 0xE000AA9C, 0xE000AAA8, 0xE000AAB4, 0xE000AAC0, 0xE000AACC, 0xE000AAD8, + 0xE000AAE4, 0xE000AAF0, 0xE000AAFC, 0xE000AB08, 0xE000AB14, 0xE000AB20, + 0xE000AB2C, 0xE000AB38, 0xE000AB44, 0xE000AB50, 0xE000AB5C, 0xE000AB68, + 0xE000AB74, 0xE000AB80, 0xE000AB8C, 0xE000AB98, 0xE000ABA4, 0xE000ABB0, + 0xE000ABBC, 0xE000ABC8, 0xE000ABD4, 0xE000ABE0, 0xE000ABEC, 0xE000ABF8, + 0xE000AC04, 0xE000AC10, 0xE000AC1C, 0xE000AC28, + // Block 45, offset 0xb40 + 0xE000AC34, 0xE000AC40, 0xE000AC4C, 0xE000AC58, 0xE000AC64, 0xE000AC70, + 0xE000AC7C, 0xE000AC88, 0xE000AC94, 0xE000ACA0, 0xE000ACAC, 0xE000ACB8, + 0xE000A9FA, 0xE000AA06, 0xE000AA12, 0xE000AA1E, 0xE000AA2A, 0xE000AA36, + 0xE000AA42, 0xE000AA4E, 0xE000AA5A, 0xE000AA66, 0xE000AA72, 0xE000AA7E, + 0xE000AA8A, 0xE000AA96, 0xE000AAA2, 0xE000AAAE, 0xE000AABA, 0xE000AAC6, + 0xE000AAD2, 0xE000AADE, 0xE000AAEA, 0xE000AAF6, 0xE000AB02, 0xE000AB0E, + 0xE000AB1A, 0xE000AB26, 0xE000AB32, 0xE000AB3E, 0xE000AB4A, 0xE000AB56, + 0xE000AB62, 0xE000AB6E, 0xE000AB7A, 0xE000AB86, 0xE000AB92, 0xE000AB9E, + 0xE000ABAA, 0xE000ABB6, 0xE000ABC2, 0xE000ABCE, 0xE000ABDA, 0xE000ABE6, + 0xE000ABF2, 0xE000ABFE, 0xE000AC0A, 0xE000AC16, 0xE000AC22, 0xE000AC2E, + 0xE000AC3A, 0xE000AC46, 0xE000AC52, 0xE000AC5E, + // Block 46, offset 0xb80 + 0xE000AC6A, 0xE000AC76, 0xE000AC82, 0xE000AC8E, 0xE000AC9A, 0xE000ACA6, + 0xE000ACB2, 0xE000ACBE, 0x404EFE20, 0x404F5222, 0xE000ACC9, 0x404F5220, + 0x404F5020, 0x404F1A22, 0x404F1A23, 0x404F2822, 0x404F2823, 0x404F3622, + 0x404F3623, 0x404F4422, 0x404F4423, 0x404F5223, 0x404F6022, 0x404F6023, + 0x404F6E22, 0x404F6E23, 0x404F7C22, 0x404F7C23, 0x404F8A21, 0x404F9822, + 0x404F9823, 0x404FA622, 0x404FA623, 0x404FB422, 0x404FB423, 0x404FC222, + 0x404FC223, 0x404FD022, 0x404FD023, 0x404FDE22, 0x404FDE23, 0x404FEC22, + 0x404FEC23, 0x404FFA22, 0x404FFA23, 0x40500822, 0x40500823, 0x40501622, + 0x40501623, 0x40502422, 0x40502423, 0x40503222, 0x40503223, 0x40504022, + 0x40504023, 0x40504E22, 0x40504E23, 0x40505C22, 0x40505C23, 0x40506A22, + 0x40506A23, 0x40508C22, 0x40508C23, 0x40509A22, + // Block 47, offset 0xbc0 + 0x40509A23, 0x4050A822, 0x4050A823, 0x4050B622, 0x4050B623, 0x4050C421, + 0x4050D222, 0x4050D223, 0x4050E022, 0x4050E023, 0x4050EE21, 0x4050FC21, + 0x404F1A20, 0x404F1A21, 0x404F2820, 0x404F2821, 0x404F3620, 0x404F3621, + 0x404F4420, 0x404F4421, 0x404F5221, 0x404F6020, 0x404F6021, 0x404F6E20, + 0x404F6E21, 0x404F7C20, 0x404F7C21, 0x404F8A20, 0x404F9820, 0x404F9821, + 0x404FA620, 0x404FA621, 0x404FB420, 0x404FB421, 0x404FC220, 0x404FC221, + 0x404FD020, 0x404FD021, 0x404FDE20, 0x404FDE21, 0x404FEC20, 0x404FEC21, + 0x404FFA20, 0x404FFA21, 0x40500820, 0x40500821, 0x40501620, 0x40501621, + 0x40502420, 0x40502421, 0x40503220, 0x40503221, 0x40504020, 0x40504021, + 0x40504E20, 0x40504E21, 0x40505C20, 0x40505C21, 0x40506A20, 0x40506A21, + 0x40508C20, 0x40508C21, 0x40509A20, 0x40509A21, + // Block 48, offset 0xc00 + 0x4050A820, 0x4050A821, 0x4050B620, 0x4050B621, 0x4050C420, 0x4050D220, + 0x4050D221, 0x4050E020, 0x4050E021, 0x4050EE20, 0x4050FC20, 0x404F1820, + 0x404F1821, 0x404F2620, 0x404F2621, 0x404F3420, 0x404F3421, 0x404F4220, + 0x404F4221, 0x404F5021, 0x404F5E20, 0x404F5E21, 0x404F6C20, 0x404F6C21, + 0x404F7A20, 0x404F7A21, 0x404F8820, 0x404F9620, 0x404F9621, 0x404FA420, + 0x404FA421, 0x404FB220, 0x404FB221, 0x404FC020, 0x404FC021, 0x404FCE20, + 0x404FCE21, 0x404FDC20, 0x404FDC21, 0x404FEA20, 0x404FEA21, 0x404FF820, + 0x404FF821, 0x40500620, 0x40500621, 0x40501420, 0x40501421, 0x40502220, + 0x40502221, 0x40503020, 0x40503021, 0x40503E20, 0x40503E21, 0x40504C20, + 0x40504C21, 0x40505A20, 0x40505A21, 0x40506820, 0x40506821, 0x40508A20, + 0x40508A21, 0x40509820, 0x40509821, 0x4050A620, + // Block 49, offset 0xc40 + 0x4050A621, 0x4050B420, 0x4050B421, 0x4050C220, 0x4050D020, 0x4050D021, + 0x4050DE20, 0x4050DE21, 0x4050EC20, 0x4050FA20, 0x404F0A21, 0x404F0A20, + 0x404F0821, 0x404F0820, 0x404EE620, 0x404F5420, 0x404F4C20, 0x40507620, + 0x40507A20, 0x404F1C20, 0x404F1C21, 0x404F2A20, 0x404F2A21, 0x404F3820, + 0x404F3821, 0x404F4620, 0x404F4621, 0x404F5421, 0x404F6220, 0x404F6221, + 0x404F7020, 0x404F7021, 0x404F7E20, 0x404F7E21, 0x404F8C20, 0x404F9A20, + 0x404F9A21, 0x404FA820, 0x404FA821, 0x404FB620, 0x404FB621, 0x404FC420, + 0x404FC421, 0x404FD220, 0x404FD221, 0x404FE020, 0x404FE021, 0x404FEE20, + 0x404FEE21, 0x404FFC20, 0x404FFC21, 0x40500A20, 0x40500A21, 0x40501820, + 0x40501821, 0x40502620, 0x40502621, 0x40503420, 0x40503421, 0x40504220, + 0x40504221, 0x40505020, 0x40505021, 0x40505E20, + // Block 50, offset 0xc80 + 0x40505E21, 0x40506C20, 0x40506C21, 0x40508E20, 0x40508E21, 0x40509C20, + 0x40509C21, 0x4050AA20, 0x4050AA21, 0x4050B820, 0x4050B821, 0x4050C620, + 0x4050D420, 0x4050D421, 0x4050E220, 0x4050E221, 0x4050F020, 0x4050FE20, + 0x404F1420, 0x404F1421, 0x404F2220, 0x404F2221, 0x404F3020, 0x404F3021, + 0x404F3E20, 0x404F3E21, 0x404F4C21, 0x404F5A20, 0x404F5A21, 0x404F6820, + 0x404F6821, 0x404F7620, 0x404F7621, 0x404F8420, 0x404F9220, 0x404F9221, + 0x404FA020, 0x404FA021, 0x404FAE20, 0x404FAE21, 0x404FBC20, 0x404FBC21, + 0x404FCA20, 0x404FCA21, 0x404FD820, 0x404FD821, 0x404FE620, 0x404FE621, + 0x404FF420, 0x404FF421, 0x40500220, 0x40500221, 0x40501020, 0x40501021, + 0x40501E20, 0x40501E21, 0x40502C20, 0x40502C21, 0x40503A20, 0x40503A21, + 0x40504820, 0x40504821, 0x40505620, 0x40505621, + // Block 51, offset 0xcc0 + 0x40506420, 0x40506421, 0x40507220, 0x40507221, 0x40509420, 0x40509421, + 0x4050A220, 0x4050A221, 0x4050B020, 0x4050B021, 0x4050BE20, 0x4050CC20, + 0x4050CC21, 0x4050DA20, 0x4050DA21, 0x4050E820, 0x4050F620, 0x40507820, + 0x40507C20, 0x404F0E20, 0x40507420, 0x404E1420, 0x404F1020, 0x404F1021, + 0x404EDE20, 0x404F4A20, 0x404F1220, 0x404F1221, 0x404F2020, 0x404F2021, + 0x404F2E20, 0x404F2E21, 0x404F3C20, 0x404F3C21, 0x404F4A21, 0x404F5820, + 0x404F5821, 0x404F6620, 0x404F6621, 0x404F7420, 0x404F7421, 0x404F8220, + 0x404F9020, 0x404F9021, 0x404F9E20, 0x404F9E21, 0x404FAC20, 0x404FAC21, + 0x404FBA20, 0x404FBA21, 0x404FC820, 0x404FC821, 0x404FD620, 0x404FD621, + 0x404FE420, 0x404FE421, 0x404FF220, 0x404FF221, 0x40500020, 0x40500021, + 0x40500E20, 0x40500E21, 0x40501C20, 0x40501C21, + // Block 52, offset 0xd00 + 0x40502A20, 0x40502A21, 0x40503820, 0x40503821, 0x40504620, 0x40504621, + 0x40505420, 0x40505421, 0x40506220, 0x40506221, 0x40507020, 0x40507021, + 0x40509220, 0x40509221, 0x4050A020, 0x4050A021, 0x4050AE20, 0x4050AE21, + 0x4050BC20, 0x4050CA20, 0x4050CA21, 0x4050D820, 0x4050D821, 0x4050E620, + 0x4050F420, 0x404EDE21, 0x404F4A22, 0x404F1222, 0x404F1223, 0x404F2022, + 0x404F2023, 0x404F2E22, 0x404F2E23, 0x404F3C22, 0x404F3C23, 0x404F4A23, + 0x404F5822, 0x404F5823, 0x404F6622, 0x404F6623, 0x404F7422, 0x404F7423, + 0x404F8221, 0x404F9022, 0x404F9023, 0x404F9E22, 0x404F9E23, 0x404FAC22, + 0x404FAC23, 0x404FBA22, 0x404FBA23, 0x404FC822, 0x404FC823, 0x404FD622, + 0x404FD623, 0x404FE422, 0x404FE423, 0x404FF222, 0x404FF223, 0x40500022, + 0x40500023, 0x40500E22, 0x40500E23, 0x40501C22, + // Block 53, offset 0xd40 + 0x40501C23, 0x40502A22, 0x40502A23, 0x40503822, 0x40503823, 0x40504622, + 0x40504623, 0x40505422, 0x40505423, 0x40506222, 0x40506223, 0x40507022, + 0x40507023, 0x40509222, 0x40509223, 0x4050A022, 0x4050A023, 0x4050AE22, + 0x4050AE23, 0x4050BC21, 0x4050CA22, 0x4050CA23, 0x4050D822, 0x4050D823, + 0x4050E621, 0x4050F421, 0x404EEE20, 0x404F4E20, 0x40508220, 0x40508620, + 0x404F1620, 0x404F1621, 0x404F2420, 0x404F2421, 0x404F3220, 0x404F3221, + 0x404F4020, 0x404F4021, 0x404F4E21, 0x404F5C20, 0x404F5C21, 0x404F6A20, + 0x404F6A21, 0x404F7820, 0x404F7821, 0x404F8620, 0x404F9420, 0x404F9421, + 0x404FA220, 0x404FA221, 0x404FB020, 0x404FB021, 0x404FBE20, 0x404FBE21, + 0x404FCC20, 0x404FCC21, 0x404FDA20, 0x404FDA21, 0x404FE820, 0x404FE821, + 0x404FF620, 0x404FF621, 0x40500420, 0x40500421, + // Block 54, offset 0xd80 + 0x40501220, 0x40501221, 0x40502020, 0x40502021, 0x40502E20, 0x40502E21, + 0x40503C20, 0x40503C21, 0x40504A20, 0x40504A21, 0x40505820, 0x40505821, + 0x40506620, 0x40506621, 0x40507E20, 0x40507E21, 0x40509620, 0x40509621, + 0x4050A420, 0x4050A421, 0x4050B220, 0x4050B221, 0x4050C020, 0x4050CE20, + 0x4050CE21, 0x4050DC20, 0x4050DC21, 0x4050EA20, 0x4050F820, 0x40508420, + 0x40508820, 0x40508020, 0x404E1820, 0x404F1E20, 0x404F1E21, 0x404E1C20, + 0x404F2C20, 0x404F2C21, 0x404F2E20, 0x404F3220, 0x404E2220, 0x404F3A20, + 0x404F3A21, 0x404E2420, 0x404F4820, 0x404F4821, 0x404E2820, 0x404F5620, + 0x404F5621, 0x404E2E20, 0x404F6420, 0x404F6421, 0x404E3220, 0x404F7220, + 0x404F7221, 0x404E3A20, 0x404F8020, 0x404E4220, 0x404F8E20, 0x404F8E21, + 0x404E4820, 0x404F9C20, 0x404F9C21, 0x404E4A20, + // Block 55, offset 0xdc0 + 0x404FAA20, 0x404FAA21, 0x404E4E20, 0x404FB820, 0x404FB821, 0x404E5220, + 0x404FC620, 0x404FC621, 0x404E5620, 0x404FD420, 0x404FD421, 0x404E5A20, + 0x404FE220, 0x404FE221, 0x404E5E20, 0x404FF020, 0x404FF021, 0x404E6220, + 0x40500C20, 0x40500C21, 0x404E6620, 0x40501A20, 0x40501A21, 0x404E7220, + 0x40503620, 0x40503621, 0x404E7420, 0x40504420, 0x40504421, 0x404E7E20, + 0x40505220, 0x40505221, 0x404E8220, 0x40506020, 0x40506021, 0x404E8420, + 0x40506E20, 0x40506E21, 0x404E8820, 0x40509020, 0x40509021, 0x404E8C20, + 0x40509E20, 0x40509E21, 0x404E9820, 0x4050BA20, 0x404EAA20, 0x4050D620, + 0x4050D621, 0x404EB620, 0x4050E420, 0x404EC220, 0x4050F220, 0x40510420, + 0x40511A20, 0x40511020, 0x40511420, 0x40510620, 0x40511C20, 0x40511220, + 0x40511620, 0x40510A20, 0x40511820, 0x402BDE20, + // Block 56, offset 0xe00 + 0x40320C21, 0x40321020, 0x40321021, 0x002BDE88, 0x00320CA3, 0x00321083, + 0x003210A4, 0x003210A3, 0x402C9820, 0x402C9A20, 0x002C9888, 0x002C9A83, + 0x402C3A20, 0x40312C20, 0x002C3A88, 0x00312C84, 0x00312C83, 0x402C6220, + 0x40312E20, 0x002C6288, 0x00312E84, 0x00312E83, 0x402DFE20, 0x40313020, + 0x002DFE88, 0x00313084, 0x00313083, 0x402E9E20, 0x40313220, 0x002E9E88, + 0x00313284, 0x00313283, 0x402F2C20, 0x40313420, 0x002F2C88, 0x00313484, + 0x00313483, 0x402FE620, 0x40313620, 0x002FE688, 0x00313683, 0x40421220, + 0x40425A20, 0x402BDE20, 0x402BE020, 0x002BDE88, 0x002BE083, 0x40312A20, + 0x40312C20, 0x40312E20, 0x00312A88, 0x00312C83, 0x00312E83, 0x40393820, + 0x40393620, 0x40393821, 0x40393824, 0x40397220, 0x40396621, 0x403A6821, + 0x003A6883, 0x403A6820, 0x003A6884, 0x403A7420, + // Block 57, offset 0xe40 + 0x403A7421, 0x403A9220, 0x403A9226, 0x403A9221, 0x003A9343, 0x403A9223, + 0x003A9344, 0x402BDE20, 0x402BE220, 0x402BE020, 0x002BDE88, 0x002BE283, + 0x002BE083, 0x402FE620, 0x402FE820, 0x402FE820, 0x002FE688, 0x002FE883, + 0x002FE883, 0x40302C20, 0x40302E20, 0x40302E20, 0x00302C88, 0x00302E83, + 0x00302E83, 0x402BDE20, 0x402C0820, 0x40320E21, 0x40320C21, 0x40320E20, + 0x40320C20, 0x002BDE88, 0x002C0883, 0x00320EA3, 0x00320CA3, 0x00320E83, + 0x00320C83, 0x402C3A20, 0x402C5C20, 0x002C3A88, 0x002C5C83, 0x402C5E20, + 0x402C6020, 0x002C5E83, 0x002C6083, 0x402D2220, 0x402D6420, 0x002D2288, + 0x002D6483, 0x402E9E20, 0x402EE021, 0x402EE022, 0x002E9E88, 0x002EE0A3, + 0x002EE0C3, 0x40312A20, 0x40320620, 0x00312A88, 0x00320683, 0x402EE220, + 0x40321023, 0x40321022, 0x40321020, 0x40321021, + // Block 58, offset 0xe80 + 0x40321024, 0x002EE288, 0x003210E3, 0x003210C3, 0x00321083, 0x003210A3, + 0x00321103, 0x402C6220, 0x402C9620, 0x002C6288, 0x002C9684, 0x002C9683, + 0x002D2288, 0x002D6684, 0x002D6683, 0x402E2220, 0xE0000CFB, 0xE0000CFB, + 0x402E8020, 0x002E2288, 0xE0000D01, 0xE0000D01, 0x002E8084, 0x002E8083, + 0x002E9E88, 0x002EE084, 0x002EE083, 0x002F7A88, 0x002FE484, 0x002FE483, + 0x002FE688, 0x00302A84, 0x00302A83, 0x40302C20, 0x40306A20, 0x00302C88, + 0x00306A84, 0x00306A83, 0x4030F620, 0x4030FE20, 0x0030F688, 0x0030FE84, + 0x0030FE83, 0x00312A88, 0x00316284, 0x00316283, 0x402C9820, 0x40320E22, + 0x002C9888, 0x00320EC3, 0x402EE220, 0x40321024, 0x40321020, 0x40321022, + 0x002EE288, 0x00321103, 0x00321083, 0x003210C3, 0x40429820, 0x4042C220, + 0x4042C420, 0x40429620, 0x40429A20, 0x40429820, + // Block 59, offset 0xec0 + 0x40429C20, 0x40429A20, 0x40429E20, 0x40429C20, 0x4042A020, 0x40429E20, + 0x4042A220, 0x4042A020, 0x4042A420, 0x4042A220, 0x4042A620, 0x4042A420, + 0x4042A820, 0x4042A620, 0x4042AA20, 0x4042A820, 0x4042AC20, 0x4042AA20, + 0x4042AE20, 0x4042AC20, 0x4042B020, 0x4042AE20, 0x4042B220, 0x4042B020, + 0x4042B420, 0x4042B220, 0x4042B620, 0x4042B420, 0x4042B820, 0x4042B620, + 0x4042BA20, 0x4042B820, 0x4042BC20, 0x4042BA20, 0x4042BE20, 0x4042BC20, + 0x4042C020, 0x4042BE20, 0x4042C220, 0x4042C020, 0x4042C420, 0x4042C220, + 0x40496C20, 0xE000AD9F, 0xE000ADA2, 0x402BDE20, 0x402BDE21, 0x402BDE22, + 0x002BDE88, 0x002BDEA3, 0x002BDEC3, 0x402C9820, 0x402C9821, 0x402C9822, + 0x002C9888, 0x002C98A3, 0x002C98C3, 0x402D9A20, 0x402D9A21, 0x402D9A22, + 0x002D9A88, 0x002D9AA3, 0x002D9AC3, 0x402EE220, + // Block 60, offset 0xf00 + 0x402EE221, 0x402EE222, 0x002EE288, 0x002EE2A3, 0x002EE2C3, 0x40306C20, + 0x40306C21, 0x40306C22, 0x00306C88, 0x00306CA3, 0x00306CC3, 0x40393820, + 0x40393A20, 0x40393821, 0x40392820, 0x40393C20, 0x40393E20, 0x40394020, + 0x40394220, 0x40394420, 0x40394620, 0x40394820, 0x40394A20, 0x40394E20, + 0x40395020, 0x40395220, 0x40395420, 0x40395A20, 0x40395C20, 0x40395E20, + 0x40396020, 0x40396420, 0x40396620, 0x40396820, 0x40396A20, 0x40398420, + 0x40398620, 0x40398820, 0x40398A20, 0x40398C20, 0x40398E20, 0x40399020, + 0x40399220, 0x40399420, 0x40399620, 0x40399820, 0x40399A20, 0x40399C20, + 0x40399C21, 0x40399E20, 0x4039A020, 0x4039A021, 0x403A9020, 0x4039A821, + 0x4039A820, 0x4039AA20, 0x4039AC20, 0x4039AC21, 0x402EE220, 0x402EE420, + 0x402EE620, 0x002EE288, 0x002EE483, 0x002EE683, + // Block 61, offset 0xf40 + 0x402BDE20, 0xE0000966, 0xE000B345, 0xE0000958, 0xE0000966, 0x402C3A20, + 0xE0000A41, 0x402C9820, 0xE000B348, 0x402D9A20, 0xE000B34B, 0x402EE220, + 0xE0000DE3, 0xE000B34E, 0xE0000DCF, 0xE0000DE3, 0x402FE620, 0xE0000F30, + 0x40306C20, 0xE0001028, 0xE000B351, 0xE0000FFC, 0xE0001028, 0x402BDE20, + 0x402BDE1F, 0x402BDE1D, 0x402BDE1C, 0x402BDE1E, 0x002BDE88, 0x002BDE63, + 0x002BDE23, 0x002BDE03, 0x002BDE43, 0x402C9820, 0x402C9824, 0x402C9822, + 0x402C9821, 0x402C9823, 0x402C981F, 0x402C981D, 0x402C981C, 0x402C981E, + 0x002C9888, 0x002C9903, 0x002C98C3, 0x002C98A3, 0x002C98E3, 0x002C9863, + 0x002C9823, 0x002C9803, 0x002C9843, 0xE0000AF1, 0x402C9821, 0x402C9823, + 0xE0000AF4, 0x002C98A3, 0x002C98E3, 0x402D9A20, 0x402D9A1F, 0x402D9A1D, + 0x402D9A1C, 0x402D9A1E, 0x002D9A88, 0x002D9A63, + // Block 62, offset 0xf80 + 0x002D9A23, 0x002D9A03, 0x002D9A43, 0x402E8220, 0x402E821F, 0x402E821D, + 0x402E821C, 0x402E821E, 0x002E8288, 0x002E8263, 0x002E8223, 0x002E8203, + 0x002E8243, 0x402E9E20, 0x402E9E1F, 0x402E9E1D, 0x402E9E1C, 0x402E9E1E, + 0x002E9E88, 0x002E9E63, 0x002E9E23, 0x002E9E03, 0x002E9E43, 0x402EE220, + 0x402EE21F, 0x402EE21D, 0x402EE21C, 0x402EE21E, 0x002EE288, 0x002EE263, + 0x002EE223, 0x002EE203, 0x002EE243, 0x40306C20, 0x40306C24, 0x40306C22, + 0x40306C21, 0x40306C23, 0x40306C1F, 0x40306C1D, 0x40306C1C, 0x40306C25, + 0x40306C1E, 0x00306C88, 0x00306D03, 0x00306CC3, 0x00306CA3, 0x00306CE3, + 0x00306C63, 0x00306C23, 0x00306C03, 0x00306D23, 0x00306C43, +} + +// mainValues: 249920 entries, 999680 bytes +// Block 2 is the null block. +var mainValues = [249920]uint32{ + // Block 0x0, offset 0x0 + 0x0000: 0xa0000000, 0x0001: 0xa0000000, 0x0002: 0xa0000000, 0x0003: 0xa0000000, + 0x0004: 0xa0000000, 0x0005: 0xa0000000, 0x0006: 0xa0000000, 0x0007: 0xa0000000, + 0x0008: 0xa0000000, 0x0009: 0x40020020, 0x000a: 0x40020220, 0x000b: 0x40020420, + 0x000c: 0x40020620, 0x000d: 0x40020820, 0x000e: 0xa0000000, 0x000f: 0xa0000000, + 0x0010: 0xa0000000, 0x0011: 0xa0000000, 0x0012: 0xa0000000, 0x0013: 0xa0000000, + 0x0014: 0xa0000000, 0x0015: 0xa0000000, 0x0016: 0xa0000000, 0x0017: 0xa0000000, + 0x0018: 0xa0000000, 0x0019: 0xa0000000, 0x001a: 0xa0000000, 0x001b: 0xa0000000, + 0x001c: 0xa0000000, 0x001d: 0xa0000000, 0x001e: 0xa0000000, 0x001f: 0xa0000000, + 0x0020: 0x40021220, 0x0021: 0x4002ba20, 0x0022: 0x4003e020, 0x0023: 0x4004ea20, + 0x0024: 0x4027de20, 0x0025: 0x4004ec20, 0x0026: 0x4004e620, 0x0027: 0x4003d220, + 0x0028: 0x4003f420, 0x0029: 0x4003f620, 0x002a: 0x4004d820, 0x002b: 0x40093820, + 0x002c: 0x40024020, 0x002d: 0x40021a20, 0x002e: 0x4002e420, 0x002f: 0x4004e220, + 0x0030: 0x4029cc20, 0x0031: 0x4029ce20, 0x0032: 0x4029d020, 0x0033: 0x4029d220, + 0x0034: 0x4029d420, 0x0035: 0x4029d620, 0x0036: 0x4029d820, 0x0037: 0x4029da20, + 0x0038: 0x4029dc20, 0x0039: 0x4029de20, 0x003a: 0x40026c20, 0x003b: 0x40026220, + 0x003c: 0x40094020, 0x003d: 0x40094220, 0x003e: 0x40094420, 0x003f: 0x4002c420, + // Block 0x1, offset 0x40 + 0x0040: 0x4004d620, 0x0041: 0x002bde88, 0x0042: 0x002c0a88, 0x0043: 0x002c3a88, + 0x0044: 0x002c6288, 0x0045: 0x002c9888, 0x0046: 0x002d0888, 0x0047: 0x002d2288, + 0x0048: 0x002d6888, 0x0049: 0x002d9a88, 0x004a: 0x002dcc88, 0x004b: 0x002dfe88, + 0x004c: 0xc0030002, 0x004d: 0x002e8288, 0x004e: 0x002e9e88, 0x004f: 0x002ee288, + 0x0050: 0x002f2c88, 0x0051: 0x002f5688, 0x0052: 0x002f7a88, 0x0053: 0x002fe688, + 0x0054: 0x00302c88, 0x0055: 0x00306c88, 0x0056: 0x0030be88, 0x0057: 0x0030e288, + 0x0058: 0x0030f688, 0x0059: 0x00310088, 0x005a: 0x00312a88, 0x005b: 0x4003f820, + 0x005c: 0x4004e420, 0x005d: 0x4003fa20, 0x005e: 0x40062420, 0x005f: 0x40021620, + 0x0060: 0x40061e20, 0x0061: 0x402bde20, 0x0062: 0x402c0a20, 0x0063: 0x402c3a20, + 0x0064: 0x402c6220, 0x0065: 0x402c9820, 0x0066: 0x402d0820, 0x0067: 0x402d2220, + 0x0068: 0x402d6820, 0x0069: 0x402d9a20, 0x006a: 0x402dcc20, 0x006b: 0x402dfe20, + 0x006c: 0xc0000002, 0x006d: 0x402e8220, 0x006e: 0x402e9e20, 0x006f: 0x402ee220, + 0x0070: 0x402f2c20, 0x0071: 0x402f5620, 0x0072: 0x402f7a20, 0x0073: 0x402fe620, + 0x0074: 0x40302c20, 0x0075: 0x40306c20, 0x0076: 0x4030be20, 0x0077: 0x4030e220, + 0x0078: 0x4030f620, 0x0079: 0x40310020, 0x007a: 0x40312a20, 0x007b: 0x4003fc20, + 0x007c: 0x40094820, 0x007d: 0x4003fe20, 0x007e: 0x40094c20, 0x007f: 0xa0000000, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0x00c0: 0xa0000000, 0x00c1: 0xa0000000, 0x00c2: 0xa0000000, 0x00c3: 0xa0000000, + 0x00c4: 0xa0000000, 0x00c5: 0x40020a20, 0x00c6: 0xa0000000, 0x00c7: 0xa0000000, + 0x00c8: 0xa0000000, 0x00c9: 0xa0000000, 0x00ca: 0xa0000000, 0x00cb: 0xa0000000, + 0x00cc: 0xa0000000, 0x00cd: 0xa0000000, 0x00ce: 0xa0000000, 0x00cf: 0xa0000000, + 0x00d0: 0xa0000000, 0x00d1: 0xa0000000, 0x00d2: 0xa0000000, 0x00d3: 0xa0000000, + 0x00d4: 0xa0000000, 0x00d5: 0xa0000000, 0x00d6: 0xa0000000, 0x00d7: 0xa0000000, + 0x00d8: 0xa0000000, 0x00d9: 0xa0000000, 0x00da: 0xa0000000, 0x00db: 0xa0000000, + 0x00dc: 0xa0000000, 0x00dd: 0xa0000000, 0x00de: 0xa0000000, 0x00df: 0xa0000000, + 0x00e0: 0x0002129b, 0x00e1: 0x4002bc20, 0x00e2: 0x4027dc20, 0x00e3: 0x4027e020, + 0x00e4: 0x4027da20, 0x00e5: 0x4027e220, 0x00e6: 0x40094a20, 0x00e7: 0x4004ce20, + 0x00e8: 0x40062c20, 0x00e9: 0x40081820, 0x00ea: 0x002bde94, 0x00eb: 0x4003f020, + 0x00ec: 0x40094620, 0x00ed: 0xa0000000, 0x00ee: 0x40081a20, 0x00ef: 0x40062620, + 0x00f0: 0x40070420, 0x00f1: 0x40093a20, 0x00f2: 0x0029d094, 0x00f3: 0x0029d294, + 0x00f4: 0x40062020, 0x00f5: 0x00327684, 0x00f6: 0x4004d220, 0x00f7: 0x40030620, + 0x00f8: 0x40063220, 0x00f9: 0x0029ce94, 0x00fa: 0x002ee294, 0x00fb: 0x4003f220, + 0x00fc: 0xe00002bf, 0x00fd: 0xe00002b7, 0x00fe: 0xe00004a7, 0x00ff: 0x4002c620, + // Block 0x4, offset 0x100 + 0x0100: 0xe00008f5, 0x0101: 0xe00008ef, 0x0102: 0xe0000921, 0x0103: 0xe0000969, + 0x0104: 0xe000095b, 0x0105: 0xe000094d, 0x0106: 0xe00009dd, 0x0107: 0xe0000a53, + 0x0108: 0xe0000ae8, 0x0109: 0xe0000ae2, 0x010a: 0xe0000af4, 0x010b: 0xe0000b20, + 0x010c: 0xe0000c2b, 0x010d: 0xe0000c25, 0x010e: 0xe0000c37, 0x010f: 0xe0000c43, + 0x0110: 0xe0000ab3, 0x0111: 0xe0000d63, 0x0112: 0xe0000d9a, 0x0113: 0xe0000d94, + 0x0114: 0xe0000da6, 0x0115: 0xe0000de6, 0x0116: 0xe0000dd2, 0x0117: 0x40093e20, + 0x0118: 0xe0000e12, 0x0119: 0xe0000fe1, 0x011a: 0xe0000fdb, 0x011b: 0xe0000fed, + 0x011c: 0xe0000fff, 0x011d: 0xe0001102, 0x011e: 0x00318888, 0x011f: 0xe0000f7b, + 0x0120: 0xe00008f2, 0x0121: 0xe00008ec, 0x0122: 0xe000091e, 0x0123: 0xe0000966, + 0x0124: 0xe0000958, 0x0125: 0xe000094a, 0x0126: 0xe00009d5, 0x0127: 0xe0000a4d, + 0x0128: 0xe0000ae5, 0x0129: 0xe0000adf, 0x012a: 0xe0000af1, 0x012b: 0xe0000b1d, + 0x012c: 0xe0000c28, 0x012d: 0xe0000c22, 0x012e: 0xe0000c34, 0x012f: 0xe0000c40, + 0x0130: 0xe0000aad, 0x0131: 0xe0000d60, 0x0132: 0xe0000d97, 0x0133: 0xe0000d91, + 0x0134: 0xe0000da3, 0x0135: 0xe0000de3, 0x0136: 0xe0000dcf, 0x0137: 0x40093c20, + 0x0138: 0xe0000e0f, 0x0139: 0xe0000fde, 0x013a: 0xe0000fd8, 0x013b: 0xe0000fea, + 0x013c: 0xe0000ffc, 0x013d: 0xe00010ff, 0x013e: 0x40318820, 0x013f: 0xe0001114, + // Block 0x5, offset 0x140 + 0x0140: 0xe0000983, 0x0141: 0xe0000980, 0x0142: 0xe00008fb, 0x0143: 0xe00008f8, + 0x0144: 0xe000097d, 0x0145: 0xe000097a, 0x0146: 0xe0000a38, 0x0147: 0xe0000a35, + 0x0148: 0xe0000a3e, 0x0149: 0xe0000a3b, 0x014a: 0xe0000a4a, 0x014b: 0xe0000a47, + 0x014c: 0xe0000a44, 0x014d: 0xe0000a41, 0x014e: 0xe0000a86, 0x014f: 0xe0000a83, + 0x0150: 0xe0000aaa, 0x0151: 0xe0000aa7, 0x0152: 0xe0000b46, 0x0153: 0xe0000b43, + 0x0154: 0xe0000aee, 0x0155: 0xe0000aeb, 0x0156: 0xe0000b2c, 0x0157: 0xe0000b29, + 0x0158: 0xe0000b40, 0x0159: 0xe0000b3d, 0x015a: 0xe0000b1a, 0x015b: 0xe0000b17, + 0x015c: 0xe0000bb8, 0x015d: 0xe0000bb5, 0x015e: 0xe0000bb2, 0x015f: 0xe0000baf, + 0x0160: 0xe0000bc4, 0x0161: 0xe0000bc1, 0x0162: 0xe0000bca, 0x0163: 0xe0000bc7, + 0x0164: 0xe0000bee, 0x0165: 0xe0000beb, 0x0166: 0xe0000c1b, 0x0167: 0xe0000c18, + 0x0168: 0xe0000c51, 0x0169: 0xe0000c4e, 0x016a: 0xe0000c60, 0x016b: 0xe0000c5d, + 0x016c: 0xe0000c31, 0x016d: 0xe0000c2e, 0x016e: 0xe0000c5a, 0x016f: 0xe0000c57, + 0x0170: 0xe0000c54, 0x0171: 0x402da220, 0x0172: 0xf0000a0a, 0x0173: 0xf0000404, + 0x0174: 0xe0000c8a, 0x0175: 0xe0000c87, 0x0176: 0xe0000c9f, 0x0177: 0xe0000c9c, + 0x0178: 0x402f7220, 0x0179: 0xe0000ccc, 0x017a: 0xe0000cc9, 0x017b: 0xe0000cd8, + 0x017c: 0xe0000cd5, 0x017d: 0xe0000cd2, 0x017e: 0xe0000ccf, 0x017f: 0xe0000d04, + // Block 0x6, offset 0x180 + 0x0180: 0xe0000cfe, 0x0181: 0xe0000cf8, 0x0182: 0xe0000cf5, 0x0183: 0xe0000d51, + 0x0184: 0xe0000d4e, 0x0185: 0xe0000d6f, 0x0186: 0xe0000d6c, 0x0187: 0xe0000d5d, + 0x0188: 0xe0000d5a, 0x0189: 0xf0000404, 0x018a: 0x002eda88, 0x018b: 0x402eda20, + 0x018c: 0xe0000e2e, 0x018d: 0xe0000e2b, 0x018e: 0xe0000da0, 0x018f: 0xe0000d9d, + 0x0190: 0xe0000de0, 0x0191: 0xe0000ddd, 0x0192: 0xe0000e93, 0x0193: 0xe0000e8f, + 0x0194: 0xe0000eca, 0x0195: 0xe0000ec7, 0x0196: 0xe0000edc, 0x0197: 0xe0000ed9, + 0x0198: 0xe0000ed0, 0x0199: 0xe0000ecd, 0x019a: 0xe0000f1f, 0x019b: 0xe0000f1c, + 0x019c: 0xe0000f2d, 0x019d: 0xe0000f2a, 0x019e: 0xe0000f47, 0x019f: 0xe0000f44, + 0x01a0: 0xe0000f33, 0x01a1: 0xe0000f30, 0x01a2: 0xe0000f99, 0x01a3: 0xe0000f96, + 0x01a4: 0xe0000f8a, 0x01a5: 0xe0000f87, 0x01a6: 0x00303688, 0x01a7: 0x40303620, + 0x01a8: 0xe000102b, 0x01a9: 0xe0001028, 0x01aa: 0xe000103f, 0x01ab: 0xe000103c, + 0x01ac: 0xe0000fe7, 0x01ad: 0xe0000fe4, 0x01ae: 0xe0000ff9, 0x01af: 0xe0000ff6, + 0x01b0: 0xe0001025, 0x01b1: 0xe0001022, 0x01b2: 0xe0001039, 0x01b3: 0xe0001036, + 0x01b4: 0xe00010d8, 0x01b5: 0xe00010d5, 0x01b6: 0xe000110e, 0x01b7: 0xe000110b, + 0x01b8: 0xe0001117, 0x01b9: 0xe000113b, 0x01ba: 0xe0001138, 0x01bb: 0xe000114d, + 0x01bc: 0xe000114a, 0x01bd: 0xe0001147, 0x01be: 0xe0001144, 0x01bf: 0xe0000f64, + // Block 0x7, offset 0x1c0 + 0x01c0: 0x402c1a20, 0x01c1: 0x002c2a88, 0x01c2: 0x002c3288, 0x01c3: 0x402c3220, + 0x01c4: 0x0031c488, 0x01c5: 0x4031c420, 0x01c6: 0x002efa88, 0x01c7: 0x002c4e88, + 0x01c8: 0x402c4e20, 0x01c9: 0x002c7288, 0x01ca: 0x002c7a88, 0x01cb: 0x002c8488, + 0x01cc: 0x402c8420, 0x01cd: 0xe000115c, 0x01ce: 0x002cae88, 0x01cf: 0x002cb888, + 0x01d0: 0x002cc288, 0x01d1: 0x002d1688, 0x01d2: 0x402d1620, 0x01d3: 0x002d4488, + 0x01d4: 0x002d5888, 0x01d5: 0x402d7820, 0x01d6: 0x002dc288, 0x01d7: 0x002db688, + 0x01d8: 0x002e0a88, 0x01d9: 0x402e0a20, 0x01da: 0x402e3820, 0x01db: 0x402e7220, + 0x01dc: 0x0030a088, 0x01dd: 0x002eb488, 0x01de: 0x402ebc20, 0x01df: 0x002f1088, + 0x01e0: 0xe0000e56, 0x01e1: 0xe0000e53, 0x01e2: 0x002d6088, 0x01e3: 0x402d6020, + 0x01e4: 0x002f3e88, 0x01e5: 0x402f3e20, 0x01e6: 0x002f8288, 0x01e7: 0x0031b488, + 0x01e8: 0x4031b420, 0x01e9: 0x00300888, 0x01ea: 0x40301220, 0x01eb: 0x40304220, + 0x01ec: 0x00304a88, 0x01ed: 0x40304a20, 0x01ee: 0x00305288, 0x01ef: 0xe000105f, + 0x01f0: 0xe000105c, 0x01f1: 0x0030b488, 0x01f2: 0x0030cc88, 0x01f3: 0x00311888, + 0x01f4: 0x40311820, 0x01f5: 0x00313488, 0x01f6: 0x40313420, 0x01f7: 0x00316488, + 0x01f8: 0x00316e88, 0x01f9: 0x40316e20, 0x01fa: 0x40317820, 0x01fb: 0x4031a620, + 0x01fc: 0x0031bc88, 0x01fd: 0x4031bc20, 0x01fe: 0xe0000fc9, 0x01ff: 0x40319420, + // Block 0x8, offset 0x200 + 0x0200: 0x40321220, 0x0201: 0x40321a20, 0x0202: 0x40322220, 0x0203: 0x40322a20, + 0x0204: 0xe0000ad5, 0x0205: 0xe0000ad1, 0x0206: 0xe0000acd, 0x0207: 0xf0000a0a, + 0x0208: 0xf000040a, 0x0209: 0xf0000404, 0x020a: 0xf0000a0a, 0x020b: 0xf000040a, + 0x020c: 0xf0000404, 0x020d: 0xe0000947, 0x020e: 0xe0000944, 0x020f: 0xe0000c3d, + 0x0210: 0xe0000c3a, 0x0211: 0xe0000dcc, 0x0212: 0xe0000dc9, 0x0213: 0xe0000ff3, + 0x0214: 0xe0000ff0, 0x0215: 0xe000101e, 0x0216: 0xe000101a, 0x0217: 0xe0001006, + 0x0218: 0xe0001002, 0x0219: 0xe0001016, 0x021a: 0xe0001012, 0x021b: 0xe000100e, + 0x021c: 0xe000100a, 0x021d: 0x402cae20, 0x021e: 0xe0000962, 0x021f: 0xe000095e, + 0x0220: 0xe0000976, 0x0221: 0xe0000972, 0x0222: 0xe00009f4, 0x0223: 0xe00009ef, + 0x0224: 0x002d3a88, 0x0225: 0x402d3a20, 0x0226: 0xe0000bbe, 0x0227: 0xe0000bbb, + 0x0228: 0xe0000c99, 0x0229: 0xe0000c96, 0x022a: 0xe0000e20, 0x022b: 0xe0000e1d, + 0x022c: 0xe0000e27, 0x022d: 0xe0000e23, 0x022e: 0xe0001162, 0x022f: 0xe000115f, + 0x0230: 0xe0000c8d, 0x0231: 0xf0000a0a, 0x0232: 0xf000040a, 0x0233: 0xf0000404, + 0x0234: 0xe0000bac, 0x0235: 0xe0000ba9, 0x0236: 0x002d7888, 0x0237: 0x00319488, + 0x0238: 0xe0000d57, 0x0239: 0xe0000d54, 0x023a: 0xe0000954, 0x023b: 0xe0000950, + 0x023c: 0xe00009ea, 0x023d: 0xe00009e5, 0x023e: 0xe0000e19, 0x023f: 0xe0000e15, + // Block 0x9, offset 0x240 + 0x0240: 0xe000098f, 0x0241: 0xe000098c, 0x0242: 0xe0000995, 0x0243: 0xe0000992, + 0x0244: 0xe0000b62, 0x0245: 0xe0000b5f, 0x0246: 0xe0000b68, 0x0247: 0xe0000b65, + 0x0248: 0xe0000c6c, 0x0249: 0xe0000c69, 0x024a: 0xe0000c72, 0x024b: 0xe0000c6f, + 0x024c: 0xe0000e4a, 0x024d: 0xe0000e47, 0x024e: 0xe0000e50, 0x024f: 0xe0000e4d, + 0x0250: 0xe0000ee8, 0x0251: 0xe0000ee5, 0x0252: 0xe0000eee, 0x0253: 0xe0000eeb, + 0x0254: 0xe0001053, 0x0255: 0xe0001050, 0x0256: 0xe0001059, 0x0257: 0xe0001056, + 0x0258: 0xe0000f61, 0x0259: 0xe0000f5e, 0x025a: 0xe0000fa5, 0x025b: 0xe0000fa2, + 0x025c: 0x00312288, 0x025d: 0x40312220, 0x025e: 0xe0000bf4, 0x025f: 0xe0000bf1, + 0x0260: 0x002ebc88, 0x0261: 0x402c8c20, 0x0262: 0x002f2288, 0x0263: 0x402f2220, + 0x0264: 0x00314088, 0x0265: 0x40314020, 0x0266: 0xe000096f, 0x0267: 0xe000096c, + 0x0268: 0xe0000b32, 0x0269: 0xe0000b2f, 0x026a: 0xe0000dd9, 0x026b: 0xe0000dd5, + 0x026c: 0xe0000dfd, 0x026d: 0xe0000df9, 0x026e: 0xe0000e04, 0x026f: 0xe0000e01, + 0x0270: 0xe0000e0b, 0x0271: 0xe0000e07, 0x0272: 0xe0001129, 0x0273: 0xe0001126, + 0x0274: 0x402e5e20, 0x0275: 0x402ed020, 0x0276: 0x40305a20, 0x0277: 0x402dd420, + 0x0278: 0xe0000abf, 0x0279: 0xe0000ec4, 0x027a: 0x002be888, 0x027b: 0x002c4488, + 0x027c: 0x402c4420, 0x027d: 0x002e3888, 0x027e: 0x00303e88, 0x027f: 0x402ffc20, + // Block 0xa, offset 0x280 + 0x0280: 0x40315820, 0x0281: 0x0031d488, 0x0282: 0x4031d420, 0x0283: 0x002c1a88, + 0x0284: 0x00307c88, 0x0285: 0x0030da88, 0x0286: 0x002ca288, 0x0287: 0x402ca220, + 0x0288: 0x002dde88, 0x0289: 0x402dde20, 0x028a: 0x002f6a88, 0x028b: 0x402f6a20, + 0x028c: 0x002f8e88, 0x028d: 0x402f8e20, 0x028e: 0x00311088, 0x028f: 0x40311020, + 0x0290: 0x402bf020, 0x0291: 0x402bf820, 0x0292: 0x402c0220, 0x0293: 0x402c2a20, + 0x0294: 0x402efa20, 0x0295: 0x402c5620, 0x0296: 0x402c7220, 0x0297: 0x402c7a20, + 0x0298: 0x402ccc20, 0x0299: 0x402cb820, 0x029a: 0x402cd420, 0x029b: 0x402cc220, + 0x029c: 0x402cdc20, 0x029d: 0x402ce820, 0x029e: 0x402cf020, 0x029f: 0x402dee20, + 0x02a0: 0x402d4420, 0x02a1: 0x402d2a20, 0x02a2: 0x402d3220, 0x02a3: 0x402d5820, + 0x02a4: 0x402d0020, 0x02a5: 0x40308820, 0x02a6: 0x402d8020, 0x02a7: 0x402d8e20, + 0x02a8: 0x402db620, 0x02a9: 0x402dc220, 0x02aa: 0x402daa20, 0x02ab: 0x402e4220, + 0x02ac: 0x402e4a20, 0x02ad: 0x402e5420, 0x02ae: 0x402e6820, 0x02af: 0x4030a020, + 0x02b0: 0x4030ac20, 0x02b1: 0x402e9020, 0x02b2: 0x402eb420, 0x02b3: 0x402ec820, + 0x02b4: 0x402ea620, 0x02b5: 0x402f1020, 0x02b6: 0x402eee20, 0x02b7: 0x402f1a20, + 0x02b8: 0x402f4c20, 0x02b9: 0x402f9820, 0x02ba: 0x402fa220, 0x02bb: 0x402fac20, + 0x02bc: 0x402fb620, 0x02bd: 0x402fbe20, 0x02be: 0x402fc620, 0x02bf: 0x402fd020, + // Block 0xb, offset 0x2c0 + 0x02c0: 0x402f8220, 0x02c1: 0x402fd820, 0x02c2: 0x402ff420, 0x02c3: 0x40300820, + 0x02c4: 0x402df620, 0x02c5: 0x40301a20, 0x02c6: 0x40302420, 0x02c7: 0x40306420, + 0x02c8: 0x40305220, 0x02c9: 0x40307c20, 0x02ca: 0x4030b420, 0x02cb: 0x4030cc20, + 0x02cc: 0x4030da20, 0x02cd: 0x4030ee20, 0x02ce: 0x402e7a20, 0x02cf: 0x40310820, + 0x02d0: 0x40314820, 0x02d1: 0x40315020, 0x02d2: 0x40316420, 0x02d3: 0x40318020, + 0x02d4: 0x4031cc20, 0x02d5: 0x4031e820, 0x02d6: 0x40320a20, 0x02d7: 0x40323220, + 0x02d8: 0x40323a20, 0x02d9: 0x402c1220, 0x02da: 0x402cf820, 0x02db: 0x402d4c20, + 0x02dc: 0x402d7020, 0x02dd: 0x402de620, 0x02de: 0x402e1a20, 0x02df: 0x402e2a20, + 0x02e0: 0x402f6220, 0x02e1: 0x4031fa20, 0x02e2: 0x40320220, 0x02e3: 0xe0000aca, + 0x02e4: 0xe0000adc, 0x02e5: 0xe0000ad9, 0x02e6: 0xe0000fcc, 0x02e7: 0xe0000fcf, + 0x02e8: 0xe0000fba, 0x02e9: 0xe0000ba1, 0x02ea: 0xe0000d11, 0x02eb: 0xe0000d18, + 0x02ec: 0x40324220, 0x02ed: 0x40324a20, 0x02ee: 0x40309020, 0x02ef: 0x40309820, + 0x02f0: 0x002d6894, 0x02f1: 0x002d8094, 0x02f2: 0x002dcc94, 0x02f3: 0x002f7a94, + 0x02f4: 0x002f9894, 0x02f5: 0x002fac94, 0x02f6: 0x002fd894, 0x02f7: 0x0030e294, + 0x02f8: 0x00310094, 0x02f9: 0x40064020, 0x02fa: 0x40064420, 0x02fb: 0x402d9620, + 0x02fc: 0x4031de20, 0x02fd: 0x402d9820, 0x02fe: 0x4031e220, 0x02ff: 0x4031f020, + // Block 0xc, offset 0x300 + 0x0300: 0x4031dc20, 0x0301: 0x4031f220, 0x0302: 0x40064620, 0x0303: 0x40064820, + 0x0304: 0x40064a20, 0x0305: 0x40064c20, 0x0306: 0x40064e20, 0x0307: 0x40065020, + 0x0308: 0x40065220, 0x0309: 0x40065420, 0x030a: 0x40065620, 0x030b: 0x40065820, + 0x030c: 0x40065a20, 0x030d: 0x40065c20, 0x030e: 0x40065e20, 0x030f: 0x40066020, + 0x0310: 0x4027b220, 0x0311: 0x4027b420, 0x0312: 0x40066220, 0x0313: 0x40066420, + 0x0314: 0x40066620, 0x0315: 0x40066820, 0x0316: 0x40066a20, 0x0317: 0x40066c20, + 0x0318: 0x40062820, 0x0319: 0x40062a20, 0x031a: 0x40062e20, 0x031b: 0x40063420, + 0x031c: 0x40062220, 0x031d: 0x40063020, 0x031e: 0x40066e20, 0x031f: 0x40067020, + 0x0320: 0x002d5894, 0x0321: 0x002e2294, 0x0322: 0x002fe694, 0x0323: 0x0030f694, + 0x0324: 0x0031e894, 0x0325: 0x40067220, 0x0326: 0x40067420, 0x0327: 0x40067620, + 0x0328: 0x40067820, 0x0329: 0x40067a20, 0x032a: 0x40067c20, 0x032b: 0x40067e20, + 0x032c: 0x40068020, 0x032d: 0x40068220, 0x032e: 0x4031e020, 0x032f: 0x40068420, + 0x0330: 0x40068620, 0x0331: 0x40068820, 0x0332: 0x40068a20, 0x0333: 0x40068c20, + 0x0334: 0x40068e20, 0x0335: 0x40069020, 0x0336: 0x40069220, 0x0337: 0x40069420, + 0x0338: 0x40069620, 0x0339: 0x40069820, 0x033a: 0x40069a20, 0x033b: 0x40069c20, + 0x033c: 0x40069e20, 0x033d: 0x4006a020, 0x033e: 0x4006a220, 0x033f: 0x4006a420, + // Block 0xd, offset 0x340 + 0x0340: 0xae603502, 0x0341: 0xae603202, 0x0342: 0xae603c02, 0x0343: 0xae604e02, + 0x0344: 0xae605b02, 0x0345: 0xae606302, 0x0346: 0xae603702, 0x0347: 0xae605202, + 0x0348: 0xae604702, 0x0349: 0xae606402, 0x034a: 0xae604302, 0x034b: 0xae604d02, + 0x034c: 0xae604102, 0x034d: 0xae605f02, 0x034e: 0xae605f02, 0x034f: 0xae606502, + 0x0350: 0xae606602, 0x0351: 0xae606702, 0x0352: 0xae605f02, 0x0353: 0xae602202, + 0x0354: 0xae602a02, 0x0355: 0xae805f02, 0x0356: 0xadc06002, 0x0357: 0xadc06002, + 0x0358: 0xadc06002, 0x0359: 0xadc06002, 0x035a: 0xae805f02, 0x035b: 0xad806802, + 0x035c: 0xadc06002, 0x035d: 0xadc06002, 0x035e: 0xadc06002, 0x035f: 0xadc06002, + 0x0360: 0xadc06002, 0x0361: 0xaca06e02, 0x0362: 0xaca06f02, 0x0363: 0xadc07002, + 0x0364: 0xadc07502, 0x0365: 0xadc07602, 0x0366: 0xadc07702, 0x0367: 0xaca05602, + 0x0368: 0xaca05902, 0x0369: 0xadc06002, 0x036a: 0xadc06002, 0x036b: 0xadc06002, + 0x036c: 0xadc06002, 0x036d: 0xadc07802, 0x036e: 0xadc07902, 0x036f: 0xadc06002, + 0x0370: 0xadc07a02, 0x0371: 0xadc07b02, 0x0372: 0xadc02102, 0x0373: 0xadc06002, + 0x0374: 0xa0107c02, 0x0375: 0xa0107d02, 0x0376: 0xa0106102, 0x0377: 0xa0106102, + 0x0378: 0xa0105402, 0x0379: 0xadc07e02, 0x037a: 0xadc06002, 0x037b: 0xadc06002, + 0x037c: 0xadc06002, 0x037d: 0xae605f02, 0x037e: 0xae605f02, 0x037f: 0xae605f02, + // Block 0xe, offset 0x380 + 0x0380: 0xae603502, 0x0381: 0xae603202, 0x0382: 0xae604502, 0x0383: 0xae602202, + 0x0384: 0xe0000000, 0x0385: 0xaf007f02, 0x0386: 0xae605f02, 0x0387: 0xadc06002, + 0x0388: 0xadc06002, 0x0389: 0xadc06002, 0x038a: 0xae605f02, 0x038b: 0xae605f02, + 0x038c: 0xae605f02, 0x038d: 0xadc06002, 0x038e: 0xadc06002, 0x038f: 0xa0000000, + 0x0390: 0xae605f02, 0x0391: 0xae605f02, 0x0392: 0xae605f02, 0x0393: 0xadc06002, + 0x0394: 0xadc06002, 0x0395: 0xadc06002, 0x0396: 0xadc06002, 0x0397: 0xae605f02, + 0x0398: 0xae808002, 0x0399: 0xadc06002, 0x039a: 0xadc06002, 0x039b: 0xae605f02, + 0x039c: 0xae906002, 0x039d: 0xaea05f02, 0x039e: 0xaea05f02, 0x039f: 0xae906002, + 0x03a0: 0xaea08102, 0x03a1: 0xaea08202, 0x03a2: 0xae906002, 0x03a3: 0x84e615ef, + 0x03a4: 0x84e6164c, 0x03a5: 0x84e616cd, 0x03a6: 0x84e61771, 0x03a7: 0x84e61836, + 0x03a8: 0x84e6161d, 0x03a9: 0x84e61631, 0x03aa: 0x84e616b4, 0x03ab: 0x84e61741, + 0x03ac: 0x84e617bd, 0x03ad: 0x84e61816, 0x03ae: 0x84e6185f, 0x03af: 0x84e6187b, + 0x03b0: 0x00326688, 0x03b1: 0x40326620, 0x03b2: 0x0032a688, 0x03b3: 0x4032a620, + 0x03b4: 0x40064020, 0x03b5: 0x40064220, 0x03b6: 0x00326088, 0x03b7: 0x40326020, + 0x03ba: 0x00326c84, 0x03bb: 0x40329220, + 0x03bc: 0x40329020, 0x03bd: 0x40329420, 0x03be: 0x40026220, + // Block 0xf, offset 0x3c0 + 0x03c4: 0x40062020, 0x03c5: 0xe00000ab, 0x03c6: 0xe00011f0, 0x03c7: 0x40030620, + 0x03c8: 0xe0001249, 0x03c9: 0xe00012dd, 0x03ca: 0xe000133a, + 0x03cc: 0xe000139b, 0x03ce: 0xe00013dd, 0x03cf: 0xe0001492, + 0x03d0: 0xe0001352, 0x03d1: 0x00325288, 0x03d2: 0x00325488, 0x03d3: 0x00325688, + 0x03d4: 0x00325a88, 0x03d5: 0x00325c88, 0x03d6: 0x00326488, 0x03d7: 0x00326888, + 0x03d8: 0x00326a88, 0x03d9: 0x00326c88, 0x03da: 0x00327088, 0x03db: 0x00327288, + 0x03dc: 0x00327688, 0x03dd: 0x00327888, 0x03de: 0x00327a88, 0x03df: 0x00327c88, + 0x03e0: 0x00327e88, 0x03e1: 0x00328888, 0x03e3: 0x00328e88, + 0x03e4: 0x00329688, 0x03e5: 0x00329888, 0x03e6: 0x00329a88, 0x03e7: 0x00329c88, + 0x03e8: 0x00329e88, 0x03e9: 0x0032a288, 0x03ea: 0xe000134f, 0x03eb: 0xe00013f2, + 0x03ec: 0xe00011ed, 0x03ed: 0xe0001246, 0x03ee: 0xe00012da, 0x03ef: 0xe0001337, + 0x03f0: 0xe00013f5, 0x03f1: 0x40325220, 0x03f2: 0x40325420, 0x03f3: 0x40325620, + 0x03f4: 0x40325a20, 0x03f5: 0x40325c20, 0x03f6: 0x40326420, 0x03f7: 0x40326820, + 0x03f8: 0x40326a20, 0x03f9: 0x40326c20, 0x03fa: 0x40327020, 0x03fb: 0x40327220, + 0x03fc: 0x40327620, 0x03fd: 0x40327820, 0x03fe: 0x40327a20, 0x03ff: 0x40327c20, + // Block 0x10, offset 0x400 + 0x0400: 0x40327e20, 0x0401: 0x40328820, 0x0402: 0x00328e99, 0x0403: 0x40328e20, + 0x0404: 0x40329620, 0x0405: 0x40329820, 0x0406: 0x40329a20, 0x0407: 0x40329c20, + 0x0408: 0x40329e20, 0x0409: 0x4032a220, 0x040a: 0xe000134c, 0x040b: 0xe00013ef, + 0x040c: 0xe0001398, 0x040d: 0xe00013da, 0x040e: 0xe000148f, 0x040f: 0xe0001368, + 0x0410: 0x00325484, 0x0411: 0x00326a84, 0x0412: 0x0032988a, 0x0413: 0xf000020a, + 0x0414: 0xf000020a, 0x0415: 0x00329a84, 0x0416: 0x00327e84, 0x0417: 0xe0001364, + 0x0418: 0x00328688, 0x0419: 0x40328620, 0x041a: 0x00326288, 0x041b: 0x40326220, + 0x041c: 0x00325e88, 0x041d: 0x40325e20, 0x041e: 0x00328488, 0x041f: 0x40328420, + 0x0420: 0x0032a488, 0x0421: 0x4032a420, 0x0422: 0x0032e888, 0x0423: 0x4032e820, + 0x0424: 0x0032f288, 0x0425: 0x4032f220, 0x0426: 0x0032f488, 0x0427: 0x4032f420, + 0x0428: 0x0032fa88, 0x0429: 0x4032fa20, 0x042a: 0x00330888, 0x042b: 0x40330820, + 0x042c: 0x00330e88, 0x042d: 0x40330e20, 0x042e: 0x00331688, 0x042f: 0x40331620, + 0x0430: 0x00327084, 0x0431: 0x00328884, 0x0432: 0x00328e84, 0x0433: 0x40326e20, + 0x0434: 0x00326a8a, 0x0435: 0x00325c84, 0x0436: 0x40092e20, 0x0437: 0x0032a888, + 0x0438: 0x4032a820, 0x0439: 0x00328e8a, 0x043a: 0x00328288, 0x043b: 0x40328220, + 0x043c: 0x40328c20, 0x043d: 0x00329288, 0x043e: 0x00329088, 0x043f: 0x00329488, + // Block 0x11, offset 0x440 + 0x0440: 0xe00014bd, 0x0441: 0xe00014c3, 0x0442: 0x00339688, 0x0443: 0x0033a288, + 0x0444: 0x0033c288, 0x0445: 0x0033fc88, 0x0446: 0xc02a0071, 0x0447: 0x00343688, + 0x0448: 0x00344688, 0x0449: 0x00349a88, 0x044a: 0x0034e488, 0x044b: 0x00356288, + 0x044c: 0x00356a88, 0x044d: 0xe00014cf, 0x044e: 0x00357a88, 0x044f: 0x00365488, + 0x0450: 0xc0090041, 0x0451: 0x00335288, 0x0452: 0x00335a88, 0x0453: 0xc0130092, + 0x0454: 0x00338a88, 0x0455: 0xc01800d1, 0x0456: 0xc01c0071, 0x0457: 0xc0200071, + 0x0458: 0xc0250041, 0x0459: 0x00343e88, 0x045a: 0xc0370092, 0x045b: 0x00348488, + 0x045c: 0x0034a888, 0x045d: 0x0034ba88, 0x045e: 0xc02e0071, 0x045f: 0x00350e88, + 0x0460: 0x00352888, 0x0461: 0x00353a88, 0x0462: 0x00354c88, 0x0463: 0xc03e00f1, + 0x0464: 0x0035ac88, 0x0465: 0x0035b488, 0x0466: 0x00360288, 0x0467: 0xc0440071, + 0x0468: 0x00365c88, 0x0469: 0x00366688, 0x046a: 0x00367488, 0x046b: 0xc0480071, + 0x046c: 0x00368e88, 0x046d: 0xc04c0071, 0x046e: 0x0036b888, 0x046f: 0x0036c488, + 0x0470: 0xc0060041, 0x0471: 0x40335220, 0x0472: 0x40335a20, 0x0473: 0xc0100092, + 0x0474: 0x40338a20, 0x0475: 0xc01600d1, 0x0476: 0xc01a0071, 0x0477: 0xc01e0071, + 0x0478: 0xc0220041, 0x0479: 0x40343e20, 0x047a: 0xc0340092, 0x047b: 0x40348420, + 0x047c: 0x4034a820, 0x047d: 0x4034ba20, 0x047e: 0xc02c0071, 0x047f: 0x40350e20, + // Block 0x12, offset 0x480 + 0x0480: 0x40352820, 0x0481: 0x40353a20, 0x0482: 0x40354c20, 0x0483: 0xc03a00f1, + 0x0484: 0x4035ac20, 0x0485: 0x4035b420, 0x0486: 0x40360220, 0x0487: 0xc0420071, + 0x0488: 0x40365c20, 0x0489: 0x40366620, 0x048a: 0x40367420, 0x048b: 0xc0460071, + 0x048c: 0x40368e20, 0x048d: 0xc04a0071, 0x048e: 0x4036b820, 0x048f: 0x4036c420, + 0x0490: 0xe00014ba, 0x0491: 0xe00014c0, 0x0492: 0x40339620, 0x0493: 0x4033a220, + 0x0494: 0x4033c220, 0x0495: 0x4033fc20, 0x0496: 0xc0280071, 0x0497: 0x40343620, + 0x0498: 0x40344620, 0x0499: 0x40349a20, 0x049a: 0x4034e420, 0x049b: 0x40356220, + 0x049c: 0x40356a20, 0x049d: 0xe00014cc, 0x049e: 0x40357a20, 0x049f: 0x40365420, + 0x04a0: 0x0035e088, 0x04a1: 0x4035e020, 0x04a2: 0x00369e88, 0x04a3: 0x40369e20, + 0x04a4: 0x0036ce88, 0x04a5: 0x4036ce20, 0x04a6: 0x0036d688, 0x04a7: 0x4036d620, + 0x04a8: 0x0036ea88, 0x04a9: 0x4036ea20, 0x04aa: 0x0036e088, 0x04ab: 0x4036e020, + 0x04ac: 0x0036f488, 0x04ad: 0x4036f420, 0x04ae: 0x0036fc88, 0x04af: 0x4036fc20, + 0x04b0: 0x00370488, 0x04b1: 0x40370420, 0x04b2: 0x00370c88, 0x04b3: 0x40370c20, + 0x04b4: 0xc0500131, 0x04b5: 0xc04e0131, 0x04b6: 0x00371c88, 0x04b7: 0x40371c20, + 0x04b8: 0x0035a488, 0x04b9: 0x4035a420, 0x04ba: 0x0035fa88, 0x04bb: 0x4035fa20, + 0x04bc: 0x0035f288, 0x04bd: 0x4035f220, 0x04be: 0x0035e888, 0x04bf: 0x4035e820, + // Block 0x13, offset 0x4c0 + 0x04c0: 0x00352088, 0x04c1: 0x40352020, 0x04c2: 0x40070620, 0x04c3: 0xae608302, + 0x04c4: 0xae605f02, 0x04c5: 0xae602a02, 0x04c6: 0xae602202, 0x04c7: 0xae605f02, + 0x04c8: 0xa0000000, 0x04c9: 0xa0000000, 0x04ca: 0x00341c88, 0x04cb: 0x40341c20, + 0x04cc: 0x00369688, 0x04cd: 0x40369620, 0x04ce: 0x00353088, 0x04cf: 0x40353020, + 0x04d0: 0xe00014b7, 0x04d1: 0xe00014b4, 0x04d2: 0x00336a88, 0x04d3: 0x40336a20, + 0x04d4: 0x00337a88, 0x04d5: 0x40337a20, 0x04d6: 0x0033dc88, 0x04d7: 0x4033dc20, + 0x04d8: 0x0033aa88, 0x04d9: 0x4033aa20, 0x04da: 0x00345888, 0x04db: 0x40345820, + 0x04dc: 0x00347888, 0x04dd: 0x40347820, 0x04de: 0x00347088, 0x04df: 0x40347020, + 0x04e0: 0x00346888, 0x04e1: 0x40346820, 0x04e2: 0x0034ca88, 0x04e3: 0x4034ca20, + 0x04e4: 0x0034dc88, 0x04e5: 0x4034dc20, 0x04e6: 0x00351888, 0x04e7: 0x40351820, + 0x04e8: 0x00372688, 0x04e9: 0x40372620, 0x04ea: 0x00354488, 0x04eb: 0x40354420, + 0x04ec: 0x00355888, 0x04ed: 0x40355820, 0x04ee: 0x00359288, 0x04ef: 0x40359220, + 0x04f0: 0x00359a88, 0x04f1: 0x40359a20, 0x04f2: 0x0035cc88, 0x04f3: 0x4035cc20, + 0x04f4: 0x00360e88, 0x04f5: 0x40360e20, 0x04f6: 0x00362a88, 0x04f7: 0x40362a20, + 0x04f8: 0x00363a88, 0x04f9: 0x40363a20, 0x04fa: 0x0035d488, 0x04fb: 0x4035d420, + 0x04fc: 0x00364488, 0x04fd: 0x40364420, 0x04fe: 0x00364c88, 0x04ff: 0x40364c20, + // Block 0x14, offset 0x500 + 0x0500: 0x00373088, 0x0501: 0xe00014c9, 0x0502: 0xe00014c6, 0x0503: 0x00346088, + 0x0504: 0x40346020, 0x0505: 0x00348e88, 0x0506: 0x40348e20, 0x0507: 0x0034d288, + 0x0508: 0x4034d220, 0x0509: 0x0034c288, 0x050a: 0x4034c220, 0x050b: 0x00363288, + 0x050c: 0x40363220, 0x050d: 0x0034b088, 0x050e: 0x4034b020, 0x050f: 0x40373020, + 0x0510: 0x00332a88, 0x0511: 0x40332a20, 0x0512: 0x00333288, 0x0513: 0x40333220, + 0x0514: 0x00334a88, 0x0515: 0x40334a20, 0x0516: 0x0033ba88, 0x0517: 0x4033ba20, + 0x0518: 0xc00e0071, 0x0519: 0xc00c0071, 0x051a: 0x00334288, 0x051b: 0x40334220, + 0x051c: 0x0033d488, 0x051d: 0x4033d420, 0x051e: 0x0033f288, 0x051f: 0x4033f220, + 0x0520: 0x00340688, 0x0521: 0x40340620, 0x0522: 0xe00014d5, 0x0523: 0xe00014d2, + 0x0524: 0x00342488, 0x0525: 0x40342420, 0x0526: 0x0034f688, 0x0527: 0x4034f620, + 0x0528: 0xc0320071, 0x0529: 0xc0300071, 0x052a: 0x00350688, 0x052b: 0x40350620, + 0x052c: 0x0036b088, 0x052d: 0x4036b020, 0x052e: 0xe00014de, 0x052f: 0xe00014db, + 0x0530: 0x00358288, 0x0531: 0x40358220, 0x0532: 0x00358a88, 0x0533: 0x40358a20, + 0x0534: 0x00362288, 0x0535: 0x40362220, 0x0536: 0x00338288, 0x0537: 0x40338220, + 0x0538: 0x00368688, 0x0539: 0x40368620, 0x053a: 0x00337288, 0x053b: 0x40337220, + 0x053c: 0x0035bc88, 0x053d: 0x4035bc20, 0x053e: 0x0035c488, 0x053f: 0x4035c420, + // Block 0x15, offset 0x540 + 0x0540: 0x00339288, 0x0541: 0x40339220, 0x0542: 0x0033a088, 0x0543: 0x4033a020, + 0x0544: 0x0033ee88, 0x0545: 0x4033ee20, 0x0546: 0x00341088, 0x0547: 0x40341020, + 0x0548: 0x0034a488, 0x0549: 0x4034a420, 0x054a: 0x0034ec88, 0x054b: 0x4034ec20, + 0x054c: 0x00354288, 0x054d: 0x40354220, 0x054e: 0x00355688, 0x054f: 0x40355620, + 0x0550: 0x0033f088, 0x0551: 0x4033f020, 0x0552: 0x00349688, 0x0553: 0x40349620, + 0x0554: 0x0034a688, 0x0555: 0x4034a620, 0x0556: 0x00353888, 0x0557: 0x40353820, + 0x0558: 0x0036cc88, 0x0559: 0x4036cc20, 0x055a: 0x00348288, 0x055b: 0x40348220, + 0x055c: 0x00372e88, 0x055d: 0x40372e20, 0x055e: 0x00348088, 0x055f: 0x40348020, + 0x0560: 0x00349888, 0x0561: 0x40349820, 0x0562: 0x0034da88, 0x0563: 0x4034da20, + 0x0564: 0x00351688, 0x0565: 0x40351620, 0x0566: 0x0035dc88, 0x0567: 0x4035dc20, + 0x0571: 0x00384288, 0x0572: 0x00384488, 0x0573: 0x00384688, + 0x0574: 0x00384888, 0x0575: 0x00384a88, 0x0576: 0x00384c88, 0x0577: 0x00384e88, + 0x0578: 0x00385088, 0x0579: 0x00385288, 0x057a: 0x00385488, 0x057b: 0x00385688, + 0x057c: 0x00385888, 0x057d: 0x00385a88, 0x057e: 0x00385c88, 0x057f: 0x00385e88, + // Block 0x16, offset 0x580 + 0x0580: 0x00386088, 0x0581: 0x00386288, 0x0582: 0x00386488, 0x0583: 0x00386688, + 0x0584: 0x00386888, 0x0585: 0x00386a88, 0x0586: 0x00386c88, 0x0587: 0x00386e88, + 0x0588: 0x00387088, 0x0589: 0x00387288, 0x058a: 0x00387488, 0x058b: 0x00387688, + 0x058c: 0x00387888, 0x058d: 0x00387a88, 0x058e: 0x00387c88, 0x058f: 0x00387e88, + 0x0590: 0x00388088, 0x0591: 0x00388288, 0x0592: 0x00388488, 0x0593: 0x00388688, + 0x0594: 0x00388888, 0x0595: 0x00388a88, 0x0596: 0x00388c88, + 0x0599: 0x40388e20, 0x059a: 0x40054e20, 0x059b: 0x40055020, + 0x059c: 0x4002be20, 0x059d: 0x40024620, 0x059e: 0x4002ca20, 0x059f: 0x40055220, + 0x05a1: 0x40384220, 0x05a2: 0x40384420, 0x05a3: 0x40384620, + 0x05a4: 0x40384820, 0x05a5: 0x40384a20, 0x05a6: 0x40384c20, 0x05a7: 0x40384e20, + 0x05a8: 0x40385020, 0x05a9: 0x40385220, 0x05aa: 0x40385420, 0x05ab: 0x40385620, + 0x05ac: 0x40385820, 0x05ad: 0x40385a20, 0x05ae: 0x40385c20, 0x05af: 0x40385e20, + 0x05b0: 0x40386020, 0x05b1: 0x40386220, 0x05b2: 0x40386420, 0x05b3: 0x40386620, + 0x05b4: 0x40386820, 0x05b5: 0x40386a20, 0x05b6: 0x40386c20, 0x05b7: 0x40386e20, + 0x05b8: 0x40387020, 0x05b9: 0x40387220, 0x05ba: 0x40387420, 0x05bb: 0x40387620, + 0x05bc: 0x40387820, 0x05bd: 0x40387a20, 0x05be: 0x40387c20, 0x05bf: 0x40387e20, + // Block 0x17, offset 0x5c0 + 0x05c0: 0x40388020, 0x05c1: 0x40388220, 0x05c2: 0x40388420, 0x05c3: 0x40388620, + 0x05c4: 0x40388820, 0x05c5: 0x40388a20, 0x05c6: 0x40388c20, 0x05c7: 0xf0000404, + 0x05c9: 0x40026e20, 0x05ca: 0x40021c20, + 0x05cf: 0x4027e420, + 0x05d1: 0xadc00000, 0x05d2: 0xae600000, 0x05d3: 0xae600000, + 0x05d4: 0xae600000, 0x05d5: 0xae600000, 0x05d6: 0xadc00000, 0x05d7: 0xae600000, + 0x05d8: 0xae600000, 0x05d9: 0xae600000, 0x05da: 0xade00000, 0x05db: 0xadc00000, + 0x05dc: 0xae600000, 0x05dd: 0xae600000, 0x05de: 0xae600000, 0x05df: 0xae600000, + 0x05e0: 0xae600000, 0x05e1: 0xae600000, 0x05e2: 0xadc00000, 0x05e3: 0xadc00000, + 0x05e4: 0xadc00000, 0x05e5: 0xadc00000, 0x05e6: 0xadc00000, 0x05e7: 0xadc00000, + 0x05e8: 0xae600000, 0x05e9: 0xae600000, 0x05ea: 0xadc00000, 0x05eb: 0xae600000, + 0x05ec: 0xae600000, 0x05ed: 0xade00000, 0x05ee: 0xae400000, 0x05ef: 0xae600000, + 0x05f0: 0xa0a08502, 0x05f1: 0xa0b08602, 0x05f2: 0xa0c08702, 0x05f3: 0xa0d08802, + 0x05f4: 0xa0e08902, 0x05f5: 0xa0f08a02, 0x05f6: 0xa1008b02, 0x05f7: 0xa1108c02, + 0x05f8: 0xa1208d02, 0x05f9: 0xa1308e02, 0x05fa: 0xa1308e02, 0x05fb: 0xa1408f02, + 0x05fc: 0xa1509202, 0x05fd: 0xa1600000, 0x05fe: 0x40055420, 0x05ff: 0xa1709502, + // Block 0x18, offset 0x600 + 0x0600: 0x40055620, 0x0601: 0xa1809102, 0x0602: 0xa1909002, 0x0603: 0x40055820, + 0x0604: 0xae600000, 0x0605: 0xadc00000, 0x0606: 0x40055a20, 0x0607: 0xa1208d02, + 0x0610: 0x40389020, 0x0611: 0x40389220, 0x0612: 0x40389420, 0x0613: 0x40389620, + 0x0614: 0x40389820, 0x0615: 0x40389a20, 0x0616: 0x40389c20, 0x0617: 0x40389e20, + 0x0618: 0x4038a020, 0x0619: 0x4038a220, 0x061a: 0x0038a499, 0x061b: 0x4038a420, + 0x061c: 0x4038a620, 0x061d: 0x0038a899, 0x061e: 0x4038a820, 0x061f: 0x0038aa99, + 0x0620: 0x4038aa20, 0x0621: 0x4038ac20, 0x0622: 0x4038ae20, 0x0623: 0x0038b099, + 0x0624: 0x4038b020, 0x0625: 0x0038b299, 0x0626: 0x4038b220, 0x0627: 0x4038b420, + 0x0628: 0x4038b620, 0x0629: 0x4038b820, 0x062a: 0x4038ba20, + 0x0630: 0xe00014ff, 0x0631: 0xe0001502, 0x0632: 0xe0001511, 0x0633: 0x40055c20, + 0x0634: 0x40055e20, + // Block 0x19, offset 0x640 + 0x0640: 0xa0000000, 0x0641: 0xa0000000, 0x0642: 0xa0000000, 0x0643: 0xa0000000, + 0x0644: 0xa0000000, 0x0646: 0x40096620, 0x0647: 0x40096a20, + 0x0648: 0x40070820, 0x0649: 0x4004f220, 0x064a: 0x4004f620, 0x064b: 0x4027e620, + 0x064c: 0x40024820, 0x064d: 0x40024a20, 0x064e: 0x40070e20, 0x064f: 0x40071020, + 0x0650: 0xae600000, 0x0651: 0xae600000, 0x0652: 0xae600000, 0x0653: 0xae600000, + 0x0654: 0xae600000, 0x0655: 0xae600000, 0x0656: 0xae600000, 0x0657: 0xae600000, + 0x0658: 0xa1e00000, 0x0659: 0xa1f00000, 0x065a: 0xa2000000, 0x065b: 0x40026420, + 0x065e: 0x40027020, 0x065f: 0x4002cc20, + 0x0660: 0x403aa220, 0x0661: 0x40391c20, 0x0662: 0x40391e20, 0x0663: 0x40392020, + 0x0664: 0x40392620, 0x0665: 0x40392820, 0x0666: 0x40393020, 0x0667: 0xc0520151, + 0x0668: 0x40393c20, 0x0669: 0x40395420, 0x066a: 0x40395620, 0x066b: 0x40395820, + 0x066c: 0x40396420, 0x066d: 0x40397220, 0x066e: 0x40397420, 0x066f: 0x40398820, + 0x0670: 0x40398a20, 0x0671: 0x4039a420, 0x0672: 0x4039a620, 0x0673: 0x4039c620, + 0x0674: 0x4039c820, 0x0675: 0x4039dc20, 0x0676: 0x4039de20, 0x0677: 0x4039e620, + 0x0678: 0x4039e820, 0x0679: 0x4039ee20, 0x067a: 0x4039f020, 0x067b: 0x403a3820, + 0x067c: 0x403a3a20, 0x067d: 0x403a9c20, 0x067e: 0x403a9e20, 0x067f: 0x403aa020, + // Block 0x1a, offset 0x680 + 0x0680: 0xa0000000, 0x0681: 0x4039fc20, 0x0682: 0x403a1220, 0x0683: 0x403a1a20, + 0x0684: 0x403a4020, 0x0685: 0x403a4e20, 0x0686: 0x403a5620, 0x0687: 0x403a6820, + 0x0688: 0xc0560171, 0x0689: 0x403a8e20, 0x068a: 0xc0580171, 0x068b: 0xa1b0a202, + 0x068c: 0xa1c0a502, 0x068d: 0xa1d0a902, 0x068e: 0xa1e0ad02, 0x068f: 0xa1f0b202, + 0x0690: 0xa200b602, 0x0691: 0xa210ba02, 0x0692: 0xa220bc02, 0x0693: 0xae60bd02, + 0x0694: 0xae60be02, 0x0695: 0xadc0bf02, 0x0696: 0xadc0c102, 0x0697: 0xae60c202, + 0x0698: 0xae60c302, 0x0699: 0xae60c402, 0x069a: 0xae60c502, 0x069b: 0xae60c602, + 0x069c: 0xadc0c702, 0x069d: 0xae60c802, 0x069e: 0xae60c902, 0x069f: 0xadc0c002, + 0x06a0: 0xe000015e, 0x06a1: 0xe00001e6, 0x06a2: 0xe0000301, 0x06a3: 0xe00003db, + 0x06a4: 0xe00004b6, 0x06a5: 0xe0000580, 0x06a6: 0xe000064b, 0x06a7: 0xe00006f3, + 0x06a8: 0xe000079f, 0x06a9: 0xe0000844, 0x06aa: 0x4004ee20, 0x06ab: 0x40024c20, + 0x06ac: 0x40024e20, 0x06ad: 0x4004de20, 0x06ae: 0x40393a20, 0x06af: 0x403a1020, + 0x06b0: 0xa230d102, 0x06b1: 0x40392420, 0x06b2: 0x40392220, 0x06b3: 0x40392a20, + 0x06b4: 0x00391c84, 0x06b5: 0xf0000404, 0x06b6: 0xf0000404, 0x06b7: 0xf0000404, + 0x06b8: 0xf0000404, 0x06b9: 0x40395a20, 0x06ba: 0x40395c20, 0x06bb: 0x40393e20, + 0x06bc: 0x40395e20, 0x06bd: 0x40396020, 0x06be: 0x40394020, 0x06bf: 0x40396220, + // Block 0x1b, offset 0x6c0 + 0x06c0: 0x40394220, 0x06c1: 0x40397620, 0x06c2: 0x40397820, 0x06c3: 0x40396620, + 0x06c4: 0x40396820, 0x06c5: 0x40397a20, 0x06c6: 0x40396a20, 0x06c7: 0x40396e20, + 0x06c8: 0x40398c20, 0x06c9: 0x40398e20, 0x06ca: 0x40399020, 0x06cb: 0x40399220, + 0x06cc: 0x40399420, 0x06cd: 0x40399620, 0x06ce: 0x40399820, 0x06cf: 0x40399a20, + 0x06d0: 0x40399c20, 0x06d1: 0x4039a820, 0x06d2: 0x4039aa20, 0x06d3: 0x4039ac20, + 0x06d4: 0x4039ae20, 0x06d5: 0x4039b020, 0x06d6: 0x4039b220, 0x06d7: 0x4039b420, + 0x06d8: 0x4039b620, 0x06d9: 0x4039b820, 0x06da: 0x4039ca20, 0x06db: 0x4039cc20, + 0x06dc: 0x4039ce20, 0x06dd: 0x4039e020, 0x06de: 0x4039e220, 0x06df: 0x4039ea20, + 0x06e0: 0x4039f220, 0x06e1: 0x4039fe20, 0x06e2: 0x403a0020, 0x06e3: 0x403a0220, + 0x06e4: 0x403a0420, 0x06e5: 0x403a0820, 0x06e6: 0x403a0a20, 0x06e7: 0x403a1420, + 0x06e8: 0x403a1620, 0x06e9: 0x403a1c20, 0x06ea: 0x403a1e20, 0x06eb: 0x403a2020, + 0x06ec: 0x403a2220, 0x06ed: 0x403a2620, 0x06ee: 0x403a2820, 0x06ef: 0x403a2a20, + 0x06f0: 0x403a2c20, 0x06f1: 0x403a2e20, 0x06f2: 0x403a3020, 0x06f3: 0x403a3220, + 0x06f4: 0x403a3420, 0x06f5: 0x403a4220, 0x06f6: 0x403a4420, 0x06f7: 0x403a4620, + 0x06f8: 0x403a4820, 0x06f9: 0x403a6020, 0x06fa: 0x403a5820, 0x06fb: 0x403a5a20, + 0x06fc: 0x403a5c20, 0x06fd: 0x403a5e20, 0x06fe: 0x403a6a20, 0x06ff: 0x40396c20, + // Block 0x1c, offset 0x700 + 0x0700: 0xe00017e4, 0x0701: 0x403a6c20, 0x0702: 0xe00017e1, 0x0703: 0x403a6e20, + 0x0704: 0x403a7620, 0x0705: 0x403a7820, 0x0706: 0x403a7a20, 0x0707: 0x403a7c20, + 0x0708: 0x403a7e20, 0x0709: 0x403a8020, 0x070a: 0x403a8220, 0x070b: 0x403a8420, + 0x070c: 0x403a9220, 0x070d: 0x403a9420, 0x070e: 0x403a9620, 0x070f: 0x403a8620, + 0x0710: 0x403a9820, 0x0711: 0x403a9a20, 0x0712: 0x403aaa20, 0x0713: 0xe0001800, + 0x0714: 0x4002e820, 0x0715: 0x403a7220, 0x0716: 0xae600000, 0x0717: 0xae600000, + 0x0718: 0xae600000, 0x0719: 0xae600000, 0x071a: 0xae600000, 0x071b: 0xae600000, + 0x071c: 0xae600000, 0x071d: 0xa0000000, 0x071e: 0x40071220, 0x071f: 0xae600000, + 0x0720: 0xae600000, 0x0721: 0xae600000, 0x0722: 0xae600000, 0x0723: 0xadc00000, + 0x0724: 0xae600000, 0x0725: 0x003a7484, 0x0726: 0x003a9084, 0x0727: 0xae600000, + 0x0728: 0xae600000, 0x0729: 0x40071420, 0x072a: 0xadc00000, 0x072b: 0xae600000, + 0x072c: 0xae600000, 0x072d: 0xadc00000, 0x072e: 0x40399e20, 0x072f: 0x4039ba20, + 0x0730: 0xe0000161, 0x0731: 0xe00001e9, 0x0732: 0xe0000304, 0x0733: 0xe00003de, + 0x0734: 0xe00004b9, 0x0735: 0xe0000583, 0x0736: 0xe000064e, 0x0737: 0xe00006f6, + 0x0738: 0xe00007a2, 0x0739: 0xe0000847, 0x073a: 0x4039d020, 0x073b: 0x4039e420, + 0x073c: 0x4039f420, 0x073d: 0xe0001553, 0x073e: 0xe0001779, 0x073f: 0x403a7020, + // Block 0x1d, offset 0x740 + 0x0740: 0x40035c20, 0x0741: 0x4002ea20, 0x0742: 0x4002ec20, 0x0743: 0x40027220, + 0x0744: 0x40027420, 0x0745: 0x40027620, 0x0746: 0x40027820, 0x0747: 0x40027a20, + 0x0748: 0x40027c20, 0x0749: 0x4002ce20, 0x074a: 0x40056020, 0x074b: 0x40056220, + 0x074c: 0x40056420, 0x074d: 0x40056620, 0x074f: 0xa0000000, + 0x0750: 0x403ab020, 0x0751: 0xa240d202, 0x0752: 0x403ab220, 0x0753: 0x403ab420, + 0x0754: 0xe0001806, 0x0755: 0x403ab820, 0x0756: 0x403ab620, 0x0757: 0x403aba20, + 0x0758: 0x403abc20, 0x0759: 0x403abe20, 0x075a: 0x403ac220, 0x075b: 0x403ac420, + 0x075c: 0xe000180f, 0x075d: 0x403ac620, 0x075e: 0x403ac820, 0x075f: 0x403aca20, + 0x0760: 0x403ace20, 0x0761: 0x403ad020, 0x0762: 0x403ad220, 0x0763: 0x403ad420, + 0x0764: 0x003ad499, 0x0765: 0x403ad620, 0x0766: 0x403ad820, 0x0767: 0xe0001812, + 0x0768: 0x403adc20, 0x0769: 0x403ade20, 0x076a: 0x403ae020, 0x076b: 0x403ae220, + 0x076c: 0x403ae420, 0x076d: 0xe0001803, 0x076e: 0xe0001809, 0x076f: 0xe000180c, + 0x0770: 0xae60d302, 0x0771: 0xadc0d402, 0x0772: 0xae60d502, 0x0773: 0xae60d602, + 0x0774: 0xadc0d702, 0x0775: 0xae60d802, 0x0776: 0xae60d902, 0x0777: 0xadc0da02, + 0x0778: 0xadc0db02, 0x0779: 0xadc0dc02, 0x077a: 0xae60dd02, 0x077b: 0xadc0de02, + 0x077c: 0xadc0df02, 0x077d: 0xae60e002, 0x077e: 0xadc0e102, 0x077f: 0xae60e202, + // Block 0x1e, offset 0x780 + 0x0780: 0xae600000, 0x0781: 0xae605f02, 0x0782: 0xadc06002, 0x0783: 0xae600000, + 0x0784: 0xadc00000, 0x0785: 0xae605f02, 0x0786: 0xadc06002, 0x0787: 0xae600000, + 0x0788: 0xadc00000, 0x0789: 0xae600000, 0x078a: 0xae600000, + 0x078d: 0x403ac020, 0x078e: 0x403acc20, 0x078f: 0x403ada20, + 0x0790: 0x40394420, 0x0791: 0x40394620, 0x0792: 0x40394820, 0x0793: 0x40394a20, + 0x0794: 0x40394c20, 0x0795: 0x40394e20, 0x0796: 0x40395220, 0x0797: 0x40397c20, + 0x0798: 0x40397e20, 0x0799: 0x4039a020, 0x079a: 0x4039a220, 0x079b: 0x4039bc20, + 0x079c: 0x4039d220, 0x079d: 0x4039f620, 0x079e: 0x4039f820, 0x079f: 0x4039fa20, + 0x07a0: 0x403a0c20, 0x07a1: 0x403a0e20, 0x07a2: 0x403a3620, 0x07a3: 0x403a3c20, + 0x07a4: 0x403a3e20, 0x07a5: 0x403a5020, 0x07a6: 0x403a5220, 0x07a7: 0x403a6220, + 0x07a8: 0x403a6420, 0x07a9: 0x403a6620, 0x07aa: 0x403a4a20, 0x07ab: 0x4039be20, + 0x07ac: 0x4039c020, 0x07ad: 0x4039d420, 0x07ae: 0x40398020, 0x07af: 0x40398220, + 0x07b0: 0x4039d620, 0x07b1: 0x4039c220, 0x07b2: 0x40398420, 0x07b3: 0x40392c20, + 0x07b4: 0x40392e20, 0x07b5: 0x403aa420, 0x07b6: 0x403aa620, 0x07b7: 0x403aa820, + 0x07b8: 0x403a8820, 0x07b9: 0x403a8a20, 0x07ba: 0x403aac20, 0x07bb: 0x403aae20, + 0x07bc: 0x40398620, 0x07bd: 0x4039d820, 0x07be: 0x4039da20, 0x07bf: 0x403a2420, + // Block 0x1f, offset 0x7c0 + 0x07c0: 0x403b1820, 0x07c1: 0x403b1e20, 0x07c2: 0x403b2020, 0x07c3: 0x403b2220, + 0x07c4: 0x403b2620, 0x07c5: 0x403b2820, 0x07c6: 0x403b2a20, 0x07c7: 0x403b2c20, + 0x07c8: 0x403b3220, 0x07c9: 0x403b3620, 0x07ca: 0x403b3820, 0x07cb: 0x403b3a20, + 0x07cc: 0x403b3e20, 0x07cd: 0x403b4620, 0x07ce: 0x403b4820, 0x07cf: 0x403b4c20, + 0x07d0: 0x403b4e20, 0x07d1: 0x403b5620, 0x07d2: 0x403b5820, 0x07d3: 0x403b5a20, + 0x07d4: 0x403b5c20, 0x07d5: 0x403b5e20, 0x07d6: 0x403b6020, 0x07d7: 0x403b6220, + 0x07d8: 0x403b4020, 0x07d9: 0x403b1a20, 0x07da: 0x403b1c20, 0x07db: 0x403b3c20, + 0x07dc: 0x403b2420, 0x07dd: 0x403b5020, 0x07de: 0x403b5220, 0x07df: 0x403b5420, + 0x07e0: 0x403b4220, 0x07e1: 0x403b4420, 0x07e2: 0x403b2e20, 0x07e3: 0x403b3020, + 0x07e4: 0x403b4a20, 0x07e5: 0x403b3420, 0x07e6: 0x403b6620, 0x07e7: 0x403b6820, + 0x07e8: 0x403b6a20, 0x07e9: 0x403b6c20, 0x07ea: 0x403b6e20, 0x07eb: 0x403b7020, + 0x07ec: 0x403b7220, 0x07ed: 0x403b7420, 0x07ee: 0x403b7620, 0x07ef: 0x403b7820, + 0x07f0: 0x403b7a20, 0x07f1: 0x403b6420, + // Block 0x20, offset 0x800 + 0x0800: 0xe0000164, 0x0801: 0xe00001ef, 0x0802: 0xe000030a, 0x0803: 0xe00003e4, + 0x0804: 0xe00004bf, 0x0805: 0xe0000589, 0x0806: 0xe0000654, 0x0807: 0xe00006fc, + 0x0808: 0xe00007a8, 0x0809: 0xe000084d, 0x080a: 0x403b7c20, 0x080b: 0x403b7e20, + 0x080c: 0x403b8020, 0x080d: 0x403b8220, 0x080e: 0x403b8420, 0x080f: 0x403b8620, + 0x0810: 0x403b8820, 0x0811: 0x403b8a20, 0x0812: 0x403b8c20, 0x0813: 0x403b8e20, + 0x0814: 0x403b9020, 0x0815: 0x403b9220, 0x0816: 0x403b9420, 0x0817: 0x403b9620, + 0x0818: 0x403b9820, 0x0819: 0x403b9a20, 0x081a: 0x403b9c20, 0x081b: 0x403b9e20, + 0x081c: 0x403ba020, 0x081d: 0x403ba220, 0x081e: 0x403ba420, 0x081f: 0x403ba620, + 0x0820: 0x403ba820, 0x0821: 0x403baa20, 0x0822: 0x403bac20, 0x0823: 0x403bae20, + 0x0824: 0x403bb020, 0x0825: 0x403bb220, 0x0826: 0x403bb420, 0x0827: 0x403bb620, + 0x0828: 0xe0001815, 0x0829: 0xe0001818, 0x082a: 0xe000181b, 0x082b: 0xae60e302, + 0x082c: 0xae60e402, 0x082d: 0xae60e502, 0x082e: 0xae60e602, 0x082f: 0xae60e702, + 0x0830: 0xae60e802, 0x0831: 0xae60e902, 0x0832: 0xadc0ea02, 0x0833: 0xae60eb02, + 0x0834: 0x403bb820, 0x0835: 0x403bba20, 0x0836: 0x40073820, 0x0837: 0x40035e20, + 0x0838: 0x40025020, 0x0839: 0x4002c020, 0x083a: 0xa0000000, + // Block 0x21, offset 0x840 + 0x0840: 0x4038e820, 0x0841: 0x4038ea20, 0x0842: 0x4038ec20, 0x0843: 0x4038ee20, + 0x0844: 0x4038f020, 0x0845: 0x4038f220, 0x0846: 0x4038f420, 0x0847: 0x4038f620, + 0x0848: 0x4038f820, 0x0849: 0x4038fa20, 0x084a: 0x4038fc20, 0x084b: 0x4038fe20, + 0x084c: 0x40390020, 0x084d: 0x40390220, 0x084e: 0x40390420, 0x084f: 0x40390620, + 0x0850: 0x40390820, 0x0851: 0x40390a20, 0x0852: 0x40390c20, 0x0853: 0x40390e20, + 0x0854: 0x40391020, 0x0855: 0x40391220, 0x0856: 0x82e61c8a, 0x0857: 0x82e61c8b, + 0x0858: 0xae609f02, 0x0859: 0xae60a002, 0x085a: 0x40391820, 0x085b: 0x82e61c8d, + 0x085c: 0xae609702, 0x085d: 0xae609702, 0x085e: 0xae609802, 0x085f: 0xae609802, + 0x0860: 0xae609802, 0x0861: 0xae609902, 0x0862: 0xae609902, 0x0863: 0xae609902, + 0x0864: 0xa0009a02, 0x0865: 0xae609a02, 0x0866: 0xae609b02, 0x0867: 0xae609b02, + 0x0868: 0xa0009c02, 0x0869: 0xae609c02, 0x086a: 0xae609c02, 0x086b: 0xae609d02, + 0x086c: 0xae609e02, 0x086d: 0xae60a102, + 0x0870: 0x40027e20, 0x0871: 0x40028020, 0x0872: 0x40028220, 0x0873: 0x40028420, + 0x0874: 0x40028620, 0x0875: 0x40028820, 0x0876: 0x40028a20, 0x0877: 0x40028c20, + 0x0878: 0x40028e20, 0x0879: 0x40029020, 0x087a: 0x40029220, 0x087b: 0x40029420, + 0x087c: 0x40029620, 0x087d: 0x40029820, 0x087e: 0x40029a20, + // Block 0x22, offset 0x880 + 0x0880: 0x403ae620, 0x0881: 0x403ae820, 0x0882: 0x403aea20, 0x0883: 0x403aec20, + 0x0884: 0x403aee20, 0x0885: 0x403af020, 0x0886: 0x403af220, 0x0887: 0x403af420, + 0x0888: 0x403af620, 0x0889: 0x403af820, 0x088a: 0x403afa20, 0x088b: 0x403afc20, + 0x088c: 0x403afe20, 0x088d: 0x403b0020, 0x088e: 0x403b0220, 0x088f: 0x403b0420, + 0x0890: 0x403b0620, 0x0891: 0x403b0820, 0x0892: 0x403b0a20, 0x0893: 0x403b0c20, + 0x0894: 0x403b0e20, 0x0895: 0x403b1020, 0x0896: 0x403b1220, 0x0897: 0x403b1420, + 0x0898: 0x403b1620, 0x0899: 0xadc06002, 0x089a: 0xadc06002, 0x089b: 0xadc06002, + 0x089e: 0x40056820, + // Block 0x23, offset 0x8c0 + 0x08e0: 0x40395020, 0x08e2: 0x40397020, 0x08e3: 0x4039ec20, + 0x08e4: 0x403a0620, 0x08e5: 0x403a1820, 0x08e6: 0x403a4c20, 0x08e7: 0x403a5420, + 0x08e8: 0x40393220, 0x08e9: 0x40393420, 0x08ea: 0x4039c420, 0x08eb: 0x403a8c20, + 0x08ec: 0x40393620, + // Block 0x24, offset 0x900 + 0x0924: 0xae60af02, 0x0925: 0xae60b402, 0x0926: 0xadc0b802, 0x0927: 0xae60a402, + 0x0928: 0xae60a802, 0x0929: 0xadc0ac02, 0x092a: 0xae600000, 0x092b: 0xae600000, + 0x092c: 0xae600000, 0x092d: 0xadc00000, 0x092e: 0xadc00000, 0x092f: 0xadc00000, + 0x0930: 0xa1b0a302, 0x0931: 0xa1c0a702, 0x0932: 0xa1d0ab02, 0x0933: 0xae600000, + 0x0934: 0xae60b002, 0x0935: 0xae60b102, 0x0936: 0xadc0b902, 0x0937: 0xae60ca02, + 0x0938: 0xae60cb02, 0x0939: 0xadc0cf02, 0x093a: 0xadc0d002, 0x093b: 0xae60cd02, + 0x093c: 0xae60ce02, 0x093d: 0xae60cc02, 0x093e: 0xae60b502, + // Block 0x25, offset 0x940 + 0x0940: 0xa000f202, 0x0941: 0xa000f202, 0x0942: 0xa000f302, 0x0943: 0xa000f402, + 0x0944: 0x403fbc20, 0x0945: 0x403fbe20, 0x0946: 0x403fc020, 0x0947: 0x403fcc20, + 0x0948: 0x403fce20, 0x0949: 0x403fd020, 0x094a: 0x403fd220, 0x094b: 0x403fd420, + 0x094c: 0x403fd820, 0x094d: 0x403fdc20, 0x094e: 0x403fde20, 0x094f: 0x403fe020, + 0x0950: 0x403fe220, 0x0951: 0x403fe420, 0x0952: 0x403fe620, 0x0953: 0x403fe820, + 0x0954: 0x403fea20, 0x0955: 0x403fec20, 0x0956: 0x403fee20, 0x0957: 0x403ff020, + 0x0958: 0x403ff420, 0x0959: 0x403ff620, 0x095a: 0x403ff820, 0x095b: 0x403ffa20, + 0x095c: 0x403ffc20, 0x095d: 0x40400220, 0x095e: 0x40400420, 0x095f: 0x40400620, + 0x0960: 0x40400820, 0x0961: 0x40400a20, 0x0962: 0x40400e20, 0x0963: 0x40401020, + 0x0964: 0x40401220, 0x0965: 0x40401420, 0x0966: 0x40401620, 0x0967: 0x40401820, + 0x0968: 0x40401a20, 0x0969: 0xe0001830, 0x096a: 0x40401c20, 0x096b: 0x40401e20, + 0x096c: 0x40402020, 0x096d: 0x40402420, 0x096e: 0x40402620, 0x096f: 0x40402820, + 0x0970: 0x40402c20, 0x0971: 0xe0001839, 0x0972: 0x40402e20, 0x0973: 0x40403020, + 0x0974: 0xe000183c, 0x0975: 0x40403220, 0x0976: 0x40403420, 0x0977: 0x40403620, + 0x0978: 0x40403820, 0x0979: 0x40403a20, 0x097a: 0x40404c20, 0x097b: 0x40404e20, + 0x097c: 0xa070f102, 0x097d: 0x40403c20, 0x097e: 0x40404a20, 0x097f: 0x40405620, + // Block 0x26, offset 0x980 + 0x0980: 0x40405820, 0x0981: 0x40405a20, 0x0982: 0x40405c20, 0x0983: 0x40405e20, + 0x0984: 0x40406020, 0x0985: 0x40406620, 0x0986: 0x40406a20, 0x0987: 0x40406c20, + 0x0988: 0x40407020, 0x0989: 0x40407220, 0x098a: 0x40407420, 0x098b: 0x40407620, + 0x098c: 0x40407820, 0x098d: 0x8209203d, 0x098e: 0x40406e20, 0x098f: 0x40405020, + 0x0990: 0x403fb820, 0x0991: 0xae600000, 0x0992: 0xadc00000, 0x0993: 0xae603502, + 0x0994: 0xae603202, 0x0995: 0x40406820, 0x0996: 0x40405220, 0x0997: 0x40405420, + 0x0998: 0xe000181e, 0x0999: 0xe0001821, 0x099a: 0xe0001824, 0x099b: 0xe0001827, + 0x099c: 0xe000182a, 0x099d: 0xe000182d, 0x099e: 0xe0001833, 0x099f: 0xe0001836, + 0x09a0: 0x403fd620, 0x09a1: 0x403fda20, 0x09a2: 0x40406220, 0x09a3: 0x40406420, + 0x09a4: 0x40030c20, 0x09a5: 0x40030e20, 0x09a6: 0xe000016a, 0x09a7: 0xe00001f8, + 0x09a8: 0xe0000313, 0x09a9: 0xe00003ed, 0x09aa: 0xe00004c8, 0x09ab: 0xe0000592, + 0x09ac: 0xe000065d, 0x09ad: 0xe0000705, 0x09ae: 0xe00007b1, 0x09af: 0xe0000856, + 0x09b0: 0x40056c20, 0x09b1: 0x4027b620, 0x09b2: 0x403fba20, 0x09b3: 0x403fc220, + 0x09b4: 0x403fc420, 0x09b5: 0x403fc620, 0x09b6: 0x403fc820, 0x09b7: 0x403fca20, + 0x09b9: 0x403ffe20, 0x09ba: 0x40402a20, 0x09bb: 0x403ff220, + 0x09bc: 0x40400020, 0x09bd: 0x40403e20, 0x09be: 0x40400c20, 0x09bf: 0x40402220, + // Block 0x27, offset 0x9c0 + 0x09c1: 0xa000f202, 0x09c2: 0xa000f302, 0x09c3: 0xa000f402, + 0x09c5: 0x40407c20, 0x09c6: 0x40407e20, 0x09c7: 0x40408020, + 0x09c8: 0x40408220, 0x09c9: 0x40408420, 0x09ca: 0x40408620, 0x09cb: 0x40408820, + 0x09cc: 0x40408c20, 0x09cf: 0x40409020, + 0x09d0: 0x40409220, 0x09d3: 0x40409420, + 0x09d4: 0x40409620, 0x09d5: 0x40409820, 0x09d6: 0x40409a20, 0x09d7: 0x40409c20, + 0x09d8: 0x40409e20, 0x09d9: 0x4040a020, 0x09da: 0x4040a220, 0x09db: 0x4040a420, + 0x09dc: 0x4040a620, 0x09dd: 0x4040a820, 0x09de: 0x4040aa20, 0x09df: 0x4040ac20, + 0x09e0: 0x4040ae20, 0x09e1: 0x4040b020, 0x09e2: 0x4040b220, 0x09e3: 0x4040b420, + 0x09e4: 0x4040b620, 0x09e5: 0x4040b820, 0x09e6: 0x4040ba20, 0x09e7: 0x4040bc20, + 0x09e8: 0x4040be20, 0x09ea: 0x4040c020, 0x09eb: 0x4040c220, + 0x09ec: 0x4040c420, 0x09ed: 0x4040c620, 0x09ee: 0x4040c820, 0x09ef: 0x4040ca20, + 0x09f0: 0x4040cc20, 0x09f2: 0x4040d020, + 0x09f6: 0x4040d420, 0x09f7: 0x4040d620, + 0x09f8: 0x4040d820, 0x09f9: 0x4040da20, + 0x09fc: 0xa070f102, 0x09fd: 0x4040dc20, 0x09fe: 0x4040de20, 0x09ff: 0x4040e020, + // Block 0x28, offset 0xa00 + 0x0a00: 0x4040e220, 0x0a01: 0x4040e420, 0x0a02: 0x4040e620, 0x0a03: 0x4040e820, + 0x0a04: 0x4040ea20, 0x0a07: 0xc05a0191, + 0x0a08: 0x4040f220, 0x0a0b: 0x4040f420, + 0x0a0c: 0x4040f620, 0x0a0d: 0x8209207c, 0x0a0e: 0xe0001845, + 0x0a17: 0x4040fa20, + 0x0a1c: 0xe000183f, 0x0a1d: 0xe0001842, 0x0a1f: 0xe0001848, + 0x0a20: 0x40408a20, 0x0a21: 0x40408e20, 0x0a22: 0x4040ec20, 0x0a23: 0x4040ee20, + 0x0a26: 0xe000016d, 0x0a27: 0xe00001fb, + 0x0a28: 0xe0000316, 0x0a29: 0xe00003f0, 0x0a2a: 0xe00004cb, 0x0a2b: 0xe0000595, + 0x0a2c: 0xe0000660, 0x0a2d: 0xe0000708, 0x0a2e: 0xe00007b4, 0x0a2f: 0xe0000859, + 0x0a30: 0x4040ce20, 0x0a31: 0x4040d220, 0x0a32: 0x4027e820, 0x0a33: 0x4027ea20, + 0x0a34: 0x40283020, 0x0a35: 0x40283220, 0x0a36: 0x40283420, 0x0a37: 0x40283620, + 0x0a38: 0x40283820, 0x0a39: 0x40283a20, 0x0a3a: 0x40073a20, 0x0a3b: 0x4027ec20, + // Block 0x29, offset 0xa40 + 0x0a41: 0xa000f202, 0x0a42: 0xa000f302, 0x0a43: 0xa000f402, + 0x0a45: 0x40410620, 0x0a46: 0x40410820, 0x0a47: 0x40411020, + 0x0a48: 0x40411220, 0x0a49: 0x40410020, 0x0a4a: 0x40410220, + 0x0a4f: 0x40411420, + 0x0a50: 0x40410a20, 0x0a53: 0x40410420, + 0x0a54: 0x40410c20, 0x0a55: 0x40411c20, 0x0a56: 0x40411e20, 0x0a57: 0x40412020, + 0x0a58: 0x40412220, 0x0a59: 0x40412420, 0x0a5a: 0x40412620, 0x0a5b: 0x40412820, + 0x0a5c: 0x40412a20, 0x0a5d: 0x40412c20, 0x0a5e: 0x40412e20, 0x0a5f: 0x40413020, + 0x0a60: 0x40413220, 0x0a61: 0x40413420, 0x0a62: 0x40413620, 0x0a63: 0x40413820, + 0x0a64: 0x40413a20, 0x0a65: 0x40413c20, 0x0a66: 0x40413e20, 0x0a67: 0x40414020, + 0x0a68: 0x40414220, 0x0a6a: 0x40414420, 0x0a6b: 0x40414620, + 0x0a6c: 0x40414820, 0x0a6d: 0x40414a20, 0x0a6e: 0x40414c20, 0x0a6f: 0x40414e20, + 0x0a70: 0x40415220, 0x0a72: 0x40415420, 0x0a73: 0xe000185a, + 0x0a75: 0x40415620, 0x0a76: 0xe000184b, + 0x0a78: 0x40411620, 0x0a79: 0x40411820, + 0x0a7c: 0xa070f102, 0x0a7e: 0x40415a20, 0x0a7f: 0x40415c20, + // Block 0x2a, offset 0xa80 + 0x0a80: 0x40415e20, 0x0a81: 0x40416020, 0x0a82: 0x40416220, + 0x0a87: 0x40416420, + 0x0a88: 0x40416620, 0x0a8b: 0x40416820, + 0x0a8c: 0x40416a20, 0x0a8d: 0x820920b6, + 0x0a91: 0x40411a20, + 0x0a99: 0xe000184e, 0x0a9a: 0xe0001851, 0x0a9b: 0xe0001854, + 0x0a9c: 0x40415820, 0x0a9e: 0xe0001857, + 0x0aa6: 0xe0000170, 0x0aa7: 0xe00001fe, + 0x0aa8: 0xe0000319, 0x0aa9: 0xe00003f3, 0x0aaa: 0xe00004ce, 0x0aab: 0xe0000598, + 0x0aac: 0xe0000663, 0x0aad: 0xe000070b, 0x0aae: 0xe00007b7, 0x0aaf: 0xe000085c, + 0x0ab0: 0xa000f502, 0x0ab1: 0xa000f602, 0x0ab2: 0x40410e20, 0x0ab3: 0x4040fe20, + 0x0ab4: 0x4040fc20, 0x0ab5: 0x40415020, + // Block 0x2b, offset 0xac0 + 0x0ac1: 0xa000f202, 0x0ac2: 0xa000f302, 0x0ac3: 0xa000f402, + 0x0ac5: 0x40417020, 0x0ac6: 0x40417220, 0x0ac7: 0x40417420, + 0x0ac8: 0x40417620, 0x0ac9: 0x40417820, 0x0aca: 0x40417a20, 0x0acb: 0x40417c20, + 0x0acc: 0x40418020, 0x0acd: 0x40418420, 0x0acf: 0x40418620, + 0x0ad0: 0x40418820, 0x0ad1: 0x40418a20, 0x0ad3: 0x40418c20, + 0x0ad4: 0x40418e20, 0x0ad5: 0x40419020, 0x0ad6: 0x40419220, 0x0ad7: 0x40419420, + 0x0ad8: 0x40419620, 0x0ad9: 0x40419820, 0x0ada: 0x40419a20, 0x0adb: 0x40419c20, + 0x0adc: 0x40419e20, 0x0add: 0x4041a020, 0x0ade: 0x4041a220, 0x0adf: 0x4041a420, + 0x0ae0: 0x4041a620, 0x0ae1: 0x4041a820, 0x0ae2: 0x4041aa20, 0x0ae3: 0x4041ac20, + 0x0ae4: 0x4041ae20, 0x0ae5: 0x4041b020, 0x0ae6: 0x4041b220, 0x0ae7: 0x4041b420, + 0x0ae8: 0x4041b620, 0x0aea: 0x4041b820, 0x0aeb: 0x4041ba20, + 0x0aec: 0x4041bc20, 0x0aed: 0x4041be20, 0x0aee: 0x4041c020, 0x0aef: 0x4041c220, + 0x0af0: 0x4041c420, 0x0af2: 0x4041c620, 0x0af3: 0x4041d220, + 0x0af5: 0x4041c820, 0x0af6: 0x4041ca20, 0x0af7: 0x4041cc20, + 0x0af8: 0x4041ce20, 0x0af9: 0x4041d020, + 0x0afc: 0xa070f102, 0x0afd: 0x4041d420, 0x0afe: 0x4041d620, 0x0aff: 0x4041d820, + // Block 0x2c, offset 0xb00 + 0x0b00: 0x4041da20, 0x0b01: 0x4041dc20, 0x0b02: 0x4041de20, 0x0b03: 0x4041e020, + 0x0b04: 0x4041e220, 0x0b05: 0x4041e820, 0x0b07: 0x4041ea20, + 0x0b08: 0x4041ec20, 0x0b09: 0x4041ee20, 0x0b0b: 0x4041f020, + 0x0b0c: 0x4041f220, 0x0b0d: 0x820920fa, + 0x0b10: 0x40416e20, + 0x0b20: 0x40417e20, 0x0b21: 0x40418220, 0x0b22: 0x4041e420, 0x0b23: 0x4041e620, + 0x0b26: 0xe0000173, 0x0b27: 0xe0000201, + 0x0b28: 0xe000031c, 0x0b29: 0xe00003f6, 0x0b2a: 0xe00004d1, 0x0b2b: 0xe000059b, + 0x0b2c: 0xe0000666, 0x0b2d: 0xe000070e, 0x0b2e: 0xe00007ba, 0x0b2f: 0xe000085f, + 0x0b30: 0x40057420, 0x0b31: 0x4027ee20, + // Block 0x2d, offset 0xb40 + 0x0b41: 0xa000f202, 0x0b42: 0xa000f302, 0x0b43: 0xa000f402, + 0x0b45: 0x4041f620, 0x0b46: 0x4041f820, 0x0b47: 0x4041fa20, + 0x0b48: 0x4041fc20, 0x0b49: 0x4041fe20, 0x0b4a: 0x40420020, 0x0b4b: 0x40420220, + 0x0b4c: 0x40420620, 0x0b4f: 0x40420a20, + 0x0b50: 0x40420c20, 0x0b53: 0x40420e20, + 0x0b54: 0x40421020, 0x0b55: 0x40421220, 0x0b56: 0x40421420, 0x0b57: 0x40421620, + 0x0b58: 0x40421820, 0x0b59: 0x40421a20, 0x0b5a: 0x40421c20, 0x0b5b: 0x40421e20, + 0x0b5c: 0x40422020, 0x0b5d: 0x40422220, 0x0b5e: 0x40422420, 0x0b5f: 0x40422620, + 0x0b60: 0x40422820, 0x0b61: 0x40422a20, 0x0b62: 0x40422c20, 0x0b63: 0x40422e20, + 0x0b64: 0x40423020, 0x0b65: 0x40423220, 0x0b66: 0x40423420, 0x0b67: 0x40423620, + 0x0b68: 0x40423820, 0x0b6a: 0x40423a20, 0x0b6b: 0x40423c20, + 0x0b6c: 0x40423e20, 0x0b6d: 0x40424020, 0x0b6e: 0x40424220, 0x0b6f: 0x40424420, + 0x0b70: 0x40424820, 0x0b72: 0x40424a20, 0x0b73: 0x40424c20, + 0x0b75: 0x40424e20, 0x0b76: 0x40425220, 0x0b77: 0x40425420, + 0x0b78: 0x40425620, 0x0b79: 0x40425820, + 0x0b7c: 0xa070f102, 0x0b7d: 0x40425a20, 0x0b7e: 0x40425c20, 0x0b7f: 0x40425e20, + // Block 0x2e, offset 0xb80 + 0x0b80: 0x40426020, 0x0b81: 0x40426220, 0x0b82: 0x40426420, 0x0b83: 0x40426620, + 0x0b84: 0x40426820, 0x0b87: 0xc05d01e1, + 0x0b88: 0x40427020, 0x0b8b: 0x40427220, + 0x0b8c: 0x40427420, 0x0b8d: 0x8209213b, + 0x0b96: 0x40427820, 0x0b97: 0x40427a20, + 0x0b9c: 0xe000185d, 0x0b9d: 0xe0001860, 0x0b9f: 0x40424620, + 0x0ba0: 0x40420420, 0x0ba1: 0x40420820, 0x0ba2: 0x40426a20, 0x0ba3: 0x40426c20, + 0x0ba6: 0xe0000176, 0x0ba7: 0xe0000204, + 0x0ba8: 0xe000031f, 0x0ba9: 0xe00003f9, 0x0baa: 0xe00004d4, 0x0bab: 0xe000059e, + 0x0bac: 0xe0000669, 0x0bad: 0xe0000711, 0x0bae: 0xe00007bd, 0x0baf: 0xe0000862, + 0x0bb0: 0x40073c20, 0x0bb1: 0x40425020, 0x0bb2: 0x40283c20, 0x0bb3: 0x40283e20, + 0x0bb4: 0x40284020, 0x0bb5: 0x40284220, 0x0bb6: 0x40284420, 0x0bb7: 0x40284620, + // Block 0x2f, offset 0xbc0 + 0x0bc2: 0xa000f302, 0x0bc3: 0x40429620, + 0x0bc5: 0x40427e20, 0x0bc6: 0x40428020, 0x0bc7: 0x40428220, + 0x0bc8: 0x40428420, 0x0bc9: 0x40428620, 0x0bca: 0x40428820, + 0x0bce: 0x40428a20, 0x0bcf: 0x40428c20, + 0x0bd0: 0x40428e20, 0x0bd2: 0xc0610231, 0x0bd3: 0x40429220, + 0x0bd4: 0x40429420, 0x0bd5: 0x40429820, + 0x0bd9: 0x40429a20, 0x0bda: 0x40429c20, + 0x0bdc: 0x4042bc20, 0x0bde: 0x40429e20, 0x0bdf: 0x4042a020, + 0x0be3: 0x4042a220, + 0x0be4: 0x4042a420, + 0x0be8: 0x4042a620, 0x0be9: 0x4042ba20, 0x0bea: 0x4042a820, + 0x0bee: 0x4042aa20, 0x0bef: 0x4042ac20, + 0x0bf0: 0x4042ae20, 0x0bf1: 0x4042b820, 0x0bf2: 0x4042b020, 0x0bf3: 0x4042b620, + 0x0bf4: 0x4042b420, 0x0bf5: 0x4042b220, 0x0bf6: 0x4042be20, 0x0bf7: 0x4042c020, + 0x0bf8: 0x4042c220, 0x0bf9: 0x4042c420, + 0x0bfe: 0x4042c620, 0x0bff: 0x4042c820, + // Block 0x30, offset 0xc00 + 0x0c00: 0x4042ca20, 0x0c01: 0x4042cc20, 0x0c02: 0x4042ce20, + 0x0c06: 0xc0630261, 0x0c07: 0xc06602b1, + 0x0c08: 0x4042d420, 0x0c0a: 0x4042d620, 0x0c0b: 0x4042d820, + 0x0c0c: 0x4042da20, 0x0c0d: 0x8209216e, + 0x0c10: 0x40427c20, + 0x0c17: 0x4042de20, + 0x0c26: 0xe0000179, 0x0c27: 0xe0000207, + 0x0c28: 0xe0000322, 0x0c29: 0xe00003fc, 0x0c2a: 0xe00004d7, 0x0c2b: 0xe00005a1, + 0x0c2c: 0xe000066c, 0x0c2d: 0xe0000714, 0x0c2e: 0xe00007c0, 0x0c2f: 0xe0000865, + 0x0c30: 0x40285420, 0x0c31: 0x40285620, 0x0c32: 0x40285820, 0x0c33: 0x40073e20, + 0x0c34: 0x40074020, 0x0c35: 0x40074220, 0x0c36: 0x40074420, 0x0c37: 0x40074620, + 0x0c38: 0x40074820, 0x0c39: 0x4027f220, 0x0c3a: 0x40074a20, + // Block 0x31, offset 0xc40 + 0x0c41: 0xa000f202, 0x0c42: 0xa000f302, 0x0c43: 0xa000f402, + 0x0c45: 0x4042e020, 0x0c46: 0x4042e220, 0x0c47: 0x4042e420, + 0x0c48: 0x4042e620, 0x0c49: 0x4042e820, 0x0c4a: 0x4042ea20, 0x0c4b: 0x4042ec20, + 0x0c4c: 0x4042f020, 0x0c4e: 0x4042f420, 0x0c4f: 0x4042f620, + 0x0c50: 0x4042f820, 0x0c52: 0x4042fa20, 0x0c53: 0x4042fc20, + 0x0c54: 0x4042fe20, 0x0c55: 0x40430020, 0x0c56: 0x40430220, 0x0c57: 0x40430420, + 0x0c58: 0x40430620, 0x0c59: 0x40430820, 0x0c5a: 0x40430a20, 0x0c5b: 0x40430e20, + 0x0c5c: 0x40431020, 0x0c5d: 0x40431420, 0x0c5e: 0x40431620, 0x0c5f: 0x40431820, + 0x0c60: 0x40431a20, 0x0c61: 0x40431c20, 0x0c62: 0x40431e20, 0x0c63: 0x40432020, + 0x0c64: 0x40432220, 0x0c65: 0x40432420, 0x0c66: 0x40432620, 0x0c67: 0x40432820, + 0x0c68: 0x40432a20, 0x0c6a: 0x40432c20, 0x0c6b: 0x40432e20, + 0x0c6c: 0x40433020, 0x0c6d: 0x40433220, 0x0c6e: 0x40433420, 0x0c6f: 0x40433620, + 0x0c70: 0x40433820, 0x0c71: 0x40433a20, 0x0c72: 0x40433c20, 0x0c73: 0x40434820, + 0x0c75: 0x40433e20, 0x0c76: 0x40434020, 0x0c77: 0x40434220, + 0x0c78: 0x40434420, 0x0c79: 0x40434620, + 0x0c7d: 0x40434a20, 0x0c7e: 0x40434c20, 0x0c7f: 0x40434e20, + // Block 0x32, offset 0xc80 + 0x0c80: 0x40435020, 0x0c81: 0x40435220, 0x0c82: 0x40435420, 0x0c83: 0x40435620, + 0x0c84: 0x40435820, 0x0c86: 0xc06802e1, 0x0c87: 0x40436020, + 0x0c88: 0x40436220, 0x0c8a: 0x40436420, 0x0c8b: 0x40436620, + 0x0c8c: 0x40436820, 0x0c8d: 0x820921b5, + 0x0c95: 0x825421b6, 0x0c96: 0x825b21b7, + 0x0c98: 0x40430c20, 0x0c99: 0x40431220, + 0x0ca0: 0x4042ee20, 0x0ca1: 0x4042f220, 0x0ca2: 0x40435a20, 0x0ca3: 0x40435c20, + 0x0ca6: 0xe000017c, 0x0ca7: 0xe000020a, + 0x0ca8: 0xe0000325, 0x0ca9: 0xe00003ff, 0x0caa: 0xe00004da, 0x0cab: 0xe00005a4, + 0x0cac: 0xe000066f, 0x0cad: 0xe0000717, 0x0cae: 0xe00007c3, 0x0caf: 0xe0000868, + 0x0cb8: 0xe000017f, 0x0cb9: 0xe000020d, 0x0cba: 0xe0000328, 0x0cbb: 0xe0000402, + 0x0cbc: 0xe0000210, 0x0cbd: 0xe000032b, 0x0cbe: 0xe0000405, 0x0cbf: 0x40074c20, + // Block 0x33, offset 0xcc0 + 0x0cc2: 0xa000f302, 0x0cc3: 0xa000f402, + 0x0cc5: 0x40437020, 0x0cc6: 0x40437220, 0x0cc7: 0x40437420, + 0x0cc8: 0x40437620, 0x0cc9: 0x40437820, 0x0cca: 0x40437a20, 0x0ccb: 0x40437c20, + 0x0ccc: 0x40438020, 0x0cce: 0x40438420, 0x0ccf: 0x40438620, + 0x0cd0: 0x40438820, 0x0cd2: 0x40438a20, 0x0cd3: 0x40438c20, + 0x0cd4: 0x40438e20, 0x0cd5: 0x40439020, 0x0cd6: 0x40439220, 0x0cd7: 0x40439420, + 0x0cd8: 0x40439620, 0x0cd9: 0x40439820, 0x0cda: 0x40439a20, 0x0cdb: 0x40439c20, + 0x0cdc: 0x40439e20, 0x0cdd: 0x4043a020, 0x0cde: 0x4043a220, 0x0cdf: 0x4043a420, + 0x0ce0: 0x4043a620, 0x0ce1: 0x4043a820, 0x0ce2: 0x4043aa20, 0x0ce3: 0x4043ac20, + 0x0ce4: 0x4043ae20, 0x0ce5: 0x4043b020, 0x0ce6: 0x4043b220, 0x0ce7: 0x4043b420, + 0x0ce8: 0x4043b620, 0x0cea: 0x4043b820, 0x0ceb: 0x4043ba20, + 0x0cec: 0x4043bc20, 0x0ced: 0x4043be20, 0x0cee: 0x4043c020, 0x0cef: 0x4043c220, + 0x0cf0: 0x4043c420, 0x0cf1: 0x4043c620, 0x0cf2: 0x4043c820, 0x0cf3: 0x4043d420, + 0x0cf5: 0x4043ca20, 0x0cf6: 0x4043cc20, 0x0cf7: 0x4043ce20, + 0x0cf8: 0x4043d020, 0x0cf9: 0x4043d220, + 0x0cfc: 0xa070f102, 0x0cfd: 0x4043d820, 0x0cfe: 0x4043de20, 0x0cff: 0xc06a0311, + // Block 0x34, offset 0xd00 + 0x0d00: 0x4043e220, 0x0d01: 0x4043e420, 0x0d02: 0x4043e620, 0x0d03: 0x4043e820, + 0x0d04: 0x4043ea20, 0x0d06: 0xc06c0341, 0x0d07: 0x4043f220, + 0x0d08: 0x4043f420, 0x0d0a: 0xc0710311, 0x0d0b: 0x4043f820, + 0x0d0c: 0x4043fa20, 0x0d0d: 0x820921fe, + 0x0d15: 0x4043fe20, 0x0d16: 0x40440020, + 0x0d1e: 0x4043d620, + 0x0d20: 0x40437e20, 0x0d21: 0x40438220, 0x0d22: 0x4043ec20, 0x0d23: 0x4043ee20, + 0x0d26: 0xe0000182, 0x0d27: 0xe0000213, + 0x0d28: 0xe000032e, 0x0d29: 0xe0000408, 0x0d2a: 0xe00004dd, 0x0d2b: 0xe00005a7, + 0x0d2c: 0xe0000672, 0x0d2d: 0xe000071a, 0x0d2e: 0xe00007c6, 0x0d2f: 0xe000086b, + 0x0d31: 0x4043da20, 0x0d32: 0x4043dc20, + // Block 0x35, offset 0xd40 + 0x0d42: 0xa000f302, 0x0d43: 0xa000f402, + 0x0d45: 0x40440220, 0x0d46: 0x40440420, 0x0d47: 0x40440620, + 0x0d48: 0x40440820, 0x0d49: 0x40440a20, 0x0d4a: 0x40440c20, 0x0d4b: 0x40440e20, + 0x0d4c: 0x40441220, 0x0d4e: 0x40441620, 0x0d4f: 0x40441820, + 0x0d50: 0x40441a20, 0x0d52: 0x40441c20, 0x0d53: 0x40441e20, + 0x0d54: 0x40442020, 0x0d55: 0x40442220, 0x0d56: 0x40442420, 0x0d57: 0x40442620, + 0x0d58: 0x40442820, 0x0d59: 0x40442a20, 0x0d5a: 0x40442c20, 0x0d5b: 0x40442e20, + 0x0d5c: 0x40443020, 0x0d5d: 0x40443220, 0x0d5e: 0x40443420, 0x0d5f: 0x40443620, + 0x0d60: 0x40443820, 0x0d61: 0x40443a20, 0x0d62: 0x40443c20, 0x0d63: 0x40443e20, + 0x0d64: 0x40444020, 0x0d65: 0x40444220, 0x0d66: 0x40444420, 0x0d67: 0x40444620, + 0x0d68: 0x40444820, 0x0d69: 0x40444a20, 0x0d6a: 0x40444c20, 0x0d6b: 0x40444e20, + 0x0d6c: 0x40445020, 0x0d6d: 0x40445220, 0x0d6e: 0x40445420, 0x0d6f: 0x40445620, + 0x0d70: 0x40445820, 0x0d71: 0x40446a20, 0x0d72: 0x40445a20, 0x0d73: 0x40446620, + 0x0d74: 0x40446820, 0x0d75: 0x40445c20, 0x0d76: 0x40445e20, 0x0d77: 0x40446020, + 0x0d78: 0x40446220, 0x0d79: 0x40446420, 0x0d7a: 0x40446c20, + 0x0d7d: 0x40446e20, 0x0d7e: 0x40447020, 0x0d7f: 0x40447220, + // Block 0x36, offset 0xd80 + 0x0d80: 0x40447420, 0x0d81: 0x40447620, 0x0d82: 0x40447820, 0x0d83: 0x40447a20, + 0x0d84: 0x40447c20, 0x0d86: 0xc07303b1, 0x0d87: 0xc0760401, + 0x0d88: 0x40448620, 0x0d8a: 0x40448820, 0x0d8b: 0x40448a20, + 0x0d8c: 0x40448c20, 0x0d8d: 0x82092248, 0x0d8e: 0xe000186c, + 0x0d97: 0x40448e20, + 0x0da0: 0x40441020, 0x0da1: 0x40441420, 0x0da2: 0x40447e20, 0x0da3: 0x40448020, + 0x0da6: 0xe0000185, 0x0da7: 0xe0000216, + 0x0da8: 0xe0000331, 0x0da9: 0xe000040b, 0x0daa: 0xe00004e0, 0x0dab: 0xe00005aa, + 0x0dac: 0xe0000675, 0x0dad: 0xe000071d, 0x0dae: 0xe00007c9, 0x0daf: 0xe000086e, + 0x0db0: 0x40285a20, 0x0db1: 0x40285c20, 0x0db2: 0x40285e20, 0x0db3: 0x40286020, + 0x0db4: 0x40286220, 0x0db5: 0x40286420, + 0x0db9: 0x40074e20, 0x0dba: 0xe0001866, 0x0dbb: 0xe0001869, + 0x0dbc: 0xe000186f, 0x0dbd: 0xe0001872, 0x0dbe: 0xe0001875, 0x0dbf: 0xe0001863, + // Block 0x37, offset 0xdc0 + 0x0dc2: 0xa000f302, 0x0dc3: 0xa000f402, + 0x0dc5: 0x40449220, 0x0dc6: 0x40449420, 0x0dc7: 0x40449620, + 0x0dc8: 0x40449820, 0x0dc9: 0x40449a20, 0x0dca: 0x40449c20, 0x0dcb: 0x40449e20, + 0x0dcc: 0x4044a020, 0x0dcd: 0x4044a220, 0x0dce: 0x4044a420, 0x0dcf: 0x4044a620, + 0x0dd0: 0x4044a820, 0x0dd1: 0x4044aa20, 0x0dd2: 0x4044ac20, 0x0dd3: 0x4044ae20, + 0x0dd4: 0x4044b020, 0x0dd5: 0x4044b220, 0x0dd6: 0x4044b420, + 0x0dda: 0x4044b620, 0x0ddb: 0x4044b820, + 0x0ddc: 0x4044ba20, 0x0ddd: 0x4044bc20, 0x0dde: 0x4044be20, 0x0ddf: 0x4044c020, + 0x0de0: 0x4044c220, 0x0de1: 0x4044c420, 0x0de2: 0x4044c620, 0x0de3: 0x4044c820, + 0x0de4: 0x4044ca20, 0x0de5: 0x4044cc20, 0x0de6: 0x4044ce20, 0x0de7: 0x4044d020, + 0x0de8: 0x4044d220, 0x0de9: 0x4044d420, 0x0dea: 0x4044d620, 0x0deb: 0x4044d820, + 0x0dec: 0x4044da20, 0x0ded: 0x4044dc20, 0x0dee: 0x4044de20, 0x0def: 0x4044e020, + 0x0df0: 0x4044e220, 0x0df1: 0x4044e420, 0x0df3: 0x4044e620, + 0x0df4: 0x4044e820, 0x0df5: 0x4044ea20, 0x0df6: 0x4044ec20, 0x0df7: 0x4044ee20, + 0x0df8: 0x4044f020, 0x0df9: 0x4044f220, 0x0dfa: 0x4044f420, 0x0dfb: 0x4044f620, + 0x0dfd: 0x4044f820, + // Block 0x38, offset 0xe00 + 0x0e00: 0x4044fa20, 0x0e01: 0x4044fc20, 0x0e02: 0x4044fe20, 0x0e03: 0x40450020, + 0x0e04: 0x40450220, 0x0e05: 0x40450420, 0x0e06: 0x40450620, + 0x0e0a: 0x82092295, + 0x0e0f: 0x40450820, + 0x0e10: 0x40450a20, 0x0e11: 0x40450c20, 0x0e12: 0x40450e20, 0x0e13: 0x40451020, + 0x0e14: 0x40451220, 0x0e16: 0x40451420, + 0x0e18: 0x40451620, 0x0e19: 0xc0780431, 0x0e1a: 0x40452020, 0x0e1b: 0x40452220, + 0x0e1c: 0xc07d04b1, 0x0e1d: 0x40452620, 0x0e1e: 0x40452820, 0x0e1f: 0x40451a20, + 0x0e32: 0x40451820, 0x0e33: 0x40451c20, + 0x0e34: 0x40057620, + // Block 0x39, offset 0xe40 + 0x0e41: 0x40491020, 0x0e42: 0x40491220, 0x0e43: 0x40491420, + 0x0e44: 0x40491620, 0x0e45: 0x40491820, 0x0e46: 0x40491a20, 0x0e47: 0x40491c20, + 0x0e48: 0x40491e20, 0x0e49: 0x40492020, 0x0e4a: 0x40492220, 0x0e4b: 0x40492420, + 0x0e4c: 0x40492620, 0x0e4d: 0x40492820, 0x0e4e: 0x40492a20, 0x0e4f: 0x40492c20, + 0x0e50: 0x40492e20, 0x0e51: 0x40493020, 0x0e52: 0x40493220, 0x0e53: 0x40493420, + 0x0e54: 0x40493620, 0x0e55: 0x40493820, 0x0e56: 0x40493a20, 0x0e57: 0x40493c20, + 0x0e58: 0x40493e20, 0x0e59: 0x40494020, 0x0e5a: 0x40494220, 0x0e5b: 0x40494420, + 0x0e5c: 0x40494620, 0x0e5d: 0x40494820, 0x0e5e: 0x40494a20, 0x0e5f: 0x40494c20, + 0x0e60: 0x40494e20, 0x0e61: 0x40495020, 0x0e62: 0x40495220, 0x0e63: 0x40495420, + 0x0e64: 0x40495620, 0x0e65: 0x40495820, 0x0e66: 0x40495a20, 0x0e67: 0x40495c20, + 0x0e68: 0x40495e20, 0x0e69: 0x40496020, 0x0e6a: 0x40496220, 0x0e6b: 0x40496420, + 0x0e6c: 0x40496620, 0x0e6d: 0x40496820, 0x0e6e: 0x40496a20, 0x0e6f: 0x40496c20, + 0x0e70: 0x40496e20, 0x0e71: 0x40497020, 0x0e72: 0x40497220, 0x0e73: 0x40497420, + 0x0e74: 0x40497620, 0x0e75: 0x40497820, 0x0e76: 0x40497a20, 0x0e77: 0x40497c20, + 0x0e78: 0x826724bf, 0x0e79: 0x826724c0, 0x0e7a: 0x820924c1, + 0x0e7f: 0x4027f420, + // Block 0x3a, offset 0xe80 + 0x0e80: 0xc07f04e1, 0x0e81: 0xc0ae04e1, 0x0e82: 0xc0dd04e1, 0x0e83: 0xc10c04e1, + 0x0e84: 0xc13b04e1, 0x0e85: 0x40498e20, 0x0e86: 0x4027b820, 0x0e87: 0xa000ff02, + 0x0e88: 0xa6b10002, 0x0e89: 0xa6b10102, 0x0e8a: 0xa6b10202, 0x0e8b: 0xa6b10302, + 0x0e8c: 0xa0010402, 0x0e8d: 0xc16a0511, 0x0e8e: 0xa000fe02, 0x0e8f: 0x40057820, + 0x0e90: 0xe000019a, 0x0e91: 0xe000022e, 0x0e92: 0xe0000346, 0x0e93: 0xe0000420, + 0x0e94: 0xe00004f5, 0x0e95: 0xe00005bf, 0x0e96: 0xe000068a, 0x0e97: 0xe0000732, + 0x0e98: 0xe00007de, 0x0e99: 0xe0000883, 0x0e9a: 0x40057a20, 0x0e9b: 0x40057c20, + // Block 0x3b, offset 0xec0 + 0x0ec1: 0x40499220, 0x0ec2: 0x40499420, + 0x0ec4: 0x40499620, 0x0ec7: 0x40499820, + 0x0ec8: 0x40499a20, 0x0eca: 0x40499e20, + 0x0ecd: 0x4049a220, + 0x0ed4: 0x4049a420, 0x0ed5: 0x4049a620, 0x0ed6: 0x4049a820, 0x0ed7: 0x4049aa20, + 0x0ed9: 0x4049ac20, 0x0eda: 0x4049ae20, 0x0edb: 0x4049b020, + 0x0edc: 0x4049b220, 0x0edd: 0x4049b420, 0x0ede: 0x4049b620, 0x0edf: 0x4049b820, + 0x0ee1: 0x4049ba20, 0x0ee2: 0x4049bc20, 0x0ee3: 0x4049be20, + 0x0ee5: 0x4049c020, 0x0ee7: 0x4049c220, + 0x0eea: 0x40499c20, 0x0eeb: 0x4049c420, + 0x0eed: 0x4049c620, 0x0eee: 0x4049c820, 0x0eef: 0x4049ca20, + 0x0ef0: 0x4049cc20, 0x0ef1: 0x4049ce20, 0x0ef2: 0x4049d020, 0x0ef3: 0x4049d220, + 0x0ef4: 0x4049d420, 0x0ef5: 0x4049d620, 0x0ef6: 0x4049d820, 0x0ef7: 0x4049da20, + 0x0ef8: 0x827624ee, 0x0ef9: 0x827624ef, 0x0efb: 0x4049e020, + 0x0efc: 0x4049e220, 0x0efd: 0x4049e420, + // Block 0x3c, offset 0xf00 + 0x0f00: 0xc16c0541, 0x0f01: 0xc18c0541, 0x0f02: 0xc1ac0541, 0x0f03: 0xc1cc0541, + 0x0f04: 0xc1ec0541, 0x0f06: 0x4027ba20, + 0x0f08: 0xa7a10602, 0x0f09: 0xa7a10702, 0x0f0a: 0xa7a10802, 0x0f0b: 0xa7a10902, + 0x0f0c: 0xa0010a02, 0x0f0d: 0xc20c0641, + 0x0f10: 0xe000019d, 0x0f11: 0xe0000231, 0x0f12: 0xe0000349, 0x0f13: 0xe0000423, + 0x0f14: 0xe00004f8, 0x0f15: 0xe00005c2, 0x0f16: 0xe000068d, 0x0f17: 0xe0000735, + 0x0f18: 0xe00007e1, 0x0f19: 0xe0000886, + 0x0f1c: 0xf0000404, 0x0f1d: 0xf0000404, 0x0f1e: 0x40499020, 0x0f1f: 0x4049a020, + // Block 0x3d, offset 0xf40 + 0x0f40: 0xe000201a, 0x0f41: 0x40075e20, 0x0f42: 0x40076020, 0x0f43: 0x40076220, + 0x0f44: 0x40058220, 0x0f45: 0x40058420, 0x0f46: 0x40058620, 0x0f47: 0x40058820, + 0x0f48: 0x40058a20, 0x0f49: 0x40058c20, 0x0f4a: 0x40058e20, 0x0f4b: 0x40059420, + 0x0f4c: 0x0005949b, 0x0f4d: 0x40059620, 0x0f4e: 0x40059820, 0x0f4f: 0x40059a20, + 0x0f50: 0x40059c20, 0x0f51: 0x40059e20, 0x0f52: 0x4005a020, 0x0f53: 0x40076420, + 0x0f54: 0x4002aa20, 0x0f55: 0x40076620, 0x0f56: 0x40076820, 0x0f57: 0x40076a20, + 0x0f58: 0xadc00000, 0x0f59: 0xadc00000, 0x0f5a: 0x40076c20, 0x0f5b: 0x40076e20, + 0x0f5c: 0x40077020, 0x0f5d: 0x40077220, 0x0f5e: 0x40077420, 0x0f5f: 0x40077620, + 0x0f60: 0xe00001a0, 0x0f61: 0xe0000234, 0x0f62: 0xe000034c, 0x0f63: 0xe0000426, + 0x0f64: 0xe00004fb, 0x0f65: 0xe00005c5, 0x0f66: 0xe0000690, 0x0f67: 0xe0000738, + 0x0f68: 0xe00007e4, 0x0f69: 0xe0000889, 0x0f6a: 0xe0000237, 0x0f6b: 0xe000034f, + 0x0f6c: 0xe0000429, 0x0f6d: 0xe00004fe, 0x0f6e: 0xe00005c8, 0x0f6f: 0xe0000693, + 0x0f70: 0xe000073b, 0x0f71: 0xe00007e7, 0x0f72: 0xe000088c, 0x0f73: 0xe00001a3, + 0x0f74: 0x40077820, 0x0f75: 0xadc00000, 0x0f76: 0x40077a20, 0x0f77: 0xadc00000, + 0x0f78: 0x40077c20, 0x0f79: 0xad810e02, 0x0f7a: 0x40040020, 0x0f7b: 0x40040220, + 0x0f7c: 0x40040420, 0x0f7d: 0x40040620, 0x0f7e: 0xa0000000, 0x0f7f: 0xa0000000, + // Block 0x3e, offset 0xf80 + 0x0f80: 0x404a7620, 0x0f81: 0x404a7c20, 0x0f82: 0x404a8020, 0x0f83: 0xe0001fe4, + 0x0f84: 0x404a8420, 0x0f85: 0x404a8820, 0x0f86: 0x404a8c20, 0x0f87: 0x404a9020, + 0x0f89: 0x404a9420, 0x0f8a: 0x404a9820, 0x0f8b: 0x404a9c20, + 0x0f8c: 0x404aa020, 0x0f8d: 0xe0001fea, 0x0f8e: 0x404aa420, 0x0f8f: 0x404aa820, + 0x0f90: 0x404aac20, 0x0f91: 0x404ab020, 0x0f92: 0xe0001ff0, 0x0f93: 0x404ab420, + 0x0f94: 0x404ab820, 0x0f95: 0x404abc20, 0x0f96: 0x404ac020, 0x0f97: 0xe0001ff6, + 0x0f98: 0x404ac420, 0x0f99: 0x404ac820, 0x0f9a: 0x404acc20, 0x0f9b: 0x404ad020, + 0x0f9c: 0xe0001ffc, 0x0f9d: 0x404ad420, 0x0f9e: 0x404ad820, 0x0f9f: 0x404adc20, + 0x0fa0: 0x404ae020, 0x0fa1: 0x404ae420, 0x0fa2: 0x404ae820, 0x0fa3: 0x404aee20, + 0x0fa4: 0x404af220, 0x0fa5: 0x404af620, 0x0fa6: 0x404afa20, 0x0fa7: 0x404afe20, + 0x0fa8: 0x404b0220, 0x0fa9: 0xe0001fde, 0x0faa: 0xe0002008, 0x0fab: 0x404a7a20, + 0x0fac: 0x404aec20, + 0x0fb1: 0xc30f0751, 0x0fb2: 0x8282258c, 0x0fb3: 0x8281258d, + 0x0fb4: 0x82842590, 0x0fb5: 0x82812591, 0x0fb6: 0x404b2420, 0x0fb7: 0x404b2620, + 0x0fb8: 0x404b2820, 0x0fb9: 0x404b2a20, 0x0fba: 0x82822596, 0x0fbb: 0x82822597, + 0x0fbc: 0x82822598, 0x0fbd: 0x82822599, 0x0fbe: 0xa000f302, 0x0fbf: 0xa000f402, + // Block 0x3f, offset 0xfc0 + 0x0fc0: 0x8282258e, 0x0fc1: 0x8281258f, 0x0fc2: 0xae600000, 0x0fc3: 0xae600000, + 0x0fc4: 0x8209259a, 0x0fc5: 0x4005a220, 0x0fc6: 0xae600000, 0x0fc7: 0xae600000, + 0x0fc8: 0x404b0620, 0x0fc9: 0x404b0a20, 0x0fca: 0x404b1220, 0x0fcb: 0x404b1420, + 0x0fcc: 0x404b0e20, 0x0fcd: 0x404b0820, 0x0fce: 0x404b0c20, 0x0fcf: 0x404b1020, + 0x0fd0: 0x404a7820, 0x0fd1: 0x404a7e20, 0x0fd2: 0x404a8220, 0x0fd3: 0xe0001fe7, + 0x0fd4: 0x404a8620, 0x0fd5: 0x404a8a20, 0x0fd6: 0x404a8e20, 0x0fd7: 0x404a9220, + 0x0fd9: 0x404a9620, 0x0fda: 0x404a9a20, 0x0fdb: 0x404a9e20, + 0x0fdc: 0x404aa220, 0x0fdd: 0xe0001fed, 0x0fde: 0x404aa620, 0x0fdf: 0x404aaa20, + 0x0fe0: 0x404aae20, 0x0fe1: 0x404ab220, 0x0fe2: 0xe0001ff3, 0x0fe3: 0x404ab620, + 0x0fe4: 0x404aba20, 0x0fe5: 0x404abe20, 0x0fe6: 0x404ac220, 0x0fe7: 0xe0001ff9, + 0x0fe8: 0x404ac620, 0x0fe9: 0x404aca20, 0x0fea: 0x404ace20, 0x0feb: 0x404ad220, + 0x0fec: 0xe0001fff, 0x0fed: 0x404ad620, 0x0fee: 0x404ada20, 0x0fef: 0x404ade20, + 0x0ff0: 0x404ae220, 0x0ff1: 0x404ae620, 0x0ff2: 0xc30306a1, 0x0ff3: 0xc30906a1, + 0x0ff4: 0x404af420, 0x0ff5: 0x404af820, 0x0ff6: 0x404afc20, 0x0ff7: 0x404b0020, + 0x0ff8: 0x404b0420, 0x0ff9: 0xe0001fe1, 0x0ffa: 0xe0002002, 0x0ffb: 0xe0002005, + 0x0ffc: 0xe000200b, 0x0ffe: 0x40077e20, 0x0fff: 0x40078020, + // Block 0x40, offset 0x1000 + 0x1000: 0x40078220, 0x1001: 0x40078420, 0x1002: 0x40078620, 0x1003: 0x40078820, + 0x1004: 0x40078a20, 0x1005: 0x40078c20, 0x1006: 0xadc00000, 0x1007: 0x40078e20, + 0x1008: 0x40079020, 0x1009: 0x40079220, 0x100a: 0x40079420, 0x100b: 0x40079620, + 0x100c: 0x40079820, 0x100e: 0x40079a20, 0x100f: 0x40079c20, + 0x1010: 0x40059020, 0x1011: 0x40059220, 0x1012: 0x4005a420, 0x1013: 0x4005a620, + 0x1014: 0x4005a820, 0x1015: 0x40079e20, 0x1016: 0x4007a020, 0x1017: 0x4007a220, + 0x1018: 0x4007a420, 0x1019: 0x4005aa20, 0x101a: 0x4005ac20, + // Block 0x41, offset 0x1040 + 0x1040: 0x404e1420, 0x1041: 0x404e1820, 0x1042: 0x404e1c20, 0x1043: 0x404e2220, + 0x1044: 0x404e2420, 0x1045: 0x404e2820, 0x1046: 0x404e2e20, 0x1047: 0x404e3220, + 0x1048: 0x404e3a20, 0x1049: 0x404e4220, 0x104a: 0x404e4820, 0x104b: 0x404e4a20, + 0x104c: 0x404e4e20, 0x104d: 0x404e5220, 0x104e: 0x404e5620, 0x104f: 0x404e5a20, + 0x1050: 0x404e5e20, 0x1051: 0x404e6020, 0x1052: 0x404e6220, 0x1053: 0x404e6620, + 0x1054: 0x404e6a20, 0x1055: 0x404e7220, 0x1056: 0x404e7420, 0x1057: 0x404e7e20, + 0x1058: 0x404e8220, 0x1059: 0x404e8420, 0x105a: 0x404e8820, 0x105b: 0x404e8c20, + 0x105c: 0x404e9420, 0x105d: 0x404e9820, 0x105e: 0x404ea620, 0x105f: 0x404eaa20, + 0x1060: 0x404eb620, 0x1061: 0x404ec220, 0x1062: 0x404ec420, 0x1063: 0x404ec620, + 0x1064: 0x404ec820, 0x1065: 0xc31307b1, 0x1066: 0x404ecc20, 0x1067: 0x404ed620, + 0x1068: 0x404ed820, 0x1069: 0x404eda20, 0x106a: 0x404edc20, 0x106b: 0x004ede84, + 0x106c: 0x404ede20, 0x106d: 0x404ee620, 0x106e: 0x404eea20, 0x106f: 0x404eee20, + 0x1070: 0x404ef420, 0x1071: 0x404efe20, 0x1072: 0x404f0620, 0x1073: 0x404eec20, + 0x1074: 0x404f0a20, 0x1075: 0x404f0220, 0x1076: 0xa000f302, 0x1077: 0xa0711202, + 0x1078: 0xa000f402, 0x1079: 0x8209278a, 0x107a: 0x8209278b, 0x107b: 0x404e8a20, + 0x107c: 0x404e9220, 0x107d: 0x404e9a20, 0x107e: 0x404eb020, 0x107f: 0xe000201e, + // Block 0x42, offset 0x1080 + 0x1080: 0xe00001ac, 0x1081: 0xe0000240, 0x1082: 0xe0000358, 0x1083: 0xe0000432, + 0x1084: 0xe0000507, 0x1085: 0xe00005d1, 0x1086: 0xe000069c, 0x1087: 0xe0000744, + 0x1088: 0xe00007f0, 0x1089: 0xe0000895, 0x108a: 0x40032220, 0x108b: 0x40032420, + 0x108c: 0x4005b420, 0x108d: 0x4005b620, 0x108e: 0x4005b820, 0x108f: 0x4005ba20, + 0x1090: 0x404ea020, 0x1091: 0x404ea220, 0x1092: 0x404ece20, 0x1093: 0x404ed020, + 0x1094: 0x404ed220, 0x1095: 0x404ed420, 0x1096: 0x404ef620, 0x1097: 0x404ef820, + 0x1098: 0x404efa20, 0x1099: 0x404efc20, 0x109a: 0x404e2620, 0x109b: 0x404e3c20, + 0x109c: 0x404eb820, 0x109d: 0x404eba20, 0x109e: 0x404e7020, 0x109f: 0x404e8620, + 0x10a0: 0x404e9620, 0x10a1: 0x404e4020, 0x10a2: 0x404f0c20, 0x10a3: 0x404f1820, + 0x10a4: 0x404f1a20, 0x10a5: 0x404ea420, 0x10a6: 0x404ec020, 0x10a7: 0x404f0e20, + 0x10a8: 0x404f1020, 0x10a9: 0x404f1c20, 0x10aa: 0x404f1e20, 0x10ab: 0x404f2020, + 0x10ac: 0x404f2220, 0x10ad: 0x404f2420, 0x10ae: 0x404e5c20, 0x10af: 0x404ebc20, + 0x10b0: 0x404ebe20, 0x10b1: 0x404ee820, 0x10b2: 0x404ee220, 0x10b3: 0x404ef020, + 0x10b4: 0x404ef220, 0x10b5: 0x404e1620, 0x10b6: 0x404e1a20, 0x10b7: 0x404e1e20, + 0x10b8: 0x404e2a20, 0x10b9: 0x404e3620, 0x10ba: 0x404e4420, 0x10bb: 0x404e6420, + 0x10bc: 0x404e6c20, 0x10bd: 0x404e7620, 0x10be: 0x404e7820, 0x10bf: 0x404e8020, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x404e9e20, 0x10c1: 0x404eac20, 0x10c2: 0x404e9c20, 0x10c3: 0x404ee020, + 0x10c4: 0x404f0020, 0x10c5: 0x404f0420, 0x10c6: 0x404f1220, 0x10c7: 0x404f2620, + 0x10c8: 0x404f2a20, 0x10c9: 0x404f2e20, 0x10ca: 0x404f3020, 0x10cb: 0x404f2820, + 0x10cc: 0x404f2c20, 0x10cd: 0xadc11302, 0x10ce: 0x404e7c20, 0x10cf: 0x404f3220, + 0x10d0: 0xe00001af, 0x10d1: 0xe0000243, 0x10d2: 0xe000035b, 0x10d3: 0xe0000435, + 0x10d4: 0xe000050a, 0x10d5: 0xe00005d4, 0x10d6: 0xe000069f, 0x10d7: 0xe0000747, + 0x10d8: 0xe00007f3, 0x10d9: 0xe0000898, 0x10da: 0x404f3420, 0x10db: 0x404f3620, + 0x10dc: 0x404ee420, 0x10dd: 0x404f0820, 0x10de: 0x4007a820, 0x10df: 0x4007aa20, + 0x10e0: 0x00379888, 0x10e1: 0x00379c88, 0x10e2: 0x0037a088, 0x10e3: 0x0037a488, + 0x10e4: 0x0037a888, 0x10e5: 0x0037ac88, 0x10e6: 0x0037b088, 0x10e7: 0x0037b888, + 0x10e8: 0x0037bc88, 0x10e9: 0x0037c088, 0x10ea: 0x0037c488, 0x10eb: 0x0037c888, + 0x10ec: 0x0037cc88, 0x10ed: 0x0037d488, 0x10ee: 0x0037d888, 0x10ef: 0x0037dc88, + 0x10f0: 0x0037e088, 0x10f1: 0x0037e488, 0x10f2: 0x0037e888, 0x10f3: 0x0037f088, + 0x10f4: 0x0037f488, 0x10f5: 0x0037f888, 0x10f6: 0x0037fc88, 0x10f7: 0x00380088, + 0x10f8: 0x00380488, 0x10f9: 0x00380888, 0x10fa: 0x00380c88, 0x10fb: 0x00381088, + 0x10fc: 0x00381488, 0x10fd: 0x00381888, 0x10fe: 0x00381c88, 0x10ff: 0x00382488, + // Block 0x44, offset 0x1100 + 0x1100: 0x00382888, 0x1101: 0x0037b488, 0x1102: 0x0037d088, 0x1103: 0x0037ec88, + 0x1104: 0x00382088, 0x1105: 0x00382c88, 0x1107: 0x00383288, + 0x110d: 0x00383c88, + 0x1110: 0x40379620, 0x1111: 0x40379a20, 0x1112: 0x40379e20, 0x1113: 0x4037a220, + 0x1114: 0x4037a620, 0x1115: 0x4037aa20, 0x1116: 0x4037ae20, 0x1117: 0x4037b620, + 0x1118: 0x4037ba20, 0x1119: 0x4037be20, 0x111a: 0x4037c220, 0x111b: 0x4037c620, + 0x111c: 0x4037ca20, 0x111d: 0x4037d220, 0x111e: 0x4037d620, 0x111f: 0x4037da20, + 0x1120: 0x4037de20, 0x1121: 0x4037e220, 0x1122: 0x4037e620, 0x1123: 0x4037ee20, + 0x1124: 0x4037f220, 0x1125: 0x4037f620, 0x1126: 0x4037fa20, 0x1127: 0x4037fe20, + 0x1128: 0x40380220, 0x1129: 0x40380620, 0x112a: 0x40380a20, 0x112b: 0x40380e20, + 0x112c: 0x40381220, 0x112d: 0x40381620, 0x112e: 0x40381a20, 0x112f: 0x40382220, + 0x1130: 0x40382620, 0x1131: 0x4037b220, 0x1132: 0x4037ce20, 0x1133: 0x4037ea20, + 0x1134: 0x40381e20, 0x1135: 0x40382a20, 0x1136: 0x40382e20, 0x1137: 0x40383020, + 0x1138: 0x40383420, 0x1139: 0x40383620, 0x113a: 0x40383820, 0x113b: 0x40036020, + 0x113c: 0x0037ca94, 0x113d: 0x40383a20, 0x113e: 0x40383e20, 0x113f: 0x40384020, + // Block 0x45, offset 0x1140 + 0x1140: 0x4062ac20, 0x1141: 0x4062ae20, 0x1142: 0x4062b020, 0x1143: 0x4062b220, + 0x1144: 0x4062b420, 0x1145: 0x4062b620, 0x1146: 0x4062b820, 0x1147: 0x4062ba20, + 0x1148: 0x4062bc20, 0x1149: 0x4062be20, 0x114a: 0x4062c020, 0x114b: 0x4062c220, + 0x114c: 0x4062c420, 0x114d: 0x4062c620, 0x114e: 0x4062c820, 0x114f: 0x4062ca20, + 0x1150: 0x4062cc20, 0x1151: 0x4062ce20, 0x1152: 0x4062d020, 0x1153: 0x4062d220, + 0x1154: 0x4062d420, 0x1155: 0x4062d620, 0x1156: 0x4062d820, 0x1157: 0x4062da20, + 0x1158: 0x4062dc20, 0x1159: 0x4062de20, 0x115a: 0x4062e020, 0x115b: 0x4062e220, + 0x115c: 0x4062e420, 0x115d: 0x4062e620, 0x115e: 0x4062e820, 0x115f: 0x4062ea20, + 0x1160: 0x4062ec20, 0x1161: 0x4062ee20, 0x1162: 0x4062f020, 0x1163: 0x4062f220, + 0x1164: 0x4062f420, 0x1165: 0x4062f620, 0x1166: 0x4062f820, 0x1167: 0x4062fa20, + 0x1168: 0x4062fc20, 0x1169: 0x4062fe20, 0x116a: 0x40630020, 0x116b: 0x40630220, + 0x116c: 0x40630420, 0x116d: 0x40630620, 0x116e: 0x40630820, 0x116f: 0x40630a20, + 0x1170: 0x40630c20, 0x1171: 0x40630e20, 0x1172: 0x40631020, 0x1173: 0x40631220, + 0x1174: 0x40631420, 0x1175: 0x40631620, 0x1176: 0x40631820, 0x1177: 0x40631a20, + 0x1178: 0x40631c20, 0x1179: 0x40631e20, 0x117a: 0x40632020, 0x117b: 0x40632220, + 0x117c: 0x40632420, 0x117d: 0x40632620, 0x117e: 0x40632820, 0x117f: 0x40632a20, + // Block 0x46, offset 0x1180 + 0x1180: 0x40632c20, 0x1181: 0x40632e20, 0x1182: 0x40633020, 0x1183: 0x40633220, + 0x1184: 0x40633420, 0x1185: 0x40633620, 0x1186: 0x40633820, 0x1187: 0x40633a20, + 0x1188: 0x40633c20, 0x1189: 0x40633e20, 0x118a: 0x40634020, 0x118b: 0x40634220, + 0x118c: 0x40634420, 0x118d: 0x40634620, 0x118e: 0x40634820, 0x118f: 0x40634a20, + 0x1190: 0x40634c20, 0x1191: 0x40634e20, 0x1192: 0x40635020, 0x1193: 0x40635220, + 0x1194: 0x40635420, 0x1195: 0x40635620, 0x1196: 0x40635820, 0x1197: 0x40635a20, + 0x1198: 0x40635c20, 0x1199: 0x40635e20, 0x119a: 0x40636020, 0x119b: 0x40636220, + 0x119c: 0x40636420, 0x119d: 0x40636620, 0x119e: 0x40636820, 0x119f: 0x4063a420, + 0x11a0: 0x4063a620, 0x11a1: 0x4063a820, 0x11a2: 0x4063aa20, 0x11a3: 0x4063ac20, + 0x11a4: 0x4063ae20, 0x11a5: 0x4063b020, 0x11a6: 0x4063b220, 0x11a7: 0x4063b420, + 0x11a8: 0x4063b620, 0x11a9: 0x4063b820, 0x11aa: 0x4063ba20, 0x11ab: 0x4063bc20, + 0x11ac: 0x4063be20, 0x11ad: 0x4063c020, 0x11ae: 0x4063c220, 0x11af: 0x4063c420, + 0x11b0: 0x4063c620, 0x11b1: 0x4063c820, 0x11b2: 0x4063ca20, 0x11b3: 0x4063cc20, + 0x11b4: 0x4063ce20, 0x11b5: 0x4063d020, 0x11b6: 0x4063d220, 0x11b7: 0x4063d420, + 0x11b8: 0x4063d620, 0x11b9: 0x4063d820, 0x11ba: 0x4063da20, 0x11bb: 0x4063dc20, + 0x11bc: 0x4063de20, 0x11bd: 0x4063e020, 0x11be: 0x4063e220, 0x11bf: 0x4063e420, + // Block 0x47, offset 0x11c0 + 0x11c0: 0x4063e620, 0x11c1: 0x4063e820, 0x11c2: 0x4063ea20, 0x11c3: 0x4063ec20, + 0x11c4: 0x4063ee20, 0x11c5: 0x4063f020, 0x11c6: 0x4063f220, 0x11c7: 0x4063f420, + 0x11c8: 0x4063f620, 0x11c9: 0x4063f820, 0x11ca: 0x4063fa20, 0x11cb: 0x4063fc20, + 0x11cc: 0x4063fe20, 0x11cd: 0x40640020, 0x11ce: 0x40640220, 0x11cf: 0x40640420, + 0x11d0: 0x40640620, 0x11d1: 0x40640820, 0x11d2: 0x40640a20, 0x11d3: 0x40640c20, + 0x11d4: 0x40640e20, 0x11d5: 0x40641020, 0x11d6: 0x40641220, 0x11d7: 0x40641420, + 0x11d8: 0x40641620, 0x11d9: 0x40641820, 0x11da: 0x40641a20, 0x11db: 0x40641c20, + 0x11dc: 0x40641e20, 0x11dd: 0x40642020, 0x11de: 0x40642220, 0x11df: 0x40642420, + 0x11e0: 0x40642620, 0x11e1: 0x40642820, 0x11e2: 0x40642a20, 0x11e3: 0x40642c20, + 0x11e4: 0x40642e20, 0x11e5: 0x40643020, 0x11e6: 0x40643220, 0x11e7: 0x40643420, + 0x11e8: 0x40646420, 0x11e9: 0x40646620, 0x11ea: 0x40646820, 0x11eb: 0x40646a20, + 0x11ec: 0x40646c20, 0x11ed: 0x40646e20, 0x11ee: 0x40647020, 0x11ef: 0x40647220, + 0x11f0: 0x40647420, 0x11f1: 0x40647620, 0x11f2: 0x40647820, 0x11f3: 0x40647a20, + 0x11f4: 0x40647c20, 0x11f5: 0x40647e20, 0x11f6: 0x40648020, 0x11f7: 0x40648220, + 0x11f8: 0x40648420, 0x11f9: 0x40648620, 0x11fa: 0x40648820, 0x11fb: 0x40648a20, + 0x11fc: 0x40648c20, 0x11fd: 0x40648e20, 0x11fe: 0x40649020, 0x11ff: 0x40649220, + // Block 0x48, offset 0x1200 + 0x1200: 0x40649420, 0x1201: 0x40649620, 0x1202: 0x40649820, 0x1203: 0x40649a20, + 0x1204: 0x40649c20, 0x1205: 0x40649e20, 0x1206: 0x4064a020, 0x1207: 0x4064a220, + 0x1208: 0x4064a420, 0x1209: 0x4064a620, 0x120a: 0x4064a820, 0x120b: 0x4064aa20, + 0x120c: 0x4064ac20, 0x120d: 0x4064ae20, 0x120e: 0x4064b020, 0x120f: 0x4064b220, + 0x1210: 0x4064b420, 0x1211: 0x4064b620, 0x1212: 0x4064b820, 0x1213: 0x4064ba20, + 0x1214: 0x4064bc20, 0x1215: 0x4064be20, 0x1216: 0x4064c020, 0x1217: 0x4064c220, + 0x1218: 0x4064c420, 0x1219: 0x4064c620, 0x121a: 0x4064c820, 0x121b: 0x4064ca20, + 0x121c: 0x4064cc20, 0x121d: 0x4064ce20, 0x121e: 0x4064d020, 0x121f: 0x4064d220, + 0x1220: 0x4064d420, 0x1221: 0x4064d620, 0x1222: 0x4064d820, 0x1223: 0x4064da20, + 0x1224: 0x4064dc20, 0x1225: 0x4064de20, 0x1226: 0x4064e020, 0x1227: 0x4064e220, + 0x1228: 0x4064e420, 0x1229: 0x4064e620, 0x122a: 0x4064e820, 0x122b: 0x4064ea20, + 0x122c: 0x4064ec20, 0x122d: 0x4064ee20, 0x122e: 0x4064f020, 0x122f: 0x4064f220, + 0x1230: 0x4064f420, 0x1231: 0x4064f620, 0x1232: 0x4064f820, 0x1233: 0x4064fa20, + 0x1234: 0x4064fc20, 0x1235: 0x4064fe20, 0x1236: 0x40650020, 0x1237: 0x40650220, + 0x1238: 0x40650420, 0x1239: 0x40650620, 0x123a: 0x40650820, 0x123b: 0x40650a20, + 0x123c: 0x40650c20, 0x123d: 0x40650e20, 0x123e: 0x40651020, 0x123f: 0x40651220, + // Block 0x49, offset 0x1240 + 0x1240: 0x403c2e20, 0x1241: 0x403c3020, 0x1242: 0x403c3220, 0x1243: 0x403c3420, + 0x1244: 0x403c3620, 0x1245: 0x403c3820, 0x1246: 0x403c3a20, 0x1247: 0x403c3c20, + 0x1248: 0x403c3e20, 0x1249: 0x403c4020, 0x124a: 0x403c4220, 0x124b: 0x403c4420, + 0x124c: 0x403c4620, 0x124d: 0x403c4820, 0x124e: 0x403c4a20, 0x124f: 0x403c4c20, + 0x1250: 0x403c5020, 0x1251: 0x403c5220, 0x1252: 0x403c5420, 0x1253: 0x403c5620, + 0x1254: 0x403c5820, 0x1255: 0x403c5a20, 0x1256: 0x403c5c20, 0x1257: 0x403c5e20, + 0x1258: 0x403c6020, 0x1259: 0x403c6220, 0x125a: 0x403c6420, 0x125b: 0x403c6620, + 0x125c: 0x403c6820, 0x125d: 0x403c6a20, 0x125e: 0x403c6c20, 0x125f: 0x403c6e20, + 0x1260: 0x403c7a20, 0x1261: 0x403c7c20, 0x1262: 0x403c7e20, 0x1263: 0x403c8020, + 0x1264: 0x403c8220, 0x1265: 0x403c8420, 0x1266: 0x403c8620, 0x1267: 0x403c8820, + 0x1268: 0x403c8a20, 0x1269: 0x403c8c20, 0x126a: 0x403c8e20, 0x126b: 0x403c9020, + 0x126c: 0x403c9220, 0x126d: 0x403c9420, 0x126e: 0x403c9620, 0x126f: 0x403c9820, + 0x1270: 0x403c9c20, 0x1271: 0x403c9e20, 0x1272: 0x403ca020, 0x1273: 0x403ca220, + 0x1274: 0x403ca420, 0x1275: 0x403ca620, 0x1276: 0x403ca820, 0x1277: 0x403caa20, + 0x1278: 0x403cba20, 0x1279: 0x403cbc20, 0x127a: 0x403cbe20, 0x127b: 0x403cc020, + 0x127c: 0x403cc220, 0x127d: 0x403cc420, 0x127e: 0x403cc620, 0x127f: 0x403cc820, + // Block 0x4a, offset 0x1280 + 0x1280: 0x403ccc20, 0x1281: 0x403cce20, 0x1282: 0x403cd020, 0x1283: 0x403cd220, + 0x1284: 0x403cd420, 0x1285: 0x403cd620, 0x1286: 0x403cd820, 0x1287: 0x403cda20, + 0x1288: 0x403cdc20, 0x128a: 0x403cde20, 0x128b: 0x403ce020, + 0x128c: 0x403ce220, 0x128d: 0x403ce420, + 0x1290: 0x403ce620, 0x1291: 0x403ce820, 0x1292: 0x403cea20, 0x1293: 0x403cec20, + 0x1294: 0x403cee20, 0x1295: 0x403cf020, 0x1296: 0x403cf220, + 0x1298: 0x403cf420, 0x129a: 0x403cf620, 0x129b: 0x403cf820, + 0x129c: 0x403cfa20, 0x129d: 0x403cfc20, + 0x12a0: 0x403cfe20, 0x12a1: 0x403d0020, 0x12a2: 0x403d0220, 0x12a3: 0x403d0420, + 0x12a4: 0x403d0620, 0x12a5: 0x403d0820, 0x12a6: 0x403d0a20, 0x12a7: 0x403d0c20, + 0x12a8: 0x403d1820, 0x12a9: 0x403d1a20, 0x12aa: 0x403d1c20, 0x12ab: 0x403d1e20, + 0x12ac: 0x403d2020, 0x12ad: 0x403d2220, 0x12ae: 0x403d2420, 0x12af: 0x403d2620, + 0x12b0: 0x403d2820, 0x12b1: 0x403d2a20, 0x12b2: 0x403d2c20, 0x12b3: 0x403d2e20, + 0x12b4: 0x403d3020, 0x12b5: 0x403d3220, 0x12b6: 0x403d3420, 0x12b7: 0x403d3620, + 0x12b8: 0x403d3a20, 0x12b9: 0x403d3c20, 0x12ba: 0x403d3e20, 0x12bb: 0x403d4020, + 0x12bc: 0x403d4220, 0x12bd: 0x403d4420, 0x12be: 0x403d4620, 0x12bf: 0x403d4820, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x403d4c20, 0x12c1: 0x403d4e20, 0x12c2: 0x403d5020, 0x12c3: 0x403d5220, + 0x12c4: 0x403d5420, 0x12c5: 0x403d5620, 0x12c6: 0x403d5820, 0x12c7: 0x403d5a20, + 0x12c8: 0x403d5c20, 0x12ca: 0x403d5e20, 0x12cb: 0x403d6020, + 0x12cc: 0x403d6220, 0x12cd: 0x403d6420, + 0x12d0: 0x403d6620, 0x12d1: 0x403d6820, 0x12d2: 0x403d6a20, 0x12d3: 0x403d6c20, + 0x12d4: 0x403d6e20, 0x12d5: 0x403d7020, 0x12d6: 0x403d7220, 0x12d7: 0x403d7420, + 0x12d8: 0x403d7820, 0x12d9: 0x403d7a20, 0x12da: 0x403d7c20, 0x12db: 0x403d7e20, + 0x12dc: 0x403d8020, 0x12dd: 0x403d8220, 0x12de: 0x403d8420, 0x12df: 0x403d8620, + 0x12e0: 0x403d8a20, 0x12e1: 0x403d8c20, 0x12e2: 0x403d8e20, 0x12e3: 0x403d9020, + 0x12e4: 0x403d9220, 0x12e5: 0x403d9420, 0x12e6: 0x403d9620, 0x12e7: 0x403d9820, + 0x12e8: 0x403d9c20, 0x12e9: 0x403d9e20, 0x12ea: 0x403da020, 0x12eb: 0x403da220, + 0x12ec: 0x403da420, 0x12ed: 0x403da620, 0x12ee: 0x403da820, 0x12ef: 0x403daa20, + 0x12f0: 0x403dac20, 0x12f2: 0x403dae20, 0x12f3: 0x403db020, + 0x12f4: 0x403db220, 0x12f5: 0x403db420, + 0x12f8: 0x403db620, 0x12f9: 0x403db820, 0x12fa: 0x403dba20, 0x12fb: 0x403dbc20, + 0x12fc: 0x403dbe20, 0x12fd: 0x403dc020, 0x12fe: 0x403dc220, + // Block 0x4c, offset 0x1300 + 0x1300: 0x403dc420, 0x1302: 0x403dc620, 0x1303: 0x403dc820, + 0x1304: 0x403dca20, 0x1305: 0x403dcc20, + 0x1308: 0x403dce20, 0x1309: 0x403dd020, 0x130a: 0x403dd220, 0x130b: 0x403dd420, + 0x130c: 0x403dd620, 0x130d: 0x403dd820, 0x130e: 0x403dda20, 0x130f: 0x403ddc20, + 0x1310: 0x403dde20, 0x1311: 0x403de020, 0x1312: 0x403de220, 0x1313: 0x403de420, + 0x1314: 0x403de620, 0x1315: 0x403de820, 0x1316: 0x403dea20, + 0x1318: 0x403dec20, 0x1319: 0x403dee20, 0x131a: 0x403df020, 0x131b: 0x403df220, + 0x131c: 0x403df420, 0x131d: 0x403df620, 0x131e: 0x403df820, 0x131f: 0x403dfa20, + 0x1320: 0x403e0a20, 0x1321: 0x403e0c20, 0x1322: 0x403e0e20, 0x1323: 0x403e1020, + 0x1324: 0x403e1220, 0x1325: 0x403e1420, 0x1326: 0x403e1620, 0x1327: 0x403e1820, + 0x1328: 0x403e1a20, 0x1329: 0x403e1c20, 0x132a: 0x403e1e20, 0x132b: 0x403e2020, + 0x132c: 0x403e2220, 0x132d: 0x403e2420, 0x132e: 0x403e2620, 0x132f: 0x403e2820, + 0x1330: 0x403e2a20, 0x1331: 0x403e2c20, 0x1332: 0x403e2e20, 0x1333: 0x403e3020, + 0x1334: 0x403e3220, 0x1335: 0x403e3420, 0x1336: 0x403e3620, 0x1337: 0x403e3820, + 0x1338: 0x403e4820, 0x1339: 0x403e4a20, 0x133a: 0x403e4c20, 0x133b: 0x403e4e20, + 0x133c: 0x403e5020, 0x133d: 0x403e5220, 0x133e: 0x403e5420, 0x133f: 0x403e5620, + // Block 0x4d, offset 0x1340 + 0x1340: 0x403e5a20, 0x1341: 0x403e5c20, 0x1342: 0x403e5e20, 0x1343: 0x403e6020, + 0x1344: 0x403e6220, 0x1345: 0x403e6420, 0x1346: 0x403e6620, 0x1347: 0x403e6820, + 0x1348: 0x403e6c20, 0x1349: 0x403e6e20, 0x134a: 0x403e7020, 0x134b: 0x403e7220, + 0x134c: 0x403e7420, 0x134d: 0x403e7620, 0x134e: 0x403e7820, 0x134f: 0x403e7a20, + 0x1350: 0x403e7c20, 0x1352: 0x403e7e20, 0x1353: 0x403e8020, + 0x1354: 0x403e8220, 0x1355: 0x403e8420, + 0x1358: 0x403e8620, 0x1359: 0x403e8820, 0x135a: 0x403e8a20, 0x135b: 0x403e8c20, + 0x135c: 0x403e8e20, 0x135d: 0x403e9020, 0x135e: 0x403e9220, 0x135f: 0x403e9420, + 0x1360: 0x403e9e20, 0x1361: 0x403ea020, 0x1362: 0x403ea220, 0x1363: 0x403ea420, + 0x1364: 0x403ea620, 0x1365: 0x403ea820, 0x1366: 0x403eaa20, 0x1367: 0x403eac20, + 0x1368: 0x403eb020, 0x1369: 0x403eb220, 0x136a: 0x403eb420, 0x136b: 0x403eb620, + 0x136c: 0x403eb820, 0x136d: 0x403eba20, 0x136e: 0x403ebc20, 0x136f: 0x403ebe20, + 0x1370: 0x403ed020, 0x1371: 0x403ed220, 0x1372: 0x403ed420, 0x1373: 0x403ed620, + 0x1374: 0x403ed820, 0x1375: 0x403eda20, 0x1376: 0x403edc20, 0x1377: 0x403ede20, + 0x1378: 0x403ee220, 0x1379: 0x403ee420, 0x137a: 0x403ee620, 0x137b: 0x403ee820, + 0x137c: 0x403eea20, 0x137d: 0x403eec20, 0x137e: 0x403eee20, 0x137f: 0x403ef020, + // Block 0x4e, offset 0x1380 + 0x1380: 0x403f0020, 0x1381: 0x403f0220, 0x1382: 0x403f0420, 0x1383: 0x403f0620, + 0x1384: 0x403f0820, 0x1385: 0x403f0a20, 0x1386: 0x403f0c20, 0x1387: 0x403f0e20, + 0x1388: 0x403f1020, 0x1389: 0x403f1220, 0x138a: 0x403f1420, 0x138b: 0x403f1620, + 0x138c: 0x403f1820, 0x138d: 0x403f1a20, 0x138e: 0x403f1c20, 0x138f: 0x403f1e20, + 0x1390: 0x403f2820, 0x1391: 0x403f2a20, 0x1392: 0x403f2c20, 0x1393: 0x403f2e20, + 0x1394: 0x403f3020, 0x1395: 0x403f3220, 0x1396: 0x403f3420, 0x1397: 0x403f3620, + 0x1398: 0x403f4220, 0x1399: 0x403f4420, 0x139a: 0x403f4620, + 0x139d: 0xae60ee02, 0x139e: 0xae60ed02, 0x139f: 0xae60ec02, + 0x13a0: 0x40036220, 0x13a1: 0x40029c20, 0x13a2: 0x4002ee20, 0x13a3: 0x40029e20, + 0x13a4: 0x4002a020, 0x13a5: 0x4002a220, 0x13a6: 0x4002a420, 0x13a7: 0x4002d020, + 0x13a8: 0x40036420, 0x13a9: 0xe00001f2, 0x13aa: 0xe000030d, 0x13ab: 0xe00003e7, + 0x13ac: 0xe00004c2, 0x13ad: 0xe000058c, 0x13ae: 0xe0000657, 0x13af: 0xe00006ff, + 0x13b0: 0xe00007ab, 0x13b1: 0xe0000850, 0x13b2: 0x40286620, 0x13b3: 0x40286820, + 0x13b4: 0x40286a20, 0x13b5: 0x40286c20, 0x13b6: 0x40286e20, 0x13b7: 0x40287020, + 0x13b8: 0x40287220, 0x13b9: 0x40287420, 0x13ba: 0x40287620, 0x13bb: 0x40287820, + 0x13bc: 0x40287a20, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x403c7020, 0x13c1: 0x403c7220, 0x13c2: 0x403c7420, 0x13c3: 0x403c7620, + 0x13c4: 0x403d0e20, 0x13c5: 0x403d1020, 0x13c6: 0x403d1220, 0x13c7: 0x403d1420, + 0x13c8: 0x403f2020, 0x13c9: 0x403f2220, 0x13ca: 0x403f2420, 0x13cb: 0x403f2620, + 0x13cc: 0x403f3820, 0x13cd: 0x403f3a20, 0x13ce: 0x403f3c20, 0x13cf: 0x403f3e20, + 0x13d0: 0x4006a620, 0x13d1: 0x4006a820, 0x13d2: 0x4006aa20, 0x13d3: 0x4006ac20, + 0x13d4: 0x4006ae20, 0x13d5: 0x4006b020, 0x13d6: 0x4006b220, 0x13d7: 0x4006b420, + 0x13d8: 0x4006b620, 0x13d9: 0x4006b820, + 0x13e0: 0x40547620, 0x13e1: 0x40547820, 0x13e2: 0x40547a20, 0x13e3: 0x40547c20, + 0x13e4: 0x40547e20, 0x13e5: 0x40548020, 0x13e6: 0x40548220, 0x13e7: 0x40548420, + 0x13e8: 0x40548620, 0x13e9: 0x40548820, 0x13ea: 0x40548a20, 0x13eb: 0x40548c20, + 0x13ec: 0x40548e20, 0x13ed: 0x40549020, 0x13ee: 0x40549220, 0x13ef: 0x40549420, + 0x13f0: 0x40549620, 0x13f1: 0x40549820, 0x13f2: 0x40549a20, 0x13f3: 0x40549c20, + 0x13f4: 0x40549e20, 0x13f5: 0x4054a020, 0x13f6: 0x4054a220, 0x13f7: 0x4054a420, + 0x13f8: 0x4054a620, 0x13f9: 0x4054a820, 0x13fa: 0x4054aa20, 0x13fb: 0x4054ac20, + 0x13fc: 0x4054ae20, 0x13fd: 0x4054b020, 0x13fe: 0x4054b220, 0x13ff: 0x4054b420, + // Block 0x50, offset 0x1400 + 0x1400: 0x4054b620, 0x1401: 0x4054b820, 0x1402: 0x4054ba20, 0x1403: 0x4054bc20, + 0x1404: 0x4054be20, 0x1405: 0x4054c020, 0x1406: 0x4054c220, 0x1407: 0x4054c420, + 0x1408: 0x4054c620, 0x1409: 0x4054c820, 0x140a: 0x4054ca20, 0x140b: 0x4054cc20, + 0x140c: 0x4054ce20, 0x140d: 0x4054d020, 0x140e: 0x4054d220, 0x140f: 0x4054d420, + 0x1410: 0x4054d620, 0x1411: 0x4054d820, 0x1412: 0x4054da20, 0x1413: 0x4054dc20, + 0x1414: 0x4054de20, 0x1415: 0x4054e020, 0x1416: 0x4054e220, 0x1417: 0x4054e420, + 0x1418: 0x4054e620, 0x1419: 0x4054e820, 0x141a: 0x4054ea20, 0x141b: 0x4054ec20, + 0x141c: 0x4054ee20, 0x141d: 0x4054f020, 0x141e: 0x4054f220, 0x141f: 0x4054f420, + 0x1420: 0x4054f620, 0x1421: 0x4054f820, 0x1422: 0x4054fa20, 0x1423: 0x4054fc20, + 0x1424: 0x4054fe20, 0x1425: 0x40550020, 0x1426: 0x40550220, 0x1427: 0x40550420, + 0x1428: 0x40550620, 0x1429: 0x40550820, 0x142a: 0x40550a20, 0x142b: 0x40550c20, + 0x142c: 0x40550e20, 0x142d: 0x40551020, 0x142e: 0x40551220, 0x142f: 0x40551420, + 0x1430: 0x40551620, 0x1431: 0x40551820, 0x1432: 0x40551a20, 0x1433: 0x40551c20, + 0x1434: 0x40551e20, + // Block 0x51, offset 0x1440 + 0x1440: 0x40021e20, 0x1441: 0x40552020, 0x1442: 0x40552220, 0x1443: 0x40552420, + 0x1444: 0x40552620, 0x1445: 0x40552820, 0x1446: 0x40552a20, 0x1447: 0x40552c20, + 0x1448: 0x40552e20, 0x1449: 0x40553020, 0x144a: 0x40553220, 0x144b: 0x40553420, + 0x144c: 0x40553620, 0x144d: 0x40553820, 0x144e: 0x40553a20, 0x144f: 0x40553c20, + 0x1450: 0x40553e20, 0x1451: 0x40554020, 0x1452: 0x40554220, 0x1453: 0x40554420, + 0x1454: 0x40554620, 0x1455: 0x40554820, 0x1456: 0x40554a20, 0x1457: 0x40554c20, + 0x1458: 0x40554e20, 0x1459: 0x40555020, 0x145a: 0x40555220, 0x145b: 0x40555420, + 0x145c: 0x40555620, 0x145d: 0x40555820, 0x145e: 0x40555a20, 0x145f: 0x40555c20, + 0x1460: 0x40555e20, 0x1461: 0x40556020, 0x1462: 0x40556220, 0x1463: 0x40556420, + 0x1464: 0x40556620, 0x1465: 0x40556820, 0x1466: 0x40556a20, 0x1467: 0x40556c20, + 0x1468: 0x40556e20, 0x1469: 0x40557020, 0x146a: 0x40557220, 0x146b: 0x40557420, + 0x146c: 0x40557620, 0x146d: 0x40557820, 0x146e: 0x40557a20, 0x146f: 0x40557c20, + 0x1470: 0x40557e20, 0x1471: 0x40558020, 0x1472: 0x40558220, 0x1473: 0x40558420, + 0x1474: 0x40558620, 0x1475: 0x40558820, 0x1476: 0x40558a20, 0x1477: 0x40558c20, + 0x1478: 0x40558e20, 0x1479: 0x40559020, 0x147a: 0x40559220, 0x147b: 0x40559420, + 0x147c: 0x40559620, 0x147d: 0x40559820, 0x147e: 0x40559a20, 0x147f: 0x40559c20, + // Block 0x52, offset 0x1480 + 0x1480: 0x40559e20, 0x1481: 0x4055a020, 0x1482: 0x4055a220, 0x1483: 0x4055a420, + 0x1484: 0x4055a620, 0x1485: 0x4055a820, 0x1486: 0x4055aa20, 0x1487: 0x4055ac20, + 0x1488: 0x4055ae20, 0x1489: 0x4055b020, 0x148a: 0x4055b220, 0x148b: 0x4055b420, + 0x148c: 0x4055b620, 0x148d: 0x4055b820, 0x148e: 0x4055ba20, 0x148f: 0x4055bc20, + 0x1490: 0x4055be20, 0x1491: 0x4055c020, 0x1492: 0x4055c220, 0x1493: 0x4055c420, + 0x1494: 0x4055c620, 0x1495: 0x4055c820, 0x1496: 0x4055ca20, 0x1497: 0x4055cc20, + 0x1498: 0x4055ce20, 0x1499: 0x4055d020, 0x149a: 0x4055d220, 0x149b: 0x4055d420, + 0x149c: 0x4055d620, 0x149d: 0x4055d820, 0x149e: 0x4055da20, 0x149f: 0x4055dc20, + 0x14a0: 0x4055de20, 0x14a1: 0x4055e020, 0x14a2: 0x4055e220, 0x14a3: 0x4055e420, + 0x14a4: 0x4055e620, 0x14a5: 0x4055e820, 0x14a6: 0x4055ea20, 0x14a7: 0x4055ec20, + 0x14a8: 0x4055ee20, 0x14a9: 0x4055f020, 0x14aa: 0x4055f220, 0x14ab: 0x4055f420, + 0x14ac: 0x4055f620, 0x14ad: 0x4055f820, 0x14ae: 0x4055fa20, 0x14af: 0x4055fc20, + 0x14b0: 0x4055fe20, 0x14b1: 0x40560020, 0x14b2: 0x40560220, 0x14b3: 0x40560420, + 0x14b4: 0x40560620, 0x14b5: 0x40560820, 0x14b6: 0x40560a20, 0x14b7: 0x40560c20, + 0x14b8: 0x40560e20, 0x14b9: 0x40561020, 0x14ba: 0x40561220, 0x14bb: 0x40561420, + 0x14bc: 0x40561620, 0x14bd: 0x40561820, 0x14be: 0x40561a20, 0x14bf: 0x40561c20, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x40561e20, 0x14c1: 0x40562020, 0x14c2: 0x40562220, 0x14c3: 0x40562420, + 0x14c4: 0x40562620, 0x14c5: 0x40562820, 0x14c6: 0x40562a20, 0x14c7: 0x40562c20, + 0x14c8: 0x40562e20, 0x14c9: 0x40563020, 0x14ca: 0x40563220, 0x14cb: 0x40563420, + 0x14cc: 0x40563620, 0x14cd: 0x40563820, 0x14ce: 0x40563a20, 0x14cf: 0x40563c20, + 0x14d0: 0x40563e20, 0x14d1: 0x40564020, 0x14d2: 0x40564220, 0x14d3: 0x40564420, + 0x14d4: 0x40564620, 0x14d5: 0x40564820, 0x14d6: 0x40564a20, 0x14d7: 0x40564c20, + 0x14d8: 0x40564e20, 0x14d9: 0x40565020, 0x14da: 0x40565220, 0x14db: 0x40565420, + 0x14dc: 0x40565620, 0x14dd: 0x40565820, 0x14de: 0x40565a20, 0x14df: 0x40565c20, + 0x14e0: 0x40565e20, 0x14e1: 0x40566020, 0x14e2: 0x40566220, 0x14e3: 0x40566420, + 0x14e4: 0x40566620, 0x14e5: 0x40566820, 0x14e6: 0x40566a20, 0x14e7: 0x40566c20, + 0x14e8: 0x40566e20, 0x14e9: 0x40567020, 0x14ea: 0x40567220, 0x14eb: 0x40567420, + 0x14ec: 0x40567620, 0x14ed: 0x40567820, 0x14ee: 0x40567a20, 0x14ef: 0x40567c20, + 0x14f0: 0x40567e20, 0x14f1: 0x40568020, 0x14f2: 0x40568220, 0x14f3: 0x40568420, + 0x14f4: 0x40568620, 0x14f5: 0x40568820, 0x14f6: 0x40568a20, 0x14f7: 0x40568c20, + 0x14f8: 0x40568e20, 0x14f9: 0x40569020, 0x14fa: 0x40569220, 0x14fb: 0x40569420, + 0x14fc: 0x40569620, 0x14fd: 0x40569820, 0x14fe: 0x40569a20, 0x14ff: 0x40569c20, + // Block 0x54, offset 0x1500 + 0x1500: 0x40569e20, 0x1501: 0x4056a020, 0x1502: 0x4056a220, 0x1503: 0x4056a420, + 0x1504: 0x4056a620, 0x1505: 0x4056a820, 0x1506: 0x4056aa20, 0x1507: 0x4056ac20, + 0x1508: 0x4056ae20, 0x1509: 0x4056b020, 0x150a: 0x4056b220, 0x150b: 0x4056b420, + 0x150c: 0x4056b620, 0x150d: 0x4056b820, 0x150e: 0x4056ba20, 0x150f: 0x4056bc20, + 0x1510: 0x4056be20, 0x1511: 0x4056c020, 0x1512: 0x4056c220, 0x1513: 0x4056c420, + 0x1514: 0x4056c620, 0x1515: 0x4056c820, 0x1516: 0x4056ca20, 0x1517: 0x4056cc20, + 0x1518: 0x4056ce20, 0x1519: 0x4056d020, 0x151a: 0x4056d220, 0x151b: 0x4056d420, + 0x151c: 0x4056d620, 0x151d: 0x4056d820, 0x151e: 0x4056da20, 0x151f: 0x4056dc20, + 0x1520: 0x4056de20, 0x1521: 0x4056e020, 0x1522: 0x4056e220, 0x1523: 0x4056e420, + 0x1524: 0x4056e620, 0x1525: 0x4056e820, 0x1526: 0x4056ea20, 0x1527: 0x4056ec20, + 0x1528: 0x4056ee20, 0x1529: 0x4056f020, 0x152a: 0x4056f220, 0x152b: 0x4056f420, + 0x152c: 0x4056f620, 0x152d: 0x4056f820, 0x152e: 0x4056fa20, 0x152f: 0x4056fc20, + 0x1530: 0x4056fe20, 0x1531: 0x40570020, 0x1532: 0x40570220, 0x1533: 0x40570420, + 0x1534: 0x40570620, 0x1535: 0x40570820, 0x1536: 0x40570a20, 0x1537: 0x40570c20, + 0x1538: 0x40570e20, 0x1539: 0x40571020, 0x153a: 0x40571220, 0x153b: 0x40571420, + 0x153c: 0x40571620, 0x153d: 0x40571820, 0x153e: 0x40571a20, 0x153f: 0x40571c20, + // Block 0x55, offset 0x1540 + 0x1540: 0x40571e20, 0x1541: 0x40572020, 0x1542: 0x40572220, 0x1543: 0x40572420, + 0x1544: 0x40572620, 0x1545: 0x40572820, 0x1546: 0x40572a20, 0x1547: 0x40572c20, + 0x1548: 0x40572e20, 0x1549: 0x40573020, 0x154a: 0x40573220, 0x154b: 0x40573420, + 0x154c: 0x40573620, 0x154d: 0x40573820, 0x154e: 0x40573a20, 0x154f: 0x40573c20, + 0x1550: 0x40573e20, 0x1551: 0x40574020, 0x1552: 0x40574220, 0x1553: 0x40574420, + 0x1554: 0x40574620, 0x1555: 0x40574820, 0x1556: 0x40574a20, 0x1557: 0x40574c20, + 0x1558: 0x40574e20, 0x1559: 0x40575020, 0x155a: 0x40575220, 0x155b: 0x40575420, + 0x155c: 0x40575620, 0x155d: 0x40575820, 0x155e: 0x40575a20, 0x155f: 0x40575c20, + 0x1560: 0x40575e20, 0x1561: 0x40576020, 0x1562: 0x40576220, 0x1563: 0x40576420, + 0x1564: 0x40576620, 0x1565: 0x40576820, 0x1566: 0x40576a20, 0x1567: 0x40576c20, + 0x1568: 0x40576e20, 0x1569: 0x40577020, 0x156a: 0x40577220, 0x156b: 0x40577420, + 0x156c: 0x40577620, 0x156d: 0x40577820, 0x156e: 0x40577a20, 0x156f: 0x40577c20, + 0x1570: 0x40577e20, 0x1571: 0x40578020, 0x1572: 0x40578220, 0x1573: 0x40578420, + 0x1574: 0x40578620, 0x1575: 0x40578820, 0x1576: 0x40578a20, 0x1577: 0x40578c20, + 0x1578: 0x40578e20, 0x1579: 0x40579020, 0x157a: 0x40579220, 0x157b: 0x40579420, + 0x157c: 0x40579620, 0x157d: 0x40579820, 0x157e: 0x40579a20, 0x157f: 0x40579c20, + // Block 0x56, offset 0x1580 + 0x1580: 0x40579e20, 0x1581: 0x4057a020, 0x1582: 0x4057a220, 0x1583: 0x4057a420, + 0x1584: 0x4057a620, 0x1585: 0x4057a820, 0x1586: 0x4057aa20, 0x1587: 0x4057ac20, + 0x1588: 0x4057ae20, 0x1589: 0x4057b020, 0x158a: 0x4057b220, 0x158b: 0x4057b420, + 0x158c: 0x4057b620, 0x158d: 0x4057b820, 0x158e: 0x4057ba20, 0x158f: 0x4057bc20, + 0x1590: 0x4057be20, 0x1591: 0x4057c020, 0x1592: 0x4057c220, 0x1593: 0x4057c420, + 0x1594: 0x4057c620, 0x1595: 0x4057c820, 0x1596: 0x4057ca20, 0x1597: 0x4057cc20, + 0x1598: 0x4057ce20, 0x1599: 0x4057d020, 0x159a: 0x4057d220, 0x159b: 0x4057d420, + 0x159c: 0x4057d620, 0x159d: 0x4057d820, 0x159e: 0x4057da20, 0x159f: 0x4057dc20, + 0x15a0: 0x4057de20, 0x15a1: 0x4057e020, 0x15a2: 0x4057e220, 0x15a3: 0x4057e420, + 0x15a4: 0x4057e620, 0x15a5: 0x4057e820, 0x15a6: 0x4057ea20, 0x15a7: 0x4057ec20, + 0x15a8: 0x4057ee20, 0x15a9: 0x4057f020, 0x15aa: 0x4057f220, 0x15ab: 0x4057f420, + 0x15ac: 0x4057f620, 0x15ad: 0x4057f820, 0x15ae: 0x4057fa20, 0x15af: 0x4057fc20, + 0x15b0: 0x4057fe20, 0x15b1: 0x40580020, 0x15b2: 0x40580220, 0x15b3: 0x40580420, + 0x15b4: 0x40580620, 0x15b5: 0x40580820, 0x15b6: 0x40580a20, 0x15b7: 0x40580c20, + 0x15b8: 0x40580e20, 0x15b9: 0x40581020, 0x15ba: 0x40581220, 0x15bb: 0x40581420, + 0x15bc: 0x40587a20, 0x15bd: 0x40581620, 0x15be: 0x40581a20, 0x15bf: 0x40581c20, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x40581e20, 0x15c1: 0x40582020, 0x15c2: 0x40582220, 0x15c3: 0x40582420, + 0x15c4: 0x40582620, 0x15c5: 0x40582820, 0x15c6: 0x40582a20, 0x15c7: 0x40582c20, + 0x15c8: 0x40582e20, 0x15c9: 0x40583020, 0x15ca: 0x40583220, 0x15cb: 0x40583420, + 0x15cc: 0x40583620, 0x15cd: 0x40583820, 0x15ce: 0x40583c20, 0x15cf: 0x40583e20, + 0x15d0: 0x40584020, 0x15d1: 0x40584220, 0x15d2: 0x40584420, 0x15d3: 0x40584620, + 0x15d4: 0x40584820, 0x15d5: 0x40584a20, 0x15d6: 0x40585820, 0x15d7: 0x40585a20, + 0x15d8: 0x40585c20, 0x15d9: 0x40585e20, 0x15da: 0x40586020, 0x15db: 0x40586220, + 0x15dc: 0x40586420, 0x15dd: 0x40586620, 0x15de: 0x40586820, 0x15df: 0x40586a20, + 0x15e0: 0x40586c20, 0x15e1: 0x40586e20, 0x15e2: 0x40587020, 0x15e3: 0x40587220, + 0x15e4: 0x40587420, 0x15e5: 0x40587620, 0x15e6: 0x40587820, 0x15e7: 0x40587c20, + 0x15e8: 0x40587e20, 0x15e9: 0x40588020, 0x15ea: 0x40588220, 0x15eb: 0x40588420, + 0x15ec: 0x40588620, 0x15ed: 0x40588820, 0x15ee: 0x40588a20, 0x15ef: 0x40588c20, + 0x15f0: 0x40588e20, 0x15f1: 0x40589020, 0x15f2: 0x40589220, 0x15f3: 0x40589420, + 0x15f4: 0x40589620, 0x15f5: 0x40589820, 0x15f6: 0x40589a20, 0x15f7: 0x40589c20, + 0x15f8: 0x40589e20, 0x15f9: 0x4058a020, 0x15fa: 0x4058a220, 0x15fb: 0x4058a420, + 0x15fc: 0x4058a620, 0x15fd: 0x4058a820, 0x15fe: 0x4058aa20, 0x15ff: 0x4058ac20, + // Block 0x58, offset 0x1600 + 0x1600: 0x4058ae20, 0x1601: 0x4058b020, 0x1602: 0x4058b220, 0x1603: 0x4058b420, + 0x1604: 0x4058b620, 0x1605: 0x4058b820, 0x1606: 0x4058ba20, 0x1607: 0x4058bc20, + 0x1608: 0x4058be20, 0x1609: 0x4058c020, 0x160a: 0x4058c220, 0x160b: 0x4058c420, + 0x160c: 0x4058c620, 0x160d: 0x4058c820, 0x160e: 0x4058ca20, 0x160f: 0x4058cc20, + 0x1610: 0x4058ce20, 0x1611: 0x4058d020, 0x1612: 0x4058d220, 0x1613: 0x4058d420, + 0x1614: 0x4058d620, 0x1615: 0x4058d820, 0x1616: 0x4058da20, 0x1617: 0x4058dc20, + 0x1618: 0x4058de20, 0x1619: 0x4058e020, 0x161a: 0x4058e220, 0x161b: 0x4058e420, + 0x161c: 0x4058e620, 0x161d: 0x4058e820, 0x161e: 0x4058ea20, 0x161f: 0x4058ec20, + 0x1620: 0x4058ee20, 0x1621: 0x4058f020, 0x1622: 0x4058f220, 0x1623: 0x4058f420, + 0x1624: 0x4058f620, 0x1625: 0x4058f820, 0x1626: 0x4058fa20, 0x1627: 0x4058fc20, + 0x1628: 0x4058fe20, 0x1629: 0x40590020, 0x162a: 0x40590220, 0x162b: 0x40590420, + 0x162c: 0x40590620, 0x162d: 0x40590820, 0x162e: 0x40590a20, 0x162f: 0x40590c20, + 0x1630: 0x40590e20, 0x1631: 0x40591020, 0x1632: 0x40591220, 0x1633: 0x40591420, + 0x1634: 0x40591620, 0x1635: 0x40591820, 0x1636: 0x40591a20, 0x1637: 0x40591c20, + 0x1638: 0x40591e20, 0x1639: 0x40592020, 0x163a: 0x40592220, 0x163b: 0x40592420, + 0x163c: 0x40592620, 0x163d: 0x40592820, 0x163e: 0x40592a20, 0x163f: 0x40592c20, + // Block 0x59, offset 0x1640 + 0x1640: 0x40592e20, 0x1641: 0x40593020, 0x1642: 0x40593220, 0x1643: 0x40593420, + 0x1644: 0x40593620, 0x1645: 0x40593820, 0x1646: 0x40593a20, 0x1647: 0x40593c20, + 0x1648: 0x40593e20, 0x1649: 0x40594020, 0x164a: 0x40594220, 0x164b: 0x40594420, + 0x164c: 0x40594620, 0x164d: 0x40594820, 0x164e: 0x40594a20, 0x164f: 0x40594c20, + 0x1650: 0x40594e20, 0x1651: 0x40595020, 0x1652: 0x40595220, 0x1653: 0x40595420, + 0x1654: 0x40595620, 0x1655: 0x40595820, 0x1656: 0x40595a20, 0x1657: 0x40595c20, + 0x1658: 0x40595e20, 0x1659: 0x40596020, 0x165a: 0x40596220, 0x165b: 0x40596420, + 0x165c: 0x40596620, 0x165d: 0x40596820, 0x165e: 0x40596a20, 0x165f: 0x40596c20, + 0x1660: 0x40596e20, 0x1661: 0x40597020, 0x1662: 0x40597220, 0x1663: 0x40597420, + 0x1664: 0x40597620, 0x1665: 0x40597820, 0x1666: 0x40597a20, 0x1667: 0x40597c20, + 0x1668: 0x40597e20, 0x1669: 0x40598020, 0x166a: 0x40598220, 0x166b: 0x40598420, + 0x166c: 0x40598620, 0x166d: 0x40598820, 0x166e: 0x40598a20, 0x166f: 0x40598c20, + 0x1670: 0x40598e20, 0x1671: 0x40599020, 0x1672: 0x40599220, 0x1673: 0x40599420, + 0x1674: 0x40599620, 0x1675: 0x40599820, 0x1676: 0x40599a20, 0x1677: 0x40599c20, + 0x1678: 0x40599e20, 0x1679: 0x4059a020, 0x167a: 0x4059a220, 0x167b: 0x4059a420, + 0x167c: 0x4059a620, 0x167d: 0x4059a820, 0x167e: 0x4059aa20, 0x167f: 0x4059ac20, + // Block 0x5a, offset 0x1680 + 0x1680: 0x4059ae20, 0x1681: 0x4059b020, 0x1682: 0x4059b220, 0x1683: 0x4059b420, + 0x1684: 0x4059b620, 0x1685: 0x4059b820, 0x1686: 0x4059ba20, 0x1687: 0x4059bc20, + 0x1688: 0x4059be20, 0x1689: 0x4059c020, 0x168a: 0x4059c220, 0x168b: 0x4059c420, + 0x168c: 0x4059c620, 0x168d: 0x4059c820, 0x168e: 0x4059ca20, 0x168f: 0x4059cc20, + 0x1690: 0x4059ce20, 0x1691: 0x4059d020, 0x1692: 0x4059d220, 0x1693: 0x4059d420, + 0x1694: 0x4059d620, 0x1695: 0x4059d820, 0x1696: 0x4059da20, 0x1697: 0x4059dc20, + 0x1698: 0x4059de20, 0x1699: 0x4059e020, 0x169a: 0x4059e220, 0x169b: 0x4059e420, + 0x169c: 0x4059e620, 0x169d: 0x4059e820, 0x169e: 0x4059ea20, 0x169f: 0x4059ec20, + 0x16a0: 0x4059ee20, 0x16a1: 0x4059f020, 0x16a2: 0x4059f220, 0x16a3: 0x4059f420, + 0x16a4: 0x4059f620, 0x16a5: 0x4059f820, 0x16a6: 0x4059fa20, 0x16a7: 0x4059fc20, + 0x16a8: 0x4059fe20, 0x16a9: 0x405a0020, 0x16aa: 0x405a0220, 0x16ab: 0x405a0420, + 0x16ac: 0x405a0620, 0x16ad: 0x4005d420, 0x16ae: 0x4002f420, 0x16af: 0x40581820, + 0x16b0: 0x40583a20, 0x16b1: 0x40584c20, 0x16b2: 0x40584e20, 0x16b3: 0x40585020, + 0x16b4: 0x40585220, 0x16b5: 0x40585420, 0x16b6: 0x40585620, 0x16b7: 0x405a0820, + 0x16b8: 0x405a0a20, 0x16b9: 0x405a0c20, 0x16ba: 0x405a0e20, 0x16bb: 0x405a1020, + 0x16bc: 0x405a1220, 0x16bd: 0x405a1420, 0x16be: 0x405a1620, 0x16bf: 0x405a1820, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x00021284, 0x16c1: 0x405aa620, 0x16c2: 0x405aa820, 0x16c3: 0x405aaa20, + 0x16c4: 0x405aac20, 0x16c5: 0x405aae20, 0x16c6: 0x405ab020, 0x16c7: 0x405ab220, + 0x16c8: 0x405ab420, 0x16c9: 0x405ab620, 0x16ca: 0x405ab820, 0x16cb: 0x405aba20, + 0x16cc: 0x405abc20, 0x16cd: 0x405abe20, 0x16ce: 0x405ac020, 0x16cf: 0x405ac220, + 0x16d0: 0x405ac420, 0x16d1: 0x405ac620, 0x16d2: 0x405ac820, 0x16d3: 0x405aca20, + 0x16d4: 0x405acc20, 0x16d5: 0x405ace20, 0x16d6: 0x405ad020, 0x16d7: 0x405ad220, + 0x16d8: 0x405ad420, 0x16d9: 0x405ad620, 0x16da: 0x405ad820, 0x16db: 0x40040820, + 0x16dc: 0x40040a20, + 0x16e0: 0x405ada20, 0x16e1: 0xe000202d, 0x16e2: 0x405adc20, 0x16e3: 0x405b1420, + 0x16e4: 0xe0002030, 0x16e5: 0xe0002033, 0x16e6: 0x405ade20, 0x16e7: 0xe0002036, + 0x16e8: 0x405ae020, 0x16e9: 0xe000203c, 0x16ea: 0x405b1020, 0x16eb: 0x405b1220, + 0x16ec: 0xe000203f, 0x16ed: 0xe0002042, 0x16ee: 0xe0002045, 0x16ef: 0x405ae220, + 0x16f0: 0x405ae420, 0x16f1: 0x405ae620, 0x16f2: 0x405ae820, 0x16f3: 0xe0002048, + 0x16f4: 0xe000204b, 0x16f5: 0xe000204e, 0x16f6: 0xe0002051, 0x16f7: 0x405aea20, + 0x16f8: 0x405b1a20, 0x16f9: 0x405aec20, 0x16fa: 0x405aee20, 0x16fb: 0xe0002057, + 0x16fc: 0xe000205a, 0x16fd: 0xe000205d, 0x16fe: 0x405af020, 0x16ff: 0xe0002060, + // Block 0x5c, offset 0x1700 + 0x1700: 0xe0002063, 0x1701: 0x405af220, 0x1702: 0xe0002066, 0x1703: 0x405af420, + 0x1704: 0xe0002069, 0x1705: 0x405af620, 0x1706: 0xe000206c, 0x1707: 0x405af820, + 0x1708: 0x405afa20, 0x1709: 0x405afc20, 0x170a: 0x405afe20, 0x170b: 0xe0002075, + 0x170c: 0xe000207b, 0x170d: 0xe000207e, 0x170e: 0xe0002081, 0x170f: 0x405b0020, + 0x1710: 0xe0002084, 0x1711: 0xe0002087, 0x1712: 0x405b0220, 0x1713: 0xe000208a, + 0x1714: 0xe000208d, 0x1715: 0xe0002072, 0x1716: 0x405b0420, 0x1717: 0x405b0620, + 0x1718: 0xe0002090, 0x1719: 0xe0002093, 0x171a: 0x405b0820, 0x171b: 0xe000209b, + 0x171c: 0x405b0a20, 0x171d: 0xe000209e, 0x171e: 0x405b0c20, 0x171f: 0x405b0e20, + 0x1720: 0x405b1620, 0x1721: 0x405b1e20, 0x1722: 0x405b2020, 0x1723: 0x405b1820, + 0x1724: 0x405b1c20, 0x1725: 0x405b2220, 0x1726: 0x405b2420, 0x1727: 0xe00020a1, + 0x1728: 0xe00020a4, 0x1729: 0xe0002054, 0x172a: 0xe0002078, 0x172b: 0x4002b220, + 0x172c: 0x4002b420, 0x172d: 0x4002b620, 0x172e: 0xe000206f, 0x172f: 0xe0002096, + 0x1730: 0xe0002039, + // Block 0x5d, offset 0x1740 + 0x1740: 0x404c7620, 0x1741: 0x404c7820, 0x1742: 0x404c7a20, 0x1743: 0x404c7c20, + 0x1744: 0x404c7e20, 0x1745: 0x404c8020, 0x1746: 0x404c8220, 0x1747: 0x404c8420, + 0x1748: 0x404c8620, 0x1749: 0x404c8820, 0x174a: 0x404c8a20, 0x174b: 0x404c8c20, + 0x174c: 0x404c8e20, 0x174e: 0x404c9020, 0x174f: 0x404c9220, + 0x1750: 0x404c9420, 0x1751: 0x404c9620, 0x1752: 0x404c9820, 0x1753: 0x404c9a20, + 0x1754: 0x8209264e, + 0x1760: 0x404c9e20, 0x1761: 0x404ca020, 0x1762: 0x404ca220, 0x1763: 0x404ca420, + 0x1764: 0x404ca620, 0x1765: 0x404ca820, 0x1766: 0x404caa20, 0x1767: 0x404cac20, + 0x1768: 0x404cae20, 0x1769: 0x404cb020, 0x176a: 0x404cb220, 0x176b: 0x404cb420, + 0x176c: 0x404cb620, 0x176d: 0x404cb820, 0x176e: 0x404cba20, 0x176f: 0x404cbc20, + 0x1770: 0x404cbe20, 0x1771: 0x404cc020, 0x1772: 0x404cc220, 0x1773: 0x404cc420, + 0x1774: 0x82092663, 0x1775: 0x40031c20, 0x1776: 0x40031e20, + // Block 0x5e, offset 0x1780 + 0x1780: 0x404cc820, 0x1781: 0x404cca20, 0x1782: 0x404ccc20, 0x1783: 0x404cce20, + 0x1784: 0x404cd020, 0x1785: 0x404cd220, 0x1786: 0x404cd420, 0x1787: 0x404cd620, + 0x1788: 0x404cd820, 0x1789: 0x404cda20, 0x178a: 0x404cdc20, 0x178b: 0x404cde20, + 0x178c: 0x404ce020, 0x178d: 0x404ce220, 0x178e: 0x404ce420, 0x178f: 0x404ce620, + 0x1790: 0x404ce820, 0x1791: 0x404cea20, 0x1792: 0x404cec20, 0x1793: 0x404cee20, + 0x17a0: 0x404cf020, 0x17a1: 0x404cf220, 0x17a2: 0x404cf420, 0x17a3: 0x404cf620, + 0x17a4: 0x404cf820, 0x17a5: 0x404cfa20, 0x17a6: 0x404cfc20, 0x17a7: 0x404cfe20, + 0x17a8: 0x404d0020, 0x17a9: 0x404d0220, 0x17aa: 0x404d0420, 0x17ab: 0x404d0620, + 0x17ac: 0x404d0820, 0x17ae: 0x404d0a20, 0x17af: 0x404d0c20, + 0x17b0: 0x404d0e20, 0x17b2: 0x404d1020, 0x17b3: 0x404d1220, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x404fa420, 0x17c1: 0x404fa620, 0x17c2: 0x404fa820, 0x17c3: 0x404faa20, + 0x17c4: 0x404fac20, 0x17c5: 0x404fae20, 0x17c6: 0x404fb020, 0x17c7: 0x404fb220, + 0x17c8: 0x404fb420, 0x17c9: 0x404fb620, 0x17ca: 0x404fb820, 0x17cb: 0x404fba20, + 0x17cc: 0x404fbc20, 0x17cd: 0x404fbe20, 0x17ce: 0x404fc020, 0x17cf: 0x404fc220, + 0x17d0: 0x404fc420, 0x17d1: 0x404fc620, 0x17d2: 0x404fc820, 0x17d3: 0x404fca20, + 0x17d4: 0x404fcc20, 0x17d5: 0x404fce20, 0x17d6: 0x404fd020, 0x17d7: 0x404fd220, + 0x17d8: 0x404fd420, 0x17d9: 0x404fd620, 0x17da: 0x404fd820, 0x17db: 0x404fda20, + 0x17dc: 0x404fdc20, 0x17dd: 0x404fde20, 0x17de: 0x404fe020, 0x17df: 0x404fe220, + 0x17e0: 0x404fe420, 0x17e1: 0x404fe620, 0x17e2: 0x404fe820, 0x17e3: 0x404fec20, + 0x17e4: 0x404fee20, 0x17e5: 0x404ff020, 0x17e6: 0x404ff220, 0x17e7: 0x404ff420, + 0x17e8: 0x404ff620, 0x17e9: 0x404ff820, 0x17ea: 0x404ffa20, 0x17eb: 0x404ffc20, + 0x17ec: 0x404ffe20, 0x17ed: 0x40500020, 0x17ee: 0x40500220, 0x17ef: 0x40500420, + 0x17f0: 0x40500620, 0x17f1: 0x40500820, 0x17f2: 0x40500a20, 0x17f3: 0x40500c20, + 0x17f4: 0xa0000000, 0x17f5: 0xa0000000, 0x17f6: 0x40500e20, 0x17f7: 0x40501020, + 0x17f8: 0x40501220, 0x17f9: 0x40501420, 0x17fa: 0x40501620, 0x17fb: 0x40501820, + 0x17fc: 0x40501a20, 0x17fd: 0x40501c20, 0x17fe: 0x40501e20, 0x17ff: 0x40502020, + // Block 0x60, offset 0x1800 + 0x1800: 0x40502220, 0x1801: 0x40502420, 0x1802: 0x40502620, 0x1803: 0x40502820, + 0x1804: 0x40502a20, 0x1805: 0x40502c20, 0x1806: 0xa000f302, 0x1807: 0xa000f402, + 0x1808: 0xa0011402, 0x1809: 0xa0011502, 0x180a: 0xa0011602, 0x180b: 0xa0005f02, + 0x180c: 0xa0005f02, 0x180d: 0xa0005f02, 0x180e: 0xa0005f02, 0x180f: 0xa0005f02, + 0x1810: 0xa0005f02, 0x1811: 0xa0005f02, 0x1812: 0x82092817, 0x1813: 0xa0000000, + 0x1814: 0x40032620, 0x1815: 0x40032820, 0x1816: 0x4002ac20, 0x1817: 0x4027bc20, + 0x1818: 0x4005bc20, 0x1819: 0x4005be20, 0x181a: 0x4005c020, 0x181b: 0x4027f620, + 0x181c: 0x404fea20, 0x181d: 0xae605f02, + 0x1820: 0xe00001b5, 0x1821: 0xe0000249, 0x1822: 0xe0000361, 0x1823: 0xe000043b, + 0x1824: 0xe0000510, 0x1825: 0xe00005da, 0x1826: 0xe00006a5, 0x1827: 0xe000074d, + 0x1828: 0xe00007f9, 0x1829: 0xe000089e, + 0x1830: 0xe00001b8, 0x1831: 0xe000024c, 0x1832: 0xe0000364, 0x1833: 0xe000043e, + 0x1834: 0xe0000513, 0x1835: 0xe00005dd, 0x1836: 0xe00006a8, 0x1837: 0xe0000750, + 0x1838: 0xe00007fc, 0x1839: 0xe00008a1, + // Block 0x61, offset 0x1840 + 0x1840: 0x40056a20, 0x1841: 0x4002e620, 0x1842: 0x40025220, 0x1843: 0x4002f020, + 0x1844: 0x4002a620, 0x1845: 0x4002a820, 0x1846: 0x40022220, 0x1847: 0x40022420, + 0x1848: 0x40025420, 0x1849: 0x4002f220, 0x184a: 0xa0000000, 0x184b: 0xa0000000, + 0x184c: 0xa0000000, 0x184d: 0xa0000000, 0x184e: 0x40020c20, + 0x1850: 0xe00001c7, 0x1851: 0xe000025b, 0x1852: 0xe0000373, 0x1853: 0xe000044d, + 0x1854: 0xe0000522, 0x1855: 0xe00005ec, 0x1856: 0xe00006b7, 0x1857: 0xe000075f, + 0x1858: 0xe000080b, 0x1859: 0xe00008b0, + 0x1860: 0x40533820, 0x1861: 0x40533c20, 0x1862: 0x40534220, 0x1863: 0x40534e20, + 0x1864: 0x40535220, 0x1865: 0x40535820, 0x1866: 0x40535c20, 0x1867: 0x40536220, + 0x1868: 0x40536420, 0x1869: 0x40536620, 0x186a: 0x40537020, 0x186b: 0x40537420, + 0x186c: 0x40537a20, 0x186d: 0x40537e20, 0x186e: 0x40538820, 0x186f: 0x40538c20, + 0x1870: 0x40538e20, 0x1871: 0x40539020, 0x1872: 0x40539e20, 0x1873: 0x4053a420, + 0x1874: 0x4053aa20, 0x1875: 0x4053b420, 0x1876: 0x4053bc20, 0x1877: 0x4053c220, + 0x1878: 0x4053c620, 0x1879: 0x4053ca20, 0x187a: 0x4053d020, 0x187b: 0x4053da20, + 0x187c: 0x4053dc20, 0x187d: 0x4053e220, 0x187e: 0x4053ea20, 0x187f: 0x4053f020, + // Block 0x62, offset 0x1880 + 0x1880: 0x4053f220, 0x1881: 0x4053f420, 0x1882: 0x4053f620, 0x1883: 0x40533620, + 0x1884: 0x40533e20, 0x1885: 0x40534420, 0x1886: 0x40535020, 0x1887: 0x40535420, + 0x1888: 0x40535a20, 0x1889: 0x40535e20, 0x188a: 0x40536820, 0x188b: 0x40537220, + 0x188c: 0x40537620, 0x188d: 0x40537c20, 0x188e: 0x40538020, 0x188f: 0x40538a20, + 0x1890: 0x4053a020, 0x1891: 0x4053a620, 0x1892: 0x4053ac20, 0x1893: 0x4053b620, + 0x1894: 0x4053de20, 0x1895: 0x4053be20, 0x1896: 0x4053c820, 0x1897: 0x4053d220, + 0x1898: 0x4053e620, 0x1899: 0x4053ec20, 0x189a: 0x4053f820, 0x189b: 0x4053fa20, + 0x189c: 0x4053b020, 0x189d: 0x40534020, 0x189e: 0x40534620, 0x189f: 0x40534c20, + 0x18a0: 0x40536020, 0x18a1: 0x40535620, 0x18a2: 0x40536a20, 0x18a3: 0x4053d420, + 0x18a4: 0x40538220, 0x18a5: 0x40538620, 0x18a6: 0x40537820, 0x18a7: 0x40539220, + 0x18a8: 0x4053a220, 0x18a9: 0x4053a820, 0x18aa: 0x4053b820, 0x18ab: 0x4053cc20, + 0x18ac: 0x4053e820, 0x18ad: 0x4053ee20, 0x18ae: 0x4053e020, 0x18af: 0x4053e420, + 0x18b0: 0x4053fc20, 0x18b1: 0x4053ae20, 0x18b2: 0x4053c020, 0x18b3: 0x40534820, + 0x18b4: 0x4053d620, 0x18b5: 0x4053c420, 0x18b6: 0x4053ce20, 0x18b7: 0x4053ba20, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x40532820, 0x18c1: 0x40532a20, 0x18c2: 0x40532c20, 0x18c3: 0x40532e20, + 0x18c4: 0x40533020, 0x18c5: 0x40533220, 0x18c6: 0x40533420, 0x18c7: 0x40533a20, + 0x18c8: 0x40534a20, 0x18c9: 0x4053d820, 0x18ca: 0x40536c20, 0x18cb: 0x4053b220, + 0x18cc: 0x4053fe20, 0x18cd: 0x40540220, 0x18ce: 0x40540420, 0x18cf: 0x40540820, + 0x18d0: 0x40540a20, 0x18d1: 0x40541020, 0x18d2: 0x40541420, 0x18d3: 0x40541620, + 0x18d4: 0x40541a20, 0x18d5: 0x40541e20, 0x18d6: 0x40542220, 0x18d7: 0x40542420, + 0x18d8: 0x40540c20, 0x18d9: 0x40542020, 0x18da: 0x40538420, 0x18db: 0x40536e20, + 0x18dc: 0x40539420, 0x18dd: 0x40539620, 0x18de: 0x40540020, 0x18df: 0x40540620, + 0x18e0: 0x40540e20, 0x18e1: 0x40541220, 0x18e2: 0x40539820, 0x18e3: 0x40541c20, + 0x18e4: 0x40539a20, 0x18e5: 0x40539c20, 0x18e6: 0x40542620, 0x18e7: 0x40542820, + 0x18e8: 0x40541820, 0x18e9: 0x82e42a16, 0x18ea: 0x40542a20, + 0x18f0: 0x405a1a20, 0x18f1: 0x405a1c20, 0x18f2: 0x405a1e20, 0x18f3: 0x405a2020, + 0x18f4: 0x405a2220, 0x18f5: 0x405a2420, 0x18f6: 0x405a2620, 0x18f7: 0x405a2820, + 0x18f8: 0x405a2a20, 0x18f9: 0x405a2c20, 0x18fa: 0x405a2e20, 0x18fb: 0x405a3020, + 0x18fc: 0x405a3220, 0x18fd: 0x405a3420, 0x18fe: 0x405a3620, 0x18ff: 0x405a3820, + // Block 0x64, offset 0x1900 + 0x1900: 0x405a3a20, 0x1901: 0x405a3c20, 0x1902: 0x405a3e20, 0x1903: 0x405a4020, + 0x1904: 0x405a4220, 0x1905: 0x405a4420, 0x1906: 0x405a4620, 0x1907: 0x405a4820, + 0x1908: 0x405a4a20, 0x1909: 0x405a4c20, 0x190a: 0x405a4e20, 0x190b: 0x405a5020, + 0x190c: 0x405a5220, 0x190d: 0x405a5420, 0x190e: 0x405a5620, 0x190f: 0x405a5820, + 0x1910: 0x405a5a20, 0x1911: 0x405a5c20, 0x1912: 0x405a5e20, 0x1913: 0x405a6020, + 0x1914: 0x405a6220, 0x1915: 0x405a6420, 0x1916: 0x405a6620, 0x1917: 0x405a6820, + 0x1918: 0x405a6a20, 0x1919: 0x405a6c20, 0x191a: 0x405a6e20, 0x191b: 0x405a7020, + 0x191c: 0x405a7220, 0x191d: 0x405a7420, 0x191e: 0x405a7620, 0x191f: 0x405a7820, + 0x1920: 0x405a7a20, 0x1921: 0x405a7c20, 0x1922: 0x405a7e20, 0x1923: 0x405a8020, + 0x1924: 0x405a8220, 0x1925: 0x405a8420, 0x1926: 0x405a8620, 0x1927: 0x405a8820, + 0x1928: 0x405a8a20, 0x1929: 0x405a8c20, 0x192a: 0x405a8e20, 0x192b: 0x405a9020, + 0x192c: 0x405a9220, 0x192d: 0x405a9420, 0x192e: 0x405a9620, 0x192f: 0x405a9820, + 0x1930: 0x405a9a20, 0x1931: 0x405a9c20, 0x1932: 0x405a9e20, 0x1933: 0x405aa020, + 0x1934: 0x405aa220, 0x1935: 0x405aa420, + // Block 0x65, offset 0x1940 + 0x1940: 0x404c1220, 0x1941: 0x404c1420, 0x1942: 0x404c1620, 0x1943: 0x404c1820, + 0x1944: 0x404c1a20, 0x1945: 0x404c1c20, 0x1946: 0x404c1e20, 0x1947: 0x404c2020, + 0x1948: 0x404c2220, 0x1949: 0x404c2420, 0x194a: 0x404c2620, 0x194b: 0x404c2820, + 0x194c: 0x404c2a20, 0x194d: 0x404c2c20, 0x194e: 0x404c2e20, 0x194f: 0x404c3020, + 0x1950: 0x404c3220, 0x1951: 0x404c3420, 0x1952: 0x404c3620, 0x1953: 0x404c3820, + 0x1954: 0x404c3a20, 0x1955: 0x404c3c20, 0x1956: 0x404c3e20, 0x1957: 0x404c4020, + 0x1958: 0x404c4220, 0x1959: 0x404c4420, 0x195a: 0x404c4620, 0x195b: 0x404c4820, + 0x195c: 0x404c4a20, + 0x1960: 0x404c4c20, 0x1961: 0x404c4e20, 0x1962: 0x404c5020, 0x1963: 0x404c5220, + 0x1964: 0x404c5420, 0x1965: 0x404c5620, 0x1966: 0x404c5820, 0x1967: 0x404c5a20, + 0x1968: 0x404c5c20, 0x1969: 0x404c5e20, 0x196a: 0x404c6020, 0x196b: 0x404c6220, + 0x1970: 0x404c6420, 0x1971: 0x404c6620, 0x1972: 0x404c6820, 0x1973: 0x404c6a20, + 0x1974: 0x404c6c20, 0x1975: 0x404c6e20, 0x1976: 0x404c7020, 0x1977: 0x404c7220, + 0x1978: 0x404c7420, 0x1979: 0xade11f02, 0x197a: 0xae612002, 0x197b: 0xadc12102, + // Block 0x66, offset 0x1980 + 0x1980: 0x4007a620, + 0x1984: 0x4002c220, 0x1985: 0x4002d220, 0x1986: 0xe000018e, 0x1987: 0xe000021f, + 0x1988: 0xe000033a, 0x1989: 0xe0000414, 0x198a: 0xe00004e9, 0x198b: 0xe00005b3, + 0x198c: 0xe000067e, 0x198d: 0xe0000726, 0x198e: 0xe00007d2, 0x198f: 0xe0000877, + 0x1990: 0x40503020, 0x1991: 0x40503220, 0x1992: 0x40503420, 0x1993: 0x40503620, + 0x1994: 0x40503820, 0x1995: 0x40503a20, 0x1996: 0x40503c20, 0x1997: 0x40503e20, + 0x1998: 0x40504020, 0x1999: 0x40504220, 0x199a: 0x40504420, 0x199b: 0x40504620, + 0x199c: 0x40504820, 0x199d: 0x40504a20, 0x199e: 0x40504c20, 0x199f: 0x40504e20, + 0x19a0: 0x40505020, 0x19a1: 0x40505220, 0x19a2: 0x40505420, 0x19a3: 0x40505620, + 0x19a4: 0x40505820, 0x19a5: 0x40505a20, 0x19a6: 0x40505c20, 0x19a7: 0x40505e20, + 0x19a8: 0x40506020, 0x19a9: 0x40506220, 0x19aa: 0x40506420, 0x19ab: 0x40506620, + 0x19ac: 0x40506820, 0x19ad: 0x40506a20, + 0x19b0: 0x40506c20, 0x19b1: 0x40506e20, 0x19b2: 0x40507020, 0x19b3: 0x40507220, + 0x19b4: 0x40507420, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x40507620, 0x19c1: 0x40507820, 0x19c2: 0x40507a20, 0x19c3: 0x40507c20, + 0x19c4: 0x40507e20, 0x19c5: 0x40508020, 0x19c6: 0x40508220, 0x19c7: 0x40508420, + 0x19c8: 0x40508620, 0x19c9: 0x40508820, 0x19ca: 0x40508a20, 0x19cb: 0x40508c20, + 0x19cc: 0x40508e20, 0x19cd: 0x40509020, 0x19ce: 0x40509220, 0x19cf: 0x40509420, + 0x19d0: 0x40509620, 0x19d1: 0x40509820, 0x19d2: 0x40509a20, 0x19d3: 0x40509c20, + 0x19d4: 0x40509e20, 0x19d5: 0x4050a020, 0x19d6: 0x4050a220, 0x19d7: 0x4050a420, + 0x19d8: 0x4050a620, 0x19d9: 0x4050a820, 0x19da: 0x4050aa20, 0x19db: 0x4050ac20, + 0x19dc: 0x4050ae20, 0x19dd: 0x4050b020, 0x19de: 0x4050b220, 0x19df: 0x4050b420, + 0x19e0: 0x4050b620, 0x19e1: 0x4050b820, 0x19e2: 0x4050ba20, 0x19e3: 0x4050bc20, + 0x19e4: 0x4050be20, 0x19e5: 0x4050c020, 0x19e6: 0x4050c220, 0x19e7: 0x4050c420, + 0x19e8: 0x4050c620, 0x19e9: 0x4050c820, 0x19ea: 0x4050ca20, 0x19eb: 0x4050cc20, + 0x19f0: 0x4050ce20, 0x19f1: 0x4050d020, 0x19f2: 0x4050d220, 0x19f3: 0x4050d420, + 0x19f4: 0x4050d620, 0x19f5: 0x4050d820, 0x19f6: 0x4050da20, 0x19f7: 0x4050dc20, + 0x19f8: 0x4050de20, 0x19f9: 0x4050e020, 0x19fa: 0x4050e220, 0x19fb: 0x4050e420, + 0x19fc: 0x4050e620, 0x19fd: 0x4050e820, 0x19fe: 0x4050ea20, 0x19ff: 0x4050ec20, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x4050ee20, 0x1a01: 0x4050f020, 0x1a02: 0x4050f220, 0x1a03: 0x4050f420, + 0x1a04: 0x4050f620, 0x1a05: 0x4050f820, 0x1a06: 0x4050fa20, 0x1a07: 0x4050fc20, + 0x1a08: 0x4050fe20, 0x1a09: 0x40510020, + 0x1a10: 0xe0000191, 0x1a11: 0xe0000222, 0x1a12: 0xe000033d, 0x1a13: 0xe0000417, + 0x1a14: 0xe00004ec, 0x1a15: 0xe00005b6, 0x1a16: 0xe0000681, 0x1a17: 0xe0000729, + 0x1a18: 0xe00007d5, 0x1a19: 0xe000087a, 0x1a1a: 0xe0000225, + 0x1a1e: 0xe0002022, 0x1a1f: 0xe0002025, + 0x1a20: 0x4007b220, 0x1a21: 0x4007b420, 0x1a22: 0x4007b620, 0x1a23: 0x4007b820, + 0x1a24: 0x4007ba20, 0x1a25: 0x4007bc20, 0x1a26: 0x4007be20, 0x1a27: 0x4007c020, + 0x1a28: 0x4007c220, 0x1a29: 0x4007c420, 0x1a2a: 0x4007c620, 0x1a2b: 0x4007c820, + 0x1a2c: 0x4007ca20, 0x1a2d: 0x4007cc20, 0x1a2e: 0x4007ce20, 0x1a2f: 0x4007d020, + 0x1a30: 0x4007d220, 0x1a31: 0x4007d420, 0x1a32: 0x4007d620, 0x1a33: 0x4007d820, + 0x1a34: 0x4007da20, 0x1a35: 0x4007dc20, 0x1a36: 0x4007de20, 0x1a37: 0x4007e020, + 0x1a38: 0x4007e220, 0x1a39: 0x4007e420, 0x1a3a: 0x4007e620, 0x1a3b: 0x4007e820, + 0x1a3c: 0x4007ea20, 0x1a3d: 0x4007ec20, 0x1a3e: 0x4007ee20, 0x1a3f: 0x4007f020, + // Block 0x69, offset 0x1a40 + 0x1a40: 0x404d1420, 0x1a41: 0x404d1620, 0x1a42: 0x404d1820, 0x1a43: 0x404d1a20, + 0x1a44: 0x404d1c20, 0x1a45: 0x404d1e20, 0x1a46: 0x404d2020, 0x1a47: 0x404d2220, + 0x1a48: 0x404d2420, 0x1a49: 0x404d2620, 0x1a4a: 0x404d2820, 0x1a4b: 0x404d2a20, + 0x1a4c: 0x404d2c20, 0x1a4d: 0x404d2e20, 0x1a4e: 0x404d3020, 0x1a4f: 0x404d3220, + 0x1a50: 0x404d3420, 0x1a51: 0x404d3620, 0x1a52: 0x404d3820, 0x1a53: 0x404d3a20, + 0x1a54: 0x404d3c20, 0x1a55: 0x404d3e20, 0x1a56: 0x404d4020, 0x1a57: 0x82e626a1, + 0x1a58: 0x82dc26a2, 0x1a59: 0x404d4620, 0x1a5a: 0x404d4820, 0x1a5b: 0x404d4a20, + 0x1a5e: 0x40036620, 0x1a5f: 0x40036820, + 0x1a60: 0x40510220, 0x1a61: 0x40510420, 0x1a62: 0x40510620, 0x1a63: 0x40510820, + 0x1a64: 0x40510a20, 0x1a65: 0x40510c20, 0x1a66: 0x40510e20, 0x1a67: 0x40511020, + 0x1a68: 0x40511220, 0x1a69: 0x40511420, 0x1a6a: 0x40511620, 0x1a6b: 0x40511820, + 0x1a6c: 0x40511a20, 0x1a6d: 0x40511c20, 0x1a6e: 0x40511e20, 0x1a6f: 0x40512020, + 0x1a70: 0x40512220, 0x1a71: 0x40512420, 0x1a72: 0x40512620, 0x1a73: 0x40512820, + 0x1a74: 0x40512a20, 0x1a75: 0x40512c20, 0x1a76: 0x40512e20, 0x1a77: 0x40513020, + 0x1a78: 0x40513220, 0x1a79: 0x40513420, 0x1a7a: 0x40513620, 0x1a7b: 0x40513820, + 0x1a7c: 0x40513a20, 0x1a7d: 0x40513c20, 0x1a7e: 0x40513e20, 0x1a7f: 0x40514020, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x40514220, 0x1a81: 0x40514420, 0x1a82: 0x40514620, 0x1a83: 0x40514820, + 0x1a84: 0x40514a20, 0x1a85: 0x40514c20, 0x1a86: 0x40514e20, 0x1a87: 0x40515020, + 0x1a88: 0x40515220, 0x1a89: 0x40515420, 0x1a8a: 0x40515620, 0x1a8b: 0x40515820, + 0x1a8c: 0x40515a20, 0x1a8d: 0x40516c20, 0x1a8e: 0x40516e20, 0x1a8f: 0x40517020, + 0x1a90: 0x40517220, 0x1a91: 0x40517420, 0x1a92: 0x40517620, 0x1a93: 0x40515c20, + 0x1a94: 0xe0002029, 0x1a95: 0x40516020, 0x1a96: 0x40516220, 0x1a97: 0x40516420, + 0x1a98: 0x00510e84, 0x1a99: 0x00510e84, 0x1a9a: 0x00513884, 0x1a9b: 0x00513884, + 0x1a9c: 0x40516620, 0x1a9d: 0x40516820, 0x1a9e: 0x40516a20, + 0x1aa0: 0x820928cd, 0x1aa1: 0x40517820, 0x1aa2: 0x40517c20, 0x1aa3: 0x40517e20, + 0x1aa4: 0x00517e84, 0x1aa5: 0x40518020, 0x1aa6: 0x40518220, 0x1aa7: 0x40518420, + 0x1aa8: 0x40518620, 0x1aa9: 0x40518820, 0x1aaa: 0x40518a20, 0x1aab: 0x40515e20, + 0x1aac: 0x40517a20, 0x1aad: 0x40519820, 0x1aae: 0x40518c20, 0x1aaf: 0x40518e20, + 0x1ab0: 0x40519220, 0x1ab1: 0x40519420, 0x1ab2: 0x40519620, 0x1ab3: 0x40519020, + 0x1ab4: 0xa000f302, 0x1ab5: 0xae611702, 0x1ab6: 0xae611802, 0x1ab7: 0xae611902, + 0x1ab8: 0xae611a02, 0x1ab9: 0xae611b02, 0x1aba: 0xae611c02, 0x1abb: 0xae611d02, + 0x1abc: 0xae611e02, 0x1abf: 0xadc00000, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0xe0000194, 0x1ac1: 0xe0000228, 0x1ac2: 0xe0000340, 0x1ac3: 0xe000041a, + 0x1ac4: 0xe00004ef, 0x1ac5: 0xe00005b9, 0x1ac6: 0xe0000684, 0x1ac7: 0xe000072c, + 0x1ac8: 0xe00007d8, 0x1ac9: 0xe000087d, + 0x1ad0: 0xe0000197, 0x1ad1: 0xe000022b, 0x1ad2: 0xe0000343, 0x1ad3: 0xe000041d, + 0x1ad4: 0xe00004f2, 0x1ad5: 0xe00005bc, 0x1ad6: 0xe0000687, 0x1ad7: 0xe000072f, + 0x1ad8: 0xe00007db, 0x1ad9: 0xe0000880, + 0x1ae0: 0x4005c220, 0x1ae1: 0x4005c420, 0x1ae2: 0x4005c620, 0x1ae3: 0x4005c820, + 0x1ae4: 0x4005ca20, 0x1ae5: 0x4005cc20, 0x1ae6: 0x4005ce20, 0x1ae7: 0x4027be20, + 0x1ae8: 0x40032a20, 0x1ae9: 0x40032c20, 0x1aea: 0x40032e20, 0x1aeb: 0x40033020, + 0x1aec: 0x4005d020, 0x1aed: 0x4005d220, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0xa000f202, 0x1b01: 0xa000f202, 0x1b02: 0xa000f302, 0x1b03: 0xa000f702, + 0x1b04: 0xa000f402, 0x1b05: 0xc3190821, 0x1b06: 0x40522820, 0x1b07: 0xc31b0821, + 0x1b08: 0x40522c20, 0x1b09: 0xc31d0821, 0x1b0a: 0x40523020, 0x1b0b: 0xc31f0821, + 0x1b0c: 0x40523420, 0x1b0d: 0xc3210821, 0x1b0e: 0x40523820, 0x1b0f: 0x40523a20, + 0x1b10: 0x40523c20, 0x1b11: 0xc3230821, 0x1b12: 0x40524020, 0x1b13: 0x40524220, + 0x1b14: 0x40524820, 0x1b15: 0x40524a20, 0x1b16: 0x40524c20, 0x1b17: 0x40524e20, + 0x1b18: 0x40525020, 0x1b19: 0x40525220, 0x1b1a: 0x40525420, 0x1b1b: 0x40525620, + 0x1b1c: 0x40525820, 0x1b1d: 0x40525a20, 0x1b1e: 0x40525c20, 0x1b1f: 0x40525e20, + 0x1b20: 0x40526020, 0x1b21: 0x40526220, 0x1b22: 0x40526420, 0x1b23: 0x40526820, + 0x1b24: 0x40526a20, 0x1b25: 0x40526c20, 0x1b26: 0x40526e20, 0x1b27: 0x40527020, + 0x1b28: 0x40527420, 0x1b29: 0x40527620, 0x1b2a: 0x40527820, 0x1b2b: 0x40527a20, + 0x1b2c: 0x40527c20, 0x1b2d: 0x40527e20, 0x1b2e: 0x40528020, 0x1b2f: 0x40528220, + 0x1b30: 0x40528620, 0x1b31: 0x40528820, 0x1b32: 0x40528a20, 0x1b33: 0x40529020, + 0x1b34: 0xa070f102, 0x1b35: 0x40529220, 0x1b36: 0x40529420, 0x1b37: 0x40529620, + 0x1b38: 0x40529820, 0x1b39: 0x40529a20, 0x1b3a: 0xc3250821, 0x1b3b: 0x40529e20, + 0x1b3c: 0xc3270821, 0x1b3d: 0x4052a220, 0x1b3e: 0xc3290821, 0x1b3f: 0xc32b0821, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0x4052a820, 0x1b41: 0x4052aa20, 0x1b42: 0xc32d0821, 0x1b43: 0x4052ae20, + 0x1b44: 0x82092958, 0x1b45: 0x40524420, 0x1b46: 0x40524620, 0x1b47: 0x40526620, + 0x1b48: 0x40527220, 0x1b49: 0x40528420, 0x1b4a: 0x40528c20, 0x1b4b: 0x40528e20, + 0x1b50: 0xe00001be, 0x1b51: 0xe0000252, 0x1b52: 0xe000036a, 0x1b53: 0xe0000444, + 0x1b54: 0xe0000519, 0x1b55: 0xe00005e3, 0x1b56: 0xe00006ae, 0x1b57: 0xe0000756, + 0x1b58: 0xe0000802, 0x1b59: 0xe00008a7, 0x1b5a: 0x40036a20, 0x1b5b: 0x40036c20, + 0x1b5c: 0x4002f620, 0x1b5d: 0x4002ae20, 0x1b5e: 0x40033220, 0x1b5f: 0x40033420, + 0x1b60: 0x40022020, 0x1b61: 0x4007f220, 0x1b62: 0x4007f420, 0x1b63: 0x4007f620, + 0x1b64: 0x4007f820, 0x1b65: 0x4007fa20, 0x1b66: 0x4007fc20, 0x1b67: 0x4007fe20, + 0x1b68: 0x40080020, 0x1b69: 0x40080220, 0x1b6a: 0x40080420, 0x1b6b: 0xae600000, + 0x1b6c: 0xadc00000, 0x1b6d: 0xae600000, 0x1b6e: 0xae600000, 0x1b6f: 0xae600000, + 0x1b70: 0xae600000, 0x1b71: 0xae600000, 0x1b72: 0xae600000, 0x1b73: 0xae600000, + 0x1b74: 0x40080620, 0x1b75: 0x40080820, 0x1b76: 0x40080a20, 0x1b77: 0x40080c20, + 0x1b78: 0x40080e20, 0x1b79: 0x40081020, 0x1b7a: 0x40081220, 0x1b7b: 0x40081420, + 0x1b7c: 0x40081620, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0xa000f302, 0x1b81: 0xa000f902, 0x1b82: 0xa000f402, 0x1b83: 0x4047d420, + 0x1b84: 0x4047d620, 0x1b85: 0x4047d820, 0x1b86: 0x4047da20, 0x1b87: 0x4047dc20, + 0x1b88: 0x4047de20, 0x1b89: 0x4047e020, 0x1b8a: 0x4047e220, 0x1b8b: 0x4047e620, + 0x1b8c: 0x4047e820, 0x1b8d: 0x4047ea20, 0x1b8e: 0x4047ec20, 0x1b8f: 0x4047ee20, + 0x1b90: 0x4047f020, 0x1b91: 0x4047f220, 0x1b92: 0x4047f420, 0x1b93: 0x4047f620, + 0x1b94: 0x4047f820, 0x1b95: 0x4047fa20, 0x1b96: 0x4047fc20, 0x1b97: 0x4047fe20, + 0x1b98: 0x40480020, 0x1b99: 0x40480420, 0x1b9a: 0x40480820, 0x1b9b: 0x40480c20, + 0x1b9c: 0x40481220, 0x1b9d: 0x40481820, 0x1b9e: 0x40481c20, 0x1b9f: 0x40481e20, + 0x1ba0: 0x40482220, 0x1ba1: 0x40480a20, 0x1ba2: 0x40480e20, 0x1ba3: 0x40481420, + 0x1ba4: 0x40482420, 0x1ba5: 0x40482620, 0x1ba6: 0x40482820, 0x1ba7: 0x40482a20, + 0x1ba8: 0x40482c20, 0x1ba9: 0x40482e20, 0x1baa: 0x82092418, 0x1bab: 0x82092419, + 0x1bac: 0x40480620, 0x1bad: 0x40481a20, 0x1bae: 0x4047e420, 0x1baf: 0x40482020, + 0x1bb0: 0xe00001c4, 0x1bb1: 0xe0000258, 0x1bb2: 0xe0000370, 0x1bb3: 0xe000044a, + 0x1bb4: 0xe000051f, 0x1bb5: 0xe00005e9, 0x1bb6: 0xe00006b4, 0x1bb7: 0xe000075c, + 0x1bb8: 0xe0000808, 0x1bb9: 0xe00008ad, 0x1bba: 0x0047d484, 0x1bbb: 0x40481020, + 0x1bbc: 0x40481620, 0x1bbd: 0x40480220, 0x1bbe: 0x0047e299, 0x1bbf: 0x00480499, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x404d4c20, 0x1bc1: 0x004d4c84, 0x1bc2: 0x404d4e20, 0x1bc3: 0x004d4e84, + 0x1bc4: 0x004d4e84, 0x1bc5: 0x404d5020, 0x1bc6: 0x004d5084, 0x1bc7: 0x404d5220, + 0x1bc8: 0x004d5284, 0x1bc9: 0x404d5420, 0x1bca: 0x004d5484, 0x1bcb: 0x404d5620, + 0x1bcc: 0x004d5684, 0x1bcd: 0x004d5684, 0x1bce: 0x404d5820, 0x1bcf: 0x004d5884, + 0x1bd0: 0x404d5a20, 0x1bd1: 0x404d5c20, 0x1bd2: 0x404d5e20, 0x1bd3: 0x004d5e84, + 0x1bd4: 0x404d6020, 0x1bd5: 0x004d6084, 0x1bd6: 0x404d6220, 0x1bd7: 0x004d6284, + 0x1bd8: 0x404d6420, 0x1bd9: 0x004d6484, 0x1bda: 0x004d6484, 0x1bdb: 0x404d6620, + 0x1bdc: 0x004d6684, 0x1bdd: 0x404d6820, 0x1bde: 0x404d6a20, 0x1bdf: 0x004d6a84, + 0x1be0: 0x404d6c20, 0x1be1: 0x404d6e20, 0x1be2: 0x404d7020, 0x1be3: 0x404d7220, + 0x1be4: 0x404d7420, 0x1be5: 0x404d7620, 0x1be6: 0xa070f102, 0x1be7: 0x404d7820, + 0x1be8: 0x004d7884, 0x1be9: 0x404d7a20, 0x1bea: 0x404d7c20, 0x1beb: 0x004d7c84, + 0x1bec: 0x404d7e20, 0x1bed: 0x004d7e84, 0x1bee: 0x404d8020, 0x1bef: 0x004d8084, + 0x1bf0: 0x404d8220, 0x1bf1: 0x404d8420, 0x1bf2: 0x820926c3, 0x1bf3: 0x820926c4, + 0x1bfc: 0x4005ec20, 0x1bfd: 0x4005ee20, 0x1bfe: 0x4005f020, 0x1bff: 0x4005f220, + // Block 0x70, offset 0x1c00 + 0x1c00: 0x404b3620, 0x1c01: 0x404b3820, 0x1c02: 0x404b3a20, 0x1c03: 0x404b3c20, + 0x1c04: 0x404b3e20, 0x1c05: 0x404b4020, 0x1c06: 0x404b4220, 0x1c07: 0x404b4420, + 0x1c08: 0x404b4620, 0x1c09: 0x404b4820, 0x1c0a: 0x404b5020, 0x1c0b: 0x404b5220, + 0x1c0c: 0x404b5420, 0x1c0d: 0x404b5620, 0x1c0e: 0x404b5820, 0x1c0f: 0x404b5a20, + 0x1c10: 0x404b5c20, 0x1c11: 0x404b5e20, 0x1c12: 0x404b6020, 0x1c13: 0x404b6220, + 0x1c14: 0x404b6420, 0x1c15: 0x404b6620, 0x1c16: 0x404b6820, 0x1c17: 0x404b6a20, + 0x1c18: 0x404b6c20, 0x1c19: 0x404b6e20, 0x1c1a: 0x404b7020, 0x1c1b: 0x404b7420, + 0x1c1c: 0x404b7820, 0x1c1d: 0x404b7a20, 0x1c1e: 0x404b7c20, 0x1c1f: 0x404b7e20, + 0x1c20: 0x404b8020, 0x1c21: 0x404b8220, 0x1c22: 0x404b8420, 0x1c23: 0x404b8620, + 0x1c24: 0x404b7220, 0x1c25: 0x404b7620, 0x1c26: 0x404b8a20, 0x1c27: 0x404b8c20, + 0x1c28: 0x404b8e20, 0x1c29: 0x404b9020, 0x1c2a: 0x404b9220, 0x1c2b: 0x404b9420, + 0x1c2c: 0x404b9620, 0x1c2d: 0x404b9820, 0x1c2e: 0x404b9a20, 0x1c2f: 0x404b9c20, + 0x1c30: 0x404b9e20, 0x1c31: 0x404ba020, 0x1c32: 0x404ba220, 0x1c33: 0x404ba420, + 0x1c34: 0x404ba620, 0x1c35: 0x404ba820, 0x1c36: 0x404b8820, 0x1c37: 0xa070f102, + 0x1c3b: 0x40031420, + 0x1c3c: 0x40031620, 0x1c3d: 0x4005ae20, 0x1c3e: 0x4005b020, 0x1c3f: 0x4005b220, + // Block 0x71, offset 0x1c40 + 0x1c40: 0xe00001a6, 0x1c41: 0xe000023a, 0x1c42: 0xe0000352, 0x1c43: 0xe000042c, + 0x1c44: 0xe0000501, 0x1c45: 0xe00005cb, 0x1c46: 0xe0000696, 0x1c47: 0xe000073e, + 0x1c48: 0xe00007ea, 0x1c49: 0xe000088f, + 0x1c4d: 0x404b4a20, 0x1c4e: 0x404b4c20, 0x1c4f: 0x404b4e20, + 0x1c50: 0xe00001ca, 0x1c51: 0xe000025e, 0x1c52: 0xe0000376, 0x1c53: 0xe0000450, + 0x1c54: 0xe0000525, 0x1c55: 0xe00005ef, 0x1c56: 0xe00006ba, 0x1c57: 0xe0000762, + 0x1c58: 0xe000080e, 0x1c59: 0xe00008b3, 0x1c5a: 0x40542e20, 0x1c5b: 0x40543020, + 0x1c5c: 0x40543220, 0x1c5d: 0x40543420, 0x1c5e: 0x40543620, 0x1c5f: 0x40543820, + 0x1c60: 0x40543a20, 0x1c61: 0x40543c20, 0x1c62: 0x40543e20, 0x1c63: 0x40544020, + 0x1c64: 0x40544220, 0x1c65: 0x40544420, 0x1c66: 0x40544620, 0x1c67: 0x40544820, + 0x1c68: 0x40544a20, 0x1c69: 0x40544c20, 0x1c6a: 0x40544e20, 0x1c6b: 0x40545020, + 0x1c6c: 0x40545220, 0x1c6d: 0x40545420, 0x1c6e: 0x40545620, 0x1c6f: 0x40545820, + 0x1c70: 0x40545a20, 0x1c71: 0x40545c20, 0x1c72: 0x40545e20, 0x1c73: 0x40546020, + 0x1c74: 0x40546220, 0x1c75: 0x40546420, 0x1c76: 0x40546620, 0x1c77: 0x40546820, + 0x1c78: 0x40546a20, 0x1c79: 0x40546c20, 0x1c7a: 0x40546e20, 0x1c7b: 0x40547020, + 0x1c7c: 0x40547220, 0x1c7d: 0x40547420, 0x1c7e: 0x40035820, 0x1c7f: 0x40035a20, + // Block 0x72, offset 0x1c80 + 0x1c80: 0x4005d620, 0x1c81: 0x4005d820, 0x1c82: 0x4005da20, 0x1c83: 0x4005dc20, + 0x1c84: 0x4005de20, 0x1c85: 0x4005e020, 0x1c86: 0x4005e220, 0x1c87: 0x4005e420, + 0x1c90: 0xae600000, 0x1c91: 0xae600000, 0x1c92: 0xae600000, 0x1c93: 0xa0000000, + 0x1c94: 0xa0100000, 0x1c95: 0xadc00000, 0x1c96: 0xadc00000, 0x1c97: 0xadc00000, + 0x1c98: 0xadc00000, 0x1c99: 0xadc00000, 0x1c9a: 0xae600000, 0x1c9b: 0xae600000, + 0x1c9c: 0xadc00000, 0x1c9d: 0xadc00000, 0x1c9e: 0xadc00000, 0x1c9f: 0xadc00000, + 0x1ca0: 0xae600000, 0x1ca1: 0xa0000000, 0x1ca2: 0xa0100000, 0x1ca3: 0xa0100000, + 0x1ca4: 0xa0100000, 0x1ca5: 0xa0100000, 0x1ca6: 0xa0100000, 0x1ca7: 0xa0100000, + 0x1ca8: 0xa0100000, 0x1ca9: 0x40404020, 0x1caa: 0x00404084, 0x1cab: 0x00404084, + 0x1cac: 0x00404084, 0x1cad: 0xadc0f302, 0x1cae: 0x00404084, 0x1caf: 0x00404084, + 0x1cb0: 0x00404084, 0x1cb1: 0x00404084, 0x1cb2: 0xa000f402, 0x1cb3: 0xa000f402, + 0x1cb4: 0xae600000, 0x1cb5: 0x40404220, 0x1cb6: 0x40404420, + // Block 0x73, offset 0x1cc0 + 0x1cc0: 0x402be620, 0x1cc1: 0x402bec20, 0x1cc2: 0x402bee20, 0x1cc3: 0x402c2420, + 0x1cc4: 0x402c4220, 0x1cc5: 0x402c6a20, 0x1cc6: 0x402c6c20, 0x1cc7: 0x402ca020, + 0x1cc8: 0x402ce620, 0x1cc9: 0x402db420, 0x1cca: 0x402ddc20, 0x1ccb: 0x402e0620, + 0x1ccc: 0x402e3420, 0x1ccd: 0x402e8a20, 0x1cce: 0x402eb020, 0x1ccf: 0x402eea20, + 0x1cd0: 0x402f0220, 0x1cd1: 0x402eec20, 0x1cd2: 0x402f0420, 0x1cd3: 0x402ef820, + 0x1cd4: 0x402ef620, 0x1cd5: 0x402f2a20, 0x1cd6: 0x402f0a20, 0x1cd7: 0x402f0c20, + 0x1cd8: 0x402f3420, 0x1cd9: 0x402f8c20, 0x1cda: 0x402fa020, 0x1cdb: 0x40303420, + 0x1cdc: 0x40307420, 0x1cdd: 0x40307620, 0x1cde: 0x40307820, 0x1cdf: 0x4030aa20, + 0x1ce0: 0x4030c620, 0x1ce1: 0x4030ea20, 0x1ce2: 0x40313220, 0x1ce3: 0x40316c20, + 0x1ce4: 0x4031f420, 0x1ce5: 0x4031f620, 0x1ce6: 0x40325820, 0x1ce7: 0x40327420, + 0x1ce8: 0x40328020, 0x1ce9: 0x40328a20, 0x1cea: 0x4032a020, 0x1ceb: 0x40348c20, + 0x1cec: 0x002bde9d, 0x1ced: 0xe00009e1, 0x1cee: 0x002c0a9d, 0x1cef: 0x402c2220, + 0x1cf0: 0x002c629d, 0x1cf1: 0x002c989d, 0x1cf2: 0x002cae9d, 0x1cf3: 0x002d229d, + 0x1cf4: 0x002d689d, 0x1cf5: 0x002d9a9d, 0x1cf6: 0x002dcc9d, 0x1cf7: 0x002dfe9d, + 0x1cf8: 0x002e229d, 0x1cf9: 0x002e829d, 0x1cfa: 0x002e9e9d, 0x1cfb: 0x402eae20, + 0x1cfc: 0x002ee29d, 0x1cfd: 0x002f229d, 0x1cfe: 0x002f2c9d, 0x1cff: 0x002f7a9d, + // Block 0x74, offset 0x1d00 + 0x1d00: 0x00302c9d, 0x1d01: 0x00306c9d, 0x1d02: 0x0030e29d, 0x1d03: 0x002bde94, + 0x1d04: 0x002bf094, 0x1d05: 0x002bf894, 0x1d06: 0x002bee94, 0x1d07: 0x002c0a94, + 0x1d08: 0x002c6294, 0x1d09: 0x002c9894, 0x1d0a: 0x002cb894, 0x1d0b: 0x002cc294, + 0x1d0c: 0x002ce694, 0x1d0d: 0x002d2294, 0x1d0e: 0x002db494, 0x1d0f: 0x002dfe94, + 0x1d10: 0x002e8294, 0x1d11: 0x002eda94, 0x1d12: 0x002ee294, 0x1d13: 0x002efa94, + 0x1d14: 0x002f0a94, 0x1d15: 0x002f0c94, 0x1d16: 0x002f2c94, 0x1d17: 0x00302c94, + 0x1d18: 0x00306c94, 0x1d19: 0x00307694, 0x1d1a: 0x0030a094, 0x1d1b: 0x0030be94, + 0x1d1c: 0x0031f694, 0x1d1d: 0x00325494, 0x1d1e: 0x00325694, 0x1d1f: 0x00325a94, + 0x1d20: 0x00329a94, 0x1d21: 0x00329c94, 0x1d22: 0x002d9a95, 0x1d23: 0x002f7a95, + 0x1d24: 0x00306c95, 0x1d25: 0x0030be95, 0x1d26: 0x00325495, 0x1d27: 0x00325695, + 0x1d28: 0x00328895, 0x1d29: 0x00329a95, 0x1d2a: 0x00329c95, 0x1d2b: 0x40307a20, + 0x1d2c: 0x402c2620, 0x1d2d: 0x402c6e20, 0x1d2e: 0x402d1220, 0x1d2f: 0x402e8c20, + 0x1d30: 0x402eb220, 0x1d31: 0x402f3a20, 0x1d32: 0x402f9620, 0x1d33: 0x402fce20, + 0x1d34: 0x402ff020, 0x1d35: 0x40304020, 0x1d36: 0x40313c20, 0x1d37: 0x402d5420, + 0x1d38: 0x0034ba94, 0x1d39: 0xe0000bd9, 0x1d3a: 0xe0000fc1, 0x1d3b: 0x402dbe20, + 0x1d3c: 0x402dca20, 0x1d3d: 0x402f3620, 0x1d3e: 0x40308420, 0x1d3f: 0x4030bc20, + // Block 0x75, offset 0x1d40 + 0x1d40: 0x402c2820, 0x1d41: 0x402c7020, 0x1d42: 0x402d1420, 0x1d43: 0x402d4220, + 0x1d44: 0x402e0820, 0x1d45: 0x402e5220, 0x1d46: 0x402e8e20, 0x1d47: 0x402ec620, + 0x1d48: 0x402f3c20, 0x1d49: 0x402faa20, 0x1d4a: 0x402ff220, 0x1d4b: 0x40301020, + 0x1d4c: 0x4030ca20, 0x1d4d: 0x4030fe20, 0x1d4e: 0x40313e20, 0x1d4f: 0x402bea20, + 0x1d50: 0x402c0020, 0x1d51: 0x402c8220, 0x1d52: 0x402caa20, 0x1d53: 0x402cca20, + 0x1d54: 0x402ce420, 0x1d55: 0x402cc020, 0x1d56: 0x402dc020, 0x1d57: 0x402f0620, + 0x1d58: 0x40302220, 0x1d59: 0x40308620, 0x1d5a: 0x40317620, 0x1d5b: 0x002c0294, + 0x1d5c: 0x002c3a94, 0x1d5d: 0x002c5694, 0x1d5e: 0xf0001414, 0x1d5f: 0x002cdc94, + 0x1d60: 0x002d0894, 0x1d61: 0x002dee94, 0x1d62: 0x002d2a94, 0x1d63: 0x00308894, + 0x1d64: 0x002db694, 0x1d65: 0x002dc294, 0x1d66: 0x002daa94, 0x1d67: 0x002dbe94, + 0x1d68: 0x002de694, 0x1d69: 0x002e5494, 0x1d6a: 0x002e5294, 0x1d6b: 0x002e2a94, + 0x1d6c: 0x002e9094, 0x1d6d: 0x0030ac94, 0x1d6e: 0x002eb494, 0x1d6f: 0x002ec894, + 0x1d70: 0x002ea694, 0x1d71: 0x002f1094, 0x1d72: 0x002f4c94, 0x1d73: 0x002ff494, + 0x1d74: 0x00300894, 0x1d75: 0x00304294, 0x1d76: 0x00307c94, 0x1d77: 0x0030b494, + 0x1d78: 0x00307494, 0x1d79: 0x0030cc94, 0x1d7a: 0x0030da94, 0x1d7b: 0x00312a94, + 0x1d7c: 0x00314894, 0x1d7d: 0x00315094, 0x1d7e: 0x00316494, 0x1d7f: 0x00326a94, + // Block 0x76, offset 0x1d80 + 0x1d80: 0xae605f02, 0x1d81: 0xae605f02, 0x1d82: 0xadc06002, 0x1d83: 0xae605f02, + 0x1d84: 0xae605f02, 0x1d85: 0xae605f02, 0x1d86: 0xae605f02, 0x1d87: 0xae605f02, + 0x1d88: 0xae605f02, 0x1d89: 0xae605f02, 0x1d8a: 0x84dc17bd, 0x1d8b: 0xae605f02, + 0x1d8c: 0xae605f02, 0x1d8d: 0xaea05f02, 0x1d8e: 0xad605f02, 0x1d8f: 0xadc06002, + 0x1d90: 0xaca06002, 0x1d91: 0xae605f02, 0x1d92: 0x84e618d1, 0x1d93: 0xe00009b4, + 0x1d94: 0xe00009d9, 0x1d95: 0xe00009f9, 0x1d96: 0xe0000a08, 0x1d97: 0xe0000a50, + 0x1d98: 0xe0000ab6, 0x1d99: 0xe0000ab0, 0x1d9a: 0x84e61691, 0x1d9b: 0x84e61699, + 0x1d9c: 0x84e616ff, 0x1d9d: 0x84e61711, 0x1d9e: 0x84e61715, 0x1d9f: 0x84e61745, + 0x1da0: 0x84e6174f, 0x1da1: 0x84e61753, 0x1da2: 0x84e617c1, 0x1da3: 0x84e617c5, + 0x1da4: 0x84e617f3, 0x1da5: 0xe0000f67, 0x1da6: 0x84e61895, + 0x1dbc: 0xae906002, 0x1dbd: 0xadc06002, 0x1dbe: 0xae605f02, 0x1dbf: 0xadc06002, + // Block 0x77, offset 0x1dc0 + 0x1dc0: 0xe00009b1, 0x1dc1: 0xe00009ae, 0x1dc2: 0xe0000a22, 0x1dc3: 0xe0000a1f, + 0x1dc4: 0xe0000a28, 0x1dc5: 0xe0000a25, 0x1dc6: 0xe0000a2e, 0x1dc7: 0xe0000a2b, + 0x1dc8: 0xe0000a5a, 0x1dc9: 0xe0000a56, 0x1dca: 0xe0000a8c, 0x1dcb: 0xe0000a89, + 0x1dcc: 0xe0000a98, 0x1dcd: 0xe0000a95, 0x1dce: 0xe0000aa4, 0x1dcf: 0xe0000aa1, + 0x1dd0: 0xe0000a92, 0x1dd1: 0xe0000a8f, 0x1dd2: 0xe0000a9e, 0x1dd3: 0xe0000a9b, + 0x1dd4: 0xe0000b55, 0x1dd5: 0xe0000b51, 0x1dd6: 0xe0000b4d, 0x1dd7: 0xe0000b49, + 0x1dd8: 0xe0000b7c, 0x1dd9: 0xe0000b79, 0x1dda: 0xe0000b82, 0x1ddb: 0xe0000b7f, + 0x1ddc: 0xe0000b39, 0x1ddd: 0xe0000b35, 0x1dde: 0xe0000b8c, 0x1ddf: 0xe0000b89, + 0x1de0: 0xe0000bd0, 0x1de1: 0xe0000bcd, 0x1de2: 0xe0000c00, 0x1de3: 0xe0000bfd, + 0x1de4: 0xe0000c0c, 0x1de5: 0xe0000c09, 0x1de6: 0xe0000bfa, 0x1de7: 0xe0000bf7, + 0x1de8: 0xe0000c06, 0x1de9: 0xe0000c03, 0x1dea: 0xe0000c12, 0x1deb: 0xe0000c0f, + 0x1dec: 0xe0000c7e, 0x1ded: 0xe0000c7b, 0x1dee: 0xe0000c4a, 0x1def: 0xe0000c46, + 0x1df0: 0xe0000c93, 0x1df1: 0xe0000c90, 0x1df2: 0xe0000cab, 0x1df3: 0xe0000ca8, + 0x1df4: 0xe0000cb1, 0x1df5: 0xe0000cae, 0x1df6: 0xe0000cde, 0x1df7: 0xe0000cdb, + 0x1df8: 0xe0000ce5, 0x1df9: 0xe0000ce1, 0x1dfa: 0xe0000cf2, 0x1dfb: 0xe0000cef, + 0x1dfc: 0xe0000cec, 0x1dfd: 0xe0000ce9, 0x1dfe: 0xe0000d1e, 0x1dff: 0xe0000d1b, + // Block 0x78, offset 0x1e00 + 0x1e00: 0xe0000d24, 0x1e01: 0xe0000d21, 0x1e02: 0xe0000d2a, 0x1e03: 0xe0000d27, + 0x1e04: 0xe0000d69, 0x1e05: 0xe0000d66, 0x1e06: 0xe0000d7b, 0x1e07: 0xe0000d78, + 0x1e08: 0xe0000d87, 0x1e09: 0xe0000d84, 0x1e0a: 0xe0000d81, 0x1e0b: 0xe0000d7e, + 0x1e0c: 0xe0000ded, 0x1e0d: 0xe0000de9, 0x1e0e: 0xe0000df5, 0x1e0f: 0xe0000df1, + 0x1e10: 0xe0000e3d, 0x1e11: 0xe0000e39, 0x1e12: 0xe0000e35, 0x1e13: 0xe0000e31, + 0x1e14: 0xe0000ea7, 0x1e15: 0xe0000ea4, 0x1e16: 0xe0000ead, 0x1e17: 0xe0000eaa, + 0x1e18: 0xe0000ed6, 0x1e19: 0xe0000ed3, 0x1e1a: 0xe0000ef4, 0x1e1b: 0xe0000ef1, + 0x1e1c: 0xe0000efb, 0x1e1d: 0xe0000ef7, 0x1e1e: 0xe0000f02, 0x1e1f: 0xe0000eff, + 0x1e20: 0xe0000f41, 0x1e21: 0xe0000f3e, 0x1e22: 0xe0000f53, 0x1e23: 0xe0000f50, + 0x1e24: 0xe0000f26, 0x1e25: 0xe0000f22, 0x1e26: 0xe0000f3a, 0x1e27: 0xe0000f36, + 0x1e28: 0xe0000f5a, 0x1e29: 0xe0000f56, 0x1e2a: 0xe0000f93, 0x1e2b: 0xe0000f90, + 0x1e2c: 0xe0000f9f, 0x1e2d: 0xe0000f9c, 0x1e2e: 0xe0000fb1, 0x1e2f: 0xe0000fae, + 0x1e30: 0xe0000fab, 0x1e31: 0xe0000fa8, 0x1e32: 0xe0001093, 0x1e33: 0xe0001090, + 0x1e34: 0xe000109f, 0x1e35: 0xe000109c, 0x1e36: 0xe0001099, 0x1e37: 0xe0001096, + 0x1e38: 0xe0001032, 0x1e39: 0xe000102e, 0x1e3a: 0xe0001046, 0x1e3b: 0xe0001042, + 0x1e3c: 0xe00010a9, 0x1e3d: 0xe00010a6, 0x1e3e: 0xe00010af, 0x1e3f: 0xe00010ac, + // Block 0x79, offset 0x1e40 + 0x1e40: 0xe00010d2, 0x1e41: 0xe00010cf, 0x1e42: 0xe00010cc, 0x1e43: 0xe00010c9, + 0x1e44: 0xe00010e1, 0x1e45: 0xe00010de, 0x1e46: 0xe00010e7, 0x1e47: 0xe00010e4, + 0x1e48: 0xe00010ed, 0x1e49: 0xe00010ea, 0x1e4a: 0xe00010fc, 0x1e4b: 0xe00010f9, + 0x1e4c: 0xe00010f6, 0x1e4d: 0xe00010f3, 0x1e4e: 0xe0001123, 0x1e4f: 0xe0001120, + 0x1e50: 0xe0001141, 0x1e51: 0xe000113e, 0x1e52: 0xe0001153, 0x1e53: 0xe0001150, + 0x1e54: 0xe0001159, 0x1e55: 0xe0001156, 0x1e56: 0xe0000c15, 0x1e57: 0xe0000f8d, + 0x1e58: 0xe00010db, 0x1e59: 0xe0001111, 0x1e5a: 0xf0000404, 0x1e5b: 0xe0000f70, + 0x1e5c: 0x40300420, 0x1e5d: 0x40300620, 0x1e5e: 0xe0000f7f, 0x1e5f: 0x402c9620, + 0x1e60: 0xe000099b, 0x1e61: 0xe0000998, 0x1e62: 0xe0000989, 0x1e63: 0xe0000986, + 0x1e64: 0xe0000928, 0x1e65: 0xe0000924, 0x1e66: 0xe0000930, 0x1e67: 0xe000092c, + 0x1e68: 0xe0000940, 0x1e69: 0xe000093c, 0x1e6a: 0xe0000938, 0x1e6b: 0xe0000934, + 0x1e6c: 0xe00009aa, 0x1e6d: 0xe00009a6, 0x1e6e: 0xe0000902, 0x1e6f: 0xe00008fe, + 0x1e70: 0xe000090a, 0x1e71: 0xe0000906, 0x1e72: 0xe000091a, 0x1e73: 0xe0000916, + 0x1e74: 0xe0000912, 0x1e75: 0xe000090e, 0x1e76: 0xe00009a2, 0x1e77: 0xe000099e, + 0x1e78: 0xe0000b6e, 0x1e79: 0xe0000b6b, 0x1e7a: 0xe0000b5c, 0x1e7b: 0xe0000b59, + 0x1e7c: 0xe0000b26, 0x1e7d: 0xe0000b23, 0x1e7e: 0xe0000afb, 0x1e7f: 0xe0000af7, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0xe0000b03, 0x1e81: 0xe0000aff, 0x1e82: 0xe0000b13, 0x1e83: 0xe0000b0f, + 0x1e84: 0xe0000b0b, 0x1e85: 0xe0000b07, 0x1e86: 0xe0000b75, 0x1e87: 0xe0000b71, + 0x1e88: 0xe0000c66, 0x1e89: 0xe0000c63, 0x1e8a: 0xe0000c78, 0x1e8b: 0xe0000c75, + 0x1e8c: 0xe0000e84, 0x1e8d: 0xe0000e81, 0x1e8e: 0xe0000e44, 0x1e8f: 0xe0000e41, + 0x1e90: 0xe0000dad, 0x1e91: 0xe0000da9, 0x1e92: 0xe0000db5, 0x1e93: 0xe0000db1, + 0x1e94: 0xe0000dc5, 0x1e95: 0xe0000dc1, 0x1e96: 0xe0000dbd, 0x1e97: 0xe0000db9, + 0x1e98: 0xe0000e8b, 0x1e99: 0xe0000e87, 0x1e9a: 0xe0000e5d, 0x1e9b: 0xe0000e59, + 0x1e9c: 0xe0000e65, 0x1e9d: 0xe0000e61, 0x1e9e: 0xe0000e75, 0x1e9f: 0xe0000e71, + 0x1ea0: 0xe0000e6d, 0x1ea1: 0xe0000e69, 0x1ea2: 0xe0000e7d, 0x1ea3: 0xe0000e79, + 0x1ea4: 0xe000108d, 0x1ea5: 0xe000108a, 0x1ea6: 0xe000104d, 0x1ea7: 0xe000104a, + 0x1ea8: 0xe0001066, 0x1ea9: 0xe0001062, 0x1eaa: 0xe000106e, 0x1eab: 0xe000106a, + 0x1eac: 0xe000107e, 0x1ead: 0xe000107a, 0x1eae: 0xe0001076, 0x1eaf: 0xe0001072, + 0x1eb0: 0xe0001086, 0x1eb1: 0xe0001082, 0x1eb2: 0xe0001108, 0x1eb3: 0xe0001105, + 0x1eb4: 0xe0001135, 0x1eb5: 0xe0001132, 0x1eb6: 0xe000112f, 0x1eb7: 0xe000112c, + 0x1eb8: 0xe000111d, 0x1eb9: 0xe000111a, 0x1eba: 0xe0000d0a, 0x1ebb: 0xe0000d07, + 0x1ebc: 0x0030d888, 0x1ebd: 0x4030d820, 0x1ebe: 0x00312088, 0x1ebf: 0x40312020, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0xe0001165, 0x1ec1: 0xe00011a9, 0x1ec2: 0xe000117d, 0x1ec3: 0xe00011c1, + 0x1ec4: 0xe000116b, 0x1ec5: 0xe00011af, 0x1ec6: 0xe000118f, 0x1ec7: 0xe00011d3, + 0x1ec8: 0xe0001168, 0x1ec9: 0xe00011ac, 0x1eca: 0xe0001181, 0x1ecb: 0xe00011c5, + 0x1ecc: 0xe000116f, 0x1ecd: 0xe00011b3, 0x1ece: 0xe0001193, 0x1ecf: 0xe00011d7, + 0x1ed0: 0xe000121a, 0x1ed1: 0xe0001230, 0x1ed2: 0xe0001228, 0x1ed3: 0xe000123e, + 0x1ed4: 0xe0001220, 0x1ed5: 0xe0001236, + 0x1ed8: 0xe000121d, 0x1ed9: 0xe0001233, 0x1eda: 0xe000122c, 0x1edb: 0xe0001242, + 0x1edc: 0xe0001224, 0x1edd: 0xe000123a, + 0x1ee0: 0xe0001252, 0x1ee1: 0xe0001296, 0x1ee2: 0xe000126a, 0x1ee3: 0xe00012ae, + 0x1ee4: 0xe0001258, 0x1ee5: 0xe000129c, 0x1ee6: 0xe000127c, 0x1ee7: 0xe00012c0, + 0x1ee8: 0xe0001255, 0x1ee9: 0xe0001299, 0x1eea: 0xe000126e, 0x1eeb: 0xe00012b2, + 0x1eec: 0xe000125c, 0x1eed: 0xe00012a0, 0x1eee: 0xe0001280, 0x1eef: 0xe00012c4, + 0x1ef0: 0xe00012fb, 0x1ef1: 0xe0001319, 0x1ef2: 0xe0001309, 0x1ef3: 0xe0001327, + 0x1ef4: 0xe0001301, 0x1ef5: 0xe000131f, 0x1ef6: 0xe0001311, 0x1ef7: 0xe000132f, + 0x1ef8: 0xe00012fe, 0x1ef9: 0xe000131c, 0x1efa: 0xe000130d, 0x1efb: 0xe000132b, + 0x1efc: 0xe0001305, 0x1efd: 0xe0001323, 0x1efe: 0xe0001315, 0x1eff: 0xe0001333, + // Block 0x7c, offset 0x1f00 + 0x1f00: 0xe000136c, 0x1f01: 0xe0001382, 0x1f02: 0xe000137a, 0x1f03: 0xe0001390, + 0x1f04: 0xe0001372, 0x1f05: 0xe0001388, + 0x1f08: 0xe000136f, 0x1f09: 0xe0001385, 0x1f0a: 0xe000137e, 0x1f0b: 0xe0001394, + 0x1f0c: 0xe0001376, 0x1f0d: 0xe000138c, + 0x1f10: 0xe00013ad, 0x1f11: 0xe00013bc, 0x1f12: 0xe00013b4, 0x1f13: 0xe00013ca, + 0x1f14: 0xe00013b0, 0x1f15: 0xe00013c2, 0x1f16: 0xe00013b8, 0x1f17: 0xe00013d2, + 0x1f19: 0xe00013bf, 0x1f1b: 0xe00013ce, + 0x1f1d: 0xe00013c6, 0x1f1f: 0xe00013d6, + 0x1f20: 0xe0001407, 0x1f21: 0xe000144b, 0x1f22: 0xe000141f, 0x1f23: 0xe0001463, + 0x1f24: 0xe000140d, 0x1f25: 0xe0001451, 0x1f26: 0xe0001431, 0x1f27: 0xe0001475, + 0x1f28: 0xe000140a, 0x1f29: 0xe000144e, 0x1f2a: 0xe0001423, 0x1f2b: 0xe0001467, + 0x1f2c: 0xe0001411, 0x1f2d: 0xe0001455, 0x1f2e: 0xe0001435, 0x1f2f: 0xe0001479, + 0x1f30: 0xe00011f7, 0x1f31: 0xe00011ed, 0x1f32: 0xe000124c, 0x1f33: 0xe0001246, + 0x1f34: 0xe00012e4, 0x1f35: 0xe00012da, 0x1f36: 0xe000133d, 0x1f37: 0xe0001337, + 0x1f38: 0xe000139e, 0x1f39: 0xe0001398, 0x1f3a: 0xe00013e0, 0x1f3b: 0xe00013da, + 0x1f3c: 0xe0001499, 0x1f3d: 0xe000148f, + // Block 0x7d, offset 0x1f40 + 0x1f40: 0xe00011a1, 0x1f41: 0xe00011e5, 0x1f42: 0xe0001185, 0x1f43: 0xe00011c9, + 0x1f44: 0xe0001173, 0x1f45: 0xe00011b7, 0x1f46: 0xe0001197, 0x1f47: 0xe00011db, + 0x1f48: 0xe00011a5, 0x1f49: 0xe00011e9, 0x1f4a: 0xe000118a, 0x1f4b: 0xe00011ce, + 0x1f4c: 0xe0001178, 0x1f4d: 0xe00011bc, 0x1f4e: 0xe000119c, 0x1f4f: 0xe00011e0, + 0x1f50: 0xe000128e, 0x1f51: 0xe00012d2, 0x1f52: 0xe0001272, 0x1f53: 0xe00012b6, + 0x1f54: 0xe0001260, 0x1f55: 0xe00012a4, 0x1f56: 0xe0001284, 0x1f57: 0xe00012c8, + 0x1f58: 0xe0001292, 0x1f59: 0xe00012d6, 0x1f5a: 0xe0001277, 0x1f5b: 0xe00012bb, + 0x1f5c: 0xe0001265, 0x1f5d: 0xe00012a9, 0x1f5e: 0xe0001289, 0x1f5f: 0xe00012cd, + 0x1f60: 0xe0001443, 0x1f61: 0xe0001487, 0x1f62: 0xe0001427, 0x1f63: 0xe000146b, + 0x1f64: 0xe0001415, 0x1f65: 0xe0001459, 0x1f66: 0xe0001439, 0x1f67: 0xe000147d, + 0x1f68: 0xe0001447, 0x1f69: 0xe000148b, 0x1f6a: 0xe000142c, 0x1f6b: 0xe0001470, + 0x1f6c: 0xe000141a, 0x1f6d: 0xe000145e, 0x1f6e: 0xe000143e, 0x1f6f: 0xe0001482, + 0x1f70: 0xe0001201, 0x1f71: 0xe000120e, 0x1f72: 0xe00011fd, 0x1f73: 0xe0001214, + 0x1f74: 0xe00011f3, 0x1f76: 0xe0001207, 0x1f77: 0xe000120a, + 0x1f78: 0xe0001204, 0x1f79: 0xe0001211, 0x1f7a: 0xe00011fa, 0x1f7b: 0xe00011f0, + 0x1f7c: 0xe0001217, 0x1f7d: 0x40063620, 0x1f7e: 0x40326c20, 0x1f7f: 0x40063620, + // Block 0x7e, offset 0x1f80 + 0x1f80: 0x40063a20, 0x1f81: 0xe00000b1, 0x1f82: 0xe00012ea, 0x1f83: 0xe00012f5, + 0x1f84: 0xe00012e0, 0x1f86: 0xe00012ee, 0x1f87: 0xe00012f1, + 0x1f88: 0xe000124f, 0x1f89: 0xe0001249, 0x1f8a: 0xe00012e7, 0x1f8b: 0xe00012dd, + 0x1f8c: 0xe00012f8, 0x1f8d: 0xe00000b7, 0x1f8e: 0xe00000b4, 0x1f8f: 0xe00000ba, + 0x1f90: 0xe0001343, 0x1f91: 0xe000135e, 0x1f92: 0xe0001356, 0x1f93: 0xe0001352, + 0x1f96: 0xe0001349, 0x1f97: 0xe000135a, + 0x1f98: 0xe0001346, 0x1f99: 0xe0001361, 0x1f9a: 0xe0001340, 0x1f9b: 0xe000133a, + 0x1f9d: 0xe00000c0, 0x1f9e: 0xe00000bd, 0x1f9f: 0xe00000c3, + 0x1fa0: 0xe00013e6, 0x1fa1: 0xe0001401, 0x1fa2: 0xe00013f9, 0x1fa3: 0xe00013f5, + 0x1fa4: 0xe00013a4, 0x1fa5: 0xe00013a7, 0x1fa6: 0xe00013ec, 0x1fa7: 0xe00013fd, + 0x1fa8: 0xe00013e9, 0x1fa9: 0xe0001404, 0x1faa: 0xe00013e3, 0x1fab: 0xe00013dd, + 0x1fac: 0xe00013aa, 0x1fad: 0xe00000ae, 0x1fae: 0xe00000ab, 0x1faf: 0x40061e20, + 0x1fb2: 0xe000149f, 0x1fb3: 0xe00014aa, + 0x1fb4: 0xe0001495, 0x1fb6: 0xe00014a3, 0x1fb7: 0xe00014a6, + 0x1fb8: 0xe00013a1, 0x1fb9: 0xe000139b, 0x1fba: 0xe000149c, 0x1fbb: 0xe0001492, + 0x1fbc: 0xe00014ad, 0x1fbd: 0x40062020, 0x1fbe: 0x40063820, + // Block 0x7f, offset 0x1fc0 + 0x1fc0: 0x00021284, 0x1fc1: 0x00021284, 0x1fc2: 0x00021284, 0x1fc3: 0x00021284, + 0x1fc4: 0x00021284, 0x1fc5: 0x00021284, 0x1fc6: 0x00021284, 0x1fc7: 0x0002129b, + 0x1fc8: 0x00021284, 0x1fc9: 0x00021284, 0x1fca: 0x00021284, 0x1fcb: 0xa0000000, + 0x1fcc: 0xa0000000, 0x1fcd: 0xa0000000, 0x1fce: 0xa0000000, 0x1fcf: 0xa0000000, + 0x1fd0: 0x40022620, 0x1fd1: 0x0002269b, 0x1fd2: 0x40022820, 0x1fd3: 0x40022a20, + 0x1fd4: 0x40022c20, 0x1fd5: 0x40022e20, 0x1fd6: 0x4004c420, 0x1fd7: 0x40021820, + 0x1fd8: 0x4003d420, 0x1fd9: 0x4003d620, 0x1fda: 0x4003d820, 0x1fdb: 0x4003da20, + 0x1fdc: 0x4003e220, 0x1fdd: 0x4003e420, 0x1fde: 0x4003e620, 0x1fdf: 0x4003e820, + 0x1fe0: 0x4004f820, 0x1fe1: 0x4004fa20, 0x1fe2: 0x40050220, 0x1fe3: 0x40050420, + 0x1fe4: 0x0002e484, 0x1fe5: 0xf0001f04, 0x1fe6: 0xf0000404, 0x1fe7: 0x40050620, + 0x1fe8: 0x40020e20, 0x1fe9: 0x40021020, 0x1fea: 0xa0000000, 0x1feb: 0xa0000000, + 0x1fec: 0xa0000000, 0x1fed: 0xa0000000, 0x1fee: 0xa0000000, 0x1fef: 0x0002129b, + 0x1ff0: 0x4004f020, 0x1ff1: 0x4004f420, 0x1ff2: 0x40050e20, 0x1ff3: 0xf0001f04, + 0x1ff4: 0xf0000404, 0x1ff5: 0x40051020, 0x1ff6: 0xf0001f04, 0x1ff7: 0xf0000404, + 0x1ff8: 0x40051620, 0x1ff9: 0x4003dc20, 0x1ffa: 0x4003de20, 0x1ffb: 0x40051820, + 0x1ffc: 0xf0001f04, 0x1ffd: 0x4002e020, 0x1ffe: 0x40021420, 0x1fff: 0x40051a20, + // Block 0x80, offset 0x2000 + 0x2000: 0x40051e20, 0x2001: 0x40052220, 0x2002: 0x40052420, 0x2003: 0x40050820, + 0x2004: 0x40095820, 0x2005: 0x40040c20, 0x2006: 0x40040e20, 0x2007: 0xf0001f04, + 0x2008: 0xf0001f04, 0x2009: 0xf0001f04, 0x200a: 0x4004e820, 0x200b: 0x4004d420, + 0x200c: 0x40050a20, 0x200d: 0x40050c20, 0x200e: 0x4004da20, 0x200f: 0x40026620, + 0x2010: 0x40052020, 0x2011: 0x4004dc20, 0x2012: 0x40095020, 0x2013: 0x40023420, + 0x2014: 0x40051c20, 0x2015: 0x40039c20, 0x2016: 0x40039e20, 0x2017: 0xe00000a6, + 0x2018: 0x4003a020, 0x2019: 0x4003a220, 0x201a: 0x4003a420, 0x201b: 0x4003a620, + 0x201c: 0x4003a820, 0x201d: 0x4003aa20, 0x201e: 0x4003ac20, 0x201f: 0x00021284, + 0x2020: 0xa0000000, 0x2021: 0xa0000000, 0x2022: 0xa0000000, 0x2023: 0xa0000000, + 0x2024: 0xa0000000, + 0x202a: 0xa0000000, 0x202b: 0xa0000000, + 0x202c: 0xa0000000, 0x202d: 0xa0000000, 0x202e: 0xa0000000, 0x202f: 0xa0000000, + 0x2030: 0x0029cc94, 0x2031: 0x002d9a94, + 0x2034: 0x0029d494, 0x2035: 0x0029d694, 0x2036: 0x0029d894, 0x2037: 0x0029da94, + 0x2038: 0x0029dc94, 0x2039: 0x0029de94, 0x203a: 0x00093894, 0x203b: 0x00094e94, + 0x203c: 0x00094294, 0x203d: 0x0003f494, 0x203e: 0x0003f694, 0x203f: 0x002e9e94, + // Block 0x81, offset 0x2040 + 0x2040: 0x0029cc95, 0x2041: 0x0029ce95, 0x2042: 0x0029d095, 0x2043: 0x0029d295, + 0x2044: 0x0029d495, 0x2045: 0x0029d695, 0x2046: 0x0029d895, 0x2047: 0x0029da95, + 0x2048: 0x0029dc95, 0x2049: 0x0029de95, 0x204a: 0x00093895, 0x204b: 0x00094e95, + 0x204c: 0x00094295, 0x204d: 0x0003f495, 0x204e: 0x0003f695, + 0x2050: 0x002bde95, 0x2051: 0x002c9895, 0x2052: 0x002ee295, 0x2053: 0x0030f695, + 0x2054: 0x002cb895, 0x2055: 0x002d6895, 0x2056: 0x002dfe95, 0x2057: 0x002e2295, + 0x2058: 0x002e8295, 0x2059: 0x002e9e95, 0x205a: 0x002f2c95, 0x205b: 0x002fe695, + 0x205c: 0x00302c95, + 0x2060: 0x4027f820, 0x2061: 0x4027fa20, 0x2062: 0x4027fc20, 0x2063: 0x4027fe20, + 0x2064: 0x40280020, 0x2065: 0x40280220, 0x2066: 0x40280420, 0x2067: 0x40280620, + 0x2068: 0x40282c20, 0x2069: 0x40280820, 0x206a: 0x40280a20, 0x206b: 0x40280c20, + 0x206c: 0x40280e20, 0x206d: 0x40281020, 0x206e: 0x40281220, 0x206f: 0x40281420, + 0x2070: 0x40281620, 0x2071: 0x40281820, 0x2072: 0x40281a20, 0x2073: 0x40281c20, + 0x2074: 0x40281e20, 0x2075: 0x40282020, 0x2076: 0x40282220, 0x2077: 0x40282420, + 0x2078: 0x40282620, 0x2079: 0x40282820, 0x207a: 0x40282a20, + // Block 0x82, offset 0x2080 + 0x2090: 0xae612a02, 0x2091: 0xae612b02, 0x2092: 0xa0112c02, 0x2093: 0xa0112c02, + 0x2094: 0xae612d02, 0x2095: 0xae612e02, 0x2096: 0xae612f02, 0x2097: 0xae613002, + 0x2098: 0xa0106102, 0x2099: 0xa0106102, 0x209a: 0xa0106102, 0x209b: 0xae613102, + 0x209c: 0xae613202, 0x209d: 0xa0006202, 0x209e: 0xa0006202, 0x209f: 0xa0006202, + 0x20a0: 0xa0006202, 0x20a1: 0xae613302, 0x20a2: 0xa0006202, 0x20a3: 0xa0006202, + 0x20a4: 0xa0006202, 0x20a5: 0xa0106102, 0x20a6: 0xa0113402, 0x20a7: 0xae613502, + 0x20a8: 0xadc13602, 0x20a9: 0xae613702, 0x20aa: 0xa0106102, 0x20ab: 0xa0106102, + 0x20ac: 0xadc06002, 0x20ad: 0xadc06002, 0x20ae: 0xadc06002, 0x20af: 0xadc06002, + 0x20b0: 0xae605f02, + // Block 0x83, offset 0x20c0 + 0x20c0: 0xe00009bc, 0x20c1: 0xe00009c0, 0x20c2: 0x002c3a8b, 0x20c3: 0xf0000a04, + 0x20c4: 0x40081c20, 0x20c5: 0xe0000a5e, 0x20c6: 0xe0000a62, 0x20c7: 0x002cc28a, + 0x20c8: 0x40081e20, 0x20c9: 0xf0000a04, 0x20ca: 0x002d2285, 0x20cb: 0x002d688b, + 0x20cc: 0x002d688b, 0x20cd: 0x002d688b, 0x20ce: 0x002d6885, 0x20cf: 0xf0000202, + 0x20d0: 0x002d9a8b, 0x20d1: 0x002d9a8b, 0x20d2: 0x002e228b, 0x20d3: 0x002e2285, + 0x20d4: 0x40082020, 0x20d5: 0x002e9e8b, 0x20d6: 0xf000040a, 0x20d7: 0x40082220, + 0x20d8: 0x40082420, 0x20d9: 0x002f2c8b, 0x20da: 0x002f568b, 0x20db: 0x002f7a8b, + 0x20dc: 0x002f7a8b, 0x20dd: 0x002f7a8b, 0x20de: 0x40082620, 0x20df: 0x40082820, + 0x20e0: 0xf0001414, 0x20e1: 0xe0000fbd, 0x20e2: 0xf0001414, 0x20e3: 0x40082a20, + 0x20e4: 0x00312a8b, 0x20e5: 0x40082c20, 0x20e6: 0x0032a288, 0x20e7: 0x40082e20, + 0x20e8: 0x00312a8b, 0x20e9: 0x40083020, 0x20ea: 0x002dfe88, 0x20eb: 0xe000094d, + 0x20ec: 0x002c0a8b, 0x20ed: 0x002c3a8b, 0x20ee: 0x40083220, 0x20ef: 0x002c9885, + 0x20f0: 0x002c988b, 0x20f1: 0x002d088b, 0x20f2: 0x002d1e88, 0x20f3: 0x002e828b, + 0x20f4: 0x002ee285, 0x20f5: 0x00389084, 0x20f6: 0x00389284, 0x20f7: 0x00389484, + 0x20f8: 0x00389684, 0x20f9: 0x002d9a85, 0x20fa: 0x40083420, 0x20fb: 0xe0000b95, + 0x20fc: 0x00327e85, 0x20fd: 0x00325685, 0x20fe: 0x0032568b, 0x20ff: 0x00327e8b, + // Block 0x84, offset 0x2100 + 0x2100: 0x00093685, 0x2101: 0x40083620, 0x2102: 0x40083820, 0x2103: 0x40083a20, + 0x2104: 0x40083c20, 0x2105: 0x002c628b, 0x2106: 0x002c6285, 0x2107: 0x002c9885, + 0x2108: 0x002d9a85, 0x2109: 0x002dcc85, 0x210a: 0x40083e20, 0x210b: 0x400a6e20, + 0x210c: 0x40084020, 0x210d: 0xe00009c4, 0x210e: 0x402d1e20, 0x210f: 0x40084220, + 0x2110: 0xe00002cb, 0x2111: 0xe00002d3, 0x2112: 0xe00002b2, 0x2113: 0xe00002bb, + 0x2114: 0xe00003cd, 0x2115: 0xe00002c3, 0x2116: 0xe00003d1, 0x2117: 0xe00004ab, + 0x2118: 0xe0000579, 0x2119: 0xe00002c7, 0x211a: 0xe0000640, 0x211b: 0xe00002cf, + 0x211c: 0xe00004af, 0x211d: 0xe0000644, 0x211e: 0xe0000798, 0x211f: 0xf0001e1e, + 0x2120: 0x002d9a8a, 0x2121: 0xf0001f0a, 0x2122: 0xf0000a0a, 0x2123: 0xf0001f0a, + 0x2124: 0x0030be8a, 0x2125: 0xf0001f0a, 0x2126: 0xf0000a0a, 0x2127: 0xe00010bb, + 0x2128: 0xf0001f0a, 0x2129: 0x0030f68a, 0x212a: 0xf0001f0a, 0x212b: 0xf0000a0a, + 0x212c: 0x002e228a, 0x212d: 0x002c3a8a, 0x212e: 0x002c628a, 0x212f: 0x002e828a, + 0x2130: 0x002d9a84, 0x2131: 0xf0001f04, 0x2132: 0xf0000404, 0x2133: 0xf0001f04, + 0x2134: 0x0030be84, 0x2135: 0xf0001f04, 0x2136: 0xf0000404, 0x2137: 0xe00010b6, + 0x2138: 0xf0001f04, 0x2139: 0x0030f684, 0x213a: 0xf0001f04, 0x213b: 0xf0000404, + 0x213c: 0x002e2284, 0x213d: 0x002c3a84, 0x213e: 0x002c6284, 0x213f: 0x002e8284, + // Block 0x85, offset 0x2140 + 0x2140: 0x40287c20, 0x2141: 0x40287e20, 0x2142: 0x40288020, 0x2143: 0x002c5e88, + 0x2144: 0x402c5e20, 0x2145: 0xe00006c9, 0x2146: 0x40288220, 0x2147: 0x40288420, + 0x2148: 0x40288620, 0x2149: 0xe00001e2, + 0x2150: 0x40084420, 0x2151: 0x40084820, 0x2152: 0x40084620, 0x2153: 0x40084a20, + 0x2154: 0x40084c20, 0x2155: 0x40084e20, 0x2156: 0x40085020, 0x2157: 0x40085220, + 0x2158: 0x40085420, 0x2159: 0x40085620, 0x215a: 0xe00000c6, 0x215b: 0xe00000c9, + 0x215c: 0x40085820, 0x215d: 0x40085a20, 0x215e: 0x40085c20, 0x215f: 0x40085e20, + 0x2160: 0x40086020, 0x2161: 0x40086220, 0x2162: 0x40086420, 0x2163: 0x40086620, + 0x2164: 0x40086820, 0x2165: 0x40086a20, 0x2166: 0x40086c20, 0x2167: 0x40086e20, + 0x2168: 0x40087020, 0x2169: 0x40087220, 0x216a: 0x40087420, 0x216b: 0x40087620, + 0x216c: 0x40087820, 0x216d: 0x40087a20, 0x216e: 0xe00000cc, 0x216f: 0x40087c20, + 0x2170: 0x40087e20, 0x2171: 0x40088020, 0x2172: 0x40088220, 0x2173: 0x40088420, + 0x2174: 0x40088620, 0x2175: 0x40088820, 0x2176: 0x40088a20, 0x2177: 0x40088c20, + 0x2178: 0x40088e20, 0x2179: 0x40089020, 0x217a: 0x40089220, 0x217b: 0x40089420, + 0x217c: 0x40089620, 0x217d: 0x40089820, 0x217e: 0x40089a20, 0x217f: 0x40089c20, + // Block 0x86, offset 0x2180 + 0x2180: 0x40089e20, 0x2181: 0x4008a020, 0x2182: 0x4008a220, 0x2183: 0x4008a420, + 0x2184: 0x4008a620, 0x2185: 0x4008a820, 0x2186: 0x4008aa20, 0x2187: 0x4008ac20, + 0x2188: 0x4008ae20, 0x2189: 0x4008b020, 0x218a: 0x4008b220, 0x218b: 0x4008b420, + 0x218c: 0x4008b620, 0x218d: 0xe00000cf, 0x218e: 0xe00000d5, 0x218f: 0xe00000d2, + 0x2190: 0x4008b820, 0x2191: 0x4008ba20, 0x2192: 0x4008bc20, 0x2193: 0x4008be20, + 0x2194: 0x4008c020, 0x2195: 0x4008c220, 0x2196: 0x4008c420, 0x2197: 0x4008c620, + 0x2198: 0x4008c820, 0x2199: 0x4008ca20, 0x219a: 0x4008cc20, 0x219b: 0x4008ce20, + 0x219c: 0x4008d020, 0x219d: 0x4008d220, 0x219e: 0x4008d420, 0x219f: 0x4008d620, + 0x21a0: 0x4008d820, 0x21a1: 0x4008da20, 0x21a2: 0x4008dc20, 0x21a3: 0x4008de20, + 0x21a4: 0x4008e020, 0x21a5: 0x4008e220, 0x21a6: 0x4008e420, 0x21a7: 0x4008e620, + 0x21a8: 0x4008e820, 0x21a9: 0x4008ea20, 0x21aa: 0x4008ec20, 0x21ab: 0x4008ee20, + 0x21ac: 0x4008f020, 0x21ad: 0x4008f220, 0x21ae: 0x4008f420, 0x21af: 0x4008f620, + 0x21b0: 0x4008f820, 0x21b1: 0x4008fa20, 0x21b2: 0x4008fc20, 0x21b3: 0x4008fe20, + 0x21b4: 0x40090020, 0x21b5: 0x40090220, 0x21b6: 0x40090420, 0x21b7: 0x40090620, + 0x21b8: 0x40090820, 0x21b9: 0x40090a20, 0x21ba: 0x40090c20, 0x21bb: 0x40090e20, + 0x21bc: 0x40091020, 0x21bd: 0x40091220, 0x21be: 0x40091420, 0x21bf: 0x40091620, + // Block 0x87, offset 0x21c0 + 0x21c0: 0x40091820, 0x21c1: 0x40091a20, 0x21c2: 0x40091c20, 0x21c3: 0x40091e20, + 0x21c4: 0xe00000d8, 0x21c5: 0x40092020, 0x21c6: 0x40092220, 0x21c7: 0x40092420, + 0x21c8: 0x40092620, 0x21c9: 0xe00000db, 0x21ca: 0x40092820, 0x21cb: 0x40092a20, + 0x21cc: 0xe00000de, 0x21cd: 0x40092c20, 0x21ce: 0x40093020, 0x21cf: 0x40093220, + 0x21d0: 0x40093420, 0x21d1: 0x40093620, 0x21d2: 0x40094e20, 0x21d3: 0x40095220, + 0x21d4: 0x40095420, 0x21d5: 0x40095620, 0x21d6: 0x40095a20, 0x21d7: 0x40095c20, + 0x21d8: 0x40095e20, 0x21d9: 0x40096020, 0x21da: 0x40096220, 0x21db: 0x40096420, + 0x21dc: 0x40096820, 0x21dd: 0x40096c20, 0x21de: 0x40096e20, 0x21df: 0x40097020, + 0x21e0: 0x40097220, 0x21e1: 0x40097420, 0x21e2: 0x40097620, 0x21e3: 0x40097820, + 0x21e4: 0xe00000ea, 0x21e5: 0x40097a20, 0x21e6: 0xe00000ed, 0x21e7: 0x40097c20, + 0x21e8: 0x40097e20, 0x21e9: 0x40098020, 0x21ea: 0x40098220, 0x21eb: 0x40098420, + 0x21ec: 0xf0001f04, 0x21ed: 0xf0000404, 0x21ee: 0x40098620, 0x21ef: 0xf0001f04, + 0x21f0: 0xf0000404, 0x21f1: 0x40098820, 0x21f2: 0x40098a20, 0x21f3: 0x40098c20, + 0x21f4: 0x40098e20, 0x21f5: 0x40099020, 0x21f6: 0x40099220, 0x21f7: 0x40099420, + 0x21f8: 0x40099620, 0x21f9: 0x40099820, 0x21fa: 0x40099a20, 0x21fb: 0x40099c20, + 0x21fc: 0x40099e20, 0x21fd: 0x4009a020, 0x21fe: 0x4009a220, 0x21ff: 0x4009a420, + // Block 0x88, offset 0x2200 + 0x2200: 0x4009a620, 0x2201: 0xe00000f5, 0x2202: 0x4009a820, 0x2203: 0x4009aa20, + 0x2204: 0xe00000f8, 0x2205: 0x4009ac20, 0x2206: 0x4009ae20, 0x2207: 0xe00000fb, + 0x2208: 0x4009b020, 0x2209: 0xe00000fe, 0x220a: 0x4009b220, 0x220b: 0x4009b420, + 0x220c: 0x4009b620, 0x220d: 0x4009b820, 0x220e: 0x4009ba20, 0x220f: 0x4009bc20, + 0x2210: 0x4009be20, 0x2211: 0x4009c020, 0x2212: 0x4009c220, 0x2213: 0x4009c420, + 0x2214: 0x4009c620, 0x2215: 0x4009c820, 0x2216: 0x4009ca20, 0x2217: 0x4009cc20, + 0x2218: 0x4009ce20, 0x2219: 0x4009d020, 0x221a: 0x4009d220, 0x221b: 0x4009d420, + 0x221c: 0x4009d620, 0x221d: 0x4009d820, 0x221e: 0x4009da20, 0x221f: 0x4009dc20, + 0x2220: 0xe00000e4, 0x2221: 0x4009de20, 0x2222: 0xe0000104, 0x2223: 0x4009e020, + 0x2224: 0x4009e220, 0x2225: 0x4009e420, 0x2226: 0x4009e620, 0x2227: 0x4009e820, + 0x2228: 0x4009ea20, 0x2229: 0x4009ec20, 0x222a: 0x4009ee20, 0x222b: 0x4009f020, + 0x222c: 0x4009f220, 0x222d: 0xe0000101, 0x222e: 0xe00000e1, 0x222f: 0xe00000e7, + 0x2230: 0xe0000107, 0x2231: 0xe000010a, 0x2232: 0x4009f420, 0x2233: 0x4009f620, + 0x2234: 0xe000010d, 0x2235: 0xe0000110, 0x2236: 0x4009f820, 0x2237: 0x4009fa20, + 0x2238: 0xe0000113, 0x2239: 0xe0000116, 0x223a: 0x4009fc20, 0x223b: 0x4009fe20, + 0x223c: 0x400a0020, 0x223d: 0x400a0220, 0x223e: 0x400a0420, 0x223f: 0x400a0620, + // Block 0x89, offset 0x2240 + 0x2240: 0xe0000119, 0x2241: 0xe000011c, 0x2242: 0x400a0820, 0x2243: 0x400a0a20, + 0x2244: 0xe0000125, 0x2245: 0xe0000128, 0x2246: 0x400a0c20, 0x2247: 0x400a0e20, + 0x2248: 0xe000012b, 0x2249: 0xe000012e, 0x224a: 0x400a1020, 0x224b: 0x400a1220, + 0x224c: 0x400a1420, 0x224d: 0x400a1620, 0x224e: 0x400a1820, 0x224f: 0x400a1a20, + 0x2250: 0x400a1c20, 0x2251: 0x400a1e20, 0x2252: 0x400a2020, 0x2253: 0x400a2220, + 0x2254: 0x400a2420, 0x2255: 0x400a2620, 0x2256: 0x400a2820, 0x2257: 0x400a2a20, + 0x2258: 0x400a2c20, 0x2259: 0x400a2e20, 0x225a: 0x400a3020, 0x225b: 0x400a3220, + 0x225c: 0x400a3420, 0x225d: 0x400a3620, 0x225e: 0x400a3820, 0x225f: 0x400a3a20, + 0x2260: 0x400a3c20, 0x2261: 0x400a3e20, 0x2262: 0x400a4020, 0x2263: 0x400a4220, + 0x2264: 0x400a4420, 0x2265: 0x400a4620, 0x2266: 0x400a4820, 0x2267: 0x400a4a20, + 0x2268: 0x400a4c20, 0x2269: 0x400a4e20, 0x226a: 0x400a5020, 0x226b: 0x400a5220, + 0x226c: 0xe0000137, 0x226d: 0xe000013a, 0x226e: 0xe000013d, 0x226f: 0xe0000140, + 0x2270: 0x400a5420, 0x2271: 0x400a5620, 0x2272: 0x400a5820, 0x2273: 0x400a5a20, + 0x2274: 0x400a5c20, 0x2275: 0x400a5e20, 0x2276: 0x400a6020, 0x2277: 0x400a6220, + 0x2278: 0x400a6420, 0x2279: 0x400a6620, 0x227a: 0x400a6820, 0x227b: 0x400a6a20, + 0x227c: 0x400a6c20, 0x227d: 0x400a7020, 0x227e: 0x400a7220, 0x227f: 0x400a7420, + // Block 0x8a, offset 0x2280 + 0x2280: 0x400a7620, 0x2281: 0x400a7820, 0x2282: 0x400a7a20, 0x2283: 0x400a7c20, + 0x2284: 0x400a7e20, 0x2285: 0x400a8020, 0x2286: 0x400a8220, 0x2287: 0x400a8420, + 0x2288: 0x400a8620, 0x2289: 0x400a8820, 0x228a: 0x400a8a20, 0x228b: 0x400a8c20, + 0x228c: 0x400a8e20, 0x228d: 0x400a9020, 0x228e: 0x400a9220, 0x228f: 0x400a9420, + 0x2290: 0x400a9620, 0x2291: 0x400a9820, 0x2292: 0x400a9a20, 0x2293: 0x400a9c20, + 0x2294: 0x400a9e20, 0x2295: 0x400aa020, 0x2296: 0x400aa220, 0x2297: 0x400aa420, + 0x2298: 0x400aa620, 0x2299: 0x400aa820, 0x229a: 0x400aaa20, 0x229b: 0x400aac20, + 0x229c: 0x400aae20, 0x229d: 0x400ab020, 0x229e: 0x400ab220, 0x229f: 0x400ab420, + 0x22a0: 0xe000011f, 0x22a1: 0xe0000122, 0x22a2: 0xe0000131, 0x22a3: 0xe0000134, + 0x22a4: 0x400ab620, 0x22a5: 0x400ab820, 0x22a6: 0x400aba20, 0x22a7: 0x400abc20, + 0x22a8: 0x400abe20, 0x22a9: 0x400ac020, 0x22aa: 0xe0000143, 0x22ab: 0xe0000146, + 0x22ac: 0xe0000149, 0x22ad: 0xe000014c, 0x22ae: 0x400ac220, 0x22af: 0x400ac420, + 0x22b0: 0x400ac620, 0x22b1: 0x400ac820, 0x22b2: 0x400aca20, 0x22b3: 0x400acc20, + 0x22b4: 0x400ace20, 0x22b5: 0x400ad020, 0x22b6: 0x400ad220, 0x22b7: 0x400ad420, + 0x22b8: 0x400ad620, 0x22b9: 0x400ad820, 0x22ba: 0x400ada20, 0x22bb: 0x400adc20, + 0x22bc: 0x400ade20, 0x22bd: 0x400ae020, 0x22be: 0x400ae220, 0x22bf: 0x400ae420, + // Block 0x8b, offset 0x22c0 + 0x22c0: 0x400ae620, 0x22c1: 0x400ae820, 0x22c2: 0x400aea20, 0x22c3: 0x400aec20, + 0x22c4: 0x400aee20, 0x22c5: 0x400af020, 0x22c6: 0x400af220, 0x22c7: 0x400af420, + 0x22c8: 0x400af620, 0x22c9: 0x400af820, 0x22ca: 0x400afa20, 0x22cb: 0x400afc20, + 0x22cc: 0x400afe20, 0x22cd: 0x400b0020, 0x22ce: 0x400b0220, 0x22cf: 0x400b0420, + 0x22d0: 0x400b0620, 0x22d1: 0x400b0820, 0x22d2: 0x400b0a20, 0x22d3: 0x400b0c20, + 0x22d4: 0x400b0e20, 0x22d5: 0x400b1020, 0x22d6: 0x400b1220, 0x22d7: 0x400b1420, + 0x22d8: 0x400b1620, 0x22d9: 0x400b1820, 0x22da: 0x400b1a20, 0x22db: 0x400b1c20, + 0x22dc: 0x400b1e20, 0x22dd: 0x400b2020, 0x22de: 0x400b2220, 0x22df: 0x400b2420, + 0x22e0: 0x400b2620, 0x22e1: 0x400b2820, 0x22e2: 0x400b2a20, 0x22e3: 0x400b2c20, + 0x22e4: 0x400b2e20, 0x22e5: 0x400b3020, 0x22e6: 0x400b3220, 0x22e7: 0x400b3420, + 0x22e8: 0x400b3620, 0x22e9: 0x40049c20, 0x22ea: 0x40049e20, 0x22eb: 0x400b3820, + 0x22ec: 0x400b3a20, 0x22ed: 0x400b3c20, 0x22ee: 0x400b3e20, 0x22ef: 0x400b4020, + 0x22f0: 0x400b4220, 0x22f1: 0x400b4420, 0x22f2: 0x400b4620, 0x22f3: 0x400b4820, + 0x22f4: 0x400b4a20, 0x22f5: 0x400b4c20, 0x22f6: 0x400b4e20, 0x22f7: 0x400b5020, + 0x22f8: 0x400b5220, 0x22f9: 0x400b5420, 0x22fa: 0x400b5620, 0x22fb: 0x400b5820, + 0x22fc: 0x400b5a20, 0x22fd: 0x400b5c20, 0x22fe: 0x400b5e20, 0x22ff: 0x400b6020, + // Block 0x8c, offset 0x2300 + 0x2300: 0x400b6220, 0x2301: 0x400b6420, 0x2302: 0x400b6620, 0x2303: 0x400b6820, + 0x2304: 0x400b6a20, 0x2305: 0x400b6c20, 0x2306: 0x400b6e20, 0x2307: 0x400b7020, + 0x2308: 0x400b7220, 0x2309: 0x400b7420, 0x230a: 0x400b7620, 0x230b: 0x400b7820, + 0x230c: 0x400b7a20, 0x230d: 0x400b7c20, 0x230e: 0x400b7e20, 0x230f: 0x400b8020, + 0x2310: 0x400b8220, 0x2311: 0x400b8420, 0x2312: 0x400b8620, 0x2313: 0x400b8820, + 0x2314: 0x400b8a20, 0x2315: 0x400b8c20, 0x2316: 0x400b8e20, 0x2317: 0x400b9020, + 0x2318: 0x400b9220, 0x2319: 0x400b9420, 0x231a: 0x400b9620, 0x231b: 0x400b9820, + 0x231c: 0x400b9a20, 0x231d: 0x400b9c20, 0x231e: 0x400b9e20, 0x231f: 0x400ba020, + 0x2320: 0x400ba220, 0x2321: 0x400ba420, 0x2322: 0x400ba620, 0x2323: 0x400ba820, + 0x2324: 0x400baa20, 0x2325: 0x400bac20, 0x2326: 0x400bae20, 0x2327: 0x400bb020, + 0x2328: 0x400bb220, 0x2329: 0x400bb420, 0x232a: 0x400bb620, 0x232b: 0x400bb820, + 0x232c: 0x400bba20, 0x232d: 0x400bbc20, 0x232e: 0x400bbe20, 0x232f: 0x400bc020, + 0x2330: 0x400bc220, 0x2331: 0x400bc420, 0x2332: 0x400bc620, 0x2333: 0x400bc820, + 0x2334: 0x400bca20, 0x2335: 0x400bcc20, 0x2336: 0x400bce20, 0x2337: 0x400bd020, + 0x2338: 0x400bd220, 0x2339: 0x400bd420, 0x233a: 0x400bd620, 0x233b: 0x400bd820, + 0x233c: 0x400bda20, 0x233d: 0x400bdc20, 0x233e: 0x400bde20, 0x233f: 0x400be020, + // Block 0x8d, offset 0x2340 + 0x2340: 0x400be220, 0x2341: 0x400be420, 0x2342: 0x400be620, 0x2343: 0x400be820, + 0x2344: 0x400bea20, 0x2345: 0x400bec20, 0x2346: 0x400bee20, 0x2347: 0x400bf020, + 0x2348: 0x400bf220, 0x2349: 0x400bf420, 0x234a: 0x400bf620, 0x234b: 0x400bf820, + 0x234c: 0x400bfa20, 0x234d: 0x400bfc20, 0x234e: 0x400bfe20, 0x234f: 0x400c0020, + 0x2350: 0x400c0220, 0x2351: 0x400c0420, 0x2352: 0x400c0620, 0x2353: 0x400c0820, + 0x2354: 0x400c0a20, 0x2355: 0x400c0c20, 0x2356: 0x400c0e20, 0x2357: 0x400c1020, + 0x2358: 0x400c1220, 0x2359: 0x400c1420, 0x235a: 0x400c1620, 0x235b: 0x400c1820, + 0x235c: 0x400c1a20, 0x235d: 0x400c1c20, 0x235e: 0x400c1e20, 0x235f: 0x400c2020, + 0x2360: 0x400c2220, 0x2361: 0x400c2420, 0x2362: 0x400c2620, 0x2363: 0x400c2820, + 0x2364: 0x400c2a20, 0x2365: 0x400c2c20, 0x2366: 0x400c2e20, 0x2367: 0x400c3020, + 0x2368: 0x400c3220, 0x2369: 0x400c3420, 0x236a: 0x400c3620, 0x236b: 0x400c3820, + 0x236c: 0x400c3a20, 0x236d: 0x400c3c20, 0x236e: 0x400c3e20, 0x236f: 0x400c4020, + 0x2370: 0x400c4220, 0x2371: 0x400c4420, 0x2372: 0x400c4620, 0x2373: 0x400c4820, + 0x2374: 0x400c4a20, 0x2375: 0x400c4c20, 0x2376: 0x400c4e20, 0x2377: 0x400c5020, + 0x2378: 0x400c5220, 0x2379: 0x400c5420, 0x237a: 0x400c5620, 0x237b: 0x400c5820, + 0x237c: 0x400c5a20, 0x237d: 0x400c5c20, 0x237e: 0x400c5e20, 0x237f: 0x400c6020, + // Block 0x8e, offset 0x2380 + 0x2380: 0x400c6220, 0x2381: 0x400c6420, 0x2382: 0x400c6620, 0x2383: 0x400c6820, + 0x2384: 0x400c6a20, 0x2385: 0x400c6c20, 0x2386: 0x400c6e20, 0x2387: 0x400c7020, + 0x2388: 0x400c7220, 0x2389: 0x400c7420, 0x238a: 0x400c7620, 0x238b: 0x400c7820, + 0x238c: 0x400c7a20, 0x238d: 0x400c7c20, 0x238e: 0x400c7e20, 0x238f: 0x400c8020, + 0x2390: 0x400c8220, 0x2391: 0x400c8420, 0x2392: 0x400c8620, 0x2393: 0x400c8820, + 0x2394: 0x400c8a20, 0x2395: 0x400c8c20, 0x2396: 0x400c8e20, 0x2397: 0x400c9020, + 0x2398: 0x400c9220, 0x2399: 0x400c9420, 0x239a: 0x400c9620, 0x239b: 0x400c9820, + 0x239c: 0x400c9a20, 0x239d: 0x400c9c20, 0x239e: 0x400c9e20, 0x239f: 0x400ca020, + 0x23a0: 0x400ca220, 0x23a1: 0x400ca420, 0x23a2: 0x400ca620, 0x23a3: 0x400ca820, + 0x23a4: 0x400caa20, 0x23a5: 0x400cac20, 0x23a6: 0x400cae20, 0x23a7: 0x400cb020, + 0x23a8: 0x400cb220, 0x23a9: 0x400cb420, 0x23aa: 0x400cb620, 0x23ab: 0x400cb820, + 0x23ac: 0x400cba20, 0x23ad: 0x400cbc20, 0x23ae: 0x400cbe20, 0x23af: 0x400cc020, + 0x23b0: 0x400cc220, 0x23b1: 0x400cc420, 0x23b2: 0x400cc620, 0x23b3: 0x400cc820, + // Block 0x8f, offset 0x23c0 + 0x23c0: 0x400cca20, 0x23c1: 0x400ccc20, 0x23c2: 0x400cce20, 0x23c3: 0x400cd020, + 0x23c4: 0x400cd220, 0x23c5: 0x400cd420, 0x23c6: 0x400cd620, 0x23c7: 0x400cd820, + 0x23c8: 0x400cda20, 0x23c9: 0x400cdc20, 0x23ca: 0x400cde20, 0x23cb: 0x400ce020, + 0x23cc: 0x400ce220, 0x23cd: 0x400ce420, 0x23ce: 0x400ce620, 0x23cf: 0x400ce820, + 0x23d0: 0x400cea20, 0x23d1: 0x400cec20, 0x23d2: 0x400cee20, 0x23d3: 0x400cf020, + 0x23d4: 0x400cf220, 0x23d5: 0x400cf420, 0x23d6: 0x400cf620, 0x23d7: 0x400cf820, + 0x23d8: 0x400cfa20, 0x23d9: 0x400cfc20, 0x23da: 0x400cfe20, 0x23db: 0x400d0020, + 0x23dc: 0x400d0220, 0x23dd: 0x400d0420, 0x23de: 0x400d0620, 0x23df: 0x400d0820, + 0x23e0: 0x400d0a20, 0x23e1: 0x400d0c20, 0x23e2: 0x400d0e20, 0x23e3: 0x400d1020, + 0x23e4: 0x400d1220, 0x23e5: 0x400d1420, 0x23e6: 0x400d1620, + // Block 0x90, offset 0x2400 + 0x2400: 0x400d1820, 0x2401: 0x400d1a20, 0x2402: 0x400d1c20, 0x2403: 0x400d1e20, + 0x2404: 0x400d2020, 0x2405: 0x400d2220, 0x2406: 0x400d2420, 0x2407: 0x400d2620, + 0x2408: 0x400d2820, 0x2409: 0x400d2a20, 0x240a: 0x400d2c20, + 0x2420: 0x0029ce86, 0x2421: 0x0029d086, 0x2422: 0x0029d286, 0x2423: 0x0029d486, + 0x2424: 0x0029d686, 0x2425: 0x0029d886, 0x2426: 0x0029da86, 0x2427: 0x0029dc86, + 0x2428: 0x0029de86, 0x2429: 0xf0000606, 0x242a: 0xf0000606, 0x242b: 0xf0000606, + 0x242c: 0xf0000606, 0x242d: 0xf0000606, 0x242e: 0xf0000606, 0x242f: 0xf0000606, + 0x2430: 0xf0000606, 0x2431: 0xf0000606, 0x2432: 0xf0000606, 0x2433: 0xf0000606, + 0x2434: 0xf0000404, 0x2435: 0xf0000404, 0x2436: 0xf0000404, 0x2437: 0xf0000404, + 0x2438: 0xf0000404, 0x2439: 0xf0000404, 0x243a: 0xf0000404, 0x243b: 0xf0000404, + 0x243c: 0xf0000404, 0x243d: 0xe0000015, 0x243e: 0xe000001a, 0x243f: 0xe000001f, + // Block 0x91, offset 0x2440 + 0x2440: 0xe0000024, 0x2441: 0xe0000029, 0x2442: 0xe000002e, 0x2443: 0xe0000033, + 0x2444: 0xe0000038, 0x2445: 0xe000003d, 0x2446: 0xe0000042, 0x2447: 0xe0000047, + 0x2448: 0xf0001f04, 0x2449: 0xf0001f04, 0x244a: 0xf0001f04, 0x244b: 0xf0001f04, + 0x244c: 0xf0001f04, 0x244d: 0xf0001f04, 0x244e: 0xf0001f04, 0x244f: 0xf0001f04, + 0x2450: 0xf0001f04, 0x2451: 0xf0000404, 0x2452: 0xf0000404, 0x2453: 0xf0000404, + 0x2454: 0xf0000404, 0x2455: 0xf0000404, 0x2456: 0xf0000404, 0x2457: 0xf0000404, + 0x2458: 0xf0000404, 0x2459: 0xf0000404, 0x245a: 0xf0000404, 0x245b: 0xf0000404, + 0x245c: 0xf0000404, 0x245d: 0xf0000404, 0x245e: 0xf0000404, 0x245f: 0xf0000404, + 0x2460: 0xf0000404, 0x2461: 0xf0000404, 0x2462: 0xf0000404, 0x2463: 0xf0000404, + 0x2464: 0xf0000404, 0x2465: 0xf0000404, 0x2466: 0xf0000404, 0x2467: 0xf0000404, + 0x2468: 0xf0000404, 0x2469: 0xf0000404, 0x246a: 0xf0000404, 0x246b: 0xf0000404, + 0x246c: 0xf0000404, 0x246d: 0xf0000404, 0x246e: 0xf0000404, 0x246f: 0xf0000404, + 0x2470: 0xf0000404, 0x2471: 0xf0000404, 0x2472: 0xf0000404, 0x2473: 0xf0000404, + 0x2474: 0xf0000404, 0x2475: 0xf0000404, 0x2476: 0x002bde8c, 0x2477: 0x002c0a8c, + 0x2478: 0x002c3a8c, 0x2479: 0x002c628c, 0x247a: 0x002c988c, 0x247b: 0x002d088c, + 0x247c: 0x002d228c, 0x247d: 0x002d688c, 0x247e: 0x002d9a8c, 0x247f: 0x002dcc8c, + // Block 0x92, offset 0x2480 + 0x2480: 0x002dfe8c, 0x2481: 0x002e228c, 0x2482: 0x002e828c, 0x2483: 0x002e9e8c, + 0x2484: 0x002ee28c, 0x2485: 0x002f2c8c, 0x2486: 0x002f568c, 0x2487: 0x002f7a8c, + 0x2488: 0x002fe68c, 0x2489: 0x00302c8c, 0x248a: 0x00306c8c, 0x248b: 0x0030be8c, + 0x248c: 0x0030e28c, 0x248d: 0x0030f68c, 0x248e: 0x0031008c, 0x248f: 0x00312a8c, + 0x2490: 0x002bde86, 0x2491: 0x002c0a86, 0x2492: 0x002c3a86, 0x2493: 0x002c6286, + 0x2494: 0x002c9886, 0x2495: 0x002d0886, 0x2496: 0x002d2286, 0x2497: 0x002d6886, + 0x2498: 0x002d9a86, 0x2499: 0x002dcc86, 0x249a: 0x002dfe86, 0x249b: 0x002e2286, + 0x249c: 0x002e8286, 0x249d: 0x002e9e86, 0x249e: 0x002ee286, 0x249f: 0x002f2c86, + 0x24a0: 0x002f5686, 0x24a1: 0x002f7a86, 0x24a2: 0x002fe686, 0x24a3: 0x00302c86, + 0x24a4: 0x00306c86, 0x24a5: 0x0030be86, 0x24a6: 0x0030e286, 0x24a7: 0x0030f686, + 0x24a8: 0x00310086, 0x24a9: 0x00312a86, 0x24aa: 0x0029cc86, 0x24ab: 0xe00002e6, + 0x24ac: 0xe00002e9, 0x24ad: 0xe00002ec, 0x24ae: 0xe00002ef, 0x24af: 0xe00002f2, + 0x24b0: 0xe00002f5, 0x24b1: 0xe00002f8, 0x24b2: 0xe00002fb, 0x24b3: 0xe00002fe, + 0x24b4: 0xe00003d5, 0x24b5: 0x0029ce86, 0x24b6: 0x0029d086, 0x24b7: 0x0029d286, + 0x24b8: 0x0029d486, 0x24b9: 0x0029d686, 0x24ba: 0x0029d886, 0x24bb: 0x0029da86, + 0x24bc: 0x0029dc86, 0x24bd: 0x0029de86, 0x24be: 0xe00002d7, 0x24bf: 0x0029cc86, + // Block 0x93, offset 0x24c0 + 0x24c0: 0x400d2e20, 0x24c1: 0x400d3020, 0x24c2: 0x400d3220, 0x24c3: 0x400d3420, + 0x24c4: 0x400d3620, 0x24c5: 0x400d3820, 0x24c6: 0x400d3a20, 0x24c7: 0x400d3c20, + 0x24c8: 0x400d3e20, 0x24c9: 0x400d4020, 0x24ca: 0x400d4220, 0x24cb: 0x400d4420, + 0x24cc: 0x400d4620, 0x24cd: 0x400d4820, 0x24ce: 0x400d4a20, 0x24cf: 0x400d4c20, + 0x24d0: 0x400d4e20, 0x24d1: 0x400d5020, 0x24d2: 0x400d5220, 0x24d3: 0x400d5420, + 0x24d4: 0x400d5620, 0x24d5: 0x400d5820, 0x24d6: 0x400d5a20, 0x24d7: 0x400d5c20, + 0x24d8: 0x400d5e20, 0x24d9: 0x400d6020, 0x24da: 0x400d6220, 0x24db: 0x400d6420, + 0x24dc: 0x400d6620, 0x24dd: 0x400d6820, 0x24de: 0x400d6a20, 0x24df: 0x400d6c20, + 0x24e0: 0x400d6e20, 0x24e1: 0x400d7020, 0x24e2: 0x400d7220, 0x24e3: 0x400d7420, + 0x24e4: 0x400d7620, 0x24e5: 0x400d7820, 0x24e6: 0x400d7a20, 0x24e7: 0x400d7c20, + 0x24e8: 0x400d7e20, 0x24e9: 0x400d8020, 0x24ea: 0x400d8220, 0x24eb: 0x400d8420, + 0x24ec: 0x400d8620, 0x24ed: 0x400d8820, 0x24ee: 0x400d8a20, 0x24ef: 0x400d8c20, + 0x24f0: 0x400d8e20, 0x24f1: 0x400d9020, 0x24f2: 0x400d9220, 0x24f3: 0x400d9420, + 0x24f4: 0x400d9620, 0x24f5: 0x400d9820, 0x24f6: 0x400d9a20, 0x24f7: 0x400d9c20, + 0x24f8: 0x400d9e20, 0x24f9: 0x400da020, 0x24fa: 0x400da220, 0x24fb: 0x400da420, + 0x24fc: 0x400da620, 0x24fd: 0x400da820, 0x24fe: 0x400daa20, 0x24ff: 0x400dac20, + // Block 0x94, offset 0x2500 + 0x2500: 0x400dae20, 0x2501: 0x400db020, 0x2502: 0x400db220, 0x2503: 0x400db420, + 0x2504: 0x400db620, 0x2505: 0x400db820, 0x2506: 0x400dba20, 0x2507: 0x400dbc20, + 0x2508: 0x400dbe20, 0x2509: 0x400dc020, 0x250a: 0x400dc220, 0x250b: 0x400dc420, + 0x250c: 0x400dc620, 0x250d: 0x400dc820, 0x250e: 0x400dca20, 0x250f: 0x400dcc20, + 0x2510: 0x400dce20, 0x2511: 0x400dd020, 0x2512: 0x400dd220, 0x2513: 0x400dd420, + 0x2514: 0x400dd620, 0x2515: 0x400dd820, 0x2516: 0x400dda20, 0x2517: 0x400ddc20, + 0x2518: 0x400dde20, 0x2519: 0x400de020, 0x251a: 0x400de220, 0x251b: 0x400de420, + 0x251c: 0x400de620, 0x251d: 0x400de820, 0x251e: 0x400dea20, 0x251f: 0x400dec20, + 0x2520: 0x400dee20, 0x2521: 0x400df020, 0x2522: 0x400df220, 0x2523: 0x400df420, + 0x2524: 0x400df620, 0x2525: 0x400df820, 0x2526: 0x400dfa20, 0x2527: 0x400dfc20, + 0x2528: 0x400dfe20, 0x2529: 0x400e0020, 0x252a: 0x400e0220, 0x252b: 0x400e0420, + 0x252c: 0x400e0620, 0x252d: 0x400e0820, 0x252e: 0x400e0a20, 0x252f: 0x400e0c20, + 0x2530: 0x400e0e20, 0x2531: 0x400e1020, 0x2532: 0x400e1220, 0x2533: 0x400e1420, + 0x2534: 0x400e1620, 0x2535: 0x400e1820, 0x2536: 0x400e1a20, 0x2537: 0x400e1c20, + 0x2538: 0x400e1e20, 0x2539: 0x400e2020, 0x253a: 0x400e2220, 0x253b: 0x400e2420, + 0x253c: 0x400e2620, 0x253d: 0x400e2820, 0x253e: 0x400e2a20, 0x253f: 0x400e2c20, + // Block 0x95, offset 0x2540 + 0x2540: 0x400e2e20, 0x2541: 0x400e3020, 0x2542: 0x400e3220, 0x2543: 0x400e3420, + 0x2544: 0x400e3620, 0x2545: 0x400e3820, 0x2546: 0x400e3a20, 0x2547: 0x400e3c20, + 0x2548: 0x400e3e20, 0x2549: 0x400e4020, 0x254a: 0x400e4220, 0x254b: 0x400e4420, + 0x254c: 0x400e4620, 0x254d: 0x400e4820, 0x254e: 0x400e4a20, 0x254f: 0x400e4c20, + 0x2550: 0x400e4e20, 0x2551: 0x400e5020, 0x2552: 0x400e5220, 0x2553: 0x400e5420, + 0x2554: 0x400e5620, 0x2555: 0x400e5820, 0x2556: 0x400e5a20, 0x2557: 0x400e5c20, + 0x2558: 0x400e5e20, 0x2559: 0x400e6020, 0x255a: 0x400e6220, 0x255b: 0x400e6420, + 0x255c: 0x400e6620, 0x255d: 0x400e6820, 0x255e: 0x400e6a20, 0x255f: 0x400e6c20, + 0x2560: 0x400e6e20, 0x2561: 0x400e7020, 0x2562: 0x400e7220, 0x2563: 0x400e7420, + 0x2564: 0x400e7620, 0x2565: 0x400e7820, 0x2566: 0x400e7a20, 0x2567: 0x400e7c20, + 0x2568: 0x400e7e20, 0x2569: 0x400e8020, 0x256a: 0x400e8220, 0x256b: 0x400e8420, + 0x256c: 0x400e8620, 0x256d: 0x400e8820, 0x256e: 0x400e8a20, 0x256f: 0x400e8c20, + 0x2570: 0x400e8e20, 0x2571: 0x400e9020, 0x2572: 0x400e9220, 0x2573: 0x400e9420, + 0x2574: 0x400e9620, 0x2575: 0x400e9820, 0x2576: 0x400e9a20, 0x2577: 0x400e9c20, + 0x2578: 0x400e9e20, 0x2579: 0x400ea020, 0x257a: 0x400ea220, 0x257b: 0x400ea420, + 0x257c: 0x400ea620, 0x257d: 0x400ea820, 0x257e: 0x400eaa20, 0x257f: 0x400eac20, + // Block 0x96, offset 0x2580 + 0x2580: 0x400eae20, 0x2581: 0x400eb020, 0x2582: 0x400eb220, 0x2583: 0x400eb420, + 0x2584: 0x400eb620, 0x2585: 0x400eb820, 0x2586: 0x400eba20, 0x2587: 0x400ebc20, + 0x2588: 0x400ebe20, 0x2589: 0x400ec020, 0x258a: 0x400ec220, 0x258b: 0x400ec420, + 0x258c: 0x400ec620, 0x258d: 0x400ec820, 0x258e: 0x400eca20, 0x258f: 0x400ecc20, + 0x2590: 0x400ece20, 0x2591: 0x400ed020, 0x2592: 0x400ed220, 0x2593: 0x400ed420, + 0x2594: 0x400ed620, 0x2595: 0x400ed820, 0x2596: 0x400eda20, 0x2597: 0x400edc20, + 0x2598: 0x400ede20, 0x2599: 0x400ee020, 0x259a: 0x400ee220, 0x259b: 0x400ee420, + 0x259c: 0x400ee620, 0x259d: 0x400ee820, 0x259e: 0x400eea20, 0x259f: 0x400eec20, + 0x25a0: 0x400eee20, 0x25a1: 0x400ef020, 0x25a2: 0x400ef220, 0x25a3: 0x400ef420, + 0x25a4: 0x400ef620, 0x25a5: 0x400ef820, 0x25a6: 0x400efa20, 0x25a7: 0x400efc20, + 0x25a8: 0x400efe20, 0x25a9: 0x400f0020, 0x25aa: 0x400f0220, 0x25ab: 0x400f0420, + 0x25ac: 0x400f0620, 0x25ad: 0x400f0820, 0x25ae: 0x400f0a20, 0x25af: 0x400f0c20, + 0x25b0: 0x400f0e20, 0x25b1: 0x400f1020, 0x25b2: 0x400f1220, 0x25b3: 0x400f1420, + 0x25b4: 0x400f1620, 0x25b5: 0x400f1820, 0x25b6: 0x400f1a20, 0x25b7: 0x400f1c20, + 0x25b8: 0x400f1e20, 0x25b9: 0x400f2020, 0x25ba: 0x400f2220, 0x25bb: 0x400f2420, + 0x25bc: 0x400f2620, 0x25bd: 0x400f2820, 0x25be: 0x400f2a20, 0x25bf: 0x400f2c20, + // Block 0x97, offset 0x25c0 + 0x25c0: 0x400f2e20, 0x25c1: 0x400f3020, 0x25c2: 0x400f3220, 0x25c3: 0x400f3420, + 0x25c4: 0x400f3620, 0x25c5: 0x400f3820, 0x25c6: 0x400f3a20, 0x25c7: 0x400f3c20, + 0x25c8: 0x400f3e20, 0x25c9: 0x400f4020, 0x25ca: 0x400f4220, 0x25cb: 0x400f4420, + 0x25cc: 0x400f4620, 0x25cd: 0x400f4820, 0x25ce: 0x400f4a20, 0x25cf: 0x400f4c20, + 0x25d0: 0x400f4e20, 0x25d1: 0x400f5020, 0x25d2: 0x400f5220, 0x25d3: 0x400f5420, + 0x25d4: 0x400f5620, 0x25d5: 0x400f5820, 0x25d6: 0x400f5a20, 0x25d7: 0x400f5c20, + 0x25d8: 0x400f5e20, 0x25d9: 0x400f6020, 0x25da: 0x400f6220, 0x25db: 0x400f6420, + 0x25dc: 0x400f6620, 0x25dd: 0x400f6820, 0x25de: 0x400f6a20, 0x25df: 0x400f6c20, + 0x25e0: 0x400f6e20, 0x25e1: 0x400f7020, 0x25e2: 0x400f7220, 0x25e3: 0x400f7420, + 0x25e4: 0x400f7620, 0x25e5: 0x400f7820, 0x25e6: 0x400f7a20, 0x25e7: 0x400f7c20, + 0x25e8: 0x400f7e20, 0x25e9: 0x400f8020, 0x25ea: 0x400f8220, 0x25eb: 0x400f8420, + 0x25ec: 0x400f8620, 0x25ed: 0x400f8820, 0x25ee: 0x400f8a20, 0x25ef: 0x400f8c20, + 0x25f0: 0x40195220, 0x25f1: 0x40195420, 0x25f2: 0x40195620, 0x25f3: 0x40195820, + 0x25f4: 0x40195a20, 0x25f5: 0x40195c20, 0x25f6: 0x40195e20, 0x25f7: 0x40196020, + 0x25f8: 0x400f8e20, 0x25f9: 0x400f9020, 0x25fa: 0x400f9220, 0x25fb: 0x400f9420, + 0x25fc: 0x400f9620, 0x25fd: 0x400f9820, 0x25fe: 0x400f9a20, 0x25ff: 0x400f9c20, + // Block 0x98, offset 0x2600 + 0x2600: 0x400f9e20, 0x2601: 0x400fa020, 0x2602: 0x400fa220, 0x2603: 0x400fa420, + 0x2604: 0x400fa620, 0x2605: 0x400fa820, 0x2606: 0x400faa20, 0x2607: 0x400fac20, + 0x2608: 0x400fae20, 0x2609: 0x400fb020, 0x260a: 0x400fb220, 0x260b: 0x400fb420, + 0x260c: 0x400fb620, 0x260d: 0x400fb820, 0x260e: 0x400fba20, 0x260f: 0x400fbc20, + 0x2610: 0x400fbe20, 0x2611: 0x400fc020, 0x2612: 0x400fc220, 0x2613: 0x400fc420, + 0x2614: 0x400fc620, 0x2615: 0x400fc820, 0x2616: 0x400fca20, 0x2617: 0x400fcc20, + 0x2618: 0x400fce20, 0x2619: 0x400fd020, 0x261a: 0x400fd220, 0x261b: 0x400fd420, + 0x261c: 0x400fd620, 0x261d: 0x400fd820, 0x261e: 0x400fda20, 0x261f: 0x400fdc20, + 0x2620: 0x400fde20, 0x2621: 0x400fe020, 0x2622: 0x400fe220, 0x2623: 0x400fe420, + 0x2624: 0x400fe620, 0x2625: 0x400fe820, 0x2626: 0x400fea20, 0x2627: 0x400fec20, + 0x2628: 0x400fee20, 0x2629: 0x400ff020, 0x262a: 0x400ff220, 0x262b: 0x400ff420, + 0x262c: 0x400ff620, 0x262d: 0x401dde20, 0x262e: 0x401de020, 0x262f: 0x401de220, + 0x2630: 0x400ff820, 0x2631: 0x400ffa20, 0x2632: 0x400ffc20, 0x2633: 0x400ffe20, + 0x2634: 0x40100020, 0x2635: 0x40100220, 0x2636: 0x40100420, 0x2637: 0x40100620, + 0x2638: 0x40100820, 0x2639: 0x40100a20, 0x263a: 0x40100c20, 0x263b: 0x40100e20, + 0x263c: 0x40101020, 0x263d: 0x40101220, 0x263e: 0x40101420, 0x263f: 0x40101620, + // Block 0x99, offset 0x2640 + 0x2640: 0x40101820, 0x2641: 0x40101a20, 0x2642: 0x40101c20, 0x2643: 0x40101e20, + 0x2644: 0x40102020, 0x2645: 0x40102220, 0x2646: 0x40102420, 0x2647: 0x40102620, + 0x2648: 0x40102820, 0x2649: 0x40102a20, 0x264a: 0x40194620, 0x264b: 0x40194820, + 0x264c: 0x40194a20, 0x264d: 0x40194c20, 0x264e: 0x40194e20, 0x264f: 0x40195020, + 0x2650: 0x40102c20, 0x2651: 0x40102e20, 0x2652: 0x40103020, 0x2653: 0x40103220, + 0x2654: 0x40103420, 0x2655: 0x40103620, 0x2656: 0x40103820, 0x2657: 0x40103a20, + 0x2658: 0x40103c20, 0x2659: 0x40103e20, 0x265a: 0x40104020, 0x265b: 0x40104220, + 0x265c: 0x40104420, 0x265d: 0x40104620, 0x265e: 0x40104820, 0x265f: 0x40104a20, + 0x2660: 0x40104c20, 0x2661: 0x40104e20, 0x2662: 0x40105020, 0x2663: 0x40105220, + 0x2664: 0x40105420, 0x2665: 0x40105620, 0x2666: 0x40105820, 0x2667: 0x40105a20, + 0x2668: 0x40105c20, 0x2669: 0x40105e20, 0x266a: 0x40106020, 0x266b: 0x40106220, + 0x266c: 0x40106420, 0x266d: 0x40106620, 0x266e: 0x40106820, 0x266f: 0x40106a20, + 0x2670: 0x40106c20, 0x2671: 0x40106e20, 0x2672: 0x40107020, 0x2673: 0x40107220, + 0x2674: 0x40107420, 0x2675: 0x40107620, 0x2676: 0x40107820, 0x2677: 0x40107a20, + 0x2678: 0x40107c20, 0x2679: 0x40107e20, 0x267a: 0x40108020, 0x267b: 0x40108220, + 0x267c: 0x40108420, 0x267d: 0x40108620, 0x267e: 0x40108820, 0x267f: 0x40108a20, + // Block 0x9a, offset 0x2680 + 0x2680: 0x40108c20, 0x2681: 0x40108e20, 0x2682: 0x40109020, 0x2683: 0x40109220, + 0x2684: 0x40109420, 0x2685: 0x40109620, 0x2686: 0x40109820, 0x2687: 0x40109a20, + 0x2688: 0x40109c20, 0x2689: 0x40109e20, 0x268a: 0x4010a020, 0x268b: 0x4010a220, + 0x268c: 0x4010a420, 0x268d: 0x4010a620, 0x268e: 0x4010a820, 0x268f: 0x4010aa20, + 0x2690: 0x4010ac20, 0x2691: 0x4010ae20, 0x2692: 0x4010b020, 0x2693: 0x4010b220, + 0x2694: 0x4010b420, 0x2695: 0x4010b620, 0x2696: 0x4010b820, 0x2697: 0x4010ba20, + 0x2698: 0x4010bc20, 0x2699: 0x4010be20, 0x269a: 0x4010c020, 0x269b: 0x4010c220, + 0x269c: 0x4010c420, 0x269d: 0x4010c620, 0x269e: 0x4010c820, 0x269f: 0x4010ca20, + 0x26a0: 0x4010cc20, 0x26a1: 0x4010ce20, 0x26a2: 0x4010d020, 0x26a3: 0x4010d220, + 0x26a4: 0x4010d420, 0x26a5: 0x4010d620, 0x26a6: 0x4010d820, 0x26a7: 0x4010da20, + 0x26a8: 0x4010dc20, 0x26a9: 0x4010de20, 0x26aa: 0x4010e020, 0x26ab: 0x4010e220, + 0x26ac: 0x4010e420, 0x26ad: 0x4010e620, 0x26ae: 0x4010e820, 0x26af: 0x4010ea20, + 0x26b0: 0x4010ec20, 0x26b1: 0x4010ee20, 0x26b2: 0x4010f020, 0x26b3: 0x4010f220, + 0x26b4: 0x4010f420, 0x26b5: 0x4010f620, 0x26b6: 0x4010f820, 0x26b7: 0x4010fa20, + 0x26b8: 0x4010fc20, 0x26b9: 0x4010fe20, 0x26ba: 0x40110020, 0x26bb: 0x40110220, + 0x26bc: 0x40110420, 0x26bd: 0x40110620, 0x26be: 0x40110820, 0x26bf: 0x40110a20, + // Block 0x9b, offset 0x26c0 + 0x26c1: 0x40114020, 0x26c2: 0x40114220, 0x26c3: 0x40114420, + 0x26c4: 0x40114620, 0x26c5: 0x40114820, 0x26c6: 0x40114a20, 0x26c7: 0x40114c20, + 0x26c8: 0x40114e20, 0x26c9: 0x40115020, 0x26ca: 0x40115220, 0x26cb: 0x40115420, + 0x26cc: 0x40115620, 0x26cd: 0x40115820, 0x26ce: 0x40115a20, 0x26cf: 0x40115c20, + 0x26d0: 0x40115e20, 0x26d1: 0x40116020, 0x26d2: 0x40116220, 0x26d3: 0x40116420, + 0x26d4: 0x40116620, 0x26d5: 0x40116820, 0x26d6: 0x40116a20, 0x26d7: 0x40116c20, + 0x26d8: 0x40116e20, 0x26d9: 0x40117020, 0x26da: 0x40117220, 0x26db: 0x40117420, + 0x26dc: 0x40117620, 0x26dd: 0x40117820, 0x26de: 0x40117a20, 0x26df: 0x40117c20, + 0x26e0: 0x40117e20, 0x26e1: 0x40118020, 0x26e2: 0x40118220, 0x26e3: 0x40118420, + 0x26e4: 0x40118620, 0x26e5: 0x40118820, 0x26e6: 0x40118a20, 0x26e7: 0x40118c20, + 0x26e8: 0x40118e20, 0x26e9: 0x40119020, 0x26ea: 0x40119220, 0x26eb: 0x40119420, + 0x26ec: 0x40119620, 0x26ed: 0x40119820, 0x26ee: 0x40119a20, 0x26ef: 0x40119c20, + 0x26f0: 0x40119e20, 0x26f1: 0x4011a020, 0x26f2: 0x4011a220, 0x26f3: 0x4011a420, + 0x26f4: 0x4011a620, 0x26f5: 0x4011a820, 0x26f6: 0x4011aa20, 0x26f7: 0x4011ac20, + 0x26f8: 0x4011ae20, 0x26f9: 0x4011b020, 0x26fa: 0x4011b220, 0x26fb: 0x4011b420, + 0x26fc: 0x4011b620, 0x26fd: 0x4011b820, 0x26fe: 0x4011ba20, 0x26ff: 0x4011bc20, + // Block 0x9c, offset 0x2700 + 0x2700: 0x4011be20, 0x2701: 0x4011c020, 0x2702: 0x4011c220, 0x2703: 0x4011c420, + 0x2704: 0x4011c620, 0x2705: 0x4011c820, 0x2706: 0x4011ca20, 0x2707: 0x4011cc20, + 0x2708: 0x4011ce20, 0x2709: 0x4011d020, 0x270a: 0x4011d220, 0x270b: 0x4011d420, + 0x270c: 0x4011d620, 0x270d: 0x4011d820, 0x270e: 0x4011da20, 0x270f: 0x4011dc20, + 0x2710: 0x4011de20, 0x2711: 0x4011e020, 0x2712: 0x4011e220, 0x2713: 0x4011e420, + 0x2714: 0x4011e620, 0x2715: 0x4011e820, 0x2716: 0x4011ea20, 0x2717: 0x4011ec20, + 0x2718: 0x4011ee20, 0x2719: 0x4011f020, 0x271a: 0x4011f220, 0x271b: 0x4011f420, + 0x271c: 0x4011f620, 0x271d: 0x4011f820, 0x271e: 0x4011fa20, 0x271f: 0x4011fc20, + 0x2720: 0x4011fe20, 0x2721: 0x40120020, 0x2722: 0x40120220, 0x2723: 0x40120420, + 0x2724: 0x40120620, 0x2725: 0x40120820, 0x2726: 0x40120a20, 0x2727: 0x40120c20, + 0x2728: 0x40045820, 0x2729: 0x40045a20, 0x272a: 0x40045c20, 0x272b: 0x40045e20, + 0x272c: 0x40046020, 0x272d: 0x40046220, 0x272e: 0x40046420, 0x272f: 0x40046620, + 0x2730: 0x40046820, 0x2731: 0x40046a20, 0x2732: 0x40046c20, 0x2733: 0x40046e20, + 0x2734: 0x40047020, 0x2735: 0x40047220, 0x2736: 0x0029ce86, 0x2737: 0x0029d086, + 0x2738: 0x0029d286, 0x2739: 0x0029d486, 0x273a: 0x0029d686, 0x273b: 0x0029d886, + 0x273c: 0x0029da86, 0x273d: 0x0029dc86, 0x273e: 0x0029de86, 0x273f: 0xe00002da, + // Block 0x9d, offset 0x2740 + 0x2740: 0x0029ce86, 0x2741: 0x0029d086, 0x2742: 0x0029d286, 0x2743: 0x0029d486, + 0x2744: 0x0029d686, 0x2745: 0x0029d886, 0x2746: 0x0029da86, 0x2747: 0x0029dc86, + 0x2748: 0x0029de86, 0x2749: 0xe00002dd, 0x274a: 0x0029ce86, 0x274b: 0x0029d086, + 0x274c: 0x0029d286, 0x274d: 0x0029d486, 0x274e: 0x0029d686, 0x274f: 0x0029d886, + 0x2750: 0x0029da86, 0x2751: 0x0029dc86, 0x2752: 0x0029de86, 0x2753: 0xe00002e0, + 0x2754: 0x40120e20, 0x2755: 0x40121020, 0x2756: 0x40121220, 0x2757: 0x40121420, + 0x2758: 0x40121620, 0x2759: 0x40121820, 0x275a: 0x40121a20, 0x275b: 0x40121c20, + 0x275c: 0x40121e20, 0x275d: 0x40122020, 0x275e: 0x40122220, 0x275f: 0x40122420, + 0x2760: 0x40122620, 0x2761: 0x40122820, 0x2762: 0x40122a20, 0x2763: 0x40122c20, + 0x2764: 0x40122e20, 0x2765: 0x40123020, 0x2766: 0x40123220, 0x2767: 0x40123420, + 0x2768: 0x40123620, 0x2769: 0x40123820, 0x276a: 0x40123a20, 0x276b: 0x40123c20, + 0x276c: 0x40123e20, 0x276d: 0x40124020, 0x276e: 0x40124220, 0x276f: 0x40124420, + 0x2770: 0x40124620, 0x2771: 0x40124820, 0x2772: 0x40124a20, 0x2773: 0x40124c20, + 0x2774: 0x40124e20, 0x2775: 0x40125020, 0x2776: 0x40125220, 0x2777: 0x40125420, + 0x2778: 0x40125620, 0x2779: 0x40125820, 0x277a: 0x40125a20, 0x277b: 0x40125c20, + 0x277c: 0x40125e20, 0x277d: 0x40126020, 0x277e: 0x40126220, 0x277f: 0x40126420, + // Block 0x9e, offset 0x2780 + 0x2780: 0x40126620, 0x2781: 0x40126820, 0x2782: 0x40126a20, 0x2783: 0x40126c20, + 0x2784: 0x40126e20, 0x2785: 0x40044020, 0x2786: 0x40044220, 0x2787: 0x40127020, + 0x2788: 0x40127220, 0x2789: 0x40127420, 0x278a: 0x40127620, 0x278b: 0x40127820, + 0x278c: 0x40127a20, 0x278d: 0x40127c20, 0x278e: 0x40127e20, 0x278f: 0x40128020, + 0x2790: 0x40128220, 0x2791: 0x40128420, 0x2792: 0x40128620, 0x2793: 0x40128820, + 0x2794: 0x40128a20, 0x2795: 0x40128c20, 0x2796: 0x40128e20, 0x2797: 0x40129020, + 0x2798: 0x40129220, 0x2799: 0x40129420, 0x279a: 0x40129620, 0x279b: 0x40129820, + 0x279c: 0x40129a20, 0x279d: 0x40129c20, 0x279e: 0x40129e20, 0x279f: 0x4012a020, + 0x27a0: 0x4012a220, 0x27a1: 0x4012a420, 0x27a2: 0x4012a620, 0x27a3: 0x4012a820, + 0x27a4: 0x4012aa20, 0x27a5: 0x4012ac20, 0x27a6: 0x40044420, 0x27a7: 0x40044620, + 0x27a8: 0x40044820, 0x27a9: 0x40044a20, 0x27aa: 0x40044c20, 0x27ab: 0x40044e20, + 0x27ac: 0x40045020, 0x27ad: 0x40045220, 0x27ae: 0x40045420, 0x27af: 0x40045620, + 0x27b0: 0x4012ae20, 0x27b1: 0x4012b020, 0x27b2: 0x4012b220, 0x27b3: 0x4012b420, + 0x27b4: 0x4012b620, 0x27b5: 0x4012b820, 0x27b6: 0x4012ba20, 0x27b7: 0x4012bc20, + 0x27b8: 0x4012be20, 0x27b9: 0x4012c020, 0x27ba: 0x4012c220, 0x27bb: 0x4012c420, + 0x27bc: 0x4012c620, 0x27bd: 0x4012c820, 0x27be: 0x4012ca20, 0x27bf: 0x4012cc20, + // Block 0x9f, offset 0x27c0 + 0x27c0: 0x40174620, 0x27c1: 0x40174820, 0x27c2: 0x40174a20, 0x27c3: 0x40174c20, + 0x27c4: 0x40174e20, 0x27c5: 0x40175020, 0x27c6: 0x40175220, 0x27c7: 0x40175420, + 0x27c8: 0x40175620, 0x27c9: 0x40175820, 0x27ca: 0x40175a20, 0x27cb: 0x40175c20, + 0x27cc: 0x40175e20, 0x27cd: 0x40176020, 0x27ce: 0x40176220, 0x27cf: 0x40176420, + 0x27d0: 0x40176620, 0x27d1: 0x40176820, 0x27d2: 0x40176a20, 0x27d3: 0x40176c20, + 0x27d4: 0x40176e20, 0x27d5: 0x40177020, 0x27d6: 0x40177220, 0x27d7: 0x40177420, + 0x27d8: 0x40177620, 0x27d9: 0x40177820, 0x27da: 0x40177a20, 0x27db: 0x40177c20, + 0x27dc: 0x40177e20, 0x27dd: 0x40178020, 0x27de: 0x40178220, 0x27df: 0x40178420, + 0x27e0: 0x40178620, 0x27e1: 0x40178820, 0x27e2: 0x40178a20, 0x27e3: 0x40178c20, + 0x27e4: 0x40178e20, 0x27e5: 0x40179020, 0x27e6: 0x40179220, 0x27e7: 0x40179420, + 0x27e8: 0x40179620, 0x27e9: 0x40179820, 0x27ea: 0x40179a20, 0x27eb: 0x40179c20, + 0x27ec: 0x40179e20, 0x27ed: 0x4017a020, 0x27ee: 0x4017a220, 0x27ef: 0x4017a420, + 0x27f0: 0x4017a620, 0x27f1: 0x4017a820, 0x27f2: 0x4017aa20, 0x27f3: 0x4017ac20, + 0x27f4: 0x4017ae20, 0x27f5: 0x4017b020, 0x27f6: 0x4017b220, 0x27f7: 0x4017b420, + 0x27f8: 0x4017b620, 0x27f9: 0x4017b820, 0x27fa: 0x4017ba20, 0x27fb: 0x4017bc20, + 0x27fc: 0x4017be20, 0x27fd: 0x4017c020, 0x27fe: 0x4017c220, 0x27ff: 0x4017c420, + // Block 0xa0, offset 0x2800 + 0x2800: 0x4017c620, 0x2801: 0x4017c820, 0x2802: 0x4017ca20, 0x2803: 0x4017cc20, + 0x2804: 0x4017ce20, 0x2805: 0x4017d020, 0x2806: 0x4017d220, 0x2807: 0x4017d420, + 0x2808: 0x4017d620, 0x2809: 0x4017d820, 0x280a: 0x4017da20, 0x280b: 0x4017dc20, + 0x280c: 0x4017de20, 0x280d: 0x4017e020, 0x280e: 0x4017e220, 0x280f: 0x4017e420, + 0x2810: 0x4017e620, 0x2811: 0x4017e820, 0x2812: 0x4017ea20, 0x2813: 0x4017ec20, + 0x2814: 0x4017ee20, 0x2815: 0x4017f020, 0x2816: 0x4017f220, 0x2817: 0x4017f420, + 0x2818: 0x4017f620, 0x2819: 0x4017f820, 0x281a: 0x4017fa20, 0x281b: 0x4017fc20, + 0x281c: 0x4017fe20, 0x281d: 0x40180020, 0x281e: 0x40180220, 0x281f: 0x40180420, + 0x2820: 0x40180620, 0x2821: 0x40180820, 0x2822: 0x40180a20, 0x2823: 0x40180c20, + 0x2824: 0x40180e20, 0x2825: 0x40181020, 0x2826: 0x40181220, 0x2827: 0x40181420, + 0x2828: 0x40181620, 0x2829: 0x40181820, 0x282a: 0x40181a20, 0x282b: 0x40181c20, + 0x282c: 0x40181e20, 0x282d: 0x40182020, 0x282e: 0x40182220, 0x282f: 0x40182420, + 0x2830: 0x40182620, 0x2831: 0x40182820, 0x2832: 0x40182a20, 0x2833: 0x40182c20, + 0x2834: 0x40182e20, 0x2835: 0x40183020, 0x2836: 0x40183220, 0x2837: 0x40183420, + 0x2838: 0x40183620, 0x2839: 0x40183820, 0x283a: 0x40183a20, 0x283b: 0x40183c20, + 0x283c: 0x40183e20, 0x283d: 0x40184020, 0x283e: 0x40184220, 0x283f: 0x40184420, + // Block 0xa1, offset 0x2840 + 0x2840: 0x40184620, 0x2841: 0x40184820, 0x2842: 0x40184a20, 0x2843: 0x40184c20, + 0x2844: 0x40184e20, 0x2845: 0x40185020, 0x2846: 0x40185220, 0x2847: 0x40185420, + 0x2848: 0x40185620, 0x2849: 0x40185820, 0x284a: 0x40185a20, 0x284b: 0x40185c20, + 0x284c: 0x40185e20, 0x284d: 0x40186020, 0x284e: 0x40186220, 0x284f: 0x40186420, + 0x2850: 0x40186620, 0x2851: 0x40186820, 0x2852: 0x40186a20, 0x2853: 0x40186c20, + 0x2854: 0x40186e20, 0x2855: 0x40187020, 0x2856: 0x40187220, 0x2857: 0x40187420, + 0x2858: 0x40187620, 0x2859: 0x40187820, 0x285a: 0x40187a20, 0x285b: 0x40187c20, + 0x285c: 0x40187e20, 0x285d: 0x40188020, 0x285e: 0x40188220, 0x285f: 0x40188420, + 0x2860: 0x40188620, 0x2861: 0x40188820, 0x2862: 0x40188a20, 0x2863: 0x40188c20, + 0x2864: 0x40188e20, 0x2865: 0x40189020, 0x2866: 0x40189220, 0x2867: 0x40189420, + 0x2868: 0x40189620, 0x2869: 0x40189820, 0x286a: 0x40189a20, 0x286b: 0x40189c20, + 0x286c: 0x40189e20, 0x286d: 0x4018a020, 0x286e: 0x4018a220, 0x286f: 0x4018a420, + 0x2870: 0x4018a620, 0x2871: 0x4018a820, 0x2872: 0x4018aa20, 0x2873: 0x4018ac20, + 0x2874: 0x4018ae20, 0x2875: 0x4018b020, 0x2876: 0x4018b220, 0x2877: 0x4018b420, + 0x2878: 0x4018b620, 0x2879: 0x4018b820, 0x287a: 0x4018ba20, 0x287b: 0x4018bc20, + 0x287c: 0x4018be20, 0x287d: 0x4018c020, 0x287e: 0x4018c220, 0x287f: 0x4018c420, + // Block 0xa2, offset 0x2880 + 0x2880: 0x4018c620, 0x2881: 0x4018c820, 0x2882: 0x4018ca20, 0x2883: 0x4018cc20, + 0x2884: 0x4018ce20, 0x2885: 0x4018d020, 0x2886: 0x4018d220, 0x2887: 0x4018d420, + 0x2888: 0x4018d620, 0x2889: 0x4018d820, 0x288a: 0x4018da20, 0x288b: 0x4018dc20, + 0x288c: 0x4018de20, 0x288d: 0x4018e020, 0x288e: 0x4018e220, 0x288f: 0x4018e420, + 0x2890: 0x4018e620, 0x2891: 0x4018e820, 0x2892: 0x4018ea20, 0x2893: 0x4018ec20, + 0x2894: 0x4018ee20, 0x2895: 0x4018f020, 0x2896: 0x4018f220, 0x2897: 0x4018f420, + 0x2898: 0x4018f620, 0x2899: 0x4018f820, 0x289a: 0x4018fa20, 0x289b: 0x4018fc20, + 0x289c: 0x4018fe20, 0x289d: 0x40190020, 0x289e: 0x40190220, 0x289f: 0x40190420, + 0x28a0: 0x40190620, 0x28a1: 0x40190820, 0x28a2: 0x40190a20, 0x28a3: 0x40190c20, + 0x28a4: 0x40190e20, 0x28a5: 0x40191020, 0x28a6: 0x40191220, 0x28a7: 0x40191420, + 0x28a8: 0x40191620, 0x28a9: 0x40191820, 0x28aa: 0x40191a20, 0x28ab: 0x40191c20, + 0x28ac: 0x40191e20, 0x28ad: 0x40192020, 0x28ae: 0x40192220, 0x28af: 0x40192420, + 0x28b0: 0x40192620, 0x28b1: 0x40192820, 0x28b2: 0x40192a20, 0x28b3: 0x40192c20, + 0x28b4: 0x40192e20, 0x28b5: 0x40193020, 0x28b6: 0x40193220, 0x28b7: 0x40193420, + 0x28b8: 0x40193620, 0x28b9: 0x40193820, 0x28ba: 0x40193a20, 0x28bb: 0x40193c20, + 0x28bc: 0x40193e20, 0x28bd: 0x40194020, 0x28be: 0x40194220, 0x28bf: 0x40194420, + // Block 0xa3, offset 0x28c0 + 0x28c0: 0x4012ce20, 0x28c1: 0x4012d020, 0x28c2: 0x4012d220, 0x28c3: 0x4012d420, + 0x28c4: 0x4012d620, 0x28c5: 0x4012d820, 0x28c6: 0x4012da20, 0x28c7: 0x4012dc20, + 0x28c8: 0x4012de20, 0x28c9: 0x4012e020, 0x28ca: 0x4012e220, 0x28cb: 0x4012e420, + 0x28cc: 0x4012e620, 0x28cd: 0x4012e820, 0x28ce: 0x4012ea20, 0x28cf: 0x4012ec20, + 0x28d0: 0x4012ee20, 0x28d1: 0x4012f020, 0x28d2: 0x4012f220, 0x28d3: 0x4012f420, + 0x28d4: 0x4012f620, 0x28d5: 0x4012f820, 0x28d6: 0x4012fa20, 0x28d7: 0x4012fc20, + 0x28d8: 0x4012fe20, 0x28d9: 0x40130020, 0x28da: 0x40130220, 0x28db: 0x40130420, + 0x28dc: 0x40130620, 0x28dd: 0x40130820, 0x28de: 0x40130a20, 0x28df: 0x40130c20, + 0x28e0: 0x40130e20, 0x28e1: 0x40131020, 0x28e2: 0x40131220, 0x28e3: 0x40131420, + 0x28e4: 0x40131620, 0x28e5: 0x40131820, 0x28e6: 0x40131a20, 0x28e7: 0x40131c20, + 0x28e8: 0x40131e20, 0x28e9: 0x40132020, 0x28ea: 0x40132220, 0x28eb: 0x40132420, + 0x28ec: 0x40132620, 0x28ed: 0x40132820, 0x28ee: 0x40132a20, 0x28ef: 0x40132c20, + 0x28f0: 0x40132e20, 0x28f1: 0x40133020, 0x28f2: 0x40133220, 0x28f3: 0x40133420, + 0x28f4: 0x40133620, 0x28f5: 0x40133820, 0x28f6: 0x40133a20, 0x28f7: 0x40133c20, + 0x28f8: 0x40133e20, 0x28f9: 0x40134020, 0x28fa: 0x40134220, 0x28fb: 0x40134420, + 0x28fc: 0x40134620, 0x28fd: 0x40134820, 0x28fe: 0x40134a20, 0x28ff: 0x40134c20, + // Block 0xa4, offset 0x2900 + 0x2900: 0x40134e20, 0x2901: 0x40135020, 0x2902: 0x40135220, 0x2903: 0x40135420, + 0x2904: 0x40135620, 0x2905: 0x40135820, 0x2906: 0x40135a20, 0x2907: 0x40135c20, + 0x2908: 0x40135e20, 0x2909: 0x40136020, 0x290a: 0x40136220, 0x290b: 0x40136420, + 0x290c: 0x40136620, 0x290d: 0x40136820, 0x290e: 0x40136a20, 0x290f: 0x40136c20, + 0x2910: 0x40136e20, 0x2911: 0x40137020, 0x2912: 0x40137220, 0x2913: 0x40137420, + 0x2914: 0x40137620, 0x2915: 0x40137820, 0x2916: 0x40137a20, 0x2917: 0x40137c20, + 0x2918: 0x40137e20, 0x2919: 0x40138020, 0x291a: 0x40138220, 0x291b: 0x40138420, + 0x291c: 0x40138620, 0x291d: 0x40138820, 0x291e: 0x40138a20, 0x291f: 0x40138c20, + 0x2920: 0x40138e20, 0x2921: 0x40139020, 0x2922: 0x40139220, 0x2923: 0x40139420, + 0x2924: 0x40139620, 0x2925: 0x40139820, 0x2926: 0x40139a20, 0x2927: 0x40139c20, + 0x2928: 0x40139e20, 0x2929: 0x4013a020, 0x292a: 0x4013a220, 0x292b: 0x4013a420, + 0x292c: 0x4013a620, 0x292d: 0x4013a820, 0x292e: 0x4013aa20, 0x292f: 0x4013ac20, + 0x2930: 0x4013ae20, 0x2931: 0x4013b020, 0x2932: 0x4013b220, 0x2933: 0x4013b420, + 0x2934: 0x4013b620, 0x2935: 0x4013b820, 0x2936: 0x4013ba20, 0x2937: 0x4013bc20, + 0x2938: 0x4013be20, 0x2939: 0x4013c020, 0x293a: 0x4013c220, 0x293b: 0x4013c420, + 0x293c: 0x4013c620, 0x293d: 0x4013c820, 0x293e: 0x4013ca20, 0x293f: 0x4013cc20, + // Block 0xa5, offset 0x2940 + 0x2940: 0x4013ce20, 0x2941: 0x4013d020, 0x2942: 0x4013d220, 0x2943: 0x40041420, + 0x2944: 0x40041620, 0x2945: 0x40041820, 0x2946: 0x40041a20, 0x2947: 0x40041c20, + 0x2948: 0x40041e20, 0x2949: 0x40042020, 0x294a: 0x40042220, 0x294b: 0x40042420, + 0x294c: 0x40042620, 0x294d: 0x40042820, 0x294e: 0x40042a20, 0x294f: 0x40042c20, + 0x2950: 0x40042e20, 0x2951: 0x40043020, 0x2952: 0x40043220, 0x2953: 0x40043420, + 0x2954: 0x40043620, 0x2955: 0x40043820, 0x2956: 0x40043a20, 0x2957: 0x40043c20, + 0x2958: 0x40043e20, 0x2959: 0x4013d420, 0x295a: 0x4013d620, 0x295b: 0x4013d820, + 0x295c: 0x4013da20, 0x295d: 0x4013dc20, 0x295e: 0x4013de20, 0x295f: 0x4013e020, + 0x2960: 0x4013e220, 0x2961: 0x4013e420, 0x2962: 0x4013e620, 0x2963: 0x4013e820, + 0x2964: 0x4013ea20, 0x2965: 0x4013ec20, 0x2966: 0x4013ee20, 0x2967: 0x4013f020, + 0x2968: 0x4013f220, 0x2969: 0x4013f420, 0x296a: 0x4013f620, 0x296b: 0x4013f820, + 0x296c: 0x4013fa20, 0x296d: 0x4013fc20, 0x296e: 0x4013fe20, 0x296f: 0x40140020, + 0x2970: 0x40140220, 0x2971: 0x40140420, 0x2972: 0x40140620, 0x2973: 0x40140820, + 0x2974: 0x40140a20, 0x2975: 0x40140c20, 0x2976: 0x40140e20, 0x2977: 0x40141020, + 0x2978: 0x40141220, 0x2979: 0x40141420, 0x297a: 0x40141620, 0x297b: 0x40141820, + 0x297c: 0x40141a20, 0x297d: 0x40141c20, 0x297e: 0x40141e20, 0x297f: 0x40142020, + // Block 0xa6, offset 0x2980 + 0x2980: 0x40142220, 0x2981: 0x40142420, 0x2982: 0x40142620, 0x2983: 0x40142820, + 0x2984: 0x40142a20, 0x2985: 0x40142c20, 0x2986: 0x40142e20, 0x2987: 0x40143020, + 0x2988: 0x40143220, 0x2989: 0x40143420, 0x298a: 0x40143620, 0x298b: 0x40143820, + 0x298c: 0x40143a20, 0x298d: 0x40143c20, 0x298e: 0x40143e20, 0x298f: 0x40144020, + 0x2990: 0x40144220, 0x2991: 0x40144420, 0x2992: 0x40144620, 0x2993: 0x40144820, + 0x2994: 0x40144a20, 0x2995: 0x40144c20, 0x2996: 0x40144e20, 0x2997: 0x40145020, + 0x2998: 0x4004c620, 0x2999: 0x4004c820, 0x299a: 0x4004ca20, 0x299b: 0x4004cc20, + 0x299c: 0x40145220, 0x299d: 0x40145420, 0x299e: 0x40145620, 0x299f: 0x40145820, + 0x29a0: 0x40145a20, 0x29a1: 0x40145c20, 0x29a2: 0x40145e20, 0x29a3: 0x40146020, + 0x29a4: 0x40146220, 0x29a5: 0x40146420, 0x29a6: 0x40146620, 0x29a7: 0x40146820, + 0x29a8: 0x40146a20, 0x29a9: 0x40146c20, 0x29aa: 0x40146e20, 0x29ab: 0x40147020, + 0x29ac: 0x40147220, 0x29ad: 0x40147420, 0x29ae: 0x40147620, 0x29af: 0x40147820, + 0x29b0: 0x40147a20, 0x29b1: 0x40147c20, 0x29b2: 0x40147e20, 0x29b3: 0x40148020, + 0x29b4: 0x40148220, 0x29b5: 0x40148420, 0x29b6: 0x40148620, 0x29b7: 0x40148820, + 0x29b8: 0x40148a20, 0x29b9: 0x40148c20, 0x29ba: 0x40148e20, 0x29bb: 0x40149020, + 0x29bc: 0x40041020, 0x29bd: 0x40041220, 0x29be: 0x40149220, 0x29bf: 0x40149420, + // Block 0xa7, offset 0x29c0 + 0x29c0: 0x40149620, 0x29c1: 0x40149820, 0x29c2: 0x40149a20, 0x29c3: 0x40149c20, + 0x29c4: 0x40149e20, 0x29c5: 0x4014a020, 0x29c6: 0x4014a220, 0x29c7: 0x4014a420, + 0x29c8: 0x4014a620, 0x29c9: 0x4014a820, 0x29ca: 0x4014aa20, 0x29cb: 0x4014ac20, + 0x29cc: 0xe00000f0, 0x29cd: 0x4014ae20, 0x29ce: 0x4014b020, 0x29cf: 0x4014b220, + 0x29d0: 0x4014b420, 0x29d1: 0x4014b620, 0x29d2: 0x4014b820, 0x29d3: 0x4014ba20, + 0x29d4: 0x4014bc20, 0x29d5: 0x4014be20, 0x29d6: 0x4014c020, 0x29d7: 0x4014c220, + 0x29d8: 0x4014c420, 0x29d9: 0x4014c620, 0x29da: 0x4014c820, 0x29db: 0x4014ca20, + 0x29dc: 0x4014cc20, 0x29dd: 0x4014ce20, 0x29de: 0x4014d020, 0x29df: 0x4014d220, + 0x29e0: 0x4014d420, 0x29e1: 0x4014d620, 0x29e2: 0x4014d820, 0x29e3: 0x4014da20, + 0x29e4: 0x4014dc20, 0x29e5: 0x4014de20, 0x29e6: 0x4014e020, 0x29e7: 0x4014e220, + 0x29e8: 0x4014e420, 0x29e9: 0x4014e620, 0x29ea: 0x4014e820, 0x29eb: 0x4014ea20, + 0x29ec: 0x4014ec20, 0x29ed: 0x4014ee20, 0x29ee: 0x4014f020, 0x29ef: 0x4014f220, + 0x29f0: 0x4014f420, 0x29f1: 0x4014f620, 0x29f2: 0x4014f820, 0x29f3: 0x4014fa20, + 0x29f4: 0x4014fc20, 0x29f5: 0x4014fe20, 0x29f6: 0x40150020, 0x29f7: 0x40150220, + 0x29f8: 0x40150420, 0x29f9: 0x40150620, 0x29fa: 0x40150820, 0x29fb: 0x40150a20, + 0x29fc: 0x40150c20, 0x29fd: 0x40150e20, 0x29fe: 0x40151020, 0x29ff: 0x40151220, + // Block 0xa8, offset 0x2a00 + 0x2a00: 0x40151420, 0x2a01: 0x40151620, 0x2a02: 0x40151820, 0x2a03: 0x40151a20, + 0x2a04: 0x40151c20, 0x2a05: 0x40151e20, 0x2a06: 0x40152020, 0x2a07: 0x40152220, + 0x2a08: 0x40152420, 0x2a09: 0x40152620, 0x2a0a: 0x40152820, 0x2a0b: 0x40152a20, + 0x2a0c: 0x40152c20, 0x2a0d: 0x40152e20, 0x2a0e: 0x40153020, 0x2a0f: 0x40153220, + 0x2a10: 0x40153420, 0x2a11: 0x40153620, 0x2a12: 0x40153820, 0x2a13: 0x40153a20, + 0x2a14: 0x40153c20, 0x2a15: 0x40153e20, 0x2a16: 0x40154020, 0x2a17: 0x40154220, + 0x2a18: 0x40154420, 0x2a19: 0x40154620, 0x2a1a: 0x40154820, 0x2a1b: 0x40154a20, + 0x2a1c: 0x40154c20, 0x2a1d: 0x40154e20, 0x2a1e: 0x40155020, 0x2a1f: 0x40155220, + 0x2a20: 0x40155420, 0x2a21: 0x40155620, 0x2a22: 0x40155820, 0x2a23: 0x40155a20, + 0x2a24: 0x40155c20, 0x2a25: 0x40155e20, 0x2a26: 0x40156020, 0x2a27: 0x40156220, + 0x2a28: 0x40156420, 0x2a29: 0x40156620, 0x2a2a: 0x40156820, 0x2a2b: 0x40156a20, + 0x2a2c: 0x40156c20, 0x2a2d: 0x40156e20, 0x2a2e: 0x40157020, 0x2a2f: 0x40157220, + 0x2a30: 0x40157420, 0x2a31: 0x40157620, 0x2a32: 0x40157820, 0x2a33: 0x40157a20, + 0x2a34: 0xf0000404, 0x2a35: 0xf0001f04, 0x2a36: 0xf0000404, 0x2a37: 0x40157c20, + 0x2a38: 0x40157e20, 0x2a39: 0x40158020, 0x2a3a: 0x40158220, 0x2a3b: 0x40158420, + 0x2a3c: 0x40158620, 0x2a3d: 0x40158820, 0x2a3e: 0x40158a20, 0x2a3f: 0x40158c20, + // Block 0xa9, offset 0x2a40 + 0x2a40: 0x40158e20, 0x2a41: 0x40159020, 0x2a42: 0x40159220, 0x2a43: 0x40159420, + 0x2a44: 0x40159620, 0x2a45: 0x40159820, 0x2a46: 0x40159a20, 0x2a47: 0x40159c20, + 0x2a48: 0x40159e20, 0x2a49: 0x4015a020, 0x2a4a: 0x4015a220, 0x2a4b: 0x4015a420, + 0x2a4c: 0x4015a620, 0x2a4d: 0x4015a820, 0x2a4e: 0x4015aa20, 0x2a4f: 0x4015ac20, + 0x2a50: 0x4015ae20, 0x2a51: 0x4015b020, 0x2a52: 0x4015b220, 0x2a53: 0x4015b420, + 0x2a54: 0x4015b620, 0x2a55: 0x4015b820, 0x2a56: 0x4015ba20, 0x2a57: 0x4015bc20, + 0x2a58: 0x4015be20, 0x2a59: 0x4015c020, 0x2a5a: 0x4015c220, 0x2a5b: 0x4015c420, + 0x2a5c: 0x4015c620, 0x2a5d: 0x4015c820, 0x2a5e: 0x4015ca20, 0x2a5f: 0x4015cc20, + 0x2a60: 0x4015ce20, 0x2a61: 0x4015d020, 0x2a62: 0x4015d220, 0x2a63: 0x4015d420, + 0x2a64: 0x4015d620, 0x2a65: 0x4015d820, 0x2a66: 0x4015da20, 0x2a67: 0x4015dc20, + 0x2a68: 0x4015de20, 0x2a69: 0x4015e020, 0x2a6a: 0x4015e220, 0x2a6b: 0x4015e420, + 0x2a6c: 0x4015e620, 0x2a6d: 0x4015e820, 0x2a6e: 0x4015ea20, 0x2a6f: 0x4015ec20, + 0x2a70: 0x4015ee20, 0x2a71: 0x4015f020, 0x2a72: 0x4015f220, 0x2a73: 0x4015f420, + 0x2a74: 0x4015f620, 0x2a75: 0x4015f820, 0x2a76: 0x4015fa20, 0x2a77: 0x4015fc20, + 0x2a78: 0x4015fe20, 0x2a79: 0x40160020, 0x2a7a: 0x40160220, 0x2a7b: 0x40160420, + 0x2a7c: 0x40160620, 0x2a7d: 0x40160820, 0x2a7e: 0x40160a20, 0x2a7f: 0x40160c20, + // Block 0xaa, offset 0x2a80 + 0x2a80: 0x40160e20, 0x2a81: 0x40161020, 0x2a82: 0x40161220, 0x2a83: 0x40161420, + 0x2a84: 0x40161620, 0x2a85: 0x40161820, 0x2a86: 0x40161a20, 0x2a87: 0x40161c20, + 0x2a88: 0x40161e20, 0x2a89: 0x40162020, 0x2a8a: 0x40162220, 0x2a8b: 0x40162420, + 0x2a8c: 0x40162620, 0x2a8d: 0x40162820, 0x2a8e: 0x40162a20, 0x2a8f: 0x40162c20, + 0x2a90: 0x40162e20, 0x2a91: 0x40163020, 0x2a92: 0x40163220, 0x2a93: 0x40163420, + 0x2a94: 0x40163620, 0x2a95: 0x40163820, 0x2a96: 0x40163a20, 0x2a97: 0x40163c20, + 0x2a98: 0x40163e20, 0x2a99: 0x40164020, 0x2a9a: 0x40164220, 0x2a9b: 0x40164420, + 0x2a9c: 0xe000014f, 0x2a9d: 0x40164620, 0x2a9e: 0x40164820, 0x2a9f: 0x40164a20, + 0x2aa0: 0x40164c20, 0x2aa1: 0x40164e20, 0x2aa2: 0x40165020, 0x2aa3: 0x40165220, + 0x2aa4: 0x40165420, 0x2aa5: 0x40165620, 0x2aa6: 0x40165820, 0x2aa7: 0x40165a20, + 0x2aa8: 0x40165c20, 0x2aa9: 0x40165e20, 0x2aaa: 0x40166020, 0x2aab: 0x40166220, + 0x2aac: 0x40166420, 0x2aad: 0x40166620, 0x2aae: 0x40166820, 0x2aaf: 0x40166a20, + 0x2ab0: 0x40166c20, 0x2ab1: 0x40166e20, 0x2ab2: 0x40167020, 0x2ab3: 0x40167220, + 0x2ab4: 0x40167420, 0x2ab5: 0x40167620, 0x2ab6: 0x40167820, 0x2ab7: 0x40167a20, + 0x2ab8: 0x40167c20, 0x2ab9: 0x40167e20, 0x2aba: 0x40168020, 0x2abb: 0x40168220, + 0x2abc: 0x40168420, 0x2abd: 0x40168620, 0x2abe: 0x40168820, 0x2abf: 0x40168a20, + // Block 0xab, offset 0x2ac0 + 0x2ac0: 0x40168c20, 0x2ac1: 0x40168e20, 0x2ac2: 0x40169020, 0x2ac3: 0x40169220, + 0x2ac4: 0x40169420, 0x2ac5: 0x40169620, 0x2ac6: 0x40169820, 0x2ac7: 0x40169a20, + 0x2ac8: 0x40169c20, 0x2ac9: 0x40169e20, 0x2aca: 0x4016a020, 0x2acb: 0x4016a220, + 0x2acc: 0x4016a420, 0x2acd: 0x4016a620, 0x2ace: 0x4016a820, 0x2acf: 0x4016aa20, + 0x2ad0: 0x4016ac20, 0x2ad1: 0x4016ae20, 0x2ad2: 0x4016b020, 0x2ad3: 0x4016b220, + 0x2ad4: 0x4016b420, 0x2ad5: 0x4016b620, 0x2ad6: 0x4016b820, 0x2ad7: 0x4016ba20, + 0x2ad8: 0x4016bc20, 0x2ad9: 0x4016be20, 0x2ada: 0x4016c020, 0x2adb: 0x4016c220, + 0x2adc: 0x4016c420, 0x2add: 0x4016c620, 0x2ade: 0x4016c820, 0x2adf: 0x4016ca20, + 0x2ae0: 0x4016cc20, 0x2ae1: 0x4016ce20, 0x2ae2: 0x4016d020, 0x2ae3: 0x4016d220, + 0x2ae4: 0x4016d420, 0x2ae5: 0x4016d620, 0x2ae6: 0x4016d820, 0x2ae7: 0x4016da20, + 0x2ae8: 0x4016dc20, 0x2ae9: 0x4016de20, 0x2aea: 0x4016e020, 0x2aeb: 0x4016e220, + 0x2aec: 0x4016e420, 0x2aed: 0x4016e620, 0x2aee: 0x4016e820, 0x2aef: 0x4016ea20, + 0x2af0: 0x4016ec20, 0x2af1: 0x4016ee20, 0x2af2: 0x4016f020, 0x2af3: 0x4016f220, + 0x2af4: 0x4016f420, 0x2af5: 0x4016f620, 0x2af6: 0x4016f820, 0x2af7: 0x4016fa20, + 0x2af8: 0x4016fc20, 0x2af9: 0x4016fe20, 0x2afa: 0x40170020, 0x2afb: 0x40170220, + 0x2afc: 0x40170420, 0x2afd: 0x40170620, 0x2afe: 0x40170820, 0x2aff: 0x40170a20, + // Block 0xac, offset 0x2b00 + 0x2b00: 0x40170c20, 0x2b01: 0x40170e20, 0x2b02: 0x40171020, 0x2b03: 0x40171220, + 0x2b04: 0x40171420, 0x2b05: 0x40171620, 0x2b06: 0x40171820, 0x2b07: 0x40171a20, + 0x2b08: 0x40171c20, 0x2b09: 0x40171e20, 0x2b0a: 0x40172020, 0x2b0b: 0x40172220, + 0x2b0c: 0x40172420, + 0x2b10: 0x40172620, 0x2b11: 0x40172820, 0x2b12: 0x40172a20, 0x2b13: 0x40172c20, + 0x2b14: 0x40172e20, 0x2b15: 0x40173020, 0x2b16: 0x40173220, 0x2b17: 0x40173420, + 0x2b18: 0x40173620, 0x2b19: 0x40173820, + // Block 0xad, offset 0x2b40 + 0x2b40: 0x00373888, 0x2b41: 0x00373a88, 0x2b42: 0x00373c88, 0x2b43: 0x00373e88, + 0x2b44: 0x00374088, 0x2b45: 0x00374288, 0x2b46: 0x00374488, 0x2b47: 0x00374688, + 0x2b48: 0x00374888, 0x2b49: 0x00374a88, 0x2b4a: 0x00374c88, 0x2b4b: 0x00374e88, + 0x2b4c: 0x00375088, 0x2b4d: 0x00375288, 0x2b4e: 0x00375488, 0x2b4f: 0x00375688, + 0x2b50: 0x00375888, 0x2b51: 0x00375a88, 0x2b52: 0x00375c88, 0x2b53: 0x00375e88, + 0x2b54: 0x00376088, 0x2b55: 0x00376288, 0x2b56: 0x00376488, 0x2b57: 0x00376688, + 0x2b58: 0x00376888, 0x2b59: 0x00376a88, 0x2b5a: 0x00376c88, 0x2b5b: 0x00376e88, + 0x2b5c: 0x00377088, 0x2b5d: 0x00377288, 0x2b5e: 0x00377488, 0x2b5f: 0x00377688, + 0x2b60: 0x00377888, 0x2b61: 0x00377a88, 0x2b62: 0x00377c88, 0x2b63: 0x00377e88, + 0x2b64: 0x00378088, 0x2b65: 0x00378288, 0x2b66: 0x00378488, 0x2b67: 0x00378688, + 0x2b68: 0x00378888, 0x2b69: 0x00378a88, 0x2b6a: 0x00378c88, 0x2b6b: 0x00378e88, + 0x2b6c: 0x00379088, 0x2b6d: 0x00379288, 0x2b6e: 0x00379488, + 0x2b70: 0x40373820, 0x2b71: 0x40373a20, 0x2b72: 0x40373c20, 0x2b73: 0x40373e20, + 0x2b74: 0x40374020, 0x2b75: 0x40374220, 0x2b76: 0x40374420, 0x2b77: 0x40374620, + 0x2b78: 0x40374820, 0x2b79: 0x40374a20, 0x2b7a: 0x40374c20, 0x2b7b: 0x40374e20, + 0x2b7c: 0x40375020, 0x2b7d: 0x40375220, 0x2b7e: 0x40375420, 0x2b7f: 0x40375620, + // Block 0xae, offset 0x2b80 + 0x2b80: 0x40375820, 0x2b81: 0x40375a20, 0x2b82: 0x40375c20, 0x2b83: 0x40375e20, + 0x2b84: 0x40376020, 0x2b85: 0x40376220, 0x2b86: 0x40376420, 0x2b87: 0x40376620, + 0x2b88: 0x40376820, 0x2b89: 0x40376a20, 0x2b8a: 0x40376c20, 0x2b8b: 0x40376e20, + 0x2b8c: 0x40377020, 0x2b8d: 0x40377220, 0x2b8e: 0x40377420, 0x2b8f: 0x40377620, + 0x2b90: 0x40377820, 0x2b91: 0x40377a20, 0x2b92: 0x40377c20, 0x2b93: 0x40377e20, + 0x2b94: 0x40378020, 0x2b95: 0x40378220, 0x2b96: 0x40378420, 0x2b97: 0x40378620, + 0x2b98: 0x40378820, 0x2b99: 0x40378a20, 0x2b9a: 0x40378c20, 0x2b9b: 0x40378e20, + 0x2b9c: 0x40379020, 0x2b9d: 0x40379220, 0x2b9e: 0x40379420, + 0x2ba0: 0x002e4088, 0x2ba1: 0x402e4020, 0x2ba2: 0x002e4288, 0x2ba3: 0x002f3688, + 0x2ba4: 0x002fbe88, 0x2ba5: 0x402be820, 0x2ba6: 0x40303e20, 0x2ba7: 0x002d8888, + 0x2ba8: 0x402d8820, 0x2ba9: 0x002e1288, 0x2baa: 0x402e1220, 0x2bab: 0x00316088, + 0x2bac: 0x40316020, 0x2bad: 0x002bf888, 0x2bae: 0x002e9088, 0x2baf: 0x002bf088, + 0x2bb0: 0x002c0288, 0x2bb1: 0x4030d420, 0x2bb2: 0x0030ec88, 0x2bb3: 0x4030ec20, + 0x2bb4: 0x4030d620, 0x2bb5: 0x002d8a88, 0x2bb6: 0x402d8a20, 0x2bb7: 0x402f5420, + 0x2bb8: 0x402cac20, 0x2bb9: 0x402fb420, 0x2bba: 0x402f0e20, 0x2bbb: 0x402cb620, + 0x2bbc: 0x002dcc95, 0x2bbd: 0x0030be9d, 0x2bbe: 0x002ffc88, 0x2bbf: 0x00315888, + // Block 0xaf, offset 0x2bc0 + 0x2bc0: 0x0032aa88, 0x2bc1: 0x4032aa20, 0x2bc2: 0x0032ac88, 0x2bc3: 0x4032ac20, + 0x2bc4: 0x0032ae88, 0x2bc5: 0x4032ae20, 0x2bc6: 0x0032b088, 0x2bc7: 0x4032b020, + 0x2bc8: 0x0032b288, 0x2bc9: 0x4032b220, 0x2bca: 0x0032b688, 0x2bcb: 0x4032b620, + 0x2bcc: 0x0032b888, 0x2bcd: 0x4032b820, 0x2bce: 0x0032ba88, 0x2bcf: 0x4032ba20, + 0x2bd0: 0x0032bc88, 0x2bd1: 0x4032bc20, 0x2bd2: 0x0032be88, 0x2bd3: 0x4032be20, + 0x2bd4: 0x0032c088, 0x2bd5: 0x4032c020, 0x2bd6: 0x0032c488, 0x2bd7: 0x4032c420, + 0x2bd8: 0x0032c688, 0x2bd9: 0x4032c620, 0x2bda: 0x0032c888, 0x2bdb: 0x4032c820, + 0x2bdc: 0x0032ce88, 0x2bdd: 0x4032ce20, 0x2bde: 0x0032d088, 0x2bdf: 0x4032d020, + 0x2be0: 0x0032d288, 0x2be1: 0x4032d220, 0x2be2: 0x0032d488, 0x2be3: 0x4032d420, + 0x2be4: 0x0032d688, 0x2be5: 0x4032d620, 0x2be6: 0x0032d888, 0x2be7: 0x4032d820, + 0x2be8: 0x0032da88, 0x2be9: 0x4032da20, 0x2bea: 0x0032dc88, 0x2beb: 0x4032dc20, + 0x2bec: 0x0032de88, 0x2bed: 0x4032de20, 0x2bee: 0x0032e088, 0x2bef: 0x4032e020, + 0x2bf0: 0x0032e288, 0x2bf1: 0x4032e220, 0x2bf2: 0x00331888, 0x2bf3: 0x40331820, + 0x2bf4: 0x00331a88, 0x2bf5: 0x40331a20, 0x2bf6: 0x0032b488, 0x2bf7: 0x4032b420, + 0x2bf8: 0x0032c288, 0x2bf9: 0x4032c220, 0x2bfa: 0x0032ca88, 0x2bfb: 0x4032ca20, + 0x2bfc: 0x0032cc88, 0x2bfd: 0x4032cc20, 0x2bfe: 0x0032e488, 0x2bff: 0x4032e420, + // Block 0xb0, offset 0x2c00 + 0x2c00: 0x0032e688, 0x2c01: 0x4032e620, 0x2c02: 0x0032ec88, 0x2c03: 0x4032ec20, + 0x2c04: 0x0032ee88, 0x2c05: 0x4032ee20, 0x2c06: 0x0032f088, 0x2c07: 0x4032f020, + 0x2c08: 0x0032f888, 0x2c09: 0x4032f820, 0x2c0a: 0x0032fc88, 0x2c0b: 0x4032fc20, + 0x2c0c: 0x0032fe88, 0x2c0d: 0x4032fe20, 0x2c0e: 0x00330088, 0x2c0f: 0x40330020, + 0x2c10: 0x00330288, 0x2c11: 0x40330220, 0x2c12: 0x00330488, 0x2c13: 0x40330420, + 0x2c14: 0x00330688, 0x2c15: 0x40330620, 0x2c16: 0x00330c88, 0x2c17: 0x40330c20, + 0x2c18: 0x00331088, 0x2c19: 0x40331020, 0x2c1a: 0x00331288, 0x2c1b: 0x40331220, + 0x2c1c: 0x00331488, 0x2c1d: 0x40331420, 0x2c1e: 0x00331c88, 0x2c1f: 0x40331c20, + 0x2c20: 0x00331e88, 0x2c21: 0x40331e20, 0x2c22: 0x00332088, 0x2c23: 0x40332020, + 0x2c24: 0xe00014b0, 0x2c25: 0x40173a20, 0x2c26: 0x40173c20, 0x2c27: 0x40173e20, + 0x2c28: 0x40174020, 0x2c29: 0x40174220, 0x2c2a: 0x40174420, 0x2c2b: 0x0032ea88, + 0x2c2c: 0x4032ea20, 0x2c2d: 0x00330a88, 0x2c2e: 0x40330a20, 0x2c2f: 0xae605f02, + 0x2c30: 0xae602a02, 0x2c31: 0xae602202, 0x2c32: 0x0032f688, 0x2c33: 0x4032f620, + 0x2c39: 0x4002f820, 0x2c3a: 0x4002d420, 0x2c3b: 0x4002d620, + 0x2c3c: 0x4003b620, 0x2c3d: 0x4028b420, 0x2c3e: 0x4002fa20, 0x2c3f: 0x4003b820, + // Block 0xb1, offset 0x2c40 + 0x2c40: 0x40379820, 0x2c41: 0x40379c20, 0x2c42: 0x4037a020, 0x2c43: 0x4037a420, + 0x2c44: 0x4037a820, 0x2c45: 0x4037ac20, 0x2c46: 0x4037b020, 0x2c47: 0x4037b820, + 0x2c48: 0x4037bc20, 0x2c49: 0x4037c020, 0x2c4a: 0x4037c420, 0x2c4b: 0x4037c820, + 0x2c4c: 0x4037cc20, 0x2c4d: 0x4037d420, 0x2c4e: 0x4037d820, 0x2c4f: 0x4037dc20, + 0x2c50: 0x4037e020, 0x2c51: 0x4037e420, 0x2c52: 0x4037e820, 0x2c53: 0x4037f020, + 0x2c54: 0x4037f420, 0x2c55: 0x4037f820, 0x2c56: 0x4037fc20, 0x2c57: 0x40380020, + 0x2c58: 0x40380420, 0x2c59: 0x40380820, 0x2c5a: 0x40380c20, 0x2c5b: 0x40381020, + 0x2c5c: 0x40381420, 0x2c5d: 0x40381820, 0x2c5e: 0x40381c20, 0x2c5f: 0x40382420, + 0x2c60: 0x40382820, 0x2c61: 0x4037b420, 0x2c62: 0x4037d020, 0x2c63: 0x4037ec20, + 0x2c64: 0x40382020, 0x2c65: 0x40382c20, 0x2c67: 0x40383220, + 0x2c6d: 0x40383c20, + 0x2c70: 0x403bbc20, 0x2c71: 0x403bbe20, 0x2c72: 0x403bc020, 0x2c73: 0x403bc220, + 0x2c74: 0x403bc420, 0x2c75: 0x403bc620, 0x2c76: 0x403bc820, 0x2c77: 0x403bca20, + 0x2c78: 0x403bcc20, 0x2c79: 0x403bce20, 0x2c7a: 0x403bd020, 0x2c7b: 0x403bd220, + 0x2c7c: 0x403bd620, 0x2c7d: 0x403bd820, 0x2c7e: 0x403bda20, 0x2c7f: 0x403bdc20, + // Block 0xb2, offset 0x2c80 + 0x2c80: 0x403bde20, 0x2c81: 0x403be020, 0x2c82: 0x403be220, 0x2c83: 0x403be420, + 0x2c84: 0x403be620, 0x2c85: 0x403be820, 0x2c86: 0x403bea20, 0x2c87: 0x403bec20, + 0x2c88: 0x403bee20, 0x2c89: 0x403bf020, 0x2c8a: 0x403bf220, 0x2c8b: 0x403bf420, + 0x2c8c: 0x403bf620, 0x2c8d: 0x403bf820, 0x2c8e: 0x403bfa20, 0x2c8f: 0x403bfc20, + 0x2c90: 0x403bfe20, 0x2c91: 0x403c0020, 0x2c92: 0x403c0220, 0x2c93: 0x403c0420, + 0x2c94: 0x403c0820, 0x2c95: 0x403c0a20, 0x2c96: 0x403c0c20, 0x2c97: 0x403c0e20, + 0x2c98: 0x403c1020, 0x2c99: 0x403c1220, 0x2c9a: 0x403c1420, 0x2c9b: 0x403c1620, + 0x2c9c: 0x403c1820, 0x2c9d: 0x403c1a20, 0x2c9e: 0x403c1c20, 0x2c9f: 0x403c1e20, + 0x2ca0: 0x403c2020, 0x2ca1: 0x403c2220, 0x2ca2: 0x403c2420, 0x2ca3: 0x403c2620, + 0x2ca4: 0x403c2820, 0x2ca5: 0x403c2a20, 0x2ca6: 0x403bd420, 0x2ca7: 0x403c0620, + 0x2caf: 0x403c2c20, + 0x2cb0: 0x4005e620, + 0x2cbf: 0xa0900000, + // Block 0xb3, offset 0x2cc0 + 0x2cc0: 0x403c4e20, 0x2cc1: 0x403c7820, 0x2cc2: 0x403c9a20, 0x2cc3: 0x403cac20, + 0x2cc4: 0x403cca20, 0x2cc5: 0x403d1620, 0x2cc6: 0x403d3820, 0x2cc7: 0x403d4a20, + 0x2cc8: 0x403d7620, 0x2cc9: 0x403d8820, 0x2cca: 0x403d9a20, 0x2ccb: 0x403dfc20, + 0x2ccc: 0x403e3a20, 0x2ccd: 0x403e5820, 0x2cce: 0x403e6a20, 0x2ccf: 0x403eae20, + 0x2cd0: 0x403ec020, 0x2cd1: 0x403ee020, 0x2cd2: 0x403f4020, 0x2cd3: 0x403e9620, + 0x2cd4: 0x403e9820, 0x2cd5: 0x403e9a20, 0x2cd6: 0x403e9c20, + 0x2ce0: 0x403f4820, 0x2ce1: 0x403f4a20, 0x2ce2: 0x403f4c20, 0x2ce3: 0x403f4e20, + 0x2ce4: 0x403f5020, 0x2ce5: 0x403f5220, 0x2ce6: 0x403f5420, + 0x2ce8: 0x403f5620, 0x2ce9: 0x403f5820, 0x2cea: 0x403f5a20, 0x2ceb: 0x403f5c20, + 0x2cec: 0x403f5e20, 0x2ced: 0x403f6020, 0x2cee: 0x403f6220, + 0x2cf0: 0x403f6420, 0x2cf1: 0x403f6620, 0x2cf2: 0x403f6820, 0x2cf3: 0x403f6a20, + 0x2cf4: 0x403f6c20, 0x2cf5: 0x403f6e20, 0x2cf6: 0x403f7020, + 0x2cf8: 0x403f7220, 0x2cf9: 0x403f7420, 0x2cfa: 0x403f7620, 0x2cfb: 0x403f7820, + 0x2cfc: 0x403f7a20, 0x2cfd: 0x403f7c20, 0x2cfe: 0x403f7e20, + // Block 0xb4, offset 0x2d00 + 0x2d00: 0x403f8020, 0x2d01: 0x403f8220, 0x2d02: 0x403f8420, 0x2d03: 0x403f8620, + 0x2d04: 0x403f8820, 0x2d05: 0x403f8a20, 0x2d06: 0x403f8c20, + 0x2d08: 0x403f8e20, 0x2d09: 0x403f9020, 0x2d0a: 0x403f9220, 0x2d0b: 0x403f9420, + 0x2d0c: 0x403f9620, 0x2d0d: 0x403f9820, 0x2d0e: 0x403f9a20, + 0x2d10: 0x403f9c20, 0x2d11: 0x403f9e20, 0x2d12: 0x403fa020, 0x2d13: 0x403fa220, + 0x2d14: 0x403fa420, 0x2d15: 0x403fa620, 0x2d16: 0x403fa820, + 0x2d18: 0x403faa20, 0x2d19: 0x403fac20, 0x2d1a: 0x403fae20, 0x2d1b: 0x403fb020, + 0x2d1c: 0x403fb220, 0x2d1d: 0x403fb420, 0x2d1e: 0x403fb620, + 0x2d20: 0x84e619a9, 0x2d21: 0x84e619ad, 0x2d22: 0x84e619b1, 0x2d23: 0x84e619c5, + 0x2d24: 0x84e619e5, 0x2d25: 0x84e619f2, 0x2d26: 0x84e61a28, 0x2d27: 0x84e61a42, + 0x2d28: 0x84e61a54, 0x2d29: 0x84e61a5d, 0x2d2a: 0x84e61a77, 0x2d2b: 0x84e61a87, + 0x2d2c: 0x84e61a94, 0x2d2d: 0x84e61a9d, 0x2d2e: 0x84e61aa6, 0x2d2f: 0x84e61ada, + 0x2d30: 0x84e61b01, 0x2d31: 0x84e61b0c, 0x2d32: 0x84e61b2e, 0x2d33: 0x84e61b33, + 0x2d34: 0x84e61b86, 0x2d35: 0xe00014d8, 0x2d36: 0x84e61991, 0x2d37: 0x84e619d9, + 0x2d38: 0x84e61a27, 0x2d39: 0x84e61ad1, 0x2d3a: 0x84e61b4f, 0x2d3b: 0x84e61b5c, + 0x2d3c: 0x84e61b61, 0x2d3d: 0x84e61b6b, 0x2d3e: 0x84e61b70, 0x2d3f: 0x84e61b7a, + // Block 0xb5, offset 0x2d40 + 0x2d40: 0x40052620, 0x2d41: 0x40052820, 0x2d42: 0x40047420, 0x2d43: 0x40047620, + 0x2d44: 0x40047820, 0x2d45: 0x40047a20, 0x2d46: 0x40052a20, 0x2d47: 0x40052c20, + 0x2d48: 0x40052e20, 0x2d49: 0x40047c20, 0x2d4a: 0x40047e20, 0x2d4b: 0x40053020, + 0x2d4c: 0x40048020, 0x2d4d: 0x40048220, 0x2d4e: 0x40053220, 0x2d4f: 0x40053420, + 0x2d50: 0x40053620, 0x2d51: 0x40053820, 0x2d52: 0x40053a20, 0x2d53: 0x40053c20, + 0x2d54: 0x40053e20, 0x2d55: 0x40054020, 0x2d56: 0x40054220, 0x2d57: 0x40023620, + 0x2d58: 0x4002e220, 0x2d59: 0x4003ba20, 0x2d5a: 0x40054420, 0x2d5b: 0x40054620, + 0x2d5c: 0x40048420, 0x2d5d: 0x40048620, 0x2d5e: 0x40054820, 0x2d5f: 0x40054a20, + 0x2d60: 0x40048820, 0x2d61: 0x40048a20, 0x2d62: 0x40048c20, 0x2d63: 0x40048e20, + 0x2d64: 0x40049020, 0x2d65: 0x40049220, 0x2d66: 0x40049420, 0x2d67: 0x40049620, + 0x2d68: 0x40049820, 0x2d69: 0x40049a20, 0x2d6a: 0x4003ae20, 0x2d6b: 0x4003b020, + 0x2d6c: 0x4003b220, 0x2d6d: 0x4003b420, 0x2d6e: 0x4002c820, 0x2d6f: 0x40367020, + 0x2d70: 0x4002fc20, 0x2d71: 0x40030820, 0x2d72: 0x40024420, 0x2d73: 0x40030a20, + 0x2d74: 0x40024220, 0x2d75: 0x40026820, 0x2d76: 0x4004fc20, 0x2d77: 0x4004fe20, + 0x2d78: 0x40050020, 0x2d79: 0x4004d020, 0x2d7a: 0x40023020, 0x2d7b: 0x40023220, + // Block 0xb6, offset 0x2d80 + 0x2d80: 0xe0002401, 0x2d81: 0xe0002416, 0x2d82: 0x029cb684, 0x2d83: 0x029cb484, + 0x2d84: 0xe0002404, 0x2d85: 0x029d7684, 0x2d86: 0xe0002407, 0x2d87: 0xe000240a, + 0x2d88: 0xe000240d, 0x2d89: 0x02a40484, 0x2d8a: 0xe0002410, 0x2d8b: 0xe0002413, + 0x2d8c: 0xe0002419, 0x2d8d: 0xe000241c, 0x2d8e: 0xe000241f, 0x2d8f: 0x02b84684, + 0x2d90: 0x02b84484, 0x2d91: 0xe0002422, 0x2d92: 0x02bbe684, 0x2d93: 0x02bcf484, + 0x2d94: 0x02bea284, 0x2d95: 0xe0002425, 0x2d96: 0x02bf8884, 0x2d97: 0xe0002428, + 0x2d98: 0x02c49884, 0x2d99: 0x02ca6a84, 0x2d9b: 0x02cbc284, + 0x2d9c: 0xe000242b, 0x2d9d: 0xe000242e, 0x2d9e: 0xe0002436, 0x2d9f: 0x02d79a84, + 0x2da0: 0x02d82284, 0x2da1: 0x02d86a84, 0x2da2: 0x02d87484, 0x2da3: 0x02e0d884, + 0x2da4: 0x02e45684, 0x2da5: 0xe0002439, 0x2da6: 0x029c5884, 0x2da7: 0xe000243c, + 0x2da8: 0x02e55a84, 0x2da9: 0xe000243f, 0x2daa: 0xe0002442, 0x2dab: 0xe0002445, + 0x2dac: 0xe0002448, 0x2dad: 0x02f27684, 0x2dae: 0xe000244b, 0x2daf: 0x02f9f284, + 0x2db0: 0x02fd3e84, 0x2db1: 0x02fea684, 0x2db2: 0x02fea484, 0x2db3: 0xe0002451, + 0x2db4: 0xe0002454, 0x2db5: 0xe000244e, 0x2db6: 0xe0002457, 0x2db7: 0xe000245a, + 0x2db8: 0x02ff1684, 0x2db9: 0x03000484, 0x2dba: 0x03010084, 0x2dbb: 0xe000245d, + 0x2dbc: 0xe0002460, 0x2dbd: 0xe0002463, 0x2dbe: 0x0304f284, 0x2dbf: 0xe0002466, + // Block 0xb7, offset 0x2dc0 + 0x2dc0: 0xe0002469, 0x2dc1: 0x030c9c84, 0x2dc2: 0x0310c884, 0x2dc3: 0x03130084, + 0x2dc4: 0x0312fe84, 0x2dc5: 0x03138284, 0x2dc6: 0x0313a484, 0x2dc7: 0xe000246c, + 0x2dc8: 0x03174084, 0x2dc9: 0x031a3a84, 0x2dca: 0xe000246f, 0x2dcb: 0x031ecc84, + 0x2dcc: 0x031f6c84, 0x2dcd: 0xe0002472, 0x2dce: 0xe0002475, 0x2dcf: 0xe0002478, + 0x2dd0: 0x03290a84, 0x2dd1: 0x032aee84, 0x2dd2: 0x032af084, 0x2dd3: 0x032afe84, + 0x2dd4: 0x032bd084, 0x2dd5: 0xe000247b, 0x2dd6: 0x032c3a84, 0x2dd7: 0xe000247e, + 0x2dd8: 0x032ea484, 0x2dd9: 0x032fcc84, 0x2dda: 0x0330ea84, 0x2ddb: 0x03319c84, + 0x2ddc: 0x0331bc84, 0x2ddd: 0x0331be84, 0x2dde: 0xe0002481, 0x2ddf: 0x0331c084, + 0x2de0: 0x0332c684, 0x2de1: 0xe0002484, 0x2de2: 0x0334d884, 0x2de3: 0xe0002487, + 0x2de4: 0xe000248a, 0x2de5: 0x0338f884, 0x2de6: 0x033c3e84, 0x2de7: 0xe000248d, + 0x2de8: 0x033d4c84, 0x2de9: 0x033d8884, 0x2dea: 0x033dfc84, 0x2deb: 0xe0002490, + 0x2dec: 0x033ea084, 0x2ded: 0xe0002493, 0x2dee: 0x033efe84, 0x2def: 0xe0002496, + 0x2df0: 0x033f3284, 0x2df1: 0xe0002499, 0x2df2: 0xe000249c, 0x2df3: 0x033f3e84, + // Block 0xb8, offset 0x2e00 + 0x2e00: 0x029c0084, 0x2e01: 0x029c5084, 0x2e02: 0x029c6c84, 0x2e03: 0x029c7e84, + 0x2e04: 0x029cb284, 0x2e05: 0x029d0a84, 0x2e06: 0x029d1884, 0x2e07: 0x029d4084, + 0x2e08: 0x029d7484, 0x2e09: 0x02a27e84, 0x2e0a: 0x02a2ca84, 0x2e0b: 0x02a2d684, + 0x2e0c: 0x02a30484, 0x2e0d: 0x02a32c84, 0x2e0e: 0x02a35684, 0x2e0f: 0x02a3c084, + 0x2e10: 0x02a3ea84, 0x2e11: 0x02a40084, 0x2e12: 0x02a53684, 0x2e13: 0x02a5f284, + 0x2e14: 0x02a62a84, 0x2e15: 0x02a63484, 0x2e16: 0x02a67084, 0x2e17: 0x02a68284, + 0x2e18: 0x02a6b884, 0x2e19: 0x02a6d284, 0x2e1a: 0x02a70484, 0x2e1b: 0x02a76c84, + 0x2e1c: 0x02a79084, 0x2e1d: 0x02a7c684, 0x2e1e: 0x02adae84, 0x2e1f: 0x02ae3e84, + 0x2e20: 0x02b1d684, 0x2e21: 0x02b20484, 0x2e22: 0x02b21484, 0x2e23: 0x02b22a84, + 0x2e24: 0x02b24e84, 0x2e25: 0x02b2e684, 0x2e26: 0x02b6a084, 0x2e27: 0x02b70084, + 0x2e28: 0x02b7f084, 0x2e29: 0x02b81e84, 0x2e2a: 0x02b84484, 0x2e2b: 0x02b87084, + 0x2e2c: 0x02b8dc84, 0x2e2d: 0x02b8e284, 0x2e2e: 0x02bbb684, 0x2e2f: 0x02bbca84, + 0x2e30: 0x02bbe284, 0x2e31: 0x02bbfc84, 0x2e32: 0x02bce484, 0x2e33: 0x02bcf484, + 0x2e34: 0x02bcfe84, 0x2e35: 0x02bde884, 0x2e36: 0x02bdfc84, 0x2e37: 0x02be1684, + 0x2e38: 0x02be2684, 0x2e39: 0x02bea084, 0x2e3a: 0x02bec284, 0x2e3b: 0x02bee684, + 0x2e3c: 0x02bf8684, 0x2e3d: 0x02c41084, 0x2e3e: 0x02c46c84, 0x2e3f: 0x02c49684, + // Block 0xb9, offset 0x2e40 + 0x2e40: 0x02ca5e84, 0x2e41: 0x02ca6884, 0x2e42: 0x02cb0e84, 0x2e43: 0x02cb2e84, + 0x2e44: 0x02cb4884, 0x2e45: 0x02cb7284, 0x2e46: 0x02cbc084, 0x2e47: 0x02cbca84, + 0x2e48: 0x02cde084, 0x2e49: 0x02ce1084, 0x2e4a: 0x02ce5084, 0x2e4b: 0x02d64084, + 0x2e4c: 0x02d6c484, 0x2e4d: 0x02d6f284, 0x2e4e: 0x02d76684, 0x2e4f: 0x02d79684, + 0x2e50: 0x02d7a884, 0x2e51: 0x02d7b684, 0x2e52: 0x02d81e84, 0x2e53: 0x02d82884, + 0x2e54: 0x02d86884, 0x2e55: 0x02e0d684, 0x2e56: 0x02e45484, 0x2e57: 0x02e46c84, + 0x2e58: 0x02e47684, 0x2e59: 0x02e47e84, 0x2e5a: 0x02e48e84, 0x2e5b: 0x02e4b284, + 0x2e5c: 0x02e4b684, 0x2e5d: 0x02e55884, 0x2e5e: 0x02e70884, 0x2e5f: 0x02e71284, + 0x2e60: 0x02e9b884, 0x2e61: 0x02e9cc84, 0x2e62: 0x02ea3084, 0x2e63: 0x02ea3e84, + 0x2e64: 0x02ea5084, 0x2e65: 0x02ea6084, 0x2e66: 0x02eb1684, 0x2e67: 0x02eb2484, + 0x2e68: 0x02ecec84, 0x2e69: 0x02ecfa84, 0x2e6a: 0x02ed5c84, 0x2e6b: 0x02ed7e84, + 0x2e6c: 0x02eddc84, 0x2e6d: 0x02efb684, 0x2e6e: 0x02efc484, 0x2e6f: 0x02efe684, + 0x2e70: 0x02f27484, 0x2e71: 0x02f37084, 0x2e72: 0x02f37c84, 0x2e73: 0x02f4e884, + 0x2e74: 0x02f59684, 0x2e75: 0x02f5f284, 0x2e76: 0x02f8e684, 0x2e77: 0x02f9f084, + 0x2e78: 0x02fe6c84, 0x2e79: 0x02fea284, 0x2e7a: 0x02ff1484, 0x2e7b: 0x02ff7a84, + 0x2e7c: 0x03000284, 0x2e7d: 0x03001884, 0x2e7e: 0x03002484, 0x2e7f: 0x03006684, + // Block 0xba, offset 0x2e80 + 0x2e80: 0x0300fe84, 0x2e81: 0x03011284, 0x2e82: 0x0303c684, 0x2e83: 0x0303d484, + 0x2e84: 0x0303e684, 0x2e85: 0x0303f884, 0x2e86: 0x03041884, 0x2e87: 0x03043684, + 0x2e88: 0x03043e84, 0x2e89: 0x0304dc84, 0x2e8a: 0x0304e484, 0x2e8b: 0x0304f084, + 0x2e8c: 0x030c9a84, 0x2e8d: 0x030cd684, 0x2e8e: 0x03108084, 0x2e8f: 0x03109884, + 0x2e90: 0x0310c684, 0x2e91: 0x0312fc84, 0x2e92: 0x03131684, 0x2e93: 0x0313a484, + 0x2e94: 0x03140084, 0x2e95: 0x03186e84, 0x2e96: 0x03188c84, 0x2e97: 0x0318aa84, + 0x2e98: 0x0318f084, 0x2e99: 0x03193a84, 0x2e9a: 0x031ac884, 0x2e9b: 0x031ae084, + 0x2e9c: 0x031b6684, 0x2e9d: 0x031d5684, 0x2e9e: 0x031d9484, 0x2e9f: 0x031f3684, + 0x2ea0: 0x031f6084, 0x2ea1: 0x031f6a84, 0x2ea2: 0x03212284, 0x2ea3: 0x03229284, + 0x2ea4: 0x03238c84, 0x2ea5: 0x03239884, 0x2ea6: 0x0323a284, 0x2ea7: 0x032aee84, + 0x2ea8: 0x032b0084, 0x2ea9: 0x032c3884, 0x2eaa: 0x032d6c84, 0x2eab: 0x032d7284, + 0x2eac: 0x032dd084, 0x2ead: 0x032ea284, 0x2eae: 0x032ebc84, 0x2eaf: 0x032ec484, + 0x2eb0: 0x032ed284, 0x2eb1: 0x032f9684, 0x2eb2: 0x032fda84, 0x2eb3: 0x032fe684, + 0x2eb4: 0x03300284, 0x2eb5: 0x03315084, 0x2eb6: 0x0331b684, 0x2eb7: 0x0331be84, + 0x2eb8: 0x03332c84, 0x2eb9: 0x03333284, 0x2eba: 0x03335884, 0x2ebb: 0x03355084, + 0x2ebc: 0x0335b084, 0x2ebd: 0x0335be84, 0x2ebe: 0x03364a84, 0x2ebf: 0x03365e84, + // Block 0xbb, offset 0x2ec0 + 0x2ec0: 0x03366484, 0x2ec1: 0x03367884, 0x2ec2: 0x0336b484, 0x2ec3: 0x0339ca84, + 0x2ec4: 0x033cea84, 0x2ec5: 0x033cfe84, 0x2ec6: 0x033d4a84, 0x2ec7: 0x033d7684, + 0x2ec8: 0x033d8684, 0x2ec9: 0x033d9a84, 0x2eca: 0x033da284, 0x2ecb: 0x033df284, + 0x2ecc: 0x033dfa84, 0x2ecd: 0x033e1c84, 0x2ece: 0x033e2684, 0x2ecf: 0x033e4084, + 0x2ed0: 0x033e7684, 0x2ed1: 0x033e9484, 0x2ed2: 0x033ea484, 0x2ed3: 0x033f1a84, + 0x2ed4: 0x033f3884, 0x2ed5: 0x033f4084, + 0x2ef0: 0x40273a20, 0x2ef1: 0x40273c20, 0x2ef2: 0x40273e20, 0x2ef3: 0x40274020, + 0x2ef4: 0x40274220, 0x2ef5: 0x40274420, 0x2ef6: 0x40274620, 0x2ef7: 0x40274820, + 0x2ef8: 0x40274a20, 0x2ef9: 0x40274c20, 0x2efa: 0x40274e20, 0x2efb: 0x40275020, + // Block 0xbc, offset 0x2f00 + 0x2f00: 0x00021283, 0x2f01: 0x40025c20, 0x2f02: 0x40030420, 0x2f03: 0x40051220, + 0x2f04: 0x40279a20, 0x2f05: 0x4027ca20, 0x2f06: 0xe0002206, 0x2f07: 0xe00001d3, + 0x2f08: 0x40049c20, 0x2f09: 0x40049e20, 0x2f0a: 0x4004a020, 0x2f0b: 0x4004a220, + 0x2f0c: 0x4004a420, 0x2f0d: 0x4004a620, 0x2f0e: 0x4004a820, 0x2f0f: 0x4004aa20, + 0x2f10: 0x4004ac20, 0x2f11: 0x4004ae20, 0x2f12: 0x40279c20, 0x2f13: 0x40279e20, + 0x2f14: 0x4004b020, 0x2f15: 0x4004b220, 0x2f16: 0x4004b420, 0x2f17: 0x4004b620, + 0x2f18: 0x4004b820, 0x2f19: 0x4004ba20, 0x2f1a: 0x4004bc20, 0x2f1b: 0x4004be20, + 0x2f1c: 0x40023820, 0x2f1d: 0x4003ea20, 0x2f1e: 0x4003ec20, 0x2f1f: 0x4003ee20, + 0x2f20: 0x4027a020, 0x2f21: 0xe0000267, 0x2f22: 0xe000037f, 0x2f23: 0xe0000459, + 0x2f24: 0xe000052e, 0x2f25: 0xe00005f8, 0x2f26: 0xe00006c3, 0x2f27: 0xe000076b, + 0x2f28: 0xe0000817, 0x2f29: 0xe00008bc, 0x2f2a: 0xada12202, 0x2f2b: 0xae412302, + 0x2f2c: 0xae812402, 0x2f2d: 0xade12502, 0x2f2e: 0xae012602, 0x2f2f: 0xae012702, + 0x2f30: 0x40023a20, 0x2f31: 0x4027ce20, 0x2f32: 0xe0000152, 0x2f33: 0x4027d020, + 0x2f34: 0xe0000155, 0x2f35: 0x4027d220, 0x2f36: 0x00279c84, 0x2f37: 0x4027a220, + 0x2f38: 0x02a68284, 0x2f39: 0x02a68884, 0x2f3a: 0x02a68a84, 0x2f3b: 0x4027cc20, + 0x2f3c: 0xe000231a, 0x2f3d: 0x40051420, 0x2f3e: 0x4027a420, 0x2f3f: 0x4027a620, + // Block 0xbd, offset 0x2f40 + 0x2f41: 0x0065768d, 0x2f42: 0x0065768e, 0x2f43: 0x0065788d, + 0x2f44: 0x0065788e, 0x2f45: 0x00657a8d, 0x2f46: 0x00657a8e, 0x2f47: 0x00657e8d, + 0x2f48: 0x00657e8e, 0x2f49: 0x0065808d, 0x2f4a: 0x0065808e, 0x2f4b: 0x0065828e, + 0x2f4c: 0xe000216a, 0x2f4d: 0x0065848e, 0x2f4e: 0xe0002188, 0x2f4f: 0x0065868e, + 0x2f50: 0xe00021b8, 0x2f51: 0x0065888e, 0x2f52: 0xe00021d6, 0x2f53: 0x00658a8e, + 0x2f54: 0xe00021e0, 0x2f55: 0x00658c8e, 0x2f56: 0xe00021ef, 0x2f57: 0x00658e8e, + 0x2f58: 0xe0002200, 0x2f59: 0x0065908e, 0x2f5a: 0xe000220f, 0x2f5b: 0x0065928e, + 0x2f5c: 0xe0002215, 0x2f5d: 0x0065948e, 0x2f5e: 0xe0002223, 0x2f5f: 0x0065968e, + 0x2f60: 0xe0002229, 0x2f61: 0x0065988e, 0x2f62: 0xe0002234, 0x2f63: 0x00659a8d, + 0x2f64: 0x00659a8e, 0x2f65: 0xe000223a, 0x2f66: 0x00659c8e, 0x2f67: 0xe0002240, + 0x2f68: 0x00659e8e, 0x2f69: 0xe000224a, 0x2f6a: 0x0065a08e, 0x2f6b: 0x0065a28e, + 0x2f6c: 0x0065a48e, 0x2f6d: 0x0065a68e, 0x2f6e: 0x0065a88e, 0x2f6f: 0x0065aa8e, + 0x2f70: 0xe0002258, 0x2f71: 0xe000225e, 0x2f72: 0x0065ac8e, 0x2f73: 0xe000227a, + 0x2f74: 0xe0002280, 0x2f75: 0x0065ae8e, 0x2f76: 0xe000229a, 0x2f77: 0xe00022a0, + 0x2f78: 0x0065b08e, 0x2f79: 0xe00022bd, 0x2f7a: 0xe00022c3, 0x2f7b: 0x0065b28e, + 0x2f7c: 0xe00022ec, 0x2f7d: 0xe00022f2, 0x2f7e: 0x0065b48e, 0x2f7f: 0x0065b68e, + // Block 0xbe, offset 0x2f80 + 0x2f80: 0x0065b88e, 0x2f81: 0x0065ba8e, 0x2f82: 0x0065bc8e, 0x2f83: 0x0065be8d, + 0x2f84: 0x0065be8e, 0x2f85: 0x0065c08d, 0x2f86: 0x0065c08e, 0x2f87: 0x0065c48d, + 0x2f88: 0x0065c48e, 0x2f89: 0x0065c68e, 0x2f8a: 0x0065c88e, 0x2f8b: 0x0065ca8e, + 0x2f8c: 0x0065cc8e, 0x2f8d: 0x0065ce8e, 0x2f8e: 0x0065d08d, 0x2f8f: 0x0065d08e, + 0x2f90: 0x0065d28e, 0x2f91: 0x0065d48e, 0x2f92: 0x0065d68e, 0x2f93: 0x0065d88e, + 0x2f94: 0xe000214c, 0x2f95: 0x0065828d, 0x2f96: 0x0065888d, + 0x2f99: 0xa0812802, 0x2f9a: 0xa0812902, 0x2f9b: 0x40063c20, + 0x2f9c: 0x40063e20, 0x2f9d: 0x4027d420, 0x2f9e: 0xe0000158, 0x2f9f: 0xf0001616, + 0x2fa0: 0x40023c20, 0x2fa1: 0x0065768f, 0x2fa2: 0x00657691, 0x2fa3: 0x0065788f, + 0x2fa4: 0x00657891, 0x2fa5: 0x00657a8f, 0x2fa6: 0x00657a91, 0x2fa7: 0x00657e8f, + 0x2fa8: 0x00657e91, 0x2fa9: 0x0065808f, 0x2faa: 0x00658091, 0x2fab: 0x00658291, + 0x2fac: 0xe000216d, 0x2fad: 0x00658491, 0x2fae: 0xe000218b, 0x2faf: 0x00658691, + 0x2fb0: 0xe00021bb, 0x2fb1: 0x00658891, 0x2fb2: 0xe00021d9, 0x2fb3: 0x00658a91, + 0x2fb4: 0xe00021e3, 0x2fb5: 0x00658c91, 0x2fb6: 0xe00021f2, 0x2fb7: 0x00658e91, + 0x2fb8: 0xe0002203, 0x2fb9: 0x00659091, 0x2fba: 0xe0002212, 0x2fbb: 0x00659291, + 0x2fbc: 0xe0002218, 0x2fbd: 0x00659491, 0x2fbe: 0xe0002226, 0x2fbf: 0x00659691, + // Block 0xbf, offset 0x2fc0 + 0x2fc0: 0xe000222c, 0x2fc1: 0x00659891, 0x2fc2: 0xe0002237, 0x2fc3: 0x00659a8f, + 0x2fc4: 0x00659a91, 0x2fc5: 0xe000223d, 0x2fc6: 0x00659c91, 0x2fc7: 0xe0002243, + 0x2fc8: 0x00659e91, 0x2fc9: 0xe000224d, 0x2fca: 0x0065a091, 0x2fcb: 0x0065a291, + 0x2fcc: 0x0065a491, 0x2fcd: 0x0065a691, 0x2fce: 0x0065a891, 0x2fcf: 0x0065aa91, + 0x2fd0: 0xe000225b, 0x2fd1: 0xe0002261, 0x2fd2: 0x0065ac91, 0x2fd3: 0xe000227d, + 0x2fd4: 0xe0002283, 0x2fd5: 0x0065ae91, 0x2fd6: 0xe000229d, 0x2fd7: 0xe00022a3, + 0x2fd8: 0x0065b091, 0x2fd9: 0xe00022c0, 0x2fda: 0xe00022c6, 0x2fdb: 0x0065b291, + 0x2fdc: 0xe00022ef, 0x2fdd: 0xe00022f5, 0x2fde: 0x0065b491, 0x2fdf: 0x0065b691, + 0x2fe0: 0x0065b891, 0x2fe1: 0x0065ba91, 0x2fe2: 0x0065bc91, 0x2fe3: 0x0065be8f, + 0x2fe4: 0x0065be91, 0x2fe5: 0x0065c08f, 0x2fe6: 0x0065c091, 0x2fe7: 0x0065c48f, + 0x2fe8: 0x0065c491, 0x2fe9: 0x0065c691, 0x2fea: 0x0065c891, 0x2feb: 0x0065ca91, + 0x2fec: 0x0065cc91, 0x2fed: 0x0065ce91, 0x2fee: 0x0065d08f, 0x2fef: 0x0065d091, + 0x2ff0: 0x0065d291, 0x2ff1: 0x0065d491, 0x2ff2: 0x0065d691, 0x2ff3: 0x0065d891, + 0x2ff4: 0xe000214f, 0x2ff5: 0x0065828f, 0x2ff6: 0x0065888f, 0x2ff7: 0xe000236a, + 0x2ff8: 0xe0002371, 0x2ff9: 0xe0002374, 0x2ffa: 0xe0002377, 0x2ffb: 0x40023e20, + 0x2ffc: 0x4027d620, 0x2ffd: 0x4027d820, 0x2ffe: 0xe000015b, 0x2fff: 0xf0001616, + // Block 0xc0, offset 0x3000 + 0x3005: 0x4065da20, 0x3006: 0x4065dc20, 0x3007: 0x4065de20, + 0x3008: 0x4065e020, 0x3009: 0x4065e420, 0x300a: 0x4065e620, 0x300b: 0x4065e820, + 0x300c: 0x4065ea20, 0x300d: 0x4065ec20, 0x300e: 0x4065ee20, 0x300f: 0x4065f420, + 0x3010: 0x4065f620, 0x3011: 0x4065f820, 0x3012: 0x4065fa20, 0x3013: 0x4065fe20, + 0x3014: 0x40660020, 0x3015: 0x40660220, 0x3016: 0x40660420, 0x3017: 0x40660620, + 0x3018: 0x40660820, 0x3019: 0x40660a20, 0x301a: 0x40661220, 0x301b: 0x40661420, + 0x301c: 0x40661820, 0x301d: 0x40661a20, 0x301e: 0x40661e20, 0x301f: 0x40662020, + 0x3020: 0x40662220, 0x3021: 0x40662420, 0x3022: 0x40662620, 0x3023: 0x40662820, + 0x3024: 0x40662a20, 0x3025: 0x40662e20, 0x3026: 0x40663620, 0x3027: 0x40663820, + 0x3028: 0x40663a20, 0x3029: 0x40663c20, 0x302a: 0x4065e220, 0x302b: 0x4065f020, + 0x302c: 0x4065fc20, 0x302d: 0x40663e20, + 0x3031: 0x0062ac84, 0x3032: 0x0062ae84, 0x3033: 0x00646884, + 0x3034: 0x0062b084, 0x3035: 0x00646c84, 0x3036: 0x00646e84, 0x3037: 0x0062b284, + 0x3038: 0x0062b484, 0x3039: 0x0062b684, 0x303a: 0x00647484, 0x303b: 0x00647684, + 0x303c: 0x00647884, 0x303d: 0x00647a84, 0x303e: 0x00647c84, 0x303f: 0x00647e84, + // Block 0xc1, offset 0x3040 + 0x3040: 0x0062e084, 0x3041: 0x0062b884, 0x3042: 0x0062ba84, 0x3043: 0x0062bc84, + 0x3044: 0x0062ee84, 0x3045: 0x0062be84, 0x3046: 0x0062c084, 0x3047: 0x0062c284, + 0x3048: 0x0062c484, 0x3049: 0x0062c684, 0x304a: 0x0062c884, 0x304b: 0x0062ca84, + 0x304c: 0x0062cc84, 0x304d: 0x0062ce84, 0x304e: 0x0062d084, 0x304f: 0x0063a884, + 0x3050: 0x0063aa84, 0x3051: 0x0063ac84, 0x3052: 0x0063ae84, 0x3053: 0x0063b084, + 0x3054: 0x0063b284, 0x3055: 0x0063b484, 0x3056: 0x0063b684, 0x3057: 0x0063b884, + 0x3058: 0x0063ba84, 0x3059: 0x0063bc84, 0x305a: 0x0063be84, 0x305b: 0x0063c084, + 0x305c: 0x0063c284, 0x305d: 0x0063c484, 0x305e: 0x0063c684, 0x305f: 0x0063c884, + 0x3060: 0x0063ca84, 0x3061: 0x0063cc84, 0x3062: 0x0063ce84, 0x3063: 0x0063d084, + 0x3064: 0x0063a684, 0x3065: 0x0062d484, 0x3066: 0x0062d684, 0x3067: 0x0064a284, + 0x3068: 0x0064a484, 0x3069: 0x0064ac84, 0x306a: 0x0064b084, 0x306b: 0x0064ba84, + 0x306c: 0x0064c284, 0x306d: 0x0064c684, 0x306e: 0x0062e484, 0x306f: 0x0064ce84, + 0x3070: 0x0064d284, 0x3071: 0x0062e684, 0x3072: 0x0062e884, 0x3073: 0x0062ec84, + 0x3074: 0x0062f084, 0x3075: 0x0062f284, 0x3076: 0x0062fa84, 0x3077: 0x0062fe84, + 0x3078: 0x00630284, 0x3079: 0x00630484, 0x307a: 0x00630684, 0x307b: 0x00630884, + 0x307c: 0x00630a84, 0x307d: 0x00631084, 0x307e: 0x00631884, 0x307f: 0x00632c84, + // Block 0xc2, offset 0x3080 + 0x3080: 0x00633a84, 0x3081: 0x00634484, 0x3082: 0x0064f684, 0x3083: 0x0064f884, + 0x3084: 0x00635a84, 0x3085: 0x00635c84, 0x3086: 0x00635e84, 0x3087: 0x0063ee84, + 0x3088: 0x0063f084, 0x3089: 0x0063f684, 0x308a: 0x00640884, 0x308b: 0x00640a84, + 0x308c: 0x00640e84, 0x308d: 0x00642284, 0x308e: 0x00642884, + 0x3090: 0x4027a820, 0x3091: 0x4027aa20, 0x3092: 0x029c0094, 0x3093: 0x029d1894, + 0x3094: 0x029c1294, 0x3095: 0x02adb694, 0x3096: 0x029c1494, 0x3097: 0x029c5a94, + 0x3098: 0x029c1694, 0x3099: 0x02ea6494, 0x309a: 0x029cb294, 0x309b: 0x029c3294, + 0x309c: 0x029c0294, 0x309d: 0x02b25294, 0x309e: 0x02ae6094, 0x309f: 0x029d7494, + 0x30a0: 0xe000237a, 0x30a1: 0xe0002383, 0x30a2: 0xe0002380, 0x30a3: 0xe000237d, + 0x30a4: 0x40661c20, 0x30a5: 0xe000238c, 0x30a6: 0x40661620, 0x30a7: 0xe0002389, + 0x30a8: 0xe000239e, 0x30a9: 0xe0002386, 0x30aa: 0xe0002395, 0x30ab: 0xe000239b, + 0x30ac: 0x40663420, 0x30ad: 0x4065f220, 0x30ae: 0xe000238f, 0x30af: 0xe0002392, + 0x30b0: 0x40663020, 0x30b1: 0x40663220, 0x30b2: 0x40662c20, 0x30b3: 0xe0002398, + 0x30b4: 0x0065dc99, 0x30b5: 0x0065e699, 0x30b6: 0x0065ee99, 0x30b7: 0x0065f499, + 0x30b8: 0x40660c20, 0x30b9: 0x40660e20, 0x30ba: 0x40661020, + // Block 0xc3, offset 0x30c0 + 0x30c0: 0x40275220, 0x30c1: 0x40275420, 0x30c2: 0x40275620, 0x30c3: 0x40275820, + 0x30c4: 0x40275a20, 0x30c5: 0x40275c20, 0x30c6: 0x40275e20, 0x30c7: 0x40276020, + 0x30c8: 0x40276220, 0x30c9: 0x40276420, 0x30ca: 0x40276620, 0x30cb: 0x40276820, + 0x30cc: 0x40276a20, 0x30cd: 0x40276c20, 0x30ce: 0x40276e20, 0x30cf: 0x40277020, + 0x30d0: 0x40277220, 0x30d1: 0x40277420, 0x30d2: 0x40277620, 0x30d3: 0x40277820, + 0x30d4: 0x40277a20, 0x30d5: 0x40277c20, 0x30d6: 0x40277e20, 0x30d7: 0x40278020, + 0x30d8: 0x40278220, 0x30d9: 0x40278420, 0x30da: 0x40278620, 0x30db: 0x40278820, + 0x30dc: 0x40278a20, 0x30dd: 0x40278c20, 0x30de: 0x40278e20, 0x30df: 0x40279020, + 0x30e0: 0x40279220, 0x30e1: 0x40279420, 0x30e2: 0x40279620, 0x30e3: 0x40279820, + 0x30f0: 0x0065868f, 0x30f1: 0x00658e8f, 0x30f2: 0x0065908f, 0x30f3: 0x00659e8f, + 0x30f4: 0x0065a48f, 0x30f5: 0x0065aa8f, 0x30f6: 0x0065ac8f, 0x30f7: 0x0065ae8f, + 0x30f8: 0x0065b08f, 0x30f9: 0x0065b28f, 0x30fa: 0x0065b88f, 0x30fb: 0x0065c68f, + 0x30fc: 0x0065c88f, 0x30fd: 0x0065ca8f, 0x30fe: 0x0065cc8f, 0x30ff: 0x0065ce8f, + // Block 0xc4, offset 0x3100 + 0x3100: 0xf0000404, 0x3101: 0xf0000404, 0x3102: 0xf0000404, 0x3103: 0xf0000404, + 0x3104: 0xf0000404, 0x3105: 0xf0000404, 0x3106: 0xf0000404, 0x3107: 0xf0000404, + 0x3108: 0xf0000404, 0x3109: 0xf0000404, 0x310a: 0xf0000404, 0x310b: 0xf0000404, + 0x310c: 0xf0000404, 0x310d: 0xf0000404, 0x310e: 0xe000004c, 0x310f: 0xe0000051, + 0x3110: 0xe0000056, 0x3111: 0xe000005b, 0x3112: 0xe0000060, 0x3113: 0xe0000065, + 0x3114: 0xe000006a, 0x3115: 0xe000006f, 0x3116: 0xe0000083, 0x3117: 0xe000008d, + 0x3118: 0xe0000092, 0x3119: 0xe0000097, 0x311a: 0xe000009c, 0x311b: 0xe00000a1, + 0x311c: 0xe0000088, 0x311d: 0xe0000074, 0x311e: 0xe000007c, + 0x3120: 0xf0000404, 0x3121: 0xf0000404, 0x3122: 0xf0000404, 0x3123: 0xf0000404, + 0x3124: 0xf0000404, 0x3125: 0xf0000404, 0x3126: 0xf0000404, 0x3127: 0xf0000404, + 0x3128: 0xf0000404, 0x3129: 0xf0000404, 0x312a: 0xf0000404, 0x312b: 0xf0000404, + 0x312c: 0xf0000404, 0x312d: 0xf0000404, 0x312e: 0xf0000404, 0x312f: 0xf0000404, + 0x3130: 0xf0000404, 0x3131: 0xf0000404, 0x3132: 0xf0000404, 0x3133: 0xf0000404, + 0x3134: 0xf0000404, 0x3135: 0xf0000404, 0x3136: 0xf0000404, 0x3137: 0xf0000404, + 0x3138: 0xf0000404, 0x3139: 0xf0000404, 0x313a: 0xf0000404, 0x313b: 0xf0000404, + 0x313c: 0xf0000404, 0x313d: 0xf0000404, 0x313e: 0xf0000404, 0x313f: 0xf0000404, + // Block 0xc5, offset 0x3140 + 0x3140: 0xf0000404, 0x3141: 0xf0000404, 0x3142: 0xf0000404, 0x3143: 0xf0000404, + 0x3144: 0x02aa9e86, 0x3145: 0x02bcf886, 0x3146: 0x02cb0e86, 0x3147: 0x02f71e86, + 0x3148: 0xe00002e3, 0x3149: 0xe00003d8, 0x314a: 0xe00004b3, 0x314b: 0xe000057d, + 0x314c: 0xe0000648, 0x314d: 0xe00006f0, 0x314e: 0xe000079c, 0x314f: 0xe0000841, + 0x3150: 0xe0000ec0, 0x3151: 0xf0000606, 0x3152: 0xf0000606, 0x3153: 0xf0000606, + 0x3154: 0xf0000606, 0x3155: 0xf0000606, 0x3156: 0xf0000606, 0x3157: 0xf0000606, + 0x3158: 0xf0000606, 0x3159: 0xf0000606, 0x315a: 0xf0000606, 0x315b: 0xf0000606, + 0x315c: 0xf0000606, 0x315d: 0xf0000606, 0x315e: 0xf0000606, 0x315f: 0xf0000606, + 0x3160: 0x0062ac86, 0x3161: 0x0062b086, 0x3162: 0x0062b286, 0x3163: 0x0062b686, + 0x3164: 0x0062b886, 0x3165: 0x0062ba86, 0x3166: 0x0062be86, 0x3167: 0x0062c286, + 0x3168: 0x0062c486, 0x3169: 0x0062c886, 0x316a: 0x0062ca86, 0x316b: 0x0062cc86, + 0x316c: 0x0062ce86, 0x316d: 0x0062d086, 0x316e: 0xf0000606, 0x316f: 0xf0000606, + 0x3170: 0xf0000606, 0x3171: 0xf0000606, 0x3172: 0xf0000606, 0x3173: 0xf0000606, + 0x3174: 0xf0000606, 0x3175: 0xf0000606, 0x3176: 0xf0000606, 0x3177: 0xf0000606, + 0x3178: 0xf0000606, 0x3179: 0xf0000606, 0x317a: 0xf0000606, 0x317b: 0xf0000606, + 0x317c: 0xe0002127, 0x317d: 0xe0002122, 0x317e: 0xf0000606, 0x317f: 0x4027ac20, + // Block 0xc6, offset 0x3180 + 0x3180: 0x029c0086, 0x3181: 0x029d1886, 0x3182: 0x029c1286, 0x3183: 0x02adb686, + 0x3184: 0x029d2886, 0x3185: 0x02a2da86, 0x3186: 0x029c0686, 0x3187: 0x02a2d686, + 0x3188: 0x029cba86, 0x3189: 0x02a68286, 0x318a: 0x02ce1086, 0x318b: 0x02e0d686, + 0x318c: 0x02d86886, 0x318d: 0x02ce5086, 0x318e: 0x0323a286, 0x318f: 0x02ae3e86, + 0x3190: 0x02cbca86, 0x3191: 0x02d05486, 0x3192: 0x02ce1286, 0x3193: 0x02f27c86, + 0x3194: 0x02a81a86, 0x3195: 0x02e4f286, 0x3196: 0x03194286, 0x3197: 0x02f2ba86, + 0x3198: 0x02a56886, 0x3199: 0x02f3b086, 0x319a: 0x02ea6e86, 0x319b: 0x02b2e686, + 0x319c: 0x0320d286, 0x319d: 0x02a25486, 0x319e: 0x02a6e086, 0x319f: 0x02d9d086, + 0x31a0: 0x03300a86, 0x31a1: 0x029e2286, 0x31a2: 0x02a33286, 0x31a3: 0x02d6c686, + 0x31a4: 0x029c1486, 0x31a5: 0x029c5a86, 0x31a6: 0x029c1686, 0x31a7: 0x02bbcc86, + 0x31a8: 0x02a7e686, 0x31a9: 0x02a67686, 0x31aa: 0x02b72e86, 0x31ab: 0x02b6cc86, + 0x31ac: 0x02edc686, 0x31ad: 0x029e0286, 0x31ae: 0x03198e86, 0x31af: 0x02a6a886, + 0x31b0: 0x02b23886, 0x31b1: 0xf0000606, 0x31b2: 0xf0000606, 0x31b3: 0xf0000606, + 0x31b4: 0xf0000606, 0x31b5: 0xf0000606, 0x31b6: 0xf0000606, 0x31b7: 0xf0000606, + 0x31b8: 0xf0000606, 0x31b9: 0xf0000606, 0x31ba: 0xf0000606, 0x31bb: 0xf0000606, + 0x31bc: 0xf0000606, 0x31bd: 0xf0000606, 0x31be: 0xf0000606, 0x31bf: 0xf0000606, + // Block 0xc7, offset 0x31c0 + 0x31c0: 0xf0001f04, 0x31c1: 0xf0001f04, 0x31c2: 0xf0001f04, 0x31c3: 0xf0001f04, + 0x31c4: 0xf0001f04, 0x31c5: 0xf0001f04, 0x31c6: 0xf0001f04, 0x31c7: 0xf0001f04, + 0x31c8: 0xf0001f04, 0x31c9: 0xf0000404, 0x31ca: 0xf0000404, 0x31cb: 0xf0000404, + 0x31cc: 0xf0001c1d, 0x31cd: 0xe0000b85, 0x31ce: 0xf0001d1c, 0x31cf: 0xe0000d14, + 0x31d0: 0x00657693, 0x31d1: 0x00657893, 0x31d2: 0x00657a93, 0x31d3: 0x00657e93, + 0x31d4: 0x00658093, 0x31d5: 0x00658293, 0x31d6: 0x00658493, 0x31d7: 0x00658693, + 0x31d8: 0x00658893, 0x31d9: 0x00658a93, 0x31da: 0x00658c93, 0x31db: 0x00658e93, + 0x31dc: 0x00659093, 0x31dd: 0x00659293, 0x31de: 0x00659493, 0x31df: 0x00659693, + 0x31e0: 0x00659893, 0x31e1: 0x00659a93, 0x31e2: 0x00659c93, 0x31e3: 0x00659e93, + 0x31e4: 0x0065a093, 0x31e5: 0x0065a293, 0x31e6: 0x0065a493, 0x31e7: 0x0065a693, + 0x31e8: 0x0065a893, 0x31e9: 0x0065aa93, 0x31ea: 0x0065ac93, 0x31eb: 0x0065ae93, + 0x31ec: 0x0065b093, 0x31ed: 0x0065b293, 0x31ee: 0x0065b493, 0x31ef: 0x0065b693, + 0x31f0: 0x0065b893, 0x31f1: 0x0065ba93, 0x31f2: 0x0065bc93, 0x31f3: 0x0065be93, + 0x31f4: 0x0065c093, 0x31f5: 0x0065c493, 0x31f6: 0x0065c693, 0x31f7: 0x0065c893, + 0x31f8: 0x0065ca93, 0x31f9: 0x0065cc93, 0x31fa: 0x0065ce93, 0x31fb: 0x0065d093, + 0x31fc: 0x0065d293, 0x31fd: 0x0065d493, 0x31fe: 0x0065d693, + // Block 0xc8, offset 0x3200 + 0x3200: 0xe0002131, 0x3201: 0xe0002137, 0x3202: 0xe000213c, 0x3203: 0xe000212d, + 0x3204: 0xe0002142, 0x3205: 0xe0002148, 0x3206: 0xe0002152, 0x3207: 0xe000215b, + 0x3208: 0xe0002156, 0x3209: 0xe0002166, 0x320a: 0xe0002162, 0x320b: 0xe0002170, + 0x320c: 0xe0002174, 0x320d: 0xe0002179, 0x320e: 0xe000217e, 0x320f: 0xe0002183, + 0x3210: 0xe000218e, 0x3211: 0xe0002193, 0x3212: 0xe0002198, 0x3213: 0xe000219d, + 0x3214: 0xf0001c1c, 0x3215: 0xe00021a4, 0x3216: 0xe00021ab, 0x3217: 0xe00021b2, + 0x3218: 0xe00021be, 0x3219: 0xe00021c3, 0x321a: 0xe00021ca, 0x321b: 0xe00021d1, + 0x321c: 0xe00021dc, 0x321d: 0xe00021eb, 0x321e: 0xe00021e6, 0x321f: 0xe00021f5, + 0x3220: 0xe00021fa, 0x3221: 0xe0002209, 0x3222: 0xe000221b, 0x3223: 0xe000221f, + 0x3224: 0xe000222f, 0x3225: 0xe0002246, 0x3226: 0xe0002250, 0x3227: 0xf0001c1c, + 0x3228: 0xf0001c1c, 0x3229: 0xe0002254, 0x322a: 0xe0002276, 0x322b: 0xe0002264, + 0x322c: 0xe000226b, 0x322d: 0xe0002270, 0x322e: 0xe0002286, 0x322f: 0xe000228d, + 0x3230: 0xe0002292, 0x3231: 0xe0002296, 0x3232: 0xe00022a6, 0x3233: 0xe00022ad, + 0x3234: 0xe00022b2, 0x3235: 0xe00022b9, 0x3236: 0xe00022d4, 0x3237: 0xe00022da, + 0x3238: 0xe00022de, 0x3239: 0xe00022e3, 0x323a: 0xe00022e7, 0x323b: 0xe00022c9, + 0x323c: 0xe00022cf, 0x323d: 0xe0002300, 0x323e: 0xe0002306, 0x323f: 0xf0001c1c, + // Block 0xc9, offset 0x3240 + 0x3240: 0xe000230b, 0x3241: 0xe00022f8, 0x3242: 0xe00022fc, 0x3243: 0xe0002311, + 0x3244: 0xe0002316, 0x3245: 0xe000231d, 0x3246: 0xe0002321, 0x3247: 0xe0002325, + 0x3248: 0xe000232b, 0x3249: 0xf0001c1c, 0x324a: 0xe0002330, 0x324b: 0xe000233c, + 0x324c: 0xe0002340, 0x324d: 0xe0002337, 0x324e: 0xe0002346, 0x324f: 0xe000234b, + 0x3250: 0xe000234f, 0x3251: 0xe0002353, 0x3252: 0xf0001c1c, 0x3253: 0xe000235e, + 0x3254: 0xe0002358, 0x3255: 0xf0001c1c, 0x3256: 0xe0002363, 0x3257: 0xe000236d, + 0x3258: 0xf0001f04, 0x3259: 0xf0001f04, 0x325a: 0xf0001f04, 0x325b: 0xf0001f04, + 0x325c: 0xf0001f04, 0x325d: 0xf0001f04, 0x325e: 0xf0001f04, 0x325f: 0xf0001f04, + 0x3260: 0xf0001f04, 0x3261: 0xf0001f04, 0x3262: 0xf0000404, 0x3263: 0xf0000404, + 0x3264: 0xf0000404, 0x3265: 0xf0000404, 0x3266: 0xf0000404, 0x3267: 0xf0000404, + 0x3268: 0xf0000404, 0x3269: 0xf0000404, 0x326a: 0xf0000404, 0x326b: 0xf0000404, + 0x326c: 0xf0000404, 0x326d: 0xf0000404, 0x326e: 0xf0000404, 0x326f: 0xf0000404, + 0x3270: 0xf0000404, 0x3271: 0xe0000c1e, 0x3272: 0xf0001c1c, 0x3273: 0xf0001d1d, + 0x3274: 0xe0000a31, 0x3275: 0xf0001d1c, 0x3276: 0xf0001c1c, 0x3277: 0xf0001c1c, + 0x3278: 0xe0000ac2, 0x3279: 0xe0000ac6, 0x327a: 0xf0001d1d, 0x327b: 0xf0001c1c, + 0x327c: 0xf0001c1c, 0x327d: 0xf0001c1c, 0x327e: 0xf0001c1c, 0x327f: 0xe0002431, + // Block 0xca, offset 0x3280 + 0x3280: 0xf0001d1c, 0x3281: 0xf0001d1c, 0x3282: 0xf0001d1c, 0x3283: 0xf0001d1c, + 0x3284: 0xf0001d1c, 0x3285: 0xf0001d1d, 0x3286: 0xf0001d1d, 0x3287: 0xf0001d1d, + 0x3288: 0xe0000a6b, 0x3289: 0xe0000cb4, 0x328a: 0xf0001d1c, 0x328b: 0xf0001d1c, + 0x328c: 0xf0001d1c, 0x328d: 0xf0001c1c, 0x328e: 0xf0001c1c, 0x328f: 0xf0001c1c, + 0x3290: 0xf0001c1d, 0x3291: 0xe0000cb9, 0x3292: 0xe0000d36, 0x3293: 0xe0000be3, + 0x3294: 0xe0000fc5, 0x3295: 0xf0001c1c, 0x3296: 0xf0001c1c, 0x3297: 0xf0001c1c, + 0x3298: 0xf0001c1c, 0x3299: 0xf0001c1c, 0x329a: 0xf0001c1c, 0x329b: 0xf0001c1c, + 0x329c: 0xf0001c1c, 0x329d: 0xf0001c1c, 0x329e: 0xf0001c1c, 0x329f: 0xe0000d3e, + 0x32a0: 0xe0000a72, 0x32a1: 0xf0001c1c, 0x32a2: 0xe0000cbd, 0x32a3: 0xe0000d42, + 0x32a4: 0xe0000a76, 0x32a5: 0xf0001c1c, 0x32a6: 0xe0000cc1, 0x32a7: 0xe0000d2d, + 0x32a8: 0xe0000d31, 0x32a9: 0xf0001c1d, 0x32aa: 0xe0000cc5, 0x32ab: 0xe0000d4a, + 0x32ac: 0xe0000be7, 0x32ad: 0xe0000f0b, 0x32ae: 0xe0000f0f, 0x32af: 0xe0000f15, + 0x32b0: 0xf0001c1c, 0x32b1: 0xf0001c1c, 0x32b2: 0xf0001c1c, 0x32b3: 0xf0001c1c, + 0x32b4: 0xf0001d1c, 0x32b5: 0xf0001d1c, 0x32b6: 0xf0001d1c, 0x32b7: 0xf0001d1c, + 0x32b8: 0xf0001d1c, 0x32b9: 0xf0001d1d, 0x32ba: 0xf0001d1c, 0x32bb: 0xf0001d1c, + 0x32bc: 0xf0001d1c, 0x32bd: 0xf0001d1c, 0x32be: 0xf0001d1c, 0x32bf: 0xf0001d1d, + // Block 0xcb, offset 0x32c0 + 0x32c0: 0xf0001d1c, 0x32c1: 0xf0001d1d, 0x32c2: 0xe00009b7, 0x32c3: 0xf0001c1d, + 0x32c4: 0xf0001c1c, 0x32c5: 0xf0001c1c, 0x32c6: 0xe0000a66, 0x32c7: 0xe0000a7a, + 0x32c8: 0xf0001d1c, 0x32c9: 0xf0001c1d, 0x32ca: 0xf0001c1c, 0x32cb: 0xf0001d1d, + 0x32cc: 0xf0001c1c, 0x32cd: 0xf0001d1d, 0x32ce: 0xf0001d1d, 0x32cf: 0xf0001c1c, + 0x32d0: 0xf0001c1c, 0x32d1: 0xf0001c1c, 0x32d2: 0xe0000d0d, 0x32d3: 0xf0001c1c, + 0x32d4: 0xf0001c1c, 0x32d5: 0xe0000d3a, 0x32d6: 0xe0000d46, 0x32d7: 0xf0001d1d, + 0x32d8: 0xe0000eb0, 0x32d9: 0xe0000eb8, 0x32da: 0xf0001d1d, 0x32db: 0xf0001c1c, + 0x32dc: 0xf0001c1d, 0x32dd: 0xf0001c1d, 0x32de: 0xe00010b2, 0x32df: 0xe00009c8, + 0x32e0: 0xf0001f04, 0x32e1: 0xf0001f04, 0x32e2: 0xf0001f04, 0x32e3: 0xf0001f04, + 0x32e4: 0xf0001f04, 0x32e5: 0xf0001f04, 0x32e6: 0xf0001f04, 0x32e7: 0xf0001f04, + 0x32e8: 0xf0001f04, 0x32e9: 0xf0000404, 0x32ea: 0xf0000404, 0x32eb: 0xf0000404, + 0x32ec: 0xf0000404, 0x32ed: 0xf0000404, 0x32ee: 0xf0000404, 0x32ef: 0xf0000404, + 0x32f0: 0xf0000404, 0x32f1: 0xf0000404, 0x32f2: 0xf0000404, 0x32f3: 0xf0000404, + 0x32f4: 0xf0000404, 0x32f5: 0xf0000404, 0x32f6: 0xf0000404, 0x32f7: 0xf0000404, + 0x32f8: 0xf0000404, 0x32f9: 0xf0000404, 0x32fa: 0xf0000404, 0x32fb: 0xf0000404, + 0x32fc: 0xf0000404, 0x32fd: 0xf0000404, 0x32fe: 0xf0000404, 0x32ff: 0xe0000bdf, + // Block 0xcc, offset 0x3300 + 0x3300: 0x40196220, 0x3301: 0x40196420, 0x3302: 0x40196620, 0x3303: 0x40196820, + 0x3304: 0x40196a20, 0x3305: 0x40196c20, 0x3306: 0x40196e20, 0x3307: 0x40197020, + 0x3308: 0x40197220, 0x3309: 0x40197420, 0x330a: 0x40197620, 0x330b: 0x40197820, + 0x330c: 0x40197a20, 0x330d: 0x40197c20, 0x330e: 0x40197e20, 0x330f: 0x40198020, + 0x3310: 0x40198220, 0x3311: 0x40198420, 0x3312: 0x40198620, 0x3313: 0x40198820, + 0x3314: 0x40198a20, 0x3315: 0x40198c20, 0x3316: 0x40198e20, 0x3317: 0x40199020, + 0x3318: 0x40199220, 0x3319: 0x40199420, 0x331a: 0x40199620, 0x331b: 0x40199820, + 0x331c: 0x40199a20, 0x331d: 0x40199c20, 0x331e: 0x40199e20, 0x331f: 0x4019a020, + 0x3320: 0x4019a220, 0x3321: 0x4019a420, 0x3322: 0x4019a620, 0x3323: 0x4019a820, + 0x3324: 0x4019aa20, 0x3325: 0x4019ac20, 0x3326: 0x4019ae20, 0x3327: 0x4019b020, + 0x3328: 0x4019b220, 0x3329: 0x4019b420, 0x332a: 0x4019b620, 0x332b: 0x4019b820, + 0x332c: 0x4019ba20, 0x332d: 0x4019bc20, 0x332e: 0x4019be20, 0x332f: 0x4019c020, + 0x3330: 0x4019c220, 0x3331: 0x4019c420, 0x3332: 0x4019c620, 0x3333: 0x4019c820, + 0x3334: 0x4019ca20, 0x3335: 0x4019cc20, 0x3336: 0x4019ce20, 0x3337: 0x4019d020, + 0x3338: 0x4019d220, 0x3339: 0x4019d420, 0x333a: 0x4019d620, 0x333b: 0x4019d820, + 0x333c: 0x4019da20, 0x333d: 0x4019dc20, 0x333e: 0x4019de20, 0x333f: 0x4019e020, + // Block 0xcd, offset 0x3340 + 0x3340: 0x40664020, 0x3341: 0x40664220, 0x3342: 0x40664420, 0x3343: 0x40664620, + 0x3344: 0x40664820, 0x3345: 0x40664a20, 0x3346: 0x40664c20, 0x3347: 0x40664e20, + 0x3348: 0x40665020, 0x3349: 0x40665220, 0x334a: 0x40665420, 0x334b: 0x40665620, + 0x334c: 0x40665820, 0x334d: 0x40665a20, 0x334e: 0x40665c20, 0x334f: 0x40665e20, + 0x3350: 0x40666020, 0x3351: 0x40666220, 0x3352: 0x40666420, 0x3353: 0x40666620, + 0x3354: 0x40666820, 0x3355: 0x40666a20, 0x3356: 0x40666c20, 0x3357: 0x40666e20, + 0x3358: 0x40667020, 0x3359: 0x40667220, 0x335a: 0x40667420, 0x335b: 0x40667620, + 0x335c: 0x40667820, 0x335d: 0x40667a20, 0x335e: 0x40667c20, 0x335f: 0x40667e20, + 0x3360: 0x40668020, 0x3361: 0x40668220, 0x3362: 0x40668420, 0x3363: 0x40668620, + 0x3364: 0x40668820, 0x3365: 0x40668a20, 0x3366: 0x40668c20, 0x3367: 0x40668e20, + 0x3368: 0x40669020, 0x3369: 0x40669220, 0x336a: 0x40669420, 0x336b: 0x40669620, + 0x336c: 0x40669820, 0x336d: 0x40669a20, 0x336e: 0x40669c20, 0x336f: 0x40669e20, + 0x3370: 0x4066a020, 0x3371: 0x4066a220, 0x3372: 0x4066a420, 0x3373: 0x4066a620, + 0x3374: 0x4066a820, 0x3375: 0x4066aa20, 0x3376: 0x4066ac20, 0x3377: 0x4066ae20, + 0x3378: 0x4066b020, 0x3379: 0x4066b220, 0x337a: 0x4066b420, 0x337b: 0x4066b620, + 0x337c: 0x4066b820, 0x337d: 0x4066ba20, 0x337e: 0x4066bc20, 0x337f: 0x4066be20, + // Block 0xce, offset 0x3380 + 0x3380: 0x4066c020, 0x3381: 0x4066c220, 0x3382: 0x4066c420, 0x3383: 0x4066c620, + 0x3384: 0x4066c820, 0x3385: 0x4066ca20, 0x3386: 0x4066cc20, 0x3387: 0x4066ce20, + 0x3388: 0x4066d020, 0x3389: 0x4066d220, 0x338a: 0x4066d420, 0x338b: 0x4066d620, + 0x338c: 0x4066d820, 0x338d: 0x4066da20, 0x338e: 0x4066dc20, 0x338f: 0x4066de20, + 0x3390: 0x4066e020, 0x3391: 0x4066e220, 0x3392: 0x4066e420, 0x3393: 0x4066e620, + 0x3394: 0x4066e820, 0x3395: 0x4066ea20, 0x3396: 0x4066ec20, 0x3397: 0x4066ee20, + 0x3398: 0x4066f020, 0x3399: 0x4066f220, 0x339a: 0x4066f420, 0x339b: 0x4066f620, + 0x339c: 0x4066f820, 0x339d: 0x4066fa20, 0x339e: 0x4066fc20, 0x339f: 0x4066fe20, + 0x33a0: 0x40670020, 0x33a1: 0x40670220, 0x33a2: 0x40670420, 0x33a3: 0x40670620, + 0x33a4: 0x40670820, 0x33a5: 0x40670a20, 0x33a6: 0x40670c20, 0x33a7: 0x40670e20, + 0x33a8: 0x40671020, 0x33a9: 0x40671220, 0x33aa: 0x40671420, 0x33ab: 0x40671620, + 0x33ac: 0x40671820, 0x33ad: 0x40671a20, 0x33ae: 0x40671c20, 0x33af: 0x40671e20, + 0x33b0: 0x40672020, 0x33b1: 0x40672220, 0x33b2: 0x40672420, 0x33b3: 0x40672620, + 0x33b4: 0x40672820, 0x33b5: 0x40672a20, 0x33b6: 0x40672c20, 0x33b7: 0x40672e20, + 0x33b8: 0x40673020, 0x33b9: 0x40673220, 0x33ba: 0x40673420, 0x33bb: 0x40673620, + 0x33bc: 0x40673820, 0x33bd: 0x40673a20, 0x33be: 0x40673c20, 0x33bf: 0x40673e20, + // Block 0xcf, offset 0x33c0 + 0x33c0: 0x40674020, 0x33c1: 0x40674220, 0x33c2: 0x40674420, 0x33c3: 0x40674620, + 0x33c4: 0x40674820, 0x33c5: 0x40674a20, 0x33c6: 0x40674c20, 0x33c7: 0x40674e20, + 0x33c8: 0x40675020, 0x33c9: 0x40675220, 0x33ca: 0x40675420, 0x33cb: 0x40675620, + 0x33cc: 0x40675820, 0x33cd: 0x40675a20, 0x33ce: 0x40675c20, 0x33cf: 0x40675e20, + 0x33d0: 0x40676020, 0x33d1: 0x40676220, 0x33d2: 0x40676420, 0x33d3: 0x40676620, + 0x33d4: 0x40676820, 0x33d5: 0x40676a20, 0x33d6: 0x40676c20, 0x33d7: 0x40676e20, + 0x33d8: 0x40677020, 0x33d9: 0x40677220, 0x33da: 0x40677420, 0x33db: 0x40677620, + 0x33dc: 0x40677820, 0x33dd: 0x40677a20, 0x33de: 0x40677c20, 0x33df: 0x40677e20, + 0x33e0: 0x40678020, 0x33e1: 0x40678220, 0x33e2: 0x40678420, 0x33e3: 0x40678620, + 0x33e4: 0x40678820, 0x33e5: 0x40678a20, 0x33e6: 0x40678c20, 0x33e7: 0x40678e20, + 0x33e8: 0x40679020, 0x33e9: 0x40679220, 0x33ea: 0x40679420, 0x33eb: 0x40679620, + 0x33ec: 0x40679820, 0x33ed: 0x40679a20, 0x33ee: 0x40679c20, 0x33ef: 0x40679e20, + 0x33f0: 0x4067a020, 0x33f1: 0x4067a220, 0x33f2: 0x4067a420, 0x33f3: 0x4067a620, + 0x33f4: 0x4067a820, 0x33f5: 0x4067aa20, 0x33f6: 0x4067ac20, 0x33f7: 0x4067ae20, + 0x33f8: 0x4067b020, 0x33f9: 0x4067b220, 0x33fa: 0x4067b420, 0x33fb: 0x4067b620, + 0x33fc: 0x4067b820, 0x33fd: 0x4067ba20, 0x33fe: 0x4067bc20, 0x33ff: 0x4067be20, + // Block 0xd0, offset 0x3400 + 0x3400: 0x4067c020, 0x3401: 0x4067c220, 0x3402: 0x4067c420, 0x3403: 0x4067c620, + 0x3404: 0x4067c820, 0x3405: 0x4067ca20, 0x3406: 0x4067cc20, 0x3407: 0x4067ce20, + 0x3408: 0x4067d020, 0x3409: 0x4067d220, 0x340a: 0x4067d420, 0x340b: 0x4067d620, + 0x340c: 0x4067d820, 0x340d: 0x4067da20, 0x340e: 0x4067dc20, 0x340f: 0x4067de20, + 0x3410: 0x4067e020, 0x3411: 0x4067e220, 0x3412: 0x4067e420, 0x3413: 0x4067e620, + 0x3414: 0x4067e820, 0x3415: 0x4067ea20, 0x3416: 0x4067ec20, 0x3417: 0x4067ee20, + 0x3418: 0x4067f020, 0x3419: 0x4067f220, 0x341a: 0x4067f420, 0x341b: 0x4067f620, + 0x341c: 0x4067f820, 0x341d: 0x4067fa20, 0x341e: 0x4067fc20, 0x341f: 0x4067fe20, + 0x3420: 0x40680020, 0x3421: 0x40680220, 0x3422: 0x40680420, 0x3423: 0x40680620, + 0x3424: 0x40680820, 0x3425: 0x40680a20, 0x3426: 0x40680c20, 0x3427: 0x40680e20, + 0x3428: 0x40681020, 0x3429: 0x40681220, 0x342a: 0x40681420, 0x342b: 0x40681620, + 0x342c: 0x40681820, 0x342d: 0x40681a20, 0x342e: 0x40681c20, 0x342f: 0x40681e20, + 0x3430: 0x40682020, 0x3431: 0x40682220, 0x3432: 0x40682420, 0x3433: 0x40682620, + 0x3434: 0x40682820, 0x3435: 0x40682a20, 0x3436: 0x40682c20, 0x3437: 0x40682e20, + 0x3438: 0x40683020, 0x3439: 0x40683220, 0x343a: 0x40683420, 0x343b: 0x40683620, + 0x343c: 0x40683820, 0x343d: 0x40683a20, 0x343e: 0x40683c20, 0x343f: 0x40683e20, + // Block 0xd1, offset 0x3440 + 0x3440: 0x40684020, 0x3441: 0x40684220, 0x3442: 0x40684420, 0x3443: 0x40684620, + 0x3444: 0x40684820, 0x3445: 0x40684a20, 0x3446: 0x40684c20, 0x3447: 0x40684e20, + 0x3448: 0x40685020, 0x3449: 0x40685220, 0x344a: 0x40685420, 0x344b: 0x40685620, + 0x344c: 0x40685820, 0x344d: 0x40685a20, 0x344e: 0x40685c20, 0x344f: 0x40685e20, + 0x3450: 0x40686020, 0x3451: 0x40686220, 0x3452: 0x40686420, 0x3453: 0x40686620, + 0x3454: 0x40686820, 0x3455: 0x40686a20, 0x3456: 0x40686c20, 0x3457: 0x40686e20, + 0x3458: 0x40687020, 0x3459: 0x40687220, 0x345a: 0x40687420, 0x345b: 0x40687620, + 0x345c: 0x40687820, 0x345d: 0x40687a20, 0x345e: 0x40687c20, 0x345f: 0x40687e20, + 0x3460: 0x40688020, 0x3461: 0x40688220, 0x3462: 0x40688420, 0x3463: 0x40688620, + 0x3464: 0x40688820, 0x3465: 0x40688a20, 0x3466: 0x40688c20, 0x3467: 0x40688e20, + 0x3468: 0x40689020, 0x3469: 0x40689220, 0x346a: 0x40689420, 0x346b: 0x40689620, + 0x346c: 0x40689820, 0x346d: 0x40689a20, 0x346e: 0x40689c20, 0x346f: 0x40689e20, + 0x3470: 0x4068a020, 0x3471: 0x4068a220, 0x3472: 0x4068a420, 0x3473: 0x4068a620, + 0x3474: 0x4068a820, 0x3475: 0x4068aa20, 0x3476: 0x4068ac20, 0x3477: 0x4068ae20, + 0x3478: 0x4068b020, 0x3479: 0x4068b220, 0x347a: 0x4068b420, 0x347b: 0x4068b620, + 0x347c: 0x4068b820, 0x347d: 0x4068ba20, 0x347e: 0x4068bc20, 0x347f: 0x4068be20, + // Block 0xd2, offset 0x3480 + 0x3480: 0x4068c020, 0x3481: 0x4068c220, 0x3482: 0x4068c420, 0x3483: 0x4068c620, + 0x3484: 0x4068c820, 0x3485: 0x4068ca20, 0x3486: 0x4068cc20, 0x3487: 0x4068ce20, + 0x3488: 0x4068d020, 0x3489: 0x4068d220, 0x348a: 0x4068d420, 0x348b: 0x4068d620, + 0x348c: 0x4068d820, 0x348d: 0x4068da20, 0x348e: 0x4068dc20, 0x348f: 0x4068de20, + 0x3490: 0x4068e020, 0x3491: 0x4068e220, 0x3492: 0x4068e420, 0x3493: 0x4068e620, + 0x3494: 0x4068e820, 0x3495: 0x4068ea20, 0x3496: 0x4068ec20, 0x3497: 0x4068ee20, + 0x3498: 0x4068f020, 0x3499: 0x4068f220, 0x349a: 0x4068f420, 0x349b: 0x4068f620, + 0x349c: 0x4068f820, 0x349d: 0x4068fa20, 0x349e: 0x4068fc20, 0x349f: 0x4068fe20, + 0x34a0: 0x40690020, 0x34a1: 0x40690220, 0x34a2: 0x40690420, 0x34a3: 0x40690620, + 0x34a4: 0x40690820, 0x34a5: 0x40690a20, 0x34a6: 0x40690c20, 0x34a7: 0x40690e20, + 0x34a8: 0x40691020, 0x34a9: 0x40691220, 0x34aa: 0x40691420, 0x34ab: 0x40691620, + 0x34ac: 0x40691820, 0x34ad: 0x40691a20, 0x34ae: 0x40691c20, 0x34af: 0x40691e20, + 0x34b0: 0x40692020, 0x34b1: 0x40692220, 0x34b2: 0x40692420, 0x34b3: 0x40692620, + 0x34b4: 0x40692820, 0x34b5: 0x40692a20, 0x34b6: 0x40692c20, 0x34b7: 0x40692e20, + 0x34b8: 0x40693020, 0x34b9: 0x40693220, 0x34ba: 0x40693420, 0x34bb: 0x40693620, + 0x34bc: 0x40693820, 0x34bd: 0x40693a20, 0x34be: 0x40693c20, 0x34bf: 0x40693e20, + // Block 0xd3, offset 0x34c0 + 0x34c0: 0x40694020, 0x34c1: 0x40694220, 0x34c2: 0x40694420, 0x34c3: 0x40694620, + 0x34c4: 0x40694820, 0x34c5: 0x40694a20, 0x34c6: 0x40694c20, 0x34c7: 0x40694e20, + 0x34c8: 0x40695020, 0x34c9: 0x40695220, 0x34ca: 0x40695420, 0x34cb: 0x40695620, + 0x34cc: 0x40695820, 0x34cd: 0x40695a20, 0x34ce: 0x40695c20, 0x34cf: 0x40695e20, + 0x34d0: 0x40696020, 0x34d1: 0x40696220, 0x34d2: 0x40696420, 0x34d3: 0x40696620, + 0x34d4: 0x40696820, 0x34d5: 0x40696a20, 0x34d6: 0x40696c20, 0x34d7: 0x40696e20, + 0x34d8: 0x40697020, 0x34d9: 0x40697220, 0x34da: 0x40697420, 0x34db: 0x40697620, + 0x34dc: 0x40697820, 0x34dd: 0x40697a20, 0x34de: 0x40697c20, 0x34df: 0x40697e20, + 0x34e0: 0x40698020, 0x34e1: 0x40698220, 0x34e2: 0x40698420, 0x34e3: 0x40698620, + 0x34e4: 0x40698820, 0x34e5: 0x40698a20, 0x34e6: 0x40698c20, 0x34e7: 0x40698e20, + 0x34e8: 0x40699020, 0x34e9: 0x40699220, 0x34ea: 0x40699420, 0x34eb: 0x40699620, + 0x34ec: 0x40699820, 0x34ed: 0x40699a20, 0x34ee: 0x40699c20, 0x34ef: 0x40699e20, + 0x34f0: 0x4069a020, 0x34f1: 0x4069a220, 0x34f2: 0x4069a420, 0x34f3: 0x4069a620, + 0x34f4: 0x4069a820, 0x34f5: 0x4069aa20, 0x34f6: 0x4069ac20, 0x34f7: 0x4069ae20, + 0x34f8: 0x4069b020, 0x34f9: 0x4069b220, 0x34fa: 0x4069b420, 0x34fb: 0x4069b620, + 0x34fc: 0x4069b820, 0x34fd: 0x4069ba20, 0x34fe: 0x4069bc20, 0x34ff: 0x4069be20, + // Block 0xd4, offset 0x3500 + 0x3500: 0x4069c020, 0x3501: 0x4069c220, 0x3502: 0x4069c420, 0x3503: 0x4069c620, + 0x3504: 0x4069c820, 0x3505: 0x4069ca20, 0x3506: 0x4069cc20, 0x3507: 0x4069ce20, + 0x3508: 0x4069d020, 0x3509: 0x4069d220, 0x350a: 0x4069d420, 0x350b: 0x4069d620, + 0x350c: 0x4069d820, 0x350d: 0x4069da20, 0x350e: 0x4069dc20, 0x350f: 0x4069de20, + 0x3510: 0x4069e020, 0x3511: 0x4069e220, 0x3512: 0x4069e420, 0x3513: 0x4069e620, + 0x3514: 0x4069e820, 0x3515: 0x4069ea20, 0x3516: 0x4069ec20, 0x3517: 0x4069ee20, + 0x3518: 0x4069f020, 0x3519: 0x4069f220, 0x351a: 0x4069f420, 0x351b: 0x4069f620, + 0x351c: 0x4069f820, 0x351d: 0x4069fa20, 0x351e: 0x4069fc20, 0x351f: 0x4069fe20, + 0x3520: 0x406a0020, 0x3521: 0x406a0220, 0x3522: 0x406a0420, 0x3523: 0x406a0620, + 0x3524: 0x406a0820, 0x3525: 0x406a0a20, 0x3526: 0x406a0c20, 0x3527: 0x406a0e20, + 0x3528: 0x406a1020, 0x3529: 0x406a1220, 0x352a: 0x406a1420, 0x352b: 0x406a1620, + 0x352c: 0x406a1820, 0x352d: 0x406a1a20, 0x352e: 0x406a1c20, 0x352f: 0x406a1e20, + 0x3530: 0x406a2020, 0x3531: 0x406a2220, 0x3532: 0x406a2420, 0x3533: 0x406a2620, + 0x3534: 0x406a2820, 0x3535: 0x406a2a20, 0x3536: 0x406a2c20, 0x3537: 0x406a2e20, + 0x3538: 0x406a3020, 0x3539: 0x406a3220, 0x353a: 0x406a3420, 0x353b: 0x406a3620, + 0x353c: 0x406a3820, 0x353d: 0x406a3a20, 0x353e: 0x406a3c20, 0x353f: 0x406a3e20, + // Block 0xd5, offset 0x3540 + 0x3540: 0x406a4020, 0x3541: 0x406a4220, 0x3542: 0x406a4420, 0x3543: 0x406a4620, + 0x3544: 0x406a4820, 0x3545: 0x406a4a20, 0x3546: 0x406a4c20, 0x3547: 0x406a4e20, + 0x3548: 0x406a5020, 0x3549: 0x406a5220, 0x354a: 0x406a5420, 0x354b: 0x406a5620, + 0x354c: 0x406a5820, 0x354d: 0x406a5a20, 0x354e: 0x406a5c20, 0x354f: 0x406a5e20, + 0x3550: 0x406a6020, 0x3551: 0x406a6220, 0x3552: 0x406a6420, 0x3553: 0x406a6620, + 0x3554: 0x406a6820, 0x3555: 0x406a6a20, 0x3556: 0x406a6c20, 0x3557: 0x406a6e20, + 0x3558: 0x406a7020, 0x3559: 0x406a7220, 0x355a: 0x406a7420, 0x355b: 0x406a7620, + 0x355c: 0x406a7820, 0x355d: 0x406a7a20, 0x355e: 0x406a7c20, 0x355f: 0x406a7e20, + 0x3560: 0x406a8020, 0x3561: 0x406a8220, 0x3562: 0x406a8420, 0x3563: 0x406a8620, + 0x3564: 0x406a8820, 0x3565: 0x406a8a20, 0x3566: 0x406a8c20, 0x3567: 0x406a8e20, + 0x3568: 0x406a9020, 0x3569: 0x406a9220, 0x356a: 0x406a9420, 0x356b: 0x406a9620, + 0x356c: 0x406a9820, 0x356d: 0x406a9a20, 0x356e: 0x406a9c20, 0x356f: 0x406a9e20, + 0x3570: 0x406aa020, 0x3571: 0x406aa220, 0x3572: 0x406aa420, 0x3573: 0x406aa620, + 0x3574: 0x406aa820, 0x3575: 0x406aaa20, 0x3576: 0x406aac20, 0x3577: 0x406aae20, + 0x3578: 0x406ab020, 0x3579: 0x406ab220, 0x357a: 0x406ab420, 0x357b: 0x406ab620, + 0x357c: 0x406ab820, 0x357d: 0x406aba20, 0x357e: 0x406abc20, 0x357f: 0x406abe20, + // Block 0xd6, offset 0x3580 + 0x3580: 0x406ac020, 0x3581: 0x406ac220, 0x3582: 0x406ac420, 0x3583: 0x406ac620, + 0x3584: 0x406ac820, 0x3585: 0x406aca20, 0x3586: 0x406acc20, 0x3587: 0x406ace20, + 0x3588: 0x406ad020, 0x3589: 0x406ad220, 0x358a: 0x406ad420, 0x358b: 0x406ad620, + 0x358c: 0x406ad820, 0x358d: 0x406ada20, 0x358e: 0x406adc20, 0x358f: 0x406ade20, + 0x3590: 0x406ae020, 0x3591: 0x406ae220, 0x3592: 0x406ae420, 0x3593: 0x406ae620, + 0x3594: 0x406ae820, 0x3595: 0x406aea20, 0x3596: 0x406aec20, 0x3597: 0x406aee20, + 0x3598: 0x406af020, 0x3599: 0x406af220, 0x359a: 0x406af420, 0x359b: 0x406af620, + 0x359c: 0x406af820, 0x359d: 0x406afa20, 0x359e: 0x406afc20, 0x359f: 0x406afe20, + 0x35a0: 0x406b0020, 0x35a1: 0x406b0220, 0x35a2: 0x406b0420, 0x35a3: 0x406b0620, + 0x35a4: 0x406b0820, 0x35a5: 0x406b0a20, 0x35a6: 0x406b0c20, 0x35a7: 0x406b0e20, + 0x35a8: 0x406b1020, 0x35a9: 0x406b1220, 0x35aa: 0x406b1420, 0x35ab: 0x406b1620, + 0x35ac: 0x406b1820, 0x35ad: 0x406b1a20, 0x35ae: 0x406b1c20, 0x35af: 0x406b1e20, + 0x35b0: 0x406b2020, 0x35b1: 0x406b2220, 0x35b2: 0x406b2420, 0x35b3: 0x406b2620, + 0x35b4: 0x406b2820, 0x35b5: 0x406b2a20, 0x35b6: 0x406b2c20, 0x35b7: 0x406b2e20, + 0x35b8: 0x406b3020, 0x35b9: 0x406b3220, 0x35ba: 0x406b3420, 0x35bb: 0x406b3620, + 0x35bc: 0x406b3820, 0x35bd: 0x406b3a20, 0x35be: 0x406b3c20, 0x35bf: 0x406b3e20, + // Block 0xd7, offset 0x35c0 + 0x35c0: 0x406b4020, 0x35c1: 0x406b4220, 0x35c2: 0x406b4420, 0x35c3: 0x406b4620, + 0x35c4: 0x406b4820, 0x35c5: 0x406b4a20, 0x35c6: 0x406b4c20, 0x35c7: 0x406b4e20, + 0x35c8: 0x406b5020, 0x35c9: 0x406b5220, 0x35ca: 0x406b5420, 0x35cb: 0x406b5620, + 0x35cc: 0x406b5820, 0x35cd: 0x406b5a20, 0x35ce: 0x406b5c20, 0x35cf: 0x406b5e20, + 0x35d0: 0x406b6020, 0x35d1: 0x406b6220, 0x35d2: 0x406b6420, 0x35d3: 0x406b6620, + 0x35d4: 0x406b6820, 0x35d5: 0x406b6a20, 0x35d6: 0x406b6c20, 0x35d7: 0x406b6e20, + 0x35d8: 0x406b7020, 0x35d9: 0x406b7220, 0x35da: 0x406b7420, 0x35db: 0x406b7620, + 0x35dc: 0x406b7820, 0x35dd: 0x406b7a20, 0x35de: 0x406b7c20, 0x35df: 0x406b7e20, + 0x35e0: 0x406b8020, 0x35e1: 0x406b8220, 0x35e2: 0x406b8420, 0x35e3: 0x406b8620, + 0x35e4: 0x406b8820, 0x35e5: 0x406b8a20, 0x35e6: 0x406b8c20, 0x35e7: 0x406b8e20, + 0x35e8: 0x406b9020, 0x35e9: 0x406b9220, 0x35ea: 0x406b9420, 0x35eb: 0x406b9620, + 0x35ec: 0x406b9820, 0x35ed: 0x406b9a20, 0x35ee: 0x406b9c20, 0x35ef: 0x406b9e20, + 0x35f0: 0x406ba020, 0x35f1: 0x406ba220, 0x35f2: 0x406ba420, 0x35f3: 0x406ba620, + 0x35f4: 0x406ba820, 0x35f5: 0x406baa20, 0x35f6: 0x406bac20, 0x35f7: 0x406bae20, + 0x35f8: 0x406bb020, 0x35f9: 0x406bb220, 0x35fa: 0x406bb420, 0x35fb: 0x406bb620, + 0x35fc: 0x406bb820, 0x35fd: 0x406bba20, 0x35fe: 0x406bbc20, 0x35ff: 0x406bbe20, + // Block 0xd8, offset 0x3600 + 0x3600: 0x406bc020, 0x3601: 0x406bc220, 0x3602: 0x406bc420, 0x3603: 0x406bc620, + 0x3604: 0x406bc820, 0x3605: 0x406bca20, 0x3606: 0x406bcc20, 0x3607: 0x406bce20, + 0x3608: 0x406bd020, 0x3609: 0x406bd220, 0x360a: 0x406bd420, 0x360b: 0x406bd620, + 0x360c: 0x406bd820, 0x360d: 0x406bda20, 0x360e: 0x406bdc20, 0x360f: 0x406bde20, + 0x3610: 0x406be020, 0x3611: 0x406be220, 0x3612: 0x406be420, 0x3613: 0x406be620, + 0x3614: 0x406be820, 0x3615: 0x406bea20, 0x3616: 0x406bec20, 0x3617: 0x406bee20, + 0x3618: 0x406bf020, 0x3619: 0x406bf220, 0x361a: 0x406bf420, 0x361b: 0x406bf620, + 0x361c: 0x406bf820, 0x361d: 0x406bfa20, 0x361e: 0x406bfc20, 0x361f: 0x406bfe20, + 0x3620: 0x406c0020, 0x3621: 0x406c0220, 0x3622: 0x406c0420, 0x3623: 0x406c0620, + 0x3624: 0x406c0820, 0x3625: 0x406c0a20, 0x3626: 0x406c0c20, 0x3627: 0x406c0e20, + 0x3628: 0x406c1020, 0x3629: 0x406c1220, 0x362a: 0x406c1420, 0x362b: 0x406c1620, + 0x362c: 0x406c1820, 0x362d: 0x406c1a20, 0x362e: 0x406c1c20, 0x362f: 0x406c1e20, + 0x3630: 0x406c2020, 0x3631: 0x406c2220, 0x3632: 0x406c2420, 0x3633: 0x406c2620, + 0x3634: 0x406c2820, 0x3635: 0x406c2a20, 0x3636: 0x406c2c20, 0x3637: 0x406c2e20, + 0x3638: 0x406c3020, 0x3639: 0x406c3220, 0x363a: 0x406c3420, 0x363b: 0x406c3620, + 0x363c: 0x406c3820, 0x363d: 0x406c3a20, 0x363e: 0x406c3c20, 0x363f: 0x406c3e20, + // Block 0xd9, offset 0x3640 + 0x3640: 0x406c4020, 0x3641: 0x406c4220, 0x3642: 0x406c4420, 0x3643: 0x406c4620, + 0x3644: 0x406c4820, 0x3645: 0x406c4a20, 0x3646: 0x406c4c20, 0x3647: 0x406c4e20, + 0x3648: 0x406c5020, 0x3649: 0x406c5220, 0x364a: 0x406c5420, 0x364b: 0x406c5620, + 0x364c: 0x406c5820, 0x364d: 0x406c5a20, 0x364e: 0x406c5c20, 0x364f: 0x406c5e20, + 0x3650: 0x406c6020, 0x3651: 0x406c6220, 0x3652: 0x406c6420, 0x3653: 0x406c6620, + 0x3654: 0x406c6820, 0x3655: 0x406c6a20, 0x3656: 0x406c6c20, 0x3657: 0x406c6e20, + 0x3658: 0x406c7020, 0x3659: 0x406c7220, 0x365a: 0x406c7420, 0x365b: 0x406c7620, + 0x365c: 0x406c7820, 0x365d: 0x406c7a20, 0x365e: 0x406c7c20, 0x365f: 0x406c7e20, + 0x3660: 0x406c8020, 0x3661: 0x406c8220, 0x3662: 0x406c8420, 0x3663: 0x406c8620, + 0x3664: 0x406c8820, 0x3665: 0x406c8a20, 0x3666: 0x406c8c20, 0x3667: 0x406c8e20, + 0x3668: 0x406c9020, 0x3669: 0x406c9220, 0x366a: 0x406c9420, 0x366b: 0x406c9620, + 0x366c: 0x406c9820, 0x366d: 0x406c9a20, 0x366e: 0x406c9c20, 0x366f: 0x406c9e20, + 0x3670: 0x406ca020, 0x3671: 0x406ca220, 0x3672: 0x406ca420, 0x3673: 0x406ca620, + 0x3674: 0x406ca820, 0x3675: 0x406caa20, 0x3676: 0x406cac20, 0x3677: 0x406cae20, + 0x3678: 0x406cb020, 0x3679: 0x406cb220, 0x367a: 0x406cb420, 0x367b: 0x406cb620, + 0x367c: 0x406cb820, 0x367d: 0x406cba20, 0x367e: 0x406cbc20, 0x367f: 0x406cbe20, + // Block 0xda, offset 0x3680 + 0x3680: 0x406cc020, 0x3681: 0x406cc220, 0x3682: 0x406cc420, 0x3683: 0x406cc620, + 0x3684: 0x406cc820, 0x3685: 0x406cca20, 0x3686: 0x406ccc20, 0x3687: 0x406cce20, + 0x3688: 0x406cd020, 0x3689: 0x406cd220, 0x368a: 0x406cd420, 0x368b: 0x406cd620, + 0x368c: 0x406cd820, 0x368d: 0x406cda20, 0x368e: 0x406cdc20, 0x368f: 0x406cde20, + 0x3690: 0x406ce020, 0x3691: 0x406ce220, 0x3692: 0x406ce420, 0x3693: 0x406ce620, + 0x3694: 0x406ce820, 0x3695: 0x406cea20, 0x3696: 0x406cec20, 0x3697: 0x406cee20, + 0x3698: 0x406cf020, 0x3699: 0x406cf220, 0x369a: 0x406cf420, 0x369b: 0x406cf620, + 0x369c: 0x406cf820, 0x369d: 0x406cfa20, 0x369e: 0x406cfc20, 0x369f: 0x406cfe20, + 0x36a0: 0x406d0020, 0x36a1: 0x406d0220, 0x36a2: 0x406d0420, 0x36a3: 0x406d0620, + 0x36a4: 0x406d0820, 0x36a5: 0x406d0a20, 0x36a6: 0x406d0c20, 0x36a7: 0x406d0e20, + 0x36a8: 0x406d1020, 0x36a9: 0x406d1220, 0x36aa: 0x406d1420, 0x36ab: 0x406d1620, + 0x36ac: 0x406d1820, 0x36ad: 0x406d1a20, 0x36ae: 0x406d1c20, 0x36af: 0x406d1e20, + 0x36b0: 0x406d2020, 0x36b1: 0x406d2220, 0x36b2: 0x406d2420, 0x36b3: 0x406d2620, + 0x36b4: 0x406d2820, 0x36b5: 0x406d2a20, 0x36b6: 0x406d2c20, 0x36b7: 0x406d2e20, + 0x36b8: 0x406d3020, 0x36b9: 0x406d3220, 0x36ba: 0x406d3420, 0x36bb: 0x406d3620, + 0x36bc: 0x406d3820, 0x36bd: 0x406d3a20, 0x36be: 0x406d3c20, 0x36bf: 0x406d3e20, + // Block 0xdb, offset 0x36c0 + 0x36c0: 0x406d4020, 0x36c1: 0x406d4220, 0x36c2: 0x406d4420, 0x36c3: 0x406d4620, + 0x36c4: 0x406d4820, 0x36c5: 0x406d4a20, 0x36c6: 0x406d4c20, 0x36c7: 0x406d4e20, + 0x36c8: 0x406d5020, 0x36c9: 0x406d5220, 0x36ca: 0x406d5420, 0x36cb: 0x406d5620, + 0x36cc: 0x406d5820, 0x36cd: 0x406d5a20, 0x36ce: 0x406d5c20, 0x36cf: 0x406d5e20, + 0x36d0: 0x406d6020, 0x36d1: 0x406d6220, 0x36d2: 0x406d6420, 0x36d3: 0x406d6620, + 0x36d4: 0x406d6820, 0x36d5: 0x406d6a20, 0x36d6: 0x406d6c20, 0x36d7: 0x406d6e20, + 0x36d8: 0x406d7020, 0x36d9: 0x406d7220, 0x36da: 0x406d7420, 0x36db: 0x406d7620, + 0x36dc: 0x406d7820, 0x36dd: 0x406d7a20, 0x36de: 0x406d7c20, 0x36df: 0x406d7e20, + 0x36e0: 0x406d8020, 0x36e1: 0x406d8220, 0x36e2: 0x406d8420, 0x36e3: 0x406d8620, + 0x36e4: 0x406d8820, 0x36e5: 0x406d8a20, 0x36e6: 0x406d8c20, 0x36e7: 0x406d8e20, + 0x36e8: 0x406d9020, 0x36e9: 0x406d9220, 0x36ea: 0x406d9420, 0x36eb: 0x406d9620, + 0x36ec: 0x406d9820, 0x36ed: 0x406d9a20, 0x36ee: 0x406d9c20, 0x36ef: 0x406d9e20, + 0x36f0: 0x406da020, 0x36f1: 0x406da220, 0x36f2: 0x406da420, 0x36f3: 0x406da620, + 0x36f4: 0x406da820, 0x36f5: 0x406daa20, 0x36f6: 0x406dac20, 0x36f7: 0x406dae20, + 0x36f8: 0x406db020, 0x36f9: 0x406db220, 0x36fa: 0x406db420, 0x36fb: 0x406db620, + 0x36fc: 0x406db820, 0x36fd: 0x406dba20, 0x36fe: 0x406dbc20, 0x36ff: 0x406dbe20, + // Block 0xdc, offset 0x3700 + 0x3700: 0x406dc020, 0x3701: 0x406dc220, 0x3702: 0x406dc420, 0x3703: 0x406dc620, + 0x3704: 0x406dc820, 0x3705: 0x406dca20, 0x3706: 0x406dcc20, 0x3707: 0x406dce20, + 0x3708: 0x406dd020, 0x3709: 0x406dd220, 0x370a: 0x406dd420, 0x370b: 0x406dd620, + 0x370c: 0x406dd820, 0x370d: 0x406dda20, 0x370e: 0x406ddc20, 0x370f: 0x406dde20, + 0x3710: 0x406de020, 0x3711: 0x406de220, 0x3712: 0x406de420, 0x3713: 0x406de620, + 0x3714: 0x406de820, 0x3715: 0x406dea20, 0x3716: 0x406dec20, 0x3717: 0x406dee20, + 0x3718: 0x406df020, 0x3719: 0x406df220, 0x371a: 0x406df420, 0x371b: 0x406df620, + 0x371c: 0x406df820, 0x371d: 0x406dfa20, 0x371e: 0x406dfc20, 0x371f: 0x406dfe20, + 0x3720: 0x406e0020, 0x3721: 0x406e0220, 0x3722: 0x406e0420, 0x3723: 0x406e0620, + 0x3724: 0x406e0820, 0x3725: 0x406e0a20, 0x3726: 0x406e0c20, 0x3727: 0x406e0e20, + 0x3728: 0x406e1020, 0x3729: 0x406e1220, 0x372a: 0x406e1420, 0x372b: 0x406e1620, + 0x372c: 0x406e1820, 0x372d: 0x406e1a20, 0x372e: 0x406e1c20, 0x372f: 0x406e1e20, + 0x3730: 0x406e2020, 0x3731: 0x406e2220, 0x3732: 0x406e2420, 0x3733: 0x406e2620, + 0x3734: 0x406e2820, 0x3735: 0x406e2a20, 0x3736: 0x406e2c20, 0x3737: 0x406e2e20, + 0x3738: 0x406e3020, 0x3739: 0x406e3220, 0x373a: 0x406e3420, 0x373b: 0x406e3620, + 0x373c: 0x406e3820, 0x373d: 0x406e3a20, 0x373e: 0x406e3c20, 0x373f: 0x406e3e20, + // Block 0xdd, offset 0x3740 + 0x3740: 0x406e4020, 0x3741: 0x406e4220, 0x3742: 0x406e4420, 0x3743: 0x406e4620, + 0x3744: 0x406e4820, 0x3745: 0x406e4a20, 0x3746: 0x406e4c20, 0x3747: 0x406e4e20, + 0x3748: 0x406e5020, 0x3749: 0x406e5220, 0x374a: 0x406e5420, 0x374b: 0x406e5620, + 0x374c: 0x406e5820, 0x374d: 0x406e5a20, 0x374e: 0x406e5c20, 0x374f: 0x406e5e20, + 0x3750: 0x406e6020, 0x3751: 0x406e6220, 0x3752: 0x406e6420, 0x3753: 0x406e6620, + 0x3754: 0x406e6820, 0x3755: 0x406e6a20, 0x3756: 0x406e6c20, 0x3757: 0x406e6e20, + 0x3758: 0x406e7020, 0x3759: 0x406e7220, 0x375a: 0x406e7420, 0x375b: 0x406e7620, + 0x375c: 0x406e7820, 0x375d: 0x406e7a20, 0x375e: 0x406e7c20, 0x375f: 0x406e7e20, + 0x3760: 0x406e8020, 0x3761: 0x406e8220, 0x3762: 0x406e8420, 0x3763: 0x406e8620, + 0x3764: 0x406e8820, 0x3765: 0x406e8a20, 0x3766: 0x406e8c20, 0x3767: 0x406e8e20, + 0x3768: 0x406e9020, 0x3769: 0x406e9220, 0x376a: 0x406e9420, 0x376b: 0x406e9620, + 0x376c: 0x406e9820, 0x376d: 0x406e9a20, 0x376e: 0x406e9c20, 0x376f: 0x406e9e20, + 0x3770: 0x406ea020, 0x3771: 0x406ea220, 0x3772: 0x406ea420, 0x3773: 0x406ea620, + 0x3774: 0x406ea820, 0x3775: 0x406eaa20, 0x3776: 0x406eac20, 0x3777: 0x406eae20, + 0x3778: 0x406eb020, 0x3779: 0x406eb220, 0x377a: 0x406eb420, 0x377b: 0x406eb620, + 0x377c: 0x406eb820, 0x377d: 0x406eba20, 0x377e: 0x406ebc20, 0x377f: 0x406ebe20, + // Block 0xde, offset 0x3780 + 0x3780: 0x406ec020, 0x3781: 0x406ec220, 0x3782: 0x406ec420, 0x3783: 0x406ec620, + 0x3784: 0x406ec820, 0x3785: 0x406eca20, 0x3786: 0x406ecc20, 0x3787: 0x406ece20, + 0x3788: 0x406ed020, 0x3789: 0x406ed220, 0x378a: 0x406ed420, 0x378b: 0x406ed620, + 0x378c: 0x406ed820, 0x378d: 0x406eda20, 0x378e: 0x406edc20, 0x378f: 0x406ede20, + 0x3790: 0x406ee020, 0x3791: 0x406ee220, 0x3792: 0x406ee420, 0x3793: 0x406ee620, + 0x3794: 0x406ee820, 0x3795: 0x406eea20, 0x3796: 0x406eec20, 0x3797: 0x406eee20, + 0x3798: 0x406ef020, 0x3799: 0x406ef220, 0x379a: 0x406ef420, 0x379b: 0x406ef620, + 0x379c: 0x406ef820, 0x379d: 0x406efa20, 0x379e: 0x406efc20, 0x379f: 0x406efe20, + 0x37a0: 0x406f0020, 0x37a1: 0x406f0220, 0x37a2: 0x406f0420, 0x37a3: 0x406f0620, + 0x37a4: 0x406f0820, 0x37a5: 0x406f0a20, 0x37a6: 0x406f0c20, 0x37a7: 0x406f0e20, + 0x37a8: 0x406f1020, 0x37a9: 0x406f1220, 0x37aa: 0x406f1420, 0x37ab: 0x406f1620, + 0x37ac: 0x406f1820, 0x37ad: 0x406f1a20, 0x37ae: 0x406f1c20, 0x37af: 0x406f1e20, + 0x37b0: 0x406f2020, 0x37b1: 0x406f2220, 0x37b2: 0x406f2420, 0x37b3: 0x406f2620, + 0x37b4: 0x406f2820, 0x37b5: 0x406f2a20, 0x37b6: 0x406f2c20, 0x37b7: 0x406f2e20, + 0x37b8: 0x406f3020, 0x37b9: 0x406f3220, 0x37ba: 0x406f3420, 0x37bb: 0x406f3620, + 0x37bc: 0x406f3820, 0x37bd: 0x406f3a20, 0x37be: 0x406f3c20, 0x37bf: 0x406f3e20, + // Block 0xdf, offset 0x37c0 + 0x37c0: 0x406f4020, 0x37c1: 0x406f4220, 0x37c2: 0x406f4420, 0x37c3: 0x406f4620, + 0x37c4: 0x406f4820, 0x37c5: 0x406f4a20, 0x37c6: 0x406f4c20, 0x37c7: 0x406f4e20, + 0x37c8: 0x406f5020, 0x37c9: 0x406f5220, 0x37ca: 0x406f5420, 0x37cb: 0x406f5620, + 0x37cc: 0x406f5820, + 0x37d0: 0x401a9020, 0x37d1: 0x401a9220, 0x37d2: 0x401a9420, 0x37d3: 0x401a9620, + 0x37d4: 0x401a9820, 0x37d5: 0x401a9a20, 0x37d6: 0x401a9c20, 0x37d7: 0x401a9e20, + 0x37d8: 0x401aa020, 0x37d9: 0x401aa220, 0x37da: 0x401aa420, 0x37db: 0x401aa620, + 0x37dc: 0x401aa820, 0x37dd: 0x401aaa20, 0x37de: 0x401aac20, 0x37df: 0x401aae20, + 0x37e0: 0x401ab020, 0x37e1: 0x401ab220, 0x37e2: 0x401ab420, 0x37e3: 0x401ab620, + 0x37e4: 0x401ab820, 0x37e5: 0x401aba20, 0x37e6: 0x401abc20, 0x37e7: 0x401abe20, + 0x37e8: 0x401ac020, 0x37e9: 0x401ac220, 0x37ea: 0x401ac420, 0x37eb: 0x401ac620, + 0x37ec: 0x401ac820, 0x37ed: 0x401aca20, 0x37ee: 0x401acc20, 0x37ef: 0x401ace20, + 0x37f0: 0x401ad020, 0x37f1: 0x401ad220, 0x37f2: 0x401ad420, 0x37f3: 0x401ad620, + 0x37f4: 0x401ad820, 0x37f5: 0x401ada20, 0x37f6: 0x401adc20, 0x37f7: 0x401ade20, + 0x37f8: 0x401ae020, 0x37f9: 0x401ae220, 0x37fa: 0x401ae420, 0x37fb: 0x401ae620, + 0x37fc: 0x401ae820, 0x37fd: 0x401aea20, 0x37fe: 0x401aec20, 0x37ff: 0x401aee20, + // Block 0xe0, offset 0x3800 + 0x3800: 0x401af020, 0x3801: 0x401af220, 0x3802: 0x401af420, 0x3803: 0x401af620, + 0x3804: 0x401af820, 0x3805: 0x401afa20, 0x3806: 0x401afc20, + 0x3810: 0x406f6620, 0x3811: 0x406f6820, 0x3812: 0x406f6a20, 0x3813: 0x406f6c20, + 0x3814: 0x406f6e20, 0x3815: 0x406f7020, 0x3816: 0x406f7220, 0x3817: 0x406f7420, + 0x3818: 0x406f7620, 0x3819: 0x406f7820, 0x381a: 0x406f7a20, 0x381b: 0x406f7c20, + 0x381c: 0x406f7e20, 0x381d: 0x406f8020, 0x381e: 0x406f8220, 0x381f: 0x406f8420, + 0x3820: 0x406f8620, 0x3821: 0x406f8820, 0x3822: 0x406f8a20, 0x3823: 0x406f8c20, + 0x3824: 0x406f8e20, 0x3825: 0x406f9020, 0x3826: 0x406f9220, 0x3827: 0x406f9420, + 0x3828: 0x406f9620, 0x3829: 0x406f9820, 0x382a: 0x406f9e20, 0x382b: 0x406f9a20, + 0x382c: 0x406fa020, 0x382d: 0x406f9c20, 0x382e: 0x406fa220, 0x382f: 0x406fa420, + 0x3830: 0x406fa620, 0x3831: 0x406fa820, 0x3832: 0x406faa20, 0x3833: 0x406fac20, + 0x3834: 0x406fae20, 0x3835: 0x406fb020, 0x3836: 0x406fb220, 0x3837: 0x406fb420, + 0x3838: 0x406f5a20, 0x3839: 0x406f5c20, 0x383a: 0x406f5e20, 0x383b: 0x406f6020, + 0x383c: 0x406f6420, 0x383d: 0x406f6220, 0x383e: 0x40025620, 0x383f: 0x4002fe20, + // Block 0xe1, offset 0x3840 + 0x3840: 0x405b8020, 0x3841: 0x405b8220, 0x3842: 0x405b8420, 0x3843: 0x405b8620, + 0x3844: 0x405b8820, 0x3845: 0x405b8a20, 0x3846: 0x405b8c20, 0x3847: 0x405b8e20, + 0x3848: 0x405b9020, 0x3849: 0x405b9220, 0x384a: 0x405b9420, 0x384b: 0x405b9620, + 0x384c: 0x405b9820, 0x384d: 0x405b9a20, 0x384e: 0x405b9c20, 0x384f: 0x405b9e20, + 0x3850: 0x405ba020, 0x3851: 0x405ba220, 0x3852: 0x405ba420, 0x3853: 0x405ba620, + 0x3854: 0x405ba820, 0x3855: 0x405baa20, 0x3856: 0x405bac20, 0x3857: 0x405bae20, + 0x3858: 0x405bb020, 0x3859: 0x405bb220, 0x385a: 0x405bb420, 0x385b: 0x405bb620, + 0x385c: 0x405bb820, 0x385d: 0x405bba20, 0x385e: 0x405bbc20, 0x385f: 0x405bbe20, + 0x3860: 0x405bc020, 0x3861: 0x405bc220, 0x3862: 0x405bc420, 0x3863: 0x405bc620, + 0x3864: 0x405bc820, 0x3865: 0x405bca20, 0x3866: 0x405bcc20, 0x3867: 0x405bce20, + 0x3868: 0x405bd020, 0x3869: 0x405bd220, 0x386a: 0x405bd420, 0x386b: 0x405bd620, + 0x386c: 0x405bd820, 0x386d: 0x405bda20, 0x386e: 0x405bdc20, 0x386f: 0x405bde20, + 0x3870: 0x405be020, 0x3871: 0x405be220, 0x3872: 0x405be420, 0x3873: 0x405be620, + 0x3874: 0x405be820, 0x3875: 0x405bea20, 0x3876: 0x405bec20, 0x3877: 0x405bee20, + 0x3878: 0x405bf020, 0x3879: 0x405bf220, 0x387a: 0x405bf420, 0x387b: 0x405bf620, + 0x387c: 0x405bf820, 0x387d: 0x405bfa20, 0x387e: 0x405bfc20, 0x387f: 0x405bfe20, + // Block 0xe2, offset 0x3880 + 0x3880: 0x405c0020, 0x3881: 0x405c0220, 0x3882: 0x405c0420, 0x3883: 0x405c0620, + 0x3884: 0x405c0820, 0x3885: 0x405c0a20, 0x3886: 0x405c0c20, 0x3887: 0x405c0e20, + 0x3888: 0x405c1020, 0x3889: 0x405c1220, 0x388a: 0x405c1420, 0x388b: 0x405c1620, + 0x388c: 0x405c1820, 0x388d: 0x405c1a20, 0x388e: 0x405c1c20, 0x388f: 0x405c1e20, + 0x3890: 0x405c2020, 0x3891: 0x405c2220, 0x3892: 0x405c2420, 0x3893: 0x405c2620, + 0x3894: 0x405c2820, 0x3895: 0x405c2a20, 0x3896: 0x405c2c20, 0x3897: 0x405c2e20, + 0x3898: 0x405c3020, 0x3899: 0x405c3220, 0x389a: 0x405c3420, 0x389b: 0x405c3620, + 0x389c: 0x405c3820, 0x389d: 0x405c3a20, 0x389e: 0x405c3c20, 0x389f: 0x405c3e20, + 0x38a0: 0x405c4020, 0x38a1: 0x405c4220, 0x38a2: 0x405c4420, 0x38a3: 0x405c4620, + 0x38a4: 0x405c4820, 0x38a5: 0x405c4a20, 0x38a6: 0x405c4c20, 0x38a7: 0x405c4e20, + 0x38a8: 0x405c5020, 0x38a9: 0x405c5220, 0x38aa: 0x405c5420, 0x38ab: 0x405c5620, + 0x38ac: 0x405c5820, 0x38ad: 0x405c5a20, 0x38ae: 0x405c5c20, 0x38af: 0x405c5e20, + 0x38b0: 0x405c6020, 0x38b1: 0x405c6220, 0x38b2: 0x405c6420, 0x38b3: 0x405c6620, + 0x38b4: 0x405c6820, 0x38b5: 0x405c6a20, 0x38b6: 0x405c6c20, 0x38b7: 0x405c6e20, + 0x38b8: 0x405c7020, 0x38b9: 0x405c7220, 0x38ba: 0x405c7420, 0x38bb: 0x405c7620, + 0x38bc: 0x405c7820, 0x38bd: 0x405c7a20, 0x38be: 0x405c7c20, 0x38bf: 0x405c7e20, + // Block 0xe3, offset 0x38c0 + 0x38c0: 0x405c8020, 0x38c1: 0x405c8220, 0x38c2: 0x405c8420, 0x38c3: 0x405c8620, + 0x38c4: 0x405c8820, 0x38c5: 0x405c8a20, 0x38c6: 0x405c8c20, 0x38c7: 0x405c8e20, + 0x38c8: 0x405c9020, 0x38c9: 0x405c9220, 0x38ca: 0x405c9420, 0x38cb: 0x405c9620, + 0x38cc: 0x405c9820, 0x38cd: 0x405c9a20, 0x38ce: 0x405c9c20, 0x38cf: 0x405c9e20, + 0x38d0: 0x405ca020, 0x38d1: 0x405ca220, 0x38d2: 0x405ca420, 0x38d3: 0x405ca620, + 0x38d4: 0x405ca820, 0x38d5: 0x405caa20, 0x38d6: 0x405cac20, 0x38d7: 0x405cae20, + 0x38d8: 0x405cb020, 0x38d9: 0x405cb220, 0x38da: 0x405cb420, 0x38db: 0x405cb620, + 0x38dc: 0x405cb820, 0x38dd: 0x405cba20, 0x38de: 0x405cbc20, 0x38df: 0x405cbe20, + 0x38e0: 0x405cc020, 0x38e1: 0x405cc220, 0x38e2: 0x405cc420, 0x38e3: 0x405cc620, + 0x38e4: 0x405cc820, 0x38e5: 0x405cca20, 0x38e6: 0x405ccc20, 0x38e7: 0x405cce20, + 0x38e8: 0x405cd020, 0x38e9: 0x405cd220, 0x38ea: 0x405cd420, 0x38eb: 0x405cd620, + 0x38ec: 0x405cd820, 0x38ed: 0x405cda20, 0x38ee: 0x405cdc20, 0x38ef: 0x405cde20, + 0x38f0: 0x405ce020, 0x38f1: 0x405ce220, 0x38f2: 0x405ce420, 0x38f3: 0x405ce620, + 0x38f4: 0x405ce820, 0x38f5: 0x405cea20, 0x38f6: 0x405cec20, 0x38f7: 0x405cee20, + 0x38f8: 0x405cf020, 0x38f9: 0x405cf220, 0x38fa: 0x405cf420, 0x38fb: 0x405cf620, + 0x38fc: 0x405cf820, 0x38fd: 0x405cfa20, 0x38fe: 0x405cfc20, 0x38ff: 0x405cfe20, + // Block 0xe4, offset 0x3900 + 0x3900: 0x405d0020, 0x3901: 0x405d0220, 0x3902: 0x405d0420, 0x3903: 0x405d0620, + 0x3904: 0x405d0820, 0x3905: 0x405d0a20, 0x3906: 0x405d0c20, 0x3907: 0x405d0e20, + 0x3908: 0x405d1020, 0x3909: 0x405d1220, 0x390a: 0x405d1420, 0x390b: 0x405d1620, + 0x390c: 0x405d1820, 0x390d: 0x405d1a20, 0x390e: 0x405d1c20, 0x390f: 0x405d1e20, + 0x3910: 0x405d2020, 0x3911: 0x405d2220, 0x3912: 0x405d2420, 0x3913: 0x405d2620, + 0x3914: 0x405d2820, 0x3915: 0x405d2a20, 0x3916: 0x405d2c20, 0x3917: 0x405d2e20, + 0x3918: 0x405d3020, 0x3919: 0x405d3220, 0x391a: 0x405d3420, 0x391b: 0x405d3620, + 0x391c: 0x405d3820, 0x391d: 0x405d3a20, 0x391e: 0x405d3c20, 0x391f: 0x405d3e20, + 0x3920: 0x405d4020, 0x3921: 0x405d4220, 0x3922: 0x405d4420, 0x3923: 0x405d4620, + 0x3924: 0x405d4820, 0x3925: 0x405d4a20, 0x3926: 0x405d4c20, 0x3927: 0x405d4e20, + 0x3928: 0x405d5020, 0x3929: 0x405d5220, 0x392a: 0x405d5420, 0x392b: 0x405d5620, + 0x392c: 0x405d5820, 0x392d: 0x405d5a20, 0x392e: 0x405d5c20, 0x392f: 0x405d5e20, + 0x3930: 0x405d6020, 0x3931: 0x405d6220, 0x3932: 0x405d6420, 0x3933: 0x405d6620, + 0x3934: 0x405d6820, 0x3935: 0x405d6a20, 0x3936: 0x405d6c20, 0x3937: 0x405d6e20, + 0x3938: 0x405d7020, 0x3939: 0x405d7220, 0x393a: 0x405d7420, 0x393b: 0x405d7620, + 0x393c: 0x405d7820, 0x393d: 0x405d7a20, 0x393e: 0x405d7c20, 0x393f: 0x405d7e20, + // Block 0xe5, offset 0x3940 + 0x3940: 0x405d8020, 0x3941: 0x405d8220, 0x3942: 0x405d8420, 0x3943: 0x405d8620, + 0x3944: 0x405d8820, 0x3945: 0x405d8a20, 0x3946: 0x405d8c20, 0x3947: 0x405d8e20, + 0x3948: 0x405d9020, 0x3949: 0x405d9220, 0x394a: 0x405d9420, 0x394b: 0x405d9620, + 0x394c: 0x405d9820, 0x394d: 0x40025820, 0x394e: 0x40030020, 0x394f: 0x4002d820, + 0x3950: 0x005c3084, 0x3951: 0x005c5484, 0x3952: 0x005c8e84, 0x3953: 0xe00020fb, + 0x3954: 0xe00020fe, 0x3955: 0xe0002101, 0x3956: 0xe0002104, 0x3957: 0xe0002107, + 0x3958: 0xe000210a, 0x3959: 0xe000210d, 0x395a: 0xe0002110, 0x395b: 0xe0002113, + 0x395c: 0xe0002116, 0x395d: 0xe0002119, 0x395e: 0xe000211c, 0x395f: 0xe000211f, + 0x3960: 0xe00001cd, 0x3961: 0xe0000261, 0x3962: 0xe0000379, 0x3963: 0xe0000453, + 0x3964: 0xe0000528, 0x3965: 0xe00005f2, 0x3966: 0xe00006bd, 0x3967: 0xe0000765, + 0x3968: 0xe0000811, 0x3969: 0xe00008b6, 0x396a: 0x005c5c84, 0x396b: 0x005d2284, + // Block 0xe6, offset 0x3980 + 0x3980: 0x0033ec88, 0x3981: 0x4033ec20, 0x3982: 0x0033fa88, 0x3983: 0x4033fa20, + 0x3984: 0x00340488, 0x3985: 0x40340420, 0x3986: 0x00343488, 0x3987: 0x40343420, + 0x3988: 0x00344e88, 0x3989: 0x40344e20, 0x398a: 0x0035a288, 0x398b: 0x4035a220, + 0x398c: 0x0035f088, 0x398d: 0x4035f020, 0x398e: 0x00366e88, 0x398f: 0x40366e20, + 0x3990: 0x00367c88, 0x3991: 0x40367c20, 0x3992: 0x0036a688, 0x3993: 0x4036a620, + 0x3994: 0x0036c088, 0x3995: 0x4036c020, 0x3996: 0x0036c288, 0x3997: 0x4036c220, + 0x3998: 0x0036de88, 0x3999: 0x4036de20, 0x399a: 0x0036e888, 0x399b: 0x4036e820, + 0x399c: 0x0036f288, 0x399d: 0x4036f220, 0x399e: 0x00372488, 0x399f: 0x40372420, + 0x39a0: 0x00360a88, 0x39a1: 0x40360a20, 0x39a2: 0x00339e88, 0x39a3: 0x40339e20, + 0x39a4: 0x0034a288, 0x39a5: 0x4034a220, 0x39a6: 0x0034b888, 0x39a7: 0x4034b820, + 0x39a8: 0x0034ee8a, 0x39a9: 0x0034ee84, 0x39aa: 0x0034ee8a, 0x39ab: 0x0034ee84, + 0x39ac: 0x0034ee8a, 0x39ad: 0x0034ee84, 0x39ae: 0x0034ee84, 0x39af: 0xae608402, + 0x39b0: 0xa0000000, 0x39b1: 0xa0000000, 0x39b2: 0xa0000000, 0x39b3: 0x4004e020, + 0x39b4: 0x84e619e1, 0x39b5: 0x84e61a0a, 0x39b6: 0x84e61a1b, 0x39b7: 0x84e61ab9, + 0x39b8: 0x84e61b3a, 0x39b9: 0x84e61b3f, 0x39ba: 0x84e61b47, 0x39bb: 0x84e61af0, + 0x39bc: 0xae605f02, 0x39bd: 0xae605f02, 0x39be: 0x40054c20, 0x39bf: 0x40367220, + // Block 0xe7, offset 0x39c0 + 0x39c0: 0x00339488, 0x39c1: 0x40339420, 0x39c2: 0x00341288, 0x39c3: 0x40341220, + 0x39c4: 0x0033d288, 0x39c5: 0x4033d220, 0x39c6: 0x00364288, 0x39c7: 0x40364220, + 0x39c8: 0x00340e88, 0x39c9: 0x40340e20, 0x39ca: 0x00356088, 0x39cb: 0x40356020, + 0x39cc: 0x00355488, 0x39cd: 0x40355420, 0x39ce: 0x00360c88, 0x39cf: 0x40360c20, + 0x39d0: 0x00361688, 0x39d1: 0x40361620, 0x39d2: 0x00362088, 0x39d3: 0x40362020, + 0x39d4: 0x0035de88, 0x39d5: 0x4035de20, 0x39d6: 0x00366488, 0x39d7: 0x40366420, + 0x39df: 0x84e61b67, + 0x39e0: 0x405d9a20, 0x39e1: 0x405d9c20, 0x39e2: 0x405d9e20, 0x39e3: 0x405da020, + 0x39e4: 0x405da220, 0x39e5: 0x405da420, 0x39e6: 0x405da620, 0x39e7: 0x405da820, + 0x39e8: 0x405daa20, 0x39e9: 0x405dac20, 0x39ea: 0x405dae20, 0x39eb: 0x405db020, + 0x39ec: 0x405db220, 0x39ed: 0x405db420, 0x39ee: 0x405db620, 0x39ef: 0x405db820, + 0x39f0: 0x405dba20, 0x39f1: 0x405dbc20, 0x39f2: 0x405dbe20, 0x39f3: 0x405dc020, + 0x39f4: 0x405dc220, 0x39f5: 0x405dc420, 0x39f6: 0x405dc620, 0x39f7: 0x405dc820, + 0x39f8: 0x405dca20, 0x39f9: 0x405dcc20, 0x39fa: 0x405dce20, 0x39fb: 0x405dd020, + 0x39fc: 0x405dd220, 0x39fd: 0x405dd420, 0x39fe: 0x405dd620, 0x39ff: 0x405dd820, + // Block 0xe8, offset 0x3a00 + 0x3a00: 0x405dda20, 0x3a01: 0x405ddc20, 0x3a02: 0x405dde20, 0x3a03: 0x405de020, + 0x3a04: 0x405de220, 0x3a05: 0x405de420, 0x3a06: 0x405de620, 0x3a07: 0x405de820, + 0x3a08: 0x405dea20, 0x3a09: 0x405dec20, 0x3a0a: 0x405dee20, 0x3a0b: 0x405df020, + 0x3a0c: 0x405df220, 0x3a0d: 0x405df420, 0x3a0e: 0x405df620, 0x3a0f: 0x405df820, + 0x3a10: 0x405dfa20, 0x3a11: 0x405dfc20, 0x3a12: 0x405dfe20, 0x3a13: 0x405e0020, + 0x3a14: 0x405e0220, 0x3a15: 0x405e0420, 0x3a16: 0x405e0620, 0x3a17: 0x405e0820, + 0x3a18: 0x405e0a20, 0x3a19: 0x405e0c20, 0x3a1a: 0x405e0e20, 0x3a1b: 0x405e1020, + 0x3a1c: 0x405e1220, 0x3a1d: 0x405e1420, 0x3a1e: 0x405e1620, 0x3a1f: 0x405e1820, + 0x3a20: 0x405e1a20, 0x3a21: 0x405e1c20, 0x3a22: 0x405e1e20, 0x3a23: 0x405e2020, + 0x3a24: 0x405e2220, 0x3a25: 0x405e2420, 0x3a26: 0x405e2620, 0x3a27: 0x405e2820, + 0x3a28: 0x405e2a20, 0x3a29: 0x405e2c20, 0x3a2a: 0x405e2e20, 0x3a2b: 0x405e3020, + 0x3a2c: 0x405e3220, 0x3a2d: 0x405e3420, 0x3a2e: 0x405e3620, 0x3a2f: 0x405e3820, + 0x3a30: 0xae60ef02, 0x3a31: 0xae60f002, 0x3a32: 0x40038220, 0x3a33: 0x40030220, + 0x3a34: 0x4002b820, 0x3a35: 0x40025a20, 0x3a36: 0x40026a20, 0x3a37: 0x4002da20, + // Block 0xe9, offset 0x3a40 + 0x3a40: 0x4006ba20, 0x3a41: 0x4006bc20, 0x3a42: 0x4006be20, 0x3a43: 0x4006c020, + 0x3a44: 0x4006c220, 0x3a45: 0x4006c420, 0x3a46: 0x4006c620, 0x3a47: 0x4006c820, + 0x3a48: 0x4006ca20, 0x3a49: 0x4006cc20, 0x3a4a: 0x4006ce20, 0x3a4b: 0x4006d020, + 0x3a4c: 0x4006d220, 0x3a4d: 0x4006d420, 0x3a4e: 0x4006d620, 0x3a4f: 0x4006d820, + 0x3a50: 0x4006da20, 0x3a51: 0x4006dc20, 0x3a52: 0x4006de20, 0x3a53: 0x4006e020, + 0x3a54: 0x4006e220, 0x3a55: 0x4006e420, 0x3a56: 0x4006e620, 0x3a57: 0x4006e820, + 0x3a58: 0x4006ea20, 0x3a59: 0x4006ec20, 0x3a5a: 0x4006ee20, 0x3a5b: 0x4006f020, + 0x3a5c: 0x4006f220, 0x3a5d: 0x4006f420, 0x3a5e: 0x4006f620, 0x3a5f: 0x4006f820, + 0x3a60: 0x4006fa20, 0x3a61: 0x4006fc20, 0x3a62: 0x0031e488, 0x3a63: 0x4031e420, + 0x3a64: 0x0031f888, 0x3a65: 0x4031f820, 0x3a66: 0x002d8c88, 0x3a67: 0x402d8c20, + 0x3a68: 0xe0000fd5, 0x3a69: 0xe0000fd2, 0x3a6a: 0x0031ae88, 0x3a6b: 0x4031ae20, + 0x3a6c: 0x0031b088, 0x3a6d: 0x4031b020, 0x3a6e: 0x0031b288, 0x3a6f: 0x4031b220, + 0x3a70: 0x402d1020, 0x3a71: 0x402fee20, 0x3a72: 0xe00009cf, 0x3a73: 0xe00009cc, + 0x3a74: 0xe00009ff, 0x3a75: 0xe00009fc, 0x3a76: 0xe0000a05, 0x3a77: 0xe0000a02, + 0x3a78: 0xe0000a0e, 0x3a79: 0xe0000a0b, 0x3a7a: 0xe0000a15, 0x3a7b: 0xe0000a11, + 0x3a7c: 0xe0000a1c, 0x3a7d: 0xe0000a19, 0x3a7e: 0x002c6088, 0x3a7f: 0x402c6020, + // Block 0xea, offset 0x3a80 + 0x3a80: 0x002e1488, 0x3a81: 0x402e1420, 0x3a82: 0x002e1688, 0x3a83: 0x402e1620, + 0x3a84: 0x002e1888, 0x3a85: 0x402e1820, 0x3a86: 0x002e3288, 0x3a87: 0x402e3220, + 0x3a88: 0x002e3688, 0x3a89: 0x402e3620, 0x3a8a: 0x002f1888, 0x3a8b: 0x402f1820, + 0x3a8c: 0x002f0888, 0x3a8d: 0x402f0820, 0x3a8e: 0xe0000ea1, 0x3a8f: 0xe0000e9e, + 0x3a90: 0x002f3888, 0x3a91: 0x402f3820, 0x3a92: 0x002f4688, 0x3a93: 0x402f4620, + 0x3a94: 0x002f4888, 0x3a95: 0x402f4820, 0x3a96: 0x002f5e88, 0x3a97: 0x402f5e20, + 0x3a98: 0x002f6088, 0x3a99: 0x402f6020, 0x3a9a: 0x002f8a88, 0x3a9b: 0x402f8a20, + 0x3a9c: 0x002fe488, 0x3a9d: 0x402fe420, 0x3a9e: 0x0030c888, 0x3a9f: 0x4030c820, + 0x3aa0: 0xe00010c6, 0x3aa1: 0xe00010c3, 0x3aa2: 0x00316288, 0x3aa3: 0x40316220, + 0x3aa4: 0x00319088, 0x3aa5: 0x40319020, 0x3aa6: 0x00319288, 0x3aa7: 0x40319220, + 0x3aa8: 0x00319c88, 0x3aa9: 0x40319c20, 0x3aaa: 0x00319e88, 0x3aab: 0x40319e20, + 0x3aac: 0x0031a088, 0x3aad: 0x4031a020, 0x3aae: 0x0031a288, 0x3aaf: 0x4031a220, + 0x3ab0: 0x0031a294, 0x3ab1: 0x402c9420, 0x3ab2: 0x402e6620, 0x3ab3: 0x402e9c20, + 0x3ab4: 0x402ed820, 0x3ab5: 0x402fe020, 0x3ab6: 0x402fe220, 0x3ab7: 0x40306220, + 0x3ab8: 0x4031a420, 0x3ab9: 0xe0000abc, 0x3aba: 0xe0000ab9, 0x3abb: 0xe0000b92, + 0x3abc: 0xe0000b8f, 0x3abd: 0xe0000bdc, 0x3abe: 0x002d5688, 0x3abf: 0x402d5620, + // Block 0xeb, offset 0x3ac0 + 0x3ac0: 0x002e7088, 0x3ac1: 0x402e7020, 0x3ac2: 0xe0000f08, 0x3ac3: 0xe0000f05, + 0x3ac4: 0xe0000f6d, 0x3ac5: 0xe0000f6a, 0x3ac6: 0xe0000fb7, 0x3ac7: 0xe0000fb4, + 0x3ac8: 0x4006fe20, 0x3ac9: 0x40070020, 0x3aca: 0x40070220, 0x3acb: 0x0031e688, + 0x3acc: 0x4031e620, 0x3acd: 0x00308888, 0x3ace: 0x402e5c20, + 0x3ad0: 0x002ec488, 0x3ad1: 0x402ec420, 0x3ad2: 0x002c4c88, 0x3ad3: 0x402c4c20, + 0x3ae0: 0xe0000bd6, 0x3ae1: 0xe0000bd3, 0x3ae2: 0xe0000ca5, 0x3ae3: 0xe0000ca2, + 0x3ae4: 0xe0000d75, 0x3ae5: 0xe0000d72, 0x3ae6: 0xe0000ee2, 0x3ae7: 0xe0000edf, + 0x3ae8: 0xe0000f4d, 0x3ae9: 0xe0000f4a, 0x3aea: 0x002d8088, + // Block 0xec, offset 0x3b00 + 0x3b38: 0xf0001414, 0x3b39: 0xe0000e97, 0x3b3a: 0x4030a820, 0x3b3b: 0x402d2020, + 0x3b3c: 0x402f4a20, 0x3b3d: 0x402e9820, 0x3b3e: 0x402db220, 0x3b3f: 0x402e9a20, + // Block 0xed, offset 0x3b40 + 0x3b40: 0x4045aa20, 0x3b41: 0x4045ac20, 0x3b42: 0x4045ae20, 0x3b43: 0x4045b020, + 0x3b44: 0x4045b220, 0x3b45: 0x4045b420, 0x3b46: 0x820922db, 0x3b47: 0x4045b820, + 0x3b48: 0x4045ba20, 0x3b49: 0x4045bc20, 0x3b4a: 0x4045be20, 0x3b4b: 0xa000f302, + 0x3b4c: 0x4045c020, 0x3b4d: 0x4045c220, 0x3b4e: 0x4045c420, 0x3b4f: 0x4045c620, + 0x3b50: 0x4045c820, 0x3b51: 0x4045ca20, 0x3b52: 0x4045cc20, 0x3b53: 0x4045ce20, + 0x3b54: 0x4045d020, 0x3b55: 0x4045d220, 0x3b56: 0x4045d420, 0x3b57: 0x4045d620, + 0x3b58: 0x4045d820, 0x3b59: 0x4045da20, 0x3b5a: 0x4045dc20, 0x3b5b: 0x4045de20, + 0x3b5c: 0x4045e020, 0x3b5d: 0x4045e220, 0x3b5e: 0x4045e420, 0x3b5f: 0x4045e620, + 0x3b60: 0x4045e820, 0x3b61: 0x4045ea20, 0x3b62: 0x4045ec20, 0x3b63: 0x4045ee20, + 0x3b64: 0x4045f020, 0x3b65: 0x4045f220, 0x3b66: 0x4045f420, 0x3b67: 0x4045f620, + 0x3b68: 0x40075020, 0x3b69: 0x40075220, 0x3b6a: 0x40075420, 0x3b6b: 0x40075620, + 0x3b70: 0x40284820, 0x3b71: 0x40284a20, 0x3b72: 0x40284c20, 0x3b73: 0x40284e20, + 0x3b74: 0x40285020, 0x3b75: 0x40285220, 0x3b76: 0x40075820, 0x3b77: 0x40075a20, + 0x3b78: 0x4027f020, 0x3b79: 0x40075c20, + // Block 0xee, offset 0x3b80 + 0x3b80: 0x404baa20, 0x3b81: 0x404bac20, 0x3b82: 0x404bae20, 0x3b83: 0x404bb020, + 0x3b84: 0x404bb220, 0x3b85: 0x404bb420, 0x3b86: 0x404bb620, 0x3b87: 0x404bb820, + 0x3b88: 0x404bc220, 0x3b89: 0x404bc420, 0x3b8a: 0x404bc620, 0x3b8b: 0x404bc820, + 0x3b8c: 0x404bca20, 0x3b8d: 0x404bcc20, 0x3b8e: 0x404bce20, 0x3b8f: 0x404bd020, + 0x3b90: 0x404bd220, 0x3b91: 0x404bd420, 0x3b92: 0x404bd620, 0x3b93: 0x404bd820, + 0x3b94: 0x404bdc20, 0x3b95: 0x404bde20, 0x3b96: 0x404be020, 0x3b97: 0x404be220, + 0x3b98: 0x404be820, 0x3b99: 0x404bee20, 0x3b9a: 0x404bf020, 0x3b9b: 0x404bf420, + 0x3b9c: 0x404bf620, 0x3b9d: 0x404bfc20, 0x3b9e: 0x404c0620, 0x3b9f: 0x404c0820, + 0x3ba0: 0x404c0a20, 0x3ba1: 0x404c0c20, 0x3ba2: 0x404bfe20, 0x3ba3: 0x404c0020, + 0x3ba4: 0x404c0220, 0x3ba5: 0x404c0420, 0x3ba6: 0x404c0e20, 0x3ba7: 0x404bda20, + 0x3ba8: 0x404be420, 0x3ba9: 0x404bba20, 0x3baa: 0x404bbc20, 0x3bab: 0x404bbe20, + 0x3bac: 0x404bc020, 0x3bad: 0x404be620, 0x3bae: 0x404bf220, 0x3baf: 0x404bf820, + 0x3bb0: 0x404bfa20, 0x3bb1: 0x404bea20, 0x3bb2: 0x404bec20, 0x3bb3: 0x404c1020, + 0x3bb4: 0x4005e820, 0x3bb5: 0x4005ea20, 0x3bb6: 0x40031820, 0x3bb7: 0x40031a20, + // Block 0xef, offset 0x3bc0 + 0x3bc0: 0xa000f302, 0x3bc1: 0xa000f402, 0x3bc2: 0x4045f820, 0x3bc3: 0x4045fa20, + 0x3bc4: 0x4045fc20, 0x3bc5: 0x4045fe20, 0x3bc6: 0x40460020, 0x3bc7: 0x40460220, + 0x3bc8: 0x40460420, 0x3bc9: 0x40460620, 0x3bca: 0x40460820, 0x3bcb: 0x40460a20, + 0x3bcc: 0x40460c20, 0x3bcd: 0x40460e20, 0x3bce: 0x40461020, 0x3bcf: 0x40461220, + 0x3bd0: 0x40461420, 0x3bd1: 0x40461620, 0x3bd2: 0x40461820, 0x3bd3: 0x40461a20, + 0x3bd4: 0x40461c20, 0x3bd5: 0x40461e20, 0x3bd6: 0x40462020, 0x3bd7: 0x40462220, + 0x3bd8: 0x40462420, 0x3bd9: 0x40462620, 0x3bda: 0x40462820, 0x3bdb: 0x40462a20, + 0x3bdc: 0x40462c20, 0x3bdd: 0x40462e20, 0x3bde: 0x40463020, 0x3bdf: 0x40463220, + 0x3be0: 0x40463420, 0x3be1: 0x40463620, 0x3be2: 0x40463820, 0x3be3: 0x40463a20, + 0x3be4: 0x40463c20, 0x3be5: 0x40463e20, 0x3be6: 0x40464020, 0x3be7: 0x40464220, + 0x3be8: 0x40464420, 0x3be9: 0x40464620, 0x3bea: 0x40464820, 0x3beb: 0x40464a20, + 0x3bec: 0x40464c20, 0x3bed: 0x40464e20, 0x3bee: 0x40465020, 0x3bef: 0x40465220, + 0x3bf0: 0x40465420, 0x3bf1: 0x40465620, 0x3bf2: 0x40465820, 0x3bf3: 0x40465a20, + 0x3bf4: 0x40465c20, 0x3bf5: 0x40465e20, 0x3bf6: 0x40466020, 0x3bf7: 0x40466220, + 0x3bf8: 0x40466420, 0x3bf9: 0x40466620, 0x3bfa: 0x40466820, 0x3bfb: 0x40466a20, + 0x3bfc: 0x40466c20, 0x3bfd: 0x40466e20, 0x3bfe: 0x40467020, 0x3bff: 0x40467220, + // Block 0xf0, offset 0x3c00 + 0x3c00: 0x40467420, 0x3c01: 0x40467620, 0x3c02: 0x40467820, 0x3c03: 0x40467a20, + 0x3c04: 0x8209233e, + 0x3c0e: 0x40031020, 0x3c0f: 0x40031220, + 0x3c10: 0xe000018b, 0x3c11: 0xe000021c, 0x3c12: 0xe0000337, 0x3c13: 0xe0000411, + 0x3c14: 0xe00004e6, 0x3c15: 0xe00005b0, 0x3c16: 0xe000067b, 0x3c17: 0xe0000723, + 0x3c18: 0xe00007cf, 0x3c19: 0xe0000874, + 0x3c20: 0xae600000, 0x3c21: 0xae600000, 0x3c22: 0xae600000, 0x3c23: 0xae600000, + 0x3c24: 0xae600000, 0x3c25: 0xae600000, 0x3c26: 0xae600000, 0x3c27: 0xae600000, + 0x3c28: 0xae600000, 0x3c29: 0xae600000, 0x3c2a: 0xae600000, 0x3c2b: 0xae600000, + 0x3c2c: 0xae600000, 0x3c2d: 0xae600000, 0x3c2e: 0xae600000, 0x3c2f: 0xae600000, + 0x3c30: 0xae600000, 0x3c31: 0xae600000, 0x3c32: 0x40404620, 0x3c33: 0x00404684, + 0x3c34: 0x00404684, 0x3c35: 0x00404684, 0x3c36: 0x00404684, 0x3c37: 0x00404684, + 0x3c38: 0x40056e20, 0x3c39: 0x40057020, 0x3c3a: 0x40057220, 0x3c3b: 0x40404820, + // Block 0xf1, offset 0x3c40 + 0x3c40: 0xe00001a9, 0x3c41: 0xe000023d, 0x3c42: 0xe0000355, 0x3c43: 0xe000042f, + 0x3c44: 0xe0000504, 0x3c45: 0xe00005ce, 0x3c46: 0xe0000699, 0x3c47: 0xe0000741, + 0x3c48: 0xe00007ed, 0x3c49: 0xe0000892, 0x3c4a: 0x404dd220, 0x3c4b: 0x404dd420, + 0x3c4c: 0x404dd620, 0x3c4d: 0x404dd820, 0x3c4e: 0x404dda20, 0x3c4f: 0x404ddc20, + 0x3c50: 0x404dde20, 0x3c51: 0x404de020, 0x3c52: 0x404de220, 0x3c53: 0x404de420, + 0x3c54: 0x404de620, 0x3c55: 0x404de820, 0x3c56: 0x404dea20, 0x3c57: 0x404dec20, + 0x3c58: 0x404dee20, 0x3c59: 0x404df020, 0x3c5a: 0x404df220, 0x3c5b: 0x404df420, + 0x3c5c: 0x404df620, 0x3c5d: 0x404df820, 0x3c5e: 0x404dfa20, 0x3c5f: 0x404dfc20, + 0x3c60: 0x404dfe20, 0x3c61: 0x404e0020, 0x3c62: 0x404e0220, 0x3c63: 0x404e0420, + 0x3c64: 0x404e0620, 0x3c65: 0x404e0820, 0x3c66: 0x404e0a20, 0x3c67: 0x404e0c20, + 0x3c68: 0x404e0e20, 0x3c69: 0x404e1020, 0x3c6a: 0x404e1220, 0x3c6b: 0xadc10f02, + 0x3c6c: 0xadc11002, 0x3c6d: 0xadc11102, 0x3c6e: 0x4005f420, 0x3c6f: 0x40032020, + 0x3c70: 0x404d8a20, 0x3c71: 0x404d8c20, 0x3c72: 0x404d8e20, 0x3c73: 0x404d9020, + 0x3c74: 0x404d9220, 0x3c75: 0x404d9420, 0x3c76: 0x404d9620, 0x3c77: 0x404d9820, + 0x3c78: 0x404d9a20, 0x3c79: 0x404d9c20, 0x3c7a: 0x404d9e20, 0x3c7b: 0x404da020, + 0x3c7c: 0x404da220, 0x3c7d: 0x404da420, 0x3c7e: 0x404da620, 0x3c7f: 0x404da820, + // Block 0xf2, offset 0x3c80 + 0x3c80: 0x404daa20, 0x3c81: 0x404dac20, 0x3c82: 0x404dae20, 0x3c83: 0x404db020, + 0x3c84: 0x404db220, 0x3c85: 0x404db420, 0x3c86: 0x404db620, 0x3c87: 0x404db820, + 0x3c88: 0x404dba20, 0x3c89: 0x404dbc20, 0x3c8a: 0x404dbe20, 0x3c8b: 0x404dc020, + 0x3c8c: 0x404dc220, 0x3c8d: 0x404dc420, 0x3c8e: 0x404dc620, 0x3c8f: 0x404dc820, + 0x3c90: 0x404dca20, 0x3c91: 0x404dcc20, 0x3c92: 0x404dce20, 0x3c93: 0x820926e8, + 0x3c9f: 0x40038420, + 0x3ca0: 0x40636a20, 0x3ca1: 0x40636c20, 0x3ca2: 0x40636e20, 0x3ca3: 0x40637020, + 0x3ca4: 0x40637220, 0x3ca5: 0x40637420, 0x3ca6: 0x40637620, 0x3ca7: 0x40637820, + 0x3ca8: 0x40637a20, 0x3ca9: 0x40637c20, 0x3caa: 0x40637e20, 0x3cab: 0x40638020, + 0x3cac: 0x40638220, 0x3cad: 0x40638420, 0x3cae: 0x40638620, 0x3caf: 0x40638820, + 0x3cb0: 0x40638a20, 0x3cb1: 0x40638c20, 0x3cb2: 0x40638e20, 0x3cb3: 0x40639020, + 0x3cb4: 0x40639220, 0x3cb5: 0x40639420, 0x3cb6: 0x40639620, 0x3cb7: 0x40639820, + 0x3cb8: 0x40639a20, 0x3cb9: 0x40639c20, 0x3cba: 0x40639e20, 0x3cbb: 0x4063a020, + 0x3cbc: 0x4063a220, + // Block 0xf3, offset 0x3cc0 + 0x3cc0: 0xa000f202, 0x3cc1: 0xa000f302, 0x3cc2: 0xa000f802, 0x3cc3: 0xa000f402, + 0x3cc4: 0x4052b220, 0x3cc5: 0x4052b420, 0x3cc6: 0x4052b620, 0x3cc7: 0x4052b820, + 0x3cc8: 0x4052ba20, 0x3cc9: 0x4052bc20, 0x3cca: 0x4052be20, 0x3ccb: 0x4052c020, + 0x3ccc: 0x4052c220, 0x3ccd: 0x4052c420, 0x3cce: 0x4052c620, 0x3ccf: 0x4052c820, + 0x3cd0: 0x4052ca20, 0x3cd1: 0x4052cc20, 0x3cd2: 0x4052ce20, 0x3cd3: 0x4052d020, + 0x3cd4: 0x4052d220, 0x3cd5: 0x4052d420, 0x3cd6: 0x4052d620, 0x3cd7: 0x4052d820, + 0x3cd8: 0x4052da20, 0x3cd9: 0x4052dc20, 0x3cda: 0x4052de20, 0x3cdb: 0x4052e020, + 0x3cdc: 0x4052e220, 0x3cdd: 0x4052e420, 0x3cde: 0x4052e620, 0x3cdf: 0x4052e820, + 0x3ce0: 0x4052ea20, 0x3ce1: 0x4052ec20, 0x3ce2: 0x4052ee20, 0x3ce3: 0x4052f020, + 0x3ce4: 0x4052f220, 0x3ce5: 0x4052f420, 0x3ce6: 0x4052f620, 0x3ce7: 0x4052f820, + 0x3ce8: 0x4052fa20, 0x3ce9: 0x4052fc20, 0x3cea: 0x4052fe20, 0x3ceb: 0x40530220, + 0x3cec: 0x00530284, 0x3ced: 0x40530620, 0x3cee: 0x40530820, 0x3cef: 0x40530a20, + 0x3cf0: 0x40530c20, 0x3cf1: 0x40530e20, 0x3cf2: 0x40531020, 0x3cf3: 0xa070f102, + 0x3cf4: 0x40531220, 0x3cf5: 0x40532420, 0x3cf6: 0x40531620, 0x3cf7: 0x40531820, + 0x3cf8: 0x40531a20, 0x3cf9: 0x40531c20, 0x3cfa: 0x40532020, 0x3cfb: 0x40532220, + 0x3cfc: 0x40531420, 0x3cfd: 0x40531e20, 0x3cfe: 0x40530020, 0x3cff: 0x40530420, + // Block 0xf4, offset 0x3d00 + 0x3d00: 0x82092993, 0x3d01: 0x40036e20, 0x3d02: 0x40037020, 0x3d03: 0x40037220, + 0x3d04: 0x40037420, 0x3d05: 0x40037620, 0x3d06: 0x40037820, 0x3d07: 0x4002b020, + 0x3d08: 0x40033620, 0x3d09: 0x40033820, 0x3d0a: 0x40037a20, 0x3d0b: 0x40037c20, + 0x3d0c: 0x40037e20, 0x3d0d: 0x40038020, 0x3d0f: 0x4027c020, + 0x3d10: 0xe00001c1, 0x3d11: 0xe0000255, 0x3d12: 0xe000036d, 0x3d13: 0xe0000447, + 0x3d14: 0xe000051c, 0x3d15: 0xe00005e6, 0x3d16: 0xe00006b1, 0x3d17: 0xe0000759, + 0x3d18: 0xe0000805, 0x3d19: 0xe00008aa, + 0x3d1e: 0x4005f620, 0x3d1f: 0x4005f820, + // Block 0xf5, offset 0x3d40 + 0x3d40: 0x40519c20, 0x3d41: 0x40519e20, 0x3d42: 0x4051a020, 0x3d43: 0x4051a220, + 0x3d44: 0x4051a420, 0x3d45: 0x4051a620, 0x3d46: 0x4051a820, 0x3d47: 0x4051aa20, + 0x3d48: 0x4051ac20, 0x3d49: 0x4051ae20, 0x3d4a: 0x4051b020, 0x3d4b: 0x4051b220, + 0x3d4c: 0x4051b420, 0x3d4d: 0x4051b620, 0x3d4e: 0x4051b820, 0x3d4f: 0x4051ba20, + 0x3d50: 0x4051bc20, 0x3d51: 0x4051be20, 0x3d52: 0x4051c020, 0x3d53: 0x4051c220, + 0x3d54: 0x4051c420, 0x3d55: 0x4051c620, 0x3d56: 0x4051c820, 0x3d57: 0x4051ca20, + 0x3d58: 0x4051cc20, 0x3d59: 0x4051ce20, 0x3d5a: 0x4051d020, 0x3d5b: 0x4051d220, + 0x3d5c: 0x4051d420, 0x3d5d: 0x4051d620, 0x3d5e: 0x4051d820, 0x3d5f: 0x4051da20, + 0x3d60: 0x4051dc20, 0x3d61: 0x4051de20, 0x3d62: 0x4051e020, 0x3d63: 0x4051e220, + 0x3d64: 0x4051e420, 0x3d65: 0x4051e620, 0x3d66: 0x4051e820, 0x3d67: 0x4051ea20, + 0x3d68: 0x4051ec20, 0x3d69: 0x4051f620, 0x3d6a: 0x4051f820, 0x3d6b: 0x4051fa20, + 0x3d6c: 0x4051fc20, 0x3d6d: 0x4051fe20, 0x3d6e: 0x40520020, 0x3d6f: 0x40520220, + 0x3d70: 0x40520420, 0x3d71: 0x40520620, 0x3d72: 0x40520820, 0x3d73: 0x4051ee20, + 0x3d74: 0x4051f020, 0x3d75: 0x4051f220, 0x3d76: 0x4051f420, + // Block 0xf6, offset 0x3d80 + 0x3d80: 0x40520a20, 0x3d81: 0x40520c20, 0x3d82: 0x40520e20, 0x3d83: 0x40521020, + 0x3d84: 0x40521220, 0x3d85: 0x40521420, 0x3d86: 0x40521620, 0x3d87: 0x40521820, + 0x3d88: 0x40521a20, 0x3d89: 0x40521c20, 0x3d8a: 0x40521e20, 0x3d8b: 0x40522020, + 0x3d8c: 0x40522220, 0x3d8d: 0x40522420, + 0x3d90: 0xe00001bb, 0x3d91: 0xe000024f, 0x3d92: 0xe0000367, 0x3d93: 0xe0000441, + 0x3d94: 0xe0000516, 0x3d95: 0xe00005e0, 0x3d96: 0xe00006ab, 0x3d97: 0xe0000753, + 0x3d98: 0xe00007ff, 0x3d99: 0xe00008a4, + 0x3d9c: 0x4005fa20, 0x3d9d: 0x40033a20, 0x3d9e: 0x40033c20, 0x3d9f: 0x40033e20, + 0x3da0: 0x404e2020, 0x3da1: 0x404e2c20, 0x3da2: 0x404e3020, 0x3da3: 0x404e3420, + 0x3da4: 0x404e3e20, 0x3da5: 0x404e4620, 0x3da6: 0x404e4c20, 0x3da7: 0x404e5020, + 0x3da8: 0x404e5420, 0x3da9: 0x404e5820, 0x3daa: 0x404e6820, 0x3dab: 0x404e6e20, + 0x3dac: 0x404ea820, 0x3dad: 0x404eae20, 0x3dae: 0x404eb220, 0x3daf: 0x404e7a20, + 0x3db0: 0x4027c220, 0x3db1: 0x404eb420, 0x3db2: 0x404e3820, 0x3db3: 0x404e8e20, + 0x3db4: 0x404f3a20, 0x3db5: 0x404f3c20, 0x3db6: 0x404f3e20, 0x3db7: 0x4007ac20, + 0x3db8: 0x4007ae20, 0x3db9: 0x4007b020, 0x3dba: 0x404e9020, 0x3dbb: 0x404f3820, + // Block 0xf7, offset 0x3dc0 + 0x3dc0: 0x4049f020, 0x3dc1: 0x4049f220, 0x3dc2: 0x4049f420, 0x3dc3: 0x4049f620, + 0x3dc4: 0x4049f820, 0x3dc5: 0x4049fa20, 0x3dc6: 0x4049fc20, 0x3dc7: 0x4049fe20, + 0x3dc8: 0x404a0020, 0x3dc9: 0x404a0220, 0x3dca: 0x404a0420, 0x3dcb: 0x404a0620, + 0x3dcc: 0x404a0820, 0x3dcd: 0x404a0a20, 0x3dce: 0x404a0c20, 0x3dcf: 0x404a0e20, + 0x3dd0: 0x404a1020, 0x3dd1: 0x404a1220, 0x3dd2: 0x404a1420, 0x3dd3: 0x404a1620, + 0x3dd4: 0x404a1820, 0x3dd5: 0x404a1a20, 0x3dd6: 0x404a1c20, 0x3dd7: 0x404a1e20, + 0x3dd8: 0x404a2020, 0x3dd9: 0x404a2220, 0x3dda: 0x404a2420, 0x3ddb: 0x404a2620, + 0x3ddc: 0x404a2820, 0x3ddd: 0x404a2a20, 0x3dde: 0x404a2c20, 0x3ddf: 0x404a2e20, + 0x3de0: 0x404a3020, 0x3de1: 0x404a3220, 0x3de2: 0x404a3420, 0x3de3: 0x404a3620, + 0x3de4: 0x404a3820, 0x3de5: 0x404a3a20, 0x3de6: 0x404a3c20, 0x3de7: 0x404a3e20, + 0x3de8: 0x404a4020, 0x3de9: 0x404a4220, 0x3dea: 0x404a4420, 0x3deb: 0x404a4620, + 0x3dec: 0x404a4820, 0x3ded: 0x404a4a20, 0x3dee: 0x404a4c20, 0x3def: 0x404a4e20, + 0x3df0: 0x82e62528, 0x3df1: 0x404a5220, 0x3df2: 0x82e6252a, 0x3df3: 0x82e6252b, + 0x3df4: 0x82dc252c, 0x3df5: 0xc20e0671, 0x3df6: 0xc23f0671, 0x3df7: 0x82e6252f, + 0x3df8: 0x82e62530, 0x3df9: 0xc2700671, 0x3dfa: 0x404a6420, 0x3dfb: 0xc2a10671, + 0x3dfc: 0xc2d20671, 0x3dfd: 0x404a6a20, 0x3dfe: 0x82e62536, 0x3dff: 0xae610c02, + // Block 0xf8, offset 0x3e00 + 0x3e00: 0x404a6e20, 0x3e01: 0xae610d02, 0x3e02: 0x404a7020, + 0x3e1b: 0x404a7220, + 0x3e1c: 0x404a7420, 0x3e1d: 0x4027c420, 0x3e1e: 0x40057e20, 0x3e1f: 0x40058020, + 0x3e20: 0x40456420, 0x3e21: 0x40456620, 0x3e22: 0x40456820, 0x3e23: 0x40456a20, + 0x3e24: 0x40456c20, 0x3e25: 0x40456e20, 0x3e26: 0x40457020, 0x3e27: 0x40457220, + 0x3e28: 0x40457420, 0x3e29: 0x40457620, 0x3e2a: 0x40457820, 0x3e2b: 0x40458a20, + 0x3e2c: 0x40458c20, 0x3e2d: 0x40458e20, 0x3e2e: 0x40459020, 0x3e2f: 0x40459220, + 0x3e30: 0x40034020, 0x3e31: 0x4002dc20, 0x3e32: 0x40452c20, 0x3e33: 0x4027c620, + 0x3e34: 0x4027c820, 0x3e35: 0x40459420, 0x3e36: 0x820922d4, + // Block 0xf9, offset 0x3e40 + 0x3e41: 0x403cae20, 0x3e42: 0x403cb020, 0x3e43: 0x403cb220, + 0x3e44: 0x403cb420, 0x3e45: 0x403cb620, 0x3e46: 0x403cb820, + 0x3e49: 0x403e3c20, 0x3e4a: 0x403e3e20, 0x3e4b: 0x403e4020, + 0x3e4c: 0x403e4220, 0x3e4d: 0x403e4420, 0x3e4e: 0x403e4620, + 0x3e51: 0x403dfe20, 0x3e52: 0x403e0020, 0x3e53: 0x403e0220, + 0x3e54: 0x403e0420, 0x3e55: 0x403e0620, 0x3e56: 0x403e0820, + 0x3e60: 0x403ec220, 0x3e61: 0x403ec420, 0x3e62: 0x403ec620, 0x3e63: 0x403ec820, + 0x3e64: 0x403eca20, 0x3e65: 0x403ecc20, 0x3e66: 0x403ece20, + 0x3e68: 0x403ef220, 0x3e69: 0x403ef420, 0x3e6a: 0x403ef620, 0x3e6b: 0x403ef820, + 0x3e6c: 0x403efa20, 0x3e6d: 0x403efc20, 0x3e6e: 0x403efe20, + // Block 0xfa, offset 0x3e80 + 0x3e80: 0x40452e20, 0x3e81: 0x40453020, 0x3e82: 0x40453220, 0x3e83: 0x40453420, + 0x3e84: 0x40453620, 0x3e85: 0x40453820, 0x3e86: 0x40453a20, 0x3e87: 0x40453c20, + 0x3e88: 0x40453e20, 0x3e89: 0x40454020, 0x3e8a: 0x40454220, 0x3e8b: 0x40454420, + 0x3e8c: 0x40454620, 0x3e8d: 0x40454820, 0x3e8e: 0x40454a20, 0x3e8f: 0x40454c20, + 0x3e90: 0x40454e20, 0x3e91: 0x40455020, 0x3e92: 0x40455220, 0x3e93: 0x40455420, + 0x3e94: 0x40455620, 0x3e95: 0x40455820, 0x3e96: 0x40455a20, 0x3e97: 0x40455c20, + 0x3e98: 0x40455e20, 0x3e99: 0x40456020, 0x3e9a: 0x40456220, 0x3e9b: 0x40459620, + 0x3e9c: 0x40459820, 0x3e9d: 0x40459a20, 0x3e9e: 0x40459c20, 0x3e9f: 0x40459e20, + 0x3ea0: 0x4045a020, 0x3ea1: 0x4045a220, 0x3ea2: 0x4045a420, 0x3ea3: 0x40457a20, + 0x3ea4: 0x40457c20, 0x3ea5: 0x40457e20, 0x3ea6: 0x40458020, 0x3ea7: 0x40458220, + 0x3ea8: 0x40458420, 0x3ea9: 0x40458620, 0x3eaa: 0x40458820, 0x3eab: 0x40034220, + 0x3eac: 0xa000fa02, 0x3ead: 0x820922d3, + 0x3eb0: 0xe0000188, 0x3eb1: 0xe0000219, 0x3eb2: 0xe0000334, 0x3eb3: 0xe000040e, + 0x3eb4: 0xe00004e3, 0x3eb5: 0xe00005ad, 0x3eb6: 0xe0000678, 0x3eb7: 0xe0000720, + 0x3eb8: 0xe00007cc, 0x3eb9: 0xe0000871, + // Block 0xfb, offset 0x3ec0 + 0x3ef0: 0x40643620, 0x3ef1: 0x40643820, 0x3ef2: 0x40643a20, 0x3ef3: 0x40643c20, + 0x3ef4: 0x40643e20, 0x3ef5: 0x40644020, 0x3ef6: 0x40644220, 0x3ef7: 0x40644420, + 0x3ef8: 0x40644620, 0x3ef9: 0x40644820, 0x3efa: 0x40644a20, 0x3efb: 0x40644c20, + 0x3efc: 0x40644e20, 0x3efd: 0x40645020, 0x3efe: 0x40645220, 0x3eff: 0x40645420, + // Block 0xfc, offset 0x3f00 + 0x3f00: 0x40645620, 0x3f01: 0x40645820, 0x3f02: 0x40645a20, 0x3f03: 0x40645c20, + 0x3f04: 0x40645e20, 0x3f05: 0x40646020, 0x3f06: 0x40646220, + 0x3f0b: 0x40651420, + 0x3f0c: 0x40651620, 0x3f0d: 0x40651820, 0x3f0e: 0x40651a20, 0x3f0f: 0x40651c20, + 0x3f10: 0x40651e20, 0x3f11: 0x40652020, 0x3f12: 0x40652220, 0x3f13: 0x40652420, + 0x3f14: 0x40652620, 0x3f15: 0x40652820, 0x3f16: 0x40652a20, 0x3f17: 0x40652c20, + 0x3f18: 0x40652e20, 0x3f19: 0x40653020, 0x3f1a: 0x40653220, 0x3f1b: 0x40653420, + 0x3f1c: 0x40653620, 0x3f1d: 0x40653820, 0x3f1e: 0x40653a20, 0x3f1f: 0x40653c20, + 0x3f20: 0x40653e20, 0x3f21: 0x40654020, 0x3f22: 0x40654220, 0x3f23: 0x40654420, + 0x3f24: 0x40654620, 0x3f25: 0x40654820, 0x3f26: 0x40654a20, 0x3f27: 0x40654c20, + 0x3f28: 0x40654e20, 0x3f29: 0x40655020, 0x3f2a: 0x40655220, 0x3f2b: 0x40655420, + 0x3f2c: 0x40655620, 0x3f2d: 0x40655820, 0x3f2e: 0x40655a20, 0x3f2f: 0x40655c20, + 0x3f30: 0x40655e20, 0x3f31: 0x40656020, 0x3f32: 0x40656220, 0x3f33: 0x40656420, + 0x3f34: 0x40656620, 0x3f35: 0x40656820, 0x3f36: 0x40656a20, 0x3f37: 0x40656c20, + 0x3f38: 0x40656e20, 0x3f39: 0x40657020, 0x3f3a: 0x40657220, 0x3f3b: 0x40657420, + // Block 0xfd, offset 0x3f40 + 0x3f40: 0x43189020, 0x3f41: 0x42cde820, 0x3f42: 0x431d9420, 0x3f43: 0x43199020, + 0x3f44: 0x42dda220, 0x3f45: 0x429c6420, 0x3f46: 0x42a7ca20, 0x3f47: 0x433f3820, + 0x3f48: 0x433f3820, 0x3f49: 0x42b2a220, 0x3f4a: 0x4323a220, 0x3f4b: 0x42ab0e20, + 0x3f4c: 0x42b29020, 0x3f4d: 0x42c3ec20, 0x3f4e: 0x42ecd220, 0x3f4f: 0x42ff0a20, + 0x3f50: 0x430c7e20, 0x3f51: 0x430f7420, 0x3f52: 0x4311f020, 0x3f53: 0x43211e20, + 0x3f54: 0x42d40420, 0x3f55: 0x42da3620, 0x3f56: 0x42e1b220, 0x3f57: 0x42e7bc20, + 0x3f58: 0x43087a20, 0x3f59: 0x4322d420, 0x3f5a: 0x4333e220, 0x3f5b: 0x429d0420, + 0x3f5c: 0x42a6ea20, 0x3f5d: 0x42d60820, 0x3f5e: 0x42e43620, 0x3f5f: 0x430c5a20, + 0x3f60: 0x433c3c20, 0x3f61: 0x42baa020, 0x3f62: 0x42dfd620, 0x3f63: 0x430b9a20, + 0x3f64: 0x4312c820, 0x3f65: 0x42c59220, 0x3f66: 0x4303b020, 0x3f67: 0x43103e20, + 0x3f68: 0x42bd9420, 0x3f69: 0x42ce2e20, 0x3f6a: 0x42dad420, 0x3f6b: 0x42e5f820, + 0x3f6c: 0x43219c20, 0x3f6d: 0x429f0c20, 0x3f6e: 0x42a36e20, 0x3f6f: 0x42a5bc20, + 0x3f70: 0x42c98820, 0x3f71: 0x42d5a620, 0x3f72: 0x42e42020, 0x3f73: 0x42edce20, + 0x3f74: 0x43000220, 0x3f75: 0x430c0c20, 0x3f76: 0x430cb820, 0x3f77: 0x431bde20, + 0x3f78: 0x432e6420, 0x3f79: 0x4336de20, 0x3f7a: 0x433bf420, 0x3f7b: 0x42f11820, + 0x3f7c: 0x42f2fe20, 0x3f7d: 0x42fb4020, 0x3f7e: 0x43079220, 0x3f7f: 0x43260820, + // Block 0xfe, offset 0x3f80 + 0x3f80: 0x433cfe20, 0x3f81: 0x4315ac20, 0x3f82: 0x42b1be20, 0x3f83: 0x42be0820, + 0x3f84: 0x42f8c020, 0x3f85: 0x4300fc20, 0x3f86: 0x42e4c420, 0x3f87: 0x42f19420, + 0x3f88: 0x43198420, 0x3f89: 0x432dee20, 0x3f8a: 0x42b1b020, 0x3f8b: 0x42b8c420, + 0x3f8c: 0x42d42620, 0x3f8d: 0x42dbb420, 0x3f8e: 0x42de1e20, 0x3f8f: 0x42fa5e20, + 0x3f90: 0x42fc6e20, 0x3f91: 0x432c9620, 0x3f92: 0x42a5a420, 0x3f93: 0x43011620, + 0x3f94: 0x42a3b820, 0x3f95: 0x42a39820, 0x3f96: 0x42f43820, 0x3f97: 0x42fb7c20, + 0x3f98: 0x4307e220, 0x3f99: 0x432cea20, 0x3f9a: 0x43170020, 0x3f9b: 0x42c59e20, + 0x3f9c: 0x42d40420, 0x3f9d: 0x4315fc20, 0x3f9e: 0x429c7220, 0x3f9f: 0x42b7ce20, + 0x3fa0: 0x42c02420, 0x3fa1: 0x42e70e20, 0x3fa2: 0x42eae020, 0x3fa3: 0x42a62e20, + 0x3fa4: 0x42f1f620, 0x3fa5: 0x429f7e20, 0x3fa6: 0x42bf5220, 0x3fa7: 0x429c1a20, + 0x3fa8: 0x42d99820, 0x3fa9: 0x42caf020, 0x3faa: 0x42fa4420, 0x3fab: 0x42a78620, + 0x3fac: 0x42b0bc20, 0x3fad: 0x42ee0220, 0x3fae: 0x43089220, 0x3faf: 0x43155420, + 0x3fb0: 0x42d77420, 0x3fb1: 0x431f6020, 0x3fb2: 0x42d91020, 0x3fb3: 0x42c5fc20, + 0x3fb4: 0x4305ca20, 0x3fb5: 0x42c74020, 0x3fb6: 0x42eaca20, 0x3fb7: 0x429d5c20, + 0x3fb8: 0x42a2d220, 0x3fb9: 0x42a39220, 0x3fba: 0x42d10220, 0x3fbb: 0x42f9ce20, + 0x3fbc: 0x4304de20, 0x3fbd: 0x4315a420, 0x3fbe: 0x43239e20, 0x3fbf: 0x42a5ea20, + // Block 0xff, offset 0x3fc0 + 0x3fc0: 0x42a88420, 0x3fc1: 0x42b2e620, 0x3fc2: 0x42bdd820, 0x3fc3: 0x42cb8a20, + 0x3fc4: 0x42dffc20, 0x3fc5: 0x42f25420, 0x3fc6: 0x432b5a20, 0x3fc7: 0x4334d420, + 0x3fc8: 0x433d2e20, 0x3fc9: 0x433d9c20, 0x3fca: 0x42a53620, 0x3fcb: 0x42cd8c20, + 0x3fcc: 0x42d6ee20, 0x3fcd: 0x431ec420, 0x3fce: 0x42bce820, 0x3fcf: 0x42c32020, + 0x3fd0: 0x42c40020, 0x3fd1: 0x42c93420, 0x3fd2: 0x42de4620, 0x3fd3: 0x42e29220, + 0x3fd4: 0x42e91220, 0x3fd5: 0x42f39420, 0x3fd6: 0x42fbe820, 0x3fd7: 0x4300de20, + 0x3fd8: 0x431e4c20, 0x3fd9: 0x4309dc20, 0x3fda: 0x43204620, 0x3fdb: 0x43269420, + 0x3fdc: 0x42a42e20, 0x3fdd: 0x42a54620, 0x3fde: 0x42a97a20, 0x3fdf: 0x42e19020, + 0x3fe0: 0x43118420, 0x3fe1: 0x43155420, 0x3fe2: 0x42bd9220, 0x3fe3: 0x42bfea20, + 0x3fe4: 0x42c6f620, 0x3fe5: 0x42d75c20, 0x3fe6: 0x42f87c20, 0x3fe7: 0x42e6ea20, + 0x3fe8: 0x429dc820, 0x3fe9: 0x42adf220, 0x3fea: 0x42b7ce20, 0x3feb: 0x42bb7420, + 0x3fec: 0x42c03820, 0x3fed: 0x42e76420, 0x3fee: 0x42e8d220, 0x3fef: 0x42ff3420, + 0x3ff0: 0x43008c20, 0x3ff1: 0x43246820, 0x3ff2: 0x432dec20, 0x3ff3: 0x432e9020, + 0x3ff4: 0x43303020, 0x3ff5: 0x429f1620, 0x3ff6: 0x42f35c20, 0x3ff7: 0x43236820, + 0x3ff8: 0x432d7020, 0x3ff9: 0x42c1c220, 0x3ffa: 0x429d0c20, 0x3ffb: 0x42a1b420, + 0x3ffc: 0x42b7dc20, 0x3ffd: 0x42b87e20, 0x3ffe: 0x42cb3220, 0x3fff: 0x42d40420, + // Block 0x100, offset 0x4000 + 0x4000: 0x42e39c20, 0x4001: 0x42ec8420, 0x4002: 0x4309f820, 0x4003: 0x4320f820, + 0x4004: 0x433f1a20, 0x4005: 0x42cd1020, 0x4006: 0x432c5c20, 0x4007: 0x42a51220, + 0x4008: 0x42cef620, 0x4009: 0x42cfe620, 0x400a: 0x42da8220, 0x400b: 0x42dd3820, + 0x400c: 0x42e81220, 0x400d: 0x42eab220, 0x400e: 0x42f0d620, 0x400f: 0x42fa2020, + 0x4010: 0x4330bc20, 0x4011: 0x42a2da20, 0x4012: 0x42c45c20, 0x4013: 0x432cf020, + 0x4014: 0x42a05620, 0x4015: 0x42ba3220, 0x4016: 0x42dbd420, 0x4017: 0x431e5420, + 0x4018: 0x42bf1620, 0x4019: 0x42c28820, 0x401a: 0x42d02e20, 0x401b: 0x42e70e20, + 0x401c: 0x432d0c20, 0x401d: 0x42a45220, 0x401e: 0x42a81e20, 0x401f: 0x42b8ca20, + 0x4020: 0x42cc2620, 0x4021: 0x42ce9c20, 0x4022: 0x42d15020, 0x4023: 0x42d9ca20, + 0x4024: 0x42e80c20, 0x4025: 0x42ebc420, 0x4026: 0x42fef220, 0x4027: 0x43119e20, + 0x4028: 0x4311c220, 0x4029: 0x43239820, 0x402a: 0x432dc420, 0x402b: 0x42a67e20, + 0x402c: 0x42dd7420, 0x402d: 0x42a83a20, 0x402e: 0x42e3a020, 0x402f: 0x42e93020, + 0x4030: 0x430bf420, 0x4031: 0x432d4620, 0x4032: 0x4338ae20, 0x4033: 0x433d3e20, + 0x4034: 0x42cf2e20, 0x4035: 0x42db9620, 0x4036: 0x4303d020, 0x4037: 0x42f59620, + 0x4038: 0x42f64020, 0x4039: 0x42f92420, 0x403a: 0x42e58020, 0x403b: 0x42e13220, + 0x403c: 0x4316b020, 0x403d: 0x429d8020, 0x403e: 0x43066c20, 0x403f: 0x42a47420, + // Block 0x101, offset 0x4040 + 0x4040: 0x42a40e20, 0x4041: 0x42bd4c20, 0x4042: 0x42c5a620, 0x4043: 0x42f9ac20, + 0x4044: 0x42b70a20, 0x4045: 0x42da3c20, 0x4046: 0x42cd6820, 0x4047: 0x431e7620, + 0x4048: 0x43109820, 0x4049: 0x432c9a20, 0x404a: 0x43131620, 0x404b: 0x42bda620, + 0x404c: 0x42a28020, 0x404d: 0x42ab8020, 0x404e: 0x43f41c20, 0x404f: 0x43f41e20, + 0x4050: 0x42b0b420, 0x4051: 0x43f42220, 0x4052: 0x42cce820, 0x4053: 0x43f42620, + 0x4054: 0x43f42820, 0x4055: 0x42a3bc20, 0x4056: 0x42e65420, 0x4057: 0x42ed9420, + 0x4058: 0x42f27820, 0x4059: 0x42f2bc20, 0x405a: 0x42f2ca20, 0x405b: 0x42f31e20, + 0x405c: 0x432eac20, 0x405d: 0x42f97c20, 0x405e: 0x42ff7a20, 0x405f: 0x43f43e20, + 0x4060: 0x430c2420, 0x4061: 0x43f44220, 0x4062: 0x4315f020, 0x4063: 0x43f44620, + 0x4064: 0x43f44820, 0x4065: 0x43207020, 0x4066: 0x4321fa20, 0x4067: 0x43f44e20, + 0x4068: 0x43f45020, 0x4069: 0x43f45220, 0x406a: 0x4331de20, 0x406b: 0x4331f820, + 0x406c: 0x43325020, 0x406d: 0x433b6820, 0x406e: 0x4321bc20, 0x406f: 0x432d6e20, + 0x4070: 0x429f5c20, 0x4071: 0x42a1ce20, 0x4072: 0x42a29a20, 0x4073: 0x42a59220, + 0x4074: 0x42a5c820, 0x4075: 0x42a6a220, 0x4076: 0x42ab3a20, 0x4077: 0x42ac0c20, + 0x4078: 0x42acd020, 0x4079: 0x42b08020, 0x407a: 0x42b15020, 0x407b: 0x42b8c820, + 0x407c: 0x42b8dc20, 0x407d: 0x42c12820, 0x407e: 0x42c2d020, 0x407f: 0x42c31c20, + // Block 0x102, offset 0x4080 + 0x4080: 0x42c3e420, 0x4081: 0x42ca9e20, 0x4082: 0x42cbc420, 0x4083: 0x42cd2220, + 0x4084: 0x42d10a20, 0x4085: 0x42daee20, 0x4086: 0x42dc3420, 0x4087: 0x42de4420, + 0x4088: 0x42e2dc20, 0x4089: 0x42e45620, 0x408a: 0x42e84420, 0x408b: 0x42f12220, + 0x408c: 0x42f27c20, 0x408d: 0x42f29220, 0x408e: 0x42f29020, 0x408f: 0x42f2a020, + 0x4090: 0x42f2ac20, 0x4091: 0x42f2ba20, 0x4092: 0x42f31a20, 0x4093: 0x42f31c20, + 0x4094: 0x42f48020, 0x4095: 0x42f50220, 0x4096: 0x42f78020, 0x4097: 0x42fbe820, + 0x4098: 0x42fc1220, 0x4099: 0x42fc8220, 0x409a: 0x42fee420, 0x409b: 0x43000a20, + 0x409c: 0x4303da20, 0x409d: 0x4304f220, 0x409e: 0x4304f220, 0x409f: 0x4308ae20, + 0x40a0: 0x43122020, 0x40a1: 0x43132c20, 0x40a2: 0x43160220, 0x40a3: 0x43167220, + 0x40a4: 0x4319a620, 0x40a5: 0x431a1020, 0x40a6: 0x431f6c20, 0x40a7: 0x43207020, + 0x40a8: 0x432dc620, 0x40a9: 0x432ffe20, 0x40aa: 0x43307620, 0x40ab: 0x42c0ea20, + 0x40ac: 0x4885dc20, 0x40ad: 0x43043020, + 0x40b0: 0x429c4c20, 0x40b1: 0x42a36a20, 0x40b2: 0x42a2d020, 0x40b3: 0x429f0020, + 0x40b4: 0x42a28a20, 0x40b5: 0x42a30020, 0x40b6: 0x42a58e20, 0x40b7: 0x42a5f420, + 0x40b8: 0x42ab3a20, 0x40b9: 0x42aaaa20, 0x40ba: 0x42ab3220, 0x40bb: 0x42abc420, + 0x40bc: 0x42b0b420, 0x40bd: 0x42b16620, 0x40be: 0x42b28820, 0x40bf: 0x42b2a820, + // Block 0x103, offset 0x40c0 + 0x40c0: 0x42b4c420, 0x40c1: 0x42b65020, 0x40c2: 0x42bda420, 0x40c3: 0x42bdb220, + 0x40c4: 0x42bed220, 0x40c5: 0x42bf5a20, 0x40c6: 0x42c1b020, 0x40c7: 0x42c29c20, + 0x40c8: 0x42c21020, 0x40c9: 0x42c31c20, 0x40ca: 0x42c2c020, 0x40cb: 0x42c3e420, + 0x40cc: 0x42c46820, 0x40cd: 0x42c78820, 0x40ce: 0x42c83820, 0x40cf: 0x42c8a420, + 0x40d0: 0x42caac20, 0x40d1: 0x42cce820, 0x40d2: 0x42ce2e20, 0x40d3: 0x42ce3620, + 0x40d4: 0x42ceac20, 0x40d5: 0x42d6f220, 0x40d6: 0x42d77420, 0x40d7: 0x42da8220, + 0x40d8: 0x42ddb620, 0x40d9: 0x42dd9620, 0x40da: 0x42de4420, 0x40db: 0x42e03c20, + 0x40dc: 0x42e2dc20, 0x40dd: 0x42ef4e20, 0x40de: 0x42e46a20, 0x40df: 0x42e55e20, + 0x40e0: 0x42e65420, 0x40e1: 0x42e8e220, 0x40e2: 0x42ea0c20, 0x40e3: 0x42ea7620, + 0x40e4: 0x42ec3a20, 0x40e5: 0x42ec3e20, 0x40e6: 0x42ed9420, 0x40e7: 0x42edb620, + 0x40e8: 0x42ede820, 0x40e9: 0x42ee9420, 0x40ea: 0x42ee8020, 0x40eb: 0x42f19820, + 0x40ec: 0x42f56220, 0x40ed: 0x42f78020, 0x40ee: 0x42f8f620, 0x40ef: 0x42fab620, + 0x40f0: 0x42fbe820, 0x40f1: 0x42fe7c20, 0x40f2: 0x43000a20, 0x40f3: 0x4306a420, + 0x40f4: 0x4307de20, 0x40f5: 0x430ef220, 0x40f6: 0x43128220, 0x40f7: 0x43130c20, + 0x40f8: 0x43132c20, 0x40f9: 0x43157e20, 0x40fa: 0x4315f020, 0x40fb: 0x43159620, + 0x40fc: 0x43160220, 0x40fd: 0x4315fc20, 0x40fe: 0x4315da20, 0x40ff: 0x43167220, + // Block 0x104, offset 0x4100 + 0x4100: 0x43171420, 0x4101: 0x431a1020, 0x4102: 0x431e7020, 0x4103: 0x4320e420, + 0x4104: 0x43233220, 0x4105: 0x4324ec20, 0x4106: 0x432cf820, 0x4107: 0x432dc620, + 0x4108: 0x432eac20, 0x4109: 0x432fb620, 0x410a: 0x432ffe20, 0x410b: 0x43301620, + 0x410c: 0x43307620, 0x410d: 0x43362420, 0x410e: 0x433f3820, 0x410f: 0x48509420, + 0x4110: 0x48508820, 0x4111: 0x4867aa20, 0x4112: 0x44773a20, 0x4113: 0x44803020, + 0x4114: 0x44807220, 0x4115: 0x48a49220, 0x4116: 0x48b9a020, 0x4117: 0x48fda620, + 0x4118: 0x433e8620, 0x4119: 0x433f1c20, + // Block 0x105, offset 0x4140 + 0x4140: 0xf0000404, 0x4141: 0xf0000404, 0x4142: 0xf0000404, 0x4143: 0xe0000b99, + 0x4144: 0xe0000b9d, 0x4145: 0xe0000f83, 0x4146: 0xf0000404, + 0x4153: 0xf0000404, + 0x4154: 0xf0000404, 0x4155: 0xf0000404, 0x4156: 0xf0000404, 0x4157: 0xf0000404, + 0x415d: 0xe000150b, 0x415e: 0xa1a09602, 0x415f: 0xe0001514, + 0x4160: 0x0038ae85, 0x4161: 0x00389085, 0x4162: 0x00389685, 0x4163: 0x00389885, + 0x4164: 0x0038a485, 0x4165: 0x0038a685, 0x4166: 0x0038a885, 0x4167: 0x0038b685, + 0x4168: 0x0038ba85, 0x4169: 0x00093885, 0x416a: 0xe0001542, 0x416b: 0xe000153f, + 0x416c: 0xe000154c, 0x416d: 0xe0001548, 0x416e: 0xe00014e1, 0x416f: 0xe00014e4, + 0x4170: 0xe00014e7, 0x4171: 0xe00014ea, 0x4172: 0xe00014f0, 0x4173: 0xe00014f3, + 0x4174: 0xe00014f6, 0x4175: 0xe00014fc, 0x4176: 0xe0001505, + 0x4178: 0xe0001508, 0x4179: 0xe000150e, 0x417a: 0xe000151b, 0x417b: 0xe0001518, + 0x417c: 0xe0001521, 0x417e: 0xe0001524, + // Block 0x106, offset 0x4180 + 0x4180: 0xe0001527, 0x4181: 0xe000152a, 0x4183: 0xe0001530, + 0x4184: 0xe000152d, 0x4186: 0xe0001536, 0x4187: 0xe0001539, + 0x4188: 0xe000153c, 0x4189: 0xe0001545, 0x418a: 0xe0001550, 0x418b: 0xe00014f9, + 0x418c: 0xe00014ed, 0x418d: 0xe000151e, 0x418e: 0xe0001533, 0x418f: 0xf0000404, + 0x4190: 0x0039249a, 0x4191: 0x00392499, 0x4192: 0x00393e9a, 0x4193: 0x00393e99, + 0x4194: 0x00393e97, 0x4195: 0x00393e98, 0x4196: 0x0039409a, 0x4197: 0x00394099, + 0x4198: 0x00394097, 0x4199: 0x00394098, 0x419a: 0x0039429a, 0x419b: 0x00394299, + 0x419c: 0x00394297, 0x419d: 0x00394298, 0x419e: 0x00395c9a, 0x419f: 0x00395c99, + 0x41a0: 0x00395c97, 0x41a1: 0x00395c98, 0x41a2: 0x0039629a, 0x41a3: 0x00396299, + 0x41a4: 0x00396297, 0x41a5: 0x00396298, 0x41a6: 0x00395a9a, 0x41a7: 0x00395a99, + 0x41a8: 0x00395a97, 0x41a9: 0x00395a98, 0x41aa: 0x003a049a, 0x41ab: 0x003a0499, + 0x41ac: 0x003a0497, 0x41ad: 0x003a0498, 0x41ae: 0x003a0a9a, 0x41af: 0x003a0a99, + 0x41b0: 0x003a0a97, 0x41b1: 0x003a0a98, 0x41b2: 0x0039689a, 0x41b3: 0x00396899, + 0x41b4: 0x00396897, 0x41b5: 0x00396898, 0x41b6: 0x0039669a, 0x41b7: 0x00396699, + 0x41b8: 0x00396697, 0x41b9: 0x00396698, 0x41ba: 0x00396a9a, 0x41bb: 0x00396a99, + 0x41bc: 0x00396a97, 0x41bd: 0x00396a98, 0x41be: 0x00396e9a, 0x41bf: 0x00396e99, + // Block 0x107, offset 0x41c0 + 0x41c0: 0x00396e97, 0x41c1: 0x00396e98, 0x41c2: 0x0039969a, 0x41c3: 0x00399699, + 0x41c4: 0x0039949a, 0x41c5: 0x00399499, 0x41c6: 0x0039989a, 0x41c7: 0x00399899, + 0x41c8: 0x00398c9a, 0x41c9: 0x00398c99, 0x41ca: 0x0039b69a, 0x41cb: 0x0039b699, + 0x41cc: 0x0039a89a, 0x41cd: 0x0039a899, 0x41ce: 0x003a1c9a, 0x41cf: 0x003a1c99, + 0x41d0: 0x003a1c97, 0x41d1: 0x003a1c98, 0x41d2: 0x003a2a9a, 0x41d3: 0x003a2a99, + 0x41d4: 0x003a2a97, 0x41d5: 0x003a2a98, 0x41d6: 0x003a329a, 0x41d7: 0x003a3299, + 0x41d8: 0x003a3297, 0x41d9: 0x003a3298, 0x41da: 0x003a2e9a, 0x41db: 0x003a2e99, + 0x41dc: 0x003a2e97, 0x41dd: 0x003a2e98, 0x41de: 0x003a589a, 0x41df: 0x003a5899, + 0x41e0: 0x003a5a9a, 0x41e1: 0x003a5a99, 0x41e2: 0x003a5a97, 0x41e3: 0x003a5a98, + 0x41e4: 0xf0001a1a, 0x41e5: 0xf0001919, 0x41e6: 0x003a6c9a, 0x41e7: 0x003a6c99, + 0x41e8: 0x003a6c97, 0x41e9: 0x003a6c98, 0x41ea: 0x003a6a9a, 0x41eb: 0x003a6a99, + 0x41ec: 0x003a6a97, 0x41ed: 0x003a6a98, 0x41ee: 0x003aaa9a, 0x41ef: 0x003aaa99, + 0x41f0: 0xf0001a1a, 0x41f1: 0xf0001919, 0x41f2: 0x40071820, 0x41f3: 0x40071a20, + 0x41f4: 0x40071c20, 0x41f5: 0x40071e20, 0x41f6: 0x40072020, 0x41f7: 0x40072220, + 0x41f8: 0x40072420, 0x41f9: 0x40072620, 0x41fa: 0x40072820, 0x41fb: 0x40072a20, + 0x41fc: 0x40072c20, 0x41fd: 0x40072e20, 0x41fe: 0x40073020, 0x41ff: 0x40073220, + // Block 0x108, offset 0x4200 + 0x4200: 0x40073420, 0x4201: 0x40073620, + 0x4213: 0x003a269a, + 0x4214: 0x003a2699, 0x4215: 0x003a2697, 0x4216: 0x003a2698, 0x4217: 0x003a7c9a, + 0x4218: 0x003a7c99, 0x4219: 0x003a7a9a, 0x421a: 0x003a7a99, 0x421b: 0x003a7e9a, + 0x421c: 0x003a7e99, 0x421d: 0xf0001a1a, 0x421e: 0x003a849a, 0x421f: 0x003a8499, + 0x4220: 0x003a789a, 0x4221: 0x003a7899, 0x4222: 0x003a809a, 0x4223: 0x003a8099, + 0x4224: 0x003a989a, 0x4225: 0x003a9899, 0x4226: 0x003a9897, 0x4227: 0x003a9898, + 0x4228: 0x003a8e97, 0x4229: 0x003a8e98, 0x422a: 0xe0001559, 0x422b: 0xe0001556, + 0x422c: 0xe0001589, 0x422d: 0xe0001586, 0x422e: 0xe000158f, 0x422f: 0xe000158c, + 0x4230: 0xe000159b, 0x4231: 0xe0001598, 0x4232: 0xe0001595, 0x4233: 0xe0001592, + 0x4234: 0xe00015a1, 0x4235: 0xe000159e, 0x4236: 0xe00015bf, 0x4237: 0xe00015bc, + 0x4238: 0xe00015b9, 0x4239: 0xe00015ad, 0x423a: 0xe00015a7, 0x423b: 0xe00015a4, + 0x423c: 0x003a929a, 0x423d: 0x003a9299, 0x423e: 0x003a9297, 0x423f: 0x003a9298, + // Block 0x109, offset 0x4240 + 0x4240: 0xe000155f, 0x4241: 0xe0001565, 0x4242: 0xe000157a, 0x4243: 0xe00015b0, + 0x4244: 0xe00015b6, 0x4245: 0xf0001a1a, 0x4246: 0xf0001a1a, 0x4247: 0xf0001a1a, + 0x4248: 0xf0001a1a, 0x4249: 0xf0001a1a, 0x424a: 0xf0001a1a, 0x424b: 0xf0001a1a, + 0x424c: 0xf0001a1a, 0x424d: 0xf0001a1a, 0x424e: 0xf0001a1a, 0x424f: 0xf0001a1a, + 0x4250: 0xf0001a1a, 0x4251: 0xf0001a1a, 0x4252: 0xf0001a1a, 0x4253: 0xf0001a1a, + 0x4254: 0xf0001a1a, 0x4255: 0xf0001a1a, 0x4256: 0xf0001a1a, 0x4257: 0xf0001a1a, + 0x4258: 0xf0001a1a, 0x4259: 0xf0001a1a, 0x425a: 0xf0001a1a, 0x425b: 0xf0001a1a, + 0x425c: 0xf0001a1a, 0x425d: 0xf0001a1a, 0x425e: 0xf0001a1a, 0x425f: 0xf0001a1a, + 0x4260: 0xf0001a1a, 0x4261: 0xf0001a1a, 0x4262: 0xf0001a1a, 0x4263: 0xf0001a1a, + 0x4264: 0xf0001a1a, 0x4265: 0xf0001a1a, 0x4266: 0xf0001a1a, 0x4267: 0xf0001a1a, + 0x4268: 0xf0001a1a, 0x4269: 0xf0001a1a, 0x426a: 0xf0001a1a, 0x426b: 0xf0001a1a, + 0x426c: 0xf0001a1a, 0x426d: 0xf0001a1a, 0x426e: 0xf0001a1a, 0x426f: 0xf0001a1a, + 0x4270: 0xf0001a1a, 0x4271: 0xf0001a1a, 0x4272: 0xf0001a1a, 0x4273: 0xf0001a1a, + 0x4274: 0xf0001a1a, 0x4275: 0xf0001a1a, 0x4276: 0xf0001a1a, 0x4277: 0xf0001a1a, + 0x4278: 0xf0001a1a, 0x4279: 0xf0001a1a, 0x427a: 0xf0001a1a, 0x427b: 0xf0001a1a, + 0x427c: 0xf0001a1a, 0x427d: 0xf0001a1a, 0x427e: 0xf0001a1a, 0x427f: 0xf0001a1a, + // Block 0x10a, offset 0x4280 + 0x4280: 0xf0001a1a, 0x4281: 0xf0001a1a, 0x4282: 0xf0001a1a, 0x4283: 0xf0001a1a, + 0x4284: 0xf0001a1a, 0x4285: 0xf0001a1a, 0x4286: 0xf0001a1a, 0x4287: 0xf0001a1a, + 0x4288: 0xf0001a1a, 0x4289: 0xf0001a1a, 0x428a: 0xf0001a1a, 0x428b: 0xf0001a1a, + 0x428c: 0xf0001a1a, 0x428d: 0xf0001a1a, 0x428e: 0xf0001a1a, 0x428f: 0xf0001a1a, + 0x4290: 0xf0001a1a, 0x4291: 0xf0001a1a, 0x4292: 0xf0001a1a, 0x4293: 0xf0001a1a, + 0x4294: 0xf0001a1a, 0x4295: 0xf0001a1a, 0x4296: 0xf0001a1a, 0x4297: 0xf0001a1a, + 0x4298: 0xf0001a1a, 0x4299: 0xf0001a1a, 0x429a: 0xf0001a1a, 0x429b: 0xf0001a1a, + 0x429c: 0xf0001a1a, 0x429d: 0xf0001a1a, 0x429e: 0xe0000003, 0x429f: 0xe0000006, + 0x42a0: 0xe0000009, 0x42a1: 0xe000000c, 0x42a2: 0xe000000f, 0x42a3: 0xe0000012, + 0x42a4: 0xe000156b, 0x42a5: 0xe000156e, 0x42a6: 0xe0001577, 0x42a7: 0xe000157d, + 0x42a8: 0xe00015aa, 0x42a9: 0xe00015b3, 0x42aa: 0xf0001919, 0x42ab: 0xf0001919, + 0x42ac: 0xf0001919, 0x42ad: 0xf0001919, 0x42ae: 0xf0001919, 0x42af: 0xf0001919, + 0x42b0: 0xf0001919, 0x42b1: 0xf0001919, 0x42b2: 0xf0001919, 0x42b3: 0xf0001919, + 0x42b4: 0xf0001919, 0x42b5: 0xf0001919, 0x42b6: 0xf0001919, 0x42b7: 0xf0001919, + 0x42b8: 0xf0001919, 0x42b9: 0xf0001919, 0x42ba: 0xf0001919, 0x42bb: 0xf0001919, + 0x42bc: 0xf0001919, 0x42bd: 0xf0001919, 0x42be: 0xf0001919, 0x42bf: 0xf0001919, + // Block 0x10b, offset 0x42c0 + 0x42c0: 0xf0001919, 0x42c1: 0xf0001919, 0x42c2: 0xf0001919, 0x42c3: 0xf0001919, + 0x42c4: 0xf0001919, 0x42c5: 0xf0001919, 0x42c6: 0xf0001919, 0x42c7: 0xf0001919, + 0x42c8: 0xf0001919, 0x42c9: 0xf0001919, 0x42ca: 0xf0001919, 0x42cb: 0xf0001919, + 0x42cc: 0xf0001919, 0x42cd: 0xf0001919, 0x42ce: 0xf0001919, 0x42cf: 0xf0001919, + 0x42d0: 0xf0001919, 0x42d1: 0xf0001919, 0x42d2: 0xf0001919, 0x42d3: 0xf0001919, + 0x42d4: 0xf0001919, 0x42d5: 0xf0001919, 0x42d6: 0xf0001919, 0x42d7: 0xe000155c, + 0x42d8: 0xe0001562, 0x42d9: 0xe0001568, 0x42da: 0xe0001571, 0x42db: 0xe0001580, + 0x42dc: 0xf0001717, 0x42dd: 0xf0001717, 0x42de: 0xf0001717, 0x42df: 0xf0001717, + 0x42e0: 0xf0001717, 0x42e1: 0xf0001717, 0x42e2: 0xf0001717, 0x42e3: 0xf0001717, + 0x42e4: 0xf0001717, 0x42e5: 0xf0001717, 0x42e6: 0xf0001717, 0x42e7: 0xf0001717, + 0x42e8: 0xf0001717, 0x42e9: 0xf0001717, 0x42ea: 0xf0001717, 0x42eb: 0xf0001717, + 0x42ec: 0xf0001717, 0x42ed: 0xf0001717, 0x42ee: 0xf0001717, 0x42ef: 0xf0001717, + 0x42f0: 0xf0001717, 0x42f1: 0xf0001717, 0x42f2: 0xf0001717, 0x42f3: 0xf0001717, + 0x42f4: 0xf0001717, 0x42f5: 0xf0001717, 0x42f6: 0xf0001717, 0x42f7: 0xf0001717, + 0x42f8: 0xf0001717, 0x42f9: 0xf0001717, 0x42fa: 0xf0001717, 0x42fb: 0xf0001717, + 0x42fc: 0xf0001717, 0x42fd: 0xf0001717, 0x42fe: 0xf0001717, 0x42ff: 0xf0001717, + // Block 0x10c, offset 0x4300 + 0x4300: 0xf0001717, 0x4301: 0xf0001717, 0x4302: 0xf0001717, 0x4303: 0xf0001717, + 0x4304: 0xf0001717, 0x4305: 0xf0001717, 0x4306: 0xf0001717, 0x4307: 0xf0001717, + 0x4308: 0xf0001717, 0x4309: 0xf0001717, 0x430a: 0xf0001717, 0x430b: 0xf0001717, + 0x430c: 0xf0001717, 0x430d: 0xf0001717, 0x430e: 0xf0001717, 0x430f: 0xf0001717, + 0x4310: 0xf0001717, 0x4311: 0xf0001717, 0x4312: 0xf0001717, 0x4313: 0xf0001717, + 0x4314: 0xf0001717, 0x4315: 0xf0001717, 0x4316: 0xf0001717, 0x4317: 0xf0001717, + 0x4318: 0xf0001717, 0x4319: 0xf0001717, 0x431a: 0xf0001717, 0x431b: 0xf0001717, + 0x431c: 0xf0001717, 0x431d: 0xf0001717, 0x431e: 0xf0001717, 0x431f: 0xe0001574, + 0x4320: 0xe0001583, 0x4321: 0xf0001818, 0x4322: 0xf0001818, 0x4323: 0xf0001818, + 0x4324: 0xf0001818, 0x4325: 0xf0001818, 0x4326: 0xf0001818, 0x4327: 0xf0001818, + 0x4328: 0xf0001818, 0x4329: 0xf0001818, 0x432a: 0xf0001818, 0x432b: 0xf0001818, + 0x432c: 0xf0001818, 0x432d: 0xf0001818, 0x432e: 0xf0001818, 0x432f: 0xf0001818, + 0x4330: 0xf0001818, 0x4331: 0xf0001818, 0x4332: 0xf0001818, 0x4333: 0xf0001818, + 0x4334: 0xf0001818, 0x4335: 0xf0001a1a, 0x4336: 0xf0001a1a, 0x4337: 0xf0001a1a, + 0x4338: 0xf0001a1a, 0x4339: 0xf0001a1a, 0x433a: 0xf0001a1a, 0x433b: 0xf0001a1a, + 0x433c: 0xf0001a1a, 0x433d: 0xf0001a1a, 0x433e: 0xf0001a1a, 0x433f: 0xf0001a1a, + // Block 0x10d, offset 0x4340 + 0x4340: 0xf0001a1a, 0x4341: 0xf0001a1a, 0x4342: 0xf0001a1a, 0x4343: 0xf0001a1a, + 0x4344: 0xf0001a1a, 0x4345: 0xf0001a1a, 0x4346: 0xf0001a1a, 0x4347: 0xf0001a1a, + 0x4348: 0xf0001a1a, 0x4349: 0xf0001a1a, 0x434a: 0xf0001a1a, 0x434b: 0xf0001a1a, + 0x434c: 0xf0001a1a, 0x434d: 0xf0001a1a, 0x434e: 0xf0001a1a, 0x434f: 0xf0001a1a, + 0x4350: 0xf0001a1a, 0x4351: 0xf0001919, 0x4352: 0xf0001919, 0x4353: 0xf0001919, + 0x4354: 0xf0001919, 0x4355: 0xf0001919, 0x4356: 0xf0001919, 0x4357: 0xf0001919, + 0x4358: 0xf0001919, 0x4359: 0xf0001919, 0x435a: 0xf0001919, 0x435b: 0xf0001919, + 0x435c: 0xf0001919, 0x435d: 0xf0001919, 0x435e: 0xf0001919, 0x435f: 0xf0001919, + 0x4360: 0xf0001919, 0x4361: 0xf0001919, 0x4362: 0xf0001919, 0x4363: 0xf0001919, + 0x4364: 0xf0001919, 0x4365: 0xf0001919, 0x4366: 0xf0001919, 0x4367: 0xf0001919, + 0x4368: 0xf0001919, 0x4369: 0xf0001919, 0x436a: 0xf0001919, 0x436b: 0xf0001919, + 0x436c: 0xf0001919, 0x436d: 0xf0001717, 0x436e: 0xf0001717, 0x436f: 0xf0001717, + 0x4370: 0xf0001717, 0x4371: 0xf0001717, 0x4372: 0xf0001717, 0x4373: 0xf0001717, + 0x4374: 0xf0001818, 0x4375: 0xf0001818, 0x4376: 0xf0001818, 0x4377: 0xf0001818, + 0x4378: 0xf0001818, 0x4379: 0xf0001818, 0x437a: 0xf0001818, 0x437b: 0xf0001818, + 0x437c: 0xf0001919, 0x437d: 0xf0001a1a, 0x437e: 0x4004c020, 0x437f: 0x4004c220, + // Block 0x10e, offset 0x4380 + 0x4390: 0xe00015d4, 0x4391: 0xe00015e4, 0x4392: 0xe00015e0, 0x4393: 0xe00015e8, + 0x4394: 0xe00015ec, 0x4395: 0xe00015f8, 0x4396: 0xe00015fc, 0x4397: 0xe0001600, + 0x4398: 0xe0001621, 0x4399: 0xe000161d, 0x439a: 0xe0001635, 0x439b: 0xe0001631, + 0x439c: 0xe0001646, 0x439d: 0xe000163e, 0x439e: 0xe0001642, 0x439f: 0xe000165a, + 0x43a0: 0xe0001656, 0x43a1: 0xe0001652, 0x43a2: 0xe0001662, 0x43a3: 0xe000165e, + 0x43a4: 0xe000168a, 0x43a5: 0xe0001686, 0x43a6: 0xe00016b6, 0x43a7: 0xe000166e, + 0x43a8: 0xe000166a, 0x43a9: 0xe0001666, 0x43aa: 0xe000167a, 0x43ab: 0xe0001676, + 0x43ac: 0xe0001682, 0x43ad: 0xe000167e, 0x43ae: 0xe00016ba, 0x43af: 0xe00016c6, + 0x43b0: 0xe00016c2, 0x43b1: 0xe00016ce, 0x43b2: 0xe00016ca, 0x43b3: 0xe00016d2, + 0x43b4: 0xe00016d6, 0x43b5: 0xe00016de, 0x43b6: 0xe00016eb, 0x43b7: 0xe00016e7, + 0x43b8: 0xe00016ef, 0x43b9: 0xe00016f7, 0x43ba: 0xe00016ff, 0x43bb: 0xe00016fb, + 0x43bc: 0xe0001707, 0x43bd: 0xe0001703, 0x43be: 0xe0001717, 0x43bf: 0xe000171b, + // Block 0x10f, offset 0x43c0 + 0x43c0: 0xe0001759, 0x43c1: 0xe0001761, 0x43c2: 0xe000175d, 0x43c3: 0xe0001741, + 0x43c4: 0xe0001745, 0x43c5: 0xe0001769, 0x43c6: 0xe0001765, 0x43c7: 0xe0001771, + 0x43c8: 0xe000176d, 0x43c9: 0xe000178c, 0x43ca: 0xe0001790, 0x43cb: 0xe0001799, + 0x43cc: 0xe000177c, 0x43cd: 0xe0001784, 0x43ce: 0xe000179d, 0x43cf: 0xe00017a1, + 0x43d2: 0xe0001780, 0x43d3: 0xe00017d9, + 0x43d4: 0xe00017dd, 0x43d5: 0xe00017c5, 0x43d6: 0xe00017c9, 0x43d7: 0xe00017b9, + 0x43d8: 0xe00017b5, 0x43d9: 0xe00017bd, 0x43da: 0xe00017d5, 0x43db: 0xe00017d1, + 0x43dc: 0xe00017f8, 0x43dd: 0xe00017f4, 0x43de: 0xe00015d0, 0x43df: 0xe00015dc, + 0x43e0: 0xe00015d8, 0x43e1: 0xe00015f4, 0x43e2: 0xe00015f0, 0x43e3: 0xe0001608, + 0x43e4: 0xe0001604, 0x43e5: 0xe0001629, 0x43e6: 0xe000160c, 0x43e7: 0xe0001625, + 0x43e8: 0xe000164a, 0x43e9: 0xe000168e, 0x43ea: 0xe0001672, 0x43eb: 0xe00016be, + 0x43ec: 0xe0001751, 0x43ed: 0xe0001775, 0x43ee: 0xe00017f0, 0x43ef: 0xe00017ec, + 0x43f0: 0xe00017fc, 0x43f1: 0xe00017a9, 0x43f2: 0xe000171f, 0x43f3: 0xe00017cd, + 0x43f4: 0xe0001713, 0x43f5: 0xe0001755, 0x43f6: 0xe00016f3, 0x43f7: 0xe000172b, + 0x43f8: 0xe00017ad, 0x43f9: 0xe00017a5, 0x43fa: 0xe0001749, 0x43fb: 0xe0001727, + 0x43fc: 0xe000174d, 0x43fd: 0xe00017b1, 0x43fe: 0xe0001610, 0x43ff: 0xe000162d, + // Block 0x110, offset 0x4400 + 0x4400: 0xe0001788, 0x4401: 0xe000170b, 0x4402: 0xe00015cc, 0x4403: 0xe0001723, + 0x4404: 0xe00016da, 0x4405: 0xe00016b2, 0x4406: 0xe000164e, 0x4407: 0xe00017c1, + 0x4430: 0xe00016ae, 0x4431: 0xe000170f, 0x4432: 0xe00015c7, 0x4433: 0xe00015c2, + 0x4434: 0xe0001794, 0x4435: 0xe0001692, 0x4436: 0xe0001639, 0x4437: 0xe00016e2, + 0x4438: 0xe00017e7, 0x4439: 0xe0001697, 0x443a: 0xe000169b, 0x443b: 0xe0001614, + 0x443c: 0x40282e20, 0x443d: 0x40071620, + // Block 0x111, offset 0x4440 + 0x4440: 0xa0000000, 0x4441: 0xa0000000, 0x4442: 0xa0000000, 0x4443: 0xa0000000, + 0x4444: 0xa0000000, 0x4445: 0xa0000000, 0x4446: 0xa0000000, 0x4447: 0xa0000000, + 0x4448: 0xa0000000, 0x4449: 0xa0000000, 0x444a: 0xa0000000, 0x444b: 0xa0000000, + 0x444c: 0xa0000000, 0x444d: 0xa0000000, 0x444e: 0xa0000000, 0x444f: 0xa0000000, + 0x4450: 0x00024096, 0x4451: 0x00025c96, 0x4452: 0x00030496, 0x4453: 0x00026c96, + 0x4454: 0x00026296, 0x4455: 0x0002ba96, 0x4456: 0x0002c496, 0x4457: 0x0004b496, + 0x4458: 0x0004b696, 0x4459: 0xf0001616, + 0x4460: 0xae608202, 0x4461: 0xae600000, 0x4462: 0xae608102, 0x4463: 0xae600000, + 0x4464: 0xae600000, 0x4465: 0xae600000, 0x4466: 0xae600000, + 0x4470: 0xf0001f16, 0x4471: 0x00022c96, 0x4472: 0x00022a96, 0x4473: 0x00021696, + 0x4474: 0x00021696, 0x4475: 0x0003f496, 0x4476: 0x0003f696, 0x4477: 0x0003fc96, + 0x4478: 0x0003fe96, 0x4479: 0x0004b096, 0x447a: 0x0004b296, 0x447b: 0x0004ac96, + 0x447c: 0x0004ae96, 0x447d: 0x0004a096, 0x447e: 0x0004a296, 0x447f: 0x00049c96, + // Block 0x112, offset 0x4480 + 0x4480: 0x00049e96, 0x4481: 0x0004a496, 0x4482: 0x0004a696, 0x4483: 0x0004a896, + 0x4484: 0x0004aa96, 0x4485: 0x40025e20, 0x4486: 0x40026020, 0x4487: 0x0003f896, + 0x4488: 0x0003fa96, 0x4489: 0x00021484, 0x448a: 0x00021484, 0x448b: 0x00021484, + 0x448c: 0x00021484, 0x448d: 0x00021684, 0x448e: 0x00021684, 0x448f: 0x00021684, + 0x4490: 0x0002408f, 0x4491: 0x00025c8f, 0x4492: 0x0002e48f, + 0x4494: 0x0002628f, 0x4495: 0x00026c8f, 0x4496: 0x0002c48f, 0x4497: 0x0002ba8f, + 0x4498: 0x00022c8f, 0x4499: 0x0003f48f, 0x449a: 0x0003f68f, 0x449b: 0x0003fc8f, + 0x449c: 0x0003fe8f, 0x449d: 0x0004b08f, 0x449e: 0x0004b28f, 0x449f: 0x0004ea8f, + 0x44a0: 0x0004e68f, 0x44a1: 0x0004d88f, 0x44a2: 0x0009388f, 0x44a3: 0x00021a8f, + 0x44a4: 0x0009408f, 0x44a5: 0x0009448f, 0x44a6: 0x0009428f, + 0x44a8: 0x0004e48f, 0x44a9: 0x0027de8f, 0x44aa: 0x0004ec8f, 0x44ab: 0x0004d68f, + 0x44b0: 0xa000a21a, 0x44b1: 0xa000a218, 0x44b2: 0xa000a51a, 0x44b3: 0xa0000000, + 0x44b4: 0xa000a91a, 0x44b6: 0xa000ad1a, 0x44b7: 0xa000ad18, + 0x44b8: 0xa000b21a, 0x44b9: 0xa000b218, 0x44ba: 0xa000b61a, 0x44bb: 0xa000b618, + 0x44bc: 0xa000ba1a, 0x44bd: 0xa000ba18, 0x44be: 0xa000bc1a, 0x44bf: 0xa000bc18, + // Block 0x113, offset 0x44c0 + 0x44c0: 0x00391c9a, 0x44c1: 0x00391e9a, 0x44c2: 0x00391e99, 0x44c3: 0x0039209a, + 0x44c4: 0x00392099, 0x44c5: 0x0039269a, 0x44c6: 0x00392699, 0x44c7: 0x0039289a, + 0x44c8: 0x00392899, 0x44c9: 0x0039309a, 0x44ca: 0x00393099, 0x44cb: 0x00393097, + 0x44cc: 0x00393098, 0x44cd: 0x0039389a, 0x44ce: 0x00393899, 0x44cf: 0x00393c9a, + 0x44d0: 0x00393c99, 0x44d1: 0x00393c97, 0x44d2: 0x00393c98, 0x44d3: 0x0039549a, + 0x44d4: 0x00395499, 0x44d5: 0x0039569a, 0x44d6: 0x00395699, 0x44d7: 0x00395697, + 0x44d8: 0x00395698, 0x44d9: 0x0039589a, 0x44da: 0x00395899, 0x44db: 0x00395897, + 0x44dc: 0x00395898, 0x44dd: 0x0039649a, 0x44de: 0x00396499, 0x44df: 0x00396497, + 0x44e0: 0x00396498, 0x44e1: 0x0039729a, 0x44e2: 0x00397299, 0x44e3: 0x00397297, + 0x44e4: 0x00397298, 0x44e5: 0x0039749a, 0x44e6: 0x00397499, 0x44e7: 0x00397497, + 0x44e8: 0x00397498, 0x44e9: 0x0039889a, 0x44ea: 0x00398899, 0x44eb: 0x00398a9a, + 0x44ec: 0x00398a99, 0x44ed: 0x0039a49a, 0x44ee: 0x0039a499, 0x44ef: 0x0039a69a, + 0x44f0: 0x0039a699, 0x44f1: 0x0039c69a, 0x44f2: 0x0039c699, 0x44f3: 0x0039c697, + 0x44f4: 0x0039c698, 0x44f5: 0x0039c89a, 0x44f6: 0x0039c899, 0x44f7: 0x0039c897, + 0x44f8: 0x0039c898, 0x44f9: 0x0039dc9a, 0x44fa: 0x0039dc99, 0x44fb: 0x0039dc97, + 0x44fc: 0x0039dc98, 0x44fd: 0x0039de9a, 0x44fe: 0x0039de99, 0x44ff: 0x0039de97, + // Block 0x114, offset 0x4500 + 0x4500: 0x0039de98, 0x4501: 0x0039e69a, 0x4502: 0x0039e699, 0x4503: 0x0039e697, + 0x4504: 0x0039e698, 0x4505: 0x0039e89a, 0x4506: 0x0039e899, 0x4507: 0x0039e897, + 0x4508: 0x0039e898, 0x4509: 0x0039ee9a, 0x450a: 0x0039ee99, 0x450b: 0x0039ee97, + 0x450c: 0x0039ee98, 0x450d: 0x0039f09a, 0x450e: 0x0039f099, 0x450f: 0x0039f097, + 0x4510: 0x0039f098, 0x4511: 0x0039fc9a, 0x4512: 0x0039fc99, 0x4513: 0x0039fc97, + 0x4514: 0x0039fc98, 0x4515: 0x003a129a, 0x4516: 0x003a1299, 0x4517: 0x003a1297, + 0x4518: 0x003a1298, 0x4519: 0x003a1a9a, 0x451a: 0x003a1a99, 0x451b: 0x003a1a97, + 0x451c: 0x003a1a98, 0x451d: 0x003a409a, 0x451e: 0x003a4099, 0x451f: 0x003a4097, + 0x4520: 0x003a4098, 0x4521: 0x003a4e9a, 0x4522: 0x003a4e99, 0x4523: 0x003a4e97, + 0x4524: 0x003a4e98, 0x4525: 0x003a569a, 0x4526: 0x003a5699, 0x4527: 0x003a5697, + 0x4528: 0x003a5698, 0x4529: 0x003a689a, 0x452a: 0x003a6899, 0x452b: 0x003a6897, + 0x452c: 0x003a6898, 0x452d: 0x003a749a, 0x452e: 0x003a7499, 0x452f: 0x003a8e9a, + 0x4530: 0x003a8e99, 0x4531: 0x003a909a, 0x4532: 0x003a9099, 0x4533: 0x003a9097, + 0x4534: 0x003a9098, 0x4535: 0xe0001732, 0x4536: 0xe000172f, 0x4537: 0xe0001738, + 0x4538: 0xe0001735, 0x4539: 0xe000173e, 0x453a: 0xe000173b, 0x453b: 0xf0001a1a, + 0x453c: 0xf0001919, 0x453f: 0xa0000000, + // Block 0x115, offset 0x4540 + 0x4541: 0x0002ba83, 0x4542: 0x0003e083, 0x4543: 0x0004ea83, + 0x4544: 0x0027de83, 0x4545: 0x0004ec83, 0x4546: 0x0004e683, 0x4547: 0x0003d283, + 0x4548: 0x0003f483, 0x4549: 0x0003f683, 0x454a: 0x0004d883, 0x454b: 0x00093883, + 0x454c: 0x00024083, 0x454d: 0x00021a83, 0x454e: 0x0002e483, 0x454f: 0x0004e283, + 0x4550: 0x0029cc83, 0x4551: 0x0029ce83, 0x4552: 0x0029d083, 0x4553: 0x0029d283, + 0x4554: 0x0029d483, 0x4555: 0x0029d683, 0x4556: 0x0029d883, 0x4557: 0x0029da83, + 0x4558: 0x0029dc83, 0x4559: 0x0029de83, 0x455a: 0x00026c83, 0x455b: 0x00026283, + 0x455c: 0x00094083, 0x455d: 0x00094283, 0x455e: 0x00094483, 0x455f: 0x0002c483, + 0x4560: 0x0004d683, 0x4561: 0x002bde89, 0x4562: 0x002c0a89, 0x4563: 0x002c3a89, + 0x4564: 0x002c6289, 0x4565: 0x002c9889, 0x4566: 0x002d0889, 0x4567: 0x002d2289, + 0x4568: 0x002d6889, 0x4569: 0x002d9a89, 0x456a: 0x002dcc89, 0x456b: 0x002dfe89, + 0x456c: 0x002e2289, 0x456d: 0x002e8289, 0x456e: 0x002e9e89, 0x456f: 0x002ee289, + 0x4570: 0x002f2c89, 0x4571: 0x002f5689, 0x4572: 0x002f7a89, 0x4573: 0x002fe689, + 0x4574: 0x00302c89, 0x4575: 0x00306c89, 0x4576: 0x0030be89, 0x4577: 0x0030e289, + 0x4578: 0x0030f689, 0x4579: 0x00310089, 0x457a: 0x00312a89, 0x457b: 0x0003f883, + 0x457c: 0x0004e483, 0x457d: 0x0003fa83, 0x457e: 0x00062483, 0x457f: 0x00021683, + // Block 0x116, offset 0x4580 + 0x4580: 0x00061e83, 0x4581: 0x002bde83, 0x4582: 0x002c0a83, 0x4583: 0x002c3a83, + 0x4584: 0x002c6283, 0x4585: 0x002c9883, 0x4586: 0x002d0883, 0x4587: 0x002d2283, + 0x4588: 0x002d6883, 0x4589: 0x002d9a83, 0x458a: 0x002dcc83, 0x458b: 0x002dfe83, + 0x458c: 0x002e2283, 0x458d: 0x002e8283, 0x458e: 0x002e9e83, 0x458f: 0x002ee283, + 0x4590: 0x002f2c83, 0x4591: 0x002f5683, 0x4592: 0x002f7a83, 0x4593: 0x002fe683, + 0x4594: 0x00302c83, 0x4595: 0x00306c83, 0x4596: 0x0030be83, 0x4597: 0x0030e283, + 0x4598: 0x0030f683, 0x4599: 0x00310083, 0x459a: 0x00312a83, 0x459b: 0x0003fc83, + 0x459c: 0x00094883, 0x459d: 0x0003fe83, 0x459e: 0x00094c83, 0x459f: 0x00041883, + 0x45a0: 0x00041a83, 0x45a1: 0x00030492, 0x45a2: 0x0004a492, 0x45a3: 0x0004a692, + 0x45a4: 0x00025c92, 0x45a5: 0x00023e92, 0x45a6: 0x0065d692, 0x45a7: 0x00657690, + 0x45a8: 0x00657890, 0x45a9: 0x00657a90, 0x45aa: 0x00657e90, 0x45ab: 0x00658090, + 0x45ac: 0x0065be90, 0x45ad: 0x0065c090, 0x45ae: 0x0065c490, 0x45af: 0x00659a90, + 0x45b0: 0x0027d692, 0x45b1: 0x00657692, 0x45b2: 0x00657892, 0x45b3: 0x00657a92, + 0x45b4: 0x00657e92, 0x45b5: 0x00658092, 0x45b6: 0x00658292, 0x45b7: 0x00658492, + 0x45b8: 0x00658692, 0x45b9: 0x00658892, 0x45ba: 0x00658a92, 0x45bb: 0x00658c92, + 0x45bc: 0x00658e92, 0x45bd: 0x00659092, 0x45be: 0x00659292, 0x45bf: 0x00659492, + // Block 0x117, offset 0x45c0 + 0x45c0: 0x00659692, 0x45c1: 0x00659892, 0x45c2: 0x00659a92, 0x45c3: 0x00659c92, + 0x45c4: 0x00659e92, 0x45c5: 0x0065a092, 0x45c6: 0x0065a292, 0x45c7: 0x0065a492, + 0x45c8: 0x0065a692, 0x45c9: 0x0065a892, 0x45ca: 0x0065aa92, 0x45cb: 0x0065ac92, + 0x45cc: 0x0065ae92, 0x45cd: 0x0065b092, 0x45ce: 0x0065b292, 0x45cf: 0x0065b492, + 0x45d0: 0x0065b692, 0x45d1: 0x0065b892, 0x45d2: 0x0065ba92, 0x45d3: 0x0065bc92, + 0x45d4: 0x0065be92, 0x45d5: 0x0065c092, 0x45d6: 0x0065c492, 0x45d7: 0x0065c692, + 0x45d8: 0x0065c892, 0x45d9: 0x0065ca92, 0x45da: 0x0065cc92, 0x45db: 0x0065ce92, + 0x45dc: 0x0065d092, 0x45dd: 0x0065d892, 0x45de: 0xa0012812, 0x45df: 0xa0012912, + 0x45e0: 0x0063a692, 0x45e1: 0x0062ac92, 0x45e2: 0x0062ae92, 0x45e3: 0x00646892, + 0x45e4: 0x0062b092, 0x45e5: 0x00646c92, 0x45e6: 0x00646e92, 0x45e7: 0x0062b292, + 0x45e8: 0x0062b492, 0x45e9: 0x0062b692, 0x45ea: 0x00647492, 0x45eb: 0x00647692, + 0x45ec: 0x00647892, 0x45ed: 0x00647a92, 0x45ee: 0x00647c92, 0x45ef: 0x00647e92, + 0x45f0: 0x0062e092, 0x45f1: 0x0062b892, 0x45f2: 0x0062ba92, 0x45f3: 0x0062bc92, + 0x45f4: 0x0062ee92, 0x45f5: 0x0062be92, 0x45f6: 0x0062c092, 0x45f7: 0x0062c292, + 0x45f8: 0x0062c492, 0x45f9: 0x0062c692, 0x45fa: 0x0062c892, 0x45fb: 0x0062ca92, + 0x45fc: 0x0062cc92, 0x45fd: 0x0062ce92, 0x45fe: 0x0062d092, + // Block 0x118, offset 0x4600 + 0x4602: 0x0063a892, 0x4603: 0x0063aa92, + 0x4604: 0x0063ac92, 0x4605: 0x0063ae92, 0x4606: 0x0063b092, 0x4607: 0x0063b292, + 0x460a: 0x0063b492, 0x460b: 0x0063b692, + 0x460c: 0x0063b892, 0x460d: 0x0063ba92, 0x460e: 0x0063bc92, 0x460f: 0x0063be92, + 0x4612: 0x0063c092, 0x4613: 0x0063c292, + 0x4614: 0x0063c492, 0x4615: 0x0063c692, 0x4616: 0x0063c892, 0x4617: 0x0063ca92, + 0x461a: 0x0063cc92, 0x461b: 0x0063ce92, + 0x461c: 0x0063d092, + 0x4620: 0x0027dc83, 0x4621: 0x0027e083, 0x4622: 0x00094683, 0x4623: 0x00062683, + 0x4624: 0x00094a83, 0x4625: 0x0027e283, 0x4626: 0x00280883, + 0x4628: 0x000d3292, 0x4629: 0x00084492, 0x462a: 0x00084892, 0x462b: 0x00084692, + 0x462c: 0x00084a92, 0x462d: 0x000e6e92, 0x462e: 0x000ec492, + 0x4639: 0xa0000000, 0x463a: 0xa0000000, 0x463b: 0xa0000000, + 0x463c: 0x4027ae20, 0x463d: 0x4027b020, 0x463e: 0x00000285, 0x463f: 0x2bfffe85, + // Block 0x119, offset 0x4640 + 0x4640: 0x40731a20, 0x4641: 0x40731c20, 0x4642: 0x40731e20, 0x4643: 0x40732020, + 0x4644: 0x40732220, 0x4645: 0x40732420, 0x4646: 0x40732620, 0x4647: 0x40732820, + 0x4648: 0x40732a20, 0x4649: 0x40732c20, 0x464a: 0x40732e20, 0x464b: 0x40733020, + 0x464d: 0x40733220, 0x464e: 0x40733420, 0x464f: 0x40733620, + 0x4650: 0x40733820, 0x4651: 0x40733a20, 0x4652: 0x40733c20, 0x4653: 0x40733e20, + 0x4654: 0x40734020, 0x4655: 0x40734220, 0x4656: 0x40734420, 0x4657: 0x40734620, + 0x4658: 0x40734820, 0x4659: 0x40734a20, 0x465a: 0x40734c20, 0x465b: 0x40734e20, + 0x465c: 0x40735020, 0x465d: 0x40735220, 0x465e: 0x40735420, 0x465f: 0x40735620, + 0x4660: 0x40735820, 0x4661: 0x40735a20, 0x4662: 0x40735c20, 0x4663: 0x40735e20, + 0x4664: 0x40736020, 0x4665: 0x40736220, 0x4666: 0x40736420, + 0x4668: 0x40736620, 0x4669: 0x40736820, 0x466a: 0x40736a20, 0x466b: 0x40736c20, + 0x466c: 0x40736e20, 0x466d: 0x40737020, 0x466e: 0x40737220, 0x466f: 0x40737420, + 0x4670: 0x40737620, 0x4671: 0x40737820, 0x4672: 0x40737a20, 0x4673: 0x40737c20, + 0x4674: 0x40737e20, 0x4675: 0x40738020, 0x4676: 0x40738220, 0x4677: 0x40738420, + 0x4678: 0x40738620, 0x4679: 0x40738820, 0x467a: 0x40738a20, + 0x467c: 0x40738c20, 0x467d: 0x40738e20, 0x467f: 0x40739020, + // Block 0x11a, offset 0x4680 + 0x4680: 0x40739220, 0x4681: 0x40739420, 0x4682: 0x40739620, 0x4683: 0x40739820, + 0x4684: 0x40739a20, 0x4685: 0x40739c20, 0x4686: 0x40739e20, 0x4687: 0x4073a020, + 0x4688: 0x4073a220, 0x4689: 0x4073a420, 0x468a: 0x4073a620, 0x468b: 0x4073a820, + 0x468c: 0x4073aa20, 0x468d: 0x4073ac20, + 0x4690: 0x4073ae20, 0x4691: 0x4073b020, 0x4692: 0x4073b220, 0x4693: 0x4073b420, + 0x4694: 0x4073b620, 0x4695: 0x4073b820, 0x4696: 0x4073ba20, 0x4697: 0x4073bc20, + 0x4698: 0x4073be20, 0x4699: 0x4073c020, 0x469a: 0x4073c220, 0x469b: 0x4073c420, + 0x469c: 0x4073c620, 0x469d: 0x4073c820, + // Block 0x11b, offset 0x46c0 + 0x46c0: 0x4073ca20, 0x46c1: 0x4073cc20, 0x46c2: 0x4073ce20, 0x46c3: 0x4073d020, + 0x46c4: 0x4073d220, 0x46c5: 0x4073d420, 0x46c6: 0x4073d620, 0x46c7: 0x4073d820, + 0x46c8: 0x4073da20, 0x46c9: 0x4073dc20, 0x46ca: 0x4073de20, 0x46cb: 0x4073e020, + 0x46cc: 0x4073e220, 0x46cd: 0x4073e420, 0x46ce: 0x4073e620, 0x46cf: 0x4073e820, + 0x46d0: 0x4073ea20, 0x46d1: 0x4073ec20, 0x46d2: 0x4073ee20, 0x46d3: 0x4073f020, + 0x46d4: 0x4073f220, 0x46d5: 0x4073f420, 0x46d6: 0x4073f620, 0x46d7: 0x4073f820, + 0x46d8: 0x4073fa20, 0x46d9: 0x4073fc20, 0x46da: 0x4073fe20, 0x46db: 0x40740020, + 0x46dc: 0x40740220, 0x46dd: 0x40740420, 0x46de: 0x40740620, 0x46df: 0x40740820, + 0x46e0: 0x40740a20, 0x46e1: 0x40740c20, 0x46e2: 0x40740e20, 0x46e3: 0x40741020, + 0x46e4: 0x40741220, 0x46e5: 0x40741420, 0x46e6: 0x40741620, 0x46e7: 0x40741820, + 0x46e8: 0x40741a20, 0x46e9: 0x40741c20, 0x46ea: 0x40741e20, 0x46eb: 0x40742020, + 0x46ec: 0x40742220, 0x46ed: 0x40742420, 0x46ee: 0x40742620, 0x46ef: 0x40742820, + 0x46f0: 0x40742a20, 0x46f1: 0x40742c20, 0x46f2: 0x40742e20, 0x46f3: 0x40743020, + 0x46f4: 0x40743220, 0x46f5: 0x40743420, 0x46f6: 0x40743620, 0x46f7: 0x40743820, + 0x46f8: 0x40743a20, 0x46f9: 0x40743c20, 0x46fa: 0x40743e20, 0x46fb: 0x40744020, + 0x46fc: 0x40744220, 0x46fd: 0x40744420, 0x46fe: 0x40744620, 0x46ff: 0x40744820, + // Block 0x11c, offset 0x4700 + 0x4700: 0x40744a20, 0x4701: 0x40744c20, 0x4702: 0x40744e20, 0x4703: 0x40745020, + 0x4704: 0x40745220, 0x4705: 0x40745420, 0x4706: 0x40745620, 0x4707: 0x40745820, + 0x4708: 0x40745a20, 0x4709: 0x40745c20, 0x470a: 0x40745e20, 0x470b: 0x40746020, + 0x470c: 0x40746220, 0x470d: 0x40746420, 0x470e: 0x40746620, 0x470f: 0x40746820, + 0x4710: 0x40746a20, 0x4711: 0x40746c20, 0x4712: 0x40746e20, 0x4713: 0x40747020, + 0x4714: 0x40747220, 0x4715: 0x40747420, 0x4716: 0x40747620, 0x4717: 0x40747820, + 0x4718: 0x40747a20, 0x4719: 0x40747c20, 0x471a: 0x40747e20, 0x471b: 0x40748020, + 0x471c: 0x40748220, 0x471d: 0x40748420, 0x471e: 0x40748620, 0x471f: 0x40748820, + 0x4720: 0x40748a20, 0x4721: 0x40748c20, 0x4722: 0x40748e20, 0x4723: 0x40749020, + 0x4724: 0x40749220, 0x4725: 0x40749420, 0x4726: 0x40749620, 0x4727: 0x40749820, + 0x4728: 0x40749a20, 0x4729: 0x40749c20, 0x472a: 0x40749e20, 0x472b: 0x4074a020, + 0x472c: 0x4074a220, 0x472d: 0x4074a420, 0x472e: 0x4074a620, 0x472f: 0x4074a820, + 0x4730: 0x4074aa20, 0x4731: 0x4074ac20, 0x4732: 0x4074ae20, 0x4733: 0x4074b020, + 0x4734: 0x4074b220, 0x4735: 0x4074b420, 0x4736: 0x4074b620, 0x4737: 0x4074b820, + 0x4738: 0x4074ba20, 0x4739: 0x4074bc20, 0x473a: 0x4074be20, + // Block 0x11d, offset 0x4740 + 0x4740: 0x4003be20, 0x4741: 0x4003c020, 0x4742: 0x4003c220, + 0x4747: 0xe000026a, + 0x4748: 0xe0000382, 0x4749: 0xe000045c, 0x474a: 0xe0000531, 0x474b: 0xe00005fb, + 0x474c: 0xe00006c6, 0x474d: 0xe000076e, 0x474e: 0xe000081a, 0x474f: 0xe00008bf, + 0x4750: 0x4028ba20, 0x4751: 0x4028bc20, 0x4752: 0x4028be20, 0x4753: 0x4028c020, + 0x4754: 0x4028c220, 0x4755: 0x4028c420, 0x4756: 0x4028c620, 0x4757: 0x4028c820, + 0x4758: 0x4028ca20, 0x4759: 0x4028cc20, 0x475a: 0x4028ce20, 0x475b: 0x4028d020, + 0x475c: 0x4028d220, 0x475d: 0x4028d420, 0x475e: 0x4028d620, 0x475f: 0x4028d820, + 0x4760: 0x4028da20, 0x4761: 0x4028dc20, 0x4762: 0x4028de20, 0x4763: 0x4028e020, + 0x4764: 0x4028e220, 0x4765: 0x4028e420, 0x4766: 0x4028e620, 0x4767: 0x4028e820, + 0x4768: 0x4028ea20, 0x4769: 0x4028ec20, 0x476a: 0x4028ee20, 0x476b: 0x4028f020, + 0x476c: 0x4028f220, 0x476d: 0x4028f420, 0x476e: 0x4028f620, 0x476f: 0x4028f820, + 0x4770: 0x4028fa20, 0x4771: 0x4028fc20, 0x4772: 0x4028fe20, 0x4773: 0x40290020, + 0x4777: 0x401afe20, + 0x4778: 0x401b0020, 0x4779: 0x401b0220, 0x477a: 0x401b0420, 0x477b: 0x401b0620, + 0x477c: 0x401b0820, 0x477d: 0x401b0a20, 0x477e: 0x401b0c20, 0x477f: 0x401b0e20, + // Block 0x11e, offset 0x4780 + 0x4780: 0x40290220, 0x4781: 0x40290420, 0x4782: 0xe000026d, 0x4783: 0xe00005fe, + 0x4784: 0x40290620, 0x4785: 0x40290820, 0x4786: 0x40290a20, 0x4787: 0x40290c20, + 0x4788: 0xe0000601, 0x4789: 0x40290e20, 0x478a: 0x40291020, 0x478b: 0x40291220, + 0x478c: 0x40291420, 0x478d: 0x40291620, 0x478e: 0x40291820, 0x478f: 0xe0000604, + 0x4790: 0x40291a20, 0x4791: 0x40291c20, 0x4792: 0x40291e20, 0x4793: 0x40292020, + 0x4794: 0x40292220, 0x4795: 0x40292420, 0x4796: 0x40292620, 0x4797: 0x40292820, + 0x4798: 0xe0000270, 0x4799: 0xe0000273, 0x479a: 0xe0000276, 0x479b: 0xe0000385, + 0x479c: 0xe0000388, 0x479d: 0xe000038b, 0x479e: 0xe000038e, 0x479f: 0xe0000607, + 0x47a0: 0x40292a20, 0x47a1: 0x40292c20, 0x47a2: 0x40292e20, 0x47a3: 0x40293020, + 0x47a4: 0x40293220, 0x47a5: 0x40293420, 0x47a6: 0x40293620, 0x47a7: 0x40293820, + 0x47a8: 0x40293a20, 0x47a9: 0x40293c20, 0x47aa: 0x40293e20, 0x47ab: 0x40294020, + 0x47ac: 0x40294220, 0x47ad: 0x40294420, 0x47ae: 0x40294620, 0x47af: 0x40294820, + 0x47b0: 0x40294a20, 0x47b1: 0x40294c20, 0x47b2: 0x40294e20, 0x47b3: 0xe000060a, + 0x47b4: 0x40295020, 0x47b5: 0x40295220, 0x47b6: 0x40295420, 0x47b7: 0x40295620, + 0x47b8: 0x40295820, 0x47b9: 0x401b1020, 0x47ba: 0x401b1220, 0x47bb: 0x401b1420, + 0x47bc: 0x401b1620, 0x47bd: 0x401b1820, 0x47be: 0x401b1a20, 0x47bf: 0x401b1c20, + // Block 0x11f, offset 0x47c0 + 0x47c0: 0x401b1e20, 0x47c1: 0x401b2020, 0x47c2: 0x401b2220, 0x47c3: 0x401b2420, + 0x47c4: 0x401b2620, 0x47c5: 0x401b2820, 0x47c6: 0x401b2a20, 0x47c7: 0x401b2c20, + 0x47c8: 0x401b2e20, 0x47c9: 0x401b3020, 0x47ca: 0xe00001d6, + 0x47d0: 0x401b3220, 0x47d1: 0x401b3420, 0x47d2: 0x401b3620, 0x47d3: 0x401b3820, + 0x47d4: 0x401b3a20, 0x47d5: 0x401b3c20, 0x47d6: 0x401b3e20, 0x47d7: 0x401b4020, + 0x47d8: 0x401b4220, 0x47d9: 0x401b4420, 0x47da: 0x401b4620, 0x47db: 0x401b4820, + // Block 0x120, offset 0x4800 + 0x4810: 0x401b4a20, 0x4811: 0x401b4c20, 0x4812: 0x401b4e20, 0x4813: 0x401b5020, + 0x4814: 0x401b5220, 0x4815: 0x401b5420, 0x4816: 0x401b5620, 0x4817: 0x401b5820, + 0x4818: 0x401b5a20, 0x4819: 0x401b5c20, 0x481a: 0x401b5e20, 0x481b: 0x401b6020, + 0x481c: 0x401b6220, 0x481d: 0x401b6420, 0x481e: 0x401b6620, 0x481f: 0x401b6820, + 0x4820: 0x401b6a20, 0x4821: 0x401b6c20, 0x4822: 0x401b6e20, 0x4823: 0x401b7020, + 0x4824: 0x401b7220, 0x4825: 0x401b7420, 0x4826: 0x401b7620, 0x4827: 0x401b7820, + 0x4828: 0x401b7a20, 0x4829: 0x401b7c20, 0x482a: 0x401b7e20, 0x482b: 0x401b8020, + 0x482c: 0x401b8220, 0x482d: 0x401b8420, 0x482e: 0x401b8620, 0x482f: 0x401b8820, + 0x4830: 0x401b8a20, 0x4831: 0x401b8c20, 0x4832: 0x401b8e20, 0x4833: 0x401b9020, + 0x4834: 0x401b9220, 0x4835: 0x401b9420, 0x4836: 0x401b9620, 0x4837: 0x401b9820, + 0x4838: 0x401b9a20, 0x4839: 0x401b9c20, 0x483a: 0x401b9e20, 0x483b: 0x401ba020, + 0x483c: 0x401ba220, 0x483d: 0xadc13802, + // Block 0x121, offset 0x4840 + 0x4840: 0x4070b820, 0x4841: 0x4070ba20, 0x4842: 0x4070bc20, 0x4843: 0x4070be20, + 0x4844: 0x4070c020, 0x4845: 0x4070c220, 0x4846: 0x4070c420, 0x4847: 0x4070c620, + 0x4848: 0x4070c820, 0x4849: 0x4070ca20, 0x484a: 0x4070cc20, 0x484b: 0x4070ce20, + 0x484c: 0x4070d020, 0x484d: 0x4070d220, 0x484e: 0x4070d420, 0x484f: 0x4070d620, + 0x4850: 0x4070d820, 0x4851: 0x4070da20, 0x4852: 0x4070dc20, 0x4853: 0x4070de20, + 0x4854: 0x4070e020, 0x4855: 0x4070e220, 0x4856: 0x4070e420, 0x4857: 0x4070e620, + 0x4858: 0x4070e820, 0x4859: 0x4070ea20, 0x485a: 0x4070ec20, 0x485b: 0x4070ee20, + 0x485c: 0x4070f020, + 0x4860: 0x4070f220, 0x4861: 0x4070f420, 0x4862: 0x4070f620, 0x4863: 0x4070f820, + 0x4864: 0x4070fa20, 0x4865: 0x4070fc20, 0x4866: 0x4070fe20, 0x4867: 0x40710020, + 0x4868: 0x40710220, 0x4869: 0x40710420, 0x486a: 0x40710620, 0x486b: 0x40710820, + 0x486c: 0x40710a20, 0x486d: 0x40710c20, 0x486e: 0x40710e20, 0x486f: 0x40711020, + 0x4870: 0x40711220, 0x4871: 0x40711420, 0x4872: 0x40711620, 0x4873: 0x40711820, + 0x4874: 0x40711a20, 0x4875: 0x40711c20, 0x4876: 0x40711e20, 0x4877: 0x40712020, + 0x4878: 0x40712220, 0x4879: 0x40712420, 0x487a: 0x40712620, 0x487b: 0x40712820, + 0x487c: 0x40712a20, 0x487d: 0x40712c20, 0x487e: 0x40712e20, 0x487f: 0x40713020, + // Block 0x122, offset 0x4880 + 0x4880: 0x40713220, 0x4881: 0x40713420, 0x4882: 0x40713620, 0x4883: 0x40713820, + 0x4884: 0x40713a20, 0x4885: 0x40713c20, 0x4886: 0x40713e20, 0x4887: 0x40714020, + 0x4888: 0x40714220, 0x4889: 0x40714420, 0x488a: 0x40714620, 0x488b: 0x40714820, + 0x488c: 0x40714a20, 0x488d: 0x40714c20, 0x488e: 0x40714e20, 0x488f: 0x40715020, + 0x4890: 0x40715220, + // Block 0x123, offset 0x48c0 + 0x48c0: 0x40718820, 0x48c1: 0x40718a20, 0x48c2: 0x40718c20, 0x48c3: 0x40718e20, + 0x48c4: 0x40719020, 0x48c5: 0x40719220, 0x48c6: 0x40719420, 0x48c7: 0x40719620, + 0x48c8: 0x40719820, 0x48c9: 0x40719a20, 0x48ca: 0x40719c20, 0x48cb: 0x40719e20, + 0x48cc: 0x4071a020, 0x48cd: 0x4071a220, 0x48ce: 0x4071a420, 0x48cf: 0x4071a620, + 0x48d0: 0x4071a820, 0x48d1: 0x4071aa20, 0x48d2: 0x4071ac20, 0x48d3: 0x4071ae20, + 0x48d4: 0x4071b020, 0x48d5: 0x4071b220, 0x48d6: 0x4071b420, 0x48d7: 0x4071b620, + 0x48d8: 0x4071b820, 0x48d9: 0x4071ba20, 0x48da: 0x4071bc20, 0x48db: 0x4071be20, + 0x48dc: 0x4071c020, 0x48dd: 0x4071c220, 0x48de: 0x4071c420, + 0x48e0: 0xe0000279, 0x48e1: 0xe000060d, 0x48e2: 0x4028b620, 0x48e3: 0x4028b820, + 0x48f0: 0x4071c620, 0x48f1: 0x4071c820, 0x48f2: 0x4071ca20, 0x48f3: 0x4071cc20, + 0x48f4: 0x4071ce20, 0x48f5: 0x4071d020, 0x48f6: 0x4071d220, 0x48f7: 0x4071d420, + 0x48f8: 0x4071d620, 0x48f9: 0x4071d820, 0x48fa: 0x4071da20, 0x48fb: 0x4071dc20, + 0x48fc: 0x4071de20, 0x48fd: 0x4071e020, 0x48fe: 0x4071e220, 0x48ff: 0x4071e420, + // Block 0x124, offset 0x4900 + 0x4900: 0x4071e620, 0x4901: 0x4071e820, 0x4902: 0x4071ea20, 0x4903: 0x4071ec20, + 0x4904: 0x4071ee20, 0x4905: 0x4071f020, 0x4906: 0x4071f220, 0x4907: 0x4071f420, + 0x4908: 0x4071f620, 0x4909: 0x4071f820, 0x490a: 0x4071fa20, + // Block 0x125, offset 0x4940 + 0x4940: 0x40765020, 0x4941: 0x40765220, 0x4942: 0x40765420, 0x4943: 0x40765620, + 0x4944: 0x40765820, 0x4945: 0x40765a20, 0x4946: 0x40765c20, 0x4947: 0x40765e20, + 0x4948: 0x40766020, 0x4949: 0x40766220, 0x494a: 0x40766420, 0x494b: 0x40766620, + 0x494c: 0x40766820, 0x494d: 0x40766a20, 0x494e: 0x40766c20, 0x494f: 0x40766e20, + 0x4950: 0x40767020, 0x4951: 0x40767220, 0x4952: 0x40767420, 0x4953: 0x40767620, + 0x4954: 0x40767820, 0x4955: 0x40767a20, 0x4956: 0x40767c20, 0x4957: 0x40767e20, + 0x4958: 0x40768020, 0x4959: 0x40768220, 0x495a: 0x40768420, 0x495b: 0x40768620, + 0x495c: 0x40768820, 0x495d: 0x40768a20, 0x495f: 0x4003c420, + 0x4960: 0x40768c20, 0x4961: 0x40768e20, 0x4962: 0x40769020, 0x4963: 0x40769220, + 0x4964: 0x40769420, 0x4965: 0x40769620, 0x4966: 0x40769820, 0x4967: 0x40769a20, + 0x4968: 0x40769c20, 0x4969: 0x40769e20, 0x496a: 0x4076a020, 0x496b: 0x4076a220, + 0x496c: 0x4076a420, 0x496d: 0x4076a620, 0x496e: 0x4076a820, 0x496f: 0x4076aa20, + 0x4970: 0x4076ac20, 0x4971: 0x4076ae20, 0x4972: 0x4076b020, 0x4973: 0x4076b220, + 0x4974: 0x4076b420, 0x4975: 0x4076b620, 0x4976: 0x4076b820, 0x4977: 0x4076ba20, + 0x4978: 0x4076bc20, 0x4979: 0x4076be20, 0x497a: 0x4076c020, 0x497b: 0x4076c220, + 0x497c: 0x4076c420, 0x497d: 0x4076c620, 0x497e: 0x4076c820, 0x497f: 0x4076ca20, + // Block 0x126, offset 0x4980 + 0x4980: 0x4076cc20, 0x4981: 0x4076ce20, 0x4982: 0x4076d020, 0x4983: 0x4076d220, + 0x4988: 0x4076d420, 0x4989: 0x4076d620, 0x498a: 0x4076d820, 0x498b: 0x4076da20, + 0x498c: 0x4076dc20, 0x498d: 0x4076de20, 0x498e: 0x4076e020, 0x498f: 0x4076e220, + 0x4990: 0x4003c620, 0x4991: 0xe000027c, 0x4992: 0xe0000391, 0x4993: 0x40295a20, + 0x4994: 0x40295c20, 0x4995: 0x40295e20, + // Block 0x127, offset 0x49c0 + 0x49c0: 0x0071fc88, 0x49c1: 0x0071fe88, 0x49c2: 0x00720088, 0x49c3: 0x00720288, + 0x49c4: 0x00720488, 0x49c5: 0x00720688, 0x49c6: 0x00720888, 0x49c7: 0x00720a88, + 0x49c8: 0x00720c88, 0x49c9: 0x00720e88, 0x49ca: 0x00721088, 0x49cb: 0x00721288, + 0x49cc: 0x00721488, 0x49cd: 0x00721688, 0x49ce: 0x00721888, 0x49cf: 0x00721a88, + 0x49d0: 0x00721c88, 0x49d1: 0x00721e88, 0x49d2: 0x00722088, 0x49d3: 0x00722288, + 0x49d4: 0x00722488, 0x49d5: 0x00722688, 0x49d6: 0x00722888, 0x49d7: 0x00722a88, + 0x49d8: 0x00722c88, 0x49d9: 0x00722e88, 0x49da: 0x00723088, 0x49db: 0x00723288, + 0x49dc: 0x00723488, 0x49dd: 0x00723688, 0x49de: 0x00723888, 0x49df: 0x00723a88, + 0x49e0: 0x00723c88, 0x49e1: 0x00723e88, 0x49e2: 0x00724088, 0x49e3: 0x00724288, + 0x49e4: 0x00724488, 0x49e5: 0x00724688, 0x49e6: 0x00724888, 0x49e7: 0x00724a88, + 0x49e8: 0x4071fc20, 0x49e9: 0x4071fe20, 0x49ea: 0x40720020, 0x49eb: 0x40720220, + 0x49ec: 0x40720420, 0x49ed: 0x40720620, 0x49ee: 0x40720820, 0x49ef: 0x40720a20, + 0x49f0: 0x40720c20, 0x49f1: 0x40720e20, 0x49f2: 0x40721020, 0x49f3: 0x40721220, + 0x49f4: 0x40721420, 0x49f5: 0x40721620, 0x49f6: 0x40721820, 0x49f7: 0x40721a20, + 0x49f8: 0x40721c20, 0x49f9: 0x40721e20, 0x49fa: 0x40722020, 0x49fb: 0x40722220, + 0x49fc: 0x40722420, 0x49fd: 0x40722620, 0x49fe: 0x40722820, 0x49ff: 0x40722a20, + // Block 0x128, offset 0x4a00 + 0x4a00: 0x40722c20, 0x4a01: 0x40722e20, 0x4a02: 0x40723020, 0x4a03: 0x40723220, + 0x4a04: 0x40723420, 0x4a05: 0x40723620, 0x4a06: 0x40723820, 0x4a07: 0x40723a20, + 0x4a08: 0x40723c20, 0x4a09: 0x40723e20, 0x4a0a: 0x40724020, 0x4a0b: 0x40724220, + 0x4a0c: 0x40724420, 0x4a0d: 0x40724620, 0x4a0e: 0x40724820, 0x4a0f: 0x40724a20, + 0x4a10: 0x40724c20, 0x4a11: 0x40724e20, 0x4a12: 0x40725020, 0x4a13: 0x40725220, + 0x4a14: 0x40725420, 0x4a15: 0x40725620, 0x4a16: 0x40725820, 0x4a17: 0x40725a20, + 0x4a18: 0x40725c20, 0x4a19: 0x40725e20, 0x4a1a: 0x40726020, 0x4a1b: 0x40726220, + 0x4a1c: 0x40726420, 0x4a1d: 0x40726620, 0x4a1e: 0x40726820, 0x4a1f: 0x40726a20, + 0x4a20: 0x40726c20, 0x4a21: 0x40726e20, 0x4a22: 0x40727020, 0x4a23: 0x40727220, + 0x4a24: 0x40727420, 0x4a25: 0x40727620, 0x4a26: 0x40727820, 0x4a27: 0x40727a20, + 0x4a28: 0x40727c20, 0x4a29: 0x40727e20, 0x4a2a: 0x40728020, 0x4a2b: 0x40728220, + 0x4a2c: 0x40728420, 0x4a2d: 0x40728620, 0x4a2e: 0x40728820, 0x4a2f: 0x40728a20, + 0x4a30: 0x40728c20, 0x4a31: 0x40728e20, 0x4a32: 0x40729020, 0x4a33: 0x40729220, + 0x4a34: 0x40729420, 0x4a35: 0x40729620, 0x4a36: 0x40729820, 0x4a37: 0x40729a20, + 0x4a38: 0x40729c20, 0x4a39: 0x40729e20, 0x4a3a: 0x4072a020, 0x4a3b: 0x4072a220, + 0x4a3c: 0x4072a420, 0x4a3d: 0x4072a620, 0x4a3e: 0x4072a820, 0x4a3f: 0x4072aa20, + // Block 0x129, offset 0x4a40 + 0x4a40: 0x4072ac20, 0x4a41: 0x4072ae20, 0x4a42: 0x4072b020, 0x4a43: 0x4072b220, + 0x4a44: 0x4072b420, 0x4a45: 0x4072b620, 0x4a46: 0x4072b820, 0x4a47: 0x4072ba20, + 0x4a48: 0x4072bc20, 0x4a49: 0x4072be20, 0x4a4a: 0x4072c020, 0x4a4b: 0x4072c220, + 0x4a4c: 0x4072c420, 0x4a4d: 0x4072c620, 0x4a4e: 0x4072c820, 0x4a4f: 0x4072ca20, + 0x4a50: 0x4072cc20, 0x4a51: 0x4072ce20, 0x4a52: 0x4072d020, 0x4a53: 0x4072d220, + 0x4a54: 0x4072d420, 0x4a55: 0x4072d620, 0x4a56: 0x4072d820, 0x4a57: 0x4072da20, + 0x4a58: 0x4072dc20, 0x4a59: 0x4072de20, 0x4a5a: 0x4072e020, 0x4a5b: 0x4072e220, + 0x4a5c: 0x4072e420, 0x4a5d: 0x4072e620, + 0x4a60: 0xe0000167, 0x4a61: 0xe00001f5, 0x4a62: 0xe0000310, 0x4a63: 0xe00003ea, + 0x4a64: 0xe00004c5, 0x4a65: 0xe000058f, 0x4a66: 0xe000065a, 0x4a67: 0xe0000702, + 0x4a68: 0xe00007ae, 0x4a69: 0xe0000853, + // Block 0x12a, offset 0x4a80 + 0x4a80: 0x4074c020, 0x4a81: 0x4074c220, 0x4a82: 0x4074c420, 0x4a83: 0x4074c620, + 0x4a84: 0x4074c820, 0x4a85: 0x4074ca20, + 0x4a88: 0x4074cc20, 0x4a8a: 0x4074ce20, 0x4a8b: 0x4074d020, + 0x4a8c: 0x4074d220, 0x4a8d: 0x4074d420, 0x4a8e: 0x4074d620, 0x4a8f: 0x4074d820, + 0x4a90: 0x4074da20, 0x4a91: 0x4074dc20, 0x4a92: 0x4074de20, 0x4a93: 0x4074e020, + 0x4a94: 0x4074e220, 0x4a95: 0x4074e420, 0x4a96: 0x4074e620, 0x4a97: 0x4074e820, + 0x4a98: 0x4074ea20, 0x4a99: 0x4074ec20, 0x4a9a: 0x4074ee20, 0x4a9b: 0x4074f020, + 0x4a9c: 0x4074f220, 0x4a9d: 0x4074f420, 0x4a9e: 0x4074f620, 0x4a9f: 0x4074f820, + 0x4aa0: 0x4074fa20, 0x4aa1: 0x4074fc20, 0x4aa2: 0x4074fe20, 0x4aa3: 0x40750020, + 0x4aa4: 0x40750220, 0x4aa5: 0x40750420, 0x4aa6: 0x40750620, 0x4aa7: 0x40750820, + 0x4aa8: 0x40750a20, 0x4aa9: 0x40750c20, 0x4aaa: 0x40750e20, 0x4aab: 0x40751020, + 0x4aac: 0x40751220, 0x4aad: 0x40751420, 0x4aae: 0x40751620, 0x4aaf: 0x40751820, + 0x4ab0: 0x40751a20, 0x4ab1: 0x40751c20, 0x4ab2: 0x40751e20, 0x4ab3: 0x40752020, + 0x4ab4: 0x40752220, 0x4ab5: 0x40752420, 0x4ab7: 0x40752620, + 0x4ab8: 0x40752820, + 0x4abc: 0x40752a20, 0x4abf: 0x40752c20, + // Block 0x12b, offset 0x4ac0 + 0x4ac0: 0x4075d220, 0x4ac1: 0x4075d420, 0x4ac2: 0x4075d620, 0x4ac3: 0x4075d820, + 0x4ac4: 0x4075da20, 0x4ac5: 0x4075dc20, 0x4ac6: 0x4075de20, 0x4ac7: 0x4075e020, + 0x4ac8: 0x4075e220, 0x4ac9: 0x4075e420, 0x4aca: 0x4075e620, 0x4acb: 0x4075e820, + 0x4acc: 0x4075ea20, 0x4acd: 0x4075ec20, 0x4ace: 0x4075ee20, 0x4acf: 0x4075f020, + 0x4ad0: 0x4075f220, 0x4ad1: 0x4075f420, 0x4ad2: 0x4075f620, 0x4ad3: 0x4075f820, + 0x4ad4: 0x4075fa20, 0x4ad5: 0x4075fc20, 0x4ad7: 0x40038620, + 0x4ad8: 0xe0000297, 0x4ad9: 0xe00003b2, 0x4ada: 0xe000048c, 0x4adb: 0x40296820, + 0x4adc: 0x40296a20, 0x4add: 0x40296c20, 0x4ade: 0x40296e20, 0x4adf: 0x40297020, + // Block 0x12c, offset 0x4b00 + 0x4b00: 0x4038bc20, 0x4b01: 0x4038be20, 0x4b02: 0x4038c020, 0x4b03: 0x4038c220, + 0x4b04: 0x4038c420, 0x4b05: 0x4038c620, 0x4b06: 0x4038c820, 0x4b07: 0x4038ca20, + 0x4b08: 0x4038cc20, 0x4b09: 0x4038ce20, 0x4b0a: 0x4038d020, 0x4b0b: 0x4038d220, + 0x4b0c: 0x4038d420, 0x4b0d: 0x4038d620, 0x4b0e: 0x4038d820, 0x4b0f: 0x4038da20, + 0x4b10: 0x4038dc20, 0x4b11: 0x4038de20, 0x4b12: 0x4038e020, 0x4b13: 0x4038e220, + 0x4b14: 0x4038e420, 0x4b15: 0x4038e620, 0x4b16: 0xe0000294, 0x4b17: 0x40296220, + 0x4b18: 0x40296420, 0x4b19: 0x40296620, 0x4b1a: 0xe00003af, 0x4b1b: 0xe0000489, + 0x4b1f: 0x4003c820, + 0x4b20: 0x40715420, 0x4b21: 0x40715620, 0x4b22: 0x40715820, 0x4b23: 0x40715a20, + 0x4b24: 0x40715c20, 0x4b25: 0x40715e20, 0x4b26: 0x40716020, 0x4b27: 0x40716220, + 0x4b28: 0x40716420, 0x4b29: 0x40716620, 0x4b2a: 0x40716820, 0x4b2b: 0x40716a20, + 0x4b2c: 0x40716c20, 0x4b2d: 0x40716e20, 0x4b2e: 0x40717020, 0x4b2f: 0x40717220, + 0x4b30: 0x40717420, 0x4b31: 0x40717620, 0x4b32: 0x40717820, 0x4b33: 0x40717a20, + 0x4b34: 0x40717c20, 0x4b35: 0x40717e20, 0x4b36: 0x40718020, 0x4b37: 0x40718220, + 0x4b38: 0x40718420, 0x4b39: 0x40718620, + 0x4b3f: 0x4003bc20, + // Block 0x12d, offset 0x4b40 + 0x4b40: 0xe00023a4, 0x4b41: 0xe00023a7, 0x4b42: 0xe00023aa, 0x4b43: 0xe00023ad, + 0x4b44: 0xe00023b0, 0x4b45: 0xe00023b3, 0x4b46: 0xe00023b6, 0x4b47: 0xe00023b9, + 0x4b48: 0xe00023bc, 0x4b49: 0xe00023bf, 0x4b4a: 0xe00023c2, 0x4b4b: 0xe00023c5, + 0x4b4c: 0xe00023c8, 0x4b4d: 0xe00023cb, 0x4b4e: 0xe00023ce, 0x4b4f: 0xe00023d1, + 0x4b50: 0xe00023d4, 0x4b51: 0xe00023d7, 0x4b52: 0xe00023da, 0x4b53: 0xe00023e0, + 0x4b54: 0xe00023e3, 0x4b55: 0xe00023e6, 0x4b56: 0xe00023e9, 0x4b57: 0xe00023ec, + 0x4b58: 0xe00023ef, 0x4b59: 0xe00023f2, 0x4b5a: 0xe00023f5, 0x4b5b: 0xe00023f8, + 0x4b5c: 0xe00023fb, 0x4b5d: 0xe00023fe, 0x4b5e: 0x40865220, 0x4b5f: 0x40865420, + 0x4b60: 0x40862020, 0x4b61: 0x40862220, 0x4b62: 0x40862420, 0x4b63: 0x40862620, + 0x4b64: 0x40862820, 0x4b65: 0x40862a20, 0x4b66: 0x40862c20, 0x4b67: 0x40862e20, + 0x4b68: 0x40863020, 0x4b69: 0x40863220, 0x4b6a: 0x40863420, 0x4b6b: 0x40863620, + 0x4b6c: 0x40863820, 0x4b6d: 0x40863a20, 0x4b6e: 0x40863c20, 0x4b6f: 0x40863e20, + 0x4b70: 0xe00023dd, 0x4b71: 0x40864020, 0x4b72: 0x40864220, 0x4b73: 0x40864420, + 0x4b74: 0x40864620, 0x4b75: 0x40864820, 0x4b76: 0x40864a20, 0x4b77: 0x40864c20, + 0x4b7e: 0x40864e20, 0x4b7f: 0x40865020, + // Block 0x12e, offset 0x4b80 + 0x4b80: 0x4048bc20, 0x4b81: 0x4048be20, 0x4b82: 0x4048c020, 0x4b83: 0x4048c220, + 0x4b85: 0x4048c420, 0x4b86: 0x4048c620, + 0x4b8c: 0x4048c820, 0x4b8d: 0xadc06002, 0x4b8e: 0xa000f302, 0x4b8f: 0xae60f402, + 0x4b90: 0x4048ca20, 0x4b91: 0x4048cc20, 0x4b92: 0x4048ce20, 0x4b93: 0x4048d020, + 0x4b95: 0x4048d220, 0x4b96: 0x4048d420, 0x4b97: 0x4048d620, + 0x4b99: 0x4048d820, 0x4b9a: 0x4048da20, 0x4b9b: 0x4048dc20, + 0x4b9c: 0x4048de20, 0x4b9d: 0x4048e020, 0x4b9e: 0x4048e220, 0x4b9f: 0x4048e420, + 0x4ba0: 0x4048e620, 0x4ba1: 0x4048e820, 0x4ba2: 0x4048ea20, 0x4ba3: 0x4048ec20, + 0x4ba4: 0x4048ee20, 0x4ba5: 0x4048f020, 0x4ba6: 0x4048f220, 0x4ba7: 0x4048f420, + 0x4ba8: 0x4048f620, 0x4ba9: 0x4048f820, 0x4baa: 0x4048fa20, 0x4bab: 0x4048fc20, + 0x4bac: 0x4048fe20, 0x4bad: 0x40490020, 0x4bae: 0x40490220, 0x4baf: 0x40490420, + 0x4bb0: 0x40490620, 0x4bb1: 0x40490820, 0x4bb2: 0x40490a20, 0x4bb3: 0x40490c20, + 0x4bb8: 0xae60fb02, 0x4bb9: 0xa010fc02, 0x4bba: 0xadc0fd02, + 0x4bbf: 0x82092487, + // Block 0x12f, offset 0x4bc0 + 0x4bc0: 0xe00002ac, 0x4bc1: 0xe00003c7, 0x4bc2: 0xe00004a1, 0x4bc3: 0xe0000573, + 0x4bc4: 0x40299820, 0x4bc5: 0x40299a20, 0x4bc6: 0x40299c20, 0x4bc7: 0x40299e20, + 0x4bd0: 0x40060620, 0x4bd1: 0x40060820, 0x4bd2: 0x40060a20, 0x4bd3: 0x40060c20, + 0x4bd4: 0x40060e20, 0x4bd5: 0x40061020, 0x4bd6: 0x40034420, 0x4bd7: 0x40034620, + 0x4bd8: 0x40061220, + 0x4be0: 0x40752e20, 0x4be1: 0x40753020, 0x4be2: 0x40753220, 0x4be3: 0x40753420, + 0x4be4: 0x40753620, 0x4be5: 0x40753820, 0x4be6: 0x40753a20, 0x4be7: 0x40753c20, + 0x4be8: 0x40753e20, 0x4be9: 0x40754020, 0x4bea: 0x40754220, 0x4beb: 0x40754420, + 0x4bec: 0x40754620, 0x4bed: 0x40754820, 0x4bee: 0x40754a20, 0x4bef: 0x40754c20, + 0x4bf0: 0x40754e20, 0x4bf1: 0x40755020, 0x4bf2: 0x40755220, 0x4bf3: 0x40755420, + 0x4bf4: 0x40755620, 0x4bf5: 0x40755820, 0x4bf6: 0x40755a20, 0x4bf7: 0x40755c20, + 0x4bf8: 0x40755e20, 0x4bf9: 0x40756020, 0x4bfa: 0x40756220, 0x4bfb: 0x40756420, + 0x4bfc: 0x40756620, 0x4bfd: 0xe0000291, 0x4bfe: 0x40296020, 0x4bff: 0x40061c20, + // Block 0x130, offset 0x4c00 + 0x4c00: 0x40756820, 0x4c01: 0x40756a20, 0x4c02: 0x40756c20, 0x4c03: 0x40756e20, + 0x4c04: 0x40757020, 0x4c05: 0x40757220, 0x4c06: 0x40757420, 0x4c07: 0x40757620, + 0x4c08: 0x40757820, 0x4c09: 0x40757a20, 0x4c0a: 0x40757c20, 0x4c0b: 0x40757e20, + 0x4c0c: 0x40758020, 0x4c0d: 0x40758220, 0x4c0e: 0x40758420, 0x4c0f: 0x40758620, + 0x4c10: 0x40758820, 0x4c11: 0x40758a20, 0x4c12: 0x40758c20, 0x4c13: 0x40758e20, + 0x4c14: 0x40759020, 0x4c15: 0x40759220, 0x4c16: 0x40759420, 0x4c17: 0x40759620, + 0x4c18: 0x40759820, 0x4c19: 0x40759a20, 0x4c1a: 0x40759c20, 0x4c1b: 0x40759e20, + 0x4c1c: 0x4075a020, 0x4c1d: 0x4075a220, 0x4c1e: 0x4075a420, 0x4c1f: 0x4075a620, + 0x4c20: 0x4075a820, 0x4c21: 0x4075aa20, 0x4c22: 0x4075ac20, 0x4c23: 0x4075ae20, + 0x4c24: 0x4075b020, 0x4c25: 0x4075b220, 0x4c26: 0x4075b420, 0x4c27: 0x4075b620, + 0x4c28: 0x4075b820, 0x4c29: 0x4075ba20, 0x4c2a: 0x4075bc20, 0x4c2b: 0x4075be20, + 0x4c2c: 0x4075c020, 0x4c2d: 0x4075c220, 0x4c2e: 0xe00023a1, 0x4c2f: 0x4075c420, + 0x4c30: 0x4075c620, 0x4c31: 0x4075c820, 0x4c32: 0x4075ca20, 0x4c33: 0x4075cc20, + 0x4c34: 0x4075ce20, 0x4c35: 0x4075d020, + 0x4c39: 0x40061420, 0x4c3a: 0x40038820, 0x4c3b: 0x40038a20, + 0x4c3c: 0x40038c20, 0x4c3d: 0x40038e20, 0x4c3e: 0x40039020, 0x4c3f: 0x40039220, + // Block 0x131, offset 0x4c40 + 0x4c40: 0x4075fe20, 0x4c41: 0x40760020, 0x4c42: 0x40760220, 0x4c43: 0x40760420, + 0x4c44: 0x40760620, 0x4c45: 0x40760820, 0x4c46: 0x40760a20, 0x4c47: 0x40760c20, + 0x4c48: 0x40760e20, 0x4c49: 0x40761020, 0x4c4a: 0x40761220, 0x4c4b: 0x40761420, + 0x4c4c: 0x40761620, 0x4c4d: 0x40761820, 0x4c4e: 0x40761a20, 0x4c4f: 0x40761c20, + 0x4c50: 0x40761e20, 0x4c51: 0x40762020, 0x4c52: 0x40762220, 0x4c53: 0x40762420, + 0x4c54: 0x40762620, 0x4c55: 0x40762820, + 0x4c58: 0xe000029a, 0x4c59: 0xe00003b5, 0x4c5a: 0xe000048f, 0x4c5b: 0xe0000561, + 0x4c5c: 0x40297220, 0x4c5d: 0x40297420, 0x4c5e: 0x40297620, 0x4c5f: 0x40297820, + 0x4c60: 0x40762a20, 0x4c61: 0x40762c20, 0x4c62: 0x40762e20, 0x4c63: 0x40763020, + 0x4c64: 0x40763220, 0x4c65: 0x40763420, 0x4c66: 0x40763620, 0x4c67: 0x40763820, + 0x4c68: 0x40763a20, 0x4c69: 0x40763c20, 0x4c6a: 0x40763e20, 0x4c6b: 0x40764020, + 0x4c6c: 0x40764220, 0x4c6d: 0x40764420, 0x4c6e: 0x40764620, 0x4c6f: 0x40764820, + 0x4c70: 0x40764a20, 0x4c71: 0x40764c20, 0x4c72: 0x40764e20, + 0x4c78: 0xe000029d, 0x4c79: 0xe00003b8, 0x4c7a: 0xe0000492, 0x4c7b: 0xe0000564, + 0x4c7c: 0x40297a20, 0x4c7d: 0x40297c20, 0x4c7e: 0x40297e20, 0x4c7f: 0x40298020, + // Block 0x132, offset 0x4c80 + 0x4c80: 0x405b2620, 0x4c81: 0xe00020a7, 0x4c82: 0x405b2820, 0x4c83: 0x405b2a20, + 0x4c84: 0xe00020aa, 0x4c85: 0x405b2c20, 0x4c86: 0x405b2e20, 0x4c87: 0x405b3020, + 0x4c88: 0xe00020ad, 0x4c89: 0x405b3220, 0x4c8a: 0xe00020b0, 0x4c8b: 0x405b3420, + 0x4c8c: 0xe00020b3, 0x4c8d: 0x405b3620, 0x4c8e: 0xe00020b6, 0x4c8f: 0x405b3820, + 0x4c90: 0xe00020b9, 0x4c91: 0x405b3a20, 0x4c92: 0xe00020bc, 0x4c93: 0x405b3c20, + 0x4c94: 0x405b3e20, 0x4c95: 0xe00020bf, 0x4c96: 0x405b4020, 0x4c97: 0xe00020c2, + 0x4c98: 0x405b4220, 0x4c99: 0xe00020c5, 0x4c9a: 0x405b4420, 0x4c9b: 0xe00020c8, + 0x4c9c: 0x405b4620, 0x4c9d: 0xe00020cb, 0x4c9e: 0x405b4820, 0x4c9f: 0xe00020ce, + 0x4ca0: 0x405b4a20, 0x4ca1: 0x405b4c20, 0x4ca2: 0x405b4e20, 0x4ca3: 0x405b5020, + 0x4ca4: 0x405b5220, 0x4ca5: 0xe00020d1, 0x4ca6: 0x405b5420, 0x4ca7: 0xe00020d4, + 0x4ca8: 0x405b5620, 0x4ca9: 0xe00020d7, 0x4caa: 0x405b5820, 0x4cab: 0xe00020da, + 0x4cac: 0x405b5a20, 0x4cad: 0x405b5c20, 0x4cae: 0xe00020dd, 0x4caf: 0x405b5e20, + 0x4cb0: 0x405b6020, 0x4cb1: 0x405b6220, 0x4cb2: 0x405b6420, 0x4cb3: 0xe00020e0, + 0x4cb4: 0x405b6620, 0x4cb5: 0xe00020e3, 0x4cb6: 0x405b6820, 0x4cb7: 0xe00020e6, + 0x4cb8: 0x405b6a20, 0x4cb9: 0xe00020e9, 0x4cba: 0x405b6c20, 0x4cbb: 0xe00020ec, + 0x4cbc: 0x405b6e20, 0x4cbd: 0x405b7020, 0x4cbe: 0x405b7220, 0x4cbf: 0x405b7420, + // Block 0x133, offset 0x4cc0 + 0x4cc0: 0xe00020ef, 0x4cc1: 0x405b7620, 0x4cc2: 0xe00020f2, 0x4cc3: 0x405b7820, + 0x4cc4: 0xe00020f5, 0x4cc5: 0x405b7a20, 0x4cc6: 0xe00020f8, 0x4cc7: 0x405b7c20, + 0x4cc8: 0x405b7e20, + // Block 0x134, offset 0x4d00 + 0x4d20: 0xe00001ec, 0x4d21: 0xe0000307, 0x4d22: 0xe00003e1, 0x4d23: 0xe00004bc, + 0x4d24: 0xe0000586, 0x4d25: 0xe0000651, 0x4d26: 0xe00006f9, 0x4d27: 0xe00007a5, + 0x4d28: 0xe000084a, 0x4d29: 0x40288820, 0x4d2a: 0x40288a20, 0x4d2b: 0x40288c20, + 0x4d2c: 0x40288e20, 0x4d2d: 0x40289020, 0x4d2e: 0x40289220, 0x4d2f: 0x40289420, + 0x4d30: 0x40289620, 0x4d31: 0x40289820, 0x4d32: 0x40289a20, 0x4d33: 0x40289c20, + 0x4d34: 0x40289e20, 0x4d35: 0x4028a020, 0x4d36: 0x4028a220, 0x4d37: 0x4028a420, + 0x4d38: 0x4028a620, 0x4d39: 0x4028a820, 0x4d3a: 0x4028aa20, 0x4d3b: 0x4028ac20, + 0x4d3c: 0x4028ae20, 0x4d3d: 0x4028b020, 0x4d3e: 0x4028b220, + // Block 0x135, offset 0x4d40 + 0x4d40: 0xa000f202, 0x4d41: 0xa000f302, 0x4d42: 0xa000f402, 0x4d43: 0x40489220, + 0x4d44: 0x40489420, 0x4d45: 0x40483420, 0x4d46: 0x40483620, 0x4d47: 0x40483820, + 0x4d48: 0x40483a20, 0x4d49: 0x40483c20, 0x4d4a: 0x40483e20, 0x4d4b: 0x40484020, + 0x4d4c: 0x40484220, 0x4d4d: 0x40484420, 0x4d4e: 0x40484620, 0x4d4f: 0x40484820, + 0x4d50: 0x40484a20, 0x4d51: 0x40484c20, 0x4d52: 0x40484e20, 0x4d53: 0x40485020, + 0x4d54: 0x40485220, 0x4d55: 0x40485420, 0x4d56: 0x40485620, 0x4d57: 0x40485820, + 0x4d58: 0x40485a20, 0x4d59: 0x40485c20, 0x4d5a: 0x40485e20, 0x4d5b: 0x40486020, + 0x4d5c: 0x40486220, 0x4d5d: 0x40486420, 0x4d5e: 0x40486620, 0x4d5f: 0x40486820, + 0x4d60: 0x40486a20, 0x4d61: 0x40486c20, 0x4d62: 0x40486e20, 0x4d63: 0x40487020, + 0x4d64: 0x40487220, 0x4d65: 0x40487420, 0x4d66: 0x40487620, 0x4d67: 0x40487820, + 0x4d68: 0x40487a20, 0x4d69: 0x40487c20, 0x4d6a: 0x40487e20, 0x4d6b: 0x40488020, + 0x4d6c: 0x40488220, 0x4d6d: 0x40488420, 0x4d6e: 0x40488620, 0x4d6f: 0x40488820, + 0x4d70: 0x40488a20, 0x4d71: 0x40488c20, 0x4d72: 0x40488e20, 0x4d73: 0x40489020, + 0x4d74: 0x40489620, 0x4d75: 0x40489820, 0x4d76: 0x40489a20, 0x4d77: 0x40489c20, + 0x4d78: 0x40489e20, 0x4d79: 0x4048a020, 0x4d7a: 0x4048a220, 0x4d7b: 0x4048a420, + 0x4d7c: 0x4048a620, 0x4d7d: 0x4048a820, 0x4d7e: 0x4048aa20, 0x4d7f: 0x4048ac20, + // Block 0x136, offset 0x4d80 + 0x4d80: 0x4048ae20, 0x4d81: 0x4048b020, 0x4d82: 0x4048b220, 0x4d83: 0x4048b420, + 0x4d84: 0x4048b620, 0x4d85: 0x4048b820, 0x4d86: 0x8209245d, 0x4d87: 0x40034820, + 0x4d88: 0x40034a20, 0x4d89: 0x4005fc20, 0x4d8a: 0x4005fe20, 0x4d8b: 0x40060020, + 0x4d8c: 0x40060220, 0x4d8d: 0x40060420, + 0x4d92: 0xe00002a9, 0x4d93: 0xe00003c4, + 0x4d94: 0xe000049e, 0x4d95: 0xe0000570, 0x4d96: 0xe000063a, 0x4d97: 0xe00006ea, + 0x4d98: 0xe0000792, 0x4d99: 0xe000083b, 0x4d9a: 0xe00008e6, 0x4d9b: 0x40298220, + 0x4d9c: 0x40298420, 0x4d9d: 0x40298620, 0x4d9e: 0x40298820, 0x4d9f: 0x40298a20, + 0x4da0: 0x40298c20, 0x4da1: 0x40298e20, 0x4da2: 0x40299020, 0x4da3: 0x40299220, + 0x4da4: 0x40299420, 0x4da5: 0x40299620, 0x4da6: 0xe00001df, 0x4da7: 0xe00002a6, + 0x4da8: 0xe00003c1, 0x4da9: 0xe000049b, 0x4daa: 0xe000056d, 0x4dab: 0xe0000637, + 0x4dac: 0xe00006e7, 0x4dad: 0xe000078f, 0x4dae: 0xe0000838, 0x4daf: 0xe00008e3, + // Block 0x137, offset 0x4dc0 + 0x4dc0: 0xa000f202, 0x4dc1: 0xa000f302, 0x4dc2: 0xa000f402, 0x4dc3: 0x40467e20, + 0x4dc4: 0x40468020, 0x4dc5: 0x40468220, 0x4dc6: 0x40468420, 0x4dc7: 0x40468620, + 0x4dc8: 0x40468820, 0x4dc9: 0x40468a20, 0x4dca: 0x40468c20, 0x4dcb: 0x40468e20, + 0x4dcc: 0x40469020, 0x4dcd: 0x40469220, 0x4dce: 0x40469420, 0x4dcf: 0x40469620, + 0x4dd0: 0x40469820, 0x4dd1: 0x40469a20, 0x4dd2: 0x40469c20, 0x4dd3: 0x40469e20, + 0x4dd4: 0x4046a020, 0x4dd5: 0x4046a220, 0x4dd6: 0x4046a420, 0x4dd7: 0x4046a620, + 0x4dd8: 0x4046a820, 0x4dd9: 0x4046aa20, 0x4dda: 0xe0001878, 0x4ddb: 0x4046ac20, + 0x4ddc: 0xe000187b, 0x4ddd: 0x4046ae20, 0x4dde: 0x4046b020, 0x4ddf: 0x4046b220, + 0x4de0: 0x4046b420, 0x4de1: 0x4046b620, 0x4de2: 0x4046b820, 0x4de3: 0x4046ba20, + 0x4de4: 0x4046bc20, 0x4de5: 0x4046be20, 0x4de6: 0x4046c020, 0x4de7: 0x4046c220, + 0x4de8: 0x4046c420, 0x4de9: 0x4046c620, 0x4dea: 0x4046c820, 0x4deb: 0xe000187e, + 0x4dec: 0x4046ca20, 0x4ded: 0x4046cc20, 0x4dee: 0x4046ce20, 0x4def: 0x4046d020, + 0x4df0: 0x4046d220, 0x4df1: 0x4046d420, 0x4df2: 0x4046d620, 0x4df3: 0x4046d820, + 0x4df4: 0x4046da20, 0x4df5: 0x4046dc20, 0x4df6: 0x4046de20, 0x4df7: 0x4046e020, + 0x4df8: 0x4046e220, 0x4df9: 0x82092372, 0x4dfa: 0xa070f102, 0x4dfb: 0x40061620, + 0x4dfc: 0x40061820, 0x4dfd: 0xa0000000, 0x4dfe: 0x40039420, 0x4dff: 0x40039620, + // Block 0x138, offset 0x4e00 + 0x4e00: 0x40034c20, 0x4e01: 0x40034e20, + 0x4e10: 0x4072e820, 0x4e11: 0x4072ea20, 0x4e12: 0x4072ec20, 0x4e13: 0x4072ee20, + 0x4e14: 0x4072f020, 0x4e15: 0x4072f220, 0x4e16: 0x4072f420, 0x4e17: 0x4072f620, + 0x4e18: 0x4072f820, 0x4e19: 0x4072fa20, 0x4e1a: 0x4072fc20, 0x4e1b: 0x4072fe20, + 0x4e1c: 0x40730020, 0x4e1d: 0x40730220, 0x4e1e: 0x40730420, 0x4e1f: 0x40730620, + 0x4e20: 0x40730820, 0x4e21: 0x40730a20, 0x4e22: 0x40730c20, 0x4e23: 0x40730e20, + 0x4e24: 0x40731020, 0x4e25: 0x40731220, 0x4e26: 0x40731420, 0x4e27: 0x40731620, + 0x4e28: 0x40731820, + 0x4e30: 0xe00001d0, 0x4e31: 0xe0000264, 0x4e32: 0xe000037c, 0x4e33: 0xe0000456, + 0x4e34: 0xe000052b, 0x4e35: 0xe00005f5, 0x4e36: 0xe00006c0, 0x4e37: 0xe0000768, + 0x4e38: 0xe0000814, 0x4e39: 0xe00008b9, + // Block 0x139, offset 0x4e40 + 0x4e40: 0xae60f202, 0x4e41: 0xae60f302, 0x4e42: 0xae60f402, 0x4e43: 0x404f4020, + 0x4e44: 0x404f4220, 0x4e45: 0x404f4420, 0x4e46: 0x404f4620, 0x4e47: 0x404f4820, + 0x4e48: 0x404f4a20, 0x4e49: 0x404f4c20, 0x4e4a: 0x404f4e20, 0x4e4b: 0x404f5020, + 0x4e4c: 0x404f5220, 0x4e4d: 0x404f5420, 0x4e4e: 0x404f5620, 0x4e4f: 0x404f5820, + 0x4e50: 0x404f5a20, 0x4e51: 0x404f5c20, 0x4e52: 0x404f5e20, 0x4e53: 0x404f6020, + 0x4e54: 0x404f6220, 0x4e55: 0x404f6420, 0x4e56: 0x404f6620, 0x4e57: 0x404f6820, + 0x4e58: 0x404f6a20, 0x4e59: 0x404f6c20, 0x4e5a: 0x404f6e20, 0x4e5b: 0x404f7020, + 0x4e5c: 0x404f7220, 0x4e5d: 0x404f7420, 0x4e5e: 0x404f7620, 0x4e5f: 0x404f7820, + 0x4e60: 0x404f7a20, 0x4e61: 0x404f7c20, 0x4e62: 0x404f7e20, 0x4e63: 0x404f8020, + 0x4e64: 0x404f8220, 0x4e65: 0x404f8420, 0x4e66: 0x404f8620, 0x4e67: 0x404f8820, + 0x4e68: 0x404f8a20, 0x4e69: 0x404f8c20, 0x4e6a: 0x404f8e20, 0x4e6b: 0x404f9020, + 0x4e6c: 0x404f9220, 0x4e6d: 0x404f9420, 0x4e6e: 0x404f9620, 0x4e6f: 0x404f9820, + 0x4e70: 0x404f9a20, 0x4e71: 0xc31507e1, 0x4e72: 0xc31707e1, 0x4e73: 0x820927d0, + 0x4e74: 0x820927d1, 0x4e76: 0xe00001b2, 0x4e77: 0xe0000246, + 0x4e78: 0xe000035e, 0x4e79: 0xe0000438, 0x4e7a: 0xe000050d, 0x4e7b: 0xe00005d7, + 0x4e7c: 0xe00006a2, 0x4e7d: 0xe000074a, 0x4e7e: 0xe00007f6, 0x4e7f: 0xe000089b, + // Block 0x13a, offset 0x4e80 + 0x4e80: 0x40039820, 0x4e81: 0x40035020, 0x4e82: 0x40035220, 0x4e83: 0x4002de20, + // Block 0x13b, offset 0x4ec0 + 0x4ec0: 0xa000f202, 0x4ec1: 0xa000f302, 0x4ec2: 0xa000f402, 0x4ec3: 0x4046e820, + 0x4ec4: 0x4046ea20, 0x4ec5: 0x4046ec20, 0x4ec6: 0x4046ee20, 0x4ec7: 0x4046f020, + 0x4ec8: 0x4046f220, 0x4ec9: 0x4046f420, 0x4eca: 0x4046f620, 0x4ecb: 0x4046f820, + 0x4ecc: 0x4046fa20, 0x4ecd: 0x4046fc20, 0x4ece: 0x4046fe20, 0x4ecf: 0x40470020, + 0x4ed0: 0x40470220, 0x4ed1: 0x40470420, 0x4ed2: 0x40470620, 0x4ed3: 0x40470820, + 0x4ed4: 0x40470a20, 0x4ed5: 0x40470c20, 0x4ed6: 0x40470e20, 0x4ed7: 0x40471020, + 0x4ed8: 0x40471220, 0x4ed9: 0x40471420, 0x4eda: 0x40471620, 0x4edb: 0x40471820, + 0x4edc: 0x40471a20, 0x4edd: 0x40471c20, 0x4ede: 0x40471e20, 0x4edf: 0x40472020, + 0x4ee0: 0x40472220, 0x4ee1: 0x40472420, 0x4ee2: 0x40472620, 0x4ee3: 0x40472820, + 0x4ee4: 0x40472a20, 0x4ee5: 0x40472c20, 0x4ee6: 0x40472e20, 0x4ee7: 0x40473020, + 0x4ee8: 0x40473220, 0x4ee9: 0x40473420, 0x4eea: 0x40473620, 0x4eeb: 0x40473820, + 0x4eec: 0x40473a20, 0x4eed: 0x40473c20, 0x4eee: 0x40473e20, 0x4eef: 0x40474020, + 0x4ef0: 0x40474220, 0x4ef1: 0x40474420, 0x4ef2: 0x40474620, 0x4ef3: 0x40474820, + 0x4ef4: 0x40474a20, 0x4ef5: 0x40474c20, 0x4ef6: 0x40474e20, 0x4ef7: 0x40475020, + 0x4ef8: 0x40475220, 0x4ef9: 0x40475420, 0x4efa: 0x40475620, 0x4efb: 0x40475820, + 0x4efc: 0x40475a20, 0x4efd: 0x40475c20, 0x4efe: 0x40475e20, 0x4eff: 0x40476020, + // Block 0x13c, offset 0x4f00 + 0x4f00: 0x820923b1, 0x4f01: 0x40476420, 0x4f02: 0x40476620, 0x4f03: 0x40476820, + 0x4f04: 0x4046e620, 0x4f05: 0x40035420, 0x4f06: 0x40035620, 0x4f07: 0x40061a20, + 0x4f08: 0x40039a20, + 0x4f10: 0xe00001d9, 0x4f11: 0xe00002a0, 0x4f12: 0xe00003bb, 0x4f13: 0xe0000495, + 0x4f14: 0xe0000567, 0x4f15: 0xe0000631, 0x4f16: 0xe00006e1, 0x4f17: 0xe0000789, + 0x4f18: 0xe0000832, 0x4f19: 0xe00008dd, + // Block 0x13d, offset 0x4f40 + 0x4f40: 0x40476a20, 0x4f41: 0x40476c20, 0x4f42: 0x40476e20, 0x4f43: 0x40477020, + 0x4f44: 0x40477220, 0x4f45: 0x40477420, 0x4f46: 0x40477620, 0x4f47: 0x40477820, + 0x4f48: 0x40477a20, 0x4f49: 0x40477c20, 0x4f4a: 0x40478420, 0x4f4b: 0x40478620, + 0x4f4c: 0x40478820, 0x4f4d: 0x40478a20, 0x4f4e: 0x40478c20, 0x4f4f: 0x40478e20, + 0x4f50: 0x40479020, 0x4f51: 0x40479220, 0x4f52: 0x40479420, 0x4f53: 0x40479620, + 0x4f54: 0x40479820, 0x4f55: 0x40479a20, 0x4f56: 0x40479c20, 0x4f57: 0x40479e20, + 0x4f58: 0x4047a020, 0x4f59: 0x4047a220, 0x4f5a: 0x4047a420, 0x4f5b: 0x4047a620, + 0x4f5c: 0x4047a820, 0x4f5d: 0x4047aa20, 0x4f5e: 0x4047ac20, 0x4f5f: 0x4047ae20, + 0x4f60: 0x4047b020, 0x4f61: 0x4047b220, 0x4f62: 0x4047b420, 0x4f63: 0x4047b620, + 0x4f64: 0x4047b820, 0x4f65: 0x4047ba20, 0x4f66: 0x4047bc20, 0x4f67: 0x40478020, + 0x4f68: 0x40477e20, 0x4f69: 0x40478220, 0x4f6a: 0x4047be20, 0x4f6b: 0xa000f302, + 0x4f6c: 0xa000f402, 0x4f6d: 0x4047c020, 0x4f6e: 0x4047c220, 0x4f6f: 0x4047c420, + 0x4f70: 0x4047c620, 0x4f71: 0x4047c820, 0x4f72: 0x4047ca20, 0x4f73: 0x4047cc20, + 0x4f74: 0x4047ce20, 0x4f75: 0x4047d020, 0x4f76: 0x820923e9, 0x4f77: 0xa070f102, + // Block 0x13e, offset 0x4f80 + 0x4f80: 0xe00001dc, 0x4f81: 0xe00002a3, 0x4f82: 0xe00003be, 0x4f83: 0xe0000498, + 0x4f84: 0xe000056a, 0x4f85: 0xe0000634, 0x4f86: 0xe00006e4, 0x4f87: 0xe000078c, + 0x4f88: 0xe0000835, 0x4f89: 0xe00008e0, + // Block 0x13f, offset 0x4fc0 + 0x4fc0: 0x4076e420, 0x4fc1: 0x4076e620, 0x4fc2: 0x4076e820, 0x4fc3: 0x4076ea20, + 0x4fc4: 0x4076ec20, 0x4fc5: 0x4076ee20, 0x4fc6: 0x4076f020, 0x4fc7: 0x4076f220, + 0x4fc8: 0x4076f420, 0x4fc9: 0x4076f620, 0x4fca: 0x4076f820, 0x4fcb: 0x4076fa20, + 0x4fcc: 0x4076fc20, 0x4fcd: 0x4076fe20, 0x4fce: 0x40770020, 0x4fcf: 0x40770220, + 0x4fd0: 0x40770420, 0x4fd1: 0x40770620, 0x4fd2: 0x40770820, 0x4fd3: 0x40770a20, + 0x4fd4: 0x40770c20, 0x4fd5: 0x40770e20, 0x4fd6: 0x40771020, 0x4fd7: 0x40771220, + 0x4fd8: 0x40771420, 0x4fd9: 0x40771620, 0x4fda: 0x40771820, 0x4fdb: 0x40771a20, + 0x4fdc: 0x40771c20, 0x4fdd: 0x40771e20, 0x4fde: 0x40772020, 0x4fdf: 0x40772220, + 0x4fe0: 0x40772420, 0x4fe1: 0x40772620, 0x4fe2: 0x40772820, 0x4fe3: 0x40772a20, + 0x4fe4: 0x40772c20, 0x4fe5: 0x40772e20, 0x4fe6: 0x40773020, 0x4fe7: 0x40773220, + 0x4fe8: 0x40773420, 0x4fe9: 0x40773620, 0x4fea: 0x40773820, 0x4feb: 0x40773a20, + 0x4fec: 0x40773c20, 0x4fed: 0x40773e20, 0x4fee: 0x40774020, 0x4fef: 0x40774220, + 0x4ff0: 0x40774420, 0x4ff1: 0x40774620, 0x4ff2: 0x40774820, 0x4ff3: 0x40774a20, + 0x4ff4: 0x40774c20, 0x4ff5: 0x40774e20, 0x4ff6: 0x40775020, 0x4ff7: 0x40775220, + 0x4ff8: 0x40775420, 0x4ff9: 0x40775620, 0x4ffa: 0x40775820, 0x4ffb: 0x40775a20, + 0x4ffc: 0x40775c20, 0x4ffd: 0x40775e20, 0x4ffe: 0x40776020, 0x4fff: 0x40776220, + // Block 0x140, offset 0x5000 + 0x5000: 0x40776420, 0x5001: 0x40776620, 0x5002: 0x40776820, 0x5003: 0x40776a20, + 0x5004: 0x40776c20, 0x5005: 0x40776e20, 0x5006: 0x40777020, 0x5007: 0x40777220, + 0x5008: 0x40777420, 0x5009: 0x40777620, 0x500a: 0x40777820, 0x500b: 0x40777a20, + 0x500c: 0x40777c20, 0x500d: 0x40777e20, 0x500e: 0x40778020, 0x500f: 0x40778220, + 0x5010: 0x40778420, 0x5011: 0x40778620, 0x5012: 0x40778820, 0x5013: 0x40778a20, + 0x5014: 0x40778c20, 0x5015: 0x40778e20, 0x5016: 0x40779020, 0x5017: 0x40779220, + 0x5018: 0x40779420, 0x5019: 0x40779620, 0x501a: 0x40779820, 0x501b: 0x40779a20, + 0x501c: 0x40779c20, 0x501d: 0x40779e20, 0x501e: 0x4077a020, 0x501f: 0x4077a220, + 0x5020: 0x4077a420, 0x5021: 0x4077a620, 0x5022: 0x4077a820, 0x5023: 0x4077aa20, + 0x5024: 0x4077ac20, 0x5025: 0x4077ae20, 0x5026: 0x4077b020, 0x5027: 0x4077b220, + 0x5028: 0x4077b420, 0x5029: 0x4077b620, 0x502a: 0x4077b820, 0x502b: 0x4077ba20, + 0x502c: 0x4077bc20, 0x502d: 0x4077be20, 0x502e: 0x4077c020, 0x502f: 0x4077c220, + 0x5030: 0x4077c420, 0x5031: 0x4077c620, 0x5032: 0x4077c820, 0x5033: 0x4077ca20, + 0x5034: 0x4077cc20, 0x5035: 0x4077ce20, 0x5036: 0x4077d020, 0x5037: 0x4077d220, + 0x5038: 0x4077d420, 0x5039: 0x4077d620, 0x503a: 0x4077d820, 0x503b: 0x4077da20, + 0x503c: 0x4077dc20, 0x503d: 0x4077de20, 0x503e: 0x4077e020, 0x503f: 0x4077e220, + // Block 0x141, offset 0x5040 + 0x5040: 0x4077e420, 0x5041: 0x4077e620, 0x5042: 0x4077e820, 0x5043: 0x4077ea20, + 0x5044: 0x4077ec20, 0x5045: 0x4077ee20, 0x5046: 0x4077f020, 0x5047: 0x4077f220, + 0x5048: 0x4077f420, 0x5049: 0x4077f620, 0x504a: 0x4077f820, 0x504b: 0x4077fa20, + 0x504c: 0x4077fc20, 0x504d: 0x4077fe20, 0x504e: 0x40780020, 0x504f: 0x40780220, + 0x5050: 0x40780420, 0x5051: 0x40780620, 0x5052: 0x40780820, 0x5053: 0x40780a20, + 0x5054: 0x40780c20, 0x5055: 0x40780e20, 0x5056: 0x40781020, 0x5057: 0x40781220, + 0x5058: 0x40781420, 0x5059: 0x40781620, 0x505a: 0x40781820, 0x505b: 0x40781a20, + 0x505c: 0x40781c20, 0x505d: 0x40781e20, 0x505e: 0x40782020, 0x505f: 0x40782220, + 0x5060: 0x40782420, 0x5061: 0x40782620, 0x5062: 0x40782820, 0x5063: 0x40782a20, + 0x5064: 0x40782c20, 0x5065: 0x40782e20, 0x5066: 0x40783020, 0x5067: 0x40783220, + 0x5068: 0x40783420, 0x5069: 0x40783620, 0x506a: 0x40783820, 0x506b: 0x40783a20, + 0x506c: 0x40783c20, 0x506d: 0x40783e20, 0x506e: 0x40784020, 0x506f: 0x40784220, + 0x5070: 0x40784420, 0x5071: 0x40784620, 0x5072: 0x40784820, 0x5073: 0x40784a20, + 0x5074: 0x40784c20, 0x5075: 0x40784e20, 0x5076: 0x40785020, 0x5077: 0x40785220, + 0x5078: 0x40785420, 0x5079: 0x40785620, 0x507a: 0x40785820, 0x507b: 0x40785a20, + 0x507c: 0x40785c20, 0x507d: 0x40785e20, 0x507e: 0x40786020, 0x507f: 0x40786220, + // Block 0x142, offset 0x5080 + 0x5080: 0x40786420, 0x5081: 0x40786620, 0x5082: 0x40786820, 0x5083: 0x40786a20, + 0x5084: 0x40786c20, 0x5085: 0x40786e20, 0x5086: 0x40787020, 0x5087: 0x40787220, + 0x5088: 0x40787420, 0x5089: 0x40787620, 0x508a: 0x40787820, 0x508b: 0x40787a20, + 0x508c: 0x40787c20, 0x508d: 0x40787e20, 0x508e: 0x40788020, 0x508f: 0x40788220, + 0x5090: 0x40788420, 0x5091: 0x40788620, 0x5092: 0x40788820, 0x5093: 0x40788a20, + 0x5094: 0x40788c20, 0x5095: 0x40788e20, 0x5096: 0x40789020, 0x5097: 0x40789220, + 0x5098: 0x40789420, 0x5099: 0x40789620, 0x509a: 0x40789820, 0x509b: 0x40789a20, + 0x509c: 0x40789c20, 0x509d: 0x40789e20, 0x509e: 0x4078a020, 0x509f: 0x4078a220, + 0x50a0: 0x4078a420, 0x50a1: 0x4078a620, 0x50a2: 0x4078a820, 0x50a3: 0x4078aa20, + 0x50a4: 0x4078ac20, 0x50a5: 0x4078ae20, 0x50a6: 0x4078b020, 0x50a7: 0x4078b220, + 0x50a8: 0x4078b420, 0x50a9: 0x4078b620, 0x50aa: 0x4078b820, 0x50ab: 0x4078ba20, + 0x50ac: 0x4078bc20, 0x50ad: 0x4078be20, 0x50ae: 0x4078c020, 0x50af: 0x4078c220, + 0x50b0: 0x4078c420, 0x50b1: 0x4078c620, 0x50b2: 0x4078c820, 0x50b3: 0x4078ca20, + 0x50b4: 0x4078cc20, 0x50b5: 0x4078ce20, 0x50b6: 0x4078d020, 0x50b7: 0x4078d220, + 0x50b8: 0x4078d420, 0x50b9: 0x4078d620, 0x50ba: 0x4078d820, 0x50bb: 0x4078da20, + 0x50bc: 0x4078dc20, 0x50bd: 0x4078de20, 0x50be: 0x4078e020, 0x50bf: 0x4078e220, + // Block 0x143, offset 0x50c0 + 0x50c0: 0x4078e420, 0x50c1: 0x4078e620, 0x50c2: 0x4078e820, 0x50c3: 0x4078ea20, + 0x50c4: 0x4078ec20, 0x50c5: 0x4078ee20, 0x50c6: 0x4078f020, 0x50c7: 0x4078f220, + 0x50c8: 0x4078f420, 0x50c9: 0x4078f620, 0x50ca: 0x4078f820, 0x50cb: 0x4078fa20, + 0x50cc: 0x4078fc20, 0x50cd: 0x4078fe20, 0x50ce: 0x40790020, 0x50cf: 0x40790220, + 0x50d0: 0x40790420, 0x50d1: 0x40790620, 0x50d2: 0x40790820, 0x50d3: 0x40790a20, + 0x50d4: 0x40790c20, 0x50d5: 0x40790e20, 0x50d6: 0x40791020, 0x50d7: 0x40791220, + 0x50d8: 0x40791420, 0x50d9: 0x40791620, 0x50da: 0x40791820, 0x50db: 0x40791a20, + 0x50dc: 0x40791c20, 0x50dd: 0x40791e20, 0x50de: 0x40792020, 0x50df: 0x40792220, + 0x50e0: 0x40792420, 0x50e1: 0x40792620, 0x50e2: 0x40792820, 0x50e3: 0x40792a20, + 0x50e4: 0x40792c20, 0x50e5: 0x40792e20, 0x50e6: 0x40793020, 0x50e7: 0x40793220, + 0x50e8: 0x40793420, 0x50e9: 0x40793620, 0x50ea: 0x40793820, 0x50eb: 0x40793a20, + 0x50ec: 0x40793c20, 0x50ed: 0x40793e20, 0x50ee: 0x40794020, 0x50ef: 0x40794220, + 0x50f0: 0x40794420, 0x50f1: 0x40794620, 0x50f2: 0x40794820, 0x50f3: 0x40794a20, + 0x50f4: 0x40794c20, 0x50f5: 0x40794e20, 0x50f6: 0x40795020, 0x50f7: 0x40795220, + 0x50f8: 0x40795420, 0x50f9: 0x40795620, 0x50fa: 0x40795820, 0x50fb: 0x40795a20, + 0x50fc: 0x40795c20, 0x50fd: 0x40795e20, 0x50fe: 0x40796020, 0x50ff: 0x40796220, + // Block 0x144, offset 0x5100 + 0x5100: 0x40796420, 0x5101: 0x40796620, 0x5102: 0x40796820, 0x5103: 0x40796a20, + 0x5104: 0x40796c20, 0x5105: 0x40796e20, 0x5106: 0x40797020, 0x5107: 0x40797220, + 0x5108: 0x40797420, 0x5109: 0x40797620, 0x510a: 0x40797820, 0x510b: 0x40797a20, + 0x510c: 0x40797c20, 0x510d: 0x40797e20, 0x510e: 0x40798020, 0x510f: 0x40798220, + 0x5110: 0x40798420, 0x5111: 0x40798620, 0x5112: 0x40798820, 0x5113: 0x40798a20, + 0x5114: 0x40798c20, 0x5115: 0x40798e20, 0x5116: 0x40799020, 0x5117: 0x40799220, + 0x5118: 0x40799420, 0x5119: 0x40799620, 0x511a: 0x40799820, 0x511b: 0x40799a20, + 0x511c: 0x40799c20, 0x511d: 0x40799e20, 0x511e: 0x4079a020, 0x511f: 0x4079a220, + 0x5120: 0x4079a420, 0x5121: 0x4079a620, 0x5122: 0x4079a820, 0x5123: 0x4079aa20, + 0x5124: 0x4079ac20, 0x5125: 0x4079ae20, 0x5126: 0x4079b020, 0x5127: 0x4079b220, + 0x5128: 0x4079b420, 0x5129: 0x4079b620, 0x512a: 0x4079b820, 0x512b: 0x4079ba20, + 0x512c: 0x4079bc20, 0x512d: 0x4079be20, 0x512e: 0x4079c020, 0x512f: 0x4079c220, + 0x5130: 0x4079c420, 0x5131: 0x4079c620, 0x5132: 0x4079c820, 0x5133: 0x4079ca20, + 0x5134: 0x4079cc20, 0x5135: 0x4079ce20, 0x5136: 0x4079d020, 0x5137: 0x4079d220, + 0x5138: 0x4079d420, 0x5139: 0x4079d620, 0x513a: 0x4079d820, 0x513b: 0x4079da20, + 0x513c: 0x4079dc20, 0x513d: 0x4079de20, 0x513e: 0x4079e020, 0x513f: 0x4079e220, + // Block 0x145, offset 0x5140 + 0x5140: 0x4079e420, 0x5141: 0x4079e620, 0x5142: 0x4079e820, 0x5143: 0x4079ea20, + 0x5144: 0x4079ec20, 0x5145: 0x4079ee20, 0x5146: 0x4079f020, 0x5147: 0x4079f220, + 0x5148: 0x4079f420, 0x5149: 0x4079f620, 0x514a: 0x4079f820, 0x514b: 0x4079fa20, + 0x514c: 0x4079fc20, 0x514d: 0x4079fe20, 0x514e: 0x407a0020, 0x514f: 0x407a0220, + 0x5150: 0x407a0420, 0x5151: 0x407a0620, 0x5152: 0x407a0820, 0x5153: 0x407a0a20, + 0x5154: 0x407a0c20, 0x5155: 0x407a0e20, 0x5156: 0x407a1020, 0x5157: 0x407a1220, + 0x5158: 0x407a1420, 0x5159: 0x407a1620, 0x515a: 0x407a1820, 0x515b: 0x407a1a20, + 0x515c: 0x407a1c20, 0x515d: 0x407a1e20, 0x515e: 0x407a2020, 0x515f: 0x407a2220, + 0x5160: 0x407a2420, 0x5161: 0x407a2620, 0x5162: 0x407a2820, 0x5163: 0x407a2a20, + 0x5164: 0x407a2c20, 0x5165: 0x407a2e20, 0x5166: 0x407a3020, 0x5167: 0x407a3220, + 0x5168: 0x407a3420, 0x5169: 0x407a3620, 0x516a: 0x407a3820, 0x516b: 0x407a3a20, + 0x516c: 0x407a3c20, 0x516d: 0x407a3e20, 0x516e: 0x407a4020, 0x516f: 0x407a4220, + 0x5170: 0x407a4420, 0x5171: 0x407a4620, 0x5172: 0x407a4820, 0x5173: 0x407a4a20, + 0x5174: 0x407a4c20, 0x5175: 0x407a4e20, 0x5176: 0x407a5020, 0x5177: 0x407a5220, + 0x5178: 0x407a5420, 0x5179: 0x407a5620, 0x517a: 0x407a5820, 0x517b: 0x407a5a20, + 0x517c: 0x407a5c20, 0x517d: 0x407a5e20, 0x517e: 0x407a6020, 0x517f: 0x407a6220, + // Block 0x146, offset 0x5180 + 0x5180: 0x407a6420, 0x5181: 0x407a6620, 0x5182: 0x407a6820, 0x5183: 0x407a6a20, + 0x5184: 0x407a6c20, 0x5185: 0x407a6e20, 0x5186: 0x407a7020, 0x5187: 0x407a7220, + 0x5188: 0x407a7420, 0x5189: 0x407a7620, 0x518a: 0x407a7820, 0x518b: 0x407a7a20, + 0x518c: 0x407a7c20, 0x518d: 0x407a7e20, 0x518e: 0x407a8020, 0x518f: 0x407a8220, + 0x5190: 0x407a8420, 0x5191: 0x407a8620, 0x5192: 0x407a8820, 0x5193: 0x407a8a20, + 0x5194: 0x407a8c20, 0x5195: 0x407a8e20, 0x5196: 0x407a9020, 0x5197: 0x407a9220, + 0x5198: 0x407a9420, 0x5199: 0x407a9620, 0x519a: 0x407a9820, 0x519b: 0x407a9a20, + 0x519c: 0x407a9c20, 0x519d: 0x407a9e20, 0x519e: 0x407aa020, 0x519f: 0x407aa220, + 0x51a0: 0x407aa420, 0x51a1: 0x407aa620, 0x51a2: 0x407aa820, 0x51a3: 0x407aaa20, + 0x51a4: 0x407aac20, 0x51a5: 0x407aae20, 0x51a6: 0x407ab020, 0x51a7: 0x407ab220, + 0x51a8: 0x407ab420, 0x51a9: 0x407ab620, 0x51aa: 0x407ab820, 0x51ab: 0x407aba20, + 0x51ac: 0x407abc20, 0x51ad: 0x407abe20, 0x51ae: 0x407ac020, 0x51af: 0x407ac220, + 0x51b0: 0x407ac420, 0x51b1: 0x407ac620, 0x51b2: 0x407ac820, 0x51b3: 0x407aca20, + 0x51b4: 0x407acc20, 0x51b5: 0x407ace20, 0x51b6: 0x407ad020, 0x51b7: 0x407ad220, + 0x51b8: 0x407ad420, 0x51b9: 0x407ad620, 0x51ba: 0x407ad820, 0x51bb: 0x407ada20, + 0x51bc: 0x407adc20, 0x51bd: 0x407ade20, 0x51be: 0x407ae020, 0x51bf: 0x407ae220, + // Block 0x147, offset 0x51c0 + 0x51c0: 0x407ae420, 0x51c1: 0x407ae620, 0x51c2: 0x407ae820, 0x51c3: 0x407aea20, + 0x51c4: 0x407aec20, 0x51c5: 0x407aee20, 0x51c6: 0x407af020, 0x51c7: 0x407af220, + 0x51c8: 0x407af420, 0x51c9: 0x407af620, 0x51ca: 0x407af820, 0x51cb: 0x407afa20, + 0x51cc: 0x407afc20, 0x51cd: 0x407afe20, 0x51ce: 0x407b0020, 0x51cf: 0x407b0220, + 0x51d0: 0x407b0420, 0x51d1: 0x407b0620, 0x51d2: 0x407b0820, 0x51d3: 0x407b0a20, + 0x51d4: 0x407b0c20, 0x51d5: 0x407b0e20, 0x51d6: 0x407b1020, 0x51d7: 0x407b1220, + 0x51d8: 0x407b1420, 0x51d9: 0x407b1620, 0x51da: 0x407b1820, 0x51db: 0x407b1a20, + 0x51dc: 0x407b1c20, 0x51dd: 0x407b1e20, 0x51de: 0x407b2020, 0x51df: 0x407b2220, + 0x51e0: 0x407b2420, 0x51e1: 0x407b2620, 0x51e2: 0x407b2820, 0x51e3: 0x407b2a20, + 0x51e4: 0x407b2c20, 0x51e5: 0x407b2e20, 0x51e6: 0x407b3020, 0x51e7: 0x407b3220, + 0x51e8: 0x407b3420, 0x51e9: 0x407b3620, 0x51ea: 0x407b3820, 0x51eb: 0x407b3a20, + 0x51ec: 0x407b3c20, 0x51ed: 0x407b3e20, 0x51ee: 0x407b4020, 0x51ef: 0x407b4220, + 0x51f0: 0x407b4420, 0x51f1: 0x407b4620, 0x51f2: 0x407b4820, 0x51f3: 0x407b4a20, + 0x51f4: 0x407b4c20, 0x51f5: 0x407b4e20, 0x51f6: 0x407b5020, 0x51f7: 0x407b5220, + 0x51f8: 0x407b5420, 0x51f9: 0x407b5620, 0x51fa: 0x407b5820, 0x51fb: 0x407b5a20, + 0x51fc: 0x407b5c20, 0x51fd: 0x407b5e20, 0x51fe: 0x407b6020, 0x51ff: 0x407b6220, + // Block 0x148, offset 0x5200 + 0x5200: 0x407b6420, 0x5201: 0x407b6620, 0x5202: 0x407b6820, 0x5203: 0x407b6a20, + 0x5204: 0x407b6c20, 0x5205: 0x407b6e20, 0x5206: 0x407b7020, 0x5207: 0x407b7220, + 0x5208: 0x407b7420, 0x5209: 0x407b7620, 0x520a: 0x407b7820, 0x520b: 0x407b7a20, + 0x520c: 0x407b7c20, 0x520d: 0x407b7e20, 0x520e: 0x407b8020, 0x520f: 0x407b8220, + 0x5210: 0x407b8420, 0x5211: 0x407b8620, 0x5212: 0x407b8820, 0x5213: 0x407b8a20, + 0x5214: 0x407b8c20, 0x5215: 0x407b8e20, 0x5216: 0x407b9020, 0x5217: 0x407b9220, + 0x5218: 0x407b9420, 0x5219: 0x407b9620, 0x521a: 0x407b9820, 0x521b: 0x407b9a20, + 0x521c: 0x407b9c20, 0x521d: 0x407b9e20, 0x521e: 0x407ba020, 0x521f: 0x407ba220, + 0x5220: 0x407ba420, 0x5221: 0x407ba620, 0x5222: 0x407ba820, 0x5223: 0x407baa20, + 0x5224: 0x407bac20, 0x5225: 0x407bae20, 0x5226: 0x407bb020, 0x5227: 0x407bb220, + 0x5228: 0x407bb420, 0x5229: 0x407bb620, 0x522a: 0x407bb820, 0x522b: 0x407bba20, + 0x522c: 0x407bbc20, 0x522d: 0x407bbe20, 0x522e: 0x407bc020, 0x522f: 0x407bc220, + 0x5230: 0x407bc420, 0x5231: 0x407bc620, 0x5232: 0x407bc820, 0x5233: 0x407bca20, + 0x5234: 0x407bcc20, 0x5235: 0x407bce20, 0x5236: 0x407bd020, 0x5237: 0x407bd220, + 0x5238: 0x407bd420, 0x5239: 0x407bd620, 0x523a: 0x407bd820, 0x523b: 0x407bda20, + 0x523c: 0x407bdc20, 0x523d: 0x407bde20, 0x523e: 0x407be020, 0x523f: 0x407be220, + // Block 0x149, offset 0x5240 + 0x5240: 0x407be420, 0x5241: 0x407be620, 0x5242: 0x407be820, 0x5243: 0x407bea20, + 0x5244: 0x407bec20, 0x5245: 0x407bee20, 0x5246: 0x407bf020, 0x5247: 0x407bf220, + 0x5248: 0x407bf420, 0x5249: 0x407bf620, 0x524a: 0x407bf820, 0x524b: 0x407bfa20, + 0x524c: 0x407bfc20, 0x524d: 0x407bfe20, 0x524e: 0x407c0020, 0x524f: 0x407c0220, + 0x5250: 0x407c0420, 0x5251: 0x407c0620, 0x5252: 0x407c0820, 0x5253: 0x407c0a20, + 0x5254: 0x407c0c20, 0x5255: 0x407c0e20, 0x5256: 0x407c1020, 0x5257: 0x407c1220, + 0x5258: 0x407c1420, 0x5259: 0x407c1620, 0x525a: 0x407c1820, 0x525b: 0x407c1a20, + 0x525c: 0x407c1c20, 0x525d: 0x407c1e20, 0x525e: 0x407c2020, 0x525f: 0x407c2220, + 0x5260: 0x407c2420, 0x5261: 0x407c2620, 0x5262: 0x407c2820, 0x5263: 0x407c2a20, + 0x5264: 0x407c2c20, 0x5265: 0x407c2e20, 0x5266: 0x407c3020, 0x5267: 0x407c3220, + 0x5268: 0x407c3420, 0x5269: 0x407c3620, 0x526a: 0x407c3820, 0x526b: 0x407c3a20, + 0x526c: 0x407c3c20, 0x526d: 0x407c3e20, 0x526e: 0x407c4020, 0x526f: 0x407c4220, + 0x5270: 0x407c4420, 0x5271: 0x407c4620, 0x5272: 0x407c4820, 0x5273: 0x407c4a20, + 0x5274: 0x407c4c20, 0x5275: 0x407c4e20, 0x5276: 0x407c5020, 0x5277: 0x407c5220, + 0x5278: 0x407c5420, 0x5279: 0x407c5620, 0x527a: 0x407c5820, 0x527b: 0x407c5a20, + 0x527c: 0x407c5c20, 0x527d: 0x407c5e20, 0x527e: 0x407c6020, 0x527f: 0x407c6220, + // Block 0x14a, offset 0x5280 + 0x5280: 0x407c6420, 0x5281: 0x407c6620, 0x5282: 0x407c6820, 0x5283: 0x407c6a20, + 0x5284: 0x407c6c20, 0x5285: 0x407c6e20, 0x5286: 0x407c7020, 0x5287: 0x407c7220, + 0x5288: 0x407c7420, 0x5289: 0x407c7620, 0x528a: 0x407c7820, 0x528b: 0x407c7a20, + 0x528c: 0x407c7c20, 0x528d: 0x407c7e20, 0x528e: 0x407c8020, 0x528f: 0x407c8220, + 0x5290: 0x407c8420, 0x5291: 0x407c8620, 0x5292: 0x407c8820, 0x5293: 0x407c8a20, + 0x5294: 0x407c8c20, 0x5295: 0x407c8e20, 0x5296: 0x407c9020, 0x5297: 0x407c9220, + 0x5298: 0x407c9420, 0x5299: 0x407c9620, 0x529a: 0x407c9820, 0x529b: 0x407c9a20, + 0x529c: 0x407c9c20, 0x529d: 0x407c9e20, 0x529e: 0x407ca020, 0x529f: 0x407ca220, + 0x52a0: 0x407ca420, 0x52a1: 0x407ca620, 0x52a2: 0x407ca820, 0x52a3: 0x407caa20, + 0x52a4: 0x407cac20, 0x52a5: 0x407cae20, 0x52a6: 0x407cb020, 0x52a7: 0x407cb220, + 0x52a8: 0x407cb420, 0x52a9: 0x407cb620, 0x52aa: 0x407cb820, 0x52ab: 0x407cba20, + 0x52ac: 0x407cbc20, 0x52ad: 0x407cbe20, 0x52ae: 0x407cc020, 0x52af: 0x407cc220, + 0x52b0: 0x407cc420, 0x52b1: 0x407cc620, 0x52b2: 0x407cc820, 0x52b3: 0x407cca20, + 0x52b4: 0x407ccc20, 0x52b5: 0x407cce20, 0x52b6: 0x407cd020, 0x52b7: 0x407cd220, + 0x52b8: 0x407cd420, 0x52b9: 0x407cd620, 0x52ba: 0x407cd820, 0x52bb: 0x407cda20, + 0x52bc: 0x407cdc20, 0x52bd: 0x407cde20, 0x52be: 0x407ce020, 0x52bf: 0x407ce220, + // Block 0x14b, offset 0x52c0 + 0x52c0: 0x407ce420, 0x52c1: 0x407ce620, 0x52c2: 0x407ce820, 0x52c3: 0x407cea20, + 0x52c4: 0x407cec20, 0x52c5: 0x407cee20, 0x52c6: 0x407cf020, 0x52c7: 0x407cf220, + 0x52c8: 0x407cf420, 0x52c9: 0x407cf620, 0x52ca: 0x407cf820, 0x52cb: 0x407cfa20, + 0x52cc: 0x407cfc20, 0x52cd: 0x407cfe20, 0x52ce: 0x407d0020, 0x52cf: 0x407d0220, + 0x52d0: 0x407d0420, 0x52d1: 0x407d0620, 0x52d2: 0x407d0820, 0x52d3: 0x407d0a20, + 0x52d4: 0x407d0c20, 0x52d5: 0x407d0e20, 0x52d6: 0x407d1020, 0x52d7: 0x407d1220, + 0x52d8: 0x407d1420, 0x52d9: 0x407d1620, 0x52da: 0x407d1820, 0x52db: 0x407d1a20, + 0x52dc: 0x407d1c20, 0x52dd: 0x407d1e20, 0x52de: 0x407d2020, 0x52df: 0x407d2220, + 0x52e0: 0x407d2420, 0x52e1: 0x407d2620, 0x52e2: 0x407d2820, 0x52e3: 0x407d2a20, + 0x52e4: 0x407d2c20, 0x52e5: 0x407d2e20, 0x52e6: 0x407d3020, 0x52e7: 0x407d3220, + 0x52e8: 0x407d3420, 0x52e9: 0x407d3620, 0x52ea: 0x407d3820, 0x52eb: 0x407d3a20, + 0x52ec: 0x407d3c20, 0x52ed: 0x407d3e20, 0x52ee: 0x407d4020, 0x52ef: 0x407d4220, + 0x52f0: 0x407d4420, 0x52f1: 0x407d4620, 0x52f2: 0x407d4820, 0x52f3: 0x407d4a20, + 0x52f4: 0x407d4c20, 0x52f5: 0x407d4e20, 0x52f6: 0x407d5020, 0x52f7: 0x407d5220, + 0x52f8: 0x407d5420, 0x52f9: 0x407d5620, 0x52fa: 0x407d5820, 0x52fb: 0x407d5a20, + 0x52fc: 0x407d5c20, 0x52fd: 0x407d5e20, 0x52fe: 0x407d6020, 0x52ff: 0x407d6220, + // Block 0x14c, offset 0x5300 + 0x5300: 0x407d6420, 0x5301: 0x407d6620, 0x5302: 0x407d6820, 0x5303: 0x407d6a20, + 0x5304: 0x407d6c20, 0x5305: 0x407d6e20, 0x5306: 0x407d7020, 0x5307: 0x407d7220, + 0x5308: 0x407d7420, 0x5309: 0x407d7620, 0x530a: 0x407d7820, 0x530b: 0x407d7a20, + 0x530c: 0x407d7c20, 0x530d: 0x407d7e20, 0x530e: 0x407d8020, 0x530f: 0x407d8220, + 0x5310: 0x407d8420, 0x5311: 0x407d8620, 0x5312: 0x407d8820, 0x5313: 0x407d8a20, + 0x5314: 0x407d8c20, 0x5315: 0x407d8e20, 0x5316: 0x407d9020, 0x5317: 0x407d9220, + 0x5318: 0x407d9420, 0x5319: 0x407d9620, 0x531a: 0x407d9820, 0x531b: 0x407d9a20, + 0x531c: 0x407d9c20, 0x531d: 0x407d9e20, 0x531e: 0x407da020, 0x531f: 0x407da220, + 0x5320: 0x407da420, 0x5321: 0x407da620, 0x5322: 0x407da820, 0x5323: 0x407daa20, + 0x5324: 0x407dac20, 0x5325: 0x407dae20, 0x5326: 0x407db020, 0x5327: 0x407db220, + 0x5328: 0x407db420, 0x5329: 0x407db620, 0x532a: 0x407db820, 0x532b: 0x407dba20, + 0x532c: 0x407dbc20, 0x532d: 0x407dbe20, 0x532e: 0x407dc020, + // Block 0x14d, offset 0x5340 + 0x5340: 0xe0000394, 0x5341: 0xe000045f, 0x5342: 0xe0000534, 0x5343: 0xe0000610, + 0x5344: 0xe00006cc, 0x5345: 0xe0000771, 0x5346: 0xe000081d, 0x5347: 0xe00008c2, + 0x5348: 0xe0000462, 0x5349: 0xe0000537, 0x534a: 0xe0000613, 0x534b: 0xe00006cf, + 0x534c: 0xe0000774, 0x534d: 0xe0000820, 0x534e: 0xe00008c5, 0x534f: 0xe000053a, + 0x5350: 0xe0000616, 0x5351: 0xe00006d2, 0x5352: 0xe0000777, 0x5353: 0xe0000823, + 0x5354: 0xe00008c8, 0x5355: 0xe000027f, 0x5356: 0xe0000397, 0x5357: 0xe0000465, + 0x5358: 0xe000053d, 0x5359: 0xe0000619, 0x535a: 0xe00006d5, 0x535b: 0xe000077a, + 0x535c: 0xe0000826, 0x535d: 0xe00008cb, 0x535e: 0xe0000282, 0x535f: 0xe000039a, + 0x5360: 0xe0000468, 0x5361: 0xe0000540, 0x5362: 0xe000061c, 0x5363: 0xe000039d, + 0x5364: 0xe000046b, 0x5365: 0xe000046e, 0x5366: 0xe0000543, 0x5367: 0xe000061f, + 0x5368: 0xe00006d8, 0x5369: 0xe000077d, 0x536a: 0xe0000829, 0x536b: 0xe00008ce, + 0x536c: 0xe0000285, 0x536d: 0xe00003a0, 0x536e: 0xe0000471, 0x536f: 0xe0000474, + 0x5370: 0xe0000546, 0x5371: 0xe0000622, 0x5372: 0x4029a020, 0x5373: 0x4029a220, + 0x5374: 0xe0000288, 0x5375: 0xe00003a3, 0x5376: 0xe0000477, 0x5377: 0xe000047a, + 0x5378: 0xe0000549, 0x5379: 0xe0000625, 0x537a: 0xe000047d, 0x537b: 0xe0000480, + 0x537c: 0xe000054c, 0x537d: 0xe000054f, 0x537e: 0xe0000552, 0x537f: 0xe0000555, + // Block 0x14e, offset 0x5380 + 0x5380: 0xe00006db, 0x5381: 0xe0000780, 0x5382: 0xe0000783, 0x5383: 0xe0000786, + 0x5384: 0xe000082c, 0x5385: 0xe000082f, 0x5386: 0xe00008d1, 0x5387: 0xe00008d4, + 0x5388: 0xe00008d7, 0x5389: 0xe00008da, 0x538a: 0xe00003a6, 0x538b: 0xe0000483, + 0x538c: 0xe0000558, 0x538d: 0xe0000628, 0x538e: 0xe00006de, 0x538f: 0xe000028b, + 0x5390: 0xe00003a9, 0x5391: 0xe0000486, 0x5392: 0xe000055b, 0x5393: 0xe000055e, + 0x5394: 0xe000062b, 0x5395: 0xe000062e, 0x5396: 0x4029a420, 0x5397: 0x4029a620, + 0x5398: 0xe000028e, 0x5399: 0xe00003ac, 0x539a: 0x4029a820, 0x539b: 0x4029aa20, + 0x539c: 0x4029ac20, 0x539d: 0x4029ae20, 0x539e: 0x4029b020, 0x539f: 0x4029b220, + 0x53a0: 0x4029b420, 0x53a1: 0x4029b620, 0x53a2: 0x4029b820, + 0x53b0: 0x4003ca20, 0x53b1: 0x4003cc20, 0x53b2: 0x4003ce20, 0x53b3: 0x4003d020, + // Block 0x14f, offset 0x53c0 + 0x53c0: 0x407dc220, 0x53c1: 0x407dc420, 0x53c2: 0x407dc620, 0x53c3: 0x407dc820, + 0x53c4: 0x407dca20, 0x53c5: 0x407dcc20, 0x53c6: 0x407dce20, 0x53c7: 0x407dd020, + 0x53c8: 0x407dd220, 0x53c9: 0x407dd420, 0x53ca: 0x407dd620, 0x53cb: 0x407dd820, + 0x53cc: 0x407dda20, 0x53cd: 0x407ddc20, 0x53ce: 0x407dde20, 0x53cf: 0x407de020, + 0x53d0: 0x407de220, 0x53d1: 0x407de420, 0x53d2: 0x407de620, 0x53d3: 0x407de820, + 0x53d4: 0x407dea20, 0x53d5: 0x407dec20, 0x53d6: 0x407dee20, 0x53d7: 0x407df020, + 0x53d8: 0x407df220, 0x53d9: 0x407df420, 0x53da: 0x407df620, 0x53db: 0x407df820, + 0x53dc: 0x407dfa20, 0x53dd: 0x407dfc20, 0x53de: 0x407dfe20, 0x53df: 0x407e0020, + 0x53e0: 0x407e0220, 0x53e1: 0x407e0420, 0x53e2: 0x407e0620, 0x53e3: 0x407e0820, + 0x53e4: 0x407e0a20, 0x53e5: 0x407e0c20, 0x53e6: 0x407e0e20, 0x53e7: 0x407e1020, + 0x53e8: 0x407e1220, 0x53e9: 0x407e1420, 0x53ea: 0x407e1620, 0x53eb: 0x407e1820, + 0x53ec: 0x407e1a20, 0x53ed: 0x407e1c20, 0x53ee: 0x407e1e20, 0x53ef: 0x407e2020, + 0x53f0: 0x407e2220, 0x53f1: 0x407e2420, 0x53f2: 0x407e2620, 0x53f3: 0x407e2820, + 0x53f4: 0x407e2a20, 0x53f5: 0x407e2c20, 0x53f6: 0x407e2e20, 0x53f7: 0x407e3020, + 0x53f8: 0x407e3220, 0x53f9: 0x407e3420, 0x53fa: 0x407e3620, 0x53fb: 0x407e3820, + 0x53fc: 0x407e3a20, 0x53fd: 0x407e3c20, 0x53fe: 0x407e3e20, 0x53ff: 0x407e4020, + // Block 0x150, offset 0x5400 + 0x5400: 0x407e4220, 0x5401: 0x407e4420, 0x5402: 0x407e4620, 0x5403: 0x407e4820, + 0x5404: 0x407e4a20, 0x5405: 0x407e4c20, 0x5406: 0x407e4e20, 0x5407: 0x407e5020, + 0x5408: 0x407e5220, 0x5409: 0x407e5420, 0x540a: 0x407e5620, 0x540b: 0x407e5820, + 0x540c: 0x407e5a20, 0x540d: 0x407e5c20, 0x540e: 0x407e5e20, 0x540f: 0x407e6020, + 0x5410: 0x407e6220, 0x5411: 0x407e6420, 0x5412: 0x407e6620, 0x5413: 0x407e6820, + 0x5414: 0x407e6a20, 0x5415: 0x407e6c20, 0x5416: 0x407e6e20, 0x5417: 0x407e7020, + 0x5418: 0x407e7220, 0x5419: 0x407e7420, 0x541a: 0x407e7620, 0x541b: 0x407e7820, + 0x541c: 0x407e7a20, 0x541d: 0x407e7c20, 0x541e: 0x407e7e20, 0x541f: 0x407e8020, + 0x5420: 0x407e8220, 0x5421: 0x407e8420, 0x5422: 0x407e8620, 0x5423: 0x407e8820, + 0x5424: 0x407e8a20, 0x5425: 0x407e8c20, 0x5426: 0x407e8e20, 0x5427: 0x407e9020, + 0x5428: 0x407e9220, 0x5429: 0x407e9420, 0x542a: 0x407e9620, 0x542b: 0x407e9820, + 0x542c: 0x407e9a20, 0x542d: 0x407e9c20, 0x542e: 0x407e9e20, 0x542f: 0x407ea020, + 0x5430: 0x407ea220, 0x5431: 0x407ea420, 0x5432: 0x407ea620, 0x5433: 0x407ea820, + 0x5434: 0x407eaa20, 0x5435: 0x407eac20, 0x5436: 0x407eae20, 0x5437: 0x407eb020, + 0x5438: 0x407eb220, 0x5439: 0x407eb420, 0x543a: 0x407eb620, 0x543b: 0x407eb820, + 0x543c: 0x407eba20, 0x543d: 0x407ebc20, 0x543e: 0x407ebe20, 0x543f: 0x407ec020, + // Block 0x151, offset 0x5440 + 0x5440: 0x407ec220, 0x5441: 0x407ec420, 0x5442: 0x407ec620, 0x5443: 0x407ec820, + 0x5444: 0x407eca20, 0x5445: 0x407ecc20, 0x5446: 0x407ece20, 0x5447: 0x407ed020, + 0x5448: 0x407ed220, 0x5449: 0x407ed420, 0x544a: 0x407ed620, 0x544b: 0x407ed820, + 0x544c: 0x407eda20, 0x544d: 0x407edc20, 0x544e: 0x407ede20, 0x544f: 0x407ee020, + 0x5450: 0x407ee220, 0x5451: 0x407ee420, 0x5452: 0x407ee620, 0x5453: 0x407ee820, + 0x5454: 0x407eea20, 0x5455: 0x407eec20, 0x5456: 0x407eee20, 0x5457: 0x407ef020, + 0x5458: 0x407ef220, 0x5459: 0x407ef420, 0x545a: 0x407ef620, 0x545b: 0x407ef820, + 0x545c: 0x407efa20, 0x545d: 0x407efc20, 0x545e: 0x407efe20, 0x545f: 0x407f0020, + 0x5460: 0x407f0220, 0x5461: 0x407f0420, 0x5462: 0x407f0620, 0x5463: 0x407f0820, + 0x5464: 0x407f0a20, 0x5465: 0x407f0c20, 0x5466: 0x407f0e20, 0x5467: 0x407f1020, + 0x5468: 0x407f1220, 0x5469: 0x407f1420, 0x546a: 0x407f1620, 0x546b: 0x407f1820, + 0x546c: 0x407f1a20, 0x546d: 0x407f1c20, 0x546e: 0x407f1e20, 0x546f: 0x407f2020, + 0x5470: 0x407f2220, 0x5471: 0x407f2420, 0x5472: 0x407f2620, 0x5473: 0x407f2820, + 0x5474: 0x407f2a20, 0x5475: 0x407f2c20, 0x5476: 0x407f2e20, 0x5477: 0x407f3020, + 0x5478: 0x407f3220, 0x5479: 0x407f3420, 0x547a: 0x407f3620, 0x547b: 0x407f3820, + 0x547c: 0x407f3a20, 0x547d: 0x407f3c20, 0x547e: 0x407f3e20, 0x547f: 0x407f4020, + // Block 0x152, offset 0x5480 + 0x5480: 0x407f4220, 0x5481: 0x407f4420, 0x5482: 0x407f4620, 0x5483: 0x407f4820, + 0x5484: 0x407f4a20, 0x5485: 0x407f4c20, 0x5486: 0x407f4e20, 0x5487: 0x407f5020, + 0x5488: 0x407f5220, 0x5489: 0x407f5420, 0x548a: 0x407f5620, 0x548b: 0x407f5820, + 0x548c: 0x407f5a20, 0x548d: 0x407f5c20, 0x548e: 0x407f5e20, 0x548f: 0x407f6020, + 0x5490: 0x407f6220, 0x5491: 0x407f6420, 0x5492: 0x407f6620, 0x5493: 0x407f6820, + 0x5494: 0x407f6a20, 0x5495: 0x407f6c20, 0x5496: 0x407f6e20, 0x5497: 0x407f7020, + 0x5498: 0x407f7220, 0x5499: 0x407f7420, 0x549a: 0x407f7620, 0x549b: 0x407f7820, + 0x549c: 0x407f7a20, 0x549d: 0x407f7c20, 0x549e: 0x407f7e20, 0x549f: 0x407f8020, + 0x54a0: 0x407f8220, 0x54a1: 0x407f8420, 0x54a2: 0x407f8620, 0x54a3: 0x407f8820, + 0x54a4: 0x407f8a20, 0x54a5: 0x407f8c20, 0x54a6: 0x407f8e20, 0x54a7: 0x407f9020, + 0x54a8: 0x407f9220, 0x54a9: 0x407f9420, 0x54aa: 0x407f9620, 0x54ab: 0x407f9820, + 0x54ac: 0x407f9a20, 0x54ad: 0x407f9c20, 0x54ae: 0x407f9e20, 0x54af: 0x407fa020, + 0x54b0: 0x407fa220, 0x54b1: 0x407fa420, 0x54b2: 0x407fa620, 0x54b3: 0x407fa820, + 0x54b4: 0x407faa20, 0x54b5: 0x407fac20, 0x54b6: 0x407fae20, 0x54b7: 0x407fb020, + 0x54b8: 0x407fb220, 0x54b9: 0x407fb420, 0x54ba: 0x407fb620, 0x54bb: 0x407fb820, + 0x54bc: 0x407fba20, 0x54bd: 0x407fbc20, 0x54be: 0x407fbe20, 0x54bf: 0x407fc020, + // Block 0x153, offset 0x54c0 + 0x54c0: 0x407fc220, 0x54c1: 0x407fc420, 0x54c2: 0x407fc620, 0x54c3: 0x407fc820, + 0x54c4: 0x407fca20, 0x54c5: 0x407fcc20, 0x54c6: 0x407fce20, 0x54c7: 0x407fd020, + 0x54c8: 0x407fd220, 0x54c9: 0x407fd420, 0x54ca: 0x407fd620, 0x54cb: 0x407fd820, + 0x54cc: 0x407fda20, 0x54cd: 0x407fdc20, 0x54ce: 0x407fde20, 0x54cf: 0x407fe020, + 0x54d0: 0x407fe220, 0x54d1: 0x407fe420, 0x54d2: 0x407fe620, 0x54d3: 0x407fe820, + 0x54d4: 0x407fea20, 0x54d5: 0x407fec20, 0x54d6: 0x407fee20, 0x54d7: 0x407ff020, + 0x54d8: 0x407ff220, 0x54d9: 0x407ff420, 0x54da: 0x407ff620, 0x54db: 0x407ff820, + 0x54dc: 0x407ffa20, 0x54dd: 0x407ffc20, 0x54de: 0x407ffe20, 0x54df: 0x40800020, + 0x54e0: 0x40800220, 0x54e1: 0x40800420, 0x54e2: 0x40800620, 0x54e3: 0x40800820, + 0x54e4: 0x40800a20, 0x54e5: 0x40800c20, 0x54e6: 0x40800e20, 0x54e7: 0x40801020, + 0x54e8: 0x40801220, 0x54e9: 0x40801420, 0x54ea: 0x40801620, 0x54eb: 0x40801820, + 0x54ec: 0x40801a20, 0x54ed: 0x40801c20, 0x54ee: 0x40801e20, 0x54ef: 0x40802020, + 0x54f0: 0x40802220, 0x54f1: 0x40802420, 0x54f2: 0x40802620, 0x54f3: 0x40802820, + 0x54f4: 0x40802a20, 0x54f5: 0x40802c20, 0x54f6: 0x40802e20, 0x54f7: 0x40803020, + 0x54f8: 0x40803220, 0x54f9: 0x40803420, 0x54fa: 0x40803620, 0x54fb: 0x40803820, + 0x54fc: 0x40803a20, 0x54fd: 0x40803c20, 0x54fe: 0x40803e20, 0x54ff: 0x40804020, + // Block 0x154, offset 0x5500 + 0x5500: 0x40804220, 0x5501: 0x40804420, 0x5502: 0x40804620, 0x5503: 0x40804820, + 0x5504: 0x40804a20, 0x5505: 0x40804c20, 0x5506: 0x40804e20, 0x5507: 0x40805020, + 0x5508: 0x40805220, 0x5509: 0x40805420, 0x550a: 0x40805620, 0x550b: 0x40805820, + 0x550c: 0x40805a20, 0x550d: 0x40805c20, 0x550e: 0x40805e20, 0x550f: 0x40806020, + 0x5510: 0x40806220, 0x5511: 0x40806420, 0x5512: 0x40806620, 0x5513: 0x40806820, + 0x5514: 0x40806a20, 0x5515: 0x40806c20, 0x5516: 0x40806e20, 0x5517: 0x40807020, + 0x5518: 0x40807220, 0x5519: 0x40807420, 0x551a: 0x40807620, 0x551b: 0x40807820, + 0x551c: 0x40807a20, 0x551d: 0x40807c20, 0x551e: 0x40807e20, 0x551f: 0x40808020, + 0x5520: 0x40808220, 0x5521: 0x40808420, 0x5522: 0x40808620, 0x5523: 0x40808820, + 0x5524: 0x40808a20, 0x5525: 0x40808c20, 0x5526: 0x40808e20, 0x5527: 0x40809020, + 0x5528: 0x40809220, 0x5529: 0x40809420, 0x552a: 0x40809620, 0x552b: 0x40809820, + 0x552c: 0x40809a20, 0x552d: 0x40809c20, 0x552e: 0x40809e20, 0x552f: 0x4080a020, + 0x5530: 0x4080a220, 0x5531: 0x4080a420, 0x5532: 0x4080a620, 0x5533: 0x4080a820, + 0x5534: 0x4080aa20, 0x5535: 0x4080ac20, 0x5536: 0x4080ae20, 0x5537: 0x4080b020, + 0x5538: 0x4080b220, 0x5539: 0x4080b420, 0x553a: 0x4080b620, 0x553b: 0x4080b820, + 0x553c: 0x4080ba20, 0x553d: 0x4080bc20, 0x553e: 0x4080be20, 0x553f: 0x4080c020, + // Block 0x155, offset 0x5540 + 0x5540: 0x4080c220, 0x5541: 0x4080c420, 0x5542: 0x4080c620, 0x5543: 0x4080c820, + 0x5544: 0x4080ca20, 0x5545: 0x4080cc20, 0x5546: 0x4080ce20, 0x5547: 0x4080d020, + 0x5548: 0x4080d220, 0x5549: 0x4080d420, 0x554a: 0x4080d620, 0x554b: 0x4080d820, + 0x554c: 0x4080da20, 0x554d: 0x4080dc20, 0x554e: 0x4080de20, 0x554f: 0x4080e020, + 0x5550: 0x4080e220, 0x5551: 0x4080e420, 0x5552: 0x4080e620, 0x5553: 0x4080e820, + 0x5554: 0x4080ea20, 0x5555: 0x4080ec20, 0x5556: 0x4080ee20, 0x5557: 0x4080f020, + 0x5558: 0x4080f220, 0x5559: 0x4080f420, 0x555a: 0x4080f620, 0x555b: 0x4080f820, + 0x555c: 0x4080fa20, 0x555d: 0x4080fc20, 0x555e: 0x4080fe20, 0x555f: 0x40810020, + 0x5560: 0x40810220, 0x5561: 0x40810420, 0x5562: 0x40810620, 0x5563: 0x40810820, + 0x5564: 0x40810a20, 0x5565: 0x40810c20, 0x5566: 0x40810e20, 0x5567: 0x40811020, + 0x5568: 0x40811220, 0x5569: 0x40811420, 0x556a: 0x40811620, 0x556b: 0x40811820, + 0x556c: 0x40811a20, 0x556d: 0x40811c20, 0x556e: 0x40811e20, 0x556f: 0x40812020, + 0x5570: 0x40812220, 0x5571: 0x40812420, 0x5572: 0x40812620, 0x5573: 0x40812820, + 0x5574: 0x40812a20, 0x5575: 0x40812c20, 0x5576: 0x40812e20, 0x5577: 0x40813020, + 0x5578: 0x40813220, 0x5579: 0x40813420, 0x557a: 0x40813620, 0x557b: 0x40813820, + 0x557c: 0x40813a20, 0x557d: 0x40813c20, 0x557e: 0x40813e20, 0x557f: 0x40814020, + // Block 0x156, offset 0x5580 + 0x5580: 0x40814220, 0x5581: 0x40814420, 0x5582: 0x40814620, 0x5583: 0x40814820, + 0x5584: 0x40814a20, 0x5585: 0x40814c20, 0x5586: 0x40814e20, 0x5587: 0x40815020, + 0x5588: 0x40815220, 0x5589: 0x40815420, 0x558a: 0x40815620, 0x558b: 0x40815820, + 0x558c: 0x40815a20, 0x558d: 0x40815c20, 0x558e: 0x40815e20, 0x558f: 0x40816020, + 0x5590: 0x40816220, 0x5591: 0x40816420, 0x5592: 0x40816620, 0x5593: 0x40816820, + 0x5594: 0x40816a20, 0x5595: 0x40816c20, 0x5596: 0x40816e20, 0x5597: 0x40817020, + 0x5598: 0x40817220, 0x5599: 0x40817420, 0x559a: 0x40817620, 0x559b: 0x40817820, + 0x559c: 0x40817a20, 0x559d: 0x40817c20, 0x559e: 0x40817e20, 0x559f: 0x40818020, + 0x55a0: 0x40818220, 0x55a1: 0x40818420, 0x55a2: 0x40818620, 0x55a3: 0x40818820, + 0x55a4: 0x40818a20, 0x55a5: 0x40818c20, 0x55a6: 0x40818e20, 0x55a7: 0x40819020, + 0x55a8: 0x40819220, 0x55a9: 0x40819420, 0x55aa: 0x40819620, 0x55ab: 0x40819820, + 0x55ac: 0x40819a20, 0x55ad: 0x40819c20, 0x55ae: 0x40819e20, 0x55af: 0x4081a020, + 0x55b0: 0x4081a220, 0x55b1: 0x4081a420, 0x55b2: 0x4081a620, 0x55b3: 0x4081a820, + 0x55b4: 0x4081aa20, 0x55b5: 0x4081ac20, 0x55b6: 0x4081ae20, 0x55b7: 0x4081b020, + 0x55b8: 0x4081b220, 0x55b9: 0x4081b420, 0x55ba: 0x4081b620, 0x55bb: 0x4081b820, + 0x55bc: 0x4081ba20, 0x55bd: 0x4081bc20, 0x55be: 0x4081be20, 0x55bf: 0x4081c020, + // Block 0x157, offset 0x55c0 + 0x55c0: 0x4081c220, 0x55c1: 0x4081c420, 0x55c2: 0x4081c620, 0x55c3: 0x4081c820, + 0x55c4: 0x4081ca20, 0x55c5: 0x4081cc20, 0x55c6: 0x4081ce20, 0x55c7: 0x4081d020, + 0x55c8: 0x4081d220, 0x55c9: 0x4081d420, 0x55ca: 0x4081d620, 0x55cb: 0x4081d820, + 0x55cc: 0x4081da20, 0x55cd: 0x4081dc20, 0x55ce: 0x4081de20, 0x55cf: 0x4081e020, + 0x55d0: 0x4081e220, 0x55d1: 0x4081e420, 0x55d2: 0x4081e620, 0x55d3: 0x4081e820, + 0x55d4: 0x4081ea20, 0x55d5: 0x4081ec20, 0x55d6: 0x4081ee20, 0x55d7: 0x4081f020, + 0x55d8: 0x4081f220, 0x55d9: 0x4081f420, 0x55da: 0x4081f620, 0x55db: 0x4081f820, + 0x55dc: 0x4081fa20, 0x55dd: 0x4081fc20, 0x55de: 0x4081fe20, 0x55df: 0x40820020, + 0x55e0: 0x40820220, 0x55e1: 0x40820420, 0x55e2: 0x40820620, 0x55e3: 0x40820820, + 0x55e4: 0x40820a20, 0x55e5: 0x40820c20, 0x55e6: 0x40820e20, 0x55e7: 0x40821020, + 0x55e8: 0x40821220, 0x55e9: 0x40821420, 0x55ea: 0x40821620, 0x55eb: 0x40821820, + 0x55ec: 0x40821a20, 0x55ed: 0x40821c20, 0x55ee: 0x40821e20, 0x55ef: 0x40822020, + 0x55f0: 0x40822220, 0x55f1: 0x40822420, 0x55f2: 0x40822620, 0x55f3: 0x40822820, + 0x55f4: 0x40822a20, 0x55f5: 0x40822c20, 0x55f6: 0x40822e20, 0x55f7: 0x40823020, + 0x55f8: 0x40823220, 0x55f9: 0x40823420, 0x55fa: 0x40823620, 0x55fb: 0x40823820, + 0x55fc: 0x40823a20, 0x55fd: 0x40823c20, 0x55fe: 0x40823e20, 0x55ff: 0x40824020, + // Block 0x158, offset 0x5600 + 0x5600: 0x40824220, 0x5601: 0x40824420, 0x5602: 0x40824620, 0x5603: 0x40824820, + 0x5604: 0x40824a20, 0x5605: 0x40824c20, 0x5606: 0x40824e20, 0x5607: 0x40825020, + 0x5608: 0x40825220, 0x5609: 0x40825420, 0x560a: 0x40825620, 0x560b: 0x40825820, + 0x560c: 0x40825a20, 0x560d: 0x40825c20, 0x560e: 0x40825e20, 0x560f: 0x40826020, + 0x5610: 0x40826220, 0x5611: 0x40826420, 0x5612: 0x40826620, 0x5613: 0x40826820, + 0x5614: 0x40826a20, 0x5615: 0x40826c20, 0x5616: 0x40826e20, 0x5617: 0x40827020, + 0x5618: 0x40827220, 0x5619: 0x40827420, 0x561a: 0x40827620, 0x561b: 0x40827820, + 0x561c: 0x40827a20, 0x561d: 0x40827c20, 0x561e: 0x40827e20, 0x561f: 0x40828020, + 0x5620: 0x40828220, 0x5621: 0x40828420, 0x5622: 0x40828620, 0x5623: 0x40828820, + 0x5624: 0x40828a20, 0x5625: 0x40828c20, 0x5626: 0x40828e20, 0x5627: 0x40829020, + 0x5628: 0x40829220, 0x5629: 0x40829420, 0x562a: 0x40829620, 0x562b: 0x40829820, + 0x562c: 0x40829a20, 0x562d: 0x40829c20, 0x562e: 0x40829e20, 0x562f: 0x4082a020, + 0x5630: 0x4082a220, 0x5631: 0x4082a420, 0x5632: 0x4082a620, 0x5633: 0x4082a820, + 0x5634: 0x4082aa20, 0x5635: 0x4082ac20, 0x5636: 0x4082ae20, 0x5637: 0x4082b020, + 0x5638: 0x4082b220, 0x5639: 0x4082b420, 0x563a: 0x4082b620, 0x563b: 0x4082b820, + 0x563c: 0x4082ba20, 0x563d: 0x4082bc20, 0x563e: 0x4082be20, 0x563f: 0x4082c020, + // Block 0x159, offset 0x5640 + 0x5640: 0x4082c220, 0x5641: 0x4082c420, 0x5642: 0x4082c620, 0x5643: 0x4082c820, + 0x5644: 0x4082ca20, 0x5645: 0x4082cc20, 0x5646: 0x4082ce20, 0x5647: 0x4082d020, + 0x5648: 0x4082d220, 0x5649: 0x4082d420, 0x564a: 0x4082d620, 0x564b: 0x4082d820, + 0x564c: 0x4082da20, 0x564d: 0x4082dc20, 0x564e: 0x4082de20, 0x564f: 0x4082e020, + 0x5650: 0x4082e220, 0x5651: 0x4082e420, 0x5652: 0x4082e620, 0x5653: 0x4082e820, + 0x5654: 0x4082ea20, 0x5655: 0x4082ec20, 0x5656: 0x4082ee20, 0x5657: 0x4082f020, + 0x5658: 0x4082f220, 0x5659: 0x4082f420, 0x565a: 0x4082f620, 0x565b: 0x4082f820, + 0x565c: 0x4082fa20, 0x565d: 0x4082fc20, 0x565e: 0x4082fe20, 0x565f: 0x40830020, + 0x5660: 0x40830220, 0x5661: 0x40830420, 0x5662: 0x40830620, 0x5663: 0x40830820, + 0x5664: 0x40830a20, 0x5665: 0x40830c20, 0x5666: 0x40830e20, 0x5667: 0x40831020, + 0x5668: 0x40831220, 0x5669: 0x40831420, 0x566a: 0x40831620, 0x566b: 0x40831820, + 0x566c: 0x40831a20, 0x566d: 0x40831c20, 0x566e: 0x40831e20, 0x566f: 0x40832020, + 0x5670: 0x40832220, 0x5671: 0x40832420, 0x5672: 0x40832620, 0x5673: 0x40832820, + 0x5674: 0x40832a20, 0x5675: 0x40832c20, 0x5676: 0x40832e20, 0x5677: 0x40833020, + 0x5678: 0x40833220, 0x5679: 0x40833420, 0x567a: 0x40833620, 0x567b: 0x40833820, + 0x567c: 0x40833a20, 0x567d: 0x40833c20, 0x567e: 0x40833e20, 0x567f: 0x40834020, + // Block 0x15a, offset 0x5680 + 0x5680: 0x40834220, 0x5681: 0x40834420, 0x5682: 0x40834620, 0x5683: 0x40834820, + 0x5684: 0x40834a20, 0x5685: 0x40834c20, 0x5686: 0x40834e20, 0x5687: 0x40835020, + 0x5688: 0x40835220, 0x5689: 0x40835420, 0x568a: 0x40835620, 0x568b: 0x40835820, + 0x568c: 0x40835a20, 0x568d: 0x40835c20, 0x568e: 0x40835e20, 0x568f: 0x40836020, + 0x5690: 0x40836220, 0x5691: 0x40836420, 0x5692: 0x40836620, 0x5693: 0x40836820, + 0x5694: 0x40836a20, 0x5695: 0x40836c20, 0x5696: 0x40836e20, 0x5697: 0x40837020, + 0x5698: 0x40837220, 0x5699: 0x40837420, 0x569a: 0x40837620, 0x569b: 0x40837820, + 0x569c: 0x40837a20, 0x569d: 0x40837c20, 0x569e: 0x40837e20, 0x569f: 0x40838020, + 0x56a0: 0x40838220, 0x56a1: 0x40838420, 0x56a2: 0x40838620, 0x56a3: 0x40838820, + 0x56a4: 0x40838a20, 0x56a5: 0x40838c20, 0x56a6: 0x40838e20, 0x56a7: 0x40839020, + 0x56a8: 0x40839220, 0x56a9: 0x40839420, 0x56aa: 0x40839620, 0x56ab: 0x40839820, + 0x56ac: 0x40839a20, 0x56ad: 0x40839c20, 0x56ae: 0x40839e20, 0x56af: 0x4083a020, + 0x56b0: 0x4083a220, 0x56b1: 0x4083a420, 0x56b2: 0x4083a620, 0x56b3: 0x4083a820, + 0x56b4: 0x4083aa20, 0x56b5: 0x4083ac20, 0x56b6: 0x4083ae20, 0x56b7: 0x4083b020, + 0x56b8: 0x4083b220, 0x56b9: 0x4083b420, 0x56ba: 0x4083b620, 0x56bb: 0x4083b820, + 0x56bc: 0x4083ba20, 0x56bd: 0x4083bc20, 0x56be: 0x4083be20, 0x56bf: 0x4083c020, + // Block 0x15b, offset 0x56c0 + 0x56c0: 0x4083c220, 0x56c1: 0x4083c420, 0x56c2: 0x4083c620, 0x56c3: 0x4083c820, + 0x56c4: 0x4083ca20, 0x56c5: 0x4083cc20, 0x56c6: 0x4083ce20, 0x56c7: 0x4083d020, + 0x56c8: 0x4083d220, 0x56c9: 0x4083d420, 0x56ca: 0x4083d620, 0x56cb: 0x4083d820, + 0x56cc: 0x4083da20, 0x56cd: 0x4083dc20, 0x56ce: 0x4083de20, 0x56cf: 0x4083e020, + 0x56d0: 0x4083e220, 0x56d1: 0x4083e420, 0x56d2: 0x4083e620, 0x56d3: 0x4083e820, + 0x56d4: 0x4083ea20, 0x56d5: 0x4083ec20, 0x56d6: 0x4083ee20, 0x56d7: 0x4083f020, + 0x56d8: 0x4083f220, 0x56d9: 0x4083f420, 0x56da: 0x4083f620, 0x56db: 0x4083f820, + 0x56dc: 0x4083fa20, 0x56dd: 0x4083fc20, 0x56de: 0x4083fe20, 0x56df: 0x40840020, + 0x56e0: 0x40840220, 0x56e1: 0x40840420, 0x56e2: 0x40840620, 0x56e3: 0x40840820, + 0x56e4: 0x40840a20, 0x56e5: 0x40840c20, 0x56e6: 0x40840e20, 0x56e7: 0x40841020, + 0x56e8: 0x40841220, 0x56e9: 0x40841420, 0x56ea: 0x40841620, 0x56eb: 0x40841820, + 0x56ec: 0x40841a20, 0x56ed: 0x40841c20, 0x56ee: 0x40841e20, 0x56ef: 0x40842020, + 0x56f0: 0x40842220, 0x56f1: 0x40842420, 0x56f2: 0x40842620, 0x56f3: 0x40842820, + 0x56f4: 0x40842a20, 0x56f5: 0x40842c20, 0x56f6: 0x40842e20, 0x56f7: 0x40843020, + 0x56f8: 0x40843220, 0x56f9: 0x40843420, 0x56fa: 0x40843620, 0x56fb: 0x40843820, + 0x56fc: 0x40843a20, 0x56fd: 0x40843c20, 0x56fe: 0x40843e20, 0x56ff: 0x40844020, + // Block 0x15c, offset 0x5700 + 0x5700: 0x40844220, 0x5701: 0x40844420, 0x5702: 0x40844620, 0x5703: 0x40844820, + 0x5704: 0x40844a20, 0x5705: 0x40844c20, 0x5706: 0x40844e20, 0x5707: 0x40845020, + 0x5708: 0x40845220, 0x5709: 0x40845420, 0x570a: 0x40845620, 0x570b: 0x40845820, + 0x570c: 0x40845a20, 0x570d: 0x40845c20, 0x570e: 0x40845e20, 0x570f: 0x40846020, + 0x5710: 0x40846220, 0x5711: 0x40846420, 0x5712: 0x40846620, 0x5713: 0x40846820, + 0x5714: 0x40846a20, 0x5715: 0x40846c20, 0x5716: 0x40846e20, 0x5717: 0x40847020, + 0x5718: 0x40847220, 0x5719: 0x40847420, 0x571a: 0x40847620, 0x571b: 0x40847820, + 0x571c: 0x40847a20, 0x571d: 0x40847c20, 0x571e: 0x40847e20, 0x571f: 0x40848020, + 0x5720: 0x40848220, 0x5721: 0x40848420, 0x5722: 0x40848620, 0x5723: 0x40848820, + 0x5724: 0x40848a20, 0x5725: 0x40848c20, 0x5726: 0x40848e20, 0x5727: 0x40849020, + 0x5728: 0x40849220, 0x5729: 0x40849420, 0x572a: 0x40849620, 0x572b: 0x40849820, + 0x572c: 0x40849a20, 0x572d: 0x40849c20, 0x572e: 0x40849e20, 0x572f: 0x4084a020, + 0x5730: 0x4084a220, 0x5731: 0x4084a420, 0x5732: 0x4084a620, 0x5733: 0x4084a820, + 0x5734: 0x4084aa20, 0x5735: 0x4084ac20, 0x5736: 0x4084ae20, 0x5737: 0x4084b020, + 0x5738: 0x4084b220, 0x5739: 0x4084b420, 0x573a: 0x4084b620, 0x573b: 0x4084b820, + 0x573c: 0x4084ba20, 0x573d: 0x4084bc20, 0x573e: 0x4084be20, 0x573f: 0x4084c020, + // Block 0x15d, offset 0x5740 + 0x5740: 0x4084c220, 0x5741: 0x4084c420, 0x5742: 0x4084c620, 0x5743: 0x4084c820, + 0x5744: 0x4084ca20, 0x5745: 0x4084cc20, 0x5746: 0x4084ce20, 0x5747: 0x4084d020, + 0x5748: 0x4084d220, 0x5749: 0x4084d420, 0x574a: 0x4084d620, 0x574b: 0x4084d820, + 0x574c: 0x4084da20, 0x574d: 0x4084dc20, 0x574e: 0x4084de20, 0x574f: 0x4084e020, + 0x5750: 0x4084e220, 0x5751: 0x4084e420, 0x5752: 0x4084e620, 0x5753: 0x4084e820, + 0x5754: 0x4084ea20, 0x5755: 0x4084ec20, 0x5756: 0x4084ee20, 0x5757: 0x4084f020, + 0x5758: 0x4084f220, 0x5759: 0x4084f420, 0x575a: 0x4084f620, 0x575b: 0x4084f820, + 0x575c: 0x4084fa20, 0x575d: 0x4084fc20, 0x575e: 0x4084fe20, 0x575f: 0x40850020, + 0x5760: 0x40850220, 0x5761: 0x40850420, 0x5762: 0x40850620, 0x5763: 0x40850820, + 0x5764: 0x40850a20, 0x5765: 0x40850c20, 0x5766: 0x40850e20, 0x5767: 0x40851020, + 0x5768: 0x40851220, 0x5769: 0x40851420, 0x576a: 0x40851620, 0x576b: 0x40851820, + 0x576c: 0x40851a20, 0x576d: 0x40851c20, 0x576e: 0x40851e20, 0x576f: 0x40852020, + 0x5770: 0x40852220, 0x5771: 0x40852420, 0x5772: 0x40852620, 0x5773: 0x40852820, + 0x5774: 0x40852a20, 0x5775: 0x40852c20, 0x5776: 0x40852e20, 0x5777: 0x40853020, + 0x5778: 0x40853220, 0x5779: 0x40853420, 0x577a: 0x40853620, 0x577b: 0x40853820, + 0x577c: 0x40853a20, 0x577d: 0x40853c20, 0x577e: 0x40853e20, 0x577f: 0x40854020, + // Block 0x15e, offset 0x5780 + 0x5780: 0x40854220, 0x5781: 0x40854420, 0x5782: 0x40854620, 0x5783: 0x40854820, + 0x5784: 0x40854a20, 0x5785: 0x40854c20, 0x5786: 0x40854e20, 0x5787: 0x40855020, + 0x5788: 0x40855220, 0x5789: 0x40855420, 0x578a: 0x40855620, 0x578b: 0x40855820, + 0x578c: 0x40855a20, 0x578d: 0x40855c20, 0x578e: 0x40855e20, 0x578f: 0x40856020, + 0x5790: 0x40856220, 0x5791: 0x40856420, 0x5792: 0x40856620, 0x5793: 0x40856820, + 0x5794: 0x40856a20, 0x5795: 0x40856c20, 0x5796: 0x40856e20, 0x5797: 0x40857020, + 0x5798: 0x40857220, 0x5799: 0x40857420, 0x579a: 0x40857620, 0x579b: 0x40857820, + 0x579c: 0x40857a20, 0x579d: 0x40857c20, 0x579e: 0x40857e20, 0x579f: 0x40858020, + 0x57a0: 0x40858220, 0x57a1: 0x40858420, 0x57a2: 0x40858620, 0x57a3: 0x40858820, + 0x57a4: 0x40858a20, 0x57a5: 0x40858c20, 0x57a6: 0x40858e20, 0x57a7: 0x40859020, + 0x57a8: 0x40859220, 0x57a9: 0x40859420, 0x57aa: 0x40859620, 0x57ab: 0x40859820, + 0x57ac: 0x40859a20, 0x57ad: 0x40859c20, 0x57ae: 0x40859e20, 0x57af: 0x4085a020, + 0x57b0: 0x4085a220, 0x57b1: 0x4085a420, 0x57b2: 0x4085a620, 0x57b3: 0x4085a820, + 0x57b4: 0x4085aa20, 0x57b5: 0x4085ac20, 0x57b6: 0x4085ae20, 0x57b7: 0x4085b020, + 0x57b8: 0x4085b220, 0x57b9: 0x4085b420, 0x57ba: 0x4085b620, 0x57bb: 0x4085b820, + 0x57bc: 0x4085ba20, 0x57bd: 0x4085bc20, 0x57be: 0x4085be20, 0x57bf: 0x4085c020, + // Block 0x15f, offset 0x57c0 + 0x57c0: 0x4085c220, 0x57c1: 0x4085c420, 0x57c2: 0x4085c620, 0x57c3: 0x4085c820, + 0x57c4: 0x4085ca20, 0x57c5: 0x4085cc20, 0x57c6: 0x4085ce20, 0x57c7: 0x4085d020, + 0x57c8: 0x4085d220, 0x57c9: 0x4085d420, 0x57ca: 0x4085d620, 0x57cb: 0x4085d820, + 0x57cc: 0x4085da20, 0x57cd: 0x4085dc20, 0x57ce: 0x4085de20, 0x57cf: 0x4085e020, + 0x57d0: 0x4085e220, 0x57d1: 0x4085e420, 0x57d2: 0x4085e620, 0x57d3: 0x4085e820, + 0x57d4: 0x4085ea20, 0x57d5: 0x4085ec20, 0x57d6: 0x4085ee20, 0x57d7: 0x4085f020, + 0x57d8: 0x4085f220, 0x57d9: 0x4085f420, 0x57da: 0x4085f620, 0x57db: 0x4085f820, + 0x57dc: 0x4085fa20, 0x57dd: 0x4085fc20, 0x57de: 0x4085fe20, 0x57df: 0x40860020, + 0x57e0: 0x40860220, 0x57e1: 0x40860420, 0x57e2: 0x40860620, 0x57e3: 0x40860820, + 0x57e4: 0x40860a20, 0x57e5: 0x40860c20, 0x57e6: 0x40860e20, 0x57e7: 0x40861020, + 0x57e8: 0x40861220, 0x57e9: 0x40861420, 0x57ea: 0x40861620, 0x57eb: 0x40861820, + 0x57ec: 0x40861a20, 0x57ed: 0x40861c20, 0x57ee: 0x40861e20, + // Block 0x160, offset 0x5800 + 0x5800: 0x405e3a20, 0x5801: 0x405e3c20, 0x5802: 0x405e3e20, 0x5803: 0x405e4020, + 0x5804: 0x405e4220, 0x5805: 0x405e4420, 0x5806: 0x405e4620, 0x5807: 0x405e4820, + 0x5808: 0x405e4a20, 0x5809: 0x405e4c20, 0x580a: 0x405e4e20, 0x580b: 0x405e5020, + 0x580c: 0x405e5220, 0x580d: 0x405e5420, 0x580e: 0x405e5620, 0x580f: 0x405e5820, + 0x5810: 0x405e5a20, 0x5811: 0x405e5c20, 0x5812: 0x405e5e20, 0x5813: 0x405e6020, + 0x5814: 0x405e6220, 0x5815: 0x405e6420, 0x5816: 0x405e6620, 0x5817: 0x405e6820, + 0x5818: 0x405e6a20, 0x5819: 0x405e6c20, 0x581a: 0x405e6e20, 0x581b: 0x405e7020, + 0x581c: 0x405e7220, 0x581d: 0x405e7420, 0x581e: 0x405e7620, 0x581f: 0x405e7820, + 0x5820: 0x405e7a20, 0x5821: 0x405e7c20, 0x5822: 0x405e7e20, 0x5823: 0x405e8020, + 0x5824: 0x405e8220, 0x5825: 0x405e8420, 0x5826: 0x405e8620, 0x5827: 0x405e8820, + 0x5828: 0x405e8a20, 0x5829: 0x405e8c20, 0x582a: 0x405e8e20, 0x582b: 0x405e9020, + 0x582c: 0x405e9220, 0x582d: 0x405e9420, 0x582e: 0x405e9620, 0x582f: 0x405e9820, + 0x5830: 0x405e9a20, 0x5831: 0x405e9c20, 0x5832: 0x405e9e20, 0x5833: 0x405ea020, + 0x5834: 0x405ea220, 0x5835: 0x405ea420, 0x5836: 0x405ea620, 0x5837: 0x405ea820, + 0x5838: 0x405eaa20, 0x5839: 0x405eac20, 0x583a: 0x405eae20, 0x583b: 0x405eb020, + 0x583c: 0x405eb220, 0x583d: 0x405eb420, 0x583e: 0x405eb620, 0x583f: 0x405eb820, + // Block 0x161, offset 0x5840 + 0x5840: 0x405eba20, 0x5841: 0x405ebc20, 0x5842: 0x405ebe20, 0x5843: 0x405ec020, + 0x5844: 0x405ec220, 0x5845: 0x405ec420, 0x5846: 0x405ec620, 0x5847: 0x405ec820, + 0x5848: 0x405eca20, 0x5849: 0x405ecc20, 0x584a: 0x405ece20, 0x584b: 0x405ed020, + 0x584c: 0x405ed220, 0x584d: 0x405ed420, 0x584e: 0x405ed620, 0x584f: 0x405ed820, + 0x5850: 0x405eda20, 0x5851: 0x405edc20, 0x5852: 0x405ede20, 0x5853: 0x405ee020, + 0x5854: 0x405ee220, 0x5855: 0x405ee420, 0x5856: 0x405ee620, 0x5857: 0x405ee820, + 0x5858: 0x405eea20, 0x5859: 0x405eec20, 0x585a: 0x405eee20, 0x585b: 0x405ef020, + 0x585c: 0x405ef220, 0x585d: 0x405ef420, 0x585e: 0x405ef620, 0x585f: 0x405ef820, + 0x5860: 0x405efa20, 0x5861: 0x405efc20, 0x5862: 0x405efe20, 0x5863: 0x405f0020, + 0x5864: 0x405f0220, 0x5865: 0x405f0420, 0x5866: 0x405f0620, 0x5867: 0x405f0820, + 0x5868: 0x405f0a20, 0x5869: 0x405f0c20, 0x586a: 0x405f0e20, 0x586b: 0x405f1020, + 0x586c: 0x405f1220, 0x586d: 0x405f1420, 0x586e: 0x405f1620, 0x586f: 0x405f1820, + 0x5870: 0x405f1a20, 0x5871: 0x405f1c20, 0x5872: 0x405f1e20, 0x5873: 0x405f2020, + 0x5874: 0x405f2220, 0x5875: 0x405f2420, 0x5876: 0x405f2620, 0x5877: 0x405f2820, + 0x5878: 0x405f2a20, 0x5879: 0x405f2c20, 0x587a: 0x405f2e20, 0x587b: 0x405f3020, + 0x587c: 0x405f3220, 0x587d: 0x405f3420, 0x587e: 0x405f3620, 0x587f: 0x405f3820, + // Block 0x162, offset 0x5880 + 0x5880: 0x405f3a20, 0x5881: 0x405f3c20, 0x5882: 0x405f3e20, 0x5883: 0x405f4020, + 0x5884: 0x405f4220, 0x5885: 0x405f4420, 0x5886: 0x405f4620, 0x5887: 0x405f4820, + 0x5888: 0x405f4a20, 0x5889: 0x405f4c20, 0x588a: 0x405f4e20, 0x588b: 0x405f5020, + 0x588c: 0x405f5220, 0x588d: 0x405f5420, 0x588e: 0x405f5620, 0x588f: 0x405f5820, + 0x5890: 0x405f5a20, 0x5891: 0x405f5c20, 0x5892: 0x405f5e20, 0x5893: 0x405f6020, + 0x5894: 0x405f6220, 0x5895: 0x405f6420, 0x5896: 0x405f6620, 0x5897: 0x405f6820, + 0x5898: 0x405f6a20, 0x5899: 0x405f6c20, 0x589a: 0x405f6e20, 0x589b: 0x405f7020, + 0x589c: 0x405f7220, 0x589d: 0x405f7420, 0x589e: 0x405f7620, 0x589f: 0x405f7820, + 0x58a0: 0x405f7a20, 0x58a1: 0x405f7c20, 0x58a2: 0x405f7e20, 0x58a3: 0x405f8020, + 0x58a4: 0x405f8220, 0x58a5: 0x405f8420, 0x58a6: 0x405f8620, 0x58a7: 0x405f8820, + 0x58a8: 0x405f8a20, 0x58a9: 0x405f8c20, 0x58aa: 0x405f8e20, 0x58ab: 0x405f9020, + 0x58ac: 0x405f9220, 0x58ad: 0x405f9420, 0x58ae: 0x405f9620, 0x58af: 0x405f9820, + 0x58b0: 0x405f9a20, 0x58b1: 0x405f9c20, 0x58b2: 0x405f9e20, 0x58b3: 0x405fa020, + 0x58b4: 0x405fa220, 0x58b5: 0x405fa420, 0x58b6: 0x405fa620, 0x58b7: 0x405fa820, + 0x58b8: 0x405faa20, 0x58b9: 0x405fac20, 0x58ba: 0x405fae20, 0x58bb: 0x405fb020, + 0x58bc: 0x405fb220, 0x58bd: 0x405fb420, 0x58be: 0x405fb620, 0x58bf: 0x405fb820, + // Block 0x163, offset 0x58c0 + 0x58c0: 0x405fba20, 0x58c1: 0x405fbc20, 0x58c2: 0x405fbe20, 0x58c3: 0x405fc020, + 0x58c4: 0x405fc220, 0x58c5: 0x405fc420, 0x58c6: 0x405fc620, 0x58c7: 0x405fc820, + 0x58c8: 0x405fca20, 0x58c9: 0x405fcc20, 0x58ca: 0x405fce20, 0x58cb: 0x405fd020, + 0x58cc: 0x405fd220, 0x58cd: 0x405fd420, 0x58ce: 0x405fd620, 0x58cf: 0x405fd820, + 0x58d0: 0x405fda20, 0x58d1: 0x405fdc20, 0x58d2: 0x405fde20, 0x58d3: 0x405fe020, + 0x58d4: 0x405fe220, 0x58d5: 0x405fe420, 0x58d6: 0x405fe620, 0x58d7: 0x405fe820, + 0x58d8: 0x405fea20, 0x58d9: 0x405fec20, 0x58da: 0x405fee20, 0x58db: 0x405ff020, + 0x58dc: 0x405ff220, 0x58dd: 0x405ff420, 0x58de: 0x405ff620, 0x58df: 0x405ff820, + 0x58e0: 0x405ffa20, 0x58e1: 0x405ffc20, 0x58e2: 0x405ffe20, 0x58e3: 0x40600020, + 0x58e4: 0x40600220, 0x58e5: 0x40600420, 0x58e6: 0x40600620, 0x58e7: 0x40600820, + 0x58e8: 0x40600a20, 0x58e9: 0x40600c20, 0x58ea: 0x40600e20, 0x58eb: 0x40601020, + 0x58ec: 0x40601220, 0x58ed: 0x40601420, 0x58ee: 0x40601620, 0x58ef: 0x40601820, + 0x58f0: 0x40601a20, 0x58f1: 0x40601c20, 0x58f2: 0x40601e20, 0x58f3: 0x40602020, + 0x58f4: 0x40602220, 0x58f5: 0x40602420, 0x58f6: 0x40602620, 0x58f7: 0x40602820, + 0x58f8: 0x40602a20, 0x58f9: 0x40602c20, 0x58fa: 0x40602e20, 0x58fb: 0x40603020, + 0x58fc: 0x40603220, 0x58fd: 0x40603420, 0x58fe: 0x40603620, 0x58ff: 0x40603820, + // Block 0x164, offset 0x5900 + 0x5900: 0x40603a20, 0x5901: 0x40603c20, 0x5902: 0x40603e20, 0x5903: 0x40604020, + 0x5904: 0x40604220, 0x5905: 0x40604420, 0x5906: 0x40604620, 0x5907: 0x40604820, + 0x5908: 0x40604a20, 0x5909: 0x40604c20, 0x590a: 0x40604e20, 0x590b: 0x40605020, + 0x590c: 0x40605220, 0x590d: 0x40605420, 0x590e: 0x40605620, 0x590f: 0x40605820, + 0x5910: 0x40605a20, 0x5911: 0x40605c20, 0x5912: 0x40605e20, 0x5913: 0x40606020, + 0x5914: 0x40606220, 0x5915: 0x40606420, 0x5916: 0x40606620, 0x5917: 0x40606820, + 0x5918: 0x40606a20, 0x5919: 0x40606c20, 0x591a: 0x40606e20, 0x591b: 0x40607020, + 0x591c: 0x40607220, 0x591d: 0x40607420, 0x591e: 0x40607620, 0x591f: 0x40607820, + 0x5920: 0x40607a20, 0x5921: 0x40607c20, 0x5922: 0x40607e20, 0x5923: 0x40608020, + 0x5924: 0x40608220, 0x5925: 0x40608420, 0x5926: 0x40608620, 0x5927: 0x40608820, + 0x5928: 0x40608a20, 0x5929: 0x40608c20, 0x592a: 0x40608e20, 0x592b: 0x40609020, + 0x592c: 0x40609220, 0x592d: 0x40609420, 0x592e: 0x40609620, 0x592f: 0x40609820, + 0x5930: 0x40609a20, 0x5931: 0x40609c20, 0x5932: 0x40609e20, 0x5933: 0x4060a020, + 0x5934: 0x4060a220, 0x5935: 0x4060a420, 0x5936: 0x4060a620, 0x5937: 0x4060a820, + 0x5938: 0x4060aa20, 0x5939: 0x4060ac20, 0x593a: 0x4060ae20, 0x593b: 0x4060b020, + 0x593c: 0x4060b220, 0x593d: 0x4060b420, 0x593e: 0x4060b620, 0x593f: 0x4060b820, + // Block 0x165, offset 0x5940 + 0x5940: 0x4060ba20, 0x5941: 0x4060bc20, 0x5942: 0x4060be20, 0x5943: 0x4060c020, + 0x5944: 0x4060c220, 0x5945: 0x4060c420, 0x5946: 0x4060c620, 0x5947: 0x4060c820, + 0x5948: 0x4060ca20, 0x5949: 0x4060cc20, 0x594a: 0x4060ce20, 0x594b: 0x4060d020, + 0x594c: 0x4060d220, 0x594d: 0x4060d420, 0x594e: 0x4060d620, 0x594f: 0x4060d820, + 0x5950: 0x4060da20, 0x5951: 0x4060dc20, 0x5952: 0x4060de20, 0x5953: 0x4060e020, + 0x5954: 0x4060e220, 0x5955: 0x4060e420, 0x5956: 0x4060e620, 0x5957: 0x4060e820, + 0x5958: 0x4060ea20, 0x5959: 0x4060ec20, 0x595a: 0x4060ee20, 0x595b: 0x4060f020, + 0x595c: 0x4060f220, 0x595d: 0x4060f420, 0x595e: 0x4060f620, 0x595f: 0x4060f820, + 0x5960: 0x4060fa20, 0x5961: 0x4060fc20, 0x5962: 0x4060fe20, 0x5963: 0x40610020, + 0x5964: 0x40610220, 0x5965: 0x40610420, 0x5966: 0x40610620, 0x5967: 0x40610820, + 0x5968: 0x40610a20, 0x5969: 0x40610c20, 0x596a: 0x40610e20, 0x596b: 0x40611020, + 0x596c: 0x40611220, 0x596d: 0x40611420, 0x596e: 0x40611620, 0x596f: 0x40611820, + 0x5970: 0x40611a20, 0x5971: 0x40611c20, 0x5972: 0x40611e20, 0x5973: 0x40612020, + 0x5974: 0x40612220, 0x5975: 0x40612420, 0x5976: 0x40612620, 0x5977: 0x40612820, + 0x5978: 0x40612a20, 0x5979: 0x40612c20, 0x597a: 0x40612e20, 0x597b: 0x40613020, + 0x597c: 0x40613220, 0x597d: 0x40613420, 0x597e: 0x40613620, 0x597f: 0x40613820, + // Block 0x166, offset 0x5980 + 0x5980: 0x40613a20, 0x5981: 0x40613c20, 0x5982: 0x40613e20, 0x5983: 0x40614020, + 0x5984: 0x40614220, 0x5985: 0x40614420, 0x5986: 0x40614620, 0x5987: 0x40614820, + 0x5988: 0x40614a20, 0x5989: 0x40614c20, 0x598a: 0x40614e20, 0x598b: 0x40615020, + 0x598c: 0x40615220, 0x598d: 0x40615420, 0x598e: 0x40615620, 0x598f: 0x40615820, + 0x5990: 0x40615a20, 0x5991: 0x40615c20, 0x5992: 0x40615e20, 0x5993: 0x40616020, + 0x5994: 0x40616220, 0x5995: 0x40616420, 0x5996: 0x40616620, 0x5997: 0x40616820, + 0x5998: 0x40616a20, 0x5999: 0x40616c20, 0x599a: 0x40616e20, 0x599b: 0x40617020, + 0x599c: 0x40617220, 0x599d: 0x40617420, 0x599e: 0x40617620, 0x599f: 0x40617820, + 0x59a0: 0x40617a20, 0x59a1: 0x40617c20, 0x59a2: 0x40617e20, 0x59a3: 0x40618020, + 0x59a4: 0x40618220, 0x59a5: 0x40618420, 0x59a6: 0x40618620, 0x59a7: 0x40618820, + 0x59a8: 0x40618a20, 0x59a9: 0x40618c20, 0x59aa: 0x40618e20, 0x59ab: 0x40619020, + 0x59ac: 0x40619220, 0x59ad: 0x40619420, 0x59ae: 0x40619620, 0x59af: 0x40619820, + 0x59b0: 0x40619a20, 0x59b1: 0x40619c20, 0x59b2: 0x40619e20, 0x59b3: 0x4061a020, + 0x59b4: 0x4061a220, 0x59b5: 0x4061a420, 0x59b6: 0x4061a620, 0x59b7: 0x4061a820, + 0x59b8: 0x4061aa20, 0x59b9: 0x4061ac20, 0x59ba: 0x4061ae20, 0x59bb: 0x4061b020, + 0x59bc: 0x4061b220, 0x59bd: 0x4061b420, 0x59be: 0x4061b620, 0x59bf: 0x4061b820, + // Block 0x167, offset 0x59c0 + 0x59c0: 0x4061ba20, 0x59c1: 0x4061bc20, 0x59c2: 0x4061be20, 0x59c3: 0x4061c020, + 0x59c4: 0x4061c220, 0x59c5: 0x4061c420, 0x59c6: 0x4061c620, 0x59c7: 0x4061c820, + 0x59c8: 0x4061ca20, 0x59c9: 0x4061cc20, 0x59ca: 0x4061ce20, 0x59cb: 0x4061d020, + 0x59cc: 0x4061d220, 0x59cd: 0x4061d420, 0x59ce: 0x4061d620, 0x59cf: 0x4061d820, + 0x59d0: 0x4061da20, 0x59d1: 0x4061dc20, 0x59d2: 0x4061de20, 0x59d3: 0x4061e020, + 0x59d4: 0x4061e220, 0x59d5: 0x4061e420, 0x59d6: 0x4061e620, 0x59d7: 0x4061e820, + 0x59d8: 0x4061ea20, 0x59d9: 0x4061ec20, 0x59da: 0x4061ee20, 0x59db: 0x4061f020, + 0x59dc: 0x4061f220, 0x59dd: 0x4061f420, 0x59de: 0x4061f620, 0x59df: 0x4061f820, + 0x59e0: 0x4061fa20, 0x59e1: 0x4061fc20, 0x59e2: 0x4061fe20, 0x59e3: 0x40620020, + 0x59e4: 0x40620220, 0x59e5: 0x40620420, 0x59e6: 0x40620620, 0x59e7: 0x40620820, + 0x59e8: 0x40620a20, 0x59e9: 0x40620c20, 0x59ea: 0x40620e20, 0x59eb: 0x40621020, + 0x59ec: 0x40621220, 0x59ed: 0x40621420, 0x59ee: 0x40621620, 0x59ef: 0x40621820, + 0x59f0: 0x40621a20, 0x59f1: 0x40621c20, 0x59f2: 0x40621e20, 0x59f3: 0x40622020, + 0x59f4: 0x40622220, 0x59f5: 0x40622420, 0x59f6: 0x40622620, 0x59f7: 0x40622820, + 0x59f8: 0x40622a20, 0x59f9: 0x40622c20, 0x59fa: 0x40622e20, 0x59fb: 0x40623020, + 0x59fc: 0x40623220, 0x59fd: 0x40623420, 0x59fe: 0x40623620, 0x59ff: 0x40623820, + // Block 0x168, offset 0x5a00 + 0x5a00: 0x40623a20, 0x5a01: 0x40623c20, 0x5a02: 0x40623e20, 0x5a03: 0x40624020, + 0x5a04: 0x40624220, 0x5a05: 0x40624420, 0x5a06: 0x40624620, 0x5a07: 0x40624820, + 0x5a08: 0x40624a20, 0x5a09: 0x40624c20, 0x5a0a: 0x40624e20, 0x5a0b: 0x40625020, + 0x5a0c: 0x40625220, 0x5a0d: 0x40625420, 0x5a0e: 0x40625620, 0x5a0f: 0x40625820, + 0x5a10: 0x40625a20, 0x5a11: 0x40625c20, 0x5a12: 0x40625e20, 0x5a13: 0x40626020, + 0x5a14: 0x40626220, 0x5a15: 0x40626420, 0x5a16: 0x40626620, 0x5a17: 0x40626820, + 0x5a18: 0x40626a20, 0x5a19: 0x40626c20, 0x5a1a: 0x40626e20, 0x5a1b: 0x40627020, + 0x5a1c: 0x40627220, 0x5a1d: 0x40627420, 0x5a1e: 0x40627620, 0x5a1f: 0x40627820, + 0x5a20: 0x40627a20, 0x5a21: 0x40627c20, 0x5a22: 0x40627e20, 0x5a23: 0x40628020, + 0x5a24: 0x40628220, 0x5a25: 0x40628420, 0x5a26: 0x40628620, 0x5a27: 0x40628820, + 0x5a28: 0x40628a20, 0x5a29: 0x40628c20, 0x5a2a: 0x40628e20, 0x5a2b: 0x40629020, + 0x5a2c: 0x40629220, 0x5a2d: 0x40629420, 0x5a2e: 0x40629620, 0x5a2f: 0x40629820, + 0x5a30: 0x40629a20, 0x5a31: 0x40629c20, 0x5a32: 0x40629e20, 0x5a33: 0x4062a020, + 0x5a34: 0x4062a220, 0x5a35: 0x4062a420, 0x5a36: 0x4062a620, 0x5a37: 0x4062a820, + 0x5a38: 0x4062aa20, + // Block 0x169, offset 0x5a40 + 0x5a40: 0x406fb620, 0x5a41: 0x406fb820, 0x5a42: 0x406fba20, 0x5a43: 0x406fbc20, + 0x5a44: 0x406fbe20, 0x5a45: 0x406fc020, 0x5a46: 0x006fbe84, 0x5a47: 0x406fc220, + 0x5a48: 0x406fc420, 0x5a49: 0x406fc620, 0x5a4a: 0x406fc820, 0x5a4b: 0x406fca20, + 0x5a4c: 0x406fcc20, 0x5a4d: 0x406fce20, 0x5a4e: 0x406fd020, 0x5a4f: 0x406fd220, + 0x5a50: 0x406fd420, 0x5a51: 0x406fd620, 0x5a52: 0x406fd820, 0x5a53: 0x006fd484, + 0x5a54: 0x406fda20, 0x5a55: 0x406fdc20, 0x5a56: 0x406fde20, 0x5a57: 0x406fe020, + 0x5a58: 0x406fe220, 0x5a59: 0x406fe420, 0x5a5a: 0x406fe620, 0x5a5b: 0x406fe820, + 0x5a5c: 0x406fea20, 0x5a5d: 0x406fec20, 0x5a5e: 0x406fee20, 0x5a5f: 0x406ff020, + 0x5a60: 0x406ff220, 0x5a61: 0x406ff420, 0x5a62: 0x406ff620, 0x5a63: 0x406ff820, + 0x5a64: 0x406ffa20, 0x5a65: 0x006ff884, 0x5a66: 0x406ffc20, 0x5a67: 0x406ffe20, + 0x5a68: 0x40700020, 0x5a69: 0x40700220, 0x5a6a: 0x40700420, 0x5a6b: 0x40700620, + 0x5a6c: 0x40700820, 0x5a6d: 0x40700a20, 0x5a6e: 0x40700c20, 0x5a6f: 0x40700e20, + 0x5a70: 0x40701020, 0x5a71: 0x40701220, 0x5a72: 0x40701420, 0x5a73: 0x40701620, + 0x5a74: 0x40701820, 0x5a75: 0x40701a20, 0x5a76: 0x40701c20, 0x5a77: 0x40701e20, + 0x5a78: 0x40702020, 0x5a79: 0x40702220, 0x5a7a: 0x40702420, 0x5a7b: 0x40702620, + 0x5a7c: 0x40702820, 0x5a7d: 0x40702a20, 0x5a7e: 0x40702c20, 0x5a7f: 0x00702a84, + // Block 0x16a, offset 0x5a80 + 0x5a80: 0x40702e20, 0x5a81: 0x40703020, 0x5a82: 0x40703220, 0x5a83: 0x40703420, + 0x5a84: 0x40703620, + 0x5a90: 0x40703820, 0x5a91: 0x40703a20, 0x5a92: 0x40703c20, 0x5a93: 0x40703e20, + 0x5a94: 0x40704020, 0x5a95: 0x40704220, 0x5a96: 0x40704420, 0x5a97: 0x40704620, + 0x5a98: 0x40704820, 0x5a99: 0x40704a20, 0x5a9a: 0x40704c20, 0x5a9b: 0x40704e20, + 0x5a9c: 0x40705020, 0x5a9d: 0x40705220, 0x5a9e: 0x40705420, 0x5a9f: 0x40705620, + 0x5aa0: 0x40705820, 0x5aa1: 0x40705a20, 0x5aa2: 0x40705c20, 0x5aa3: 0x40705e20, + 0x5aa4: 0x40706020, 0x5aa5: 0x40706220, 0x5aa6: 0x40706420, 0x5aa7: 0x40706620, + 0x5aa8: 0x40706820, 0x5aa9: 0x40706a20, 0x5aaa: 0x40706c20, 0x5aab: 0x40706e20, + 0x5aac: 0x40707020, 0x5aad: 0x40707220, 0x5aae: 0x40707420, 0x5aaf: 0x40707620, + 0x5ab0: 0x40707820, 0x5ab1: 0x40707a20, 0x5ab2: 0x40707c20, 0x5ab3: 0x40707e20, + 0x5ab4: 0x40708020, 0x5ab5: 0x40708220, 0x5ab6: 0x40708420, 0x5ab7: 0x40708620, + 0x5ab8: 0x40708820, 0x5ab9: 0x40708a20, 0x5aba: 0x40708c20, 0x5abb: 0x40708e20, + 0x5abc: 0x40709020, 0x5abd: 0x40709220, 0x5abe: 0x40709420, + // Block 0x16b, offset 0x5ac0 + 0x5acf: 0x40709620, + 0x5ad0: 0x40709820, 0x5ad1: 0x40709a20, 0x5ad2: 0x40709c20, 0x5ad3: 0x40709e20, + 0x5ad4: 0x4070a020, 0x5ad5: 0x4070a220, 0x5ad6: 0x4070a420, 0x5ad7: 0x4070a620, + 0x5ad8: 0x4070a820, 0x5ad9: 0x4070aa20, 0x5ada: 0x4070ac20, 0x5adb: 0x4070ae20, + 0x5adc: 0x4070b020, 0x5add: 0x4070b220, 0x5ade: 0x4070b420, 0x5adf: 0x4070b620, + // Block 0x16c, offset 0x5b00 + 0x5b00: 0x00657c91, 0x5b01: 0x0065c28e, + // Block 0x16d, offset 0x5b40 + 0x5b40: 0x401ba420, 0x5b41: 0x401ba620, 0x5b42: 0x401ba820, 0x5b43: 0x401baa20, + 0x5b44: 0x401bac20, 0x5b45: 0x401bae20, 0x5b46: 0x401bb020, 0x5b47: 0x401bb220, + 0x5b48: 0x401bb420, 0x5b49: 0x401bb620, 0x5b4a: 0x401bb820, 0x5b4b: 0x401bba20, + 0x5b4c: 0x401bbc20, 0x5b4d: 0x401bbe20, 0x5b4e: 0x401bc020, 0x5b4f: 0x401bc220, + 0x5b50: 0x401bc420, 0x5b51: 0x401bc620, 0x5b52: 0x401bc820, 0x5b53: 0x401bca20, + 0x5b54: 0x401bcc20, 0x5b55: 0x401bce20, 0x5b56: 0x401bd020, 0x5b57: 0x401bd220, + 0x5b58: 0x401bd420, 0x5b59: 0x401bd620, 0x5b5a: 0x401bd820, 0x5b5b: 0x401bda20, + 0x5b5c: 0x401bdc20, 0x5b5d: 0x401bde20, 0x5b5e: 0x401be020, 0x5b5f: 0x401be220, + 0x5b60: 0x401be420, 0x5b61: 0x401be620, 0x5b62: 0x401be820, 0x5b63: 0x401bea20, + 0x5b64: 0x401bec20, 0x5b65: 0x401bee20, 0x5b66: 0x401bf020, 0x5b67: 0x401bf220, + 0x5b68: 0x401bf420, 0x5b69: 0x401bf620, 0x5b6a: 0x401bf820, 0x5b6b: 0x401bfa20, + 0x5b6c: 0x401bfc20, 0x5b6d: 0x401bfe20, 0x5b6e: 0x401c0020, 0x5b6f: 0x401c0220, + 0x5b70: 0x401c0420, 0x5b71: 0x401c0620, 0x5b72: 0x401c0820, 0x5b73: 0x401c0a20, + 0x5b74: 0x401c0c20, 0x5b75: 0x401c0e20, 0x5b76: 0x401c1020, 0x5b77: 0x401c1220, + 0x5b78: 0x401c1420, 0x5b79: 0x401c1620, 0x5b7a: 0x401c1820, 0x5b7b: 0x401c1a20, + 0x5b7c: 0x401c1c20, 0x5b7d: 0x401c1e20, 0x5b7e: 0x401c2020, 0x5b7f: 0x401c2220, + // Block 0x16e, offset 0x5b80 + 0x5b80: 0x401c2420, 0x5b81: 0x401c2620, 0x5b82: 0x401c2820, 0x5b83: 0x401c2a20, + 0x5b84: 0x401c2c20, 0x5b85: 0x401c2e20, 0x5b86: 0x401c3020, 0x5b87: 0x401c3220, + 0x5b88: 0x401c3420, 0x5b89: 0x401c3620, 0x5b8a: 0x401c3820, 0x5b8b: 0x401c3a20, + 0x5b8c: 0x401c3c20, 0x5b8d: 0x401c3e20, 0x5b8e: 0x401c4020, 0x5b8f: 0x401c4220, + 0x5b90: 0x401c4420, 0x5b91: 0x401c4620, 0x5b92: 0x401c4820, 0x5b93: 0x401c4a20, + 0x5b94: 0x401c4c20, 0x5b95: 0x401c4e20, 0x5b96: 0x401c5020, 0x5b97: 0x401c5220, + 0x5b98: 0x401c5420, 0x5b99: 0x401c5620, 0x5b9a: 0x401c5820, 0x5b9b: 0x401c5a20, + 0x5b9c: 0x401c5c20, 0x5b9d: 0x401c5e20, 0x5b9e: 0x401c6020, 0x5b9f: 0x401c6220, + 0x5ba0: 0x401c6420, 0x5ba1: 0x401c6620, 0x5ba2: 0x401c6820, 0x5ba3: 0x401c6a20, + 0x5ba4: 0x401c6c20, 0x5ba5: 0x401c6e20, 0x5ba6: 0x401c7020, 0x5ba7: 0x401c7220, + 0x5ba8: 0x401c7420, 0x5ba9: 0x401c7620, 0x5baa: 0x401c7820, 0x5bab: 0x401c7a20, + 0x5bac: 0x401c7c20, 0x5bad: 0x401c7e20, 0x5bae: 0x401c8020, 0x5baf: 0x401c8220, + 0x5bb0: 0x401c8420, 0x5bb1: 0x401c8620, 0x5bb2: 0x401c8820, 0x5bb3: 0x401c8a20, + 0x5bb4: 0x401c8c20, 0x5bb5: 0x401c8e20, 0x5bb6: 0x401c9020, 0x5bb7: 0x401c9220, + 0x5bb8: 0x401c9420, 0x5bb9: 0x401c9620, 0x5bba: 0x401c9820, 0x5bbb: 0x401c9a20, + 0x5bbc: 0x401c9c20, 0x5bbd: 0x401c9e20, 0x5bbe: 0x401ca020, 0x5bbf: 0x401ca220, + // Block 0x16f, offset 0x5bc0 + 0x5bc0: 0x401ca420, 0x5bc1: 0x401ca620, 0x5bc2: 0x401ca820, 0x5bc3: 0x401caa20, + 0x5bc4: 0x401cac20, 0x5bc5: 0x401cae20, 0x5bc6: 0x401cb020, 0x5bc7: 0x401cb220, + 0x5bc8: 0x401cb420, 0x5bc9: 0x401cb620, 0x5bca: 0x401cb820, 0x5bcb: 0x401cba20, + 0x5bcc: 0x401cbc20, 0x5bcd: 0x401cbe20, 0x5bce: 0x401cc020, 0x5bcf: 0x401cc220, + 0x5bd0: 0x401cc420, 0x5bd1: 0x401cc620, 0x5bd2: 0x401cc820, 0x5bd3: 0x401cca20, + 0x5bd4: 0x401ccc20, 0x5bd5: 0x401cce20, 0x5bd6: 0x401cd020, 0x5bd7: 0x401cd220, + 0x5bd8: 0x401cd420, 0x5bd9: 0x401cd620, 0x5bda: 0x401cd820, 0x5bdb: 0x401cda20, + 0x5bdc: 0x401cdc20, 0x5bdd: 0x401cde20, 0x5bde: 0x401ce020, 0x5bdf: 0x401ce220, + 0x5be0: 0x401ce420, 0x5be1: 0x401ce620, 0x5be2: 0x401ce820, 0x5be3: 0x401cea20, + 0x5be4: 0x401cec20, 0x5be5: 0x401cee20, 0x5be6: 0x401cf020, 0x5be7: 0x401cf220, + 0x5be8: 0x401cf420, 0x5be9: 0x401cf620, 0x5bea: 0x401cf820, 0x5beb: 0x401cfa20, + 0x5bec: 0x401cfc20, 0x5bed: 0x401cfe20, 0x5bee: 0x401d0020, 0x5bef: 0x401d0220, + 0x5bf0: 0x401d0420, 0x5bf1: 0x401d0620, 0x5bf2: 0x401d0820, 0x5bf3: 0x401d0a20, + 0x5bf4: 0x401d0c20, 0x5bf5: 0x401d0e20, 0x5bf6: 0x401d1020, 0x5bf7: 0x401d1220, + 0x5bf8: 0x401d1420, 0x5bf9: 0x401d1620, 0x5bfa: 0x401d1820, 0x5bfb: 0x401d1a20, + 0x5bfc: 0x401d1c20, 0x5bfd: 0x401d1e20, 0x5bfe: 0x401d2020, 0x5bff: 0x401d2220, + // Block 0x170, offset 0x5c00 + 0x5c00: 0x401d2420, 0x5c01: 0x401d2620, 0x5c02: 0x401d2820, 0x5c03: 0x401d2a20, + 0x5c04: 0x401d2c20, 0x5c05: 0x401d2e20, 0x5c06: 0x401d3020, 0x5c07: 0x401d3220, + 0x5c08: 0x401d3420, 0x5c09: 0x401d3620, 0x5c0a: 0x401d3820, 0x5c0b: 0x401d3a20, + 0x5c0c: 0x401d3c20, 0x5c0d: 0x401d3e20, 0x5c0e: 0x401d4020, 0x5c0f: 0x401d4220, + 0x5c10: 0x401d4420, 0x5c11: 0x401d4620, 0x5c12: 0x401d4820, 0x5c13: 0x401d4a20, + 0x5c14: 0x401d4c20, 0x5c15: 0x401d4e20, 0x5c16: 0x401d5020, 0x5c17: 0x401d5220, + 0x5c18: 0x401d5420, 0x5c19: 0x401d5620, 0x5c1a: 0x401d5820, 0x5c1b: 0x401d5a20, + 0x5c1c: 0x401d5c20, 0x5c1d: 0x401d5e20, 0x5c1e: 0x401d6020, 0x5c1f: 0x401d6220, + 0x5c20: 0x401d6420, 0x5c21: 0x401d6620, 0x5c22: 0x401d6820, 0x5c23: 0x401d6a20, + 0x5c24: 0x401d6c20, 0x5c25: 0x401d6e20, 0x5c26: 0x401d7020, 0x5c27: 0x401d7220, + 0x5c28: 0x401d7420, 0x5c29: 0x401d7620, 0x5c2a: 0x401d7820, 0x5c2b: 0x401d7a20, + 0x5c2c: 0x401d7c20, 0x5c2d: 0x401d7e20, 0x5c2e: 0x401d8020, 0x5c2f: 0x401d8220, + 0x5c30: 0x401d8420, 0x5c31: 0x401d8620, 0x5c32: 0x401d8820, 0x5c33: 0x401d8a20, + 0x5c34: 0x401d8c20, 0x5c35: 0x401d8e20, + // Block 0x171, offset 0x5c40 + 0x5c40: 0x401d9020, 0x5c41: 0x401d9220, 0x5c42: 0x401d9420, 0x5c43: 0x401d9620, + 0x5c44: 0x401d9820, 0x5c45: 0x401d9a20, 0x5c46: 0x401d9c20, 0x5c47: 0x401d9e20, + 0x5c48: 0x401da020, 0x5c49: 0x401da220, 0x5c4a: 0x401da420, 0x5c4b: 0x401da620, + 0x5c4c: 0x401da820, 0x5c4d: 0x401daa20, 0x5c4e: 0x401dac20, 0x5c4f: 0x401dae20, + 0x5c50: 0x401db020, 0x5c51: 0x401db220, 0x5c52: 0x401db420, 0x5c53: 0x401db620, + 0x5c54: 0x401db820, 0x5c55: 0x401dba20, 0x5c56: 0x401dbc20, 0x5c57: 0x401dbe20, + 0x5c58: 0x401dc020, 0x5c59: 0x401dc220, 0x5c5a: 0x401dc420, 0x5c5b: 0x401dc620, + 0x5c5c: 0x401dc820, 0x5c5d: 0x401dca20, 0x5c5e: 0x401dcc20, 0x5c5f: 0x401dce20, + 0x5c60: 0x401dd020, 0x5c61: 0x401dd220, 0x5c62: 0x401dd420, 0x5c63: 0x401dd620, + 0x5c64: 0x401dd820, 0x5c65: 0x401dda20, 0x5c66: 0x401ddc20, + 0x5c69: 0x401e0420, 0x5c6a: 0x401de420, 0x5c6b: 0x401de620, + 0x5c6c: 0x401de820, 0x5c6d: 0x401dea20, 0x5c6e: 0x401dec20, 0x5c6f: 0x401dee20, + 0x5c70: 0x401df020, 0x5c71: 0x401df220, 0x5c72: 0x401df420, 0x5c73: 0x401df620, + 0x5c74: 0x401df820, 0x5c75: 0x401dfa20, 0x5c76: 0x401dfc20, 0x5c77: 0x401dfe20, + 0x5c78: 0x401e0020, 0x5c79: 0x401e0220, 0x5c7a: 0x401e0620, 0x5c7b: 0x401e0820, + 0x5c7c: 0x401e0a20, 0x5c7d: 0x401e0c20, 0x5c7e: 0x401e0e20, 0x5c7f: 0x401e1020, + // Block 0x172, offset 0x5c80 + 0x5c80: 0x401e1220, 0x5c81: 0x401e1420, 0x5c82: 0x401e1620, 0x5c83: 0x401e1820, + 0x5c84: 0x401e1a20, 0x5c85: 0x401e1c20, 0x5c86: 0x401e1e20, 0x5c87: 0x401e2020, + 0x5c88: 0x401e2220, 0x5c89: 0x401e2420, 0x5c8a: 0x401e2620, 0x5c8b: 0x401e2820, + 0x5c8c: 0x401e2a20, 0x5c8d: 0x401e2c20, 0x5c8e: 0x401e2e20, 0x5c8f: 0x401e3020, + 0x5c90: 0x401e3220, 0x5c91: 0x401e3420, 0x5c92: 0x401e3620, 0x5c93: 0x401e3820, + 0x5c94: 0x401e3a20, 0x5c95: 0x401e3c20, 0x5c96: 0x401e3e20, 0x5c97: 0x401e4020, + 0x5c98: 0x401e4220, 0x5c99: 0x401e4420, 0x5c9a: 0x401e4620, 0x5c9b: 0x401e4820, + 0x5c9c: 0x401e4a20, 0x5c9d: 0x401e4c20, 0x5c9e: 0x401e4020, 0x5c9f: 0x401e4220, + 0x5ca0: 0x401e4220, 0x5ca1: 0x401e4220, 0x5ca2: 0x401e4220, 0x5ca3: 0x401e4220, + 0x5ca4: 0x401e4220, 0x5ca5: 0xad800000, 0x5ca6: 0xad800000, 0x5ca7: 0xa0100000, + 0x5ca8: 0xa0100000, 0x5ca9: 0xa0100000, 0x5caa: 0x401e4e20, 0x5cab: 0x401e5020, + 0x5cac: 0x401e5220, 0x5cad: 0xae200000, 0x5cae: 0xad800000, 0x5caf: 0xad800000, + 0x5cb0: 0xad800000, 0x5cb1: 0xad800000, 0x5cb2: 0xad800000, 0x5cb3: 0xa0000000, + 0x5cb4: 0xa0000000, 0x5cb5: 0xa0000000, 0x5cb6: 0xa0000000, 0x5cb7: 0xa0000000, + 0x5cb8: 0xa0000000, 0x5cb9: 0xa0000000, 0x5cba: 0xa0000000, 0x5cbb: 0xadc00000, + 0x5cbc: 0xadc00000, 0x5cbd: 0xadc00000, 0x5cbe: 0xadc00000, 0x5cbf: 0xadc00000, + // Block 0x173, offset 0x5cc0 + 0x5cc0: 0xadc00000, 0x5cc1: 0xadc00000, 0x5cc2: 0xadc00000, 0x5cc3: 0x401e5420, + 0x5cc4: 0x401e5620, 0x5cc5: 0xae600000, 0x5cc6: 0xae600000, 0x5cc7: 0xae600000, + 0x5cc8: 0xae600000, 0x5cc9: 0xae600000, 0x5cca: 0xadc00000, 0x5ccb: 0xadc00000, + 0x5ccc: 0x401e5820, 0x5ccd: 0x401e5a20, 0x5cce: 0x401e5c20, 0x5ccf: 0x401e5e20, + 0x5cd0: 0x401e6020, 0x5cd1: 0x401e6220, 0x5cd2: 0x401e6420, 0x5cd3: 0x401e6620, + 0x5cd4: 0x401e6820, 0x5cd5: 0x401e6a20, 0x5cd6: 0x401e6c20, 0x5cd7: 0x401e6e20, + 0x5cd8: 0x401e7020, 0x5cd9: 0x401e7220, 0x5cda: 0x401e7420, 0x5cdb: 0x401e7620, + 0x5cdc: 0x401e7820, 0x5cdd: 0x401e7a20, 0x5cde: 0x401e7c20, 0x5cdf: 0x401e7e20, + 0x5ce0: 0x401e8020, 0x5ce1: 0x401e8220, 0x5ce2: 0x401e8420, 0x5ce3: 0x401e8620, + 0x5ce4: 0x401e8820, 0x5ce5: 0x401e8a20, 0x5ce6: 0x401e8c20, 0x5ce7: 0x401e8e20, + 0x5ce8: 0x401e9020, 0x5ce9: 0x401e9220, 0x5cea: 0xae600000, 0x5ceb: 0xae600000, + 0x5cec: 0xae600000, 0x5ced: 0xae600000, 0x5cee: 0x401e9420, 0x5cef: 0x401e9620, + 0x5cf0: 0x401e9820, 0x5cf1: 0x401e9a20, 0x5cf2: 0x401e9c20, 0x5cf3: 0x401e9e20, + 0x5cf4: 0x401ea020, 0x5cf5: 0x401ea220, 0x5cf6: 0x401ea420, 0x5cf7: 0x401ea620, + 0x5cf8: 0x401ea820, 0x5cf9: 0x401eaa20, 0x5cfa: 0x401eac20, 0x5cfb: 0x401eaa20, + 0x5cfc: 0x401eac20, 0x5cfd: 0x401eaa20, 0x5cfe: 0x401eac20, 0x5cff: 0x401eaa20, + // Block 0x174, offset 0x5d00 + 0x5d00: 0x401eac20, 0x5d01: 0x401eae20, 0x5d02: 0x401eb020, 0x5d03: 0x401eb220, + 0x5d04: 0x401eb420, 0x5d05: 0x401eb620, 0x5d06: 0x401eb820, 0x5d07: 0x401eba20, + 0x5d08: 0x401ebc20, 0x5d09: 0x401ebe20, 0x5d0a: 0x401ec020, 0x5d0b: 0x401ec220, + 0x5d0c: 0x401ec420, 0x5d0d: 0x401ec620, 0x5d0e: 0x401ec820, 0x5d0f: 0x401eca20, + 0x5d10: 0x401ecc20, 0x5d11: 0x401ece20, 0x5d12: 0x401ed020, 0x5d13: 0x401ed220, + 0x5d14: 0x401ed420, 0x5d15: 0x401ed620, 0x5d16: 0x401ed820, 0x5d17: 0x401eda20, + 0x5d18: 0x401edc20, 0x5d19: 0x401ede20, 0x5d1a: 0x401ee020, 0x5d1b: 0x401ee220, + 0x5d1c: 0x401ee420, 0x5d1d: 0x401ee620, + // Block 0x175, offset 0x5d40 + 0x5d40: 0x401ee820, 0x5d41: 0x401eea20, 0x5d42: 0x401eec20, 0x5d43: 0x401eee20, + 0x5d44: 0x401ef020, 0x5d45: 0x401ef220, 0x5d46: 0x401ef420, 0x5d47: 0x401ef620, + 0x5d48: 0x401ef820, 0x5d49: 0x401efa20, 0x5d4a: 0x401efc20, 0x5d4b: 0x401efe20, + 0x5d4c: 0x401f0020, 0x5d4d: 0x401f0220, 0x5d4e: 0x401f0420, 0x5d4f: 0x401f0620, + 0x5d50: 0x401f0820, 0x5d51: 0x401f0a20, 0x5d52: 0x401f0c20, 0x5d53: 0x401f0e20, + 0x5d54: 0x401f1020, 0x5d55: 0x401f1220, 0x5d56: 0x401f1420, 0x5d57: 0x401f1620, + 0x5d58: 0x401f1820, 0x5d59: 0x401f1a20, 0x5d5a: 0x401f1c20, 0x5d5b: 0x401f1e20, + 0x5d5c: 0x401f2020, 0x5d5d: 0x401f2220, 0x5d5e: 0x401f2420, 0x5d5f: 0x401f2620, + 0x5d60: 0x401f2820, 0x5d61: 0x401f2a20, 0x5d62: 0x401f2c20, 0x5d63: 0x401f2e20, + 0x5d64: 0x401f3020, 0x5d65: 0x401f3220, 0x5d66: 0x401f3420, 0x5d67: 0x401f3620, + 0x5d68: 0x401f3820, 0x5d69: 0x401f3a20, 0x5d6a: 0x401f3c20, 0x5d6b: 0x401f3e20, + 0x5d6c: 0x401f4020, 0x5d6d: 0x401f4220, 0x5d6e: 0x401f4420, 0x5d6f: 0x401f4620, + 0x5d70: 0x401f4820, 0x5d71: 0x401f4a20, 0x5d72: 0x401f4c20, 0x5d73: 0x401f4e20, + 0x5d74: 0x401f5020, 0x5d75: 0x401f5220, 0x5d76: 0x401f5420, 0x5d77: 0x401f5620, + 0x5d78: 0x401f5820, 0x5d79: 0x401f5a20, 0x5d7a: 0x401f5c20, 0x5d7b: 0x401f5e20, + 0x5d7c: 0x401f6020, 0x5d7d: 0x401f6220, 0x5d7e: 0x401f6420, 0x5d7f: 0x401f6620, + // Block 0x176, offset 0x5d80 + 0x5d80: 0x401f6820, 0x5d81: 0x401f6a20, 0x5d82: 0xae600000, 0x5d83: 0xae600000, + 0x5d84: 0xae600000, 0x5d85: 0x401f6c20, + // Block 0x177, offset 0x5dc0 + 0x5dc0: 0x4019e220, 0x5dc1: 0x4019e420, 0x5dc2: 0x4019e620, 0x5dc3: 0x4019e820, + 0x5dc4: 0x4019ea20, 0x5dc5: 0x4019ec20, 0x5dc6: 0x4019ee20, 0x5dc7: 0x4019f020, + 0x5dc8: 0x4019f220, 0x5dc9: 0x4019f420, 0x5dca: 0x4019f620, 0x5dcb: 0x4019f820, + 0x5dcc: 0x4019fa20, 0x5dcd: 0x4019fc20, 0x5dce: 0x4019fe20, 0x5dcf: 0x401a0020, + 0x5dd0: 0x401a0220, 0x5dd1: 0x401a0420, 0x5dd2: 0x401a0620, 0x5dd3: 0x401a0820, + 0x5dd4: 0x401a0a20, 0x5dd5: 0x401a0c20, 0x5dd6: 0x401a0e20, 0x5dd7: 0x401a1020, + 0x5dd8: 0x401a1220, 0x5dd9: 0x401a1420, 0x5dda: 0x401a1620, 0x5ddb: 0x401a1820, + 0x5ddc: 0x401a1a20, 0x5ddd: 0x401a1c20, 0x5dde: 0x401a1e20, 0x5ddf: 0x401a2020, + 0x5de0: 0x401a2220, 0x5de1: 0x401a2420, 0x5de2: 0x401a2620, 0x5de3: 0x401a2820, + 0x5de4: 0x401a2a20, 0x5de5: 0x401a2c20, 0x5de6: 0x401a2e20, 0x5de7: 0x401a3020, + 0x5de8: 0x401a3220, 0x5de9: 0x401a3420, 0x5dea: 0x401a3620, 0x5deb: 0x401a3820, + 0x5dec: 0x401a3a20, 0x5ded: 0x401a3c20, 0x5dee: 0x401a3e20, 0x5def: 0x401a4020, + 0x5df0: 0x401a4220, 0x5df1: 0x401a4420, 0x5df2: 0x401a4620, 0x5df3: 0x401a4820, + 0x5df4: 0x401a4a20, 0x5df5: 0x401a4c20, 0x5df6: 0x401a4e20, 0x5df7: 0x401a5020, + 0x5df8: 0x401a5220, 0x5df9: 0x401a5420, 0x5dfa: 0x401a5620, 0x5dfb: 0x401a5820, + 0x5dfc: 0x401a5a20, 0x5dfd: 0x401a5c20, 0x5dfe: 0x401a5e20, 0x5dff: 0x401a6020, + // Block 0x178, offset 0x5e00 + 0x5e00: 0x401a6220, 0x5e01: 0x401a6420, 0x5e02: 0x401a6620, 0x5e03: 0x401a6820, + 0x5e04: 0x401a6a20, 0x5e05: 0x401a6c20, 0x5e06: 0x401a6e20, 0x5e07: 0x401a7020, + 0x5e08: 0x401a7220, 0x5e09: 0x401a7420, 0x5e0a: 0x401a7620, 0x5e0b: 0x401a7820, + 0x5e0c: 0x401a7a20, 0x5e0d: 0x401a7c20, 0x5e0e: 0x401a7e20, 0x5e0f: 0x401a8020, + 0x5e10: 0x401a8220, 0x5e11: 0x401a8420, 0x5e12: 0x401a8620, 0x5e13: 0x401a8820, + 0x5e14: 0x401a8a20, 0x5e15: 0x401a8c20, 0x5e16: 0x401a8e20, + 0x5e20: 0xe00002af, 0x5e21: 0xe00003ca, 0x5e22: 0xe00004a4, 0x5e23: 0xe0000576, + 0x5e24: 0xe000063d, 0x5e25: 0xe00006ed, 0x5e26: 0xe0000795, 0x5e27: 0xe000083e, + 0x5e28: 0xe00008e9, 0x5e29: 0x4029ba20, 0x5e2a: 0x4029bc20, 0x5e2b: 0x4029be20, + 0x5e2c: 0x4029c020, 0x5e2d: 0x4029c220, 0x5e2e: 0x4029c420, 0x5e2f: 0x4029c620, + 0x5e30: 0x4029c820, 0x5e31: 0x4029ca20, + // Block 0x179, offset 0x5e40 + 0x5e40: 0x002bde8b, 0x5e41: 0x002c0a8b, 0x5e42: 0x002c3a8b, 0x5e43: 0x002c628b, + 0x5e44: 0x002c988b, 0x5e45: 0x002d088b, 0x5e46: 0x002d228b, 0x5e47: 0x002d688b, + 0x5e48: 0x002d9a8b, 0x5e49: 0x002dcc8b, 0x5e4a: 0x002dfe8b, 0x5e4b: 0x002e228b, + 0x5e4c: 0x002e828b, 0x5e4d: 0x002e9e8b, 0x5e4e: 0x002ee28b, 0x5e4f: 0x002f2c8b, + 0x5e50: 0x002f568b, 0x5e51: 0x002f7a8b, 0x5e52: 0x002fe68b, 0x5e53: 0x00302c8b, + 0x5e54: 0x00306c8b, 0x5e55: 0x0030be8b, 0x5e56: 0x0030e28b, 0x5e57: 0x0030f68b, + 0x5e58: 0x0031008b, 0x5e59: 0x00312a8b, 0x5e5a: 0x002bde85, 0x5e5b: 0x002c0a85, + 0x5e5c: 0x002c3a85, 0x5e5d: 0x002c6285, 0x5e5e: 0x002c9885, 0x5e5f: 0x002d0885, + 0x5e60: 0x002d2285, 0x5e61: 0x002d6885, 0x5e62: 0x002d9a85, 0x5e63: 0x002dcc85, + 0x5e64: 0x002dfe85, 0x5e65: 0x002e2285, 0x5e66: 0x002e8285, 0x5e67: 0x002e9e85, + 0x5e68: 0x002ee285, 0x5e69: 0x002f2c85, 0x5e6a: 0x002f5685, 0x5e6b: 0x002f7a85, + 0x5e6c: 0x002fe685, 0x5e6d: 0x00302c85, 0x5e6e: 0x00306c85, 0x5e6f: 0x0030be85, + 0x5e70: 0x0030e285, 0x5e71: 0x0030f685, 0x5e72: 0x00310085, 0x5e73: 0x00312a85, + 0x5e74: 0x002bde8b, 0x5e75: 0x002c0a8b, 0x5e76: 0x002c3a8b, 0x5e77: 0x002c628b, + 0x5e78: 0x002c988b, 0x5e79: 0x002d088b, 0x5e7a: 0x002d228b, 0x5e7b: 0x002d688b, + 0x5e7c: 0x002d9a8b, 0x5e7d: 0x002dcc8b, 0x5e7e: 0x002dfe8b, 0x5e7f: 0x002e228b, + // Block 0x17a, offset 0x5e80 + 0x5e80: 0x002e828b, 0x5e81: 0x002e9e8b, 0x5e82: 0x002ee28b, 0x5e83: 0x002f2c8b, + 0x5e84: 0x002f568b, 0x5e85: 0x002f7a8b, 0x5e86: 0x002fe68b, 0x5e87: 0x00302c8b, + 0x5e88: 0x00306c8b, 0x5e89: 0x0030be8b, 0x5e8a: 0x0030e28b, 0x5e8b: 0x0030f68b, + 0x5e8c: 0x0031008b, 0x5e8d: 0x00312a8b, 0x5e8e: 0x002bde85, 0x5e8f: 0x002c0a85, + 0x5e90: 0x002c3a85, 0x5e91: 0x002c6285, 0x5e92: 0x002c9885, 0x5e93: 0x002d0885, + 0x5e94: 0x002d2285, 0x5e96: 0x002d9a85, 0x5e97: 0x002dcc85, + 0x5e98: 0x002dfe85, 0x5e99: 0x002e2285, 0x5e9a: 0x002e8285, 0x5e9b: 0x002e9e85, + 0x5e9c: 0x002ee285, 0x5e9d: 0x002f2c85, 0x5e9e: 0x002f5685, 0x5e9f: 0x002f7a85, + 0x5ea0: 0x002fe685, 0x5ea1: 0x00302c85, 0x5ea2: 0x00306c85, 0x5ea3: 0x0030be85, + 0x5ea4: 0x0030e285, 0x5ea5: 0x0030f685, 0x5ea6: 0x00310085, 0x5ea7: 0x00312a85, + 0x5ea8: 0x002bde8b, 0x5ea9: 0x002c0a8b, 0x5eaa: 0x002c3a8b, 0x5eab: 0x002c628b, + 0x5eac: 0x002c988b, 0x5ead: 0x002d088b, 0x5eae: 0x002d228b, 0x5eaf: 0x002d688b, + 0x5eb0: 0x002d9a8b, 0x5eb1: 0x002dcc8b, 0x5eb2: 0x002dfe8b, 0x5eb3: 0x002e228b, + 0x5eb4: 0x002e828b, 0x5eb5: 0x002e9e8b, 0x5eb6: 0x002ee28b, 0x5eb7: 0x002f2c8b, + 0x5eb8: 0x002f568b, 0x5eb9: 0x002f7a8b, 0x5eba: 0x002fe68b, 0x5ebb: 0x00302c8b, + 0x5ebc: 0x00306c8b, 0x5ebd: 0x0030be8b, 0x5ebe: 0x0030e28b, 0x5ebf: 0x0030f68b, + // Block 0x17b, offset 0x5ec0 + 0x5ec0: 0x0031008b, 0x5ec1: 0x00312a8b, 0x5ec2: 0x002bde85, 0x5ec3: 0x002c0a85, + 0x5ec4: 0x002c3a85, 0x5ec5: 0x002c6285, 0x5ec6: 0x002c9885, 0x5ec7: 0x002d0885, + 0x5ec8: 0x002d2285, 0x5ec9: 0x002d6885, 0x5eca: 0x002d9a85, 0x5ecb: 0x002dcc85, + 0x5ecc: 0x002dfe85, 0x5ecd: 0x002e2285, 0x5ece: 0x002e8285, 0x5ecf: 0x002e9e85, + 0x5ed0: 0x002ee285, 0x5ed1: 0x002f2c85, 0x5ed2: 0x002f5685, 0x5ed3: 0x002f7a85, + 0x5ed4: 0x002fe685, 0x5ed5: 0x00302c85, 0x5ed6: 0x00306c85, 0x5ed7: 0x0030be85, + 0x5ed8: 0x0030e285, 0x5ed9: 0x0030f685, 0x5eda: 0x00310085, 0x5edb: 0x00312a85, + 0x5edc: 0x002bde8b, 0x5ede: 0x002c3a8b, 0x5edf: 0x002c628b, + 0x5ee2: 0x002d228b, + 0x5ee5: 0x002dcc8b, 0x5ee6: 0x002dfe8b, + 0x5ee9: 0x002e9e8b, 0x5eea: 0x002ee28b, 0x5eeb: 0x002f2c8b, + 0x5eec: 0x002f568b, 0x5eee: 0x002fe68b, 0x5eef: 0x00302c8b, + 0x5ef0: 0x00306c8b, 0x5ef1: 0x0030be8b, 0x5ef2: 0x0030e28b, 0x5ef3: 0x0030f68b, + 0x5ef4: 0x0031008b, 0x5ef5: 0x00312a8b, 0x5ef6: 0x002bde85, 0x5ef7: 0x002c0a85, + 0x5ef8: 0x002c3a85, 0x5ef9: 0x002c6285, 0x5efb: 0x002d0885, + 0x5efd: 0x002d6885, 0x5efe: 0x002d9a85, 0x5eff: 0x002dcc85, + // Block 0x17c, offset 0x5f00 + 0x5f00: 0x002dfe85, 0x5f01: 0x002e2285, 0x5f02: 0x002e8285, 0x5f03: 0x002e9e85, + 0x5f05: 0x002f2c85, 0x5f06: 0x002f5685, 0x5f07: 0x002f7a85, + 0x5f08: 0x002fe685, 0x5f09: 0x00302c85, 0x5f0a: 0x00306c85, 0x5f0b: 0x0030be85, + 0x5f0c: 0x0030e285, 0x5f0d: 0x0030f685, 0x5f0e: 0x00310085, 0x5f0f: 0x00312a85, + 0x5f10: 0x002bde8b, 0x5f11: 0x002c0a8b, 0x5f12: 0x002c3a8b, 0x5f13: 0x002c628b, + 0x5f14: 0x002c988b, 0x5f15: 0x002d088b, 0x5f16: 0x002d228b, 0x5f17: 0x002d688b, + 0x5f18: 0x002d9a8b, 0x5f19: 0x002dcc8b, 0x5f1a: 0x002dfe8b, 0x5f1b: 0x002e228b, + 0x5f1c: 0x002e828b, 0x5f1d: 0x002e9e8b, 0x5f1e: 0x002ee28b, 0x5f1f: 0x002f2c8b, + 0x5f20: 0x002f568b, 0x5f21: 0x002f7a8b, 0x5f22: 0x002fe68b, 0x5f23: 0x00302c8b, + 0x5f24: 0x00306c8b, 0x5f25: 0x0030be8b, 0x5f26: 0x0030e28b, 0x5f27: 0x0030f68b, + 0x5f28: 0x0031008b, 0x5f29: 0x00312a8b, 0x5f2a: 0x002bde85, 0x5f2b: 0x002c0a85, + 0x5f2c: 0x002c3a85, 0x5f2d: 0x002c6285, 0x5f2e: 0x002c9885, 0x5f2f: 0x002d0885, + 0x5f30: 0x002d2285, 0x5f31: 0x002d6885, 0x5f32: 0x002d9a85, 0x5f33: 0x002dcc85, + 0x5f34: 0x002dfe85, 0x5f35: 0x002e2285, 0x5f36: 0x002e8285, 0x5f37: 0x002e9e85, + 0x5f38: 0x002ee285, 0x5f39: 0x002f2c85, 0x5f3a: 0x002f5685, 0x5f3b: 0x002f7a85, + 0x5f3c: 0x002fe685, 0x5f3d: 0x00302c85, 0x5f3e: 0x00306c85, 0x5f3f: 0x0030be85, + // Block 0x17d, offset 0x5f40 + 0x5f40: 0x0030e285, 0x5f41: 0x0030f685, 0x5f42: 0x00310085, 0x5f43: 0x00312a85, + 0x5f44: 0x002bde8b, 0x5f45: 0x002c0a8b, 0x5f47: 0x002c628b, + 0x5f48: 0x002c988b, 0x5f49: 0x002d088b, 0x5f4a: 0x002d228b, + 0x5f4d: 0x002dcc8b, 0x5f4e: 0x002dfe8b, 0x5f4f: 0x002e228b, + 0x5f50: 0x002e828b, 0x5f51: 0x002e9e8b, 0x5f52: 0x002ee28b, 0x5f53: 0x002f2c8b, + 0x5f54: 0x002f568b, 0x5f56: 0x002fe68b, 0x5f57: 0x00302c8b, + 0x5f58: 0x00306c8b, 0x5f59: 0x0030be8b, 0x5f5a: 0x0030e28b, 0x5f5b: 0x0030f68b, + 0x5f5c: 0x0031008b, 0x5f5e: 0x002bde85, 0x5f5f: 0x002c0a85, + 0x5f60: 0x002c3a85, 0x5f61: 0x002c6285, 0x5f62: 0x002c9885, 0x5f63: 0x002d0885, + 0x5f64: 0x002d2285, 0x5f65: 0x002d6885, 0x5f66: 0x002d9a85, 0x5f67: 0x002dcc85, + 0x5f68: 0x002dfe85, 0x5f69: 0x002e2285, 0x5f6a: 0x002e8285, 0x5f6b: 0x002e9e85, + 0x5f6c: 0x002ee285, 0x5f6d: 0x002f2c85, 0x5f6e: 0x002f5685, 0x5f6f: 0x002f7a85, + 0x5f70: 0x002fe685, 0x5f71: 0x00302c85, 0x5f72: 0x00306c85, 0x5f73: 0x0030be85, + 0x5f74: 0x0030e285, 0x5f75: 0x0030f685, 0x5f76: 0x00310085, 0x5f77: 0x00312a85, + 0x5f78: 0x002bde8b, 0x5f79: 0x002c0a8b, 0x5f7b: 0x002c628b, + 0x5f7c: 0x002c988b, 0x5f7d: 0x002d088b, 0x5f7e: 0x002d228b, + // Block 0x17e, offset 0x5f80 + 0x5f80: 0x002d9a8b, 0x5f81: 0x002dcc8b, 0x5f82: 0x002dfe8b, 0x5f83: 0x002e228b, + 0x5f84: 0x002e828b, 0x5f86: 0x002ee28b, + 0x5f8a: 0x002fe68b, 0x5f8b: 0x00302c8b, + 0x5f8c: 0x00306c8b, 0x5f8d: 0x0030be8b, 0x5f8e: 0x0030e28b, 0x5f8f: 0x0030f68b, + 0x5f90: 0x0031008b, 0x5f92: 0x002bde85, 0x5f93: 0x002c0a85, + 0x5f94: 0x002c3a85, 0x5f95: 0x002c6285, 0x5f96: 0x002c9885, 0x5f97: 0x002d0885, + 0x5f98: 0x002d2285, 0x5f99: 0x002d6885, 0x5f9a: 0x002d9a85, 0x5f9b: 0x002dcc85, + 0x5f9c: 0x002dfe85, 0x5f9d: 0x002e2285, 0x5f9e: 0x002e8285, 0x5f9f: 0x002e9e85, + 0x5fa0: 0x002ee285, 0x5fa1: 0x002f2c85, 0x5fa2: 0x002f5685, 0x5fa3: 0x002f7a85, + 0x5fa4: 0x002fe685, 0x5fa5: 0x00302c85, 0x5fa6: 0x00306c85, 0x5fa7: 0x0030be85, + 0x5fa8: 0x0030e285, 0x5fa9: 0x0030f685, 0x5faa: 0x00310085, 0x5fab: 0x00312a85, + 0x5fac: 0x002bde8b, 0x5fad: 0x002c0a8b, 0x5fae: 0x002c3a8b, 0x5faf: 0x002c628b, + 0x5fb0: 0x002c988b, 0x5fb1: 0x002d088b, 0x5fb2: 0x002d228b, 0x5fb3: 0x002d688b, + 0x5fb4: 0x002d9a8b, 0x5fb5: 0x002dcc8b, 0x5fb6: 0x002dfe8b, 0x5fb7: 0x002e228b, + 0x5fb8: 0x002e828b, 0x5fb9: 0x002e9e8b, 0x5fba: 0x002ee28b, 0x5fbb: 0x002f2c8b, + 0x5fbc: 0x002f568b, 0x5fbd: 0x002f7a8b, 0x5fbe: 0x002fe68b, 0x5fbf: 0x00302c8b, + // Block 0x17f, offset 0x5fc0 + 0x5fc0: 0x00306c8b, 0x5fc1: 0x0030be8b, 0x5fc2: 0x0030e28b, 0x5fc3: 0x0030f68b, + 0x5fc4: 0x0031008b, 0x5fc5: 0x00312a8b, 0x5fc6: 0x002bde85, 0x5fc7: 0x002c0a85, + 0x5fc8: 0x002c3a85, 0x5fc9: 0x002c6285, 0x5fca: 0x002c9885, 0x5fcb: 0x002d0885, + 0x5fcc: 0x002d2285, 0x5fcd: 0x002d6885, 0x5fce: 0x002d9a85, 0x5fcf: 0x002dcc85, + 0x5fd0: 0x002dfe85, 0x5fd1: 0x002e2285, 0x5fd2: 0x002e8285, 0x5fd3: 0x002e9e85, + 0x5fd4: 0x002ee285, 0x5fd5: 0x002f2c85, 0x5fd6: 0x002f5685, 0x5fd7: 0x002f7a85, + 0x5fd8: 0x002fe685, 0x5fd9: 0x00302c85, 0x5fda: 0x00306c85, 0x5fdb: 0x0030be85, + 0x5fdc: 0x0030e285, 0x5fdd: 0x0030f685, 0x5fde: 0x00310085, 0x5fdf: 0x00312a85, + 0x5fe0: 0x002bde8b, 0x5fe1: 0x002c0a8b, 0x5fe2: 0x002c3a8b, 0x5fe3: 0x002c628b, + 0x5fe4: 0x002c988b, 0x5fe5: 0x002d088b, 0x5fe6: 0x002d228b, 0x5fe7: 0x002d688b, + 0x5fe8: 0x002d9a8b, 0x5fe9: 0x002dcc8b, 0x5fea: 0x002dfe8b, 0x5feb: 0x002e228b, + 0x5fec: 0x002e828b, 0x5fed: 0x002e9e8b, 0x5fee: 0x002ee28b, 0x5fef: 0x002f2c8b, + 0x5ff0: 0x002f568b, 0x5ff1: 0x002f7a8b, 0x5ff2: 0x002fe68b, 0x5ff3: 0x00302c8b, + 0x5ff4: 0x00306c8b, 0x5ff5: 0x0030be8b, 0x5ff6: 0x0030e28b, 0x5ff7: 0x0030f68b, + 0x5ff8: 0x0031008b, 0x5ff9: 0x00312a8b, 0x5ffa: 0x002bde85, 0x5ffb: 0x002c0a85, + 0x5ffc: 0x002c3a85, 0x5ffd: 0x002c6285, 0x5ffe: 0x002c9885, 0x5fff: 0x002d0885, + // Block 0x180, offset 0x6000 + 0x6000: 0x002d2285, 0x6001: 0x002d6885, 0x6002: 0x002d9a85, 0x6003: 0x002dcc85, + 0x6004: 0x002dfe85, 0x6005: 0x002e2285, 0x6006: 0x002e8285, 0x6007: 0x002e9e85, + 0x6008: 0x002ee285, 0x6009: 0x002f2c85, 0x600a: 0x002f5685, 0x600b: 0x002f7a85, + 0x600c: 0x002fe685, 0x600d: 0x00302c85, 0x600e: 0x00306c85, 0x600f: 0x0030be85, + 0x6010: 0x0030e285, 0x6011: 0x0030f685, 0x6012: 0x00310085, 0x6013: 0x00312a85, + 0x6014: 0x002bde8b, 0x6015: 0x002c0a8b, 0x6016: 0x002c3a8b, 0x6017: 0x002c628b, + 0x6018: 0x002c988b, 0x6019: 0x002d088b, 0x601a: 0x002d228b, 0x601b: 0x002d688b, + 0x601c: 0x002d9a8b, 0x601d: 0x002dcc8b, 0x601e: 0x002dfe8b, 0x601f: 0x002e228b, + 0x6020: 0x002e828b, 0x6021: 0x002e9e8b, 0x6022: 0x002ee28b, 0x6023: 0x002f2c8b, + 0x6024: 0x002f568b, 0x6025: 0x002f7a8b, 0x6026: 0x002fe68b, 0x6027: 0x00302c8b, + 0x6028: 0x00306c8b, 0x6029: 0x0030be8b, 0x602a: 0x0030e28b, 0x602b: 0x0030f68b, + 0x602c: 0x0031008b, 0x602d: 0x00312a8b, 0x602e: 0x002bde85, 0x602f: 0x002c0a85, + 0x6030: 0x002c3a85, 0x6031: 0x002c6285, 0x6032: 0x002c9885, 0x6033: 0x002d0885, + 0x6034: 0x002d2285, 0x6035: 0x002d6885, 0x6036: 0x002d9a85, 0x6037: 0x002dcc85, + 0x6038: 0x002dfe85, 0x6039: 0x002e2285, 0x603a: 0x002e8285, 0x603b: 0x002e9e85, + 0x603c: 0x002ee285, 0x603d: 0x002f2c85, 0x603e: 0x002f5685, 0x603f: 0x002f7a85, + // Block 0x181, offset 0x6040 + 0x6040: 0x002fe685, 0x6041: 0x00302c85, 0x6042: 0x00306c85, 0x6043: 0x0030be85, + 0x6044: 0x0030e285, 0x6045: 0x0030f685, 0x6046: 0x00310085, 0x6047: 0x00312a85, + 0x6048: 0x002bde8b, 0x6049: 0x002c0a8b, 0x604a: 0x002c3a8b, 0x604b: 0x002c628b, + 0x604c: 0x002c988b, 0x604d: 0x002d088b, 0x604e: 0x002d228b, 0x604f: 0x002d688b, + 0x6050: 0x002d9a8b, 0x6051: 0x002dcc8b, 0x6052: 0x002dfe8b, 0x6053: 0x002e228b, + 0x6054: 0x002e828b, 0x6055: 0x002e9e8b, 0x6056: 0x002ee28b, 0x6057: 0x002f2c8b, + 0x6058: 0x002f568b, 0x6059: 0x002f7a8b, 0x605a: 0x002fe68b, 0x605b: 0x00302c8b, + 0x605c: 0x00306c8b, 0x605d: 0x0030be8b, 0x605e: 0x0030e28b, 0x605f: 0x0030f68b, + 0x6060: 0x0031008b, 0x6061: 0x00312a8b, 0x6062: 0x002bde85, 0x6063: 0x002c0a85, + 0x6064: 0x002c3a85, 0x6065: 0x002c6285, 0x6066: 0x002c9885, 0x6067: 0x002d0885, + 0x6068: 0x002d2285, 0x6069: 0x002d6885, 0x606a: 0x002d9a85, 0x606b: 0x002dcc85, + 0x606c: 0x002dfe85, 0x606d: 0x002e2285, 0x606e: 0x002e8285, 0x606f: 0x002e9e85, + 0x6070: 0x002ee285, 0x6071: 0x002f2c85, 0x6072: 0x002f5685, 0x6073: 0x002f7a85, + 0x6074: 0x002fe685, 0x6075: 0x00302c85, 0x6076: 0x00306c85, 0x6077: 0x0030be85, + 0x6078: 0x0030e285, 0x6079: 0x0030f685, 0x607a: 0x00310085, 0x607b: 0x00312a85, + 0x607c: 0x002bde8b, 0x607d: 0x002c0a8b, 0x607e: 0x002c3a8b, 0x607f: 0x002c628b, + // Block 0x182, offset 0x6080 + 0x6080: 0x002c988b, 0x6081: 0x002d088b, 0x6082: 0x002d228b, 0x6083: 0x002d688b, + 0x6084: 0x002d9a8b, 0x6085: 0x002dcc8b, 0x6086: 0x002dfe8b, 0x6087: 0x002e228b, + 0x6088: 0x002e828b, 0x6089: 0x002e9e8b, 0x608a: 0x002ee28b, 0x608b: 0x002f2c8b, + 0x608c: 0x002f568b, 0x608d: 0x002f7a8b, 0x608e: 0x002fe68b, 0x608f: 0x00302c8b, + 0x6090: 0x00306c8b, 0x6091: 0x0030be8b, 0x6092: 0x0030e28b, 0x6093: 0x0030f68b, + 0x6094: 0x0031008b, 0x6095: 0x00312a8b, 0x6096: 0x002bde85, 0x6097: 0x002c0a85, + 0x6098: 0x002c3a85, 0x6099: 0x002c6285, 0x609a: 0x002c9885, 0x609b: 0x002d0885, + 0x609c: 0x002d2285, 0x609d: 0x002d6885, 0x609e: 0x002d9a85, 0x609f: 0x002dcc85, + 0x60a0: 0x002dfe85, 0x60a1: 0x002e2285, 0x60a2: 0x002e8285, 0x60a3: 0x002e9e85, + 0x60a4: 0x002ee285, 0x60a5: 0x002f2c85, 0x60a6: 0x002f5685, 0x60a7: 0x002f7a85, + 0x60a8: 0x002fe685, 0x60a9: 0x00302c85, 0x60aa: 0x00306c85, 0x60ab: 0x0030be85, + 0x60ac: 0x0030e285, 0x60ad: 0x0030f685, 0x60ae: 0x00310085, 0x60af: 0x00312a85, + 0x60b0: 0x002bde8b, 0x60b1: 0x002c0a8b, 0x60b2: 0x002c3a8b, 0x60b3: 0x002c628b, + 0x60b4: 0x002c988b, 0x60b5: 0x002d088b, 0x60b6: 0x002d228b, 0x60b7: 0x002d688b, + 0x60b8: 0x002d9a8b, 0x60b9: 0x002dcc8b, 0x60ba: 0x002dfe8b, 0x60bb: 0x002e228b, + 0x60bc: 0x002e828b, 0x60bd: 0x002e9e8b, 0x60be: 0x002ee28b, 0x60bf: 0x002f2c8b, + // Block 0x183, offset 0x60c0 + 0x60c0: 0x002f568b, 0x60c1: 0x002f7a8b, 0x60c2: 0x002fe68b, 0x60c3: 0x00302c8b, + 0x60c4: 0x00306c8b, 0x60c5: 0x0030be8b, 0x60c6: 0x0030e28b, 0x60c7: 0x0030f68b, + 0x60c8: 0x0031008b, 0x60c9: 0x00312a8b, 0x60ca: 0x002bde85, 0x60cb: 0x002c0a85, + 0x60cc: 0x002c3a85, 0x60cd: 0x002c6285, 0x60ce: 0x002c9885, 0x60cf: 0x002d0885, + 0x60d0: 0x002d2285, 0x60d1: 0x002d6885, 0x60d2: 0x002d9a85, 0x60d3: 0x002dcc85, + 0x60d4: 0x002dfe85, 0x60d5: 0x002e2285, 0x60d6: 0x002e8285, 0x60d7: 0x002e9e85, + 0x60d8: 0x002ee285, 0x60d9: 0x002f2c85, 0x60da: 0x002f5685, 0x60db: 0x002f7a85, + 0x60dc: 0x002fe685, 0x60dd: 0x00302c85, 0x60de: 0x00306c85, 0x60df: 0x0030be85, + 0x60e0: 0x0030e285, 0x60e1: 0x0030f685, 0x60e2: 0x00310085, 0x60e3: 0x00312a85, + 0x60e4: 0x002da285, 0x60e5: 0x002dd485, + 0x60e8: 0x0032528b, 0x60e9: 0x0032548b, 0x60ea: 0x0032568b, 0x60eb: 0x00325a8b, + 0x60ec: 0x00325c8b, 0x60ed: 0x0032648b, 0x60ee: 0x0032688b, 0x60ef: 0x00326a8b, + 0x60f0: 0x00326c8b, 0x60f1: 0x0032708b, 0x60f2: 0x0032728b, 0x60f3: 0x0032768b, + 0x60f4: 0x0032788b, 0x60f5: 0x00327a8b, 0x60f6: 0x00327c8b, 0x60f7: 0x00327e8b, + 0x60f8: 0x0032888b, 0x60f9: 0x00326a8b, 0x60fa: 0x00328e8b, 0x60fb: 0x0032968b, + 0x60fc: 0x0032988b, 0x60fd: 0x00329a8b, 0x60fe: 0x00329c8b, 0x60ff: 0x00329e8b, + // Block 0x184, offset 0x6100 + 0x6100: 0x0032a28b, 0x6101: 0x00092485, 0x6102: 0x00325285, 0x6103: 0x00325485, + 0x6104: 0x00325685, 0x6105: 0x00325a85, 0x6106: 0x00325c85, 0x6107: 0x00326485, + 0x6108: 0x00326885, 0x6109: 0x00326a85, 0x610a: 0x00326c85, 0x610b: 0x00327085, + 0x610c: 0x00327285, 0x610d: 0x00327685, 0x610e: 0x00327885, 0x610f: 0x00327a85, + 0x6110: 0x00327c85, 0x6111: 0x00327e85, 0x6112: 0x00328885, 0x6113: 0x00328e85, + 0x6114: 0x00328e85, 0x6115: 0x00329685, 0x6116: 0x00329885, 0x6117: 0x00329a85, + 0x6118: 0x00329c85, 0x6119: 0x00329e85, 0x611a: 0x0032a285, 0x611b: 0x00091c85, + 0x611c: 0x00325c85, 0x611d: 0x00326a85, 0x611e: 0x00327085, 0x611f: 0x00329a85, + 0x6120: 0x00328885, 0x6121: 0x00327e85, 0x6122: 0x0032528b, 0x6123: 0x0032548b, + 0x6124: 0x0032568b, 0x6125: 0x00325a8b, 0x6126: 0x00325c8b, 0x6127: 0x0032648b, + 0x6128: 0x0032688b, 0x6129: 0x00326a8b, 0x612a: 0x00326c8b, 0x612b: 0x0032708b, + 0x612c: 0x0032728b, 0x612d: 0x0032768b, 0x612e: 0x0032788b, 0x612f: 0x00327a8b, + 0x6130: 0x00327c8b, 0x6131: 0x00327e8b, 0x6132: 0x0032888b, 0x6133: 0x00326a8b, + 0x6134: 0x00328e8b, 0x6135: 0x0032968b, 0x6136: 0x0032988b, 0x6137: 0x00329a8b, + 0x6138: 0x00329c8b, 0x6139: 0x00329e8b, 0x613a: 0x0032a28b, 0x613b: 0x00092485, + 0x613c: 0x00325285, 0x613d: 0x00325485, 0x613e: 0x00325685, 0x613f: 0x00325a85, + // Block 0x185, offset 0x6140 + 0x6140: 0x00325c85, 0x6141: 0x00326485, 0x6142: 0x00326885, 0x6143: 0x00326a85, + 0x6144: 0x00326c85, 0x6145: 0x00327085, 0x6146: 0x00327285, 0x6147: 0x00327685, + 0x6148: 0x00327885, 0x6149: 0x00327a85, 0x614a: 0x00327c85, 0x614b: 0x00327e85, + 0x614c: 0x00328885, 0x614d: 0x00328e85, 0x614e: 0x00328e85, 0x614f: 0x00329685, + 0x6150: 0x00329885, 0x6151: 0x00329a85, 0x6152: 0x00329c85, 0x6153: 0x00329e85, + 0x6154: 0x0032a285, 0x6155: 0x00091c85, 0x6156: 0x00325c85, 0x6157: 0x00326a85, + 0x6158: 0x00327085, 0x6159: 0x00329a85, 0x615a: 0x00328885, 0x615b: 0x00327e85, + 0x615c: 0x0032528b, 0x615d: 0x0032548b, 0x615e: 0x0032568b, 0x615f: 0x00325a8b, + 0x6160: 0x00325c8b, 0x6161: 0x0032648b, 0x6162: 0x0032688b, 0x6163: 0x00326a8b, + 0x6164: 0x00326c8b, 0x6165: 0x0032708b, 0x6166: 0x0032728b, 0x6167: 0x0032768b, + 0x6168: 0x0032788b, 0x6169: 0x00327a8b, 0x616a: 0x00327c8b, 0x616b: 0x00327e8b, + 0x616c: 0x0032888b, 0x616d: 0x00326a8b, 0x616e: 0x00328e8b, 0x616f: 0x0032968b, + 0x6170: 0x0032988b, 0x6171: 0x00329a8b, 0x6172: 0x00329c8b, 0x6173: 0x00329e8b, + 0x6174: 0x0032a28b, 0x6175: 0x00092485, 0x6176: 0x00325285, 0x6177: 0x00325485, + 0x6178: 0x00325685, 0x6179: 0x00325a85, 0x617a: 0x00325c85, 0x617b: 0x00326485, + 0x617c: 0x00326885, 0x617d: 0x00326a85, 0x617e: 0x00326c85, 0x617f: 0x00327085, + // Block 0x186, offset 0x6180 + 0x6180: 0x00327285, 0x6181: 0x00327685, 0x6182: 0x00327885, 0x6183: 0x00327a85, + 0x6184: 0x00327c85, 0x6185: 0x00327e85, 0x6186: 0x00328885, 0x6187: 0x00328e85, + 0x6188: 0x00328e85, 0x6189: 0x00329685, 0x618a: 0x00329885, 0x618b: 0x00329a85, + 0x618c: 0x00329c85, 0x618d: 0x00329e85, 0x618e: 0x0032a285, 0x618f: 0x00091c85, + 0x6190: 0x00325c85, 0x6191: 0x00326a85, 0x6192: 0x00327085, 0x6193: 0x00329a85, + 0x6194: 0x00328885, 0x6195: 0x00327e85, 0x6196: 0x0032528b, 0x6197: 0x0032548b, + 0x6198: 0x0032568b, 0x6199: 0x00325a8b, 0x619a: 0x00325c8b, 0x619b: 0x0032648b, + 0x619c: 0x0032688b, 0x619d: 0x00326a8b, 0x619e: 0x00326c8b, 0x619f: 0x0032708b, + 0x61a0: 0x0032728b, 0x61a1: 0x0032768b, 0x61a2: 0x0032788b, 0x61a3: 0x00327a8b, + 0x61a4: 0x00327c8b, 0x61a5: 0x00327e8b, 0x61a6: 0x0032888b, 0x61a7: 0x00326a8b, + 0x61a8: 0x00328e8b, 0x61a9: 0x0032968b, 0x61aa: 0x0032988b, 0x61ab: 0x00329a8b, + 0x61ac: 0x00329c8b, 0x61ad: 0x00329e8b, 0x61ae: 0x0032a28b, 0x61af: 0x00092485, + 0x61b0: 0x00325285, 0x61b1: 0x00325485, 0x61b2: 0x00325685, 0x61b3: 0x00325a85, + 0x61b4: 0x00325c85, 0x61b5: 0x00326485, 0x61b6: 0x00326885, 0x61b7: 0x00326a85, + 0x61b8: 0x00326c85, 0x61b9: 0x00327085, 0x61ba: 0x00327285, 0x61bb: 0x00327685, + 0x61bc: 0x00327885, 0x61bd: 0x00327a85, 0x61be: 0x00327c85, 0x61bf: 0x00327e85, + // Block 0x187, offset 0x61c0 + 0x61c0: 0x00328885, 0x61c1: 0x00328e85, 0x61c2: 0x00328e85, 0x61c3: 0x00329685, + 0x61c4: 0x00329885, 0x61c5: 0x00329a85, 0x61c6: 0x00329c85, 0x61c7: 0x00329e85, + 0x61c8: 0x0032a285, 0x61c9: 0x00091c85, 0x61ca: 0x00325c85, 0x61cb: 0x00326a85, + 0x61cc: 0x00327085, 0x61cd: 0x00329a85, 0x61ce: 0x00328885, 0x61cf: 0x00327e85, + 0x61d0: 0x0032528b, 0x61d1: 0x0032548b, 0x61d2: 0x0032568b, 0x61d3: 0x00325a8b, + 0x61d4: 0x00325c8b, 0x61d5: 0x0032648b, 0x61d6: 0x0032688b, 0x61d7: 0x00326a8b, + 0x61d8: 0x00326c8b, 0x61d9: 0x0032708b, 0x61da: 0x0032728b, 0x61db: 0x0032768b, + 0x61dc: 0x0032788b, 0x61dd: 0x00327a8b, 0x61de: 0x00327c8b, 0x61df: 0x00327e8b, + 0x61e0: 0x0032888b, 0x61e1: 0x00326a8b, 0x61e2: 0x00328e8b, 0x61e3: 0x0032968b, + 0x61e4: 0x0032988b, 0x61e5: 0x00329a8b, 0x61e6: 0x00329c8b, 0x61e7: 0x00329e8b, + 0x61e8: 0x0032a28b, 0x61e9: 0x00092485, 0x61ea: 0x00325285, 0x61eb: 0x00325485, + 0x61ec: 0x00325685, 0x61ed: 0x00325a85, 0x61ee: 0x00325c85, 0x61ef: 0x00326485, + 0x61f0: 0x00326885, 0x61f1: 0x00326a85, 0x61f2: 0x00326c85, 0x61f3: 0x00327085, + 0x61f4: 0x00327285, 0x61f5: 0x00327685, 0x61f6: 0x00327885, 0x61f7: 0x00327a85, + 0x61f8: 0x00327c85, 0x61f9: 0x00327e85, 0x61fa: 0x00328885, 0x61fb: 0x00328e85, + 0x61fc: 0x00328e85, 0x61fd: 0x00329685, 0x61fe: 0x00329885, 0x61ff: 0x00329a85, + // Block 0x188, offset 0x6200 + 0x6200: 0x00329c85, 0x6201: 0x00329e85, 0x6202: 0x0032a285, 0x6203: 0x00091c85, + 0x6204: 0x00325c85, 0x6205: 0x00326a85, 0x6206: 0x00327085, 0x6207: 0x00329a85, + 0x6208: 0x00328885, 0x6209: 0x00327e85, 0x620a: 0x00325e8b, 0x620b: 0x00325e85, + 0x620e: 0x0029cc85, 0x620f: 0x0029ce85, + 0x6210: 0x0029d085, 0x6211: 0x0029d285, 0x6212: 0x0029d485, 0x6213: 0x0029d685, + 0x6214: 0x0029d885, 0x6215: 0x0029da85, 0x6216: 0x0029dc85, 0x6217: 0x0029de85, + 0x6218: 0x0029cc85, 0x6219: 0x0029ce85, 0x621a: 0x0029d085, 0x621b: 0x0029d285, + 0x621c: 0x0029d485, 0x621d: 0x0029d685, 0x621e: 0x0029d885, 0x621f: 0x0029da85, + 0x6220: 0x0029dc85, 0x6221: 0x0029de85, 0x6222: 0x0029cc85, 0x6223: 0x0029ce85, + 0x6224: 0x0029d085, 0x6225: 0x0029d285, 0x6226: 0x0029d485, 0x6227: 0x0029d685, + 0x6228: 0x0029d885, 0x6229: 0x0029da85, 0x622a: 0x0029dc85, 0x622b: 0x0029de85, + 0x622c: 0x0029cc85, 0x622d: 0x0029ce85, 0x622e: 0x0029d085, 0x622f: 0x0029d285, + 0x6230: 0x0029d485, 0x6231: 0x0029d685, 0x6232: 0x0029d885, 0x6233: 0x0029da85, + 0x6234: 0x0029dc85, 0x6235: 0x0029de85, 0x6236: 0x0029cc85, 0x6237: 0x0029ce85, + 0x6238: 0x0029d085, 0x6239: 0x0029d285, 0x623a: 0x0029d485, 0x623b: 0x0029d685, + 0x623c: 0x0029d885, 0x623d: 0x0029da85, 0x623e: 0x0029dc85, 0x623f: 0x0029de85, + // Block 0x189, offset 0x6240 + 0x6240: 0x00393885, 0x6241: 0x00393c85, 0x6242: 0x00396485, 0x6243: 0x00398885, + 0x6245: 0x003a7485, 0x6246: 0x0039a685, 0x6247: 0x00397285, + 0x6248: 0x0039e685, 0x6249: 0x003a9085, 0x624a: 0x003a1a85, 0x624b: 0x003a4085, + 0x624c: 0x003a4e85, 0x624d: 0x003a5685, 0x624e: 0x0039c685, 0x624f: 0x0039ee85, + 0x6250: 0x0039fc85, 0x6251: 0x0039dc85, 0x6252: 0x003a1285, 0x6253: 0x0039a485, + 0x6254: 0x0039c885, 0x6255: 0x00395685, 0x6256: 0x00395885, 0x6257: 0x00397485, + 0x6258: 0x00398a85, 0x6259: 0x0039de85, 0x625a: 0x0039e885, 0x625b: 0x0039f085, + 0x625c: 0x00393a85, 0x625d: 0x003a5885, 0x625e: 0x0039fe85, 0x625f: 0x003a1085, + 0x6261: 0x00393c85, 0x6262: 0x00396485, + 0x6264: 0x003a6885, 0x6267: 0x00397285, + 0x6269: 0x003a9085, 0x626a: 0x003a1a85, 0x626b: 0x003a4085, + 0x626c: 0x003a4e85, 0x626d: 0x003a5685, 0x626e: 0x0039c685, 0x626f: 0x0039ee85, + 0x6270: 0x0039fc85, 0x6271: 0x0039dc85, 0x6272: 0x003a1285, + 0x6274: 0x0039c885, 0x6275: 0x00395685, 0x6276: 0x00395885, 0x6277: 0x00397485, + 0x6279: 0x0039de85, 0x627b: 0x0039f085, + // Block 0x18a, offset 0x6280 + 0x6282: 0x00396485, + 0x6287: 0x00397285, + 0x6289: 0x003a9085, 0x628b: 0x003a4085, + 0x628d: 0x003a5685, 0x628e: 0x0039c685, 0x628f: 0x0039ee85, + 0x6291: 0x0039dc85, 0x6292: 0x003a1285, + 0x6294: 0x0039c885, 0x6297: 0x00397485, + 0x6299: 0x0039de85, 0x629b: 0x0039f085, + 0x629d: 0x003a5885, 0x629f: 0x003a1085, + 0x62a1: 0x00393c85, 0x62a2: 0x00396485, + 0x62a4: 0x003a6885, 0x62a7: 0x00397285, + 0x62a8: 0x0039e685, 0x62a9: 0x003a9085, 0x62aa: 0x003a1a85, + 0x62ac: 0x003a4e85, 0x62ad: 0x003a5685, 0x62ae: 0x0039c685, 0x62af: 0x0039ee85, + 0x62b0: 0x0039fc85, 0x62b1: 0x0039dc85, 0x62b2: 0x003a1285, + 0x62b4: 0x0039c885, 0x62b5: 0x00395685, 0x62b6: 0x00395885, 0x62b7: 0x00397485, + 0x62b9: 0x0039de85, 0x62ba: 0x0039e885, 0x62bb: 0x0039f085, + 0x62bc: 0x00393a85, 0x62be: 0x0039fe85, + // Block 0x18b, offset 0x62c0 + 0x62c0: 0x00393885, 0x62c1: 0x00393c85, 0x62c2: 0x00396485, 0x62c3: 0x00398885, + 0x62c4: 0x003a6885, 0x62c5: 0x003a7485, 0x62c6: 0x0039a685, 0x62c7: 0x00397285, + 0x62c8: 0x0039e685, 0x62c9: 0x003a9085, 0x62cb: 0x003a4085, + 0x62cc: 0x003a4e85, 0x62cd: 0x003a5685, 0x62ce: 0x0039c685, 0x62cf: 0x0039ee85, + 0x62d0: 0x0039fc85, 0x62d1: 0x0039dc85, 0x62d2: 0x003a1285, 0x62d3: 0x0039a485, + 0x62d4: 0x0039c885, 0x62d5: 0x00395685, 0x62d6: 0x00395885, 0x62d7: 0x00397485, + 0x62d8: 0x00398a85, 0x62d9: 0x0039de85, 0x62da: 0x0039e885, 0x62db: 0x0039f085, + 0x62e1: 0x00393c85, 0x62e2: 0x00396485, 0x62e3: 0x00398885, + 0x62e5: 0x003a7485, 0x62e6: 0x0039a685, 0x62e7: 0x00397285, + 0x62e8: 0x0039e685, 0x62e9: 0x003a9085, 0x62eb: 0x003a4085, + 0x62ec: 0x003a4e85, 0x62ed: 0x003a5685, 0x62ee: 0x0039c685, 0x62ef: 0x0039ee85, + 0x62f0: 0x0039fc85, 0x62f1: 0x0039dc85, 0x62f2: 0x003a1285, 0x62f3: 0x0039a485, + 0x62f4: 0x0039c885, 0x62f5: 0x00395685, 0x62f6: 0x00395885, 0x62f7: 0x00397485, + 0x62f8: 0x00398a85, 0x62f9: 0x0039de85, 0x62fa: 0x0039e885, 0x62fb: 0x0039f085, + // Block 0x18c, offset 0x6300 + 0x6330: 0x40070a20, 0x6331: 0x40070c20, + // Block 0x18d, offset 0x6340 + 0x6340: 0x401f6e20, 0x6341: 0x401f7020, 0x6342: 0x401f7220, 0x6343: 0x401f7420, + 0x6344: 0x401f7620, 0x6345: 0x401f7820, 0x6346: 0x401f7a20, 0x6347: 0x401f7c20, + 0x6348: 0x401f7e20, 0x6349: 0x401f8020, 0x634a: 0x401f8220, 0x634b: 0x401f8420, + 0x634c: 0x401f8620, 0x634d: 0x401f8820, 0x634e: 0x401f8a20, 0x634f: 0x401f8c20, + 0x6350: 0x401f8e20, 0x6351: 0x401f9020, 0x6352: 0x401f9220, 0x6353: 0x401f9420, + 0x6354: 0x401f9620, 0x6355: 0x401f9820, 0x6356: 0x401f9a20, 0x6357: 0x401f9c20, + 0x6358: 0x401f9e20, 0x6359: 0x401fa020, 0x635a: 0x401fa220, 0x635b: 0x401fa420, + 0x635c: 0x401fa620, 0x635d: 0x401fa820, 0x635e: 0x401faa20, 0x635f: 0x401fac20, + 0x6360: 0x401fae20, 0x6361: 0x401fb020, 0x6362: 0x401fb220, 0x6363: 0x401fb420, + 0x6364: 0x401fb620, 0x6365: 0x401fb820, 0x6366: 0x401fba20, 0x6367: 0x401fbc20, + 0x6368: 0x401fbe20, 0x6369: 0x401fc020, 0x636a: 0x401fc220, 0x636b: 0x401fc420, + 0x6370: 0x401fc620, 0x6371: 0x401fc820, 0x6372: 0x401fca20, 0x6373: 0x401fcc20, + 0x6374: 0x401fce20, 0x6375: 0x401fd020, 0x6376: 0x401fd220, 0x6377: 0x401fd420, + 0x6378: 0x401fd620, 0x6379: 0x401fd820, 0x637a: 0x401fda20, 0x637b: 0x401fdc20, + 0x637c: 0x401fde20, 0x637d: 0x401fe020, 0x637e: 0x401fe220, 0x637f: 0x401fe420, + // Block 0x18e, offset 0x6380 + 0x6380: 0x401fe620, 0x6381: 0x401fe820, 0x6382: 0x401fea20, 0x6383: 0x401fec20, + 0x6384: 0x401fee20, 0x6385: 0x401ff020, 0x6386: 0x401ff220, 0x6387: 0x401ff420, + 0x6388: 0x401ff620, 0x6389: 0x401ff820, 0x638a: 0x401ffa20, 0x638b: 0x401ffc20, + 0x638c: 0x401ffe20, 0x638d: 0x40200020, 0x638e: 0x40200220, 0x638f: 0x40200420, + 0x6390: 0x40200620, 0x6391: 0x40200820, 0x6392: 0x40200a20, 0x6393: 0x40200c20, + 0x6394: 0x40200e20, 0x6395: 0x40201020, 0x6396: 0x40201220, 0x6397: 0x40201420, + 0x6398: 0x40201620, 0x6399: 0x40201820, 0x639a: 0x40201a20, 0x639b: 0x40201c20, + 0x639c: 0x40201e20, 0x639d: 0x40202020, 0x639e: 0x40202220, 0x639f: 0x40202420, + 0x63a0: 0x40202620, 0x63a1: 0x40202820, 0x63a2: 0x40202a20, 0x63a3: 0x40202c20, + 0x63a4: 0x40202e20, 0x63a5: 0x40203020, 0x63a6: 0x40203220, 0x63a7: 0x40203420, + 0x63a8: 0x40203620, 0x63a9: 0x40203820, 0x63aa: 0x40203a20, 0x63ab: 0x40203c20, + 0x63ac: 0x40203e20, 0x63ad: 0x40204020, 0x63ae: 0x40204220, 0x63af: 0x40204420, + 0x63b0: 0x40204620, 0x63b1: 0x40204820, 0x63b2: 0x40204a20, 0x63b3: 0x40204c20, + 0x63b4: 0x40204e20, 0x63b5: 0x40205020, 0x63b6: 0x40205220, 0x63b7: 0x40205420, + 0x63b8: 0x40205620, 0x63b9: 0x40205820, 0x63ba: 0x40205a20, 0x63bb: 0x40205c20, + 0x63bc: 0x40205e20, 0x63bd: 0x40206020, 0x63be: 0x40206220, 0x63bf: 0x40206420, + // Block 0x18f, offset 0x63c0 + 0x63c0: 0x40206620, 0x63c1: 0x40206820, 0x63c2: 0x40206a20, 0x63c3: 0x40206c20, + 0x63c4: 0x40206e20, 0x63c5: 0x40207020, 0x63c6: 0x40207220, 0x63c7: 0x40207420, + 0x63c8: 0x40207620, 0x63c9: 0x40207820, 0x63ca: 0x40207a20, 0x63cb: 0x40207c20, + 0x63cc: 0x40207e20, 0x63cd: 0x40208020, 0x63ce: 0x40208220, 0x63cf: 0x40208420, + 0x63d0: 0x40208620, 0x63d1: 0x40208820, 0x63d2: 0x40208a20, 0x63d3: 0x40208c20, + 0x63e0: 0x40208e20, 0x63e1: 0x40209020, 0x63e2: 0x40209220, 0x63e3: 0x40209420, + 0x63e4: 0x40209620, 0x63e5: 0x40209820, 0x63e6: 0x40209a20, 0x63e7: 0x40209c20, + 0x63e8: 0x40209e20, 0x63e9: 0x4020a020, 0x63ea: 0x4020a220, 0x63eb: 0x4020a420, + 0x63ec: 0x4020a620, 0x63ed: 0x4020a820, 0x63ee: 0x4020aa20, + 0x63f1: 0x4020ac20, 0x63f2: 0x4020ae20, 0x63f3: 0x4020b020, + 0x63f4: 0x4020b220, 0x63f5: 0x4020b420, 0x63f6: 0x4020b620, 0x63f7: 0x4020b820, + 0x63f8: 0x4020ba20, 0x63f9: 0x4020bc20, 0x63fa: 0x4020be20, 0x63fb: 0x4020c020, + 0x63fc: 0x4020c220, 0x63fd: 0x4020c420, 0x63fe: 0x4020c620, + // Block 0x190, offset 0x6400 + 0x6401: 0x4020c820, 0x6402: 0x4020ca20, 0x6403: 0x4020cc20, + 0x6404: 0x4020ce20, 0x6405: 0x4020d020, 0x6406: 0x4020d220, 0x6407: 0x4020d420, + 0x6408: 0x4020d620, 0x6409: 0x4020d820, 0x640a: 0x4020da20, 0x640b: 0x4020dc20, + 0x640c: 0x4020de20, 0x640d: 0x4020e020, 0x640e: 0x4020e220, 0x640f: 0x4020e420, + 0x6411: 0x4020e620, 0x6412: 0x4020e820, 0x6413: 0x4020ea20, + 0x6414: 0x4020ec20, 0x6415: 0x4020ee20, 0x6416: 0x4020f020, 0x6417: 0x4020f220, + 0x6418: 0x4020f420, 0x6419: 0x4020f620, 0x641a: 0x4020f820, 0x641b: 0x4020fa20, + 0x641c: 0x4020fc20, 0x641d: 0x4020fe20, 0x641e: 0x40210020, 0x641f: 0x40210220, + // Block 0x191, offset 0x6440 + 0x6440: 0xf0001f04, 0x6441: 0xf0001f04, 0x6442: 0xf0001f04, 0x6443: 0xf0001f04, + 0x6444: 0xf0001f04, 0x6445: 0xf0001f04, 0x6446: 0xf0001f04, 0x6447: 0xf0001f04, + 0x6448: 0xf0001f04, 0x6449: 0xf0001f04, 0x644a: 0xf0001f04, + 0x6450: 0xf0000a04, 0x6451: 0xf0000a04, 0x6452: 0xf0000a04, 0x6453: 0xf0000a04, + 0x6454: 0xf0000a04, 0x6455: 0xf0000a04, 0x6456: 0xf0000a04, 0x6457: 0xf0000a04, + 0x6458: 0xf0000a04, 0x6459: 0xf0000a04, 0x645a: 0xf0000a04, 0x645b: 0xf0000a04, + 0x645c: 0xf0000a04, 0x645d: 0xf0000a04, 0x645e: 0xf0000a04, 0x645f: 0xf0000a04, + 0x6460: 0xf0000a04, 0x6461: 0xf0000a04, 0x6462: 0xf0000a04, 0x6463: 0xf0000a04, + 0x6464: 0xf0000a04, 0x6465: 0xf0000a04, 0x6466: 0xf0000a04, 0x6467: 0xf0000a04, + 0x6468: 0xf0000a04, 0x6469: 0xf0000a04, 0x646a: 0xf0000a04, 0x646b: 0x002c3a8c, + 0x646c: 0x002f7a8c, 0x646d: 0xf0000c0c, 0x646e: 0xf0000c0c, + 0x6470: 0x002bde9d, 0x6471: 0x002c0a9d, 0x6472: 0x002c3a9d, 0x6473: 0x002c629d, + 0x6474: 0x002c989d, 0x6475: 0x002d089d, 0x6476: 0x002d229d, 0x6477: 0x002d689d, + 0x6478: 0x002d9a9d, 0x6479: 0x002dcc9d, 0x647a: 0x002dfe9d, 0x647b: 0x002e229d, + 0x647c: 0x002e829d, 0x647d: 0x002e9e9d, 0x647e: 0x002ee29d, 0x647f: 0x002f2c9d, + // Block 0x192, offset 0x6480 + 0x6480: 0x002f569d, 0x6481: 0x002f7a9d, 0x6482: 0x002fe69d, 0x6483: 0x00302c9d, + 0x6484: 0x00306c9d, 0x6485: 0x0030be9d, 0x6486: 0x0030e29d, 0x6487: 0x0030f69d, + 0x6488: 0x0031009d, 0x6489: 0x00312a9d, 0x648a: 0xf0001d1d, 0x648b: 0xf0001d1d, + 0x648c: 0xf0001d1d, 0x648d: 0xf0001d1d, 0x648e: 0xe0000ebc, 0x648f: 0xf0001d1d, + 0x6490: 0x002bde8c, 0x6491: 0x002c0a8c, 0x6492: 0x002c3a8c, 0x6493: 0x002c628c, + 0x6494: 0x002c988c, 0x6495: 0x002d088c, 0x6496: 0x002d228c, 0x6497: 0x002d688c, + 0x6498: 0x002d9a8c, 0x6499: 0x002dcc8c, 0x649a: 0x002dfe8c, 0x649b: 0x002e228c, + 0x649c: 0x002e828c, 0x649d: 0x002e9e8c, 0x649e: 0x002ee28c, 0x649f: 0x002f2c8c, + 0x64a0: 0x002f568c, 0x64a1: 0x002f7a8c, 0x64a2: 0x002fe68c, 0x64a3: 0x00302c8c, + 0x64a4: 0x00306c8c, 0x64a5: 0x0030be8c, 0x64a6: 0x0030e28c, 0x64a7: 0x0030f68c, + 0x64a8: 0x0031008c, 0x64a9: 0x00312a8c, 0x64aa: 0xf0001414, 0x64ab: 0xf0001414, + 0x64b0: 0x002bde9d, 0x64b1: 0x002c0a9d, 0x64b2: 0x002c3a9d, 0x64b3: 0x002c629d, + 0x64b4: 0x002c989d, 0x64b5: 0x002d089d, 0x64b6: 0x002d229d, 0x64b7: 0x002d689d, + 0x64b8: 0x002d9a9d, 0x64b9: 0x002dcc9d, 0x64ba: 0x002dfe9d, 0x64bb: 0x002e229d, + 0x64bc: 0x002e829d, 0x64bd: 0x002e9e9d, 0x64be: 0x002ee29d, 0x64bf: 0x002f2c9d, + // Block 0x193, offset 0x64c0 + 0x64c0: 0x002f569d, 0x64c1: 0x002f7a9d, 0x64c2: 0x002fe69d, 0x64c3: 0x00302c9d, + 0x64c4: 0x00306c9d, 0x64c5: 0x0030be9d, 0x64c6: 0x0030e29d, 0x64c7: 0x0030f69d, + 0x64c8: 0x0031009d, 0x64c9: 0x00312a9d, 0x64ca: 0x002f2c9d, 0x64cb: 0xe0000c81, + 0x64cc: 0xe0000eb5, 0x64cd: 0xe0000f74, 0x64ce: 0xe00009d2, 0x64cf: 0xe00010f0, + 0x64d0: 0xf0001d1d, 0x64d1: 0xe0000a6f, 0x64d2: 0xe0000a7e, 0x64d3: 0xe0000ba4, + 0x64d4: 0xe0000c84, 0x64d5: 0xe0000d8a, 0x64d6: 0xe0000d8e, 0x64d7: 0xe0000e9b, + 0x64d8: 0xe0000f77, 0x64d9: 0xe00010a2, 0x64da: 0xe00010c0, + // Block 0x194, offset 0x6500 + 0x6526: 0x40110c20, 0x6527: 0x40110e20, + 0x6528: 0x40111020, 0x6529: 0x40111220, 0x652a: 0x40111420, 0x652b: 0x40111620, + 0x652c: 0x40111820, 0x652d: 0x40111a20, 0x652e: 0x40111c20, 0x652f: 0x40111e20, + 0x6530: 0x40112020, 0x6531: 0x40112220, 0x6532: 0x40112420, 0x6533: 0x40112620, + 0x6534: 0x40112820, 0x6535: 0x40112a20, 0x6536: 0x40112c20, 0x6537: 0x40112e20, + 0x6538: 0x40113020, 0x6539: 0x40113220, 0x653a: 0x40113420, 0x653b: 0x40113620, + 0x653c: 0x40113820, 0x653d: 0x40113a20, 0x653e: 0x40113c20, 0x653f: 0x40113e20, + // Block 0x195, offset 0x6540 + 0x6540: 0xf0001c1c, 0x6541: 0xf0001c1c, 0x6542: 0x00658c9c, + 0x6550: 0x02c4969c, 0x6551: 0x02b6ae9c, 0x6552: 0x02a7989c, 0x6553: 0xf0001c1c, + 0x6554: 0x029d189c, 0x6555: 0x02b2349c, 0x6556: 0x0313c69c, 0x6557: 0x02b2529c, + 0x6558: 0x029d489c, 0x6559: 0x02cc409c, 0x655a: 0x02e2429c, 0x655b: 0x02cb329c, + 0x655c: 0x02a49a9c, 0x655d: 0x02bf189c, 0x655e: 0x02a31a9c, 0x655f: 0x02cb609c, + 0x6560: 0x02a43a9c, 0x6561: 0x02fa849c, 0x6562: 0x02ea3e9c, 0x6563: 0x0319529c, + 0x6564: 0x02b1e09c, 0x6565: 0x02a8729c, 0x6566: 0x02de289c, 0x6567: 0x02c52a9c, + 0x6568: 0x02c6aa9c, 0x6569: 0x029c009c, 0x656a: 0x029c129c, 0x656b: 0x0320949c, + 0x656c: 0x02bbcc9c, 0x656d: 0x029c5a9c, 0x656e: 0x02a7e69c, 0x656f: 0x02c60e9c, + 0x6570: 0x031ae09c, 0x6571: 0x02c4a69c, 0x6572: 0x02f3029c, 0x6573: 0x02f4f49c, + 0x6574: 0x02a8109c, 0x6575: 0x02dd009c, 0x6576: 0x02ce129c, 0x6577: 0x02ce109c, + 0x6578: 0x02ea669c, 0x6579: 0x02a4e49c, 0x657a: 0x02ab6c9c, + // Block 0x196, offset 0x6580 + 0x6580: 0xf0000404, 0x6581: 0xf0000404, 0x6582: 0xf0000404, 0x6583: 0xf0000404, + 0x6584: 0xf0000404, 0x6585: 0xf0000404, 0x6586: 0xf0000404, 0x6587: 0xf0000404, + 0x6588: 0xf0000404, + 0x6590: 0x02bf2e86, 0x6591: 0x02a7de86, + // Block 0x197, offset 0x65c0 + 0x65c0: 0x40210420, 0x65c1: 0x40210620, 0x65c2: 0x40210820, 0x65c3: 0x40210a20, + 0x65c4: 0x40210c20, 0x65c5: 0x40210e20, 0x65c6: 0x40211020, 0x65c7: 0x40211220, + 0x65c8: 0x40211420, 0x65c9: 0x40211620, 0x65ca: 0x40211820, 0x65cb: 0x40211a20, + 0x65cc: 0x40211c20, 0x65cd: 0x40211e20, 0x65ce: 0x40212020, 0x65cf: 0x40212220, + 0x65d0: 0x40212420, 0x65d1: 0x40212620, 0x65d2: 0x40212820, 0x65d3: 0x40212a20, + 0x65d4: 0x40212c20, 0x65d5: 0x40212e20, 0x65d6: 0x40213020, 0x65d7: 0x40213220, + 0x65d8: 0x40213420, 0x65d9: 0x40213620, 0x65da: 0x40213820, 0x65db: 0x40213a20, + 0x65dc: 0x40213c20, 0x65dd: 0x40213e20, 0x65de: 0x40214020, 0x65df: 0x40214220, + 0x65e0: 0x40214420, + 0x65f0: 0x40214620, 0x65f1: 0x40214820, 0x65f2: 0x40214a20, 0x65f3: 0x40214c20, + 0x65f4: 0x40214e20, 0x65f5: 0x40215020, 0x65f7: 0x40215220, + 0x65f8: 0x40215420, 0x65f9: 0x40215620, 0x65fa: 0x40215820, 0x65fb: 0x40215a20, + 0x65fc: 0x40215c20, 0x65fd: 0x40215e20, 0x65fe: 0x40216020, 0x65ff: 0x40216220, + // Block 0x198, offset 0x6600 + 0x6600: 0x40216420, 0x6601: 0x40216620, 0x6602: 0x40216820, 0x6603: 0x40216a20, + 0x6604: 0x40216c20, 0x6605: 0x40216e20, 0x6606: 0x40217020, 0x6607: 0x40217220, + 0x6608: 0x40217420, 0x6609: 0x40217620, 0x660a: 0x40217820, 0x660b: 0x40217a20, + 0x660c: 0x40217c20, 0x660d: 0x40217e20, 0x660e: 0x40218020, 0x660f: 0x40218220, + 0x6610: 0x40218420, 0x6611: 0x40218620, 0x6612: 0x40218820, 0x6613: 0x40218a20, + 0x6614: 0x40218c20, 0x6615: 0x40218e20, 0x6616: 0x40219020, 0x6617: 0x40219220, + 0x6618: 0x40219420, 0x6619: 0x40219620, 0x661a: 0x40219820, 0x661b: 0x40219a20, + 0x661c: 0x40219c20, 0x661d: 0x40219e20, 0x661e: 0x4021a020, 0x661f: 0x4021a220, + 0x6620: 0x4021a420, 0x6621: 0x4021a620, 0x6622: 0x4021a820, 0x6623: 0x4021aa20, + 0x6624: 0x4021ac20, 0x6625: 0x4021ae20, 0x6626: 0x4021b020, 0x6627: 0x4021b220, + 0x6628: 0x4021b420, 0x6629: 0x4021b620, 0x662a: 0x4021b820, 0x662b: 0x4021ba20, + 0x662c: 0x4021bc20, 0x662d: 0x4021be20, 0x662e: 0x4021c020, 0x662f: 0x4021c220, + 0x6630: 0x4021c420, 0x6631: 0x4021c620, 0x6632: 0x4021c820, 0x6633: 0x4021ca20, + 0x6634: 0x4021cc20, 0x6635: 0x4021ce20, 0x6636: 0x4021d020, 0x6637: 0x4021d220, + 0x6638: 0x4021d420, 0x6639: 0x4021d620, 0x663a: 0x4021d820, 0x663b: 0x4021da20, + 0x663c: 0x4021dc20, + // Block 0x199, offset 0x6640 + 0x6640: 0x4021de20, 0x6641: 0x4021e020, 0x6642: 0x4021e220, 0x6643: 0x4021e420, + 0x6644: 0x4021e620, 0x6645: 0x4021e820, 0x6646: 0x4021ea20, 0x6647: 0x4021ec20, + 0x6648: 0x4021ee20, 0x6649: 0x4021f020, 0x664a: 0x4021f220, 0x664b: 0x4021f420, + 0x664c: 0x4021f620, 0x664d: 0x4021f820, 0x664e: 0x4021fa20, 0x664f: 0x4021fc20, + 0x6650: 0x4021fe20, 0x6651: 0x40220020, 0x6652: 0x40220220, 0x6653: 0x40220420, + 0x6660: 0x40220620, 0x6661: 0x40220820, 0x6662: 0x40220a20, 0x6663: 0x40220c20, + 0x6664: 0x40220e20, 0x6665: 0x40221020, 0x6666: 0x40221220, 0x6667: 0x40221420, + 0x6668: 0x40221620, 0x6669: 0x40221820, 0x666a: 0x40221a20, 0x666b: 0x40221c20, + 0x666c: 0x40221e20, 0x666d: 0x40222020, 0x666e: 0x40222220, 0x666f: 0x40222420, + 0x6670: 0x40222620, 0x6671: 0x40222820, 0x6672: 0x40222a20, 0x6673: 0x40222c20, + 0x6674: 0x40222e20, 0x6675: 0x40223020, 0x6676: 0x40223220, 0x6677: 0x40223420, + 0x6678: 0x40223620, 0x6679: 0x40223820, 0x667a: 0x40223a20, 0x667b: 0x40223c20, + 0x667c: 0x40223e20, 0x667d: 0x40224020, 0x667e: 0x40224220, 0x667f: 0x40224420, + // Block 0x19a, offset 0x6680 + 0x6680: 0x40224620, 0x6681: 0x40224820, 0x6682: 0x40224a20, 0x6683: 0x40224c20, + 0x6684: 0x40224e20, 0x6686: 0x40225020, 0x6687: 0x40225220, + 0x6688: 0x40225420, 0x6689: 0x40225620, 0x668a: 0x40225820, + 0x66a0: 0x40225a20, 0x66a1: 0x40225c20, 0x66a2: 0x40225e20, 0x66a3: 0x40226020, + 0x66a4: 0x40226220, 0x66a5: 0x40226420, 0x66a6: 0x40226620, 0x66a7: 0x40226820, + 0x66a8: 0x40226a20, 0x66a9: 0x40226c20, 0x66aa: 0x40226e20, 0x66ab: 0x40227020, + 0x66ac: 0x40227220, 0x66ad: 0x40227420, 0x66ae: 0x40227620, 0x66af: 0x40227820, + 0x66b0: 0x40227a20, + // Block 0x19b, offset 0x66c0 + 0x66c0: 0x40227c20, 0x66c1: 0x40227e20, 0x66c2: 0x40228020, 0x66c3: 0x40228220, + 0x66c4: 0x40228420, 0x66c5: 0x40228620, 0x66c6: 0x40228820, 0x66c7: 0x40228a20, + 0x66c8: 0x40228c20, 0x66c9: 0x40228e20, 0x66ca: 0x40229020, 0x66cb: 0x40229220, + 0x66cc: 0x40229420, 0x66cd: 0x40229620, 0x66ce: 0x40229820, 0x66cf: 0x40229a20, + 0x66d0: 0x40229c20, 0x66d1: 0x40229e20, 0x66d2: 0x4022a020, 0x66d3: 0x4022a220, + 0x66d4: 0x4022a420, 0x66d5: 0x4022a620, 0x66d6: 0x4022a820, 0x66d7: 0x4022aa20, + 0x66d8: 0x4022ac20, 0x66d9: 0x4022ae20, 0x66da: 0x4022b020, 0x66db: 0x4022b220, + 0x66dc: 0x4022b420, 0x66dd: 0x4022b620, 0x66de: 0x4022b820, 0x66df: 0x4022ba20, + 0x66e0: 0x4022bc20, 0x66e1: 0x4022be20, 0x66e2: 0x4022c020, 0x66e3: 0x4022c220, + 0x66e4: 0x4022c420, 0x66e5: 0x4022c620, 0x66e6: 0x4022c820, 0x66e7: 0x4022ca20, + 0x66e8: 0x4022cc20, 0x66e9: 0x4022ce20, 0x66ea: 0x4022d020, 0x66eb: 0x4022d220, + 0x66ec: 0x4022d420, 0x66ed: 0x4022d620, 0x66ee: 0x4022d820, 0x66ef: 0x4022da20, + 0x66f0: 0x4022dc20, 0x66f1: 0x4022de20, 0x66f2: 0x4022e020, 0x66f3: 0x4022e220, + 0x66f4: 0x4022e420, 0x66f5: 0x4022e620, 0x66f6: 0x4022e820, 0x66f7: 0x4022ea20, + 0x66f8: 0x4022ec20, 0x66f9: 0x4022ee20, 0x66fa: 0x4022f020, 0x66fb: 0x4022f220, + 0x66fc: 0x4022f420, 0x66fd: 0x4022f620, 0x66fe: 0x4022f820, + // Block 0x19c, offset 0x6700 + 0x6700: 0x4022fa20, 0x6702: 0x4022fc20, 0x6703: 0x4022fe20, + 0x6704: 0x40230020, 0x6705: 0x40230220, 0x6706: 0x40230420, 0x6707: 0x40230620, + 0x6708: 0x40230820, 0x6709: 0x40230a20, 0x670a: 0x40230c20, 0x670b: 0x40230e20, + 0x670c: 0x40231020, 0x670d: 0x40231220, 0x670e: 0x40231420, 0x670f: 0x40231620, + 0x6710: 0x40231820, 0x6711: 0x40231a20, 0x6712: 0x40231c20, 0x6713: 0x40231e20, + 0x6714: 0x40232020, 0x6715: 0x40232220, 0x6716: 0x40232420, 0x6717: 0x40232620, + 0x6718: 0x40232820, 0x6719: 0x40232a20, 0x671a: 0x40232c20, 0x671b: 0x40232e20, + 0x671c: 0x40233020, 0x671d: 0x40233220, 0x671e: 0x40233420, 0x671f: 0x40233620, + 0x6720: 0x40233820, 0x6721: 0x40233a20, 0x6722: 0x40233c20, 0x6723: 0x40233e20, + 0x6724: 0x40234020, 0x6725: 0x40234220, 0x6726: 0x40234420, 0x6727: 0x40234620, + 0x6728: 0x40234820, 0x6729: 0x40234a20, 0x672a: 0x40234c20, 0x672b: 0x40234e20, + 0x672c: 0x40235020, 0x672d: 0x40235220, 0x672e: 0x40235420, 0x672f: 0x40235620, + 0x6730: 0x40235820, 0x6731: 0x40235a20, 0x6732: 0x40235c20, 0x6733: 0x40235e20, + 0x6734: 0x40236020, 0x6735: 0x40236220, 0x6736: 0x40236420, 0x6737: 0x40236620, + 0x6738: 0x40236820, 0x6739: 0x40236a20, 0x673a: 0x40236c20, 0x673b: 0x40236e20, + 0x673c: 0x40237020, 0x673d: 0x40237220, 0x673e: 0x40237420, 0x673f: 0x40237620, + // Block 0x19d, offset 0x6740 + 0x6740: 0x40237820, 0x6741: 0x40237a20, 0x6742: 0x40237c20, 0x6743: 0x40237e20, + 0x6744: 0x40238020, 0x6745: 0x40238220, 0x6746: 0x40238420, 0x6747: 0x40238620, + 0x6748: 0x40238820, 0x6749: 0x40238a20, 0x674a: 0x40238c20, 0x674b: 0x40238e20, + 0x674c: 0x40239020, 0x674d: 0x40239220, 0x674e: 0x40239420, 0x674f: 0x40239620, + 0x6750: 0x40239820, 0x6751: 0x40239a20, 0x6752: 0x40239c20, 0x6753: 0x40239e20, + 0x6754: 0x4023a020, 0x6755: 0x4023a220, 0x6756: 0x4023a420, 0x6757: 0x4023a620, + 0x6758: 0x4023a820, 0x6759: 0x4023aa20, 0x675a: 0x4023ac20, 0x675b: 0x4023ae20, + 0x675c: 0x4023b020, 0x675d: 0x4023b220, 0x675e: 0x4023b420, 0x675f: 0x4023b620, + 0x6760: 0x4023b820, 0x6761: 0x4023ba20, 0x6762: 0x4023bc20, 0x6763: 0x4023be20, + 0x6764: 0x4023c020, 0x6765: 0x4023c220, 0x6766: 0x4023c420, 0x6767: 0x4023c620, + 0x6768: 0x4023c820, 0x6769: 0x4023ca20, 0x676a: 0x4023cc20, 0x676b: 0x4023ce20, + 0x676c: 0x4023d020, 0x676d: 0x4023d220, 0x676e: 0x4023d420, 0x676f: 0x4023d620, + 0x6770: 0x4023d820, 0x6771: 0x4023da20, 0x6772: 0x4023dc20, 0x6773: 0x4023de20, + 0x6774: 0x4023e020, 0x6775: 0x4023e220, 0x6776: 0x4023e420, 0x6777: 0x4023e620, + 0x6778: 0x4023e820, 0x6779: 0x4023ea20, 0x677a: 0x4023ec20, 0x677b: 0x4023ee20, + 0x677c: 0x4023f020, 0x677d: 0x4023f220, 0x677e: 0x4023f420, 0x677f: 0x4023f620, + // Block 0x19e, offset 0x6780 + 0x6780: 0x4023f820, 0x6781: 0x4023fa20, 0x6782: 0x4023fc20, 0x6783: 0x4023fe20, + 0x6784: 0x40240020, 0x6785: 0x40240220, 0x6786: 0x40240420, 0x6787: 0x40240620, + 0x6788: 0x40240820, 0x6789: 0x40240a20, 0x678a: 0x40240c20, 0x678b: 0x40240e20, + 0x678c: 0x40241020, 0x678d: 0x40241220, 0x678e: 0x40241420, 0x678f: 0x40241620, + 0x6790: 0x40241820, 0x6791: 0x40241a20, 0x6792: 0x40241c20, 0x6793: 0x40241e20, + 0x6794: 0x40242020, 0x6795: 0x40242220, 0x6796: 0x40242420, 0x6797: 0x40242620, + 0x6798: 0x40242820, 0x6799: 0x40242a20, 0x679a: 0x40242c20, 0x679b: 0x40242e20, + 0x679c: 0x40243020, 0x679d: 0x40243220, 0x679e: 0x40243420, 0x679f: 0x40243620, + 0x67a0: 0x40243820, 0x67a1: 0x40243a20, 0x67a2: 0x40243c20, 0x67a3: 0x40243e20, + 0x67a4: 0x40244020, 0x67a5: 0x40244220, 0x67a6: 0x40244420, 0x67a7: 0x40244620, + 0x67a8: 0x40244820, 0x67a9: 0x40244a20, 0x67aa: 0x40244c20, 0x67ab: 0x40244e20, + 0x67ac: 0x40245020, 0x67ad: 0x40245220, 0x67ae: 0x40245420, 0x67af: 0x40245620, + 0x67b0: 0x40245820, 0x67b1: 0x40245a20, 0x67b2: 0x40245c20, 0x67b3: 0x40245e20, + 0x67b4: 0x40246020, 0x67b5: 0x40246220, 0x67b6: 0x40246420, 0x67b7: 0x40246620, + 0x67b9: 0x40246820, 0x67ba: 0x40246a20, 0x67bb: 0x40246c20, + 0x67bc: 0x40246e20, + // Block 0x19f, offset 0x67c0 + 0x67c0: 0x40247020, 0x67c1: 0x40247220, 0x67c2: 0x40247420, 0x67c3: 0x40247620, + 0x67c4: 0x40247820, 0x67c5: 0x40247a20, 0x67c6: 0x40247c20, 0x67c7: 0x40247e20, + 0x67c8: 0x40248020, 0x67c9: 0x40248220, 0x67ca: 0x40248420, 0x67cb: 0x40248620, + 0x67cc: 0x40248820, 0x67cd: 0x40248a20, 0x67ce: 0x40248c20, 0x67cf: 0x40248e20, + 0x67d0: 0x40249020, 0x67d1: 0x40249220, 0x67d2: 0x40249420, 0x67d3: 0x40249620, + 0x67d4: 0x40249820, 0x67d5: 0x40249a20, 0x67d6: 0x40249c20, 0x67d7: 0x40249e20, + 0x67d8: 0x4024a020, 0x67d9: 0x4024a220, 0x67da: 0x4024a420, 0x67db: 0x4024a620, + 0x67dc: 0x4024a820, 0x67dd: 0x4024aa20, 0x67de: 0x4024ac20, 0x67df: 0x4024ae20, + 0x67e0: 0x4024b020, 0x67e1: 0x4024b220, 0x67e2: 0x4024b420, 0x67e3: 0x4024b620, + 0x67e4: 0x4024b820, 0x67e5: 0x4024ba20, 0x67e6: 0x4024bc20, 0x67e7: 0x4024be20, + 0x67e8: 0x4024c020, 0x67e9: 0x4024c220, 0x67ea: 0x4024c420, 0x67eb: 0x4024c620, + 0x67ec: 0x4024c820, 0x67ed: 0x4024ca20, 0x67ee: 0x4024cc20, 0x67ef: 0x4024ce20, + 0x67f0: 0x4024d020, 0x67f1: 0x4024d220, 0x67f2: 0x4024d420, 0x67f3: 0x4024d620, + 0x67f4: 0x4024d820, 0x67f5: 0x4024da20, 0x67f6: 0x4024dc20, 0x67f7: 0x4024de20, + 0x67f8: 0x4024e020, 0x67f9: 0x4024e220, 0x67fa: 0x4024e420, 0x67fb: 0x4024e620, + 0x67fc: 0x4024e820, 0x67fd: 0x4024ea20, + // Block 0x1a0, offset 0x6800 + 0x6800: 0x4024ec20, 0x6801: 0x4024ee20, 0x6802: 0x4024f020, 0x6803: 0x4024f220, + 0x6810: 0x4024f420, 0x6811: 0x4024f620, 0x6812: 0x4024f820, 0x6813: 0x4024fa20, + 0x6814: 0x4024fc20, 0x6815: 0x4024fe20, 0x6816: 0x40250020, 0x6817: 0x40250220, + 0x6818: 0x40250420, 0x6819: 0x40250620, 0x681a: 0x40250820, 0x681b: 0x40250a20, + 0x681c: 0x40250c20, 0x681d: 0x40250e20, 0x681e: 0x40251020, 0x681f: 0x40251220, + 0x6820: 0x40251420, 0x6821: 0x40251620, 0x6822: 0x40251820, 0x6823: 0x40251a20, + 0x6824: 0x40251c20, 0x6825: 0x40251e20, 0x6826: 0x40252020, 0x6827: 0x40252220, + // Block 0x1a1, offset 0x6840 + 0x687b: 0x40252420, + 0x687c: 0x40252620, 0x687d: 0x40252820, 0x687e: 0x40252a20, 0x687f: 0x40252c20, + // Block 0x1a2, offset 0x6880 + 0x6880: 0x40252e20, 0x6881: 0x40253020, 0x6882: 0x40253220, 0x6883: 0x40253420, + 0x6884: 0x40253620, 0x6885: 0x40253820, 0x6886: 0x40253a20, 0x6887: 0x40253c20, + 0x6888: 0x40253e20, 0x6889: 0x40254020, 0x688a: 0x40254220, 0x688b: 0x40254420, + 0x688c: 0x40254620, 0x688d: 0x40254820, 0x688e: 0x40254a20, 0x688f: 0x40254c20, + 0x6890: 0x40254e20, 0x6891: 0x40255020, 0x6892: 0x40255220, 0x6893: 0x40255420, + 0x6894: 0x40255620, 0x6895: 0x40255820, 0x6896: 0x40255a20, 0x6897: 0x40255c20, + 0x6898: 0x40255e20, 0x6899: 0x40256020, 0x689a: 0x40256220, 0x689b: 0x40256420, + 0x689c: 0x40256620, 0x689d: 0x40256820, 0x689e: 0x40256a20, 0x689f: 0x40256c20, + 0x68a0: 0x40256e20, 0x68a1: 0x40257020, 0x68a2: 0x40257220, 0x68a3: 0x40257420, + 0x68a4: 0x40257620, 0x68a5: 0x40257820, 0x68a6: 0x40257a20, 0x68a7: 0x40257c20, + 0x68a8: 0x40257e20, 0x68a9: 0x40258020, 0x68aa: 0x40258220, 0x68ab: 0x40258420, + 0x68ac: 0x40258620, 0x68ad: 0x40258820, 0x68ae: 0x40258a20, 0x68af: 0x40258c20, + 0x68b0: 0x40258e20, 0x68b1: 0x40259020, 0x68b2: 0x40259220, 0x68b3: 0x40259420, + 0x68b4: 0x40259620, 0x68b5: 0x40259820, 0x68b6: 0x40259a20, 0x68b7: 0x40259c20, + 0x68b8: 0x40259e20, 0x68b9: 0x4025a020, 0x68ba: 0x4025a220, 0x68bb: 0x4025a420, + 0x68bc: 0x4025a620, 0x68bd: 0x4025a820, 0x68be: 0x4025aa20, 0x68bf: 0x4025ac20, + // Block 0x1a3, offset 0x68c0 + 0x68c0: 0x4025ae20, + 0x68c5: 0x4025b020, 0x68c6: 0x4025b220, 0x68c7: 0x4025b420, + 0x68c8: 0x4025b620, 0x68c9: 0x4025b820, 0x68ca: 0x4025ba20, 0x68cb: 0x4025bc20, + 0x68cc: 0x4025be20, 0x68cd: 0x4025c020, 0x68ce: 0x4025c220, 0x68cf: 0x4025c420, + // Block 0x1a4, offset 0x6900 + 0x6900: 0x4025c620, 0x6901: 0x4025c820, 0x6902: 0x4025ca20, 0x6903: 0x4025cc20, + 0x6904: 0x4025ce20, 0x6905: 0x4025d020, 0x6906: 0x4025d220, 0x6907: 0x4025d420, + 0x6908: 0x4025d620, 0x6909: 0x4025d820, 0x690a: 0x4025da20, 0x690b: 0x4025dc20, + 0x690c: 0x4025de20, 0x690d: 0x4025e020, 0x690e: 0x4025e220, 0x690f: 0x4025e420, + 0x6910: 0x4025e620, 0x6911: 0x4025e820, 0x6912: 0x4025ea20, 0x6913: 0x4025ec20, + 0x6914: 0x4025ee20, 0x6915: 0x4025f020, 0x6916: 0x4025f220, 0x6917: 0x4025f420, + 0x6918: 0x4025f620, 0x6919: 0x4025f820, 0x691a: 0x4025fa20, 0x691b: 0x4025fc20, + 0x691c: 0x4025fe20, 0x691d: 0x40260020, 0x691e: 0x40260220, 0x691f: 0x40260420, + 0x6920: 0x40260620, 0x6921: 0x40260820, 0x6922: 0x40260a20, 0x6923: 0x40260c20, + 0x6924: 0x40260e20, 0x6925: 0x40261020, 0x6926: 0x40261220, 0x6927: 0x40261420, + 0x6928: 0x40261620, 0x6929: 0x40261820, 0x692a: 0x40261a20, 0x692b: 0x40261c20, + 0x692c: 0x40261e20, 0x692d: 0x40262020, 0x692e: 0x40262220, 0x692f: 0x40262420, + 0x6930: 0x40262620, 0x6931: 0x40262820, 0x6932: 0x40262a20, 0x6933: 0x40262c20, + 0x6934: 0x40262e20, 0x6935: 0x40263020, 0x6936: 0x40263220, 0x6937: 0x40263420, + 0x6938: 0x40263620, 0x6939: 0x40263820, 0x693a: 0x40263a20, 0x693b: 0x40263c20, + 0x693c: 0x40263e20, 0x693d: 0x40264020, 0x693e: 0x40264220, 0x693f: 0x40264420, + // Block 0x1a5, offset 0x6940 + 0x6940: 0x40264620, 0x6941: 0x40264820, 0x6942: 0x40264a20, 0x6943: 0x40264c20, + 0x6944: 0x40264e20, 0x6945: 0x40265020, + // Block 0x1a6, offset 0x6980 + 0x6980: 0x40265220, 0x6981: 0x40265420, 0x6982: 0x40265620, 0x6983: 0x40265820, + 0x6984: 0x40265a20, 0x6985: 0x40265c20, 0x6986: 0x40265e20, 0x6987: 0x40266020, + 0x6988: 0x40266220, 0x6989: 0x40266420, 0x698a: 0x40266620, 0x698b: 0x40266820, + 0x698c: 0x40266a20, 0x698d: 0x40266c20, 0x698e: 0x40266e20, 0x698f: 0x40267020, + 0x6990: 0x40267220, 0x6991: 0x40267420, 0x6992: 0x40267620, 0x6993: 0x40267820, + 0x6994: 0x40267a20, 0x6995: 0x40267c20, 0x6996: 0x40267e20, 0x6997: 0x40268020, + 0x6998: 0x40268220, 0x6999: 0x40268420, 0x699a: 0x40268620, 0x699b: 0x40268820, + 0x699c: 0x40268a20, 0x699d: 0x40268c20, 0x699e: 0x40268e20, 0x699f: 0x40269020, + 0x69a0: 0x40269220, 0x69a1: 0x40269420, 0x69a2: 0x40269620, 0x69a3: 0x40269820, + 0x69a4: 0x40269a20, 0x69a5: 0x40269c20, 0x69a6: 0x40269e20, 0x69a7: 0x4026a020, + 0x69a8: 0x4026a220, 0x69a9: 0x4026a420, 0x69aa: 0x4026a620, 0x69ab: 0x4026a820, + 0x69ac: 0x4026aa20, 0x69ad: 0x4026ac20, 0x69ae: 0x4026ae20, 0x69af: 0x4026b020, + 0x69b0: 0x4026b220, 0x69b1: 0x4026b420, 0x69b2: 0x4026b620, 0x69b3: 0x4026b820, + 0x69b4: 0x4026ba20, 0x69b5: 0x4026bc20, 0x69b6: 0x4026be20, 0x69b7: 0x4026c020, + 0x69b8: 0x4026c220, 0x69b9: 0x4026c420, 0x69ba: 0x4026c620, 0x69bb: 0x4026c820, + 0x69bc: 0x4026ca20, 0x69bd: 0x4026cc20, 0x69be: 0x4026ce20, 0x69bf: 0x4026d020, + // Block 0x1a7, offset 0x69c0 + 0x69c0: 0x4026d220, 0x69c1: 0x4026d420, 0x69c2: 0x4026d620, 0x69c3: 0x4026d820, + 0x69c4: 0x4026da20, 0x69c5: 0x4026dc20, 0x69c6: 0x4026de20, 0x69c7: 0x4026e020, + 0x69c8: 0x4026e220, 0x69c9: 0x4026e420, 0x69ca: 0x4026e620, 0x69cb: 0x4026e820, + 0x69cc: 0x4026ea20, 0x69cd: 0x4026ec20, 0x69ce: 0x4026ee20, 0x69cf: 0x4026f020, + 0x69d0: 0x4026f220, 0x69d1: 0x4026f420, 0x69d2: 0x4026f620, 0x69d3: 0x4026f820, + 0x69d4: 0x4026fa20, 0x69d5: 0x4026fc20, 0x69d6: 0x4026fe20, 0x69d7: 0x40270020, + 0x69d8: 0x40270220, 0x69d9: 0x40270420, 0x69da: 0x40270620, 0x69db: 0x40270820, + 0x69dc: 0x40270a20, 0x69dd: 0x40270c20, 0x69de: 0x40270e20, 0x69df: 0x40271020, + 0x69e0: 0x40271220, 0x69e1: 0x40271420, 0x69e2: 0x40271620, 0x69e3: 0x40271820, + 0x69e4: 0x40271a20, 0x69e5: 0x40271c20, 0x69e6: 0x40271e20, 0x69e7: 0x40272020, + 0x69e8: 0x40272220, 0x69e9: 0x40272420, 0x69ea: 0x40272620, 0x69eb: 0x40272820, + 0x69ec: 0x40272a20, 0x69ed: 0x40272c20, 0x69ee: 0x40272e20, 0x69ef: 0x40273020, + 0x69f0: 0x40273220, 0x69f1: 0x40273420, 0x69f2: 0x40273620, 0x69f3: 0x40273820, + // Block 0x1a8, offset 0x6a00 + 0x6a00: 0x429c7a20, 0x6a01: 0x429c7020, 0x6a02: 0x429c8220, 0x6a03: 0x48024420, + 0x6a04: 0x429ec020, 0x6a05: 0x429f5c20, 0x6a06: 0x429f7620, 0x6a07: 0x42a00420, + 0x6a08: 0x42a0f420, 0x6a09: 0x42a13220, 0x6a0a: 0x42a1ce20, 0x6a0b: 0x42a19e20, + 0x6a0c: 0x44693c20, 0x6a0d: 0x480c7420, 0x6a0e: 0x42a29a20, 0x6a0f: 0x42a2a820, + 0x6a10: 0x42a2c820, 0x6a11: 0x42a2ee20, 0x6a12: 0x480a3820, 0x6a13: 0x44697220, + 0x6a14: 0x42a2ce20, 0x6a15: 0x42a31a20, 0x6a16: 0x480a9620, 0x6a17: 0x42a32e20, + 0x6a18: 0x42a34820, 0x6a19: 0x429d9820, 0x6a1a: 0x42a35820, 0x6a1b: 0x42a36a20, + 0x6a1c: 0x4923be20, 0x6a1d: 0x42a3ea20, 0x6a1e: 0x42a40620, 0x6a1f: 0x4469be20, + 0x6a20: 0x42a47620, 0x6a21: 0x42a48c20, 0x6a22: 0x42a4e420, 0x6a23: 0x42a4ee20, + 0x6a24: 0x446a2a20, 0x6a25: 0x42a58e20, 0x6a26: 0x42a59220, 0x6a27: 0x42a5c820, + 0x6a28: 0x42a5f420, 0x6a29: 0x42a60a20, 0x6a2a: 0x42a60c20, 0x6a2b: 0x42a62e20, + 0x6a2c: 0x42a69220, 0x6a2d: 0x42a6a220, 0x6a2e: 0x42a6b420, 0x6a2f: 0x42a6e620, + 0x6a30: 0x42a6fa20, 0x6a31: 0x42a6fe20, 0x6a32: 0x42a6fe20, 0x6a33: 0x42a6fe20, + 0x6a34: 0x48145820, 0x6a35: 0x42e0e020, 0x6a36: 0x42a79420, 0x6a37: 0x42a7be20, + 0x6a38: 0x4816c620, 0x6a39: 0x42a7d620, 0x6a3a: 0x42a7e220, 0x6a3b: 0x42a80c20, + 0x6a3c: 0x42a93c20, 0x6a3d: 0x42a87020, 0x6a3e: 0x42a89020, 0x6a3f: 0x42a8d020, + // Block 0x1a9, offset 0x6a40 + 0x6a40: 0x42a94420, 0x6a41: 0x42a9ec20, 0x6a42: 0x42aa2020, 0x6a43: 0x42aaa620, + 0x6a44: 0x42aac620, 0x6a45: 0x42ab0820, 0x6a46: 0x42ab0820, 0x6a47: 0x42ab3220, + 0x6a48: 0x42ab5620, 0x6a49: 0x42ab6620, 0x6a4a: 0x42ab8420, 0x6a4b: 0x42ae2c20, + 0x6a4c: 0x42ac0c20, 0x6a4d: 0x42ae2e20, 0x6a4e: 0x42aca220, 0x6a4f: 0x42ace820, + 0x6a50: 0x42a40e20, 0x6a51: 0x42b1dc20, 0x6a52: 0x42af9c20, 0x6a53: 0x42afe820, + 0x6a54: 0x42b01a20, 0x6a55: 0x42af1620, 0x6a56: 0x42b06420, 0x6a57: 0x42b06220, + 0x6a58: 0x42b15820, 0x6a59: 0x4829c820, 0x6a5a: 0x42b1e420, 0x6a5b: 0x42b1ee20, + 0x6a5c: 0x42b20c20, 0x6a5d: 0x42b23420, 0x6a5e: 0x42b24420, 0x6a5f: 0x42b2c420, + 0x6a60: 0x482d5020, 0x6a61: 0x482dd420, 0x6a62: 0x42b3d820, 0x6a63: 0x42b43620, + 0x6a64: 0x42b44e20, 0x6a65: 0x42b3b020, 0x6a66: 0x42b4cc20, 0x6a67: 0x446ddc20, + 0x6a68: 0x446df820, 0x6a69: 0x42b61020, 0x6a6a: 0x42b67c20, 0x6a6b: 0x42b67c20, + 0x6a6c: 0x48339020, 0x6a6d: 0x42b78620, 0x6a6e: 0x42b7b020, 0x6a6f: 0x42b7ce20, + 0x6a70: 0x42b7e620, 0x6a71: 0x48363020, 0x6a72: 0x42b7fe20, 0x6a73: 0x42b80c20, + 0x6a74: 0x42bea620, 0x6a75: 0x42b84420, 0x6a76: 0x446f0220, 0x6a77: 0x42b8c020, + 0x6a78: 0x42b8dc20, 0x6a79: 0x42b98020, 0x6a7a: 0x42b91a20, 0x6a7b: 0x483bc820, + 0x6a7c: 0x42ba8620, 0x6a7d: 0x483bcc20, 0x6a7e: 0x42badc20, 0x6a7f: 0x42bad620, + // Block 0x1aa, offset 0x6a80 + 0x6a80: 0x42baf820, 0x6a81: 0x42bbc220, 0x6a82: 0x42bbc420, 0x6a83: 0x44705e20, + 0x6a84: 0x42bbfa20, 0x6a85: 0x42bc5020, 0x6a86: 0x42bc7a20, 0x6a87: 0x42bcd220, + 0x6a88: 0x4470c420, 0x6a89: 0x48430620, 0x6a8a: 0x4470f820, 0x6a8b: 0x42bd6020, + 0x6a8c: 0x42bd6620, 0x6a8d: 0x42bd6c20, 0x6a8e: 0x42bd9420, 0x6a8f: 0x49472420, + 0x6a90: 0x42bdfc20, 0x6a91: 0x48466220, 0x6a92: 0x48466220, 0x6a93: 0x43040220, + 0x6a94: 0x42be4420, 0x6a95: 0x42be4420, 0x6a96: 0x44718e20, 0x6a97: 0x48657020, + 0x6a98: 0x48c3b420, 0x6a99: 0x42bec420, 0x6a9a: 0x42bed620, 0x6a9b: 0x4471c620, + 0x6a9c: 0x42bf3420, 0x6a9d: 0x42bf9a20, 0x6a9e: 0x42bfae20, 0x6a9f: 0x42bff220, + 0x6aa0: 0x42c10220, 0x6aa1: 0x44727420, 0x6aa2: 0x44723820, 0x6aa3: 0x42c12820, + 0x6aa4: 0x484da820, 0x6aa5: 0x42c18e20, 0x6aa6: 0x42c29020, 0x6aa7: 0x42c29820, + 0x6aa8: 0x42c29c20, 0x6aa9: 0x42c29820, 0x6aaa: 0x42c2f420, 0x6aab: 0x42c31c20, + 0x6aac: 0x42c36420, 0x6aad: 0x42c34820, 0x6aae: 0x42c35e20, 0x6aaf: 0x42c3bc20, + 0x6ab0: 0x42c3e420, 0x6ab1: 0x42c3ec20, 0x6ab2: 0x42c42020, 0x6ab3: 0x42c43620, + 0x6ab4: 0x42c4ba20, 0x6ab5: 0x42c56220, 0x6ab6: 0x42c5a820, 0x6ab7: 0x42c6a020, + 0x6ab8: 0x48561820, 0x6ab9: 0x42c67a20, 0x6aba: 0x42c5f820, 0x6abb: 0x42c6d020, + 0x6abc: 0x42c70620, 0x6abd: 0x42c7c820, 0x6abe: 0x4857e220, 0x6abf: 0x42c84420, + // Block 0x1ab, offset 0x6ac0 + 0x6ac0: 0x42c78a20, 0x6ac1: 0x42c75220, 0x6ac2: 0x44745c20, 0x6ac3: 0x42c8d220, + 0x6ac4: 0x42c8fc20, 0x6ac5: 0x42c93a20, 0x6ac6: 0x42c8ee20, 0x6ac7: 0x4474d820, + 0x6ac8: 0x42ca9e20, 0x6ac9: 0x42cad820, 0x6aca: 0x48601420, 0x6acb: 0x42cbc620, + 0x6acc: 0x42cdf020, 0x6acd: 0x42cc9220, 0x6ace: 0x44763220, 0x6acf: 0x42cd2220, + 0x6ad0: 0x44761020, 0x6ad1: 0x4475c820, 0x6ad2: 0x42a32420, 0x6ad3: 0x42a32a20, + 0x6ad4: 0x42ce0020, 0x6ad5: 0x42cd3820, 0x6ad6: 0x43015a20, 0x6ad7: 0x4487b220, + 0x6ad8: 0x42ce2e20, 0x6ad9: 0x42ce3620, 0x6ada: 0x42ce4220, 0x6adb: 0x42cebc20, + 0x6adc: 0x42cea620, 0x6add: 0x48678620, 0x6ade: 0x44769220, 0x6adf: 0x42cff420, + 0x6ae0: 0x42cf0a20, 0x6ae1: 0x42d0a420, 0x6ae2: 0x42d10a20, 0x6ae3: 0x4868da20, + 0x6ae4: 0x42d11c20, 0x6ae5: 0x42d03e20, 0x6ae6: 0x42d22820, 0x6ae7: 0x44773a20, + 0x6ae8: 0x42d28420, 0x6ae9: 0x42d34620, 0x6aea: 0x42d3d420, 0x6aeb: 0x42d55020, + 0x6aec: 0x486d4620, 0x6aed: 0x42d5b620, 0x6aee: 0x44783020, 0x6aef: 0x42d64220, + 0x6af0: 0x48714e20, 0x6af1: 0x42d6a820, 0x6af2: 0x44789c20, 0x6af3: 0x42d6e420, + 0x6af4: 0x42d73e20, 0x6af5: 0x42d77420, 0x6af6: 0x42d77620, 0x6af7: 0x48751a20, + 0x6af8: 0x483a1620, 0x6af9: 0x4875f420, 0x6afa: 0x42d89c20, 0x6afb: 0x48797820, + 0x6afc: 0x42d97e20, 0x6afd: 0x42d99a20, 0x6afe: 0x42d8ce20, 0x6aff: 0x42da2c20, + // Block 0x1ac, offset 0x6b00 + 0x6b00: 0x42da7c20, 0x6b01: 0x42daee20, 0x6b02: 0x42da8220, 0x6b03: 0x42dad220, + 0x6b04: 0x42daf020, 0x6b05: 0x42db0a20, 0x6b06: 0x487a3c20, 0x6b07: 0x42da6820, + 0x6b08: 0x42dc5e20, 0x6b09: 0x42dcdc20, 0x6b0a: 0x447a6620, 0x6b0b: 0x42dd9620, + 0x6b0c: 0x42dd8e20, 0x6b0d: 0x487da220, 0x6b0e: 0x42dbf220, 0x6b0f: 0x42dedc20, + 0x6b10: 0x487ebc20, 0x6b11: 0x487f1c20, 0x6b12: 0x42df8c20, 0x6b13: 0x42e07220, + 0x6b14: 0x42e03c20, 0x6b15: 0x42e03620, 0x6b16: 0x447b2c20, 0x6b17: 0x42e09420, + 0x6b18: 0x42e0fa20, 0x6b19: 0x42e0ee20, 0x6b1a: 0x42e15a20, 0x6b1b: 0x480a4a20, + 0x6b1c: 0x42e28a20, 0x6b1d: 0x4884c620, 0x6b1e: 0x42e33820, 0x6b1f: 0x48875620, + 0x6b20: 0x42e45020, 0x6b21: 0x42e46a20, 0x6b22: 0x42e4a020, 0x6b23: 0x488c1020, + 0x6b24: 0x42e50020, 0x6b25: 0x42e52a20, 0x6b26: 0x488e6a20, 0x6b27: 0x48902820, + 0x6b28: 0x42e6f420, 0x6b29: 0x42e71620, 0x6b2a: 0x447d5820, 0x6b2b: 0x42e74a20, + 0x6b2c: 0x447d7020, 0x6b2d: 0x447d7020, 0x6b2e: 0x42e88e20, 0x6b2f: 0x42e8b820, + 0x6b30: 0x42e8e220, 0x6b31: 0x42e90a20, 0x6b32: 0x42e99420, 0x6b33: 0x447e3620, + 0x6b34: 0x42ea4820, 0x6b35: 0x48986c20, 0x6b36: 0x42ea7c20, 0x6b37: 0x48992420, + 0x6b38: 0x42eae020, 0x6b39: 0x48433e20, 0x6b3a: 0x42ec2020, 0x6b3b: 0x489f4220, + 0x6b3c: 0x489f7020, 0x6b3d: 0x48a08820, 0x6b3e: 0x447ff820, 0x6b3f: 0x44801020, + // Block 0x1ad, offset 0x6b40 + 0x6b40: 0x42ede820, 0x6b41: 0x48a1e620, 0x6b42: 0x48a1e420, 0x6b43: 0x48a23220, + 0x6b44: 0x48a26620, 0x6b45: 0x42ee3c20, 0x6b46: 0x42ee3e20, 0x6b47: 0x42ee3e20, + 0x6b48: 0x42ee9420, 0x6b49: 0x44807220, 0x6b4a: 0x42ef1620, 0x6b4b: 0x44808c20, + 0x6b4c: 0x44812c20, 0x6b4d: 0x48a83a20, 0x6b4e: 0x42f09c20, 0x6b4f: 0x42f11820, + 0x6b50: 0x42f19820, 0x6b51: 0x4481c620, 0x6b52: 0x48ac4c20, 0x6b53: 0x42f2ac20, + 0x6b54: 0x48ad3420, 0x6b55: 0x48ad8a20, 0x6b56: 0x42f31e20, 0x6b57: 0x42f3d620, + 0x6b58: 0x44825e20, 0x6b59: 0x42f48020, 0x6b5a: 0x42f49420, 0x6b5b: 0x42f49e20, + 0x6b5c: 0x48b2f820, 0x6b5d: 0x48b54e20, 0x6b5e: 0x48b54e20, 0x6b5f: 0x42f5dc20, + 0x6b60: 0x44840420, 0x6b61: 0x48b75620, 0x6b62: 0x42f78c20, 0x6b63: 0x42f79220, + 0x6b64: 0x44844e20, 0x6b65: 0x48b90020, 0x6b66: 0x42f9a420, 0x6b67: 0x44854020, + 0x6b68: 0x42f9d020, 0x6b69: 0x42f9c620, 0x6b6a: 0x42fa0020, 0x6b6b: 0x48bf0c20, + 0x6b6c: 0x42fac620, 0x6b6d: 0x44860220, 0x6b6e: 0x42fb8e20, 0x6b6f: 0x42fc0420, + 0x6b70: 0x42fc8a20, 0x6b71: 0x44866820, 0x6b72: 0x48c45020, 0x6b73: 0x48c48e20, + 0x6b74: 0x4486b220, 0x6b75: 0x48c5b220, 0x6b76: 0x42fef420, 0x6b77: 0x48c67c20, + 0x6b78: 0x42ff2a20, 0x6b79: 0x42fff420, 0x6b7a: 0x43000a20, 0x6b7b: 0x48c9b420, + 0x6b7c: 0x48ca4620, 0x6b7d: 0x4300c020, 0x6b7e: 0x48cb5020, 0x6b7f: 0x4300e020, + // Block 0x1ae, offset 0x6b80 + 0x6b80: 0x4866be20, 0x6b81: 0x4487aa20, 0x6b82: 0x43016420, 0x6b83: 0x43020620, + 0x6b84: 0x44881620, 0x6b85: 0x43027c20, 0x6b86: 0x42b56a20, 0x6b87: 0x48cf4e20, + 0x6b88: 0x48cf6a20, 0x6b89: 0x48672620, 0x6b8a: 0x48673820, 0x6b8b: 0x43040220, + 0x6b8c: 0x43040820, 0x6b8d: 0x431f3c20, 0x6b8e: 0x4488d620, 0x6b8f: 0x43052220, + 0x6b90: 0x43051620, 0x6b91: 0x43053a20, 0x6b92: 0x42a56620, 0x6b93: 0x43056220, + 0x6b94: 0x43056620, 0x6b95: 0x43057a20, 0x6b96: 0x4305cc20, 0x6b97: 0x48d67820, + 0x6b98: 0x4305ca20, 0x6b99: 0x43063a20, 0x6b9a: 0x4306c620, 0x6b9b: 0x43075a20, + 0x6b9c: 0x43064620, 0x6b9d: 0x43077a20, 0x6b9e: 0x4307ce20, 0x6b9f: 0x4308ae20, + 0x6ba0: 0x4306a620, 0x6ba1: 0x43079420, 0x6ba2: 0x43079820, 0x6ba3: 0x4307b820, + 0x6ba4: 0x48d86c20, 0x6ba5: 0x48dad620, 0x6ba6: 0x48d9aa20, 0x6ba7: 0x448a5620, + 0x6ba8: 0x4309e220, 0x6ba9: 0x4309e620, 0x6baa: 0x430a2c20, 0x6bab: 0x48e79420, + 0x6bac: 0x430ac820, 0x6bad: 0x48de5820, 0x6bae: 0x448aba20, 0x6baf: 0x448ac220, + 0x6bb0: 0x48df6220, 0x6bb1: 0x48e1a420, 0x6bb2: 0x448ad620, 0x6bb3: 0x430ca020, + 0x6bb4: 0x430cb820, 0x6bb5: 0x430cce20, 0x6bb6: 0x430cd220, 0x6bb7: 0x430d5220, + 0x6bb8: 0x430d1020, 0x6bb9: 0x430e1c20, 0x6bba: 0x430dc420, 0x6bbb: 0x430ef220, + 0x6bbc: 0x430e5020, 0x6bbd: 0x430ed620, 0x6bbe: 0x430f0c20, 0x6bbf: 0x448bae20, + // Block 0x1af, offset 0x6bc0 + 0x6bc0: 0x430fc220, 0x6bc1: 0x43100220, 0x6bc2: 0x448bf220, 0x6bc3: 0x4310c020, + 0x6bc4: 0x4310c620, 0x6bc5: 0x48ecce20, 0x6bc6: 0x4311ae20, 0x6bc7: 0x4311bc20, + 0x6bc8: 0x448c6a20, 0x6bc9: 0x4311f420, 0x6bca: 0x44697620, 0x6bcb: 0x48f15c20, + 0x6bcc: 0x48f2cc20, 0x6bcd: 0x448d7c20, 0x6bce: 0x448d8e20, 0x6bcf: 0x43154020, + 0x6bd0: 0x4315da20, 0x6bd1: 0x43171420, 0x6bd2: 0x4318aa20, 0x6bd3: 0x48f95020, + 0x6bd4: 0x43195620, 0x6bd5: 0x43198220, 0x6bd6: 0x431a3620, 0x6bd7: 0x431aee20, + 0x6bd8: 0x48fe5e20, 0x6bd9: 0x48100820, 0x6bda: 0x431b9620, 0x6bdb: 0x431b7820, + 0x6bdc: 0x431be020, 0x6bdd: 0x4811bc20, 0x6bde: 0x431da820, 0x6bdf: 0x431e7020, + 0x6be0: 0x490ba420, 0x6be1: 0x490bda20, 0x6be2: 0x43212820, 0x6be3: 0x4321e220, + 0x6be4: 0x43222220, 0x6be5: 0x490e5c20, 0x6be6: 0x43223620, 0x6be7: 0x43247020, + 0x6be8: 0x4325ae20, 0x6be9: 0x4325b020, 0x6bea: 0x4324f820, 0x6beb: 0x4327f220, + 0x6bec: 0x43282a20, 0x6bed: 0x4917f420, 0x6bee: 0x432b1620, 0x6bef: 0x44932a20, + 0x6bf0: 0x432b6e20, 0x6bf1: 0x491aee20, 0x6bf2: 0x4493cc20, 0x6bf3: 0x432d8620, + 0x6bf4: 0x42bb6420, 0x6bf5: 0x432e4620, 0x6bf6: 0x49228a20, 0x6bf7: 0x49243420, + 0x6bf8: 0x4494dc20, 0x6bf9: 0x4494ec20, 0x6bfa: 0x432fc020, 0x6bfb: 0x49281420, + 0x6bfc: 0x44956420, 0x6bfd: 0x49292c20, 0x6bfe: 0x43301620, 0x6bff: 0x43301620, + // Block 0x1b0, offset 0x6c00 + 0x6c00: 0x43305220, 0x6c01: 0x492b6c20, 0x6c02: 0x4331c420, 0x6c03: 0x44966620, + 0x6c04: 0x43325220, 0x6c05: 0x43334e20, 0x6c06: 0x43338420, 0x6c07: 0x4333fc20, + 0x6c08: 0x44979c20, 0x6c09: 0x49366020, 0x6c0a: 0x43362420, 0x6c0b: 0x43388020, + 0x6c0c: 0x4339fa20, 0x6c0d: 0x44999c20, 0x6c0e: 0x4499da20, 0x6c0f: 0x433ace20, + 0x6c10: 0x49419c20, 0x6c11: 0x4499f020, 0x6c12: 0x49420a20, 0x6c13: 0x49441c20, + 0x6c14: 0x49452220, 0x6c15: 0x433d7620, 0x6c16: 0x449aac20, 0x6c17: 0x433df220, + 0x6c18: 0x433dfc20, 0x6c19: 0x433e0a20, 0x6c1a: 0x433e1e20, 0x6c1b: 0x433e2c20, + 0x6c1c: 0x433e7620, 0x6c1d: 0x494c0020, + // Block 0x1b1, offset 0x6c40 + 0x6c41: 0xa0000000, + 0x6c60: 0xa0000000, 0x6c61: 0xa0000000, 0x6c62: 0xa0000000, 0x6c63: 0xa0000000, + 0x6c64: 0xa0000000, 0x6c65: 0xa0000000, 0x6c66: 0xa0000000, 0x6c67: 0xa0000000, + 0x6c68: 0xa0000000, 0x6c69: 0xa0000000, 0x6c6a: 0xa0000000, 0x6c6b: 0xa0000000, + 0x6c6c: 0xa0000000, 0x6c6d: 0xa0000000, 0x6c6e: 0xa0000000, 0x6c6f: 0xa0000000, + 0x6c70: 0xa0000000, 0x6c71: 0xa0000000, 0x6c72: 0xa0000000, 0x6c73: 0xa0000000, + 0x6c74: 0xa0000000, 0x6c75: 0xa0000000, 0x6c76: 0xa0000000, 0x6c77: 0xa0000000, + 0x6c78: 0xa0000000, 0x6c79: 0xa0000000, 0x6c7a: 0xa0000000, 0x6c7b: 0xa0000000, + 0x6c7c: 0xa0000000, 0x6c7d: 0xa0000000, 0x6c7e: 0xa0000000, 0x6c7f: 0xa0000000, + // Block 0x1b2, offset 0x6c80 + 0x6c80: 0xa0000000, 0x6c81: 0xa0000000, 0x6c82: 0xa0000000, 0x6c83: 0xa0000000, + 0x6c84: 0xa0000000, 0x6c85: 0xa0000000, 0x6c86: 0xa0000000, 0x6c87: 0xa0000000, + 0x6c88: 0xa0000000, 0x6c89: 0xa0000000, 0x6c8a: 0xa0000000, 0x6c8b: 0xa0000000, + 0x6c8c: 0xa0000000, 0x6c8d: 0xa0000000, 0x6c8e: 0xa0000000, 0x6c8f: 0xa0000000, + 0x6c90: 0xa0000000, 0x6c91: 0xa0000000, 0x6c92: 0xa0000000, 0x6c93: 0xa0000000, + 0x6c94: 0xa0000000, 0x6c95: 0xa0000000, 0x6c96: 0xa0000000, 0x6c97: 0xa0000000, + 0x6c98: 0xa0000000, 0x6c99: 0xa0000000, 0x6c9a: 0xa0000000, 0x6c9b: 0xa0000000, + 0x6c9c: 0xa0000000, 0x6c9d: 0xa0000000, 0x6c9e: 0xa0000000, 0x6c9f: 0xa0000000, + 0x6ca0: 0xa0000000, 0x6ca1: 0xa0000000, 0x6ca2: 0xa0000000, 0x6ca3: 0xa0000000, + 0x6ca4: 0xa0000000, 0x6ca5: 0xa0000000, 0x6ca6: 0xa0000000, 0x6ca7: 0xa0000000, + 0x6ca8: 0xa0000000, 0x6ca9: 0xa0000000, 0x6caa: 0xa0000000, 0x6cab: 0xa0000000, + 0x6cac: 0xa0000000, 0x6cad: 0xa0000000, 0x6cae: 0xa0000000, 0x6caf: 0xa0000000, + 0x6cb0: 0xa0000000, 0x6cb1: 0xa0000000, 0x6cb2: 0xa0000000, 0x6cb3: 0xa0000000, + 0x6cb4: 0xa0000000, 0x6cb5: 0xa0000000, 0x6cb6: 0xa0000000, 0x6cb7: 0xa0000000, + 0x6cb8: 0xa0000000, 0x6cb9: 0xa0000000, 0x6cba: 0xa0000000, 0x6cbb: 0xa0000000, + 0x6cbc: 0xa0000000, 0x6cbd: 0xa0000000, 0x6cbe: 0xa0000000, 0x6cbf: 0xa0000000, + // Block 0x1b3, offset 0x6cc0 + 0x6cc0: 0xa0000000, 0x6cc1: 0xa0000000, 0x6cc2: 0xa0000000, 0x6cc3: 0xa0000000, + 0x6cc4: 0xa0000000, 0x6cc5: 0xa0000000, 0x6cc6: 0xa0000000, 0x6cc7: 0xa0000000, + 0x6cc8: 0xa0000000, 0x6cc9: 0xa0000000, 0x6cca: 0xa0000000, 0x6ccb: 0xa0000000, + 0x6ccc: 0xa0000000, 0x6ccd: 0xa0000000, 0x6cce: 0xa0000000, 0x6ccf: 0xa0000000, + 0x6cd0: 0xa0000000, 0x6cd1: 0xa0000000, 0x6cd2: 0xa0000000, 0x6cd3: 0xa0000000, + 0x6cd4: 0xa0000000, 0x6cd5: 0xa0000000, 0x6cd6: 0xa0000000, 0x6cd7: 0xa0000000, + 0x6cd8: 0xa0000000, 0x6cd9: 0xa0000000, 0x6cda: 0xa0000000, 0x6cdb: 0xa0000000, + 0x6cdc: 0xa0000000, 0x6cdd: 0xa0000000, 0x6cde: 0xa0000000, 0x6cdf: 0xa0000000, + 0x6ce0: 0xa0000000, 0x6ce1: 0xa0000000, 0x6ce2: 0xa0000000, 0x6ce3: 0xa0000000, + 0x6ce4: 0xa0000000, 0x6ce5: 0xa0000000, 0x6ce6: 0xa0000000, 0x6ce7: 0xa0000000, + 0x6ce8: 0xa0000000, 0x6ce9: 0xa0000000, 0x6cea: 0xa0000000, 0x6ceb: 0xa0000000, + 0x6cec: 0xa0000000, 0x6ced: 0xa0000000, 0x6cee: 0xa0000000, 0x6cef: 0xa0000000, + // Block 0x1b4, offset 0x6d00 + 0x6d00: 0xa0000000, 0x6d01: 0xa0000000, 0x6d02: 0xa0000000, 0x6d03: 0xa0000000, + 0x6d04: 0xa0000000, 0x6d05: 0xa0000000, 0x6d06: 0xa0000000, 0x6d07: 0xa0000000, + 0x6d08: 0xa0000000, 0x6d09: 0x40020020, 0x6d0a: 0x40020220, 0x6d0b: 0x40020420, + 0x6d0c: 0x40020620, 0x6d0d: 0x40020820, 0x6d0e: 0xa0000000, 0x6d0f: 0xa0000000, + 0x6d10: 0xa0000000, 0x6d11: 0xa0000000, 0x6d12: 0xa0000000, 0x6d13: 0xa0000000, + 0x6d14: 0xa0000000, 0x6d15: 0xa0000000, 0x6d16: 0xa0000000, 0x6d17: 0xa0000000, + 0x6d18: 0xa0000000, 0x6d19: 0xa0000000, 0x6d1a: 0xa0000000, 0x6d1b: 0xa0000000, + 0x6d1c: 0xa0000000, 0x6d1d: 0xa0000000, 0x6d1e: 0xa0000000, 0x6d1f: 0xa0000000, + 0x6d20: 0x40021220, 0x6d21: 0x4002ba20, 0x6d22: 0x4003e020, 0x6d23: 0x4004ea20, + 0x6d24: 0x4027de20, 0x6d25: 0x4004ec20, 0x6d26: 0x4004e620, 0x6d27: 0x4003d220, + 0x6d28: 0x4003f420, 0x6d29: 0x4003f620, 0x6d2a: 0x4004d820, 0x6d2b: 0x40093820, + 0x6d2c: 0x40024020, 0x6d2d: 0x40021a20, 0x6d2e: 0x4002e420, 0x6d2f: 0x4004e220, + 0x6d30: 0x4029cc20, 0x6d31: 0x4029ce20, 0x6d32: 0x4029d020, 0x6d33: 0x4029d220, + 0x6d34: 0x4029d420, 0x6d35: 0x4029d620, 0x6d36: 0x4029d820, 0x6d37: 0x4029da20, + 0x6d38: 0x4029dc20, 0x6d39: 0x4029de20, 0x6d3a: 0x40026c20, 0x6d3b: 0x40026220, + 0x6d3c: 0x40094020, 0x6d3d: 0x40094220, 0x6d3e: 0x40094420, 0x6d3f: 0x4002c420, + // Block 0x1b5, offset 0x6d40 + 0x6d40: 0x4004d620, 0x6d41: 0x002bde88, 0x6d42: 0x002c0a88, 0x6d43: 0x002c3a88, + 0x6d44: 0x002c6288, 0x6d45: 0x002c1083, 0x6d46: 0x002d0888, 0x6d47: 0x002d2288, + 0x6d48: 0x0030e483, 0x6d49: 0x002c4083, 0x6d4a: 0x002dcc88, 0x6d4b: 0x002c3c83, + 0x6d4c: 0xc0030002, 0x6d4d: 0x002e8288, 0x6d4e: 0x002e9e88, 0x6d4f: 0x002d2483, + 0x6d50: 0x002f2c88, 0x6d51: 0x002c6483, 0x6d52: 0x002c6683, 0x6d53: 0x002c0e83, + 0x6d54: 0x002c0c83, 0x6d55: 0x00306c88, 0x6d56: 0x0030be88, 0x6d57: 0x0030e288, + 0x6d58: 0x002c3e83, 0x6d59: 0x00310088, 0x6d5a: 0x00312a88, 0x6d5b: 0x4003f820, + 0x6d5c: 0x4004e420, 0x6d5d: 0x4003fa20, 0x6d5e: 0x40062420, 0x6d5f: 0x40021620, + 0x6d60: 0x40061e20, 0x6d61: 0x402bde20, 0x6d62: 0x402c0a20, 0x6d63: 0x402c3a20, + 0x6d64: 0x402c6220, 0x6d65: 0x402c1020, 0x6d66: 0x402d0820, 0x6d67: 0x402d2220, + 0x6d68: 0x4030e420, 0x6d69: 0x402c4020, 0x6d6a: 0x402dcc20, 0x6d6b: 0x402c3c20, + 0x6d6c: 0xc0000002, 0x6d6d: 0x402e8220, 0x6d6e: 0x402e9e20, 0x6d6f: 0x402d2420, + 0x6d70: 0x402f2c20, 0x6d71: 0x402c6420, 0x6d72: 0x402c6620, 0x6d73: 0x402c0e20, + 0x6d74: 0x402c0c20, 0x6d75: 0x40306c20, 0x6d76: 0x4030be20, 0x6d77: 0x4030e220, + 0x6d78: 0x402c3e20, 0x6d79: 0x40310020, 0x6d7a: 0x40312a20, 0x6d7b: 0x4003fc20, + 0x6d7c: 0x40094820, 0x6d7d: 0x4003fe20, 0x6d7e: 0x40094c20, 0x6d7f: 0xa0000000, + // Block 0x1b6, offset 0x6d80 + 0x6d80: 0xe00008f5, 0x6d81: 0xe00008ef, 0x6d82: 0xe0000921, 0x6d83: 0xe0000969, + 0x6d84: 0xe000095b, 0x6d85: 0xe000094d, 0x6d86: 0xe00009dd, 0x6d87: 0xe0000a53, + 0x6d88: 0xe000256e, 0x6d89: 0xe0002568, 0x6d8a: 0xe000257a, 0x6d8b: 0xe00025a6, + 0x6d8c: 0xe000263e, 0x6d8d: 0xe0002638, 0x6d8e: 0xe000264a, 0x6d8f: 0xe0002656, + 0x6d90: 0xe0000ab3, 0x6d91: 0xe0000d63, 0x6d92: 0xe00026db, 0x6d93: 0xe00026d5, + 0x6d94: 0xe00026e7, 0x6d95: 0xe0002727, 0x6d96: 0xe0002713, 0x6d97: 0x40093e20, + 0x6d98: 0xe0000e12, 0x6d99: 0xe0000fe1, 0x6d9a: 0xe0000fdb, 0x6d9b: 0xe0000fed, + 0x6d9c: 0xe0000fff, 0x6d9d: 0xe0001102, 0x6d9e: 0x00318888, 0x6d9f: 0xe0000f7b, + 0x6da0: 0xe00008f2, 0x6da1: 0xe00008ec, 0x6da2: 0xe000091e, 0x6da3: 0xe0000966, + 0x6da4: 0xe0000958, 0x6da5: 0xe000094a, 0x6da6: 0xe00009d5, 0x6da7: 0xe0000a4d, + 0x6da8: 0xe000256b, 0x6da9: 0xe0002565, 0x6daa: 0xe0002577, 0x6dab: 0xe00025a3, + 0x6dac: 0xe000263b, 0x6dad: 0xe0002635, 0x6dae: 0xe0002647, 0x6daf: 0xe0002653, + 0x6db0: 0xe0000aad, 0x6db1: 0xe0000d60, 0x6db2: 0xe00026d8, 0x6db3: 0xe00026d2, + 0x6db4: 0xe00026e4, 0x6db5: 0xe0002724, 0x6db6: 0xe0002710, 0x6db7: 0x40093c20, + 0x6db8: 0xe0000e0f, 0x6db9: 0xe0000fde, 0x6dba: 0xe0000fd8, 0x6dbb: 0xe0000fea, + 0x6dbc: 0xe0000ffc, 0x6dbd: 0xe00010ff, 0x6dbe: 0x40318820, 0x6dbf: 0xe0001114, + // Block 0x1b7, offset 0x6dc0 + 0x6dc0: 0xe0000983, 0x6dc1: 0xe0000980, 0x6dc2: 0xe00008fb, 0x6dc3: 0xe00008f8, + 0x6dc4: 0xe000097d, 0x6dc5: 0xe000097a, 0x6dc6: 0xe0000a38, 0x6dc7: 0xe0000a35, + 0x6dc8: 0xe0000a3e, 0x6dc9: 0xe0000a3b, 0x6dca: 0xe0000a4a, 0x6dcb: 0xe0000a47, + 0x6dcc: 0xe0000a44, 0x6dcd: 0xe0000a41, 0x6dce: 0xe0000a86, 0x6dcf: 0xe0000a83, + 0x6dd0: 0xe0000aaa, 0x6dd1: 0xe0000aa7, 0x6dd2: 0xe00025cc, 0x6dd3: 0xe00025c9, + 0x6dd4: 0xe0002574, 0x6dd5: 0xe0002571, 0x6dd6: 0xe00025b2, 0x6dd7: 0xe00025af, + 0x6dd8: 0xe00025c6, 0x6dd9: 0xe00025c3, 0x6dda: 0xe00025a0, 0x6ddb: 0xe000259d, + 0x6ddc: 0xe0000bb8, 0x6ddd: 0xe0000bb5, 0x6dde: 0xe0000bb2, 0x6ddf: 0xe0000baf, + 0x6de0: 0xe0000bc4, 0x6de1: 0xe0000bc1, 0x6de2: 0xe0000bca, 0x6de3: 0xe0000bc7, + 0x6de4: 0xe0002856, 0x6de5: 0xe0002853, 0x6de6: 0xe0000c1b, 0x6de7: 0xe0000c18, + 0x6de8: 0xe0002664, 0x6de9: 0xe0002661, 0x6dea: 0xe0002673, 0x6deb: 0xe0002670, + 0x6dec: 0xe0002644, 0x6ded: 0xe0002641, 0x6dee: 0xe000266d, 0x6def: 0xe000266a, + 0x6df0: 0xe0002667, 0x6df1: 0x402da220, 0x6df2: 0xe00027e2, 0x6df3: 0xe00027df, + 0x6df4: 0xe0000c8a, 0x6df5: 0xe0000c87, 0x6df6: 0xe000261a, 0x6df7: 0xe0002617, + 0x6df8: 0x402f7220, 0x6df9: 0xe0000ccc, 0x6dfa: 0xe0000cc9, 0x6dfb: 0xe0000cd8, + 0x6dfc: 0xe0000cd5, 0x6dfd: 0xe0000cd2, 0x6dfe: 0xe0000ccf, 0x6dff: 0xe0000d04, + // Block 0x1b8, offset 0x6e00 + 0x6e00: 0xe0000cfe, 0x6e01: 0xe0000cf8, 0x6e02: 0xe0000cf5, 0x6e03: 0xe0000d51, + 0x6e04: 0xe0000d4e, 0x6e05: 0xe0000d6f, 0x6e06: 0xe0000d6c, 0x6e07: 0xe0000d5d, + 0x6e08: 0xe0000d5a, 0x6e09: 0xf0000404, 0x6e0a: 0x002eda88, 0x6e0b: 0x402eda20, + 0x6e0c: 0xe0002761, 0x6e0d: 0xe000275e, 0x6e0e: 0xe00026e1, 0x6e0f: 0xe00026de, + 0x6e10: 0xe0002721, 0x6e11: 0xe000271e, 0x6e12: 0xe0000e93, 0x6e13: 0xe0000e8f, + 0x6e14: 0xe0002697, 0x6e15: 0xe0002694, 0x6e16: 0xe00026a9, 0x6e17: 0xe00026a6, + 0x6e18: 0xe000269d, 0x6e19: 0xe000269a, 0x6e1a: 0xe0002526, 0x6e1b: 0xe0002523, + 0x6e1c: 0xe0002534, 0x6e1d: 0xe0002531, 0x6e1e: 0xe000254e, 0x6e1f: 0xe000254b, + 0x6e20: 0xe000253a, 0x6e21: 0xe0002537, 0x6e22: 0xe0002508, 0x6e23: 0xe0002505, + 0x6e24: 0xe00024f9, 0x6e25: 0xe00024f6, 0x6e26: 0x00303688, 0x6e27: 0x40303620, + 0x6e28: 0xe000102b, 0x6e29: 0xe0001028, 0x6e2a: 0xe000103f, 0x6e2b: 0xe000103c, + 0x6e2c: 0xe0000fe7, 0x6e2d: 0xe0000fe4, 0x6e2e: 0xe0000ff9, 0x6e2f: 0xe0000ff6, + 0x6e30: 0xe0001025, 0x6e31: 0xe0001022, 0x6e32: 0xe0001039, 0x6e33: 0xe0001036, + 0x6e34: 0xe00010d8, 0x6e35: 0xe00010d5, 0x6e36: 0xe000110e, 0x6e37: 0xe000110b, + 0x6e38: 0xe0001117, 0x6e39: 0xe000113b, 0x6e3a: 0xe0001138, 0x6e3b: 0xe000114d, + 0x6e3c: 0xe000114a, 0x6e3d: 0xe0001147, 0x6e3e: 0xe0001144, 0x6e3f: 0xe0000f64, + // Block 0x1b9, offset 0x6e40 + 0x6e40: 0x402c1a20, 0x6e41: 0x002c2a88, 0x6e42: 0x002c3288, 0x6e43: 0x402c3220, + 0x6e44: 0x0031c488, 0x6e45: 0x4031c420, 0x6e46: 0x002efa88, 0x6e47: 0x002c4e88, + 0x6e48: 0x402c4e20, 0x6e49: 0x002c7288, 0x6e4a: 0x002c7a88, 0x6e4b: 0x002c8488, + 0x6e4c: 0x402c8420, 0x6e4d: 0xe000115c, 0x6e4e: 0x002cae88, 0x6e4f: 0x002cb888, + 0x6e50: 0x002cc288, 0x6e51: 0x002d1688, 0x6e52: 0x402d1620, 0x6e53: 0x002d4488, + 0x6e54: 0x002d5888, 0x6e55: 0x402d7820, 0x6e56: 0x002dc288, 0x6e57: 0x002db688, + 0x6e58: 0x002e0a88, 0x6e59: 0x402e0a20, 0x6e5a: 0x402e3820, 0x6e5b: 0x402e7220, + 0x6e5c: 0x0030a088, 0x6e5d: 0x002eb488, 0x6e5e: 0x402ebc20, 0x6e5f: 0x002f1088, + 0x6e60: 0xe0002789, 0x6e61: 0xe0002786, 0x6e62: 0x002d6088, 0x6e63: 0x402d6020, + 0x6e64: 0x002f3e88, 0x6e65: 0x402f3e20, 0x6e66: 0x002f8288, 0x6e67: 0x0031b488, + 0x6e68: 0x4031b420, 0x6e69: 0x00300888, 0x6e6a: 0x40301220, 0x6e6b: 0x40304220, + 0x6e6c: 0x00304a88, 0x6e6d: 0x40304a20, 0x6e6e: 0x00305288, 0x6e6f: 0xe000105f, + 0x6e70: 0xe000105c, 0x6e71: 0x0030b488, 0x6e72: 0x0030cc88, 0x6e73: 0x00311888, + 0x6e74: 0x40311820, 0x6e75: 0x00313488, 0x6e76: 0x40313420, 0x6e77: 0x00316488, + 0x6e78: 0x00316e88, 0x6e79: 0x40316e20, 0x6e7a: 0x40317820, 0x6e7b: 0x4031a620, + 0x6e7c: 0x0031bc88, 0x6e7d: 0x4031bc20, 0x6e7e: 0xe0000fc9, 0x6e7f: 0x40319420, + // Block 0x1ba, offset 0x6e80 + 0x6e80: 0x40321220, 0x6e81: 0x40321a20, 0x6e82: 0x40322220, 0x6e83: 0x40322a20, + 0x6e84: 0xe0000ad5, 0x6e85: 0xe0000ad1, 0x6e86: 0xe0000acd, 0x6e87: 0xf0000a0a, + 0x6e88: 0xf000040a, 0x6e89: 0xf0000404, 0x6e8a: 0xf0000a0a, 0x6e8b: 0xf000040a, + 0x6e8c: 0xf0000404, 0x6e8d: 0xe0000947, 0x6e8e: 0xe0000944, 0x6e8f: 0xe0002650, + 0x6e90: 0xe000264d, 0x6e91: 0xe000270d, 0x6e92: 0xe000270a, 0x6e93: 0xe0000ff3, + 0x6e94: 0xe0000ff0, 0x6e95: 0xe000101e, 0x6e96: 0xe000101a, 0x6e97: 0xe0001006, + 0x6e98: 0xe0001002, 0x6e99: 0xe0001016, 0x6e9a: 0xe0001012, 0x6e9b: 0xe000100e, + 0x6e9c: 0xe000100a, 0x6e9d: 0x402cae20, 0x6e9e: 0xe0000962, 0x6e9f: 0xe000095e, + 0x6ea0: 0xe0000976, 0x6ea1: 0xe0000972, 0x6ea2: 0xe00009f4, 0x6ea3: 0xe00009ef, + 0x6ea4: 0x002d3a88, 0x6ea5: 0x402d3a20, 0x6ea6: 0xe0000bbe, 0x6ea7: 0xe0000bbb, + 0x6ea8: 0xe0002614, 0x6ea9: 0xe0002611, 0x6eaa: 0xe0002753, 0x6eab: 0xe0002750, + 0x6eac: 0xe000275a, 0x6ead: 0xe0002756, 0x6eae: 0xe0001162, 0x6eaf: 0xe000115f, + 0x6eb0: 0xe0000c8d, 0x6eb1: 0xf0000a0a, 0x6eb2: 0xf000040a, 0x6eb3: 0xf0000404, + 0x6eb4: 0xe0000bac, 0x6eb5: 0xe0000ba9, 0x6eb6: 0x002d7888, 0x6eb7: 0x00319488, + 0x6eb8: 0xe0000d57, 0x6eb9: 0xe0000d54, 0x6eba: 0xe0000954, 0x6ebb: 0xe0000950, + 0x6ebc: 0xe00009ea, 0x6ebd: 0xe00009e5, 0x6ebe: 0xe0000e19, 0x6ebf: 0xe0000e15, + // Block 0x1bb, offset 0x6ec0 + 0x6ec0: 0xe000098f, 0x6ec1: 0xe000098c, 0x6ec2: 0xe0000995, 0x6ec3: 0xe0000992, + 0x6ec4: 0xe00025e8, 0x6ec5: 0xe00025e5, 0x6ec6: 0xe00025ee, 0x6ec7: 0xe00025eb, + 0x6ec8: 0xe000267f, 0x6ec9: 0xe000267c, 0x6eca: 0xe0002685, 0x6ecb: 0xe0002682, + 0x6ecc: 0xe000277d, 0x6ecd: 0xe000277a, 0x6ece: 0xe0002783, 0x6ecf: 0xe0002780, + 0x6ed0: 0xe00026af, 0x6ed1: 0xe00026ac, 0x6ed2: 0xe00026b5, 0x6ed3: 0xe00026b2, + 0x6ed4: 0xe0001053, 0x6ed5: 0xe0001050, 0x6ed6: 0xe0001059, 0x6ed7: 0xe0001056, + 0x6ed8: 0xe0002562, 0x6ed9: 0xe000255f, 0x6eda: 0xe0002514, 0x6edb: 0xe0002511, + 0x6edc: 0x00312288, 0x6edd: 0x40312220, 0x6ede: 0xe000285c, 0x6edf: 0xe0002859, + 0x6ee0: 0x002ebc88, 0x6ee1: 0x402c8c20, 0x6ee2: 0x002f2288, 0x6ee3: 0x402f2220, + 0x6ee4: 0x00314088, 0x6ee5: 0x40314020, 0x6ee6: 0xe000096f, 0x6ee7: 0xe000096c, + 0x6ee8: 0xe00025b8, 0x6ee9: 0xe00025b5, 0x6eea: 0xe000271a, 0x6eeb: 0xe0002716, + 0x6eec: 0xe000273e, 0x6eed: 0xe000273a, 0x6eee: 0xe0002745, 0x6eef: 0xe0002742, + 0x6ef0: 0xe000274c, 0x6ef1: 0xe0002748, 0x6ef2: 0xe0001129, 0x6ef3: 0xe0001126, + 0x6ef4: 0x402e5e20, 0x6ef5: 0x402ed020, 0x6ef6: 0x40305a20, 0x6ef7: 0x402dd420, + 0x6ef8: 0xe0000abf, 0x6ef9: 0xe0000ec4, 0x6efa: 0x002be888, 0x6efb: 0x002c4488, + 0x6efc: 0x402c4420, 0x6efd: 0x002e3888, 0x6efe: 0x00303e88, 0x6eff: 0x402ffc20, + // Block 0x1bc, offset 0x6f00 + 0x6f00: 0xe00009b1, 0x6f01: 0xe00009ae, 0x6f02: 0xe0000a22, 0x6f03: 0xe0000a1f, + 0x6f04: 0xe0000a28, 0x6f05: 0xe0000a25, 0x6f06: 0xe0000a2e, 0x6f07: 0xe0000a2b, + 0x6f08: 0xe0000a5a, 0x6f09: 0xe0000a56, 0x6f0a: 0xe0000a8c, 0x6f0b: 0xe0000a89, + 0x6f0c: 0xe0000a98, 0x6f0d: 0xe0000a95, 0x6f0e: 0xe0000aa4, 0x6f0f: 0xe0000aa1, + 0x6f10: 0xe0000a92, 0x6f11: 0xe0000a8f, 0x6f12: 0xe0000a9e, 0x6f13: 0xe0000a9b, + 0x6f14: 0xe00025db, 0x6f15: 0xe00025d7, 0x6f16: 0xe00025d3, 0x6f17: 0xe00025cf, + 0x6f18: 0xe0002602, 0x6f19: 0xe00025ff, 0x6f1a: 0xe0002608, 0x6f1b: 0xe0002605, + 0x6f1c: 0xe00025bf, 0x6f1d: 0xe00025bb, 0x6f1e: 0xe0000b8c, 0x6f1f: 0xe0000b89, + 0x6f20: 0xe0000bd0, 0x6f21: 0xe0000bcd, 0x6f22: 0xe0002868, 0x6f23: 0xe0002865, + 0x6f24: 0xe0002874, 0x6f25: 0xe0002871, 0x6f26: 0xe0002862, 0x6f27: 0xe000285f, + 0x6f28: 0xe000286e, 0x6f29: 0xe000286b, 0x6f2a: 0xe000287a, 0x6f2b: 0xe0002877, + 0x6f2c: 0xe0002691, 0x6f2d: 0xe000268e, 0x6f2e: 0xe000265d, 0x6f2f: 0xe0002659, + 0x6f30: 0xe000260e, 0x6f31: 0xe000260b, 0x6f32: 0xe0002620, 0x6f33: 0xe000261d, + 0x6f34: 0xe0002626, 0x6f35: 0xe0002623, 0x6f36: 0xe0000cde, 0x6f37: 0xe0000cdb, + 0x6f38: 0xe0000ce5, 0x6f39: 0xe0000ce1, 0x6f3a: 0xe0000cf2, 0x6f3b: 0xe0000cef, + 0x6f3c: 0xe0000cec, 0x6f3d: 0xe0000ce9, 0x6f3e: 0xe0000d1e, 0x6f3f: 0xe0000d1b, + // Block 0x1bd, offset 0x6f40 + 0x6f40: 0xe0000d24, 0x6f41: 0xe0000d21, 0x6f42: 0xe0000d2a, 0x6f43: 0xe0000d27, + 0x6f44: 0xe0000d69, 0x6f45: 0xe0000d66, 0x6f46: 0xe0000d7b, 0x6f47: 0xe0000d78, + 0x6f48: 0xe0000d87, 0x6f49: 0xe0000d84, 0x6f4a: 0xe0000d81, 0x6f4b: 0xe0000d7e, + 0x6f4c: 0xe000272e, 0x6f4d: 0xe000272a, 0x6f4e: 0xe0002736, 0x6f4f: 0xe0002732, + 0x6f50: 0xe0002770, 0x6f51: 0xe000276c, 0x6f52: 0xe0002768, 0x6f53: 0xe0002764, + 0x6f54: 0xe0000ea7, 0x6f55: 0xe0000ea4, 0x6f56: 0xe0000ead, 0x6f57: 0xe0000eaa, + 0x6f58: 0xe00026a3, 0x6f59: 0xe00026a0, 0x6f5a: 0xe00026bb, 0x6f5b: 0xe00026b8, + 0x6f5c: 0xe00026c2, 0x6f5d: 0xe00026be, 0x6f5e: 0xe00026c9, 0x6f5f: 0xe00026c6, + 0x6f60: 0xe0002548, 0x6f61: 0xe0002545, 0x6f62: 0xe0002554, 0x6f63: 0xe0002551, + 0x6f64: 0xe000252d, 0x6f65: 0xe0002529, 0x6f66: 0xe0002541, 0x6f67: 0xe000253d, + 0x6f68: 0xe000255b, 0x6f69: 0xe0002557, 0x6f6a: 0xe0002502, 0x6f6b: 0xe00024ff, + 0x6f6c: 0xe000250e, 0x6f6d: 0xe000250b, 0x6f6e: 0xe0002520, 0x6f6f: 0xe000251d, + 0x6f70: 0xe000251a, 0x6f71: 0xe0002517, 0x6f72: 0xe0001093, 0x6f73: 0xe0001090, + 0x6f74: 0xe000109f, 0x6f75: 0xe000109c, 0x6f76: 0xe0001099, 0x6f77: 0xe0001096, + 0x6f78: 0xe0001032, 0x6f79: 0xe000102e, 0x6f7a: 0xe0001046, 0x6f7b: 0xe0001042, + 0x6f7c: 0xe00010a9, 0x6f7d: 0xe00010a6, 0x6f7e: 0xe00010af, 0x6f7f: 0xe00010ac, + // Block 0x1be, offset 0x6f80 + 0x6f80: 0xe00010d2, 0x6f81: 0xe00010cf, 0x6f82: 0xe00010cc, 0x6f83: 0xe00010c9, + 0x6f84: 0xe00010e1, 0x6f85: 0xe00010de, 0x6f86: 0xe00010e7, 0x6f87: 0xe00010e4, + 0x6f88: 0xe00010ed, 0x6f89: 0xe00010ea, 0x6f8a: 0xe0002632, 0x6f8b: 0xe000262f, + 0x6f8c: 0xe000262c, 0x6f8d: 0xe0002629, 0x6f8e: 0xe0001123, 0x6f8f: 0xe0001120, + 0x6f90: 0xe0001141, 0x6f91: 0xe000113e, 0x6f92: 0xe0001153, 0x6f93: 0xe0001150, + 0x6f94: 0xe0001159, 0x6f95: 0xe0001156, 0x6f96: 0xe000287d, 0x6f97: 0xe00024fc, + 0x6f98: 0xe00010db, 0x6f99: 0xe0001111, 0x6f9a: 0xf0000404, 0x6f9b: 0xe0000f70, + 0x6f9c: 0x40300420, 0x6f9d: 0x40300620, 0x6f9e: 0xe0000f7f, 0x6f9f: 0x402c9620, + 0x6fa0: 0xe000099b, 0x6fa1: 0xe0000998, 0x6fa2: 0xe0000989, 0x6fa3: 0xe0000986, + 0x6fa4: 0xe0000928, 0x6fa5: 0xe0000924, 0x6fa6: 0xe0000930, 0x6fa7: 0xe000092c, + 0x6fa8: 0xe0000940, 0x6fa9: 0xe000093c, 0x6faa: 0xe0000938, 0x6fab: 0xe0000934, + 0x6fac: 0xe00009aa, 0x6fad: 0xe00009a6, 0x6fae: 0xe0000902, 0x6faf: 0xe00008fe, + 0x6fb0: 0xe000090a, 0x6fb1: 0xe0000906, 0x6fb2: 0xe000091a, 0x6fb3: 0xe0000916, + 0x6fb4: 0xe0000912, 0x6fb5: 0xe000090e, 0x6fb6: 0xe00009a2, 0x6fb7: 0xe000099e, + 0x6fb8: 0xe00025f4, 0x6fb9: 0xe00025f1, 0x6fba: 0xe00025e2, 0x6fbb: 0xe00025df, + 0x6fbc: 0xe00025ac, 0x6fbd: 0xe00025a9, 0x6fbe: 0xe0002581, 0x6fbf: 0xe000257d, + // Block 0x1bf, offset 0x6fc0 + 0x6fc0: 0xe0002589, 0x6fc1: 0xe0002585, 0x6fc2: 0xe0002599, 0x6fc3: 0xe0002595, + 0x6fc4: 0xe0002591, 0x6fc5: 0xe000258d, 0x6fc6: 0xe00025fb, 0x6fc7: 0xe00025f7, + 0x6fc8: 0xe0002679, 0x6fc9: 0xe0002676, 0x6fca: 0xe000268b, 0x6fcb: 0xe0002688, + 0x6fcc: 0xe00027b7, 0x6fcd: 0xe00027b4, 0x6fce: 0xe0002777, 0x6fcf: 0xe0002774, + 0x6fd0: 0xe00026ee, 0x6fd1: 0xe00026ea, 0x6fd2: 0xe00026f6, 0x6fd3: 0xe00026f2, + 0x6fd4: 0xe0002706, 0x6fd5: 0xe0002702, 0x6fd6: 0xe00026fe, 0x6fd7: 0xe00026fa, + 0x6fd8: 0xe00027be, 0x6fd9: 0xe00027ba, 0x6fda: 0xe0002790, 0x6fdb: 0xe000278c, + 0x6fdc: 0xe0002798, 0x6fdd: 0xe0002794, 0x6fde: 0xe00027a8, 0x6fdf: 0xe00027a4, + 0x6fe0: 0xe00027a0, 0x6fe1: 0xe000279c, 0x6fe2: 0xe00027b0, 0x6fe3: 0xe00027ac, + 0x6fe4: 0xe000108d, 0x6fe5: 0xe000108a, 0x6fe6: 0xe000104d, 0x6fe7: 0xe000104a, + 0x6fe8: 0xe0001066, 0x6fe9: 0xe0001062, 0x6fea: 0xe000106e, 0x6feb: 0xe000106a, + 0x6fec: 0xe000107e, 0x6fed: 0xe000107a, 0x6fee: 0xe0001076, 0x6fef: 0xe0001072, + 0x6ff0: 0xe0001086, 0x6ff1: 0xe0001082, 0x6ff2: 0xe0001108, 0x6ff3: 0xe0001105, + 0x6ff4: 0xe0001135, 0x6ff5: 0xe0001132, 0x6ff6: 0xe000112f, 0x6ff7: 0xe000112c, + 0x6ff8: 0xe000111d, 0x6ff9: 0xe000111a, 0x6ffa: 0xe0000d0a, 0x6ffb: 0xe0000d07, + 0x6ffc: 0x0030d888, 0x6ffd: 0x4030d820, 0x6ffe: 0x00312088, 0x6fff: 0x40312020, + // Block 0x1c0, offset 0x7000 + 0x7000: 0xe00009bc, 0x7001: 0xe00009c0, 0x7002: 0x002c3a8b, 0x7003: 0xf0000a04, + 0x7004: 0x40081c20, 0x7005: 0xe0000a5e, 0x7006: 0xe0000a62, 0x7007: 0x002cc28a, + 0x7008: 0x40081e20, 0x7009: 0xf0000a04, 0x700a: 0x002d2285, 0x700b: 0x002d688b, + 0x700c: 0x002d688b, 0x700d: 0x002d688b, 0x700e: 0x002d6885, 0x700f: 0xf0000202, + 0x7010: 0x002d9a8b, 0x7011: 0x002d9a8b, 0x7012: 0x002e228b, 0x7013: 0x002e2285, + 0x7014: 0x40082020, 0x7015: 0x002e9e8b, 0x7016: 0xe000281e, 0x7017: 0x40082220, + 0x7018: 0x40082420, 0x7019: 0x002f2c8b, 0x701a: 0x002f568b, 0x701b: 0x002f7a8b, + 0x701c: 0x002f7a8b, 0x701d: 0x002f7a8b, 0x701e: 0x40082620, 0x701f: 0x40082820, + 0x7020: 0xe0002833, 0x7021: 0xe0000fbd, 0x7022: 0xe0002842, 0x7023: 0x40082a20, + 0x7024: 0x00312a8b, 0x7025: 0x40082c20, 0x7026: 0x0032a288, 0x7027: 0x40082e20, + 0x7028: 0x00312a8b, 0x7029: 0x40083020, 0x702a: 0x002c3c83, 0x702b: 0xe000094d, + 0x702c: 0x002c0a8b, 0x702d: 0x002c3a8b, 0x702e: 0x40083220, 0x702f: 0x002c9885, + 0x7030: 0x002c988b, 0x7031: 0x002d088b, 0x7032: 0x002d1e88, 0x7033: 0x002e828b, + 0x7034: 0x002ee285, 0x7035: 0x00389084, 0x7036: 0x00389284, 0x7037: 0x00389484, + 0x7038: 0x00389684, 0x7039: 0x002d9a85, 0x703a: 0x40083420, 0x703b: 0xe0000b95, + 0x703c: 0x00327e85, 0x703d: 0x00325685, 0x703e: 0x0032568b, 0x703f: 0x00327e8b, + // Block 0x1c1, offset 0x7040 + 0x7040: 0x00093685, 0x7041: 0x40083620, 0x7042: 0x40083820, 0x7043: 0x40083a20, + 0x7044: 0x40083c20, 0x7045: 0x002c628b, 0x7046: 0x002c6285, 0x7047: 0x002c9885, + 0x7048: 0x002d9a85, 0x7049: 0x002dcc85, 0x704a: 0x40083e20, 0x704b: 0x400a6e20, + 0x704c: 0x40084020, 0x704d: 0xe00009c4, 0x704e: 0x402d1e20, 0x704f: 0x40084220, + 0x7050: 0xe00002cb, 0x7051: 0xe00002d3, 0x7052: 0xe00002b2, 0x7053: 0xe00002bb, + 0x7054: 0xe00003cd, 0x7055: 0xe00002c3, 0x7056: 0xe00003d1, 0x7057: 0xe00004ab, + 0x7058: 0xe0000579, 0x7059: 0xe00002c7, 0x705a: 0xe0000640, 0x705b: 0xe00002cf, + 0x705c: 0xe00004af, 0x705d: 0xe0000644, 0x705e: 0xe0000798, 0x705f: 0xf0001e1e, + 0x7060: 0x002d9a8a, 0x7061: 0xe00027d4, 0x7062: 0xe00027db, 0x7063: 0xe00027ee, + 0x7064: 0x0030be8a, 0x7065: 0xe0002848, 0x7066: 0xe000284f, 0x7067: 0xe00010bb, + 0x7068: 0xe00027f4, 0x7069: 0x0030f68a, 0x706a: 0xe0002883, 0x706b: 0xe000288a, + 0x706c: 0x002e228a, 0x706d: 0x002c3a8a, 0x706e: 0x002c628a, 0x706f: 0x002e828a, + 0x7070: 0x002d9a84, 0x7071: 0xe00027d1, 0x7072: 0xe00027d7, 0x7073: 0xe00027eb, + 0x7074: 0x0030be84, 0x7075: 0xe0002845, 0x7076: 0xe000284b, 0x7077: 0xe00010b6, + 0x7078: 0xe00027f1, 0x7079: 0x0030f684, 0x707a: 0xe0002880, 0x707b: 0xe0002886, + 0x707c: 0x002e2284, 0x707d: 0x002c3a84, 0x707e: 0x002c6284, 0x707f: 0x002e8284, + // Block 0x1c2, offset 0x7080 + 0x7080: 0xe0000024, 0x7081: 0xe0000029, 0x7082: 0xe000002e, 0x7083: 0xe0000033, + 0x7084: 0xe0000038, 0x7085: 0xe000003d, 0x7086: 0xe0000042, 0x7087: 0xe0000047, + 0x7088: 0xf0001f04, 0x7089: 0xf0001f04, 0x708a: 0xf0001f04, 0x708b: 0xf0001f04, + 0x708c: 0xf0001f04, 0x708d: 0xf0001f04, 0x708e: 0xf0001f04, 0x708f: 0xf0001f04, + 0x7090: 0xf0001f04, 0x7091: 0xf0000404, 0x7092: 0xf0000404, 0x7093: 0xf0000404, + 0x7094: 0xf0000404, 0x7095: 0xf0000404, 0x7096: 0xf0000404, 0x7097: 0xf0000404, + 0x7098: 0xf0000404, 0x7099: 0xf0000404, 0x709a: 0xf0000404, 0x709b: 0xf0000404, + 0x709c: 0xf0000404, 0x709d: 0xf0000404, 0x709e: 0xf0000404, 0x709f: 0xf0000404, + 0x70a0: 0xe000249f, 0x70a1: 0xf0000404, 0x70a2: 0xf0000404, 0x70a3: 0xe00024a7, + 0x70a4: 0xe00024af, 0x70a5: 0xf0000404, 0x70a6: 0xe00024b7, 0x70a7: 0xf0000404, + 0x70a8: 0xf0000404, 0x70a9: 0xf0000404, 0x70aa: 0xe00024bf, 0x70ab: 0xf0000404, + 0x70ac: 0xe00024c7, 0x70ad: 0xe00024cf, 0x70ae: 0xe00024d7, 0x70af: 0xe00024df, + 0x70b0: 0xf0000404, 0x70b1: 0xf0000404, 0x70b2: 0xf0000404, 0x70b3: 0xe00024e7, + 0x70b4: 0xf0000404, 0x70b5: 0xf0000404, 0x70b6: 0x002bde8c, 0x70b7: 0x002c0a8c, + 0x70b8: 0x002c3a8c, 0x70b9: 0x002c628c, 0x70ba: 0x002c988c, 0x70bb: 0x002d088c, + 0x70bc: 0x002d228c, 0x70bd: 0x002d688c, 0x70be: 0x002d9a8c, 0x70bf: 0x002dcc8c, + // Block 0x1c3, offset 0x70c0 + 0x70c0: 0xf0001f04, 0x70c1: 0xf0001f04, 0x70c2: 0xf0001f04, 0x70c3: 0xf0001f04, + 0x70c4: 0xf0001f04, 0x70c5: 0xf0001f04, 0x70c6: 0xf0001f04, 0x70c7: 0xf0001f04, + 0x70c8: 0xf0001f04, 0x70c9: 0xf0000404, 0x70ca: 0xf0000404, 0x70cb: 0xf0000404, + 0x70cc: 0xe00027c5, 0x70cd: 0xe0000b85, 0x70ce: 0xe00026cc, 0x70cf: 0xe0000d14, + 0x70d0: 0x00657693, 0x70d1: 0x00657893, 0x70d2: 0x00657a93, 0x70d3: 0x00657e93, + 0x70d4: 0x00658093, 0x70d5: 0x00658293, 0x70d6: 0x00658493, 0x70d7: 0x00658693, + 0x70d8: 0x00658893, 0x70d9: 0x00658a93, 0x70da: 0x00658c93, 0x70db: 0x00658e93, + 0x70dc: 0x00659093, 0x70dd: 0x00659293, 0x70de: 0x00659493, 0x70df: 0x00659693, + 0x70e0: 0x00659893, 0x70e1: 0x00659a93, 0x70e2: 0x00659c93, 0x70e3: 0x00659e93, + 0x70e4: 0x0065a093, 0x70e5: 0x0065a293, 0x70e6: 0x0065a493, 0x70e7: 0x0065a693, + 0x70e8: 0x0065a893, 0x70e9: 0x0065aa93, 0x70ea: 0x0065ac93, 0x70eb: 0x0065ae93, + 0x70ec: 0x0065b093, 0x70ed: 0x0065b293, 0x70ee: 0x0065b493, 0x70ef: 0x0065b693, + 0x70f0: 0x0065b893, 0x70f1: 0x0065ba93, 0x70f2: 0x0065bc93, 0x70f3: 0x0065be93, + 0x70f4: 0x0065c093, 0x70f5: 0x0065c493, 0x70f6: 0x0065c693, 0x70f7: 0x0065c893, + 0x70f8: 0x0065ca93, 0x70f9: 0x0065cc93, 0x70fa: 0x0065ce93, 0x70fb: 0x0065d093, + 0x70fc: 0x0065d293, 0x70fd: 0x0065d493, 0x70fe: 0x0065d693, + // Block 0x1c4, offset 0x7100 + 0x7100: 0xe000230b, 0x7101: 0xe00022f8, 0x7102: 0xe00022fc, 0x7103: 0xe0002311, + 0x7104: 0xe0002316, 0x7105: 0xe000231d, 0x7106: 0xe0002321, 0x7107: 0xe0002325, + 0x7108: 0xe000232b, 0x7109: 0xf0001c1c, 0x710a: 0xe0002330, 0x710b: 0xe000233c, + 0x710c: 0xe0002340, 0x710d: 0xe0002337, 0x710e: 0xe0002346, 0x710f: 0xe000234b, + 0x7110: 0xe000234f, 0x7111: 0xe0002353, 0x7112: 0xf0001c1c, 0x7113: 0xe000235e, + 0x7114: 0xe0002358, 0x7115: 0xf0001c1c, 0x7116: 0xe0002363, 0x7117: 0xe000236d, + 0x7118: 0xf0001f04, 0x7119: 0xf0001f04, 0x711a: 0xf0001f04, 0x711b: 0xf0001f04, + 0x711c: 0xf0001f04, 0x711d: 0xf0001f04, 0x711e: 0xf0001f04, 0x711f: 0xf0001f04, + 0x7120: 0xf0001f04, 0x7121: 0xf0001f04, 0x7122: 0xf0000404, 0x7123: 0xf0000404, + 0x7124: 0xf0000404, 0x7125: 0xf0000404, 0x7126: 0xf0000404, 0x7127: 0xf0000404, + 0x7128: 0xf0000404, 0x7129: 0xf0000404, 0x712a: 0xf0000404, 0x712b: 0xf0000404, + 0x712c: 0xf0000404, 0x712d: 0xf0000404, 0x712e: 0xf0000404, 0x712f: 0xf0000404, + 0x7130: 0xf0000404, 0x7131: 0xe0000c1e, 0x7132: 0xf0001c1c, 0x7133: 0xf0001d1d, + 0x7134: 0xe0000a31, 0x7135: 0xe0002824, 0x7136: 0xf0001c1c, 0x7137: 0xf0001c1c, + 0x7138: 0xe0000ac2, 0x7139: 0xe0000ac6, 0x713a: 0xe00027e8, 0x713b: 0xf0001c1c, + 0x713c: 0xf0001c1c, 0x713d: 0xf0001c1c, 0x713e: 0xf0001c1c, 0x713f: 0xe0002431, + // Block 0x1c5, offset 0x7140 + 0x7140: 0xf0001d1c, 0x7141: 0xf0001d1c, 0x7142: 0xf0001d1c, 0x7143: 0xf0001d1c, + 0x7144: 0xe00027f7, 0x7145: 0xe00027fa, 0x7146: 0xf0001d1d, 0x7147: 0xf0001d1d, + 0x7148: 0xe0000a6b, 0x7149: 0xe0000cb4, 0x714a: 0xf0001d1c, 0x714b: 0xf0001d1c, + 0x714c: 0xf0001d1c, 0x714d: 0xf0001c1c, 0x714e: 0xf0001c1c, 0x714f: 0xe00027fd, + 0x7150: 0xe00027ce, 0x7151: 0xe0000cb9, 0x7152: 0xe0000d36, 0x7153: 0xe0000be3, + 0x7154: 0xe0000fc5, 0x7155: 0xf0001c1c, 0x7156: 0xf0001c1c, 0x7157: 0xf0001c1c, + 0x7158: 0xe0002803, 0x7159: 0xf0001c1c, 0x715a: 0xf0001c1c, 0x715b: 0xf0001c1c, + 0x715c: 0xf0001c1c, 0x715d: 0xf0001c1c, 0x715e: 0xe0002806, 0x715f: 0xe0000d3e, + 0x7160: 0xe0000a72, 0x7161: 0xf0001c1c, 0x7162: 0xe0000cbd, 0x7163: 0xe0000d42, + 0x7164: 0xe0000a76, 0x7165: 0xf0001c1c, 0x7166: 0xe0000cc1, 0x7167: 0xe0000d2d, + 0x7168: 0xe0000d31, 0x7169: 0xf0001c1d, 0x716a: 0xe0000cc5, 0x716b: 0xe0000d4a, + 0x716c: 0xe0000be7, 0x716d: 0xe0000f0b, 0x716e: 0xe0000f0f, 0x716f: 0xe0000f15, + 0x7170: 0xe000282d, 0x7171: 0xe0002821, 0x7172: 0xe000288e, 0x7173: 0xe000281b, + 0x7174: 0xf0001d1c, 0x7175: 0xf0001d1c, 0x7176: 0xf0001d1c, 0x7177: 0xf0001d1c, + 0x7178: 0xe000280f, 0x7179: 0xf0001d1d, 0x717a: 0xf0001d1c, 0x717b: 0xf0001d1c, + 0x717c: 0xf0001d1c, 0x717d: 0xf0001d1c, 0x717e: 0xe0002812, 0x717f: 0xf0001d1d, + // Block 0x1c6, offset 0x7180 + 0x7180: 0xe0002815, 0x7181: 0xf0001d1d, 0x7182: 0xe00009b7, 0x7183: 0xe00024f3, + 0x7184: 0xf0001c1c, 0x7185: 0xf0001c1c, 0x7186: 0xe0000a66, 0x7187: 0xe0000a7a, + 0x7188: 0xf0001d1c, 0x7189: 0xf0001c1d, 0x718a: 0xe00027c2, 0x718b: 0xe00027c8, + 0x718c: 0xe00027e5, 0x718d: 0xe0002800, 0x718e: 0xe0002809, 0x718f: 0xe000280c, + 0x7190: 0xf0001c1c, 0x7191: 0xf0001c1c, 0x7192: 0xe0000d0d, 0x7193: 0xe0002818, + 0x7194: 0xf0001c1c, 0x7195: 0xe0000d3a, 0x7196: 0xe0000d46, 0x7197: 0xe0002827, + 0x7198: 0xe0000eb0, 0x7199: 0xe0000eb8, 0x719a: 0xe000282a, 0x719b: 0xe0002836, + 0x719c: 0xe000283f, 0x719d: 0xf0001c1d, 0x719e: 0xe00010b2, 0x719f: 0xe00009c8, + 0x71a0: 0xf0001f04, 0x71a1: 0xf0001f04, 0x71a2: 0xf0001f04, 0x71a3: 0xf0001f04, + 0x71a4: 0xf0001f04, 0x71a5: 0xf0001f04, 0x71a6: 0xf0001f04, 0x71a7: 0xf0001f04, + 0x71a8: 0xf0001f04, 0x71a9: 0xf0000404, 0x71aa: 0xf0000404, 0x71ab: 0xf0000404, + 0x71ac: 0xf0000404, 0x71ad: 0xf0000404, 0x71ae: 0xf0000404, 0x71af: 0xf0000404, + 0x71b0: 0xf0000404, 0x71b1: 0xf0000404, 0x71b2: 0xf0000404, 0x71b3: 0xf0000404, + 0x71b4: 0xf0000404, 0x71b5: 0xf0000404, 0x71b6: 0xf0000404, 0x71b7: 0xf0000404, + 0x71b8: 0xf0000404, 0x71b9: 0xf0000404, 0x71ba: 0xf0000404, 0x71bb: 0xf0000404, + 0x71bc: 0xf0000404, 0x71bd: 0xf0000404, 0x71be: 0xf0000404, 0x71bf: 0xe0000bdf, + // Block 0x1c7, offset 0x71c0 + 0x71c0: 0xf0000404, 0x71c1: 0xe00026cf, 0x71c2: 0xf0000404, 0x71c3: 0xe0000b99, + 0x71c4: 0xe0000b9d, 0x71c5: 0xe0000f83, 0x71c6: 0xe000283c, + 0x71d3: 0xf0000404, + 0x71d4: 0xf0000404, 0x71d5: 0xf0000404, 0x71d6: 0xf0000404, 0x71d7: 0xf0000404, + 0x71dd: 0xe000150b, 0x71de: 0xa1a09602, 0x71df: 0xe0001514, + 0x71e0: 0x0038ae85, 0x71e1: 0x00389085, 0x71e2: 0x00389685, 0x71e3: 0x00389885, + 0x71e4: 0x0038a485, 0x71e5: 0x0038a685, 0x71e6: 0x0038a885, 0x71e7: 0x0038b685, + 0x71e8: 0x0038ba85, 0x71e9: 0x00093885, 0x71ea: 0xe0001542, 0x71eb: 0xe000153f, + 0x71ec: 0xe000154c, 0x71ed: 0xe0001548, 0x71ee: 0xe00014e1, 0x71ef: 0xe00014e4, + 0x71f0: 0xe00014e7, 0x71f1: 0xe00014ea, 0x71f2: 0xe00014f0, 0x71f3: 0xe00014f3, + 0x71f4: 0xe00014f6, 0x71f5: 0xe00014fc, 0x71f6: 0xe0001505, + 0x71f8: 0xe0001508, 0x71f9: 0xe000150e, 0x71fa: 0xe000151b, 0x71fb: 0xe0001518, + 0x71fc: 0xe0001521, 0x71fe: 0xe0001524, + // Block 0x1c8, offset 0x7200 + 0x7200: 0xf0001f04, 0x7201: 0xf0001f04, 0x7202: 0xf0001f04, 0x7203: 0xf0001f04, + 0x7204: 0xf0001f04, 0x7205: 0xf0001f04, 0x7206: 0xf0001f04, 0x7207: 0xf0001f04, + 0x7208: 0xf0001f04, 0x7209: 0xf0001f04, 0x720a: 0xf0001f04, + 0x7210: 0xf0000a04, 0x7211: 0xf0000a04, 0x7212: 0xf0000a04, 0x7213: 0xf0000a04, + 0x7214: 0xe00024a3, 0x7215: 0xf0000a04, 0x7216: 0xf0000a04, 0x7217: 0xe00024ab, + 0x7218: 0xe00024b3, 0x7219: 0xf0000a04, 0x721a: 0xe00024bb, 0x721b: 0xf0000a04, + 0x721c: 0xf0000a04, 0x721d: 0xf0000a04, 0x721e: 0xe00024c3, 0x721f: 0xf0000a04, + 0x7220: 0xe00024cb, 0x7221: 0xe00024d3, 0x7222: 0xe00024db, 0x7223: 0xe00024e3, + 0x7224: 0xf0000a04, 0x7225: 0xf0000a04, 0x7226: 0xf0000a04, 0x7227: 0xe00024eb, + 0x7228: 0xf0000a04, 0x7229: 0xf0000a04, 0x722a: 0xe00024ef, 0x722b: 0x002c3a8c, + 0x722c: 0x002f7a8c, 0x722d: 0xf0000c0c, 0x722e: 0xf0000c0c, + 0x7230: 0x002bde9d, 0x7231: 0x002c0a9d, 0x7232: 0x002c3a9d, 0x7233: 0x002c629d, + 0x7234: 0x002c989d, 0x7235: 0x002d089d, 0x7236: 0x002d229d, 0x7237: 0x002d689d, + 0x7238: 0x002d9a9d, 0x7239: 0x002dcc9d, 0x723a: 0x002dfe9d, 0x723b: 0x002e229d, + 0x723c: 0x002e829d, 0x723d: 0x002e9e9d, 0x723e: 0x002ee29d, 0x723f: 0x002f2c9d, + // Block 0x1c9, offset 0x7240 + 0x7240: 0x002f569d, 0x7241: 0x002f7a9d, 0x7242: 0x002fe69d, 0x7243: 0x00302c9d, + 0x7244: 0x00306c9d, 0x7245: 0x0030be9d, 0x7246: 0x0030e29d, 0x7247: 0x0030f69d, + 0x7248: 0x0031009d, 0x7249: 0x00312a9d, 0x724a: 0xe00027cb, 0x724b: 0xf0001d1d, + 0x724c: 0xe0002830, 0x724d: 0xe0002839, 0x724e: 0xe0000ebc, 0x724f: 0xf0001d1d, + 0x7250: 0x002bde8c, 0x7251: 0x002c0a8c, 0x7252: 0x002c3a8c, 0x7253: 0x002c628c, + 0x7254: 0x002c988c, 0x7255: 0x002d088c, 0x7256: 0x002d228c, 0x7257: 0x002d688c, + 0x7258: 0x002d9a8c, 0x7259: 0x002dcc8c, 0x725a: 0x002dfe8c, 0x725b: 0x002e228c, + 0x725c: 0x002e828c, 0x725d: 0x002e9e8c, 0x725e: 0x002ee28c, 0x725f: 0x002f2c8c, + 0x7260: 0x002f568c, 0x7261: 0x002f7a8c, 0x7262: 0x002fe68c, 0x7263: 0x00302c8c, + 0x7264: 0x00306c8c, 0x7265: 0x0030be8c, 0x7266: 0x0030e28c, 0x7267: 0x0030f68c, + 0x7268: 0x0031008c, 0x7269: 0x00312a8c, 0x726a: 0xf0001414, 0x726b: 0xf0001414, + 0x7270: 0x002bde9d, 0x7271: 0x002c0a9d, 0x7272: 0x002c3a9d, 0x7273: 0x002c629d, + 0x7274: 0x002c989d, 0x7275: 0x002d089d, 0x7276: 0x002d229d, 0x7277: 0x002d689d, + 0x7278: 0x002d9a9d, 0x7279: 0x002dcc9d, 0x727a: 0x002dfe9d, 0x727b: 0x002e229d, + 0x727c: 0x002e829d, 0x727d: 0x002e9e9d, 0x727e: 0x002ee29d, 0x727f: 0x002f2c9d, + // Block 0x1ca, offset 0x7280 + 0x7280: 0xe0000cfe, 0x7281: 0xe0000cf8, 0x7282: 0xe0000cf5, 0x7283: 0xe0000d51, + 0x7284: 0xe0000d4e, 0x7285: 0xe0000d6f, 0x7286: 0xe0000d6c, 0x7287: 0xe0000d5d, + 0x7288: 0xe0000d5a, 0x7289: 0x002e9e89, 0x728a: 0x002eda88, 0x728b: 0x402eda20, + 0x728c: 0xe0000e2e, 0x728d: 0xe0000e2b, 0x728e: 0xe0000da0, 0x728f: 0xe0000d9d, + 0x7290: 0xe0000de0, 0x7291: 0xe0000ddd, 0x7292: 0xe0000e93, 0x7293: 0xe0000e8f, + 0x7294: 0xe0000eca, 0x7295: 0xe0000ec7, 0x7296: 0xe0000edc, 0x7297: 0xe0000ed9, + 0x7298: 0xe0000ed0, 0x7299: 0xe0000ecd, 0x729a: 0xe0000f1f, 0x729b: 0xe0000f1c, + 0x729c: 0xe0000f2d, 0x729d: 0xe0000f2a, 0x729e: 0xe0000f47, 0x729f: 0xe0000f44, + 0x72a0: 0xe0000f33, 0x72a1: 0xe0000f30, 0x72a2: 0xe0000f99, 0x72a3: 0xe0000f96, + 0x72a4: 0xe0000f8a, 0x72a5: 0xe0000f87, 0x72a6: 0x00303688, 0x72a7: 0x40303620, + 0x72a8: 0xe000102b, 0x72a9: 0xe0001028, 0x72aa: 0xe000103f, 0x72ab: 0xe000103c, + 0x72ac: 0xe0000fe7, 0x72ad: 0xe0000fe4, 0x72ae: 0xe0000ff9, 0x72af: 0xe0000ff6, + 0x72b0: 0xe0001025, 0x72b1: 0xe0001022, 0x72b2: 0xe0001039, 0x72b3: 0xe0001036, + 0x72b4: 0xe00010d8, 0x72b5: 0xe00010d5, 0x72b6: 0xe000110e, 0x72b7: 0xe000110b, + 0x72b8: 0xe0001117, 0x72b9: 0xe000113b, 0x72ba: 0xe0001138, 0x72bb: 0xe000114d, + 0x72bc: 0xe000114a, 0x72bd: 0xe0001147, 0x72be: 0xe0001144, 0x72bf: 0xe0000f64, + // Block 0x1cb, offset 0x72c0 + 0x72c0: 0xa0000000, 0x72c1: 0xa0000000, 0x72c2: 0xa0000000, 0x72c3: 0xa0000000, + 0x72c4: 0xa0000000, 0x72c6: 0x40096620, 0x72c7: 0x40096a20, + 0x72c8: 0x40070820, 0x72c9: 0x4004f220, 0x72ca: 0x4004f620, 0x72cb: 0x4027e620, + 0x72cc: 0x40024820, 0x72cd: 0x40024a20, 0x72ce: 0x40070e20, 0x72cf: 0x40071020, + 0x72d0: 0xae600000, 0x72d1: 0xae600000, 0x72d2: 0xae600000, 0x72d3: 0xae600000, + 0x72d4: 0xae600000, 0x72d5: 0xae600000, 0x72d6: 0xae600000, 0x72d7: 0xae600000, + 0x72d8: 0xa1e00000, 0x72d9: 0xa1f00000, 0x72da: 0xa2000000, 0x72db: 0x40026420, + 0x72de: 0x40027020, 0x72df: 0x4002cc20, + 0x72e0: 0x403aa220, 0x72e1: 0x40391c20, 0x72e2: 0x40391e20, 0x72e3: 0x40392020, + 0x72e4: 0x40392620, 0x72e5: 0x40392820, 0x72e6: 0x40393020, 0x72e7: 0xc0520151, + 0x72e8: 0x40393c20, 0x72e9: 0x40395621, 0x72ea: 0x40395620, 0x72eb: 0x40395820, + 0x72ec: 0x40396420, 0x72ed: 0x40397220, 0x72ee: 0x40397420, 0x72ef: 0x40398820, + 0x72f0: 0x40398a20, 0x72f1: 0x4039a420, 0x72f2: 0x4039a620, 0x72f3: 0x4039c620, + 0x72f4: 0x4039c820, 0x72f5: 0x4039dc20, 0x72f6: 0x4039de20, 0x72f7: 0x4039e620, + 0x72f8: 0x4039e820, 0x72f9: 0x4039ee20, 0x72fa: 0x4039f020, 0x72fb: 0x403a3820, + 0x72fc: 0x403a3a20, 0x72fd: 0x403a9c20, 0x72fe: 0x403a9e20, 0x72ff: 0x403aa020, + // Block 0x1cc, offset 0x7300 + 0x7300: 0xa0000000, 0x7301: 0x4039fc20, 0x7302: 0x403a1220, 0x7303: 0x403a1a20, + 0x7304: 0x403a4020, 0x7305: 0x403a4e20, 0x7306: 0x403a5620, 0x7307: 0x403a6820, + 0x7308: 0xc0560171, 0x7309: 0x403a9021, 0x730a: 0xc0580171, 0x730b: 0xa1b0a202, + 0x730c: 0xa1c0a502, 0x730d: 0xa1d0a902, 0x730e: 0xa1e0ad02, 0x730f: 0xa1f0b202, + 0x7310: 0xa200b602, 0x7311: 0xa210ba02, 0x7312: 0xa220bc02, 0x7313: 0xae60bd02, + 0x7314: 0xae60be02, 0x7315: 0xadc0bf02, 0x7316: 0xadc0c102, 0x7317: 0xae60c202, + 0x7318: 0xae60c302, 0x7319: 0xae60c402, 0x731a: 0xae60c502, 0x731b: 0xae60c602, + 0x731c: 0xadc0c702, 0x731d: 0xae60c802, 0x731e: 0xae60c902, 0x731f: 0xadc0c002, + 0x7320: 0xe000015e, 0x7321: 0xe00001e6, 0x7322: 0xe0000301, 0x7323: 0xe00003db, + 0x7324: 0xe00004b6, 0x7325: 0xe0000580, 0x7326: 0xe000064b, 0x7327: 0xe00006f3, + 0x7328: 0xe000079f, 0x7329: 0xe0000844, 0x732a: 0x4004ee20, 0x732b: 0x40024c20, + 0x732c: 0x40024e20, 0x732d: 0x4004de20, 0x732e: 0x40393a20, 0x732f: 0x403a1020, + 0x7330: 0xa230d102, 0x7331: 0x40392420, 0x7332: 0x40392220, 0x7333: 0x40392a20, + 0x7334: 0x00391c84, 0x7335: 0xf0000404, 0x7336: 0xf0000404, 0x7337: 0xf0000404, + 0x7338: 0xf0000404, 0x7339: 0x40395a20, 0x733a: 0x40395c20, 0x733b: 0x40393e20, + 0x733c: 0x40395e20, 0x733d: 0x40396020, 0x733e: 0x40394020, 0x733f: 0x40396220, + // Block 0x1cd, offset 0x7340 + 0x7340: 0x40073420, 0x7341: 0x40073620, + 0x7353: 0x003a269a, + 0x7354: 0x003a2699, 0x7355: 0x003a2697, 0x7356: 0x003a2698, 0x7357: 0x003a7c9a, + 0x7358: 0x003a7c99, 0x7359: 0x003a7a9a, 0x735a: 0x003a7a99, 0x735b: 0x003a7e9a, + 0x735c: 0x003a7e99, 0x735d: 0xf0001a1a, 0x735e: 0x003a849a, 0x735f: 0x003a8499, + 0x7360: 0x003a789a, 0x7361: 0x003a7899, 0x7362: 0x003a809a, 0x7363: 0x003a8099, + 0x7364: 0x003a989a, 0x7365: 0x003a9899, 0x7366: 0x003a9897, 0x7367: 0x003a9898, + 0x7368: 0x003a90a3, 0x7369: 0x003a90a4, 0x736a: 0xe0001559, 0x736b: 0xe0001556, + 0x736c: 0xe0001589, 0x736d: 0xe0001586, 0x736e: 0xe000158f, 0x736f: 0xe000158c, + 0x7370: 0xe000159b, 0x7371: 0xe0001598, 0x7372: 0xe0001595, 0x7373: 0xe0001592, + 0x7374: 0xe00015a1, 0x7375: 0xe000159e, 0x7376: 0xe00015bf, 0x7377: 0xe00015bc, + 0x7378: 0xe00015b9, 0x7379: 0xe00015ad, 0x737a: 0xe00015a7, 0x737b: 0xe00015a4, + 0x737c: 0x003a929a, 0x737d: 0x003a9299, 0x737e: 0x003a9297, 0x737f: 0x003a9298, + // Block 0x1ce, offset 0x7380 + 0x7380: 0xe000155f, 0x7381: 0xe0001565, 0x7382: 0xe000157a, 0x7383: 0xe00015b0, + 0x7384: 0xe00015b6, 0x7385: 0xf0001a1a, 0x7386: 0xf0001a1a, 0x7387: 0xf0001a1a, + 0x7388: 0xf0001a1a, 0x7389: 0xe0002894, 0x738a: 0xf0001a1a, 0x738b: 0xf0001a1a, + 0x738c: 0xf0001a1a, 0x738d: 0xf0001a1a, 0x738e: 0xf0001a1a, 0x738f: 0xe000289a, + 0x7390: 0xf0001a1a, 0x7391: 0xf0001a1a, 0x7392: 0xf0001a1a, 0x7393: 0xe00028a0, + 0x7394: 0xf0001a1a, 0x7395: 0xf0001a1a, 0x7396: 0xf0001a1a, 0x7397: 0xf0001a1a, + 0x7398: 0xf0001a1a, 0x7399: 0xf0001a1a, 0x739a: 0xf0001a1a, 0x739b: 0xf0001a1a, + 0x739c: 0xf0001a1a, 0x739d: 0xf0001a1a, 0x739e: 0xf0001a1a, 0x739f: 0xf0001a1a, + 0x73a0: 0xf0001a1a, 0x73a1: 0xf0001a1a, 0x73a2: 0xf0001a1a, 0x73a3: 0xf0001a1a, + 0x73a4: 0xf0001a1a, 0x73a5: 0xf0001a1a, 0x73a6: 0xf0001a1a, 0x73a7: 0xf0001a1a, + 0x73a8: 0xf0001a1a, 0x73a9: 0xf0001a1a, 0x73aa: 0xf0001a1a, 0x73ab: 0xf0001a1a, + 0x73ac: 0xf0001a1a, 0x73ad: 0xf0001a1a, 0x73ae: 0xf0001a1a, 0x73af: 0xf0001a1a, + 0x73b0: 0xf0001a1a, 0x73b1: 0xe00028e2, 0x73b2: 0xf0001a1a, 0x73b3: 0xf0001a1a, + 0x73b4: 0xf0001a1a, 0x73b5: 0xe00028e8, 0x73b6: 0xf0001a1a, 0x73b7: 0xf0001a1a, + 0x73b8: 0xf0001a1a, 0x73b9: 0xf0001a1a, 0x73ba: 0xf0001a1a, 0x73bb: 0xf0001a1a, + 0x73bc: 0xf0001a1a, 0x73bd: 0xe00028ee, 0x73be: 0xf0001a1a, 0x73bf: 0xf0001a1a, + // Block 0x1cf, offset 0x73c0 + 0x73c0: 0xf0001a1a, 0x73c1: 0xf0001a1a, 0x73c2: 0xf0001a1a, 0x73c3: 0xe00028f4, + 0x73c4: 0xf0001a1a, 0x73c5: 0xf0001a1a, 0x73c6: 0xf0001a1a, 0x73c7: 0xf0001a1a, + 0x73c8: 0xf0001a1a, 0x73c9: 0xe00028f7, 0x73ca: 0xf0001a1a, 0x73cb: 0xf0001a1a, + 0x73cc: 0xf0001a1a, 0x73cd: 0xf0001a1a, 0x73ce: 0xf0001a1a, 0x73cf: 0xe00028fd, + 0x73d0: 0xf0001a1a, 0x73d1: 0xf0001a1a, 0x73d2: 0xf0001a1a, 0x73d3: 0xe0002900, + 0x73d4: 0xf0001a1a, 0x73d5: 0xf0001a1a, 0x73d6: 0xf0001a1a, 0x73d7: 0xf0001a1a, + 0x73d8: 0xf0001a1a, 0x73d9: 0xe0002906, 0x73da: 0xf0001a1a, 0x73db: 0xf0001a1a, + 0x73dc: 0xf0001a1a, 0x73dd: 0x003a90a8, 0x73de: 0xe0000003, 0x73df: 0xe0000006, + 0x73e0: 0xe0000009, 0x73e1: 0xe000000c, 0x73e2: 0xe000000f, 0x73e3: 0xe0000012, + 0x73e4: 0xe000156b, 0x73e5: 0xe000156e, 0x73e6: 0xe0001577, 0x73e7: 0xe000157d, + 0x73e8: 0xe00015aa, 0x73e9: 0xe00015b3, 0x73ea: 0xf0001919, 0x73eb: 0xf0001919, + 0x73ec: 0xf0001919, 0x73ed: 0xf0001919, 0x73ee: 0xe0002891, 0x73ef: 0xf0001919, + 0x73f0: 0xf0001919, 0x73f1: 0xf0001919, 0x73f2: 0xf0001919, 0x73f3: 0xf0001919, + 0x73f4: 0xe0002897, 0x73f5: 0xf0001919, 0x73f6: 0xf0001919, 0x73f7: 0xf0001919, + 0x73f8: 0xf0001919, 0x73f9: 0xf0001919, 0x73fa: 0xe000289d, 0x73fb: 0xf0001919, + 0x73fc: 0xe00028df, 0x73fd: 0xf0001919, 0x73fe: 0xe00028e5, 0x73ff: 0xf0001919, + // Block 0x1d0, offset 0x7400 + 0x7400: 0xf0001919, 0x7401: 0xf0001919, 0x7402: 0xf0001919, 0x7403: 0xe00028eb, + 0x7404: 0xf0001919, 0x7405: 0xf0001919, 0x7406: 0xe00028f1, 0x7407: 0xf0001919, + 0x7408: 0xf0001919, 0x7409: 0xf0001919, 0x740a: 0xf0001919, 0x740b: 0xf0001919, + 0x740c: 0xf0001919, 0x740d: 0xf0001919, 0x740e: 0xe00028fa, 0x740f: 0xf0001919, + 0x7410: 0x003a90a7, 0x7411: 0xf0001919, 0x7412: 0xf0001919, 0x7413: 0xf0001919, + 0x7414: 0xf0001919, 0x7415: 0xe0002903, 0x7416: 0xf0001919, 0x7417: 0xe000155c, + 0x7418: 0xe0001562, 0x7419: 0xe0001568, 0x741a: 0xe0001571, 0x741b: 0xe0001580, + 0x741c: 0xf0001717, 0x741d: 0xf0001717, 0x741e: 0xf0001717, 0x741f: 0xf0001717, + 0x7420: 0xf0001717, 0x7421: 0xf0001717, 0x7422: 0xf0001717, 0x7423: 0xf0001717, + 0x7424: 0xf0001717, 0x7425: 0xf0001717, 0x7426: 0xf0001717, 0x7427: 0xf0001717, + 0x7428: 0xf0001717, 0x7429: 0xf0001717, 0x742a: 0xf0001717, 0x742b: 0xf0001717, + 0x742c: 0xf0001717, 0x742d: 0xf0001717, 0x742e: 0xf0001717, 0x742f: 0xf0001717, + 0x7430: 0xf0001717, 0x7431: 0xf0001717, 0x7432: 0xf0001717, 0x7433: 0xf0001717, + 0x7434: 0xf0001717, 0x7435: 0xf0001717, 0x7436: 0xf0001717, 0x7437: 0xf0001717, + 0x7438: 0xf0001717, 0x7439: 0xf0001717, 0x743a: 0xf0001717, 0x743b: 0xf0001717, + 0x743c: 0xf0001717, 0x743d: 0xf0001717, 0x743e: 0xf0001717, 0x743f: 0xf0001717, + // Block 0x1d1, offset 0x7440 + 0x7440: 0xf0001717, 0x7441: 0xf0001717, 0x7442: 0xf0001717, 0x7443: 0xf0001717, + 0x7444: 0xf0001717, 0x7445: 0xf0001717, 0x7446: 0xf0001717, 0x7447: 0xf0001717, + 0x7448: 0xf0001717, 0x7449: 0xf0001717, 0x744a: 0xf0001717, 0x744b: 0xf0001717, + 0x744c: 0xf0001717, 0x744d: 0xf0001717, 0x744e: 0xf0001717, 0x744f: 0xf0001717, + 0x7450: 0xf0001717, 0x7451: 0xf0001717, 0x7452: 0xf0001717, 0x7453: 0xf0001717, + 0x7454: 0xf0001717, 0x7455: 0xf0001717, 0x7456: 0xf0001717, 0x7457: 0xf0001717, + 0x7458: 0xf0001717, 0x7459: 0xf0001717, 0x745a: 0xf0001717, 0x745b: 0xf0001717, + 0x745c: 0xf0001717, 0x745d: 0xf0001717, 0x745e: 0xf0001717, 0x745f: 0xe0001574, + 0x7460: 0xe0001583, 0x7461: 0xf0001818, 0x7462: 0xf0001818, 0x7463: 0xf0001818, + 0x7464: 0xf0001818, 0x7465: 0xf0001818, 0x7466: 0xf0001818, 0x7467: 0xf0001818, + 0x7468: 0xf0001818, 0x7469: 0xf0001818, 0x746a: 0xf0001818, 0x746b: 0xf0001818, + 0x746c: 0xf0001818, 0x746d: 0xf0001818, 0x746e: 0xf0001818, 0x746f: 0xf0001818, + 0x7470: 0xf0001818, 0x7471: 0xf0001818, 0x7472: 0xf0001818, 0x7473: 0xf0001818, + 0x7474: 0xf0001818, 0x7475: 0xe00028d0, 0x7476: 0xf0001a1a, 0x7477: 0xe00028d6, + 0x7478: 0xf0001a1a, 0x7479: 0xe00028dc, 0x747a: 0xf0001a1a, 0x747b: 0xe00028b8, + 0x747c: 0xf0001a1a, 0x747d: 0xe00028be, 0x747e: 0xf0001a1a, 0x747f: 0xe00028ac, + // Block 0x1d2, offset 0x7480 + 0x7480: 0xf0001a1a, 0x7481: 0xe00028a6, 0x7482: 0xf0001a1a, 0x7483: 0xe00028b2, + 0x7484: 0xf0001a1a, 0x7485: 0xe00028c4, 0x7486: 0xf0001a1a, 0x7487: 0xe00028ca, + 0x7488: 0xf0001a1a, 0x7489: 0xf0001a1a, 0x748a: 0xf0001a1a, 0x748b: 0xf0001a1a, + 0x748c: 0xf0001a1a, 0x748d: 0xf0001a1a, 0x748e: 0xf0001a1a, 0x748f: 0xf0001a1a, + 0x7490: 0xf0001a1a, 0x7491: 0xe00028cd, 0x7492: 0xf0001919, 0x7493: 0xe00028d3, + 0x7494: 0xf0001919, 0x7495: 0xe00028d9, 0x7496: 0xf0001919, 0x7497: 0xe00028b5, + 0x7498: 0xf0001919, 0x7499: 0xe00028bb, 0x749a: 0xf0001919, 0x749b: 0xe00028a9, + 0x749c: 0xf0001919, 0x749d: 0xe00028a3, 0x749e: 0xf0001919, 0x749f: 0xe00028af, + 0x74a0: 0xf0001919, 0x74a1: 0xe00028c1, 0x74a2: 0xf0001919, 0x74a3: 0xe00028c7, + 0x74a4: 0xf0001919, 0x74a5: 0xf0001919, 0x74a6: 0xf0001919, 0x74a7: 0xf0001919, + 0x74a8: 0xf0001919, 0x74a9: 0xf0001919, 0x74aa: 0xf0001919, 0x74ab: 0xf0001919, + 0x74ac: 0xf0001919, 0x74ad: 0xf0001717, 0x74ae: 0xf0001717, 0x74af: 0xf0001717, + 0x74b0: 0xf0001717, 0x74b1: 0xf0001717, 0x74b2: 0xf0001717, 0x74b3: 0xf0001717, + 0x74b4: 0xf0001818, 0x74b5: 0xf0001818, 0x74b6: 0xf0001818, 0x74b7: 0xf0001818, + 0x74b8: 0xf0001818, 0x74b9: 0xf0001818, 0x74ba: 0xf0001818, 0x74bb: 0xf0001818, + 0x74bc: 0xf0001919, 0x74bd: 0xf0001a1a, 0x74be: 0x4004c020, 0x74bf: 0x4004c220, + // Block 0x1d3, offset 0x74c0 + 0x74c0: 0x00391c9a, 0x74c1: 0x00391e9a, 0x74c2: 0x00391e99, 0x74c3: 0x0039209a, + 0x74c4: 0x00392099, 0x74c5: 0x0039269a, 0x74c6: 0x00392699, 0x74c7: 0x0039289a, + 0x74c8: 0x00392899, 0x74c9: 0x0039309a, 0x74ca: 0x00393099, 0x74cb: 0x00393097, + 0x74cc: 0x00393098, 0x74cd: 0x0039389a, 0x74ce: 0x00393899, 0x74cf: 0x00393c9a, + 0x74d0: 0x00393c99, 0x74d1: 0x00393c97, 0x74d2: 0x00393c98, 0x74d3: 0x003956a4, + 0x74d4: 0x003956a3, 0x74d5: 0x0039569a, 0x74d6: 0x00395699, 0x74d7: 0x00395697, + 0x74d8: 0x00395698, 0x74d9: 0x0039589a, 0x74da: 0x00395899, 0x74db: 0x00395897, + 0x74dc: 0x00395898, 0x74dd: 0x0039649a, 0x74de: 0x00396499, 0x74df: 0x00396497, + 0x74e0: 0x00396498, 0x74e1: 0x0039729a, 0x74e2: 0x00397299, 0x74e3: 0x00397297, + 0x74e4: 0x00397298, 0x74e5: 0x0039749a, 0x74e6: 0x00397499, 0x74e7: 0x00397497, + 0x74e8: 0x00397498, 0x74e9: 0x0039889a, 0x74ea: 0x00398899, 0x74eb: 0x00398a9a, + 0x74ec: 0x00398a99, 0x74ed: 0x0039a49a, 0x74ee: 0x0039a499, 0x74ef: 0x0039a69a, + 0x74f0: 0x0039a699, 0x74f1: 0x0039c69a, 0x74f2: 0x0039c699, 0x74f3: 0x0039c697, + 0x74f4: 0x0039c698, 0x74f5: 0x0039c89a, 0x74f6: 0x0039c899, 0x74f7: 0x0039c897, + 0x74f8: 0x0039c898, 0x74f9: 0x0039dc9a, 0x74fa: 0x0039dc99, 0x74fb: 0x0039dc97, + 0x74fc: 0x0039dc98, 0x74fd: 0x0039de9a, 0x74fe: 0x0039de99, 0x74ff: 0x0039de97, + // Block 0x1d4, offset 0x7500 + 0x7500: 0x0039de98, 0x7501: 0x0039e69a, 0x7502: 0x0039e699, 0x7503: 0x0039e697, + 0x7504: 0x0039e698, 0x7505: 0x0039e89a, 0x7506: 0x0039e899, 0x7507: 0x0039e897, + 0x7508: 0x0039e898, 0x7509: 0x0039ee9a, 0x750a: 0x0039ee99, 0x750b: 0x0039ee97, + 0x750c: 0x0039ee98, 0x750d: 0x0039f09a, 0x750e: 0x0039f099, 0x750f: 0x0039f097, + 0x7510: 0x0039f098, 0x7511: 0x0039fc9a, 0x7512: 0x0039fc99, 0x7513: 0x0039fc97, + 0x7514: 0x0039fc98, 0x7515: 0x003a129a, 0x7516: 0x003a1299, 0x7517: 0x003a1297, + 0x7518: 0x003a1298, 0x7519: 0x003a1a9a, 0x751a: 0x003a1a99, 0x751b: 0x003a1a97, + 0x751c: 0x003a1a98, 0x751d: 0x003a409a, 0x751e: 0x003a4099, 0x751f: 0x003a4097, + 0x7520: 0x003a4098, 0x7521: 0x003a4e9a, 0x7522: 0x003a4e99, 0x7523: 0x003a4e97, + 0x7524: 0x003a4e98, 0x7525: 0x003a569a, 0x7526: 0x003a5699, 0x7527: 0x003a5697, + 0x7528: 0x003a5698, 0x7529: 0x003a689a, 0x752a: 0x003a6899, 0x752b: 0x003a6897, + 0x752c: 0x003a6898, 0x752d: 0x003a749a, 0x752e: 0x003a7499, 0x752f: 0x003a90a6, + 0x7530: 0x003a90a5, 0x7531: 0x003a909a, 0x7532: 0x003a9099, 0x7533: 0x003a9097, + 0x7534: 0x003a9098, 0x7535: 0xe0001732, 0x7536: 0xe000172f, 0x7537: 0xe0001738, + 0x7538: 0xe0001735, 0x7539: 0xe000173e, 0x753a: 0xe000173b, 0x753b: 0xf0001a1a, + 0x753c: 0xf0001919, 0x753f: 0xa0000000, + // Block 0x1d5, offset 0x7540 + 0x7541: 0x40409a20, 0x7542: 0x40409820, 0x7543: 0x40409c20, + 0x7545: 0x40407c20, 0x7546: 0x40407e20, 0x7547: 0x40408020, + 0x7548: 0x40408220, 0x7549: 0x40408420, 0x754a: 0x40408620, 0x754b: 0x40408820, + 0x754c: 0x40408c20, 0x754f: 0x40409020, + 0x7550: 0x40409220, 0x7553: 0x40409420, + 0x7554: 0x40409620, 0x7555: 0xc33108b1, 0x7556: 0x40409a20, 0x7557: 0x40409c20, + 0x7558: 0x40409e20, 0x7559: 0x4040a020, 0x755a: 0x4040a220, 0x755b: 0x4040a420, + 0x755c: 0x4040a620, 0x755d: 0x4040a820, 0x755e: 0x4040aa20, 0x755f: 0x4040ac20, + 0x7560: 0x4040ae20, 0x7561: 0x4040b020, 0x7562: 0x4040b220, 0x7563: 0x4040b420, + 0x7564: 0xc32f0851, 0x7565: 0x4040b820, 0x7566: 0x4040ba20, 0x7567: 0x4040bc20, + 0x7568: 0x4040be20, 0x756a: 0x4040c020, 0x756b: 0x4040c220, + 0x756c: 0x4040c420, 0x756d: 0x4040c620, 0x756e: 0x4040c820, 0x756f: 0x4040ca20, + 0x7570: 0x4040cc20, 0x7572: 0x4040d020, + 0x7576: 0x4040d420, 0x7577: 0x4040d620, + 0x7578: 0x4040d820, 0x7579: 0x4040da20, + 0x757c: 0xa070f102, 0x757d: 0x4040dc20, 0x757e: 0x4040de20, 0x757f: 0x4040e020, + // Block 0x1d6, offset 0x7580 + 0x7580: 0x4040e220, 0x7581: 0x4040e420, 0x7582: 0x4040e620, 0x7583: 0x4040e820, + 0x7584: 0x4040ea20, 0x7587: 0xc05a0191, + 0x7588: 0x4040f220, 0x758b: 0x4040f420, + 0x758c: 0x4040f620, 0x758d: 0x8209207c, 0x758e: 0x4040b420, + 0x7597: 0x4040fa20, + 0x759c: 0xe000183f, 0x759d: 0xe0001842, 0x759f: 0xe0001848, + 0x75a0: 0x40408a20, 0x75a1: 0x40408e20, 0x75a2: 0x4040ec20, 0x75a3: 0x4040ee20, + 0x75a6: 0xe000016d, 0x75a7: 0xe00001fb, + 0x75a8: 0xe0000316, 0x75a9: 0xe00003f0, 0x75aa: 0xe00004cb, 0x75ab: 0xe0000595, + 0x75ac: 0xe0000660, 0x75ad: 0xe0000708, 0x75ae: 0xe00007b4, 0x75af: 0xe0000859, + 0x75b0: 0x4040ce20, 0x75b1: 0x4040d220, 0x75b2: 0x4027e820, 0x75b3: 0x4027ea20, + 0x75b4: 0x40283020, 0x75b5: 0x40283220, 0x75b6: 0x40283420, 0x75b7: 0x40283620, + 0x75b8: 0x40283820, 0x75b9: 0x40283a20, 0x75ba: 0x40073a20, 0x75bb: 0x4027ec20, + // Block 0x1d7, offset 0x75c0 + 0x75c0: 0xa0000000, 0x75c1: 0xa0000000, 0x75c2: 0xa0000000, 0x75c3: 0xa0000000, + 0x75c4: 0xa0000000, 0x75c5: 0xa0000000, 0x75c6: 0xa0000000, 0x75c7: 0xa0000000, + 0x75c8: 0xa0000000, 0x75c9: 0x40020020, 0x75ca: 0x40020220, 0x75cb: 0x40020420, + 0x75cc: 0x40020620, 0x75cd: 0x40020820, 0x75ce: 0xa0000000, 0x75cf: 0xa0000000, + 0x75d0: 0xa0000000, 0x75d1: 0xa0000000, 0x75d2: 0xa0000000, 0x75d3: 0xa0000000, + 0x75d4: 0xa0000000, 0x75d5: 0xa0000000, 0x75d6: 0xa0000000, 0x75d7: 0xa0000000, + 0x75d8: 0xa0000000, 0x75d9: 0xa0000000, 0x75da: 0xa0000000, 0x75db: 0xa0000000, + 0x75dc: 0xa0000000, 0x75dd: 0xa0000000, 0x75de: 0xa0000000, 0x75df: 0xa0000000, + 0x75e0: 0x40021220, 0x75e1: 0x4002ba20, 0x75e2: 0x4003e020, 0x75e3: 0x4004ea20, + 0x75e4: 0x4027de20, 0x75e5: 0x4004ec20, 0x75e6: 0x4004e620, 0x75e7: 0x4003d220, + 0x75e8: 0x4003f420, 0x75e9: 0x4003f620, 0x75ea: 0x4004d820, 0x75eb: 0x40093820, + 0x75ec: 0x40024020, 0x75ed: 0x40021a20, 0x75ee: 0x4002e420, 0x75ef: 0x4004e220, + 0x75f0: 0x4029cc20, 0x75f1: 0x4029ce20, 0x75f2: 0x4029d020, 0x75f3: 0x4029d220, + 0x75f4: 0x4029d420, 0x75f5: 0x4029d620, 0x75f6: 0x4029d820, 0x75f7: 0x4029da20, + 0x75f8: 0x4029dc20, 0x75f9: 0x4029de20, 0x75fa: 0x40026c20, 0x75fb: 0x40026220, + 0x75fc: 0x40094020, 0x75fd: 0x40094220, 0x75fe: 0x40094420, 0x75ff: 0x4002c420, + // Block 0x1d8, offset 0x7600 + 0x7600: 0x4004d620, 0x7601: 0x002bde88, 0x7602: 0x002c0a88, 0x7603: 0xc3350911, + 0x7604: 0x002c6288, 0x7605: 0x002c9888, 0x7606: 0x002d0888, 0x7607: 0xc33900d1, + 0x7608: 0x002d6888, 0x7609: 0xc33b0931, 0x760a: 0x002dcc88, 0x760b: 0x002dfe88, + 0x760c: 0xc0030002, 0x760d: 0x002e8288, 0x760e: 0x002e9e88, 0x760f: 0xc33f0071, + 0x7610: 0x002f2c88, 0x7611: 0x002e0083, 0x7612: 0x002f7a88, 0x7613: 0xc3430911, + 0x7614: 0x00302c88, 0x7615: 0xc3470071, 0x7616: 0x0030be88, 0x7617: 0x0030e288, + 0x7618: 0x002d6a83, 0x7619: 0x00310088, 0x761a: 0x00312a88, 0x761b: 0x4003f820, + 0x761c: 0x4004e420, 0x761d: 0x4003fa20, 0x761e: 0x40062420, 0x761f: 0x40021620, + 0x7620: 0x40061e20, 0x7621: 0x402bde20, 0x7622: 0x402c0a20, 0x7623: 0xc3330911, + 0x7624: 0x402c6220, 0x7625: 0x402c9820, 0x7626: 0x402d0820, 0x7627: 0xc33700d1, + 0x7628: 0x402d6820, 0x7629: 0x402d9a20, 0x762a: 0x402dcc20, 0x762b: 0x402dfe20, + 0x762c: 0xc0000002, 0x762d: 0x402e8220, 0x762e: 0x402e9e20, 0x762f: 0xc33d0071, + 0x7630: 0x402f2c20, 0x7631: 0x402e0020, 0x7632: 0x402f7a20, 0x7633: 0xc3410911, + 0x7634: 0x40302c20, 0x7635: 0xc3450071, 0x7636: 0x4030be20, 0x7637: 0x4030e220, + 0x7638: 0x402d6a20, 0x7639: 0x40310020, 0x763a: 0x40312a20, 0x763b: 0x4003fc20, + 0x763c: 0x40094820, 0x763d: 0x4003fe20, 0x763e: 0x40094c20, 0x763f: 0xa0000000, + // Block 0x1d9, offset 0x7640 + 0x7640: 0xe00008f5, 0x7641: 0xe00008ef, 0x7642: 0xe0000921, 0x7643: 0xe0000969, + 0x7644: 0xe000095b, 0x7645: 0xe000094d, 0x7646: 0xe00009dd, 0x7647: 0x002c3c83, + 0x7648: 0xe0000ae8, 0x7649: 0xe0000ae2, 0x764a: 0xe0000af4, 0x764b: 0xe0000b20, + 0x764c: 0xe0002918, 0x764d: 0xe0002915, 0x764e: 0xe000291e, 0x764f: 0xe0002924, + 0x7650: 0xe0000ab3, 0x7651: 0xe0000d63, 0x7652: 0xe0000d9a, 0x7653: 0xe0000d94, + 0x7654: 0xe0000da6, 0x7655: 0xe0000de6, 0x7656: 0x002ee483, 0x7657: 0x40093e20, + 0x7658: 0xe0000e12, 0x7659: 0xe0000fe1, 0x765a: 0xe0000fdb, 0x765b: 0xe0000fed, + 0x765c: 0x00306e83, 0x765d: 0xe0001102, 0x765e: 0x00318888, 0x765f: 0xe0000f7b, + 0x7660: 0xe00008f2, 0x7661: 0xe00008ec, 0x7662: 0xe000091e, 0x7663: 0xe0000966, + 0x7664: 0xe0000958, 0x7665: 0xe000094a, 0x7666: 0xe00009d5, 0x7667: 0x402c3c20, + 0x7668: 0xe0000ae5, 0x7669: 0xe0000adf, 0x766a: 0xe0000af1, 0x766b: 0xe0000b1d, + 0x766c: 0xe0000c28, 0x766d: 0xe0000c22, 0x766e: 0xe0000c34, 0x766f: 0xe0000c40, + 0x7670: 0xe0000aad, 0x7671: 0xe0000d60, 0x7672: 0xe0000d97, 0x7673: 0xe0000d91, + 0x7674: 0xe0000da3, 0x7675: 0xe0000de3, 0x7676: 0x402ee420, 0x7677: 0x40093c20, + 0x7678: 0xe0000e0f, 0x7679: 0xe0000fde, 0x767a: 0xe0000fd8, 0x767b: 0xe0000fea, + 0x767c: 0x40306e20, 0x767d: 0xe00010ff, 0x767e: 0x40318820, 0x767f: 0xe0001114, + // Block 0x1da, offset 0x7680 + 0x7680: 0xe0000983, 0x7681: 0xe0000980, 0x7682: 0xe00008fb, 0x7683: 0xe00008f8, + 0x7684: 0xe000097d, 0x7685: 0xe000097a, 0x7686: 0xe0000a38, 0x7687: 0xe0000a35, + 0x7688: 0xe0000a3e, 0x7689: 0xe0000a3b, 0x768a: 0xe0000a4a, 0x768b: 0xe0000a47, + 0x768c: 0xe0000a44, 0x768d: 0xe0000a41, 0x768e: 0xe0000a86, 0x768f: 0xe0000a83, + 0x7690: 0xe0000aaa, 0x7691: 0xe0000aa7, 0x7692: 0xe0000b46, 0x7693: 0xe0000b43, + 0x7694: 0xe0000aee, 0x7695: 0xe0000aeb, 0x7696: 0xe0000b2c, 0x7697: 0xe0000b29, + 0x7698: 0xe0000b40, 0x7699: 0xe0000b3d, 0x769a: 0xe0000b1a, 0x769b: 0xe0000b17, + 0x769c: 0xe0000bb8, 0x769d: 0xe0000bb5, 0x769e: 0x002d2483, 0x769f: 0x402d2420, + 0x76a0: 0xe0000bc4, 0x76a1: 0xe0000bc1, 0x76a2: 0xe0000bca, 0x76a3: 0xe0000bc7, + 0x76a4: 0xe0000bee, 0x76a5: 0xe0000beb, 0x76a6: 0xe0000c1b, 0x76a7: 0xe0000c18, + 0x76a8: 0xe000292b, 0x76a9: 0xe0000c4e, 0x76aa: 0xe0002931, 0x76ab: 0xe0000c5d, + 0x76ac: 0xe000291b, 0x76ad: 0xe0000c2e, 0x76ae: 0xe000292e, 0x76af: 0xe0000c57, + 0x76b0: 0x002d9a83, 0x76b1: 0x402d9820, 0x76b2: 0xe00027e2, 0x76b3: 0xf0000404, + 0x76b4: 0xe0000c8a, 0x76b5: 0xe0000c87, 0x76b6: 0xe0000c9f, 0x76b7: 0xe0000c9c, + 0x76b8: 0x402f7220, 0x76b9: 0xe0000ccc, 0x76ba: 0xe0000cc9, 0x76bb: 0xe0000cd8, + 0x76bc: 0xe0000cd5, 0x76bd: 0xe0000cd2, 0x76be: 0xe0000ccf, 0x76bf: 0xe0000d04, + // Block 0x1db, offset 0x76c0 + 0x76c0: 0xe0000cfe, 0x76c1: 0xe0000cf8, 0x76c2: 0xe0000cf5, 0x76c3: 0xe0000d51, + 0x76c4: 0xe0000d4e, 0x76c5: 0xe0000d6f, 0x76c6: 0xe0000d6c, 0x76c7: 0xe0000d5d, + 0x76c8: 0xe0000d5a, 0x76c9: 0xf0000404, 0x76ca: 0x002eda88, 0x76cb: 0x402eda20, + 0x76cc: 0xe0000e2e, 0x76cd: 0xe0000e2b, 0x76ce: 0xe0000da0, 0x76cf: 0xe0000d9d, + 0x76d0: 0xe0000de0, 0x76d1: 0xe0000ddd, 0x76d2: 0xe0000e93, 0x76d3: 0xe0000e8f, + 0x76d4: 0xe0000eca, 0x76d5: 0xe0000ec7, 0x76d6: 0xe0000edc, 0x76d7: 0xe0000ed9, + 0x76d8: 0xe0000ed0, 0x76d9: 0xe0000ecd, 0x76da: 0xe0000f1f, 0x76db: 0xe0000f1c, + 0x76dc: 0xe0000f2d, 0x76dd: 0xe0000f2a, 0x76de: 0x002fe883, 0x76df: 0x402fe820, + 0x76e0: 0xe0000f33, 0x76e1: 0xe0000f30, 0x76e2: 0xe0000f99, 0x76e3: 0xe0000f96, + 0x76e4: 0xe0000f8a, 0x76e5: 0xe0000f87, 0x76e6: 0x00303688, 0x76e7: 0x40303620, + 0x76e8: 0xe000102b, 0x76e9: 0xe0001028, 0x76ea: 0xe000103f, 0x76eb: 0xe000103c, + 0x76ec: 0xe0000fe7, 0x76ed: 0xe0000fe4, 0x76ee: 0xe0000ff9, 0x76ef: 0xe0000ff6, + 0x76f0: 0xe0001025, 0x76f1: 0xe0001022, 0x76f2: 0xe0001039, 0x76f3: 0xe0001036, + 0x76f4: 0xe00010d8, 0x76f5: 0xe00010d5, 0x76f6: 0xe000110e, 0x76f7: 0xe000110b, + 0x76f8: 0xe0001117, 0x76f9: 0xe000113b, 0x76fa: 0xe0001138, 0x76fb: 0xe000114d, + 0x76fc: 0xe000114a, 0x76fd: 0xe0001147, 0x76fe: 0xe0001144, 0x76ff: 0xe0000f64, + // Block 0x1dc, offset 0x7700 + 0x7700: 0x402c1a20, 0x7701: 0x002c2a88, 0x7702: 0x002c3288, 0x7703: 0x402c3220, + 0x7704: 0x0031c488, 0x7705: 0x4031c420, 0x7706: 0x002efa88, 0x7707: 0x002c4e88, + 0x7708: 0x402c4e20, 0x7709: 0x002c7288, 0x770a: 0x002c7a88, 0x770b: 0x002c8488, + 0x770c: 0x402c8420, 0x770d: 0xe000115c, 0x770e: 0x002cae88, 0x770f: 0x002c9a83, + 0x7710: 0x002cc288, 0x7711: 0x002d1688, 0x7712: 0x402d1620, 0x7713: 0x002d4488, + 0x7714: 0x002d5888, 0x7715: 0x402d7820, 0x7716: 0x002dc288, 0x7717: 0x002db688, + 0x7718: 0x002e0a88, 0x7719: 0x402e0a20, 0x771a: 0x402e3820, 0x771b: 0x402e7220, + 0x771c: 0x0030a088, 0x771d: 0x002eb488, 0x771e: 0x402ebc20, 0x771f: 0x002f1088, + 0x7720: 0xe0000e56, 0x7721: 0xe0000e53, 0x7722: 0x002d6088, 0x7723: 0x402d6020, + 0x7724: 0x002f3e88, 0x7725: 0x402f3e20, 0x7726: 0x002f8288, 0x7727: 0x0031b488, + 0x7728: 0x4031b420, 0x7729: 0x00300888, 0x772a: 0x40301220, 0x772b: 0x40304220, + 0x772c: 0x00304a88, 0x772d: 0x40304a20, 0x772e: 0x00305288, 0x772f: 0xe000105f, + 0x7730: 0xe000105c, 0x7731: 0x0030b488, 0x7732: 0x0030cc88, 0x7733: 0x00311888, + 0x7734: 0x40311820, 0x7735: 0x00313488, 0x7736: 0x40313420, 0x7737: 0x00316488, + 0x7738: 0x00316e88, 0x7739: 0x40316e20, 0x773a: 0x40317820, 0x773b: 0x4031a620, + 0x773c: 0x0031bc88, 0x773d: 0x4031bc20, 0x773e: 0xe0000fc9, 0x773f: 0x40319420, + // Block 0x1dd, offset 0x7740 + 0x7740: 0x40321220, 0x7741: 0x40321a20, 0x7742: 0x40322220, 0x7743: 0x40322a20, + 0x7744: 0xe0000ad5, 0x7745: 0xe0000ad1, 0x7746: 0xe0000acd, 0x7747: 0xf0000a0a, + 0x7748: 0xf000040a, 0x7749: 0xf0000404, 0x774a: 0xf0000a0a, 0x774b: 0xf000040a, + 0x774c: 0xf0000404, 0x774d: 0xe0000947, 0x774e: 0xe0000944, 0x774f: 0xe0002921, + 0x7750: 0xe0000c3a, 0x7751: 0xe0000dcc, 0x7752: 0xe0000dc9, 0x7753: 0xe0000ff3, + 0x7754: 0xe0000ff0, 0x7755: 0xe0002964, 0x7756: 0xe0002961, 0x7757: 0xe0002952, + 0x7758: 0xe000294f, 0x7759: 0xe000295e, 0x775a: 0xe000295b, 0x775b: 0xe0002958, + 0x775c: 0xe0002955, 0x775d: 0x402cae20, 0x775e: 0xe0000962, 0x775f: 0xe000095e, + 0x7760: 0xe0000976, 0x7761: 0xe0000972, 0x7762: 0xe00009f4, 0x7763: 0xe00009ef, + 0x7764: 0x002d3a88, 0x7765: 0x402d3a20, 0x7766: 0xe0000bbe, 0x7767: 0xe0000bbb, + 0x7768: 0xe0000c99, 0x7769: 0xe0000c96, 0x776a: 0xe0000e20, 0x776b: 0xe0000e1d, + 0x776c: 0xe0000e27, 0x776d: 0xe0000e23, 0x776e: 0xe0001162, 0x776f: 0xe000115f, + 0x7770: 0xe0000c8d, 0x7771: 0xf0000a0a, 0x7772: 0xf000040a, 0x7773: 0xf0000404, + 0x7774: 0xe0000bac, 0x7775: 0xe0000ba9, 0x7776: 0x002d7888, 0x7777: 0x00319488, + 0x7778: 0xe0000d57, 0x7779: 0xe0000d54, 0x777a: 0xe0000954, 0x777b: 0xe0000950, + 0x777c: 0xe00009ea, 0x777d: 0xe00009e5, 0x777e: 0xe0000e19, 0x777f: 0xe0000e15, + // Block 0x1de, offset 0x7780 + 0x7780: 0xe000098f, 0x7781: 0xe000098c, 0x7782: 0xe0000995, 0x7783: 0xe0000992, + 0x7784: 0xe0000b62, 0x7785: 0xe0000b5f, 0x7786: 0xe0000b68, 0x7787: 0xe0000b65, + 0x7788: 0xe0002937, 0x7789: 0xe0000c69, 0x778a: 0xe000293a, 0x778b: 0xe0000c6f, + 0x778c: 0xe0000e4a, 0x778d: 0xe0000e47, 0x778e: 0xe0000e50, 0x778f: 0xe0000e4d, + 0x7790: 0xe0000ee8, 0x7791: 0xe0000ee5, 0x7792: 0xe0000eee, 0x7793: 0xe0000eeb, + 0x7794: 0xe0001053, 0x7795: 0xe0001050, 0x7796: 0xe0001059, 0x7797: 0xe0001056, + 0x7798: 0xe0000f61, 0x7799: 0xe0000f5e, 0x779a: 0xe0000fa5, 0x779b: 0xe0000fa2, + 0x779c: 0x00312288, 0x779d: 0x40312220, 0x779e: 0xe0000bf4, 0x779f: 0xe0000bf1, + 0x77a0: 0x002ebc88, 0x77a1: 0x402c8c20, 0x77a2: 0x002f2288, 0x77a3: 0x402f2220, + 0x77a4: 0x00314088, 0x77a5: 0x40314020, 0x77a6: 0xe000096f, 0x77a7: 0xe000096c, + 0x77a8: 0xe0000b32, 0x77a9: 0xe0000b2f, 0x77aa: 0xe000294c, 0x77ab: 0xe0002949, + 0x77ac: 0xe0000dfd, 0x77ad: 0xe0000df9, 0x77ae: 0xe0000e04, 0x77af: 0xe0000e01, + 0x77b0: 0xe0000e0b, 0x77b1: 0xe0000e07, 0x77b2: 0xe0001129, 0x77b3: 0xe0001126, + 0x77b4: 0x402e5e20, 0x77b5: 0x402ed020, 0x77b6: 0x40305a20, 0x77b7: 0x402dd420, + 0x77b8: 0xe0000abf, 0x77b9: 0xe0000ec4, 0x77ba: 0x002be888, 0x77bb: 0x002c4488, + 0x77bc: 0x402c4420, 0x77bd: 0x002e3888, 0x77be: 0x00303e88, 0x77bf: 0x402ffc20, + // Block 0x1df, offset 0x77c0 + 0x77c0: 0x40315820, 0x77c1: 0x0031d488, 0x77c2: 0x4031d420, 0x77c3: 0x002c1a88, + 0x77c4: 0x00307c88, 0x77c5: 0x0030da88, 0x77c6: 0x002ca288, 0x77c7: 0x402ca220, + 0x77c8: 0x002dde88, 0x77c9: 0x402dde20, 0x77ca: 0x002f6a88, 0x77cb: 0x402f6a20, + 0x77cc: 0x002f8e88, 0x77cd: 0x402f8e20, 0x77ce: 0x00311088, 0x77cf: 0x40311020, + 0x77d0: 0x402bf020, 0x77d1: 0x402bf820, 0x77d2: 0x402c0220, 0x77d3: 0x402c2a20, + 0x77d4: 0x402efa20, 0x77d5: 0x402c5620, 0x77d6: 0x402c7220, 0x77d7: 0x402c7a20, + 0x77d8: 0x402ccc20, 0x77d9: 0x402c9a20, 0x77da: 0x402cd420, 0x77db: 0x402cc220, + 0x77dc: 0x402cdc20, 0x77dd: 0x402ce820, 0x77de: 0x402cf020, 0x77df: 0x402dee20, + 0x77e0: 0x402d4420, 0x77e1: 0x402d2a20, 0x77e2: 0x402d3220, 0x77e3: 0x402d5820, + 0x77e4: 0x402d0020, 0x77e5: 0x40308820, 0x77e6: 0x402d8020, 0x77e7: 0x402d8e20, + 0x77e8: 0x402db620, 0x77e9: 0x402dc220, 0x77ea: 0x402daa20, 0x77eb: 0x402e4220, + 0x77ec: 0x402e4a20, 0x77ed: 0x402e5420, 0x77ee: 0x402e6820, 0x77ef: 0x4030a020, + 0x77f0: 0x4030ac20, 0x77f1: 0x402e9020, 0x77f2: 0x402eb420, 0x77f3: 0x402ec820, + 0x77f4: 0x402ea620, 0x77f5: 0x402f1020, 0x77f6: 0x402eee20, 0x77f7: 0x402f1a20, + 0x77f8: 0x402f4c20, 0x77f9: 0x402f9820, 0x77fa: 0x402fa220, 0x77fb: 0x402fac20, + 0x77fc: 0x402fb620, 0x77fd: 0x402fbe20, 0x77fe: 0x402fc620, 0x77ff: 0x402fd020, + // Block 0x1e0, offset 0x7800 + 0x7800: 0xe00009b1, 0x7801: 0xe00009ae, 0x7802: 0xe0000a22, 0x7803: 0xe0000a1f, + 0x7804: 0xe0000a28, 0x7805: 0xe0000a25, 0x7806: 0xe0000a2e, 0x7807: 0xe0000a2b, + 0x7808: 0xe000260e, 0x7809: 0xe000260b, 0x780a: 0xe0000a8c, 0x780b: 0xe0000a89, + 0x780c: 0xe0000a98, 0x780d: 0xe0000a95, 0x780e: 0xe0000aa4, 0x780f: 0xe0000aa1, + 0x7810: 0xe0000a92, 0x7811: 0xe0000a8f, 0x7812: 0xe0000a9e, 0x7813: 0xe0000a9b, + 0x7814: 0xe0000b55, 0x7815: 0xe0000b51, 0x7816: 0xe0000b4d, 0x7817: 0xe0000b49, + 0x7818: 0xe0000b7c, 0x7819: 0xe0000b79, 0x781a: 0xe0000b82, 0x781b: 0xe0000b7f, + 0x781c: 0xe0000b39, 0x781d: 0xe0000b35, 0x781e: 0xe0000b8c, 0x781f: 0xe0000b89, + 0x7820: 0xe0000bd0, 0x7821: 0xe0000bcd, 0x7822: 0xe0000c00, 0x7823: 0xe0000bfd, + 0x7824: 0xe0000c0c, 0x7825: 0xe0000c09, 0x7826: 0xe0000bfa, 0x7827: 0xe0000bf7, + 0x7828: 0xe0000c06, 0x7829: 0xe0000c03, 0x782a: 0xe0000c12, 0x782b: 0xe0000c0f, + 0x782c: 0xe0002940, 0x782d: 0xe0000c7b, 0x782e: 0xe0002927, 0x782f: 0xe0000c46, + 0x7830: 0xe0000c93, 0x7831: 0xe0000c90, 0x7832: 0xe0000cab, 0x7833: 0xe0000ca8, + 0x7834: 0xe0000cb1, 0x7835: 0xe0000cae, 0x7836: 0xe0000cde, 0x7837: 0xe0000cdb, + 0x7838: 0xe0000ce5, 0x7839: 0xe0000ce1, 0x783a: 0xe0000cf2, 0x783b: 0xe0000cef, + 0x783c: 0xe0000cec, 0x783d: 0xe0000ce9, 0x783e: 0xe0000d1e, 0x783f: 0xe0000d1b, + // Block 0x1e1, offset 0x7840 + 0x7840: 0xe0000d24, 0x7841: 0xe0000d21, 0x7842: 0xe0000d2a, 0x7843: 0xe0000d27, + 0x7844: 0xe0000d69, 0x7845: 0xe0000d66, 0x7846: 0xe0000d7b, 0x7847: 0xe0000d78, + 0x7848: 0xe0000d87, 0x7849: 0xe0000d84, 0x784a: 0xe0000d81, 0x784b: 0xe0000d7e, + 0x784c: 0xe0000ded, 0x784d: 0xe0000de9, 0x784e: 0xe0002946, 0x784f: 0xe0002943, + 0x7850: 0xe0000e3d, 0x7851: 0xe0000e39, 0x7852: 0xe0000e35, 0x7853: 0xe0000e31, + 0x7854: 0xe0000ea7, 0x7855: 0xe0000ea4, 0x7856: 0xe0000ead, 0x7857: 0xe0000eaa, + 0x7858: 0xe0000ed6, 0x7859: 0xe0000ed3, 0x785a: 0xe0000ef4, 0x785b: 0xe0000ef1, + 0x785c: 0xe0000efb, 0x785d: 0xe0000ef7, 0x785e: 0xe0000f02, 0x785f: 0xe0000eff, + 0x7860: 0xe0000f41, 0x7861: 0xe0000f3e, 0x7862: 0xe0000f53, 0x7863: 0xe0000f50, + 0x7864: 0xe0000f26, 0x7865: 0xe0000f22, 0x7866: 0xe0000f3a, 0x7867: 0xe0000f36, + 0x7868: 0xe0000f5a, 0x7869: 0xe0000f56, 0x786a: 0xe0000f93, 0x786b: 0xe0000f90, + 0x786c: 0xe0000f9f, 0x786d: 0xe0000f9c, 0x786e: 0xe0000fb1, 0x786f: 0xe0000fae, + 0x7870: 0xe0000fab, 0x7871: 0xe0000fa8, 0x7872: 0xe0001093, 0x7873: 0xe0001090, + 0x7874: 0xe000109f, 0x7875: 0xe000109c, 0x7876: 0xe0001099, 0x7877: 0xe0001096, + 0x7878: 0xe0001032, 0x7879: 0xe000102e, 0x787a: 0xe0002964, 0x787b: 0xe0002961, + 0x787c: 0xe00010a9, 0x787d: 0xe00010a6, 0x787e: 0xe00010af, 0x787f: 0xe00010ac, + // Block 0x1e2, offset 0x7880 + 0x7880: 0xe00010d2, 0x7881: 0xe00010cf, 0x7882: 0xe00010cc, 0x7883: 0xe00010c9, + 0x7884: 0xe00010e1, 0x7885: 0xe00010de, 0x7886: 0xe00010e7, 0x7887: 0xe00010e4, + 0x7888: 0xe00010ed, 0x7889: 0xe00010ea, 0x788a: 0xe0002912, 0x788b: 0xe000290f, + 0x788c: 0xe000290c, 0x788d: 0xe0002909, 0x788e: 0xe0001123, 0x788f: 0xe0001120, + 0x7890: 0xe0001141, 0x7891: 0xe000113e, 0x7892: 0xe0001153, 0x7893: 0xe0001150, + 0x7894: 0xe0001159, 0x7895: 0xe0001156, 0x7896: 0xe0000c15, 0x7897: 0xe0000f8d, + 0x7898: 0xe00010db, 0x7899: 0xe0001111, 0x789a: 0xf0000404, 0x789b: 0xe0000f70, + 0x789c: 0x40300420, 0x789d: 0x40300620, 0x789e: 0xe0000f7f, 0x789f: 0x402c9620, + 0x78a0: 0xe000099b, 0x78a1: 0xe0000998, 0x78a2: 0xe0000989, 0x78a3: 0xe0000986, + 0x78a4: 0xe0000928, 0x78a5: 0xe0000924, 0x78a6: 0xe0000930, 0x78a7: 0xe000092c, + 0x78a8: 0xe0000940, 0x78a9: 0xe000093c, 0x78aa: 0xe0000938, 0x78ab: 0xe0000934, + 0x78ac: 0xe00009aa, 0x78ad: 0xe00009a6, 0x78ae: 0xe0000902, 0x78af: 0xe00008fe, + 0x78b0: 0xe000090a, 0x78b1: 0xe0000906, 0x78b2: 0xe000091a, 0x78b3: 0xe0000916, + 0x78b4: 0xe0000912, 0x78b5: 0xe000090e, 0x78b6: 0xe00009a2, 0x78b7: 0xe000099e, + 0x78b8: 0xe0000b6e, 0x78b9: 0xe0000b6b, 0x78ba: 0xe0000b5c, 0x78bb: 0xe0000b59, + 0x78bc: 0xe0000b26, 0x78bd: 0xe0000b23, 0x78be: 0xe0000afb, 0x78bf: 0xe0000af7, + // Block 0x1e3, offset 0x78c0 + 0x78c0: 0xe0000b03, 0x78c1: 0xe0000aff, 0x78c2: 0xe0000b13, 0x78c3: 0xe0000b0f, + 0x78c4: 0xe0000b0b, 0x78c5: 0xe0000b07, 0x78c6: 0xe0000b75, 0x78c7: 0xe0000b71, + 0x78c8: 0xe0002934, 0x78c9: 0xe0000c63, 0x78ca: 0xe000293d, 0x78cb: 0xe0000c75, + 0x78cc: 0xe0000e84, 0x78cd: 0xe0000e81, 0x78ce: 0xe0000e44, 0x78cf: 0xe0000e41, + 0x78d0: 0xe0000dad, 0x78d1: 0xe0000da9, 0x78d2: 0xe0000db5, 0x78d3: 0xe0000db1, + 0x78d4: 0xe0000dc5, 0x78d5: 0xe0000dc1, 0x78d6: 0xe0000dbd, 0x78d7: 0xe0000db9, + 0x78d8: 0xe0000e8b, 0x78d9: 0xe0000e87, 0x78da: 0xe0000e5d, 0x78db: 0xe0000e59, + 0x78dc: 0xe0000e65, 0x78dd: 0xe0000e61, 0x78de: 0xe0000e75, 0x78df: 0xe0000e71, + 0x78e0: 0xe0000e6d, 0x78e1: 0xe0000e69, 0x78e2: 0xe0000e7d, 0x78e3: 0xe0000e79, + 0x78e4: 0xe000108d, 0x78e5: 0xe000108a, 0x78e6: 0xe000104d, 0x78e7: 0xe000104a, + 0x78e8: 0xe0001066, 0x78e9: 0xe0001062, 0x78ea: 0xe000106e, 0x78eb: 0xe000106a, + 0x78ec: 0xe000107e, 0x78ed: 0xe000107a, 0x78ee: 0xe0001076, 0x78ef: 0xe0001072, + 0x78f0: 0xe0001086, 0x78f1: 0xe0001082, 0x78f2: 0xe0001108, 0x78f3: 0xe0001105, + 0x78f4: 0xe0001135, 0x78f5: 0xe0001132, 0x78f6: 0xe000112f, 0x78f7: 0xe000112c, + 0x78f8: 0xe000111d, 0x78f9: 0xe000111a, 0x78fa: 0xe0000d0a, 0x78fb: 0xe0000d07, + 0x78fc: 0x0030d888, 0x78fd: 0x4030d820, 0x78fe: 0x00312088, 0x78ff: 0x40312020, + // Block 0x1e4, offset 0x7900 + 0x7900: 0x00093685, 0x7901: 0x40083620, 0x7902: 0x40083820, 0x7903: 0x40083a20, + 0x7904: 0x40083c20, 0x7905: 0x002c628b, 0x7906: 0x002c6285, 0x7907: 0x002c9885, + 0x7908: 0x002d9a85, 0x7909: 0x002dcc85, 0x790a: 0x40083e20, 0x790b: 0x400a6e20, + 0x790c: 0x40084020, 0x790d: 0xe00009c4, 0x790e: 0x402d1e20, 0x790f: 0x40084220, + 0x7910: 0xe00002cb, 0x7911: 0xe00002d3, 0x7912: 0xe00002b2, 0x7913: 0xe00002bb, + 0x7914: 0xe00003cd, 0x7915: 0xe00002c3, 0x7916: 0xe00003d1, 0x7917: 0xe00004ab, + 0x7918: 0xe0000579, 0x7919: 0xe00002c7, 0x791a: 0xe0000640, 0x791b: 0xe00002cf, + 0x791c: 0xe00004af, 0x791d: 0xe0000644, 0x791e: 0xe0000798, 0x791f: 0xf0001e1e, + 0x7920: 0x002d9a8a, 0x7921: 0xe00027d4, 0x7922: 0xe00027db, 0x7923: 0xe00027ee, + 0x7924: 0x0030be8a, 0x7925: 0xe0002848, 0x7926: 0xe000284f, 0x7927: 0xe00010bb, + 0x7928: 0xe00027f4, 0x7929: 0x0030f68a, 0x792a: 0xe0002883, 0x792b: 0xe000288a, + 0x792c: 0x002e228a, 0x792d: 0x002c3a8a, 0x792e: 0x002c628a, 0x792f: 0x002e828a, + 0x7930: 0x002d9a84, 0x7931: 0xf0001f04, 0x7932: 0xf0000404, 0x7933: 0xf0001f04, + 0x7934: 0x0030be84, 0x7935: 0xf0001f04, 0x7936: 0xf0000404, 0x7937: 0xe00010b6, + 0x7938: 0xe00027f1, 0x7939: 0x0030f684, 0x793a: 0xe0002880, 0x793b: 0xe0002886, + 0x793c: 0x002e2284, 0x793d: 0x002c3a84, 0x793e: 0x002c6284, 0x793f: 0x002e8284, + // Block 0x1e5, offset 0x7940 + 0x7940: 0xe0000024, 0x7941: 0xe0000029, 0x7942: 0xe000002e, 0x7943: 0xe0000033, + 0x7944: 0xe0000038, 0x7945: 0xe000003d, 0x7946: 0xe0000042, 0x7947: 0xe0000047, + 0x7948: 0xf0001f04, 0x7949: 0xf0001f04, 0x794a: 0xf0001f04, 0x794b: 0xf0001f04, + 0x794c: 0xf0001f04, 0x794d: 0xf0001f04, 0x794e: 0xf0001f04, 0x794f: 0xf0001f04, + 0x7950: 0xf0001f04, 0x7951: 0xf0000404, 0x7952: 0xf0000404, 0x7953: 0xf0000404, + 0x7954: 0xf0000404, 0x7955: 0xf0000404, 0x7956: 0xf0000404, 0x7957: 0xf0000404, + 0x7958: 0xf0000404, 0x7959: 0xf0000404, 0x795a: 0xf0000404, 0x795b: 0xf0000404, + 0x795c: 0xf0000404, 0x795d: 0xf0000404, 0x795e: 0xf0000404, 0x795f: 0xf0000404, + 0x7960: 0xf0000404, 0x7961: 0xf0000404, 0x7962: 0xf0000404, 0x7963: 0xf0000404, + 0x7964: 0xf0000404, 0x7965: 0xf0000404, 0x7966: 0xf0000404, 0x7967: 0xf0000404, + 0x7968: 0xf0000404, 0x7969: 0xf0000404, 0x796a: 0xf0000404, 0x796b: 0xf0000404, + 0x796c: 0xe00024c7, 0x796d: 0xf0000404, 0x796e: 0xf0000404, 0x796f: 0xf0000404, + 0x7970: 0xf0000404, 0x7971: 0xf0000404, 0x7972: 0xf0000404, 0x7973: 0xe00024e7, + 0x7974: 0xf0000404, 0x7975: 0xf0000404, 0x7976: 0x002bde8c, 0x7977: 0x002c0a8c, + 0x7978: 0x002c3a8c, 0x7979: 0x002c628c, 0x797a: 0x002c988c, 0x797b: 0x002d088c, + 0x797c: 0x002d228c, 0x797d: 0x002d688c, 0x797e: 0x002d9a8c, 0x797f: 0x002dcc8c, + // Block 0x1e6, offset 0x7980 + 0x7980: 0xe000230b, 0x7981: 0xe00022f8, 0x7982: 0xe00022fc, 0x7983: 0xe0002311, + 0x7984: 0xe0002316, 0x7985: 0xe000231d, 0x7986: 0xe0002321, 0x7987: 0xe0002325, + 0x7988: 0xe000232b, 0x7989: 0xf0001c1c, 0x798a: 0xe0002330, 0x798b: 0xe000233c, + 0x798c: 0xe0002340, 0x798d: 0xe0002337, 0x798e: 0xe0002346, 0x798f: 0xe000234b, + 0x7990: 0xe000234f, 0x7991: 0xe0002353, 0x7992: 0xf0001c1c, 0x7993: 0xe000235e, + 0x7994: 0xe0002358, 0x7995: 0xf0001c1c, 0x7996: 0xe0002363, 0x7997: 0xe000236d, + 0x7998: 0xf0001f04, 0x7999: 0xf0001f04, 0x799a: 0xf0001f04, 0x799b: 0xf0001f04, + 0x799c: 0xf0001f04, 0x799d: 0xf0001f04, 0x799e: 0xf0001f04, 0x799f: 0xf0001f04, + 0x79a0: 0xf0001f04, 0x79a1: 0xf0001f04, 0x79a2: 0xf0000404, 0x79a3: 0xf0000404, + 0x79a4: 0xf0000404, 0x79a5: 0xf0000404, 0x79a6: 0xf0000404, 0x79a7: 0xf0000404, + 0x79a8: 0xf0000404, 0x79a9: 0xf0000404, 0x79aa: 0xf0000404, 0x79ab: 0xf0000404, + 0x79ac: 0xf0000404, 0x79ad: 0xf0000404, 0x79ae: 0xf0000404, 0x79af: 0xf0000404, + 0x79b0: 0xf0000404, 0x79b1: 0xe0000c1e, 0x79b2: 0xf0001c1c, 0x79b3: 0xf0001d1d, + 0x79b4: 0xe0000a31, 0x79b5: 0xf0001d1c, 0x79b6: 0xf0001c1c, 0x79b7: 0xf0001c1c, + 0x79b8: 0xe0000ac2, 0x79b9: 0xe0000ac6, 0x79ba: 0xe00027e8, 0x79bb: 0xf0001c1c, + 0x79bc: 0xf0001c1c, 0x79bd: 0xf0001c1c, 0x79be: 0xf0001c1c, 0x79bf: 0xe0002431, + // Block 0x1e7, offset 0x79c0 + 0x79c0: 0xf0001d1c, 0x79c1: 0xf0001d1d, 0x79c2: 0xe00009b7, 0x79c3: 0xe00024f3, + 0x79c4: 0xf0001c1c, 0x79c5: 0xf0001c1c, 0x79c6: 0xe0000a66, 0x79c7: 0xe0000a7a, + 0x79c8: 0xf0001d1c, 0x79c9: 0xf0001c1d, 0x79ca: 0xf0001c1c, 0x79cb: 0xf0001d1d, + 0x79cc: 0xf0001c1c, 0x79cd: 0xf0001d1d, 0x79ce: 0xf0001d1d, 0x79cf: 0xf0001c1c, + 0x79d0: 0xf0001c1c, 0x79d1: 0xf0001c1c, 0x79d2: 0xe0000d0d, 0x79d3: 0xe0002818, + 0x79d4: 0xf0001c1c, 0x79d5: 0xe0000d3a, 0x79d6: 0xe0000d46, 0x79d7: 0xf0001d1d, + 0x79d8: 0xe0000eb0, 0x79d9: 0xe0000eb8, 0x79da: 0xf0001d1d, 0x79db: 0xf0001c1c, + 0x79dc: 0xf0001c1d, 0x79dd: 0xf0001c1d, 0x79de: 0xe00010b2, 0x79df: 0xe00009c8, + 0x79e0: 0xf0001f04, 0x79e1: 0xf0001f04, 0x79e2: 0xf0001f04, 0x79e3: 0xf0001f04, + 0x79e4: 0xf0001f04, 0x79e5: 0xf0001f04, 0x79e6: 0xf0001f04, 0x79e7: 0xf0001f04, + 0x79e8: 0xf0001f04, 0x79e9: 0xf0000404, 0x79ea: 0xf0000404, 0x79eb: 0xf0000404, + 0x79ec: 0xf0000404, 0x79ed: 0xf0000404, 0x79ee: 0xf0000404, 0x79ef: 0xf0000404, + 0x79f0: 0xf0000404, 0x79f1: 0xf0000404, 0x79f2: 0xf0000404, 0x79f3: 0xf0000404, + 0x79f4: 0xf0000404, 0x79f5: 0xf0000404, 0x79f6: 0xf0000404, 0x79f7: 0xf0000404, + 0x79f8: 0xf0000404, 0x79f9: 0xf0000404, 0x79fa: 0xf0000404, 0x79fb: 0xf0000404, + 0x79fc: 0xf0000404, 0x79fd: 0xf0000404, 0x79fe: 0xf0000404, 0x79ff: 0xe0000bdf, + // Block 0x1e8, offset 0x7a00 + 0x7a00: 0xf0001f04, 0x7a01: 0xf0001f04, 0x7a02: 0xf0001f04, 0x7a03: 0xf0001f04, + 0x7a04: 0xf0001f04, 0x7a05: 0xf0001f04, 0x7a06: 0xf0001f04, 0x7a07: 0xf0001f04, + 0x7a08: 0xf0001f04, 0x7a09: 0xf0001f04, 0x7a0a: 0xf0001f04, + 0x7a10: 0xf0000a04, 0x7a11: 0xf0000a04, 0x7a12: 0xf0000a04, 0x7a13: 0xf0000a04, + 0x7a14: 0xf0000a04, 0x7a15: 0xf0000a04, 0x7a16: 0xf0000a04, 0x7a17: 0xf0000a04, + 0x7a18: 0xe00024b3, 0x7a19: 0xf0000a04, 0x7a1a: 0xf0000a04, 0x7a1b: 0xf0000a04, + 0x7a1c: 0xf0000a04, 0x7a1d: 0xf0000a04, 0x7a1e: 0xf0000a04, 0x7a1f: 0xf0000a04, + 0x7a20: 0xe00024cb, 0x7a21: 0xf0000a04, 0x7a22: 0xf0000a04, 0x7a23: 0xf0000a04, + 0x7a24: 0xf0000a04, 0x7a25: 0xf0000a04, 0x7a26: 0xf0000a04, 0x7a27: 0xe00024eb, + 0x7a28: 0xf0000a04, 0x7a29: 0xf0000a04, 0x7a2a: 0xf0000a04, 0x7a2b: 0x002c3a8c, + 0x7a2c: 0x002f7a8c, 0x7a2d: 0xf0000c0c, 0x7a2e: 0xf0000c0c, + 0x7a30: 0x002bde9d, 0x7a31: 0x002c0a9d, 0x7a32: 0x002c3a9d, 0x7a33: 0x002c629d, + 0x7a34: 0x002c989d, 0x7a35: 0x002d089d, 0x7a36: 0x002d229d, 0x7a37: 0x002d689d, + 0x7a38: 0x002d9a9d, 0x7a39: 0x002dcc9d, 0x7a3a: 0x002dfe9d, 0x7a3b: 0x002e229d, + 0x7a3c: 0x002e829d, 0x7a3d: 0x002e9e9d, 0x7a3e: 0x002ee29d, 0x7a3f: 0x002f2c9d, + // Block 0x1e9, offset 0x7a40 + 0x7a40: 0xe00014bd, 0x7a41: 0x0033b483, 0x7a42: 0x00339688, 0x7a43: 0x0033a288, + 0x7a44: 0x0033c288, 0x7a45: 0x0033fc88, 0x7a46: 0xc02a0071, 0x7a47: 0x00343688, + 0x7a48: 0x00344688, 0x7a49: 0x00349a88, 0x7a4a: 0x0034e488, 0x7a4b: 0x00356288, + 0x7a4c: 0x00356a88, 0x7a4d: 0xe00014cf, 0x7a4e: 0x00357a88, 0x7a4f: 0x00365488, + 0x7a50: 0xc0090041, 0x7a51: 0x00335288, 0x7a52: 0x00335a88, 0x7a53: 0xc0130092, + 0x7a54: 0x00338a88, 0x7a55: 0xc34c0041, 0x7a56: 0xc01c0071, 0x7a57: 0xc0200071, + 0x7a58: 0xc0250041, 0x7a59: 0x00343e88, 0x7a5a: 0xc0370092, 0x7a5b: 0x00348488, + 0x7a5c: 0x0034a888, 0x7a5d: 0x0034ba88, 0x7a5e: 0xc02e0071, 0x7a5f: 0x00350e88, + 0x7a60: 0x00352888, 0x7a61: 0x00353a88, 0x7a62: 0x00354c88, 0x7a63: 0xc03e00f1, + 0x7a64: 0x0035ac88, 0x7a65: 0x0035b488, 0x7a66: 0x00360288, 0x7a67: 0xc0440071, + 0x7a68: 0x00365c88, 0x7a69: 0x00366688, 0x7a6a: 0x00367488, 0x7a6b: 0xc0480071, + 0x7a6c: 0x00368e88, 0x7a6d: 0xc04c0071, 0x7a6e: 0x0036b888, 0x7a6f: 0x0036c488, + 0x7a70: 0xc0060041, 0x7a71: 0x40335220, 0x7a72: 0x40335a20, 0x7a73: 0xc0100092, + 0x7a74: 0x40338a20, 0x7a75: 0xc3490041, 0x7a76: 0xc01a0071, 0x7a77: 0xc01e0071, + 0x7a78: 0xc0220041, 0x7a79: 0x40343e20, 0x7a7a: 0xc0340092, 0x7a7b: 0x40348420, + 0x7a7c: 0x4034a820, 0x7a7d: 0x4034ba20, 0x7a7e: 0xc02c0071, 0x7a7f: 0x40350e20, + // Block 0x1ea, offset 0x7a80 + 0x7a80: 0x40352820, 0x7a81: 0x40353a20, 0x7a82: 0x40354c20, 0x7a83: 0xc03a00f1, + 0x7a84: 0x4035ac20, 0x7a85: 0x4035b420, 0x7a86: 0x40360220, 0x7a87: 0xc0420071, + 0x7a88: 0x40365c20, 0x7a89: 0x40366620, 0x7a8a: 0x40367420, 0x7a8b: 0xc0460071, + 0x7a8c: 0x40368e20, 0x7a8d: 0xc04a0071, 0x7a8e: 0x4036b820, 0x7a8f: 0x4036c420, + 0x7a90: 0xe00014ba, 0x7a91: 0x4033b420, 0x7a92: 0x40339620, 0x7a93: 0x4033a220, + 0x7a94: 0x4033c220, 0x7a95: 0x4033fc20, 0x7a96: 0xc0280071, 0x7a97: 0x40343620, + 0x7a98: 0x40344620, 0x7a99: 0x40349a20, 0x7a9a: 0x4034e420, 0x7a9b: 0x40356220, + 0x7a9c: 0x40356a20, 0x7a9d: 0xe00014cc, 0x7a9e: 0x40357a20, 0x7a9f: 0x40365420, + 0x7aa0: 0x0035e088, 0x7aa1: 0x4035e020, 0x7aa2: 0x00369e88, 0x7aa3: 0x40369e20, + 0x7aa4: 0x0036ce88, 0x7aa5: 0x4036ce20, 0x7aa6: 0x0036d688, 0x7aa7: 0x4036d620, + 0x7aa8: 0x0036ea88, 0x7aa9: 0x4036ea20, 0x7aaa: 0x0036e088, 0x7aab: 0x4036e020, + 0x7aac: 0x0036f488, 0x7aad: 0x4036f420, 0x7aae: 0x0036fc88, 0x7aaf: 0x4036fc20, + 0x7ab0: 0x00370488, 0x7ab1: 0x40370420, 0x7ab2: 0x00370c88, 0x7ab3: 0x40370c20, + 0x7ab4: 0xc0500131, 0x7ab5: 0xc04e0131, 0x7ab6: 0x00371c88, 0x7ab7: 0x40371c20, + 0x7ab8: 0x0035a488, 0x7ab9: 0x4035a420, 0x7aba: 0x0035fa88, 0x7abb: 0x4035fa20, + 0x7abc: 0x0035f288, 0x7abd: 0x4035f220, 0x7abe: 0x0035e888, 0x7abf: 0x4035e820, + // Block 0x1eb, offset 0x7ac0 + 0x7ac1: 0x40409c20, 0x7ac2: 0x40409820, 0x7ac3: 0x40409a20, + 0x7ac5: 0x40407c20, 0x7ac6: 0x40407e20, 0x7ac7: 0x40408020, + 0x7ac8: 0x40408220, 0x7ac9: 0x40408420, 0x7aca: 0x40408620, 0x7acb: 0x40408820, + 0x7acc: 0x40408c20, 0x7acf: 0x40409020, + 0x7ad0: 0x40409220, 0x7ad3: 0x40409420, + 0x7ad4: 0x40409620, 0x7ad5: 0x40409820, 0x7ad6: 0x40409a20, 0x7ad7: 0x40409c20, + 0x7ad8: 0x40409e20, 0x7ad9: 0x4040a020, 0x7ada: 0x4040a220, 0x7adb: 0x4040a420, + 0x7adc: 0x4040a620, 0x7add: 0x4040a820, 0x7ade: 0x4040aa20, 0x7adf: 0x4040ac20, + 0x7ae0: 0x4040ae20, 0x7ae1: 0x4040b020, 0x7ae2: 0x4040b220, 0x7ae3: 0x4040b420, + 0x7ae4: 0x4040b620, 0x7ae5: 0x4040b820, 0x7ae6: 0x4040ba20, 0x7ae7: 0x4040bc20, + 0x7ae8: 0x4040be20, 0x7aea: 0x4040c020, 0x7aeb: 0x4040c220, + 0x7aec: 0x4040c420, 0x7aed: 0x4040c620, 0x7aee: 0x4040c820, 0x7aef: 0x4040ca20, + 0x7af0: 0x4040cc20, 0x7af2: 0x4040d020, + 0x7af6: 0x4040d420, 0x7af7: 0x4040d620, + 0x7af8: 0x4040d820, 0x7af9: 0x4040da20, + 0x7afc: 0xa070f102, 0x7afd: 0x4040dc20, 0x7afe: 0x4040de20, 0x7aff: 0x4040e020, + // Block 0x1ec, offset 0x7b00 + 0x7b00: 0xa0000000, 0x7b01: 0xa0000000, 0x7b02: 0xa0000000, 0x7b03: 0xa0000000, + 0x7b04: 0xa0000000, 0x7b05: 0xa0000000, 0x7b06: 0xa0000000, 0x7b07: 0xa0000000, + 0x7b08: 0xa0000000, 0x7b09: 0x40020020, 0x7b0a: 0x40020220, 0x7b0b: 0x40020420, + 0x7b0c: 0x40020620, 0x7b0d: 0x40020820, 0x7b0e: 0xa0000000, 0x7b0f: 0xa0000000, + 0x7b10: 0xa0000000, 0x7b11: 0xa0000000, 0x7b12: 0xa0000000, 0x7b13: 0xa0000000, + 0x7b14: 0xa0000000, 0x7b15: 0xa0000000, 0x7b16: 0xa0000000, 0x7b17: 0xa0000000, + 0x7b18: 0xa0000000, 0x7b19: 0xa0000000, 0x7b1a: 0xa0000000, 0x7b1b: 0xa0000000, + 0x7b1c: 0xa0000000, 0x7b1d: 0xa0000000, 0x7b1e: 0xa0000000, 0x7b1f: 0xa0000000, + 0x7b20: 0x40021220, 0x7b21: 0x4002ba20, 0x7b22: 0x4003e020, 0x7b23: 0x4004ea20, + 0x7b24: 0x4027de20, 0x7b25: 0x4004ec20, 0x7b26: 0x4004e620, 0x7b27: 0x4003d220, + 0x7b28: 0x4003f420, 0x7b29: 0x4003f620, 0x7b2a: 0x4004d820, 0x7b2b: 0x40093820, + 0x7b2c: 0x40024020, 0x7b2d: 0x40021a20, 0x7b2e: 0x4002e420, 0x7b2f: 0x4004e220, + 0x7b30: 0x4029cc20, 0x7b31: 0x4029ce20, 0x7b32: 0x4029d020, 0x7b33: 0x4029d220, + 0x7b34: 0x4029d420, 0x7b35: 0x4029d620, 0x7b36: 0x4029d820, 0x7b37: 0x4029da20, + 0x7b38: 0x4029dc20, 0x7b39: 0x4029de20, 0x7b3a: 0x40026c20, 0x7b3b: 0x40026220, + 0x7b3c: 0x40094020, 0x7b3d: 0x40094220, 0x7b3e: 0x40094420, 0x7b3f: 0x4002c420, + // Block 0x1ed, offset 0x7b40 + 0x7b40: 0x4004d620, 0x7b41: 0x002bde88, 0x7b42: 0x002c0a88, 0x7b43: 0x002c3a88, + 0x7b44: 0x002c6288, 0x7b45: 0x002c9888, 0x7b46: 0x002d0888, 0x7b47: 0x002d2288, + 0x7b48: 0x002d6888, 0x7b49: 0x002d9a88, 0x7b4a: 0x002dcc88, 0x7b4b: 0x002dfe88, + 0x7b4c: 0xc3520002, 0x7b4d: 0x002e8288, 0x7b4e: 0x002e9e88, 0x7b4f: 0x002ee288, + 0x7b50: 0x002f2c88, 0x7b51: 0x002f5688, 0x7b52: 0x002f7a88, 0x7b53: 0x002fe688, + 0x7b54: 0x00302c88, 0x7b55: 0x00306c88, 0x7b56: 0x0030be88, 0x7b57: 0x0030e288, + 0x7b58: 0x0030f688, 0x7b59: 0x00310088, 0x7b5a: 0x00312a88, 0x7b5b: 0x4003f820, + 0x7b5c: 0x4004e420, 0x7b5d: 0x4003fa20, 0x7b5e: 0x40062420, 0x7b5f: 0x40021620, + 0x7b60: 0x40061e20, 0x7b61: 0x402bde20, 0x7b62: 0x402c0a20, 0x7b63: 0x402c3a20, + 0x7b64: 0x402c6220, 0x7b65: 0x402c9820, 0x7b66: 0x402d0820, 0x7b67: 0x402d2220, + 0x7b68: 0x402d6820, 0x7b69: 0x402d9a20, 0x7b6a: 0x402dcc20, 0x7b6b: 0x402dfe20, + 0x7b6c: 0xc34f0002, 0x7b6d: 0x402e8220, 0x7b6e: 0x402e9e20, 0x7b6f: 0x402ee220, + 0x7b70: 0x402f2c20, 0x7b71: 0x402f5620, 0x7b72: 0x402f7a20, 0x7b73: 0x402fe620, + 0x7b74: 0x40302c20, 0x7b75: 0x40306c20, 0x7b76: 0x4030be20, 0x7b77: 0x4030e220, + 0x7b78: 0x4030f620, 0x7b79: 0x40310020, 0x7b7a: 0x40312a20, 0x7b7b: 0x4003fc20, + 0x7b7c: 0x40094820, 0x7b7d: 0x4003fe20, 0x7b7e: 0x40094c20, 0x7b7f: 0xa0000000, + // Block 0x1ee, offset 0x7b80 + 0x7b80: 0xe0000983, 0x7b81: 0xe0000980, 0x7b82: 0xe00008fb, 0x7b83: 0xe00008f8, + 0x7b84: 0xe000097d, 0x7b85: 0xe000097a, 0x7b86: 0xe0000a38, 0x7b87: 0xe0000a35, + 0x7b88: 0xe0000a3e, 0x7b89: 0xe0000a3b, 0x7b8a: 0xe0000a4a, 0x7b8b: 0xe0000a47, + 0x7b8c: 0xe0000a44, 0x7b8d: 0xe0000a41, 0x7b8e: 0xe0000a86, 0x7b8f: 0xe0000a83, + 0x7b90: 0xe0000aaa, 0x7b91: 0xe0000aa7, 0x7b92: 0xe0000b46, 0x7b93: 0xe0000b43, + 0x7b94: 0xe0000aee, 0x7b95: 0xe0000aeb, 0x7b96: 0xe0000b2c, 0x7b97: 0xe0000b29, + 0x7b98: 0xe0000b40, 0x7b99: 0xe0000b3d, 0x7b9a: 0xe0000b1a, 0x7b9b: 0xe0000b17, + 0x7b9c: 0xe0000bb8, 0x7b9d: 0xe0000bb5, 0x7b9e: 0xe0000bb2, 0x7b9f: 0xe0000baf, + 0x7ba0: 0xe0000bc4, 0x7ba1: 0xe0000bc1, 0x7ba2: 0xe0000bca, 0x7ba3: 0xe0000bc7, + 0x7ba4: 0xe0000bee, 0x7ba5: 0xe0000beb, 0x7ba6: 0xe0000c1b, 0x7ba7: 0xe0000c18, + 0x7ba8: 0xe0000c51, 0x7ba9: 0xe0000c4e, 0x7baa: 0xe0000c60, 0x7bab: 0xe0000c5d, + 0x7bac: 0xe0000c31, 0x7bad: 0xe0000c2e, 0x7bae: 0xe0000c5a, 0x7baf: 0xe0000c57, + 0x7bb0: 0xe0000c54, 0x7bb1: 0x402da220, 0x7bb2: 0xf0000a0a, 0x7bb3: 0xf0000404, + 0x7bb4: 0xe0000c8a, 0x7bb5: 0xe0000c87, 0x7bb6: 0xe0000c9f, 0x7bb7: 0xe0000c9c, + 0x7bb8: 0x402f7220, 0x7bb9: 0xe0000ccc, 0x7bba: 0xe0000cc9, 0x7bbb: 0xe0000cd8, + 0x7bbc: 0xe0000cd5, 0x7bbd: 0xe0000cd2, 0x7bbe: 0xe0000ccf, 0x7bbf: 0x002e22a3, + // Block 0x1ef, offset 0x7bc0 + 0x7bc0: 0x402e2221, 0x7bc1: 0xe0000cf8, 0x7bc2: 0xe0000cf5, 0x7bc3: 0xe0000d51, + 0x7bc4: 0xe0000d4e, 0x7bc5: 0xe0000d6f, 0x7bc6: 0xe0000d6c, 0x7bc7: 0xe0000d5d, + 0x7bc8: 0xe0000d5a, 0x7bc9: 0xf0000404, 0x7bca: 0x002eda88, 0x7bcb: 0x402eda20, + 0x7bcc: 0xe0000e2e, 0x7bcd: 0xe0000e2b, 0x7bce: 0xe0000da0, 0x7bcf: 0xe0000d9d, + 0x7bd0: 0xe0000de0, 0x7bd1: 0xe0000ddd, 0x7bd2: 0xe0000e93, 0x7bd3: 0xe0000e8f, + 0x7bd4: 0xe0000eca, 0x7bd5: 0xe0000ec7, 0x7bd6: 0xe0000edc, 0x7bd7: 0xe0000ed9, + 0x7bd8: 0xe0000ed0, 0x7bd9: 0xe0000ecd, 0x7bda: 0xe0000f1f, 0x7bdb: 0xe0000f1c, + 0x7bdc: 0xe0000f2d, 0x7bdd: 0xe0000f2a, 0x7bde: 0xe0000f47, 0x7bdf: 0xe0000f44, + 0x7be0: 0xe0000f33, 0x7be1: 0xe0000f30, 0x7be2: 0xe0000f99, 0x7be3: 0xe0000f96, + 0x7be4: 0xe0000f8a, 0x7be5: 0xe0000f87, 0x7be6: 0x00303688, 0x7be7: 0x40303620, + 0x7be8: 0xe000102b, 0x7be9: 0xe0001028, 0x7bea: 0xe000103f, 0x7beb: 0xe000103c, + 0x7bec: 0xe0000fe7, 0x7bed: 0xe0000fe4, 0x7bee: 0xe0000ff9, 0x7bef: 0xe0000ff6, + 0x7bf0: 0xe0001025, 0x7bf1: 0xe0001022, 0x7bf2: 0xe0001039, 0x7bf3: 0xe0001036, + 0x7bf4: 0xe00010d8, 0x7bf5: 0xe00010d5, 0x7bf6: 0xe000110e, 0x7bf7: 0xe000110b, + 0x7bf8: 0xe0001117, 0x7bf9: 0xe000113b, 0x7bfa: 0xe0001138, 0x7bfb: 0xe000114d, + 0x7bfc: 0xe000114a, 0x7bfd: 0xe0001147, 0x7bfe: 0xe0001144, 0x7bff: 0xe0000f64, + // Block 0x1f0, offset 0x7c00 + 0x7c00: 0xa0000000, 0x7c01: 0xa0000000, 0x7c02: 0xa0000000, 0x7c03: 0xa0000000, + 0x7c04: 0xa0000000, 0x7c05: 0xa0000000, 0x7c06: 0xa0000000, 0x7c07: 0xa0000000, + 0x7c08: 0xa0000000, 0x7c09: 0x40020020, 0x7c0a: 0x40020220, 0x7c0b: 0x40020420, + 0x7c0c: 0x40020620, 0x7c0d: 0x40020820, 0x7c0e: 0xa0000000, 0x7c0f: 0xa0000000, + 0x7c10: 0xa0000000, 0x7c11: 0xa0000000, 0x7c12: 0xa0000000, 0x7c13: 0xa0000000, + 0x7c14: 0xa0000000, 0x7c15: 0xa0000000, 0x7c16: 0xa0000000, 0x7c17: 0xa0000000, + 0x7c18: 0xa0000000, 0x7c19: 0xa0000000, 0x7c1a: 0xa0000000, 0x7c1b: 0xa0000000, + 0x7c1c: 0xa0000000, 0x7c1d: 0xa0000000, 0x7c1e: 0xa0000000, 0x7c1f: 0xa0000000, + 0x7c20: 0x40021220, 0x7c21: 0x4002ba20, 0x7c22: 0x4003e020, 0x7c23: 0x4004ea20, + 0x7c24: 0x4027de20, 0x7c25: 0x4004ec20, 0x7c26: 0x4004e620, 0x7c27: 0x4003d220, + 0x7c28: 0x4003f420, 0x7c29: 0x4003f620, 0x7c2a: 0x4004d820, 0x7c2b: 0x40093820, + 0x7c2c: 0x40024020, 0x7c2d: 0x40021a20, 0x7c2e: 0x4002e420, 0x7c2f: 0x4004e220, + 0x7c30: 0x4029cc20, 0x7c31: 0x4029ce20, 0x7c32: 0x4029d020, 0x7c33: 0x4029d220, + 0x7c34: 0x4029d420, 0x7c35: 0x4029d620, 0x7c36: 0x4029d820, 0x7c37: 0x4029da20, + 0x7c38: 0x4029dc20, 0x7c39: 0x4029de20, 0x7c3a: 0x40026c20, 0x7c3b: 0x40026220, + 0x7c3c: 0x40094020, 0x7c3d: 0x40094220, 0x7c3e: 0x40094420, 0x7c3f: 0x4002c420, + // Block 0x1f1, offset 0x7c40 + 0x7c40: 0x4004d620, 0x7c41: 0x002bde88, 0x7c42: 0x002c0a88, 0x7c43: 0xc3590953, + 0x7c44: 0x002c6288, 0x7c45: 0x002c9888, 0x7c46: 0x002d0888, 0x7c47: 0x002d2288, + 0x7c48: 0x002d6888, 0x7c49: 0x002d9a88, 0x7c4a: 0x002dcc88, 0x7c4b: 0x002dfe88, + 0x7c4c: 0xc0030002, 0x7c4d: 0x002e8288, 0x7c4e: 0x002e9e88, 0x7c4f: 0x002ee288, + 0x7c50: 0x002f2c88, 0x7c51: 0x002f5688, 0x7c52: 0xc35f0991, 0x7c53: 0xc3430991, + 0x7c54: 0x00302c88, 0x7c55: 0x00306c88, 0x7c56: 0x0030be88, 0x7c57: 0x0030e288, + 0x7c58: 0x0030f688, 0x7c59: 0x00310088, 0x7c5a: 0xc3630991, 0x7c5b: 0x4003f820, + 0x7c5c: 0x4004e420, 0x7c5d: 0x4003fa20, 0x7c5e: 0x40062420, 0x7c5f: 0x40021620, + 0x7c60: 0x40061e20, 0x7c61: 0x402bde20, 0x7c62: 0x402c0a20, 0x7c63: 0xc3550953, + 0x7c64: 0x402c6220, 0x7c65: 0x402c9820, 0x7c66: 0x402d0820, 0x7c67: 0x402d2220, + 0x7c68: 0x402d6820, 0x7c69: 0x402d9a20, 0x7c6a: 0x402dcc20, 0x7c6b: 0x402dfe20, + 0x7c6c: 0xc0000002, 0x7c6d: 0x402e8220, 0x7c6e: 0x402e9e20, 0x7c6f: 0x402ee220, + 0x7c70: 0x402f2c20, 0x7c71: 0x402f5620, 0x7c72: 0xc35d0991, 0x7c73: 0xc3410991, + 0x7c74: 0x40302c20, 0x7c75: 0x40306c20, 0x7c76: 0x4030be20, 0x7c77: 0x4030e220, + 0x7c78: 0x4030f620, 0x7c79: 0x40310020, 0x7c7a: 0xc3610991, 0x7c7b: 0x4003fc20, + 0x7c7c: 0x40094820, 0x7c7d: 0x4003fe20, 0x7c7e: 0x40094c20, 0x7c7f: 0xa0000000, + // Block 0x1f2, offset 0x7c80 + 0x7c80: 0xe0000983, 0x7c81: 0xe0000980, 0x7c82: 0xe00008fb, 0x7c83: 0xe00008f8, + 0x7c84: 0xe000097d, 0x7c85: 0xe000097a, 0x7c86: 0xe0000a38, 0x7c87: 0xe0000a35, + 0x7c88: 0xe0000a3e, 0x7c89: 0xe0000a3b, 0x7c8a: 0xe0000a4a, 0x7c8b: 0xe0000a47, + 0x7c8c: 0x002c3c83, 0x7c8d: 0x402c3c20, 0x7c8e: 0xe0000a86, 0x7c8f: 0xe0000a83, + 0x7c90: 0xe0000aaa, 0x7c91: 0xe0000aa7, 0x7c92: 0xe0000b46, 0x7c93: 0xe0000b43, + 0x7c94: 0xe0000aee, 0x7c95: 0xe0000aeb, 0x7c96: 0xe0000b2c, 0x7c97: 0xe0000b29, + 0x7c98: 0xe0000b40, 0x7c99: 0xe0000b3d, 0x7c9a: 0xe0000b1a, 0x7c9b: 0xe0000b17, + 0x7c9c: 0xe0000bb8, 0x7c9d: 0xe0000bb5, 0x7c9e: 0xe0000bb2, 0x7c9f: 0xe0000baf, + 0x7ca0: 0xe0000bc4, 0x7ca1: 0xe0000bc1, 0x7ca2: 0xe0000bca, 0x7ca3: 0xe0000bc7, + 0x7ca4: 0xe0000bee, 0x7ca5: 0xe0000beb, 0x7ca6: 0xe0000c1b, 0x7ca7: 0xe0000c18, + 0x7ca8: 0xe0000c51, 0x7ca9: 0xe0000c4e, 0x7caa: 0xe0000c60, 0x7cab: 0xe0000c5d, + 0x7cac: 0xe0000c31, 0x7cad: 0xe0000c2e, 0x7cae: 0xe0000c5a, 0x7caf: 0xe0000c57, + 0x7cb0: 0xe0000c54, 0x7cb1: 0x402da220, 0x7cb2: 0xf0000a0a, 0x7cb3: 0xf0000404, + 0x7cb4: 0xe0000c8a, 0x7cb5: 0xe0000c87, 0x7cb6: 0xe0000c9f, 0x7cb7: 0xe0000c9c, + 0x7cb8: 0x402f7220, 0x7cb9: 0xe0000ccc, 0x7cba: 0xe0000cc9, 0x7cbb: 0xe0000cd8, + 0x7cbc: 0xe0000cd5, 0x7cbd: 0xe0000cd2, 0x7cbe: 0xe0000ccf, 0x7cbf: 0xe0000d04, + // Block 0x1f3, offset 0x7cc0 + 0x7cc0: 0xe0000cfe, 0x7cc1: 0xe0000cf8, 0x7cc2: 0xe0000cf5, 0x7cc3: 0xe0000d51, + 0x7cc4: 0xe0000d4e, 0x7cc5: 0xe0000d6f, 0x7cc6: 0xe0000d6c, 0x7cc7: 0xe0000d5d, + 0x7cc8: 0xe0000d5a, 0x7cc9: 0xf0000404, 0x7cca: 0x002eda88, 0x7ccb: 0x402eda20, + 0x7ccc: 0xe0000e2e, 0x7ccd: 0xe0000e2b, 0x7cce: 0xe0000da0, 0x7ccf: 0xe0000d9d, + 0x7cd0: 0xe0000de0, 0x7cd1: 0xe0000ddd, 0x7cd2: 0xe0000e93, 0x7cd3: 0xe0000e8f, + 0x7cd4: 0xe0000eca, 0x7cd5: 0xe0000ec7, 0x7cd6: 0xe0000edc, 0x7cd7: 0xe0000ed9, + 0x7cd8: 0x002f7c83, 0x7cd9: 0x402f7c20, 0x7cda: 0xe0000f1f, 0x7cdb: 0xe0000f1c, + 0x7cdc: 0xe0000f2d, 0x7cdd: 0xe0000f2a, 0x7cde: 0xe0000f47, 0x7cdf: 0xe0000f44, + 0x7ce0: 0x002fe883, 0x7ce1: 0x402fe820, 0x7ce2: 0xe0000f99, 0x7ce3: 0xe0000f96, + 0x7ce4: 0xe0000f8a, 0x7ce5: 0xe0000f87, 0x7ce6: 0x00303688, 0x7ce7: 0x40303620, + 0x7ce8: 0xe000102b, 0x7ce9: 0xe0001028, 0x7cea: 0xe000103f, 0x7ceb: 0xe000103c, + 0x7cec: 0xe0000fe7, 0x7ced: 0xe0000fe4, 0x7cee: 0xe0000ff9, 0x7cef: 0xe0000ff6, + 0x7cf0: 0xe0001025, 0x7cf1: 0xe0001022, 0x7cf2: 0xe0001039, 0x7cf3: 0xe0001036, + 0x7cf4: 0xe00010d8, 0x7cf5: 0xe00010d5, 0x7cf6: 0xe000110e, 0x7cf7: 0xe000110b, + 0x7cf8: 0xe0001117, 0x7cf9: 0xe000113b, 0x7cfa: 0xe0001138, 0x7cfb: 0xe000114d, + 0x7cfc: 0xe000114a, 0x7cfd: 0x00312c83, 0x7cfe: 0x40312c20, 0x7cff: 0xe0000f64, + // Block 0x1f4, offset 0x7d00 + 0x7d00: 0xe0000d24, 0x7d01: 0xe0000d21, 0x7d02: 0xe0000d2a, 0x7d03: 0xe0000d27, + 0x7d04: 0xe0000d69, 0x7d05: 0xe0000d66, 0x7d06: 0xe0000d7b, 0x7d07: 0xe0000d78, + 0x7d08: 0xe0000d87, 0x7d09: 0xe0000d84, 0x7d0a: 0xe0000d81, 0x7d0b: 0xe0000d7e, + 0x7d0c: 0xe0000ded, 0x7d0d: 0xe0000de9, 0x7d0e: 0xe0000df5, 0x7d0f: 0xe0000df1, + 0x7d10: 0xe0000e3d, 0x7d11: 0xe0000e39, 0x7d12: 0xe0000e35, 0x7d13: 0xe0000e31, + 0x7d14: 0xe0000ea7, 0x7d15: 0xe0000ea4, 0x7d16: 0xe0000ead, 0x7d17: 0xe0000eaa, + 0x7d18: 0xe0000ed6, 0x7d19: 0xe0000ed3, 0x7d1a: 0xe0000ef4, 0x7d1b: 0xe0000ef1, + 0x7d1c: 0xe0000efb, 0x7d1d: 0xe0000ef7, 0x7d1e: 0xe0000f02, 0x7d1f: 0xe0000eff, + 0x7d20: 0xe0000f41, 0x7d21: 0xe0000f3e, 0x7d22: 0xe0000f53, 0x7d23: 0xe0000f50, + 0x7d24: 0xe0000f26, 0x7d25: 0xe0000f22, 0x7d26: 0xe000296a, 0x7d27: 0xe0002967, + 0x7d28: 0xe0000f5a, 0x7d29: 0xe0000f56, 0x7d2a: 0xe0000f93, 0x7d2b: 0xe0000f90, + 0x7d2c: 0xe0000f9f, 0x7d2d: 0xe0000f9c, 0x7d2e: 0xe0000fb1, 0x7d2f: 0xe0000fae, + 0x7d30: 0xe0000fab, 0x7d31: 0xe0000fa8, 0x7d32: 0xe0001093, 0x7d33: 0xe0001090, + 0x7d34: 0xe000109f, 0x7d35: 0xe000109c, 0x7d36: 0xe0001099, 0x7d37: 0xe0001096, + 0x7d38: 0xe0001032, 0x7d39: 0xe000102e, 0x7d3a: 0xe0001046, 0x7d3b: 0xe0001042, + 0x7d3c: 0xe00010a9, 0x7d3d: 0xe00010a6, 0x7d3e: 0xe00010af, 0x7d3f: 0xe00010ac, + // Block 0x1f5, offset 0x7d40 + 0x7d40: 0xa0000000, 0x7d41: 0xa0000000, 0x7d42: 0xa0000000, 0x7d43: 0xa0000000, + 0x7d44: 0xa0000000, 0x7d45: 0xa0000000, 0x7d46: 0xa0000000, 0x7d47: 0xa0000000, + 0x7d48: 0xa0000000, 0x7d49: 0x40020020, 0x7d4a: 0x40020220, 0x7d4b: 0x40020420, + 0x7d4c: 0x40020620, 0x7d4d: 0x40020820, 0x7d4e: 0xa0000000, 0x7d4f: 0xa0000000, + 0x7d50: 0xa0000000, 0x7d51: 0xa0000000, 0x7d52: 0xa0000000, 0x7d53: 0xa0000000, + 0x7d54: 0xa0000000, 0x7d55: 0xa0000000, 0x7d56: 0xa0000000, 0x7d57: 0xa0000000, + 0x7d58: 0xa0000000, 0x7d59: 0xa0000000, 0x7d5a: 0xa0000000, 0x7d5b: 0xa0000000, + 0x7d5c: 0xa0000000, 0x7d5d: 0xa0000000, 0x7d5e: 0xa0000000, 0x7d5f: 0xa0000000, + 0x7d60: 0x40021220, 0x7d61: 0x4002ba20, 0x7d62: 0x4003e020, 0x7d63: 0x4004ea20, + 0x7d64: 0x4027de20, 0x7d65: 0x4004ec20, 0x7d66: 0x4004e620, 0x7d67: 0x4003d220, + 0x7d68: 0x4003f420, 0x7d69: 0x4003f620, 0x7d6a: 0x4004d820, 0x7d6b: 0x40093820, + 0x7d6c: 0x40024020, 0x7d6d: 0x40021a20, 0x7d6e: 0x4002e420, 0x7d6f: 0x4004e220, + 0x7d70: 0x4029cc20, 0x7d71: 0x4029ce20, 0x7d72: 0x4029d020, 0x7d73: 0x4029d220, + 0x7d74: 0x4029d420, 0x7d75: 0x4029d620, 0x7d76: 0x4029d820, 0x7d77: 0x4029da20, + 0x7d78: 0x4029dc20, 0x7d79: 0x4029de20, 0x7d7a: 0x40026c20, 0x7d7b: 0x40026220, + 0x7d7c: 0x40094020, 0x7d7d: 0x40094220, 0x7d7e: 0x40094420, 0x7d7f: 0x4002c420, + // Block 0x1f6, offset 0x7d80 + 0x7d80: 0x4004d620, 0x7d81: 0x002bde88, 0x7d82: 0x002c0a88, 0x7d83: 0xc36509c2, + 0x7d84: 0xc36a09f2, 0x7d85: 0x002c9888, 0x7d86: 0xc36f0a22, 0x7d87: 0x002d2288, + 0x7d88: 0x002d6888, 0x7d89: 0x002d9a88, 0x7d8a: 0x002dcc88, 0x7d8b: 0x002dfe88, + 0x7d8c: 0xc37b0ac4, 0x7d8d: 0x002e8288, 0x7d8e: 0xc3740a52, 0x7d8f: 0x002ee288, + 0x7d90: 0xc38209c2, 0x7d91: 0x002f5688, 0x7d92: 0xc38509c2, 0x7d93: 0x002fe688, + 0x7d94: 0xc38a09c2, 0x7d95: 0x00306c88, 0x7d96: 0x0030be88, 0x7d97: 0x0030e288, + 0x7d98: 0x0030f688, 0x7d99: 0x00310088, 0x7d9a: 0x00312a88, 0x7d9b: 0x4003f820, + 0x7d9c: 0x4004e420, 0x7d9d: 0x4003fa20, 0x7d9e: 0x40062420, 0x7d9f: 0x40021620, + 0x7da0: 0x40061e20, 0x7da1: 0x402bde20, 0x7da2: 0x402c0a20, 0x7da3: 0xc33309b1, + 0x7da4: 0xc36809e1, 0x7da5: 0x402c9820, 0x7da6: 0xc36d0a11, 0x7da7: 0x402d2220, + 0x7da8: 0x402d6820, 0x7da9: 0x402d9a20, 0x7daa: 0x402dcc20, 0x7dab: 0x402dfe20, + 0x7dac: 0xc3770a73, 0x7dad: 0x402e8220, 0x7dae: 0xc3720a41, 0x7daf: 0x402ee220, + 0x7db0: 0xc38009b1, 0x7db1: 0x402f5620, 0x7db2: 0xc35d09b1, 0x7db3: 0x402fe620, + 0x7db4: 0xc38809b1, 0x7db5: 0x40306c20, 0x7db6: 0x4030be20, 0x7db7: 0x4030e220, + 0x7db8: 0x4030f620, 0x7db9: 0x40310020, 0x7dba: 0x40312a20, 0x7dbb: 0x4003fc20, + 0x7dbc: 0x40094820, 0x7dbd: 0x4003fe20, 0x7dbe: 0x40094c20, 0x7dbf: 0xa0000000, + // Block 0x1f7, offset 0x7dc0 + 0x7dc0: 0xa0000000, 0x7dc1: 0xa0000000, 0x7dc2: 0xa0000000, 0x7dc3: 0xa0000000, + 0x7dc4: 0xa0000000, 0x7dc5: 0xa0000000, 0x7dc6: 0xa0000000, 0x7dc7: 0xa0000000, + 0x7dc8: 0xa0000000, 0x7dc9: 0x40020020, 0x7dca: 0x40020220, 0x7dcb: 0x40020420, + 0x7dcc: 0x40020620, 0x7dcd: 0x40020820, 0x7dce: 0xa0000000, 0x7dcf: 0xa0000000, + 0x7dd0: 0xa0000000, 0x7dd1: 0xa0000000, 0x7dd2: 0xa0000000, 0x7dd3: 0xa0000000, + 0x7dd4: 0xa0000000, 0x7dd5: 0xa0000000, 0x7dd6: 0xa0000000, 0x7dd7: 0xa0000000, + 0x7dd8: 0xa0000000, 0x7dd9: 0xa0000000, 0x7dda: 0xa0000000, 0x7ddb: 0xa0000000, + 0x7ddc: 0xa0000000, 0x7ddd: 0xa0000000, 0x7dde: 0xa0000000, 0x7ddf: 0xa0000000, + 0x7de0: 0x40021220, 0x7de1: 0x4002ba20, 0x7de2: 0x4003e020, 0x7de3: 0x4004ea20, + 0x7de4: 0x4027de20, 0x7de5: 0x4004ec20, 0x7de6: 0x4004e620, 0x7de7: 0x4003d220, + 0x7de8: 0x4003f420, 0x7de9: 0x4003f620, 0x7dea: 0x4004d820, 0x7deb: 0x40093820, + 0x7dec: 0x40024020, 0x7ded: 0x40021a20, 0x7dee: 0x4002e420, 0x7def: 0x4004e220, + 0x7df0: 0x4029cc20, 0x7df1: 0x4029ce20, 0x7df2: 0x4029d020, 0x7df3: 0x4029d220, + 0x7df4: 0x4029d420, 0x7df5: 0x4029d620, 0x7df6: 0x4029d820, 0x7df7: 0x4029da20, + 0x7df8: 0x4029dc20, 0x7df9: 0x4029de20, 0x7dfa: 0x40026c20, 0x7dfb: 0x40026220, + 0x7dfc: 0x40094020, 0x7dfd: 0x40094220, 0x7dfe: 0x40094420, 0x7dff: 0x4002c420, + // Block 0x1f8, offset 0x7e00 + 0x7e00: 0x4004d620, 0x7e01: 0xc3970b93, 0x7e02: 0x002c0a88, 0x7e03: 0x002c3a88, + 0x7e04: 0x002c6288, 0x7e05: 0xc39e0be1, 0x7e06: 0x002d0888, 0x7e07: 0x002d2288, + 0x7e08: 0x002d6888, 0x7e09: 0x002d9a88, 0x7e0a: 0x002dcc88, 0x7e0b: 0x002dfe88, + 0x7e0c: 0xc0030002, 0x7e0d: 0x002e8288, 0x7e0e: 0x002e9e88, 0x7e0f: 0xc3a30b21, + 0x7e10: 0x002f2c88, 0x7e11: 0x002f5688, 0x7e12: 0x002f7a88, 0x7e13: 0x002fe688, + 0x7e14: 0x00302c88, 0x7e15: 0xc3900b21, 0x7e16: 0x0030be88, 0x7e17: 0x0030e288, + 0x7e18: 0x0030f688, 0x7e19: 0x00310088, 0x7e1a: 0x00312a88, 0x7e1b: 0x4003f820, + 0x7e1c: 0x4004e420, 0x7e1d: 0x4003fa20, 0x7e1e: 0x40062420, 0x7e1f: 0x40021620, + 0x7e20: 0x40061e20, 0x7e21: 0xc3930b52, 0x7e22: 0x402c0a20, 0x7e23: 0x402c3a20, + 0x7e24: 0x402c6220, 0x7e25: 0xc39c0be1, 0x7e26: 0x402d0820, 0x7e27: 0x402d2220, + 0x7e28: 0x402d6820, 0x7e29: 0x402d9a20, 0x7e2a: 0x402dcc20, 0x7e2b: 0x402dfe20, + 0x7e2c: 0xc0000002, 0x7e2d: 0x402e8220, 0x7e2e: 0x402e9e20, 0x7e2f: 0xc3a00b21, + 0x7e30: 0x402f2c20, 0x7e31: 0x402f5620, 0x7e32: 0x402f7a20, 0x7e33: 0x402fe620, + 0x7e34: 0x40302c20, 0x7e35: 0xc38d0b21, 0x7e36: 0x4030be20, 0x7e37: 0x4030e220, + 0x7e38: 0x4030f620, 0x7e39: 0x40310020, 0x7e3a: 0x40312a20, 0x7e3b: 0x4003fc20, + 0x7e3c: 0x40094820, 0x7e3d: 0x4003fe20, 0x7e3e: 0x40094c20, 0x7e3f: 0xa0000000, + // Block 0x1f9, offset 0x7e40 + 0x7e40: 0xe00008f5, 0x7e41: 0xe00008ef, 0x7e42: 0xe0000921, 0x7e43: 0xe0000969, + 0x7e44: 0x00320ca3, 0x7e45: 0x00321083, 0x7e46: 0x00320c83, 0x7e47: 0xe0000a53, + 0x7e48: 0xe0000ae8, 0x7e49: 0xe0000ae2, 0x7e4a: 0xe0000af4, 0x7e4b: 0xe0000b20, + 0x7e4c: 0xe0000c2b, 0x7e4d: 0xe0000c25, 0x7e4e: 0xe0000c37, 0x7e4f: 0xe0000c43, + 0x7e50: 0x002c62c3, 0x7e51: 0xe0000d63, 0x7e52: 0xe0000d9a, 0x7e53: 0xe0000d94, + 0x7e54: 0xe0000da6, 0x7e55: 0xe0000de6, 0x7e56: 0x00320ea3, 0x7e57: 0x40093e20, + 0x7e58: 0x00320e83, 0x7e59: 0xe0000fe1, 0x7e5a: 0xe0000fdb, 0x7e5b: 0xe0000fed, + 0x7e5c: 0x003100a3, 0x7e5d: 0xe0001102, 0x7e5e: 0xe0002973, 0x7e5f: 0xe0000f7b, + 0x7e60: 0xe00008f2, 0x7e61: 0xe00008ec, 0x7e62: 0xe000091e, 0x7e63: 0xe0000966, + 0x7e64: 0x40320c21, 0x7e65: 0x40321020, 0x7e66: 0x40320c20, 0x7e67: 0xe0000a4d, + 0x7e68: 0xe0000ae5, 0x7e69: 0xe0000adf, 0x7e6a: 0xe0000af1, 0x7e6b: 0xe0000b1d, + 0x7e6c: 0xe0000c28, 0x7e6d: 0xe0000c22, 0x7e6e: 0xe0000c34, 0x7e6f: 0xe0000c40, + 0x7e70: 0x402c6222, 0x7e71: 0xe0000d60, 0x7e72: 0xe0000d97, 0x7e73: 0xe0000d91, + 0x7e74: 0xe0000da3, 0x7e75: 0xe0000de3, 0x7e76: 0x40320e21, 0x7e77: 0x40093c20, + 0x7e78: 0x40320e20, 0x7e79: 0xe0000fde, 0x7e7a: 0xe0000fd8, 0x7e7b: 0xe0000fea, + 0x7e7c: 0x40310021, 0x7e7d: 0xe00010ff, 0x7e7e: 0xe0002970, 0x7e7f: 0xe0001114, + // Block 0x1fa, offset 0x7e80 + 0x7e80: 0xe0000983, 0x7e81: 0xe0000980, 0x7e82: 0xe00008fb, 0x7e83: 0xe00008f8, + 0x7e84: 0xe000097d, 0x7e85: 0xe000097a, 0x7e86: 0xe0000a38, 0x7e87: 0xe0000a35, + 0x7e88: 0xe0000a3e, 0x7e89: 0xe0000a3b, 0x7e8a: 0xe0000a4a, 0x7e8b: 0xe0000a47, + 0x7e8c: 0xe0000a44, 0x7e8d: 0xe0000a41, 0x7e8e: 0xe0000a86, 0x7e8f: 0xe0000a83, + 0x7e90: 0x002c62a3, 0x7e91: 0x402c6221, 0x7e92: 0xe0000b46, 0x7e93: 0xe0000b43, + 0x7e94: 0xe0000aee, 0x7e95: 0xe0000aeb, 0x7e96: 0xe0000b2c, 0x7e97: 0xe0000b29, + 0x7e98: 0x00320cc3, 0x7e99: 0x40320c22, 0x7e9a: 0xe0000b1a, 0x7e9b: 0xe0000b17, + 0x7e9c: 0xe0000bb8, 0x7e9d: 0xe0000bb5, 0x7e9e: 0xe0000bb2, 0x7e9f: 0xe0000baf, + 0x7ea0: 0xe0000bc4, 0x7ea1: 0xe0000bc1, 0x7ea2: 0xe0000bca, 0x7ea3: 0xe0000bc7, + 0x7ea4: 0xe0000bee, 0x7ea5: 0xe0000beb, 0x7ea6: 0xe0000c1b, 0x7ea7: 0xe0000c18, + 0x7ea8: 0xe0000c51, 0x7ea9: 0xe0000c4e, 0x7eaa: 0xe0000c60, 0x7eab: 0xe0000c5d, + 0x7eac: 0xe0000c31, 0x7ead: 0xe0000c2e, 0x7eae: 0xe0000c5a, 0x7eaf: 0xe0000c57, + 0x7eb0: 0xe0000c54, 0x7eb1: 0x402da220, 0x7eb2: 0xf0000a0a, 0x7eb3: 0xf0000404, + 0x7eb4: 0xe0000c8a, 0x7eb5: 0xe0000c87, 0x7eb6: 0xe0000c9f, 0x7eb7: 0xe0000c9c, + 0x7eb8: 0x402f7220, 0x7eb9: 0xe0000ccc, 0x7eba: 0xe0000cc9, 0x7ebb: 0xe0000cd8, + 0x7ebc: 0xe0000cd5, 0x7ebd: 0xe0000cd2, 0x7ebe: 0xe0000ccf, 0x7ebf: 0xe0000d04, + // Block 0x1fb, offset 0x7ec0 + 0x7ec0: 0xe0000cfe, 0x7ec1: 0xe0000cf8, 0x7ec2: 0xe0000cf5, 0x7ec3: 0xe0000d51, + 0x7ec4: 0xe0000d4e, 0x7ec5: 0xe0000d6f, 0x7ec6: 0xe0000d6c, 0x7ec7: 0xe0000d5d, + 0x7ec8: 0xe0000d5a, 0x7ec9: 0xf0000404, 0x7eca: 0x002eda88, 0x7ecb: 0x402eda20, + 0x7ecc: 0xe0000e2e, 0x7ecd: 0xe0000e2b, 0x7ece: 0xe0000da0, 0x7ecf: 0xe0000d9d, + 0x7ed0: 0x00320ec3, 0x7ed1: 0x40320e22, 0x7ed2: 0x00320ee3, 0x7ed3: 0x40320e23, + 0x7ed4: 0xe0000eca, 0x7ed5: 0xe0000ec7, 0x7ed6: 0xe0000edc, 0x7ed7: 0xe0000ed9, + 0x7ed8: 0xe0000ed0, 0x7ed9: 0xe0000ecd, 0x7eda: 0xe0000f1f, 0x7edb: 0xe0000f1c, + 0x7edc: 0xe0000f2d, 0x7edd: 0xe0000f2a, 0x7ede: 0xe0000f47, 0x7edf: 0xe0000f44, + 0x7ee0: 0xe0000f33, 0x7ee1: 0xe0000f30, 0x7ee2: 0xe0000f99, 0x7ee3: 0xe0000f96, + 0x7ee4: 0xe0000f8a, 0x7ee5: 0xe0000f87, 0x7ee6: 0x00303688, 0x7ee7: 0x40303620, + 0x7ee8: 0xe000102b, 0x7ee9: 0xe0001028, 0x7eea: 0xe000103f, 0x7eeb: 0xe000103c, + 0x7eec: 0xe0000fe7, 0x7eed: 0xe0000fe4, 0x7eee: 0xe0000ff9, 0x7eef: 0xe0000ff6, + 0x7ef0: 0x003100c3, 0x7ef1: 0x40310022, 0x7ef2: 0xe0001039, 0x7ef3: 0xe0001036, + 0x7ef4: 0xe00010d8, 0x7ef5: 0xe00010d5, 0x7ef6: 0xe000110e, 0x7ef7: 0xe000110b, + 0x7ef8: 0xe0001117, 0x7ef9: 0xe000113b, 0x7efa: 0xe0001138, 0x7efb: 0xe000114d, + 0x7efc: 0xe000114a, 0x7efd: 0xe0001147, 0x7efe: 0xe0001144, 0x7eff: 0xe0000f64, + // Block 0x1fc, offset 0x7f00 + 0x7f00: 0x40321220, 0x7f01: 0x40321a20, 0x7f02: 0x40322220, 0x7f03: 0x40322a20, + 0x7f04: 0xe0000ad5, 0x7f05: 0xe0000ad1, 0x7f06: 0xe0000acd, 0x7f07: 0xf0000a0a, + 0x7f08: 0xf000040a, 0x7f09: 0xf0000404, 0x7f0a: 0xf0000a0a, 0x7f0b: 0xf000040a, + 0x7f0c: 0xf0000404, 0x7f0d: 0xe0000947, 0x7f0e: 0xe0000944, 0x7f0f: 0xe0000c3d, + 0x7f10: 0xe0000c3a, 0x7f11: 0xe0000dcc, 0x7f12: 0xe0000dc9, 0x7f13: 0xe0000ff3, + 0x7f14: 0xe0000ff0, 0x7f15: 0xe000298b, 0x7f16: 0xe0002988, 0x7f17: 0xe0002979, + 0x7f18: 0xe0002976, 0x7f19: 0xe0002985, 0x7f1a: 0xe0002982, 0x7f1b: 0xe000297f, + 0x7f1c: 0xe000297c, 0x7f1d: 0x402cae20, 0x7f1e: 0xe000299d, 0x7f1f: 0xe000299a, + 0x7f20: 0xe0000976, 0x7f21: 0xe0000972, 0x7f22: 0xe0002997, 0x7f23: 0xe0002994, + 0x7f24: 0x002d3a88, 0x7f25: 0x402d3a20, 0x7f26: 0xe0000bbe, 0x7f27: 0xe0000bbb, + 0x7f28: 0xe0000c99, 0x7f29: 0xe0000c96, 0x7f2a: 0xe0000e20, 0x7f2b: 0xe0000e1d, + 0x7f2c: 0xe0000e27, 0x7f2d: 0xe0000e23, 0x7f2e: 0xe0001162, 0x7f2f: 0xe000115f, + 0x7f30: 0xe0000c8d, 0x7f31: 0xf0000a0a, 0x7f32: 0xf000040a, 0x7f33: 0xf0000404, + 0x7f34: 0xe0000bac, 0x7f35: 0xe0000ba9, 0x7f36: 0x002d7888, 0x7f37: 0x00319488, + 0x7f38: 0xe0000d57, 0x7f39: 0xe0000d54, 0x7f3a: 0xe00029b5, 0x7f3b: 0xe00029b2, + 0x7f3c: 0xe0002991, 0x7f3d: 0xe000298e, 0x7f3e: 0xe00029a3, 0x7f3f: 0xe00029a0, + // Block 0x1fd, offset 0x7f40 + 0x7f40: 0xe000098f, 0x7f41: 0xe000098c, 0x7f42: 0xe0000995, 0x7f43: 0xe0000992, + 0x7f44: 0xe0000b62, 0x7f45: 0xe0000b5f, 0x7f46: 0xe0000b68, 0x7f47: 0xe0000b65, + 0x7f48: 0xe0000c6c, 0x7f49: 0xe0000c69, 0x7f4a: 0xe0000c72, 0x7f4b: 0xe0000c6f, + 0x7f4c: 0xe0000e4a, 0x7f4d: 0xe0000e47, 0x7f4e: 0xe0000e50, 0x7f4f: 0xe0000e4d, + 0x7f50: 0xe0000ee8, 0x7f51: 0xe0000ee5, 0x7f52: 0xe0000eee, 0x7f53: 0xe0000eeb, + 0x7f54: 0xe0001053, 0x7f55: 0xe0001050, 0x7f56: 0xe0001059, 0x7f57: 0xe0001056, + 0x7f58: 0xe0000f61, 0x7f59: 0xe0000f5e, 0x7f5a: 0xe0000fa5, 0x7f5b: 0xe0000fa2, + 0x7f5c: 0x00312288, 0x7f5d: 0x40312220, 0x7f5e: 0xe0000bf4, 0x7f5f: 0xe0000bf1, + 0x7f60: 0x002ebc88, 0x7f61: 0x402c8c20, 0x7f62: 0x002f2288, 0x7f63: 0x402f2220, + 0x7f64: 0x00314088, 0x7f65: 0x40314020, 0x7f66: 0xe000096f, 0x7f67: 0xe000096c, + 0x7f68: 0xe0000b32, 0x7f69: 0xe0000b2f, 0x7f6a: 0xe00029af, 0x7f6b: 0xe00029ac, + 0x7f6c: 0xe0000dfd, 0x7f6d: 0xe0000df9, 0x7f6e: 0xe0000e04, 0x7f6f: 0xe0000e01, + 0x7f70: 0xe0000e0b, 0x7f71: 0xe0000e07, 0x7f72: 0xe0001129, 0x7f73: 0xe0001126, + 0x7f74: 0x402e5e20, 0x7f75: 0x402ed020, 0x7f76: 0x40305a20, 0x7f77: 0x402dd420, + 0x7f78: 0xe0000abf, 0x7f79: 0xe0000ec4, 0x7f7a: 0x002be888, 0x7f7b: 0x002c4488, + 0x7f7c: 0x402c4420, 0x7f7d: 0x002e3888, 0x7f7e: 0x00303e88, 0x7f7f: 0x402ffc20, + // Block 0x1fe, offset 0x7f80 + 0x7f80: 0x402c2820, 0x7f81: 0x402c7020, 0x7f82: 0x402d1420, 0x7f83: 0x402d4220, + 0x7f84: 0x402e0820, 0x7f85: 0x402e5220, 0x7f86: 0x402e8e20, 0x7f87: 0x402ec620, + 0x7f88: 0x402f3c20, 0x7f89: 0x402faa20, 0x7f8a: 0x402ff220, 0x7f8b: 0x40301020, + 0x7f8c: 0x4030ca20, 0x7f8d: 0x4030fe20, 0x7f8e: 0x40313e20, 0x7f8f: 0x402bea20, + 0x7f90: 0x402c0020, 0x7f91: 0x402c8220, 0x7f92: 0x402caa20, 0x7f93: 0x402cca20, + 0x7f94: 0x402ce420, 0x7f95: 0x402cc020, 0x7f96: 0x402dc020, 0x7f97: 0x402f0620, + 0x7f98: 0x40302220, 0x7f99: 0x40308620, 0x7f9a: 0x40317620, 0x7f9b: 0x002c0294, + 0x7f9c: 0x002c3a94, 0x7f9d: 0x002c5694, 0x7f9e: 0xe000296d, 0x7f9f: 0x002cdc94, + 0x7fa0: 0x002d0894, 0x7fa1: 0x002dee94, 0x7fa2: 0x002d2a94, 0x7fa3: 0x00308894, + 0x7fa4: 0x002db694, 0x7fa5: 0x002dc294, 0x7fa6: 0x002daa94, 0x7fa7: 0x002dbe94, + 0x7fa8: 0x002de694, 0x7fa9: 0x002e5494, 0x7faa: 0x002e5294, 0x7fab: 0x002e2a94, + 0x7fac: 0x002e9094, 0x7fad: 0x0030ac94, 0x7fae: 0x002eb494, 0x7faf: 0x002ec894, + 0x7fb0: 0x002ea694, 0x7fb1: 0x002f1094, 0x7fb2: 0x002f4c94, 0x7fb3: 0x002ff494, + 0x7fb4: 0x00300894, 0x7fb5: 0x00304294, 0x7fb6: 0x00307c94, 0x7fb7: 0x0030b494, + 0x7fb8: 0x00307494, 0x7fb9: 0x0030cc94, 0x7fba: 0x0030da94, 0x7fbb: 0x00312a94, + 0x7fbc: 0x00314894, 0x7fbd: 0x00315094, 0x7fbe: 0x00316494, 0x7fbf: 0x00326a94, + // Block 0x1ff, offset 0x7fc0 + 0x7fc0: 0xe0000d24, 0x7fc1: 0xe0000d21, 0x7fc2: 0xe0000d2a, 0x7fc3: 0xe0000d27, + 0x7fc4: 0xe0000d69, 0x7fc5: 0xe0000d66, 0x7fc6: 0xe0000d7b, 0x7fc7: 0xe0000d78, + 0x7fc8: 0xe0000d87, 0x7fc9: 0xe0000d84, 0x7fca: 0xe0000d81, 0x7fcb: 0xe0000d7e, + 0x7fcc: 0xe0000ded, 0x7fcd: 0xe0000de9, 0x7fce: 0xe00029a9, 0x7fcf: 0xe00029a6, + 0x7fd0: 0xe0000e3d, 0x7fd1: 0xe0000e39, 0x7fd2: 0xe0000e35, 0x7fd3: 0xe0000e31, + 0x7fd4: 0xe0000ea7, 0x7fd5: 0xe0000ea4, 0x7fd6: 0xe0000ead, 0x7fd7: 0xe0000eaa, + 0x7fd8: 0xe0000ed6, 0x7fd9: 0xe0000ed3, 0x7fda: 0xe0000ef4, 0x7fdb: 0xe0000ef1, + 0x7fdc: 0xe0000efb, 0x7fdd: 0xe0000ef7, 0x7fde: 0xe0000f02, 0x7fdf: 0xe0000eff, + 0x7fe0: 0xe0000f41, 0x7fe1: 0xe0000f3e, 0x7fe2: 0xe0000f53, 0x7fe3: 0xe0000f50, + 0x7fe4: 0xe0000f26, 0x7fe5: 0xe0000f22, 0x7fe6: 0xe0000f3a, 0x7fe7: 0xe0000f36, + 0x7fe8: 0xe0000f5a, 0x7fe9: 0xe0000f56, 0x7fea: 0xe0000f93, 0x7feb: 0xe0000f90, + 0x7fec: 0xe0000f9f, 0x7fed: 0xe0000f9c, 0x7fee: 0xe0000fb1, 0x7fef: 0xe0000fae, + 0x7ff0: 0xe0000fab, 0x7ff1: 0xe0000fa8, 0x7ff2: 0xe0001093, 0x7ff3: 0xe0001090, + 0x7ff4: 0xe000109f, 0x7ff5: 0xe000109c, 0x7ff6: 0xe0001099, 0x7ff7: 0xe0001096, + 0x7ff8: 0xe0001032, 0x7ff9: 0xe000102e, 0x7ffa: 0xe000298b, 0x7ffb: 0xe0002988, + 0x7ffc: 0xe00010a9, 0x7ffd: 0xe00010a6, 0x7ffe: 0xe00010af, 0x7fff: 0xe00010ac, + // Block 0x200, offset 0x8000 + 0x8000: 0xe00009bc, 0x8001: 0xe00009c0, 0x8002: 0x002c3a8b, 0x8003: 0xf0000a04, + 0x8004: 0x40081c20, 0x8005: 0xe0000a5e, 0x8006: 0xe0000a62, 0x8007: 0x002cc28a, + 0x8008: 0x40081e20, 0x8009: 0xf0000a04, 0x800a: 0x002d2285, 0x800b: 0x002d688b, + 0x800c: 0x002d688b, 0x800d: 0x002d688b, 0x800e: 0x002d6885, 0x800f: 0xf0000202, + 0x8010: 0x002d9a8b, 0x8011: 0x002d9a8b, 0x8012: 0x002e228b, 0x8013: 0x002e2285, + 0x8014: 0x40082020, 0x8015: 0x002e9e8b, 0x8016: 0xf000040a, 0x8017: 0x40082220, + 0x8018: 0x40082420, 0x8019: 0x002f2c8b, 0x801a: 0x002f568b, 0x801b: 0x002f7a8b, + 0x801c: 0x002f7a8b, 0x801d: 0x002f7a8b, 0x801e: 0x40082620, 0x801f: 0x40082820, + 0x8020: 0xf0001414, 0x8021: 0xe0000fbd, 0x8022: 0xf0001414, 0x8023: 0x40082a20, + 0x8024: 0x00312a8b, 0x8025: 0x40082c20, 0x8026: 0x0032a288, 0x8027: 0x40082e20, + 0x8028: 0x00312a8b, 0x8029: 0x40083020, 0x802a: 0x002dfe88, 0x802b: 0x00321083, + 0x802c: 0x002c0a8b, 0x802d: 0x002c3a8b, 0x802e: 0x40083220, 0x802f: 0x002c9885, + 0x8030: 0x002c988b, 0x8031: 0x002d088b, 0x8032: 0x002d1e88, 0x8033: 0x002e828b, + 0x8034: 0x002ee285, 0x8035: 0x00389084, 0x8036: 0x00389284, 0x8037: 0x00389484, + 0x8038: 0x00389684, 0x8039: 0x002d9a85, 0x803a: 0x40083420, 0x803b: 0xe0000b95, + 0x803c: 0x00327e85, 0x803d: 0x00325685, 0x803e: 0x0032568b, 0x803f: 0x00327e8b, + // Block 0x201, offset 0x8040 + 0x8040: 0x40078220, 0x8041: 0x40075e20, 0x8042: 0x40076020, 0x8043: 0x40076220, + 0x8044: 0x40058220, 0x8045: 0x40058420, 0x8046: 0x40058620, 0x8047: 0x40058820, + 0x8048: 0x40058a20, 0x8049: 0x40058c20, 0x804a: 0x40058e20, 0x804b: 0x4027bc20, + 0x804c: 0x0027bc83, 0x804d: 0x4027bc21, 0x804e: 0x4027bc22, 0x804f: 0x4027bc23, + 0x8050: 0x4027bc24, 0x8051: 0x4027bc25, 0x8052: 0x4005a020, 0x8053: 0x40076420, + 0x8054: 0x4027bc26, 0x8055: 0x40076620, 0x8056: 0x40076820, 0x8057: 0x40076a20, + 0x8058: 0xadc00000, 0x8059: 0xadc00000, 0x805a: 0x40076c20, 0x805b: 0x40076e20, + 0x805c: 0x40077020, 0x805d: 0x40077220, 0x805e: 0x40077420, 0x805f: 0x40077620, + 0x8060: 0xe00001a0, 0x8061: 0xe0000234, 0x8062: 0xe000034c, 0x8063: 0xe0000426, + 0x8064: 0xe00004fb, 0x8065: 0xe00005c5, 0x8066: 0xe0000690, 0x8067: 0xe0000738, + 0x8068: 0xe00007e4, 0x8069: 0xe0000889, 0x806a: 0xe0000237, 0x806b: 0xe000034f, + 0x806c: 0xe0000429, 0x806d: 0xe00004fe, 0x806e: 0xe00005c8, 0x806f: 0xe0000693, + 0x8070: 0xe000073b, 0x8071: 0xe00007e7, 0x8072: 0xe000088c, 0x8073: 0xe00001a3, + 0x8074: 0x4027bc27, 0x8075: 0xadc00000, 0x8076: 0x40077a20, 0x8077: 0xadc00000, + 0x8078: 0x40077c20, 0x8079: 0xae611002, 0x807a: 0x40040020, 0x807b: 0x40040220, + 0x807c: 0x40040420, 0x807d: 0x40040620, 0x807e: 0xa0000000, 0x807f: 0xa0000000, + // Block 0x202, offset 0x8080 + 0x8080: 0x404a7620, 0x8081: 0x404a7c20, 0x8082: 0xc4cf2161, 0x8083: 0xe00029d9, + 0x8084: 0x404a8420, 0x8085: 0x404a8820, 0x8086: 0x404a8c20, 0x8087: 0x404a9020, + 0x8089: 0x404a9420, 0x808a: 0x004aa883, 0x808b: 0x004aac83, + 0x808c: 0x004ab083, 0x808d: 0xe0002a11, 0x808e: 0x004ab483, 0x808f: 0x404aa820, + 0x8090: 0x404aac20, 0x8091: 0xc3a90c31, 0x8092: 0xe0002a0e, 0x8093: 0x404ab420, + 0x8094: 0x404ab820, 0x8095: 0x404abc20, 0x8096: 0xc3f31211, 0x8097: 0xe0002a32, + 0x8098: 0xc45418e1, 0x8099: 0x404ac820, 0x809a: 0x404acc20, 0x809b: 0x404ad020, + 0x809c: 0xe0002a53, 0x809d: 0x404ad420, 0x809e: 0x404ad820, 0x809f: 0x404adc20, + 0x80a0: 0xc48f1d01, 0x80a1: 0x404ae420, 0x80a2: 0xc43c1761, 0x80a3: 0xc4491831, + 0x80a4: 0x404af220, 0x80a5: 0x004af283, 0x80a6: 0xc4831c51, 0x80a7: 0x404afe20, + 0x80a8: 0x404b0220, 0x80a9: 0xe00029b8, 0x80aa: 0x004ae883, 0x80ab: 0x404a7a20, + 0x80ac: 0x404aec20, + 0x80b1: 0xc51b0751, 0x80b2: 0x8282258c, 0x80b3: 0x8281258d, + 0x80b4: 0x82842590, 0x80b5: 0x82812591, 0x80b6: 0x404b2420, 0x80b7: 0x404b2620, + 0x80b8: 0x404b2820, 0x80b9: 0x404b2a20, 0x80ba: 0x82822596, 0x80bb: 0x83822596, + 0x80bc: 0x82822598, 0x80bd: 0x83822598, 0x80be: 0x004ac483, 0x80bf: 0xae611102, + // Block 0x203, offset 0x80c0 + 0x80c0: 0x8382258c, 0x80c1: 0x8281258f, 0x80c2: 0x004ac484, 0x80c3: 0x004ac485, + 0x80c4: 0xae610e02, 0x80c5: 0xae611202, 0x80c6: 0xae600000, 0x80c7: 0xae600000, + 0x80c8: 0xc3a60c01, 0x80c9: 0xc5062551, 0x80ca: 0xae611502, 0x80cb: 0xc5042521, + 0x80cc: 0x404b0e20, 0x80cd: 0x404b0820, 0x80ce: 0x404b0c20, 0x80cf: 0x404b1020, + 0x80d0: 0x82822599, 0x80d1: 0x8282259a, 0x80d2: 0x8282259b, 0x80d3: 0xe0002a7d, + 0x80d4: 0x8282259c, 0x80d5: 0x8282259d, 0x80d6: 0x8282259e, 0x80d7: 0x8282259f, + 0x80d9: 0x828225a0, 0x80da: 0x838225a1, 0x80db: 0x838225a2, + 0x80dc: 0x838225a3, 0x80dd: 0xe0002a83, 0x80de: 0x838225a4, 0x80df: 0x828225a1, + 0x80e0: 0x828225a2, 0x80e1: 0x828225a3, 0x80e2: 0xe0002a80, 0x80e3: 0x828225a4, + 0x80e4: 0x828225a5, 0x80e5: 0x828225a6, 0x80e6: 0x828225a7, 0x80e7: 0xe0002a86, + 0x80e8: 0x828225a8, 0x80e9: 0x828225a9, 0x80ea: 0x828225aa, 0x80eb: 0x828225ab, + 0x80ec: 0xe0002a89, 0x80ed: 0x828225ac, 0x80ee: 0x828225ad, 0x80ef: 0x828225ae, + 0x80f0: 0x828225af, 0x80f1: 0x828225b0, 0x80f2: 0xc5092581, 0x80f3: 0xc5122581, + 0x80f4: 0x828225b3, 0x80f5: 0x838225b3, 0x80f6: 0x828225b4, 0x80f7: 0x828225b5, + 0x80f8: 0x828225b6, 0x80f9: 0xe0002a7a, 0x80fa: 0x838225ac, 0x80fb: 0x838225b0, + 0x80fc: 0x838225b1, 0x80fe: 0x40077e20, 0x80ff: 0x40078020, + // Block 0x204, offset 0x8100 + 0x8100: 0xa0000000, 0x8101: 0xa0000000, 0x8102: 0xa0000000, 0x8103: 0xa0000000, + 0x8104: 0xa0000000, 0x8105: 0xa0000000, 0x8106: 0xa0000000, 0x8107: 0xa0000000, + 0x8108: 0xa0000000, 0x8109: 0x40020020, 0x810a: 0x40020220, 0x810b: 0x40020420, + 0x810c: 0x40020620, 0x810d: 0x40020820, 0x810e: 0xa0000000, 0x810f: 0xa0000000, + 0x8110: 0xa0000000, 0x8111: 0xa0000000, 0x8112: 0xa0000000, 0x8113: 0xa0000000, + 0x8114: 0xa0000000, 0x8115: 0xa0000000, 0x8116: 0xa0000000, 0x8117: 0xa0000000, + 0x8118: 0xa0000000, 0x8119: 0xa0000000, 0x811a: 0xa0000000, 0x811b: 0xa0000000, + 0x811c: 0xa0000000, 0x811d: 0xa0000000, 0x811e: 0xa0000000, 0x811f: 0xa0000000, + 0x8120: 0x40021220, 0x8121: 0x4002ba20, 0x8122: 0x4003e020, 0x8123: 0x4004ea20, + 0x8124: 0x4027de20, 0x8125: 0x4004ec20, 0x8126: 0x4004e620, 0x8127: 0x4003d220, + 0x8128: 0x4003f420, 0x8129: 0x4003f620, 0x812a: 0x4004d820, 0x812b: 0x40093820, + 0x812c: 0x40024020, 0x812d: 0x40021a20, 0x812e: 0x4002e420, 0x812f: 0x4004e220, + 0x8130: 0x4029cc20, 0x8131: 0x4029ce20, 0x8132: 0x4029d020, 0x8133: 0x4029d220, + 0x8134: 0x4029d420, 0x8135: 0x4029d620, 0x8136: 0x4029d820, 0x8137: 0x4029da20, + 0x8138: 0x4029dc20, 0x8139: 0x4029de20, 0x813a: 0x40026c20, 0x813b: 0x40026220, + 0x813c: 0x40094020, 0x813d: 0x40094220, 0x813e: 0x40094420, 0x813f: 0x4002c420, + // Block 0x205, offset 0x8140 + 0x8140: 0x4004d620, 0x8141: 0x002bde88, 0x8142: 0x002c0a88, 0x8143: 0x002c3a88, + 0x8144: 0xc36a2662, 0x8145: 0x002c9888, 0x8146: 0x002d0888, 0x8147: 0xc51f2692, + 0x8148: 0x002d6888, 0x8149: 0x002d9a88, 0x814a: 0x002dcc88, 0x814b: 0xc52426c2, + 0x814c: 0xc0030002, 0x814d: 0x002e8288, 0x814e: 0xc52926f2, 0x814f: 0x002ee288, + 0x8150: 0x002f2c88, 0x8151: 0x002f5688, 0x8152: 0x002f7a88, 0x8153: 0x002fe688, + 0x8154: 0xc38a2722, 0x8155: 0x00306c88, 0x8156: 0x0030be88, 0x8157: 0x0030e288, + 0x8158: 0x002d6a83, 0x8159: 0x00310088, 0x815a: 0x00312a88, 0x815b: 0x4003f820, + 0x815c: 0x4004e420, 0x815d: 0x4003fa20, 0x815e: 0x40062420, 0x815f: 0x40021620, + 0x8160: 0x40061e20, 0x8161: 0x402bde20, 0x8162: 0x402c0a20, 0x8163: 0x402c3a20, + 0x8164: 0xc3682651, 0x8165: 0x402c9820, 0x8166: 0x402d0820, 0x8167: 0xc3372681, + 0x8168: 0x402d6820, 0x8169: 0x402d9a20, 0x816a: 0x402dcc20, 0x816b: 0xc52226b1, + 0x816c: 0xc0000002, 0x816d: 0x402e8220, 0x816e: 0xc52726e1, 0x816f: 0x402ee220, + 0x8170: 0x402f2c20, 0x8171: 0x402f5620, 0x8172: 0x402f7a20, 0x8173: 0x402fe620, + 0x8174: 0xc3882711, 0x8175: 0x40306c20, 0x8176: 0x4030be20, 0x8177: 0x4030e220, + 0x8178: 0x402d6a20, 0x8179: 0x40310020, 0x817a: 0x40312a20, 0x817b: 0x4003fc20, + 0x817c: 0x40094820, 0x817d: 0x4003fe20, 0x817e: 0x40094c20, 0x817f: 0xa0000000, + // Block 0x206, offset 0x8180 + 0x8180: 0xe00008f5, 0x8181: 0xe00008ef, 0x8182: 0xe0002a8f, 0x8183: 0xe0000969, + 0x8184: 0xe000095b, 0x8185: 0xe000094d, 0x8186: 0xe00009dd, 0x8187: 0xe0000a53, + 0x8188: 0xe0000ae8, 0x8189: 0xe0000ae2, 0x818a: 0xe0002ac3, 0x818b: 0xe0000b20, + 0x818c: 0xe0000c2b, 0x818d: 0xe0000c25, 0x818e: 0xe0002afd, 0x818f: 0xe0000c43, + 0x8190: 0xe0000ab3, 0x8191: 0xe0000d63, 0x8192: 0xe0000d9a, 0x8193: 0xe0000d94, + 0x8194: 0xe0002b09, 0x8195: 0xe0000de6, 0x8196: 0xe0000dd2, 0x8197: 0x40093e20, + 0x8198: 0xe0000e12, 0x8199: 0xe0000fe1, 0x819a: 0xe0000fdb, 0x819b: 0xe0002b3d, + 0x819c: 0xe0000fff, 0x819d: 0xe0001102, 0x819e: 0x00318888, 0x819f: 0xe0000f7b, + 0x81a0: 0xe00008f2, 0x81a1: 0xe00008ec, 0x81a2: 0xe0002a8c, 0x81a3: 0xe0000966, + 0x81a4: 0xe0000958, 0x81a5: 0xe000094a, 0x81a6: 0xe00009d5, 0x81a7: 0xe0000a4d, + 0x81a8: 0xe0000ae5, 0x81a9: 0xe0000adf, 0x81aa: 0xe0002ac0, 0x81ab: 0xe0000b1d, + 0x81ac: 0xe0000c28, 0x81ad: 0xe0000c22, 0x81ae: 0xe0002afa, 0x81af: 0xe0000c40, + 0x81b0: 0xe0000aad, 0x81b1: 0xe0000d60, 0x81b2: 0xe0000d97, 0x81b3: 0xe0000d91, + 0x81b4: 0xe0002b06, 0x81b5: 0xe0000de3, 0x81b6: 0xe0000dcf, 0x81b7: 0x40093c20, + 0x81b8: 0xe0000e0f, 0x81b9: 0xe0000fde, 0x81ba: 0xe0000fd8, 0x81bb: 0xe0002b3a, + 0x81bc: 0xe0000ffc, 0x81bd: 0xe00010ff, 0x81be: 0x40318820, 0x81bf: 0xe0001114, + // Block 0x207, offset 0x81c0 + 0x81c0: 0xe0000983, 0x81c1: 0xe0000980, 0x81c2: 0xe00008fb, 0x81c3: 0xe00008f8, + 0x81c4: 0xe000097d, 0x81c5: 0xe000097a, 0x81c6: 0xe0000a38, 0x81c7: 0xe0000a35, + 0x81c8: 0xe0002abd, 0x81c9: 0xe0002aba, 0x81ca: 0xe0000a4a, 0x81cb: 0xe0000a47, + 0x81cc: 0xe0000a44, 0x81cd: 0xe0000a41, 0x81ce: 0xe0000a86, 0x81cf: 0xe0000a83, + 0x81d0: 0xe0000aaa, 0x81d1: 0xe0000aa7, 0x81d2: 0xe0000b46, 0x81d3: 0xe0000b43, + 0x81d4: 0xe0000aee, 0x81d5: 0xe0000aeb, 0x81d6: 0xe0000b2c, 0x81d7: 0xe0000b29, + 0x81d8: 0xe0000b40, 0x81d9: 0xe0000b3d, 0x81da: 0xe0000b1a, 0x81db: 0xe0000b17, + 0x81dc: 0xe0002af1, 0x81dd: 0xe0002aee, 0x81de: 0xe0000bb2, 0x81df: 0xe0000baf, + 0x81e0: 0xe0000bc4, 0x81e1: 0xe0000bc1, 0x81e2: 0xe0000bca, 0x81e3: 0xe0000bc7, + 0x81e4: 0xe0002af7, 0x81e5: 0xe0002af4, 0x81e6: 0xe0000c1b, 0x81e7: 0xe0000c18, + 0x81e8: 0xe0000c51, 0x81e9: 0xe0000c4e, 0x81ea: 0xe0000c60, 0x81eb: 0xe0000c5d, + 0x81ec: 0xe0000c31, 0x81ed: 0xe0000c2e, 0x81ee: 0xe0000c5a, 0x81ef: 0xe0000c57, + 0x81f0: 0xe0000c54, 0x81f1: 0x402da220, 0x81f2: 0xf0000a0a, 0x81f3: 0xf0000404, + 0x81f4: 0xe0002b03, 0x81f5: 0xe0002b00, 0x81f6: 0xe0000c9f, 0x81f7: 0xe0000c9c, + 0x81f8: 0x402f7220, 0x81f9: 0xe0000ccc, 0x81fa: 0xe0000cc9, 0x81fb: 0xe0000cd8, + 0x81fc: 0xe0000cd5, 0x81fd: 0xe0000cd2, 0x81fe: 0xe0000ccf, 0x81ff: 0xe0000d04, + // Block 0x208, offset 0x8200 + 0x8200: 0xe0000cfe, 0x8201: 0xe0000cf8, 0x8202: 0xe0000cf5, 0x8203: 0xe0000d51, + 0x8204: 0xe0000d4e, 0x8205: 0xe0000d6f, 0x8206: 0xe0000d6c, 0x8207: 0xe0000d5d, + 0x8208: 0xe0000d5a, 0x8209: 0xf0000404, 0x820a: 0x002ea283, 0x820b: 0x402ea220, + 0x820c: 0xe0000e2e, 0x820d: 0xe0000e2b, 0x820e: 0xe0000da0, 0x820f: 0xe0000d9d, + 0x8210: 0xe0000de0, 0x8211: 0xe0000ddd, 0x8212: 0xe0000e93, 0x8213: 0xe0000e8f, + 0x8214: 0xe0000eca, 0x8215: 0xe0000ec7, 0x8216: 0xe0000edc, 0x8217: 0xe0000ed9, + 0x8218: 0xe0000ed0, 0x8219: 0xe0000ecd, 0x821a: 0xe0000f1f, 0x821b: 0xe0000f1c, + 0x821c: 0xe0002b37, 0x821d: 0xe0002b34, 0x821e: 0xe0000f47, 0x821f: 0xe0000f44, + 0x8220: 0xe0000f33, 0x8221: 0xe0000f30, 0x8222: 0xe0000f99, 0x8223: 0xe0000f96, + 0x8224: 0xe0000f8a, 0x8225: 0xe0000f87, 0x8226: 0x00303688, 0x8227: 0x40303620, + 0x8228: 0xe000102b, 0x8229: 0xe0001028, 0x822a: 0xe000103f, 0x822b: 0xe000103c, + 0x822c: 0xe0000fe7, 0x822d: 0xe0000fe4, 0x822e: 0xe0000ff9, 0x822f: 0xe0000ff6, + 0x8230: 0xe0001025, 0x8231: 0xe0001022, 0x8232: 0xe0001039, 0x8233: 0xe0001036, + 0x8234: 0xe0002b43, 0x8235: 0xe0002b40, 0x8236: 0xe0002b49, 0x8237: 0xe0002b46, + 0x8238: 0xe0001117, 0x8239: 0xe000113b, 0x823a: 0xe0001138, 0x823b: 0xe000114d, + 0x823c: 0xe000114a, 0x823d: 0xe0001147, 0x823e: 0xe0001144, 0x823f: 0xe0000f64, + // Block 0x209, offset 0x8240 + 0x8240: 0x402c1a20, 0x8241: 0x002c2a88, 0x8242: 0x002c3288, 0x8243: 0x402c3220, + 0x8244: 0x0031c488, 0x8245: 0x4031c420, 0x8246: 0x002ee483, 0x8247: 0x002c4e88, + 0x8248: 0x402c4e20, 0x8249: 0x002c6683, 0x824a: 0x002c7a88, 0x824b: 0x002c8488, + 0x824c: 0x402c8420, 0x824d: 0xe000115c, 0x824e: 0x002cae88, 0x824f: 0x002cb888, + 0x8250: 0x002c9a83, 0x8251: 0x002d0a83, 0x8252: 0x402d0a20, 0x8253: 0x002d4488, + 0x8254: 0x002d2683, 0x8255: 0x402d7820, 0x8256: 0x002dc288, 0x8257: 0x002db688, + 0x8258: 0x002e0a88, 0x8259: 0x402e0a20, 0x825a: 0x402e3820, 0x825b: 0x402e7220, + 0x825c: 0x0030a088, 0x825d: 0x002eb488, 0x825e: 0x402ebc20, 0x825f: 0x002f1088, + 0x8260: 0xe0000e56, 0x8261: 0xe0000e53, 0x8262: 0x002d6088, 0x8263: 0x402d6020, + 0x8264: 0x002f3e88, 0x8265: 0x402f3e20, 0x8266: 0x002f8288, 0x8267: 0x0031b488, + 0x8268: 0x4031b420, 0x8269: 0x00300888, 0x826a: 0x40301220, 0x826b: 0x40304220, + 0x826c: 0x00304a88, 0x826d: 0x40304a20, 0x826e: 0x00305288, 0x826f: 0xe000105f, + 0x8270: 0xe000105c, 0x8271: 0x0030b488, 0x8272: 0x0030c083, 0x8273: 0x00311888, + 0x8274: 0x40311820, 0x8275: 0x00313488, 0x8276: 0x40313420, 0x8277: 0x00316488, + 0x8278: 0x00316e88, 0x8279: 0x40316e20, 0x827a: 0x40317820, 0x827b: 0x4031a620, + 0x827c: 0x0031bc88, 0x827d: 0x4031bc20, 0x827e: 0xe0000fc9, 0x827f: 0x40319420, + // Block 0x20a, offset 0x8280 + 0x8280: 0x40315820, 0x8281: 0x0031d488, 0x8282: 0x4031d420, 0x8283: 0x002c1a88, + 0x8284: 0x00307c88, 0x8285: 0x0030da88, 0x8286: 0x002ca288, 0x8287: 0x402ca220, + 0x8288: 0x002dde88, 0x8289: 0x402dde20, 0x828a: 0x002f6a88, 0x828b: 0x402f6a20, + 0x828c: 0x002f8e88, 0x828d: 0x402f8e20, 0x828e: 0x00311088, 0x828f: 0x40311020, + 0x8290: 0x402bf020, 0x8291: 0x402bf820, 0x8292: 0x402c0220, 0x8293: 0x402c2a20, + 0x8294: 0x402ee420, 0x8295: 0x402c5620, 0x8296: 0x402c6620, 0x8297: 0x402c7a20, + 0x8298: 0x402ccc20, 0x8299: 0x402cb820, 0x829a: 0x402cd420, 0x829b: 0x402c9a20, + 0x829c: 0x402cdc20, 0x829d: 0x402ce820, 0x829e: 0x402cf020, 0x829f: 0x402dee20, + 0x82a0: 0x402d4420, 0x82a1: 0x402d2a20, 0x82a2: 0x402d3220, 0x82a3: 0x402d2620, + 0x82a4: 0x402d0020, 0x82a5: 0x40308820, 0x82a6: 0x402d8020, 0x82a7: 0x402d8e20, + 0x82a8: 0x402db620, 0x82a9: 0x402dc220, 0x82aa: 0x402daa20, 0x82ab: 0x402e4220, + 0x82ac: 0x402e4a20, 0x82ad: 0x402e5420, 0x82ae: 0x402e6820, 0x82af: 0x4030a020, + 0x82b0: 0x4030ac20, 0x82b1: 0x402e9020, 0x82b2: 0x402eb420, 0x82b3: 0x402ec820, + 0x82b4: 0x402ea620, 0x82b5: 0x402f1020, 0x82b6: 0x402eee20, 0x82b7: 0x402f1a20, + 0x82b8: 0x402f4c20, 0x82b9: 0x402f9820, 0x82ba: 0x402fa220, 0x82bb: 0x402fac20, + 0x82bc: 0x402fb620, 0x82bd: 0x402fbe20, 0x82be: 0x402fc620, 0x82bf: 0x402fd020, + // Block 0x20b, offset 0x82c0 + 0x82c0: 0x402f8220, 0x82c1: 0x402fd820, 0x82c2: 0x402ff420, 0x82c3: 0x40300820, + 0x82c4: 0x402df620, 0x82c5: 0x40301a20, 0x82c6: 0x40302420, 0x82c7: 0x40306420, + 0x82c8: 0x40305220, 0x82c9: 0x40307c20, 0x82ca: 0x4030b420, 0x82cb: 0x4030c020, + 0x82cc: 0x4030da20, 0x82cd: 0x4030ee20, 0x82ce: 0x402e7a20, 0x82cf: 0x40310820, + 0x82d0: 0x40314820, 0x82d1: 0x40315020, 0x82d2: 0x40316420, 0x82d3: 0x40318020, + 0x82d4: 0x4031cc20, 0x82d5: 0x4031e820, 0x82d6: 0x40320a20, 0x82d7: 0x40323220, + 0x82d8: 0x40323a20, 0x82d9: 0x402c1220, 0x82da: 0x402cf820, 0x82db: 0x402d4c20, + 0x82dc: 0x402d7020, 0x82dd: 0x402de620, 0x82de: 0x402e1a20, 0x82df: 0x402e2a20, + 0x82e0: 0x402f6220, 0x82e1: 0x4031fa20, 0x82e2: 0x40320220, 0x82e3: 0xe0000aca, + 0x82e4: 0xe0000adc, 0x82e5: 0xe0000ad9, 0x82e6: 0xe0000fcc, 0x82e7: 0xe0000fcf, + 0x82e8: 0xe0000fba, 0x82e9: 0xe0000ba1, 0x82ea: 0xe0000d11, 0x82eb: 0xe0000d18, + 0x82ec: 0x40324220, 0x82ed: 0x40324a20, 0x82ee: 0x40309020, 0x82ef: 0x40309820, + 0x82f0: 0x002d6894, 0x82f1: 0x002d8094, 0x82f2: 0x002dcc94, 0x82f3: 0x002f7a94, + 0x82f4: 0x002f9894, 0x82f5: 0x002fac94, 0x82f6: 0x002fd894, 0x82f7: 0x0030e294, + 0x82f8: 0x00310094, 0x82f9: 0x40064020, 0x82fa: 0x40064420, 0x82fb: 0x402d9620, + 0x82fc: 0x4031de20, 0x82fd: 0x402d9820, 0x82fe: 0x4031e220, 0x82ff: 0x4031f020, + // Block 0x20c, offset 0x8300 + 0x8300: 0xae603502, 0x8301: 0xae603202, 0x8302: 0xae604202, 0x8303: 0xae604e02, + 0x8304: 0xae605b02, 0x8305: 0xae606302, 0x8306: 0xae603702, 0x8307: 0xae605202, + 0x8308: 0xae604702, 0x8309: 0xae606402, 0x830a: 0xae604302, 0x830b: 0xae604d02, + 0x830c: 0xae604102, 0x830d: 0xae605f02, 0x830e: 0xae605f02, 0x830f: 0xae606502, + 0x8310: 0xae606602, 0x8311: 0xae606702, 0x8312: 0xae605f02, 0x8313: 0xae602202, + 0x8314: 0xae602a02, 0x8315: 0xae805f02, 0x8316: 0xadc06002, 0x8317: 0xadc06002, + 0x8318: 0xadc06002, 0x8319: 0xadc06002, 0x831a: 0xae805f02, 0x831b: 0xad806802, + 0x831c: 0xadc06002, 0x831d: 0xadc06002, 0x831e: 0xadc06002, 0x831f: 0xadc06002, + 0x8320: 0xadc06002, 0x8321: 0xaca06e02, 0x8322: 0xaca06f02, 0x8323: 0xadc07002, + 0x8324: 0xadc07502, 0x8325: 0xadc07602, 0x8326: 0xadc07702, 0x8327: 0xaca05602, + 0x8328: 0xaca05902, 0x8329: 0xadc06002, 0x832a: 0xadc06002, 0x832b: 0xadc06002, + 0x832c: 0xadc06002, 0x832d: 0xadc07802, 0x832e: 0xadc07902, 0x832f: 0xadc06002, + 0x8330: 0xadc07a02, 0x8331: 0xadc07b02, 0x8332: 0xadc02102, 0x8333: 0xadc06002, + 0x8334: 0xa0107c02, 0x8335: 0xa0107d02, 0x8336: 0xa0106102, 0x8337: 0xa0106102, + 0x8338: 0xa0105402, 0x8339: 0xadc07e02, 0x833a: 0xadc06002, 0x833b: 0xadc06002, + 0x833c: 0xadc06002, 0x833d: 0xae605f02, 0x833e: 0xae605f02, 0x833f: 0xae605f02, + // Block 0x20d, offset 0x8340 + 0x8340: 0xe00010d2, 0x8341: 0xe00010cf, 0x8342: 0xe00010cc, 0x8343: 0xe00010c9, + 0x8344: 0xe00010e1, 0x8345: 0xe00010de, 0x8346: 0xe00010e7, 0x8347: 0xe00010e4, + 0x8348: 0xe00010ed, 0x8349: 0xe00010ea, 0x834a: 0xe0002912, 0x834b: 0xe000290f, + 0x834c: 0xe000290c, 0x834d: 0xe0002909, 0x834e: 0xe0001123, 0x834f: 0xe0001120, + 0x8350: 0xe0002b4f, 0x8351: 0xe0002b4c, 0x8352: 0xe0001153, 0x8353: 0xe0001150, + 0x8354: 0xe0001159, 0x8355: 0xe0001156, 0x8356: 0xe0000c15, 0x8357: 0xe0000f8d, + 0x8358: 0xe00010db, 0x8359: 0xe0001111, 0x835a: 0xf0000404, 0x835b: 0xe0000f70, + 0x835c: 0x40300420, 0x835d: 0x40300620, 0x835e: 0xe0000f7f, 0x835f: 0x402c9620, + 0x8360: 0xe000099b, 0x8361: 0xe0000998, 0x8362: 0xe0000989, 0x8363: 0xe0000986, + 0x8364: 0xe0002a96, 0x8365: 0xe0002a92, 0x8366: 0xe0002a9e, 0x8367: 0xe0002a9a, + 0x8368: 0xe0002aae, 0x8369: 0xe0002aaa, 0x836a: 0xe0002aa6, 0x836b: 0xe0002aa2, + 0x836c: 0xe0002ab6, 0x836d: 0xe0002ab2, 0x836e: 0xe0000902, 0x836f: 0xe00008fe, + 0x8370: 0xe000090a, 0x8371: 0xe0000906, 0x8372: 0xe000091a, 0x8373: 0xe0000916, + 0x8374: 0xe0000912, 0x8375: 0xe000090e, 0x8376: 0xe00009a2, 0x8377: 0xe000099e, + 0x8378: 0xe0000b6e, 0x8379: 0xe0000b6b, 0x837a: 0xe0000b5c, 0x837b: 0xe0000b59, + 0x837c: 0xe0000b26, 0x837d: 0xe0000b23, 0x837e: 0xe0002aca, 0x837f: 0xe0002ac6, + // Block 0x20e, offset 0x8380 + 0x8380: 0xe0002ad2, 0x8381: 0xe0002ace, 0x8382: 0xe0002ae2, 0x8383: 0xe0002ade, + 0x8384: 0xe0002ada, 0x8385: 0xe0002ad6, 0x8386: 0xe0002aea, 0x8387: 0xe0002ae6, + 0x8388: 0xe0000c66, 0x8389: 0xe0000c63, 0x838a: 0xe0000c78, 0x838b: 0xe0000c75, + 0x838c: 0xe0000e84, 0x838d: 0xe0000e81, 0x838e: 0xe0000e44, 0x838f: 0xe0000e41, + 0x8390: 0xe0002b10, 0x8391: 0xe0002b0c, 0x8392: 0xe0002b18, 0x8393: 0xe0002b14, + 0x8394: 0xe0002b28, 0x8395: 0xe0002b24, 0x8396: 0xe0002b20, 0x8397: 0xe0002b1c, + 0x8398: 0xe0002b30, 0x8399: 0xe0002b2c, 0x839a: 0xe0000e5d, 0x839b: 0xe0000e59, + 0x839c: 0xe0000e65, 0x839d: 0xe0000e61, 0x839e: 0xe0000e75, 0x839f: 0xe0000e71, + 0x83a0: 0xe0000e6d, 0x83a1: 0xe0000e69, 0x83a2: 0xe0000e7d, 0x83a3: 0xe0000e79, + 0x83a4: 0xe000108d, 0x83a5: 0xe000108a, 0x83a6: 0xe000104d, 0x83a7: 0xe000104a, + 0x83a8: 0xe0001066, 0x83a9: 0xe0001062, 0x83aa: 0xe000106e, 0x83ab: 0xe000106a, + 0x83ac: 0xe000107e, 0x83ad: 0xe000107a, 0x83ae: 0xe0001076, 0x83af: 0xe0001072, + 0x83b0: 0xe0001086, 0x83b1: 0xe0001082, 0x83b2: 0xe0001108, 0x83b3: 0xe0001105, + 0x83b4: 0xe0001135, 0x83b5: 0xe0001132, 0x83b6: 0xe000112f, 0x83b7: 0xe000112c, + 0x83b8: 0xe000111d, 0x83b9: 0xe000111a, 0x83ba: 0xe0000d0a, 0x83bb: 0xe0000d07, + 0x83bc: 0x0030d888, 0x83bd: 0x4030d820, 0x83be: 0x00312088, 0x83bf: 0x40312020, + // Block 0x20f, offset 0x83c0 + 0x83c0: 0x00093685, 0x83c1: 0x40083620, 0x83c2: 0x40083820, 0x83c3: 0x40083a20, + 0x83c4: 0x40083c20, 0x83c5: 0x002c628b, 0x83c6: 0x002c6285, 0x83c7: 0x002c9885, + 0x83c8: 0x002d9a85, 0x83c9: 0x002dcc85, 0x83ca: 0x40083e20, 0x83cb: 0x400a6e20, + 0x83cc: 0x40084020, 0x83cd: 0xe00009c4, 0x83ce: 0x402d1e20, 0x83cf: 0x40084220, + 0x83d0: 0xe00002cb, 0x83d1: 0xe00002d3, 0x83d2: 0xe00002b2, 0x83d3: 0xe00002bb, + 0x83d4: 0xe00003cd, 0x83d5: 0xe00002c3, 0x83d6: 0xe00003d1, 0x83d7: 0xe00004ab, + 0x83d8: 0xe0000579, 0x83d9: 0xe00002c7, 0x83da: 0xe0000640, 0x83db: 0xe00002cf, + 0x83dc: 0xe00004af, 0x83dd: 0xe0000644, 0x83de: 0xe0000798, 0x83df: 0xf0001e1e, + 0x83e0: 0x002d9a8a, 0x83e1: 0xf0001f0a, 0x83e2: 0xf0000a0a, 0x83e3: 0xf0001f0a, + 0x83e4: 0x0030be8a, 0x83e5: 0xf0001f0a, 0x83e6: 0xf0000a0a, 0x83e7: 0xe00010bb, + 0x83e8: 0xe00027f4, 0x83e9: 0x0030f68a, 0x83ea: 0xe0002883, 0x83eb: 0xe000288a, + 0x83ec: 0x002e228a, 0x83ed: 0x002c3a8a, 0x83ee: 0x002c628a, 0x83ef: 0x002e828a, + 0x83f0: 0x002d9a84, 0x83f1: 0xf0001f04, 0x83f2: 0xf0000404, 0x83f3: 0xf0001f04, + 0x83f4: 0x0030be84, 0x83f5: 0xf0001f04, 0x83f6: 0xf0000404, 0x83f7: 0xe00010b6, + 0x83f8: 0xe00027f1, 0x83f9: 0x0030f684, 0x83fa: 0xe0002880, 0x83fb: 0xe0002886, + 0x83fc: 0x002e2284, 0x83fd: 0x002c3a84, 0x83fe: 0x002c6284, 0x83ff: 0x002e8284, + // Block 0x210, offset 0x8400 + 0x8400: 0xe0000024, 0x8401: 0xe0000029, 0x8402: 0xe000002e, 0x8403: 0xe0000033, + 0x8404: 0xe0000038, 0x8405: 0xe000003d, 0x8406: 0xe0000042, 0x8407: 0xe0000047, + 0x8408: 0xf0001f04, 0x8409: 0xf0001f04, 0x840a: 0xf0001f04, 0x840b: 0xf0001f04, + 0x840c: 0xf0001f04, 0x840d: 0xf0001f04, 0x840e: 0xf0001f04, 0x840f: 0xf0001f04, + 0x8410: 0xf0001f04, 0x8411: 0xf0000404, 0x8412: 0xf0000404, 0x8413: 0xf0000404, + 0x8414: 0xf0000404, 0x8415: 0xf0000404, 0x8416: 0xf0000404, 0x8417: 0xf0000404, + 0x8418: 0xf0000404, 0x8419: 0xf0000404, 0x841a: 0xf0000404, 0x841b: 0xf0000404, + 0x841c: 0xf0000404, 0x841d: 0xf0000404, 0x841e: 0xf0000404, 0x841f: 0xf0000404, + 0x8420: 0xf0000404, 0x8421: 0xf0000404, 0x8422: 0xf0000404, 0x8423: 0xf0000404, + 0x8424: 0xf0000404, 0x8425: 0xf0000404, 0x8426: 0xf0000404, 0x8427: 0xf0000404, + 0x8428: 0xf0000404, 0x8429: 0xf0000404, 0x842a: 0xf0000404, 0x842b: 0xf0000404, + 0x842c: 0xf0000404, 0x842d: 0xf0000404, 0x842e: 0xf0000404, 0x842f: 0xf0000404, + 0x8430: 0xf0000404, 0x8431: 0xf0000404, 0x8432: 0xf0000404, 0x8433: 0xe00024e7, + 0x8434: 0xf0000404, 0x8435: 0xf0000404, 0x8436: 0x002bde8c, 0x8437: 0x002c0a8c, + 0x8438: 0x002c3a8c, 0x8439: 0x002c628c, 0x843a: 0x002c988c, 0x843b: 0x002d088c, + 0x843c: 0x002d228c, 0x843d: 0x002d688c, 0x843e: 0x002d9a8c, 0x843f: 0x002dcc8c, + // Block 0x211, offset 0x8440 + 0x8440: 0xf0001d1c, 0x8441: 0xf0001d1d, 0x8442: 0xe00009b7, 0x8443: 0xf0001c1d, + 0x8444: 0xf0001c1c, 0x8445: 0xf0001c1c, 0x8446: 0xe0000a66, 0x8447: 0xe0000a7a, + 0x8448: 0xf0001d1c, 0x8449: 0xf0001c1d, 0x844a: 0xf0001c1c, 0x844b: 0xf0001d1d, + 0x844c: 0xf0001c1c, 0x844d: 0xf0001d1d, 0x844e: 0xf0001d1d, 0x844f: 0xf0001c1c, + 0x8450: 0xf0001c1c, 0x8451: 0xf0001c1c, 0x8452: 0xe0000d0d, 0x8453: 0xe0002818, + 0x8454: 0xf0001c1c, 0x8455: 0xe0000d3a, 0x8456: 0xe0000d46, 0x8457: 0xf0001d1d, + 0x8458: 0xe0000eb0, 0x8459: 0xe0000eb8, 0x845a: 0xf0001d1d, 0x845b: 0xf0001c1c, + 0x845c: 0xf0001c1d, 0x845d: 0xf0001c1d, 0x845e: 0xe00010b2, 0x845f: 0xe00009c8, + 0x8460: 0xf0001f04, 0x8461: 0xf0001f04, 0x8462: 0xf0001f04, 0x8463: 0xf0001f04, + 0x8464: 0xf0001f04, 0x8465: 0xf0001f04, 0x8466: 0xf0001f04, 0x8467: 0xf0001f04, + 0x8468: 0xf0001f04, 0x8469: 0xf0000404, 0x846a: 0xf0000404, 0x846b: 0xf0000404, + 0x846c: 0xf0000404, 0x846d: 0xf0000404, 0x846e: 0xf0000404, 0x846f: 0xf0000404, + 0x8470: 0xf0000404, 0x8471: 0xf0000404, 0x8472: 0xf0000404, 0x8473: 0xf0000404, + 0x8474: 0xf0000404, 0x8475: 0xf0000404, 0x8476: 0xf0000404, 0x8477: 0xf0000404, + 0x8478: 0xf0000404, 0x8479: 0xf0000404, 0x847a: 0xf0000404, 0x847b: 0xf0000404, + 0x847c: 0xf0000404, 0x847d: 0xf0000404, 0x847e: 0xf0000404, 0x847f: 0xe0000bdf, + // Block 0x212, offset 0x8480 + 0x8480: 0xf0001f04, 0x8481: 0xf0001f04, 0x8482: 0xf0001f04, 0x8483: 0xf0001f04, + 0x8484: 0xf0001f04, 0x8485: 0xf0001f04, 0x8486: 0xf0001f04, 0x8487: 0xf0001f04, + 0x8488: 0xf0001f04, 0x8489: 0xf0001f04, 0x848a: 0xf0001f04, + 0x8490: 0xf0000a04, 0x8491: 0xf0000a04, 0x8492: 0xf0000a04, 0x8493: 0xf0000a04, + 0x8494: 0xf0000a04, 0x8495: 0xf0000a04, 0x8496: 0xf0000a04, 0x8497: 0xf0000a04, + 0x8498: 0xf0000a04, 0x8499: 0xf0000a04, 0x849a: 0xf0000a04, 0x849b: 0xf0000a04, + 0x849c: 0xf0000a04, 0x849d: 0xf0000a04, 0x849e: 0xf0000a04, 0x849f: 0xf0000a04, + 0x84a0: 0xf0000a04, 0x84a1: 0xf0000a04, 0x84a2: 0xf0000a04, 0x84a3: 0xf0000a04, + 0x84a4: 0xf0000a04, 0x84a5: 0xf0000a04, 0x84a6: 0xf0000a04, 0x84a7: 0xe00024eb, + 0x84a8: 0xf0000a04, 0x84a9: 0xf0000a04, 0x84aa: 0xf0000a04, 0x84ab: 0x002c3a8c, + 0x84ac: 0x002f7a8c, 0x84ad: 0xf0000c0c, 0x84ae: 0xf0000c0c, + 0x84b0: 0x002bde9d, 0x84b1: 0x002c0a9d, 0x84b2: 0x002c3a9d, 0x84b3: 0x002c629d, + 0x84b4: 0x002c989d, 0x84b5: 0x002d089d, 0x84b6: 0x002d229d, 0x84b7: 0x002d689d, + 0x84b8: 0x002d9a9d, 0x84b9: 0x002dcc9d, 0x84ba: 0x002dfe9d, 0x84bb: 0x002e229d, + 0x84bc: 0x002e829d, 0x84bd: 0x002e9e9d, 0x84be: 0x002ee29d, 0x84bf: 0x002f2c9d, + // Block 0x213, offset 0x84c0 + 0x84c0: 0xa0000000, 0x84c1: 0xa0000000, 0x84c2: 0xa0000000, 0x84c3: 0xa0000000, + 0x84c4: 0xa0000000, 0x84c5: 0xa0000000, 0x84c6: 0xa0000000, 0x84c7: 0xa0000000, + 0x84c8: 0xa0000000, 0x84c9: 0x40020020, 0x84ca: 0x40020220, 0x84cb: 0x40020420, + 0x84cc: 0x40020620, 0x84cd: 0x40020820, 0x84ce: 0xa0000000, 0x84cf: 0xa0000000, + 0x84d0: 0xa0000000, 0x84d1: 0xa0000000, 0x84d2: 0xa0000000, 0x84d3: 0xa0000000, + 0x84d4: 0xa0000000, 0x84d5: 0xa0000000, 0x84d6: 0xa0000000, 0x84d7: 0xa0000000, + 0x84d8: 0xa0000000, 0x84d9: 0xa0000000, 0x84da: 0xa0000000, 0x84db: 0xa0000000, + 0x84dc: 0xa0000000, 0x84dd: 0xa0000000, 0x84de: 0xa0000000, 0x84df: 0xa0000000, + 0x84e0: 0x402be020, 0x84e1: 0x402be220, 0x84e2: 0x402be420, 0x84e3: 0x402be620, + 0x84e4: 0x402be820, 0x84e5: 0x402bea20, 0x84e6: 0x402bec20, 0x84e7: 0x402bee20, + 0x84e8: 0x402bf020, 0x84e9: 0x402bf220, 0x84ea: 0x402bf420, 0x84eb: 0x402bf620, + 0x84ec: 0x402bf820, 0x84ed: 0x402bfa20, 0x84ee: 0x402bfc20, 0x84ef: 0x402bfe20, + 0x84f0: 0x402c0020, 0x84f1: 0x402c0220, 0x84f2: 0x402c0420, 0x84f3: 0x402c0620, + 0x84f4: 0x402c0820, 0x84f5: 0x402c0a20, 0x84f6: 0x402c0c20, 0x84f7: 0x402c0e20, + 0x84f8: 0x402c1020, 0x84f9: 0x402c1220, 0x84fa: 0x402c1420, 0x84fb: 0x402c1620, + 0x84fc: 0x402c1820, 0x84fd: 0x402c1a20, 0x84fe: 0x402c1c20, 0x84ff: 0x402c1e20, + // Block 0x214, offset 0x8500 + 0x8500: 0x402c2020, 0x8501: 0x402c2220, 0x8502: 0x402c2420, 0x8503: 0x402c2620, + 0x8504: 0x402c2820, 0x8505: 0x402c2a20, 0x8506: 0x402c2c20, 0x8507: 0x402c2e20, + 0x8508: 0x402c3020, 0x8509: 0x402c3220, 0x850a: 0x402c3420, 0x850b: 0x402c3620, + 0x850c: 0xc52f0002, 0x850d: 0x402c3a20, 0x850e: 0x402c3c20, 0x850f: 0x402c3e20, + 0x8510: 0x402c4020, 0x8511: 0x402c4220, 0x8512: 0x402c4420, 0x8513: 0x402c4620, + 0x8514: 0x402c4820, 0x8515: 0x402c4a20, 0x8516: 0x402c4c20, 0x8517: 0x402c4e20, + 0x8518: 0x402c5020, 0x8519: 0x402c5220, 0x851a: 0x402c5420, 0x851b: 0x402c5620, + 0x851c: 0x402c5820, 0x851d: 0x402c5a20, 0x851e: 0x402c5c20, 0x851f: 0x402c5e20, + 0x8520: 0x402c6020, 0x8521: 0x402c6220, 0x8522: 0x402c6420, 0x8523: 0x402c6620, + 0x8524: 0x402c6820, 0x8525: 0x402c6a20, 0x8526: 0x402c6c20, 0x8527: 0x402c6e20, + 0x8528: 0x402c7020, 0x8529: 0x402c7220, 0x852a: 0x402c7420, 0x852b: 0x402c7620, + 0x852c: 0xc52c0002, 0x852d: 0x402c7a20, 0x852e: 0x402c7c20, 0x852f: 0x402c7e20, + 0x8530: 0x402c8020, 0x8531: 0x402c8220, 0x8532: 0x402c8420, 0x8533: 0x402c8620, + 0x8534: 0x402c8820, 0x8535: 0x402c8a20, 0x8536: 0x402c8c20, 0x8537: 0x402c8e20, + 0x8538: 0x402c9020, 0x8539: 0x402c9220, 0x853a: 0x402c9420, 0x853b: 0x402c9620, + 0x853c: 0x402c9820, 0x853d: 0x402c9a20, 0x853e: 0x402c9c20, 0x853f: 0x402c9e20, + // Block 0x215, offset 0x8540 + 0x8540: 0xe0002ed5, 0x8541: 0xe0002ed2, 0x8542: 0xe0002eeb, 0x8543: 0xe0002f0f, + 0x8544: 0xe0002f08, 0x8545: 0xe0002f01, 0x8546: 0xe00009dd, 0x8547: 0xe0002f4b, + 0x8548: 0xe0002f67, 0x8549: 0xe0002f64, 0x854a: 0xe0002f6d, 0x854b: 0xe0002f83, + 0x854c: 0xe0002fe7, 0x854d: 0xe0002fe4, 0x854e: 0xe0002fed, 0x854f: 0xe0002ff3, + 0x8550: 0xe0000ab3, 0x8551: 0xe000305b, 0x8552: 0xe0003070, 0x8553: 0xe000306d, + 0x8554: 0xe0003076, 0x8555: 0xe0003096, 0x8556: 0xe000308c, 0x8557: 0x40093e20, + 0x8558: 0xe0000e12, 0x8559: 0xe0003140, 0x855a: 0xe000313d, 0x855b: 0xe0003146, + 0x855c: 0xe000314f, 0x855d: 0xe00031c0, 0x855e: 0x00318888, 0x855f: 0xe0000f7b, + 0x8560: 0xe00031f0, 0x8561: 0xe00031ed, 0x8562: 0xe0003206, 0x8563: 0xe000322a, + 0x8564: 0xe0003223, 0x8565: 0xe000321c, 0x8566: 0xe00009d5, 0x8567: 0xe000327e, + 0x8568: 0xe000329a, 0x8569: 0xe0003297, 0x856a: 0xe00032a0, 0x856b: 0xe00032b6, + 0x856c: 0xe000331d, 0x856d: 0xe000331a, 0x856e: 0xe0003323, 0x856f: 0xe0003329, + 0x8570: 0xe0000aad, 0x8571: 0xe0003385, 0x8572: 0xe000339a, 0x8573: 0xe0003397, + 0x8574: 0xe00033a0, 0x8575: 0xe00033c0, 0x8576: 0xe00033b6, 0x8577: 0x40093c20, + 0x8578: 0xe0000e0f, 0x8579: 0xe000346d, 0x857a: 0xe000346a, 0x857b: 0xe0003473, + 0x857c: 0xe000347c, 0x857d: 0xe00034f0, 0x857e: 0x40318820, 0x857f: 0xe00034fc, + // Block 0x216, offset 0x8580 + 0x8580: 0xe0002f1c, 0x8581: 0xe0003237, 0x8582: 0xe0002ed8, 0x8583: 0xe00031f3, + 0x8584: 0xe0002f19, 0x8585: 0xe0003234, 0x8586: 0xe0002f3f, 0x8587: 0xe0003272, + 0x8588: 0xe0002f42, 0x8589: 0xe0003275, 0x858a: 0xe0002f48, 0x858b: 0xe000327b, + 0x858c: 0xe0002f45, 0x858d: 0xe0003278, 0x858e: 0xe0002f52, 0x858f: 0xe0003285, + 0x8590: 0xe0000aaa, 0x8591: 0xe0000aa7, 0x8592: 0xe0002f96, 0x8593: 0xe00032c9, + 0x8594: 0xe0002f6a, 0x8595: 0xe000329d, 0x8596: 0xe0002f89, 0x8597: 0xe00032bc, + 0x8598: 0xe0002f93, 0x8599: 0xe00032c6, 0x859a: 0xe0002f80, 0x859b: 0xe00032b3, + 0x859c: 0xe0002fc0, 0x859d: 0xe00032f3, 0x859e: 0xe0002fbd, 0x859f: 0xe00032f0, + 0x85a0: 0xe0002fc6, 0x85a1: 0xe00032f9, 0x85a2: 0xe0002fc9, 0x85a3: 0xe00032fc, + 0x85a4: 0xe0002fcf, 0x85a5: 0xe0003302, 0x85a6: 0xe0000c1b, 0x85a7: 0xe0000c18, + 0x85a8: 0xe0002ffa, 0x85a9: 0xe0003330, 0x85aa: 0xe0003003, 0x85ab: 0xe0003336, + 0x85ac: 0xe0002fea, 0x85ad: 0xe0003320, 0x85ae: 0xe0003000, 0x85af: 0xe0003333, + 0x85b0: 0xe0002ffd, 0x85b1: 0x402da220, 0x85b2: 0xe00027e2, 0x85b3: 0xe00027df, + 0x85b4: 0xe0003015, 0x85b5: 0xe0003348, 0x85b6: 0xe000301e, 0x85b7: 0xe0003354, + 0x85b8: 0x402f7220, 0x85b9: 0xe0003027, 0x85ba: 0xe000335d, 0x85bb: 0xe000302d, + 0x85bc: 0xe0003363, 0x85bd: 0xe000302a, 0x85be: 0xe0003360, 0x85bf: 0xe0000d04, + // Block 0x217, offset 0x85c0 + 0x85c0: 0xe0000cfe, 0x85c1: 0xe0000cf8, 0x85c2: 0xe0000cf5, 0x85c3: 0xe0003052, + 0x85c4: 0xe000337c, 0x85c5: 0xe0003061, 0x85c6: 0xe000338b, 0x85c7: 0xe0003058, + 0x85c8: 0xe0003382, 0x85c9: 0xe00035a1, 0x85ca: 0x002eda88, 0x85cb: 0x402eda20, + 0x85cc: 0xe00030b3, 0x85cd: 0xe00033dd, 0x85ce: 0xe0003073, 0x85cf: 0xe000339d, + 0x85d0: 0xe0003093, 0x85d1: 0xe00033bd, 0x85d2: 0xe0000e93, 0x85d3: 0xe0000e8f, + 0x85d4: 0xe00030eb, 0x85d5: 0xe0003415, 0x85d6: 0xe00030f4, 0x85d7: 0xe000341e, + 0x85d8: 0xe00030ee, 0x85d9: 0xe0003418, 0x85da: 0xe0003107, 0x85db: 0xe0003431, + 0x85dc: 0xe000310e, 0x85dd: 0xe0003438, 0x85de: 0xe000311b, 0x85df: 0xe0003445, + 0x85e0: 0xe0003111, 0x85e1: 0xe000343b, 0x85e2: 0xe000312e, 0x85e3: 0xe000345b, + 0x85e4: 0xe0003128, 0x85e5: 0xe0003452, 0x85e6: 0x00303688, 0x85e7: 0x40303620, + 0x85e8: 0xe0003165, 0x85e9: 0xe0003492, 0x85ea: 0xe000316f, 0x85eb: 0xe000349c, + 0x85ec: 0xe0003143, 0x85ed: 0xe0003470, 0x85ee: 0xe000314c, 0x85ef: 0xe0003479, + 0x85f0: 0xe0003162, 0x85f1: 0xe000348f, 0x85f2: 0xe000316c, 0x85f3: 0xe0003499, + 0x85f4: 0xe00031ae, 0x85f5: 0xe00034db, 0x85f6: 0xe00031c6, 0x85f7: 0xe00034f6, + 0x85f8: 0xe00031c9, 0x85f9: 0xe00031db, 0x85fa: 0xe000350e, 0x85fb: 0xe00031e4, + 0x85fc: 0xe0003517, 0x85fd: 0xe00031e1, 0x85fe: 0xe0003514, 0x85ff: 0xe0000f64, + // Block 0x218, offset 0x8600 + 0x8600: 0x402c1a20, 0x8601: 0x002c2a88, 0x8602: 0x002c3288, 0x8603: 0x402c3220, + 0x8604: 0x0031c488, 0x8605: 0x4031c420, 0x8606: 0x002efa88, 0x8607: 0x002c4e88, + 0x8608: 0x402c4e20, 0x8609: 0x002c7288, 0x860a: 0x002c7a88, 0x860b: 0x002c8488, + 0x860c: 0x402c8420, 0x860d: 0xe000115c, 0x860e: 0x002cae88, 0x860f: 0x002cb888, + 0x8610: 0x002cc288, 0x8611: 0x002d1688, 0x8612: 0x402d1620, 0x8613: 0x002d4488, + 0x8614: 0x002d5888, 0x8615: 0x402d7820, 0x8616: 0x002dc288, 0x8617: 0x002db688, + 0x8618: 0x002e0a88, 0x8619: 0x402e0a20, 0x861a: 0x402e3820, 0x861b: 0x402e7220, + 0x861c: 0x0030a088, 0x861d: 0x002eb488, 0x861e: 0x402ebc20, 0x861f: 0x002f1088, + 0x8620: 0xe00030c7, 0x8621: 0xe00033f1, 0x8622: 0x002d6088, 0x8623: 0x402d6020, + 0x8624: 0x002f3e88, 0x8625: 0x402f3e20, 0x8626: 0x002f8288, 0x8627: 0x0031b488, + 0x8628: 0x4031b420, 0x8629: 0x00300888, 0x862a: 0x40301220, 0x862b: 0x40304220, + 0x862c: 0x00304a88, 0x862d: 0x40304a20, 0x862e: 0x00305288, 0x862f: 0xe000317f, + 0x8630: 0xe00034ac, 0x8631: 0x0030b488, 0x8632: 0x0030cc88, 0x8633: 0x00311888, + 0x8634: 0x40311820, 0x8635: 0x00313488, 0x8636: 0x40313420, 0x8637: 0x00316488, + 0x8638: 0x00316e88, 0x8639: 0x40316e20, 0x863a: 0x40317820, 0x863b: 0x4031a620, + 0x863c: 0x0031bc88, 0x863d: 0x4031bc20, 0x863e: 0xe0000fc9, 0x863f: 0x40319420, + // Block 0x219, offset 0x8640 + 0x8640: 0x40321220, 0x8641: 0x40321a20, 0x8642: 0x40322220, 0x8643: 0x40322a20, + 0x8644: 0xe0000ad5, 0x8645: 0xe0000ad1, 0x8646: 0xe0000acd, 0x8647: 0xe0003535, + 0x8648: 0xe0003532, 0x8649: 0xe000352f, 0x864a: 0xe000357a, 0x864b: 0xe0003577, + 0x864c: 0xe0003574, 0x864d: 0xe0002efe, 0x864e: 0xe0003219, 0x864f: 0xe0002ff0, + 0x8650: 0xe0003326, 0x8651: 0xe0003089, 0x8652: 0xe00033b3, 0x8653: 0xe0003149, + 0x8654: 0xe0003476, 0x8655: 0xe000315e, 0x8656: 0xe000348b, 0x8657: 0xe0003152, + 0x8658: 0xe000347f, 0x8659: 0xe000315a, 0x865a: 0xe0003487, 0x865b: 0xe0003156, + 0x865c: 0xe0003483, 0x865d: 0x402cae20, 0x865e: 0xe0002f0b, 0x865f: 0xe0003226, + 0x8660: 0xe0002f15, 0x8661: 0xe0003230, 0x8662: 0xe00009f4, 0x8663: 0xe00009ef, + 0x8664: 0x002d3a88, 0x8665: 0x402d3a20, 0x8666: 0xe0002fc3, 0x8667: 0xe00032f6, + 0x8668: 0xe000301b, 0x8669: 0xe0003351, 0x866a: 0xe00030ac, 0x866b: 0xe00033d6, + 0x866c: 0xe00030af, 0x866d: 0xe00033d9, 0x866e: 0xe0001162, 0x866f: 0xe000115f, + 0x8670: 0xe000334b, 0x8671: 0xe0003266, 0x8672: 0xe0003263, 0x8673: 0xe0003260, + 0x8674: 0xe0002fba, 0x8675: 0xe00032ed, 0x8676: 0x002d7888, 0x8677: 0x00319488, + 0x8678: 0xe0003055, 0x8679: 0xe000337f, 0x867a: 0xe0002f04, 0x867b: 0xe000321f, + 0x867c: 0xe00009ea, 0x867d: 0xe00009e5, 0x867e: 0xe0000e19, 0x867f: 0xe0000e15, + // Block 0x21a, offset 0x8680 + 0x8680: 0xe0002f22, 0x8681: 0xe000323d, 0x8682: 0xe0002f25, 0x8683: 0xe0003240, + 0x8684: 0xe0002fa4, 0x8685: 0xe00032d7, 0x8686: 0xe0002fa7, 0x8687: 0xe00032da, + 0x8688: 0xe0003009, 0x8689: 0xe000333c, 0x868a: 0xe000300c, 0x868b: 0xe000333f, + 0x868c: 0xe00030c1, 0x868d: 0xe00033eb, 0x868e: 0xe00030c4, 0x868f: 0xe00033ee, + 0x8690: 0xe00030f7, 0x8691: 0xe0003421, 0x8692: 0xe00030fa, 0x8693: 0xe0003424, + 0x8694: 0xe0003179, 0x8695: 0xe00034a6, 0x8696: 0xe000317c, 0x8697: 0xe00034a9, + 0x8698: 0xe0003125, 0x8699: 0xe000344f, 0x869a: 0xe0003134, 0x869b: 0xe0003461, + 0x869c: 0x00312288, 0x869d: 0x40312220, 0x869e: 0xe0002fd2, 0x869f: 0xe0003305, + 0x86a0: 0x002ebc88, 0x86a1: 0x402c8c20, 0x86a2: 0x002f2288, 0x86a3: 0x402f2220, + 0x86a4: 0x00314088, 0x86a5: 0x40314020, 0x86a6: 0xe0002f12, 0x86a7: 0xe000322d, + 0x86a8: 0xe0002f8c, 0x86a9: 0xe00032bf, 0x86aa: 0xe000308f, 0x86ab: 0xe00033b9, + 0x86ac: 0xe00030a1, 0x86ad: 0xe00033cb, 0x86ae: 0xe00030a5, 0x86af: 0xe00033cf, + 0x86b0: 0xe00030a8, 0x86b1: 0xe00033d2, 0x86b2: 0xe00031d2, 0x86b3: 0xe0003505, + 0x86b4: 0x402e5e20, 0x86b5: 0x402ed020, 0x86b6: 0x40305a20, 0x86b7: 0x402dd420, + 0x86b8: 0xe0000abf, 0x86b9: 0xe0000ec4, 0x86ba: 0x002be888, 0x86bb: 0x002c4488, + 0x86bc: 0x402c4420, 0x86bd: 0x002e3888, 0x86be: 0x00303e88, 0x86bf: 0x402ffc20, + // Block 0x21b, offset 0x86c0 + 0x86c0: 0xae603502, 0x86c1: 0xae603202, 0x86c2: 0xae604502, 0x86c3: 0xae602202, + 0x86c4: 0xe0000000, 0x86c5: 0xaf007f02, 0x86c6: 0xae605f02, 0x86c7: 0xadc06002, + 0x86c8: 0xadc06002, 0x86c9: 0xadc06002, 0x86ca: 0xae605f02, 0x86cb: 0xae605f02, + 0x86cc: 0xae605f02, 0x86cd: 0xadc06002, 0x86ce: 0xadc06002, 0x86cf: 0xa0000000, + 0x86d0: 0xae605f02, 0x86d1: 0xae605f02, 0x86d2: 0xae605f02, 0x86d3: 0xadc06002, + 0x86d4: 0xadc06002, 0x86d5: 0xadc06002, 0x86d6: 0xadc06002, 0x86d7: 0xae605f02, + 0x86d8: 0xae808002, 0x86d9: 0xadc06002, 0x86da: 0xadc06002, 0x86db: 0xae605f02, + 0x86dc: 0xae906002, 0x86dd: 0xaea05f02, 0x86de: 0xaea05f02, 0x86df: 0xae906002, + 0x86e0: 0xaea08102, 0x86e1: 0xaea08202, 0x86e2: 0xae906002, 0x86e3: 0x84e615ef, + 0x86e4: 0x84e6164c, 0x86e5: 0x84e616cd, 0x86e6: 0x84e61771, 0x86e7: 0x84e61836, + 0x86e8: 0x84e6161d, 0x86e9: 0x84e61631, 0x86ea: 0x84e616b4, 0x86eb: 0x84e61741, + 0x86ec: 0x84e617bd, 0x86ed: 0x84e61816, 0x86ee: 0x84e6185f, 0x86ef: 0x84e6187b, + 0x86f0: 0x00326688, 0x86f1: 0x40326620, 0x86f2: 0x0032a688, 0x86f3: 0x4032a620, + 0x86f4: 0x40064020, 0x86f5: 0x40064220, 0x86f6: 0x00326088, 0x86f7: 0x40326020, + 0x86fa: 0x00326c84, 0x86fb: 0x40329220, + 0x86fc: 0x40329020, 0x86fd: 0x40329420, 0x86fe: 0x402c1620, + // Block 0x21c, offset 0x8700 + 0x8700: 0xe0002f33, 0x8701: 0xe000324e, 0x8702: 0xe0002f36, 0x8703: 0xe0003269, + 0x8704: 0xe0002f39, 0x8705: 0xe000326c, 0x8706: 0xe0002f3c, 0x8707: 0xe000326f, + 0x8708: 0xe0002f4e, 0x8709: 0xe0003281, 0x870a: 0xe0002f55, 0x870b: 0xe0003288, + 0x870c: 0xe0002f5b, 0x870d: 0xe000328e, 0x870e: 0xe0002f61, 0x870f: 0xe0003294, + 0x8710: 0xe0002f58, 0x8711: 0xe000328b, 0x8712: 0xe0002f5e, 0x8713: 0xe0003291, + 0x8714: 0xe0002f9d, 0x8715: 0xe00032d0, 0x8716: 0xe0002f99, 0x8717: 0xe00032cc, + 0x8718: 0xe0002fb1, 0x8719: 0xe00032e4, 0x871a: 0xe0002fb4, 0x871b: 0xe00032e7, + 0x871c: 0xe0002f8f, 0x871d: 0xe00032c2, 0x871e: 0xe0002fb7, 0x871f: 0xe00032ea, + 0x8720: 0xe0002fcc, 0x8721: 0xe00032ff, 0x8722: 0xe0002fd8, 0x8723: 0xe000330b, + 0x8724: 0xe0002fde, 0x8725: 0xe0003311, 0x8726: 0xe0002fd5, 0x8727: 0xe0003308, + 0x8728: 0xe0002fdb, 0x8729: 0xe000330e, 0x872a: 0xe0002fe1, 0x872b: 0xe0003314, + 0x872c: 0xe0003012, 0x872d: 0xe0003345, 0x872e: 0xe0002ff6, 0x872f: 0xe000332c, + 0x8730: 0xe0003018, 0x8731: 0xe000334e, 0x8732: 0xe0003021, 0x8733: 0xe0003357, + 0x8734: 0xe0003024, 0x8735: 0xe000335a, 0x8736: 0xe0003030, 0x8737: 0xe0003366, + 0x8738: 0xe0003033, 0x8739: 0xe0003369, 0x873a: 0xe000303a, 0x873b: 0xe0003370, + 0x873c: 0xe0003037, 0x873d: 0xe000336d, 0x873e: 0xe000303d, 0x873f: 0xe0003373, + // Block 0x21d, offset 0x8740 + 0x8740: 0xe0003040, 0x8741: 0xe0003376, 0x8742: 0xe0003043, 0x8743: 0xe0003379, + 0x8744: 0xe000305e, 0x8745: 0xe0003388, 0x8746: 0xe0003064, 0x8747: 0xe000338e, + 0x8748: 0xe000306a, 0x8749: 0xe0003394, 0x874a: 0xe0003067, 0x874b: 0xe0003391, + 0x874c: 0xe0003099, 0x874d: 0xe00033c3, 0x874e: 0xe000309d, 0x874f: 0xe00033c7, + 0x8750: 0xe00030ba, 0x8751: 0xe00033e4, 0x8752: 0xe00030b6, 0x8753: 0xe00033e0, + 0x8754: 0xe00030e5, 0x8755: 0xe000340f, 0x8756: 0xe00030e8, 0x8757: 0xe0003412, + 0x8758: 0xe00030f1, 0x8759: 0xe000341b, 0x875a: 0xe00030fd, 0x875b: 0xe0003427, + 0x875c: 0xe0003100, 0x875d: 0xe000342a, 0x875e: 0xe0003104, 0x875f: 0xe000342e, + 0x8760: 0xe0003118, 0x8761: 0xe0003442, 0x8762: 0xe000311e, 0x8763: 0xe0003448, + 0x8764: 0xe000310a, 0x8765: 0xe0003434, 0x8766: 0xe0003114, 0x8767: 0xe000343e, + 0x8768: 0xe0003121, 0x8769: 0xe000344b, 0x876a: 0xe000312b, 0x876b: 0xe0003458, + 0x876c: 0xe0003131, 0x876d: 0xe000345e, 0x876e: 0xe000313a, 0x876f: 0xe0003467, + 0x8770: 0xe0003137, 0x8771: 0xe0003464, 0x8772: 0xe0003199, 0x8773: 0xe00034c6, + 0x8774: 0xe000319f, 0x8775: 0xe00034cc, 0x8776: 0xe000319c, 0x8777: 0xe00034c9, + 0x8778: 0xe0003168, 0x8779: 0xe0003495, 0x877a: 0xe0003172, 0x877b: 0xe000349f, + 0x877c: 0xe00031a2, 0x877d: 0xe00034cf, 0x877e: 0xe00031a5, 0x877f: 0xe00034d2, + // Block 0x21e, offset 0x8780 + 0x8780: 0xe00031ab, 0x8781: 0xe00034d8, 0x8782: 0xe00031a8, 0x8783: 0xe00034d5, + 0x8784: 0xe00031b1, 0x8785: 0xe00034e1, 0x8786: 0xe00031b4, 0x8787: 0xe00034e4, + 0x8788: 0xe00031b7, 0x8789: 0xe00034e7, 0x878a: 0xe00031bd, 0x878b: 0xe00034ed, + 0x878c: 0xe00031ba, 0x878d: 0xe00034ea, 0x878e: 0xe00031cf, 0x878f: 0xe0003502, + 0x8790: 0xe00031de, 0x8791: 0xe0003511, 0x8792: 0xe00031e7, 0x8793: 0xe000351a, + 0x8794: 0xe00031ea, 0x8795: 0xe000351d, 0x8796: 0xe0003317, 0x8797: 0xe0003455, + 0x8798: 0xe00034de, 0x8799: 0xe00034f9, 0x879a: 0xe0002ec6, 0x879b: 0xe0000f70, + 0x879c: 0x40300420, 0x879d: 0x40300620, 0x879e: 0xe0000f7f, 0x879f: 0x402c9620, + 0x87a0: 0xe0002f28, 0x87a1: 0xe0003243, 0x87a2: 0xe0002f1f, 0x87a3: 0xe000323a, + 0x87a4: 0xe0002eee, 0x87a5: 0xe0003209, 0x87a6: 0xe0002ef2, 0x87a7: 0xe000320d, + 0x87a8: 0xe0002efa, 0x87a9: 0xe0003215, 0x87aa: 0xe0002ef6, 0x87ab: 0xe0003211, + 0x87ac: 0xe0002f2f, 0x87ad: 0xe000324a, 0x87ae: 0xe0002edb, 0x87af: 0xe00031f6, + 0x87b0: 0xe0002edf, 0x87b1: 0xe00031fa, 0x87b2: 0xe0002ee7, 0x87b3: 0xe0003202, + 0x87b4: 0xe0002ee3, 0x87b5: 0xe00031fe, 0x87b6: 0xe0002f2b, 0x87b7: 0xe0003246, + 0x87b8: 0xe0002faa, 0x87b9: 0xe00032dd, 0x87ba: 0xe0002fa1, 0x87bb: 0xe00032d4, + 0x87bc: 0xe0002f86, 0x87bd: 0xe00032b9, 0x87be: 0xe0002f70, 0x87bf: 0xe00032a3, + // Block 0x21f, offset 0x87c0 + 0x87c0: 0xe0002f74, 0x87c1: 0xe00032a7, 0x87c2: 0xe0002f7c, 0x87c3: 0xe00032af, + 0x87c4: 0xe0002f78, 0x87c5: 0xe00032ab, 0x87c6: 0xe0002fad, 0x87c7: 0xe00032e0, + 0x87c8: 0xe0003006, 0x87c9: 0xe0003339, 0x87ca: 0xe000300f, 0x87cb: 0xe0003342, + 0x87cc: 0xe00030de, 0x87cd: 0xe0003408, 0x87ce: 0xe00030be, 0x87cf: 0xe00033e8, + 0x87d0: 0xe0003079, 0x87d1: 0xe00033a3, 0x87d2: 0xe000307d, 0x87d3: 0xe00033a7, + 0x87d4: 0xe0003085, 0x87d5: 0xe00033af, 0x87d6: 0xe0003081, 0x87d7: 0xe00033ab, + 0x87d8: 0xe00030e1, 0x87d9: 0xe000340b, 0x87da: 0xe00030ca, 0x87db: 0xe00033f4, + 0x87dc: 0xe00030ce, 0x87dd: 0xe00033f8, 0x87de: 0xe00030d6, 0x87df: 0xe0003400, + 0x87e0: 0xe00030d2, 0x87e1: 0xe00033fc, 0x87e2: 0xe00030da, 0x87e3: 0xe0003404, + 0x87e4: 0xe0003196, 0x87e5: 0xe00034c3, 0x87e6: 0xe0003176, 0x87e7: 0xe00034a3, + 0x87e8: 0xe0003182, 0x87e9: 0xe00034af, 0x87ea: 0xe0003186, 0x87eb: 0xe00034b3, + 0x87ec: 0xe000318e, 0x87ed: 0xe00034bb, 0x87ee: 0xe000318a, 0x87ef: 0xe00034b7, + 0x87f0: 0xe0003192, 0x87f1: 0xe00034bf, 0x87f2: 0xe00031c3, 0x87f3: 0xe00034f3, + 0x87f4: 0xe00031d8, 0x87f5: 0xe000350b, 0x87f6: 0xe00031d5, 0x87f7: 0xe0003508, + 0x87f8: 0xe00031cc, 0x87f9: 0xe00034ff, 0x87fa: 0xe0000d0a, 0x87fb: 0xe0000d07, + 0x87fc: 0x0030d888, 0x87fd: 0x4030d820, 0x87fe: 0x00312088, 0x87ff: 0x40312020, + // Block 0x220, offset 0x8800 + 0x8800: 0x40063a20, 0x8801: 0xe00000b1, 0x8802: 0xe00012ea, 0x8803: 0xe00012f5, + 0x8804: 0xe00012e0, 0x8806: 0xe00012ee, 0x8807: 0xe00012f1, + 0x8808: 0xe000124f, 0x8809: 0xe0001249, 0x880a: 0xe00012e7, 0x880b: 0xe00012dd, + 0x880c: 0xe00012f8, 0x880d: 0xe00000b7, 0x880e: 0xe00000b4, 0x880f: 0xe00000ba, + 0x8810: 0xe0001343, 0x8811: 0xe000135e, 0x8812: 0xe0001356, 0x8813: 0xe0001352, + 0x8816: 0xe0001349, 0x8817: 0xe000135a, + 0x8818: 0xe0001346, 0x8819: 0xe0001361, 0x881a: 0xe0001340, 0x881b: 0xe000133a, + 0x881d: 0xe00000c0, 0x881e: 0xe00000bd, 0x881f: 0xe00000c3, + 0x8820: 0xe00013e6, 0x8821: 0xe0001401, 0x8822: 0xe00013f9, 0x8823: 0xe00013f5, + 0x8824: 0xe00013a4, 0x8825: 0xe00013a7, 0x8826: 0xe00013ec, 0x8827: 0xe00013fd, + 0x8828: 0xe00013e9, 0x8829: 0xe0001404, 0x882a: 0xe00013e3, 0x882b: 0xe00013dd, + 0x882c: 0xe00013aa, 0x882d: 0xe00000ae, 0x882e: 0xe00000ab, 0x882f: 0x402c6020, + 0x8832: 0xe000149f, 0x8833: 0xe00014aa, + 0x8834: 0xe0001495, 0x8836: 0xe00014a3, 0x8837: 0xe00014a6, + 0x8838: 0xe00013a1, 0x8839: 0xe000139b, 0x883a: 0xe000149c, 0x883b: 0xe0001492, + 0x883c: 0xe00014ad, 0x883d: 0x40062020, 0x883e: 0x40063820, + // Block 0x221, offset 0x8840 + 0x8840: 0x00021284, 0x8841: 0x00021284, 0x8842: 0x00021284, 0x8843: 0x00021284, + 0x8844: 0x00021284, 0x8845: 0x00021284, 0x8846: 0x00021284, 0x8847: 0x0002129b, + 0x8848: 0x00021284, 0x8849: 0x00021284, 0x884a: 0x00021284, 0x884b: 0xa0000000, + 0x884c: 0xa0000000, 0x884d: 0xa0000000, 0x884e: 0xa0000000, 0x884f: 0xa0000000, + 0x8850: 0x40022620, 0x8851: 0x0002269b, 0x8852: 0x40022820, 0x8853: 0x40022a20, + 0x8854: 0x40022c20, 0x8855: 0x40022e20, 0x8856: 0x4004c420, 0x8857: 0x40021820, + 0x8858: 0x4003d420, 0x8859: 0x4003d620, 0x885a: 0x4003d820, 0x885b: 0x4003da20, + 0x885c: 0x4003e220, 0x885d: 0x4003e420, 0x885e: 0x4003e620, 0x885f: 0x4003e820, + 0x8860: 0x4004f820, 0x8861: 0x4004fa20, 0x8862: 0x40050220, 0x8863: 0x40050420, + 0x8864: 0x0002e484, 0x8865: 0xe0002b62, 0x8866: 0xe0002b68, 0x8867: 0x40050620, + 0x8868: 0x40020e20, 0x8869: 0x40021020, 0x886a: 0xa0000000, 0x886b: 0xa0000000, + 0x886c: 0xa0000000, 0x886d: 0xa0000000, 0x886e: 0xa0000000, 0x886f: 0x0002129b, + 0x8870: 0x4004f020, 0x8871: 0x4004f420, 0x8872: 0x40050e20, 0x8873: 0xf0001f04, + 0x8874: 0xf0000404, 0x8875: 0x40051020, 0x8876: 0xf0001f04, 0x8877: 0xf0000404, + 0x8878: 0x40051620, 0x8879: 0x4003dc20, 0x887a: 0x4003de20, 0x887b: 0x40051820, + 0x887c: 0xe0002b56, 0x887d: 0x4002e020, 0x887e: 0x40021420, 0x887f: 0x40051a20, + // Block 0x222, offset 0x8880 + 0x8880: 0x40051e20, 0x8881: 0x40052220, 0x8882: 0x40052420, 0x8883: 0x40050820, + 0x8884: 0x40095820, 0x8885: 0x40040c20, 0x8886: 0x40040e20, 0x8887: 0xe0002b5f, + 0x8888: 0xe0002b5c, 0x8889: 0xe0002b59, 0x888a: 0x4004e820, 0x888b: 0x4004d420, + 0x888c: 0x40050a20, 0x888d: 0x40050c20, 0x888e: 0x4004da20, 0x888f: 0x40026620, + 0x8890: 0x40052020, 0x8891: 0x4004dc20, 0x8892: 0x40095020, 0x8893: 0x40023420, + 0x8894: 0x40051c20, 0x8895: 0x40039c20, 0x8896: 0x40039e20, 0x8897: 0xe00000a6, + 0x8898: 0x4003a020, 0x8899: 0x4003a220, 0x889a: 0x4003a420, 0x889b: 0x4003a620, + 0x889c: 0x4003a820, 0x889d: 0x4003aa20, 0x889e: 0x4003ac20, 0x889f: 0x00021284, + 0x88a0: 0xa0000000, 0x88a1: 0xa0000000, 0x88a2: 0xa0000000, 0x88a3: 0xa0000000, + 0x88a4: 0xa0000000, + 0x88aa: 0xa0000000, 0x88ab: 0xa0000000, + 0x88ac: 0xa0000000, 0x88ad: 0xa0000000, 0x88ae: 0xa0000000, 0x88af: 0xa0000000, + 0x88b0: 0x0029cc94, 0x88b1: 0x002d9a94, + 0x88b4: 0x0029d494, 0x88b5: 0x0029d694, 0x88b6: 0x0029d894, 0x88b7: 0x0029da94, + 0x88b8: 0x0029dc94, 0x88b9: 0x0029de94, 0x88ba: 0x00093894, 0x88bb: 0x00094e94, + 0x88bc: 0x00094294, 0x88bd: 0x0003f494, 0x88be: 0x0003f694, 0x88bf: 0x002e9e94, + // Block 0x223, offset 0x88c0 + 0x88c0: 0xe00009bc, 0x88c1: 0xe00009c0, 0x88c2: 0x002c3a8b, 0x88c3: 0xe0002cdc, + 0x88c4: 0x40081c20, 0x88c5: 0xe0000a5e, 0x88c6: 0xe0000a62, 0x88c7: 0x002cc28a, + 0x88c8: 0x40081e20, 0x88c9: 0xe0002cdf, 0x88ca: 0x002d2285, 0x88cb: 0x002d688b, + 0x88cc: 0x002d688b, 0x88cd: 0x002d688b, 0x88ce: 0x002d6885, 0x88cf: 0xf0000202, + 0x88d0: 0x002d9a8b, 0x88d1: 0x002d9a8b, 0x88d2: 0x002e228b, 0x88d3: 0x002e2285, + 0x88d4: 0x40082020, 0x88d5: 0x002e9e8b, 0x88d6: 0xe000281e, 0x88d7: 0x40082220, + 0x88d8: 0x40082420, 0x88d9: 0x002f2c8b, 0x88da: 0x002f568b, 0x88db: 0x002f7a8b, + 0x88dc: 0x002f7a8b, 0x88dd: 0x002f7a8b, 0x88de: 0x40082620, 0x88df: 0x40082820, + 0x88e0: 0xe0002833, 0x88e1: 0xe0000fbd, 0x88e2: 0xe0002842, 0x88e3: 0x40082a20, + 0x88e4: 0x00312a8b, 0x88e5: 0x40082c20, 0x88e6: 0x0032a288, 0x88e7: 0x40082e20, + 0x88e8: 0x00312a8b, 0x88e9: 0x40083020, 0x88ea: 0x402c3620, 0x88eb: 0xe0002f01, + 0x88ec: 0x002c0a8b, 0x88ed: 0x002c3a8b, 0x88ee: 0x40083220, 0x88ef: 0x002c9885, + 0x88f0: 0x002c988b, 0x88f1: 0x002d088b, 0x88f2: 0x002d1e88, 0x88f3: 0x002e828b, + 0x88f4: 0x002ee285, 0x88f5: 0x00389084, 0x88f6: 0x00389284, 0x88f7: 0x00389484, + 0x88f8: 0x00389684, 0x88f9: 0x002d9a85, 0x88fa: 0x40083420, 0x88fb: 0xe0000b95, + 0x88fc: 0x00327e85, 0x88fd: 0x00325685, 0x88fe: 0x0032568b, 0x88ff: 0x00327e8b, + // Block 0x224, offset 0x8900 + 0x8900: 0x00093685, 0x8901: 0x40083620, 0x8902: 0x40083820, 0x8903: 0x40083a20, + 0x8904: 0x40083c20, 0x8905: 0x002c628b, 0x8906: 0x002c6285, 0x8907: 0x002c9885, + 0x8908: 0x002d9a85, 0x8909: 0x002dcc85, 0x890a: 0x40083e20, 0x890b: 0x400a6e20, + 0x890c: 0x40084020, 0x890d: 0xe00009c4, 0x890e: 0x402d1e20, 0x890f: 0x40084220, + 0x8910: 0xe00002cb, 0x8911: 0xe00002d3, 0x8912: 0xe00002b2, 0x8913: 0xe00002bb, + 0x8914: 0xe00003cd, 0x8915: 0xe00002c3, 0x8916: 0xe00003d1, 0x8917: 0xe00004ab, + 0x8918: 0xe0000579, 0x8919: 0xe00002c7, 0x891a: 0xe0000640, 0x891b: 0xe00002cf, + 0x891c: 0xe00004af, 0x891d: 0xe0000644, 0x891e: 0xe0000798, 0x891f: 0xe0002cf8, + 0x8920: 0x002d9a8a, 0x8921: 0xe00027d4, 0x8922: 0xe00027db, 0x8923: 0xe00027ee, + 0x8924: 0x0030be8a, 0x8925: 0xe0002848, 0x8926: 0xe000284f, 0x8927: 0xe00010bb, + 0x8928: 0xe00027f4, 0x8929: 0x0030f68a, 0x892a: 0xe0002883, 0x892b: 0xe000288a, + 0x892c: 0x002e228a, 0x892d: 0x002c3a8a, 0x892e: 0x002c628a, 0x892f: 0x002e828a, + 0x8930: 0x002d9a84, 0x8931: 0xe00027d1, 0x8932: 0xe00027d7, 0x8933: 0xe00027eb, + 0x8934: 0x0030be84, 0x8935: 0xe0002845, 0x8936: 0xe000284b, 0x8937: 0xe00010b6, + 0x8938: 0xe00027f1, 0x8939: 0x0030f684, 0x893a: 0xe0002880, 0x893b: 0xe0002886, + 0x893c: 0x002e2284, 0x893d: 0x002c3a84, 0x893e: 0x002c6284, 0x893f: 0x002e8284, + // Block 0x225, offset 0x8940 + 0x8940: 0x4009a620, 0x8941: 0xe00000f5, 0x8942: 0x4009a820, 0x8943: 0x4009aa20, + 0x8944: 0xe00000f8, 0x8945: 0x4009ac20, 0x8946: 0x4009ae20, 0x8947: 0xe00000fb, + 0x8948: 0x4009b020, 0x8949: 0xe00000fe, 0x894a: 0x4009b220, 0x894b: 0x4009b420, + 0x894c: 0x4009b620, 0x894d: 0x4009b820, 0x894e: 0x4009ba20, 0x894f: 0x4009bc20, + 0x8950: 0x4009be20, 0x8951: 0x4009c020, 0x8952: 0x4009c220, 0x8953: 0x4009c420, + 0x8954: 0x4009c620, 0x8955: 0x4009c820, 0x8956: 0x4009ca20, 0x8957: 0x4009cc20, + 0x8958: 0x4009ce20, 0x8959: 0x4009d020, 0x895a: 0x4009d220, 0x895b: 0x4009d420, + 0x895c: 0x4009d620, 0x895d: 0x4009d820, 0x895e: 0x4009da20, 0x895f: 0x4009dc20, + 0x8960: 0xe0002ecc, 0x8961: 0x4009de20, 0x8962: 0xe0000104, 0x8963: 0x4009e020, + 0x8964: 0x4009e220, 0x8965: 0x4009e420, 0x8966: 0x4009e620, 0x8967: 0x4009e820, + 0x8968: 0x4009ea20, 0x8969: 0x4009ec20, 0x896a: 0x4009ee20, 0x896b: 0x4009f020, + 0x896c: 0x4009f220, 0x896d: 0xe0000101, 0x896e: 0xe0002ec9, 0x896f: 0xe0002ecf, + 0x8970: 0xe0000107, 0x8971: 0xe000010a, 0x8972: 0x4009f420, 0x8973: 0x4009f620, + 0x8974: 0xe000010d, 0x8975: 0xe0000110, 0x8976: 0x4009f820, 0x8977: 0x4009fa20, + 0x8978: 0xe0000113, 0x8979: 0xe0000116, 0x897a: 0x4009fc20, 0x897b: 0x4009fe20, + 0x897c: 0x400a0020, 0x897d: 0x400a0220, 0x897e: 0x400a0420, 0x897f: 0x400a0620, + // Block 0x226, offset 0x8980 + 0x8980: 0x400d1820, 0x8981: 0x400d1a20, 0x8982: 0x400d1c20, 0x8983: 0x400d1e20, + 0x8984: 0x400d2020, 0x8985: 0x400d2220, 0x8986: 0x400d2420, 0x8987: 0x400d2620, + 0x8988: 0x400d2820, 0x8989: 0x400d2a20, 0x898a: 0x400d2c20, + 0x89a0: 0x0029ce86, 0x89a1: 0x0029d086, 0x89a2: 0x0029d286, 0x89a3: 0x0029d486, + 0x89a4: 0x0029d686, 0x89a5: 0x0029d886, 0x89a6: 0x0029da86, 0x89a7: 0x0029dc86, + 0x89a8: 0x0029de86, 0x89a9: 0xe0002cfb, 0x89aa: 0xe0002d0e, 0x89ab: 0xe0002d21, + 0x89ac: 0xe0002d34, 0x89ad: 0xe0002d43, 0x89ae: 0xe0002d52, 0x89af: 0xe0002d61, + 0x89b0: 0xe0002d70, 0x89b1: 0xe0002d7f, 0x89b2: 0xe0002d8e, 0x89b3: 0xe0002dac, + 0x89b4: 0xe0002b70, 0x89b5: 0xe0002b74, 0x89b6: 0xe0002b78, 0x89b7: 0xe0002b7c, + 0x89b8: 0xe0002b80, 0x89b9: 0xe0002b84, 0x89ba: 0xe0002b88, 0x89bb: 0xe0002b8c, + 0x89bc: 0xe0002b90, 0x89bd: 0xe0000015, 0x89be: 0xe000001a, 0x89bf: 0xe000001f, + // Block 0x227, offset 0x89c0 + 0x89c0: 0xe0000024, 0x89c1: 0xe0000029, 0x89c2: 0xe000002e, 0x89c3: 0xe0000033, + 0x89c4: 0xe0000038, 0x89c5: 0xe000003d, 0x89c6: 0xe0000042, 0x89c7: 0xe0000047, + 0x89c8: 0xe0002cf5, 0x89c9: 0xe0002da9, 0x89ca: 0xe0002e16, 0x89cb: 0xe0002e4b, + 0x89cc: 0xe0002e78, 0x89cd: 0xe0002e8a, 0x89ce: 0xe0002e99, 0x89cf: 0xe0002ea8, + 0x89d0: 0xe0002eb7, 0x89d1: 0xe0002cfe, 0x89d2: 0xe0002d11, 0x89d3: 0xe0002d24, + 0x89d4: 0xe0002d37, 0x89d5: 0xe0002d46, 0x89d6: 0xe0002d55, 0x89d7: 0xe0002d64, + 0x89d8: 0xe0002d73, 0x89d9: 0xe0002d82, 0x89da: 0xe0002d91, 0x89db: 0xe0002daf, + 0x89dc: 0xe0002b94, 0x89dd: 0xe0002b9c, 0x89de: 0xe0002ba4, 0x89df: 0xe0002bac, + 0x89e0: 0xe000249f, 0x89e1: 0xe0002bb4, 0x89e2: 0xe0002bbc, 0x89e3: 0xe00024a7, + 0x89e4: 0xe00024af, 0x89e5: 0xe0002bc4, 0x89e6: 0xe00024b7, 0x89e7: 0xe0002bcc, + 0x89e8: 0xe0002bd4, 0x89e9: 0xe0002bdc, 0x89ea: 0xe00024bf, 0x89eb: 0xe0002be4, + 0x89ec: 0xe00024c7, 0x89ed: 0xe00024cf, 0x89ee: 0xe00024d7, 0x89ef: 0xe00024df, + 0x89f0: 0xe0002bec, 0x89f1: 0xe0002bf4, 0x89f2: 0xe0002bfc, 0x89f3: 0xe00024e7, + 0x89f4: 0xe0002c04, 0x89f5: 0xe0002c0c, 0x89f6: 0x002bde8c, 0x89f7: 0x002c0a8c, + 0x89f8: 0x002c3a8c, 0x89f9: 0x002c628c, 0x89fa: 0x002c988c, 0x89fb: 0x002d088c, + 0x89fc: 0x002d228c, 0x89fd: 0x002d688c, 0x89fe: 0x002d9a8c, 0x89ff: 0x002dcc8c, + // Block 0x228, offset 0x8a00 + 0x8a00: 0x40151420, 0x8a01: 0x40151620, 0x8a02: 0x40151820, 0x8a03: 0x40151a20, + 0x8a04: 0x40151c20, 0x8a05: 0x40151e20, 0x8a06: 0x40152020, 0x8a07: 0x40152220, + 0x8a08: 0x40152420, 0x8a09: 0x40152620, 0x8a0a: 0x40152820, 0x8a0b: 0x40152a20, + 0x8a0c: 0x40152c20, 0x8a0d: 0x40152e20, 0x8a0e: 0x40153020, 0x8a0f: 0x40153220, + 0x8a10: 0x40153420, 0x8a11: 0x40153620, 0x8a12: 0x40153820, 0x8a13: 0x40153a20, + 0x8a14: 0x40153c20, 0x8a15: 0x40153e20, 0x8a16: 0x40154020, 0x8a17: 0x40154220, + 0x8a18: 0x40154420, 0x8a19: 0x40154620, 0x8a1a: 0x40154820, 0x8a1b: 0x40154a20, + 0x8a1c: 0x40154c20, 0x8a1d: 0x40154e20, 0x8a1e: 0x40155020, 0x8a1f: 0x40155220, + 0x8a20: 0x40155420, 0x8a21: 0x40155620, 0x8a22: 0x40155820, 0x8a23: 0x40155a20, + 0x8a24: 0x40155c20, 0x8a25: 0x40155e20, 0x8a26: 0x40156020, 0x8a27: 0x40156220, + 0x8a28: 0x40156420, 0x8a29: 0x40156620, 0x8a2a: 0x40156820, 0x8a2b: 0x40156a20, + 0x8a2c: 0x40156c20, 0x8a2d: 0x40156e20, 0x8a2e: 0x40157020, 0x8a2f: 0x40157220, + 0x8a30: 0x40157420, 0x8a31: 0x40157620, 0x8a32: 0x40157820, 0x8a33: 0x40157a20, + 0x8a34: 0xe0002b52, 0x8a35: 0xe0002ce2, 0x8a36: 0xe0002ce5, 0x8a37: 0x40157c20, + 0x8a38: 0x40157e20, 0x8a39: 0x40158020, 0x8a3a: 0x40158220, 0x8a3b: 0x40158420, + 0x8a3c: 0x40158620, 0x8a3d: 0x40158820, 0x8a3e: 0x40158a20, 0x8a3f: 0x40158c20, + // Block 0x229, offset 0x8a40 + 0x8a40: 0xe0002c14, 0x8a41: 0xe0002c18, 0x8a42: 0xe0002c1c, 0x8a43: 0xe0002c20, + 0x8a44: 0xe0002c24, 0x8a45: 0xe0002c28, 0x8a46: 0xe0002c2c, 0x8a47: 0xe0002c30, + 0x8a48: 0xe0002c34, 0x8a49: 0xe0002c38, 0x8a4a: 0xe0002c3c, 0x8a4b: 0xe0002c40, + 0x8a4c: 0xe0002c44, 0x8a4d: 0xe0002c48, 0x8a4e: 0xe000004c, 0x8a4f: 0xe0000051, + 0x8a50: 0xe0000056, 0x8a51: 0xe000005b, 0x8a52: 0xe0000060, 0x8a53: 0xe0000065, + 0x8a54: 0xe000006a, 0x8a55: 0xe000006f, 0x8a56: 0xe0000083, 0x8a57: 0xe000008d, + 0x8a58: 0xe0000092, 0x8a59: 0xe0000097, 0x8a5a: 0xe000009c, 0x8a5b: 0xe00000a1, + 0x8a5c: 0xe0000088, 0x8a5d: 0xe0000074, 0x8a5e: 0xe000007c, + 0x8a60: 0xe0002c4c, 0x8a61: 0xe0002c5c, 0x8a62: 0xe0002c54, 0x8a63: 0xe0002c8c, + 0x8a64: 0xe0002c60, 0x8a65: 0xe0002c74, 0x8a66: 0xe0002c50, 0x8a67: 0xe0002c70, + 0x8a68: 0xe0002c58, 0x8a69: 0xe0002c7c, 0x8a6a: 0xe0002c9c, 0x8a6b: 0xe0002cb0, + 0x8a6c: 0xe0002cac, 0x8a6d: 0xe0002ca4, 0x8a6e: 0xe0002cd8, 0x8a6f: 0xe0002c90, + 0x8a70: 0xe0002c98, 0x8a71: 0xe0002ca8, 0x8a72: 0xe0002ca0, 0x8a73: 0xe0002cbc, + 0x8a74: 0xe0002c84, 0x8a75: 0xe0002cb4, 0x8a76: 0xe0002cd0, 0x8a77: 0xe0002cc0, + 0x8a78: 0xe0002c78, 0x8a79: 0xe0002c64, 0x8a7a: 0xe0002c88, 0x8a7b: 0xe0002c94, + 0x8a7c: 0xe0002cb8, 0x8a7d: 0xe0002c68, 0x8a7e: 0xe0002cd4, 0x8a7f: 0xe0002c80, + // Block 0x22a, offset 0x8a80 + 0x8a80: 0xe0002cc4, 0x8a81: 0xe0002c6c, 0x8a82: 0xe0002cc8, 0x8a83: 0xe0002ccc, + 0x8a84: 0x02aa9e86, 0x8a85: 0x02bcf886, 0x8a86: 0x02cb0e86, 0x8a87: 0x02f71e86, + 0x8a88: 0xe00002e3, 0x8a89: 0xe00003d8, 0x8a8a: 0xe00004b3, 0x8a8b: 0xe000057d, + 0x8a8c: 0xe0000648, 0x8a8d: 0xe00006f0, 0x8a8e: 0xe000079c, 0x8a8f: 0xe0000841, + 0x8a90: 0xe0000ec0, 0x8a91: 0xe0002dbb, 0x8a92: 0xe0002dc6, 0x8a93: 0xe0002dd1, + 0x8a94: 0xe0002ddc, 0x8a95: 0xe0002de7, 0x8a96: 0xe0002dee, 0x8a97: 0xe0002df5, + 0x8a98: 0xe0002dfc, 0x8a99: 0xe0002e03, 0x8a9a: 0xe0002e19, 0x8a9b: 0xe0002e20, + 0x8a9c: 0xe0002e27, 0x8a9d: 0xe0002e2a, 0x8a9e: 0xe0002e2d, 0x8a9f: 0xe0002e30, + 0x8aa0: 0x0062ac86, 0x8aa1: 0x0062b086, 0x8aa2: 0x0062b286, 0x8aa3: 0x0062b686, + 0x8aa4: 0x0062b886, 0x8aa5: 0x0062ba86, 0x8aa6: 0x0062be86, 0x8aa7: 0x0062c286, + 0x8aa8: 0x0062c486, 0x8aa9: 0x0062c886, 0x8aaa: 0x0062ca86, 0x8aab: 0x0062cc86, + 0x8aac: 0x0062ce86, 0x8aad: 0x0062d086, 0x8aae: 0xf0000606, 0x8aaf: 0xf0000606, + 0x8ab0: 0xf0000606, 0x8ab1: 0xf0000606, 0x8ab2: 0xf0000606, 0x8ab3: 0xf0000606, + 0x8ab4: 0xf0000606, 0x8ab5: 0xf0000606, 0x8ab6: 0xf0000606, 0x8ab7: 0xf0000606, + 0x8ab8: 0xf0000606, 0x8ab9: 0xf0000606, 0x8aba: 0xf0000606, 0x8abb: 0xf0000606, + 0x8abc: 0xe0002127, 0x8abd: 0xe0002122, 0x8abe: 0xf0000606, 0x8abf: 0x4027ac20, + // Block 0x22b, offset 0x8ac0 + 0x8ac0: 0x029c0086, 0x8ac1: 0x029d1886, 0x8ac2: 0x029c1286, 0x8ac3: 0x02adb686, + 0x8ac4: 0x029d2886, 0x8ac5: 0x02a2da86, 0x8ac6: 0x029c0686, 0x8ac7: 0x02a2d686, + 0x8ac8: 0x029cba86, 0x8ac9: 0x02a68286, 0x8aca: 0x02ce1086, 0x8acb: 0x02e0d686, + 0x8acc: 0x02d86886, 0x8acd: 0x02ce5086, 0x8ace: 0x0323a286, 0x8acf: 0x02ae3e86, + 0x8ad0: 0x02cbca86, 0x8ad1: 0x02d05486, 0x8ad2: 0x02ce1286, 0x8ad3: 0x02f27c86, + 0x8ad4: 0x02a81a86, 0x8ad5: 0x02e4f286, 0x8ad6: 0x03194286, 0x8ad7: 0x02f2ba86, + 0x8ad8: 0x02a56886, 0x8ad9: 0x02f3b086, 0x8ada: 0x02ea6e86, 0x8adb: 0x02b2e686, + 0x8adc: 0x0320d286, 0x8add: 0x02a25486, 0x8ade: 0x02a6e086, 0x8adf: 0x02d9d086, + 0x8ae0: 0x03300a86, 0x8ae1: 0x029e2286, 0x8ae2: 0x02a33286, 0x8ae3: 0x02d6c686, + 0x8ae4: 0x029c1486, 0x8ae5: 0x029c5a86, 0x8ae6: 0x029c1686, 0x8ae7: 0x02bbcc86, + 0x8ae8: 0x02a7e686, 0x8ae9: 0x02a67686, 0x8aea: 0x02b72e86, 0x8aeb: 0x02b6cc86, + 0x8aec: 0x02edc686, 0x8aed: 0x029e0286, 0x8aee: 0x03198e86, 0x8aef: 0x02a6a886, + 0x8af0: 0x02b23886, 0x8af1: 0xe0002e33, 0x8af2: 0xe0002e36, 0x8af3: 0xe0002e39, + 0x8af4: 0xe0002e3c, 0x8af5: 0xe0002e4e, 0x8af6: 0xe0002e51, 0x8af7: 0xe0002e54, + 0x8af8: 0xe0002e57, 0x8af9: 0xe0002e5a, 0x8afa: 0xe0002e5d, 0x8afb: 0xe0002e60, + 0x8afc: 0xe0002e63, 0x8afd: 0xe0002e66, 0x8afe: 0xe0002e69, 0x8aff: 0xe0002e7b, + // Block 0x22c, offset 0x8b00 + 0x8b00: 0xe0002da0, 0x8b01: 0xe0002e0d, 0x8b02: 0xe0002e42, 0x8b03: 0xe0002e6f, + 0x8b04: 0xe0002e81, 0x8b05: 0xe0002e90, 0x8b06: 0xe0002e9f, 0x8b07: 0xe0002eae, + 0x8b08: 0xe0002ebd, 0x8b09: 0xe0002d06, 0x8b0a: 0xe0002d19, 0x8b0b: 0xe0002d2c, + 0x8b0c: 0xe00027c5, 0x8b0d: 0xe0000b85, 0x8b0e: 0xe00026cc, 0x8b0f: 0xe0000d14, + 0x8b10: 0x00657693, 0x8b11: 0x00657893, 0x8b12: 0x00657a93, 0x8b13: 0x00657e93, + 0x8b14: 0x00658093, 0x8b15: 0x00658293, 0x8b16: 0x00658493, 0x8b17: 0x00658693, + 0x8b18: 0x00658893, 0x8b19: 0x00658a93, 0x8b1a: 0x00658c93, 0x8b1b: 0x00658e93, + 0x8b1c: 0x00659093, 0x8b1d: 0x00659293, 0x8b1e: 0x00659493, 0x8b1f: 0x00659693, + 0x8b20: 0x00659893, 0x8b21: 0x00659a93, 0x8b22: 0x00659c93, 0x8b23: 0x00659e93, + 0x8b24: 0x0065a093, 0x8b25: 0x0065a293, 0x8b26: 0x0065a493, 0x8b27: 0x0065a693, + 0x8b28: 0x0065a893, 0x8b29: 0x0065aa93, 0x8b2a: 0x0065ac93, 0x8b2b: 0x0065ae93, + 0x8b2c: 0x0065b093, 0x8b2d: 0x0065b293, 0x8b2e: 0x0065b493, 0x8b2f: 0x0065b693, + 0x8b30: 0x0065b893, 0x8b31: 0x0065ba93, 0x8b32: 0x0065bc93, 0x8b33: 0x0065be93, + 0x8b34: 0x0065c093, 0x8b35: 0x0065c493, 0x8b36: 0x0065c693, 0x8b37: 0x0065c893, + 0x8b38: 0x0065ca93, 0x8b39: 0x0065cc93, 0x8b3a: 0x0065ce93, 0x8b3b: 0x0065d093, + 0x8b3c: 0x0065d293, 0x8b3d: 0x0065d493, 0x8b3e: 0x0065d693, + // Block 0x22d, offset 0x8b40 + 0x8b40: 0xe000230b, 0x8b41: 0xe00022f8, 0x8b42: 0xe00022fc, 0x8b43: 0xe0002311, + 0x8b44: 0xe0002316, 0x8b45: 0xe000231d, 0x8b46: 0xe0002321, 0x8b47: 0xe0002325, + 0x8b48: 0xe000232b, 0x8b49: 0xf0001c1c, 0x8b4a: 0xe0002330, 0x8b4b: 0xe000233c, + 0x8b4c: 0xe0002340, 0x8b4d: 0xe0002337, 0x8b4e: 0xe0002346, 0x8b4f: 0xe000234b, + 0x8b50: 0xe000234f, 0x8b51: 0xe0002353, 0x8b52: 0xf0001c1c, 0x8b53: 0xe000235e, + 0x8b54: 0xe0002358, 0x8b55: 0xf0001c1c, 0x8b56: 0xe0002363, 0x8b57: 0xe000236d, + 0x8b58: 0xe0002cef, 0x8b59: 0xe0002da3, 0x8b5a: 0xe0002e10, 0x8b5b: 0xe0002e45, + 0x8b5c: 0xe0002e72, 0x8b5d: 0xe0002e84, 0x8b5e: 0xe0002e93, 0x8b5f: 0xe0002ea2, + 0x8b60: 0xe0002eb1, 0x8b61: 0xe0002ec0, 0x8b62: 0xe0002d0a, 0x8b63: 0xe0002d1d, + 0x8b64: 0xe0002d30, 0x8b65: 0xe0002d3f, 0x8b66: 0xe0002d4e, 0x8b67: 0xe0002d5d, + 0x8b68: 0xe0002d6c, 0x8b69: 0xe0002d7b, 0x8b6a: 0xe0002d8a, 0x8b6b: 0xe0002d99, + 0x8b6c: 0xe0002db7, 0x8b6d: 0xe0002dc2, 0x8b6e: 0xe0002dcd, 0x8b6f: 0xe0002dd8, + 0x8b70: 0xe0002de3, 0x8b71: 0xe0000c1e, 0x8b72: 0xe0003251, 0x8b73: 0xe0002ec3, + 0x8b74: 0xe0000a31, 0x8b75: 0xe0002824, 0x8b76: 0xe000358c, 0x8b77: 0xe000325d, + 0x8b78: 0xe0000ac2, 0x8b79: 0xe0000ac6, 0x8b7a: 0xe00027e8, 0x8b7b: 0xf0001c1c, + 0x8b7c: 0xf0001c1c, 0x8b7d: 0xf0001c1c, 0x8b7e: 0xf0001c1c, 0x8b7f: 0xe0002431, + // Block 0x22e, offset 0x8b80 + 0x8b80: 0xe0003586, 0x8b81: 0xe000356e, 0x8b82: 0xe00035a4, 0x8b83: 0xe0003544, + 0x8b84: 0xe00027f7, 0x8b85: 0xe00027fa, 0x8b86: 0xe000354a, 0x8b87: 0xe0003529, + 0x8b88: 0xe0000a6b, 0x8b89: 0xe0000cb4, 0x8b8a: 0xe000358f, 0x8b8b: 0xe0003571, + 0x8b8c: 0xe00035a7, 0x8b8d: 0xe00035aa, 0x8b8e: 0xe0003553, 0x8b8f: 0xe00027fd, + 0x8b90: 0xe00027ce, 0x8b91: 0xe0000cb9, 0x8b92: 0xe0000d36, 0x8b93: 0xe0000be3, + 0x8b94: 0xe0000fc5, 0x8b95: 0xe00035ad, 0x8b96: 0xe0003556, 0x8b97: 0xe000325a, + 0x8b98: 0xe0002803, 0x8b99: 0xe0003526, 0x8b9a: 0xe000357d, 0x8b9b: 0xe00035b0, + 0x8b9c: 0xe0003559, 0x8b9d: 0xe000304f, 0x8b9e: 0xe0002806, 0x8b9f: 0xe0000d3e, + 0x8ba0: 0xe0000a72, 0x8ba1: 0xe000353e, 0x8ba2: 0xe0000cbd, 0x8ba3: 0xe0000d42, + 0x8ba4: 0xe0000a76, 0x8ba5: 0xe0003541, 0x8ba6: 0xe0000cc1, 0x8ba7: 0xe0000d2d, + 0x8ba8: 0xe0000d31, 0x8ba9: 0xe0003589, 0x8baa: 0xe0000cc5, 0x8bab: 0xe0000d4a, + 0x8bac: 0xe0000be7, 0x8bad: 0xe0000f0b, 0x8bae: 0xe0000f0f, 0x8baf: 0xe0000f15, + 0x8bb0: 0xe000282d, 0x8bb1: 0xe0002821, 0x8bb2: 0xe000288e, 0x8bb3: 0xe000281b, + 0x8bb4: 0xe0003592, 0x8bb5: 0xe0003580, 0x8bb6: 0xe00035b3, 0x8bb7: 0xe000355c, + 0x8bb8: 0xe000280f, 0x8bb9: 0xe000355f, 0x8bba: 0xe0003595, 0x8bbb: 0xe0003583, + 0x8bbc: 0xe00035b6, 0x8bbd: 0xe0003565, 0x8bbe: 0xe0002812, 0x8bbf: 0xe0003568, + // Block 0x22f, offset 0x8bc0 + 0x8bc0: 0xe0002815, 0x8bc1: 0xe000356b, 0x8bc2: 0xe00009b7, 0x8bc3: 0xe00024f3, + 0x8bc4: 0xe0003046, 0x8bc5: 0xe000304c, 0x8bc6: 0xe0000a66, 0x8bc7: 0xe0000a7a, + 0x8bc8: 0xe0003254, 0x8bc9: 0xe000352c, 0x8bca: 0xe00027c2, 0x8bcb: 0xe00027c8, + 0x8bcc: 0xe00027e5, 0x8bcd: 0xe0002800, 0x8bce: 0xe0002809, 0x8bcf: 0xe000280c, + 0x8bd0: 0xe0003538, 0x8bd1: 0xe000353b, 0x8bd2: 0xe0000d0d, 0x8bd3: 0xe0002818, + 0x8bd4: 0xe0003547, 0x8bd5: 0xe0000d3a, 0x8bd6: 0xe0000d46, 0x8bd7: 0xe0002827, + 0x8bd8: 0xe0000eb0, 0x8bd9: 0xe0000eb8, 0x8bda: 0xe000282a, 0x8bdb: 0xe0002836, + 0x8bdc: 0xe000283f, 0x8bdd: 0xe0003598, 0x8bde: 0xe00010b2, 0x8bdf: 0xe00009c8, + 0x8be0: 0xe0002d9d, 0x8be1: 0xe0002e0a, 0x8be2: 0xe0002e3f, 0x8be3: 0xe0002e6c, + 0x8be4: 0xe0002e7e, 0x8be5: 0xe0002e8d, 0x8be6: 0xe0002e9c, 0x8be7: 0xe0002eab, + 0x8be8: 0xe0002eba, 0x8be9: 0xe0002d02, 0x8bea: 0xe0002d15, 0x8beb: 0xe0002d28, + 0x8bec: 0xe0002d3b, 0x8bed: 0xe0002d4a, 0x8bee: 0xe0002d59, 0x8bef: 0xe0002d68, + 0x8bf0: 0xe0002d77, 0x8bf1: 0xe0002d86, 0x8bf2: 0xe0002d95, 0x8bf3: 0xe0002db3, + 0x8bf4: 0xe0002dbe, 0x8bf5: 0xe0002dc9, 0x8bf6: 0xe0002dd4, 0x8bf7: 0xe0002ddf, + 0x8bf8: 0xe0002dea, 0x8bf9: 0xe0002df1, 0x8bfa: 0xe0002df8, 0x8bfb: 0xe0002dff, + 0x8bfc: 0xe0002e06, 0x8bfd: 0xe0002e1c, 0x8bfe: 0xe0002e23, 0x8bff: 0xe0000bdf, + // Block 0x230, offset 0x8c00 + 0x8c00: 0xe0003520, 0x8c01: 0xe00026cf, 0x8c02: 0xe0003523, 0x8c03: 0xe0000b99, + 0x8c04: 0xe0000b9d, 0x8c05: 0xe0000f83, 0x8c06: 0xe000283c, + 0x8c13: 0xf0000404, + 0x8c14: 0xf0000404, 0x8c15: 0xf0000404, 0x8c16: 0xf0000404, 0x8c17: 0xf0000404, + 0x8c1d: 0xe000150b, 0x8c1e: 0xa1a09602, 0x8c1f: 0xe0001514, + 0x8c20: 0x0038ae85, 0x8c21: 0x00389085, 0x8c22: 0x00389685, 0x8c23: 0x00389885, + 0x8c24: 0x0038a485, 0x8c25: 0x0038a685, 0x8c26: 0x0038a885, 0x8c27: 0x0038b685, + 0x8c28: 0x0038ba85, 0x8c29: 0x00093885, 0x8c2a: 0xe0001542, 0x8c2b: 0xe000153f, + 0x8c2c: 0xe000154c, 0x8c2d: 0xe0001548, 0x8c2e: 0xe00014e1, 0x8c2f: 0xe00014e4, + 0x8c30: 0xe00014e7, 0x8c31: 0xe00014ea, 0x8c32: 0xe00014f0, 0x8c33: 0xe00014f3, + 0x8c34: 0xe00014f6, 0x8c35: 0xe00014fc, 0x8c36: 0xe0001505, + 0x8c38: 0xe0001508, 0x8c39: 0xe000150e, 0x8c3a: 0xe000151b, 0x8c3b: 0xe0001518, + 0x8c3c: 0xe0001521, 0x8c3e: 0xe0001524, + // Block 0x231, offset 0x8c40 + 0x8c40: 0xa0000000, 0x8c41: 0xa0000000, 0x8c42: 0xa0000000, 0x8c43: 0xa0000000, + 0x8c44: 0xa0000000, 0x8c45: 0xa0000000, 0x8c46: 0xa0000000, 0x8c47: 0xa0000000, + 0x8c48: 0xa0000000, 0x8c49: 0xa0000000, 0x8c4a: 0xa0000000, 0x8c4b: 0xa0000000, + 0x8c4c: 0xa0000000, 0x8c4d: 0xa0000000, 0x8c4e: 0xa0000000, 0x8c4f: 0xa0000000, + 0x8c50: 0x00024096, 0x8c51: 0x00025c96, 0x8c52: 0x00030496, 0x8c53: 0x00026c96, + 0x8c54: 0x00026296, 0x8c55: 0x0002ba96, 0x8c56: 0x0002c496, 0x8c57: 0x0004b496, + 0x8c58: 0x0004b696, 0x8c59: 0xe0002b6c, + 0x8c60: 0xae608202, 0x8c61: 0xae600000, 0x8c62: 0xae608102, 0x8c63: 0xae600000, + 0x8c64: 0xae600000, 0x8c65: 0xae600000, 0x8c66: 0xae600000, + 0x8c70: 0xe0002b65, 0x8c71: 0x00022c96, 0x8c72: 0x00022a96, 0x8c73: 0x00021696, + 0x8c74: 0x00021696, 0x8c75: 0x0003f496, 0x8c76: 0x0003f696, 0x8c77: 0x0003fc96, + 0x8c78: 0x0003fe96, 0x8c79: 0x0004b096, 0x8c7a: 0x0004b296, 0x8c7b: 0x0004ac96, + 0x8c7c: 0x0004ae96, 0x8c7d: 0x0004a096, 0x8c7e: 0x0004a296, 0x8c7f: 0x00049c96, + // Block 0x232, offset 0x8c80 + 0x8c80: 0xe0002cec, 0x8c81: 0xe0002ce9, 0x8c82: 0xe0002cf2, 0x8c83: 0xe0002da6, + 0x8c84: 0xe0002e13, 0x8c85: 0xe0002e48, 0x8c86: 0xe0002e75, 0x8c87: 0xe0002e87, + 0x8c88: 0xe0002e96, 0x8c89: 0xe0002ea5, 0x8c8a: 0xe0002eb4, + 0x8c90: 0xe0002b98, 0x8c91: 0xe0002ba0, 0x8c92: 0xe0002ba8, 0x8c93: 0xe0002bb0, + 0x8c94: 0xe00024a3, 0x8c95: 0xe0002bb8, 0x8c96: 0xe0002bc0, 0x8c97: 0xe00024ab, + 0x8c98: 0xe00024b3, 0x8c99: 0xe0002bc8, 0x8c9a: 0xe00024bb, 0x8c9b: 0xe0002bd0, + 0x8c9c: 0xe0002bd8, 0x8c9d: 0xe0002be0, 0x8c9e: 0xe00024c3, 0x8c9f: 0xe0002be8, + 0x8ca0: 0xe00024cb, 0x8ca1: 0xe00024d3, 0x8ca2: 0xe00024db, 0x8ca3: 0xe00024e3, + 0x8ca4: 0xe0002bf0, 0x8ca5: 0xe0002bf8, 0x8ca6: 0xe0002c00, 0x8ca7: 0xe00024eb, + 0x8ca8: 0xe0002c08, 0x8ca9: 0xe0002c10, 0x8caa: 0xe00024ef, 0x8cab: 0x002c3a8c, + 0x8cac: 0x002f7a8c, 0x8cad: 0xe0003049, 0x8cae: 0xe000359e, + 0x8cb0: 0x002bde9d, 0x8cb1: 0x002c0a9d, 0x8cb2: 0x002c3a9d, 0x8cb3: 0x002c629d, + 0x8cb4: 0x002c989d, 0x8cb5: 0x002d089d, 0x8cb6: 0x002d229d, 0x8cb7: 0x002d689d, + 0x8cb8: 0x002d9a9d, 0x8cb9: 0x002dcc9d, 0x8cba: 0x002dfe9d, 0x8cbb: 0x002e229d, + 0x8cbc: 0x002e829d, 0x8cbd: 0x002e9e9d, 0x8cbe: 0x002ee29d, 0x8cbf: 0x002f2c9d, + // Block 0x233, offset 0x8cc0 + 0x8cc0: 0x002f569d, 0x8cc1: 0x002f7a9d, 0x8cc2: 0x002fe69d, 0x8cc3: 0x00302c9d, + 0x8cc4: 0x00306c9d, 0x8cc5: 0x0030be9d, 0x8cc6: 0x0030e29d, 0x8cc7: 0x0030f69d, + 0x8cc8: 0x0031009d, 0x8cc9: 0x00312a9d, 0x8cca: 0xe00027cb, 0x8ccb: 0xe0003562, + 0x8ccc: 0xe0002830, 0x8ccd: 0xe0002839, 0x8cce: 0xe0000ebc, 0x8ccf: 0xe000359b, + 0x8cd0: 0x002bde8c, 0x8cd1: 0x002c0a8c, 0x8cd2: 0x002c3a8c, 0x8cd3: 0x002c628c, + 0x8cd4: 0x002c988c, 0x8cd5: 0x002d088c, 0x8cd6: 0x002d228c, 0x8cd7: 0x002d688c, + 0x8cd8: 0x002d9a8c, 0x8cd9: 0x002dcc8c, 0x8cda: 0x002dfe8c, 0x8cdb: 0x002e228c, + 0x8cdc: 0x002e828c, 0x8cdd: 0x002e9e8c, 0x8cde: 0x002ee28c, 0x8cdf: 0x002f2c8c, + 0x8ce0: 0x002f568c, 0x8ce1: 0x002f7a8c, 0x8ce2: 0x002fe68c, 0x8ce3: 0x00302c8c, + 0x8ce4: 0x00306c8c, 0x8ce5: 0x0030be8c, 0x8ce6: 0x0030e28c, 0x8ce7: 0x0030f68c, + 0x8ce8: 0x0031008c, 0x8ce9: 0x00312a8c, 0x8cea: 0xe000354d, 0x8ceb: 0xe0003550, + 0x8cf0: 0x002bde9d, 0x8cf1: 0x002c0a9d, 0x8cf2: 0x002c3a9d, 0x8cf3: 0x002c629d, + 0x8cf4: 0x002c989d, 0x8cf5: 0x002d089d, 0x8cf6: 0x002d229d, 0x8cf7: 0x002d689d, + 0x8cf8: 0x002d9a9d, 0x8cf9: 0x002dcc9d, 0x8cfa: 0x002dfe9d, 0x8cfb: 0x002e229d, + 0x8cfc: 0x002e829d, 0x8cfd: 0x002e9e9d, 0x8cfe: 0x002ee29d, 0x8cff: 0x002f2c9d, + // Block 0x234, offset 0x8d00 + 0x8d00: 0x002f569d, 0x8d01: 0x002f7a9d, 0x8d02: 0x002fe69d, 0x8d03: 0x00302c9d, + 0x8d04: 0x00306c9d, 0x8d05: 0x0030be9d, 0x8d06: 0x0030e29d, 0x8d07: 0x0030f69d, + 0x8d08: 0x0031009d, 0x8d09: 0x00312a9d, 0x8d0a: 0x002f2c9d, 0x8d0b: 0xe0000c81, + 0x8d0c: 0xe0000eb5, 0x8d0d: 0xe0000f74, 0x8d0e: 0xe00009d2, 0x8d0f: 0xe00010f0, + 0x8d10: 0xe0003257, 0x8d11: 0xe0000a6f, 0x8d12: 0xe0000a7e, 0x8d13: 0xe0000ba4, + 0x8d14: 0xe0000c84, 0x8d15: 0xe0000d8a, 0x8d16: 0xe0000d8e, 0x8d17: 0xe0000e9b, + 0x8d18: 0xe0000f77, 0x8d19: 0xe00010a2, 0x8d1a: 0xe00010c0, + // Block 0x235, offset 0x8d40 + 0x8d40: 0xa0000000, 0x8d41: 0xa0000000, 0x8d42: 0xa0000000, 0x8d43: 0xa0000000, + 0x8d44: 0xa0000000, 0x8d45: 0xa0000000, 0x8d46: 0xa0000000, 0x8d47: 0xa0000000, + 0x8d48: 0xa0000000, 0x8d49: 0x40020020, 0x8d4a: 0x40020220, 0x8d4b: 0x40020420, + 0x8d4c: 0x40020620, 0x8d4d: 0x40020820, 0x8d4e: 0xa0000000, 0x8d4f: 0xa0000000, + 0x8d50: 0xa0000000, 0x8d51: 0xa0000000, 0x8d52: 0xa0000000, 0x8d53: 0xa0000000, + 0x8d54: 0xa0000000, 0x8d55: 0xa0000000, 0x8d56: 0xa0000000, 0x8d57: 0xa0000000, + 0x8d58: 0xa0000000, 0x8d59: 0xa0000000, 0x8d5a: 0xa0000000, 0x8d5b: 0xa0000000, + 0x8d5c: 0xa0000000, 0x8d5d: 0xa0000000, 0x8d5e: 0xa0000000, 0x8d5f: 0xa0000000, + 0x8d60: 0x40021220, 0x8d61: 0x4002ba20, 0x8d62: 0x4003e020, 0x8d63: 0x4004ea20, + 0x8d64: 0x4027de20, 0x8d65: 0x4004ec20, 0x8d66: 0x4004e620, 0x8d67: 0x4003d220, + 0x8d68: 0x4003f420, 0x8d69: 0x4003f620, 0x8d6a: 0x4004d820, 0x8d6b: 0x40093820, + 0x8d6c: 0x40024020, 0x8d6d: 0x40021a20, 0x8d6e: 0x4002e420, 0x8d6f: 0x4004e220, + 0x8d70: 0x4029cc20, 0x8d71: 0x4029ce20, 0x8d72: 0x4029d020, 0x8d73: 0x4029d220, + 0x8d74: 0x4029d420, 0x8d75: 0x4029d620, 0x8d76: 0x4029d820, 0x8d77: 0x4029da20, + 0x8d78: 0x4029dc20, 0x8d79: 0x4029de20, 0x8d7a: 0x40026c20, 0x8d7b: 0x40026220, + 0x8d7c: 0x40094020, 0x8d7d: 0x40094220, 0x8d7e: 0x40094420, 0x8d7f: 0x4002c420, + // Block 0x236, offset 0x8d80 + 0x8d80: 0x4004d620, 0x8d81: 0x002bde88, 0x8d82: 0x002c0a88, 0x8d83: 0xc3352741, + 0x8d84: 0x002c6288, 0x8d85: 0x002c9888, 0x8d86: 0x002d0888, 0x8d87: 0xc3392741, + 0x8d88: 0xc5342741, 0x8d89: 0x002d9a88, 0x8d8a: 0xc5382741, 0x8d8b: 0x002dfe88, + 0x8d8c: 0xc0030002, 0x8d8d: 0x002e8288, 0x8d8e: 0x002e9e88, 0x8d8f: 0x002ee288, + 0x8d90: 0x002f2c88, 0x8d91: 0x002f5688, 0x8d92: 0x002f7a88, 0x8d93: 0xc3432741, + 0x8d94: 0x00302c88, 0x8d95: 0xc34700d1, 0x8d96: 0x0030be88, 0x8d97: 0x0030e288, + 0x8d98: 0x0030f688, 0x8d99: 0x00310088, 0x8d9a: 0x00312a88, 0x8d9b: 0x4003f820, + 0x8d9c: 0x4004e420, 0x8d9d: 0x4003fa20, 0x8d9e: 0x40062420, 0x8d9f: 0x40021620, + 0x8da0: 0x40061e20, 0x8da1: 0x402bde20, 0x8da2: 0x402c0a20, 0x8da3: 0xc3332741, + 0x8da4: 0x402c6220, 0x8da5: 0x402c9820, 0x8da6: 0x402d0820, 0x8da7: 0xc3372741, + 0x8da8: 0xc5322741, 0x8da9: 0x402d9a20, 0x8daa: 0xc5362741, 0x8dab: 0x402dfe20, + 0x8dac: 0xc0000002, 0x8dad: 0x402e8220, 0x8dae: 0x402e9e20, 0x8daf: 0x402ee220, + 0x8db0: 0x402f2c20, 0x8db1: 0x402f5620, 0x8db2: 0x402f7a20, 0x8db3: 0xc3412741, + 0x8db4: 0x40302c20, 0x8db5: 0xc34500d1, 0x8db6: 0x4030be20, 0x8db7: 0x4030e220, + 0x8db8: 0x4030f620, 0x8db9: 0x40310020, 0x8dba: 0x40312a20, 0x8dbb: 0x4003fc20, + 0x8dbc: 0x40094820, 0x8dbd: 0x4003fe20, 0x8dbe: 0x40094c20, 0x8dbf: 0xa0000000, + // Block 0x237, offset 0x8dc0 + 0x8dc0: 0xe0000983, 0x8dc1: 0xe0000980, 0x8dc2: 0xe00008fb, 0x8dc3: 0xe00008f8, + 0x8dc4: 0xe000097d, 0x8dc5: 0xe000097a, 0x8dc6: 0xe0000a38, 0x8dc7: 0xe0000a35, + 0x8dc8: 0x002c3c83, 0x8dc9: 0x402c3c20, 0x8dca: 0xe0000a4a, 0x8dcb: 0xe0000a47, + 0x8dcc: 0xe0000a44, 0x8dcd: 0xe0000a41, 0x8dce: 0xe0000a86, 0x8dcf: 0xe0000a83, + 0x8dd0: 0xe0000aaa, 0x8dd1: 0xe0000aa7, 0x8dd2: 0xe0000b46, 0x8dd3: 0xe0000b43, + 0x8dd4: 0xe0000aee, 0x8dd5: 0xe0000aeb, 0x8dd6: 0xe0000b2c, 0x8dd7: 0xe0000b29, + 0x8dd8: 0xe0000b40, 0x8dd9: 0xe0000b3d, 0x8dda: 0xe0000b1a, 0x8ddb: 0xe0000b17, + 0x8ddc: 0x002d2483, 0x8ddd: 0x402d2420, 0x8dde: 0xe0000bb2, 0x8ddf: 0xe0000baf, + 0x8de0: 0xe0000bc4, 0x8de1: 0xe0000bc1, 0x8de2: 0xe0000bca, 0x8de3: 0xe0000bc7, + 0x8de4: 0x002d6a83, 0x8de5: 0x402d6a20, 0x8de6: 0xe0000c1b, 0x8de7: 0xe0000c18, + 0x8de8: 0xe0000c51, 0x8de9: 0xe0000c4e, 0x8dea: 0xe0000c60, 0x8deb: 0xe0000c5d, + 0x8dec: 0xe0000c31, 0x8ded: 0xe0000c2e, 0x8dee: 0xe0000c5a, 0x8def: 0xe0000c57, + 0x8df0: 0xe0000c54, 0x8df1: 0x402da220, 0x8df2: 0xf0000a0a, 0x8df3: 0xf0000404, + 0x8df4: 0x002dce83, 0x8df5: 0x402dce20, 0x8df6: 0xe0000c9f, 0x8df7: 0xe0000c9c, + 0x8df8: 0x402f7220, 0x8df9: 0xe0000ccc, 0x8dfa: 0xe0000cc9, 0x8dfb: 0xe0000cd8, + 0x8dfc: 0xe0000cd5, 0x8dfd: 0xe0000cd2, 0x8dfe: 0xe0000ccf, 0x8dff: 0xe0000d04, + // Block 0x238, offset 0x8e00 + 0x8e00: 0xe0000cfe, 0x8e01: 0xe0000cf8, 0x8e02: 0xe0000cf5, 0x8e03: 0xe0000d51, + 0x8e04: 0xe0000d4e, 0x8e05: 0xe0000d6f, 0x8e06: 0xe0000d6c, 0x8e07: 0xe0000d5d, + 0x8e08: 0xe0000d5a, 0x8e09: 0xf0000404, 0x8e0a: 0x002eda88, 0x8e0b: 0x402eda20, + 0x8e0c: 0xe0000e2e, 0x8e0d: 0xe0000e2b, 0x8e0e: 0xe0000da0, 0x8e0f: 0xe0000d9d, + 0x8e10: 0xe0000de0, 0x8e11: 0xe0000ddd, 0x8e12: 0xe0000e93, 0x8e13: 0xe0000e8f, + 0x8e14: 0xe0000eca, 0x8e15: 0xe0000ec7, 0x8e16: 0xe0000edc, 0x8e17: 0xe0000ed9, + 0x8e18: 0xe0000ed0, 0x8e19: 0xe0000ecd, 0x8e1a: 0xe0000f1f, 0x8e1b: 0xe0000f1c, + 0x8e1c: 0x002fe883, 0x8e1d: 0x402fe820, 0x8e1e: 0xe0000f47, 0x8e1f: 0xe0000f44, + 0x8e20: 0xe0000f33, 0x8e21: 0xe0000f30, 0x8e22: 0xe0000f99, 0x8e23: 0xe0000f96, + 0x8e24: 0xe0000f8a, 0x8e25: 0xe0000f87, 0x8e26: 0x00303688, 0x8e27: 0x40303620, + 0x8e28: 0xe000102b, 0x8e29: 0xe0001028, 0x8e2a: 0xe000103f, 0x8e2b: 0xe000103c, + 0x8e2c: 0x00306e83, 0x8e2d: 0x40306e20, 0x8e2e: 0xe0000ff9, 0x8e2f: 0xe0000ff6, + 0x8e30: 0xe0001025, 0x8e31: 0xe0001022, 0x8e32: 0xe0001039, 0x8e33: 0xe0001036, + 0x8e34: 0xe00010d8, 0x8e35: 0xe00010d5, 0x8e36: 0xe000110e, 0x8e37: 0xe000110b, + 0x8e38: 0xe0001117, 0x8e39: 0xe000113b, 0x8e3a: 0xe0001138, 0x8e3b: 0xe000114d, + 0x8e3c: 0xe000114a, 0x8e3d: 0xe0001147, 0x8e3e: 0xe0001144, 0x8e3f: 0xe0000f64, + // Block 0x239, offset 0x8e40 + 0x8e40: 0xa0000000, 0x8e41: 0xa0000000, 0x8e42: 0xa0000000, 0x8e43: 0xa0000000, + 0x8e44: 0xa0000000, 0x8e45: 0xa0000000, 0x8e46: 0xa0000000, 0x8e47: 0xa0000000, + 0x8e48: 0xa0000000, 0x8e49: 0x40020020, 0x8e4a: 0x40020220, 0x8e4b: 0x40020420, + 0x8e4c: 0x40020620, 0x8e4d: 0x40020820, 0x8e4e: 0xa0000000, 0x8e4f: 0xa0000000, + 0x8e50: 0xa0000000, 0x8e51: 0xa0000000, 0x8e52: 0xa0000000, 0x8e53: 0xa0000000, + 0x8e54: 0xa0000000, 0x8e55: 0xa0000000, 0x8e56: 0xa0000000, 0x8e57: 0xa0000000, + 0x8e58: 0xa0000000, 0x8e59: 0xa0000000, 0x8e5a: 0xa0000000, 0x8e5b: 0xa0000000, + 0x8e5c: 0xa0000000, 0x8e5d: 0xa0000000, 0x8e5e: 0xa0000000, 0x8e5f: 0xa0000000, + 0x8e60: 0x40021220, 0x8e61: 0x4002ba20, 0x8e62: 0x4003e020, 0x8e63: 0x4004ea20, + 0x8e64: 0x4027de20, 0x8e65: 0x4004ec20, 0x8e66: 0x4004e620, 0x8e67: 0x4003d220, + 0x8e68: 0x4003f420, 0x8e69: 0x4003f620, 0x8e6a: 0x4004d820, 0x8e6b: 0x40093820, + 0x8e6c: 0x40024020, 0x8e6d: 0x40021a20, 0x8e6e: 0x4002e420, 0x8e6f: 0x4004e220, + 0x8e70: 0x4029cc20, 0x8e71: 0x4029ce20, 0x8e72: 0x4029d020, 0x8e73: 0x4029d220, + 0x8e74: 0x4029d420, 0x8e75: 0x4029d620, 0x8e76: 0x4029d820, 0x8e77: 0x4029da20, + 0x8e78: 0x4029dc20, 0x8e79: 0x4029de20, 0x8e7a: 0x40026c20, 0x8e7b: 0x40026220, + 0x8e7c: 0x40094020, 0x8e7d: 0x40094220, 0x8e7e: 0x40094420, 0x8e7f: 0x4002c420, + // Block 0x23a, offset 0x8e80 + 0x8e80: 0x4004d620, 0x8e81: 0x002bde88, 0x8e82: 0x002c0a88, 0x8e83: 0x002c3a88, + 0x8e84: 0x002c6288, 0x8e85: 0x002c9888, 0x8e86: 0x002d0888, 0x8e87: 0x002d2288, + 0x8e88: 0x002d6888, 0x8e89: 0x002d9a88, 0x8e8a: 0x002dcc88, 0x8e8b: 0x002dfe88, + 0x8e8c: 0xc0030002, 0x8e8d: 0x002e8288, 0x8e8e: 0xc53a2761, 0x8e8f: 0x002ee288, + 0x8e90: 0x002f2c88, 0x8e91: 0x002f5688, 0x8e92: 0x002f7a88, 0x8e93: 0x002fe688, + 0x8e94: 0x00302c88, 0x8e95: 0x00306c88, 0x8e96: 0x0030be88, 0x8e97: 0x0030e288, + 0x8e98: 0x0030f688, 0x8e99: 0x00310088, 0x8e9a: 0x00312a88, 0x8e9b: 0x4003f820, + 0x8e9c: 0x4004e420, 0x8e9d: 0x4003fa20, 0x8e9e: 0x40062420, 0x8e9f: 0x40021620, + 0x8ea0: 0x40061e20, 0x8ea1: 0x402bde20, 0x8ea2: 0x402c0a20, 0x8ea3: 0x402c3a20, + 0x8ea4: 0x402c6220, 0x8ea5: 0x402c9820, 0x8ea6: 0x402d0820, 0x8ea7: 0x402d2220, + 0x8ea8: 0x402d6820, 0x8ea9: 0x402d9a20, 0x8eaa: 0x402dcc20, 0x8eab: 0x402dfe20, + 0x8eac: 0xc0000002, 0x8ead: 0x402e8220, 0x8eae: 0xc5272761, 0x8eaf: 0x402ee220, + 0x8eb0: 0x402f2c20, 0x8eb1: 0x402f5620, 0x8eb2: 0x402f7a20, 0x8eb3: 0x402fe620, + 0x8eb4: 0x40302c20, 0x8eb5: 0x40306c20, 0x8eb6: 0x4030be20, 0x8eb7: 0x4030e220, + 0x8eb8: 0x4030f620, 0x8eb9: 0x40310020, 0x8eba: 0x40312a20, 0x8ebb: 0x4003fc20, + 0x8ebc: 0x40094820, 0x8ebd: 0x4003fe20, 0x8ebe: 0x40094c20, 0x8ebf: 0xa0000000, + // Block 0x23b, offset 0x8ec0 + 0x8ec0: 0xe00008f5, 0x8ec1: 0xe00008ef, 0x8ec2: 0xe0000921, 0x8ec3: 0xe0000969, + 0x8ec4: 0xe000095b, 0x8ec5: 0xe000094d, 0x8ec6: 0xe00009dd, 0x8ec7: 0xe0000a53, + 0x8ec8: 0xe0000ae8, 0x8ec9: 0xe0000ae2, 0x8eca: 0xe0000af4, 0x8ecb: 0xe0000b20, + 0x8ecc: 0xe0000c2b, 0x8ecd: 0xe0000c25, 0x8ece: 0xe0000c37, 0x8ecf: 0xe0000c43, + 0x8ed0: 0xe0000ab3, 0x8ed1: 0x002ea083, 0x8ed2: 0xe0000d9a, 0x8ed3: 0xe0000d94, + 0x8ed4: 0xe0000da6, 0x8ed5: 0xe0000de6, 0x8ed6: 0xe0000dd2, 0x8ed7: 0x40093e20, + 0x8ed8: 0xe0000e12, 0x8ed9: 0xe0000fe1, 0x8eda: 0xe0000fdb, 0x8edb: 0xe0000fed, + 0x8edc: 0xe0000fff, 0x8edd: 0xe0001102, 0x8ede: 0x00318888, 0x8edf: 0xe0000f7b, + 0x8ee0: 0xe00008f2, 0x8ee1: 0xe00008ec, 0x8ee2: 0xe000091e, 0x8ee3: 0xe0000966, + 0x8ee4: 0xe0000958, 0x8ee5: 0xe000094a, 0x8ee6: 0xe00009d5, 0x8ee7: 0xe0000a4d, + 0x8ee8: 0xe0000ae5, 0x8ee9: 0xe0000adf, 0x8eea: 0xe0000af1, 0x8eeb: 0xe0000b1d, + 0x8eec: 0xe0000c28, 0x8eed: 0xe0000c22, 0x8eee: 0xe0000c34, 0x8eef: 0xe0000c40, + 0x8ef0: 0xe0000aad, 0x8ef1: 0x402ea020, 0x8ef2: 0xe0000d97, 0x8ef3: 0xe0000d91, + 0x8ef4: 0xe0000da3, 0x8ef5: 0xe0000de3, 0x8ef6: 0xe0000dcf, 0x8ef7: 0x40093c20, + 0x8ef8: 0xe0000e0f, 0x8ef9: 0xe0000fde, 0x8efa: 0xe0000fd8, 0x8efb: 0xe0000fea, + 0x8efc: 0xe0000ffc, 0x8efd: 0xe00010ff, 0x8efe: 0x40318820, 0x8eff: 0xe0001114, + // Block 0x23c, offset 0x8f00 + 0x8f00: 0xa0000000, 0x8f01: 0xa0000000, 0x8f02: 0xa0000000, 0x8f03: 0xa0000000, + 0x8f04: 0xa0000000, 0x8f05: 0xa0000000, 0x8f06: 0xa0000000, 0x8f07: 0xa0000000, + 0x8f08: 0xa0000000, 0x8f09: 0x40020020, 0x8f0a: 0x40020220, 0x8f0b: 0x40020420, + 0x8f0c: 0x40020620, 0x8f0d: 0x40020820, 0x8f0e: 0xa0000000, 0x8f0f: 0xa0000000, + 0x8f10: 0xa0000000, 0x8f11: 0xa0000000, 0x8f12: 0xa0000000, 0x8f13: 0xa0000000, + 0x8f14: 0xa0000000, 0x8f15: 0xa0000000, 0x8f16: 0xa0000000, 0x8f17: 0xa0000000, + 0x8f18: 0xa0000000, 0x8f19: 0xa0000000, 0x8f1a: 0xa0000000, 0x8f1b: 0xa0000000, + 0x8f1c: 0xa0000000, 0x8f1d: 0xa0000000, 0x8f1e: 0xa0000000, 0x8f1f: 0xa0000000, + 0x8f20: 0x40021220, 0x8f21: 0x4002ba20, 0x8f22: 0x4003e020, 0x8f23: 0x4004ea20, + 0x8f24: 0x4027de20, 0x8f25: 0x4004ec20, 0x8f26: 0x4004e620, 0x8f27: 0x4003d220, + 0x8f28: 0x4003f420, 0x8f29: 0x4003f620, 0x8f2a: 0x4004d820, 0x8f2b: 0x40093820, + 0x8f2c: 0x40024020, 0x8f2d: 0x40021a20, 0x8f2e: 0x4002e420, 0x8f2f: 0x4004e220, + 0x8f30: 0x4029cc20, 0x8f31: 0x4029ce20, 0x8f32: 0x4029d020, 0x8f33: 0x4029d220, + 0x8f34: 0x4029d420, 0x8f35: 0x4029d620, 0x8f36: 0x4029d820, 0x8f37: 0x4029da20, + 0x8f38: 0x4029dc20, 0x8f39: 0x4029de20, 0x8f3a: 0x40026c20, 0x8f3b: 0x40026220, + 0x8f3c: 0x40094020, 0x8f3d: 0x40094220, 0x8f3e: 0x40094420, 0x8f3f: 0x4002c420, + // Block 0x23d, offset 0x8f40 + 0x8f40: 0x4004d620, 0x8f41: 0xc54c0071, 0x8f42: 0x002c0a88, 0x8f43: 0x002c3a88, + 0x8f44: 0x002c6288, 0x8f45: 0x002c9888, 0x8f46: 0x002d0888, 0x8f47: 0x002d2288, + 0x8f48: 0x002d6888, 0x8f49: 0x002d9a88, 0x8f4a: 0x002dcc88, 0x8f4b: 0x002dfe88, + 0x8f4c: 0xc0030002, 0x8f4d: 0x002e8288, 0x8f4e: 0x002e9e88, 0x8f4f: 0xc5472781, + 0x8f50: 0x002f2c88, 0x8f51: 0x002f5688, 0x8f52: 0x002f7a88, 0x8f53: 0xc53e0991, + 0x8f54: 0x00302c88, 0x8f55: 0xc5500071, 0x8f56: 0x0030be88, 0x8f57: 0x0030bea3, + 0x8f58: 0x0030f688, 0x8f59: 0x00310088, 0x8f5a: 0xc5420991, 0x8f5b: 0x4003f820, + 0x8f5c: 0x4004e420, 0x8f5d: 0x4003fa20, 0x8f5e: 0x40062420, 0x8f5f: 0x40021620, + 0x8f60: 0x40061e20, 0x8f61: 0xc54a0071, 0x8f62: 0x402c0a20, 0x8f63: 0x402c3a20, + 0x8f64: 0x402c6220, 0x8f65: 0x402c9820, 0x8f66: 0x402d0820, 0x8f67: 0x402d2220, + 0x8f68: 0x402d6820, 0x8f69: 0x402d9a20, 0x8f6a: 0x402dcc20, 0x8f6b: 0x402dfe20, + 0x8f6c: 0xc0000002, 0x8f6d: 0x402e8220, 0x8f6e: 0x402e9e20, 0x8f6f: 0xc5442781, + 0x8f70: 0x402f2c20, 0x8f71: 0x402f5620, 0x8f72: 0x402f7a20, 0x8f73: 0xc53c0991, + 0x8f74: 0x40302c20, 0x8f75: 0xc54e0071, 0x8f76: 0x4030be20, 0x8f77: 0x4030be21, + 0x8f78: 0x4030f620, 0x8f79: 0x40310020, 0x8f7a: 0xc5400991, 0x8f7b: 0x4003fc20, + 0x8f7c: 0x40094820, 0x8f7d: 0x4003fe20, 0x8f7e: 0x40094c20, 0x8f7f: 0xa0000000, + // Block 0x23e, offset 0x8f80 + 0x8f80: 0xe00008f5, 0x8f81: 0xe00008ef, 0x8f82: 0xe0000921, 0x8f83: 0xe0000969, + 0x8f84: 0x0030f083, 0x8f85: 0xe000094d, 0x8f86: 0xe00009dd, 0x8f87: 0xe0000a53, + 0x8f88: 0xe0000ae8, 0x8f89: 0xe0000ae2, 0x8f8a: 0xe0000af4, 0x8f8b: 0xe0000b20, + 0x8f8c: 0xe0000c2b, 0x8f8d: 0xe0000c25, 0x8f8e: 0xe0000c37, 0x8f8f: 0xe0000c43, + 0x8f90: 0xe0000ab3, 0x8f91: 0xe0000d63, 0x8f92: 0xe0000d9a, 0x8f93: 0xe0000d94, + 0x8f94: 0xe0000da6, 0x8f95: 0x0030ee83, 0x8f96: 0x0030f283, 0x8f97: 0x40093e20, + 0x8f98: 0xe0000e12, 0x8f99: 0xe0000fe1, 0x8f9a: 0xe0000fdb, 0x8f9b: 0xe0000fed, + 0x8f9c: 0x0030f483, 0x8f9d: 0xe0001102, 0x8f9e: 0x00318888, 0x8f9f: 0xe0000f7b, + 0x8fa0: 0xe00008f2, 0x8fa1: 0xe00008ec, 0x8fa2: 0xe000091e, 0x8fa3: 0xe0000966, + 0x8fa4: 0x4030f020, 0x8fa5: 0xe000094a, 0x8fa6: 0xe00009d5, 0x8fa7: 0xe0000a4d, + 0x8fa8: 0xe0000ae5, 0x8fa9: 0xe0000adf, 0x8faa: 0xe0000af1, 0x8fab: 0xe0000b1d, + 0x8fac: 0xe0000c28, 0x8fad: 0xe0000c22, 0x8fae: 0xe0000c34, 0x8faf: 0xe0000c40, + 0x8fb0: 0xe0000aad, 0x8fb1: 0xe0000d60, 0x8fb2: 0xe0000d97, 0x8fb3: 0xe0000d91, + 0x8fb4: 0xe0000da3, 0x8fb5: 0x4030ee20, 0x8fb6: 0x4030f220, 0x8fb7: 0x40093c20, + 0x8fb8: 0xe0000e0f, 0x8fb9: 0xe0000fde, 0x8fba: 0xe0000fd8, 0x8fbb: 0xe0000fea, + 0x8fbc: 0x4030f420, 0x8fbd: 0xe00010ff, 0x8fbe: 0x40318820, 0x8fbf: 0xe0001114, + // Block 0x23f, offset 0x8fc0 + 0x8fc0: 0xe0000cfe, 0x8fc1: 0xe0000cf8, 0x8fc2: 0xe0000cf5, 0x8fc3: 0xe0000d51, + 0x8fc4: 0xe0000d4e, 0x8fc5: 0xe0000d6f, 0x8fc6: 0xe0000d6c, 0x8fc7: 0xe0000d5d, + 0x8fc8: 0xe0000d5a, 0x8fc9: 0xf0000404, 0x8fca: 0x002eda88, 0x8fcb: 0x402eda20, + 0x8fcc: 0xe0000e2e, 0x8fcd: 0xe0000e2b, 0x8fce: 0xe0000da0, 0x8fcf: 0xe0000d9d, + 0x8fd0: 0xe0000de0, 0x8fd1: 0xe0000ddd, 0x8fd2: 0xe0000e93, 0x8fd3: 0xe0000e8f, + 0x8fd4: 0xe0000eca, 0x8fd5: 0xe0000ec7, 0x8fd6: 0xe0000edc, 0x8fd7: 0xe0000ed9, + 0x8fd8: 0xe0000ed0, 0x8fd9: 0xe0000ecd, 0x8fda: 0xe0000f1f, 0x8fdb: 0xe0000f1c, + 0x8fdc: 0xe0000f2d, 0x8fdd: 0xe0000f2a, 0x8fde: 0xe0000f47, 0x8fdf: 0xe0000f44, + 0x8fe0: 0x00302683, 0x8fe1: 0x40302620, 0x8fe2: 0xe0000f99, 0x8fe3: 0xe0000f96, + 0x8fe4: 0xe0000f8a, 0x8fe5: 0xe0000f87, 0x8fe6: 0x00303688, 0x8fe7: 0x40303620, + 0x8fe8: 0xe000102b, 0x8fe9: 0xe0001028, 0x8fea: 0xe000103f, 0x8feb: 0xe000103c, + 0x8fec: 0xe0000fe7, 0x8fed: 0xe0000fe4, 0x8fee: 0xe0000ff9, 0x8fef: 0xe0000ff6, + 0x8ff0: 0xe0001025, 0x8ff1: 0xe0001022, 0x8ff2: 0xe0001039, 0x8ff3: 0xe0001036, + 0x8ff4: 0xe00035ec, 0x8ff5: 0xe00035e9, 0x8ff6: 0xe000110e, 0x8ff7: 0xe000110b, + 0x8ff8: 0xe0001117, 0x8ff9: 0xe00035c2, 0x8ffa: 0xe00035bf, 0x8ffb: 0xe00035ce, + 0x8ffc: 0xe00035cb, 0x8ffd: 0x00302a83, 0x8ffe: 0x40302a20, 0x8fff: 0xe0000f64, + // Block 0x240, offset 0x9000 + 0x9000: 0x40321220, 0x9001: 0x40321a20, 0x9002: 0x40322220, 0x9003: 0x40322a20, + 0x9004: 0xe0000ad5, 0x9005: 0xe0000ad1, 0x9006: 0xe0000acd, 0x9007: 0xf0000a0a, + 0x9008: 0xf000040a, 0x9009: 0xf0000404, 0x900a: 0xf0000a0a, 0x900b: 0xf000040a, + 0x900c: 0xf0000404, 0x900d: 0xe0000947, 0x900e: 0xe0000944, 0x900f: 0xe0000c3d, + 0x9010: 0xe0000c3a, 0x9011: 0xe0000dcc, 0x9012: 0xe0000dc9, 0x9013: 0xe0000ff3, + 0x9014: 0xe0000ff0, 0x9015: 0xe0003643, 0x9016: 0xe0003640, 0x9017: 0xe0003631, + 0x9018: 0xe000362e, 0x9019: 0xe000363d, 0x901a: 0xe000363a, 0x901b: 0xe0003637, + 0x901c: 0xe0003634, 0x901d: 0x402cae20, 0x901e: 0xe0003625, 0x901f: 0xe0003622, + 0x9020: 0xe0000976, 0x9021: 0xe0000972, 0x9022: 0xe00009f4, 0x9023: 0xe00009ef, + 0x9024: 0x002d3a88, 0x9025: 0x402d3a20, 0x9026: 0xe0000bbe, 0x9027: 0xe0000bbb, + 0x9028: 0xe0000c99, 0x9029: 0xe0000c96, 0x902a: 0xe0000e20, 0x902b: 0xe0000e1d, + 0x902c: 0xe0000e27, 0x902d: 0xe0000e23, 0x902e: 0xe0001162, 0x902f: 0xe000115f, + 0x9030: 0xe0000c8d, 0x9031: 0xe0003266, 0x9032: 0xe0003263, 0x9033: 0xe0003260, + 0x9034: 0xe0000bac, 0x9035: 0xe0000ba9, 0x9036: 0x002d7888, 0x9037: 0x00319488, + 0x9038: 0xe0000d57, 0x9039: 0xe0000d54, 0x903a: 0xe0000954, 0x903b: 0xe0000950, + 0x903c: 0xe00009ea, 0x903d: 0xe00009e5, 0x903e: 0xe0000e19, 0x903f: 0xe0000e15, + // Block 0x241, offset 0x9040 + 0x9040: 0xe000098f, 0x9041: 0xe000098c, 0x9042: 0xe0000995, 0x9043: 0xe0000992, + 0x9044: 0xe0000b62, 0x9045: 0xe0000b5f, 0x9046: 0xe0000b68, 0x9047: 0xe0000b65, + 0x9048: 0xe0000c6c, 0x9049: 0xe0000c69, 0x904a: 0xe0000c72, 0x904b: 0xe0000c6f, + 0x904c: 0xe0000e4a, 0x904d: 0xe0000e47, 0x904e: 0xe0000e50, 0x904f: 0xe0000e4d, + 0x9050: 0xe0000ee8, 0x9051: 0xe0000ee5, 0x9052: 0xe0000eee, 0x9053: 0xe0000eeb, + 0x9054: 0xe0001053, 0x9055: 0xe0001050, 0x9056: 0xe0001059, 0x9057: 0xe0001056, + 0x9058: 0xe0000f61, 0x9059: 0xe0000f5e, 0x905a: 0xe0000fa5, 0x905b: 0xe0000fa2, + 0x905c: 0x00312288, 0x905d: 0x40312220, 0x905e: 0xe0000bf4, 0x905f: 0xe0000bf1, + 0x9060: 0x002ebc88, 0x9061: 0x402c8c20, 0x9062: 0x002f2288, 0x9063: 0x402f2220, + 0x9064: 0x00314088, 0x9065: 0x40314020, 0x9066: 0xe000096f, 0x9067: 0xe000096c, + 0x9068: 0xe0000b32, 0x9069: 0xe0000b2f, 0x906a: 0xe000362b, 0x906b: 0xe0003628, + 0x906c: 0xe0003619, 0x906d: 0xe0003616, 0x906e: 0xe0000e04, 0x906f: 0xe0000e01, + 0x9070: 0xe0000e0b, 0x9071: 0xe0000e07, 0x9072: 0xe0001129, 0x9073: 0xe0001126, + 0x9074: 0x402e5e20, 0x9075: 0x402ed020, 0x9076: 0x40305a20, 0x9077: 0x402dd420, + 0x9078: 0xe0000abf, 0x9079: 0xe0000ec4, 0x907a: 0x002be888, 0x907b: 0x002c4488, + 0x907c: 0x402c4420, 0x907d: 0x002e3888, 0x907e: 0x00303e88, 0x907f: 0x402ffc20, + // Block 0x242, offset 0x9080 + 0x9080: 0xe0000d24, 0x9081: 0xe0000d21, 0x9082: 0xe0000d2a, 0x9083: 0xe0000d27, + 0x9084: 0xe0000d69, 0x9085: 0xe0000d66, 0x9086: 0xe0000d7b, 0x9087: 0xe0000d78, + 0x9088: 0xe0000d87, 0x9089: 0xe0000d84, 0x908a: 0xe0000d81, 0x908b: 0xe0000d7e, + 0x908c: 0xe0003607, 0x908d: 0xe0003604, 0x908e: 0xe0003613, 0x908f: 0xe0003610, + 0x9090: 0xe0000e3d, 0x9091: 0xe0000e39, 0x9092: 0xe0000e35, 0x9093: 0xe0000e31, + 0x9094: 0xe0000ea7, 0x9095: 0xe0000ea4, 0x9096: 0xe0000ead, 0x9097: 0xe0000eaa, + 0x9098: 0xe0000ed6, 0x9099: 0xe0000ed3, 0x909a: 0xe0000ef4, 0x909b: 0xe0000ef1, + 0x909c: 0xe0000efb, 0x909d: 0xe0000ef7, 0x909e: 0xe0000f02, 0x909f: 0xe0000eff, + 0x90a0: 0xe0000f41, 0x90a1: 0xe0000f3e, 0x90a2: 0xe0000f53, 0x90a3: 0xe0000f50, + 0x90a4: 0xe0000f26, 0x90a5: 0xe0000f22, 0x90a6: 0xe00035bc, 0x90a7: 0xe00035b9, + 0x90a8: 0xe0000f5a, 0x90a9: 0xe0000f56, 0x90aa: 0xe0000f93, 0x90ab: 0xe0000f90, + 0x90ac: 0xe0000f9f, 0x90ad: 0xe0000f9c, 0x90ae: 0xe0000fb1, 0x90af: 0xe0000fae, + 0x90b0: 0xe0000fab, 0x90b1: 0xe0000fa8, 0x90b2: 0xe0001093, 0x90b3: 0xe0001090, + 0x90b4: 0xe000109f, 0x90b5: 0xe000109c, 0x90b6: 0xe0001099, 0x90b7: 0xe0001096, + 0x90b8: 0xe0001032, 0x90b9: 0xe000102e, 0x90ba: 0xe0003643, 0x90bb: 0xe0003640, + 0x90bc: 0xe00010a9, 0x90bd: 0xe00010a6, 0x90be: 0xe00010af, 0x90bf: 0xe00010ac, + // Block 0x243, offset 0x90c0 + 0x90c0: 0xe00035e6, 0x90c1: 0xe00035e3, 0x90c2: 0xe00035e0, 0x90c3: 0xe00035dd, + 0x90c4: 0xe00035f5, 0x90c5: 0xe00035f2, 0x90c6: 0xe00035fb, 0x90c7: 0xe00035f8, + 0x90c8: 0xe0003601, 0x90c9: 0xe00035fe, 0x90ca: 0xe00010fc, 0x90cb: 0xe00010f9, + 0x90cc: 0xe00010f6, 0x90cd: 0xe00010f3, 0x90ce: 0xe0001123, 0x90cf: 0xe0001120, + 0x90d0: 0xe00035c8, 0x90d1: 0xe00035c5, 0x90d2: 0xe00035d4, 0x90d3: 0xe00035d1, + 0x90d4: 0xe00035da, 0x90d5: 0xe00035d7, 0x90d6: 0xe0000c15, 0x90d7: 0xe0000f8d, + 0x90d8: 0xe00035ef, 0x90d9: 0xe0001111, 0x90da: 0xf0000404, 0x90db: 0xe0000f70, + 0x90dc: 0x40300420, 0x90dd: 0x40300620, 0x90de: 0xe0000f7f, 0x90df: 0x402c9620, + 0x90e0: 0xe000099b, 0x90e1: 0xe0000998, 0x90e2: 0xe0000989, 0x90e3: 0xe0000986, + 0x90e4: 0xe0000928, 0x90e5: 0xe0000924, 0x90e6: 0xe0000930, 0x90e7: 0xe000092c, + 0x90e8: 0xe0000940, 0x90e9: 0xe000093c, 0x90ea: 0xe0000938, 0x90eb: 0xe0000934, + 0x90ec: 0xe00009aa, 0x90ed: 0xe00009a6, 0x90ee: 0xe0000902, 0x90ef: 0xe00008fe, + 0x90f0: 0xe000090a, 0x90f1: 0xe0000906, 0x90f2: 0xe000091a, 0x90f3: 0xe0000916, + 0x90f4: 0xe0000912, 0x90f5: 0xe000090e, 0x90f6: 0xe00009a2, 0x90f7: 0xe000099e, + 0x90f8: 0xe0000b6e, 0x90f9: 0xe0000b6b, 0x90fa: 0xe0000b5c, 0x90fb: 0xe0000b59, + 0x90fc: 0xe0000b26, 0x90fd: 0xe0000b23, 0x90fe: 0xe0000afb, 0x90ff: 0xe0000af7, + // Block 0x244, offset 0x9100 + 0x9100: 0xe0000b03, 0x9101: 0xe0000aff, 0x9102: 0xe0000b13, 0x9103: 0xe0000b0f, + 0x9104: 0xe0000b0b, 0x9105: 0xe0000b07, 0x9106: 0xe0000b75, 0x9107: 0xe0000b71, + 0x9108: 0xe0000c66, 0x9109: 0xe0000c63, 0x910a: 0xe0000c78, 0x910b: 0xe0000c75, + 0x910c: 0xe0000e84, 0x910d: 0xe0000e81, 0x910e: 0xe0000e44, 0x910f: 0xe0000e41, + 0x9110: 0xe0000dad, 0x9111: 0xe0000da9, 0x9112: 0xe0000db5, 0x9113: 0xe0000db1, + 0x9114: 0xe0000dc5, 0x9115: 0xe0000dc1, 0x9116: 0xe000360d, 0x9117: 0xe000360a, + 0x9118: 0xe0000e8b, 0x9119: 0xe0000e87, 0x911a: 0xe0000e5d, 0x911b: 0xe0000e59, + 0x911c: 0xe0000e65, 0x911d: 0xe0000e61, 0x911e: 0xe0000e75, 0x911f: 0xe0000e71, + 0x9120: 0xe000361f, 0x9121: 0xe000361c, 0x9122: 0xe0000e7d, 0x9123: 0xe0000e79, + 0x9124: 0xe000108d, 0x9125: 0xe000108a, 0x9126: 0xe000104d, 0x9127: 0xe000104a, + 0x9128: 0xe0001066, 0x9129: 0xe0001062, 0x912a: 0xe000106e, 0x912b: 0xe000106a, + 0x912c: 0xe000107e, 0x912d: 0xe000107a, 0x912e: 0xe0001076, 0x912f: 0xe0001072, + 0x9130: 0xe0001086, 0x9131: 0xe0001082, 0x9132: 0xe0001108, 0x9133: 0xe0001105, + 0x9134: 0xe0001135, 0x9135: 0xe0001132, 0x9136: 0xe000112f, 0x9137: 0xe000112c, + 0x9138: 0xe000111d, 0x9139: 0xe000111a, 0x913a: 0xe0000d0a, 0x913b: 0xe0000d07, + 0x913c: 0x0030d888, 0x913d: 0x4030d820, 0x913e: 0x00312088, 0x913f: 0x40312020, + // Block 0x245, offset 0x9140 + 0x9140: 0xe0000024, 0x9141: 0xe0000029, 0x9142: 0xe000002e, 0x9143: 0xe0000033, + 0x9144: 0xe0000038, 0x9145: 0xe000003d, 0x9146: 0xe0000042, 0x9147: 0xe0000047, + 0x9148: 0xf0001f04, 0x9149: 0xf0001f04, 0x914a: 0xf0001f04, 0x914b: 0xf0001f04, + 0x914c: 0xf0001f04, 0x914d: 0xf0001f04, 0x914e: 0xf0001f04, 0x914f: 0xf0001f04, + 0x9150: 0xf0001f04, 0x9151: 0xf0000404, 0x9152: 0xf0000404, 0x9153: 0xf0000404, + 0x9154: 0xf0000404, 0x9155: 0xf0000404, 0x9156: 0xf0000404, 0x9157: 0xf0000404, + 0x9158: 0xf0000404, 0x9159: 0xf0000404, 0x915a: 0xf0000404, 0x915b: 0xf0000404, + 0x915c: 0xf0000404, 0x915d: 0xf0000404, 0x915e: 0xf0000404, 0x915f: 0xf0000404, + 0x9160: 0xf0000404, 0x9161: 0xf0000404, 0x9162: 0xf0000404, 0x9163: 0xf0000404, + 0x9164: 0xf0000404, 0x9165: 0xf0000404, 0x9166: 0xf0000404, 0x9167: 0xf0000404, + 0x9168: 0xf0000404, 0x9169: 0xf0000404, 0x916a: 0xf0000404, 0x916b: 0xf0000404, + 0x916c: 0xf0000404, 0x916d: 0xf0000404, 0x916e: 0xf0000404, 0x916f: 0xf0000404, + 0x9170: 0xf0000404, 0x9171: 0xf0000404, 0x9172: 0xe0002bfc, 0x9173: 0xf0000404, + 0x9174: 0xf0000404, 0x9175: 0xe0002c0c, 0x9176: 0x002bde8c, 0x9177: 0x002c0a8c, + 0x9178: 0x002c3a8c, 0x9179: 0x002c628c, 0x917a: 0x002c988c, 0x917b: 0x002d088c, + 0x917c: 0x002d228c, 0x917d: 0x002d688c, 0x917e: 0x002d9a8c, 0x917f: 0x002dcc8c, + // Block 0x246, offset 0x9180 + 0x9180: 0xf0001d1c, 0x9181: 0xf0001d1c, 0x9182: 0xf0001d1c, 0x9183: 0xf0001d1c, + 0x9184: 0xf0001d1c, 0x9185: 0xf0001d1d, 0x9186: 0xf0001d1d, 0x9187: 0xf0001d1d, + 0x9188: 0xe0000a6b, 0x9189: 0xe0000cb4, 0x918a: 0xf0001d1c, 0x918b: 0xf0001d1c, + 0x918c: 0xf0001d1c, 0x918d: 0xf0001c1c, 0x918e: 0xf0001c1c, 0x918f: 0xf0001c1c, + 0x9190: 0xe00027ce, 0x9191: 0xe0000cb9, 0x9192: 0xe0000d36, 0x9193: 0xe0000be3, + 0x9194: 0xe0000fc5, 0x9195: 0xf0001c1c, 0x9196: 0xf0001c1c, 0x9197: 0xf0001c1c, + 0x9198: 0xf0001c1c, 0x9199: 0xf0001c1c, 0x919a: 0xf0001c1c, 0x919b: 0xf0001c1c, + 0x919c: 0xf0001c1c, 0x919d: 0xf0001c1c, 0x919e: 0xf0001c1c, 0x919f: 0xe0000d3e, + 0x91a0: 0xe0000a72, 0x91a1: 0xf0001c1c, 0x91a2: 0xe0000cbd, 0x91a3: 0xe0000d42, + 0x91a4: 0xe0000a76, 0x91a5: 0xf0001c1c, 0x91a6: 0xe0000cc1, 0x91a7: 0xe0000d2d, + 0x91a8: 0xe0000d31, 0x91a9: 0xf0001c1d, 0x91aa: 0xe0000cc5, 0x91ab: 0xe0000d4a, + 0x91ac: 0xe0000be7, 0x91ad: 0xe0000f0b, 0x91ae: 0xe0000f0f, 0x91af: 0xe0000f15, + 0x91b0: 0xf0001c1c, 0x91b1: 0xf0001c1c, 0x91b2: 0xf0001c1c, 0x91b3: 0xf0001c1c, + 0x91b4: 0xf0001d1c, 0x91b5: 0xf0001d1c, 0x91b6: 0xf0001d1c, 0x91b7: 0xf0001d1c, + 0x91b8: 0xf0001d1c, 0x91b9: 0xf0001d1d, 0x91ba: 0xe0003595, 0x91bb: 0xe0003583, + 0x91bc: 0xe00035b6, 0x91bd: 0xe0003565, 0x91be: 0xe0002812, 0x91bf: 0xe0003568, + // Block 0x247, offset 0x91c0 + 0x91c0: 0xf0001d1c, 0x91c1: 0xf0001d1d, 0x91c2: 0xe00009b7, 0x91c3: 0xf0001c1d, + 0x91c4: 0xf0001c1c, 0x91c5: 0xf0001c1c, 0x91c6: 0xe0000a66, 0x91c7: 0xe0000a7a, + 0x91c8: 0xf0001d1c, 0x91c9: 0xf0001c1d, 0x91ca: 0xf0001c1c, 0x91cb: 0xf0001d1d, + 0x91cc: 0xf0001c1c, 0x91cd: 0xf0001d1d, 0x91ce: 0xf0001d1d, 0x91cf: 0xf0001c1c, + 0x91d0: 0xf0001c1c, 0x91d1: 0xf0001c1c, 0x91d2: 0xe0000d0d, 0x91d3: 0xf0001c1c, + 0x91d4: 0xf0001c1c, 0x91d5: 0xe0000d3a, 0x91d6: 0xe0000d46, 0x91d7: 0xf0001d1d, + 0x91d8: 0xe0000eb0, 0x91d9: 0xe0000eb8, 0x91da: 0xf0001d1d, 0x91db: 0xf0001c1c, + 0x91dc: 0xf0001c1d, 0x91dd: 0xe0003598, 0x91de: 0xe00010b2, 0x91df: 0xe00009c8, + 0x91e0: 0xf0001f04, 0x91e1: 0xf0001f04, 0x91e2: 0xf0001f04, 0x91e3: 0xf0001f04, + 0x91e4: 0xf0001f04, 0x91e5: 0xf0001f04, 0x91e6: 0xf0001f04, 0x91e7: 0xf0001f04, + 0x91e8: 0xf0001f04, 0x91e9: 0xf0000404, 0x91ea: 0xf0000404, 0x91eb: 0xf0000404, + 0x91ec: 0xf0000404, 0x91ed: 0xf0000404, 0x91ee: 0xf0000404, 0x91ef: 0xf0000404, + 0x91f0: 0xf0000404, 0x91f1: 0xf0000404, 0x91f2: 0xf0000404, 0x91f3: 0xf0000404, + 0x91f4: 0xf0000404, 0x91f5: 0xf0000404, 0x91f6: 0xf0000404, 0x91f7: 0xf0000404, + 0x91f8: 0xf0000404, 0x91f9: 0xf0000404, 0x91fa: 0xf0000404, 0x91fb: 0xf0000404, + 0x91fc: 0xf0000404, 0x91fd: 0xf0000404, 0x91fe: 0xf0000404, 0x91ff: 0xe0000bdf, + // Block 0x248, offset 0x9200 + 0x9200: 0xf0001f04, 0x9201: 0xf0001f04, 0x9202: 0xf0001f04, 0x9203: 0xf0001f04, + 0x9204: 0xf0001f04, 0x9205: 0xf0001f04, 0x9206: 0xf0001f04, 0x9207: 0xf0001f04, + 0x9208: 0xf0001f04, 0x9209: 0xf0001f04, 0x920a: 0xf0001f04, + 0x9210: 0xf0000a04, 0x9211: 0xf0000a04, 0x9212: 0xf0000a04, 0x9213: 0xf0000a04, + 0x9214: 0xf0000a04, 0x9215: 0xf0000a04, 0x9216: 0xf0000a04, 0x9217: 0xf0000a04, + 0x9218: 0xf0000a04, 0x9219: 0xf0000a04, 0x921a: 0xf0000a04, 0x921b: 0xf0000a04, + 0x921c: 0xf0000a04, 0x921d: 0xf0000a04, 0x921e: 0xf0000a04, 0x921f: 0xf0000a04, + 0x9220: 0xf0000a04, 0x9221: 0xf0000a04, 0x9222: 0xf0000a04, 0x9223: 0xf0000a04, + 0x9224: 0xf0000a04, 0x9225: 0xf0000a04, 0x9226: 0xe0002c00, 0x9227: 0xf0000a04, + 0x9228: 0xf0000a04, 0x9229: 0xe0002c10, 0x922a: 0xf0000a04, 0x922b: 0x002c3a8c, + 0x922c: 0x002f7a8c, 0x922d: 0xf0000c0c, 0x922e: 0xe000359e, + 0x9230: 0x002bde9d, 0x9231: 0x002c0a9d, 0x9232: 0x002c3a9d, 0x9233: 0x002c629d, + 0x9234: 0x002c989d, 0x9235: 0x002d089d, 0x9236: 0x002d229d, 0x9237: 0x002d689d, + 0x9238: 0x002d9a9d, 0x9239: 0x002dcc9d, 0x923a: 0x002dfe9d, 0x923b: 0x002e229d, + 0x923c: 0x002e829d, 0x923d: 0x002e9e9d, 0x923e: 0x002ee29d, 0x923f: 0x002f2c9d, + // Block 0x249, offset 0x9240 + 0x9240: 0x002f569d, 0x9241: 0x002f7a9d, 0x9242: 0x002fe69d, 0x9243: 0x00302c9d, + 0x9244: 0x00306c9d, 0x9245: 0x0030be9d, 0x9246: 0x0030e29d, 0x9247: 0x0030f69d, + 0x9248: 0x0031009d, 0x9249: 0x00312a9d, 0x924a: 0xf0001d1d, 0x924b: 0xf0001d1d, + 0x924c: 0xf0001d1d, 0x924d: 0xf0001d1d, 0x924e: 0xe0000ebc, 0x924f: 0xe000359b, + 0x9250: 0x002bde8c, 0x9251: 0x002c0a8c, 0x9252: 0x002c3a8c, 0x9253: 0x002c628c, + 0x9254: 0x002c988c, 0x9255: 0x002d088c, 0x9256: 0x002d228c, 0x9257: 0x002d688c, + 0x9258: 0x002d9a8c, 0x9259: 0x002dcc8c, 0x925a: 0x002dfe8c, 0x925b: 0x002e228c, + 0x925c: 0x002e828c, 0x925d: 0x002e9e8c, 0x925e: 0x002ee28c, 0x925f: 0x002f2c8c, + 0x9260: 0x002f568c, 0x9261: 0x002f7a8c, 0x9262: 0x002fe68c, 0x9263: 0x00302c8c, + 0x9264: 0x00306c8c, 0x9265: 0x0030be8c, 0x9266: 0x0030e28c, 0x9267: 0x0030f68c, + 0x9268: 0x0031008c, 0x9269: 0x00312a8c, 0x926a: 0xf0001414, 0x926b: 0xf0001414, + 0x9270: 0x002bde9d, 0x9271: 0x002c0a9d, 0x9272: 0x002c3a9d, 0x9273: 0x002c629d, + 0x9274: 0x002c989d, 0x9275: 0x002d089d, 0x9276: 0x002d229d, 0x9277: 0x002d689d, + 0x9278: 0x002d9a9d, 0x9279: 0x002dcc9d, 0x927a: 0x002dfe9d, 0x927b: 0x002e229d, + 0x927c: 0x002e829d, 0x927d: 0x002e9e9d, 0x927e: 0x002ee29d, 0x927f: 0x002f2c9d, + // Block 0x24a, offset 0x9280 + 0x9280: 0xa0000000, 0x9281: 0xa0000000, 0x9282: 0xa0000000, 0x9283: 0xa0000000, + 0x9284: 0xa0000000, 0x9286: 0x40096620, 0x9287: 0x40096a20, + 0x9288: 0x40070820, 0x9289: 0x4004f220, 0x928a: 0x4004f620, 0x928b: 0x4027e620, + 0x928c: 0x40024820, 0x928d: 0x40024a20, 0x928e: 0x40070e20, 0x928f: 0x40071020, + 0x9290: 0xae600000, 0x9291: 0xae600000, 0x9292: 0xae600000, 0x9293: 0xae600000, + 0x9294: 0xae600000, 0x9295: 0xae600000, 0x9296: 0xae600000, 0x9297: 0xae600000, + 0x9298: 0xa1e00000, 0x9299: 0xa1f00000, 0x929a: 0xa2000000, 0x929b: 0x40026420, + 0x929e: 0x40027020, 0x929f: 0x4002cc20, + 0x92a0: 0x403aa220, 0x92a1: 0x40393a20, 0x92a2: 0x40393620, 0x92a3: 0x40393a21, + 0x92a4: 0x40393a25, 0x92a5: 0x40393a23, 0x92a6: 0x00393b44, 0x92a7: 0xc5520151, + 0x92a8: 0x40393c20, 0x92a9: 0x403a8823, 0x92aa: 0x40395620, 0x92ab: 0x40395820, + 0x92ac: 0x40396420, 0x92ad: 0x40397220, 0x92ae: 0x40397420, 0x92af: 0x40398820, + 0x92b0: 0x40398a20, 0x92b1: 0x4039a420, 0x92b2: 0x4039a620, 0x92b3: 0x4039c620, + 0x92b4: 0x4039c820, 0x92b5: 0x4039dc20, 0x92b6: 0x4039de20, 0x92b7: 0x4039e620, + 0x92b8: 0x4039e820, 0x92b9: 0x4039ee20, 0x92ba: 0x4039f020, 0x92bb: 0x403a3820, + 0x92bc: 0x403a3a20, 0x92bd: 0x403a9c20, 0x92be: 0x403a9e20, 0x92bf: 0x403aa020, + // Block 0x24b, offset 0x92c0 + 0x92c0: 0xa0000000, 0x92c1: 0x4039fc20, 0x92c2: 0x403a1220, 0x92c3: 0x403a1c23, + 0x92c4: 0x403a4020, 0x92c5: 0x403a4e20, 0x92c6: 0x403a5620, 0x92c7: 0x403a8820, + 0x92c8: 0xc5560171, 0x92c9: 0xc55a0171, 0x92ca: 0xc55c0171, 0x92cb: 0xa000b002, + 0x92cc: 0xa000b202, 0x92cd: 0xa000b102, 0x92ce: 0xa1e0ad02, 0x92cf: 0xa000af02, + 0x92d0: 0xa000ae02, 0x92d1: 0xa210ba02, 0x92d2: 0xa220bc02, 0x92d3: 0xae60bd02, + 0x92d4: 0xae60be02, 0x92d5: 0xadc0bf02, 0x92d6: 0xadc0c102, 0x92d7: 0xae60c202, + 0x92d8: 0xae60c302, 0x92d9: 0xae60c402, 0x92da: 0xae60c502, 0x92db: 0xae60c602, + 0x92dc: 0xadc0c702, 0x92dd: 0xae60c802, 0x92de: 0xae60c902, 0x92df: 0xadc0c002, + 0x92e0: 0xe000015e, 0x92e1: 0xe00001e6, 0x92e2: 0xe0000301, 0x92e3: 0xe00003db, + 0x92e4: 0xe00004b6, 0x92e5: 0xe0000580, 0x92e6: 0xe000064b, 0x92e7: 0xe00006f3, + 0x92e8: 0xe000079f, 0x92e9: 0xe0000844, 0x92ea: 0x4004ee20, 0x92eb: 0x40024c20, + 0x92ec: 0x40024e20, 0x92ed: 0x4004de20, 0x92ee: 0x40393a20, 0x92ef: 0x403a1020, + 0x92f0: 0xa230d102, 0x92f1: 0x40393821, 0x92f2: 0x40393a22, 0x92f3: 0x40393a24, + 0x92f4: 0x00391c84, 0x92f5: 0xf0000404, 0x92f6: 0xf0000404, 0x92f7: 0xf0000404, + 0x92f8: 0xe0003736, 0x92f9: 0x40395a20, 0x92fa: 0x40395c20, 0x92fb: 0x40393e20, + 0x92fc: 0x40395e20, 0x92fd: 0x40396020, 0x92fe: 0x40394020, 0x92ff: 0x40396220, + // Block 0x24c, offset 0x9300 + 0x9300: 0x40394220, 0x9301: 0x40397620, 0x9302: 0x40397820, 0x9303: 0x40396620, + 0x9304: 0x40396820, 0x9305: 0x40397a20, 0x9306: 0x40396a20, 0x9307: 0x40396e20, + 0x9308: 0x40398c20, 0x9309: 0x40398e20, 0x930a: 0x40399020, 0x930b: 0x40399220, + 0x930c: 0x40399420, 0x930d: 0x40399620, 0x930e: 0x40399820, 0x930f: 0x40399a20, + 0x9310: 0x40399c20, 0x9311: 0x4039a820, 0x9312: 0x4039aa20, 0x9313: 0x4039ac20, + 0x9314: 0x4039ae20, 0x9315: 0x4039b020, 0x9316: 0x4039b220, 0x9317: 0x4039b420, + 0x9318: 0x4039b620, 0x9319: 0x4039b820, 0x931a: 0x4039ca20, 0x931b: 0x4039cc20, + 0x931c: 0x4039ce20, 0x931d: 0x4039e020, 0x931e: 0x4039e220, 0x931f: 0x4039ea20, + 0x9320: 0x4039f220, 0x9321: 0x4039fe20, 0x9322: 0x403a0020, 0x9323: 0x403a0220, + 0x9324: 0x403a0420, 0x9325: 0x403a0820, 0x9326: 0x403a0a20, 0x9327: 0x403a1420, + 0x9328: 0x403a1620, 0x9329: 0x403a1c20, 0x932a: 0x403a1c21, 0x932b: 0x403a1c22, + 0x932c: 0x403a1c24, 0x932d: 0x403a1c25, 0x932e: 0x403a1c26, 0x932f: 0x403a2a20, + 0x9330: 0x403a2c20, 0x9331: 0x403a2e20, 0x9332: 0x403a3020, 0x9333: 0x403a3220, + 0x9334: 0x403a3420, 0x9335: 0x403a4220, 0x9336: 0x403a4420, 0x9337: 0x403a4620, + 0x9338: 0x403a4820, 0x9339: 0x403a6020, 0x933a: 0x403a5820, 0x933b: 0x403a5a20, + 0x933c: 0x403a5c20, 0x933d: 0x403a5e20, 0x933e: 0x403a8826, 0x933f: 0x40396c20, + // Block 0x24d, offset 0x9340 + 0x9340: 0x403a8825, 0x9341: 0x403a8822, 0x9342: 0xe000372d, 0x9343: 0x403a8824, + 0x9344: 0x403a7620, 0x9345: 0x403a7820, 0x9346: 0x403a7a20, 0x9347: 0x403a7c20, + 0x9348: 0x403a7e20, 0x9349: 0x403a8020, 0x934a: 0x403a8220, 0x934b: 0x403a8420, + 0x934c: 0xc5580171, 0x934d: 0x403a9226, 0x934e: 0x403a9227, 0x934f: 0x403a8620, + 0x9350: 0x403a9224, 0x9351: 0x403a9225, 0x9352: 0x403a9222, 0x9353: 0xe000376c, + 0x9354: 0x4002e820, 0x9355: 0xc55e0171, 0x9356: 0xae600000, 0x9357: 0xae600000, + 0x9358: 0xae600000, 0x9359: 0xae600000, 0x935a: 0xae600000, 0x935b: 0xae600000, + 0x935c: 0xae600000, 0x935d: 0xa0000000, 0x935e: 0x40071220, 0x935f: 0xae600000, + 0x9360: 0xae600000, 0x9361: 0xae600000, 0x9362: 0xae600000, 0x9363: 0xadc00000, + 0x9364: 0xae600000, 0x9365: 0x003a7484, 0x9366: 0x003a9084, 0x9367: 0xae600000, + 0x9368: 0xae600000, 0x9369: 0x40071420, 0x936a: 0xadc00000, 0x936b: 0xae600000, + 0x936c: 0xae600000, 0x936d: 0xadc00000, 0x936e: 0x40399e20, 0x936f: 0x4039ba20, + 0x9370: 0xe0000161, 0x9371: 0xe00001e9, 0x9372: 0xe0000304, 0x9373: 0xe00003de, + 0x9374: 0xe00004b9, 0x9375: 0xe0000583, 0x9376: 0xe000064e, 0x9377: 0xe00006f6, + 0x9378: 0xe00007a2, 0x9379: 0xe0000847, 0x937a: 0x4039d020, 0x937b: 0x4039e420, + 0x937c: 0x4039f420, 0x937d: 0xe0001553, 0x937e: 0xe0001779, 0x937f: 0x403a7020, + // Block 0x24e, offset 0x9380 + 0x9380: 0x00396e97, 0x9381: 0x00396e98, 0x9382: 0x0039969a, 0x9383: 0x00399699, + 0x9384: 0x0039949a, 0x9385: 0x00399499, 0x9386: 0x0039989a, 0x9387: 0x00399899, + 0x9388: 0x00398c9a, 0x9389: 0x00398c99, 0x938a: 0x0039b69a, 0x938b: 0x0039b699, + 0x938c: 0x0039a89a, 0x938d: 0x0039a899, 0x938e: 0x003a1c9a, 0x938f: 0x003a1c99, + 0x9390: 0x003a1c97, 0x9391: 0x003a1c98, 0x9392: 0x003a2a9a, 0x9393: 0x003a2a99, + 0x9394: 0x003a2a97, 0x9395: 0x003a2a98, 0x9396: 0x003a329a, 0x9397: 0x003a3299, + 0x9398: 0x003a3297, 0x9399: 0x003a3298, 0x939a: 0x003a2e9a, 0x939b: 0x003a2e99, + 0x939c: 0x003a2e97, 0x939d: 0x003a2e98, 0x939e: 0x003a589a, 0x939f: 0x003a5899, + 0x93a0: 0x003a5a9a, 0x93a1: 0x003a5a99, 0x93a2: 0x003a5a97, 0x93a3: 0x003a5a98, + 0x93a4: 0xe000372a, 0x93a5: 0xe0003727, 0x93a6: 0x003a6c9a, 0x93a7: 0x003a6c99, + 0x93a8: 0x003a6c97, 0x93a9: 0x003a6c98, 0x93aa: 0x003a6a9a, 0x93ab: 0x003a6a99, + 0x93ac: 0x003a6a97, 0x93ad: 0x003a6a98, 0x93ae: 0x003aaa9a, 0x93af: 0x003aaa99, + 0x93b0: 0xe0003772, 0x93b1: 0xe000376f, 0x93b2: 0x40071820, 0x93b3: 0x40071a20, + 0x93b4: 0x40071c20, 0x93b5: 0x40071e20, 0x93b6: 0x40072020, 0x93b7: 0x40072220, + 0x93b8: 0x40072420, 0x93b9: 0x40072620, 0x93ba: 0x40072820, 0x93bb: 0x40072a20, + 0x93bc: 0x40072c20, 0x93bd: 0x40072e20, 0x93be: 0x40073020, 0x93bf: 0x40073220, + // Block 0x24f, offset 0x93c0 + 0x93c0: 0xe000155f, 0x93c1: 0xe0001565, 0x93c2: 0xe000157a, 0x93c3: 0xe00015b0, + 0x93c4: 0xe00015b6, 0x93c5: 0xf0001a1a, 0x93c6: 0xf0001a1a, 0x93c7: 0xf0001a1a, + 0x93c8: 0xf0001a1a, 0x93c9: 0xe0002894, 0x93ca: 0xe000365b, 0x93cb: 0xf0001a1a, + 0x93cc: 0xf0001a1a, 0x93cd: 0xf0001a1a, 0x93ce: 0xf0001a1a, 0x93cf: 0xe000289a, + 0x93d0: 0xe0003667, 0x93d1: 0xf0001a1a, 0x93d2: 0xf0001a1a, 0x93d3: 0xe00028a0, + 0x93d4: 0xe0003670, 0x93d5: 0xf0001a1a, 0x93d6: 0xf0001a1a, 0x93d7: 0xf0001a1a, + 0x93d8: 0xf0001a1a, 0x93d9: 0xf0001a1a, 0x93da: 0xf0001a1a, 0x93db: 0xf0001a1a, + 0x93dc: 0xf0001a1a, 0x93dd: 0xf0001a1a, 0x93de: 0xf0001a1a, 0x93df: 0xf0001a1a, + 0x93e0: 0xf0001a1a, 0x93e1: 0xf0001a1a, 0x93e2: 0xf0001a1a, 0x93e3: 0xf0001a1a, + 0x93e4: 0xf0001a1a, 0x93e5: 0xf0001a1a, 0x93e6: 0xf0001a1a, 0x93e7: 0xf0001a1a, + 0x93e8: 0xf0001a1a, 0x93e9: 0xf0001a1a, 0x93ea: 0xf0001a1a, 0x93eb: 0xf0001a1a, + 0x93ec: 0xf0001a1a, 0x93ed: 0xf0001a1a, 0x93ee: 0xf0001a1a, 0x93ef: 0xf0001a1a, + 0x93f0: 0xf0001a1a, 0x93f1: 0xe00028e2, 0x93f2: 0xe00036be, 0x93f3: 0xf0001a1a, + 0x93f4: 0xf0001a1a, 0x93f5: 0xe00028e8, 0x93f6: 0xe00036c4, 0x93f7: 0xe00036ca, + 0x93f8: 0xe00036d0, 0x93f9: 0xe00036d6, 0x93fa: 0xe00036dc, 0x93fb: 0xe00036e8, + 0x93fc: 0xe00036f4, 0x93fd: 0xe00028ee, 0x93fe: 0xe00036fa, 0x93ff: 0xf0001a1a, + // Block 0x250, offset 0x9400 + 0x9400: 0xf0001a1a, 0x9401: 0xf0001a1a, 0x9402: 0xf0001a1a, 0x9403: 0xe00028f4, + 0x9404: 0xe0003703, 0x9405: 0xf0001a1a, 0x9406: 0xf0001a1a, 0x9407: 0xf0001a1a, + 0x9408: 0xf0001a1a, 0x9409: 0xe00028f7, 0x940a: 0xe0003706, 0x940b: 0xf0001a1a, + 0x940c: 0xf0001a1a, 0x940d: 0xf0001a1a, 0x940e: 0xf0001a1a, 0x940f: 0xe00028fd, + 0x9410: 0xe0003712, 0x9411: 0xe000371b, 0x9412: 0xe0003721, 0x9413: 0xe0002900, + 0x9414: 0xe0003724, 0x9415: 0xe000373c, 0x9416: 0xe0003742, 0x9417: 0xe0003748, + 0x9418: 0xe000375a, 0x9419: 0xe0002906, 0x941a: 0xe0003769, 0x941b: 0xf0001a1a, + 0x941c: 0xf0001a1a, 0x941d: 0xe0003733, 0x941e: 0xe0000003, 0x941f: 0xe0000006, + 0x9420: 0xe0000009, 0x9421: 0xe000000c, 0x9422: 0xe000000f, 0x9423: 0xe0000012, + 0x9424: 0xe000156b, 0x9425: 0xe000156e, 0x9426: 0xe0001577, 0x9427: 0xe000157d, + 0x9428: 0xe00015aa, 0x9429: 0xe00015b3, 0x942a: 0xf0001919, 0x942b: 0xf0001919, + 0x942c: 0xf0001919, 0x942d: 0xf0001919, 0x942e: 0xe0002891, 0x942f: 0xe0003658, + 0x9430: 0xf0001919, 0x9431: 0xf0001919, 0x9432: 0xf0001919, 0x9433: 0xf0001919, + 0x9434: 0xe0002897, 0x9435: 0xe0003664, 0x9436: 0xf0001919, 0x9437: 0xf0001919, + 0x9438: 0xf0001919, 0x9439: 0xf0001919, 0x943a: 0xe000289d, 0x943b: 0xe000366d, + 0x943c: 0xe00028df, 0x943d: 0xe00036bb, 0x943e: 0xe00028e5, 0x943f: 0xe00036c1, + // Block 0x251, offset 0x9440 + 0x9440: 0xe00036c7, 0x9441: 0xe00036e5, 0x9442: 0xe00036f1, 0x9443: 0xe00028eb, + 0x9444: 0xe00036f7, 0x9445: 0xf0001919, 0x9446: 0xe00028f1, 0x9447: 0xe0003700, + 0x9448: 0xf0001919, 0x9449: 0xf0001919, 0x944a: 0xf0001919, 0x944b: 0xf0001919, + 0x944c: 0xf0001919, 0x944d: 0xf0001919, 0x944e: 0xe00028fa, 0x944f: 0xe000370f, + 0x9450: 0xe0003730, 0x9451: 0xe000374b, 0x9452: 0xe000374e, 0x9453: 0xe0003757, + 0x9454: 0xe000375d, 0x9455: 0xe0002903, 0x9456: 0xe0003766, 0x9457: 0xe000155c, + 0x9458: 0xe0001562, 0x9459: 0xe0001568, 0x945a: 0xe0001571, 0x945b: 0xe0001580, + 0x945c: 0xf0001717, 0x945d: 0xf0001717, 0x945e: 0xf0001717, 0x945f: 0xf0001717, + 0x9460: 0xe0003652, 0x9461: 0xf0001717, 0x9462: 0xf0001717, 0x9463: 0xf0001717, + 0x9464: 0xf0001717, 0x9465: 0xe000365e, 0x9466: 0xf0001717, 0x9467: 0xf0001717, + 0x9468: 0xf0001717, 0x9469: 0xf0001717, 0x946a: 0xf0001717, 0x946b: 0xf0001717, + 0x946c: 0xf0001717, 0x946d: 0xf0001717, 0x946e: 0xf0001717, 0x946f: 0xf0001717, + 0x9470: 0xf0001717, 0x9471: 0xf0001717, 0x9472: 0xf0001717, 0x9473: 0xf0001717, + 0x9474: 0xf0001717, 0x9475: 0xf0001717, 0x9476: 0xf0001717, 0x9477: 0xf0001717, + 0x9478: 0xf0001717, 0x9479: 0xf0001717, 0x947a: 0xf0001717, 0x947b: 0xf0001717, + 0x947c: 0xf0001717, 0x947d: 0xf0001717, 0x947e: 0xf0001717, 0x947f: 0xf0001717, + // Block 0x252, offset 0x9480 + 0x9480: 0xf0001717, 0x9481: 0xf0001717, 0x9482: 0xf0001717, 0x9483: 0xf0001717, + 0x9484: 0xe00036cd, 0x9485: 0xe00036d3, 0x9486: 0xe00036d9, 0x9487: 0xe00036df, + 0x9488: 0xe00036eb, 0x9489: 0xf0001717, 0x948a: 0xf0001717, 0x948b: 0xf0001717, + 0x948c: 0xf0001717, 0x948d: 0xe00036fd, 0x948e: 0xf0001717, 0x948f: 0xf0001717, + 0x9490: 0xf0001717, 0x9491: 0xf0001717, 0x9492: 0xf0001717, 0x9493: 0xf0001717, + 0x9494: 0xf0001717, 0x9495: 0xf0001717, 0x9496: 0xe0003709, 0x9497: 0xe0003718, + 0x9498: 0xe000371e, 0x9499: 0xe0003715, 0x949a: 0xe0003739, 0x949b: 0xe000373f, + 0x949c: 0xe0003745, 0x949d: 0xe0003751, 0x949e: 0xe0003760, 0x949f: 0xe0001574, + 0x94a0: 0xe0001583, 0x94a1: 0xf0001818, 0x94a2: 0xe0003655, 0x94a3: 0xf0001818, + 0x94a4: 0xe0003661, 0x94a5: 0xf0001818, 0x94a6: 0xe000366a, 0x94a7: 0xf0001818, + 0x94a8: 0xe0003688, 0x94a9: 0xf0001818, 0x94aa: 0xe0003694, 0x94ab: 0xe00036e2, + 0x94ac: 0xe00036ee, 0x94ad: 0xf0001818, 0x94ae: 0xf0001818, 0x94af: 0xe000370c, + 0x94b0: 0xe0003754, 0x94b1: 0xe0003763, 0x94b2: 0xf0001818, 0x94b3: 0xe0003646, + 0x94b4: 0xe0003649, 0x94b5: 0xe00028d0, 0x94b6: 0xe00036ac, 0x94b7: 0xe00028d6, + 0x94b8: 0xe00036b2, 0x94b9: 0xe00028dc, 0x94ba: 0xe00036b8, 0x94bb: 0xe00028b8, + 0x94bc: 0xe000368e, 0x94bd: 0xe00028be, 0x94be: 0xe000369a, 0x94bf: 0xe00028ac, + // Block 0x253, offset 0x94c0 + 0x94c0: 0xe000367c, 0x94c1: 0xe00028a6, 0x94c2: 0xe0003676, 0x94c3: 0xe00028b2, + 0x94c4: 0xe0003682, 0x94c5: 0xe00028c4, 0x94c6: 0xe00036a0, 0x94c7: 0xe00028ca, + 0x94c8: 0xe00036a6, 0x94c9: 0xf0001a1a, 0x94ca: 0xf0001a1a, 0x94cb: 0xf0001a1a, + 0x94cc: 0xf0001a1a, 0x94cd: 0xf0001a1a, 0x94ce: 0xf0001a1a, 0x94cf: 0xf0001a1a, + 0x94d0: 0xf0001a1a, 0x94d1: 0xe00028cd, 0x94d2: 0xe00036a9, 0x94d3: 0xe00028d3, + 0x94d4: 0xe00036af, 0x94d5: 0xe00028d9, 0x94d6: 0xe00036b5, 0x94d7: 0xe00028b5, + 0x94d8: 0xe000368b, 0x94d9: 0xe00028bb, 0x94da: 0xe0003697, 0x94db: 0xe00028a9, + 0x94dc: 0xe0003679, 0x94dd: 0xe00028a3, 0x94de: 0xe0003673, 0x94df: 0xe00028af, + 0x94e0: 0xe000367f, 0x94e1: 0xe00028c1, 0x94e2: 0xe000369d, 0x94e3: 0xe00028c7, + 0x94e4: 0xe00036a3, 0x94e5: 0xf0001919, 0x94e6: 0xf0001919, 0x94e7: 0xf0001919, + 0x94e8: 0xf0001919, 0x94e9: 0xf0001919, 0x94ea: 0xf0001919, 0x94eb: 0xf0001919, + 0x94ec: 0xf0001919, 0x94ed: 0xf0001717, 0x94ee: 0xf0001717, 0x94ef: 0xf0001717, + 0x94f0: 0xf0001717, 0x94f1: 0xe0003685, 0x94f2: 0xe0003691, 0x94f3: 0xf0001717, + 0x94f4: 0xf0001818, 0x94f5: 0xf0001818, 0x94f6: 0xf0001818, 0x94f7: 0xf0001818, + 0x94f8: 0xf0001818, 0x94f9: 0xf0001818, 0x94fa: 0xf0001818, 0x94fb: 0xf0001818, + 0x94fc: 0xe000364c, 0x94fd: 0xe000364f, 0x94fe: 0x4004c020, 0x94ff: 0x4004c220, + // Block 0x254, offset 0x9500 + 0x9500: 0xa0000000, 0x9501: 0xa0000000, 0x9502: 0xa0000000, 0x9503: 0xa0000000, + 0x9504: 0xa0000000, 0x9505: 0xa0000000, 0x9506: 0xa0000000, 0x9507: 0xa0000000, + 0x9508: 0xa0000000, 0x9509: 0x40020020, 0x950a: 0x40020220, 0x950b: 0x40020420, + 0x950c: 0x40020620, 0x950d: 0x40020820, 0x950e: 0xa0000000, 0x950f: 0xa0000000, + 0x9510: 0xa0000000, 0x9511: 0xa0000000, 0x9512: 0xa0000000, 0x9513: 0xa0000000, + 0x9514: 0xa0000000, 0x9515: 0xa0000000, 0x9516: 0xa0000000, 0x9517: 0xa0000000, + 0x9518: 0xa0000000, 0x9519: 0xa0000000, 0x951a: 0xa0000000, 0x951b: 0xa0000000, + 0x951c: 0xa0000000, 0x951d: 0xa0000000, 0x951e: 0xa0000000, 0x951f: 0xa0000000, + 0x9520: 0x40021220, 0x9521: 0x4002ba20, 0x9522: 0x4003e020, 0x9523: 0x4004ea20, + 0x9524: 0x4027de20, 0x9525: 0x4004ec20, 0x9526: 0x4004e620, 0x9527: 0x4003d220, + 0x9528: 0x4003f420, 0x9529: 0x4003f620, 0x952a: 0x4004d820, 0x952b: 0x40093820, + 0x952c: 0x40024020, 0x952d: 0x40021a20, 0x952e: 0x4002e420, 0x952f: 0x4004e220, + 0x9530: 0x4029cc20, 0x9531: 0x4029ce20, 0x9532: 0x4029d020, 0x9533: 0x4029d220, + 0x9534: 0x4029d420, 0x9535: 0x4029d620, 0x9536: 0x4029d820, 0x9537: 0x4029da20, + 0x9538: 0x4029dc20, 0x9539: 0x4029de20, 0x953a: 0x40026c20, 0x953b: 0x40026220, + 0x953c: 0x40094020, 0x953d: 0x40094220, 0x953e: 0x40094420, 0x953f: 0x4002c420, + // Block 0x255, offset 0x9540 + 0x9540: 0x4004d620, 0x9541: 0xc56727b1, 0x9542: 0x002c0a88, 0x9543: 0x002c3a88, + 0x9544: 0x002c6288, 0x9545: 0x002c9888, 0x9546: 0x002d0888, 0x9547: 0x002d2288, + 0x9548: 0x002d6888, 0x9549: 0x002d9a88, 0x954a: 0x002dcc88, 0x954b: 0x002dfe88, + 0x954c: 0xc0030002, 0x954d: 0x002e8288, 0x954e: 0x002e9e88, 0x954f: 0xc56c0071, + 0x9550: 0x002f2c88, 0x9551: 0x002f5688, 0x9552: 0x002f7a88, 0x9553: 0x002fe688, + 0x9554: 0x00302c88, 0x9555: 0xc5620071, 0x9556: 0x0030be88, 0x9557: 0x0030e288, + 0x9558: 0x0030f688, 0x9559: 0x00310088, 0x955a: 0x00312a88, 0x955b: 0x4003f820, + 0x955c: 0x4004e420, 0x955d: 0x4003fa20, 0x955e: 0x40062420, 0x955f: 0x40021620, + 0x9560: 0x40061e20, 0x9561: 0xc56427b1, 0x9562: 0x402c0a20, 0x9563: 0x402c3a20, + 0x9564: 0x402c6220, 0x9565: 0x402c9820, 0x9566: 0x402d0820, 0x9567: 0x402d2220, + 0x9568: 0x402d6820, 0x9569: 0x402d9a20, 0x956a: 0x402dcc20, 0x956b: 0x402dfe20, + 0x956c: 0xc0000002, 0x956d: 0x402e8220, 0x956e: 0x402e9e20, 0x956f: 0xc56a0071, + 0x9570: 0x402f2c20, 0x9571: 0x402f5620, 0x9572: 0x402f7a20, 0x9573: 0x402fe620, + 0x9574: 0x40302c20, 0x9575: 0xc5600071, 0x9576: 0x4030be20, 0x9577: 0x4030e220, + 0x9578: 0x4030f620, 0x9579: 0x40310020, 0x957a: 0x40312a20, 0x957b: 0x4003fc20, + 0x957c: 0x40094820, 0x957d: 0x4003fe20, 0x957e: 0x40094c20, 0x957f: 0xa0000000, + // Block 0x256, offset 0x9580 + 0x9580: 0xe00008f5, 0x9581: 0xe00008ef, 0x9582: 0xe0000921, 0x9583: 0xe0000969, + 0x9584: 0x00320e83, 0x9585: 0x00320c83, 0x9586: 0x00320ea3, 0x9587: 0xe0000a53, + 0x9588: 0xe0000ae8, 0x9589: 0xe0000ae2, 0x958a: 0xe0000af4, 0x958b: 0xe0000b20, + 0x958c: 0xe0000c2b, 0x958d: 0xe0000c25, 0x958e: 0xe0000c37, 0x958f: 0xe0000c43, + 0x9590: 0xe0000ab3, 0x9591: 0xe0000d63, 0x9592: 0xe0000d9a, 0x9593: 0xe0000d94, + 0x9594: 0xe0000da6, 0x9595: 0xe0000de6, 0x9596: 0x00321083, 0x9597: 0x40093e20, + 0x9598: 0x003210a3, 0x9599: 0xe0000fe1, 0x959a: 0xe0000fdb, 0x959b: 0xe0000fed, + 0x959c: 0x003100a3, 0x959d: 0xe0001102, 0x959e: 0x00318888, 0x959f: 0xe0000f7b, + 0x95a0: 0xe00008f2, 0x95a1: 0xe00008ec, 0x95a2: 0xe000091e, 0x95a3: 0xe0000966, + 0x95a4: 0x40320e20, 0x95a5: 0x40320c20, 0x95a6: 0x40320e21, 0x95a7: 0xe0000a4d, + 0x95a8: 0xe0000ae5, 0x95a9: 0xe0000adf, 0x95aa: 0xe0000af1, 0x95ab: 0xe0000b1d, + 0x95ac: 0xe0000c28, 0x95ad: 0xe0000c22, 0x95ae: 0xe0000c34, 0x95af: 0xe0000c40, + 0x95b0: 0xe0000aad, 0x95b1: 0xe0000d60, 0x95b2: 0xe0000d97, 0x95b3: 0xe0000d91, + 0x95b4: 0xe0000da3, 0x95b5: 0xe0000de3, 0x95b6: 0x40321020, 0x95b7: 0x40093c20, + 0x95b8: 0x40321021, 0x95b9: 0xe0000fde, 0x95ba: 0xe0000fd8, 0x95bb: 0xe0000fea, + 0x95bc: 0x40310021, 0x95bd: 0xe00010ff, 0x95be: 0x40318820, 0x95bf: 0xe0001114, + // Block 0x257, offset 0x95c0 + 0x95c0: 0xe0000983, 0x95c1: 0xe0000980, 0x95c2: 0xe00008fb, 0x95c3: 0xe00008f8, + 0x95c4: 0xe000097d, 0x95c5: 0xe000097a, 0x95c6: 0xe0000a38, 0x95c7: 0xe0000a35, + 0x95c8: 0xe0000a3e, 0x95c9: 0xe0000a3b, 0x95ca: 0xe0000a4a, 0x95cb: 0xe0000a47, + 0x95cc: 0xe0000a44, 0x95cd: 0xe0000a41, 0x95ce: 0xe0000a86, 0x95cf: 0xe0000a83, + 0x95d0: 0xe0003778, 0x95d1: 0xe0003775, 0x95d2: 0xe0000b46, 0x95d3: 0xe0000b43, + 0x95d4: 0xe0000aee, 0x95d5: 0xe0000aeb, 0x95d6: 0xe0000b2c, 0x95d7: 0xe0000b29, + 0x95d8: 0xe0000b40, 0x95d9: 0xe0000b3d, 0x95da: 0xe0000b1a, 0x95db: 0xe0000b17, + 0x95dc: 0xe0000bb8, 0x95dd: 0xe0000bb5, 0x95de: 0xe0000bb2, 0x95df: 0xe0000baf, + 0x95e0: 0xe0000bc4, 0x95e1: 0xe0000bc1, 0x95e2: 0xe0000bca, 0x95e3: 0xe0000bc7, + 0x95e4: 0xe0000bee, 0x95e5: 0xe0000beb, 0x95e6: 0xe0000c1b, 0x95e7: 0xe0000c18, + 0x95e8: 0xe0000c51, 0x95e9: 0xe0000c4e, 0x95ea: 0xe0000c60, 0x95eb: 0xe0000c5d, + 0x95ec: 0xe0000c31, 0x95ed: 0xe0000c2e, 0x95ee: 0xe0000c5a, 0x95ef: 0xe0000c57, + 0x95f0: 0xe0000c54, 0x95f1: 0x402da220, 0x95f2: 0xf0000a0a, 0x95f3: 0xf0000404, + 0x95f4: 0xe0000c8a, 0x95f5: 0xe0000c87, 0x95f6: 0xe0000c9f, 0x95f7: 0xe0000c9c, + 0x95f8: 0x402f7220, 0x95f9: 0xe0000ccc, 0x95fa: 0xe0000cc9, 0x95fb: 0xe0000cd8, + 0x95fc: 0xe0000cd5, 0x95fd: 0xe0000cd2, 0x95fe: 0xe0000ccf, 0x95ff: 0xe0000d04, + // Block 0x258, offset 0x9600 + 0x9600: 0xe0000cfe, 0x9601: 0xe0000cf8, 0x9602: 0xe0000cf5, 0x9603: 0xe0000d51, + 0x9604: 0xe0000d4e, 0x9605: 0xe0000d6f, 0x9606: 0xe0000d6c, 0x9607: 0xe0000d5d, + 0x9608: 0xe0000d5a, 0x9609: 0xf0000404, 0x960a: 0xe0003784, 0x960b: 0xe0003781, + 0x960c: 0xe0000e2e, 0x960d: 0xe0000e2b, 0x960e: 0xe0000da0, 0x960f: 0xe0000d9d, + 0x9610: 0xe0000de0, 0x9611: 0xe0000ddd, 0x9612: 0xe0000e93, 0x9613: 0xe0000e8f, + 0x9614: 0xe0000eca, 0x9615: 0xe0000ec7, 0x9616: 0xe0000edc, 0x9617: 0xe0000ed9, + 0x9618: 0xe0000ed0, 0x9619: 0xe0000ecd, 0x961a: 0xe0000f1f, 0x961b: 0xe0000f1c, + 0x961c: 0xe0000f2d, 0x961d: 0xe0000f2a, 0x961e: 0xe0000f47, 0x961f: 0xe0000f44, + 0x9620: 0xe0000f33, 0x9621: 0xe0000f30, 0x9622: 0xe0000f99, 0x9623: 0xe0000f96, + 0x9624: 0xe0000f8a, 0x9625: 0xe0000f87, 0x9626: 0xe000378a, 0x9627: 0xe0003787, + 0x9628: 0xe000102b, 0x9629: 0xe0001028, 0x962a: 0xe000103f, 0x962b: 0xe000103c, + 0x962c: 0xe0000fe7, 0x962d: 0xe0000fe4, 0x962e: 0xe0000ff9, 0x962f: 0xe0000ff6, + 0x9630: 0xe0001025, 0x9631: 0xe0001022, 0x9632: 0xe0001039, 0x9633: 0xe0001036, + 0x9634: 0xe00010d8, 0x9635: 0xe00010d5, 0x9636: 0xe000110e, 0x9637: 0xe000110b, + 0x9638: 0xe0001117, 0x9639: 0xe000113b, 0x963a: 0xe0001138, 0x963b: 0xe000114d, + 0x963c: 0xe000114a, 0x963d: 0xe0001147, 0x963e: 0xe0001144, 0x963f: 0xe0000f64, + // Block 0x259, offset 0x9640 + 0x9640: 0x402c1a20, 0x9641: 0x002c2a88, 0x9642: 0x002c3288, 0x9643: 0x402c3220, + 0x9644: 0x0031c488, 0x9645: 0x4031c420, 0x9646: 0x002efa88, 0x9647: 0x002c4e88, + 0x9648: 0x402c4e20, 0x9649: 0x002c7288, 0x964a: 0x002c7a88, 0x964b: 0x002c8488, + 0x964c: 0x402c8420, 0x964d: 0xe000115c, 0x964e: 0x002cae88, 0x964f: 0x002cb888, + 0x9650: 0x002cc288, 0x9651: 0x002d1688, 0x9652: 0x402d1620, 0x9653: 0x002d4488, + 0x9654: 0x002d5888, 0x9655: 0x402d7820, 0x9656: 0x002dc288, 0x9657: 0x002db688, + 0x9658: 0x002e0a88, 0x9659: 0x402e0a20, 0x965a: 0x402e3820, 0x965b: 0x402e7220, + 0x965c: 0x0030a088, 0x965d: 0x002eb488, 0x965e: 0x402ebc20, 0x965f: 0x002f1088, + 0x9660: 0xe0000e56, 0x9661: 0xe0000e53, 0x9662: 0x002d6088, 0x9663: 0x402d6020, + 0x9664: 0x002f3e88, 0x9665: 0x402f3e20, 0x9666: 0x002f8288, 0x9667: 0x0031b488, + 0x9668: 0x4031b420, 0x9669: 0x00300888, 0x966a: 0x40301220, 0x966b: 0x40304220, + 0x966c: 0x00304a88, 0x966d: 0x40304a20, 0x966e: 0x00305288, 0x966f: 0xe000105f, + 0x9670: 0xe000105c, 0x9671: 0x0030b488, 0x9672: 0x0030cc88, 0x9673: 0x00311888, + 0x9674: 0x40311820, 0x9675: 0x00313488, 0x9676: 0x40313420, 0x9677: 0xe0003790, + 0x9678: 0x00316e88, 0x9679: 0x40316e20, 0x967a: 0x40317820, 0x967b: 0x4031a620, + 0x967c: 0x0031bc88, 0x967d: 0x4031bc20, 0x967e: 0xe0000fc9, 0x967f: 0x40319420, + // Block 0x25a, offset 0x9680 + 0x9680: 0x40321220, 0x9681: 0x40321a20, 0x9682: 0x40322220, 0x9683: 0x40322a20, + 0x9684: 0xe0000ad5, 0x9685: 0xe0000ad1, 0x9686: 0xe0000acd, 0x9687: 0xf0000a0a, + 0x9688: 0xf000040a, 0x9689: 0xf0000404, 0x968a: 0xf0000a0a, 0x968b: 0xf000040a, + 0x968c: 0xf0000404, 0x968d: 0xe0000947, 0x968e: 0xe0000944, 0x968f: 0xe0000c3d, + 0x9690: 0xe0000c3a, 0x9691: 0xe0000dcc, 0x9692: 0xe0000dc9, 0x9693: 0xe0000ff3, + 0x9694: 0xe0000ff0, 0x9695: 0xe000298b, 0x9696: 0xe0002988, 0x9697: 0xe0002979, + 0x9698: 0xe0002976, 0x9699: 0xe0002985, 0x969a: 0xe0002982, 0x969b: 0xe000297f, + 0x969c: 0xe000297c, 0x969d: 0x402cae20, 0x969e: 0xe000379e, 0x969f: 0xe000379b, + 0x96a0: 0xe0000976, 0x96a1: 0xe0000972, 0x96a2: 0xe00029af, 0x96a3: 0xe00029ac, + 0x96a4: 0xe000377e, 0x96a5: 0xe000377b, 0x96a6: 0xe0000bbe, 0x96a7: 0xe0000bbb, + 0x96a8: 0xe0000c99, 0x96a9: 0xe0000c96, 0x96aa: 0xe0000e20, 0x96ab: 0xe0000e1d, + 0x96ac: 0xe0000e27, 0x96ad: 0xe0000e23, 0x96ae: 0xe0003797, 0x96af: 0xe0003793, + 0x96b0: 0xe0000c8d, 0x96b1: 0xf0000a0a, 0x96b2: 0xf000040a, 0x96b3: 0xf0000404, + 0x96b4: 0xe0000bac, 0x96b5: 0xe0000ba9, 0x96b6: 0x002d7888, 0x96b7: 0x00319488, + 0x96b8: 0xe0000d57, 0x96b9: 0xe0000d54, 0x96ba: 0xe0002991, 0x96bb: 0xe000298e, + 0x96bc: 0xe00037a4, 0x96bd: 0xe00037a1, 0x96be: 0xe00037b6, 0x96bf: 0xe00037b3, + // Block 0x25b, offset 0x96c0 + 0x96c0: 0xe000098f, 0x96c1: 0xe000098c, 0x96c2: 0xe0000995, 0x96c3: 0xe0000992, + 0x96c4: 0xe0000b62, 0x96c5: 0xe0000b5f, 0x96c6: 0xe0000b68, 0x96c7: 0xe0000b65, + 0x96c8: 0xe0000c6c, 0x96c9: 0xe0000c69, 0x96ca: 0xe0000c72, 0x96cb: 0xe0000c6f, + 0x96cc: 0xe0000e4a, 0x96cd: 0xe0000e47, 0x96ce: 0xe0000e50, 0x96cf: 0xe0000e4d, + 0x96d0: 0xe0000ee8, 0x96d1: 0xe0000ee5, 0x96d2: 0xe0000eee, 0x96d3: 0xe0000eeb, + 0x96d4: 0xe0001053, 0x96d5: 0xe0001050, 0x96d6: 0xe0001059, 0x96d7: 0xe0001056, + 0x96d8: 0xe0000f61, 0x96d9: 0xe0000f5e, 0x96da: 0xe0000fa5, 0x96db: 0xe0000fa2, + 0x96dc: 0x00312288, 0x96dd: 0x40312220, 0x96de: 0xe0000bf4, 0x96df: 0xe0000bf1, + 0x96e0: 0x002ebc88, 0x96e1: 0x402c8c20, 0x96e2: 0x002f2288, 0x96e3: 0x402f2220, + 0x96e4: 0x00314088, 0x96e5: 0x40314020, 0x96e6: 0xe000096f, 0x96e7: 0xe000096c, + 0x96e8: 0xe0000b32, 0x96e9: 0xe0000b2f, 0x96ea: 0xe00037b0, 0x96eb: 0xe00037ad, + 0x96ec: 0xe0000dfd, 0x96ed: 0xe0000df9, 0x96ee: 0xe0000e04, 0x96ef: 0xe0000e01, + 0x96f0: 0xe0000e0b, 0x96f1: 0xe0000e07, 0x96f2: 0xe0001129, 0x96f3: 0xe0001126, + 0x96f4: 0x402e5e20, 0x96f5: 0x402ed020, 0x96f6: 0x40305a20, 0x96f7: 0x402dd420, + 0x96f8: 0xe0000abf, 0x96f9: 0xe0000ec4, 0x96fa: 0x002be888, 0x96fb: 0x002c4488, + 0x96fc: 0x402c4420, 0x96fd: 0x002e3888, 0x96fe: 0x00303e88, 0x96ff: 0x402ffc20, + // Block 0x25c, offset 0x9700 + 0x9700: 0x402f8220, 0x9701: 0x402fd820, 0x9702: 0x402ff420, 0x9703: 0x40300820, + 0x9704: 0x402df620, 0x9705: 0x40301a20, 0x9706: 0x40302420, 0x9707: 0x40306420, + 0x9708: 0x40305220, 0x9709: 0x40307c20, 0x970a: 0x4030b420, 0x970b: 0x4030cc20, + 0x970c: 0x4030da20, 0x970d: 0x4030ee20, 0x970e: 0x402e7a20, 0x970f: 0x40310820, + 0x9710: 0x40314820, 0x9711: 0x40315020, 0x9712: 0xe000378d, 0x9713: 0x40318020, + 0x9714: 0x4031cc20, 0x9715: 0x4031e820, 0x9716: 0x40320a20, 0x9717: 0x40323220, + 0x9718: 0x40323a20, 0x9719: 0x402c1220, 0x971a: 0x402cf820, 0x971b: 0x402d4c20, + 0x971c: 0x402d7020, 0x971d: 0x402de620, 0x971e: 0x402e1a20, 0x971f: 0x402e2a20, + 0x9720: 0x402f6220, 0x9721: 0x4031fa20, 0x9722: 0x40320220, 0x9723: 0xe0000aca, + 0x9724: 0xe0000adc, 0x9725: 0xe0000ad9, 0x9726: 0xe0000fcc, 0x9727: 0xe0000fcf, + 0x9728: 0xe0000fba, 0x9729: 0xe0000ba1, 0x972a: 0xe0000d11, 0x972b: 0xe0000d18, + 0x972c: 0x40324220, 0x972d: 0x40324a20, 0x972e: 0x40309020, 0x972f: 0x40309820, + 0x9730: 0x002d6894, 0x9731: 0x002d8094, 0x9732: 0x002dcc94, 0x9733: 0x002f7a94, + 0x9734: 0x002f9894, 0x9735: 0x002fac94, 0x9736: 0x002fd894, 0x9737: 0x0030e294, + 0x9738: 0x00310094, 0x9739: 0x40064020, 0x973a: 0x40064420, 0x973b: 0x402d9620, + 0x973c: 0x4031de20, 0x973d: 0x402d9820, 0x973e: 0x4031e220, 0x973f: 0x4031f020, + // Block 0x25d, offset 0x9740 + 0x9740: 0xe0000d24, 0x9741: 0xe0000d21, 0x9742: 0xe0000d2a, 0x9743: 0xe0000d27, + 0x9744: 0xe0000d69, 0x9745: 0xe0000d66, 0x9746: 0xe0000d7b, 0x9747: 0xe0000d78, + 0x9748: 0xe0000d87, 0x9749: 0xe0000d84, 0x974a: 0xe0000d81, 0x974b: 0xe0000d7e, + 0x974c: 0xe0000ded, 0x974d: 0xe0000de9, 0x974e: 0xe00037aa, 0x974f: 0xe00037a7, + 0x9750: 0xe0000e3d, 0x9751: 0xe0000e39, 0x9752: 0xe0000e35, 0x9753: 0xe0000e31, + 0x9754: 0xe0000ea7, 0x9755: 0xe0000ea4, 0x9756: 0xe0000ead, 0x9757: 0xe0000eaa, + 0x9758: 0xe0000ed6, 0x9759: 0xe0000ed3, 0x975a: 0xe0000ef4, 0x975b: 0xe0000ef1, + 0x975c: 0xe0000efb, 0x975d: 0xe0000ef7, 0x975e: 0xe0000f02, 0x975f: 0xe0000eff, + 0x9760: 0xe0000f41, 0x9761: 0xe0000f3e, 0x9762: 0xe0000f53, 0x9763: 0xe0000f50, + 0x9764: 0xe0000f26, 0x9765: 0xe0000f22, 0x9766: 0xe0000f3a, 0x9767: 0xe0000f36, + 0x9768: 0xe0000f5a, 0x9769: 0xe0000f56, 0x976a: 0xe0000f93, 0x976b: 0xe0000f90, + 0x976c: 0xe0000f9f, 0x976d: 0xe0000f9c, 0x976e: 0xe0000fb1, 0x976f: 0xe0000fae, + 0x9770: 0xe0000fab, 0x9771: 0xe0000fa8, 0x9772: 0xe0001093, 0x9773: 0xe0001090, + 0x9774: 0xe000109f, 0x9775: 0xe000109c, 0x9776: 0xe0001099, 0x9777: 0xe0001096, + 0x9778: 0xe0001032, 0x9779: 0xe000102e, 0x977a: 0xe000298b, 0x977b: 0xe0002988, + 0x977c: 0xe00010a9, 0x977d: 0xe00010a6, 0x977e: 0xe00010af, 0x977f: 0xe00010ac, + // Block 0x25e, offset 0x9780 + 0x9780: 0xe00009bc, 0x9781: 0xe00009c0, 0x9782: 0x002c3a8b, 0x9783: 0xf0000a04, + 0x9784: 0x40081c20, 0x9785: 0xe0000a5e, 0x9786: 0xe0000a62, 0x9787: 0x002cc28a, + 0x9788: 0x40081e20, 0x9789: 0xf0000a04, 0x978a: 0x002d2285, 0x978b: 0x002d688b, + 0x978c: 0x002d688b, 0x978d: 0x002d688b, 0x978e: 0x002d6885, 0x978f: 0xf0000202, + 0x9790: 0x002d9a8b, 0x9791: 0x002d9a8b, 0x9792: 0x002e228b, 0x9793: 0x002e2285, + 0x9794: 0x40082020, 0x9795: 0x002e9e8b, 0x9796: 0xf000040a, 0x9797: 0x40082220, + 0x9798: 0x40082420, 0x9799: 0x002f2c8b, 0x979a: 0x002f568b, 0x979b: 0x002f7a8b, + 0x979c: 0x002f7a8b, 0x979d: 0x002f7a8b, 0x979e: 0x40082620, 0x979f: 0x40082820, + 0x97a0: 0xf0001414, 0x97a1: 0xe0000fbd, 0x97a2: 0xf0001414, 0x97a3: 0x40082a20, + 0x97a4: 0x00312a8b, 0x97a5: 0x40082c20, 0x97a6: 0x0032a288, 0x97a7: 0x40082e20, + 0x97a8: 0x00312a8b, 0x97a9: 0x40083020, 0x97aa: 0x002dfe88, 0x97ab: 0x00320c83, + 0x97ac: 0x002c0a8b, 0x97ad: 0x002c3a8b, 0x97ae: 0x40083220, 0x97af: 0x002c9885, + 0x97b0: 0x002c988b, 0x97b1: 0x002d088b, 0x97b2: 0x002d1e88, 0x97b3: 0x002e828b, + 0x97b4: 0x002ee285, 0x97b5: 0x00389084, 0x97b6: 0x00389284, 0x97b7: 0x00389484, + 0x97b8: 0x00389684, 0x97b9: 0x002d9a85, 0x97ba: 0x40083420, 0x97bb: 0xe0000b95, + 0x97bc: 0x00327e85, 0x97bd: 0x00325685, 0x97be: 0x0032568b, 0x97bf: 0x00327e8b, + // Block 0x25f, offset 0x97c0 + 0x97c0: 0xa0000000, 0x97c1: 0xa0000000, 0x97c2: 0xa0000000, 0x97c3: 0xa0000000, + 0x97c4: 0xa0000000, 0x97c5: 0xa0000000, 0x97c6: 0xa0000000, 0x97c7: 0xa0000000, + 0x97c8: 0xa0000000, 0x97c9: 0x40020020, 0x97ca: 0x40020220, 0x97cb: 0x40020420, + 0x97cc: 0x40020620, 0x97cd: 0x40020820, 0x97ce: 0xa0000000, 0x97cf: 0xa0000000, + 0x97d0: 0xa0000000, 0x97d1: 0xa0000000, 0x97d2: 0xa0000000, 0x97d3: 0xa0000000, + 0x97d4: 0xa0000000, 0x97d5: 0xa0000000, 0x97d6: 0xa0000000, 0x97d7: 0xa0000000, + 0x97d8: 0xa0000000, 0x97d9: 0xa0000000, 0x97da: 0xa0000000, 0x97db: 0xa0000000, + 0x97dc: 0xa0000000, 0x97dd: 0xa0000000, 0x97de: 0xa0000000, 0x97df: 0xa0000000, + 0x97e0: 0x40021220, 0x97e1: 0x4002ba20, 0x97e2: 0x4003e020, 0x97e3: 0x4004ea20, + 0x97e4: 0x4027de20, 0x97e5: 0x4004ec20, 0x97e6: 0x4004e620, 0x97e7: 0x4003d220, + 0x97e8: 0x4003f420, 0x97e9: 0x4003f620, 0x97ea: 0x4004d820, 0x97eb: 0x40093820, + 0x97ec: 0x40024020, 0x97ed: 0x40021a20, 0x97ee: 0x4002e420, 0x97ef: 0x4004e220, + 0x97f0: 0x4029cc20, 0x97f1: 0x4029ce20, 0x97f2: 0x4029d020, 0x97f3: 0x4029d220, + 0x97f4: 0x4029d420, 0x97f5: 0x4029d620, 0x97f6: 0x4029d820, 0x97f7: 0x4029da20, + 0x97f8: 0x4029dc20, 0x97f9: 0x4029de20, 0x97fa: 0x40026c20, 0x97fb: 0x40026220, + 0x97fc: 0x40094020, 0x97fd: 0x40094220, 0x97fe: 0x40094420, 0x97ff: 0x4002c420, + // Block 0x260, offset 0x9800 + 0x9800: 0x4004d620, 0x9801: 0x002bde88, 0x9802: 0x002c0a88, 0x9803: 0x002c3a88, + 0x9804: 0x002c6288, 0x9805: 0x002c9888, 0x9806: 0x002d0888, 0x9807: 0x002d2288, + 0x9808: 0x002d6888, 0x9809: 0x002d9a88, 0x980a: 0x002dcc88, 0x980b: 0x002dfe88, + 0x980c: 0xc0030002, 0x980d: 0x002e8288, 0x980e: 0xc5712813, 0x980f: 0x002ee288, + 0x9810: 0x002f2c88, 0x9811: 0x002f5688, 0x9812: 0x002f7a88, 0x9813: 0x002fe688, + 0x9814: 0x00302c88, 0x9815: 0x00306c88, 0x9816: 0x0030be88, 0x9817: 0x0030e288, + 0x9818: 0x0030f688, 0x9819: 0x00310088, 0x981a: 0x00312a88, 0x981b: 0x4003f820, + 0x981c: 0x4004e420, 0x981d: 0x4003fa20, 0x981e: 0x40062420, 0x981f: 0x40021620, + 0x9820: 0x40061e20, 0x9821: 0x402bde20, 0x9822: 0x402c0a20, 0x9823: 0x402c3a20, + 0x9824: 0x402c6220, 0x9825: 0x402c9820, 0x9826: 0x402d0820, 0x9827: 0x402d2220, + 0x9828: 0x402d6820, 0x9829: 0x402d9a20, 0x982a: 0x402dcc20, 0x982b: 0x402dfe20, + 0x982c: 0xc0000002, 0x982d: 0x402e8220, 0x982e: 0xc56e27e2, 0x982f: 0x402ee220, + 0x9830: 0x402f2c20, 0x9831: 0x402f5620, 0x9832: 0x402f7a20, 0x9833: 0x402fe620, + 0x9834: 0x40302c20, 0x9835: 0x40306c20, 0x9836: 0x4030be20, 0x9837: 0x4030e220, + 0x9838: 0x4030f620, 0x9839: 0x40310020, 0x983a: 0x40312a20, 0x983b: 0x4003fc20, + 0x983c: 0x40094820, 0x983d: 0x4003fe20, 0x983e: 0x40094c20, 0x983f: 0xa0000000, + // Block 0x261, offset 0x9840 + 0x9841: 0x40417021, 0x9842: 0x40417020, 0x9843: 0x40417220, + 0x9845: 0x40417020, 0x9846: 0x40417220, 0x9847: 0x40417420, + 0x9848: 0x40417620, 0x9849: 0x40417820, 0x984a: 0x40417a20, 0x984b: 0x40417c20, + 0x984c: 0x40418020, 0x984d: 0x40418420, 0x984f: 0x40418620, + 0x9850: 0x40418820, 0x9851: 0x40418a20, 0x9853: 0x40418c20, + 0x9854: 0x40418e20, 0x9855: 0x40419020, 0x9856: 0x40419220, 0x9857: 0x40419420, + 0x9858: 0x40419620, 0x9859: 0x40419820, 0x985a: 0x40419a20, 0x985b: 0x40419c20, + 0x985c: 0x40419e20, 0x985d: 0x4041a020, 0x985e: 0x4041a220, 0x985f: 0x4041a420, + 0x9860: 0x4041a620, 0x9861: 0x4041a820, 0x9862: 0x4041aa20, 0x9863: 0x4041ac20, + 0x9864: 0x4041ae20, 0x9865: 0x4041b020, 0x9866: 0x4041b220, 0x9867: 0x4041b420, + 0x9868: 0x4041b620, 0x986a: 0x4041b820, 0x986b: 0x4041ba20, + 0x986c: 0x4041bc20, 0x986d: 0x4041be20, 0x986e: 0x4041c020, 0x986f: 0x4041c220, + 0x9870: 0x4041c420, 0x9872: 0x4041c620, 0x9873: 0x4041d220, + 0x9875: 0x4041c820, 0x9876: 0x4041ca20, 0x9877: 0x4041cc20, + 0x9878: 0x4041ce20, 0x9879: 0x4041d020, + 0x987c: 0xa070f102, 0x987d: 0x4041d420, 0x987e: 0x4041d620, 0x987f: 0x4041d820, + // Block 0x262, offset 0x9880 + 0x9880: 0xa0000000, 0x9881: 0xa0000000, 0x9882: 0xa0000000, 0x9883: 0xa0000000, + 0x9884: 0xa0000000, 0x9885: 0xa0000000, 0x9886: 0xa0000000, 0x9887: 0xa0000000, + 0x9888: 0xa0000000, 0x9889: 0x40020020, 0x988a: 0x40020220, 0x988b: 0x40020420, + 0x988c: 0x40020620, 0x988d: 0x40020820, 0x988e: 0xa0000000, 0x988f: 0xa0000000, + 0x9890: 0xa0000000, 0x9891: 0xa0000000, 0x9892: 0xa0000000, 0x9893: 0xa0000000, + 0x9894: 0xa0000000, 0x9895: 0xa0000000, 0x9896: 0xa0000000, 0x9897: 0xa0000000, + 0x9898: 0xa0000000, 0x9899: 0xa0000000, 0x989a: 0xa0000000, 0x989b: 0xa0000000, + 0x989c: 0xa0000000, 0x989d: 0xa0000000, 0x989e: 0xa0000000, 0x989f: 0xa0000000, + 0x98a0: 0x40021220, 0x98a1: 0x4002ba20, 0x98a2: 0x4003e020, 0x98a3: 0x4004ea20, + 0x98a4: 0x4027de20, 0x98a5: 0x4004ec20, 0x98a6: 0x4004e620, 0x98a7: 0xc57b26f2, + 0x98a8: 0x4003f420, 0x98a9: 0x4003f620, 0x98aa: 0x4004d820, 0x98ab: 0x40093820, + 0x98ac: 0x40024020, 0x98ad: 0x40021a20, 0x98ae: 0x4002e420, 0x98af: 0x4004e220, + 0x98b0: 0x4029cc20, 0x98b1: 0x4029ce20, 0x98b2: 0x4029d020, 0x98b3: 0x4029d220, + 0x98b4: 0x4029d420, 0x98b5: 0x4029d620, 0x98b6: 0x4029d820, 0x98b7: 0x4029da20, + 0x98b8: 0x4029dc20, 0x98b9: 0x4029de20, 0x98ba: 0x40026c20, 0x98bb: 0x40026220, + 0x98bc: 0x40094020, 0x98bd: 0x40094220, 0x98be: 0x40094420, 0x98bf: 0x4002c420, + // Block 0x263, offset 0x98c0 + 0x98c0: 0x4004d620, 0x98c1: 0x002bde88, 0x98c2: 0x002c0a88, 0x98c3: 0x002c3a88, + 0x98c4: 0x002c6288, 0x98c5: 0x002c9888, 0x98c6: 0x002d0888, 0x98c7: 0x002d2288, + 0x98c8: 0x002d6888, 0x98c9: 0x002d9a88, 0x98ca: 0x002dcc88, 0x98cb: 0x002dfe88, + 0x98cc: 0xc0030002, 0x98cd: 0x002e8288, 0x98ce: 0x002e9e88, 0x98cf: 0x002ee288, + 0x98d0: 0x002f2c88, 0x98d1: 0x002f5688, 0x98d2: 0x002f7a88, 0x98d3: 0xc57509c2, + 0x98d4: 0xc38a2722, 0x98d5: 0x00306c88, 0x98d6: 0x0030be88, 0x98d7: 0x0030e288, + 0x98d8: 0x0030f688, 0x98d9: 0x00310088, 0x98da: 0x00312a88, 0x98db: 0x4003f820, + 0x98dc: 0x4004e420, 0x98dd: 0x4003fa20, 0x98de: 0x40062420, 0x98df: 0x40021620, + 0x98e0: 0x40061e20, 0x98e1: 0x402bde20, 0x98e2: 0x402c0a20, 0x98e3: 0x402c3a20, + 0x98e4: 0x402c6220, 0x98e5: 0x402c9820, 0x98e6: 0x402d0820, 0x98e7: 0x402d2220, + 0x98e8: 0x402d6820, 0x98e9: 0x402d9a20, 0x98ea: 0x402dcc20, 0x98eb: 0x402dfe20, + 0x98ec: 0xc0000002, 0x98ed: 0x402e8220, 0x98ee: 0x402e9e20, 0x98ef: 0x402ee220, + 0x98f0: 0x402f2c20, 0x98f1: 0x402f5620, 0x98f2: 0x402f7a20, 0x98f3: 0xc34109b1, + 0x98f4: 0xc3882711, 0x98f5: 0x40306c20, 0x98f6: 0x4030be20, 0x98f7: 0x4030e220, + 0x98f8: 0x4030f620, 0x98f9: 0x40310020, 0x98fa: 0x40312a20, 0x98fb: 0x4003fc20, + 0x98fc: 0x40094820, 0x98fd: 0x4003fe20, 0x98fe: 0x40094c20, 0x98ff: 0xa0000000, + // Block 0x264, offset 0x9900 + 0x9900: 0x402c1a20, 0x9901: 0x002c0c83, 0x9902: 0x002c3288, 0x9903: 0x402c3220, + 0x9904: 0x0031c488, 0x9905: 0x4031c420, 0x9906: 0x002efa88, 0x9907: 0x002c4e88, + 0x9908: 0x402c4e20, 0x9909: 0x002c7288, 0x990a: 0x002c6483, 0x990b: 0x002c8488, + 0x990c: 0x402c8420, 0x990d: 0xe000115c, 0x990e: 0x002cae88, 0x990f: 0x002cb888, + 0x9910: 0x002cc288, 0x9911: 0x002d1688, 0x9912: 0x402d1620, 0x9913: 0x002d4488, + 0x9914: 0x002d5888, 0x9915: 0x402d7820, 0x9916: 0x002dc288, 0x9917: 0x002db688, + 0x9918: 0x002e0083, 0x9919: 0x402e0020, 0x991a: 0x402e3820, 0x991b: 0x402e7220, + 0x991c: 0x0030a088, 0x991d: 0x002eb488, 0x991e: 0x402ebc20, 0x991f: 0x002f1088, + 0x9920: 0xe0000e56, 0x9921: 0xe0000e53, 0x9922: 0x002d6088, 0x9923: 0x402d6020, + 0x9924: 0x002f3e88, 0x9925: 0x402f3e20, 0x9926: 0x002f8288, 0x9927: 0x0031b488, + 0x9928: 0x4031b420, 0x9929: 0x00300888, 0x992a: 0x40301220, 0x992b: 0x40304220, + 0x992c: 0x00304a88, 0x992d: 0x40304a20, 0x992e: 0x00305288, 0x992f: 0xe000105f, + 0x9930: 0xe000105c, 0x9931: 0x0030b488, 0x9932: 0x0030cc88, 0x9933: 0x00310285, + 0x9934: 0x40310220, 0x9935: 0x00313488, 0x9936: 0x40313420, 0x9937: 0x00316488, + 0x9938: 0x00316e88, 0x9939: 0x40316e20, 0x993a: 0x40317820, 0x993b: 0x4031a620, + 0x993c: 0x0031bc88, 0x993d: 0x4031bc20, 0x993e: 0xe0000fc9, 0x993f: 0x40319420, + // Block 0x265, offset 0x9940 + 0x9940: 0x40315820, 0x9941: 0x0031d488, 0x9942: 0x4031d420, 0x9943: 0x002c1a88, + 0x9944: 0x00307c88, 0x9945: 0x0030da88, 0x9946: 0x002ca288, 0x9947: 0x402ca220, + 0x9948: 0x002dde88, 0x9949: 0x402dde20, 0x994a: 0x002f6a88, 0x994b: 0x402f6a20, + 0x994c: 0x002f8e88, 0x994d: 0x402f8e20, 0x994e: 0x00311088, 0x994f: 0x40311020, + 0x9950: 0x402bf020, 0x9951: 0x402bf820, 0x9952: 0x402c0220, 0x9953: 0x402c0c20, + 0x9954: 0x402efa20, 0x9955: 0x402c5620, 0x9956: 0x402c7220, 0x9957: 0x402c6420, + 0x9958: 0x402ccc20, 0x9959: 0x402cb820, 0x995a: 0x402cd420, 0x995b: 0x402cc220, + 0x995c: 0x402cdc20, 0x995d: 0x402ce820, 0x995e: 0x402cf020, 0x995f: 0x402dee20, + 0x9960: 0x402d4420, 0x9961: 0x402d2a20, 0x9962: 0x402d3220, 0x9963: 0x402d5820, + 0x9964: 0x402d0020, 0x9965: 0x40308820, 0x9966: 0x402d8020, 0x9967: 0x402d8e20, + 0x9968: 0x402db620, 0x9969: 0x402dc220, 0x996a: 0x402daa20, 0x996b: 0x402e4220, + 0x996c: 0x402e4a20, 0x996d: 0x402e5420, 0x996e: 0x402e6820, 0x996f: 0x4030a020, + 0x9970: 0x4030ac20, 0x9971: 0x402e9020, 0x9972: 0x402eb420, 0x9973: 0x402ec820, + 0x9974: 0x402ea620, 0x9975: 0x402f1020, 0x9976: 0x402eee20, 0x9977: 0x402f1a20, + 0x9978: 0x402f4c20, 0x9979: 0x402f9820, 0x997a: 0x402fa220, 0x997b: 0x402fac20, + 0x997c: 0x402fb620, 0x997d: 0x402fbe20, 0x997e: 0x402fc620, 0x997f: 0x402fd020, + // Block 0x266, offset 0x9980 + 0x9980: 0x402f8220, 0x9981: 0x402fd820, 0x9982: 0x402ff420, 0x9983: 0x40300820, + 0x9984: 0x402df620, 0x9985: 0x40301a20, 0x9986: 0x40302420, 0x9987: 0x40306420, + 0x9988: 0x40305220, 0x9989: 0x40307c20, 0x998a: 0x4030b420, 0x998b: 0x4030cc20, + 0x998c: 0x4030da20, 0x998d: 0x4030ee20, 0x998e: 0x402e7a20, 0x998f: 0x40310820, + 0x9990: 0x40314820, 0x9991: 0x40315020, 0x9992: 0x40316420, 0x9993: 0x40318020, + 0x9994: 0x4031cc20, 0x9995: 0x4031e820, 0x9996: 0x40320a20, 0x9997: 0x40323220, + 0x9998: 0x40323a20, 0x9999: 0x402c1220, 0x999a: 0x402cf820, 0x999b: 0x402d4c20, + 0x999c: 0x402d7020, 0x999d: 0x402de620, 0x999e: 0x402e1a20, 0x999f: 0x402e2a20, + 0x99a0: 0x402f6220, 0x99a1: 0x4031fa20, 0x99a2: 0x40320220, 0x99a3: 0xe0000aca, + 0x99a4: 0xe0000adc, 0x99a5: 0xe0000ad9, 0x99a6: 0xe0000fcc, 0x99a7: 0xe0000fcf, + 0x99a8: 0xe0000fba, 0x99a9: 0xe0000ba1, 0x99aa: 0xe0000d11, 0x99ab: 0xe0000d18, + 0x99ac: 0x40324220, 0x99ad: 0x40324a20, 0x99ae: 0x40309020, 0x99af: 0x40309820, + 0x99b0: 0x002d6894, 0x99b1: 0x002d8094, 0x99b2: 0x002dcc94, 0x99b3: 0x002f7a94, + 0x99b4: 0x002f9894, 0x99b5: 0x002fac94, 0x99b6: 0x002fd894, 0x99b7: 0x0030e294, + 0x99b8: 0x00310094, 0x99b9: 0x40064020, 0x99ba: 0x40064420, 0x99bb: 0x402d9620, + 0x99bc: 0xc57826f2, 0x99bd: 0x402d9820, 0x99be: 0x4031e220, 0x99bf: 0x4031f020, + // Block 0x267, offset 0x99c0 + 0x99c0: 0xa0000000, 0x99c1: 0xa0000000, 0x99c2: 0xa0000000, 0x99c3: 0xa0000000, + 0x99c4: 0xa0000000, 0x99c5: 0xa0000000, 0x99c6: 0xa0000000, 0x99c7: 0xa0000000, + 0x99c8: 0xa0000000, 0x99c9: 0x40020020, 0x99ca: 0x40020220, 0x99cb: 0x40020420, + 0x99cc: 0x40020620, 0x99cd: 0x40020820, 0x99ce: 0xa0000000, 0x99cf: 0xa0000000, + 0x99d0: 0xa0000000, 0x99d1: 0xa0000000, 0x99d2: 0xa0000000, 0x99d3: 0xa0000000, + 0x99d4: 0xa0000000, 0x99d5: 0xa0000000, 0x99d6: 0xa0000000, 0x99d7: 0xa0000000, + 0x99d8: 0xa0000000, 0x99d9: 0xa0000000, 0x99da: 0xa0000000, 0x99db: 0xa0000000, + 0x99dc: 0xa0000000, 0x99dd: 0xa0000000, 0x99de: 0xa0000000, 0x99df: 0xa0000000, + 0x99e0: 0x40021220, 0x99e1: 0x4002ba20, 0x99e2: 0x4003e020, 0x99e3: 0x4004ea20, + 0x99e4: 0x4027de20, 0x99e5: 0x4004ec20, 0x99e6: 0x4004e620, 0x99e7: 0x4003d220, + 0x99e8: 0x4003f420, 0x99e9: 0x4003f620, 0x99ea: 0x4004d820, 0x99eb: 0x40093820, + 0x99ec: 0x40024020, 0x99ed: 0x40021a20, 0x99ee: 0x4002e420, 0x99ef: 0x4004e220, + 0x99f0: 0x4029cc20, 0x99f1: 0x4029ce20, 0x99f2: 0x4029d020, 0x99f3: 0x4029d220, + 0x99f4: 0x4029d420, 0x99f5: 0x4029d620, 0x99f6: 0x4029d820, 0x99f7: 0x4029da20, + 0x99f8: 0x4029dc20, 0x99f9: 0x4029de20, 0x99fa: 0x40026c20, 0x99fb: 0x40026220, + 0x99fc: 0x40094020, 0x99fd: 0x40094220, 0x99fe: 0x40094420, 0x99ff: 0x4002c420, + // Block 0x268, offset 0x9a00 + 0x9a00: 0x4004d620, 0x9a01: 0x002bde83, 0x9a02: 0x002c0a88, 0x9a03: 0x002c3a88, + 0x9a04: 0x002c6288, 0x9a05: 0x002be083, 0x9a06: 0x002d0888, 0x9a07: 0x002d2288, + 0x9a08: 0x002be883, 0x9a09: 0x002be283, 0x9a0a: 0x002dcc88, 0x9a0b: 0x002bea83, + 0x9a0c: 0xc5810002, 0x9a0d: 0x002bee83, 0x9a0e: 0x002bf083, 0x9a0f: 0x002be483, + 0x9a10: 0x002bf283, 0x9a11: 0x002f5688, 0x9a12: 0x002f7a88, 0x9a13: 0x002fe688, + 0x9a14: 0x00302c88, 0x9a15: 0x002be683, 0x9a16: 0x0030be88, 0x9a17: 0x002bf483, + 0x9a18: 0x0030f688, 0x9a19: 0x00310088, 0x9a1a: 0x00312a88, 0x9a1b: 0x4003f820, + 0x9a1c: 0x4004e420, 0x9a1d: 0x4003fa20, 0x9a1e: 0x40062420, 0x9a1f: 0x40021620, + 0x9a20: 0x40061e20, 0x9a21: 0x402bde20, 0x9a22: 0x402c0a20, 0x9a23: 0x402c3a20, + 0x9a24: 0x402c6220, 0x9a25: 0x402be020, 0x9a26: 0x402d0820, 0x9a27: 0x402d2220, + 0x9a28: 0x402be820, 0x9a29: 0x402be220, 0x9a2a: 0x402dcc20, 0x9a2b: 0x402bea20, + 0x9a2c: 0xc57e0002, 0x9a2d: 0x402bee20, 0x9a2e: 0x402bf020, 0x9a2f: 0x402be420, + 0x9a30: 0x402bf220, 0x9a31: 0x402f5620, 0x9a32: 0x402f7a20, 0x9a33: 0x402fe620, + 0x9a34: 0x40302c20, 0x9a35: 0x402be620, 0x9a36: 0x4030be20, 0x9a37: 0x402bf420, + 0x9a38: 0x4030f620, 0x9a39: 0x40310020, 0x9a3a: 0x40312a20, 0x9a3b: 0x4003fc20, + 0x9a3c: 0x40094820, 0x9a3d: 0x4003fe20, 0x9a3e: 0x40094c20, 0x9a3f: 0xa0000000, + // Block 0x269, offset 0x9a40 + 0x9a40: 0xe00037bc, 0x9a41: 0xe00037b9, 0x9a42: 0xe00037d2, 0x9a43: 0xe00037f6, + 0x9a44: 0xe00037ef, 0x9a45: 0xe00037e8, 0x9a46: 0xe00009dd, 0x9a47: 0xe0000a53, + 0x9a48: 0xe0003826, 0x9a49: 0xe0003820, 0x9a4a: 0xe0003832, 0x9a4b: 0xe000385e, + 0x9a4c: 0xe00038cc, 0x9a4d: 0xe00038c6, 0x9a4e: 0xe00038d8, 0x9a4f: 0xe00038e4, + 0x9a50: 0xe0000ab3, 0x9a51: 0xe0003b7a, 0x9a52: 0xe000392b, 0x9a53: 0xe0003925, + 0x9a54: 0xe0003937, 0x9a55: 0xe0003977, 0x9a56: 0xe0003963, 0x9a57: 0x40093e20, + 0x9a58: 0xe0000e12, 0x9a59: 0xe0003a1b, 0x9a5a: 0xe0003a15, 0x9a5b: 0xe0003a27, + 0x9a5c: 0xe0003a39, 0x9a5d: 0xe0001102, 0x9a5e: 0x00318888, 0x9a5f: 0xe0000f7b, + 0x9a60: 0xe00008f2, 0x9a61: 0xe00008ec, 0x9a62: 0xe000091e, 0x9a63: 0xe0000966, + 0x9a64: 0xe0000958, 0x9a65: 0xe000094a, 0x9a66: 0xe00009d5, 0x9a67: 0xe0000a4d, + 0x9a68: 0xe0003823, 0x9a69: 0xe000381d, 0x9a6a: 0xe000382f, 0x9a6b: 0xe000385b, + 0x9a6c: 0xe00038c9, 0x9a6d: 0xe00038c3, 0x9a6e: 0xe00038d5, 0x9a6f: 0xe00038e1, + 0x9a70: 0xe0000aad, 0x9a71: 0xe0003b77, 0x9a72: 0xe0003928, 0x9a73: 0xe0003922, + 0x9a74: 0xe0003934, 0x9a75: 0xe0003974, 0x9a76: 0xe0003960, 0x9a77: 0x40093c20, + 0x9a78: 0xe0000e0f, 0x9a79: 0xe0003a18, 0x9a7a: 0xe0003a12, 0x9a7b: 0xe0003a24, + 0x9a7c: 0xe0003a36, 0x9a7d: 0xe00010ff, 0x9a7e: 0x40318820, 0x9a7f: 0xe0001114, + // Block 0x26a, offset 0x9a80 + 0x9a80: 0xe0003803, 0x9a81: 0xe0000980, 0x9a82: 0xe00037bf, 0x9a83: 0xe00008f8, + 0x9a84: 0xe0003800, 0x9a85: 0xe000097a, 0x9a86: 0xe0000a38, 0x9a87: 0xe0000a35, + 0x9a88: 0xe0000a3e, 0x9a89: 0xe0000a3b, 0x9a8a: 0xe0000a4a, 0x9a8b: 0xe0000a47, + 0x9a8c: 0xe0000a44, 0x9a8d: 0xe0000a41, 0x9a8e: 0xe0000a86, 0x9a8f: 0xe0000a83, + 0x9a90: 0xe0000aaa, 0x9a91: 0xe0000aa7, 0x9a92: 0xe0003884, 0x9a93: 0xe0003881, + 0x9a94: 0xe000382c, 0x9a95: 0xe0003829, 0x9a96: 0xe000386a, 0x9a97: 0xe0003867, + 0x9a98: 0xe000387e, 0x9a99: 0xe000387b, 0x9a9a: 0xe0003858, 0x9a9b: 0xe0003855, + 0x9a9c: 0xe0000bb8, 0x9a9d: 0xe0000bb5, 0x9a9e: 0xe0000bb2, 0x9a9f: 0xe0000baf, + 0x9aa0: 0xe0000bc4, 0x9aa1: 0xe0000bc1, 0x9aa2: 0xe0000bca, 0x9aa3: 0xe0000bc7, + 0x9aa4: 0xe0003adf, 0x9aa5: 0xe0003adc, 0x9aa6: 0xe0000c1b, 0x9aa7: 0xe0000c18, + 0x9aa8: 0xe00038f2, 0x9aa9: 0xe00038ef, 0x9aaa: 0xe0003901, 0x9aab: 0xe00038fe, + 0x9aac: 0xe00038d2, 0x9aad: 0xe00038cf, 0x9aae: 0xe00038fb, 0x9aaf: 0xe00038f8, + 0x9ab0: 0xe00038f5, 0x9ab1: 0x402da220, 0x9ab2: 0xe00027e2, 0x9ab3: 0xe00027df, + 0x9ab4: 0xe0000c8a, 0x9ab5: 0xe0000c87, 0x9ab6: 0xe0003b18, 0x9ab7: 0xe0003b15, + 0x9ab8: 0x402f7220, 0x9ab9: 0xe0003b2a, 0x9aba: 0xe0003b27, 0x9abb: 0xe0003b36, + 0x9abc: 0xe0003b33, 0x9abd: 0xe0003b30, 0x9abe: 0xe0003b2d, 0x9abf: 0xe0000d04, + // Block 0x26b, offset 0x9ac0 + 0x9ac0: 0xe0000cfe, 0x9ac1: 0xe0000cf8, 0x9ac2: 0xe0000cf5, 0x9ac3: 0xe0003b68, + 0x9ac4: 0xe0003b65, 0x9ac5: 0xe0003b86, 0x9ac6: 0xe0003b83, 0x9ac7: 0xe0003b74, + 0x9ac8: 0xe0003b71, 0x9ac9: 0xe00035a1, 0x9aca: 0x002eda88, 0x9acb: 0x402eda20, + 0x9acc: 0xe00039b1, 0x9acd: 0xe00039ae, 0x9ace: 0xe0003931, 0x9acf: 0xe000392e, + 0x9ad0: 0xe0003971, 0x9ad1: 0xe000396e, 0x9ad2: 0xe0000e93, 0x9ad3: 0xe0000e8f, + 0x9ad4: 0xe0000eca, 0x9ad5: 0xe0000ec7, 0x9ad6: 0xe0000edc, 0x9ad7: 0xe0000ed9, + 0x9ad8: 0xe0000ed0, 0x9ad9: 0xe0000ecd, 0x9ada: 0xe0000f1f, 0x9adb: 0xe0000f1c, + 0x9adc: 0xe0000f2d, 0x9add: 0xe0000f2a, 0x9ade: 0xe0000f47, 0x9adf: 0xe0000f44, + 0x9ae0: 0xe0000f33, 0x9ae1: 0xe0000f30, 0x9ae2: 0xe0000f99, 0x9ae3: 0xe0000f96, + 0x9ae4: 0xe0000f8a, 0x9ae5: 0xe0000f87, 0x9ae6: 0x00303688, 0x9ae7: 0x40303620, + 0x9ae8: 0xe0003a65, 0x9ae9: 0xe0003a62, 0x9aea: 0xe0003a79, 0x9aeb: 0xe0003a76, + 0x9aec: 0xe0003a21, 0x9aed: 0xe0003a1e, 0x9aee: 0xe0003a33, 0x9aef: 0xe0003a30, + 0x9af0: 0xe0003a5f, 0x9af1: 0xe0003a5c, 0x9af2: 0xe0003a73, 0x9af3: 0xe0003a70, + 0x9af4: 0xe0003bb6, 0x9af5: 0xe0003bb3, 0x9af6: 0xe000110e, 0x9af7: 0xe000110b, + 0x9af8: 0xe0001117, 0x9af9: 0xe000113b, 0x9afa: 0xe0001138, 0x9afb: 0xe000114d, + 0x9afc: 0xe000114a, 0x9afd: 0xe0001147, 0x9afe: 0xe0001144, 0x9aff: 0xe0000f64, + // Block 0x26c, offset 0x9b00 + 0x9b00: 0x402c1a20, 0x9b01: 0x002c2a88, 0x9b02: 0x002c3288, 0x9b03: 0x402c3220, + 0x9b04: 0x0031c488, 0x9b05: 0x4031c420, 0x9b06: 0x002efa88, 0x9b07: 0x002c4e88, + 0x9b08: 0x402c4e20, 0x9b09: 0x002c7288, 0x9b0a: 0x002c7a88, 0x9b0b: 0x002c8488, + 0x9b0c: 0x402c8420, 0x9b0d: 0xe000115c, 0x9b0e: 0x002cae88, 0x9b0f: 0x002cb888, + 0x9b10: 0x002cc288, 0x9b11: 0x002d1688, 0x9b12: 0x402d1620, 0x9b13: 0x002d4488, + 0x9b14: 0x002d5888, 0x9b15: 0x402d7820, 0x9b16: 0x002dc288, 0x9b17: 0x002db688, + 0x9b18: 0x002e0a88, 0x9b19: 0x402e0a20, 0x9b1a: 0x402e3820, 0x9b1b: 0x402e7220, + 0x9b1c: 0x0030a088, 0x9b1d: 0x002eb488, 0x9b1e: 0x402ebc20, 0x9b1f: 0x002f1088, + 0x9b20: 0xe00039d9, 0x9b21: 0xe00039d6, 0x9b22: 0x002d6088, 0x9b23: 0x402d6020, + 0x9b24: 0x002f3e88, 0x9b25: 0x402f3e20, 0x9b26: 0x002f8288, 0x9b27: 0x0031b488, + 0x9b28: 0x4031b420, 0x9b29: 0x00300888, 0x9b2a: 0x40301220, 0x9b2b: 0x40304220, + 0x9b2c: 0x00304a88, 0x9b2d: 0x40304a20, 0x9b2e: 0x00305288, 0x9b2f: 0xe0003a99, + 0x9b30: 0xe0003a96, 0x9b31: 0x0030b488, 0x9b32: 0x0030cc88, 0x9b33: 0x00311888, + 0x9b34: 0x40311820, 0x9b35: 0x00313488, 0x9b36: 0x40313420, 0x9b37: 0x00316488, + 0x9b38: 0x00316e88, 0x9b39: 0x40316e20, 0x9b3a: 0x40317820, 0x9b3b: 0x4031a620, + 0x9b3c: 0x0031bc88, 0x9b3d: 0x4031bc20, 0x9b3e: 0xe0000fc9, 0x9b3f: 0x40319420, + // Block 0x26d, offset 0x9b40 + 0x9b40: 0x40321220, 0x9b41: 0x40321a20, 0x9b42: 0x40322220, 0x9b43: 0x40322a20, + 0x9b44: 0xe0000ad5, 0x9b45: 0xe0000ad1, 0x9b46: 0xe0000acd, 0x9b47: 0xe0003535, + 0x9b48: 0xe0003532, 0x9b49: 0xe000352f, 0x9b4a: 0xe000357a, 0x9b4b: 0xe0003577, + 0x9b4c: 0xe0003574, 0x9b4d: 0xe00037e5, 0x9b4e: 0xe0000944, 0x9b4f: 0xe00038de, + 0x9b50: 0xe00038db, 0x9b51: 0xe000395d, 0x9b52: 0xe000395a, 0x9b53: 0xe0003a2d, + 0x9b54: 0xe0003a2a, 0x9b55: 0xe0003a58, 0x9b56: 0xe0003a54, 0x9b57: 0xe0003a40, + 0x9b58: 0xe0003a3c, 0x9b59: 0xe0003a50, 0x9b5a: 0xe0003a4c, 0x9b5b: 0xe0003a48, + 0x9b5c: 0xe0003a44, 0x9b5d: 0x402cae20, 0x9b5e: 0xe00037f2, 0x9b5f: 0xe000095e, + 0x9b60: 0xe00037fc, 0x9b61: 0xe0000972, 0x9b62: 0xe00009f4, 0x9b63: 0xe00009ef, + 0x9b64: 0x002d3a88, 0x9b65: 0x402d3a20, 0x9b66: 0xe0000bbe, 0x9b67: 0xe0000bbb, + 0x9b68: 0xe0003b12, 0x9b69: 0xe0003b0f, 0x9b6a: 0xe00039a3, 0x9b6b: 0xe00039a0, + 0x9b6c: 0xe00039aa, 0x9b6d: 0xe00039a6, 0x9b6e: 0xe0001162, 0x9b6f: 0xe000115f, + 0x9b70: 0xe0000c8d, 0x9b71: 0xf0000a0a, 0x9b72: 0xf000040a, 0x9b73: 0xf0000404, + 0x9b74: 0xe0000bac, 0x9b75: 0xe0000ba9, 0x9b76: 0x002d7888, 0x9b77: 0x00319488, + 0x9b78: 0xe0003b6e, 0x9b79: 0xe0003b6b, 0x9b7a: 0xe00037eb, 0x9b7b: 0xe0000950, + 0x9b7c: 0xe00009ea, 0x9b7d: 0xe00009e5, 0x9b7e: 0xe0000e19, 0x9b7f: 0xe0000e15, + // Block 0x26e, offset 0x9b80 + 0x9b80: 0xe0003809, 0x9b81: 0xe000098c, 0x9b82: 0xe000380c, 0x9b83: 0xe0000992, + 0x9b84: 0xe00038a0, 0x9b85: 0xe000389d, 0x9b86: 0xe00038a6, 0x9b87: 0xe00038a3, + 0x9b88: 0xe000390d, 0x9b89: 0xe000390a, 0x9b8a: 0xe0003913, 0x9b8b: 0xe0003910, + 0x9b8c: 0xe00039cd, 0x9b8d: 0xe00039ca, 0x9b8e: 0xe00039d3, 0x9b8f: 0xe00039d0, + 0x9b90: 0xe0000ee8, 0x9b91: 0xe0000ee5, 0x9b92: 0xe0000eee, 0x9b93: 0xe0000eeb, + 0x9b94: 0xe0003a8d, 0x9b95: 0xe0003a8a, 0x9b96: 0xe0003a93, 0x9b97: 0xe0003a90, + 0x9b98: 0xe0000f61, 0x9b99: 0xe0000f5e, 0x9b9a: 0xe0000fa5, 0x9b9b: 0xe0000fa2, + 0x9b9c: 0x00312288, 0x9b9d: 0x40312220, 0x9b9e: 0xe0003ae5, 0x9b9f: 0xe0003ae2, + 0x9ba0: 0x002ebc88, 0x9ba1: 0x402c8c20, 0x9ba2: 0x002f2288, 0x9ba3: 0x402f2220, + 0x9ba4: 0x00314088, 0x9ba5: 0x40314020, 0x9ba6: 0xe00037f9, 0x9ba7: 0xe000096c, + 0x9ba8: 0xe0003870, 0x9ba9: 0xe000386d, 0x9baa: 0xe000396a, 0x9bab: 0xe0003966, + 0x9bac: 0xe000398e, 0x9bad: 0xe000398a, 0x9bae: 0xe0003995, 0x9baf: 0xe0003992, + 0x9bb0: 0xe000399c, 0x9bb1: 0xe0003998, 0x9bb2: 0xe0001129, 0x9bb3: 0xe0001126, + 0x9bb4: 0x402e5e20, 0x9bb5: 0x402ed020, 0x9bb6: 0x40305a20, 0x9bb7: 0x402dd420, + 0x9bb8: 0xe0000abf, 0x9bb9: 0xe0000ec4, 0x9bba: 0x002be888, 0x9bbb: 0x002c4488, + 0x9bbc: 0x402c4420, 0x9bbd: 0x002e3888, 0x9bbe: 0x00303e88, 0x9bbf: 0x402ffc20, + // Block 0x26f, offset 0x9bc0 + 0x9bc0: 0x402f8220, 0x9bc1: 0x402fd820, 0x9bc2: 0x402ff420, 0x9bc3: 0x40300820, + 0x9bc4: 0x402df620, 0x9bc5: 0x40301a20, 0x9bc6: 0x40302420, 0x9bc7: 0x40306420, + 0x9bc8: 0x40305220, 0x9bc9: 0x40307c20, 0x9bca: 0x4030b420, 0x9bcb: 0x4030cc20, + 0x9bcc: 0x4030da20, 0x9bcd: 0x4030ee20, 0x9bce: 0x402e7a20, 0x9bcf: 0x40310820, + 0x9bd0: 0x40314820, 0x9bd1: 0x40315020, 0x9bd2: 0x40316420, 0x9bd3: 0x40318020, + 0x9bd4: 0x4031cc20, 0x9bd5: 0x4031e820, 0x9bd6: 0x40320a20, 0x9bd7: 0x40323220, + 0x9bd8: 0x40323a20, 0x9bd9: 0x402c1220, 0x9bda: 0x402cf820, 0x9bdb: 0x402d4c20, + 0x9bdc: 0x402d7020, 0x9bdd: 0x402de620, 0x9bde: 0x402e1a20, 0x9bdf: 0x402e2a20, + 0x9be0: 0x402f6220, 0x9be1: 0x4031fa20, 0x9be2: 0x40320220, 0x9be3: 0xe0000aca, + 0x9be4: 0xe0000adc, 0x9be5: 0xe0000ad9, 0x9be6: 0xe0000fcc, 0x9be7: 0xe0000fcf, + 0x9be8: 0xe0000fba, 0x9be9: 0xe0000ba1, 0x9bea: 0xe0000d11, 0x9beb: 0xe0000d18, + 0x9bec: 0x40324220, 0x9bed: 0x40324a20, 0x9bee: 0x40309020, 0x9bef: 0x40309820, + 0x9bf0: 0x002d6894, 0x9bf1: 0x002d8094, 0x9bf2: 0x002dcc94, 0x9bf3: 0x002f7a94, + 0x9bf4: 0x002f9894, 0x9bf5: 0x002fac94, 0x9bf6: 0x002fd894, 0x9bf7: 0x0030e294, + 0x9bf8: 0x00310094, 0x9bf9: 0x40064020, 0x9bfa: 0x40064420, 0x9bfb: 0x402bf620, + 0x9bfc: 0x4031de20, 0x9bfd: 0x402d9820, 0x9bfe: 0x4031e220, 0x9bff: 0x4031f020, + // Block 0x270, offset 0x9c00 + 0x9c00: 0xe000381a, 0x9c01: 0xe00009ae, 0x9c02: 0xe0000a22, 0x9c03: 0xe0000a1f, + 0x9c04: 0xe0000a28, 0x9c05: 0xe0000a25, 0x9c06: 0xe0000a2e, 0x9c07: 0xe0000a2b, + 0x9c08: 0xe0000a5a, 0x9c09: 0xe0000a56, 0x9c0a: 0xe0000a8c, 0x9c0b: 0xe0000a89, + 0x9c0c: 0xe0000a98, 0x9c0d: 0xe0000a95, 0x9c0e: 0xe0000aa4, 0x9c0f: 0xe0000aa1, + 0x9c10: 0xe0000a92, 0x9c11: 0xe0000a8f, 0x9c12: 0xe0000a9e, 0x9c13: 0xe0000a9b, + 0x9c14: 0xe0003893, 0x9c15: 0xe000388f, 0x9c16: 0xe000388b, 0x9c17: 0xe0003887, + 0x9c18: 0xe00038ba, 0x9c19: 0xe00038b7, 0x9c1a: 0xe00038c0, 0x9c1b: 0xe00038bd, + 0x9c1c: 0xe0003877, 0x9c1d: 0xe0003873, 0x9c1e: 0xe0000b8c, 0x9c1f: 0xe0000b89, + 0x9c20: 0xe0000bd0, 0x9c21: 0xe0000bcd, 0x9c22: 0xe0003af1, 0x9c23: 0xe0003aee, + 0x9c24: 0xe0003afd, 0x9c25: 0xe0003afa, 0x9c26: 0xe0003aeb, 0x9c27: 0xe0003ae8, + 0x9c28: 0xe0003af7, 0x9c29: 0xe0003af4, 0x9c2a: 0xe0003b03, 0x9c2b: 0xe0003b00, + 0x9c2c: 0xe000391f, 0x9c2d: 0xe000391c, 0x9c2e: 0xe00038eb, 0x9c2f: 0xe00038e7, + 0x9c30: 0xe0003b0c, 0x9c31: 0xe0003b09, 0x9c32: 0xe0003b1e, 0x9c33: 0xe0003b1b, + 0x9c34: 0xe0003b24, 0x9c35: 0xe0003b21, 0x9c36: 0xe0003b3c, 0x9c37: 0xe0003b39, + 0x9c38: 0xe0003b43, 0x9c39: 0xe0003b3f, 0x9c3a: 0xe0003b50, 0x9c3b: 0xe0003b4d, + 0x9c3c: 0xe0003b4a, 0x9c3d: 0xe0003b47, 0x9c3e: 0xe0003b56, 0x9c3f: 0xe0003b53, + // Block 0x271, offset 0x9c40 + 0x9c40: 0xe0003b5c, 0x9c41: 0xe0003b59, 0x9c42: 0xe0003b62, 0x9c43: 0xe0003b5f, + 0x9c44: 0xe0003b80, 0x9c45: 0xe0003b7d, 0x9c46: 0xe0003b8c, 0x9c47: 0xe0003b89, + 0x9c48: 0xe0003b98, 0x9c49: 0xe0003b95, 0x9c4a: 0xe0003b92, 0x9c4b: 0xe0003b8f, + 0x9c4c: 0xe000397e, 0x9c4d: 0xe000397a, 0x9c4e: 0xe0003986, 0x9c4f: 0xe0003982, + 0x9c50: 0xe00039c0, 0x9c51: 0xe00039bc, 0x9c52: 0xe00039b8, 0x9c53: 0xe00039b4, + 0x9c54: 0xe0003b9e, 0x9c55: 0xe0003b9b, 0x9c56: 0xe0003ba4, 0x9c57: 0xe0003ba1, + 0x9c58: 0xe0000ed6, 0x9c59: 0xe0000ed3, 0x9c5a: 0xe0000ef4, 0x9c5b: 0xe0000ef1, + 0x9c5c: 0xe0000efb, 0x9c5d: 0xe0000ef7, 0x9c5e: 0xe0000f02, 0x9c5f: 0xe0000eff, + 0x9c60: 0xe0000f41, 0x9c61: 0xe0000f3e, 0x9c62: 0xe0000f53, 0x9c63: 0xe0000f50, + 0x9c64: 0xe0000f26, 0x9c65: 0xe0000f22, 0x9c66: 0xe0000f3a, 0x9c67: 0xe0000f36, + 0x9c68: 0xe0000f5a, 0x9c69: 0xe0000f56, 0x9c6a: 0xe0000f93, 0x9c6b: 0xe0000f90, + 0x9c6c: 0xe0000f9f, 0x9c6d: 0xe0000f9c, 0x9c6e: 0xe0000fb1, 0x9c6f: 0xe0000fae, + 0x9c70: 0xe0000fab, 0x9c71: 0xe0000fa8, 0x9c72: 0xe0003acd, 0x9c73: 0xe0003aca, + 0x9c74: 0xe0003ad9, 0x9c75: 0xe0003ad6, 0x9c76: 0xe0003ad3, 0x9c77: 0xe0003ad0, + 0x9c78: 0xe0003a6c, 0x9c79: 0xe0003a68, 0x9c7a: 0xe0003a80, 0x9c7b: 0xe0003a7c, + 0x9c7c: 0xe00010a9, 0x9c7d: 0xe00010a6, 0x9c7e: 0xe00010af, 0x9c7f: 0xe00010ac, + // Block 0x272, offset 0x9c80 + 0x9c80: 0xe0003bb0, 0x9c81: 0xe0003bad, 0x9c82: 0xe0003baa, 0x9c83: 0xe0003ba7, + 0x9c84: 0xe0003bbf, 0x9c85: 0xe0003bbc, 0x9c86: 0xe0003bc5, 0x9c87: 0xe0003bc2, + 0x9c88: 0xe0003bcb, 0x9c89: 0xe0003bc8, 0x9c8a: 0xe00010fc, 0x9c8b: 0xe00010f9, + 0x9c8c: 0xe00010f6, 0x9c8d: 0xe00010f3, 0x9c8e: 0xe0001123, 0x9c8f: 0xe0001120, + 0x9c90: 0xe0001141, 0x9c91: 0xe000113e, 0x9c92: 0xe0001153, 0x9c93: 0xe0001150, + 0x9c94: 0xe0001159, 0x9c95: 0xe0001156, 0x9c96: 0xe0003b06, 0x9c97: 0xe0000f8d, + 0x9c98: 0xe0003bb9, 0x9c99: 0xe0001111, 0x9c9a: 0xf0000404, 0x9c9b: 0xe0000f70, + 0x9c9c: 0x40300420, 0x9c9d: 0x40300620, 0x9c9e: 0xe0000f7f, 0x9c9f: 0x402c9620, + 0x9ca0: 0xe000380f, 0x9ca1: 0xe0000998, 0x9ca2: 0xe0003806, 0x9ca3: 0xe0000986, + 0x9ca4: 0xe00037d5, 0x9ca5: 0xe0000924, 0x9ca6: 0xe00037d9, 0x9ca7: 0xe000092c, + 0x9ca8: 0xe00037e1, 0x9ca9: 0xe000093c, 0x9caa: 0xe00037dd, 0x9cab: 0xe0000934, + 0x9cac: 0xe0003816, 0x9cad: 0xe00009a6, 0x9cae: 0xe00037c2, 0x9caf: 0xe00008fe, + 0x9cb0: 0xe00037c6, 0x9cb1: 0xe0000906, 0x9cb2: 0xe00037ce, 0x9cb3: 0xe0000916, + 0x9cb4: 0xe00037ca, 0x9cb5: 0xe000090e, 0x9cb6: 0xe0003812, 0x9cb7: 0xe000099e, + 0x9cb8: 0xe00038ac, 0x9cb9: 0xe00038a9, 0x9cba: 0xe000389a, 0x9cbb: 0xe0003897, + 0x9cbc: 0xe0003864, 0x9cbd: 0xe0003861, 0x9cbe: 0xe0003839, 0x9cbf: 0xe0003835, + // Block 0x273, offset 0x9cc0 + 0x9cc0: 0xe0003841, 0x9cc1: 0xe000383d, 0x9cc2: 0xe0003851, 0x9cc3: 0xe000384d, + 0x9cc4: 0xe0003849, 0x9cc5: 0xe0003845, 0x9cc6: 0xe00038b3, 0x9cc7: 0xe00038af, + 0x9cc8: 0xe0003907, 0x9cc9: 0xe0003904, 0x9cca: 0xe0003919, 0x9ccb: 0xe0003916, + 0x9ccc: 0xe0003a07, 0x9ccd: 0xe0003a04, 0x9cce: 0xe00039c7, 0x9ccf: 0xe00039c4, + 0x9cd0: 0xe000393e, 0x9cd1: 0xe000393a, 0x9cd2: 0xe0003946, 0x9cd3: 0xe0003942, + 0x9cd4: 0xe0003956, 0x9cd5: 0xe0003952, 0x9cd6: 0xe000394e, 0x9cd7: 0xe000394a, + 0x9cd8: 0xe0003a0e, 0x9cd9: 0xe0003a0a, 0x9cda: 0xe00039e0, 0x9cdb: 0xe00039dc, + 0x9cdc: 0xe00039e8, 0x9cdd: 0xe00039e4, 0x9cde: 0xe00039f8, 0x9cdf: 0xe00039f4, + 0x9ce0: 0xe00039f0, 0x9ce1: 0xe00039ec, 0x9ce2: 0xe0003a00, 0x9ce3: 0xe00039fc, + 0x9ce4: 0xe0003ac7, 0x9ce5: 0xe0003ac4, 0x9ce6: 0xe0003a87, 0x9ce7: 0xe0003a84, + 0x9ce8: 0xe0003aa0, 0x9ce9: 0xe0003a9c, 0x9cea: 0xe0003aa8, 0x9ceb: 0xe0003aa4, + 0x9cec: 0xe0003ab8, 0x9ced: 0xe0003ab4, 0x9cee: 0xe0003ab0, 0x9cef: 0xe0003aac, + 0x9cf0: 0xe0003ac0, 0x9cf1: 0xe0003abc, 0x9cf2: 0xe0001108, 0x9cf3: 0xe0001105, + 0x9cf4: 0xe0001135, 0x9cf5: 0xe0001132, 0x9cf6: 0xe000112f, 0x9cf7: 0xe000112c, + 0x9cf8: 0xe000111d, 0x9cf9: 0xe000111a, 0x9cfa: 0xe0000d0a, 0x9cfb: 0xe0000d07, + 0x9cfc: 0x0030d888, 0x9cfd: 0x4030d820, 0x9cfe: 0x00312088, 0x9cff: 0x40312020, + // Block 0x274, offset 0x9d00 + 0x9d00: 0xe00009bc, 0x9d01: 0xe00009c0, 0x9d02: 0x002c3a8b, 0x9d03: 0xf0000a04, + 0x9d04: 0x40081c20, 0x9d05: 0xe0000a5e, 0x9d06: 0xe0000a62, 0x9d07: 0x002cc28a, + 0x9d08: 0x40081e20, 0x9d09: 0xf0000a04, 0x9d0a: 0x002d2285, 0x9d0b: 0x002d688b, + 0x9d0c: 0x002d688b, 0x9d0d: 0x002d688b, 0x9d0e: 0x002d6885, 0x9d0f: 0xf0000202, + 0x9d10: 0x002d9a8b, 0x9d11: 0x002d9a8b, 0x9d12: 0x002e228b, 0x9d13: 0x002e2285, + 0x9d14: 0x40082020, 0x9d15: 0x002e9e8b, 0x9d16: 0xe000281e, 0x9d17: 0x40082220, + 0x9d18: 0x40082420, 0x9d19: 0x002f2c8b, 0x9d1a: 0x002f568b, 0x9d1b: 0x002f7a8b, + 0x9d1c: 0x002f7a8b, 0x9d1d: 0x002f7a8b, 0x9d1e: 0x40082620, 0x9d1f: 0x40082820, + 0x9d20: 0xe0002833, 0x9d21: 0xe0000fbd, 0x9d22: 0xe0002842, 0x9d23: 0x40082a20, + 0x9d24: 0x00312a8b, 0x9d25: 0x40082c20, 0x9d26: 0x0032a288, 0x9d27: 0x40082e20, + 0x9d28: 0x00312a8b, 0x9d29: 0x40083020, 0x9d2a: 0x002bea83, 0x9d2b: 0xe00037e8, + 0x9d2c: 0x002c0a8b, 0x9d2d: 0x002c3a8b, 0x9d2e: 0x40083220, 0x9d2f: 0x002c9885, + 0x9d30: 0x002c988b, 0x9d31: 0x002d088b, 0x9d32: 0x002d1e88, 0x9d33: 0x002e828b, + 0x9d34: 0x002ee285, 0x9d35: 0x00389084, 0x9d36: 0x00389284, 0x9d37: 0x00389484, + 0x9d38: 0x00389684, 0x9d39: 0x002d9a85, 0x9d3a: 0x40083420, 0x9d3b: 0xe0000b95, + 0x9d3c: 0x00327e85, 0x9d3d: 0x00325685, 0x9d3e: 0x0032568b, 0x9d3f: 0x00327e8b, + // Block 0x275, offset 0x9d40 + 0x9d40: 0xe0000024, 0x9d41: 0xe0000029, 0x9d42: 0xe000002e, 0x9d43: 0xe0000033, + 0x9d44: 0xe0000038, 0x9d45: 0xe000003d, 0x9d46: 0xe0000042, 0x9d47: 0xe0000047, + 0x9d48: 0xf0001f04, 0x9d49: 0xf0001f04, 0x9d4a: 0xf0001f04, 0x9d4b: 0xf0001f04, + 0x9d4c: 0xf0001f04, 0x9d4d: 0xf0001f04, 0x9d4e: 0xf0001f04, 0x9d4f: 0xf0001f04, + 0x9d50: 0xf0001f04, 0x9d51: 0xf0000404, 0x9d52: 0xf0000404, 0x9d53: 0xf0000404, + 0x9d54: 0xf0000404, 0x9d55: 0xf0000404, 0x9d56: 0xf0000404, 0x9d57: 0xf0000404, + 0x9d58: 0xf0000404, 0x9d59: 0xf0000404, 0x9d5a: 0xf0000404, 0x9d5b: 0xf0000404, + 0x9d5c: 0xf0000404, 0x9d5d: 0xf0000404, 0x9d5e: 0xf0000404, 0x9d5f: 0xf0000404, + 0x9d60: 0xe000249f, 0x9d61: 0xf0000404, 0x9d62: 0xf0000404, 0x9d63: 0xe00024a7, + 0x9d64: 0xe00024af, 0x9d65: 0xf0000404, 0x9d66: 0xe00024b7, 0x9d67: 0xe0002bcc, + 0x9d68: 0xe0002bd4, 0x9d69: 0xe0002bdc, 0x9d6a: 0xe00024bf, 0x9d6b: 0xe0002be4, + 0x9d6c: 0xf0000404, 0x9d6d: 0xf0000404, 0x9d6e: 0xf0000404, 0x9d6f: 0xf0000404, + 0x9d70: 0xe0002bec, 0x9d71: 0xf0000404, 0x9d72: 0xe0002bfc, 0x9d73: 0xf0000404, + 0x9d74: 0xf0000404, 0x9d75: 0xf0000404, 0x9d76: 0x002bde8c, 0x9d77: 0x002c0a8c, + 0x9d78: 0x002c3a8c, 0x9d79: 0x002c628c, 0x9d7a: 0x002c988c, 0x9d7b: 0x002d088c, + 0x9d7c: 0x002d228c, 0x9d7d: 0x002d688c, 0x9d7e: 0x002d9a8c, 0x9d7f: 0x002dcc8c, + // Block 0x276, offset 0x9d80 + 0x9d80: 0xe000230b, 0x9d81: 0xe00022f8, 0x9d82: 0xe00022fc, 0x9d83: 0xe0002311, + 0x9d84: 0xe0002316, 0x9d85: 0xe000231d, 0x9d86: 0xe0002321, 0x9d87: 0xe0002325, + 0x9d88: 0xe000232b, 0x9d89: 0xf0001c1c, 0x9d8a: 0xe0002330, 0x9d8b: 0xe000233c, + 0x9d8c: 0xe0002340, 0x9d8d: 0xe0002337, 0x9d8e: 0xe0002346, 0x9d8f: 0xe000234b, + 0x9d90: 0xe000234f, 0x9d91: 0xe0002353, 0x9d92: 0xf0001c1c, 0x9d93: 0xe000235e, + 0x9d94: 0xe0002358, 0x9d95: 0xf0001c1c, 0x9d96: 0xe0002363, 0x9d97: 0xe000236d, + 0x9d98: 0xf0001f04, 0x9d99: 0xf0001f04, 0x9d9a: 0xf0001f04, 0x9d9b: 0xf0001f04, + 0x9d9c: 0xf0001f04, 0x9d9d: 0xf0001f04, 0x9d9e: 0xf0001f04, 0x9d9f: 0xf0001f04, + 0x9da0: 0xf0001f04, 0x9da1: 0xf0001f04, 0x9da2: 0xf0000404, 0x9da3: 0xf0000404, + 0x9da4: 0xf0000404, 0x9da5: 0xf0000404, 0x9da6: 0xf0000404, 0x9da7: 0xf0000404, + 0x9da8: 0xf0000404, 0x9da9: 0xf0000404, 0x9daa: 0xf0000404, 0x9dab: 0xf0000404, + 0x9dac: 0xf0000404, 0x9dad: 0xf0000404, 0x9dae: 0xf0000404, 0x9daf: 0xf0000404, + 0x9db0: 0xf0000404, 0x9db1: 0xe0000c1e, 0x9db2: 0xf0001c1c, 0x9db3: 0xe0002ec3, + 0x9db4: 0xe0000a31, 0x9db5: 0xe0002824, 0x9db6: 0xe000358c, 0x9db7: 0xe000325d, + 0x9db8: 0xe0000ac2, 0x9db9: 0xe0000ac6, 0x9dba: 0xe00027e8, 0x9dbb: 0xf0001c1c, + 0x9dbc: 0xf0001c1c, 0x9dbd: 0xf0001c1c, 0x9dbe: 0xf0001c1c, 0x9dbf: 0xe0002431, + // Block 0x277, offset 0x9dc0 + 0x9dc0: 0xe0003586, 0x9dc1: 0xe000356e, 0x9dc2: 0xf0001d1c, 0x9dc3: 0xe0003544, + 0x9dc4: 0xe00027f7, 0x9dc5: 0xe00027fa, 0x9dc6: 0xe000354a, 0x9dc7: 0xf0001d1d, + 0x9dc8: 0xe0000a6b, 0x9dc9: 0xe0000cb4, 0x9dca: 0xe000358f, 0x9dcb: 0xe0003571, + 0x9dcc: 0xf0001d1c, 0x9dcd: 0xf0001c1c, 0x9dce: 0xe0003553, 0x9dcf: 0xe00027fd, + 0x9dd0: 0xe00027ce, 0x9dd1: 0xe0000cb9, 0x9dd2: 0xe0000d36, 0x9dd3: 0xe0000be3, + 0x9dd4: 0xe0000fc5, 0x9dd5: 0xe00035ad, 0x9dd6: 0xe0003556, 0x9dd7: 0xe000325a, + 0x9dd8: 0xe0002803, 0x9dd9: 0xe0003526, 0x9dda: 0xe000357d, 0x9ddb: 0xe00035b0, + 0x9ddc: 0xe0003559, 0x9ddd: 0xe000304f, 0x9dde: 0xe0002806, 0x9ddf: 0xe0000d3e, + 0x9de0: 0xe0000a72, 0x9de1: 0xe000353e, 0x9de2: 0xe0000cbd, 0x9de3: 0xe0000d42, + 0x9de4: 0xe0000a76, 0x9de5: 0xe0003541, 0x9de6: 0xe0000cc1, 0x9de7: 0xe0000d2d, + 0x9de8: 0xe0000d31, 0x9de9: 0xe0003589, 0x9dea: 0xe0000cc5, 0x9deb: 0xe0000d4a, + 0x9dec: 0xe0000be7, 0x9ded: 0xe0000f0b, 0x9dee: 0xe0000f0f, 0x9def: 0xe0000f15, + 0x9df0: 0xe000282d, 0x9df1: 0xe0002821, 0x9df2: 0xf0001c1c, 0x9df3: 0xe000281b, + 0x9df4: 0xe0003592, 0x9df5: 0xe0003580, 0x9df6: 0xf0001d1c, 0x9df7: 0xe000355c, + 0x9df8: 0xe000280f, 0x9df9: 0xe000355f, 0x9dfa: 0xe0003595, 0x9dfb: 0xe0003583, + 0x9dfc: 0xe00035b6, 0x9dfd: 0xe0003565, 0x9dfe: 0xe0002812, 0x9dff: 0xe0003568, + // Block 0x278, offset 0x9e00 + 0x9e00: 0xe0002815, 0x9e01: 0xe000356b, 0x9e02: 0xe00009b7, 0x9e03: 0xf0001c1d, + 0x9e04: 0xf0001c1c, 0x9e05: 0xf0001c1c, 0x9e06: 0xe0000a66, 0x9e07: 0xe0000a7a, + 0x9e08: 0xf0001d1c, 0x9e09: 0xf0001c1d, 0x9e0a: 0xe00027c2, 0x9e0b: 0xe00027c8, + 0x9e0c: 0xe00027e5, 0x9e0d: 0xe0002800, 0x9e0e: 0xe0002809, 0x9e0f: 0xe000280c, + 0x9e10: 0xe0003538, 0x9e11: 0xe000353b, 0x9e12: 0xe0000d0d, 0x9e13: 0xe0002818, + 0x9e14: 0xe0003547, 0x9e15: 0xe0000d3a, 0x9e16: 0xe0000d46, 0x9e17: 0xe0002827, + 0x9e18: 0xe0000eb0, 0x9e19: 0xe0000eb8, 0x9e1a: 0xe000282a, 0x9e1b: 0xf0001c1c, + 0x9e1c: 0xf0001c1d, 0x9e1d: 0xe0003598, 0x9e1e: 0xe00010b2, 0x9e1f: 0xe00009c8, + 0x9e20: 0xf0001f04, 0x9e21: 0xf0001f04, 0x9e22: 0xf0001f04, 0x9e23: 0xf0001f04, + 0x9e24: 0xf0001f04, 0x9e25: 0xf0001f04, 0x9e26: 0xf0001f04, 0x9e27: 0xf0001f04, + 0x9e28: 0xf0001f04, 0x9e29: 0xf0000404, 0x9e2a: 0xf0000404, 0x9e2b: 0xf0000404, + 0x9e2c: 0xf0000404, 0x9e2d: 0xf0000404, 0x9e2e: 0xf0000404, 0x9e2f: 0xf0000404, + 0x9e30: 0xf0000404, 0x9e31: 0xf0000404, 0x9e32: 0xf0000404, 0x9e33: 0xf0000404, + 0x9e34: 0xf0000404, 0x9e35: 0xf0000404, 0x9e36: 0xf0000404, 0x9e37: 0xf0000404, + 0x9e38: 0xf0000404, 0x9e39: 0xf0000404, 0x9e3a: 0xf0000404, 0x9e3b: 0xf0000404, + 0x9e3c: 0xf0000404, 0x9e3d: 0xf0000404, 0x9e3e: 0xf0000404, 0x9e3f: 0xe0000bdf, + // Block 0x279, offset 0x9e40 + 0x9e40: 0xf0000404, 0x9e41: 0xe00026cf, 0x9e42: 0xe0003523, 0x9e43: 0xe0000b99, + 0x9e44: 0xe0000b9d, 0x9e45: 0xe0000f83, 0x9e46: 0xf0000404, + 0x9e53: 0xf0000404, + 0x9e54: 0xf0000404, 0x9e55: 0xf0000404, 0x9e56: 0xf0000404, 0x9e57: 0xf0000404, + 0x9e5d: 0xe000150b, 0x9e5e: 0xa1a09602, 0x9e5f: 0xe0001514, + 0x9e60: 0x0038ae85, 0x9e61: 0x00389085, 0x9e62: 0x00389685, 0x9e63: 0x00389885, + 0x9e64: 0x0038a485, 0x9e65: 0x0038a685, 0x9e66: 0x0038a885, 0x9e67: 0x0038b685, + 0x9e68: 0x0038ba85, 0x9e69: 0x00093885, 0x9e6a: 0xe0001542, 0x9e6b: 0xe000153f, + 0x9e6c: 0xe000154c, 0x9e6d: 0xe0001548, 0x9e6e: 0xe00014e1, 0x9e6f: 0xe00014e4, + 0x9e70: 0xe00014e7, 0x9e71: 0xe00014ea, 0x9e72: 0xe00014f0, 0x9e73: 0xe00014f3, + 0x9e74: 0xe00014f6, 0x9e75: 0xe00014fc, 0x9e76: 0xe0001505, + 0x9e78: 0xe0001508, 0x9e79: 0xe000150e, 0x9e7a: 0xe000151b, 0x9e7b: 0xe0001518, + 0x9e7c: 0xe0001521, 0x9e7e: 0xe0001524, + // Block 0x27a, offset 0x9e80 + 0x9e80: 0xf0001f04, 0x9e81: 0xf0001f04, 0x9e82: 0xf0001f04, 0x9e83: 0xf0001f04, + 0x9e84: 0xf0001f04, 0x9e85: 0xf0001f04, 0x9e86: 0xf0001f04, 0x9e87: 0xf0001f04, + 0x9e88: 0xf0001f04, 0x9e89: 0xf0001f04, 0x9e8a: 0xf0001f04, + 0x9e90: 0xf0000a04, 0x9e91: 0xf0000a04, 0x9e92: 0xf0000a04, 0x9e93: 0xf0000a04, + 0x9e94: 0xe00024a3, 0x9e95: 0xf0000a04, 0x9e96: 0xf0000a04, 0x9e97: 0xe00024ab, + 0x9e98: 0xe00024b3, 0x9e99: 0xf0000a04, 0x9e9a: 0xe00024bb, 0x9e9b: 0xe0002bd0, + 0x9e9c: 0xe0002bd8, 0x9e9d: 0xe0002be0, 0x9e9e: 0xe00024c3, 0x9e9f: 0xe0002be8, + 0x9ea0: 0xf0000a04, 0x9ea1: 0xf0000a04, 0x9ea2: 0xf0000a04, 0x9ea3: 0xf0000a04, + 0x9ea4: 0xe0002bf0, 0x9ea5: 0xf0000a04, 0x9ea6: 0xe0002c00, 0x9ea7: 0xf0000a04, + 0x9ea8: 0xf0000a04, 0x9ea9: 0xf0000a04, 0x9eaa: 0xf0000a04, 0x9eab: 0x002c3a8c, + 0x9eac: 0x002f7a8c, 0x9ead: 0xf0000c0c, 0x9eae: 0xe000359e, + 0x9eb0: 0x002bde9d, 0x9eb1: 0x002c0a9d, 0x9eb2: 0x002c3a9d, 0x9eb3: 0x002c629d, + 0x9eb4: 0x002c989d, 0x9eb5: 0x002d089d, 0x9eb6: 0x002d229d, 0x9eb7: 0x002d689d, + 0x9eb8: 0x002d9a9d, 0x9eb9: 0x002dcc9d, 0x9eba: 0x002dfe9d, 0x9ebb: 0x002e229d, + 0x9ebc: 0x002e829d, 0x9ebd: 0x002e9e9d, 0x9ebe: 0x002ee29d, 0x9ebf: 0x002f2c9d, + // Block 0x27b, offset 0x9ec0 + 0x9ec0: 0x002f569d, 0x9ec1: 0x002f7a9d, 0x9ec2: 0x002fe69d, 0x9ec3: 0x00302c9d, + 0x9ec4: 0x00306c9d, 0x9ec5: 0x0030be9d, 0x9ec6: 0x0030e29d, 0x9ec7: 0x0030f69d, + 0x9ec8: 0x0031009d, 0x9ec9: 0x00312a9d, 0x9eca: 0xe00027cb, 0x9ecb: 0xe0003562, + 0x9ecc: 0xf0001d1d, 0x9ecd: 0xf0001d1d, 0x9ece: 0xe0000ebc, 0x9ecf: 0xe000359b, + 0x9ed0: 0x002bde8c, 0x9ed1: 0x002c0a8c, 0x9ed2: 0x002c3a8c, 0x9ed3: 0x002c628c, + 0x9ed4: 0x002c988c, 0x9ed5: 0x002d088c, 0x9ed6: 0x002d228c, 0x9ed7: 0x002d688c, + 0x9ed8: 0x002d9a8c, 0x9ed9: 0x002dcc8c, 0x9eda: 0x002dfe8c, 0x9edb: 0x002e228c, + 0x9edc: 0x002e828c, 0x9edd: 0x002e9e8c, 0x9ede: 0x002ee28c, 0x9edf: 0x002f2c8c, + 0x9ee0: 0x002f568c, 0x9ee1: 0x002f7a8c, 0x9ee2: 0x002fe68c, 0x9ee3: 0x00302c8c, + 0x9ee4: 0x00306c8c, 0x9ee5: 0x0030be8c, 0x9ee6: 0x0030e28c, 0x9ee7: 0x0030f68c, + 0x9ee8: 0x0031008c, 0x9ee9: 0x00312a8c, 0x9eea: 0xe000354d, 0x9eeb: 0xe0003550, + 0x9ef0: 0x002bde9d, 0x9ef1: 0x002c0a9d, 0x9ef2: 0x002c3a9d, 0x9ef3: 0x002c629d, + 0x9ef4: 0x002c989d, 0x9ef5: 0x002d089d, 0x9ef6: 0x002d229d, 0x9ef7: 0x002d689d, + 0x9ef8: 0x002d9a9d, 0x9ef9: 0x002dcc9d, 0x9efa: 0x002dfe9d, 0x9efb: 0x002e229d, + 0x9efc: 0x002e829d, 0x9efd: 0x002e9e9d, 0x9efe: 0x002ee29d, 0x9eff: 0x002f2c9d, + // Block 0x27c, offset 0x9f00 + 0x9f00: 0x40055620, 0x9f01: 0xa1809102, 0x9f02: 0xa1909002, 0x9f03: 0x40055820, + 0x9f04: 0xae600000, 0x9f05: 0xadc00000, 0x9f06: 0x40055a20, 0x9f07: 0xa1208d02, + 0x9f10: 0x40389020, 0x9f11: 0x40389220, 0x9f12: 0x40389420, 0x9f13: 0x40389620, + 0x9f14: 0x40389820, 0x9f15: 0x40389a20, 0x9f16: 0x40389c20, 0x9f17: 0x40389e20, + 0x9f18: 0x4038a020, 0x9f19: 0x4038a220, 0x9f1a: 0x0038a499, 0x9f1b: 0x4038a420, + 0x9f1c: 0x4038a620, 0x9f1d: 0x0038a899, 0x9f1e: 0x4038a820, 0x9f1f: 0x0038aa99, + 0x9f20: 0x4038aa20, 0x9f21: 0x4038ac20, 0x9f22: 0x4038ae20, 0x9f23: 0x0038b099, + 0x9f24: 0x4038b020, 0x9f25: 0x0038b299, 0x9f26: 0x4038b220, 0x9f27: 0x4038b420, + 0x9f28: 0x4038b620, 0x9f29: 0x4038b820, 0x9f2a: 0x4038ba20, + 0x9f30: 0xe00014ff, 0x9f31: 0xe0001502, 0x9f32: 0xe0001511, 0x9f33: 0x4003d21f, + 0x9f34: 0x4003e01f, + // Block 0x27d, offset 0x9f40 + 0x9f40: 0xa000f202, 0x9f41: 0x403fba21, 0x9f42: 0x403fba20, 0x9f43: 0x403fbc20, + 0x9f44: 0x403fbc20, 0x9f45: 0x403fbe20, 0x9f46: 0x403fc020, 0x9f47: 0x403fcc20, + 0x9f48: 0x403fce20, 0x9f49: 0x403fd020, 0x9f4a: 0x403fd220, 0x9f4b: 0x403fd420, + 0x9f4c: 0x403fd820, 0x9f4d: 0x403fdc20, 0x9f4e: 0x403fde20, 0x9f4f: 0x403fe020, + 0x9f50: 0x403fe220, 0x9f51: 0x403fe420, 0x9f52: 0x403fe620, 0x9f53: 0x403fe820, + 0x9f54: 0x403fea20, 0x9f55: 0x403fec20, 0x9f56: 0x403fee20, 0x9f57: 0x403ff020, + 0x9f58: 0x403ff420, 0x9f59: 0x403ff620, 0x9f5a: 0x403ff820, 0x9f5b: 0x403ffa20, + 0x9f5c: 0x403ffc20, 0x9f5d: 0x40400220, 0x9f5e: 0x40400420, 0x9f5f: 0x40400620, + 0x9f60: 0x40400820, 0x9f61: 0x40400a20, 0x9f62: 0x40400e20, 0x9f63: 0x40401020, + 0x9f64: 0x40401220, 0x9f65: 0x40401420, 0x9f66: 0x40401620, 0x9f67: 0x40401820, + 0x9f68: 0x40401a20, 0x9f69: 0xe0001830, 0x9f6a: 0x40401c20, 0x9f6b: 0x40401e20, + 0x9f6c: 0x40402020, 0x9f6d: 0x40402420, 0x9f6e: 0x40402620, 0x9f6f: 0x40402820, + 0x9f70: 0x40402c20, 0x9f71: 0xe0001839, 0x9f72: 0x40402e20, 0x9f73: 0x40403020, + 0x9f74: 0xe000183c, 0x9f75: 0x40403220, 0x9f76: 0x40403420, 0x9f77: 0x40403620, + 0x9f78: 0x40403820, 0x9f79: 0x40403a20, 0x9f7a: 0x40404c20, 0x9f7b: 0x40404e20, + 0x9f7c: 0xa070f102, 0x9f7d: 0x40403c20, 0x9f7e: 0x40404a20, 0x9f7f: 0x40405620, + // Block 0x27e, offset 0x9f80 + 0x9f80: 0xa0000000, 0x9f81: 0xa0000000, 0x9f82: 0xa0000000, 0x9f83: 0xa0000000, + 0x9f84: 0xa0000000, 0x9f85: 0xa0000000, 0x9f86: 0xa0000000, 0x9f87: 0xa0000000, + 0x9f88: 0xa0000000, 0x9f89: 0x40020020, 0x9f8a: 0x40020220, 0x9f8b: 0x40020420, + 0x9f8c: 0x40020620, 0x9f8d: 0x40020820, 0x9f8e: 0xa0000000, 0x9f8f: 0xa0000000, + 0x9f90: 0xa0000000, 0x9f91: 0xa0000000, 0x9f92: 0xa0000000, 0x9f93: 0xa0000000, + 0x9f94: 0xa0000000, 0x9f95: 0xa0000000, 0x9f96: 0xa0000000, 0x9f97: 0xa0000000, + 0x9f98: 0xa0000000, 0x9f99: 0xa0000000, 0x9f9a: 0xa0000000, 0x9f9b: 0xa0000000, + 0x9f9c: 0xa0000000, 0x9f9d: 0xa0000000, 0x9f9e: 0xa0000000, 0x9f9f: 0xa0000000, + 0x9fa0: 0x40021220, 0x9fa1: 0x4002ba20, 0x9fa2: 0x4003e020, 0x9fa3: 0x4004ea20, + 0x9fa4: 0x4027de20, 0x9fa5: 0x4004ec20, 0x9fa6: 0x4004e620, 0x9fa7: 0x4003d220, + 0x9fa8: 0x4003f420, 0x9fa9: 0x4003f620, 0x9faa: 0x4004d820, 0x9fab: 0x40093820, + 0x9fac: 0x40024020, 0x9fad: 0x40021a20, 0x9fae: 0x4002e420, 0x9faf: 0x4004e220, + 0x9fb0: 0x4029cc20, 0x9fb1: 0x4029ce20, 0x9fb2: 0x4029d020, 0x9fb3: 0x4029d220, + 0x9fb4: 0x4029d420, 0x9fb5: 0x4029d620, 0x9fb6: 0x4029d820, 0x9fb7: 0x4029da20, + 0x9fb8: 0x4029dc20, 0x9fb9: 0x4029de20, 0x9fba: 0x40026c20, 0x9fbb: 0x40026220, + 0x9fbc: 0x40094020, 0x9fbd: 0x40094220, 0x9fbe: 0x40094420, 0x9fbf: 0x4002c420, + // Block 0x27f, offset 0x9fc0 + 0x9fc0: 0x4004d620, 0x9fc1: 0x002bde88, 0x9fc2: 0x002c0a88, 0x9fc3: 0xc5872851, + 0x9fc4: 0xc58d28d3, 0x9fc5: 0x002c9888, 0x9fc6: 0x002d0888, 0x9fc7: 0x002d2288, + 0x9fc8: 0x002d6888, 0x9fc9: 0x002d9a88, 0x9fca: 0x002dcc88, 0x9fcb: 0x002dfe88, + 0x9fcc: 0xc59229a4, 0x9fcd: 0x002e8288, 0x9fce: 0xc5972a12, 0x9fcf: 0x002ee288, + 0x9fd0: 0x002f2c88, 0x9fd1: 0x002f5688, 0x9fd2: 0x002f7a88, 0x9fd3: 0xc3430991, + 0x9fd4: 0x00302c88, 0x9fd5: 0x00306c88, 0x9fd6: 0x0030be88, 0x9fd7: 0x0030e288, + 0x9fd8: 0x0030f688, 0x9fd9: 0x00310088, 0x9fda: 0xc3630991, 0x9fdb: 0x4003f820, + 0x9fdc: 0x4004e420, 0x9fdd: 0x4003fa20, 0x9fde: 0x40062420, 0x9fdf: 0x40021620, + 0x9fe0: 0x40061e20, 0x9fe1: 0x402bde20, 0x9fe2: 0x402c0a20, 0x9fe3: 0xc5842851, + 0x9fe4: 0xc58a2882, 0x9fe5: 0x402c9820, 0x9fe6: 0x402d0820, 0x9fe7: 0x402d2220, + 0x9fe8: 0x402d6820, 0x9fe9: 0x402d9a20, 0x9fea: 0x402dcc20, 0x9feb: 0x402dfe20, + 0x9fec: 0xc3772953, 0x9fed: 0x402e8220, 0x9fee: 0xc5272a01, 0x9fef: 0x402ee220, + 0x9ff0: 0x402f2c20, 0x9ff1: 0x402f5620, 0x9ff2: 0x402f7a20, 0x9ff3: 0xc3410991, + 0x9ff4: 0x40302c20, 0x9ff5: 0x40306c20, 0x9ff6: 0x4030be20, 0x9ff7: 0x4030e220, + 0x9ff8: 0x4030f620, 0x9ff9: 0x40310020, 0x9ffa: 0xc3610991, 0x9ffb: 0x4003fc20, + 0x9ffc: 0x40094820, 0x9ffd: 0x4003fe20, 0x9ffe: 0x40094c20, 0x9fff: 0xa0000000, + // Block 0x280, offset 0xa000 + 0xa000: 0xe0000983, 0xa001: 0xe0000980, 0xa002: 0xe00008fb, 0xa003: 0xe00008f8, + 0xa004: 0xe000097d, 0xa005: 0xe000097a, 0xa006: 0x002c3e83, 0xa007: 0x402c3e20, + 0xa008: 0xe0000a3e, 0xa009: 0xe0000a3b, 0xa00a: 0xe0000a4a, 0xa00b: 0xe0000a47, + 0xa00c: 0x002c3c83, 0xa00d: 0x402c3c20, 0xa00e: 0xe0000a86, 0xa00f: 0xe0000a83, + 0xa010: 0x002c6683, 0xa011: 0x402c6620, 0xa012: 0xe0000b46, 0xa013: 0xe0000b43, + 0xa014: 0xe0000aee, 0xa015: 0xe0000aeb, 0xa016: 0xe0000b2c, 0xa017: 0xe0000b29, + 0xa018: 0xe0000b40, 0xa019: 0xe0000b3d, 0xa01a: 0xe0000b1a, 0xa01b: 0xe0000b17, + 0xa01c: 0xe0000bb8, 0xa01d: 0xe0000bb5, 0xa01e: 0xe0000bb2, 0xa01f: 0xe0000baf, + 0xa020: 0xe0000bc4, 0xa021: 0xe0000bc1, 0xa022: 0xe0000bca, 0xa023: 0xe0000bc7, + 0xa024: 0xe0000bee, 0xa025: 0xe0000beb, 0xa026: 0xe0000c1b, 0xa027: 0xe0000c18, + 0xa028: 0xe0000c51, 0xa029: 0xe0000c4e, 0xa02a: 0xe0000c60, 0xa02b: 0xe0000c5d, + 0xa02c: 0xe0000c31, 0xa02d: 0xe0000c2e, 0xa02e: 0xe0000c5a, 0xa02f: 0xe0000c57, + 0xa030: 0xe0000c54, 0xa031: 0x402da220, 0xa032: 0xf0000a0a, 0xa033: 0xf0000404, + 0xa034: 0xe0000c8a, 0xa035: 0xe0000c87, 0xa036: 0xe0000c9f, 0xa037: 0xe0000c9c, + 0xa038: 0x402f7220, 0xa039: 0xe0000ccc, 0xa03a: 0xe0000cc9, 0xa03b: 0xe0000cd8, + 0xa03c: 0xe0000cd5, 0xa03d: 0xe0000cd2, 0xa03e: 0xe0000ccf, 0xa03f: 0xe0000d04, + // Block 0x281, offset 0xa040 + 0xa040: 0xe0000cfe, 0xa041: 0xe0000cf8, 0xa042: 0xe0000cf5, 0xa043: 0xe0000d51, + 0xa044: 0xe0000d4e, 0xa045: 0xe0000d6f, 0xa046: 0xe0000d6c, 0xa047: 0xe0000d5d, + 0xa048: 0xe0000d5a, 0xa049: 0xf0000404, 0xa04a: 0x002eda88, 0xa04b: 0x402eda20, + 0xa04c: 0xe0000e2e, 0xa04d: 0xe0000e2b, 0xa04e: 0xe0000da0, 0xa04f: 0xe0000d9d, + 0xa050: 0xe0000de0, 0xa051: 0xe0000ddd, 0xa052: 0xe0000e93, 0xa053: 0xe0000e8f, + 0xa054: 0xe0000eca, 0xa055: 0xe0000ec7, 0xa056: 0xe0000edc, 0xa057: 0xe0000ed9, + 0xa058: 0xe0000ed0, 0xa059: 0xe0000ecd, 0xa05a: 0xe0000f1f, 0xa05b: 0xe0000f1c, + 0xa05c: 0xe0000f2d, 0xa05d: 0xe0000f2a, 0xa05e: 0xe0000f47, 0xa05f: 0xe0000f44, + 0xa060: 0x002fe883, 0xa061: 0x402fe820, 0xa062: 0xe0000f99, 0xa063: 0xe0000f96, + 0xa064: 0xe0000f8a, 0xa065: 0xe0000f87, 0xa066: 0x00303688, 0xa067: 0x40303620, + 0xa068: 0xe000102b, 0xa069: 0xe0001028, 0xa06a: 0xe000103f, 0xa06b: 0xe000103c, + 0xa06c: 0xe0000fe7, 0xa06d: 0xe0000fe4, 0xa06e: 0xe0000ff9, 0xa06f: 0xe0000ff6, + 0xa070: 0xe0001025, 0xa071: 0xe0001022, 0xa072: 0xe0001039, 0xa073: 0xe0001036, + 0xa074: 0xe00010d8, 0xa075: 0xe00010d5, 0xa076: 0xe000110e, 0xa077: 0xe000110b, + 0xa078: 0xe0001117, 0xa079: 0xe000113b, 0xa07a: 0xe0001138, 0xa07b: 0xe000114d, + 0xa07c: 0xe000114a, 0xa07d: 0x00312c83, 0xa07e: 0x40312c20, 0xa07f: 0xe0000f64, + // Block 0x282, offset 0xa080 + 0xa080: 0x40321220, 0xa081: 0x40321a20, 0xa082: 0x40322220, 0xa083: 0x40322a20, + 0xa084: 0x002c6487, 0xa085: 0x002c6485, 0xa086: 0x002c6483, 0xa087: 0x002e2487, + 0xa088: 0x002e2485, 0xa089: 0x002e2483, 0xa08a: 0x002ea087, 0xa08b: 0x002ea085, + 0xa08c: 0x002ea083, 0xa08d: 0xe0000947, 0xa08e: 0xe0000944, 0xa08f: 0xe0000c3d, + 0xa090: 0xe0000c3a, 0xa091: 0xe0000dcc, 0xa092: 0xe0000dc9, 0xa093: 0xe0000ff3, + 0xa094: 0xe0000ff0, 0xa095: 0xe000101e, 0xa096: 0xe000101a, 0xa097: 0xe0001006, + 0xa098: 0xe0001002, 0xa099: 0xe0001016, 0xa09a: 0xe0001012, 0xa09b: 0xe000100e, + 0xa09c: 0xe000100a, 0xa09d: 0x402cae20, 0xa09e: 0xe0000962, 0xa09f: 0xe000095e, + 0xa0a0: 0xe0000976, 0xa0a1: 0xe0000972, 0xa0a2: 0xe00009f4, 0xa0a3: 0xe00009ef, + 0xa0a4: 0x002d3a88, 0xa0a5: 0x402d3a20, 0xa0a6: 0xe0000bbe, 0xa0a7: 0xe0000bbb, + 0xa0a8: 0xe0000c99, 0xa0a9: 0xe0000c96, 0xa0aa: 0xe0000e20, 0xa0ab: 0xe0000e1d, + 0xa0ac: 0xe0000e27, 0xa0ad: 0xe0000e23, 0xa0ae: 0xe0001162, 0xa0af: 0xe000115f, + 0xa0b0: 0xe0000c8d, 0xa0b1: 0xf0000a0a, 0xa0b2: 0xf000040a, 0xa0b3: 0xf0000404, + 0xa0b4: 0xe0000bac, 0xa0b5: 0xe0000ba9, 0xa0b6: 0x002d7888, 0xa0b7: 0x00319488, + 0xa0b8: 0xe0000d57, 0xa0b9: 0xe0000d54, 0xa0ba: 0xe0000954, 0xa0bb: 0xe0000950, + 0xa0bc: 0xe00009ea, 0xa0bd: 0xe00009e5, 0xa0be: 0xe0000e19, 0xa0bf: 0xe0000e15, + // Block 0x283, offset 0xa0c0 + 0xa0c0: 0xe00009b1, 0xa0c1: 0xe00009ae, 0xa0c2: 0xe0000a22, 0xa0c3: 0xe0000a1f, + 0xa0c4: 0xe0000a28, 0xa0c5: 0xe0000a25, 0xa0c6: 0xe0000a2e, 0xa0c7: 0xe0000a2b, + 0xa0c8: 0xe0003bd1, 0xa0c9: 0xe0003bce, 0xa0ca: 0xe0000a8c, 0xa0cb: 0xe0000a89, + 0xa0cc: 0xe0000a98, 0xa0cd: 0xe0000a95, 0xa0ce: 0xe0000aa4, 0xa0cf: 0xe0000aa1, + 0xa0d0: 0xe0000a92, 0xa0d1: 0xe0000a8f, 0xa0d2: 0xe0000a9e, 0xa0d3: 0xe0000a9b, + 0xa0d4: 0xe0000b55, 0xa0d5: 0xe0000b51, 0xa0d6: 0xe0000b4d, 0xa0d7: 0xe0000b49, + 0xa0d8: 0xe0000b7c, 0xa0d9: 0xe0000b79, 0xa0da: 0xe0000b82, 0xa0db: 0xe0000b7f, + 0xa0dc: 0xe0000b39, 0xa0dd: 0xe0000b35, 0xa0de: 0xe0000b8c, 0xa0df: 0xe0000b89, + 0xa0e0: 0xe0000bd0, 0xa0e1: 0xe0000bcd, 0xa0e2: 0xe0000c00, 0xa0e3: 0xe0000bfd, + 0xa0e4: 0xe0000c0c, 0xa0e5: 0xe0000c09, 0xa0e6: 0xe0000bfa, 0xa0e7: 0xe0000bf7, + 0xa0e8: 0xe0000c06, 0xa0e9: 0xe0000c03, 0xa0ea: 0xe0000c12, 0xa0eb: 0xe0000c0f, + 0xa0ec: 0xe0000c7e, 0xa0ed: 0xe0000c7b, 0xa0ee: 0xe0000c4a, 0xa0ef: 0xe0000c46, + 0xa0f0: 0xe0000c93, 0xa0f1: 0xe0000c90, 0xa0f2: 0xe0000cab, 0xa0f3: 0xe0000ca8, + 0xa0f4: 0xe0000cb1, 0xa0f5: 0xe0000cae, 0xa0f6: 0xe0000cde, 0xa0f7: 0xe0000cdb, + 0xa0f8: 0xe0000ce5, 0xa0f9: 0xe0000ce1, 0xa0fa: 0xe0000cf2, 0xa0fb: 0xe0000cef, + 0xa0fc: 0xe0000cec, 0xa0fd: 0xe0000ce9, 0xa0fe: 0xe0000d1e, 0xa0ff: 0xe0000d1b, + // Block 0x284, offset 0xa100 + 0xa100: 0xa0000000, 0xa101: 0xa0000000, 0xa102: 0xa0000000, 0xa103: 0xa0000000, + 0xa104: 0xa0000000, 0xa105: 0xa0000000, 0xa106: 0xa0000000, 0xa107: 0xa0000000, + 0xa108: 0xa0000000, 0xa109: 0x40020020, 0xa10a: 0x40020220, 0xa10b: 0x40020420, + 0xa10c: 0x40020620, 0xa10d: 0x40020820, 0xa10e: 0xa0000000, 0xa10f: 0xa0000000, + 0xa110: 0xa0000000, 0xa111: 0xa0000000, 0xa112: 0xa0000000, 0xa113: 0xa0000000, + 0xa114: 0xa0000000, 0xa115: 0xa0000000, 0xa116: 0xa0000000, 0xa117: 0xa0000000, + 0xa118: 0xa0000000, 0xa119: 0xa0000000, 0xa11a: 0xa0000000, 0xa11b: 0xa0000000, + 0xa11c: 0xa0000000, 0xa11d: 0xa0000000, 0xa11e: 0xa0000000, 0xa11f: 0xa0000000, + 0xa120: 0x40021220, 0xa121: 0x4002ba20, 0xa122: 0x4003e020, 0xa123: 0x4004ea20, + 0xa124: 0x4027de20, 0xa125: 0x4004ec20, 0xa126: 0x4004e620, 0xa127: 0x4003d220, + 0xa128: 0x4003f420, 0xa129: 0x4003f620, 0xa12a: 0x4004d820, 0xa12b: 0x40093820, + 0xa12c: 0x40024020, 0xa12d: 0x40021a20, 0xa12e: 0x4002e420, 0xa12f: 0x4004e220, + 0xa130: 0x4029cc20, 0xa131: 0x4029ce20, 0xa132: 0x4029d020, 0xa133: 0x4029d220, + 0xa134: 0x4029d420, 0xa135: 0x4029d620, 0xa136: 0x4029d820, 0xa137: 0x4029da20, + 0xa138: 0x4029dc20, 0xa139: 0x4029de20, 0xa13a: 0x40026c20, 0xa13b: 0x40026220, + 0xa13c: 0x40094020, 0xa13d: 0x40094220, 0xa13e: 0x40094420, 0xa13f: 0x4002c420, + // Block 0x285, offset 0xa140 + 0xa140: 0x4004d620, 0xa141: 0x002bde88, 0xa142: 0x002c0a88, 0xa143: 0xc59d2a64, + 0xa144: 0xc5a72b14, 0xa145: 0x002c9888, 0xa146: 0x002d0888, 0xa147: 0xc5b32be4, + 0xa148: 0x002d6888, 0xa149: 0x002d9a88, 0xa14a: 0x002dcc88, 0xa14b: 0x002dfe88, + 0xa14c: 0xc5bd2cb6, 0xa14d: 0x002e8288, 0xa14e: 0xc5c72d84, 0xa14f: 0xc5cf0b21, + 0xa150: 0x002f2c88, 0xa151: 0x002f5688, 0xa152: 0x002f7a88, 0xa153: 0xc5d52e14, + 0xa154: 0xc5dd2ea4, 0xa155: 0xc5e50b21, 0xa156: 0x0030be88, 0xa157: 0x0030e288, + 0xa158: 0x0030f688, 0xa159: 0x00310088, 0xa15a: 0xc5eb2f34, 0xa15b: 0x4003f820, + 0xa15c: 0x4004e420, 0xa15d: 0x4003fa20, 0xa15e: 0x40062420, 0xa15f: 0x40021620, + 0xa160: 0x40061e20, 0xa161: 0x402bde20, 0xa162: 0x402c0a20, 0xa163: 0xc59a2a32, + 0xa164: 0xc5a22ac2, 0xa165: 0x402c9820, 0xa166: 0x402d0820, 0xa167: 0xc5b02bb2, + 0xa168: 0x402d6820, 0xa169: 0x402d9a20, 0xa16a: 0x402dcc20, 0xa16b: 0x402dfe20, + 0xa16c: 0xc5b82c44, 0xa16d: 0x402e8220, 0xa16e: 0xc5c42d52, 0xa16f: 0xc5cc0b21, + 0xa170: 0x402f2c20, 0xa171: 0x402f5620, 0xa172: 0x402f7a20, 0xa173: 0xc5d22de2, + 0xa174: 0xc5da2e72, 0xa175: 0xc5e20b21, 0xa176: 0x4030be20, 0xa177: 0x4030e220, + 0xa178: 0x4030f620, 0xa179: 0x40310020, 0xa17a: 0xc5e82f02, 0xa17b: 0x4003fc20, + 0xa17c: 0x40094820, 0xa17d: 0x4003fe20, 0xa17e: 0x40094c20, 0xa17f: 0xa0000000, + // Block 0x286, offset 0xa180 + 0xa180: 0xe00008f5, 0xa181: 0xe00008ef, 0xa182: 0xe0000921, 0xa183: 0xe0000969, + 0xa184: 0xe000095b, 0xa185: 0xe000094d, 0xa186: 0xe00009dd, 0xa187: 0xe0000a53, + 0xa188: 0xe0000ae8, 0xa189: 0xe0000ae2, 0xa18a: 0xe0000af4, 0xa18b: 0xe0000b20, + 0xa18c: 0xe0000c2b, 0xa18d: 0xe0000c25, 0xa18e: 0xe0000c37, 0xa18f: 0xe0000c43, + 0xa190: 0xe0000ab3, 0xa191: 0xe0000d63, 0xa192: 0xe0000d9a, 0xa193: 0xe0000d94, + 0xa194: 0xe0000da6, 0xa195: 0xe0000de6, 0xa196: 0x002ee483, 0xa197: 0x40093e20, + 0xa198: 0xe0000e12, 0xa199: 0xe0000fe1, 0xa19a: 0xe0000fdb, 0xa19b: 0xe0000fed, + 0xa19c: 0x00306e83, 0xa19d: 0xe0001102, 0xa19e: 0x00318888, 0xa19f: 0xe0000f7b, + 0xa1a0: 0xe00008f2, 0xa1a1: 0xe00008ec, 0xa1a2: 0xe000091e, 0xa1a3: 0xe0000966, + 0xa1a4: 0xe0000958, 0xa1a5: 0xe000094a, 0xa1a6: 0xe00009d5, 0xa1a7: 0xe0000a4d, + 0xa1a8: 0xe0000ae5, 0xa1a9: 0xe0000adf, 0xa1aa: 0xe0000af1, 0xa1ab: 0xe0000b1d, + 0xa1ac: 0xe0000c28, 0xa1ad: 0xe0000c22, 0xa1ae: 0xe0000c34, 0xa1af: 0xe0000c40, + 0xa1b0: 0xe0000aad, 0xa1b1: 0xe0000d60, 0xa1b2: 0xe0000d97, 0xa1b3: 0xe0000d91, + 0xa1b4: 0xe0000da3, 0xa1b5: 0xe0000de3, 0xa1b6: 0x402ee420, 0xa1b7: 0x40093c20, + 0xa1b8: 0xe0000e0f, 0xa1b9: 0xe0000fde, 0xa1ba: 0xe0000fd8, 0xa1bb: 0xe0000fea, + 0xa1bc: 0x40306e20, 0xa1bd: 0xe00010ff, 0xa1be: 0x40318820, 0xa1bf: 0xe0001114, + // Block 0x287, offset 0xa1c0 + 0xa1c0: 0xe0000cfe, 0xa1c1: 0xe0000cf8, 0xa1c2: 0xe0000cf5, 0xa1c3: 0xe0000d51, + 0xa1c4: 0xe0000d4e, 0xa1c5: 0xe0000d6f, 0xa1c6: 0xe0000d6c, 0xa1c7: 0xe0000d5d, + 0xa1c8: 0xe0000d5a, 0xa1c9: 0xf0000404, 0xa1ca: 0x002eda88, 0xa1cb: 0x402eda20, + 0xa1cc: 0xe0000e2e, 0xa1cd: 0xe0000e2b, 0xa1ce: 0xe0000da0, 0xa1cf: 0xe0000d9d, + 0xa1d0: 0x002ee4a3, 0xa1d1: 0x402ee421, 0xa1d2: 0xe0000e93, 0xa1d3: 0xe0000e8f, + 0xa1d4: 0xe0000eca, 0xa1d5: 0xe0000ec7, 0xa1d6: 0xe0000edc, 0xa1d7: 0xe0000ed9, + 0xa1d8: 0xe0000ed0, 0xa1d9: 0xe0000ecd, 0xa1da: 0xe0000f1f, 0xa1db: 0xe0000f1c, + 0xa1dc: 0xe0000f2d, 0xa1dd: 0xe0000f2a, 0xa1de: 0xe0000f47, 0xa1df: 0xe0000f44, + 0xa1e0: 0xe0000f33, 0xa1e1: 0xe0000f30, 0xa1e2: 0xe0000f99, 0xa1e3: 0xe0000f96, + 0xa1e4: 0xe0000f8a, 0xa1e5: 0xe0000f87, 0xa1e6: 0x00303688, 0xa1e7: 0x40303620, + 0xa1e8: 0xe000102b, 0xa1e9: 0xe0001028, 0xa1ea: 0xe000103f, 0xa1eb: 0xe000103c, + 0xa1ec: 0xe0000fe7, 0xa1ed: 0xe0000fe4, 0xa1ee: 0xe0000ff9, 0xa1ef: 0xe0000ff6, + 0xa1f0: 0x00306ea3, 0xa1f1: 0x40306e21, 0xa1f2: 0xe0001039, 0xa1f3: 0xe0001036, + 0xa1f4: 0xe00010d8, 0xa1f5: 0xe00010d5, 0xa1f6: 0xe000110e, 0xa1f7: 0xe000110b, + 0xa1f8: 0xe0001117, 0xa1f9: 0xe000113b, 0xa1fa: 0xe0001138, 0xa1fb: 0xe000114d, + 0xa1fc: 0xe000114a, 0xa1fd: 0xe0001147, 0xa1fe: 0xe0001144, 0xa1ff: 0xe0000f64, + // Block 0x288, offset 0xa200 + 0xa200: 0x40321220, 0xa201: 0x40321a20, 0xa202: 0x40322220, 0xa203: 0x40322a20, + 0xa204: 0xe0000ad5, 0xa205: 0xe0000ad1, 0xa206: 0xe0000acd, 0xa207: 0xf0000a0a, + 0xa208: 0xf000040a, 0xa209: 0xf0000404, 0xa20a: 0xf0000a0a, 0xa20b: 0xf000040a, + 0xa20c: 0xf0000404, 0xa20d: 0xe0000947, 0xa20e: 0xe0000944, 0xa20f: 0xe0000c3d, + 0xa210: 0xe0000c3a, 0xa211: 0xe0000dcc, 0xa212: 0xe0000dc9, 0xa213: 0xe0000ff3, + 0xa214: 0xe0000ff0, 0xa215: 0xe0002964, 0xa216: 0xe0002961, 0xa217: 0xe0002952, + 0xa218: 0xe000294f, 0xa219: 0xe000295e, 0xa21a: 0xe000295b, 0xa21b: 0xe0002958, + 0xa21c: 0xe0002955, 0xa21d: 0x402cae20, 0xa21e: 0xe0000962, 0xa21f: 0xe000095e, + 0xa220: 0xe0000976, 0xa221: 0xe0000972, 0xa222: 0xe00009f4, 0xa223: 0xe00009ef, + 0xa224: 0x002d3a88, 0xa225: 0x402d3a20, 0xa226: 0xe0000bbe, 0xa227: 0xe0000bbb, + 0xa228: 0xe0000c99, 0xa229: 0xe0000c96, 0xa22a: 0xe0000e20, 0xa22b: 0xe0000e1d, + 0xa22c: 0xe0000e27, 0xa22d: 0xe0000e23, 0xa22e: 0xe0001162, 0xa22f: 0xe000115f, + 0xa230: 0xe0000c8d, 0xa231: 0xf0000a0a, 0xa232: 0xf000040a, 0xa233: 0xf0000404, + 0xa234: 0xe0000bac, 0xa235: 0xe0000ba9, 0xa236: 0x002d7888, 0xa237: 0x00319488, + 0xa238: 0xe0000d57, 0xa239: 0xe0000d54, 0xa23a: 0xe0000954, 0xa23b: 0xe0000950, + 0xa23c: 0xe00009ea, 0xa23d: 0xe00009e5, 0xa23e: 0xe0000e19, 0xa23f: 0xe0000e15, + // Block 0x289, offset 0xa240 + 0xa240: 0xe000098f, 0xa241: 0xe000098c, 0xa242: 0xe0000995, 0xa243: 0xe0000992, + 0xa244: 0xe0000b62, 0xa245: 0xe0000b5f, 0xa246: 0xe0000b68, 0xa247: 0xe0000b65, + 0xa248: 0xe0000c6c, 0xa249: 0xe0000c69, 0xa24a: 0xe0000c72, 0xa24b: 0xe0000c6f, + 0xa24c: 0xe0000e4a, 0xa24d: 0xe0000e47, 0xa24e: 0xe0000e50, 0xa24f: 0xe0000e4d, + 0xa250: 0xe0000ee8, 0xa251: 0xe0000ee5, 0xa252: 0xe0000eee, 0xa253: 0xe0000eeb, + 0xa254: 0xe0001053, 0xa255: 0xe0001050, 0xa256: 0xe0001059, 0xa257: 0xe0001056, + 0xa258: 0xe0000f61, 0xa259: 0xe0000f5e, 0xa25a: 0xe0000fa5, 0xa25b: 0xe0000fa2, + 0xa25c: 0x00312288, 0xa25d: 0x40312220, 0xa25e: 0xe0000bf4, 0xa25f: 0xe0000bf1, + 0xa260: 0x002ebc88, 0xa261: 0x402c8c20, 0xa262: 0x002f2288, 0xa263: 0x402f2220, + 0xa264: 0x00314088, 0xa265: 0x40314020, 0xa266: 0xe000096f, 0xa267: 0xe000096c, + 0xa268: 0xe0000b32, 0xa269: 0xe0000b2f, 0xa26a: 0xe000294c, 0xa26b: 0xe0002949, + 0xa26c: 0xe0000dfd, 0xa26d: 0xe0000df9, 0xa26e: 0xe0000e04, 0xa26f: 0xe0000e01, + 0xa270: 0xe0000e0b, 0xa271: 0xe0000e07, 0xa272: 0xe0001129, 0xa273: 0xe0001126, + 0xa274: 0x402e5e20, 0xa275: 0x402ed020, 0xa276: 0x40305a20, 0xa277: 0x402dd420, + 0xa278: 0xe0000abf, 0xa279: 0xe0000ec4, 0xa27a: 0x002be888, 0xa27b: 0x002c4488, + 0xa27c: 0x402c4420, 0xa27d: 0x002e3888, 0xa27e: 0x00303e88, 0xa27f: 0x402ffc20, + // Block 0x28a, offset 0xa280 + 0xa280: 0x00339288, 0xa281: 0x40339220, 0xa282: 0x0033a088, 0xa283: 0x4033a020, + 0xa284: 0x0033ee88, 0xa285: 0x4033ee20, 0xa286: 0x00341088, 0xa287: 0x40341020, + 0xa288: 0x0034a488, 0xa289: 0x4034a420, 0xa28a: 0x0034ec88, 0xa28b: 0x4034ec20, + 0xa28c: 0x00354288, 0xa28d: 0x40354220, 0xa28e: 0x00355688, 0xa28f: 0x40355620, + 0xa290: 0x0033f088, 0xa291: 0x4033f020, 0xa292: 0x00349688, 0xa293: 0x40349620, + 0xa294: 0x0034a688, 0xa295: 0x4034a620, 0xa296: 0x00353888, 0xa297: 0x40353820, + 0xa298: 0x0036cc88, 0xa299: 0x4036cc20, 0xa29a: 0x00348288, 0xa29b: 0x40348220, + 0xa29c: 0x00372e88, 0xa29d: 0x40372e20, 0xa29e: 0x00348088, 0xa29f: 0x40348020, + 0xa2a0: 0x00349888, 0xa2a1: 0x40349820, 0xa2a2: 0x0034da88, 0xa2a3: 0x4034da20, + 0xa2a4: 0x00351688, 0xa2a5: 0x40351620, 0xa2a6: 0x0035dc88, 0xa2a7: 0x4035dc20, + 0xa2b1: 0x00384288, 0xa2b2: 0x00384488, 0xa2b3: 0x00384688, + 0xa2b4: 0x00384888, 0xa2b5: 0xc5f02f91, 0xa2b6: 0x00384c88, 0xa2b7: 0x00384e88, + 0xa2b8: 0x00385088, 0xa2b9: 0x00385288, 0xa2ba: 0x00385488, 0xa2bb: 0x00385688, + 0xa2bc: 0x00385888, 0xa2bd: 0x00385a88, 0xa2be: 0x00385c88, 0xa2bf: 0x00385e88, + // Block 0x28b, offset 0xa2c0 + 0xa2c0: 0x40388020, 0xa2c1: 0x40388220, 0xa2c2: 0x40388420, 0xa2c3: 0x40388620, + 0xa2c4: 0x40388820, 0xa2c5: 0x40388a20, 0xa2c6: 0x40388c20, 0xa2c7: 0x40388a20, + 0xa2c9: 0x40026e20, 0xa2ca: 0x40021c20, + 0xa2cf: 0x4027e420, + 0xa2d1: 0xadc00000, 0xa2d2: 0xae600000, 0xa2d3: 0xae600000, + 0xa2d4: 0xae600000, 0xa2d5: 0xae600000, 0xa2d6: 0xadc00000, 0xa2d7: 0xae600000, + 0xa2d8: 0xae600000, 0xa2d9: 0xae600000, 0xa2da: 0xade00000, 0xa2db: 0xadc00000, + 0xa2dc: 0xae600000, 0xa2dd: 0xae600000, 0xa2de: 0xae600000, 0xa2df: 0xae600000, + 0xa2e0: 0xae600000, 0xa2e1: 0xae600000, 0xa2e2: 0xadc00000, 0xa2e3: 0xadc00000, + 0xa2e4: 0xadc00000, 0xa2e5: 0xadc00000, 0xa2e6: 0xadc00000, 0xa2e7: 0xadc00000, + 0xa2e8: 0xae600000, 0xa2e9: 0xae600000, 0xa2ea: 0xadc00000, 0xa2eb: 0xae600000, + 0xa2ec: 0xae600000, 0xa2ed: 0xade00000, 0xa2ee: 0xae400000, 0xa2ef: 0xae600000, + 0xa2f0: 0xa0a08502, 0xa2f1: 0xa0b08602, 0xa2f2: 0xa0c08702, 0xa2f3: 0xa0d08802, + 0xa2f4: 0xa0e08902, 0xa2f5: 0xa0f08a02, 0xa2f6: 0xa1008b02, 0xa2f7: 0xa1108c02, + 0xa2f8: 0xa1208d02, 0xa2f9: 0xa1308e02, 0xa2fa: 0xa1308e02, 0xa2fb: 0xa1408f02, + 0xa2fc: 0xa1509202, 0xa2fd: 0xa1600000, 0xa2fe: 0x40055420, 0xa2ff: 0xa1709502, + // Block 0x28c, offset 0xa300 + 0xa300: 0xa0000000, 0xa301: 0xa0000000, 0xa302: 0xa0000000, 0xa303: 0xa0000000, + 0xa304: 0xa0000000, 0xa305: 0xa0000000, 0xa306: 0xa0000000, 0xa307: 0xa0000000, + 0xa308: 0xa0000000, 0xa309: 0x40020020, 0xa30a: 0x40020220, 0xa30b: 0x40020420, + 0xa30c: 0x40020620, 0xa30d: 0x40020820, 0xa30e: 0xa0000000, 0xa30f: 0xa0000000, + 0xa310: 0xa0000000, 0xa311: 0xa0000000, 0xa312: 0xa0000000, 0xa313: 0xa0000000, + 0xa314: 0xa0000000, 0xa315: 0xa0000000, 0xa316: 0xa0000000, 0xa317: 0xa0000000, + 0xa318: 0xa0000000, 0xa319: 0xa0000000, 0xa31a: 0xa0000000, 0xa31b: 0xa0000000, + 0xa31c: 0xa0000000, 0xa31d: 0xa0000000, 0xa31e: 0xa0000000, 0xa31f: 0xa0000000, + 0xa320: 0x40021220, 0xa321: 0x4002ba20, 0xa322: 0x4003e020, 0xa323: 0x4004ea20, + 0xa324: 0x4027de20, 0xa325: 0x4004ec20, 0xa326: 0x4004e620, 0xa327: 0x4003d220, + 0xa328: 0x4003f420, 0xa329: 0x4003f620, 0xa32a: 0x4004d820, 0xa32b: 0x40093820, + 0xa32c: 0x40024020, 0xa32d: 0x40021a20, 0xa32e: 0x4002e420, 0xa32f: 0x4004e220, + 0xa330: 0x4029cc20, 0xa331: 0x4029ce20, 0xa332: 0x4029d020, 0xa333: 0x4029d220, + 0xa334: 0x4029d420, 0xa335: 0x4029d620, 0xa336: 0x4029d820, 0xa337: 0x4029da20, + 0xa338: 0x4029dc20, 0xa339: 0x4029de20, 0xa33a: 0x40026c20, 0xa33b: 0x40026220, + 0xa33c: 0x40094020, 0xa33d: 0x40094220, 0xa33e: 0x40094420, 0xa33f: 0x4002c420, + // Block 0x28d, offset 0xa340 + 0xa340: 0x4004d620, 0xa341: 0x002bde88, 0xa342: 0x002c0a88, 0xa343: 0xc5f409c2, + 0xa344: 0x002c6288, 0xa345: 0x002c9888, 0xa346: 0x002d0888, 0xa347: 0xc5fb2fe6, + 0xa348: 0x002d6888, 0xa349: 0xc6043041, 0xa34a: 0x002dcc88, 0xa34b: 0xc6093084, + 0xa34c: 0xc0030002, 0xa34d: 0x002e8288, 0xa34e: 0xc6123105, 0xa34f: 0xc33f3041, + 0xa350: 0x002f2c88, 0xa351: 0x002f5688, 0xa352: 0x002f7a88, 0xa353: 0xc57509c2, + 0xa354: 0x00302c88, 0xa355: 0xc3473041, 0xa356: 0x0030be88, 0xa357: 0x0030e288, + 0xa358: 0x0030f688, 0xa359: 0x00310088, 0xa35a: 0x00312a88, 0xa35b: 0x4003f820, + 0xa35c: 0x4004e420, 0xa35d: 0x4003fa20, 0xa35e: 0x40062420, 0xa35f: 0x40021620, + 0xa360: 0x40061e20, 0xa361: 0x402bde20, 0xa362: 0x402c0a20, 0xa363: 0xc5f209b1, + 0xa364: 0x402c6220, 0xa365: 0x402c9820, 0xa366: 0x402d0820, 0xa367: 0xc5f72fb3, + 0xa368: 0x402d6820, 0xa369: 0xc6023041, 0xa36a: 0x402dcc20, 0xa36b: 0xc6063062, + 0xa36c: 0xc0000002, 0xa36d: 0x402e8220, 0xa36e: 0xc60e30c3, 0xa36f: 0xc33d3041, + 0xa370: 0x402f2c20, 0xa371: 0x402f5620, 0xa372: 0x402f7a20, 0xa373: 0xc34109b1, + 0xa374: 0x40302c20, 0xa375: 0xc3453041, 0xa376: 0x4030be20, 0xa377: 0x4030e220, + 0xa378: 0x4030f620, 0xa379: 0x40310020, 0xa37a: 0x40312a20, 0xa37b: 0x4003fc20, + 0xa37c: 0x40094820, 0xa37d: 0x4003fe20, 0xa37e: 0x40094c20, 0xa37f: 0xa0000000, + // Block 0x28e, offset 0xa380 + 0xa380: 0xe0000d24, 0xa381: 0xe0000d21, 0xa382: 0xe0000d2a, 0xa383: 0xe0000d27, + 0xa384: 0x002ea083, 0xa385: 0x402ea020, 0xa386: 0xe0000d7b, 0xa387: 0xe0000d78, + 0xa388: 0xe0000d87, 0xa389: 0xe0000d84, 0xa38a: 0xe0000d81, 0xa38b: 0xe0000d7e, + 0xa38c: 0xe0000ded, 0xa38d: 0xe0000de9, 0xa38e: 0xe0000df5, 0xa38f: 0xe0000df1, + 0xa390: 0xe0000e3d, 0xa391: 0xe0000e39, 0xa392: 0xe0000e35, 0xa393: 0xe0000e31, + 0xa394: 0xe0000ea7, 0xa395: 0xe0000ea4, 0xa396: 0xe0000ead, 0xa397: 0xe0000eaa, + 0xa398: 0xe0000ed6, 0xa399: 0xe0000ed3, 0xa39a: 0xe0000ef4, 0xa39b: 0xe0000ef1, + 0xa39c: 0xe0000efb, 0xa39d: 0xe0000ef7, 0xa39e: 0xe0000f02, 0xa39f: 0xe0000eff, + 0xa3a0: 0xe0000f41, 0xa3a1: 0xe0000f3e, 0xa3a2: 0xe0000f53, 0xa3a3: 0xe0000f50, + 0xa3a4: 0xe0000f26, 0xa3a5: 0xe0000f22, 0xa3a6: 0xe0000f3a, 0xa3a7: 0xe0000f36, + 0xa3a8: 0xe0000f5a, 0xa3a9: 0xe0000f56, 0xa3aa: 0xe0000f93, 0xa3ab: 0xe0000f90, + 0xa3ac: 0xe0000f9f, 0xa3ad: 0xe0000f9c, 0xa3ae: 0xe0000fb1, 0xa3af: 0xe0000fae, + 0xa3b0: 0xe0000fab, 0xa3b1: 0xe0000fa8, 0xa3b2: 0xe0001093, 0xa3b3: 0xe0001090, + 0xa3b4: 0xe000109f, 0xa3b5: 0xe000109c, 0xa3b6: 0xe0001099, 0xa3b7: 0xe0001096, + 0xa3b8: 0xe0001032, 0xa3b9: 0xe000102e, 0xa3ba: 0xe0001046, 0xa3bb: 0xe0001042, + 0xa3bc: 0xe00010a9, 0xa3bd: 0xe00010a6, 0xa3be: 0xe00010af, 0xa3bf: 0xe00010ac, + // Block 0x28f, offset 0xa3c0 + 0xa3c0: 0xe0000b03, 0xa3c1: 0xe0000aff, 0xa3c2: 0xe0000b13, 0xa3c3: 0xe0000b0f, + 0xa3c4: 0xe0000b0b, 0xa3c5: 0xe0000b07, 0xa3c6: 0xe0000b75, 0xa3c7: 0xe0000b71, + 0xa3c8: 0xe0000c66, 0xa3c9: 0xe0000c63, 0xa3ca: 0x002d9c83, 0xa3cb: 0x402d9c20, + 0xa3cc: 0x002ee483, 0xa3cd: 0x402ee420, 0xa3ce: 0xe0000e44, 0xa3cf: 0xe0000e41, + 0xa3d0: 0xe0000dad, 0xa3d1: 0xe0000da9, 0xa3d2: 0xe0000db5, 0xa3d3: 0xe0000db1, + 0xa3d4: 0xe0000dc5, 0xa3d5: 0xe0000dc1, 0xa3d6: 0xe0000dbd, 0xa3d7: 0xe0000db9, + 0xa3d8: 0xe0003c28, 0xa3d9: 0xe0003c25, 0xa3da: 0xe0000e5d, 0xa3db: 0xe0000e59, + 0xa3dc: 0xe0000e65, 0xa3dd: 0xe0000e61, 0xa3de: 0xe0000e75, 0xa3df: 0xe0000e71, + 0xa3e0: 0xe0000e6d, 0xa3e1: 0xe0000e69, 0xa3e2: 0xe0003c2e, 0xa3e3: 0xe0003c2b, + 0xa3e4: 0x00306e83, 0xa3e5: 0x40306e20, 0xa3e6: 0xe000104d, 0xa3e7: 0xe000104a, + 0xa3e8: 0xe0001066, 0xa3e9: 0xe0001062, 0xa3ea: 0xe000106e, 0xa3eb: 0xe000106a, + 0xa3ec: 0xe000107e, 0xa3ed: 0xe000107a, 0xa3ee: 0xe0001076, 0xa3ef: 0xe0001072, + 0xa3f0: 0xe0003c34, 0xa3f1: 0xe0003c31, 0xa3f2: 0xe0001108, 0xa3f3: 0xe0001105, + 0xa3f4: 0xe0001135, 0xa3f5: 0xe0001132, 0xa3f6: 0xe000112f, 0xa3f7: 0xe000112c, + 0xa3f8: 0xe000111d, 0xa3f9: 0xe000111a, 0xa3fa: 0xe0000d0a, 0xa3fb: 0xe0000d07, + 0xa3fc: 0x0030d888, 0xa3fd: 0x4030d820, 0xa3fe: 0x00312088, 0xa3ff: 0x40312020, + // Block 0x290, offset 0xa400 + 0xa400: 0xa0000000, 0xa401: 0xa0000000, 0xa402: 0xa0000000, 0xa403: 0xa0000000, + 0xa404: 0xa0000000, 0xa405: 0xa0000000, 0xa406: 0xa0000000, 0xa407: 0xa0000000, + 0xa408: 0xa0000000, 0xa409: 0x40020020, 0xa40a: 0x40020220, 0xa40b: 0x40020420, + 0xa40c: 0x40020620, 0xa40d: 0x40020820, 0xa40e: 0xa0000000, 0xa40f: 0xa0000000, + 0xa410: 0xa0000000, 0xa411: 0xa0000000, 0xa412: 0xa0000000, 0xa413: 0xa0000000, + 0xa414: 0xa0000000, 0xa415: 0xa0000000, 0xa416: 0xa0000000, 0xa417: 0xa0000000, + 0xa418: 0xa0000000, 0xa419: 0xa0000000, 0xa41a: 0xa0000000, 0xa41b: 0xa0000000, + 0xa41c: 0xa0000000, 0xa41d: 0xa0000000, 0xa41e: 0xa0000000, 0xa41f: 0xa0000000, + 0xa420: 0x40021220, 0xa421: 0x4002ba20, 0xa422: 0x4003e020, 0xa423: 0x4004ea20, + 0xa424: 0x4027de20, 0xa425: 0x4004ec20, 0xa426: 0x4004e620, 0xa427: 0x4003d220, + 0xa428: 0x4003f420, 0xa429: 0x4003f620, 0xa42a: 0x4004d820, 0xa42b: 0x40093820, + 0xa42c: 0x40024020, 0xa42d: 0x40021a20, 0xa42e: 0x4002e420, 0xa42f: 0x4004e220, + 0xa430: 0x4029cc20, 0xa431: 0x4029ce20, 0xa432: 0x4029d020, 0xa433: 0x4029d220, + 0xa434: 0x4029d420, 0xa435: 0x4029d620, 0xa436: 0x4029d820, 0xa437: 0x4029da20, + 0xa438: 0x4029dc20, 0xa439: 0x4029de20, 0xa43a: 0x40026c20, 0xa43b: 0x40026220, + 0xa43c: 0x40094020, 0xa43d: 0x40094220, 0xa43e: 0x40094420, 0xa43f: 0x4002c420, + // Block 0x291, offset 0xa440 + 0xa440: 0x4004d620, 0xa441: 0xc61c3161, 0xa442: 0x002c0a88, 0xa443: 0x002c3a88, + 0xa444: 0x002c6288, 0xa445: 0xc62231a1, 0xa446: 0x002d0888, 0xa447: 0x002d2288, + 0xa448: 0x002d6888, 0xa449: 0xc62631a1, 0xa44a: 0x002dcc88, 0xa44b: 0x002dfe88, + 0xa44c: 0xc0030002, 0xa44d: 0x002e8288, 0xa44e: 0x002e9e88, 0xa44f: 0xc62b31c1, + 0xa450: 0x002f2c88, 0xa451: 0x002f5688, 0xa452: 0x002f7a88, 0xa453: 0x002fe688, + 0xa454: 0x00302c88, 0xa455: 0xc63031a1, 0xa456: 0x0030be88, 0xa457: 0x0030e288, + 0xa458: 0x0030f688, 0xa459: 0xc63431a1, 0xa45a: 0x00312a88, 0xa45b: 0x4003f820, + 0xa45c: 0x4004e420, 0xa45d: 0x4003fa20, 0xa45e: 0x40062420, 0xa45f: 0x40021620, + 0xa460: 0x40061e20, 0xa461: 0xc6183161, 0xa462: 0x402c0a20, 0xa463: 0x402c3a20, + 0xa464: 0x402c6220, 0xa465: 0xc62031a1, 0xa466: 0x402d0820, 0xa467: 0x402d2220, + 0xa468: 0x402d6820, 0xa469: 0xc62431a1, 0xa46a: 0x402dcc20, 0xa46b: 0x402dfe20, + 0xa46c: 0xc0000002, 0xa46d: 0x402e8220, 0xa46e: 0x402e9e20, 0xa46f: 0xc62831c1, + 0xa470: 0x402f2c20, 0xa471: 0x402f5620, 0xa472: 0x402f7a20, 0xa473: 0x402fe620, + 0xa474: 0x40302c20, 0xa475: 0xc62e31a1, 0xa476: 0x4030be20, 0xa477: 0x4030e220, + 0xa478: 0x4030f620, 0xa479: 0xc63231a1, 0xa47a: 0x40312a20, 0xa47b: 0x4003fc20, + 0xa47c: 0x40094820, 0xa47d: 0x4003fe20, 0xa47e: 0x40094c20, 0xa47f: 0xa0000000, + // Block 0x292, offset 0xa480 + 0xa480: 0xe00008f5, 0xa481: 0x002c0883, 0xa482: 0xe0000921, 0xa483: 0xe0000969, + 0xa484: 0x00320ca3, 0xa485: 0x00321083, 0xa486: 0x00320c83, 0xa487: 0xe0000a53, + 0xa488: 0xe0000ae8, 0xa489: 0x002d0683, 0xa48a: 0xe0000af4, 0xa48b: 0xe0000b20, + 0xa48c: 0xe0000c2b, 0xa48d: 0x002dca83, 0xa48e: 0xe0000c37, 0xa48f: 0xe0000c43, + 0xa490: 0x002c6483, 0xa491: 0xe0000d63, 0xa492: 0xe0000d9a, 0xa493: 0x002f2a83, + 0xa494: 0xe0000da6, 0xa495: 0xe0000de6, 0xa496: 0x00320e83, 0xa497: 0x40093e20, + 0xa498: 0x00320ea3, 0xa499: 0xe0000fe1, 0xa49a: 0x0030bc83, 0xa49b: 0xe0000fed, + 0xa49c: 0xe0000fff, 0xa49d: 0x00312883, 0xa49e: 0x00318888, 0xa49f: 0xe0000f7b, + 0xa4a0: 0xe00008f2, 0xa4a1: 0x402c0820, 0xa4a2: 0xe000091e, 0xa4a3: 0xe0000966, + 0xa4a4: 0x40320c21, 0xa4a5: 0x40321020, 0xa4a6: 0x40320c20, 0xa4a7: 0xe0000a4d, + 0xa4a8: 0xe0000ae5, 0xa4a9: 0x402d0620, 0xa4aa: 0xe0000af1, 0xa4ab: 0xe0000b1d, + 0xa4ac: 0xe0000c28, 0xa4ad: 0x402dca20, 0xa4ae: 0xe0000c34, 0xa4af: 0xe0000c40, + 0xa4b0: 0x402c6420, 0xa4b1: 0xe0000d60, 0xa4b2: 0xe0000d97, 0xa4b3: 0x402f2a20, + 0xa4b4: 0xe0000da3, 0xa4b5: 0xe0000de3, 0xa4b6: 0x40320e20, 0xa4b7: 0x40093c20, + 0xa4b8: 0x40320e21, 0xa4b9: 0xe0000fde, 0xa4ba: 0x4030bc20, 0xa4bb: 0xe0000fea, + 0xa4bc: 0xe0000ffc, 0xa4bd: 0x40312820, 0xa4be: 0x40318820, 0xa4bf: 0xe0001114, + // Block 0x293, offset 0xa4c0 + 0xa4c0: 0xe0000983, 0xa4c1: 0xe0000980, 0xa4c2: 0xe00008fb, 0xa4c3: 0xe00008f8, + 0xa4c4: 0xe000097d, 0xa4c5: 0xe000097a, 0xa4c6: 0xe0000a38, 0xa4c7: 0xe0000a35, + 0xa4c8: 0xe0000a3e, 0xa4c9: 0xe0000a3b, 0xa4ca: 0xe0000a4a, 0xa4cb: 0xe0000a47, + 0xa4cc: 0xe0000a44, 0xa4cd: 0xe0000a41, 0xa4ce: 0xe0000a86, 0xa4cf: 0xe0000a83, + 0xa4d0: 0x002c62a3, 0xa4d1: 0x402c6221, 0xa4d2: 0xe0000b46, 0xa4d3: 0xe0000b43, + 0xa4d4: 0xe0000aee, 0xa4d5: 0xe0000aeb, 0xa4d6: 0xe0000b2c, 0xa4d7: 0xe0000b29, + 0xa4d8: 0xe0000b40, 0xa4d9: 0xe0000b3d, 0xa4da: 0xe0000b1a, 0xa4db: 0xe0000b17, + 0xa4dc: 0xe0000bb8, 0xa4dd: 0xe0000bb5, 0xa4de: 0xe0000bb2, 0xa4df: 0xe0000baf, + 0xa4e0: 0xe0000bc4, 0xa4e1: 0xe0000bc1, 0xa4e2: 0xe0000bca, 0xa4e3: 0xe0000bc7, + 0xa4e4: 0xe0000bee, 0xa4e5: 0xe0000beb, 0xa4e6: 0xe0000c1b, 0xa4e7: 0xe0000c18, + 0xa4e8: 0xe0000c51, 0xa4e9: 0xe0000c4e, 0xa4ea: 0xe0000c60, 0xa4eb: 0xe0000c5d, + 0xa4ec: 0xe0000c31, 0xa4ed: 0xe0000c2e, 0xa4ee: 0xe0000c5a, 0xa4ef: 0xe0000c57, + 0xa4f0: 0xe0000c54, 0xa4f1: 0x402da220, 0xa4f2: 0xf0000a0a, 0xa4f3: 0xf0000404, + 0xa4f4: 0xe0000c8a, 0xa4f5: 0xe0000c87, 0xa4f6: 0xe0000c9f, 0xa4f7: 0xe0000c9c, + 0xa4f8: 0x402f7220, 0xa4f9: 0xe0000ccc, 0xa4fa: 0xe0000cc9, 0xa4fb: 0xe0000cd8, + 0xa4fc: 0xe0000cd5, 0xa4fd: 0xe0000cd2, 0xa4fe: 0xe0000ccf, 0xa4ff: 0xe0000d04, + // Block 0x294, offset 0xa500 + 0xa500: 0x40321220, 0xa501: 0x40321a20, 0xa502: 0x40322220, 0xa503: 0x40322a20, + 0xa504: 0xe0000ad5, 0xa505: 0xe0000ad1, 0xa506: 0xe0000acd, 0xa507: 0xf0000a0a, + 0xa508: 0xf000040a, 0xa509: 0xf0000404, 0xa50a: 0xf0000a0a, 0xa50b: 0xf000040a, + 0xa50c: 0xf0000404, 0xa50d: 0xe0000947, 0xa50e: 0xe0000944, 0xa50f: 0xe0000c3d, + 0xa510: 0xe0000c3a, 0xa511: 0xe0000dcc, 0xa512: 0xe0000dc9, 0xa513: 0xe0000ff3, + 0xa514: 0xe0000ff0, 0xa515: 0xe000101e, 0xa516: 0xe000101a, 0xa517: 0xe0003c70, + 0xa518: 0xe0003c6d, 0xa519: 0xe0001016, 0xa51a: 0xe0001012, 0xa51b: 0xe000100e, + 0xa51c: 0xe000100a, 0xa51d: 0x402cae20, 0xa51e: 0xe000299d, 0xa51f: 0xe000299a, + 0xa520: 0xe0000976, 0xa521: 0xe0000972, 0xa522: 0xe0002997, 0xa523: 0xe0002994, + 0xa524: 0x002d3a88, 0xa525: 0x402d3a20, 0xa526: 0xe0000bbe, 0xa527: 0xe0000bbb, + 0xa528: 0xe0000c99, 0xa529: 0xe0000c96, 0xa52a: 0xe0000e20, 0xa52b: 0xe0000e1d, + 0xa52c: 0xe0000e27, 0xa52d: 0xe0000e23, 0xa52e: 0xe0001162, 0xa52f: 0xe000115f, + 0xa530: 0xe0000c8d, 0xa531: 0xf0000a0a, 0xa532: 0xf000040a, 0xa533: 0xf0000404, + 0xa534: 0xe0000bac, 0xa535: 0xe0000ba9, 0xa536: 0x002d7888, 0xa537: 0x00319488, + 0xa538: 0xe0000d57, 0xa539: 0xe0000d54, 0xa53a: 0xe00029b5, 0xa53b: 0xe00029b2, + 0xa53c: 0xe0002991, 0xa53d: 0xe000298e, 0xa53e: 0xe00037a4, 0xa53f: 0xe00037a1, + // Block 0x295, offset 0xa540 + 0xa540: 0xe000098f, 0xa541: 0xe000098c, 0xa542: 0xe0000995, 0xa543: 0xe0000992, + 0xa544: 0xe0000b62, 0xa545: 0xe0000b5f, 0xa546: 0xe0000b68, 0xa547: 0xe0000b65, + 0xa548: 0xe0000c6c, 0xa549: 0xe0000c69, 0xa54a: 0xe0000c72, 0xa54b: 0xe0000c6f, + 0xa54c: 0xe0000e4a, 0xa54d: 0xe0000e47, 0xa54e: 0xe0000e50, 0xa54f: 0xe0000e4d, + 0xa550: 0xe0000ee8, 0xa551: 0xe0000ee5, 0xa552: 0xe0000eee, 0xa553: 0xe0000eeb, + 0xa554: 0xe0001053, 0xa555: 0xe0001050, 0xa556: 0xe0001059, 0xa557: 0xe0001056, + 0xa558: 0xe0000f61, 0xa559: 0xe0000f5e, 0xa55a: 0xe0000fa5, 0xa55b: 0xe0000fa2, + 0xa55c: 0x00312288, 0xa55d: 0x40312220, 0xa55e: 0xe0000bf4, 0xa55f: 0xe0000bf1, + 0xa560: 0x002ebc88, 0xa561: 0x402c8c20, 0xa562: 0x002f2288, 0xa563: 0x402f2220, + 0xa564: 0x00314088, 0xa565: 0x40314020, 0xa566: 0xe000096f, 0xa567: 0xe000096c, + 0xa568: 0xe0000b32, 0xa569: 0xe0000b2f, 0xa56a: 0xe000379e, 0xa56b: 0xe000379b, + 0xa56c: 0xe0000dfd, 0xa56d: 0xe0000df9, 0xa56e: 0xe0000e04, 0xa56f: 0xe0000e01, + 0xa570: 0xe0000e0b, 0xa571: 0xe0000e07, 0xa572: 0xe0001129, 0xa573: 0xe0001126, + 0xa574: 0x402e5e20, 0xa575: 0x402ed020, 0xa576: 0x40305a20, 0xa577: 0x402dd420, + 0xa578: 0xe0000abf, 0xa579: 0xe0000ec4, 0xa57a: 0x002be888, 0xa57b: 0x002c4488, + 0xa57c: 0x402c4420, 0xa57d: 0x002e3888, 0xa57e: 0x00303e88, 0xa57f: 0x402ffc20, + // Block 0x296, offset 0xa580 + 0xa580: 0xe00009b1, 0xa581: 0xe00009ae, 0xa582: 0xe0000a22, 0xa583: 0xe0000a1f, + 0xa584: 0xe0000a28, 0xa585: 0xe0000a25, 0xa586: 0xe0000a2e, 0xa587: 0xe0000a2b, + 0xa588: 0xe0000a5a, 0xa589: 0xe0000a56, 0xa58a: 0xe0000a8c, 0xa58b: 0xe0000a89, + 0xa58c: 0xe0000a98, 0xa58d: 0xe0000a95, 0xa58e: 0xe0000aa4, 0xa58f: 0xe0000aa1, + 0xa590: 0xe0000a92, 0xa591: 0xe0000a8f, 0xa592: 0xe0000a9e, 0xa593: 0xe0000a9b, + 0xa594: 0xe0000b55, 0xa595: 0xe0000b51, 0xa596: 0xe0003c4c, 0xa597: 0xe0003c49, + 0xa598: 0xe0000b7c, 0xa599: 0xe0000b79, 0xa59a: 0xe0000b82, 0xa59b: 0xe0000b7f, + 0xa59c: 0xe0000b39, 0xa59d: 0xe0000b35, 0xa59e: 0xe0000b8c, 0xa59f: 0xe0000b89, + 0xa5a0: 0xe0000bd0, 0xa5a1: 0xe0000bcd, 0xa5a2: 0xe0000c00, 0xa5a3: 0xe0000bfd, + 0xa5a4: 0xe0000c0c, 0xa5a5: 0xe0000c09, 0xa5a6: 0xe0000bfa, 0xa5a7: 0xe0000bf7, + 0xa5a8: 0xe0000c06, 0xa5a9: 0xe0000c03, 0xa5aa: 0xe0000c12, 0xa5ab: 0xe0000c0f, + 0xa5ac: 0xe0000c7e, 0xa5ad: 0xe0000c7b, 0xa5ae: 0xe0003c52, 0xa5af: 0xe0003c4f, + 0xa5b0: 0xe0000c93, 0xa5b1: 0xe0000c90, 0xa5b2: 0xe0000cab, 0xa5b3: 0xe0000ca8, + 0xa5b4: 0xe0000cb1, 0xa5b5: 0xe0000cae, 0xa5b6: 0xe0000cde, 0xa5b7: 0xe0000cdb, + 0xa5b8: 0xe0000ce5, 0xa5b9: 0xe0000ce1, 0xa5ba: 0xe0000cf2, 0xa5bb: 0xe0000cef, + 0xa5bc: 0xe0000cec, 0xa5bd: 0xe0000ce9, 0xa5be: 0xe0000d1e, 0xa5bf: 0xe0000d1b, + // Block 0x297, offset 0xa5c0 + 0xa5c0: 0xe0000d24, 0xa5c1: 0xe0000d21, 0xa5c2: 0xe0000d2a, 0xa5c3: 0xe0000d27, + 0xa5c4: 0xe0000d69, 0xa5c5: 0xe0000d66, 0xa5c6: 0xe0000d7b, 0xa5c7: 0xe0000d78, + 0xa5c8: 0xe0000d87, 0xa5c9: 0xe0000d84, 0xa5ca: 0xe0000d81, 0xa5cb: 0xe0000d7e, + 0xa5cc: 0xe0003c5e, 0xa5cd: 0xe0003c5b, 0xa5ce: 0xe0003c82, 0xa5cf: 0xe0003c7f, + 0xa5d0: 0xe0000e3d, 0xa5d1: 0xe0000e39, 0xa5d2: 0xe0003c64, 0xa5d3: 0xe0003c61, + 0xa5d4: 0xe0000ea7, 0xa5d5: 0xe0000ea4, 0xa5d6: 0xe0000ead, 0xa5d7: 0xe0000eaa, + 0xa5d8: 0xe0000ed6, 0xa5d9: 0xe0000ed3, 0xa5da: 0xe0000ef4, 0xa5db: 0xe0000ef1, + 0xa5dc: 0xe0000efb, 0xa5dd: 0xe0000ef7, 0xa5de: 0xe0000f02, 0xa5df: 0xe0000eff, + 0xa5e0: 0xe0000f41, 0xa5e1: 0xe0000f3e, 0xa5e2: 0xe0000f53, 0xa5e3: 0xe0000f50, + 0xa5e4: 0xe0000f26, 0xa5e5: 0xe0000f22, 0xa5e6: 0xe0000f3a, 0xa5e7: 0xe0000f36, + 0xa5e8: 0xe0000f5a, 0xa5e9: 0xe0000f56, 0xa5ea: 0xe0000f93, 0xa5eb: 0xe0000f90, + 0xa5ec: 0xe0000f9f, 0xa5ed: 0xe0000f9c, 0xa5ee: 0xe0000fb1, 0xa5ef: 0xe0000fae, + 0xa5f0: 0xe0000fab, 0xa5f1: 0xe0000fa8, 0xa5f2: 0xe0001093, 0xa5f3: 0xe0001090, + 0xa5f4: 0xe000109f, 0xa5f5: 0xe000109c, 0xa5f6: 0xe0001099, 0xa5f7: 0xe0001096, + 0xa5f8: 0xe0003c76, 0xa5f9: 0xe0003c73, 0xa5fa: 0xe0001046, 0xa5fb: 0xe0001042, + 0xa5fc: 0xe00010a9, 0xa5fd: 0xe00010a6, 0xa5fe: 0xe00010af, 0xa5ff: 0xe00010ac, + // Block 0x298, offset 0xa600 + 0xa600: 0xe00010d2, 0xa601: 0xe00010cf, 0xa602: 0xe00010cc, 0xa603: 0xe00010c9, + 0xa604: 0xe00010e1, 0xa605: 0xe00010de, 0xa606: 0xe00010e7, 0xa607: 0xe00010e4, + 0xa608: 0xe00010ed, 0xa609: 0xe00010ea, 0xa60a: 0xe00010fc, 0xa60b: 0xe00010f9, + 0xa60c: 0xe00010f6, 0xa60d: 0xe00010f3, 0xa60e: 0xe0001123, 0xa60f: 0xe0001120, + 0xa610: 0xe0001141, 0xa611: 0xe000113e, 0xa612: 0xe0001153, 0xa613: 0xe0001150, + 0xa614: 0xe0001159, 0xa615: 0xe0001156, 0xa616: 0xe0000c15, 0xa617: 0xe0000f8d, + 0xa618: 0xe00010db, 0xa619: 0xe0001111, 0xa61a: 0xf0000404, 0xa61b: 0xe0000f70, + 0xa61c: 0x40300420, 0xa61d: 0x40300620, 0xa61e: 0xe0000f7f, 0xa61f: 0x402c9620, + 0xa620: 0xe000099b, 0xa621: 0xe0000998, 0xa622: 0xe0000989, 0xa623: 0xe0000986, + 0xa624: 0xe0003c40, 0xa625: 0xe0003c3d, 0xa626: 0xe0000930, 0xa627: 0xe000092c, + 0xa628: 0xe0000940, 0xa629: 0xe000093c, 0xa62a: 0xe0000938, 0xa62b: 0xe0000934, + 0xa62c: 0xe00009aa, 0xa62d: 0xe00009a6, 0xa62e: 0xe0003c3a, 0xa62f: 0xe0003c37, + 0xa630: 0xe000090a, 0xa631: 0xe0000906, 0xa632: 0xe000091a, 0xa633: 0xe0000916, + 0xa634: 0xe0000912, 0xa635: 0xe000090e, 0xa636: 0xe00009a2, 0xa637: 0xe000099e, + 0xa638: 0xe0000b6e, 0xa639: 0xe0000b6b, 0xa63a: 0xe0000b5c, 0xa63b: 0xe0000b59, + 0xa63c: 0xe0000b26, 0xa63d: 0xe0000b23, 0xa63e: 0xe0003c46, 0xa63f: 0xe0003c43, + // Block 0x299, offset 0xa640 + 0xa640: 0xe0000b03, 0xa641: 0xe0000aff, 0xa642: 0xe0000b13, 0xa643: 0xe0000b0f, + 0xa644: 0xe0000b0b, 0xa645: 0xe0000b07, 0xa646: 0xe0000b75, 0xa647: 0xe0000b71, + 0xa648: 0xe0000c66, 0xa649: 0xe0000c63, 0xa64a: 0xe0000c78, 0xa64b: 0xe0000c75, + 0xa64c: 0xe0000e84, 0xa64d: 0xe0000e81, 0xa64e: 0xe0000e44, 0xa64f: 0xe0000e41, + 0xa650: 0xe0003c58, 0xa651: 0xe0003c55, 0xa652: 0xe0000db5, 0xa653: 0xe0000db1, + 0xa654: 0xe0000dc5, 0xa655: 0xe0000dc1, 0xa656: 0xe0000dbd, 0xa657: 0xe0000db9, + 0xa658: 0xe0000e8b, 0xa659: 0xe0000e87, 0xa65a: 0xe0003c6a, 0xa65b: 0xe0003c67, + 0xa65c: 0xe0000e65, 0xa65d: 0xe0000e61, 0xa65e: 0xe0000e75, 0xa65f: 0xe0000e71, + 0xa660: 0xe0000e6d, 0xa661: 0xe0000e69, 0xa662: 0xe0000e7d, 0xa663: 0xe0000e79, + 0xa664: 0xe000108d, 0xa665: 0xe000108a, 0xa666: 0xe000104d, 0xa667: 0xe000104a, + 0xa668: 0xe0003c7c, 0xa669: 0xe0003c79, 0xa66a: 0xe000106e, 0xa66b: 0xe000106a, + 0xa66c: 0xe000107e, 0xa66d: 0xe000107a, 0xa66e: 0xe0001076, 0xa66f: 0xe0001072, + 0xa670: 0xe0001086, 0xa671: 0xe0001082, 0xa672: 0xe0001108, 0xa673: 0xe0001105, + 0xa674: 0xe0001135, 0xa675: 0xe0001132, 0xa676: 0xe000112f, 0xa677: 0xe000112c, + 0xa678: 0xe000111d, 0xa679: 0xe000111a, 0xa67a: 0xe0000d0a, 0xa67b: 0xe0000d07, + 0xa67c: 0x0030d888, 0xa67d: 0x4030d820, 0xa67e: 0x00312088, 0xa67f: 0x40312020, + // Block 0x29a, offset 0xa680 + 0xa680: 0x40021220, 0xa681: 0x40025c20, 0xa682: 0x40030420, 0xa683: 0x40051220, + 0xa684: 0x40279a20, 0xa685: 0x4027ca20, 0xa686: 0xe0002206, 0xa687: 0xe00001d3, + 0xa688: 0x40049c20, 0xa689: 0x40049e20, 0xa68a: 0x4004a020, 0xa68b: 0x4004a220, + 0xa68c: 0x4004a420, 0xa68d: 0x4004a620, 0xa68e: 0x4004a820, 0xa68f: 0x4004aa20, + 0xa690: 0x4004ac20, 0xa691: 0x4004ae20, 0xa692: 0x40279c20, 0xa693: 0x40279e20, + 0xa694: 0x4004b020, 0xa695: 0x4004b220, 0xa696: 0x4004b420, 0xa697: 0x4004b620, + 0xa698: 0x4004b820, 0xa699: 0x4004ba20, 0xa69a: 0x4004bc20, 0xa69b: 0x4004be20, + 0xa69c: 0x40023820, 0xa69d: 0x4003ea20, 0xa69e: 0x4003ec20, 0xa69f: 0x4003ee20, + 0xa6a0: 0x4027a020, 0xa6a1: 0xe0000267, 0xa6a2: 0xe000037f, 0xa6a3: 0xe0000459, + 0xa6a4: 0xe000052e, 0xa6a5: 0xe00005f8, 0xa6a6: 0xe00006c3, 0xa6a7: 0xe000076b, + 0xa6a8: 0xe0000817, 0xa6a9: 0xe00008bc, 0xa6aa: 0xada12202, 0xa6ab: 0xae412302, + 0xa6ac: 0xae812402, 0xa6ad: 0xade12502, 0xa6ae: 0xae012602, 0xa6af: 0xae012702, + 0xa6b0: 0x40023a20, 0xa6b1: 0x4027ce20, 0xa6b2: 0xe0000152, 0xa6b3: 0x4027d020, + 0xa6b4: 0xe0000155, 0xa6b5: 0x4027d220, 0xa6b6: 0x00279c84, 0xa6b7: 0x4027a220, + 0xa6b8: 0x02a68284, 0xa6b9: 0x02a68884, 0xa6ba: 0x02a68a84, 0xa6bb: 0x4027cc20, + 0xa6bc: 0xe000231a, 0xa6bd: 0x40051420, 0xa6be: 0x4027a420, 0xa6bf: 0x4027a620, + // Block 0x29b, offset 0xa6c0 + 0xa6c1: 0xc63631f1, 0xa6c2: 0xc63c31f1, 0xa6c3: 0xc70631f1, + 0xa6c4: 0xc70c31f1, 0xa6c5: 0xc7c439e1, 0xa6c6: 0xc7ce33a1, 0xa6c7: 0xc8ad31f1, + 0xa6c8: 0xc8b331f1, 0xa6c9: 0xc96231f1, 0xa6ca: 0xc96831f1, 0xa6cb: 0xc6483271, + 0xa6cc: 0xc65531f1, 0xa6cd: 0xc71233a1, 0xa6ce: 0xc7273631, 0xa6cf: 0xc7f033a1, + 0xa6d0: 0xc8053631, 0xa6d1: 0xc8bf3271, 0xa6d2: 0xc8cc31f1, 0xa6d3: 0xc96e33a1, + 0xa6d4: 0xc9833631, 0xa6d5: 0xc65b33a1, 0xa6d6: 0xc6703631, 0xa6d7: 0xc73433a1, + 0xa6d8: 0xc7493631, 0xa6d9: 0xc81233a1, 0xa6da: 0xc8273631, 0xa6db: 0xc8d233a1, + 0xa6dc: 0xc8e73631, 0xa6dd: 0xc98b33a1, 0xa6de: 0xc9a03631, 0xa6df: 0xc67833a1, + 0xa6e0: 0xc68d3631, 0xa6e1: 0xc75133a1, 0xa6e2: 0xc7663631, 0xa6e3: 0xc82f39e1, + 0xa6e4: 0xc83933a1, 0xa6e5: 0xc84e3631, 0xa6e6: 0xc8ef33a1, 0xa6e7: 0xc9043631, + 0xa6e8: 0xc9ad33a1, 0xa6e9: 0xc9c23631, 0xa6ea: 0xc69531f1, 0xa6eb: 0xc76e31f1, + 0xa6ec: 0xc85931f1, 0xa6ed: 0xc90c31f1, 0xa6ee: 0xc9ca31f1, 0xa6ef: 0xc6a036b1, + 0xa6f0: 0xc6bb3631, 0xa6f1: 0xc6c33631, 0xa6f2: 0xc77936b1, 0xa6f3: 0xc7943631, + 0xa6f4: 0xc79c3631, 0xa6f5: 0xc86436b1, 0xa6f6: 0xc87f3631, 0xa6f7: 0xc8873631, + 0xa6f8: 0xc91736b1, 0xa6f9: 0xc9323631, 0xa6fa: 0xc93a3631, 0xa6fb: 0xc9d536b1, + 0xa6fc: 0xc9f03631, 0xa6fd: 0xc9f83631, 0xa6fe: 0xc6cb31f1, 0xa6ff: 0xc7a431f1, + // Block 0x29c, offset 0xa700 + 0xa700: 0xc89231f1, 0xa701: 0xc94231f1, 0xa702: 0xca0031f1, 0xa703: 0xc6d131f1, + 0xa704: 0xc6d731f1, 0xa705: 0xc89831f1, 0xa706: 0xc89e31f1, 0xa707: 0xca0631f1, + 0xa708: 0xca0c31f1, 0xa709: 0xc6e031f1, 0xa70a: 0xc7ad31f1, 0xa70b: 0xc8a731f1, + 0xa70c: 0xc94b31f1, 0xa70d: 0xca1531f1, 0xa70e: 0xc6e639e1, 0xa70f: 0xc6f039e1, + 0xa710: 0xc7b339e1, 0xa711: 0xc95139e1, 0xa712: 0xca1b39e1, 0xa713: 0xca313a71, + 0xa714: 0xc7e33631, 0xa715: 0xc64231f1, 0xa716: 0xc8b931f1, + 0xa719: 0xa0812802, 0xa71a: 0xa0812902, 0xa71b: 0x40063c20, + 0xa71c: 0x40063e20, 0xa71d: 0x4027d820, 0xa71e: 0xe000015b, 0xa71f: 0xe0003fc5, + 0xa720: 0x40023c20, 0xa721: 0xc6393241, 0xa722: 0xc63f3241, 0xa723: 0xc7093241, + 0xa724: 0xc70f3241, 0xa725: 0xc7c935c1, 0xa726: 0xc7d634c1, 0xa727: 0xc8b03241, + 0xa728: 0xc8b63241, 0xa729: 0xc9653241, 0xa72a: 0xc96b3241, 0xa72b: 0xc64d3321, + 0xa72c: 0xc6583241, 0xa72d: 0xc71a34c1, 0xa72e: 0xc72b3681, 0xa72f: 0xc7f834c1, + 0xa730: 0xc8093681, 0xa731: 0xc8c43321, 0xa732: 0xc8cf3241, 0xa733: 0xc97634c1, + 0xa734: 0xc9873681, 0xa735: 0xc66334c1, 0xa736: 0xc6743681, 0xa737: 0xc73c34c1, + 0xa738: 0xc74d3681, 0xa739: 0xc81a34c1, 0xa73a: 0xc82b3681, 0xa73b: 0xc8da34c1, + 0xa73c: 0xc8eb3681, 0xa73d: 0xc99334c1, 0xa73e: 0xc9a43681, 0xa73f: 0xc68034c1, + // Block 0x29d, offset 0xa740 + 0xa740: 0xc6913681, 0xa741: 0xc75934c1, 0xa742: 0xc76a3681, 0xa743: 0xc83435c1, + 0xa744: 0xc84134c1, 0xa745: 0xc8523681, 0xa746: 0xc8f734c1, 0xa747: 0xc9083681, + 0xa748: 0xc9b534c1, 0xa749: 0xc9c63681, 0xa74a: 0xc6983241, 0xa74b: 0xc7713241, + 0xa74c: 0xc85c3241, 0xa74d: 0xc90f3241, 0xa74e: 0xc9cd3241, 0xa74f: 0xc6ab3861, + 0xa750: 0xc6bf3681, 0xa751: 0xc6c73681, 0xa752: 0xc7843861, 0xa753: 0xc7983681, + 0xa754: 0xc7a03681, 0xa755: 0xc86f3861, 0xa756: 0xc8833681, 0xa757: 0xc88b3681, + 0xa758: 0xc9223861, 0xa759: 0xc9363681, 0xa75a: 0xc93e3681, 0xa75b: 0xc9e03861, + 0xa75c: 0xc9f43681, 0xa75d: 0xc9fc3681, 0xa75e: 0xc6ce3241, 0xa75f: 0xc7a73241, + 0xa760: 0xc8953241, 0xa761: 0xc9453241, 0xa762: 0xca033241, 0xa763: 0xc6d43241, + 0xa764: 0xc6da3241, 0xa765: 0xc89b3241, 0xa766: 0xc8a13241, 0xa767: 0xca093241, + 0xa768: 0xca0f3241, 0xa769: 0xc6e33241, 0xa76a: 0xc7b03241, 0xa76b: 0xc8aa3241, + 0xa76c: 0xc94e3241, 0xa76d: 0xca183241, 0xa76e: 0xc6eb35c1, 0xa76f: 0xc6f534c1, + 0xa770: 0xc7b834c1, 0xa771: 0xc95634c1, 0xa772: 0xca2034c1, 0xa773: 0xca313aa1, + 0xa774: 0xc7e73681, 0xa775: 0xc6453241, 0xa776: 0xc8bc3241, 0xa777: 0xc7023681, + 0xa778: 0xc7c03681, 0xa779: 0xc95e3681, 0xa77a: 0xca2d3681, 0xa77b: 0x40023e20, + 0xa77c: 0x4027d620, 0xa77d: 0x4027d820, 0xa77e: 0xe000015b, 0xa77f: 0xe0003e6c, + // Block 0x29e, offset 0xa780 + 0xa785: 0x4065da20, 0xa786: 0x4065dc20, 0xa787: 0x4065de20, + 0xa788: 0x4065e020, 0xa789: 0x4065e420, 0xa78a: 0x4065e620, 0xa78b: 0x4065e820, + 0xa78c: 0x4065ea20, 0xa78d: 0x4065ec20, 0xa78e: 0x4065ee20, 0xa78f: 0x4065f420, + 0xa790: 0x4065f620, 0xa791: 0x4065f820, 0xa792: 0x4065fa20, 0xa793: 0x4065fe20, + 0xa794: 0x40660020, 0xa795: 0x40660220, 0xa796: 0x40660420, 0xa797: 0x40660620, + 0xa798: 0x40660820, 0xa799: 0x40660a20, 0xa79a: 0x40661220, 0xa79b: 0x40661420, + 0xa79c: 0x40661820, 0xa79d: 0x40661a20, 0xa79e: 0x40661e20, 0xa79f: 0x40662020, + 0xa7a0: 0x40662220, 0xa7a1: 0x40662420, 0xa7a2: 0x40662620, 0xa7a3: 0x40662820, + 0xa7a4: 0x40662a20, 0xa7a5: 0x40662e20, 0xa7a6: 0x40663620, 0xa7a7: 0x40663820, + 0xa7a8: 0x40663a20, 0xa7a9: 0x40663c20, 0xa7aa: 0x4065e220, 0xa7ab: 0x4065f020, + 0xa7ac: 0x4065fc20, 0xa7ad: 0x40663e20, + 0xa7b1: 0x4062ac20, 0xa7b2: 0x4062ae20, 0xa7b3: 0x40646820, + 0xa7b4: 0x4062b020, 0xa7b5: 0x40646c20, 0xa7b6: 0x40646e20, 0xa7b7: 0x4062b220, + 0xa7b8: 0x4062b420, 0xa7b9: 0x4062b620, 0xa7ba: 0x40647420, 0xa7bb: 0x40647620, + 0xa7bc: 0x40647820, 0xa7bd: 0x40647a20, 0xa7be: 0x40647c20, 0xa7bf: 0x40647e20, + // Block 0x29f, offset 0xa7c0 + 0xa7c0: 0x4062e020, 0xa7c1: 0x4062b820, 0xa7c2: 0x4062ba20, 0xa7c3: 0x4062bc20, + 0xa7c4: 0x4062ee20, 0xa7c5: 0x4062be20, 0xa7c6: 0x4062c020, 0xa7c7: 0x4062c220, + 0xa7c8: 0x4062c420, 0xa7c9: 0x4062c620, 0xa7ca: 0x4062c820, 0xa7cb: 0x4062ca20, + 0xa7cc: 0x4062cc20, 0xa7cd: 0x4062ce20, 0xa7ce: 0x4062d020, 0xa7cf: 0x4063a820, + 0xa7d0: 0x4063aa20, 0xa7d1: 0x4063ac20, 0xa7d2: 0x4063ae20, 0xa7d3: 0x4063b020, + 0xa7d4: 0x4063b220, 0xa7d5: 0x4063b420, 0xa7d6: 0x4063b620, 0xa7d7: 0x4063b820, + 0xa7d8: 0x4063ba20, 0xa7d9: 0x4063bc20, 0xa7da: 0x4063be20, 0xa7db: 0x4063c020, + 0xa7dc: 0x4063c220, 0xa7dd: 0x4063c420, 0xa7de: 0x4063c620, 0xa7df: 0x4063c820, + 0xa7e0: 0x4063ca20, 0xa7e1: 0x4063cc20, 0xa7e2: 0x4063ce20, 0xa7e3: 0x4063d020, + 0xa7e4: 0x4063a620, 0xa7e5: 0x0062d484, 0xa7e6: 0x0062d684, 0xa7e7: 0x0064a284, + 0xa7e8: 0x0064a484, 0xa7e9: 0x0064ac84, 0xa7ea: 0x0064b084, 0xa7eb: 0x0064ba84, + 0xa7ec: 0x0064c284, 0xa7ed: 0x0064c684, 0xa7ee: 0x0062e484, 0xa7ef: 0x0064ce84, + 0xa7f0: 0x0064d284, 0xa7f1: 0x0062e684, 0xa7f2: 0x0062e884, 0xa7f3: 0x0062ec84, + 0xa7f4: 0x0062f084, 0xa7f5: 0x0062f284, 0xa7f6: 0x0062fa84, 0xa7f7: 0x0062fe84, + 0xa7f8: 0x00630284, 0xa7f9: 0x00630484, 0xa7fa: 0x00630684, 0xa7fb: 0x00630884, + 0xa7fc: 0x00630a84, 0xa7fd: 0x00631084, 0xa7fe: 0x00631884, 0xa7ff: 0x00632c84, + // Block 0x2a0, offset 0xa800 + 0xa800: 0x40275220, 0xa801: 0x40275420, 0xa802: 0x40275620, 0xa803: 0x40275820, + 0xa804: 0x40275a20, 0xa805: 0x40275c20, 0xa806: 0x40275e20, 0xa807: 0x40276020, + 0xa808: 0x40276220, 0xa809: 0x40276420, 0xa80a: 0x40276620, 0xa80b: 0x40276820, + 0xa80c: 0x40276a20, 0xa80d: 0x40276c20, 0xa80e: 0x40276e20, 0xa80f: 0x40277020, + 0xa810: 0x40277220, 0xa811: 0x40277420, 0xa812: 0x40277620, 0xa813: 0x40277820, + 0xa814: 0x40277a20, 0xa815: 0x40277c20, 0xa816: 0x40277e20, 0xa817: 0x40278020, + 0xa818: 0x40278220, 0xa819: 0x40278420, 0xa81a: 0x40278620, 0xa81b: 0x40278820, + 0xa81c: 0x40278a20, 0xa81d: 0x40278c20, 0xa81e: 0x40278e20, 0xa81f: 0x40279020, + 0xa820: 0x40279220, 0xa821: 0x40279420, 0xa822: 0x40279620, 0xa823: 0x40279820, + 0xa830: 0xc7eb35c1, 0xa831: 0xc72f35c1, 0xa832: 0xc80d35c1, 0xa833: 0xc9a835c1, + 0xa834: 0xc8563241, 0xa835: 0xc69b35c1, 0xa836: 0xc77435c1, 0xa837: 0xc85f35c1, + 0xa838: 0xc91235c1, 0xa839: 0xc9d035c1, 0xa83a: 0xc88f3241, 0xa83b: 0xc6dd3241, + 0xa83c: 0xc7aa3241, 0xa83d: 0xc8a43241, 0xa83e: 0xc9483241, 0xa83f: 0xca123241, + // Block 0x2a1, offset 0xa840 + 0xa840: 0xf0000404, 0xa841: 0xf0000404, 0xa842: 0xf0000404, 0xa843: 0xf0000404, + 0xa844: 0xf0000404, 0xa845: 0xf0000404, 0xa846: 0xf0000404, 0xa847: 0xf0000404, + 0xa848: 0xf0000404, 0xa849: 0xf0000404, 0xa84a: 0xf0000404, 0xa84b: 0xf0000404, + 0xa84c: 0xf0000404, 0xa84d: 0xf0000404, 0xa84e: 0xe000004c, 0xa84f: 0xe0000051, + 0xa850: 0xe0000056, 0xa851: 0xe000005b, 0xa852: 0xe0000060, 0xa853: 0xe0000065, + 0xa854: 0xe000006a, 0xa855: 0xe000006f, 0xa856: 0xe0000083, 0xa857: 0xe000008d, + 0xa858: 0xe0000092, 0xa859: 0xe0000097, 0xa85a: 0xe000009c, 0xa85b: 0xe00000a1, + 0xa85c: 0xe0000088, 0xa85d: 0xe0000074, 0xa85e: 0xe000007c, + 0xa860: 0xe0002c4c, 0xa861: 0xe0002c5c, 0xa862: 0xe0002c54, 0xa863: 0xe0002c8c, + 0xa864: 0xe0002c60, 0xa865: 0xe0002c74, 0xa866: 0xe0002c50, 0xa867: 0xe0002c70, + 0xa868: 0xe0002c58, 0xa869: 0xe0002c7c, 0xa86a: 0xe0002c9c, 0xa86b: 0xe0002cb0, + 0xa86c: 0xe0002cac, 0xa86d: 0xe0002ca4, 0xa86e: 0xe0002cd8, 0xa86f: 0xe0002c90, + 0xa870: 0xe0002c98, 0xa871: 0xe0002ca8, 0xa872: 0xe0002ca0, 0xa873: 0xe0002cbc, + 0xa874: 0xe0002c84, 0xa875: 0xe0002cb4, 0xa876: 0xe0002cd0, 0xa877: 0xe0002cc0, + 0xa878: 0xe0002c78, 0xa879: 0xe0002c64, 0xa87a: 0xe0002c88, 0xa87b: 0xe0002c94, + 0xa87c: 0xe0002cb8, 0xa87d: 0xe0002c68, 0xa87e: 0xe0002cd4, 0xa87f: 0xe0002c80, + // Block 0x2a2, offset 0xa880 + 0xa880: 0xe0002cc4, 0xa881: 0xe0002c6c, 0xa882: 0xe0002cc8, 0xa883: 0xe0002ccc, + 0xa884: 0x02aa9e86, 0xa885: 0x02bcf886, 0xa886: 0x02cb0e86, 0xa887: 0x02f71e86, + 0xa888: 0xe00002e3, 0xa889: 0xe00003d8, 0xa88a: 0xe00004b3, 0xa88b: 0xe000057d, + 0xa88c: 0xe0000648, 0xa88d: 0xe00006f0, 0xa88e: 0xe000079c, 0xa88f: 0xe0000841, + 0xa890: 0xe0000ec0, 0xa891: 0xf0000606, 0xa892: 0xf0000606, 0xa893: 0xf0000606, + 0xa894: 0xf0000606, 0xa895: 0xf0000606, 0xa896: 0xf0000606, 0xa897: 0xf0000606, + 0xa898: 0xf0000606, 0xa899: 0xf0000606, 0xa89a: 0xf0000606, 0xa89b: 0xf0000606, + 0xa89c: 0xf0000606, 0xa89d: 0xf0000606, 0xa89e: 0xf0000606, 0xa89f: 0xf0000606, + 0xa8a0: 0x0062ac86, 0xa8a1: 0x0062b086, 0xa8a2: 0x0062b286, 0xa8a3: 0x0062b686, + 0xa8a4: 0x0062b886, 0xa8a5: 0x0062ba86, 0xa8a6: 0x0062be86, 0xa8a7: 0x0062c286, + 0xa8a8: 0x0062c486, 0xa8a9: 0x0062c886, 0xa8aa: 0x0062ca86, 0xa8ab: 0x0062cc86, + 0xa8ac: 0x0062ce86, 0xa8ad: 0x0062d086, 0xa8ae: 0xf0000606, 0xa8af: 0xf0000606, + 0xa8b0: 0xf0000606, 0xa8b1: 0xf0000606, 0xa8b2: 0xf0000606, 0xa8b3: 0xf0000606, + 0xa8b4: 0xf0000606, 0xa8b5: 0xf0000606, 0xa8b6: 0xf0000606, 0xa8b7: 0xf0000606, + 0xa8b8: 0xf0000606, 0xa8b9: 0xf0000606, 0xa8ba: 0xf0000606, 0xa8bb: 0xf0000606, + 0xa8bc: 0xe0002127, 0xa8bd: 0xe0002122, 0xa8be: 0xf0000606, 0xa8bf: 0x4027ac20, + // Block 0x2a3, offset 0xa8c0 + 0xa8c0: 0xe0002da0, 0xa8c1: 0xe0002e0d, 0xa8c2: 0xe0002e42, 0xa8c3: 0xe0002e6f, + 0xa8c4: 0xe0002e81, 0xa8c5: 0xe0002e90, 0xa8c6: 0xe0002e9f, 0xa8c7: 0xe0002eae, + 0xa8c8: 0xe0002ebd, 0xa8c9: 0xe0002d06, 0xa8ca: 0xe0002d19, 0xa8cb: 0xe0002d2c, + 0xa8cc: 0xf0001c1d, 0xa8cd: 0xe0000b85, 0xa8ce: 0xf0001d1c, 0xa8cf: 0xe0000d14, + 0xa8d0: 0x00657693, 0xa8d1: 0x00657893, 0xa8d2: 0x00657a93, 0xa8d3: 0x00657e93, + 0xa8d4: 0x00658093, 0xa8d5: 0x00658293, 0xa8d6: 0x00658493, 0xa8d7: 0x00658693, + 0xa8d8: 0x00658893, 0xa8d9: 0x00658a93, 0xa8da: 0x00658c93, 0xa8db: 0x00658e93, + 0xa8dc: 0x00659093, 0xa8dd: 0x00659293, 0xa8de: 0x00659493, 0xa8df: 0x00659693, + 0xa8e0: 0x00659893, 0xa8e1: 0x00659a93, 0xa8e2: 0x00659c93, 0xa8e3: 0x00659e93, + 0xa8e4: 0x0065a093, 0xa8e5: 0x0065a293, 0xa8e6: 0x0065a493, 0xa8e7: 0x0065a693, + 0xa8e8: 0x0065a893, 0xa8e9: 0x0065aa93, 0xa8ea: 0x0065ac93, 0xa8eb: 0x0065ae93, + 0xa8ec: 0x0065b093, 0xa8ed: 0x0065b293, 0xa8ee: 0x0065b493, 0xa8ef: 0x0065b693, + 0xa8f0: 0x0065b893, 0xa8f1: 0x0065ba93, 0xa8f2: 0x0065bc93, 0xa8f3: 0x0065be93, + 0xa8f4: 0x0065c093, 0xa8f5: 0x0065c493, 0xa8f6: 0x0065c693, 0xa8f7: 0x0065c893, + 0xa8f8: 0x0065ca93, 0xa8f9: 0x0065cc93, 0xa8fa: 0x0065ce93, 0xa8fb: 0x0065d093, + 0xa8fc: 0x0065d293, 0xa8fd: 0x0065d493, 0xa8fe: 0x0065d693, + // Block 0x2a4, offset 0xa900 + 0xa900: 0xe000230b, 0xa901: 0xe00022f8, 0xa902: 0xe00022fc, 0xa903: 0xe0002311, + 0xa904: 0xe0002316, 0xa905: 0xe000231d, 0xa906: 0xe0002321, 0xa907: 0xe0002325, + 0xa908: 0xe000232b, 0xa909: 0xf0001c1c, 0xa90a: 0xe0002330, 0xa90b: 0xe000233c, + 0xa90c: 0xe0002340, 0xa90d: 0xe0002337, 0xa90e: 0xe0002346, 0xa90f: 0xe000234b, + 0xa910: 0xe000234f, 0xa911: 0xe0002353, 0xa912: 0xf0001c1c, 0xa913: 0xe000235e, + 0xa914: 0xe0002358, 0xa915: 0xf0001c1c, 0xa916: 0xe0002363, 0xa917: 0xe000236d, + 0xa918: 0xe0002cef, 0xa919: 0xe0002da3, 0xa91a: 0xe0002e10, 0xa91b: 0xe0002e45, + 0xa91c: 0xe0002e72, 0xa91d: 0xe0002e84, 0xa91e: 0xe0002e93, 0xa91f: 0xe0002ea2, + 0xa920: 0xe0002eb1, 0xa921: 0xe0002ec0, 0xa922: 0xe0002d0a, 0xa923: 0xe0002d1d, + 0xa924: 0xe0002d30, 0xa925: 0xe0002d3f, 0xa926: 0xe0002d4e, 0xa927: 0xe0002d5d, + 0xa928: 0xe0002d6c, 0xa929: 0xe0002d7b, 0xa92a: 0xe0002d8a, 0xa92b: 0xe0002d99, + 0xa92c: 0xe0002db7, 0xa92d: 0xe0002dc2, 0xa92e: 0xe0002dcd, 0xa92f: 0xe0002dd8, + 0xa930: 0xe0002de3, 0xa931: 0xe0000c1e, 0xa932: 0xf0001c1c, 0xa933: 0xf0001d1d, + 0xa934: 0xe0000a31, 0xa935: 0xf0001d1c, 0xa936: 0xf0001c1c, 0xa937: 0xf0001c1c, + 0xa938: 0xe0000ac2, 0xa939: 0xe0000ac6, 0xa93a: 0xf0001d1d, 0xa93b: 0xe0004023, + 0xa93c: 0xe0004029, 0xa93d: 0xe0004020, 0xa93e: 0xe0004026, 0xa93f: 0xe0002431, + // Block 0x2a5, offset 0xa940 + 0xa940: 0xf0001d1c, 0xa941: 0xf0001d1d, 0xa942: 0xe00009b7, 0xa943: 0xf0001c1d, + 0xa944: 0xf0001c1c, 0xa945: 0xf0001c1c, 0xa946: 0xe0000a66, 0xa947: 0xe0000a7a, + 0xa948: 0xf0001d1c, 0xa949: 0xf0001c1d, 0xa94a: 0xf0001c1c, 0xa94b: 0xf0001d1d, + 0xa94c: 0xf0001c1c, 0xa94d: 0xf0001d1d, 0xa94e: 0xf0001d1d, 0xa94f: 0xf0001c1c, + 0xa950: 0xf0001c1c, 0xa951: 0xf0001c1c, 0xa952: 0xe0000d0d, 0xa953: 0xf0001c1c, + 0xa954: 0xf0001c1c, 0xa955: 0xe0000d3a, 0xa956: 0xe0000d46, 0xa957: 0xf0001d1d, + 0xa958: 0xe0000eb0, 0xa959: 0xe0000eb8, 0xa95a: 0xf0001d1d, 0xa95b: 0xf0001c1c, + 0xa95c: 0xf0001c1d, 0xa95d: 0xf0001c1d, 0xa95e: 0xe00010b2, 0xa95f: 0xe00009c8, + 0xa960: 0xe0002d9d, 0xa961: 0xe0002e0a, 0xa962: 0xe0002e3f, 0xa963: 0xe0002e6c, + 0xa964: 0xe0002e7e, 0xa965: 0xe0002e8d, 0xa966: 0xe0002e9c, 0xa967: 0xe0002eab, + 0xa968: 0xe0002eba, 0xa969: 0xe0002d02, 0xa96a: 0xe0002d15, 0xa96b: 0xe0002d28, + 0xa96c: 0xe0002d3b, 0xa96d: 0xe0002d4a, 0xa96e: 0xe0002d59, 0xa96f: 0xe0002d68, + 0xa970: 0xe0002d77, 0xa971: 0xe0002d86, 0xa972: 0xe0002d95, 0xa973: 0xe0002db3, + 0xa974: 0xe0002dbe, 0xa975: 0xe0002dc9, 0xa976: 0xe0002dd4, 0xa977: 0xe0002ddf, + 0xa978: 0xe0002dea, 0xa979: 0xe0002df1, 0xa97a: 0xe0002df8, 0xa97b: 0xe0002dff, + 0xa97c: 0xe0002e06, 0xa97d: 0xe0002e1c, 0xa97e: 0xe0002e23, 0xa97f: 0xe0000bdf, + // Block 0x2a6, offset 0xa980 + 0xa980: 0x6c009820, 0xa981: 0x6c0ea820, 0xa983: 0x6c08fe20, + 0xa987: 0x6c148c20, + 0xa988: 0x6c0ad420, 0xa989: 0x6c083420, 0xa98a: 0x6c0ad220, 0xa98b: 0x6c01b020, + 0xa98d: 0x6c12c420, 0xa98e: 0x6c158a20, + 0xa990: 0x6c172e20, 0xa991: 0x6c00da20, + 0xa994: 0x6c02d020, 0xa995: 0x6c173020, 0xa996: 0x6c0bc820, 0xa997: 0x6c18e620, + 0xa998: 0x6c041820, 0xa999: 0x6c134c20, + 0xa99e: 0x6c0ad620, + 0xa9a1: 0x6c164420, + 0xa9a6: 0x6c135c20, + 0xa9aa: 0x6c173220, + 0xa9ad: 0x6c0e8020, + 0xa9b1: 0x6c173420, 0xa9b2: 0x6c051c20, + 0xa9b6: 0x6c173620, + 0xa9b8: 0x6c036a20, 0xa9b9: 0x6c0e1420, 0xa9bb: 0x6c095e20, + 0xa9bc: 0x6c173820, 0xa9bf: 0x6c173a20, + // Block 0x2a7, offset 0xa9c0 + 0xa9c2: 0x6c173c20, 0xa9c3: 0x6c110e20, + 0xa9c5: 0x6c041a20, + 0xa9cb: 0x6c111220, + 0xa9cd: 0x6c10ae20, 0xa9ce: 0x6c062620, 0xa9cf: 0x6c13fa20, + 0xa9d5: 0x6c29d820, 0xa9d6: 0x6c173e20, 0xa9d7: 0x6c0ad820, + 0xa9d8: 0x6c174020, 0xa9d9: 0x6c01a220, + 0xa9dd: 0x6c04f220, 0xa9de: 0x6c068020, 0xa9df: 0x6c152220, + 0xa9e2: 0x6c1b9e20, + 0xa9f1: 0x6c15ec20, 0xa9f3: 0x6c10e220, + 0xa9fe: 0x6c02fa20, + // Block 0x2a8, offset 0xaa00 + 0xaa00: 0x6c03d620, 0xaa02: 0x6c174220, + 0xaa05: 0x6c174420, 0xaa06: 0x6c163e20, + 0xaa08: 0x6c158620, 0xaa09: 0x6c0d0c20, 0xaa0a: 0x6c174820, 0xaa0b: 0x6c08c020, + 0xaa0c: 0x6c10ce20, 0xaa0e: 0x6c174e20, + 0xaa11: 0x6c00f820, 0xaa12: 0x6c065e20, + 0xaa14: 0x6c065c20, 0xaa15: 0x6c008c20, + 0xaa18: 0x6c171a20, 0xaa19: 0x6c171820, 0xaa1b: 0x6c077e20, + 0xaa1c: 0x6c000220, 0xaa1e: 0x6c175020, 0xaa1f: 0x6c175220, + 0xaa20: 0x6c175420, 0xaa21: 0x6c13fc20, 0xaa22: 0x6c175620, + 0xaa24: 0x6c068420, 0xaa25: 0x6c008e20, 0xaa26: 0x6c147820, + 0xaa28: 0x6c046420, 0xaa2b: 0x6c046620, + 0xaa2c: 0x6c046820, 0xaa2d: 0x6c0f3420, 0xaa2e: 0x6c164020, + 0xaa30: 0x6c175820, 0xaa33: 0x6c175a20, + 0xaa36: 0x6c175c20, + 0xaa3a: 0x6c0b5e20, + // Block 0x2a9, offset 0xaa40 + 0xaa40: 0x6c09c020, 0xaa41: 0x6c0b6020, 0xaa42: 0x6c176620, + 0xaa44: 0x6c176220, 0xaa46: 0x6c176420, 0xaa47: 0x6c041c20, + 0xaa4a: 0x6c075e20, 0xaa4b: 0x6c021820, + 0xaa4d: 0x6c176020, 0xaa4e: 0x6c175e20, 0xaa4f: 0x6c132a20, + 0xaa54: 0x6c086020, 0xaa55: 0x6c085e20, 0xaa56: 0x6c0d7420, 0xaa57: 0x6c176820, + 0xaa58: 0x6c12c620, 0xaa59: 0x6c0c4e20, + 0xaa5e: 0x6c176a20, 0xaa5f: 0x6c176e20, + 0xaa63: 0x6c0dc220, + 0xaa64: 0x6c168a20, 0xaa65: 0x6c005420, + 0xaa6d: 0x6c176c20, 0xaa6e: 0x6c01b420, + 0xaa70: 0x6c04b020, 0xaa72: 0x6c0e8220, + 0xaa76: 0x6c05c220, 0xaa77: 0x6c177020, + 0xaa7b: 0x6c10ec20, + // Block 0x2aa, offset 0xaa80 + 0xaa81: 0x6c038620, + 0xaa89: 0x6c177220, 0xaa8a: 0x6c005620, + 0xaa8d: 0x6c066020, 0xaa8e: 0x6c038820, 0xaa8f: 0x6c131020, + 0xaa90: 0x6c11c420, 0xaa91: 0x6c041e20, + 0xaa9a: 0x6c021a20, + 0xaa9c: 0x6c17b820, 0xaa9d: 0x6c0fae20, + 0xaaaf: 0x6c117c20, + 0xaab0: 0x6c177620, + 0xaab4: 0x6c11d820, 0xaab6: 0x6c168c20, + 0xaab8: 0x6c0b1e20, 0xaaba: 0x6c086220, + 0xaabc: 0x6c08c220, 0xaabd: 0x6c01b820, + // Block 0x2ab, offset 0xaac0 + 0xaac3: 0x6c0f1220, + 0xaac6: 0x6c0df820, 0xaac7: 0x6c177e20, + 0xaacd: 0x6c005820, 0xaace: 0x6c0f3620, 0xaacf: 0x6c09c220, + 0xaad0: 0x6c078020, 0xaad1: 0x6c155420, 0xaad3: 0x6c0d9420, + 0xaad5: 0x6c01b620, 0xaad7: 0x6c177c20, + 0xaad9: 0x6c158820, 0xaada: 0x6c177420, 0xaadb: 0x6c177820, + 0xaadc: 0x6c07f420, 0xaadd: 0x6c177a20, 0xaade: 0x6c1ade20, + 0xaae9: 0x6c178a20, + 0xaaef: 0x6c179020, + 0xaaf0: 0x6c178c20, 0xaaf3: 0x6c01bc20, + 0xaaf5: 0x6c134e20, 0xaaf6: 0x6c178020, + 0xaafb: 0x6c178820, + 0xaafc: 0x6c068620, 0xaaff: 0x6c086420, + // Block 0x2ac, offset 0xab00 + 0xab03: 0x6c02fc20, + 0xab06: 0x6c179220, + 0xab08: 0x6c178220, 0xab0b: 0x6c168e20, + 0xab0d: 0x6c08c420, 0xab0f: 0x6c178420, + 0xab11: 0x6c178e20, + 0xab16: 0x6c179420, + 0xab18: 0x6c178620, 0xab1b: 0x6c046a20, + 0xab1d: 0x6c005a20, + 0xab20: 0x6c046c20, 0xab21: 0x6c01ba20, + 0xab2b: 0x6c1ae020, + 0xab2d: 0x6c148620, 0xab2e: 0x6c12f820, 0xab2f: 0x6c068820, + 0xab35: 0x6c0b2220, 0xab36: 0x6c163620, + 0xab3f: 0x6c138820, + // Block 0x2ad, offset 0xab40 + 0xab42: 0x6c055420, 0xab43: 0x6c0d4220, + 0xab44: 0x6c020020, + 0xab4a: 0x6c09f220, + 0xab4e: 0x6c179c20, + 0xab50: 0x6c17a620, 0xab51: 0x6c17a220, + 0xab54: 0x6c179820, 0xab57: 0x6c0d5620, + 0xab58: 0x6c179e20, 0xab5a: 0x6c17a420, 0xab5b: 0x6c17a020, + 0xab5d: 0x6c139220, 0xab5f: 0x6c179a20, + 0xab61: 0x6c0b2020, 0xab63: 0x6c147a20, + 0xab64: 0x6c17a820, 0xab65: 0x6c17aa20, + 0xab6e: 0x6c099420, 0xab6f: 0x6c17c420, + 0xab73: 0x6c114420, + 0xab75: 0x6c128820, 0xab76: 0x6c17ba20, + 0xab78: 0x6c13b820, 0xab7a: 0x6c01a420, + 0xab7e: 0x6c17c220, + // Block 0x2ae, offset 0xab80 + 0xab85: 0x6c17b620, 0xab86: 0x6c17c820, + 0xab89: 0x6c0ce020, 0xab8b: 0x6c062820, + 0xab8d: 0x6c115c20, 0xab8f: 0x6c233820, + 0xab91: 0x6c17c620, 0xab92: 0x6c0fe620, + 0xab94: 0x6c17b020, 0xab96: 0x6c068c20, + 0xab99: 0x6c068a20, 0xab9a: 0x6c17ac20, + 0xab9f: 0x6c094420, + 0xaba1: 0x6c17bc20, 0xaba3: 0x6c13b620, + 0xaba4: 0x6c0e4e20, 0xaba5: 0x6c17b420, 0xaba6: 0x6c05c620, + 0xaba8: 0x6c17ae20, 0xaba9: 0x6c17be20, 0xabaa: 0x6c17b220, 0xabab: 0x6c166a20, + 0xabac: 0x6c17c020, 0xabad: 0x6c170620, + 0xabb6: 0x6c04f420, + 0xabb9: 0x6c05c420, + // Block 0x2af, offset 0xabc0 + 0xabc3: 0x6c17ca20, + 0xabc7: 0x6c17cc20, + 0xabc8: 0x6c17d420, 0xabc9: 0x6c005c20, + 0xabcf: 0x6c137820, + 0xabd0: 0x6c17d220, + 0xabd5: 0x6c17d020, 0xabd6: 0x6c17d820, + 0xabda: 0x6c17d620, + 0xabdc: 0x6c0f3820, + 0xabe5: 0x6c05c820, + 0xabec: 0x6c17da20, + 0xabf2: 0x6c091a20, + 0xabf4: 0x6c0d4420, 0xabf5: 0x6c0f3a20, 0xabf6: 0x6c051420, + 0xabf8: 0x6c17dc20, + 0xabfd: 0x6c03d820, + // Block 0x2b0, offset 0xac00 + 0xac00: 0x6c17de20, + 0xac05: 0x6c17e220, + 0xac0d: 0x6c13fe20, + 0xac11: 0x6c05b020, + 0xac18: 0x6c083620, 0xac19: 0x6c124e20, 0xac1a: 0x6c17e020, + 0xac2c: 0x6c07a220, 0xac2d: 0x6c159220, + 0xac32: 0x6c17e620, 0xac33: 0x6c17ec20, + 0xac34: 0x6c17e420, 0xac35: 0x6c07a020, 0xac37: 0x6c0a4620, + 0xac3e: 0x6c055620, + // Block 0x2b1, offset 0xac40 + 0xac42: 0x6c17ee20, + 0xac45: 0x6c04c620, + 0xac49: 0x6c17e820, 0xac4a: 0x6c17ea20, + 0xac4d: 0x6c104620, 0xac4f: 0x6c0d3420, + 0xac51: 0x6c046e20, + 0xac55: 0x6c142e20, 0xac56: 0x6c17f020, + 0xac5a: 0x6c164220, + 0xac5e: 0x6c17f220, + 0xac63: 0x6c17f820, + 0xac65: 0x6c17f420, 0xac67: 0x6c0cd820, + 0xac6d: 0x6c17f620, 0xac6e: 0x6c17fa20, + 0xac75: 0x6c17fe20, + 0xac79: 0x6c17fc20, 0xac7b: 0x6c136820, + // Block 0x2b2, offset 0xac80 + 0xac80: 0x6c03da20, 0xac81: 0x6c180220, 0xac82: 0x6c180420, + 0xac84: 0x6c019620, + 0xac89: 0x6c180020, + 0xac92: 0x6c097820, + 0xac94: 0x6c180a20, 0xac95: 0x6c180820, 0xac96: 0x6c180620, + 0xac98: 0x6c179620, 0xac9a: 0x6c180c20, + 0xac9f: 0x6c0a4820, + 0xaca1: 0x6c180e20, + 0xacaa: 0x6c155620, + 0xacb2: 0x6c150220, + 0xacb7: 0x6c181220, + 0xacba: 0x6c181020, 0xacbb: 0x6c181620, + 0xacbc: 0x6c181420, 0xacbf: 0x6c181820, + // Block 0x2b3, offset 0xacc0 + 0xacc0: 0x6c181a20, 0xacc1: 0x6c00a820, 0xacc3: 0x6c060a20, + 0xacc4: 0x6c055a20, 0xacc5: 0x6c09c420, 0xacc6: 0x6c0eaa20, 0xacc7: 0x6c047020, + 0xacc8: 0x6c0c5020, 0xacc9: 0x6c068e20, 0xaccb: 0x6c073820, + 0xaccc: 0x6c181e20, 0xaccd: 0x6c14e020, 0xacce: 0x6c0fb820, + 0xacd0: 0x6c08c620, 0xacd2: 0x6c181c20, + 0xacd4: 0x6c182020, + 0xacda: 0x6c0fe820, + 0xacdc: 0x6c02de20, + 0xace2: 0x6c182220, + 0xace5: 0x6c10e420, + 0xace8: 0x6c0ca420, 0xace9: 0x6c182620, 0xacea: 0x6c182820, 0xaceb: 0x6c11b820, + 0xacec: 0x6c069020, 0xaced: 0x6c16fa20, 0xacee: 0x6c182a20, + 0xacf1: 0x6c047420, + 0xacf5: 0x6c135020, 0xacf6: 0x6c0d6420, 0xacf7: 0x6c050a20, + 0xacf8: 0x6c0f9620, + 0xacfc: 0x6c05ca20, + // Block 0x2b4, offset 0xad00 + 0xad00: 0x6c182c20, 0xad02: 0x6c182e20, + 0xad05: 0x6c10ac20, 0xad06: 0x6c013a20, + 0xad09: 0x6c183420, 0xad0a: 0x6c081220, + 0xad0c: 0x6c183220, 0xad0d: 0x6c07a420, 0xad0f: 0x6c183620, + 0xad10: 0x6c27ee20, 0xad11: 0x6c183820, 0xad12: 0x6c141620, 0xad13: 0x6c183a20, + 0xad15: 0x6c183c20, 0xad16: 0x6c183e20, 0xad17: 0x6c0ada20, + 0xad19: 0x6c092820, + 0xad20: 0x6c02fe20, 0xad22: 0x6c184420, + 0xad24: 0x6c184020, 0xad25: 0x6c14ca20, 0xad26: 0x6c184220, + 0xad28: 0x6c12d020, 0xad29: 0x6c184620, 0xad2a: 0x6c184820, 0xad2b: 0x6c184a20, + 0xad2c: 0x6c0fea20, + 0xad30: 0x6c185220, 0xad31: 0x6c184e20, 0xad32: 0x6c185020, 0xad33: 0x6c184c20, + 0xad34: 0x6c07de20, 0xad35: 0x6c185420, 0xad36: 0x6c152420, 0xad37: 0x6c169020, + 0xad3d: 0x6c185620, + // Block 0x2b5, offset 0xad40 + 0xad44: 0x6c0bd020, 0xad45: 0x6c185820, 0xad46: 0x6c0a0020, + 0xad49: 0x6c185a20, 0xad4b: 0x6c0eac20, + 0xad4c: 0x6c164620, 0xad4d: 0x6c0fec20, + 0xad56: 0x6c18ec20, + 0xad5b: 0x6c185c20, + 0xad5c: 0x6c31a420, 0xad5d: 0x6c04b220, + 0xad60: 0x6c185e20, 0xad61: 0x6c145020, + 0xad66: 0x6c0a1c20, 0xad67: 0x6c0df020, + 0xad69: 0x6c186220, 0xad6a: 0x6c10b020, + 0xad6d: 0x6c186420, + 0xad70: 0x6c186620, 0xad71: 0x6c025020, + 0xad75: 0x6c186820, 0xad76: 0x6c047620, + 0xad78: 0x6c108020, 0xad79: 0x6c017020, 0xad7a: 0x6c09ec20, + 0xad7d: 0x6c11a220, 0xad7e: 0x6c186a20, + // Block 0x2b6, offset 0xad80 + 0xad80: 0x6c0fee20, 0xad83: 0x6c0b6220, + 0xad84: 0x6c186c20, 0xad86: 0x6c133020, 0xad87: 0x6c0c3420, + 0xad88: 0x6c02f420, 0xad8a: 0x6c030220, 0xad8b: 0x6c186e20, + 0xad8e: 0x6c187220, + 0xad91: 0x6c055820, + 0xad94: 0x6c187020, 0xad97: 0x6c16ae20, + 0xad9d: 0x6c0a1e20, + 0xada4: 0x6c11da20, 0xada5: 0x6c137020, 0xada7: 0x6c187420, + 0xada9: 0x6c15fc20, 0xadaa: 0x6c187620, + 0xadae: 0x6c187820, + 0xadb0: 0x6c102820, 0xadb3: 0x6c187a20, + 0xadb6: 0x6c0bd220, 0xadb7: 0x6c081420, + 0xadb8: 0x6c05cc20, 0xadb9: 0x6c187c20, 0xadba: 0x6c086620, 0xadbb: 0x6c073a20, + // Block 0x2b7, offset 0xadc0 + 0xadc3: 0x6c0f3c20, + 0xadc4: 0x6c188020, 0xadc7: 0x6c0d4620, + 0xadca: 0x6c07f620, 0xadcb: 0x6c188220, + 0xadcc: 0x6c188420, 0xadcd: 0x6c0c9c20, 0xadcf: 0x6c187e20, + 0xadd4: 0x6c188820, 0xadd6: 0x6c140020, + 0xaddb: 0x6c072420, + 0xadde: 0x6c188620, + 0xade3: 0x6c05ce20, + 0xade4: 0x6c07d420, 0xade5: 0x6c117e20, + 0xade9: 0x6c188e20, 0xadea: 0x6c188a20, + 0xadef: 0x6c131220, + 0xadf0: 0x6c0adc20, 0xadf1: 0x6c189c20, 0xadf2: 0x6c02bc20, 0xadf3: 0x6c189020, + 0xadf4: 0x6c188c20, 0xadf5: 0x6c0cda20, + 0xadfd: 0x6c189420, 0xadff: 0x6c189220, + // Block 0x2b8, offset 0xae00 + 0xae03: 0x6c027c20, + 0xae07: 0x6c05a420, + 0xae08: 0x6c189e20, 0xae09: 0x6c162220, + 0xae0d: 0x6c189620, + 0xae11: 0x6c18a020, 0xae12: 0x6c189a20, + 0xae14: 0x6c189820, + 0xae1b: 0x6c166620, + 0xae1f: 0x6c069220, + 0xae20: 0x6c01be20, 0xae23: 0x6c16b020, + 0xae29: 0x6c0a3620, 0xae2a: 0x6c0fdc20, 0xae2b: 0x6c072620, + 0xae2c: 0x6c18a620, 0xae2d: 0x6c18a820, + 0xae31: 0x6c169220, + 0xae34: 0x6c16da20, 0xae35: 0x6c18ac20, + 0xae39: 0x6c069420, + 0xae3c: 0x6c18aa20, 0xae3e: 0x6c025220, + // Block 0x2b9, offset 0xae40 + 0xae41: 0x6c18ae20, 0xae43: 0x6c144020, + 0xae45: 0x6c0ee820, 0xae47: 0x6c155820, + 0xae49: 0x6c138a20, + 0xae4d: 0x6c18b020, + 0xae52: 0x6c2f1420, + 0xae55: 0x6c104820, 0xae57: 0x6c18b220, + 0xae58: 0x6c030420, 0xae59: 0x6c14b620, + 0xae5d: 0x6c0a4a20, 0xae5e: 0x6c18b420, 0xae5f: 0x6c13a620, + 0xae60: 0x6c18bc20, 0xae62: 0x6c0bd420, 0xae63: 0x6c18b620, + 0xae64: 0x6c04c820, 0xae66: 0x6c18b820, 0xae67: 0x6c030620, + 0xae72: 0x6c054020, 0xae73: 0x6c18be20, + 0xae75: 0x6c18c020, + 0xae78: 0x6c18c220, 0xae79: 0x6c18c420, 0xae7a: 0x6c094620, + 0xae7e: 0x6c069620, 0xae7f: 0x6c150c20, + // Block 0x2ba, offset 0xae80 + 0xae81: 0x6c152020, 0xae82: 0x6c10d620, + 0xae85: 0x6c13ba20, 0xae86: 0x6c18c620, + 0xae88: 0x6c18c820, + 0xae8d: 0x6c18cc20, 0xae8f: 0x6c18d020, + 0xae90: 0x6c18ce20, + 0xae95: 0x6c18d220, 0xae96: 0x6c01b220, 0xae97: 0x6c142c20, + 0xae99: 0x6c081020, 0xae9a: 0x6c18d420, + 0xae9d: 0x6c0cee20, + 0xaea0: 0x6c0a4c20, 0xaea1: 0x6c047a20, 0xaea3: 0x6c18d620, + 0xaeaa: 0x6c121620, + 0xaeaf: 0x6c18d820, + 0xaeb1: 0x6c18da20, 0xaeb3: 0x6c18dc20, + 0xaeb8: 0x6c18de20, 0xaeb9: 0x6c126420, 0xaeba: 0x6c04f820, 0xaebb: 0x6c008a20, + 0xaebf: 0x6c106620, + // Block 0x2bb, offset 0xaec0 + 0xaec0: 0x6c18e020, 0xaec1: 0x6c09c620, 0xaec3: 0x6c0c5220, + 0xaec5: 0x6c18e420, 0xaec6: 0x6c18e220, 0xaec7: 0x6c0a4e20, + 0xaec8: 0x6c066220, 0xaec9: 0x6c18e820, 0xaeca: 0x6c11dc20, + 0xaecd: 0x6c18ea20, + 0xaed1: 0x6c121820, 0xaed2: 0x6c0d6020, 0xaed3: 0x6c0dd420, + 0xaed4: 0x6c047820, 0xaed7: 0x6c10c420, + 0xaed8: 0x6c0e1620, 0xaeda: 0x6c118020, + 0xaedc: 0x6c143020, 0xaede: 0x6c18ee20, + 0xaee0: 0x6c0c5420, + 0xaee6: 0x6c054e20, + 0xaee9: 0x6c18f020, + 0xaeee: 0x6c18f220, 0xaeef: 0x6c00d420, + 0xaef0: 0x6c00aa20, 0xaef1: 0x6c038a20, 0xaef3: 0x6c0d4820, + 0xaef4: 0x6c040e20, 0xaef5: 0x6c15ee20, 0xaef7: 0x6c18f820, + 0xaef8: 0x6c01a620, 0xaefb: 0x6c18f620, + 0xaeff: 0x6c047c20, + // Block 0x2bc, offset 0xaf00 + 0xaf02: 0x6c18fa20, + 0xaf04: 0x6c153220, + 0xaf16: 0x6c18fc20, + 0xaf18: 0x6c166c20, 0xaf1a: 0x6c069820, + 0xaf1f: 0x6c060c20, + 0xaf20: 0x6c18fe20, + 0xaf25: 0x6c190220, 0xaf26: 0x6c190020, + 0xaf28: 0x6c0b8220, 0xaf29: 0x6c00ee20, + 0xaf2d: 0x6c013820, 0xaf2e: 0x6c190420, + 0xaf30: 0x6c190620, 0xaf33: 0x6c060e20, + 0xaf36: 0x6c190820, + 0xaf3b: 0x6c044820, + // Block 0x2bd, offset 0xaf40 + 0xaf42: 0x6c083820, 0xaf43: 0x6c190a20, + 0xaf48: 0x6c147c20, 0xaf49: 0x6c078220, 0xaf4a: 0x6c042020, 0xaf4b: 0x6c155a20, + 0xaf4c: 0x6c0cdc20, 0xaf4d: 0x6c11de20, 0xaf4e: 0x6c098a20, + 0xaf54: 0x6c09da20, 0xaf56: 0x6c096020, 0xaf57: 0x6c097a20, + 0xaf59: 0x6c0a3820, 0xaf5b: 0x6c11e020, + 0xaf5f: 0x6c191020, + 0xaf61: 0x6c010220, 0xaf62: 0x6c0cde20, 0xaf63: 0x6c069a20, + 0xaf64: 0x6c062a20, 0xaf65: 0x6c04f620, + 0xaf68: 0x6c191820, 0xaf69: 0x6c0df620, 0xaf6a: 0x6c0df420, 0xaf6b: 0x6c047e20, + 0xaf6c: 0x6c0a5020, 0xaf6d: 0x6c191a20, 0xaf6e: 0x6c191620, 0xaf6f: 0x6c01c020, + 0xaf70: 0x6c0dc420, 0xaf71: 0x6c090020, 0xaf72: 0x6c086a20, 0xaf73: 0x6c00c820, + 0xaf76: 0x6c02d420, 0xaf77: 0x6c072820, + 0xaf78: 0x6c086820, 0xaf7a: 0x6c191c20, + // Block 0x2be, offset 0xaf80 + 0xaf81: 0x6c191e20, 0xaf83: 0x6c03fe20, + 0xaf84: 0x6c028020, + 0xaf88: 0x6c072a20, 0xaf89: 0x6c03fc20, 0xaf8a: 0x6c0f2e20, 0xaf8b: 0x6c00c620, + 0xaf8c: 0x6c104a20, 0xaf8d: 0x6c14cc20, 0xaf8e: 0x6c069e20, 0xaf8f: 0x6c15fe20, + 0xaf90: 0x6c0fba20, 0xaf91: 0x6c069c20, + 0xaf9b: 0x6c054220, + 0xaf9d: 0x6c193020, 0xaf9f: 0x6c04ee20, + 0xafa0: 0x6c142820, + 0xafa6: 0x6c121a20, + 0xafa9: 0x6c192e20, 0xafab: 0x6c036c20, + 0xafac: 0x6c192420, 0xafad: 0x6c192620, 0xafae: 0x6c192a20, + 0xafb6: 0x6c192c20, + 0xafb8: 0x6c042220, 0xafb9: 0x6c0b8620, 0xafbb: 0x6c133220, + 0xafbc: 0x6c192820, 0xafbd: 0x6c192020, 0xafbe: 0x6c066620, + // Block 0x2bf, offset 0xafc0 + 0xafc0: 0x6c192220, 0xafc2: 0x6c16cc20, + 0xafc6: 0x6c13bc20, + 0xafc8: 0x6c0f4020, 0xafc9: 0x6c066420, 0xafca: 0x6c073c20, + 0xafce: 0x6c193220, + 0xafd1: 0x6c10a220, + 0xafdf: 0x6c193a20, + 0xafe8: 0x6c098c20, 0xafea: 0x6c097c20, + 0xaff0: 0x6c194020, 0xaff1: 0x6c193c20, 0xaff3: 0x6c149620, + 0xaff5: 0x6c193620, 0xaff6: 0x6c194820, 0xaff7: 0x6c193e20, + 0xaffb: 0x6c194420, + 0xaffc: 0x6c062c20, 0xaffd: 0x6c14ce20, + // Block 0x2c0, offset 0xb000 + 0xb000: 0x6c194620, + 0xb004: 0x6c194a20, 0xb006: 0x6c194e20, + 0xb00b: 0x6c07f820, + 0xb00c: 0x6c170820, 0xb00e: 0x6c193820, 0xb00f: 0x6c193420, + 0xb010: 0x6c194c20, 0xb012: 0x6c194220, + 0xb022: 0x6c195220, + 0xb024: 0x6c196420, 0xb025: 0x6c195620, + 0xb028: 0x6c195e20, 0xb02b: 0x6c196020, + 0xb02c: 0x6c195820, 0xb02f: 0x6c199a20, + 0xb032: 0x6c07ea20, 0xb033: 0x6c025620, + 0xb038: 0x6c195420, + 0xb03c: 0x6c196820, 0xb03d: 0x6c00ac20, 0xb03e: 0x6c196620, + // Block 0x2c1, offset 0xb040 + 0xb040: 0x6c000a20, 0xb041: 0x6c12b020, 0xb042: 0x6c196220, + 0xb044: 0x6c195a20, 0xb047: 0x6c195020, + 0xb048: 0x6c195c20, 0xb049: 0x6c07a820, + 0xb058: 0x6c196a20, + 0xb061: 0x6c00ae20, 0xb062: 0x6c197c20, + 0xb065: 0x6c196c20, 0xb066: 0x6c196e20, + 0xb068: 0x6c0a5220, 0xb069: 0x6c146620, + 0xb06d: 0x6c197820, 0xb06e: 0x6c197620, + 0xb072: 0x6c0f8a20, + 0xb07a: 0x6c197a20, + 0xb07d: 0x6c197420, + // Block 0x2c2, offset 0xb080 + 0xb084: 0x6c00e420, 0xb086: 0x6c078420, 0xb087: 0x6c0b2420, + 0xb08f: 0x6c197020, + 0xb090: 0x6c0ff020, + 0xb094: 0x6c197220, 0xb096: 0x6c000420, + 0xb0ae: 0x6c198620, 0xb0af: 0x6c155220, + 0xb0b1: 0x6c0a5620, 0xb0b3: 0x6c199220, + 0xb0b8: 0x6c199020, 0xb0b9: 0x6c197e20, + 0xb0be: 0x6c0d7e20, + // Block 0x2c3, offset 0xb0c0 + 0xb0c0: 0x6c198020, + 0xb0c4: 0x6c0dd620, 0xb0c5: 0x6c198a20, 0xb0c6: 0x6c0a5420, + 0xb0cc: 0x6c198420, 0xb0cf: 0x6c151820, + 0xb0d3: 0x6c055c20, + 0xb0d6: 0x6c198c20, 0xb0d7: 0x6c198e20, + 0xb0dc: 0x6c198820, 0xb0dd: 0x6c199420, + 0xb0e3: 0x6c198220, + 0xb0fb: 0x6c19a020, + 0xb0fc: 0x6c19aa20, 0xb0fe: 0x6c19a220, + // Block 0x2c4, offset 0xb100 + 0xb100: 0x6c199820, 0xb103: 0x6c19ac20, + 0xb104: 0x6c0c9e20, 0xb107: 0x6c19b020, + 0xb109: 0x6c06a020, 0xb10a: 0x6c199c20, 0xb10b: 0x6c0eae20, + 0xb118: 0x6c19a420, 0xb119: 0x6c199620, 0xb11a: 0x6c030a20, + 0xb11c: 0x6c038c20, 0xb11d: 0x6c02be20, 0xb11e: 0x6c19a620, 0xb11f: 0x6c199e20, + 0xb127: 0x6c05d020, + 0xb128: 0x6c19b220, 0xb129: 0x6c19ae20, 0xb12a: 0x6c0ce220, 0xb12b: 0x6c040020, + 0xb12c: 0x6c048020, 0xb12e: 0x6c19a820, + 0xb130: 0x6c051020, + 0xb136: 0x6c010420, + // Block 0x2c5, offset 0xb140 + 0xb144: 0x6c19ba20, 0xb145: 0x6c19b620, 0xb147: 0x6c1a2820, + 0xb154: 0x6c19c020, + 0xb15a: 0x6c19b420, + 0xb15c: 0x6c19bc20, 0xb15f: 0x6c19b820, + 0xb163: 0x6c086c20, + 0xb164: 0x6c19be20, + 0xb177: 0x6c19c420, + 0xb179: 0x6c19ce20, + 0xb17d: 0x6c19ca20, 0xb17e: 0x6c19c820, + // Block 0x2c6, offset 0xb180 + 0xb186: 0x6c0e1820, + 0xb189: 0x6c01c220, + 0xb194: 0x6c19c220, 0xb196: 0x6c19c620, 0xb197: 0x6c0a5820, + 0xb198: 0x6c00e220, 0xb19b: 0x6c19cc20, + 0xb1a9: 0x6c01f420, + 0xb1af: 0x6c19e220, + 0xb1b1: 0x6c0b0020, 0xb1b2: 0x6c19da20, + 0xb1b4: 0x6c19d620, 0xb1b6: 0x6c19d820, + 0xb1b8: 0x6c19dc20, + // Block 0x2c7, offset 0xb1c0 + 0xb1c2: 0x6c00f620, + 0xb1cc: 0x6c0cae20, 0xb1ce: 0x6c19d020, + 0xb1d0: 0x6c19d220, + 0xb1db: 0x6c02e820, + 0xb1e4: 0x6c19e020, + 0xb1e8: 0x6c038e20, 0xb1ea: 0x6c19e620, 0xb1eb: 0x6c19de20, + 0xb1ec: 0x6c19e420, + 0xb1f4: 0x6c133420, + 0xb1f8: 0x6c109220, 0xb1fa: 0x6c11d020, + // Block 0x2c8, offset 0xb200 + 0xb200: 0x6c19ea20, + 0xb206: 0x6c19e820, 0xb207: 0x6c027e20, + 0xb20a: 0x6c19ec20, + 0xb20f: 0x6c19f220, + 0xb214: 0x6c19f020, + 0xb220: 0x6c19ee20, 0xb222: 0x6c111620, + 0xb225: 0x6c19f420, + 0xb22e: 0x6c19f620, + 0xb234: 0x6c19fa20, 0xb236: 0x6c19f820, + 0xb23c: 0x6c19fe20, + // Block 0x2c9, offset 0xb240 + 0xb240: 0x6c1a0420, 0xb241: 0x6c1a0020, 0xb242: 0x6c19fc20, 0xb243: 0x6c1a0220, + 0xb248: 0x6c1a0620, + 0xb24e: 0x6c1a0820, + 0xb251: 0x6c1a0a20, 0xb253: 0x6c1a0c20, + 0xb257: 0x6c1a0e20, + 0xb258: 0x6c183020, 0xb25a: 0x6c098820, 0xb25b: 0x6c086e20, + 0xb25e: 0x6c021e20, + 0xb260: 0x6c00b020, 0xb263: 0x6c0e3c20, + 0xb26e: 0x6c1a1020, + 0xb270: 0x6c076020, 0xb272: 0x6c005e20, 0xb273: 0x6c0b8020, + 0xb279: 0x6c1a1220, 0xb27a: 0x6c062e20, + 0xb27d: 0x6c073e20, 0xb27f: 0x6c1a1620, + // Block 0x2ca, offset 0xb280 + 0xb280: 0x6c1a1420, 0xb283: 0x6c139820, + 0xb284: 0x6c1a1820, + 0xb288: 0x6c1a1c20, 0xb289: 0x6c1a1a20, 0xb28b: 0x6c1a1e20, + 0xb28d: 0x6c1a2020, 0xb28f: 0x6c05d220, + 0xb292: 0x6c013c20, 0xb293: 0x6c1a2220, + 0xb296: 0x6c1a2620, + 0xb298: 0x6c1a2420, + 0xb29c: 0x6c1a2a20, 0xb29f: 0x6c0fe020, + 0xb2a6: 0x6c1a2c20, 0xb2a7: 0x6c002a20, + 0xb2a8: 0x6c07d620, + 0xb2ad: 0x6c055e20, + 0xb2b0: 0x6c0e5220, + 0xb2b7: 0x6c1a2e20, + 0xb2b8: 0x6c1a3020, 0xb2bb: 0x6c1a3420, + // Block 0x2cb, offset 0xb2c0 + 0xb2c0: 0x6c1a3620, 0xb2c2: 0x6c07e020, + 0xb2c7: 0x6c04ca20, + 0xb2ca: 0x6c140220, + 0xb2ce: 0x6c1a3220, 0xb2cf: 0x6c1a3820, + 0xb2d0: 0x6c079a20, 0xb2d1: 0x6c06a220, + 0xb2e1: 0x6c1a4020, + 0xb2e4: 0x6c076220, 0xb2e6: 0x6c0e1a20, + 0xb2e9: 0x6c1a3a20, 0xb2ea: 0x6c0f2420, + 0xb2ff: 0x6c1a4220, + // Block 0x2cc, offset 0xb300 + 0xb302: 0x6c0b8820, + 0xb308: 0x6c1a3e20, 0xb309: 0x6c1a4420, 0xb30b: 0x6c056220, + 0xb313: 0x6c1a4620, + 0xb320: 0x6c1a4820, 0xb322: 0x6c06a420, 0xb323: 0x6c027420, + 0xb324: 0x6c1a4c20, + 0xb32a: 0x6c1a4e20, + 0xb330: 0x6c1a5020, 0xb333: 0x6c1a4a20, + // Block 0x2cd, offset 0xb340 + 0xb340: 0x6c1a3c20, 0xb343: 0x6c1a5220, + 0xb346: 0x6c1a5420, + 0xb34b: 0x6c145c20, + 0xb34e: 0x6c0ade20, + 0xb352: 0x6c1a5820, 0xb353: 0x6c1a5a20, + 0xb354: 0x6c1a5620, 0xb356: 0x6c1a5e20, + 0xb35c: 0x6c111420, 0xb35f: 0x6c009020, + 0xb360: 0x6c12c820, 0xb363: 0x6c1a6020, + 0xb374: 0x6c0b0220, 0xb377: 0x6c090220, + 0xb379: 0x6c115e20, 0xb37a: 0x6c039020, + 0xb37c: 0x6c07ee20, + // Block 0x2ce, offset 0xb380 + 0xb380: 0x6c144620, 0xb382: 0x6c104c20, + 0xb385: 0x6c05d420, 0xb386: 0x6c0d9620, + 0xb38a: 0x6c1a5c20, 0xb38b: 0x6c1a6220, + 0xb395: 0x6c0d8020, + 0xb399: 0x6c1a6420, + 0xb39d: 0x6c1a6620, + 0xb3a1: 0x6c1a6a20, + 0xb3a4: 0x6c0f4220, + 0xb3aa: 0x6c030c20, + 0xb3af: 0x6c319c20, + 0xb3b0: 0x6c013e20, 0xb3b1: 0x6c13be20, + 0xb3b4: 0x6c0ae020, 0xb3b5: 0x6c0fbc20, + 0xb3ba: 0x6c07e420, + 0xb3bd: 0x6c1a7620, + // Block 0x2cf, offset 0xb3c0 + 0xb3c0: 0x6c135220, 0xb3c1: 0x6c168220, + 0xb3ca: 0x6c022020, 0xb3cb: 0x6c1a6e20, + 0xb3d1: 0x6c0cb020, 0xb3d2: 0x6c1a7420, + 0xb3d4: 0x6c0ff220, 0xb3d7: 0x6c0fbe20, + 0xb3d8: 0x6c0ff420, 0xb3d9: 0x6c11d220, 0xb3da: 0x6c0f0a20, + 0xb3de: 0x6c07aa20, + 0xb3e2: 0x6c1a6c20, + 0xb3e9: 0x6c016820, 0xb3eb: 0x6c0f9820, + 0xb3f0: 0x6c1a7020, 0xb3f2: 0x6c1a6820, + 0xb3f5: 0x6c0b6420, + 0xb3f9: 0x6c1a7820, + 0xb3fe: 0x6c09e820, + // Block 0x2d0, offset 0xb400 + 0xb403: 0x6c048220, + 0xb405: 0x6c1a7a20, + 0xb413: 0x6c13a820, + 0xb417: 0x6c0d3620, + 0xb41c: 0x6c0efc20, 0xb41f: 0x6c1a7e20, + 0xb428: 0x6c143220, 0xb42b: 0x6c1a8020, + 0xb42e: 0x6c1a8a20, + 0xb433: 0x6c133620, + 0xb438: 0x6c1a8820, 0xb439: 0x6c1a7c20, 0xb43a: 0x6c1a8220, 0xb43b: 0x6c1a8620, + 0xb43e: 0x6c076420, + // Block 0x2d1, offset 0xb440 + 0xb441: 0x6c136a20, + 0xb445: 0x6c1a8c20, 0xb447: 0x6c0e3e20, + 0xb44a: 0x6c022220, + 0xb44c: 0x6c0ae220, + 0xb451: 0x6c1a9020, 0xb453: 0x6c1a8e20, + 0xb455: 0x6c072c20, 0xb457: 0x6c1a9220, + 0xb458: 0x6c1a9620, 0xb459: 0x6c1a9420, + 0xb45c: 0x6c1a9a20, 0xb45e: 0x6c1a8420, 0xb45f: 0x6c1a9e20, + 0xb464: 0x6c1a9c20, 0xb465: 0x6c1a9820, + 0xb46b: 0x6c087020, + 0xb46c: 0x6c0b6620, 0xb46e: 0x6c0ce420, 0xb46f: 0x6c1aa020, + 0xb470: 0x6c0bf820, 0xb471: 0x6c009a20, 0xb472: 0x6c116c20, + 0xb477: 0x6c0f2620, + 0xb479: 0x6c1aa420, 0xb47a: 0x6c1aa220, 0xb47b: 0x6c1aa620, + 0xb47c: 0x6c1aa820, 0xb47d: 0x6c1aaa20, + // Block 0x2d2, offset 0xb480 + 0xb482: 0x6c1aac20, + 0xb489: 0x6c137a20, 0xb48a: 0x6c1aae20, + 0xb48f: 0x6c01c420, + 0xb490: 0x6c1ab020, + 0xb495: 0x6c158420, 0xb496: 0x6c025420, + 0xb498: 0x6c18f420, 0xb499: 0x6c09dc20, 0xb49a: 0x6c0d7620, 0xb49b: 0x6c1ab220, + 0xb49c: 0x6c152620, + 0xb4a2: 0x6c14b820, + 0xb4a5: 0x6c1ab620, 0xb4a7: 0x6c0dc620, + 0xb4a9: 0x6c0f9a20, 0xb4aa: 0x6c0d7820, 0xb4ab: 0x6c12ca20, + 0xb4ac: 0x6c1ab820, 0xb4ad: 0x6c1aba20, 0xb4ae: 0x6c017220, + 0xb4b1: 0x6c090420, 0xb4b2: 0x6c1abc20, + 0xb4b7: 0x6c006020, + 0xb4b8: 0x6c1abe20, + 0xb4be: 0x6c1ac020, + // Block 0x2d3, offset 0xb4c0 + 0xb4c4: 0x6c014020, 0xb4c7: 0x6c039220, + 0xb4c8: 0x6c10a820, 0xb4c9: 0x6c13c020, + 0xb4ce: 0x6c1ac820, 0xb4cf: 0x6c0ce620, + 0xb4d0: 0x6c1ac620, 0xb4d1: 0x6c056420, + 0xb4d4: 0x6c144a20, 0xb4d5: 0x6c1ac420, 0xb4d7: 0x6c0ff620, + 0xb4d8: 0x6c1acc20, 0xb4da: 0x6c1aca20, + 0xb4e0: 0x6c1ad020, 0xb4e2: 0x6c1ace20, + 0xb4e5: 0x6c017420, 0xb4e7: 0x6c1ad220, + 0xb4e8: 0x6c0a5a20, 0xb4e9: 0x6c1ad620, 0xb4ea: 0x6c0dfe20, + 0xb4ec: 0x6c1ad420, 0xb4ee: 0x6c133e20, + 0xb4f3: 0x6c0a3a20, + 0xb4f4: 0x6c0fe220, + 0xb4f8: 0x6c1ad820, + 0xb4fd: 0x6c06a620, + // Block 0x2d4, offset 0xb500 + 0xb501: 0x6c1ada20, 0xb502: 0x6c10e620, 0xb503: 0x6c121c20, + 0xb504: 0x6c14f220, + 0xb50a: 0x6c10ee20, + 0xb50d: 0x6c1aec20, + 0xb513: 0x6c03dc20, + 0xb516: 0x6c159620, + 0xb519: 0x6c14ae20, 0xb51b: 0x6c1baa20, + 0xb51d: 0x6c1adc20, + 0xb523: 0x6c1ae220, + 0xb525: 0x6c0d8220, + 0xb528: 0x6c140420, + 0xb52c: 0x6c0fc020, + 0xb532: 0x6c1ae420, + 0xb539: 0x6c145e20, 0xb53b: 0x6c07ac20, + 0xb53e: 0x6c0a5c20, + // Block 0x2d5, offset 0xb540 + 0xb546: 0x6c1ae620, + 0xb549: 0x6c087420, 0xb54b: 0x6c087220, + 0xb550: 0x6c003220, 0xb551: 0x6c063020, 0xb553: 0x6c0bd620, + 0xb554: 0x6c006220, + 0xb559: 0x6c1aee20, 0xb55a: 0x6c1af020, + 0xb55c: 0x6c1aea20, + 0xb565: 0x6c00ec20, 0xb566: 0x6c030e20, + 0xb568: 0x6c1ae820, 0xb56a: 0x6c14da20, 0xb56b: 0x6c127e20, + 0xb576: 0x6c001020, + 0xb57b: 0x6c00b220, + 0xb57f: 0x6c087620, + // Block 0x2d6, offset 0xb580 + 0xb581: 0x6c006420, 0xb583: 0x6c000620, + 0xb589: 0x6c1afa20, + 0xb591: 0x6c1af620, + 0xb598: 0x6c14c820, 0xb59a: 0x6c1afc20, + 0xb59c: 0x6c1af820, 0xb59f: 0x6c1af420, + 0xb5a0: 0x6c0b2620, + 0xb5a5: 0x6c1af220, + 0xb5a9: 0x6c138c20, + 0xb5af: 0x6c066820, + 0xb5b5: 0x6c1b0420, 0xb5b6: 0x6c1b0620, + 0xb5bc: 0x6c0a5e20, + // Block 0x2d7, offset 0xb5c0 + 0xb5c0: 0x6c1afe20, 0xb5c1: 0x6c16dc20, + 0xb5c6: 0x6c113c20, + 0xb5c9: 0x6c1b0220, + 0xb5da: 0x6c076620, + 0xb5e2: 0x6c1b0820, + 0xb5e6: 0x6c12cc20, + 0xb5ea: 0x6c1b0a20, + 0xb5ec: 0x6c1b0020, + 0xb5ff: 0x6c14c620, + // Block 0x2d8, offset 0xb600 + 0xb612: 0x6c116020, + 0xb61a: 0x6c1b0c20, 0xb61b: 0x6c128020, + 0xb63c: 0x6c1b0e20, 0xb63d: 0x6c1b1620, 0xb63e: 0x6c1b1020, + // Block 0x2d9, offset 0xb640 + 0xb641: 0x6c01c620, 0xb642: 0x6c1b1420, + 0xb649: 0x6c090620, 0xb64b: 0x6c1b1220, + 0xb64c: 0x6c05d620, + 0xb650: 0x6c1b2e20, + 0xb656: 0x6c1b2020, 0xb657: 0x6c1b1a20, + 0xb661: 0x6c0e7c20, 0xb663: 0x6c1b1820, + 0xb666: 0x6c1b1c20, + 0xb669: 0x6c1b1e20, + 0xb67a: 0x6c1b2220, 0xb67b: 0x6c1b2420, + // Block 0x2da, offset 0xb680 + 0xb689: 0x6c039420, 0xb68b: 0x6c1b2820, + 0xb68c: 0x6c1b2620, + 0xb696: 0x6c1b2a20, + 0xb6a2: 0x6c0ae420, + 0xb6aa: 0x6c1b3020, + 0xb6ac: 0x6c0f2820, + 0xb6b0: 0x6c010620, 0xb6b2: 0x6c1b2c20, + 0xb6b6: 0x6c1b3220, + 0xb6be: 0x6c1b3420, + // Block 0x2db, offset 0xb6c0 + 0xb6c0: 0x6c1b3a20, 0xb6c3: 0x6c1b3620, + 0xb6c5: 0x6c1b3820, + 0xb6d0: 0x6c087820, 0xb6d1: 0x6c1b3c20, + 0xb6d4: 0x6c06a820, 0xb6d5: 0x6c1b3e20, 0xb6d7: 0x6c08c820, + 0xb6d8: 0x6c0d6820, 0xb6da: 0x6c1b4020, 0xb6db: 0x6c1b4220, + 0xb6dc: 0x6c088820, 0xb6dd: 0x6c06aa20, 0xb6df: 0x6c14f420, + 0xb6e3: 0x6c03bc20, + 0xb6e4: 0x6c063220, 0xb6e5: 0x6c1b4420, 0xb6e6: 0x6c02a420, + 0xb6e9: 0x6c1b4620, 0xb6eb: 0x6c0d6a20, + 0xb6f0: 0x6c1b4820, 0xb6f1: 0x6c1b9820, 0xb6f3: 0x6c1b4a20, + 0xb6f5: 0x6c1b4c20, + 0xb6f8: 0x6c1b4e20, 0xb6fa: 0x6c1b5220, + // Block 0x2dc, offset 0xb700 + 0xb700: 0x6c1b5420, 0xb703: 0x6c1b5620, + 0xb705: 0x6c0dd820, 0xb707: 0x6c00ca20, + 0xb708: 0x6c096220, 0xb709: 0x6c004420, 0xb70b: 0x6c0cea20, + 0xb70c: 0x6c031020, 0xb70d: 0x6c08fa20, 0xb70f: 0x6c06ac20, + 0xb715: 0x6c0ff820, 0xb717: 0x6c098e20, + 0xb718: 0x6c031220, 0xb719: 0x6c0e8420, 0xb71a: 0x6c0f4420, 0xb71b: 0x6c003020, + 0xb71c: 0x6c03de20, 0xb71d: 0x6c13c220, 0xb71f: 0x6c091420, + 0xb722: 0x6c041020, 0xb723: 0x6c0c5620, + 0xb724: 0x6c090820, 0xb725: 0x6c155c20, 0xb726: 0x6c1b5820, + 0xb72e: 0x6c042420, + 0xb730: 0x6c07ae20, 0xb733: 0x6c025820, + 0xb734: 0x6c014220, 0xb735: 0x6c0a6020, 0xb736: 0x6c01c820, + 0xb738: 0x6c1b5a20, 0xb739: 0x6c159820, + 0xb73f: 0x6c09de20, + // Block 0x2dd, offset 0xb740 + 0xb742: 0x6c095820, 0xb743: 0x6c1b5c20, + 0xb744: 0x6c039620, 0xb745: 0x6c108c20, 0xb746: 0x6c14a220, 0xb747: 0x6c1b5e20, + 0xb749: 0x6c1b6020, + 0xb74c: 0x6c12ce20, + 0xb750: 0x6c1b6420, 0xb752: 0x6c030020, 0xb753: 0x6c051620, + 0xb754: 0x6c1b6220, + 0xb75b: 0x6c031420, + 0xb75d: 0x6c0b2820, 0xb75e: 0x6c1b6c20, 0xb75f: 0x6c081620, + 0xb761: 0x6c01ca20, 0xb762: 0x6c1b6a20, + 0xb764: 0x6c1b6620, 0xb765: 0x6c1b6e20, 0xb766: 0x6c1b6820, 0xb767: 0x6c10fa20, + 0xb768: 0x6c205420, 0xb769: 0x6c0b2a20, 0xb76b: 0x6c1b7020, + 0xb76e: 0x6c164820, + 0xb770: 0x6c1b7220, 0xb773: 0x6c1b7620, + 0xb775: 0x6c0eb020, 0xb776: 0x6c1b7420, + 0xb778: 0x6c0bc620, 0xb77a: 0x6c08ca20, + 0xb77e: 0x6c0d9820, 0xb77f: 0x6c097e20, + // Block 0x2de, offset 0xb780 + 0xb781: 0x6c130620, 0xb782: 0x6c0c5820, + 0xb784: 0x6c092a20, 0xb785: 0x6c1b7820, 0xb786: 0x6c0a6220, 0xb787: 0x6c1b7a20, + 0xb788: 0x6c1b7c20, 0xb789: 0x6c006620, 0xb78a: 0x6c0d6c20, 0xb78b: 0x6c0b6820, + 0xb78d: 0x6c1b7e20, 0xb78e: 0x6c104e20, 0xb78f: 0x6c0a6420, + 0xb791: 0x6c0a6620, 0xb793: 0x6c1b8020, + 0xb796: 0x6c0c5a20, + 0xb79a: 0x6c0a6820, + 0xb7a0: 0x6c1b8220, 0xb7a2: 0x6c1b8420, + 0xb7a4: 0x6c151020, + 0xb7a8: 0x6c1b8620, + 0xb7ad: 0x6c04b420, + 0xb7b1: 0x6c099020, + 0xb7b8: 0x6c1b8820, 0xb7b9: 0x6c1b8a20, 0xb7ba: 0x6c094820, 0xb7bb: 0x6c0b1c20, + 0xb7bc: 0x6c10d020, 0xb7bd: 0x6c0b6c20, 0xb7be: 0x6c125020, 0xb7bf: 0x6c10e820, + // Block 0x2df, offset 0xb7c0 + 0xb7c0: 0x6c04ba20, 0xb7c1: 0x6c1b8c20, + 0xb7c5: 0x6c044a20, 0xb7c6: 0x6c1b8e20, + 0xb7c8: 0x6c052420, 0xb7ca: 0x6c108620, 0xb7cb: 0x6c019820, + 0xb7cd: 0x6c087a20, 0xb7ce: 0x6c1b9020, 0xb7cf: 0x6c1b9620, + 0xb7d0: 0x6c1b9420, 0xb7d1: 0x6c052220, 0xb7d3: 0x6c1b9220, + 0xb7d5: 0x6c0f9c20, + 0xb7de: 0x6c0d5820, + 0xb7e0: 0x6c0fc220, 0xb7e1: 0x6c092020, + 0xb7e4: 0x6c0cec20, 0xb7e5: 0x6c160020, + 0xb7ec: 0x6c1b9a20, 0xb7ee: 0x6c1b9c20, 0xb7ef: 0x6c109420, + 0xb7f1: 0x6c083a20, + 0xb7f6: 0x6c1ba020, + 0xb7f9: 0x6c1ba220, + // Block 0x2e0, offset 0xb800 + 0xb80c: 0x6c1ba420, + 0xb810: 0x6c039820, 0xb811: 0x6c1ba620, + 0xb814: 0x6c1ba820, + 0xb821: 0x6c019020, + 0xb828: 0x6c0cb220, 0xb829: 0x6c037820, 0xb82b: 0x6c1bac20, + 0xb82c: 0x6c14a020, + 0xb831: 0x6c0d9c20, 0xb833: 0x6c02a620, + 0xb836: 0x6c1bb020, 0xb837: 0x6c1bb420, + 0xb838: 0x6c036e20, 0xb83b: 0x6c1bae20, + 0xb83c: 0x6c1bb220, 0xb83e: 0x6c1bb820, + // Block 0x2e1, offset 0xb840 + 0xb845: 0x6c1bb620, 0xb847: 0x6c1bba20, + 0xb859: 0x6c1bbc20, + 0xb860: 0x6c106220, 0xb861: 0x6c048420, + 0xb868: 0x6c020220, 0xb869: 0x6c1bbe20, 0xb86a: 0x6c1bc820, + 0xb86d: 0x6c1bc420, 0xb86f: 0x6c13c620, + 0xb870: 0x6c13c420, + 0xb876: 0x6c0ffa20, + 0xb87a: 0x6c1bc220, 0xb87b: 0x6c09f420, + 0xb87d: 0x6c1bc020, + // Block 0x2e2, offset 0xb880 + 0xb887: 0x6c0ba820, + 0xb88b: 0x6c1bca20, + 0xb88e: 0x6c07ec20, + 0xb891: 0x6c1bd620, + 0xb894: 0x6c1bd820, 0xb895: 0x6c1bcc20, 0xb896: 0x6c025a20, 0xb897: 0x6c1bce20, + 0xb898: 0x6c1be020, 0xb899: 0x6c1bde20, 0xb89a: 0x6c1bdc20, 0xb89b: 0x6c1bd420, + 0xb89f: 0x6c1bd220, + 0xb8a2: 0x6c1bda20, + 0xb8a9: 0x6c13c820, + // Block 0x2e3, offset 0xb8c0 + 0xb8cb: 0x6c1be820, + 0xb8cc: 0x6c1be220, 0xb8ce: 0x6c1be620, + 0xb8d0: 0x6c15f020, 0xb8d2: 0x6c1be420, + 0xb8dc: 0x6c1bd020, + 0xb8e9: 0x6c0baa20, + 0xb8ec: 0x6c1bea20, 0xb8ef: 0x6c078620, + 0xb8f3: 0x6c1bec20, + 0xb8f6: 0x6c1bee20, + // Block 0x2e4, offset 0xb900 + 0xb902: 0x6c1bf420, + 0xb904: 0x6c1bf220, 0xb907: 0x6c1bf020, + 0xb90b: 0x6c0ffc20, + 0xb90c: 0x6c1bc620, + 0xb910: 0x6c1c0020, + 0xb91d: 0x6c1bf820, + 0xb922: 0x6c1bf620, + 0xb92c: 0x6c1bfa20, 0xb92e: 0x6c1bfc20, + 0xb937: 0x6c1c0220, + 0xb93a: 0x6c169420, + 0xb93c: 0x6c1c0420, 0xb93d: 0x6c1bfe20, + // Block 0x2e5, offset 0xb940 + 0xb949: 0x6c1c0620, + 0xb94c: 0x6c037020, 0xb94d: 0x6c1c0820, + 0xb952: 0x6c1c0c20, 0xb953: 0x6c1c0a20, + 0xb956: 0x6c1c0e20, + 0xb95b: 0x6c1c1020, + 0xb95d: 0x6c0c5c20, 0xb95e: 0x6c099220, + 0xb961: 0x6c0a1420, 0xb963: 0x6c0d0220, + 0xb965: 0x6c06ae20, 0xb966: 0x6c078820, 0xb967: 0x6c06b020, + 0xb968: 0x6c044c20, 0xb96b: 0x6c1c1220, + 0xb96e: 0x6c078a20, + 0xb971: 0x6c063420, 0xb972: 0x6c1c1420, 0xb973: 0x6c149c20, + 0xb974: 0x6c112a20, 0xb975: 0x6c1c1620, 0xb977: 0x6c06b220, + 0xb97b: 0x6c030820, + 0xb97d: 0x6c0e0220, 0xb97e: 0x6c04cc20, + // Block 0x2e6, offset 0xb980 + 0xb982: 0x6c087c20, 0xb983: 0x6c12d220, + 0xb986: 0x6c11e220, + 0xb98b: 0x6c1c1820, + 0xb98c: 0x6c039a20, + 0xb991: 0x6c1c1e20, + 0xb996: 0x6c0eb220, + 0xb999: 0x6c1c1c20, 0xb99a: 0x6c1c1a20, 0xb99b: 0x6c1c2020, + 0xb99d: 0x6c0f4620, + 0xb9a5: 0x6c0b8a20, + 0xb9ab: 0x6c087e20, + 0xb9ad: 0x6c0c1420, 0xb9af: 0x6c0d9e20, + 0xb9b0: 0x6c03b020, 0xb9b3: 0x6c0eb420, + 0xb9b6: 0x6c1c2220, 0xb9b7: 0x6c1c2420, + 0xb9b8: 0x6c0ae620, + 0xb9bd: 0x6c140620, + // Block 0x2e7, offset 0xb9c0 + 0xb9c0: 0x6c1c2a20, 0xb9c3: 0x6c1c2820, + 0xb9c4: 0x6c1c2620, 0xb9c5: 0x6c131620, 0xb9c7: 0x6c1c3820, + 0xb9cc: 0x6c144820, 0xb9ce: 0x6c1c2c20, + 0xb9d4: 0x6c1c3020, 0xb9d5: 0x6c146a20, 0xb9d7: 0x6c1c2e20, + 0xb9df: 0x6c1c3220, + 0xb9e1: 0x6c11b020, 0xb9e2: 0x6c1c3420, 0xb9e3: 0x6c135420, + 0xb9e4: 0x6c1c3620, + 0xb9f2: 0x6c031620, 0xb9f3: 0x6c135620, + 0xb9f4: 0x6c110220, 0xb9f5: 0x6c1c3a20, 0xb9f6: 0x6c1c3c20, + 0xb9f8: 0x6c06b420, 0xb9f9: 0x6c031820, 0xb9fa: 0x6c1c3e20, 0xb9fb: 0x6c061020, + 0xb9fc: 0x6c159420, 0xb9fd: 0x6c155e20, 0xb9fe: 0x6c039c20, 0xb9ff: 0x6c1c4220, + // Block 0x2e8, offset 0xba00 + 0xba01: 0x6c0eb620, 0xba03: 0x6c06b620, + 0xba04: 0x6c0a6a20, 0xba07: 0x6c121e20, + 0xba0a: 0x6c0a6c20, + 0xba0f: 0x6c0a3c20, + 0xba15: 0x6c0f4820, 0xba16: 0x6c13ca20, 0xba17: 0x6c0f9e20, + 0xba1a: 0x6c06b820, + 0xba1c: 0x6c12d420, + 0xba20: 0x6c1c4420, + 0xba26: 0x6c0fde20, 0xba27: 0x6c079c20, + 0xba2b: 0x6c063620, + 0xba2d: 0x6c0f4a20, + 0xba35: 0x6c004620, 0xba36: 0x6c0a2820, 0xba37: 0x6c06ba20, + 0xba38: 0x6c159a20, + // Block 0x2e9, offset 0xba40 + 0xba41: 0x6c1c4620, 0xba42: 0x6c1c4820, 0xba43: 0x6c114620, + 0xba48: 0x6c1c4a20, 0xba49: 0x6c16b620, 0xba4a: 0x6c16de20, + 0xba4f: 0x6c1c4e20, + 0xba50: 0x6c1c4c20, 0xba53: 0x6c028220, + 0xba56: 0x6c1c5020, + 0xba5a: 0x6c1c5620, 0xba5b: 0x6c1c5820, + 0xba5d: 0x6c1c5420, 0xba5f: 0x6c129c20, + 0xba60: 0x6c0a6e20, 0xba61: 0x6c1c5c20, 0xba62: 0x6c1c5a20, 0xba63: 0x6c1c5220, + 0xba68: 0x6c1c5e20, 0xba69: 0x6c1c6020, + 0xba6c: 0x6c1c6220, + 0xba70: 0x6c1c6820, 0xba71: 0x6c1c6420, 0xba73: 0x6c1c6620, + 0xba74: 0x6c1c6a20, 0xba76: 0x6c014420, 0xba77: 0x6c0f4c20, + 0xba78: 0x6c1c6c20, 0xba7a: 0x6c05d820, 0xba7b: 0x6c022420, + 0xba7c: 0x6c111020, 0xba7e: 0x6c1c6e20, 0xba7f: 0x6c10de20, + // Block 0x2ea, offset 0xba80 + 0xba81: 0x6c138e20, 0xba83: 0x6c1c7020, + 0xba84: 0x6c16e020, + 0xba89: 0x6c1c7220, 0xba8a: 0x6c135820, 0xba8b: 0x6c1c7820, + 0xba8c: 0x6c172c20, 0xba8d: 0x6c174c20, 0xba8f: 0x6c08f020, + 0xba90: 0x6c10d220, 0xba91: 0x6c1c7a20, 0xba93: 0x6c042620, + 0xba94: 0x6c0eb820, 0xba95: 0x6c00b420, 0xba96: 0x6c1c7c20, 0xba97: 0x6c132420, + 0xba98: 0x6c06bc20, 0xba9b: 0x6c0e5420, + 0xba9f: 0x6c0f4e20, + 0xbaa5: 0x6c152e20, 0xbaa6: 0x6c061220, 0xbaa7: 0x6c063820, + 0xbaa9: 0x6c1c7e20, + 0xbaad: 0x6c1c8020, 0xbaaf: 0x6c1c8c20, + 0xbab1: 0x6c095a20, + 0xbab5: 0x6c0eba20, 0xbab7: 0x6c048620, + 0xbab8: 0x6c1c8220, + 0xbabc: 0x6c127220, 0xbabe: 0x6c0e4020, + // Block 0x2eb, offset 0xbac0 + 0xbac1: 0x6c1c8420, + 0xbac8: 0x6c1c8620, 0xbaca: 0x6c048820, + 0xbacc: 0x6c1c8820, 0xbace: 0x6c1c8a20, + 0xbad1: 0x6c1c8e20, 0xbad3: 0x6c101820, + 0xbad6: 0x6c1c9020, 0xbad7: 0x6c1c9220, + 0xbad9: 0x6c1c9420, + 0xbadc: 0x6c1c7620, 0xbadd: 0x6c1c7420, + 0xbae1: 0x6c1c9620, 0xbae2: 0x6c056620, + 0xbae6: 0x6c126a20, + 0xbae9: 0x6c07b020, 0xbaea: 0x6c128a20, 0xbaeb: 0x6c0ebc20, + 0xbaec: 0x6c12b220, 0xbaed: 0x6c1c9820, + 0xbaf0: 0x6c0a7020, 0xbaf1: 0x6c010820, 0xbaf3: 0x6c1c9a20, + 0xbaf7: 0x6c1c9c20, + 0xbaf9: 0x6c153420, + 0xbafc: 0x6c122020, 0xbaff: 0x6c1ca220, + // Block 0x2ec, offset 0xbb00 + 0xbb00: 0x6c017620, 0xbb01: 0x6c0bd820, 0xbb02: 0x6c1ca020, 0xbb03: 0x6c1c9e20, + 0xbb04: 0x6c056820, 0xbb05: 0x6c0da020, 0xbb07: 0x6c1caa20, + 0xbb08: 0x6c1ca620, 0xbb0a: 0x6c1ca420, 0xbb0b: 0x6c161620, + 0xbb0c: 0x6c066a20, + 0xbb10: 0x6c0a3e20, 0xbb11: 0x6c1ca820, 0xbb12: 0x6c0fc420, 0xbb13: 0x6c09c820, + 0xbb17: 0x6c106820, + 0xbb18: 0x6c1cb020, 0xbb19: 0x6c1cae20, + 0xbb1e: 0x6c1cac20, + 0xbb20: 0x6c1cb220, 0xbb21: 0x6c066c20, + 0xbb28: 0x6c1cb420, 0xbb29: 0x6c131420, 0xbb2a: 0x6c0a0220, + 0xbb2d: 0x6c1cb620, 0xbb2e: 0x6c125220, + 0xbb33: 0x6c106a20, + 0xbb34: 0x6c0ebe20, + 0xbb39: 0x6c0f8c20, + 0xbb3c: 0x6c1cb820, 0xbb3d: 0x6c03c220, + // Block 0x2ed, offset 0xbb40 + 0xbb43: 0x6c0b2c20, + 0xbb45: 0x6c127420, + 0xbb4c: 0x6c039e20, 0xbb4d: 0x6c10f020, + 0xbb56: 0x6c1cba20, 0xbb57: 0x6c088020, + 0xbb58: 0x6c140820, 0xbb59: 0x6c140a20, + 0xbb5c: 0x6c017820, 0xbb5d: 0x6c1cc420, + 0xbb60: 0x6c0e8620, + 0xbb64: 0x6c1cbe20, + 0xbb6b: 0x6c022620, + 0xbb70: 0x6c1d2420, 0xbb71: 0x6c1cc220, + 0xbb75: 0x6c110420, + 0xbb78: 0x6c1cc020, 0xbb7b: 0x6c1cbc20, + 0xbb7d: 0x6c075020, 0xbb7f: 0x6c1cc820, + // Block 0x2ee, offset 0xbb80 + 0xbb8e: 0x6c1cd420, 0xbb8f: 0x6c1ce020, + 0xbb90: 0x6c1cd020, 0xbb92: 0x6c0fe420, + 0xbb95: 0x6c1cda20, 0xbb96: 0x6c12d620, + 0xbb99: 0x6c1cce20, 0xbb9b: 0x6c1cd820, + 0xbb9c: 0x6c169620, 0xbb9d: 0x6c088220, + 0xbba0: 0x6c0da220, 0xbba1: 0x6c1cca20, + 0xbba5: 0x6c042820, 0xbba6: 0x6c1cde20, 0xbba7: 0x6c0bda20, + 0xbba8: 0x6c014620, 0xbba9: 0x6c1cd220, 0xbbaa: 0x6c022820, 0xbbab: 0x6c1cdc20, + 0xbbaf: 0x6c048a20, + 0xbbb1: 0x6c1cd620, + 0xbbba: 0x6c1ce220, + // Block 0x2ef, offset 0xbbc0 + 0xbbc1: 0x6c1ce620, 0xbbc2: 0x6c1cfa20, 0xbbc3: 0x6c1cf620, + 0xbbc6: 0x6c1cf020, + 0xbbca: 0x6c1cee20, 0xbbcb: 0x6c16b820, + 0xbbcd: 0x6c1cf220, + 0xbbd0: 0x6c048c20, 0xbbd2: 0x6c06be20, + 0xbbd5: 0x6c0a4020, + 0xbbd9: 0x6c1d0020, 0xbbda: 0x6c1ce420, + 0xbbdf: 0x6c1cec20, + 0xbbe0: 0x6c1ccc20, 0xbbe2: 0x6c022c20, 0xbbe3: 0x6c1cf420, + 0xbbe4: 0x6c1cf820, 0xbbe5: 0x6c0e5620, + 0xbbe8: 0x6c076820, 0xbbe9: 0x6c01a820, 0xbbea: 0x6c1ce820, 0xbbeb: 0x6c1cfe20, + 0xbbec: 0x6c1cfc20, 0xbbed: 0x6c048e20, 0xbbef: 0x6c0d4a20, + 0xbbf0: 0x6c02c020, + 0xbbf5: 0x6c056a20, 0xbbf7: 0x6c1cea20, + // Block 0x2f0, offset 0xbc00 + 0xbc01: 0x6c1d0220, 0xbc03: 0x6c1d0820, + 0xbc04: 0x6c1d0c20, + 0xbc09: 0x6c090a20, 0xbc0b: 0x6c1d1820, + 0xbc0c: 0x6c0f5020, 0xbc0d: 0x6c1d0420, + 0xbc12: 0x6c1d1420, + 0xbc14: 0x6c022a20, 0xbc16: 0x6c1d1020, 0xbc17: 0x6c1d1220, + 0xbc1a: 0x6c1d0a20, 0xbc1b: 0x6c1d0e20, + 0xbc1f: 0x6c066e20, + 0xbc20: 0x6c156020, 0xbc23: 0x6c031a20, + 0xbc26: 0x6c012e20, 0xbc27: 0x6c1d1620, + 0xbc29: 0x6c111820, 0xbc2a: 0x6c001a20, + 0xbc32: 0x6c122220, 0xbc33: 0x6c1cc620, + 0xbc34: 0x6c1d2220, 0xbc35: 0x6c1d2a20, 0xbc36: 0x6c151a20, + 0xbc38: 0x6c1d1c20, + 0xbc3c: 0x6c0ffe20, 0xbc3d: 0x6c1d2620, + // Block 0x2f1, offset 0xbc40 + 0xbc45: 0x6c0ae820, 0xbc46: 0x6c1d2820, 0xbc47: 0x6c109620, + 0xbc51: 0x6c171220, 0xbc53: 0x6c1d2020, + 0xbc58: 0x6c1d2c20, 0xbc5a: 0x6c075220, + 0xbc5c: 0x6c0c1620, 0xbc5f: 0x6c006820, + 0xbc60: 0x6c1d1e20, 0xbc61: 0x6c1d1a20, 0xbc63: 0x6c0cf020, + 0xbc67: 0x6c1d0620, + 0xbc68: 0x6c083c20, + 0xbc70: 0x6c0d8420, 0xbc71: 0x6c1d4420, 0xbc73: 0x6c0cf220, + 0xbc74: 0x6c1d3a20, 0xbc76: 0x6c1d3420, 0xbc77: 0x6c1d3620, + 0xbc79: 0x6c095c20, 0xbc7a: 0x6c1d3c20, 0xbc7b: 0x6c1d4220, + // Block 0x2f2, offset 0xbc80 + 0xbc80: 0x6c1d3820, 0xbc81: 0x6c099620, 0xbc83: 0x6c1d3e20, + 0xbc86: 0x6c1d3220, + 0xbc88: 0x6c154820, 0xbc89: 0x6c154620, + 0xbc8d: 0x6c1d4620, 0xbc8e: 0x6c1d4820, 0xbc8f: 0x6c006a20, + 0xbc95: 0x6c1d3020, + 0xbc9a: 0x6c050c20, 0xbc9b: 0x6c000c20, + 0xbc9f: 0x6c031c20, + 0xbca1: 0x6c1d4020, + 0xbca7: 0x6c1d5020, + 0xbca8: 0x6c1d4e20, + 0xbcac: 0x6c1d5820, + 0xbcb4: 0x6c1d5a20, + 0xbcbc: 0x6c1d5620, 0xbcbd: 0x6c1d5c20, 0xbcbe: 0x6c1d4c20, 0xbcbf: 0x6c1d5420, + // Block 0x2f3, offset 0xbcc0 + 0xbcc2: 0x6c1d5e20, + 0xbcc4: 0x6c1d6020, 0xbcc7: 0x6c1d4a20, + 0xbcc8: 0x6c08cc20, 0xbcca: 0x6c1d5220, 0xbccb: 0x6c0da420, + 0xbccc: 0x6c06c020, 0xbccd: 0x6c1d2e20, 0xbcce: 0x6c0b2e20, + 0xbcd3: 0x6c1d7a20, + 0xbcd5: 0x6c13aa20, + 0xbcd8: 0x6c1d6620, 0xbcd9: 0x6c1d6820, 0xbcda: 0x6c1d6a20, + 0xbcdd: 0x6c1d7820, 0xbcdf: 0x6c1d7620, + 0xbce2: 0x6c148e20, 0xbce3: 0x6c031e20, + 0xbce5: 0x6c1d7220, 0xbce7: 0x6c056e20, + 0xbce8: 0x6c025c20, 0xbceb: 0x6c1d6c20, + 0xbcee: 0x6c163820, 0xbcef: 0x6c1d7020, + 0xbcf0: 0x6c006c20, 0xbcf1: 0x6c1d7420, 0xbcf3: 0x6c1d6220, + 0xbcf4: 0x6c1d6e20, 0xbcf5: 0x6c1d7c20, 0xbcf6: 0x6c056c20, 0xbcf7: 0x6c1d6420, + 0xbcfe: 0x6c15c620, + // Block 0x2f4, offset 0xbd00 + 0xbd02: 0x6c156220, + 0xbd07: 0x6c1d8220, + 0xbd0a: 0x6c1d8a20, + 0xbd0e: 0x6c0d3820, + 0xbd10: 0x6c16ba20, 0xbd11: 0x6c1d8c20, + 0xbd14: 0x6c1d8620, 0xbd16: 0x6c1d8020, + 0xbd19: 0x6c1d7e20, 0xbd1a: 0x6c1d8820, + 0xbd24: 0x6c133820, 0xbd27: 0x6c105020, + 0xbd29: 0x6c057020, 0xbd2b: 0x6c1d8e20, + 0xbd2c: 0x6c1d8420, 0xbd2e: 0x6c1d9020, + 0xbd32: 0x6c05da20, + 0xbd36: 0x6c019a20, + 0xbd3a: 0x6c1da020, + 0xbd3e: 0x6c032020, + // Block 0x2f5, offset 0xbd40 + 0xbd43: 0x6c1d9c20, + 0xbd46: 0x6c1d9e20, 0xbd47: 0x6c076a20, + 0xbd48: 0x6c1d9a20, 0xbd49: 0x6c1d9620, 0xbd4a: 0x6c1d9420, 0xbd4b: 0x6c1da220, + 0xbd4c: 0x6c1d9220, 0xbd4d: 0x6c1da620, + 0xbd50: 0x6c022e20, + 0xbd63: 0x6c1daa20, + 0xbd66: 0x6c1da820, + 0xbd72: 0x6c0ec020, + 0xbd74: 0x6c1db020, 0xbd76: 0x6c1dac20, 0xbd77: 0x6c1d9820, + 0xbd78: 0x6c05dc20, 0xbd7a: 0x6c1dae20, + 0xbd7c: 0x6c1db620, 0xbd7d: 0x6c1db420, 0xbd7e: 0x6c1db820, 0xbd7f: 0x6c1db220, + // Block 0x2f6, offset 0xbd80 + 0xbd80: 0x6c1dba20, + 0xbd88: 0x6c1dbc20, 0xbd89: 0x6c1dbe20, 0xbd8a: 0x6c13ac20, + 0xbd8c: 0x6c1dc220, 0xbd8d: 0x6c1dc020, 0xbd8e: 0x6c09ca20, + 0xbd90: 0x6c0bdc20, 0xbd91: 0x6c020420, 0xbd92: 0x6c023020, + 0xbd94: 0x6c1dc420, 0xbd96: 0x6c003e20, + 0xbd9a: 0x6c0c1820, 0xbd9b: 0x6c1dc620, + 0xbd9d: 0x6c2c0020, 0xbd9e: 0x6c1dc820, 0xbd9f: 0x6c05a620, + 0xbda1: 0x6c1dca20, + 0xbda6: 0x6c0c5e20, + 0xbdaa: 0x6c1dcc20, + 0xbdae: 0x6c1dce20, 0xbdaf: 0x6c03e020, + 0xbdb0: 0x6c1dd020, 0xbdb2: 0x6c1dd220, 0xbdb3: 0x6c1dd420, + 0xbdb4: 0x6c0da620, + 0xbdb8: 0x6c063a20, 0xbdbb: 0x6c151220, + 0xbdbf: 0x6c140c20, + // Block 0x2f7, offset 0xbdc0 + 0xbdc0: 0x6c0a2020, 0xbdc1: 0x6c1dd620, + 0xbdc7: 0x6c0c6020, + 0xbdc8: 0x6c2d6c20, 0xbdc9: 0x6c122420, 0xbdcb: 0x6c096420, + 0xbdcd: 0x6c07b220, 0xbdce: 0x6c1dd820, + 0xbdd3: 0x6c0d8620, + 0xbdd5: 0x6c132620, + 0xbdd8: 0x6c0dda20, 0xbddb: 0x6c1dde20, + 0xbdde: 0x6c1dda20, + 0xbde0: 0x6c1de020, 0xbde3: 0x6c1ddc20, + 0xbde8: 0x6c1de220, + 0xbdee: 0x6c133a20, + 0xbdf1: 0x6c002e20, + 0xbdf6: 0x6c12d820, + 0xbdf9: 0x6c122620, + 0xbdfc: 0x6c1de420, 0xbdfe: 0x6c1dea20, 0xbdff: 0x6c0a7220, + // Block 0x2f8, offset 0xbe00 + 0xbe00: 0x6c03e220, 0xbe02: 0x6c1de620, 0xbe03: 0x6c1df420, + 0xbe04: 0x6c0a7420, + 0xbe09: 0x6c1de820, 0xbe0a: 0x6c112c20, + 0xbe11: 0x6c15c820, 0xbe12: 0x6c1dec20, 0xbe13: 0x6c1dee20, + 0xbe14: 0x6c1df620, 0xbe15: 0x6c100020, 0xbe16: 0x6c1df020, 0xbe17: 0x6c06c220, + 0xbe18: 0x6c0c3c20, 0xbe1b: 0x6c1e1220, + 0xbe1c: 0x6c11c820, 0xbe1e: 0x6c0ddc20, + 0xbe2b: 0x6c122820, + 0xbe2c: 0x6c1e9c20, + 0xbe31: 0x6c13cc20, + 0xbe35: 0x6c0f5220, + 0xbe39: 0x6c147e20, 0xbe3b: 0x6c1dfc20, + 0xbe3c: 0x6c017a20, 0xbe3d: 0x6c0e8820, + // Block 0x2f9, offset 0xbe40 + 0xbe42: 0x6c1e0e20, + 0xbe45: 0x6c0e1c20, 0xbe46: 0x6c1e0220, 0xbe47: 0x6c1e1020, + 0xbe48: 0x6c1e0620, 0xbe49: 0x6c1e1420, 0xbe4a: 0x6c1e0c20, + 0xbe4c: 0x6c1e0a20, 0xbe4d: 0x6c118220, 0xbe4f: 0x6c1dfe20, + 0xbe50: 0x6c023220, 0xbe51: 0x6c1dfa20, 0xbe52: 0x6c044e20, 0xbe53: 0x6c0dde20, + 0xbe54: 0x6c1df220, 0xbe57: 0x6c1df820, + 0xbe58: 0x6c06c420, 0xbe59: 0x6c0c3620, 0xbe5b: 0x6c0a7620, + 0xbe5c: 0x6c1e0820, 0xbe5d: 0x6c114820, + 0xbe60: 0x6c045020, 0xbe61: 0x6c028420, + 0xbe6c: 0x6c02c220, 0xbe6d: 0x6c0b0620, 0xbe6e: 0x6c1e1820, 0xbe6f: 0x6c1e2220, + 0xbe71: 0x6c1e1a20, 0xbe73: 0x6c05de20, + 0xbe75: 0x6c1e2420, 0xbe76: 0x6c081820, 0xbe77: 0x6c072e20, + 0xbe7e: 0x6c099820, 0xbe7f: 0x6c1e0020, + // Block 0x2fa, offset 0xbe80 + 0xbe81: 0x6c08ce20, 0xbe82: 0x6c1e1e20, + 0xbe87: 0x6c088420, + 0xbe88: 0x6c1e2020, 0xbe89: 0x6c004820, + 0xbe8c: 0x6c1e1620, + 0xbe91: 0x6c0ec220, + 0xbe99: 0x6c045220, + 0xbe9f: 0x6c049020, + 0xbea7: 0x6c1e1c20, + 0xbea8: 0x6c000e20, 0xbeab: 0x6c079e20, + 0xbeaf: 0x6c0b3020, + 0xbeba: 0x6c0f5420, + 0xbebd: 0x6c120820, 0xbebe: 0x6c1e2820, 0xbebf: 0x6c0cf820, + // Block 0x2fb, offset 0xbec0 + 0xbec9: 0x6c0d4c20, + 0xbecc: 0x6c082a20, 0xbecd: 0x6c1e2a20, 0xbecf: 0x6c1e2e20, + 0xbed0: 0x6c1e2620, + 0xbed5: 0x6c139a20, 0xbed7: 0x6c0eea20, + 0xbedc: 0x6c0cf420, + 0xbee7: 0x6c13ce20, + 0xbee8: 0x6c092c20, 0xbee9: 0x6c1e4620, 0xbeeb: 0x6c1e4420, + 0xbeee: 0x6c0bb420, + 0xbef2: 0x6c05e020, + 0xbef6: 0x6c1e3820, 0xbef7: 0x6c0a7a20, + 0xbefa: 0x6c10b820, 0xbefb: 0x6c110620, + // Block 0x2fc, offset 0xbf00 + 0xbf00: 0x6c1e3420, 0xbf03: 0x6c0cf620, + 0xbf08: 0x6c098020, 0xbf09: 0x6c1e3e20, + 0xbf0c: 0x6c0a7820, 0xbf0e: 0x6c1e3220, 0xbf0f: 0x6c1e3c20, + 0xbf12: 0x6c114a20, + 0xbf16: 0x6c1e3020, + 0xbf18: 0x6c052620, 0xbf1b: 0x6c02ae20, + 0xbf1f: 0x6c1e4020, + 0xbf20: 0x6c161e20, 0xbf21: 0x6c07b420, 0xbf22: 0x6c0e1e20, 0xbf23: 0x6c1e3a20, + 0xbf25: 0x6c0c3820, 0xbf27: 0x6c06c620, + 0xbf28: 0x6c0b8c20, 0xbf29: 0x6c014820, 0xbf2a: 0x6c0cb420, 0xbf2b: 0x6c1e3620, + 0xbf2c: 0x6c03f620, + 0xbf32: 0x6c057220, + 0xbf34: 0x6c0f0e20, 0xbf35: 0x6c1e4220, + 0xbf3b: 0x6c0cfa20, + 0xbf3e: 0x6c1e4820, + // Block 0x2fd, offset 0xbf40 + 0xbf40: 0x6c1e4c20, 0xbf43: 0x6c0d6620, + 0xbf44: 0x6c1e5820, 0xbf46: 0x6c1e4e20, + 0xbf49: 0x6c1e5220, + 0xbf4f: 0x6c129e20, + 0xbf50: 0x6c0f5620, 0xbf52: 0x6c1e5420, + 0xbf56: 0x6c156420, + 0xbf5a: 0x6c159c20, 0xbf5b: 0x6c032220, + 0xbf61: 0x6c001c20, 0xbf63: 0x6c1e5020, + 0xbf69: 0x6c1e4a20, + 0xbf6e: 0x6c03a020, + 0xbf74: 0x6c014a20, 0xbf76: 0x6c1e5620, + 0xbf7a: 0x6c159e20, + // Block 0x2fe, offset 0xbf80 + 0xbf86: 0x6c1e5e20, + 0xbf8d: 0x6c0d6e20, 0xbf8f: 0x6c1e6c20, + 0xbf93: 0x6c1e6020, + 0xbf96: 0x6c1e5a20, 0xbf97: 0x6c1e6820, + 0xbf9c: 0x6c1e2c20, + 0xbfa6: 0x6c1e6220, + 0xbfa8: 0x6c1e6a20, + 0xbfac: 0x6c11e420, 0xbfad: 0x6c100220, + 0xbfb4: 0x6c1e5c20, 0xbfb6: 0x6c1e6420, + 0xbfba: 0x6c057420, + 0xbfbe: 0x6c07fa20, + // Block 0x2ff, offset 0xbfc0 + 0xbfc2: 0x6c0c3a20, + 0xbfce: 0x6c1e7420, + 0xbfd8: 0x6c0f7820, + 0xbfe7: 0x6c1e6e20, + 0xbfe9: 0x6c145420, + 0xbfef: 0x6c1e7020, + 0xbff6: 0x6c1e7220, + 0xbff8: 0x6c14ec20, 0xbffa: 0x6c0bc420, + // Block 0x300, offset 0xc000 + 0xc003: 0x6c05a820, + 0xc008: 0x6c1e8020, + 0xc012: 0x6c083e20, 0xc013: 0x6c1e7a20, + 0xc015: 0x6c1e7820, + 0xc01a: 0x6c110820, + 0xc01e: 0x6c105220, + 0xc024: 0x6c0f8e20, 0xc025: 0x6c1e7c20, + 0xc029: 0x6c1e7e20, 0xc02b: 0x6c12fa20, + 0xc02d: 0x6c112e20, 0xc02e: 0x6c081a20, + 0xc030: 0x6c0c6220, 0xc032: 0x6c143420, + 0xc039: 0x6c028620, 0xc03b: 0x6c1e8c20, + 0xc03c: 0x6c1e8220, + // Block 0x301, offset 0xc040 + 0xc041: 0x6c15a020, 0xc042: 0x6c1e9020, + 0xc045: 0x6c1e8820, 0xc047: 0x6c1e8a20, + 0xc04d: 0x6c0cfc20, + 0xc052: 0x6c1e8620, + 0xc054: 0x6c1e0420, + 0xc058: 0x6c1e8e20, 0xc05a: 0x6c1e8420, + 0xc060: 0x6c1e9820, 0xc061: 0x6c1e9a20, 0xc062: 0x6c0f7a20, 0xc063: 0x6c1e9e20, + 0xc066: 0x6c081c20, 0xc067: 0x6c1e9420, + 0xc06c: 0x6c03e420, 0xc06f: 0x6c1ea020, + 0xc071: 0x6c1e9220, 0xc072: 0x6c1ea820, + 0xc074: 0x6c1ea620, 0xc076: 0x6c1ea420, + 0xc07a: 0x6c1eaa20, + 0xc07d: 0x6c1eae20, 0xc07e: 0x6c0aea20, + // Block 0x302, offset 0xc080 + 0xc080: 0x6c1eac20, + 0xc085: 0x6c1eb420, + 0xc098: 0x6c1eb020, + 0xc09c: 0x6c1eb220, 0xc09d: 0x6c1e6620, + 0xc0a3: 0x6c1eb820, + 0xc0a4: 0x6c1eb620, + 0xc0aa: 0x6c1e7620, 0xc0ab: 0x6c1eba20, + 0xc0ac: 0x6c1ea220, 0xc0af: 0x6c088620, + 0xc0b4: 0x6c1ebc20, 0xc0b5: 0x6c1ebe20, 0xc0b6: 0x6c1ec220, 0xc0b7: 0x6c1ec020, + 0xc0b8: 0x6c1ec420, 0xc0b9: 0x6c023420, 0xc0bb: 0x6c06c820, + 0xc0be: 0x6c13d020, 0xc0bf: 0x6c0bde20, + // Block 0x303, offset 0xc0c0 + 0xc0c5: 0x6c063c20, + 0xc0c8: 0x6c1ec820, + 0xc0cd: 0x6c1ece20, 0xc0cf: 0x6c12c020, + 0xc0d1: 0x6c042a20, + 0xc0d5: 0x6c1ecc20, 0xc0d6: 0x6c1eca20, 0xc0d7: 0x6c114c20, + 0xc0d8: 0x6c1ed020, 0xc0d9: 0x6c049220, + 0xc0dd: 0x6c1ed420, 0xc0de: 0x6c1ed220, + 0xc0e2: 0x6c032420, 0xc0e3: 0x6c084020, + 0xc0e6: 0x6c109820, + 0xc0ec: 0x6c057620, + 0xc0f0: 0x6c0bac20, 0xc0f2: 0x6c1ed620, + 0xc0f4: 0x6c0be020, 0xc0f5: 0x6c0f7c20, 0xc0f7: 0x6c12da20, + 0xc0f8: 0x6c1ed820, + // Block 0x304, offset 0xc100 + 0xc102: 0x6c1eda20, 0xc103: 0x6c1edc20, + 0xc107: 0x6c134820, + 0xc108: 0x6c1b5020, 0xc109: 0x6c0c0c20, + 0xc10c: 0x6c12b420, 0xc10e: 0x6c07c820, + 0xc110: 0x6c122a20, 0xc111: 0x6c11e620, + 0xc117: 0x6c0fc620, + 0xc119: 0x6c164a20, 0xc11b: 0x6c1ee020, + 0xc11c: 0x6c093020, 0xc11f: 0x6c1ee220, + 0xc121: 0x6c002c20, + 0xc124: 0x6c04d020, 0xc125: 0x6c0c1a20, 0xc127: 0x6c12dc20, + 0xc12b: 0x6c1ee420, + 0xc12c: 0x6c085820, 0xc12d: 0x6c0e4220, 0xc12f: 0x6c088a20, + 0xc130: 0x6c0b3220, + 0xc137: 0x6c1ee620, + 0xc139: 0x6c13d220, + 0xc13c: 0x6c016a20, 0xc13d: 0x6c088c20, + // Block 0x305, offset 0xc140 + 0xc141: 0x6c1eec20, 0xc143: 0x6c1ee820, + 0xc144: 0x6c1eee20, 0xc145: 0x6c163a20, 0xc146: 0x6c1eea20, + 0xc14b: 0x6c0c7620, + 0xc14c: 0x6c1ef020, 0xc14f: 0x6c0d5c20, + 0xc152: 0x6c1ef220, + 0xc157: 0x6c03a420, + 0xc159: 0x6c1ef620, 0xc15b: 0x6c1ef420, + 0xc160: 0x6c1ef820, 0xc161: 0x6c1efa20, 0xc162: 0x6c03a620, + 0xc165: 0x6c10e020, 0xc166: 0x6c0e2020, 0xc167: 0x6c044420, + 0xc168: 0x6c088e20, 0xc169: 0x6c0cfe20, + 0xc16c: 0x6c0a0420, 0xc16d: 0x6c002020, + 0xc171: 0x6c1efc20, + 0xc17a: 0x6c017c20, 0xc17b: 0x6c1f0420, + // Block 0x306, offset 0xc180 + 0xc182: 0x6c06ca20, 0xc183: 0x6c1f0220, + 0xc186: 0x6c076e20, 0xc187: 0x6c0a7c20, + 0xc18a: 0x6c1f0020, + 0xc18c: 0x6c0a7e20, 0xc18e: 0x6c14d020, 0xc18f: 0x6c076c20, + 0xc193: 0x6c006e20, + 0xc194: 0x6c0c1c20, + 0xc19c: 0x6c1f0e20, 0xc19f: 0x6c0be220, + 0xc1a0: 0x6c010a20, + 0xc1a5: 0x6c09f620, 0xc1a7: 0x6c146020, + 0xc1a8: 0x6c07fc20, + 0xc1ad: 0x6c0a8020, 0xc1af: 0x6c0bce20, + 0xc1b4: 0x6c1f0c20, 0xc1b5: 0x6c1f0820, 0xc1b6: 0x6c1f0a20, + 0xc1bc: 0x6c0e8a20, 0xc1bf: 0x6c1f4a20, + // Block 0x307, offset 0xc1c0 + 0xc1c1: 0x6c1f1620, 0xc1c2: 0x6c08d020, 0xc1c3: 0x6c06cc20, + 0xc1c4: 0x6c1f1220, + 0xc1c9: 0x6c1f1420, 0xc1cb: 0x6c0b3420, + 0xc1cf: 0x6c1f1020, + 0xc1d2: 0x6c083220, + 0xc1dd: 0x6c1f1a20, 0xc1de: 0x6c1f1820, 0xc1df: 0x6c1f2220, + 0xc1e2: 0x6c1f2420, + 0xc1e4: 0x6c1f1c20, 0xc1e6: 0x6c023820, 0xc1e7: 0x6c1f1e20, + 0xc1e8: 0x6c1f2020, 0xc1e9: 0x6c120a20, + 0xc1ee: 0x6c12de20, 0xc1ef: 0x6c057820, + 0xc1f0: 0x6c1f2620, + 0xc1f4: 0x6c0be420, 0xc1f6: 0x6c0a8220, + 0xc1fa: 0x6c0e5820, + // Block 0x308, offset 0xc200 + 0xc201: 0x6c04b620, 0xc203: 0x6c1f2820, + 0xc204: 0x6c1f3020, 0xc207: 0x6c01ce20, + 0xc208: 0x6c1f2a20, 0xc209: 0x6c1f2e20, + 0xc20e: 0x6c1f2c20, + 0xc211: 0x6c0a2220, + 0xc216: 0x6c0e4420, 0xc217: 0x6c004a20, + 0xc218: 0x6c1f3220, + 0xc21d: 0x6c1f3420, + 0xc222: 0x6c0ec420, + 0xc226: 0x6c16aa20, + 0xc22b: 0x6c085a20, + 0xc22e: 0x6c13ae20, + 0xc234: 0x6c140e20, + 0xc238: 0x6c1f4220, 0xc239: 0x6c1f3820, + 0xc23c: 0x6c1f3e20, 0xc23e: 0x6c1f3c20, + // Block 0x309, offset 0xc240 + 0xc241: 0x6c1f3620, + 0xc244: 0x6c1f4020, 0xc247: 0x6c10a420, + 0xc249: 0x6c1f3a20, + 0xc256: 0x6c1f4420, + 0xc259: 0x6c0a2420, 0xc25a: 0x6c1f4620, + 0xc25c: 0x6c15a220, 0xc25d: 0x6c119420, + 0xc260: 0x6c1f4820, + 0xc266: 0x6c1f4c20, + 0xc269: 0x6c1f4e20, + 0xc270: 0x6c1f5020, 0xc272: 0x6c04bc20, 0xc273: 0x6c010c20, + 0xc274: 0x6c06ce20, 0xc275: 0x6c1f5220, 0xc277: 0x6c1f5420, + 0xc278: 0x6c0a2e20, 0xc279: 0x6c0d0020, + 0xc27c: 0x6c191220, 0xc27d: 0x6c0cb820, 0xc27e: 0x6c0cb620, 0xc27f: 0x6c0da820, + // Block 0x30a, offset 0xc280 + 0xc280: 0x6c07a620, 0xc283: 0x6c17ce20, + 0xc288: 0x6c05c020, 0xc289: 0x6c156620, 0xc28b: 0x6c13d420, + 0xc28d: 0x6c131820, 0xc28f: 0x6c1f5620, + 0xc294: 0x6c07fe20, 0xc295: 0x6c0eee20, 0xc296: 0x6c1f5820, 0xc297: 0x6c16e220, + 0xc29b: 0x6c141020, + 0xc29d: 0x6c0ec620, 0xc29e: 0x6c1f5a20, 0xc29f: 0x6c03a820, + 0xc2a6: 0x6c1f5c20, 0xc2a7: 0x6c1f5e20, + 0xc2a8: 0x6c150420, 0xc2aa: 0x6c149820, 0xc2ab: 0x6c148020, + 0xc2ac: 0x6c144c20, 0xc2ad: 0x6c081e20, 0xc2ae: 0x6c1f6220, + 0xc2b1: 0x6c096620, + 0xc2b4: 0x6c143620, 0xc2b6: 0x6c1f6620, 0xc2b7: 0x6c1f6c20, + 0xc2b8: 0x6c1f6a20, 0xc2ba: 0x6c03a220, + 0xc2bd: 0x6c042c20, 0xc2bf: 0x6c1f6420, + // Block 0x30b, offset 0xc2c0 + 0xc2c1: 0x6c1f6820, + 0xc2c6: 0x6c1f6e20, + 0xc2c9: 0x6c0bb620, + 0xc2ce: 0x6c160220, 0xc2cf: 0x6c005220, + 0xc2d0: 0x6c07d820, 0xc2d1: 0x6c0d7020, 0xc2d3: 0x6c094a20, + 0xc2d6: 0x6c0aee20, + 0xc2d9: 0x6c1f7420, + 0xc2dc: 0x6c0fc820, 0xc2de: 0x6c1f7020, 0xc2df: 0x6c0d4e20, + 0xc2e0: 0x6c1f7220, 0xc2e1: 0x6c0aec20, 0xc2e2: 0x6c150a20, 0xc2e3: 0x6c1f7620, + 0xc2e4: 0x6c1f7820, 0xc2e5: 0x6c15dc20, + 0xc2ea: 0x6c1f8220, + 0xc2ed: 0x6c06d020, 0xc2ef: 0x6c114e20, + 0xc2f0: 0x6c1f7c20, 0xc2f1: 0x6c100420, 0xc2f2: 0x6c1efe20, 0xc2f3: 0x6c1f0620, + 0xc2f5: 0x6c040a20, 0xc2f7: 0x6c113220, + 0xc2fc: 0x6c1f8020, 0xc2fe: 0x6c0a8420, 0xc2ff: 0x6c11e820, + // Block 0x30c, offset 0xc300 + 0xc305: 0x6c1f8c20, 0xc307: 0x6c125420, + 0xc309: 0x6c1f7a20, 0xc30b: 0x6c1f8620, + 0xc30c: 0x6c1f8420, + 0xc310: 0x6c0c1e20, + 0xc315: 0x6c146e20, 0xc317: 0x6c166e20, + 0xc31a: 0x6c146220, + 0xc31c: 0x6c01d020, 0xc31d: 0x6c089020, + 0xc320: 0x6c171420, 0xc321: 0x6c1f8a20, 0xc322: 0x6c0bae20, + 0xc326: 0x6c1f8820, + 0xc329: 0x6c1f7e20, + 0xc32f: 0x6c063e20, + 0xc333: 0x6c1f9620, + 0xc334: 0x6c1f9220, 0xc336: 0x6c01d220, 0xc337: 0x6c1f8e20, + 0xc338: 0x6c1f9a20, 0xc339: 0x6c1fa620, + // Block 0x30d, offset 0xc340 + 0xc341: 0x6c0d8820, + 0xc344: 0x6c135a20, 0xc346: 0x6c1faa20, + 0xc34a: 0x6c126020, + 0xc34e: 0x6c1fa820, 0xc34f: 0x6c118420, + 0xc350: 0x6c141220, 0xc351: 0x6c032620, 0xc353: 0x6c0c6e20, + 0xc354: 0x6c09cc20, + 0xc358: 0x6c0f1620, 0xc35a: 0x6c156820, + 0xc35d: 0x6c1fa020, 0xc35e: 0x6c1f9e20, + 0xc362: 0x6c1fa220, + 0xc364: 0x6c1f9c20, 0xc367: 0x6c1fac20, + 0xc369: 0x6c1f9820, + 0xc36c: 0x6c1f9420, 0xc36e: 0x6c1fa420, 0xc36f: 0x6c1f9020, + 0xc371: 0x6c0e8c20, 0xc373: 0x6c154020, + 0xc374: 0x6c091c20, 0xc375: 0x6c080020, + 0xc37b: 0x6c078c20, + 0xc37e: 0x6c147220, 0xc37f: 0x6c027620, + // Block 0x30e, offset 0xc380 + 0xc382: 0x6c0f0c20, 0xc383: 0x6c107c20, + 0xc384: 0x6c010e20, + 0xc393: 0x6c0c6420, + 0xc396: 0x6c0be820, 0xc397: 0x6c053820, + 0xc39e: 0x6c1fb020, + 0xc3a1: 0x6c06d220, 0xc3a2: 0x6c02ec20, + 0xc3a9: 0x6c1fb420, 0xc3aa: 0x6c02dc20, 0xc3ab: 0x6c1fc020, + 0xc3b2: 0x6c1fba20, + 0xc3b4: 0x6c0c6620, + 0xc3b8: 0x6c028a20, 0xc3b9: 0x6c077020, + 0xc3bc: 0x6c028820, 0xc3bd: 0x6c07b620, + // Block 0x30f, offset 0xc3c0 + 0xc3c0: 0x6c1fb620, 0xc3c1: 0x6c05ae20, 0xc3c2: 0x6c057a20, 0xc3c3: 0x6c100620, + 0xc3c6: 0x6c1fb220, + 0xc3c8: 0x6c004c20, + 0xc3cd: 0x6c1fb820, 0xc3ce: 0x6c1fbc20, + 0xc3d0: 0x6c04c220, 0xc3d1: 0x6c053c20, 0xc3d3: 0x6c032820, + 0xc3d4: 0x6c040220, + 0xc3d9: 0x6c1fc220, + 0xc3dc: 0x6c080a20, 0xc3dd: 0x6c147620, 0xc3df: 0x6c084220, + 0xc3e3: 0x6c1fc420, + 0xc3e7: 0x6c127c20, + 0xc3f4: 0x6c1fdc20, 0xc3f6: 0x6c019e20, 0xc3f7: 0x6c1fc620, + 0xc3fe: 0x6c1fe820, 0xc3ff: 0x6c1fc820, + // Block 0x310, offset 0xc400 + 0xc401: 0x6c164c20, 0xc403: 0x6c1fd620, + 0xc405: 0x6c116220, + 0xc40d: 0x6c1fe620, 0xc40f: 0x6c1fcc20, + 0xc413: 0x6c002820, + 0xc414: 0x6c1fd020, 0xc417: 0x6c06d420, + 0xc41b: 0x6c1fd420, + 0xc41d: 0x6c1fd220, 0xc41f: 0x6c1fca20, + 0xc420: 0x6c1fe020, 0xc422: 0x6c0a8620, + 0xc426: 0x6c1ab420, 0xc427: 0x6c067020, + 0xc428: 0x6c160420, + 0xc42d: 0x6c1fce20, 0xc42f: 0x6c0f5820, + 0xc430: 0x6c023a20, 0xc431: 0x6c077220, 0xc433: 0x6c1fbe20, + 0xc435: 0x6c1fde20, 0xc436: 0x6c02b620, + 0xc439: 0x6c1fda20, 0xc43a: 0x6c1fe220, + 0xc43c: 0x6c100820, + // Block 0x311, offset 0xc440 + 0xc444: 0x6c03ac20, 0xc446: 0x6c201e20, + 0xc449: 0x6c14e220, 0xc44a: 0x6c1fec20, 0xc44b: 0x6c03aa20, + 0xc44d: 0x6c1ffa20, + 0xc452: 0x6c141420, + 0xc454: 0x6c1ffc20, 0xc455: 0x6c200020, 0xc457: 0x6c200820, + 0xc458: 0x6c1ff020, 0xc45a: 0x6c0e0820, + 0xc45f: 0x6c100a20, + 0xc460: 0x6c201020, 0xc461: 0x6c1ff620, 0xc463: 0x6c200a20, + 0xc467: 0x6c1ffe20, + 0xc46e: 0x6c0b3620, 0xc46f: 0x6c201220, + 0xc472: 0x6c0be620, + 0xc479: 0x6c200e20, 0xc47a: 0x6c032a20, + // Block 0x312, offset 0xc480 + 0xc480: 0x6c172420, 0xc481: 0x6c1fea20, + 0xc484: 0x6c200620, 0xc485: 0x6c007020, + 0xc488: 0x6c1fee20, 0xc48b: 0x6c14c420, + 0xc48c: 0x6c1ff820, 0xc48d: 0x6c0b0820, 0xc48e: 0x6c0efe20, 0xc48f: 0x6c1fe420, + 0xc492: 0x6c200420, + 0xc499: 0x6c0bb820, 0xc49a: 0x6c201820, 0xc49b: 0x6c02d620, + 0xc49c: 0x6c05e220, + 0xc4a1: 0x6c201c20, 0xc4a2: 0x6c1ff220, 0xc4a3: 0x6c201a20, + 0xc4a5: 0x6c200c20, 0xc4a6: 0x6c1ff420, + 0xc4a8: 0x6c201420, 0xc4aa: 0x6c201620, + 0xc4b0: 0x6c203820, + 0xc4b4: 0x6c108420, 0xc4b6: 0x6c200220, + 0xc4b9: 0x6c203020, + 0xc4bd: 0x6c203420, 0xc4bf: 0x6c0f2020, + // Block 0x313, offset 0xc4c0 + 0xc4ca: 0x6c15a420, + 0xc4d3: 0x6c130820, + 0xc4d4: 0x6c202a20, 0xc4d5: 0x6c0d8c20, + 0xc4d9: 0x6c203620, 0xc4da: 0x6c0cba20, + 0xc4dc: 0x6c202420, 0xc4dd: 0x6c203e20, 0xc4de: 0x6c203c20, + 0xc4e0: 0x6c10c620, 0xc4e1: 0x6c203a20, 0xc4e2: 0x6c10bc20, + 0xc4ea: 0x6c204220, 0xc4eb: 0x6c202820, + 0xc4ed: 0x6c04b820, 0xc4ee: 0x6c202e20, 0xc4ef: 0x6c0a0620, + 0xc4f3: 0x6c116420, + 0xc4f4: 0x6c203220, 0xc4f5: 0x6c04be20, 0xc4f7: 0x6c202220, + 0xc4f8: 0x6c202620, 0xc4f9: 0x6c202020, + 0xc4fc: 0x6c16e420, 0xc4fd: 0x6c02a820, 0xc4fe: 0x6c202c20, + // Block 0x314, offset 0xc500 + 0xc501: 0x6c204020, 0xc502: 0x6c025e20, + 0xc50a: 0x6c07e620, + 0xc50e: 0x6c013620, + 0xc511: 0x6c206220, + 0xc514: 0x6c16e620, 0xc515: 0x6c206820, + 0xc51b: 0x6c0b3820, + 0xc51c: 0x6c206620, + 0xc520: 0x6c206420, + 0xc527: 0x6c205e20, + 0xc52e: 0x6c204620, + 0xc531: 0x6c208020, 0xc532: 0x6c204420, + 0xc534: 0x6c206a20, + 0xc53b: 0x6c205a20, + 0xc53e: 0x6c205020, 0xc53f: 0x6c204a20, + // Block 0x315, offset 0xc540 + 0xc541: 0x6c204c20, 0xc543: 0x6c205c20, + 0xc547: 0x6c319e20, + 0xc54a: 0x6c205620, 0xc54b: 0x6c06d620, + 0xc54c: 0x6c0f0020, 0xc54d: 0x6c0d0420, 0xc54e: 0x6c205220, + 0xc550: 0x6c204820, 0xc553: 0x6c204e20, + 0xc558: 0x6c15a620, 0xc559: 0x6c146820, + 0xc55d: 0x6c205820, 0xc55e: 0x6c206c20, + 0xc567: 0x6c207c20, + 0xc568: 0x6c206e20, 0xc56b: 0x6c208820, + 0xc56d: 0x6c208420, + 0xc572: 0x6c207a20, + 0xc579: 0x6c207820, 0xc57b: 0x6c0f1020, + 0xc57d: 0x6c0d0620, 0xc57f: 0x6c207420, + // Block 0x316, offset 0xc580 + 0xc582: 0x6c207020, + 0xc585: 0x6c207e20, + 0xc58a: 0x6c208a20, 0xc58b: 0x6c124a20, + 0xc58c: 0x6c209620, + 0xc592: 0x6c208c20, 0xc593: 0x6c209220, + 0xc594: 0x6c208620, 0xc597: 0x6c0e9c20, + 0xc599: 0x6c128c20, 0xc59b: 0x6c207220, + 0xc59e: 0x6c208220, 0xc59f: 0x6c0a8820, + 0xc5a1: 0x6c14ee20, 0xc5a2: 0x6c20aa20, 0xc5a3: 0x6c209020, + 0xc5a9: 0x6c05e420, 0xc5aa: 0x6c017e20, 0xc5ab: 0x6c02b220, + 0xc5ae: 0x6c206020, + 0xc5b5: 0x6c0a8a20, 0xc5b6: 0x6c209a20, + 0xc5b8: 0x6c20a820, 0xc5b9: 0x6c098220, 0xc5ba: 0x6c02d820, + 0xc5bd: 0x6c0e1020, + // Block 0x317, offset 0xc5c0 + 0xc5c4: 0x6c209420, 0xc5c7: 0x6c209e20, + 0xc5c8: 0x6c20a620, 0xc5cb: 0x6c049420, + 0xc5d8: 0x6c040420, 0xc5d9: 0x6c20a220, + 0xc5df: 0x6c03ae20, + 0xc5e1: 0x6c107e20, 0xc5e2: 0x6c20a020, + 0xc5e6: 0x6c20a420, + 0xc5f2: 0x6c209820, + 0xc5f8: 0x6c209c20, + 0xc5ff: 0x6c02b420, + // Block 0x318, offset 0xc600 + 0xc600: 0x6c0e4620, + 0xc604: 0x6c20b220, + 0xc60d: 0x6c20ae20, 0xc60e: 0x6c067220, + 0xc610: 0x6c20ac20, + 0xc617: 0x6c20b820, + 0xc61c: 0x6c1fae20, + 0xc620: 0x6c20b020, 0xc622: 0x6c20b420, 0xc623: 0x6c20b620, + 0xc62a: 0x6c20ce20, + 0xc62c: 0x6c20c620, 0xc62e: 0x6c1fd820, + 0xc633: 0x6c20c420, + 0xc638: 0x6c20c220, 0xc63b: 0x6c20bc20, + // Block 0x319, offset 0xc640 + 0xc641: 0x6c208e20, 0xc642: 0x6c20c020, 0xc643: 0x6c20be20, + 0xc651: 0x6c20ca20, 0xc653: 0x6c16d020, + 0xc65a: 0x6c20d020, 0xc65b: 0x6c051e20, + 0xc65e: 0x6c20c820, 0xc65f: 0x6c20cc20, + 0xc668: 0x6c11ae20, 0xc66a: 0x6c20d220, + 0xc67a: 0x6c20da20, 0xc67b: 0x6c20d420, + // Block 0x31a, offset 0xc680 + 0xc684: 0x6c15f220, 0xc685: 0x6c20d620, + 0xc68a: 0x6c207620, + 0xc692: 0x6c20dc20, + 0xc696: 0x6c20de20, + 0xc69d: 0x6c00e620, 0xc69f: 0x6c20e220, + 0xc6a0: 0x6c05b220, 0xc6a1: 0x6c08d220, 0xc6a3: 0x6c04d220, + 0xc6a7: 0x6c018020, + 0xc6b2: 0x6c15ca20, + 0xc6b7: 0x6c20e620, + 0xc6b8: 0x6c20e420, 0xc6b9: 0x6c20ea20, 0xc6ba: 0x6c03e620, + 0xc6bd: 0x6c04d420, 0xc6be: 0x6c032c20, + // Block 0x31b, offset 0xc6c0 + 0xc6c3: 0x6c20f020, + 0xc6c7: 0x6c20ee20, + 0xc6c9: 0x6c20f220, + 0xc6cc: 0x6c01d420, 0xc6ce: 0x6c0e2220, + 0xc6d0: 0x6c20f420, 0xc6d3: 0x6c032e20, + 0xc6d4: 0x6c20f820, + 0xc6d9: 0x6c20f620, 0xc6db: 0x6c20fa20, + 0xc6df: 0x6c20fc20, + 0xc6e1: 0x6c20fe20, 0xc6e2: 0x6c089220, 0xc6e3: 0x6c0bea20, + 0xc6e4: 0x6c075a20, 0xc6e6: 0x6c12fc20, + 0xc6e9: 0x6c139c20, 0xc6ea: 0x6c170c20, + 0xc6ef: 0x6c08be20, + 0xc6f3: 0x6c07b820, + 0xc6f4: 0x6c16ac20, + 0xc6f8: 0x6c210020, 0xc6f9: 0x6c210220, 0xc6fb: 0x6c089420, + 0xc6ff: 0x6c210420, + // Block 0x31c, offset 0xc700 + 0xc700: 0x6c210620, 0xc703: 0x6c210a20, + 0xc704: 0x6c210820, 0xc706: 0x6c144420, + 0xc709: 0x6c0a0820, 0xc70a: 0x6c096820, 0xc70b: 0x6c085c20, + 0xc70d: 0x6c210c20, + 0xc715: 0x6c211020, 0xc716: 0x6c0b0a20, + 0xc718: 0x6c210e20, + 0xc71e: 0x6c211220, + 0xc724: 0x6c211420, + 0xc72a: 0x6c211620, 0xc72b: 0x6c211820, + 0xc72f: 0x6c211a20, + 0xc731: 0x6c211e20, 0xc732: 0x6c211c20, 0xc733: 0x6c212020, + 0xc734: 0x6c018220, 0xc735: 0x6c0e4820, 0xc737: 0x6c212220, + 0xc73a: 0x6c082020, 0xc73b: 0x6c028c20, + 0xc73c: 0x6c212420, 0xc73f: 0x6c0fb020, + // Block 0x31d, offset 0xc740 + 0xc740: 0x6c1a7220, + 0xc745: 0x6c03b220, 0xc746: 0x6c212620, + 0xc74b: 0x6c212820, + 0xc74d: 0x6c13b020, 0xc74e: 0x6c146420, + 0xc752: 0x6c107620, 0xc753: 0x6c212a20, + 0xc754: 0x6c122c20, + 0xc758: 0x6c125620, 0xc75b: 0x6c14f620, + 0xc75f: 0x6c212c20, + 0xc76b: 0x6c213020, + 0xc76c: 0x6c212e20, 0xc76f: 0x6c213420, + 0xc773: 0x6c213220, + // Block 0x31e, offset 0xc780 + 0xc788: 0x6c213820, + 0xc78f: 0x6c089620, + 0xc791: 0x6c14b220, 0xc793: 0x6c213a20, + 0xc794: 0x6c213c20, 0xc797: 0x6c03b420, + 0xc79b: 0x6c213e20, + 0xc7a3: 0x6c214220, + 0xc7a4: 0x6c214020, + 0xc7b4: 0x6c0b8e20, 0xc7b7: 0x6c128e20, + 0xc7b8: 0x6c011020, + 0xc7be: 0x6c11ea20, + // Block 0x31f, offset 0xc7c0 + 0xc7c0: 0x6c0f5a20, 0xc7c1: 0x6c09ce20, 0xc7c2: 0x6c042e20, + 0xc7ce: 0x6c11ec20, + 0xc7d0: 0x6c08ec20, + 0xc7d5: 0x6c214620, 0xc7d7: 0x6c033020, + 0xc7da: 0x6c016c20, + 0xc7dd: 0x6c10cc20, 0xc7de: 0x6c214420, 0xc7df: 0x6c06d820, + 0xc7e0: 0x6c0e5a20, 0xc7e2: 0x6c214820, + 0xc7e8: 0x6c215820, 0xc7ea: 0x6c214a20, + 0xc7f0: 0x6c0d7a20, 0xc7f2: 0x6c043020, 0xc7f3: 0x6c215a20, + 0xc7fa: 0x6c05b420, + 0xc7fd: 0x6c03b620, 0xc7fe: 0x6c215620, + // Block 0x320, offset 0xc800 + 0xc801: 0x6c215220, 0xc802: 0x6c214c20, 0xc803: 0x6c15cc20, + 0xc808: 0x6c0ef020, + 0xc80c: 0x6c109a20, 0xc80d: 0x6c214e20, + 0xc810: 0x6c215e20, 0xc812: 0x6c215c20, 0xc813: 0x6c052a20, + 0xc816: 0x6c019220, + 0xc819: 0x6c078e20, 0xc81a: 0x6c215020, 0xc81b: 0x6c215420, + 0xc821: 0x6c144220, 0xc822: 0x6c0de020, + 0xc82b: 0x6c148220, + 0xc82e: 0x6c216e20, + 0xc831: 0x6c217020, 0xc833: 0x6c01d620, + 0xc838: 0x6c132820, 0xc839: 0x6c154a20, 0xc83a: 0x6c217420, 0xc83b: 0x6c08d620, + 0xc83c: 0x6c0a8c20, 0xc83d: 0x6c216620, 0xc83e: 0x6c217220, 0xc83f: 0x6c014c20, + // Block 0x321, offset 0xc840 + 0xc841: 0x6c049620, + 0xc844: 0x6c216020, 0xc845: 0x6c216a20, + 0xc849: 0x6c0c6820, 0xc84a: 0x6c118620, + 0xc84c: 0x6c122e20, + 0xc853: 0x6c216420, + 0xc855: 0x6c13d620, 0xc857: 0x6c216820, + 0xc859: 0x6c217a20, 0xc85b: 0x6c217620, + 0xc85d: 0x6c216c20, + 0xc861: 0x6c13d820, 0xc862: 0x6c113420, 0xc863: 0x6c043220, + 0xc865: 0x6c0f7620, + 0xc868: 0x6c0e8e20, 0xc86a: 0x6c217c20, + 0xc86f: 0x6c217820, + 0xc870: 0x6c0daa20, 0xc871: 0x6c216220, 0xc873: 0x6c011220, + // Block 0x322, offset 0xc880 + 0xc88b: 0x6c15a820, + 0xc88c: 0x6c219220, + 0xc892: 0x6c219020, + 0xc897: 0x6c0c6c20, + 0xc899: 0x6c218a20, 0xc89b: 0x6c15e420, + 0xc89e: 0x6c105420, 0xc89f: 0x6c217e20, + 0xc8a5: 0x6c0efa20, + 0xc8a9: 0x6c011420, 0xc8aa: 0x6c06da20, 0xc8ab: 0x6c218420, + 0xc8b2: 0x6c099a20, 0xc8b3: 0x6c218e20, + 0xc8b5: 0x6c218c20, 0xc8b6: 0x6c218220, + 0xc8b8: 0x6c218820, 0xc8bb: 0x6c02c420, + 0xc8bd: 0x6c218620, 0xc8be: 0x6c113620, + // Block 0x323, offset 0xc8c0 + 0xc8c1: 0x6c162420, + 0xc8c4: 0x6c0af020, 0xc8c5: 0x6c0c6a20, + 0xc8d9: 0x6c219e20, 0xc8da: 0x6c219a20, + 0xc8dc: 0x6c12b620, + 0xc8e3: 0x6c219420, + 0xc8e4: 0x6c219820, 0xc8e6: 0x6c00f020, + 0xc8e9: 0x6c06dc20, 0xc8ea: 0x6c16e820, + 0xc8ec: 0x6c026e20, 0xc8ee: 0x6c12e020, + 0xc8f4: 0x6c15ce20, 0xc8f7: 0x6c023c20, + 0xc8f8: 0x6c0b3a20, 0xc8f9: 0x6c219c20, + // Block 0x324, offset 0xc900 + 0xc905: 0x6c21a620, + 0xc908: 0x6c0a8e20, + 0xc90c: 0x6c156c20, 0xc90e: 0x6c21a020, + 0xc913: 0x6c219620, + 0xc915: 0x6c21a220, + 0xc919: 0x6c168420, 0xc91b: 0x6c101220, + 0xc91c: 0x6c106c20, + 0xc92f: 0x6c026020, + 0xc932: 0x6c012620, + 0xc935: 0x6c21ae20, + 0xc938: 0x6c21b420, + 0xc93c: 0x6c164e20, + // Block 0x325, offset 0xc940 + 0xc940: 0x6c15d420, + 0xc945: 0x6c21c220, 0xc946: 0x6c21b620, 0xc947: 0x6c21b020, + 0xc94b: 0x6c167020, + 0xc94c: 0x6c21bc20, + 0xc951: 0x6c09e020, 0xc952: 0x6c21c020, + 0xc955: 0x6c21ca20, + 0xc958: 0x6c100e20, 0xc959: 0x6c21c620, + 0xc95e: 0x6c21ba20, + 0xc961: 0x6c0e2420, + 0xc964: 0x6c21c820, 0xc966: 0x6c21b220, + 0xc968: 0x6c21be20, 0xc96a: 0x6c21cc20, 0xc96b: 0x6c00b820, + 0xc96c: 0x6c21b820, 0xc96e: 0x6c21ce20, + 0xc971: 0x6c0b3c20, 0xc973: 0x6c0a0a20, + 0xc975: 0x6c132220, 0xc977: 0x6c077420, + 0xc979: 0x6c21a820, 0xc97a: 0x6c21c420, 0xc97b: 0x6c0fa020, + // Block 0x326, offset 0xc980 + 0xc985: 0x6c0bec20, 0xc987: 0x6c02c620, + 0xc988: 0x6c07ba20, 0xc989: 0x6c0a9020, 0xc98a: 0x6c21ac20, 0xc98b: 0x6c09d020, + 0xc993: 0x6c057c20, + 0xc995: 0x6c21aa20, + 0xc999: 0x6c21d620, 0xc99a: 0x6c0a2620, 0xc99b: 0x6c061420, + 0xc99d: 0x6c21f420, 0xc99f: 0x6c21e820, + 0xc9a0: 0x6c045420, 0xc9a1: 0x6c0fca20, 0xc9a3: 0x6c21de20, + 0xc9a4: 0x6c21f020, 0xc9a5: 0x6c001e20, 0xc9a6: 0x6c00e020, + 0xc9a9: 0x6c01aa20, 0xc9ab: 0x6c21e220, + 0xc9ac: 0x6c0d5020, 0xc9ad: 0x6c21d020, 0xc9ae: 0x6c21d420, 0xc9af: 0x6c06de20, + 0xc9b8: 0x6c21f620, 0xc9ba: 0x6c21ec20, + 0xc9be: 0x6c21dc20, + // Block 0x327, offset 0xc9c0 + 0xc9c3: 0x6c21ea20, + 0xc9ca: 0x6c14a620, + 0xc9cd: 0x6c21e620, 0xc9ce: 0x6c21ee20, + 0xc9d6: 0x6c064020, + 0xc9d8: 0x6c0a9220, 0xc9db: 0x6c0e2620, + 0xc9df: 0x6c21da20, + 0xc9e7: 0x6c156a20, + 0xc9eb: 0x6c21e020, + 0xc9ee: 0x6c21d220, 0xc9ef: 0x6c101020, + 0xc9f2: 0x6c21d820, + 0xc9f6: 0x6c21e420, + 0xc9fe: 0x6c172620, 0xc9ff: 0x6c090c20, + // Block 0x328, offset 0xca00 + 0xca00: 0x6c149020, 0xca02: 0x6c21f820, + 0xca0c: 0x6c11bc20, 0xca0f: 0x6c221020, + 0xca10: 0x6c061620, + 0xca16: 0x6c0a0c20, + 0xca18: 0x6c21fc20, + 0xca1c: 0x6c162620, 0xca1d: 0x6c06e020, 0xca1f: 0x6c221620, + 0xca22: 0x6c009c20, + 0xca25: 0x6c221220, + 0xca2a: 0x6c21fa20, + 0xca2f: 0x6c220620, + 0xca32: 0x6c220a20, + 0xca36: 0x6c15aa20, 0xca37: 0x6c220020, + 0xca3a: 0x6c0f8820, + 0xca3d: 0x6c220420, + // Block 0x329, offset 0xca40 + 0xca42: 0x6c221420, + 0xca44: 0x6c220820, 0xca45: 0x6c14de20, + 0xca49: 0x6c21fe20, 0xca4b: 0x6c08d420, + 0xca4c: 0x6c222e20, + 0xca51: 0x6c02c820, 0xca53: 0x6c220220, + 0xca54: 0x6c220c20, 0xca55: 0x6c220e20, + 0xca5d: 0x6c0dd020, 0xca5e: 0x6c0dac20, + 0xca6c: 0x6c221e20, 0xca6f: 0x6c222a20, + 0xca72: 0x6c222620, + 0xca74: 0x6c0f7e20, 0xca77: 0x6c223420, + 0xca78: 0x6c222020, + 0xca7e: 0x6c222220, 0xca7f: 0x6c21f220, + // Block 0x32a, offset 0xca80 + 0xca81: 0x6c045e20, 0xca82: 0x6c129020, + 0xca86: 0x6c090e20, + 0xca89: 0x6c074a20, + 0xca8f: 0x6c16ea20, + 0xca91: 0x6c221a20, 0xca93: 0x6c223220, + 0xca94: 0x6c014e20, 0xca95: 0x6c0d0820, + 0xcaa0: 0x6c119620, 0xcaa2: 0x6c033220, 0xcaa3: 0x6c16bc20, + 0xcaab: 0x6c149220, + 0xcaac: 0x6c0f1420, + 0xcab1: 0x6c222820, 0xcab2: 0x6c222c20, + 0xcab8: 0x6c0ca020, + 0xcabe: 0x6c223020, 0xcabf: 0x6c222420, + // Block 0x32b, offset 0xcac0 + 0xcac1: 0x6c221820, + 0xcac5: 0x6c033620, + 0xcad4: 0x6c05b620, + 0xcad8: 0x6c224c20, 0xcadb: 0x6c224220, + 0xcadc: 0x6c0c7020, 0xcadf: 0x6c02ba20, + 0xcae4: 0x6c0a0e20, 0xcae6: 0x6c225420, + 0xcaed: 0x6c224620, 0xcaee: 0x6c0ec820, 0xcaef: 0x6c224020, + 0xcaf0: 0x6c0f2220, + 0xcaf4: 0x6c228620, + 0xcaf8: 0x6c223a20, 0xcafa: 0x6c223820, + 0xcafc: 0x6c224a20, + // Block 0x32c, offset 0xcb00 + 0xcb00: 0x6c223e20, 0xcb01: 0x6c223c20, 0xcb02: 0x6c224820, + 0xcb04: 0x6c0bc220, 0xcb06: 0x6c223620, + 0xcb0e: 0x6c224e20, + 0xcb11: 0x6c225020, + 0xcb17: 0x6c033420, + 0xcb21: 0x6c225a20, 0xcb23: 0x6c225820, + 0xcb24: 0x6c225c20, + 0xcb2a: 0x6c226220, + 0xcb31: 0x6c0fb220, 0xcb33: 0x6c225620, + 0xcb39: 0x6c225e20, + // Block 0x32d, offset 0xcb40 + 0xcb40: 0x6c05aa20, 0xcb41: 0x6c0dea20, 0xcb42: 0x6c225220, 0xcb43: 0x6c111a20, + 0xcb46: 0x6c226020, + 0xcb54: 0x6c226a20, 0xcb55: 0x6c226620, + 0xcb58: 0x6c226c20, 0xcb5b: 0x6c227220, + 0xcb5f: 0x6c226420, + 0xcb60: 0x6c073020, 0xcb61: 0x6c10f420, + 0xcb64: 0x6c21a420, + 0xcb6b: 0x6c15f420, + 0xcb6c: 0x6c226820, 0xcb6e: 0x6c227020, 0xcb6f: 0x6c0de220, + 0xcb71: 0x6c226e20, 0xcb73: 0x6c224420, + 0xcb76: 0x6c2e8020, + 0xcb7a: 0x6c227820, + 0xcb7e: 0x6c228020, + // Block 0x32e, offset 0xcb80 + 0xcb81: 0x6c227c20, + 0xcb89: 0x6c227420, 0xcb8b: 0x6c227620, + 0xcb8f: 0x6c227e20, + 0xcb91: 0x6c227a20, + 0xcb95: 0x6c12b820, + 0xcb98: 0x6c228a20, 0xcb9a: 0x6c228420, 0xcb9b: 0x6c228220, + 0xcb9d: 0x6c228820, 0xcb9e: 0x6c109020, 0xcb9f: 0x6c228c20, + 0xcba6: 0x6c0e9e20, 0xcba7: 0x6c0dd220, + 0xcbac: 0x6c0bca20, + 0xcbb0: 0x6c228e20, 0xcbb2: 0x6c229220, + 0xcbbe: 0x6c229020, + // Block 0x32f, offset 0xcbc0 + 0xcbcc: 0x6c221c20, + 0xcbd1: 0x6c229420, + 0xcbd8: 0x6c10b620, + 0xcbe3: 0x6c229620, + 0xcbeb: 0x6c01d820, + 0xcbef: 0x6c101420, + 0xcbf0: 0x6c023e20, + 0xcbf8: 0x6c043420, + 0xcbfc: 0x6c094c20, 0xcbfd: 0x6c07bc20, + // Block 0x330, offset 0xcc00 + 0xcc09: 0x6c16d220, 0xcc0a: 0x6c0b9020, + 0xcc0e: 0x6c015020, + 0xcc12: 0x6c229a20, + 0xcc19: 0x6c229820, + 0xcc2c: 0x6c22a020, 0xcc2d: 0x6c0e2820, 0xcc2e: 0x6c22a620, 0xcc2f: 0x6c229c20, + 0xcc33: 0x6c22a420, + 0xcc38: 0x6c22a220, 0xcc39: 0x6c0fac20, 0xcc3a: 0x6c007220, + // Block 0x331, offset 0xcc40 + 0xcc48: 0x6c16b220, 0xcc4b: 0x6c22aa20, + 0xcc4f: 0x6c00cc20, + 0xcc59: 0x6c22ae20, + 0xcc5d: 0x6c22ac20, 0xcc5f: 0x6c22a820, + 0xcc71: 0x6c229e20, + 0xcc79: 0x6c13da20, + 0xcc7d: 0x6c22b220, + // Block 0x332, offset 0xcc80 + 0xcc89: 0x6c22b020, + 0xcc94: 0x6c015220, + 0xcc99: 0x6c22b620, 0xcc9a: 0x6c133c20, + 0xcc9c: 0x6c22b420, + 0xcca1: 0x6c14ba20, + 0xcca6: 0x6c0a9620, + 0xccb6: 0x6c0ca220, + 0xccbc: 0x6c0a9420, + // Block 0x333, offset 0xccc0 + 0xccc9: 0x6c16be20, + 0xcccc: 0x6c22c220, 0xccce: 0x6c0c7220, + 0xccd5: 0x6c22ba20, 0xccd6: 0x6c22c420, + 0xccd9: 0x6c015420, + 0xcce2: 0x6c22c020, + 0xcce4: 0x6c116620, 0xcce5: 0x6c22b820, 0xcce6: 0x6c22be20, 0xcce7: 0x6c0a9820, + 0xcce9: 0x6c120220, + 0xccec: 0x6c22c620, 0xccee: 0x6c093220, + 0xccfd: 0x6c0c7420, + // Block 0x334, offset 0xcd00 + 0xcd04: 0x6c22cc20, + 0xcd08: 0x6c22bc20, 0xcd0a: 0x6c053220, + 0xcd0f: 0x6c22c820, + 0xcd14: 0x6c15ac20, 0xcd15: 0x6c22ce20, + 0xcd19: 0x6c31a620, + 0xcd1f: 0x6c09ea20, + 0xcd28: 0x6c22d020, + 0xcd2c: 0x6c22d220, + 0xcd31: 0x6c110020, + 0xcd39: 0x6c22d620, + 0xcd3e: 0x6c22d820, + // Block 0x335, offset 0xcd40 + 0xcd43: 0x6c110a20, + 0xcd48: 0x6c101620, 0xcd49: 0x6c22dc20, + 0xcd4e: 0x6c22e020, + 0xcd50: 0x6c167220, 0xcd52: 0x6c22da20, + 0xcd54: 0x6c22de20, 0xcd55: 0x6c015620, 0xcd57: 0x6c22d420, + 0xcd5f: 0x6c19d420, + 0xcd60: 0x6c22e220, + 0xcd65: 0x6c0d0a20, 0xcd66: 0x6c084420, 0xcd67: 0x6c22e620, + 0xcd6c: 0x6c22e420, 0xcd6d: 0x6c0b0c20, 0xcd6e: 0x6c191420, + 0xcd75: 0x6c22e820, + 0xcd79: 0x6c22ec20, 0xcd7b: 0x6c22ca20, + 0xcd7c: 0x6c22ea20, 0xcd7f: 0x6c22ee20, + // Block 0x336, offset 0xcd80 + 0xcd86: 0x6c119820, + 0xcd8d: 0x6c22f020, + 0xcd90: 0x6c22f220, + 0xcd9b: 0x6c22f420, + 0xcda8: 0x6c22f620, 0xcdaa: 0x6c0f2c20, + 0xcdac: 0x6c22fa20, 0xcdad: 0x6c22f820, + 0xcdb0: 0x6c22fc20, 0xcdb2: 0x6c22fe20, + 0xcdb5: 0x6c094e20, 0xcdb6: 0x6c12e220, + 0xcdba: 0x6c152820, 0xcdbb: 0x6c230020, + 0xcdbc: 0x6c230220, 0xcdbd: 0x6c0ce820, 0xcdbe: 0x6c08d820, 0xcdbf: 0x6c230420, + // Block 0x337, offset 0xcdc0 + 0xcdc0: 0x6c230620, + 0xcdc6: 0x6c230820, 0xcdc7: 0x6c137c20, + 0xcdc8: 0x6c11ee20, 0xcdcb: 0x6c230a20, + 0xcdcc: 0x6c115220, + 0xcdd2: 0x6c0eca20, + 0xcdd8: 0x6c230c20, 0xcdd9: 0x6c020620, 0xcddb: 0x6c044620, + 0xcddd: 0x6c14dc20, 0xcddf: 0x6c14bc20, + 0xcde1: 0x6c01a020, 0xcde2: 0x6c16ec20, + 0xcde7: 0x6c143820, + 0xcde9: 0x6c132c20, + 0xcdf2: 0x6c0bee20, + 0xcdf4: 0x6c230e20, + 0xcdf9: 0x6c106e20, + 0xcdfd: 0x6c05e620, 0xcdfe: 0x6c231020, + // Block 0x338, offset 0xce00 + 0xce00: 0x6c07c020, 0xce01: 0x6c231420, 0xce02: 0x6c231220, + 0xce07: 0x6c231620, + 0xce12: 0x6c231820, + 0xce16: 0x6c231a20, + 0xce20: 0x6c03e820, 0xce22: 0x6c231c20, + 0xce27: 0x6c231e20, + 0xce2c: 0x6c05e820, 0xce2f: 0x6c11f020, + 0xce32: 0x6c232220, + 0xce36: 0x6c0af220, + 0xce39: 0x6c232020, + // Block 0x339, offset 0xce40 + 0xce42: 0x6c049820, 0xce43: 0x6c232420, + 0xce44: 0x6c232820, 0xce46: 0x6c232620, + 0xce4e: 0x6c232a20, + 0xce50: 0x6c064220, 0xce52: 0x6c232c20, + 0xce57: 0x6c04fa20, + 0xce59: 0x6c0cbc20, 0xce5b: 0x6c075620, + 0xce60: 0x6c233020, 0xce61: 0x6c233220, 0xce62: 0x6c232e20, + 0xce69: 0x6c096a20, + 0xce6c: 0x6c107820, 0xce6d: 0x6c049a20, + 0xce77: 0x6c233620, + 0xce78: 0x6c0e0c20, 0xce79: 0x6c233420, + 0xce7c: 0x6c16ee20, 0xce7d: 0x6c116820, + // Block 0x33a, offset 0xce80 + 0xce8a: 0x6c233c20, + 0xce96: 0x6c234020, 0xce97: 0x6c233a20, + 0xce9b: 0x6c14f820, + 0xce9c: 0x6c233e20, 0xce9d: 0x6c234220, 0xce9f: 0x6c165020, + 0xcea5: 0x6c234a20, + 0xcea9: 0x6c234820, 0xceaa: 0x6c0ea020, 0xceab: 0x6c10fe20, + 0xceae: 0x6c05ea20, 0xceaf: 0x6c234620, + 0xceb4: 0x6c234420, 0xceb6: 0x6c156e20, 0xceb7: 0x6c157020, + 0xcebe: 0x6c234c20, 0xcebf: 0x6c015820, + // Block 0x33b, offset 0xcec0 + 0xcec4: 0x6c074820, 0xcec5: 0x6c089820, + 0xcece: 0x6c234e20, 0xcecf: 0x6c235020, + 0xced7: 0x6c235420, + 0xcee3: 0x6c09d220, + 0xcee8: 0x6c235820, 0xceea: 0x6c235620, + 0xcef0: 0x6c235a20, 0xcef2: 0x6c028e20, + 0xcef5: 0x6c235e20, + 0xcef8: 0x6c235c20, 0xcefa: 0x6c236220, 0xcefb: 0x6c236020, + // Block 0x33c, offset 0xcf00 + 0xcf04: 0x6c061820, 0xcf07: 0x6c161820, + 0xcf09: 0x6c04c020, 0xcf0b: 0x6c018420, + 0xcf16: 0x6c04fc20, + 0xcf29: 0x6c037220, + 0xcf32: 0x6c169820, 0xcf33: 0x6c236620, + 0xcf3b: 0x6c236a20, + // Block 0x33d, offset 0xcf40 + 0xcf40: 0x6c236c20, 0xcf42: 0x6c01da20, + 0xcf48: 0x6c236420, 0xcf4a: 0x6c084620, + 0xcf4d: 0x6c0ef220, 0xcf4e: 0x6c236820, + 0xcf5e: 0x6c237220, + 0xcf60: 0x6c096c20, + 0xcf65: 0x6c236e20, + 0xcf6a: 0x6c056020, + 0xcf6d: 0x6c11f220, 0xcf6e: 0x6c237020, + 0xcf71: 0x6c23a620, + 0xcf78: 0x6c237c20, + 0xcf7e: 0x6c061a20, + // Block 0x33e, offset 0xcf80 + 0xcf83: 0x6c043620, + 0xcf85: 0x6c237620, 0xcf86: 0x6c160620, + 0xcf89: 0x6c162820, + 0xcfa2: 0x6c0de420, + 0xcfa5: 0x6c237a20, + 0xcfb2: 0x6c237e20, 0xcfb3: 0x6c167420, + 0xcfb4: 0x6c04d620, 0xcfb5: 0x6c125820, 0xcfb6: 0x6c113820, + 0xcfba: 0x6c238020, + 0xcfbf: 0x6c238420, + // Block 0x33f, offset 0xcfc0 + 0xcfc1: 0x6c238a20, + 0xcfd5: 0x6c238220, + 0xcfd9: 0x6c238820, 0xcfda: 0x6c067420, 0xcfdb: 0x6c011620, + 0xcfdc: 0x6c238c20, 0xcfde: 0x6c0ba420, 0xcfdf: 0x6c238620, + 0xcfe0: 0x6c168020, 0xcfe3: 0x6c239220, + 0xcfe4: 0x6c31a220, + 0xcfe9: 0x6c238e20, 0xcfea: 0x6c239420, + 0xcfef: 0x6c237820, + 0xcff0: 0x6c239020, 0xcff3: 0x6c079020, + 0xcff6: 0x6c239620, + 0xcffe: 0x6c239820, + // Block 0x340, offset 0xd000 + 0xd003: 0x6c160820, + 0xd00b: 0x6c239a20, + 0xd01e: 0x6c239c20, + 0xd022: 0x6c237420, + 0xd027: 0x6c239e20, + 0xd030: 0x6c033820, + 0xd03d: 0x6c08da20, + // Block 0x341, offset 0xd040 + 0xd04a: 0x6c23a020, + 0xd04f: 0x6c23a220, + 0xd054: 0x6c23a420, + 0xd05c: 0x6c00f220, + 0xd060: 0x6c23a820, 0xd062: 0x6c129220, 0xd063: 0x6c23aa20, + 0xd066: 0x6c02f820, 0xd067: 0x6c23ac20, + 0xd069: 0x6c23ae20, + 0xd06e: 0x6c23b020, + 0xd070: 0x6c23b420, 0xd071: 0x6c23b620, 0xd072: 0x6c23b220, + 0xd076: 0x6c12c220, 0xd077: 0x6c23ba20, + 0xd078: 0x6c23b820, + // Block 0x342, offset 0xd080 + 0xd083: 0x6c23be20, + 0xd084: 0x6c23bc20, 0xd085: 0x6c23c020, + 0xd08c: 0x6c23c220, 0xd08d: 0x6c23c620, 0xd08e: 0x6c23c420, + 0xd091: 0x6c074e20, 0xd093: 0x6c23ca20, + 0xd095: 0x6c23c820, + 0xd098: 0x6c033a20, 0xd09a: 0x6c0b6a20, + 0xd09c: 0x6c0fa420, 0xd09e: 0x6c23cc20, 0xd09f: 0x6c0bf020, + 0xd0a3: 0x6c084820, + 0xd0a5: 0x6c016e20, 0xd0a6: 0x6c23ce20, + 0xd0a8: 0x6c15ae20, 0xd0ab: 0x6c139e20, + 0xd0ac: 0x6c23d020, + 0xd0b0: 0x6c0fb420, 0xd0b1: 0x6c157220, 0xd0b2: 0x6c06e220, 0xd0b3: 0x6c0b3e20, + 0xd0b7: 0x6c0e4a20, + 0xd0b8: 0x6c18ca20, 0xd0ba: 0x6c0ecc20, 0xd0bb: 0x6c020820, + 0xd0bc: 0x6c23d220, + // Block 0x343, offset 0xd0c0 + 0xd0c4: 0x6c23d420, 0xd0c6: 0x6c23de20, + 0xd0c9: 0x6c23da20, 0xd0ca: 0x6c23d820, 0xd0cb: 0x6c1ec620, + 0xd0cc: 0x6c024020, 0xd0cd: 0x6c23d620, 0xd0cf: 0x6c007420, + 0xd0d1: 0x6c11b420, + 0xd0d4: 0x6c11f420, + 0xd0d9: 0x6c162a20, 0xd0da: 0x6c23e020, 0xd0db: 0x6c23dc20, + 0xd0dc: 0x6c0e6c20, 0xd0dd: 0x6c0bcc20, + 0xd0e0: 0x6c11b620, 0xd0e2: 0x6c127620, + 0xd0e4: 0x6c23e420, 0xd0e5: 0x6c162020, 0xd0e6: 0x6c057e20, 0xd0e7: 0x6c23e620, + 0xd0e9: 0x6c23e220, 0xd0ea: 0x6c120c20, 0xd0eb: 0x6c23e820, + 0xd0ed: 0x6c23ea20, + 0xd0f0: 0x6c007620, 0xd0f3: 0x6c0af420, + 0xd0f4: 0x6c23f420, 0xd0f6: 0x6c23ee20, 0xd0f7: 0x6c10c220, + 0xd0f8: 0x6c23ec20, + 0xd0ff: 0x6c03b820, + // Block 0x344, offset 0xd100 + 0xd102: 0x6c23fa20, + 0xd106: 0x6c23f020, 0xd107: 0x6c23f220, + 0xd109: 0x6c23f820, 0xd10a: 0x6c23f620, 0xd10b: 0x6c126620, + 0xd10e: 0x6c0cc020, 0xd10f: 0x6c0cbe20, + 0xd111: 0x6c03ea20, + 0xd114: 0x6c23fc20, + 0xd11a: 0x6c23fe20, + 0xd11d: 0x6c240020, + 0xd123: 0x6c240420, + 0xd125: 0x6c240220, + 0xd12b: 0x6c012820, + 0xd131: 0x6c241420, 0xd132: 0x6c123020, 0xd133: 0x6c240820, + 0xd135: 0x6c240c20, + 0xd138: 0x6c241020, 0xd139: 0x6c0b4020, + 0xd13c: 0x6c241220, 0xd13d: 0x6c240e20, 0xd13e: 0x6c091020, + // Block 0x345, offset 0xd140 + 0xd142: 0x6c240620, 0xd143: 0x6c240a20, + 0xd145: 0x6c12a020, 0xd147: 0x6c0a9a20, + 0xd14a: 0x6c241820, + 0xd14d: 0x6c241620, + 0xd152: 0x6c241a20, + 0xd154: 0x6c08dc20, 0xd155: 0x6c077620, + 0xd158: 0x6c101a20, 0xd159: 0x6c241c20, 0xd15b: 0x6c0f0620, + 0xd15e: 0x6c242020, + 0xd162: 0x6c160a20, 0xd163: 0x6c241e20, + 0xd169: 0x6c0d0e20, + 0xd170: 0x6c242a20, 0xd172: 0x6c242e20, 0xd173: 0x6c243020, + 0xd174: 0x6c0e5c20, + 0xd17a: 0x6c242c20, + 0xd17c: 0x6c242620, 0xd17e: 0x6c242220, 0xd17f: 0x6c242420, + // Block 0x346, offset 0xd180 + 0xd181: 0x6c242820, + 0xd189: 0x6c243620, 0xd18b: 0x6c243220, + 0xd18d: 0x6c243420, + 0xd19f: 0x6c243820, + 0xd1a0: 0x6c243c20, 0xd1a1: 0x6c243e20, 0xd1a2: 0x6c244020, + 0xd1a4: 0x6c244220, 0xd1a7: 0x6c243a20, + 0xd1b0: 0x6c244620, + 0xd1b4: 0x6c244420, + 0xd1bb: 0x6c244820, + // Block 0x347, offset 0xd1c0 + 0xd1c2: 0x6c165220, + 0xd1c6: 0x6c244e20, 0xd1c7: 0x6c244a20, + 0xd1c8: 0x6c244c20, + 0xd1cc: 0x6c037420, + 0xd1d2: 0x6c154c20, + 0xd1d6: 0x6c136c20, + 0xd1d8: 0x6c245220, + 0xd1dc: 0x6c245020, + 0xd1e1: 0x6c245420, 0xd1e2: 0x6c245620, + 0xd1e7: 0x6c245e20, + 0xd1e8: 0x6c245820, 0xd1e9: 0x6c245a20, 0xd1ea: 0x6c245c20, + 0xd1ec: 0x6c246020, + 0xd1f0: 0x6c246220, 0xd1f2: 0x6c246420, + 0xd1f6: 0x6c246620, + 0xd1f8: 0x6c246820, 0xd1fa: 0x6c11be20, 0xd1fb: 0x6c0fcc20, + 0xd1fc: 0x6c246a20, 0xd1fd: 0x6c118820, 0xd1fe: 0x6c128420, + // Block 0x348, offset 0xd200 + 0xd200: 0x6c246c20, 0xd203: 0x6c246e20, + 0xd204: 0x6c0f8020, 0xd206: 0x6c024220, 0xd207: 0x6c06e420, + 0xd208: 0x6c247020, 0xd20b: 0x6c247220, + 0xd20e: 0x6c247420, + 0xd210: 0x6c082620, 0xd213: 0x6c247820, + 0xd216: 0x6c247620, + 0xd219: 0x6c247a20, 0xd21a: 0x6c247c20, + 0xd22e: 0x6c123220, + 0xd230: 0x6c247e20, + 0xd234: 0x6c248020, 0xd237: 0x6c317020, + 0xd238: 0x6c248220, 0xd239: 0x6c248420, 0xd23a: 0x6c248620, + 0xd23f: 0x6c083020, + // Block 0x349, offset 0xd240 + 0xd242: 0x6c248820, 0xd243: 0x6c115020, + 0xd246: 0x6c145220, + 0xd248: 0x6c011820, 0xd24a: 0x6c012a20, + 0xd24d: 0x6c248a20, + 0xd252: 0x6c248e20, + 0xd256: 0x6c248c20, 0xd257: 0x6c100c20, + 0xd25b: 0x6c0bf220, + 0xd25c: 0x6c20e820, 0xd25e: 0x6c249020, 0xd25f: 0x6c14d220, + 0xd261: 0x6c249220, 0xd263: 0x6c033c20, + 0xd264: 0x6c120e20, 0xd265: 0x6c249420, 0xd267: 0x6c249620, + 0xd26a: 0x6c249820, + 0xd26e: 0x6c150820, + 0xd272: 0x6c14fa20, + 0xd274: 0x6c0eec20, + 0xd278: 0x6c0d1020, 0xd27b: 0x6c249c20, + 0xd27e: 0x6c0a1020, + // Block 0x34a, offset 0xd280 + 0xd281: 0x6c0a9c20, + 0xd284: 0x6c24a220, 0xd287: 0x6c24a020, + 0xd288: 0x6c249e20, 0xd289: 0x6c125a20, 0xd28b: 0x6c033e20, + 0xd28c: 0x6c05f220, + 0xd29b: 0x6c24ae20, + 0xd29e: 0x6c24a820, 0xd29f: 0x6c0b4220, + 0xd2a0: 0x6c14b420, + 0xd2a4: 0x6c24a620, 0xd2a5: 0x6c24aa20, 0xd2a6: 0x6c24ac20, + 0xd2a9: 0x6c24a420, + 0xd2b7: 0x6c24b020, + 0xd2b8: 0x6c24b220, 0xd2ba: 0x6c0ece20, + 0xd2bc: 0x6c037620, + // Block 0x34b, offset 0xd2c0 + 0xd2c0: 0x6c0e7e20, + 0xd2c7: 0x6c24b420, + 0xd2da: 0x6c24b620, 0xd2db: 0x6c24bc20, + 0xd2e1: 0x6c0b9220, 0xd2e3: 0x6c107020, + 0xd2e5: 0x6c24be20, 0xd2e6: 0x6c143a20, + 0xd2e8: 0x6c24b820, 0xd2eb: 0x6c24ba20, + 0xd2f9: 0x6c24c420, + 0xd2fe: 0x6c24c220, 0xd2ff: 0x6c24c020, + // Block 0x34c, offset 0xd300 + 0xd30b: 0x6c24c820, + 0xd30e: 0x6c24c620, + 0xd311: 0x6c24ca20, + 0xd31e: 0x6c24ce20, + 0xd320: 0x6c24cc20, + 0xd325: 0x6c137220, + 0xd32c: 0x6c09f820, 0xd32d: 0x6c165420, + 0xd330: 0x6c24d020, 0xd333: 0x6c105620, + 0xd336: 0x6c24d220, + 0xd339: 0x6c24d420, 0xd33b: 0x6c24dc20, + 0xd33c: 0x6c24d820, 0xd33d: 0x6c24da20, 0xd33f: 0x6c24d620, + // Block 0x34d, offset 0xd340 + 0xd347: 0x6c24de20, + 0xd34d: 0x6c24e020, + 0xd357: 0x6c24e220, + 0xd35a: 0x6c24e420, 0xd35b: 0x6c14be20, + 0xd35c: 0x6c24e620, + 0xd362: 0x6c153020, 0xd363: 0x6c24e820, + 0xd365: 0x6c0e5020, 0xd367: 0x6c117820, + 0xd369: 0x6c04fe20, + 0xd36d: 0x6c0e2a20, 0xd36e: 0x6c24ea20, 0xd36f: 0x6c049c20, + 0xd373: 0x6c0c2020, + 0xd37c: 0x6c24ec20, + // Block 0x34e, offset 0xd380 + 0xd382: 0x6c079220, + 0xd38c: 0x6c24ee20, + 0xd392: 0x6c24f020, + 0xd394: 0x6c05ec20, 0xd395: 0x6c07c220, + 0xd3a0: 0x6c24f420, + 0xd3a5: 0x6c0fd820, 0xd3a6: 0x6c07c420, 0xd3a7: 0x6c040820, + 0xd3b2: 0x6c13dc20, + 0xd3b4: 0x6c113a20, + 0xd3ba: 0x6c0fda20, + 0xd3bf: 0x6c071420, + // Block 0x34f, offset 0xd3c0 + 0xd3c5: 0x6c24f820, + 0xd3dd: 0x6c0a9e20, + 0xd3eb: 0x6c162c20, + 0xd3ec: 0x6c06e620, 0xd3ef: 0x6c05ee20, + 0xd3f2: 0x6c11a620, + 0xd3f4: 0x6c24fc20, + 0xd3fc: 0x6c250020, + // Block 0x350, offset 0xd400 + 0xd401: 0x6c067620, + 0xd406: 0x6c24fe20, 0xd407: 0x6c0f5c20, + 0xd40c: 0x6c250420, 0xd40d: 0x6c026220, 0xd40e: 0x6c24fa20, + 0xd411: 0x6c123420, 0xd413: 0x6c00dc20, + 0xd415: 0x6c07f020, 0xd417: 0x6c172820, + 0xd41a: 0x6c250220, + 0xd423: 0x6c250620, + 0xd427: 0x6c136e20, + 0xd429: 0x6c0c3220, 0xd42a: 0x6c250a20, + 0xd42f: 0x6c250c20, + 0xd435: 0x6c250820, + 0xd43a: 0x6c029020, + 0xd43c: 0x6c251820, 0xd43e: 0x6c251620, + // Block 0x351, offset 0xd440 + 0xd441: 0x6c08de20, + 0xd445: 0x6c251a20, 0xd446: 0x6c251020, + 0xd44a: 0x6c251c20, 0xd44b: 0x6c251220, + 0xd450: 0x6c121020, 0xd451: 0x6c250e20, + 0xd454: 0x6c251420, + 0xd45a: 0x6c252220, + 0xd467: 0x6c252020, + 0xd468: 0x6c145620, + 0xd46c: 0x6c251e20, 0xd46f: 0x6c009620, + 0xd474: 0x6c252620, + 0xd47d: 0x6c252420, + // Block 0x352, offset 0xd480 + 0xd481: 0x6c0aa020, + 0xd487: 0x6c252820, + 0xd48e: 0x6c0cc220, + 0xd491: 0x6c252c20, 0xd492: 0x6c252a20, + 0xd499: 0x6c252e20, + 0xd4a6: 0x6c24f220, + 0xd4aa: 0x6c24f620, 0xd4ab: 0x6c253220, + 0xd4ac: 0x6c253020, + 0xd4ba: 0x6c08e020, + 0xd4bc: 0x6c169a20, 0xd4be: 0x6c093420, + // Block 0x353, offset 0xd4c0 + 0xd4c0: 0x6c253420, 0xd4c1: 0x6c055220, + 0xd4c7: 0x6c03ec20, + 0xd4c8: 0x6c03ba20, 0xd4c9: 0x6c089a20, + 0xd4d0: 0x6c157420, 0xd4d3: 0x6c254020, + 0xd4d5: 0x6c253e20, 0xd4d6: 0x6c0cc420, 0xd4d7: 0x6c253820, + 0xd4da: 0x6c253c20, + 0xd4dd: 0x6c09e220, 0xd4de: 0x6c0b4420, 0xd4df: 0x6c253a20, + 0xd4e0: 0x6c253620, 0xd4e2: 0x6c10f820, + 0xd4e5: 0x6c0aa220, + 0xd4e8: 0x6c129420, + 0xd4ed: 0x6c07c620, + 0xd4f7: 0x6c101c20, + 0xd4fa: 0x6c254220, + 0xd4ff: 0x6c254420, + // Block 0x354, offset 0xd500 + 0xd500: 0x6c257020, 0xd501: 0x6c04d820, + 0xd504: 0x6c16fe20, 0xd505: 0x6c0ca620, + 0xd50a: 0x6c254620, + 0xd50d: 0x6c01dc20, 0xd50e: 0x6c0f5e20, 0xd50f: 0x6c131a20, + 0xd51d: 0x6c254820, + 0xd526: 0x6c046020, 0xd527: 0x6c254a20, + 0xd52a: 0x6c254e20, + 0xd52e: 0x6c255020, + 0xd530: 0x6c10f620, 0xd533: 0x6c255220, + 0xd539: 0x6c255420, 0xd53a: 0x6c255620, + 0xd53d: 0x6c04da20, 0xd53e: 0x6c01de20, 0xd53f: 0x6c107220, + // Block 0x355, offset 0xd540 + 0xd540: 0x6c099c20, 0xd541: 0x6c089c20, + 0xd549: 0x6c255820, 0xd54b: 0x6c099e20, + 0xd551: 0x6c01cc20, 0xd552: 0x6c12a220, + 0xd555: 0x6c255a20, + 0xd558: 0x6c123620, + 0xd55f: 0x6c0cc620, + 0xd561: 0x6c256020, 0xd563: 0x6c256220, + 0xd564: 0x6c117620, 0xd566: 0x6c0b4620, 0xd567: 0x6c255c20, + 0xd569: 0x6c0e7620, + 0xd56c: 0x6c255e20, + 0xd570: 0x6c0aa420, + 0xd57b: 0x6c007820, + // Block 0x356, offset 0xd580 + 0xd580: 0x6c03be20, + 0xd588: 0x6c256420, 0xd58b: 0x6c0f6020, + 0xd58d: 0x6c256620, 0xd58e: 0x6c0c0e20, + 0xd594: 0x6c14aa20, 0xd597: 0x6c126220, + 0xd598: 0x6c256820, 0xd599: 0x6c256a20, 0xd59a: 0x6c0e5e20, + 0xd59c: 0x6c165620, 0xd59f: 0x6c256e20, + 0xd5a0: 0x6c256c20, + 0xd5ae: 0x6c096e20, + 0xd5b1: 0x6c257220, 0xd5b2: 0x6c00a020, + 0xd5b7: 0x6c257820, + 0xd5bb: 0x6c257420, + 0xd5bc: 0x6c01e020, 0xd5bd: 0x6c058020, 0xd5be: 0x6c257620, 0xd5bf: 0x6c06e820, + // Block 0x357, offset 0xd5c0 + 0xd5c0: 0x6c074020, 0xd5c2: 0x6c13a420, 0xd5c3: 0x6c257a20, + 0xd5c6: 0x6c143c20, + 0xd5c9: 0x6c257e20, + 0xd5cd: 0x6c0c2220, 0xd5ce: 0x6c011a20, 0xd5cf: 0x6c01ac20, + 0xd5d0: 0x6c001820, + 0xd5d7: 0x6c257c20, + 0xd5e1: 0x6c258020, 0xd5e2: 0x6c258220, 0xd5e3: 0x6c0af620, + 0xd5e9: 0x6c258420, 0xd5eb: 0x6c029220, + 0xd5f0: 0x6c258820, + 0xd5f4: 0x6c05b820, 0xd5f6: 0x6c043820, + 0xd5f9: 0x6c258a20, 0xd5fa: 0x6c051220, + 0xd5fd: 0x6c258c20, 0xd5ff: 0x6c0c7820, + // Block 0x358, offset 0xd600 + 0xd601: 0x6c108220, 0xd603: 0x6c0c4020, + 0xd604: 0x6c080220, + 0xd608: 0x6c258e20, + 0xd612: 0x6c0e7820, 0xd613: 0x6c0d1220, + 0xd615: 0x6c259220, 0xd616: 0x6c259620, 0xd617: 0x6c259020, + 0xd618: 0x6c259420, + 0xd61f: 0x6c052820, + 0xd629: 0x6c259820, 0xd62a: 0x6c053020, + 0xd62e: 0x6c043a20, 0xd62f: 0x6c15b020, + 0xd630: 0x6c259c20, + 0xd636: 0x6c259e20, + 0xd63a: 0x6c00d820, + 0xd63f: 0x6c25a420, + // Block 0x359, offset 0xd640 + 0xd643: 0x6c02e020, + 0xd644: 0x6c25a220, 0xd645: 0x6c25a020, 0xd647: 0x6c25a820, + 0xd648: 0x6c259a20, 0xd64a: 0x6c25aa20, 0xd64b: 0x6c161a20, + 0xd64d: 0x6c25ac20, 0xd64f: 0x6c25ae20, + 0xd652: 0x6c1ac220, 0xd653: 0x6c25b220, + 0xd655: 0x6c25b020, + 0xd659: 0x6c25b420, 0xd65a: 0x6c25b620, + 0xd65c: 0x6c163220, 0xd65d: 0x6c25b820, 0xd65f: 0x6c2f4820, + 0xd660: 0x6c0aa620, 0xd661: 0x6c25ba20, 0xd662: 0x6c25bc20, 0xd663: 0x6c09fa20, + 0xd665: 0x6c105820, 0xd666: 0x6c25be20, + 0xd66a: 0x6c0e0420, + 0xd66d: 0x6c25c020, 0xd66f: 0x6c0e2c20, + 0xd670: 0x6c25c220, + 0xd676: 0x6c047220, + 0xd678: 0x6c182420, 0xd679: 0x6c0e6e20, 0xd67a: 0x6c08f620, + 0xd67f: 0x6c034020, + // Block 0x35a, offset 0xd680 + 0xd682: 0x6c25c420, + 0xd684: 0x6c25de20, 0xd686: 0x6c25ca20, + 0xd688: 0x6c043c20, 0xd68a: 0x6c25c820, 0xd68b: 0x6c25e220, + 0xd68f: 0x6c25c620, + 0xd691: 0x6c0aa820, + 0xd698: 0x6c25ce20, 0xd699: 0x6c25d020, 0xd69b: 0x6c0f8220, + 0xd69e: 0x6c25d220, + 0xd6a0: 0x6c02b020, + 0xd6a5: 0x6c0b7820, 0xd6a6: 0x6c12e420, + 0xd6a8: 0x6c25d620, + 0xd6ac: 0x6c0dc820, + 0xd6b3: 0x6c25cc20, + 0xd6b5: 0x6c25d420, 0xd6b6: 0x6c25d820, + 0xd6b9: 0x6c080e20, + // Block 0x35b, offset 0xd6c0 + 0xd6c5: 0x6c25e620, 0xd6c6: 0x6c127820, + 0xd6c8: 0x6c11ac20, 0xd6c9: 0x6c101e20, 0xd6cb: 0x6c04dc20, + 0xd6cc: 0x6c25e420, 0xd6cd: 0x6c25e020, 0xd6cf: 0x6c11ca20, + 0xd6d0: 0x6c25da20, 0xd6d1: 0x6c0e7020, 0xd6d2: 0x6c102220, + 0xd6d4: 0x6c102020, 0xd6d6: 0x6c080420, + 0xd6dd: 0x6c260a20, + 0xd6e5: 0x6c25ea20, 0xd6e7: 0x6c25ee20, + 0xd6ec: 0x6c25f420, 0xd6ee: 0x6c25f620, + 0xd6f0: 0x6c25f020, 0xd6f1: 0x6c25f220, + 0xd6f4: 0x6c25ec20, 0xd6f5: 0x6c25e820, + 0xd6fa: 0x6c25dc20, + // Block 0x35c, offset 0xd700 + 0xd706: 0x6c137620, 0xd707: 0x6c01e220, + 0xd70b: 0x6c260420, + 0xd70d: 0x6c25fe20, 0xd70f: 0x6c260820, + 0xd712: 0x6c260620, + 0xd714: 0x6c118a20, 0xd715: 0x6c149e20, 0xd717: 0x6c084a20, + 0xd718: 0x6c25fa20, 0xd719: 0x6c260c20, 0xd71a: 0x6c260220, + 0xd71c: 0x6c260020, 0xd71d: 0x6c25f820, 0xd71f: 0x6c25fc20, + 0xd721: 0x6c034220, + 0xd72a: 0x6c0e2e20, + 0xd72d: 0x6c0c7a20, + 0xd731: 0x6c11a420, + 0xd734: 0x6c261620, + 0xd738: 0x6c11a820, + // Block 0x35d, offset 0xd740 + 0xd740: 0x6c0c4220, 0xd741: 0x6c261020, + 0xd744: 0x6c11fe20, 0xd746: 0x6c261820, 0xd747: 0x6c137e20, + 0xd749: 0x6c0e6a20, 0xd74b: 0x6c260e20, + 0xd74c: 0x6c261220, 0xd74f: 0x6c261420, + 0xd75d: 0x6c261a20, + 0xd760: 0x6c091820, + 0xd764: 0x6c107420, 0xd765: 0x6c262420, 0xd766: 0x6c262220, + 0xd769: 0x6c261c20, + 0xd76d: 0x6c16f020, + 0xd773: 0x6c262e20, + 0xd776: 0x6c263620, 0xd777: 0x6c263020, + // Block 0x35e, offset 0xd780 + 0xd780: 0x6c262820, + 0xd787: 0x6c262a20, + 0xd78d: 0x6c263420, + 0xd791: 0x6c261e20, 0xd792: 0x6c190c20, 0xd793: 0x6c262c20, + 0xd794: 0x6c262020, 0xd797: 0x6c263220, + 0xd79f: 0x6c263e20, + 0xd7a1: 0x6c034420, 0xd7a3: 0x6c263820, + 0xd7a7: 0x6c263a20, + 0xd7aa: 0x6c263c20, 0xd7ab: 0x6c264220, + 0xd7b7: 0x6c264020, + 0xd7b8: 0x6c124c20, + 0xd7bd: 0x6c264420, 0xd7be: 0x6c16c020, 0xd7bf: 0x6c13b220, + // Block 0x35f, offset 0xd7c0 + 0xd7c0: 0x6c264e20, 0xd7c3: 0x6c264820, + 0xd7cc: 0x6c264620, 0xd7cd: 0x6c0c2420, 0xd7cf: 0x6c264c20, + 0xd7d0: 0x6c265020, + 0xd7d4: 0x6c264a20, 0xd7d6: 0x6c265820, + 0xd7d8: 0x6c265220, + 0xd7df: 0x6c265420, + 0xd7e0: 0x6c262620, + 0xd7e4: 0x6c265620, 0xd7e5: 0x6c265a20, + 0xd7ec: 0x6c265c20, + 0xd7f3: 0x6c136420, + 0xd7f5: 0x6c265e20, + 0xd7fe: 0x6c151420, + // Block 0x360, offset 0xd800 + 0xd801: 0x6c04c420, 0xd802: 0x6c053620, 0xd803: 0x6c266020, + 0xd809: 0x6c134020, 0xd80b: 0x6c0b9420, + 0xd80d: 0x6c14b020, + 0xd810: 0x6c266220, 0xd812: 0x6c162e20, + 0xd815: 0x6c118c20, 0xd817: 0x6c0cc820, + 0xd818: 0x6c110c20, 0xd81b: 0x6c09e620, + 0xd81f: 0x6c004020, + 0xd821: 0x6c266c20, 0xd822: 0x6c266820, + 0xd824: 0x6c266420, 0xd825: 0x6c02f220, 0xd827: 0x6c0aaa20, + 0xd828: 0x6c266e20, 0xd82b: 0x6c266a20, + 0xd82d: 0x6c266620, 0xd82e: 0x6c267620, + 0xd831: 0x6c267420, 0xd832: 0x6c267220, 0xd833: 0x6c267020, + 0xd839: 0x6c267820, + 0xd83d: 0x6c267a20, 0xd83e: 0x6c0bf420, + // Block 0x361, offset 0xd840 + 0xd840: 0x6c267c20, 0xd842: 0x6c268020, + 0xd845: 0x6c267e20, + 0xd84a: 0x6c064420, + 0xd84e: 0x6c0cac20, + 0xd852: 0x6c268420, + 0xd856: 0x6c102420, + 0xd858: 0x6c268220, + 0xd85c: 0x6c268620, 0xd85e: 0x6c134220, 0xd85f: 0x6c0d1420, + 0xd860: 0x6c06ea20, 0xd862: 0x6c268820, + 0xd867: 0x6c165820, + 0xd86f: 0x6c268c20, + 0xd872: 0x6c268e20, + 0xd874: 0x6c269020, 0xd876: 0x6c269220, + 0xd878: 0x6c089e20, 0xd87a: 0x6c269420, 0xd87b: 0x6c058220, + 0xd87e: 0x6c044020, + // Block 0x362, offset 0xd880 + 0xd880: 0x6c03c020, 0xd882: 0x6c269820, + 0xd884: 0x6c153620, 0xd885: 0x6c06ec20, 0xd886: 0x6c269620, + 0xd88a: 0x6c269e20, 0xd88b: 0x6c151c20, + 0xd88d: 0x6c111c20, + 0xd890: 0x6c128220, + 0xd894: 0x6c0a1220, 0xd895: 0x6c269c20, 0xd897: 0x6c093620, + 0xd898: 0x6c06ee20, 0xd899: 0x6c08a020, 0xd89a: 0x6c043e20, 0xd89b: 0x6c134420, + 0xd89c: 0x6c269a20, + 0xd8a0: 0x6c0cca20, 0xd8a1: 0x6c141820, 0xd8a2: 0x6c080620, + 0xd8ab: 0x6c08a220, + 0xd8ac: 0x6c0f2a20, 0xd8ae: 0x6c26a420, 0xd8af: 0x6c168620, + 0xd8b0: 0x6c07ca20, 0xd8b2: 0x6c26a620, 0xd8b3: 0x6c0b4820, + 0xd8b5: 0x6c26aa20, + 0xd8b9: 0x6c0aac20, 0xd8ba: 0x6c077820, + 0xd8bf: 0x6c26a820, + // Block 0x363, offset 0xd8c0 + 0xd8c2: 0x6c09a020, 0xd8c3: 0x6c061c20, + 0xd8c4: 0x6c0ccc20, 0xd8c5: 0x6c26a020, 0xd8c6: 0x6c26ac20, + 0xd8cb: 0x6c26a220, + 0xd8cc: 0x6c058420, 0xd8ce: 0x6c26b220, 0xd8cf: 0x6c26ba20, + 0xd8d0: 0x6c05ba20, + 0xd8d6: 0x6c26b020, + 0xd8db: 0x6c26c220, + 0xd8de: 0x6c06f020, + 0xd8e1: 0x6c15e620, 0xd8e2: 0x6c003820, 0xd8e3: 0x6c26bc20, + 0xd8e6: 0x6c044220, + 0xd8e8: 0x6c26b620, + 0xd8ee: 0x6c26b820, + 0xd8f1: 0x6c102620, 0xd8f2: 0x6c26b420, 0xd8f3: 0x6c26ae20, + 0xd8f5: 0x6c024420, 0xd8f6: 0x6c0c4820, + 0xd8f9: 0x6c05f020, + 0xd8fd: 0x6c26c620, + // Block 0x364, offset 0xd900 + 0xd909: 0x6c26c020, + 0xd90f: 0x6c26c420, + 0xd913: 0x6c26be20, + 0xd919: 0x6c058620, 0xd91a: 0x6c0d5e20, 0xd91b: 0x6c26c820, + 0xd91c: 0x6c0d1820, 0xd91f: 0x6c26e220, + 0xd922: 0x6c26da20, 0xd923: 0x6c26ce20, + 0xd92b: 0x6c26d620, + 0xd92c: 0x6c098420, 0xd92d: 0x6c007a20, 0xd92e: 0x6c26cc20, 0xd92f: 0x6c26dc20, + 0xd930: 0x6c26e420, 0xd931: 0x6c06f220, 0xd932: 0x6c14fc20, + 0xd934: 0x6c0f1c20, 0xd935: 0x6c26d020, + 0xd938: 0x6c26e020, 0xd93a: 0x6c26ca20, 0xd93b: 0x6c0e3020, + 0xd93d: 0x6c26d420, 0xd93e: 0x6c003a20, 0xd93f: 0x6c14e420, + // Block 0x365, offset 0xd940 + 0xd947: 0x6c26d220, + 0xd94a: 0x6c04de20, 0xd94b: 0x6c123820, + 0xd94f: 0x6c0d1620, + 0xd951: 0x6c166820, 0xd952: 0x6c0a2a20, + 0xd955: 0x6c273220, + 0xd958: 0x6c26e620, 0xd95a: 0x6c0c7c20, + 0xd95c: 0x6c26de20, 0xd95d: 0x6c26e820, 0xd95e: 0x6c26ec20, + 0xd960: 0x6c0f6220, 0xd961: 0x6c26f220, + 0xd964: 0x6c26ea20, + 0xd968: 0x6c138020, 0xd969: 0x6c034620, + 0xd96c: 0x6c14e620, 0xd96f: 0x6c007c20, + 0xd972: 0x6c26f020, + 0xd974: 0x6c16c220, + 0xd97b: 0x6c26ee20, + // Block 0x366, offset 0xd980 + 0xd981: 0x6c015a20, + 0xd984: 0x6c10c020, 0xd985: 0x6c26f420, + 0xd989: 0x6c270220, 0xd98a: 0x6c26f620, 0xd98b: 0x6c270420, + 0xd992: 0x6c26fc20, + 0xd99b: 0x6c119a20, + 0xd99e: 0x6c092420, 0xd99f: 0x6c270020, + 0xd9a1: 0x6c26fa20, 0xd9a2: 0x6c270620, 0xd9a3: 0x6c26f820, + 0xd9a6: 0x6c09d420, + 0xd9ab: 0x6c13de20, + 0xd9ae: 0x6c09e420, + 0xd9b1: 0x6c26fe20, 0xd9b2: 0x6c271620, + 0xd9b5: 0x6c270e20, 0xd9b7: 0x6c271420, + 0xd9b9: 0x6c271020, 0xd9ba: 0x6c271820, 0xd9bb: 0x6c270c20, + 0xd9bd: 0x6c26d820, 0xd9be: 0x6c0c2620, + // Block 0x367, offset 0xd9c0 + 0xd9c1: 0x6c11f620, 0xd9c3: 0x6c271220, + 0xd9c6: 0x6c270820, + 0xd9ca: 0x6c0c7e20, 0xd9cb: 0x6c058820, + 0xd9cd: 0x6c09a220, + 0xd9d4: 0x6c0b0e20, 0xd9d5: 0x6c0ca820, 0xd9d6: 0x6c271e20, + 0xd9d9: 0x6c272220, 0xd9da: 0x6c272420, + 0xd9dd: 0x6c271c20, 0xd9de: 0x6c272020, + 0xd9e6: 0x6c270a20, 0xd9e7: 0x6c271a20, + 0xd9e9: 0x6c272a20, 0xd9ea: 0x6c272820, + 0xd9ed: 0x6c148820, + 0xd9f0: 0x6c053a20, + 0xd9f9: 0x6c272620, 0xd9fb: 0x6c272e20, + 0xd9fc: 0x6c272c20, 0xd9fd: 0x6c273420, 0xd9ff: 0x6c273820, + // Block 0x368, offset 0xda00 + 0xda02: 0x6c084c20, 0xda03: 0x6c273020, + 0xda08: 0x6c273a20, 0xda09: 0x6c273c20, + 0xda0c: 0x6c273e20, 0xda0e: 0x6c274a20, 0xda0f: 0x6c0fa220, + 0xda10: 0x6c274220, 0xda12: 0x6c274020, 0xda13: 0x6c274420, + 0xda14: 0x6c274620, 0xda16: 0x6c274820, + 0xda1b: 0x6c274c20, + 0xda1c: 0x6c274e20, + // Block 0x369, offset 0xda40 + 0xda76: 0x6c034820, + 0xda78: 0x6c275020, 0xda7a: 0x6c275220, + // Block 0x36a, offset 0xda80 + 0xda85: 0x6c275420, + 0xda8c: 0x6c275620, 0xda8d: 0x6c275820, 0xda8e: 0x6c275a20, + 0xda90: 0x6c275c20, 0xda91: 0x6c275e20, + 0xda94: 0x6c276220, 0xda95: 0x6c276020, + 0xda98: 0x6c276420, + 0xda9f: 0x6c276620, + 0xdaa0: 0x6c276820, + 0xdaa7: 0x6c276e20, + 0xdaa8: 0x6c276a20, 0xdaa9: 0x6c276c20, 0xdaaa: 0x6c07da20, 0xdaab: 0x6c058a20, + 0xdaae: 0x6c0e6020, + 0xdab0: 0x6c11c620, 0xdab2: 0x6c0a2c20, + 0xdab5: 0x6c113e20, 0xdab7: 0x6c123a20, + 0xdab8: 0x6c277020, 0xdab9: 0x6c1da420, + // Block 0x36b, offset 0xdac0 + 0xdac2: 0x6c277220, 0xdac3: 0x6c277620, + 0xdac5: 0x6c15d620, 0xdac6: 0x6c277420, 0xdac7: 0x6c277a20, + 0xdac8: 0x6c277820, 0xdaca: 0x6c15b220, + 0xdacc: 0x6c277c20, 0xdace: 0x6c125c20, + 0xdad4: 0x6c277e20, + 0xdada: 0x6c278420, + 0xdadd: 0x6c278220, 0xdade: 0x6c278020, + 0xdae3: 0x6c278620, + 0xdae4: 0x6c054820, + 0xdae8: 0x6c0c8020, 0xdae9: 0x6c03ee20, + 0xdaee: 0x6c278e20, 0xdaef: 0x6c278820, + 0xdaf2: 0x6c278a20, + 0xdaf6: 0x6c279020, + 0xdaf8: 0x6c279220, 0xdaf9: 0x6c278c20, + 0xdafd: 0x6c00ce20, + // Block 0x36c, offset 0xdb00 + 0xdb01: 0x6c018620, + 0xdb05: 0x6c279620, 0xdb06: 0x6c279820, + 0xdb0a: 0x6c279a20, + 0xdb0c: 0x6c15d020, + 0xdb12: 0x6c09a420, + 0xdb14: 0x6c279e20, 0xdb15: 0x6c279c20, + 0xdb20: 0x6c0b9620, 0xdb21: 0x6c27a020, + 0xdb26: 0x6c27a220, + 0xdb29: 0x6c27a420, 0xdb2b: 0x6c037a20, + 0xdb30: 0x6c034a20, 0xdb33: 0x6c27a620, + 0xdb39: 0x6c27a820, 0xdb3b: 0x6c144e20, + 0xdb3c: 0x6c15d220, + // Block 0x36d, offset 0xdb40 + 0xdb40: 0x6c15b420, 0xdb41: 0x6c16f220, 0xdb43: 0x6c06f620, + 0xdb44: 0x6c27ae20, 0xdb45: 0x6c093820, 0xdb46: 0x6c27ac20, + 0xdb4b: 0x6c27b020, + 0xdb4c: 0x6c08e220, + 0xdb50: 0x6c0d9a20, 0xdb52: 0x6c27b220, + 0xdb55: 0x6c06f420, 0xdb57: 0x6c14fe20, + 0xdb58: 0x6c27b420, 0xdb59: 0x6c27b620, + 0xdb5c: 0x6c27b820, + 0xdb61: 0x6c27ba20, + 0xdb68: 0x6c27bc20, + 0xdb73: 0x6c08e420, + 0xdb76: 0x6c152a20, + 0xdb7b: 0x6c27c020, + 0xdb7d: 0x6c0e3220, 0xdb7f: 0x6c27be20, + // Block 0x36e, offset 0xdb80 + 0xdb86: 0x6c27c420, + 0xdb8a: 0x6c27c220, + 0xdb92: 0x6c27c620, + 0xdb96: 0x6c0bf620, + 0xdb98: 0x6c27c820, 0xdb9a: 0x6c27ca20, + 0xdb9e: 0x6c134a20, 0xdb9f: 0x6c27cc20, + 0xdba1: 0x6c0d1a20, 0xdba2: 0x6c27ce20, + 0xdba8: 0x6c27d020, + 0xdbaf: 0x6c16c420, + 0xdbb0: 0x6c27d620, 0xdbb2: 0x6c27d420, 0xdbb3: 0x6c27d220, + 0xdbb4: 0x6c0ed020, 0xdbb6: 0x6c27d820, 0xdbb7: 0x6c0b1020, + 0xdbb9: 0x6c27da20, + 0xdbbd: 0x6c27dc20, 0xdbbe: 0x6c16f420, 0xdbbf: 0x6c27de20, + // Block 0x36f, offset 0xdbc0 + 0xdbc4: 0x6c27e020, 0xdbc5: 0x6c27e420, 0xdbc6: 0x6c27e220, 0xdbc7: 0x6c11aa20, + 0xdbc9: 0x6c10da20, 0xdbcb: 0x6c170020, + 0xdbcc: 0x6c11b220, + 0xdbd3: 0x6c27e820, + 0xdbd6: 0x6c0aae20, + 0xdbd8: 0x6c127020, 0xdbda: 0x6c27ea20, 0xdbdb: 0x6c27e620, + 0xdbdd: 0x6c034c20, + 0xdbe1: 0x6c064820, 0xdbe2: 0x6c08a420, + 0xdbe5: 0x6c123c20, + 0xdbe9: 0x6c05f420, 0xdbea: 0x6c141a20, + 0xdbec: 0x6c27f020, 0xdbed: 0x6c27ec20, 0xdbef: 0x6c06f820, + 0xdbf1: 0x6c06fa20, 0xdbf2: 0x6c009220, + 0xdbf4: 0x6c07e820, + 0xdbfa: 0x6c115620, + // Block 0x370, offset 0xdc00 + 0xdc03: 0x6c007e20, + 0xdc04: 0x6c27fa20, 0xdc06: 0x6c0e3420, + 0xdc0c: 0x6c115420, 0xdc0e: 0x6c0dae20, + 0xdc16: 0x6c27fe20, + 0xdc19: 0x6c27f620, 0xdc1a: 0x6c27fc20, 0xdc1b: 0x6c27f220, + 0xdc1d: 0x6c27f820, 0xdc1e: 0x6c13e020, + 0xdc21: 0x6c064a20, + 0xdc24: 0x6c00ba20, 0xdc25: 0x6c27f420, + 0xdc2f: 0x6c280220, + 0xdc31: 0x6c280420, + 0xdc34: 0x6c105a20, + 0xdc38: 0x6c049e20, + 0xdc3c: 0x6c281a20, 0xdc3d: 0x6c111e20, + // Block 0x371, offset 0xdc40 + 0xdc42: 0x6c08a620, + 0xdc45: 0x6c04a020, 0xdc46: 0x6c0c1020, 0xdc47: 0x6c171020, + 0xdc48: 0x6c14ac20, 0xdc49: 0x6c280020, 0xdc4a: 0x6c0c2820, + 0xdc5a: 0x6c041220, 0xdc5b: 0x6c280620, + 0xdc63: 0x6c280a20, + 0xdc69: 0x6c280820, + 0xdc6f: 0x6c280c20, + 0xdc71: 0x6c0e0020, 0xdc73: 0x6c112020, + 0xdc79: 0x6c0ed220, + 0xdc7e: 0x6c281420, + // Block 0x372, offset 0xdc80 + 0xdc86: 0x6c281220, + 0xdc8b: 0x6c280e20, + 0xdc8e: 0x6c0b6e20, + 0xdc90: 0x6c12e620, 0xdc91: 0x6c281820, 0xdc93: 0x6c281620, + 0xdc94: 0x6c06fc20, 0xdc95: 0x6c172a20, + 0xdc9f: 0x6c283820, + 0xdca5: 0x6c282020, 0xdca6: 0x6c282220, + 0xdcab: 0x6c097020, + 0xdcae: 0x6c281e20, + 0xdcb0: 0x6c074c20, 0xdcb1: 0x6c281c20, + 0xdcb4: 0x6c282420, + 0xdcb8: 0x6c0ed420, 0xdcb9: 0x6c131c20, 0xdcba: 0x6c0c8220, + 0xdcbf: 0x6c0db020, + // Block 0x373, offset 0xdcc0 + 0xdcc0: 0x6c282c20, 0xdcc2: 0x6c282e20, 0xdcc3: 0x6c282620, + 0xdcc8: 0x6c282820, 0xdcca: 0x6c282a20, + 0xdccf: 0x6c06fe20, + 0xdcd3: 0x6c283a20, + 0xdcd5: 0x6c283220, + 0xdcda: 0x6c12e820, + 0xdcdc: 0x6c146c20, 0xdcdd: 0x6c126c20, + 0xdce0: 0x6c283020, 0xdce3: 0x6c283620, + 0xdce4: 0x6c283420, + 0xdce8: 0x6c141c20, 0xdce9: 0x6c283c20, + 0xdcf0: 0x6c283e20, 0xdcf3: 0x6c0caa20, + 0xdcf5: 0x6c284020, + 0xdcf8: 0x6c284420, 0xdcfa: 0x6c284c20, + 0xdcfd: 0x6c284620, 0xdcfe: 0x6c284220, 0xdcff: 0x6c112220, + // Block 0x374, offset 0xdd00 + 0xdd00: 0x6c284820, 0xdd02: 0x6c284a20, + 0xdd06: 0x6c019c20, + 0xdd08: 0x6c285820, 0xdd09: 0x6c284e20, + 0xdd0d: 0x6c285020, + 0xdd11: 0x6c285220, 0xdd13: 0x6c0d3a20, + 0xdd18: 0x6c285620, 0xdd19: 0x6c285420, 0xdd1a: 0x6c285a20, + 0xdd1f: 0x6c285c20, + 0xdd20: 0x6c285e20, 0xdd23: 0x6c0b4a20, + 0xdd25: 0x6c020a20, 0xdd27: 0x6c286020, + 0xdd28: 0x6c167620, 0xdd2a: 0x6c08e620, + 0xdd2d: 0x6c09a620, + 0xdd33: 0x6c08a820, + 0xdd34: 0x6c0e6220, + 0xdd3a: 0x6c286220, 0xdd3b: 0x6c286420, + 0xdd3c: 0x6c00de20, 0xdd3e: 0x6c286620, + // Block 0x375, offset 0xdd40 + 0xdd41: 0x6c286820, 0xdd42: 0x6c286a20, + 0xdd45: 0x6c286c20, 0xdd47: 0x6c286e20, + 0xdd48: 0x6c04a220, 0xdd49: 0x6c1e9620, 0xdd4a: 0x6c287020, + 0xdd4c: 0x6c0c4a20, 0xdd4d: 0x6c287220, 0xdd4e: 0x6c092620, + 0xdd50: 0x6c287420, 0xdd52: 0x6c174a20, + 0xdd56: 0x6c287620, 0xdd57: 0x6c139420, + 0xdd58: 0x6c036820, 0xdd5b: 0x6c0c8420, + 0xdd5c: 0x6c09fc20, 0xdd5e: 0x6c12fe20, 0xdd5f: 0x6c09a820, + 0xdd69: 0x6c287820, 0xdd6a: 0x6c070020, 0xdd6b: 0x6c287a20, + 0xdd6c: 0x6c11f820, 0xdd6e: 0x6c289620, + 0xdd73: 0x6c287e20, + 0xdd75: 0x6c0d8a20, 0xdd76: 0x6c118e20, 0xdd77: 0x6c061e20, + 0xdd78: 0x6c287c20, 0xdd79: 0x6c0c8620, + // Block 0x376, offset 0xdd80 + 0xdd80: 0x6c288020, + 0xdd87: 0x6c0f6420, + 0xdd98: 0x6c288420, 0xdd99: 0x6c288220, 0xdd9a: 0x6c288820, + 0xdd9d: 0x6c288620, 0xdd9f: 0x6c288a20, + 0xdda2: 0x6c288e20, + 0xdda4: 0x6c288c20, 0xdda6: 0x6c034e20, + 0xdda8: 0x6c289020, 0xddaa: 0x6c289220, 0xddab: 0x6c289420, + 0xddae: 0x6c077a20, 0xddaf: 0x6c165a20, + 0xddb1: 0x6c289820, 0xddb2: 0x6c0b1220, + 0xddb6: 0x6c015c20, 0xddb7: 0x6c289a20, + 0xddb8: 0x6c289c20, + 0xddbe: 0x6c289e20, + // Block 0x377, offset 0xddc0 + 0xddcb: 0x6c00a420, + 0xddcd: 0x6c28a020, + 0xddd2: 0x6c28a220, + 0xddd9: 0x6c12ea20, + 0xdddd: 0x6c091e20, 0xdddf: 0x6c28a620, + 0xdde5: 0x6c024620, 0xdde6: 0x6c002420, + 0xddeb: 0x6c28a420, + 0xddec: 0x6c28aa20, 0xdded: 0x6c114020, 0xddef: 0x6c0b4c20, + 0xddf1: 0x6c01e420, 0xddf3: 0x6c13e220, + 0xddf8: 0x6c059e20, 0xddf9: 0x6c04e020, 0xddfb: 0x6c28a820, + 0xddfd: 0x6c020c20, + // Block 0x378, offset 0xde00 + 0xde05: 0x6c02f620, + 0xde11: 0x6c015e20, 0xde12: 0x6c28b220, 0xde13: 0x6c169c20, + 0xde14: 0x6c0db220, 0xde17: 0x6c12a420, + 0xde19: 0x6c28ca20, 0xde1b: 0x6c01e620, + 0xde1c: 0x6c28c620, 0xde1e: 0x6c28c220, 0xde1f: 0x6c28b020, + 0xde21: 0x6c28ac20, 0xde23: 0x6c28ae20, + 0xde25: 0x6c095620, 0xde26: 0x6c050020, 0xde27: 0x6c0ea220, + 0xde2b: 0x6c108a20, + 0xde31: 0x6c011e20, 0xde33: 0x6c28b620, + 0xde34: 0x6c28b420, + 0xde39: 0x6c28c020, 0xde3a: 0x6c28b820, 0xde3b: 0x6c28be20, + // Block 0x379, offset 0xde40 + 0xde42: 0x6c14f020, 0xde43: 0x6c28bc20, + 0xde44: 0x6c01e820, 0xde45: 0x6c02ee20, 0xde46: 0x6c28c420, + 0xde49: 0x6c28c820, + 0xde4e: 0x6c058c20, + 0xde56: 0x6c28d020, 0xde57: 0x6c28e220, + 0xde58: 0x6c28e420, + 0xde5c: 0x6c001620, + 0xde63: 0x6c28f220, + 0xde68: 0x6c00a220, 0xde6b: 0x6c28e020, + 0xde6f: 0x6c28de20, + 0xde71: 0x6c28d420, 0xde72: 0x6c28d220, + 0xde74: 0x6c28ce20, 0xde75: 0x6c28cc20, 0xde76: 0x6c0e7a20, + 0xde78: 0x6c0dee20, 0xde79: 0x6c28d820, + // Block 0x37a, offset 0xde80 + 0xde80: 0x6c28d620, + 0xde85: 0x6c28dc20, + 0xde89: 0x6c0d1c20, 0xde8a: 0x6c058e20, + 0xde8f: 0x6c00fe20, + 0xde90: 0x6c28da20, 0xde92: 0x6c070220, + 0xde98: 0x6c0d1e20, + 0xdeb3: 0x6c28fe20, + 0xdeb5: 0x6c290020, 0xdeb7: 0x6c01ea20, + 0xdebb: 0x6c019420, + 0xdebc: 0x6c28fa20, + // Block 0x37b, offset 0xdec0 + 0xdec5: 0x6c28e620, 0xdec7: 0x6c28f620, + 0xdec9: 0x6c290420, 0xdeca: 0x6c28f820, + 0xdece: 0x6c28f420, + 0xded3: 0x6c28ba20, + 0xded6: 0x6c28f020, + 0xdeda: 0x6c28e820, + 0xdede: 0x6c035020, 0xdedf: 0x6c28ec20, + 0xdee0: 0x6c290220, 0xdee2: 0x6c28ee20, + 0xdee8: 0x6c290620, 0xdeea: 0x6c28ea20, 0xdeeb: 0x6c119c20, + 0xdef1: 0x6c15de20, + 0xdef5: 0x6c28fc20, + 0xdefd: 0x6c292820, + // Block 0x37c, offset 0xdf00 + 0xdf01: 0x6c291820, + 0xdf05: 0x6c0bba20, + 0xdf0a: 0x6c03f820, + 0xdf0c: 0x6c04e220, 0xdf0e: 0x6c290e20, + 0xdf13: 0x6c01ee20, + 0xdf16: 0x6c0ab020, + 0xdf18: 0x6c291420, + 0xdf1c: 0x6c07cc20, 0xdf1f: 0x6c0fce20, + 0xdf20: 0x6c291e20, + 0xdf29: 0x6c13b420, 0xdf2b: 0x6c290c20, + 0xdf2f: 0x6c01ec20, + 0xdf30: 0x6c064c20, 0xdf31: 0x6c126e20, 0xdf32: 0x6c292020, + 0xdf34: 0x6c290820, 0xdf37: 0x6c291a20, + 0xdf3b: 0x6c292e20, + 0xdf3d: 0x6c291020, + // Block 0x37d, offset 0xdf40 + 0xdf43: 0x6c291220, + 0xdf44: 0x6c105c20, 0xdf47: 0x6c291c20, + 0xdf4b: 0x6c291620, + 0xdf4c: 0x6c13e420, 0xdf4d: 0x6c292220, 0xdf4e: 0x6c008020, + 0xdf53: 0x6c290a20, + 0xdf60: 0x6c292620, 0xdf62: 0x6c292420, + 0xdf69: 0x6c117a20, 0xdf6a: 0x6c293220, + 0xdf6c: 0x6c294820, + 0xdf71: 0x6c02f020, + 0xdf75: 0x6c294e20, + 0xdf78: 0x6c292a20, + 0xdf7c: 0x6c293420, 0xdf7d: 0x6c15e820, + // Block 0x37e, offset 0xdf80 + 0xdf86: 0x6c294620, + 0xdf89: 0x6c15b620, + 0xdf8e: 0x6c161c20, + 0xdf97: 0x6c0ea420, + 0xdf9b: 0x6c02ca20, + 0xdfa1: 0x6c130020, 0xdfa2: 0x6c295220, 0xdfa3: 0x6c102a20, + 0xdfa6: 0x6c002220, + 0xdfa9: 0x6c294420, 0xdfab: 0x6c293c20, + 0xdfac: 0x6c0d2020, 0xdfad: 0x6c293020, 0xdfae: 0x6c294020, 0xdfaf: 0x6c294a20, + 0xdfb1: 0x6c10fc20, + 0xdfb5: 0x6c001420, 0xdfb7: 0x6c293a20, + 0xdfb9: 0x6c294c20, 0xdfba: 0x6c130c20, + // Block 0x37f, offset 0xdfc0 + 0xdfc2: 0x6c294220, + 0xdfc4: 0x6c293820, + 0xdfcb: 0x6c0ab220, + 0xdfd0: 0x6c09aa20, + 0xdfd4: 0x6c08e820, + 0xdfd9: 0x6c150020, + 0xdfdc: 0x6c12aa20, 0xdfdf: 0x6c295820, + 0xdfe1: 0x6c296a20, + 0xdfed: 0x6c293e20, + 0xdff2: 0x6c02e220, + 0xdff8: 0x6c0af820, 0xdff9: 0x6c295420, 0xdffb: 0x6c295e20, + 0xdffc: 0x6c0d2220, 0xdfff: 0x6c295620, + // Block 0x380, offset 0xe000 + 0xe001: 0x6c296420, + 0xe004: 0x6c0e7220, 0xe006: 0x6c296620, + 0xe009: 0x6c15b820, 0xe00a: 0x6c295020, 0xe00b: 0x6c026420, + 0xe00d: 0x6c295c20, + 0xe010: 0x6c296220, 0xe011: 0x6c14a820, + 0xe016: 0x6c296820, + 0xe019: 0x6c295a20, 0xe01a: 0x6c296020, + 0xe02c: 0x6c13e620, 0xe02e: 0x6c16c620, + 0xe034: 0x6c297020, + 0xe03c: 0x6c297e20, 0xe03f: 0x6c296e20, + // Block 0x381, offset 0xe040 + 0xe040: 0x6c091620, + 0xe046: 0x6c292c20, + 0xe051: 0x6c137420, 0xe053: 0x6c149420, + 0xe054: 0x6c297c20, 0xe055: 0x6c297a20, 0xe057: 0x6c297220, + 0xe058: 0x6c297420, 0xe05a: 0x6c00e820, + 0xe05f: 0x6c297820, + 0xe061: 0x6c296c20, + 0xe066: 0x6c0f1a20, + 0xe06c: 0x6c297620, 0xe06d: 0x6c00bc20, + 0xe075: 0x6c0d3c20, + 0xe07d: 0x6c135e20, + // Block 0x382, offset 0xe080 + 0xe080: 0x6c298020, 0xe081: 0x6c298820, 0xe083: 0x6c121220, + 0xe088: 0x6c298620, 0xe089: 0x6c0ab420, 0xe08a: 0x6c092220, 0xe08b: 0x6c298c20, + 0xe08e: 0x6c04a420, + 0xe095: 0x6c298e20, 0xe097: 0x6c130e20, + 0xe098: 0x6c298420, 0xe09a: 0x6c293620, + 0xe0a3: 0x6c298220, + 0xe0a8: 0x6c172220, 0xe0a9: 0x6c102c20, 0xe0aa: 0x6c130220, + 0xe0ad: 0x6c299c20, + 0xe0b7: 0x6c29a820, + 0xe0be: 0x6c29aa20, + // Block 0x383, offset 0xe0c0 + 0xe0c0: 0x6c299020, + 0xe0c4: 0x6c119020, 0xe0c7: 0x6c29a420, + 0xe0c8: 0x6c299420, 0xe0ca: 0x6c299820, + 0xe0d0: 0x6c29ac20, 0xe0d1: 0x6c299620, + 0xe0d4: 0x6c299e20, 0xe0d7: 0x6c016020, + 0xe0d9: 0x6c10b220, 0xe0db: 0x6c29a020, + 0xe0dc: 0x6c29a620, + 0xe0e4: 0x6c299220, 0xe0e6: 0x6c0c8820, + 0xe0e8: 0x6c299a20, 0xe0e9: 0x6c082220, 0xe0ea: 0x6c0b4e20, 0xe0eb: 0x6c054420, + 0xe0ec: 0x6c153820, 0xe0ee: 0x6c154220, 0xe0ef: 0x6c0a3020, + 0xe0f9: 0x6c29b420, 0xe0fa: 0x6c29b020, + // Block 0x384, offset 0xe100 + 0xe101: 0x6c172020, + 0xe109: 0x6c29ae20, + 0xe10d: 0x6c15f620, 0xe10f: 0x6c29b220, + 0xe110: 0x6c29b620, + 0xe115: 0x6c29b820, + 0xe11c: 0x6c29be20, 0xe11d: 0x6c29ba20, + 0xe124: 0x6c102e20, 0xe125: 0x6c29bc20, + 0xe129: 0x6c11fa20, 0xe12a: 0x6c29a220, + 0xe137: 0x6c0a3220, + 0xe139: 0x6c29c020, 0xe13a: 0x6c29ca20, 0xe13b: 0x6c0d2420, + 0xe13e: 0x6c29c820, + // Block 0x385, offset 0xe140 + 0xe142: 0x6c298a20, + 0xe146: 0x6c29cc20, 0xe147: 0x6c0cce20, + 0xe14a: 0x6c29c220, 0xe14b: 0x6c29c620, + 0xe153: 0x6c29c420, + 0xe156: 0x6c20d820, 0xe157: 0x6c20ba20, + 0xe15a: 0x6c29d020, + 0xe162: 0x6c29ce20, + 0xe16d: 0x6c15f820, 0xe16f: 0x6c249a20, + 0xe170: 0x6c29d220, + 0xe17f: 0x6c29d420, + // Block 0x386, offset 0xe180 + 0xe18d: 0x6c29d620, 0xe18e: 0x6c064e20, + 0xe190: 0x6c041420, + 0xe194: 0x6c29da20, 0xe195: 0x6c186020, + 0xe19a: 0x6c045620, + 0xe19c: 0x6c163c20, 0xe19e: 0x6c050e20, 0xe19f: 0x6c29dc20, + 0xe1a7: 0x6c29de20, + 0xe1ab: 0x6c0e9020, + 0xe1b1: 0x6c29e020, + 0xe1b9: 0x6c10dc20, 0xe1bb: 0x6c003420, + // Block 0x387, offset 0xe1c0 + 0xe1ca: 0x6c01fe20, 0xe1cb: 0x6c29ea20, + 0xe1cc: 0x6c29ec20, + 0xe1d3: 0x6c29e220, + 0xe1d5: 0x6c084e20, + 0xe1e3: 0x6c29e420, + 0xe1e4: 0x6c112820, + 0xe1e9: 0x6c29e620, 0xe1ea: 0x6c29e820, 0xe1eb: 0x6c29fc20, + 0xe1ef: 0x6c29f020, + 0xe1f0: 0x6c29f620, + 0xe1f6: 0x6c29ee20, + // Block 0x388, offset 0xe200 + 0xe204: 0x6c29f220, 0xe206: 0x6c29f420, 0xe207: 0x6c094020, + 0xe209: 0x6c29f820, 0xe20b: 0x6c0e3620, + 0xe20d: 0x6c059020, 0xe20e: 0x6c027820, + 0xe214: 0x6c29fe20, + 0xe219: 0x6c027220, 0xe21b: 0x6c2a0820, + 0xe21e: 0x6c2a0020, 0xe21f: 0x6c2a0620, + 0xe224: 0x6c11d420, + 0xe229: 0x6c2a0220, + 0xe22c: 0x6c2a0420, 0xe22d: 0x6c12ac20, 0xe22e: 0x6c121420, 0xe22f: 0x6c2a0a20, + 0xe238: 0x6c0df220, 0xe239: 0x6c2a1e20, 0xe23b: 0x6c2a1620, + 0xe23e: 0x6c020e20, + // Block 0x389, offset 0xe240 + 0xe240: 0x6c2a1220, 0xe242: 0x6c13e820, 0xe243: 0x6c2a1420, + 0xe246: 0x6c2a0e20, + 0xe248: 0x6c2a1020, 0xe249: 0x6c2a1a20, 0xe24a: 0x6c2a2020, + 0xe24d: 0x6c2a1c20, + 0xe251: 0x6c2a1820, 0xe252: 0x6c2a0c20, + 0xe258: 0x6c0e6420, 0xe25a: 0x6c2a2e20, + 0xe25c: 0x6c14a420, + 0xe265: 0x6c2a2a20, + 0xe269: 0x6c2a2c20, + 0xe274: 0x6c2a2220, 0xe277: 0x6c2a2620, + 0xe27b: 0x6c2a2820, + 0xe27f: 0x6c2a2420, + // Block 0x38a, offset 0xe280 + 0xe289: 0x6c0c4c20, 0xe28b: 0x6c16f620, + 0xe28c: 0x6c2a3620, 0xe28e: 0x6c2a3820, + 0xe293: 0x6c2a4420, + 0xe295: 0x6c0b1820, 0xe297: 0x6c2a3c20, + 0xe299: 0x6c2a4220, + 0xe29f: 0x6c2a3220, + 0xe2a0: 0x6c2a3020, 0xe2a3: 0x6c2a4620, + 0xe2a6: 0x6c01f020, + 0xe2a8: 0x6c2a3e20, 0xe2aa: 0x6c2a4820, + 0xe2ae: 0x6c2a4020, + 0xe2b4: 0x6c2a3a20, 0xe2b6: 0x6c0ed620, + 0xe2b8: 0x6c2a3420, + 0xe2bf: 0x6c117420, + // Block 0x38b, offset 0xe2c0 + 0xe2c2: 0x6c2a5020, + 0xe2cd: 0x6c158220, + 0xe2df: 0x6c2a4e20, + 0xe2e2: 0x6c2a4c20, + 0xe2eb: 0x6c2a5e20, + 0xe2ef: 0x6c2a5220, + 0xe2f3: 0x6c2a6220, + 0xe2fa: 0x6c15d820, 0xe2fb: 0x6c2a6820, + 0xe2fd: 0x6c2a5620, + // Block 0x38c, offset 0xe300 + 0xe300: 0x6c2a5820, + 0xe304: 0x6c2a6020, 0xe306: 0x6c2a6620, 0xe307: 0x6c2a6420, + 0xe30b: 0x6c2a5420, + 0xe310: 0x6c2a5a20, 0xe312: 0x6c2a7c20, + 0xe320: 0x6c2a6e20, + 0xe32f: 0x6c2a6a20, + 0xe332: 0x6c2a6c20, + 0xe336: 0x6c2a7620, 0xe337: 0x6c2a7820, + 0xe339: 0x6c024820, 0xe33b: 0x6c03f020, + 0xe33e: 0x6c2a7420, + // Block 0x38d, offset 0xe340 + 0xe345: 0x6c2a4a20, + 0xe34d: 0x6c2a7220, 0xe34e: 0x6c2a7a20, 0xe34f: 0x6c2a7020, + 0xe351: 0x6c2a7e20, + 0xe355: 0x6c2a8220, 0xe356: 0x6c2a8020, + 0xe361: 0x6c2a8620, 0xe362: 0x6c2a8420, 0xe363: 0x6c29fa20, + 0xe367: 0x6c2a8e20, + 0xe371: 0x6c2a8820, + 0xe376: 0x6c2a8a20, + 0xe379: 0x6c2a8c20, 0xe37b: 0x6c2a9020, + // Block 0x38e, offset 0xe380 + 0xe380: 0x6c05bc20, 0xe382: 0x6c2a9420, + 0xe384: 0x6c2a9220, 0xe386: 0x6c09ac20, + 0xe38c: 0x6c070420, 0xe38d: 0x6c218020, + 0xe392: 0x6c2a9620, 0xe393: 0x6c09ee20, + 0xe397: 0x6c026620, + 0xe399: 0x6c2a9820, 0xe39b: 0x6c012020, + 0xe39d: 0x6c0ab620, 0xe39e: 0x6c2a9a20, + 0xe3a1: 0x6c070620, 0xe3a2: 0x6c2a9c20, 0xe3a3: 0x6c008220, + 0xe3a8: 0x6c129620, 0xe3ab: 0x6c2a9e20, + 0xe3b0: 0x6c0b9820, 0xe3b2: 0x6c2aac20, + 0xe3b5: 0x6c2aa620, 0xe3b7: 0x6c0e9220, + 0xe3bd: 0x6c2aa820, 0xe3be: 0x6c2aa220, 0xe3bf: 0x6c04e420, + // Block 0x38f, offset 0xe3c0 + 0xe3c1: 0x6c2aa020, 0xe3c2: 0x6c2aae20, + 0xe3c8: 0x6c055020, 0xe3cb: 0x6c0db420, + 0xe3cd: 0x6c2aba20, + 0xe3d2: 0x6c2ab220, + 0xe3d6: 0x6c0d6220, 0xe3d7: 0x6c2ab020, + 0xe3d9: 0x6c2ab620, + 0xe3de: 0x6c2aa420, + 0xe3e2: 0x6c2ab820, + 0xe3e4: 0x6c2abc20, + 0xe3eb: 0x6c123e20, + 0xe3ee: 0x6c2ab420, + 0xe3f0: 0x6c2abe20, 0xe3f1: 0x6c2ac220, + 0xe3f4: 0x6c064620, 0xe3f5: 0x6c2aaa20, 0xe3f7: 0x6c004220, + 0xe3ff: 0x6c2ac020, + // Block 0x390, offset 0xe400 + 0xe401: 0x6c07ce20, 0xe402: 0x6c16b420, 0xe403: 0x6c2ac420, + 0xe404: 0x6c2ac620, 0xe405: 0x6c0d2620, + 0xe40f: 0x6c160c20, + 0xe414: 0x6c2ac820, 0xe415: 0x6c157620, + 0xe418: 0x6c2aca20, 0xe419: 0x6c2acc20, + 0xe41c: 0x6c13a020, 0xe41d: 0x6c2ace20, 0xe41f: 0x6c079820, + 0xe421: 0x6c160e20, + 0xe428: 0x6c2ad820, + 0xe432: 0x6c2ada20, 0xe433: 0x6c0ab820, + 0xe434: 0x6c2ad620, + 0xe438: 0x6c15da20, 0xe439: 0x6c2ad020, + 0xe43c: 0x6c2ad420, 0xe43d: 0x6c0bfa20, 0xe43e: 0x6c0bc020, + // Block 0x391, offset 0xe440 + 0xe442: 0x6c2ad220, + 0xe444: 0x6c2adc20, 0xe447: 0x6c131e20, + 0xe44a: 0x6c2ae020, + 0xe44c: 0x6c2ade20, + 0xe450: 0x6c02cc20, 0xe452: 0x6c13ea20, 0xe453: 0x6c2ae220, + 0xe45d: 0x6c2afa20, 0xe45e: 0x6c2ae620, + 0xe465: 0x6c2ae820, + 0xe46a: 0x6c2aea20, 0xe46b: 0x6c2aec20, + 0xe476: 0x6c2af420, + 0xe478: 0x6c2af620, 0xe47b: 0x6c2af220, + // Block 0x392, offset 0xe480 + 0xe481: 0x6c2aee20, 0xe483: 0x6c2ae420, + 0xe484: 0x6c2af020, + 0xe48c: 0x6c2af820, 0xe48d: 0x6c2ed820, + 0xe496: 0x6c018820, + 0xe49e: 0x6c2afe20, 0xe49f: 0x6c04e620, + 0xe4a0: 0x6c2afc20, + 0xe4a4: 0x6c2b0220, 0xe4a6: 0x6c2b0020, + 0xe4aa: 0x6c2b0620, + 0xe4ad: 0x6c2b0420, 0xe4af: 0x6c2b0820, + 0xe4b2: 0x6c09ae20, + 0xe4b4: 0x6c2b0a20, 0xe4b7: 0x6c2b0c20, + 0xe4be: 0x6c2b0e20, 0xe4bf: 0x6c0bfc20, + // Block 0x393, offset 0xe4c0 + 0xe4c1: 0x6c15ba20, 0xe4c3: 0x6c2b1020, + 0xe4c6: 0x6c132020, 0xe4c7: 0x6c113020, + 0xe4c8: 0x6c2b1220, 0xe4ca: 0x6c2b1420, 0xe4cb: 0x6c05f620, + 0xe4cf: 0x6c03c420, + 0xe4d3: 0x6c2b1620, + 0xe4d6: 0x6c08aa20, 0xe4d7: 0x6c112620, + 0xe4d8: 0x6c2b1820, 0xe4da: 0x6c029420, + 0xe4e1: 0x6c2b1a20, + 0xe4e6: 0x6c2b1e20, 0xe4e7: 0x6c15fa20, + 0xe4e9: 0x6c2b1c20, 0xe4ea: 0x6c0b5020, + 0xe4ec: 0x6c2b2020, 0xe4ef: 0x6c2b2220, + 0xe4f2: 0x6c2b2420, 0xe4f3: 0x6c035220, + 0xe4fa: 0x6c2b2620, + 0xe4fd: 0x6c2b2820, 0xe4ff: 0x6c2b2a20, + // Block 0x394, offset 0xe500 + 0xe500: 0x6c2b2c20, + 0xe512: 0x6c029620, + 0xe51a: 0x6c2b2e20, + 0xe51c: 0x6c2b3020, 0xe51d: 0x6c2b3220, + 0xe523: 0x6c021c20, + 0xe526: 0x6c0b1420, 0xe527: 0x6c2b3420, + 0xe534: 0x6c2b3620, + 0xe538: 0x6c2b3820, + // Block 0x395, offset 0xe540 + 0xe540: 0x6c062020, 0xe542: 0x6c0f6620, 0xe543: 0x6c2b3a20, + 0xe548: 0x6c059220, 0xe54a: 0x6c0b7020, + 0xe54c: 0x6c2b4020, 0xe54e: 0x6c103020, + 0xe550: 0x6c2b3e20, 0xe553: 0x6c054620, + 0xe556: 0x6c2b3c20, 0xe557: 0x6c0de620, + 0xe558: 0x6c03c620, 0xe55b: 0x6c2b4220, + 0xe55d: 0x6c2b4420, 0xe55f: 0x6c0aba20, + 0xe563: 0x6c05be20, + 0xe565: 0x6c2b4620, + 0xe56a: 0x6c13ec20, + 0xe56d: 0x6c0c3e20, + 0xe571: 0x6c045820, 0xe573: 0x6c153a20, + 0xe574: 0x6c0cd020, 0xe576: 0x6c2b4820, + 0xe57a: 0x6c0b5220, 0xe57b: 0x6c0e9420, + 0xe57c: 0x6c0abc20, + // Block 0x396, offset 0xe580 + 0xe581: 0x6c2b4a20, + 0xe586: 0x6c2b5020, + 0xe588: 0x6c2b5220, + 0xe590: 0x6c079420, 0xe591: 0x6c0d7c20, 0xe592: 0x6c2b4e20, + 0xe594: 0x6c0abe20, 0xe595: 0x6c129820, + 0xe59b: 0x6c2b4c20, + 0xe59e: 0x6c08ac20, + 0xe5a0: 0x6c012220, 0xe5a2: 0x6c2b5a20, 0xe5a3: 0x6c059420, + 0xe5a6: 0x6c08b020, + 0xe5a9: 0x6c08ae20, 0xe5ab: 0x6c171e20, + 0xe5ac: 0x6c2b5820, 0xe5ad: 0x6c2b5620, 0xe5ae: 0x6c0c8a20, + 0xe5b0: 0x6c040620, 0xe5b1: 0x6c170a20, 0xe5b2: 0x6c026820, 0xe5b3: 0x6c0ac020, + 0xe5bc: 0x6c2b5420, + // Block 0x397, offset 0xe5c0 + 0xe5c2: 0x6c2b5e20, + 0xe5c4: 0x6c2b6020, 0xe5c5: 0x6c2b5c20, 0xe5c7: 0x6c065020, + 0xe5c9: 0x6c158c20, + 0xe5cc: 0x6c08b220, 0xe5cd: 0x6c10f220, + 0xe5d1: 0x6c2b6620, 0xe5d3: 0x6c0c0020, + 0xe5d5: 0x6c0e3820, + 0xe5d8: 0x6c157820, 0xe5da: 0x6c2b6c20, + 0xe5de: 0x6c067820, + 0xe5e0: 0x6c0bfe20, 0xe5e1: 0x6c2b6420, 0xe5e3: 0x6c2b6e20, + 0xe5e4: 0x6c067a20, 0xe5e5: 0x6c2b6820, 0xe5e6: 0x6c2b6a20, + 0xe5e8: 0x6c2b6220, + 0xe5ec: 0x6c0c4420, 0xe5ed: 0x6c107a20, + 0xe5f0: 0x6c0e1220, 0xe5f2: 0x6c01f220, + 0xe5f9: 0x6c124020, + 0xe5fc: 0x6c03f220, 0xe5ff: 0x6c0ed820, + // Block 0x398, offset 0xe600 + 0xe602: 0x6c2b7420, + 0xe604: 0x6c2b7020, 0xe607: 0x6c0e4c20, + 0xe60b: 0x6c0c0220, + 0xe60c: 0x6c035420, 0xe60d: 0x6c2b7220, 0xe60f: 0x6c0b7a20, + 0xe612: 0x6c165c20, + 0xe616: 0x6c170420, + 0xe61a: 0x6c2b7620, 0xe61b: 0x6c2b8c20, + 0xe61c: 0x6c0eda20, 0xe61e: 0x6c2b8a20, + 0xe620: 0x6c2b8420, 0xe621: 0x6c2b9420, 0xe622: 0x6c2b8620, + 0xe624: 0x6c2b7e20, 0xe626: 0x6c0f6820, 0xe627: 0x6c2b7c20, + 0xe62b: 0x6c2b7820, + 0xe62d: 0x6c154e20, 0xe62e: 0x6c08b420, + 0xe631: 0x6c2b8020, 0xe633: 0x6c2b7a20, + 0xe637: 0x6c2b8820, + 0xe638: 0x6c0a3420, 0xe63a: 0x6c062220, + 0xe63e: 0x6c0dec20, + // Block 0x399, offset 0xe640 + 0xe640: 0x6c141e20, 0xe641: 0x6c013020, 0xe642: 0x6c008420, + 0xe644: 0x6c103220, 0xe647: 0x6c2b9020, + 0xe64c: 0x6c2b8e20, 0xe64e: 0x6c10b420, + 0xe650: 0x6c2b9820, + 0xe654: 0x6c2b8220, 0xe656: 0x6c2b9620, 0xe657: 0x6c2b9a20, + 0xe659: 0x6c05f820, 0xe65a: 0x6c2b9220, 0xe65b: 0x6c070820, + 0xe65d: 0x6c093a20, + 0xe660: 0x6c2b9c20, 0xe661: 0x6c15bc20, + 0xe666: 0x6c2ba220, + 0xe668: 0x6c2ba820, 0xe66b: 0x6c2ba420, + 0xe66c: 0x6c128620, + 0xe673: 0x6c2b9e20, + 0xe679: 0x6c04e820, + 0xe67e: 0x6c2ba620, + // Block 0x39a, offset 0xe680 + 0xe681: 0x6c2baa20, + 0xe689: 0x6c2bb220, + 0xe68c: 0x6c2bac20, 0xe68e: 0x6c2bb020, 0xe68f: 0x6c2bae20, + 0xe696: 0x6c2bb420, + 0xe698: 0x6c08f220, 0xe69a: 0x6c2bb820, 0xe69b: 0x6c2bb620, + 0xe69c: 0x6c12ec20, 0xe69f: 0x6c2bbc20, + 0xe6a6: 0x6c059620, + 0xe6ab: 0x6c2bba20, + 0xe6ac: 0x6c2bbe20, 0xe6af: 0x6c2bc020, + 0xe6b0: 0x6c03f420, 0xe6b1: 0x6c279420, 0xe6b2: 0x6c0afa20, + 0xe6b4: 0x6c2bc220, 0xe6b7: 0x6c067c20, + 0xe6bd: 0x6c2bc420, + // Block 0x39b, offset 0xe6c0 + 0xe6c0: 0x6c2bc620, 0xe6c3: 0x6c085020, + 0xe6ca: 0x6c1ede20, + 0xe6cc: 0x6c2bc820, 0xe6ce: 0x6c2bca20, + 0xe6d0: 0x6c09b020, 0xe6d2: 0x6c2bcc20, 0xe6d3: 0x6c2bce20, + 0xe6d6: 0x6c2bd020, + 0xe6d9: 0x6c2bd220, 0xe6da: 0x6c2bd420, + // Block 0x39c, offset 0xe700 + 0xe737: 0x6c0e0a20, + 0xe73a: 0x6c2bd620, + 0xe73f: 0x6c2bda20, + // Block 0x39d, offset 0xe740 + 0xe741: 0x6c2bd820, + 0xe746: 0x6c103420, + 0xe748: 0x6c2bdc20, 0xe74a: 0x6c13ee20, + 0xe74c: 0x6c2bde20, 0xe74e: 0x6c2be020, + 0xe750: 0x6c2be220, + 0xe755: 0x6c2be420, + 0xe75a: 0x6c109c20, + 0xe761: 0x6c0ac220, 0xe762: 0x6c2be620, + 0xe76a: 0x6c073220, 0xe76b: 0x6c174620, + 0xe76c: 0x6c2be820, + 0xe778: 0x6c2bea20, 0xe779: 0x6c129a20, 0xe77a: 0x6c2bec20, + 0xe77c: 0x6c2bfc20, + // Block 0x39e, offset 0xe780 + 0xe782: 0x6c2bee20, + 0xe785: 0x6c2bf220, + 0xe789: 0x6c2bf020, 0xe78a: 0x6c2bf420, + 0xe78c: 0x6c142020, 0xe78d: 0x6c2bf620, 0xe78e: 0x6c2bf820, + 0xe794: 0x6c2bfa20, + 0xe798: 0x6c2bfe20, + 0xe79d: 0x6c024e20, 0xe79e: 0x6c0f3e20, + 0xe7a0: 0x6c12ee20, 0xe7a1: 0x6c07dc20, 0xe7a2: 0x6c070a20, + 0xe7a7: 0x6c12ba20, + 0xe7a8: 0x6c01f620, 0xe7a9: 0x6c11fc20, 0xe7aa: 0x6c2c0420, 0xe7ab: 0x6c035620, + 0xe7ac: 0x6c0c2a20, 0xe7ad: 0x6c2c0220, 0xe7ae: 0x6c2c0c20, 0xe7af: 0x6c0ea620, + 0xe7b0: 0x6c151620, 0xe7b2: 0x6c2c0820, 0xe7b3: 0x6c2c0a20, + 0xe7b4: 0x6c03c820, 0xe7b6: 0x6c2c0e20, 0xe7b7: 0x6c116a20, + 0xe7b8: 0x6c0db620, 0xe7bb: 0x6c124220, + 0xe7bc: 0x6c0fa620, 0xe7bd: 0x6c2c0620, 0xe7bf: 0x6c142220, + // Block 0x39f, offset 0xe7c0 + 0xe7c0: 0x6c021020, 0xe7c1: 0x6c2c1220, 0xe7c2: 0x6c16d420, 0xe7c3: 0x6c0ef420, + 0xe7c4: 0x6c170e20, 0xe7c7: 0x6c08b620, + 0xe7c8: 0x6c2c1020, 0xe7ca: 0x6c0d5a20, + 0xe7cd: 0x6c2c3220, 0xe7ce: 0x6c0c8c20, + 0xe7d1: 0x6c10d820, 0xe7d3: 0x6c12bc20, + 0xe7da: 0x6c2c1820, 0xe7db: 0x6c085220, + 0xe7dc: 0x6c08b820, 0xe7de: 0x6c0ac420, + 0xe7e0: 0x6c116e20, 0xe7e2: 0x6c05fa20, 0xe7e3: 0x6c2c1620, + 0xe7e4: 0x6c2c1420, 0xe7e6: 0x6c12f020, + 0xe7ea: 0x6c091220, + 0xe7ed: 0x6c0fd020, + 0xe7fa: 0x6c2c1c20, 0xe7fb: 0x6c2c1e20, + 0xe7fc: 0x6c070c20, 0xe7fd: 0x6c2c1a20, + // Block 0x3a0, offset 0xe800 + 0xe804: 0x6c2c2020, 0xe805: 0x6c2c2220, 0xe807: 0x6c2c2620, + 0xe808: 0x6c0d3e20, 0xe80a: 0x6c2c2420, 0xe80b: 0x6c037c20, + 0xe80d: 0x6c2c2a20, 0xe80f: 0x6c2c2820, + 0xe810: 0x6c2c2c20, 0xe813: 0x6c2c3020, + 0xe814: 0x6c2c3420, 0xe816: 0x6c2c3620, + // Block 0x3a1, offset 0xe840 + 0xe864: 0x6c0c2c20, 0xe866: 0x6c092e20, 0xe867: 0x6c2c3820, + 0xe86b: 0x6c029820, + 0xe86d: 0x6c2c3a20, + 0xe870: 0x6c0d2820, 0xe871: 0x6c2c3c20, 0xe873: 0x6c2c3e20, + 0xe874: 0x6c12f220, 0xe877: 0x6c03ca20, + // Block 0x3a2, offset 0xe880 + 0xe881: 0x6c2c4020, + 0xe885: 0x6c0edc20, + 0xe88a: 0x6c013220, + 0xe899: 0x6c2c4220, + 0xe8a3: 0x6c097220, + 0xe8a8: 0x6c0bb020, + 0xe8b3: 0x6c0d5220, + 0xe8ba: 0x6c2c4820, + 0xe8be: 0x6c2c4620, + // Block 0x3a3, offset 0xe8c0 + 0xe8c2: 0x6c2c4420, + 0xe8cb: 0x6c2c5420, + 0xe8cc: 0x6c2c5020, 0xe8cf: 0x6c2c4a20, + 0xe8d6: 0x6c2c4e20, + 0xe8da: 0x6c2c4c20, 0xe8db: 0x6c2c5220, + 0xe8dd: 0x6c045a20, 0xe8df: 0x6c2c5a20, + 0xe8e1: 0x6c0c2e20, 0xe8e3: 0x6c2c5c20, + 0xe8e8: 0x6c065220, 0xe8ea: 0x6c2c5620, 0xe8eb: 0x6c2c5820, + 0xe8ef: 0x6c16d620, + 0xe8f3: 0x6c0ede20, + 0xe8f5: 0x6c0c8e20, + 0xe8fc: 0x6c2c5e20, 0xe8ff: 0x6c2c6420, + // Block 0x3a4, offset 0xe900 + 0xe908: 0x6c2c6020, 0xe909: 0x6c2c6220, 0xe90a: 0x6c15be20, + 0xe90f: 0x6c103620, + 0xe910: 0x6c2c6a20, + 0xe91d: 0x6c2c6620, 0xe91e: 0x6c2c6820, 0xe91f: 0x6c2c6c20, + 0xe92a: 0x6c2c8820, + 0xe930: 0x6c2c7220, + 0xe934: 0x6c2c7420, 0xe935: 0x6c2c7020, + // Block 0x3a5, offset 0xe940 + 0xe942: 0x6c2c6e20, + 0xe944: 0x6c0f6a20, 0xe947: 0x6c2c7820, + 0xe948: 0x6c2c8020, 0xe949: 0x6c2c7a20, 0xe94a: 0x6c2c7620, + 0xe94c: 0x6c2c7c20, + 0xe950: 0x6c2c7e20, + 0xe955: 0x6c2c8c20, + 0xe959: 0x6c2c8220, + 0xe95f: 0x6c0c3020, + 0xe960: 0x6c2c8620, 0xe963: 0x6c2c8a20, + 0xe964: 0x6c2c8420, + 0xe972: 0x6c2c9020, + 0xe974: 0x6c09b220, 0xe976: 0x6c2c8e20, + 0xe97c: 0x6c2c9220, + // Block 0x3a6, offset 0xe980 + 0xe981: 0x6c2c9420, + 0xe984: 0x6c2c9a20, 0xe985: 0x6c2c9820, 0xe987: 0x6c2c9620, + 0xe98a: 0x6c2c9e20, 0xe98b: 0x6c2c9c20, + 0xe98d: 0x6c153c20, + 0xe991: 0x6c2ca220, 0xe993: 0x6c2ca020, + 0xe994: 0x6c2ca420, + 0xe999: 0x6c2ca620, + 0xe9a1: 0x6c2caa20, + 0xe9aa: 0x6c2ca820, 0xe9ab: 0x6c0b5420, + 0xe9ac: 0x6c2cac20, 0xe9af: 0x6c050220, + 0xe9b0: 0x6c2cae20, 0xe9b1: 0x6c2cb220, + 0xe9be: 0x6c2cb420, + // Block 0x3a7, offset 0xe9c0 + 0xe9c5: 0x6c2cb620, 0xe9c6: 0x6c2cb020, + 0xe9c8: 0x6c2cb820, 0xe9ca: 0x6c093c20, 0xe9cb: 0x6c2cba20, + 0xe9cc: 0x6c03cc20, 0xe9cd: 0x6c054a20, + 0xe9d2: 0x6c05fc20, + 0xe9db: 0x6c2cbc20, + 0xe9df: 0x6c10c820, + 0xe9e2: 0x6c0fa820, 0xe9e3: 0x6c2cbe20, + 0xe9eb: 0x6c2cc420, + 0xe9f8: 0x6c08f820, 0xe9fb: 0x6c2cc220, + 0xe9fc: 0x6c2cc020, 0xe9fd: 0x6c059820, 0xe9fe: 0x6c2cc620, + // Block 0x3a8, offset 0xea00 + 0xea03: 0x6c029a20, + 0xea05: 0x6c2cca20, + 0xea09: 0x6c07d020, 0xea0a: 0x6c2cc820, + 0xea0c: 0x6c2cda20, + 0xea12: 0x6c2cce20, 0xea13: 0x6c2cd220, + 0xea14: 0x6c13a220, 0xea15: 0x6c2ccc20, + 0xea19: 0x6c2cd020, 0xea1b: 0x6c2cd820, + 0xea1c: 0x6c2cd420, 0xea1d: 0x6c03ce20, 0xea1f: 0x6c2cd620, + 0xea26: 0x6c2cdc20, + 0xea29: 0x6c115820, 0xea2a: 0x6c167820, + 0xea2f: 0x6c09b420, + 0xea33: 0x6c2cde20, + 0xea38: 0x6c155020, 0xea39: 0x6c2ce220, 0xea3b: 0x6c2ce020, + 0xea3e: 0x6c2ce820, 0xea3f: 0x6c158e20, + // Block 0x3a9, offset 0xea40 + 0xea42: 0x6c2ce620, + 0xea44: 0x6c02ce20, 0xea45: 0x6c2ce420, 0xea46: 0x6c2cee20, + 0xea49: 0x6c2cec20, + 0xea4c: 0x6c2cea20, 0xea4d: 0x6c0f9020, 0xea4e: 0x6c2cf020, + 0xea57: 0x6c2cf220, + 0xea5c: 0x6c2cf420, 0xea5f: 0x6c073420, + 0xea61: 0x6c052e20, 0xea62: 0x6c2cf620, 0xea63: 0x6c2cf820, + 0xea64: 0x6c2cfa20, + // Block 0x3aa, offset 0xea80 + 0xea9b: 0x6c0b5620, + 0xea9c: 0x6c2cfc20, 0xea9e: 0x6c08ea20, 0xea9f: 0x6c2cfe20, + 0xeaa3: 0x6c2d0020, + 0xeaa7: 0x6c18a420, + 0xeaa8: 0x6c18a220, + 0xeaad: 0x6c2d0220, 0xeaae: 0x6c273620, 0xeaaf: 0x6c2d0420, + 0xeab0: 0x6c0dfc20, 0xeab1: 0x6c0b1a20, 0xeab2: 0x6c112420, + 0xeab7: 0x6c2d0620, + 0xeaba: 0x6c138220, 0xeabb: 0x6c0f1820, + 0xeabc: 0x6c075820, 0xeabf: 0x6c0e0620, + // Block 0x3ab, offset 0xeac0 + 0xeac2: 0x6c00d020, + 0xeac4: 0x6c148420, 0xeac5: 0x6c0b7220, + 0xeace: 0x6c05a020, + 0xead1: 0x6c04ea20, + 0xead4: 0x6c138420, + 0xeada: 0x6c2d0820, + 0xeae2: 0x6c2d0c20, + 0xeae5: 0x6c2d0a20, 0xeae6: 0x6c01f820, + 0xeae9: 0x6c10d420, 0xeaea: 0x6c2d0e20, 0xeaeb: 0x6c119220, + 0xeaed: 0x6c0f9220, 0xeaef: 0x6c2d1020, + 0xeaf0: 0x6c09f020, + 0xeaf4: 0x6c2d1420, 0xeaf7: 0x6c14d420, + 0xeaf8: 0x6c2d3220, 0xeaf9: 0x6c2d1820, 0xeafa: 0x6c2d1a20, + 0xeafd: 0x6c0f0220, + // Block 0x3ac, offset 0xeb00 + 0xeb00: 0x6c0db820, 0xeb01: 0x6c0d2a20, 0xeb03: 0x6c103820, + 0xeb05: 0x6c2d1620, 0xeb06: 0x6c041620, + 0xeb0b: 0x6c2d2820, + 0xeb0d: 0x6c2d2220, 0xeb0e: 0x6c2d3c20, 0xeb0f: 0x6c103a20, + 0xeb10: 0x6c0e7420, 0xeb11: 0x6c2d1c20, 0xeb13: 0x6c0f6c20, + 0xeb14: 0x6c0fd220, 0xeb15: 0x6c2d1e20, 0xeb16: 0x6c2d2620, 0xeb17: 0x6c0b8420, + 0xeb19: 0x6c117220, 0xeb1a: 0x6c0f0820, + 0xeb1d: 0x6c0c0420, 0xeb1e: 0x6c2d2420, 0xeb1f: 0x6c0d5420, + 0xeb20: 0x6c0d4020, 0xeb21: 0x6c2d2020, 0xeb22: 0x6c001220, 0xeb23: 0x6c16c820, + 0xeb27: 0x6c2d2a20, + 0xeb2e: 0x6c0dba20, + 0xeb31: 0x6c09b620, 0xeb32: 0x6c0b5820, + 0xeb35: 0x6c2d2e20, 0xeb36: 0x6c2d2c20, + 0xeb38: 0x6c009e20, 0xeb39: 0x6c2d3020, + 0xeb3c: 0x6c127a20, 0xeb3e: 0x6c2d4020, + // Block 0x3ad, offset 0xeb40 + 0xeb41: 0x6c109e20, 0xeb42: 0x6c0b9a20, + 0xeb45: 0x6c0e6620, 0xeb47: 0x6c051820, + 0xeb49: 0x6c2d3e20, 0xeb4a: 0x6c157a20, 0xeb4b: 0x6c00fa20, + 0xeb4d: 0x6c138620, 0xeb4e: 0x6c01fa20, 0xeb4f: 0x6c2d3420, + 0xeb50: 0x6c2d3620, 0xeb51: 0x6c2d3820, 0xeb52: 0x6c2d3a20, 0xeb53: 0x6c105e20, + 0xeb54: 0x6c0dfa20, 0xeb55: 0x6c008620, 0xeb56: 0x6c2d4220, + 0xeb58: 0x6c2d4420, 0xeb59: 0x6c31a020, + 0xeb5c: 0x6c0d7220, 0xeb5e: 0x6c2d4620, + 0xeb60: 0x6c016220, 0xeb61: 0x6c0cd420, 0xeb63: 0x6c05fe20, + 0xeb65: 0x6c15c020, + 0xeb68: 0x6c2d4820, 0xeb69: 0x6c0f8420, + 0xeb6d: 0x6c0d2c20, 0xeb6e: 0x6c093e20, 0xeb6f: 0x6c2d4a20, + 0xeb72: 0x6c2d5020, + 0xeb75: 0x6c0a1620, 0xeb76: 0x6c2d4c20, 0xeb77: 0x6c0c9220, + 0xeb78: 0x6c0c9020, 0xeb7a: 0x6c008820, + 0xeb7c: 0x6c165e20, 0xeb7d: 0x6c2d5420, 0xeb7f: 0x6c124420, + // Block 0x3ae, offset 0xeb80 + 0xeb80: 0x6c2d5820, 0xeb81: 0x6c2d5620, 0xeb82: 0x6c2d5220, 0xeb83: 0x6c25a620, + 0xeb84: 0x6c035820, 0xeb87: 0x6c2d1220, + 0xeb89: 0x6c2d5c20, 0xeb8a: 0x6c2d5a20, + 0xeb8f: 0x6c2d5e20, + 0xeb91: 0x6c157c20, + 0xeba3: 0x6c10aa20, + 0xeba6: 0x6c13f020, + 0xeba8: 0x6c2d6020, 0xebaa: 0x6c094220, + 0xebaf: 0x6c2d6220, + 0xebb1: 0x6c2d6420, + 0xebb5: 0x6c2d6620, + 0xebb8: 0x6c0f6e20, + // Block 0x3af, offset 0xebc0 + 0xebc1: 0x6c009420, + 0xebca: 0x6c070e20, + 0xebce: 0x6c16f820, + 0xebdb: 0x6c2d6e20, + 0xebe1: 0x6c054c20, 0xebe2: 0x6c2d6820, + 0xebe4: 0x6c2d6a20, + 0xebe8: 0x6c130420, + 0xebed: 0x6c029c20, + 0xebf5: 0x6c157e20, 0xebf7: 0x6c04a620, + 0xebfd: 0x6c0fd420, + // Block 0x3b0, offset 0xec00 + 0xec02: 0x6c2d7020, + 0xec12: 0x6c2d7220, + 0xec19: 0x6c2d7420, + 0xec2d: 0x6c0f7020, + 0xec30: 0x6c2d7820, 0xec32: 0x6c2d7620, + // Block 0x3b1, offset 0xec40 + 0xec49: 0x6c108e20, 0xec4a: 0x6c2d7a20, 0xec4b: 0x6c09b820, + 0xec4c: 0x6c095020, 0xec4d: 0x6c115a20, 0xec4e: 0x6c0e9620, + 0xec52: 0x6c097420, + 0xec54: 0x6c0b9c20, 0xec56: 0x6c2d7c20, + 0xec58: 0x6c2d7e20, + 0xec62: 0x6c0b7e20, 0xec63: 0x6c2d8020, + 0xec65: 0x6c2d8220, + 0xec69: 0x6c2d8420, 0xec6a: 0x6c15ea20, + 0xec6c: 0x6c09ba20, + 0xec72: 0x6c2d8820, 0xec73: 0x6c2d8620, + 0xec75: 0x6c071020, 0xec77: 0x6c074220, + 0xec78: 0x6c085420, + // Block 0x3b2, offset 0xec80 + 0xec82: 0x6c2d8e20, + 0xec87: 0x6c0a1820, + 0xec89: 0x6c2d8c20, 0xec8b: 0x6c2d8a20, + 0xec8d: 0x6c0dca20, + 0xec90: 0x6c067e20, 0xec92: 0x6c0c0620, + 0xec97: 0x6c11c020, + 0xec9c: 0x6c09be20, + 0xeca2: 0x6c2d9020, + 0xeca4: 0x6c0ac620, + 0xecaa: 0x6c2d9620, 0xecab: 0x6c2d9220, + 0xecaf: 0x6c2d9420, + 0xecb4: 0x6c2d9a20, 0xecb5: 0x6c2d9820, + 0xecb8: 0x6c0afc20, 0xecba: 0x6c2d9c20, + // Block 0x3b3, offset 0xecc0 + 0xecc0: 0x6c2d9e20, 0xecc1: 0x6c2da020, + 0xecc6: 0x6c120020, 0xecc7: 0x6c07be20, + 0xecc8: 0x6c095220, 0xecc9: 0x6c2da220, 0xeccb: 0x6c2da420, + 0xeccc: 0x6c161020, 0xeccd: 0x6c09d620, 0xecce: 0x6c152c20, 0xeccf: 0x6c166020, + 0xecd0: 0x6c2da620, 0xecd1: 0x6c04ec20, + 0xecd6: 0x6c2da820, + 0xecd8: 0x6c0f7220, 0xecdb: 0x6c2dae20, + 0xecdc: 0x6c02e420, 0xecdd: 0x6c0b5a20, 0xecdf: 0x6c2daa20, + 0xece1: 0x6c2dac20, 0xece3: 0x6c0f3020, + 0xece6: 0x6c143e20, 0xece7: 0x6c052020, + 0xecf5: 0x6c2db220, 0xecf6: 0x6c2db420, + 0xecfc: 0x6c2db020, 0xecff: 0x6c2db820, + // Block 0x3b4, offset 0xed00 + 0xed0d: 0x6c10a620, 0xed0e: 0x6c027a20, + 0xed11: 0x6c2dc020, + 0xed14: 0x6c2dba20, 0xed15: 0x6c2dbe20, + 0xed1e: 0x6c2db620, + 0xed29: 0x6c2e4c20, + 0xed2c: 0x6c2dbc20, + 0xed34: 0x6c169e20, 0xed37: 0x6c065420, + 0xed3f: 0x6c2dd020, + // Block 0x3b5, offset 0xed40 + 0xed44: 0x6c0f9420, 0xed45: 0x6c2dc620, + 0xed48: 0x6c2dcc20, 0xed49: 0x6c2dc820, 0xed4b: 0x6c2dd220, + 0xed50: 0x6c2dd420, + 0xed57: 0x6c2dc420, + 0xed5a: 0x6c2dde20, 0xed5b: 0x6c016420, + 0xed5e: 0x6c2dc220, + 0xed62: 0x6c11ba20, + 0xed64: 0x6c2dca20, 0xed66: 0x6c0ac820, + 0xed71: 0x6c071220, + 0xed7e: 0x6c142420, + // Block 0x3b6, offset 0xed80 + 0xed80: 0x6c04f020, 0xed83: 0x6c09d820, + 0xed85: 0x6c106020, + 0xed91: 0x6c0c9620, 0xed93: 0x6c2dda20, + 0xed95: 0x6c2dce20, 0xed96: 0x6c2dd820, + 0xed98: 0x6c14d620, 0xed9a: 0x6c0ee020, 0xed9b: 0x6c2ddc20, + 0xed9c: 0x6c2dd620, + 0xedad: 0x6c0c9420, + 0xedb7: 0x6c2de420, + 0xedb9: 0x6c2de220, + // Block 0x3b7, offset 0xedc0 + 0xedcf: 0x6c2de020, + 0xedd2: 0x6c13f220, + 0xede4: 0x6c0a4220, + 0xede9: 0x6c2de620, 0xedea: 0x6c139620, + 0xeded: 0x6c012420, + 0xedf2: 0x6c12a820, 0xedf3: 0x6c0e9820, + 0xedf8: 0x6c045c20, 0xedfa: 0x6c2dea20, + 0xedfc: 0x6c071620, + // Block 0x3b8, offset 0xee00 + 0xee06: 0x6c082c20, + 0xee0f: 0x6c2de820, + 0xee10: 0x6c0b9e20, + 0xee18: 0x6c0ba020, 0xee19: 0x6c2df020, 0xee1a: 0x6c2df420, + 0xee20: 0x6c0afe20, 0xee22: 0x6c2df220, 0xee23: 0x6c2df620, + 0xee26: 0x6c04ce20, + 0xee28: 0x6c12a620, 0xee2b: 0x6c095420, + 0xee2c: 0x6c16ca20, 0xee2e: 0x6c2dee20, 0xee2f: 0x6c080820, + 0xee32: 0x6c170220, + 0xee35: 0x6c2dfa20, + 0xee3a: 0x6c2df820, 0xee3b: 0x6c2dfc20, + // Block 0x3b9, offset 0xee40 + 0xee44: 0x6c2dec20, + 0xee4b: 0x6c10ba20, + 0xee4d: 0x6c0fd620, + 0xee54: 0x6c0f1e20, 0xee56: 0x6c2e0620, + 0xee5b: 0x6c0e3a20, + 0xee5c: 0x6c2dfe20, + 0xee60: 0x6c2e0020, + 0xee6c: 0x6c053e20, 0xee6e: 0x6c2e0420, + 0xee75: 0x6c060020, + 0xee7c: 0x6c2e0220, 0xee7e: 0x6c0aca20, + // Block 0x3ba, offset 0xee80 + 0xee8c: 0x6c02e620, + 0xee94: 0x6c2e0e20, 0xee96: 0x6c079620, 0xee97: 0x6c0d2e20, + 0xee9a: 0x6c0f0420, + 0xeea7: 0x6c026a20, + 0xeeac: 0x6c2e0a20, 0xeead: 0x6c2e0c20, 0xeeae: 0x6c0ef620, + 0xeeb0: 0x6c2e0820, + 0xeeb9: 0x6c2e1020, + // Block 0x3bb, offset 0xeec0 + 0xeec3: 0x6c2e1c20, + 0xeec8: 0x6c2e2220, + 0xeed0: 0x6c2e2020, 0xeed1: 0x6c0f8620, + 0xeed6: 0x6c2e1220, 0xeed7: 0x6c2e1420, + 0xeed8: 0x6c2e1a20, + 0xeedd: 0x6c2e1e20, + 0xeee1: 0x6c04a820, + 0xeee4: 0x6c2e2420, 0xeee5: 0x6c2e1820, + 0xeee8: 0x6c2e1620, + // Block 0x3bc, offset 0xef00 + 0xef03: 0x6c2e2c20, + 0xef07: 0x6c2e2e20, + 0xef10: 0x6c2e3020, 0xef13: 0x6c2e2a20, + 0xef14: 0x6c2e2820, + 0xef18: 0x6c0acc20, 0xef19: 0x6c103c20, 0xef1a: 0x6c2e2620, + 0xef21: 0x6c2e3820, + 0xef2b: 0x6c2e3420, + 0xef35: 0x6c2e3620, 0xef36: 0x6c2e3220, + 0xef38: 0x6c0de820, 0xef3a: 0x6c2e3a20, + // Block 0x3bd, offset 0xef40 + 0xef41: 0x6c2e3c20, + 0xef44: 0x6c2e4020, + 0xef51: 0x6c035a20, 0xef52: 0x6c2e3e20, 0xef53: 0x6c154420, + 0xef5a: 0x6c2e5620, 0xef5b: 0x6c2e4220, + 0xef5e: 0x6c2e4820, + 0xef60: 0x6c2e4420, 0xef62: 0x6c2e4620, + 0xef6a: 0x6c2e4a20, + 0xef70: 0x6c2e4e20, + 0xef75: 0x6c2e5020, 0xef77: 0x6c2e5220, + 0xef7c: 0x6c2e5820, 0xef7d: 0x6c2e5420, 0xef7e: 0x6c2e5a20, 0xef7f: 0x6c2e5e20, + // Block 0x3be, offset 0xef80 + 0xef81: 0x6c2e5c20, + // Block 0x3bf, offset 0xefc0 + 0xeff7: 0x6c0ee220, + // Block 0x3c0, offset 0xf000 + 0xf000: 0x6c151e20, 0xf002: 0x6c2e6020, 0xf003: 0x6c0c9820, + 0xf007: 0x6c2e6220, + 0xf009: 0x6c136020, 0xf00a: 0x6c2e6420, 0xf00b: 0x6c024a20, + 0xf00f: 0x6c00f420, + 0xf011: 0x6c035e20, 0xf013: 0x6c035c20, + 0xf014: 0x6c2e6620, 0xf016: 0x6c2e6820, + 0xf018: 0x6c2e6a20, 0xf019: 0x6c2e6c20, + 0xf020: 0x6c2e6e20, 0xf022: 0x6c036020, 0xf023: 0x6c029e20, + 0xf024: 0x6c071820, 0xf025: 0x6c11cc20, 0xf027: 0x6c2e7220, + 0xf028: 0x6c2e7020, + 0xf02d: 0x6c2e7420, + 0xf032: 0x6c013420, + 0xf039: 0x6c2e7a20, 0xf03b: 0x6c2e7820, + 0xf03c: 0x6c2e7620, 0xf03e: 0x6c2e7c20, + // Block 0x3c1, offset 0xf040 + 0xf043: 0x6c2e8220, + 0xf047: 0x6c004e20, + 0xf04a: 0x6c2e7e20, + 0xf04c: 0x6c2e8620, 0xf04d: 0x6c2e8420, + 0xf054: 0x6c2e8a20, 0xf055: 0x6c2e8820, 0xf056: 0x6c2e8c20, + 0xf058: 0x6c104420, + 0xf05c: 0x6c2e8e20, + 0xf061: 0x6c2e9020, 0xf062: 0x6c2e9420, + 0xf065: 0x6c2e9220, + // Block 0x3c2, offset 0xf080 + 0xf09c: 0x6c12f420, + 0xf0a1: 0x6c2e9620, + 0xf0a8: 0x6c2e9820, 0xf0aa: 0x6c07e220, + 0xf0ae: 0x6c2e9a20, 0xf0af: 0x6c2e9c20, + 0xf0b2: 0x6c142620, + 0xf0bb: 0x6c0cd220, + 0xf0bf: 0x6c000820, + // Block 0x3c3, offset 0xf0c0 + 0xf0c0: 0x6c0d8e20, 0xf0c2: 0x6c2e9e20, + 0xf0c4: 0x6c12f620, + 0xf0cb: 0x6c2ea420, + 0xf0cc: 0x6c2ea020, 0xf0cd: 0x6c071a20, 0xf0cf: 0x6c2ea220, + 0xf0d0: 0x6c062420, + 0xf0db: 0x6c136220, + 0xf0dc: 0x6c2ea820, 0xf0dd: 0x6c2eac20, 0xf0de: 0x6c2eaa20, 0xf0df: 0x6c2eae20, + 0xf0e2: 0x6c00be20, 0xf0e3: 0x6c0b7420, + 0xf0e4: 0x6c0a4420, 0xf0e5: 0x6c036220, 0xf0e6: 0x6c2eb020, + 0xf0ea: 0x6c117020, + 0xf0ec: 0x6c2eb420, + 0xf0f0: 0x6c00c020, 0xf0f2: 0x6c2eb220, 0xf0f3: 0x6c0ef820, + 0xf0f5: 0x6c166220, 0xf0f6: 0x6c103e20, 0xf0f7: 0x6c2ea620, + 0xf0f8: 0x6c161420, 0xf0fa: 0x6c060220, + 0xf0fd: 0x6c15c220, + // Block 0x3c4, offset 0xf100 + 0xf105: 0x6c051a20, 0xf106: 0x6c163020, + 0xf108: 0x6c053420, 0xf10a: 0x6c0dbc20, 0xf10b: 0x6c281020, + 0xf10d: 0x6c2eb620, 0xf10e: 0x6c024c20, 0xf10f: 0x6c0ba220, + 0xf114: 0x6c02a020, 0xf115: 0x6c2eba20, 0xf117: 0x6c2ebc20, + 0xf118: 0x6c2eb820, 0xf119: 0x6c05ac20, 0xf11b: 0x6c07d220, + 0xf11c: 0x6c0ace20, + 0xf120: 0x6c00c220, 0xf123: 0x6c167a20, + 0xf127: 0x6c2ec020, + 0xf128: 0x6c2d4e20, 0xf12a: 0x6c2ebe20, + 0xf130: 0x6c2ec620, 0xf131: 0x6c2ec220, 0xf132: 0x6c2ec420, + 0xf134: 0x6c2ec820, 0xf136: 0x6c2eca20, 0xf137: 0x6c16a020, + 0xf138: 0x6c2ecc20, 0xf139: 0x6c2ece20, 0xf13b: 0x6c0c1220, + 0xf13c: 0x6c11d620, + // Block 0x3c5, offset 0xf140 + 0xf140: 0x6c0bbe20, 0xf141: 0x6c037e20, + 0xf144: 0x6c158020, 0xf145: 0x6c021220, 0xf146: 0x6c09bc20, 0xf147: 0x6c065620, + 0xf149: 0x6c2ed420, 0xf14b: 0x6c2ed220, + 0xf14c: 0x6c08ba20, 0xf14d: 0x6c2ed620, 0xf14e: 0x6c2ed020, + 0xf151: 0x6c082420, + 0xf155: 0x6c2ede20, 0xf156: 0x6c2a5c20, + 0xf159: 0x6c190e20, 0xf15b: 0x6c0bb220, + 0xf15c: 0x6c2eda20, + 0xf162: 0x6c161220, 0xf163: 0x6c10ca20, + 0xf168: 0x6c00d220, 0xf16a: 0x6c0c4620, 0xf16b: 0x6c08fc20, + 0xf170: 0x6c134620, 0xf172: 0x6c00fc20, + 0xf176: 0x6c16a220, 0xf177: 0x6c15e220, + 0xf179: 0x6c2ee020, 0xf17b: 0x6c0fb620, + // Block 0x3c6, offset 0xf180 + 0xf180: 0x6c098620, + 0xf184: 0x6c2ee220, 0xf186: 0x6c2ee420, 0xf187: 0x6c0b5c20, + 0xf188: 0x6c2ee620, 0xf18a: 0x6c16a420, + 0xf18d: 0x6c2edc20, 0xf18e: 0x6c2eea20, 0xf18f: 0x6c2eee20, + 0xf191: 0x6c2eec20, 0xf193: 0x6c2ee820, + 0xf196: 0x6c2ef020, + 0xf199: 0x6c2ef220, + 0xf19c: 0x6c0d3020, 0xf19e: 0x6c01fc20, + 0xf1a4: 0x6c2ef420, 0xf1a7: 0x6c14c020, + 0xf1aa: 0x6c2ef620, + 0xf1b0: 0x6c2ef820, 0xf1b2: 0x6c16d820, + 0xf1b8: 0x6c1f6020, 0xf1b9: 0x6c2efa20, + 0xf1bd: 0x6c2efc20, 0xf1be: 0x6c2efe20, + // Block 0x3c7, offset 0xf1c0 + 0xf1c2: 0x6c2f0620, + 0xf1c4: 0x6c2f0020, 0xf1c6: 0x6c2f0220, + 0xf1c8: 0x6c2f0420, 0xf1c9: 0x6c2f0820, + 0xf1d2: 0x6c0c0820, + 0xf1d6: 0x6c153e20, + 0xf1d9: 0x6c0c0a20, + 0xf1dc: 0x6c2f0a20, 0xf1de: 0x6c124620, + 0xf1e0: 0x6c2f0c20, 0xf1e1: 0x6c314420, 0xf1e2: 0x6c14e820, + 0xf1e4: 0x6c2f0e20, 0xf1e6: 0x6c2f1020, + 0xf1e8: 0x6c2f1220, 0xf1e9: 0x6c02a220, 0xf1eb: 0x6c2f1620, + 0xf1ed: 0x6c0b7620, + 0xf1f1: 0x6c2f1820, + 0xf1f4: 0x6c052c20, + 0xf1f9: 0x6c2f1a20, 0xf1fa: 0x6c2f2220, + 0xf1fc: 0x6c2f1e20, + // Block 0x3c8, offset 0xf200 + 0xf201: 0x6c2f2020, + 0xf204: 0x6c02da20, 0xf205: 0x6c2f1c20, 0xf206: 0x6c2f2420, + 0xf20b: 0x6c2f2620, + 0xf20d: 0x6c005020, 0xf20f: 0x6c2f2820, + 0xf210: 0x6c2f2a20, + 0xf218: 0x6c0ad020, + 0xf21c: 0x6c2f2c20, + 0xf220: 0x6c03fa20, 0xf223: 0x6c2f3220, + 0xf226: 0x6c2f3020, + 0xf228: 0x6c2f2e20, 0xf22b: 0x6c2ba020, + 0xf22d: 0x6c139020, + 0xf233: 0x6c2f3420, + 0xf234: 0x6c2f3620, + // Block 0x3c9, offset 0xf240 + 0xf243: 0x6c2f3820, + 0xf246: 0x6c2f3a20, + 0xf248: 0x6c2f3c20, 0xf24b: 0x6c2f3e20, + 0xf253: 0x6c036420, + 0xf25c: 0x6c2f4020, + 0xf26d: 0x6c2f4220, 0xf26e: 0x6c10ea20, + 0xf272: 0x6c2f4620, 0xf273: 0x6c01ae20, + 0xf275: 0x6c2f4c20, 0xf276: 0x6c2f4a20, + 0xf27b: 0x6c00c420, + 0xf27f: 0x6c04aa20, + // Block 0x3ca, offset 0xf280 + 0xf281: 0x6c136620, 0xf282: 0x6c0ee420, 0xf283: 0x6c075c20, + 0xf285: 0x6c071c20, 0xf286: 0x6c0a1a20, + 0xf288: 0x6c0b7c20, + 0xf28c: 0x6c2f5020, 0xf28f: 0x6c2f4e20, + 0xf290: 0x6c159020, 0xf291: 0x6c038020, 0xf292: 0x6c120420, 0xf293: 0x6c10a020, + 0xf297: 0x6c0bbc20, + 0xf298: 0x6c166420, 0xf29a: 0x6c059a20, + 0xf2a1: 0x6c2f5620, + 0xf2a4: 0x6c2f5420, + 0xf2ac: 0x6c142a20, 0xf2ad: 0x6c104020, + 0xf2b4: 0x6c011c20, 0xf2b7: 0x6c2f5820, + 0xf2b8: 0x6c2f5220, 0xf2bb: 0x6c12be20, + 0xf2bc: 0x6c15e020, 0xf2bd: 0x6c2f5a20, + // Block 0x3cb, offset 0xf2c0 + 0xf2c6: 0x6c2f5c20, + 0xf2cb: 0x6c2f6020, + 0xf2cc: 0x6c0dcc20, 0xf2cd: 0x6c02aa20, 0xf2ce: 0x6c02ac20, 0xf2cf: 0x6c2f5e20, + 0xf2d4: 0x6c038220, 0xf2d5: 0x6c060420, + 0xf2d8: 0x6c038420, 0xf2db: 0x6c0faa20, + 0xf2de: 0x6c168820, + 0xf2e7: 0x6c065820, + 0xf2eb: 0x6c2f6220, + 0xf2ef: 0x6c2f6420, + 0xf2f0: 0x6c2f6620, 0xf2f1: 0x6c2f6820, 0xf2f3: 0x6c2f6c20, + 0xf2f4: 0x6c2f6a20, + // Block 0x3cc, offset 0xf300 + 0xf328: 0x6c130a20, 0xf32a: 0x6c2f6e20, + 0xf32f: 0x6c2f7020, + 0xf331: 0x6c2f7220, + 0xf336: 0x6c2f7420, + // Block 0x3cd, offset 0xf340 + 0xf343: 0x6c2f7820, + 0xf344: 0x6c2f7620, 0xf346: 0x6c2f7a20, + 0xf35b: 0x6c124820, + 0xf35c: 0x6c27aa20, 0xf35f: 0x6c0b1620, + 0xf362: 0x6c03d020, + 0xf369: 0x6c2f7c20, 0xf36b: 0x6c2f7e20, + 0xf36d: 0x6c18ba20, 0xf36e: 0x6c20ec20, 0xf36f: 0x6c120620, + 0xf372: 0x6c00b620, + 0xf374: 0x6c003620, + 0xf37c: 0x6c08bc20, 0xf37d: 0x6c13f420, 0xf37e: 0x6c0b0420, + // Block 0x3ce, offset 0xf380 + 0xf383: 0x6c2f8020, + 0xf385: 0x6c150e20, + 0xf389: 0x6c2f8220, 0xf38a: 0x6c15c420, + 0xf38c: 0x6c010020, + 0xf390: 0x6c085620, 0xf392: 0x6c2f8420, 0xf393: 0x6c021420, + 0xf394: 0x6c2f8620, + 0xf398: 0x6c2f8820, + 0xf39d: 0x6c2f8c20, 0xf39e: 0x6c2f8e20, + 0xf3a0: 0x6c2f9220, 0xf3a1: 0x6c2f8a20, + 0xf3a4: 0x6c2f9020, + 0xf3a8: 0x6c036620, + 0xf3ac: 0x6c2f9420, 0xf3ae: 0x6c2f9620, + 0xf3bd: 0x6c2f9820, 0xf3be: 0x6c2f9a20, + // Block 0x3cf, offset 0xf3c0 + 0xf3c2: 0x6c2f9c20, + 0xf3c5: 0x6c2fa020, + 0xf3c9: 0x6c2f9e20, 0xf3cb: 0x6c2fa420, + 0xf3cc: 0x6c2faa20, + 0xf3d0: 0x6c2fa220, 0xf3d1: 0x6c2fa620, 0xf3d2: 0x6c2fa820, + 0xf3d5: 0x6c2fac20, 0xf3d7: 0x6c04ac20, + // Block 0x3d0, offset 0xf400 + 0xf416: 0x6c097620, 0xf417: 0x6c2fae20, + 0xf418: 0x6c2fb020, 0xf419: 0x6c071e20, + 0xf425: 0x6c2fb220, + 0xf428: 0x6c027020, + 0xf42c: 0x6c114220, 0xf42d: 0x6c2fb420, 0xf42e: 0x6c2fb620, + 0xf433: 0x6c0e6820, + 0xf434: 0x6c10be20, + 0xf43c: 0x6c2fb820, + // Block 0x3d1, offset 0xf440 + 0xf441: 0x6c119e20, + 0xf444: 0x6c0d9020, 0xf445: 0x6c012c20, 0xf446: 0x6c050420, + 0xf448: 0x6c050620, + 0xf450: 0x6c0e9a20, 0xf451: 0x6c2fc220, 0xf452: 0x6c050820, + 0xf455: 0x6c021620, + 0xf458: 0x6c2fc020, 0xf45b: 0x6c2fbc20, + 0xf45d: 0x6c2fbe20, 0xf45f: 0x6c2fba20, + 0xf462: 0x6c2fd620, + 0xf46d: 0x6c2fc420, 0xf46e: 0x6c2fc620, + 0xf471: 0x6c2fc820, 0xf472: 0x6c2fca20, + 0xf478: 0x6c2fce20, 0xf47b: 0x6c2fcc20, + 0xf47f: 0x6c09fe20, + // Block 0x3d2, offset 0xf480 + 0xf481: 0x6c2fd020, + 0xf485: 0x6c2fd420, + 0xf48e: 0x6c03d220, 0xf48f: 0x6c2fd220, + 0xf492: 0x6c0d3220, 0xf493: 0x6c060620, + 0xf499: 0x6c2fd820, + 0xf4a8: 0x6c0d9220, 0xf4ab: 0x6c2fda20, + 0xf4b0: 0x6c104220, + 0xf4b7: 0x6c2fdc20, + 0xf4be: 0x6c2fe620, + // Block 0x3d3, offset 0xf4c0 + 0xf4c0: 0x6c2fe220, 0xf4c2: 0x6c2fe020, 0xf4c3: 0x6c2fe420, + 0xf4c5: 0x6c2fde20, + 0xf4cd: 0x6c2fea20, + 0xf4d5: 0x6c2fe820, 0xf4d7: 0x6c2fee20, + 0xf4da: 0x6c04ae20, 0xf4db: 0x6c2fec20, + 0xf4df: 0x6c2ff020, + 0xf4e2: 0x6c2ff220, + 0xf4e4: 0x6c2ff620, 0xf4e5: 0x6c2ff420, + 0xf4e9: 0x6c2ff820, 0xf4ea: 0x6c2ffc20, 0xf4eb: 0x6c2ffa20, + // Block 0x3d4, offset 0xf500 + 0xf528: 0x6c075420, + 0xf52d: 0x6c2ffe20, + 0xf530: 0x6c300020, + 0xf538: 0x6c026c20, + 0xf53c: 0x6c300220, + // Block 0x3d5, offset 0xf540 + 0xf540: 0x6c300420, + 0xf544: 0x6c0ba620, + 0xf54f: 0x6c300620, + 0xf551: 0x6c300820, 0xf553: 0x6c300a20, + 0xf554: 0x6c300c20, + 0xf558: 0x6c072020, + 0xf55e: 0x6c300e20, 0xf55f: 0x6c301020, + 0xf562: 0x6c301220, 0xf563: 0x6c301420, + 0xf566: 0x6c301620, + 0xf56a: 0x6c11c220, 0xf56b: 0x6c301a20, + 0xf56d: 0x6c126820, 0xf56e: 0x6c301c20, 0xf56f: 0x6c301820, + 0xf571: 0x6c302020, + 0xf574: 0x6c301e20, 0xf577: 0x6c302220, + 0xf57b: 0x6c302420, + // Block 0x3d6, offset 0xf580 + 0xf586: 0x6c302620, + 0xf598: 0x6c302820, 0xf59a: 0x6c302a20, + 0xf59f: 0x6c302c20, + 0xf5a2: 0x6c302e20, 0xf5a3: 0x6c303020, + 0xf5a5: 0x6c303220, 0xf5a7: 0x6c303420, + 0xf5a8: 0x6c303620, 0xf5a9: 0x6c303820, 0xf5aa: 0x6c303a20, + 0xf5ae: 0x6c303c20, 0xf5af: 0x6c303e20, + 0xf5b1: 0x6c20e020, 0xf5b2: 0x6c304020, + 0xf5bb: 0x6c268a20, + 0xf5bc: 0x6c03d420, + // Block 0x3d7, offset 0xf5c0 + 0xf5c1: 0x6c023620, 0xf5c2: 0x6c077c20, 0xf5c3: 0x6c304420, + 0xf5c4: 0x6c304220, 0xf5c5: 0x6c149a20, + 0xf5cd: 0x6c304820, 0xf5ce: 0x6c304a20, 0xf5cf: 0x6c304620, + 0xf5d1: 0x6c304c20, + 0xf5d4: 0x6c145820, + 0xf5d8: 0x6c304e20, 0xf5da: 0x6c046220, + 0xf5ef: 0x6c16ce20, + 0xf5f4: 0x6c305020, + // Block 0x3d8, offset 0xf600 + 0xf603: 0x6c305420, + 0xf60e: 0x6c003c20, + 0xf611: 0x6c305620, 0xf612: 0x6c132e20, 0xf613: 0x6c305220, + 0xf616: 0x6c305820, 0xf617: 0x6c305a20, + 0xf61f: 0x6c305c20, + 0xf620: 0x6c305e20, + 0xf628: 0x6c306020, 0xf62a: 0x6c147020, 0xf62b: 0x6c082e20, + 0xf62d: 0x6c080c20, 0xf62e: 0x6c0c9a20, + 0xf634: 0x6c306220, + 0xf639: 0x6c306820, + // Block 0x3d9, offset 0xf640 + 0xf640: 0x6c306420, + 0xf646: 0x6c306a20, + 0xf649: 0x6c068220, 0xf64a: 0x6c306620, + 0xf64f: 0x6c306c20, + 0xf651: 0x6c306e20, 0xf652: 0x6c307020, + 0xf654: 0x6c307820, 0xf656: 0x6c082820, + 0xf65b: 0x6c0dc020, + 0xf661: 0x6c307a20, 0xf662: 0x6c307420, 0xf663: 0x6c307220, + 0xf664: 0x6c307620, + 0xf668: 0x6c05a220, + 0xf670: 0x6c308220, 0xf671: 0x6c308020, 0xf672: 0x6c307e20, + 0xf675: 0x6c002620, + // Block 0x3da, offset 0xf680 + 0xf684: 0x6c309620, 0xf686: 0x6c308e20, + 0xf688: 0x6c309020, 0xf689: 0x6c308820, 0xf68a: 0x6c309420, + 0xf68c: 0x6c308c20, 0xf68d: 0x6c02b820, + 0xf690: 0x6c171c20, 0xf692: 0x6c309220, 0xf693: 0x6c308a20, + 0xf694: 0x6c308620, 0xf695: 0x6c308420, + 0xf69b: 0x6c309a20, + 0xf6a1: 0x6c30a020, + 0xf6a4: 0x6c309e20, 0xf6a5: 0x6c309c20, + 0xf6ad: 0x6c12ae20, 0xf6ae: 0x6c309820, 0xf6af: 0x6c00a620, + 0xf6b0: 0x6c30a220, 0xf6b2: 0x6c30a620, + 0xf6b9: 0x6c02d220, 0xf6ba: 0x6c307c20, 0xf6bb: 0x6c00ea20, + 0xf6be: 0x6c30aa20, + // Block 0x3db, offset 0xf6c0 + 0xf6c6: 0x6c30a820, 0xf6c7: 0x6c30a420, + 0xf6c8: 0x6c0e0e20, + 0xf6d2: 0x6c147420, + 0xf6d7: 0x6c167c20, + 0xf6da: 0x6c30ac20, + 0xf6e0: 0x6c30ae20, + 0xf6e7: 0x6c30b020, + 0xf6f6: 0x6c30b220, + 0xf6f8: 0x6c30b420, + // Block 0x3dc, offset 0xf700 + 0xf725: 0x6c0ee620, 0xf727: 0x6c30b620, + 0xf729: 0x6c11ce20, 0xf72b: 0x6c30c020, + 0xf72c: 0x6c30b820, + 0xf730: 0x6c30ba20, 0xf733: 0x6c13f620, + 0xf734: 0x6c14d820, 0xf736: 0x6c108820, + // Block 0x3dd, offset 0xf740 + 0xf743: 0x6c30c220, + 0xf746: 0x6c30c420, 0xf747: 0x6c106420, + 0xf748: 0x6c30be20, 0xf749: 0x6c30bc20, + 0xf74e: 0x6c018c20, + 0xf752: 0x6c30d420, + 0xf755: 0x6c30d220, + 0xf75b: 0x6c016620, + 0xf75f: 0x6c30ce20, + 0xf763: 0x6c30cc20, + 0xf766: 0x6c30c820, + 0xf768: 0x6c02ea20, 0xf76a: 0x6c30c620, 0xf76b: 0x6c08f420, + 0xf76c: 0x6c018a20, + 0xf77b: 0x6c072220, + 0xf77e: 0x6c30da20, 0xf77f: 0x6c30d820, + // Block 0x3de, offset 0xf780 + 0xf781: 0x6c30d620, + 0xf784: 0x6c30d020, 0xf786: 0x6c30dc20, + 0xf788: 0x6c30de20, + 0xf790: 0x6c30e820, 0xf791: 0x6c30e620, + 0xf799: 0x6c30ea20, + 0xf79c: 0x6c00d620, 0xf79d: 0x6c30e020, 0xf79e: 0x6c30e220, + 0xf7a0: 0x6c074420, 0xf7a1: 0x6c14c220, + 0xf7a4: 0x6c30e420, + 0xf7ac: 0x6c13f820, 0xf7af: 0x6c30f420, + 0xf7b2: 0x6c30ec20, + 0xf7ba: 0x6c30f620, + // Block 0x3df, offset 0xf7c0 + 0xf7c7: 0x6c30f020, + 0xf7c9: 0x6c30ee20, + 0xf7cf: 0x6c059c20, + 0xf7da: 0x6c30f820, + 0xf7e4: 0x6c30fa20, + 0xf7e9: 0x6c30fc20, 0xf7eb: 0x6c30f220, + 0xf7ef: 0x6c30ca20, + 0xf7f2: 0x6c30fe20, + 0xf7f4: 0x6c0f3220, + 0xf7f8: 0x6c310620, 0xf7fa: 0x6c310820, 0xf7fb: 0x6c310420, + // Block 0x3e0, offset 0xf800 + 0xf801: 0x6c310220, 0xf802: 0x6c310e20, + 0xf804: 0x6c310020, 0xf806: 0x6c310a20, + 0xf80f: 0x6c310c20, + 0xf813: 0x6c311220, + 0xf819: 0x6c311020, + 0xf826: 0x6c311620, + 0xf82d: 0x6c311820, 0xf82f: 0x6c311a20, + 0xf832: 0x6c171620, + 0xf838: 0x6c311420, 0xf839: 0x6c0dce20, 0xf83a: 0x6c07f220, + 0xf83d: 0x6c311c20, + // Block 0x3e1, offset 0xf840 + 0xf85a: 0x6c311e20, 0xf85b: 0x6c312020, + 0xf85e: 0x6c312220, + // Block 0x3e2, offset 0xf880 + 0xf8b5: 0x6c312420, + 0xf8b8: 0x6c060820, 0xf8b9: 0x6c312620, + 0xf8bd: 0x6c312820, 0xf8bf: 0x6c08ee20, + // Block 0x3e3, offset 0xf8c0 + 0xf8c1: 0x6c312a20, + 0xf8c8: 0x6c312c20, 0xf8cb: 0x6c312e20, + 0xf8cc: 0x6c313020, + 0xf8d1: 0x6c313620, 0xf8d2: 0x6c313220, 0xf8d3: 0x6c16fc20, + 0xf8d5: 0x6c313420, 0xf8d7: 0x6c16a620, + 0xf8dd: 0x6c313820, 0xf8df: 0x6c167e20, + 0xf8e5: 0x6c313a20, 0xf8e6: 0x6c11a020, + 0xf8e9: 0x6c313c20, 0xf8ea: 0x6c314020, + 0xf8ed: 0x6c314220, + 0xf8f8: 0x6c313e20, 0xf8f9: 0x6c073620, 0xf8fa: 0x6c14ea20, 0xf8fb: 0x6c145a20, + 0xf8fc: 0x6c1c4020, 0xf8fe: 0x6c213620, 0xf8ff: 0x6c148a20, + // Block 0x3e4, offset 0xf900 + 0xf904: 0x6c018e20, + 0xf90c: 0x6c314620, 0xf90d: 0x6c040c20, 0xf90e: 0x6c314820, 0xf90f: 0x6c314a20, + 0xf910: 0x6c314c20, 0xf912: 0x6c074620, + 0xf914: 0x6c314e20, + 0xf918: 0x6c235220, 0xf919: 0x6c150620, 0xf91b: 0x6c0dbe20, + 0xf91c: 0x6c315020, 0xf91d: 0x6c315420, 0xf91e: 0x6c315220, + 0xf920: 0x6c315620, + 0xf925: 0x6c315820, + 0xf928: 0x6c315a20, + 0xf92f: 0x6c315c20, + 0xf934: 0x6c315e20, 0xf936: 0x6c316020, 0xf937: 0x6c316220, + 0xf939: 0x6c316420, 0xf93b: 0x6c316620, + 0xf93c: 0x6c316820, 0xf93d: 0x6c316a20, + // Block 0x3e5, offset 0xf940 + 0xf947: 0x6c316c20, + 0xf948: 0x6c316e20, + 0xf94e: 0x6c0f7420, + 0xf953: 0x6c065a20, + 0xf955: 0x6c317220, + 0xf960: 0x6c0cd620, 0xf961: 0x6c317420, + 0xf96c: 0x6c317620, + 0xf97b: 0x6c125e20, + 0xf97e: 0x6c317820, + // Block 0x3e6, offset 0xf980 + 0xf98a: 0x6c317a20, 0xf98b: 0x6c254c20, + 0xf98e: 0x6c2c2e20, 0xf98f: 0x6c2f4420, + 0xf992: 0x6c317c20, + 0xf994: 0x6c317e20, + 0xf99f: 0x6c318220, + 0xf9a0: 0x6c318420, 0xf9a1: 0x6c318620, 0xf9a2: 0x6c16a820, 0xf9a3: 0x6c318020, + 0xf9a6: 0x6c318820, 0xf9a7: 0x6c318a20, + 0xf9aa: 0x6c318e20, + 0xf9ac: 0x6c318c20, + 0xf9b2: 0x6c319220, + 0xf9b6: 0x6c319420, 0xf9b7: 0x6c319020, + // Block 0x3e7, offset 0xf9c0 + 0xf9cd: 0x6c163420, + 0xf9d5: 0x6c319620, + 0xf9dc: 0x6c319820, 0xf9dd: 0x6c258620, + 0xf9e0: 0x6c319a20, + // Block 0x3e8, offset 0xfa00 + 0xfa00: 0x6c2bdc20, 0xfa01: 0x6c06ce20, 0xfa02: 0x6c093c20, 0xfa03: 0x6c2c1020, + 0xfa04: 0x6c02c820, 0xfa05: 0x6c051c20, 0xfa06: 0x6c04f620, 0xfa07: 0x6c319820, + 0xfa08: 0x6c319820, 0xfa09: 0x6c056420, 0xfa0a: 0x6c04ec20, 0xfa0b: 0x6c19b020, + 0xfa0c: 0x6c10a820, 0xfa0d: 0x6c1dac20, 0xfa0e: 0x6c245a20, 0xfa0f: 0x6c15d620, + 0xfa10: 0x6c29d420, 0xfa11: 0x6c15d820, 0xfa12: 0x6c15da20, 0xfa13: 0x6c2d5e20, + 0xfa14: 0x6c207020, 0xfa15: 0x6c15e420, 0xfa16: 0x6c22ae20, 0xfa17: 0x6c237220, + 0xfa18: 0x6c15e820, 0xfa19: 0x6c15ea20, 0xfa1a: 0x6c2fc820, 0xfa1b: 0x6c174220, + 0xfa1c: 0x6c15ee20, 0xfa1d: 0x6c15f220, 0xfa1e: 0x6c22f420, 0xfa1f: 0x6c15f820, + 0xfa20: 0x6c312220, 0xfa21: 0x6c15f020, 0xfa22: 0x6c15f420, 0xfa23: 0x6c15f620, + 0xfa24: 0x6c2b0220, 0xfa25: 0x6c1e1420, 0xfa26: 0x6c285620, 0xfa27: 0x43103e20, + 0xfa28: 0x6c16de20, 0xfa29: 0x6c16e220, 0xfa2a: 0x6c16e820, 0xfa2b: 0x6c16ee20, + 0xfa2c: 0x6c16f820, 0xfa2d: 0x6c179220, 0xfa2e: 0x6c169020, 0xfa2f: 0x6c18b420, + 0xfa30: 0x42c98820, 0xfa31: 0x6c16d020, 0xfa32: 0x6c22f220, 0xfa33: 0x6c249620, + 0xfa34: 0x6c16f220, 0xfa35: 0x6c29cc20, 0xfa36: 0x6c163c20, 0xfa37: 0x6c16d620, + 0xfa38: 0x6c16d820, 0xfa39: 0x6c16ce20, 0xfa3a: 0x6c07f220, 0xfa3b: 0x6c250420, + 0xfa3c: 0x6c254420, 0xfa3d: 0x42fb4020, 0xfa3e: 0x43079220, 0xfa3f: 0x43260820, + // Block 0x3e9, offset 0xfa40 + 0xfa40: 0x6c08ee20, 0xfa41: 0x6c170420, 0xfa42: 0x6c1a9e20, 0xfa43: 0x6c16e020, + 0xfa44: 0x6c262620, 0xfa45: 0x6c16f420, 0xfa46: 0x6c16ec20, 0xfa47: 0x6c251c20, + 0xfa48: 0x6c16d420, 0xfa49: 0x6c15e220, 0xfa4a: 0x6c1a9620, 0xfa4b: 0x42b8c420, + 0xfa4c: 0x6c209220, 0xfa4d: 0x42dbb420, 0xfa4e: 0x6c16ea20, 0xfa4f: 0x6c168620, + 0xfa50: 0x6c271420, 0xfa51: 0x6c2ea420, 0xfa52: 0x6c2f1420, 0xfa53: 0x6c170020, + 0xfa54: 0x6c31a420, 0xfa55: 0x6c164620, 0xfa56: 0x6c165620, 0xfa57: 0x6c003a20, + 0xfa58: 0x6c126e20, 0xfa59: 0x6c166220, 0xfa5a: 0x6c2bc620, 0xfa5b: 0x6c1dfe20, + 0xfa5c: 0x6c207020, 0xfa5d: 0x6c0dec20, 0xfa5e: 0x6c0e1420, 0xfa5f: 0x6c10fa20, + 0xfa60: 0x6c0fe420, 0xfa61: 0x6c161820, 0xfa62: 0x6c007620, 0xfa63: 0x6c142c20, + 0xfa64: 0x42f1f620, 0xfa65: 0x6c138820, 0xfa66: 0x6c131420, 0xfa67: 0x6c12c420, + 0xfa68: 0x6c122e20, 0xfa69: 0x6c1ed820, 0xfa6a: 0x6c080620, 0xfa6b: 0x6c190a20, + 0xfa6c: 0x6c07aa20, 0xfa6d: 0x6c0a9c20, 0xfa6e: 0x6c15b620, 0xfa6f: 0x43155420, + 0xfa70: 0x6c082020, 0xfa71: 0x6c0dfc20, 0xfa72: 0x6c0ef020, 0xfa73: 0x6c099820, + 0xfa74: 0x6c095620, 0xfa75: 0x6c161e20, 0xfa76: 0x6c162020, 0xfa77: 0x6c164020, + 0xfa78: 0x6c182620, 0xfa79: 0x6c185a20, 0xfa7a: 0x6c164c20, 0xfa7b: 0x6c165820, + 0xfa7c: 0x6c165a20, 0xfa7d: 0x6c165c20, 0xfa7e: 0x6c166020, 0xfa7f: 0x6c18c020, + // Block 0x3ea, offset 0xfa80 + 0xfa80: 0x6c16cc20, 0xfa81: 0x6c0a3a20, 0xfa82: 0x6c1c6220, 0xfa83: 0x6c163a20, + 0xfa84: 0x6c228020, 0xfa85: 0x6c24f620, 0xfa86: 0x6c2e7420, 0xfa87: 0x6c2ffc20, + 0xfa88: 0x6c16a620, 0xfa89: 0x6c314820, 0xfa8a: 0x6c166620, 0xfa8b: 0x42cd8c20, + 0xfa8c: 0x42d6ee20, 0xfa8d: 0x6c2cf620, 0xfa8e: 0x6c110220, 0xfa8f: 0x6c16ba20, + 0xfa90: 0x6c1dba20, 0xfa91: 0x6c110820, 0xfa92: 0x6c16bc20, 0xfa93: 0x6c16be20, + 0xfa94: 0x42e91220, 0xfa95: 0x42f39420, 0xfa96: 0x6c16c220, 0xfa97: 0x6c16c420, + 0xfa98: 0x6c2cdc20, 0xfa99: 0x6c16c620, 0xfa9a: 0x6c16c820, 0xfa9b: 0x43269420, + 0xfa9c: 0x6c16ae20, 0xfa9d: 0x6c16b020, 0xfa9e: 0x6c00ac20, 0xfa9f: 0x6c16b220, + 0xfaa0: 0x6c16b420, 0xfaa1: 0x43155420, 0xfaa2: 0x6c16b620, 0xfaa3: 0x6c110420, + 0xfaa4: 0x6c110620, 0xfaa5: 0x42d75c20, 0xfaa6: 0x6c16c020, 0xfaa7: 0x6c235e20, + 0xfaa8: 0x6c168a20, 0xfaa9: 0x6c1a1220, 0xfaaa: 0x6c10fa20, 0xfaab: 0x6c169420, + 0xfaac: 0x6c169620, 0xfaad: 0x6c169820, 0xfaae: 0x6c238e20, 0xfaaf: 0x6c278420, + 0xfab0: 0x6c27c420, 0xfab1: 0x6c169e20, 0xfab2: 0x6c16a220, 0xfab3: 0x6c2f0420, + 0xfab4: 0x6c166420, 0xfab5: 0x6c168e20, 0xfab6: 0x6c255020, 0xfab7: 0x6c2d9a20, + 0xfab8: 0x6c2ecc20, 0xfab9: 0x6c1d1a20, 0xfaba: 0x6c163e20, 0xfabb: 0x6c164220, + 0xfabc: 0x6c164820, 0xfabd: 0x6c10e820, 0xfabe: 0x6c164a20, 0xfabf: 0x6c207020, + // Block 0x3eb, offset 0xfac0 + 0xfac0: 0x6c22e020, 0xfac1: 0x6c165220, 0xfac2: 0x6c297e20, 0xfac3: 0x6c165e20, + 0xfac4: 0x6c163420, 0xfac5: 0x6c1f2a20, 0xfac6: 0x6c2e9a20, 0xfac7: 0x6c162220, + 0xfac8: 0x42cef620, 0xfac9: 0x6c154020, 0xfaca: 0x6c162420, 0xfacb: 0x6c162620, + 0xfacc: 0x6c162820, 0xfacd: 0x6c162a20, 0xface: 0x6c162c20, 0xfacf: 0x6c128220, + 0xfad0: 0x6c168820, 0xfad1: 0x6c16fa20, 0xfad2: 0x6c1dce20, 0xfad3: 0x6c161420, + 0xfad4: 0x6c166a20, 0xfad5: 0x6c1bde20, 0xfad6: 0x6c21cc20, 0xfad7: 0x6c167820, + 0xfad8: 0x6c161620, 0xfad9: 0x6c1d6020, 0xfada: 0x6c053820, 0xfadb: 0x6c161820, + 0xfadc: 0x6c163020, 0xfadd: 0x6c15fc20, 0xfade: 0x6c15fe20, 0xfadf: 0x6c160020, + 0xfae0: 0x6c006e20, 0xfae1: 0x6c160220, 0xfae2: 0x6c160420, 0xfae3: 0x6c0f7620, + 0xfae4: 0x6c160620, 0xfae5: 0x6c160a20, 0xfae6: 0x6c1da420, 0xfae7: 0x6c160c20, + 0xfae8: 0x6c160e20, 0xfae9: 0x6c161020, 0xfaea: 0x6c161220, 0xfaeb: 0x6c106620, + 0xfaec: 0x6c0f8820, 0xfaed: 0x6c193020, 0xfaee: 0x6c167220, 0xfaef: 0x42e93020, + 0xfaf0: 0x6c29ca20, 0xfaf1: 0x6c167a20, 0xfaf2: 0x6c167c20, 0xfaf3: 0x6c167e20, + 0xfaf4: 0x6c166e20, 0xfaf5: 0x6c167020, 0xfaf6: 0x6c167620, 0xfaf7: 0x6c161a20, + 0xfaf8: 0x6c02b020, 0xfaf9: 0x6c162e20, 0xfafa: 0x42e58020, 0xfafb: 0x6c229820, + 0xfafc: 0x6c08f220, 0xfafd: 0x6c09c020, 0xfafe: 0x6c0e7a20, 0xfaff: 0x6c086620, + // Block 0x3ec, offset 0xfb00 + 0xfb00: 0x6c0c3420, 0xfb01: 0x6c0fde20, 0xfb02: 0x6c0dde20, 0xfb03: 0x6c102420, + 0xfb04: 0x6c0dd820, 0xfb05: 0x6c105420, 0xfb06: 0x6c140e20, 0xfb07: 0x6c2ce020, + 0xfb08: 0x6c070420, 0xfb09: 0x6c071a20, 0xfb0a: 0x6c05f620, 0xfb0b: 0x6c028220, + 0xfb0c: 0x6c181a20, 0xfb0d: 0x42ab8020, 0xfb0e: 0x43f41c20, 0xfb0f: 0x43f41e20, + 0xfb10: 0x6c0f0a20, 0xfb11: 0x43f42220, 0xfb12: 0x6c0be420, 0xfb13: 0x43f42620, + 0xfb14: 0x43f42820, 0xfb15: 0x42a3bc20, 0xfb16: 0x6c0ea020, 0xfb17: 0x6c012a20, + 0xfb18: 0x6c169a20, 0xfb19: 0x6c0b4420, 0xfb1a: 0x6c0aa220, 0xfb1b: 0x6c131a20, + 0xfb1c: 0x6c153e20, 0xfb1d: 0x6c0bf420, 0xfb1e: 0x6c00ce20, 0xfb1f: 0x43f43e20, + 0xfb20: 0x430c2420, 0xfb21: 0x43f44220, 0xfb22: 0x6c0a3420, 0xfb23: 0x43f44620, + 0xfb24: 0x43f44820, 0xfb25: 0x6c009e20, 0xfb26: 0x6c0fd420, 0xfb27: 0x43f44e20, + 0xfb28: 0x43f45020, 0xfb29: 0x43f45220, 0xfb2a: 0x6c120620, 0xfb2b: 0x6c08bc20, + 0xfb2c: 0x6c036620, 0xfb2d: 0x6c0f3220, 0xfb2e: 0x4321bc20, 0xfb2f: 0x6c16a020, + 0xfb30: 0x6c12f820, 0xfb31: 0x6c0cd820, 0xfb32: 0x6c14e020, 0xfb33: 0x6c138a20, + 0xfb34: 0x6c04c820, 0xfb35: 0x6c121820, 0xfb36: 0x6c02be20, 0xfb37: 0x6c0e1820, + 0xfb38: 0x6c038e20, 0xfb39: 0x6c135220, 0xfb3a: 0x6c143220, 0xfb3b: 0x6c0cec20, + 0xfb3c: 0x6c1b9c20, 0xfb3d: 0x6c022a20, 0xfb3e: 0x6c025c20, 0xfb3f: 0x6c0d3820, + // Block 0x3ed, offset 0xfb40 + 0xfb40: 0x6c0ec020, 0xfb41: 0x6c12c020, 0xfb42: 0x6c03a620, 0xfb43: 0x6c0a2220, + 0xfb44: 0x6c116220, 0xfb45: 0x6c023c20, 0xfb46: 0x6c0a2620, 0xfb47: 0x6c033220, + 0xfb48: 0x6c093220, 0xfb49: 0x42e45620, 0xfb4a: 0x6c0de420, 0xfb4b: 0x6c123420, + 0xfb4c: 0x6c093420, 0xfb4d: 0x6c089a20, 0xfb4e: 0x6c03ba20, 0xfb4f: 0x6c157420, + 0xfb50: 0x6c0cc420, 0xfb51: 0x6c09e220, 0xfb52: 0x6c01dc20, 0xfb53: 0x6c0f5e20, + 0xfb54: 0x6c074020, 0xfb55: 0x6c108220, 0xfb56: 0x6c0c4220, 0xfb57: 0x6c16c220, + 0xfb58: 0x6c270220, 0xfb59: 0x6c11f620, 0xfb5a: 0x6c0a2c20, 0xfb5b: 0x6c093820, + 0xfb5c: 0x6c09a620, 0xfb5d: 0x4304f220, 0xfb5e: 0x4304f220, 0xfb5f: 0x6c0ea420, + 0xfb60: 0x6c02cc20, 0xfb61: 0x6c08aa20, 0xfb62: 0x6c013020, 0xfb63: 0x6c04e820, + 0xfb64: 0x6c12bc20, 0xfb65: 0x6c0d3e20, 0xfb66: 0x431f6c20, 0xfb67: 0x6c009e20, + 0xfb68: 0x6c10ca20, 0xfb69: 0x6c04aa20, 0xfb6a: 0x6c12be20, 0xfb6b: 0x6c056a20, + 0xfb6c: 0x4885dc20, 0xfb6d: 0x6c036820, + 0xfb70: 0x6c135c20, 0xfb71: 0x6c185420, 0xfb72: 0x6c0ca420, 0xfb73: 0x429f0020, + 0xfb74: 0x6c09c420, 0xfb75: 0x6c182c20, 0xfb76: 0x6c155820, 0xfb77: 0x6c094620, + 0xfb78: 0x6c02be20, 0xfb79: 0x42aaaa20, 0xfb7a: 0x6c199620, 0xfb7b: 0x42abc420, + 0xfb7c: 0x6c0f0a20, 0xfb7d: 0x6c133620, 0xfb7e: 0x6c014020, 0xfb7f: 0x6c144a20, + // Block 0x3ee, offset 0xfb80 + 0xfb80: 0x6c1b0820, 0xfb81: 0x42b65020, 0xfb82: 0x42bda420, 0xfb83: 0x42bdb220, + 0xfb84: 0x6c07b020, 0xfb85: 0x6c1cb620, 0xfb86: 0x6c1d2c20, 0xfb87: 0x6c0b2e20, + 0xfb88: 0x6c154820, 0xfb89: 0x6c0d3820, 0xfb8a: 0x42c2c020, 0xfb8b: 0x6c0ec020, + 0xfb8c: 0x6c0da620, 0xfb8d: 0x6c1e5820, 0xfb8e: 0x6c1e2c20, 0xfb8f: 0x42c8a420, + 0xfb90: 0x6c1eca20, 0xfb91: 0x6c0be420, 0xfb92: 0x6c16e220, 0xfb93: 0x6c141020, + 0xfb94: 0x6c0aee20, 0xfb95: 0x6c210220, 0xfb96: 0x6c082020, 0xfb97: 0x6c162420, + 0xfb98: 0x42ddb620, 0xfb99: 0x6c08d420, 0xfb9a: 0x6c033220, 0xfb9b: 0x6c109020, + 0xfb9c: 0x6c093220, 0xfb9d: 0x42ef4e20, 0xfb9e: 0x6c094e20, 0xfb9f: 0x6c11f020, + 0xfba0: 0x6c0ea020, 0xfba1: 0x42e8e220, 0xfba2: 0x42ea0c20, 0xfba3: 0x6c020820, + 0xfba4: 0x42ec3a20, 0xfba5: 0x6c243820, 0xfba6: 0x6c012a20, 0xfba7: 0x6c0bf220, + 0xfba8: 0x6c0eec20, 0xfba9: 0x42ee9420, 0xfbaa: 0x6c0e7e20, 0xfbab: 0x42f19820, + 0xfbac: 0x42f56220, 0xfbad: 0x6c0c4220, 0xfbae: 0x42f8f620, 0xfbaf: 0x6c26c220, + 0xfbb0: 0x6c16c220, 0xfbb1: 0x42fe7c20, 0xfbb2: 0x6c093820, 0xfbb3: 0x6c070220, + 0xfbb4: 0x6c01ec20, 0xfbb5: 0x430ef220, 0xfbb6: 0x6c2aee20, 0xfbb7: 0x6c132020, + 0xfbb8: 0x6c08aa20, 0xfbb9: 0x6c0ed820, 0xfbba: 0x6c0a3420, 0xfbbb: 0x6c0c0220, + 0xfbbc: 0x6c013020, 0xfbbd: 0x6c0dec20, 0xfbbe: 0x6c154e20, 0xfbbf: 0x6c04e820, + // Block 0x3ef, offset 0xfbc0 + 0xfbc0: 0x6c1ede20, 0xfbc1: 0x6c0d3e20, 0xfbc2: 0x6c155020, 0xfbc3: 0x6c2d5020, + 0xfbc4: 0x43233220, 0xfbc5: 0x4324ec20, 0xfbc6: 0x432cf820, 0xfbc7: 0x6c10ca20, + 0xfbc8: 0x6c153e20, 0xfbc9: 0x432fb620, 0xfbca: 0x6c04aa20, 0xfbcb: 0x43301620, + 0xfbcc: 0x6c12be20, 0xfbcd: 0x43362420, 0xfbce: 0x6c319820, 0xfbcf: 0x48509420, + 0xfbd0: 0x48508820, 0xfbd1: 0x4867aa20, 0xfbd2: 0x44773a20, 0xfbd3: 0x44803020, + 0xfbd4: 0x44807220, 0xfbd5: 0x48a49220, 0xfbd6: 0x48b9a020, 0xfbd7: 0x48fda620, + 0xfbd8: 0x433e8620, 0xfbd9: 0x433f1c20, + // Block 0x3f0, offset 0xfc00 + 0xfc01: 0x4002ba20, 0xfc02: 0x4003e020, 0xfc03: 0x4004ea20, + 0xfc04: 0x4027de20, 0xfc05: 0x4004ec20, 0xfc06: 0x4004e620, 0xfc07: 0x4003d220, + 0xfc08: 0x4003f420, 0xfc09: 0x4003f620, 0xfc0a: 0x4004d820, 0xfc0b: 0x40093820, + 0xfc0c: 0x40024020, 0xfc0d: 0x40021a20, 0xfc0e: 0x4002e420, 0xfc0f: 0x4004e220, + 0xfc10: 0x4029cc20, 0xfc11: 0x4029ce20, 0xfc12: 0x4029d020, 0xfc13: 0x4029d220, + 0xfc14: 0x4029d420, 0xfc15: 0x4029d620, 0xfc16: 0x4029d820, 0xfc17: 0x4029da20, + 0xfc18: 0x4029dc20, 0xfc19: 0x4029de20, 0xfc1a: 0x40026c20, 0xfc1b: 0x40026220, + 0xfc1c: 0x40094020, 0xfc1d: 0x40094220, 0xfc1e: 0x40094420, 0xfc1f: 0x4002c420, + 0xfc20: 0x4004d620, 0xfc21: 0x002bde88, 0xfc22: 0x002c0a88, 0xfc23: 0x002c3a88, + 0xfc24: 0x002c6288, 0xfc25: 0x002c9888, 0xfc26: 0x002d0888, 0xfc27: 0x002d2288, + 0xfc28: 0x002d6888, 0xfc29: 0x002d9a88, 0xfc2a: 0x002dcc88, 0xfc2b: 0x002dfe88, + 0xfc2c: 0x002e2288, 0xfc2d: 0x002e8288, 0xfc2e: 0x002e9e88, 0xfc2f: 0x002ee288, + 0xfc30: 0x002f2c88, 0xfc31: 0x002f5688, 0xfc32: 0x002f7a88, 0xfc33: 0x002fe688, + 0xfc34: 0x00302c88, 0xfc35: 0x00306c88, 0xfc36: 0x0030be88, 0xfc37: 0x0030e288, + 0xfc38: 0x0030f688, 0xfc39: 0x00310088, 0xfc3a: 0x00312a88, 0xfc3b: 0x4003f820, + 0xfc3c: 0x4003d220, 0xfc3d: 0x4003fa20, 0xfc3e: 0x40062420, 0xfc3f: 0x40021620, + // Block 0x3f1, offset 0xfc40 + 0xfc40: 0x40061e20, 0xfc41: 0x402bde20, 0xfc42: 0x402c0a20, 0xfc43: 0x402c3a20, + 0xfc44: 0x402c6220, 0xfc45: 0x402c9820, 0xfc46: 0x402d0820, 0xfc47: 0x402d2220, + 0xfc48: 0x402d6820, 0xfc49: 0x402d9a20, 0xfc4a: 0x402dcc20, 0xfc4b: 0x402dfe20, + 0xfc4c: 0x402e2220, 0xfc4d: 0x402e8220, 0xfc4e: 0x402e9e20, 0xfc4f: 0x402ee220, + 0xfc50: 0x402f2c20, 0xfc51: 0x402f5620, 0xfc52: 0x402f7a20, 0xfc53: 0x402fe620, + 0xfc54: 0x40302c20, 0xfc55: 0x40306c20, 0xfc56: 0x4030be20, 0xfc57: 0x4030e220, + 0xfc58: 0x4030f620, 0xfc59: 0x40310020, 0xfc5a: 0x40312a20, 0xfc5b: 0x4003fc20, + 0xfc5c: 0x40094820, 0xfc5d: 0x4003fe20, 0xfc5e: 0x40094c20, 0xfc5f: 0x00041883, + 0xfc60: 0x00041a83, 0xfc61: 0x40030420, 0xfc62: 0x4004a420, 0xfc63: 0x4004a620, + 0xfc64: 0x40025c20, 0xfc65: 0x00023e92, 0xfc66: 0xca2835c1, 0xfc67: 0xc6393241, + 0xfc68: 0xc7093241, 0xfc69: 0xc7c935c1, 0xfc6a: 0xc8b03241, 0xfc6b: 0xc9653241, + 0xfc6c: 0xc6d43241, 0xfc6d: 0xc89b3241, 0xfc6e: 0xca093241, 0xfc6f: 0xc83435c1, + 0xfc70: 0x0027d692, 0xfc71: 0xc63f3241, 0xfc72: 0xc70f3241, 0xfc73: 0xc7de35c1, + 0xfc74: 0xc8b63241, 0xfc75: 0xc96b3241, 0xfc76: 0xc6523241, 0xfc77: 0xc72235c1, + 0xfc78: 0xc80035c1, 0xfc79: 0xc8c93241, 0xfc7a: 0xc97e35c1, 0xfc7b: 0xc66b35c1, + 0xfc7c: 0xc74435c1, 0xfc7d: 0xc82235c1, 0xfc7e: 0xc8e235c1, 0xfc7f: 0xc99b35c1, + // Block 0x3f2, offset 0xfc80 + 0xfc80: 0xc68835c1, 0xfc81: 0xc76135c1, 0xfc82: 0xc84935c1, 0xfc83: 0xc8ff35c1, + 0xfc84: 0xc9bd35c1, 0xfc85: 0xc6983241, 0xfc86: 0xc7713241, 0xfc87: 0xc85c3241, + 0xfc88: 0xc90f3241, 0xfc89: 0xc9cd3241, 0xfc8a: 0xc6b635c1, 0xfc8b: 0xc78f35c1, + 0xfc8c: 0xc87a35c1, 0xfc8d: 0xc92d35c1, 0xfc8e: 0xc9eb35c1, 0xfc8f: 0xc6ce3241, + 0xfc90: 0xc7a73241, 0xfc91: 0xc8953241, 0xfc92: 0xc9453241, 0xfc93: 0xca033241, + 0xfc94: 0xc6da3241, 0xfc95: 0xc8a13241, 0xfc96: 0xca0f3241, 0xfc97: 0xc6e33241, + 0xfc98: 0xc7b03241, 0xfc99: 0xc8aa3241, 0xfc9a: 0xc94e3241, 0xfc9b: 0xca183241, + 0xfc9c: 0xc6fd35c1, 0xfc9d: 0xca313aa1, 0xfc9e: 0xa0012812, 0xfc9f: 0xa0012912, + 0xfca0: 0x4063a620, 0xfca1: 0x4062ac20, 0xfca2: 0x4062ae20, 0xfca3: 0x40646820, + 0xfca4: 0x4062b020, 0xfca5: 0x40646c20, 0xfca6: 0x40646e20, 0xfca7: 0x4062b220, + 0xfca8: 0x4062b420, 0xfca9: 0x4062b620, 0xfcaa: 0x40647420, 0xfcab: 0x40647620, + 0xfcac: 0x40647820, 0xfcad: 0x40647a20, 0xfcae: 0x40647c20, 0xfcaf: 0x40647e20, + 0xfcb0: 0x4062e020, 0xfcb1: 0x4062b820, 0xfcb2: 0x4062ba20, 0xfcb3: 0x4062bc20, + 0xfcb4: 0x4062ee20, 0xfcb5: 0x4062be20, 0xfcb6: 0x4062c020, 0xfcb7: 0x4062c220, + 0xfcb8: 0x4062c420, 0xfcb9: 0x4062c620, 0xfcba: 0x4062c820, 0xfcbb: 0x4062ca20, + 0xfcbc: 0x4062cc20, 0xfcbd: 0x4062ce20, 0xfcbe: 0x4062d020, + // Block 0x3f3, offset 0xfcc0 + 0xfcc2: 0x4063a820, 0xfcc3: 0x4063aa20, + 0xfcc4: 0x4063ac20, 0xfcc5: 0x4063ae20, 0xfcc6: 0x4063b020, 0xfcc7: 0x4063b220, + 0xfcca: 0x4063b420, 0xfccb: 0x4063b620, + 0xfccc: 0x4063b820, 0xfccd: 0x4063ba20, 0xfcce: 0x4063bc20, 0xfccf: 0x4063be20, + 0xfcd2: 0x4063c020, 0xfcd3: 0x4063c220, + 0xfcd4: 0x4063c420, 0xfcd5: 0x4063c620, 0xfcd6: 0x4063c820, 0xfcd7: 0x4063ca20, + 0xfcda: 0x4063cc20, 0xfcdb: 0x4063ce20, + 0xfcdc: 0x4063d020, + 0xfce0: 0x4027dc20, 0xfce1: 0x4027e020, 0xfce2: 0x40094620, 0xfce3: 0x40021220, + 0xfce4: 0x40094a20, 0xfce5: 0x4027e220, 0xfce6: 0x40280820, + 0xfce8: 0x400d3220, 0xfce9: 0x40084420, 0xfcea: 0x40084820, 0xfceb: 0x40084620, + 0xfcec: 0x40084a20, 0xfced: 0x400e6e20, 0xfcee: 0x400ec420, + 0xfcf9: 0xa0000000, 0xfcfa: 0xa0000000, 0xfcfb: 0xa0000000, + 0xfcfc: 0x4027ae20, 0xfcfd: 0x4027b020, 0xfcfe: 0x00000285, 0xfcff: 0x2bfffe85, + // Block 0x3f4, offset 0xfd00 + 0xfd00: 0xe0003c9d, 0xfd01: 0xe0003c85, 0xfd02: 0xe0003c89, 0xfd03: 0xe0003c91, + 0xfd04: 0xe0003ca1, 0xfd05: 0xe0003c95, 0xfd06: 0xe0003ca5, 0xfd07: 0xe0003c8d, + 0xfd08: 0xe0003c99, + 0xfd10: 0x02bf2e86, 0xfd11: 0x02a7de86, + // Block 0x3f5, offset 0xfd40 + 0xfd40: 0x429c7a20, 0xfd41: 0x6c036a20, 0xfd42: 0x429c8220, 0xfd43: 0x48024420, + 0xfd44: 0x429ec020, 0xfd45: 0x6c12f820, 0xfd46: 0x429f7620, 0xfd47: 0x42a00420, + 0xfd48: 0x42a0f420, 0xfd49: 0x6c124e20, 0xfd4a: 0x6c0cd820, 0xfd4b: 0x6c0d3420, + 0xfd4c: 0x44693c20, 0xfd4d: 0x480c7420, 0xfd4e: 0x6c14e020, 0xfd4f: 0x6c182020, + 0xfd50: 0x42a2c820, 0xfd51: 0x6c050a20, 0xfd52: 0x480a3820, 0xfd53: 0x44697220, + 0xfd54: 0x42a2ce20, 0xfd55: 0x6c07a420, 0xfd56: 0x480a9620, 0xfd57: 0x6c0ada20, + 0xfd58: 0x6c184020, 0xfd59: 0x429d9820, 0xfd5a: 0x6c0fea20, 0xfd5b: 0x6c185420, + 0xfd5c: 0x4923be20, 0xfd5d: 0x6c186820, 0xfd5e: 0x6c0b6220, 0xfd5f: 0x4469be20, + 0xfd60: 0x6c073a20, 0xfd61: 0x42a48c20, 0xfd62: 0x6c02bc20, 0xfd63: 0x42a4ee20, + 0xfd64: 0x446a2a20, 0xfd65: 0x6c155820, 0xfd66: 0x6c138a20, 0xfd67: 0x6c04c820, + 0xfd68: 0x6c094620, 0xfd69: 0x6c13ba20, 0xfd6a: 0x6c18c620, 0xfd6b: 0x6c142c20, + 0xfd6c: 0x6c18e820, 0xfd6d: 0x6c121820, 0xfd6e: 0x6c118020, 0xfd6f: 0x6c0d4820, + 0xfd70: 0x42a6fa20, 0xfd71: 0x6c047c20, 0xfd72: 0x6c047c20, 0xfd73: 0x6c047c20, + 0xfd74: 0x48145820, 0xfd75: 0x6c023e20, 0xfd76: 0x6c042020, 0xfd77: 0x6c191020, + 0xfd78: 0x4816c620, 0xfd79: 0x6c047e20, 0xfd7a: 0x6c090020, 0xfd7b: 0x42a80c20, + 0xfd7c: 0x42a93c20, 0xfd7d: 0x6c042220, 0xfd7e: 0x6c0f4020, 0xfd7f: 0x6c098c20, + // Block 0x3f6, offset 0xfd80 + 0xfd80: 0x6c195220, 0xfd81: 0x42a9ec20, 0xfd82: 0x6c0ff020, 0xfd83: 0x6c055c20, + 0xfd84: 0x6c198220, 0xfd85: 0x6c0c9e20, 0xfd86: 0x6c0c9e20, 0xfd87: 0x6c199620, + 0xfd88: 0x6c040020, 0xfd89: 0x42ab6620, 0xfd8a: 0x42ab8420, 0xfd8b: 0x6c1a2620, + 0xfd8c: 0x6c0e1820, 0xfd8d: 0x42ae2e20, 0xfd8e: 0x42aca220, 0xfd8f: 0x6c133420, + 0xfd90: 0x6c0c3420, 0xfd91: 0x6c0ce420, 0xfd92: 0x6c0ade20, 0xfd93: 0x6c0b0220, + 0xfd94: 0x42b01a20, 0xfd95: 0x6c056220, 0xfd96: 0x42b06420, 0xfd97: 0x6c13be20, + 0xfd98: 0x42b15820, 0xfd99: 0x4829c820, 0xfd9a: 0x6c116c20, 0xfd9b: 0x6c0f2620, + 0xfd9c: 0x42b20c20, 0xfd9d: 0x6c0d7620, 0xfd9e: 0x6c14b820, 0xfd9f: 0x6c1ace20, + 0xfda0: 0x482d5020, 0xfda1: 0x482dd420, 0xfda2: 0x42b3d820, 0xfda3: 0x42b43620, + 0xfda4: 0x42b44e20, 0xfda5: 0x42b3b020, 0xfda6: 0x6c12cc20, 0xfda7: 0x446ddc20, + 0xfda8: 0x446df820, 0xfda9: 0x42b61020, 0xfdaa: 0x6c1b3420, 0xfdab: 0x6c1b3420, + 0xfdac: 0x48339020, 0xfdad: 0x6c1b5c20, 0xfdae: 0x42b7b020, 0xfdaf: 0x6c10fa20, + 0xfdb0: 0x6c1b7620, 0xfdb1: 0x48363020, 0xfdb2: 0x6c097e20, 0xfdb3: 0x6c0a6220, + 0xfdb4: 0x6c101820, 0xfdb5: 0x6c1b8420, 0xfdb6: 0x446f0220, 0xfdb7: 0x6c0fc220, + 0xfdb8: 0x6c1b9c20, 0xfdb9: 0x42b98020, 0xfdba: 0x42b91a20, 0xfdbb: 0x483bc820, + 0xfdbc: 0x42ba8620, 0xfdbd: 0x483bcc20, 0xfdbe: 0x42badc20, 0xfdbf: 0x42bad620, + // Block 0x3f7, offset 0xfdc0 + 0xfdc0: 0x42baf820, 0xfdc1: 0x6c0a1420, 0xfdc2: 0x42bbc420, 0xfdc3: 0x44705e20, + 0xfdc4: 0x6c0e0220, 0xfdc5: 0x42bc5020, 0xfdc6: 0x6c140620, 0xfdc7: 0x42bcd220, + 0xfdc8: 0x4470c420, 0xfdc9: 0x48430620, 0xfdca: 0x4470f820, 0xfdcb: 0x42bd6020, + 0xfdcc: 0x42bd6620, 0xfdcd: 0x6c0a2820, 0xfdce: 0x6c16de20, 0xfdcf: 0x49472420, + 0xfdd0: 0x6c1c6e20, 0xfdd1: 0x48466220, 0xfdd2: 0x48466220, 0xfdd3: 0x6c286820, + 0xfdd4: 0x42be4420, 0xfdd5: 0x42be4420, 0xfdd6: 0x44718e20, 0xfdd7: 0x48657020, + 0xfdd8: 0x48c3b420, 0xfdd9: 0x6c056620, 0xfdda: 0x6c0ebc20, 0xfddb: 0x4471c620, + 0xfddc: 0x42bf3420, 0xfddd: 0x6c10f020, 0xfdde: 0x6c088020, 0xfddf: 0x42bff220, + 0xfde0: 0x6c1d0220, 0xfde1: 0x44727420, 0xfde2: 0x44723820, 0xfde3: 0x6c022a20, + 0xfde4: 0x484da820, 0xfde5: 0x6c109620, 0xfde6: 0x6c08cc20, 0xfde7: 0x6c06c020, + 0xfde8: 0x6c0b2e20, 0xfde9: 0x6c06c020, 0xfdea: 0x42c2f420, 0xfdeb: 0x6c0d3820, + 0xfdec: 0x6c05da20, 0xfded: 0x6c133820, 0xfdee: 0x42c35e20, 0xfdef: 0x42c3bc20, + 0xfdf0: 0x6c0ec020, 0xfdf1: 0x6c1dac20, 0xfdf2: 0x6c0bdc20, 0xfdf3: 0x6c1dc620, + 0xfdf4: 0x42c4ba20, 0xfdf5: 0x6c13cc20, 0xfdf6: 0x6c1df220, 0xfdf7: 0x6c1e2620, + 0xfdf8: 0x48561820, 0xfdf9: 0x6c120820, 0xfdfa: 0x42c5f820, 0xfdfb: 0x6c092c20, + 0xfdfc: 0x6c0cf620, 0xfdfd: 0x42c7c820, 0xfdfe: 0x4857e220, 0xfdff: 0x42c84420, + // Block 0x3f8, offset 0xfe00 + 0xfe00: 0x42c78a20, 0xfe01: 0x6c014820, 0xfe02: 0x44745c20, 0xfe03: 0x6c145420, + 0xfe04: 0x42c8fc20, 0xfe05: 0x42c93a20, 0xfe06: 0x42c8ee20, 0xfe07: 0x4474d820, + 0xfe08: 0x6c12c020, 0xfe09: 0x6c057620, 0xfe0a: 0x48601420, 0xfe0b: 0x42cbc620, + 0xfe0c: 0x6c0a2e20, 0xfe0d: 0x6c1f1420, 0xfe0e: 0x44763220, 0xfe0f: 0x6c0a2220, + 0xfe10: 0x44761020, 0xfe11: 0x4475c820, 0xfe12: 0x6c141620, 0xfe13: 0x6c183c20, + 0xfe14: 0x6c07a620, 0xfe15: 0x42cd3820, 0xfe16: 0x6c27ec20, 0xfe17: 0x4487b220, + 0xfe18: 0x6c16e220, 0xfe19: 0x6c141020, 0xfe1a: 0x42ce4220, 0xfe1b: 0x6c1f7020, + 0xfe1c: 0x6c094a20, 0xfe1d: 0x48678620, 0xfe1e: 0x44769220, 0xfe1f: 0x42cff420, + 0xfe20: 0x6c1f8c20, 0xfe21: 0x42d0a420, 0xfe22: 0x6c116220, 0xfe23: 0x4868da20, + 0xfe24: 0x42d11c20, 0xfe25: 0x42d03e20, 0xfe26: 0x42d22820, 0xfe27: 0x44773a20, + 0xfe28: 0x42d28420, 0xfe29: 0x42d34620, 0xfe2a: 0x42d3d420, 0xfe2b: 0x42d55020, + 0xfe2c: 0x486d4620, 0xfe2d: 0x6c051e20, 0xfe2e: 0x44783020, 0xfe2f: 0x6c08d220, + 0xfe30: 0x48714e20, 0xfe31: 0x6c20f820, 0xfe32: 0x44789c20, 0xfe33: 0x42d6e420, + 0xfe34: 0x42d73e20, 0xfe35: 0x6c082020, 0xfe36: 0x6c028c20, 0xfe37: 0x48751a20, + 0xfe38: 0x483a1620, 0xfe39: 0x4875f420, 0xfe3a: 0x6c11ec20, 0xfe3b: 0x48797820, + 0xfe3c: 0x6c014c20, 0xfe3d: 0x42d99a20, 0xfe3e: 0x42d8ce20, 0xfe3f: 0x42da2c20, + // Block 0x3f9, offset 0xfe40 + 0xfe40: 0x6c113620, 0xfe41: 0x6c023c20, 0xfe42: 0x6c162420, 0xfe43: 0x6c06dc20, + 0xfe44: 0x6c0b3a20, 0xfe45: 0x6c21a620, 0xfe46: 0x487a3c20, 0xfe47: 0x42da6820, + 0xfe48: 0x6c06de20, 0xfe49: 0x6c21d220, 0xfe4a: 0x447a6620, 0xfe4b: 0x6c08d420, + 0xfe4c: 0x42dd8e20, 0xfe4d: 0x487da220, 0xfe4e: 0x6c21a820, 0xfe4f: 0x6c0ec820, + 0xfe50: 0x487ebc20, 0xfe51: 0x487f1c20, 0xfe52: 0x6c226020, 0xfe53: 0x42e07220, + 0xfe54: 0x6c109020, 0xfe55: 0x6c228220, 0xfe56: 0x447b2c20, 0xfe57: 0x42e09420, + 0xfe58: 0x6c07bc20, 0xfe59: 0x42e0ee20, 0xfe5a: 0x6c0e2820, 0xfe5b: 0x480a4a20, + 0xfe5c: 0x42e28a20, 0xfe5d: 0x4884c620, 0xfe5e: 0x42e33820, 0xfe5f: 0x48875620, + 0xfe60: 0x6c22f620, 0xfe61: 0x6c094e20, 0xfe62: 0x42e4a020, 0xfe63: 0x488c1020, + 0xfe64: 0x6c07c020, 0xfe65: 0x42e52a20, 0xfe66: 0x488e6a20, 0xfe67: 0x48902820, + 0xfe68: 0x6c236220, 0xfe69: 0x6c018420, 0xfe6a: 0x447d5820, 0xfe6b: 0x42e74a20, + 0xfe6c: 0x447d7020, 0xfe6d: 0x447d7020, 0xfe6e: 0x42e88e20, 0xfe6f: 0x6c238c20, + 0xfe70: 0x42e8e220, 0xfe71: 0x42e90a20, 0xfe72: 0x6c23a020, 0xfe73: 0x447e3620, + 0xfe74: 0x42ea4820, 0xfe75: 0x48986c20, 0xfe76: 0x42ea7c20, 0xfe77: 0x48992420, + 0xfe78: 0x6c007620, 0xfe79: 0x48433e20, 0xfe7a: 0x42ec2020, 0xfe7b: 0x489f4220, + 0xfe7c: 0x489f7020, 0xfe7d: 0x48a08820, 0xfe7e: 0x447ff820, 0xfe7f: 0x44801020, + // Block 0x3fa, offset 0xfe80 + 0xfe80: 0x6c0eec20, 0xfe81: 0x48a1e620, 0xfe82: 0x48a1e420, 0xfe83: 0x48a23220, + 0xfe84: 0x48a26620, 0xfe85: 0x6c24a820, 0xfe86: 0x6c0b4220, 0xfe87: 0x6c0b4220, + 0xfe88: 0x42ee9420, 0xfe89: 0x44807220, 0xfe8a: 0x6c24c820, 0xfe8b: 0x44808c20, + 0xfe8c: 0x44812c20, 0xfe8d: 0x48a83a20, 0xfe8e: 0x42f09c20, 0xfe8f: 0x6c250420, + 0xfe90: 0x42f19820, 0xfe91: 0x4481c620, 0xfe92: 0x48ac4c20, 0xfe93: 0x6c0cc420, + 0xfe94: 0x48ad3420, 0xfe95: 0x48ad8a20, 0xfe96: 0x6c131a20, 0xfe97: 0x42f3d620, + 0xfe98: 0x44825e20, 0xfe99: 0x6c074020, 0xfe9a: 0x42f49420, 0xfe9b: 0x6c01ac20, + 0xfe9c: 0x48b2f820, 0xfe9d: 0x48b54e20, 0xfe9e: 0x48b54e20, 0xfe9f: 0x42f5dc20, + 0xfea0: 0x44840420, 0xfea1: 0x48b75620, 0xfea2: 0x6c261820, 0xfea3: 0x6c0e6a20, + 0xfea4: 0x44844e20, 0xfea5: 0x48b90020, 0xfea6: 0x6c268420, 0xfea7: 0x44854020, + 0xfea8: 0x42f9d020, 0xfea9: 0x42f9c620, 0xfeaa: 0x6c03c020, 0xfeab: 0x48bf0c20, + 0xfeac: 0x6c26bc20, 0xfead: 0x44860220, 0xfeae: 0x6c26d220, 0xfeaf: 0x42fc0420, + 0xfeb0: 0x42fc8a20, 0xfeb1: 0x44866820, 0xfeb2: 0x48c45020, 0xfeb3: 0x48c48e20, + 0xfeb4: 0x4486b220, 0xfeb5: 0x48c5b220, 0xfeb6: 0x42fef420, 0xfeb7: 0x48c67c20, + 0xfeb8: 0x42ff2a20, 0xfeb9: 0x42fff420, 0xfeba: 0x6c093820, 0xfebb: 0x48c9b420, + 0xfebc: 0x48ca4620, 0xfebd: 0x4300c020, 0xfebe: 0x48cb5020, 0xfebf: 0x6c27d620, + // Block 0x3fb, offset 0xfec0 + 0xfec0: 0x4866be20, 0xfec1: 0x4487aa20, 0xfec2: 0x6c009220, 0xfec3: 0x43020620, + 0xfec4: 0x44881620, 0xfec5: 0x6c281420, 0xfec6: 0x42b56a20, 0xfec7: 0x48cf4e20, + 0xfec8: 0x48cf6a20, 0xfec9: 0x48672620, 0xfeca: 0x48673820, 0xfecb: 0x6c286820, + 0xfecc: 0x43040820, 0xfecd: 0x6c08ea20, 0xfece: 0x4488d620, 0xfecf: 0x43052220, + 0xfed0: 0x6c00a420, 0xfed1: 0x6c091e20, 0xfed2: 0x42a56620, 0xfed3: 0x6c01e420, + 0xfed4: 0x6c13e220, 0xfed5: 0x6c020c20, 0xfed6: 0x6c050020, 0xfed7: 0x48d67820, + 0xfed8: 0x6c095620, 0xfed9: 0x43063a20, 0xfeda: 0x4306c620, 0xfedb: 0x43075a20, + 0xfedc: 0x6c28f220, 0xfedd: 0x6c292820, 0xfede: 0x4307ce20, 0xfedf: 0x6c0ea420, + 0xfee0: 0x4306a620, 0xfee1: 0x6c03f820, 0xfee2: 0x6c04e220, 0xfee3: 0x6c07cc20, + 0xfee4: 0x48d86c20, 0xfee5: 0x48dad620, 0xfee6: 0x48d9aa20, 0xfee7: 0x448a5620, + 0xfee8: 0x4309e220, 0xfee9: 0x4309e620, 0xfeea: 0x430a2c20, 0xfeeb: 0x48e79420, + 0xfeec: 0x430ac820, 0xfeed: 0x48de5820, 0xfeee: 0x448aba20, 0xfeef: 0x448ac220, + 0xfef0: 0x48df6220, 0xfef1: 0x48e1a420, 0xfef2: 0x448ad620, 0xfef3: 0x6c041420, + 0xfef4: 0x6c163c20, 0xfef5: 0x6c29de20, 0xfef6: 0x430cd220, 0xfef7: 0x6c29e620, + 0xfef8: 0x430d1020, 0xfef9: 0x430e1c20, 0xfefa: 0x430dc420, 0xfefb: 0x430ef220, + 0xfefc: 0x430e5020, 0xfefd: 0x430ed620, 0xfefe: 0x430f0c20, 0xfeff: 0x448bae20, + // Block 0x3fc, offset 0xff00 + 0xff00: 0x430fc220, 0xff01: 0x43100220, 0xff02: 0x448bf220, 0xff03: 0x4310c020, + 0xff04: 0x6c008220, 0xff05: 0x48ecce20, 0xff06: 0x4311ae20, 0xff07: 0x4311bc20, + 0xff08: 0x448c6a20, 0xff09: 0x4311f420, 0xff0a: 0x44697620, 0xff0b: 0x48f15c20, + 0xff0c: 0x48f2cc20, 0xff0d: 0x448d7c20, 0xff0e: 0x448d8e20, 0xff0f: 0x6c0bfe20, + 0xff10: 0x6c154e20, 0xff11: 0x6c1ede20, 0xff12: 0x6c2be420, 0xff13: 0x48f95020, + 0xff14: 0x6c035620, 0xff15: 0x6c2c1220, 0xff16: 0x431a3620, 0xff17: 0x6c03ca20, + 0xff18: 0x48fe5e20, 0xff19: 0x48100820, 0xff1a: 0x6c2c5420, 0xff1b: 0x431b7820, + 0xff1c: 0x431be020, 0xff1d: 0x4811bc20, 0xff1e: 0x431da820, 0xff1f: 0x6c155020, + 0xff20: 0x490ba420, 0xff21: 0x490bda20, 0xff22: 0x43212820, 0xff23: 0x4321e220, + 0xff24: 0x43222220, 0xff25: 0x490e5c20, 0xff26: 0x43223620, 0xff27: 0x43247020, + 0xff28: 0x4325ae20, 0xff29: 0x4325b020, 0xff2a: 0x4324f820, 0xff2b: 0x4327f220, + 0xff2c: 0x43282a20, 0xff2d: 0x4917f420, 0xff2e: 0x6c024a20, 0xff2f: 0x44932a20, + 0xff30: 0x432b6e20, 0xff31: 0x491aee20, 0xff32: 0x4493cc20, 0xff33: 0x432d8620, + 0xff34: 0x42bb6420, 0xff35: 0x432e4620, 0xff36: 0x49228a20, 0xff37: 0x49243420, + 0xff38: 0x4494dc20, 0xff39: 0x4494ec20, 0xff3a: 0x432fc020, 0xff3b: 0x49281420, + 0xff3c: 0x44956420, 0xff3d: 0x49292c20, 0xff3e: 0x43301620, 0xff3f: 0x43301620, + // Block 0x3fd, offset 0xff40 + 0xff40: 0x43305220, 0xff41: 0x492b6c20, 0xff42: 0x6c03d020, 0xff43: 0x44966620, + 0xff44: 0x43325220, 0xff45: 0x43334e20, 0xff46: 0x43338420, 0xff47: 0x4333fc20, + 0xff48: 0x44979c20, 0xff49: 0x49366020, 0xff4a: 0x43362420, 0xff4b: 0x43388020, + 0xff4c: 0x4339fa20, 0xff4d: 0x44999c20, 0xff4e: 0x4499da20, 0xff4f: 0x433ace20, + 0xff50: 0x49419c20, 0xff51: 0x4499f020, 0xff52: 0x49420a20, 0xff53: 0x49441c20, + 0xff54: 0x49452220, 0xff55: 0x6c145a20, 0xff56: 0x449aac20, 0xff57: 0x6c316420, + 0xff58: 0x433dfc20, 0xff59: 0x433e0a20, 0xff5a: 0x433e1e20, 0xff5b: 0x433e2c20, + 0xff5c: 0x6c125e20, 0xff5d: 0x494c0020, + // Block 0x3fe, offset 0xff80 + 0xff80: 0xe00014bd, 0xff81: 0x0033b483, 0xff82: 0x00339688, 0xff83: 0x0033a288, + 0xff84: 0x0033c288, 0xff85: 0x0033fc88, 0xff86: 0xca350071, 0xff87: 0x00343688, + 0xff88: 0x00344688, 0xff89: 0x00349a88, 0xff8a: 0x0034e488, 0xff8b: 0x00356288, + 0xff8c: 0x00356a88, 0xff8d: 0xe00014cf, 0xff8e: 0x00357a88, 0xff8f: 0x00365488, + 0xff90: 0xc0090041, 0xff91: 0x00335288, 0xff92: 0x00335a88, 0xff93: 0xc0130092, + 0xff94: 0x00338a88, 0xff95: 0xc34c0041, 0xff96: 0xc01c0071, 0xff97: 0xc0200071, + 0xff98: 0xc0250041, 0xff99: 0x00343e88, 0xff9a: 0xc0370092, 0xff9b: 0x00348488, + 0xff9c: 0x0034a888, 0xff9d: 0x0034ba88, 0xff9e: 0xc02e0071, 0xff9f: 0x00350e88, + 0xffa0: 0x00352888, 0xffa1: 0x00353a88, 0xffa2: 0x00354c88, 0xffa3: 0xc03e00f1, + 0xffa4: 0x0035ac88, 0xffa5: 0x0035b488, 0xffa6: 0x00360288, 0xffa7: 0xc0440071, + 0xffa8: 0x00365c88, 0xffa9: 0x00366688, 0xffaa: 0x00367488, 0xffab: 0xc0480071, + 0xffac: 0x00368e88, 0xffad: 0xc04c0071, 0xffae: 0x0036b888, 0xffaf: 0x0036c488, + 0xffb0: 0xc0060041, 0xffb1: 0x40335220, 0xffb2: 0x40335a20, 0xffb3: 0xc0100092, + 0xffb4: 0x40338a20, 0xffb5: 0xc3490041, 0xffb6: 0xc01a0071, 0xffb7: 0xc01e0071, + 0xffb8: 0xc0220041, 0xffb9: 0x40343e20, 0xffba: 0xc0340092, 0xffbb: 0x40348420, + 0xffbc: 0x4034a820, 0xffbd: 0x4034ba20, 0xffbe: 0xc02c0071, 0xffbf: 0x40350e20, + // Block 0x3ff, offset 0xffc0 + 0xffc0: 0x40352820, 0xffc1: 0x40353a20, 0xffc2: 0x40354c20, 0xffc3: 0xc03a00f1, + 0xffc4: 0x4035ac20, 0xffc5: 0x4035b420, 0xffc6: 0x40360220, 0xffc7: 0xc0420071, + 0xffc8: 0x40365c20, 0xffc9: 0x40366620, 0xffca: 0x40367420, 0xffcb: 0xc0460071, + 0xffcc: 0x40368e20, 0xffcd: 0xc04a0071, 0xffce: 0x4036b820, 0xffcf: 0x4036c420, + 0xffd0: 0xe00014ba, 0xffd1: 0x4033b420, 0xffd2: 0x40339620, 0xffd3: 0x4033a220, + 0xffd4: 0x4033c220, 0xffd5: 0x4033fc20, 0xffd6: 0xca330071, 0xffd7: 0x40343620, + 0xffd8: 0x40344620, 0xffd9: 0x40349a20, 0xffda: 0x4034e420, 0xffdb: 0x40356220, + 0xffdc: 0x40356a20, 0xffdd: 0xe00014cc, 0xffde: 0x40357a20, 0xffdf: 0x40365420, + 0xffe0: 0x0035e088, 0xffe1: 0x4035e020, 0xffe2: 0x00369e88, 0xffe3: 0x40369e20, + 0xffe4: 0x0036ce88, 0xffe5: 0x4036ce20, 0xffe6: 0x0036d688, 0xffe7: 0x4036d620, + 0xffe8: 0x0036ea88, 0xffe9: 0x4036ea20, 0xffea: 0x0036e088, 0xffeb: 0x4036e020, + 0xffec: 0x0036f488, 0xffed: 0x4036f420, 0xffee: 0x0036fc88, 0xffef: 0x4036fc20, + 0xfff0: 0x00370488, 0xfff1: 0x40370420, 0xfff2: 0x00370c88, 0xfff3: 0x40370c20, + 0xfff4: 0xc0500131, 0xfff5: 0xc04e0131, 0xfff6: 0x00371c88, 0xfff7: 0x40371c20, + 0xfff8: 0x0035a488, 0xfff9: 0x4035a420, 0xfffa: 0x0035fa88, 0xfffb: 0x4035fa20, + 0xfffc: 0x0035f288, 0xfffd: 0x4035f220, 0xfffe: 0x0035e888, 0xffff: 0x4035e820, + // Block 0x400, offset 0x10000 + 0x10000: 0x00352088, 0x10001: 0x40352020, 0x10002: 0x40070620, 0x10003: 0xae608302, + 0x10004: 0xae605f02, 0x10005: 0xae602a02, 0x10006: 0xae602202, 0x10007: 0xae605f02, + 0x10008: 0xa0000000, 0x10009: 0xa0000000, 0x1000a: 0x00341c88, 0x1000b: 0x40341c20, + 0x1000c: 0x00369688, 0x1000d: 0x40369620, 0x1000e: 0x00353088, 0x1000f: 0x40353020, + 0x10010: 0xe00014b7, 0x10011: 0xe00014b4, 0x10012: 0x00336a88, 0x10013: 0x40336a20, + 0x10014: 0x00337a88, 0x10015: 0x40337a20, 0x10016: 0x0033dc88, 0x10017: 0x4033dc20, + 0x10018: 0x0033aa88, 0x10019: 0x4033aa20, 0x1001a: 0x00345888, 0x1001b: 0x40345820, + 0x1001c: 0x00347888, 0x1001d: 0x40347820, 0x1001e: 0x00347088, 0x1001f: 0x40347020, + 0x10020: 0x00346888, 0x10021: 0x40346820, 0x10022: 0x0034ca88, 0x10023: 0x4034ca20, + 0x10024: 0x0034dc88, 0x10025: 0x4034dc20, 0x10026: 0x00351888, 0x10027: 0x40351820, + 0x10028: 0x00372688, 0x10029: 0x40372620, 0x1002a: 0x00354488, 0x1002b: 0x40354420, + 0x1002c: 0x00355888, 0x1002d: 0x40355820, 0x1002e: 0x00359c83, 0x1002f: 0x40359c20, + 0x10030: 0x00359a88, 0x10031: 0x40359a20, 0x10032: 0x0035cc88, 0x10033: 0x4035cc20, + 0x10034: 0x00360e88, 0x10035: 0x40360e20, 0x10036: 0x00362a88, 0x10037: 0x40362a20, + 0x10038: 0x00363a88, 0x10039: 0x40363a20, 0x1003a: 0x0035d488, 0x1003b: 0x4035d420, + 0x1003c: 0x00364488, 0x1003d: 0x40364420, 0x1003e: 0x00364c88, 0x1003f: 0x40364c20, + // Block 0x401, offset 0x10040 + 0x10040: 0xa0000000, 0x10041: 0xa0000000, 0x10042: 0xa0000000, 0x10043: 0xa0000000, + 0x10044: 0xa0000000, 0x10045: 0xa0000000, 0x10046: 0xa0000000, 0x10047: 0xa0000000, + 0x10048: 0xa0000000, 0x10049: 0x40020020, 0x1004a: 0x40020220, 0x1004b: 0x40020420, + 0x1004c: 0x40020620, 0x1004d: 0x40020820, 0x1004e: 0xa0000000, 0x1004f: 0xa0000000, + 0x10050: 0xa0000000, 0x10051: 0xa0000000, 0x10052: 0xa0000000, 0x10053: 0xa0000000, + 0x10054: 0xa0000000, 0x10055: 0xa0000000, 0x10056: 0xa0000000, 0x10057: 0xa0000000, + 0x10058: 0xa0000000, 0x10059: 0xa0000000, 0x1005a: 0xa0000000, 0x1005b: 0xa0000000, + 0x1005c: 0xa0000000, 0x1005d: 0xa0000000, 0x1005e: 0xa0000000, 0x1005f: 0xa0000000, + 0x10060: 0x40021220, 0x10061: 0x4002ba20, 0x10062: 0x4003e020, 0x10063: 0x4004ea20, + 0x10064: 0x4027de20, 0x10065: 0x4004ec20, 0x10066: 0x4004e620, 0x10067: 0x4003d220, + 0x10068: 0x4003f420, 0x10069: 0x4003f620, 0x1006a: 0x4004d820, 0x1006b: 0x40093820, + 0x1006c: 0x40024020, 0x1006d: 0x40021a20, 0x1006e: 0x4002e420, 0x1006f: 0x4004e220, + 0x10070: 0x4029cc20, 0x10071: 0x4029ce20, 0x10072: 0x4029d020, 0x10073: 0x4029d220, + 0x10074: 0x4029d420, 0x10075: 0x4029d620, 0x10076: 0x4029d820, 0x10077: 0x4029da20, + 0x10078: 0x4029dc20, 0x10079: 0x4029de20, 0x1007a: 0x40026c20, 0x1007b: 0x40026220, + 0x1007c: 0x40094020, 0x1007d: 0x40094220, 0x1007e: 0x40094420, 0x1007f: 0x4002c420, + // Block 0x402, offset 0x10080 + 0x10080: 0x4004d620, 0x10081: 0xca3c27b1, 0x10082: 0x002c0a88, 0x10083: 0x002c3a88, + 0x10084: 0x002c6288, 0x10085: 0xc39e0be1, 0x10086: 0x002d0888, 0x10087: 0x002d2288, + 0x10088: 0x002d6888, 0x10089: 0x002d9a88, 0x1008a: 0x002dcc88, 0x1008b: 0xca373ad1, + 0x1008c: 0xc0030002, 0x1008d: 0x002e8288, 0x1008e: 0x002e9e88, 0x1008f: 0xc3a30b21, + 0x10090: 0x002f2c88, 0x10091: 0x002f5688, 0x10092: 0x002f7a88, 0x10093: 0x002fe688, + 0x10094: 0x00302c88, 0x10095: 0xc3900b21, 0x10096: 0x0030be88, 0x10097: 0x0030e288, + 0x10098: 0x0030f688, 0x10099: 0x00310088, 0x1009a: 0x00312a88, 0x1009b: 0x4003f820, + 0x1009c: 0x4004e420, 0x1009d: 0x4003fa20, 0x1009e: 0x40062420, 0x1009f: 0x40021620, + 0x100a0: 0x40061e20, 0x100a1: 0xca3927b1, 0x100a2: 0x402c0a20, 0x100a3: 0x402c3a20, + 0x100a4: 0x402c6220, 0x100a5: 0xc39c0be1, 0x100a6: 0x402d0820, 0x100a7: 0x402d2220, + 0x100a8: 0x402d6820, 0x100a9: 0x402d9a20, 0x100aa: 0x402dcc20, 0x100ab: 0x402dfe20, + 0x100ac: 0xc0000002, 0x100ad: 0x402e8220, 0x100ae: 0x402e9e20, 0x100af: 0xc3a00b21, + 0x100b0: 0x402f2c20, 0x100b1: 0x402f5620, 0x100b2: 0x402f7a20, 0x100b3: 0x402fe620, + 0x100b4: 0x40302c20, 0x100b5: 0xc38d0b21, 0x100b6: 0x4030be20, 0x100b7: 0x4030e220, + 0x100b8: 0x4030f620, 0x100b9: 0x40310020, 0x100ba: 0x40312a20, 0x100bb: 0x4003fc20, + 0x100bc: 0x40094820, 0x100bd: 0x4003fe20, 0x100be: 0x40094c20, 0x100bf: 0xa0000000, + // Block 0x403, offset 0x100c0 + 0x100c0: 0xe0000983, 0x100c1: 0xe0000980, 0x100c2: 0xe00008fb, 0x100c3: 0xe00008f8, + 0x100c4: 0xe000097d, 0x100c5: 0xe000097a, 0x100c6: 0xe0000a38, 0x100c7: 0xe0000a35, + 0x100c8: 0xe0000a3e, 0x100c9: 0xe0000a3b, 0x100ca: 0xe0000a4a, 0x100cb: 0xe0000a47, + 0x100cc: 0xe0000a44, 0x100cd: 0xe0000a41, 0x100ce: 0xe0000a86, 0x100cf: 0xe0000a83, + 0x100d0: 0x002c62a3, 0x100d1: 0x402c6221, 0x100d2: 0xe0000b46, 0x100d3: 0xe0000b43, + 0x100d4: 0xe0000aee, 0x100d5: 0xe0000aeb, 0x100d6: 0xe0000b2c, 0x100d7: 0xe0000b29, + 0x100d8: 0x00320cc3, 0x100d9: 0x40320c22, 0x100da: 0xe0000b1a, 0x100db: 0xe0000b17, + 0x100dc: 0xe0000bb8, 0x100dd: 0xe0000bb5, 0x100de: 0xe0000bb2, 0x100df: 0xe0000baf, + 0x100e0: 0xe0000bc4, 0x100e1: 0xe0000bc1, 0x100e2: 0xe0000bca, 0x100e3: 0xe0000bc7, + 0x100e4: 0xe0000bee, 0x100e5: 0xe0000beb, 0x100e6: 0xe0000c1b, 0x100e7: 0xe0000c18, + 0x100e8: 0xe0000c51, 0x100e9: 0xe0000c4e, 0x100ea: 0xe0000c60, 0x100eb: 0xe0000c5d, + 0x100ec: 0xe0000c31, 0x100ed: 0xe0000c2e, 0x100ee: 0xe0000c5a, 0x100ef: 0xe0000c57, + 0x100f0: 0xe0000c54, 0x100f1: 0x402da220, 0x100f2: 0xf0000a0a, 0x100f3: 0xf0000404, + 0x100f4: 0xe0000c8a, 0x100f5: 0xe0000c87, 0x100f6: 0xe0000c9f, 0x100f7: 0xe0000c9c, + 0x100f8: 0x402f5621, 0x100f9: 0xe0000ccc, 0x100fa: 0xe0000cc9, 0x100fb: 0xe0000cd8, + 0x100fc: 0xe0000cd5, 0x100fd: 0xe0000cd2, 0x100fe: 0xe0000ccf, 0x100ff: 0xe0000d04, + // Block 0x404, offset 0x10100 + 0x10100: 0xca3f3ae1, 0x10101: 0xca413ae1, 0x10102: 0xca433ae1, 0x10103: 0xca453ae1, + 0x10104: 0xca473ae1, 0x10105: 0xca493ae1, 0x10106: 0xca4b3ae1, 0x10107: 0xca4d3ae1, + 0x10108: 0xca4f3ae1, 0x10109: 0xca513ae1, 0x1010a: 0xca533ae1, 0x1010b: 0xca553ae1, + 0x1010c: 0xca573ae1, 0x1010d: 0xca593ae1, 0x1010e: 0xca5b3ae1, 0x1010f: 0xca5d3ae1, + 0x10110: 0xca5f3ae1, 0x10111: 0xca613ae1, 0x10112: 0xca633ae1, 0x10113: 0xca653ae1, + 0x10114: 0xca673ae1, 0x10115: 0xca693ae1, 0x10116: 0xca6b3ae1, 0x10117: 0xca6d3ae1, + 0x10118: 0xca6f3ae1, 0x10119: 0xca713ae1, 0x1011a: 0xca733ae1, 0x1011b: 0xca773ae1, + 0x1011c: 0xca7d3ae1, 0x1011d: 0xca813ae1, 0x1011e: 0xca833ae1, 0x1011f: 0xca853ae1, + 0x10120: 0xca873ae1, 0x10121: 0xca893ae1, 0x10122: 0xca8b3ae1, 0x10123: 0xca8b3ae1, + 0x10124: 0xe00040cc, 0x10125: 0xe00040cf, 0x10126: 0xe00040d2, 0x10127: 0xe00040d5, + 0x10128: 0xe00040d8, 0x10129: 0xe00040dc, 0x1012a: 0xe00040df, 0x1012b: 0xca753ae1, + 0x1012c: 0xca793ae1, 0x1012d: 0xca7b3ae1, 0x1012e: 0xca7f3ae1, 0x1012f: 0xe00040e3, + 0x10130: 0xe00040e6, 0x10131: 0xe00040e9, 0x10132: 0xe00040ec, 0x10133: 0xe00040ef, + 0x10134: 0xa0000000, 0x10135: 0xa0000000, 0x10136: 0xca903b41, 0x10137: 0xca923b71, + 0x10138: 0x40501220, 0x10139: 0x40501420, 0x1013a: 0x40501620, 0x1013b: 0xca8d3b11, + 0x1013c: 0x40501a20, 0x1013d: 0x40501c20, 0x1013e: 0x40501e20, 0x1013f: 0x40502020, + // Block 0x405, offset 0x10140 + 0x10140: 0x40502220, 0x10141: 0xca943b71, 0x10142: 0x40502620, 0x10143: 0x40502820, + 0x10144: 0xca963b71, 0x10145: 0x40502c20, 0x10146: 0x40503020, 0x10147: 0x40503420, + 0x10148: 0xadc11802, 0x10149: 0xadc11b02, 0x1014a: 0xadc11c02, 0x1014b: 0xadc11a02, + 0x1014c: 0xa0005f02, 0x1014d: 0xadc11d02, 0x1014e: 0xadc11402, 0x1014f: 0xadc11502, + 0x10150: 0xadc11702, 0x10151: 0xadc11602, 0x10152: 0x82092817, 0x10153: 0xa0000000, + 0x10154: 0x40032620, 0x10155: 0x40032820, 0x10156: 0x4002ac20, 0x10157: 0x4027bc20, + 0x10158: 0xe000402c, 0x10159: 0x4005be20, 0x1015a: 0x4005c020, 0x1015b: 0x4027f620, + 0x1015c: 0x404fea20, 0x1015d: 0xadc11902, + 0x10160: 0xe00001b5, 0x10161: 0xe0000249, 0x10162: 0xe0000361, 0x10163: 0xe000043b, + 0x10164: 0xe0000510, 0x10165: 0xe00005da, 0x10166: 0xe00006a5, 0x10167: 0xe000074d, + 0x10168: 0xe00007f9, 0x10169: 0xe000089e, + 0x10170: 0xe00001b8, 0x10171: 0xe000024c, 0x10172: 0xe0000364, 0x10173: 0xe000043e, + 0x10174: 0xe0000513, 0x10175: 0xe00005dd, 0x10176: 0xe00006a8, 0x10177: 0xe0000750, + 0x10178: 0xe00007fc, 0x10179: 0xe00008a1, + // Block 0x406, offset 0x10180 + 0x10182: 0x40439020, 0x10183: 0x40439220, + 0x10185: 0x40437020, 0x10186: 0x40437220, 0x10187: 0x40437420, + 0x10188: 0x40437620, 0x10189: 0x40437820, 0x1018a: 0x40437a20, 0x1018b: 0x40437c20, + 0x1018c: 0x40438020, 0x1018e: 0x40438420, 0x1018f: 0x40438620, + 0x10190: 0x40438820, 0x10192: 0x40438a20, 0x10193: 0x40438c20, + 0x10194: 0x40438e20, 0x10195: 0x40439020, 0x10196: 0x40439220, 0x10197: 0x40439420, + 0x10198: 0x40439620, 0x10199: 0x40439820, 0x1019a: 0x40439a20, 0x1019b: 0x40439c20, + 0x1019c: 0x40439e20, 0x1019d: 0x4043a020, 0x1019e: 0x4043a220, 0x1019f: 0x4043a420, + 0x101a0: 0x4043a620, 0x101a1: 0x4043a820, 0x101a2: 0x4043aa20, 0x101a3: 0x4043ac20, + 0x101a4: 0x4043ae20, 0x101a5: 0x4043b020, 0x101a6: 0x4043b220, 0x101a7: 0x4043b420, + 0x101a8: 0x4043b620, 0x101aa: 0x4043b820, 0x101ab: 0x4043ba20, + 0x101ac: 0x4043bc20, 0x101ad: 0x4043be20, 0x101ae: 0x4043c020, 0x101af: 0x4043c220, + 0x101b0: 0x4043c420, 0x101b1: 0x4043c620, 0x101b2: 0x4043c820, 0x101b3: 0x4043d420, + 0x101b5: 0x4043ca20, 0x101b6: 0x4043cc20, 0x101b7: 0x4043ce20, + 0x101b8: 0x4043d020, 0x101b9: 0x4043d220, + 0x101bc: 0xa070f102, 0x101bd: 0x4043d820, 0x101be: 0x4043de20, 0x101bf: 0xc06a0311, + // Block 0x407, offset 0x101c0 + 0x101c0: 0x4043e220, 0x101c1: 0x4043e420, 0x101c2: 0x4043e620, 0x101c3: 0x4043e820, + 0x101c4: 0x4043ea20, 0x101c6: 0xc06c0341, 0x101c7: 0x4043f220, + 0x101c8: 0x4043f420, 0x101ca: 0xc0710311, 0x101cb: 0x4043f820, + 0x101cc: 0x4043fa20, 0x101cd: 0x820921fe, + 0x101d5: 0x4043fe20, 0x101d6: 0x40440020, + 0x101de: 0x4043d620, + 0x101e0: 0x40437e20, 0x101e1: 0x40438220, 0x101e2: 0x4043ec20, 0x101e3: 0x4043ee20, + 0x101e6: 0xe0000182, 0x101e7: 0xe0000213, + 0x101e8: 0xe000032e, 0x101e9: 0xe0000408, 0x101ea: 0xe00004dd, 0x101eb: 0xe00005a7, + 0x101ec: 0xe0000672, 0x101ed: 0xe000071a, 0x101ee: 0xe00007c6, 0x101ef: 0xe000086b, + 0x101f1: 0x40439420, 0x101f2: 0x40439620, + // Block 0x408, offset 0x10200 + 0x10200: 0xf0000404, 0x10201: 0xf0000404, 0x10202: 0xf0000404, 0x10203: 0xf0000404, + 0x10204: 0xf0000404, 0x10205: 0xf0000404, 0x10206: 0xf0000404, 0x10207: 0xf0000404, + 0x10208: 0xf0000404, 0x10209: 0xf0000404, 0x1020a: 0xf0000404, 0x1020b: 0xf0000404, + 0x1020c: 0xf0000404, 0x1020d: 0xf0000404, 0x1020e: 0xe000004c, 0x1020f: 0xe0000051, + 0x10210: 0xe0000056, 0x10211: 0xe000005b, 0x10212: 0xe0000060, 0x10213: 0xe0000065, + 0x10214: 0xe000006a, 0x10215: 0xe000006f, 0x10216: 0xe0000083, 0x10217: 0xe000008d, + 0x10218: 0xe0000092, 0x10219: 0xe0000097, 0x1021a: 0xe000009c, 0x1021b: 0xe00000a1, + 0x1021c: 0xe0000088, 0x1021d: 0xe0000074, 0x1021e: 0xe000007c, + 0x10220: 0xe0002c4c, 0x10221: 0xe0002c5c, 0x10222: 0xe0002c54, 0x10223: 0xe0002c8c, + 0x10224: 0xe0002c60, 0x10225: 0xe0002c74, 0x10226: 0xe0002c50, 0x10227: 0xe0002c70, + 0x10228: 0xe0002c58, 0x10229: 0xe0002c7c, 0x1022a: 0xe0002c9c, 0x1022b: 0xe0002cb0, + 0x1022c: 0xe0002cac, 0x1022d: 0xe0002ca4, 0x1022e: 0xe0002cd8, 0x1022f: 0xe0002c90, + 0x10230: 0xe0002c98, 0x10231: 0xe0002ca8, 0x10232: 0xe0002ca0, 0x10233: 0xe0002cbc, + 0x10234: 0xe0002c84, 0x10235: 0xe0002cb4, 0x10236: 0xe0002cd0, 0x10237: 0xe0002cc0, + 0x10238: 0xf0000404, 0x10239: 0xe0002c64, 0x1023a: 0xe0002c88, 0x1023b: 0xf0000404, + 0x1023c: 0xe0002cb8, 0x1023d: 0xe0002c68, 0x1023e: 0xe0002cd4, 0x1023f: 0xe0002c80, + // Block 0x409, offset 0x10240 + 0x10240: 0xe00084e8, 0x10241: 0xe0008adb, 0x10243: 0xe00099dc, + 0x10247: 0xe0005db9, + 0x10248: 0xe00086b0, 0x10249: 0xe0006bde, 0x1024a: 0xe0006c32, 0x1024b: 0xe0009f7f, + 0x1024d: 0xe000671b, + 0x10251: 0xe0009848, + 0x10254: 0xe00091d7, 0x10255: 0xe00068da, 0x10256: 0xe0006faa, + 0x10258: 0xe0004bdc, 0x10259: 0xe00065aa, + 0x1025e: 0xe0007350, 0x1025f: 0xe0008e99, + 0x10266: 0xe00065ee, + 0x1026b: 0xe0007570, + 0x1026d: 0xe0008f73, + 0x10270: 0xe0006703, 0x10271: 0xe0004a2b, 0x10272: 0xe0004978, + 0x10278: 0xe000a542, 0x10279: 0xe00052bc, 0x1027b: 0xe0008e21, + // Block 0x40a, offset 0x10280 + 0x10282: 0xe0007b75, 0x10283: 0xe00051a6, + 0x10285: 0xe0004bdf, + 0x1028b: 0xe0008fe7, + 0x1028d: 0xe0006a65, 0x1028e: 0xe000a3aa, 0x1028f: 0xe0009f73, + 0x10296: 0xe0004b04, + 0x10298: 0xe0007354, 0x10299: 0xe0008338, + 0x1029d: 0xe0004be2, 0x1029e: 0xe00044e6, 0x1029f: 0xe0007792, + 0x102a7: 0xe000569a, + 0x102ab: 0xe0004246, + 0x102ac: 0xe00044f6, 0x102ad: 0xe00055b3, + 0x102b3: 0xe00081a1, + 0x102b6: 0xe00066bf, 0x102b7: 0xe0006bca, + 0x102bc: 0xe0008f6f, 0x102be: 0xe000449e, + // Block 0x40b, offset 0x102c0 + 0x102c2: 0xe000573d, + 0x102c6: 0xe0005b2d, + 0x102c8: 0xe0007943, 0x102cb: 0xe0006a68, + 0x102cc: 0xe00083eb, 0x102ce: 0xe0007f58, 0x102cf: 0xe0007fb8, + 0x102d0: 0xe000806c, 0x102d1: 0xe000801c, 0x102d2: 0xe000a3ad, + 0x102d4: 0xe0007bea, 0x102d5: 0xe0008adf, + 0x102d8: 0xe0004fc5, 0x102d9: 0xe0004fd5, 0x102db: 0xe0006a6b, + 0x102de: 0xe000753a, 0x102df: 0xe0004ed5, + 0x102e1: 0xe0005e4d, 0x102e2: 0xe000a0d1, + 0x102e4: 0xe0004b58, 0x102e5: 0xe000a121, 0x102e6: 0xe000796d, + 0x102e8: 0xe000a313, 0x102eb: 0xe000a1a0, + 0x102ec: 0xe0004627, 0x102ed: 0xe0008ae3, 0x102ee: 0xe0005823, + 0x102f3: 0xe000629e, + 0x102f4: 0xe0007fbb, 0x102f6: 0xe00052c0, + 0x102f9: 0xe00061b8, 0x102fa: 0xe0008478, + // Block 0x40c, offset 0x10300 + 0x10300: 0xe0007527, 0x10301: 0xe000847c, + 0x10304: 0xe000991e, 0x10306: 0xe0006799, 0x10307: 0xe0004be5, + 0x1030a: 0xe0004f49, 0x1030b: 0xe00043d2, + 0x1030d: 0xe0008550, + 0x10314: 0xe0008564, 0x10315: 0xe0006a6e, 0x10316: 0xe0009a3d, 0x10317: 0xe00086b4, + 0x10318: 0xe000671e, 0x10319: 0xe0006de2, + 0x1031d: 0xe00055c3, 0x1031e: 0xe00084bc, 0x1031f: 0xe000948e, + 0x10321: 0xe000a869, 0x10323: 0xe0005450, + 0x10324: 0xe0005996, 0x10325: 0xe00083ee, + 0x1032e: 0xe0004149, + 0x10330: 0xe00076b9, 0x10332: 0xe0008f77, 0x10333: 0xe0006958, + 0x10335: 0xe0007c41, 0x10336: 0xe00044a2, 0x10337: 0xe00043d5, + 0x1033b: 0xe0008514, + 0x1033f: 0xe00063ea, + // Block 0x40d, offset 0x10340 + 0x10340: 0xe0008ddb, 0x10341: 0xe0004fdd, + 0x10349: 0xe000a0d5, 0x1034a: 0xe00083f1, 0x1034b: 0xe0004f91, + 0x1034d: 0xe0007bed, 0x1034e: 0xe0004fe0, 0x1034f: 0xe0006653, + 0x10350: 0xe00064c2, 0x10351: 0xe000a7e3, + 0x1036f: 0xe0006466, + 0x10370: 0xe0004809, + 0x10374: 0xe00062b6, 0x10376: 0xe000599a, + 0x10378: 0xe000744f, 0x1037a: 0xe0006a71, + 0x1037c: 0xe0006a74, 0x1037d: 0xe00040f2, + // Block 0x40e, offset 0x10380 + 0x10382: 0xe0008bb7, 0x10383: 0xe00088f7, + 0x10386: 0xe00052c4, 0x10387: 0xe00087f1, + 0x10388: 0xe0009df4, 0x10389: 0xe0004c7e, 0x1038b: 0xe000703d, + 0x1038d: 0xe000812c, 0x1038e: 0xe00087f4, 0x1038f: 0xe0008e24, + 0x10390: 0xe0008e03, 0x10391: 0xe0007f5b, 0x10393: 0xe000683a, + 0x10394: 0xe0008a8b, 0x10395: 0xe0009f82, 0x10396: 0xe0009f43, 0x10397: 0xe0009a67, + 0x10399: 0xe0007946, 0x1039a: 0xe00084ec, 0x1039b: 0xe0006886, + 0x1039c: 0xe0008600, 0x1039d: 0xe0004c81, 0x1039e: 0xe00051f3, 0x1039f: 0xe0009c48, + 0x103a9: 0xe0009cf2, 0x103aa: 0xe000a686, + 0x103af: 0xe00077ef, + 0x103b0: 0xe000646a, 0x103b3: 0xe00040f5, + 0x103b6: 0xe000510d, + 0x103b8: 0xe0004a77, 0x103b9: 0xe0004dff, 0x103ba: 0xe00088fb, 0x103bb: 0xe0008d05, + 0x103bc: 0xe0004ba3, 0x103bd: 0xe0009201, 0x103be: 0xe00084f0, 0x103bf: 0xe0006a77, + // Block 0x40f, offset 0x103c0 + 0x103c1: 0xe0007453, 0x103c3: 0xe00041ba, + 0x103c4: 0xe000913f, 0x103c6: 0xe0005801, + 0x103c8: 0xe000993a, 0x103c9: 0xe00049a0, 0x103ca: 0xe0004a8f, 0x103cb: 0xe0005a0e, + 0x103cd: 0xe0007380, 0x103cf: 0xe0008e27, + 0x103d1: 0xe00081a4, + 0x103d4: 0xe000600d, 0x103d6: 0xe0005c02, 0x103d7: 0xe0005607, + 0x103d8: 0xe00091da, 0x103da: 0xe00072cf, 0x103db: 0xe0004908, + 0x103dc: 0xe0008e9c, 0x103dd: 0xe0008394, + 0x103ee: 0xe0005fc5, 0x103ef: 0xe000a704, + 0x103f2: 0xe000911b, + 0x103f5: 0xe00099e8, 0x103f6: 0xe000586f, + 0x103fb: 0xe0009b2e, + 0x103ff: 0xe0009d46, + // Block 0x410, offset 0x10400 + 0x10401: 0xe0007fbe, 0x10402: 0xe000472b, 0x10403: 0xe000970a, + 0x10404: 0xe000753d, 0x10405: 0xe0004c84, + 0x10409: 0xe0007bf0, 0x1040a: 0xe0008ee3, + 0x1040c: 0xe000663e, 0x1040e: 0xe0008c7b, 0x1040f: 0xe0007040, + 0x10410: 0xe0005cc5, 0x10411: 0xe0007ed4, 0x10413: 0xe000462b, + 0x10414: 0xe000a22b, 0x10417: 0xe0007082, + 0x10418: 0xe000679c, 0x1041a: 0xe0005c7a, 0x1041b: 0xe0005f5e, + 0x1041d: 0xe000660e, 0x1041f: 0xe0006a7a, + 0x10420: 0xe000a2c7, 0x10421: 0xe0007457, 0x10423: 0xe0007c44, + 0x1042e: 0xe0007121, 0x1042f: 0xe0006721, + 0x10430: 0xe000a509, 0x10431: 0xe0004be8, 0x10433: 0xe0006421, + 0x10434: 0xe00094da, 0x10435: 0xe0009e7d, 0x10436: 0xe0007247, + 0x10438: 0xe00066c3, 0x1043a: 0xe00078f9, + 0x1043e: 0xe000695b, + // Block 0x411, offset 0x10440 + 0x10440: 0xe0009379, 0x10442: 0xe00065ae, + 0x10445: 0xe0007317, 0x10446: 0xe0005827, + 0x10449: 0xe0009321, 0x1044b: 0xe00043d8, + 0x1044d: 0xe000641e, 0x1044f: 0xe000724b, + 0x10451: 0xe0006127, 0x10452: 0xe000549e, + 0x10454: 0xe0004d6d, 0x10456: 0xe000a188, + 0x10458: 0xe000540c, 0x10459: 0xe000a707, 0x1045a: 0xe0008397, + 0x1045c: 0xe0009432, 0x1045e: 0xe000462f, 0x1045f: 0xe00091dd, + 0x10461: 0xe0009325, 0x10462: 0xe00095e2, 0x10463: 0xe000637a, + 0x10464: 0xe000993d, 0x10465: 0xe0004948, 0x10466: 0xe0004d99, 0x10467: 0xe0008d97, + 0x10468: 0xe0004444, 0x10469: 0xe00094de, 0x1046a: 0xe0007b78, 0x1046b: 0xe0005c06, + 0x1046c: 0xe0009a8e, 0x1046d: 0xe0007df7, 0x1046e: 0xe00056fe, + 0x10470: 0xe0005c72, + 0x1047b: 0xe0007795, + // Block 0x412, offset 0x10480 + 0x10483: 0xe00078b9, + 0x10484: 0xe000515e, 0x10487: 0xe00040f8, + 0x10488: 0xe000453a, 0x10489: 0xe000812f, 0x1048a: 0xe0007fc1, + 0x1048e: 0xe0007e15, 0x1048f: 0xe0009d4a, + 0x10493: 0xe00075c9, + 0x10495: 0xe000a124, 0x10496: 0xe0009204, + 0x10498: 0xe000421a, 0x1049a: 0xe0008e2a, + 0x1049c: 0xe0008ae7, + 0x104a0: 0xe0007e84, 0x104a2: 0xe00096b3, + 0x104a5: 0xe00044a6, + 0x104aa: 0xe0009f7b, + 0x104b0: 0xe0006ed6, 0x104b2: 0xe00073d4, + 0x104b4: 0xe000991a, 0x104b5: 0xe0008aeb, 0x104b6: 0xe0007f5e, + 0x104b8: 0xe0009c2d, + // Block 0x413, offset 0x104c0 + 0x104c0: 0xe0004b07, + 0x104c5: 0xe0006724, + 0x104cb: 0xe000438e, + 0x104cd: 0xe000637e, + 0x104d1: 0xe00044ea, 0x104d2: 0xe000a392, + 0x104d4: 0xe0004603, 0x104d6: 0xe000937d, + 0x104d8: 0xe0006b6a, 0x104d9: 0xe00068dd, 0x104da: 0xe000a6ec, 0x104db: 0xe0007f30, + 0x104dd: 0xe0009b5a, 0x104de: 0xe0006b19, + 0x104e2: 0xe000414c, + 0x104ec: 0xe000978e, 0x104ed: 0xe0007ed8, 0x104ee: 0xe0008d08, + 0x104f2: 0xe0007bf3, 0x104f3: 0xe00088ff, + 0x104f4: 0xe0004c87, 0x104f5: 0xe00093c5, 0x104f7: 0xe0006c36, + 0x104fd: 0xe0008740, 0x104fe: 0xe0004633, 0x104ff: 0xe00078d1, + // Block 0x414, offset 0x10500 + 0x10502: 0xe0005ba4, + 0x10504: 0xe0009ea7, 0x10505: 0xe0004ee5, + 0x10509: 0xe0009572, 0x1050a: 0xe0006de6, + 0x1050f: 0xe0006c3a, + 0x10511: 0xe0004b5b, + 0x10515: 0xe0006657, 0x10516: 0xe000a8b1, + 0x1051a: 0xe0005b30, 0x1051b: 0xe000509d, + 0x1051e: 0xe0008132, + 0x10522: 0xe00094e2, + 0x10525: 0xe0007e30, 0x10526: 0xe00097f4, 0x10527: 0xe0007358, + 0x10529: 0xe000a025, + 0x1052c: 0xe00096b6, 0x1052d: 0xe00092b9, 0x1052e: 0xe000560b, + 0x10535: 0xe0004392, + 0x10539: 0xe00040fb, 0x1053b: 0xe0006512, + 0x1053e: 0xe000770a, 0x1053f: 0xe0006a7d, + // Block 0x415, offset 0x10540 + 0x10540: 0xe000839a, 0x10541: 0xe0008ee7, 0x10542: 0xe0005233, 0x10543: 0xe00094e6, + 0x10544: 0xe00078a1, 0x10546: 0xe0004637, 0x10547: 0xe000a27b, + 0x10549: 0xe0004502, 0x1054b: 0xe000539c, + 0x10550: 0xe0006a11, 0x10552: 0xe00081a7, 0x10553: 0xe0005480, + 0x10554: 0xe0008e9f, 0x10555: 0xe0008c48, 0x10557: 0xe00083cd, + 0x10558: 0xe000911f, 0x1055a: 0xe0005f12, 0x1055b: 0xe000610c, + 0x1055c: 0xe00051f7, 0x1055f: 0xe0006c3e, + 0x10561: 0xe0005af4, 0x10562: 0xe00058a5, + 0x10564: 0xe0009e45, 0x10565: 0xe0008298, 0x10567: 0xe000927d, + 0x1056a: 0xe0007f61, 0x1056b: 0xe000a425, + 0x10571: 0xe0005ad8, 0x10572: 0xe00087f7, 0x10573: 0xe00092e1, + 0x10575: 0xe000724f, 0x10577: 0xe0005872, + 0x10579: 0xe0009281, 0x1057a: 0xe000512d, 0x1057b: 0xe0005410, + 0x1057c: 0xe00078fd, + // Block 0x416, offset 0x10580 + 0x10580: 0xe0007ce4, 0x10581: 0xe000829c, 0x10583: 0xe0008078, + 0x10584: 0xe000a317, 0x10585: 0xe00098a8, 0x10586: 0xe0008c7e, 0x10587: 0xe000a811, + 0x10588: 0xe0006dea, 0x10589: 0xe0004a93, 0x1058b: 0xe0004eb9, + 0x1058c: 0xe0009b86, 0x1058d: 0xe0005f32, 0x1058e: 0xe0009bdc, + 0x10592: 0xe0007540, + 0x10595: 0xe00073d7, 0x10597: 0xe0007a15, + 0x1059a: 0xe0005414, + 0x1059c: 0xe0005647, + 0x105a2: 0xe0004fc9, + 0x105a5: 0xe0008544, 0x105a7: 0xe00051a9, + 0x105a8: 0xe0008903, 0x105a9: 0xe000582b, 0x105aa: 0xe00081aa, 0x105ab: 0xe0009cde, + 0x105ac: 0xe000490c, 0x105ad: 0xe0005bf2, 0x105ae: 0xe000a377, + 0x105b1: 0xe0004910, + 0x105b5: 0xe00065b2, 0x105b6: 0xe0004fe3, 0x105b7: 0xe0004beb, + 0x105b8: 0xe0008907, + 0x105bc: 0xe00045eb, + // Block 0x417, offset 0x105c0 + 0x105c0: 0xe0004fe6, + 0x105c6: 0xe000793f, + 0x105c9: 0xe0007a8d, 0x105ca: 0xe00093ef, + 0x105cd: 0xe000878c, 0x105cf: 0xe00046db, + 0x105d2: 0xe0005fc8, 0x105d3: 0xe0004c8a, + 0x105d5: 0xe0005f36, 0x105d7: 0xe0007edc, + 0x105d8: 0xe000822b, + 0x105e0: 0xe00049eb, 0x105e3: 0xe0009911, + 0x105e4: 0xe00080e0, 0x105e5: 0xe0005f82, + 0x105ea: 0xe0005f22, + 0x105ec: 0xe00055c7, + 0x105f0: 0xe0006a55, 0x105f1: 0xe000a428, 0x105f2: 0xe00098c0, + 0x105f6: 0xe0007798, 0x105f7: 0xe0005813, + 0x105fd: 0xe0005946, + // Block 0x418, offset 0x10600 + 0x10604: 0xe0009417, 0x10605: 0xe000480c, 0x10606: 0xe0008eeb, + 0x10609: 0xe000582f, 0x1060a: 0xe0009616, 0x1060b: 0xe0008c81, + 0x1060c: 0xe0005c5a, 0x1060d: 0xe00055cb, + 0x10612: 0xe00083d0, + 0x10614: 0xe0009381, + 0x1061b: 0xe0005c4e, + 0x1061c: 0xe0005c4a, 0x1061d: 0xe0008384, 0x1061e: 0xe000a8b4, + 0x10620: 0xe0004e02, 0x10621: 0xe00064da, + 0x10629: 0xe0006056, + 0x1062d: 0xe0006a59, + 0x10630: 0xe000a5ce, 0x10631: 0xe00043db, 0x10633: 0xe00056c6, + 0x10634: 0xe0006a5d, 0x10636: 0xe000a815, + 0x10638: 0xe0009522, 0x10639: 0xe0007e33, 0x1063a: 0xe0009898, + 0x1063d: 0xe000a055, + // Block 0x419, offset 0x10640 + 0x10640: 0xe00054a1, 0x10641: 0xe0008d0b, 0x10643: 0xe0008480, + 0x10646: 0xe00067ee, 0x10647: 0xe0008a3b, + 0x10648: 0xe0007b7b, 0x1064a: 0xe00041be, + 0x1064e: 0xe000612b, + 0x10651: 0xe000a31b, 0x10653: 0xe0007db3, + 0x10656: 0xe0008124, 0x10657: 0xe000594a, + 0x1065d: 0xe0009662, + 0x10664: 0xe0009cb6, 0x10665: 0xe0006592, 0x10666: 0xe0004532, 0x10667: 0xe0004536, + 0x10669: 0xe0005c7d, 0x1066a: 0xe0006b6e, + 0x1066e: 0xe0004a67, + 0x10670: 0xe00054a4, 0x10671: 0xe0009385, 0x10672: 0xe0004e62, 0x10673: 0xe000480f, + 0x10676: 0xe0008c03, 0x10677: 0xe0007106, + 0x10678: 0xe0004d9d, 0x10679: 0xe000929d, 0x1067a: 0xe0008567, 0x1067b: 0xe0004176, + // Block 0x41a, offset 0x10680 + 0x10683: 0xe0009626, + 0x10684: 0xe00046df, 0x10687: 0xe00099b8, + 0x10689: 0xe0008e12, 0x1068a: 0xe0006b52, 0x1068b: 0xe0004ebd, + 0x1068c: 0xe0005779, 0x1068d: 0xe000890b, + 0x10694: 0xe0009436, 0x10695: 0xe000695e, 0x10696: 0xe0006727, 0x10697: 0xe0008668, + 0x1069a: 0xe0006b1c, 0x1069b: 0xe000432e, + 0x1069d: 0xe0006252, 0x1069e: 0xe00050a0, 0x1069f: 0xe000954a, + 0x106a1: 0xe0006ef6, + 0x106a9: 0xe0008554, 0x106aa: 0xe000890f, + 0x106af: 0xe000672a, + 0x106b2: 0xe000a049, + 0x106b4: 0xe000440b, 0x106b5: 0xe0009329, 0x106b7: 0xe0006b9a, + 0x106ba: 0xe0005cc8, + 0x106bd: 0xe0009e80, 0x106bf: 0xe0009665, + // Block 0x41b, offset 0x106c0 + 0x106c2: 0xe0004e05, 0x106c3: 0xe000a6a1, + 0x106c7: 0xe0004ec1, + 0x106c8: 0xe0006516, 0x106c9: 0xe0005bb9, + 0x106cd: 0xe0004506, + 0x106d1: 0xe0008c06, 0x106d2: 0xe000450a, 0x106d3: 0xe00083d3, + 0x106d7: 0xe0009285, + 0x106d8: 0xe0005d87, 0x106db: 0xe00058c6, + 0x106df: 0xe0004914, + 0x106e0: 0xe00040fe, 0x106e3: 0xe000594e, + 0x106e4: 0xe0004ee9, + 0x106e9: 0xe0008c84, 0x106ea: 0xe0005203, 0x106eb: 0xe0004526, + 0x106ec: 0xe0004c8d, 0x106ed: 0xe00096b9, + 0x106fe: 0xe000a178, + // Block 0x41c, offset 0x10700 + 0x10701: 0xe000463b, 0x10703: 0xe000633a, + 0x10705: 0xe00099bc, 0x10707: 0xe0007ee0, + 0x10709: 0xe0005f3a, + 0x1070c: 0xe0004dc1, 0x1070d: 0xe000463f, + 0x10712: 0xe0005c3e, + 0x10715: 0xe00055cf, 0x10716: 0xe0007ff4, + 0x10718: 0xe0004286, 0x10719: 0xe00060ca, 0x1071b: 0xe000a74c, + 0x1071d: 0xe000735c, 0x1071e: 0xe0005a23, 0x1071f: 0xe0005fcb, + 0x10720: 0xe0005bfe, 0x10721: 0xe0009eaa, 0x10722: 0xe0006fad, 0x10723: 0xe000887b, + 0x10724: 0xe0004eed, 0x10726: 0xe00096bc, + 0x10733: 0xe000a750, + 0x10735: 0xe0005875, + 0x10738: 0xe0004da1, 0x1073a: 0xe0008604, 0x1073b: 0xe0004e95, + 0x1073e: 0xe0004bee, 0x1073f: 0xe0006173, + // Block 0x41d, offset 0x10740 + 0x10741: 0xe0006157, 0x10742: 0xe00051b5, 0x10743: 0xe000440e, + 0x10745: 0xe0009df7, + 0x10748: 0xe000a819, 0x1074a: 0xe0004d29, + 0x1074c: 0xe000a0b5, 0x1074d: 0xe0009dfa, 0x1074f: 0xe0009dfd, + 0x10750: 0xe000665b, + 0x10755: 0xe00068e0, 0x10756: 0xe000a4df, 0x10757: 0xe00067ea, + 0x10759: 0xe0007383, + 0x10760: 0xe00086b8, 0x10761: 0xe0004a97, 0x10763: 0xe0004312, + 0x10767: 0xe000a2f7, + 0x1076a: 0xe00068e3, + 0x1076f: 0xe000a64a, + 0x10771: 0xe0004e08, + 0x10776: 0xe0004c90, + 0x10779: 0xe0009f1b, + 0x1077d: 0xe00078d5, 0x1077e: 0xe0009d6e, 0x1077f: 0xe00052a3, + // Block 0x41e, offset 0x10780 + 0x10780: 0xe0004bf1, 0x10781: 0xe000752b, 0x10783: 0xe0009492, + 0x10784: 0xe0008548, 0x10785: 0xe0006c16, 0x10787: 0xe0007360, + 0x10788: 0xe0007bf6, 0x10789: 0xe000a7b0, 0x1078a: 0xe00062ba, + 0x1078d: 0xe0005dbd, + 0x10791: 0xe00068e6, 0x10792: 0xe0008d8b, 0x10793: 0xe0009a92, + 0x10794: 0xe000a2cb, 0x10797: 0xe0005176, + 0x1079a: 0xe0006256, + 0x1079c: 0xe000665f, 0x1079e: 0xe0006556, + 0x107a0: 0xe0008a67, 0x107a1: 0xe000869c, + 0x107a6: 0xe0004aef, + 0x107a8: 0xe0006ea2, + 0x107ac: 0xe00076d5, 0x107ae: 0xe0009982, 0x107af: 0xe000609a, + 0x107b0: 0xe0008484, 0x107b1: 0xe0008135, 0x107b2: 0xe0007043, 0x107b3: 0xe0008f8b, + 0x107b4: 0xe000417a, 0x107b5: 0xe0005741, 0x107b7: 0xe0004da5, + 0x107b8: 0xe0006b1f, 0x107b9: 0xe000a80d, 0x107ba: 0xe0004f21, 0x107bb: 0xe00041a2, + 0x107bd: 0xe0008f87, 0x107be: 0xe00075cd, 0x107bf: 0xe0004643, + // Block 0x41f, offset 0x107c0 + 0x107c4: 0xe0007746, + 0x107d3: 0xe00076e9, + 0x107d6: 0xe00063ee, + 0x107d8: 0xe0005c80, 0x107da: 0xe000a70a, + 0x107dd: 0xe0008d0e, 0x107df: 0xe000807c, + 0x107e0: 0xe0009922, + 0x107e5: 0xe0004dd9, 0x107e6: 0xe0009f85, + 0x107ea: 0xe0004f25, + 0x107ed: 0xe0007a65, 0x107ee: 0xe00073da, + 0x107f2: 0xe00058a8, + 0x107f9: 0xe0004c93, 0x107fb: 0xe0004447, + // Block 0x420, offset 0x10800 + 0x10803: 0xe00092bd, + 0x10805: 0xe00092e5, + 0x10808: 0xe0007f64, 0x10809: 0xe00091e0, 0x1080a: 0xe0004f95, 0x1080b: 0xe0007f67, + 0x1080d: 0xe00062be, + 0x10814: 0xe0007217, 0x10816: 0xe00098e7, 0x10817: 0xe0007124, + 0x1081b: 0xe00062c2, + 0x1081f: 0xe00071d8, + 0x10821: 0xe0007b7e, 0x10822: 0xe000974e, 0x10823: 0xe0004bf4, + 0x10824: 0xe0004797, 0x10825: 0xe0004bf7, 0x10826: 0xe00059da, + 0x10828: 0xe0005516, 0x10829: 0xe000479a, 0x1082a: 0xe0008fea, 0x1082b: 0xe0004e35, + 0x1082c: 0xe0006fce, 0x1082d: 0xe0009ce2, 0x1082e: 0xe0008bbb, 0x1082f: 0xe0004101, + 0x10830: 0xe0009b89, 0x10831: 0xe0009143, 0x10832: 0xe0006a80, 0x10833: 0xe0007f6a, + 0x10834: 0xe0004c96, 0x10835: 0xe0009c8c, 0x10836: 0xe000a2fb, + 0x10838: 0xe0006a83, + // Block 0x421, offset 0x10840 + 0x10841: 0xe0007fc4, 0x10843: 0xe000a859, + 0x10844: 0xe000417e, + 0x10848: 0xe000a099, 0x10849: 0xe0005111, 0x1084a: 0xe000887f, 0x1084b: 0xe000974a, + 0x1084c: 0xe00055d3, 0x1084d: 0xe0005f86, 0x1084e: 0xe000a70d, 0x1084f: 0xe0005c83, + 0x10850: 0xe0009bdf, 0x10851: 0xe000a1a4, + 0x1085b: 0xe0004d39, + 0x1085d: 0xe0005cef, 0x1085f: 0xe0008340, + 0x10860: 0xe0009dca, + 0x10866: 0xe000672d, + 0x10869: 0xe00067f2, 0x1086b: 0xe000a059, + 0x1086c: 0xe0008304, 0x1086e: 0xe000899b, + 0x10873: 0xe0007bfc, + 0x10876: 0xe000526f, + 0x10878: 0xe000a88d, 0x10879: 0xe00098ea, 0x1087b: 0xe000612f, + 0x1087c: 0xe000a710, 0x1087d: 0xe000a72b, 0x1087e: 0xe0007bf9, + // Block 0x422, offset 0x10880 + 0x10880: 0xe0009fa9, 0x10882: 0xe0005878, + 0x10886: 0xe0005ebf, + 0x10888: 0xe0008aef, 0x1088a: 0xe000479d, + 0x1088e: 0xe000946a, + 0x10891: 0xe0009aea, + 0x1089d: 0xe0007762, + 0x108a2: 0xe0005291, + 0x108a4: 0xe00059de, 0x108a6: 0xe000822e, + 0x108a8: 0xe0008e36, 0x108aa: 0xe0008e33, 0x108ab: 0xe00095e6, + 0x108b0: 0xe00085b2, 0x108b1: 0xe00047a0, 0x108b3: 0xe000617f, + 0x108b5: 0xe0004104, 0x108b6: 0xe0005215, + 0x108bb: 0xe000745b, + 0x108bc: 0xe000a3b0, 0x108bd: 0xe0005f8a, 0x108bf: 0xe0004474, + // Block 0x423, offset 0x108c0 + 0x108c0: 0xe00087fa, + 0x108c4: 0xe00055bb, 0x108c6: 0xe0009e00, 0x108c7: 0xe0009f47, + 0x108cb: 0xe0006b22, + 0x108cc: 0xe000a4e2, 0x108cd: 0xe000a157, 0x108ce: 0xe0004bfa, 0x108cf: 0xe0007b45, + 0x108d0: 0xe0006730, + 0x108d6: 0xe000414f, + 0x108e0: 0xe00091b3, 0x108e2: 0xe00075d1, + 0x108e4: 0xe0009a40, 0x108e5: 0xe000a8ed, + 0x108e8: 0xe000856a, 0x108eb: 0xe0008fed, + 0x108ec: 0xe0004b5e, 0x108ef: 0xe00041a6, + 0x108f3: 0xe000a127, + 0x108f8: 0xe000a05d, 0x108fb: 0xe000a7f2, + 0x108fc: 0xe0004af8, 0x108fd: 0xe0008488, 0x108ff: 0xe0008433, + // Block 0x424, offset 0x10900 + 0x10900: 0xe00076ec, 0x10901: 0xe0009ece, 0x10902: 0xe00074ab, 0x10903: 0xe000560f, + 0x10904: 0xe000a4a3, 0x10906: 0xe0009985, 0x10907: 0xe0007d50, + 0x10908: 0xe000a09d, 0x10909: 0xe000878f, + 0x10921: 0xe0008080, + 0x10925: 0xe0004107, 0x10926: 0xe0007573, + 0x10928: 0xe0009668, 0x10929: 0xe0005ccb, + 0x1092d: 0xe0004860, 0x1092e: 0xe000a6c5, + 0x10931: 0xe0006366, 0x10932: 0xe0009526, + 0x1093a: 0xe0009e03, + 0x1093d: 0xe00046e3, 0x1093f: 0xe0004152, + // Block 0x425, offset 0x10940 + 0x10944: 0xe0009cf5, 0x10946: 0xe0006a86, 0x10947: 0xe000908f, + 0x10949: 0xe000770d, + 0x1094e: 0xe0005c86, 0x1094f: 0xe000a8f0, + 0x10950: 0xe00053e0, + 0x10954: 0xe0007c47, + 0x1095c: 0xe0005e29, + 0x1096b: 0xe0004f7d, + 0x1096e: 0xe00071db, 0x1096f: 0xe00081ad, + 0x10971: 0xe000932d, 0x10973: 0xe00058ab, + 0x10975: 0xe000765d, + 0x1097c: 0xe0006c1a, 0x1097e: 0xe0009a43, + // Block 0x426, offset 0x10980 + 0x10980: 0xe0007710, 0x10982: 0xe0005261, + 0x10984: 0xe0009a96, 0x10986: 0xe0006c42, + 0x1098f: 0xe0006133, + 0x10993: 0xe000472e, + 0x10996: 0xe0005358, 0x10997: 0xe00053a0, + 0x1099c: 0xe000954e, 0x1099e: 0xe0007543, + 0x109a3: 0xe000a061, + 0x109bb: 0xe00073dd, + 0x109bc: 0xe0008c09, 0x109bd: 0xe000767d, 0x109be: 0xe00097f7, + // Block 0x427, offset 0x109c0 + 0x109c0: 0xe0004420, 0x109c1: 0xe0007d14, 0x109c3: 0xe000518a, + 0x109c4: 0xe0006dee, 0x109c6: 0xe000952a, 0x109c7: 0xe00056e6, + 0x109c9: 0xe000a713, 0x109ca: 0xe000a065, 0x109cb: 0xe00095ea, + 0x109d1: 0xe0008358, 0x109d3: 0xe0007e87, + 0x109d4: 0xe00075d5, + 0x109d8: 0xe0009496, 0x109d9: 0xe000a7b3, 0x109da: 0xe000a546, + 0x109dc: 0xe000a8b7, 0x109dd: 0xe000424a, 0x109de: 0xe0008f8f, 0x109df: 0xe0008177, + 0x109e3: 0xe000a72e, + 0x109e4: 0xe000a62e, 0x109e7: 0xe000a794, + 0x109e8: 0xe0005857, 0x109e9: 0xe00081b0, 0x109ea: 0xe0006c46, 0x109eb: 0xe0005129, + 0x109ec: 0xe0004b61, 0x109ee: 0xe00052c8, + 0x109f0: 0xe0007443, + // Block 0x428, offset 0x10a00 + 0x10a05: 0xe000a716, 0x10a07: 0xe0006cde, + 0x10a09: 0xe0007046, + 0x10a11: 0xe000a0b9, + 0x10a14: 0xe0009093, + 0x10a1a: 0xe0007bff, 0x10a1b: 0xe0004607, + 0x10a1c: 0xe0004fe9, 0x10a1f: 0xe00091e3, + 0x10a20: 0xe0005735, 0x10a22: 0xe0007ce8, 0x10a23: 0xe0006a89, + 0x10a24: 0xe0009940, + 0x10a37: 0xe0007c4a, + 0x10a3d: 0xe0007127, 0x10a3e: 0xe0008e39, 0x10a3f: 0xe0009b42, + // Block 0x429, offset 0x10a40 + 0x10a44: 0xe0004ba6, 0x10a46: 0xe0009aee, + 0x10a48: 0xe0008d11, 0x10a49: 0xe000410a, + 0x10a4c: 0xe0009ead, 0x10a4d: 0xe0005ba7, 0x10a4e: 0xe000763d, + 0x10a50: 0xe0004ba9, 0x10a52: 0xe000a395, + 0x10a54: 0xe0004bfd, 0x10a56: 0xe00093ff, 0x10a57: 0xe0006c4a, + 0x10a69: 0xe000a50c, + 0x10a6c: 0xe0009797, 0x10a6f: 0xe0006fd1, + 0x10a72: 0xe0008c87, + 0x10a74: 0xe00098ed, 0x10a76: 0xe0007386, 0x10a77: 0xe000a42b, + 0x10a78: 0xe000610f, 0x10a79: 0xe0005b51, 0x10a7b: 0xe000a8f3, + 0x10a7f: 0xe0006123, + // Block 0x42a, offset 0x10a80 + 0x10a81: 0xe0007c4d, 0x10a82: 0xe0008f2f, + 0x10a89: 0xe00053a4, 0x10a8b: 0xe0009be8, + 0x10a8d: 0xe00096bf, 0x10a8e: 0xe0007a61, 0x10a8f: 0xe000a89d, + 0x10a93: 0xe000a1c8, + 0x10aa4: 0xe0004f81, 0x10aa5: 0xe0005237, + 0x10aa8: 0xe0004fec, 0x10aa9: 0xe00075d9, 0x10aaa: 0xe0008d14, 0x10aab: 0xe000a8ba, + 0x10aac: 0xe0006d6c, 0x10aad: 0xe0004bac, 0x10aaf: 0xe0007713, + 0x10ab2: 0xe0009a37, + 0x10ab4: 0xe00067f6, 0x10ab6: 0xe000426e, + 0x10ab8: 0xe0009bec, 0x10aba: 0xe00074af, + // Block 0x42b, offset 0x10ac0 + 0x10ac0: 0xe00051fb, + 0x10ac4: 0xe000a6a9, 0x10ac6: 0xe000a6c8, 0x10ac7: 0xe0009fac, + 0x10acf: 0xe0009641, + 0x10ad9: 0xe0004baf, 0x10ada: 0xe0008308, + 0x10ae5: 0xe00079a1, + 0x10aec: 0xe00069d9, 0x10aee: 0xe000a1a8, + 0x10af3: 0xe000487c, + 0x10af4: 0xe0007901, 0x10af6: 0xe0007782, + 0x10afc: 0xe0008608, + // Block 0x42c, offset 0x10b00 + 0x10b00: 0xe000899f, 0x10b01: 0xe0006f3e, 0x10b02: 0xe000a6ef, 0x10b03: 0xe00086a0, + 0x10b08: 0xe0007bb1, 0x10b09: 0xe0005701, 0x10b0a: 0xe000519a, + 0x10b0d: 0xe000a8bd, + 0x10b11: 0xe000970e, + 0x10b1a: 0xe000712a, 0x10b1b: 0xe0006a8c, + 0x10b1e: 0xe000a64d, 0x10b1f: 0xe00074b3, + 0x10b20: 0xe000848c, + 0x10b26: 0xe0007a19, + 0x10b2b: 0xe000a49f, + 0x10b2e: 0xe0007d53, + 0x10b30: 0xe0004890, + 0x10b37: 0xe0004ead, + 0x10b39: 0xe000599e, 0x10b3a: 0xe00047a3, + 0x10b3f: 0xe0008231, + // Block 0x42d, offset 0x10b40 + 0x10b41: 0xe000830c, 0x10b42: 0xe000a47f, 0x10b43: 0xe0009e06, + 0x10b44: 0xe0007877, + 0x10b48: 0xe0004da9, 0x10b49: 0xe0007895, 0x10b4a: 0xe000961a, 0x10b4b: 0xe0004d11, + 0x10b4d: 0xe0008138, + 0x10b52: 0xe0008088, 0x10b53: 0xe0008084, + 0x10b56: 0xe00054a7, + 0x10b58: 0xe00052cc, + 0x10b5c: 0xe00080e4, 0x10b5f: 0xe0009be2, + 0x10b65: 0xe0005a9c, + 0x10b68: 0xe0008792, + 0x10b6c: 0xe0007c50, 0x10b6d: 0xe0004e38, 0x10b6e: 0xe0006961, + 0x10b70: 0xe0008ff0, + 0x10b7b: 0xe0004fef, + 0x10b7e: 0xe0004fad, + // Block 0x42e, offset 0x10b80 + 0x10b80: 0xe0008ff3, 0x10b82: 0xe0009cba, + 0x10b87: 0xe0004e99, + 0x10b8a: 0xe0006382, + 0x10b8c: 0xe000683e, 0x10b8d: 0xe000535c, 0x10b8e: 0xe000428a, 0x10b8f: 0xe0006457, + 0x10b90: 0xe0008e06, 0x10b91: 0xe0004428, + 0x10ba1: 0xe0009c5c, + 0x10ba4: 0xe0004894, 0x10ba6: 0xe0009af2, 0x10ba7: 0xe000946e, + 0x10ba8: 0xe0008436, 0x10ba9: 0xe00042d6, 0x10baa: 0xe0009d9e, + 0x10bae: 0xe0005456, 0x10baf: 0xe000645a, + 0x10bb0: 0xe0004647, 0x10bb1: 0xe00076d9, 0x10bb3: 0xe0007e8a, + 0x10bb5: 0xe0004c00, 0x10bb7: 0xe0004155, + 0x10bb8: 0xe0004c99, 0x10bbb: 0xe000904a, + 0x10bbc: 0xe0009a9a, + // Block 0x42f, offset 0x10bc0 + 0x10bc2: 0xe000712d, + 0x10bc8: 0xe0005453, 0x10bcb: 0xe000a31f, + 0x10bcc: 0xe0005613, + 0x10bd3: 0xe000a12a, + 0x10bd5: 0xe000a731, + 0x10bde: 0xe0009a6a, + 0x10be0: 0xe00082e8, 0x10be2: 0xe0004c03, 0x10be3: 0xe000808c, + 0x10be4: 0xe000917b, + 0x10bf8: 0xe0007db7, + 0x10bfd: 0xe0008310, + // Block 0x430, offset 0x10c00 + 0x10c03: 0xe00076ef, + 0x10c06: 0xe00041aa, 0x10c07: 0xe0007ee4, + 0x10c08: 0xe0008eef, 0x10c09: 0xe000a2ff, 0x10c0b: 0xe0005e95, + 0x10c0e: 0xe0006f5a, 0x10c0f: 0xe0007a1d, + 0x10c11: 0xe0009552, 0x10c12: 0xe0005781, + 0x10c1c: 0xe00077b0, 0x10c1f: 0xe0007971, + 0x10c20: 0xe0006733, + 0x10c24: 0xe0006964, + 0x10c2d: 0xe0009bb0, + 0x10c30: 0xe00093c8, 0x10c33: 0xe00042da, + 0x10c34: 0xe0007407, 0x10c37: 0xe000919b, + 0x10c39: 0xe0006424, 0x10c3a: 0xe0004ff2, 0x10c3b: 0xe0008f33, + 0x10c3c: 0xe0004ff5, 0x10c3d: 0xe0007049, + // Block 0x431, offset 0x10c40 + 0x10c40: 0xe0004d5d, 0x10c42: 0xe00053e4, 0x10c43: 0xe00048b8, + 0x10c45: 0xe0004577, 0x10c46: 0xe0009c18, + 0x10c48: 0xe0004332, 0x10c49: 0xe0008288, 0x10c4a: 0xe0007591, 0x10c4b: 0xe00068ce, + 0x10c57: 0xe00055bf, + 0x10c59: 0xe00084c0, + 0x10c5d: 0xe00049a3, 0x10c5e: 0xe00095ba, + 0x10c60: 0xe000a734, 0x10c61: 0xe0006611, 0x10c63: 0xe0007fc7, + 0x10c64: 0xe0008c0c, 0x10c66: 0xe0004773, 0x10c67: 0xe00079a5, + 0x10c6a: 0xe000428e, + 0x10c6f: 0xe0007e36, + 0x10c70: 0xe00078bd, 0x10c71: 0xe0006614, + 0x10c74: 0xe00086bc, 0x10c75: 0xe00054aa, + 0x10c7a: 0xe0004731, + // Block 0x432, offset 0x10c80 + 0x10c80: 0xe00065f2, + 0x10c89: 0xe0009472, 0x10c8a: 0xe0004b0a, 0x10c8b: 0xe0007ad9, + 0x10c8c: 0xe0009b5e, 0x10c8d: 0xe0007378, 0x10c8f: 0xe00043de, + 0x10c90: 0xe000704c, 0x10c91: 0xe0006fd4, 0x10c92: 0xe00073e0, + 0x10c94: 0xe0009b4e, 0x10c97: 0xe00054ad, + 0x10c98: 0xe00053e8, 0x10c99: 0xe0004812, 0x10c9a: 0xe0009752, + 0x10c9e: 0xe0006cd2, + 0x10ca1: 0xe0008913, 0x10ca2: 0xe0007c02, + 0x10ca4: 0xe000a754, + 0x10ca9: 0xe0007a91, + 0x10cb5: 0xe0009097, + 0x10cb9: 0xe00092c1, + 0x10cbc: 0xe0008917, 0x10cbd: 0xe0006cae, 0x10cbe: 0xe000721b, + // Block 0x433, offset 0x10cc0 + 0x10cc0: 0xe000904d, 0x10cc1: 0xe0005e05, 0x10cc3: 0xe000464b, + 0x10cc5: 0xe0006d12, + 0x10cc9: 0xe0007ee8, 0x10cca: 0xe0008a8f, + 0x10ccd: 0xe00050a3, + 0x10cd0: 0xe0004f29, 0x10cd3: 0xe000609d, + 0x10cdc: 0xe00097af, 0x10cdd: 0xe0007e8d, 0x10cde: 0xe0008faf, 0x10cdf: 0xe000a1cb, + 0x10ce1: 0xe0006e62, 0x10ce3: 0xe0006697, + 0x10ce8: 0xe000611b, 0x10ce9: 0xe000557f, 0x10ceb: 0xe0008f37, + 0x10cee: 0xe0009a46, + 0x10cf0: 0xe00053a8, 0x10cf1: 0xe00056ca, 0x10cf3: 0xe00067fa, + 0x10cfa: 0xe0007c05, 0x10cfb: 0xe00086c0, + 0x10cfe: 0xe00041c2, + // Block 0x434, offset 0x10d00 + 0x10d01: 0xe000651a, 0x10d03: 0xe0004396, + 0x10d05: 0xe0007cf0, 0x10d07: 0xe00052d0, + 0x10d0e: 0xe000a758, + 0x10d11: 0xe0009fc1, 0x10d13: 0xe00076a9, + 0x10d14: 0xe0005519, 0x10d15: 0xe000a3b3, + 0x10d18: 0xe0005b7d, 0x10d19: 0xe0004a9b, 0x10d1a: 0xe0005a56, + 0x10d1c: 0xe00053ac, 0x10d1d: 0xe0008234, 0x10d1e: 0xe0004b0d, 0x10d1f: 0xe0005abc, + 0x10d24: 0xe00077f3, + 0x10d2b: 0xe0006a8f, + 0x10d2c: 0xe0008518, 0x10d2f: 0xe00086c4, + 0x10d39: 0xe00084f4, 0x10d3a: 0xe000a3b6, 0x10d3b: 0xe0006d15, + 0x10d3d: 0xe0007130, + // Block 0x435, offset 0x10d40 + 0x10d46: 0xe0006707, + 0x10d48: 0xe00087bf, + 0x10d4f: 0xe0009f88, + 0x10d50: 0xe000a363, + 0x10d54: 0xe0004ff8, 0x10d55: 0xe0006d8a, 0x10d56: 0xe0007e06, + 0x10d59: 0xe000721f, 0x10d5a: 0xe00052b3, + 0x10d5c: 0xe000779b, + 0x10d62: 0xe0006066, + 0x10d64: 0xe00084c4, 0x10d65: 0xe00049a6, 0x10d67: 0xe0005459, + 0x10d69: 0xe000949a, 0x10d6a: 0xe0009b8c, 0x10d6b: 0xe0006736, + 0x10d6c: 0xe0009a3a, 0x10d6d: 0xe0007e39, 0x10d6e: 0xe00076bd, 0x10d6f: 0xe000a10d, + 0x10d71: 0xe00074d3, + 0x10d77: 0xe00083f4, + 0x10d78: 0xe00049a9, + 0x10d7e: 0xe000a2cf, + // Block 0x436, offset 0x10d80 + 0x10d84: 0xe0007905, 0x10d87: 0xe0004ffb, + 0x10d88: 0xe00051ac, 0x10d89: 0xe00066c7, + 0x10d8e: 0xe0004e3b, 0x10d8f: 0xe0008e3c, + 0x10d90: 0xe000a54a, 0x10d91: 0xe0004734, 0x10d93: 0xe0009207, + 0x10d94: 0xe00067fe, 0x10d95: 0xe000a20b, 0x10d97: 0xe0009c30, + 0x10d98: 0xe0008744, 0x10d9a: 0xe000a12d, + 0x10da0: 0xe000891b, 0x10da2: 0xe0006a92, + 0x10da7: 0xe0007c08, + 0x10da9: 0xe000597e, 0x10daa: 0xe0009b26, 0x10dab: 0xe00082a0, + 0x10dac: 0xe00086c8, 0x10dad: 0xe0006d8e, 0x10dae: 0xe0006802, + 0x10db3: 0xe00051c4, + 0x10db4: 0xe0005206, 0x10db6: 0xe00051b8, + 0x10db8: 0xe00041c6, + 0x10dbd: 0xe000a3b9, + // Block 0x437, offset 0x10dc0 + 0x10dc2: 0xe0007949, 0x10dc3: 0xe00068e9, + 0x10dc4: 0xe0005e51, + 0x10dca: 0xe000851c, + 0x10dd1: 0xe0009c8f, 0x10dd2: 0xe0009c3f, 0x10dd3: 0xe0004ffe, + 0x10dd6: 0xe0007e3c, 0x10dd7: 0xe0004f4d, + 0x10dd9: 0xe00060a0, + 0x10ddd: 0xe0008748, + 0x10de3: 0xe0006967, + 0x10de5: 0xe0009a49, 0x10de7: 0xe0007dbb, + 0x10de8: 0xe0006386, + 0x10dec: 0xe0009c33, 0x10def: 0xe0009878, + 0x10df2: 0xe0005344, + 0x10df9: 0xe0005e98, 0x10dfb: 0xe000941a, + 0x10dfe: 0xe00095be, + // Block 0x438, offset 0x10e00 + 0x10e03: 0xe0008af3, + 0x10e06: 0xe0005fce, + 0x10e08: 0xe00059e2, 0x10e09: 0xe000856d, 0x10e0b: 0xe0007389, + 0x10e0d: 0xe0006b9e, + 0x10e10: 0xe00087fd, 0x10e11: 0xe00047a6, 0x10e12: 0xe0006b25, 0x10e13: 0xe0006f5e, + 0x10e14: 0xe000813b, + 0x10e19: 0xe0008520, 0x10e1a: 0xe0007e3f, + 0x10e1c: 0xe0004336, 0x10e1d: 0xe0008e2d, 0x10e1e: 0xe000511d, + 0x10e23: 0xe0004bb2, + 0x10e24: 0xe0004c9c, 0x10e25: 0xe0006010, 0x10e26: 0xe00041ca, + 0x10e28: 0xe00083f7, 0x10e2a: 0xe0009147, + 0x10e2c: 0xe000a8c0, 0x10e2e: 0xe000a0d9, + 0x10e38: 0xe00079a9, 0x10e3a: 0xe00074b7, 0x10e3b: 0xe0008490, + 0x10e3f: 0xe0008570, + // Block 0x439, offset 0x10e40 + 0x10e41: 0xe000813e, 0x10e43: 0xe0007dfa, + 0x10e49: 0xe0006a61, + 0x10e51: 0xe0006a95, 0x10e53: 0xe00061bb, + 0x10e58: 0xe000519e, 0x10e59: 0xe000a367, 0x10e5b: 0xe0007c0b, + 0x10e5c: 0xe0005130, 0x10e5f: 0xe00079ad, + 0x10e60: 0xe000745f, 0x10e63: 0xe0008c4b, + 0x10e65: 0xe0007546, 0x10e67: 0xe0009bb3, + 0x10e69: 0xe0005dc1, + 0x10e6d: 0xe0007716, + 0x10e75: 0xe00097fa, 0x10e76: 0xe00098f0, + 0x10e7c: 0xe0009331, 0x10e7f: 0xe0007576, + // Block 0x43a, offset 0x10e80 + 0x10e80: 0xe0007579, 0x10e81: 0xe0005b80, + 0x10e86: 0xe0009c5f, + 0x10e89: 0xe0007d6b, + 0x10e8c: 0xe0007253, + 0x10e90: 0xe0007d56, + 0x10e9a: 0xe000a467, + 0x10ea2: 0xe00068ec, 0x10ea3: 0xe00084c8, + 0x10ea6: 0xe0006739, 0x10ea7: 0xe0008bbf, + 0x10eaa: 0xe00057b1, + 0x10eb2: 0xe000a50f, + 0x10eb7: 0xe0008bc3, + 0x10ebf: 0xe0006d6f, + // Block 0x43b, offset 0x10ec0 + 0x10ec4: 0xe00061be, + 0x10ecd: 0xe000679f, + 0x10ed2: 0xe0005e9b, 0x10ed3: 0xe000a632, + 0x10ed5: 0xe0007681, + 0x10eda: 0xe0006182, 0x10edb: 0xe0008090, + 0x10edf: 0xe0006eda, + 0x10ee2: 0xe0006013, + 0x10ee4: 0xe000738c, 0x10ee7: 0xe0007e03, + 0x10eea: 0xe0007c53, + 0x10ef3: 0xe0007447, + 0x10ef5: 0xe0008560, + 0x10efa: 0xe00061c1, 0x10efb: 0xe000631a, + 0x10efc: 0xe0007cb8, 0x10efd: 0xe0005d8a, 0x10efe: 0xe0004c9f, 0x10eff: 0xe0004b1f, + // Block 0x43c, offset 0x10f00 + 0x10f01: 0xe000410d, 0x10f02: 0xe0007133, + 0x10f04: 0xe0008094, + 0x10f08: 0xe0007786, 0x10f09: 0xe000914b, 0x10f0b: 0xe000524f, + 0x10f0c: 0xe000a2c3, + 0x10f16: 0xe0009eb0, 0x10f17: 0xe0004ca2, + 0x10f19: 0xe0006e66, 0x10f1a: 0xe0005e09, 0x10f1b: 0xe0007bb4, + 0x10f20: 0xe0005cce, 0x10f21: 0xe0008883, 0x10f22: 0xe0004e65, 0x10f23: 0xe00078d9, + 0x10f25: 0xe00089a3, 0x10f26: 0xe000a0dd, + 0x10f29: 0xe0005267, 0x10f2b: 0xe0006016, + 0x10f2d: 0xe000a42e, 0x10f2e: 0xe000a431, 0x10f2f: 0xe0007c56, + 0x10f36: 0xe00096c2, + 0x10f3a: 0xe000a029, 0x10f3b: 0xe000a02d, + 0x10f3d: 0xe0005b54, + // Block 0x43d, offset 0x10f40 + 0x10f40: 0xe0004e68, + 0x10f45: 0xe000a4e5, + 0x10f48: 0xe0007e90, 0x10f49: 0xe000a8c3, 0x10f4b: 0xe0006df2, + 0x10f4c: 0xe0004b64, + 0x10f56: 0xe0009dcd, + 0x10f59: 0xe000874c, 0x10f5b: 0xe000a27f, + 0x10f65: 0xe0008d17, + 0x10f68: 0xe00085b5, 0x10f6a: 0xe00069dd, + 0x10f6d: 0xe00051bb, + 0x10f70: 0xe0007b4d, 0x10f72: 0xe0005252, + 0x10f74: 0xe0007b49, + 0x10f7e: 0xe000575d, 0x10f7f: 0xe0007a21, + // Block 0x43e, offset 0x10f80 + 0x10f80: 0xe0006c4e, 0x10f83: 0xe00077f7, + 0x10f85: 0xe0006f16, + 0x10f8c: 0xe000592a, + 0x10f90: 0xe0008573, 0x10f91: 0xe000a2ab, + 0x10f94: 0xe0004918, 0x10f95: 0xe0008558, 0x10f96: 0xe00085b8, 0x10f97: 0xe0008576, + 0x10f98: 0xe0008d7f, 0x10f9a: 0xe000673c, 0x10f9b: 0xe0009d13, + 0x10f9c: 0xe0008579, 0x10f9d: 0xe000a6cb, 0x10f9f: 0xe0005efa, + 0x10fa1: 0xe0009bb6, 0x10fa3: 0xe0004737, + 0x10fa4: 0xe00047a9, 0x10fa5: 0xe0005218, + 0x10fa9: 0xe000a130, 0x10fab: 0xe00070ae, + 0x10fb0: 0xe0007223, 0x10fb1: 0xe0008654, + 0x10fb5: 0xe000673f, 0x10fb6: 0xe00085bb, + 0x10fb8: 0xe0009fc5, 0x10fba: 0xe00081b3, + 0x10fbc: 0xe00078ed, 0x10fbf: 0xe0006ba2, + // Block 0x43f, offset 0x10fc0 + 0x10fc1: 0xe0008845, 0x10fc2: 0xe0007f34, + 0x10fc5: 0xe0005492, 0x10fc7: 0xe0007f6d, + 0x10fc8: 0xe0007136, 0x10fc9: 0xe00075f5, 0x10fca: 0xe0004158, 0x10fcb: 0xe00070da, + 0x10fcc: 0xe0007d6f, 0x10fcf: 0xe0004b38, + 0x10fd3: 0xe0006663, + 0x10fd5: 0xe0009b66, 0x10fd6: 0xe000a6ad, 0x10fd7: 0xe0008d9b, + 0x10fd8: 0xe00049ef, 0x10fd9: 0xe0008e3f, 0x10fda: 0xe0008af7, 0x10fdb: 0xe0007d73, + 0x10fdc: 0xe000839d, + 0x10fe2: 0xe0004424, 0x10fe3: 0xe0006df6, + 0x10fe4: 0xe00074d7, 0x10fe5: 0xe00081b6, 0x10fe6: 0xe000a54e, + 0x10fec: 0xe0006f62, 0x10fee: 0xe0004d7d, + 0x10ff0: 0xe0008795, 0x10ff3: 0xe000a133, + 0x10ff4: 0xe00079b1, 0x10ff5: 0xe0006fd7, 0x10ff6: 0xe0004110, + 0x10ff8: 0xe0007463, 0x10ff9: 0xe0007eec, + 0x10fff: 0xe0007227, + // Block 0x440, offset 0x11000 + 0x11000: 0xe00093cb, 0x11002: 0xe0008887, 0x11003: 0xe0008098, + 0x11004: 0xe0005001, 0x11005: 0xe0008494, 0x11006: 0xe000623e, 0x11007: 0xe0004c06, + 0x1100c: 0xe0006742, + 0x11010: 0xe0005e9e, 0x11012: 0xe0009fed, 0x11013: 0xe0007f70, + 0x11014: 0xe000740b, 0x11016: 0xe0009a0c, 0x11017: 0xe00051ef, + 0x11018: 0xe0009988, + 0x1101e: 0xe0005d99, 0x1101f: 0xe00092a1, + 0x11021: 0xe000497c, 0x11022: 0xe00099ec, + 0x11024: 0xe0007c0e, 0x11025: 0xe0007e42, 0x11026: 0xe00074db, 0x11027: 0xe00051eb, + 0x11028: 0xe00093ce, 0x11029: 0xe00074eb, 0x1102b: 0xe0006a98, + 0x1102c: 0xe00049f3, 0x1102d: 0xe000a398, 0x1102e: 0xe0005b33, 0x1102f: 0xe0008ef3, + 0x11030: 0xe000a586, + 0x11035: 0xe0009756, 0x11036: 0xe0006617, + 0x11038: 0xe000973a, 0x1103a: 0xe0006a9b, + // Block 0x441, offset 0x11040 + 0x11041: 0xe00066cb, + 0x11044: 0xe0006a9e, 0x11045: 0xe0004ed9, 0x11047: 0xe00086cc, + 0x11048: 0xe000891f, 0x11049: 0xe0008141, 0x1104a: 0xe0008d83, 0x1104b: 0xe00074ef, + 0x1104c: 0xe0008ea2, 0x1104d: 0xe000545c, 0x1104e: 0xe00054b0, 0x1104f: 0xe0006fda, + 0x11051: 0xe0006fdd, + 0x11054: 0xe0008439, 0x11056: 0xe0009576, + 0x11059: 0xe0006c52, + 0x1105f: 0xe0006e6a, + 0x11060: 0xe0006e6e, + 0x11064: 0xe0007f73, + 0x11068: 0xe000638a, 0x1106b: 0xe0007deb, + 0x11071: 0xe00098f3, + 0x11078: 0xe000738f, 0x11079: 0xe00082a4, 0x1107a: 0xe000943a, 0x1107b: 0xe00047ac, + 0x1107c: 0xe000528b, 0x1107e: 0xe0006185, 0x1107f: 0xe000524c, + // Block 0x442, offset 0x11080 + 0x11080: 0xe0004d15, 0x11081: 0xe000696a, + 0x11085: 0xe000444a, 0x11086: 0xe000473a, 0x11087: 0xe00089a7, + 0x11088: 0xe0004d61, 0x1108b: 0xe0007c8c, + 0x1108d: 0xe0007395, 0x1108e: 0xe0007392, + 0x11090: 0xe0004edd, 0x11091: 0xe0006ea6, + 0x11095: 0xe0008923, + 0x1109b: 0xe00065b6, + 0x110a0: 0xe00054b3, 0x110a2: 0xe0005b83, + 0x110a4: 0xe0009936, 0x110a5: 0xe0005c89, + 0x110a8: 0xe0004ca5, + 0x110ac: 0xe0007086, 0x110af: 0xe000567a, + 0x110b1: 0xe0006b72, 0x110b3: 0xe0006e72, + 0x110b9: 0xe000a85d, 0x110ba: 0xe00050a6, + // Block 0x443, offset 0x110c0 + 0x110c8: 0xe0009faf, 0x110ca: 0xe0008a5b, + 0x110cc: 0xe0004fb1, 0x110cf: 0xe0007dbf, + 0x110d0: 0xe0005004, 0x110d1: 0xe0008674, 0x110d2: 0xe000460b, + 0x110d4: 0xe000920a, + 0x110dd: 0xe0008634, + 0x110e1: 0xe000433a, 0x110e3: 0xe0004ca8, + 0x110e5: 0xe0009c92, 0x110e6: 0xe0005d6b, 0x110e7: 0xe00096c5, + 0x110e8: 0xe0008848, 0x110e9: 0xe0007661, 0x110ea: 0xe0006896, 0x110eb: 0xe0007139, + 0x110ec: 0xe0004316, 0x110ed: 0xe00059e6, + 0x110f1: 0xe000545f, 0x110f3: 0xe0007595, + 0x110f5: 0xe000a3bc, 0x110f7: 0xe00061e2, + 0x110f8: 0xe00075f9, 0x110fa: 0xe00059a2, + 0x110fe: 0xe0008a6b, + // Block 0x444, offset 0x11100 + 0x11100: 0xe000713c, + 0x11112: 0xe0005617, + 0x11119: 0xe0009943, + 0x11120: 0xe0006c56, + 0x11128: 0xe0007549, 0x11129: 0xe000757c, + 0x1112d: 0xe00096c8, 0x1112f: 0xe00066cf, + 0x11130: 0xe00066d3, 0x11131: 0xe000521b, + 0x11134: 0xe000a22f, 0x11136: 0xe00054b6, + 0x1113b: 0xe0008ef7, + 0x1113d: 0xe000a2d3, + // Block 0x445, offset 0x11140 + 0x11146: 0xe000494c, 0x11147: 0xe0007307, + 0x1114d: 0xe0005804, 0x1114e: 0xe0005007, + 0x11150: 0xe00048bc, 0x11151: 0xe0004898, + 0x11154: 0xe0009791, 0x11155: 0xe0007719, 0x11156: 0xe00076f2, 0x11157: 0xe000433e, + 0x11159: 0xe0005c0a, 0x1115b: 0xe0004d71, + 0x1115f: 0xe000835c, + 0x11162: 0xe00087e1, + 0x11164: 0xe000a6f2, 0x11166: 0xe0007911, 0x11167: 0xe000730b, + 0x11169: 0xe00068b6, + 0x11174: 0xe0007e18, + 0x1117d: 0xe00087c2, + // Block 0x446, offset 0x11180 + 0x11181: 0xe00042de, 0x11182: 0xe0005c2a, + 0x1118b: 0xe0006188, + 0x1118c: 0xe0004292, 0x1118e: 0xe0007fca, + 0x11190: 0xe0005789, 0x11193: 0xe0007685, + 0x11194: 0xe0007e1b, + 0x111a9: 0xe000730f, + 0x111ac: 0xe0007e09, 0x111af: 0xe00091e6, + 0x111b1: 0xe0007f38, + // Block 0x447, offset 0x111c0 + 0x111c1: 0xe0005baa, 0x111c2: 0xe0008750, + 0x111c4: 0xe00092e9, 0x111c7: 0xe0004c09, + 0x111cb: 0xe00054b9, + 0x111d2: 0xe0008fdb, + 0x111d4: 0xe0004f85, 0x111d5: 0xe00096cb, + 0x111d9: 0xe0005d13, + 0x111dd: 0xe00056a2, + 0x111e0: 0xe0004b67, 0x111e2: 0xe0007e45, + 0x111e7: 0xe0007991, + 0x111ea: 0xe0007929, 0x111eb: 0xe0007931, + 0x111ee: 0xe000a1ff, + 0x111f0: 0xe000a15a, + 0x111f7: 0xe00083d6, + 0x111f8: 0xe0007add, 0x111fa: 0xe00059a6, + 0x111fc: 0xe0006d18, 0x111fd: 0xe0007599, + // Block 0x448, offset 0x11200 + 0x11209: 0xe00092ed, 0x1120b: 0xe0004e6b, + 0x1120d: 0xe0007e0c, + 0x11211: 0xe0009289, 0x11212: 0xe0005dc5, 0x11213: 0xe00089ab, + 0x11216: 0xe0007665, + 0x1121a: 0xe000a1e7, + 0x1121d: 0xe000949e, 0x1121e: 0xe0008e42, + 0x11221: 0xe0007263, 0x11222: 0xe0006fe0, + 0x11225: 0xe000491c, 0x11226: 0xe0008e09, 0x11227: 0xe0004b6a, + 0x11228: 0xe000444d, 0x1122b: 0xe00060cd, + 0x1122e: 0xe00091e9, + 0x11231: 0xe000500a, 0x11232: 0xe00083fa, 0x11233: 0xe0006aa1, + 0x11234: 0xe0009c62, 0x11235: 0xe000998b, 0x11237: 0xe000a0e1, + 0x11239: 0xe0004f2d, + 0x1123d: 0xe00070b2, 0x1123e: 0xe00044aa, + // Block 0x449, offset 0x11240 + 0x11242: 0xe0007398, 0x11243: 0xe0009e09, + 0x11246: 0xe00064de, + 0x11249: 0xe0006842, + 0x1124c: 0xe000a8c6, + 0x11251: 0xe0009b6a, + 0x11255: 0xe0005e45, 0x11256: 0xe00095c2, + 0x11259: 0xe000914f, 0x1125a: 0xe00097fd, 0x1125b: 0xe000646e, + 0x1125d: 0xe0008c0f, + 0x11265: 0xe000713f, + 0x11268: 0xe0006fc2, 0x1126b: 0xe0006aa4, + 0x1126d: 0xe0006d92, + 0x11273: 0xe00086d0, + 0x11276: 0xe0005462, 0x11277: 0xe0008237, + 0x11278: 0xe0006c5a, + 0x1127d: 0xe0005fd1, 0x1127f: 0xe000a719, + // Block 0x44a, offset 0x11280 + 0x11280: 0xe0008afb, 0x11283: 0xe000817a, + 0x11284: 0xe000759d, 0x11285: 0xe0009e69, 0x11287: 0xe000638e, + 0x1128c: 0xe000a5d2, 0x1128e: 0xe0005f2a, + 0x11294: 0xe0005e0d, 0x11295: 0xe0005d9d, + 0x11298: 0xe0009403, + 0x1129e: 0xe000669b, 0x1129f: 0xe0009946, + 0x112a1: 0xe000648a, 0x112a2: 0xe00053ec, 0x112a3: 0xe0009dd0, + 0x112a8: 0xe000959a, 0x112aa: 0xe0006072, 0x112ab: 0xe00063f2, + 0x112ac: 0xe0008ea5, + 0x112b0: 0xe000a1eb, 0x112b1: 0xe0005761, 0x112b2: 0xe00041ce, 0x112b3: 0xe0009da2, + 0x112b4: 0xe00051cb, 0x112b7: 0xe00065ba, + 0x112b8: 0xe000a18c, 0x112b9: 0xe00041d2, 0x112ba: 0xe0007e93, 0x112bb: 0xe000a552, + 0x112bc: 0xe00081b9, 0x112bd: 0xe00081bc, 0x112be: 0xe000500d, 0x112bf: 0xe0007915, + // Block 0x44b, offset 0x112c0 + 0x112c4: 0xe00086d4, 0x112c7: 0xe00068ef, + 0x112ca: 0xe0006c5e, 0x112cb: 0xe00050a9, + 0x112cf: 0xe0006d1b, + 0x112d5: 0xe0008800, 0x112d6: 0xe0009e48, 0x112d7: 0xe0008a6f, + 0x112da: 0xe000464f, + 0x112dc: 0xe0006745, + 0x112e0: 0xe0006c62, + 0x112e6: 0xe00054bc, 0x112e7: 0xe0008e0c, + 0x112eb: 0xe00047af, + 0x112ed: 0xe0008aff, + 0x112f3: 0xe000696d, + 0x112f5: 0xe0007669, 0x112f6: 0xe0006d1e, 0x112f7: 0xe0004342, + 0x112f8: 0xe0007ef0, + 0x112fd: 0xe0007fcd, 0x112fe: 0xe00081bf, + // Block 0x44c, offset 0x11300 + 0x11301: 0xe000992e, 0x11302: 0xe0006c66, + 0x11308: 0xe0009f8b, 0x11309: 0xe000596a, 0x1130a: 0xe00057c9, 0x1130b: 0xe00071de, + 0x11310: 0xe0004c0c, 0x11311: 0xe0004f31, 0x11313: 0xe00049c7, + 0x11315: 0xe0008360, 0x11316: 0xe0005b36, + 0x1131a: 0xe0008e45, 0x1131b: 0xe0008927, + 0x1131d: 0xe00073e3, 0x1131e: 0xe000a889, 0x1131f: 0xe00060a3, + 0x11320: 0xe0009335, 0x11321: 0xe0006112, 0x11322: 0xe0009dd3, 0x11323: 0xe0004a9f, + 0x11325: 0xe0004b22, 0x11327: 0xe0008754, + 0x11328: 0xe000a15d, 0x11329: 0xe0005c52, + 0x1132c: 0xe000587b, + 0x11331: 0xe0007d18, 0x11333: 0xe00095f6, + 0x11336: 0xe00079b5, 0x11337: 0xe0008b03, + 0x1133a: 0xe00044ae, 0x1133b: 0xe000a650, + 0x1133f: 0xe000854c, + // Block 0x44d, offset 0x11340 + 0x11341: 0xe000655a, 0x11343: 0xe00050ac, + 0x11344: 0xe0005ac0, 0x11347: 0xe00042e2, + 0x11348: 0xe000a21b, 0x1134a: 0xe0009dd6, 0x1134b: 0xe000846c, + 0x1134f: 0xe000740f, + 0x11351: 0xe000739b, 0x11353: 0xe0004d81, + 0x11354: 0xe0008c8a, 0x11355: 0xe0008498, 0x11357: 0xe000688a, + 0x11358: 0xe000a4a7, 0x1135b: 0xe00083fd, + 0x1135f: 0xe0008c12, + 0x11362: 0xe000551c, + 0x11365: 0xe00061c4, 0x11366: 0xe000a233, 0x11367: 0xe000a3bf, + 0x11369: 0xe0005209, + 0x1136d: 0xe00061c7, + 0x11371: 0xe00077b3, + 0x11374: 0xe00055a7, 0x11375: 0xe00086d8, + 0x1137a: 0xe0004346, + 0x1137c: 0xe0009f1f, + // Block 0x44e, offset 0x11380 + 0x11380: 0xe0004cab, + 0x11386: 0xe00065a2, + 0x11388: 0xe0009af6, 0x1138a: 0xe000434a, + 0x1138c: 0xe000618b, 0x1138e: 0xe0005dc9, + 0x11394: 0xe0005aa0, 0x11396: 0xe00052d4, 0x11397: 0xe000a37a, + 0x11398: 0xe0009644, 0x11399: 0xe000a7c5, 0x1139b: 0xe0008400, + 0x1139d: 0xe000843c, + 0x113a2: 0xe000a323, + 0x113a4: 0xe000561b, 0x113a6: 0xe00078c1, 0x113a7: 0xe0007ff8, + 0x113a9: 0xe00093d1, 0x113aa: 0xe0009e83, 0x113ab: 0xe0008c8d, + 0x113ac: 0xe00069e1, 0x113ad: 0xe0009d22, + 0x113b0: 0xe0009339, 0x113b1: 0xe0007ae1, + 0x113b7: 0xe0006392, + 0x113b9: 0xe0007975, + 0x113bc: 0xe0009ef6, 0x113bf: 0xe000688e, + // Block 0x44f, offset 0x113c0 + 0x113c0: 0xe0007dd7, 0x113c1: 0xe0008b07, 0x113c2: 0xe0008d1a, + 0x113c5: 0xe0005465, 0x113c7: 0xe0007267, + 0x113c8: 0xe000a841, 0x113c9: 0xe000784b, 0x113ca: 0xe000a653, 0x113cb: 0xe0005c1e, + 0x113cc: 0xe000a71c, + 0x113d0: 0xe0006d21, 0x113d1: 0xe0004653, 0x113d2: 0xe00054bf, + 0x113d7: 0xe000569e, + 0x113d8: 0xe0006427, 0x113d9: 0xe0006aa7, + 0x113dc: 0xe0006cb2, 0x113de: 0xe0008d9f, + 0x113e0: 0xe0005807, 0x113e1: 0xe000787a, 0x113e3: 0xe000920d, + 0x113e7: 0xe0009d72, + 0x113e8: 0xe000a5d6, 0x113e9: 0xe0006667, 0x113ea: 0xe000726b, + 0x113ec: 0xe00063f6, 0x113ed: 0xe0007e96, 0x113ee: 0xe000618e, 0x113ef: 0xe000a39b, + 0x113f5: 0xe00091bb, 0x113f7: 0xe0005496, + 0x113f9: 0xe000952e, + 0x113fc: 0xe0007e99, 0x113fd: 0xe000a7c8, + // Block 0x450, offset 0x11400 + 0x11403: 0xe00074f3, + 0x11405: 0xe0009f23, + 0x11409: 0xe000551f, + 0x1140c: 0xe0005010, 0x1140d: 0xe000849c, + 0x11410: 0xe0009b46, 0x11412: 0xe0009c54, + 0x11416: 0xe000973e, 0x11417: 0xe0008ff6, + 0x11418: 0xe0005e55, 0x11419: 0xe0005e59, + 0x1141d: 0xe000959e, 0x1141e: 0xe0006216, 0x1141f: 0xe000621a, + 0x11420: 0xe00098ac, 0x11421: 0xe00098c4, + 0x11424: 0xe0007c59, + 0x11428: 0xe0007dc3, 0x1142b: 0xe0009a34, + 0x1142d: 0xe000656e, 0x1142e: 0xe00050af, + 0x11431: 0xe0009a10, + 0x11435: 0xe00051db, + 0x11438: 0xe000527d, 0x1143b: 0xe000a845, + 0x1143c: 0xe000439a, 0x1143d: 0xe000a493, 0x1143f: 0xe0006806, + // Block 0x451, offset 0x11440 + 0x1144a: 0xe00096ce, + 0x1144d: 0xe0008638, 0x1144f: 0xe00076c1, + 0x11452: 0xe000520c, + 0x11454: 0xe0008bc7, 0x11455: 0xe0009c95, 0x11456: 0xe0009e0c, 0x11457: 0xe00095ee, + 0x11459: 0xe000a434, 0x1145b: 0xe0005348, + 0x1145c: 0xe00059aa, 0x1145d: 0xe0006aaa, + 0x11460: 0xe0009b8f, 0x11461: 0xe0008403, + 0x11465: 0xe0004f99, 0x11466: 0xe0009db2, 0x11467: 0xe0006f66, + 0x11468: 0xe000809c, 0x11469: 0xe0005294, 0x1146a: 0xe0004b10, + 0x1146f: 0xe000452a, + 0x11473: 0xe000a636, + // Block 0x452, offset 0x11480 + 0x11481: 0xe0008524, 0x11482: 0xe000726f, 0x11483: 0xe000739e, + 0x11486: 0xe000a111, 0x11487: 0xe0004ac3, + 0x11488: 0xe0006019, 0x1148a: 0xe000a303, + 0x1148d: 0xe000a5da, + 0x11490: 0xe0004920, 0x11492: 0xe000a0e5, + 0x11495: 0xe0006d24, + 0x11499: 0xe00077fb, 0x1149a: 0xe0007939, + 0x1149d: 0xe0004a6b, 0x1149f: 0xe000a825, + 0x114a0: 0xe0004b25, 0x114a2: 0xe000a656, 0x114a3: 0xe000857c, + 0x114a4: 0xe000a801, 0x114a5: 0xe0009949, + 0x114a8: 0xe0009ff1, 0x114a9: 0xe00082ec, 0x114aa: 0xe0004182, 0x114ab: 0xe0009c0c, + 0x114ac: 0xe00051df, 0x114ad: 0xe0004924, 0x114af: 0xe0007413, + 0x114b0: 0xe000a891, + // Block 0x453, offset 0x114c0 + 0x114c1: 0xe0007a25, 0x114c3: 0xe00048c0, + 0x114c4: 0xe00096d1, 0x114c5: 0xe0007a51, + 0x114c9: 0xe00074df, 0x114cb: 0xe0005d17, + 0x114cc: 0xe0008c15, 0x114cd: 0xe0009ff5, 0x114cf: 0xe000a307, + 0x114d2: 0xe0008378, + 0x114d4: 0xe000a659, 0x114d5: 0xe000a8f6, 0x114d6: 0xe0009cf8, 0x114d7: 0xe000615b, + 0x114da: 0xe00070de, 0x114db: 0xe000892b, + 0x114df: 0xe0007c11, + 0x114e0: 0xe00081c2, 0x114e2: 0xe000585b, 0x114e3: 0xe000a556, + 0x114e4: 0xe000975a, 0x114e7: 0xe0005c8c, + 0x114f0: 0xe0008da3, 0x114f1: 0xe0006970, 0x114f2: 0xe00068f2, 0x114f3: 0xe000549a, + 0x114f4: 0xe00098cc, 0x114f5: 0xe0009389, 0x114f6: 0xe00061e6, + 0x114f8: 0xe000473d, 0x114fb: 0xe000a19c, + 0x114fc: 0xe00054c2, 0x114fd: 0xe000941d, 0x114fe: 0xe0004950, + // Block 0x454, offset 0x11500 + 0x11504: 0xe00051c7, 0x11505: 0xe0008b0b, 0x11506: 0xe0009800, 0x11507: 0xe0005583, + 0x11509: 0xe00095a2, 0x1150b: 0xe0007dc7, + 0x1150f: 0xe00057b5, + 0x11511: 0xe000a45b, 0x11513: 0xe0004dc5, + 0x11515: 0xe0009476, + 0x11518: 0xe0005e7d, 0x11519: 0xe0009556, 0x1151a: 0xe000a497, 0x1151b: 0xe000a483, + 0x1151c: 0xe0006d96, 0x1151d: 0xe000938d, 0x1151f: 0xe00081c5, + 0x11520: 0xe000a37d, 0x11521: 0xe00075a1, 0x11522: 0xe0007112, + 0x11530: 0xe0009a4c, 0x11531: 0xe0005243, 0x11532: 0xe000804c, 0x11533: 0xe0006c6a, + 0x11534: 0xe00098d8, 0x11536: 0xe000a5de, 0x11537: 0xe0008f3b, + 0x11538: 0xe00046e7, 0x11539: 0xe000779e, 0x1153a: 0xe0006f6a, 0x1153b: 0xe0009926, + 0x1153c: 0xe0009d76, + // Block 0x455, offset 0x11540 + 0x11540: 0xe00096d4, 0x11541: 0xe0007142, 0x11543: 0xe0006e76, + 0x11546: 0xe00044b2, + 0x11548: 0xe00081c8, 0x11549: 0xe00081cb, + 0x1154d: 0xe00061ea, 0x1154e: 0xe0009d42, 0x1154f: 0xe00083a0, + 0x11554: 0xe0008364, 0x11555: 0xe00075a5, + 0x1155a: 0xe0007f76, 0x1155b: 0xe00076f5, + 0x1155c: 0xe000a30b, 0x1155f: 0xe0004296, + 0x11567: 0xe0004b13, + 0x1156c: 0xe000704f, 0x1156d: 0xe00050b2, + 0x11570: 0xe000a5e2, + 0x11574: 0xe000933d, 0x11577: 0xe00043e1, + 0x1157c: 0xe0007467, 0x1157e: 0xe00043e4, 0x1157f: 0xe00080a0, + // Block 0x456, offset 0x11580 + 0x11582: 0xe0007ef4, + 0x11584: 0xe0005c22, 0x11586: 0xe0005522, 0x11587: 0xe00082f0, + 0x11588: 0xe000857f, 0x1158a: 0xe00045ef, 0x1158b: 0xe0009b92, + 0x1158c: 0xe000a5e6, 0x1158d: 0xe0007cbc, + 0x11592: 0xe0008ddf, 0x11593: 0xe0009e86, + 0x11595: 0xe0005fd4, + 0x11598: 0xe00092c5, 0x11599: 0xe00092c9, 0x1159a: 0xe00092f1, + 0x1159d: 0xe0009c4c, 0x1159f: 0xe0009bf4, + 0x115a0: 0xe0007c5c, 0x115a2: 0xe0005dcd, 0x115a3: 0xe00049f7, + 0x115a4: 0xe0004186, 0x115a7: 0xe000a380, + 0x115a8: 0xe00043e7, 0x115ab: 0xe0008da7, + 0x115ae: 0xe000587e, + 0x115b0: 0xe0008144, 0x115b1: 0xe000530c, 0x115b3: 0xe000421e, + 0x115b4: 0xe0007344, 0x115b5: 0xe0007f3c, 0x115b6: 0xe0004657, 0x115b7: 0xe000434e, + 0x115ba: 0xe0005bad, + 0x115bd: 0xe000943e, 0x115be: 0xe0007eb4, + // Block 0x457, offset 0x115c0 + 0x115c1: 0xe000975e, 0x115c2: 0xe0007f79, 0x115c3: 0xe0007f40, + 0x115ca: 0xe00068f5, + 0x115cd: 0xe0004bb5, 0x115ce: 0xe0008fb3, + 0x115d0: 0xe00058fa, 0x115d1: 0xe0006a45, 0x115d2: 0xe0004e0b, + 0x115d4: 0xe000966b, 0x115d6: 0xe0008314, + 0x115d8: 0xe000a8cc, 0x115d9: 0xe000a8c9, 0x115da: 0xe0009afa, + 0x115e4: 0xe000680a, 0x115e7: 0xe00055d7, + 0x115e8: 0xe00042e6, 0x115e9: 0xe000453d, 0x115eb: 0xe00061ee, + 0x115ec: 0xe000465b, 0x115ee: 0xe00060d0, 0x115ef: 0xe00092f5, + 0x115f2: 0xe000a1d7, + 0x115f6: 0xe00078a5, + 0x115f8: 0xe0006f1a, 0x115fa: 0xe0005360, 0x115fb: 0xe0009b12, + 0x115fc: 0xe00046eb, 0x115fe: 0xe000429a, + // Block 0x458, offset 0x11600 + 0x11603: 0xe0004ef1, + 0x11606: 0xe0008d1d, 0x11607: 0xe00041d6, + 0x11608: 0xe000a136, 0x11609: 0xe0008388, 0x1160a: 0xe0007c14, 0x1160b: 0xe00060d3, + 0x1160c: 0xe0007995, + 0x11615: 0xe0007a95, 0x11617: 0xe0009fb2, + 0x1161e: 0xe0006076, 0x1161f: 0xe0005483, + 0x11623: 0xe000615f, + 0x11626: 0xe0005133, + 0x11632: 0xe00091bf, + 0x11636: 0xe00056e9, 0x11637: 0xe000a65c, + 0x11638: 0xe000a237, 0x1163a: 0xe00092cd, + 0x1163c: 0xe0004c0f, 0x1163d: 0xe000a58a, 0x1163e: 0xe0006f42, 0x1163f: 0xe00083a3, + // Block 0x459, offset 0x11640 + 0x11640: 0xe00058fe, + 0x11647: 0xe00053f0, + 0x11648: 0xe000497f, 0x1164a: 0xe00060d6, + 0x1164c: 0xe00072f3, 0x1164d: 0xe0007145, 0x1164e: 0xe00082d4, + 0x11650: 0xe0006f6e, 0x11651: 0xe000754c, 0x11652: 0xe0004740, + 0x11654: 0xe000866c, 0x11655: 0xe0008758, 0x11656: 0xe000a45f, + 0x1165a: 0xe0009442, + 0x1165e: 0xe0007641, 0x1165f: 0xe0004ec5, + 0x11661: 0xe000429e, 0x11662: 0xe00091b7, + 0x11667: 0xe0009391, + 0x11669: 0xe00089af, 0x1166a: 0xe0008a3f, + 0x1166e: 0xe0005bf6, + 0x11670: 0xe000892f, 0x11671: 0xe000a8cf, 0x11672: 0xe000a8f9, 0x11673: 0xe0009235, + 0x11674: 0xe0005468, 0x11675: 0xe0004cae, 0x11676: 0xe000a3c2, + 0x11679: 0xe0007766, + 0x1167e: 0xe0005881, 0x1167f: 0xe0006396, + // Block 0x45a, offset 0x11680 + 0x11680: 0xe0006fe3, 0x11681: 0xe0009d4e, 0x11683: 0xe00046ef, + 0x11687: 0xe0006dfa, + 0x11688: 0xe000a3c5, 0x11689: 0xe00068f8, 0x1168a: 0xe0007a99, 0x1168b: 0xe0007148, + 0x1168d: 0xe0008798, 0x1168e: 0xe00092b1, + 0x11691: 0xe000669f, 0x11692: 0xe000645d, 0x11693: 0xe0009a4f, + 0x11697: 0xe00087c5, + 0x11698: 0xe0009a9e, 0x1169b: 0xe000439e, + 0x116a3: 0xe0004cb1, + 0x116a8: 0xe00084cc, + 0x116ae: 0xe000680e, + 0x116b1: 0xe0004f9d, 0x116b3: 0xe000631e, + 0x116b6: 0xe0006748, + 0x116b9: 0xe00068fb, 0x116ba: 0xe0009050, + 0x116bc: 0xe000774a, 0x116be: 0xe0008d20, 0x116bf: 0xe0007364, + // Block 0x45b, offset 0x116c0 + 0x116c0: 0xe0005013, 0x116c3: 0xe0006572, + 0x116c4: 0xe000966e, 0x116c6: 0xe0006163, + 0x116c9: 0xe00045c7, 0x116ca: 0xe0009c65, + 0x116d1: 0xe00078a9, 0x116d2: 0xe0006d27, + 0x116d4: 0xe00067a2, 0x116d5: 0xe0009c36, 0x116d6: 0xe0005665, 0x116d7: 0xe000a0e9, + 0x116d8: 0xe0008a43, 0x116db: 0xe0009e0f, + 0x116e8: 0xe0009db6, 0x116eb: 0xe0009ef9, + 0x116ec: 0xe0009bb9, + 0x116f1: 0xe0009e12, + 0x116f5: 0xe0008803, + 0x116f9: 0xe0005e2d, + 0x116fc: 0xe00076ad, 0x116fd: 0xe00097b2, + // Block 0x45c, offset 0x11700 + 0x11702: 0xe0006892, + 0x11704: 0xe0008ea8, 0x11705: 0xe0005310, 0x11706: 0xe0009ac6, 0x11707: 0xe00060d9, + 0x11708: 0xe00051e3, 0x11709: 0xe00057b9, 0x1170a: 0xe00067a5, + 0x1170c: 0xe00062c6, 0x1170d: 0xe000625a, 0x1170f: 0xe0005136, + 0x11710: 0xe0004b16, 0x11711: 0xe000460f, 0x11712: 0xe0004450, 0x11713: 0xe0009446, + 0x11714: 0xe000633e, 0x11715: 0xe0009a6d, 0x11716: 0xe0009a52, 0x11717: 0xe0007e48, + 0x11718: 0xe0004c12, 0x11719: 0xe0008d8f, 0x1171b: 0xe0009671, + 0x1171c: 0xe000642a, + 0x1172c: 0xe0004a6f, 0x1172d: 0xe0007417, 0x1172e: 0xe0005115, 0x1172f: 0xe0008fbb, + 0x11731: 0xe0004928, 0x11733: 0xe0004dad, + 0x11735: 0xe0008d87, 0x11736: 0xe00092b5, 0x11737: 0xe00047b2, + 0x1173d: 0xe0007bb7, 0x1173e: 0xe0007334, 0x1173f: 0xe0005139, + // Block 0x45d, offset 0x11740 + 0x11741: 0xe0008ff9, 0x11742: 0xe0004afb, + 0x11747: 0xe0008ffc, + 0x11749: 0xe00075fd, + 0x1174c: 0xe000455f, + 0x11750: 0xe000513f, 0x11751: 0xe00054c5, 0x11752: 0xe000595e, + 0x11768: 0xe000771c, 0x1176a: 0xe0005142, 0x1176b: 0xe0008e0f, + 0x1176f: 0xe000909b, + 0x11779: 0xe000837c, 0x1177a: 0xe0008b0f, 0x1177b: 0xe00079bd, + 0x1177d: 0xe0005dd1, 0x1177e: 0xe000a2d7, + // Block 0x45e, offset 0x11780 + 0x11782: 0xe0007c5f, 0x11783: 0xe0004d51, + 0x11784: 0xe0004cb4, 0x11786: 0xe00048c4, + 0x11789: 0xe0009219, + 0x1178c: 0xe0009ce6, 0x1178d: 0xe000a031, 0x1178e: 0xe0007052, 0x1178f: 0xe000516e, + 0x11790: 0xe00079b9, + 0x11795: 0xe0009e15, 0x11797: 0xe000947a, + 0x117a7: 0xe00066d7, + 0x117a8: 0xe0006aad, 0x117a9: 0xe0005962, 0x117ab: 0xe0006167, + 0x117ae: 0xe0004453, + 0x117b1: 0xe000771f, 0x117b2: 0xe0004db1, + 0x117b6: 0xe0009803, 0x117b7: 0xe00095c6, + 0x117ba: 0xe0005172, 0x117bb: 0xe00051e7, + 0x117bf: 0xe0006d2a, + // Block 0x45f, offset 0x117c0 + 0x117c0: 0xe000a849, 0x117c3: 0xe0006fe6, + 0x117c4: 0xe0005c1a, 0x117c7: 0xe000955a, + 0x117c8: 0xe000714b, 0x117c9: 0xe00054c8, 0x117ca: 0xe00067a8, + 0x117cc: 0xe00086dc, 0x117ce: 0xe00050b5, 0x117cf: 0xe0005525, + 0x117d2: 0xe000642d, + 0x117d6: 0xe000774e, + 0x117d8: 0xe0004d65, 0x117db: 0xe0004af2, + 0x117dc: 0xe0007bba, 0x117df: 0xe0008bcb, + 0x117e0: 0xe0005817, 0x117e1: 0xe00093d4, 0x117e2: 0xe0009b32, + 0x117e5: 0xe0008ab7, 0x117e7: 0xe000492c, + 0x117e8: 0xe00097b5, 0x117e9: 0xe0007909, 0x117ea: 0xe0008c90, + 0x117ec: 0xe0004d2d, + 0x117fe: 0xe0007a29, + // Block 0x460, offset 0x11800 + 0x11800: 0xe00041da, 0x11803: 0xe00089b3, + 0x11804: 0xe00081ce, 0x11806: 0xe0004e3e, + 0x11809: 0xe000823a, + 0x1180f: 0xe00060a6, + 0x11810: 0xe0008c18, + 0x11816: 0xe000836c, + 0x1181a: 0xe00077ff, 0x1181b: 0xe000a55a, + 0x1181f: 0xe0006d72, + 0x11820: 0xe0007645, 0x11821: 0xe00075a9, 0x11823: 0xe00098db, + 0x11829: 0xe0004411, 0x1182b: 0xe0009806, + 0x1182d: 0xe0004540, 0x1182e: 0xe000a7cb, + 0x11832: 0xe0006ede, + 0x11834: 0xe00080a4, 0x11835: 0xe00044ce, 0x11836: 0xe00077a1, 0x11837: 0xe0006c06, + // Block 0x461, offset 0x11840 + 0x11846: 0xe0004cb7, + 0x11849: 0xe00041ae, + 0x1184d: 0xe00070b6, 0x1184f: 0xe000625e, + 0x11852: 0xe00063fa, + 0x11854: 0xe0006fe9, 0x11856: 0xe0007e4b, 0x11857: 0xe00054cb, + 0x1185c: 0xe000714e, + 0x11862: 0xe000909f, + 0x11864: 0xe000776a, 0x11865: 0xe0009809, + 0x11868: 0xe0009b62, 0x1186a: 0xe0005418, 0x1186b: 0xe0006322, + 0x1186c: 0xe00062ca, 0x1186d: 0xe0009b52, 0x1186f: 0xe0005528, + 0x11870: 0xe00048f8, + 0x11876: 0xe0009395, + 0x1187a: 0xe000a7e6, + 0x1187e: 0xe000921d, + // Block 0x462, offset 0x11880 + 0x11898: 0xe000888b, + 0x118a0: 0xe0009762, + 0x118a7: 0xe000979a, + 0x118a9: 0xe0005d6f, + 0x118ad: 0xe000947e, 0x118af: 0xe0008fff, + 0x118b3: 0xe0004cba, + 0x118b8: 0xe0005fd7, 0x118b9: 0xe0005fda, 0x118ba: 0xe0008abb, 0x118bb: 0xe0006f1e, + 0x118bd: 0xe0009eb3, + // Block 0x463, offset 0x118c0 + 0x118c5: 0xe0004e0e, + 0x118c8: 0xe0005a26, + 0x118d0: 0xe0009bd1, 0x118d1: 0xe0009bcd, 0x118d2: 0xe0006bce, 0x118d3: 0xe0007e4e, + 0x118d5: 0xe0006d75, + 0x118d9: 0xe0008f3f, 0x118da: 0xe00051cf, + 0x118dd: 0xe000a7dd, 0x118de: 0xe00053f4, 0x118df: 0xe0004bb8, + 0x118e4: 0xe0009532, 0x118e5: 0xe0006342, + 0x118e9: 0xe0005b57, 0x118eb: 0xe00060dc, + 0x118ed: 0xe0009c68, 0x118ee: 0xe000978a, + 0x118f0: 0xe0009241, 0x118f2: 0xe0006262, + 0x118fb: 0xe0005330, + 0x118fc: 0xe00042ea, 0x118fe: 0xe00049ac, 0x118ff: 0xe000451e, + // Block 0x464, offset 0x11900 + 0x11901: 0xe0007cf4, + 0x11904: 0xe0005a29, 0x11905: 0xe00094a2, 0x11907: 0xe0009bc5, + 0x11909: 0xe0009239, 0x1190a: 0xe0004543, + 0x1190d: 0xe0008c93, 0x1190e: 0xe000465f, + 0x11910: 0xe000a58e, 0x11912: 0xe0004f51, + 0x11914: 0xe0005364, 0x11915: 0xe000a7f5, 0x11917: 0xe000653e, + 0x11918: 0xe000651e, 0x1191a: 0xe0004456, + 0x11920: 0xe0008c4e, 0x11921: 0xe000546b, 0x11922: 0xe0009aa2, 0x11923: 0xe000552b, + 0x11925: 0xe000578d, 0x11926: 0xe00092a5, 0x11927: 0xe0004459, + 0x1192c: 0xe00083a6, 0x1192d: 0xe000a512, 0x1192f: 0xe0006a15, + 0x11931: 0xe00041b2, 0x11932: 0xe000944a, + 0x11934: 0xe000a51e, + 0x1193a: 0xe0009c6b, + 0x1193e: 0xe0007e51, + // Block 0x465, offset 0x11940 + 0x11940: 0xe00062ce, 0x11942: 0xe0005b0c, + 0x11944: 0xe0009bd9, 0x11947: 0xe000a1ef, + 0x1194a: 0xe00058e2, + 0x1194f: 0xe0005adc, + 0x11954: 0xe0005765, + 0x11958: 0xe0007803, 0x11959: 0xe00092f9, + 0x1195d: 0xe0006f32, + 0x11962: 0xe000928d, 0x11963: 0xe0005902, + 0x11964: 0xe0009b16, + 0x1196a: 0xe0004b6d, 0x1196b: 0xe000a522, + 0x1196c: 0xe0005791, 0x1196f: 0xe0009002, + 0x11972: 0xe00050b8, + 0x11976: 0xe0007151, 0x11977: 0xe00047b5, + 0x11978: 0xe00081d1, 0x11979: 0xe00043ea, 0x1197b: 0xe0004930, + 0x1197d: 0xe0006326, 0x1197e: 0xe000639a, 0x1197f: 0xe0008b13, + // Block 0x466, offset 0x11980 + 0x11985: 0xe00047b8, + 0x11988: 0xe000a6ce, 0x11989: 0xe00061ca, + 0x1198d: 0xe0006d2d, 0x1198e: 0xe0004b70, 0x1198f: 0xe00061f2, + 0x11991: 0xe0004c15, + 0x11994: 0xe0007898, 0x11995: 0xe00099c4, 0x11996: 0xe0007c17, 0x11997: 0xe0009cfb, + 0x1199d: 0xe0009de8, 0x1199e: 0xe0009341, + 0x119a2: 0xe00042a2, 0x119a3: 0xe0006b76, + 0x119a6: 0xe0005587, + 0x119ac: 0xe0004663, 0x119ad: 0xe0007807, + 0x119b2: 0xe00047bb, + 0x119b4: 0xe0008b17, 0x119b5: 0xe000888f, 0x119b7: 0xe000674b, + 0x119b8: 0xe0007154, + 0x119be: 0xe0006dfe, + // Block 0x467, offset 0x119c0 + 0x119c1: 0xe0005668, 0x119c2: 0xe000596e, 0x119c3: 0xe0009dd9, + 0x119c5: 0xe000a6d1, 0x119c7: 0xe0006137, + 0x119cc: 0xe00069e5, + 0x119d0: 0xe00068fe, 0x119d1: 0xe00062d2, + 0x119d7: 0xe000564a, + 0x119d9: 0xe0005b39, 0x119db: 0xe0004864, + 0x119dc: 0xe0006ab0, 0x119dd: 0xe000415b, 0x119df: 0xe000918f, + 0x119e1: 0xe000762d, + 0x119e4: 0xe0004ef5, 0x119e5: 0xe000944e, 0x119e7: 0xe000674e, + 0x119eb: 0xe000860c, + 0x119ec: 0xe00092d1, 0x119ef: 0xe0006ab3, + 0x119f0: 0xe000746b, 0x119f1: 0xe000863c, 0x119f2: 0xe000923d, + 0x119f7: 0xe00052d8, + 0x119f9: 0xe000639e, + 0x119fc: 0xe000787d, 0x119fd: 0xe00073a1, 0x119ff: 0xe000823d, + // Block 0x468, offset 0x11a00 + 0x11a01: 0xe00063a2, 0x11a02: 0xe00050bb, 0x11a03: 0xe00089b7, + 0x11a04: 0xe000601c, 0x11a05: 0xe0005884, 0x11a06: 0xe0009d16, + 0x11a0a: 0xe00063fe, 0x11a0b: 0xe0006e02, + 0x11a0c: 0xe0008b1b, 0x11a0f: 0xe0008d6b, + 0x11a12: 0xe0005bbc, + 0x11a17: 0xe0005016, + 0x11a20: 0xe00060df, 0x11a23: 0xe0005019, + 0x11a25: 0xe00084f8, 0x11a26: 0xe00052dc, + 0x11a28: 0xe0009005, 0x11a29: 0xe0008c96, + 0x11a2c: 0xe0007273, 0x11a2d: 0xe0007ffc, + 0x11a31: 0xe0009ff9, 0x11a32: 0xe0005486, + 0x11a34: 0xe0007f7c, + 0x11a3a: 0xe0007ddb, 0x11a3b: 0xe00061f6, + 0x11a3c: 0xe00061fa, 0x11a3d: 0xe000558b, 0x11a3f: 0xe0007c1a, + // Block 0x469, offset 0x11a40 + 0x11a40: 0xe00082c0, 0x11a43: 0xe0009932, + 0x11a46: 0xe000489c, 0x11a47: 0xe0007368, + 0x11a49: 0xe00063a6, 0x11a4a: 0xe000a3c8, + 0x11a4c: 0xe0009345, 0x11a4e: 0xe0005f8e, 0x11a4f: 0xe000a46b, + 0x11a50: 0xe0006812, 0x11a51: 0xe0004f55, 0x11a53: 0xe0007979, + 0x11a54: 0xe0006d9a, 0x11a55: 0xe000a831, + 0x11a5b: 0xe0004477, + 0x11a5e: 0xe00065be, 0x11a5f: 0xe0006f72, + 0x11a60: 0xe0007ae5, 0x11a61: 0xe000a283, + 0x11a64: 0xe00059ea, 0x11a65: 0xe000988c, 0x11a67: 0xe0005ea1, + 0x11a68: 0xe0008610, 0x11a6b: 0xe0004cbd, + 0x11a6d: 0xe0006fec, 0x11a6f: 0xe00073a4, + 0x11a70: 0xe0009f8e, 0x11a71: 0xe0008000, + 0x11a74: 0xe00060a9, 0x11a75: 0xe00052ab, 0x11a76: 0xe0009349, 0x11a77: 0xe0007cc0, + 0x11a7a: 0xe00065c2, 0x11a7b: 0xe00076c5, + // Block 0x46a, offset 0x11a80 + 0x11a81: 0xe0008c99, 0x11a82: 0xe00073a7, 0x11a83: 0xe000a5ea, + 0x11a84: 0xe000a5ee, + 0x11a88: 0xe0004bbb, 0x11a89: 0xe00090a3, 0x11a8b: 0xe00090a7, + 0x11a8c: 0xe0006cb6, 0x11a8e: 0xe000a4cb, 0x11a8f: 0xe0007601, + 0x11a99: 0xe0008efb, 0x11a9b: 0xe000a23b, + 0x11a9d: 0xe0008e48, 0x11a9e: 0xe000a8d2, 0x11a9f: 0xe0006f76, + 0x11aa1: 0xe0009e4b, 0x11aa2: 0xe0008a5f, + 0x11aa4: 0xe0007c1d, 0x11aa5: 0xe000a562, 0x11aa6: 0xe000a65f, 0x11aa7: 0xe000a3cb, + 0x11aa8: 0xe000746f, 0x11aa9: 0xe0005dd5, 0x11aab: 0xe0009aa6, + 0x11aac: 0xe00071e1, 0x11aae: 0xe000661a, 0x11aaf: 0xe0004667, + 0x11ab0: 0xe0006dc6, 0x11ab3: 0xe0006d9e, + 0x11ab4: 0xe00095fa, 0x11ab6: 0xe0008b1f, 0x11ab7: 0xe0004e29, + 0x11ab8: 0xe0008b23, 0x11aba: 0xe0009008, 0x11abb: 0xe0007689, + // Block 0x46b, offset 0x11ac0 + 0x11ac4: 0xe000a798, 0x11ac7: 0xe0004113, + 0x11ac8: 0xe000a770, 0x11ac9: 0xe000a7ce, 0x11acb: 0xe000621e, + 0x11acc: 0xe0004e6e, 0x11ace: 0xe0007ae9, + 0x11ad0: 0xe0008147, 0x11ad1: 0xe0006d30, + 0x11ad6: 0xe0005152, 0x11ad7: 0xe000766d, + 0x11ad8: 0xe000780b, + 0x11add: 0xe0005f92, 0x11ade: 0xe0004bbe, + 0x11ae0: 0xe00047be, 0x11ae2: 0xe000934d, 0x11ae3: 0xe00050be, + 0x11aeb: 0xe0008678, + 0x11aec: 0xe0006ee2, 0x11aee: 0xe0005fdd, + 0x11af1: 0xe00052af, 0x11af2: 0xe00086e0, 0x11af3: 0xe000a383, + 0x11af4: 0xe0009e6d, 0x11af5: 0xe000a035, + 0x11af8: 0xe0005b5a, 0x11af9: 0xe0006efa, 0x11afb: 0xe000466b, + 0x11afe: 0xe000558f, 0x11aff: 0xe000a8fc, + // Block 0x46c, offset 0x11b00 + 0x11b00: 0xe000793c, 0x11b01: 0xe00050c1, + 0x11b04: 0xe0007abd, 0x11b05: 0xe0007ac9, 0x11b06: 0xe00058ca, 0x11b07: 0xe0005368, + 0x11b09: 0xe000a6d4, + 0x11b13: 0xe0009e4e, + 0x11b16: 0xe00076f8, + 0x11b19: 0xe0006d33, 0x11b1a: 0xe000607a, 0x11b1b: 0xe000a774, + 0x11b1c: 0xe0007e54, 0x11b1d: 0xe0009e71, + 0x11b20: 0xe0004aa3, 0x11b23: 0xe0007a2d, + 0x11b26: 0xe000a8d5, + 0x11b28: 0xe0005ae0, 0x11b29: 0xe00051a2, 0x11b2a: 0xe0005704, + 0x11b2c: 0xe0007115, 0x11b2e: 0xe0007919, 0x11b2f: 0xe0009722, + 0x11b30: 0xe0007dd3, 0x11b32: 0xe0004868, 0x11b33: 0xe0007b81, + 0x11b34: 0xe000466f, 0x11b37: 0xe000424e, + 0x11b38: 0xe0006d36, 0x11b39: 0xe0008c9f, 0x11b3a: 0xe0008c9c, + 0x11b3c: 0xe0005dd9, 0x11b3e: 0xe0008fb7, 0x11b3f: 0xe0009629, + // Block 0x46d, offset 0x11b40 + 0x11b40: 0xe0009794, 0x11b43: 0xe000a662, + 0x11b45: 0xe00044fa, + 0x11b48: 0xe0008118, 0x11b49: 0xe00081d4, 0x11b4b: 0xe00068ba, + 0x11b4c: 0xe000632a, 0x11b4d: 0xe000666b, + 0x11b54: 0xe0006b56, 0x11b55: 0xe0009193, 0x11b57: 0xe00057cd, + 0x11b5b: 0xe0005e5d, + 0x11b5d: 0xe0008ca2, 0x11b5e: 0xe000501c, 0x11b5f: 0xe000501f, + 0x11b63: 0xe000561f, + 0x11b66: 0xe000606a, 0x11b67: 0xe0005ac4, + 0x11b68: 0xe000603a, 0x11b6a: 0xe0006191, 0x11b6b: 0xe0005e31, + 0x11b6c: 0xe00066bb, 0x11b6d: 0xe00092a9, 0x11b6e: 0xe000989c, + 0x11b71: 0xe0008e4b, 0x11b73: 0xe0009cea, + 0x11b74: 0xe0006266, 0x11b76: 0xe0009a55, + 0x11b7a: 0xe0004ded, + 0x11b7d: 0xe000a71f, + // Block 0x46e, offset 0x11b80 + 0x11b85: 0xe0007fd0, 0x11b86: 0xe00041de, + 0x11b89: 0xe0006be2, + 0x11b8e: 0xe0005c8f, 0x11b8f: 0xe000a190, + 0x11b90: 0xe000879b, 0x11b91: 0xe0009742, 0x11b93: 0xe0009e89, + 0x11b96: 0xe00086e4, + 0x11b9c: 0xe000564d, 0x11b9e: 0xe0005022, 0x11b9f: 0xe000708a, + 0x11ba0: 0xe00043a2, + 0x11baa: 0xe00096d7, + 0x11bac: 0xe00080e8, 0x11bad: 0xe000a0ed, 0x11baf: 0xe0006430, + 0x11bb0: 0xe00044ee, 0x11bb1: 0xe00055db, 0x11bb2: 0xe0004815, 0x11bb3: 0xe00060ac, + 0x11bb5: 0xe0008806, 0x11bb7: 0xe0009c6e, + 0x11bbb: 0xe0005277, + 0x11bbc: 0xe000884b, 0x11bbe: 0xe00070e2, 0x11bbf: 0xe0009cbe, + // Block 0x46f, offset 0x11bc0 + 0x11bc7: 0xe0006901, + 0x11bc9: 0xe0007ddf, 0x11bcb: 0xe00063aa, + 0x11bcc: 0xe0006846, 0x11bcf: 0xe000517a, + 0x11bd0: 0xe0006da2, 0x11bd3: 0xe0005650, + 0x11bd5: 0xe00099f0, 0x11bd7: 0xe0005d43, + 0x11bd8: 0xe0007bbd, 0x11bd9: 0xe0007d59, 0x11bda: 0xe0005ea4, + 0x11bdc: 0xe0004982, 0x11bdd: 0xe000900b, + 0x11bef: 0xe00047c1, + 0x11bf0: 0xe0009da6, 0x11bf2: 0xe00073e6, 0x11bf3: 0xe000900e, + 0x11bf6: 0xe0004116, 0x11bf7: 0xe0004119, + 0x11bf8: 0xe0004c18, + 0x11bfe: 0xe00073aa, + // Block 0x470, offset 0x11c00 + 0x11c01: 0xe0009a70, + 0x11c04: 0xe00065c6, 0x11c05: 0xe0005297, + 0x11c0a: 0xe0008de3, + 0x11c0f: 0xe0006472, + 0x11c10: 0xe0005fe0, 0x11c11: 0xe00042a6, 0x11c12: 0xe00099e0, 0x11c13: 0xe0007a69, + 0x11c14: 0xe00081d7, 0x11c17: 0xe00070fa, + 0x11c18: 0xe00085be, 0x11c19: 0xe000a0bd, 0x11c1a: 0xe00081da, + 0x11c1d: 0xe0009aaa, 0x11c1e: 0xe0008640, 0x11c1f: 0xe000518e, + 0x11c22: 0xe000884e, + 0x11c29: 0xe0004c1b, + 0x11c2c: 0xe00041e2, 0x11c2f: 0xe000411c, + 0x11c30: 0xe00051af, 0x11c31: 0xe0008e4e, 0x11c33: 0xe0005bbf, + 0x11c34: 0xe00073ad, 0x11c35: 0xe00093f3, 0x11c36: 0xe0006ab6, + 0x11c39: 0xe00073e9, 0x11c3b: 0xe0006ab9, + 0x11c3e: 0xe0008b27, + // Block 0x471, offset 0x11c40 + 0x11c43: 0xe000a689, + 0x11c52: 0xe0007277, 0x11c53: 0xe0008933, + 0x11c56: 0xe0006d39, 0x11c57: 0xe0005c26, + 0x11c5d: 0xe0004a7b, 0x11c5e: 0xe0004222, + 0x11c61: 0xe0004b73, 0x11c62: 0xe0006476, + 0x11c6a: 0xe0008e51, + 0x11c6e: 0xe000843f, 0x11c6f: 0xe0008004, + 0x11c71: 0xe0004954, 0x11c72: 0xe0004818, + 0x11c74: 0xe00089bb, + 0x11c78: 0xe000a17c, 0x11c79: 0xe0004ef9, 0x11c7b: 0xe000744b, + 0x11c7c: 0xe0004547, 0x11c7d: 0xe000879e, + // Block 0x472, offset 0x11c80 + 0x11c80: 0xe00044f2, 0x11c81: 0xe000a0f1, 0x11c82: 0xe0004743, 0x11c83: 0xe00054ce, + 0x11c84: 0xe0004ac7, 0x11c86: 0xe0004acb, + 0x11c88: 0xe0007605, 0x11c89: 0xe000761d, + 0x11c8e: 0xe0009153, + 0x11c90: 0xe00055df, 0x11c91: 0xe0006c6e, 0x11c93: 0xe000a566, + 0x11c94: 0xe0005119, + 0x11cad: 0xe00090ab, 0x11caf: 0xe0008bcf, + 0x11cb4: 0xe00067ab, 0x11cb6: 0xe0009bf8, 0x11cb7: 0xe00041b6, + 0x11cbe: 0xe0004d55, 0x11cbf: 0xe00041e6, + // Block 0x473, offset 0x11cc0 + 0x11cc1: 0xe0005833, 0x11cc3: 0xe0008bd3, + 0x11cc5: 0xe0005ea7, 0x11cc6: 0xe0006402, + 0x11ccf: 0xe000486c, + 0x11cd3: 0xe00087a1, + 0x11cd4: 0xe000994c, 0x11cd7: 0xe0004673, + 0x11cdb: 0xe0005145, + 0x11cdd: 0xe0008ca5, 0x11cdf: 0xe000a6d7, + 0x11ce0: 0xe00058ae, 0x11ce1: 0xe0007d77, 0x11ce2: 0xe0009674, 0x11ce3: 0xe000750f, + 0x11ce7: 0xe0007c20, + 0x11ce8: 0xe0005c92, + 0x11ced: 0xe0006abc, 0x11cef: 0xe0008c1b, + 0x11cf0: 0xe0004746, 0x11cf1: 0xe00048a0, 0x11cf3: 0xe0006fef, + 0x11cf5: 0xe00064e2, 0x11cf6: 0xe0006194, + // Block 0x474, offset 0x11d00 + 0x11d04: 0xe0005028, 0x11d05: 0xe00065ca, + 0x11d09: 0xe0005f3e, 0x11d0a: 0xe00050c4, 0x11d0b: 0xe0005025, + 0x11d0c: 0xe00093e9, 0x11d0d: 0xe00048a4, + 0x11d10: 0xe0006973, 0x11d12: 0xe00066db, + 0x11d15: 0xe0008dab, 0x11d16: 0xe0008bd7, 0x11d17: 0xe0008ca8, + 0x11d18: 0xe0004ec9, 0x11d1a: 0xe00068be, + 0x11d1f: 0xe00055e3, + 0x11d20: 0xe00053f8, 0x11d23: 0xe0009647, + 0x11d27: 0xe0008658, + 0x11d28: 0xe0004749, + 0x11d2c: 0xe0004dc9, 0x11d2e: 0xe0006be6, + 0x11d32: 0xe0006d3c, + 0x11d39: 0xe00054d1, 0x11d3a: 0xe00049fb, 0x11d3b: 0xe000684a, + 0x11d3c: 0xe000684e, + // Block 0x475, offset 0x11d40 + 0x11d40: 0xe0007d7b, 0x11d41: 0xe00049d7, + 0x11d44: 0xe0008ac3, 0x11d45: 0xe00083a9, + 0x11d4b: 0xe000585f, + 0x11d4d: 0xe000741b, 0x11d4e: 0xe00097b8, + 0x11d51: 0xe0006976, 0x11d52: 0xe0009677, + 0x11d59: 0xe0009399, + 0x11d67: 0xe0005f96, + 0x11d70: 0xe00077a4, + 0x11d74: 0xe0005314, 0x11d76: 0xe0008de7, + 0x11d79: 0xe0009a14, + 0x11d7d: 0xe00079c1, 0x11d7f: 0xe0009890, + // Block 0x476, offset 0x11d80 + 0x11d82: 0xe0006b28, + 0x11d8a: 0xe000780f, + 0x11d8f: 0xe0004e71, + 0x11d93: 0xe0009eda, + 0x11d94: 0xe0006eaa, 0x11d95: 0xe0009a58, 0x11d97: 0xe00044b6, + 0x11d99: 0xe00060e2, 0x11d9a: 0xe000967a, + 0x11d9d: 0xe000592e, 0x11d9e: 0xe0005c5e, + 0x11da0: 0xe000517e, 0x11da1: 0xe00081dd, 0x11da2: 0xe00081e0, 0x11da3: 0xe0006197, + 0x11da5: 0xe00080ec, + 0x11da8: 0xe0008b2b, 0x11daa: 0xe0008ac7, 0x11dab: 0xe0008f9b, + 0x11dac: 0xe0004272, 0x11dad: 0xe000792d, 0x11dae: 0xe0008809, 0x11daf: 0xe000727b, + 0x11db3: 0xe0005ec2, + 0x11db5: 0xe0004ecd, 0x11db7: 0xe000a139, + 0x11db8: 0xe00097bb, 0x11db9: 0xe0007aed, + // Block 0x477, offset 0x11dc0 + 0x11dce: 0xe000415e, + 0x11dd1: 0xe00067ae, + 0x11dd4: 0xe00057e9, 0x11dd5: 0xe0007ef8, + 0x11dd8: 0xe0004cc0, 0x11ddb: 0xe00090af, + 0x11ddc: 0xe00063ae, 0x11ddf: 0xe00087c8, + 0x11de4: 0xe00044fe, 0x11de5: 0xe000a5f2, 0x11de6: 0xe0004226, 0x11de7: 0xe0006904, + 0x11ded: 0xe0006b2b, 0x11dee: 0xe0007af1, + 0x11df0: 0xe0009053, 0x11df1: 0xe000979d, + 0x11df4: 0xe0005bc2, 0x11df7: 0xe0004bc1, + 0x11dfb: 0xe0009b56, + 0x11dfc: 0xe000a0c1, 0x11dfe: 0xe00048fc, + // Block 0x478, offset 0x11e00 + 0x11e00: 0xe000481b, 0x11e01: 0xe00047c4, 0x11e03: 0xe00062d6, + 0x11e07: 0xe00089bf, + 0x11e0a: 0xe0006b5a, 0x11e0b: 0xe0004c1e, + 0x11e0c: 0xe0009c1b, 0x11e0d: 0xe0009351, 0x11e0e: 0xe0009210, + 0x11e10: 0xe0004b19, 0x11e13: 0xe0004958, + 0x11e25: 0xe000a39e, 0x11e26: 0xe0007f44, 0x11e27: 0xe00092fd, + 0x11e28: 0xe00049cb, 0x11e29: 0xe0004414, 0x11e2a: 0xe00043ed, + 0x11e2d: 0xe0006cee, + 0x11e32: 0xe0004880, + 0x11e39: 0xe000481e, 0x11e3b: 0xe0004e41, + 0x11e3d: 0xe0008cab, 0x11e3f: 0xe0004efd, + // Block 0x479, offset 0x11e40 + 0x11e40: 0xe00088db, 0x11e42: 0xe00075ad, + 0x11e45: 0xe0008deb, + 0x11e4a: 0xe000648e, 0x11e4b: 0xe0009c10, + 0x11e51: 0xe0005837, 0x11e52: 0xe000624a, 0x11e53: 0xe0005b86, + 0x11e54: 0xe0007055, 0x11e57: 0xe000880c, + 0x11e59: 0xe0009e8c, 0x11e5b: 0xe0004e74, + 0x11e5e: 0xe00097be, 0x11e5f: 0xe00086e8, + 0x11e61: 0xe0005fe3, 0x11e63: 0xe0007813, + 0x11e6b: 0xe00045a3, + 0x11e75: 0xe000967d, + 0x11e78: 0xe000626a, 0x11e79: 0xe0007157, 0x11e7a: 0xe000a4e8, 0x11e7b: 0xe0004e11, + 0x11e7d: 0xe0008eff, + // Block 0x47a, offset 0x11e80 + 0x11e83: 0xe00064d2, + 0x11e84: 0xe00042aa, 0x11e87: 0xe0009914, + 0x11e88: 0xe0007e57, 0x11e8a: 0xe0005be3, 0x11e8b: 0xe0004b76, + 0x11e90: 0xe0009aca, 0x11e92: 0xe0008020, 0x11e93: 0xe000727f, + 0x11e98: 0xe0004eb5, 0x11e99: 0xe00056a6, 0x11e9a: 0xe0007257, + 0x11e9f: 0xe000502b, + 0x11ea1: 0xe0006c72, 0x11ea2: 0xe0009a73, + 0x11ea6: 0xe0005623, + 0x11eab: 0xe000a6b1, + 0x11eb5: 0xe0006ba6, + 0x11ebf: 0xe00043a6, + // Block 0x47b, offset 0x11ec0 + 0x11ec0: 0xe00052e0, + 0x11ec4: 0xe000454b, + 0x11ec9: 0xe0008b2f, + 0x11ecd: 0xe00078ad, 0x11ece: 0xe0004f59, + 0x11ed0: 0xe00095a6, + 0x11ed4: 0xe000541c, 0x11ed7: 0xe0006522, + 0x11edc: 0xe000a665, 0x11edd: 0xe0008fa7, 0x11edf: 0xe0004161, + 0x11ee0: 0xe00046f3, 0x11ee2: 0xe000450e, 0x11ee3: 0xe00086ec, + 0x11eee: 0xe000552e, + 0x11ef3: 0xe00069e9, + 0x11ef6: 0xe0007aa1, + 0x11efb: 0xe000a069, + 0x11efc: 0xe0008318, 0x11eff: 0xe0007a9d, + // Block 0x47c, offset 0x11f00 + 0x11f02: 0xe00054d4, 0x11f03: 0xe0004df0, + 0x11f13: 0xe0005a2c, + 0x11f1a: 0xe0005887, 0x11f1b: 0xe0008f93, + 0x11f1c: 0xe0004821, 0x11f1d: 0xe0005577, 0x11f1e: 0xe0007a31, 0x11f1f: 0xe00058e6, + 0x11f2a: 0xe00058ea, + 0x11f2c: 0xe00099cc, + 0x11f36: 0xe000a1db, + 0x11f3b: 0xe0007772, + 0x11f3c: 0xe00095aa, + // Block 0x47d, offset 0x11f40 + 0x11f42: 0xe00062a2, 0x11f43: 0xe0009301, + 0x11f44: 0xe0005745, + 0x11f4a: 0xe0004db5, + 0x11f4c: 0xe00086f0, + 0x11f51: 0xe0009291, 0x11f52: 0xe0005749, + 0x11f56: 0xe0005795, + 0x11f5e: 0xe00059ee, + 0x11f60: 0xe000a87d, 0x11f61: 0xe00091ec, 0x11f63: 0xe000a835, + 0x11f6c: 0xe000a160, + 0x11f72: 0xe0007eb8, + 0x11f77: 0xe000a8ff, + 0x11f78: 0xe0007722, 0x11f79: 0xe00083d9, 0x11f7a: 0xe000502e, 0x11f7b: 0xe000a78c, + 0x11f7d: 0xe000a881, 0x11f7e: 0xe00049ff, 0x11f7f: 0xe00042ee, + // Block 0x47e, offset 0x11f80 + 0x11f83: 0xe0006c1e, + 0x11f86: 0xe000a885, 0x11f87: 0xe000a1f3, + 0x11f89: 0xe0004613, + 0x11f8c: 0xe000411f, 0x11f8e: 0xe0009afe, + 0x11f90: 0xe0004c21, + 0x11f94: 0xe000a1d4, + 0x11f99: 0xe000a8a1, 0x11f9a: 0xe0006e7a, 0x11f9b: 0xe00042f2, + 0x11f9f: 0xe000794c, + 0x11fa0: 0xe000955e, 0x11fa1: 0xe000a55e, 0x11fa2: 0xe0009011, 0x11fa3: 0xe0008b33, + 0x11fa4: 0xe00091ef, 0x11fa5: 0xe000661d, 0x11fa6: 0xe00060e5, 0x11fa7: 0xe00050c7, + 0x11faa: 0xe0007dfd, + 0x11fb2: 0xe0006fb0, + 0x11fb7: 0xe00058ce, + 0x11fb8: 0xe0004e2c, 0x11fbb: 0xe0006abf, + 0x11fbf: 0xe000605e, + // Block 0x47f, offset 0x11fc0 + 0x11fc0: 0xe0007e9c, 0x11fc2: 0xe0008d23, 0x11fc3: 0xe00076c9, + 0x11fc4: 0xe00090b3, 0x11fc6: 0xe0009b95, + 0x11fc9: 0xe0007283, 0x11fca: 0xe000715a, + 0x11fcd: 0xe0009eb6, + 0x11fd1: 0xe0004fd9, + 0x11fd6: 0xe000741f, + 0x11fd8: 0xe000865c, + 0x11fde: 0xe0008024, + 0x11fe2: 0xe000964a, + 0x11fe4: 0xe0006cba, + 0x11feb: 0xe0009b1a, + 0x11fed: 0xe00043aa, 0x11fee: 0xe0005972, 0x11fef: 0xe00069ed, + 0x11ff2: 0xe0006efe, 0x11ff3: 0xe00071e4, + 0x11ff5: 0xe00052e4, 0x11ff7: 0xe00082f4, + 0x11ffa: 0xe0006bd2, + 0x11ffc: 0xe000418a, 0x11ffd: 0xe000a6f5, 0x11fff: 0xe0008937, + // Block 0x480, offset 0x12000 + 0x12001: 0xe000a7b6, + 0x12004: 0xe0004563, 0x12005: 0xe00083ac, 0x12006: 0xe0004c24, + 0x1200b: 0xe00060e8, + 0x1200d: 0xe0005fe6, 0x1200f: 0xe0005eaa, + 0x12012: 0xe000554f, 0x12013: 0xe000828c, + 0x12014: 0xe0006907, 0x12016: 0xe000690a, 0x12017: 0xe000690d, + 0x12018: 0xe0006910, 0x1201a: 0xe0009305, 0x1201b: 0xe0005fe9, + 0x1202b: 0xe000a3ce, + 0x1202c: 0xe0004c27, 0x1202f: 0xe00053b0, + 0x12033: 0xe0009917, + 0x1203f: 0xe0006bc6, + // Block 0x481, offset 0x12040 + 0x12045: 0xe000939d, + 0x12048: 0xe000893b, + 0x1204f: 0xe0007537, + 0x12050: 0xe0008851, 0x12051: 0xe00061fe, 0x12053: 0xe0005efe, + 0x1205b: 0xe0006852, + 0x12063: 0xe0005031, + 0x12064: 0xe00084d0, + 0x12073: 0xe0007cc4, + 0x12074: 0xe000715d, 0x12077: 0xe0006a49, + 0x12078: 0xe0007af5, + 0x1207e: 0xe00064e6, 0x1207f: 0xe0004e14, + // Block 0x482, offset 0x12080 + 0x12080: 0xe0008b37, 0x12081: 0xe0008f9f, 0x12082: 0xe0004c2a, 0x12083: 0xe0009cee, + 0x1208b: 0xe0008644, + 0x1208e: 0xe00064ea, 0x1208f: 0xe0005489, + 0x12090: 0xe0006da6, 0x12092: 0xe0005e81, + 0x12094: 0xe000a86d, 0x12095: 0xe0006b7a, 0x12097: 0xe0009ffd, + 0x12099: 0xe0007c62, 0x1209a: 0xe0007c23, 0x1209b: 0xe00074bb, + 0x1209c: 0xe0006b2e, 0x1209d: 0xe000794f, 0x1209e: 0xe000a4ab, 0x1209f: 0xe0004352, + 0x120a0: 0xe0009014, + 0x120a8: 0xe00048f0, 0x120aa: 0xe0007de3, + 0x120ad: 0xe0007b84, + 0x120b0: 0xe0009b98, 0x120b2: 0xe0004fa1, + 0x120b4: 0xe0009cda, 0x120b6: 0xe000613b, + 0x120ba: 0xe00045cb, + 0x120bd: 0xe0005034, 0x120be: 0xe0006816, + // Block 0x483, offset 0x120c0 + 0x120c1: 0xe00074f7, 0x120c2: 0xe0005037, 0x120c3: 0xe0007c90, + 0x120c4: 0xe0008050, 0x120c5: 0xe00080a8, 0x120c6: 0xe000a0f5, 0x120c7: 0xe00079c5, + 0x120c8: 0xe00099f4, 0x120c9: 0xe0009a18, + 0x120cc: 0xe0005593, 0x120cd: 0xe000a437, + 0x120d0: 0xe000603e, 0x120d2: 0xe0006062, 0x120d3: 0xe00053cc, + 0x120d4: 0xe0005f42, 0x120d5: 0xe0006177, 0x120d6: 0xe00098b0, + 0x120d8: 0xe0006979, 0x120d9: 0xe0006ac2, 0x120da: 0xe0009017, 0x120db: 0xe0009cfe, + 0x120eb: 0xe0005e35, + 0x120ec: 0xe0005ec5, 0x120ee: 0xe000880f, + 0x120f0: 0xe0009ace, 0x120f1: 0xe0009a76, 0x120f3: 0xe0009f91, + 0x120f8: 0xe0006913, 0x120f9: 0xe00081e3, 0x120fb: 0xe000994f, + 0x120fc: 0xe0006ff2, 0x120fd: 0xe00047c7, 0x120fe: 0xe000957a, 0x120ff: 0xe00079c9, + // Block 0x484, offset 0x12100 + 0x12101: 0xe000a5f6, 0x12102: 0xe000a327, + 0x12104: 0xe0006eae, 0x12105: 0xe00071e7, 0x12106: 0xe000850c, + 0x12109: 0xe00094a6, 0x1210a: 0xe000626e, + 0x1210c: 0xe0009f27, + 0x12110: 0xe0005c46, 0x12111: 0xe0008240, 0x12113: 0xe000a4af, + 0x12114: 0xe00042f6, 0x12115: 0xe000650a, 0x12117: 0xe0006ac5, + 0x12119: 0xe0009dba, 0x1211a: 0xe00085c1, 0x1211b: 0xe00064ee, + 0x1211c: 0xe0009056, 0x1211d: 0xe0007058, + 0x12120: 0xe00059f2, 0x12121: 0xe0009e18, 0x12122: 0xe0009c71, 0x12123: 0xe0008370, + 0x12125: 0xe000528e, + 0x12128: 0xe0008e54, 0x1212b: 0xe000a23f, + 0x1212e: 0xe00062da, 0x1212f: 0xe0006202, + 0x12130: 0xe0009b9b, 0x12131: 0xe00076dd, 0x12133: 0xe0007af9, + // Block 0x485, offset 0x12140 + 0x12144: 0xe000a68c, 0x12147: 0xe00084d4, + 0x1214a: 0xe00094ea, 0x1214b: 0xe0007817, + 0x1214c: 0xe0005952, + 0x12151: 0xe0006620, 0x12152: 0xe0006fc5, + 0x12157: 0xe0006fb3, + 0x12159: 0xe0007160, 0x1215b: 0xe0005719, + 0x1215e: 0xe00055e7, 0x1215f: 0xe0008442, + 0x12165: 0xe00090b7, 0x12167: 0xe00081e6, + 0x12169: 0xe0006eb2, 0x1216a: 0xe000a4b3, 0x1216b: 0xe000a21f, + 0x1216c: 0xe00070a6, 0x1216e: 0xe0005531, + 0x12172: 0xe0008e57, + 0x12175: 0xe0007287, 0x12176: 0xe000a81d, + 0x12178: 0xe0004aa7, 0x12179: 0xe00080ac, 0x1217a: 0xe0005fbe, 0x1217b: 0xe000a5b6, + 0x1217c: 0xe0007d5c, 0x1217d: 0xe000a895, 0x1217e: 0xe0009c74, + // Block 0x486, offset 0x12180 + 0x12181: 0xe0005bc5, + 0x12199: 0xe0008a47, 0x1219a: 0xe0008f03, + 0x1219c: 0xe00069f1, + 0x121a1: 0xe000636a, 0x121a3: 0xe0007d7f, + 0x121a4: 0xe0004b48, 0x121a5: 0xe0008380, 0x121a6: 0xe0009e1b, 0x121a7: 0xe0007b51, + 0x121a9: 0xe000a3d1, 0x121aa: 0xe00057d1, + 0x121ac: 0xe0005c95, 0x121ae: 0xe0006751, + 0x121b4: 0xe0007ebc, 0x121b7: 0xe000a13c, + 0x121b8: 0xe00099f8, 0x121b9: 0xe000a2db, + 0x121bf: 0xe0009d01, + // Block 0x487, offset 0x121c0 + 0x121c2: 0xe0005534, + 0x121c5: 0xe0007a55, 0x121c7: 0xe0004677, + 0x121c8: 0xe0006ff5, 0x121c9: 0xe0006f36, + 0x121cc: 0xe0007efc, 0x121cd: 0xe000a6da, 0x121ce: 0xe00079cd, + 0x121d1: 0xe000708e, 0x121d3: 0xe00079d1, + 0x121d4: 0xe000868c, 0x121d5: 0xe000962c, 0x121d6: 0xe0005cd1, + 0x121ea: 0xe00067b1, 0x121eb: 0xe0004a2f, + 0x121ef: 0xe00076fb, + 0x121f2: 0xe0007752, + 0x121f4: 0xe0007dcb, 0x121f5: 0xe000a06d, 0x121f7: 0xe0005627, + 0x121f8: 0xe000a737, + 0x121fc: 0xe0005863, 0x121ff: 0xe0009ad2, + // Block 0x488, offset 0x12200 + 0x12200: 0xe0008b3b, 0x12203: 0xe0004db9, + 0x12204: 0xe0009952, 0x12205: 0xe0006daa, 0x12206: 0xe000a6dd, 0x12207: 0xe000503a, + 0x12208: 0xe0004d75, 0x1220b: 0xe0005d47, + 0x1220f: 0xe000a3d4, + 0x12211: 0xe000722b, 0x12212: 0xe0009423, + 0x12216: 0xe0005255, + 0x12218: 0xe00054d7, 0x12219: 0xe0008daf, 0x1221a: 0xe0005b89, + 0x1221d: 0xe000697c, 0x1221e: 0xe00070e6, + 0x12220: 0xe000697f, 0x12221: 0xe000536c, 0x12222: 0xe0007999, + 0x12224: 0xe000789b, 0x12225: 0xe0005aa4, 0x12226: 0xe00042fa, + 0x12228: 0xe0008b3f, 0x1222a: 0xe0005c0e, 0x1222b: 0xe0008344, + 0x1222c: 0xe000731a, 0x1222e: 0xe000a668, + 0x12231: 0xe00074fb, 0x12233: 0xe000728b, + 0x12235: 0xe00079d5, 0x12236: 0xe000580d, 0x12237: 0xe000a46f, + 0x12238: 0xe00095fe, 0x12239: 0xe000790d, 0x1223a: 0xe00094aa, 0x1223b: 0xe000957e, + 0x1223c: 0xe00060be, + // Block 0x489, offset 0x12240 + 0x12257: 0xe0006bea, + 0x12259: 0xe000a56a, 0x1225a: 0xe0008812, 0x1225b: 0xe00042ae, + 0x1225d: 0xe0009c42, 0x1225f: 0xe0008b43, + 0x12260: 0xe000445c, 0x12261: 0xe00054da, 0x12263: 0xe0006ac8, + 0x12264: 0xe0006346, 0x12265: 0xe00075b1, 0x12266: 0xe0007d38, + 0x12268: 0xe0007e1e, 0x1226b: 0xe0006eb6, + 0x1226c: 0xe000992a, 0x1226d: 0xe000814a, 0x1226f: 0xe000a0f9, + 0x12272: 0xe0006e06, + 0x12274: 0xe0004252, 0x12276: 0xe0007afd, 0x12277: 0xe0007a35, + 0x12278: 0xe00081e9, 0x1227a: 0xe00060af, + 0x1227c: 0xe000619a, 0x1227d: 0xe00087a4, 0x1227e: 0xe000a473, + // Block 0x48a, offset 0x12280 + 0x12283: 0xe0006433, + 0x12284: 0xe000619d, 0x12285: 0xe0005932, + 0x1228a: 0xe0008e5a, + 0x1228d: 0xe00052e8, 0x1228e: 0xe0005f62, + 0x12291: 0xe0006d78, 0x12293: 0xe0006856, + 0x12294: 0xe00089c3, 0x12296: 0xe000a3d7, + 0x12298: 0xe0006c76, 0x1229b: 0xe0005370, + 0x1229c: 0xe0007423, 0x1229e: 0xe0008b47, 0x1229f: 0xe000a5fa, + 0x122a3: 0xe0006222, + 0x122a7: 0xe0007f00, + 0x122ab: 0xe00097c1, + 0x122ae: 0xe00084a0, 0x122af: 0xe0009b6e, + 0x122b2: 0xe00080b0, 0x122b3: 0xe0005182, + 0x122ba: 0xe0006623, + // Block 0x48b, offset 0x122c0 + 0x122cf: 0xe0005420, + 0x122d0: 0xe00080b4, + 0x122d5: 0xe000607e, 0x122d6: 0xe0008f07, + 0x122d8: 0xe000a0c5, + 0x122dc: 0xe0005bc8, 0x122dd: 0xe0004c2d, 0x122df: 0xe0005f9a, + 0x122e2: 0xe00084fc, + 0x122e5: 0xe0006754, 0x122e7: 0xe0005c2e, + 0x122ea: 0xe000474c, 0x122eb: 0xe0007ca0, + 0x122ef: 0xe0006ff8, + 0x122f1: 0xe00090bb, 0x122f2: 0xe00071ea, + 0x122f5: 0xe000831c, 0x122f6: 0xe0007f04, 0x122f7: 0xe000a487, + 0x122fa: 0xe00052a7, + 0x122fd: 0xe0007ecc, + // Block 0x48c, offset 0x12300 + 0x12302: 0xe00063b2, 0x12303: 0xe0007d1c, + 0x12304: 0xe0009355, 0x12305: 0xe0005f72, + 0x12308: 0xe000a43a, 0x12309: 0xe000a5fe, 0x1230b: 0xe0008582, + 0x1230c: 0xe0009452, 0x1230e: 0xe000a32b, + 0x12311: 0xe000a5ba, 0x12313: 0xe00087a7, + 0x12314: 0xe00054dd, 0x12315: 0xe00056ce, + 0x12319: 0xe000a68f, + 0x1232c: 0xe000a43d, 0x1232d: 0xe0009f4b, 0x1232f: 0xe000962f, + 0x12334: 0xe0008893, 0x12335: 0xe000624e, 0x12337: 0xe0005a59, + 0x12338: 0xe000a3da, + 0x1233e: 0xe00048a8, 0x1233f: 0xe0005ddd, + // Block 0x48d, offset 0x12340 + 0x12341: 0xe0007880, 0x12342: 0xe0009e8f, + 0x12344: 0xe0007725, 0x12346: 0xe00099e4, + 0x12349: 0xe0005aa8, + 0x1234c: 0xe0004f35, 0x1234f: 0xe0005b8c, + 0x12351: 0xe00043f0, 0x12353: 0xe0005cd4, + 0x12354: 0xe00079d9, 0x12355: 0xe0008cae, + 0x12359: 0xe0005318, 0x1235a: 0xe0004cc3, + 0x12360: 0xe0005da1, 0x12362: 0xe000a001, 0x12363: 0xe0005906, + 0x1236a: 0xe00083dc, 0x1236b: 0xe0005de1, + 0x1236c: 0xe000901a, 0x1236d: 0xe0005e85, + 0x12370: 0xe00068d2, 0x12371: 0xe0007163, 0x12372: 0xe0009359, 0x12373: 0xe000875c, + 0x12378: 0xe0008a73, + 0x1237c: 0xe00097a0, 0x1237e: 0xe000784f, 0x1237f: 0xe00086f4, + // Block 0x48e, offset 0x12380 + 0x12381: 0xe0007b01, + 0x1238f: 0xe00082cc, + 0x12391: 0xe000634a, + 0x12394: 0xe00045cf, 0x12397: 0xe000919f, + 0x12398: 0xe00062de, 0x12399: 0xe0004e77, 0x1239a: 0xe000722f, 0x1239b: 0xe000867c, + 0x1239c: 0xe0008690, 0x1239d: 0xe000a8a5, 0x1239e: 0xe0005a2f, 0x1239f: 0xe0006dae, + 0x123a1: 0xe00055ab, 0x123a2: 0xe000a602, + 0x123a4: 0xe00082a8, 0x123a6: 0xe0005b5d, + 0x123ad: 0xe0005374, 0x123ae: 0xe0008cb1, 0x123af: 0xe0007513, + 0x123b0: 0xe0004df3, + 0x123b4: 0xe0008854, + 0x123b8: 0xe0006baa, 0x123ba: 0xe0008660, + 0x123bc: 0xe00055eb, 0x123bd: 0xe0006626, 0x123be: 0xe0005cf3, + // Block 0x48f, offset 0x123c0 + 0x123c1: 0xe0006c0a, 0x123c2: 0xe00091c7, + 0x123c4: 0xe00091c3, 0x123c6: 0xe0007e9f, + 0x123c8: 0xe0009536, 0x123c9: 0xe00042fe, 0x123cb: 0xe000a6b9, + 0x123cc: 0xe00073ec, 0x123cd: 0xe0008e5d, 0x123ce: 0xe0009d26, + 0x123d0: 0xe0008028, 0x123d2: 0xe000a4cf, + 0x123d4: 0xe000a3dd, 0x123d7: 0xe00041ea, + 0x123d8: 0xe0006bae, + 0x123df: 0xe0005c56, + 0x123e1: 0xe0008d26, 0x123e3: 0xe000a005, + 0x123e4: 0xe0009bc9, 0x123e7: 0xe0005a11, + 0x123e8: 0xe0006d7b, + 0x123ee: 0xe000a66b, 0x123ef: 0xe0009245, + 0x123f1: 0xe000893f, 0x123f3: 0xe0007c26, + 0x123f6: 0xe00089c7, + 0x123f9: 0xe0005378, + 0x123fe: 0xe0005334, + // Block 0x490, offset 0x12400 + 0x12400: 0xe000454f, 0x12401: 0xe0009aae, 0x12402: 0xe0005976, 0x12403: 0xe0005227, + 0x12406: 0xe000685a, 0x12407: 0xe0006cf2, + 0x12409: 0xe00071ed, 0x1240a: 0xe0007b87, + 0x12415: 0xe0007330, + 0x12418: 0xe00051ff, 0x1241a: 0xe0007b05, 0x1241b: 0xe0006082, + 0x1241e: 0xe0006982, 0x1241f: 0xe0008c1e, + 0x12420: 0xe000a3e0, 0x12421: 0xe00081ec, + 0x12424: 0xe00054e0, + 0x12429: 0xe000a3e3, 0x1242b: 0xe0005799, + 0x1242c: 0xe0008f0b, 0x1242e: 0xe00066a3, 0x1242f: 0xe0009ab2, + 0x12431: 0xe00069f5, 0x12433: 0xe0008694, + 0x12434: 0xe0007b55, + 0x1243a: 0xe00094ee, + 0x1243e: 0xe000588a, + // Block 0x491, offset 0x12440 + 0x12441: 0xe000781b, + 0x12445: 0xe000a32f, 0x12446: 0xe0005553, 0x12447: 0xe0007def, + 0x12449: 0xe0006acb, 0x1244b: 0xe00074ff, + 0x1244f: 0xe0005bcb, + 0x12451: 0xe0009e75, 0x12452: 0xe0006cf6, 0x12453: 0xe00091cb, + 0x12455: 0xe00069f9, + 0x12458: 0xe0005a32, 0x1245a: 0xe000a009, 0x1245b: 0xe0007b09, + 0x1245c: 0xe00082d8, 0x1245d: 0xe00058d2, 0x1245e: 0xe0008b4b, 0x1245f: 0xe0006ffb, + 0x12463: 0xe000a13f, + 0x12466: 0xe0008857, 0x12467: 0xe0005ac8, + 0x12468: 0xe0005af7, + 0x1246f: 0xe0007b0d, + 0x12470: 0xe00061cd, 0x12472: 0xe0005982, + 0x12477: 0xe0008454, + 0x12478: 0xe00095ae, + 0x1247c: 0xe0007853, 0x1247e: 0xe000574d, + // Block 0x492, offset 0x12480 + 0x12484: 0xe0006f46, + 0x1248c: 0xe0004a03, 0x1248e: 0xe0007aa5, + 0x12490: 0xe000a333, 0x12491: 0xe0007109, 0x12493: 0xe0005769, + 0x12498: 0xe0009b02, + 0x1249d: 0xe000a3e6, 0x1249e: 0xe0009c98, + 0x124a3: 0xe0005de5, + 0x124a9: 0xe0007aa9, 0x124ab: 0xe000a4eb, + 0x124af: 0xe0008bdb, + 0x124b0: 0xe000a66e, + 0x124b8: 0xe0004c30, + 0x124bc: 0xe0008614, 0x124bd: 0xe00087aa, 0x124be: 0xe00087cb, + // Block 0x493, offset 0x124c0 + 0x124c1: 0xe00050ca, + 0x124c5: 0xe000467b, 0x124c6: 0xe000616b, + 0x124ca: 0xe00098f6, + 0x124ce: 0xe0007a6d, + 0x124d2: 0xe0009680, + 0x124d5: 0xe000a115, + 0x124d8: 0xe000a839, 0x124d9: 0xe0008585, 0x124da: 0xe0004aab, + 0x124e1: 0xe0008b4f, + 0x124e4: 0xe0006ffe, + 0x124eb: 0xe000a243, + 0x124ec: 0xe000445f, 0x124ed: 0xe0009b06, 0x124ee: 0xe0009e51, 0x124ef: 0xe000a337, + 0x124f0: 0xe0009e54, 0x124f3: 0xe00065ce, + 0x124f7: 0xe0008e60, + 0x124f8: 0xe0008618, 0x124f9: 0xe0008a77, + // Block 0x494, offset 0x12500 + 0x12508: 0xe0005956, 0x1250a: 0xe0007857, 0x1250b: 0xe000a7e9, + 0x1250f: 0xe0007c29, + 0x12513: 0xe0004776, + 0x12518: 0xe000a4b7, 0x12519: 0xe000571d, + 0x1251c: 0xe000a7a4, 0x1251d: 0xe0008fbf, 0x1251f: 0xe00079dd, + 0x12531: 0xe000467f, + 0x12539: 0xe0009d2a, + 0x1253d: 0xe00066df, + // Block 0x495, offset 0x12540 + 0x12544: 0xe000a75c, + 0x12549: 0xe00078c5, + 0x1254c: 0xe0008f0f, + 0x12559: 0xe0006436, 0x1255a: 0xe000681a, + 0x1255c: 0xe000a48b, 0x1255e: 0xe0005597, + 0x12560: 0xe000731d, 0x12561: 0xe00060eb, + 0x12566: 0xe0009683, + 0x1256d: 0xe00046fb, 0x1256e: 0xe000a84d, 0x1256f: 0xe0008648, + 0x12570: 0xe0007a71, 0x12571: 0xe000a223, + 0x12576: 0xe00079e1, + // Block 0x496, offset 0x12580 + 0x12586: 0xe0009fb5, 0x12587: 0xe000a7d1, + 0x12589: 0xe000590a, 0x1258a: 0xe000a79c, + 0x1258c: 0xe000a606, 0x1258e: 0xe0008943, + 0x12590: 0xe0007b11, 0x12592: 0xe000817d, + 0x12596: 0xe0005156, 0x12597: 0xe0005162, + 0x12599: 0xe00079e5, + 0x1259c: 0xe0008008, 0x1259e: 0xe0006bd6, + 0x125a2: 0xe00046f7, + 0x125a4: 0xe0005ead, 0x125a5: 0xe000a56e, 0x125a6: 0xe000a722, 0x125a7: 0xe0008cb4, + 0x125a8: 0xe0007e21, 0x125a9: 0xe0006492, + 0x125ac: 0xe000781f, 0x125ae: 0xe0008588, + 0x125bd: 0xe0006e0a, + // Block 0x497, offset 0x125c0 + 0x125c0: 0xe0007acd, + 0x125c4: 0xe0007427, 0x125c5: 0xe0007cc8, 0x125c7: 0xe000a6f8, + 0x125c9: 0xe000802c, 0x125ca: 0xe0008070, + 0x125cf: 0xe000a760, + 0x125d2: 0xe000a33b, + 0x125d4: 0xe0007f08, + 0x125d9: 0xe000a8d8, 0x125db: 0xe0009eb9, + 0x125df: 0xe0007233, + 0x125e0: 0xe0007348, 0x125e2: 0xe00066e3, + 0x125e4: 0xe0008470, + 0x125e8: 0xe0008180, + 0x125ec: 0xe0007c2c, 0x125ef: 0xe0006e7e, + 0x125f1: 0xe0007a59, 0x125f2: 0xe00046ff, + 0x125f9: 0xe000a8db, 0x125fa: 0xe000a8de, + 0x125fe: 0xe0009955, + // Block 0x498, offset 0x12600 + 0x12601: 0xe0007ac1, 0x12603: 0xe00079e9, + 0x12608: 0xe00056aa, 0x12609: 0xe000559b, 0x1260b: 0xe00096da, + 0x1260e: 0xe0005b3c, + 0x12610: 0xe0005cf7, 0x12612: 0xe0007001, + 0x12614: 0xe0006496, 0x12615: 0xe00079ed, 0x12616: 0xe0007517, + 0x12619: 0xe0009b76, + 0x1261f: 0xe0007b15, + 0x12620: 0xe0008018, + 0x12625: 0xe0008cb7, 0x12626: 0xe0009249, 0x12627: 0xe0007166, + 0x1262c: 0xe000a7b9, 0x1262d: 0xe0009712, 0x1262e: 0xe0006f3a, + 0x12639: 0xe000a902, 0x1263b: 0xe000a764, + 0x1263c: 0xe0007473, 0x1263e: 0xe00054e3, 0x1263f: 0xe0007e5a, + // Block 0x499, offset 0x12640 + 0x12640: 0xe000a20f, + 0x12646: 0xe0009e79, 0x12647: 0xe0006ee6, + 0x1264b: 0xe000a778, + 0x1264c: 0xe0004acf, 0x1264d: 0xe0006b5e, + 0x12650: 0xe0005a35, + 0x12654: 0xe000a905, 0x12657: 0xe0007ad1, + 0x1265a: 0xe00077cf, 0x1265b: 0xe0005751, + 0x1265f: 0xe0004a33, + 0x12665: 0xe0009726, + 0x12668: 0xe0009295, 0x1266a: 0xe0008cba, + 0x1266c: 0xe0009c77, 0x1266d: 0xe00087d1, + 0x12670: 0xe00080b8, 0x12672: 0xe000814d, + 0x12675: 0xe000861c, 0x12676: 0xe0006757, + 0x12678: 0xe0009c9b, 0x12679: 0xe00052b9, 0x1267a: 0xe00077a7, 0x1267b: 0xe000a6e0, + 0x1267d: 0xe0006c7a, 0x1267e: 0xe0008406, + // Block 0x49a, offset 0x12680 + 0x12680: 0xe0006c7e, 0x12682: 0xe0008760, + 0x12686: 0xe00086f8, 0x12687: 0xe0009d52, + 0x12688: 0xe0009cc2, 0x1268b: 0xe00089cb, + 0x1268c: 0xe0009d04, + 0x12692: 0xe00095ca, 0x12693: 0xe0006406, + 0x12694: 0xe00062a6, 0x12696: 0xe0008243, + 0x12698: 0xe0005557, 0x12699: 0xe000754f, 0x1269a: 0xe0009bd5, 0x1269b: 0xe0007f7f, + 0x1269d: 0xe00069fd, 0x1269f: 0xe0005fec, + 0x126a1: 0xe0005fef, 0x126a2: 0xe0005afa, + 0x126a7: 0xe0006042, + 0x126a9: 0xe000617b, + 0x126af: 0xe0004824, + 0x126b2: 0xe0006cfa, + 0x126b4: 0xe000885a, + 0x126b8: 0xe00085c4, 0x126b9: 0xe0009c50, + 0x126bd: 0xe000457b, + // Block 0x49b, offset 0x126c0 + 0x126c0: 0xe0006d3f, 0x126c1: 0xe0005c98, + 0x126c7: 0xe000685e, + 0x126cd: 0xe00044d2, + 0x126d2: 0xe000a440, + 0x126d6: 0xe0005739, + 0x126e2: 0xe000555b, + 0x126e7: 0xe000a8e1, + 0x126ec: 0xe000457f, 0x126ef: 0xe00064f2, + 0x126f3: 0xe000864c, + 0x126f4: 0xe0007621, 0x126f5: 0xe000a912, + // Block 0x49c, offset 0x12700 + 0x12700: 0xe0006c82, 0x12702: 0xe0004aaf, + 0x12704: 0xe0008897, + 0x12709: 0xe0006985, + 0x1270e: 0xe00076b1, + 0x12710: 0xe000a3e9, 0x12712: 0xe0006988, + 0x12717: 0xe0004c33, + 0x12719: 0xe0008815, + 0x12721: 0xe0004b79, 0x12722: 0xe0009fd5, + 0x12725: 0xe00072d3, + 0x12728: 0xe00082e4, 0x12729: 0xe0007169, + 0x12734: 0xe0009deb, 0x12737: 0xe00045a7, + 0x12738: 0xe0005c9b, 0x12739: 0xe000a2df, 0x1273a: 0xe0008320, 0x1273b: 0xe0006bb2, + 0x1273c: 0xe00057d5, 0x1273d: 0xe0009d07, + // Block 0x49d, offset 0x12740 + 0x12749: 0xe00050cd, 0x1274a: 0xe0007b8a, + 0x12753: 0xe00049af, + 0x12756: 0xe000935d, 0x12757: 0xe00083df, + 0x12758: 0xe0008c51, 0x12759: 0xe00087e5, 0x1275b: 0xe0005f02, + 0x1275c: 0xe00073b0, 0x1275d: 0xe0008d93, + 0x12762: 0xe000a443, + 0x12765: 0xe0007e0f, 0x12767: 0xe0007d5f, + 0x12768: 0xe00080f0, 0x12769: 0xe0006f7a, 0x1276a: 0xe0008818, 0x1276b: 0xe00060b2, + 0x12771: 0xe000521e, + 0x12774: 0xe000a73a, 0x12776: 0xe00081ef, 0x12777: 0xe00081f2, + 0x1277e: 0xe000a5be, 0x1277f: 0xe00080bc, + // Block 0x49e, offset 0x12780 + 0x12783: 0xe0007728, + 0x12784: 0xe0007c94, 0x12785: 0xe0006ace, + 0x12790: 0xe00086fc, 0x12792: 0xe0007c2f, + 0x12797: 0xe0004ddd, + 0x12798: 0xe0009dee, + 0x1279c: 0xe0005d1b, + 0x127a0: 0xe0005b60, + 0x127a8: 0xe000555f, 0x127a9: 0xe0007bc0, 0x127aa: 0xe000a671, 0x127ab: 0xe000a203, + 0x127ac: 0xe000a163, 0x127af: 0xe000a77c, + 0x127b0: 0xe0007b19, 0x127b2: 0xe000a6a5, + 0x127b5: 0xe000598a, 0x127b7: 0xe0004ad3, + 0x127b8: 0xe000716c, 0x127ba: 0xe0005338, 0x127bb: 0xe000a1df, + 0x127bc: 0xe00061d0, + // Block 0x49f, offset 0x127c0 + 0x127c1: 0xe000a207, + 0x127c4: 0xe000a247, 0x127c6: 0xe000858b, 0x127c7: 0xe00070ce, + 0x127c8: 0xe0005a5c, 0x127c9: 0xe0007c98, 0x127cb: 0xe0007de7, + 0x127ce: 0xe0008b53, + 0x127d4: 0xe00094ae, 0x127d5: 0xe000422a, 0x127d6: 0xe0004c36, 0x127d7: 0xe0007f82, + 0x127d8: 0xe000503d, + 0x127de: 0xe00067b4, 0x127df: 0xe0006206, + 0x127e0: 0xe0004417, + 0x127e6: 0xe00045df, 0x127e7: 0xe00082ac, + 0x127e9: 0xe0007d83, 0x127eb: 0xe0005ec8, + 0x127ed: 0xe0006a01, + 0x127f2: 0xe00059ae, 0x127f3: 0xe000546e, + 0x127f7: 0xe0008a93, + 0x127f9: 0xe000a24b, 0x127fb: 0xe0009c9e, + // Block 0x4a0, offset 0x12800 + 0x12800: 0xe0006272, 0x12802: 0xe0004122, + 0x12806: 0xe0008445, + 0x12808: 0xe0004164, 0x12809: 0xe000620a, 0x1280a: 0xe0006b7e, + 0x1280c: 0xe0009f2b, 0x1280d: 0xe00090bf, 0x1280f: 0xe000418e, + 0x12812: 0xe0009123, + 0x12816: 0xe0004ab3, + 0x12819: 0xe0004934, + 0x1281d: 0xe000a725, 0x1281e: 0xe0005721, + 0x12820: 0xe0008e63, 0x12822: 0xe0008324, 0x12823: 0xe000728f, + 0x12824: 0xe0006629, 0x12825: 0xe0008409, 0x12826: 0xe000a1ac, + 0x12829: 0xe000a33f, 0x1282a: 0xe0004e44, 0x1282b: 0xe00098c8, + 0x1282d: 0xe00062e2, 0x1282e: 0xe0009d19, + 0x12835: 0xe0008bdf, 0x12837: 0xe00060ee, + 0x12839: 0xe0006f7e, + 0x1283d: 0xe0008b57, 0x1283e: 0xe000a24f, + // Block 0x4a1, offset 0x12840 + 0x12841: 0xe0006e0e, 0x12843: 0xe0004c39, + 0x12844: 0xe000a287, 0x12845: 0xe00057d9, 0x12846: 0xe0005c9e, 0x12847: 0xe000716f, + 0x12849: 0xe0005bce, + 0x12853: 0xe0007d87, + 0x1285b: 0xe00099fc, + 0x12860: 0xe0008947, 0x12861: 0xe0007237, 0x12862: 0xe0009ab6, + 0x12864: 0xe00087e9, 0x12865: 0xe000a3ec, 0x12866: 0xe0005040, + 0x12868: 0xe00048ac, 0x1286a: 0xe0005043, 0x1286b: 0xe00066e7, + 0x1286c: 0xe0007d8b, 0x1286e: 0xe0008db3, 0x1286f: 0xe0004a07, + 0x12870: 0xe0007a75, 0x12871: 0xe0008d29, 0x12872: 0xe0006460, 0x12873: 0xe0005d4b, + 0x12874: 0xe0004f5d, 0x12875: 0xe0006916, 0x12876: 0xe0009c7a, + 0x12878: 0xe0009aba, 0x1287a: 0xe000650e, + 0x1287f: 0xe000a477, + // Block 0x4a2, offset 0x12880 + 0x12880: 0xe0007f85, 0x12881: 0xe0005ff2, 0x12883: 0xe0009894, + 0x12884: 0xe0006e12, 0x12885: 0xe0008c54, 0x12886: 0xe0006fa2, + 0x1288b: 0xe0008150, + 0x1288e: 0xe000a166, + 0x12895: 0xe0009f94, 0x12897: 0xe00080c0, + 0x12899: 0xe000520f, 0x1289a: 0xe000a3ef, 0x1289b: 0xe0007b1d, + 0x1289c: 0xe00081f5, 0x1289d: 0xe000a63a, 0x1289e: 0xe0006d42, 0x1289f: 0xe0007320, + 0x128a0: 0xe0005bd1, 0x128a2: 0xe0007f0c, 0x128a3: 0xe0007118, + 0x128a4: 0xe0007e5d, 0x128a5: 0xe0007ca4, + 0x128a8: 0xe00090c3, 0x128a9: 0xe000a343, 0x128aa: 0xe0005d72, + 0x128ad: 0xe0005424, 0x128af: 0xe00057dd, + 0x128b0: 0xe0004b28, 0x128b1: 0xe00089cf, 0x128b2: 0xe00093a1, 0x128b3: 0xe0009213, + 0x128bd: 0xe0008def, 0x128be: 0xe0004f01, + // Block 0x4a3, offset 0x128c0 + 0x128c0: 0xe00097a3, 0x128c2: 0xe0005046, 0x128c3: 0xe0005ca1, + 0x128c6: 0xe0004cc6, 0x128c7: 0xe0006e16, + 0x128c9: 0xe000590e, 0x128ca: 0xe000616f, 0x128cb: 0xe0008700, + 0x128d8: 0xe0005cfb, + 0x128dc: 0xe000a60a, 0x128dd: 0xe0004b2b, 0x128de: 0xe0006276, 0x128df: 0xe0004683, + 0x128e1: 0xe00090c7, 0x128e3: 0xe0005049, + 0x128e5: 0xe0004687, 0x128e7: 0xe0006526, + 0x128e8: 0xe000924d, 0x128ea: 0xe0008cbd, 0x128eb: 0xe0005428, + 0x128f0: 0xe000a572, 0x128f2: 0xe0007172, + 0x128f5: 0xe0007952, + 0x128f9: 0xe000723b, + 0x128fd: 0xe0006cd5, 0x128ff: 0xe0006e1a, + // Block 0x4a4, offset 0x12900 + 0x12906: 0xe0009157, + 0x1290a: 0xe000468b, + 0x1290f: 0xe0005acc, + 0x12914: 0xe0007b21, + 0x12918: 0xe0004a0b, 0x1291a: 0xe0009251, 0x1291b: 0xe000a592, + 0x1291c: 0xe0004985, + 0x12920: 0xe000a3f2, 0x12922: 0xe0009e92, 0x12923: 0xe0009cc6, + 0x12926: 0xe0007d3b, + 0x12929: 0xe00094f2, + 0x1292e: 0xe0007cf8, + 0x12932: 0xe0009bf0, + 0x12937: 0xe000858e, + // Block 0x4a5, offset 0x12940 + 0x12941: 0xe00065d2, 0x12943: 0xe000980c, + 0x12944: 0xe0004583, + 0x1294c: 0xe0004cc9, 0x1294d: 0xe0005f16, 0x1294e: 0xe00089d3, + 0x12951: 0xe0008fc3, 0x12953: 0xe0006542, + 0x12955: 0xe0007cfc, + 0x12958: 0xe00042b2, 0x1295a: 0xe0007503, 0x1295b: 0xe0009582, + 0x1295e: 0xe0006cbe, 0x1295f: 0xe0006cfe, + 0x12963: 0xe0006b82, + 0x12965: 0xe0006d02, 0x12966: 0xe0007004, + 0x12968: 0xe0007f10, 0x1296b: 0xe000662c, + 0x1296c: 0xe0007f14, + 0x12970: 0xe000894b, 0x12971: 0xe00081f8, 0x12972: 0xe000431a, 0x12973: 0xe0007477, + 0x12977: 0xe0005186, + 0x12978: 0xe000894f, 0x1297a: 0xe0008b5b, + 0x1297f: 0xe0005f1a, + // Block 0x4a6, offset 0x12980 + 0x12987: 0xe0004e9d, + 0x1298a: 0xe0004703, 0x1298b: 0xe00089d7, + 0x1298c: 0xe000474f, 0x1298e: 0xe00045ab, 0x1298f: 0xe0007e12, + 0x12991: 0xe0008953, 0x12993: 0xe00053d0, + 0x12994: 0xe00062e6, + 0x12999: 0xe0005bd4, 0x1299a: 0xe0006862, 0x1299b: 0xe00090cb, + 0x1299c: 0xe000984c, 0x1299d: 0xe00060f1, + 0x129a0: 0xe00089db, 0x129a2: 0xe0009f2f, + 0x129a4: 0xe000998e, 0x129a5: 0xe000581b, 0x129a6: 0xe000a7ec, 0x129a7: 0xe000581f, + 0x129aa: 0xe000649a, 0x129ab: 0xe000a515, + 0x129af: 0xe0008f13, + 0x129b0: 0xe000840c, + 0x129b5: 0xe000a4ee, 0x129b6: 0xe00053fc, + 0x129b8: 0xe000504c, 0x129ba: 0xe0004356, + 0x129bf: 0xe000504f, + // Block 0x4a7, offset 0x129c0 + 0x129c6: 0xe000435a, 0x129c7: 0xe0008e66, + 0x129c8: 0xe0006546, 0x129ca: 0xe00095ce, 0x129cb: 0xe0009f33, + 0x129ce: 0xe000700a, 0x129cf: 0xe0007007, + 0x129d1: 0xe00083af, + 0x129d4: 0xe0008be3, + 0x129d9: 0xe000a871, 0x129da: 0xe0004ccc, + 0x129dd: 0xe0006b86, + 0x129e3: 0xe0007fd3, + 0x129e5: 0xe00043f3, + 0x129e9: 0xe00098de, 0x129eb: 0xe000797d, + 0x129f1: 0xe0009e1e, 0x129f2: 0xe0009efc, 0x129f3: 0xe00042b6, + 0x129f4: 0xe000757f, 0x129f5: 0xe0008591, + 0x129f8: 0xe000533c, 0x129f9: 0xe00090cf, + 0x129fc: 0xe00055ef, 0x129fd: 0xe000881b, 0x129fe: 0xe000915b, + // Block 0x4a8, offset 0x12a00 + 0x12a00: 0xe0004ccf, 0x12a02: 0xe0004125, 0x12a03: 0xe000a28b, + 0x12a05: 0xe00065d6, 0x12a07: 0xe0008fc7, + 0x12a0a: 0xe00089df, + 0x12a0d: 0xe000840f, 0x12a0e: 0xe000a169, + 0x12a12: 0xe0007823, 0x12a13: 0xe0009991, + 0x12a14: 0xe0009958, 0x12a15: 0xe000a83d, + 0x12a18: 0xe0005653, 0x12a19: 0xe000468f, 0x12a1b: 0xe0009bfc, + 0x12a1e: 0xe000698b, + 0x12a22: 0xe0005ca4, 0x12a23: 0xe0009059, + 0x12a24: 0xe0008e15, 0x12a27: 0xe0006b31, + 0x12a30: 0xe000537c, 0x12a32: 0xe0005d75, 0x12a33: 0xe0005d57, + 0x12a34: 0xe000995b, + 0x12a39: 0xe000698e, 0x12a3a: 0xe0006919, + 0x12a3c: 0xe00047ca, 0x12a3f: 0xe0008183, + // Block 0x4a9, offset 0x12a40 + 0x12a40: 0xe0007883, 0x12a41: 0xe00098e1, + 0x12a47: 0xe0008df3, + 0x12a48: 0xe0004779, 0x12a49: 0xe0008246, 0x12a4b: 0xe0009eee, + 0x12a4d: 0xe0007827, + 0x12a50: 0xe0008249, + 0x12a55: 0xe0009fb8, + 0x12a59: 0xe000700d, + 0x12a5f: 0xe0007ca8, + 0x12a60: 0xe0009456, 0x12a61: 0xe0009361, 0x12a62: 0xe00062ea, + 0x12a64: 0xe0005bd7, 0x12a66: 0xe0007175, 0x12a67: 0xe0009fd9, + 0x12a6f: 0xe0008d7b, + 0x12a70: 0xe0005707, 0x12a73: 0xe000980f, + 0x12a74: 0xe0008764, + 0x12a7b: 0xe0005b8f, + // Block 0x4aa, offset 0x12a80 + 0x12a82: 0xe0005b3f, 0x12a83: 0xe0005c36, + 0x12a86: 0xe0005a5f, + 0x12a88: 0xe0009df1, 0x12a89: 0xe000531c, + 0x12a8c: 0xe0007671, 0x12a8e: 0xe00041ee, + 0x12a92: 0xe00081fb, + 0x12a95: 0xe0007d20, 0x12a96: 0xe000652a, + 0x12a98: 0xe00058b1, + 0x12a9c: 0xe00089e3, + 0x12aa1: 0xe000995e, 0x12aa2: 0xe000785b, + 0x12aa4: 0xe0008a4b, 0x12aa5: 0xe00091cf, 0x12aa7: 0xe00058ee, + 0x12aa8: 0xe00049db, 0x12aa9: 0xe00056ec, + 0x12aac: 0xe0006e1e, 0x12aad: 0xe0007b59, 0x12aae: 0xe0008328, 0x12aaf: 0xe0004cd2, + 0x12ab0: 0xe0007d00, 0x12ab1: 0xe0009b1e, 0x12ab2: 0xe0008957, + 0x12ab8: 0xe0004752, 0x12abb: 0xe00056ae, + 0x12abc: 0xe000634e, 0x12abd: 0xe000647a, 0x12abe: 0xe000647e, + // Block 0x4ab, offset 0x12ac0 + 0x12ac0: 0xe0004fb5, 0x12ac1: 0xe0008d2c, 0x12ac3: 0xe000601f, + 0x12ac4: 0xe000889b, 0x12ac6: 0xe00043f6, 0x12ac7: 0xe000a60e, + 0x12acb: 0xe0004827, + 0x12ace: 0xe0004b7c, + 0x12ad0: 0xe00047cd, 0x12ad3: 0xe000a3f5, + 0x12ad6: 0xe000a596, + 0x12ada: 0xe000772b, 0x12adb: 0xe000a6fb, + 0x12adc: 0xe000a446, 0x12ade: 0xe000a449, + 0x12ae4: 0xe0009ca1, + 0x12aec: 0xe0009fdd, 0x12aee: 0xe0009eff, + 0x12af4: 0xe0008f43, 0x12af6: 0xe0006b34, + 0x12af8: 0xe0004d59, 0x12afa: 0xe00097c4, + 0x12aff: 0xe0005f9e, + // Block 0x4ac, offset 0x12b00 + 0x12b02: 0xe0007f88, 0x12b03: 0xe0006439, + 0x12b06: 0xe000681e, + 0x12b08: 0xe0007b25, 0x12b0a: 0xe0008458, + 0x12b0c: 0xe0007dcf, 0x12b0d: 0xe000a0c9, 0x12b0e: 0xe00076e1, + 0x12b12: 0xe000a0a1, + 0x12b14: 0xe000a692, 0x12b16: 0xe00043f9, + 0x12b19: 0xe0006641, 0x12b1b: 0xe0006f82, + 0x12b1c: 0xe00054e6, 0x12b1e: 0xe0008664, 0x12b1f: 0xe0005f0a, + 0x12b21: 0xe00090d3, 0x12b23: 0xe00042ba, + 0x12b24: 0xe00062ee, 0x12b25: 0xe0004a37, 0x12b27: 0xe0005a38, + 0x12b2a: 0xe0009b7a, + 0x12b2c: 0xe000482a, 0x12b2e: 0xe0006046, + 0x12b31: 0xe0007fd6, 0x12b32: 0xe0005f06, + 0x12b34: 0xe0009077, + 0x12b38: 0xe0006c86, 0x12b39: 0xe00072d7, 0x12b3b: 0xe000a3a1, + 0x12b3c: 0xe00062f2, 0x12b3e: 0xe0007293, + // Block 0x4ad, offset 0x12b40 + 0x12b41: 0xe0006f86, + 0x12b44: 0xe0005f46, 0x12b47: 0xe00060c1, + 0x12b48: 0xe0009b36, 0x12b49: 0xe00061a0, 0x12b4a: 0xe0006022, 0x12b4b: 0xe00041f2, + 0x12b4c: 0xe000a28f, + 0x12b5a: 0xe0006d0a, 0x12b5b: 0xe0005ecb, + 0x12b5e: 0xe00090d7, + 0x12b60: 0xe0005f4a, + 0x12b65: 0xe00085c7, 0x12b66: 0xe00085ca, + 0x12b68: 0xe00086a4, 0x12b69: 0xe000a253, + 0x12b74: 0xe00072db, 0x12b77: 0xe0004dbd, + 0x12b78: 0xe0005ff5, 0x12b7a: 0xe0008cc0, 0x12b7b: 0xe000785f, + 0x12b7c: 0xe0007609, 0x12b7e: 0xe0008f83, + // Block 0x4ae, offset 0x12b80 + 0x12b80: 0xe0009221, + 0x12b86: 0xe000a59a, 0x12b87: 0xe0008c57, + 0x12b8d: 0xe000a257, + 0x12b92: 0xe0006f22, + 0x12b9a: 0xe000772e, 0x12b9b: 0xe0008b5f, + 0x12b9f: 0xe00071f0, + 0x12ba0: 0xe0004dcd, 0x12ba1: 0xe0007178, 0x12ba2: 0xe00071f3, 0x12ba3: 0xe0005563, + 0x12ba5: 0xe0006991, 0x12ba6: 0xe000604a, + 0x12ba8: 0xe0007bc3, 0x12bab: 0xe00095d2, + 0x12bb7: 0xe00044d6, + 0x12bb9: 0xe00054e9, + 0x12bbd: 0xe0004e7a, 0x12bbe: 0xe00047d0, 0x12bbf: 0xe0007b8d, + // Block 0x4af, offset 0x12bc0 + 0x12bcb: 0xe00090db, + 0x12bcd: 0xe00071f6, 0x12bce: 0xe000a051, + 0x12bd1: 0xe0005fa2, + 0x12bd6: 0xe0007bc6, + 0x12bd9: 0xe0005db1, + 0x12bde: 0xe0005de9, + 0x12be0: 0xe000542c, 0x12be2: 0xe0006086, + 0x12be5: 0xe0006596, + 0x12bea: 0xe00091d3, + 0x12bec: 0xe0007297, 0x12bed: 0xe0005b42, + 0x12bf0: 0xe00042be, 0x12bf3: 0xe00055f3, + 0x12bf9: 0xe0007731, 0x12bfb: 0xe0009586, + 0x12bfc: 0xe0004512, 0x12bfd: 0xe000482d, 0x12bff: 0xe0004c3c, + // Block 0x4b0, offset 0x12c00 + 0x12c07: 0xe000608a, + 0x12c09: 0xe0006a19, + 0x12c0d: 0xe000a532, + 0x12c17: 0xe0009716, + 0x12c19: 0xe0004302, 0x12c1a: 0xe000972a, 0x12c1b: 0xe0005ff8, + 0x12c1c: 0xe0004fcd, 0x12c1e: 0xe00082d0, + 0x12c21: 0xe000a536, 0x12c22: 0xe00073b3, 0x12c23: 0xe00083b2, + 0x12c25: 0xe000901d, 0x12c27: 0xe00074bf, + 0x12c29: 0xe0004c3f, + 0x12c2d: 0xe00052ec, 0x12c2e: 0xe0007e00, 0x12c2f: 0xe0004b7f, + 0x12c30: 0xe0008fdf, 0x12c33: 0xe0006db2, + 0x12c3a: 0xe0009ad6, 0x12c3b: 0xe0004900, + 0x12c3c: 0xe00043ae, 0x12c3d: 0xe0006dca, + // Block 0x4b1, offset 0x12c40 + 0x12c42: 0xe0006ad1, + 0x12c4c: 0xe000964d, 0x12c4f: 0xe0006866, + 0x12c51: 0xe0007582, 0x12c52: 0xe000691c, + 0x12c62: 0xe000570a, + 0x12c65: 0xe0009020, 0x12c66: 0xe00093d7, 0x12c67: 0xe0009a00, + 0x12c6c: 0xe0005d5b, 0x12c6d: 0xe0009d96, + 0x12c70: 0xe0009d32, 0x12c72: 0xe0009e21, + 0x12c74: 0xe0009c7d, + // Block 0x4b2, offset 0x12c80 + 0x12c83: 0xe0008eab, + 0x12c85: 0xe0004e47, + 0x12c8f: 0xe00079f1, + 0x12c9c: 0xe0004434, 0x12c9d: 0xe0009686, + 0x12ca0: 0xe00057ed, + 0x12ca7: 0xe0007f48, + 0x12ca8: 0xe0009216, 0x12cab: 0xe0005bda, + 0x12cac: 0xe0004693, 0x12cae: 0xe0009fe1, 0x12caf: 0xe00079f5, + 0x12cbc: 0xe00068c2, + // Block 0x4b3, offset 0x12cc0 + 0x12cc1: 0xe0005052, + 0x12cc7: 0xe0008b63, + 0x12ccc: 0xe0005a80, 0x12ccd: 0xe00076fe, 0x12cce: 0xe000710c, 0x12ccf: 0xe0008650, + 0x12cd1: 0xe000691f, 0x12cd3: 0xe000548c, + 0x12cd7: 0xe0007d8f, + 0x12cdf: 0xe0006eea, + 0x12ce3: 0xe0004256, + 0x12ce4: 0xe0007b5d, 0x12ce7: 0xe000652e, + 0x12ce8: 0xe0007e24, 0x12ce9: 0xe0006db6, + 0x12ced: 0xe0009b7e, + 0x12cfa: 0xe000a526, 0x12cfb: 0xe000a52a, + 0x12cfc: 0xe0005d78, 0x12cfe: 0xe00051d7, + // Block 0x4b4, offset 0x12d00 + 0x12d01: 0xe0008594, + 0x12d05: 0xe00063b6, + 0x12d08: 0xe0007e27, 0x12d0a: 0xe0005afd, 0x12d0b: 0xe00091f2, + 0x12d0e: 0xe0004755, 0x12d0f: 0xe0005986, + 0x12d10: 0xe00062f6, 0x12d11: 0xe0007734, + 0x12d14: 0xe0009407, 0x12d15: 0xe000441a, + 0x12d1a: 0xe00089e7, + 0x12d20: 0xe0005258, + 0x12d27: 0xe00088df, + 0x12d28: 0xe0005d7b, 0x12d2a: 0xe00097a6, + 0x12d2c: 0xe0004697, 0x12d2f: 0xe0005055, + 0x12d34: 0xe00056d2, 0x12d35: 0xe00041f6, 0x12d37: 0xe0005d1f, + 0x12d3a: 0xe0004ad7, 0x12d3b: 0xe00062fa, + 0x12d3c: 0xe00086a8, 0x12d3d: 0xe0004bc4, + // Block 0x4b5, offset 0x12d40 + 0x12d41: 0xe0009689, + 0x12d4c: 0xe0005b0f, 0x12d4e: 0xe000968c, 0x12d4f: 0xe0004fb9, + 0x12d51: 0xe0005430, 0x12d52: 0xe00083e2, + 0x12d56: 0xe0007955, + 0x12d59: 0xe0007737, + 0x12d67: 0xe0005b12, + 0x12d6a: 0xe000588d, 0x12d6b: 0xe00058d6, + 0x12d6c: 0xe00062fe, 0x12d6d: 0xe000a53a, + 0x12d71: 0xe0005ae4, + 0x12d7a: 0xe00073b6, + 0x12d7e: 0xe0006ad4, + // Block 0x4b6, offset 0x12d80 + 0x12d80: 0xe0006ad7, 0x12d81: 0xe0005058, + 0x12d85: 0xe0007ea2, 0x12d86: 0xe00094f6, 0x12d87: 0xe000505b, + 0x12d88: 0xe000505e, 0x12d89: 0xe0009023, 0x12d8a: 0xe0009d36, + 0x12d90: 0xe0007f8b, 0x12d93: 0xe000689a, + 0x12d94: 0xe00067b7, 0x12d95: 0xe0006994, 0x12d96: 0xe0008cc3, 0x12d97: 0xe0009026, + 0x12d9a: 0xe0008cc6, 0x12d9b: 0xe0004462, + 0x12d9c: 0xe000a3f8, 0x12d9d: 0xe0009850, 0x12d9e: 0xe000747b, 0x12d9f: 0xe00071f9, + 0x12da0: 0xe0006ada, 0x12da2: 0xe000529a, + 0x12da5: 0xe0006c8a, 0x12da7: 0xe0008d2f, + 0x12da8: 0xe0009e95, + 0x12dad: 0xe0008c21, + 0x12dba: 0xe0005061, + 0x12dbc: 0xe0004a3b, 0x12dbf: 0xe0005a84, + // Block 0x4b7, offset 0x12dc0 + 0x12dc0: 0xe0009ed6, 0x12dc1: 0xe0004f61, + 0x12dca: 0xe000477c, 0x12dcb: 0xe00084d8, + 0x12dcd: 0xe000a4f1, 0x12dce: 0xe0008b67, 0x12dcf: 0xe000666f, + 0x12dd1: 0xe0007f8e, + 0x12dd4: 0xe0008c5a, + 0x12ddd: 0xe000908b, + 0x12de6: 0xe0007886, 0x12de7: 0xe000a8e4, + 0x12de8: 0xe00050d0, 0x12dea: 0xe0006e22, 0x12deb: 0xe00053b4, + 0x12dee: 0xe0005a14, + 0x12df0: 0xe000529d, 0x12df1: 0xe00054ec, 0x12df3: 0xe000782b, + 0x12df4: 0xe00077d3, + 0x12df9: 0xe0007f91, 0x12dfa: 0xe0007d24, 0x12dfb: 0xe0005cd7, + 0x12dfd: 0xe0004f65, 0x12dfe: 0xe000a4f4, 0x12dff: 0xe0005567, + // Block 0x4b8, offset 0x12e00 + 0x12e00: 0xe000717b, 0x12e01: 0xe0006add, + 0x12e06: 0xe000422e, + 0x12e09: 0xe00065da, 0x12e0a: 0xe00051d3, 0x12e0b: 0xe00097c7, + 0x12e11: 0xe0004988, 0x12e12: 0xe000968f, + 0x12e15: 0xe0006922, + 0x12e18: 0xe0006925, + 0x12e1f: 0xe0008cc9, + 0x12e22: 0xe00059f6, 0x12e23: 0xe0005e49, + 0x12e24: 0xe0009a2c, 0x12e26: 0xe00090df, 0x12e27: 0xe00076cd, + 0x12e29: 0xe000915f, 0x12e2a: 0xe000905c, 0x12e2b: 0xe00098a4, + 0x12e2c: 0xe000447a, + 0x12e38: 0xe0004276, 0x12e3b: 0xe0008412, + // Block 0x4b9, offset 0x12e40 + 0x12e40: 0xe000a8e7, 0x12e41: 0xe0004830, 0x12e42: 0xe00057f1, + 0x12e45: 0xe0006fb6, + 0x12e48: 0xe00041fa, 0x12e4a: 0xe0008c5d, 0x12e4b: 0xe0008b6b, + 0x12e4c: 0xe0005537, 0x12e4d: 0xe0009692, + 0x12e54: 0xe0008528, 0x12e57: 0xe0009d0a, + 0x12e59: 0xe000907b, 0x12e5a: 0xe0009961, + 0x12e5c: 0xe0005c62, 0x12e5e: 0xe00049b2, 0x12e5f: 0xe0009ed2, + 0x12e60: 0xe0008ccc, + 0x12e67: 0xe0006eee, + 0x12e6e: 0xe0008db7, + 0x12e71: 0xe0009a30, + 0x12e76: 0xe000800c, 0x12e77: 0xe000907f, + 0x12e79: 0xe0009127, 0x12e7b: 0xe00054ef, + 0x12e7c: 0xe0004128, 0x12e7d: 0xe0004758, 0x12e7f: 0xe00047d3, + // Block 0x4ba, offset 0x12e80 + 0x12e80: 0xe0004870, + 0x12e85: 0xe00043b2, 0x12e86: 0xe000604e, + 0x12e89: 0xe0009964, + 0x12e8d: 0xe000889f, 0x12e8e: 0xe0007b29, + 0x12e97: 0xe000717e, + 0x12ea0: 0xe000523b, 0x12ea1: 0xe0006ce2, 0x12ea2: 0xe0007b90, + 0x12ea9: 0xe0007cac, 0x12eab: 0xe000a52e, + 0x12eb0: 0xe000782f, + 0x12eb4: 0xe000a2af, 0x12eb5: 0xe0007649, 0x12eb6: 0xe0004c42, + 0x12eb9: 0xe0004d85, 0x12eba: 0xe0004938, + 0x12ebd: 0xe0008b6f, 0x12ebe: 0xe0007ea5, 0x12ebf: 0xe00094b2, + // Block 0x4bb, offset 0x12ec0 + 0x12ec0: 0xe0005692, 0x12ec1: 0xe00055b7, 0x12ec2: 0xe0005a62, 0x12ec3: 0xe0008a63, + 0x12ec4: 0xe0009225, 0x12ec5: 0xe0007ea8, 0x12ec6: 0xe0009d9a, + 0x12ec8: 0xe0007e60, 0x12eca: 0xe0007d62, + 0x12ed2: 0xe0009163, 0x12ed3: 0xe0009365, + 0x12ed5: 0xe0008ccf, 0x12ed6: 0xe0004bc7, 0x12ed7: 0xe00093a5, + 0x12ed8: 0xe0004d3d, 0x12edb: 0xe0004cd5, + 0x12edf: 0xe0004d69, + 0x12ee0: 0xe00049b5, 0x12ee3: 0xe00070d2, + 0x12ee9: 0xe0007d3e, 0x12eea: 0xe0007d41, + 0x12eec: 0xe000824c, 0x12eee: 0xe0004d89, 0x12eef: 0xe0007e63, + 0x12ef3: 0xe000824f, + 0x12ef6: 0xe0004cd8, + 0x12ef9: 0xe0007c65, 0x12efa: 0xe0004e4a, 0x12efb: 0xe00093a9, + 0x12efe: 0xe0004a3f, 0x12eff: 0xe0005c3a, + // Block 0x4bc, offset 0x12f00 + 0x12f04: 0xe0009255, 0x12f05: 0xe0004e4d, 0x12f07: 0xe0005656, + 0x12f08: 0xe0008d32, 0x12f0a: 0xe0008a4f, 0x12f0b: 0xe0005d5f, + 0x12f17: 0xe00060b5, + 0x12f19: 0xe00092d5, + 0x12f1d: 0xe00065de, 0x12f1f: 0xe000469b, + 0x12f20: 0xe0008704, 0x12f22: 0xe0006b37, 0x12f23: 0xe0008f17, + 0x12f25: 0xe00055f7, 0x12f26: 0xe00070fe, + 0x12f2a: 0xe0007181, + 0x12f2d: 0xe000425a, 0x12f2f: 0xe00052f0, + 0x12f36: 0xe000469f, + 0x12f38: 0xe0004707, 0x12f39: 0xe0008edb, 0x12f3a: 0xe0009854, + 0x12f3d: 0xe0007fd9, 0x12f3f: 0xe00041fe, + // Block 0x4bd, offset 0x12f40 + 0x12f46: 0xe0009ca4, + 0x12f48: 0xe0004fbd, 0x12f4a: 0xe0008d35, + 0x12f4c: 0xe0007585, 0x12f4f: 0xe000a49b, + 0x12f51: 0xe0007010, 0x12f52: 0xe0004f89, + 0x12f58: 0xe0008a97, 0x12f59: 0xe0006d06, 0x12f5b: 0xe00088a3, + 0x12f5e: 0xe0009b9e, + 0x12f60: 0xe0005d63, + 0x12f65: 0xe0006b3a, 0x12f66: 0xe000675a, 0x12f67: 0xe000940b, + 0x12f68: 0xe000686a, + 0x12f6c: 0xe0008c24, 0x12f6d: 0xe00059b2, 0x12f6f: 0xe0005221, + 0x12f73: 0xe0004167, + 0x12f75: 0xe00064fe, + 0x12f79: 0xe0006fb9, + // Block 0x4be, offset 0x12f80 + 0x12f85: 0xe0006e82, 0x12f86: 0xe0009f37, + 0x12f88: 0xe0004a7f, 0x12f89: 0xe00056b2, 0x12f8b: 0xe0004f05, + 0x12f8c: 0xe000895b, 0x12f8d: 0xe000729b, 0x12f8f: 0xe00064c6, + 0x12f90: 0xe0004ab7, 0x12f91: 0xe0009858, 0x12f92: 0xe0009c00, 0x12f93: 0xe000477f, + 0x12f94: 0xe00053d4, 0x12f96: 0xe00093f7, + 0x12f9f: 0xe00067ba, + 0x12fa0: 0xe0004ea1, + 0x12fa5: 0xe000447d, 0x12fa6: 0xe0004a43, 0x12fa7: 0xe00045af, + 0x12fa9: 0xe0009c14, + 0x12fac: 0xe0006f8a, 0x12fae: 0xe0006d45, + 0x12fb1: 0xe000705b, 0x12fb3: 0xe0008be7, + 0x12fb5: 0xe00079f9, + 0x12fbd: 0xe0007c32, + // Block 0x4bf, offset 0x12fc0 + 0x12fc7: 0xe00043fc, + 0x12fcb: 0xe000895f, + 0x12fcd: 0xe0004833, 0x12fce: 0xe000a44c, 0x12fcf: 0xe00087d5, + 0x12fd2: 0xe0009815, + 0x12fd4: 0xe000627a, 0x12fd5: 0xe0005064, 0x12fd7: 0xe0006b8a, + 0x12fd9: 0xe00066a7, 0x12fda: 0xe00091f5, + 0x12fdc: 0xe000495c, 0x12fdd: 0xe00045f3, + 0x12fe0: 0xe0009818, 0x12fe1: 0xe0004a0f, + 0x12fed: 0xe0008963, + 0x12ff1: 0xe0006c8e, + 0x12ff4: 0xe0008680, + 0x12ff8: 0xe000881e, + 0x12ffe: 0xe000705e, + // Block 0x4c0, offset 0x13000 + 0x13000: 0xe0008a53, 0x13001: 0xe000a612, + 0x13004: 0xe00064f6, 0x13006: 0xe0008967, 0x13007: 0xe0009d56, + 0x13009: 0xe000985c, 0x1300a: 0xe000a4d3, 0x1300b: 0xe000a30f, + 0x1300c: 0xe000a73d, + 0x13012: 0xe000742b, + 0x13014: 0xe0008054, + 0x13019: 0xe0004836, 0x1301b: 0xe00077d7, + 0x1301d: 0xe0004cdb, + 0x13020: 0xe0007013, + 0x13024: 0xe000556b, 0x13026: 0xe0006997, + 0x13029: 0xe0006ae0, 0x1302a: 0xe000905f, + 0x13033: 0xe0009f4f, + 0x13037: 0xe000670b, + 0x1303e: 0xe0005f7a, + // Block 0x4c1, offset 0x13040 + 0x13040: 0xe000940f, + 0x13047: 0xe0008d6f, + 0x13049: 0xe000981b, 0x1304b: 0xe0004e17, + 0x1304f: 0xe0005aac, + 0x13052: 0xe0009259, + 0x1305e: 0xe00052f4, 0x1305f: 0xe0008a9b, + 0x13060: 0xe0006644, 0x13061: 0xe0004202, + 0x13067: 0xe000a616, + 0x1306a: 0xe0008684, 0x1306b: 0xe0007016, + 0x13077: 0xe00095b2, + 0x13078: 0xe0009ca7, + 0x1307d: 0xe000958a, 0x1307e: 0xe000597a, 0x1307f: 0xe000675d, + // Block 0x4c2, offset 0x13080 + 0x13083: 0xe000579d, + 0x1308c: 0xe0008e69, 0x1308d: 0xe00088a7, + 0x13090: 0xe00056d6, 0x13092: 0xe0008eae, + 0x13094: 0xe00071fc, + 0x1309b: 0xe00089eb, + 0x1309c: 0xe0009ada, 0x1309f: 0xe0005b15, + 0x130a0: 0xe0005ad0, + 0x130a4: 0xe000958e, 0x130a5: 0xe00077db, 0x130a7: 0xe0004480, + 0x130a9: 0xe0006576, + 0x130ac: 0xe0005ca7, + 0x130b2: 0xe0008252, 0x130b3: 0xe00061a3, + 0x130be: 0xe00084dc, + // Block 0x4c3, offset 0x130c0 + 0x130c1: 0xe00094fa, 0x130c3: 0xe0006928, + 0x130c9: 0xe0006822, + 0x130cd: 0xe0006025, + 0x130d2: 0xe0005d67, + 0x130d5: 0xe000627e, 0x130d7: 0xe0008cd2, + 0x130d8: 0xe0008a7b, + 0x130df: 0xe0007092, + 0x130e2: 0xe00085cd, + 0x130e4: 0xe0008128, 0x130e5: 0xe0008edf, 0x130e6: 0xe0005d23, 0x130e7: 0xe0008708, + 0x130e8: 0xe0006486, + 0x130ee: 0xe000583b, + 0x130f1: 0xe000583f, 0x130f2: 0xe0009261, 0x130f3: 0xe000442c, + 0x130f9: 0xe0007184, + 0x130fc: 0xe0005d27, 0x130fd: 0xe0008df7, 0x130fe: 0xe0008b73, + // Block 0x4c4, offset 0x13100 + 0x13105: 0xe0008255, 0x13106: 0xe0005f66, + 0x1310a: 0xe000a3fb, + 0x13115: 0xe0004839, 0x13116: 0xe0005400, 0x13117: 0xe0004cde, + 0x13119: 0xe0008d38, 0x1311a: 0xe0008768, + 0x1311c: 0xe00061d3, 0x1311d: 0xe0006bfa, 0x1311e: 0xe0006826, 0x1311f: 0xe0008cd5, + 0x13120: 0xe000435e, 0x13122: 0xe0006028, + 0x13125: 0xe0005148, 0x13127: 0xe0005843, + 0x1312f: 0xe000514b, + 0x13132: 0xe00058b4, + 0x13134: 0xe00088e3, 0x13136: 0xe0008d3b, + 0x13138: 0xe0005f2e, 0x1313a: 0xe0004e7d, 0x1313b: 0xe000475b, + 0x1313e: 0xe0004e50, + // Block 0x4c5, offset 0x13140 + 0x13140: 0xe0005067, 0x13142: 0xe0008e6c, 0x13143: 0xe00072df, + 0x13144: 0xe00077b7, 0x13145: 0xe000a4bb, 0x13146: 0xe0007f94, 0x13147: 0xe000a861, + 0x13148: 0xe000a576, 0x1314a: 0xe000613f, 0x1314b: 0xe0006143, + 0x1314d: 0xe0005192, + 0x13150: 0xe000527a, 0x13153: 0xe0006d7e, + 0x13154: 0xe000729f, 0x13155: 0xe000699a, 0x13157: 0xe0006ae3, + 0x13158: 0xe0004b3c, 0x13159: 0xe0009029, 0x1315a: 0xe0004fa5, 0x1315b: 0xe000682a, + 0x1315c: 0xe0008058, + 0x13160: 0xe0007019, 0x13161: 0xe00063ba, 0x13162: 0xe0006ce6, + 0x1316b: 0xe0008597, + 0x1316c: 0xe0008e6f, 0x1316e: 0xe00092ad, 0x1316f: 0xe0005b92, + 0x13170: 0xe0006fbc, 0x13171: 0xe000689e, 0x13172: 0xe0006ef2, 0x13173: 0xe000747f, + 0x13175: 0xe0008821, + 0x13179: 0xe000701c, 0x1317a: 0xe00042c2, + // Block 0x4c6, offset 0x13180 + 0x13182: 0xe0008dbb, 0x13183: 0xe000a25b, + 0x13184: 0xe0008cd8, 0x13185: 0xe00046a3, 0x13186: 0xe0006302, + 0x13189: 0xe0007303, + 0x1318d: 0xe0008534, + 0x13190: 0xe00045d3, + 0x13196: 0xe0004adb, + 0x13199: 0xe000a59e, 0x1319b: 0xe0008d41, + 0x1319c: 0xe000a2bb, 0x1319e: 0xe0004b82, + 0x131a1: 0xe0005725, 0x131a2: 0xe000a25f, 0x131a3: 0xe00065f6, + 0x131a6: 0xe0004fa9, + 0x131a8: 0xe00082dc, 0x131a9: 0xe0008d3e, 0x131aa: 0xe00084a4, + 0x131ae: 0xe0006d48, + 0x131b0: 0xe000917f, 0x131b1: 0xe0009c04, 0x131b2: 0xe0006ae6, 0x131b3: 0xe0004362, + 0x131b6: 0xe0008a57, + 0x131b9: 0xe0004587, 0x131ba: 0xe0009994, + 0x131bf: 0xe0004c45, + // Block 0x4c7, offset 0x131c0 + 0x131c3: 0xe00096dd, + 0x131c6: 0xe000470b, + 0x131ce: 0xe0008b77, 0x131cf: 0xe0007187, + 0x131d3: 0xe00046a7, + 0x131d8: 0xe000670f, + 0x131dc: 0xe0008dbf, + 0x131e0: 0xe0005a88, 0x131e2: 0xe0008e72, 0x131e3: 0xe0004dd1, + 0x131e5: 0xe00050d3, 0x131e6: 0xe00050d6, 0x131e7: 0xe0008f47, + 0x131e9: 0xe00080f4, 0x131eb: 0xe0006e86, + 0x131ec: 0xe000718a, 0x131ed: 0xe00081fe, 0x131ee: 0xe0004782, + 0x131f0: 0xe0004a47, 0x131f1: 0xe0004366, 0x131f2: 0xe0005e61, + 0x131f4: 0xe000953a, 0x131f5: 0xe00093da, + 0x131f8: 0xe0005c12, 0x131fa: 0xe000506a, 0x131fb: 0xe0009b0a, + 0x131fd: 0xe0008620, 0x131fe: 0xe0005c66, 0x131ff: 0xe0005f4e, + // Block 0x4c8, offset 0x13200 + 0x13204: 0xe00048c8, 0x13207: 0xe0009967, + 0x1320a: 0xe0005109, 0x1320b: 0xe000692b, + 0x1320c: 0xe0008258, 0x1320d: 0xe0006226, + 0x13216: 0xe0006d4b, 0x13217: 0xe0006cc2, + 0x13218: 0xe000a071, 0x1321a: 0xe0006e26, + 0x1321c: 0xe0005f6a, 0x1321d: 0xe00091a3, 0x1321e: 0xe00052f8, + 0x13220: 0xe0009632, 0x13221: 0xe000620e, 0x13223: 0xe00079fd, + 0x13226: 0xe00073ef, + 0x13228: 0xe0009d5a, 0x13229: 0xe0007d93, + 0x1322c: 0xe0005f52, 0x1322f: 0xe0008153, + 0x13234: 0xe0005912, 0x13236: 0xe0009d7a, + 0x13239: 0xe0008c60, 0x1323b: 0xe000996a, + // Block 0x4c9, offset 0x13240 + 0x13248: 0xe0007b61, 0x13249: 0xe00090e3, 0x1324a: 0xe0007756, 0x1324b: 0xe000981e, + 0x13250: 0xe0009821, 0x13251: 0xe0004617, + 0x13255: 0xe0007cb0, 0x13257: 0xe00097a9, + 0x13258: 0xe0004785, 0x1325b: 0xe0006282, + 0x1325d: 0xe00090e7, 0x1325e: 0xe000a3fe, 0x1325f: 0xe0007ec0, + 0x13260: 0xe0004884, 0x13261: 0xe00087ad, 0x13262: 0xe00056da, 0x13263: 0xe000a263, + 0x1326b: 0xe00066eb, + 0x1326e: 0xe0009860, 0x1326f: 0xe0007a01, + 0x13271: 0xe0008dc3, 0x13272: 0xe0005be6, 0x13273: 0xe00045b3, + 0x13275: 0xe0005e11, 0x13277: 0xe0005b95, + 0x13279: 0xe0009ebc, 0x1327b: 0xe00061d6, + 0x1327d: 0xe0009766, 0x1327e: 0xe00088ab, + // Block 0x4ca, offset 0x13280 + 0x13281: 0xe000649e, 0x13283: 0xe00068c6, + 0x13284: 0xe0007bc9, 0x13285: 0xe0007061, 0x13286: 0xe00060f4, 0x13287: 0xe0007e66, + 0x13288: 0xe00043b6, + 0x13290: 0xe0006fc8, 0x13292: 0xe0008fcb, + 0x13294: 0xe0009083, 0x13295: 0xe0006e2a, 0x13296: 0xe0006bb6, 0x13297: 0xe0005d2b, + 0x13299: 0xe00064ae, 0x1329a: 0xe0005b63, + 0x1329e: 0xe0007e69, + 0x132a1: 0xe000718d, 0x132a2: 0xe0004e1a, + 0x132a9: 0xe000736c, 0x132aa: 0xe000a674, 0x132ab: 0xe000475e, + 0x132ad: 0xe000458b, 0x132af: 0xe000a293, + 0x132b0: 0xe0008cdb, + 0x132b6: 0xe00078b5, + 0x132b9: 0xe0007981, + 0x132bc: 0xe0004761, 0x132bd: 0xe0006a1d, 0x132be: 0xe00045b7, + // Block 0x4cb, offset 0x132c0 + 0x132c1: 0xe000a780, 0x132c2: 0xe000925d, + 0x132c7: 0xe0005b18, + 0x132c8: 0xe000a916, 0x132ca: 0xe0004adf, + 0x132cc: 0xe0007096, 0x132cd: 0xe0005be9, 0x132cf: 0xe000896b, + 0x132d3: 0xe0007b2d, + 0x132d4: 0xe00087ce, 0x132d6: 0xe0006f02, + 0x132d8: 0xe0009265, 0x132db: 0xe000556f, + 0x132dc: 0xe00057a1, + // Block 0x4cc, offset 0x13300 + 0x13336: 0xe0006760, 0x13337: 0xe0006b3d, + 0x13338: 0xe000a0fd, 0x1333a: 0xe00045d7, + 0x1333e: 0xe00065fa, 0x1333f: 0xe000a119, + // Block 0x4cd, offset 0x13340 + 0x13343: 0xe000778a, + 0x13344: 0xe0004713, 0x13345: 0xe0009fbb, 0x13347: 0xe0008f4b, + 0x1334b: 0xe0007d28, + 0x1334c: 0xe0007776, 0x1334d: 0xe0005b1b, 0x1334e: 0xe00053b8, + 0x13350: 0xe0004a13, + 0x13354: 0xe0005e65, 0x13355: 0xe000a00d, + 0x13358: 0xe00067bd, + 0x1335d: 0xe000885d, 0x1335f: 0xe000483c, + 0x13360: 0xe000622a, 0x13361: 0xe00043ba, 0x13363: 0xe0004afe, + 0x13366: 0xe00067c0, + 0x13368: 0xe000791d, 0x1336a: 0xe0008e1e, 0x1336b: 0xe0004af5, + 0x1336e: 0xe000996d, + 0x13370: 0xe00064ca, 0x13372: 0xe0006d4e, + 0x13375: 0xe0005eb0, 0x13377: 0xe0009c80, + 0x13378: 0xe00064d6, 0x13379: 0xe0005caa, + 0x1337c: 0xe0009f53, 0x1337d: 0xe0004788, 0x1337e: 0xe0008fe3, + // Block 0x4ce, offset 0x13380 + 0x13382: 0xe00045bb, + 0x13385: 0xe00056ef, 0x13386: 0xe000699d, 0x13387: 0xe00050d9, + 0x13388: 0xe000506d, 0x1338a: 0xe0007833, + 0x1338c: 0xe000436a, 0x1338e: 0xe00061a6, + 0x13394: 0xe00047d6, 0x13396: 0xe000483f, 0x13397: 0xe00043be, + 0x13398: 0xe000876c, 0x1339a: 0xe00059b6, + 0x1339d: 0xe0008860, 0x1339e: 0xe0007190, + 0x133a4: 0xe0004d41, + 0x133a8: 0xe0006e2e, 0x133a9: 0xe00083b5, 0x133ab: 0xe00043c2, + 0x133af: 0xe000427a, + 0x133b2: 0xe000a8ea, + 0x133b6: 0xe00089ef, + 0x133b8: 0xe0005cad, 0x133b9: 0xe0004430, + 0x133bd: 0xe0007f97, + // Block 0x4cf, offset 0x133c0 + 0x133c1: 0xe0007d04, + 0x133c5: 0xe00073b9, + 0x133ca: 0xe000845c, + 0x133cc: 0xe0008460, 0x133ce: 0xe00059ba, + 0x133d2: 0xe0007338, + 0x133d4: 0xe0006c92, 0x133d5: 0xe000a899, 0x133d6: 0xe000a8a9, + 0x133db: 0xe0007064, + 0x133df: 0xe00088af, + 0x133e0: 0xe00098f9, 0x133e1: 0xe000692e, 0x133e3: 0xe0006c22, + 0x133e4: 0xe00073f2, 0x133e6: 0xe00089f3, + 0x133e9: 0xe0009d5e, 0x133eb: 0xe0007d97, + 0x133ec: 0xe000a7e0, 0x133ee: 0xe000a180, + 0x133f0: 0xe000a011, 0x133f3: 0xe0007bcc, + 0x133f9: 0xe0004b85, 0x133fa: 0xe0004842, 0x133fb: 0xe00064b2, + 0x133fc: 0xe0008464, 0x133fe: 0xe000a297, + // Block 0x4d0, offset 0x13400 + 0x13400: 0xe0007e6c, 0x13401: 0xe0005a3b, 0x13403: 0xe00047d9, + 0x13404: 0xe000602b, 0x13405: 0xe000859a, 0x13406: 0xe0005070, + 0x13409: 0xe0004c48, + 0x1340c: 0xe0008415, + 0x13410: 0xe00051b2, 0x13411: 0xe0005320, 0x13412: 0xe0005b1e, + 0x13414: 0xe00085d0, 0x13415: 0xe00046ab, 0x13416: 0xe00096e0, 0x13417: 0xe0005ffb, + 0x13418: 0xe0008030, 0x13419: 0xe0009caa, + 0x1341e: 0xe000416a, + 0x13421: 0xe0006d81, + 0x13426: 0xe0007fdc, + 0x13428: 0xe0005264, + 0x1342c: 0xe0005bb0, 0x1342d: 0xe0005073, + 0x13430: 0xe0007fdf, 0x13433: 0xe0008418, + 0x13436: 0xe00077aa, + 0x1343d: 0xe0009b3a, 0x1343f: 0xe00046af, + // Block 0x4d1, offset 0x13440 + 0x13443: 0xe0005380, + 0x13446: 0xe00059be, + 0x1344a: 0xe0005b45, + 0x13452: 0xe0004a83, + 0x13455: 0xe000a44f, 0x13456: 0xe0006f8e, + 0x13458: 0xe0006a4d, 0x1345a: 0xe00098fc, + 0x1345e: 0xe0006147, + 0x1346f: 0xe0005916, + 0x13470: 0xe000976a, 0x13471: 0xe0007c68, 0x13472: 0xe0006f92, 0x13473: 0xe0007f18, + 0x13475: 0xe0007e2a, 0x13476: 0xe0006f4a, 0x13477: 0xe0009087, + 0x1347d: 0xe0009602, 0x1347e: 0xe0005ad4, 0x1347f: 0xe00082c8, + // Block 0x4d2, offset 0x13480 + 0x13484: 0xe000841b, 0x13485: 0xe000723f, 0x13486: 0xe0006ae9, 0x13487: 0xe0008cde, + 0x13489: 0xe0008290, 0x1348b: 0xe0005c42, + 0x1348c: 0xe0005076, + 0x13493: 0xe000a63e, + 0x13496: 0xe0009695, + 0x13498: 0xe0008eb1, 0x1349a: 0xe000566b, 0x1349b: 0xe000a101, + 0x1349d: 0xe0004206, + 0x134a1: 0xe00047dc, 0x134a2: 0xe000902c, + 0x134a5: 0xe0006931, 0x134a6: 0xe000686e, + 0x134a9: 0xe000458f, 0x134aa: 0xe00063be, 0x134ab: 0xe00072e3, + 0x134ad: 0xe0005273, 0x134af: 0xe0004fd1, + 0x134b1: 0xe0004b40, 0x134b2: 0xe0008294, + 0x134b4: 0xe000a6e3, 0x134b5: 0xe00050dc, + 0x134ba: 0xe0009ddc, + // Block 0x4d3, offset 0x134c0 + 0x134c3: 0xe0008156, + 0x134c4: 0xe0008e30, 0x134c6: 0xe0005324, + 0x134ca: 0xe0004ce1, + 0x134cc: 0xe000643c, 0x134ce: 0xe0009ba1, + 0x134d5: 0xe00067c3, 0x134d6: 0xe000632e, + 0x134d9: 0xe0008d44, 0x134da: 0xe000643f, 0x134db: 0xe000431e, + 0x134de: 0xe0009e24, + 0x134e0: 0xe0004483, 0x134e1: 0xe000a401, + 0x134e4: 0xe00082b0, 0x134e5: 0xe0006d51, + 0x134ef: 0xe0004845, + 0x134f1: 0xe0004abb, + 0x134f4: 0xe00055fb, 0x134f7: 0xe000a829, + 0x134f8: 0xe000a821, + 0x134fd: 0xe0005287, 0x134fe: 0xe00085d3, + // Block 0x4d4, offset 0x13500 + 0x13502: 0xe000902f, + 0x13505: 0xe000a2e3, 0x13506: 0xe00098ff, 0x13507: 0xe000a2e7, + 0x13508: 0xe0005eda, 0x13509: 0xe0005eee, 0x1350a: 0xe000945a, + 0x13516: 0xe000636e, + 0x13518: 0xe0007d9b, 0x1351a: 0xe0004192, 0x1351b: 0xe00046b3, + 0x13523: 0xe00072a3, + 0x13524: 0xe00074c3, 0x13527: 0xe00097ac, + 0x13529: 0xe0007193, 0x1352b: 0xe0009b2a, + 0x1352f: 0xe0009e27, + 0x13530: 0xe000566e, + 0x13539: 0xe0009369, 0x1353a: 0xe00071ff, + 0x1353e: 0xe0006934, + // Block 0x4d5, offset 0x13540 + 0x13541: 0xe000657e, + 0x13546: 0xe00089f7, + 0x1354a: 0xe0006dce, 0x1354b: 0xe000775a, + 0x1354e: 0xe0007483, + 0x13550: 0xe0006763, 0x13551: 0xe0006766, 0x13552: 0xe0004486, 0x13553: 0xe00069a0, + 0x13554: 0xe000436e, 0x13555: 0xe0007d9f, + 0x13560: 0xe0008eb4, + 0x13564: 0xe000768d, 0x13565: 0xe0006f96, 0x13566: 0xe0005246, + 0x1356b: 0xe0008dc7, + 0x1356d: 0xe00075dd, + 0x13570: 0xe0007e6f, 0x13571: 0xe00044ba, + 0x13574: 0xe000825b, 0x13576: 0xe0005328, 0x13577: 0xe0009f17, + 0x13578: 0xe000870c, 0x13579: 0xe0006673, 0x1357a: 0xe0006e32, + 0x1357f: 0xe0009c1e, + // Block 0x4d6, offset 0x13580 + 0x13580: 0xe00063c2, 0x13582: 0xe00058b7, 0x13583: 0xe0007cec, + 0x13584: 0xe0007202, 0x13586: 0xe0007067, + 0x13588: 0xe0004553, 0x1358a: 0xe0006286, 0x1358b: 0xe0005b66, + 0x1358f: 0xe00047df, + 0x1359a: 0xe0006769, + 0x1359c: 0xe0005da5, 0x1359d: 0xe0007324, 0x1359e: 0xe00089fb, + 0x135a0: 0xe0004b88, 0x135a3: 0xe0009167, + 0x135a8: 0xe0009d2e, 0x135a9: 0xe00052a0, + 0x135b0: 0xe00064b6, 0x135b3: 0xe0006e36, + 0x135b4: 0xe0006115, 0x135b5: 0xe00098cf, + 0x135b8: 0xe0007205, 0x135b9: 0xe0006872, 0x135ba: 0xe000838c, + 0x135bd: 0xe0005384, 0x135be: 0xe000a677, 0x135bf: 0xe000522b, + // Block 0x4d7, offset 0x135c0 + 0x135c0: 0xe000567e, 0x135c2: 0xe0006937, + 0x135c6: 0xe00078b1, + 0x135ca: 0xe0008d47, + 0x135cd: 0xe0008c27, 0x135cf: 0xe0006a21, + 0x135d1: 0xe0005224, + 0x135d8: 0xe00057bd, 0x135d9: 0xe0007a39, 0x135da: 0xe00058ba, + 0x135dd: 0xe000570d, 0x135df: 0xe0008710, + 0x135e0: 0xe0005936, 0x135e3: 0xe0007487, + 0x135e5: 0xe0007d44, 0x135e7: 0xe0008714, + 0x135e8: 0xe0005d4f, 0x135ea: 0xe000859d, + 0x135ec: 0xe00078f5, 0x135ed: 0xe0009902, + 0x135f3: 0xe0009032, + 0x135f4: 0xe0009970, 0x135f6: 0xe00094fe, + 0x135fa: 0xe0005471, 0x135fb: 0xe00090eb, + 0x135fc: 0xe0004c4b, 0x135fe: 0xe0008201, + // Block 0x4d8, offset 0x13600 + 0x13601: 0xe000796a, 0x13602: 0xe0007f4c, 0x13603: 0xe0006dd2, + 0x13605: 0xe0004c4e, 0x13607: 0xe0007958, + 0x13608: 0xe000a8ad, 0x1360a: 0xe0004c51, + 0x1360c: 0xe0006eba, 0x1360d: 0xe0006aec, + 0x13610: 0xe0009062, 0x13612: 0xe0006d54, + 0x13616: 0xe0009e57, + 0x1361b: 0xe00094b6, + 0x1361c: 0xe00072a7, 0x1361e: 0xe00060f7, 0x1361f: 0xe0008e75, + 0x13621: 0xe0004372, + 0x1362a: 0xe000a105, 0x1362b: 0xe00063c6, + 0x1362c: 0xe0006306, + 0x13633: 0xe000987c, + 0x13635: 0xe0009a5b, 0x13636: 0xe000628a, 0x13637: 0xe000a267, + 0x13638: 0xe000416d, 0x13639: 0xe0006e3a, + 0x1363d: 0xe000640a, + // Block 0x4d9, offset 0x13640 + 0x13640: 0xe000676c, + 0x13645: 0xe000795b, 0x13647: 0xe0008b7b, + 0x13651: 0xe0009d7e, + 0x13658: 0xe000706a, 0x13659: 0xe000936d, 0x1365a: 0xe0008d4a, + 0x1365f: 0xe000562b, + 0x13664: 0xe00083b8, 0x13666: 0xe000a075, + 0x13668: 0xe000608e, 0x1366a: 0xe0005a65, 0x1366b: 0xe0005a68, + 0x1366e: 0xe000420a, 0x1366f: 0xe0005847, + 0x13671: 0xe000420e, 0x13672: 0xe0006cea, + 0x13674: 0xe00068a2, 0x13676: 0xe0007a79, + 0x13678: 0xe0009698, + 0x1367e: 0xe0007701, + // Block 0x4da, offset 0x13680 + 0x1368a: 0xe0009502, 0x1368b: 0xe0007f9a, + 0x1368d: 0xe0008624, 0x1368e: 0xe0004d8d, + 0x13692: 0xe0005e69, + 0x13694: 0xe000a7bc, + 0x13698: 0xe00069a3, 0x13699: 0xe000676f, 0x1369a: 0xe0005682, + 0x1369d: 0xe0009035, 0x1369f: 0xe0006bee, + 0x136a1: 0xe0004522, 0x136a2: 0xe00084e0, 0x136a3: 0xe00067c6, + 0x136a5: 0xe00043ff, 0x136a6: 0xe000a404, 0x136a7: 0xe0006d84, + 0x136a8: 0xe0004fc1, 0x136a9: 0xe0004f69, 0x136aa: 0xe00050df, 0x136ab: 0xe00080f8, + 0x136ac: 0xe000682e, 0x136ad: 0xe0009c83, 0x136ae: 0xe0007b93, 0x136af: 0xe0007507, + 0x136b0: 0xe00050e2, 0x136b1: 0xe000a4f7, 0x136b3: 0xe00063ca, + 0x136b7: 0xe0009038, + 0x136b8: 0xe0008034, 0x136b9: 0xe0004f09, 0x136bb: 0xe00097ca, + 0x136bc: 0xe0005ffe, 0x136bd: 0xe0007552, 0x136be: 0xe00069a6, 0x136bf: 0xe000855c, + // Block 0x4db, offset 0x136c0 + 0x136c5: 0xe0007bcf, + 0x136d1: 0xe00080c4, 0x136d2: 0xe0007a7d, 0x136d3: 0xe00059fa, + 0x136d4: 0xe0009ba4, 0x136d5: 0xe000969b, 0x136d7: 0xe00060b8, + 0x136db: 0xe000412b, + 0x136dc: 0xe000605a, 0x136de: 0xe0009e2a, 0x136df: 0xe0004c54, + 0x136e0: 0xe000622e, 0x136e1: 0xe000841e, 0x136e3: 0xe0004489, + 0x136e5: 0xe00077bb, 0x136e6: 0xe00047e2, 0x136e7: 0xe0008824, + 0x136eb: 0xe0008a9f, + 0x136f1: 0xe0007b31, 0x136f3: 0xe000562f, + 0x136f4: 0xe0008863, + 0x136f9: 0xe0009dbe, 0x136fa: 0xe0005ece, 0x136fb: 0xe00067c9, + 0x136fd: 0xe00047e5, 0x136fe: 0xe0009f3b, 0x136ff: 0xe00061d9, + // Block 0x4dc, offset 0x13700 + 0x13700: 0xe00068a6, 0x13701: 0xe0008f6b, 0x13702: 0xe00060fa, 0x13703: 0xe00064fa, + 0x13704: 0xe000412e, 0x13705: 0xe0006001, + 0x13708: 0xe00085d6, 0x13709: 0xe0005e39, + 0x13717: 0xe0005fa6, + 0x1371b: 0xe0004232, + 0x1371c: 0xe0009506, 0x1371d: 0xe00093ec, + 0x13723: 0xe0007c6b, + 0x13728: 0xe00085a0, 0x1372a: 0xe0004ae3, 0x1372b: 0xe0005e6d, + 0x1372f: 0xe0006677, + 0x13731: 0xe0007196, 0x13732: 0xe00085d9, 0x13733: 0xe00043c6, + 0x13734: 0xe000a67a, 0x13735: 0xe00084a8, 0x13736: 0xe00052b6, + 0x13738: 0xe0007f1c, 0x13739: 0xe000795e, + 0x1373c: 0xe0005633, + // Block 0x4dd, offset 0x13740 + 0x13740: 0xe00072ab, 0x13743: 0xe00089ff, + 0x13747: 0xe000a194, + 0x13749: 0xe000969e, 0x1374a: 0xe000a347, + 0x1374f: 0xe000852c, + 0x13750: 0xe000950a, 0x13751: 0xe0008421, 0x13752: 0xe000a61a, + 0x13773: 0xe0005659, + 0x13777: 0xe0009f97, + 0x1377b: 0xe00088b3, + // Block 0x4de, offset 0x13780 + 0x13785: 0xe0005cda, + 0x13789: 0xe0005cb0, 0x1378a: 0xe0008718, + 0x1378e: 0xe0006aef, + 0x13792: 0xe000448c, 0x13793: 0xe0005ed1, + 0x13796: 0xe00046b7, + 0x13798: 0xe000748b, 0x1379a: 0xe0007a3d, 0x1379b: 0xe0008beb, + 0x1379d: 0xe0008e18, 0x1379e: 0xe0007da3, 0x1379f: 0xe000a085, + 0x137a0: 0xe000825e, 0x137a2: 0xe000a2eb, + 0x137a8: 0xe00057f5, 0x137a9: 0xe0006772, 0x137aa: 0xe0007555, 0x137ab: 0xe0005da9, + 0x137bd: 0xe0005e71, 0x137be: 0xe0005e89, 0x137bf: 0xe00085dc, + // Block 0x4df, offset 0x137c0 + 0x137c1: 0xe0009606, 0x137c2: 0xe00088e7, + 0x137c5: 0xe0004a17, + 0x137c9: 0xe0005a8c, 0x137ca: 0xe0004d19, + 0x137cc: 0xe0004ea5, + 0x137d1: 0xe0009997, 0x137d3: 0xe000498b, + 0x137d4: 0xe00066ab, 0x137d6: 0xe0009371, + 0x137d8: 0xe0007313, + 0x137dc: 0xe00093dd, 0x137df: 0xe000553a, + 0x137e0: 0xe0009cad, 0x137e1: 0xe000a089, + 0x137e9: 0xe000662f, 0x137eb: 0xe0004f0d, + 0x137ef: 0xe000a4fa, + 0x137f0: 0xe00047e8, 0x137f1: 0xe0005c6a, 0x137f2: 0xe000693a, + 0x137f4: 0xe0007675, 0x137f6: 0xe0006713, + 0x137f9: 0xe0008827, + 0x137fd: 0xe0007243, + // Block 0x4e0, offset 0x13800 + 0x13803: 0xe00098d2, + 0x13804: 0xe00054f2, 0x13806: 0xe00069a9, 0x13807: 0xe0008770, + 0x1380a: 0xe000580a, 0x1380b: 0xe0009426, + 0x1380c: 0xe0005f0e, 0x1380d: 0xe0009daa, 0x1380e: 0xe0008159, + 0x13829: 0xe00097cd, + 0x1382c: 0xe0005ded, + 0x13831: 0xe000a7a0, + 0x13835: 0xe0007d65, + 0x13838: 0xe0008204, 0x13839: 0xe0009d82, + 0x1383c: 0xe00075e1, 0x1383d: 0xe0005729, + // Block 0x4e1, offset 0x13840 + 0x13846: 0xe0006647, + 0x13849: 0xe0007ac5, 0x1384a: 0xe0007691, + 0x13851: 0xe0009ef2, + 0x13857: 0xe000882a, + 0x1385a: 0xe000751b, 0x1385b: 0xe000425e, + 0x13861: 0xe0009e2d, 0x13863: 0xe00055ff, + 0x13866: 0xe000815c, + 0x13869: 0xe0009cb0, 0x1386a: 0xe000478b, 0x1386b: 0xe000a407, + 0x1386c: 0xe000871c, 0x1386d: 0xe0004170, 0x1386f: 0xe00077bf, + 0x13871: 0xe0009776, 0x13873: 0xe0008186, + 0x13875: 0xe0004e53, 0x13877: 0xe000a784, + 0x1387a: 0xe0008fa3, + // Block 0x4e2, offset 0x13880 + 0x13882: 0xe0009650, + 0x13890: 0xe0007199, + 0x13894: 0xe00073bc, + 0x13899: 0xe000606e, + 0x1389c: 0xe0006b8e, 0x1389f: 0xe0004ce4, + 0x138a1: 0xe00063ce, + 0x138a8: 0xe000950e, + 0x138ad: 0xe0009824, 0x138af: 0xe0004b2e, + 0x138b2: 0xe0009e30, + 0x138b4: 0xe0006b62, + 0x138b8: 0xe0008fcf, 0x138b9: 0xe000461b, 0x138ba: 0xe0009183, 0x138bb: 0xe00077c3, + 0x138bc: 0xe0009375, 0x138bf: 0xe000a40a, + // Block 0x4e3, offset 0x138c0 + 0x138c0: 0xe00070ba, 0x138c1: 0xe000912b, 0x138c2: 0xe0005faa, + 0x138c4: 0xe0009864, 0x138c6: 0xe0006dba, + 0x138c9: 0xe0007f20, 0x138ca: 0xe0007d2c, 0x138cb: 0xe0004402, + 0x138cd: 0xe00073bf, + 0x138d0: 0xe0007ed0, 0x138d1: 0xe0006af2, 0x138d3: 0xe0006463, + 0x138d6: 0xe00069ac, + 0x138da: 0xe000719c, + 0x138ec: 0xe00066ef, 0x138ed: 0xe0007695, 0x138ee: 0xe000591a, 0x138ef: 0xe000977a, + 0x138f1: 0xe0009dc2, + 0x138f4: 0xe00072af, + 0x138fc: 0xe0005b48, 0x138fd: 0xe0009f57, + // Block 0x4e4, offset 0x13900 + 0x13900: 0xe00067cc, + 0x13906: 0xe0005c76, + 0x13911: 0xe0005f76, 0x13913: 0xe0005df1, + 0x13914: 0xe000667b, 0x13915: 0xe0009653, 0x13917: 0xe00085a3, + 0x13918: 0xe0006bf2, 0x1391a: 0xe0008064, + 0x1391e: 0xe0005b98, 0x1391f: 0xe0008eb7, + 0x13921: 0xe00093e0, 0x13923: 0xe0008720, + 0x13925: 0xe000976e, 0x13926: 0xe0008d4d, + 0x1392a: 0xe0008aa3, + 0x1392c: 0xe000701f, 0x1392d: 0xe0008348, 0x1392f: 0xe00090ef, + 0x1393d: 0xe0009ddf, 0x1393f: 0xe000815f, + // Block 0x4e5, offset 0x13940 + 0x13941: 0xe0005388, 0x13943: 0xe00064a2, + 0x13946: 0xe0009512, + 0x13949: 0xe00096a1, 0x1394a: 0xe0007bd2, 0x1394b: 0xe0007bd5, + 0x1394e: 0xe0004b8b, + 0x13953: 0xe0008038, + 0x13955: 0xe0008261, 0x13956: 0xe000448f, + 0x13958: 0xe0007eab, 0x13959: 0xe000a386, + 0x1395e: 0xe0009656, + 0x13961: 0xe0006876, 0x13963: 0xe00072b3, + 0x13964: 0xe0008264, + 0x13968: 0xe0004de1, 0x13969: 0xe0009b72, 0x1396a: 0xe00060fd, 0x1396b: 0xe0005637, + 0x1396d: 0xe0007022, + 0x1397a: 0xe0008fab, + 0x1397e: 0xe0005b21, + // Block 0x4e6, offset 0x13980 + 0x13980: 0xe0007ccc, + 0x13984: 0xe000628e, 0x13986: 0xe000773a, 0x13987: 0xe00061a9, + 0x13989: 0xe0007bd8, 0x1398a: 0xe000478e, + 0x1398c: 0xe000a1c4, 0x1398f: 0xe00083bb, + 0x13991: 0xe0004376, + 0x13994: 0xe0008724, 0x13997: 0xe00080fc, + 0x13999: 0xe000999a, 0x1399b: 0xe0006ebe, + 0x1399d: 0xe00053bc, + 0x139a4: 0xe000a16c, 0x139a5: 0xe000972e, 0x139a6: 0xe00094ba, + 0x139a8: 0xe000a790, 0x139a9: 0xe0006bda, 0x139aa: 0xe000748f, + 0x139af: 0xe0006d57, + 0x139b0: 0xe000a768, + 0x139ba: 0xe0008c2a, + // Block 0x4e7, offset 0x139c0 + 0x139c1: 0xe00047eb, + 0x139c9: 0xe00085a6, + 0x139cd: 0xe00057a5, 0x139ce: 0xe0007493, 0x139cf: 0xe0008728, + 0x139d0: 0xe00060c4, + 0x139d5: 0xe0007f9d, + 0x139dc: 0xe0005890, 0x139dd: 0xe0007b96, + 0x139e4: 0xe00056b6, 0x139e5: 0xe00077c7, + 0x139e9: 0xe00064a6, 0x139ea: 0xe000719f, + 0x139f7: 0xe000882d, + 0x139f9: 0xe000773d, 0x139fa: 0xe0005cff, 0x139fb: 0xe0008ce1, + 0x139fd: 0xe00099d0, 0x139ff: 0xe00049cf, + // Block 0x4e8, offset 0x13a00 + 0x13a00: 0xe0009ade, 0x13a02: 0xe0007b99, + 0x13a04: 0xe00050e5, 0x13a06: 0xe0005a3e, 0x13a07: 0xe0007025, + 0x13a0a: 0xe0007cb4, 0x13a0b: 0xe0006a25, + 0x13a16: 0xe00078f1, 0x13a17: 0xe0006532, + 0x13a18: 0xe0007863, 0x13a1a: 0xe0006e3e, + 0x13a22: 0xe0005ae8, + 0x13a27: 0xe0004492, + 0x13a29: 0xe00064ba, + 0x13a2d: 0xe0005755, 0x13a2f: 0xe0009b82, + 0x13a3c: 0xe00061dc, 0x13a3f: 0xe00056f2, + // Block 0x4e9, offset 0x13a40 + 0x13a41: 0xe00050e8, + 0x13a4e: 0xe000a40d, + 0x13a50: 0xe0009fc9, 0x13a53: 0xe000a6fe, + 0x13a54: 0xe00044be, 0x13a55: 0xe0009420, + 0x13a5b: 0xe000a1ce, + 0x13a5c: 0xe0005a41, 0x13a5e: 0xe0007fa0, 0x13a5f: 0xe000a410, + 0x13a67: 0xe000a7ef, + 0x13a6b: 0xe000a7bf, + 0x13a6c: 0xe0004e80, 0x13a6f: 0xe0004e83, + 0x13a71: 0xe000732c, + 0x13a78: 0xe00085df, 0x13a79: 0xe000a4bf, 0x13a7a: 0xe000a7c2, 0x13a7b: 0xe0005f1e, + // Block 0x4ea, offset 0x13a80 + 0x13a8a: 0xe000614b, 0x13a8b: 0xe0007bdb, + 0x13a8c: 0xe00063d2, 0x13a8d: 0xe00069af, + 0x13a93: 0xe00084ac, + 0x13a95: 0xe0009516, + 0x13aa3: 0xe000493c, + 0x13aa4: 0xe0008ce4, + 0x13aa8: 0xe00067cf, 0x13aa9: 0xe0009973, 0x13aaa: 0xe0005671, + 0x13aaf: 0xe0004ce7, + 0x13ab0: 0xe0008267, 0x13ab1: 0xe0009413, + 0x13ab4: 0xe000826a, + // Block 0x4eb, offset 0x13ac0 + 0x13ac0: 0xe0008eba, + 0x13ac5: 0xe0008aa7, 0x13ac6: 0xe0008866, 0x13ac7: 0xe0006af5, + 0x13ac9: 0xe00059fe, 0x13acb: 0xe00052fc, + 0x13ad4: 0xe000a67d, + 0x13ad9: 0xe0007d47, 0x13adb: 0xe0008e78, + 0x13ade: 0xe000a5ca, 0x13adf: 0xe0004b8e, + 0x13ae3: 0xe0005121, + 0x13ae4: 0xe000a0a5, + 0x13ae9: 0xe0004960, + 0x13aec: 0xe0004964, 0x13aed: 0xe000916b, + 0x13af8: 0xe000706d, 0x13af9: 0xe0007f50, 0x13afb: 0xe0006fcb, + 0x13afe: 0xe0007558, + // Block 0x4ec, offset 0x13b00 + 0x13b00: 0xe000971a, 0x13b02: 0xe00066f3, 0x13b03: 0xe0007497, + 0x13b06: 0xe000a29b, + 0x13b08: 0xe0007c35, 0x13b09: 0xe00067d2, 0x13b0a: 0xe0005cdd, 0x13b0b: 0xe00057f9, + 0x13b11: 0xe000532c, + 0x13b18: 0xe000903b, 0x13b1a: 0xe000693d, + 0x13b1c: 0xe0006242, 0x13b1d: 0xe00050eb, + 0x13b21: 0xe0006b40, + 0x13b25: 0xe0006dd6, + 0x13b28: 0xe0008acb, 0x13b29: 0xe0008d50, + 0x13b34: 0xe0009482, 0x13b35: 0xe0007a41, 0x13b37: 0xe0004dd5, + 0x13b3a: 0xe0007bde, 0x13b3b: 0xe000961e, + 0x13b3f: 0xe0008100, + // Block 0x4ed, offset 0x13b40 + 0x13b40: 0xe000563b, + 0x13b4c: 0xe00049b8, 0x13b4e: 0xe0004266, + 0x13b55: 0xe000742f, 0x13b57: 0xe000a61e, + 0x13b59: 0xe0009d86, + 0x13b5f: 0xe0008162, + 0x13b60: 0xe00066af, + 0x13b64: 0xe000826d, 0x13b65: 0xe000602e, 0x13b66: 0xe0009f9a, + 0x13b68: 0xe0007328, + 0x13b6e: 0xe00066b3, + 0x13b74: 0xe000a413, 0x13b76: 0xe0008abf, + 0x13b78: 0xe0007d4a, + // Block 0x4ee, offset 0x13b80 + 0x13b82: 0xe00057e1, 0x13b83: 0xe000640e, + 0x13b8c: 0xe0006332, 0x13b8d: 0xe00082e0, + 0x13b98: 0xe00083e5, + 0x13b9e: 0xe0005d8d, 0x13b9f: 0xe0005fae, + 0x13ba2: 0xe000a34b, 0x13ba3: 0xe00056de, + 0x13bad: 0xe0005ce0, + 0x13bb3: 0xe0005404, + 0x13bb4: 0xe000912f, + 0x13bba: 0xe00056f5, 0x13bbb: 0xe0005bb3, + 0x13bbd: 0xe0008dfb, + // Block 0x4ef, offset 0x13bc0 + 0x13bc0: 0xe00070d6, + 0x13bc4: 0xe0009a28, 0x13bc7: 0xe0005d90, + 0x13bca: 0xe0006031, 0x13bcb: 0xe00074e3, + 0x13bd2: 0xe0005e8d, + 0x13bda: 0xe0009d3a, 0x13bdb: 0xe0009d3e, + 0x13be0: 0xe000630a, 0x13be3: 0xe00050ee, + 0x13bec: 0xe0006e42, 0x13bef: 0xe0007e72, + 0x13bf2: 0xe00098b4, + 0x13bf7: 0xe0005434, + 0x13bf9: 0xe000a142, 0x13bfb: 0xe00083be, + 0x13bfe: 0xe0006f06, + // Block 0x4f0, offset 0x13c00 + 0x13c05: 0xe0007370, + 0x13c0d: 0xe000427e, + 0x13c11: 0xe0007b65, + 0x13c15: 0xe0007a45, + 0x13c1f: 0xe00057c1, + 0x13c21: 0xe00058bd, 0x13c22: 0xe0008f1b, 0x13c23: 0xe0005893, + 0x13c31: 0xe00047ee, 0x13c32: 0xe00045bf, + 0x13c36: 0xe0008688, + 0x13c39: 0xe0005674, 0x13c3b: 0xe0005df5, + // Block 0x4f1, offset 0x13c40 + 0x13c40: 0xe000a2b3, + 0x13c44: 0xe0005283, 0x13c46: 0xe0008f7b, + 0x13c4a: 0xe0005f7e, + 0x13c4c: 0xe000a198, 0x13c4d: 0xe0007a05, 0x13c4e: 0xe0004236, + 0x13c52: 0xe000a26b, 0x13c53: 0xe00072f7, + 0x13c57: 0xe0004131, + 0x13c59: 0xe000755b, 0x13c5b: 0xe0008165, + 0x13c5d: 0xe00098b8, 0x13c5e: 0xe0008189, + 0x13c61: 0xe000a34f, 0x13c62: 0xe0004c57, 0x13c63: 0xe00083c1, + 0x13c68: 0xe0009e98, 0x13c6b: 0xe0006bf6, + 0x13c6e: 0xe00048cc, + 0x13c70: 0xe000711b, 0x13c72: 0xe0005196, + 0x13c77: 0xe00098bc, + 0x13c7d: 0xe0008538, 0x13c7e: 0xe0004f6d, 0x13c7f: 0xe0004f71, + // Block 0x4f2, offset 0x13c80 + 0x13c81: 0xe00080c8, 0x13c82: 0xe0005fc2, + 0x13c88: 0xe0004134, 0x13c8b: 0xe0005474, + 0x13c8d: 0xe0009e33, + 0x13c92: 0xe0005300, + 0x13c96: 0xe00071a2, 0x13c97: 0xe00090f3, + 0x13c9b: 0xe0008869, + 0x13c9d: 0xe00067d5, 0x13c9e: 0xe00048b0, + 0x13ca2: 0xe00064be, + 0x13caa: 0xe0004495, 0x13cab: 0xe0009f02, + 0x13cb4: 0xe00047f1, + // Block 0x4f3, offset 0x13cc0 + 0x13cc0: 0xe00084e4, 0x13cc1: 0xe00087b0, 0x13cc2: 0xe000595a, + 0x13cc5: 0xe0008774, + 0x13cca: 0xe000525b, + 0x13ccd: 0xe00048d0, 0x13ccf: 0xe0005cb3, + 0x13cd2: 0xe00067d8, + 0x13cd4: 0xe0007b9c, 0x13cd5: 0xe0008207, + 0x13cd8: 0xe0004cea, 0x13cd9: 0xe0004d45, + 0x13cdc: 0xe0006632, 0x13cdd: 0xe000872c, 0x13cdf: 0xe0006af8, + 0x13ce1: 0xe0005cb6, + 0x13ce8: 0xe0006940, + 0x13cef: 0xe0008ebd, + 0x13cf1: 0xe0009ebf, 0x13cf3: 0xe0006c96, + 0x13cf4: 0xe0006442, 0x13cf5: 0xe0006445, + 0x13cf8: 0xe00056f8, 0x13cf9: 0xe00049bb, + 0x13cfd: 0xe0008c2d, 0x13cfe: 0xe0004498, + // Block 0x4f4, offset 0x13d00 + 0x13d04: 0xe0009429, 0x13d07: 0xe000667f, + 0x13d0a: 0xe0009d8a, + 0x13d0c: 0xe00048d4, + 0x13d10: 0xe0004262, 0x13d12: 0xe0009e36, 0x13d13: 0xe0006635, + 0x13d15: 0xe0008270, + 0x13d18: 0xe0008168, 0x13d19: 0xe0006448, 0x13d1a: 0xe000886c, + 0x13d25: 0xe0007ec4, 0x13d27: 0xe0004717, + 0x13d2a: 0xe0009c21, 0x13d2b: 0xe000999d, + 0x13d30: 0xe00044da, + 0x13d36: 0xe000733c, + 0x13d38: 0xe0005b9b, 0x13d3a: 0xe00095f2, 0x13d3b: 0xe0006ec2, + // Block 0x4f5, offset 0x13d40 + 0x13d41: 0xe000437a, + 0x13d44: 0xe0007837, + 0x13d4d: 0xe00086ac, + 0x13d56: 0xe0007c6e, + 0x13d58: 0xe0004b31, + 0x13d5c: 0xe00095b6, 0x13d5e: 0xe000654a, 0x13d5f: 0xe0004f75, + 0x13d60: 0xe0005438, + 0x13d64: 0xe00057a9, + 0x13d6a: 0xe0005e3d, + 0x13d6d: 0xe000a91a, 0x13d6f: 0xe00099d4, + 0x13d72: 0xe0007340, + 0x13d74: 0xe000576d, + 0x13d7f: 0xe0006d5a, + // Block 0x4f6, offset 0x13d80 + 0x13d81: 0xe0007e75, 0x13d83: 0xe000538c, + 0x13d86: 0xe0006683, 0x13d87: 0xe0009d0d, + 0x13d88: 0xe000a184, 0x13d89: 0xe00050f1, 0x13d8b: 0xe0004593, + 0x13d8f: 0xe0004e56, + 0x13d93: 0xe0005f26, + 0x13d96: 0xe00073c2, 0x13d97: 0xe0006b43, + 0x13d98: 0xe0008aab, + 0x13da1: 0xe0004557, + 0x13da8: 0xe00075e5, 0x13da9: 0xe00054f5, 0x13daa: 0xe00099c8, + 0x13dac: 0xe00050f4, 0x13daf: 0xe0004ced, + 0x13db2: 0xe0004f11, + 0x13db7: 0xe000942c, + 0x13dba: 0xe0004196, + 0x13dbd: 0xe00057ad, 0x13dbf: 0xe00088eb, + // Block 0x4f7, offset 0x13dc0 + 0x13dc0: 0xe0004a1b, + 0x13dd2: 0xe000419a, + 0x13dd4: 0xe0004f39, 0x13dd6: 0xe00045e3, + 0x13dda: 0xe0004848, + 0x13ddc: 0xe00085e2, 0x13ddd: 0xe000886f, + 0x13de3: 0xe000a145, + 0x13de5: 0xe0004b4c, + 0x13df1: 0xe0009f5b, 0x13df3: 0xe0004888, + 0x13df4: 0xe0006c9a, + 0x13df8: 0xe000971e, + // Block 0x4f8, offset 0x13e00 + 0x13e00: 0xe00078c9, 0x13e02: 0xe0008b7f, 0x13e03: 0xe0006775, + 0x13e07: 0xe0004b50, + 0x13e08: 0xe0004764, 0x13e09: 0xe0006502, 0x13e0a: 0xe000749b, + 0x13e0c: 0xe000a4c3, 0x13e0e: 0xe0009be5, + 0x13e10: 0xe000764d, 0x13e11: 0xe0008448, 0x13e13: 0xe000a76c, + 0x13e14: 0xe000832c, 0x13e15: 0xe0006bba, 0x13e16: 0xe000a865, 0x13e17: 0xe0009abe, + 0x13e18: 0xe0005079, 0x13e1b: 0xe0007d4d, + 0x13e1d: 0xe000755e, 0x13e1f: 0xe00070ea, + 0x13e22: 0xe000a851, 0x13e23: 0xe00045db, + 0x13e25: 0xe000526b, + 0x13e2a: 0xe00063d6, + 0x13e2d: 0xe0006ec6, + 0x13e31: 0xe000a1d1, + 0x13e34: 0xe0007028, 0x13e36: 0xe0004137, + 0x13e3a: 0xe00090f7, 0x13e3b: 0xe0008e7b, + 0x13e3c: 0xe0008bef, 0x13e3e: 0xe00085e5, + // Block 0x4f9, offset 0x13e40 + 0x13e41: 0xe000484b, + 0x13e46: 0xe0008872, + 0x13e4b: 0xe0008ec0, + 0x13e50: 0xe0006afb, 0x13e51: 0xe000844b, + 0x13e54: 0xe0008ce7, 0x13e55: 0xe0009dae, 0x13e56: 0xe0009f0b, 0x13e57: 0xe000a36b, + 0x13e58: 0xe0004d79, 0x13e5b: 0xe0008830, + 0x13e5e: 0xe0006afe, + 0x13e60: 0xe0007b35, 0x13e61: 0xe000a740, 0x13e62: 0xe00072b7, 0x13e63: 0xe0007b9f, + 0x13e66: 0xe00073c5, + 0x13e69: 0xe00073c8, 0x13e6b: 0xe0009a79, + 0x13e6c: 0xe0004cf0, 0x13e6d: 0xe0004df6, 0x13e6e: 0xe000896f, + 0x13e70: 0xe000a90e, 0x13e71: 0xe000a4fd, 0x13e72: 0xe000a148, 0x13e73: 0xe0006c9e, + 0x13e75: 0xe0006e46, + 0x13e79: 0xe0009592, + 0x13e7c: 0xe000a695, 0x13e7f: 0xe0004b01, + // Block 0x4fa, offset 0x13e80 + 0x13e82: 0xe0008d53, + 0x13e84: 0xe0005b24, 0x13e85: 0xe0008e7e, 0x13e86: 0xe0004ae7, 0x13e87: 0xe000498e, + 0x13e8c: 0xe000903e, 0x13e8d: 0xe00084b0, + 0x13e91: 0xe0004aeb, 0x13e93: 0xe0006d5d, + 0x13e95: 0xe0009b0e, + 0x13e98: 0xe000820a, 0x13e9a: 0xe00096e3, + 0x13e9e: 0xe0007889, + 0x13ea0: 0xe0006f9a, 0x13ea1: 0xe0004767, 0x13ea2: 0xe000a29f, 0x13ea3: 0xe0006100, + 0x13ea4: 0xe0007c38, 0x13ea5: 0xe00047f4, 0x13ea6: 0xe00070ee, 0x13ea7: 0xe0009e5a, + 0x13ea8: 0xe000a680, 0x13eaa: 0xe0006eca, + 0x13eb0: 0xe00071a5, 0x13eb2: 0xe0004991, + 0x13eb9: 0xe0006943, + 0x13ebc: 0xe00083c4, 0x13ebe: 0xe00082f8, 0x13ebf: 0xe0008cea, + // Block 0x4fb, offset 0x13ec0 + 0x13ec2: 0xe0009596, + 0x13ec4: 0xe00072bb, 0x13ec7: 0xe0005390, + 0x13ec9: 0xe000818c, 0x13ecb: 0xe000960a, + 0x13ecd: 0xe00087d9, 0x13ecf: 0xe00097d0, + 0x13ed2: 0xe000584b, + 0x13ed6: 0xe0005ab8, + 0x13edb: 0xe000820d, + 0x13edc: 0xe00095d6, 0x13ede: 0xe0009d8e, 0x13edf: 0xe00073f5, + 0x13ee0: 0xe000a7a8, 0x13ee1: 0xe00073cb, + 0x13ee4: 0xe00075e9, 0x13ee6: 0xe0009635, 0x13ee7: 0xe000a14b, + 0x13eea: 0xe0008b83, 0x13eeb: 0xe0004212, + 0x13eed: 0xe0008210, 0x13eee: 0xe00085a9, + 0x13ef0: 0xe00073f8, 0x13ef1: 0xe000a7d4, 0x13ef3: 0xe0007699, + 0x13ef4: 0xe000a08d, 0x13ef6: 0xe000750b, 0x13ef7: 0xe0009ede, + 0x13ef8: 0xe0008c30, 0x13efa: 0xe00078cd, + 0x13efc: 0xe000a7ac, 0x13efe: 0xe000514e, + // Block 0x4fc, offset 0x13f00 + 0x13f00: 0xe0006004, 0x13f01: 0xe0007631, 0x13f02: 0xe000816b, + 0x13f04: 0xe00056ba, 0x13f07: 0xe00044de, + 0x13f0c: 0xe0004173, 0x13f0e: 0xe00061ac, + 0x13f10: 0xe0006246, 0x13f11: 0xe000a3a4, + 0x13f14: 0xe0009fcd, 0x13f16: 0xe000709a, 0x13f17: 0xe00063da, + 0x13f19: 0xe00045f7, 0x13f1a: 0xe0008468, 0x13f1b: 0xe000437e, + 0x13f1c: 0xe0008104, 0x13f1d: 0xe0006b01, + 0x13f20: 0xe0007e78, 0x13f23: 0xe0007fe2, + 0x13f26: 0xe000471b, + 0x13f28: 0xe0006007, 0x13f2b: 0xe00088b7, + 0x13f2c: 0xe0005bdd, + 0x13f33: 0xe0004c5a, + 0x13f37: 0xe0007c71, + 0x13f39: 0xe0004f15, + 0x13f3e: 0xe0005e15, + // Block 0x4fd, offset 0x13f40 + 0x13f41: 0xe000a500, 0x13f43: 0xe000a743, + 0x13f49: 0xe0008fd3, + 0x13f4c: 0xe0007d68, 0x13f4e: 0xe000a805, 0x13f4f: 0xe000507c, + 0x13f54: 0xe0006e8a, 0x13f56: 0xe0009309, + 0x13f58: 0xe0007433, 0x13f59: 0xe00096e6, 0x13f5a: 0xe0005394, + 0x13f5c: 0xe0006638, 0x13f5f: 0xe0008d56, + 0x13f66: 0xe00046bb, + 0x13f6b: 0xe0006f26, + 0x13f6c: 0xe0006946, 0x13f6f: 0xe0007985, + 0x13f70: 0xe00083c7, 0x13f71: 0xe0006e8e, + 0x13f74: 0xe0004597, 0x13f77: 0xe000a416, + 0x13f7d: 0xe0007ba2, 0x13f7f: 0xe000a3a7, + // Block 0x4fe, offset 0x13f80 + 0x13f80: 0xe0005573, + 0x13f89: 0xe0008273, 0x13f8a: 0xe000655e, + 0x13f8c: 0xe0007a49, 0x13f8e: 0xe0007208, + 0x13f90: 0xe00071a8, 0x13f92: 0xe00092d9, 0x13f93: 0xe000783b, + 0x13f96: 0xe00092dd, + 0x13f9a: 0xe0009269, + 0x13f9c: 0xe000543c, 0x13f9e: 0xe00078dd, + // Block 0x4ff, offset 0x13fc0 + 0x13ff7: 0xe0004874, + 0x13fff: 0xe000476a, + // Block 0x500, offset 0x14000 + 0x14001: 0xe000a5c2, + 0x14006: 0xe000565c, 0x14007: 0xe00043ca, + 0x14008: 0xe000507f, 0x14009: 0xe00073fb, 0x1400a: 0xe0009ee2, + 0x1400c: 0xe0007da7, 0x1400e: 0xe000720b, + 0x14015: 0xe00073ce, 0x14016: 0xe0009880, + 0x1401a: 0xe000559f, + 0x14021: 0xe0006ca2, 0x14022: 0xe000a5a2, + 0x14028: 0xe000a908, 0x1402a: 0xe000a419, 0x1402b: 0xe0007ba5, + 0x1402c: 0xe0008875, + 0x14033: 0xe0006a29, + 0x14038: 0xe00099a0, 0x14039: 0xe0009e9b, 0x1403a: 0xe00073d1, + // Block 0x501, offset 0x14040 + 0x14042: 0xe00096a4, 0x14043: 0xe0005ef2, + 0x1404a: 0xe0005ede, + 0x1404c: 0xe000600a, 0x1404d: 0xe0005ce3, + 0x14053: 0xe00060c7, + 0x14054: 0xe00069b2, + 0x14058: 0xe0005ef6, + 0x1405d: 0xe0009d10, 0x1405e: 0xe0008b87, + 0x14060: 0xe0006778, 0x14061: 0xe00087b3, 0x14062: 0xe0004940, + 0x14067: 0xe0006a05, + 0x14068: 0xe000a503, 0x14069: 0xe0009cca, 0x1406a: 0xe0009b3e, 0x1406b: 0xe0004a1f, + 0x1406c: 0xe00093fb, 0x1406f: 0xe0008833, + 0x14070: 0xe0006fbf, 0x14072: 0xe00085e8, 0x14073: 0xe0008427, + 0x14074: 0xe0004e2f, 0x14076: 0xe0009d92, 0x14077: 0xe0005eb3, + 0x14078: 0xe0005477, 0x1407a: 0xe000a642, 0x1407b: 0xe0006949, + 0x1407c: 0xe00095da, 0x1407d: 0xe0008424, 0x1407f: 0xe0006103, + // Block 0x502, offset 0x14080 + 0x14080: 0xe0009f9d, 0x14081: 0xe0006832, 0x14082: 0xe0005b00, 0x14083: 0xe0008530, + 0x14084: 0xe000a683, 0x14086: 0xe0006582, 0x14087: 0xe00085ac, + 0x14088: 0xe000413a, 0x1408a: 0xe00088bb, + 0x14091: 0xe00090fb, 0x14093: 0xe0006a09, + 0x14099: 0xe0008ec3, 0x1409a: 0xe0005b03, + 0x1409c: 0xe0006b04, 0x1409e: 0xe0006ca6, + 0x140a0: 0xe000644b, 0x140a1: 0xe0004438, 0x140a2: 0xe000a26f, 0x140a3: 0xe0005eb6, + 0x140a4: 0xe00094be, 0x140a6: 0xe000677b, + 0x140aa: 0xe000916f, + 0x140ac: 0xe0008778, 0x140ad: 0xe00054f8, + 0x140b4: 0xe0005b06, + 0x140bb: 0xe000677e, + 0x140bc: 0xe0004c5d, 0x140bd: 0xe0006cd8, + // Block 0x503, offset 0x140c0 + 0x140c4: 0xe0009041, 0x140c5: 0xe00098d5, 0x140c7: 0xe00082b4, + 0x140c8: 0xe0008fd7, 0x140ca: 0xe000926d, 0x140cb: 0xe0007625, + 0x140cd: 0xe0006f0a, 0x140cf: 0xe0007b69, + 0x140d0: 0xe00074c7, 0x140d3: 0xe0008730, + 0x140d4: 0xe00069b5, 0x140d6: 0xe000709e, + 0x140db: 0xe0004968, + // Block 0x504, offset 0x14100 + 0x14124: 0xe00088bf, 0x14126: 0xe0006b07, 0x14127: 0xe0005166, + 0x1412b: 0xe000a213, + 0x1412d: 0xe00085eb, + 0x14130: 0xe0008e81, 0x14133: 0xe0004e59, + 0x14134: 0xe0006781, 0x14136: 0xe000423a, 0x14137: 0xe0005082, + // Block 0x505, offset 0x14140 + 0x14141: 0xe0009133, + 0x14145: 0xe00096a7, + 0x1414a: 0xe000811c, + 0x1414e: 0xe0008ec6, + 0x14150: 0xe000a2bf, + 0x14159: 0xe0008ced, + 0x14160: 0xe00096e9, 0x14163: 0xe0009905, + 0x14168: 0xe00097d3, 0x1416b: 0xe0004bca, + 0x14172: 0xe0009299, 0x14173: 0xe0008d73, + 0x1417a: 0xe0006784, + 0x1417e: 0xe0009044, + // Block 0x506, offset 0x14180 + 0x14182: 0xe00050f7, + 0x14186: 0xe0009ba7, + 0x1418b: 0xe0006352, + 0x1418c: 0xe0009173, 0x1418e: 0xe0009a7c, 0x1418f: 0xe000413d, + 0x14195: 0xe0008acf, 0x14196: 0xe0009486, 0x14197: 0xe00067db, + 0x1419b: 0xe0009c86, + 0x1419d: 0xe0004465, 0x1419f: 0xe0004f3d, + 0x141a1: 0xe00088c3, 0x141a3: 0xe0006e4a, + 0x141a8: 0xe0004994, 0x141aa: 0xe0004e1d, 0x141ab: 0xe000496c, + 0x141ac: 0xe0004e86, 0x141af: 0xe0005a44, + 0x141b1: 0xe00099a3, 0x141b3: 0xe00054fb, + 0x141bc: 0xe0004d31, + // Block 0x507, offset 0x141c0 + 0x141c6: 0xe0008f4f, + 0x141c8: 0xe0007070, 0x141c9: 0xe0005867, 0x141ca: 0xe0007f24, + 0x141cf: 0xe00053d8, + 0x141d0: 0xe00094c2, + 0x141d4: 0xe0009ae2, + 0x141dd: 0xe00049be, 0x141de: 0xe0004468, 0x141df: 0xe0009065, + 0x141ea: 0xe0008dcb, + 0x141f0: 0xe0008213, + 0x141f4: 0xe0007f54, 0x141f5: 0xe0008dcf, 0x141f6: 0xe0008c63, + 0x141fd: 0xe0007fe5, + // Block 0x508, offset 0x14200 + 0x14200: 0xe0008ad3, 0x14202: 0xe0008216, + 0x14204: 0xe0008c33, 0x14207: 0xe00044c2, + 0x14208: 0xe00054fe, 0x14209: 0xe00091f8, 0x1420a: 0xe000a389, + 0x1420c: 0xe00093ad, 0x1420f: 0xe0008c66, + 0x14215: 0xe0009f5f, + 0x14219: 0xe0009868, + 0x1421c: 0xe0009884, 0x1421f: 0xe00088c7, + 0x14220: 0xe000945e, 0x14223: 0xe0005e19, + 0x14224: 0xe0008dff, + 0x14232: 0xe0008f53, + 0x14234: 0xe000986c, 0x14236: 0xe0004de5, + 0x1423b: 0xe0004bcd, + // Block 0x509, offset 0x14240 + 0x14241: 0xe0008cf0, + 0x14245: 0xe0009732, 0x14247: 0xe0008836, + 0x14249: 0xe00055af, 0x1424a: 0xe0008e84, 0x1424b: 0xe0008c69, + 0x1424d: 0xe00077cb, + 0x14250: 0xe000598e, 0x14251: 0xe000948a, 0x14253: 0xe0009068, + 0x14254: 0xe0008a03, + 0x14259: 0xe0005d2f, + 0x14261: 0xe0006f4e, + 0x14269: 0xe00049df, 0x1426a: 0xe0005d03, 0x1426b: 0xe000749f, + 0x1426c: 0xe0004d91, + 0x14271: 0xe0009a7f, 0x14273: 0xe0004d95, + // Block 0x50a, offset 0x14280 + 0x14280: 0xe0004c60, + 0x14286: 0xe0009659, + 0x1428a: 0xe00091fb, 0x1428b: 0xe0007635, + 0x1428c: 0xe0004df9, 0x1428d: 0xe0004d49, + 0x14292: 0xe000a1e3, + 0x1429f: 0xe0007a09, + 0x142a8: 0xe0005a02, 0x142ab: 0xe00090ff, + 0x142b8: 0xe0009870, 0x142b9: 0xe000906b, 0x142ba: 0xe00096ec, 0x142bb: 0xe0004140, + 0x142bc: 0xe0008510, 0x142be: 0xe0007437, + // Block 0x50b, offset 0x142c0 + 0x142c3: 0xe0004b91, + 0x142c5: 0xe0005a47, 0x142c7: 0xe0008a07, + 0x142c8: 0xe0008ec9, 0x142c9: 0xe00087b6, + 0x142d2: 0xe00095de, 0x142d3: 0xe0005df9, + 0x142d4: 0xe000663b, 0x142d5: 0xe00046bf, + 0x142db: 0xe000584f, + 0x142dc: 0xe0009976, 0x142dd: 0xe000a7d7, 0x142de: 0xe0005e75, 0x142df: 0xe000953e, + 0x142e6: 0xe000591e, 0x142e7: 0xe00065e2, + 0x142e8: 0xe0004a4b, 0x142e9: 0xe000644e, 0x142ea: 0xe0005c16, + 0x142ef: 0xe00091a7, + 0x142f0: 0xe0007867, 0x142f3: 0xe0008e87, + 0x142f8: 0xe00071ab, 0x142f9: 0xe0006687, 0x142fb: 0xe000668b, + 0x142fe: 0xe0008973, 0x142ff: 0xe0007961, + // Block 0x50c, offset 0x14300 + 0x14300: 0xe0007cd0, 0x14302: 0xe000488c, + 0x14304: 0xe000a04d, 0x14305: 0xe00080cc, 0x14306: 0xe0005ab0, + 0x14309: 0xe0008977, + 0x1430d: 0xe0009542, 0x1430e: 0xe0004b94, + 0x14312: 0xe000687a, + 0x14314: 0xe0005d33, 0x14317: 0xe0004306, + 0x14318: 0xe000a5a6, + 0x1431d: 0xe0007964, 0x1431e: 0xe000a091, 0x1431f: 0xe0004b44, + 0x14321: 0xe00069b8, 0x14322: 0xe00058da, 0x14323: 0xe00058f2, + 0x14324: 0xe0005a6b, + // Block 0x50d, offset 0x14340 + 0x1435b: 0xe00074a3, + 0x1435c: 0xe00047f7, 0x1435f: 0xe0009f0e, + 0x14362: 0xe0005785, 0x14363: 0xe000577d, + 0x14366: 0xe0009cce, + 0x14368: 0xe0006562, + 0x1436d: 0xe0006b0a, 0x1436e: 0xe000657a, 0x1436f: 0xe0006566, + 0x14370: 0xe0009103, 0x14371: 0xe0007ec8, 0x14372: 0xe000522f, + 0x1437b: 0xe000752f, + 0x1437f: 0xe000951a, + // Block 0x50e, offset 0x14380 + 0x14380: 0xe000423e, 0x14382: 0xe0007fa3, 0x14383: 0xe0007c74, + 0x14384: 0xe000a875, 0x14385: 0xe00074a7, + 0x1438d: 0xe0005696, 0x1438e: 0xe0007b39, + 0x14391: 0xe0004f19, 0x14393: 0xe0007588, + 0x14394: 0xe000630e, 0x14395: 0xe0007c77, + 0x143a2: 0xe00096ef, + 0x143a4: 0xe000844e, 0x143a5: 0xe000a36f, 0x143a6: 0xe0004143, + 0x143a8: 0xe0009bbc, 0x143aa: 0xe00088cb, 0x143ab: 0xe0006292, + 0x143ac: 0xe0007df3, 0x143ad: 0xe0009177, + 0x143b0: 0xe00072fb, 0x143b2: 0xe000452e, + 0x143b4: 0xe000a698, 0x143b7: 0xe00061af, + 0x143b8: 0xe00065fe, 0x143b9: 0xe00088cf, 0x143ba: 0xe00051be, + 0x143bd: 0xe00097d6, + // Block 0x50f, offset 0x143c0 + 0x143c0: 0xe0009c24, 0x143c1: 0xe00070f2, 0x143c2: 0xe0004a73, 0x143c3: 0xe0005501, + 0x143c5: 0xe000a728, 0x143c6: 0xe0007989, + 0x143c8: 0xe000a353, 0x143cb: 0xe0009e39, + 0x143cc: 0xe0008276, 0x143cd: 0xe000702b, 0x143cf: 0xe0009c39, + 0x143d0: 0xe0009874, 0x143d1: 0xe0004c63, + 0x143d4: 0xe0005504, 0x143d5: 0xe00046c3, 0x143d6: 0xe00088ef, 0x143d7: 0xe000565f, + 0x143d9: 0xe0008839, 0x143da: 0xe0009c08, + 0x143dd: 0xe0006d60, 0x143de: 0xe00059c2, 0x143df: 0xe00070a2, + 0x143e0: 0xe0008cf3, 0x143e1: 0xe0008f1f, 0x143e2: 0xe00066f7, 0x143e3: 0xe0005922, + 0x143ee: 0xe0009638, + 0x143f1: 0xe0008e8a, 0x143f2: 0xe0009107, + 0x143f4: 0xe0009ae6, 0x143f5: 0xe0004e5c, 0x143f6: 0xe000818f, + 0x143f8: 0xe0008500, + 0x143fc: 0xe0009f77, 0x143fe: 0xe000821c, + // Block 0x510, offset 0x14400 + 0x14401: 0xe0005686, 0x14402: 0xe00071ae, + 0x14407: 0xe0007fa6, + 0x14409: 0xe0008bf3, 0x1440a: 0xe0008219, 0x1440b: 0xe000803c, + 0x1440d: 0xe0009d62, 0x1440e: 0xe0004997, 0x1440f: 0xe0007651, + 0x14410: 0xe0009fa0, 0x14411: 0xe000a622, 0x14412: 0xe0008ecc, 0x14413: 0xe0005507, + 0x14414: 0xe0005340, 0x14415: 0xe000816e, + 0x14418: 0xe0004cf3, 0x14419: 0xe0007e7b, 0x1441b: 0xe0005bec, + 0x1441c: 0xe00070be, 0x1441d: 0xe00053dc, 0x1441e: 0xe000963b, + 0x14420: 0xe00080d0, 0x14421: 0xe000702e, 0x14423: 0xe000459b, + 0x14428: 0xe0007c7a, 0x14429: 0xe00088d3, + 0x1442c: 0xe00070aa, 0x1442d: 0xe0008cf6, 0x1442e: 0xe00091fe, 0x1442f: 0xe000568a, + 0x14432: 0xe0009047, + 0x14435: 0xe0008f23, 0x14436: 0xe0007eae, 0x14437: 0xe00094c6, + 0x14438: 0xe0006e4e, 0x1443a: 0xe000821f, + 0x1443c: 0xe0005b4b, 0x1443d: 0xe000446b, 0x1443f: 0xe0009f05, + // Block 0x511, offset 0x14440 + 0x14440: 0xe0007e7e, 0x14441: 0xe0005eb9, 0x14442: 0xe000a14e, 0x14443: 0xe00071b1, + 0x14444: 0xe000a57a, 0x14445: 0xe0008a0b, 0x14447: 0xe000842a, + 0x14448: 0xe0005dad, 0x1444a: 0xe000656a, + 0x1444c: 0xe00058c0, 0x1444f: 0xe00056fb, + 0x14450: 0xe0005ce6, 0x14451: 0xe0008374, + 0x14455: 0xe0007d08, + 0x14459: 0xe0005e79, + 0x14460: 0xe0006a2d, 0x14462: 0xe000a357, 0x14463: 0xe000513c, + 0x14466: 0xe00063de, + 0x14468: 0xe0009746, 0x1446a: 0xe0006b0d, + 0x1446f: 0xe00042c6, + 0x14470: 0xe0009baa, 0x14471: 0xe0004c66, 0x14473: 0xe00069bb, + 0x14475: 0xe0007031, + 0x14478: 0xe000883c, + 0x1447d: 0xe0004e89, + // Block 0x512, offset 0x14480 + 0x14481: 0xe0008010, 0x14483: 0xe000a0cd, + 0x14484: 0xe0004ee1, 0x14485: 0xe0009187, + 0x1448a: 0xe0004b97, + 0x1449c: 0xe000484e, 0x1449d: 0xe0009fe5, 0x1449e: 0xe00057e5, + 0x144a1: 0xe0004d4d, 0x144a2: 0xe0007b6d, + 0x144a8: 0xe0006787, 0x144aa: 0xe000942f, 0x144ab: 0xe00069be, + 0x144ad: 0xe00049d3, 0x144af: 0xe00053c0, + 0x144b4: 0xe0009a1c, 0x144b5: 0xe0007fa9, + 0x144bd: 0xe000550a, + // Block 0x513, offset 0x144c0 + 0x144c2: 0xe00075b5, + 0x144d2: 0xe00097d9, + 0x144d5: 0xe000a1b0, + 0x144d9: 0xe000694c, + 0x144de: 0xe0008330, + 0x144e2: 0xe00078e1, 0x144e3: 0xe000877c, + 0x144e7: 0xe00056be, + 0x144ed: 0xe0008b8b, + 0x144f0: 0xe0005d37, 0x144f1: 0xe0009cb3, 0x144f2: 0xe0005304, + 0x144f4: 0xe0007935, + 0x144fd: 0xe0008a0f, + // Block 0x514, offset 0x14500 + 0x14508: 0xe00058f6, 0x14509: 0xe0008222, 0x1450a: 0xe0008b8f, 0x1450b: 0xe00097dc, + 0x1450c: 0xe0008628, 0x1450d: 0xe0006451, 0x1450e: 0xe0008e8d, + 0x14512: 0xe0008e90, + 0x14516: 0xe0009b4a, 0x14517: 0xe000a746, + 0x14522: 0xe00096aa, 0x14523: 0xe000430a, + 0x14524: 0xe0004851, 0x14525: 0xe0007073, + 0x14529: 0xe0005fb2, 0x1452a: 0xe000572d, + 0x1452c: 0xe00071b4, + 0x14532: 0xe0008bf7, + 0x14534: 0xe000553d, 0x14535: 0xe000a6e6, 0x14536: 0xe0005ed4, 0x14537: 0xe000a463, + 0x14538: 0xe0006b92, 0x14539: 0xe0005b27, + // Block 0x515, offset 0x14540 + 0x14543: 0xe0007921, + 0x14547: 0xe00072bf, + 0x14549: 0xe0009908, 0x1454b: 0xe00096ad, + 0x1454d: 0xe0008c36, + 0x14550: 0xe000a452, 0x14552: 0xe0006f9e, + 0x1455c: 0xe00097df, 0x1455e: 0xe0007cd4, + 0x14562: 0xe000a16f, + 0x1456a: 0xe0005b69, 0x1456b: 0xe00083ca, + 0x1456c: 0xe0008734, 0x1456e: 0xe00096b0, 0x1456f: 0xe000a38c, + 0x14571: 0xe0006356, 0x14572: 0xe000523f, + 0x14574: 0xe0005a17, 0x14575: 0xe0004440, + // Block 0x516, offset 0x14580 + 0x14580: 0xe000783f, 0x14581: 0xe000a855, 0x14583: 0xe00073fe, + 0x14585: 0xe0007aad, 0x14587: 0xe00093e3, + 0x14589: 0xe0008225, 0x1458b: 0xe0006dbe, + 0x1458c: 0xe0005cb9, 0x1458d: 0xe0008f7f, 0x1458e: 0xe00077ad, 0x1458f: 0xe0005853, + 0x14590: 0xe0005cbc, 0x14591: 0xe0005125, + 0x14597: 0xe000711e, + 0x14598: 0xe0008b93, + 0x1459c: 0xe000678a, 0x1459d: 0xe0009a04, + 0x145a3: 0xe0008cf9, + 0x145a4: 0xe0006bfe, 0x145a6: 0xe0004cf6, 0x145a7: 0xe00094ca, + 0x145aa: 0xe0007fac, + 0x145ad: 0xe0004970, + 0x145b5: 0xe00093e6, + 0x145bf: 0xe0004f41, + // Block 0x517, offset 0x145c0 + 0x145c7: 0xe00067de, + 0x145cd: 0xe000568e, + 0x145d0: 0xe0004516, 0x145d1: 0xe0009cd2, 0x145d2: 0xe0006c0e, + 0x145d4: 0xe00096f2, 0x145d7: 0xe00082b8, + 0x145dc: 0xe000a6bd, 0x145de: 0xe0004ea9, 0x145df: 0xe0008d59, + 0x145f4: 0xe00059c6, 0x145f5: 0xe0006602, 0x145f7: 0xe0004854, + 0x145f8: 0xe0006372, 0x145fa: 0xe0007c9c, + 0x145ff: 0xe000897b, + // Block 0x518, offset 0x14600 + 0x14600: 0xe0004322, 0x14601: 0xe0009137, + 0x14605: 0xe000446e, + 0x14609: 0xe000a273, 0x1460b: 0xe0009e5d, + 0x1460e: 0xe0006d0e, 0x1460f: 0xe0006d87, + 0x14610: 0xe0006dda, 0x14612: 0xe0008ecf, + 0x14617: 0xe00045fb, + 0x1461b: 0xe0007a0d, + 0x1461e: 0xe0008120, + 0x14622: 0xe000635a, + 0x14624: 0xe0004c69, 0x14625: 0xe00072ff, 0x14626: 0xe0008b97, + 0x14637: 0xe000a4d7, + 0x14638: 0xe0004bd0, + 0x1463c: 0xe000660a, 0x1463e: 0xe0006034, + // Block 0x519, offset 0x14640 + 0x14640: 0xe00082fc, 0x14643: 0xe0009772, + 0x14645: 0xe0005603, + 0x1464b: 0xe000853c, + 0x14651: 0xe0006e52, 0x14653: 0xe000897f, + 0x14655: 0xe0009562, 0x14656: 0xe00071b7, + 0x14658: 0xe0005fb6, 0x14659: 0xe00049c1, 0x1465a: 0xe0008d5c, 0x1465b: 0xe0006f2a, + 0x1465c: 0xe000a079, + 0x14673: 0xe0007ba8, + 0x14676: 0xe0004c6c, 0x14677: 0xe0007034, + 0x14679: 0xe00071ba, + // Block 0x51a, offset 0x14680 + 0x14686: 0xe00082c4, + 0x1468c: 0xe0008b9b, 0x1468f: 0xe000a2ef, + 0x14691: 0xe0008a13, 0x14692: 0xe00066fb, + 0x14697: 0xe000a2a3, + 0x1469f: 0xe0009a20, + 0x146a4: 0xe0006d63, 0x146a5: 0xe0008bfb, + 0x146aa: 0xe0009e3c, + 0x146b2: 0xe0006606, + 0x146b8: 0xe0004471, 0x146b9: 0xe00093b1, 0x146ba: 0xe0008108, + 0x146bc: 0xe0004382, 0x146bd: 0xe0008d5f, + // Block 0x51b, offset 0x146c0 + 0x146c4: 0xe0005a90, 0x146c6: 0xe00093b5, + 0x146cf: 0xe000758b, + 0x146d0: 0xe00097e2, + 0x146d5: 0xe00048d8, + 0x146d8: 0xe00097e5, 0x146d9: 0xe00099a6, 0x146da: 0xe00087dd, + 0x146de: 0xe00072c3, 0x146df: 0xe0005398, + 0x146e0: 0xe0008b9f, 0x146e1: 0xe0005085, 0x146e2: 0xe0008983, 0x146e3: 0xe0009566, + 0x146e4: 0xe0005088, 0x146e6: 0xe0004f79, 0x146e7: 0xe0004a4f, + 0x146e8: 0xe00060bb, 0x146ea: 0xe0008a17, 0x146eb: 0xe0006dc2, + 0x146ec: 0xe000563f, 0x146ee: 0xe00047fa, 0x146ef: 0xe0009229, + // Block 0x51c, offset 0x14700 + 0x14708: 0xe0007b3d, 0x14709: 0xe0007401, 0x1470a: 0xe0005926, 0x1470b: 0xe000499a, + 0x1470d: 0xe000550d, + 0x14714: 0xe00075b9, 0x14717: 0xe0008c6c, + 0x1471b: 0xe0005308, + 0x1471c: 0xe0009fbe, 0x1471d: 0xe0007fe8, + 0x14724: 0xe0006c26, + 0x1472b: 0xe00096f5, + 0x1472c: 0xe00096f8, 0x1472e: 0xe0008228, + 0x14730: 0xe000a5aa, + 0x14735: 0xe00044c6, + 0x1473c: 0xe0009a08, 0x1473e: 0xe0008dd3, + // Block 0x51d, offset 0x14740 + 0x1474a: 0xe0006412, + 0x1474c: 0xe00045ff, + 0x14754: 0xe0007f28, 0x14756: 0xe000710f, 0x14757: 0xe00087ed, + 0x1475a: 0xe00097e8, 0x1475b: 0xe00062aa, + 0x1475f: 0xe0006cc6, + 0x14761: 0xe00085ee, 0x14763: 0xe000a35b, + 0x14764: 0xe000a646, 0x14767: 0xe0004405, + 0x1476c: 0xe000a41c, 0x1476d: 0xe000910b, + 0x14770: 0xe0008504, + // Block 0x51e, offset 0x14780 + 0x14783: 0xe0008d77, + 0x14787: 0xe0006e92, + 0x14788: 0xe000593a, 0x1478a: 0xe0007c7d, 0x1478b: 0xe0005e1d, + 0x1478c: 0xe0005db5, + 0x14791: 0xe00088d7, + 0x14796: 0xe0007c80, 0x14797: 0xe000443c, + 0x14798: 0xe0008780, + 0x1479c: 0xe0005440, 0x1479d: 0xe0005e21, 0x1479e: 0xe0007f2c, 0x1479f: 0xe0006bbe, + 0x147a1: 0xe00046c7, 0x147a2: 0xe0009ec2, + 0x147a4: 0xe0005b9e, 0x147a6: 0xe000977e, + 0x147a8: 0xe000930d, + 0x147b6: 0xe00091ab, + 0x147bb: 0xe0005d3b, + // Block 0x51f, offset 0x147c0 + 0x147c3: 0xe000525e, + 0x147c4: 0xe000a6b5, + 0x147cf: 0xe0008f57, + 0x147d0: 0xe0005b6c, 0x147d3: 0xe000548f, + 0x147d4: 0xe000751f, + 0x147d8: 0xe0008dd7, 0x147d9: 0xe00056e2, + 0x147e5: 0xe0006e56, + 0x147ea: 0xe0005a6e, 0x147eb: 0xe0008987, + 0x147f5: 0xe0009546, 0x147f6: 0xe000a5ae, + 0x147f8: 0xe0009ac2, 0x147fa: 0xe0005444, + // Block 0x520, offset 0x14800 + 0x14802: 0xe000a788, + 0x14804: 0xe0008e93, + 0x1480a: 0xe000a53e, + 0x1480c: 0xe0006a31, + 0x14811: 0xe00042ca, 0x14812: 0xe00042ce, + 0x14815: 0xe000918b, + 0x1481b: 0xe0004abf, + 0x1481e: 0xe00057c5, + 0x14820: 0xe0006b66, 0x14822: 0xe00058c3, 0x14823: 0xe0009ec5, + 0x1482a: 0xe0005a71, + 0x14830: 0xe00077df, 0x14831: 0xe0009311, 0x14832: 0xe000786b, + 0x14835: 0xe0004a53, 0x14837: 0xe0006f52, + 0x1483c: 0xe0005710, 0x1483d: 0xe0009271, 0x1483e: 0xe0005771, 0x1483f: 0xe000922d, + // Block 0x521, offset 0x14840 + 0x14877: 0xe0008738, + // Block 0x522, offset 0x14880 + 0x14880: 0xe000614f, 0x14883: 0xe0006f0e, + 0x14888: 0xe000a039, 0x14889: 0xe0009de2, 0x1488a: 0xe0006bc2, 0x1488b: 0xe0004408, + 0x1488e: 0xe0004b54, 0x1488f: 0xe00082bc, + 0x14891: 0xe000a015, 0x14892: 0xe000a019, 0x14893: 0xe0004216, + 0x14894: 0xe0006212, + 0x14898: 0xe0004326, + 0x1489f: 0xe00069c1, + 0x148a3: 0xe000419e, + 0x148a4: 0xe000a0a9, 0x148a5: 0xe00064ce, + 0x148a8: 0xe0004e5f, 0x148a9: 0xe0006232, 0x148ab: 0xe00048dc, + 0x148ac: 0xe00057fd, 0x148ad: 0xe0005896, + 0x148b1: 0xe0007a5d, + 0x148b6: 0xe00093b9, + 0x148b9: 0xe0007925, 0x148bb: 0xe0007a81, + 0x148bc: 0xe0007639, 0x148bd: 0xe000a48f, 0x148be: 0xe000799d, + // Block 0x523, offset 0x148c0 + 0x148c3: 0xe0004567, + 0x148c7: 0xe0007679, + 0x148c8: 0xe0008192, 0x148ca: 0xe000a5c6, 0x148cb: 0xe00045e7, + 0x148cc: 0xe0005775, 0x148cd: 0xe0005540, + 0x148d3: 0xe000441d, + 0x148d4: 0xe000a0ad, 0x148d5: 0xe0004de9, 0x148d6: 0xe0009c58, + 0x148da: 0xe0004e8c, + 0x148dc: 0xe0004a23, 0x148de: 0xe000a095, + 0x148e0: 0xe0004e20, 0x148e1: 0xe00094ce, 0x148e2: 0xe0006536, + 0x148e5: 0xe000534c, + // Block 0x524, offset 0x14900 + 0x1491c: 0xe000678d, + 0x14921: 0xe00094d2, + 0x14924: 0xe00099a9, + 0x14928: 0xe000776e, 0x1492a: 0xe0009cd6, + 0x1492e: 0xe0007dab, 0x1492f: 0xe000906e, + 0x14932: 0xe00063e2, + 0x1493b: 0xe0008cfc, + 0x1493f: 0xe0007561, + // Block 0x525, offset 0x14940 + 0x14940: 0xe0009a5e, 0x14942: 0xe0009f08, + 0x14944: 0xe0006790, + 0x1494b: 0xe0005ba1, + 0x1494c: 0xe0005ee2, 0x1494d: 0xe0004386, + 0x14950: 0xe000a01d, + 0x14958: 0xe000a373, 0x1495b: 0xe0009de5, + 0x1495c: 0xe000a0b1, 0x1495d: 0xe0006f12, 0x1495e: 0xe0007374, 0x1495f: 0xe0009462, + 0x14961: 0xe0005677, 0x14962: 0xe00080d4, 0x14963: 0xe000910f, + 0x14964: 0xe0008c39, + 0x1496a: 0xe0006454, + 0x1496c: 0xe0009827, + 0x14970: 0xe000834c, 0x14972: 0xe000720e, 0x14973: 0xe0009113, + 0x14974: 0xe00069c4, 0x14975: 0xe0005c6e, 0x14976: 0xe0005510, 0x14977: 0xe000a07d, + 0x14978: 0xe0005bfa, + 0x1497c: 0xe0008878, 0x1497d: 0xe0007843, + // Block 0x526, offset 0x14980 + 0x14984: 0xe0008c6f, 0x14985: 0xe0007faf, 0x14986: 0xe0005c32, + 0x1498a: 0xe000547a, 0x1498b: 0xe00071bd, + 0x1498d: 0xe000a626, 0x1498e: 0xe000476d, + 0x14991: 0xe00050fa, + 0x14994: 0xe000455b, 0x14995: 0xe0008040, 0x14997: 0xe0007e2d, + 0x14998: 0xe0007704, 0x14999: 0xe0004ed1, 0x1499b: 0xe0008c3c, + 0x1499c: 0xe000873c, + 0x149a3: 0xe0005d07, + 0x149a4: 0xe0009c2a, 0x149a7: 0xe00071c0, + 0x149a8: 0xe00071c3, 0x149a9: 0xe0007c83, 0x149aa: 0xe000a1f7, + 0x149b0: 0xe000734c, 0x149b1: 0xe0008300, 0x149b3: 0xe000a7f8, + 0x149b4: 0xe0005aec, 0x149b6: 0xe0008451, 0x149b7: 0xe0005a1a, + 0x149b8: 0xe0005a1d, 0x149b9: 0xe000982a, 0x149bb: 0xe0009466, + 0x149bc: 0xe0008f5b, + // Block 0x527, offset 0x149c0 + 0x149c0: 0xe000862c, 0x149c1: 0xe000760d, + 0x149c4: 0xe0008074, 0x149c5: 0xe0007564, 0x149c6: 0xe00091af, 0x149c7: 0xe00047fd, + 0x149c9: 0xe0009979, 0x149cb: 0xe0008f27, + 0x149cc: 0xe00085af, 0x149cd: 0xe0007d0c, 0x149ce: 0xe000883f, + 0x149d5: 0xe0008cff, 0x149d6: 0xe00071c6, + 0x149d9: 0xe0007533, 0x149da: 0xe0004a57, 0x149db: 0xe00097eb, + 0x149dc: 0xe0008698, 0x149dd: 0xe0007d30, 0x149de: 0xe0004791, + 0x149e2: 0xe0005cbf, 0x149e3: 0xe000515a, + 0x149e8: 0xe0007fb2, 0x149e9: 0xe0007fb5, 0x149ea: 0xe0006ece, + 0x149ef: 0xe0006153, + 0x149f0: 0xe0006836, 0x149f2: 0xe0008044, + 0x149f6: 0xe00059ca, 0x149f7: 0xe0005b09, + 0x149f9: 0xe0006296, 0x149fa: 0xe0006092, 0x149fb: 0xe000898b, + // Block 0x528, offset 0x14a00 + 0x14a00: 0xe00071c9, + 0x14a04: 0xe0007076, 0x14a05: 0xe0006c2a, 0x14a06: 0xe0008ba3, 0x14a07: 0xe0009117, + 0x14a08: 0xe0009d1c, 0x14a09: 0xe0005ed7, + 0x14a0c: 0xe0008ed2, 0x14a0d: 0xe00049e3, 0x14a0e: 0xe0006c2e, 0x14a0f: 0xe00069c7, + 0x14a11: 0xe0008a7f, 0x14a13: 0xe0007bab, + 0x14a14: 0xe0008ed5, 0x14a16: 0xe0005d53, + 0x14a19: 0xe0007b41, + 0x14a1c: 0xe0006caa, 0x14a1e: 0xe0009fa3, + 0x14a23: 0xe000805c, + 0x14a26: 0xe0006a35, 0x14a27: 0xe0006106, + 0x14a2a: 0xe0008368, + 0x14a30: 0xe0006b96, 0x14a32: 0xe0005a4a, + 0x14a38: 0xe0009d1f, 0x14a39: 0xe000653a, + 0x14a3d: 0xe0008c3f, + // Block 0x529, offset 0x14a40 + 0x14a42: 0xe00058de, + 0x14a44: 0xe0007707, 0x14a46: 0xe000965c, + 0x14a48: 0xe00059ce, 0x14a49: 0xe0007740, + 0x14a4c: 0xe000664a, + 0x14a51: 0xe000960e, + 0x14a56: 0xe0008ba7, + 0x14a5a: 0xe0008bff, 0x14a5b: 0xe0008a1b, + 0x14a5c: 0xe0008bab, 0x14a5d: 0xe000951e, 0x14a5e: 0xe000694f, + 0x14a60: 0xe0004857, 0x14a61: 0xe00061b2, 0x14a62: 0xe0005f56, + 0x14a66: 0xe0008a1f, + 0x14a68: 0xe0007ad5, 0x14a69: 0xe000a217, + 0x14a6d: 0xe00084b4, + 0x14a73: 0xe0004f45, + 0x14a74: 0xe000a506, 0x14a75: 0xe0005280, 0x14a77: 0xe00084b8, + 0x14a7a: 0xe0005e41, + 0x14a7c: 0xe0005350, + // Block 0x52a, offset 0x14a80 + 0x14a80: 0xe0005543, 0x14a81: 0xe0009f11, + 0x14a84: 0xe0009e60, 0x14a85: 0xe00076e5, + 0x14a8b: 0xe000a38f, + 0x14a8d: 0xe0007611, 0x14a8f: 0xe0004944, + 0x14a98: 0xe00096fb, + 0x14aa0: 0xe0004d1d, 0x14aa3: 0xe0008279, + 0x14aa6: 0xe000982d, + 0x14aa8: 0xe000426a, 0x14aab: 0xe0004d21, + 0x14aac: 0xe00044e2, 0x14aad: 0xe0009d66, + 0x14ab1: 0xe0005546, + 0x14ab4: 0xe00069ca, + 0x14ab8: 0xe0009f63, 0x14ab9: 0xe00049e7, + // Block 0x52b, offset 0x14ac0 + 0x14ac1: 0xe00043ce, 0x14ac3: 0xe0005354, + 0x14ac6: 0xe00094d6, + 0x14acb: 0xe0008171, + 0x14acd: 0xe00068aa, + 0x14ad0: 0xe000432a, 0x14ad3: 0xe000a021, + 0x14ad9: 0xe0008195, + 0x14adc: 0xe0005513, 0x14add: 0xe0004cf9, 0x14ade: 0xe0007cd8, + 0x14ae0: 0xe0009f67, 0x14ae1: 0xe0008198, + 0x14aed: 0xe0004cfc, 0x14aee: 0xe0004cff, + 0x14af1: 0xe0006f2e, 0x14af2: 0xe0008c72, 0x14af3: 0xe0008350, + 0x14af5: 0xe0008060, 0x14af6: 0xe0007037, + 0x14afa: 0xe0007b71, 0x14afb: 0xe0008048, + 0x14aff: 0xe000a1b4, + // Block 0x52c, offset 0x14b00 + 0x14b00: 0xe000a41f, 0x14b01: 0xe000a2b7, 0x14b02: 0xe0008baf, 0x14b03: 0xe00046cb, + 0x14b05: 0xe000a109, 0x14b06: 0xe00072c7, + 0x14b08: 0xe00071cc, 0x14b0a: 0xe0008014, + 0x14b0c: 0xe00070f6, 0x14b0d: 0xe0004e8f, 0x14b0e: 0xe00050fd, 0x14b0f: 0xe000a11d, + 0x14b10: 0xe0007bae, 0x14b11: 0xe0007daf, 0x14b12: 0xe0006312, 0x14b13: 0xe00055a3, + 0x14b16: 0xe0006336, 0x14b17: 0xe0009c89, + 0x14b18: 0xe00059d2, + 0x14b1e: 0xe0007655, + 0x14b21: 0xe000a91e, 0x14b23: 0xe00074cb, + 0x14b26: 0xe000a172, + 0x14b2b: 0xe00067e1, + 0x14b2d: 0xe0005662, 0x14b2e: 0xe000a69b, + 0x14b30: 0xe000a2f3, + 0x14b37: 0xe000769d, + 0x14b38: 0xe00046cf, 0x14b39: 0xe0009c27, 0x14b3b: 0xe0006a0d, + 0x14b3f: 0xe00085f1, + // Block 0x52d, offset 0x14b40 + 0x14b42: 0xe0005b2a, + 0x14b46: 0xe000499d, 0x14b47: 0xe00098e4, + 0x14b48: 0xe000470f, 0x14b4b: 0xe0007404, + 0x14b4c: 0xe0008c42, 0x14b4d: 0xe000775e, 0x14b4e: 0xe00075bd, + 0x14b52: 0xe0007d34, 0x14b53: 0xe0008a23, + 0x14b54: 0xe0007615, + 0x14b58: 0xe00080d8, 0x14b59: 0xe0006cca, 0x14b5a: 0xe000898f, + 0x14b5e: 0xe0005be0, + 0x14b65: 0xe000a422, 0x14b66: 0xe00096fe, 0x14b67: 0xe0004800, + 0x14b6b: 0xe0008993, + 0x14b6f: 0xe000a277, + 0x14b70: 0xe0006a39, 0x14b71: 0xe0005a74, 0x14b73: 0xe0006f56, + 0x14b74: 0xe0004a5b, + // Block 0x52e, offset 0x14b80 + 0x14ba8: 0xe0009ee6, + 0x14bad: 0xe0008aaf, 0x14baf: 0xe0006c12, + 0x14bb1: 0xe0009bad, 0x14bb2: 0xe0005966, + 0x14bb6: 0xe0004d02, + 0x14bba: 0xe000786f, + 0x14bbc: 0xe0007211, 0x14bbf: 0xe0006506, + // Block 0x52f, offset 0x14bc0 + 0x14bc2: 0xe0005b6f, + 0x14bc4: 0xe0009ea1, 0x14bc7: 0xe0009e9e, + 0x14bc9: 0xe0005b72, 0x14bcb: 0xe00074e7, + 0x14bdb: 0xe0006952, + 0x14bdc: 0xe00064aa, 0x14bdf: 0xe000743b, + 0x14be1: 0xe00070c2, 0x14be2: 0xe000508b, + 0x14be6: 0xe0008a27, 0x14be7: 0xe00070c6, + 0x14bea: 0xe0008540, 0x14beb: 0xe000789e, + 0x14bed: 0xe00099c0, 0x14bee: 0xe0008354, 0x14bef: 0xe0006316, + 0x14bf1: 0xe00070ca, + 0x14bf4: 0xe000842d, + 0x14bfb: 0xe000956a, + 0x14bfc: 0xe0006b10, 0x14bfd: 0xe0009e3f, 0x14bfe: 0xe000743f, + // Block 0x530, offset 0x14c00 + 0x14c03: 0xe0004b9a, + 0x14c09: 0xe000a1b8, 0x14c0a: 0xe0007847, + 0x14c0c: 0xe0008430, + 0x14c10: 0xe0009275, 0x14c12: 0xe0005249, 0x14c13: 0xe0007567, + 0x14c14: 0xe0009e63, 0x14c15: 0xe0008f5f, + 0x14c18: 0xe0007967, 0x14c1a: 0xe000a701, + 0x14c1e: 0xe0008997, + 0x14c20: 0xe00065e6, + 0x14c26: 0xe0008784, 0x14c27: 0xe000819b, + 0x14c28: 0xe0004a27, 0x14c2a: 0xe000516a, + 0x14c2c: 0xe000a455, 0x14c2e: 0xe000956e, + 0x14c30: 0xe0008a2b, 0x14c31: 0xe000a749, 0x14c33: 0xe0005448, + 0x14c39: 0xe000544c, + 0x14c3c: 0xe000a90b, 0x14c3d: 0xe0004e23, + // Block 0x531, offset 0x14c40 + 0x14c42: 0xe0007cdc, + 0x14c45: 0xe0005dfd, + 0x14c48: 0xe0007214, 0x14c49: 0xe0004f1d, 0x14c4b: 0xe0004dfc, + 0x14c4c: 0xe0009279, 0x14c4d: 0xe0006e5a, + 0x14c50: 0xe00083e8, 0x14c51: 0xe000508e, 0x14c52: 0xe0007e81, + 0x14c54: 0xe0007d10, 0x14c55: 0xe0005549, 0x14c57: 0xe000a1bc, + 0x14c5c: 0xe0007ab1, 0x14c5e: 0xe0009315, + // Block 0x532, offset 0x14c80 + 0x14c96: 0xe00071cf, 0x14c97: 0xe0004e92, + 0x14c98: 0xe0004b34, 0x14c99: 0xe000a1c0, + 0x14c9d: 0xe0009f3f, + 0x14ca3: 0xe00076a1, + 0x14ca5: 0xe000668f, + 0x14ca8: 0xe000a35f, + 0x14cac: 0xe0005d7e, 0x14cad: 0xe000788c, 0x14cae: 0xe0009eea, + 0x14cb0: 0xe00088f3, 0x14cb1: 0xe0009a61, 0x14cb3: 0xe000997c, + 0x14cb4: 0xe00072cb, + 0x14cb9: 0xe0008508, + // Block 0x533, offset 0x14cc0 + 0x14cc1: 0xe000629a, + 0x14cc4: 0xe0009bbf, + 0x14cc8: 0xe0004d05, 0x14cc9: 0xe000471f, + 0x14ccf: 0xe000449b, + 0x14cd0: 0xe0008e96, 0x14cd1: 0xe0005212, 0x14cd2: 0xe0004c6f, + 0x14cd5: 0xe0004146, + 0x14cd8: 0xe0009bc2, 0x14cd9: 0xe0006793, 0x14cdb: 0xe0006b46, + 0x14cdc: 0xe0009f6b, 0x14cdd: 0xe0009a64, 0x14cde: 0xe0009a82, 0x14cdf: 0xe0006b13, + 0x14ce2: 0xe0006586, + 0x14ce8: 0xe00072e7, 0x14cea: 0xe00074cf, + 0x14ced: 0xe000a151, 0x14cee: 0xe00062ae, + 0x14cf1: 0xe0005731, + 0x14cf8: 0xe0009a24, 0x14cfb: 0xe000a03d, + 0x14cfd: 0xe000a2a7, 0x14cff: 0xe0008f2b, + // Block 0x534, offset 0x14d00 + 0x14d01: 0xe0006a51, 0x14d02: 0xe0006fa6, 0x14d03: 0xe0007743, + 0x14d04: 0xe0005ab4, 0x14d05: 0xe0009830, + 0x14d08: 0xe00065ea, 0x14d0b: 0xe0005810, + 0x14d0d: 0xe00049c4, 0x14d0e: 0xe0005091, 0x14d0f: 0xe0005094, + 0x14d11: 0xe00069cd, + 0x14d16: 0xe0006118, + 0x14d18: 0xe0009782, 0x14d19: 0xe0009d6a, 0x14d1b: 0xe00069d0, + 0x14d2b: 0xe00044ca, + 0x14d2d: 0xe0008f97, + 0x14d30: 0xe00056c2, + 0x14d35: 0xe000810c, 0x14d36: 0xe00097ee, 0x14d37: 0xe000703a, + 0x14d38: 0xe0006e96, + 0x14d3e: 0xe0005713, + // Block 0x535, offset 0x14d40 + 0x14d40: 0xe0005ee6, 0x14d41: 0xe0007c86, 0x14d42: 0xe0009319, 0x14d43: 0xe0009ea4, + 0x14d44: 0xe0009786, 0x14d45: 0xe0004c72, + 0x14d4a: 0xe000a518, + 0x14d4c: 0xe000725b, 0x14d4d: 0xe000a6e9, 0x14d4e: 0xe0005d3f, 0x14d4f: 0xe0008670, + 0x14d52: 0xe0009b22, + 0x14d55: 0xe0004b9d, 0x14d57: 0xe000a1fb, + 0x14d58: 0xe0005716, 0x14d5a: 0xe00046d3, 0x14d5b: 0xe000798d, + 0x14d5f: 0xe000990b, + 0x14d62: 0xe0005899, + 0x14d64: 0xe0007873, 0x14d65: 0xe0005097, + 0x14d69: 0xe000a57e, 0x14d6a: 0xe000589c, + // Block 0x536, offset 0x14d80 + 0x14da8: 0xe00048f4, 0x14daa: 0xe000819e, + 0x14db0: 0xe0009c45, + 0x14db8: 0xe000a154, 0x14db9: 0xe0004bd3, + 0x14dbc: 0xe000456b, 0x14dbf: 0xe000658a, + // Block 0x537, offset 0x14dc0 + 0x14dc0: 0xe00069d3, + 0x14dc6: 0xe00062b2, + 0x14dcf: 0xe0005bb6, + 0x14dd1: 0xe0009736, 0x14dd3: 0xe00071d2, + 0x14dd4: 0xe000963e, 0x14dd6: 0xe0004a5f, 0x14dd7: 0xe0005a77, + 0x14dd8: 0xe0004803, + 0x14ddf: 0xe0009ec8, + 0x14de1: 0xe00048e0, 0x14de3: 0xe0006416, + 0x14de5: 0xe0007a85, 0x14de6: 0xe0006037, + 0x14deb: 0xe0009701, + 0x14ded: 0xe00085f4, 0x14dee: 0xe000635e, + 0x14df0: 0xe000965f, 0x14df2: 0xe0009f14, + 0x14df4: 0xe00068ae, + 0x14df9: 0xe000a7fb, 0x14dfa: 0xe0004a87, 0x14dfb: 0xe0004794, + 0x14dfd: 0xe0008e1b, + // Block 0x538, offset 0x14e00 + 0x14e02: 0xe0006a3d, + 0x14e05: 0xe00068d6, 0x14e06: 0xe0007102, + 0x14e0a: 0xe00072eb, 0x14e0b: 0xe0008a2f, + 0x14e0d: 0xe000a458, + 0x14e10: 0xe0005100, 0x14e12: 0xe000913b, + 0x14e16: 0xe0006c02, + 0x14e18: 0xe0005e25, 0x14e19: 0xe000737c, 0x14e1a: 0xe00071d5, + 0x14e1f: 0xe000a5b2, + 0x14e22: 0xe0006a41, 0x14e23: 0xe0005992, + 0x14e27: 0xe0005b4e, + 0x14e28: 0xe000a4db, 0x14e29: 0xe000a227, 0x14e2a: 0xe0009c3c, + 0x14e2e: 0xe0004d08, 0x14e2f: 0xe00093bd, + 0x14e31: 0xe0008068, 0x14e32: 0xe000456f, + 0x14e3a: 0xe0006cce, + 0x14e3c: 0xe0004e32, + // Block 0x539, offset 0x14e40 + 0x14e41: 0xe0004b1c, 0x14e42: 0xe000a47b, 0x14e43: 0xe0006362, + 0x14e44: 0xe0006482, 0x14e45: 0xe0005ebc, + 0x14e48: 0xe0007079, 0x14e4b: 0xe0009833, + 0x14e4d: 0xe0005e91, 0x14e4e: 0xe000586b, 0x14e4f: 0xe0008174, + 0x14e51: 0xe0005ce9, + 0x14e54: 0xe0005d81, + 0x14e58: 0xe0007ab5, 0x14e5a: 0xe000788f, + 0x14e66: 0xe0006b49, + 0x14e6f: 0xe0005a4d, + 0x14e74: 0xe000641a, + // Block 0x53a, offset 0x14e80 + 0x14e80: 0xe0009a85, 0x14e83: 0xe0009dc6, + 0x14e8e: 0xe0008a83, + 0x14e91: 0xe0009e42, 0x14e92: 0xe00067e4, 0x14e93: 0xe00085f7, + 0x14e97: 0xe0005643, + 0x14e9f: 0xe0007619, + 0x14ea7: 0xe0008c75, + 0x14ea8: 0xe0009071, 0x14eaa: 0xe000827c, 0x14eab: 0xe0004ba0, + 0x14ead: 0xe000a175, 0x14eae: 0xe0006e5e, + 0x14eb9: 0xe000707c, + // Block 0x53b, offset 0x14ec0 + 0x14ec1: 0xe0004723, + 0x14ec6: 0xe0009e66, + 0x14ec9: 0xe0005cc2, 0x14eca: 0xe0006b4c, + 0x14ed4: 0xe00099ac, 0x14ed6: 0xe0009612, + 0x14edb: 0xe0008d62, + 0x14ee2: 0xe0007be1, + 0x14ee4: 0xe00048b4, + 0x14ee8: 0xe00046d7, + 0x14ef7: 0xe0008c78, + // Block 0x53c, offset 0x14f00 + 0x14f08: 0xe0008ad7, 0x14f0a: 0xe000593e, + 0x14f0c: 0xe0009836, 0x14f0d: 0xe00097f1, + 0x14f10: 0xe00075c1, 0x14f12: 0xe0006693, 0x14f13: 0xe0006cdb, + 0x14f15: 0xe0009fa6, + 0x14f24: 0xe0006b4f, 0x14f25: 0xe000a582, + 0x14f2d: 0xe0005103, 0x14f2e: 0xe0007ce0, 0x14f2f: 0xe00077e3, + 0x14f31: 0xe0005942, 0x14f32: 0xe0007c3b, + 0x14f35: 0xe0006236, + 0x14f39: 0xe00045c3, 0x14f3a: 0xe000707f, 0x14f3b: 0xe0005e01, + 0x14f3e: 0xe0009ecb, + // Block 0x53d, offset 0x14f40 + 0x14f47: 0xe000438a, + 0x14f49: 0xe000659a, + 0x14f4f: 0xe0007523, + 0x14f52: 0xe0008f63, 0x14f53: 0xe0006e9a, + 0x14f57: 0xe0005d0b, + 0x14f60: 0xe000a69e, 0x14f63: 0xe0008a33, + 0x14f67: 0xe0005a20, + 0x14f78: 0xe0005a7a, 0x14f7b: 0xe0006e9e, + // Block 0x53e, offset 0x14f80 + 0x14fa5: 0xe0008d02, 0x14fa6: 0xe000833c, 0x14fa7: 0xe0006796, + 0x14fa9: 0xe0004c75, + 0x14fb3: 0xe00066ff, + 0x14fb4: 0xe0005fba, 0x14fb6: 0xe0007a11, + // Block 0x53f, offset 0x14fc0 + 0x14fc3: 0xe0004573, + 0x14fc6: 0xe0009197, 0x14fc7: 0xe000664d, + 0x14fc8: 0xe0007629, 0x14fc9: 0xe000756a, + 0x14fcc: 0xe0006717, + 0x14fd2: 0xe0005a06, + 0x14fd5: 0xe0009a88, + 0x14fd8: 0xe000658e, 0x14fd9: 0xe00099af, 0x14fdb: 0xe00080dc, + 0x14fdf: 0xe00099b2, + 0x14fe3: 0xe000485a, + 0x14fe6: 0xe00076d1, + 0x14fe8: 0xe00076b5, + 0x14ff0: 0xe0004a8b, + 0x14ff6: 0xe0007659, + 0x14ffb: 0xe000a4c7, + // Block 0x540, offset 0x15000 + 0x15001: 0xe0004bd6, 0x15002: 0xe000a7fe, + 0x15004: 0xe00099b5, + 0x15011: 0xe000459f, 0x15013: 0xe0006376, + 0x15014: 0xe0008f67, + 0x1501d: 0xe000756d, 0x1501e: 0xe000758e, + 0x15020: 0xe0004878, 0x15021: 0xe0006109, + 0x15029: 0xe00066b7, + 0x1502c: 0xe00068ca, 0x1502f: 0xe0009f6f, + 0x15030: 0xe0008d65, 0x15032: 0xe0008630, + 0x15037: 0xe0008110, + 0x1503b: 0xe0009839, + 0x1503e: 0xe00048e4, + // Block 0x541, offset 0x15040 + 0x15044: 0xe0009622, + 0x15049: 0xe00072ef, + 0x15056: 0xe000983c, + 0x1505a: 0xe00075ed, + 0x15061: 0xe0004282, + 0x15064: 0xe00048e8, + 0x15069: 0xe0006052, + 0x1506c: 0xe00093c1, 0x1506f: 0xe000777a, + 0x15074: 0xe0009fd1, 0x15075: 0xe000983f, + 0x15078: 0xe00077e7, 0x15079: 0xe0005bef, 0x1507b: 0xe0004904, + 0x1507f: 0xe00085fa, + // Block 0x542, offset 0x15080 + 0x15081: 0xe0008474, 0x15082: 0xe0007eb1, + 0x15084: 0xe0004770, 0x15087: 0xe0004d0b, + 0x15093: 0xe00085fd, + 0x15096: 0xe0007be4, 0x15097: 0xe0004c78, + 0x15099: 0xe0009074, + 0x150a6: 0xe0009704, + 0x150a9: 0xe00065a6, 0x150aa: 0xe000778e, 0x150ab: 0xe000725f, + 0x150b0: 0xe0007a4d, 0x150b1: 0xe000485d, 0x150b2: 0xe000990e, 0x150b3: 0xe000a041, + 0x150b8: 0xe000a809, 0x150b9: 0xe0008390, 0x150ba: 0xe0005a50, + 0x150bd: 0xe0009fe9, 0x150bf: 0xe000654e, + // Block 0x543, offset 0x150c0 + 0x150c7: 0xe0008a37, + 0x150cf: 0xe0006096, + 0x150d5: 0xe0005a7d, + 0x150da: 0xe000777e, 0x150db: 0xe0004a63, + 0x150dc: 0xe0004d0e, 0x150de: 0xe0005759, + // Block 0x544, offset 0x15100 + 0x15135: 0xe0005a53, 0x15137: 0xe0005a0a, + 0x15139: 0xe000a081, 0x1513b: 0xe000430e, + 0x1513d: 0xe0007a89, 0x1513f: 0xe0005a94, + // Block 0x545, offset 0x15140 + 0x15140: 0xe0007feb, 0x15142: 0xe0004e26, + 0x15144: 0xe0009842, + 0x1514b: 0xe00061df, + 0x1514c: 0xe0007fee, 0x1514f: 0xe0004eb1, + 0x15151: 0xe0007be7, 0x15152: 0xe000509a, 0x15153: 0xe0005a98, + 0x15157: 0xe000589f, + 0x1515d: 0xe0006b16, 0x1515e: 0xe0008788, 0x1515f: 0xe0005d0f, + 0x15164: 0xe0009845, 0x15165: 0xe0005eea, + 0x15169: 0xe00067e7, 0x1516a: 0xe0005f6e, + 0x1516f: 0xe0004d35, + 0x15174: 0xe0004d25, 0x15175: 0xe0005f5a, + 0x1517b: 0xe0005d84, + 0x1517d: 0xe0005d93, 0x1517e: 0xe000a7da, 0x1517f: 0xe0005d96, + // Block 0x546, offset 0x15180 + 0x15183: 0xe000a62a, + 0x15185: 0xe0004f8d, + 0x1518c: 0xe000a6c1, 0x1518d: 0xe0006d66, 0x1518e: 0xe00058a2, 0x1518f: 0xe0008ab3, + 0x15190: 0xe0005cec, 0x15191: 0xe000a82d, + 0x15194: 0xe000451a, 0x15196: 0xe0005106, + 0x15198: 0xe000611f, 0x1519a: 0xe000461f, 0x1519b: 0xe000547d, + 0x1519c: 0xe00098a0, 0x1519d: 0xe000827f, 0x1519e: 0xe0008a87, + 0x151a0: 0xe000a922, + 0x151a5: 0xe0004727, + 0x151a8: 0xe0005408, + 0x151ae: 0xe00053c4, 0x151af: 0xe00076a5, + 0x151b2: 0xe000931d, + 0x151b4: 0xe00061b5, 0x151b5: 0xe00053c8, 0x151b6: 0xe0007ab9, 0x151b7: 0xe000557b, + 0x151ba: 0xe000687e, 0x151bb: 0xe00068b2, + 0x151bc: 0xe0006650, 0x151bd: 0xe000623a, 0x151bf: 0xe0008114, + // Block 0x547, offset 0x151c0 + 0x151c0: 0xe0009888, 0x151c2: 0xe0008d68, + 0x151c4: 0xe0008ed8, 0x151c7: 0xe0007c3e, + 0x151c8: 0xe000659e, 0x151c9: 0xe0009a8b, 0x151ca: 0xe0006552, + 0x151ce: 0xe0008bb3, + 0x151d0: 0xe00051c1, 0x151d3: 0xe0004806, + 0x151d7: 0xe000554c, + 0x151d9: 0xe00069d6, + 0x151e0: 0xe0006d69, 0x151e2: 0xe0006882, + 0x151eb: 0xe0006dde, + 0x151ec: 0xe0008282, 0x151ef: 0xe0007c89, + 0x151f4: 0xe00078e5, + 0x151f8: 0xe0004623, 0x151f9: 0xe00078e9, 0x151fb: 0xe0006955, + 0x151fe: 0xe000a045, + // Block 0x548, offset 0x15200 + 0x1520a: 0xe0008c45, 0x1520b: 0xe00087b9, + 0x1520e: 0xe00087bc, + 0x15212: 0xe000997f, + 0x15214: 0xe00099d8, 0x15215: 0xe000a879, 0x15217: 0xe0008334, + 0x1521f: 0xe0008842, + 0x15220: 0xe0009707, 0x15221: 0xe00059d6, + 0x15226: 0xe0004242, 0x15227: 0xe0006ed2, + 0x15229: 0xe0004bd9, 0x1522a: 0xe0009231, 0x1522b: 0xe00048ec, + 0x1522c: 0xe0007892, + 0x15232: 0xe0007ff1, + 0x15236: 0xe00075f1, 0x15237: 0xe00075c5, + // Block 0x549, offset 0x15240 + 0x1524d: 0xe0005b75, 0x1524e: 0xe0005af0, + 0x15250: 0xe00063e6, 0x15252: 0xe0005b79, + 0x15254: 0xe0004974, 0x15255: 0xe00042d2, + 0x1525c: 0xe0004c7b, 0x1525d: 0xe0009812, + 0x15260: 0xe00077eb, 0x15262: 0xe000a51b, + 0x15265: 0xe0008285, + // Block 0x54a, offset 0x15280 + 0x15280: 0xe000507f, 0x15281: 0xe000466f, 0x15282: 0xe00091fb, 0x15283: 0xe000413a, + 0x15284: 0xe000a5ba, 0x15285: 0xe0004978, 0x15286: 0xe0004bf7, 0x15287: 0xe0004c7b, + 0x15288: 0xe0004c7b, 0x15289: 0xe0004734, 0x1528a: 0xe0005125, 0x1528b: 0xe00056e6, + 0x1528c: 0xe00051ac, 0x1528d: 0xe00056e9, 0x1528e: 0xe00056ec, 0x1528f: 0xe00056ef, + 0x15290: 0xe00056f2, 0x15291: 0xe00056f5, 0x15292: 0xe00056f8, 0x15293: 0xe00056fb, + 0x15294: 0xe00075ad, 0x15295: 0xe0005719, 0x15296: 0xe000571d, 0x15297: 0xe0005721, + 0x15298: 0xe0005729, 0x15299: 0xe000572d, 0x1529a: 0xe0005731, 0x1529b: 0xe000573d, + 0x1529c: 0xe0005741, 0x1529d: 0xe0005745, 0x1529e: 0xe0005751, 0x1529f: 0xe0005755, + 0x152a0: 0xe0005759, 0x152a1: 0xe0005789, 0x152a2: 0xe0005799, 0x152a3: 0xe00057a5, + 0x152a4: 0xe00057a9, 0x152a5: 0xe00057b9, 0x152a6: 0xe00057bd, 0x152a7: 0xe00057c1, + 0x152a8: 0xe00057c9, 0x152a9: 0xe00057cd, 0x152aa: 0xe00057d1, 0x152ab: 0xe00057d5, + 0x152ac: 0x43219c20, 0x152ad: 0xe0005801, 0x152ae: 0xe0005813, 0x152af: 0xe0005a23, + 0x152b0: 0xe0005a29, 0x152b1: 0xe0005a2c, 0x152b2: 0xe0005a35, 0x152b3: 0xe0005a38, + 0x152b4: 0xe0005a3b, 0x152b5: 0xe0005a3e, 0x152b6: 0xe0005a41, 0x152b7: 0xe0005a44, + 0x152b8: 0xe0005a4a, 0x152b9: 0xe0005a4d, 0x152ba: 0xe0005a50, 0x152bb: 0xe0005a80, + 0x152bc: 0xe0005a84, 0x152bd: 0xe0005a88, 0x152be: 0xe0005a8c, 0x152bf: 0xe0005a90, + // Block 0x54b, offset 0x152c0 + 0x152c0: 0xe0005a94, 0x152c1: 0xe0005ab8, 0x152c2: 0xe0005abc, 0x152c3: 0xe0005ac0, + 0x152c4: 0xe0005ad0, 0x152c5: 0xe0005ad4, 0x152c6: 0xe0005afa, 0x152c7: 0xe0005afd, + 0x152c8: 0xe0005b00, 0x152c9: 0xe0005b09, 0x152ca: 0xe0005b7d, 0x152cb: 0xe0005b83, + 0x152cc: 0xe0005b86, 0x152cd: 0xe0005b89, 0x152ce: 0xe0005b8c, 0x152cf: 0xe0005b92, + 0x152d0: 0xe0005b95, 0x152d1: 0xe0005ba1, 0x152d2: 0xe0005c3e, 0x152d3: 0xe0005c42, + 0x152d4: 0xe0005c4a, 0x152d5: 0xe0005c5a, 0x152d6: 0xe0005c62, 0x152d7: 0xe0005c66, + 0x152d8: 0xe0005c6a, 0x152d9: 0xe0005c6e, 0x152da: 0xe0005573, 0x152db: 0xe0005136, + 0x152dc: 0xe00075ad, 0x152dd: 0xe000514e, 0x152de: 0xe00052bc, 0x152df: 0xe00051eb, + 0x152e0: 0xe000520c, 0x152e1: 0xe00070ce, 0x152e2: 0xe000840c, 0x152e3: 0xe00067ea, + 0x152e4: 0xe00062fa, 0x152e5: 0xe0009d46, 0x152e6: 0xe0006667, 0x152e7: 0xe000671b, + 0x152e8: 0xe0009f27, 0x152e9: 0xe0007154, 0x152ea: 0xe0006ce6, 0x152eb: 0xe00092bd, + 0x152ec: 0xe0006cd2, 0x152ed: 0xe0006f86, 0x152ee: 0xe0007ac5, 0x152ef: 0xe0006eca, + 0x152f0: 0xe0006bd2, 0x152f1: 0xe0009103, 0x152f2: 0xe00099f4, 0x152f3: 0xe0007334, + 0x152f4: 0xe00077bb, 0x152f5: 0xe0005817, 0x152f6: 0xe000581b, 0x152f7: 0xe0005823, + 0x152f8: 0xe000582b, 0x152f9: 0xe000582f, 0x152fa: 0xe0005833, 0x152fb: 0xe0005843, + 0x152fc: 0xe0005847, 0x152fd: 0xe000584b, 0x152fe: 0xe0005853, 0x152ff: 0xe0005875, + // Block 0x54c, offset 0x15300 + 0x15300: 0xe0005878, 0x15301: 0xe00051c4, 0x15302: 0xe000587b, 0x15303: 0xe0005884, + 0x15304: 0xe000588a, 0x15305: 0xe000588d, 0x15306: 0xe0005896, 0x15307: 0xe000589c, + 0x15308: 0xe000589f, 0x15309: 0xe00058a2, 0x1530a: 0xe00058c6, 0x1530b: 0xe00058ca, + 0x1530c: 0xe00058ce, 0x1530d: 0xe00058da, 0x1530e: 0xe00051cb, 0x1530f: 0xe00058fa, + 0x15310: 0xe00058fe, 0x15311: 0xe00051cf, 0x15312: 0xe0005906, 0x15313: 0xe000590a, + 0x15314: 0xe000590e, 0x15315: 0xe00051d3, 0x15316: 0xe0005912, 0x15317: 0xe0005916, + 0x15318: 0xe000591e, 0x15319: 0xe000591a, 0x1531a: 0xe0005922, 0x1531b: 0xe0005926, + 0x1531c: 0xe000594a, 0x1531d: 0xe000594e, 0x1531e: 0xe0008488, 0x1531f: 0xe0005956, + 0x15320: 0xe000595a, 0x15321: 0xe0006eca, 0x15322: 0xe000596a, 0x15323: 0xe00051db, + 0x15324: 0xe00051e7, 0x15325: 0xe0005972, 0x15326: 0xe000597a, 0x15327: 0xe000598a, + 0x15328: 0xe0005996, 0x15329: 0xe000599e, 0x1532a: 0xe00051eb, 0x1532b: 0xe00059a6, + 0x1532c: 0xe00059aa, 0x1532d: 0xe00059ae, 0x1532e: 0xe000a343, 0x1532f: 0xe00059b6, + 0x15330: 0xe00059be, 0x15331: 0xe00059c6, 0x15332: 0xe00059ca, 0x15333: 0xe00059ce, + 0x15334: 0xe00059d2, 0x15335: 0xe0005a0e, 0x15336: 0xe0005a14, 0x15337: 0xe0005a17, + 0x15338: 0xe0005a1d, 0x15339: 0xe00075a1, 0x1533a: 0xe0005b2d, 0x1533b: 0xe0005b30, + 0x1533c: 0xe0005b33, 0x1533d: 0xe000524c, 0x1533e: 0xe0005b39, 0x1533f: 0xe00075ad, + // Block 0x54d, offset 0x15340 + 0x15340: 0xe0005b3c, 0x15341: 0xe0005b3f, 0x15342: 0xe0005b48, 0x15343: 0xe0005b4b, + 0x15344: 0xe0005b75, 0x15345: 0xe000a770, 0x15346: 0xe0007dab, 0x15347: 0xe0005bb9, + 0x15348: 0xe0005277, 0x15349: 0xe0005bbf, 0x1534a: 0xe0005bc5, 0x1534b: 0xe0005bc8, + 0x1534c: 0xe0005bce, 0x1534d: 0xe0005bd4, 0x1534e: 0xe0005bda, 0x1534f: 0xe000527a, + 0x15350: 0xe0005be0, 0x15351: 0xe0005bf2, 0x15352: 0xe0005bf6, 0x15353: 0xe0005bfa, + 0x15354: 0xe0005c06, 0x15355: 0xe0005c0a, 0x15356: 0xe0005c0e, 0x15357: 0xe0005c16, + 0x15358: 0xe0005c1e, 0x15359: 0xe0005c22, 0x1535a: 0xe0005c26, 0x1535b: 0xe00070ce, + 0x1535c: 0xe0005c32, 0x1535d: 0xe0005c7d, 0x1535e: 0xe0005c83, 0x1535f: 0xe0005c89, + 0x15360: 0xe0007979, 0x15361: 0xe0005c8f, 0x15362: 0xe0005c92, 0x15363: 0xe000528e, + 0x15364: 0xe0005c9e, 0x15365: 0xe0005ca4, 0x15366: 0xe0005caa, 0x15367: 0xe0005cb3, + 0x15368: 0xe0005cb6, 0x15369: 0xe0005cb9, 0x1536a: 0xe0005cbf, 0x1536b: 0xe00052a3, + 0x1536c: 0xe00052a7, 0x1536d: 0xe0005cef, 0x1536e: 0xe0005cf7, 0x1536f: 0xe0005cfb, + 0x15370: 0xe0005cff, 0x15371: 0xe0005d07, 0x15372: 0xe0005d0b, 0x15373: 0xe0005d0f, + 0x15374: 0xe0005d43, 0x15375: 0xe0005d47, 0x15376: 0xe0005d4f, 0x15377: 0xe0005d5f, + 0x15378: 0xe0005d63, 0x15379: 0xe0005d67, 0x1537a: 0xe0006c82, 0x1537b: 0xe0008585, + 0x1537c: 0xe0007433, 0x1537d: 0xe0007527, 0x1537e: 0xe00052b6, 0x1537f: 0xe0008567, + // Block 0x54e, offset 0x15380 + 0x15380: 0xe0008a3b, 0x15381: 0xe00054bc, 0x15382: 0xe0009446, 0x15383: 0xe0005400, + 0x15384: 0xe0005492, 0x15385: 0xe00055e7, 0x15386: 0xe0009e6d, 0x15387: 0xe000668b, + 0x15388: 0xe000a198, 0x15389: 0xe0004386, 0x1538a: 0xe0004593, 0x1538b: 0xe00049c7, + 0x1538c: 0xe0007ce4, 0x1538d: 0x42ab8020, 0x1538e: 0x43f41c20, 0x1538f: 0x43f41e20, + 0x15390: 0xe0009752, 0x15391: 0x43f42220, 0x15392: 0xe00095fa, 0x15393: 0x43f42620, + 0x15394: 0x43f42820, 0x15395: 0xe000a8b4, 0x15396: 0xe0008818, 0x15397: 0xe0008458, + 0x15398: 0x42f27820, 0x15399: 0xe000747b, 0x1539a: 0xe0006c8a, 0x1539b: 0xe000666f, + 0x1539c: 0xe0008ba7, 0x1539d: 0xe0008b73, 0x1539e: 0xe0007f97, 0x1539f: 0x43f43e20, + 0x153a0: 0x430c2420, 0x153a1: 0x43f44220, 0x153a2: 0xe0008c30, 0x153a3: 0x43f44620, + 0x153a4: 0x43f44820, 0x153a5: 0xe0008500, 0x153a6: 0xe000550a, 0x153a7: 0x43f44e20, + 0x153a8: 0x43f45020, 0x153a9: 0x43f45220, 0x153aa: 0xe0006316, 0x153ab: 0xe0006b10, + 0x153ac: 0xe0004a27, 0x153ad: 0xe0009fd1, 0x153ae: 0xe00057e5, 0x153af: 0xe0005a1a, + 0x153b0: 0xe0005fc5, 0x153b1: 0xe0007358, 0x153b2: 0xe0005f32, 0x153b3: 0xe0005f3a, + 0x153b4: 0xe0004eed, 0x153b5: 0xe00068e6, 0x153b6: 0xe000424a, 0x153b7: 0xe0009aee, + 0x153b8: 0xe0004fec, 0x153b9: 0xe00065f2, 0x153ba: 0xe000611b, 0x153bb: 0xe0009936, + 0x153bc: 0x42b8dc20, 0x153bd: 0xe000a659, 0x153be: 0xe00043e7, 0x153bf: 0xe0008fb3, + // Block 0x54f, offset 0x153c0 + 0x153c0: 0xe00091bf, 0x153c1: 0xe00061f2, 0x153c2: 0x42cbc420, 0x153c3: 0xe0006d30, + 0x153c4: 0xe0005ea7, 0x153c5: 0xe000a13c, 0x153c6: 0xe0008812, 0x153c7: 0xe000a001, + 0x153c8: 0xe0008588, 0x153c9: 0x42e45620, 0x153ca: 0xe0009ab6, 0x153cb: 0xe000691f, + 0x153cc: 0xe0006ad4, 0x153cd: 0xe0009023, 0x153ce: 0xe000505e, 0x153cf: 0xe0007f8b, + 0x153d0: 0xe0008cc3, 0x153d1: 0xe0009850, 0x153d2: 0xe000a4f1, 0x153d3: 0xe0008b67, + 0x153d4: 0xe0004870, 0x153d5: 0xe00055b7, 0x153d6: 0xe0008a53, 0x153d7: 0xe0005912, + 0x153d8: 0xe00090e3, 0x153d9: 0xe000649e, 0x153da: 0xe0006d4e, 0x153db: 0xe000859a, + 0x153dc: 0xe0009902, 0x153dd: 0x4304f220, 0x153de: 0x4304f220, 0x153df: 0xe000882a, + 0x153e0: 0xe0004262, 0x153e1: 0xe00073c2, 0x153e2: 0xe0007631, 0x153e3: 0xe0004f15, + 0x153e4: 0xe0006a09, 0x153e5: 0xe0008fd7, 0x153e6: 0x431f6c20, 0x153e7: 0xe0008500, + 0x153e8: 0xe000515a, 0x153e9: 0xe000a1b4, 0x153ea: 0xe0006a0d, 0x153eb: 0x42c0ea20, + 0x153ec: 0x4885dc20, 0x153ed: 0x43043020, + 0x153f0: 0xe00065ee, 0x153f1: 0x42a36a20, 0x153f2: 0xe0008903, 0x153f3: 0x429f0020, + 0x153f4: 0xe00098a8, 0x153f5: 0xe0004fe6, 0x153f6: 0xe0007ee0, 0x153f7: 0xe0008604, + 0x153f8: 0xe000424a, 0x153f9: 0x42aaaa20, 0x153fa: 0xe000a7b3, 0x153fb: 0xe0007ce8, + 0x153fc: 0xe0009752, 0x153fd: 0xe00067fa, 0x153fe: 0xe0007905, 0x153ff: 0xe00067fe, + // Block 0x550, offset 0x15400 + 0x15400: 0xe00068ec, 0x15401: 0xe00085b5, 0x15402: 0x42bda420, 0x15403: 0x42bdb220, + 0x15404: 0xe00093d1, 0x15405: 0xe0007e96, 0x15406: 0xe0005e7d, 0x15407: 0x42c29c20, + 0x15408: 0xe00081c8, 0x15409: 0xe0008fb3, 0x1540a: 0xe0007c5c, 0x1540b: 0xe00091bf, + 0x1540c: 0xe0005468, 0x1540d: 0xe00081ce, 0x1540e: 0xe000714e, 0x1540f: 0x42c8a420, + 0x15410: 0xe0007c17, 0x15411: 0xe00095fa, 0x15412: 0xe00057cd, 0x15413: 0xe0005e5d, + 0x15414: 0xe00086e4, 0x15415: 0x42d6f220, 0x15416: 0xe0006bd2, 0x15417: 0xe0005bc5, + 0x15418: 0x42ddb620, 0x15419: 0xe0008582, 0x1541a: 0xe000a001, 0x1541b: 0xe0008b4b, + 0x1541c: 0xe0008588, 0x1541d: 0x42ef4e20, 0x1541e: 0xe000861c, 0x1541f: 0xe00064f2, + 0x15420: 0xe0008818, 0x15421: 0xe00089cf, 0x15422: 0x42ea0c20, 0x15423: 0x42ea7620, + 0x15424: 0x42ec3a20, 0x15425: 0xe0007ca8, 0x15426: 0xe0008458, 0x15427: 0xe0006f82, + 0x15428: 0xe0009077, 0x15429: 0x42ee9420, 0x1542a: 0xe0009221, 0x1542b: 0x42f19820, + 0x1542c: 0x42f56220, 0x1542d: 0xe0008a53, 0x1542e: 0x42f8f620, 0x1542f: 0xe0008d41, + 0x15430: 0xe0005912, 0x15431: 0xe00065fa, 0x15432: 0xe000859a, 0x15433: 0xe000a61a, + 0x15434: 0xe000a4fa, 0x15435: 0x430ef220, 0x15436: 0xe000437a, 0x15437: 0xe0006683, + 0x15438: 0xe00073c2, 0x15439: 0xe0008cea, 0x1543a: 0xe0008c30, 0x1543b: 0xe000960a, + 0x1543c: 0xe0007631, 0x1543d: 0xe000514e, 0x1543e: 0xe0008210, 0x1543f: 0xe0004f15, + // Block 0x551, offset 0x15440 + 0x15440: 0xe000655e, 0x15441: 0xe0008fd7, 0x15442: 0xe00071ab, 0x15443: 0xe0009047, + 0x15444: 0x43233220, 0x15445: 0x4324ec20, 0x15446: 0xe0008878, 0x15447: 0xe000515a, + 0x15448: 0xe0008ba7, 0x15449: 0x432fb620, 0x1544a: 0xe000a1b4, 0x1544b: 0x43301620, + 0x1544c: 0xe0006a0d, 0x1544d: 0xe000913b, 0x1544e: 0xe0004c7b, 0x1544f: 0x48509420, + 0x15450: 0x48508820, 0x15451: 0x4867aa20, 0x15452: 0x44773a20, 0x15453: 0x44803020, + 0x15454: 0x44807220, 0x15455: 0x48a49220, 0x15456: 0x48b9a020, 0x15457: 0x48fda620, + 0x15458: 0x433e8620, 0x15459: 0xe0005af0, + // Block 0x552, offset 0x15480 + 0x15480: 0xe0003c9d, 0x15481: 0xe0003c85, 0x15482: 0xe0003c89, 0x15483: 0xe0003c91, + 0x15484: 0xe0003ca1, 0x15485: 0xe0003c95, 0x15486: 0xf0000404, 0x15487: 0xe0003c8d, + 0x15488: 0xe0003c99, + 0x15490: 0x02bf2e86, 0x15491: 0x02a7de86, + // Block 0x553, offset 0x154c0 + 0x154c0: 0x429c7a20, 0x154c1: 0xe000a542, 0x154c2: 0x429c8220, 0x154c3: 0x48024420, + 0x154c4: 0x429ec020, 0x154c5: 0xe0005fc5, 0x154c6: 0xe0009b2e, 0x154c7: 0xe00065ae, + 0x154c8: 0x42a0f420, 0x154c9: 0xe00068dd, 0x154ca: 0xe0007358, 0x154cb: 0xe0006c3a, + 0x154cc: 0x44693c20, 0x154cd: 0x480c7420, 0x154ce: 0xe0005f32, 0x154cf: 0x42a2a820, + 0x154d0: 0x42a2c820, 0x154d1: 0xe0004beb, 0x154d2: 0x480a3820, 0x154d3: 0x44697220, + 0x154d4: 0xe00051a9, 0x154d5: 0xe000878c, 0x154d6: 0x480a9620, 0x154d7: 0xe0007edc, + 0x154d8: 0xe00080e0, 0x154d9: 0x429d9820, 0x154da: 0xe00055c7, 0x154db: 0x42a36a20, + 0x154dc: 0x4923be20, 0x154dd: 0x42a3ea20, 0x154de: 0xe0008480, 0x154df: 0x4469be20, + 0x154e0: 0xe0004176, 0x154e1: 0x42a48c20, 0x154e2: 0xe000a049, 0x154e3: 0xe0006b9a, + 0x154e4: 0x446a2a20, 0x154e5: 0xe0007ee0, 0x154e6: 0xe0005f3a, 0x154e7: 0xe0004eed, + 0x154e8: 0xe0008604, 0x154e9: 0xe0009df7, 0x154ea: 0x42a60c20, 0x154eb: 0xe00067ea, + 0x154ec: 0xe000a7b0, 0x154ed: 0xe00068e6, 0x154ee: 0xe0006256, 0x154ef: 0xe0008f8b, + 0x154f0: 0xe0008f87, 0x154f1: 0xe0004643, 0x154f2: 0xe0004643, 0x154f3: 0xe0004643, + 0x154f4: 0x48145820, 0x154f5: 0xe000a66e, 0x154f6: 0xe0004f95, 0x154f7: 0xe00071d8, + 0x154f8: 0x4816c620, 0x154f9: 0xe0004e35, 0x154fa: 0xe0009143, 0x154fb: 0x42a80c20, + 0x154fc: 0x42a93c20, 0x154fd: 0xe000a88d, 0x154fe: 0xe0008aef, 0x154ff: 0xe0008e36, + // Block 0x554, offset 0x15500 + 0x15500: 0xe00075d1, 0x15501: 0x42a9ec20, 0x15502: 0xe00053e0, 0x15503: 0xe000472e, + 0x15504: 0xe000a061, 0x15505: 0xe0006dee, 0x15506: 0xe0006dee, 0x15507: 0xe000a7b3, + 0x15508: 0xe0005129, 0x15509: 0x42ab6620, 0x1550a: 0x42ab8420, 0x1550b: 0xe00054a7, + 0x1550c: 0xe0009aee, 0x1550d: 0x42ae2e20, 0x1550e: 0x42aca220, 0x1550f: 0xe00067f6, + 0x15510: 0xe0008a3b, 0x15511: 0x42b1dc20, 0x15512: 0xe0006f5a, 0x15513: 0xe0007407, + 0x15514: 0x42b01a20, 0x15515: 0xe000a31f, 0x15516: 0x42b06420, 0x15517: 0xe0006614, + 0x15518: 0x42b15820, 0x15519: 0x4829c820, 0x1551a: 0x42b1e420, 0x1551b: 0x42b1ee20, + 0x1551c: 0xe0006707, 0x1551d: 0xe00052b3, 0x1551e: 0xe0006066, 0x1551f: 0xe0006a92, + 0x15520: 0x482d5020, 0x15521: 0x482dd420, 0x15522: 0xe000a8c0, 0x15523: 0xe0007c0b, + 0x15524: 0xe0009bb3, 0x15525: 0x42b3b020, 0x15526: 0xe0006739, 0x15527: 0x446ddc20, + 0x15528: 0x446df820, 0x15529: 0xe0007e90, 0x1552a: 0xe000575d, 0x1552b: 0xe000575d, + 0x1552c: 0x48339020, 0x1552d: 0xe0008098, 0x1552e: 0xe0009988, 0x1552f: 0xe00051eb, + 0x15530: 0x42b7e620, 0x15531: 0x48363020, 0x15532: 0x42b7fe20, 0x15533: 0x42b80c20, + 0x15534: 0x42bea620, 0x15535: 0x42b84420, 0x15536: 0x446f0220, 0x15537: 0xe00054b3, + 0x15538: 0x42b8dc20, 0x15539: 0xe000713c, 0x1553a: 0x42b91a20, 0x1553b: 0x483bc820, + 0x1553c: 0x42ba8620, 0x1553d: 0x483bcc20, 0x1553e: 0x42badc20, 0x1553f: 0x42bad620, + // Block 0x555, offset 0x15540 + 0x15540: 0x42baf820, 0x15541: 0xe0007263, 0x15542: 0xe0006fe0, 0x15543: 0x44705e20, + 0x15544: 0xe00070b2, 0x15545: 0xe0006fc2, 0x15546: 0xe0005fd1, 0x15547: 0x42bcd220, + 0x15548: 0x4470c420, 0x15549: 0x48430620, 0x1554a: 0x4470f820, 0x1554b: 0x42bd6020, + 0x1554c: 0xe000696d, 0x1554d: 0xe0006d1e, 0x1554e: 0xe00057c9, 0x1554f: 0x49472420, + 0x15550: 0x42bdfc20, 0x15551: 0x48466220, 0x15552: 0x48466220, 0x15553: 0xe000796a, + 0x15554: 0xe000551c, 0x15555: 0xe000551c, 0x15556: 0x44718e20, 0x15557: 0x48657020, + 0x15558: 0x48c3b420, 0x15559: 0xe000a323, 0x1555a: 0xe0008c8d, 0x1555b: 0x4471c620, + 0x1555c: 0x42bf3420, 0x1555d: 0xe000849c, 0x1555e: 0xe0008ff6, 0x1555f: 0x42bff220, + 0x15560: 0xe0007a25, 0x15561: 0x44727420, 0x15562: 0x44723820, 0x15563: 0xe000a659, + 0x15564: 0x484da820, 0x15565: 0xe0005583, 0x15566: 0xe000857f, 0x15567: 0xe000a5e6, + 0x15568: 0x42c29c20, 0x15569: 0xe000a5e6, 0x1556a: 0xe0005bad, 0x1556b: 0xe0008fb3, + 0x1556c: 0xe000a1d7, 0x1556d: 0xe000680a, 0x1556e: 0xe00092f5, 0x1556f: 0xe0006076, + 0x15570: 0xe00091bf, 0x15571: 0xe00056e9, 0x15572: 0xe0006f6e, 0x15573: 0x42c43620, + 0x15574: 0x42c4ba20, 0x15575: 0xe0009e12, 0x15576: 0xe000633e, 0x15577: 0xe00079b9, + 0x15578: 0x48561820, 0x15579: 0xe0005dd1, 0x1557a: 0x42c5f820, 0x1557b: 0xe0006aad, + 0x1557c: 0xe0006fe6, 0x1557d: 0x42c7c820, 0x1557e: 0x4857e220, 0x1557f: 0xe000909f, + // Block 0x556, offset 0x15580 + 0x15580: 0x42c78a20, 0x15581: 0xe0007909, 0x15582: 0x44745c20, 0x15583: 0xe0005d6f, + 0x15584: 0x42c8fc20, 0x15585: 0xe000a7dd, 0x15586: 0x42c8ee20, 0x15587: 0x4474d820, + 0x15588: 0xe00061f2, 0x15589: 0xe0004663, 0x1558a: 0x48601420, 0x1558b: 0xe0005019, + 0x1558c: 0xe0006d36, 0x1558d: 0xe00090a3, 0x1558e: 0x44763220, 0x1558f: 0xe0006d30, + 0x15590: 0x44761020, 0x15591: 0x4475c820, 0x15592: 0xe0005fc8, 0x15593: 0xe0005f36, + 0x15594: 0xe0009794, 0x15595: 0x42cd3820, 0x15596: 0xe0005273, 0x15597: 0x4487b220, + 0x15598: 0xe00057cd, 0x15599: 0xe0005e5d, 0x1559a: 0x42ce4220, 0x1559b: 0xe0005022, + 0x1559c: 0xe0009e89, 0x1559d: 0x48678620, 0x1559e: 0x44769220, 0x1559f: 0x42cff420, + 0x155a0: 0x42cf0a20, 0x155a1: 0x42d0a420, 0x155a2: 0xe0005ea7, 0x155a3: 0x4868da20, + 0x155a4: 0x42d11c20, 0x155a5: 0x42d03e20, 0x155a6: 0x42d22820, 0x155a7: 0x44773a20, + 0x155a8: 0xe0006b28, 0x155a9: 0x42d34620, 0x155aa: 0xe00043ed, 0x155ab: 0x42d55020, + 0x155ac: 0x486d4620, 0x155ad: 0xe0008f93, 0x155ae: 0x44783020, 0x155af: 0xe00091ec, + 0x155b0: 0x48714e20, 0x155b1: 0xe000a1d4, 0x155b2: 0x44789c20, 0x155b3: 0xe0006fb0, + 0x155b4: 0x42d73e20, 0x155b5: 0xe0006bd2, 0x155b6: 0x42d77620, 0x155b7: 0x48751a20, + 0x155b8: 0x483a1620, 0x155b9: 0x4875f420, 0x155ba: 0xe00064ea, 0x155bb: 0x48797820, + 0x155bc: 0xe00079c9, 0x155bd: 0x42d99a20, 0x155be: 0x42d8ce20, 0x155bf: 0x42da2c20, + // Block 0x557, offset 0x155c0 + 0x155c0: 0xe0009c74, 0x155c1: 0xe000a13c, 0x155c2: 0xe0005bc5, 0x155c3: 0xe000a3d1, + 0x155c4: 0xe00099f8, 0x155c5: 0xe0007a55, 0x155c6: 0x487a3c20, 0x155c7: 0x42da6820, + 0x155c8: 0xe000a0f9, 0x155c9: 0xe00084a0, 0x155ca: 0x447a6620, 0x155cb: 0xe0008582, + 0x155cc: 0x42dd8e20, 0x155cd: 0x487da220, 0x155ce: 0xe000790d, 0x155cf: 0xe0008cb1, + 0x155d0: 0x487ebc20, 0x155d1: 0x487f1c20, 0x155d2: 0xe000685a, 0x155d3: 0x42e07220, + 0x155d4: 0xe0008b4b, 0x155d5: 0xe0007b09, 0x155d6: 0x447b2c20, 0x155d7: 0x42e09420, + 0x155d8: 0xe00087aa, 0x155d9: 0x42e0ee20, 0x155da: 0xe0009b06, 0x155db: 0x480a4a20, + 0x155dc: 0x42e28a20, 0x155dd: 0x4884c620, 0x155de: 0x42e33820, 0x155df: 0x48875620, + 0x155e0: 0xe0009295, 0x155e1: 0xe000861c, 0x155e2: 0x42e4a020, 0x155e3: 0x488c1020, + 0x155e4: 0xe0006d3f, 0x155e5: 0x42e52a20, 0x155e6: 0x488e6a20, 0x155e7: 0x48902820, + 0x155e8: 0xe0005338, 0x155e9: 0xe0007de7, 0x155ea: 0x447d5820, 0x155eb: 0x42e74a20, + 0x155ec: 0x447d7020, 0x155ed: 0x447d7020, 0x155ee: 0x42e88e20, 0x155ef: 0xe00081f5, + 0x155f0: 0xe00089cf, 0x155f1: 0x42e90a20, 0x155f2: 0xe000468b, 0x155f3: 0x447e3620, + 0x155f4: 0x42ea4820, 0x155f5: 0x48986c20, 0x155f6: 0x42ea7c20, 0x155f7: 0x48992420, + 0x155f8: 0xe000840c, 0x155f9: 0x48433e20, 0x155fa: 0xe0008249, 0x155fb: 0x489f4220, + 0x155fc: 0x489f7020, 0x155fd: 0x48a08820, 0x155fe: 0x447ff820, 0x155ff: 0x44801020, + // Block 0x558, offset 0x15600 + 0x15600: 0xe0009077, 0x15601: 0x48a1e620, 0x15602: 0x48a1e420, 0x15603: 0x48a23220, + 0x15604: 0x48a26620, 0x15605: 0xe00090d7, 0x15606: 0x42ee3e20, 0x15607: 0x42ee3e20, + 0x15608: 0x42ee9420, 0x15609: 0x44807220, 0x1560a: 0xe00090db, 0x1560b: 0x44808c20, + 0x1560c: 0x44812c20, 0x1560d: 0x48a83a20, 0x1560e: 0x42f09c20, 0x1560f: 0xe0005a80, + 0x15610: 0x42f19820, 0x15611: 0x4481c620, 0x15612: 0x48ac4c20, 0x15613: 0xe0008cc3, + 0x15614: 0x48ad3420, 0x15615: 0x48ad8a20, 0x15616: 0xe000666f, 0x15617: 0xe00098a4, + 0x15618: 0x44825e20, 0x15619: 0xe0004870, 0x1561a: 0x42f49420, 0x1561b: 0x42f49e20, + 0x1561c: 0x48b2f820, 0x1561d: 0x48b54e20, 0x1561e: 0x48b54e20, 0x1561f: 0x42f5dc20, + 0x15620: 0x44840420, 0x15621: 0x48b75620, 0x15622: 0xe0008967, 0x15623: 0xe000985c, + 0x15624: 0x44844e20, 0x15625: 0x48b90020, 0x15626: 0x42f9a420, 0x15627: 0x44854020, + 0x15628: 0x42f9d020, 0x15629: 0x42f9c620, 0x1562a: 0xe0005067, 0x1562b: 0x48bf0c20, + 0x1562c: 0xe00065f6, 0x1562d: 0x44860220, 0x1562e: 0xe0009967, 0x1562f: 0x42fc0420, + 0x15630: 0xe0007061, 0x15631: 0x44866820, 0x15632: 0x48c45020, 0x15633: 0x48c48e20, + 0x15634: 0x4486b220, 0x15635: 0x48c5b220, 0x15636: 0x42fef420, 0x15637: 0x48c67c20, + 0x15638: 0x42ff2a20, 0x15639: 0xe0004842, 0x1563a: 0xe000859a, 0x1563b: 0x48c9b420, + 0x1563c: 0x48ca4620, 0x1563d: 0x4300c020, 0x1563e: 0x48cb5020, 0x1563f: 0xe000976a, + // Block 0x559, offset 0x15640 + 0x15640: 0x4866be20, 0x15641: 0x4487aa20, 0x15642: 0xe0008294, 0x15643: 0x43020620, + 0x15644: 0x44881620, 0x15645: 0xe0006934, 0x15646: 0xe0008560, 0x15647: 0x48cf4e20, + 0x15648: 0x48cf6a20, 0x15649: 0x48672620, 0x1564a: 0x48673820, 0x1564b: 0xe000796a, + 0x1564c: 0x43040820, 0x1564d: 0x431f3c20, 0x1564e: 0x4488d620, 0x1564f: 0x43052220, + 0x15650: 0xe0007f9a, 0x15651: 0xe0009035, 0x15652: 0x42a56620, 0x15653: 0xe000a4f7, + 0x15654: 0xe00063ca, 0x15655: 0xe0007552, 0x15656: 0xe00047e2, 0x15657: 0x48d67820, + 0x15658: 0xe00077bb, 0x15659: 0xe00093ec, 0x1565a: 0x4306c620, 0x1565b: 0x43075a20, + 0x1565c: 0xe0007c6b, 0x1565d: 0xe0005e71, 0x1565e: 0x4307ce20, 0x1565f: 0xe000882a, + 0x15660: 0x4306a620, 0x15661: 0xe0004d19, 0x15662: 0xe0004ea5, 0x15663: 0xe00093dd, + 0x15664: 0x48d86c20, 0x15665: 0x48dad620, 0x15666: 0x48d9aa20, 0x15667: 0x448a5620, + 0x15668: 0xe0009dc2, 0x15669: 0x4309e620, 0x1566a: 0x430a2c20, 0x1566b: 0x48e79420, + 0x1566c: 0xe0008264, 0x1566d: 0x48de5820, 0x1566e: 0x448aba20, 0x1566f: 0x448ac220, + 0x15670: 0x48df6220, 0x15671: 0x48e1a420, 0x15672: 0x448ad620, 0x15673: 0xe0009fc9, + 0x15674: 0xe0005a41, 0x15675: 0xe000a7ef, 0x15676: 0x430cd220, 0x15677: 0xe0009973, + 0x15678: 0x430d1020, 0x15679: 0x430e1c20, 0x1567a: 0x430dc420, 0x1567b: 0x430ef220, + 0x1567c: 0xe0008acb, 0x1567d: 0x430ed620, 0x1567e: 0x430f0c20, 0x1567f: 0x448bae20, + // Block 0x55a, offset 0x15680 + 0x15680: 0x430fc220, 0x15681: 0x43100220, 0x15682: 0x448bf220, 0x15683: 0x4310c020, + 0x15684: 0xe00083c1, 0x15685: 0x48ecce20, 0x15686: 0x4311ae20, 0x15687: 0x4311bc20, + 0x15688: 0x448c6a20, 0x15689: 0x4311f420, 0x1568a: 0x44697620, 0x1568b: 0x48f15c20, + 0x1568c: 0x48f2cc20, 0x1568d: 0x448d7c20, 0x1568e: 0x448d8e20, 0x1568f: 0xe0006f9a, + 0x15690: 0xe0008210, 0x15691: 0xe000655e, 0x15692: 0xe00073ce, 0x15693: 0x48f95020, + 0x15694: 0xe0004a1f, 0x15695: 0xe0006832, 0x15696: 0xe0004968, 0x15697: 0xe0005082, + 0x15698: 0x48fe5e20, 0x15699: 0x48100820, 0x1569a: 0xe0006352, 0x1569b: 0x431b7820, + 0x1569c: 0x431be020, 0x1569d: 0x4811bc20, 0x1569e: 0x431da820, 0x1569f: 0xe00071ab, + 0x156a0: 0x490ba420, 0x156a1: 0x490bda20, 0x156a2: 0x43212820, 0x156a3: 0x4321e220, + 0x156a4: 0x43222220, 0x156a5: 0x490e5c20, 0x156a6: 0x43223620, 0x156a7: 0xe0006372, + 0x156a8: 0xe000a2a3, 0x156a9: 0x4325b020, 0x156aa: 0xe000660a, 0x156ab: 0x4327f220, + 0x156ac: 0x43282a20, 0x156ad: 0x4917f420, 0x156ae: 0xe0004408, 0x156af: 0x44932a20, + 0x156b0: 0x432b6e20, 0x156b1: 0x491aee20, 0x156b2: 0x4493cc20, 0x156b3: 0x432d8620, + 0x156b4: 0x42bb6420, 0x156b5: 0xe000805c, 0x156b6: 0x49228a20, 0x156b7: 0x49243420, + 0x156b8: 0x4494dc20, 0x156b9: 0x4494ec20, 0x156ba: 0xe0009f67, 0x156bb: 0x49281420, + 0x156bc: 0x44956420, 0x156bd: 0x49292c20, 0x156be: 0x43301620, 0x156bf: 0x43301620, + // Block 0x55b, offset 0x156c0 + 0x156c0: 0x43305220, 0x156c1: 0x492b6c20, 0x156c2: 0xe000508b, 0x156c3: 0x44966620, + 0x156c4: 0x43325220, 0x156c5: 0x43334e20, 0x156c6: 0x43338420, 0x156c7: 0x4333fc20, + 0x156c8: 0x44979c20, 0x156c9: 0x49366020, 0x156ca: 0xe000913b, 0x156cb: 0x43388020, + 0x156cc: 0x4339fa20, 0x156cd: 0x44999c20, 0x156ce: 0x4499da20, 0x156cf: 0x433ace20, + 0x156d0: 0x49419c20, 0x156d1: 0x4499f020, 0x156d2: 0x49420a20, 0x156d3: 0x49441c20, + 0x156d4: 0x49452220, 0x156d5: 0xe0005d84, 0x156d6: 0x449aac20, 0x156d7: 0x433df220, + 0x156d8: 0x433dfc20, 0x156d9: 0x433e0a20, 0x156da: 0x433e1e20, 0x156db: 0x433e2c20, + 0x156dc: 0xe0006955, 0x156dd: 0x494c0020, + // Block 0x55c, offset 0x15700 + 0x15700: 0xa000f202, 0x15701: 0x403fba21, 0x15702: 0x403fba20, 0x15703: 0x403fbc20, + 0x15704: 0x403fbc20, 0x15705: 0x403fbe20, 0x15706: 0x403fc020, 0x15707: 0x403fcc20, + 0x15708: 0x403fce20, 0x15709: 0x403fd020, 0x1570a: 0x403fd220, 0x1570b: 0x403fd420, + 0x1570c: 0x403fd820, 0x1570d: 0x403fdc20, 0x1570e: 0x403fde20, 0x1570f: 0x403fe020, + 0x15710: 0x403fe220, 0x15711: 0x403fe420, 0x15712: 0x403fe620, 0x15713: 0x403fe820, + 0x15714: 0x403fea20, 0x15715: 0xca983ba1, 0x15716: 0x403fee20, 0x15717: 0x403ff020, + 0x15718: 0x403ff420, 0x15719: 0x403ff620, 0x1571a: 0x403ff820, 0x1571b: 0x403ffa20, + 0x1571c: 0x403ffc20, 0x1571d: 0x40400220, 0x1571e: 0x40400420, 0x1571f: 0x40400620, + 0x15720: 0x40400820, 0x15721: 0x40400a20, 0x15722: 0x40400e20, 0x15723: 0x40401020, + 0x15724: 0x40401220, 0x15725: 0x40401420, 0x15726: 0x40401620, 0x15727: 0x40401820, + 0x15728: 0x40401a20, 0x15729: 0xe0001830, 0x1572a: 0x40401c20, 0x1572b: 0x40401e20, + 0x1572c: 0x40402020, 0x1572d: 0x40402420, 0x1572e: 0x40402620, 0x1572f: 0x40402820, + 0x15730: 0x40402c20, 0x15731: 0xe0001839, 0x15732: 0x40402e20, 0x15733: 0x40403c20, + 0x15734: 0xe000a926, 0x15735: 0x40403220, 0x15736: 0x40403420, 0x15737: 0x40403620, + 0x15738: 0x40403820, 0x15739: 0x40403a20, 0x1573a: 0x40404c20, 0x1573b: 0x40404e20, + 0x1573c: 0xa070f102, 0x1573d: 0x40403c20, 0x1573e: 0x40404a20, 0x1573f: 0x40405620, + // Block 0x55d, offset 0x15740 + 0x15740: 0x402c1a20, 0x15741: 0x002c2a88, 0x15742: 0x002c3288, 0x15743: 0x402c3220, + 0x15744: 0x0031c488, 0x15745: 0x4031c420, 0x15746: 0x002ee2a3, 0x15747: 0x002c4e88, + 0x15748: 0x402c4e20, 0x15749: 0x002c7288, 0x1574a: 0x002c7a88, 0x1574b: 0x002c8488, + 0x1574c: 0x402c8420, 0x1574d: 0xe000115c, 0x1574e: 0x002cae88, 0x1574f: 0x002cb888, + 0x15750: 0x002c9a83, 0x15751: 0x002d1688, 0x15752: 0x402d1620, 0x15753: 0x002d4488, + 0x15754: 0x002d5888, 0x15755: 0x402d7820, 0x15756: 0x002dc288, 0x15757: 0x002db688, + 0x15758: 0x002e0a88, 0x15759: 0x402e0a20, 0x1575a: 0x402e3820, 0x1575b: 0x402e7220, + 0x1575c: 0x0030a088, 0x1575d: 0x002eb488, 0x1575e: 0x402ebc20, 0x1575f: 0x002f1088, + 0x15760: 0xe0000e56, 0x15761: 0xe0000e53, 0x15762: 0x002d6088, 0x15763: 0x402d6020, + 0x15764: 0x002f3e88, 0x15765: 0x402f3e20, 0x15766: 0x002f8288, 0x15767: 0x0031b488, + 0x15768: 0x4031b420, 0x15769: 0x00300888, 0x1576a: 0x40301220, 0x1576b: 0x40304220, + 0x1576c: 0x00304a88, 0x1576d: 0x40304a20, 0x1576e: 0x00305288, 0x1576f: 0xe000105f, + 0x15770: 0xe000105c, 0x15771: 0x0030b488, 0x15772: 0x0030cc88, 0x15773: 0x00311888, + 0x15774: 0x40311820, 0x15775: 0x00313488, 0x15776: 0x40313420, 0x15777: 0x00316488, + 0x15778: 0x00316e88, 0x15779: 0x40316e20, 0x1577a: 0x40317820, 0x1577b: 0x4031a620, + 0x1577c: 0x0031bc88, 0x1577d: 0x4031bc20, 0x1577e: 0xe0000fc9, 0x1577f: 0x40319420, + // Block 0x55e, offset 0x15780 + 0x15780: 0x40315820, 0x15781: 0x0031d488, 0x15782: 0x4031d420, 0x15783: 0x002c1a88, + 0x15784: 0x00307c88, 0x15785: 0x0030da88, 0x15786: 0x002ca288, 0x15787: 0x402ca220, + 0x15788: 0x002dde88, 0x15789: 0x402dde20, 0x1578a: 0x002f6a88, 0x1578b: 0x402f6a20, + 0x1578c: 0x002f8e88, 0x1578d: 0x402f8e20, 0x1578e: 0x00311088, 0x1578f: 0x40311020, + 0x15790: 0x402bf020, 0x15791: 0x402bf820, 0x15792: 0x402c0220, 0x15793: 0x402c2a20, + 0x15794: 0x402ee221, 0x15795: 0x402c5620, 0x15796: 0x402c7220, 0x15797: 0x402c7a20, + 0x15798: 0x402ccc20, 0x15799: 0x402cb820, 0x1579a: 0x402cd420, 0x1579b: 0x402c9a20, + 0x1579c: 0x402cdc20, 0x1579d: 0x402ce820, 0x1579e: 0x402cf020, 0x1579f: 0x402dee20, + 0x157a0: 0x402d4420, 0x157a1: 0x402d2a20, 0x157a2: 0x402d3220, 0x157a3: 0x402d5820, + 0x157a4: 0x402d0020, 0x157a5: 0x40308820, 0x157a6: 0x402d8020, 0x157a7: 0x402d8e20, + 0x157a8: 0x402db620, 0x157a9: 0x402dc220, 0x157aa: 0x402daa20, 0x157ab: 0x402e4220, + 0x157ac: 0x402e4a20, 0x157ad: 0x402e5420, 0x157ae: 0x402e6820, 0x157af: 0x4030a020, + 0x157b0: 0x4030ac20, 0x157b1: 0x402e9020, 0x157b2: 0x402eb420, 0x157b3: 0x402ec820, + 0x157b4: 0x402ea620, 0x157b5: 0x402f1020, 0x157b6: 0x402eee20, 0x157b7: 0x402f1a20, + 0x157b8: 0x402f4c20, 0x157b9: 0x402f9820, 0x157ba: 0x402fa220, 0x157bb: 0x402fac20, + 0x157bc: 0x402fb620, 0x157bd: 0x402fbe20, 0x157be: 0x402fc620, 0x157bf: 0x402fd020, + // Block 0x55f, offset 0x157c0 + 0x157c0: 0xa0000000, 0x157c1: 0xa0000000, 0x157c2: 0xa0000000, 0x157c3: 0xa0000000, + 0x157c4: 0xa0000000, 0x157c5: 0xa0000000, 0x157c6: 0xa0000000, 0x157c7: 0xa0000000, + 0x157c8: 0xa0000000, 0x157c9: 0x40020020, 0x157ca: 0x40020220, 0x157cb: 0x40020420, + 0x157cc: 0x40020620, 0x157cd: 0x40020820, 0x157ce: 0xa0000000, 0x157cf: 0xa0000000, + 0x157d0: 0xa0000000, 0x157d1: 0xa0000000, 0x157d2: 0xa0000000, 0x157d3: 0xa0000000, + 0x157d4: 0xa0000000, 0x157d5: 0xa0000000, 0x157d6: 0xa0000000, 0x157d7: 0xa0000000, + 0x157d8: 0xa0000000, 0x157d9: 0xa0000000, 0x157da: 0xa0000000, 0x157db: 0xa0000000, + 0x157dc: 0xa0000000, 0x157dd: 0xa0000000, 0x157de: 0xa0000000, 0x157df: 0xa0000000, + 0x157e0: 0x40021220, 0x157e1: 0x4002ba20, 0x157e2: 0x4003e020, 0x157e3: 0x4004ea20, + 0x157e4: 0x4027de20, 0x157e5: 0x4004ec20, 0x157e6: 0x4004e620, 0x157e7: 0x4003d220, + 0x157e8: 0x4003f420, 0x157e9: 0x4003f620, 0x157ea: 0x4004d820, 0x157eb: 0x40093820, + 0x157ec: 0x40024020, 0x157ed: 0x40021a20, 0x157ee: 0x4002e420, 0x157ef: 0x4004e220, + 0x157f0: 0x4029cc20, 0x157f1: 0x4029ce20, 0x157f2: 0x4029d020, 0x157f3: 0x4029d220, + 0x157f4: 0x4029d420, 0x157f5: 0x4029d620, 0x157f6: 0x4029d820, 0x157f7: 0x4029da20, + 0x157f8: 0x4029dc20, 0x157f9: 0x4029de20, 0x157fa: 0x40026c20, 0x157fb: 0x40026220, + 0x157fc: 0x40094020, 0x157fd: 0x40094220, 0x157fe: 0x40094420, 0x157ff: 0x4002c420, + // Block 0x560, offset 0x15800 + 0x15800: 0x4004d620, 0x15801: 0xcaa00be1, 0x15802: 0x002c0a88, 0x15803: 0xc3350991, + 0x15804: 0x002c6288, 0x15805: 0xcaa53c31, 0x15806: 0x002d0888, 0x15807: 0x002d2288, + 0x15808: 0x002d6888, 0x15809: 0xcaaa0be1, 0x1580a: 0x002dcc88, 0x1580b: 0x002dfe88, + 0x1580c: 0xc0030002, 0x1580d: 0x002e8288, 0x1580e: 0x002e9e88, 0x1580f: 0x002ee288, + 0x15810: 0x002f2c88, 0x15811: 0x002f5688, 0x15812: 0x002f7a88, 0x15813: 0xc3430991, + 0x15814: 0x00302c88, 0x15815: 0xcaaf3c61, 0x15816: 0x0030be88, 0x15817: 0x0030e288, + 0x15818: 0x0030f688, 0x15819: 0x002d9ac3, 0x1581a: 0xc3630991, 0x1581b: 0x4003f820, + 0x1581c: 0x4004e420, 0x1581d: 0x4003fa20, 0x1581e: 0x40062420, 0x1581f: 0x40021620, + 0x15820: 0x40061e20, 0x15821: 0xca9e0be1, 0x15822: 0x402c0a20, 0x15823: 0xc3330991, + 0x15824: 0x402c6220, 0x15825: 0xcaa23c31, 0x15826: 0x402d0820, 0x15827: 0x402d2220, + 0x15828: 0x402d6820, 0x15829: 0xcaa80be1, 0x1582a: 0x402dcc20, 0x1582b: 0x402dfe20, + 0x1582c: 0xc0000002, 0x1582d: 0x402e8220, 0x1582e: 0x402e9e20, 0x1582f: 0x402ee220, + 0x15830: 0x402f2c20, 0x15831: 0x402f5620, 0x15832: 0x402f7a20, 0x15833: 0xc3410991, + 0x15834: 0x40302c20, 0x15835: 0xcaac3c61, 0x15836: 0x4030be20, 0x15837: 0x4030e220, + 0x15838: 0x4030f620, 0x15839: 0x402d9a22, 0x1583a: 0xc3610991, 0x1583b: 0x4003fc20, + 0x1583c: 0x40094820, 0x1583d: 0x4003fe20, 0x1583e: 0x40094c20, 0x1583f: 0xa0000000, + // Block 0x561, offset 0x15840 + 0x15840: 0xe00008f5, 0x15841: 0xe00008ef, 0x15842: 0xe0000921, 0x15843: 0xe0000969, + 0x15844: 0xe000095b, 0x15845: 0xe000094d, 0x15846: 0xe00009dd, 0x15847: 0xe0000a53, + 0x15848: 0xe0000ae8, 0x15849: 0xe0000ae2, 0x1584a: 0xe0000af4, 0x1584b: 0xe0000b20, + 0x1584c: 0xe0000c2b, 0x1584d: 0xe0000c25, 0x1584e: 0xe0000c37, 0x1584f: 0xe0000c43, + 0x15850: 0xe0000ab3, 0x15851: 0xe0000d63, 0x15852: 0xe0000d9a, 0x15853: 0xe0000d94, + 0x15854: 0xe0000da6, 0x15855: 0xe0000de6, 0x15856: 0xe0000dd2, 0x15857: 0x40093e20, + 0x15858: 0xe0000e12, 0x15859: 0xe0000fe1, 0x1585a: 0xe0000fdb, 0x1585b: 0xe0000fed, + 0x1585c: 0xe0000fff, 0x1585d: 0xe000a92c, 0x1585e: 0x00318888, 0x1585f: 0xe0000f7b, + 0x15860: 0xe00008f2, 0x15861: 0xe00008ec, 0x15862: 0xe000091e, 0x15863: 0xe0000966, + 0x15864: 0xe0000958, 0x15865: 0xe000094a, 0x15866: 0xe00009d5, 0x15867: 0xe0000a4d, + 0x15868: 0xe0000ae5, 0x15869: 0xe0000adf, 0x1586a: 0xe0000af1, 0x1586b: 0xe0000b1d, + 0x1586c: 0xe0000c28, 0x1586d: 0xe0000c22, 0x1586e: 0xe0000c34, 0x1586f: 0xe0000c40, + 0x15870: 0xe0000aad, 0x15871: 0xe0000d60, 0x15872: 0xe0000d97, 0x15873: 0xe0000d91, + 0x15874: 0xe0000da3, 0x15875: 0xe0000de3, 0x15876: 0xe0000dcf, 0x15877: 0x40093c20, + 0x15878: 0xe0000e0f, 0x15879: 0xe0000fde, 0x1587a: 0xe0000fd8, 0x1587b: 0xe0000fea, + 0x1587c: 0xe0000ffc, 0x1587d: 0xe000a929, 0x1587e: 0x40318820, 0x1587f: 0xe000a93e, + // Block 0x562, offset 0x15880 + 0x15880: 0xe0000983, 0x15881: 0xe0000980, 0x15882: 0xe00008fb, 0x15883: 0xe00008f8, + 0x15884: 0x002bdea3, 0x15885: 0x402bde21, 0x15886: 0xe0000a38, 0x15887: 0xe0000a35, + 0x15888: 0xe0000a3e, 0x15889: 0xe0000a3b, 0x1588a: 0xe0000a4a, 0x1588b: 0xe0000a47, + 0x1588c: 0x002c3c83, 0x1588d: 0x402c3c20, 0x1588e: 0xe0000a86, 0x1588f: 0xe0000a83, + 0x15890: 0xe0000aaa, 0x15891: 0xe0000aa7, 0x15892: 0xe0000b46, 0x15893: 0xe0000b43, + 0x15894: 0xe0000aee, 0x15895: 0xe0000aeb, 0x15896: 0x002c98c3, 0x15897: 0x402c9822, + 0x15898: 0x002c98a3, 0x15899: 0x402c9821, 0x1589a: 0xe0000b1a, 0x1589b: 0xe0000b17, + 0x1589c: 0xe0000bb8, 0x1589d: 0xe0000bb5, 0x1589e: 0xe0000bb2, 0x1589f: 0xe0000baf, + 0x158a0: 0xe0000bc4, 0x158a1: 0xe0000bc1, 0x158a2: 0xe0000bca, 0x158a3: 0xe0000bc7, + 0x158a4: 0xe0000bee, 0x158a5: 0xe0000beb, 0x158a6: 0xe0000c1b, 0x158a7: 0xe0000c18, + 0x158a8: 0xe0000c51, 0x158a9: 0xe0000c4e, 0x158aa: 0xe0000c60, 0x158ab: 0xe0000c5d, + 0x158ac: 0xe0000c31, 0x158ad: 0xe0000c2e, 0x158ae: 0x002d9aa3, 0x158af: 0x402d9a21, + 0x158b0: 0xe0000c54, 0x158b1: 0x402da220, 0x158b2: 0xf0000a0a, 0x158b3: 0xf0000404, + 0x158b4: 0xe0000c8a, 0x158b5: 0xe0000c87, 0x158b6: 0xe0000c9f, 0x158b7: 0xe0000c9c, + 0x158b8: 0x402f7220, 0x158b9: 0xe0000ccc, 0x158ba: 0xe0000cc9, 0x158bb: 0xe0000cd8, + 0x158bc: 0xe0000cd5, 0x158bd: 0xe0000cd2, 0x158be: 0xe0000ccf, 0x158bf: 0xe0000d04, + // Block 0x563, offset 0x158c0 + 0x158c0: 0xe0000cfe, 0x158c1: 0xe0000cf8, 0x158c2: 0xe0000cf5, 0x158c3: 0xe0000d51, + 0x158c4: 0xe0000d4e, 0x158c5: 0xe0000d6f, 0x158c6: 0xe0000d6c, 0x158c7: 0xe0000d5d, + 0x158c8: 0xe0000d5a, 0x158c9: 0xf0000404, 0x158ca: 0x002eda88, 0x158cb: 0x402eda20, + 0x158cc: 0xe0000e2e, 0x158cd: 0xe0000e2b, 0x158ce: 0xe0000da0, 0x158cf: 0xe0000d9d, + 0x158d0: 0xe0000de0, 0x158d1: 0xe0000ddd, 0x158d2: 0xe0000e93, 0x158d3: 0xe0000e8f, + 0x158d4: 0xe0000eca, 0x158d5: 0xe0000ec7, 0x158d6: 0xe0000edc, 0x158d7: 0xe0000ed9, + 0x158d8: 0xe0000ed0, 0x158d9: 0xe0000ecd, 0x158da: 0xe0000f1f, 0x158db: 0xe0000f1c, + 0x158dc: 0xe0000f2d, 0x158dd: 0xe0000f2a, 0x158de: 0xe0000f47, 0x158df: 0xe0000f44, + 0x158e0: 0x002fe883, 0x158e1: 0x402fe820, 0x158e2: 0xe0000f99, 0x158e3: 0xe0000f96, + 0x158e4: 0xe0000f8a, 0x158e5: 0xe0000f87, 0x158e6: 0x00303688, 0x158e7: 0x40303620, + 0x158e8: 0xe000102b, 0x158e9: 0xe0001028, 0x158ea: 0x00306cc3, 0x158eb: 0x40306c22, + 0x158ec: 0xe0000fe7, 0x158ed: 0xe0000fe4, 0x158ee: 0xe0000ff9, 0x158ef: 0xe0000ff6, + 0x158f0: 0xe0001025, 0x158f1: 0xe0001022, 0x158f2: 0x00306ca3, 0x158f3: 0x40306c21, + 0x158f4: 0xe00010d8, 0x158f5: 0xe00010d5, 0x158f6: 0xe000a938, 0x158f7: 0xe000a935, + 0x158f8: 0xe000a941, 0x158f9: 0xe000113b, 0x158fa: 0xe0001138, 0x158fb: 0xe000114d, + 0x158fc: 0xe000114a, 0x158fd: 0x00312c83, 0x158fe: 0x40312c20, 0x158ff: 0xe0000f64, + // Block 0x564, offset 0x15900 + 0x15900: 0x40321220, 0x15901: 0x40321a20, 0x15902: 0x40322220, 0x15903: 0x40322a20, + 0x15904: 0xe0000ad5, 0x15905: 0xe0000ad1, 0x15906: 0xe0000acd, 0x15907: 0xf0000a0a, + 0x15908: 0xf000040a, 0x15909: 0xf0000404, 0x1590a: 0xf0000a0a, 0x1590b: 0xf000040a, + 0x1590c: 0xf0000404, 0x1590d: 0xe0000947, 0x1590e: 0xe0000944, 0x1590f: 0xe0000c3d, + 0x15910: 0xe0000c3a, 0x15911: 0xe0000dcc, 0x15912: 0xe0000dc9, 0x15913: 0xe0000ff3, + 0x15914: 0xe0000ff0, 0x15915: 0xe000a965, 0x15916: 0xe000a962, 0x15917: 0xe0001006, + 0x15918: 0xe0001002, 0x15919: 0xe0001016, 0x1591a: 0xe0001012, 0x1591b: 0xe000100e, + 0x1591c: 0xe000100a, 0x1591d: 0x402cae20, 0x1591e: 0xe0000962, 0x1591f: 0xe000095e, + 0x15920: 0xe0000976, 0x15921: 0xe0000972, 0x15922: 0xe00009f4, 0x15923: 0xe00009ef, + 0x15924: 0x002d3a88, 0x15925: 0x402d3a20, 0x15926: 0xe0000bbe, 0x15927: 0xe0000bbb, + 0x15928: 0xe0000c99, 0x15929: 0xe0000c96, 0x1592a: 0xe0000e20, 0x1592b: 0xe0000e1d, + 0x1592c: 0xe0000e27, 0x1592d: 0xe0000e23, 0x1592e: 0xe0001162, 0x1592f: 0xe000115f, + 0x15930: 0xe0000c8d, 0x15931: 0xf0000a0a, 0x15932: 0xf000040a, 0x15933: 0xf0000404, + 0x15934: 0xe0000bac, 0x15935: 0xe0000ba9, 0x15936: 0x002d7888, 0x15937: 0x00319488, + 0x15938: 0xe0000d57, 0x15939: 0xe0000d54, 0x1593a: 0xe0000954, 0x1593b: 0xe0000950, + 0x1593c: 0xe00009ea, 0x1593d: 0xe00009e5, 0x1593e: 0xe0000e19, 0x1593f: 0xe0000e15, + // Block 0x565, offset 0x15940 + 0x15940: 0xe000098f, 0x15941: 0xe000098c, 0x15942: 0xe0000995, 0x15943: 0xe0000992, + 0x15944: 0xe0000b62, 0x15945: 0xe0000b5f, 0x15946: 0xe0000b68, 0x15947: 0xe0000b65, + 0x15948: 0xe0000c6c, 0x15949: 0xe0000c69, 0x1594a: 0xe0000c72, 0x1594b: 0xe0000c6f, + 0x1594c: 0xe0000e4a, 0x1594d: 0xe0000e47, 0x1594e: 0xe0000e50, 0x1594f: 0xe0000e4d, + 0x15950: 0xe0000ee8, 0x15951: 0xe0000ee5, 0x15952: 0xe0000eee, 0x15953: 0xe0000eeb, + 0x15954: 0xe0001053, 0x15955: 0xe0001050, 0x15956: 0xe0001059, 0x15957: 0xe0001056, + 0x15958: 0xe0000f61, 0x15959: 0xe0000f5e, 0x1595a: 0xe0000fa5, 0x1595b: 0xe0000fa2, + 0x1595c: 0x00312288, 0x1595d: 0x40312220, 0x1595e: 0xe0000bf4, 0x1595f: 0xe0000bf1, + 0x15960: 0x002ebc88, 0x15961: 0x402c8c20, 0x15962: 0x002f2288, 0x15963: 0x402f2220, + 0x15964: 0x00314088, 0x15965: 0x40314020, 0x15966: 0xe000096f, 0x15967: 0xe000096c, + 0x15968: 0xe0000b32, 0x15969: 0xe0000b2f, 0x1596a: 0xe0000dd9, 0x1596b: 0xe0000dd5, + 0x1596c: 0xe0000dfd, 0x1596d: 0xe0000df9, 0x1596e: 0xe0000e04, 0x1596f: 0xe0000e01, + 0x15970: 0xe0000e0b, 0x15971: 0xe0000e07, 0x15972: 0xe000a953, 0x15973: 0xe000a950, + 0x15974: 0x402e5e20, 0x15975: 0x402ed020, 0x15976: 0x40305a20, 0x15977: 0x402dd420, + 0x15978: 0xe0000abf, 0x15979: 0xe0000ec4, 0x1597a: 0x002be888, 0x1597b: 0x002c4488, + 0x1597c: 0x402c4420, 0x1597d: 0x002e3888, 0x1597e: 0x00303e88, 0x1597f: 0x402ffc20, + // Block 0x566, offset 0x15980 + 0x15980: 0xae603502, 0x15981: 0xae603202, 0x15982: 0xae603c02, 0x15983: 0xae604e02, + 0x15984: 0xae605b02, 0x15985: 0xae606302, 0x15986: 0xae603702, 0x15987: 0xca9a3c01, + 0x15988: 0xae604702, 0x15989: 0xae606402, 0x1598a: 0xae604302, 0x1598b: 0xae604d02, + 0x1598c: 0xae604102, 0x1598d: 0xae605f02, 0x1598e: 0xae605f02, 0x1598f: 0xae606502, + 0x15990: 0xae606602, 0x15991: 0xae606702, 0x15992: 0xae605f02, 0x15993: 0xae602202, + 0x15994: 0xae602a02, 0x15995: 0xae805f02, 0x15996: 0xadc06002, 0x15997: 0xadc06002, + 0x15998: 0xadc06002, 0x15999: 0xadc06002, 0x1599a: 0xae805f02, 0x1599b: 0xad806802, + 0x1599c: 0xadc06002, 0x1599d: 0xadc06002, 0x1599e: 0xadc06002, 0x1599f: 0xadc06002, + 0x159a0: 0xadc06002, 0x159a1: 0xaca06e02, 0x159a2: 0xaca06f02, 0x159a3: 0xadc07002, + 0x159a4: 0xadc07502, 0x159a5: 0xadc07602, 0x159a6: 0xadc07702, 0x159a7: 0xaca05602, + 0x159a8: 0xaca05902, 0x159a9: 0xadc06002, 0x159aa: 0xadc06002, 0x159ab: 0xadc06002, + 0x159ac: 0xadc06002, 0x159ad: 0xadc07802, 0x159ae: 0xadc07902, 0x159af: 0xadc06002, + 0x159b0: 0xadc07a02, 0x159b1: 0xadc07b02, 0x159b2: 0xadc02102, 0x159b3: 0xadc06002, + 0x159b4: 0xa0107c02, 0x159b5: 0xa0107d02, 0x159b6: 0xa0106102, 0x159b7: 0xa0106102, + 0x159b8: 0xa0105402, 0x159b9: 0xadc07e02, 0x159ba: 0xadc06002, 0x159bb: 0xadc06002, + 0x159bc: 0xadc06002, 0x159bd: 0xae605f02, 0x159be: 0xae605f02, 0x159bf: 0xae605f02, + // Block 0x567, offset 0x159c0 + 0x159c0: 0xe0000d24, 0x159c1: 0xe0000d21, 0x159c2: 0xe0000d2a, 0x159c3: 0xe0000d27, + 0x159c4: 0xe0000d69, 0x159c5: 0xe0000d66, 0x159c6: 0xe0000d7b, 0x159c7: 0xe0000d78, + 0x159c8: 0xe0000d87, 0x159c9: 0xe0000d84, 0x159ca: 0xe0000d81, 0x159cb: 0xe0000d7e, + 0x159cc: 0xe0000ded, 0x159cd: 0xe0000de9, 0x159ce: 0xe0000df5, 0x159cf: 0xe0000df1, + 0x159d0: 0xe0000e3d, 0x159d1: 0xe0000e39, 0x159d2: 0xe0000e35, 0x159d3: 0xe0000e31, + 0x159d4: 0xe0000ea7, 0x159d5: 0xe0000ea4, 0x159d6: 0xe0000ead, 0x159d7: 0xe0000eaa, + 0x159d8: 0xe0000ed6, 0x159d9: 0xe0000ed3, 0x159da: 0xe0000ef4, 0x159db: 0xe0000ef1, + 0x159dc: 0xe0000efb, 0x159dd: 0xe0000ef7, 0x159de: 0xe0000f02, 0x159df: 0xe0000eff, + 0x159e0: 0xe0000f41, 0x159e1: 0xe0000f3e, 0x159e2: 0xe0000f53, 0x159e3: 0xe0000f50, + 0x159e4: 0xe0000f26, 0x159e5: 0xe0000f22, 0x159e6: 0xe000296a, 0x159e7: 0xe0002967, + 0x159e8: 0xe0000f5a, 0x159e9: 0xe0000f56, 0x159ea: 0xe0000f93, 0x159eb: 0xe0000f90, + 0x159ec: 0xe0000f9f, 0x159ed: 0xe0000f9c, 0x159ee: 0xe0000fb1, 0x159ef: 0xe0000fae, + 0x159f0: 0xe0000fab, 0x159f1: 0xe0000fa8, 0x159f2: 0xe0001093, 0x159f3: 0xe0001090, + 0x159f4: 0xe000109f, 0x159f5: 0xe000109c, 0x159f6: 0xe0001099, 0x159f7: 0xe0001096, + 0x159f8: 0xe0001032, 0x159f9: 0xe000102e, 0x159fa: 0xe000a965, 0x159fb: 0xe000a962, + 0x159fc: 0xe00010a9, 0x159fd: 0xe00010a6, 0x159fe: 0xe00010af, 0x159ff: 0xe00010ac, + // Block 0x568, offset 0x15a00 + 0x15a00: 0xe00010d2, 0x15a01: 0xe00010cf, 0x15a02: 0xe00010cc, 0x15a03: 0xe00010c9, + 0x15a04: 0xe00010e1, 0x15a05: 0xe00010de, 0x15a06: 0xe00010e7, 0x15a07: 0xe00010e4, + 0x15a08: 0xe00010ed, 0x15a09: 0xe00010ea, 0x15a0a: 0xe00010fc, 0x15a0b: 0xe00010f9, + 0x15a0c: 0xe00010f6, 0x15a0d: 0xe00010f3, 0x15a0e: 0xe000a94d, 0x15a0f: 0xe000a94a, + 0x15a10: 0xe0001141, 0x15a11: 0xe000113e, 0x15a12: 0xe0001153, 0x15a13: 0xe0001150, + 0x15a14: 0xe0001159, 0x15a15: 0xe0001156, 0x15a16: 0xe0000c15, 0x15a17: 0xe0000f8d, + 0x15a18: 0xe00010db, 0x15a19: 0xe000a93b, 0x15a1a: 0xf0000404, 0x15a1b: 0xe0000f70, + 0x15a1c: 0x40300420, 0x15a1d: 0x40300620, 0x15a1e: 0xe0000f7f, 0x15a1f: 0x402c9620, + 0x15a20: 0xe000099b, 0x15a21: 0xe0000998, 0x15a22: 0xe0000989, 0x15a23: 0xe0000986, + 0x15a24: 0xe0000928, 0x15a25: 0xe0000924, 0x15a26: 0xe0000930, 0x15a27: 0xe000092c, + 0x15a28: 0xe0000940, 0x15a29: 0xe000093c, 0x15a2a: 0xe0000938, 0x15a2b: 0xe0000934, + 0x15a2c: 0xe00009aa, 0x15a2d: 0xe00009a6, 0x15a2e: 0xe0000902, 0x15a2f: 0xe00008fe, + 0x15a30: 0xe000090a, 0x15a31: 0xe0000906, 0x15a32: 0xe000091a, 0x15a33: 0xe0000916, + 0x15a34: 0xe0000912, 0x15a35: 0xe000090e, 0x15a36: 0xe00009a2, 0x15a37: 0xe000099e, + 0x15a38: 0xe0000b6e, 0x15a39: 0xe0000b6b, 0x15a3a: 0xe0000b5c, 0x15a3b: 0xe0000b59, + 0x15a3c: 0xe0000b26, 0x15a3d: 0xe0000b23, 0x15a3e: 0xe0000afb, 0x15a3f: 0xe0000af7, + // Block 0x569, offset 0x15a40 + 0x15a40: 0xe0000b03, 0x15a41: 0xe0000aff, 0x15a42: 0xe0000b13, 0x15a43: 0xe0000b0f, + 0x15a44: 0xe0000b0b, 0x15a45: 0xe0000b07, 0x15a46: 0xe0000b75, 0x15a47: 0xe0000b71, + 0x15a48: 0xe0000c66, 0x15a49: 0xe0000c63, 0x15a4a: 0xe0000c78, 0x15a4b: 0xe0000c75, + 0x15a4c: 0xe0000e84, 0x15a4d: 0xe0000e81, 0x15a4e: 0xe0000e44, 0x15a4f: 0xe0000e41, + 0x15a50: 0xe0000dad, 0x15a51: 0xe0000da9, 0x15a52: 0xe0000db5, 0x15a53: 0xe0000db1, + 0x15a54: 0xe0000dc5, 0x15a55: 0xe0000dc1, 0x15a56: 0xe0000dbd, 0x15a57: 0xe0000db9, + 0x15a58: 0xe0000e8b, 0x15a59: 0xe0000e87, 0x15a5a: 0xe0000e5d, 0x15a5b: 0xe0000e59, + 0x15a5c: 0xe0000e65, 0x15a5d: 0xe0000e61, 0x15a5e: 0xe0000e75, 0x15a5f: 0xe0000e71, + 0x15a60: 0xe0000e6d, 0x15a61: 0xe0000e69, 0x15a62: 0xe0000e7d, 0x15a63: 0xe0000e79, + 0x15a64: 0xe000108d, 0x15a65: 0xe000108a, 0x15a66: 0xe000104d, 0x15a67: 0xe000104a, + 0x15a68: 0xe0001066, 0x15a69: 0xe0001062, 0x15a6a: 0xe000106e, 0x15a6b: 0xe000106a, + 0x15a6c: 0xe000107e, 0x15a6d: 0xe000107a, 0x15a6e: 0xe0001076, 0x15a6f: 0xe0001072, + 0x15a70: 0xe0001086, 0x15a71: 0xe0001082, 0x15a72: 0xe000a932, 0x15a73: 0xe000a92f, + 0x15a74: 0xe000a95f, 0x15a75: 0xe000a95c, 0x15a76: 0xe000a959, 0x15a77: 0xe000a956, + 0x15a78: 0xe000a947, 0x15a79: 0xe000a944, 0x15a7a: 0xe0000d0a, 0x15a7b: 0xe0000d07, + 0x15a7c: 0x0030d888, 0x15a7d: 0x4030d820, 0x15a7e: 0x00312088, 0x15a7f: 0x40312020, + // Block 0x56a, offset 0x15a80 + 0x15a80: 0xe0000024, 0x15a81: 0xe0000029, 0x15a82: 0xe000002e, 0x15a83: 0xe0000033, + 0x15a84: 0xe0000038, 0x15a85: 0xe000003d, 0x15a86: 0xe0000042, 0x15a87: 0xe0000047, + 0x15a88: 0xf0001f04, 0x15a89: 0xf0001f04, 0x15a8a: 0xf0001f04, 0x15a8b: 0xf0001f04, + 0x15a8c: 0xf0001f04, 0x15a8d: 0xf0001f04, 0x15a8e: 0xf0001f04, 0x15a8f: 0xf0001f04, + 0x15a90: 0xf0001f04, 0x15a91: 0xf0000404, 0x15a92: 0xf0000404, 0x15a93: 0xf0000404, + 0x15a94: 0xf0000404, 0x15a95: 0xf0000404, 0x15a96: 0xf0000404, 0x15a97: 0xf0000404, + 0x15a98: 0xf0000404, 0x15a99: 0xf0000404, 0x15a9a: 0xf0000404, 0x15a9b: 0xf0000404, + 0x15a9c: 0xf0000404, 0x15a9d: 0xf0000404, 0x15a9e: 0xf0000404, 0x15a9f: 0xf0000404, + 0x15aa0: 0xf0000404, 0x15aa1: 0xf0000404, 0x15aa2: 0xf0000404, 0x15aa3: 0xf0000404, + 0x15aa4: 0xf0000404, 0x15aa5: 0xf0000404, 0x15aa6: 0xf0000404, 0x15aa7: 0xf0000404, + 0x15aa8: 0xf0000404, 0x15aa9: 0xf0000404, 0x15aaa: 0xf0000404, 0x15aab: 0xf0000404, + 0x15aac: 0xf0000404, 0x15aad: 0xf0000404, 0x15aae: 0xf0000404, 0x15aaf: 0xf0000404, + 0x15ab0: 0xf0000404, 0x15ab1: 0xf0000404, 0x15ab2: 0xf0000404, 0x15ab3: 0xf0000404, + 0x15ab4: 0xe0002c04, 0x15ab5: 0xf0000404, 0x15ab6: 0x002bde8c, 0x15ab7: 0x002c0a8c, + 0x15ab8: 0x002c3a8c, 0x15ab9: 0x002c628c, 0x15aba: 0x002c988c, 0x15abb: 0x002d088c, + 0x15abc: 0x002d228c, 0x15abd: 0x002d688c, 0x15abe: 0x002d9a8c, 0x15abf: 0x002dcc8c, + // Block 0x56b, offset 0x15ac0 + 0x15ac0: 0xf0001d1c, 0x15ac1: 0xf0001d1d, 0x15ac2: 0xe00009b7, 0x15ac3: 0xf0001c1d, + 0x15ac4: 0xf0001c1c, 0x15ac5: 0xf0001c1c, 0x15ac6: 0xe0000a66, 0x15ac7: 0xe0000a7a, + 0x15ac8: 0xf0001d1c, 0x15ac9: 0xe000352c, 0x15aca: 0xf0001c1c, 0x15acb: 0xf0001d1d, + 0x15acc: 0xf0001c1c, 0x15acd: 0xf0001d1d, 0x15ace: 0xf0001d1d, 0x15acf: 0xf0001c1c, + 0x15ad0: 0xf0001c1c, 0x15ad1: 0xf0001c1c, 0x15ad2: 0xe0000d0d, 0x15ad3: 0xf0001c1c, + 0x15ad4: 0xf0001c1c, 0x15ad5: 0xe0000d3a, 0x15ad6: 0xe0000d46, 0x15ad7: 0xf0001d1d, + 0x15ad8: 0xe0000eb0, 0x15ad9: 0xe0000eb8, 0x15ada: 0xf0001d1d, 0x15adb: 0xf0001c1c, + 0x15adc: 0xf0001c1d, 0x15add: 0xf0001c1d, 0x15ade: 0xe00010b2, 0x15adf: 0xe00009c8, + 0x15ae0: 0xf0001f04, 0x15ae1: 0xf0001f04, 0x15ae2: 0xf0001f04, 0x15ae3: 0xf0001f04, + 0x15ae4: 0xf0001f04, 0x15ae5: 0xf0001f04, 0x15ae6: 0xf0001f04, 0x15ae7: 0xf0001f04, + 0x15ae8: 0xf0001f04, 0x15ae9: 0xf0000404, 0x15aea: 0xf0000404, 0x15aeb: 0xf0000404, + 0x15aec: 0xf0000404, 0x15aed: 0xf0000404, 0x15aee: 0xf0000404, 0x15aef: 0xf0000404, + 0x15af0: 0xf0000404, 0x15af1: 0xf0000404, 0x15af2: 0xf0000404, 0x15af3: 0xf0000404, + 0x15af4: 0xf0000404, 0x15af5: 0xf0000404, 0x15af6: 0xf0000404, 0x15af7: 0xf0000404, + 0x15af8: 0xf0000404, 0x15af9: 0xf0000404, 0x15afa: 0xf0000404, 0x15afb: 0xf0000404, + 0x15afc: 0xf0000404, 0x15afd: 0xf0000404, 0x15afe: 0xf0000404, 0x15aff: 0xe0000bdf, + // Block 0x56c, offset 0x15b00 + 0x15b00: 0xf0001f04, 0x15b01: 0xf0001f04, 0x15b02: 0xf0001f04, 0x15b03: 0xf0001f04, + 0x15b04: 0xf0001f04, 0x15b05: 0xf0001f04, 0x15b06: 0xf0001f04, 0x15b07: 0xf0001f04, + 0x15b08: 0xf0001f04, 0x15b09: 0xf0001f04, 0x15b0a: 0xf0001f04, + 0x15b10: 0xf0000a04, 0x15b11: 0xf0000a04, 0x15b12: 0xf0000a04, 0x15b13: 0xf0000a04, + 0x15b14: 0xf0000a04, 0x15b15: 0xf0000a04, 0x15b16: 0xf0000a04, 0x15b17: 0xf0000a04, + 0x15b18: 0xf0000a04, 0x15b19: 0xf0000a04, 0x15b1a: 0xf0000a04, 0x15b1b: 0xf0000a04, + 0x15b1c: 0xf0000a04, 0x15b1d: 0xf0000a04, 0x15b1e: 0xf0000a04, 0x15b1f: 0xf0000a04, + 0x15b20: 0xf0000a04, 0x15b21: 0xf0000a04, 0x15b22: 0xf0000a04, 0x15b23: 0xf0000a04, + 0x15b24: 0xf0000a04, 0x15b25: 0xf0000a04, 0x15b26: 0xf0000a04, 0x15b27: 0xf0000a04, + 0x15b28: 0xe0002c08, 0x15b29: 0xf0000a04, 0x15b2a: 0xf0000a04, 0x15b2b: 0x002c3a8c, + 0x15b2c: 0x002f7a8c, 0x15b2d: 0xf0000c0c, 0x15b2e: 0xf0000c0c, + 0x15b30: 0x002bde9d, 0x15b31: 0x002c0a9d, 0x15b32: 0x002c3a9d, 0x15b33: 0x002c629d, + 0x15b34: 0x002c989d, 0x15b35: 0x002d089d, 0x15b36: 0x002d229d, 0x15b37: 0x002d689d, + 0x15b38: 0x002d9a9d, 0x15b39: 0x002dcc9d, 0x15b3a: 0x002dfe9d, 0x15b3b: 0x002e229d, + 0x15b3c: 0x002e829d, 0x15b3d: 0x002e9e9d, 0x15b3e: 0x002ee29d, 0x15b3f: 0x002f2c9d, + // Block 0x56d, offset 0x15b40 + 0x15b40: 0xa0000000, 0x15b41: 0xa0000000, 0x15b42: 0xa0000000, 0x15b43: 0xa0000000, + 0x15b44: 0xa0000000, 0x15b45: 0xa0000000, 0x15b46: 0xa0000000, 0x15b47: 0xa0000000, + 0x15b48: 0xa0000000, 0x15b49: 0x40020020, 0x15b4a: 0x40020220, 0x15b4b: 0x40020420, + 0x15b4c: 0x40020620, 0x15b4d: 0x40020820, 0x15b4e: 0xa0000000, 0x15b4f: 0xa0000000, + 0x15b50: 0xa0000000, 0x15b51: 0xa0000000, 0x15b52: 0xa0000000, 0x15b53: 0xa0000000, + 0x15b54: 0xa0000000, 0x15b55: 0xa0000000, 0x15b56: 0xa0000000, 0x15b57: 0xa0000000, + 0x15b58: 0xa0000000, 0x15b59: 0xa0000000, 0x15b5a: 0xa0000000, 0x15b5b: 0xa0000000, + 0x15b5c: 0xa0000000, 0x15b5d: 0xa0000000, 0x15b5e: 0xa0000000, 0x15b5f: 0xa0000000, + 0x15b60: 0x40021220, 0x15b61: 0x4002ba20, 0x15b62: 0x4003e020, 0x15b63: 0x4004ea20, + 0x15b64: 0x4027de20, 0x15b65: 0x4004ec20, 0x15b66: 0x4004e620, 0x15b67: 0x4003d220, + 0x15b68: 0x4003f420, 0x15b69: 0x4003f620, 0x15b6a: 0x4004d820, 0x15b6b: 0x40093820, + 0x15b6c: 0x40024020, 0x15b6d: 0x40021a20, 0x15b6e: 0x4002e420, 0x15b6f: 0x4004e220, + 0x15b70: 0x4029cc20, 0x15b71: 0x4029ce20, 0x15b72: 0x4029d020, 0x15b73: 0x4029d220, + 0x15b74: 0x4029d420, 0x15b75: 0x4029d620, 0x15b76: 0x4029d820, 0x15b77: 0x4029da20, + 0x15b78: 0x4029dc20, 0x15b79: 0x4029de20, 0x15b7a: 0x40026c20, 0x15b7b: 0x40026220, + 0x15b7c: 0x40094020, 0x15b7d: 0x40094220, 0x15b7e: 0x40094420, 0x15b7f: 0x4002c420, + // Block 0x56e, offset 0x15b80 + 0x15b80: 0x4004d620, 0x15b81: 0x002bde88, 0x15b82: 0x002c0a88, 0x15b83: 0xcab40991, + 0x15b84: 0x002c6288, 0x15b85: 0x002c9888, 0x15b86: 0x002d0888, 0x15b87: 0xcab80911, + 0x15b88: 0x002d6888, 0x15b89: 0x002d9a88, 0x15b8a: 0x002dcc88, 0x15b8b: 0xcabc0911, + 0x15b8c: 0xcac23c93, 0x15b8d: 0x002e8288, 0x15b8e: 0xcac80911, 0x15b8f: 0x002ee288, + 0x15b90: 0x002f2c88, 0x15b91: 0x002f5688, 0x15b92: 0xcacc0911, 0x15b93: 0xcad00991, + 0x15b94: 0x00302c88, 0x15b95: 0x00306c88, 0x15b96: 0x0030be88, 0x15b97: 0x0030e288, + 0x15b98: 0x0030f688, 0x15b99: 0x00310088, 0x15b9a: 0xcad40991, 0x15b9b: 0x4003f820, + 0x15b9c: 0x4004e420, 0x15b9d: 0x4003fa20, 0x15b9e: 0x40062420, 0x15b9f: 0x40021620, + 0x15ba0: 0x40061e20, 0x15ba1: 0x402bde20, 0x15ba2: 0x402c0a20, 0x15ba3: 0xcab20991, + 0x15ba4: 0x402c6220, 0x15ba5: 0x402c9820, 0x15ba6: 0x402d0820, 0x15ba7: 0xcab60911, + 0x15ba8: 0x402d6820, 0x15ba9: 0x402d9a20, 0x15baa: 0x402dcc20, 0x15bab: 0xcaba0911, + 0x15bac: 0xcabe3c93, 0x15bad: 0x402e8220, 0x15bae: 0xcac60911, 0x15baf: 0x402ee220, + 0x15bb0: 0x402f2c20, 0x15bb1: 0x402f5620, 0x15bb2: 0xcaca0911, 0x15bb3: 0xcace0991, + 0x15bb4: 0x40302c20, 0x15bb5: 0x40306c20, 0x15bb6: 0x4030be20, 0x15bb7: 0x4030e220, + 0x15bb8: 0x4030f620, 0x15bb9: 0x40310020, 0x15bba: 0xcad20991, 0x15bbb: 0x4003fc20, + 0x15bbc: 0x40094820, 0x15bbd: 0x4003fe20, 0x15bbe: 0x40094c20, 0x15bbf: 0xa0000000, + // Block 0x56f, offset 0x15bc0 + 0x15bc0: 0xe0000983, 0x15bc1: 0xe0000980, 0x15bc2: 0xe00008fb, 0x15bc3: 0xe00008f8, + 0x15bc4: 0xe000097d, 0x15bc5: 0xe000097a, 0x15bc6: 0xe0000a38, 0x15bc7: 0xe0000a35, + 0x15bc8: 0xe0000a3e, 0x15bc9: 0xe0000a3b, 0x15bca: 0xe0000a4a, 0x15bcb: 0xe0000a47, + 0x15bcc: 0x002c6083, 0x15bcd: 0x402c6020, 0x15bce: 0xe0000a86, 0x15bcf: 0xe0000a83, + 0x15bd0: 0xe0000aaa, 0x15bd1: 0xe0000aa7, 0x15bd2: 0xe0000b46, 0x15bd3: 0xe0000b43, + 0x15bd4: 0xe0000aee, 0x15bd5: 0xe0000aeb, 0x15bd6: 0xe0000b2c, 0x15bd7: 0xe0000b29, + 0x15bd8: 0xe0000b40, 0x15bd9: 0xe0000b3d, 0x15bda: 0xe0000b1a, 0x15bdb: 0xe0000b17, + 0x15bdc: 0xe0000bb8, 0x15bdd: 0xe0000bb5, 0x15bde: 0xe0000bb2, 0x15bdf: 0xe0000baf, + 0x15be0: 0xe0000bc4, 0x15be1: 0xe0000bc1, 0x15be2: 0x002d6683, 0x15be3: 0x402d6620, + 0x15be4: 0xe0000bee, 0x15be5: 0xe0000beb, 0x15be6: 0xe0000c1b, 0x15be7: 0xe0000c18, + 0x15be8: 0xe0000c51, 0x15be9: 0xe0000c4e, 0x15bea: 0xe0000c60, 0x15beb: 0xe0000c5d, + 0x15bec: 0xe0000c31, 0x15bed: 0xe0000c2e, 0x15bee: 0xe0000c5a, 0x15bef: 0xe0000c57, + 0x15bf0: 0xe0000c54, 0x15bf1: 0x402da220, 0x15bf2: 0xf0000a0a, 0x15bf3: 0xf0000404, + 0x15bf4: 0xe0000c8a, 0x15bf5: 0xe0000c87, 0x15bf6: 0x002e2083, 0x15bf7: 0x402e2020, + 0x15bf8: 0x402f7220, 0x15bf9: 0xe0000ccc, 0x15bfa: 0xe0000cc9, 0x15bfb: 0x002e8083, + 0x15bfc: 0x402e8020, 0x15bfd: 0xe0000cd2, 0x15bfe: 0xe0000ccf, 0x15bff: 0xe0000d04, + // Block 0x570, offset 0x15c00 + 0x15c00: 0xe0000cfe, 0x15c01: 0xe0000cf8, 0x15c02: 0xe0000cf5, 0x15c03: 0xe0000d51, + 0x15c04: 0xe0000d4e, 0x15c05: 0x002ee083, 0x15c06: 0x402ee020, 0x15c07: 0xe0000d5d, + 0x15c08: 0xe0000d5a, 0x15c09: 0xf0000404, 0x15c0a: 0x002eda88, 0x15c0b: 0x402eda20, + 0x15c0c: 0xe0000e2e, 0x15c0d: 0xe0000e2b, 0x15c0e: 0xe0000da0, 0x15c0f: 0xe0000d9d, + 0x15c10: 0xe0000de0, 0x15c11: 0xe0000ddd, 0x15c12: 0xe0000e93, 0x15c13: 0xe0000e8f, + 0x15c14: 0xe0000eca, 0x15c15: 0xe0000ec7, 0x15c16: 0x002fe483, 0x15c17: 0x402fe420, + 0x15c18: 0xe0000ed0, 0x15c19: 0xe0000ecd, 0x15c1a: 0xe0000f1f, 0x15c1b: 0xe0000f1c, + 0x15c1c: 0xe0000f2d, 0x15c1d: 0xe0000f2a, 0x15c1e: 0xe0000f47, 0x15c1f: 0xe0000f44, + 0x15c20: 0x00302a83, 0x15c21: 0x40302a20, 0x15c22: 0xe0000f99, 0x15c23: 0xe0000f96, + 0x15c24: 0xe0000f8a, 0x15c25: 0xe0000f87, 0x15c26: 0x00303688, 0x15c27: 0x40303620, + 0x15c28: 0xe000102b, 0x15c29: 0xe0001028, 0x15c2a: 0xe000103f, 0x15c2b: 0xe000103c, + 0x15c2c: 0xe0000fe7, 0x15c2d: 0xe0000fe4, 0x15c2e: 0xe0000ff9, 0x15c2f: 0xe0000ff6, + 0x15c30: 0xe0001025, 0x15c31: 0xe0001022, 0x15c32: 0xe0001039, 0x15c33: 0xe0001036, + 0x15c34: 0xe00010d8, 0x15c35: 0xe00010d5, 0x15c36: 0xe000110e, 0x15c37: 0xe000110b, + 0x15c38: 0xe0001117, 0x15c39: 0xe000113b, 0x15c3a: 0xe0001138, 0x15c3b: 0xe000114d, + 0x15c3c: 0xe000114a, 0x15c3d: 0x00316283, 0x15c3e: 0x40316220, 0x15c3f: 0xe0000f64, + // Block 0x571, offset 0x15c40 + 0x15c40: 0xe0000d24, 0x15c41: 0xe0000d21, 0x15c42: 0xe0000d2a, 0x15c43: 0xe0000d27, + 0x15c44: 0xe0000d69, 0x15c45: 0xe0000d66, 0x15c46: 0xe0000d7b, 0x15c47: 0xe0000d78, + 0x15c48: 0xe0000d87, 0x15c49: 0xe0000d84, 0x15c4a: 0xe0000d81, 0x15c4b: 0xe0000d7e, + 0x15c4c: 0xe0000ded, 0x15c4d: 0xe0000de9, 0x15c4e: 0xe0000df5, 0x15c4f: 0xe0000df1, + 0x15c50: 0xe0000e3d, 0x15c51: 0xe0000e39, 0x15c52: 0xe0000e35, 0x15c53: 0xe0000e31, + 0x15c54: 0xe0000ea7, 0x15c55: 0xe0000ea4, 0x15c56: 0xe0000ead, 0x15c57: 0xe0000eaa, + 0x15c58: 0xe0000ed6, 0x15c59: 0xe0000ed3, 0x15c5a: 0xe0000ef4, 0x15c5b: 0xe0000ef1, + 0x15c5c: 0xe0000efb, 0x15c5d: 0xe0000ef7, 0x15c5e: 0xe0000f02, 0x15c5f: 0xe0000eff, + 0x15c60: 0xe0000f41, 0x15c61: 0xe0000f3e, 0x15c62: 0xe0000f53, 0x15c63: 0xe0000f50, + 0x15c64: 0xe0000f26, 0x15c65: 0xe0000f22, 0x15c66: 0xe000a96b, 0x15c67: 0xe000a968, + 0x15c68: 0xe0000f5a, 0x15c69: 0xe0000f56, 0x15c6a: 0xe0000f93, 0x15c6b: 0xe0000f90, + 0x15c6c: 0xe0000f9f, 0x15c6d: 0xe0000f9c, 0x15c6e: 0xe0000fb1, 0x15c6f: 0xe0000fae, + 0x15c70: 0xe0000fab, 0x15c71: 0xe0000fa8, 0x15c72: 0xe0001093, 0x15c73: 0xe0001090, + 0x15c74: 0xe000109f, 0x15c75: 0xe000109c, 0x15c76: 0xe0001099, 0x15c77: 0xe0001096, + 0x15c78: 0xe0001032, 0x15c79: 0xe000102e, 0x15c7a: 0xe0001046, 0x15c7b: 0xe0001042, + 0x15c7c: 0xe00010a9, 0x15c7d: 0xe00010a6, 0x15c7e: 0xe00010af, 0x15c7f: 0xe00010ac, + // Block 0x572, offset 0x15c80 + 0x15c82: 0xe000a983, 0x15c83: 0xa000f402, + 0x15c85: 0x40440220, 0x15c86: 0x40440420, 0x15c87: 0x40440620, + 0x15c88: 0x40440820, 0x15c89: 0x40440a20, 0x15c8a: 0x40440c20, 0x15c8b: 0x40440e20, + 0x15c8c: 0x40441220, 0x15c8e: 0x40441620, 0x15c8f: 0x40441820, + 0x15c90: 0x40441a20, 0x15c92: 0x40441c20, 0x15c93: 0x40441e20, + 0x15c94: 0x40442020, 0x15c95: 0xcad63cf1, 0x15c96: 0x40442420, 0x15c97: 0x40442620, + 0x15c98: 0x40442820, 0x15c99: 0x40442a20, 0x15c9a: 0x40442c20, 0x15c9b: 0x40442e20, + 0x15c9c: 0x40443020, 0x15c9d: 0x40443220, 0x15c9e: 0x40443420, 0x15c9f: 0x40443620, + 0x15ca0: 0x40443820, 0x15ca1: 0x40443a20, 0x15ca2: 0x40443c20, 0x15ca3: 0xcad83d51, + 0x15ca4: 0x40444020, 0x15ca5: 0x40444220, 0x15ca6: 0x40444420, 0x15ca7: 0x40444620, + 0x15ca8: 0xcadc3cf1, 0x15ca9: 0x40444a20, 0x15caa: 0x40444c20, 0x15cab: 0x40444e20, + 0x15cac: 0x40445020, 0x15cad: 0x40445220, 0x15cae: 0x40445420, 0x15caf: 0x40445620, + 0x15cb0: 0xcade3cf1, 0x15cb1: 0x40446a20, 0x15cb2: 0xcae03cf1, 0x15cb3: 0xcae23cf1, + 0x15cb4: 0x40446820, 0x15cb5: 0x40445c20, 0x15cb6: 0x40445e20, 0x15cb7: 0x40446020, + 0x15cb8: 0x40446220, 0x15cb9: 0x40446420, 0x15cba: 0x40446c20, + 0x15cbd: 0xa000f502, 0x15cbe: 0x40447020, 0x15cbf: 0x40447220, + // Block 0x573, offset 0x15cc0 + 0x15cc0: 0x40447420, 0x15cc1: 0x40447620, 0x15cc2: 0x40447820, 0x15cc3: 0x40447a20, + 0x15cc4: 0x40447c20, 0x15cc6: 0xcae403b1, 0x15cc7: 0xc0760401, + 0x15cc8: 0x40448620, 0x15cca: 0x40448820, 0x15ccb: 0x40448a20, + 0x15ccc: 0x00448c83, 0x15ccd: 0x82092248, 0x15cce: 0xe000186c, + 0x15cd7: 0x40448c20, + 0x15ce0: 0x40441020, 0x15ce1: 0x40441420, 0x15ce2: 0x40447e20, 0x15ce3: 0x40448020, + 0x15ce6: 0xe0000185, 0x15ce7: 0xe0000216, + 0x15ce8: 0xe0000331, 0x15ce9: 0xe000040b, 0x15cea: 0xe00004e0, 0x15ceb: 0xe00005aa, + 0x15cec: 0xe0000675, 0x15ced: 0xe000071d, 0x15cee: 0xe00007c9, 0x15cef: 0xe000086e, + 0x15cf0: 0x40285a20, 0x15cf1: 0x40285c20, 0x15cf2: 0x40285e20, 0x15cf3: 0x40286020, + 0x15cf4: 0x40286220, 0x15cf5: 0x40286420, + 0x15cf9: 0x40074e20, 0x15cfa: 0xe000a977, 0x15cfb: 0xcada3dc1, + 0x15cfc: 0xe000a989, 0x15cfd: 0xe000a98f, 0x15cfe: 0xe000a995, 0x15cff: 0xe000a971, + // Block 0x574, offset 0x15d00 + 0x15d00: 0xa000f202, 0x15d01: 0x403fba21, 0x15d02: 0x403fba20, 0x15d03: 0x403fbc20, + 0x15d04: 0x403fbc20, 0x15d05: 0x403fbe20, 0x15d06: 0x403fc020, 0x15d07: 0x403fcc20, + 0x15d08: 0x403fce20, 0x15d09: 0x403fd020, 0x15d0a: 0x403fd220, 0x15d0b: 0x403fd420, + 0x15d0c: 0x403fd820, 0x15d0d: 0x403fdc20, 0x15d0e: 0x403fde20, 0x15d0f: 0x403fe020, + 0x15d10: 0x403fe220, 0x15d11: 0x403fe420, 0x15d12: 0x403fe620, 0x15d13: 0x403fe820, + 0x15d14: 0x403fea20, 0x15d15: 0xca983ba1, 0x15d16: 0x403fee20, 0x15d17: 0x403ff020, + 0x15d18: 0x403ff420, 0x15d19: 0x403ff620, 0x15d1a: 0x403ff820, 0x15d1b: 0x403ffa20, + 0x15d1c: 0xcae73df1, 0x15d1d: 0x40400220, 0x15d1e: 0x40400420, 0x15d1f: 0x40400620, + 0x15d20: 0x40400820, 0x15d21: 0x40400a20, 0x15d22: 0x40400e20, 0x15d23: 0x40401020, + 0x15d24: 0x40401220, 0x15d25: 0x40401420, 0x15d26: 0x40401620, 0x15d27: 0x40401820, + 0x15d28: 0x40401a20, 0x15d29: 0xe0001830, 0x15d2a: 0x40401c20, 0x15d2b: 0x40401e20, + 0x15d2c: 0x40402020, 0x15d2d: 0x40402420, 0x15d2e: 0x40402620, 0x15d2f: 0x40402820, + 0x15d30: 0x40402c20, 0x15d31: 0xe0001839, 0x15d32: 0x40402e20, 0x15d33: 0x40403c20, + 0x15d34: 0xe000a926, 0x15d35: 0x40403220, 0x15d36: 0x40403420, 0x15d37: 0x40403620, + 0x15d38: 0x40403820, 0x15d39: 0x40403a20, 0x15d3a: 0x40404c20, 0x15d3b: 0x40404e20, + 0x15d3c: 0xa070f102, 0x15d3d: 0x40403c20, 0x15d3e: 0x40404a20, 0x15d3f: 0x40405620, + // Block 0x575, offset 0x15d40 + 0x15d40: 0xa0000000, 0x15d41: 0xa0000000, 0x15d42: 0xa0000000, 0x15d43: 0xa0000000, + 0x15d44: 0xa0000000, 0x15d45: 0xa0000000, 0x15d46: 0xa0000000, 0x15d47: 0xa0000000, + 0x15d48: 0xa0000000, 0x15d49: 0x40020020, 0x15d4a: 0x40020220, 0x15d4b: 0x40020420, + 0x15d4c: 0x40020620, 0x15d4d: 0x40020820, 0x15d4e: 0xa0000000, 0x15d4f: 0xa0000000, + 0x15d50: 0xa0000000, 0x15d51: 0xa0000000, 0x15d52: 0xa0000000, 0x15d53: 0xa0000000, + 0x15d54: 0xa0000000, 0x15d55: 0xa0000000, 0x15d56: 0xa0000000, 0x15d57: 0xa0000000, + 0x15d58: 0xa0000000, 0x15d59: 0xa0000000, 0x15d5a: 0xa0000000, 0x15d5b: 0xa0000000, + 0x15d5c: 0xa0000000, 0x15d5d: 0xa0000000, 0x15d5e: 0xa0000000, 0x15d5f: 0xa0000000, + 0x15d60: 0x40021220, 0x15d61: 0x4002ba20, 0x15d62: 0x4003e020, 0x15d63: 0x4004ea20, + 0x15d64: 0x4027de20, 0x15d65: 0x4004ec20, 0x15d66: 0x4004e620, 0x15d67: 0x4003d220, + 0x15d68: 0x4003f420, 0x15d69: 0x4003f620, 0x15d6a: 0x4004d820, 0x15d6b: 0x40093820, + 0x15d6c: 0x40024020, 0x15d6d: 0x40021a20, 0x15d6e: 0x4002e420, 0x15d6f: 0x4004e220, + 0x15d70: 0x4029cc20, 0x15d71: 0x4029ce20, 0x15d72: 0x4029d020, 0x15d73: 0x4029d220, + 0x15d74: 0x4029d420, 0x15d75: 0x4029d620, 0x15d76: 0x4029d820, 0x15d77: 0x4029da20, + 0x15d78: 0x4029dc20, 0x15d79: 0x4029de20, 0x15d7a: 0x40026c20, 0x15d7b: 0x40026220, + 0x15d7c: 0x40094020, 0x15d7d: 0x40094220, 0x15d7e: 0x40094420, 0x15d7f: 0x4002c420, + // Block 0x576, offset 0x15d80 + 0x15d80: 0x4004d620, 0x15d81: 0x002bde88, 0x15d82: 0x002c0a88, 0x15d83: 0xcae90931, + 0x15d84: 0x002c6288, 0x15d85: 0x002c9888, 0x15d86: 0x002d0888, 0x15d87: 0xcaed3e52, + 0x15d88: 0x002d6888, 0x15d89: 0x002d9a88, 0x15d8a: 0x002dcc88, 0x15d8b: 0x002dfe88, + 0x15d8c: 0xc0030002, 0x15d8d: 0x002e8288, 0x15d8e: 0x002e9e88, 0x15d8f: 0x002ee288, + 0x15d90: 0x002f2c88, 0x15d91: 0x002f5688, 0x15d92: 0x002f7a88, 0x15d93: 0x002fe688, + 0x15d94: 0x00302c88, 0x15d95: 0x00306c88, 0x15d96: 0x0030be88, 0x15d97: 0x0030e288, + 0x15d98: 0x0030f688, 0x15d99: 0x00310088, 0x15d9a: 0xcaf50931, 0x15d9b: 0x4003f820, + 0x15d9c: 0x4004e420, 0x15d9d: 0x4003fa20, 0x15d9e: 0x40062420, 0x15d9f: 0x40021620, + 0x15da0: 0x40061e20, 0x15da1: 0x402bde20, 0x15da2: 0x402c0a20, 0x15da3: 0xcaeb0931, + 0x15da4: 0x402c6220, 0x15da5: 0x402c9820, 0x15da6: 0x402d0820, 0x15da7: 0xcaf13e52, + 0x15da8: 0x402d6820, 0x15da9: 0x402d9a20, 0x15daa: 0x402dcc20, 0x15dab: 0x402dfe20, + 0x15dac: 0xc0000002, 0x15dad: 0x402e8220, 0x15dae: 0x402e9e20, 0x15daf: 0x402ee220, + 0x15db0: 0x402f2c20, 0x15db1: 0x402f5620, 0x15db2: 0x402f7a20, 0x15db3: 0x402fe620, + 0x15db4: 0x40302c20, 0x15db5: 0x40306c20, 0x15db6: 0x4030be20, 0x15db7: 0x4030e220, + 0x15db8: 0x4030f620, 0x15db9: 0x40310020, 0x15dba: 0xcaf70931, 0x15dbb: 0x4003fc20, + 0x15dbc: 0x40094820, 0x15dbd: 0x4003fe20, 0x15dbe: 0x40094c20, 0x15dbf: 0xa0000000, + // Block 0x577, offset 0x15dc0 + 0x15dc0: 0xe0000983, 0x15dc1: 0xe0000980, 0x15dc2: 0xe00008fb, 0x15dc3: 0xe00008f8, + 0x15dc4: 0xe000097d, 0x15dc5: 0xe000097a, 0x15dc6: 0xe0000a38, 0x15dc7: 0xe0000a35, + 0x15dc8: 0xe0000a3e, 0x15dc9: 0xe0000a3b, 0x15dca: 0x402c3820, 0x15dcb: 0x002c3883, + 0x15dcc: 0xe0000a44, 0x15dcd: 0xe0000a41, 0x15dce: 0xe0000a86, 0x15dcf: 0xe0000a83, + 0x15dd0: 0xe0000aaa, 0x15dd1: 0xe0000aa7, 0x15dd2: 0xe0000b46, 0x15dd3: 0xe0000b43, + 0x15dd4: 0xe0000aee, 0x15dd5: 0xe0000aeb, 0x15dd6: 0xe0000b2c, 0x15dd7: 0xe0000b29, + 0x15dd8: 0xe0000b40, 0x15dd9: 0xe0000b3d, 0x15dda: 0xe0000b1a, 0x15ddb: 0xe0000b17, + 0x15ddc: 0xe0000bb8, 0x15ddd: 0xe0000bb5, 0x15dde: 0xe0000bb2, 0x15ddf: 0xe0000baf, + 0x15de0: 0x402d2020, 0x15de1: 0x002d2083, 0x15de2: 0xe0000bca, 0x15de3: 0xe0000bc7, + 0x15de4: 0xe0000bee, 0x15de5: 0xe0000beb, 0x15de6: 0x402d9820, 0x15de7: 0x002d9883, + 0x15de8: 0xe0000c51, 0x15de9: 0xe0000c4e, 0x15dea: 0xe0000c60, 0x15deb: 0xe0000c5d, + 0x15dec: 0xe0000c31, 0x15ded: 0xe0000c2e, 0x15dee: 0xe0000c5a, 0x15def: 0xe0000c57, + 0x15df0: 0xe0000c54, 0x15df1: 0x402da220, 0x15df2: 0xf0000a0a, 0x15df3: 0xf0000404, + 0x15df4: 0xe0000c8a, 0x15df5: 0xe0000c87, 0x15df6: 0xe0000c9f, 0x15df7: 0xe0000c9c, + 0x15df8: 0x402f7220, 0x15df9: 0xe0000ccc, 0x15dfa: 0xe0000cc9, 0x15dfb: 0xe0000cd8, + 0x15dfc: 0xe0000cd5, 0x15dfd: 0xe0000cd2, 0x15dfe: 0xe0000ccf, 0x15dff: 0xe0000d04, + // Block 0x578, offset 0x15e00 + 0x15e00: 0xe0000cfe, 0x15e01: 0xe0000cf8, 0x15e02: 0xe0000cf5, 0x15e03: 0xe0000d51, + 0x15e04: 0xe0000d4e, 0x15e05: 0xe0000d6f, 0x15e06: 0xe0000d6c, 0x15e07: 0xe0000d5d, + 0x15e08: 0xe0000d5a, 0x15e09: 0xf0000404, 0x15e0a: 0x002eda88, 0x15e0b: 0x402eda20, + 0x15e0c: 0xe0000e2e, 0x15e0d: 0xe0000e2b, 0x15e0e: 0xe0000da0, 0x15e0f: 0xe0000d9d, + 0x15e10: 0xe0000de0, 0x15e11: 0xe0000ddd, 0x15e12: 0xe0000e93, 0x15e13: 0xe0000e8f, + 0x15e14: 0xe0000eca, 0x15e15: 0xe0000ec7, 0x15e16: 0xe0000edc, 0x15e17: 0xe0000ed9, + 0x15e18: 0xe0000ed0, 0x15e19: 0xe0000ecd, 0x15e1a: 0xe0000f1f, 0x15e1b: 0xe0000f1c, + 0x15e1c: 0xe0000f2d, 0x15e1d: 0xe0000f2a, 0x15e1e: 0xe0000f47, 0x15e1f: 0xe0000f44, + 0x15e20: 0xe0000f33, 0x15e21: 0xe0000f30, 0x15e22: 0xe0000f99, 0x15e23: 0xe0000f96, + 0x15e24: 0xe0000f8a, 0x15e25: 0xe0000f87, 0x15e26: 0x00303688, 0x15e27: 0x40303620, + 0x15e28: 0xe000102b, 0x15e29: 0xe0001028, 0x15e2a: 0xe000103f, 0x15e2b: 0xe000103c, + 0x15e2c: 0xe0000fe7, 0x15e2d: 0xe0000fe4, 0x15e2e: 0xe0000ff9, 0x15e2f: 0xe0000ff6, + 0x15e30: 0xe0001025, 0x15e31: 0xe0001022, 0x15e32: 0xe0001039, 0x15e33: 0xe0001036, + 0x15e34: 0xe00010d8, 0x15e35: 0xe00010d5, 0x15e36: 0xe000110e, 0x15e37: 0xe000110b, + 0x15e38: 0xe0001117, 0x15e39: 0xe000113b, 0x15e3a: 0xe0001138, 0x15e3b: 0x40312820, + 0x15e3c: 0x00312883, 0x15e3d: 0xe0001147, 0x15e3e: 0xe0001144, 0x15e3f: 0xe0000f64, + // Block 0x579, offset 0x15e40 + 0x15e40: 0xe00009bc, 0x15e41: 0xe00009c0, 0x15e42: 0x002c3a8b, 0x15e43: 0xf0000a04, + 0x15e44: 0x40081c20, 0x15e45: 0xe0000a5e, 0x15e46: 0xe0000a62, 0x15e47: 0x002cc28a, + 0x15e48: 0x40081e20, 0x15e49: 0xf0000a04, 0x15e4a: 0x002d2285, 0x15e4b: 0x002d688b, + 0x15e4c: 0x002d688b, 0x15e4d: 0x002d688b, 0x15e4e: 0x002d6885, 0x15e4f: 0xe000a998, + 0x15e50: 0x002d9a8b, 0x15e51: 0x002d9a8b, 0x15e52: 0x002e228b, 0x15e53: 0x002e2285, + 0x15e54: 0x40082020, 0x15e55: 0x002e9e8b, 0x15e56: 0xf000040a, 0x15e57: 0x40082220, + 0x15e58: 0x40082420, 0x15e59: 0x002f2c8b, 0x15e5a: 0x002f568b, 0x15e5b: 0x002f7a8b, + 0x15e5c: 0x002f7a8b, 0x15e5d: 0x002f7a8b, 0x15e5e: 0x40082620, 0x15e5f: 0x40082820, + 0x15e60: 0xf0001414, 0x15e61: 0xe0000fbd, 0x15e62: 0xf0001414, 0x15e63: 0x40082a20, + 0x15e64: 0x00312a8b, 0x15e65: 0x40082c20, 0x15e66: 0x0032a288, 0x15e67: 0x40082e20, + 0x15e68: 0x00312a8b, 0x15e69: 0x40083020, 0x15e6a: 0x002dfe88, 0x15e6b: 0xe000094d, + 0x15e6c: 0x002c0a8b, 0x15e6d: 0x002c3a8b, 0x15e6e: 0x40083220, 0x15e6f: 0x002c9885, + 0x15e70: 0x002c988b, 0x15e71: 0x002d088b, 0x15e72: 0x002d1e88, 0x15e73: 0x002e828b, + 0x15e74: 0x002ee285, 0x15e75: 0x00389084, 0x15e76: 0x00389284, 0x15e77: 0x00389484, + 0x15e78: 0x00389684, 0x15e79: 0x002d9a85, 0x15e7a: 0x40083420, 0x15e7b: 0xe0000b95, + 0x15e7c: 0x00327e85, 0x15e7d: 0x00325685, 0x15e7e: 0x0032568b, 0x15e7f: 0x00327e8b, + // Block 0x57a, offset 0x15e80 + 0x15eb8: 0xe000a99b, 0x15eb9: 0xe0000e97, 0x15eba: 0x4030a820, 0x15ebb: 0x402d2020, + 0x15ebc: 0x402f4a20, 0x15ebd: 0x402e9820, 0x15ebe: 0x402db220, 0x15ebf: 0x402e9a20, + // Block 0x57b, offset 0x15ec0 + 0x15ec0: 0xccd58051, 0x15ec1: 0xcda08051, 0x15ec2: 0xcda38051, 0x15ec3: 0xcda88051, + 0x15ec4: 0xcdab9311, 0x15ec5: 0xcdae8051, 0x15ec6: 0xcdb18051, 0x15ec7: 0xcdb48051, + 0x15ec8: 0xcdb79371, 0x15ec9: 0xcdb98051, 0x15eca: 0xcdbc8051, 0x15ecb: 0xcdbf8051, + 0x15ecc: 0xcdc28051, 0x15ecd: 0xcdc58051, 0x15ece: 0xcdc88051, 0x15ecf: 0xcdcb8051, + 0x15ed0: 0xcdce8051, 0x15ed1: 0xcaf93e91, 0x15ed2: 0xcdd18051, 0x15ed3: 0xcdd48051, + 0x15ed4: 0xcafd3f91, 0x15ed5: 0xcdd78051, 0x15ed6: 0xcdda8051, 0x15ed7: 0xcddd8051, + 0x15ed8: 0xcde08051, 0x15ed9: 0xcde38051, 0x15eda: 0xcde68051, 0x15edb: 0xcde98051, + 0x15edc: 0xcb014061, 0x15edd: 0xcdec9371, 0x15ede: 0xcb084261, 0x15edf: 0xcdee8051, + 0x15ee0: 0xcdf19371, 0x15ee1: 0xcdf39371, 0x15ee2: 0x404ec420, 0x15ee3: 0xe000a9d7, + 0x15ee4: 0xe000a9dd, 0x15ee5: 0xcb0c4301, 0x15ee6: 0xe000a9e7, 0x15ee7: 0xe000a9ea, + 0x15ee8: 0xe000a9ed, 0x15ee9: 0xcb0f4371, 0x15eea: 0xe000acc4, 0x15eeb: 0xcd198081, + 0x15eec: 0xccd88081, 0x15eed: 0xcc4e6de1, 0x15eee: 0x404eea20, 0x15eef: 0xcd5a8951, + 0x15ef0: 0x404ef420, 0x15ef1: 0xcb8852f1, 0x15ef2: 0x404f0620, 0x15ef3: 0x404eec20, + 0x15ef4: 0x404f0a20, 0x15ef5: 0x404f0220, 0x15ef6: 0x404f0c20, 0x15ef7: 0xcda692e1, + 0x15ef8: 0x404f3020, 0x15ef9: 0x8209278a, 0x15efa: 0x8209278b, 0x15efb: 0xcdf593a1, + 0x15efc: 0xcdf993a1, 0x15efd: 0xcdfd9411, 0x15efe: 0x40510e20, 0x15eff: 0xe000a9d3, + // Block 0x57c, offset 0x15f00 + 0x15f00: 0xe00001ac, 0x15f01: 0xe0000240, 0x15f02: 0xe0000358, 0x15f03: 0xe0000432, + 0x15f04: 0xe0000507, 0x15f05: 0xe00005d1, 0x15f06: 0xe000069c, 0x15f07: 0xe0000744, + 0x15f08: 0xe00007f0, 0x15f09: 0xe0000895, 0x15f0a: 0x40032220, 0x15f0b: 0x40032420, + 0x15f0c: 0xe000a9ab, 0x15f0d: 0xe000a9b2, 0x15f0e: 0xcb0641d1, 0x15f0f: 0xe000a9da, + 0x15f10: 0x404ea020, 0x15f11: 0x404ea220, 0x15f12: 0x404ece20, 0x15f13: 0x404ed020, + 0x15f14: 0x404ed220, 0x15f15: 0x404ed420, 0x15f16: 0x404ef620, 0x15f17: 0x404ef820, + 0x15f18: 0x404efa20, 0x15f19: 0x404efc20, 0x15f1a: 0x404e2620, 0x15f1b: 0x404e3c20, + 0x15f1c: 0x404eb820, 0x15f1d: 0x404eba20, 0x15f1e: 0x40510020, 0x15f1f: 0x40510220, + 0x15f20: 0x40510820, 0x15f21: 0x404e4020, 0x15f22: 0x404f0c20, 0x15f23: 0x404f1820, + 0x15f24: 0x404f1a20, 0x15f25: 0x404ea420, 0x15f26: 0x404ec020, 0x15f27: 0x404f0e20, + 0x15f28: 0x404f1020, 0x15f29: 0x404f1c20, 0x15f2a: 0x404f1e20, 0x15f2b: 0x404f2020, + 0x15f2c: 0x404f2220, 0x15f2d: 0x404f2420, 0x15f2e: 0x404e5c20, 0x15f2f: 0x404ebc20, + 0x15f30: 0x404ebe20, 0x15f31: 0x404ee820, 0x15f32: 0x404ee220, 0x15f33: 0x404ef020, + 0x15f34: 0x404ef220, 0x15f35: 0x404e1620, 0x15f36: 0x404e1a20, 0x15f37: 0x404e1e20, + 0x15f38: 0x404e2a20, 0x15f39: 0x404e3620, 0x15f3a: 0x404e4420, 0x15f3b: 0x404e6420, + 0x15f3c: 0x404e6c20, 0x15f3d: 0x404e7620, 0x15f3e: 0x404e7820, 0x15f3f: 0x404e8020, + // Block 0x57d, offset 0x15f40 + 0x15f40: 0x404e9e20, 0x15f41: 0x404eac20, 0x15f42: 0x40510c20, 0x15f43: 0x404ee020, + 0x15f44: 0x404f0020, 0x15f45: 0x404f0420, 0x15f46: 0x404f1220, 0x15f47: 0x404f2620, + 0x15f48: 0x404f2a20, 0x15f49: 0x404f2e20, 0x15f4a: 0x404f3020, 0x15f4b: 0x404f2820, + 0x15f4c: 0x404f2c20, 0x15f4d: 0xadc11302, 0x15f4e: 0x404e7c20, 0x15f4f: 0x404f3220, + 0x15f50: 0xe00001af, 0x15f51: 0xe0000243, 0x15f52: 0xe000035b, 0x15f53: 0xe0000435, + 0x15f54: 0xe000050a, 0x15f55: 0xe00005d4, 0x15f56: 0xe000069f, 0x15f57: 0xe0000747, + 0x15f58: 0xe00007f3, 0x15f59: 0xe0000898, 0x15f5a: 0x404f3420, 0x15f5b: 0x404f3620, + 0x15f5c: 0x404ee420, 0x15f5d: 0x404f0820, 0x15f5e: 0x4007a820, 0x15f5f: 0x4007aa20, + 0x15f60: 0x00379888, 0x15f61: 0x00379c88, 0x15f62: 0x0037a088, 0x15f63: 0x0037a488, + 0x15f64: 0x0037a888, 0x15f65: 0x0037ac88, 0x15f66: 0x0037b088, 0x15f67: 0x0037b888, + 0x15f68: 0x0037bc88, 0x15f69: 0x0037c088, 0x15f6a: 0x0037c488, 0x15f6b: 0x0037c888, + 0x15f6c: 0x0037cc88, 0x15f6d: 0x0037d488, 0x15f6e: 0x0037d888, 0x15f6f: 0x0037dc88, + 0x15f70: 0x0037e088, 0x15f71: 0x0037e488, 0x15f72: 0x0037e888, 0x15f73: 0x0037f088, + 0x15f74: 0x0037f488, 0x15f75: 0x0037f888, 0x15f76: 0x0037fc88, 0x15f77: 0x00380088, + 0x15f78: 0x00380488, 0x15f79: 0x00380888, 0x15f7a: 0x00380c88, 0x15f7b: 0x00381088, + 0x15f7c: 0x00381488, 0x15f7d: 0x00381888, 0x15f7e: 0x00381c88, 0x15f7f: 0x00382488, + // Block 0x57e, offset 0x15f80 + 0x15f80: 0xa0000000, 0x15f81: 0xa0000000, 0x15f82: 0xa0000000, 0x15f83: 0xa0000000, + 0x15f84: 0xa0000000, 0x15f85: 0xa0000000, 0x15f86: 0xa0000000, 0x15f87: 0xa0000000, + 0x15f88: 0xa0000000, 0x15f89: 0x40020020, 0x15f8a: 0x40020220, 0x15f8b: 0x40020420, + 0x15f8c: 0x40020620, 0x15f8d: 0x40020820, 0x15f8e: 0xa0000000, 0x15f8f: 0xa0000000, + 0x15f90: 0xa0000000, 0x15f91: 0xa0000000, 0x15f92: 0xa0000000, 0x15f93: 0xa0000000, + 0x15f94: 0xa0000000, 0x15f95: 0xa0000000, 0x15f96: 0xa0000000, 0x15f97: 0xa0000000, + 0x15f98: 0xa0000000, 0x15f99: 0xa0000000, 0x15f9a: 0xa0000000, 0x15f9b: 0xa0000000, + 0x15f9c: 0xa0000000, 0x15f9d: 0xa0000000, 0x15f9e: 0xa0000000, 0x15f9f: 0xa0000000, + 0x15fa0: 0x40021220, 0x15fa1: 0x4002ba20, 0x15fa2: 0x4003e020, 0x15fa3: 0x4004ea20, + 0x15fa4: 0x4027de20, 0x15fa5: 0x4004ec20, 0x15fa6: 0x4004e620, 0x15fa7: 0x4003d220, + 0x15fa8: 0x4003f420, 0x15fa9: 0x4003f620, 0x15faa: 0x4004d820, 0x15fab: 0x40093820, + 0x15fac: 0x40024020, 0x15fad: 0x40021a20, 0x15fae: 0x4002e420, 0x15faf: 0x4004e220, + 0x15fb0: 0x4029cc20, 0x15fb1: 0x4029ce20, 0x15fb2: 0x4029d020, 0x15fb3: 0x4029d220, + 0x15fb4: 0x4029d420, 0x15fb5: 0x4029d620, 0x15fb6: 0x4029d820, 0x15fb7: 0x4029da20, + 0x15fb8: 0x4029dc20, 0x15fb9: 0x4029de20, 0x15fba: 0x40026c20, 0x15fbb: 0x40026220, + 0x15fbc: 0x40094020, 0x15fbd: 0x40094220, 0x15fbe: 0x40094420, 0x15fbf: 0x4002c420, + // Block 0x57f, offset 0x15fc0 + 0x15fc0: 0x4004d620, 0x15fc1: 0xce030b93, 0x15fc2: 0x002c0a88, 0x15fc3: 0x002c3a88, + 0x15fc4: 0x002c6288, 0x15fc5: 0xc39e0be1, 0x15fc6: 0x002d0888, 0x15fc7: 0x002d2288, + 0x15fc8: 0x002d6888, 0x15fc9: 0x002d9a88, 0x15fca: 0x002dcc88, 0x15fcb: 0x002dfe88, + 0x15fcc: 0xc0030002, 0x15fcd: 0x002e8288, 0x15fce: 0x002e9e88, 0x15fcf: 0xc3a30b21, + 0x15fd0: 0x002f2c88, 0x15fd1: 0x002f5688, 0x15fd2: 0x002f7a88, 0x15fd3: 0x002fe688, + 0x15fd4: 0x00302c88, 0x15fd5: 0xc3900b21, 0x15fd6: 0x0030be88, 0x15fd7: 0x0030e288, + 0x15fd8: 0x0030f688, 0x15fd9: 0x00310088, 0x15fda: 0x00312a88, 0x15fdb: 0x4003f820, + 0x15fdc: 0x4004e420, 0x15fdd: 0x4003fa20, 0x15fde: 0x40062420, 0x15fdf: 0x40021620, + 0x15fe0: 0x40061e20, 0x15fe1: 0xcdff0b52, 0x15fe2: 0x402c0a20, 0x15fe3: 0x402c3a20, + 0x15fe4: 0x402c6220, 0x15fe5: 0xc39c0be1, 0x15fe6: 0x402d0820, 0x15fe7: 0x402d2220, + 0x15fe8: 0x402d6820, 0x15fe9: 0x402d9a20, 0x15fea: 0x402dcc20, 0x15feb: 0x402dfe20, + 0x15fec: 0xc0000002, 0x15fed: 0x402e8220, 0x15fee: 0x402e9e20, 0x15fef: 0xc3a00b21, + 0x15ff0: 0x402f2c20, 0x15ff1: 0x402f5620, 0x15ff2: 0x402f7a20, 0x15ff3: 0x402fe620, + 0x15ff4: 0x40302c20, 0x15ff5: 0xc38d0b21, 0x15ff6: 0x4030be20, 0x15ff7: 0x4030e220, + 0x15ff8: 0x4030f620, 0x15ff9: 0x40310020, 0x15ffa: 0x40312a20, 0x15ffb: 0x4003fc20, + 0x15ffc: 0x40094820, 0x15ffd: 0x4003fe20, 0x15ffe: 0x40094c20, 0x15fff: 0xa0000000, + // Block 0x580, offset 0x16000 + 0x16000: 0xa0000000, 0x16001: 0xa0000000, 0x16002: 0xa0000000, 0x16003: 0xa0000000, + 0x16004: 0xa0000000, 0x16005: 0xa0000000, 0x16006: 0xa0000000, 0x16007: 0xa0000000, + 0x16008: 0xa0000000, 0x16009: 0x40020020, 0x1600a: 0x40020220, 0x1600b: 0x40020420, + 0x1600c: 0x40020620, 0x1600d: 0x40020820, 0x1600e: 0xa0000000, 0x1600f: 0xa0000000, + 0x16010: 0xa0000000, 0x16011: 0xa0000000, 0x16012: 0xa0000000, 0x16013: 0xa0000000, + 0x16014: 0xa0000000, 0x16015: 0xa0000000, 0x16016: 0xa0000000, 0x16017: 0xa0000000, + 0x16018: 0xa0000000, 0x16019: 0xa0000000, 0x1601a: 0xa0000000, 0x1601b: 0xa0000000, + 0x1601c: 0xa0000000, 0x1601d: 0xa0000000, 0x1601e: 0xa0000000, 0x1601f: 0xa0000000, + 0x16020: 0x40021220, 0x16021: 0x4002ba20, 0x16022: 0x4003e020, 0x16023: 0x4004ea20, + 0x16024: 0x4027de20, 0x16025: 0x4004ec20, 0x16026: 0x4004e620, 0x16027: 0x4003d220, + 0x16028: 0x4003f420, 0x16029: 0x4003f620, 0x1602a: 0x4004d820, 0x1602b: 0x40093820, + 0x1602c: 0x40024020, 0x1602d: 0x40021a20, 0x1602e: 0x4002e420, 0x1602f: 0x4004e220, + 0x16030: 0x4029cc20, 0x16031: 0x4029ce20, 0x16032: 0x4029d020, 0x16033: 0x4029d220, + 0x16034: 0x4029d420, 0x16035: 0x4029d620, 0x16036: 0x4029d820, 0x16037: 0x4029da20, + 0x16038: 0x4029dc20, 0x16039: 0x4029de20, 0x1603a: 0x40026c20, 0x1603b: 0x40026220, + 0x1603c: 0x40094020, 0x1603d: 0x40094220, 0x1603e: 0x40094420, 0x1603f: 0x4002c420, + // Block 0x581, offset 0x16040 + 0x16040: 0x4004d620, 0x16041: 0x002bde88, 0x16042: 0x002c0a88, 0x16043: 0x002c3a88, + 0x16044: 0x002c6288, 0x16045: 0xce0a2741, 0x16046: 0x002d0888, 0x16047: 0x002d2288, + 0x16048: 0x002d6888, 0x16049: 0x002d9a88, 0x1604a: 0x002dcc88, 0x1604b: 0x002dfe88, + 0x1604c: 0xc0030002, 0x1604d: 0x002e8288, 0x1604e: 0x002e9e88, 0x1604f: 0xc33f2741, + 0x16050: 0x002f2c88, 0x16051: 0x002f5688, 0x16052: 0x002f7a88, 0x16053: 0xc3430991, + 0x16054: 0x00302c88, 0x16055: 0x00306c88, 0x16056: 0x0030be88, 0x16057: 0x0030e288, + 0x16058: 0x0030f688, 0x16059: 0x00310088, 0x1605a: 0x00312a88, 0x1605b: 0x4003f820, + 0x1605c: 0x4004e420, 0x1605d: 0x4003fa20, 0x1605e: 0x40062420, 0x1605f: 0x40021620, + 0x16060: 0x40061e20, 0x16061: 0x402bde20, 0x16062: 0x402c0a20, 0x16063: 0x402c3a20, + 0x16064: 0x402c6220, 0x16065: 0xce082741, 0x16066: 0x402d0820, 0x16067: 0x402d2220, + 0x16068: 0x402d6820, 0x16069: 0x402d9a20, 0x1606a: 0x402dcc20, 0x1606b: 0x402dfe20, + 0x1606c: 0xc0000002, 0x1606d: 0x402e8220, 0x1606e: 0x402e9e20, 0x1606f: 0xc33d2741, + 0x16070: 0x402f2c20, 0x16071: 0x402f5620, 0x16072: 0x402f7a20, 0x16073: 0xc3410991, + 0x16074: 0x40302c20, 0x16075: 0x40306c20, 0x16076: 0x4030be20, 0x16077: 0x4030e220, + 0x16078: 0x4030f620, 0x16079: 0x40310020, 0x1607a: 0x40312a20, 0x1607b: 0x4003fc20, + 0x1607c: 0x40094820, 0x1607d: 0x4003fe20, 0x1607e: 0x40094c20, 0x1607f: 0xa0000000, + // Block 0x582, offset 0x16080 + 0x16080: 0xe00008f5, 0x16081: 0xe00008ef, 0x16082: 0xe0000921, 0x16083: 0xe0000969, + 0x16084: 0xe000095b, 0x16085: 0xe000094d, 0x16086: 0xe00009dd, 0x16087: 0xe0000a53, + 0x16088: 0xe0000ae8, 0x16089: 0xe0000ae2, 0x1608a: 0x002c9a83, 0x1608b: 0xe0000b20, + 0x1608c: 0xe0000c2b, 0x1608d: 0xe0000c25, 0x1608e: 0xe0000c37, 0x1608f: 0xe0000c43, + 0x16090: 0xe0000ab3, 0x16091: 0xe0000d63, 0x16092: 0xe0000d9a, 0x16093: 0xe0000d94, + 0x16094: 0x002ee483, 0x16095: 0xe0000de6, 0x16096: 0xe0000dd2, 0x16097: 0x40093e20, + 0x16098: 0xe0000e12, 0x16099: 0xe0000fe1, 0x1609a: 0xe0000fdb, 0x1609b: 0xe0000fed, + 0x1609c: 0xe0000fff, 0x1609d: 0xe0001102, 0x1609e: 0x00318888, 0x1609f: 0xe0000f7b, + 0x160a0: 0xe00008f2, 0x160a1: 0xe00008ec, 0x160a2: 0xe000091e, 0x160a3: 0xe0000966, + 0x160a4: 0xe0000958, 0x160a5: 0xe000094a, 0x160a6: 0xe00009d5, 0x160a7: 0xe0000a4d, + 0x160a8: 0xe0000ae5, 0x160a9: 0xe0000adf, 0x160aa: 0x402c9a20, 0x160ab: 0xe0000b1d, + 0x160ac: 0xe0000c28, 0x160ad: 0xe0000c22, 0x160ae: 0xe0000c34, 0x160af: 0xe0000c40, + 0x160b0: 0xe0000aad, 0x160b1: 0xe0000d60, 0x160b2: 0xe0000d97, 0x160b3: 0xe0000d91, + 0x160b4: 0x402ee420, 0x160b5: 0xe0000de3, 0x160b6: 0xe0000dcf, 0x160b7: 0x40093c20, + 0x160b8: 0xe0000e0f, 0x160b9: 0xe0000fde, 0x160ba: 0xe0000fd8, 0x160bb: 0xe0000fea, + 0x160bc: 0xe0000ffc, 0x160bd: 0xe00010ff, 0x160be: 0x40318820, 0x160bf: 0xe0001114, + // Block 0x583, offset 0x160c0 + 0x160c0: 0xe0000cfe, 0x160c1: 0xe0000cf8, 0x160c2: 0xe0000cf5, 0x160c3: 0xe0000d51, + 0x160c4: 0xe0000d4e, 0x160c5: 0xe0000d6f, 0x160c6: 0xe0000d6c, 0x160c7: 0xe0000d5d, + 0x160c8: 0xe0000d5a, 0x160c9: 0xf0000404, 0x160ca: 0x002eda88, 0x160cb: 0x402eda20, + 0x160cc: 0xe0000e2e, 0x160cd: 0xe0000e2b, 0x160ce: 0xe0000da0, 0x160cf: 0xe0000d9d, + 0x160d0: 0xe0000de0, 0x160d1: 0xe0000ddd, 0x160d2: 0xe0000e93, 0x160d3: 0xe0000e8f, + 0x160d4: 0xe0000eca, 0x160d5: 0xe0000ec7, 0x160d6: 0xe0000edc, 0x160d7: 0xe0000ed9, + 0x160d8: 0xe0000ed0, 0x160d9: 0xe0000ecd, 0x160da: 0xe0000f1f, 0x160db: 0xe0000f1c, + 0x160dc: 0xe0000f2d, 0x160dd: 0xe0000f2a, 0x160de: 0xe0000f47, 0x160df: 0xe0000f44, + 0x160e0: 0x002fe883, 0x160e1: 0x402fe820, 0x160e2: 0xe0000f99, 0x160e3: 0xe0000f96, + 0x160e4: 0xe0000f8a, 0x160e5: 0xe0000f87, 0x160e6: 0x00303688, 0x160e7: 0x40303620, + 0x160e8: 0xe000102b, 0x160e9: 0xe0001028, 0x160ea: 0xe000103f, 0x160eb: 0xe000103c, + 0x160ec: 0xe0000fe7, 0x160ed: 0xe0000fe4, 0x160ee: 0xe0000ff9, 0x160ef: 0xe0000ff6, + 0x160f0: 0xe0001025, 0x160f1: 0xe0001022, 0x160f2: 0xe0001039, 0x160f3: 0xe0001036, + 0x160f4: 0xe00010d8, 0x160f5: 0xe00010d5, 0x160f6: 0xe000110e, 0x160f7: 0xe000110b, + 0x160f8: 0xe0001117, 0x160f9: 0xe000113b, 0x160fa: 0xe0001138, 0x160fb: 0xe000114d, + 0x160fc: 0xe000114a, 0x160fd: 0xe0001147, 0x160fe: 0xe0001144, 0x160ff: 0xe0000f64, + // Block 0x584, offset 0x16100 + 0x16100: 0xe00010d2, 0x16101: 0xe00010cf, 0x16102: 0xe00010cc, 0x16103: 0xe00010c9, + 0x16104: 0xe00010e1, 0x16105: 0xe00010de, 0x16106: 0xe00010e7, 0x16107: 0xe00010e4, + 0x16108: 0xe00010ed, 0x16109: 0xe00010ea, 0x1610a: 0xe00010fc, 0x1610b: 0xe00010f9, + 0x1610c: 0xe00010f6, 0x1610d: 0xe00010f3, 0x1610e: 0xe0001123, 0x1610f: 0xe0001120, + 0x16110: 0xe0001141, 0x16111: 0xe000113e, 0x16112: 0xe0001153, 0x16113: 0xe0001150, + 0x16114: 0xe0001159, 0x16115: 0xe0001156, 0x16116: 0xe0000c15, 0x16117: 0xe0000f8d, + 0x16118: 0xe00010db, 0x16119: 0xe0001111, 0x1611a: 0xf0000404, 0x1611b: 0xe0000f70, + 0x1611c: 0x40300420, 0x1611d: 0x40300620, 0x1611e: 0xe0000f7f, 0x1611f: 0x402c9620, + 0x16120: 0xe000099b, 0x16121: 0xe0000998, 0x16122: 0xe0000989, 0x16123: 0xe0000986, + 0x16124: 0xe0000928, 0x16125: 0xe0000924, 0x16126: 0xe0000930, 0x16127: 0xe000092c, + 0x16128: 0xe0000940, 0x16129: 0xe000093c, 0x1612a: 0xe0000938, 0x1612b: 0xe0000934, + 0x1612c: 0xe00009aa, 0x1612d: 0xe00009a6, 0x1612e: 0xe0000902, 0x1612f: 0xe00008fe, + 0x16130: 0xe000090a, 0x16131: 0xe0000906, 0x16132: 0xe000091a, 0x16133: 0xe0000916, + 0x16134: 0xe0000912, 0x16135: 0xe000090e, 0x16136: 0xe00009a2, 0x16137: 0xe000099e, + 0x16138: 0xe0000b6e, 0x16139: 0xe0000b6b, 0x1613a: 0xe0000b5c, 0x1613b: 0xe0000b59, + 0x1613c: 0xe0000b26, 0x1613d: 0xe0000b23, 0x1613e: 0xe000acd3, 0x1613f: 0xe000acd0, + // Block 0x585, offset 0x16140 + 0x16140: 0xe000acd9, 0x16141: 0xe000acd6, 0x16142: 0xe000ace5, 0x16143: 0xe000ace2, + 0x16144: 0xe000acdf, 0x16145: 0xe000acdc, 0x16146: 0xe000aceb, 0x16147: 0xe000ace8, + 0x16148: 0xe0000c66, 0x16149: 0xe0000c63, 0x1614a: 0xe0000c78, 0x1614b: 0xe0000c75, + 0x1614c: 0xe0000e84, 0x1614d: 0xe0000e81, 0x1614e: 0xe0000e44, 0x1614f: 0xe0000e41, + 0x16150: 0xe000acf1, 0x16151: 0xe000acee, 0x16152: 0xe000acf7, 0x16153: 0xe000acf4, + 0x16154: 0xe000acfd, 0x16155: 0xe000acfa, 0x16156: 0xe0002946, 0x16157: 0xe0002943, + 0x16158: 0xe000ad03, 0x16159: 0xe000ad00, 0x1615a: 0xe0000e5d, 0x1615b: 0xe0000e59, + 0x1615c: 0xe0000e65, 0x1615d: 0xe0000e61, 0x1615e: 0xe0000e75, 0x1615f: 0xe0000e71, + 0x16160: 0xe0000e6d, 0x16161: 0xe0000e69, 0x16162: 0xe0000e7d, 0x16163: 0xe0000e79, + 0x16164: 0xe000108d, 0x16165: 0xe000108a, 0x16166: 0xe000104d, 0x16167: 0xe000104a, + 0x16168: 0xe0001066, 0x16169: 0xe0001062, 0x1616a: 0xe000106e, 0x1616b: 0xe000106a, + 0x1616c: 0xe000107e, 0x1616d: 0xe000107a, 0x1616e: 0xe0001076, 0x1616f: 0xe0001072, + 0x16170: 0xe0001086, 0x16171: 0xe0001082, 0x16172: 0xe0001108, 0x16173: 0xe0001105, + 0x16174: 0xe0001135, 0x16175: 0xe0001132, 0x16176: 0xe000112f, 0x16177: 0xe000112c, + 0x16178: 0xe000111d, 0x16179: 0xe000111a, 0x1617a: 0xe0000d0a, 0x1617b: 0xe0000d07, + 0x1617c: 0x0030d888, 0x1617d: 0x4030d820, 0x1617e: 0x00312088, 0x1617f: 0x40312020, + // Block 0x586, offset 0x16180 + 0x16180: 0xa0000000, 0x16181: 0xa0000000, 0x16182: 0xa0000000, 0x16183: 0xa0000000, + 0x16184: 0xa0000000, 0x16185: 0xa0000000, 0x16186: 0xa0000000, 0x16187: 0xa0000000, + 0x16188: 0xa0000000, 0x16189: 0x40020020, 0x1618a: 0x40020220, 0x1618b: 0x40020420, + 0x1618c: 0x40020620, 0x1618d: 0x40020820, 0x1618e: 0xa0000000, 0x1618f: 0xa0000000, + 0x16190: 0xa0000000, 0x16191: 0xa0000000, 0x16192: 0xa0000000, 0x16193: 0xa0000000, + 0x16194: 0xa0000000, 0x16195: 0xa0000000, 0x16196: 0xa0000000, 0x16197: 0xa0000000, + 0x16198: 0xa0000000, 0x16199: 0xa0000000, 0x1619a: 0xa0000000, 0x1619b: 0xa0000000, + 0x1619c: 0xa0000000, 0x1619d: 0xa0000000, 0x1619e: 0xa0000000, 0x1619f: 0xa0000000, + 0x161a0: 0x40021220, 0x161a1: 0x4002ba20, 0x161a2: 0x4003e020, 0x161a3: 0x4004ea20, + 0x161a4: 0x4027de20, 0x161a5: 0x4004ec20, 0x161a6: 0x4004e620, 0x161a7: 0x4003d220, + 0x161a8: 0x4003f420, 0x161a9: 0x4003f620, 0x161aa: 0x4004d820, 0x161ab: 0x40093820, + 0x161ac: 0x40024020, 0x161ad: 0x40021a20, 0x161ae: 0x4002e420, 0x161af: 0x4004e220, + 0x161b0: 0x4029cc20, 0x161b1: 0x4029ce20, 0x161b2: 0x4029d020, 0x161b3: 0x4029d220, + 0x161b4: 0x4029d420, 0x161b5: 0x4029d620, 0x161b6: 0x4029d820, 0x161b7: 0x4029da20, + 0x161b8: 0x4029dc20, 0x161b9: 0x4029de20, 0x161ba: 0x40026c20, 0x161bb: 0x40026220, + 0x161bc: 0x40094020, 0x161bd: 0x40094220, 0x161be: 0x40094420, 0x161bf: 0x4002c420, + // Block 0x587, offset 0x161c0 + 0x161c0: 0x4004d620, 0x161c1: 0x002bde88, 0x161c2: 0x002c0a88, 0x161c3: 0xce0e09c2, + 0x161c4: 0xce1309c2, 0x161c5: 0x002c9888, 0x161c6: 0x002d0888, 0x161c7: 0x002d2288, + 0x161c8: 0x002d6888, 0x161c9: 0x002d9a88, 0x161ca: 0x002dcc88, 0x161cb: 0xce1809c2, + 0x161cc: 0xc0030002, 0x161cd: 0x002e8288, 0x161ce: 0xce1d26f2, 0x161cf: 0x002ee288, + 0x161d0: 0xce2209c2, 0x161d1: 0x002f5688, 0x161d2: 0x002f7a88, 0x161d3: 0xce2709b1, + 0x161d4: 0x00302c88, 0x161d5: 0x00306c88, 0x161d6: 0x0030be88, 0x161d7: 0x0030e288, + 0x161d8: 0x0030f688, 0x161d9: 0x00310088, 0x161da: 0x00312a88, 0x161db: 0x4003f820, + 0x161dc: 0x4004e420, 0x161dd: 0x4003fa20, 0x161de: 0x40062420, 0x161df: 0x40021620, + 0x161e0: 0x40061e20, 0x161e1: 0x402bde20, 0x161e2: 0x402c0a20, 0x161e3: 0xce0c09b1, + 0x161e4: 0xce1109b1, 0x161e5: 0x402c9820, 0x161e6: 0x402d0820, 0x161e7: 0x402d2220, + 0x161e8: 0x402d6820, 0x161e9: 0x402d9a20, 0x161ea: 0x402dcc20, 0x161eb: 0xce1609b1, + 0x161ec: 0xc0000002, 0x161ed: 0x402e8220, 0x161ee: 0xce1b26e1, 0x161ef: 0x402ee220, + 0x161f0: 0xce2009b1, 0x161f1: 0x402f5620, 0x161f2: 0x402f7a20, 0x161f3: 0xce2509b1, + 0x161f4: 0x40302c20, 0x161f5: 0x40306c20, 0x161f6: 0x4030be20, 0x161f7: 0x4030e220, + 0x161f8: 0x4030f620, 0x161f9: 0x40310020, 0x161fa: 0x40312a20, 0x161fb: 0x4003fc20, + 0x161fc: 0x40094820, 0x161fd: 0x4003fe20, 0x161fe: 0x40094c20, 0x161ff: 0xa0000000, + // Block 0x588, offset 0x16200 + 0x16201: 0x40421220, 0x16202: 0x40421420, 0x16203: 0x40421620, + 0x16205: 0x4041f620, 0x16206: 0x4041f820, 0x16207: 0x4041fa20, + 0x16208: 0x4041fc20, 0x16209: 0x4041fe20, 0x1620a: 0x40420020, 0x1620b: 0x40420220, + 0x1620c: 0x40420620, 0x1620f: 0x40420a20, + 0x16210: 0x40420c20, 0x16213: 0x40420e20, + 0x16214: 0x40421020, 0x16215: 0xce299441, 0x16216: 0x40421420, 0x16217: 0x40421620, + 0x16218: 0x40421820, 0x16219: 0x40421a20, 0x1621a: 0x40421c20, 0x1621b: 0x40421e20, + 0x1621c: 0x40422020, 0x1621d: 0x40422220, 0x1621e: 0x40422420, 0x1621f: 0x40422620, + 0x16220: 0x40422820, 0x16221: 0x40422a20, 0x16222: 0x40422c20, 0x16223: 0x40422e20, + 0x16224: 0x40423020, 0x16225: 0x40423220, 0x16226: 0x40423420, 0x16227: 0x40423620, + 0x16228: 0x40423820, 0x1622a: 0x40423a20, 0x1622b: 0x40423c20, + 0x1622c: 0x40423e20, 0x1622d: 0x40424020, 0x1622e: 0x40424220, 0x1622f: 0x40424420, + 0x16230: 0x40424820, 0x16232: 0x40424a20, 0x16233: 0x40424c20, + 0x16235: 0x40424e20, 0x16236: 0x40425220, 0x16237: 0x40425420, + 0x16238: 0x40425620, 0x16239: 0x40425820, + 0x1623c: 0xa070f102, 0x1623d: 0x40425a20, 0x1623e: 0x40425c20, 0x1623f: 0x40425e20, + // Block 0x589, offset 0x16240 + 0x16240: 0x40426020, 0x16241: 0x40426220, 0x16242: 0x40426420, 0x16243: 0x40426620, + 0x16244: 0x40426820, 0x16247: 0xc05d01e1, + 0x16248: 0x40427020, 0x1624b: 0x40427220, + 0x1624c: 0x40427420, 0x1624d: 0x8209213b, + 0x16256: 0x40427820, 0x16257: 0x40427a20, + 0x1625c: 0xe000185d, 0x1625d: 0xe0001860, 0x1625f: 0x40424421, + 0x16260: 0x40420420, 0x16261: 0x40420820, 0x16262: 0x40426a20, 0x16263: 0x40426c20, + 0x16266: 0xe0000176, 0x16267: 0xe0000204, + 0x16268: 0xe000031f, 0x16269: 0xe00003f9, 0x1626a: 0xe00004d4, 0x1626b: 0xe000059e, + 0x1626c: 0xe0000669, 0x1626d: 0xe0000711, 0x1626e: 0xe00007bd, 0x1626f: 0xe0000862, + 0x16270: 0x40073c20, 0x16271: 0x40425020, 0x16272: 0x40283c20, 0x16273: 0x40283e20, + 0x16274: 0x40284020, 0x16275: 0x40284220, 0x16276: 0x40284420, 0x16277: 0x40284620, + // Block 0x58a, offset 0x16280 + 0x16281: 0xa000f902, 0x16282: 0xa000f802, 0x16283: 0xa000f402, + 0x16285: 0x40410620, 0x16286: 0x40410820, 0x16287: 0x40411020, + 0x16288: 0x40411220, 0x16289: 0x40410020, 0x1628a: 0x40410220, + 0x1628f: 0x40411420, + 0x16290: 0x40410a20, 0x16293: 0x40410420, + 0x16294: 0x40410c20, 0x16295: 0x40411c20, 0x16296: 0x40411e20, 0x16297: 0x40412020, + 0x16298: 0x40412220, 0x16299: 0x40412420, 0x1629a: 0x40412620, 0x1629b: 0x40412820, + 0x1629c: 0x40412a20, 0x1629d: 0x40412c20, 0x1629e: 0x40412e20, 0x1629f: 0x40413020, + 0x162a0: 0x40413220, 0x162a1: 0x40413420, 0x162a2: 0x40413620, 0x162a3: 0x40413820, + 0x162a4: 0x40413a20, 0x162a5: 0x40413c20, 0x162a6: 0x40413e20, 0x162a7: 0x40414020, + 0x162a8: 0x40414220, 0x162aa: 0x40414420, 0x162ab: 0x40414620, + 0x162ac: 0x40414820, 0x162ad: 0x40414a20, 0x162ae: 0x40414c20, 0x162af: 0x40414e20, + 0x162b0: 0x40415220, 0x162b2: 0x40415420, 0x162b3: 0xe000ad15, + 0x162b5: 0x40415620, 0x162b6: 0xe000ad06, + 0x162b8: 0x40411620, 0x162b9: 0x40411820, + 0x162bc: 0xa000fa02, 0x162be: 0x40415a20, 0x162bf: 0x40415c20, + // Block 0x58b, offset 0x162c0 + 0x162c0: 0x40415e20, 0x162c1: 0x40416020, 0x162c2: 0x40416220, + 0x162c7: 0x40416420, + 0x162c8: 0x40416620, 0x162cb: 0x40416820, + 0x162cc: 0x40416a20, 0x162cd: 0x40415a20, + 0x162d1: 0x40411a20, + 0x162d9: 0xe000ad09, 0x162da: 0xe000ad0c, 0x162db: 0xe000ad0f, + 0x162dc: 0x40415820, 0x162de: 0xe000ad12, + 0x162e6: 0xe0000170, 0x162e7: 0xe00001fe, + 0x162e8: 0xe0000319, 0x162e9: 0xe00003f3, 0x162ea: 0xe00004ce, 0x162eb: 0xe0000598, + 0x162ec: 0xe0000663, 0x162ed: 0xe000070b, 0x162ee: 0xe00007b7, 0x162ef: 0xe000085c, + 0x162f0: 0xa000f702, 0x162f1: 0xa000f602, 0x162f2: 0x40410e20, 0x162f3: 0x4040fe20, + 0x162f4: 0x4040fc20, 0x162f5: 0x40415020, + // Block 0x58c, offset 0x16300 + 0x16300: 0xa0000000, 0x16301: 0xa0000000, 0x16302: 0xa0000000, 0x16303: 0xa0000000, + 0x16304: 0xa0000000, 0x16305: 0xa0000000, 0x16306: 0xa0000000, 0x16307: 0xa0000000, + 0x16308: 0xa0000000, 0x16309: 0x40020020, 0x1630a: 0x40020220, 0x1630b: 0x40020420, + 0x1630c: 0x40020620, 0x1630d: 0x40020820, 0x1630e: 0xa0000000, 0x1630f: 0xa0000000, + 0x16310: 0xa0000000, 0x16311: 0xa0000000, 0x16312: 0xa0000000, 0x16313: 0xa0000000, + 0x16314: 0xa0000000, 0x16315: 0xa0000000, 0x16316: 0xa0000000, 0x16317: 0xa0000000, + 0x16318: 0xa0000000, 0x16319: 0xa0000000, 0x1631a: 0xa0000000, 0x1631b: 0xa0000000, + 0x1631c: 0xa0000000, 0x1631d: 0xa0000000, 0x1631e: 0xa0000000, 0x1631f: 0xa0000000, + 0x16320: 0x40021220, 0x16321: 0x4002ba20, 0x16322: 0x4003e020, 0x16323: 0x4004ea20, + 0x16324: 0x4027de20, 0x16325: 0x4004ec20, 0x16326: 0x4004e620, 0x16327: 0x4003d220, + 0x16328: 0x4003f420, 0x16329: 0x4003f620, 0x1632a: 0x4004d820, 0x1632b: 0x40093820, + 0x1632c: 0x40024020, 0x1632d: 0x40021a20, 0x1632e: 0x4002e420, 0x1632f: 0x4004e220, + 0x16330: 0x4029cc20, 0x16331: 0x4029ce20, 0x16332: 0x4029d020, 0x16333: 0x4029d220, + 0x16334: 0x4029d420, 0x16335: 0x4029d620, 0x16336: 0x4029d820, 0x16337: 0x4029da20, + 0x16338: 0x4029dc20, 0x16339: 0x4029de20, 0x1633a: 0x40026c20, 0x1633b: 0x40026220, + 0x1633c: 0x40094020, 0x1633d: 0x40094220, 0x1633e: 0x40094420, 0x1633f: 0x4002c420, + // Block 0x58d, offset 0x16340 + 0x16340: 0x4004d620, 0x16341: 0xce2d0be1, 0x16342: 0x002c0a88, 0x16343: 0xc33531a1, + 0x16344: 0x002c6288, 0x16345: 0xce0a0be1, 0x16346: 0x002d0888, 0x16347: 0x002d2288, + 0x16348: 0x002d6888, 0x16349: 0x002d9a88, 0x1634a: 0x002dcc88, 0x1634b: 0x002dfe88, + 0x1634c: 0xc0030002, 0x1634d: 0x002e8288, 0x1634e: 0xc53a31a1, 0x1634f: 0xc33f31a1, + 0x16350: 0x002f2c88, 0x16351: 0x002f5688, 0x16352: 0x002f7a88, 0x16353: 0xc34331a1, + 0x16354: 0x00302c88, 0x16355: 0x00306c88, 0x16356: 0x0030be88, 0x16357: 0x0030e288, + 0x16358: 0x0030f688, 0x16359: 0x00310088, 0x1635a: 0xce3294a1, 0x1635b: 0x4003f820, + 0x1635c: 0x4004e420, 0x1635d: 0x4003fa20, 0x1635e: 0x40062420, 0x1635f: 0x40021620, + 0x16360: 0x40061e20, 0x16361: 0xce2b0be1, 0x16362: 0x402c0a20, 0x16363: 0xc33331a1, + 0x16364: 0x402c6220, 0x16365: 0xce080be1, 0x16366: 0x402d0820, 0x16367: 0x402d2220, + 0x16368: 0x402d6820, 0x16369: 0x402d9a20, 0x1636a: 0x402dcc20, 0x1636b: 0x402dfe20, + 0x1636c: 0xc0000002, 0x1636d: 0x402e8220, 0x1636e: 0xc52731a1, 0x1636f: 0xc33d31a1, + 0x16370: 0x402f2c20, 0x16371: 0x402f5620, 0x16372: 0x402f7a20, 0x16373: 0xc34131a1, + 0x16374: 0x40302c20, 0x16375: 0x40306c20, 0x16376: 0x4030be20, 0x16377: 0x4030e220, + 0x16378: 0x4030f620, 0x16379: 0x40310020, 0x1637a: 0xce2f94a1, 0x1637b: 0x4003fc20, + 0x1637c: 0x40094820, 0x1637d: 0x4003fe20, 0x1637e: 0x40094c20, 0x1637f: 0xa0000000, + // Block 0x58e, offset 0x16380 + 0x16380: 0xe00008f5, 0x16381: 0xe00008ef, 0x16382: 0xe0000921, 0x16383: 0xe0000969, + 0x16384: 0xe000095b, 0x16385: 0xe000094d, 0x16386: 0xe00009dd, 0x16387: 0xe0000a53, + 0x16388: 0xe0000ae8, 0x16389: 0xe0000ae2, 0x1638a: 0xe0000af4, 0x1638b: 0xe0000b20, + 0x1638c: 0xe0000c2b, 0x1638d: 0xe0000c25, 0x1638e: 0xe0000c37, 0x1638f: 0xe0000c43, + 0x16390: 0xe0000ab3, 0x16391: 0xe0000d63, 0x16392: 0xe0000d9a, 0x16393: 0x002ee483, + 0x16394: 0xe0000da6, 0x16395: 0xe0000de6, 0x16396: 0xe0000dd2, 0x16397: 0x40093e20, + 0x16398: 0xe0000e12, 0x16399: 0xe0000fe1, 0x1639a: 0xe0000fdb, 0x1639b: 0xe0000fed, + 0x1639c: 0xe0000fff, 0x1639d: 0xe0001102, 0x1639e: 0x00318888, 0x1639f: 0xe0000f7b, + 0x163a0: 0xe00008f2, 0x163a1: 0xe00008ec, 0x163a2: 0xe000091e, 0x163a3: 0xe0000966, + 0x163a4: 0xe0000958, 0x163a5: 0xe000094a, 0x163a6: 0xe00009d5, 0x163a7: 0xe0000a4d, + 0x163a8: 0xe0000ae5, 0x163a9: 0xe0000adf, 0x163aa: 0xe0000af1, 0x163ab: 0xe0000b1d, + 0x163ac: 0xe0000c28, 0x163ad: 0xe0000c22, 0x163ae: 0xe0000c34, 0x163af: 0xe0000c40, + 0x163b0: 0xe0000aad, 0x163b1: 0xe0000d60, 0x163b2: 0xe0000d97, 0x163b3: 0x402ee420, + 0x163b4: 0xe0000da3, 0x163b5: 0xe0000de3, 0x163b6: 0xe0000dcf, 0x163b7: 0x40093c20, + 0x163b8: 0xe0000e0f, 0x163b9: 0xe0000fde, 0x163ba: 0xe0000fd8, 0x163bb: 0xe0000fea, + 0x163bc: 0xe0000ffc, 0x163bd: 0xe00010ff, 0x163be: 0x40318820, 0x163bf: 0xe0001114, + // Block 0x58f, offset 0x163c0 + 0x163c0: 0xe0000983, 0x163c1: 0xe0000980, 0x163c2: 0xe00008fb, 0x163c3: 0xe00008f8, + 0x163c4: 0x002be083, 0x163c5: 0x402be020, 0x163c6: 0x002c3c83, 0x163c7: 0x402c3c20, + 0x163c8: 0xe0000a3e, 0x163c9: 0xe0000a3b, 0x163ca: 0xe0000a4a, 0x163cb: 0xe0000a47, + 0x163cc: 0xe0000a44, 0x163cd: 0xe0000a41, 0x163ce: 0xe0000a86, 0x163cf: 0xe0000a83, + 0x163d0: 0xe0000aaa, 0x163d1: 0xe0000aa7, 0x163d2: 0xe0000b46, 0x163d3: 0xe0000b43, + 0x163d4: 0xe0000aee, 0x163d5: 0xe0000aeb, 0x163d6: 0xe0000b2c, 0x163d7: 0xe0000b29, + 0x163d8: 0x002c9a83, 0x163d9: 0x402c9a20, 0x163da: 0xe0000b1a, 0x163db: 0xe0000b17, + 0x163dc: 0xe0000bb8, 0x163dd: 0xe0000bb5, 0x163de: 0xe0000bb2, 0x163df: 0xe0000baf, + 0x163e0: 0xe0000bc4, 0x163e1: 0xe0000bc1, 0x163e2: 0xe0000bca, 0x163e3: 0xe0000bc7, + 0x163e4: 0xe0000bee, 0x163e5: 0xe0000beb, 0x163e6: 0xe0000c1b, 0x163e7: 0xe0000c18, + 0x163e8: 0xe0000c51, 0x163e9: 0xe0000c4e, 0x163ea: 0xe0000c60, 0x163eb: 0xe0000c5d, + 0x163ec: 0xe0000c31, 0x163ed: 0xe0000c2e, 0x163ee: 0xe0000c5a, 0x163ef: 0xe0000c57, + 0x163f0: 0xe0000c54, 0x163f1: 0x402da220, 0x163f2: 0xf0000a0a, 0x163f3: 0xf0000404, + 0x163f4: 0xe0000c8a, 0x163f5: 0xe0000c87, 0x163f6: 0xe0000c9f, 0x163f7: 0xe0000c9c, + 0x163f8: 0x402f7220, 0x163f9: 0xe0000ccc, 0x163fa: 0xe0000cc9, 0x163fb: 0xe0000cd8, + 0x163fc: 0xe0000cd5, 0x163fd: 0xe0000cd2, 0x163fe: 0xe0000ccf, 0x163ff: 0xe0000d04, + // Block 0x590, offset 0x16400 + 0x16400: 0xe0000cfe, 0x16401: 0x002e2483, 0x16402: 0x402e2420, 0x16403: 0x002ea083, + 0x16404: 0x402ea020, 0x16405: 0xe0000d6f, 0x16406: 0xe0000d6c, 0x16407: 0xe0000d5d, + 0x16408: 0xe0000d5a, 0x16409: 0xf0000404, 0x1640a: 0x002eda88, 0x1640b: 0x402eda20, + 0x1640c: 0xe0000e2e, 0x1640d: 0xe0000e2b, 0x1640e: 0xe0000da0, 0x1640f: 0xe0000d9d, + 0x16410: 0xe0000de0, 0x16411: 0xe0000ddd, 0x16412: 0xe0000e93, 0x16413: 0xe0000e8f, + 0x16414: 0xe0000eca, 0x16415: 0xe0000ec7, 0x16416: 0xe0000edc, 0x16417: 0xe0000ed9, + 0x16418: 0xe0000ed0, 0x16419: 0xe0000ecd, 0x1641a: 0x002fe883, 0x1641b: 0x402fe820, + 0x1641c: 0xe0000f2d, 0x1641d: 0xe0000f2a, 0x1641e: 0xe0000f47, 0x1641f: 0xe0000f44, + 0x16420: 0xe0000f33, 0x16421: 0xe0000f30, 0x16422: 0xe0000f99, 0x16423: 0xe0000f96, + 0x16424: 0xe0000f8a, 0x16425: 0xe0000f87, 0x16426: 0x00303688, 0x16427: 0x40303620, + 0x16428: 0xe000102b, 0x16429: 0xe0001028, 0x1642a: 0xe000103f, 0x1642b: 0xe000103c, + 0x1642c: 0xe0000fe7, 0x1642d: 0xe0000fe4, 0x1642e: 0xe0000ff9, 0x1642f: 0xe0000ff6, + 0x16430: 0xe0001025, 0x16431: 0xe0001022, 0x16432: 0xe0001039, 0x16433: 0xe0001036, + 0x16434: 0xe00010d8, 0x16435: 0xe00010d5, 0x16436: 0xe000110e, 0x16437: 0xe000110b, + 0x16438: 0xe0001117, 0x16439: 0x00312c83, 0x1643a: 0x40312c20, 0x1643b: 0x00312e83, + 0x1643c: 0x40312e20, 0x1643d: 0xe0001147, 0x1643e: 0xe0001144, 0x1643f: 0xe0000f64, + // Block 0x591, offset 0x16440 + 0x16440: 0xe00009b1, 0x16441: 0xe00009ae, 0x16442: 0xe0000a22, 0x16443: 0xe0000a1f, + 0x16444: 0xe0000a28, 0x16445: 0xe0000a25, 0x16446: 0xe0000a2e, 0x16447: 0xe0000a2b, + 0x16448: 0xe000261a, 0x16449: 0xe0002617, 0x1644a: 0xe0000a8c, 0x1644b: 0xe0000a89, + 0x1644c: 0xe0000a98, 0x1644d: 0xe0000a95, 0x1644e: 0xe0000aa4, 0x1644f: 0xe0000aa1, + 0x16450: 0xe0000a92, 0x16451: 0xe0000a8f, 0x16452: 0xe0000a9e, 0x16453: 0xe0000a9b, + 0x16454: 0xe0000b55, 0x16455: 0xe0000b51, 0x16456: 0xe0000b4d, 0x16457: 0xe0000b49, + 0x16458: 0xe0000b7c, 0x16459: 0xe0000b79, 0x1645a: 0xe0000b82, 0x1645b: 0xe0000b7f, + 0x1645c: 0xe0000b39, 0x1645d: 0xe0000b35, 0x1645e: 0xe0000b8c, 0x1645f: 0xe0000b89, + 0x16460: 0xe0000bd0, 0x16461: 0xe0000bcd, 0x16462: 0xe0000c00, 0x16463: 0xe0000bfd, + 0x16464: 0xe0000c0c, 0x16465: 0xe0000c09, 0x16466: 0xe0000bfa, 0x16467: 0xe0000bf7, + 0x16468: 0xe0000c06, 0x16469: 0xe0000c03, 0x1646a: 0xe0000c12, 0x1646b: 0xe0000c0f, + 0x1646c: 0xe0000c7e, 0x1646d: 0xe0000c7b, 0x1646e: 0xe0000c4a, 0x1646f: 0xe0000c46, + 0x16470: 0xe0000c93, 0x16471: 0xe0000c90, 0x16472: 0xe0000cab, 0x16473: 0xe0000ca8, + 0x16474: 0xe0000cb1, 0x16475: 0xe0000cae, 0x16476: 0xe0000cde, 0x16477: 0xe0000cdb, + 0x16478: 0xe0000ce5, 0x16479: 0xe0000ce1, 0x1647a: 0xe0000cf2, 0x1647b: 0xe0000cef, + 0x1647c: 0xe0000cec, 0x1647d: 0xe0000ce9, 0x1647e: 0xe0000d1e, 0x1647f: 0xe0000d1b, + // Block 0x592, offset 0x16480 + 0x16480: 0xe0000d24, 0x16481: 0xe0000d21, 0x16482: 0xe0000d2a, 0x16483: 0xe0000d27, + 0x16484: 0xe0000d69, 0x16485: 0xe0000d66, 0x16486: 0xe0000d7b, 0x16487: 0xe0000d78, + 0x16488: 0xe0000d87, 0x16489: 0xe0000d84, 0x1648a: 0xe0000d81, 0x1648b: 0xe0000d7e, + 0x1648c: 0xe0002946, 0x1648d: 0xe0002943, 0x1648e: 0xe0000df5, 0x1648f: 0xe0000df1, + 0x16490: 0xe0000e3d, 0x16491: 0xe0000e39, 0x16492: 0xe000294c, 0x16493: 0xe0002949, + 0x16494: 0xe0000ea7, 0x16495: 0xe0000ea4, 0x16496: 0xe0000ead, 0x16497: 0xe0000eaa, + 0x16498: 0xe0000ed6, 0x16499: 0xe0000ed3, 0x1649a: 0xe0000ef4, 0x1649b: 0xe0000ef1, + 0x1649c: 0xe0000efb, 0x1649d: 0xe0000ef7, 0x1649e: 0xe0000f02, 0x1649f: 0xe0000eff, + 0x164a0: 0xe0000f41, 0x164a1: 0xe0000f3e, 0x164a2: 0xe0000f53, 0x164a3: 0xe0000f50, + 0x164a4: 0xe000296a, 0x164a5: 0xe0002967, 0x164a6: 0xe0000f3a, 0x164a7: 0xe0000f36, + 0x164a8: 0xe0000f5a, 0x164a9: 0xe0000f56, 0x164aa: 0xe0000f93, 0x164ab: 0xe0000f90, + 0x164ac: 0xe0000f9f, 0x164ad: 0xe0000f9c, 0x164ae: 0xe0000fb1, 0x164af: 0xe0000fae, + 0x164b0: 0xe0000fab, 0x164b1: 0xe0000fa8, 0x164b2: 0xe0001093, 0x164b3: 0xe0001090, + 0x164b4: 0xe000109f, 0x164b5: 0xe000109c, 0x164b6: 0xe0001099, 0x164b7: 0xe0001096, + 0x164b8: 0xe0001032, 0x164b9: 0xe000102e, 0x164ba: 0xe0001046, 0x164bb: 0xe0001042, + 0x164bc: 0xe00010a9, 0x164bd: 0xe00010a6, 0x164be: 0xe00010af, 0x164bf: 0xe00010ac, + // Block 0x593, offset 0x164c0 + 0x164c0: 0xe0000b03, 0x164c1: 0xe0000aff, 0x164c2: 0xe0000b13, 0x164c3: 0xe0000b0f, + 0x164c4: 0xe0000b0b, 0x164c5: 0xe0000b07, 0x164c6: 0xe0000b75, 0x164c7: 0xe0000b71, + 0x164c8: 0xe0000c66, 0x164c9: 0xe0000c63, 0x164ca: 0xe0000c78, 0x164cb: 0xe0000c75, + 0x164cc: 0xe0000e84, 0x164cd: 0xe0000e81, 0x164ce: 0xe0000e44, 0x164cf: 0xe0000e41, + 0x164d0: 0xe0003c28, 0x164d1: 0xe0003c25, 0x164d2: 0xe0000db5, 0x164d3: 0xe0000db1, + 0x164d4: 0xe0000dc5, 0x164d5: 0xe0000dc1, 0x164d6: 0xe0000dbd, 0x164d7: 0xe0000db9, + 0x164d8: 0xe0000e8b, 0x164d9: 0xe0000e87, 0x164da: 0xe0003c2e, 0x164db: 0xe0003c2b, + 0x164dc: 0xe0000e65, 0x164dd: 0xe0000e61, 0x164de: 0xe0000e75, 0x164df: 0xe0000e71, + 0x164e0: 0xe0000e6d, 0x164e1: 0xe0000e69, 0x164e2: 0xe0000e7d, 0x164e3: 0xe0000e79, + 0x164e4: 0xe000108d, 0x164e5: 0xe000108a, 0x164e6: 0xe000104d, 0x164e7: 0xe000104a, + 0x164e8: 0xe0001066, 0x164e9: 0xe0001062, 0x164ea: 0xe000106e, 0x164eb: 0xe000106a, + 0x164ec: 0xe000107e, 0x164ed: 0xe000107a, 0x164ee: 0xe0001076, 0x164ef: 0xe0001072, + 0x164f0: 0xe0001086, 0x164f1: 0xe0001082, 0x164f2: 0xe0001108, 0x164f3: 0xe0001105, + 0x164f4: 0xe0001135, 0x164f5: 0xe0001132, 0x164f6: 0xe000112f, 0x164f7: 0xe000112c, + 0x164f8: 0xe000111d, 0x164f9: 0xe000111a, 0x164fa: 0xe0000d0a, 0x164fb: 0xe0000d07, + 0x164fc: 0x0030d888, 0x164fd: 0x4030d820, 0x164fe: 0x00312088, 0x164ff: 0x40312020, + // Block 0x594, offset 0x16500 + 0x16500: 0xa0000000, 0x16501: 0xa0000000, 0x16502: 0xa0000000, 0x16503: 0xa0000000, + 0x16504: 0xa0000000, 0x16506: 0x40096620, 0x16507: 0x40096a20, + 0x16508: 0x40070820, 0x16509: 0x4004f220, 0x1650a: 0x4004f620, 0x1650b: 0x4027e620, + 0x1650c: 0x40024820, 0x1650d: 0x40024a20, 0x1650e: 0x40070e20, 0x1650f: 0x40071020, + 0x16510: 0xae600000, 0x16511: 0xae600000, 0x16512: 0xae600000, 0x16513: 0xae600000, + 0x16514: 0xae600000, 0x16515: 0xae600000, 0x16516: 0xae600000, 0x16517: 0xae600000, + 0x16518: 0xa1e00000, 0x16519: 0xa1f00000, 0x1651a: 0xa2000000, 0x1651b: 0x40026420, + 0x1651e: 0x40027020, 0x1651f: 0x4002cc20, + 0x16520: 0x403aa220, 0x16521: 0x40393a20, 0x16522: 0x40393620, 0x16523: 0x40393821, + 0x16524: 0x403a7421, 0x16525: 0x40393824, 0x16526: 0x003a9344, 0x16527: 0xce350151, + 0x16528: 0x40393c20, 0x16529: 0x403a6824, 0x1652a: 0x40395620, 0x1652b: 0x40395820, + 0x1652c: 0x40396420, 0x1652d: 0xce390171, 0x1652e: 0x40397420, 0x1652f: 0x40398820, + 0x16530: 0x40398a20, 0x16531: 0x4039a420, 0x16532: 0x4039a620, 0x16533: 0x4039c620, + 0x16534: 0x4039c820, 0x16535: 0x4039dc20, 0x16536: 0x4039de20, 0x16537: 0x4039e620, + 0x16538: 0x4039e820, 0x16539: 0x4039ee20, 0x1653a: 0x4039f020, 0x1653b: 0x403a3820, + 0x1653c: 0x403a3a20, 0x1653d: 0x403a9c20, 0x1653e: 0x403a9e20, 0x1653f: 0x403aa020, + // Block 0x595, offset 0x16540 + 0x16540: 0xa0000000, 0x16541: 0x4039fc20, 0x16542: 0x403a1220, 0x16543: 0x403a1c22, + 0x16544: 0x403a4020, 0x16545: 0x403a4e20, 0x16546: 0x403a5620, 0x16547: 0xce3d0171, + 0x16548: 0xce3f0171, 0x16549: 0xce430171, 0x1654a: 0xce450171, 0x1654b: 0xa000b002, + 0x1654c: 0xa000b202, 0x1654d: 0xa000b102, 0x1654e: 0xa1e0ad02, 0x1654f: 0xa000af02, + 0x16550: 0xa000ae02, 0x16551: 0xa210ba02, 0x16552: 0xa220bc02, 0x16553: 0xae60bd02, + 0x16554: 0xae60be02, 0x16555: 0xadc0bf02, 0x16556: 0xadc0c102, 0x16557: 0xae60c202, + 0x16558: 0xae60c302, 0x16559: 0xae60c402, 0x1655a: 0xae60c502, 0x1655b: 0xae60c602, + 0x1655c: 0xadc0c702, 0x1655d: 0xae60c802, 0x1655e: 0xae60c902, 0x1655f: 0xadc0c002, + 0x16560: 0xe000015e, 0x16561: 0xe00001e6, 0x16562: 0xe0000301, 0x16563: 0xe00003db, + 0x16564: 0xe00004b6, 0x16565: 0xe0000580, 0x16566: 0xe000064b, 0x16567: 0xe00006f3, + 0x16568: 0xe000079f, 0x16569: 0xe0000844, 0x1656a: 0x4004ee20, 0x1656b: 0x40024c20, + 0x1656c: 0x40024e20, 0x1656d: 0x4004de20, 0x1656e: 0x40393a20, 0x1656f: 0x403a1020, + 0x16570: 0xa230d102, 0x16571: 0x40393823, 0x16572: 0x40393822, 0x16573: 0x40393825, + 0x16574: 0x00391c84, 0x16575: 0xf0000404, 0x16576: 0xf0000404, 0x16577: 0xe000ad1b, + 0x16578: 0xe0003736, 0x16579: 0x40395821, 0x1657a: 0x40395c20, 0x1657b: 0x40393e20, + 0x1657c: 0x40395820, 0x1657d: 0x40396020, 0x1657e: 0x40394020, 0x1657f: 0x40396220, + // Block 0x596, offset 0x16580 + 0x16580: 0x40394220, 0x16581: 0x40396620, 0x16582: 0x40397820, 0x16583: 0x40396620, + 0x16584: 0x40396820, 0x16585: 0x40396c20, 0x16586: 0x40396a20, 0x16587: 0x40396e20, + 0x16588: 0x40398a21, 0x16589: 0x40398a20, 0x1658a: 0x40399020, 0x1658b: 0x40399220, + 0x1658c: 0x40399420, 0x1658d: 0x40399620, 0x1658e: 0x40399820, 0x1658f: 0x40399a20, + 0x16590: 0x40399c20, 0x16591: 0x4039a621, 0x16592: 0x4039aa20, 0x16593: 0x4039a620, + 0x16594: 0x4039ae20, 0x16595: 0x4039b020, 0x16596: 0x4039b820, 0x16597: 0x4039b420, + 0x16598: 0x4039b620, 0x16599: 0x4039b820, 0x1659a: 0x4039ca20, 0x1659b: 0x4039cc20, + 0x1659c: 0x4039ce20, 0x1659d: 0x4039e020, 0x1659e: 0x4039e220, 0x1659f: 0x4039ea20, + 0x165a0: 0x4039f220, 0x165a1: 0x4039fe20, 0x165a2: 0x403a0020, 0x165a3: 0x403a0220, + 0x165a4: 0x403a0420, 0x165a5: 0x403a0820, 0x165a6: 0x403a0a20, 0x165a7: 0x403a1420, + 0x165a8: 0x403a1620, 0x165a9: 0x403a1c20, 0x165aa: 0x403a1c21, 0x165ab: 0x403a2020, + 0x165ac: 0x403a2220, 0x165ad: 0x403a2620, 0x165ae: 0x403a2820, 0x165af: 0x403a2021, + 0x165b0: 0x403a2c20, 0x165b1: 0x403a2e20, 0x165b2: 0x403a3020, 0x165b3: 0x403a3220, + 0x165b4: 0x403a3420, 0x165b5: 0x403a4220, 0x165b6: 0x403a4420, 0x165b7: 0x403a4620, + 0x165b8: 0x403a4820, 0x165b9: 0x403a6020, 0x165ba: 0x403a5820, 0x165bb: 0x403a5c21, + 0x165bc: 0x403a5c20, 0x165bd: 0x403a5e20, 0x165be: 0x403a6823, 0x165bf: 0x40396c20, + // Block 0x597, offset 0x165c0 + 0x165c0: 0x003a6883, 0x165c1: 0x403a6822, 0x165c2: 0xe000ad18, 0x165c3: 0x403a6825, + 0x165c4: 0x403a7620, 0x165c5: 0x403a7820, 0x165c6: 0x403a7a20, 0x165c7: 0x403a7422, + 0x165c8: 0x403a7e20, 0x165c9: 0x403a7423, 0x165ca: 0x403a8220, 0x165cb: 0x403a8420, + 0x165cc: 0xce410171, 0x165cd: 0x403a9225, 0x165ce: 0x403a9620, 0x165cf: 0x403a8620, + 0x165d0: 0x403a9224, 0x165d1: 0x403a9a20, 0x165d2: 0x403a9222, 0x165d3: 0xe000376c, + 0x165d4: 0x4002e820, 0x165d5: 0xce3b0171, 0x165d6: 0xae600000, 0x165d7: 0xae600000, + 0x165d8: 0xae600000, 0x165d9: 0xae600000, 0x165da: 0xae600000, 0x165db: 0xae600000, + 0x165dc: 0xae600000, 0x165dd: 0xa0000000, 0x165de: 0x40071220, 0x165df: 0xae600000, + 0x165e0: 0xae600000, 0x165e1: 0xae600000, 0x165e2: 0xae600000, 0x165e3: 0xadc00000, + 0x165e4: 0xae600000, 0x165e5: 0x003a7484, 0x165e6: 0x003a9084, 0x165e7: 0xae600000, + 0x165e8: 0xae600000, 0x165e9: 0x40071420, 0x165ea: 0xadc00000, 0x165eb: 0xae600000, + 0x165ec: 0xae600000, 0x165ed: 0xadc00000, 0x165ee: 0x40399e20, 0x165ef: 0x4039ba20, + 0x165f0: 0xe0000161, 0x165f1: 0xe00001e9, 0x165f2: 0xe0000304, 0x165f3: 0xe00003de, + 0x165f4: 0xe00004b9, 0x165f5: 0xe0000583, 0x165f6: 0xe000064e, 0x165f7: 0xe00006f6, + 0x165f8: 0xe00007a2, 0x165f9: 0xe0000847, 0x165fa: 0x4039d020, 0x165fb: 0x4039e420, + 0x165fc: 0x4039f420, 0x165fd: 0xe0001553, 0x165fe: 0xe0001779, 0x165ff: 0x403a7020, + // Block 0x598, offset 0x16600 + 0x16600: 0x00021284, 0x16601: 0x00021284, 0x16602: 0x00021284, 0x16603: 0x00021284, + 0x16604: 0x00021284, 0x16605: 0x00021284, 0x16606: 0x00021284, 0x16607: 0x0002129b, + 0x16608: 0x00021284, 0x16609: 0x00021284, 0x1660a: 0x00021284, 0x1660b: 0xa0000000, + 0x1660c: 0x40021221, 0x1660d: 0x40021222, 0x1660e: 0xa0000000, 0x1660f: 0xa0000000, + 0x16610: 0x40022620, 0x16611: 0x0002269b, 0x16612: 0x40022820, 0x16613: 0x40022a20, + 0x16614: 0x40022c20, 0x16615: 0x40022e20, 0x16616: 0x4004c420, 0x16617: 0x40021820, + 0x16618: 0x4003d420, 0x16619: 0x4003d620, 0x1661a: 0x4003d820, 0x1661b: 0x4003da20, + 0x1661c: 0x4003e220, 0x1661d: 0x4003e420, 0x1661e: 0x4003e620, 0x1661f: 0x4003e820, + 0x16620: 0x4004f820, 0x16621: 0x4004fa20, 0x16622: 0x40050220, 0x16623: 0x40050420, + 0x16624: 0x0002e484, 0x16625: 0xf0001f04, 0x16626: 0xf0000404, 0x16627: 0x40050620, + 0x16628: 0x40020e20, 0x16629: 0x40021020, 0x1662a: 0xa0000000, 0x1662b: 0xa0000000, + 0x1662c: 0xa0000000, 0x1662d: 0xa0000000, 0x1662e: 0xa0000000, 0x1662f: 0x0002129b, + 0x16630: 0x4004f020, 0x16631: 0x4004f420, 0x16632: 0x40050e20, 0x16633: 0xf0001f04, + 0x16634: 0xf0000404, 0x16635: 0x40051020, 0x16636: 0xf0001f04, 0x16637: 0xf0000404, + 0x16638: 0x40051620, 0x16639: 0x4003dc20, 0x1663a: 0x4003de20, 0x1663b: 0x40051820, + 0x1663c: 0xf0001f04, 0x1663d: 0x4002e020, 0x1663e: 0x40021420, 0x1663f: 0x40051a20, + // Block 0x599, offset 0x16640 + 0x16640: 0x40073420, 0x16641: 0x40073620, + 0x16653: 0x003a269a, + 0x16654: 0x003a2699, 0x16655: 0x003a2697, 0x16656: 0x003a2698, 0x16657: 0x003a7c9a, + 0x16658: 0x003a7c99, 0x16659: 0x003a7a9a, 0x1665a: 0x003a7a99, 0x1665b: 0x003a7e9a, + 0x1665c: 0x003a7e99, 0x1665d: 0xe000ad1e, 0x1665e: 0x003a849a, 0x1665f: 0x003a8499, + 0x16660: 0x003a789a, 0x16661: 0x003a7899, 0x16662: 0x003a809a, 0x16663: 0x003a8099, + 0x16664: 0x003a989a, 0x16665: 0x003a9899, 0x16666: 0x003a9897, 0x16667: 0x003a9898, + 0x16668: 0x003a8e97, 0x16669: 0x003a8e98, 0x1666a: 0xe0001559, 0x1666b: 0xe0001556, + 0x1666c: 0xe0001589, 0x1666d: 0xe0001586, 0x1666e: 0xe000158f, 0x1666f: 0xe000158c, + 0x16670: 0xe000159b, 0x16671: 0xe0001598, 0x16672: 0xe0001595, 0x16673: 0xe0001592, + 0x16674: 0xe00015a1, 0x16675: 0xe000159e, 0x16676: 0xe00015bf, 0x16677: 0xe00015bc, + 0x16678: 0xe00015b9, 0x16679: 0xe00015ad, 0x1667a: 0xe00015a7, 0x1667b: 0xe00015a4, + 0x1667c: 0x003a929a, 0x1667d: 0x003a9299, 0x1667e: 0x003a9297, 0x1667f: 0x003a9298, + // Block 0x59a, offset 0x16680 + 0x16680: 0xf0001a1a, 0x16681: 0xf0001a1a, 0x16682: 0xf0001a1a, 0x16683: 0xe00028f4, + 0x16684: 0xe0003703, 0x16685: 0xf0001a1a, 0x16686: 0xf0001a1a, 0x16687: 0xf0001a1a, + 0x16688: 0xf0001a1a, 0x16689: 0xe00028f7, 0x1668a: 0xe0003706, 0x1668b: 0xf0001a1a, + 0x1668c: 0xf0001a1a, 0x1668d: 0xf0001a1a, 0x1668e: 0xf0001a1a, 0x1668f: 0xe00028fd, + 0x16690: 0xe0003712, 0x16691: 0xf0001a1a, 0x16692: 0xf0001a1a, 0x16693: 0xe0002900, + 0x16694: 0xe0003724, 0x16695: 0xe000373c, 0x16696: 0xe0003742, 0x16697: 0xe0003748, + 0x16698: 0xe000375a, 0x16699: 0xe0002906, 0x1669a: 0xe0003769, 0x1669b: 0xf0001a1a, + 0x1669c: 0xf0001a1a, 0x1669d: 0xe0003733, 0x1669e: 0xe0000003, 0x1669f: 0xe0000006, + 0x166a0: 0xe0000009, 0x166a1: 0xe000000c, 0x166a2: 0xe000000f, 0x166a3: 0xe0000012, + 0x166a4: 0xe000156b, 0x166a5: 0xe000156e, 0x166a6: 0xe0001577, 0x166a7: 0xe000157d, + 0x166a8: 0xe00015aa, 0x166a9: 0xe00015b3, 0x166aa: 0xf0001919, 0x166ab: 0xf0001919, + 0x166ac: 0xf0001919, 0x166ad: 0xf0001919, 0x166ae: 0xe0002891, 0x166af: 0xe0003658, + 0x166b0: 0xf0001919, 0x166b1: 0xf0001919, 0x166b2: 0xf0001919, 0x166b3: 0xf0001919, + 0x166b4: 0xe0002897, 0x166b5: 0xe0003664, 0x166b6: 0xf0001919, 0x166b7: 0xf0001919, + 0x166b8: 0xf0001919, 0x166b9: 0xf0001919, 0x166ba: 0xe000289d, 0x166bb: 0xe000366d, + 0x166bc: 0xe00028df, 0x166bd: 0xe00036bb, 0x166be: 0xe00028e5, 0x166bf: 0xe00036c1, + // Block 0x59b, offset 0x166c0 + 0x166c0: 0xe00036c7, 0x166c1: 0xe00036e5, 0x166c2: 0xe00036f1, 0x166c3: 0xe00028eb, + 0x166c4: 0xe00036f7, 0x166c5: 0xf0001919, 0x166c6: 0xe00028f1, 0x166c7: 0xe0003700, + 0x166c8: 0xf0001919, 0x166c9: 0xf0001919, 0x166ca: 0xf0001919, 0x166cb: 0xf0001919, + 0x166cc: 0xf0001919, 0x166cd: 0xf0001919, 0x166ce: 0xe00028fa, 0x166cf: 0xe000370f, + 0x166d0: 0xe0003730, 0x166d1: 0xe000374b, 0x166d2: 0xe000374e, 0x166d3: 0xe0003757, + 0x166d4: 0xe000375d, 0x166d5: 0xe0002903, 0x166d6: 0xe0003766, 0x166d7: 0xe000155c, + 0x166d8: 0xe0001562, 0x166d9: 0xe0001568, 0x166da: 0xe0001571, 0x166db: 0xe0001580, + 0x166dc: 0xf0001717, 0x166dd: 0xf0001717, 0x166de: 0xf0001717, 0x166df: 0xf0001717, + 0x166e0: 0xf0001717, 0x166e1: 0xf0001717, 0x166e2: 0xf0001717, 0x166e3: 0xf0001717, + 0x166e4: 0xf0001717, 0x166e5: 0xf0001717, 0x166e6: 0xf0001717, 0x166e7: 0xf0001717, + 0x166e8: 0xf0001717, 0x166e9: 0xf0001717, 0x166ea: 0xf0001717, 0x166eb: 0xf0001717, + 0x166ec: 0xf0001717, 0x166ed: 0xf0001717, 0x166ee: 0xf0001717, 0x166ef: 0xf0001717, + 0x166f0: 0xf0001717, 0x166f1: 0xf0001717, 0x166f2: 0xf0001717, 0x166f3: 0xf0001717, + 0x166f4: 0xf0001717, 0x166f5: 0xf0001717, 0x166f6: 0xf0001717, 0x166f7: 0xf0001717, + 0x166f8: 0xf0001717, 0x166f9: 0xf0001717, 0x166fa: 0xf0001717, 0x166fb: 0xf0001717, + 0x166fc: 0xf0001717, 0x166fd: 0xf0001717, 0x166fe: 0xf0001717, 0x166ff: 0xf0001717, + // Block 0x59c, offset 0x16700 + 0x16700: 0xf0001717, 0x16701: 0xf0001717, 0x16702: 0xf0001717, 0x16703: 0xf0001717, + 0x16704: 0xe00036cd, 0x16705: 0xe00036d3, 0x16706: 0xe00036d9, 0x16707: 0xe00036df, + 0x16708: 0xe00036eb, 0x16709: 0xf0001717, 0x1670a: 0xf0001717, 0x1670b: 0xf0001717, + 0x1670c: 0xf0001717, 0x1670d: 0xf0001717, 0x1670e: 0xf0001717, 0x1670f: 0xf0001717, + 0x16710: 0xf0001717, 0x16711: 0xf0001717, 0x16712: 0xf0001717, 0x16713: 0xf0001717, + 0x16714: 0xf0001717, 0x16715: 0xf0001717, 0x16716: 0xf0001717, 0x16717: 0xf0001717, + 0x16718: 0xf0001717, 0x16719: 0xf0001717, 0x1671a: 0xe0003739, 0x1671b: 0xe000373f, + 0x1671c: 0xe0003745, 0x1671d: 0xe0003751, 0x1671e: 0xe0003760, 0x1671f: 0xe0001574, + 0x16720: 0xe0001583, 0x16721: 0xf0001818, 0x16722: 0xf0001818, 0x16723: 0xf0001818, + 0x16724: 0xf0001818, 0x16725: 0xf0001818, 0x16726: 0xf0001818, 0x16727: 0xf0001818, + 0x16728: 0xf0001818, 0x16729: 0xf0001818, 0x1672a: 0xf0001818, 0x1672b: 0xe00036e2, + 0x1672c: 0xe00036ee, 0x1672d: 0xf0001818, 0x1672e: 0xf0001818, 0x1672f: 0xf0001818, + 0x16730: 0xe0003754, 0x16731: 0xe0003763, 0x16732: 0xf0001818, 0x16733: 0xe0003646, + 0x16734: 0xe0003649, 0x16735: 0xe00028d0, 0x16736: 0xe00036ac, 0x16737: 0xe00028d6, + 0x16738: 0xe00036b2, 0x16739: 0xe00028dc, 0x1673a: 0xe00036b8, 0x1673b: 0xe00028b8, + 0x1673c: 0xe000368e, 0x1673d: 0xe00028be, 0x1673e: 0xe000369a, 0x1673f: 0xe00028ac, + // Block 0x59d, offset 0x16740 + 0x16740: 0xe000367c, 0x16741: 0xe00028a6, 0x16742: 0xe0003676, 0x16743: 0xe00028b2, + 0x16744: 0xe0003682, 0x16745: 0xe00028c4, 0x16746: 0xe00036a0, 0x16747: 0xe00028ca, + 0x16748: 0xe00036a6, 0x16749: 0xf0001a1a, 0x1674a: 0xf0001a1a, 0x1674b: 0xf0001a1a, + 0x1674c: 0xf0001a1a, 0x1674d: 0xf0001a1a, 0x1674e: 0xf0001a1a, 0x1674f: 0xf0001a1a, + 0x16750: 0xf0001a1a, 0x16751: 0xe00028cd, 0x16752: 0xe00036a9, 0x16753: 0xe00028d3, + 0x16754: 0xe00036af, 0x16755: 0xe00028d9, 0x16756: 0xe00036b5, 0x16757: 0xe00028b5, + 0x16758: 0xe000368b, 0x16759: 0xe00028bb, 0x1675a: 0xe0003697, 0x1675b: 0xe00028a9, + 0x1675c: 0xe0003679, 0x1675d: 0xe00028a3, 0x1675e: 0xe0003673, 0x1675f: 0xe00028af, + 0x16760: 0xe000367f, 0x16761: 0xe00028c1, 0x16762: 0xe000369d, 0x16763: 0xe00028c7, + 0x16764: 0xe00036a3, 0x16765: 0xf0001919, 0x16766: 0xf0001919, 0x16767: 0xf0001919, + 0x16768: 0xf0001919, 0x16769: 0xf0001919, 0x1676a: 0xf0001919, 0x1676b: 0xf0001919, + 0x1676c: 0xf0001919, 0x1676d: 0xf0001717, 0x1676e: 0xf0001717, 0x1676f: 0xf0001717, + 0x16770: 0xf0001717, 0x16771: 0xf0001717, 0x16772: 0xf0001717, 0x16773: 0xf0001717, + 0x16774: 0xf0001818, 0x16775: 0xf0001818, 0x16776: 0xf0001818, 0x16777: 0xf0001818, + 0x16778: 0xf0001818, 0x16779: 0xf0001818, 0x1677a: 0xf0001818, 0x1677b: 0xf0001818, + 0x1677c: 0xe000364c, 0x1677d: 0xe000364f, 0x1677e: 0x4004c020, 0x1677f: 0x4004c220, + // Block 0x59e, offset 0x16780 + 0x16780: 0xa0000000, 0x16781: 0xa0000000, 0x16782: 0xa0000000, 0x16783: 0xa0000000, + 0x16784: 0xa0000000, 0x16785: 0xa0000000, 0x16786: 0xa0000000, 0x16787: 0xa0000000, + 0x16788: 0xa0000000, 0x16789: 0x40020020, 0x1678a: 0x40020220, 0x1678b: 0x40020420, + 0x1678c: 0x40020620, 0x1678d: 0x40020820, 0x1678e: 0xa0000000, 0x1678f: 0xa0000000, + 0x16790: 0xa0000000, 0x16791: 0xa0000000, 0x16792: 0xa0000000, 0x16793: 0xa0000000, + 0x16794: 0xa0000000, 0x16795: 0xa0000000, 0x16796: 0xa0000000, 0x16797: 0xa0000000, + 0x16798: 0xa0000000, 0x16799: 0xa0000000, 0x1679a: 0xa0000000, 0x1679b: 0xa0000000, + 0x1679c: 0xa0000000, 0x1679d: 0xa0000000, 0x1679e: 0xa0000000, 0x1679f: 0xa0000000, + 0x167a0: 0x40021220, 0x167a1: 0x4002ba20, 0x167a2: 0x4003e020, 0x167a3: 0x4004ea20, + 0x167a4: 0x4027de20, 0x167a5: 0x4004ec20, 0x167a6: 0x4004e620, 0x167a7: 0x4003d220, + 0x167a8: 0x4003f420, 0x167a9: 0x4003f620, 0x167aa: 0x4004d820, 0x167ab: 0x40093820, + 0x167ac: 0x40024020, 0x167ad: 0x40021a20, 0x167ae: 0x4002e420, 0x167af: 0x4004e220, + 0x167b0: 0x4029cc20, 0x167b1: 0x4029ce20, 0x167b2: 0x4029d020, 0x167b3: 0x4029d220, + 0x167b4: 0x4029d420, 0x167b5: 0x4029d620, 0x167b6: 0x4029d820, 0x167b7: 0x4029da20, + 0x167b8: 0x4029dc20, 0x167b9: 0x4029de20, 0x167ba: 0x40026c20, 0x167bb: 0x40026220, + 0x167bc: 0x40094020, 0x167bd: 0x40094220, 0x167be: 0x40094420, 0x167bf: 0x4002c420, + // Block 0x59f, offset 0x167c0 + 0x167c0: 0x4004d620, 0x167c1: 0xce4a94d1, 0x167c2: 0x002c0a88, 0x167c3: 0x002c3a88, + 0x167c4: 0x002c6288, 0x167c5: 0x002c9888, 0x167c6: 0x002d0888, 0x167c7: 0x002d2288, + 0x167c8: 0x002d6888, 0x167c9: 0xc6042741, 0x167ca: 0x002dcc88, 0x167cb: 0x002dfe88, + 0x167cc: 0xc0030002, 0x167cd: 0x002e8288, 0x167ce: 0x002e9e88, 0x167cf: 0x002ee288, + 0x167d0: 0x002f2c88, 0x167d1: 0x002f5688, 0x167d2: 0x002f7a88, 0x167d3: 0xce509501, + 0x167d4: 0xce569501, 0x167d5: 0x00306c88, 0x167d6: 0x0030be88, 0x167d7: 0x0030e288, + 0x167d8: 0x0030f688, 0x167d9: 0x00310088, 0x167da: 0x00312a88, 0x167db: 0x4003f820, + 0x167dc: 0x4004e420, 0x167dd: 0x4003fa20, 0x167de: 0x40062420, 0x167df: 0x40021620, + 0x167e0: 0x40061e20, 0x167e1: 0xce4794d1, 0x167e2: 0x402c0a20, 0x167e3: 0x402c3a20, + 0x167e4: 0x402c6220, 0x167e5: 0x402c9820, 0x167e6: 0x402d0820, 0x167e7: 0x402d2220, + 0x167e8: 0x402d6820, 0x167e9: 0xc6022741, 0x167ea: 0x402dcc20, 0x167eb: 0x402dfe20, + 0x167ec: 0xc0000002, 0x167ed: 0x402e8220, 0x167ee: 0x402e9e20, 0x167ef: 0x402ee220, + 0x167f0: 0x402f2c20, 0x167f1: 0x402f5620, 0x167f2: 0x402f7a20, 0x167f3: 0xce4d9501, + 0x167f4: 0xce539501, 0x167f5: 0x40306c20, 0x167f6: 0x4030be20, 0x167f7: 0x4030e220, + 0x167f8: 0x4030f620, 0x167f9: 0x40310020, 0x167fa: 0x40312a20, 0x167fb: 0x4003fc20, + 0x167fc: 0x40094820, 0x167fd: 0x4003fe20, 0x167fe: 0x40094c20, 0x167ff: 0xa0000000, + // Block 0x5a0, offset 0x16800 + 0x16800: 0xe00008f5, 0x16801: 0xe00008ef, 0x16802: 0x002be283, 0x16803: 0xe0000969, + 0x16804: 0xe000095b, 0x16805: 0xe000094d, 0x16806: 0xe00009dd, 0x16807: 0xe0000a53, + 0x16808: 0xe0000ae8, 0x16809: 0xe0000ae2, 0x1680a: 0xe0000af4, 0x1680b: 0xe0000b20, + 0x1680c: 0xe0000c2b, 0x1680d: 0xe0000c25, 0x1680e: 0x002d9c83, 0x1680f: 0xe0000c43, + 0x16810: 0xe0000ab3, 0x16811: 0xe0000d63, 0x16812: 0xe0000d9a, 0x16813: 0xe0000d94, + 0x16814: 0xe0000da6, 0x16815: 0xe0000de6, 0x16816: 0xe0000dd2, 0x16817: 0x40093e20, + 0x16818: 0xe0000e12, 0x16819: 0xe0000fe1, 0x1681a: 0xe0000fdb, 0x1681b: 0xe0000fed, + 0x1681c: 0xe0000fff, 0x1681d: 0xe0001102, 0x1681e: 0x00318888, 0x1681f: 0xe0000f7b, + 0x16820: 0xe00008f2, 0x16821: 0xe00008ec, 0x16822: 0x402be220, 0x16823: 0xe0000966, + 0x16824: 0xe0000958, 0x16825: 0xe000094a, 0x16826: 0xe00009d5, 0x16827: 0xe0000a4d, + 0x16828: 0xe0000ae5, 0x16829: 0xe0000adf, 0x1682a: 0xe0000af1, 0x1682b: 0xe0000b1d, + 0x1682c: 0xe0000c28, 0x1682d: 0xe0000c22, 0x1682e: 0x402d9c20, 0x1682f: 0xe0000c40, + 0x16830: 0xe0000aad, 0x16831: 0xe0000d60, 0x16832: 0xe0000d97, 0x16833: 0xe0000d91, + 0x16834: 0xe0000da3, 0x16835: 0xe0000de3, 0x16836: 0xe0000dcf, 0x16837: 0x40093c20, + 0x16838: 0xe0000e0f, 0x16839: 0xe0000fde, 0x1683a: 0xe0000fd8, 0x1683b: 0xe0000fea, + 0x1683c: 0xe0000ffc, 0x1683d: 0xe00010ff, 0x1683e: 0x40318820, 0x1683f: 0xe0001114, + // Block 0x5a1, offset 0x16840 + 0x16840: 0xe0000983, 0x16841: 0xe0000980, 0x16842: 0x002be083, 0x16843: 0x402be020, + 0x16844: 0xe000097d, 0x16845: 0xe000097a, 0x16846: 0xe0000a38, 0x16847: 0xe0000a35, + 0x16848: 0xe0000a3e, 0x16849: 0xe0000a3b, 0x1684a: 0xe0000a4a, 0x1684b: 0xe0000a47, + 0x1684c: 0xe0000a44, 0x1684d: 0xe0000a41, 0x1684e: 0xe0000a86, 0x1684f: 0xe0000a83, + 0x16850: 0xe0000aaa, 0x16851: 0xe0000aa7, 0x16852: 0xe0000b46, 0x16853: 0xe0000b43, + 0x16854: 0xe0000aee, 0x16855: 0xe0000aeb, 0x16856: 0xe0000b2c, 0x16857: 0xe0000b29, + 0x16858: 0xe0000b40, 0x16859: 0xe0000b3d, 0x1685a: 0xe0000b1a, 0x1685b: 0xe0000b17, + 0x1685c: 0xe0000bb8, 0x1685d: 0xe0000bb5, 0x1685e: 0xe0000bb2, 0x1685f: 0xe0000baf, + 0x16860: 0xe0000bc4, 0x16861: 0xe0000bc1, 0x16862: 0xe0000bca, 0x16863: 0xe0000bc7, + 0x16864: 0xe0000bee, 0x16865: 0xe0000beb, 0x16866: 0xe0000c1b, 0x16867: 0xe0000c18, + 0x16868: 0xe0000c51, 0x16869: 0xe0000c4e, 0x1686a: 0xe0000c60, 0x1686b: 0xe0000c5d, + 0x1686c: 0xe0000c31, 0x1686d: 0xe0000c2e, 0x1686e: 0xe0000c5a, 0x1686f: 0xe0000c57, + 0x16870: 0xe0000c54, 0x16871: 0x402da220, 0x16872: 0xf0000a0a, 0x16873: 0xf0000404, + 0x16874: 0xe0000c8a, 0x16875: 0xe0000c87, 0x16876: 0xe0000c9f, 0x16877: 0xe0000c9c, + 0x16878: 0x402f7220, 0x16879: 0xe0000ccc, 0x1687a: 0xe0000cc9, 0x1687b: 0xe0000cd8, + 0x1687c: 0xe0000cd5, 0x1687d: 0xe0000cd2, 0x1687e: 0xe0000ccf, 0x1687f: 0xe0000d04, + // Block 0x5a2, offset 0x16880 + 0x16880: 0xe0000cfe, 0x16881: 0xe0000cf8, 0x16882: 0xe0000cf5, 0x16883: 0xe0000d51, + 0x16884: 0xe0000d4e, 0x16885: 0xe0000d6f, 0x16886: 0xe0000d6c, 0x16887: 0xe0000d5d, + 0x16888: 0xe0000d5a, 0x16889: 0xf0000404, 0x1688a: 0x002eda88, 0x1688b: 0x402eda20, + 0x1688c: 0xe0000e2e, 0x1688d: 0xe0000e2b, 0x1688e: 0xe0000da0, 0x1688f: 0xe0000d9d, + 0x16890: 0xe0000de0, 0x16891: 0xe0000ddd, 0x16892: 0xe0000e93, 0x16893: 0xe0000e8f, + 0x16894: 0xe0000eca, 0x16895: 0xe0000ec7, 0x16896: 0xe0000edc, 0x16897: 0xe0000ed9, + 0x16898: 0xe0000ed0, 0x16899: 0xe0000ecd, 0x1689a: 0xe0000f1f, 0x1689b: 0xe0000f1c, + 0x1689c: 0xe0000f2d, 0x1689d: 0xe0000f2a, 0x1689e: 0x002fe883, 0x1689f: 0x402fe820, + 0x168a0: 0xe0000f33, 0x168a1: 0xe0000f30, 0x168a2: 0x00302e83, 0x168a3: 0x40302e20, + 0x168a4: 0xe0000f8a, 0x168a5: 0xe0000f87, 0x168a6: 0x00303688, 0x168a7: 0x40303620, + 0x168a8: 0xe000102b, 0x168a9: 0xe0001028, 0x168aa: 0xe000103f, 0x168ab: 0xe000103c, + 0x168ac: 0xe0000fe7, 0x168ad: 0xe0000fe4, 0x168ae: 0xe0000ff9, 0x168af: 0xe0000ff6, + 0x168b0: 0xe0001025, 0x168b1: 0xe0001022, 0x168b2: 0xe0001039, 0x168b3: 0xe0001036, + 0x168b4: 0xe00010d8, 0x168b5: 0xe00010d5, 0x168b6: 0xe000110e, 0x168b7: 0xe000110b, + 0x168b8: 0xe0001117, 0x168b9: 0xe000113b, 0x168ba: 0xe0001138, 0x168bb: 0xe000114d, + 0x168bc: 0xe000114a, 0x168bd: 0xe0001147, 0x168be: 0xe0001144, 0x168bf: 0xe0000f64, + // Block 0x5a3, offset 0x168c0 + 0x168c0: 0xe000098f, 0x168c1: 0xe000098c, 0x168c2: 0xe0000995, 0x168c3: 0xe0000992, + 0x168c4: 0xe0000b62, 0x168c5: 0xe0000b5f, 0x168c6: 0xe0000b68, 0x168c7: 0xe0000b65, + 0x168c8: 0xe0000c6c, 0x168c9: 0xe0000c69, 0x168ca: 0xe0000c72, 0x168cb: 0xe0000c6f, + 0x168cc: 0xe0000e4a, 0x168cd: 0xe0000e47, 0x168ce: 0xe0000e50, 0x168cf: 0xe0000e4d, + 0x168d0: 0xe0000ee8, 0x168d1: 0xe0000ee5, 0x168d2: 0xe0000eee, 0x168d3: 0xe0000eeb, + 0x168d4: 0xe0001053, 0x168d5: 0xe0001050, 0x168d6: 0xe0001059, 0x168d7: 0xe0001056, + 0x168d8: 0x002fe883, 0x168d9: 0x402fe820, 0x168da: 0x00302e83, 0x168db: 0x40302e20, + 0x168dc: 0x00312288, 0x168dd: 0x40312220, 0x168de: 0xe0000bf4, 0x168df: 0xe0000bf1, + 0x168e0: 0x002ebc88, 0x168e1: 0x402c8c20, 0x168e2: 0x002f2288, 0x168e3: 0x402f2220, + 0x168e4: 0x00314088, 0x168e5: 0x40314020, 0x168e6: 0xe000096f, 0x168e7: 0xe000096c, + 0x168e8: 0xe0000b32, 0x168e9: 0xe0000b2f, 0x168ea: 0xe0000dd9, 0x168eb: 0xe0000dd5, + 0x168ec: 0xe0000dfd, 0x168ed: 0xe0000df9, 0x168ee: 0xe0000e04, 0x168ef: 0xe0000e01, + 0x168f0: 0xe0000e0b, 0x168f1: 0xe0000e07, 0x168f2: 0xe0001129, 0x168f3: 0xe0001126, + 0x168f4: 0x402e5e20, 0x168f5: 0x402ed020, 0x168f6: 0x40305a20, 0x168f7: 0x402dd420, + 0x168f8: 0xe0000abf, 0x168f9: 0xe0000ec4, 0x168fa: 0x002be888, 0x168fb: 0x002c4488, + 0x168fc: 0x402c4420, 0x168fd: 0x002e3888, 0x168fe: 0x00303e88, 0x168ff: 0x402ffc20, + // Block 0x5a4, offset 0x16900 + 0x16900: 0xe00010d2, 0x16901: 0xe00010cf, 0x16902: 0xe00010cc, 0x16903: 0xe00010c9, + 0x16904: 0xe00010e1, 0x16905: 0xe00010de, 0x16906: 0xe00010e7, 0x16907: 0xe00010e4, + 0x16908: 0xe00010ed, 0x16909: 0xe00010ea, 0x1690a: 0xe00010fc, 0x1690b: 0xe00010f9, + 0x1690c: 0xe00010f6, 0x1690d: 0xe00010f3, 0x1690e: 0xe0001123, 0x1690f: 0xe0001120, + 0x16910: 0xe0001141, 0x16911: 0xe000113e, 0x16912: 0xe0001153, 0x16913: 0xe0001150, + 0x16914: 0xe0001159, 0x16915: 0xe0001156, 0x16916: 0xe0000c15, 0x16917: 0xe0000f8d, + 0x16918: 0xe00010db, 0x16919: 0xe0001111, 0x1691a: 0xf0000404, 0x1691b: 0xe0000f70, + 0x1691c: 0x40300420, 0x1691d: 0x40300620, 0x1691e: 0xe0000f7f, 0x1691f: 0x402c9620, + 0x16920: 0xe000099b, 0x16921: 0xe0000998, 0x16922: 0xe0000989, 0x16923: 0xe0000986, + 0x16924: 0xe00038c6, 0x16925: 0xe00038c3, 0x16926: 0xe00038cc, 0x16927: 0xe00038c9, + 0x16928: 0xe0003907, 0x16929: 0xe0003904, 0x1692a: 0xe00038f2, 0x1692b: 0xe00038ef, + 0x1692c: 0xe0003919, 0x1692d: 0xe0003916, 0x1692e: 0xe0003820, 0x1692f: 0xe000381d, + 0x16930: 0xe0003826, 0x16931: 0xe0003823, 0x16932: 0xe000389a, 0x16933: 0xe0003897, + 0x16934: 0xe0003864, 0x16935: 0xe0003861, 0x16936: 0xe00038ac, 0x16937: 0xe00038a9, + 0x16938: 0xe0000b6e, 0x16939: 0xe0000b6b, 0x1693a: 0xe0000b5c, 0x1693b: 0xe0000b59, + 0x1693c: 0xe0000b26, 0x1693d: 0xe0000b23, 0x1693e: 0xe0000afb, 0x1693f: 0xe0000af7, + // Block 0x5a5, offset 0x16940 + 0x16940: 0xa0000000, 0x16941: 0xa0000000, 0x16942: 0xa0000000, 0x16943: 0xa0000000, + 0x16944: 0xa0000000, 0x16945: 0xa0000000, 0x16946: 0xa0000000, 0x16947: 0xa0000000, + 0x16948: 0xa0000000, 0x16949: 0x40020020, 0x1694a: 0x40020220, 0x1694b: 0x40020420, + 0x1694c: 0x40020620, 0x1694d: 0x40020820, 0x1694e: 0xa0000000, 0x1694f: 0xa0000000, + 0x16950: 0xa0000000, 0x16951: 0xa0000000, 0x16952: 0xa0000000, 0x16953: 0xa0000000, + 0x16954: 0xa0000000, 0x16955: 0xa0000000, 0x16956: 0xa0000000, 0x16957: 0xa0000000, + 0x16958: 0xa0000000, 0x16959: 0xa0000000, 0x1695a: 0xa0000000, 0x1695b: 0xa0000000, + 0x1695c: 0xa0000000, 0x1695d: 0xa0000000, 0x1695e: 0xa0000000, 0x1695f: 0xa0000000, + 0x16960: 0x40021220, 0x16961: 0x4002ba20, 0x16962: 0x4003e020, 0x16963: 0x4004ea20, + 0x16964: 0x4027de20, 0x16965: 0x4004ec20, 0x16966: 0x4004e620, 0x16967: 0x4003d220, + 0x16968: 0x4003f420, 0x16969: 0x4003f620, 0x1696a: 0x4004d820, 0x1696b: 0x40093820, + 0x1696c: 0x40024020, 0x1696d: 0x40021a20, 0x1696e: 0x4002e420, 0x1696f: 0x4004e220, + 0x16970: 0x4029cc20, 0x16971: 0x4029ce20, 0x16972: 0x4029d020, 0x16973: 0x4029d220, + 0x16974: 0x4029d420, 0x16975: 0x4029d620, 0x16976: 0x4029d820, 0x16977: 0x4029da20, + 0x16978: 0x4029dc20, 0x16979: 0x4029de20, 0x1697a: 0x40026c20, 0x1697b: 0x40026220, + 0x1697c: 0x40094020, 0x1697d: 0x40094220, 0x1697e: 0x40094420, 0x1697f: 0x4002c420, + // Block 0x5a6, offset 0x16980 + 0x16980: 0x4004d620, 0x16981: 0xce5f9521, 0x16982: 0x002c0a88, 0x16983: 0xce670991, + 0x16984: 0x002c6288, 0x16985: 0x002c9888, 0x16986: 0x002d0888, 0x16987: 0xce6f0991, + 0x16988: 0x002d6888, 0x16989: 0x002d9a88, 0x1698a: 0x002dcc88, 0x1698b: 0xcabc0991, + 0x1698c: 0xc0030002, 0x1698d: 0x002e8288, 0x1698e: 0xce749571, 0x1698f: 0xce8195a1, + 0x16990: 0x002f2c88, 0x16991: 0x002f5688, 0x16992: 0x002f7a88, 0x16993: 0xcad00991, + 0x16994: 0x00302c88, 0x16995: 0xc3900b21, 0x16996: 0x0030be88, 0x16997: 0x0030e288, + 0x16998: 0x0030f688, 0x16999: 0x00310088, 0x1699a: 0xce790991, 0x1699b: 0x4003f820, + 0x1699c: 0x4004e420, 0x1699d: 0x4003fa20, 0x1699e: 0x40062420, 0x1699f: 0x40021620, + 0x169a0: 0x40061e20, 0x169a1: 0xce599521, 0x169a2: 0x402c0a20, 0x169a3: 0xce650991, + 0x169a4: 0x402c6220, 0x169a5: 0x402c9820, 0x169a6: 0x402d0820, 0x169a7: 0xce6d0991, + 0x169a8: 0x402d6820, 0x169a9: 0x402d9a20, 0x169aa: 0x402dcc20, 0x169ab: 0xcaba0991, + 0x169ac: 0xc0000002, 0x169ad: 0x402e8220, 0x169ae: 0xce719571, 0x169af: 0xce7b95a1, + 0x169b0: 0x402f2c20, 0x169b1: 0x402f5620, 0x169b2: 0x402f7a20, 0x169b3: 0xcace0991, + 0x169b4: 0x40302c20, 0x169b5: 0xc38d0b21, 0x169b6: 0x4030be20, 0x169b7: 0x4030e220, + 0x169b8: 0x4030f620, 0x169b9: 0x40310020, 0x169ba: 0xce770991, 0x169bb: 0x4003fc20, + 0x169bc: 0x40094820, 0x169bd: 0x4003fe20, 0x169be: 0x40094c20, 0x169bf: 0xa0000000, + // Block 0x5a7, offset 0x169c0 + 0x169c0: 0xe00008f5, 0x169c1: 0x002c0883, 0x169c2: 0xe0000921, 0x169c3: 0x00320ea3, + 0x169c4: 0x00320e83, 0x169c5: 0x00320c83, 0x169c6: 0x00320a83, 0x169c7: 0xe0000a53, + 0x169c8: 0xe0000ae8, 0x169c9: 0xe0000ae2, 0x169ca: 0xe0000af4, 0x169cb: 0xe0000b20, + 0x169cc: 0xe0000c2b, 0x169cd: 0xe0000c25, 0x169ce: 0xe0000c37, 0x169cf: 0xe0000c43, + 0x169d0: 0x002c96a3, 0x169d1: 0x002ee0c3, 0x169d2: 0xe0000d9a, 0x169d3: 0xe0000d94, + 0x169d4: 0x003210e3, 0x169d5: 0x003210c3, 0x169d6: 0x00321083, 0x169d7: 0x40093e20, + 0x169d8: 0x00320883, 0x169d9: 0xe0000fe1, 0x169da: 0xe0000fdb, 0x169db: 0xe0000fed, + 0x169dc: 0x003100a3, 0x169dd: 0xe0001102, 0x169de: 0x00306aa3, 0x169df: 0xe0000f7b, + 0x169e0: 0xe00008f2, 0x169e1: 0x402c0820, 0x169e2: 0xe000091e, 0x169e3: 0x40320e21, + 0x169e4: 0x40320e20, 0x169e5: 0x40320c20, 0x169e6: 0x40320a20, 0x169e7: 0xe0000a4d, + 0x169e8: 0xe0000ae5, 0x169e9: 0xe0000adf, 0x169ea: 0xe0000af1, 0x169eb: 0xe0000b1d, + 0x169ec: 0xe0000c28, 0x169ed: 0xe0000c22, 0x169ee: 0xe0000c34, 0x169ef: 0xe0000c40, + 0x169f0: 0x402c9621, 0x169f1: 0x402ee022, 0x169f2: 0xe0000d97, 0x169f3: 0xe0000d91, + 0x169f4: 0x40321023, 0x169f5: 0x40321022, 0x169f6: 0x40321020, 0x169f7: 0x40093c20, + 0x169f8: 0x40320820, 0x169f9: 0xe0000fde, 0x169fa: 0xe0000fd8, 0x169fb: 0xe0000fea, + 0x169fc: 0x40310021, 0x169fd: 0xe00010ff, 0x169fe: 0x40306a21, 0x169ff: 0xe0001114, + // Block 0x5a8, offset 0x16a00 + 0x16a00: 0xe0000983, 0x16a01: 0xe0000980, 0x16a02: 0xe00008fb, 0x16a03: 0xe00008f8, + 0x16a04: 0xe000097d, 0x16a05: 0xe000097a, 0x16a06: 0xe0000a38, 0x16a07: 0xe0000a35, + 0x16a08: 0xe0000a3e, 0x16a09: 0xe0000a3b, 0x16a0a: 0xe0000a4a, 0x16a0b: 0xe0000a47, + 0x16a0c: 0x002c5c83, 0x16a0d: 0x402c5c20, 0x16a0e: 0xe0000a86, 0x16a0f: 0xe0000a83, + 0x16a10: 0x002c9683, 0x16a11: 0x402c9620, 0x16a12: 0xe0000b46, 0x16a13: 0xe0000b43, + 0x16a14: 0xe0000aee, 0x16a15: 0xe0000aeb, 0x16a16: 0xe0000b2c, 0x16a17: 0xe0000b29, + 0x16a18: 0xe0000b40, 0x16a19: 0xe0000b3d, 0x16a1a: 0xe0000b1a, 0x16a1b: 0xe0000b17, + 0x16a1c: 0xe0000bb8, 0x16a1d: 0xe0000bb5, 0x16a1e: 0xe0000bb2, 0x16a1f: 0xe0000baf, + 0x16a20: 0xe0000bc4, 0x16a21: 0xe0000bc1, 0x16a22: 0xe0000bca, 0x16a23: 0xe0000bc7, + 0x16a24: 0xe0000bee, 0x16a25: 0xe0000beb, 0x16a26: 0xe0000c1b, 0x16a27: 0xe0000c18, + 0x16a28: 0xe0000c51, 0x16a29: 0xe0000c4e, 0x16a2a: 0xe0000c60, 0x16a2b: 0xe0000c5d, + 0x16a2c: 0xe0000c31, 0x16a2d: 0xe0000c2e, 0x16a2e: 0xe0000c5a, 0x16a2f: 0xe0000c57, + 0x16a30: 0xe0000c54, 0x16a31: 0x402da220, 0x16a32: 0xf0000a0a, 0x16a33: 0xf0000404, + 0x16a34: 0xe0000c8a, 0x16a35: 0xe0000c87, 0x16a36: 0xe0000c9f, 0x16a37: 0xe0000c9c, + 0x16a38: 0x402f7220, 0x16a39: 0xe0000ccc, 0x16a3a: 0xe0000cc9, 0x16a3b: 0xe0000cd8, + 0x16a3c: 0xe0000cd5, 0x16a3d: 0xe0000cd2, 0x16a3e: 0xe0000ccf, 0x16a3f: 0xe0000d04, + // Block 0x5a9, offset 0x16a40 + 0x16a40: 0xe0000cfe, 0x16a41: 0xe0000cf8, 0x16a42: 0xe0000cf5, 0x16a43: 0x002ee0a3, + 0x16a44: 0x402ee021, 0x16a45: 0xe0000d6f, 0x16a46: 0xe0000d6c, 0x16a47: 0xe0000d5d, + 0x16a48: 0xe0000d5a, 0x16a49: 0xf0000404, 0x16a4a: 0x002ee083, 0x16a4b: 0x402ee020, + 0x16a4c: 0xe0000e2e, 0x16a4d: 0xe0000e2b, 0x16a4e: 0xe0000da0, 0x16a4f: 0xe0000d9d, + 0x16a50: 0x003210a3, 0x16a51: 0x40321021, 0x16a52: 0x003208a3, 0x16a53: 0x40320821, + 0x16a54: 0xe0000eca, 0x16a55: 0xe0000ec7, 0x16a56: 0xe0000edc, 0x16a57: 0xe0000ed9, + 0x16a58: 0xe0000ed0, 0x16a59: 0xe0000ecd, 0x16a5a: 0xe0000f1f, 0x16a5b: 0xe0000f1c, + 0x16a5c: 0xe0000f2d, 0x16a5d: 0xe0000f2a, 0x16a5e: 0xe0000f47, 0x16a5f: 0xe0000f44, + 0x16a60: 0x00302a83, 0x16a61: 0x40302a20, 0x16a62: 0xe0000f99, 0x16a63: 0xe0000f96, + 0x16a64: 0xe0000f8a, 0x16a65: 0xe0000f87, 0x16a66: 0x00306a83, 0x16a67: 0x40306a20, + 0x16a68: 0xe000102b, 0x16a69: 0xe0001028, 0x16a6a: 0xe000103f, 0x16a6b: 0xe000103c, + 0x16a6c: 0xe0000fe7, 0x16a6d: 0xe0000fe4, 0x16a6e: 0xe0000ff9, 0x16a6f: 0xe0000ff6, + 0x16a70: 0x003100c3, 0x16a71: 0x40310022, 0x16a72: 0xe0001039, 0x16a73: 0xe0001036, + 0x16a74: 0xe00010d8, 0x16a75: 0xe00010d5, 0x16a76: 0xe000110e, 0x16a77: 0xe000110b, + 0x16a78: 0xe0001117, 0x16a79: 0xe000113b, 0x16a7a: 0xe0001138, 0x16a7b: 0xe000114d, + 0x16a7c: 0xe000114a, 0x16a7d: 0x00320683, 0x16a7e: 0x40320620, 0x16a7f: 0xe0000f64, + // Block 0x5aa, offset 0x16a80 + 0x16a80: 0x402c1a20, 0x16a81: 0x002c2a88, 0x16a82: 0x002c3288, 0x16a83: 0x402c3220, + 0x16a84: 0x0031c488, 0x16a85: 0x4031c420, 0x16a86: 0x002efa88, 0x16a87: 0x002c4e88, + 0x16a88: 0x402c4e20, 0x16a89: 0x002c7288, 0x16a8a: 0x002c7a88, 0x16a8b: 0x002c8488, + 0x16a8c: 0x402c8420, 0x16a8d: 0xe000115c, 0x16a8e: 0x002cae88, 0x16a8f: 0x002cb888, + 0x16a90: 0x002cc288, 0x16a91: 0x002d1688, 0x16a92: 0x402d1620, 0x16a93: 0x002d4488, + 0x16a94: 0x002d5888, 0x16a95: 0x402d7820, 0x16a96: 0x002dc288, 0x16a97: 0x002db688, + 0x16a98: 0x002e0a88, 0x16a99: 0x402e0a20, 0x16a9a: 0x402e3820, 0x16a9b: 0x402e7220, + 0x16a9c: 0x0030a088, 0x16a9d: 0x002eb488, 0x16a9e: 0x402ebc20, 0x16a9f: 0x002f1088, + 0x16aa0: 0xe0000e56, 0x16aa1: 0xe0000e53, 0x16aa2: 0x002d6088, 0x16aa3: 0x402d6020, + 0x16aa4: 0x002f3e88, 0x16aa5: 0x402f3e20, 0x16aa6: 0x002f8288, 0x16aa7: 0x0031b488, + 0x16aa8: 0x4031b420, 0x16aa9: 0x00300888, 0x16aaa: 0x40301220, 0x16aab: 0x40304220, + 0x16aac: 0x00304a88, 0x16aad: 0x40304a20, 0x16aae: 0x00305288, 0x16aaf: 0xe000105f, + 0x16ab0: 0xe000105c, 0x16ab1: 0x0030b488, 0x16ab2: 0x0030cc88, 0x16ab3: 0x00311888, + 0x16ab4: 0x40311820, 0x16ab5: 0x00313488, 0x16ab6: 0x40313420, 0x16ab7: 0xce6b0991, + 0x16ab8: 0x00316e88, 0x16ab9: 0x40316e20, 0x16aba: 0x40317820, 0x16abb: 0x4031a620, + 0x16abc: 0x0031bc88, 0x16abd: 0x4031bc20, 0x16abe: 0xe0000fc9, 0x16abf: 0x40319420, + // Block 0x5ab, offset 0x16ac0 + 0x16ac0: 0x40321220, 0x16ac1: 0x40321a20, 0x16ac2: 0x40322220, 0x16ac3: 0x40322a20, + 0x16ac4: 0xe0000ad5, 0x16ac5: 0xe0000ad1, 0x16ac6: 0xe0000acd, 0x16ac7: 0xf0000a0a, + 0x16ac8: 0xf000040a, 0x16ac9: 0xf0000404, 0x16aca: 0xf0000a0a, 0x16acb: 0xf000040a, + 0x16acc: 0xf0000404, 0x16acd: 0xe0000947, 0x16ace: 0xe0000944, 0x16acf: 0xe0000c3d, + 0x16ad0: 0xe0000c3a, 0x16ad1: 0xe0000dcc, 0x16ad2: 0xe0000dc9, 0x16ad3: 0xe0000ff3, + 0x16ad4: 0xe0000ff0, 0x16ad5: 0xe000298b, 0x16ad6: 0xe0002988, 0x16ad7: 0xe0002979, + 0x16ad8: 0xe0002976, 0x16ad9: 0xe0002985, 0x16ada: 0xe0002982, 0x16adb: 0xe000297f, + 0x16adc: 0xe000297c, 0x16add: 0x402cae20, 0x16ade: 0xe000379e, 0x16adf: 0xe000379b, + 0x16ae0: 0xe000299d, 0x16ae1: 0xe000299a, 0x16ae2: 0xe000ad30, 0x16ae3: 0xe000ad2d, + 0x16ae4: 0x002d6683, 0x16ae5: 0x402d6620, 0x16ae6: 0x002d6483, 0x16ae7: 0x402d6420, + 0x16ae8: 0x002e2083, 0x16ae9: 0x402e2020, 0x16aea: 0x00321103, 0x16aeb: 0x40321024, + 0x16aec: 0xe000ad78, 0x16aed: 0xe000ad75, 0x16aee: 0x002c6083, 0x16aef: 0x402c6020, + 0x16af0: 0xe0000c8d, 0x16af1: 0xf0000a0a, 0x16af2: 0xf000040a, 0x16af3: 0xf0000404, + 0x16af4: 0xe0000bac, 0x16af5: 0xe0000ba9, 0x16af6: 0x002d7888, 0x16af7: 0x00319488, + 0x16af8: 0xe0000d57, 0x16af9: 0xe0000d54, 0x16afa: 0xe0002991, 0x16afb: 0xe000298e, + 0x16afc: 0xe000ad2a, 0x16afd: 0xe000ad27, 0x16afe: 0xe000ad24, 0x16aff: 0xe000ad21, + // Block 0x5ac, offset 0x16b00 + 0x16b00: 0xe000098f, 0x16b01: 0xe000098c, 0x16b02: 0xe0000995, 0x16b03: 0xe0000992, + 0x16b04: 0xe0000b62, 0x16b05: 0xe0000b5f, 0x16b06: 0xe0000b68, 0x16b07: 0xe0000b65, + 0x16b08: 0xe0000c6c, 0x16b09: 0xe0000c69, 0x16b0a: 0xe0000c72, 0x16b0b: 0xe0000c6f, + 0x16b0c: 0xe0000e4a, 0x16b0d: 0xe0000e47, 0x16b0e: 0xe0000e50, 0x16b0f: 0xe0000e4d, + 0x16b10: 0xe0000ee8, 0x16b11: 0xe0000ee5, 0x16b12: 0xe0000eee, 0x16b13: 0xe0000eeb, + 0x16b14: 0xe0001053, 0x16b15: 0xe0001050, 0x16b16: 0xe0001059, 0x16b17: 0xe0001056, + 0x16b18: 0xe0000f61, 0x16b19: 0xe0000f5e, 0x16b1a: 0xe0000fa5, 0x16b1b: 0xe0000fa2, + 0x16b1c: 0x00312288, 0x16b1d: 0x40312220, 0x16b1e: 0xe0000bf4, 0x16b1f: 0xe0000bf1, + 0x16b20: 0x002ebc88, 0x16b21: 0x402c8c20, 0x16b22: 0x002f2288, 0x16b23: 0x402f2220, + 0x16b24: 0x00314088, 0x16b25: 0x40314020, 0x16b26: 0x00320ca3, 0x16b27: 0x40320c21, + 0x16b28: 0xe0000b32, 0x16b29: 0xe0000b2f, 0x16b2a: 0xe00037b0, 0x16b2b: 0xe00037ad, + 0x16b2c: 0xe000ad4e, 0x16b2d: 0xe000ad4b, 0x16b2e: 0xe0000e04, 0x16b2f: 0xe0000e01, + 0x16b30: 0xe0000e0b, 0x16b31: 0xe0000e07, 0x16b32: 0xe0001129, 0x16b33: 0xe0001126, + 0x16b34: 0x402e5e20, 0x16b35: 0x402ed020, 0x16b36: 0x40305a20, 0x16b37: 0x402dd420, + 0x16b38: 0xe0000abf, 0x16b39: 0xe0000ec4, 0x16b3a: 0x002be888, 0x16b3b: 0x002c4488, + 0x16b3c: 0x402c4420, 0x16b3d: 0x002e3888, 0x16b3e: 0x00303e88, 0x16b3f: 0x402ffc20, + // Block 0x5ad, offset 0x16b40 + 0x16b40: 0x402f8220, 0x16b41: 0x402fd820, 0x16b42: 0x402ff420, 0x16b43: 0x40300820, + 0x16b44: 0x402df620, 0x16b45: 0x40301a20, 0x16b46: 0x40302420, 0x16b47: 0x40306420, + 0x16b48: 0x40305220, 0x16b49: 0x40307c20, 0x16b4a: 0x4030b420, 0x16b4b: 0x4030cc20, + 0x16b4c: 0x4030da20, 0x16b4d: 0x4030ee20, 0x16b4e: 0x402e7a20, 0x16b4f: 0x40310820, + 0x16b50: 0x40314820, 0x16b51: 0x40315020, 0x16b52: 0xce690991, 0x16b53: 0x40318020, + 0x16b54: 0x4031cc20, 0x16b55: 0x4031e820, 0x16b56: 0x40320a20, 0x16b57: 0x40323220, + 0x16b58: 0x40323a20, 0x16b59: 0x402c1220, 0x16b5a: 0x402cf820, 0x16b5b: 0x402d4c20, + 0x16b5c: 0x402d7020, 0x16b5d: 0x402de620, 0x16b5e: 0x402e1a20, 0x16b5f: 0x402e2a20, + 0x16b60: 0x402f6220, 0x16b61: 0x4031fa20, 0x16b62: 0x40320220, 0x16b63: 0xe0000aca, + 0x16b64: 0xe0000adc, 0x16b65: 0xe0000ad9, 0x16b66: 0xe0000fcc, 0x16b67: 0xe0000fcf, + 0x16b68: 0xe0000fba, 0x16b69: 0xe0000ba1, 0x16b6a: 0xe0000d11, 0x16b6b: 0xe0000d18, + 0x16b6c: 0x40324220, 0x16b6d: 0x40324a20, 0x16b6e: 0x40309020, 0x16b6f: 0x40309820, + 0x16b70: 0x002d6894, 0x16b71: 0x002d8094, 0x16b72: 0x002dcc94, 0x16b73: 0x002f7a94, + 0x16b74: 0x002f9894, 0x16b75: 0x002fac94, 0x16b76: 0x002fd894, 0x16b77: 0x0030e294, + 0x16b78: 0x00310094, 0x16b79: 0x40064020, 0x16b7a: 0x40064420, 0x16b7b: 0x402d9620, + 0x16b7c: 0x4031de20, 0x16b7d: 0x402d9820, 0x16b7e: 0x4031e220, 0x16b7f: 0x4031f020, + // Block 0x5ae, offset 0x16b80 + 0x16b80: 0xe0000d24, 0x16b81: 0xe0000d21, 0x16b82: 0xe0000d2a, 0x16b83: 0xe0000d27, + 0x16b84: 0xe0000d69, 0x16b85: 0xe0000d66, 0x16b86: 0xe0000d7b, 0x16b87: 0xe0000d78, + 0x16b88: 0xe0000d87, 0x16b89: 0xe0000d84, 0x16b8a: 0xe0000d81, 0x16b8b: 0xe0000d7e, + 0x16b8c: 0xe000ad42, 0x16b8d: 0xe000ad3f, 0x16b8e: 0xe000ad48, 0x16b8f: 0xe000ad45, + 0x16b90: 0xe0000e3d, 0x16b91: 0xe0000e39, 0x16b92: 0xe0000e35, 0x16b93: 0xe0000e31, + 0x16b94: 0xe0000ea7, 0x16b95: 0xe0000ea4, 0x16b96: 0xe0000ead, 0x16b97: 0xe0000eaa, + 0x16b98: 0xe0000ed6, 0x16b99: 0xe0000ed3, 0x16b9a: 0xe0000ef4, 0x16b9b: 0xe0000ef1, + 0x16b9c: 0xe0000efb, 0x16b9d: 0xe0000ef7, 0x16b9e: 0xe0000f02, 0x16b9f: 0xe0000eff, + 0x16ba0: 0xe0000f41, 0x16ba1: 0xe0000f3e, 0x16ba2: 0xe0000f53, 0x16ba3: 0xe0000f50, + 0x16ba4: 0xe0000f26, 0x16ba5: 0xe0000f22, 0x16ba6: 0xe000a96b, 0x16ba7: 0xe000a968, + 0x16ba8: 0xe0000f5a, 0x16ba9: 0xe0000f56, 0x16baa: 0xe0000f93, 0x16bab: 0xe0000f90, + 0x16bac: 0xe0000f9f, 0x16bad: 0xe0000f9c, 0x16bae: 0xe0000fb1, 0x16baf: 0xe0000fae, + 0x16bb0: 0xe0000fab, 0x16bb1: 0xe0000fa8, 0x16bb2: 0xe0001093, 0x16bb3: 0xe0001090, + 0x16bb4: 0xe000109f, 0x16bb5: 0xe000109c, 0x16bb6: 0xe0001099, 0x16bb7: 0xe0001096, + 0x16bb8: 0xe0001032, 0x16bb9: 0xe000102e, 0x16bba: 0xe000298b, 0x16bbb: 0xe0002988, + 0x16bbc: 0xe00010a9, 0x16bbd: 0xe00010a6, 0x16bbe: 0xe00010af, 0x16bbf: 0xe00010ac, + // Block 0x5af, offset 0x16bc0 + 0x16bc0: 0xe00010d2, 0x16bc1: 0xe00010cf, 0x16bc2: 0xe00010cc, 0x16bc3: 0xe00010c9, + 0x16bc4: 0xe00010e1, 0x16bc5: 0xe00010de, 0x16bc6: 0xe00010e7, 0x16bc7: 0xe00010e4, + 0x16bc8: 0xe00010ed, 0x16bc9: 0xe00010ea, 0x16bca: 0xe00010fc, 0x16bcb: 0xe00010f9, + 0x16bcc: 0xe00010f6, 0x16bcd: 0xe00010f3, 0x16bce: 0xe0001123, 0x16bcf: 0xe0001120, + 0x16bd0: 0xe0001141, 0x16bd1: 0xe000113e, 0x16bd2: 0xe0001153, 0x16bd3: 0xe0001150, + 0x16bd4: 0xe0001159, 0x16bd5: 0xe0001156, 0x16bd6: 0xe0000c15, 0x16bd7: 0xe0000f8d, + 0x16bd8: 0xe00010db, 0x16bd9: 0xe0001111, 0x16bda: 0xf0000404, 0x16bdb: 0xe0000f70, + 0x16bdc: 0x40300420, 0x16bdd: 0x40300620, 0x16bde: 0xe0000f7f, 0x16bdf: 0x402c9620, + 0x16be0: 0xe000099b, 0x16be1: 0xe0000998, 0x16be2: 0xe0000989, 0x16be3: 0xe0000986, + 0x16be4: 0xe0003c40, 0x16be5: 0xe0003c3d, 0x16be6: 0xe0000930, 0x16be7: 0xe000092c, + 0x16be8: 0xe0000940, 0x16be9: 0xe000093c, 0x16bea: 0xe000ad3c, 0x16beb: 0xe000ad39, + 0x16bec: 0xe00009aa, 0x16bed: 0xe00009a6, 0x16bee: 0xe0003c3a, 0x16bef: 0xe0003c37, + 0x16bf0: 0xe000090a, 0x16bf1: 0xe0000906, 0x16bf2: 0xe000091a, 0x16bf3: 0xe0000916, + 0x16bf4: 0xe000ad36, 0x16bf5: 0xe000ad33, 0x16bf6: 0xe00009a2, 0x16bf7: 0xe000099e, + 0x16bf8: 0xe0000b6e, 0x16bf9: 0xe0000b6b, 0x16bfa: 0xe0000b5c, 0x16bfb: 0xe0000b59, + 0x16bfc: 0xe0000b26, 0x16bfd: 0xe0000b23, 0x16bfe: 0xe0000afb, 0x16bff: 0xe0000af7, + // Block 0x5b0, offset 0x16c00 + 0x16c00: 0xe0000b03, 0x16c01: 0xe0000aff, 0x16c02: 0xe0000b13, 0x16c03: 0xe0000b0f, + 0x16c04: 0xe0000b0b, 0x16c05: 0xe0000b07, 0x16c06: 0xe0000b75, 0x16c07: 0xe0000b71, + 0x16c08: 0xe0000c66, 0x16c09: 0xe0000c63, 0x16c0a: 0xe0000c78, 0x16c0b: 0xe0000c75, + 0x16c0c: 0xe0000e84, 0x16c0d: 0xe0000e81, 0x16c0e: 0xe0000e44, 0x16c0f: 0xe0000e41, + 0x16c10: 0xe000ad5a, 0x16c11: 0xe000ad57, 0x16c12: 0xe000ad60, 0x16c13: 0xe000ad5d, + 0x16c14: 0xe000ad6c, 0x16c15: 0xe000ad69, 0x16c16: 0xe000ad66, 0x16c17: 0xe000ad63, + 0x16c18: 0xe000ad72, 0x16c19: 0xe000ad6f, 0x16c1a: 0xe0000e5d, 0x16c1b: 0xe0000e59, + 0x16c1c: 0xe0000e65, 0x16c1d: 0xe0000e61, 0x16c1e: 0xe0000e75, 0x16c1f: 0xe0000e71, + 0x16c20: 0xe000ad54, 0x16c21: 0xe000ad51, 0x16c22: 0xe0000e7d, 0x16c23: 0xe0000e79, + 0x16c24: 0xe000108d, 0x16c25: 0xe000108a, 0x16c26: 0xe000104d, 0x16c27: 0xe000104a, + 0x16c28: 0xe0001066, 0x16c29: 0xe0001062, 0x16c2a: 0xe000106e, 0x16c2b: 0xe000106a, + 0x16c2c: 0xe000107e, 0x16c2d: 0xe000107a, 0x16c2e: 0xe0001076, 0x16c2f: 0xe0001072, + 0x16c30: 0xe0001086, 0x16c31: 0xe0001082, 0x16c32: 0xe0001108, 0x16c33: 0xe0001105, + 0x16c34: 0xe0001135, 0x16c35: 0xe0001132, 0x16c36: 0xe000112f, 0x16c37: 0xe000112c, + 0x16c38: 0xe000111d, 0x16c39: 0xe000111a, 0x16c3a: 0xe0000d0a, 0x16c3b: 0xe0000d07, + 0x16c3c: 0x0030d888, 0x16c3d: 0x4030d820, 0x16c3e: 0x00312088, 0x16c3f: 0x40312020, + // Block 0x5b1, offset 0x16c40 + 0x16c42: 0x4044b620, 0x16c43: 0x4044b820, + 0x16c45: 0x40449220, 0x16c46: 0x40449420, 0x16c47: 0x40449620, + 0x16c48: 0x40449820, 0x16c49: 0x40449a20, 0x16c4a: 0x40449c20, 0x16c4b: 0x40449e20, + 0x16c4c: 0x4044a020, 0x16c4d: 0x4044a220, 0x16c4e: 0x4044a420, 0x16c4f: 0x4044a620, + 0x16c50: 0x4044a820, 0x16c51: 0x4044aa20, 0x16c52: 0x4044ac20, 0x16c53: 0x4044ae20, + 0x16c54: 0x4044b020, 0x16c55: 0x4044b220, 0x16c56: 0x4044b420, + 0x16c5a: 0x4044b620, 0x16c5b: 0x4044b820, + 0x16c5c: 0x4044ba20, 0x16c5d: 0x4044bc20, 0x16c5e: 0x4044be20, 0x16c5f: 0x4044c020, + 0x16c60: 0x4044c220, 0x16c61: 0x4044c420, 0x16c62: 0x4044c620, 0x16c63: 0x4044c820, + 0x16c64: 0x4044ce20, 0x16c65: 0x4044cc20, 0x16c66: 0x4044ce20, 0x16c67: 0x4044d020, + 0x16c68: 0x4044d220, 0x16c69: 0x4044d420, 0x16c6a: 0x4044d620, 0x16c6b: 0x4044d820, + 0x16c6c: 0x4044da20, 0x16c6d: 0x4044dc20, 0x16c6e: 0x4044de20, 0x16c6f: 0x4044e020, + 0x16c70: 0x4044e220, 0x16c71: 0x4044e420, 0x16c73: 0x4044e620, + 0x16c74: 0x4044e820, 0x16c75: 0x4044ea20, 0x16c76: 0x4044ec20, 0x16c77: 0x4044ee20, + 0x16c78: 0x4044f020, 0x16c79: 0x4044f220, 0x16c7a: 0x4044f420, 0x16c7b: 0x4044f620, + 0x16c7d: 0x4044f820, + // Block 0x5b2, offset 0x16c80 + 0x16c80: 0xa0000000, 0x16c81: 0xa0000000, 0x16c82: 0xa0000000, 0x16c83: 0xa0000000, + 0x16c84: 0xa0000000, 0x16c85: 0xa0000000, 0x16c86: 0xa0000000, 0x16c87: 0xa0000000, + 0x16c88: 0xa0000000, 0x16c89: 0x40020020, 0x16c8a: 0x40020220, 0x16c8b: 0x40020420, + 0x16c8c: 0x40020620, 0x16c8d: 0x40020820, 0x16c8e: 0xa0000000, 0x16c8f: 0xa0000000, + 0x16c90: 0xa0000000, 0x16c91: 0xa0000000, 0x16c92: 0xa0000000, 0x16c93: 0xa0000000, + 0x16c94: 0xa0000000, 0x16c95: 0xa0000000, 0x16c96: 0xa0000000, 0x16c97: 0xa0000000, + 0x16c98: 0xa0000000, 0x16c99: 0xa0000000, 0x16c9a: 0xa0000000, 0x16c9b: 0xa0000000, + 0x16c9c: 0xa0000000, 0x16c9d: 0xa0000000, 0x16c9e: 0xa0000000, 0x16c9f: 0xa0000000, + 0x16ca0: 0x40021220, 0x16ca1: 0x4002ba20, 0x16ca2: 0x4003e020, 0x16ca3: 0x4004ea20, + 0x16ca4: 0x4027de20, 0x16ca5: 0x4004ec20, 0x16ca6: 0x4004e620, 0x16ca7: 0x4003d220, + 0x16ca8: 0x4003f420, 0x16ca9: 0x4003f620, 0x16caa: 0x4004d820, 0x16cab: 0x40093820, + 0x16cac: 0x40024020, 0x16cad: 0x40021a20, 0x16cae: 0x4002e420, 0x16caf: 0x4004e220, + 0x16cb0: 0x4029cc20, 0x16cb1: 0x4029ce20, 0x16cb2: 0x4029d020, 0x16cb3: 0x4029d220, + 0x16cb4: 0x4029d420, 0x16cb5: 0x4029d620, 0x16cb6: 0x4029d820, 0x16cb7: 0x4029da20, + 0x16cb8: 0x4029dc20, 0x16cb9: 0x4029de20, 0x16cba: 0x40026c20, 0x16cbb: 0x40026220, + 0x16cbc: 0x40094020, 0x16cbd: 0x40094220, 0x16cbe: 0x40094420, 0x16cbf: 0x4002c420, + // Block 0x5b3, offset 0x16cc0 + 0x16cc0: 0x4004d620, 0x16cc1: 0xce2d0071, 0x16cc2: 0x002c0a88, 0x16cc3: 0xc3590953, + 0x16cc4: 0x002c6288, 0x16cc5: 0x002c9888, 0x16cc6: 0x002d0888, 0x16cc7: 0x002d2288, + 0x16cc8: 0x002d6888, 0x16cc9: 0x002d9a88, 0x16cca: 0x002dcc88, 0x16ccb: 0x002dfe88, + 0x16ccc: 0xc0030002, 0x16ccd: 0x002e8288, 0x16cce: 0x002e9e88, 0x16ccf: 0xc33f2741, + 0x16cd0: 0x002f2c88, 0x16cd1: 0x002f5688, 0x16cd2: 0xc35f0991, 0x16cd3: 0xc3430991, + 0x16cd4: 0x00302c88, 0x16cd5: 0x00306c88, 0x16cd6: 0x0030be88, 0x16cd7: 0x0030e288, + 0x16cd8: 0x0030f688, 0x16cd9: 0x00310088, 0x16cda: 0xc3630991, 0x16cdb: 0x4003f820, + 0x16cdc: 0x4004e420, 0x16cdd: 0x4003fa20, 0x16cde: 0x40062420, 0x16cdf: 0x40021620, + 0x16ce0: 0x40061e20, 0x16ce1: 0xce2b0071, 0x16ce2: 0x402c0a20, 0x16ce3: 0xc3550953, + 0x16ce4: 0x402c6220, 0x16ce5: 0x402c9820, 0x16ce6: 0x402d0820, 0x16ce7: 0x402d2220, + 0x16ce8: 0x402d6820, 0x16ce9: 0x402d9a20, 0x16cea: 0x402dcc20, 0x16ceb: 0x402dfe20, + 0x16cec: 0xc0000002, 0x16ced: 0x402e8220, 0x16cee: 0x402e9e20, 0x16cef: 0xc33d2741, + 0x16cf0: 0x402f2c20, 0x16cf1: 0x402f5620, 0x16cf2: 0xc35d0991, 0x16cf3: 0xc3410991, + 0x16cf4: 0x40302c20, 0x16cf5: 0x40306c20, 0x16cf6: 0x4030be20, 0x16cf7: 0x4030e220, + 0x16cf8: 0x4030f620, 0x16cf9: 0x40310020, 0x16cfa: 0xc3610991, 0x16cfb: 0x4003fc20, + 0x16cfc: 0x40094820, 0x16cfd: 0x4003fe20, 0x16cfe: 0x40094c20, 0x16cff: 0xa0000000, + // Block 0x5b4, offset 0x16d00 + 0x16d00: 0xe00008f5, 0x16d01: 0xe00008ef, 0x16d02: 0xe0000921, 0x16d03: 0xe0000969, + 0x16d04: 0x002be083, 0x16d05: 0xe000094d, 0x16d06: 0xe00009dd, 0x16d07: 0xe0000a53, + 0x16d08: 0xe0000ae8, 0x16d09: 0xe0000ae2, 0x16d0a: 0xe0000af4, 0x16d0b: 0xe0000b20, + 0x16d0c: 0xe0000c2b, 0x16d0d: 0xe0000c25, 0x16d0e: 0xe0000c37, 0x16d0f: 0xe0000c43, + 0x16d10: 0xe0000ab3, 0x16d11: 0xe0000d63, 0x16d12: 0xe0000d9a, 0x16d13: 0xe0000d94, + 0x16d14: 0x002ee483, 0x16d15: 0xe0000de6, 0x16d16: 0xe0000dd2, 0x16d17: 0x40093e20, + 0x16d18: 0xe0000e12, 0x16d19: 0xe0000fe1, 0x16d1a: 0xe0000fdb, 0x16d1b: 0xe0000fed, + 0x16d1c: 0xe0000fff, 0x16d1d: 0xe0001102, 0x16d1e: 0x00318888, 0x16d1f: 0xe0000f7b, + 0x16d20: 0xe00008f2, 0x16d21: 0xe00008ec, 0x16d22: 0xe000091e, 0x16d23: 0xe0000966, + 0x16d24: 0x402be020, 0x16d25: 0xe000094a, 0x16d26: 0xe00009d5, 0x16d27: 0xe0000a4d, + 0x16d28: 0xe0000ae5, 0x16d29: 0xe0000adf, 0x16d2a: 0xe0000af1, 0x16d2b: 0xe0000b1d, + 0x16d2c: 0xe0000c28, 0x16d2d: 0xe0000c22, 0x16d2e: 0xe0000c34, 0x16d2f: 0xe0000c40, + 0x16d30: 0xe0000aad, 0x16d31: 0xe0000d60, 0x16d32: 0xe0000d97, 0x16d33: 0xe0000d91, + 0x16d34: 0x402ee420, 0x16d35: 0xe0000de3, 0x16d36: 0xe0000dcf, 0x16d37: 0x40093c20, + 0x16d38: 0xe0000e0f, 0x16d39: 0xe0000fde, 0x16d3a: 0xe0000fd8, 0x16d3b: 0xe0000fea, + 0x16d3c: 0xe0000ffc, 0x16d3d: 0xe00010ff, 0x16d3e: 0x40318820, 0x16d3f: 0xe0001114, + // Block 0x5b5, offset 0x16d40 + 0x16d40: 0x40321220, 0x16d41: 0x40321a20, 0x16d42: 0x40322220, 0x16d43: 0x40322a20, + 0x16d44: 0xe0000ad5, 0x16d45: 0xe0000ad1, 0x16d46: 0xe0000acd, 0x16d47: 0xf0000a0a, + 0x16d48: 0xf000040a, 0x16d49: 0xf0000404, 0x16d4a: 0xf0000a0a, 0x16d4b: 0xf000040a, + 0x16d4c: 0xf0000404, 0x16d4d: 0xe0000947, 0x16d4e: 0xe0000944, 0x16d4f: 0xe0000c3d, + 0x16d50: 0xe0000c3a, 0x16d51: 0xe0000dcc, 0x16d52: 0xe0000dc9, 0x16d53: 0xe0000ff3, + 0x16d54: 0xe0000ff0, 0x16d55: 0xe000101e, 0x16d56: 0xe000101a, 0x16d57: 0xe0001006, + 0x16d58: 0xe0001002, 0x16d59: 0xe0001016, 0x16d5a: 0xe0001012, 0x16d5b: 0xe000100e, + 0x16d5c: 0xe000100a, 0x16d5d: 0x402cae20, 0x16d5e: 0xe0003884, 0x16d5f: 0xe0003881, + 0x16d60: 0xe0000976, 0x16d61: 0xe0000972, 0x16d62: 0xe00009f4, 0x16d63: 0xe00009ef, + 0x16d64: 0x002d3a88, 0x16d65: 0x402d3a20, 0x16d66: 0xe0000bbe, 0x16d67: 0xe0000bbb, + 0x16d68: 0xe0000c99, 0x16d69: 0xe0000c96, 0x16d6a: 0xe0000e20, 0x16d6b: 0xe0000e1d, + 0x16d6c: 0xe0000e27, 0x16d6d: 0xe0000e23, 0x16d6e: 0xe0001162, 0x16d6f: 0xe000115f, + 0x16d70: 0xe0000c8d, 0x16d71: 0xf0000a0a, 0x16d72: 0xf000040a, 0x16d73: 0xf0000404, + 0x16d74: 0xe0000bac, 0x16d75: 0xe0000ba9, 0x16d76: 0x002d7888, 0x16d77: 0x00319488, + 0x16d78: 0xe0000d57, 0x16d79: 0xe0000d54, 0x16d7a: 0xe0000954, 0x16d7b: 0xe0000950, + 0x16d7c: 0xe00009ea, 0x16d7d: 0xe00009e5, 0x16d7e: 0xe0000e19, 0x16d7f: 0xe0000e15, + // Block 0x5b6, offset 0x16d80 + 0x16d80: 0xe0000b03, 0x16d81: 0xe0000aff, 0x16d82: 0xe0000b13, 0x16d83: 0xe0000b0f, + 0x16d84: 0xe0000b0b, 0x16d85: 0xe0000b07, 0x16d86: 0xe0000b75, 0x16d87: 0xe0000b71, + 0x16d88: 0xe0000c66, 0x16d89: 0xe0000c63, 0x16d8a: 0xe0000c78, 0x16d8b: 0xe0000c75, + 0x16d8c: 0xe0000e84, 0x16d8d: 0xe0000e81, 0x16d8e: 0xe0000e44, 0x16d8f: 0xe0000e41, + 0x16d90: 0xe000acf1, 0x16d91: 0xe000acee, 0x16d92: 0xe000acf7, 0x16d93: 0xe000acf4, + 0x16d94: 0xe000acfd, 0x16d95: 0xe000acfa, 0x16d96: 0xe0002946, 0x16d97: 0xe0002943, + 0x16d98: 0xe000ad03, 0x16d99: 0xe000ad00, 0x16d9a: 0xe0000e5d, 0x16d9b: 0xe0000e59, + 0x16d9c: 0xe0000e65, 0x16d9d: 0xe0000e61, 0x16d9e: 0xe0000e75, 0x16d9f: 0xe0000e71, + 0x16da0: 0xe0000e6d, 0x16da1: 0xe0000e69, 0x16da2: 0xe0000e7d, 0x16da3: 0xe0000e79, + 0x16da4: 0xe000108d, 0x16da5: 0xe000108a, 0x16da6: 0xe000104d, 0x16da7: 0xe000104a, + 0x16da8: 0xe0001066, 0x16da9: 0xe0001062, 0x16daa: 0xe000106e, 0x16dab: 0xe000106a, + 0x16dac: 0xe000107e, 0x16dad: 0xe000107a, 0x16dae: 0xe0001076, 0x16daf: 0xe0001072, + 0x16db0: 0xe0001086, 0x16db1: 0xe0001082, 0x16db2: 0xe0001108, 0x16db3: 0xe0001105, + 0x16db4: 0xe0001135, 0x16db5: 0xe0001132, 0x16db6: 0xe000112f, 0x16db7: 0xe000112c, + 0x16db8: 0xe000111d, 0x16db9: 0xe000111a, 0x16dba: 0xe0000d0a, 0x16dbb: 0xe0000d07, + 0x16dbc: 0x0030d888, 0x16dbd: 0x4030d820, 0x16dbe: 0x00312088, 0x16dbf: 0x40312020, + // Block 0x5b7, offset 0x16dc0 + 0x16dc0: 0xa0000000, 0x16dc1: 0xa0000000, 0x16dc2: 0xa0000000, 0x16dc3: 0xa0000000, + 0x16dc4: 0xa0000000, 0x16dc5: 0xa0000000, 0x16dc6: 0xa0000000, 0x16dc7: 0xa0000000, + 0x16dc8: 0xa0000000, 0x16dc9: 0x40020020, 0x16dca: 0x40020220, 0x16dcb: 0x40020420, + 0x16dcc: 0x40020620, 0x16dcd: 0x40020820, 0x16dce: 0xa0000000, 0x16dcf: 0xa0000000, + 0x16dd0: 0xa0000000, 0x16dd1: 0xa0000000, 0x16dd2: 0xa0000000, 0x16dd3: 0xa0000000, + 0x16dd4: 0xa0000000, 0x16dd5: 0xa0000000, 0x16dd6: 0xa0000000, 0x16dd7: 0xa0000000, + 0x16dd8: 0xa0000000, 0x16dd9: 0xa0000000, 0x16dda: 0xa0000000, 0x16ddb: 0xa0000000, + 0x16ddc: 0xa0000000, 0x16ddd: 0xa0000000, 0x16dde: 0xa0000000, 0x16ddf: 0xa0000000, + 0x16de0: 0x40021220, 0x16de1: 0x4002ba20, 0x16de2: 0x4003e020, 0x16de3: 0x4004ea20, + 0x16de4: 0x4027de20, 0x16de5: 0x4004ec20, 0x16de6: 0x4004e620, 0x16de7: 0x4003d220, + 0x16de8: 0x4003f420, 0x16de9: 0x4003f620, 0x16dea: 0x4004d820, 0x16deb: 0x40093820, + 0x16dec: 0x40024020, 0x16ded: 0x40021a20, 0x16dee: 0x4002e420, 0x16def: 0x4004e220, + 0x16df0: 0x4029cc20, 0x16df1: 0x4029ce20, 0x16df2: 0x4029d020, 0x16df3: 0x4029d220, + 0x16df4: 0x4029d420, 0x16df5: 0x4029d620, 0x16df6: 0x4029d820, 0x16df7: 0x4029da20, + 0x16df8: 0x4029dc20, 0x16df9: 0x4029de20, 0x16dfa: 0x40026c20, 0x16dfb: 0x40026220, + 0x16dfc: 0x40094020, 0x16dfd: 0x40094220, 0x16dfe: 0x40094420, 0x16dff: 0x4002c420, + // Block 0x5b8, offset 0x16e00 + 0x16e00: 0x4004d620, 0x16e01: 0x002bde88, 0x16e02: 0x002c0a88, 0x16e03: 0xc5872851, + 0x16e04: 0x002c6288, 0x16e05: 0x002c9888, 0x16e06: 0x002d0888, 0x16e07: 0x002d2288, + 0x16e08: 0x002d6888, 0x16e09: 0x002d9a88, 0x16e0a: 0x002dcc88, 0x16e0b: 0x002dfe88, + 0x16e0c: 0xc0030002, 0x16e0d: 0x002e8288, 0x16e0e: 0x002e9e88, 0x16e0f: 0x002ee288, + 0x16e10: 0x002f2c88, 0x16e11: 0x002f5688, 0x16e12: 0x002f7a88, 0x16e13: 0xc3430991, + 0x16e14: 0x00302c88, 0x16e15: 0x00306c88, 0x16e16: 0x0030be88, 0x16e17: 0x0030e288, + 0x16e18: 0x0030f688, 0x16e19: 0x00310088, 0x16e1a: 0xc3630991, 0x16e1b: 0x4003f820, + 0x16e1c: 0x4004e420, 0x16e1d: 0x4003fa20, 0x16e1e: 0x40062420, 0x16e1f: 0x40021620, + 0x16e20: 0x40061e20, 0x16e21: 0x402bde20, 0x16e22: 0x402c0a20, 0x16e23: 0xc5842851, + 0x16e24: 0x402c6220, 0x16e25: 0x402c9820, 0x16e26: 0x402d0820, 0x16e27: 0x402d2220, + 0x16e28: 0x402d6820, 0x16e29: 0x402d9a20, 0x16e2a: 0x402dcc20, 0x16e2b: 0x402dfe20, + 0x16e2c: 0xc0000002, 0x16e2d: 0x402e8220, 0x16e2e: 0x402e9e20, 0x16e2f: 0x402ee220, + 0x16e30: 0x402f2c20, 0x16e31: 0x402f5620, 0x16e32: 0x402f7a20, 0x16e33: 0xc3410991, + 0x16e34: 0x40302c20, 0x16e35: 0x40306c20, 0x16e36: 0x4030be20, 0x16e37: 0x4030e220, + 0x16e38: 0x4030f620, 0x16e39: 0x40310020, 0x16e3a: 0xc3610991, 0x16e3b: 0x4003fc20, + 0x16e3c: 0x40094820, 0x16e3d: 0x4003fe20, 0x16e3e: 0x40094c20, 0x16e3f: 0xa0000000, + // Block 0x5b9, offset 0x16e40 + 0x16e40: 0xe0000983, 0x16e41: 0xe0000980, 0x16e42: 0xe00008fb, 0x16e43: 0xe00008f8, + 0x16e44: 0xe000097d, 0x16e45: 0xe000097a, 0x16e46: 0x002c3e83, 0x16e47: 0x402c3e20, + 0x16e48: 0xe0000a3e, 0x16e49: 0xe0000a3b, 0x16e4a: 0xe0000a4a, 0x16e4b: 0xe0000a47, + 0x16e4c: 0x002c3c83, 0x16e4d: 0x402c3c20, 0x16e4e: 0xe0000a86, 0x16e4f: 0xe0000a83, + 0x16e50: 0x002c6483, 0x16e51: 0x402c6420, 0x16e52: 0xe0000b46, 0x16e53: 0xe0000b43, + 0x16e54: 0xe0000aee, 0x16e55: 0xe0000aeb, 0x16e56: 0xe0000b2c, 0x16e57: 0xe0000b29, + 0x16e58: 0xe0000b40, 0x16e59: 0xe0000b3d, 0x16e5a: 0xe0000b1a, 0x16e5b: 0xe0000b17, + 0x16e5c: 0xe0000bb8, 0x16e5d: 0xe0000bb5, 0x16e5e: 0xe0000bb2, 0x16e5f: 0xe0000baf, + 0x16e60: 0xe0000bc4, 0x16e61: 0xe0000bc1, 0x16e62: 0xe0000bca, 0x16e63: 0xe0000bc7, + 0x16e64: 0xe0000bee, 0x16e65: 0xe0000beb, 0x16e66: 0xe0000c1b, 0x16e67: 0xe0000c18, + 0x16e68: 0xe0000c51, 0x16e69: 0xe0000c4e, 0x16e6a: 0xe0000c60, 0x16e6b: 0xe0000c5d, + 0x16e6c: 0xe0000c31, 0x16e6d: 0xe0000c2e, 0x16e6e: 0xe0000c5a, 0x16e6f: 0xe0000c57, + 0x16e70: 0xe0000c54, 0x16e71: 0x402da220, 0x16e72: 0xf0000a0a, 0x16e73: 0xf0000404, + 0x16e74: 0xe0000c8a, 0x16e75: 0xe0000c87, 0x16e76: 0xe0000c9f, 0x16e77: 0xe0000c9c, + 0x16e78: 0x402f7220, 0x16e79: 0xe0000ccc, 0x16e7a: 0xe0000cc9, 0x16e7b: 0xe0000cd8, + 0x16e7c: 0xe0000cd5, 0x16e7d: 0xe0000cd2, 0x16e7e: 0xe0000ccf, 0x16e7f: 0xe0000d04, + // Block 0x5ba, offset 0x16e80 + 0x16e80: 0xa0000000, 0x16e81: 0xa0000000, 0x16e82: 0xa0000000, 0x16e83: 0xa0000000, + 0x16e84: 0xa0000000, 0x16e85: 0xa0000000, 0x16e86: 0xa0000000, 0x16e87: 0xa0000000, + 0x16e88: 0xa0000000, 0x16e89: 0x40020020, 0x16e8a: 0x40020220, 0x16e8b: 0x40020420, + 0x16e8c: 0x40020620, 0x16e8d: 0x40020820, 0x16e8e: 0xa0000000, 0x16e8f: 0xa0000000, + 0x16e90: 0xa0000000, 0x16e91: 0xa0000000, 0x16e92: 0xa0000000, 0x16e93: 0xa0000000, + 0x16e94: 0xa0000000, 0x16e95: 0xa0000000, 0x16e96: 0xa0000000, 0x16e97: 0xa0000000, + 0x16e98: 0xa0000000, 0x16e99: 0xa0000000, 0x16e9a: 0xa0000000, 0x16e9b: 0xa0000000, + 0x16e9c: 0xa0000000, 0x16e9d: 0xa0000000, 0x16e9e: 0xa0000000, 0x16e9f: 0xa0000000, + 0x16ea0: 0x40021220, 0x16ea1: 0x4002ba20, 0x16ea2: 0x4003e020, 0x16ea3: 0x4004ea20, + 0x16ea4: 0x4027de20, 0x16ea5: 0x4004ec20, 0x16ea6: 0x4004e620, 0x16ea7: 0x4003d220, + 0x16ea8: 0x4003f420, 0x16ea9: 0x4003f620, 0x16eaa: 0x4004d820, 0x16eab: 0x40093820, + 0x16eac: 0x40024020, 0x16ead: 0x40021a20, 0x16eae: 0x4002e420, 0x16eaf: 0x4004e220, + 0x16eb0: 0x4029cc20, 0x16eb1: 0x4029ce20, 0x16eb2: 0x4029d020, 0x16eb3: 0x4029d220, + 0x16eb4: 0x4029d420, 0x16eb5: 0x4029d620, 0x16eb6: 0x4029d820, 0x16eb7: 0x4029da20, + 0x16eb8: 0x4029dc20, 0x16eb9: 0x4029de20, 0x16eba: 0x40026c20, 0x16ebb: 0x40026220, + 0x16ebc: 0x40094020, 0x16ebd: 0x40094220, 0x16ebe: 0x40094420, 0x16ebf: 0x4002c420, + // Block 0x5bb, offset 0x16ec0 + 0x16ec0: 0x4004d620, 0x16ec1: 0x002bde88, 0x16ec2: 0x002c0a88, 0x16ec3: 0xcab40911, + 0x16ec4: 0xce8909c2, 0x16ec5: 0xc6220071, 0x16ec6: 0x002d0888, 0x16ec7: 0xce8c2a12, + 0x16ec8: 0x002d6888, 0x16ec9: 0x002d9a88, 0x16eca: 0x002dcc88, 0x16ecb: 0x002dfe88, + 0x16ecc: 0xce930ac4, 0x16ecd: 0x002e8288, 0x16ece: 0xce982a12, 0x16ecf: 0x002ee288, + 0x16ed0: 0x002f2c88, 0x16ed1: 0x002f5688, 0x16ed2: 0xce9b9602, 0x16ed3: 0xce9e09c2, + 0x16ed4: 0xcea309c2, 0x16ed5: 0x00306c88, 0x16ed6: 0x0030be88, 0x16ed7: 0x0030e288, + 0x16ed8: 0xcea809c2, 0x16ed9: 0x00310088, 0x16eda: 0xceab09c2, 0x16edb: 0x4003f820, + 0x16edc: 0x4004e420, 0x16edd: 0x4003fa20, 0x16ede: 0x40062420, 0x16edf: 0x40021620, + 0x16ee0: 0x40061e20, 0x16ee1: 0x402bde20, 0x16ee2: 0x402c0a20, 0x16ee3: 0xcab20911, + 0x16ee4: 0xce8709b1, 0x16ee5: 0xc6200071, 0x16ee6: 0x402d0820, 0x16ee7: 0xcab62a01, + 0x16ee8: 0x402d6820, 0x16ee9: 0x402d9a20, 0x16eea: 0x402dcc20, 0x16eeb: 0x402dfe20, + 0x16eec: 0xce8f0a73, 0x16eed: 0x402e8220, 0x16eee: 0xcac62a01, 0x16eef: 0x402ee220, + 0x16ef0: 0x402f2c20, 0x16ef1: 0x402f5620, 0x16ef2: 0xcaca95f1, 0x16ef3: 0xcace09b1, + 0x16ef4: 0xcea109b1, 0x16ef5: 0x40306c20, 0x16ef6: 0x4030be20, 0x16ef7: 0x4030e220, + 0x16ef8: 0xcea609b1, 0x16ef9: 0x40310020, 0x16efa: 0xcad209b1, 0x16efb: 0x4003fc20, + 0x16efc: 0x40094820, 0x16efd: 0x4003fe20, 0x16efe: 0x40094c20, 0x16eff: 0xa0000000, + // Block 0x5bc, offset 0x16f00 + 0x16f00: 0xe00008f5, 0x16f01: 0xe00008ef, 0x16f02: 0xe0000921, 0x16f03: 0xe0000969, + 0x16f04: 0xe000095b, 0x16f05: 0xe000094d, 0x16f06: 0xe00009dd, 0x16f07: 0x002c6083, + 0x16f08: 0xe0000ae8, 0x16f09: 0xe0000ae2, 0x16f0a: 0xe0000af4, 0x16f0b: 0x002d0683, + 0x16f0c: 0xe0000c2b, 0x16f0d: 0xe0000c25, 0x16f0e: 0xe0000c37, 0x16f0f: 0xe0000c43, + 0x16f10: 0xe0000ab3, 0x16f11: 0xe0000d63, 0x16f12: 0xe0000d9a, 0x16f13: 0xe0000d94, + 0x16f14: 0xe0000da6, 0x16f15: 0xe0000de6, 0x16f16: 0xe0000dd2, 0x16f17: 0x40093e20, + 0x16f18: 0xe0000e12, 0x16f19: 0xe0000fe1, 0x16f1a: 0xe0000fdb, 0x16f1b: 0xe0000fed, + 0x16f1c: 0xe0000fff, 0x16f1d: 0xe0001102, 0x16f1e: 0x00318888, 0x16f1f: 0xe0000f7b, + 0x16f20: 0xe00008f2, 0x16f21: 0xe00008ec, 0x16f22: 0xe000091e, 0x16f23: 0xe0000966, + 0x16f24: 0xe0000958, 0x16f25: 0xe000094a, 0x16f26: 0xe00009d5, 0x16f27: 0x402c6020, + 0x16f28: 0xe0000ae5, 0x16f29: 0xe0000adf, 0x16f2a: 0xe0000af1, 0x16f2b: 0x402d0620, + 0x16f2c: 0xe0000c28, 0x16f2d: 0xe0000c22, 0x16f2e: 0xe0000c34, 0x16f2f: 0xe0000c40, + 0x16f30: 0xe0000aad, 0x16f31: 0xe0000d60, 0x16f32: 0xe0000d97, 0x16f33: 0xe0000d91, + 0x16f34: 0xe0000da3, 0x16f35: 0xe0000de3, 0x16f36: 0xe0000dcf, 0x16f37: 0x40093c20, + 0x16f38: 0xe0000e0f, 0x16f39: 0xe0000fde, 0x16f3a: 0xe0000fd8, 0x16f3b: 0xe0000fea, + 0x16f3c: 0xe0000ffc, 0x16f3d: 0xe00010ff, 0x16f3e: 0x40318820, 0x16f3f: 0xe0001114, + // Block 0x5bd, offset 0x16f40 + 0x16f40: 0xe00009b1, 0x16f41: 0xe00009ae, 0x16f42: 0xe0000a22, 0x16f43: 0xe0000a1f, + 0x16f44: 0xe0000a28, 0x16f45: 0xe0000a25, 0x16f46: 0xe0000a2e, 0x16f47: 0xe0000a2b, + 0x16f48: 0xe000ad7e, 0x16f49: 0xe000ad7b, 0x16f4a: 0xe0000a8c, 0x16f4b: 0xe0000a89, + 0x16f4c: 0xe0000a98, 0x16f4d: 0xe0000a95, 0x16f4e: 0xe0000aa4, 0x16f4f: 0xe0000aa1, + 0x16f50: 0xe0000a92, 0x16f51: 0xe0000a8f, 0x16f52: 0xe0000a9e, 0x16f53: 0xe0000a9b, + 0x16f54: 0xe0000b55, 0x16f55: 0xe0000b51, 0x16f56: 0xe0000b4d, 0x16f57: 0xe0000b49, + 0x16f58: 0xe0000b7c, 0x16f59: 0xe0000b79, 0x16f5a: 0xe0000b82, 0x16f5b: 0xe0000b7f, + 0x16f5c: 0xe0000b39, 0x16f5d: 0xe0000b35, 0x16f5e: 0xe0000b8c, 0x16f5f: 0xe0000b89, + 0x16f60: 0xe0000bd0, 0x16f61: 0xe0000bcd, 0x16f62: 0xe0000c00, 0x16f63: 0xe0000bfd, + 0x16f64: 0xe0000c0c, 0x16f65: 0xe0000c09, 0x16f66: 0xe0000bfa, 0x16f67: 0xe0000bf7, + 0x16f68: 0xe0000c06, 0x16f69: 0xe0000c03, 0x16f6a: 0xe0000c12, 0x16f6b: 0xe0000c0f, + 0x16f6c: 0xe0000c7e, 0x16f6d: 0xe0000c7b, 0x16f6e: 0xe0000c4a, 0x16f6f: 0xe0000c46, + 0x16f70: 0xe0000c93, 0x16f71: 0xe0000c90, 0x16f72: 0xe0000cab, 0x16f73: 0xe0000ca8, + 0x16f74: 0xe0000cb1, 0x16f75: 0xe0000cae, 0x16f76: 0xe0000cde, 0x16f77: 0xe0000cdb, + 0x16f78: 0xe0000ce5, 0x16f79: 0xe0000ce1, 0x16f7a: 0xe0000cf2, 0x16f7b: 0xe0000cef, + 0x16f7c: 0xe0000cec, 0x16f7d: 0xe0000ce9, 0x16f7e: 0xe0000d1e, 0x16f7f: 0xe0000d1b, + // Block 0x5be, offset 0x16f80 + 0x16f80: 0xa0000000, 0x16f81: 0xa0000000, 0x16f82: 0xa0000000, 0x16f83: 0xa0000000, + 0x16f84: 0xa0000000, 0x16f85: 0xa0000000, 0x16f86: 0xa0000000, 0x16f87: 0xa0000000, + 0x16f88: 0xa0000000, 0x16f89: 0x40020020, 0x16f8a: 0x40020220, 0x16f8b: 0x40020420, + 0x16f8c: 0x40020620, 0x16f8d: 0x40020820, 0x16f8e: 0xa0000000, 0x16f8f: 0xa0000000, + 0x16f90: 0xa0000000, 0x16f91: 0xa0000000, 0x16f92: 0xa0000000, 0x16f93: 0xa0000000, + 0x16f94: 0xa0000000, 0x16f95: 0xa0000000, 0x16f96: 0xa0000000, 0x16f97: 0xa0000000, + 0x16f98: 0xa0000000, 0x16f99: 0xa0000000, 0x16f9a: 0xa0000000, 0x16f9b: 0xa0000000, + 0x16f9c: 0xa0000000, 0x16f9d: 0xa0000000, 0x16f9e: 0xa0000000, 0x16f9f: 0xa0000000, + 0x16fa0: 0x40021220, 0x16fa1: 0x4002ba20, 0x16fa2: 0x4003e020, 0x16fa3: 0x4004ea20, + 0x16fa4: 0x4027de20, 0x16fa5: 0x4004ec20, 0x16fa6: 0x4004e620, 0x16fa7: 0x4003d220, + 0x16fa8: 0x4003f420, 0x16fa9: 0x4003f620, 0x16faa: 0x4004d820, 0x16fab: 0x40093820, + 0x16fac: 0x40024020, 0x16fad: 0x40021a20, 0x16fae: 0x4002e420, 0x16faf: 0x4004e220, + 0x16fb0: 0x4029cc20, 0x16fb1: 0x4029ce20, 0x16fb2: 0x4029d020, 0x16fb3: 0x4029d220, + 0x16fb4: 0x4029d420, 0x16fb5: 0x4029d620, 0x16fb6: 0x4029d820, 0x16fb7: 0x4029da20, + 0x16fb8: 0x4029dc20, 0x16fb9: 0x4029de20, 0x16fba: 0x40026c20, 0x16fbb: 0x40026220, + 0x16fbc: 0x40094020, 0x16fbd: 0x40094220, 0x16fbe: 0x40094420, 0x16fbf: 0x4002c420, + // Block 0x5bf, offset 0x16fc0 + 0x16fc0: 0x4004d620, 0x16fc1: 0xc56727b1, 0x16fc2: 0x002c0a88, 0x16fc3: 0x002c3a88, + 0x16fc4: 0x002c6288, 0x16fc5: 0xceb00be1, 0x16fc6: 0x002d0888, 0x16fc7: 0x002d2288, + 0x16fc8: 0x002d6888, 0x16fc9: 0x002d9a88, 0x16fca: 0x002dcc88, 0x16fcb: 0x002dfe88, + 0x16fcc: 0xc0030002, 0x16fcd: 0x002e8288, 0x16fce: 0x002e9e88, 0x16fcf: 0xceb69621, + 0x16fd0: 0x002f2c88, 0x16fd1: 0x002f5688, 0x16fd2: 0x002f7a88, 0x16fd3: 0x002fe688, + 0x16fd4: 0x00302c88, 0x16fd5: 0xc3900b21, 0x16fd6: 0x0030be88, 0x16fd7: 0x0030e288, + 0x16fd8: 0x0030f688, 0x16fd9: 0x00310088, 0x16fda: 0x00312a88, 0x16fdb: 0x4003f820, + 0x16fdc: 0x4004e420, 0x16fdd: 0x4003fa20, 0x16fde: 0x40062420, 0x16fdf: 0x40021620, + 0x16fe0: 0x40061e20, 0x16fe1: 0xc56427b1, 0x16fe2: 0x402c0a20, 0x16fe3: 0x402c3a20, + 0x16fe4: 0x402c6220, 0x16fe5: 0xceae0be1, 0x16fe6: 0x402d0820, 0x16fe7: 0x402d2220, + 0x16fe8: 0x402d6820, 0x16fe9: 0x402d9a20, 0x16fea: 0x402dcc20, 0x16feb: 0x402dfe20, + 0x16fec: 0xc0000002, 0x16fed: 0x402e8220, 0x16fee: 0x402e9e20, 0x16fef: 0xceb29621, + 0x16ff0: 0x402f2c20, 0x16ff1: 0x402f5620, 0x16ff2: 0x402f7a20, 0x16ff3: 0x402fe620, + 0x16ff4: 0x40302c20, 0x16ff5: 0xc38d0b21, 0x16ff6: 0x4030be20, 0x16ff7: 0x4030e220, + 0x16ff8: 0x4030f620, 0x16ff9: 0x40310020, 0x16ffa: 0x40312a20, 0x16ffb: 0x4003fc20, + 0x16ffc: 0x40094820, 0x16ffd: 0x4003fe20, 0x16ffe: 0x40094c20, 0x16fff: 0xa0000000, + // Block 0x5c0, offset 0x17000 + 0x17000: 0xe00008f5, 0x17001: 0xe00008ef, 0x17002: 0xe0000921, 0x17003: 0xe0000969, + 0x17004: 0x00320e83, 0x17005: 0x00320c83, 0x17006: 0x00320ea3, 0x17007: 0xe0000a53, + 0x17008: 0xe0000ae8, 0x17009: 0xe0000ae2, 0x1700a: 0xe0000af4, 0x1700b: 0xe0000b20, + 0x1700c: 0xe0000c2b, 0x1700d: 0xe0000c25, 0x1700e: 0xe0000c37, 0x1700f: 0xe0000c43, + 0x17010: 0x002c62c3, 0x17011: 0xe0000d63, 0x17012: 0xe0000d9a, 0x17013: 0xe0000d94, + 0x17014: 0x00321103, 0x17015: 0xe0000de6, 0x17016: 0x00321083, 0x17017: 0x40093e20, + 0x17018: 0x003210a3, 0x17019: 0xe0000fe1, 0x1701a: 0xe0000fdb, 0x1701b: 0xe0000fed, + 0x1701c: 0x003100a3, 0x1701d: 0xe0001102, 0x1701e: 0xe0002973, 0x1701f: 0xe0000f7b, + 0x17020: 0xe00008f2, 0x17021: 0xe00008ec, 0x17022: 0xe000091e, 0x17023: 0xe0000966, + 0x17024: 0x40320e20, 0x17025: 0x40320c20, 0x17026: 0x40320e21, 0x17027: 0xe0000a4d, + 0x17028: 0xe0000ae5, 0x17029: 0xe0000adf, 0x1702a: 0xe0000af1, 0x1702b: 0xe0000b1d, + 0x1702c: 0xe0000c28, 0x1702d: 0xe0000c22, 0x1702e: 0xe0000c34, 0x1702f: 0xe0000c40, + 0x17030: 0x402c6222, 0x17031: 0xe0000d60, 0x17032: 0xe0000d97, 0x17033: 0xe0000d91, + 0x17034: 0x40321024, 0x17035: 0xe0000de3, 0x17036: 0x40321020, 0x17037: 0x40093c20, + 0x17038: 0x40321021, 0x17039: 0xe0000fde, 0x1703a: 0xe0000fd8, 0x1703b: 0xe0000fea, + 0x1703c: 0x40310021, 0x1703d: 0xe00010ff, 0x1703e: 0xe0002970, 0x1703f: 0xe0001114, + // Block 0x5c1, offset 0x17040 + 0x17040: 0xe0000983, 0x17041: 0xe0000980, 0x17042: 0xe00008fb, 0x17043: 0xe00008f8, + 0x17044: 0xe000097d, 0x17045: 0xe000097a, 0x17046: 0xe0000a38, 0x17047: 0xe0000a35, + 0x17048: 0xe0000a3e, 0x17049: 0xe0000a3b, 0x1704a: 0xe0000a4a, 0x1704b: 0xe0000a47, + 0x1704c: 0xe0000a44, 0x1704d: 0xe0000a41, 0x1704e: 0xe0000a86, 0x1704f: 0xe0000a83, + 0x17050: 0x002c62a3, 0x17051: 0x402c6221, 0x17052: 0xe0000b46, 0x17053: 0xe0000b43, + 0x17054: 0xe0000aee, 0x17055: 0xe0000aeb, 0x17056: 0xe0000b2c, 0x17057: 0xe0000b29, + 0x17058: 0x00320ec3, 0x17059: 0x40320e22, 0x1705a: 0xe0000b1a, 0x1705b: 0xe0000b17, + 0x1705c: 0xe0000bb8, 0x1705d: 0xe0000bb5, 0x1705e: 0xe0000bb2, 0x1705f: 0xe0000baf, + 0x17060: 0xe0000bc4, 0x17061: 0xe0000bc1, 0x17062: 0xe0000bca, 0x17063: 0xe0000bc7, + 0x17064: 0xe0000bee, 0x17065: 0xe0000beb, 0x17066: 0xe0000c1b, 0x17067: 0xe0000c18, + 0x17068: 0xe0000c51, 0x17069: 0xe0000c4e, 0x1706a: 0xe0000c60, 0x1706b: 0xe0000c5d, + 0x1706c: 0xe0000c31, 0x1706d: 0xe0000c2e, 0x1706e: 0xe0000c5a, 0x1706f: 0xe0000c57, + 0x17070: 0xe0000c54, 0x17071: 0x402da220, 0x17072: 0xf0000a0a, 0x17073: 0xf0000404, + 0x17074: 0xe0000c8a, 0x17075: 0xe0000c87, 0x17076: 0xe0000c9f, 0x17077: 0xe0000c9c, + 0x17078: 0x402f7220, 0x17079: 0xe0000ccc, 0x1707a: 0xe0000cc9, 0x1707b: 0xe0000cd8, + 0x1707c: 0xe0000cd5, 0x1707d: 0xe0000cd2, 0x1707e: 0xe0000ccf, 0x1707f: 0xe0000d04, + // Block 0x5c2, offset 0x17080 + 0x17080: 0xe0000cfe, 0x17081: 0xe0000cf8, 0x17082: 0xe0000cf5, 0x17083: 0xe0000d51, + 0x17084: 0xe0000d4e, 0x17085: 0xe0000d6f, 0x17086: 0xe0000d6c, 0x17087: 0xe0000d5d, + 0x17088: 0xe0000d5a, 0x17089: 0xf0000404, 0x1708a: 0x002eda88, 0x1708b: 0x402eda20, + 0x1708c: 0xe0000e2e, 0x1708d: 0xe0000e2b, 0x1708e: 0xe0000da0, 0x1708f: 0xe0000d9d, + 0x17090: 0x003210c3, 0x17091: 0x40321022, 0x17092: 0x003210e3, 0x17093: 0x40321023, + 0x17094: 0xe0000eca, 0x17095: 0xe0000ec7, 0x17096: 0xe0000edc, 0x17097: 0xe0000ed9, + 0x17098: 0xe0000ed0, 0x17099: 0xe0000ecd, 0x1709a: 0xe0000f1f, 0x1709b: 0xe0000f1c, + 0x1709c: 0xe0000f2d, 0x1709d: 0xe0000f2a, 0x1709e: 0xe0000f47, 0x1709f: 0xe0000f44, + 0x170a0: 0xe0000f33, 0x170a1: 0xe0000f30, 0x170a2: 0xe0000f99, 0x170a3: 0xe0000f96, + 0x170a4: 0xe0000f8a, 0x170a5: 0xe0000f87, 0x170a6: 0x00303688, 0x170a7: 0x40303620, + 0x170a8: 0xe000102b, 0x170a9: 0xe0001028, 0x170aa: 0xe000103f, 0x170ab: 0xe000103c, + 0x170ac: 0xe0000fe7, 0x170ad: 0xe0000fe4, 0x170ae: 0xe0000ff9, 0x170af: 0xe0000ff6, + 0x170b0: 0x003100c3, 0x170b1: 0x40310022, 0x170b2: 0xe0001039, 0x170b3: 0xe0001036, + 0x170b4: 0xe00010d8, 0x170b5: 0xe00010d5, 0x170b6: 0xe000110e, 0x170b7: 0xe000110b, + 0x170b8: 0xe0001117, 0x170b9: 0xe000113b, 0x170ba: 0xe0001138, 0x170bb: 0xe000114d, + 0x170bc: 0xe000114a, 0x170bd: 0xe0001147, 0x170be: 0xe0001144, 0x170bf: 0xe0000f64, + // Block 0x5c3, offset 0x170c0 + 0x170c0: 0x40321220, 0x170c1: 0x40321a20, 0x170c2: 0x40322220, 0x170c3: 0x40322a20, + 0x170c4: 0xe0000ad5, 0x170c5: 0xe0000ad1, 0x170c6: 0xe0000acd, 0x170c7: 0xf0000a0a, + 0x170c8: 0xf000040a, 0x170c9: 0xf0000404, 0x170ca: 0xf0000a0a, 0x170cb: 0xf000040a, + 0x170cc: 0xf0000404, 0x170cd: 0xe0000947, 0x170ce: 0xe0000944, 0x170cf: 0xe0000c3d, + 0x170d0: 0xe0000c3a, 0x170d1: 0xe0000dcc, 0x170d2: 0xe0000dc9, 0x170d3: 0xe0000ff3, + 0x170d4: 0xe0000ff0, 0x170d5: 0xe000298b, 0x170d6: 0xe0002988, 0x170d7: 0xe0002979, + 0x170d8: 0xe0002976, 0x170d9: 0xe0002985, 0x170da: 0xe0002982, 0x170db: 0xe000297f, + 0x170dc: 0xe000297c, 0x170dd: 0x402cae20, 0x170de: 0xe000379e, 0x170df: 0xe000379b, + 0x170e0: 0xe0000976, 0x170e1: 0xe0000972, 0x170e2: 0xe00029af, 0x170e3: 0xe00029ac, + 0x170e4: 0x002d3a88, 0x170e5: 0x402d3a20, 0x170e6: 0xe0000bbe, 0x170e7: 0xe0000bbb, + 0x170e8: 0xe0000c99, 0x170e9: 0xe0000c96, 0x170ea: 0xe0000e20, 0x170eb: 0xe0000e1d, + 0x170ec: 0xe0000e27, 0x170ed: 0xe0000e23, 0x170ee: 0xe0001162, 0x170ef: 0xe000115f, + 0x170f0: 0xe0000c8d, 0x170f1: 0xf0000a0a, 0x170f2: 0xf000040a, 0x170f3: 0xf0000404, + 0x170f4: 0xe0000bac, 0x170f5: 0xe0000ba9, 0x170f6: 0x002d7888, 0x170f7: 0x00319488, + 0x170f8: 0xe0000d57, 0x170f9: 0xe0000d54, 0x170fa: 0xe0002991, 0x170fb: 0xe000298e, + 0x170fc: 0xe00037a4, 0x170fd: 0xe00037a1, 0x170fe: 0xe00037b6, 0x170ff: 0xe00037b3, + // Block 0x5c4, offset 0x17100 + 0x17100: 0xe0000b03, 0x17101: 0xe0000aff, 0x17102: 0xe0000b13, 0x17103: 0xe0000b0f, + 0x17104: 0xe0000b0b, 0x17105: 0xe0000b07, 0x17106: 0xe0000b75, 0x17107: 0xe0000b71, + 0x17108: 0xe0000c66, 0x17109: 0xe0000c63, 0x1710a: 0xe0000c78, 0x1710b: 0xe0000c75, + 0x1710c: 0xe0000e84, 0x1710d: 0xe0000e81, 0x1710e: 0xe0000e44, 0x1710f: 0xe0000e41, + 0x17110: 0xe000ad84, 0x17111: 0xe000ad81, 0x17112: 0xe000ad8a, 0x17113: 0xe000ad87, + 0x17114: 0xe000ad96, 0x17115: 0xe000ad93, 0x17116: 0xe000ad90, 0x17117: 0xe000ad8d, + 0x17118: 0xe000ad9c, 0x17119: 0xe000ad99, 0x1711a: 0xe0000e5d, 0x1711b: 0xe0000e59, + 0x1711c: 0xe0000e65, 0x1711d: 0xe0000e61, 0x1711e: 0xe0000e75, 0x1711f: 0xe0000e71, + 0x17120: 0xe0000e6d, 0x17121: 0xe0000e69, 0x17122: 0xe0000e7d, 0x17123: 0xe0000e79, + 0x17124: 0xe000108d, 0x17125: 0xe000108a, 0x17126: 0xe000104d, 0x17127: 0xe000104a, + 0x17128: 0xe0001066, 0x17129: 0xe0001062, 0x1712a: 0xe000106e, 0x1712b: 0xe000106a, + 0x1712c: 0xe000107e, 0x1712d: 0xe000107a, 0x1712e: 0xe0001076, 0x1712f: 0xe0001072, + 0x17130: 0xe0001086, 0x17131: 0xe0001082, 0x17132: 0xe0001108, 0x17133: 0xe0001105, + 0x17134: 0xe0001135, 0x17135: 0xe0001132, 0x17136: 0xe000112f, 0x17137: 0xe000112c, + 0x17138: 0xe000111d, 0x17139: 0xe000111a, 0x1713a: 0xe0000d0a, 0x1713b: 0xe0000d07, + 0x1713c: 0x0030d888, 0x1713d: 0x4030d820, 0x1713e: 0x00312088, 0x1713f: 0x40312020, + // Block 0x5c5, offset 0x17140 + 0x17142: 0x40429620, 0x17143: 0x40429820, + 0x17145: 0x40427e20, 0x17146: 0x40428020, 0x17147: 0x40428220, + 0x17148: 0x40428420, 0x17149: 0x40428620, 0x1714a: 0x40428820, + 0x1714e: 0x40428a20, 0x1714f: 0x40428c20, + 0x17150: 0x40428e20, 0x17152: 0xc0610231, 0x17153: 0x40429220, + 0x17154: 0x40429420, 0x17155: 0xceba9661, + 0x17159: 0xcebe96f1, 0x1715a: 0xcec096f1, + 0x1715c: 0xcee096f1, 0x1715e: 0xcec296f1, 0x1715f: 0xcec496f1, + 0x17163: 0xcec696f1, + 0x17164: 0xcec896f1, + 0x17168: 0xceca96f1, 0x17169: 0xcede96f1, 0x1716a: 0xcecc96f1, + 0x1716e: 0xcece96f1, 0x1716f: 0xced096f1, + 0x17170: 0xced296f1, 0x17171: 0xcedc96f1, 0x17172: 0xced496f1, 0x17173: 0xceda96f1, + 0x17174: 0xced896f1, 0x17175: 0xced696f1, 0x17176: 0xcee296f1, 0x17177: 0xcee496f1, + 0x17178: 0xcee696f1, 0x17179: 0xcee896f1, + 0x1717e: 0x4042c620, 0x1717f: 0x4042c820, + // Block 0x5c6, offset 0x17180 + 0x17181: 0x40430020, 0x17182: 0x40430220, 0x17183: 0x40430420, + 0x17185: 0x4042e020, 0x17186: 0x4042e220, 0x17187: 0x4042e420, + 0x17188: 0x4042e620, 0x17189: 0x4042e820, 0x1718a: 0x4042ea20, 0x1718b: 0x4042ec20, + 0x1718c: 0x4042f020, 0x1718e: 0x4042f420, 0x1718f: 0x4042f620, + 0x17190: 0x4042f820, 0x17192: 0x4042fa20, 0x17193: 0x4042fc20, + 0x17194: 0x4042fe20, 0x17195: 0x40430020, 0x17196: 0x40430220, 0x17197: 0x40430420, + 0x17198: 0x40430620, 0x17199: 0x40430820, 0x1719a: 0x40430a20, 0x1719b: 0x40430e20, + 0x1719c: 0x40431020, 0x1719d: 0x40431420, 0x1719e: 0x40431620, 0x1719f: 0x40431820, + 0x171a0: 0x40431a20, 0x171a1: 0x40431c20, 0x171a2: 0x40431e20, 0x171a3: 0x40432020, + 0x171a4: 0x40432220, 0x171a5: 0x40432420, 0x171a6: 0x40432620, 0x171a7: 0x40432820, + 0x171a8: 0x40432a20, 0x171aa: 0x40432c20, 0x171ab: 0x40432e20, + 0x171ac: 0x40433020, 0x171ad: 0x40433220, 0x171ae: 0x40433420, 0x171af: 0x40433620, + 0x171b0: 0x40433820, 0x171b1: 0x40433a20, 0x171b2: 0x40433c20, 0x171b3: 0x40434820, + 0x171b5: 0x40433e20, 0x171b6: 0x40434020, 0x171b7: 0x40434220, + 0x171b8: 0x40434420, 0x171b9: 0x40434620, + 0x171bd: 0x40434a20, 0x171be: 0x40434c20, 0x171bf: 0x40434e20, + // Block 0x5c7, offset 0x171c0 + 0x171c1: 0x40491020, 0x171c2: 0x40491220, 0x171c3: 0x40491420, + 0x171c4: 0x40491620, 0x171c5: 0x40491820, 0x171c6: 0x40491a20, 0x171c7: 0x40491c20, + 0x171c8: 0x40491e20, 0x171c9: 0x40492020, 0x171ca: 0x40492220, 0x171cb: 0x40492420, + 0x171cc: 0x40492620, 0x171cd: 0x40492820, 0x171ce: 0x40492a20, 0x171cf: 0x40492c20, + 0x171d0: 0x40492e20, 0x171d1: 0x40493020, 0x171d2: 0x40493220, 0x171d3: 0x40493420, + 0x171d4: 0x40493620, 0x171d5: 0x40493820, 0x171d6: 0x40493a20, 0x171d7: 0x40493c20, + 0x171d8: 0x40493e20, 0x171d9: 0x40494020, 0x171da: 0x40494220, 0x171db: 0x40494420, + 0x171dc: 0x40494620, 0x171dd: 0x40494820, 0x171de: 0x40494a20, 0x171df: 0x40494c20, + 0x171e0: 0x40494e20, 0x171e1: 0x40495020, 0x171e2: 0x40495220, 0x171e3: 0x40495420, + 0x171e4: 0x40495620, 0x171e5: 0x40495820, 0x171e6: 0x40495a20, 0x171e7: 0x40495c20, + 0x171e8: 0x40495e20, 0x171e9: 0x40496020, 0x171ea: 0x40496220, 0x171eb: 0x40496420, + 0x171ec: 0x40496620, 0x171ed: 0x40496820, 0x171ee: 0x40496a20, 0x171ef: 0x40057820, + 0x171f0: 0x40496e20, 0x171f1: 0x40497020, 0x171f2: 0x40497220, 0x171f3: 0xe000ada2, + 0x171f4: 0x40497620, 0x171f5: 0x40497820, 0x171f6: 0x40497a20, 0x171f7: 0x40497c20, + 0x171f8: 0x826724bf, 0x171f9: 0x826724c0, 0x171fa: 0x40498e20, + 0x171ff: 0x4027f420, + // Block 0x5c8, offset 0x17200 + 0x17200: 0xc07f04e1, 0x17201: 0xc0ae04e1, 0x17202: 0xc0dd04e1, 0x17203: 0xc10c04e1, + 0x17204: 0xc13b04e1, 0x17205: 0x00497283, 0x17206: 0x40057e20, 0x17207: 0xa000ff02, + 0x17208: 0xa6b10002, 0x17209: 0xa6b10102, 0x1720a: 0xa6b10202, 0x1720b: 0xa6b10302, + 0x1720c: 0xa000ff02, 0x1720d: 0xceea9721, 0x1720e: 0xa000fe02, 0x1720f: 0x40057820, + 0x17210: 0xe000019a, 0x17211: 0xe000022e, 0x17212: 0xe0000346, 0x17213: 0xe0000420, + 0x17214: 0xe00004f5, 0x17215: 0xe00005bf, 0x17216: 0xe000068a, 0x17217: 0xe0000732, + 0x17218: 0xe00007de, 0x17219: 0xe0000883, 0x1721a: 0x40057a20, 0x1721b: 0x40057c20, + // Block 0x5c9, offset 0x17240 + 0x17240: 0xa0000000, 0x17241: 0xa0000000, 0x17242: 0xa0000000, 0x17243: 0xa0000000, + 0x17244: 0xa0000000, 0x17245: 0xa0000000, 0x17246: 0xa0000000, 0x17247: 0xa0000000, + 0x17248: 0xa0000000, 0x17249: 0x40020020, 0x1724a: 0x40020220, 0x1724b: 0x40020420, + 0x1724c: 0x40020620, 0x1724d: 0x40020820, 0x1724e: 0xa0000000, 0x1724f: 0xa0000000, + 0x17250: 0xa0000000, 0x17251: 0xa0000000, 0x17252: 0xa0000000, 0x17253: 0xa0000000, + 0x17254: 0xa0000000, 0x17255: 0xa0000000, 0x17256: 0xa0000000, 0x17257: 0xa0000000, + 0x17258: 0xa0000000, 0x17259: 0xa0000000, 0x1725a: 0xa0000000, 0x1725b: 0xa0000000, + 0x1725c: 0xa0000000, 0x1725d: 0xa0000000, 0x1725e: 0xa0000000, 0x1725f: 0xa0000000, + 0x17260: 0x40021220, 0x17261: 0x4002ba20, 0x17262: 0x4003e020, 0x17263: 0x4004ea20, + 0x17264: 0x4027de20, 0x17265: 0x4004ec20, 0x17266: 0x4004e620, 0x17267: 0x4003d220, + 0x17268: 0x4003f420, 0x17269: 0x4003f620, 0x1726a: 0x4004d820, 0x1726b: 0x40093820, + 0x1726c: 0x40024020, 0x1726d: 0x40021a20, 0x1726e: 0x4002e420, 0x1726f: 0x4004e220, + 0x17270: 0x4029cc20, 0x17271: 0x4029ce20, 0x17272: 0x4029d020, 0x17273: 0x4029d220, + 0x17274: 0x4029d420, 0x17275: 0x4029d620, 0x17276: 0x4029d820, 0x17277: 0x4029da20, + 0x17278: 0x4029dc20, 0x17279: 0x4029de20, 0x1727a: 0x40026c20, 0x1727b: 0x40026220, + 0x1727c: 0x40094020, 0x1727d: 0x40094220, 0x1727e: 0x40094420, 0x1727f: 0x4002c420, + // Block 0x5ca, offset 0x17280 + 0x17280: 0x4004d620, 0x17281: 0xcef09771, 0x17282: 0x002c0a88, 0x17283: 0x002c3a88, + 0x17284: 0x002c6288, 0x17285: 0xcef69771, 0x17286: 0x002d0888, 0x17287: 0x002d2288, + 0x17288: 0x002d6888, 0x17289: 0xcefc9771, 0x1728a: 0x002dcc88, 0x1728b: 0x002dfe88, + 0x1728c: 0xc0030002, 0x1728d: 0x002e8288, 0x1728e: 0xc5290a52, 0x1728f: 0xcf029771, + 0x17290: 0x002f2c88, 0x17291: 0x002f5688, 0x17292: 0x002f7a88, 0x17293: 0x002fe688, + 0x17294: 0x00302c88, 0x17295: 0xcf089771, 0x17296: 0x0030be88, 0x17297: 0x0030e288, + 0x17298: 0x0030f688, 0x17299: 0x00310088, 0x1729a: 0x00312a88, 0x1729b: 0x4003f820, + 0x1729c: 0x4004e420, 0x1729d: 0x4003fa20, 0x1729e: 0x40062420, 0x1729f: 0x40021620, + 0x172a0: 0x40061e20, 0x172a1: 0xceed9771, 0x172a2: 0x402c0a20, 0x172a3: 0x402c3a20, + 0x172a4: 0x402c6220, 0x172a5: 0xcef39771, 0x172a6: 0x402d0820, 0x172a7: 0x402d2220, + 0x172a8: 0x402d6820, 0x172a9: 0xcef99771, 0x172aa: 0x402dcc20, 0x172ab: 0x402dfe20, + 0x172ac: 0xc0000002, 0x172ad: 0x402e8220, 0x172ae: 0xc5270a41, 0x172af: 0xceff9771, + 0x172b0: 0x402f2c20, 0x172b1: 0x402f5620, 0x172b2: 0x402f7a20, 0x172b3: 0x402fe620, + 0x172b4: 0x40302c20, 0x172b5: 0xcf059771, 0x172b6: 0x4030be20, 0x172b7: 0x4030e220, + 0x172b8: 0x4030f620, 0x172b9: 0x40310020, 0x172ba: 0x40312a20, 0x172bb: 0x4003fc20, + 0x172bc: 0x40094820, 0x172bd: 0x4003fe20, 0x172be: 0x40094c20, 0x172bf: 0xa0000000, + // Block 0x5cb, offset 0x172c0 + 0x172c0: 0xe00008f5, 0x172c1: 0x002bdea3, 0x172c2: 0xe0000921, 0x172c3: 0xe0000969, + 0x172c4: 0xe000095b, 0x172c5: 0xe000094d, 0x172c6: 0xe00009dd, 0x172c7: 0xe0000a53, + 0x172c8: 0xe0000ae8, 0x172c9: 0x002c98a3, 0x172ca: 0xe0000af4, 0x172cb: 0xe0000b20, + 0x172cc: 0xe0000c2b, 0x172cd: 0x002d9aa3, 0x172ce: 0xe0000c37, 0x172cf: 0xe0000c43, + 0x172d0: 0xe0000ab3, 0x172d1: 0xe0000d63, 0x172d2: 0xe0000d9a, 0x172d3: 0x002ee2a3, + 0x172d4: 0xe0000da6, 0x172d5: 0xe0000de6, 0x172d6: 0xe0000dd2, 0x172d7: 0x40093e20, + 0x172d8: 0xe0000e12, 0x172d9: 0xe0000fe1, 0x172da: 0x00306ca3, 0x172db: 0xe0000fed, + 0x172dc: 0xe0000fff, 0x172dd: 0xe0001102, 0x172de: 0x00318888, 0x172df: 0xe0000f7b, + 0x172e0: 0xe00008f2, 0x172e1: 0x402bde21, 0x172e2: 0xe000091e, 0x172e3: 0xe0000966, + 0x172e4: 0xe0000958, 0x172e5: 0xe000094a, 0x172e6: 0xe00009d5, 0x172e7: 0xe0000a4d, + 0x172e8: 0xe0000ae5, 0x172e9: 0x402c9821, 0x172ea: 0xe0000af1, 0x172eb: 0xe0000b1d, + 0x172ec: 0xe0000c28, 0x172ed: 0x402d9a21, 0x172ee: 0xe0000c34, 0x172ef: 0xe0000c40, + 0x172f0: 0xe0000aad, 0x172f1: 0xe0000d60, 0x172f2: 0xe0000d97, 0x172f3: 0x402ee221, + 0x172f4: 0xe0000da3, 0x172f5: 0xe0000de3, 0x172f6: 0xe0000dcf, 0x172f7: 0x40093c20, + 0x172f8: 0xe0000e0f, 0x172f9: 0xe0000fde, 0x172fa: 0x40306c21, 0x172fb: 0xe0000fea, + 0x172fc: 0xe0000ffc, 0x172fd: 0xe00010ff, 0x172fe: 0x40318820, 0x172ff: 0xe0001114, + // Block 0x5cc, offset 0x17300 + 0x17300: 0x002bdec3, 0x17301: 0x402bde22, 0x17302: 0xe00008fb, 0x17303: 0xe00008f8, + 0x17304: 0xe000097d, 0x17305: 0xe000097a, 0x17306: 0xe0000a38, 0x17307: 0xe0000a35, + 0x17308: 0xe0000a3e, 0x17309: 0xe0000a3b, 0x1730a: 0xe0000a4a, 0x1730b: 0xe0000a47, + 0x1730c: 0xe0000a44, 0x1730d: 0xe0000a41, 0x1730e: 0xe0000a86, 0x1730f: 0xe0000a83, + 0x17310: 0xe0000aaa, 0x17311: 0xe0000aa7, 0x17312: 0x002c98c3, 0x17313: 0x402c9822, + 0x17314: 0xe0000aee, 0x17315: 0xe0000aeb, 0x17316: 0xe0000b2c, 0x17317: 0xe0000b29, + 0x17318: 0xe0000b40, 0x17319: 0xe0000b3d, 0x1731a: 0xe0000b1a, 0x1731b: 0xe0000b17, + 0x1731c: 0xe0000bb8, 0x1731d: 0xe0000bb5, 0x1731e: 0xe0000bb2, 0x1731f: 0xe0000baf, + 0x17320: 0xe0000bc4, 0x17321: 0xe0000bc1, 0x17322: 0xe0000bca, 0x17323: 0xe0000bc7, + 0x17324: 0xe0000bee, 0x17325: 0xe0000beb, 0x17326: 0xe0000c1b, 0x17327: 0xe0000c18, + 0x17328: 0xe0000c51, 0x17329: 0xe0000c4e, 0x1732a: 0x002d9ac3, 0x1732b: 0x402d9a22, + 0x1732c: 0xe0000c31, 0x1732d: 0xe0000c2e, 0x1732e: 0xe0000c5a, 0x1732f: 0xe0000c57, + 0x17330: 0xe0000c54, 0x17331: 0x402da220, 0x17332: 0xf0000a0a, 0x17333: 0xf0000404, + 0x17334: 0xe0000c8a, 0x17335: 0xe0000c87, 0x17336: 0xe0000c9f, 0x17337: 0xe0000c9c, + 0x17338: 0x402f7220, 0x17339: 0xe0000ccc, 0x1733a: 0xe0000cc9, 0x1733b: 0xe0000cd8, + 0x1733c: 0xe0000cd5, 0x1733d: 0xe0000cd2, 0x1733e: 0xe0000ccf, 0x1733f: 0xe0000d04, + // Block 0x5cd, offset 0x17340 + 0x17340: 0xe0000cfe, 0x17341: 0xe0000cf8, 0x17342: 0xe0000cf5, 0x17343: 0xe0000d51, + 0x17344: 0xe0000d4e, 0x17345: 0xe0000d6f, 0x17346: 0xe0000d6c, 0x17347: 0xe0000d5d, + 0x17348: 0xe0000d5a, 0x17349: 0xf0000404, 0x1734a: 0x002ea086, 0x1734b: 0x002ea085, + 0x1734c: 0x002ee2c3, 0x1734d: 0x402ee222, 0x1734e: 0xe0000da0, 0x1734f: 0xe0000d9d, + 0x17350: 0xe0000de0, 0x17351: 0xe0000ddd, 0x17352: 0xe0000e93, 0x17353: 0xe0000e8f, + 0x17354: 0xe0000eca, 0x17355: 0xe0000ec7, 0x17356: 0xe0000edc, 0x17357: 0xe0000ed9, + 0x17358: 0xe0000ed0, 0x17359: 0xe0000ecd, 0x1735a: 0xe0000f1f, 0x1735b: 0xe0000f1c, + 0x1735c: 0xe0000f2d, 0x1735d: 0xe0000f2a, 0x1735e: 0xe0000f47, 0x1735f: 0xe0000f44, + 0x17360: 0xe0000f33, 0x17361: 0xe0000f30, 0x17362: 0xe0000f99, 0x17363: 0xe0000f96, + 0x17364: 0xe0000f8a, 0x17365: 0xe0000f87, 0x17366: 0x00303688, 0x17367: 0x40303620, + 0x17368: 0xe000102b, 0x17369: 0xe0001028, 0x1736a: 0x00306cc3, 0x1736b: 0x40306c22, + 0x1736c: 0xe0000fe7, 0x1736d: 0xe0000fe4, 0x1736e: 0xe0000ff9, 0x1736f: 0xe0000ff6, + 0x17370: 0xe0001025, 0x17371: 0xe0001022, 0x17372: 0xe0001039, 0x17373: 0xe0001036, + 0x17374: 0xe00010d8, 0x17375: 0xe00010d5, 0x17376: 0xe000110e, 0x17377: 0xe000110b, + 0x17378: 0xe0001117, 0x17379: 0xe000113b, 0x1737a: 0xe0001138, 0x1737b: 0xe000114d, + 0x1737c: 0xe000114a, 0x1737d: 0xe0001147, 0x1737e: 0xe0001144, 0x1737f: 0xe0000f64, + // Block 0x5ce, offset 0x17380 + 0x17380: 0x40321220, 0x17381: 0x40321a20, 0x17382: 0x40322220, 0x17383: 0x40322a20, + 0x17384: 0xe0000ad5, 0x17385: 0xe0000ad1, 0x17386: 0xe0000acd, 0x17387: 0xf0000a0a, + 0x17388: 0xf000040a, 0x17389: 0xf0000404, 0x1738a: 0xf0000a0a, 0x1738b: 0xf000040a, + 0x1738c: 0xf0000404, 0x1738d: 0xe0000947, 0x1738e: 0xe0000944, 0x1738f: 0xe0000c3d, + 0x17390: 0xe0000c3a, 0x17391: 0xe0000dcc, 0x17392: 0xe0000dc9, 0x17393: 0xe0000ff3, + 0x17394: 0xe0000ff0, 0x17395: 0xe000a965, 0x17396: 0xe000a962, 0x17397: 0xe000ae14, + 0x17398: 0xe000ae11, 0x17399: 0xe0001016, 0x1739a: 0xe0001012, 0x1739b: 0xe000100e, + 0x1739c: 0xe000100a, 0x1739d: 0x402cae20, 0x1739e: 0xe000adba, 0x1739f: 0xe000adb7, + 0x173a0: 0xe000adc0, 0x173a1: 0xe000adbd, 0x173a2: 0xe00009f4, 0x173a3: 0xe00009ef, + 0x173a4: 0x002d3a88, 0x173a5: 0x402d3a20, 0x173a6: 0xe0000bbe, 0x173a7: 0xe0000bbb, + 0x173a8: 0xe0000c99, 0x173a9: 0xe0000c96, 0x173aa: 0xe0000e20, 0x173ab: 0xe0000e1d, + 0x173ac: 0xe000ae0e, 0x173ad: 0xe000ae0b, 0x173ae: 0xe0001162, 0x173af: 0xe000115f, + 0x173b0: 0xe0000c8d, 0x173b1: 0xf0000a0a, 0x173b2: 0xf000040a, 0x173b3: 0xf0000404, + 0x173b4: 0xe0000bac, 0x173b5: 0xe0000ba9, 0x173b6: 0x002d7888, 0x173b7: 0x00319488, + 0x173b8: 0xe0000d57, 0x173b9: 0xe0000d54, 0x173ba: 0xe000adb4, 0x173bb: 0xe000adb1, + 0x173bc: 0xe00009ea, 0x173bd: 0xe00009e5, 0x173be: 0xe0000e19, 0x173bf: 0xe0000e15, + // Block 0x5cf, offset 0x173c0 + 0x173c0: 0xe000098f, 0x173c1: 0xe000098c, 0x173c2: 0xe0000995, 0x173c3: 0xe0000992, + 0x173c4: 0xe0000b62, 0x173c5: 0xe0000b5f, 0x173c6: 0xe0000b68, 0x173c7: 0xe0000b65, + 0x173c8: 0xe0000c6c, 0x173c9: 0xe0000c69, 0x173ca: 0xe0000c72, 0x173cb: 0xe0000c6f, + 0x173cc: 0xe0000e4a, 0x173cd: 0xe0000e47, 0x173ce: 0xe0000e50, 0x173cf: 0xe0000e4d, + 0x173d0: 0xe0000ee8, 0x173d1: 0xe0000ee5, 0x173d2: 0xe0000eee, 0x173d3: 0xe0000eeb, + 0x173d4: 0xe0001053, 0x173d5: 0xe0001050, 0x173d6: 0xe0001059, 0x173d7: 0xe0001056, + 0x173d8: 0xe0000f61, 0x173d9: 0xe0000f5e, 0x173da: 0xe0000fa5, 0x173db: 0xe0000fa2, + 0x173dc: 0x00312288, 0x173dd: 0x40312220, 0x173de: 0xe0000bf4, 0x173df: 0xe0000bf1, + 0x173e0: 0x002ebc88, 0x173e1: 0x402c8c20, 0x173e2: 0x002f2288, 0x173e3: 0x402f2220, + 0x173e4: 0x00314088, 0x173e5: 0x40314020, 0x173e6: 0xe000096f, 0x173e7: 0xe000096c, + 0x173e8: 0xe0000b32, 0x173e9: 0xe0000b2f, 0x173ea: 0xe000adfc, 0x173eb: 0xe000adf9, + 0x173ec: 0xe000ae02, 0x173ed: 0xe000adff, 0x173ee: 0xe0000e04, 0x173ef: 0xe0000e01, + 0x173f0: 0xe000ae08, 0x173f1: 0xe000ae05, 0x173f2: 0xe0001129, 0x173f3: 0xe0001126, + 0x173f4: 0x402e5e20, 0x173f5: 0x402ed020, 0x173f6: 0x40305a20, 0x173f7: 0x402dd420, + 0x173f8: 0xe0000abf, 0x173f9: 0xe0000ec4, 0x173fa: 0x002be888, 0x173fb: 0x002c4488, + 0x173fc: 0x402c4420, 0x173fd: 0x002e3888, 0x173fe: 0x00303e88, 0x173ff: 0x402ffc20, + // Block 0x5d0, offset 0x17400 + 0x17400: 0x402f8220, 0x17401: 0x402fd820, 0x17402: 0x402ff420, 0x17403: 0x40300820, + 0x17404: 0x402df620, 0x17405: 0x40301a20, 0x17406: 0x40302420, 0x17407: 0x40306420, + 0x17408: 0x40305220, 0x17409: 0x40307c20, 0x1740a: 0x4030b420, 0x1740b: 0x4030cc20, + 0x1740c: 0x4030da20, 0x1740d: 0x4030ee20, 0x1740e: 0x402e7a20, 0x1740f: 0x40310820, + 0x17410: 0x40314820, 0x17411: 0x40315020, 0x17412: 0x40316420, 0x17413: 0x40318020, + 0x17414: 0x4031cc20, 0x17415: 0x4031e820, 0x17416: 0x40320a20, 0x17417: 0x40323220, + 0x17418: 0x40323a20, 0x17419: 0x402c1220, 0x1741a: 0x402cf820, 0x1741b: 0x402d4c20, + 0x1741c: 0x402d7020, 0x1741d: 0x402de620, 0x1741e: 0x402e1a20, 0x1741f: 0x402e2a20, + 0x17420: 0x402f6220, 0x17421: 0x4031fa20, 0x17422: 0x40320220, 0x17423: 0xe0000aca, + 0x17424: 0xe0000adc, 0x17425: 0xe0000ad9, 0x17426: 0xe0000fcc, 0x17427: 0xe0000fcf, + 0x17428: 0xe0000fba, 0x17429: 0xe0000ba1, 0x1742a: 0xe0000d11, 0x1742b: 0xe0000d18, + 0x1742c: 0x40324220, 0x1742d: 0x40324a20, 0x1742e: 0x40309020, 0x1742f: 0x40309820, + 0x17430: 0x002d6894, 0x17431: 0x002d8094, 0x17432: 0x002dcc94, 0x17433: 0x002f7a94, + 0x17434: 0x002f9894, 0x17435: 0x002fac94, 0x17436: 0x002fd894, 0x17437: 0x0030e294, + 0x17438: 0x00310094, 0x17439: 0x40064020, 0x1743a: 0x40064420, 0x1743b: 0x40312c20, + 0x1743c: 0x4031de20, 0x1743d: 0x00312c83, 0x1743e: 0x4031e220, 0x1743f: 0x4031f020, + // Block 0x5d1, offset 0x17440 + 0x17440: 0xe00009b1, 0x17441: 0xe00009ae, 0x17442: 0xe0000a22, 0x17443: 0xe0000a1f, + 0x17444: 0xe0000a28, 0x17445: 0xe0000a25, 0x17446: 0xe0000a2e, 0x17447: 0xe0000a2b, + 0x17448: 0xe0000a5a, 0x17449: 0xe0000a56, 0x1744a: 0xe0000a8c, 0x1744b: 0xe0000a89, + 0x1744c: 0xe0000a98, 0x1744d: 0xe0000a95, 0x1744e: 0xe0000aa4, 0x1744f: 0xe0000aa1, + 0x17450: 0xe0000a92, 0x17451: 0xe0000a8f, 0x17452: 0xe0000a9e, 0x17453: 0xe0000a9b, + 0x17454: 0xe000add2, 0x17455: 0xe000adcf, 0x17456: 0xe000adcc, 0x17457: 0xe000adc9, + 0x17458: 0xe0000b7c, 0x17459: 0xe0000b79, 0x1745a: 0xe0000b82, 0x1745b: 0xe0000b7f, + 0x1745c: 0xe0000b39, 0x1745d: 0xe0000b35, 0x1745e: 0xe0000b8c, 0x1745f: 0xe0000b89, + 0x17460: 0xe0000bd0, 0x17461: 0xe0000bcd, 0x17462: 0xe0000c00, 0x17463: 0xe0000bfd, + 0x17464: 0xe0000c0c, 0x17465: 0xe0000c09, 0x17466: 0xe0000bfa, 0x17467: 0xe0000bf7, + 0x17468: 0xe0000c06, 0x17469: 0xe0000c03, 0x1746a: 0xe0000c12, 0x1746b: 0xe0000c0f, + 0x1746c: 0xe0000c7e, 0x1746d: 0xe0000c7b, 0x1746e: 0xe000add8, 0x1746f: 0xe000add5, + 0x17470: 0xe0000c93, 0x17471: 0xe0000c90, 0x17472: 0xe0000cab, 0x17473: 0xe0000ca8, + 0x17474: 0xe0000cb1, 0x17475: 0xe0000cae, 0x17476: 0xe0000cde, 0x17477: 0xe0000cdb, + 0x17478: 0xe0000ce5, 0x17479: 0xe0000ce1, 0x1747a: 0xe0000cf2, 0x1747b: 0xe0000cef, + 0x1747c: 0xe0000cec, 0x1747d: 0xe0000ce9, 0x1747e: 0xe0000d1e, 0x1747f: 0xe0000d1b, + // Block 0x5d2, offset 0x17480 + 0x17480: 0xe0000d24, 0x17481: 0xe0000d21, 0x17482: 0xe0000d2a, 0x17483: 0xe0000d27, + 0x17484: 0xe0000d69, 0x17485: 0xe0000d66, 0x17486: 0xe0000d7b, 0x17487: 0xe0000d78, + 0x17488: 0xe0000d87, 0x17489: 0xe0000d84, 0x1748a: 0xe0000d81, 0x1748b: 0xe0000d7e, + 0x1748c: 0xe000ade4, 0x1748d: 0xe000ade1, 0x1748e: 0xe0000df5, 0x1748f: 0xe0000df1, + 0x17490: 0xe000adf6, 0x17491: 0xe000adf3, 0x17492: 0xe000adf0, 0x17493: 0xe000aded, + 0x17494: 0xe0000ea7, 0x17495: 0xe0000ea4, 0x17496: 0xe0000ead, 0x17497: 0xe0000eaa, + 0x17498: 0xe0000ed6, 0x17499: 0xe0000ed3, 0x1749a: 0xe0000ef4, 0x1749b: 0xe0000ef1, + 0x1749c: 0xe0000efb, 0x1749d: 0xe0000ef7, 0x1749e: 0xe0000f02, 0x1749f: 0xe0000eff, + 0x174a0: 0xe0000f41, 0x174a1: 0xe0000f3e, 0x174a2: 0xe0000f53, 0x174a3: 0xe0000f50, + 0x174a4: 0xe0000f26, 0x174a5: 0xe0000f22, 0x174a6: 0xe0000f3a, 0x174a7: 0xe0000f36, + 0x174a8: 0xe0000f5a, 0x174a9: 0xe0000f56, 0x174aa: 0xe0000f93, 0x174ab: 0xe0000f90, + 0x174ac: 0xe0000f9f, 0x174ad: 0xe0000f9c, 0x174ae: 0xe0000fb1, 0x174af: 0xe0000fae, + 0x174b0: 0xe0000fab, 0x174b1: 0xe0000fa8, 0x174b2: 0xe0001093, 0x174b3: 0xe0001090, + 0x174b4: 0xe000109f, 0x174b5: 0xe000109c, 0x174b6: 0xe0001099, 0x174b7: 0xe0001096, + 0x174b8: 0xe000ae1a, 0x174b9: 0xe000ae17, 0x174ba: 0xe000a965, 0x174bb: 0xe000a962, + 0x174bc: 0xe00010a9, 0x174bd: 0xe00010a6, 0x174be: 0xe00010af, 0x174bf: 0xe00010ac, + // Block 0x5d3, offset 0x174c0 + 0x174c0: 0xe00010d2, 0x174c1: 0xe00010cf, 0x174c2: 0xe00010cc, 0x174c3: 0xe00010c9, + 0x174c4: 0xe00010e1, 0x174c5: 0xe00010de, 0x174c6: 0xe00010e7, 0x174c7: 0xe00010e4, + 0x174c8: 0xe00010ed, 0x174c9: 0xe00010ea, 0x174ca: 0xe00010fc, 0x174cb: 0xe00010f9, + 0x174cc: 0xe00010f6, 0x174cd: 0xe00010f3, 0x174ce: 0xe0001123, 0x174cf: 0xe0001120, + 0x174d0: 0xe0001141, 0x174d1: 0xe000113e, 0x174d2: 0xe0001153, 0x174d3: 0xe0001150, + 0x174d4: 0xe0001159, 0x174d5: 0xe0001156, 0x174d6: 0xe0000c15, 0x174d7: 0xe0000f8d, + 0x174d8: 0xe00010db, 0x174d9: 0xe0001111, 0x174da: 0xf0000404, 0x174db: 0xe0000f70, + 0x174dc: 0x40300420, 0x174dd: 0x40300620, 0x174de: 0xe0000f7f, 0x174df: 0x402c9620, + 0x174e0: 0xe000099b, 0x174e1: 0xe0000998, 0x174e2: 0xe0000989, 0x174e3: 0xe0000986, + 0x174e4: 0xe000adae, 0x174e5: 0xe000adab, 0x174e6: 0xe0000930, 0x174e7: 0xe000092c, + 0x174e8: 0xe0000940, 0x174e9: 0xe000093c, 0x174ea: 0xe0000938, 0x174eb: 0xe0000934, + 0x174ec: 0xe00009aa, 0x174ed: 0xe00009a6, 0x174ee: 0xe000ada8, 0x174ef: 0xe000ada5, + 0x174f0: 0xe000090a, 0x174f1: 0xe0000906, 0x174f2: 0xe000091a, 0x174f3: 0xe0000916, + 0x174f4: 0xe0000912, 0x174f5: 0xe000090e, 0x174f6: 0xe00009a2, 0x174f7: 0xe000099e, + 0x174f8: 0xe0000b6e, 0x174f9: 0xe0000b6b, 0x174fa: 0xe0000b5c, 0x174fb: 0xe0000b59, + 0x174fc: 0xe0000b26, 0x174fd: 0xe0000b23, 0x174fe: 0xe000adc6, 0x174ff: 0xe000adc3, + // Block 0x5d4, offset 0x17500 + 0x17500: 0xe0000b03, 0x17501: 0xe0000aff, 0x17502: 0xe0000b13, 0x17503: 0xe0000b0f, + 0x17504: 0xe0000b0b, 0x17505: 0xe0000b07, 0x17506: 0xe0000b75, 0x17507: 0xe0000b71, + 0x17508: 0xe0000c66, 0x17509: 0xe0000c63, 0x1750a: 0xe0000c78, 0x1750b: 0xe0000c75, + 0x1750c: 0xe0000e84, 0x1750d: 0xe0000e81, 0x1750e: 0xe0000e44, 0x1750f: 0xe0000e41, + 0x17510: 0xe000adde, 0x17511: 0xe000addb, 0x17512: 0xe0000db5, 0x17513: 0xe0000db1, + 0x17514: 0xe0000dc5, 0x17515: 0xe0000dc1, 0x17516: 0xe0000dbd, 0x17517: 0xe0000db9, + 0x17518: 0xe0000e8b, 0x17519: 0xe0000e87, 0x1751a: 0xe000adea, 0x1751b: 0xe000ade7, + 0x1751c: 0xe0000e65, 0x1751d: 0xe0000e61, 0x1751e: 0xe0000e75, 0x1751f: 0xe0000e71, + 0x17520: 0xe0000e6d, 0x17521: 0xe0000e69, 0x17522: 0xe0000e7d, 0x17523: 0xe0000e79, + 0x17524: 0xe000108d, 0x17525: 0xe000108a, 0x17526: 0xe000104d, 0x17527: 0xe000104a, + 0x17528: 0xe000ae20, 0x17529: 0xe000ae1d, 0x1752a: 0xe000106e, 0x1752b: 0xe000106a, + 0x1752c: 0xe000107e, 0x1752d: 0xe000107a, 0x1752e: 0xe0001076, 0x1752f: 0xe0001072, + 0x17530: 0xe0001086, 0x17531: 0xe0001082, 0x17532: 0xe0001108, 0x17533: 0xe0001105, + 0x17534: 0xe0001135, 0x17535: 0xe0001132, 0x17536: 0xe000112f, 0x17537: 0xe000112c, + 0x17538: 0xe000111d, 0x17539: 0xe000111a, 0x1753a: 0xe0000d0a, 0x1753b: 0xe0000d07, + 0x1753c: 0x0030d888, 0x1753d: 0x4030d820, 0x1753e: 0x00312088, 0x1753f: 0x40312020, + // Block 0x5d5, offset 0x17540 + 0x17540: 0xa0000000, 0x17541: 0xa0000000, 0x17542: 0xa0000000, 0x17543: 0xa0000000, + 0x17544: 0xa0000000, 0x17545: 0xa0000000, 0x17546: 0xa0000000, 0x17547: 0xa0000000, + 0x17548: 0xa0000000, 0x17549: 0x40020020, 0x1754a: 0x40020220, 0x1754b: 0x40020420, + 0x1754c: 0x40020620, 0x1754d: 0x40020820, 0x1754e: 0xa0000000, 0x1754f: 0xa0000000, + 0x17550: 0xa0000000, 0x17551: 0xa0000000, 0x17552: 0xa0000000, 0x17553: 0xa0000000, + 0x17554: 0xa0000000, 0x17555: 0xa0000000, 0x17556: 0xa0000000, 0x17557: 0xa0000000, + 0x17558: 0xa0000000, 0x17559: 0xa0000000, 0x1755a: 0xa0000000, 0x1755b: 0xa0000000, + 0x1755c: 0xa0000000, 0x1755d: 0xa0000000, 0x1755e: 0xa0000000, 0x1755f: 0xa0000000, + 0x17560: 0x40021220, 0x17561: 0x4002ba20, 0x17562: 0x4003e020, 0x17563: 0x4004ea20, + 0x17564: 0x4027de20, 0x17565: 0x4004ec20, 0x17566: 0x4004e620, 0x17567: 0x4003d220, + 0x17568: 0x4003f420, 0x17569: 0x4003f620, 0x1756a: 0x4004d820, 0x1756b: 0x40093820, + 0x1756c: 0x40024020, 0x1756d: 0x40021a20, 0x1756e: 0x4002e420, 0x1756f: 0x4004e220, + 0x17570: 0x4029cc20, 0x17571: 0x4029ce20, 0x17572: 0x4029d020, 0x17573: 0x4029d220, + 0x17574: 0x4029d420, 0x17575: 0x4029d620, 0x17576: 0x4029d820, 0x17577: 0x4029da20, + 0x17578: 0x4029dc20, 0x17579: 0x4029de20, 0x1757a: 0x40026c20, 0x1757b: 0x40026220, + 0x1757c: 0x40094020, 0x1757d: 0x40094220, 0x1757e: 0x40094420, 0x1757f: 0x4002c420, + // Block 0x5d6, offset 0x17580 + 0x17580: 0x4004d620, 0x17581: 0x002bde88, 0x17582: 0x002c0a88, 0x17583: 0xc3350911, + 0x17584: 0x002c6288, 0x17585: 0x002c9888, 0x17586: 0x002d0888, 0x17587: 0xc33900d1, + 0x17588: 0x002d6888, 0x17589: 0xc33b0931, 0x1758a: 0x002dcc88, 0x1758b: 0x002dfe88, + 0x1758c: 0xc0030002, 0x1758d: 0x002e8288, 0x1758e: 0x002e9e88, 0x1758f: 0xc33f0071, + 0x17590: 0x002f2c88, 0x17591: 0x002f5688, 0x17592: 0x002f7a88, 0x17593: 0xc3430911, + 0x17594: 0x00302c88, 0x17595: 0xc3470071, 0x17596: 0x0030be88, 0x17597: 0x0030e288, + 0x17598: 0x0030f688, 0x17599: 0x00310088, 0x1759a: 0x00312a88, 0x1759b: 0x4003f820, + 0x1759c: 0x4004e420, 0x1759d: 0x4003fa20, 0x1759e: 0x40062420, 0x1759f: 0x40021620, + 0x175a0: 0x40061e20, 0x175a1: 0x402bde20, 0x175a2: 0x402c0a20, 0x175a3: 0xc3330911, + 0x175a4: 0x402c6220, 0x175a5: 0x402c9820, 0x175a6: 0x402d0820, 0x175a7: 0xc33700d1, + 0x175a8: 0x402d6820, 0x175a9: 0x402d9a20, 0x175aa: 0x402dcc20, 0x175ab: 0x402dfe20, + 0x175ac: 0xc0000002, 0x175ad: 0x402e8220, 0x175ae: 0x402e9e20, 0x175af: 0xc33d0071, + 0x175b0: 0x402f2c20, 0x175b1: 0x402f5620, 0x175b2: 0x402f7a20, 0x175b3: 0xc3410911, + 0x175b4: 0x40302c20, 0x175b5: 0xc3450071, 0x175b6: 0x4030be20, 0x175b7: 0x4030e220, + 0x175b8: 0x4030f620, 0x175b9: 0x40310020, 0x175ba: 0x40312a20, 0x175bb: 0x4003fc20, + 0x175bc: 0x40094820, 0x175bd: 0x4003fe20, 0x175be: 0x40094c20, 0x175bf: 0xa0000000, + // Block 0x5d7, offset 0x175c0 + 0x175c0: 0x00093685, 0x175c1: 0x40083620, 0x175c2: 0x40083820, 0x175c3: 0x40083a20, + 0x175c4: 0x40083c20, 0x175c5: 0x002c628b, 0x175c6: 0x002c6285, 0x175c7: 0x002c9885, + 0x175c8: 0x002d9a85, 0x175c9: 0x002dcc85, 0x175ca: 0x40083e20, 0x175cb: 0x400a6e20, + 0x175cc: 0x40084020, 0x175cd: 0xe00009c4, 0x175ce: 0x402d1e20, 0x175cf: 0x40084220, + 0x175d0: 0xe00002cb, 0x175d1: 0xe00002d3, 0x175d2: 0xe00002b2, 0x175d3: 0xe00002bb, + 0x175d4: 0xe00003cd, 0x175d5: 0xe00002c3, 0x175d6: 0xe00003d1, 0x175d7: 0xe00004ab, + 0x175d8: 0xe0000579, 0x175d9: 0xe00002c7, 0x175da: 0xe0000640, 0x175db: 0xe00002cf, + 0x175dc: 0xe00004af, 0x175dd: 0xe0000644, 0x175de: 0xe0000798, 0x175df: 0xf0001e1e, + 0x175e0: 0x002d9a8a, 0x175e1: 0xe00027d4, 0x175e2: 0xe00027db, 0x175e3: 0xe00027ee, + 0x175e4: 0x0030be8a, 0x175e5: 0xe0002848, 0x175e6: 0xe000284f, 0x175e7: 0xe00010bb, + 0x175e8: 0xe00027f4, 0x175e9: 0x0030f68a, 0x175ea: 0xe0002883, 0x175eb: 0xe000288a, + 0x175ec: 0x002e228a, 0x175ed: 0x002c3a8a, 0x175ee: 0x002c628a, 0x175ef: 0x002e828a, + 0x175f0: 0x002d9a84, 0x175f1: 0xf0001f04, 0x175f2: 0xf0000404, 0x175f3: 0xf0001f04, + 0x175f4: 0x0030be84, 0x175f5: 0xf0001f04, 0x175f6: 0xf0000404, 0x175f7: 0xe00010b6, + 0x175f8: 0xf0001f04, 0x175f9: 0x0030f684, 0x175fa: 0xf0001f04, 0x175fb: 0xf0000404, + 0x175fc: 0x002e2284, 0x175fd: 0x002c3a84, 0x175fe: 0x002c6284, 0x175ff: 0x002e8284, + // Block 0x5d8, offset 0x17600 + 0x17600: 0xf0001f04, 0x17601: 0xf0001f04, 0x17602: 0xf0001f04, 0x17603: 0xf0001f04, + 0x17604: 0xf0001f04, 0x17605: 0xf0001f04, 0x17606: 0xf0001f04, 0x17607: 0xf0001f04, + 0x17608: 0xf0001f04, 0x17609: 0xf0001f04, 0x1760a: 0xf0001f04, + 0x17610: 0xf0000a04, 0x17611: 0xf0000a04, 0x17612: 0xf0000a04, 0x17613: 0xf0000a04, + 0x17614: 0xf0000a04, 0x17615: 0xf0000a04, 0x17616: 0xf0000a04, 0x17617: 0xf0000a04, + 0x17618: 0xe00024b3, 0x17619: 0xf0000a04, 0x1761a: 0xf0000a04, 0x1761b: 0xf0000a04, + 0x1761c: 0xf0000a04, 0x1761d: 0xf0000a04, 0x1761e: 0xf0000a04, 0x1761f: 0xf0000a04, + 0x17620: 0xf0000a04, 0x17621: 0xf0000a04, 0x17622: 0xf0000a04, 0x17623: 0xf0000a04, + 0x17624: 0xf0000a04, 0x17625: 0xf0000a04, 0x17626: 0xf0000a04, 0x17627: 0xf0000a04, + 0x17628: 0xf0000a04, 0x17629: 0xf0000a04, 0x1762a: 0xf0000a04, 0x1762b: 0x002c3a8c, + 0x1762c: 0x002f7a8c, 0x1762d: 0xf0000c0c, 0x1762e: 0xf0000c0c, + 0x17630: 0x002bde9d, 0x17631: 0x002c0a9d, 0x17632: 0x002c3a9d, 0x17633: 0x002c629d, + 0x17634: 0x002c989d, 0x17635: 0x002d089d, 0x17636: 0x002d229d, 0x17637: 0x002d689d, + 0x17638: 0x002d9a9d, 0x17639: 0x002dcc9d, 0x1763a: 0x002dfe9d, 0x1763b: 0x002e229d, + 0x1763c: 0x002e829d, 0x1763d: 0x002e9e9d, 0x1763e: 0x002ee29d, 0x1763f: 0x002f2c9d, + // Block 0x5d9, offset 0x17640 + 0x17640: 0x00352088, 0x17641: 0x40352020, 0x17642: 0x40070620, 0x17643: 0xae608302, + 0x17644: 0xae605f02, 0x17645: 0xae602a02, 0x17646: 0xae602202, 0x17647: 0xae605f02, + 0x17648: 0xa0000000, 0x17649: 0xa0000000, 0x1764a: 0x00341c88, 0x1764b: 0x40341c20, + 0x1764c: 0x00369688, 0x1764d: 0x40369620, 0x1764e: 0x00353088, 0x1764f: 0x40353020, + 0x17650: 0x00336483, 0x17651: 0x40336420, 0x17652: 0x00336a88, 0x17653: 0x40336a20, + 0x17654: 0x00337a88, 0x17655: 0x40337a20, 0x17656: 0x0033dc88, 0x17657: 0x4033dc20, + 0x17658: 0x0033aa88, 0x17659: 0x4033aa20, 0x1765a: 0x00345888, 0x1765b: 0x40345820, + 0x1765c: 0x00347888, 0x1765d: 0x40347820, 0x1765e: 0x00347088, 0x1765f: 0x40347020, + 0x17660: 0x00346888, 0x17661: 0x40346820, 0x17662: 0x0034ca88, 0x17663: 0x4034ca20, + 0x17664: 0x0034dc88, 0x17665: 0x4034dc20, 0x17666: 0x00351888, 0x17667: 0x40351820, + 0x17668: 0x00372688, 0x17669: 0x40372620, 0x1766a: 0x00354488, 0x1766b: 0x40354420, + 0x1766c: 0x00355888, 0x1766d: 0x40355820, 0x1766e: 0x00359288, 0x1766f: 0x40359220, + 0x17670: 0x00359a88, 0x17671: 0x40359a20, 0x17672: 0x0035cc88, 0x17673: 0x4035cc20, + 0x17674: 0x00360e88, 0x17675: 0x40360e20, 0x17676: 0x00362a88, 0x17677: 0x40362a20, + 0x17678: 0x00363a88, 0x17679: 0x40363a20, 0x1767a: 0x0035d488, 0x1767b: 0x4035d420, + 0x1767c: 0x00364488, 0x1767d: 0x40364420, 0x1767e: 0x00364c88, 0x1767f: 0x40364c20, + // Block 0x5da, offset 0x17680 + 0x17680: 0xa0000000, 0x17681: 0xa0000000, 0x17682: 0xa0000000, 0x17683: 0xa0000000, + 0x17684: 0xa0000000, 0x17686: 0x40096620, 0x17687: 0x40096a20, + 0x17688: 0x40070820, 0x17689: 0x4004f220, 0x1768a: 0x4004f620, 0x1768b: 0x4027e620, + 0x1768c: 0x40024820, 0x1768d: 0x40024a20, 0x1768e: 0x40070e20, 0x1768f: 0x40071020, + 0x17690: 0xa0000001, 0x17691: 0xa0000002, 0x17692: 0xa0000004, 0x17693: 0xa0000003, + 0x17694: 0xa0000005, 0x17695: 0xae600000, 0x17696: 0xae600000, 0x17697: 0xae600000, + 0x17698: 0xa1e00000, 0x17699: 0xa1f00000, 0x1769a: 0xa2000000, 0x1769b: 0x40026420, + 0x1769e: 0x40027020, 0x1769f: 0x4002cc20, + 0x176a0: 0x403aa220, 0x176a1: 0x4039a620, 0x176a2: 0x40393a20, 0x176a3: 0x40393821, + 0x176a4: 0x40399c21, 0x176a5: 0x40392820, 0x176a6: 0x4039a821, 0x176a7: 0xcf0b0151, + 0x176a8: 0xcf0f97a1, 0x176a9: 0x40395420, 0x176aa: 0xcf1397a1, 0x176ab: 0x40394c20, + 0x176ac: 0xcf1797a1, 0x176ad: 0x40395620, 0x176ae: 0x40395820, 0x176af: 0xcf1b97a1, + 0x176b0: 0x40396220, 0x176b1: 0xcf1f97a1, 0x176b2: 0x40396c20, 0x176b3: 0x40397020, + 0x176b4: 0x40397220, 0x176b5: 0x40397420, 0x176b6: 0x40397620, 0x176b7: 0x40397820, + 0x176b8: 0x40397a20, 0x176b9: 0x40397c20, 0x176ba: 0x40397e20, 0x176bb: 0x403a3820, + 0x176bc: 0x403a3a20, 0x176bd: 0x403a9c20, 0x176be: 0x403a9e20, 0x176bf: 0x403aa020, + // Block 0x5db, offset 0x176c0 + 0x176c0: 0xa0000000, 0x176c1: 0x40398020, 0x176c2: 0x40398220, 0x176c3: 0x403a1a20, + 0x176c4: 0xcf2797a1, 0x176c5: 0xcf2997a1, 0x176c6: 0xcf2b97a1, 0x176c7: 0x403a6820, + 0x176c8: 0xcf2f97c2, 0x176c9: 0x403a8e20, 0x176ca: 0xcf340171, 0x176cb: 0xa000c302, + 0x176cc: 0xa000c502, 0x176cd: 0xa000c402, 0x176ce: 0xa000bd02, 0x176cf: 0xa000bf02, + 0x176d0: 0xa000be02, 0x176d1: 0xa000c702, 0x176d2: 0xa220bc02, 0x176d3: 0xa000c902, + 0x176d4: 0xa000c602, 0x176d5: 0xadc0bf02, 0x176d6: 0xa000c102, 0x176d7: 0xa000c202, + 0x176d8: 0xa000c802, 0x176d9: 0xae60c402, 0x176da: 0xae60c502, 0x176db: 0xae60c602, + 0x176dc: 0xadc0c702, 0x176dd: 0xae60c802, 0x176de: 0xae60c902, 0x176df: 0xadc0c002, + 0x176e0: 0xe000015e, 0x176e1: 0xe00001e6, 0x176e2: 0xe0000301, 0x176e3: 0xe00003db, + 0x176e4: 0xe00004b6, 0x176e5: 0xe0000580, 0x176e6: 0xe000064b, 0x176e7: 0xe00006f3, + 0x176e8: 0xe000079f, 0x176e9: 0xe0000844, 0x176ea: 0x4004ee20, 0x176eb: 0x40024c20, + 0x176ec: 0x40024e20, 0x176ed: 0x4004de20, 0x176ee: 0x40393a20, 0x176ef: 0x403a1020, + 0x176f0: 0xa000c002, 0x176f1: 0x40392420, 0x176f2: 0x40392220, 0x176f3: 0x40392a20, + 0x176f4: 0x00391c84, 0x176f5: 0xf0000404, 0x176f6: 0xe000b00c, 0x176f7: 0xf0000404, + 0x176f8: 0xf0000404, 0x176f9: 0xcf1597a1, 0x176fa: 0x40395c20, 0x176fb: 0x40393e20, + 0x176fc: 0x40395e20, 0x176fd: 0x40396020, 0x176fe: 0xcf1197a1, 0x176ff: 0x40396220, + // Block 0x5dc, offset 0x17700 + 0x17700: 0x40394220, 0x17701: 0x40397620, 0x17702: 0x40397820, 0x17703: 0x40396620, + 0x17704: 0x40396820, 0x17705: 0x40397a20, 0x17706: 0xcf1997a1, 0x17707: 0x40396e20, + 0x17708: 0xcf1d97a1, 0x17709: 0x40398e20, 0x1770a: 0x40399020, 0x1770b: 0x40399220, + 0x1770c: 0x40399420, 0x1770d: 0x40399620, 0x1770e: 0x40399820, 0x1770f: 0x40399a20, + 0x17710: 0x40399c20, 0x17711: 0xcf2197a1, 0x17712: 0x4039aa20, 0x17713: 0x4039ac20, + 0x17714: 0x4039ae20, 0x17715: 0x4039b020, 0x17716: 0x4039b220, 0x17717: 0x4039b420, + 0x17718: 0x40396e20, 0x17719: 0x4039b820, 0x1771a: 0x4039ca20, 0x1771b: 0x4039cc20, + 0x1771c: 0x4039ce20, 0x1771d: 0x4039e020, 0x1771e: 0x4039e220, 0x1771f: 0x4039ea20, + 0x17720: 0x4039f220, 0x17721: 0x4039fe20, 0x17722: 0x403a0020, 0x17723: 0x403a0220, + 0x17724: 0x403a0420, 0x17725: 0x403a0820, 0x17726: 0x403a0a20, 0x17727: 0x403a1420, + 0x17728: 0x403a1620, 0x17729: 0xcf2397a1, 0x1772a: 0x403a1e20, 0x1772b: 0x403a2020, + 0x1772c: 0x403a2220, 0x1772d: 0x403a2620, 0x1772e: 0x403a2820, 0x1772f: 0xcf2597a1, + 0x17730: 0x403a2c20, 0x17731: 0x403a2e20, 0x17732: 0x403a3020, 0x17733: 0x403a3220, + 0x17734: 0x403a3420, 0x17735: 0x403a4220, 0x17736: 0x403a4420, 0x17737: 0x403a4620, + 0x17738: 0x403a4820, 0x17739: 0x403a6020, 0x1773a: 0xcf2d97a1, 0x1773b: 0x403a5a20, + 0x1773c: 0x403a5c20, 0x1773d: 0x403a5e20, 0x1773e: 0x4039a220, 0x1773f: 0x40396c20, + // Block 0x5dd, offset 0x17740 + 0x17740: 0xe000b009, 0x17741: 0xcf320171, 0x17742: 0x4039a021, 0x17743: 0x4039a420, + 0x17744: 0x403a7620, 0x17745: 0x403a7820, 0x17746: 0x403a7a20, 0x17747: 0x403a7c20, + 0x17748: 0x403a7e20, 0x17749: 0x403a8020, 0x1774a: 0x403a8220, 0x1774b: 0x403a8420, + 0x1774c: 0xcf3697a1, 0x1774d: 0x403a9420, 0x1774e: 0x403a9620, 0x1774f: 0x403a8620, + 0x17750: 0x403a9820, 0x17751: 0x403a9a20, 0x17752: 0xcf380171, 0x17753: 0x4039ac21, + 0x17754: 0x4002e820, 0x17755: 0x403a7220, 0x17756: 0xae600000, 0x17757: 0xae600000, + 0x17758: 0xae600000, 0x17759: 0xae600000, 0x1775a: 0xae600000, 0x1775b: 0xae600000, + 0x1775c: 0xae600000, 0x1775d: 0xa0000000, 0x1775e: 0x40071220, 0x1775f: 0xae600000, + 0x17760: 0xae600000, 0x17761: 0xae600000, 0x17762: 0xae600000, 0x17763: 0xadc00000, + 0x17764: 0xae600000, 0x17765: 0x003a7484, 0x17766: 0x003a9084, 0x17767: 0xae600000, + 0x17768: 0xae600000, 0x17769: 0x40071420, 0x1776a: 0xadc00000, 0x1776b: 0xae600000, + 0x1776c: 0xae600000, 0x1776d: 0xadc00000, 0x1776e: 0x40399e20, 0x1776f: 0x4039ba20, + 0x17770: 0xe0000161, 0x17771: 0xe00001e9, 0x17772: 0xe0000304, 0x17773: 0xe00003de, + 0x17774: 0xe00004b9, 0x17775: 0xe0000583, 0x17776: 0xe000064e, 0x17777: 0xe00006f6, + 0x17778: 0xe00007a2, 0x17779: 0xe0000847, 0x1777a: 0x4039d020, 0x1777b: 0x4039e420, + 0x1777c: 0x4039f420, 0x1777d: 0xe0001553, 0x1777e: 0xe0001779, 0x1777f: 0x403a7020, + // Block 0x5de, offset 0x17780 + 0x17780: 0xe000155f, 0x17781: 0xe0001565, 0x17782: 0xe000157a, 0x17783: 0xe00015b0, + 0x17784: 0xe00015b6, 0x17785: 0xe000ae29, 0x17786: 0xe000ae2f, 0x17787: 0xe000ae35, + 0x17788: 0xe000ae47, 0x17789: 0xf0001a1a, 0x1778a: 0xf0001a1a, 0x1778b: 0xe000ae50, + 0x1778c: 0xe000ae56, 0x1778d: 0xe000ae5c, 0x1778e: 0xe000ae6e, 0x1778f: 0xe000289a, + 0x17790: 0xe0003667, 0x17791: 0xe000ae74, 0x17792: 0xe000ae86, 0x17793: 0xe00028a0, + 0x17794: 0xe0003670, 0x17795: 0xe000ae8f, 0x17796: 0xe000ae95, 0x17797: 0xe000ae9b, + 0x17798: 0xe000aea1, 0x17799: 0xe000aea7, 0x1779a: 0xe000aeaa, 0x1779b: 0xe000aeb0, + 0x1779c: 0xe000aebf, 0x1779d: 0xe000aec8, 0x1779e: 0xe000aed1, 0x1779f: 0xe000aee0, + 0x177a0: 0xe000af1c, 0x177a1: 0xe000af2b, 0x177a2: 0xe000af31, 0x177a3: 0xe000af37, + 0x177a4: 0xe000af3d, 0x177a5: 0xe000af49, 0x177a6: 0xe000af4f, 0x177a7: 0xe000af58, + 0x177a8: 0xe000af61, 0x177a9: 0xe000af67, 0x177aa: 0xe000af6d, 0x177ab: 0xe000af73, + 0x177ac: 0xe000af79, 0x177ad: 0xe000af7f, 0x177ae: 0xe000af85, 0x177af: 0xe000af8b, + 0x177b0: 0xe000af91, 0x177b1: 0xe00028e2, 0x177b2: 0xe00036be, 0x177b3: 0xe000af97, + 0x177b4: 0xe000af9d, 0x177b5: 0xe00028e8, 0x177b6: 0xe00036c4, 0x177b7: 0xf0001a1a, + 0x177b8: 0xe00036d0, 0x177b9: 0xe00036d6, 0x177ba: 0xe00036dc, 0x177bb: 0xe00036e8, + 0x177bc: 0xe00036f4, 0x177bd: 0xf0001a1a, 0x177be: 0xf0001a1a, 0x177bf: 0xe000afa9, + // Block 0x5df, offset 0x177c0 + 0x177c0: 0xe000afaf, 0x177c1: 0xe000afb5, 0x177c2: 0xe000afc1, 0x177c3: 0xe00028f4, + 0x177c4: 0xe0003703, 0x177c5: 0xe000afca, 0x177c6: 0xe000afd0, 0x177c7: 0xe000afd6, + 0x177c8: 0xe000afdf, 0x177c9: 0xe00028f7, 0x177ca: 0xe0003706, 0x177cb: 0xe000afe5, + 0x177cc: 0xe000afeb, 0x177cd: 0xe000aff1, 0x177ce: 0xe000b003, 0x177cf: 0xe00028fd, + 0x177d0: 0xe0003712, 0x177d1: 0xe000371b, 0x177d2: 0xe0003721, 0x177d3: 0xf0001a1a, + 0x177d4: 0xf0001a1a, 0x177d5: 0xe000373c, 0x177d6: 0xe0003742, 0x177d7: 0xe0003748, + 0x177d8: 0xe000375a, 0x177d9: 0xf0001a1a, 0x177da: 0xf0001a1a, 0x177db: 0xe000aeb3, + 0x177dc: 0xe000aeb6, 0x177dd: 0xe0003733, 0x177de: 0xe0000003, 0x177df: 0xe0000006, + 0x177e0: 0xe0000009, 0x177e1: 0xe000000c, 0x177e2: 0xe000000f, 0x177e3: 0xe0000012, + 0x177e4: 0xe000156b, 0x177e5: 0xe000156e, 0x177e6: 0xe0001577, 0x177e7: 0xe000157d, + 0x177e8: 0xe00015aa, 0x177e9: 0xe00015b3, 0x177ea: 0xe000ae38, 0x177eb: 0xe000ae3b, + 0x177ec: 0xe000ae44, 0x177ed: 0xe000ae4a, 0x177ee: 0xf0001919, 0x177ef: 0xf0001919, + 0x177f0: 0xe000ae5f, 0x177f1: 0xe000ae62, 0x177f2: 0xe000ae6b, 0x177f3: 0xe000ae71, + 0x177f4: 0xe0002897, 0x177f5: 0xe0003664, 0x177f6: 0xe000ae77, 0x177f7: 0xe000ae7a, + 0x177f8: 0xe000ae83, 0x177f9: 0xe000ae89, 0x177fa: 0xe000289d, 0x177fb: 0xe000366d, + 0x177fc: 0xe00028df, 0x177fd: 0xe00036bb, 0x177fe: 0xe00028e5, 0x177ff: 0xe00036c1, + // Block 0x5e0, offset 0x17800 + 0x17800: 0xf0001919, 0x17801: 0xe00036e5, 0x17802: 0xe00036f1, 0x17803: 0xf0001919, + 0x17804: 0xf0001919, 0x17805: 0xe000afbe, 0x17806: 0xe00028f1, 0x17807: 0xe0003700, + 0x17808: 0xe000afc4, 0x17809: 0xe000afdc, 0x1780a: 0xe000aff4, 0x1780b: 0xe000aff7, + 0x1780c: 0xe000b000, 0x1780d: 0xe000b006, 0x1780e: 0xe00028fa, 0x1780f: 0xe000370f, + 0x17810: 0xe0003730, 0x17811: 0xe000374b, 0x17812: 0xe000374e, 0x17813: 0xe0003757, + 0x17814: 0xe000375d, 0x17815: 0xf0001919, 0x17816: 0xf0001919, 0x17817: 0xe000155c, + 0x17818: 0xe0001562, 0x17819: 0xe0001568, 0x1781a: 0xe0001571, 0x1781b: 0xe0001580, + 0x1781c: 0xe000ae26, 0x1781d: 0xe000ae2c, 0x1781e: 0xe000ae32, 0x1781f: 0xe000ae3e, + 0x17820: 0xf0001717, 0x17821: 0xe000ae4d, 0x17822: 0xe000ae53, 0x17823: 0xe000ae59, + 0x17824: 0xe000ae65, 0x17825: 0xe000365e, 0x17826: 0xe000ae7d, 0x17827: 0xe000ae8c, + 0x17828: 0xe000ae92, 0x17829: 0xe000ae98, 0x1782a: 0xe000ae9e, 0x1782b: 0xe000aea4, + 0x1782c: 0xe000aead, 0x1782d: 0xe000aeb9, 0x1782e: 0xe000aec2, 0x1782f: 0xe000aecb, + 0x17830: 0xe000aeda, 0x17831: 0xe000af19, 0x17832: 0xe000af1f, 0x17833: 0xe000af28, + 0x17834: 0xe000af2e, 0x17835: 0xe000af34, 0x17836: 0xe000af3a, 0x17837: 0xe000af46, + 0x17838: 0xe000af4c, 0x17839: 0xe000af5b, 0x1783a: 0xe000af64, 0x1783b: 0xe000af6a, + 0x1783c: 0xe000af70, 0x1783d: 0xe000af76, 0x1783e: 0xe000af7c, 0x1783f: 0xe000af82, + // Block 0x5e1, offset 0x17840 + 0x17840: 0xe000af88, 0x17841: 0xe000af8e, 0x17842: 0xe000af94, 0x17843: 0xe000af9a, + 0x17844: 0xe00036cd, 0x17845: 0xe00036d3, 0x17846: 0xe00036d9, 0x17847: 0xe00036df, + 0x17848: 0xe00036eb, 0x17849: 0xe000afa6, 0x1784a: 0xe000afac, 0x1784b: 0xe000afb2, + 0x1784c: 0xe000afb8, 0x1784d: 0xe00036fd, 0x1784e: 0xe000afc7, 0x1784f: 0xe000afcd, + 0x17850: 0xe000afd3, 0x17851: 0xe000afd9, 0x17852: 0xe000afe2, 0x17853: 0xe000afe8, + 0x17854: 0xe000afee, 0x17855: 0xe000affa, 0x17856: 0xe0003709, 0x17857: 0xe0003718, + 0x17858: 0xe000371e, 0x17859: 0xe0003715, 0x1785a: 0xe0003739, 0x1785b: 0xe000373f, + 0x1785c: 0xe0003745, 0x1785d: 0xe0003751, 0x1785e: 0xf0001717, 0x1785f: 0xe0001574, + 0x17860: 0xe0001583, 0x17861: 0xe000ae41, 0x17862: 0xf0001818, 0x17863: 0xe000ae68, + 0x17864: 0xe0003661, 0x17865: 0xe000ae80, 0x17866: 0xe000366a, 0x17867: 0xe000aedd, + 0x17868: 0xe0003688, 0x17869: 0xe000af10, 0x1786a: 0xe0003694, 0x1786b: 0xe00036e2, + 0x1786c: 0xe00036ee, 0x1786d: 0xe000afbb, 0x1786e: 0xe000affd, 0x1786f: 0xe000370c, + 0x17870: 0xe0003754, 0x17871: 0xf0001818, 0x17872: 0xe000ae23, 0x17873: 0xe0003646, + 0x17874: 0xe0003649, 0x17875: 0xe00028d0, 0x17876: 0xe00036ac, 0x17877: 0xe00028d6, + 0x17878: 0xe00036b2, 0x17879: 0xe00028dc, 0x1787a: 0xe00036b8, 0x1787b: 0xe00028b8, + 0x1787c: 0xe000368e, 0x1787d: 0xe00028be, 0x1787e: 0xe000369a, 0x1787f: 0xe00028ac, + // Block 0x5e2, offset 0x17880 + 0x17880: 0xe000367c, 0x17881: 0xe00028a6, 0x17882: 0xe0003676, 0x17883: 0xe00028b2, + 0x17884: 0xe0003682, 0x17885: 0xe00028c4, 0x17886: 0xe00036a0, 0x17887: 0xe00028ca, + 0x17888: 0xe00036a6, 0x17889: 0xe000aeec, 0x1788a: 0xe000aef8, 0x1788b: 0xe000af04, + 0x1788c: 0xe000af16, 0x1788d: 0xe000af0a, 0x1788e: 0xe000aed7, 0x1788f: 0xe000af25, + 0x17890: 0xe000af43, 0x17891: 0xe00028cd, 0x17892: 0xe00036a9, 0x17893: 0xe00028d3, + 0x17894: 0xe00036af, 0x17895: 0xe00028d9, 0x17896: 0xe00036b5, 0x17897: 0xe00028b5, + 0x17898: 0xe000368b, 0x17899: 0xe00028bb, 0x1789a: 0xe0003697, 0x1789b: 0xe00028a9, + 0x1789c: 0xe0003679, 0x1789d: 0xe00028a3, 0x1789e: 0xe0003673, 0x1789f: 0xe00028af, + 0x178a0: 0xe000367f, 0x178a1: 0xe00028c1, 0x178a2: 0xe000369d, 0x178a3: 0xe00028c7, + 0x178a4: 0xe00036a3, 0x178a5: 0xe000aee9, 0x178a6: 0xe000aef5, 0x178a7: 0xe000af01, + 0x178a8: 0xe000af13, 0x178a9: 0xe000af07, 0x178aa: 0xe000aed4, 0x178ab: 0xe000af22, + 0x178ac: 0xe000af40, 0x178ad: 0xe000aee3, 0x178ae: 0xe000aeef, 0x178af: 0xe000aefb, + 0x178b0: 0xe000af0d, 0x178b1: 0xe0003685, 0x178b2: 0xe0003691, 0x178b3: 0xe000af52, + 0x178b4: 0xe000aebc, 0x178b5: 0xe000aec5, 0x178b6: 0xe000aece, 0x178b7: 0xe000aee6, + 0x178b8: 0xe000aef2, 0x178b9: 0xe000aefe, 0x178ba: 0xe000af55, 0x178bb: 0xe000af5e, + 0x178bc: 0xe000364c, 0x178bd: 0xe000364f, 0x178be: 0x4004c020, 0x178bf: 0x4004c220, + // Block 0x5e3, offset 0x178c0 + 0x178c0: 0x0039de98, 0x178c1: 0x0039e69a, 0x178c2: 0x0039e699, 0x178c3: 0x0039e697, + 0x178c4: 0x0039e698, 0x178c5: 0x0039e89a, 0x178c6: 0x0039e899, 0x178c7: 0x0039e897, + 0x178c8: 0x0039e898, 0x178c9: 0x0039ee9a, 0x178ca: 0x0039ee99, 0x178cb: 0x0039ee97, + 0x178cc: 0x0039ee98, 0x178cd: 0x0039f09a, 0x178ce: 0x0039f099, 0x178cf: 0x0039f097, + 0x178d0: 0x0039f098, 0x178d1: 0x0039fc9a, 0x178d2: 0x0039fc99, 0x178d3: 0x0039fc97, + 0x178d4: 0x0039fc98, 0x178d5: 0x003a129a, 0x178d6: 0x003a1299, 0x178d7: 0x003a1297, + 0x178d8: 0x003a1298, 0x178d9: 0x003a1a9a, 0x178da: 0x003a1a99, 0x178db: 0x003a1a97, + 0x178dc: 0x003a1a98, 0x178dd: 0x003a409a, 0x178de: 0x003a4099, 0x178df: 0x003a4097, + 0x178e0: 0x003a4098, 0x178e1: 0x003a4e9a, 0x178e2: 0x003a4e99, 0x178e3: 0x003a4e97, + 0x178e4: 0x003a4e98, 0x178e5: 0x003a569a, 0x178e6: 0x003a5699, 0x178e7: 0x003a5697, + 0x178e8: 0x003a5698, 0x178e9: 0x003a689a, 0x178ea: 0x003a6899, 0x178eb: 0x003a6897, + 0x178ec: 0x003a6898, 0x178ed: 0x003a749a, 0x178ee: 0x003a7499, 0x178ef: 0x003a8e9a, + 0x178f0: 0x003a8e99, 0x178f1: 0x003a909a, 0x178f2: 0x003a9099, 0x178f3: 0x003a9097, + 0x178f4: 0x003a9098, 0x178f5: 0xe0001732, 0x178f6: 0xe000172f, 0x178f7: 0xe0001738, + 0x178f8: 0xe0001735, 0x178f9: 0xe000173e, 0x178fa: 0xe000173b, 0x178fb: 0xe000afa3, + 0x178fc: 0xe000afa0, 0x178ff: 0xa0000000, + // Block 0x5e4, offset 0x17900 + 0x17900: 0xa0000000, 0x17901: 0xa0000000, 0x17902: 0xa0000000, 0x17903: 0xa0000000, + 0x17904: 0xa0000000, 0x17905: 0xa0000000, 0x17906: 0xa0000000, 0x17907: 0xa0000000, + 0x17908: 0xa0000000, 0x17909: 0x40020020, 0x1790a: 0x40020220, 0x1790b: 0x40020420, + 0x1790c: 0x40020620, 0x1790d: 0x40020820, 0x1790e: 0xa0000000, 0x1790f: 0xa0000000, + 0x17910: 0xa0000000, 0x17911: 0xa0000000, 0x17912: 0xa0000000, 0x17913: 0xa0000000, + 0x17914: 0xa0000000, 0x17915: 0xa0000000, 0x17916: 0xa0000000, 0x17917: 0xa0000000, + 0x17918: 0xa0000000, 0x17919: 0xa0000000, 0x1791a: 0xa0000000, 0x1791b: 0xa0000000, + 0x1791c: 0xa0000000, 0x1791d: 0xa0000000, 0x1791e: 0xa0000000, 0x1791f: 0xa0000000, + 0x17920: 0x40021220, 0x17921: 0x4002ba20, 0x17922: 0x4003e020, 0x17923: 0x4004ea20, + 0x17924: 0x4027de20, 0x17925: 0x4004ec20, 0x17926: 0x4004e620, 0x17927: 0x4003d220, + 0x17928: 0x4003f420, 0x17929: 0x4003f620, 0x1792a: 0x4004d820, 0x1792b: 0x40093820, + 0x1792c: 0x40024020, 0x1792d: 0x40021a20, 0x1792e: 0x4002e420, 0x1792f: 0x4004e220, + 0x17930: 0x4029cc20, 0x17931: 0x4029ce20, 0x17932: 0x4029d020, 0x17933: 0x4029d220, + 0x17934: 0x4029d420, 0x17935: 0x4029d620, 0x17936: 0x4029d820, 0x17937: 0x4029da20, + 0x17938: 0x4029dc20, 0x17939: 0x4029de20, 0x1793a: 0x40026c20, 0x1793b: 0x40026220, + 0x1793c: 0x40094020, 0x1793d: 0x40094220, 0x1793e: 0x40094420, 0x1793f: 0x4002c420, + // Block 0x5e5, offset 0x17940 + 0x17940: 0x4004d620, 0x17941: 0xce4a94d1, 0x17942: 0x002c0a88, 0x17943: 0x002c3a88, + 0x17944: 0x002c6288, 0x17945: 0xce0a2741, 0x17946: 0x002d0888, 0x17947: 0x002d2288, + 0x17948: 0x002d6888, 0x17949: 0x002d9a88, 0x1794a: 0x002dcc88, 0x1794b: 0x002dfe88, + 0x1794c: 0xc0030002, 0x1794d: 0x002e8288, 0x1794e: 0x002e9e88, 0x1794f: 0xcf3d9801, + 0x17950: 0x002f2c88, 0x17951: 0x002f5688, 0x17952: 0x002f7a88, 0x17953: 0x002fe688, + 0x17954: 0x00302c88, 0x17955: 0xc3479831, 0x17956: 0x0030be88, 0x17957: 0x0030e288, + 0x17958: 0x0030f688, 0x17959: 0x00310088, 0x1795a: 0x00312a88, 0x1795b: 0x4003f820, + 0x1795c: 0x4004e420, 0x1795d: 0x4003fa20, 0x1795e: 0x40062420, 0x1795f: 0x40021620, + 0x17960: 0x40061e20, 0x17961: 0xce4794d1, 0x17962: 0x402c0a20, 0x17963: 0x402c3a20, + 0x17964: 0x402c6220, 0x17965: 0xce082741, 0x17966: 0x402d0820, 0x17967: 0x402d2220, + 0x17968: 0x402d6820, 0x17969: 0x402d9a20, 0x1796a: 0x402dcc20, 0x1796b: 0x402dfe20, + 0x1796c: 0xc0000002, 0x1796d: 0x402e8220, 0x1796e: 0x402e9e20, 0x1796f: 0xcf3a9801, + 0x17970: 0x402f2c20, 0x17971: 0x402f5620, 0x17972: 0x402f7a20, 0x17973: 0x402fe620, + 0x17974: 0x40302c20, 0x17975: 0xc3459831, 0x17976: 0x4030be20, 0x17977: 0x4030e220, + 0x17978: 0x4030f620, 0x17979: 0x40310020, 0x1797a: 0x40312a20, 0x1797b: 0x4003fc20, + 0x1797c: 0x40094820, 0x1797d: 0x4003fe20, 0x1797e: 0x40094c20, 0x1797f: 0xa0000000, + // Block 0x5e6, offset 0x17980 + 0x17980: 0xe00008f5, 0x17981: 0xe000b02a, 0x17982: 0x002be283, 0x17983: 0xe000b024, + 0x17984: 0xe000095b, 0x17985: 0xe000094d, 0x17986: 0xe00009dd, 0x17987: 0xe0000a53, + 0x17988: 0xe0000ae8, 0x17989: 0xe000b09e, 0x1798a: 0x002c9a83, 0x1798b: 0xe0000b20, + 0x1798c: 0xe0000c2b, 0x1798d: 0xe000b0e2, 0x1798e: 0xe0000c37, 0x1798f: 0xe0000c43, + 0x17990: 0xe0000ab3, 0x17991: 0xe000b122, 0x17992: 0xe0000d9a, 0x17993: 0xe000b158, + 0x17994: 0x002ee483, 0x17995: 0xe000b13a, 0x17996: 0xe0000dd2, 0x17997: 0x40093e20, + 0x17998: 0xe0000e12, 0x17999: 0xe0000fe1, 0x1799a: 0xe000b1fa, 0x1799b: 0xe0000fed, + 0x1799c: 0xe0000fff, 0x1799d: 0xe000b24a, 0x1799e: 0x00318888, 0x1799f: 0xe0000f7b, + 0x179a0: 0xe00008f2, 0x179a1: 0xe000b027, 0x179a2: 0x402be220, 0x179a3: 0xe000b021, + 0x179a4: 0xe0000958, 0x179a5: 0xe000094a, 0x179a6: 0xe00009d5, 0x179a7: 0xe0000a4d, + 0x179a8: 0xe0000ae5, 0x179a9: 0xe000b09b, 0x179aa: 0x402c9a20, 0x179ab: 0xe0000b1d, + 0x179ac: 0xe0000c28, 0x179ad: 0xe000b0df, 0x179ae: 0xe0000c34, 0x179af: 0xe0000c40, + 0x179b0: 0xe0000aad, 0x179b1: 0xe000b11f, 0x179b2: 0xe0000d97, 0x179b3: 0xe000b155, + 0x179b4: 0x402ee420, 0x179b5: 0xe000b137, 0x179b6: 0xe0000dcf, 0x179b7: 0x40093c20, + 0x179b8: 0xe0000e0f, 0x179b9: 0xe0000fde, 0x179ba: 0xe000b1f7, 0x179bb: 0xe0000fea, + 0x179bc: 0xe0000ffc, 0x179bd: 0xe000b247, 0x179be: 0x40318820, 0x179bf: 0xe0001114, + // Block 0x5e7, offset 0x179c0 + 0x179c0: 0xe0000983, 0x179c1: 0xe0000980, 0x179c2: 0x002be083, 0x179c3: 0x402be020, + 0x179c4: 0xe000097d, 0x179c5: 0xe000097a, 0x179c6: 0xe000b07e, 0x179c7: 0xe000b07b, + 0x179c8: 0xe0000a3e, 0x179c9: 0xe0000a3b, 0x179ca: 0xe0000a4a, 0x179cb: 0xe0000a47, + 0x179cc: 0xe0000a44, 0x179cd: 0xe0000a41, 0x179ce: 0xe0000a86, 0x179cf: 0xe0000a83, + 0x179d0: 0x002c6483, 0x179d1: 0x402c6420, 0x179d2: 0xe0000b46, 0x179d3: 0xe0000b43, + 0x179d4: 0xe0000aee, 0x179d5: 0xe0000aeb, 0x179d6: 0xe0000b2c, 0x179d7: 0xe0000b29, + 0x179d8: 0xe0000b40, 0x179d9: 0xe0000b3d, 0x179da: 0xe0000b1a, 0x179db: 0xe0000b17, + 0x179dc: 0xe0000bb8, 0x179dd: 0xe0000bb5, 0x179de: 0xe0000bb2, 0x179df: 0xe0000baf, + 0x179e0: 0xe0000bc4, 0x179e1: 0xe0000bc1, 0x179e2: 0xe0000bca, 0x179e3: 0xe0000bc7, + 0x179e4: 0xe0000bee, 0x179e5: 0xe0000beb, 0x179e6: 0xe0000c1b, 0x179e7: 0xe0000c18, + 0x179e8: 0xe000b0dc, 0x179e9: 0xe000b0d9, 0x179ea: 0xe0000c60, 0x179eb: 0xe0000c5d, + 0x179ec: 0xe0000c31, 0x179ed: 0xe0000c2e, 0x179ee: 0xe0000c5a, 0x179ef: 0xe0000c57, + 0x179f0: 0xe0000c54, 0x179f1: 0x402da220, 0x179f2: 0xf0000a0a, 0x179f3: 0xf0000404, + 0x179f4: 0xe0000c8a, 0x179f5: 0xe0000c87, 0x179f6: 0xe0000c9f, 0x179f7: 0xe0000c9c, + 0x179f8: 0x402f7220, 0x179f9: 0xe000b102, 0x179fa: 0xe000b0ff, 0x179fb: 0xe0000cd8, + 0x179fc: 0xe0000cd5, 0x179fd: 0xe0000cd2, 0x179fe: 0xe0000ccf, 0x179ff: 0xe0000d04, + // Block 0x5e8, offset 0x17a00 + 0x17a00: 0xe0000cfe, 0x17a01: 0xe0000cf8, 0x17a02: 0xe0000cf5, 0x17a03: 0xe000b128, + 0x17a04: 0xe000b125, 0x17a05: 0xe0000d6f, 0x17a06: 0xe0000d6c, 0x17a07: 0xe0000d5d, + 0x17a08: 0xe0000d5a, 0x17a09: 0xf0000404, 0x17a0a: 0x002eda88, 0x17a0b: 0x402eda20, + 0x17a0c: 0xe0000e2e, 0x17a0d: 0xe0000e2b, 0x17a0e: 0xe0000da0, 0x17a0f: 0xe0000d9d, + 0x17a10: 0xe0000de0, 0x17a11: 0xe0000ddd, 0x17a12: 0xe0000e93, 0x17a13: 0xe0000e8f, + 0x17a14: 0xe000b1b0, 0x17a15: 0xe000b1ad, 0x17a16: 0xe0000edc, 0x17a17: 0xe0000ed9, + 0x17a18: 0xe0000ed0, 0x17a19: 0xe0000ecd, 0x17a1a: 0xe000b1c4, 0x17a1b: 0xe000b1c1, + 0x17a1c: 0xe0000f2d, 0x17a1d: 0xe0000f2a, 0x17a1e: 0xe0000f47, 0x17a1f: 0xe0000f44, + 0x17a20: 0xe0000f33, 0x17a21: 0xe0000f30, 0x17a22: 0xe0000f99, 0x17a23: 0xe0000f96, + 0x17a24: 0xe0000f8a, 0x17a25: 0xe0000f87, 0x17a26: 0x00303688, 0x17a27: 0x40303620, + 0x17a28: 0xe000b1ec, 0x17a29: 0xe000b1e9, 0x17a2a: 0xe000103f, 0x17a2b: 0xe000103c, + 0x17a2c: 0xe0000fe7, 0x17a2d: 0xe0000fe4, 0x17a2e: 0xe0000ff9, 0x17a2f: 0xe0000ff6, + 0x17a30: 0xe0001025, 0x17a31: 0xe0001022, 0x17a32: 0xe0001039, 0x17a33: 0xe0001036, + 0x17a34: 0xe00010d8, 0x17a35: 0xe00010d5, 0x17a36: 0xe000110e, 0x17a37: 0xe000110b, + 0x17a38: 0xe0001117, 0x17a39: 0xe000b256, 0x17a3a: 0xe000b253, 0x17a3b: 0xe000114d, + 0x17a3c: 0xe000114a, 0x17a3d: 0xe0001147, 0x17a3e: 0xe0001144, 0x17a3f: 0xe0000f64, + // Block 0x5e9, offset 0x17a40 + 0x17a40: 0x402c1a20, 0x17a41: 0x002c2a88, 0x17a42: 0x002c3288, 0x17a43: 0x402c3220, + 0x17a44: 0x0031c488, 0x17a45: 0x4031c420, 0x17a46: 0x002efa88, 0x17a47: 0x002c4e88, + 0x17a48: 0x402c4e20, 0x17a49: 0x002c7288, 0x17a4a: 0x002c7a88, 0x17a4b: 0x002c8488, + 0x17a4c: 0x402c8420, 0x17a4d: 0xe000115c, 0x17a4e: 0x002cae88, 0x17a4f: 0x002cb888, + 0x17a50: 0x002cc288, 0x17a51: 0x002d1688, 0x17a52: 0x402d1620, 0x17a53: 0x002d4488, + 0x17a54: 0x002d5888, 0x17a55: 0x402d7820, 0x17a56: 0x002dc288, 0x17a57: 0x002db688, + 0x17a58: 0x002e0a88, 0x17a59: 0x402e0a20, 0x17a5a: 0x402e3820, 0x17a5b: 0x402e7220, + 0x17a5c: 0x0030a088, 0x17a5d: 0x002eb488, 0x17a5e: 0x402ebc20, 0x17a5f: 0x002f1088, + 0x17a60: 0x002ee683, 0x17a61: 0x402ee620, 0x17a62: 0x002d6088, 0x17a63: 0x402d6020, + 0x17a64: 0x002f3e88, 0x17a65: 0x402f3e20, 0x17a66: 0x002f8288, 0x17a67: 0x0031b488, + 0x17a68: 0x4031b420, 0x17a69: 0x00300888, 0x17a6a: 0x40301220, 0x17a6b: 0x40304220, + 0x17a6c: 0x00304a88, 0x17a6d: 0x40304a20, 0x17a6e: 0x00305288, 0x17a6f: 0x00306e83, + 0x17a70: 0x40306e20, 0x17a71: 0x0030b488, 0x17a72: 0x0030cc88, 0x17a73: 0x00311888, + 0x17a74: 0x40311820, 0x17a75: 0x00313488, 0x17a76: 0x40313420, 0x17a77: 0x00316488, + 0x17a78: 0x00316e88, 0x17a79: 0x40316e20, 0x17a7a: 0x40317820, 0x17a7b: 0x4031a620, + 0x17a7c: 0x0031bc88, 0x17a7d: 0x4031bc20, 0x17a7e: 0xe0000fc9, 0x17a7f: 0x40319420, + // Block 0x5ea, offset 0x17a80 + 0x17a80: 0x40321220, 0x17a81: 0x40321a20, 0x17a82: 0x40322220, 0x17a83: 0x40322a20, + 0x17a84: 0xe0000ad5, 0x17a85: 0xe0000ad1, 0x17a86: 0xe0000acd, 0x17a87: 0xf0000a0a, + 0x17a88: 0xf000040a, 0x17a89: 0xf0000404, 0x17a8a: 0xf0000a0a, 0x17a8b: 0xf000040a, + 0x17a8c: 0xf0000404, 0x17a8d: 0xe0000947, 0x17a8e: 0xe0000944, 0x17a8f: 0xe0000c3d, + 0x17a90: 0xe0000c3a, 0x17a91: 0xe0000dcc, 0x17a92: 0xe0000dc9, 0x17a93: 0xe0000ff3, + 0x17a94: 0xe0000ff0, 0x17a95: 0xe000101e, 0x17a96: 0xe000101a, 0x17a97: 0xe000b207, + 0x17a98: 0xe000b203, 0x17a99: 0xe0001016, 0x17a9a: 0xe0001012, 0x17a9b: 0xe000100e, + 0x17a9c: 0xe000100a, 0x17a9d: 0x402cae20, 0x17a9e: 0xe0000962, 0x17a9f: 0xe000095e, + 0x17aa0: 0xe0000976, 0x17aa1: 0xe0000972, 0x17aa2: 0xe00009f4, 0x17aa3: 0xe00009ef, + 0x17aa4: 0x002d3a88, 0x17aa5: 0x402d3a20, 0x17aa6: 0xe0000bbe, 0x17aa7: 0xe0000bbb, + 0x17aa8: 0xe0000c99, 0x17aa9: 0xe0000c96, 0x17aaa: 0xe0000e20, 0x17aab: 0xe0000e1d, + 0x17aac: 0xe0000e27, 0x17aad: 0xe0000e23, 0x17aae: 0xe0001162, 0x17aaf: 0xe000115f, + 0x17ab0: 0xe0000c8d, 0x17ab1: 0xf0000a0a, 0x17ab2: 0xf000040a, 0x17ab3: 0xf0000404, + 0x17ab4: 0xe000b0ca, 0x17ab5: 0xe000b0c7, 0x17ab6: 0x002d7888, 0x17ab7: 0x00319488, + 0x17ab8: 0xe0000d57, 0x17ab9: 0xe0000d54, 0x17aba: 0xe000b037, 0x17abb: 0xe000b033, + 0x17abc: 0xe000b040, 0x17abd: 0xe000b03b, 0x17abe: 0xe000b165, 0x17abf: 0xe000b161, + // Block 0x5eb, offset 0x17ac0 + 0x17ac0: 0xe000098f, 0x17ac1: 0xe000098c, 0x17ac2: 0xe0000995, 0x17ac3: 0xe0000992, + 0x17ac4: 0xe0000b62, 0x17ac5: 0xe0000b5f, 0x17ac6: 0xe0000b68, 0x17ac7: 0xe0000b65, + 0x17ac8: 0xe0000c6c, 0x17ac9: 0xe0000c69, 0x17aca: 0xe0000c72, 0x17acb: 0xe0000c6f, + 0x17acc: 0xe0000e4a, 0x17acd: 0xe0000e47, 0x17ace: 0xe0000e50, 0x17acf: 0xe0000e4d, + 0x17ad0: 0xe0000ee8, 0x17ad1: 0xe0000ee5, 0x17ad2: 0xe0000eee, 0x17ad3: 0xe0000eeb, + 0x17ad4: 0xe0001053, 0x17ad5: 0xe0001050, 0x17ad6: 0xe0001059, 0x17ad7: 0xe0001056, + 0x17ad8: 0xe0000f61, 0x17ad9: 0xe0000f5e, 0x17ada: 0xe0000fa5, 0x17adb: 0xe0000fa2, + 0x17adc: 0x00312288, 0x17add: 0x40312220, 0x17ade: 0xe0000bf4, 0x17adf: 0xe0000bf1, + 0x17ae0: 0x002ebc88, 0x17ae1: 0x402c8c20, 0x17ae2: 0x002f2288, 0x17ae3: 0x402f2220, + 0x17ae4: 0x00314088, 0x17ae5: 0x40314020, 0x17ae6: 0xe000096f, 0x17ae7: 0xe000096c, + 0x17ae8: 0xe0000b32, 0x17ae9: 0xe0000b2f, 0x17aea: 0xe0000dd9, 0x17aeb: 0xe0000dd5, + 0x17aec: 0xe000b151, 0x17aed: 0xe000b14d, 0x17aee: 0xe0000e04, 0x17aef: 0xe0000e01, + 0x17af0: 0xe0000e0b, 0x17af1: 0xe0000e07, 0x17af2: 0xe0001129, 0x17af3: 0xe0001126, + 0x17af4: 0x402e5e20, 0x17af5: 0x402ed020, 0x17af6: 0x40305a20, 0x17af7: 0x402dd420, + 0x17af8: 0xe0000abf, 0x17af9: 0xe0000ec4, 0x17afa: 0x002be888, 0x17afb: 0x002c4488, + 0x17afc: 0x402c4420, 0x17afd: 0x002e3888, 0x17afe: 0x00303e88, 0x17aff: 0x402ffc20, + // Block 0x5ec, offset 0x17b00 + 0x17b00: 0xae603502, 0x17b01: 0xae603802, 0x17b02: 0xae603c02, 0x17b03: 0xae603702, + 0x17b04: 0xae605b02, 0x17b05: 0xae606302, 0x17b06: 0xae603702, 0x17b07: 0xae605202, + 0x17b08: 0xae604702, 0x17b09: 0xae603602, 0x17b0a: 0xae604302, 0x17b0b: 0xae604d02, + 0x17b0c: 0xae604102, 0x17b0d: 0xae605f02, 0x17b0e: 0xae605f02, 0x17b0f: 0xae606502, + 0x17b10: 0xae606602, 0x17b11: 0xae606702, 0x17b12: 0xae605f02, 0x17b13: 0xae602202, + 0x17b14: 0xae602a02, 0x17b15: 0xae805f02, 0x17b16: 0xadc06002, 0x17b17: 0xadc06002, + 0x17b18: 0xadc06002, 0x17b19: 0xadc06002, 0x17b1a: 0xae805f02, 0x17b1b: 0xad806802, + 0x17b1c: 0xadc06002, 0x17b1d: 0xadc06002, 0x17b1e: 0xadc06002, 0x17b1f: 0xadc06002, + 0x17b20: 0xadc06002, 0x17b21: 0xaca06e02, 0x17b22: 0xaca06f02, 0x17b23: 0xae603902, + 0x17b24: 0xadc07502, 0x17b25: 0xadc07602, 0x17b26: 0xadc07702, 0x17b27: 0xaca05602, + 0x17b28: 0xaca05902, 0x17b29: 0xadc06002, 0x17b2a: 0xadc06002, 0x17b2b: 0xadc06002, + 0x17b2c: 0xadc06002, 0x17b2d: 0xadc07802, 0x17b2e: 0xadc07902, 0x17b2f: 0xadc06002, + 0x17b30: 0xadc07a02, 0x17b31: 0xadc07b02, 0x17b32: 0xadc02102, 0x17b33: 0xadc06002, + 0x17b34: 0xa0107c02, 0x17b35: 0xa0107d02, 0x17b36: 0xa0106102, 0x17b37: 0xa0106102, + 0x17b38: 0xa0105402, 0x17b39: 0xadc07e02, 0x17b3a: 0xadc06002, 0x17b3b: 0xadc06002, + 0x17b3c: 0xadc06002, 0x17b3d: 0xae605f02, 0x17b3e: 0xae605f02, 0x17b3f: 0xae605f02, + // Block 0x5ed, offset 0x17b40 + 0x17b40: 0xae603502, 0x17b41: 0xae603802, 0x17b42: 0xae604502, 0x17b43: 0xae602202, + 0x17b44: 0xe000b00f, 0x17b45: 0xaf007f02, 0x17b46: 0xae605f02, 0x17b47: 0xadc06002, + 0x17b48: 0xadc06002, 0x17b49: 0xadc06002, 0x17b4a: 0xae605f02, 0x17b4b: 0xae605f02, + 0x17b4c: 0xae605f02, 0x17b4d: 0xadc06002, 0x17b4e: 0xadc06002, 0x17b4f: 0xa0000000, + 0x17b50: 0xae605f02, 0x17b51: 0xae605f02, 0x17b52: 0xae605f02, 0x17b53: 0xadc06002, + 0x17b54: 0xadc06002, 0x17b55: 0xadc06002, 0x17b56: 0xadc06002, 0x17b57: 0xae605f02, + 0x17b58: 0xae808002, 0x17b59: 0xadc06002, 0x17b5a: 0xadc06002, 0x17b5b: 0xae605f02, + 0x17b5c: 0xae906002, 0x17b5d: 0xaea05f02, 0x17b5e: 0xaea05f02, 0x17b5f: 0xae906002, + 0x17b60: 0xaea08102, 0x17b61: 0xaea08202, 0x17b62: 0xae906002, 0x17b63: 0x84e615ef, + 0x17b64: 0x84e6164c, 0x17b65: 0x84e616cd, 0x17b66: 0x84e61771, 0x17b67: 0x84e61836, + 0x17b68: 0x84e6161d, 0x17b69: 0x84e61631, 0x17b6a: 0x84e616b4, 0x17b6b: 0x84e61741, + 0x17b6c: 0x84e617bd, 0x17b6d: 0x84e61816, 0x17b6e: 0x84e6185f, 0x17b6f: 0x84e6187b, + 0x17b70: 0x00326688, 0x17b71: 0x40326620, 0x17b72: 0x0032a688, 0x17b73: 0x4032a620, + 0x17b74: 0x40064020, 0x17b75: 0x40064220, 0x17b76: 0x00326088, 0x17b77: 0x40326020, + 0x17b7a: 0x00326c84, 0x17b7b: 0x40329220, + 0x17b7c: 0x40329020, 0x17b7d: 0x40329420, 0x17b7e: 0x40026220, + // Block 0x5ee, offset 0x17b80 + 0x17b84: 0x40062020, 0x17b85: 0xe000b012, 0x17b86: 0xe000b286, 0x17b87: 0x40030620, + 0x17b88: 0xe000b2a0, 0x17b89: 0xe000b2ca, 0x17b8a: 0xe000b2e4, + 0x17b8c: 0xe000b2fe, 0x17b8e: 0xe000b310, 0x17b8f: 0xe000b33e, + 0x17b90: 0xe000b2e7, 0x17b91: 0x00325288, 0x17b92: 0x00325488, 0x17b93: 0x00325688, + 0x17b94: 0x00325a88, 0x17b95: 0x00325c88, 0x17b96: 0x00326488, 0x17b97: 0x00326888, + 0x17b98: 0x00326a88, 0x17b99: 0x00326c88, 0x17b9a: 0x00327088, 0x17b9b: 0x00327288, + 0x17b9c: 0x00327688, 0x17b9d: 0x00327888, 0x17b9e: 0x00327a88, 0x17b9f: 0x00327c88, + 0x17ba0: 0x00327e88, 0x17ba1: 0x00328888, 0x17ba3: 0x00328e88, + 0x17ba4: 0x00329688, 0x17ba5: 0x00329888, 0x17ba6: 0x00329a88, 0x17ba7: 0x00329c88, + 0x17ba8: 0x00329e88, 0x17ba9: 0x0032a288, 0x17baa: 0xe000134f, 0x17bab: 0xe00013f2, + 0x17bac: 0xe000b283, 0x17bad: 0xe000b29d, 0x17bae: 0xe000b2c7, 0x17baf: 0xe000b2e1, + 0x17bb0: 0xe000b313, 0x17bb1: 0x40325220, 0x17bb2: 0x40325420, 0x17bb3: 0x40325620, + 0x17bb4: 0x40325a20, 0x17bb5: 0x40325c20, 0x17bb6: 0x40326420, 0x17bb7: 0x40326820, + 0x17bb8: 0x40326a20, 0x17bb9: 0x40326c20, 0x17bba: 0x40327020, 0x17bbb: 0x40327220, + 0x17bbc: 0x40327620, 0x17bbd: 0x40327820, 0x17bbe: 0x40327a20, 0x17bbf: 0x40327c20, + // Block 0x5ef, offset 0x17bc0 + 0x17bc0: 0x40327e20, 0x17bc1: 0x40328820, 0x17bc2: 0x00328e99, 0x17bc3: 0x40328e20, + 0x17bc4: 0x40329620, 0x17bc5: 0x40329820, 0x17bc6: 0x40329a20, 0x17bc7: 0x40329c20, + 0x17bc8: 0x40329e20, 0x17bc9: 0x4032a220, 0x17bca: 0xe000134c, 0x17bcb: 0xe00013ef, + 0x17bcc: 0xe000b2fb, 0x17bcd: 0xe000b30d, 0x17bce: 0xe000b33b, 0x17bcf: 0xe0001368, + 0x17bd0: 0x00325484, 0x17bd1: 0x00326a84, 0x17bd2: 0x0032988a, 0x17bd3: 0xf000020a, + 0x17bd4: 0xf000020a, 0x17bd5: 0x00329a84, 0x17bd6: 0x00327e84, 0x17bd7: 0xe0001364, + 0x17bd8: 0x00328688, 0x17bd9: 0x40328620, 0x17bda: 0x00326288, 0x17bdb: 0x40326220, + 0x17bdc: 0x00325e88, 0x17bdd: 0x40325e20, 0x17bde: 0x00328488, 0x17bdf: 0x40328420, + 0x17be0: 0x0032a488, 0x17be1: 0x4032a420, 0x17be2: 0x0032e888, 0x17be3: 0x4032e820, + 0x17be4: 0x0032f288, 0x17be5: 0x4032f220, 0x17be6: 0x0032f488, 0x17be7: 0x4032f420, + 0x17be8: 0x0032fa88, 0x17be9: 0x4032fa20, 0x17bea: 0x00330888, 0x17beb: 0x40330820, + 0x17bec: 0x00330e88, 0x17bed: 0x40330e20, 0x17bee: 0x00331688, 0x17bef: 0x40331620, + 0x17bf0: 0x00327084, 0x17bf1: 0x00328884, 0x17bf2: 0x00328e84, 0x17bf3: 0x40326e20, + 0x17bf4: 0x00326a8a, 0x17bf5: 0x00325c84, 0x17bf6: 0x40092e20, 0x17bf7: 0x0032a888, + 0x17bf8: 0x4032a820, 0x17bf9: 0x00328e8a, 0x17bfa: 0x00328288, 0x17bfb: 0x40328220, + 0x17bfc: 0x40328c20, 0x17bfd: 0x00329288, 0x17bfe: 0x00329088, 0x17bff: 0x00329488, + // Block 0x5f0, offset 0x17c00 + 0x17c00: 0xe00009b1, 0x17c01: 0xe00009ae, 0x17c02: 0xe0000a22, 0x17c03: 0xe0000a1f, + 0x17c04: 0xe000b078, 0x17c05: 0xe000b075, 0x17c06: 0xe0000a2e, 0x17c07: 0xe0000a2b, + 0x17c08: 0xe000b085, 0x17c09: 0xe000b081, 0x17c0a: 0xe0000a8c, 0x17c0b: 0xe0000a89, + 0x17c0c: 0xe000b08c, 0x17c0d: 0xe000b089, 0x17c0e: 0xe0000aa4, 0x17c0f: 0xe0000aa1, + 0x17c10: 0xe0000a92, 0x17c11: 0xe0000a8f, 0x17c12: 0xe0000a9e, 0x17c13: 0xe0000a9b, + 0x17c14: 0xe0000b55, 0x17c15: 0xe0000b51, 0x17c16: 0xe000b0ab, 0x17c17: 0xe000b0a7, + 0x17c18: 0xe0000b7c, 0x17c19: 0xe0000b79, 0x17c1a: 0xe0000b82, 0x17c1b: 0xe0000b7f, + 0x17c1c: 0xe0000b39, 0x17c1d: 0xe0000b35, 0x17c1e: 0xe0000b8c, 0x17c1f: 0xe0000b89, + 0x17c20: 0xe0000bd0, 0x17c21: 0xe0000bcd, 0x17c22: 0xe0000c00, 0x17c23: 0xe0000bfd, + 0x17c24: 0xe000b0d0, 0x17c25: 0xe000b0cd, 0x17c26: 0xe0000bfa, 0x17c27: 0xe0000bf7, + 0x17c28: 0xe0000c06, 0x17c29: 0xe0000c03, 0x17c2a: 0xe0000c12, 0x17c2b: 0xe0000c0f, + 0x17c2c: 0xe0000c7e, 0x17c2d: 0xe0000c7b, 0x17c2e: 0xe000b0ef, 0x17c2f: 0xe000b0eb, + 0x17c30: 0xe000b0f6, 0x17c31: 0xe000b0f3, 0x17c32: 0xe000b0fc, 0x17c33: 0xe000b0f9, + 0x17c34: 0xe0000cb1, 0x17c35: 0xe0000cae, 0x17c36: 0xe000b108, 0x17c37: 0xe000b105, + 0x17c38: 0xe000b10f, 0x17c39: 0xe000b10b, 0x17c3a: 0xe0000cf2, 0x17c3b: 0xe0000cef, + 0x17c3c: 0xe0000cec, 0x17c3d: 0xe0000ce9, 0x17c3e: 0xe000b116, 0x17c3f: 0xe000b113, + // Block 0x5f1, offset 0x17c40 + 0x17c40: 0xe0000d24, 0x17c41: 0xe0000d21, 0x17c42: 0xe000b11c, 0x17c43: 0xe000b119, + 0x17c44: 0xe0000d69, 0x17c45: 0xe0000d66, 0x17c46: 0xe000b12e, 0x17c47: 0xe000b12b, + 0x17c48: 0xe0000d87, 0x17c49: 0xe0000d84, 0x17c4a: 0xe0000d81, 0x17c4b: 0xe0000d7e, + 0x17c4c: 0xe000b141, 0x17c4d: 0xe000b13d, 0x17c4e: 0xe000b149, 0x17c4f: 0xe000b145, + 0x17c50: 0xe0000e3d, 0x17c51: 0xe0000e39, 0x17c52: 0xe000b16d, 0x17c53: 0xe000b169, + 0x17c54: 0xe000b1aa, 0x17c55: 0xe000b1a7, 0x17c56: 0xe0000ead, 0x17c57: 0xe0000eaa, + 0x17c58: 0xe0000ed6, 0x17c59: 0xe0000ed3, 0x17c5a: 0xe000b1b6, 0x17c5b: 0xe000b1b3, + 0x17c5c: 0xe000b1bd, 0x17c5d: 0xe000b1b9, 0x17c5e: 0xe0000f02, 0x17c5f: 0xe0000eff, + 0x17c60: 0xe0000f41, 0x17c61: 0xe0000f3e, 0x17c62: 0xe000b1d2, 0x17c63: 0xe000b1cf, + 0x17c64: 0xe000b1cb, 0x17c65: 0xe000b1c7, 0x17c66: 0xe0000f3a, 0x17c67: 0xe0000f36, + 0x17c68: 0xe000b1d9, 0x17c69: 0xe000b1d5, 0x17c6a: 0xe0000f93, 0x17c6b: 0xe0000f90, + 0x17c6c: 0xe000b1e0, 0x17c6d: 0xe000b1dd, 0x17c6e: 0xe0000fb1, 0x17c6f: 0xe0000fae, + 0x17c70: 0xe0000fab, 0x17c71: 0xe0000fa8, 0x17c72: 0xe0001093, 0x17c73: 0xe0001090, + 0x17c74: 0xe000109f, 0x17c75: 0xe000109c, 0x17c76: 0xe0001099, 0x17c77: 0xe0001096, + 0x17c78: 0xe000b1f3, 0x17c79: 0xe000b1ef, 0x17c7a: 0xe0001046, 0x17c7b: 0xe0001042, + 0x17c7c: 0xe000b226, 0x17c7d: 0xe000b223, 0x17c7e: 0xe000b22c, 0x17c7f: 0xe000b229, + // Block 0x5f2, offset 0x17c80 + 0x17c80: 0xe00010d2, 0x17c81: 0xe00010cf, 0x17c82: 0xe000b232, 0x17c83: 0xe000b22f, + 0x17c84: 0xe00010e1, 0x17c85: 0xe00010de, 0x17c86: 0xe00010e7, 0x17c87: 0xe00010e4, + 0x17c88: 0xe000b238, 0x17c89: 0xe000b235, 0x17c8a: 0xe00010fc, 0x17c8b: 0xe00010f9, + 0x17c8c: 0xe00010f6, 0x17c8d: 0xe00010f3, 0x17c8e: 0xe0001123, 0x17c8f: 0xe0001120, + 0x17c90: 0xe0001141, 0x17c91: 0xe000113e, 0x17c92: 0xe000b25c, 0x17c93: 0xe000b259, + 0x17c94: 0xe0001159, 0x17c95: 0xe0001156, 0x17c96: 0xe0000c15, 0x17c97: 0xe0000f8d, + 0x17c98: 0xe00010db, 0x17c99: 0xe0001111, 0x17c9a: 0xf0000404, 0x17c9b: 0xe0000f70, + 0x17c9c: 0x40300420, 0x17c9d: 0x40300620, 0x17c9e: 0xe0000f7f, 0x17c9f: 0x402c9620, + 0x17ca0: 0xe000b030, 0x17ca1: 0xe000b02d, 0x17ca2: 0xe000b01e, 0x17ca3: 0xe000b01b, + 0x17ca4: 0xe000b06c, 0x17ca5: 0xe000b069, 0x17ca6: 0xe00038cc, 0x17ca7: 0xe00038c9, + 0x17ca8: 0xe000b060, 0x17ca9: 0xe000b05d, 0x17caa: 0xe000b066, 0x17cab: 0xe000b063, + 0x17cac: 0xe000b072, 0x17cad: 0xe000b06f, 0x17cae: 0xe000b054, 0x17caf: 0xe000b051, + 0x17cb0: 0xe0003826, 0x17cb1: 0xe0003823, 0x17cb2: 0xe000b048, 0x17cb3: 0xe000b045, + 0x17cb4: 0xe000b04e, 0x17cb5: 0xe000b04b, 0x17cb6: 0xe000b05a, 0x17cb7: 0xe000b057, + 0x17cb8: 0xe000b0a4, 0x17cb9: 0xe000b0a1, 0x17cba: 0xe000b092, 0x17cbb: 0xe000b08f, + 0x17cbc: 0xe000b098, 0x17cbd: 0xe000b095, 0x17cbe: 0xe000b0be, 0x17cbf: 0xe000b0bb, + // Block 0x5f3, offset 0x17cc0 + 0x17cc0: 0xe000acd9, 0x17cc1: 0xe000acd6, 0x17cc2: 0xe000b0b2, 0x17cc3: 0xe000b0af, + 0x17cc4: 0xe000b0b8, 0x17cc5: 0xe000b0b5, 0x17cc6: 0xe000b0c4, 0x17cc7: 0xe000b0c1, + 0x17cc8: 0xe000b0d6, 0x17cc9: 0xe000b0d3, 0x17cca: 0xe000b0e8, 0x17ccb: 0xe000b0e5, + 0x17ccc: 0xe000b15e, 0x17ccd: 0xe000b15b, 0x17cce: 0xe000b134, 0x17ccf: 0xe000b131, + 0x17cd0: 0xe000b180, 0x17cd1: 0xe000b17d, 0x17cd2: 0xe000acf7, 0x17cd3: 0xe000acf4, + 0x17cd4: 0xe000b174, 0x17cd5: 0xe000b171, 0x17cd6: 0xe000b17a, 0x17cd7: 0xe000b177, + 0x17cd8: 0xe000b186, 0x17cd9: 0xe000b183, 0x17cda: 0xe000b19e, 0x17cdb: 0xe000b19b, + 0x17cdc: 0xe000b18c, 0x17cdd: 0xe000b189, 0x17cde: 0xe000b192, 0x17cdf: 0xe000b18f, + 0x17ce0: 0xe000b198, 0x17ce1: 0xe000b195, 0x17ce2: 0xe000b1a4, 0x17ce3: 0xe000b1a1, + 0x17ce4: 0xe000b200, 0x17ce5: 0xe000b1fd, 0x17ce6: 0xe000b1e6, 0x17ce7: 0xe000b1e3, + 0x17ce8: 0xe000b21a, 0x17ce9: 0xe000b217, 0x17cea: 0xe0002958, 0x17ceb: 0xe0002955, + 0x17cec: 0xe000b20e, 0x17ced: 0xe000b20b, 0x17cee: 0xe000b214, 0x17cef: 0xe000b211, + 0x17cf0: 0xe000b220, 0x17cf1: 0xe000b21d, 0x17cf2: 0xe0001108, 0x17cf3: 0xe0001105, + 0x17cf4: 0xe000b250, 0x17cf5: 0xe000b24d, 0x17cf6: 0xe000b23e, 0x17cf7: 0xe000b23b, + 0x17cf8: 0xe000b244, 0x17cf9: 0xe000b241, 0x17cfa: 0xe0000d0a, 0x17cfb: 0xe0000d07, + 0x17cfc: 0x0030d888, 0x17cfd: 0x4030d820, 0x17cfe: 0x00312088, 0x17cff: 0x40312020, + // Block 0x5f4, offset 0x17d00 + 0x17d00: 0xe0001165, 0x17d01: 0xe00011a9, 0x17d02: 0xe000117d, 0x17d03: 0xe00011c1, + 0x17d04: 0xe000b25f, 0x17d05: 0xe000b271, 0x17d06: 0xe000118f, 0x17d07: 0xe00011d3, + 0x17d08: 0xe0001168, 0x17d09: 0xe00011ac, 0x17d0a: 0xe0001181, 0x17d0b: 0xe00011c5, + 0x17d0c: 0xe000b263, 0x17d0d: 0xe000b275, 0x17d0e: 0xe0001193, 0x17d0f: 0xe00011d7, + 0x17d10: 0xe000121a, 0x17d11: 0xe0001230, 0x17d12: 0xe0001228, 0x17d13: 0xe000123e, + 0x17d14: 0xe000b28d, 0x17d15: 0xe000b295, + 0x17d18: 0xe000121d, 0x17d19: 0xe0001233, 0x17d1a: 0xe000122c, 0x17d1b: 0xe0001242, + 0x17d1c: 0xe000b291, 0x17d1d: 0xe000b299, + 0x17d20: 0xe0001252, 0x17d21: 0xe0001296, 0x17d22: 0xe000126a, 0x17d23: 0xe00012ae, + 0x17d24: 0xe000b2a3, 0x17d25: 0xe000b2b5, 0x17d26: 0xe000127c, 0x17d27: 0xe00012c0, + 0x17d28: 0xe0001255, 0x17d29: 0xe0001299, 0x17d2a: 0xe000126e, 0x17d2b: 0xe00012b2, + 0x17d2c: 0xe000b2a7, 0x17d2d: 0xe000b2b9, 0x17d2e: 0xe0001280, 0x17d2f: 0xe00012c4, + 0x17d30: 0xe00012fb, 0x17d31: 0xe0001319, 0x17d32: 0xe0001309, 0x17d33: 0xe0001327, + 0x17d34: 0xe000b2d1, 0x17d35: 0xe000b2d9, 0x17d36: 0xe0001311, 0x17d37: 0xe000132f, + 0x17d38: 0xe00012fe, 0x17d39: 0xe000131c, 0x17d3a: 0xe000130d, 0x17d3b: 0xe000132b, + 0x17d3c: 0xe000b2d5, 0x17d3d: 0xe000b2dd, 0x17d3e: 0xe0001315, 0x17d3f: 0xe0001333, + // Block 0x5f5, offset 0x17d40 + 0x17d40: 0xe000136c, 0x17d41: 0xe0001382, 0x17d42: 0xe000137a, 0x17d43: 0xe0001390, + 0x17d44: 0xe000b2eb, 0x17d45: 0xe000b2f3, + 0x17d48: 0xe000136f, 0x17d49: 0xe0001385, 0x17d4a: 0xe000137e, 0x17d4b: 0xe0001394, + 0x17d4c: 0xe000b2ef, 0x17d4d: 0xe000b2f7, + 0x17d50: 0xe00013ad, 0x17d51: 0xe00013bc, 0x17d52: 0xe00013b4, 0x17d53: 0xe00013ca, + 0x17d54: 0xe000b301, 0x17d55: 0xe000b305, 0x17d56: 0xe00013b8, 0x17d57: 0xe00013d2, + 0x17d59: 0xe00013bf, 0x17d5b: 0xe00013ce, + 0x17d5d: 0xe000b309, 0x17d5f: 0xe00013d6, + 0x17d60: 0xe0001407, 0x17d61: 0xe000144b, 0x17d62: 0xe000141f, 0x17d63: 0xe0001463, + 0x17d64: 0xe000b317, 0x17d65: 0xe000b329, 0x17d66: 0xe0001431, 0x17d67: 0xe0001475, + 0x17d68: 0xe000140a, 0x17d69: 0xe000144e, 0x17d6a: 0xe0001423, 0x17d6b: 0xe0001467, + 0x17d6c: 0xe000b31b, 0x17d6d: 0xe000b32d, 0x17d6e: 0xe0001435, 0x17d6f: 0xe0001479, + 0x17d70: 0xe00011f7, 0x17d71: 0xe000b283, 0x17d72: 0xe000124c, 0x17d73: 0xe000b29d, + 0x17d74: 0xe00012e4, 0x17d75: 0xe000b2c7, 0x17d76: 0xe000133d, 0x17d77: 0xe000b2e1, + 0x17d78: 0xe000139e, 0x17d79: 0xe000b2fb, 0x17d7a: 0xe00013e0, 0x17d7b: 0xe000b30d, + 0x17d7c: 0xe0001499, 0x17d7d: 0xe000b33b, + // Block 0x5f6, offset 0x17d80 + 0x17d80: 0xe00011a1, 0x17d81: 0xe00011e5, 0x17d82: 0xe0001185, 0x17d83: 0xe00011c9, + 0x17d84: 0xe000b267, 0x17d85: 0xe000b279, 0x17d86: 0xe0001197, 0x17d87: 0xe00011db, + 0x17d88: 0xe00011a5, 0x17d89: 0xe00011e9, 0x17d8a: 0xe000118a, 0x17d8b: 0xe00011ce, + 0x17d8c: 0xe000b26c, 0x17d8d: 0xe000b27e, 0x17d8e: 0xe000119c, 0x17d8f: 0xe00011e0, + 0x17d90: 0xe000128e, 0x17d91: 0xe00012d2, 0x17d92: 0xe0001272, 0x17d93: 0xe00012b6, + 0x17d94: 0xe000b2ab, 0x17d95: 0xe000b2bd, 0x17d96: 0xe0001284, 0x17d97: 0xe00012c8, + 0x17d98: 0xe0001292, 0x17d99: 0xe00012d6, 0x17d9a: 0xe0001277, 0x17d9b: 0xe00012bb, + 0x17d9c: 0xe000b2b0, 0x17d9d: 0xe000b2c2, 0x17d9e: 0xe0001289, 0x17d9f: 0xe00012cd, + 0x17da0: 0xe0001443, 0x17da1: 0xe0001487, 0x17da2: 0xe0001427, 0x17da3: 0xe000146b, + 0x17da4: 0xe000b31f, 0x17da5: 0xe000b331, 0x17da6: 0xe0001439, 0x17da7: 0xe000147d, + 0x17da8: 0xe0001447, 0x17da9: 0xe000148b, 0x17daa: 0xe000142c, 0x17dab: 0xe0001470, + 0x17dac: 0xe000b324, 0x17dad: 0xe000b336, 0x17dae: 0xe000143e, 0x17daf: 0xe0001482, + 0x17db0: 0xe0001201, 0x17db1: 0xe000120e, 0x17db2: 0xe00011fd, 0x17db3: 0xe0001214, + 0x17db4: 0xe000b289, 0x17db6: 0xe0001207, 0x17db7: 0xe000120a, + 0x17db8: 0xe0001204, 0x17db9: 0xe0001211, 0x17dba: 0xe00011fa, 0x17dbb: 0xe000b286, + 0x17dbc: 0xe0001217, 0x17dbd: 0x40063620, 0x17dbe: 0x40326c20, 0x17dbf: 0x40063620, + // Block 0x5f7, offset 0x17dc0 + 0x17dc0: 0x40063a20, 0x17dc1: 0xe00000b1, 0x17dc2: 0xe00012ea, 0x17dc3: 0xe00012f5, + 0x17dc4: 0xe000b2cd, 0x17dc6: 0xe00012ee, 0x17dc7: 0xe00012f1, + 0x17dc8: 0xe000124f, 0x17dc9: 0xe000b2a0, 0x17dca: 0xe00012e7, 0x17dcb: 0xe000b2ca, + 0x17dcc: 0xe00012f8, 0x17dcd: 0xe00000b7, 0x17dce: 0xe000b015, 0x17dcf: 0xe00000ba, + 0x17dd0: 0xe0001343, 0x17dd1: 0xe000135e, 0x17dd2: 0xe0001356, 0x17dd3: 0xe000b2e7, + 0x17dd6: 0xe0001349, 0x17dd7: 0xe000135a, + 0x17dd8: 0xe0001346, 0x17dd9: 0xe0001361, 0x17dda: 0xe0001340, 0x17ddb: 0xe000b2e4, + 0x17ddd: 0xe00000c0, 0x17dde: 0xe000b018, 0x17ddf: 0xe00000c3, + 0x17de0: 0xe00013e6, 0x17de1: 0xe0001401, 0x17de2: 0xe00013f9, 0x17de3: 0xe000b313, + 0x17de4: 0xe00013a4, 0x17de5: 0xe00013a7, 0x17de6: 0xe00013ec, 0x17de7: 0xe00013fd, + 0x17de8: 0xe00013e9, 0x17de9: 0xe0001404, 0x17dea: 0xe00013e3, 0x17deb: 0xe000b310, + 0x17dec: 0xe00013aa, 0x17ded: 0xe00000ae, 0x17dee: 0xe000b012, 0x17def: 0x40061e20, + 0x17df2: 0xe000149f, 0x17df3: 0xe00014aa, + 0x17df4: 0xe000b341, 0x17df6: 0xe00014a3, 0x17df7: 0xe00014a6, + 0x17df8: 0xe00013a1, 0x17df9: 0xe000b2fe, 0x17dfa: 0xe000149c, 0x17dfb: 0xe000b33e, + 0x17dfc: 0xe00014ad, 0x17dfd: 0x40062020, 0x17dfe: 0x40063820, + // Block 0x5f8, offset 0x17e00 + 0x17e00: 0xa0000000, 0x17e01: 0xa0000000, 0x17e02: 0xa0000000, 0x17e03: 0xa0000000, + 0x17e04: 0xa0000000, 0x17e05: 0xa0000000, 0x17e06: 0xa0000000, 0x17e07: 0xa0000000, + 0x17e08: 0xa0000000, 0x17e09: 0x40020020, 0x17e0a: 0x40020220, 0x17e0b: 0x40020420, + 0x17e0c: 0x40020620, 0x17e0d: 0x40020820, 0x17e0e: 0xa0000000, 0x17e0f: 0xa0000000, + 0x17e10: 0xa0000000, 0x17e11: 0xa0000000, 0x17e12: 0xa0000000, 0x17e13: 0xa0000000, + 0x17e14: 0xa0000000, 0x17e15: 0xa0000000, 0x17e16: 0xa0000000, 0x17e17: 0xa0000000, + 0x17e18: 0xa0000000, 0x17e19: 0xa0000000, 0x17e1a: 0xa0000000, 0x17e1b: 0xa0000000, + 0x17e1c: 0xa0000000, 0x17e1d: 0xa0000000, 0x17e1e: 0xa0000000, 0x17e1f: 0xa0000000, + 0x17e20: 0x40021220, 0x17e21: 0x4002ba20, 0x17e22: 0x4003e020, 0x17e23: 0x4004ea20, + 0x17e24: 0x4027de20, 0x17e25: 0x4004ec20, 0x17e26: 0x4004e620, 0x17e27: 0x4003d220, + 0x17e28: 0x4003f420, 0x17e29: 0x4003f620, 0x17e2a: 0x4004d820, 0x17e2b: 0x40093820, + 0x17e2c: 0x40024020, 0x17e2d: 0x40021a20, 0x17e2e: 0x4002e420, 0x17e2f: 0x4004e220, + 0x17e30: 0x4029cc20, 0x17e31: 0x4029ce20, 0x17e32: 0x4029d020, 0x17e33: 0x4029d220, + 0x17e34: 0x4029d420, 0x17e35: 0x4029d620, 0x17e36: 0x4029d820, 0x17e37: 0x4029da20, + 0x17e38: 0x4029dc20, 0x17e39: 0x4029de20, 0x17e3a: 0x40026c20, 0x17e3b: 0x40026220, + 0x17e3c: 0x40094020, 0x17e3d: 0x40094220, 0x17e3e: 0x40094420, 0x17e3f: 0x4002c420, + // Block 0x5f9, offset 0x17e40 + 0x17e40: 0x4004d620, 0x17e41: 0x002bde88, 0x17e42: 0x002c0a88, 0x17e43: 0x002c3a88, + 0x17e44: 0x002c6288, 0x17e45: 0x002c9888, 0x17e46: 0x002d0888, 0x17e47: 0x002d2288, + 0x17e48: 0x002d6888, 0x17e49: 0x002d9a88, 0x17e4a: 0x002dcc88, 0x17e4b: 0x002dfe88, + 0x17e4c: 0xc0030002, 0x17e4d: 0x002e8288, 0x17e4e: 0x002e9e88, 0x17e4f: 0x002ee288, + 0x17e50: 0x002f2c88, 0x17e51: 0x002f5688, 0x17e52: 0x002f7a88, 0x17e53: 0x002fe688, + 0x17e54: 0x00302c88, 0x17e55: 0x00306c88, 0x17e56: 0x0030be88, 0x17e57: 0x0030e288, + 0x17e58: 0x0030f688, 0x17e59: 0x00310088, 0x17e5a: 0x00312a88, 0x17e5b: 0x4003f820, + 0x17e5c: 0x4004e420, 0x17e5d: 0x4003fa20, 0x17e5e: 0x40062420, 0x17e5f: 0x40021620, + 0x17e60: 0x40061e20, 0x17e61: 0xcf409852, 0x17e62: 0x402c0a20, 0x17e63: 0xcf4509b1, + 0x17e64: 0x402c6220, 0x17e65: 0xcf4798d1, 0x17e66: 0x402d0820, 0x17e67: 0x402d2220, + 0x17e68: 0x402d6820, 0x17e69: 0xcf4998e1, 0x17e6a: 0x402dcc20, 0x17e6b: 0x402dfe20, + 0x17e6c: 0xc0000002, 0x17e6d: 0x402e8220, 0x17e6e: 0x402e9e20, 0x17e6f: 0xcf4b98f2, + 0x17e70: 0x402f2c20, 0x17e71: 0x402f5620, 0x17e72: 0x402f7a20, 0x17e73: 0xcf509971, + 0x17e74: 0x40302c20, 0x17e75: 0xcf529992, 0x17e76: 0x4030be20, 0x17e77: 0x4030e220, + 0x17e78: 0x4030f620, 0x17e79: 0x40310020, 0x17e7a: 0x40312a20, 0x17e7b: 0x4003fc20, + 0x17e7c: 0x40094820, 0x17e7d: 0x4003fe20, 0x17e7e: 0x40094c20, 0x17e7f: 0xa0000000, + // Block 0x5fa, offset 0x17e80 + 0x17e80: 0xe00008f5, 0x17e81: 0xe00008ef, 0x17e82: 0xe0000921, 0x17e83: 0xe0000969, + 0x17e84: 0xe000095b, 0x17e85: 0xe000094d, 0x17e86: 0xe00009dd, 0x17e87: 0xe0000a53, + 0x17e88: 0xe0000ae8, 0x17e89: 0xe0000ae2, 0x17e8a: 0xe0000af4, 0x17e8b: 0xe0000b20, + 0x17e8c: 0xe0000c2b, 0x17e8d: 0xe0000c25, 0x17e8e: 0xe0000c37, 0x17e8f: 0xe0000c43, + 0x17e90: 0xe0000ab3, 0x17e91: 0xe0000d63, 0x17e92: 0xe0000d9a, 0x17e93: 0xe0000d94, + 0x17e94: 0xe0000da6, 0x17e95: 0xe0000de6, 0x17e96: 0xe0000dd2, 0x17e97: 0x40093e20, + 0x17e98: 0xe0000e12, 0x17e99: 0xe0000fe1, 0x17e9a: 0xe0000fdb, 0x17e9b: 0xe0000fed, + 0x17e9c: 0xe0000fff, 0x17e9d: 0xe0001102, 0x17e9e: 0x00318888, 0x17e9f: 0xe0000f7b, + 0x17ea0: 0xe00008f2, 0x17ea1: 0xe00008ec, 0x17ea2: 0xe000091e, 0x17ea3: 0xe0000966, + 0x17ea4: 0xcf4398b1, 0x17ea5: 0xe000094a, 0x17ea6: 0xe00009d5, 0x17ea7: 0xe0000a4d, + 0x17ea8: 0xe0000ae5, 0x17ea9: 0xe0000adf, 0x17eaa: 0xe0000af1, 0x17eab: 0xe0000b1d, + 0x17eac: 0xe0000c28, 0x17ead: 0xe0000c22, 0x17eae: 0xe0000c34, 0x17eaf: 0xe0000c40, + 0x17eb0: 0xe0000aad, 0x17eb1: 0xe0000d60, 0x17eb2: 0xe0000d97, 0x17eb3: 0xe0000d91, + 0x17eb4: 0xe0000da3, 0x17eb5: 0xe0000de3, 0x17eb6: 0xcf4e9951, 0x17eb7: 0x40093c20, + 0x17eb8: 0xe0000e0f, 0x17eb9: 0xe0000fde, 0x17eba: 0xe0000fd8, 0x17ebb: 0xe0000fea, + 0x17ebc: 0xcf5599f1, 0x17ebd: 0xe00010ff, 0x17ebe: 0x40318820, 0x17ebf: 0xe0001114, + // Block 0x5fb, offset 0x17ec0 + 0x17ec0: 0xa0000000, 0x17ec1: 0xa0000000, 0x17ec2: 0xa0000000, 0x17ec3: 0xa0000000, + 0x17ec4: 0xa0000000, 0x17ec5: 0xa0000000, 0x17ec6: 0xa0000000, 0x17ec7: 0xa0000000, + 0x17ec8: 0xa0000000, 0x17ec9: 0x40020020, 0x17eca: 0x40020220, 0x17ecb: 0x40020420, + 0x17ecc: 0x40020620, 0x17ecd: 0x40020820, 0x17ece: 0xa0000000, 0x17ecf: 0xa0000000, + 0x17ed0: 0xa0000000, 0x17ed1: 0xa0000000, 0x17ed2: 0xa0000000, 0x17ed3: 0xa0000000, + 0x17ed4: 0xa0000000, 0x17ed5: 0xa0000000, 0x17ed6: 0xa0000000, 0x17ed7: 0xa0000000, + 0x17ed8: 0xa0000000, 0x17ed9: 0xa0000000, 0x17eda: 0xa0000000, 0x17edb: 0xa0000000, + 0x17edc: 0xa0000000, 0x17edd: 0xa0000000, 0x17ede: 0xa0000000, 0x17edf: 0xa0000000, + 0x17ee0: 0x40021220, 0x17ee1: 0x4002ba20, 0x17ee2: 0x4003e020, 0x17ee3: 0x4004ea20, + 0x17ee4: 0x4027de20, 0x17ee5: 0x4004ec20, 0x17ee6: 0x4004e620, 0x17ee7: 0x4003d220, + 0x17ee8: 0x4003f420, 0x17ee9: 0x4003f620, 0x17eea: 0x4004d820, 0x17eeb: 0x40093820, + 0x17eec: 0x40024020, 0x17eed: 0x40021a20, 0x17eee: 0x4002e420, 0x17eef: 0x4004e220, + 0x17ef0: 0x4029cc20, 0x17ef1: 0x4029ce20, 0x17ef2: 0x4029d020, 0x17ef3: 0x4029d220, + 0x17ef4: 0x4029d420, 0x17ef5: 0x4029d620, 0x17ef6: 0x4029d820, 0x17ef7: 0x4029da20, + 0x17ef8: 0x4029dc20, 0x17ef9: 0x4029de20, 0x17efa: 0x40026c20, 0x17efb: 0x40026220, + 0x17efc: 0x40094020, 0x17efd: 0x40094220, 0x17efe: 0x40094420, 0x17eff: 0x4002c420, + // Block 0x5fc, offset 0x17f00 + 0x17f00: 0x4004d620, 0x17f01: 0x002bde88, 0x17f02: 0x002c0a88, 0x17f03: 0x002c3a88, + 0x17f04: 0x002c6288, 0x17f05: 0xce0a3041, 0x17f06: 0x002d0888, 0x17f07: 0xc51f2692, + 0x17f08: 0x002d6888, 0x17f09: 0x002d9a88, 0x17f0a: 0x002dcc88, 0x17f0b: 0x002dfe88, + 0x17f0c: 0xc0030002, 0x17f0d: 0x002e8288, 0x17f0e: 0x002e9e88, 0x17f0f: 0xc33f3041, + 0x17f10: 0x002f2c88, 0x17f11: 0x002f5688, 0x17f12: 0x002f7a88, 0x17f13: 0xc3433041, + 0x17f14: 0x00302c88, 0x17f15: 0x00306c88, 0x17f16: 0x0030be88, 0x17f17: 0x0030e288, + 0x17f18: 0x0030f688, 0x17f19: 0x00310088, 0x17f1a: 0x00312a88, 0x17f1b: 0x4003f820, + 0x17f1c: 0x4004e420, 0x17f1d: 0x4003fa20, 0x17f1e: 0x40062420, 0x17f1f: 0x40021620, + 0x17f20: 0x40061e20, 0x17f21: 0x402bde20, 0x17f22: 0x402c0a20, 0x17f23: 0x402c3a20, + 0x17f24: 0x402c6220, 0x17f25: 0xce083041, 0x17f26: 0x402d0820, 0x17f27: 0xc3372681, + 0x17f28: 0x402d6820, 0x17f29: 0x402d9a20, 0x17f2a: 0x402dcc20, 0x17f2b: 0x402dfe20, + 0x17f2c: 0xc0000002, 0x17f2d: 0x402e8220, 0x17f2e: 0x402e9e20, 0x17f2f: 0xc33d3041, + 0x17f30: 0x402f2c20, 0x17f31: 0x402f5620, 0x17f32: 0x402f7a20, 0x17f33: 0xc3413041, + 0x17f34: 0x40302c20, 0x17f35: 0x40306c20, 0x17f36: 0x4030be20, 0x17f37: 0x4030e220, + 0x17f38: 0x4030f620, 0x17f39: 0x40310020, 0x17f3a: 0x40312a20, 0x17f3b: 0x4003fc20, + 0x17f3c: 0x40094820, 0x17f3d: 0x4003fe20, 0x17f3e: 0x40094c20, 0x17f3f: 0xa0000000, + // Block 0x5fd, offset 0x17f40 + 0x17f40: 0xe0000d24, 0x17f41: 0xe0000d21, 0x17f42: 0xe0000d2a, 0x17f43: 0xe0000d27, + 0x17f44: 0xe0000d69, 0x17f45: 0xe0000d66, 0x17f46: 0xe0000d7b, 0x17f47: 0xe0000d78, + 0x17f48: 0xe0000d87, 0x17f49: 0xe0000d84, 0x17f4a: 0xe0000d81, 0x17f4b: 0xe0000d7e, + 0x17f4c: 0xe0000ded, 0x17f4d: 0xe0000de9, 0x17f4e: 0xe0000df5, 0x17f4f: 0xe0000df1, + 0x17f50: 0xe0000e3d, 0x17f51: 0xe0000e39, 0x17f52: 0xe0000e35, 0x17f53: 0xe0000e31, + 0x17f54: 0xe0000ea7, 0x17f55: 0xe0000ea4, 0x17f56: 0xe0000ead, 0x17f57: 0xe0000eaa, + 0x17f58: 0xe0000ed6, 0x17f59: 0xe0000ed3, 0x17f5a: 0xe0000ef4, 0x17f5b: 0xe0000ef1, + 0x17f5c: 0xe0000efb, 0x17f5d: 0xe0000ef7, 0x17f5e: 0xe0000f02, 0x17f5f: 0xe0000eff, + 0x17f60: 0xe0000f41, 0x17f61: 0xe0000f3e, 0x17f62: 0x002fe883, 0x17f63: 0x402fe820, + 0x17f64: 0xe0000f26, 0x17f65: 0xe0000f22, 0x17f66: 0xe0000f3a, 0x17f67: 0xe0000f36, + 0x17f68: 0xe000296a, 0x17f69: 0xe0002967, 0x17f6a: 0xe0000f93, 0x17f6b: 0xe0000f90, + 0x17f6c: 0xe0000f9f, 0x17f6d: 0xe0000f9c, 0x17f6e: 0xe0000fb1, 0x17f6f: 0xe0000fae, + 0x17f70: 0xe0000fab, 0x17f71: 0xe0000fa8, 0x17f72: 0xe0001093, 0x17f73: 0xe0001090, + 0x17f74: 0xe000109f, 0x17f75: 0xe000109c, 0x17f76: 0xe0001099, 0x17f77: 0xe0001096, + 0x17f78: 0xe0001032, 0x17f79: 0xe000102e, 0x17f7a: 0xe0001046, 0x17f7b: 0xe0001042, + 0x17f7c: 0xe00010a9, 0x17f7d: 0xe00010a6, 0x17f7e: 0xe00010af, 0x17f7f: 0xe00010ac, + // Block 0x5fe, offset 0x17f80 + 0x17f80: 0xe00010d2, 0x17f81: 0xe00010cf, 0x17f82: 0xe00010cc, 0x17f83: 0xe00010c9, + 0x17f84: 0xe00010e1, 0x17f85: 0xe00010de, 0x17f86: 0xe00010e7, 0x17f87: 0xe00010e4, + 0x17f88: 0xe00010ed, 0x17f89: 0xe00010ea, 0x17f8a: 0xe00010fc, 0x17f8b: 0xe00010f9, + 0x17f8c: 0xe00010f6, 0x17f8d: 0xe00010f3, 0x17f8e: 0xe0001123, 0x17f8f: 0xe0001120, + 0x17f90: 0xe0001141, 0x17f91: 0xe000113e, 0x17f92: 0xe0001153, 0x17f93: 0xe0001150, + 0x17f94: 0xe0001159, 0x17f95: 0xe0001156, 0x17f96: 0xe0000c15, 0x17f97: 0xe0000f8d, + 0x17f98: 0xe00010db, 0x17f99: 0xe0001111, 0x17f9a: 0xf0000404, 0x17f9b: 0xe0000f70, + 0x17f9c: 0x40300420, 0x17f9d: 0x40300620, 0x17f9e: 0xe0000f7f, 0x17f9f: 0x402c9620, + 0x17fa0: 0xe000099b, 0x17fa1: 0xe0000998, 0x17fa2: 0xe0000989, 0x17fa3: 0xe0000986, + 0x17fa4: 0xe0000928, 0x17fa5: 0xe0000924, 0x17fa6: 0xe0000930, 0x17fa7: 0xe000092c, + 0x17fa8: 0xe0000940, 0x17fa9: 0xe000093c, 0x17faa: 0xe0000938, 0x17fab: 0xe0000934, + 0x17fac: 0xe00009aa, 0x17fad: 0xe00009a6, 0x17fae: 0xe0000902, 0x17faf: 0xe00008fe, + 0x17fb0: 0xe000090a, 0x17fb1: 0xe0000906, 0x17fb2: 0xe000091a, 0x17fb3: 0xe0000916, + 0x17fb4: 0xe0000912, 0x17fb5: 0xe000090e, 0x17fb6: 0xe00009a2, 0x17fb7: 0xe000099e, + 0x17fb8: 0x002c9a83, 0x17fb9: 0x402c9a20, 0x17fba: 0xe0000b5c, 0x17fbb: 0xe0000b59, + 0x17fbc: 0xe0000b26, 0x17fbd: 0xe0000b23, 0x17fbe: 0xe0000afb, 0x17fbf: 0xe0000af7, + // Block 0x5ff, offset 0x17fc0 + 0x17fc0: 0xe0000b03, 0x17fc1: 0xe0000aff, 0x17fc2: 0xe0000b13, 0x17fc3: 0xe0000b0f, + 0x17fc4: 0xe0000b0b, 0x17fc5: 0xe0000b07, 0x17fc6: 0xe000b357, 0x17fc7: 0xe000b354, + 0x17fc8: 0xe0000c66, 0x17fc9: 0xe0000c63, 0x17fca: 0xe0000c78, 0x17fcb: 0xe0000c75, + 0x17fcc: 0x002ee483, 0x17fcd: 0x402ee420, 0x17fce: 0xe0000e44, 0x17fcf: 0xe0000e41, + 0x17fd0: 0xe0000dad, 0x17fd1: 0xe0000da9, 0x17fd2: 0xe0000db5, 0x17fd3: 0xe0000db1, + 0x17fd4: 0xe0000dc5, 0x17fd5: 0xe0000dc1, 0x17fd6: 0xe0000dbd, 0x17fd7: 0xe0000db9, + 0x17fd8: 0xe0003c28, 0x17fd9: 0xe0003c25, 0x17fda: 0xe0000e5d, 0x17fdb: 0xe0000e59, + 0x17fdc: 0xe0000e65, 0x17fdd: 0xe0000e61, 0x17fde: 0xe0000e75, 0x17fdf: 0xe0000e71, + 0x17fe0: 0xe0000e6d, 0x17fe1: 0xe0000e69, 0x17fe2: 0xe0003c2e, 0x17fe3: 0xe0003c2b, + 0x17fe4: 0xe000108d, 0x17fe5: 0xe000108a, 0x17fe6: 0xe000104d, 0x17fe7: 0xe000104a, + 0x17fe8: 0xe0001066, 0x17fe9: 0xe0001062, 0x17fea: 0xe000106e, 0x17feb: 0xe000106a, + 0x17fec: 0xe000107e, 0x17fed: 0xe000107a, 0x17fee: 0xe0001076, 0x17fef: 0xe0001072, + 0x17ff0: 0xe0001086, 0x17ff1: 0xe0001082, 0x17ff2: 0xe0001108, 0x17ff3: 0xe0001105, + 0x17ff4: 0xe0001135, 0x17ff5: 0xe0001132, 0x17ff6: 0xe000112f, 0x17ff7: 0xe000112c, + 0x17ff8: 0xe000111d, 0x17ff9: 0xe000111a, 0x17ffa: 0xe0000d0a, 0x17ffb: 0xe0000d07, + 0x17ffc: 0x0030d888, 0x17ffd: 0x4030d820, 0x17ffe: 0x00312088, 0x17fff: 0x40312020, + // Block 0x600, offset 0x18000 + 0x18000: 0xa0000000, 0x18001: 0xa0000000, 0x18002: 0xa0000000, 0x18003: 0xa0000000, + 0x18004: 0xa0000000, 0x18005: 0xa0000000, 0x18006: 0xa0000000, 0x18007: 0xa0000000, + 0x18008: 0xa0000000, 0x18009: 0x40020020, 0x1800a: 0x40020220, 0x1800b: 0x40020420, + 0x1800c: 0x40020620, 0x1800d: 0x40020820, 0x1800e: 0xa0000000, 0x1800f: 0xa0000000, + 0x18010: 0xa0000000, 0x18011: 0xa0000000, 0x18012: 0xa0000000, 0x18013: 0xa0000000, + 0x18014: 0xa0000000, 0x18015: 0xa0000000, 0x18016: 0xa0000000, 0x18017: 0xa0000000, + 0x18018: 0xa0000000, 0x18019: 0xa0000000, 0x1801a: 0xa0000000, 0x1801b: 0xa0000000, + 0x1801c: 0xa0000000, 0x1801d: 0xa0000000, 0x1801e: 0xa0000000, 0x1801f: 0xa0000000, + 0x18020: 0x40021220, 0x18021: 0x4002ba20, 0x18022: 0x4003e020, 0x18023: 0x4004ea20, + 0x18024: 0x4027de20, 0x18025: 0x4004ec20, 0x18026: 0x4004e620, 0x18027: 0x4003d220, + 0x18028: 0x4003f420, 0x18029: 0x4003f620, 0x1802a: 0x4004d820, 0x1802b: 0x40093820, + 0x1802c: 0x40024020, 0x1802d: 0x40021a20, 0x1802e: 0x4002e420, 0x1802f: 0x4004e220, + 0x18030: 0x4029cc20, 0x18031: 0x4029ce20, 0x18032: 0x4029d020, 0x18033: 0x4029d220, + 0x18034: 0x4029d420, 0x18035: 0x4029d620, 0x18036: 0x4029d820, 0x18037: 0x4029da20, + 0x18038: 0x4029dc20, 0x18039: 0x4029de20, 0x1803a: 0x40026c20, 0x1803b: 0x40026220, + 0x1803c: 0x40094020, 0x1803d: 0x40094220, 0x1803e: 0x40094420, 0x1803f: 0x4002c420, + // Block 0x601, offset 0x18040 + 0x18040: 0x4004d620, 0x18041: 0xcf5c9a11, 0x18042: 0x002c0a88, 0x18043: 0x002c3a88, + 0x18044: 0x002c6288, 0x18045: 0xcf6a9a51, 0x18046: 0x002d0888, 0x18047: 0x002d2288, + 0x18048: 0x002d6888, 0x18049: 0xcf7e9a11, 0x1804a: 0x002dcc88, 0x1804b: 0x002dfe88, + 0x1804c: 0xc0030002, 0x1804d: 0xcf889a11, 0x1804e: 0xcf929a11, 0x1804f: 0xcf9c9a11, + 0x18050: 0x002f2c88, 0x18051: 0x002f5688, 0x18052: 0x002f7a88, 0x18053: 0x002fe688, + 0x18054: 0x00302c88, 0x18055: 0xcfab9b11, 0x18056: 0x0030be88, 0x18057: 0x0030e288, + 0x18058: 0x0030f688, 0x18059: 0x00310088, 0x1805a: 0x00312a88, 0x1805b: 0x4003f820, + 0x1805c: 0x4004e420, 0x1805d: 0x4003fa20, 0x1805e: 0x40062420, 0x1805f: 0x40021620, + 0x18060: 0x40061e20, 0x18061: 0xcf579a11, 0x18062: 0x402c0a20, 0x18063: 0x402c3a20, + 0x18064: 0x402c6220, 0x18065: 0xcf619a51, 0x18066: 0x402d0820, 0x18067: 0x402d2220, + 0x18068: 0x402d6820, 0x18069: 0xcf799a11, 0x1806a: 0x402dcc20, 0x1806b: 0x402dfe20, + 0x1806c: 0xc0000002, 0x1806d: 0xcf839a11, 0x1806e: 0xcf8d9a11, 0x1806f: 0xcf979a11, + 0x18070: 0x402f2c20, 0x18071: 0x402f5620, 0x18072: 0x402f7a20, 0x18073: 0x402fe620, + 0x18074: 0x40302c20, 0x18075: 0xcfa19b11, 0x18076: 0x4030be20, 0x18077: 0x4030e220, + 0x18078: 0x4030f620, 0x18079: 0x40310020, 0x1807a: 0x40312a20, 0x1807b: 0x4003fc20, + 0x1807c: 0x40094820, 0x1807d: 0x4003fe20, 0x1807e: 0x40094c20, 0x1807f: 0xa0000000, + // Block 0x602, offset 0x18080 + 0x18080: 0x002bde63, 0x18081: 0x002bde23, 0x18082: 0xe0000921, 0x18083: 0xe0000969, + 0x18084: 0xe000095b, 0x18085: 0xe000094d, 0x18086: 0xe00009dd, 0x18087: 0xe0000a53, + 0x18088: 0x002c9863, 0x18089: 0x002c9823, 0x1808a: 0xcf769ae1, 0x1808b: 0xe0000b20, + 0x1808c: 0x002d9a63, 0x1808d: 0x002d9a23, 0x1808e: 0xe0000c37, 0x1808f: 0xe0000c43, + 0x18090: 0xe0000ab3, 0x18091: 0xe0000d63, 0x18092: 0x002ee263, 0x18093: 0x002ee223, + 0x18094: 0xe0000da6, 0x18095: 0xe0000de6, 0x18096: 0xe0000dd2, 0x18097: 0x40093e20, + 0x18098: 0xe0000e12, 0x18099: 0x00306c63, 0x1809a: 0x00306c23, 0x1809b: 0xe0000fed, + 0x1809c: 0x00306d23, 0x1809d: 0xe0001102, 0x1809e: 0x00318888, 0x1809f: 0xe0000f7b, + 0x180a0: 0x402bde1f, 0x180a1: 0x402bde1d, 0x180a2: 0xe000091e, 0x180a3: 0xe0000966, + 0x180a4: 0xe0000958, 0x180a5: 0xe000094a, 0x180a6: 0xe00009d5, 0x180a7: 0xe0000a4d, + 0x180a8: 0x402c981f, 0x180a9: 0x402c981d, 0x180aa: 0xcf739ae1, 0x180ab: 0xe0000b1d, + 0x180ac: 0x402d9a1f, 0x180ad: 0x402d9a1d, 0x180ae: 0xe0000c34, 0x180af: 0xe0000c40, + 0x180b0: 0xe0000aad, 0x180b1: 0xe0000d60, 0x180b2: 0x402ee21f, 0x180b3: 0x402ee21d, + 0x180b4: 0xe0000da3, 0x180b5: 0xe0000de3, 0x180b6: 0xe0000dcf, 0x180b7: 0x40093c20, + 0x180b8: 0xe0000e0f, 0x180b9: 0x40306c1f, 0x180ba: 0x40306c1d, 0x180bb: 0xe0000fea, + 0x180bc: 0x40306c25, 0x180bd: 0xe00010ff, 0x180be: 0x40318820, 0x180bf: 0xe0001114, + // Block 0x603, offset 0x180c0 + 0x180c0: 0x002bde03, 0x180c1: 0x402bde1c, 0x180c2: 0xe00008fb, 0x180c3: 0xe00008f8, + 0x180c4: 0xe000097d, 0x180c5: 0xe000097a, 0x180c6: 0xe0000a38, 0x180c7: 0xe0000a35, + 0x180c8: 0xe0000a3e, 0x180c9: 0xe0000a3b, 0x180ca: 0xe0000a4a, 0x180cb: 0xe0000a47, + 0x180cc: 0xe0000a44, 0x180cd: 0xe0000a41, 0x180ce: 0xe0000a86, 0x180cf: 0xe0000a83, + 0x180d0: 0xe0000aaa, 0x180d1: 0xe0000aa7, 0x180d2: 0x002c9803, 0x180d3: 0x402c981c, + 0x180d4: 0xe0000aee, 0x180d5: 0xe0000aeb, 0x180d6: 0xe0000b2c, 0x180d7: 0xe0000b29, + 0x180d8: 0xe0000b40, 0x180d9: 0xe0000b3d, 0x180da: 0x002c9843, 0x180db: 0x402c981e, + 0x180dc: 0xe0000bb8, 0x180dd: 0xe0000bb5, 0x180de: 0xe0000bb2, 0x180df: 0xe0000baf, + 0x180e0: 0xe0000bc4, 0x180e1: 0xe0000bc1, 0x180e2: 0xe0000bca, 0x180e3: 0xe0000bc7, + 0x180e4: 0xe0000bee, 0x180e5: 0xe0000beb, 0x180e6: 0xe0000c1b, 0x180e7: 0xe0000c18, + 0x180e8: 0xe0000c51, 0x180e9: 0xe0000c4e, 0x180ea: 0x002d9a03, 0x180eb: 0x402d9a1c, + 0x180ec: 0xe0000c31, 0x180ed: 0xe0000c2e, 0x180ee: 0xe0000c5a, 0x180ef: 0xe0000c57, + 0x180f0: 0xe0000c54, 0x180f1: 0x402da220, 0x180f2: 0xf0000a0a, 0x180f3: 0xf0000404, + 0x180f4: 0xe0000c8a, 0x180f5: 0xe0000c87, 0x180f6: 0xe0000c9f, 0x180f7: 0xe0000c9c, + 0x180f8: 0x402f7220, 0x180f9: 0xe0000ccc, 0x180fa: 0xe0000cc9, 0x180fb: 0xe0000cd8, + 0x180fc: 0xe0000cd5, 0x180fd: 0xe0000cd2, 0x180fe: 0xe0000ccf, 0x180ff: 0xe0000d04, + // Block 0x604, offset 0x18100 + 0x18100: 0xe0000cfe, 0x18101: 0xe0000cf8, 0x18102: 0xe0000cf5, 0x18103: 0x002e9e23, + 0x18104: 0x402e9e1d, 0x18105: 0xe0000d6f, 0x18106: 0xe0000d6c, 0x18107: 0x002e9e43, + 0x18108: 0x402e9e1e, 0x18109: 0xf0000404, 0x1810a: 0x002eda88, 0x1810b: 0x402eda20, + 0x1810c: 0x002ee203, 0x1810d: 0x402ee21c, 0x1810e: 0xe0000da0, 0x1810f: 0xe0000d9d, + 0x18110: 0xe0000de0, 0x18111: 0xe0000ddd, 0x18112: 0xe0000e93, 0x18113: 0xe0000e8f, + 0x18114: 0xe0000eca, 0x18115: 0xe0000ec7, 0x18116: 0xe0000edc, 0x18117: 0xe0000ed9, + 0x18118: 0xe0000ed0, 0x18119: 0xe0000ecd, 0x1811a: 0xe0000f1f, 0x1811b: 0xe0000f1c, + 0x1811c: 0xe0000f2d, 0x1811d: 0xe0000f2a, 0x1811e: 0xe0000f47, 0x1811f: 0xe0000f44, + 0x18120: 0xe0000f33, 0x18121: 0xe0000f30, 0x18122: 0xe0000f99, 0x18123: 0xe0000f96, + 0x18124: 0xe0000f8a, 0x18125: 0xe0000f87, 0x18126: 0x00303688, 0x18127: 0x40303620, + 0x18128: 0xe000102b, 0x18129: 0xe0001028, 0x1812a: 0x00306c03, 0x1812b: 0x40306c1c, + 0x1812c: 0xe0000fe7, 0x1812d: 0xe0000fe4, 0x1812e: 0xe0000ff9, 0x1812f: 0xe0000ff6, + 0x18130: 0xe0001025, 0x18131: 0xe0001022, 0x18132: 0xe0001039, 0x18133: 0xe0001036, + 0x18134: 0xe00010d8, 0x18135: 0xe00010d5, 0x18136: 0xe000110e, 0x18137: 0xe000110b, + 0x18138: 0xe0001117, 0x18139: 0xe000113b, 0x1813a: 0xe0001138, 0x1813b: 0xe000114d, + 0x1813c: 0xe000114a, 0x1813d: 0xe0001147, 0x1813e: 0xe0001144, 0x1813f: 0xe0000f64, + // Block 0x605, offset 0x18140 + 0x18140: 0x40321220, 0x18141: 0x40321a20, 0x18142: 0x40322220, 0x18143: 0x40322a20, + 0x18144: 0xe0000ad5, 0x18145: 0xe0000ad1, 0x18146: 0xe0000acd, 0x18147: 0xf0000a0a, + 0x18148: 0xf000040a, 0x18149: 0xf0000404, 0x1814a: 0xf0000a0a, 0x1814b: 0xf000040a, + 0x1814c: 0xf0000404, 0x1814d: 0x002bde43, 0x1814e: 0x402bde1e, 0x1814f: 0x002d9a43, + 0x18150: 0x402d9a1e, 0x18151: 0x002ee243, 0x18152: 0x402ee21e, 0x18153: 0x00306c43, + 0x18154: 0x40306c1e, 0x18155: 0x00306ca3, 0x18156: 0x40306c21, 0x18157: 0x00306cc3, + 0x18158: 0x40306c22, 0x18159: 0x00306ce3, 0x1815a: 0x40306c23, 0x1815b: 0x00306d03, + 0x1815c: 0x40306c24, 0x1815d: 0x402cae20, 0x1815e: 0xe000b4b1, 0x1815f: 0xe000b4ae, + 0x18160: 0xe000b4b7, 0x18161: 0xe000b4b4, 0x18162: 0xe00009f4, 0x18163: 0xe00009ef, + 0x18164: 0x002d3a88, 0x18165: 0x402d3a20, 0x18166: 0xe0000bbe, 0x18167: 0xe0000bbb, + 0x18168: 0xe0000c99, 0x18169: 0xe0000c96, 0x1816a: 0xe0000e20, 0x1816b: 0xe0000e1d, + 0x1816c: 0xe000b50b, 0x1816d: 0xe000b508, 0x1816e: 0xe0001162, 0x1816f: 0xe000115f, + 0x18170: 0xe0000c8d, 0x18171: 0xf0000a0a, 0x18172: 0xf000040a, 0x18173: 0xf0000404, + 0x18174: 0xe0000bac, 0x18175: 0xe0000ba9, 0x18176: 0x002d7888, 0x18177: 0x00319488, + 0x18178: 0x002e9e63, 0x18179: 0x402e9e1f, 0x1817a: 0xe000b4c9, 0x1817b: 0xe000b4c6, + 0x1817c: 0xe00009ea, 0x1817d: 0xe00009e5, 0x1817e: 0xe0000e19, 0x1817f: 0xe0000e15, + // Block 0x606, offset 0x18180 + 0x18180: 0xe000098f, 0x18181: 0xe000098c, 0x18182: 0xe0000995, 0x18183: 0xe0000992, + 0x18184: 0xe0000b62, 0x18185: 0xe0000b5f, 0x18186: 0xe0000b68, 0x18187: 0xe0000b65, + 0x18188: 0xe0000c6c, 0x18189: 0xe0000c69, 0x1818a: 0xe0000c72, 0x1818b: 0xe0000c6f, + 0x1818c: 0xe0000e4a, 0x1818d: 0xe0000e47, 0x1818e: 0xe0000e50, 0x1818f: 0xe0000e4d, + 0x18190: 0xe0000ee8, 0x18191: 0xe0000ee5, 0x18192: 0xe0000eee, 0x18193: 0xe0000eeb, + 0x18194: 0xe0001053, 0x18195: 0xe0001050, 0x18196: 0xe0001059, 0x18197: 0xe0001056, + 0x18198: 0xe0000f61, 0x18199: 0xe0000f5e, 0x1819a: 0xe0000fa5, 0x1819b: 0xe0000fa2, + 0x1819c: 0x00312288, 0x1819d: 0x40312220, 0x1819e: 0xe0000bf4, 0x1819f: 0xe0000bf1, + 0x181a0: 0x002ebc88, 0x181a1: 0x402c8c20, 0x181a2: 0x002f2288, 0x181a3: 0x402f2220, + 0x181a4: 0x00314088, 0x181a5: 0x40314020, 0x181a6: 0xe000096f, 0x181a7: 0xe000096c, + 0x181a8: 0xe0000b32, 0x181a9: 0xe0000b2f, 0x181aa: 0xe000b4f9, 0x181ab: 0xe000b4f6, + 0x181ac: 0xe000b4ff, 0x181ad: 0xe000b4fc, 0x181ae: 0xe0000e04, 0x181af: 0xe0000e01, + 0x181b0: 0xe000b505, 0x181b1: 0xe000b502, 0x181b2: 0xe0001129, 0x181b3: 0xe0001126, + 0x181b4: 0x402e5e20, 0x181b5: 0x402ed020, 0x181b6: 0x40305a20, 0x181b7: 0x402dd420, + 0x181b8: 0xe0000abf, 0x181b9: 0xe0000ec4, 0x181ba: 0x002be888, 0x181bb: 0x002c4488, + 0x181bc: 0x402c4420, 0x181bd: 0x002e3888, 0x181be: 0x00303e88, 0x181bf: 0x402ffc20, + // Block 0x607, offset 0x181c0 + 0x181c0: 0xe00009b1, 0x181c1: 0xe00009ae, 0x181c2: 0xe0000a22, 0x181c3: 0xe0000a1f, + 0x181c4: 0xe0000a28, 0x181c5: 0xe0000a25, 0x181c6: 0xe0000a2e, 0x181c7: 0xe0000a2b, + 0x181c8: 0xe0000a5a, 0x181c9: 0xe0000a56, 0x181ca: 0xe0000a8c, 0x181cb: 0xe0000a89, + 0x181cc: 0xe0000a98, 0x181cd: 0xe0000a95, 0x181ce: 0xe0000aa4, 0x181cf: 0xe0000aa1, + 0x181d0: 0xe0000a92, 0x181d1: 0xe0000a8f, 0x181d2: 0xe0000a9e, 0x181d3: 0xe0000a9b, + 0x181d4: 0xe000b4e1, 0x181d5: 0xe000b4de, 0x181d6: 0xe000b4db, 0x181d7: 0xe000b4d8, + 0x181d8: 0xe0000b7c, 0x181d9: 0xe0000b79, 0x181da: 0xe0000b82, 0x181db: 0xe0000b7f, + 0x181dc: 0xe0000b39, 0x181dd: 0xe0000b35, 0x181de: 0xe0000b8c, 0x181df: 0xe0000b89, + 0x181e0: 0xe0000bd0, 0x181e1: 0xe0000bcd, 0x181e2: 0xe0000c00, 0x181e3: 0xe0000bfd, + 0x181e4: 0xe0000c0c, 0x181e5: 0xe0000c09, 0x181e6: 0xe0000bfa, 0x181e7: 0xe0000bf7, + 0x181e8: 0xe0000c06, 0x181e9: 0xe0000c03, 0x181ea: 0xe0000c12, 0x181eb: 0xe0000c0f, + 0x181ec: 0xe0000c7e, 0x181ed: 0xe0000c7b, 0x181ee: 0xe000b4e7, 0x181ef: 0xe000b4e4, + 0x181f0: 0xe0000c93, 0x181f1: 0xe0000c90, 0x181f2: 0xe0000cab, 0x181f3: 0xe0000ca8, + 0x181f4: 0xe0000cb1, 0x181f5: 0xe0000cae, 0x181f6: 0xe0000cde, 0x181f7: 0xe0000cdb, + 0x181f8: 0xe0000ce5, 0x181f9: 0xe0000ce1, 0x181fa: 0xe0000cf2, 0x181fb: 0xe0000cef, + 0x181fc: 0xe0000cec, 0x181fd: 0xe0000ce9, 0x181fe: 0x002e8223, 0x181ff: 0x402e821d, + // Block 0x608, offset 0x18200 + 0x18200: 0xe0000d24, 0x18201: 0xe0000d21, 0x18202: 0xe0000d2a, 0x18203: 0xe0000d27, + 0x18204: 0xe0000d69, 0x18205: 0xe0000d66, 0x18206: 0xe0000d7b, 0x18207: 0xe0000d78, + 0x18208: 0xe0000d87, 0x18209: 0xe0000d84, 0x1820a: 0xe0000d81, 0x1820b: 0xe0000d7e, + 0x1820c: 0xe000b517, 0x1820d: 0xe000b514, 0x1820e: 0xe0000df5, 0x1820f: 0xe0000df1, + 0x18210: 0xe000b4f3, 0x18211: 0xe000b4f0, 0x18212: 0xe000b4ed, 0x18213: 0xe000b4ea, + 0x18214: 0xe0000ea7, 0x18215: 0xe0000ea4, 0x18216: 0xe0000ead, 0x18217: 0xe0000eaa, + 0x18218: 0xe0000ed6, 0x18219: 0xe0000ed3, 0x1821a: 0xe0000ef4, 0x1821b: 0xe0000ef1, + 0x1821c: 0xe0000efb, 0x1821d: 0xe0000ef7, 0x1821e: 0xe0000f02, 0x1821f: 0xe0000eff, + 0x18220: 0xe0000f41, 0x18221: 0xe0000f3e, 0x18222: 0xe0000f53, 0x18223: 0xe0000f50, + 0x18224: 0xe0000f26, 0x18225: 0xe0000f22, 0x18226: 0xe0000f3a, 0x18227: 0xe0000f36, + 0x18228: 0xe0000f5a, 0x18229: 0xe0000f56, 0x1822a: 0xe0000f93, 0x1822b: 0xe0000f90, + 0x1822c: 0xe0000f9f, 0x1822d: 0xe0000f9c, 0x1822e: 0xe0000fb1, 0x1822f: 0xe0000fae, + 0x18230: 0xe0000fab, 0x18231: 0xe0000fa8, 0x18232: 0xe0001093, 0x18233: 0xe0001090, + 0x18234: 0xe000109f, 0x18235: 0xe000109c, 0x18236: 0xe0001099, 0x18237: 0xe0001096, + 0x18238: 0xe000b535, 0x18239: 0xe000b532, 0x1823a: 0xe000b52f, 0x1823b: 0xe000b52c, + 0x1823c: 0xe00010a9, 0x1823d: 0xe00010a6, 0x1823e: 0xe00010af, 0x1823f: 0xe00010ac, + // Block 0x609, offset 0x18240 + 0x18240: 0xe00010d2, 0x18241: 0xe00010cf, 0x18242: 0xe00010cc, 0x18243: 0xe00010c9, + 0x18244: 0xe00010e1, 0x18245: 0xe00010de, 0x18246: 0xe00010e7, 0x18247: 0xe00010e4, + 0x18248: 0xe00010ed, 0x18249: 0xe00010ea, 0x1824a: 0xe00010fc, 0x1824b: 0xe00010f9, + 0x1824c: 0xe00010f6, 0x1824d: 0xe00010f3, 0x1824e: 0xe0001123, 0x1824f: 0xe0001120, + 0x18250: 0xe0001141, 0x18251: 0xe000113e, 0x18252: 0xe0001153, 0x18253: 0xe0001150, + 0x18254: 0xe0001159, 0x18255: 0xe0001156, 0x18256: 0xe0000c15, 0x18257: 0xe0000f8d, + 0x18258: 0xe00010db, 0x18259: 0xe0001111, 0x1825a: 0xf0000404, 0x1825b: 0xe0000f70, + 0x1825c: 0x40300420, 0x1825d: 0x40300620, 0x1825e: 0xe0000f7f, 0x1825f: 0x402c9620, + 0x18260: 0xe000099b, 0x18261: 0xe0000998, 0x18262: 0xe0000989, 0x18263: 0xe0000986, + 0x18264: 0xe000b4c3, 0x18265: 0xe000b4c0, 0x18266: 0xe000b4d5, 0x18267: 0xe000b4d2, + 0x18268: 0xe0000940, 0x18269: 0xe000093c, 0x1826a: 0xe0000938, 0x1826b: 0xe0000934, + 0x1826c: 0xe00009aa, 0x1826d: 0xe00009a6, 0x1826e: 0xe000b4bd, 0x1826f: 0xe000b4ba, + 0x18270: 0xe000b4cf, 0x18271: 0xe000b4cc, 0x18272: 0xe000091a, 0x18273: 0xe0000916, + 0x18274: 0xe0000912, 0x18275: 0xe000090e, 0x18276: 0xe00009a2, 0x18277: 0xe000099e, + 0x18278: 0xe0000b6e, 0x18279: 0xe0000b6b, 0x1827a: 0xe0000b5c, 0x1827b: 0xe0000b59, + 0x1827c: 0xe0000b26, 0x1827d: 0xe0000b23, 0x1827e: 0x002c98c3, 0x1827f: 0x402c9822, + // Block 0x60a, offset 0x18280 + 0x18280: 0x002c9903, 0x18281: 0x402c9824, 0x18282: 0xe0000b13, 0x18283: 0xe0000b0f, + 0x18284: 0xe0000b0b, 0x18285: 0xe0000b07, 0x18286: 0xe0000b75, 0x18287: 0xe0000b71, + 0x18288: 0xe0000c66, 0x18289: 0xe0000c63, 0x1828a: 0xe0000c78, 0x1828b: 0xe0000c75, + 0x1828c: 0xe0000e84, 0x1828d: 0xe0000e81, 0x1828e: 0xe0000e44, 0x1828f: 0xe0000e41, + 0x18290: 0xe000b511, 0x18291: 0xe000b50e, 0x18292: 0xe000b523, 0x18293: 0xe000b520, + 0x18294: 0xe0000dc5, 0x18295: 0xe0000dc1, 0x18296: 0xe0000dbd, 0x18297: 0xe0000db9, + 0x18298: 0xe0000e8b, 0x18299: 0xe0000e87, 0x1829a: 0xe000b51d, 0x1829b: 0xe000b51a, + 0x1829c: 0xe000b529, 0x1829d: 0xe000b526, 0x1829e: 0xe0000e75, 0x1829f: 0xe0000e71, + 0x182a0: 0xe0000e6d, 0x182a1: 0xe0000e69, 0x182a2: 0xe0000e7d, 0x182a3: 0xe0000e79, + 0x182a4: 0xe000108d, 0x182a5: 0xe000108a, 0x182a6: 0xe000104d, 0x182a7: 0xe000104a, + 0x182a8: 0xe000b53b, 0x182a9: 0xe000b538, 0x182aa: 0xe000b541, 0x182ab: 0xe000b53e, + 0x182ac: 0xe000107e, 0x182ad: 0xe000107a, 0x182ae: 0xe0001076, 0x182af: 0xe0001072, + 0x182b0: 0xe0001086, 0x182b1: 0xe0001082, 0x182b2: 0xe0001108, 0x182b3: 0xe0001105, + 0x182b4: 0xe0001135, 0x182b5: 0xe0001132, 0x182b6: 0xe000112f, 0x182b7: 0xe000112c, + 0x182b8: 0xe000111d, 0x182b9: 0xe000111a, 0x182ba: 0xe0000d0a, 0x182bb: 0xe0000d07, + 0x182bc: 0x0030d888, 0x182bd: 0x4030d820, 0x182be: 0x00312088, 0x182bf: 0x40312020, + // Block 0x60b, offset 0x182c0 + 0x182c0: 0x6d200220, 0x182c1: 0x6c16fe20, 0x182c2: 0x6d0bdc20, 0x182c3: 0x6d1b3420, + 0x182c4: 0x6d0bd620, 0x182c5: 0x6cc58020, 0x182c6: 0x6c6ece20, 0x182c7: 0xe000240a, + 0x182c8: 0x6c29ae20, 0x182c9: 0x6c29ca20, 0x182ca: 0x6c100220, 0x182cb: 0x6c6b9220, + 0x182cc: 0x6cff9e20, 0x182cd: 0x6cffa020, 0x182ce: 0x6cf39620, 0x182cf: 0x6cedd020, + 0x182d0: 0x6cedd220, 0x182d1: 0x6cf39820, 0x182d2: 0x6cd8fa20, 0x182d3: 0x6d10c420, + 0x182d4: 0x6c630820, 0x182d5: 0x6c616620, 0x182d6: 0x6d036620, 0x182d7: 0x6d036820, + 0x182d8: 0x6cd49220, 0x182d9: 0x6cdbee20, 0x182db: 0x6cc64c20, + 0x182dc: 0x6cc63420, 0x182dd: 0x6d266620, 0x182de: 0x6c271e20, 0x182df: 0x2ca22083, + 0x182e0: 0x6c9f8820, 0x182e1: 0x6cd74220, 0x182e2: 0x6cd74420, 0x182e3: 0x6c0c6c20, + 0x182e4: 0x6d2ff820, 0x182e5: 0x6d2ff220, 0x182e6: 0x6cbb3620, 0x182e7: 0x6ca96420, + 0x182e8: 0x6cc38820, 0x182e9: 0xe000243f, 0x182ea: 0xe0002442, 0x182eb: 0x6ca2c020, + 0x182ec: 0x6cd2f220, 0x182ed: 0x6cd40820, 0x182ee: 0x6cd30220, 0x182ef: 0x6cd86820, + 0x182f0: 0x6cd86a20, 0x182f1: 0x6c429620, 0x182f2: 0x6cee4220, 0x182f3: 0xe0002451, + 0x182f4: 0x6cee4020, 0x182f5: 0xe000244e, 0x182f6: 0x6cc5ba20, 0x182f7: 0x6cc60a20, + 0x182f8: 0x02ff1684, 0x182f9: 0x03000484, 0x182fa: 0x6d24ba20, 0x182fb: 0x6d24bc20, + 0x182fc: 0x6cc78020, 0x182fd: 0x6c719e20, 0x182fe: 0x6c12be20, 0x182ff: 0x6c12c220, + // Block 0x60c, offset 0x18300 + 0x18300: 0x6c12c420, 0x18301: 0x6c562e20, 0x18302: 0x6d199a20, 0x18303: 0x6cf76620, + 0x18304: 0x6cf94e20, 0x18305: 0x6c673620, 0x18306: 0x0313a484, 0x18307: 0xe000246c, + 0x18308: 0x6d0d2e20, 0x18309: 0x6c077420, 0x1830a: 0xe000246f, 0x1830b: 0x6c17e220, + 0x1830c: 0x6c21a220, 0x1830d: 0x6c21a620, 0x1830e: 0x6c21f020, 0x1830f: 0x6c3f9a20, + 0x18310: 0x6c6c7c20, 0x18311: 0x6c16dc20, 0x18312: 0x6c16de20, 0x18313: 0x6d2f1620, + 0x18314: 0x6c9ae820, 0x18315: 0xe000247b, 0x18316: 0x6c3f9c20, 0x18317: 0x6d222020, + 0x18318: 0x6cbe6a20, 0x18319: 0x6cef7e20, 0x1831a: 0x6d13ae20, 0x1831b: 0x6c3c9820, + 0x1831c: 0x6c3a3020, 0x1831d: 0x6cd29c20, 0x1831e: 0xe0002481, 0x1831f: 0x6cd29e20, + 0x18320: 0x6cd2a020, 0x18321: 0xe0002484, 0x18322: 0x6c96ae20, 0x18323: 0x6c476c20, + 0x18324: 0x6c4b2420, 0x18325: 0x6d220e20, 0x18326: 0x6ca7ce20, 0x18327: 0x6c920a20, + 0x18328: 0x6c975620, 0x18329: 0x6c5a4020, 0x1832a: 0x6c9e4820, 0x1832b: 0x6cb6bc20, + 0x1832c: 0x6cb6be20, 0x1832d: 0x6c1bd020, 0x1832e: 0x6c1bd220, 0x1832f: 0x6c902820, + 0x18330: 0x6c902a20, 0x18331: 0x6c4ab620, 0x18332: 0x6c4ab420, 0x18333: 0x2c4a3883, + // Block 0x60d, offset 0x18340 + 0x18340: 0x2d13b686, 0x18341: 0x2c4bb683, 0x18342: 0x2d3a5283, 0x18343: 0x2cb1dc83, + 0x18344: 0x2d15aa84, 0x18345: 0x2c73be83, 0x18346: 0x2c37b486, 0x18347: 0x2ce7e283, + 0x18348: 0x2cc55a84, 0x18349: 0x2c372e83, 0x1834a: 0x2cc80e83, 0x1834b: 0x2c030a84, + 0x1834c: 0x2c6ed083, 0x1834d: 0x2c9d1683, 0x1834e: 0x2c0d9e83, 0x1834f: 0x2c610c83, + 0x18350: 0x2cb9ec83, 0x18351: 0x2c29b083, 0x18352: 0x2c855c83, 0x18353: 0x2c059c83, + 0x18354: 0x2c08aa83, 0x18355: 0x2c397e83, 0x18356: 0x2cf83483, 0x18357: 0x2cd22485, + 0x18358: 0x2c100483, 0x18359: 0x2c6a4e83, 0x1835a: 0x2c16e083, 0x1835b: 0x2cd7b483, + 0x1835c: 0x2d200483, 0x1835d: 0x2c79c883, 0x1835e: 0x2ceed683, 0x1835f: 0x2ce91084, + 0x18360: 0x2cd2e283, 0x18361: 0x2d34ca83, 0x18362: 0x2cdba683, 0x18363: 0x2cf55a83, + 0x18364: 0x2c26e483, 0x18365: 0x2caa6e84, 0x18366: 0x2d3f6883, 0x18367: 0x2c9db683, + 0x18368: 0x2c25b083, 0x18369: 0x2cffa283, 0x1836a: 0x2d1edc83, 0x1836b: 0x2cd18a83, + 0x1836c: 0x2c17fa83, 0x1836d: 0x2cccb083, 0x1836e: 0x2c1fd683, 0x1836f: 0x2c454a83, + 0x18370: 0x2c610e83, 0x18371: 0x2c6c1a83, 0x18372: 0x2c420a83, 0x18373: 0x2d107e83, + 0x18374: 0x2c4a0283, 0x18375: 0x2d1ac083, 0x18376: 0x2c45cc83, 0x18377: 0x2d163c83, + 0x18378: 0x2c454c83, 0x18379: 0x2c616883, 0x1837a: 0x2cccb283, 0x1837b: 0x2c1bd483, + 0x1837c: 0x2d02a283, 0x1837d: 0x2c436083, 0x1837e: 0x2c563883, 0x1837f: 0x2cd43684, + // Block 0x60e, offset 0x18380 + 0x18380: 0x2d337e83, 0x18381: 0x2cb3fc83, 0x18382: 0x2cf17a84, 0x18383: 0x2c30f883, + 0x18384: 0x2c6c1e83, 0x18385: 0x2c398083, 0x18386: 0x2cf39a83, 0x18387: 0x2cc63684, + 0x18388: 0x2d264283, 0x18389: 0x2d266885, 0x1838a: 0x2ca25c84, 0x1838b: 0x2cba3883, + 0x1838c: 0x2d34cc83, 0x1838d: 0x2c271283, 0x1838e: 0x2cd49883, 0x1838f: 0x2cf39c83, + 0x18390: 0x2c08ac83, 0x18391: 0x2c98c083, 0x18392: 0x2cd2e483, 0x18393: 0x2cb72683, + 0x18394: 0x2cd70284, 0x18395: 0x2c5d8484, 0x18396: 0x2d2f8083, 0x18397: 0x2c3fa083, + 0x18398: 0x2d10c683, 0x18399: 0x2cac5083, 0x1839a: 0x2cb14483, 0x1839b: 0x2d0b0883, + 0x1839c: 0x2ca96683, 0x1839d: 0x2cc34c83, 0x1839e: 0x2d07fa83, 0x1839f: 0x2d22b883, + 0x183a0: 0x2c483e83, 0x183a1: 0x2cec0c83, 0x183a2: 0x2c415c83, 0x183a3: 0x2cd0d284, + 0x183a4: 0x2d1e6c83, 0x183a5: 0x2ce47e83, 0x183a6: 0x2cb04483, 0x183a7: 0x2ca54083, + 0x183a8: 0x2c0e4683, 0x183a9: 0x2c040883, 0x183aa: 0x2cafa883, 0x183ab: 0x2c9f8a83, + 0x183ac: 0x2ca26483, 0x183ad: 0x2c98c283, 0x183ae: 0x2cd2a883, 0x183af: 0x2cd22c83, + 0x183b0: 0x2cd2f483, 0x183b1: 0x2cc74083, 0x183b2: 0x2c50b283, 0x183b3: 0x2d08f283, + 0x183b4: 0x2c856c83, 0x183b5: 0x2d39f083, 0x183b6: 0x2c9cd683, 0x183b7: 0x2c9d1a83, + 0x183b8: 0x2c3d1a83, 0x183b9: 0x2cedf483, 0x183ba: 0x2d0f7683, 0x183bb: 0x2d221c83, + 0x183bc: 0x2c819a83, 0x183bd: 0x2c373083, 0x183be: 0x2c82b283, 0x183bf: 0x2c378483, + // Block 0x60f, offset 0x183c0 + 0x183c0: 0x2d22c683, 0x183c1: 0x2cc78283, 0x183c2: 0x2c189483, 0x183c3: 0x2d3f2a83, + 0x183c4: 0x2d357083, 0x183c5: 0x2c6fd083, 0x183c6: 0x2ccf0683, 0x183c7: 0x2c201683, + 0x183c8: 0x2d385283, 0x183c9: 0x2c449e83, 0x183ca: 0x2ccb1483, 0x183cb: 0x2c12aa83, + 0x183cc: 0x2c549483, 0x183cd: 0x2c1d0883, 0x183ce: 0x2d093883, 0x183cf: 0x2d03ba83, + 0x183d0: 0x2d13be83, 0x183d1: 0x2d0b7083, 0x183d2: 0x2c665283, 0x183d3: 0x2c68c683, + 0x183d4: 0x2d0c5c83, 0x183d5: 0x2c475c83, 0x183d6: 0x2c30fa83, 0x183d7: 0x2cd2b083, + 0x183d8: 0x2d357c83, 0x183d9: 0x2c06dc83, 0x183da: 0x2c1be883, 0x183db: 0x2d407e84, + 0x183dc: 0x2d40a683, 0x183dd: 0x2ccfa483, 0x183de: 0x2c17ce83, 0x183df: 0x2d02ae83, + 0x183e0: 0x2c18a083, 0x183e1: 0x2c21a883, 0x183e2: 0x2d169e83, 0x183e3: 0x2d1fa483, + 0x183e4: 0x2c0b7883, 0x183e5: 0x2c84fc83, 0x183e6: 0x2c6c2e84, 0x183e7: 0x2d2f0083, + 0x183e8: 0x2c9ac683, 0x183e9: 0x2c3fba83, 0x183ea: 0x2c859883, 0x183eb: 0x2d3c5683, + 0x183ec: 0x2d222283, 0x183ed: 0x2cbe3083, 0x183ee: 0x2c39f283, 0x183ef: 0x2c9e5683, + 0x183f0: 0x2c43d083, 0x183f1: 0x2ceeee83, 0x183f2: 0x2c6fb483, 0x183f3: 0x2d19ba83, + 0x183f4: 0x2d12dc83, 0x183f5: 0x2c3c2c83, 0x183f6: 0x2c39f483, 0x183f7: 0x2cd25883, + 0x183f8: 0x2cd44283, 0x183f9: 0x2cfd6683, 0x183fa: 0x2c969883, 0x183fb: 0x2c476e83, + 0x183fc: 0x2c42bc83, 0x183fd: 0x2c0bf483, 0x183fe: 0x2c310e83, 0x183ff: 0x2c170e83, + // Block 0x610, offset 0x18400 + 0x18400: 0x2c43e083, 0x18401: 0x2c4ae283, 0x18402: 0x2d211283, 0x18403: 0x2ca79a83, + 0x18404: 0x2c91bc83, 0x18405: 0x2c924c83, 0x18406: 0x2c973283, 0x18407: 0x2c966883, + 0x18408: 0x2c59ce83, 0x18409: 0x2cd56083, 0x1840a: 0x2c521c83, 0x1840b: 0x2d353483, + 0x1840c: 0x2c9e3283, 0x1840d: 0x2c2f7483, 0x1840e: 0x2c47a683, 0x1840f: 0x2cd56683, + 0x18410: 0x2c08a283, 0x18411: 0x2cb63483, 0x18412: 0x2c1bc283, 0x18413: 0x2c8fb083, + 0x18414: 0x2c4a9683, 0x18415: 0x2d26f683, + 0x18430: 0x40273a20, 0x18431: 0x40273c20, 0x18432: 0x40273e20, 0x18433: 0x40274020, + 0x18434: 0x40274220, 0x18435: 0x40274420, 0x18436: 0x40274620, 0x18437: 0x40274820, + 0x18438: 0x40274a20, 0x18439: 0x40274c20, 0x1843a: 0x40274e20, 0x1843b: 0x40275020, + // Block 0x611, offset 0x18440 + 0x18440: 0x00021283, 0x18441: 0x40025c20, 0x18442: 0x40030420, 0x18443: 0x40051220, + 0x18444: 0x40279a20, 0x18445: 0x4027ca20, 0x18446: 0xe0002206, 0x18447: 0x6c8c9620, + 0x18448: 0x40049c20, 0x18449: 0x40049e20, 0x1844a: 0x4004a020, 0x1844b: 0x4004a220, + 0x1844c: 0x4004a420, 0x1844d: 0x4004a620, 0x1844e: 0x4004a820, 0x1844f: 0x4004aa20, + 0x18450: 0x4004ac20, 0x18451: 0x4004ae20, 0x18452: 0x40279c20, 0x18453: 0x40279e20, + 0x18454: 0x4004b020, 0x18455: 0x4004b220, 0x18456: 0x4004b420, 0x18457: 0x4004b620, + 0x18458: 0x4004b820, 0x18459: 0x4004ba20, 0x1845a: 0x4004bc20, 0x1845b: 0x4004be20, + 0x1845c: 0x40023820, 0x1845d: 0x4003ea20, 0x1845e: 0x4003ec20, 0x1845f: 0x4003ee20, + 0x18460: 0x4027a020, 0x18461: 0xe0000267, 0x18462: 0xe000037f, 0x18463: 0xe0000459, + 0x18464: 0xe000052e, 0x18465: 0xe00005f8, 0x18466: 0xe00006c3, 0x18467: 0xe000076b, + 0x18468: 0xe0000817, 0x18469: 0xe00008bc, 0x1846a: 0xada12202, 0x1846b: 0xae412302, + 0x1846c: 0xae812402, 0x1846d: 0xade12502, 0x1846e: 0xae012602, 0x1846f: 0xae012702, + 0x18470: 0x40023a20, 0x18471: 0x4027ce20, 0x18472: 0xe0000152, 0x18473: 0x4027d020, + 0x18474: 0xe0000155, 0x18475: 0x4027d220, 0x18476: 0x00279c84, 0x18477: 0x4027a220, + 0x18478: 0x2cd22484, 0x18479: 0x2ca75483, 0x1847a: 0x2cc96283, 0x1847b: 0x4027cc20, + 0x1847c: 0xe000231a, 0x1847d: 0x40051420, 0x1847e: 0x4027a420, 0x1847f: 0x4027a620, + // Block 0x612, offset 0x18480 + 0x18480: 0x00633a84, 0x18481: 0x00634484, 0x18482: 0x0064f684, 0x18483: 0x0064f884, + 0x18484: 0x00635a84, 0x18485: 0x00635c84, 0x18486: 0x00635e84, 0x18487: 0x0063ee84, + 0x18488: 0x0063f084, 0x18489: 0x0063f684, 0x1848a: 0x00640884, 0x1848b: 0x00640a84, + 0x1848c: 0x00640e84, 0x1848d: 0x00642284, 0x1848e: 0x00642884, + 0x18490: 0x4027a820, 0x18491: 0x4027aa20, 0x18492: 0x2d13b685, 0x18493: 0x2c37b485, + 0x18494: 0x2cc9f285, 0x18495: 0x2cd87484, 0x18496: 0x2cce4884, 0x18497: 0x2d378285, + 0x18498: 0x2cfa2684, 0x18499: 0x2c63fc83, 0x1849a: 0x2d15aa83, 0x1849b: 0x2c0dba83, + 0x1849c: 0x2c2f4083, 0x1849d: 0x2ce45484, 0x1849e: 0x2c2a8a83, 0x1849f: 0x2cc55a83, + 0x184a0: 0xe000237a, 0x184a1: 0xe0002383, 0x184a2: 0xe0002380, 0x184a3: 0xe000237d, + 0x184a4: 0x40661c20, 0x184a5: 0xe000238c, 0x184a6: 0x40661620, 0x184a7: 0xe0002389, + 0x184a8: 0xe000239e, 0x184a9: 0xe0002386, 0x184aa: 0xe0002395, 0x184ab: 0xe000239b, + 0x184ac: 0x40663420, 0x184ad: 0x4065f220, 0x184ae: 0xe000238f, 0x184af: 0xe0002392, + 0x184b0: 0x40663020, 0x184b1: 0x40663220, 0x184b2: 0x40662c20, 0x184b3: 0xe0002398, + 0x184b4: 0x0065dc99, 0x184b5: 0x0065e699, 0x184b6: 0x0065ee99, 0x184b7: 0x0065f499, + 0x184b8: 0x40660c20, 0x184b9: 0x40660e20, 0x184ba: 0x40661020, + // Block 0x613, offset 0x184c0 + 0x184c0: 0xf0000404, 0x184c1: 0xf0000404, 0x184c2: 0xf0000404, 0x184c3: 0xf0000404, + 0x184c4: 0xf0000404, 0x184c5: 0xf0000404, 0x184c6: 0xf0000404, 0x184c7: 0xf0000404, + 0x184c8: 0xf0000404, 0x184c9: 0xf0000404, 0x184ca: 0xf0000404, 0x184cb: 0xf0000404, + 0x184cc: 0xf0000404, 0x184cd: 0xf0000404, 0x184ce: 0xe000004c, 0x184cf: 0xe0000051, + 0x184d0: 0xe0000056, 0x184d1: 0xe000005b, 0x184d2: 0xe0000060, 0x184d3: 0xe0000065, + 0x184d4: 0xe000006a, 0x184d5: 0xe000006f, 0x184d6: 0xe0000083, 0x184d7: 0xe000008d, + 0x184d8: 0xe0000092, 0x184d9: 0xe0000097, 0x184da: 0xe000009c, 0x184db: 0xe00000a1, + 0x184dc: 0xe0000088, 0x184dd: 0xe0000074, 0x184de: 0xe000007c, + 0x184e0: 0xe000b3ca, 0x184e1: 0xe000b366, 0x184e2: 0xe000b39e, 0x184e3: 0xe000b3ae, + 0x184e4: 0xe000b3ba, 0x184e5: 0xe000b386, 0x184e6: 0xe000b392, 0x184e7: 0xe000b35a, + 0x184e8: 0xe000b37e, 0x184e9: 0xe000b3a6, 0x184ea: 0xe000b3d2, 0x184eb: 0xe000b36e, + 0x184ec: 0xe000b3aa, 0x184ed: 0xe000b38e, 0x184ee: 0xe000b37a, 0x184ef: 0xe000b3b6, + 0x184f0: 0xe000b39a, 0x184f1: 0xe000b3da, 0x184f2: 0xe000b3ce, 0x184f3: 0xe000b3a2, + 0x184f4: 0xe000b38a, 0x184f5: 0xe000b3b2, 0x184f6: 0xe000b35e, 0x184f7: 0xe000b3de, + 0x184f8: 0xe000b382, 0x184f9: 0xe000b362, 0x184fa: 0xe000b36a, 0x184fb: 0xe000b3c6, + 0x184fc: 0xe000b376, 0x184fd: 0xe000b396, 0x184fe: 0xe000b3e2, 0x184ff: 0xe000b3be, + // Block 0x614, offset 0x18500 + 0x18500: 0xe000b372, 0x18501: 0xe000b3c2, 0x18502: 0xe000b3e6, 0x18503: 0xe000b3d6, + 0x18504: 0x2cf20683, 0x18505: 0x2d200c83, 0x18506: 0x2cf17a83, 0x18507: 0x2d32e283, + 0x18508: 0xe00002e3, 0x18509: 0xe00003d8, 0x1850a: 0xe00004b3, 0x1850b: 0xe000057d, + 0x1850c: 0xe0000648, 0x1850d: 0xe00006f0, 0x1850e: 0xe000079c, 0x1850f: 0xe0000841, + 0x18510: 0xe0000ec0, 0x18511: 0xf0000606, 0x18512: 0xf0000606, 0x18513: 0xf0000606, + 0x18514: 0xf0000606, 0x18515: 0xf0000606, 0x18516: 0xf0000606, 0x18517: 0xf0000606, + 0x18518: 0xf0000606, 0x18519: 0xf0000606, 0x1851a: 0xf0000606, 0x1851b: 0xf0000606, + 0x1851c: 0xf0000606, 0x1851d: 0xf0000606, 0x1851e: 0xf0000606, 0x1851f: 0xf0000606, + 0x18520: 0x0062ac86, 0x18521: 0x0062b086, 0x18522: 0x0062b286, 0x18523: 0x0062b686, + 0x18524: 0x0062b886, 0x18525: 0x0062ba86, 0x18526: 0x0062be86, 0x18527: 0x0062c286, + 0x18528: 0x0062c486, 0x18529: 0x0062c886, 0x1852a: 0x0062ca86, 0x1852b: 0x0062cc86, + 0x1852c: 0x0062ce86, 0x1852d: 0x0062d086, 0x1852e: 0xf0000606, 0x1852f: 0xf0000606, + 0x18530: 0xf0000606, 0x18531: 0xf0000606, 0x18532: 0xf0000606, 0x18533: 0xf0000606, + 0x18534: 0xf0000606, 0x18535: 0xf0000606, 0x18536: 0xf0000606, 0x18537: 0xf0000606, + 0x18538: 0xf0000606, 0x18539: 0xf0000606, 0x1853a: 0xf0000606, 0x1853b: 0xf0000606, + 0x1853c: 0xe0002127, 0x1853d: 0xe0002122, 0x1853e: 0xf0000606, 0x1853f: 0x4027ac20, + // Block 0x615, offset 0x18540 + 0x18540: 0x2d13b684, 0x18541: 0x2c37b484, 0x18542: 0x2cc9f284, 0x18543: 0x2cd87483, + 0x18544: 0x2cf41483, 0x18545: 0x2c8f2483, 0x18546: 0x2cb4c683, 0x18547: 0x2c030a83, + 0x18548: 0x2c6f9a83, 0x18549: 0x2cd22483, 0x1854a: 0x2d266884, 0x1854b: 0x2c5d8483, + 0x1854c: 0x2cd70283, 0x1854d: 0x2ca25c83, 0x1854e: 0x2c6c2e83, 0x1854f: 0x2ce91083, + 0x18550: 0x2cc63683, 0x18551: 0x2d399283, 0x18552: 0x2d1f9884, 0x18553: 0x2ccf3683, + 0x18554: 0x2c9fe683, 0x18555: 0x2ce27083, 0x18556: 0x2c110e83, 0x18557: 0x2d3ac683, + 0x18558: 0x2c814083, 0x18559: 0x2c9d3483, 0x1855a: 0x2ca3e283, 0x1855b: 0x2caa6e83, + 0x1855c: 0x2cd3bc83, 0x1855d: 0x2d1eb483, 0x1855e: 0x2d1b3683, 0x1855f: 0x2d3ab083, + 0x18560: 0x2cfe3a83, 0x18561: 0x2d04b283, 0x18562: 0x2d013e83, 0x18563: 0x2d333683, + 0x18564: 0x2cce4883, 0x18565: 0x2d378284, 0x18566: 0x2cfa2683, 0x18567: 0x2d426084, + 0x18568: 0x2d200884, 0x18569: 0x2d13c083, 0x1856a: 0x2d3f7083, 0x1856b: 0x2d08f883, + 0x1856c: 0x2c64ca83, 0x1856d: 0x2cb6c883, 0x1856e: 0x2d3e6083, 0x1856f: 0x2d007083, + 0x18570: 0x2d12ca83, 0x18571: 0xf0000606, 0x18572: 0xf0000606, 0x18573: 0xf0000606, + 0x18574: 0xf0000606, 0x18575: 0xf0000606, 0x18576: 0xf0000606, 0x18577: 0xf0000606, + 0x18578: 0xf0000606, 0x18579: 0xf0000606, 0x1857a: 0xf0000606, 0x1857b: 0xf0000606, + 0x1857c: 0xf0000606, 0x1857d: 0xf0000606, 0x1857e: 0xf0000606, 0x1857f: 0xf0000606, + // Block 0x616, offset 0x18580 + 0x18580: 0xf0000203, 0x18581: 0xf0000203, 0x18582: 0xf0000203, 0x18583: 0xf0000203, + 0x18584: 0xf0000203, 0x18585: 0xf0000203, 0x18586: 0xf0000203, 0x18587: 0xf0000203, + 0x18588: 0xf0000203, 0x18589: 0xe000b416, 0x1858a: 0xe000b422, 0x1858b: 0xe000b42e, + 0x1858c: 0xf0001c1d, 0x1858d: 0xe0000b85, 0x1858e: 0xf0001d1c, 0x1858f: 0xe0000d14, + 0x18590: 0x00657693, 0x18591: 0x00657893, 0x18592: 0x00657a93, 0x18593: 0x00657e93, + 0x18594: 0x00658093, 0x18595: 0x00658293, 0x18596: 0x00658493, 0x18597: 0x00658693, + 0x18598: 0x00658893, 0x18599: 0x00658a93, 0x1859a: 0x00658c93, 0x1859b: 0x00658e93, + 0x1859c: 0x00659093, 0x1859d: 0x00659293, 0x1859e: 0x00659493, 0x1859f: 0x00659693, + 0x185a0: 0x00659893, 0x185a1: 0x00659a93, 0x185a2: 0x00659c93, 0x185a3: 0x00659e93, + 0x185a4: 0x0065a093, 0x185a5: 0x0065a293, 0x185a6: 0x0065a493, 0x185a7: 0x0065a693, + 0x185a8: 0x0065a893, 0x185a9: 0x0065aa93, 0x185aa: 0x0065ac93, 0x185ab: 0x0065ae93, + 0x185ac: 0x0065b093, 0x185ad: 0x0065b293, 0x185ae: 0x0065b493, 0x185af: 0x0065b693, + 0x185b0: 0x0065b893, 0x185b1: 0x0065ba93, 0x185b2: 0x0065bc93, 0x185b3: 0x0065be93, + 0x185b4: 0x0065c093, 0x185b5: 0x0065c493, 0x185b6: 0x0065c693, 0x185b7: 0x0065c893, + 0x185b8: 0x0065ca93, 0x185b9: 0x0065cc93, 0x185ba: 0x0065ce93, 0x185bb: 0x0065d093, + 0x185bc: 0x0065d293, 0x185bd: 0x0065d493, 0x185be: 0x0065d693, + // Block 0x617, offset 0x185c0 + 0x185c0: 0xe000230b, 0x185c1: 0xe00022f8, 0x185c2: 0xe00022fc, 0x185c3: 0xe0002311, + 0x185c4: 0xe0002316, 0x185c5: 0xe000231d, 0x185c6: 0xe0002321, 0x185c7: 0xe0002325, + 0x185c8: 0xe000232b, 0x185c9: 0xf0001c1c, 0x185ca: 0xe0002330, 0x185cb: 0xe000233c, + 0x185cc: 0xe0002340, 0x185cd: 0xe0002337, 0x185ce: 0xe0002346, 0x185cf: 0xe000234b, + 0x185d0: 0xe000234f, 0x185d1: 0xe0002353, 0x185d2: 0xf0001c1c, 0x185d3: 0xe000235e, + 0x185d4: 0xe0002358, 0x185d5: 0xf0001c1c, 0x185d6: 0xe0002363, 0x185d7: 0xe000236d, + 0x185d8: 0xf0000203, 0x185d9: 0xf0000203, 0x185da: 0xf0000203, 0x185db: 0xf0000203, + 0x185dc: 0xf0000203, 0x185dd: 0xf0000203, 0x185de: 0xf0000203, 0x185df: 0xf0000203, + 0x185e0: 0xf0000203, 0x185e1: 0xf0000203, 0x185e2: 0xe000b40e, 0x185e3: 0xe000b41a, + 0x185e4: 0xe000b426, 0x185e5: 0xe000b432, 0x185e6: 0xe000b43a, 0x185e7: 0xe000b442, + 0x185e8: 0xe000b44a, 0x185e9: 0xe000b452, 0x185ea: 0xe000b45a, 0x185eb: 0xe000b462, + 0x185ec: 0xe000b46a, 0x185ed: 0xe000b472, 0x185ee: 0xe000b47a, 0x185ef: 0xe000b482, + 0x185f0: 0xe000b48a, 0x185f1: 0xe0000c1e, 0x185f2: 0xf0001c1c, 0x185f3: 0xf0001d1d, + 0x185f4: 0xe0000a31, 0x185f5: 0xf0001d1c, 0x185f6: 0xf0001c1c, 0x185f7: 0xf0001c1c, + 0x185f8: 0xe0000ac2, 0x185f9: 0xe0000ac6, 0x185fa: 0xf0001d1d, 0x185fb: 0xf0000203, + 0x185fc: 0xf0000203, 0x185fd: 0xf0000203, 0x185fe: 0xf0000203, 0x185ff: 0xe000b544, + // Block 0x618, offset 0x18600 + 0x18600: 0xf0001d1c, 0x18601: 0xf0001d1d, 0x18602: 0xe00009b7, 0x18603: 0xf0001c1d, + 0x18604: 0xf0001c1c, 0x18605: 0xf0001c1c, 0x18606: 0xe0000a66, 0x18607: 0xe0000a7a, + 0x18608: 0xf0001d1c, 0x18609: 0xf0001c1d, 0x1860a: 0xf0001c1c, 0x1860b: 0xf0001d1d, + 0x1860c: 0xf0001c1c, 0x1860d: 0xf0001d1d, 0x1860e: 0xf0001d1d, 0x1860f: 0xf0001c1c, + 0x18610: 0xf0001c1c, 0x18611: 0xf0001c1c, 0x18612: 0xe0000d0d, 0x18613: 0xf0001c1c, + 0x18614: 0xf0001c1c, 0x18615: 0xe0000d3a, 0x18616: 0xe0000d46, 0x18617: 0xf0001d1d, + 0x18618: 0xe0000eb0, 0x18619: 0xe0000eb8, 0x1861a: 0xf0001d1d, 0x1861b: 0xf0001c1c, + 0x1861c: 0xf0001c1d, 0x1861d: 0xf0001c1d, 0x1861e: 0xe00010b2, 0x1861f: 0xe00009c8, + 0x18620: 0xf0000203, 0x18621: 0xf0000203, 0x18622: 0xf0000203, 0x18623: 0xf0000203, + 0x18624: 0xf0000203, 0x18625: 0xf0000203, 0x18626: 0xf0000203, 0x18627: 0xf0000203, + 0x18628: 0xf0000203, 0x18629: 0xe000b412, 0x1862a: 0xe000b41e, 0x1862b: 0xe000b42a, + 0x1862c: 0xe000b436, 0x1862d: 0xe000b43e, 0x1862e: 0xe000b446, 0x1862f: 0xe000b44e, + 0x18630: 0xe000b456, 0x18631: 0xe000b45e, 0x18632: 0xe000b466, 0x18633: 0xe000b46e, + 0x18634: 0xe000b476, 0x18635: 0xe000b47e, 0x18636: 0xe000b486, 0x18637: 0xe000b48e, + 0x18638: 0xe000b492, 0x18639: 0xe000b496, 0x1863a: 0xe000b49a, 0x1863b: 0xe000b49e, + 0x1863c: 0xe000b4a2, 0x1863d: 0xe000b4a6, 0x1863e: 0xe000b4aa, 0x1863f: 0xe0000bdf, + // Block 0x619, offset 0x18640 + 0x18640: 0x6cbf9220, 0x18641: 0x6ce52c20, + 0x18644: 0x6c7ae020, 0x18645: 0x6cf41220, 0x18646: 0x6d1ac620, + 0x1864c: 0x6d144820, + 0x18656: 0x6d006c20, + 0x1865c: 0x6c1d9020, + 0x18661: 0x6caae820, + 0x18664: 0x6c27da20, + 0x18668: 0x6d067820, 0x18669: 0x6d03c420, 0x1866b: 0x6d044c20, + 0x1866c: 0x6c8e4020, 0x1866d: 0x6c8c1820, 0x1866e: 0x6cfd7e20, 0x1866f: 0x6d1dbe20, + 0x18670: 0x6d030e20, 0x18671: 0x6d31ac20, 0x18672: 0x6c272020, 0x18673: 0x6cf49420, + 0x18674: 0x6cac3820, 0x18677: 0x6c968e20, + 0x18678: 0x6cba3c20, 0x18679: 0x6d165420, 0x1867a: 0x6d1a2020, 0x1867b: 0x6ca58220, + 0x1867c: 0x6c1a7e20, 0x1867d: 0x6c3c1020, + // Block 0x61a, offset 0x18680 + 0x18681: 0x6d3cec20, 0x18682: 0x6c39ba20, 0x18683: 0x6c029620, + 0x18684: 0x6cf41c20, 0x18685: 0x6d427220, 0x18687: 0x6d38f620, + 0x18688: 0x6c304e20, 0x18689: 0x6cda7e20, 0x1868a: 0x6d16a020, 0x1868b: 0x6cbefc20, + 0x1868c: 0x6c7b8220, 0x1868d: 0x6c831e20, 0x1868e: 0x6ca4da20, 0x1868f: 0x6d3aa820, + 0x18690: 0x6cd4a220, + 0x18694: 0x6d062820, 0x18697: 0x6ccfb620, + 0x18698: 0x6c6bc820, 0x18699: 0x6c2e6620, 0x1869a: 0x6caab620, 0x1869b: 0x6cda8420, + 0x1869c: 0x6d16d820, 0x1869d: 0x6c905020, 0x1869e: 0x6d1d3220, 0x1869f: 0x6c081020, + 0x186a3: 0x6c7f9220, + 0x186a4: 0x6c9e7220, 0x186a5: 0x6d171820, 0x186a6: 0x6c85be20, 0x186a7: 0x6c61c020, + 0x186a8: 0x6d223420, 0x186a9: 0x6c953c20, 0x186aa: 0x6c147420, + 0x186ae: 0x6c5ce420, 0x186af: 0x6d063820, + 0x186b0: 0x6c5bb220, 0x186b1: 0x6cc53820, 0x186b3: 0x6d392620, + 0x186b5: 0x6c4ebe20, 0x186b6: 0x6cf88220, 0x186b7: 0x6cdf7420, + 0x186b8: 0x6d10f020, 0x186b9: 0x6c5bba20, 0x186ba: 0x6c75b820, 0x186bb: 0x6c96c020, + 0x186bc: 0x6c94ac20, 0x186bd: 0x6ce0fa20, 0x186be: 0x6d110220, 0x186bf: 0x6d2fba20, + // Block 0x61b, offset 0x186c0 + 0x186c0: 0x6d2cf420, 0x186c1: 0x6d226420, 0x186c2: 0x6d3d7620, 0x186c3: 0x6c37d620, + 0x186c4: 0x6cc4cc20, 0x186c5: 0x6cb70820, 0x186c6: 0x6c1c3e20, 0x186c7: 0x6cf45620, + 0x186c8: 0x6c4eda20, 0x186c9: 0x6ce17820, 0x186ca: 0x6ccb3220, + 0x186cc: 0x6cbf4820, 0x186cd: 0x6c824020, 0x186ce: 0x6cc97c20, + 0x186d1: 0x6c7cda20, 0x186d2: 0x6cb44620, 0x186d3: 0x6cde8a20, + 0x186d4: 0x6cd53020, 0x186d5: 0x6d0f6820, 0x186d6: 0x6cab8a20, 0x186d7: 0x6cdf3620, + 0x186d9: 0x6c9dd220, 0x186da: 0x6d1b7820, 0x186db: 0x6c2e3a20, + 0x186dc: 0x6d228820, 0x186dd: 0x6c9eec20, 0x186de: 0x6c75ee20, 0x186df: 0x6ca7b820, + 0x186e0: 0x6d023a20, 0x186e1: 0x6d1f8820, + 0x186e4: 0x6c185420, 0x186e5: 0x6c3c7620, 0x186e6: 0x6c82f820, 0x186e7: 0x6c874020, + 0x186e9: 0x6c95d420, 0x186eb: 0x6c617420, + 0x186f0: 0x6cc2b020, 0x186f2: 0x6c110220, 0x186f3: 0x6c898420, + 0x186f4: 0x6c475620, 0x186f5: 0x6c994020, 0x186f7: 0x6c489020, + 0x186f8: 0x6cdc2820, 0x186fb: 0x6c996a20, + 0x186fc: 0x6c976220, 0x186fd: 0x6cc29820, 0x186fe: 0x6cd39420, 0x186ff: 0x6c84b620, + // Block 0x61c, offset 0x18700 + 0x18701: 0x6cedee20, 0x18702: 0x6c79d820, 0x18703: 0x6c325420, + 0x18704: 0x6d325a20, 0x18705: 0x6ce62020, + 0x18708: 0x6c0e0620, 0x18709: 0x6c5d9e20, 0x1870a: 0x6c305420, 0x1870b: 0x6c460e20, + 0x1870c: 0x6c195220, 0x1870e: 0x6cbd2020, 0x1870f: 0x6c6f0020, + 0x18710: 0x6c922620, 0x18711: 0x6d042020, 0x18713: 0x6ca3f820, + 0x18714: 0x6d01a220, 0x18716: 0x6c09be20, 0x18717: 0x6c6b0420, + 0x18718: 0x6cda9c20, 0x1871a: 0x6c455220, + 0x1871c: 0x6d200620, 0x1871d: 0x6d03b620, 0x1871e: 0x6cb83c20, 0x1871f: 0x6cafae20, + 0x18720: 0x6c2d3620, 0x18721: 0x6c3f3c20, 0x18722: 0x6c95de20, 0x18723: 0x6cb84220, + 0x18724: 0x6cb84420, 0x18725: 0x6ce0ba20, 0x18726: 0x6c03fa20, 0x18727: 0x6c418420, + 0x18728: 0x6c222420, 0x18729: 0x6d077e20, 0x1872a: 0x6c80f620, + 0x1872d: 0x6ccf0c20, 0x1872f: 0x6c83a820, + 0x18730: 0x6c578820, 0x18731: 0x6ce7ea20, 0x18732: 0x6cb0f020, 0x18733: 0x6c2b2420, + 0x18734: 0x6cc85e20, 0x18735: 0x6c360820, 0x18736: 0x6cbcb020, 0x18737: 0x6d178c20, + 0x18738: 0x6d3d0020, 0x18739: 0x6cc8cc20, 0x1873a: 0x6c649420, + 0x1873c: 0x6c1c2e20, 0x1873d: 0x6c1d1820, 0x1873e: 0x6cf66220, + // Block 0x61d, offset 0x18740 + 0x18740: 0x6c94b420, 0x18741: 0x6c2aa020, 0x18742: 0x6c8bbe20, 0x18743: 0x6c747020, + 0x18744: 0x6cdae020, 0x18745: 0x6cfffa20, 0x18746: 0x6d299020, + 0x18749: 0x6d3a7620, 0x1874a: 0x6d2e0e20, 0x1874b: 0x6c64f020, + 0x1874c: 0x6d408c20, 0x1874d: 0x6c1fa020, 0x1874e: 0x6d022a20, 0x1874f: 0x6c869820, + 0x18751: 0x6c1c8e20, 0x18752: 0x6cf7b820, 0x18753: 0x6c656020, + 0x18755: 0x6c5fc020, 0x18757: 0x6c3a7c20, + 0x18758: 0x6c1f0620, 0x18759: 0x6c07d420, 0x1875a: 0x6c6a7820, + 0x1875c: 0x6c036c20, 0x1875d: 0x6c898a20, 0x1875e: 0x6c7b1e20, + 0x18760: 0x6cf95e20, 0x18761: 0x6c0ca420, 0x18762: 0x6c747420, 0x18763: 0x6c825c20, + 0x18764: 0x6d035020, 0x18765: 0x6c045820, 0x18766: 0x6d103220, 0x18767: 0x6c940a20, + 0x18768: 0x6c070a20, 0x18769: 0x6c362420, 0x1876a: 0x6c91c220, + 0x1876d: 0x6c181220, 0x1876e: 0x6caad020, 0x1876f: 0x6d07fe20, + 0x18770: 0x6c525220, 0x18771: 0x6d224420, 0x18773: 0x6c4b0620, + 0x18774: 0x6d17dc20, 0x18775: 0x6d085020, 0x18776: 0x6c462c20, 0x18777: 0x6c910020, + 0x18778: 0x6ce2f020, 0x18779: 0x6c820420, 0x1877a: 0x6cd2f820, + 0x1877c: 0x6cdcee20, 0x1877d: 0x6d11ec20, 0x1877e: 0x6cfa6820, 0x1877f: 0x6d408420, + // Block 0x61e, offset 0x18780 + 0x18781: 0x6cc3a220, 0x18782: 0x6d1a2220, 0x18783: 0x6cf56420, + 0x18784: 0x6d34d420, 0x18785: 0x6c639620, 0x18786: 0x6c564e20, 0x18787: 0x6c7e3620, + 0x18788: 0x6d15c620, 0x18789: 0x6c788020, 0x1878a: 0x6c3d4620, 0x1878b: 0x6cbd6020, + 0x1878c: 0x6c009220, 0x1878e: 0x6c78ac20, 0x1878f: 0x6c1e8820, + 0x18790: 0x6d014620, 0x18791: 0x6c1e9a20, 0x18792: 0x6ceeac20, + 0x18795: 0x6c58ea20, 0x18796: 0x6cda8a20, 0x18797: 0x6d203a20, + 0x18799: 0x6c75e020, 0x1879a: 0x6d2f7e20, 0x1879b: 0x6d066620, + 0x1879c: 0x6cd2ac20, 0x1879e: 0x6cd64220, 0x1879f: 0x6c7cea20, + 0x187a0: 0x6cd6a220, 0x187a1: 0x6c515420, 0x187a2: 0x6c414e20, 0x187a3: 0x6d0d3020, + 0x187a4: 0x6cbfec20, 0x187a5: 0x6ccf9820, 0x187a6: 0x6c577a20, 0x187a7: 0x6cf56820, + 0x187a8: 0x6c391820, 0x187a9: 0x6cad2420, 0x187aa: 0x6c281e20, 0x187ab: 0x6c39bc20, + 0x187ac: 0x6c455c20, 0x187ad: 0x6c022620, 0x187ae: 0x6c3f3020, 0x187af: 0x6ca54420, + 0x187b0: 0x6d093a20, 0x187b1: 0x6d1ee420, 0x187b2: 0x6c572620, + 0x187b4: 0x6c189620, 0x187b5: 0x6c4c5420, 0x187b6: 0x6ca2c820, 0x187b7: 0x6c577e20, + 0x187b8: 0x6c858820, 0x187b9: 0x6c37fa20, 0x187ba: 0x6cfe8020, 0x187bb: 0x6cb3ea20, + 0x187bd: 0x6cd88820, + // Block 0x61f, offset 0x187c0 + 0x187c0: 0x6c821c20, 0x187c1: 0x6c8c4820, 0x187c2: 0x6d16dc20, 0x187c3: 0x6c544c20, + 0x187c5: 0x6d068c20, 0x187c6: 0x6cc17620, 0x187c7: 0x6c373a20, + 0x187ca: 0x6d09e220, + 0x187cf: 0x6ca80020, + 0x187d0: 0x6cef9a20, 0x187d1: 0x6d017820, 0x187d2: 0x6ce31420, 0x187d3: 0x6c532620, + 0x187d4: 0x6cea7820, 0x187d5: 0x6ca80220, 0x187d6: 0x6ca80420, 0x187d7: 0x6d1a4020, + 0x187d8: 0x6d313420, + 0x187de: 0x6cec5020, 0x187df: 0x6cd45a20, + 0x187e0: 0x6caaea20, 0x187e1: 0x6d12e420, 0x187e2: 0x6cb5b620, 0x187e3: 0x6ce82620, + 0x187e4: 0x6c4df820, 0x187e5: 0x6c75ac20, 0x187e6: 0x6c302c20, 0x187e7: 0x6c5cba20, + 0x187e8: 0x6c923220, 0x187e9: 0x6c707a20, 0x187ea: 0x6c5db820, 0x187eb: 0x6c8cdc20, + 0x187ed: 0x6ce4e420, 0x187ee: 0x6c94e820, + 0x187f5: 0x6c43e220, 0x187f6: 0x6d0c0620, 0x187f7: 0x6cd26420, + 0x187f8: 0x6d090c20, 0x187f9: 0x6cae3020, 0x187fa: 0x6c217820, 0x187fb: 0x6ca96c20, + 0x187fc: 0x6c348a20, 0x187fd: 0x6d2aca20, 0x187fe: 0x6c362820, 0x187ff: 0x6d00a820, + // Block 0x620, offset 0x18800 + 0x18800: 0x6d1ea020, 0x18801: 0x6c362a20, 0x18802: 0x6cd13420, 0x18803: 0x6cf1dc20, + 0x18804: 0x6c7a3e20, 0x18805: 0x6c555020, 0x18806: 0x6c43e620, 0x18807: 0x6cf9c020, + 0x18808: 0x6c97dc20, 0x18809: 0x6c94a820, 0x1880a: 0x6c602a20, 0x1880b: 0x6c53f620, + 0x1880c: 0x6d361620, 0x1880f: 0x6cec5420, + 0x18811: 0x6c046820, 0x18812: 0x6c00a020, 0x18813: 0x6d3c6220, + 0x18814: 0x6cb8ec20, 0x18815: 0x6c46ac20, 0x18816: 0x6c289220, 0x18817: 0x6c06a820, + 0x18818: 0x6c0f0e20, 0x18819: 0x6c1e6020, 0x1881a: 0x6c862820, 0x1881b: 0x6cfff620, + 0x1881c: 0x6d054020, + 0x18822: 0x6c537020, 0x18823: 0x6ce40620, + 0x18824: 0x6c244220, 0x18825: 0x6c7e0a20, 0x18826: 0x6c816020, 0x18827: 0x6d367820, + 0x18828: 0x6d004e20, 0x18829: 0x6cf66620, 0x1882b: 0x6cbcce20, + 0x1882c: 0x6d2be820, 0x1882d: 0x6cf66820, + 0x18830: 0x6c23a220, 0x18831: 0x6c607a20, 0x18832: 0x6c5dec20, 0x18833: 0x6cde1220, + 0x18834: 0x6d0cbe20, 0x18835: 0x6d072420, 0x18836: 0x6cb31c20, 0x18837: 0x6cc9dc20, + 0x1883b: 0x6c4c3a20, + 0x1883c: 0x6d133620, 0x1883d: 0x6cfdfe20, 0x1883e: 0x6d08e620, 0x1883f: 0x6c516c20, + // Block 0x621, offset 0x18840 + 0x18840: 0x6d42aa20, 0x18841: 0x6d188020, 0x18842: 0x6c226620, + 0x18844: 0x6c837020, 0x18845: 0x6cfba620, 0x18846: 0x6cdf5620, 0x18847: 0x6cc6bc20, + 0x18848: 0x6d18be20, 0x18849: 0x6d372220, 0x1884a: 0x6cf6fe20, 0x1884b: 0x6cfbb420, + 0x1884c: 0x6c72aa20, 0x1884d: 0x6c60d620, 0x1884e: 0x6c4e6820, + 0x18850: 0x6cad9e20, 0x18851: 0x6c86e620, 0x18853: 0x6c7fe020, + 0x18854: 0x6cc9e020, 0x18855: 0x6c4e7020, 0x18856: 0x6d0cfe20, 0x18857: 0x6cc16020, + 0x18859: 0x6d0d1620, 0x1885a: 0x6c4e7420, 0x1885b: 0x6c76ba20, + 0x1885c: 0x6c1bce20, 0x1885d: 0x6ca7e820, 0x1885e: 0x6c5d9620, + 0x18860: 0x6c092820, 0x18861: 0x6cf98a20, 0x18862: 0x6cf24820, 0x18863: 0x6d080420, + 0x18864: 0x6cec9420, 0x18865: 0x6d1f8a20, 0x18866: 0x6cbd4c20, 0x18867: 0x6d066c20, + 0x18868: 0x6ca7f020, 0x18869: 0x6c091620, 0x1886a: 0x6c501020, 0x1886b: 0x6c6e0820, + 0x1886c: 0x6c02bc20, 0x1886d: 0x6c02be20, + 0x18870: 0x6d311e20, 0x18871: 0x6cdf8a20, 0x18872: 0x6c70f220, + 0x18874: 0x6d427a20, 0x18875: 0x6c106220, 0x18876: 0x6c6a8a20, 0x18877: 0x6c009020, + 0x18878: 0x6d29fc20, 0x18879: 0x6c222620, 0x1887a: 0x6c37fc20, + 0x1887f: 0x6ca80620, + // Block 0x622, offset 0x18880 + 0x18880: 0x6c8f2a20, 0x18881: 0x6c99e220, 0x18882: 0x6c334420, 0x18883: 0x6c052020, + 0x18884: 0x6c095a20, 0x18885: 0x6c05ee20, 0x18887: 0x6c1f2c20, + 0x18888: 0x6cfa3620, 0x18889: 0x6ce4e820, 0x1888a: 0x6c16a220, + 0x1888d: 0x6c342420, 0x1888e: 0x6cee7e20, 0x1888f: 0x6c3fea20, + 0x18890: 0x6c348c20, 0x18891: 0x6d225420, 0x18892: 0x6d12ac20, 0x18893: 0x6c7c7620, + 0x18894: 0x6cefb620, 0x18895: 0x6c7b2220, 0x18897: 0x6cee8020, + 0x18898: 0x6d10a420, 0x18899: 0x6c903420, 0x1889a: 0x6d037a20, 0x1889b: 0x6d3b7c20, + 0x1889c: 0x6c1b3020, 0x1889d: 0x6d00b420, 0x1889e: 0x6ca83a20, 0x1889f: 0x6c810020, + 0x188a0: 0x6d13fe20, 0x188a1: 0x6d3f9e20, 0x188a2: 0x6c976a20, 0x188a3: 0x6d2f3820, + 0x188a4: 0x6cfa4220, 0x188a5: 0x6c4bfe20, 0x188a6: 0x6d00c820, + 0x188a8: 0x6c625c20, 0x188a9: 0x6c8a0220, 0x188aa: 0x6d184820, 0x188ab: 0x6c607c20, + 0x188ac: 0x6d1a8e20, 0x188ae: 0x6c266020, 0x188af: 0x6d184a20, + 0x188b0: 0x6d020a20, 0x188b1: 0x6c506220, 0x188b2: 0x6d1e5c20, 0x188b3: 0x6c76ea20, + 0x188b4: 0x6c163220, 0x188b5: 0x6cdf3e20, 0x188b6: 0x6ce13020, 0x188b7: 0x6d34a220, + 0x188b8: 0x6c066e20, 0x188b9: 0x6c9b5220, 0x188ba: 0x6c7ca220, 0x188bb: 0x6c153620, + 0x188bc: 0x6c82e020, 0x188be: 0x6cf91220, + // Block 0x623, offset 0x188c0 + 0x188c0: 0x6cf72820, 0x188c1: 0x6cbc7220, 0x188c2: 0x6ca47e20, 0x188c3: 0x6d274e20, + 0x188c5: 0x6c8f7220, 0x188c6: 0x6c3fbe20, 0x188c7: 0x6d3f7220, + 0x188c9: 0x6c475e20, 0x188ca: 0x6c762820, 0x188cb: 0x6c2dd420, + 0x188cc: 0x6c57aa20, 0x188cd: 0x6c7ce020, 0x188cf: 0x6c42fc20, + 0x188d0: 0x6ce26020, 0x188d2: 0x6ccd2a20, 0x188d3: 0x6c7f3a20, + 0x188d4: 0x6ca7f420, 0x188d5: 0x6c3de220, 0x188d6: 0x6c42fe20, 0x188d7: 0x6cbc8420, + 0x188d8: 0x6c04e420, 0x188d9: 0x6c632620, 0x188da: 0x6c796a20, 0x188db: 0x6cf85620, + 0x188dc: 0x6d230820, 0x188dd: 0x6d3c5a20, 0x188de: 0x6cd05820, 0x188df: 0x6c21ba20, + 0x188e0: 0x6cfed420, 0x188e1: 0x6c615220, 0x188e2: 0x6caa3820, 0x188e3: 0x6cff6a20, + 0x188e4: 0x6d165a20, 0x188e5: 0x6d20a820, 0x188e6: 0x6d145420, 0x188e7: 0x6d0d3620, + 0x188e8: 0x6cd04020, 0x188e9: 0x6cc4aa20, 0x188ea: 0x6c501220, 0x188eb: 0x6cc96620, + 0x188ec: 0x6c755820, 0x188ed: 0x6d1ee820, 0x188ef: 0x6d02fc20, + 0x188f0: 0x6cadae20, 0x188f1: 0x6cbfa020, 0x188f2: 0x6c14b820, + 0x188f4: 0x6c106420, 0x188f5: 0x6c2fdc20, 0x188f6: 0x6cd88a20, 0x188f7: 0x6c378620, + 0x188f9: 0x6c992820, 0x188fa: 0x6d281820, 0x188fb: 0x6c5e8a20, + 0x188fd: 0x6cbc1e20, 0x188fe: 0x6d045820, 0x188ff: 0x6cad4a20, + // Block 0x624, offset 0x18900 + 0x18900: 0x6c1e7420, 0x18901: 0x6cae5220, 0x18902: 0x6caad620, 0x18903: 0x6c6a8c20, + 0x18904: 0x6d13d420, 0x18905: 0x6c37c220, 0x18906: 0x6c34d420, + 0x1890a: 0x6c347c20, + 0x1890d: 0x6cbca420, 0x1890e: 0x6c938220, 0x1890f: 0x6cc02620, + 0x18910: 0x6cda1020, 0x18911: 0x6c11f020, 0x18912: 0x6c310020, 0x18913: 0x6cf5b820, + 0x18914: 0x6c3c2e20, 0x18915: 0x6d172220, 0x18916: 0x6cdd0e20, 0x18917: 0x6cbc7a20, + 0x18918: 0x6cb37620, 0x18919: 0x6d02c020, 0x1891a: 0x6ce7b020, 0x1891b: 0x6d032820, + 0x1891c: 0x6d1f1220, 0x1891d: 0x6c06fe20, 0x1891e: 0x6c905820, + 0x18923: 0x6d279820, + 0x18924: 0x6c83ac20, 0x18925: 0x6cde4420, 0x18926: 0x6c802620, 0x18927: 0x6c97b820, + 0x18928: 0x6cbb3a20, 0x18929: 0x6d38d220, 0x1892a: 0x6d0e5c20, 0x1892b: 0x6cf5de20, + 0x1892c: 0x6c923620, 0x1892d: 0x6cf5e020, 0x1892e: 0x6ccae220, 0x1892f: 0x6c395220, + 0x18931: 0x6cefb820, 0x18932: 0x6c383a20, 0x18933: 0x6d179020, + 0x18934: 0x6ca4f420, 0x18935: 0x6c196c20, 0x18936: 0x6ce09820, 0x18937: 0x6c5ec620, + 0x18938: 0x6cd5d020, 0x18939: 0x6cb10e20, 0x1893a: 0x6c012e20, 0x1893b: 0x6c7ac420, + 0x1893c: 0x6c139820, 0x1893e: 0x6cfb5a20, 0x1893f: 0x6d361c20, + // Block 0x625, offset 0x18940 + 0x18942: 0x6c3c4820, 0x18943: 0x6c88f420, + 0x18944: 0x6d0a0a20, 0x18945: 0x6d06ee20, 0x18946: 0x6c9d5020, 0x18947: 0x6c5bd620, + 0x18948: 0x6ca29220, 0x18949: 0x6d1d8c20, 0x1894a: 0x6d2df420, 0x1894b: 0x6d17de20, + 0x1894c: 0x6caa1e20, 0x1894d: 0x6ce10020, 0x1894e: 0x6cf63e20, 0x1894f: 0x6d27ac20, + 0x18950: 0x6cd5e220, 0x18951: 0x6c3e9420, 0x18952: 0x6d17e020, 0x18953: 0x6c26b020, + 0x18955: 0x6c881e20, 0x18956: 0x6c127a20, 0x18957: 0x6c116e20, + 0x18958: 0x6c725e20, 0x18959: 0x6c927a20, 0x1895a: 0x6cdae220, 0x1895b: 0x6ca59a20, + 0x1895c: 0x6c02dc20, 0x1895d: 0x6c018c20, 0x1895e: 0x6cba6420, + 0x18960: 0x6c24d420, 0x18961: 0x6c232420, 0x18963: 0x6cc48220, + 0x18964: 0x6ca73220, 0x18965: 0x6c96fe20, 0x18966: 0x6d030220, 0x18967: 0x6d26e020, + 0x18968: 0x6ca38220, 0x18969: 0x6c02ee20, 0x1896a: 0x6cd01620, 0x1896b: 0x6c96dc20, + 0x1896e: 0x6c807a20, 0x1896f: 0x6cf6e620, + 0x18970: 0x6d26f820, 0x18971: 0x6d372620, 0x18972: 0x6cf26420, 0x18973: 0x6c57f620, + 0x18974: 0x6c9c1820, 0x18975: 0x6ca7bc20, 0x18976: 0x6ced6620, 0x18977: 0x6c9c9c20, + 0x18978: 0x6ca89e20, 0x18979: 0x6cc1f820, 0x1897a: 0x6d29b820, 0x1897b: 0x6c893e20, + 0x1897c: 0x6d34c620, 0x1897d: 0x6d3eda20, 0x1897e: 0x6c4d1a20, 0x1897f: 0x6d066e20, + // Block 0x626, offset 0x18980 + 0x18980: 0x6c501820, 0x18981: 0x6d078020, 0x18982: 0x6d35b020, 0x18983: 0x6c9e1220, + 0x18984: 0x6c214820, 0x18985: 0x6c46b020, 0x18987: 0x6c216020, + 0x18988: 0x6c946a20, 0x18989: 0x6d3a9820, 0x1898a: 0x6cd43820, 0x1898b: 0x6c8a5e20, + 0x1898c: 0x6c6fcc20, 0x1898d: 0x6d014020, 0x1898e: 0x6c2f9220, 0x1898f: 0x6c6bae20, + 0x18990: 0x6cc65220, 0x18991: 0x6c982e20, 0x18993: 0x6c788a20, + 0x18994: 0x6d119620, 0x18995: 0x6ca8fc20, 0x18996: 0x6d148e20, 0x18997: 0x6c80a620, + 0x18998: 0x6d1df020, 0x18999: 0x6d1a4420, 0x1899a: 0x6d0c7e20, 0x1899b: 0x6cda9e20, + 0x1899d: 0x6c8baa20, 0x1899e: 0x6d0aec20, 0x1899f: 0x6c98d820, + 0x189a0: 0x6c9ff420, 0x189a1: 0x6d41aa20, 0x189a2: 0x6d225620, 0x189a3: 0x6d179220, + 0x189a4: 0x6c46b220, 0x189a5: 0x6c9cfa20, 0x189a6: 0x6c75c820, 0x189a7: 0x6cf1e420, + 0x189a9: 0x6c773a20, 0x189aa: 0x6c2d7020, 0x189ab: 0x6c8f9820, + 0x189ad: 0x6d040620, 0x189ae: 0x6c255420, 0x189af: 0x6cbbec20, + 0x189b0: 0x6c9dde20, 0x189b1: 0x6c9c1c20, 0x189b2: 0x6cbdf420, + 0x189b4: 0x6cecc220, 0x189b5: 0x6c2a5e20, 0x189b6: 0x6c009420, + 0x189b8: 0x6c0b8c20, 0x189b9: 0x6ca9fe20, 0x189ba: 0x6c882020, 0x189bb: 0x6c6caa20, + 0x189bc: 0x6d207020, 0x189bd: 0x6c20bc20, 0x189be: 0x6d426420, 0x189bf: 0x6c0fe020, + // Block 0x627, offset 0x189c0 + 0x189c0: 0x6c5a9020, 0x189c1: 0x6d11f020, 0x189c2: 0x6ce9e020, 0x189c3: 0x6c61e220, + 0x189c4: 0x6c012420, 0x189c5: 0x6c95fa20, 0x189c6: 0x6c613220, 0x189c7: 0x6cefba20, + 0x189c8: 0x6c0e7420, 0x189c9: 0x6d289020, 0x189ca: 0x6d06f020, 0x189cb: 0x6ca71220, + 0x189cc: 0x6d281420, 0x189ce: 0x6c039820, 0x189cf: 0x6d301a20, + 0x189d0: 0x6c705420, 0x189d1: 0x6cef9020, 0x189d2: 0x6d016e20, 0x189d3: 0x6cb75420, + 0x189d4: 0x6d149020, 0x189d5: 0x6d017020, 0x189d6: 0x6c222a20, 0x189d7: 0x6cc02820, + 0x189d8: 0x6c316a20, 0x189d9: 0x6ca7d420, 0x189da: 0x6cb78a20, 0x189db: 0x6c613c20, + 0x189dc: 0x6ce99420, 0x189de: 0x6cd94c20, 0x189df: 0x6c2d7420, + 0x189e0: 0x6c816820, 0x189e1: 0x6d2e2c20, + 0x189e4: 0x6d1a1c20, 0x189e5: 0x6c132620, 0x189e6: 0x6c611220, 0x189e7: 0x6c5b8620, + 0x189e8: 0x6d3ede20, 0x189e9: 0x6c7f8820, 0x189ea: 0x6ca49020, 0x189eb: 0x6c71f020, + 0x189ec: 0x6cbdfc20, 0x189ed: 0x6c272620, 0x189ef: 0x6c6a6020, + 0x189f0: 0x6d062620, 0x189f1: 0x6c22fa20, 0x189f2: 0x6d1e6e20, 0x189f3: 0x6c30d820, + 0x189f4: 0x6c1afe20, 0x189f6: 0x6c9f9020, 0x189f7: 0x6c59a820, + 0x189f8: 0x6cdc2020, 0x189f9: 0x6c785620, 0x189fa: 0x6d40aa20, 0x189fb: 0x6c501a20, + 0x189fc: 0x6c19ba20, 0x189fd: 0x6d094220, 0x189fe: 0x6ca5bc20, 0x189ff: 0x6c1bec20, + // Block 0x628, offset 0x18a00 + 0x18a00: 0x6c87f020, 0x18a01: 0x6c01a020, 0x18a02: 0x6ca22a20, 0x18a03: 0x6cd7ca20, + 0x18a04: 0x6cfdb220, 0x18a05: 0x6d0f9020, 0x18a06: 0x6c572c20, 0x18a07: 0x6c261620, + 0x18a08: 0x6cc02a20, 0x18a09: 0x6c814c20, 0x18a0a: 0x6c3e2e20, 0x18a0b: 0x6c334620, + 0x18a0c: 0x6c984c20, 0x18a0d: 0x6c80a820, 0x18a0e: 0x6ceb7220, 0x18a0f: 0x6c4df220, + 0x18a10: 0x6c988820, 0x18a11: 0x6c0ed220, 0x18a12: 0x6cc43220, 0x18a13: 0x6cb59e20, + 0x18a14: 0x6c4df420, 0x18a16: 0x6c905c20, + 0x18a18: 0x6ce57e20, 0x18a19: 0x6d2aba20, 0x18a1a: 0x6cb5ba20, 0x18a1b: 0x6d298a20, + 0x18a1c: 0x6c9c4620, 0x18a1d: 0x6cadd220, 0x18a1e: 0x6d2e5620, 0x18a1f: 0x6cfe2c20, + 0x18a20: 0x6c429c20, 0x18a22: 0x6cb5bc20, + 0x18a24: 0x6c923820, 0x18a26: 0x6d283020, 0x18a27: 0x6c362e20, + 0x18a28: 0x6c329a20, 0x18a29: 0x6c9f5020, 0x18a2a: 0x6cee8420, 0x18a2b: 0x6cc2ec20, + 0x18a2c: 0x6cda1c20, 0x18a2d: 0x6c9f5220, 0x18a2e: 0x6ce85e20, + 0x18a30: 0x6ca03620, 0x18a31: 0x6d11b420, 0x18a32: 0x6c746220, 0x18a33: 0x6c862c20, + 0x18a34: 0x6c7b2620, 0x18a35: 0x6c42a420, 0x18a36: 0x6d257e20, 0x18a37: 0x6c26fa20, + 0x18a39: 0x6c816220, 0x18a3a: 0x6c909c20, 0x18a3b: 0x6cba6620, + 0x18a3c: 0x6c025c20, 0x18a3d: 0x6c0c7620, 0x18a3e: 0x6d1d9a20, 0x18a3f: 0x6c989820, + // Block 0x629, offset 0x18a40 + 0x18a40: 0x6c29e020, 0x18a42: 0x6c025e20, + 0x18a44: 0x6cf78e20, 0x18a45: 0x6c3ed420, 0x18a46: 0x6c27f820, 0x18a47: 0x6c701420, + 0x18a48: 0x6cc90220, 0x18a49: 0x6ce77a20, 0x18a4a: 0x6cc13220, 0x18a4b: 0x6c368220, + 0x18a4c: 0x6cb51a20, 0x18a4d: 0x6c607e20, 0x18a4e: 0x6c608020, 0x18a4f: 0x6c574c20, + 0x18a50: 0x6c69b820, 0x18a51: 0x6d41cc20, 0x18a52: 0x6c0c7a20, 0x18a53: 0x6c9b4620, + 0x18a54: 0x6c045620, 0x18a55: 0x6cf01420, 0x18a56: 0x6d160e20, 0x18a57: 0x6c02f020, + 0x18a58: 0x6d229e20, 0x18a59: 0x6c4ff020, 0x18a5a: 0x6c336620, 0x18a5b: 0x6cf31a20, + 0x18a5c: 0x6ca6d620, 0x18a5d: 0x6c249e20, 0x18a5f: 0x6c846e20, + 0x18a60: 0x6c916c20, 0x18a61: 0x6ca7be20, 0x18a62: 0x6c57f820, 0x18a63: 0x6c86f020, + 0x18a65: 0x6c941c20, 0x18a66: 0x6c3c7e20, 0x18a67: 0x6c9d0c20, + 0x18a68: 0x6d249e20, 0x18a6a: 0x6c71e620, + 0x18a6d: 0x6d2dec20, 0x18a6e: 0x6cae8220, 0x18a6f: 0x6d15b220, + 0x18a71: 0x6c61e420, 0x18a72: 0x6c08ae20, + 0x18a74: 0x6cc5b420, 0x18a75: 0x6c597220, 0x18a76: 0x6c388020, 0x18a77: 0x6c43c220, + 0x18a78: 0x6c7a8020, 0x18a79: 0x6c6bb420, 0x18a7a: 0x6ccbc220, + 0x18a7c: 0x6cd7c220, 0x18a7d: 0x6ce71620, 0x18a7e: 0x6d24c820, 0x18a7f: 0x6d3e0420, + // Block 0x62a, offset 0x18a80 + 0x18a80: 0x6c092c20, 0x18a81: 0x6c7ad820, 0x18a82: 0x6c859e20, 0x18a83: 0x6c598220, + 0x18a84: 0x6d09e620, 0x18a85: 0x6caad820, 0x18a87: 0x6d303820, + 0x18a88: 0x6cf20220, 0x18a89: 0x6cfb4420, 0x18a8a: 0x6cb85a20, 0x18a8b: 0x6d127a20, + 0x18a8c: 0x6c996c20, 0x18a8f: 0x6cd5d420, + 0x18a91: 0x6cbb7a20, 0x18a92: 0x6d3cd220, 0x18a93: 0x6c7d6020, + 0x18a94: 0x6cf4ea20, 0x18a95: 0x6d1bb820, 0x18a96: 0x6c207220, 0x18a97: 0x6ce33e20, + 0x18a98: 0x6c880e20, 0x18a99: 0x6c087820, 0x18a9a: 0x6c464e20, 0x18a9b: 0x6c986820, + 0x18a9c: 0x6d01d020, 0x18a9d: 0x6c3cec20, 0x18a9e: 0x6c909e20, 0x18a9f: 0x6d2a1820, + 0x18aa0: 0x6d335e20, 0x18aa1: 0x6c1ea220, 0x18aa2: 0x6c980020, 0x18aa3: 0x6c8faa20, + 0x18aa5: 0x6d1b8620, 0x18aa6: 0x6cb1f020, 0x18aa7: 0x6d337020, + 0x18aa8: 0x6c653020, 0x18aa9: 0x6c945420, 0x18aaa: 0x6ca7e420, 0x18aab: 0x6d179a20, + 0x18aad: 0x6c623420, 0x18aae: 0x6c60a420, 0x18aaf: 0x6d2d1a20, + 0x18ab0: 0x6d221a20, 0x18ab1: 0x6c6fa620, 0x18ab2: 0x6c585620, 0x18ab3: 0x6d34e220, + 0x18ab4: 0x6c7e3c20, 0x18ab5: 0x6c8ca820, 0x18ab6: 0x6d34f020, 0x18ab7: 0x6c079420, + 0x18ab8: 0x6d2cae20, 0x18ab9: 0x6c705820, 0x18aba: 0x6c286620, 0x18abb: 0x6c8a9020, + 0x18abc: 0x6d16e820, 0x18abd: 0x6d2fa020, 0x18abe: 0x6cfc8e20, 0x18abf: 0x6c1bf820, + // Block 0x62b, offset 0x18ac0 + 0x18ac0: 0x6c22ba20, 0x18ac1: 0x6c1b8420, 0x18ac2: 0x6d0d5420, 0x18ac3: 0x6c80aa20, + 0x18ac4: 0x6c310220, 0x18ac5: 0x6c905e20, 0x18ac6: 0x6c14ec20, + 0x18ac8: 0x6ce9a020, 0x18ac9: 0x6c13da20, 0x18aca: 0x6c006620, 0x18acb: 0x6c1b9c20, + 0x18acd: 0x6d1cec20, 0x18ace: 0x6d305a20, 0x18acf: 0x6ce7ee20, + 0x18ad1: 0x6ce9a620, 0x18ad2: 0x6c13f420, 0x18ad3: 0x6d11be20, + 0x18ad4: 0x6d3ffe20, 0x18ad6: 0x6cac4020, 0x18ad7: 0x6cbc5620, + 0x18ad8: 0x6c883220, 0x18ad9: 0x6cbd9c20, 0x18ada: 0x6c91d820, 0x18adb: 0x6d0eb820, + 0x18adc: 0x6c778e20, 0x18add: 0x6cda5e20, 0x18ade: 0x6d192820, 0x18adf: 0x6c14b420, + 0x18ae0: 0x6c6ef620, 0x18ae1: 0x6c67b020, 0x18ae3: 0x6c6ea820, + 0x18ae5: 0x6c305c20, 0x18ae7: 0x6c733620, + 0x18ae8: 0x6c4e8420, 0x18ae9: 0x6c2c1020, + 0x18aec: 0x6c52f620, 0x18aee: 0x6c1b0820, 0x18aef: 0x6c2dae20, + 0x18af0: 0x6c093020, 0x18af2: 0x6d0a6e20, 0x18af3: 0x6c913e20, + 0x18af5: 0x6d007e20, 0x18af6: 0x6c094420, + 0x18af8: 0x6c095c20, 0x18afa: 0x6cfb4620, 0x18afb: 0x6cc8c820, + 0x18afc: 0x6c0d1420, 0x18afd: 0x6c379620, 0x18afe: 0x6c736220, + // Block 0x62c, offset 0x18b00 + 0x18b00: 0x6d324820, 0x18b01: 0x6c072e20, 0x18b02: 0x6c365620, 0x18b03: 0x6d227a20, + 0x18b04: 0x6cc1b220, 0x18b05: 0x6d299420, 0x18b06: 0x6c9ca820, 0x18b07: 0x6d16b220, + 0x18b08: 0x6cd8e620, + 0x18b0c: 0x6ccd6e20, 0x18b0d: 0x6cdf1620, 0x18b0e: 0x6ca28220, 0x18b0f: 0x6c6e8220, + 0x18b10: 0x6c0b9620, 0x18b11: 0x6cc68e20, 0x18b12: 0x6c136e20, 0x18b13: 0x6c120220, + 0x18b14: 0x6c2f4820, + 0x18b19: 0x6c2b5620, 0x18b1a: 0x6ce7ac20, 0x18b1b: 0x6cde3220, + 0x18b1c: 0x6d03ce20, 0x18b1d: 0x6cd90a20, 0x18b1e: 0x6c343e20, 0x18b1f: 0x6cf85e20, + 0x18b20: 0x6ce1b220, 0x18b22: 0x6ce31620, 0x18b23: 0x6ccd7820, + 0x18b24: 0x6c667620, 0x18b25: 0x6d35da20, 0x18b26: 0x6cee7220, 0x18b27: 0x6d1b4620, + 0x18b2a: 0x6c58d620, 0x18b2b: 0x6d37f220, + 0x18b2c: 0x6cb78c20, 0x18b2d: 0x6d3f8820, 0x18b2f: 0x6d01c220, + 0x18b30: 0x6d01d220, 0x18b31: 0x6d2ade20, 0x18b32: 0x6cef1e20, + 0x18b35: 0x6cde9820, 0x18b36: 0x6d2d9820, 0x18b37: 0x6ca95820, + 0x18b3b: 0x6d166620, + 0x18b3c: 0x6cc58420, 0x18b3d: 0x6cd59620, 0x18b3e: 0x6c142a20, 0x18b3f: 0x6d3d1e20, + // Block 0x62d, offset 0x18b40 + 0x18b41: 0x6c9e0620, 0x18b42: 0x6c5fdc20, 0x18b43: 0x6c39a420, + 0x18b44: 0x6cadfe20, 0x18b45: 0x6c008e20, 0x18b46: 0x6c392020, 0x18b47: 0x6c029a20, + 0x18b48: 0x6cbe0220, 0x18b49: 0x6cb82220, 0x18b4a: 0x6cffd020, 0x18b4b: 0x6c3b1020, + 0x18b4c: 0x6c417420, 0x18b4d: 0x6cbb6620, 0x18b4e: 0x6c437a20, 0x18b4f: 0x6ce71c20, + 0x18b50: 0x6c14ba20, 0x18b51: 0x6d201620, 0x18b52: 0x6c42b420, 0x18b53: 0x6c07a820, + 0x18b54: 0x6c3fb420, 0x18b55: 0x6c1f0c20, 0x18b56: 0x6d3aac20, + 0x18b58: 0x6d390020, 0x18b5a: 0x6c4f6220, 0x18b5b: 0x6ca8e420, + 0x18b5c: 0x6c73f820, 0x18b5d: 0x6c1cb020, 0x18b5e: 0x6c143820, 0x18b5f: 0x6c799c20, + 0x18b60: 0x6c8ae820, 0x18b61: 0x6c85a020, 0x18b62: 0x6d22e020, + 0x18b64: 0x6d20d620, 0x18b65: 0x6c4d5820, 0x18b66: 0x6c85a220, 0x18b67: 0x6c53ee20, + 0x18b68: 0x6c45d820, 0x18b69: 0x6c789820, 0x18b6a: 0x6d260c20, 0x18b6b: 0x6c2a6220, + 0x18b6c: 0x6c5b9a20, 0x18b6e: 0x6c4a2220, 0x18b6f: 0x6c6f0620, + 0x18b70: 0x6d429a20, 0x18b71: 0x6c3fce20, 0x18b72: 0x6cbcb220, 0x18b73: 0x6c06c820, + 0x18b74: 0x6c180a20, 0x18b75: 0x6c223e20, 0x18b76: 0x6c985020, 0x18b77: 0x6c4d9820, + 0x18b78: 0x6cf86a20, 0x18b79: 0x6cc02e20, 0x18b7a: 0x6c5a4620, + 0x18b7d: 0x6c1d9620, 0x18b7e: 0x6cca4c20, 0x18b7f: 0x6d0bf420, + // Block 0x62e, offset 0x18b80 + 0x18b80: 0x6d345620, 0x18b81: 0x6c2a6c20, 0x18b82: 0x6ce27420, 0x18b83: 0x6c9aec20, + 0x18b84: 0x6c8ce220, 0x18b85: 0x6cd45e20, 0x18b86: 0x6ce9fa20, 0x18b87: 0x6c119220, + 0x18b88: 0x6c2ea020, 0x18b89: 0x6c181420, 0x18b8a: 0x6cae9c20, 0x18b8b: 0x6d13f020, + 0x18b8c: 0x6c711220, 0x18b8d: 0x6c61e820, 0x18b8e: 0x6c7f0620, 0x18b8f: 0x6ce4ea20, + 0x18b90: 0x6d261a20, 0x18b92: 0x6c112820, 0x18b93: 0x6cb4e420, + 0x18b94: 0x6d230e20, 0x18b95: 0x6c880220, 0x18b96: 0x6c231420, + 0x18b9a: 0x6d212020, 0x18b9b: 0x6c603220, + 0x18b9c: 0x6cf09420, 0x18b9d: 0x6c9cf020, 0x18b9e: 0x6cdc3e20, 0x18b9f: 0x6d00aa20, + 0x18ba0: 0x6d059620, 0x18ba1: 0x6c1c1c20, 0x18ba2: 0x6cc06020, 0x18ba3: 0x6c5bde20, + 0x18ba5: 0x6d212220, 0x18ba6: 0x6cbcc620, 0x18ba7: 0x6cd74e20, + 0x18ba8: 0x6cd72620, 0x18ba9: 0x6c349020, 0x18baa: 0x6c908820, + 0x18bac: 0x6cad0620, 0x18bad: 0x6cdf7820, 0x18bae: 0x6d393020, 0x18baf: 0x6d1af420, + 0x18bb0: 0x6ccab420, 0x18bb1: 0x6c3a5a20, 0x18bb2: 0x6c187620, 0x18bb3: 0x6d258020, + 0x18bb4: 0x6d151620, 0x18bb5: 0x6c5d2a20, 0x18bb6: 0x6ccb3420, 0x18bb7: 0x6d131020, + 0x18bb8: 0x6c9fbc20, 0x18bb9: 0x6c3bbe20, 0x18bba: 0x6c513620, + 0x18bbc: 0x6d1b6420, 0x18bbd: 0x6c130220, 0x18bbe: 0x6ca6b620, 0x18bbf: 0x6c02e820, + // Block 0x62f, offset 0x18bc0 + 0x18bc0: 0x6c3cb420, 0x18bc1: 0x6c883420, 0x18bc2: 0x6c16be20, 0x18bc3: 0x6c15c820, + 0x18bc4: 0x6c967020, 0x18bc5: 0x6c2e5a20, 0x18bc6: 0x6c54e620, 0x18bc7: 0x6c928020, + 0x18bc9: 0x6d184c20, 0x18bca: 0x6c574e20, 0x18bcb: 0x6d2bf220, + 0x18bcc: 0x6c550020, 0x18bcd: 0x6c368420, 0x18bce: 0x6c5dee20, 0x18bcf: 0x6cdcf820, + 0x18bd0: 0x6ca6bc20, 0x18bd1: 0x6cfcf620, 0x18bd2: 0x6c842620, 0x18bd3: 0x6cfcf820, + 0x18bd4: 0x6d0eba20, 0x18bd5: 0x6c8fa420, 0x18bd6: 0x6c9af620, 0x18bd7: 0x6c6c5c20, + 0x18bd8: 0x6c5f5020, 0x18bda: 0x6c0b5a20, 0x18bdb: 0x6d22a420, + 0x18bdc: 0x6c5e0620, 0x18bdd: 0x6c9ea420, 0x18bde: 0x6c1df220, 0x18bdf: 0x6c970620, + 0x18be1: 0x6c822c20, 0x18be2: 0x6c6b5620, 0x18be3: 0x6cf10a20, + 0x18be4: 0x6d192a20, 0x18be5: 0x6d07e020, 0x18be6: 0x6cf91420, 0x18be7: 0x6c11e220, + 0x18be8: 0x6c7fe420, 0x18be9: 0x6d1b2220, 0x18bea: 0x6d027220, 0x18beb: 0x6d28a620, + 0x18bec: 0x6c95d220, 0x18bed: 0x6c8dd220, 0x18bee: 0x6cb97020, 0x18bef: 0x6c5d9a20, + 0x18bf0: 0x6c646a20, 0x18bf1: 0x6cf2a820, + 0x18bf4: 0x6c43d420, 0x18bf5: 0x6d399020, 0x18bf6: 0x6c2e8220, 0x18bf7: 0x6d1e2c20, + 0x18bf8: 0x6c614220, 0x18bf9: 0x6d0fc020, 0x18bfa: 0x6cc82220, 0x18bfb: 0x6cf79a20, + 0x18bfc: 0x6cd6f020, 0x18bfd: 0x6d240820, 0x18bfe: 0x6d146020, 0x18bff: 0x6cb9f220, + // Block 0x630, offset 0x18c00 + 0x18c00: 0x6c5fde20, 0x18c01: 0x6cc26420, 0x18c02: 0x6ce48a20, 0x18c03: 0x6cd42820, + 0x18c04: 0x6cb9ee20, 0x18c05: 0x6ca26020, 0x18c06: 0x6c6c2620, 0x18c07: 0x6c992420, + 0x18c08: 0x6d1ac820, 0x18c09: 0x6c412a20, 0x18c0a: 0x6cb2ee20, 0x18c0b: 0x6d084020, + 0x18c0c: 0x6c994220, 0x18c0d: 0x6c39c020, 0x18c0e: 0x6d0b1020, 0x18c0f: 0x6c425420, + 0x18c10: 0x6cd95020, 0x18c11: 0x6c5a8a20, 0x18c12: 0x6d22d620, 0x18c13: 0x6c484820, + 0x18c14: 0x6c48e820, 0x18c15: 0x6c8ef820, 0x18c16: 0x6c35de20, 0x18c17: 0x6d3eec20, + 0x18c18: 0x6d3f3220, 0x18c19: 0x6c093820, 0x18c1a: 0x6cec1620, + 0x18c1c: 0x6c8acc20, 0x18c1f: 0x6c7af620, + 0x18c21: 0x6c4d5a20, 0x18c22: 0x6d19b020, 0x18c23: 0x6d398820, + 0x18c24: 0x6c1d4820, 0x18c25: 0x6cfbea20, 0x18c26: 0x6d087420, + 0x18c28: 0x6cc01420, 0x18c29: 0x6cae0c20, 0x18c2a: 0x6c4ad620, 0x18c2b: 0x6c373e20, + 0x18c2c: 0x6c45dc20, 0x18c2d: 0x6cbf0820, 0x18c2e: 0x6c54ac20, 0x18c2f: 0x6c81a620, + 0x18c30: 0x6c85a420, 0x18c31: 0x6c192220, 0x18c32: 0x6cca1620, 0x18c33: 0x6d3df420, + 0x18c34: 0x6cf2ae20, 0x18c35: 0x6cb3d420, 0x18c36: 0x6c793020, 0x18c37: 0x6cea8820, + 0x18c38: 0x6cae5c20, 0x18c39: 0x6ce27620, 0x18c3a: 0x6cde4a20, 0x18c3b: 0x6d3d4c20, + 0x18c3c: 0x6c0c8e20, 0x18c3d: 0x6c480e20, 0x18c3e: 0x6c54be20, + // Block 0x631, offset 0x18c40 + 0x18c40: 0x6c0de020, 0x18c41: 0x6d35de20, 0x18c42: 0x6c302e20, 0x18c43: 0x6c332220, + 0x18c44: 0x6d387220, 0x18c45: 0x6ca58a20, 0x18c46: 0x6c8c1c20, 0x18c47: 0x6cb32a20, + 0x18c48: 0x6c613420, 0x18c49: 0x6c9f5420, 0x18c4a: 0x6cefc220, 0x18c4b: 0x6c17ea20, + 0x18c4c: 0x6c46b620, 0x18c4d: 0x6c053220, 0x18c4e: 0x6cc7aa20, 0x18c4f: 0x6cdfa820, + 0x18c50: 0x6c103a20, 0x18c51: 0x6d3f8c20, 0x18c52: 0x6c7c3c20, 0x18c53: 0x6c815820, + 0x18c54: 0x6c4ec220, 0x18c55: 0x6d1c7020, 0x18c56: 0x6d362620, 0x18c57: 0x6c6ac620, + 0x18c58: 0x6d040220, 0x18c59: 0x6d00b820, 0x18c5a: 0x6d0a1620, 0x18c5b: 0x6ccd4620, + 0x18c5c: 0x6cb9a620, 0x18c5d: 0x6d004620, 0x18c5e: 0x6cdacc20, 0x18c5f: 0x6c4d1820, + 0x18c60: 0x6c9d5820, 0x18c61: 0x6c5cee20, 0x18c62: 0x6caf7220, + 0x18c64: 0x6c5be020, 0x18c65: 0x6ca34c20, 0x18c66: 0x6cd96220, 0x18c67: 0x6c07bc20, + 0x18c68: 0x6c1d7220, 0x18c69: 0x6c6ae220, 0x18c6a: 0x6c5a6e20, 0x18c6b: 0x6c802c20, + 0x18c6d: 0x6c56b420, 0x18c6e: 0x6c30b620, 0x18c6f: 0x6c5de420, + 0x18c70: 0x6c4bd420, 0x18c71: 0x6d111c20, 0x18c72: 0x6c130420, 0x18c73: 0x6c4b1220, + 0x18c74: 0x6c66a620, 0x18c75: 0x6c65c020, 0x18c76: 0x6c29e620, 0x18c77: 0x6c6d2420, + 0x18c78: 0x6c96cc20, 0x18c79: 0x6c5bf820, 0x18c7a: 0x6c9e3420, 0x18c7b: 0x6c11a820, + 0x18c7c: 0x6c94ba20, 0x18c7d: 0x6cb0aa20, 0x18c7e: 0x6d105a20, 0x18c7f: 0x6c726420, + // Block 0x632, offset 0x18c80 + 0x18c80: 0x6c726620, 0x18c81: 0x6cc3dc20, 0x18c83: 0x6cb91220, + 0x18c84: 0x6ccc8e20, 0x18c86: 0x6c701820, 0x18c87: 0x6c5df020, + 0x18c88: 0x6d27fa20, 0x18c89: 0x6c26b820, 0x18c8a: 0x6d07ba20, 0x18c8b: 0x6cff0420, + 0x18c8c: 0x6c3ac620, 0x18c8d: 0x6c131020, 0x18c8e: 0x6d132420, + 0x18c90: 0x6c2a9820, 0x18c92: 0x6cbda020, 0x18c93: 0x6c5b6a20, + 0x18c94: 0x6cea6c20, 0x18c96: 0x6cbb2420, 0x18c97: 0x6cf7a020, + 0x18c98: 0x6ca64a20, 0x18c99: 0x6cc9ce20, 0x18c9a: 0x6c9b5620, 0x18c9b: 0x6ce95e20, + 0x18c9c: 0x6c804220, 0x18c9d: 0x6c4ff220, 0x18c9e: 0x6c22e620, 0x18c9f: 0x6d2d4e20, + 0x18ca0: 0x6c023220, 0x18ca1: 0x6c95c420, 0x18ca2: 0x6c9efa20, + 0x18ca4: 0x6c3daa20, 0x18ca6: 0x6d010c20, 0x18ca7: 0x6c0f8c20, + 0x18ca8: 0x6c5c6820, 0x18ca9: 0x6cbeb820, 0x18caa: 0x6d010e20, + 0x18cad: 0x6c0fa220, 0x18cae: 0x6cb9dc20, 0x18caf: 0x6cb34020, + 0x18cb0: 0x6c696820, 0x18cb1: 0x6c750a20, 0x18cb2: 0x6c7dc620, 0x18cb3: 0x6cd97a20, + 0x18cb4: 0x6c718e20, 0x18cb5: 0x6c36f020, 0x18cb6: 0x6ca8c020, 0x18cb7: 0x6cb95a20, + 0x18cb8: 0x6c2f1a20, 0x18cb9: 0x6c2f1c20, 0x18cbb: 0x6cb4da20, + 0x18cbc: 0x6d33c220, 0x18cbd: 0x6cb5c620, 0x18cbe: 0x6d3c8620, 0x18cbf: 0x6c7a1c20, + // Block 0x633, offset 0x18cc0 + 0x18cc0: 0x6d20b420, 0x18cc1: 0x6cbd5820, 0x18cc2: 0x6c7a2620, 0x18cc3: 0x6c50d420, + 0x18cc4: 0x6c3e0a20, 0x18cc6: 0x6c2be220, 0x18cc7: 0x6cfca620, + 0x18cc8: 0x6c4b3c20, 0x18cc9: 0x6c50ee20, 0x18cca: 0x6cc44620, 0x18ccb: 0x6c4eaa20, + 0x18ccc: 0x6ce7b420, 0x18ccd: 0x6c0ee620, 0x18cce: 0x6ccd3e20, 0x18ccf: 0x6c08de20, + 0x18cd0: 0x6c924e20, 0x18cd1: 0x6d12f020, 0x18cd2: 0x6ca5e220, 0x18cd3: 0x6c1fba20, + 0x18cd4: 0x6cca5020, 0x18cd5: 0x6c2e2820, 0x18cd6: 0x6c925020, 0x18cd7: 0x6ce81220, + 0x18cd8: 0x6c88bc20, 0x18cd9: 0x6c786620, 0x18cda: 0x6cca5220, 0x18cdb: 0x6d31e420, + 0x18cdc: 0x6c1fc020, 0x18cdd: 0x6c890220, 0x18cde: 0x6c998c20, + 0x18ce0: 0x6cb90620, 0x18ce1: 0x6c769220, 0x18ce2: 0x6cceb620, 0x18ce3: 0x6cfeea20, + 0x18ce4: 0x6c0a2020, 0x18ce5: 0x6d2bf420, 0x18ce6: 0x6d1b7220, 0x18ce7: 0x6cf6bc20, + 0x18ce8: 0x6ccdaa20, 0x18ce9: 0x6cdb1220, 0x18cea: 0x6cc98e20, 0x18ceb: 0x6cc8e820, + 0x18cec: 0x6c219c20, 0x18ced: 0x6c917c20, 0x18cee: 0x6c8d9820, 0x18cef: 0x6c13c620, + 0x18cf1: 0x6c593020, + 0x18cf4: 0x6c63a220, 0x18cf5: 0x6c04ee20, 0x18cf6: 0x6c553220, 0x18cf7: 0x6c30ec20, + 0x18cf9: 0x6c90f020, 0x18cfa: 0x6c70d220, 0x18cfb: 0x6c73a620, + 0x18cfc: 0x6c785c20, 0x18cfd: 0x6cdd5220, 0x18cfe: 0x6c95f020, 0x18cff: 0x6d303c20, + // Block 0x634, offset 0x18d00 + 0x18d00: 0x6c2f7220, 0x18d01: 0x6c32d220, 0x18d02: 0x6d3b1c20, 0x18d03: 0x6d0d3a20, + 0x18d04: 0x6cacf420, 0x18d05: 0x6c13d820, + 0x18d0a: 0x6d15e620, + 0x18d0d: 0x6d1f3420, 0x18d0e: 0x6c5ae620, 0x18d0f: 0x6d11c820, + 0x18d10: 0x6d118020, 0x18d11: 0x6d34d620, 0x18d12: 0x6c45d220, 0x18d13: 0x6cb6d420, + 0x18d14: 0x6c44ac20, 0x18d17: 0x6c545c20, + 0x18d18: 0x6c9d2420, 0x18d19: 0x6c3df020, 0x18d1a: 0x6c54a020, 0x18d1b: 0x6c4a1a20, + 0x18d1c: 0x6ce05620, 0x18d1d: 0x6c2b1a20, 0x18d1f: 0x6d0c7220, + 0x18d22: 0x6cc26620, + 0x18d24: 0x6c16e420, 0x18d25: 0x6ca02e20, 0x18d26: 0x6ce1bc20, 0x18d27: 0x6c063c20, + 0x18d28: 0x6c011e20, 0x18d2b: 0x6cfbf620, + 0x18d2f: 0x6c996e20, + 0x18d30: 0x6c811c20, 0x18d31: 0x6ca42220, 0x18d32: 0x6c070c20, 0x18d33: 0x6c18be20, + 0x18d35: 0x6c3a0420, 0x18d36: 0x6d38e620, 0x18d37: 0x6c5ece20, + 0x18d38: 0x6c6a1420, 0x18d39: 0x6cd5d620, 0x18d3b: 0x6c7dd220, + 0x18d3c: 0x6c2ea620, 0x18d3d: 0x6c925220, + // Block 0x635, offset 0x18d40 + 0x18d42: 0x6d215020, 0x18d43: 0x6cdf2620, + 0x18d44: 0x6c162e20, 0x18d45: 0x6c97de20, 0x18d46: 0x6c9fb820, 0x18d47: 0x6c593220, + 0x18d48: 0x6cf15420, 0x18d49: 0x6caa9220, 0x18d4a: 0x6c593420, 0x18d4b: 0x6c540a20, + 0x18d4c: 0x6c6e8e20, 0x18d4d: 0x6c0f2620, 0x18d4e: 0x6cfc2020, 0x18d4f: 0x6c864820, + 0x18d50: 0x6c6d2620, 0x18d52: 0x6c989c20, 0x18d53: 0x6cb1ba20, + 0x18d54: 0x6c4fde20, 0x18d55: 0x6d0fd620, 0x18d57: 0x6cfd0a20, + 0x18d58: 0x6cdb1420, 0x18d59: 0x6cf01620, 0x18d5a: 0x6c183c20, 0x18d5b: 0x6cf6be20, + 0x18d5c: 0x6c6d4c20, 0x18d5d: 0x6c135a20, 0x18d5e: 0x6c51e420, 0x18d5f: 0x6c3b4020, + 0x18d60: 0x6ccca620, 0x18d61: 0x6c8d6a20, 0x18d63: 0x6c337220, + 0x18d64: 0x6cb54220, 0x18d65: 0x6cb4b820, 0x18d66: 0x6d26fa20, 0x18d67: 0x6c0f8e20, + 0x18d69: 0x6c5c7820, 0x18d6a: 0x6c2f0220, 0x18d6b: 0x6d0ef620, + 0x18d6c: 0x6c72d020, 0x18d6d: 0x6c69e020, 0x18d6e: 0x6ca44c20, 0x18d6f: 0x6c8b8620, + 0x18d70: 0x6d20aa20, 0x18d71: 0x6ce41c20, 0x18d72: 0x6ce47620, 0x18d73: 0x6cf42a20, + 0x18d74: 0x6c53a220, 0x18d75: 0x6cff7220, 0x18d76: 0x6c503620, + 0x18d78: 0x6ce55c20, 0x18d79: 0x6d32ca20, 0x18d7b: 0x6c59a020, + 0x18d7c: 0x6c403420, 0x18d7f: 0x6cea2c20, + // Block 0x636, offset 0x18d80 + 0x18d81: 0x6cc61a20, 0x18d82: 0x6c68ba20, + 0x18d84: 0x6d031c20, 0x18d87: 0x6d260020, + 0x18d88: 0x6c73ee20, 0x18d89: 0x6c572820, 0x18d8b: 0x6c056020, + 0x18d8c: 0x6ca1c420, 0x18d8e: 0x6c425e20, 0x18d8f: 0x6cef9220, + 0x18d91: 0x6c9a8020, 0x18d92: 0x6cd89c20, 0x18d93: 0x6c0b8820, + 0x18d94: 0x6c914220, 0x18d95: 0x6cc0e620, + 0x18d98: 0x6c43da20, 0x18d99: 0x6d303e20, 0x18d9a: 0x6c938c20, 0x18d9b: 0x6cac2020, + 0x18d9c: 0x6cc66220, 0x18d9d: 0x6cc03020, 0x18d9e: 0x6c8aea20, 0x18d9f: 0x6c45e020, + 0x18da0: 0x6cfbf820, 0x18da1: 0x6cf86e20, 0x18da2: 0x6d02c620, + 0x18da4: 0x6ca79620, + 0x18da8: 0x6d00a220, 0x18da9: 0x6c8afe20, 0x18daa: 0x6c3d6420, 0x18dab: 0x6c25d620, + 0x18dac: 0x6d3d4e20, 0x18dad: 0x6c034820, 0x18dae: 0x6d429c20, 0x18daf: 0x6d305020, + 0x18db0: 0x6d416e20, 0x18db1: 0x6c510620, 0x18db2: 0x6c601a20, + 0x18db4: 0x6c648620, + 0x18db8: 0x6ce8b020, 0x18db9: 0x6cfb5c20, 0x18dba: 0x6d0d8620, 0x18dbb: 0x6ce0f420, + 0x18dbc: 0x6cde5620, 0x18dbd: 0x6c2bf620, 0x18dbe: 0x6c744c20, 0x18dbf: 0x6c01fc20, + // Block 0x637, offset 0x18dc0 + 0x18dc0: 0x6c4e1020, 0x18dc1: 0x6cff8820, 0x18dc2: 0x6c712020, 0x18dc3: 0x6cee8c20, + 0x18dc4: 0x6c054c20, 0x18dc5: 0x6d3c5e20, 0x18dc6: 0x6ca82e20, 0x18dc7: 0x6ce53820, + 0x18dc8: 0x6ca3c020, 0x18dcb: 0x6d1fd420, + 0x18dcc: 0x6c9dc620, 0x18dcf: 0x6ca3c820, + 0x18dd0: 0x6cd13c20, 0x18dd1: 0x6c13a220, 0x18dd2: 0x6d0c1020, 0x18dd3: 0x6c44b620, + 0x18dd4: 0x6c1d5420, 0x18dd5: 0x6cc86420, 0x18dd6: 0x6c63ca20, 0x18dd7: 0x6cbd8220, + 0x18dd8: 0x6c98e620, 0x18dd9: 0x6c365c20, 0x18dda: 0x6c863220, 0x18ddb: 0x6c1b3420, + 0x18ddc: 0x6d29da20, 0x18ddd: 0x6c513820, 0x18dde: 0x6c6ae420, 0x18ddf: 0x6ca72c20, + 0x18de1: 0x6c499020, 0x18de2: 0x6c540c20, 0x18de3: 0x6c414220, + 0x18de5: 0x6c07be20, 0x18de6: 0x6cdd8020, 0x18de7: 0x6cf37220, + 0x18de8: 0x6c623820, 0x18de9: 0x6cf66a20, 0x18dea: 0x6cbf4a20, 0x18deb: 0x6c515820, + 0x18dec: 0x6cf23020, 0x18ded: 0x6cfb7220, 0x18dee: 0x6c6b0820, 0x18def: 0x6c5cf820, + 0x18df0: 0x6cb00420, 0x18df1: 0x6cd00620, 0x18df2: 0x6c1d7620, 0x18df3: 0x6d324e20, + 0x18df5: 0x6d2d8a20, 0x18df6: 0x6cd78a20, 0x18df7: 0x6c5f0420, + 0x18df8: 0x6cd99420, 0x18df9: 0x6d354220, 0x18dfa: 0x6c07a220, + 0x18dfe: 0x6c810e20, 0x18dff: 0x6c0a2220, + // Block 0x638, offset 0x18e00 + 0x18e00: 0x6d08ae20, 0x18e01: 0x6cade820, 0x18e02: 0x6c278a20, + 0x18e04: 0x6d340e20, 0x18e05: 0x6cb00e20, 0x18e06: 0x6c15d420, 0x18e07: 0x6c0a2420, + 0x18e08: 0x6cdafa20, 0x18e09: 0x6c5df220, 0x18e0a: 0x6c523420, 0x18e0b: 0x6c6f2a20, + 0x18e0c: 0x6c200620, 0x18e0d: 0x6c67b420, 0x18e0e: 0x6ca5a020, 0x18e0f: 0x6c47be20, + 0x18e10: 0x6c39de20, 0x18e13: 0x6cde9a20, + 0x18e14: 0x6c256020, 0x18e15: 0x6cf6c220, 0x18e16: 0x6c2a8420, 0x18e17: 0x6cfb9020, + 0x18e18: 0x6c7b7220, 0x18e19: 0x6d308a20, 0x18e1a: 0x6cddfc20, 0x18e1b: 0x6c55ae20, + 0x18e1c: 0x6c256220, 0x18e1d: 0x6c92c820, 0x18e1e: 0x6c738c20, 0x18e1f: 0x6c92ca20, + 0x18e20: 0x6cba7220, 0x18e21: 0x6cad9620, 0x18e22: 0x6d326c20, + 0x18e24: 0x6c867a20, 0x18e25: 0x6c128e20, 0x18e26: 0x6cb64a20, + 0x18e29: 0x6ce41e20, 0x18e2a: 0x6c8d6c20, 0x18e2b: 0x6cc1d420, + 0x18e2c: 0x6c88cc20, 0x18e2d: 0x6c91e020, 0x18e2e: 0x6cd54020, 0x18e2f: 0x6c462620, + 0x18e30: 0x6d309a20, 0x18e31: 0x6cad3c20, 0x18e32: 0x6c6d5a20, 0x18e33: 0x6cbe9020, + 0x18e36: 0x6d3fc420, 0x18e37: 0x6cb46620, + 0x18e38: 0x6c6cbc20, 0x18e39: 0x6c0c8620, 0x18e3a: 0x6c66ee20, 0x18e3b: 0x6c4bf220, + 0x18e3e: 0x6d2a3020, 0x18e3f: 0x6c8b5a20, + // Block 0x639, offset 0x18e40 + 0x18e40: 0x6c848a20, 0x18e41: 0x6c95c620, 0x18e42: 0x6cd08620, 0x18e43: 0x6c9de220, + 0x18e44: 0x6c66fc20, 0x18e45: 0x6c2bb020, 0x18e46: 0x6c076a20, + 0x18e48: 0x6c88d420, 0x18e4a: 0x6cfbc620, 0x18e4b: 0x6cb22220, + 0x18e4c: 0x6cc41620, 0x18e4d: 0x6c8fda20, 0x18e4e: 0x6d41e020, + 0x18e50: 0x6c74fe20, 0x18e51: 0x6ccd2020, 0x18e52: 0x6d092620, + 0x18e54: 0x6d027820, 0x18e56: 0x6c804e20, 0x18e57: 0x6cb6aa20, + 0x18e58: 0x6d159820, 0x18e59: 0x6caad420, 0x18e5a: 0x6c84ca20, 0x18e5b: 0x6d271e20, + 0x18e5d: 0x6d15be20, 0x18e5e: 0x6c1a9220, 0x18e5f: 0x6c619620, + 0x18e60: 0x6c4f4a20, 0x18e61: 0x6d015e20, 0x18e62: 0x6c792a20, 0x18e63: 0x6d3e1020, + 0x18e64: 0x6c509220, 0x18e65: 0x6cf86220, 0x18e66: 0x6cc26820, 0x18e67: 0x6c4d1020, + 0x18e68: 0x6cf95220, 0x18e69: 0x6c4d1220, 0x18e6a: 0x6c4a4820, 0x18e6b: 0x6c14c220, + 0x18e6c: 0x6d09fa20, 0x18e6d: 0x6d058220, 0x18e6e: 0x6cd09c20, 0x18e6f: 0x6c79e820, + 0x18e70: 0x6cf96020, 0x18e71: 0x6ccc4a20, 0x18e72: 0x6d208a20, 0x18e73: 0x6d0bae20, + 0x18e74: 0x6cb3f220, 0x18e75: 0x6d40bc20, 0x18e76: 0x6d1fc820, 0x18e77: 0x6d3f3e20, + 0x18e78: 0x6c88be20, 0x18e79: 0x6cfaaa20, 0x18e7a: 0x6cfa3e20, 0x18e7b: 0x6d15f620, + 0x18e7c: 0x6ccc5820, 0x18e7d: 0x6d0e8420, 0x18e7e: 0x6c69a220, 0x18e7f: 0x6cf66e20, + // Block 0x63a, offset 0x18e80 + 0x18e80: 0x6c1bb620, 0x18e81: 0x6cd3b220, 0x18e82: 0x6c774620, 0x18e83: 0x6d1afc20, + 0x18e84: 0x6c522420, 0x18e85: 0x6d189620, 0x18e86: 0x6cf6e820, 0x18e87: 0x6ccb6a20, + 0x18e88: 0x6c6d5c20, 0x18e89: 0x6d135e20, 0x18e8a: 0x6d1ec420, 0x18e8b: 0x6cc41820, + 0x18e8c: 0x6d129a20, 0x18e8d: 0x6c945e20, 0x18e8e: 0x6c7d9c20, 0x18e8f: 0x6d333820, + 0x18e94: 0x6d003a20, 0x18e96: 0x6c253a20, 0x18e97: 0x6d04e420, + 0x18e98: 0x6c01d820, 0x18e99: 0x6d051e20, 0x18e9a: 0x6c118820, 0x18e9b: 0x6c201820, + 0x18e9c: 0x6d2c1e20, 0x18e9e: 0x6d16f420, 0x18e9f: 0x6caf4420, + 0x18ea0: 0x6c7a3020, 0x18ea1: 0x6cd0fa20, 0x18ea2: 0x6c80bc20, 0x18ea3: 0x6ce9e420, + 0x18ea4: 0x6cf61020, 0x18ea5: 0x6c8d0620, 0x18ea6: 0x6cb4f820, 0x18ea7: 0x6cf2f020, + 0x18ea8: 0x6c88fa20, 0x18ea9: 0x6c319e20, 0x18eaa: 0x6c9af420, 0x18eab: 0x6c807220, + 0x18eac: 0x6cefdc20, 0x18ead: 0x6c32ca20, 0x18eae: 0x6c7b2a20, 0x18eaf: 0x6c004c20, + 0x18eb0: 0x6d291a20, 0x18eb1: 0x6c5bfa20, 0x18eb2: 0x6d182620, 0x18eb3: 0x6ca14c20, + 0x18eb4: 0x6d3f5e20, 0x18eb5: 0x6c3be820, 0x18eb6: 0x6caec420, + 0x18eb8: 0x6c0a6c20, 0x18eb9: 0x6c871e20, 0x18eba: 0x6c918220, 0x18ebb: 0x6c964620, + 0x18ebc: 0x6c4d0a20, 0x18ebd: 0x6d31bc20, 0x18ebe: 0x6c40ee20, 0x18ebf: 0x6cc3ac20, + // Block 0x63b, offset 0x18ec0 + 0x18ec0: 0x6d315220, 0x18ec1: 0x6c797a20, 0x18ec2: 0x6c1a0420, 0x18ec3: 0x6c6ffe20, + 0x18ec4: 0x6c746420, 0x18ec5: 0x6c623a20, 0x18ec6: 0x6c8d5620, + 0x18ec8: 0x6cceaa20, 0x18ec9: 0x6cc40020, 0x18eca: 0x6cc8ea20, 0x18ecb: 0x6c21ac20, + 0x18ecc: 0x6ca5b220, 0x18ecd: 0x6d339820, 0x18ece: 0x6c907a20, 0x18ecf: 0x6cad3620, + 0x18ed2: 0x6c063820, 0x18ed3: 0x6cc66420, + 0x18ed4: 0x6cfa9a20, 0x18ed5: 0x6c832c20, 0x18ed6: 0x6cfeb420, 0x18ed7: 0x6c3d6620, + 0x18ed8: 0x6cc18620, 0x18eda: 0x6ccbe820, 0x18edb: 0x6d352c20, + 0x18edc: 0x6cdfe020, 0x18edd: 0x6cc70e20, 0x18ede: 0x6cda4a20, 0x18edf: 0x6d1cf620, + 0x18ee0: 0x6c98e820, 0x18ee1: 0x6ca3ca20, 0x18ee2: 0x6c0baa20, + 0x18ee4: 0x6cd65820, 0x18ee5: 0x6ce11020, 0x18ee6: 0x6c4ee220, 0x18ee7: 0x6ccaf620, + 0x18ee8: 0x6cc69420, 0x18eea: 0x6c2aa820, 0x18eeb: 0x6cb44e20, + 0x18eec: 0x6c687820, 0x18eed: 0x6ce07620, 0x18eef: 0x6cc48e20, + 0x18ef0: 0x6ca92c20, 0x18ef1: 0x6c8b5c20, 0x18ef2: 0x6c2f2020, 0x18ef3: 0x6c2e8620, + 0x18ef4: 0x6d381620, 0x18ef6: 0x6c93f420, 0x18ef7: 0x6c28b020, + 0x18ef8: 0x6cf56020, 0x18ef9: 0x6c4aba20, 0x18efa: 0x6c5fbe20, 0x18efb: 0x6ca67620, + 0x18efc: 0x6d164a20, 0x18efd: 0x6ca75820, 0x18efe: 0x6d221e20, 0x18eff: 0x6cedf220, + // Block 0x63c, offset 0x18f00 + 0x18f00: 0x6c4ce620, 0x18f01: 0x6d2b3c20, 0x18f02: 0x6d0c5820, 0x18f03: 0x6c251a20, + 0x18f04: 0x6cfb2620, 0x18f05: 0x6c68be20, 0x18f06: 0x6ce80620, 0x18f07: 0x6c3fac20, + 0x18f08: 0x6cae0020, 0x18f0a: 0x6d1e9220, 0x18f0b: 0x6cbfa220, + 0x18f0c: 0x6d0ad620, 0x18f0d: 0x6c107220, 0x18f0e: 0x6c0b7c20, 0x18f0f: 0x6cd31c20, + 0x18f10: 0x6d2c2220, 0x18f11: 0x6d16c020, 0x18f12: 0x6c0b7e20, + 0x18f14: 0x6c333820, 0x18f15: 0x6c7f8e20, 0x18f16: 0x6d13d820, 0x18f17: 0x6c149220, + 0x18f18: 0x6c1cb220, 0x18f19: 0x6d087820, 0x18f1a: 0x6d069220, 0x18f1b: 0x6d20d820, + 0x18f1c: 0x6d04c020, + 0x18f20: 0x6cde3620, 0x18f21: 0x6c4c1620, + 0x18f25: 0x6c906420, 0x18f26: 0x6d018220, 0x18f27: 0x6c180c20, + 0x18f28: 0x6c657e20, 0x18f29: 0x6cdf9820, 0x18f2a: 0x6cb08c20, 0x18f2b: 0x6d296820, + 0x18f2c: 0x6d080620, 0x18f2d: 0x6cfb3c20, 0x18f2e: 0x6ca7d220, + 0x18f34: 0x6c9d3820, 0x18f35: 0x6c61f020, 0x18f36: 0x6caa1c20, 0x18f37: 0x6c54c020, + 0x18f38: 0x6c571020, 0x18f39: 0x6cee1020, 0x18f3a: 0x6d1f2a20, 0x18f3b: 0x6d2ac020, + 0x18f3c: 0x6c09a020, 0x18f3d: 0x6c9cee20, 0x18f3e: 0x6cbab020, 0x18f3f: 0x6d019220, + // Block 0x63d, offset 0x18f40 + 0x18f40: 0x6c394420, 0x18f41: 0x6d176020, 0x18f42: 0x6cdfa020, 0x18f43: 0x6c832e20, + 0x18f44: 0x6d1e2e20, 0x18f46: 0x6c6d0220, 0x18f47: 0x6ccf4a20, + 0x18f48: 0x6d1b4820, 0x18f49: 0x6c613820, 0x18f4b: 0x6cdaa620, + 0x18f4f: 0x6cee1c20, + 0x18f50: 0x6c9e5820, 0x18f51: 0x6cdab420, 0x18f52: 0x6d17a620, 0x18f53: 0x6ccc8820, + 0x18f54: 0x6cf61420, 0x18f55: 0x6c603e20, 0x18f56: 0x6c960020, 0x18f57: 0x6d1ea620, + 0x18f58: 0x6c998220, 0x18f59: 0x6d2c7c20, 0x18f5a: 0x6cdc4020, 0x18f5b: 0x6d362a20, + 0x18f5c: 0x6c0b9c20, 0x18f5d: 0x6c83d820, + 0x18f65: 0x6cbc4820, 0x18f66: 0x6c498e20, 0x18f67: 0x6cf64a20, + 0x18f68: 0x6d324a20, 0x18f69: 0x6d1d9020, 0x18f6a: 0x6ca84020, 0x18f6b: 0x6c75ca20, + 0x18f6c: 0x6d01c620, 0x18f6d: 0x6d11b620, 0x18f6e: 0x6d01c820, 0x18f6f: 0x6d33f020, + 0x18f70: 0x6ca5a820, 0x18f72: 0x6cd7f420, 0x18f73: 0x6c903620, + 0x18f74: 0x6c18d220, 0x18f75: 0x6c9d5c20, 0x18f76: 0x6cc3cc20, 0x18f77: 0x6c27e420, + 0x18f78: 0x6ccd4820, + 0x18f7c: 0x6cdae820, 0x18f7d: 0x6d01da20, 0x18f7e: 0x6c0f2820, 0x18f7f: 0x6c2f7a20, + // Block 0x63e, offset 0x18f80 + 0x18f80: 0x6d40ca20, 0x18f82: 0x6cd5f220, 0x18f83: 0x6ccf2220, + 0x18f84: 0x6c4ee420, 0x18f85: 0x6cdfb220, 0x18f86: 0x6c431420, + 0x18f8a: 0x6ca36420, 0x18f8b: 0x6c9d7a20, + 0x18f8c: 0x6d0a3020, 0x18f8d: 0x6c9afa20, 0x18f8e: 0x6c66b420, 0x18f8f: 0x6c24fe20, + 0x18f90: 0x6c749220, 0x18f91: 0x6c51de20, 0x18f92: 0x6c3ac820, 0x18f93: 0x6cd28220, + 0x18f94: 0x6c17f220, 0x18f95: 0x6cd0c220, 0x18f96: 0x6caa8a20, 0x18f97: 0x6cb2c420, + 0x18f98: 0x6c980220, + 0x18f9d: 0x6d189a20, 0x18f9e: 0x6c1dda20, + 0x18fa0: 0x6c7a6220, 0x18fa1: 0x6c05d420, 0x18fa2: 0x6c825a20, 0x18fa3: 0x6c787020, + 0x18fa4: 0x6ccc7820, 0x18fa5: 0x6c0a4e20, 0x18fa6: 0x6cdbfc20, 0x18fa7: 0x6c443420, + 0x18fa8: 0x6cb0c020, 0x18fa9: 0x6d189c20, 0x18faa: 0x6cfb9220, 0x18fab: 0x6ca6c820, + 0x18fac: 0x6d1c9820, 0x18fad: 0x6d3a8020, 0x18fae: 0x6c216220, 0x18faf: 0x6c3cbc20, + 0x18fb0: 0x6d074620, 0x18fb1: 0x6cb19c20, 0x18fb2: 0x6cf48020, 0x18fb3: 0x6c8a2420, + 0x18fb4: 0x6c124c20, 0x18fb5: 0x6d409020, 0x18fb6: 0x6d422a20, 0x18fb7: 0x6c0bc620, + 0x18fb8: 0x6d122a20, 0x18fb9: 0x6c58a420, 0x18fba: 0x6cac3220, 0x18fbb: 0x6d04fa20, + 0x18fbd: 0x6c82ea20, 0x18fbe: 0x6cbee420, 0x18fbf: 0x6d001220, + // Block 0x63f, offset 0x18fc0 + 0x18fc0: 0x6c689620, 0x18fc1: 0x6c4c9420, + 0x18fc4: 0x6d0cf020, 0x18fc5: 0x6d092420, 0x18fc6: 0x6d39e220, 0x18fc7: 0x6c527e20, + 0x18fc8: 0x6d1cb820, 0x18fc9: 0x6cf71620, + 0x18fcc: 0x6c889220, 0x18fcd: 0x6cfc4820, 0x18fce: 0x6c58bc20, 0x18fcf: 0x6d1a1620, + 0x18fd1: 0x6c892a20, 0x18fd2: 0x6ccd6020, 0x18fd3: 0x6c125220, + 0x18fd4: 0x6c077020, 0x18fd5: 0x6c662220, 0x18fd6: 0x6cd63020, 0x18fd7: 0x6c397a20, + 0x18fd8: 0x6c2d9820, 0x18fda: 0x6c03d820, 0x18fdb: 0x6d21fe20, + 0x18fde: 0x6ca47420, 0x18fdf: 0x6c831420, + 0x18fe0: 0x6d198220, 0x18fe1: 0x6c272820, 0x18fe3: 0x6c14ea20, + 0x18fe4: 0x6c178e20, 0x18fe5: 0x6c416a20, 0x18fe6: 0x6c6cdc20, 0x18fe7: 0x6ca59220, + 0x18feb: 0x6c8a6a20, + 0x18fec: 0x6ca0e620, 0x18fed: 0x6d1fb220, 0x18fef: 0x6c8f2820, + 0x18ff0: 0x6c4de620, 0x18ff2: 0x6d1e7420, 0x18ff3: 0x6c6cf020, + 0x18ff4: 0x6c1b8c20, 0x18ff5: 0x6cc5dc20, 0x18ff6: 0x6ca9b620, + 0x18ff9: 0x6c53ba20, 0x18ffa: 0x6ce53620, + 0x18ffc: 0x6c002420, 0x18ffd: 0x6c485620, 0x18ffe: 0x6c0bf820, 0x18fff: 0x6c0eea20, + // Block 0x640, offset 0x19000 + 0x19000: 0x6cbf1420, 0x19002: 0x6cd5d820, 0x19003: 0x6c20ee20, + 0x19004: 0x6c5b5420, 0x19005: 0x6c179a20, 0x19006: 0x6c3ff220, 0x19007: 0x6c5ab620, + 0x19008: 0x6c363a20, 0x19009: 0x6cf09a20, 0x1900a: 0x6c3b7820, 0x1900b: 0x6cdfe220, + 0x1900d: 0x6c94fa20, 0x1900e: 0x6c51cc20, 0x1900f: 0x6d1e4a20, + 0x19010: 0x6c5b5a20, 0x19012: 0x6d215820, 0x19013: 0x6d3ff820, + 0x19014: 0x6d0e8a20, 0x19015: 0x6cc07420, 0x19016: 0x6d2fbc20, 0x19017: 0x6c6f1a20, + 0x19018: 0x6cdf2820, + 0x1901f: 0x6cea0820, + 0x19020: 0x6c8bc220, 0x19021: 0x6c6f2620, 0x19022: 0x6d2c8220, 0x19023: 0x6d038620, + 0x19024: 0x6c56ba20, 0x19026: 0x6d071020, + 0x1902a: 0x6c254c20, 0x1902b: 0x6cbeb020, + 0x1902c: 0x6ca14e20, 0x1902e: 0x6d2a2220, 0x1902f: 0x6c084c20, + 0x19030: 0x6c1ace20, 0x19033: 0x6d0ebc20, + 0x19034: 0x6c443620, 0x19035: 0x6ca16220, 0x19036: 0x6c075c20, 0x19037: 0x6c732820, + 0x19038: 0x6c2ee620, 0x19039: 0x6d2fe020, 0x1903b: 0x6cf3ea20, + 0x1903c: 0x6d0ebe20, 0x1903e: 0x6c74c620, 0x1903f: 0x6cfade20, + // Block 0x641, offset 0x19040 + 0x19040: 0x6cdf4a20, 0x19041: 0x6c4e6620, 0x19043: 0x6c2d2c20, + 0x19044: 0x6c62ac20, 0x19045: 0x6c6b6020, 0x19047: 0x6d414c20, + 0x19049: 0x6d025820, 0x1904a: 0x6c7f7620, 0x1904b: 0x6c38e220, + 0x1904c: 0x6c5e4020, 0x1904d: 0x6cf92820, 0x1904e: 0x6ca8b620, 0x1904f: 0x6c9cb820, + 0x19050: 0x6cc49c20, 0x19051: 0x6c24c220, 0x19052: 0x6d1a3220, 0x19053: 0x6c9d2820, + 0x19055: 0x6c747e20, 0x19056: 0x6cc0ea20, 0x19057: 0x6ce73820, + 0x19058: 0x6ced7a20, 0x19059: 0x6d2ffc20, 0x1905a: 0x6c84fe20, 0x1905b: 0x6cce9c20, + 0x1905c: 0x6c79a620, 0x1905d: 0x6cfa7e20, 0x1905e: 0x6d301e20, 0x1905f: 0x6d33c420, + 0x19060: 0x6ce5be20, 0x19061: 0x6cd4bc20, 0x19062: 0x6c073e20, 0x19063: 0x6d136220, + 0x19064: 0x6cb14c20, 0x19065: 0x6c164420, 0x19066: 0x6c563e20, 0x19067: 0x6c791620, + 0x19068: 0x6c6f4a20, 0x19069: 0x6c011620, 0x1906a: 0x6c213020, 0x1906b: 0x6cb97620, + 0x1906c: 0x6c06ea20, 0x1906d: 0x6c032620, 0x1906e: 0x6c3b6020, 0x1906f: 0x6c77d620, + 0x19070: 0x6ceafc20, 0x19071: 0x6ceafe20, 0x19072: 0x6d423020, 0x19073: 0x6c8cbc20, + 0x19075: 0x6c4aea20, 0x19076: 0x6d0be620, 0x19077: 0x6cd35420, + 0x19078: 0x6c545220, 0x19079: 0x6c8b0020, 0x1907a: 0x6ccbee20, 0x1907b: 0x6cd8b220, + 0x1907d: 0x6c071020, 0x1907e: 0x6cc5e820, 0x1907f: 0x6c319820, + // Block 0x642, offset 0x19080 + 0x19080: 0x6c0eec20, 0x19081: 0x6c895620, 0x19082: 0x6cba0c20, 0x19083: 0x6c3aac20, + 0x19084: 0x6c624220, 0x19085: 0x6d3ffa20, 0x19086: 0x6c5ac820, 0x19087: 0x6c514020, + 0x19088: 0x6c83e420, 0x19089: 0x6d259620, 0x1908a: 0x6d26ce20, 0x1908b: 0x6d04e620, + 0x1908c: 0x6c15d620, 0x1908d: 0x6c2b8c20, 0x1908e: 0x6c825020, 0x1908f: 0x6c6cae20, + 0x19090: 0x6c1d1c20, 0x19091: 0x6cd8ec20, 0x19092: 0x6cb49a20, 0x19093: 0x6d11d420, + 0x19094: 0x6c678620, 0x19095: 0x6c583620, 0x19096: 0x6c595620, 0x19097: 0x6ce1f620, + 0x19098: 0x6cc82c20, 0x19099: 0x6cf26620, 0x1909a: 0x6d1ccc20, 0x1909b: 0x6cc53420, + 0x1909c: 0x6d1a3420, 0x1909d: 0x6cd30e20, 0x1909e: 0x6d1a2620, 0x1909f: 0x6c73e220, + 0x190a0: 0x6cea4020, 0x190a1: 0x6d080020, 0x190a2: 0x6c632e20, 0x190a3: 0x6d379e20, + 0x190a4: 0x6cbc9820, 0x190a5: 0x6d3ab220, 0x190a6: 0x6c2db020, + 0x190a8: 0x6d201820, 0x190ab: 0x6d14a420, + 0x190ac: 0x6cd2c220, 0x190ad: 0x6d16fa20, 0x190ae: 0x6ca0e820, + 0x190b1: 0x6cc3ae20, 0x190b2: 0x6cfea420, 0x190b3: 0x6cf3ba20, + 0x190b4: 0x6c44c020, 0x190b5: 0x6d1ce620, 0x190b6: 0x6ce66820, 0x190b7: 0x6cd2c620, + 0x190b8: 0x6ca5cc20, 0x190b9: 0x6c44c620, 0x190ba: 0x6cde5020, 0x190bb: 0x6cf28a20, + 0x190bc: 0x6c711820, 0x190bd: 0x6c15a820, 0x190be: 0x6cb19620, 0x190bf: 0x6d3d5420, + // Block 0x643, offset 0x190c0 + 0x190c0: 0x6c54c420, 0x190c1: 0x6ca4fa20, 0x190c2: 0x6d0c9820, 0x190c3: 0x6c468620, + 0x190c4: 0x6d225c20, 0x190c5: 0x6c540420, 0x190c7: 0x6cd7f620, + 0x190c8: 0x6c1aba20, 0x190c9: 0x6c56a420, 0x190ca: 0x6d105220, 0x190cb: 0x6cf22e20, + 0x190cc: 0x6cfcd020, 0x190cd: 0x6cb21020, 0x190ce: 0x6cc69c20, 0x190cf: 0x6c90a820, + 0x190d0: 0x6c81b420, 0x190d1: 0x6cccfe20, 0x190d2: 0x6cfef020, 0x190d3: 0x6d2ae220, + 0x190d4: 0x6c4d7820, 0x190d5: 0x6c38b420, 0x190d6: 0x6c4e6220, 0x190d7: 0x6c14d420, + 0x190d8: 0x6d2e7620, 0x190da: 0x6cde1620, 0x190db: 0x6d3b2a20, + 0x190dc: 0x6ca9c820, 0x190dd: 0x6c4f1820, 0x190de: 0x6d21b620, 0x190df: 0x6d3db420, + 0x190e0: 0x6d205c20, 0x190e1: 0x6c86fc20, 0x190e2: 0x6c5e2a20, 0x190e3: 0x6cf73e20, + 0x190e4: 0x6cfb0020, 0x190e5: 0x6c155820, 0x190e6: 0x6c889420, + 0x190e8: 0x6cd7be20, 0x190e9: 0x6c6fce20, 0x190ea: 0x6cb42820, 0x190eb: 0x6cbffc20, + 0x190ec: 0x6c45d620, 0x190ed: 0x6d3ee820, 0x190ee: 0x6d20bc20, + 0x190f1: 0x6cc62820, 0x190f2: 0x6ca98420, 0x190f3: 0x6c99d820, + 0x190f4: 0x6c032820, 0x190f5: 0x6c6f9820, 0x190f7: 0x6d069620, + 0x190f8: 0x6cb29020, 0x190f9: 0x6c0b8a20, 0x190fa: 0x6c995420, + 0x190ff: 0x6d14ce20, + // Block 0x644, offset 0x19100 + 0x19100: 0x6d20f620, 0x19102: 0x6cb29220, 0x19103: 0x6cc0f220, + 0x19104: 0x6c05f420, 0x19105: 0x6c5bae20, + 0x19109: 0x6c109420, 0x1910a: 0x6c985820, 0x1910b: 0x6c7e7020, + 0x1910c: 0x6ce8a820, 0x1910d: 0x6cf3c220, 0x1910e: 0x6c85ec20, 0x1910f: 0x6c8cea20, + 0x19111: 0x6c620220, 0x19112: 0x6c75bc20, 0x19113: 0x6d405620, + 0x19114: 0x6c349220, 0x19115: 0x6c745020, 0x19116: 0x6c277020, 0x19117: 0x6c073220, + 0x1911d: 0x6c7e8020, 0x1911e: 0x6c0d3e20, 0x1911f: 0x6cdbf820, + 0x19120: 0x6ce8c220, 0x19121: 0x6d08e220, + 0x19127: 0x6c350c20, + 0x1912a: 0x6cdc5420, 0x1912b: 0x6c0a2e20, + 0x1912c: 0x6ce87420, 0x1912d: 0x6ccb4a20, 0x1912e: 0x6c120020, 0x1912f: 0x6ce8e420, + 0x19130: 0x6c9e3620, 0x19131: 0x6c6c5220, 0x19132: 0x6c93b020, + 0x19135: 0x6d2e8020, 0x19136: 0x6c08f620, 0x19137: 0x6c60ac20, + 0x19138: 0x6d2b7420, 0x19139: 0x6d07d620, 0x1913a: 0x6c86a020, + 0x1913d: 0x6cdc8220, 0x1913e: 0x6d1dc220, 0x1913f: 0x6cd57620, + // Block 0x645, offset 0x19140 + 0x19142: 0x6c358620, + 0x19147: 0x6cbf8620, + 0x19148: 0x6c958020, 0x19149: 0x6d322220, 0x1914a: 0x6cea4620, 0x1914b: 0x6c46fe20, + 0x1914c: 0x6d223c20, 0x1914d: 0x6c82be20, 0x1914e: 0x6c0eee20, 0x1914f: 0x6ca56e20, + 0x19150: 0x6cb12020, 0x19151: 0x6c890e20, 0x19152: 0x6ce17a20, 0x19153: 0x6c883820, + 0x19154: 0x6cf16220, 0x19155: 0x6c291020, 0x19156: 0x6c87be20, 0x19157: 0x6ce65e20, + 0x19158: 0x6cec1820, 0x19159: 0x6d390220, 0x1915a: 0x6c426620, 0x1915b: 0x6d03d220, + 0x1915c: 0x6c021420, 0x1915d: 0x6c393820, 0x1915e: 0x6caf0e20, 0x1915f: 0x6c0eda20, + 0x19160: 0x6ceb0620, 0x19161: 0x6cd4d020, 0x19162: 0x6d14e420, 0x19163: 0x6c0ef020, + 0x19164: 0x6cbcb820, 0x19165: 0x6ce80e20, 0x19166: 0x6c45e820, 0x19167: 0x6ce74820, + 0x19168: 0x6c4e1220, 0x19169: 0x6c1a0820, 0x1916a: 0x6c6ace20, 0x1916b: 0x6c593a20, + 0x1916c: 0x6d042c20, 0x1916d: 0x6c2d6220, 0x1916e: 0x6c146a20, 0x1916f: 0x6c308020, + 0x19170: 0x6caffc20, 0x19171: 0x6cc86a20, 0x19172: 0x6c8b2220, 0x19173: 0x6cd14020, + 0x19174: 0x6cab8420, 0x19175: 0x6c2c8020, 0x19176: 0x6d217020, 0x19177: 0x6c200220, + 0x19178: 0x6cc6a220, 0x19179: 0x6c774820, 0x1917a: 0x6ce12420, 0x1917b: 0x6c23b620, + 0x1917c: 0x6cb18220, 0x1917d: 0x6c209820, 0x1917e: 0x6c92ce20, 0x1917f: 0x6ce79020, + // Block 0x646, offset 0x19180 + 0x19180: 0x6d336620, 0x19181: 0x6c86a420, 0x19182: 0x6cc9a020, 0x19183: 0x6cac4420, + 0x19184: 0x6cd82e20, 0x19186: 0x6c291220, 0x19187: 0x6c55de20, + 0x19188: 0x6d190c20, 0x19189: 0x6cfd3220, 0x1918a: 0x6d028020, 0x1918b: 0x6c958820, + 0x1918c: 0x6c8f5e20, 0x1918e: 0x6cdfea20, 0x1918f: 0x6c422e20, + 0x19191: 0x6ce01c20, + 0x19195: 0x6d1ef020, 0x19196: 0x6ca3e020, + 0x19198: 0x6c429a20, 0x19199: 0x6c759820, 0x1919a: 0x6c1bfe20, 0x1919b: 0x6c464020, + 0x1919c: 0x6cecfa20, 0x1919d: 0x6c85ee20, 0x1919e: 0x6c8e5420, 0x1919f: 0x6c8b0a20, + 0x191a0: 0x6cf9c420, 0x191a1: 0x6c06ac20, 0x191a2: 0x6c018a20, 0x191a3: 0x6d237220, + 0x191a4: 0x6c713220, 0x191a5: 0x6cc75820, 0x191a6: 0x6d0a3420, 0x191a7: 0x6d3e7a20, + 0x191a8: 0x6c25ee20, 0x191a9: 0x6c120620, 0x191aa: 0x6d2baa20, 0x191ab: 0x6d1dc420, + 0x191ac: 0x6c407420, 0x191ad: 0x6cc88a20, 0x191af: 0x6cf7cc20, + 0x191b0: 0x6cd5e620, 0x191b1: 0x6c68c020, 0x191b2: 0x6c68c220, 0x191b3: 0x6d057020, + 0x191b4: 0x6d2f2620, 0x191b7: 0x6cd71220, + 0x191b8: 0x6c18a820, 0x191b9: 0x6c390820, 0x191ba: 0x6c5ff820, 0x191bb: 0x6d33a820, + 0x191bd: 0x6c480420, 0x191be: 0x6cf4d620, + // Block 0x647, offset 0x191c0 + 0x191c0: 0x6cbcae20, 0x191c1: 0x6cd5bc20, 0x191c2: 0x6c4d1420, 0x191c3: 0x6ceb0820, + 0x191c4: 0x6c319020, 0x191c5: 0x6d3f0220, 0x191c6: 0x6cc46e20, 0x191c7: 0x6ca27820, + 0x191c8: 0x6c3fd020, 0x191c9: 0x6c8cca20, 0x191ca: 0x6c601e20, 0x191cb: 0x6d04ce20, + 0x191cc: 0x6d084c20, 0x191cd: 0x6ca37820, 0x191ce: 0x6d0aee20, 0x191cf: 0x6c6be020, + 0x191d0: 0x6c85f020, 0x191d1: 0x6c269c20, 0x191d2: 0x6cc7a020, 0x191d3: 0x6d24ee20, + 0x191d4: 0x6c939c20, 0x191d5: 0x6cd06220, 0x191d6: 0x6c851820, 0x191d7: 0x6c89bc20, + 0x191d8: 0x6c450e20, 0x191d9: 0x6d033820, 0x191da: 0x6d004420, 0x191db: 0x6cbdd820, + 0x191dc: 0x6cbcc220, 0x191dd: 0x6c182020, 0x191de: 0x6d1f3c20, 0x191df: 0x6c109a20, + 0x191e0: 0x6c7bc220, 0x191e1: 0x6cc3be20, 0x191e2: 0x6c00aa20, 0x191e3: 0x6cbd3420, + 0x191e4: 0x6cbac020, 0x191e5: 0x6c1f5220, 0x191e6: 0x6cae1e20, 0x191e7: 0x6c7e0620, + 0x191e8: 0x6d13fa20, 0x191e9: 0x6c48ce20, 0x191ea: 0x6cd14220, 0x191eb: 0x6cb0fa20, + 0x191ed: 0x6d393820, 0x191ee: 0x6c59de20, 0x191ef: 0x6c5ad620, + 0x191f0: 0x6c557e20, 0x191f1: 0x6c074220, + 0x191f4: 0x6d2bec20, 0x191f5: 0x6c624620, 0x191f6: 0x6c47c220, 0x191f7: 0x6cf6a420, + 0x191f8: 0x6c431620, 0x191f9: 0x6c148620, 0x191fa: 0x6c96d620, 0x191fb: 0x6d3b2020, + 0x191fc: 0x6ce9ea20, 0x191fd: 0x6d3ca020, 0x191fe: 0x6cface20, 0x191ff: 0x6c80de20, + // Block 0x648, offset 0x19200 + 0x19203: 0x6d36e820, + 0x19204: 0x6c00cc20, 0x19205: 0x6cfc2e20, 0x19206: 0x6c4c3c20, 0x19207: 0x6cf7a220, + 0x19209: 0x6ce9f020, 0x1920a: 0x6c11de20, 0x1920b: 0x6ccb0420, + 0x1920c: 0x6cfaea20, 0x1920d: 0x6c6c0e20, 0x1920e: 0x6c3bfa20, 0x1920f: 0x6cc45a20, + 0x19211: 0x6d123a20, 0x19212: 0x6c29fa20, 0x19213: 0x6c63f420, + 0x19214: 0x6c82fc20, 0x19215: 0x6d0d0220, 0x19216: 0x6c918e20, 0x19217: 0x6ce9d620, + 0x19218: 0x6d1cd220, 0x19219: 0x6cb0de20, 0x1921a: 0x6c964a20, 0x1921b: 0x6c87a420, + 0x1921c: 0x6c0d1220, 0x1921e: 0x6c995620, 0x1921f: 0x6c040e20, + 0x19220: 0x6c5a6a20, 0x19222: 0x6d121220, 0x19223: 0x6c50a420, + 0x19224: 0x6c218420, 0x19225: 0x6c516420, 0x19226: 0x6ca95620, 0x19227: 0x6c1e0220, + 0x19228: 0x6c874620, 0x19229: 0x6ce19420, 0x1922a: 0x6c585a20, 0x1922b: 0x6c095420, + 0x1922c: 0x6c033420, 0x1922d: 0x6c181020, 0x1922e: 0x6d104620, 0x1922f: 0x6c269e20, + 0x19230: 0x6c024420, 0x19231: 0x6d091020, 0x19233: 0x6d3e5220, + 0x19234: 0x6c265a20, 0x19235: 0x6cc4ce20, 0x19236: 0x6c053820, 0x19237: 0x6c25f020, + 0x19238: 0x6ced4e20, 0x19239: 0x6cdebe20, 0x1923a: 0x6c05dc20, 0x1923b: 0x6c417a20, + 0x1923c: 0x6d0c7620, 0x1923d: 0x6cf5a620, 0x1923e: 0x6d3ad420, 0x1923f: 0x6d0b4e20, + // Block 0x649, offset 0x19240 + 0x19240: 0x6c393a20, 0x19241: 0x6d203c20, 0x19242: 0x6c012820, 0x19243: 0x6ce9a420, + 0x19244: 0x6c9b2020, 0x19245: 0x6ccf5c20, 0x19246: 0x6c6d2e20, 0x19247: 0x6c47ce20, + 0x19248: 0x6c627820, 0x19249: 0x6cbc0020, 0x1924a: 0x6c695820, 0x1924b: 0x6d0d0420, + 0x1924c: 0x6cf92e20, 0x1924d: 0x6c772020, 0x1924e: 0x6c9e0220, 0x1924f: 0x6d086a20, + 0x19250: 0x6cccc420, 0x19251: 0x6cf2d820, 0x19252: 0x6cb8b420, 0x19253: 0x6c58f620, + 0x19254: 0x6cc5d020, 0x19255: 0x6d322420, 0x19256: 0x6ce45c20, 0x19257: 0x6c740020, + 0x19258: 0x6d008620, 0x19259: 0x6cb75820, 0x1925a: 0x6c01f820, 0x1925b: 0x6c9a8220, + 0x1925c: 0x6c476820, 0x1925e: 0x6ce1b820, 0x1925f: 0x6c389220, + 0x19260: 0x6c722c20, 0x19261: 0x6c162820, 0x19262: 0x6cd74c20, 0x19263: 0x6c096820, + 0x19264: 0x6c996220, 0x19265: 0x6cd77820, 0x19266: 0x6c477220, 0x19267: 0x6c53a420, + 0x19268: 0x6c579620, 0x19269: 0x6c95fe20, 0x1926a: 0x6c4f7420, 0x1926b: 0x6c63b820, + 0x1926c: 0x6cc2e220, 0x1926d: 0x6c40f420, 0x1926e: 0x6c599020, 0x1926f: 0x6c103c20, + 0x19270: 0x6c478e20, 0x19271: 0x6c3c4e20, 0x19272: 0x6ca28820, 0x19273: 0x6c009c20, + 0x19274: 0x6d1cee20, 0x19275: 0x6cd75020, 0x19276: 0x6c89be20, 0x19277: 0x6c6ad020, + 0x19278: 0x6c1c2220, 0x19279: 0x6c6ad220, 0x1927a: 0x6c1d7020, 0x1927b: 0x6cb2e820, + 0x1927c: 0x6c186a20, 0x1927d: 0x6d0c9a20, 0x1927e: 0x6c321c20, 0x1927f: 0x6c2c5a20, + // Block 0x64a, offset 0x19280 + 0x19281: 0x6c89c220, 0x19282: 0x6cfcd220, 0x19283: 0x6c0c0420, + 0x19284: 0x6d042e20, 0x19285: 0x6c9bda20, 0x19286: 0x6d130220, 0x19287: 0x6c9d5e20, + 0x19288: 0x6cb7a020, 0x19289: 0x6cb7a220, 0x1928a: 0x6cf30620, 0x1928b: 0x6d01dc20, + 0x1928c: 0x6d239820, 0x1928d: 0x6cb87020, 0x1928e: 0x6c1a2820, 0x1928f: 0x6d11c220, + 0x19290: 0x6d1bd420, 0x19291: 0x6d0fd420, 0x19292: 0x6c606820, 0x19293: 0x6d3fa220, + 0x19294: 0x6d07b220, 0x19295: 0x6c9f6e20, 0x19296: 0x6c907620, 0x19297: 0x6c766e20, + 0x19298: 0x6d11ca20, 0x19299: 0x6d0dcc20, 0x1929a: 0x6cdcfa20, 0x1929b: 0x6c4b6c20, + 0x1929c: 0x6c5a7a20, 0x1929d: 0x6d1c8e20, 0x1929e: 0x6cd14420, 0x1929f: 0x6c140220, + 0x192a0: 0x6c883c20, 0x192a2: 0x6d082420, 0x192a3: 0x6c200e20, + 0x192a4: 0x6c184220, 0x192a5: 0x6ca6ca20, 0x192a6: 0x6cc27820, 0x192a7: 0x6c9e7e20, + 0x192a8: 0x6c5dfe20, 0x192a9: 0x6d21a420, 0x192aa: 0x6d2e1620, 0x192ab: 0x6c55c820, + 0x192ac: 0x6c136020, 0x192ad: 0x6c0c2c20, 0x192ae: 0x6cb9d020, 0x192af: 0x6cf6ee20, + 0x192b0: 0x6c67c220, 0x192b1: 0x6c79c620, 0x192b2: 0x6c970220, 0x192b3: 0x6c98a220, + 0x192b4: 0x6d2e2220, 0x192b5: 0x6c0b5c20, 0x192b6: 0x6c5f6c20, 0x192b7: 0x6c74d820, + 0x192b8: 0x6ca45820, 0x192b9: 0x6c0a9020, 0x192ba: 0x6cd3f420, 0x192bb: 0x6cd7ac20, + 0x192bc: 0x6ca18820, 0x192bd: 0x6c8b6420, 0x192be: 0x6c9f0820, 0x192bf: 0x6ca19420, + // Block 0x64b, offset 0x192c0 + 0x192c0: 0x6cf74820, 0x192c1: 0x6c156820, 0x192c2: 0x6cc21620, 0x192c3: 0x6c69e620, + 0x192c4: 0x6c5e5a20, 0x192c5: 0x6cfb1a20, 0x192c6: 0x6d068820, 0x192c7: 0x6ca98820, + 0x192c8: 0x6ce74020, 0x192c9: 0x6c542220, 0x192ca: 0x6d240e20, + 0x192cc: 0x6c1ce220, 0x192cd: 0x6c0fbc20, 0x192ce: 0x6d415820, 0x192cf: 0x6c2dba20, + 0x192d0: 0x6d3cfa20, 0x192d1: 0x6c5ea620, 0x192d2: 0x6cb86220, + 0x192d4: 0x6d043020, 0x192d5: 0x6c5c0020, 0x192d6: 0x6cd23420, 0x192d7: 0x6c7a1e20, + 0x192d9: 0x6c32f220, 0x192da: 0x6d10da20, 0x192db: 0x6d20da20, + 0x192dc: 0x6c056420, 0x192dd: 0x6c6a9220, 0x192de: 0x6d30e820, 0x192df: 0x6c634620, + 0x192e0: 0x6cd2c820, 0x192e1: 0x6c2bea20, 0x192e2: 0x6c302a20, 0x192e3: 0x6c223a20, + 0x192e4: 0x6c3fd220, 0x192e5: 0x6c9f4020, 0x192e6: 0x6d314020, 0x192e7: 0x6d31d020, + 0x192e9: 0x6d0e6420, 0x192ea: 0x6cbc2020, 0x192eb: 0x6c4f4e20, + 0x192ec: 0x6c45ea20, 0x192ed: 0x6cbb6e20, 0x192ee: 0x6c94a220, 0x192ef: 0x6c48f620, + 0x192f0: 0x6c7e7620, 0x192f1: 0x6cc8ce20, 0x192f2: 0x6c383420, 0x192f3: 0x6c260a20, + 0x192f4: 0x6d0c9c20, 0x192f5: 0x6c458a20, 0x192f6: 0x6c6ad420, 0x192f7: 0x6c48d020, + 0x192f8: 0x6c4c7020, 0x192f9: 0x6cdd7c20, 0x192fa: 0x6cf2ba20, 0x192fb: 0x6d335220, + 0x192fc: 0x6ca84220, 0x192fd: 0x6c2e2c20, 0x192fe: 0x6c7f3c20, 0x192ff: 0x6cde6420, + // Block 0x64c, offset 0x19300 + 0x19300: 0x6c254620, 0x19301: 0x6d0af420, 0x19302: 0x6c4bd020, + 0x19305: 0x6c2b3420, 0x19307: 0x6c9dc820, + 0x19308: 0x6c6a2a20, 0x19309: 0x6c9f7020, 0x1930a: 0x6c71ca20, 0x1930b: 0x6d217420, + 0x1930c: 0x6d318020, 0x1930d: 0x6d2fc820, 0x1930e: 0x6d2cd220, 0x1930f: 0x6d038820, + 0x19311: 0x6c049420, 0x19312: 0x6c516620, 0x19313: 0x6c46d220, + 0x19314: 0x6c538220, 0x19315: 0x6c816e20, 0x19316: 0x6cf51620, 0x19317: 0x6c0e8c20, + 0x19318: 0x6c795420, 0x19319: 0x6c92d420, 0x1931a: 0x6c246420, 0x1931b: 0x6c885020, + 0x1931c: 0x6d141820, 0x1931d: 0x6cbc6020, 0x1931e: 0x6cd53820, + 0x19320: 0x6d08b220, 0x19321: 0x6c6c6220, 0x19322: 0x6cbd4220, 0x19323: 0x6c5b7020, + 0x19324: 0x6cdb3620, 0x19325: 0x6c207c20, 0x19326: 0x6c33b420, 0x19327: 0x6c8fb220, + 0x19329: 0x6ca4c820, 0x1932a: 0x6ce02220, 0x1932b: 0x6c285220, + 0x1932c: 0x6cf03e20, 0x1932d: 0x6c41f220, 0x1932e: 0x6c26c620, 0x1932f: 0x6c86d420, + 0x19330: 0x6c10de20, 0x19331: 0x6cfd3e20, 0x19332: 0x6cac8c20, 0x19333: 0x6c7eb620, + 0x19334: 0x6d39ec20, 0x19335: 0x6ca7c420, 0x19336: 0x6c580220, 0x19337: 0x6d1cce20, + 0x19338: 0x6cfd4620, 0x19339: 0x6c809020, 0x1933a: 0x6ca0a020, 0x1933b: 0x6c03e220, + 0x1933d: 0x6c4adc20, 0x1933e: 0x6c08c620, 0x1933f: 0x6c3d5020, + // Block 0x64d, offset 0x19340 + 0x19340: 0x6c5da820, 0x19341: 0x6d173c20, 0x19342: 0x6c8f2c20, + 0x19344: 0x6d19cc20, 0x19345: 0x6c735c20, 0x19346: 0x6c5d7420, 0x19347: 0x6c1a0a20, + 0x19348: 0x6c311c20, 0x19349: 0x6c356a20, 0x1934b: 0x6d0da620, + 0x1934c: 0x6d3c9420, 0x1934d: 0x6d2cce20, 0x1934e: 0x6cb70420, 0x1934f: 0x6d216220, + 0x19350: 0x6cc37620, 0x19351: 0x6c5d7a20, 0x19352: 0x6ca84420, 0x19353: 0x6c59e220, + 0x19354: 0x6c71cc20, 0x19355: 0x6ccf6820, + 0x19358: 0x6caebe20, 0x19359: 0x6ca01820, 0x1935a: 0x6c129220, 0x1935b: 0x6c90ba20, + 0x1935c: 0x6c843e20, 0x1935d: 0x6c205e20, 0x1935f: 0x6c24f020, + 0x19360: 0x6ccdc820, 0x19361: 0x6c280a20, 0x19362: 0x6cb68220, + 0x19364: 0x6c7f7a20, 0x19365: 0x6c8de620, 0x19366: 0x6c8a6220, 0x19367: 0x6cc62220, + 0x19368: 0x6d20c820, 0x19369: 0x6d16ca20, 0x1936a: 0x6c2df820, 0x1936b: 0x6cb6dc20, + 0x1936c: 0x6d147820, 0x1936d: 0x6ca6f420, 0x1936e: 0x6c3d5220, 0x1936f: 0x6c657420, + 0x19370: 0x6d0b1c20, 0x19371: 0x6c398c20, 0x19372: 0x6cc8c420, 0x19373: 0x6cfa8c20, + 0x19376: 0x6c096a20, 0x19377: 0x6cd25e20, + 0x19378: 0x6cb38020, 0x19379: 0x6ca6fc20, 0x1937a: 0x6d35f620, 0x1937b: 0x6ce22020, + 0x1937c: 0x6ce4f020, 0x1937d: 0x6ce4f220, 0x1937e: 0x6cc81620, 0x1937f: 0x6d176a20, + // Block 0x64e, offset 0x19380 + 0x19380: 0x6c8b0420, 0x19381: 0x6c01bc20, 0x19382: 0x6c511020, 0x19383: 0x6cbf1620, + 0x19384: 0x6c85f420, 0x19385: 0x6c4a5c20, 0x19386: 0x6d3f4a20, 0x19387: 0x6cdaaa20, + 0x19388: 0x6d261020, 0x19389: 0x6d0ba220, 0x1938a: 0x6c13dc20, 0x1938b: 0x6ced2420, + 0x1938c: 0x6c72f420, 0x1938d: 0x6ce6cc20, 0x1938e: 0x6d1fd020, 0x1938f: 0x6c5bc620, + 0x19390: 0x6c659c20, 0x19391: 0x6cc89e20, 0x19392: 0x6c986420, 0x19393: 0x6c71b820, + 0x19394: 0x6d3e5620, 0x19395: 0x6c70a820, 0x19396: 0x6c013a20, 0x19397: 0x6cdc5020, + 0x19398: 0x6c7f1620, 0x19399: 0x6c5d3020, 0x1939a: 0x6cc35e20, 0x1939b: 0x6c167220, + 0x1939c: 0x6c34fa20, 0x1939d: 0x6c798020, 0x1939e: 0x6ca55020, 0x1939f: 0x6c11d220, + 0x193a0: 0x6ce35620, 0x193a1: 0x6d064c20, 0x193a2: 0x6c701020, 0x193a3: 0x6c59e420, + 0x193a4: 0x6cb7b820, 0x193a5: 0x6c6b0e20, 0x193a6: 0x6c98f220, 0x193a7: 0x6d0c2020, + 0x193a9: 0x6d354820, 0x193aa: 0x6ce9b020, + 0x193ac: 0x6c00c220, 0x193ad: 0x6cad0a20, 0x193ae: 0x6c125a20, 0x193af: 0x6ce12820, + 0x193b0: 0x6c372220, 0x193b1: 0x6c5d3c20, 0x193b2: 0x6cb63e20, 0x193b3: 0x6c1ea620, + 0x193b4: 0x6cdd9020, 0x193b5: 0x6d3d8820, 0x193b6: 0x6caa2620, 0x193b7: 0x6ce8f220, + 0x193b8: 0x6cd01a20, 0x193b9: 0x6c90f820, 0x193ba: 0x6c0c2020, 0x193bb: 0x6c844020, + 0x193bc: 0x6c977c20, 0x193bd: 0x6d02f020, 0x193be: 0x6c133c20, 0x193bf: 0x6c5a0a20, + // Block 0x64f, offset 0x193c0 + 0x193c0: 0x6c9a6c20, 0x193c1: 0x6c42e620, 0x193c2: 0x6c887620, 0x193c3: 0x6c2a3e20, + 0x193c4: 0x6d2e2420, 0x193c5: 0x6d3eaa20, + 0x193c8: 0x6d375620, 0x193c9: 0x6c03d020, 0x193ca: 0x6c258a20, 0x193cb: 0x6cbfe420, + 0x193cd: 0x6c8fea20, 0x193ce: 0x6cfb0a20, 0x193cf: 0x6c3afa20, + 0x193d0: 0x6c4cac20, 0x193d1: 0x6c19b820, 0x193d2: 0x6c6fda20, 0x193d3: 0x6c35f620, + 0x193d4: 0x6c1cb420, 0x193d5: 0x6d269220, 0x193d6: 0x6c531620, 0x193d7: 0x6d119e20, + 0x193d8: 0x6d0ae220, 0x193d9: 0x6d10e620, 0x193da: 0x6ce74420, 0x193db: 0x6d2cc020, + 0x193dc: 0x6d204020, 0x193dd: 0x6d095620, 0x193de: 0x6d11aa20, 0x193df: 0x6c78a820, + 0x193e0: 0x6c591620, 0x193e1: 0x6c80cc20, 0x193e2: 0x6d26ba20, 0x193e3: 0x6c18ca20, + 0x193e6: 0x6cd0b220, + 0x193e8: 0x6ca90e20, 0x193e9: 0x6ca00a20, 0x193ea: 0x6c52ba20, 0x193eb: 0x6c205820, + 0x193ec: 0x6d27fe20, 0x193ed: 0x6d07be20, 0x193ee: 0x6c6d4420, 0x193ef: 0x6d3d9c20, + 0x193f0: 0x6d209c20, 0x193f1: 0x6cdfbc20, 0x193f2: 0x6c775420, 0x193f3: 0x6cbf6420, + 0x193f5: 0x6c1a4c20, 0x193f6: 0x6c6f8820, 0x193f7: 0x6d097620, + 0x193f8: 0x6d32fa20, 0x193f9: 0x6c1ce420, 0x193fa: 0x6cac4a20, 0x193fb: 0x6cbc6620, + 0x193fd: 0x6cc1e620, 0x193fe: 0x6c7fd620, 0x193ff: 0x6d190e20, + // Block 0x650, offset 0x19400 + 0x19400: 0x6cc6de20, 0x19401: 0x6cd84e20, 0x19402: 0x6cb89c20, 0x19403: 0x6cd89220, + 0x19405: 0x6c380420, 0x19407: 0x6c9b1020, + 0x19408: 0x6c578e20, 0x1940b: 0x6c4d6620, + 0x1940c: 0x6cbc4420, 0x1940d: 0x6c1f4620, 0x1940e: 0x6cc3d420, 0x1940f: 0x6c334e20, + 0x19410: 0x6c863820, 0x19411: 0x6c03b820, 0x19412: 0x6c6c0420, 0x19413: 0x6d05ee20, + 0x19414: 0x6c963620, 0x19416: 0x6d27de20, 0x19417: 0x6d37ae20, + 0x19418: 0x6c568220, 0x19419: 0x6d1ad220, 0x1941b: 0x6d351020, + 0x1941c: 0x6cb9fa20, 0x1941e: 0x6c419420, 0x1941f: 0x6c667c20, + 0x19420: 0x6d3ae220, 0x19421: 0x6d3ae420, 0x19422: 0x6c7a7820, 0x19423: 0x6ca81a20, + 0x19424: 0x6cc8ca20, 0x19425: 0x6d2ac220, 0x19426: 0x6c020820, 0x19427: 0x6d363820, + 0x19428: 0x6c461a20, 0x19429: 0x6d17b220, 0x1942a: 0x6c1ab020, 0x1942b: 0x6c5ed620, + 0x1942c: 0x6d39a620, 0x1942d: 0x6c81b220, 0x1942e: 0x6cc5ee20, 0x1942f: 0x6cc67620, + 0x19430: 0x6d32c620, 0x19431: 0x6ca34220, 0x19432: 0x6c12ec20, + 0x19435: 0x6d151e20, 0x19436: 0x6c746820, 0x19437: 0x6c0cee20, + 0x19438: 0x6c1a1e20, 0x19439: 0x6c75ce20, 0x1943a: 0x6c312620, 0x1943b: 0x6cefe420, + 0x1943c: 0x6d17fa20, 0x1943d: 0x6d306020, 0x1943e: 0x6d0cae20, + // Block 0x651, offset 0x19440 + 0x19440: 0x6cca0220, 0x19441: 0x6c950220, 0x19442: 0x6cb2be20, 0x19443: 0x6d2f9020, + 0x19444: 0x6c4e2020, 0x19445: 0x6d239a20, 0x19446: 0x6c278220, 0x19447: 0x6d2fca20, + 0x19448: 0x6c3a3e20, 0x19449: 0x6ccc6620, 0x1944a: 0x6c8d3820, 0x1944b: 0x6cde7a20, + 0x1944c: 0x6cc12220, 0x1944d: 0x6c986e20, 0x1944e: 0x6d132c20, 0x1944f: 0x6c05d220, + 0x19450: 0x6c4b6e20, 0x19451: 0x6c489e20, 0x19452: 0x6ca43620, 0x19453: 0x6c442420, + 0x19455: 0x6cd28420, 0x19456: 0x6c782820, 0x19457: 0x6cdd9220, + 0x19458: 0x6c225c20, 0x19459: 0x6d394620, 0x1945a: 0x6cdf3820, 0x1945b: 0x6c7b3420, + 0x1945c: 0x6cbe2420, 0x1945d: 0x6d05d820, 0x1945e: 0x6c322820, 0x1945f: 0x6c131220, + 0x19460: 0x6c58da20, 0x19461: 0x6c234420, 0x19462: 0x6cc9de20, 0x19463: 0x6d336020, + 0x19464: 0x6cb9be20, 0x19465: 0x6c6c5420, 0x19466: 0x6d3fb420, 0x19467: 0x6cf00020, + 0x1946a: 0x6cf8de20, 0x1946b: 0x6ca36c20, + 0x1946c: 0x6cb45420, 0x1946d: 0x6cd9e020, 0x1946e: 0x6c729420, 0x1946f: 0x6d319620, + 0x19470: 0x6cce8620, 0x19471: 0x6ce1e820, 0x19472: 0x6c049c20, 0x19473: 0x6cdea020, + 0x19474: 0x6cba7c20, 0x19475: 0x6cf23a20, 0x19476: 0x6cc6ae20, 0x19477: 0x6c962820, + 0x19478: 0x6c55ca20, 0x19479: 0x6cda2e20, 0x1947a: 0x6d37cc20, 0x1947b: 0x6cb46020, + 0x1947c: 0x6c9ef620, 0x1947d: 0x6c6c6420, 0x1947e: 0x6cce8a20, 0x1947f: 0x6c9d8e20, + // Block 0x652, offset 0x19480 + 0x19480: 0x6cd61c20, 0x19481: 0x6c8d7020, 0x19482: 0x6c82de20, 0x19483: 0x6c67c420, + 0x19484: 0x6c838a20, 0x19485: 0x6d370e20, 0x19486: 0x6c2e0020, + 0x19488: 0x6cca2e20, 0x19489: 0x6c473e20, 0x1948a: 0x6c397220, 0x1948b: 0x6c9ab220, + 0x1948c: 0x6cdc9e20, 0x1948d: 0x6c65f620, 0x1948e: 0x6ce15020, 0x1948f: 0x6d025e20, + 0x19490: 0x6c7a6a20, 0x19491: 0x6cf3fe20, 0x19492: 0x6c38d220, 0x19493: 0x6c963820, + 0x19494: 0x6c117820, 0x19495: 0x6c136620, 0x19496: 0x6c8d7a20, 0x19497: 0x6d142620, + 0x19498: 0x6c23be20, 0x19499: 0x6d27ce20, 0x1949a: 0x6c9b7420, 0x1949b: 0x6d245020, + 0x1949c: 0x6d374220, 0x1949d: 0x6d162020, 0x1949e: 0x6c285620, 0x1949f: 0x6c5e2c20, + 0x194a0: 0x6cef5a20, 0x194a1: 0x6ce03220, 0x194a2: 0x6ccb7e20, 0x194a3: 0x6d024420, + 0x194a4: 0x6cda3620, 0x194a5: 0x6cd97620, 0x194a6: 0x6cb94c20, 0x194a7: 0x6c8eda20, + 0x194a8: 0x6d194620, 0x194aa: 0x6c835a20, 0x194ab: 0x6c84aa20, + 0x194ac: 0x6c3af420, 0x194ad: 0x6c8b6a20, 0x194ae: 0x6c8c8820, 0x194af: 0x6cfd4820, + 0x194b0: 0x6d002c20, 0x194b1: 0x6cab6420, 0x194b2: 0x6c9cbc20, 0x194b3: 0x6cfb1220, + 0x194b4: 0x6cc4f820, 0x194b5: 0x6d3c0220, 0x194b6: 0x6cd6be20, 0x194b7: 0x6d0d1e20, + 0x194b8: 0x6c0be020, 0x194b9: 0x6c8df020, 0x194ba: 0x6c531a20, 0x194bb: 0x6cb5a620, + 0x194bc: 0x6c8a9620, 0x194bd: 0x6c04ca20, 0x194be: 0x6c097e20, 0x194bf: 0x6c554820, + // Block 0x653, offset 0x194c0 + 0x194c0: 0x6c554a20, 0x194c2: 0x6c12f220, 0x194c3: 0x6cae1c20, + 0x194c4: 0x6cbf2c20, 0x194c5: 0x6c9ffe20, 0x194c6: 0x6c700220, 0x194c7: 0x6c10a220, + 0x194c8: 0x6c9a1420, 0x194c9: 0x6cca1e20, 0x194ca: 0x6cf0a820, + 0x194cd: 0x6c841e20, 0x194ce: 0x6cc36220, + 0x194d0: 0x6c5cfa20, 0x194d1: 0x6cfdf220, 0x194d3: 0x6cd3c620, + 0x194d4: 0x6d1c9020, 0x194d6: 0x6ca43820, 0x194d7: 0x6c59f220, + 0x194d8: 0x6c701a20, 0x194d9: 0x6d0c2620, 0x194db: 0x6cc99020, + 0x194dc: 0x6ce96220, 0x194dd: 0x6d022e20, 0x194de: 0x6d309c20, 0x194df: 0x6c9ada20, + 0x194e0: 0x6cf8f420, 0x194e1: 0x6c978a20, 0x194e3: 0x6c5a1820, + 0x194e4: 0x6ce02420, 0x194e5: 0x6d001420, 0x194e6: 0x6d137220, 0x194e7: 0x6c0a9420, + 0x194e8: 0x6c955a20, 0x194e9: 0x6c38d420, 0x194ea: 0x6c870620, 0x194eb: 0x6c251220, + 0x194ec: 0x6c1fa620, 0x194ed: 0x6c2a4620, 0x194ee: 0x6c2bb620, 0x194ef: 0x6c7c1c20, + 0x194f0: 0x6c1ecc20, 0x194f1: 0x6cfb1420, 0x194f2: 0x6c165220, 0x194f3: 0x6c9cce20, + 0x194f4: 0x6cba8e20, 0x194f5: 0x6cc00820, 0x194f6: 0x6d322620, + 0x194fa: 0x6c568620, 0x194fb: 0x6c418c20, + 0x194fc: 0x6c1b9220, 0x194fd: 0x6c48f220, 0x194fe: 0x6ca27a20, 0x194ff: 0x6c0ede20, + // Block 0x654, offset 0x19500 + 0x19500: 0x6c579020, 0x19501: 0x6c44fc20, 0x19502: 0x6d10e820, 0x19503: 0x6c996420, + 0x19504: 0x6cee0820, + 0x19508: 0x6cc7a420, 0x19509: 0x6d090820, 0x1950a: 0x6d32b820, 0x1950b: 0x6c9f4a20, + 0x1950c: 0x6c67a420, 0x1950e: 0x6d2e5a20, 0x1950f: 0x6d423820, + 0x19510: 0x6d26a620, 0x19511: 0x6c8b0620, 0x19513: 0x6d392420, + 0x19514: 0x6c098020, 0x19515: 0x6cc5f020, 0x19516: 0x6d234e20, + 0x19518: 0x6c21c020, 0x19519: 0x6c379820, 0x1951a: 0x6d17b420, 0x1951b: 0x6c9cf620, + 0x1951c: 0x6cbeca20, 0x1951e: 0x6cee1e20, 0x1951f: 0x6c621e20, + 0x19520: 0x6c104020, 0x19522: 0x6c0cae20, 0x19523: 0x6c38a820, + 0x19524: 0x6d26c820, 0x19525: 0x6c83ee20, 0x19526: 0x6c38aa20, 0x19527: 0x6cc1a820, + 0x19528: 0x6c3f7620, 0x19529: 0x6c376220, 0x1952a: 0x6c354420, 0x1952b: 0x6d32e420, + 0x1952c: 0x6ce47020, 0x1952d: 0x6d239c20, 0x1952e: 0x6c6d3020, 0x1952f: 0x6cb70c20, + 0x19530: 0x6c714220, 0x19531: 0x6c7f1e20, 0x19532: 0x6c17f020, 0x19533: 0x6c06d020, + 0x19534: 0x6ca9a820, 0x19535: 0x6d186020, 0x19536: 0x6d065420, 0x19537: 0x6ca1e020, + 0x19538: 0x6d0a3620, 0x19539: 0x6c3eda20, 0x1953b: 0x6ca8ec20, + 0x1953c: 0x6ce64820, 0x1953d: 0x6c082c20, 0x1953e: 0x6d2c8a20, 0x1953f: 0x6ceeae20, + // Block 0x655, offset 0x19540 + 0x19540: 0x6c782a20, 0x19541: 0x6d10b020, 0x19542: 0x6caba420, 0x19543: 0x6cff0820, + 0x19544: 0x6c451a20, 0x19545: 0x6ce13820, 0x19546: 0x6c4b7620, 0x19547: 0x6c5c3a20, + 0x19548: 0x6cddfe20, 0x1954a: 0x6d114620, 0x1954b: 0x6c266820, + 0x1954c: 0x6cb7ea20, 0x1954d: 0x6c6cba20, 0x1954e: 0x6c94c220, 0x1954f: 0x6c9d9020, + 0x19550: 0x6c9d9220, 0x19551: 0x6c64fe20, 0x19552: 0x6c92ec20, 0x19553: 0x6c38c820, + 0x19554: 0x6cab5620, 0x19555: 0x6c9c7e20, 0x19556: 0x6c6b6420, 0x19557: 0x6c3f9220, + 0x19558: 0x6c0d1a20, 0x19559: 0x6c5a7c20, 0x1955a: 0x6cda5c20, 0x1955b: 0x6d115e20, + 0x1955c: 0x6ca89620, 0x1955d: 0x6c6c6c20, 0x1955e: 0x6c88d620, 0x1955f: 0x6c0faa20, + 0x19560: 0x6c652420, 0x19561: 0x6ce3ca20, 0x19562: 0x6c8d8220, 0x19563: 0x6d415220, + 0x19564: 0x6cd20e20, 0x19565: 0x6d1b2620, 0x19566: 0x6c2a4820, 0x19567: 0x6c1e0620, + 0x19568: 0x6c10e220, 0x19569: 0x6c9f1220, 0x1956a: 0x6d0e1620, 0x1956b: 0x6c805620, + 0x1956c: 0x6c1d3420, 0x1956d: 0x6c68b020, 0x1956e: 0x6cd6bc20, 0x1956f: 0x6cc2ac20, + 0x19570: 0x6ca8c820, 0x19571: 0x6c964c20, 0x19573: 0x6cd21e20, + 0x19574: 0x6c965020, 0x19575: 0x6d3a4c20, 0x19577: 0x6c1d6e20, + 0x19578: 0x6c734e20, 0x19579: 0x6c6f0c20, 0x1957a: 0x6c379a20, 0x1957b: 0x6d17b820, + 0x1957c: 0x6cc8d620, 0x1957d: 0x6c113c20, 0x1957e: 0x6cc57a20, 0x1957f: 0x6c3edc20, + // Block 0x656, offset 0x19580 + 0x19580: 0x6c7fb820, 0x19581: 0x6cdcaa20, 0x19582: 0x6d20e220, 0x19583: 0x6d1f1c20, + 0x19584: 0x6c2d1820, 0x19585: 0x6c8cf420, 0x19586: 0x6d3aec20, 0x19587: 0x6cde5220, + 0x19588: 0x6cb29e20, 0x19589: 0x6d2d2a20, 0x1958a: 0x6c684c20, 0x1958b: 0x6c20de20, + 0x1958c: 0x6c10ac20, 0x1958d: 0x6c7a0620, 0x1958e: 0x6c25b620, + 0x19590: 0x6c4e5220, 0x19591: 0x6c4e5420, 0x19592: 0x6ca20020, 0x19593: 0x6c567420, + 0x19594: 0x6c457220, 0x19595: 0x6c2b2020, 0x19596: 0x6c3e3c20, 0x19597: 0x6d088020, + 0x19598: 0x6c9c4c20, 0x19599: 0x6c9a0420, 0x1959a: 0x6c811e20, 0x1959b: 0x6c481e20, + 0x1959c: 0x6d2fc020, 0x1959d: 0x6cde6620, 0x1959e: 0x6d23a220, 0x1959f: 0x6d402820, + 0x195a0: 0x6c844820, 0x195a1: 0x6c92d820, 0x195a2: 0x6cf3f620, 0x195a3: 0x6c826c20, + 0x195a4: 0x6c615e20, 0x195a5: 0x6c875220, 0x195a6: 0x6c84d820, + 0x195a8: 0x6cb30420, 0x195a9: 0x6d101020, 0x195aa: 0x6cec2e20, 0x195ab: 0x6ceb1a20, + 0x195ac: 0x6cae6e20, 0x195ae: 0x6d2fb420, 0x195af: 0x6c4b0220, + 0x195b1: 0x6d061e20, 0x195b2: 0x6ca38020, 0x195b3: 0x6cc3e420, + 0x195b4: 0x6ceff620, 0x195b5: 0x6d32e620, 0x195b6: 0x6c300e20, 0x195b7: 0x6cf00820, + 0x195b8: 0x6c0f6020, 0x195ba: 0x6c595820, 0x195bb: 0x6d08c020, + 0x195bc: 0x6d295620, 0x195bd: 0x6c877220, 0x195be: 0x6d0d6020, 0x195bf: 0x6c59ae20, + // Block 0x657, offset 0x195c0 + 0x195c0: 0x6d095820, 0x195c1: 0x6c554c20, 0x195c2: 0x6c05f820, 0x195c3: 0x6cc4c220, + 0x195c4: 0x6cfeba20, 0x195c5: 0x6cb38620, 0x195c6: 0x6c8a9820, 0x195c7: 0x6d388a20, + 0x195c8: 0x6d17ba20, 0x195c9: 0x6d06e220, 0x195ca: 0x6c960820, 0x195cb: 0x6c77be20, + 0x195cc: 0x6c1f5620, 0x195ce: 0x6ca35620, 0x195cf: 0x6c4e2220, + 0x195d0: 0x6c17a220, 0x195d1: 0x6c929220, 0x195d2: 0x6d2e0620, 0x195d3: 0x6cde7c20, + 0x195d4: 0x6c3da220, 0x195d5: 0x6c52c820, 0x195d6: 0x6d2ba020, 0x195d7: 0x6cbc0620, + 0x195d8: 0x6cdb5020, 0x195d9: 0x6cb1fa20, 0x195da: 0x6c49ba20, + 0x195dc: 0x6c5cd020, 0x195dd: 0x6c1e8020, 0x195df: 0x6c374420, + 0x195e0: 0x6c374620, 0x195e1: 0x6cc85a20, 0x195e2: 0x6cb6e220, 0x195e3: 0x6cd8ba20, + 0x195e4: 0x6c713620, 0x195e6: 0x6d0dbe20, 0x195e7: 0x6c058220, + 0x195e8: 0x6d131e20, 0x195e9: 0x6d3e6c20, 0x195ea: 0x6ca55220, 0x195eb: 0x6c20b220, + 0x195ec: 0x6c03c220, 0x195ed: 0x6c126c20, 0x195ee: 0x6ce42c20, 0x195ef: 0x6c4f1c20, + 0x195f0: 0x6d425220, 0x195f1: 0x6c03d420, 0x195f2: 0x6d301420, 0x195f3: 0x6cec2820, + 0x195f4: 0x6c44c420, 0x195f5: 0x6c098220, 0x195f6: 0x6c37ca20, 0x195f7: 0x6d3af820, + 0x195f8: 0x6cf50220, 0x195f9: 0x6cf19a20, 0x195fa: 0x6d369820, 0x195fb: 0x6d393c20, + 0x195fc: 0x6c929420, 0x195fd: 0x6cf1a020, 0x195fe: 0x6c4bdc20, 0x195ff: 0x6cc08e20, + // Block 0x658, offset 0x19600 + 0x19600: 0x6c7e9420, 0x19601: 0x6d292020, 0x19602: 0x6cda2820, 0x19603: 0x6c9dd420, + 0x19604: 0x6c2c0620, 0x19605: 0x6cb7ec20, 0x19606: 0x6c129a20, 0x19607: 0x6cb1bc20, + 0x19608: 0x6c887820, 0x19609: 0x6cd21020, 0x1960a: 0x6c8ff620, 0x1960b: 0x6cdad620, + 0x1960c: 0x6cb73220, 0x1960d: 0x6d25fa20, 0x1960e: 0x6c3c9e20, 0x1960f: 0x6d056820, + 0x19610: 0x6c73f620, 0x19611: 0x6c2c3020, 0x19612: 0x6cb14820, 0x19613: 0x6c494a20, + 0x19614: 0x6ca98620, 0x19615: 0x6cc5d220, 0x19616: 0x6d321c20, 0x19617: 0x6c412e20, + 0x19618: 0x6cb08a20, 0x19619: 0x6ce05420, 0x1961a: 0x6c179220, 0x1961b: 0x6c217220, + 0x1961c: 0x6c508e20, 0x1961d: 0x6d3b7220, 0x1961e: 0x6ca0ec20, 0x1961f: 0x6c0ce020, + 0x19620: 0x6cb75e20, 0x19621: 0x6cd34620, 0x19622: 0x6c08ca20, 0x19623: 0x6c740620, + 0x19624: 0x6cd8a420, 0x19626: 0x6c485220, 0x19627: 0x6ca32a20, + 0x19628: 0x6c5b4e20, 0x19629: 0x6cf5ca20, 0x1962a: 0x6c37c820, 0x1962b: 0x6d04ca20, + 0x1962c: 0x6ca1ca20, 0x1962e: 0x6cf77220, 0x1962f: 0x6d360220, + 0x19630: 0x6cc8fc20, 0x19631: 0x6c711a20, 0x19632: 0x6c2e9420, 0x19633: 0x6d30f420, + 0x19634: 0x6cced820, 0x19635: 0x6c9bd220, 0x19636: 0x6c098420, 0x19637: 0x6c4eb420, + 0x19638: 0x6d210420, 0x19639: 0x6cfcb820, 0x1963a: 0x6cacd420, 0x1963b: 0x6ca5a620, + 0x1963c: 0x6c119820, 0x1963d: 0x6c109c20, 0x1963f: 0x6cb70020, + // Block 0x659, offset 0x19640 + 0x19640: 0x6c620820, 0x19641: 0x6d3d6420, 0x19642: 0x6c925e20, 0x19643: 0x6c75c220, + 0x19644: 0x6cfccc20, 0x19645: 0x6cf62620, 0x19646: 0x6c113220, 0x19647: 0x6cf1e220, + 0x19648: 0x6d346a20, 0x19649: 0x6d3f5820, 0x1964a: 0x6c7d6820, 0x1964b: 0x6c231a20, + 0x1964c: 0x6ce4f820, 0x1964d: 0x6c1f5820, 0x1964e: 0x6c2b3620, 0x1964f: 0x6c218220, + 0x19650: 0x6cbfb620, 0x19651: 0x6d306220, 0x19652: 0x6d2be220, 0x19653: 0x6cc75420, + 0x19654: 0x6c0d7c20, 0x19655: 0x6c605c20, 0x19656: 0x6cf65420, 0x19657: 0x6d39b220, + 0x19658: 0x6c746a20, 0x19659: 0x6c440a20, 0x1965a: 0x6c5eee20, 0x1965b: 0x6c265620, + 0x1965c: 0x6c187c20, 0x1965d: 0x6cddce20, 0x1965e: 0x6cc92820, 0x1965f: 0x6cfdf420, + 0x19660: 0x6c5a5c20, 0x19661: 0x6cb65020, 0x19662: 0x6d3b1820, 0x19663: 0x6cdcf620, + 0x19664: 0x6c146c20, 0x19665: 0x6cf25a20, 0x19666: 0x6c781a20, 0x19667: 0x6c77c420, + 0x19668: 0x6c47b820, 0x19669: 0x6c410220, 0x1966a: 0x6c396620, 0x1966b: 0x6c234c20, + 0x1966c: 0x6c128c20, 0x1966d: 0x6d36bc20, 0x1966e: 0x6c15d820, 0x1966f: 0x6c825420, + 0x19670: 0x6d04ee20, 0x19671: 0x6d2d4820, 0x19672: 0x6d308220, 0x19673: 0x6d218a20, + 0x19674: 0x6c4b7020, 0x19675: 0x6c45ae20, 0x19676: 0x6d295020, 0x19677: 0x6c27fe20, + 0x19678: 0x6c5e0020, 0x19679: 0x6cd9e220, 0x1967a: 0x6ce0ac20, 0x1967b: 0x6c473020, + 0x1967c: 0x6cf8e620, 0x1967d: 0x6c978020, 0x1967e: 0x6c346620, 0x1967f: 0x6c02f420, + // Block 0x65a, offset 0x19680 + 0x19680: 0x6cb0c420, 0x19681: 0x6cf52a20, 0x19682: 0x6c007c20, 0x19683: 0x6c9b7620, + 0x19684: 0x6cb0d220, 0x19685: 0x6c9b7820, 0x19686: 0x6d103a20, 0x19687: 0x6d374420, + 0x19688: 0x6c0fac20, 0x19689: 0x6d1cc820, 0x1968a: 0x6cef6020, 0x1968b: 0x6cc50e20, + 0x1968c: 0x6c7ffa20, 0x1968d: 0x6d0c4620, 0x1968e: 0x6c161220, 0x1968f: 0x6cc33620, + 0x19690: 0x6d31d820, 0x19691: 0x6cb46a20, 0x19693: 0x6cdf2a20, + 0x19694: 0x6c3a9e20, 0x19695: 0x6cd55620, 0x19697: 0x6c298820, + 0x19698: 0x6c25f220, 0x19699: 0x6cdf9c20, 0x1969a: 0x6ce49820, 0x1969b: 0x6c1ba020, + 0x1969c: 0x6cde9020, 0x1969d: 0x6c642a20, 0x1969e: 0x6cd75e20, 0x1969f: 0x6c5a3220, + 0x196a0: 0x6c8a6820, 0x196a3: 0x6c185e20, + 0x196a4: 0x6c6cf820, 0x196a5: 0x6c360020, 0x196a6: 0x6c464620, 0x196a7: 0x6c3e6420, + 0x196a8: 0x6c34f020, 0x196aa: 0x6c363e20, 0x196ab: 0x6c07f020, + 0x196ac: 0x6ce1ca20, 0x196ad: 0x6c2c6020, 0x196af: 0x6c2c7020, + 0x196b0: 0x6c10a620, 0x196b1: 0x6ced3820, 0x196b2: 0x6d2fd020, 0x196b3: 0x6c950620, + 0x196b4: 0x6cb62620, 0x196b5: 0x6ca2a420, 0x196b6: 0x6cba6c20, + 0x196b8: 0x6d3fae20, 0x196b9: 0x6cd9d620, 0x196bb: 0x6d1f6220, + 0x196bc: 0x6d38ac20, 0x196bd: 0x6cdea620, 0x196bf: 0x6cdb3c20, + // Block 0x65b, offset 0x196c0 + 0x196c0: 0x6c10c220, 0x196c1: 0x6cf7aa20, 0x196c2: 0x6c67c620, 0x196c3: 0x6c12ba20, + 0x196c4: 0x6c406620, 0x196c5: 0x6ce2b820, 0x196c6: 0x6c185220, 0x196c7: 0x6c407820, + 0x196c8: 0x6c3ae020, 0x196c9: 0x6cf48c20, 0x196ca: 0x6cf5ac20, 0x196cb: 0x6d101620, + 0x196cc: 0x6ca04820, 0x196cd: 0x6cad2020, 0x196ce: 0x6c98a620, 0x196cf: 0x6ccbba20, + 0x196d0: 0x6c9bb420, 0x196d1: 0x6c12a820, 0x196d2: 0x6ce57220, 0x196d3: 0x6c764820, + 0x196d4: 0x6c043620, 0x196d5: 0x6cffa620, 0x196d6: 0x6d032620, 0x196d7: 0x6cb76220, + 0x196da: 0x6cceb020, 0x196db: 0x6c590a20, + 0x196dc: 0x6ca96a20, 0x196dd: 0x6cff7820, 0x196de: 0x6c18b220, 0x196df: 0x6c27ce20, + 0x196e0: 0x6c3c3820, 0x196e1: 0x6d1ad420, 0x196e2: 0x6c01fa20, 0x196e3: 0x6cc4be20, + 0x196e4: 0x6cc64420, 0x196e5: 0x6c976020, 0x196e6: 0x6c394c20, 0x196e7: 0x6cc10220, + 0x196e8: 0x6cd2ce20, 0x196e9: 0x6c511820, 0x196ea: 0x6c0b9220, 0x196eb: 0x6c276220, + 0x196ec: 0x6ca11420, 0x196ed: 0x6c2aca20, + 0x196f0: 0x6c7ba020, 0x196f2: 0x6c144220, 0x196f3: 0x6c349620, + 0x196f4: 0x6d1fd220, 0x196f5: 0x6c504020, 0x196f7: 0x6c486020, + 0x196f8: 0x6d095c20, 0x196f9: 0x6c833620, 0x196fa: 0x6c6c9220, 0x196fb: 0x6cb70220, + 0x196fc: 0x6cc11020, 0x196fd: 0x6cee2220, 0x196fe: 0x6d13f620, 0x196ff: 0x6c89e620, + // Block 0x65c, offset 0x19700 + 0x19702: 0x6d0cb020, 0x19703: 0x6d180220, + 0x19704: 0x6d1a7620, 0x19705: 0x6cb60020, 0x19706: 0x6d306420, 0x19707: 0x6cf8a620, + 0x19708: 0x6d180420, 0x19709: 0x6d128620, 0x1970a: 0x6cf3d820, 0x1970b: 0x6d33fa20, + 0x1970c: 0x6d366a20, 0x1970d: 0x6c4e5a20, 0x1970e: 0x6c21c820, 0x1970f: 0x6c3d8420, + 0x19710: 0x6c215220, 0x19711: 0x6cb2b620, 0x19712: 0x6c7afa20, 0x19713: 0x6c1dc220, + 0x19715: 0x6ceb8a20, 0x19716: 0x6cbf4220, 0x19717: 0x6c233020, + 0x19718: 0x6c42d220, 0x19719: 0x6c7acc20, 0x1971a: 0x6cc12620, 0x1971b: 0x6cc12820, + 0x1971c: 0x6d340020, 0x1971d: 0x6c9c0a20, 0x1971e: 0x6c865220, 0x1971f: 0x6d389c20, + 0x19720: 0x6cde8420, 0x19721: 0x6d340220, 0x19722: 0x6c482420, 0x19723: 0x6c899c20, + 0x19724: 0x6c54ee20, 0x19725: 0x6c7e8820, 0x19726: 0x6c2d2620, 0x19727: 0x6c22d820, + 0x19728: 0x6d1bde20, 0x1972b: 0x6cb62a20, + 0x1972d: 0x6c144620, 0x1972e: 0x6c99b020, 0x1972f: 0x6c31b020, + 0x19730: 0x6d19fe20, 0x19731: 0x6c148820, 0x19732: 0x6cc8dc20, 0x19733: 0x6c524020, + 0x19734: 0x6cc87820, 0x19735: 0x6c3d9420, 0x19736: 0x6c7f4e20, 0x19737: 0x6d043420, + 0x19738: 0x6c64e020, 0x19739: 0x6d186220, 0x1973a: 0x6c9a6820, + 0x1973c: 0x6c987620, 0x1973d: 0x6c627e20, 0x1973e: 0x6cdd3a20, 0x1973f: 0x6c4f0c20, + // Block 0x65d, offset 0x19740 + 0x19741: 0x6c868420, 0x19742: 0x6d3f2220, 0x19743: 0x6d412820, + 0x19744: 0x6d114820, 0x19745: 0x6c43a820, 0x19746: 0x6c844c20, 0x19747: 0x6cb71c20, + 0x19748: 0x6c462420, 0x19749: 0x6c868620, 0x1974a: 0x6c0db220, 0x1974b: 0x6cdd3c20, + 0x1974e: 0x6cdb3e20, 0x1974f: 0x6c1e4c20, + 0x19750: 0x6c650220, 0x19751: 0x6d010020, 0x19752: 0x6c076420, 0x19753: 0x6d066020, + 0x19754: 0x6c6eb620, 0x19755: 0x6cb46220, 0x19756: 0x6c8d7220, 0x19757: 0x6cfdd620, + 0x19758: 0x6d42ac20, 0x19759: 0x6c2e4420, 0x1975a: 0x6c216a20, 0x1975b: 0x6cbeb620, + 0x1975c: 0x6ca41020, 0x1975d: 0x6d2cfe20, 0x1975e: 0x6c940820, 0x1975f: 0x6d157420, + 0x19760: 0x6cceba20, 0x19761: 0x6d21ba20, 0x19762: 0x6c575c20, 0x19763: 0x6c845e20, + 0x19764: 0x6cabce20, 0x19767: 0x6c846020, + 0x1976a: 0x6cd6e620, + 0x1976c: 0x6d18d620, 0x1976d: 0x6ca95c20, 0x1976e: 0x6cd83820, 0x1976f: 0x6c7ab020, + 0x19770: 0x6c407a20, 0x19771: 0x6d142820, 0x19772: 0x6c2ab820, 0x19773: 0x6cc49620, + 0x19774: 0x6c131e20, 0x19776: 0x6ce39820, 0x19777: 0x6cbdb420, + 0x19778: 0x6c0c8820, 0x19779: 0x6cdca420, 0x1977a: 0x6cef4c20, 0x1977b: 0x6c33bc20, + 0x1977c: 0x6ccb7a20, 0x1977d: 0x6c00f620, 0x1977e: 0x6cb7f420, 0x1977f: 0x6d420e20, + // Block 0x65e, offset 0x19780 + 0x19780: 0x6c7b7620, 0x19781: 0x6c3a7420, 0x19783: 0x6d1b9620, + 0x19785: 0x6ccaea20, 0x19786: 0x6c314820, 0x19787: 0x6c5c8220, + 0x19788: 0x6d026220, 0x19789: 0x6d2b1c20, 0x1978a: 0x6ce03420, 0x1978b: 0x6ce15a20, + 0x1978c: 0x6d374620, 0x1978d: 0x6d191620, 0x1978e: 0x6c3f1c20, 0x1978f: 0x6c359420, + 0x19791: 0x6c75fc20, 0x19792: 0x6c638e20, 0x19793: 0x6c141220, + 0x19794: 0x6cfbca20, 0x19795: 0x6c981420, 0x19797: 0x6c0aba20, + 0x19798: 0x6c8d9220, 0x19799: 0x6c6b7620, 0x1979a: 0x6c7d3620, 0x1979b: 0x6c63f620, + 0x1979d: 0x6c19a420, 0x1979e: 0x6c813420, 0x1979f: 0x6d03b420, + 0x197a0: 0x6c3af620, 0x197a1: 0x6c936e20, 0x197a2: 0x6d2c9e20, 0x197a3: 0x6c51a420, + 0x197a4: 0x6c5f9420, 0x197a5: 0x6ca66220, 0x197a6: 0x6d1cd620, 0x197a7: 0x6d002e20, + 0x197a8: 0x6ce2d820, 0x197a9: 0x6c81c820, 0x197aa: 0x6d2b2820, 0x197ab: 0x6c7cba20, + 0x197ad: 0x6cb9e620, 0x197ae: 0x6c719020, 0x197af: 0x6cb18c20, + 0x197b0: 0x6c38f220, 0x197b1: 0x6ce80020, 0x197b2: 0x6c8c4020, 0x197b3: 0x6c9cc020, + 0x197b4: 0x6d3de820, 0x197b5: 0x6d013020, 0x197b6: 0x6c56ee20, 0x197b7: 0x6c9cc220, + 0x197b8: 0x6c6a4820, 0x197b9: 0x6d28e220, 0x197ba: 0x6c23d620, 0x197bb: 0x6c87b220, + 0x197bc: 0x6cc4a020, 0x197bd: 0x6d3a4a20, 0x197be: 0x6d1ab820, 0x197bf: 0x6c4f4020, + // Block 0x65f, offset 0x197c0 + 0x197c1: 0x6d198620, 0x197c2: 0x6c948020, 0x197c3: 0x6d274420, + 0x197c4: 0x6cc4a420, 0x197c5: 0x6c8df620, 0x197c6: 0x6ca78620, 0x197c7: 0x6d24b620, + 0x197c8: 0x6caaa020, 0x197ca: 0x6d174020, 0x197cb: 0x6caaa420, + 0x197cc: 0x6d174220, 0x197cd: 0x6cb98020, 0x197ce: 0x6cf9b620, 0x197cf: 0x6c1edc20, + 0x197d0: 0x6d1a6820, 0x197d1: 0x6c9d4820, 0x197d2: 0x6cf65820, 0x197d3: 0x6ca35a20, + 0x197d4: 0x6c76de20, 0x197d5: 0x6d412020, 0x197d6: 0x6cf9da20, 0x197d7: 0x6d0cc620, + 0x197d8: 0x6ce8f420, 0x197d9: 0x6ce30020, 0x197da: 0x6cf38820, 0x197db: 0x6cdda820, + 0x197dc: 0x6d1aaa20, 0x197dd: 0x6c1d0a20, 0x197de: 0x6d38de20, 0x197df: 0x6c988620, + 0x197e0: 0x6d254820, 0x197e1: 0x6caa8020, 0x197e2: 0x6c9e7020, 0x197e3: 0x6d2a4820, + 0x197e4: 0x6ced1420, 0x197e5: 0x6c83ca20, 0x197e6: 0x6cc10420, 0x197e7: 0x6ca33a20, + 0x197e8: 0x6cd26220, 0x197e9: 0x6c098c20, 0x197ea: 0x6d3e2a20, 0x197eb: 0x6c056c20, + 0x197ed: 0x6c736c20, 0x197ee: 0x6cfde620, 0x197ef: 0x6c7c7c20, + 0x197f0: 0x6cac2c20, 0x197f1: 0x6c7ba220, 0x197f2: 0x6d0a1220, 0x197f3: 0x6d2cc620, + 0x197f4: 0x6d10fc20, 0x197f5: 0x6c7d6a20, 0x197f6: 0x6c5acc20, 0x197f7: 0x6cf65a20, + 0x197f8: 0x6c357420, 0x197f9: 0x6d0fcc20, 0x197fa: 0x6ce59020, 0x197fb: 0x6d1f4e20, + 0x197fc: 0x6c746c20, 0x197fd: 0x6c83f620, 0x197ff: 0x6c842020, + // Block 0x660, offset 0x19800 + 0x19800: 0x6c198020, 0x19801: 0x6c624e20, 0x19802: 0x6c562a20, 0x19803: 0x6d2e7020, + 0x19804: 0x6c3f7a20, 0x19805: 0x6c16ba20, 0x19806: 0x6c495c20, 0x19807: 0x6c714420, + 0x19808: 0x6c9b3220, 0x19809: 0x6c167820, 0x1980a: 0x6ce0a620, 0x1980b: 0x6ca1e220, + 0x1980c: 0x6d039e20, 0x1980d: 0x6c852620, 0x1980e: 0x6d0c2a20, 0x1980f: 0x6cd9da20, + 0x19810: 0x6cd1ee20, 0x19811: 0x6d186420, 0x19812: 0x6c0e2a20, 0x19813: 0x6c234e20, + 0x19814: 0x6c542c20, 0x19815: 0x6ced3a20, 0x19816: 0x6c2c9620, 0x19817: 0x6c5f4420, + 0x19818: 0x6c443820, 0x19819: 0x6c4e3420, 0x1981a: 0x6c0f6220, 0x1981b: 0x6d04f420, + 0x1981c: 0x6c8ea220, 0x1981d: 0x6c11ae20, 0x1981e: 0x6c11b020, 0x1981f: 0x6d18d820, + 0x19820: 0x6d082c20, 0x19821: 0x6d0ce020, 0x19822: 0x6d2a5c20, 0x19823: 0x6c4f1e20, + 0x19824: 0x6d1e0020, 0x19825: 0x6d3fc820, 0x19827: 0x6c775820, + 0x19828: 0x6d21bc20, 0x19829: 0x6cb53820, 0x1982a: 0x6d310620, 0x1982b: 0x6c967e20, + 0x1982e: 0x6cd6e820, 0x1982f: 0x6c6d6a20, + 0x19830: 0x6c49b020, 0x19831: 0x6cb46c20, 0x19832: 0x6c8c7220, + 0x19834: 0x6ce69c20, 0x19835: 0x6c679420, 0x19836: 0x6c7eac20, 0x19837: 0x6d191820, + 0x19838: 0x6d1dce20, 0x19839: 0x6c22ec20, 0x1983a: 0x6d0dfe20, 0x1983b: 0x6c6b7020, + 0x1983c: 0x6d09c820, 0x1983d: 0x6cf11020, 0x1983e: 0x6cfc4c20, 0x1983f: 0x6ca93620, + // Block 0x661, offset 0x19840 + 0x19840: 0x6c408c20, 0x19841: 0x6c445c20, 0x19843: 0x6ca19c20, + 0x19844: 0x6d3b4620, 0x19845: 0x6ca38a20, 0x19846: 0x6cfc5620, 0x19847: 0x6cf1c420, + 0x19848: 0x6c877820, 0x19849: 0x6c11c220, 0x1984a: 0x6c9f1c20, 0x1984b: 0x6c655220, + 0x1984c: 0x6ca6e220, 0x1984d: 0x6c14b020, 0x1984e: 0x6cecb020, 0x1984f: 0x6d069c20, + 0x19850: 0x6caa8220, 0x19851: 0x6c973020, 0x19852: 0x6d417020, 0x19853: 0x6c770c20, + 0x19854: 0x6c761620, 0x19855: 0x6c4f7020, + 0x19858: 0x6d23f420, 0x19859: 0x6cf11220, 0x1985a: 0x6d39fa20, + 0x1985d: 0x6d170a20, 0x1985f: 0x6c2dbc20, + 0x19860: 0x6c3e4420, 0x19861: 0x6c08d620, 0x19862: 0x6d3a6820, 0x19863: 0x6d3f0c20, + 0x19864: 0x6cd5cc20, 0x19865: 0x6cf9ba20, 0x19866: 0x6ca5e020, + 0x19868: 0x6c68fe20, 0x19869: 0x6d0a1420, 0x1986a: 0x6c1cc620, 0x1986b: 0x6caa2220, + 0x1986c: 0x6cc67e20, 0x1986d: 0x6d364220, 0x1986e: 0x6cca6e20, + 0x19870: 0x6cccf020, 0x19871: 0x6d237e20, 0x19873: 0x6c6c4e20, + 0x19875: 0x6c929c20, 0x19876: 0x6c4db020, 0x19877: 0x6c0cb220, + 0x19878: 0x6d183a20, 0x19879: 0x6d41c020, 0x1987a: 0x6d2e7220, 0x1987b: 0x6d23ac20, + 0x1987c: 0x6ced3c20, 0x1987d: 0x6ca5fe20, 0x1987e: 0x6c495e20, 0x1987f: 0x6c748420, + // Block 0x662, offset 0x19880 + 0x19880: 0x6c082820, 0x19881: 0x6c11a220, 0x19883: 0x6c351220, + 0x19884: 0x6cb7c620, 0x19885: 0x6d10b420, 0x19886: 0x6c7d1820, 0x19887: 0x6cc84820, + 0x19888: 0x6c542e20, 0x19889: 0x6d0a3820, 0x1988a: 0x6d020020, + 0x1988c: 0x6c7d1a20, 0x1988e: 0x6d00f020, 0x1988f: 0x6c0f6420, + 0x19890: 0x6c78d820, 0x19891: 0x6c24ec20, 0x19892: 0x6d074020, 0x19893: 0x6c042820, + 0x19894: 0x6cab5820, 0x19895: 0x6d400c20, 0x19897: 0x6ce42e20, + 0x19898: 0x6c1ef220, 0x19899: 0x6c1b5820, 0x1989a: 0x6ca7b420, 0x1989b: 0x6c49ac20, + 0x1989c: 0x6c3cbe20, 0x1989d: 0x6d023020, 0x1989e: 0x6c2aba20, 0x1989f: 0x6cef4e20, + 0x198a0: 0x6c74e220, 0x198a1: 0x6c7d2e20, 0x198a2: 0x6d2bb420, 0x198a3: 0x6cc9ac20, + 0x198a4: 0x6c34bc20, 0x198a5: 0x6c8d8420, 0x198a6: 0x6c9b9a20, + 0x198a8: 0x6c4cde20, 0x198a9: 0x6c9b9c20, 0x198aa: 0x6c8fec20, + 0x198ac: 0x6d1d5e20, 0x198ae: 0x6c49c620, 0x198af: 0x6c248820, + 0x198b0: 0x6c84e620, 0x198b1: 0x6c320c20, 0x198b3: 0x6c0bf220, + 0x198b5: 0x6cf62c20, 0x198b7: 0x6c2a6620, + 0x198b8: 0x6c2a6820, 0x198b9: 0x6cfcba20, 0x198ba: 0x6c880020, + 0x198bc: 0x6ccedc20, 0x198bd: 0x6d00b020, 0x198be: 0x6cd1c420, 0x198bf: 0x6cf09e20, + // Block 0x663, offset 0x198c0 + 0x198c2: 0x6c51d820, 0x198c3: 0x6d1f5a20, + 0x198c4: 0x6c92b220, 0x198c5: 0x6c7f5020, 0x198c6: 0x6d1d0e20, 0x198c7: 0x6cd14c20, + 0x198c8: 0x6c739220, 0x198c9: 0x6cb7e420, 0x198ca: 0x6c65ea20, 0x198cb: 0x6d285c20, + 0x198cd: 0x6cb7f620, 0x198cf: 0x6c8c7c20, + 0x198d0: 0x6c60ea20, 0x198d1: 0x6c970a20, 0x198d2: 0x6c208220, 0x198d3: 0x6ca74620, + 0x198d4: 0x6c0d6e20, 0x198d5: 0x6c87c020, 0x198d6: 0x6c8dfa20, 0x198d7: 0x6c427a20, + 0x198d8: 0x6c1a2020, 0x198d9: 0x6d07b020, 0x198da: 0x6cfc1a20, 0x198db: 0x6c558620, + 0x198dc: 0x6c088620, 0x198dd: 0x6d40d020, 0x198de: 0x6c271a20, 0x198df: 0x6c271c20, + 0x198e0: 0x6c5d3e20, 0x198e1: 0x6cc9d020, 0x198e2: 0x6c184420, 0x198e3: 0x6ce37c20, + 0x198e5: 0x6cab1a20, 0x198e6: 0x6d371420, 0x198e7: 0x6c8ebe20, + 0x198e8: 0x6c3aea20, 0x198e9: 0x6c695e20, 0x198ea: 0x6c493620, 0x198eb: 0x6cf7ba20, + 0x198ec: 0x6c8bf820, 0x198ed: 0x6d07f820, 0x198ee: 0x6cc62a20, 0x198ef: 0x6ce25a20, + 0x198f0: 0x6cb05820, 0x198f1: 0x6d032a20, 0x198f2: 0x6ccd7c20, 0x198f3: 0x6d360e20, + 0x198f4: 0x6cec3220, 0x198f5: 0x6ce81020, 0x198f6: 0x6ce46620, 0x198f7: 0x6d13e820, + 0x198f8: 0x6d019c20, 0x198f9: 0x6cb05c20, 0x198fa: 0x6d10ec20, 0x198fb: 0x6d10ee20, + 0x198fc: 0x6caa8620, 0x198fd: 0x6c503a20, 0x198fe: 0x6ca8e820, 0x198ff: 0x6d1b4a20, + // Block 0x664, offset 0x19900 + 0x19900: 0x6c390a20, 0x19901: 0x6ca3fa20, 0x19902: 0x6d109c20, 0x19903: 0x6ced7e20, + 0x19904: 0x6d25e820, 0x19905: 0x6cf9c820, 0x19906: 0x6d392c20, 0x19907: 0x6d25ea20, + 0x19908: 0x6cd38a20, 0x19909: 0x6c9e5a20, 0x1990a: 0x6cf62e20, 0x1990b: 0x6c621220, + 0x1990c: 0x6ce22a20, 0x1990d: 0x6c3ab020, 0x1990e: 0x6d096020, 0x1990f: 0x6ca5e820, + 0x19910: 0x6c224620, 0x19911: 0x6c9d4a20, 0x19912: 0x6c0ba220, + 0x19914: 0x6ca2e620, 0x19915: 0x6d238020, 0x19916: 0x6c366220, 0x19917: 0x6d353a20, + 0x19918: 0x6cc57420, 0x19919: 0x6d070020, 0x1991a: 0x6c94b020, 0x1991b: 0x6c5be820, + 0x1991c: 0x6d0a9620, 0x1991d: 0x6ca4b820, 0x1991e: 0x6c4eee20, 0x1991f: 0x6c63d620, + 0x19920: 0x6c312e20, 0x19921: 0x6c57b420, 0x19922: 0x6ce86c20, 0x19923: 0x6cb26220, + 0x19924: 0x6c244c20, 0x19925: 0x6cf68220, 0x19926: 0x6cd99820, 0x19927: 0x6c9c6c20, + 0x19928: 0x6d034420, 0x19929: 0x6cf51a20, 0x1992a: 0x6cbf5420, 0x1992b: 0x6d2edc20, + 0x1992c: 0x6ce23620, 0x1992d: 0x6d043620, 0x1992e: 0x6c701e20, 0x1992f: 0x6c728220, + 0x19930: 0x6c5d4020, 0x19931: 0x6ce36e20, 0x19932: 0x6c977420, 0x19933: 0x6d0ea420, + 0x19934: 0x6c5f2020, 0x19935: 0x6cd47a20, 0x19936: 0x6c82d620, 0x19937: 0x6ced4420, + 0x19938: 0x6c183820, 0x19939: 0x6c120a20, 0x1993a: 0x6c6c0620, 0x1993b: 0x6d205820, + 0x1993c: 0x6c5b6620, 0x1993d: 0x6d2c9420, 0x1993e: 0x6cdb4820, 0x1993f: 0x6c444220, + // Block 0x665, offset 0x19940 + 0x19940: 0x6ca51a20, 0x19941: 0x6cf8f820, 0x19943: 0x6c331a20, + 0x19944: 0x6c1b6420, 0x19945: 0x6cef5020, 0x19946: 0x6d30ae20, 0x19947: 0x6c4bf420, + 0x19948: 0x6c175620, 0x19949: 0x6c1ae020, 0x1994a: 0x6d2a2820, 0x1994b: 0x6c5c8420, + 0x1994c: 0x6c944820, 0x1994d: 0x6c8a4620, 0x1994e: 0x6c818a20, 0x1994f: 0x6cead820, + 0x19950: 0x6c5b0420, 0x19951: 0x6cf54620, 0x19952: 0x6c02fa20, 0x19953: 0x6ccf8620, + 0x19954: 0x6cdc0220, 0x19955: 0x6c974c20, 0x19956: 0x6ce0b620, 0x19957: 0x6d035a20, + 0x19958: 0x6c6e4020, 0x19959: 0x6c017620, 0x1995a: 0x6cdee220, 0x1995b: 0x6c156420, + 0x1995c: 0x6cf11a20, 0x1995d: 0x6ce98420, 0x1995e: 0x6c62dc20, 0x1995f: 0x6c18fa20, + 0x19960: 0x6c185820, 0x19961: 0x6d247c20, 0x19962: 0x6cfc6020, 0x19963: 0x6d02d020, + 0x19967: 0x6ca51c20, + 0x19969: 0x6d0f1020, 0x1996a: 0x6cc01e20, 0x1996b: 0x6c675820, + 0x1996c: 0x6cd95c20, 0x1996d: 0x6c75c420, 0x1996e: 0x6c89fc20, 0x1996f: 0x6c714e20, + 0x19971: 0x6c97d220, 0x19972: 0x6c8b7220, + 0x19974: 0x6c1f3820, 0x19975: 0x6c1bae20, 0x19976: 0x6cfdcc20, 0x19977: 0x6cbd3a20, + 0x19978: 0x6c9a6220, 0x19979: 0x6cd5fa20, 0x1997a: 0x6c149020, 0x1997b: 0x6c1bc420, + 0x1997c: 0x6c474620, 0x1997d: 0x6d21a820, 0x1997e: 0x6d1a0420, + // Block 0x666, offset 0x19980 + 0x19980: 0x6c8eac20, 0x19981: 0x6c818020, 0x19982: 0x6cd61e20, 0x19983: 0x6d30be20, + 0x19984: 0x6cd6c420, 0x19985: 0x6c5aac20, + 0x19988: 0x6c364620, 0x1998a: 0x6ccc7020, 0x1998b: 0x6d402e20, + 0x1998c: 0x6c74a620, 0x1998d: 0x6c75ec20, 0x1998e: 0x6ce93820, 0x1998f: 0x6c90ca20, + 0x19990: 0x6cef5c20, 0x19991: 0x6c1cf420, 0x19992: 0x6d3b4820, 0x19993: 0x6c8b7420, + 0x19995: 0x6d30cc20, 0x19996: 0x6d2f8c20, + 0x19998: 0x6d178020, 0x19999: 0x6c1e5c20, 0x1999a: 0x6ca5ea20, 0x1999b: 0x6c0e7820, + 0x1999c: 0x6cdb8620, 0x1999d: 0x6d160620, 0x1999e: 0x6c506020, 0x1999f: 0x6d0bc820, + 0x199a0: 0x6c58ac20, 0x199a1: 0x6c980a20, 0x199a2: 0x6c980c20, 0x199a3: 0x6cc1f220, + 0x199a4: 0x6c81c420, 0x199a5: 0x6c4ffe20, 0x199a6: 0x6d37d620, 0x199a7: 0x6c9f4e20, + 0x199a8: 0x6cfb5620, 0x199a9: 0x6d324420, 0x199aa: 0x6cd55e20, 0x199ab: 0x6d423e20, + 0x199ac: 0x6d3afc20, 0x199ad: 0x6c46aa20, 0x199ae: 0x6d089820, 0x199af: 0x6d17c620, + 0x199b0: 0x6d366e20, 0x199b1: 0x6d00c620, 0x199b2: 0x6c6d1e20, 0x199b3: 0x6c11a420, + 0x199b5: 0x6c10ae20, 0x199b6: 0x6c896a20, 0x199b7: 0x6d341020, + 0x199b8: 0x6c626c20, 0x199b9: 0x6ced4620, 0x199ba: 0x6c49a420, 0x199bb: 0x6c70bc20, + 0x199bc: 0x6c6ea220, 0x199bd: 0x6c00c420, 0x199be: 0x6c404220, 0x199bf: 0x6c4b7220, + // Block 0x667, offset 0x199c0 + 0x199c0: 0x6c548020, 0x199c1: 0x6d0ec620, 0x199c2: 0x6cc87e20, 0x199c3: 0x6d36ee20, + 0x199c4: 0x6c0c9420, 0x199c5: 0x6d157620, 0x199c6: 0x6cdd9e20, 0x199c7: 0x6c2efa20, + 0x199c8: 0x6c4b9620, 0x199c9: 0x6cd18020, 0x199ca: 0x6d0ab820, 0x199cb: 0x6c194620, + 0x199cc: 0x6ccf2020, 0x199cd: 0x6cbe8a20, + 0x199d0: 0x6c218a20, 0x199d1: 0x6c533820, 0x199d2: 0x6c308220, 0x199d3: 0x6c198220, + 0x199d4: 0x6ceff820, 0x199d5: 0x6cc7ea20, 0x199d6: 0x6cd55420, 0x199d7: 0x6c10f220, + 0x199d8: 0x6c600e20, 0x199d9: 0x6d28b620, 0x199da: 0x6cb5d420, 0x199db: 0x6d0c0220, + 0x199dc: 0x6c3fe820, 0x199dd: 0x6d235820, 0x199de: 0x6c3e9020, 0x199df: 0x6cb39220, + 0x199e0: 0x6d33e620, 0x199e1: 0x6ce06220, 0x199e2: 0x6d424020, 0x199e3: 0x6c17ec20, + 0x199e4: 0x6cc19a20, 0x199e5: 0x6d204e20, 0x199e6: 0x6c514a20, 0x199e7: 0x6c547420, + 0x199e8: 0x6c4b0e20, 0x199e9: 0x6c366620, 0x199ea: 0x6c67ea20, 0x199eb: 0x6d27f620, + 0x199ec: 0x6ce83020, 0x199ed: 0x6c259820, 0x199ee: 0x6ce87020, 0x199ef: 0x6c402a20, + 0x199f0: 0x6d424c20, 0x199f1: 0x6c558820, 0x199f3: 0x6c0f4a20, + 0x199f4: 0x6d2f6e20, 0x199f5: 0x6c754a20, 0x199f6: 0x6ce0d020, 0x199f7: 0x6c74aa20, + 0x199f8: 0x6c404620, 0x199f9: 0x6c5a0220, 0x199fa: 0x6c211820, 0x199fb: 0x6d1e5e20, + 0x199fc: 0x6c20f020, 0x199fd: 0x6cdda020, 0x199fe: 0x6c1b5c20, 0x199ff: 0x6cb92a20, + // Block 0x668, offset 0x19a00 + 0x19a00: 0x6c10fc20, 0x19a01: 0x6cff9c20, 0x19a02: 0x6c979220, 0x19a03: 0x6c117c20, + 0x19a04: 0x6cb7f820, 0x19a05: 0x6c66f620, 0x19a06: 0x6c0a9a20, 0x19a07: 0x6c5f8420, + 0x19a08: 0x6d34b820, 0x19a09: 0x6d3a3620, 0x19a0a: 0x6cc1f420, 0x19a0b: 0x6d2e3420, + 0x19a0c: 0x6c60fa20, 0x19a0d: 0x6c0b2420, 0x19a0f: 0x6c878020, + 0x19a10: 0x6c879420, 0x19a11: 0x6d272a20, 0x19a12: 0x6cc34020, 0x19a13: 0x6c195a20, + 0x19a14: 0x6c3fcc20, 0x19a15: 0x6c144020, 0x19a16: 0x6ce19c20, 0x19a17: 0x6cd37420, + 0x19a18: 0x6c4f9620, 0x19a19: 0x6cbcbe20, 0x19a1a: 0x6cb5d620, 0x19a1b: 0x6c0efc20, + 0x19a1c: 0x6ca33e20, 0x19a1d: 0x6ce82a20, 0x19a1e: 0x6c1e7a20, 0x19a1f: 0x6c243c20, + 0x19a20: 0x6d26c020, 0x19a21: 0x6d33e820, 0x19a22: 0x6c18cc20, 0x19a23: 0x6c1f4a20, + 0x19a24: 0x6c09b420, 0x19a25: 0x6c9b1c20, 0x19a26: 0x6c038020, 0x19a27: 0x6ce4a220, + 0x19a28: 0x6c9f5a20, 0x19a29: 0x6c8aba20, 0x19a2a: 0x6c3ccc20, 0x19a2b: 0x6c197420, + 0x19a2c: 0x6cc0b820, 0x19a2d: 0x6ce58820, 0x19a2e: 0x6c3eac20, 0x19a2f: 0x6c7e0820, + 0x19a30: 0x6c65b820, + 0x19a34: 0x6d325620, 0x19a35: 0x6cc08a20, 0x19a36: 0x6d42a820, 0x19a37: 0x6c1c4c20, + 0x19a38: 0x6c7c9420, 0x19a39: 0x6c8b2420, 0x19a3a: 0x6c074a20, 0x19a3b: 0x6c326e20, + 0x19a3c: 0x6cf46c20, 0x19a3e: 0x6d3d9220, 0x19a3f: 0x6c92ba20, + // Block 0x669, offset 0x19a40 + 0x19a40: 0x6ce0d220, 0x19a42: 0x6c1eaa20, 0x19a43: 0x6c89a020, + 0x19a44: 0x6ce51820, 0x19a45: 0x6c7dbe20, 0x19a46: 0x6c16c420, 0x19a47: 0x6c74ac20, + 0x19a48: 0x6ce8ec20, 0x19a49: 0x6c594e20, 0x19a4a: 0x6c3aca20, 0x19a4b: 0x6c0a3c20, + 0x19a4d: 0x6cf97c20, 0x19a4e: 0x6cf31820, 0x19a4f: 0x6c628a20, + 0x19a50: 0x6cc27a20, 0x19a51: 0x6c7cdc20, 0x19a52: 0x6c55c220, 0x19a53: 0x6cbfca20, + 0x19a54: 0x6cdc7c20, 0x19a55: 0x6c10fa20, 0x19a57: 0x6cc0bc20, + 0x19a58: 0x6cb0c820, 0x19a59: 0x6cad1020, 0x19a5a: 0x6cec4020, 0x19a5b: 0x6d115620, + 0x19a5c: 0x6cc6c220, 0x19a5d: 0x6d09b620, 0x19a5e: 0x6c246c20, 0x19a5f: 0x6c2efc20, + 0x19a60: 0x6c1c8a20, 0x19a61: 0x6c25f620, 0x19a62: 0x6c9c1220, 0x19a63: 0x6d086420, + 0x19a64: 0x6c34be20, 0x19a65: 0x6c0d0420, 0x19a66: 0x6d310a20, 0x19a67: 0x6c1ec620, + 0x19a68: 0x6c164220, 0x19a69: 0x6c4b9e20, 0x19a6a: 0x6c32e620, 0x19a6b: 0x6d409420, + 0x19a6c: 0x6c2afe20, 0x19a6d: 0x6c7f3820, 0x19a6e: 0x6ce2da20, 0x19a6f: 0x6d272c20, + 0x19a70: 0x6cc34220, 0x19a71: 0x6d3a5020, 0x19a72: 0x6c8d1020, 0x19a73: 0x6c186c20, + 0x19a74: 0x6d31e020, 0x19a75: 0x6c400220, 0x19a76: 0x6ccf4e20, 0x19a77: 0x6ce5c620, + 0x19a78: 0x6c7ac820, 0x19a79: 0x6c004420, 0x19a7b: 0x6cbf5620, + 0x19a7c: 0x6cd61220, 0x19a7d: 0x6c4d3420, 0x19a7e: 0x6ccd5e20, 0x19a7f: 0x6cec7620, + // Block 0x66a, offset 0x19a80 + 0x19a80: 0x6d2e3620, 0x19a81: 0x6c904a20, 0x19a82: 0x6c6f6220, 0x19a83: 0x6c85b820, + 0x19a85: 0x6c210220, 0x19a86: 0x6cc66c20, 0x19a87: 0x6d26ac20, + 0x19a88: 0x6c743a20, 0x19a89: 0x6c776c20, 0x19a8a: 0x6c390c20, 0x19a8b: 0x6cb5da20, + 0x19a8c: 0x6c534220, 0x19a8d: 0x6c3e7220, 0x19a8e: 0x6c915220, 0x19a8f: 0x6c535820, + 0x19a90: 0x6ceb2a20, 0x19a91: 0x6c9f5c20, 0x19a92: 0x6ce4a420, 0x19a93: 0x6c737c20, + 0x19a94: 0x6cb70620, 0x19a95: 0x6d332620, 0x19a96: 0x6cbece20, 0x19a97: 0x6c45f220, + 0x19a98: 0x6ce4b620, 0x19a99: 0x6c80dc20, 0x19a9a: 0x6c99a620, 0x19a9b: 0x6d1b6a20, + 0x19a9c: 0x6c92c020, 0x19a9d: 0x6d250e20, 0x19a9e: 0x6c715420, 0x19a9f: 0x6cb0b820, + 0x19aa1: 0x6d00f420, 0x19aa2: 0x6c0bbe20, 0x19aa3: 0x6c5cd820, + 0x19aa4: 0x6d39cc20, 0x19aa5: 0x6cc6c820, 0x19aa6: 0x6cca8e20, 0x19aa7: 0x6cf38420, + 0x19aa8: 0x6c144e20, 0x19aa9: 0x6c795820, 0x19aaa: 0x6ccdc420, 0x19aab: 0x6caede20, + 0x19aac: 0x6c980e20, 0x19aad: 0x6d050620, 0x19aaf: 0x6c237020, + 0x19ab0: 0x6c796020, 0x19ab1: 0x6d3bb220, 0x19ab2: 0x6c154620, 0x19ab3: 0x6cd84220, + 0x19ab4: 0x6c1cf620, 0x19ab5: 0x6cdcae20, 0x19ab6: 0x6c076e20, 0x19ab7: 0x6c769e20, + 0x19ab9: 0x6d376020, 0x19aba: 0x6cf12620, 0x19abb: 0x6c9f8420, + 0x19abc: 0x6c8db220, 0x19abd: 0x6d414220, 0x19abe: 0x6ca8d420, 0x19abf: 0x6c8dfc20, + // Block 0x66b, offset 0x19ac0 + 0x19ac0: 0x6cb77420, 0x19ac1: 0x6d26b020, 0x19ac3: 0x6d186820, + 0x19ac4: 0x6cf82220, 0x19ac5: 0x6c18d820, 0x19ac7: 0x6cc71e20, + 0x19ac8: 0x6c18f820, 0x19ac9: 0x6ca9da20, 0x19aca: 0x6d1ef220, 0x19acb: 0x6c618c20, + 0x19acc: 0x6c0ebe20, 0x19acd: 0x6c39ca20, + 0x19ad0: 0x6c242220, 0x19ad1: 0x6c2be820, 0x19ad2: 0x6c684020, 0x19ad3: 0x6d20fc20, + 0x19ad4: 0x6c50fe20, 0x19ad5: 0x6d06b220, 0x19ad6: 0x6d22f820, 0x19ad7: 0x6cc0f620, + 0x19ad9: 0x6c044420, 0x19ada: 0x6c44cc20, 0x19adb: 0x6c6f0e20, + 0x19add: 0x6d0bb820, 0x19ade: 0x6cd5de20, 0x19adf: 0x6d1f3e20, + 0x19ae0: 0x6cd98e20, 0x19ae1: 0x6d130820, 0x19ae2: 0x6c125820, 0x19ae3: 0x6d112a20, + 0x19ae4: 0x6cd5fc20, 0x19ae5: 0x6d0cba20, 0x19ae6: 0x6cd67220, 0x19ae7: 0x6c8aa220, + 0x19ae8: 0x6c235020, 0x19ae9: 0x6d23d420, 0x19aea: 0x6c0f6620, 0x19aeb: 0x6cdbfe20, + 0x19aed: 0x6d0eca20, 0x19aee: 0x6c834820, 0x19aef: 0x6c8bf420, + 0x19af0: 0x6ce30220, 0x19af1: 0x6c31de20, 0x19af2: 0x6d272e20, 0x19af3: 0x6c611620, + 0x19af5: 0x6d278620, + 0x19af8: 0x6c706220, 0x19af9: 0x6c71a820, 0x19afa: 0x6c1e5820, 0x19afb: 0x6c18ac20, + 0x19afc: 0x6c457820, 0x19afd: 0x6cfe4220, 0x19afe: 0x6cfbee20, 0x19aff: 0x6c011c20, + // Block 0x66c, offset 0x19b00 + 0x19b00: 0x6c4ae020, 0x19b01: 0x6d223220, 0x19b02: 0x6c82bc20, + 0x19b04: 0x6ce89c20, 0x19b05: 0x6c18b820, 0x19b06: 0x6d03e020, 0x19b07: 0x6cc03e20, + 0x19b08: 0x6c4f9a20, 0x19b0a: 0x6c292c20, 0x19b0b: 0x6c112e20, + 0x19b0c: 0x6c2bf420, 0x19b0d: 0x6d0d7020, 0x19b0e: 0x6d3e3020, + 0x19b10: 0x6d1bc020, 0x19b11: 0x6c14fa20, 0x19b13: 0x6c840020, + 0x19b14: 0x6cdd7e20, 0x19b15: 0x6c969c20, 0x19b16: 0x6c96a620, + 0x19b18: 0x6ce11e20, 0x19b19: 0x6cade620, 0x19b1a: 0x6c90ae20, 0x19b1b: 0x6cb51820, + 0x19b1c: 0x6c25ec20, 0x19b1d: 0x6ce8ee20, 0x19b1e: 0x6c369a20, 0x19b1f: 0x6c11aa20, + 0x19b20: 0x6c6b2c20, 0x19b21: 0x6d156420, 0x19b22: 0x6c60d020, 0x19b23: 0x6c294220, + 0x19b24: 0x6c752220, 0x19b25: 0x6c08cc20, 0x19b26: 0x6c832620, 0x19b27: 0x6d174a20, + 0x19b28: 0x6c214020, 0x19b29: 0x6c214620, 0x19b2a: 0x6cb38820, 0x19b2b: 0x6c83cc20, + 0x19b2c: 0x6d291420, 0x19b2d: 0x6cdf7020, 0x19b2e: 0x6cb39420, 0x19b2f: 0x6c242620, + 0x19b30: 0x6c725020, 0x19b31: 0x6d070620, 0x19b32: 0x6c395820, + 0x19b34: 0x6d070820, 0x19b35: 0x6c37d420, 0x19b36: 0x6c5d7e20, 0x19b37: 0x6d39b820, + 0x19b38: 0x6cc4c820, 0x19b39: 0x6c381c20, 0x19b3a: 0x6c72fc20, 0x19b3b: 0x6c4db620, + 0x19b3c: 0x6c896e20, 0x19b3d: 0x6d341220, 0x19b3e: 0x6c9d8220, 0x19b3f: 0x6d209a20, + // Block 0x66d, offset 0x19b40 + 0x19b41: 0x6c133a20, 0x19b42: 0x6c9a2c20, 0x19b43: 0x6d1a0620, + 0x19b44: 0x6c9e4220, 0x19b45: 0x6ce8f620, 0x19b46: 0x6c7c9e20, + 0x19b49: 0x6c9d9a20, 0x19b4a: 0x6cc6ca20, 0x19b4b: 0x6d241c20, + 0x19b4c: 0x6cbae620, 0x19b4d: 0x6c9c8c20, 0x19b4e: 0x6c718020, 0x19b4f: 0x6cb07e20, + 0x19b50: 0x6c6cc620, 0x19b51: 0x6cee5e20, 0x19b52: 0x6c62c020, 0x19b53: 0x6c9baa20, + 0x19b54: 0x6c672020, 0x19b55: 0x6d098020, 0x19b56: 0x6c068220, 0x19b57: 0x6c420220, + 0x19b58: 0x6c161e20, 0x19b59: 0x6c87cc20, 0x19b5a: 0x6c851620, 0x19b5b: 0x6cc04020, + 0x19b5c: 0x6c33ee20, 0x19b5d: 0x6d1d3e20, 0x19b5e: 0x6d27ea20, 0x19b5f: 0x6c18ce20, + 0x19b60: 0x6d353220, 0x19b61: 0x6cc4ca20, 0x19b63: 0x6c94b220, + 0x19b64: 0x6c763a20, 0x19b65: 0x6c4b1420, 0x19b66: 0x6d26d620, 0x19b67: 0x6c5c0820, + 0x19b68: 0x6cb0b220, 0x19b69: 0x6c13f820, 0x19b6a: 0x6c34a820, 0x19b6b: 0x6c152220, + 0x19b6c: 0x6ccc1020, 0x19b6d: 0x6cd3c820, 0x19b6e: 0x6ccf7620, 0x19b6f: 0x6d03fa20, + 0x19b70: 0x6d1c9420, 0x19b71: 0x6cd3ca20, 0x19b72: 0x6c1c6420, 0x19b73: 0x6d134820, + 0x19b74: 0x6c4e3620, 0x19b75: 0x6c3ad420, 0x19b76: 0x6d134a20, 0x19b77: 0x6d0de220, + 0x19b78: 0x6d416220, 0x19b79: 0x6cd9ee20, 0x19b7a: 0x6c6c6620, 0x19b7b: 0x6c351a20, + 0x19b7c: 0x6cfd2220, 0x19b7d: 0x6c492e20, 0x19b7e: 0x6ce1f820, 0x19b7f: 0x6cbcfa20, + // Block 0x66e, offset 0x19b80 + 0x19b80: 0x6c15f420, 0x19b81: 0x6c4e4420, 0x19b82: 0x6c9c1420, 0x19b83: 0x6d26fc20, + 0x19b84: 0x6c247020, 0x19b85: 0x6cba8420, 0x19b86: 0x6c6cc420, 0x19b87: 0x6ccdd020, + 0x19b88: 0x6ca25820, 0x19b89: 0x6d251e20, 0x19b8b: 0x6cae8a20, + 0x19b8c: 0x6d336e20, 0x19b8d: 0x6d374a20, 0x19b8e: 0x6c216c20, 0x19b8f: 0x6d22aa20, + 0x19b90: 0x6ca1f820, 0x19b91: 0x6cedae20, 0x19b92: 0x6c681020, 0x19b93: 0x6cb54c20, + 0x19b94: 0x6cdb5e20, 0x19b95: 0x6cb1e220, 0x19b96: 0x6ce4d020, 0x19b97: 0x6c7b7820, + 0x19b98: 0x6c247a20, 0x19b99: 0x6cdcb820, 0x19b9b: 0x6c6a4220, + 0x19b9c: 0x6c671420, 0x19b9d: 0x6c028820, 0x19b9e: 0x6c696e20, 0x19b9f: 0x6d138e20, + 0x19ba1: 0x6d139020, 0x19ba2: 0x6c8ff020, 0x19ba3: 0x6d2a3620, + 0x19ba4: 0x6c05de20, 0x19ba5: 0x6c889a20, 0x19ba7: 0x6c58c620, + 0x19ba8: 0x6c942620, 0x19ba9: 0x6cef7820, 0x19baa: 0x6cfc5820, 0x19bab: 0x6ce60a20, + 0x19bac: 0x6c0fc820, 0x19bad: 0x6d337620, 0x19bae: 0x6d3a3e20, 0x19baf: 0x6c06c420, + 0x19bb0: 0x6c9bba20, 0x19bb1: 0x6d015220, 0x19bb2: 0x6cab6820, 0x19bb3: 0x6d1ed820, + 0x19bb5: 0x6cffc820, 0x19bb6: 0x6c87aa20, 0x19bb7: 0x6d2c6e20, + 0x19bb8: 0x6c9cd020, 0x19bba: 0x6d128420, + 0x19bbd: 0x6cb31620, 0x19bbe: 0x6d014220, + // Block 0x66f, offset 0x19bc0 + 0x19bc2: 0x6ccdd220, 0x19bc3: 0x6d3d1420, + 0x19bc5: 0x6ccddc20, 0x19bc6: 0x6c754020, 0x19bc7: 0x6c61fc20, + 0x19bc8: 0x6c6a2620, 0x19bca: 0x6ca7a420, 0x19bcb: 0x6c028420, + 0x19bcc: 0x6c1f3a20, 0x19bcd: 0x6cf4e420, 0x19bce: 0x6c495420, 0x19bcf: 0x6d01b820, + 0x19bd0: 0x6ce6d020, 0x19bd1: 0x6d096220, 0x19bd2: 0x6c297220, 0x19bd3: 0x6d2d8620, + 0x19bd4: 0x6ce06620, 0x19bd5: 0x6cae7c20, 0x19bd6: 0x6d00d420, 0x19bd7: 0x6d072020, + 0x19bd8: 0x6cfcf220, 0x19bd9: 0x6cd8d820, 0x19bda: 0x6c7aee20, 0x19bdb: 0x6d335a20, + 0x19bdc: 0x6cf3e620, 0x19bdd: 0x6c5d5c20, 0x19bde: 0x6cc90620, 0x19bdf: 0x6cf1ee20, + 0x19be0: 0x6c317a20, 0x19be1: 0x6c58a020, 0x19be2: 0x6c7e1420, 0x19be3: 0x6c405a20, + 0x19be4: 0x6c1fd020, 0x19be5: 0x6cfba420, 0x19be6: 0x6cbdae20, 0x19be7: 0x6cbc8820, + 0x19be8: 0x6c7fba20, 0x19bea: 0x6d0bca20, 0x19beb: 0x6d1c0220, + 0x19bec: 0x6cc40820, 0x19bed: 0x6c4f5620, 0x19bee: 0x6c218c20, 0x19bef: 0x6d371e20, + 0x19bf1: 0x6cf05620, 0x19bf2: 0x6d0d0620, 0x19bf3: 0x6cfe6a20, + 0x19bf4: 0x6d194c20, 0x19bf5: 0x6ca66a20, 0x19bf6: 0x6d335c20, 0x19bf7: 0x6c1fca20, + 0x19bf9: 0x6cd23020, 0x19bfa: 0x6c2f4a20, 0x19bfb: 0x6d3ee020, + 0x19bfc: 0x6c73e820, 0x19bfd: 0x6d067620, 0x19bfe: 0x6d255a20, + // Block 0x670, offset 0x19c00 + 0x19c01: 0x6d063020, 0x19c02: 0x6c2a0220, 0x19c03: 0x6ce48620, + 0x19c04: 0x6c448020, 0x19c05: 0x6d14b420, 0x19c06: 0x6c532420, 0x19c07: 0x6d13dc20, + 0x19c09: 0x6c851220, 0x19c0a: 0x6c7a3820, 0x19c0b: 0x6cfc0820, + 0x19c0c: 0x6cdbbe20, 0x19c0d: 0x6cf87620, 0x19c0e: 0x6d088620, + 0x19c11: 0x6c2b2a20, 0x19c12: 0x6c7f0420, 0x19c13: 0x6d387e20, + 0x19c14: 0x6ca76420, 0x19c15: 0x6c19f820, 0x19c16: 0x6c668620, 0x19c17: 0x6c09ba20, + 0x19c18: 0x6d3bc820, 0x19c19: 0x6c8d1620, 0x19c1a: 0x6c504e20, 0x19c1b: 0x6c058020, + 0x19c1c: 0x6ce10a20, 0x19c1d: 0x6c1ac220, 0x19c1e: 0x6c96c820, 0x19c1f: 0x6cfce420, + 0x19c20: 0x6cd69420, 0x19c21: 0x6d1da020, 0x19c22: 0x6cc12c20, + 0x19c24: 0x6cb44c20, 0x19c25: 0x6c5c2020, 0x19c26: 0x6cef3620, 0x19c27: 0x6d161620, + 0x19c28: 0x6d134c20, 0x19c2a: 0x6c184820, 0x19c2b: 0x6c4ff820, + 0x19c2c: 0x6c0d5a20, 0x19c2e: 0x6cfd3620, 0x19c2f: 0x6c155e20, + 0x19c30: 0x6c5d4e20, 0x19c32: 0x6c4ebc20, 0x19c33: 0x6c224220, + 0x19c34: 0x6d33ec20, 0x19c35: 0x6cb5f220, 0x19c36: 0x6c7c7e20, 0x19c37: 0x6cc75620, + 0x19c39: 0x6d1bca20, 0x19c3a: 0x6d047e20, + 0x19c3c: 0x6c55a020, 0x19c3d: 0x6c250620, 0x19c3f: 0x6cc3fc20, + // Block 0x671, offset 0x19c40 + 0x19c40: 0x6c2b9220, 0x19c41: 0x6cf53020, 0x19c42: 0x6cbfd020, + 0x19c44: 0x6d0eee20, 0x19c45: 0x6c8a5020, 0x19c46: 0x6c08a620, + 0x19c48: 0x6c0d7220, 0x19c4a: 0x6d252c20, 0x19c4b: 0x6caaa620, + 0x19c4c: 0x6c05c620, 0x19c4d: 0x6d1cf220, 0x19c4e: 0x6c536c20, 0x19c4f: 0x6c225820, + 0x19c50: 0x6cb87220, 0x19c51: 0x6ce35a20, 0x19c52: 0x6d23b220, 0x19c53: 0x6c824c20, + 0x19c54: 0x6c05d020, 0x19c56: 0x6c625620, 0x19c57: 0x6c3ee820, + 0x19c58: 0x6cfd0420, 0x19c59: 0x6c133820, 0x19c5a: 0x6c550620, 0x19c5b: 0x6ccb6620, + 0x19c5c: 0x6c080a20, 0x19c5d: 0x6cbe5620, 0x19c5e: 0x6d22a020, 0x19c5f: 0x6cebf620, + 0x19c60: 0x6c007a20, 0x19c61: 0x6c4e3c20, 0x19c62: 0x6c28d020, 0x19c63: 0x6c444620, + 0x19c64: 0x6c2b9c20, 0x19c65: 0x6c5e2020, 0x19c66: 0x6cace420, + 0x19c68: 0x6d3c6a20, 0x19c69: 0x6c8d7c20, 0x19c6a: 0x6c970820, 0x19c6b: 0x6c974820, + 0x19c6c: 0x6c888c20, 0x19c6d: 0x6cff4220, 0x19c6e: 0x6d093220, 0x19c6f: 0x6d327820, + 0x19c70: 0x6cb3b820, 0x19c71: 0x6c408e20, 0x19c72: 0x6caa0e20, 0x19c73: 0x6cf93220, + 0x19c74: 0x6c338e20, 0x19c75: 0x6c28f020, 0x19c76: 0x6d280c20, 0x19c77: 0x6cfd5220, + 0x19c78: 0x6d1b3020, 0x19c79: 0x6cd52220, 0x19c7a: 0x6c339420, 0x19c7b: 0x6c086820, + 0x19c7c: 0x6c56e620, 0x19c7d: 0x6c3a5420, 0x19c7e: 0x6c3aa820, 0x19c7f: 0x6d28be20, + // Block 0x672, offset 0x19c80 + 0x19c80: 0x6c075620, 0x19c81: 0x6c3a2820, 0x19c82: 0x6cfab820, 0x19c83: 0x6cd3ae20, + 0x19c84: 0x6c9e3020, 0x19c85: 0x6d2e0820, 0x19c86: 0x6d2e0a20, 0x19c87: 0x6d2d8c20, + 0x19c88: 0x6c5c4820, 0x19c89: 0x6c3f8820, 0x19c8a: 0x6ced5a20, 0x19c8b: 0x6ca0b420, + 0x19c8c: 0x6cbc1020, 0x19c8d: 0x6c8a8a20, 0x19c8f: 0x6c9f1e20, + 0x19c90: 0x6c54d820, 0x19c91: 0x6c535e20, 0x19c92: 0x6d213c20, 0x19c93: 0x6cb60820, + 0x19c94: 0x6c350420, 0x19c95: 0x6c020020, 0x19c97: 0x6c03ba20, + 0x19c98: 0x6c2c7820, 0x19c99: 0x6d08aa20, 0x19c9a: 0x6c2c8a20, 0x19c9b: 0x6c0a0e20, + 0x19c9c: 0x6d393e20, 0x19c9d: 0x6cad6020, 0x19c9e: 0x6ce5f620, 0x19c9f: 0x6d155020, + 0x19ca1: 0x6c63ea20, 0x19ca2: 0x6d36f220, 0x19ca3: 0x6ce8f820, + 0x19ca4: 0x6d00f820, 0x19ca5: 0x6c28ba20, 0x19ca6: 0x6ce5a620, 0x19ca7: 0x6d022620, + 0x19ca8: 0x6c172620, 0x19ca9: 0x6d25f220, 0x19caa: 0x6c496a20, 0x19cab: 0x6c89a420, + 0x19cac: 0x6c083220, 0x19cae: 0x6c930020, 0x19caf: 0x6c60e420, + 0x19cb0: 0x6d08c220, 0x19cb1: 0x6cd62420, 0x19cb2: 0x6c318220, 0x19cb3: 0x6cd9f420, + 0x19cb4: 0x6c55e220, 0x19cb5: 0x6d286420, 0x19cb6: 0x6c160820, 0x19cb7: 0x6c054620, + 0x19cb8: 0x6cc6da20, 0x19cb9: 0x6c359c20, 0x19cba: 0x6cf24020, 0x19cbb: 0x6c03ca20, + 0x19cbc: 0x6c3cc220, 0x19cbd: 0x6d209e20, 0x19cbe: 0x6d310c20, 0x19cbf: 0x6c3bae20, + // Block 0x673, offset 0x19cc0 + 0x19cc0: 0x6c496c20, 0x19cc1: 0x6c104c20, 0x19cc2: 0x6c446220, 0x19cc3: 0x6c33c420, + 0x19cc4: 0x6c5a3420, 0x19cc5: 0x6c31f820, 0x19cc6: 0x6ce3ce20, 0x19cc7: 0x6c0fcc20, + 0x19cc8: 0x6cba8a20, 0x19cc9: 0x6c8b8220, 0x19cca: 0x6c901620, 0x19ccb: 0x6cf13420, + 0x19ccc: 0x6d2eac20, 0x19ccd: 0x6c801820, 0x19cce: 0x6cdbea20, 0x19ccf: 0x6ca36020, + 0x19cd0: 0x6c0a1020, 0x19cd1: 0x6ceb3e20, 0x19cd2: 0x6d3b1a20, 0x19cd3: 0x6c2e5c20, + 0x19cd4: 0x6c104620, 0x19cd5: 0x6c716820, 0x19cd6: 0x6cb3b020, 0x19cd7: 0x6cfa0c20, + 0x19cd8: 0x6cf04420, 0x19cd9: 0x6cb3b420, 0x19cda: 0x6c267420, 0x19cdb: 0x6c387220, + 0x19cdc: 0x6c14e420, 0x19cdd: 0x6c56f020, 0x19cde: 0x6d28c020, + 0x19ce4: 0x6c38f020, 0x19ce5: 0x6d028a20, 0x19ce6: 0x6c536020, 0x19ce7: 0x6c1b2e20, + 0x19ce8: 0x6c05c820, 0x19ce9: 0x6d1a7a20, 0x19ceb: 0x6c6dd220, + 0x19cec: 0x6c0f6820, 0x19ced: 0x6cc88820, 0x19cee: 0x6c1e3a20, 0x19cef: 0x6d1c1220, + 0x19cf0: 0x6d143a20, 0x19cf1: 0x6c411820, 0x19cf2: 0x6c7d6c20, 0x19cf3: 0x6d27f020, + 0x19cf4: 0x6d31ec20, 0x19cf5: 0x6d0b5a20, 0x19cf6: 0x6c70b820, 0x19cf7: 0x6c547a20, + 0x19cf8: 0x6c9f7620, 0x19cf9: 0x6c040220, 0x19cfa: 0x6c441c20, 0x19cfb: 0x6c0bb220, + 0x19cfc: 0x6d3d0820, 0x19cfd: 0x6c505420, 0x19cfe: 0x6d31ee20, 0x19cff: 0x6cd14a20, + // Block 0x674, offset 0x19d00 + 0x19d00: 0x6c44a020, 0x19d01: 0x6c0a3e20, 0x19d02: 0x6c34b220, 0x19d03: 0x6c216820, + 0x19d04: 0x6c1fb220, 0x19d05: 0x6cca5a20, 0x19d06: 0x6c1a4620, 0x19d07: 0x6cc48a20, + 0x19d08: 0x6c191220, 0x19d09: 0x6c99b820, 0x19d0a: 0x6cadf220, 0x19d0b: 0x6ceec220, + 0x19d0c: 0x6cb07420, 0x19d0d: 0x6c3f8c20, 0x19d0e: 0x6d3d0e20, 0x19d0f: 0x6cb53c20, + 0x19d10: 0x6c8bec20, 0x19d11: 0x6d142020, 0x19d12: 0x6c9adc20, 0x19d13: 0x6cf3f820, + 0x19d14: 0x6cb7fa20, 0x19d15: 0x6c2f0020, 0x19d16: 0x6c191a20, 0x19d17: 0x6cfa0e20, + 0x19d18: 0x6c518e20, 0x19d19: 0x6cca9220, 0x19d1a: 0x6c487e20, 0x19d1b: 0x6c543e20, + 0x19d1c: 0x6c023420, 0x19d1d: 0x6c3f9420, 0x19d1e: 0x6cbbc620, 0x19d1f: 0x6c5d4c20, + 0x19d20: 0x6cafa220, 0x19d21: 0x6d0cf820, 0x19d22: 0x6cd84420, 0x19d23: 0x6cf7b420, + 0x19d24: 0x6ca02420, 0x19d25: 0x6c7ce420, 0x19d26: 0x6c445620, + 0x19d28: 0x6c02fc20, 0x19d29: 0x6cca4220, 0x19d2a: 0x6cd6ee20, 0x19d2b: 0x6c90d820, + 0x19d2c: 0x6d320620, 0x19d2d: 0x6c5c9a20, 0x19d2e: 0x6c156620, + 0x19d30: 0x6c8c8420, 0x19d31: 0x6ca2ee20, 0x19d32: 0x6c4f3c20, 0x19d33: 0x6c31fc20, + 0x19d34: 0x6c6d7820, 0x19d35: 0x6c9df420, 0x19d36: 0x6c38fa20, 0x19d37: 0x6c370020, + 0x19d38: 0x6c174220, 0x19d39: 0x6c536220, 0x19d3a: 0x6c536e20, 0x19d3b: 0x6d238820, + 0x19d3c: 0x6d096a20, 0x19d3d: 0x6cad3a20, 0x19d3e: 0x6c088220, 0x19d3f: 0x6c175220, + // Block 0x675, offset 0x19d40 + 0x19d40: 0x6d1fe220, 0x19d41: 0x6d153a20, 0x19d42: 0x6d096e20, 0x19d43: 0x6cc97e20, + 0x19d44: 0x6d073420, 0x19d45: 0x6c866820, 0x19d46: 0x6c868a20, 0x19d47: 0x6d263220, + 0x19d48: 0x6c336220, 0x19d49: 0x6c5e0420, 0x19d4a: 0x6ccc7e20, 0x19d4b: 0x6c838c20, + 0x19d4c: 0x6cb3ce20, 0x19d4d: 0x6c550e20, 0x19d4e: 0x6c4c8e20, 0x19d4f: 0x6c10c420, + 0x19d50: 0x6cc8a620, 0x19d51: 0x6cf0fa20, 0x19d52: 0x6cd9f620, 0x19d53: 0x6c01dc20, + 0x19d54: 0x6d21cc20, 0x19d55: 0x6cfd8e20, 0x19d56: 0x6c527c20, 0x19d57: 0x6d0fea20, + 0x19d58: 0x6cff4420, 0x19d59: 0x6d116820, 0x19d5b: 0x6c0ac020, + 0x19d5d: 0x6c528420, 0x19d5e: 0x6ce25620, 0x19d5f: 0x6c8eee20, + 0x19d61: 0x6d3b3420, 0x19d63: 0x6cf89a20, + 0x19d64: 0x6d298e20, 0x19d65: 0x6d17d420, 0x19d66: 0x6c312a20, 0x19d67: 0x6d259020, + 0x19d68: 0x6c700820, 0x19d6a: 0x6c0f2020, 0x19d6b: 0x6ce35c20, + 0x19d6c: 0x6d1d0220, 0x19d6e: 0x6d154020, 0x19d6f: 0x6ca70420, + 0x19d70: 0x6ccee220, 0x19d71: 0x6c07c020, 0x19d72: 0x6c465620, 0x19d73: 0x6c04d420, + 0x19d74: 0x6ca14820, 0x19d75: 0x6c410420, 0x19d76: 0x6c372620, 0x19d77: 0x6ccf2e20, + 0x19d79: 0x6d36d620, 0x19d7a: 0x6d106c20, 0x19d7b: 0x6c66ca20, + 0x19d7c: 0x6d263420, 0x19d7d: 0x6cd73020, 0x19d7e: 0x6ce38420, 0x19d7f: 0x6cf02020, + // Block 0x676, offset 0x19d80 + 0x19d80: 0x6d0aaa20, 0x19d81: 0x6d36f620, 0x19d82: 0x6d18bc20, 0x19d83: 0x6cc59c20, + 0x19d84: 0x6cd3ee20, 0x19d85: 0x6c55d420, 0x19d86: 0x6ca55620, 0x19d87: 0x6d126a20, + 0x19d88: 0x6c66f820, 0x19d89: 0x6cdc1220, 0x19d8a: 0x6d1d1e20, 0x19d8b: 0x6c061a20, + 0x19d8c: 0x6c55e420, 0x19d8d: 0x6c55e620, 0x19d8e: 0x6d137a20, + 0x19d90: 0x6d107420, 0x19d91: 0x6c888e20, 0x19d92: 0x6cf72620, 0x19d93: 0x6c372820, + 0x19d94: 0x6c331c20, 0x19d95: 0x6d297e20, 0x19d96: 0x6d3b4420, 0x19d97: 0x6d1d2820, + 0x19d98: 0x6d1d2c20, 0x19d99: 0x6c6cca20, 0x19d9a: 0x6c208820, 0x19d9b: 0x6c28ec20, + 0x19d9d: 0x6c7b4a20, 0x19d9e: 0x6d196020, 0x19d9f: 0x6d139a20, + 0x19da0: 0x6c662e20, 0x19da1: 0x6c372a20, 0x19da2: 0x6ca93e20, 0x19da3: 0x6c228820, + 0x19da4: 0x6cba3420, 0x19da5: 0x6d098220, 0x19da6: 0x6c0ea420, 0x19da7: 0x6c9d1420, + 0x19da8: 0x6cd73a20, 0x19da9: 0x6ca0a620, 0x19daa: 0x6c897c20, 0x19dab: 0x6cb71820, + 0x19dac: 0x6cb71a20, 0x19dad: 0x6cd44c20, 0x19dae: 0x6c3f2020, 0x19daf: 0x6c0f3a20, + 0x19db0: 0x6c085820, 0x19db1: 0x6c0d0020, 0x19db2: 0x6d161c20, 0x19db3: 0x6cf13a20, + 0x19db4: 0x6c587e20, 0x19db5: 0x6c38ac20, 0x19db6: 0x6cb60e20, 0x19db7: 0x6c98f620, + 0x19db8: 0x6c060820, 0x19db9: 0x6c020420, 0x19dba: 0x6c020a20, 0x19dbb: 0x6c403020, + 0x19dbc: 0x6cb63020, 0x19dbd: 0x6cc45020, 0x19dbe: 0x6ceb4020, 0x19dbf: 0x6d187420, + // Block 0x677, offset 0x19dc0 + 0x19dc0: 0x6c0f5420, 0x19dc1: 0x6cb12820, 0x19dc2: 0x6c039220, + 0x19dc4: 0x6d082220, 0x19dc7: 0x6d23fe20, + 0x19dc8: 0x6c1b5620, 0x19dc9: 0x6c915e20, 0x19dca: 0x6d156820, 0x19dcb: 0x6c868c20, + 0x19dcd: 0x6ca7b020, 0x19dce: 0x6cf90220, 0x19dcf: 0x6cf3fa20, + 0x19dd1: 0x6c834a20, 0x19dd2: 0x6cb41a20, 0x19dd3: 0x6d3d1220, + 0x19dd4: 0x6d417e20, 0x19dd5: 0x6d3dc620, 0x19dd6: 0x6c168220, 0x19dd7: 0x6c01de20, + 0x19dd8: 0x6c377220, 0x19dd9: 0x6d244620, 0x19dda: 0x6c839c20, 0x19ddb: 0x6c408220, + 0x19ddc: 0x6d2c6420, 0x19ddd: 0x6c5d0a20, 0x19dde: 0x6c218e20, 0x19ddf: 0x6cd9fe20, + 0x19de0: 0x6c089a20, 0x19de1: 0x6c0ab420, 0x19de2: 0x6d2c6620, + 0x19de4: 0x6c519e20, 0x19de5: 0x6c873a20, 0x19de7: 0x6c4f3220, + 0x19de8: 0x6d292220, 0x19de9: 0x6c474a20, 0x19dea: 0x6c1a5e20, 0x19deb: 0x6c90dc20, + 0x19dec: 0x6ca19e20, 0x19ded: 0x6c9daa20, 0x19dee: 0x6c975020, 0x19def: 0x6c030420, + 0x19df0: 0x6d30c020, 0x19df1: 0x6d3a3a20, 0x19df2: 0x6c5a3820, 0x19df3: 0x6c38f620, + 0x19df4: 0x6c2b0220, 0x19df5: 0x6ce7a420, 0x19df7: 0x6c320220, + 0x19df8: 0x6cf33620, 0x19df9: 0x6cf13020, 0x19dfa: 0x6c62f620, 0x19dfb: 0x6c1ca020, + 0x19dfc: 0x6c8c1220, 0x19dfd: 0x6c0c6420, 0x19dfe: 0x6c901e20, 0x19dff: 0x6c664a20, + // Block 0x678, offset 0x19e00 + 0x19e00: 0x6ca8da20, 0x19e01: 0x6c959e20, 0x19e02: 0x6cd03420, + 0x19e04: 0x6c487a20, 0x19e05: 0x6ca8a820, 0x19e06: 0x6d178a20, 0x19e07: 0x6c7a4820, + 0x19e08: 0x6cece220, 0x19e09: 0x6cebee20, 0x19e0a: 0x6cb87620, 0x19e0b: 0x6c0f5620, + 0x19e0c: 0x6c779220, 0x19e0d: 0x6c8d5020, 0x19e0e: 0x6c423020, 0x19e0f: 0x6c487820, + 0x19e10: 0x6c4d2c20, 0x19e11: 0x6c7bb020, 0x19e12: 0x6c527420, 0x19e13: 0x6c7c4620, + 0x19e14: 0x6d2b0a20, 0x19e15: 0x6ce64e20, 0x19e16: 0x6c80ee20, 0x19e17: 0x6c0a8020, + 0x19e18: 0x6c595a20, 0x19e19: 0x6cb3aa20, 0x19e1a: 0x6d11de20, 0x19e1b: 0x6cedaa20, + 0x19e1c: 0x6ce43c20, 0x19e1d: 0x6cdc1620, 0x19e1e: 0x6c7ad020, 0x19e1f: 0x6c337e20, + 0x19e20: 0x6c02b620, 0x19e21: 0x6c671620, 0x19e22: 0x6ca09c20, 0x19e23: 0x6c7d4220, + 0x19e24: 0x6c7b4c20, 0x19e25: 0x6c01e620, 0x19e26: 0x6c96ea20, 0x19e27: 0x6cbeaa20, + 0x19e28: 0x6cbb8820, 0x19e2a: 0x6c77b820, 0x19e2b: 0x6c508220, + 0x19e2c: 0x6c34c820, 0x19e2d: 0x6cfaa820, 0x19e2e: 0x6ca37c20, 0x19e2f: 0x6cdd3420, + 0x19e30: 0x6c6bf820, 0x19e31: 0x6caf8220, 0x19e32: 0x6cabcc20, 0x19e33: 0x6cd93020, + 0x19e34: 0x6c16bc20, 0x19e35: 0x6ca86c20, 0x19e36: 0x6c977620, 0x19e37: 0x6cd93e20, + 0x19e38: 0x6c22e420, 0x19e39: 0x6cfae420, 0x19e3a: 0x6c7e2420, + 0x19e3c: 0x6c2b9e20, 0x19e3d: 0x6cb3e420, 0x19e3e: 0x6ce5ac20, 0x19e3f: 0x6d40f420, + // Block 0x679, offset 0x19e40 + 0x19e40: 0x6cf2c820, 0x19e41: 0x6c3ae420, 0x19e42: 0x6c115020, 0x19e43: 0x6caee220, + 0x19e44: 0x6cc9d620, 0x19e46: 0x6cc76e20, 0x19e47: 0x6cb68620, + 0x19e48: 0x6c25fc20, 0x19e49: 0x6cac8e20, 0x19e4a: 0x6c0fc020, 0x19e4b: 0x6c979c20, + 0x19e4c: 0x6d401420, 0x19e4d: 0x6c22f220, 0x19e4e: 0x6c7d4420, 0x19e4f: 0x6c62f820, + 0x19e50: 0x6c801420, 0x19e52: 0x6c9bc220, 0x19e53: 0x6c9df820, + 0x19e54: 0x6cac9620, 0x19e55: 0x6c91aa20, 0x19e56: 0x6d416020, + 0x19e58: 0x6c8ee220, 0x19e59: 0x6d160020, 0x19e5a: 0x6cf1a820, 0x19e5b: 0x6c866c20, + 0x19e5c: 0x6c868e20, 0x19e5d: 0x6d2bb820, 0x19e5e: 0x6d3a9220, 0x19e5f: 0x6c5cfc20, + 0x19e60: 0x6cd03c20, 0x19e61: 0x6c1c6620, 0x19e62: 0x6d043c20, 0x19e63: 0x6cee3a20, + 0x19e64: 0x6c302020, 0x19e65: 0x6c5e2220, 0x19e66: 0x6cb07a20, 0x19e67: 0x6c551420, + 0x19e68: 0x6c9ab420, 0x19e69: 0x6c17f420, 0x19e6a: 0x6c9ab820, 0x19e6b: 0x6c175820, + 0x19e6c: 0x6c719620, 0x19e6d: 0x6caa3420, 0x19e6f: 0x6d197620, + 0x19e70: 0x6cc7f020, 0x19e71: 0x6c8e0420, 0x19e72: 0x6d0bba20, + 0x19e74: 0x6cb7bc20, 0x19e75: 0x6d3e7620, 0x19e77: 0x6c058c20, + 0x19e78: 0x6c45aa20, 0x19e79: 0x6d2af620, 0x19e7a: 0x6c6bfe20, 0x19e7b: 0x6d219a20, + 0x19e7c: 0x6cbd9820, 0x19e7d: 0x6c075820, 0x19e7e: 0x6c035820, 0x19e7f: 0x6ceb5020, + // Block 0x67a, offset 0x19e80 + 0x19e80: 0x6d0f6c20, 0x19e81: 0x6cbbfc20, 0x19e82: 0x6d1ff220, 0x19e83: 0x6d36fa20, + 0x19e84: 0x6c6c0a20, 0x19e85: 0x6ca16a20, 0x19e86: 0x6cd12420, 0x19e87: 0x6ccdb820, + 0x19e88: 0x6cb65620, 0x19e89: 0x6ccdba20, 0x19e8a: 0x6c9d0420, 0x19e8b: 0x6c460220, + 0x19e8c: 0x6d157c20, 0x19e8d: 0x6c453e20, 0x19e8e: 0x6c454020, 0x19e8f: 0x6ce82020, + 0x19e90: 0x6c3dac20, 0x19e91: 0x6d092220, 0x19e92: 0x6d137e20, 0x19e93: 0x6ce69a20, + 0x19e94: 0x6ce5ae20, 0x19e95: 0x6ca1f620, 0x19e96: 0x6c8ec620, 0x19e97: 0x6c117e20, + 0x19e98: 0x6c848020, 0x19e99: 0x6cd51820, 0x19e9a: 0x6c932420, 0x19e9b: 0x6c5e3a20, + 0x19e9c: 0x6c263c20, 0x19e9d: 0x6cac1220, 0x19e9e: 0x6c8ed420, 0x19e9f: 0x6c72b820, + 0x19ea0: 0x6d2e9220, 0x19ea1: 0x6c718220, 0x19ea2: 0x6d330a20, 0x19ea3: 0x6d40f820, + 0x19ea4: 0x6cfd3820, 0x19ea5: 0x6d375020, + 0x19ea8: 0x6c7eb020, 0x19eab: 0x6c7ebe20, + 0x19eac: 0x6d060a20, 0x19ead: 0x6c454220, 0x19eae: 0x6c35a220, 0x19eaf: 0x6ca21e20, + 0x19eb0: 0x6d384a20, 0x19eb1: 0x6ce3aa20, 0x19eb2: 0x6d25ce20, 0x19eb3: 0x6d2dc020, + 0x19eb4: 0x6c454420, 0x19eb5: 0x6cf24420, 0x19eb6: 0x6c80f420, 0x19eb7: 0x6d21f620, + 0x19eb8: 0x6cda0820, 0x19eb9: 0x6d2ca020, 0x19eba: 0x6c4d3620, 0x19ebb: 0x6c576e20, + 0x19ebc: 0x6d2e3e20, 0x19ebe: 0x6c90de20, 0x19ebf: 0x6c165020, + // Block 0x67b, offset 0x19ec0 + 0x19ec0: 0x6d376c20, 0x19ec1: 0x6cf12820, 0x19ec2: 0x6d083c20, 0x19ec3: 0x6d2a6420, + 0x19ec4: 0x6c9f8620, 0x19ec5: 0x6c4aac20, 0x19ec6: 0x6cda7020, + 0x19ec9: 0x6cd85420, 0x19eca: 0x6c352820, 0x19ecb: 0x6c134220, + 0x19ecc: 0x6c7b7a20, 0x19ecd: 0x6ce2dc20, 0x19ece: 0x6ca57c20, 0x19ecf: 0x6c819620, + 0x19ed0: 0x6c920820, 0x19ed1: 0x6d159e20, 0x19ed2: 0x6d029220, 0x19ed3: 0x6d0e2a20, + 0x19ed4: 0x6cbe9820, 0x19ed5: 0x6cb42420, 0x19ed6: 0x6c1e1220, 0x19ed7: 0x6cfbe020, + 0x19ed8: 0x6c497020, 0x19ed9: 0x6c6b8a20, 0x19eda: 0x6c7f8220, 0x19edb: 0x6c9bca20, + 0x19edc: 0x6d13ac20, 0x19ede: 0x6c869420, 0x19edf: 0x6d1b8420, + 0x19ee0: 0x6c212620, 0x19ee1: 0x6cbfde20, 0x19ee2: 0x6ce2d220, 0x19ee3: 0x6d21f820, + 0x19ee6: 0x6c278420, 0x19ee7: 0x6c327420, + 0x19ee8: 0x6c537e20, 0x19eea: 0x6cf8c220, + 0x19eec: 0x6cb64820, 0x19eee: 0x6d25a620, 0x19eef: 0x6c609e20, + 0x19ef0: 0x6d285020, 0x19ef1: 0x6c39dc20, 0x19ef2: 0x6c45ac20, 0x19ef3: 0x6c4f8820, + 0x19ef4: 0x6d326620, 0x19ef5: 0x6cc3f620, + 0x19ef8: 0x6c6c0220, 0x19ef9: 0x6cb02020, 0x19efa: 0x6c423220, 0x19efb: 0x6d082820, + 0x19efc: 0x6cd11420, 0x19efd: 0x6cd28c20, 0x19efe: 0x6cbc2a20, 0x19eff: 0x6c227020, + // Block 0x67c, offset 0x19f00 + 0x19f00: 0x6c2eee20, 0x19f01: 0x6c0f7220, 0x19f02: 0x6c2de620, 0x19f03: 0x6ced5020, + 0x19f04: 0x6c227220, 0x19f05: 0x6d355420, 0x19f06: 0x6c041220, 0x19f07: 0x6cf47e20, + 0x19f08: 0x6c061820, 0x19f09: 0x6c28be20, 0x19f0a: 0x6c039420, 0x19f0b: 0x6ce79620, + 0x19f0d: 0x6c45bc20, 0x19f0e: 0x6c702e20, 0x19f0f: 0x6c4b8620, + 0x19f10: 0x6c22e820, 0x19f11: 0x6d1ff420, 0x19f12: 0x6d25ba20, 0x19f13: 0x6c81be20, + 0x19f14: 0x6c716e20, 0x19f15: 0x6c3f1820, 0x19f16: 0x6ca88e20, 0x19f17: 0x6c358c20, + 0x19f18: 0x6c358e20, 0x19f19: 0x6d040e20, 0x19f1a: 0x6c771620, 0x19f1b: 0x6d0ee220, + 0x19f1c: 0x6ce90220, 0x19f1d: 0x6cb3f820, 0x19f1e: 0x6c083820, 0x19f1f: 0x6ca02620, + 0x19f20: 0x6cd73620, 0x19f21: 0x6d0ef220, 0x19f22: 0x6cb68c20, 0x19f23: 0x6d25ca20, + 0x19f24: 0x6c0cca20, 0x19f26: 0x6d07f220, 0x19f27: 0x6c544220, + 0x19f28: 0x6c5a3020, 0x19f29: 0x6d10c220, 0x19f2a: 0x6c73a220, 0x19f2b: 0x6c7cb220, + 0x19f2c: 0x6c36de20, 0x19f2d: 0x6c60f620, 0x19f2e: 0x6ca19220, 0x19f2f: 0x6c1d2e20, + 0x19f30: 0x6c062220, 0x19f31: 0x6cf54e20, 0x19f32: 0x6d327a20, 0x19f33: 0x6d076620, + 0x19f34: 0x6cdee820, 0x19f35: 0x6c1c9620, 0x19f36: 0x6cf74a20, 0x19f37: 0x6c23d220, + 0x19f38: 0x6c968620, 0x19f39: 0x6c7a1020, 0x19f3a: 0x6d0f0820, 0x19f3b: 0x6c11c420, + 0x19f3d: 0x6c520e20, 0x19f3e: 0x6c2ac620, 0x19f3f: 0x6cc49e20, + // Block 0x67d, offset 0x19f40 + 0x19f40: 0x6ce7a820, 0x19f41: 0x6d248c20, 0x19f42: 0x6cfe7020, 0x19f43: 0x6ca4d820, + 0x19f44: 0x6cd76420, 0x19f45: 0x6c3bb220, 0x19f46: 0x6cb47820, 0x19f47: 0x6c8dba20, + 0x19f48: 0x6c02ba20, 0x19f49: 0x6c58d020, 0x19f4a: 0x6d15a020, 0x19f4b: 0x6c58d220, + 0x19f4c: 0x6c9bc620, 0x19f4d: 0x6d1c4e20, 0x19f4e: 0x6c831820, 0x19f4f: 0x6d0f2e20, + 0x19f50: 0x6c062820, 0x19f51: 0x6c2f2c20, 0x19f52: 0x6c8e0620, 0x19f53: 0x6cd1f820, + 0x19f54: 0x6c689020, 0x19f55: 0x6c8b4420, 0x19f56: 0x6c6dee20, 0x19f57: 0x6c718c20, + 0x19f58: 0x6ce30a20, 0x19f59: 0x6cb0e620, 0x19f5a: 0x6c42a620, 0x19f5b: 0x6cff3420, + 0x19f5c: 0x6cec5e20, 0x19f5d: 0x6c1fd420, 0x19f5e: 0x6c2bc420, 0x19f5f: 0x6c588e20, + 0x19f60: 0x6d11d220, 0x19f61: 0x6c866e20, 0x19f62: 0x6c9c7020, 0x19f63: 0x6c550a20, + 0x19f64: 0x6cd11620, 0x19f65: 0x6c638a20, 0x19f66: 0x6d1aa620, 0x19f67: 0x6ceec620, + 0x19f69: 0x6cb18e20, 0x19f6a: 0x6c934420, 0x19f6b: 0x6c8dbc20, + 0x19f6c: 0x6d184420, 0x19f6d: 0x6c111620, 0x19f6e: 0x6ccd9820, 0x19f6f: 0x6c54fe20, + 0x19f70: 0x6cd53620, 0x19f71: 0x6cead420, 0x19f72: 0x6ca16e20, 0x19f73: 0x6c575820, + 0x19f74: 0x6ce61a20, 0x19f75: 0x6c0dfe20, 0x19f76: 0x6caee620, 0x19f77: 0x6c5d0820, + 0x19f78: 0x6c3dae20, 0x19f79: 0x6c4cdc20, 0x19f7a: 0x6c10d020, 0x19f7b: 0x6c849820, + 0x19f7c: 0x6c163e20, 0x19f7d: 0x6cb03420, 0x19f7e: 0x6c260020, 0x19f7f: 0x6c9bb220, + // Block 0x67e, offset 0x19f80 + 0x19f80: 0x6cddc020, 0x19f81: 0x6cbb6020, 0x19f82: 0x6d34c420, 0x19f83: 0x6c7c2420, + 0x19f84: 0x6c08a820, 0x19f85: 0x6c029220, 0x19f86: 0x6c9bc820, 0x19f87: 0x6cfd0620, + 0x19f88: 0x6c7ab420, 0x19f89: 0x6ce7fc20, 0x19f8a: 0x6ce93c20, 0x19f8b: 0x6cf04a20, + 0x19f8c: 0x6cfaf820, 0x19f8e: 0x6ce94220, 0x19f8f: 0x6c81cc20, + 0x19f90: 0x6c162220, 0x19f91: 0x6ca6c420, 0x19f92: 0x6ca6d020, 0x19f93: 0x6c845220, + 0x19f94: 0x6c304620, 0x19f95: 0x6c72c620, 0x19f96: 0x6cba8620, 0x19f97: 0x6c0fc620, + 0x19f98: 0x6cccac20, 0x19f99: 0x6d2c0e20, 0x19f9a: 0x6ce25e20, 0x19f9b: 0x6cba8c20, + 0x19f9c: 0x6ca9ee20, 0x19f9d: 0x6d181620, 0x19f9e: 0x6c6e9e20, 0x19f9f: 0x6c41e820, + 0x19fa0: 0x6c2ba020, 0x19fa1: 0x6c65de20, 0x19fa2: 0x6c9ab020, 0x19fa3: 0x6c26c420, + 0x19fa4: 0x6c660620, 0x19fa5: 0x6d244a20, 0x19fa6: 0x6d024c20, 0x19fa7: 0x6d294820, + 0x19fa8: 0x6c988020, 0x19fa9: 0x6c849a20, 0x19faa: 0x6c4c0a20, 0x19fab: 0x6d09ca20, + 0x19fac: 0x6cdedc20, 0x19fad: 0x6d310e20, 0x19fae: 0x6d107620, 0x19faf: 0x6ce98620, + 0x19fb0: 0x6cce2e20, 0x19fb1: 0x6cf93e20, 0x19fb2: 0x6cbbcc20, 0x19fb3: 0x6cf13620, + 0x19fb4: 0x6d1d6220, 0x19fb5: 0x6c1fa820, 0x19fb6: 0x6cc1ec20, 0x19fb7: 0x6cebfa20, + 0x19fb9: 0x6d343220, 0x19fba: 0x6ce6e420, 0x19fbb: 0x6c47f820, + 0x19fbc: 0x6cce3020, 0x19fbd: 0x6c10ec20, 0x19fbe: 0x6c3f1a20, 0x19fbf: 0x6ce61e20, + // Block 0x67f, offset 0x19fc0 + 0x19fc0: 0x6cded220, 0x19fc1: 0x6cdeea20, 0x19fc2: 0x6d3da620, 0x19fc3: 0x6c4e4020, + 0x19fc4: 0x6cb2da20, 0x19fc5: 0x6c519a20, 0x19fc6: 0x6d3c7420, 0x19fc7: 0x6d396e20, + 0x19fc8: 0x6c0fd220, 0x19fc9: 0x6c8eec20, 0x19fca: 0x6caa8c20, 0x19fcb: 0x6cf71220, + 0x19fcc: 0x6cada220, 0x19fcd: 0x6c2cb420, 0x19fce: 0x6c50ac20, 0x19fcf: 0x6ce44620, + 0x19fd0: 0x6cec8020, 0x19fd1: 0x6ce44a20, 0x19fd2: 0x6cb66a20, 0x19fd3: 0x6c62a820, + 0x19fd4: 0x6c1b6620, 0x19fd5: 0x6c03cc20, 0x19fd6: 0x6c6d7020, 0x19fd7: 0x6c78e820, + 0x19fd8: 0x6c873e20, 0x19fd9: 0x6c72c820, 0x19fda: 0x6cc25620, 0x19fdb: 0x6c7ec820, + 0x19fdc: 0x6c47f020, 0x19fdd: 0x6cb88620, 0x19fde: 0x6cb6b420, 0x19fdf: 0x6cfd5020, + 0x19fe0: 0x6c664220, 0x19fe1: 0x6cd29a20, 0x19fe2: 0x6c655420, 0x19fe3: 0x6c005e20, + 0x19fe4: 0x6c577220, 0x19fe5: 0x6d2c1420, 0x19fe6: 0x6d2b2e20, 0x19fe7: 0x6d11e820, + 0x19fe8: 0x6d2dd820, 0x19fe9: 0x6c630420, 0x19fea: 0x6c145c20, 0x19feb: 0x6d0f3420, + 0x19fec: 0x6c654c20, 0x19fee: 0x6d0e1020, + 0x19ff0: 0x6c68a820, 0x19ff1: 0x6ce7a220, 0x19ff2: 0x6ca41820, 0x19ff3: 0x6d271a20, + 0x19ff5: 0x6c1b6e20, + // Block 0x680, offset 0x1a000 + 0x1a000: 0x6d13b620, 0x1a001: 0x6c2f4020, 0x1a002: 0x6c779820, 0x1a003: 0x6cb4c620, + 0x1a004: 0x6cce4620, 0x1a005: 0x6cfa2420, 0x1a006: 0x6c4e4c20, 0x1a007: 0x6ced6820, + 0x1a008: 0x6d2f1820, 0x1a009: 0x6cc9f220, 0x1a00a: 0x6cce4820, 0x1a00b: 0x6cfa2620, + 0x1a00c: 0x6c5e6220, 0x1a00d: 0x6c105620, 0x1a00e: 0x6d221020, 0x1a00f: 0x6c9dfa20, + 0x1a010: 0x6c411e20, 0x1a011: 0x6c1e1820, 0x1a012: 0x6c1e1a20, 0x1a013: 0x6d3b6c20, + 0x1a014: 0x6cbc8e20, 0x1a015: 0x6caf2220, 0x1a016: 0x6cd2ea20, 0x1a017: 0x6cd2e820, + 0x1a018: 0x6cbf9420, 0x1a019: 0x6c0dba20, 0x1a01a: 0x6d12b820, 0x1a01b: 0x6c237e20, + 0x1a01c: 0x6c2fd620, 0x1a01d: 0x6cd7b820, 0x1a01e: 0x6c19b020, 0x1a01f: 0x6c2fca20, + 0x1a020: 0x6cbf9620, 0x1a021: 0x6c898020, 0x1a022: 0x6c2fcc20, 0x1a023: 0x6d1f9a20, + 0x1a024: 0x6c898220, 0x1a025: 0x6d0c5420, 0x1a026: 0x6c0e0820, 0x1a027: 0x6cca9c20, + 0x1a028: 0x6c4bb620, 0x1a029: 0x6c6f3620, 0x1a02a: 0x6c447a20, 0x1a02b: 0x6d0ac420, + 0x1a02c: 0x6cbb0220, 0x1a02d: 0x6d378220, 0x1a02e: 0x6c611020, 0x1a02f: 0x6c6ba220, + 0x1a030: 0x6c3c0c20, 0x1a031: 0x6c497420, 0x1a032: 0x6c202c20, 0x1a033: 0x6c159620, + 0x1a034: 0x6c8ba220, 0x1a035: 0x6d3d3620, 0x1a036: 0x6d3a5220, 0x1a037: 0x6c4d0420, + 0x1a038: 0x6cecb420, 0x1a039: 0x6c27b220, 0x1a03a: 0x6cf06a20, 0x1a03b: 0x6d3a5420, + 0x1a03c: 0x6c6e0020, 0x1a03d: 0x6c857420, 0x1a03e: 0x6c71aa20, 0x1a03f: 0x6cb1dc20, + // Block 0x681, offset 0x1a040 + 0x1a040: 0x6c3dc220, 0x1a041: 0x6d144620, 0x1a042: 0x6d163420, 0x1a043: 0x6ca38c20, + 0x1a044: 0x6cf55020, 0x1a045: 0x6c6f9c20, 0x1a046: 0x6c6f9e20, 0x1a047: 0x6cea9020, + 0x1a048: 0x6c99c220, 0x1a049: 0x6d163820, 0x1a04a: 0x6d13b820, 0x1a04b: 0x6d337c20, + 0x1a04c: 0x6cf33c20, 0x1a04d: 0x6d2ca620, 0x1a04e: 0x6c56f820, 0x1a04f: 0x6c37f420, + 0x1a050: 0x6c820820, 0x1a051: 0x6d1a1e20, 0x1a052: 0x6cb24620, 0x1a053: 0x6caccc20, + 0x1a054: 0x6cbbce20, 0x1a055: 0x6c560e20, 0x1a056: 0x6c48c220, 0x1a057: 0x6c19c420, + 0x1a058: 0x6c19d420, 0x1a059: 0x6d15aa20, 0x1a05a: 0x6d1abc20, 0x1a05b: 0x6d0bd820, + 0x1a05c: 0x6c9ebc20, 0x1a05d: 0x6c6f9a20, 0x1a05e: 0x6cb6c020, 0x1a05f: 0x6d129c20, + 0x1a060: 0x6cf76820, 0x1a061: 0x6cfd5e20, 0x1a062: 0x6c412020, 0x1a063: 0x6c6fa020, + 0x1a064: 0x6cfa2820, 0x1a065: 0x6c563020, 0x1a066: 0x6cd49620, 0x1a067: 0x6c315a20, + 0x1a068: 0x6cd2aa20, 0x1a069: 0x6c5e7020, 0x1a06a: 0x6ca45420, 0x1a06b: 0x6c631a20, + 0x1a06c: 0x6c71ec20, 0x1a06d: 0x6cd23220, 0x1a06e: 0x6c992220, 0x1a06f: 0x6c549020, + 0x1a070: 0x6c971020, 0x1a071: 0x6c949020, 0x1a072: 0x6d3dfe20, 0x1a073: 0x6cc7f820, + 0x1a074: 0x6d08f620, 0x1a075: 0x6d0d4220, 0x1a076: 0x6c3f3a20, 0x1a077: 0x6ccbcc20, + 0x1a078: 0x6ca2f020, 0x1a079: 0x6c418220, 0x1a07a: 0x6cdd5020, 0x1a07b: 0x6d20d020, + 0x1a07c: 0x6c258c20, 0x1a07d: 0x6d30d420, 0x1a07e: 0x6c419020, 0x1a07f: 0x6d35d220, + // Block 0x682, offset 0x1a080 + 0x1a080: 0x6c4a5020, 0x1a081: 0x6c419820, 0x1a082: 0x6c949a20, 0x1a083: 0x6c8c2220, + 0x1a084: 0x6d17d820, 0x1a085: 0x6c73be20, 0x1a086: 0x6c823620, 0x1a087: 0x6c96ec20, + 0x1a088: 0x6d221220, 0x1a089: 0x6d328020, 0x1a08a: 0x6cd30620, 0x1a08b: 0x6cd31020, + 0x1a08c: 0x6c37b420, 0x1a08d: 0x6c1f0020, 0x1a08e: 0x6d20a220, 0x1a08f: 0x6c7c3020, + 0x1a090: 0x6d20a020, 0x1a091: 0x6d277420, 0x1a092: 0x6c563220, 0x1a093: 0x6cb56020, + 0x1a094: 0x6cf41420, 0x1a095: 0x6c6dfe20, 0x1a096: 0x6cd87220, 0x1a097: 0x6cdc1c20, + 0x1a098: 0x6c44a620, 0x1a099: 0x6c44a820, 0x1a09a: 0x6d0b6c20, 0x1a09b: 0x6d003620, + 0x1a09c: 0x6d0b7420, 0x1a09d: 0x6cb57820, 0x1a09e: 0x6d0b7c20, 0x1a09f: 0x6c5fd820, + 0x1a0a0: 0x6ce7e220, 0x1a0a1: 0x6cedd420, 0x1a0a2: 0x6c777420, 0x1a0a3: 0x6cde2a20, + 0x1a0a4: 0x6c682220, 0x1a0a5: 0x6c4d4e20, 0x1a0a6: 0x6d165220, 0x1a0a7: 0x6c158c20, + 0x1a0a8: 0x6c524420, 0x1a0a9: 0x6ca22220, 0x1a0aa: 0x6d13b220, 0x1a0ab: 0x6cfdd820, + 0x1a0ac: 0x6c6d8e20, 0x1a0ad: 0x6ce66220, 0x1a0ae: 0x6c89aa20, 0x1a0af: 0x6cfdda20, + 0x1a0b0: 0x6c6d9620, 0x1a0b1: 0x6d12d420, 0x1a0b2: 0x6cbd1c20, 0x1a0b3: 0x6c0ece20, + 0x1a0b4: 0x6d204420, 0x1a0b5: 0x6d01a020, 0x1a0b6: 0x6c283820, 0x1a0b7: 0x6c880820, + 0x1a0b8: 0x6c34b420, 0x1a0b9: 0x6c9ae020, 0x1a0ba: 0x6cc55a20, 0x1a0bb: 0x6cc55c20, + 0x1a0bc: 0x6c5fb620, 0x1a0bd: 0x6c630a20, 0x1a0be: 0x6cedd620, 0x1a0bf: 0x6d163a20, + // Block 0x683, offset 0x1a0c0 + 0x1a0c0: 0x6cd03620, 0x1a0c1: 0x6cc55e20, 0x1a0c2: 0x6c820220, 0x1a0c3: 0x6c2f4220, + 0x1a0c4: 0x6d2b3220, 0x1a0c5: 0x6c6c7e20, 0x1a0c6: 0x6cb3fa20, 0x1a0c7: 0x6c1d8c20, + 0x1a0c8: 0x6c030c20, 0x1a0c9: 0x6d2ef620, 0x1a0ca: 0x6c6c1c20, 0x1a0cb: 0x6c6ba420, + 0x1a0cc: 0x6c0da020, 0x1a0cd: 0x6cc61220, 0x1a0ce: 0x6c237c20, 0x1a0cf: 0x6c3d0820, + 0x1a0d0: 0x6cca1220, 0x1a0d1: 0x6c94d420, 0x1a0d2: 0x6c0da220, 0x1a0d3: 0x6c121c20, + 0x1a0d4: 0x6d3ed620, 0x1a0d5: 0x6cd2ee20, 0x1a0d6: 0x6cddda20, 0x1a0d7: 0x6d2f1a20, + 0x1a0d8: 0x6c3fa420, 0x1a0d9: 0x6cfd5620, 0x1a0da: 0x6cfa6a20, 0x1a0db: 0x6cea9220, + 0x1a0dc: 0x6c52e820, 0x1a0dd: 0x6ce70a20, 0x1a0de: 0x6cc5a620, 0x1a0df: 0x6cb88e20, + 0x1a0e0: 0x6c41c220, 0x1a0e1: 0x6c436220, 0x1a0e2: 0x6c0ea620, 0x1a0e3: 0x6c272220, + 0x1a0e4: 0x6c8e1820, 0x1a0e5: 0x6d15ae20, 0x1a0e6: 0x6c17b020, 0x1a0e7: 0x6c169020, + 0x1a0e8: 0x6cc93e20, 0x1a0e9: 0x6cce5a20, 0x1a0ea: 0x6d144a20, 0x1a0eb: 0x6ca25e20, + 0x1a0ec: 0x6c9b0220, 0x1a0ed: 0x6cc5a820, 0x1a0ee: 0x6c63fe20, 0x1a0ef: 0x6c17b220, + 0x1a0f0: 0x6d0ffc20, 0x1a0f1: 0x6cb96820, 0x1a0f2: 0x6d380e20, 0x1a0f3: 0x6cb04620, + 0x1a0f4: 0x6cf2cc20, 0x1a0f5: 0x6cf41820, 0x1a0f6: 0x6c665020, 0x1a0f7: 0x6c643620, + 0x1a0f8: 0x6d117e20, 0x1a0f9: 0x6c3c1220, 0x1a0fa: 0x6c121e20, 0x1a0fb: 0x6cc5ac20, + 0x1a0fc: 0x6ceddc20, 0x1a0fd: 0x6c3bc420, 0x1a0fe: 0x6c2b0c20, 0x1a0ff: 0x6c39b620, + // Block 0x684, offset 0x1a100 + 0x1a100: 0x6d378420, 0x1a101: 0x6cb6c820, 0x1a102: 0x6cadf820, 0x1a103: 0x6d20a620, + 0x1a104: 0x6c2e0620, 0x1a105: 0x6c33d220, 0x1a106: 0x6cf49c20, 0x1a107: 0x6d165620, + 0x1a108: 0x6d030a20, 0x1a109: 0x6c777620, 0x1a10a: 0x6d13bc20, 0x1a10b: 0x6c5fbc20, + 0x1a10c: 0x6c008620, 0x1a10d: 0x6cf55420, 0x1a10e: 0x6c617220, 0x1a10f: 0x6c3dca20, + 0x1a110: 0x6c37f620, 0x1a111: 0x6d04b220, 0x1a112: 0x6c6ccc20, 0x1a113: 0x6caf2420, + 0x1a114: 0x6c281820, 0x1a115: 0x6c3d3420, 0x1a116: 0x6ce16c20, 0x1a117: 0x6d381020, + 0x1a118: 0x6d1e8820, 0x1a119: 0x6c5d8620, 0x1a11a: 0x6c5b8a20, 0x1a11b: 0x6d221420, + 0x1a11c: 0x6c251620, 0x1a11d: 0x6c1fee20, 0x1a11e: 0x6cca1420, 0x1a11f: 0x6cef8220, + 0x1a120: 0x6c1ff020, 0x1a121: 0x6c17cc20, 0x1a122: 0x6d0b0a20, 0x1a123: 0x6cfc7020, + 0x1a124: 0x6ccdfe20, 0x1a125: 0x6c165e20, 0x1a126: 0x6c94d620, 0x1a127: 0x6c122020, + 0x1a128: 0x6d0a6420, 0x1a129: 0x6d031220, 0x1a12a: 0x6cef8420, 0x1a12b: 0x6d3a9a20, + 0x1a12c: 0x6d2b5820, 0x1a12d: 0x6cfb2220, 0x1a12e: 0x6caa4820, 0x1a12f: 0x6c0eaa20, + 0x1a130: 0x6c46e620, 0x1a131: 0x6ca62020, 0x1a132: 0x6ca67a20, 0x1a133: 0x6d015420, + 0x1a134: 0x6c04de20, 0x1a135: 0x6d066a20, 0x1a136: 0x6c8e2c20, 0x1a137: 0x6d38f820, + 0x1a138: 0x6ccfa020, 0x1a139: 0x6cc0ca20, 0x1a13a: 0x6c22ac20, 0x1a13b: 0x6c07ce20, + 0x1a13c: 0x6cd2f620, 0x1a13d: 0x6c631e20, 0x1a13e: 0x6caf2620, 0x1a13f: 0x6d167220, + // Block 0x685, offset 0x1a140 + 0x1a140: 0x6cd87c20, 0x1a141: 0x6d15b620, 0x1a142: 0x6d328220, 0x1a143: 0x6c2d3420, + 0x1a144: 0x6c4d9020, 0x1a145: 0x6c972220, 0x1a146: 0x6c286220, 0x1a147: 0x6d3a9c20, + 0x1a148: 0x6c105a20, 0x1a149: 0x6cc0cc20, 0x1a14a: 0x6c08b420, 0x1a14b: 0x6d2f5020, + 0x1a14c: 0x6c228c20, 0x1a14d: 0x6cf06e20, 0x1a14e: 0x6c2b0e20, 0x1a14f: 0x6d3a9e20, + 0x1a150: 0x6d426220, 0x1a151: 0x6d200e20, 0x1a152: 0x6d0ffe20, 0x1a153: 0x6ce3ba20, + 0x1a154: 0x6d2e4820, 0x1a155: 0x6c50b820, 0x1a156: 0x6c091020, 0x1a157: 0x6ceae420, + 0x1a158: 0x6ccf0820, 0x1a159: 0x6d20ac20, 0x1a15a: 0x6d167420, 0x1a15b: 0x6c3dd020, + 0x1a15c: 0x6d427420, 0x1a15d: 0x6c463420, 0x1a15e: 0x6ca95020, 0x1a15f: 0x6ce70e20, + 0x1a160: 0x6ca62220, 0x1a161: 0x6cfa7620, 0x1a162: 0x6cc17220, 0x1a163: 0x6d1d7c20, + 0x1a164: 0x6cec0e20, 0x1a165: 0x6cb8a220, 0x1a166: 0x6cd40a20, 0x1a167: 0x6c761a20, + 0x1a168: 0x6c068820, 0x1a169: 0x6cae0420, 0x1a16a: 0x6c5b1a20, 0x1a16b: 0x6c51b620, + 0x1a16c: 0x6c819c20, 0x1a16d: 0x6cfdac20, 0x1a16e: 0x6c43c420, 0x1a16f: 0x6d0f8420, + 0x1a170: 0x6c041820, 0x1a171: 0x6c382c20, 0x1a172: 0x6ca02a20, 0x1a173: 0x6c632420, + 0x1a174: 0x6c37bc20, 0x1a175: 0x6c0e0a20, 0x1a176: 0x6c5fda20, 0x1a177: 0x6c523820, + 0x1a178: 0x6c5d6c20, 0x1a179: 0x6c4ac420, 0x1a17a: 0x6cc2b620, 0x1a17b: 0x6ce54820, + 0x1a17c: 0x6c68c820, 0x1a17d: 0x6c22b020, 0x1a17e: 0x6d16a220, 0x1a17f: 0x6cd2b220, + // Block 0x686, offset 0x1a180 + 0x1a180: 0x6d03c620, 0x1a181: 0x6ccfa620, 0x1a182: 0x6ceaa620, 0x1a183: 0x6c76c020, + 0x1a184: 0x6d343a20, 0x1a185: 0x6c40dc20, 0x1a186: 0x6c7ee220, 0x1a187: 0x6d146c20, + 0x1a188: 0x6c1b7a20, 0x1a189: 0x6c7ad220, 0x1a18a: 0x6c49d420, 0x1a18b: 0x6c858620, + 0x1a18c: 0x6d19a820, 0x1a18d: 0x6cd31220, 0x1a18e: 0x6c9cda20, 0x1a18f: 0x6d398220, + 0x1a190: 0x6d067a20, 0x1a191: 0x6d201420, 0x1a192: 0x6c011820, 0x1a193: 0x6c921620, + 0x1a194: 0x6ca1c020, 0x1a195: 0x6c373420, 0x1a196: 0x6c94de20, 0x1a197: 0x6c305220, + 0x1a198: 0x6c143020, 0x1a199: 0x6c1a9420, 0x1a19a: 0x6d0a6a20, 0x1a19b: 0x6c456220, + 0x1a19c: 0x6d385620, 0x1a19d: 0x6d13ca20, 0x1a19e: 0x6cc78c20, 0x1a19f: 0x6c25a220, + 0x1a1a0: 0x6cf98820, 0x1a1a1: 0x6cd88620, 0x1a1a2: 0x6d292c20, 0x1a1a3: 0x6c937820, + 0x1a1a4: 0x6cdefc20, 0x1a1a5: 0x6c68ca20, 0x1a1a6: 0x6d312220, 0x1a1a7: 0x6c12ca20, + 0x1a1a8: 0x6cbbd020, 0x1a1a9: 0x6c7b1220, 0x1a1aa: 0x6c147020, 0x1a1ab: 0x6ca95220, + 0x1a1ac: 0x6ca9b020, 0x1a1ad: 0x6c6c8420, 0x1a1ae: 0x6cf43220, 0x1a1af: 0x6c53ec20, + 0x1a1b0: 0x6c6efe20, 0x1a1b1: 0x6c1a6420, 0x1a1b2: 0x6d321e20, 0x1a1b3: 0x6d428220, + 0x1a1b4: 0x6c1e2620, 0x1a1b5: 0x6cbd1e20, 0x1a1b6: 0x6c937a20, 0x1a1b7: 0x6c70f820, + 0x1a1b8: 0x6cd5a420, 0x1a1b9: 0x6ce6b420, 0x1a1ba: 0x6cd09220, 0x1a1bb: 0x6ce9f420, + 0x1a1bc: 0x6c0ec020, 0x1a1bd: 0x6ca3e820, 0x1a1be: 0x6cfe8820, 0x1a1bf: 0x6c0b8220, + // Block 0x687, offset 0x1a1c0 + 0x1a1c0: 0x6ce9de20, 0x1a1c1: 0x6d222420, 0x1a1c2: 0x6cf85220, 0x1a1c3: 0x6c242e20, + 0x1a1c4: 0x6c354e20, 0x1a1c5: 0x6cc01020, 0x1a1c6: 0x6d061620, 0x1a1c7: 0x6c4a1820, + 0x1a1c8: 0x6c7a8420, 0x1a1c9: 0x6cf43420, 0x1a1ca: 0x6c759620, 0x1a1cb: 0x6d16da20, + 0x1a1cc: 0x6c3f4620, 0x1a1cd: 0x6c894820, 0x1a1ce: 0x6d410e20, 0x1a1cf: 0x6cbc3020, + 0x1a1d0: 0x6c859a20, 0x1a1d1: 0x6d1e1620, 0x1a1d2: 0x6c5d1c20, 0x1a1d3: 0x6c6e5220, + 0x1a1d4: 0x6cba4220, 0x1a1d5: 0x6cca4820, 0x1a1d6: 0x6cadf420, 0x1a1d7: 0x6cda7220, + 0x1a1d8: 0x6c3e0620, 0x1a1d9: 0x6cf59820, 0x1a1da: 0x6c850020, 0x1a1db: 0x6c3f4820, + 0x1a1dc: 0x6cb24a20, 0x1a1dd: 0x6c05ea20, 0x1a1de: 0x6d20d220, 0x1a1df: 0x6cb59020, + 0x1a1e0: 0x6cf99020, 0x1a1e1: 0x6d032220, 0x1a1e2: 0x6d04b620, 0x1a1e3: 0x6d222620, + 0x1a1e4: 0x6c2c2420, 0x1a1e5: 0x6c17d020, 0x1a1e6: 0x6c1d9220, 0x1a1e7: 0x6d377c20, + 0x1a1e8: 0x6d0d4e20, 0x1a1e9: 0x6c87e820, 0x1a1ea: 0x6c859c20, 0x1a1eb: 0x6c7ee420, + 0x1a1ec: 0x6cd8fc20, 0x1a1ed: 0x6c656a20, 0x1a1ee: 0x6d04b820, 0x1a1ef: 0x6c3f5220, + 0x1a1f0: 0x6c5daa20, 0x1a1f1: 0x6c721e20, 0x1a1f2: 0x6cffd820, 0x1a1f3: 0x6cabf620, + 0x1a1f4: 0x6c666420, 0x1a1f5: 0x6c0c8c20, 0x1a1f6: 0x6c1f2020, 0x1a1f7: 0x6c3a9420, + 0x1a1f8: 0x6c3cde20, 0x1a1f9: 0x6d0b8a20, 0x1a1fa: 0x6c017a20, 0x1a1fb: 0x6c06f820, + 0x1a1fc: 0x6d22ea20, 0x1a1fd: 0x6d02bc20, 0x1a1fe: 0x6c08ce20, 0x1a1ff: 0x6c561620, + // Block 0x688, offset 0x1a200 + 0x1a200: 0x6c166220, 0x1a201: 0x6d33be20, 0x1a202: 0x6c0e1020, 0x1a203: 0x6c6fe420, + 0x1a204: 0x6d10de20, 0x1a205: 0x6c252020, 0x1a206: 0x6c87ea20, 0x1a207: 0x6cecf420, + 0x1a208: 0x6c7ee620, 0x1a209: 0x6c122820, 0x1a20a: 0x6d401c20, 0x1a20b: 0x6c448220, + 0x1a20c: 0x6c490a20, 0x1a20d: 0x6c06fa20, 0x1a20e: 0x6ce4dc20, 0x1a20f: 0x6cd4b420, + 0x1a210: 0x6cd4b620, 0x1a211: 0x6c9b0420, 0x1a212: 0x6c2a0620, 0x1a213: 0x6cdfd420, + 0x1a214: 0x6c740e20, 0x1a215: 0x6c20c220, 0x1a216: 0x6d041e20, 0x1a217: 0x6cae9420, + 0x1a218: 0x6ce17020, 0x1a219: 0x6c548e20, 0x1a21a: 0x6d15da20, 0x1a21b: 0x6cb4d620, + 0x1a21c: 0x6ce3de20, 0x1a21d: 0x6c421420, 0x1a21e: 0x6c6e5e20, 0x1a21f: 0x6c6bd620, + 0x1a220: 0x6cdbb220, 0x1a221: 0x6c170a20, 0x1a222: 0x6c6a9e20, 0x1a223: 0x6c39ce20, + 0x1a224: 0x6d344420, 0x1a225: 0x6c796c20, 0x1a226: 0x6c734220, 0x1a227: 0x6d3f7420, + 0x1a228: 0x6c722020, 0x1a229: 0x6cba4620, 0x1a22a: 0x6ca5c820, 0x1a22b: 0x6c94e420, + 0x1a22c: 0x6d3cf420, 0x1a22d: 0x6cf27e20, 0x1a22e: 0x6c95a820, 0x1a22f: 0x6cd91020, + 0x1a230: 0x6c839220, 0x1a231: 0x6c5d1e20, 0x1a232: 0x6c2fea20, 0x1a233: 0x6d3f3620, + 0x1a234: 0x6c07aa20, 0x1a235: 0x6cf43820, 0x1a236: 0x6c722220, 0x1a237: 0x6ca39e20, + 0x1a238: 0x6c112020, 0x1a239: 0x6c657820, 0x1a23a: 0x6d2d3820, 0x1a23b: 0x6d125a20, + 0x1a23c: 0x6d344620, 0x1a23d: 0x6ccc4020, 0x1a23e: 0x6cbe3820, 0x1a23f: 0x6cbd1220, + // Block 0x689, offset 0x1a240 + 0x1a240: 0x6d1ba420, 0x1a241: 0x6c196620, 0x1a242: 0x6c648020, 0x1a243: 0x6d0d6220, + 0x1a244: 0x6cc85c20, 0x1a245: 0x6d382420, 0x1a246: 0x6c217620, 0x1a247: 0x6c641220, + 0x1a248: 0x6c61da20, 0x1a249: 0x6cefa820, 0x1a24a: 0x6d224220, 0x1a24b: 0x6c0e1820, + 0x1a24c: 0x6cc91620, 0x1a24d: 0x6ce31a20, 0x1a24e: 0x6cee7020, 0x1a24f: 0x6cb0ee20, + 0x1a250: 0x6d0e5a20, 0x1a251: 0x6c3c3a20, 0x1a252: 0x6ce17220, 0x1a253: 0x6cf2e020, + 0x1a254: 0x6c360620, 0x1a255: 0x6d009a20, 0x1a256: 0x6c17e820, 0x1a257: 0x6cd13020, + 0x1a258: 0x6c76ca20, 0x1a259: 0x6c2c3820, 0x1a25a: 0x6d429620, 0x1a25b: 0x6c138e20, + 0x1a25c: 0x6ce66c20, 0x1a25d: 0x6c070620, 0x1a25e: 0x6d018820, 0x1a25f: 0x6c59b020, + 0x1a260: 0x6d11a820, 0x1a261: 0x6d2e5420, 0x1a262: 0x6c1e2a20, 0x1a263: 0x6d0bec20, + 0x1a264: 0x6d1f2820, 0x1a265: 0x6c666820, 0x1a266: 0x6d063a20, 0x1a267: 0x6d2bd220, + 0x1a268: 0x6c220220, 0x1a269: 0x6c3fdc20, 0x1a26a: 0x6c087020, 0x1a26b: 0x6d35d420, + 0x1a26c: 0x6d3fea20, 0x1a26d: 0x6c9e1620, 0x1a26e: 0x6c601020, 0x1a26f: 0x6d15e420, + 0x1a270: 0x6d018a20, 0x1a271: 0x6d0a0420, 0x1a272: 0x6c10f420, 0x1a273: 0x6c329420, + 0x1a274: 0x6c12da20, 0x1a275: 0x6d314c20, 0x1a276: 0x6cab7c20, 0x1a277: 0x6ce7d420, + 0x1a278: 0x6ce7d620, 0x1a279: 0x6c070820, 0x1a27a: 0x6d28b220, 0x1a27b: 0x6c908420, + 0x1a27c: 0x6c6aac20, 0x1a27d: 0x6cefaa20, 0x1a27e: 0x6c3bd620, 0x1a27f: 0x6c16a020, + // Block 0x68a, offset 0x1a280 + 0x1a280: 0x6c4a5220, 0x1a281: 0x6cda1420, 0x1a282: 0x6d361420, 0x1a283: 0x6cdab020, + 0x1a284: 0x6cf96620, 0x1a285: 0x6c40b020, 0x1a286: 0x6d261420, 0x1a287: 0x6cc70420, + 0x1a288: 0x6c860420, 0x1a289: 0x6caa6420, 0x1a28a: 0x6d282c20, 0x1a28b: 0x6c67a620, + 0x1a28c: 0x6c96bc20, 0x1a28d: 0x6c056e20, 0x1a28e: 0x6c2cc820, 0x1a28f: 0x6ce0ee20, + 0x1a290: 0x6c503c20, 0x1a291: 0x6c6ac220, 0x1a292: 0x6cf60820, 0x1a293: 0x6ccd8820, + 0x1a294: 0x6cba5020, 0x1a295: 0x6c744020, 0x1a296: 0x6c122c20, 0x1a297: 0x6c1f3c20, + 0x1a298: 0x6cca1820, 0x1a299: 0x6c071c20, 0x1a29a: 0x6cffe820, 0x1a29b: 0x6d1e3420, + 0x1a29c: 0x6d10f220, 0x1a29d: 0x6ce09620, 0x1a29e: 0x6cdd1420, 0x1a29f: 0x6d101c20, + 0x1a2a0: 0x6c37ea20, 0x1a2a1: 0x6c0e1c20, 0x1a2a2: 0x6c635a20, 0x1a2a3: 0x6c271820, + 0x1a2a4: 0x6d293620, 0x1a2a5: 0x6ce17620, 0x1a2a6: 0x6c483820, 0x1a2a7: 0x6c0d3420, + 0x1a2a8: 0x6c1ede20, 0x1a2a9: 0x6caabc20, 0x1a2aa: 0x6c116c20, 0x1a2ab: 0x6c82c820, + 0x1a2ac: 0x6c24ca20, 0x1a2ad: 0x6d1d8820, 0x1a2ae: 0x6d2a1420, 0x1a2af: 0x6d3ff620, + 0x1a2b0: 0x6c07f420, 0x1a2b1: 0x6cd95e20, 0x1a2b2: 0x6c02ce20, 0x1a2b3: 0x6c1ffe20, + 0x1a2b4: 0x6d226620, 0x1a2b5: 0x6d2d4220, 0x1a2b6: 0x6d40c220, 0x1a2b7: 0x6cce0620, + 0x1a2b8: 0x6c208e20, 0x1a2b9: 0x6c6e8c20, 0x1a2ba: 0x6c1c2c20, 0x1a2bb: 0x6ccc3220, + 0x1a2bc: 0x6c4ecc20, 0x1a2bd: 0x6d2eb820, 0x1a2be: 0x6cbe4c20, 0x1a2bf: 0x6d0e8020, + // Block 0x68b, offset 0x1a2c0 + 0x1a2c0: 0x6c2c6620, 0x1a2c1: 0x6d01bc20, 0x1a2c2: 0x6c909220, 0x1a2c3: 0x6c072020, + 0x1a2c4: 0x6cb1b020, 0x1a2c5: 0x6c6c9420, 0x1a2c6: 0x6c88f020, 0x1a2c7: 0x6c926020, + 0x1a2c8: 0x6c976620, 0x1a2c9: 0x6cb8ea20, 0x1a2ca: 0x6cfaba20, 0x1a2cb: 0x6ce09c20, + 0x1a2cc: 0x6d1c7a20, 0x1a2cd: 0x6c307e20, 0x1a2ce: 0x6d3bd220, 0x1a2cf: 0x6cfe3c20, + 0x1a2d0: 0x6ccd9220, 0x1a2d1: 0x6cbbe220, 0x1a2d2: 0x6c6f2220, 0x1a2d3: 0x6ce9e820, + 0x1a2d4: 0x6d420620, 0x1a2d5: 0x6cb44220, 0x1a2d6: 0x6cf66020, 0x1a2d7: 0x6c815e20, + 0x1a2d8: 0x6c16f020, 0x1a2d9: 0x6c49ec20, 0x1a2da: 0x6c89ec20, 0x1a2db: 0x6cb50420, + 0x1a2dc: 0x6c197820, 0x1a2dd: 0x6c150820, 0x1a2de: 0x6cefee20, 0x1a2df: 0x6c5efe20, + 0x1a2e0: 0x6c0e8220, 0x1a2e1: 0x6c5bf020, 0x1a2e2: 0x6c202420, 0x1a2e3: 0x6ce5fc20, + 0x1a2e4: 0x6c289a20, 0x1a2e5: 0x6c691220, 0x1a2e6: 0x6c700a20, 0x1a2e7: 0x6ccbb820, + 0x1a2e8: 0x6c3be020, 0x1a2e9: 0x6cfce620, 0x1a2ea: 0x6c713c20, 0x1a2eb: 0x6c366c20, + 0x1a2ec: 0x6c685820, 0x1a2ed: 0x6c66a420, 0x1a2ee: 0x6ce76420, 0x1a2ef: 0x6c8c5620, + 0x1a2f0: 0x6c0f2420, 0x1a2f1: 0x6c482220, 0x1a2f2: 0x6cfd5820, 0x1a2f3: 0x6cdade20, + 0x1a2f4: 0x6cfce820, 0x1a2f5: 0x6c676e20, 0x1a2f6: 0x6c9fc020, 0x1a2f7: 0x6d130e20, + 0x1a2f8: 0x6c6d3220, 0x1a2f9: 0x6c644e20, 0x1a2fa: 0x6cbc5220, 0x1a2fb: 0x6cb0b420, + 0x1a2fc: 0x6c3c6020, 0x1a2fd: 0x6d394220, 0x1a2fe: 0x6c00c020, 0x1a2ff: 0x6cc9e820, + // Block 0x68c, offset 0x1a300 + 0x1a300: 0x6d154220, 0x1a301: 0x6c75d220, 0x1a302: 0x6ca9be20, 0x1a303: 0x6c151620, + 0x1a304: 0x6d184620, 0x1a305: 0x6c297c20, 0x1a306: 0x6c6e2420, 0x1a307: 0x6d07b620, + 0x1a308: 0x6c7b3020, 0x1a309: 0x6c65c820, 0x1a30a: 0x6c1f6820, 0x1a30b: 0x6c27f420, + 0x1a30c: 0x6c692020, 0x1a30d: 0x6ccc3420, 0x1a30e: 0x6d294020, 0x1a30f: 0x6c121820, + 0x1a310: 0x6c0d5020, 0x1a311: 0x6c017220, 0x1a312: 0x6cc7c420, 0x1a313: 0x6cdf3c20, + 0x1a314: 0x6c1dd820, 0x1a315: 0x6c148a20, 0x1a316: 0x6c7fb220, 0x1a317: 0x6ca64620, + 0x1a318: 0x6c6cb420, 0x1a319: 0x6cba7020, 0x1a31a: 0x6c9b3420, 0x1a31b: 0x6cf47620, + 0x1a31c: 0x6ca91820, 0x1a31d: 0x6cbf5a20, 0x1a31e: 0x6ca64820, 0x1a31f: 0x6c16c820, + 0x1a320: 0x6c8b2e20, 0x1a321: 0x6c82dc20, 0x1a322: 0x6c93b820, 0x1a323: 0x6c7bd020, + 0x1a324: 0x6c066c20, 0x1a325: 0x6d240420, 0x1a326: 0x6c0c2a20, 0x1a327: 0x6d297820, + 0x1a328: 0x6d349e20, 0x1a329: 0x6cd8f220, 0x1a32a: 0x6d1eb420, 0x1a32b: 0x6c4fe820, + 0x1a32c: 0x6c193220, 0x1a32d: 0x6c193620, 0x1a32e: 0x6c86bc20, 0x1a32f: 0x6ce2be20, + 0x1a330: 0x6cf02420, 0x1a331: 0x6c903a20, 0x1a332: 0x6c1eee20, 0x1a333: 0x6c154020, + 0x1a334: 0x6cc4e020, 0x1a335: 0x6cd51220, 0x1a336: 0x6c5c8820, 0x1a337: 0x6c874220, + 0x1a338: 0x6c956820, 0x1a339: 0x6d298020, 0x1a33a: 0x6caace20, 0x1a33b: 0x6ce18820, + 0x1a33c: 0x6d0e1220, 0x1a33d: 0x6c829420, 0x1a33e: 0x6ca47c20, 0x1a33f: 0x6c372e20, + // Block 0x68d, offset 0x1a340 + 0x1a340: 0x6cf49020, 0x1a341: 0x6d27d220, 0x1a342: 0x6d294a20, 0x1a343: 0x6d252e20, + 0x1a344: 0x6d044a20, 0x1a345: 0x6c1ca820, 0x1a346: 0x6d2f9620, 0x1a347: 0x6d044e20, + 0x1a348: 0x6cfa6e20, 0x1a349: 0x6c49d020, 0x1a34a: 0x6c332e20, 0x1a34b: 0x6c787820, + 0x1a34c: 0x6c333020, 0x1a34d: 0x6c9dfe20, 0x1a34e: 0x6ce91c20, 0x1a34f: 0x6c169420, + 0x1a350: 0x6c373220, 0x1a351: 0x6c333220, 0x1a352: 0x6c373620, 0x1a353: 0x6c6c2c20, + 0x1a354: 0x6ce92020, 0x1a355: 0x6cd87e20, 0x1a356: 0x6d0d4420, 0x1a357: 0x6d0d5020, + 0x1a358: 0x6cd2bc20, 0x1a35a: 0x6c292a20, 0x1a35b: 0x6cb8c220, + 0x1a35c: 0x6c30a820, 0x1a35d: 0x6c3b2820, 0x1a35e: 0x6c98d620, 0x1a35f: 0x6ccfe220, + 0x1a360: 0x6c30aa20, 0x1a362: 0x6c6dc620, 0x1a363: 0x6c852e20, + 0x1a364: 0x6c5a2a20, 0x1a365: 0x6cc80e20, 0x1a366: 0x6cedd820, 0x1a367: 0x6ca57e20, + 0x1a368: 0x6cc2b220, 0x1a369: 0x6c898820, 0x1a36a: 0x6d20d420, 0x1a36b: 0x6c030a20, + 0x1a36c: 0x6c454e20, 0x1a36d: 0x6c8f2420, 0x1a36e: 0x6cf55c20, 0x1a36f: 0x6c4f4220, + 0x1a370: 0x6c7f8620, 0x1a371: 0x6c460a20, 0x1a372: 0x6ce45620, 0x1a373: 0x6c490020, + 0x1a374: 0x6d041020, 0x1a375: 0x6c0daa20, 0x1a376: 0x6cb57a20, 0x1a377: 0x6c720620, + 0x1a378: 0x6c2d0620, 0x1a379: 0x6d3e0820, 0x1a37a: 0x6c3b2020, 0x1a37b: 0x6d100620, + 0x1a37c: 0x6c647a20, 0x1a37d: 0x6cd45820, 0x1a37e: 0x6c621420, 0x1a37f: 0x6d17da20, + // Block 0x68e, offset 0x1a380 + 0x1a380: 0x6c627020, 0x1a381: 0x6c15ec20, 0x1a382: 0x6c6ed020, 0x1a383: 0x6c993e20, + 0x1a384: 0x6cc4a620, 0x1a385: 0x6ca58020, 0x1a386: 0x6d253020, 0x1a387: 0x6c991c20, + 0x1a388: 0x6c424c20, 0x1a389: 0x6cc4a820, 0x1a38a: 0x6c12c620, 0x1a38b: 0x6c6ed220, + 0x1a38c: 0x6c12c820, 0x1a38d: 0x6d292620, 0x1a38e: 0x6c488820, 0x1a38f: 0x6c6ef020, + 0x1a390: 0x6c994820, 0x1a391: 0x6d390820, 0x1a392: 0x6c994e20, 0x1a393: 0x6c46a020, + 0x1a394: 0x6d063220, 0x1a395: 0x6c9e1820, 0x1a396: 0x6c9d1620, 0x1a397: 0x6cc6ec20, + 0x1a398: 0x6d1a1a20, 0x1a399: 0x6d013e20, 0x1a39a: 0x6c76bc20, 0x1a39b: 0x6c755020, + 0x1a39c: 0x6ca9ae20, 0x1a39d: 0x6d145a20, 0x1a39e: 0x6c9c3420, 0x1a39f: 0x6cd32820, + 0x1a3a0: 0x6c490620, 0x1a3a1: 0x6c9b0e20, 0x1a3a2: 0x6d37ec20, 0x1a3a3: 0x6c722620, + 0x1a3a4: 0x6d24d020, 0x1a3a5: 0x6c9ff220, 0x1a3a6: 0x6c79de20, 0x1a3a7: 0x6c8ba420, + 0x1a3a8: 0x6c3fe020, 0x1a3a9: 0x6d014420, 0x1a3aa: 0x6c9d7620, 0x1a3ab: 0x6c0d9e20, + 0x1a3ac: 0x6c2fd820, 0x1a3ad: 0x6cdf0c20, 0x1a3ae: 0x6c425020, 0x1a3af: 0x6c3c9a20, + 0x1a3b0: 0x6c0da620, 0x1a3b1: 0x6c564620, 0x1a3b2: 0x6c1caa20, 0x1a3b3: 0x6c73cc20, + 0x1a3b4: 0x6c564820, 0x1a3b5: 0x6c7bdc20, 0x1a3b6: 0x6d12a220, 0x1a3b7: 0x6c839020, + 0x1a3b8: 0x6cac9a20, 0x1a3b9: 0x6c3dd220, 0x1a3ba: 0x6c9f8c20, 0x1a3bb: 0x6c305020, + 0x1a3bc: 0x6cfbe620, 0x1a3bd: 0x6c8ac620, 0x1a3be: 0x6cb84020, 0x1a3bf: 0x6c646820, + // Block 0x68f, offset 0x1a3c0 + 0x1a3c0: 0x6c6e4a20, 0x1a3c1: 0x6cd5a620, 0x1a3c2: 0x6c9a4c20, 0x1a3c3: 0x6ce88a20, + 0x1a3c4: 0x6cb4d820, 0x1a3c5: 0x6c480220, 0x1a3c6: 0x6d3cda20, 0x1a3c7: 0x6cd91220, + 0x1a3c8: 0x6c6e6020, 0x1a3c9: 0x6c894a20, 0x1a3ca: 0x6cbec420, 0x1a3cb: 0x6c2db820, + 0x1a3cc: 0x6c8cc420, 0x1a3cd: 0x6c306c20, 0x1a3ce: 0x6c421620, 0x1a3cf: 0x6c658220, + 0x1a3d0: 0x6d19c620, 0x1a3d1: 0x6c23ea20, 0x1a3d2: 0x6d14f220, 0x1a3d3: 0x6c860620, + 0x1a3d4: 0x6c20a820, 0x1a3d5: 0x6ca03420, 0x1a3d6: 0x6d3ce820, 0x1a3d7: 0x6c24cc20, + 0x1a3d8: 0x6cd7fe20, 0x1a3d9: 0x6c345c20, 0x1a3da: 0x6c6d3420, 0x1a3db: 0x6c8c2620, + 0x1a3dc: 0x6c8c2820, 0x1a3dd: 0x6ca91a20, 0x1a3de: 0x6cf6b620, 0x1a3df: 0x6c31be20, + 0x1a3e0: 0x6c610c20, 0x1a3e1: 0x6c387820, 0x1a3e2: 0x6c387a20, 0x1a3e3: 0x6c387c20, + 0x1a3e4: 0x6c3cd620, 0x1a3e5: 0x6c704a20, 0x1a3e6: 0x6c1ed220, 0x1a3e7: 0x6d337a20, + 0x1a3e8: 0x6c3c1420, 0x1a3e9: 0x6ca2c220, 0x1a3ea: 0x6d377a20, 0x1a3eb: 0x6c3dcc20, + 0x1a3ec: 0x6c3c1620, 0x1a3ed: 0x6cb27220, 0x1a3ee: 0x6c3c2020, 0x1a3ef: 0x6c764420, + 0x1a3f0: 0x6c59b220, 0x1a3f1: 0x6c765220, 0x1a3f2: 0x6c419a20, 0x1a3f3: 0x6c2ad820, + 0x1a3f4: 0x6cb2bc20, 0x1a3f5: 0x6cb9ec20, 0x1a3f6: 0x6d044820, 0x1a3f7: 0x6c7b0a20, + 0x1a3f8: 0x6ce83620, 0x1a3f9: 0x6c022420, 0x1a3fa: 0x6c1e5020, 0x1a3fb: 0x6c5e6820, + 0x1a3fc: 0x6c295020, 0x1a3fd: 0x6c4dd220, 0x1a3fe: 0x6c4dda20, 0x1a3ff: 0x6d2a3420, + // Block 0x690, offset 0x1a400 + 0x1a400: 0x6c29b020, 0x1a401: 0x6c2da220, 0x1a402: 0x6c29b220, 0x1a403: 0x6cc5a020, + 0x1a404: 0x6cc5a220, 0x1a405: 0x6c204a20, 0x1a406: 0x6c3b0820, 0x1a407: 0x6cbc9020, + 0x1a408: 0x6d163e20, 0x1a409: 0x6c5e6a20, 0x1a40a: 0x6c76a020, 0x1a40b: 0x6cba3a20, + 0x1a40c: 0x6c25ac20, 0x1a40d: 0x6c1e7220, 0x1a40e: 0x6cf1c620, 0x1a40f: 0x6c5e7220, + 0x1a410: 0x6c281c20, 0x1a411: 0x6d03b820, 0x1a412: 0x6c577820, 0x1a413: 0x6cecb620, + 0x1a414: 0x6c73ce20, 0x1a415: 0x6c839e20, 0x1a416: 0x6d267020, 0x1a417: 0x6c8abc20, + 0x1a418: 0x6c8e3e20, 0x1a419: 0x6d2aa220, 0x1a41a: 0x6c425220, 0x1a41b: 0x6c209e20, + 0x1a41c: 0x6c3dd420, 0x1a41d: 0x6c1e5420, 0x1a41e: 0x6cc26020, 0x1a41f: 0x6c704c20, + 0x1a420: 0x6cccb820, 0x1a421: 0x6c9f8e20, 0x1a422: 0x6c8c9a20, 0x1a423: 0x6d378a20, + 0x1a424: 0x6cac9c20, 0x1a425: 0x6c0cd820, 0x1a426: 0x6c6a6420, 0x1a427: 0x6c6a6620, + 0x1a428: 0x6cad4420, 0x1a429: 0x6c857620, 0x1a42a: 0x6cccba20, 0x1a42b: 0x6c0cda20, + 0x1a42c: 0x6c158e20, 0x1a42d: 0x6c6e0620, 0x1a42e: 0x6c484420, 0x1a42f: 0x6c44b820, + 0x1a430: 0x6c2a0020, 0x1a431: 0x6c20a220, 0x1a432: 0x6c7c3220, 0x1a433: 0x6c7a2020, + 0x1a434: 0x6c34ca20, 0x1a435: 0x6c37be20, 0x1a436: 0x6d358020, 0x1a437: 0x6cd64020, + 0x1a438: 0x6cc36e20, 0x1a439: 0x6ccbce20, 0x1a43a: 0x6c22b220, 0x1a43b: 0x6c787a20, + 0x1a43c: 0x6c6a7620, 0x1a43d: 0x6c4b2a20, 0x1a43e: 0x6c22b420, 0x1a43f: 0x6c4b2c20, + // Block 0x691, offset 0x1a440 + 0x1a440: 0x6c764620, 0x1a441: 0x6c34cc20, 0x1a442: 0x6c619020, 0x1a443: 0x6ce3d820, + 0x1a444: 0x6c6e1420, 0x1a445: 0x6c907c20, 0x1a446: 0x6c95a620, 0x1a447: 0x6d2ab220, + 0x1a448: 0x6d24cc20, 0x1a449: 0x6c260c20, 0x1a44a: 0x6d08da20, 0x1a44b: 0x6c788220, + 0x1a44c: 0x6c7e5a20, 0x1a44d: 0x6cb97820, 0x1a44e: 0x6ccbd020, 0x1a44f: 0x6c20a420, + 0x1a450: 0x6c489420, 0x1a451: 0x6c665820, 0x1a452: 0x6c261020, 0x1a453: 0x6c83aa20, + 0x1a454: 0x6ce2e820, 0x1a455: 0x6c3a9620, 0x1a456: 0x6cb3c620, 0x1a457: 0x6c15a020, + 0x1a458: 0x6cb59c20, 0x1a459: 0x6c20a620, 0x1a45a: 0x6d3f3820, 0x1a45b: 0x6c426c20, + 0x1a45c: 0x6cec8420, 0x1a45d: 0x6c0e5a20, 0x1a45e: 0x6c5e9e20, 0x1a45f: 0x6c342220, + 0x1a460: 0x6cbe7220, 0x1a461: 0x6ccd7420, 0x1a462: 0x6c316620, 0x1a463: 0x6c666a20, + 0x1a464: 0x6c61c220, 0x1a465: 0x6c0e5c20, 0x1a466: 0x6d0be220, 0x1a467: 0x6c722820, + 0x1a468: 0x6c5d5420, 0x1a469: 0x6cd16220, 0x1a46a: 0x6c658420, 0x1a46b: 0x6c344420, + 0x1a46c: 0x6c329620, 0x1a46d: 0x6cf36220, 0x1a46e: 0x6c489820, 0x1a46f: 0x6c3fe220, + 0x1a470: 0x6cd15a20, 0x1a471: 0x6c667420, 0x1a472: 0x6c438c20, 0x1a473: 0x6c269420, + 0x1a474: 0x6c765420, 0x1a475: 0x6c20aa20, 0x1a476: 0x6c1fe220, 0x1a477: 0x6c15bc20, + 0x1a478: 0x6ce94e20, 0x1a479: 0x6c926220, 0x1a47a: 0x6c83de20, 0x1a47b: 0x6caf0a20, + 0x1a47c: 0x6ccce820, 0x1a47d: 0x6cb15620, 0x1a47e: 0x6c79bc20, 0x1a47f: 0x6c690220, + // Block 0x692, offset 0x1a480 + 0x1a480: 0x6c486620, 0x1a481: 0x6cbb8a20, 0x1a482: 0x6c747220, 0x1a483: 0x6c57a820, + 0x1a484: 0x6d2be620, 0x1a485: 0x6d3df620, 0x1a486: 0x6c882a20, 0x1a487: 0x6c727420, + 0x1a488: 0x6caf8420, 0x1a489: 0x6c8e8020, 0x1a48a: 0x6c4b5e20, 0x1a48b: 0x6c692220, + 0x1a48c: 0x6c4b6020, 0x1a48d: 0x6c66b020, 0x1a48e: 0x6c66b220, 0x1a48f: 0x6ce0c820, + 0x1a490: 0x6c5d5a20, 0x1a491: 0x6c627220, 0x1a492: 0x6c66cc20, 0x1a493: 0x6d187e20, + 0x1a494: 0x6c66ce20, 0x1a495: 0x6d370020, 0x1a496: 0x6c154220, 0x1a497: 0x6c662020, + 0x1a498: 0x6ca09820, 0x1a499: 0x6c84c820, 0x1a49a: 0x6d3a8c20, 0x1a49b: 0x6c855c20, + 0x1a49c: 0x6d0b6220, 0x1a49d: 0x6cc36c20, 0x1a49e: 0x6c04da20, 0x1a49f: 0x6c455420, + 0x1a4a0: 0x6c631620, 0x1a4a1: 0x6cf55220, 0x1a4a2: 0x6c971e20, 0x1a4a3: 0x6c8abe20, + 0x1a4a4: 0x6c6cce20, 0x1a4a5: 0x6c792020, 0x1a4a6: 0x6d006420, 0x1a4a7: 0x6d34d220, + 0x1a4a8: 0x6c304c20, 0x1a4a9: 0x6d3aa020, 0x1a4aa: 0x6caa4a20, 0x1a4ab: 0x6c6a6820, + 0x1a4ac: 0x6cc17420, 0x1a4ad: 0x6ccec020, 0x1a4ae: 0x6d167620, 0x1a4af: 0x6d398020, + 0x1a4b0: 0x6ca0c020, 0x1a4b1: 0x6c857a20, 0x1a4b2: 0x6c6cd020, 0x1a4b3: 0x6c813e20, + 0x1a4b4: 0x6c814020, 0x1a4b5: 0x6c733e20, 0x1a4b6: 0x6c79ce20, 0x1a4b7: 0x6d0f8620, + 0x1a4b8: 0x6cebc620, 0x1a4b9: 0x6cffd420, 0x1a4ba: 0x6ca1c220, 0x1a4bb: 0x6c7b8420, + 0x1a4bc: 0x6c6a7a20, 0x1a4bd: 0x6c8aca20, 0x1a4be: 0x6c50ba20, 0x1a4bf: 0x6cd31420, + // Block 0x693, offset 0x1a4c0 + 0x1a4c0: 0x6c788420, 0x1a4c1: 0x6c6ce020, 0x1a4c2: 0x6c433620, 0x1a4c3: 0x6c0ec220, + 0x1a4c4: 0x6c9f9820, 0x1a4c5: 0x6c1bf420, 0x1a4c6: 0x6c80a020, 0x1a4c7: 0x6d1e1820, + 0x1a4c8: 0x6d1e1a20, 0x1a4c9: 0x6c9e0c20, 0x1a4ca: 0x6c788620, 0x1a4cb: 0x6d099220, + 0x1a4cc: 0x6c734420, 0x1a4cd: 0x6cbe7420, 0x1a4ce: 0x6c922820, 0x1a4cf: 0x6c107c20, + 0x1a4d0: 0x6c9bcc20, 0x1a4d1: 0x6c1c0420, 0x1a4d2: 0x6c823c20, 0x1a4d3: 0x6c768620, + 0x1a4d4: 0x6c9e1a20, 0x1a4d5: 0x6c307220, 0x1a4d6: 0x6d06b420, 0x1a4d7: 0x6d06ba20, + 0x1a4d8: 0x6c76a620, 0x1a4d9: 0x6cf55620, 0x1a4da: 0x6d175020, 0x1a4db: 0x6d099820, + 0x1a4dc: 0x6cf24a20, 0x1a4dd: 0x6cd16420, 0x1a4de: 0x6c815620, 0x1a4df: 0x6ca28420, + 0x1a4e0: 0x6c926420, 0x1a4e1: 0x6cb1b220, 0x1a4e2: 0x6cd39620, 0x1a4e3: 0x6c5ee220, + 0x1a4e4: 0x6cbd7c20, 0x1a4e5: 0x6c67ee20, 0x1a4e6: 0x6c174c20, 0x1a4e7: 0x6cc37420, + 0x1a4e8: 0x6cfe3e20, 0x1a4e9: 0x6d181c20, 0x1a4ea: 0x6c747620, 0x1a4eb: 0x6c385220, + 0x1a4ec: 0x6c72fa20, 0x1a4ed: 0x6ce76620, 0x1a4ee: 0x6c727620, 0x1a4ef: 0x6c27f620, + 0x1a4f0: 0x6d00d620, 0x1a4f1: 0x6c973820, 0x1a4f2: 0x6d09a420, 0x1a4f3: 0x6d09a820, + 0x1a4f4: 0x6c940220, 0x1a4f5: 0x6c867020, 0x1a4f6: 0x6c184e20, 0x1a4f7: 0x6cc4e220, + 0x1a4f8: 0x6cc37c20, 0x1a4f9: 0x6c059c20, 0x1a4fa: 0x6cce9420, 0x1a4fb: 0x6d277620, + 0x1a4fc: 0x6c6f4220, 0x1a4fd: 0x6c062c20, 0x1a4fe: 0x6c463220, 0x1a4ff: 0x6cf49220, + // Block 0x694, offset 0x1a500 + 0x1a500: 0x6d277820, 0x1a501: 0x6cf17820, 0x1a502: 0x6c0ade20, 0x1a503: 0x6c412220, + 0x1a504: 0x6c412420, 0x1a505: 0x6c059e20, 0x1a506: 0x6c22f420, 0x1a507: 0x6d198a20, + 0x1a508: 0x6d045020, 0x1a509: 0x6cae5020, 0x1a50a: 0x6c705020, 0x1a50b: 0x6ce20420, + 0x1a50c: 0x6c43c620, 0x1a50d: 0x6cb42c20, 0x1a50e: 0x6c35f820, 0x1a50f: 0x6cad5a20, + 0x1a510: 0x6c3e4820, 0x1a511: 0x6c458820, 0x1a512: 0x6c269620, 0x1a513: 0x6c6fee20, + 0x1a514: 0x6cbef220, 0x1a515: 0x6c08aa20, 0x1a516: 0x6c577620, 0x1a517: 0x6c06c620, + 0x1a518: 0x6ca4ea20, 0x1a519: 0x6cd41420, 0x1a51a: 0x6c397e20, 0x1a51b: 0x6c6fc620, + 0x1a51c: 0x6d144c20, 0x1a51d: 0x6d288020, 0x1a51e: 0x6c67d020, 0x1a51f: 0x6c777820, + 0x1a520: 0x6c681820, 0x1a521: 0x6c7b8020, 0x1a522: 0x6c549220, 0x1a523: 0x6cf98420, + 0x1a524: 0x6cc0ce20, 0x1a525: 0x6c0b6820, 0x1a526: 0x6c4ac620, 0x1a527: 0x6cbc9c20, + 0x1a528: 0x6d29d020, 0x1a529: 0x6c7b8a20, 0x1a52a: 0x6c3a4c20, 0x1a52b: 0x6c54b420, + 0x1a52c: 0x6d224620, 0x1a52d: 0x6c4aee20, 0x1a52e: 0x6c7cf020, 0x1a52f: 0x6c5bd220, + 0x1a530: 0x6c27ea20, 0x1a531: 0x6c4b5c20, 0x1a532: 0x6c881a20, 0x1a533: 0x6c882c20, + 0x1a534: 0x6cdb9420, 0x1a535: 0x6c31c220, 0x1a536: 0x6c703420, 0x1a537: 0x6c74fa20, + 0x1a538: 0x6cf83420, 0x1a539: 0x6cb04020, 0x1a53a: 0x6cc0c420, 0x1a53b: 0x6d13c020, + 0x1a53c: 0x6c77d420, 0x1a53d: 0x6d0d5220, 0x1a53e: 0x6c0b3220, 0x1a53f: 0x6ca68c20, + // Block 0x695, offset 0x1a540 + 0x1a540: 0x6cc0f820, 0x1a541: 0x6cd22420, 0x1a542: 0x6d0a6020, 0x1a543: 0x6cb88c20, + 0x1a544: 0x6ca75420, 0x1a545: 0x6cc96220, 0x1a546: 0x6d40a220, 0x1a547: 0x6cd0d020, + 0x1a548: 0x6cf41620, 0x1a549: 0x6c5b8420, 0x1a54a: 0x6c04dc20, 0x1a54b: 0x6cd2fa20, + 0x1a54c: 0x6cf83620, 0x1a54d: 0x6ced6a20, 0x1a54e: 0x6c572420, 0x1a54f: 0x6d006620, + 0x1a550: 0x6ced6c20, 0x1a551: 0x6c068e20, 0x1a552: 0x6d40a820, 0x1a553: 0x6d3cee20, + 0x1a554: 0x6d007020, 0x1a555: 0x6c27ba20, 0x1a556: 0x6c972820, 0x1a557: 0x6ca3ea20, + 0x1a558: 0x6c27c020, 0x1a559: 0x6c601220, 0x1a55a: 0x6c0efe20, 0x1a55b: 0x6cd67c20, + 0x1a55c: 0x6c100420, 0x1a55d: 0x6c7bd420, 0x1a55e: 0x6c0b6420, 0x1a55f: 0x6c102a20, + 0x1a560: 0x6d2e4620, 0x1a561: 0x6c761820, 0x1a562: 0x6c913020, 0x1a563: 0x6d1f9c20, + 0x1a564: 0x6c91b420, 0x1a565: 0x6cf58420, 0x1a566: 0x6c48a620, 0x1a567: 0x6cf2d420, + 0x1a568: 0x6d017620, 0x1a569: 0x6c6a4e20, 0x1a56a: 0x6c6a5020, 0x1a56b: 0x6cf06820, + 0x1a56c: 0x6c01f020, 0x1a56d: 0x6cbef420, 0x1a56e: 0x6d338020, 0x1a56f: 0x6c991e20, + 0x1a570: 0x6d1b3620, 0x1a571: 0x6cee6620, 0x1a572: 0x6ccec420, 0x1a573: 0x6c5fd220, + 0x1a574: 0x6cc3a020, 0x1a575: 0x6c948c20, 0x1a576: 0x6c1b7c20, 0x1a577: 0x6c731020, + 0x1a578: 0x6d016a20, 0x1a579: 0x6d067e20, 0x1a57a: 0x6c6c8620, 0x1a57b: 0x6cc3a620, + 0x1a57c: 0x6cf4be20, 0x1a57d: 0x6c5fec20, 0x1a57e: 0x6c360a20, 0x1a57f: 0x6cbe3a20, + // Block 0x696, offset 0x1a580 + 0x1a580: 0x6cf63820, 0x1a581: 0x6cca6620, 0x1a582: 0x6c16e020, 0x1a583: 0x6cef8020, + 0x1a584: 0x6c35c020, 0x1a585: 0x6ce62220, 0x1a586: 0x6c856020, 0x1a587: 0x6d300c20, + 0x1a588: 0x6c4e4e20, 0x1a589: 0x6c856420, 0x1a58a: 0x6d0b4620, 0x1a58b: 0x6d0ac820, + 0x1a58c: 0x6d0e3620, 0x1a58d: 0x6ccf3020, 0x1a58e: 0x6c2bca20, 0x1a58f: 0x6d2c7020, + 0x1a590: 0x6cacf020, 0x1a591: 0x6d0b0c20, 0x1a592: 0x6c50bc20, 0x1a593: 0x6d0b1620, + 0x1a594: 0x6d358220, 0x1a595: 0x6c12cc20, 0x1a596: 0x6cacf620, 0x1a597: 0x6ce31020, + 0x1a598: 0x6c83a420, 0x1a599: 0x6ccf3820, 0x1a59a: 0x6c546020, 0x1a59b: 0x6ce63420, + 0x1a59c: 0x6d416820, 0x1a59d: 0x6c261220, 0x1a59e: 0x6c3a9820, 0x1a59f: 0x6d254c20, + 0x1a5a0: 0x6c12dc20, 0x1a5a1: 0x6d255e20, 0x1a5a2: 0x6cfd6a20, 0x1a5a3: 0x6d0d6420, + 0x1a5a4: 0x6c860c20, 0x1a5a5: 0x6c744220, 0x1a5a6: 0x6ccc5020, 0x1a5a7: 0x6c2cca20, + 0x1a5a8: 0x6c1e7c20, 0x1a5a9: 0x6c6ff020, 0x1a5aa: 0x6c6c9620, 0x1a5ab: 0x6c024620, + 0x1a5ac: 0x6c4b1020, 0x1a5ad: 0x6d0e9020, 0x1a5ae: 0x6cd80020, 0x1a5af: 0x6c862620, + 0x1a5b0: 0x6c16f220, 0x1a5b1: 0x6c7faa20, 0x1a5b2: 0x6c864620, 0x1a5b3: 0x6d0cd020, + 0x1a5b4: 0x6d0df620, 0x1a5b5: 0x6d25dc20, 0x1a5b6: 0x6cd7b420, 0x1a5b7: 0x6c455020, + 0x1a5b8: 0x6c8b9c20, 0x1a5b9: 0x6cc73e20, 0x1a5ba: 0x6cc25a20, 0x1a5bb: 0x6cc25c20, + 0x1a5bc: 0x6c377c20, 0x1a5bd: 0x6c82b020, 0x1a5be: 0x6c315e20, 0x1a5bf: 0x6cfc7420, + // Block 0x697, offset 0x1a5c0 + 0x1a5c0: 0x6d3b6e20, 0x1a5c1: 0x6cc9fa20, 0x1a5c2: 0x6c115a20, 0x1a5c3: 0x6c115e20, + 0x1a5c4: 0x6c116020, 0x1a5c5: 0x6c116620, 0x1a5c6: 0x6c00b420, 0x1a5c7: 0x6c278620, + 0x1a5c8: 0x6d200420, 0x1a5c9: 0x6c137220, 0x1a5ca: 0x6c5fb820, 0x1a5cb: 0x6d206820, + 0x1a5cc: 0x6cd6a020, 0x1a5cd: 0x6c390020, 0x1a5ce: 0x6cd42620, 0x1a5cf: 0x6c48e420, + 0x1a5d0: 0x6c035c20, 0x1a5d1: 0x6c37e220, 0x1a5d2: 0x6cc91020, 0x1a5d3: 0x6cd30820, + 0x1a5d4: 0x6cd4a620, 0x1a5d5: 0x6d3d2a20, 0x1a5d6: 0x6cc23c20, 0x1a5d7: 0x6cd45220, + 0x1a5d8: 0x6c0b7a20, 0x1a5d9: 0x6d068a20, 0x1a5da: 0x6c640420, 0x1a5db: 0x6cacaa20, + 0x1a5dc: 0x6cda0c20, 0x1a5dd: 0x6c433820, 0x1a5de: 0x6cf08020, 0x1a5df: 0x6cda0e20, + 0x1a5e0: 0x6c2ebc20, 0x1a5e1: 0x6cc8e220, 0x1a5e2: 0x6c23bc20, 0x1a5e3: 0x6c79c820, + 0x1a5e4: 0x6c475020, 0x1a5e5: 0x6c71ea20, 0x1a5e6: 0x6c8e1a20, 0x1a5e7: 0x6c488a20, + 0x1a5e8: 0x6c29b420, 0x1a5e9: 0x6c79d420, 0x1a5ea: 0x6d34ce20, 0x1a5eb: 0x6c697a20, + 0x1a5ec: 0x6d2f9420, 0x1a5ed: 0x6c03e820, 0x1a5ee: 0x6c2f4420, 0x1a5ef: 0x6c785220, + 0x1a5f0: 0x6cdf0e20, 0x1a5f1: 0x6c1bd620, 0x1a5f2: 0x6cd2a420, 0x1a5f3: 0x6d200820, + 0x1a5f4: 0x6cbfee20, 0x1a5f5: 0x6cb34620, 0x1a5f6: 0x6d12ba20, 0x1a5f7: 0x6c500e20, + 0x1a5f8: 0x6cd7bc20, 0x1a5f9: 0x6ce08a20, 0x1a5fa: 0x6c1b7220, 0x1a5fb: 0x6c820a20, + 0x1a5fc: 0x6c2daa20, 0x1a5fd: 0x6c5e6c20, 0x1a5fe: 0x6c8a5c20, 0x1a5ff: 0x6c529020, + // Block 0x698, offset 0x1a600 + 0x1a600: 0x6c9ebe20, 0x1a601: 0x6d056020, 0x1a602: 0x6c982420, 0x1a603: 0x6c1a9020, + 0x1a604: 0x6c447c20, 0x1a605: 0x6d077820, 0x1a606: 0x6d108620, 0x1a607: 0x6d3ed820, + 0x1a608: 0x6c50b620, 0x1a609: 0x6c5fc220, 0x1a60a: 0x6c2e0820, 0x1a60b: 0x6c25b220, + 0x1a60c: 0x6ce70c20, 0x1a60d: 0x6c9fe620, 0x1a60e: 0x6c545a20, 0x1a60f: 0x6c856e20, + 0x1a610: 0x6ce91620, 0x1a611: 0x6cfe1620, 0x1a612: 0x6d2bc220, 0x1a613: 0x6cfa2a20, + 0x1a614: 0x6d12a020, 0x1a615: 0x6c937420, 0x1a616: 0x6d0aca20, 0x1a617: 0x6c96ee20, + 0x1a618: 0x6cab7420, 0x1a619: 0x6c5d5220, 0x1a61a: 0x6d13c220, 0x1a61b: 0x6c755420, + 0x1a61c: 0x6c1e1c20, 0x1a61d: 0x6c8c4420, 0x1a61e: 0x6cea1620, 0x1a61f: 0x6d1a2420, + 0x1a620: 0x6c3a7e20, 0x1a621: 0x6c08b820, 0x1a622: 0x6cbdfe20, 0x1a623: 0x6cbe0020, + 0x1a624: 0x6c6ba820, 0x1a625: 0x6c105c20, 0x1a626: 0x6c3d1c20, 0x1a627: 0x6c03ea20, + 0x1a628: 0x6c339620, 0x1a629: 0x6c3b0c20, 0x1a62a: 0x6c354820, 0x1a62b: 0x6c4dce20, + 0x1a62c: 0x6ce62c20, 0x1a62d: 0x6c792420, 0x1a62e: 0x6cd74620, 0x1a62f: 0x6cb6d020, + 0x1a630: 0x6c52f020, 0x1a631: 0x6d338620, 0x1a632: 0x6d1aca20, 0x1a633: 0x6cf3a020, + 0x1a634: 0x6cf3a220, 0x1a635: 0x6c178c20, 0x1a636: 0x6ca55820, 0x1a637: 0x6d093c20, + 0x1a638: 0x6cf56a20, 0x1a639: 0x6c20b420, 0x1a63a: 0x6c309e20, 0x1a63b: 0x6cf1c820, + 0x1a63c: 0x6c544820, 0x1a63d: 0x6c529220, 0x1a63e: 0x6cf3a420, 0x1a63f: 0x6c433220, + // Block 0x699, offset 0x1a640 + 0x1a640: 0x6d0bda20, 0x1a641: 0x6c759420, 0x1a642: 0x6c937620, 0x1a643: 0x6c35d020, + 0x1a644: 0x6c43c020, 0x1a645: 0x6c99ce20, 0x1a646: 0x6c270420, 0x1a647: 0x6cb6d220, + 0x1a648: 0x6c19b620, 0x1a649: 0x6cf3a620, 0x1a64a: 0x6c433420, 0x1a64b: 0x6c3d3820, + 0x1a64c: 0x6c698020, 0x1a64d: 0x6c529420, 0x1a64e: 0x6c1b7820, 0x1a64f: 0x6cd0da20, + 0x1a650: 0x6ca55a20, 0x1a651: 0x6cea1820, 0x1a652: 0x6c3f3220, 0x1a653: 0x6d167820, + 0x1a654: 0x6c270620, 0x1a655: 0x6cab7620, 0x1a656: 0x6c857c20, 0x1a657: 0x6c077620, + 0x1a658: 0x6d253820, 0x1a659: 0x6c4c0e20, 0x1a65a: 0x6cf21a20, 0x1a65b: 0x6cba9c20, + 0x1a65c: 0x6cf35020, 0x1a65d: 0x6c35da20, 0x1a65e: 0x6cd19820, 0x1a65f: 0x6c731220, + 0x1a660: 0x6cae4620, 0x1a661: 0x6cf1ce20, 0x1a662: 0x6ca55c20, 0x1a663: 0x6c965a20, + 0x1a664: 0x6c8e1c20, 0x1a665: 0x6cc46020, 0x1a666: 0x6d1e9420, 0x1a667: 0x6c2bd420, + 0x1a668: 0x6d385a20, 0x1a669: 0x6cd31620, 0x1a66a: 0x6d38fa20, 0x1a66b: 0x6ce60e20, + 0x1a66c: 0x6cf84420, 0x1a66d: 0x6d16a820, 0x1a66e: 0x6cb74220, 0x1a66f: 0x6cb27420, + 0x1a670: 0x6d3ef420, 0x1a671: 0x6c46ea20, 0x1a672: 0x6c21f420, 0x1a673: 0x6cf07220, + 0x1a674: 0x6d062a20, 0x1a675: 0x6c000420, 0x1a676: 0x6ca49220, 0x1a677: 0x6c40be20, + 0x1a678: 0x6cadac20, 0x1a679: 0x6d16aa20, 0x1a67a: 0x6cfe8220, 0x1a67b: 0x6ccfa820, + 0x1a67c: 0x6c549820, 0x1a67d: 0x6ca04020, 0x1a67e: 0x6c267a20, 0x1a67f: 0x6cc26220, + // Block 0x69a, offset 0x1a680 + 0x1a680: 0x6c71a220, 0x1a681: 0x6c4dd420, 0x1a682: 0x6d288820, 0x1a683: 0x6ceaa820, + 0x1a684: 0x6c341a20, 0x1a685: 0x6cb3ec20, 0x1a686: 0x6cad4620, 0x1a687: 0x6c0cdc20, + 0x1a688: 0x6c3de020, 0x1a689: 0x6d0f4420, 0x1a68a: 0x6c50be20, 0x1a68b: 0x6d28e820, + 0x1a68c: 0x6c50c020, 0x1a68d: 0x6c4d0c20, 0x1a68e: 0x6c6fd420, 0x1a68f: 0x6d1e1220, + 0x1a690: 0x6c40aa20, 0x1a691: 0x6c264020, 0x1a692: 0x6d38fc20, 0x1a693: 0x6cec1220, + 0x1a694: 0x6c760c20, 0x1a695: 0x6c483220, 0x1a696: 0x6c760e20, 0x1a697: 0x6d42b820, + 0x1a698: 0x6c106020, 0x1a699: 0x6c8f6a20, 0x1a69a: 0x6c2fda20, 0x1a69b: 0x6ca8f420, + 0x1a69c: 0x6cdefe20, 0x1a69d: 0x6cd7c820, 0x1a69e: 0x6cfc7820, 0x1a69f: 0x6c5da420, + 0x1a6a0: 0x6cb75020, 0x1a6a1: 0x6c37c020, 0x1a6a2: 0x6c35e420, 0x1a6a3: 0x6c49da20, + 0x1a6a4: 0x6d2cb220, 0x1a6a5: 0x6cf85420, 0x1a6a6: 0x6d148a20, 0x1a6a7: 0x6c8b9220, + 0x1a6a8: 0x6d3e0a20, 0x1a6a9: 0x6c9ec020, 0x1a6aa: 0x6c9c2e20, 0x1a6ab: 0x6d34fa20, + 0x1a6ac: 0x6d119420, 0x1a6ad: 0x6c5e9220, 0x1a6ae: 0x6d390a20, 0x1a6af: 0x6c437820, + 0x1a6b0: 0x6cd5a820, 0x1a6b1: 0x6d295e20, 0x1a6b2: 0x6cffd620, 0x1a6b3: 0x6c4d0e20, + 0x1a6b4: 0x6c5a8e20, 0x1a6b5: 0x6c7ad420, 0x1a6b6: 0x6c580c20, 0x1a6b7: 0x6ce20820, + 0x1a6b8: 0x6cfb3020, 0x1a6b9: 0x6c35e620, 0x1a6ba: 0x6d084220, 0x1a6bb: 0x6d04ba20, + 0x1a6bc: 0x6c4c1020, 0x1a6bd: 0x6d0e4220, 0x1a6be: 0x6c81a020, 0x1a6bf: 0x6d13ce20, + // Block 0x69b, offset 0x1a6c0 + 0x1a6c0: 0x6c001620, 0x1a6c1: 0x6cb23820, 0x1a6c2: 0x6cd04a20, 0x1a6c3: 0x6ce72020, + 0x1a6c4: 0x6c529a20, 0x1a6c5: 0x6d045c20, 0x1a6c6: 0x6c341c20, 0x1a6c7: 0x6cec4c20, + 0x1a6c8: 0x6c4cf820, 0x1a6c9: 0x6d28f820, 0x1a6ca: 0x6d201e20, 0x1a6cb: 0x6c2f3020, + 0x1a6cc: 0x6cac1c20, 0x1a6cd: 0x6cfddc20, 0x1a6ce: 0x6c001420, 0x1a6cf: 0x6c449c20, + 0x1a6d0: 0x6c7b8c20, 0x1a6d1: 0x6d0b4a20, 0x1a6d2: 0x6c264220, 0x1a6d3: 0x6cfe8a20, + 0x1a6d4: 0x6c094220, 0x1a6d5: 0x6c5b9620, 0x1a6d6: 0x6ca77420, 0x1a6d7: 0x6c570a20, + 0x1a6d8: 0x6d044220, 0x1a6d9: 0x6c7b1820, 0x1a6da: 0x6c347620, 0x1a6db: 0x6c3b1c20, + 0x1a6dc: 0x6c619c20, 0x1a6dd: 0x6ca9b220, 0x1a6de: 0x6ca1ba20, 0x1a6df: 0x6d1d7620, + 0x1a6e0: 0x6c502420, 0x1a6e1: 0x6d254e20, 0x1a6e2: 0x6c905620, 0x1a6e3: 0x6cb3ee20, + 0x1a6e4: 0x6c984820, 0x1a6e5: 0x6c438020, 0x1a6e6: 0x6cab2820, 0x1a6e7: 0x6c1a9a20, + 0x1a6e8: 0x6ccece20, 0x1a6e9: 0x6c87dc20, 0x1a6ea: 0x6ca2f420, 0x1a6eb: 0x6d40ae20, + 0x1a6ec: 0x6c50ea20, 0x1a6ed: 0x6c7a3420, 0x1a6ee: 0x6cfe9220, 0x1a6ef: 0x6cfc9a20, + 0x1a6f0: 0x6c814820, 0x1a6f1: 0x6c0e5e20, 0x1a6f2: 0x6d302c20, 0x1a6f3: 0x6d2bd020, + 0x1a6f4: 0x6c89ac20, 0x1a6f5: 0x6c033620, 0x1a6f6: 0x6c9ec220, 0x1a6f7: 0x6c8ae220, + 0x1a6f8: 0x6cdbb420, 0x1a6f9: 0x6c3e2a20, 0x1a6fa: 0x6c103420, 0x1a6fb: 0x6c4e9020, + 0x1a6fc: 0x6c524620, 0x1a6fd: 0x6c44f220, 0x1a6fe: 0x6cd76820, 0x1a6ff: 0x6c447420, + // Block 0x69c, offset 0x1a700 + 0x1a700: 0x6d203620, 0x1a701: 0x6d0e4c20, 0x1a702: 0x6c46fc20, 0x1a703: 0x6c477020, + 0x1a704: 0x6c077820, 0x1a705: 0x6c4dec20, 0x1a706: 0x6cdd0c20, 0x1a707: 0x6c213820, + 0x1a708: 0x6d171c20, 0x1a709: 0x6c001820, 0x1a70a: 0x6c63ae20, 0x1a70b: 0x6ce84620, + 0x1a70c: 0x6cfb3220, 0x1a70d: 0x6cecf620, 0x1a70e: 0x6c85c420, 0x1a70f: 0x6cf5b220, + 0x1a710: 0x6ce0e820, 0x1a711: 0x6d428a20, 0x1a712: 0x6cc02420, 0x1a713: 0x6c17d420, + 0x1a714: 0x6cf3ac20, 0x1a715: 0x6d2a6e20, 0x1a716: 0x6d0b4c20, 0x1a717: 0x6c30a420, + 0x1a718: 0x6cb6e420, 0x1a719: 0x6c2b6020, 0x1a71a: 0x6cbe0c20, 0x1a71b: 0x6c96ba20, + 0x1a71c: 0x6ca0ee20, 0x1a71d: 0x6c461220, 0x1a71e: 0x6c30e620, 0x1a71f: 0x6cc26c20, + 0x1a720: 0x6c814a20, 0x1a721: 0x6c898c20, 0x1a722: 0x6cdd5420, 0x1a723: 0x6d2a7020, + 0x1a724: 0x6c58fe20, 0x1a725: 0x6c813620, 0x1a726: 0x6ccbd620, 0x1a727: 0x6c5ea020, + 0x1a728: 0x6d426820, 0x1a729: 0x6cf28420, 0x1a72a: 0x6c3cca20, 0x1a72b: 0x6c6cfc20, + 0x1a72c: 0x6c56fc20, 0x1a72d: 0x6cb77620, 0x1a72e: 0x6cd45c20, 0x1a72f: 0x6ceefa20, + 0x1a730: 0x6cd64420, 0x1a731: 0x6c171020, 0x1a732: 0x6c374e20, 0x1a733: 0x6c85e620, + 0x1a734: 0x6cbb5620, 0x1a735: 0x6c017e20, 0x1a736: 0x6d2ab620, 0x1a737: 0x6d1d7820, + 0x1a738: 0x6ca75e20, 0x1a739: 0x6d208420, 0x1a73a: 0x6ce4e620, 0x1a73b: 0x6c7f4420, + 0x1a73c: 0x6ccc4220, 0x1a73d: 0x6cf5d820, 0x1a73e: 0x6ceba020, 0x1a73f: 0x6c54b820, + // Block 0x69d, offset 0x1a740 + 0x1a740: 0x6c003c20, 0x1a741: 0x6d2f6420, 0x1a742: 0x6caa1420, 0x1a743: 0x6c790220, + 0x1a744: 0x6d3d4420, 0x1a745: 0x6d3d4620, 0x1a746: 0x6cce0220, 0x1a747: 0x6c2c3a20, + 0x1a748: 0x6c524a20, 0x1a749: 0x6c8ba820, 0x1a74a: 0x6c001020, 0x1a74b: 0x6c112220, + 0x1a74c: 0x6cfd6c20, 0x1a74d: 0x6cea1e20, 0x1a74e: 0x6cf43e20, 0x1a74f: 0x6cf20620, + 0x1a750: 0x6c253020, 0x1a751: 0x6ccc4420, 0x1a752: 0x6c477a20, 0x1a753: 0x6cb6ec20, + 0x1a754: 0x6cb6ee20, 0x1a755: 0x6ce21620, 0x1a756: 0x6c287420, 0x1a757: 0x6c287620, + 0x1a758: 0x6d12e620, 0x1a759: 0x6d3f1020, 0x1a75a: 0x6c08d820, 0x1a75b: 0x6c253220, + 0x1a75c: 0x6c1fc220, 0x1a75d: 0x6c510220, 0x1a75e: 0x6d0b5020, 0x1a75f: 0x6cb6f420, + 0x1a760: 0x6d304820, 0x1a761: 0x6c39f620, 0x1a762: 0x6c898e20, 0x1a763: 0x6cfb5820, + 0x1a764: 0x6cafd820, 0x1a765: 0x6ccc4620, 0x1a766: 0x6c7ed420, 0x1a767: 0x6d2ab820, + 0x1a768: 0x6d1baa20, 0x1a769: 0x6c48ae20, 0x1a76a: 0x6cabc220, 0x1a76b: 0x6d30d620, + 0x1a76c: 0x6ccb2020, 0x1a76d: 0x6d3bc220, 0x1a76e: 0x6ca81020, 0x1a76f: 0x6c4cf620, + 0x1a770: 0x6c953020, 0x1a771: 0x6d0bf020, 0x1a772: 0x6c2c3c20, 0x1a773: 0x6cc2d220, + 0x1a774: 0x6c15a420, 0x1a775: 0x6c100620, 0x1a776: 0x6c2fa020, 0x1a777: 0x6c809e20, + 0x1a778: 0x6cffe420, 0x1a779: 0x6c710c20, 0x1a77a: 0x6ce0f220, 0x1a77b: 0x6c1c1a20, + 0x1a77c: 0x6ce31e20, 0x1a77d: 0x6c016c20, 0x1a77e: 0x6c6f7020, 0x1a77f: 0x6c288620, + // Block 0x69e, offset 0x1a780 + 0x1a780: 0x6c761020, 0x1a781: 0x6d1df420, 0x1a782: 0x6cf08a20, 0x1a783: 0x6ca3fc20, + 0x1a784: 0x6ccd8a20, 0x1a785: 0x6d232a20, 0x1a786: 0x6d305820, 0x1a787: 0x6c7e6220, + 0x1a788: 0x6c6a0820, 0x1a789: 0x6c53f820, 0x1a78a: 0x6c4e5820, 0x1a78b: 0x6c2e9820, + 0x1a78c: 0x6d388220, 0x1a78d: 0x6c147e20, 0x1a78e: 0x6cec5220, 0x1a78f: 0x6caaec20, + 0x1a790: 0x6d230020, 0x1a791: 0x6d19d820, 0x1a792: 0x6d28b820, 0x1a793: 0x6d10a220, + 0x1a794: 0x6cab2420, 0x1a795: 0x6c9e2020, 0x1a796: 0x6c555220, 0x1a797: 0x6d27e820, + 0x1a798: 0x6c201e20, 0x1a799: 0x6c5bbc20, 0x1a79a: 0x6c591a20, 0x1a79b: 0x6c591c20, + 0x1a79c: 0x6cf7e620, 0x1a79d: 0x6c509c20, 0x1a79e: 0x6c5ec220, 0x1a79f: 0x6c7cf420, + 0x1a7a0: 0x6d37ee20, 0x1a7a1: 0x6cef0620, 0x1a7a2: 0x6ccc5220, 0x1a7a3: 0x6d06cc20, + 0x1a7a4: 0x6c59ba20, 0x1a7a5: 0x6c344a20, 0x1a7a6: 0x6ca82620, 0x1a7a7: 0x6d079020, + 0x1a7a8: 0x6c89b420, 0x1a7a9: 0x6d232c20, 0x1a7aa: 0x6cca9e20, 0x1a7ab: 0x6c1aae20, + 0x1a7ac: 0x6cbbe020, 0x1a7ad: 0x6d0e6a20, 0x1a7ae: 0x6c27dc20, 0x1a7af: 0x6cae4a20, + 0x1a7b0: 0x6c116820, 0x1a7b1: 0x6c83d020, 0x1a7b2: 0x6d1d7a20, 0x1a7b3: 0x6d2bd620, + 0x1a7b4: 0x6cee7c20, 0x1a7b5: 0x6c9e6c20, 0x1a7b6: 0x6d1c6220, 0x1a7b7: 0x6cae3220, + 0x1a7b8: 0x6c103820, 0x1a7b9: 0x6c7c7420, 0x1a7ba: 0x6cf88420, 0x1a7bb: 0x6d232e20, + 0x1a7bc: 0x6c6ac420, 0x1a7bd: 0x6c912820, 0x1a7be: 0x6c7a9620, 0x1a7bf: 0x6d2a8220, + // Block 0x69f, offset 0x1a7c0 + 0x1a7c0: 0x6c56a220, 0x1a7c1: 0x6ce33c20, 0x1a7c2: 0x6d110420, 0x1a7c3: 0x6c51ca20, + 0x1a7c4: 0x6c000e20, 0x1a7c5: 0x6d054220, 0x1a7c6: 0x6cbabe20, 0x1a7c7: 0x6ccb2e20, + 0x1a7c8: 0x6d1d8a20, 0x1a7c9: 0x6cdabe20, 0x1a7ca: 0x6c53a620, 0x1a7cb: 0x6d00b220, + 0x1a7cc: 0x6c00a220, 0x1a7cd: 0x6cdd2420, 0x1a7ce: 0x6c96f020, 0x1a7cf: 0x6c139620, + 0x1a7d0: 0x6c4d6c20, 0x1a7d1: 0x6c780420, 0x1a7d2: 0x6c264c20, 0x1a7d3: 0x6cca7e20, + 0x1a7d4: 0x6c187220, 0x1a7d5: 0x6cc81820, 0x1a7d6: 0x6cd9aa20, 0x1a7d7: 0x6cebdc20, + 0x1a7d8: 0x6c5ee420, 0x1a7d9: 0x6cad1c20, 0x1a7da: 0x6cf36e20, 0x1a7db: 0x6cba1020, + 0x1a7dc: 0x6cd39820, 0x1a7dd: 0x6c440020, 0x1a7de: 0x6d3e3220, 0x1a7df: 0x6c6a0a20, + 0x1a7e0: 0x6c960c20, 0x1a7e1: 0x6cf22820, 0x1a7e2: 0x6cec3420, 0x1a7e3: 0x6cd8c820, + 0x1a7e4: 0x6c1ab420, 0x1a7e5: 0x6c4fca20, 0x1a7e6: 0x6cddd820, + 0x1a7e8: 0x6c4d1620, 0x1a7e9: 0x6cdd7020, 0x1a7ea: 0x6cbd7e20, 0x1a7eb: 0x6ca83820, + 0x1a7ec: 0x6c50a020, 0x1a7ed: 0x6d347020, 0x1a7ee: 0x6cc9e220, 0x1a7ef: 0x6ca2c620, + 0x1a7f0: 0x6c448a20, 0x1a7f1: 0x6ca2e420, 0x1a7f2: 0x6c2cb820, 0x1a7f3: 0x6c002c20, + 0x1a7f4: 0x6cbb6220, 0x1a7f5: 0x6ce6f620, 0x1a7f6: 0x6c09c220, 0x1a7f7: 0x6c024a20, + 0x1a7f8: 0x6c024c20, 0x1a7f9: 0x6c880c20, 0x1a7fa: 0x6d417420, 0x1a7fb: 0x6d300020, + 0x1a7fc: 0x6ca12420, 0x1a7fd: 0x6cda4620, 0x1a7fe: 0x6cda2020, 0x1a7ff: 0x6ce06820, + // Block 0x6a0, offset 0x1a800 + 0x1a800: 0x6c2b7820, 0x1a801: 0x6cb50820, 0x1a802: 0x6c69aa20, 0x1a803: 0x6c1cd020, + 0x1a804: 0x6c685a20, 0x1a805: 0x6c765620, 0x1a806: 0x6ce0a020, 0x1a807: 0x6cccf820, + 0x1a808: 0x6c127820, 0x1a809: 0x6c637620, 0x1a80a: 0x6c004620, 0x1a80b: 0x6cfee620, + 0x1a80c: 0x6cb1b420, 0x1a80d: 0x6c912a20, 0x1a80e: 0x6c40c020, 0x1a80f: 0x6c47aa20, + 0x1a810: 0x6cfee820, 0x1a811: 0x6c54e220, 0x1a812: 0x6c5bf220, 0x1a813: 0x6c4c2c20, + 0x1a814: 0x6cab8220, 0x1a815: 0x6cfabc20, 0x1a816: 0x6d2ad820, 0x1a817: 0x6c16b420, + 0x1a818: 0x6d05b820, 0x1a819: 0x6cb32e20, 0x1a81a: 0x6c2a5c20, 0x1a81b: 0x6c96f420, + 0x1a81c: 0x6c96ca20, 0x1a81d: 0x6c557820, 0x1a81e: 0x6c836c20, 0x1a81f: 0x6c317220, + 0x1a820: 0x6c40c220, 0x1a821: 0x6ce0c420, 0x1a822: 0x6d12ae20, 0x1a823: 0x6c07fe20, + 0x1a824: 0x6d1bcc20, 0x1a825: 0x6cc9f020, 0x1a826: 0x6c69ac20, 0x1a827: 0x6c9d6420, + 0x1a828: 0x6cfffc20, 0x1a829: 0x6c571220, 0x1a82a: 0x6c971620, 0x1a82b: 0x6cc48020, + 0x1a82c: 0x6c1fc420, 0x1a82d: 0x6cae7e20, 0x1a82e: 0x6c816420, 0x1a82f: 0x6d000420, + 0x1a830: 0x6c5f1020, 0x1a831: 0x6d3a7c20, 0x1a832: 0x6c177020, 0x1a833: 0x6c7d0820, + 0x1a834: 0x6d419820, 0x1a835: 0x6cfefe20, 0x1a836: 0x6cd80c20, 0x1a837: 0x6c4fdc20, + 0x1a838: 0x6c3f7e20, 0x1a839: 0x6c8a0020, 0x1a83a: 0x6cbbe820, 0x1a83b: 0x6cf68e20, + 0x1a83c: 0x6c1f6a20, 0x1a83d: 0x6c15d020, 0x1a83e: 0x6c28a420, 0x1a83f: 0x6c521e20, + // Block 0x6a1, offset 0x1a840 + 0x1a840: 0x6d0aa020, 0x1a841: 0x6c35b620, 0x1a842: 0x6d420a20, 0x1a843: 0x6c385420, + 0x1a844: 0x6c1acc20, 0x1a845: 0x6c5ae220, 0x1a846: 0x6d297220, 0x1a847: 0x6c207420, + 0x1a848: 0x6c245220, 0x1a849: 0x6c289c20, 0x1a84a: 0x6d23ba20, 0x1a84b: 0x6cea2420, + 0x1a84c: 0x6c134a20, 0x1a84d: 0x6c69b620, 0x1a84e: 0x6d126220, 0x1a84f: 0x6cf69020, + 0x1a850: 0x6cb7be20, 0x1a851: 0x6c4fd020, 0x1a852: 0x6c882e20, 0x1a853: 0x6d05ca20, + 0x1a854: 0x6c2aa420, 0x1a855: 0x6c5ae820, 0x1a856: 0x6d1a8c20, 0x1a857: 0x6cb40c20, + 0x1a858: 0x6c73b220, 0x1a859: 0x6cbd9220, 0x1a85a: 0x6d0a2e20, 0x1a85b: 0x6ca85a20, + 0x1a85c: 0x6c912c20, 0x1a85d: 0x6cd80e20, 0x1a85e: 0x6d0dd420, 0x1a85f: 0x6d1d4820, + 0x1a860: 0x6c265e20, 0x1a861: 0x6d2d9420, 0x1a862: 0x6cab2620, 0x1a863: 0x6d394e20, + 0x1a864: 0x6c6d4820, 0x1a865: 0x6ca9c420, 0x1a866: 0x6c5c2620, 0x1a867: 0x6d01f420, + 0x1a868: 0x6cb7ce20, 0x1a869: 0x6c36a620, 0x1a86a: 0x6d2a8e20, 0x1a86b: 0x6d140e20, + 0x1a86c: 0x6cd3d620, 0x1a86d: 0x6c69c220, 0x1a86e: 0x6d263020, 0x1a86f: 0x6c003420, + 0x1a870: 0x6d1dac20, 0x1a871: 0x6c74b420, 0x1a872: 0x6c7b3820, 0x1a873: 0x6d228a20, + 0x1a874: 0x6cae3420, 0x1a875: 0x6c2a2820, 0x1a876: 0x6c40c820, 0x1a877: 0x6c528e20, + 0x1a878: 0x6c33aa20, 0x1a879: 0x6c290220, 0x1a87a: 0x6d036420, 0x1a87b: 0x6cc9cc20, + 0x1a87c: 0x6caf8e20, 0x1a87d: 0x6cb07220, 0x1a87e: 0x6d1a0e20, 0x1a87f: 0x6d41a020, + // Block 0x6a2, offset 0x1a880 + 0x1a880: 0x6ca92020, 0x1a881: 0x6c2b9620, 0x1a882: 0x6c807820, 0x1a883: 0x6cddfa20, + 0x1a884: 0x6c5d5e20, 0x1a885: 0x6cc7cc20, 0x1a886: 0x6c4fac20, 0x1a887: 0x6cfa4820, + 0x1a888: 0x6d135220, 0x1a889: 0x6c343820, 0x1a88a: 0x6cb0be20, 0x1a88b: 0x6c1de020, + 0x1a88c: 0x6c629020, 0x1a88d: 0x6c6d5620, 0x1a88e: 0x6c4fec20, 0x1a88f: 0x6ce42820, + 0x1a890: 0x6c16ca20, 0x1a891: 0x6d0ac220, 0x1a892: 0x6c99c620, 0x1a893: 0x6c10d820, + 0x1a894: 0x6ce43820, 0x1a895: 0x6c91e420, 0x1a896: 0x6c5c6420, 0x1a897: 0x6c0f8820, + 0x1a898: 0x6d1eba20, 0x1a899: 0x6ca88620, 0x1a89a: 0x6d1a9e20, 0x1a89b: 0x6c56d620, + 0x1a89c: 0x6c99ca20, 0x1a89d: 0x6c52d220, 0x1a89e: 0x6d30a820, 0x1a89f: 0x6c846c20, + 0x1a8a0: 0x6c8eb220, 0x1a8a1: 0x6c4d8e20, 0x1a8a2: 0x6ca45620, 0x1a8a3: 0x6cff2e20, + 0x1a8a4: 0x6ca08220, 0x1a8a5: 0x6d0ee620, 0x1a8a6: 0x6c86e820, 0x1a8a7: 0x6c916820, + 0x1a8a8: 0x6c8fba20, 0x1a8a9: 0x6ca08c20, 0x1a8aa: 0x6c28dc20, 0x1a8ab: 0x6c193a20, + 0x1a8ac: 0x6cb21e20, 0x1a8ad: 0x6cb07c20, 0x1a8ae: 0x6cfe5c20, 0x1a8af: 0x6c5e2420, + 0x1a8b0: 0x6ca08e20, 0x1a8b1: 0x6cf91e20, 0x1a8b2: 0x6c34c220, 0x1a8b3: 0x6c7ab220, + 0x1a8b4: 0x6d0ce820, 0x1a8b5: 0x6c154e20, 0x1a8b6: 0x6d1c1820, 0x1a8b7: 0x6cc50420, + 0x1a8b8: 0x6c2d3020, 0x1a8b9: 0x6c7ede20, 0x1a8ba: 0x6cded620, 0x1a8bb: 0x6cff4c20, + 0x1a8bc: 0x6c74fc20, 0x1a8bd: 0x6c21e420, 0x1a8be: 0x6c583c20, 0x1a8bf: 0x6c5e3c20, + // Block 0x6a3, offset 0x1a8c0 + 0x1a8c0: 0x6d3bfe20, 0x1a8c1: 0x6ca8aa20, 0x1a8c2: 0x6cff4e20, 0x1a8c3: 0x6c10ee20, + 0x1a8c4: 0x6c84a420, 0x1a8c5: 0x6c161620, 0x1a8c6: 0x6c14a820, 0x1a8c7: 0x6c876020, + 0x1a8c8: 0x6d194020, 0x1a8c9: 0x6c953620, 0x1a8ca: 0x6ca45e20, 0x1a8cb: 0x6d28dc20, + 0x1a8cc: 0x6cda6e20, 0x1a8cd: 0x6cf82420, 0x1a8ce: 0x6d2b7e20, 0x1a8cf: 0x6c654e20, + 0x1a8d0: 0x6d28de20, 0x1a8d1: 0x6d3a8e20, 0x1a8d2: 0x6c800620, 0x1a8d3: 0x6ca8c220, + 0x1a8d4: 0x6ca45220, 0x1a8d5: 0x6c806220, 0x1a8d6: 0x6c8f6420, 0x1a8d7: 0x6ceed620, + 0x1a8d8: 0x6c5b1220, 0x1a8d9: 0x6d199c20, 0x1a8da: 0x6cbff020, 0x1a8db: 0x6cd87420, + 0x1a8dc: 0x6ca8e220, 0x1a8dd: 0x6c656220, 0x1a8de: 0x6c5b1420, 0x1a8df: 0x6d031420, + 0x1a8e0: 0x6d199e20, 0x1a8e1: 0x6ca3dc20, 0x1a8e2: 0x6ce94420, 0x1a8e3: 0x6ce94620, + 0x1a8e4: 0x6c33d620, 0x1a8e5: 0x6c777c20, 0x1a8e6: 0x6d24c620, 0x1a8e7: 0x6c6ef420, + 0x1a8e8: 0x6cb0ec20, 0x1a8e9: 0x6d277c20, 0x1a8ea: 0x6c22f620, 0x1a8eb: 0x6c551c20, + 0x1a8ec: 0x6c5b1820, 0x1a8ed: 0x6d253a20, 0x1a8ee: 0x6c354a20, 0x1a8ef: 0x6c4c5620, + 0x1a8f0: 0x6c7dca20, 0x1a8f1: 0x6c22f820, 0x1a8f2: 0x6ce6ee20, 0x1a8f3: 0x6ce88420, + 0x1a8f4: 0x6ceedc20, 0x1a8f5: 0x6c94d820, 0x1a8f6: 0x6c4c5a20, 0x1a8f7: 0x6cc43020, + 0x1a8f8: 0x6cc64020, 0x1a8f9: 0x6c8c9e20, 0x1a8fa: 0x6c47fe20, 0x1a8fb: 0x6c4c5c20, + 0x1a8fc: 0x6cdf0020, 0x1a8fd: 0x6c4c5e20, 0x1a8fe: 0x6ce88820, 0x1a8ff: 0x6d202020, + // Block 0x6a4, offset 0x1a900 + 0x1a900: 0x6c4c6220, 0x1a901: 0x6d1a4220, 0x1a902: 0x6c5d2020, 0x1a903: 0x6cb48620, + 0x1a904: 0x6d223820, 0x1a905: 0x6c4dee20, 0x1a906: 0x6d255020, 0x1a907: 0x6c94ea20, + 0x1a908: 0x6cc29620, 0x1a909: 0x6d224820, 0x1a90a: 0x6cbe3e20, 0x1a90b: 0x6c4c6620, + 0x1a90c: 0x6c1ffa20, 0x1a90d: 0x6cef0820, 0x1a90e: 0x6d256020, 0x1a90f: 0x6cc29a20, + 0x1a910: 0x6c7a4020, 0x1a911: 0x6c400a20, 0x1a912: 0x6d257420, 0x1a913: 0x6d257620, + 0x1a914: 0x6d0bbc20, 0x1a915: 0x6ce8b620, 0x1a916: 0x6ce8d420, 0x1a917: 0x6ce8d620, + 0x1a918: 0x6ce95020, 0x1a919: 0x6c94b820, 0x1a91a: 0x6c5c0c20, 0x1a91b: 0x6d188220, + 0x1a91c: 0x6c589220, 0x1a91d: 0x6c944a20, 0x1a91e: 0x6c946e20, 0x1a91f: 0x6ce91020, + 0x1a920: 0x6d0b6620, 0x1a921: 0x6ce91220, 0x1a922: 0x6ce6aa20, 0x1a923: 0x6cd15220, + 0x1a924: 0x6cb48020, 0x1a925: 0x6c920c20, 0x1a926: 0x6c7b5020, 0x1a927: 0x6d0ac620, + 0x1a928: 0x6d292820, 0x1a929: 0x6ceeda20, 0x1a92a: 0x6c436620, 0x1a92b: 0x6d22be20, + 0x1a92c: 0x6cf34020, 0x1a92d: 0x6c4a3420, 0x1a92e: 0x6cb04820, 0x1a92f: 0x6d145020, + 0x1a930: 0x6c2a8a20, 0x1a931: 0x6cb89220, 0x1a932: 0x6cb89420, 0x1a933: 0x6d320e20, + 0x1a934: 0x6d3d1a20, 0x1a935: 0x6c295220, 0x1a936: 0x6cb83e20, 0x1a937: 0x6cfa6220, + 0x1a938: 0x6ccdf620, 0x1a939: 0x6c7bd820, 0x1a93a: 0x6c16e220, 0x1a93b: 0x6cb56e20, + 0x1a93c: 0x6ca7f220, 0x1a93d: 0x6ca0c220, 0x1a93e: 0x6c5e7620, 0x1a93f: 0x6c639820, + // Block 0x6a5, offset 0x1a940 + 0x1a940: 0x6d34dc20, 0x1a941: 0x6d34de20, 0x1a942: 0x6c04b420, 0x1a943: 0x6d098e20, + 0x1a944: 0x6d167a20, 0x1a945: 0x6cbdc620, 0x1a946: 0x6c99d020, 0x1a947: 0x6c755620, + 0x1a948: 0x6cc6f220, 0x1a949: 0x6cea3c20, 0x1a94a: 0x6c39e820, 0x1a94b: 0x6c07a420, + 0x1a94c: 0x6c07a620, 0x1a94d: 0x6cdf8820, 0x1a94e: 0x6c76be20, 0x1a94f: 0x6c580a20, + 0x1a950: 0x6d427620, 0x1a951: 0x6c792620, 0x1a952: 0x6c091820, 0x1a953: 0x6c6e0a20, + 0x1a954: 0x6c2c1220, 0x1a955: 0x6c6d8620, 0x1a956: 0x6c617c20, 0x1a957: 0x6c7b0c20, + 0x1a958: 0x6c2bcc20, 0x1a959: 0x6c6d8820, 0x1a95a: 0x6c646220, 0x1a95b: 0x6cdfca20, + 0x1a95c: 0x6c857e20, 0x1a95d: 0x6c03a620, 0x1a95e: 0x6cf4a420, 0x1a95f: 0x6c3b5020, + 0x1a960: 0x6d3c7a20, 0x1a961: 0x6cb2f620, 0x1a962: 0x6c04e220, 0x1a963: 0x6ce0bc20, + 0x1a964: 0x6c7d4a20, 0x1a965: 0x6cc0da20, 0x1a966: 0x6ce05220, 0x1a967: 0x6d339420, + 0x1a968: 0x6ceaea20, 0x1a969: 0x6c417020, 0x1a96a: 0x6cb27620, 0x1a96b: 0x6c2d3a20, + 0x1a96c: 0x6c48a820, 0x1a96d: 0x6ca5ba20, 0x1a96e: 0x6cdf1420, 0x1a96f: 0x6caf3020, + 0x1a970: 0x6c6ed620, 0x1a971: 0x6d100020, 0x1a972: 0x6c3d0a20, 0x1a973: 0x6c02c420, + 0x1a974: 0x6c921820, 0x1a975: 0x6cbf9c20, 0x1a976: 0x6ca22620, 0x1a977: 0x6c785420, + 0x1a978: 0x6c469220, 0x1a979: 0x6d094020, 0x1a97a: 0x6c036220, 0x1a97b: 0x6c1b0420, + 0x1a97c: 0x6c180020, 0x1a97d: 0x6c8ca020, 0x1a97e: 0x6d3aaa20, 0x1a97f: 0x6c3fb020, + // Block 0x6a6, offset 0x1a980 + 0x1a980: 0x6c549a20, 0x1a981: 0x6d358420, 0x1a982: 0x6c20be20, 0x1a983: 0x6c7e3a20, + 0x1a984: 0x6c902e20, 0x1a985: 0x6c903020, 0x1a986: 0x6c913820, 0x1a987: 0x6c02c620, + 0x1a988: 0x6c272e20, 0x1a989: 0x6cad4820, 0x1a98a: 0x6c9fe220, 0x1a98b: 0x6d03ca20, + 0x1a98c: 0x6c305620, 0x1a98d: 0x6c619e20, 0x1a98e: 0x6c51ba20, 0x1a98f: 0x6c93ce20, + 0x1a990: 0x6c222820, 0x1a991: 0x6c1b8220, 0x1a992: 0x6c82ba20, 0x1a993: 0x6c40e420, + 0x1a994: 0x6d19aa20, 0x1a995: 0x6c546220, 0x1a996: 0x6c32f420, 0x1a997: 0x6d2f9c20, + 0x1a998: 0x6c3e0820, 0x1a999: 0x6c49dc20, 0x1a99a: 0x6d10d420, 0x1a99b: 0x6c347820, + 0x1a99c: 0x6c347a20, 0x1a99d: 0x6c4ad020, 0x1a99e: 0x6c13ca20, 0x1a99f: 0x6d0f8e20, + 0x1a9a0: 0x6d1a3820, 0x1a9a1: 0x6c37fe20, 0x1a9a2: 0x6c469a20, 0x1a9a3: 0x6d254420, + 0x1a9a4: 0x6c2e6a20, 0x1a9a5: 0x6d007620, 0x1a9a6: 0x6c78fa20, 0x1a9a7: 0x6cce3220, + 0x1a9a8: 0x6cd43e20, 0x1a9a9: 0x6c35ec20, 0x1a9aa: 0x6c0e4020, 0x1a9ab: 0x6c2d4020, + 0x1a9ac: 0x6c530c20, 0x1a9ad: 0x6d0ad820, 0x1a9ae: 0x6c7ad620, 0x1a9af: 0x6c26f820, + 0x1a9b0: 0x6c762020, 0x1a9b1: 0x6c295a20, 0x1a9b2: 0x6c764a20, 0x1a9b3: 0x6c4f9e20, + 0x1a9b4: 0x6ca4dc20, 0x1a9b5: 0x6c017820, 0x1a9b6: 0x6d036c20, 0x1a9b7: 0x6cfc9c20, + 0x1a9b8: 0x6d260820, 0x1a9b9: 0x6c051a20, 0x1a9ba: 0x6c3d5a20, 0x1a9bb: 0x6c03ae20, + 0x1a9bc: 0x6d172020, 0x1a9bd: 0x6d1b4220, 0x1a9be: 0x6c4e9220, 0x1a9bf: 0x6d06a020, + // Block 0x6a7, offset 0x1a9c0 + 0x1a9c0: 0x6c20c420, 0x1a9c1: 0x6cbd6220, 0x1a9c2: 0x6c44f420, 0x1a9c3: 0x6c001c20, + 0x1a9c4: 0x6c081620, 0x1a9c5: 0x6c39aa20, 0x1a9c6: 0x6cc3a820, 0x1a9c7: 0x6d1e2020, + 0x1a9c8: 0x6c75a020, 0x1a9c9: 0x6c633e20, 0x1a9ca: 0x6c2c2a20, 0x1a9cb: 0x6c96fa20, + 0x1a9cc: 0x6c811420, 0x1a9cd: 0x6c731820, 0x1a9ce: 0x6c19c620, 0x1a9cf: 0x6ccccc20, + 0x1a9d0: 0x6c6c3c20, 0x1a9d1: 0x6d303020, 0x1a9d2: 0x6c8ae420, 0x1a9d3: 0x6c8ae620, + 0x1a9d4: 0x6c107e20, 0x1a9d5: 0x6c19d820, 0x1a9d6: 0x6c57d820, 0x1a9d7: 0x6c108020, + 0x1a9d8: 0x6cd25a20, 0x1a9d9: 0x6d099420, 0x1a9da: 0x6c4c1820, 0x1a9db: 0x6c6eda20, + 0x1a9dc: 0x6d12a820, 0x1a9dd: 0x6ca76020, 0x1a9de: 0x6c2bee20, 0x1a9df: 0x6d230420, + 0x1a9e0: 0x6c109220, 0x1a9e1: 0x6d0ae820, 0x1a9e2: 0x6cc2d420, 0x1a9e3: 0x6cdc3420, + 0x1a9e4: 0x6cafdc20, 0x1a9e5: 0x6cbe4020, 0x1a9e6: 0x6cecfe20, 0x1a9e7: 0x6c723820, + 0x1a9e8: 0x6c951420, 0x1a9e9: 0x6d329220, 0x1a9ea: 0x6c796e20, 0x1a9eb: 0x6c1d3820, + 0x1a9ec: 0x6c2fee20, 0x1a9ed: 0x6c275a20, 0x1a9ee: 0x6ce09220, 0x1a9ef: 0x6c018020, + 0x1a9f0: 0x6c114220, 0x1a9f1: 0x6c1f2e20, 0x1a9f2: 0x6c081820, 0x1a9f3: 0x6c76ce20, + 0x1a9f4: 0x6d344c20, 0x1a9f5: 0x6c348420, 0x1a9f6: 0x6d175220, 0x1a9f7: 0x6d344e20, + 0x1a9f8: 0x6d175420, 0x1a9f9: 0x6cadd020, 0x1a9fa: 0x6c5eb420, 0x1a9fb: 0x6d3cdc20, + 0x1a9fc: 0x6cb5b820, 0x1a9fd: 0x6ccaee20, 0x1a9fe: 0x6c723a20, 0x1a9ff: 0x6ca5d420, + // Block 0x6a8, offset 0x1aa00 + 0x1aa00: 0x6c7a3a20, 0x1aa01: 0x6c78a020, 0x1aa02: 0x6ce0ec20, 0x1aa03: 0x6c7d5020, + 0x1aa04: 0x6ca69620, 0x1aa05: 0x6c648220, 0x1aa06: 0x6c32fa20, 0x1aa07: 0x6c6c8e20, + 0x1aa08: 0x6c427620, 0x1aa09: 0x6d230620, 0x1aa0a: 0x6c360c20, 0x1aa0b: 0x6cae9820, + 0x1aa0c: 0x6c480820, 0x1aa0d: 0x6ce92220, 0x1aa0e: 0x6c839420, 0x1aa0f: 0x6c39ea20, + 0x1aa10: 0x6d0b2420, 0x1aa11: 0x6cba4c20, 0x1aa12: 0x6c7ddc20, 0x1aa13: 0x6c01b620, + 0x1aa14: 0x6cd0ca20, 0x1aa15: 0x6c34e620, 0x1aa16: 0x6ca4f220, 0x1aa17: 0x6ce85c20, + 0x1aa18: 0x6c19fa20, 0x1aa19: 0x6d19da20, 0x1aa1a: 0x6c5cea20, 0x1aa1b: 0x6c099420, + 0x1aa1c: 0x6c88f220, 0x1aa1d: 0x6c4c1c20, 0x1aa1e: 0x6c2e9a20, 0x1aa1f: 0x6d3bc420, + 0x1aa20: 0x6c547020, 0x1aa21: 0x6c05fa20, 0x1aa22: 0x6c05fc20, 0x1aa23: 0x6d211420, + 0x1aa24: 0x6c2b2e20, 0x1aa25: 0x6c98e220, 0x1aa26: 0x6c6a0c20, 0x1aa27: 0x6cc83c20, + 0x1aa28: 0x6d12ec20, 0x1aa29: 0x6c452e20, 0x1aa2a: 0x6c76aa20, 0x1aa2b: 0x6d3f8020, + 0x1aa2c: 0x6d211620, 0x1aa2d: 0x6c59bc20, 0x1aa2e: 0x6c362c20, 0x1aa2f: 0x6d10f620, + 0x1aa30: 0x6d0e6c20, 0x1aa31: 0x6c064c20, 0x1aa32: 0x6c223620, 0x1aa33: 0x6c99f620, + 0x1aa34: 0x6c16ec20, 0x1aa35: 0x6c321420, 0x1aa36: 0x6ceb1c20, 0x1aa37: 0x6d1b5020, + 0x1aa38: 0x6c3ca620, 0x1aa39: 0x6d382820, 0x1aa3a: 0x6c6be820, 0x1aa3b: 0x6c6c4420, + 0x1aa3c: 0x6c528820, 0x1aa3d: 0x6c428620, 0x1aa3e: 0x6c210620, 0x1aa3f: 0x6c658e20, + // Block 0x6a9, offset 0x1aa40 + 0x1aa40: 0x6cb2ec20, 0x1aa41: 0x6c836a20, 0x1aa42: 0x6cfe3220, 0x1aa43: 0x6c599220, + 0x1aa44: 0x6c837620, 0x1aa45: 0x6c32c020, 0x1aa46: 0x6cec8e20, 0x1aa47: 0x6d079220, + 0x1aa48: 0x6c61fe20, 0x1aa49: 0x6c604a20, 0x1aa4a: 0x6c7b2420, 0x1aa4b: 0x6d1c7c20, + 0x1aa4c: 0x6cddee20, 0x1aa4d: 0x6c1a1620, 0x1aa4e: 0x6d1e4220, 0x1aa4f: 0x6c765c20, + 0x1aa50: 0x6cdac020, 0x1aa51: 0x6cdac220, 0x1aa52: 0x6cd26e20, 0x1aa53: 0x6c9d4e20, + 0x1aa54: 0x6cde0820, 0x1aa55: 0x6cf24e20, 0x1aa56: 0x6c1a1820, 0x1aa57: 0x6ce8b820, + 0x1aa58: 0x6ce0fe20, 0x1aa59: 0x6cc3c820, 0x1aa5a: 0x6d37f420, 0x1aa5b: 0x6c862a20, + 0x1aa5c: 0x6d37f620, 0x1aa5d: 0x6c057620, 0x1aa5e: 0x6cc9c620, 0x1aa5f: 0x6d2a0620, + 0x1aa60: 0x6c330020, 0x1aa61: 0x6ce4a820, 0x1aa62: 0x6cf4f820, 0x1aa63: 0x6d335020, + 0x1aa64: 0x6d099c20, 0x1aa65: 0x6c440420, 0x1aa66: 0x6d324020, 0x1aa67: 0x6c00a420, + 0x1aa68: 0x6c459020, 0x1aa69: 0x6d0ca620, 0x1aa6a: 0x6c76da20, 0x1aa6b: 0x6ce4aa20, + 0x1aa6c: 0x6d257820, 0x1aa6d: 0x6cf14e20, 0x1aa6e: 0x6d01be20, 0x1aa6f: 0x6c8f3220, + 0x1aa70: 0x6c4d8c20, 0x1aa71: 0x6c810220, 0x1aa72: 0x6c16b620, 0x1aa73: 0x6caea820, + 0x1aa74: 0x6c084820, 0x1aa75: 0x6c18da20, 0x1aa76: 0x6c927820, 0x1aa77: 0x6c91c620, + 0x1aa78: 0x6cab3c20, 0x1aa79: 0x6cba6220, 0x1aa7a: 0x6c9a1620, 0x1aa7b: 0x6ca12620, + 0x1aa7c: 0x6d3b8220, 0x1aa7d: 0x6cd6d420, 0x1aa7e: 0x6cd52e20, 0x1aa7f: 0x6c90e820, + // Block 0x6aa, offset 0x1aa80 + 0x1aa80: 0x6c1b4620, 0x1aa81: 0x6c97e220, 0x1aa82: 0x6c0c0620, 0x1aa83: 0x6c6e9420, + 0x1aa84: 0x6c130020, 0x1aa85: 0x6cd5ee20, 0x1aa86: 0x6d367a20, 0x1aa87: 0x6d2ec020, + 0x1aa88: 0x6c770a20, 0x1aa89: 0x6d1d9620, 0x1aa8a: 0x6c2d6e20, 0x1aa8b: 0x6c190820, + 0x1aa8c: 0x6d347c20, 0x1aa8d: 0x6cf8ac20, 0x1aa8e: 0x6c4c2420, 0x1aa8f: 0x6cbb4620, + 0x1aa90: 0x6c6d2220, 0x1aa91: 0x6c2c7a20, 0x1aa92: 0x6cce0a20, 0x1aa93: 0x6ca29020, + 0x1aa94: 0x6c24d220, 0x1aa95: 0x6d0e9220, 0x1aa96: 0x6cde1020, 0x1aa97: 0x6d2b8220, + 0x1aa98: 0x6cb9ac20, 0x1aa99: 0x6cbb1020, 0x1aa9a: 0x6c895e20, 0x1aa9b: 0x6cf14220, + 0x1aa9c: 0x6d3c9a20, 0x1aa9d: 0x6cbb9820, 0x1aa9e: 0x6d2b8620, 0x1aa9f: 0x6d05ba20, + 0x1aaa0: 0x6ccd9a20, 0x1aaa1: 0x6ccd9c20, 0x1aaa2: 0x6c038e20, 0x1aaa3: 0x6cb44820, + 0x1aaa4: 0x6c7b3220, 0x1aaa5: 0x6c303220, 0x1aaa6: 0x6c38b020, 0x1aaa7: 0x6cc3e820, + 0x1aaa8: 0x6ca16020, 0x1aaa9: 0x6c33a020, 0x1aaaa: 0x6c33a220, 0x1aaab: 0x6d41ea20, + 0x1aaac: 0x6c2c7c20, 0x1aaad: 0x6cd17220, 0x1aaae: 0x6c350820, 0x1aaaf: 0x6c350e20, + 0x1aab0: 0x6cdffc20, 0x1aab1: 0x6c2ae020, 0x1aab2: 0x6ca21820, 0x1aab3: 0x6c3b8420, + 0x1aab4: 0x6c59d820, 0x1aab5: 0x6cdffe20, 0x1aab6: 0x6c26fe20, 0x1aab7: 0x6d12fa20, + 0x1aab8: 0x6d3b5220, 0x1aab9: 0x6c673a20, 0x1aaba: 0x6c02e420, 0x1aabb: 0x6cbb1e20, + 0x1aabc: 0x6c5f2c20, 0x1aabd: 0x6cbba220, 0x1aabe: 0x6c790a20, 0x1aabf: 0x6d188420, + // Block 0x6ab, offset 0x1aac0 + 0x1aac0: 0x6cb01a20, 0x1aac1: 0x6c0a4420, 0x1aac2: 0x6c2d7c20, 0x1aac3: 0x6c677820, + 0x1aac4: 0x6d12b420, 0x1aac5: 0x6d1dae20, 0x1aac6: 0x6d091620, 0x1aac7: 0x6ce00c20, + 0x1aac8: 0x6c803820, 0x1aac9: 0x6c728820, 0x1aaca: 0x6c581420, 0x1aacb: 0x6c298e20, + 0x1aacc: 0x6cc50220, 0x1aacd: 0x6cba8020, 0x1aace: 0x6d09ae20, 0x1aacf: 0x6cfd1820, + 0x1aad0: 0x6cf81620, 0x1aad1: 0x6c51ee20, 0x1aad2: 0x6c00c620, 0x1aad3: 0x6d0b0020, + 0x1aad4: 0x6c29ee20, 0x1aad5: 0x6c4fee20, 0x1aad6: 0x6cc84a20, 0x1aad7: 0x6c6d8220, + 0x1aad8: 0x6c82e220, 0x1aad9: 0x6c7c0620, 0x1aada: 0x6c916a20, 0x1aadb: 0x6d0cea20, + 0x1aadc: 0x6ce03020, 0x1aadd: 0x6cf03820, 0x1aade: 0x6c581820, 0x1aadf: 0x6c903e20, + 0x1aae0: 0x6c904020, 0x1aae1: 0x6cc8ec20, 0x1aae2: 0x6c86ea20, 0x1aae3: 0x6c8bfe20, + 0x1aae4: 0x6cc50620, 0x1aae5: 0x6c165c20, 0x1aae6: 0x6d09c420, 0x1aae7: 0x6d0d0c20, + 0x1aae8: 0x6c829620, 0x1aae9: 0x6c03da20, 0x1aaea: 0x6ceca620, 0x1aaeb: 0x6cd2e220, + 0x1aaec: 0x6cc56020, 0x1aaed: 0x6cca6220, 0x1aaee: 0x6d3c2c20, 0x1aaef: 0x6d3c2e20, + 0x1aaf0: 0x6cd0dc20, 0x1aaf1: 0x6d13c620, 0x1aaf2: 0x6c972420, 0x1aaf3: 0x6c784a20, + 0x1aaf4: 0x6d3aba20, 0x1aaf5: 0x6d3c3620, 0x1aaf6: 0x6c553020, 0x1aaf7: 0x6c554020, + 0x1aaf8: 0x6c7da620, 0x1aaf9: 0x6d13ee20, 0x1aafa: 0x6c555420, 0x1aafb: 0x6d06d020, + 0x1aafc: 0x6c7db220, 0x1aafd: 0x6cd46e20, 0x1aafe: 0x6c989420, 0x1aaff: 0x6d41ec20, + // Block 0x6ac, offset 0x1ab00 + 0x1ab00: 0x6cd47020, 0x1ab01: 0x6d141220, 0x1ab02: 0x6d34ca20, 0x1ab03: 0x6c474e20, + 0x1ab04: 0x6c1f0220, 0x1ab05: 0x6c67d220, 0x1ab06: 0x6c3c9c20, 0x1ab07: 0x6c06e020, + 0x1ab08: 0x6d2d5820, 0x1ab09: 0x6c0b8420, 0x1ab0a: 0x6cdba620, 0x1ab0b: 0x6cc42e20, + 0x1ab0c: 0x6c8ca220, 0x1ab0d: 0x6c3fc020, 0x1ab0e: 0x6c261420, 0x1ab0f: 0x6cfa3220, + 0x1ab10: 0x6d049a20, 0x1ab11: 0x6d02a020, 0x1ab12: 0x6ca4cc20, 0x1ab13: 0x6cfa5a20, + 0x1ab14: 0x6c7cb420, 0x1ab15: 0x6cf55a20, 0x1ab16: 0x6cec6820, 0x1ab17: 0x6d25f820, + 0x1ab18: 0x6c992020, 0x1ab19: 0x6cda7c20, 0x1ab1a: 0x6c341620, 0x1ab1b: 0x6c341820, + 0x1ab1c: 0x6d12ca20, 0x1ab1d: 0x6cbe6c20, 0x1ab1e: 0x6cec6e20, 0x1ab1f: 0x6c46a220, + 0x1ab20: 0x6c46a420, 0x1ab21: 0x6cb78820, 0x1ab22: 0x6c9c0420, 0x1ab23: 0x6c9c0820, + 0x1ab24: 0x6d1a8020, 0x1ab25: 0x6c5d9420, 0x1ab26: 0x6c190c20, 0x1ab27: 0x6c26e420, + 0x1ab28: 0x6d2b3020, 0x1ab29: 0x6ce45420, 0x1ab2a: 0x6cdf5a20, 0x1ab2b: 0x6c40a620, + 0x1ab2c: 0x6c48e220, 0x1ab2d: 0x6d108020, 0x1ab2e: 0x6d0f4020, 0x1ab2f: 0x6c4f4620, + 0x1ab30: 0x6c42fa20, 0x1ab31: 0x6cd18e20, 0x1ab32: 0x6ce1aa20, 0x1ab33: 0x6cdf5c20, + 0x1ab34: 0x6ce7e420, 0x1ab35: 0x6d0d3420, 0x1ab36: 0x6c08b020, 0x1ab37: 0x6d145220, + 0x1ab38: 0x6c7ab820, 0x1ab39: 0x6c631c20, 0x1ab3a: 0x6c343a20, 0x1ab3b: 0x6c577c20, + 0x1ab3c: 0x6c7bce20, 0x1ab3d: 0x6d27d620, 0x1ab3e: 0x6c632020, 0x1ab3f: 0x6c031820, + // Block 0x6ad, offset 0x1ab40 + 0x1ab40: 0x6c370e20, 0x1ab41: 0x6c87ec20, 0x1ab42: 0x6c58ee20, 0x1ab43: 0x6c2b1220, + 0x1ab44: 0x6d0d4620, 0x1ab45: 0x6cad7e20, 0x1ab46: 0x6c733c20, 0x1ab47: 0x6cb57c20, + 0x1ab48: 0x6ca3ac20, 0x1ab49: 0x6c3cd820, 0x1ab4a: 0x6d007820, 0x1ab4b: 0x6c3bcc20, + 0x1ab4c: 0x6c2d0820, 0x1ab4d: 0x6d107820, 0x1ab4e: 0x6c7c5e20, 0x1ab4f: 0x6d408620, + 0x1ab50: 0x6c58f820, 0x1ab51: 0x6cb75220, 0x1ab52: 0x6c762620, 0x1ab53: 0x6d2bc820, + 0x1ab54: 0x6c077c20, 0x1ab55: 0x6d16e020, 0x1ab56: 0x6c679e20, 0x1ab57: 0x6ce26220, + 0x1ab58: 0x6d29fe20, 0x1ab59: 0x6c079820, 0x1ab5a: 0x6cf5b420, 0x1ab5b: 0x6c5a5020, + 0x1ab5c: 0x6c3a5020, 0x1ab5d: 0x6c2dc020, 0x1ab5e: 0x6d0a8620, 0x1ab5f: 0x6c07e020, + 0x1ab60: 0x6c2d5620, 0x1ab61: 0x6c02d020, 0x1ab62: 0x6cceea20, 0x1ab63: 0x6cf24c20, + 0x1ab64: 0x6c4d0220, 0x1ab65: 0x6c02d220, 0x1ab66: 0x6cf4fa20, 0x1ab67: 0x6c02d420, + 0x1ab68: 0x6c67ac20, 0x1ab69: 0x6c881c20, 0x1ab6a: 0x6c345a20, 0x1ab6b: 0x6d275e20, + 0x1ab6c: 0x6c67ae20, 0x1ab6d: 0x6cd3c420, 0x1ab6e: 0x6c3be620, 0x1ab6f: 0x6c5df620, + 0x1ab70: 0x6c0a8620, 0x1ab71: 0x6c944c20, 0x1ab72: 0x6c34c620, 0x1ab73: 0x6caa6e20, + 0x1ab74: 0x6caa3a20, 0x1ab75: 0x6c2f6820, 0x1ab76: 0x6ca38e20, 0x1ab77: 0x6cb89620, + 0x1ab78: 0x6c645c20, 0x1ab79: 0x6cddde20, 0x1ab7a: 0x6c6fa220, 0x1ab7b: 0x6caa8e20, + 0x1ab7c: 0x6c142820, 0x1ab7d: 0x6c500620, 0x1ab7e: 0x6cfa7020, 0x1ab7f: 0x6c391a20, + // Block 0x6ae, offset 0x1ab80 + 0x1ab80: 0x6c611a20, 0x1ab81: 0x6cd76e20, 0x1ab82: 0x6cc78a20, 0x1ab83: 0x6c39f020, + 0x1ab84: 0x6cee4420, 0x1ab85: 0x6c52ec20, 0x1ab86: 0x6d3c0620, 0x1ab87: 0x6c3fa620, + 0x1ab88: 0x6c965c20, 0x1ab89: 0x6c27b420, 0x1ab8a: 0x6cc5be20, 0x1ab8b: 0x6c3d3a20, + 0x1ab8c: 0x6c6e4820, 0x1ab8d: 0x6d0c5620, 0x1ab8e: 0x6c4d5420, 0x1ab8f: 0x6cf1fc20, + 0x1ab90: 0x6d378e20, 0x1ab91: 0x6cabb020, 0x1ab92: 0x6c323220, 0x1ab93: 0x6c617e20, + 0x1ab94: 0x6c792820, 0x1ab95: 0x6d381220, 0x1ab96: 0x6d108a20, 0x1ab97: 0x6c6cd420, + 0x1ab98: 0x6d277e20, 0x1ab99: 0x6c9eaa20, 0x1ab9a: 0x6c3d1e20, 0x1ab9b: 0x6c1ca420, + 0x1ab9c: 0x6d267a20, 0x1ab9d: 0x6d3c0a20, 0x1ab9e: 0x6ca96220, 0x1ab9f: 0x6d0e3a20, + 0x1aba0: 0x6ca30620, 0x1aba1: 0x6d02a820, 0x1aba2: 0x6c3b5220, 0x1aba3: 0x6c08ba20, + 0x1aba4: 0x6d20ae20, 0x1aba5: 0x6ceb6e20, 0x1aba6: 0x6c3c1820, 0x1aba7: 0x6ced7220, + 0x1aba8: 0x6c39a220, 0x1aba9: 0x6cf41e20, 0x1abaa: 0x6d22cc20, 0x1abab: 0x6c4a3620, + 0x1abac: 0x6c323a20, 0x1abad: 0x6c036420, 0x1abae: 0x6ca5b420, 0x1abaf: 0x6d38cc20, + 0x1abb0: 0x6d3d2c20, 0x1abb1: 0x6d2f5620, 0x1abb2: 0x6c267c20, 0x1abb3: 0x6ca39820, + 0x1abb4: 0x6d25fe20, 0x1abb5: 0x6ce80820, 0x1abb6: 0x6cfb2a20, 0x1abb7: 0x6d343c20, + 0x1abb8: 0x6c353020, 0x1abb9: 0x6c9a7420, 0x1abba: 0x6ca0c620, 0x1abbb: 0x6cb4d020, + 0x1abbc: 0x6c092a20, 0x1abbd: 0x6ccfaa20, 0x1abbe: 0x6cbc9420, 0x1abbf: 0x6c353220, + // Block 0x6af, offset 0x1abc0 + 0x1abc0: 0x6c50c420, 0x1abc1: 0x6d062c20, 0x1abc2: 0x6c37f820, 0x1abc3: 0x6d328420, + 0x1abc4: 0x6c9f2820, 0x1abc5: 0x6c04e620, 0x1abc6: 0x6ca22820, 0x1abc7: 0x6c3d3e20, + 0x1abc8: 0x6c8ca420, 0x1abc9: 0x6d3ee220, 0x1abca: 0x6d3ee420, 0x1abcb: 0x6cd2b420, + 0x1abcc: 0x6cc4ac20, 0x1abcd: 0x6cccc020, 0x1abce: 0x6d0f4620, 0x1abcf: 0x6c975c20, + 0x1abd0: 0x6c6c1620, 0x1abd1: 0x6c46ee20, 0x1abd2: 0x6cd88020, 0x1abd3: 0x6d041420, + 0x1abd4: 0x6cef8e20, 0x1abd5: 0x6d3e0c20, 0x1abd6: 0x6c71f620, 0x1abd7: 0x6cccc220, + 0x1abd8: 0x6cb1e820, 0x1abd9: 0x6cc5d420, 0x1abda: 0x6d10d620, 0x1abdb: 0x6c305820, + 0x1abdc: 0x6c674c20, 0x1abdd: 0x6cd4b020, 0x1abde: 0x6c5ff020, 0x1abdf: 0x6c40e620, + 0x1abe0: 0x6cfe1c20, 0x1abe1: 0x6c572a20, 0x1abe2: 0x6c72da20, 0x1abe3: 0x6c682c20, + 0x1abe4: 0x6c469c20, 0x1abe5: 0x6c81a220, 0x1abe6: 0x6c647420, 0x1abe7: 0x6c647620, + 0x1abe8: 0x6d148c20, 0x1abe9: 0x6ca75c20, 0x1abea: 0x6d344220, 0x1abeb: 0x6c5e9820, + 0x1abec: 0x6c5ea220, 0x1abed: 0x6cfc8a20, 0x1abee: 0x6c525620, 0x1abef: 0x6c49de20, + 0x1abf0: 0x6c756020, 0x1abf1: 0x6c7ac020, 0x1abf2: 0x6d0e4420, 0x1abf3: 0x6ca02c20, + 0x1abf4: 0x6c8ad020, 0x1abf5: 0x6cae0a20, 0x1abf6: 0x6c35ee20, 0x1abf7: 0x6d202220, + 0x1abf8: 0x6d0c6e20, 0x1abf9: 0x6c143420, 0x1abfa: 0x6ccfb820, 0x1abfb: 0x6d19ae20, + 0x1abfc: 0x6cd24e20, 0x1abfd: 0x6c4ad220, 0x1abfe: 0x6cc2be20, 0x1abff: 0x6d3e0e20, + // Block 0x6b0, offset 0x1ac00 + 0x1ac00: 0x6cd90820, 0x1ac01: 0x6cee6820, 0x1ac02: 0x6c530e20, 0x1ac03: 0x6cec0420, + 0x1ac04: 0x6c907e20, 0x1ac05: 0x6d0b8420, 0x1ac06: 0x6cc52020, 0x1ac07: 0x6c682e20, + 0x1ac08: 0x6c942e20, 0x1ac09: 0x6cb24e20, 0x1ac0a: 0x6cfc9e20, 0x1ac0b: 0x6cced020, + 0x1ac0c: 0x6c850820, 0x1ac0d: 0x6c19c820, 0x1ac0e: 0x6d017a20, 0x1ac0f: 0x6c984a20, + 0x1ac10: 0x6c3d5c20, 0x1ac11: 0x6cdd1020, 0x1ac12: 0x6c99e420, 0x1ac13: 0x6cef9c20, + 0x1ac14: 0x6c789420, 0x1ac15: 0x6c21ae20, 0x1ac16: 0x6c21b020, 0x1ac17: 0x6ce6b820, + 0x1ac18: 0x6ca78820, 0x1ac19: 0x6d03da20, 0x1ac1a: 0x6ca3ee20, 0x1ac1b: 0x6d20ec20, + 0x1ac1c: 0x6ca31a20, 0x1ac1d: 0x6cb3c820, 0x1ac1e: 0x6ca56820, 0x1ac1f: 0x6c72e220, + 0x1ac20: 0x6ccfc620, 0x1ac21: 0x6d35ae20, 0x1ac22: 0x6c4df020, 0x1ac23: 0x6c2c2c20, + 0x1ac24: 0x6d3c1020, 0x1ac25: 0x6c355220, 0x1ac26: 0x6cb20820, 0x1ac27: 0x6ce9f820, + 0x1ac28: 0x6cfca020, 0x1ac29: 0x6c9e1020, 0x1ac2a: 0x6cf3ae20, 0x1ac2b: 0x6d0c7020, + 0x1ac2c: 0x6cf44220, 0x1ac2d: 0x6c001e20, 0x1ac2e: 0x6d0c7c20, 0x1ac2f: 0x6d20ee20, + 0x1ac30: 0x6cd89a20, 0x1ac31: 0x6d20f020, 0x1ac32: 0x6cebd020, 0x1ac33: 0x6c87de20, + 0x1ac34: 0x6cfb3a20, 0x1ac35: 0x6c707c20, 0x1ac36: 0x6cc24220, 0x1ac37: 0x6d3c8020, + 0x1ac38: 0x6cb4e220, 0x1ac39: 0x6cfb4020, 0x1ac3a: 0x6d3d4820, 0x1ac3b: 0x6c2ff020, + 0x1ac3c: 0x6c166420, 0x1ac3d: 0x6c923420, 0x1ac3e: 0x6c006420, 0x1ac3f: 0x6c353620, + // Block 0x6b1, offset 0x1ac40 + 0x1ac40: 0x6c353820, 0x1ac41: 0x6c908620, 0x1ac42: 0x6c9dbe20, 0x1ac43: 0x6c239020, + 0x1ac44: 0x6cb3f020, 0x1ac45: 0x6c710e20, 0x1ac46: 0x6cb32820, 0x1ac47: 0x6c10f620, + 0x1ac48: 0x6c8cde20, 0x1ac49: 0x6ced0020, 0x1ac4a: 0x6c0c7220, 0x1ac4b: 0x6cfeb020, + 0x1ac4c: 0x6cd52620, 0x1ac4d: 0x6cb6f020, 0x1ac4e: 0x6c5ab020, 0x1ac4f: 0x6c394020, + 0x1ac50: 0x6cf2b220, 0x1ac51: 0x6cc89820, 0x1ac52: 0x6cdfda20, 0x1ac53: 0x6c39f820, + 0x1ac54: 0x6c3b0420, 0x1ac55: 0x6c6aae20, 0x1ac56: 0x6ce46020, 0x1ac57: 0x6ca5d620, + 0x1ac58: 0x6cc2d820, 0x1ac59: 0x6c6e5820, 0x1ac5a: 0x6c5cbc20, 0x1ac5b: 0x6c6da420, + 0x1ac5c: 0x6cb8d220, 0x1ac5d: 0x6c2d4c20, 0x1ac5e: 0x6d042620, 0x1ac5f: 0x6c568a20, + 0x1ac60: 0x6cec8820, 0x1ac61: 0x6c7ef220, 0x1ac62: 0x6c097420, 0x1ac63: 0x6d19dc20, + 0x1ac64: 0x6c1d6820, 0x1ac65: 0x6ca52e20, 0x1ac66: 0x6c3fe420, 0x1ac67: 0x6c6e6e20, + 0x1ac68: 0x6c94ec20, 0x1ac69: 0x6c01b820, 0x1ac6a: 0x6c7f9420, 0x1ac6b: 0x6c7d5220, + 0x1ac6c: 0x6d1a5220, 0x1ac6d: 0x6d0b9220, 0x1ac6e: 0x6c707e20, 0x1ac6f: 0x6c85e820, + 0x1ac70: 0x6c2d1220, 0x1ac71: 0x6cfb4220, 0x1ac72: 0x6c57da20, 0x1ac73: 0x6c579220, + 0x1ac74: 0x6d1bac20, 0x1ac75: 0x6c14ee20, 0x1ac76: 0x6cd05a20, 0x1ac77: 0x6ce66e20, + 0x1ac78: 0x6c296420, 0x1ac79: 0x6d11ac20, 0x1ac7a: 0x6cf4e620, 0x1ac7b: 0x6ca44820, + 0x1ac7c: 0x6c21b220, 0x1ac7d: 0x6c641420, 0x1ac7e: 0x6ce7d820, 0x1ac7f: 0x6d06d220, + // Block 0x6b2, offset 0x1ac80 + 0x1ac80: 0x6d233020, 0x1ac81: 0x6cef0a20, 0x1ac82: 0x6c2c5420, 0x1ac83: 0x6cc74820, + 0x1ac84: 0x6c9a5620, 0x1ac85: 0x6c27de20, 0x1ac86: 0x6cc86220, 0x1ac87: 0x6cbd2c20, + 0x1ac88: 0x6c5ab220, 0x1ac89: 0x6cf2ea20, 0x1ac8a: 0x6cb99420, 0x1ac8b: 0x6c210820, + 0x1ac8c: 0x6c9e7420, 0x1ac8d: 0x6c3fec20, 0x1ac8e: 0x6c6b9620, 0x1ac8f: 0x6c329820, + 0x1ac90: 0x6d151420, 0x1ac91: 0x6d382a20, 0x1ac92: 0x6c99f820, 0x1ac93: 0x6c59be20, + 0x1ac94: 0x6c9dc220, 0x1ac95: 0x6c013020, 0x1ac96: 0x6d1bae20, 0x1ac97: 0x6d079420, + 0x1ac98: 0x6c6a0e20, 0x1ac99: 0x6cee8220, 0x1ac9a: 0x6c9a8e20, 0x1ac9b: 0x6d261620, + 0x1ac9c: 0x6d32c220, 0x1ac9d: 0x6cbfae20, 0x1ac9e: 0x6cd37a20, 0x1ac9f: 0x6d01a820, + 0x1aca0: 0x6ceb7c20, 0x1aca1: 0x6c88f620, 0x1aca2: 0x6c997820, 0x1aca3: 0x6cc4c420, + 0x1aca4: 0x6cd7e620, 0x1aca5: 0x6cb0f220, 0x1aca6: 0x6cf08e20, 0x1aca7: 0x6cebd820, + 0x1aca8: 0x6c6ff420, 0x1aca9: 0x6c555620, 0x1acaa: 0x6c02a620, 0x1acab: 0x6cbd1420, + 0x1acac: 0x6c05fe20, 0x1acad: 0x6d059220, 0x1acae: 0x6ce7da20, 0x1acaf: 0x6c4a6420, + 0x1acb0: 0x6c1e8a20, 0x1acb1: 0x6d110620, 0x1acb2: 0x6cb09e20, 0x1acb3: 0x6cf78420, + 0x1acb4: 0x6d257a20, 0x1acb5: 0x6d1d4020, 0x1acb6: 0x6cc67020, 0x1acb7: 0x6cc81a20, + 0x1acb8: 0x6c1ab620, 0x1acb9: 0x6c8e6620, 0x1acba: 0x6c9a5e20, 0x1acbb: 0x6cac5c20, + 0x1acbc: 0x6c02a820, 0x1acbd: 0x6c966020, 0x1acbe: 0x6c46ae20, 0x1acbf: 0x6c7cf620, + // Block 0x6b3, offset 0x1acc0 + 0x1acc0: 0x6cbd8020, 0x1acc1: 0x6c644820, 0x1acc2: 0x6ccae420, 0x1acc3: 0x6d315e20, + 0x1acc4: 0x6d257c20, 0x1acc5: 0x6c6a1020, 0x1acc6: 0x6cc68020, 0x1acc7: 0x6ca00420, + 0x1acc8: 0x6d1bc220, 0x1acc9: 0x6c604c20, 0x1acca: 0x6cdac820, 0x1accb: 0x6ca79c20, + 0x1accc: 0x6cfb6c20, 0x1accd: 0x6ce1ce20, 0x1acce: 0x6cad0020, 0x1accf: 0x6c80b220, + 0x1acd0: 0x6ca4fc20, 0x1acd1: 0x6c05ca20, 0x1acd2: 0x6c00a620, 0x1acd3: 0x6cb0a020, + 0x1acd4: 0x6cb20e20, 0x1acd5: 0x6d182020, 0x1acd6: 0x6cb17e20, 0x1acd7: 0x6d238a20, + 0x1acd8: 0x6c824220, 0x1acd9: 0x6d081820, 0x1acda: 0x6c975820, 0x1acdb: 0x6d140020, + 0x1acdc: 0x6d2ec220, 0x1acdd: 0x6c773820, 0x1acde: 0x6d1d9820, 0x1acdf: 0x6ca6a820, + 0x1ace0: 0x6c840e20, 0x1ace1: 0x6c2b7a20, 0x1ace2: 0x6c4a7820, 0x1ace3: 0x6d0c1a20, + 0x1ace4: 0x6c6c9c20, 0x1ace5: 0x6d3b8420, 0x1ace6: 0x6c16b820, 0x1ace7: 0x6d2ada20, + 0x1ace8: 0x6c4dac20, 0x1ace9: 0x6ca59c20, 0x1acea: 0x6c81d820, 0x1aceb: 0x6ca05c20, + 0x1acec: 0x6d300220, 0x1aced: 0x6c56ae20, 0x1acee: 0x6c56b020, 0x1acef: 0x6c02d620, + 0x1acf0: 0x6ca59e20, 0x1acf1: 0x6cbb1220, 0x1acf2: 0x6c96f620, 0x1acf3: 0x6cb1e420, + 0x1acf4: 0x6c472a20, 0x1acf5: 0x6cf46020, 0x1acf6: 0x6cbbea20, 0x1acf7: 0x6ceb8820, + 0x1acf8: 0x6d2e1020, 0x1acf9: 0x6c98f020, 0x1acfa: 0x6cfb7820, 0x1acfb: 0x6cfb7a20, + 0x1acfc: 0x6ca14a20, 0x1acfd: 0x6c8a0420, 0x1acfe: 0x6c883020, 0x1acff: 0x6c57b820, + // Block 0x6b4, offset 0x1ad00 + 0x1ad00: 0x6c4a8420, 0x1ad01: 0x6c2aa620, 0x1ad02: 0x6d348c20, 0x1ad03: 0x6d05ce20, + 0x1ad04: 0x6d140a20, 0x1ad05: 0x6c579c20, 0x1ad06: 0x6cf69220, 0x1ad07: 0x6c7d0a20, + 0x1ad08: 0x6cc52820, 0x1ad09: 0x6cf69420, 0x1ad0a: 0x6d0ea020, 0x1ad0b: 0x6c151820, + 0x1ad0c: 0x6c686420, 0x1ad0d: 0x6c9a6620, 0x1ad0e: 0x6c396820, 0x1ad0f: 0x6c385620, + 0x1ad10: 0x6cfad420, 0x1ad11: 0x6d188620, 0x1ad12: 0x6c5c2a20, 0x1ad13: 0x6c69c420, + 0x1ad14: 0x6c405220, 0x1ad15: 0x6cd3d820, 0x1ad16: 0x6c0a4620, 0x1ad17: 0x6ccda420, + 0x1ad18: 0x6cdc5a20, 0x1ad19: 0x6cbb2020, 0x1ad1a: 0x6c88c820, 0x1ad1b: 0x6c589420, + 0x1ad1c: 0x6d02ec20, 0x1ad1d: 0x6ca7aa20, 0x1ad1e: 0x6c303420, 0x1ad1f: 0x6d188820, + 0x1ad20: 0x6c117020, 0x1ad21: 0x6c00c820, 0x1ad22: 0x6ca77820, 0x1ad23: 0x6ca92220, + 0x1ad24: 0x6c966420, 0x1ad25: 0x6ce5ce20, 0x1ad26: 0x6c1de220, 0x1ad27: 0x6c6d5820, + 0x1ad28: 0x6c226820, 0x1ad29: 0x6d219e20, 0x1ad2a: 0x6cb21620, 0x1ad2b: 0x6cc6be20, + 0x1ad2c: 0x6cc7ce20, 0x1ad2d: 0x6ca3a820, 0x1ad2e: 0x6d0c3220, 0x1ad2f: 0x6cdf4620, + 0x1ad30: 0x6d1bfc20, 0x1ad31: 0x6c11b620, 0x1ad32: 0x6ca7b220, 0x1ad33: 0x6d26ea20, + 0x1ad34: 0x6d1c9620, 0x1ad35: 0x6c9dd620, 0x1ad36: 0x6c0ae620, 0x1ad37: 0x6c966620, + 0x1ad38: 0x6cd08020, 0x1ad39: 0x6d043e20, 0x1ad3a: 0x6ca6d420, 0x1ad3b: 0x6c31c820, + 0x1ad3c: 0x6c8f2020, 0x1ad3d: 0x6d251c20, 0x1ad3e: 0x6c804820, 0x1ad3f: 0x6d0ee820, + // Block 0x6b5, offset 0x1ad40 + 0x1ad40: 0x6cd6a820, 0x1ad41: 0x6c8d8c20, 0x1ad42: 0x6c696620, 0x1ad43: 0x6ca77a20, + 0x1ad44: 0x6c804c20, 0x1ad45: 0x6cb94420, 0x1ad46: 0x6d1c1a20, 0x1ad47: 0x6cd6ae20, + 0x1ad48: 0x6c5c9020, 0x1ad49: 0x6cc32620, 0x1ad4a: 0x6c9d0a20, 0x1ad4b: 0x6c84b820, + 0x1ad4c: 0x6c944e20, 0x1ad4d: 0x6d0d0e20, 0x1ad4e: 0x6d3a4020, 0x1ad4f: 0x6c805820, + 0x1ad50: 0x6d3f6820, 0x1ad51: 0x6c6a5220, 0x1ad52: 0x6c73c420, 0x1ad53: 0x6c73c620, + 0x1ad54: 0x6c799220, 0x1ad55: 0x6d281220, 0x1ad56: 0x6c965e20, 0x1ad57: 0x6d3f2820, + 0x1ad58: 0x6c25a020, 0x1ad59: 0x6cdcca20, 0x1ad5a: 0x6c3dd620, 0x1ad5b: 0x6c06d620, + 0x1ad5c: 0x6d3e0020, 0x1ad5d: 0x6cffcc20, 0x1ad5e: 0x6d031a20, 0x1ad5f: 0x6c9bfe20, + 0x1ad60: 0x6cd88c20, 0x1ad61: 0x6cdf0220, 0x1ad62: 0x6c05a420, 0x1ad63: 0x6c619220, + 0x1ad64: 0x6c46f020, 0x1ad65: 0x6caa3c20, 0x1ad66: 0x6d08f820, 0x1ad67: 0x6d206a20, + 0x1ad68: 0x6d3ba220, 0x1ad69: 0x6c4d1e20, 0x1ad6a: 0x6c943020, 0x1ad6b: 0x6cdcd020, + 0x1ad6c: 0x6ca48e20, 0x1ad6d: 0x6c9ec420, 0x1ad6e: 0x6c239220, 0x1ad6f: 0x6cb8d420, + 0x1ad70: 0x6cd52820, 0x1ad71: 0x6c11f620, 0x1ad72: 0x6d0aea20, 0x1ad73: 0x6d3e3420, + 0x1ad74: 0x6ca63e20, 0x1ad75: 0x6c3d8820, 0x1ad76: 0x6d3e4e20, 0x1ad77: 0x6c841020, + 0x1ad78: 0x6d091820, 0x1ad79: 0x6c0ff620, 0x1ad7a: 0x6cc7d020, 0x1ad7b: 0x6ca38820, + 0x1ad7c: 0x6ca89020, 0x1ad7d: 0x6ca89220, 0x1ad7e: 0x6d1c1c20, 0x1ad7f: 0x6c945020, + // Block 0x6b6, offset 0x1ad80 + 0x1ad80: 0x6c9db620, 0x1ad81: 0x6ca8f220, 0x1ad82: 0x6cc6ee20, 0x1ad83: 0x6cdddc20, + 0x1ad84: 0x6c4ab820, 0x1ad85: 0x6d2d1820, 0x1ad86: 0x6cbef820, 0x1ad87: 0x6d221620, + 0x1ad88: 0x6cd43a20, 0x1ad89: 0x6c011220, 0x1ad8a: 0x6ce83820, 0x1ad8b: 0x6cd97e20, + 0x1ad8c: 0x6cecc020, 0x1ad8d: 0x6cc78420, 0x1ad8e: 0x6d118220, 0x1ad8f: 0x6c52f220, + 0x1ad90: 0x6d145e20, 0x1ad91: 0x6c6e0c20, 0x1ad92: 0x6d3cc820, 0x1ad93: 0x6c9d2220, + 0x1ad94: 0x6d3a5820, 0x1ad95: 0x6c295620, 0x1ad96: 0x6c530020, 0x1ad97: 0x6d3f7020, + 0x1ad98: 0x6c490420, 0x1ad99: 0x6d38fe20, 0x1ad9a: 0x6c2f9620, 0x1ad9b: 0x6cecee20, + 0x1ad9c: 0x6d198e20, 0x1ad9d: 0x6c05e220, 0x1ad9e: 0x6cd24220, 0x1ad9f: 0x6cd24420, + 0x1ada0: 0x6c1d3620, 0x1ada1: 0x6cd04620, 0x1ada2: 0x6c788c20, 0x1ada3: 0x6d078220, + 0x1ada4: 0x6cd32c20, 0x1ada5: 0x6d202420, 0x1ada6: 0x6c58fa20, 0x1ada7: 0x6d14b820, + 0x1ada8: 0x6ce5b820, 0x1ada9: 0x6cd2be20, 0x1adaa: 0x6cfc8c20, 0x1adab: 0x6c456e20, + 0x1adac: 0x6c19ca20, 0x1adad: 0x6cc44220, 0x1adae: 0x6c457a20, 0x1adaf: 0x6cfe9420, + 0x1adb0: 0x6d291220, 0x1adb1: 0x6d2cba20, 0x1adb2: 0x6c05f020, 0x1adb3: 0x6c4d5e20, + 0x1adb4: 0x6d0e4e20, 0x1adb5: 0x6cfe9620, 0x1adb6: 0x6c634020, 0x1adb7: 0x6cd05020, + 0x1adb8: 0x6c18ae20, 0x1adb9: 0x6cc66020, 0x1adba: 0x6c5a4c20, 0x1adbb: 0x6c9d3020, + 0x1adbc: 0x6c79e020, 0x1adbd: 0x6c7b5220, 0x1adbe: 0x6c0d2e20, 0x1adbf: 0x6cdaa020, + // Block 0x6b7, offset 0x1adc0 + 0x1adc0: 0x6c112420, 0x1adc1: 0x6d296620, 0x1adc2: 0x6c61de20, 0x1adc3: 0x6d24da20, + 0x1adc4: 0x6c61e020, 0x1adc5: 0x6d1a5420, 0x1adc6: 0x6c9d3620, 0x1adc7: 0x6c79e620, + 0x1adc8: 0x6cbe4220, 0x1adc9: 0x6cc3b420, 0x1adca: 0x6d315620, 0x1adcb: 0x6c668820, + 0x1adcc: 0x6c3fee20, 0x1adcd: 0x6ca90420, 0x1adce: 0x6c0e1e20, 0x1adcf: 0x6c587420, + 0x1add0: 0x6c9a9020, 0x1add1: 0x6cbdd620, 0x1add2: 0x6c4e0c20, 0x1add3: 0x6d233220, + 0x1add4: 0x6cd26620, 0x1add5: 0x6ca90620, 0x1add6: 0x6c6d1020, 0x1add7: 0x6ca90a20, + 0x1add8: 0x6d365020, 0x1add9: 0x6d226820, 0x1adda: 0x6c060220, 0x1addb: 0x6c7b5620, + 0x1addc: 0x6ca90c20, 0x1addd: 0x6cbddc20, 0x1adde: 0x6ca12820, 0x1addf: 0x6c13f220, + 0x1ade0: 0x6c726020, 0x1ade1: 0x6c489c20, 0x1ade2: 0x6cbde220, 0x1ade3: 0x6c54e420, + 0x1ade4: 0x6cf50a20, 0x1ade5: 0x6c89f020, 0x1ade6: 0x6cd27a20, 0x1ade7: 0x6ca91020, + 0x1ade8: 0x6d2d4620, 0x1ade9: 0x6cd06820, 0x1adea: 0x6ceffc20, 0x1adeb: 0x6d014820, + 0x1adec: 0x6c7b5820, 0x1aded: 0x6c5c0e20, 0x1adee: 0x6c8a0620, 0x1adef: 0x6c75e220, + 0x1adf0: 0x6c589620, 0x1adf1: 0x6d18c020, 0x1adf2: 0x6d156a20, 0x1adf3: 0x6c061c20, + 0x1adf4: 0x6cbd4a20, 0x1adf5: 0x6c1d4620, 0x1adf6: 0x6c062020, 0x1adf7: 0x6c3c7c20, + 0x1adf8: 0x6c25b020, 0x1adf9: 0x6c332c20, 0x1adfa: 0x6cd87820, 0x1adfb: 0x6d09d420, + 0x1adfc: 0x6c29ce20, 0x1adfd: 0x6c93ca20, 0x1adfe: 0x6c333620, 0x1adff: 0x6cd45020, + // Block 0x6b8, offset 0x1ae00 + 0x1ae00: 0x6cb34a20, 0x1ae01: 0x6c3c2420, 0x1ae02: 0x6d3b7420, 0x1ae03: 0x6c3d5e20, + 0x1ae04: 0x6ccf3a20, 0x1ae05: 0x6c789620, 0x1ae06: 0x6c674e20, 0x1ae07: 0x6c675c20, + 0x1ae08: 0x6d3b7a20, 0x1ae09: 0x6cf08420, 0x1ae0a: 0x6d41e820, 0x1ae0b: 0x6d0a0c20, + 0x1ae0c: 0x6cd5d220, 0x1ae0d: 0x6c335420, 0x1ae0e: 0x6c29e820, 0x1ae0f: 0x6cffa220, + 0x1ae10: 0x6c6a5420, 0x1ae11: 0x6cceac20, 0x1ae12: 0x6c377e20, 0x1ae13: 0x6c378020, + 0x1ae14: 0x6c378220, 0x1ae15: 0x6c40d020, 0x1ae16: 0x6c645e20, 0x1ae17: 0x6cd49a20, + 0x1ae18: 0x6c189220, 0x1ae19: 0x6cce4a20, 0x1ae1a: 0x6cce4c20, 0x1ae1b: 0x6ca1b420, + 0x1ae1c: 0x6c40c620, 0x1ae1d: 0x6c169e20, 0x1ae1e: 0x6c8a9a20, 0x1ae1f: 0x6cfc1020, + 0x1ae20: 0x6cfc1220, 0x1ae21: 0x6c7dde20, 0x1ae22: 0x6d1edc20, 0x1ae23: 0x6cedbc20, + 0x1ae24: 0x6d1ede20, 0x1ae25: 0x6c8a8c20, 0x1ae26: 0x6c8a8e20, 0x1ae27: 0x6d10ca20, + 0x1ae28: 0x6c983020, 0x1ae29: 0x6cedc620, 0x1ae2a: 0x6cedc020, 0x1ae2b: 0x6cedc220, + 0x1ae2c: 0x6c40d420, 0x1ae2d: 0x6d10cc20, 0x1ae2e: 0x6c34d620, 0x1ae2f: 0x6c7cec20, + 0x1ae30: 0x6d37f020, 0x1ae31: 0x6c6ff620, 0x1ae32: 0x6c419c20, 0x1ae33: 0x6c478820, + 0x1ae34: 0x6c419e20, 0x1ae35: 0x6ce9b420, 0x1ae36: 0x6c41b620, 0x1ae37: 0x6c41b820, + 0x1ae38: 0x6cd18a20, 0x1ae39: 0x6d1ac220, 0x1ae3a: 0x6c1b7020, 0x1ae3b: 0x6c779020, + 0x1ae3c: 0x6ca5b620, 0x1ae3d: 0x6c6c8020, 0x1ae3e: 0x6cef8620, 0x1ae3f: 0x6ca7d020, + // Block 0x6b9, offset 0x1ae40 + 0x1ae40: 0x6c70f020, 0x1ae41: 0x6cb08620, 0x1ae42: 0x6c134e20, 0x1ae43: 0x6cf83c20, + 0x1ae44: 0x6c086c20, 0x1ae45: 0x6c705620, 0x1ae46: 0x6c6bbe20, 0x1ae47: 0x6ce48020, + 0x1ae48: 0x6cc0dc20, 0x1ae49: 0x6ce44c20, 0x1ae4a: 0x6c6bc020, 0x1ae4b: 0x6cf35620, + 0x1ae4c: 0x6c2dfa20, 0x1ae4d: 0x6cd1a220, 0x1ae4e: 0x6cd2c020, 0x1ae4f: 0x6cb28020, + 0x1ae50: 0x6c5ea420, 0x1ae51: 0x6d017c20, 0x1ae52: 0x6d31c620, 0x1ae53: 0x6d017e20, + 0x1ae54: 0x6ca5ca20, 0x1ae55: 0x6d2de020, 0x1ae56: 0x6cf5ba20, 0x1ae57: 0x6cef9e20, + 0x1ae58: 0x6c97b420, 0x1ae59: 0x6c353a20, 0x1ae5a: 0x6c910620, 0x1ae5b: 0x6cb29820, + 0x1ae5c: 0x6ce44e20, 0x1ae5d: 0x6c3aa420, 0x1ae5e: 0x6cd55820, 0x1ae5f: 0x6d01aa20, + 0x1ae60: 0x6ce8a020, 0x1ae61: 0x6c939a20, 0x1ae62: 0x6c93a620, 0x1ae63: 0x6cf7f820, + 0x1ae64: 0x6c135420, 0x1ae65: 0x6c93ae20, 0x1ae66: 0x6c727820, 0x1ae67: 0x6d01f620, + 0x1ae68: 0x6c72a420, 0x1ae69: 0x6c73ba20, 0x1ae6a: 0x6c8a3020, 0x1ae6b: 0x6c74e620, + 0x1ae6c: 0x6cd58820, 0x1ae6d: 0x6cf93a20, 0x1ae6e: 0x6c17fa20, 0x1ae6f: 0x6cea3620, + 0x1ae70: 0x6ca67420, 0x1ae71: 0x6cccb020, 0x1ae72: 0x6cec4820, 0x1ae73: 0x6cfa6c20, + 0x1ae74: 0x6c856820, 0x1ae75: 0x6c35c620, 0x1ae76: 0x6c2a5420, 0x1ae77: 0x6c5ca820, + 0x1ae78: 0x6c8f6820, 0x1ae79: 0x6d165c20, 0x1ae7a: 0x6cb6ca20, 0x1ae7b: 0x6cc5b020, + 0x1ae7c: 0x6cf49e20, 0x1ae7d: 0x6c4e8020, 0x1ae7e: 0x6ccf9c20, 0x1ae7f: 0x6d221820, + // Block 0x6ba, offset 0x1ae80 + 0x1ae80: 0x6c1e5220, 0x1ae81: 0x6cdc1e20, 0x1ae82: 0x6cb6cc20, 0x1ae83: 0x6cc5b220, + 0x1ae84: 0x6d267c20, 0x1ae85: 0x6c04b820, 0x1ae86: 0x6d118420, 0x1ae87: 0x6c01f220, + 0x1ae88: 0x6d0b0e20, 0x1ae89: 0x6cf4a620, 0x1ae8a: 0x6c6a6e20, 0x1ae8b: 0x6c35cc20, + 0x1ae8c: 0x6c5fc620, 0x1ae8d: 0x6cb8a420, 0x1ae8e: 0x6c3b5420, 0x1ae8f: 0x6cecc420, + 0x1ae90: 0x6cb57020, 0x1ae91: 0x6c132820, 0x1ae92: 0x6cb96a20, 0x1ae93: 0x6cb57220, + 0x1ae94: 0x6c142e20, 0x1ae95: 0x6c6bb020, 0x1ae96: 0x6cc0d020, 0x1ae97: 0x6c429820, + 0x1ae98: 0x6cfc7a20, 0x1ae99: 0x6c02c020, 0x1ae9a: 0x6c7f8a20, 0x1ae9b: 0x6c29d020, + 0x1ae9c: 0x6c031a20, 0x1ae9d: 0x6d427c20, 0x1ae9e: 0x6d427e20, 0x1ae9f: 0x6d100220, + 0x1aea0: 0x6c71f820, 0x1aea1: 0x6c425c20, 0x1aea2: 0x6c785820, 0x1aea3: 0x6c466e20, + 0x1aea4: 0x6d08fa20, 0x1aea5: 0x6cb2fa20, 0x1aea6: 0x6c858a20, 0x1aea7: 0x6ce56e20, + 0x1aea8: 0x6cc0e020, 0x1aea9: 0x6d0c6220, 0x1aeaa: 0x6c3de420, 0x1aeab: 0x6d052e20, + 0x1aeac: 0x6c640020, 0x1aead: 0x6c8e0a20, 0x1aeae: 0x6ceaec20, 0x1aeaf: 0x6cafb220, + 0x1aeb0: 0x6c02c820, 0x1aeb1: 0x6c273020, 0x1aeb2: 0x6c7be020, 0x1aeb3: 0x6d268620, + 0x1aeb4: 0x6cc0e220, 0x1aeb5: 0x6c566220, 0x1aeb6: 0x6cb36620, 0x1aeb7: 0x6c9f2a20, + 0x1aeb8: 0x6c01a220, 0x1aeb9: 0x6ce57020, 0x1aeba: 0x6c8ca620, 0x1aebb: 0x6c1b0620, + 0x1aebc: 0x6cb2ea20, 0x1aebd: 0x6c2fde20, 0x1aebe: 0x6c4e8c20, 0x1aebf: 0x6c7c3420, + // Block 0x6bb, offset 0x1aec0 + 0x1aec0: 0x6d053020, 0x1aec1: 0x6c992a20, 0x1aec2: 0x6ce71420, 0x1aec3: 0x6d08fc20, + 0x1aec4: 0x6d16ae20, 0x1aec5: 0x6c0be220, 0x1aec6: 0x6c50d220, 0x1aec7: 0x6c032c20, + 0x1aec8: 0x6c95e620, 0x1aec9: 0x6c35f020, 0x1aeca: 0x6c3fc220, 0x1aecb: 0x6d09e420, + 0x1aecc: 0x6c2e6c20, 0x1aecd: 0x6c921e20, 0x1aece: 0x6c371e20, 0x1aecf: 0x6c373c20, + 0x1aed0: 0x6c40e820, 0x1aed1: 0x6cc28c20, 0x1aed2: 0x6c305a20, 0x1aed3: 0x6d149420, + 0x1aed4: 0x6ca22e20, 0x1aed5: 0x6cd25020, 0x1aed6: 0x6c011a20, 0x1aed7: 0x6ceee820, + 0x1aed8: 0x6c586220, 0x1aed9: 0x6d359620, 0x1aeda: 0x6c9d2c20, 0x1aedb: 0x6c850220, + 0x1aedc: 0x6c61a420, 0x1aedd: 0x6ce72220, 0x1aede: 0x6ceeea20, 0x1aedf: 0x6d202620, + 0x1aee0: 0x6c483420, 0x1aee1: 0x6cf99420, 0x1aee2: 0x6c850420, 0x1aee3: 0x6d10d820, + 0x1aee4: 0x6c698620, 0x1aee5: 0x6d329420, 0x1aee6: 0x6c943220, 0x1aee7: 0x6c683020, + 0x1aee8: 0x6c355420, 0x1aee9: 0x6c355620, 0x1aeea: 0x6d22ee20, 0x1aeeb: 0x6d007a20, + 0x1aeec: 0x6c100e20, 0x1aeed: 0x6cbc3620, 0x1aeee: 0x6cc43420, 0x1aeef: 0x6c3c3220, + 0x1aef0: 0x6c3c3420, 0x1aef1: 0x6ca4a220, 0x1aef2: 0x6c850a20, 0x1aef3: 0x6d1f1420, + 0x1aef4: 0x6cfca220, 0x1aef5: 0x6c532820, 0x1aef6: 0x6c29d220, 0x1aef7: 0x6ccfc820, + 0x1aef8: 0x6c19cc20, 0x1aef9: 0x6ce88e20, 0x1aefa: 0x6c44f620, 0x1aefb: 0x6c75a220, + 0x1aefc: 0x6c502620, 0x1aefd: 0x6cf9a020, 0x1aefe: 0x6d1a4620, 0x1aeff: 0x6d223a20, + // Block 0x6bc, offset 0x1af00 + 0x1af00: 0x6c811620, 0x1af01: 0x6c770820, 0x1af02: 0x6c814e20, 0x1af03: 0x6c7ee820, + 0x1af04: 0x6cfbf220, 0x1af05: 0x6cc3aa20, 0x1af06: 0x6c797020, 0x1af07: 0x6c1d1020, + 0x1af08: 0x6c1d1220, 0x1af09: 0x6cde4620, 0x1af0a: 0x6c8bac20, 0x1af0b: 0x6c578a20, + 0x1af0c: 0x6c708420, 0x1af0d: 0x6c7ef420, 0x1af0e: 0x6cb5be20, 0x1af0f: 0x6c9f4420, + 0x1af10: 0x6c7d5420, 0x1af11: 0x6c7d5620, 0x1af12: 0x6d40b420, 0x1af13: 0x6c480a20, + 0x1af14: 0x6c24c820, 0x1af15: 0x6d0b2620, 0x1af16: 0x6d0b2820, 0x1af17: 0x6c429e20, + 0x1af18: 0x6c94ee20, 0x1af19: 0x6c94f020, 0x1af1a: 0x6c837420, 0x1af1b: 0x6c742020, + 0x1af1c: 0x6c342820, 0x1af1d: 0x6d32ac20, 0x1af1e: 0x6c4c1e20, 0x1af1f: 0x6d1a5620, + 0x1af20: 0x6c2ff220, 0x1af21: 0x6c4dfa20, 0x1af22: 0x6d32ae20, 0x1af23: 0x6cefac20, + 0x1af24: 0x6cff7e20, 0x1af25: 0x6cafde20, 0x1af26: 0x6d0bf220, 0x1af27: 0x6cd91420, + 0x1af28: 0x6c6ab220, 0x1af29: 0x6c07e220, 0x1af2a: 0x6d40b620, 0x1af2b: 0x6c7a3c20, + 0x1af2c: 0x6c2ff420, 0x1af2d: 0x6d2de420, 0x1af2e: 0x6c480c20, 0x1af2f: 0x6d1a5820, + 0x1af30: 0x6d3f6a20, 0x1af31: 0x6d2b4e20, 0x1af32: 0x6c59c020, 0x1af33: 0x6d211820, + 0x1af34: 0x6cec6220, 0x1af35: 0x6d0fb220, 0x1af36: 0x6c3c4a20, 0x1af37: 0x6cc05c20, + 0x1af38: 0x6d0fb420, 0x1af39: 0x6ce32020, 0x1af3a: 0x6d15ec20, 0x1af3b: 0x6d361e20, + 0x1af3c: 0x6cd37c20, 0x1af3d: 0x6d291620, 0x1af3e: 0x6d11ae20, 0x1af3f: 0x6c363020, + // Block 0x6bd, offset 0x1af40 + 0x1af40: 0x6d3af220, 0x1af41: 0x6c76ac20, 0x1af42: 0x6c93dc20, 0x1af43: 0x6d0d7a20, + 0x1af44: 0x6c9a5820, 0x1af45: 0x6c4e0e20, 0x1af46: 0x6c5ec820, 0x1af47: 0x6c5eca20, + 0x1af48: 0x6c591e20, 0x1af49: 0x6ce67020, 0x1af4a: 0x6cd16a20, 0x1af4b: 0x6c99fa20, + 0x1af4c: 0x6cba5220, 0x1af4d: 0x6cf4e820, 0x1af4e: 0x6d211a20, 0x1af4f: 0x6d3f8420, + 0x1af50: 0x6c7f9a20, 0x1af51: 0x6c786420, 0x1af52: 0x6d0c9220, 0x1af53: 0x6d0c9420, + 0x1af54: 0x6cefbc20, 0x1af55: 0x6d3f8620, 0x1af56: 0x6c13e020, 0x1af57: 0x6cdc3c20, + 0x1af58: 0x6cc67220, 0x1af59: 0x6c78ee20, 0x1af5a: 0x6cbd2e20, 0x1af5b: 0x6d211c20, + 0x1af5c: 0x6ce45220, 0x1af5d: 0x6c90e220, 0x1af5e: 0x6ce8ba20, 0x1af5f: 0x6c330420, + 0x1af60: 0x6cf64220, 0x1af61: 0x6cf25220, 0x1af62: 0x6c123020, 0x1af63: 0x6c296c20, + 0x1af64: 0x6cc68220, 0x1af65: 0x6c6ae020, 0x1af66: 0x6c765e20, 0x1af67: 0x6c8e6820, + 0x1af68: 0x6cf4fc20, 0x1af69: 0x6cd92420, 0x1af6a: 0x6cbb7c20, 0x1af6b: 0x6d3e3620, + 0x1af6c: 0x6cef0c20, 0x1af6d: 0x6c07f620, 0x1af6e: 0x6c2ccc20, 0x1af6f: 0x6c25da20, + 0x1af70: 0x6cba1220, 0x1af71: 0x6d1e4420, 0x1af72: 0x6ca83e20, 0x1af73: 0x6c25dc20, + 0x1af74: 0x6c614820, 0x1af75: 0x6cd41620, 0x1af76: 0x6cc93c20, 0x1af77: 0x6cd96820, + 0x1af78: 0x6d3fa020, 0x1af79: 0x6c67f420, 0x1af7a: 0x6c89f220, 0x1af7b: 0x6c773c20, + 0x1af7c: 0x6c15c620, 0x1af7d: 0x6c2ec820, 0x1af7e: 0x6c132420, 0x1af7f: 0x6c2f7820, + // Block 0x6be, offset 0x1af80 + 0x1af80: 0x6ce86820, 0x1af81: 0x6c90ec20, 0x1af82: 0x6d2f3a20, 0x1af83: 0x6d2dfe20, + 0x1af84: 0x6d2e0020, 0x1af85: 0x6c024e20, 0x1af86: 0x6c127c20, 0x1af87: 0x6cc11e20, + 0x1af88: 0x6cbac820, 0x1af89: 0x6c24d620, 0x1af8a: 0x6d418e20, 0x1af8b: 0x6c29e220, + 0x1af8c: 0x6c29e420, 0x1af8d: 0x6cf79020, 0x1af8e: 0x6d238c20, 0x1af8f: 0x6cae2620, + 0x1af90: 0x6c8f9a20, 0x1af91: 0x6cfe4420, 0x1af92: 0x6c135620, 0x1af93: 0x6c0e8620, + 0x1af94: 0x6cbd3c20, 0x1af95: 0x6c686620, 0x1af96: 0x6d0dc620, 0x1af97: 0x6c816a20, + 0x1af98: 0x6d2e7420, 0x1af99: 0x6c8bcc20, 0x1af9a: 0x6c8a0820, 0x1af9b: 0x6c8a0a20, + 0x1af9c: 0x6c6c5020, 0x1af9d: 0x6c2ae220, 0x1af9e: 0x6c350a20, 0x1af9f: 0x6d41ee20, + 0x1afa0: 0x6c69ba20, 0x1afa1: 0x6c4b6220, 0x1afa2: 0x6d113420, 0x1afa3: 0x6c686820, + 0x1afa4: 0x6d113620, 0x1afa5: 0x6c748e20, 0x1afa6: 0x6d2d9620, 0x1afa7: 0x6d188a20, + 0x1afa8: 0x6d091a20, 0x1afa9: 0x6ca4be20, 0x1afaa: 0x6d133820, 0x1afab: 0x6d133a20, + 0x1afac: 0x6d155a20, 0x1afad: 0x6ca87020, 0x1afae: 0x6cfc2a20, 0x1afaf: 0x6c608220, + 0x1afb0: 0x6d020c20, 0x1afb1: 0x6c786e20, 0x1afb2: 0x6cf69820, 0x1afb3: 0x6c2c9a20, + 0x1afb4: 0x6c02e620, 0x1afb5: 0x6d419c20, 0x1afb6: 0x6cf14820, 0x1afb7: 0x6d156c20, + 0x1afb8: 0x6cc6c020, 0x1afb9: 0x6c29f020, 0x1afba: 0x6c8e1420, 0x1afbb: 0x6d28cc20, + 0x1afbc: 0x6d228c20, 0x1afbd: 0x6d26f220, 0x1afbe: 0x6d1b0c20, 0x1afbf: 0x6cc83820, + // Block 0x6bf, offset 0x1afc0 + 0x1afc0: 0x6c6b5420, 0x1afc1: 0x6c869c20, 0x1afc2: 0x6c4a9820, 0x1afc3: 0x6c8fbe20, + 0x1afc4: 0x6c8fc020, 0x1afc5: 0x6c2ce420, 0x1afc6: 0x6cc6d620, 0x1afc7: 0x6cf72a20, + 0x1afc8: 0x6c718620, 0x1afc9: 0x6c155020, 0x1afca: 0x6d1d2220, 0x1afcb: 0x6c7c5420, + 0x1afcc: 0x6d0cee20, 0x1afcd: 0x6ceec820, 0x1afce: 0x6ca4d420, 0x1afcf: 0x6cc32820, + 0x1afd0: 0x6c17ac20, 0x1afd1: 0x6c24a420, 0x1afd2: 0x6c945220, 0x1afd3: 0x6c2cf420, + 0x1afd4: 0x6c2cf620, 0x1afd5: 0x6ca8e020, 0x1afd6: 0x6d0d1220, 0x1afd7: 0x6d0d1020, + 0x1afd8: 0x6d0e2020, 0x1afd9: 0x6c7cbc20, 0x1afda: 0x6d0e2220, 0x1afdb: 0x6c1fd620, + 0x1afdc: 0x6c7b0820, 0x1afdd: 0x6c1fd820, 0x1afde: 0x6d385020, 0x1afdf: 0x6c597020, + 0x1afe0: 0x6c6d8a20, 0x1afe1: 0x6d09d820, 0x1afe2: 0x6c175e20, 0x1afe3: 0x6c176020, + 0x1afe4: 0x6c8b2620, 0x1afe5: 0x6c454a20, 0x1afe6: 0x6d426020, 0x1afe7: 0x6cbc1a20, + 0x1afe8: 0x6c71e820, 0x1afe9: 0x6c45ce20, 0x1afea: 0x6c71f220, 0x1afeb: 0x6cf35220, + 0x1afec: 0x6cb4be20, 0x1afed: 0x6cb4c020, 0x1afee: 0x6c143620, 0x1afef: 0x6cc05e20, + 0x1aff0: 0x6cc08220, 0x1aff1: 0x6c610e20, 0x1aff2: 0x6d15ac20, 0x1aff3: 0x6cd87020, + 0x1aff4: 0x6c03e620, 0x1aff5: 0x6d338a20, 0x1aff6: 0x6d2f5820, 0x1aff7: 0x6cfe1e20, + 0x1aff8: 0x6d14bc20, 0x1aff9: 0x6c6c8820, 0x1affa: 0x6d0a6c20, 0x1affb: 0x6c734020, + 0x1affc: 0x6c033820, 0x1affd: 0x6d0a8c20, 0x1affe: 0x6c6c1a20, 0x1afff: 0x6c3dc620, + // Block 0x6c0, offset 0x1b000 + 0x1b000: 0x6d287e20, 0x1b001: 0x6c090220, 0x1b002: 0x6cd2f020, 0x1b003: 0x6c105820, + 0x1b004: 0x6c2f4620, 0x1b005: 0x6cd66220, 0x1b006: 0x6c384a20, 0x1b007: 0x6ca7ec20, + 0x1b008: 0x6cd19020, 0x1b009: 0x6c3b0e20, 0x1b00a: 0x6cabe420, 0x1b00b: 0x6d34e020, + 0x1b00c: 0x6cf57a20, 0x1b00d: 0x6c565420, 0x1b00e: 0x6c286420, 0x1b00f: 0x6ceede20, + 0x1b010: 0x6d2f2020, 0x1b011: 0x6ce16e20, 0x1b012: 0x6c273220, 0x1b013: 0x6ca0c820, + 0x1b014: 0x6cae0620, 0x1b015: 0x6cabe620, 0x1b016: 0x6ce5e820, 0x1b017: 0x6c0e4c20, + 0x1b018: 0x6c87f220, 0x1b019: 0x6d358620, 0x1b01a: 0x6d397620, 0x1b01b: 0x6c0eb420, + 0x1b01c: 0x6d358820, 0x1b01d: 0x6c2c2620, 0x1b01e: 0x6ca0de20, 0x1b01f: 0x6d16e220, + 0x1b020: 0x6d16e420, 0x1b021: 0x6cb28220, 0x1b022: 0x6cb84820, 0x1b023: 0x6c731420, + 0x1b024: 0x6cc79220, 0x1b025: 0x6cd66420, 0x1b026: 0x6c274020, 0x1b027: 0x6d334020, + 0x1b028: 0x6cd71420, 0x1b029: 0x6cbc3820, 0x1b02a: 0x6d313620, 0x1b02b: 0x6cd1b020, + 0x1b02c: 0x6cc44420, 0x1b02d: 0x6cf77020, 0x1b02e: 0x6c051c20, 0x1b02f: 0x6c275020, + 0x1b030: 0x6c4a4420, 0x1b031: 0x6c1d9420, 0x1b032: 0x6cb29a20, 0x1b033: 0x6d2f2c20, + 0x1b034: 0x6cca4a20, 0x1b035: 0x6cec8a20, 0x1b036: 0x6c275c20, 0x1b037: 0x6ceefc20, + 0x1b038: 0x6c16a420, 0x1b039: 0x6ccc4820, 0x1b03a: 0x6cb5c220, 0x1b03b: 0x6d2abe20, + 0x1b03c: 0x6c4c6820, 0x1b03d: 0x6c997a20, 0x1b03e: 0x6c321620, 0x1b03f: 0x6c540020, + // Block 0x6c1, offset 0x1b040 + 0x1b040: 0x6d334c20, 0x1b041: 0x6d059420, 0x1b042: 0x6c9d4420, 0x1b043: 0x6cef0e20, + 0x1b044: 0x6cf2ec20, 0x1b045: 0x6c3e7620, 0x1b046: 0x6d179620, 0x1b047: 0x6c052e20, + 0x1b048: 0x6cb2a420, 0x1b049: 0x6c2f3a20, 0x1b04a: 0x6c459220, 0x1b04b: 0x6cac5e20, + 0x1b04c: 0x6c5a5420, 0x1b04d: 0x6ce1d220, 0x1b04e: 0x6c9d5420, 0x1b04f: 0x6c644a20, + 0x1b050: 0x6ce2a020, 0x1b051: 0x6c5ad020, 0x1b052: 0x6d37c020, 0x1b053: 0x6cccfa20, + 0x1b054: 0x6c97e620, 0x1b055: 0x6ca29420, 0x1b056: 0x6c0c0820, 0x1b057: 0x6c4c7220, + 0x1b058: 0x6d2adc20, 0x1b059: 0x6ca29620, 0x1b05a: 0x6c053420, 0x1b05b: 0x6d2f3c20, + 0x1b05c: 0x6c6e2820, 0x1b05d: 0x6c15d220, 0x1b05e: 0x6c3ed620, 0x1b05f: 0x6d36a620, + 0x1b060: 0x6c54f420, 0x1b061: 0x6c385820, 0x1b062: 0x6c207620, 0x1b063: 0x6c09f220, + 0x1b064: 0x6c0ae220, 0x1b065: 0x6d2f4820, 0x1b066: 0x6c9d8420, 0x1b067: 0x6cbba420, + 0x1b068: 0x6c14d820, 0x1b069: 0x6c3b8620, 0x1b06a: 0x6c9b4820, 0x1b06b: 0x6c053e20, + 0x1b06c: 0x6c1de420, 0x1b06d: 0x6c9eee20, 0x1b06e: 0x6c1eb820, 0x1b06f: 0x6c6b3220, + 0x1b070: 0x6cfc3e20, 0x1b071: 0x6c7fe220, 0x1b072: 0x6c420a20, 0x1b073: 0x6cb26e20, + 0x1b074: 0x6ca6f220, 0x1b075: 0x6c646020, 0x1b076: 0x6c0e0420, 0x1b077: 0x6c0e0c20, + 0x1b078: 0x6d041620, 0x1b079: 0x6c422620, 0x1b07a: 0x6d107e20, 0x1b07b: 0x6c58ec20, + 0x1b07c: 0x6d200c20, 0x1b07d: 0x6d1e9a20, 0x1b07e: 0x6c613e20, 0x1b07f: 0x6c4a0220, + // Block 0x6c2, offset 0x1b080 + 0x1b080: 0x6cb04220, 0x1b081: 0x6ce62420, 0x1b082: 0x6d2b3420, 0x1b083: 0x6c4a0420, + 0x1b084: 0x6d3c0820, 0x1b085: 0x6ca1b020, 0x1b086: 0x6cbec220, 0x1b087: 0x6c091c20, + 0x1b088: 0x6cbd5220, 0x1b089: 0x6c33d820, 0x1b08a: 0x6c206c20, 0x1b08b: 0x6c4ac220, + 0x1b08c: 0x6d0b4820, 0x1b08d: 0x6c043020, 0x1b08e: 0x6c6bb620, 0x1b08f: 0x6d067020, + 0x1b090: 0x6c913420, 0x1b091: 0x6cf42020, 0x1b092: 0x6d3c5420, 0x1b093: 0x6c7a8220, + 0x1b094: 0x6d1b9e20, 0x1b095: 0x6c2bd620, 0x1b096: 0x6cad4c20, 0x1b097: 0x6c2d3c20, + 0x1b098: 0x6d0ad020, 0x1b099: 0x6c9eac20, 0x1b09a: 0x6c44ba20, 0x1b09b: 0x6c22b820, + 0x1b09c: 0x6c3f3e20, 0x1b09d: 0x6ce71820, 0x1b09e: 0x6cacf220, 0x1b09f: 0x6c3a8220, + 0x1b0a0: 0x6cfdb420, 0x1b0a1: 0x6d15ce20, 0x1b0a2: 0x6d359820, 0x1b0a3: 0x6ce54e20, + 0x1b0a4: 0x6d359a20, 0x1b0a5: 0x6d04be20, 0x1b0a6: 0x6c324420, 0x1b0a7: 0x6d428e20, + 0x1b0a8: 0x6cfe9c20, 0x1b0a9: 0x6ce89020, 0x1b0aa: 0x6c4ae620, 0x1b0ab: 0x6c7a8820, + 0x1b0ac: 0x6c984e20, 0x1b0ad: 0x6ce66420, 0x1b0ae: 0x6d1fb620, 0x1b0af: 0x6c101020, + 0x1b0b0: 0x6c0e0e20, 0x1b0b1: 0x6c1a6e20, 0x1b0b2: 0x6c7ef620, 0x1b0b3: 0x6c097620, + 0x1b0b4: 0x6c601620, 0x1b0b5: 0x6c012620, 0x1b0b6: 0x6cd5c220, 0x1b0b7: 0x6c772c20, + 0x1b0b8: 0x6d1d8420, 0x1b0b9: 0x6ceb7820, 0x1b0ba: 0x6cd91620, 0x1b0bb: 0x6cd5c420, + 0x1b0bc: 0x6cbea620, 0x1b0bd: 0x6d233620, 0x1b0be: 0x6d224a20, 0x1b0bf: 0x6c9eb420, + // Block 0x6c3, offset 0x1b0c0 + 0x1b0c0: 0x6cd9ac20, 0x1b0c1: 0x6c12e620, 0x1b0c2: 0x6cfd7220, 0x1b0c3: 0x6c3aaa20, + 0x1b0c4: 0x6c6ff820, 0x1b0c5: 0x6c365420, 0x1b0c6: 0x6c4a6620, 0x1b0c7: 0x6c8f3420, + 0x1b0c8: 0x6ccc5620, 0x1b0c9: 0x6c881020, 0x1b0ca: 0x6c80b420, 0x1b0cb: 0x6cd9ae20, + 0x1b0cc: 0x6d365220, 0x1b0cd: 0x6cb3f620, 0x1b0ce: 0x6cbeac20, 0x1b0cf: 0x6c700e20, + 0x1b0d0: 0x6c6ffa20, 0x1b0d1: 0x6c6c9e20, 0x1b0d2: 0x6c025020, 0x1b0d3: 0x6c7e0420, + 0x1b0d4: 0x6c90a020, 0x1b0d5: 0x6d1b5e20, 0x1b0d6: 0x6c8a9e20, 0x1b0d7: 0x6c277e20, + 0x1b0d8: 0x6c927c20, 0x1b0d9: 0x6d182220, 0x1b0da: 0x6c1ea420, 0x1b0db: 0x6c151a20, + 0x1b0dc: 0x6ce8d820, 0x1b0dd: 0x6cd81220, 0x1b0de: 0x6d02e420, 0x1b0df: 0x6c9eb820, + 0x1b0e0: 0x6c16f420, 0x1b0e1: 0x6cf46220, 0x1b0e2: 0x6c3ac420, 0x1b0e3: 0x6c4a0820, + 0x1b0e4: 0x6c7aa620, 0x1b0e5: 0x6c7b3c20, 0x1b0e6: 0x6c0a4820, 0x1b0e7: 0x6cbb2220, + 0x1b0e8: 0x6d021020, 0x1b0e9: 0x6c8c2c20, 0x1b0ea: 0x6c8c2e20, 0x1b0eb: 0x6c8a3220, + 0x1b0ec: 0x6c916e20, 0x1b0ed: 0x6c631220, 0x1b0ee: 0x6d1d2420, 0x1b0ef: 0x6cfafa20, + 0x1b0f0: 0x6ce65420, 0x1b0f1: 0x6d1dd820, 0x1b0f2: 0x6c84bc20, 0x1b0f3: 0x6ce65820, + 0x1b0f4: 0x6d1ac020, 0x1b0f5: 0x6d09d220, 0x1b0f6: 0x6d0c5220, 0x1b0f7: 0x6ce65c20, + 0x1b0f8: 0x6c2b5220, 0x1b0f9: 0x6cac1420, 0x1b0fa: 0x6c665420, 0x1b0fb: 0x6c5b1c20, + 0x1b0fc: 0x6ca39a20, 0x1b0fd: 0x6c5b2220, 0x1b0fe: 0x6c45cc20, 0x1b0ff: 0x6ca75620, + // Block 0x6c4, offset 0x1b100 + 0x1b100: 0x6c762420, 0x1b101: 0x6c0b6620, 0x1b102: 0x6d166220, 0x1b103: 0x6cb73620, + 0x1b104: 0x6ca9f020, 0x1b105: 0x6c3bc620, 0x1b106: 0x6c71a420, 0x1b107: 0x6d0d5620, + 0x1b108: 0x6d16ea20, 0x1b109: 0x6d2a0020, 0x1b10a: 0x6c09f420, 0x1b10b: 0x6d163c20, + 0x1b10c: 0x6d13ba20, 0x1b10d: 0x6c37b820, 0x1b10e: 0x6cc9f820, 0x1b10f: 0x6cd2fc20, + 0x1b110: 0x6c37ba20, 0x1b111: 0x6cd38020, 0x1b112: 0x6cd39a20, 0x1b113: 0x6c454c20, + 0x1b114: 0x6c2e0420, 0x1b115: 0x6d1ac420, 0x1b116: 0x6c563620, 0x1b117: 0x6c3dc820, + 0x1b118: 0x6c52ea20, 0x1b119: 0x6cf34420, 0x1b11a: 0x6ce99c20, 0x1b11b: 0x6c1af420, + 0x1b11c: 0x6c67d420, 0x1b11d: 0x6c03a820, 0x1b11e: 0x6cd04420, 0x1b11f: 0x6c2c1420, + 0x1b120: 0x6d2eb020, 0x1b121: 0x6c73dc20, 0x1b122: 0x6ce1b020, 0x1b123: 0x6c3f4020, + 0x1b124: 0x6c2bd820, 0x1b125: 0x6c9c3820, 0x1b126: 0x6cfb2c20, 0x1b127: 0x6c552220, + 0x1b128: 0x6c173820, 0x1b129: 0x6caa4e20, 0x1b12a: 0x6c6e4c20, 0x1b12b: 0x6d31be20, + 0x1b12c: 0x6d14be20, 0x1b12d: 0x6c9ce020, 0x1b12e: 0x6cc28e20, 0x1b12f: 0x6cec8220, + 0x1b130: 0x6cce5e20, 0x1b131: 0x6cc91820, 0x1b132: 0x6d078620, 0x1b133: 0x6c6e6420, + 0x1b134: 0x6c2dc220, 0x1b135: 0x6d2eb420, 0x1b136: 0x6c67de20, 0x1b137: 0x6cbb0820, + 0x1b138: 0x6cae9a20, 0x1b139: 0x6c287820, 0x1b13a: 0x6cbb0e20, 0x1b13b: 0x6c099620, + 0x1b13c: 0x6c099820, 0x1b13d: 0x6ccf4820, 0x1b13e: 0x6c288820, 0x1b13f: 0x6c65aa20, + // Block 0x6c5, offset 0x1b140 + 0x1b140: 0x6c46b420, 0x1b141: 0x6c448e20, 0x1b142: 0x6c37f020, 0x1b143: 0x6c09c420, + 0x1b144: 0x6c79c020, 0x1b145: 0x6c673820, 0x1b146: 0x6c0d1820, 0x1b147: 0x6cff1420, + 0x1b148: 0x6c28a620, 0x1b149: 0x6c4c2e20, 0x1b14a: 0x6c67f820, 0x1b14b: 0x6c538620, + 0x1b14c: 0x6c9c7820, 0x1b14d: 0x6c4c4420, 0x1b14e: 0x6ceca420, 0x1b14f: 0x6c751620, + 0x1b150: 0x6c616820, 0x1b151: 0x6c616a20, 0x1b152: 0x6c4a3220, 0x1b153: 0x6c28f820, + 0x1b154: 0x6c921a20, 0x1b155: 0x6c921c20, 0x1b156: 0x6ce98820, 0x1b157: 0x6c5bb420, + 0x1b158: 0x6d362220, 0x1b159: 0x6c5bda20, 0x1b15a: 0x6c5bdc20, 0x1b15b: 0x6d155c20, + 0x1b15c: 0x6d155e20, 0x1b15d: 0x6d158020, 0x1b15e: 0x6d158220, 0x1b15f: 0x6d265e20, + 0x1b160: 0x6d266220, 0x1b161: 0x6cccb220, 0x1b162: 0x6d03c020, 0x1b163: 0x6cf17c20, + 0x1b164: 0x6ce71020, 0x1b165: 0x6d0e4620, 0x1b166: 0x6d0e4820, 0x1b167: 0x6d22f020, + 0x1b168: 0x6c1a9c20, 0x1b169: 0x6c112620, 0x1b16a: 0x6c0bfa20, 0x1b16b: 0x6c2dc420, + 0x1b16c: 0x6c0d3020, 0x1b16d: 0x6cae9e20, 0x1b16e: 0x6d1e4620, 0x1b16f: 0x6cb19820, + 0x1b170: 0x6d2ec420, 0x1b171: 0x6d1d0420, 0x1b172: 0x6c1af020, 0x1b173: 0x6c1bd420, + 0x1b174: 0x6d3d1c20, 0x1b175: 0x6ceb6c20, 0x1b176: 0x6c5fc820, 0x1b177: 0x6c39be20, + 0x1b178: 0x6d379220, 0x1b179: 0x6d168420, 0x1b17a: 0x6cedde20, 0x1b17b: 0x6c17fe20, + 0x1b17c: 0x6c08c020, 0x1b17d: 0x6c2b1620, 0x1b17e: 0x6c8caa20, 0x1b17f: 0x6c3dea20, + // Block 0x6c6, offset 0x1b180 + 0x1b180: 0x6cedfa20, 0x1b181: 0x6d328820, 0x1b182: 0x6c241e20, 0x1b183: 0x6cedfc20, + 0x1b184: 0x6c6e4e20, 0x1b185: 0x6c274220, 0x1b186: 0x6cf59e20, 0x1b187: 0x6d0a7020, + 0x1b188: 0x6c523a20, 0x1b189: 0x6d0f9420, 0x1b18a: 0x6c57e820, 0x1b18b: 0x6c93d020, + 0x1b18c: 0x6c546420, 0x1b18d: 0x6cee0220, 0x1b18e: 0x6c1a6620, 0x1b18f: 0x6d35b220, + 0x1b190: 0x6d061820, 0x1b191: 0x6c6e6620, 0x1b192: 0x6ce89220, 0x1b193: 0x6c238e20, + 0x1b194: 0x6d377e20, 0x1b195: 0x6c7eea20, 0x1b196: 0x6c239620, 0x1b197: 0x6c2a9020, + 0x1b198: 0x6cabf820, 0x1b199: 0x6cf7dc20, 0x1b19a: 0x6c300020, 0x1b19b: 0x6c61e620, + 0x1b19c: 0x6c16a620, 0x1b19d: 0x6d35dc20, 0x1b19e: 0x6c239820, 0x1b19f: 0x6d387020, + 0x1b1a0: 0x6c7ef820, 0x1b1a1: 0x6d233820, 0x1b1a2: 0x6d018e20, 0x1b1a3: 0x6c6bdc20, + 0x1b1a4: 0x6c667820, 0x1b1a5: 0x6cd38220, 0x1b1a6: 0x6c641620, 0x1b1a7: 0x6c0b9820, + 0x1b1a8: 0x6c59c220, 0x1b1a9: 0x6c3ff020, 0x1b1aa: 0x6d0a0e20, 0x1b1ab: 0x6cefbe20, + 0x1b1ac: 0x6cad0420, 0x1b1ad: 0x6d110c20, 0x1b1ae: 0x6cee9820, 0x1b1af: 0x6cf64820, + 0x1b1b0: 0x6d32d020, 0x1b1b1: 0x6cb1b620, 0x1b1b2: 0x6ce36220, 0x1b1b3: 0x6c2a7c20, + 0x1b1b4: 0x6d32de20, 0x1b1b5: 0x6d32f020, 0x1b1b6: 0x6c0cf420, 0x1b1b7: 0x6c2a7e20, + 0x1b1b8: 0x6c1cd420, 0x1b1b9: 0x6c183020, 0x1b1ba: 0x6c692620, 0x1b1bb: 0x6c5c2c20, + 0x1b1bc: 0x6c693c20, 0x1b1bd: 0x6c5af220, 0x1b1be: 0x6c9a2e20, 0x1b1bf: 0x6c906c20, + // Block 0x6c7, offset 0x1b1c0 + 0x1b1c0: 0x6cfd9220, 0x1b1c1: 0x6c067a20, 0x1b1c2: 0x6cc1fe20, 0x1b1c3: 0x6d02a220, + 0x1b1c4: 0x6d036220, 0x1b1c5: 0x6c090420, 0x1b1c6: 0x6d164020, 0x1b1c7: 0x6c820c20, + 0x1b1c8: 0x6cc56420, 0x1b1c9: 0x6c29b620, 0x1b1ca: 0x6c2f8e20, 0x1b1cb: 0x6c410820, + 0x1b1cc: 0x6c618020, 0x1b1cd: 0x6cc58620, 0x1b1ce: 0x6cc56a20, 0x1b1cf: 0x6c162620, + 0x1b1d0: 0x6ce05020, 0x1b1d1: 0x6ce26820, 0x1b1d2: 0x6ce26a20, 0x1b1d3: 0x6c416020, + 0x1b1d4: 0x6cb72a20, 0x1b1d5: 0x6cd2fe20, 0x1b1d6: 0x6c25ae20, 0x1b1d7: 0x6d357420, + 0x1b1d8: 0x6cee4620, 0x1b1d9: 0x6c982820, 0x1b1da: 0x6cf56e20, 0x1b1db: 0x6c388220, + 0x1b1dc: 0x6d1ba020, 0x1b1dd: 0x6ce4d820, 0x1b1de: 0x6c9f2c20, 0x1b1df: 0x6cf1ca20, + 0x1b1e0: 0x6d379620, 0x1b1e1: 0x6c1cac20, 0x1b1e2: 0x6cf4b620, 0x1b1e3: 0x6c5fca20, + 0x1b1e4: 0x6cf42220, 0x1b1e5: 0x6cf84620, 0x1b1e6: 0x6c639a20, 0x1b1e7: 0x6d1e8e20, + 0x1b1e8: 0x6ced7420, 0x1b1e9: 0x6c230220, 0x1b1ea: 0x6cd90220, 0x1b1eb: 0x6c7b0e20, + 0x1b1ec: 0x6d22d020, 0x1b1ed: 0x6c0b6c20, 0x1b1ee: 0x6d357620, 0x1b1ef: 0x6cb57420, + 0x1b1f0: 0x6c251820, 0x1b1f1: 0x6c189a20, 0x1b1f2: 0x6cdf5e20, 0x1b1f3: 0x6cea3e20, + 0x1b1f4: 0x6cb96e20, 0x1b1f5: 0x6ca75a20, 0x1b1f6: 0x6c5cde20, 0x1b1f7: 0x6d045420, + 0x1b1f8: 0x6ca97620, 0x1b1f9: 0x6c7bb620, 0x1b1fa: 0x6cfa7820, 0x1b1fb: 0x6d02aa20, + 0x1b1fc: 0x6c772420, 0x1b1fd: 0x6c549e20, 0x1b1fe: 0x6c767c20, 0x1b1ff: 0x6c3bce20, + // Block 0x6c8, offset 0x1b200 + 0x1b200: 0x6c57e620, 0x1b201: 0x6cdf6220, 0x1b202: 0x6cd95220, 0x1b203: 0x6cf42420, + 0x1b204: 0x6cab9a20, 0x1b205: 0x6c170220, 0x1b206: 0x6c20a020, 0x1b207: 0x6c71fa20, + 0x1b208: 0x6d16b420, 0x1b209: 0x6c05e620, 0x1b20a: 0x6c173a20, 0x1b20b: 0x6c9f2e20, + 0x1b20c: 0x6cadb020, 0x1b20d: 0x6d428020, 0x1b20e: 0x6d2b7620, 0x1b20f: 0x6d104020, + 0x1b210: 0x6c720a20, 0x1b211: 0x6c04e820, 0x1b212: 0x6caa5e20, 0x1b213: 0x6ca49420, + 0x1b214: 0x6d328a20, 0x1b215: 0x6cabe820, 0x1b216: 0x6c106a20, 0x1b217: 0x6ce5ea20, + 0x1b218: 0x6c567020, 0x1b219: 0x6c566420, 0x1b21a: 0x6c720c20, 0x1b21b: 0x6c267e20, + 0x1b21c: 0x6c87f420, 0x1b21d: 0x6cd7d420, 0x1b21e: 0x6c1d8e20, 0x1b21f: 0x6c2c2020, + 0x1b220: 0x6c274420, 0x1b221: 0x6d147020, 0x1b222: 0x6ce84020, 0x1b223: 0x6d1f0620, + 0x1b224: 0x6c3d4820, 0x1b225: 0x6c5ff420, 0x1b226: 0x6cae5420, 0x1b227: 0x6d041820, + 0x1b228: 0x6d260420, 0x1b229: 0x6ca5be20, 0x1b22a: 0x6c48e620, 0x1b22b: 0x6c3dec20, + 0x1b22c: 0x6cf84820, 0x1b22d: 0x6c093220, 0x1b22e: 0x6d1e9620, 0x1b22f: 0x6cbc9620, + 0x1b230: 0x6d086e20, 0x1b231: 0x6c230820, 0x1b232: 0x6c0dc220, 0x1b233: 0x6c5a4220, + 0x1b234: 0x6d068020, 0x1b235: 0x6c1f0e20, 0x1b236: 0x6c093420, 0x1b237: 0x6cd5ac20, + 0x1b238: 0x6cf5a020, 0x1b239: 0x6cdf9620, 0x1b23a: 0x6d1e8220, 0x1b23b: 0x6d3fe820, + 0x1b23c: 0x6c334220, 0x1b23d: 0x6ca1b220, 0x1b23e: 0x6d34f220, 0x1b23f: 0x6d16b620, + // Block 0x6c9, offset 0x1b240 + 0x1b240: 0x6cd33220, 0x1b241: 0x6ca59420, 0x1b242: 0x6d09e820, 0x1b243: 0x6cd33420, + 0x1b244: 0x6cf86020, 0x1b245: 0x6c81a420, 0x1b246: 0x6c525820, 0x1b247: 0x6c7b8e20, + 0x1b248: 0x6ca1c620, 0x1b249: 0x6d34fe20, 0x1b24a: 0x6d008020, 0x1b24b: 0x6c88e820, + 0x1b24c: 0x6ce55220, 0x1b24d: 0x6c5a4820, 0x1b24e: 0x6c2e7020, 0x1b24f: 0x6c502820, + 0x1b250: 0x6c799e20, 0x1b251: 0x6c4ad420, 0x1b252: 0x6c525a20, 0x1b253: 0x6cf5a220, + 0x1b254: 0x6c68ce20, 0x1b255: 0x6cd5b820, 0x1b256: 0x6cd8fe20, 0x1b257: 0x6c54aa20, + 0x1b258: 0x6cbfa420, 0x1b259: 0x6d104220, 0x1b25a: 0x6c5ba820, 0x1b25b: 0x6c5b2420, + 0x1b25c: 0x6c1bfa20, 0x1b25d: 0x6c63b020, 0x1b25e: 0x6d149a20, 0x1b25f: 0x6d045e20, + 0x1b260: 0x6c48ec20, 0x1b261: 0x6c8c4c20, 0x1b262: 0x6c5a9220, 0x1b263: 0x6d3f3a20, + 0x1b264: 0x6d068e20, 0x1b265: 0x6c1b8a20, 0x1b266: 0x6cce4e20, 0x1b267: 0x6caa7c20, + 0x1b268: 0x6c524220, 0x1b269: 0x6c371020, 0x1b26a: 0x6c788e20, 0x1b26b: 0x6c305e20, + 0x1b26c: 0x6ce48820, 0x1b26d: 0x6c457c20, 0x1b26e: 0x6cc29020, 0x1b26f: 0x6cf94220, + 0x1b270: 0x6cb84a20, 0x1b271: 0x6d268c20, 0x1b272: 0x6cae5820, 0x1b273: 0x6c790020, + 0x1b274: 0x6c2a6420, 0x1b275: 0x6c5baa20, 0x1b276: 0x6c35fa20, 0x1b277: 0x6d003220, + 0x1b278: 0x6ce7c620, 0x1b279: 0x6d0be020, 0x1b27a: 0x6c764c20, 0x1b27b: 0x6c12ce20, + 0x1b27c: 0x6ca4e020, 0x1b27d: 0x6d282020, 0x1b27e: 0x6c984020, 0x1b27f: 0x6d1e2a20, + // Block 0x6ca, offset 0x1b280 + 0x1b280: 0x6d1e2220, 0x1b281: 0x6d24d420, 0x1b282: 0x6caf5220, 0x1b283: 0x6c7da020, + 0x1b284: 0x6cbb6a20, 0x1b285: 0x6d269420, 0x1b286: 0x6d230c20, 0x1b287: 0x6ce89420, + 0x1b288: 0x6c6bd820, 0x1b289: 0x6cf5e220, 0x1b28a: 0x6d304a20, 0x1b28b: 0x6c8c4e20, + 0x1b28c: 0x6ce3e020, 0x1b28d: 0x6c4e9620, 0x1b28e: 0x6c502a20, 0x1b28f: 0x6cbca820, + 0x1b290: 0x6ce3ea20, 0x1b291: 0x6c108220, 0x1b292: 0x6d172620, 0x1b293: 0x6cba4a20, + 0x1b294: 0x6c5b4c20, 0x1b295: 0x6cf5bc20, 0x1b296: 0x6c070020, 0x1b297: 0x6c975e20, + 0x1b298: 0x6d13e420, 0x1b299: 0x6c524820, 0x1b29a: 0x6cd95620, 0x1b29b: 0x6cc29420, + 0x1b29c: 0x6c1a6820, 0x1b29d: 0x6c7c3820, 0x1b29e: 0x6cf4d020, 0x1b29f: 0x6cf4d220, + 0x1b2a0: 0x6d1e9e20, 0x1b2a1: 0x6c83b620, 0x1b2a2: 0x6c89ae20, 0x1b2a3: 0x6c590e20, + 0x1b2a4: 0x6c230c20, 0x1b2a5: 0x6d175a20, 0x1b2a6: 0x6d269620, 0x1b2a7: 0x6c85c820, + 0x1b2a8: 0x6ca8e620, 0x1b2a9: 0x6ca4e620, 0x1b2aa: 0x6c360e20, 0x1b2ab: 0x6cc3b620, + 0x1b2ac: 0x6d080e20, 0x1b2ad: 0x6cb8c420, 0x1b2ae: 0x6cf4d420, 0x1b2af: 0x6c9fa420, + 0x1b2b0: 0x6c239a20, 0x1b2b1: 0x6c3a5220, 0x1b2b2: 0x6c069c20, 0x1b2b3: 0x6c344c20, + 0x1b2b4: 0x6c253420, 0x1b2b5: 0x6c171220, 0x1b2b6: 0x6c9af220, 0x1b2b7: 0x6cca4e20, + 0x1b2b8: 0x6c61ea20, 0x1b2b9: 0x6c498820, 0x1b2ba: 0x6c497e20, 0x1b2bb: 0x6d042820, + 0x1b2bc: 0x6c2a0e20, 0x1b2bd: 0x6cb4e620, 0x1b2be: 0x6c797420, 0x1b2bf: 0x6ce4ec20, + // Block 0x6cb, offset 0x1b2c0 + 0x1b2c0: 0x6c94f220, 0x1b2c1: 0x6cf60a20, 0x1b2c2: 0x6c76d220, 0x1b2c3: 0x6c4bc020, + 0x1b2c4: 0x6ca6a020, 0x1b2c5: 0x6cbe7620, 0x1b2c6: 0x6c1da020, 0x1b2c7: 0x6c339820, + 0x1b2c8: 0x6c4cb620, 0x1b2c9: 0x6d2d7420, 0x1b2ca: 0x6c6da820, 0x1b2cb: 0x6ced0420, + 0x1b2cc: 0x6d24ea20, 0x1b2cd: 0x6c6c4220, 0x1b2ce: 0x6c620020, 0x1b2cf: 0x6c7f9620, + 0x1b2d0: 0x6d231020, 0x1b2d1: 0x6c5dca20, 0x1b2d2: 0x6c512620, 0x1b2d3: 0x6cc2da20, + 0x1b2d4: 0x6cdfdc20, 0x1b2d5: 0x6ce3ec20, 0x1b2d6: 0x6ce3f420, 0x1b2d7: 0x6ca81620, + 0x1b2d8: 0x6cee0e20, 0x1b2d9: 0x6c21b420, 0x1b2da: 0x6c54bc20, 0x1b2db: 0x6c5cc020, + 0x1b2dc: 0x6cf5e420, 0x1b2dd: 0x6c16ea20, 0x1b2de: 0x6d02ca20, 0x1b2df: 0x6ceefe20, + 0x1b2e0: 0x6c5bc020, 0x1b2e1: 0x6c363420, 0x1b2e2: 0x6cdd6620, 0x1b2e3: 0x6d3fee20, + 0x1b2e4: 0x6c648420, 0x1b2e5: 0x6d1e3620, 0x1b2e6: 0x6c2d4e20, 0x1b2e7: 0x6c723c20, + 0x1b2e8: 0x6c11ce20, 0x1b2e9: 0x6c19fc20, 0x1b2ea: 0x6c2a6e20, 0x1b2eb: 0x6c072220, + 0x1b2ec: 0x6cbcb420, 0x1b2ed: 0x6c119420, 0x1b2ee: 0x6c287a20, 0x1b2ef: 0x6c498020, + 0x1b2f0: 0x6c34f420, 0x1b2f1: 0x6ca4f820, 0x1b2f2: 0x6d283220, 0x1b2f3: 0x6cfdea20, + 0x1b2f4: 0x6d3c8420, 0x1b2f5: 0x6c2ea220, 0x1b2f6: 0x6c59c420, 0x1b2f7: 0x6c217e20, + 0x1b2f8: 0x6cbf2220, 0x1b2f9: 0x6cc54c20, 0x1b2fa: 0x6d037220, 0x1b2fb: 0x6c12e820, + 0x1b2fc: 0x6c0b3e20, 0x1b2fd: 0x6c9fac20, 0x1b2fe: 0x6d3f8a20, 0x1b2ff: 0x6ce32220, + // Block 0x6cc, offset 0x1b300 + 0x1b300: 0x6cbc2620, 0x1b301: 0x6c1db820, 0x1b302: 0x6c073020, 0x1b303: 0x6d079820, + 0x1b304: 0x6cee8620, 0x1b305: 0x6c43ea20, 0x1b306: 0x6cb8ee20, 0x1b307: 0x6cefc020, + 0x1b308: 0x6d236a20, 0x1b309: 0x6d212420, 0x1b30a: 0x6c099a20, 0x1b30b: 0x6d079a20, + 0x1b30c: 0x6c592020, 0x1b30d: 0x6c9fb620, 0x1b30e: 0x6c099c20, 0x1b30f: 0x6d17e220, + 0x1b310: 0x6c9e2420, 0x1b311: 0x6d1e3820, 0x1b312: 0x6c768820, 0x1b313: 0x6c296620, + 0x1b314: 0x6d19e020, 0x1b315: 0x6c363620, 0x1b316: 0x6c18c620, 0x1b317: 0x6c998a20, + 0x1b318: 0x6cb86820, 0x1b319: 0x6c78b820, 0x1b31a: 0x6d214820, 0x1b31b: 0x6c00a820, + 0x1b31c: 0x6cbcc020, 0x1b31d: 0x6d0d7e20, 0x1b31e: 0x6caaf620, 0x1b31f: 0x6c41dc20, + 0x1b320: 0x6d283420, 0x1b321: 0x6d3ff020, 0x1b322: 0x6cc9c220, 0x1b323: 0x6c839620, + 0x1b324: 0x6c3bd820, 0x1b325: 0x6d1d6620, 0x1b326: 0x6c7cf820, 0x1b327: 0x6c7cfa20, + 0x1b328: 0x6cc3d820, 0x1b329: 0x6c459420, 0x1b32a: 0x6d27ae20, 0x1b32b: 0x6cdaca20, + 0x1b32c: 0x6cdae420, 0x1b32d: 0x6cb5f820, 0x1b32e: 0x6d110e20, 0x1b32f: 0x6cd96020, + 0x1b330: 0x6c5a6c20, 0x1b331: 0x6c604e20, 0x1b332: 0x6c478c20, 0x1b333: 0x6c726220, + 0x1b334: 0x6c20ae20, 0x1b335: 0x6ca6aa20, 0x1b336: 0x6d00b620, 0x1b337: 0x6c766020, + 0x1b338: 0x6d332a20, 0x1b339: 0x6d1e4820, 0x1b33a: 0x6c12ae20, 0x1b33b: 0x6d0a9a20, + 0x1b33c: 0x6cd0aa20, 0x1b33d: 0x6c0f1020, 0x1b33e: 0x6c768e20, 0x1b33f: 0x6d262820, + // Block 0x6cd, offset 0x1b340 + 0x1b340: 0x6cf89e20, 0x1b341: 0x6c5d3420, 0x1b342: 0x6d1e5020, 0x1b343: 0x6d102420, + 0x1b344: 0x6c862e20, 0x1b345: 0x6ccaaa20, 0x1b346: 0x6ce1d420, 0x1b347: 0x6d19f220, + 0x1b348: 0x6c224e20, 0x1b349: 0x6d06f220, 0x1b34a: 0x6cba5820, 0x1b34b: 0x6cdf7c20, + 0x1b34c: 0x6c599420, 0x1b34d: 0x6d283a20, 0x1b34e: 0x6cd0ac20, 0x1b34f: 0x6ca03820, + 0x1b350: 0x6c463020, 0x1b351: 0x6ccf5020, 0x1b352: 0x6c23a420, 0x1b353: 0x6cb15820, + 0x1b354: 0x6ca29820, 0x1b355: 0x6ca2a020, 0x1b356: 0x6c4c7620, 0x1b357: 0x6c1c5620, + 0x1b358: 0x6c11d420, 0x1b359: 0x6c11a620, 0x1b35a: 0x6c119c20, 0x1b35b: 0x6c24da20, + 0x1b35c: 0x6c9fc220, 0x1b35d: 0x6ce27e20, 0x1b35e: 0x6d2ec820, 0x1b35f: 0x6ce7ce20, + 0x1b360: 0x6c02d820, 0x1b361: 0x6cd6d620, 0x1b362: 0x6c97e820, 0x1b363: 0x6c499620, + 0x1b364: 0x6cc3ea20, 0x1b365: 0x6d2a8420, 0x1b366: 0x6c701620, 0x1b367: 0x6c5c1020, + 0x1b368: 0x6c765820, 0x1b369: 0x6c881220, 0x1b36a: 0x6cab9e20, 0x1b36b: 0x6cd96c20, + 0x1b36c: 0x6cbd8e20, 0x1b36d: 0x6d1b7020, 0x1b36e: 0x6c93f220, 0x1b36f: 0x6cce0c20, + 0x1b370: 0x6cf0b820, 0x1b371: 0x6ce95220, 0x1b372: 0x6c976c20, 0x1b373: 0x6cb8fe20, + 0x1b374: 0x6ccf6220, 0x1b375: 0x6d1d9c20, 0x1b376: 0x6cbed620, 0x1b377: 0x6c773e20, + 0x1b378: 0x6c2c8e20, 0x1b379: 0x6d348e20, 0x1b37a: 0x6c90a220, 0x1b37b: 0x6c738220, + 0x1b37c: 0x6cb51c20, 0x1b37d: 0x6cb50c20, 0x1b37e: 0x6d23c020, 0x1b37f: 0x6cb2c220, + // Block 0x6ce, offset 0x1b380 + 0x1b380: 0x6c89f620, 0x1b381: 0x6c23da20, 0x1b382: 0x6d1eae20, 0x1b383: 0x6c1cd620, + 0x1b384: 0x6d36aa20, 0x1b385: 0x6ce7d020, 0x1b386: 0x6c197a20, 0x1b387: 0x6cb7c020, + 0x1b388: 0x6cc12020, 0x1b389: 0x6caebc20, 0x1b38a: 0x6c075a20, 0x1b38b: 0x6c0cb820, + 0x1b38c: 0x6cbf5c20, 0x1b38d: 0x6c686a20, 0x1b38e: 0x6d2b8a20, 0x1b38f: 0x6c1c4220, + 0x1b390: 0x6c883620, 0x1b391: 0x6cb2cc20, 0x1b392: 0x6c7d0c20, 0x1b393: 0x6c5c1220, + 0x1b394: 0x6cbbf020, 0x1b395: 0x6c1a3620, 0x1b396: 0x6d1b7a20, 0x1b397: 0x6d1b7c20, + 0x1b398: 0x6cf80620, 0x1b399: 0x6cf6ba20, 0x1b39a: 0x6c28a820, 0x1b39b: 0x6ce00220, + 0x1b39c: 0x6c34a220, 0x1b39d: 0x6c335e20, 0x1b39e: 0x6c335a20, 0x1b39f: 0x6cdaf820, + 0x1b3a0: 0x6c74b620, 0x1b3a1: 0x6c130e20, 0x1b3a2: 0x6cff0220, 0x1b3a3: 0x6c385a20, + 0x1b3a4: 0x6c3be420, 0x1b3a5: 0x6c817220, 0x1b3a6: 0x6c81da20, 0x1b3a7: 0x6c1cd820, + 0x1b3a8: 0x6c4db820, 0x1b3a9: 0x6cb7d220, 0x1b3aa: 0x6cfb7c20, 0x1b3ab: 0x6c9fc420, + 0x1b3ac: 0x6c6e2a20, 0x1b3ad: 0x6c8a7420, 0x1b3ae: 0x6cf46420, 0x1b3af: 0x6c11da20, + 0x1b3b0: 0x6c749020, 0x1b3b1: 0x6c245420, 0x1b3b2: 0x6cfd0820, 0x1b3b3: 0x6ce06e20, + 0x1b3b4: 0x6cd12220, 0x1b3b5: 0x6caf9820, 0x1b3b6: 0x6d188e20, 0x1b3b7: 0x6c1f7420, + 0x1b3b8: 0x6cfad620, 0x1b3b9: 0x6ca4c020, 0x1b3ba: 0x6c28ac20, 0x1b3bb: 0x6ce07420, + 0x1b3bc: 0x6c6e2c20, 0x1b3bd: 0x6cd93220, 0x1b3be: 0x6c4f0220, 0x1b3bf: 0x6c693e20, + // Block 0x6cf, offset 0x1b3c0 + 0x1b3c0: 0x6cf0cc20, 0x1b3c1: 0x6d07cc20, 0x1b3c2: 0x6c303620, 0x1b3c3: 0x6cbdb020, + 0x1b3c4: 0x6cbd9e20, 0x1b3c5: 0x6c728a20, 0x1b3c6: 0x6c12b220, 0x1b3c7: 0x6c791020, + 0x1b3c8: 0x6d021420, 0x1b3c9: 0x6d1bfe20, 0x1b3ca: 0x6c02ea20, 0x1b3cb: 0x6c99ba20, + 0x1b3cc: 0x6d189020, 0x1b3cd: 0x6c8c3020, 0x1b3ce: 0x6ccb5420, 0x1b3cf: 0x6c75e420, + 0x1b3d0: 0x6c57f220, 0x1b3d1: 0x6c9afe20, 0x1b3d2: 0x6c803c20, 0x1b3d3: 0x6c00ca20, + 0x1b3d4: 0x6c8c3220, 0x1b3d5: 0x6d0c3c20, 0x1b3d6: 0x6c7e2620, 0x1b3d7: 0x6cfa4a20, + 0x1b3d8: 0x6c1c8420, 0x1b3d9: 0x6d228e20, 0x1b3da: 0x6d1b8820, 0x1b3db: 0x6c270e20, + 0x1b3dc: 0x6c9be420, 0x1b3dd: 0x6c00d820, 0x1b3de: 0x6c9b4a20, 0x1b3df: 0x6c337020, + 0x1b3e0: 0x6cb65c20, 0x1b3e1: 0x6ca0ac20, 0x1b3e2: 0x6c7fbe20, 0x1b3e3: 0x6c9b0020, + 0x1b3e4: 0x6c1de620, 0x1b3e5: 0x6d370220, 0x1b3e6: 0x6cab1620, 0x1b3e7: 0x6cab1820, + 0x1b3e8: 0x6d0c3420, 0x1b3e9: 0x6d103420, 0x1b3ea: 0x6c0f8a20, 0x1b3eb: 0x6d372820, + 0x1b3ec: 0x6c7c0c20, 0x1b3ed: 0x6c7bd220, 0x1b3ee: 0x6d1ff820, 0x1b3ef: 0x6c3db220, + 0x1b3f0: 0x6c8eb420, 0x1b3f1: 0x6c9ef020, 0x1b3f2: 0x6c1a5420, 0x1b3f3: 0x6c5cb020, + 0x1b3f4: 0x6c163820, 0x1b3f5: 0x6c9bea20, 0x1b3f6: 0x6c804a20, 0x1b3f7: 0x6c57fa20, + 0x1b3f8: 0x6d083620, 0x1b3f9: 0x6cc51a20, 0x1b3fa: 0x6c164020, 0x1b3fb: 0x6c62b820, + 0x1b3fc: 0x6c72ca20, 0x1b3fd: 0x6c583e20, 0x1b3fe: 0x6ccf8820, 0x1b3ff: 0x6d195a20, + // Block 0x6d0, offset 0x1b400 + 0x1b400: 0x6c893820, 0x1b401: 0x6ca44020, 0x1b402: 0x6c9cb020, 0x1b403: 0x6ce18c20, + 0x1b404: 0x6c751a20, 0x1b405: 0x6c42b020, 0x1b406: 0x6c42b220, 0x1b407: 0x6d3c5220, + 0x1b408: 0x6c436020, 0x1b409: 0x6d266e20, 0x1b40a: 0x6cf49820, 0x1b40b: 0x6c645a20, + 0x1b40c: 0x6d056420, 0x1b40d: 0x6cd59420, 0x1b40e: 0x6cc65020, 0x1b40f: 0x6cf83820, + 0x1b410: 0x6c19b220, 0x1b411: 0x6cf2a620, 0x1b412: 0x6c6bb820, 0x1b413: 0x6c436e20, + 0x1b414: 0x6c646c20, 0x1b415: 0x6cbaa020, 0x1b416: 0x6c5da020, 0x1b417: 0x6cbaa220, + 0x1b418: 0x6d2e4a20, 0x1b419: 0x6c306e20, 0x1b41a: 0x6cb81220, 0x1b41b: 0x6c63b620, + 0x1b41c: 0x6c2e9220, 0x1b41d: 0x6d2b5e20, 0x1b41e: 0x6c63be20, 0x1b41f: 0x6c614420, + 0x1b420: 0x6d33de20, 0x1b421: 0x6c76b020, 0x1b422: 0x6c603420, 0x1b423: 0x6c7c8620, + 0x1b424: 0x6c414020, 0x1b425: 0x6c2ace20, 0x1b426: 0x6d2e6820, 0x1b427: 0x6cbaca20, + 0x1b428: 0x6c439e20, 0x1b429: 0x6c65bc20, 0x1b42a: 0x6c6b0620, 0x1b42b: 0x6d238e20, + 0x1b42c: 0x6c65be20, 0x1b42d: 0x6d0dc820, 0x1b42e: 0x6c92a020, 0x1b42f: 0x6c54f620, + 0x1b430: 0x6d2e7e20, 0x1b431: 0x6cf8da20, 0x1b432: 0x6cf8ec20, 0x1b433: 0x6c219a20, + 0x1b434: 0x6c279420, 0x1b435: 0x6cc20420, 0x1b436: 0x6c563820, 0x1b437: 0x6c563a20, + 0x1b438: 0x6c563c20, 0x1b439: 0x6c35c820, 0x1b43a: 0x6cd30c20, 0x1b43b: 0x6ce3d220, + 0x1b43c: 0x6c992620, 0x1b43d: 0x6c566620, 0x1b43e: 0x6c858c20, 0x1b43f: 0x6c39a620, + // Block 0x6d1, offset 0x1b440 + 0x1b440: 0x6cdd4e20, 0x1b441: 0x6c0b2e20, 0x1b442: 0x6c2d4220, 0x1b443: 0x6c6ed820, + 0x1b444: 0x6cce3420, 0x1b445: 0x6d14c020, 0x1b446: 0x6d15dc20, 0x1b447: 0x6ccd7a20, + 0x1b448: 0x6c568c20, 0x1b449: 0x6c3a0220, 0x1b44a: 0x6d0d8020, 0x1b44b: 0x6cd43620, + 0x1b44c: 0x6cd48e20, 0x1b44d: 0x6c10fe20, 0x1b44e: 0x6d2bc020, 0x1b44f: 0x6cbff220, + 0x1b450: 0x6c820e20, 0x1b451: 0x6cb3fe20, 0x1b452: 0x6c031020, 0x1b453: 0x6c26e020, + 0x1b454: 0x6cc61020, 0x1b455: 0x6c390220, 0x1b456: 0x6cc83020, 0x1b457: 0x6d292a20, + 0x1b458: 0x6cea9620, 0x1b459: 0x6d2f1e20, 0x1b45a: 0x6c2df620, 0x1b45b: 0x6c776620, + 0x1b45c: 0x6d207220, 0x1b45d: 0x6c7a1820, 0x1b45e: 0x6c41c420, 0x1b45f: 0x6ccf9e20, + 0x1b460: 0x6c137820, 0x1b461: 0x6cea9820, 0x1b462: 0x6c475420, 0x1b463: 0x6c79d620, + 0x1b464: 0x6cf4a220, 0x1b465: 0x6c2a9420, 0x1b466: 0x6cb89820, 0x1b467: 0x6d343620, + 0x1b468: 0x6cc5b620, 0x1b469: 0x6c7de620, 0x1b46a: 0x6c9ac020, 0x1b46b: 0x6ccade20, + 0x1b46c: 0x6d0f7420, 0x1b46d: 0x6ca97820, 0x1b46e: 0x6c051220, 0x1b46f: 0x6c17e620, + 0x1b470: 0x6cc53620, 0x1b471: 0x6cf57020, 0x1b472: 0x6cb97220, 0x1b473: 0x6c047020, + 0x1b474: 0x6c639c20, 0x1b475: 0x6d20b220, 0x1b476: 0x6c3dda20, 0x1b477: 0x6c02c220, + 0x1b478: 0x6cf57e20, 0x1b479: 0x6caf2a20, 0x1b47a: 0x6d34e620, 0x1b47b: 0x6d357820, + 0x1b47c: 0x6c35d220, 0x1b47d: 0x6c2a9620, 0x1b47e: 0x6d2f8420, 0x1b47f: 0x6c19bc20, + // Block 0x6d2, offset 0x1b480 + 0x1b480: 0x6c618420, 0x1b481: 0x6d0d3c20, 0x1b482: 0x6c7bb820, 0x1b483: 0x6c0b6e20, + 0x1b484: 0x6c173220, 0x1b485: 0x6c704e20, 0x1b486: 0x6cf1cc20, 0x1b487: 0x6c551e20, + 0x1b488: 0x6d267e20, 0x1b489: 0x6c73de20, 0x1b48a: 0x6c039a20, 0x1b48b: 0x6cbe0420, + 0x1b48c: 0x6c282020, 0x1b48d: 0x6d331820, 0x1b48e: 0x6d27d820, 0x1b48f: 0x6cecc820, + 0x1b490: 0x6ca54820, 0x1b491: 0x6d168820, 0x1b492: 0x6cd49e20, 0x1b493: 0x6d3b5420, + 0x1b494: 0x6cb3d020, 0x1b495: 0x6ce7e620, 0x1b496: 0x6c30da20, 0x1b497: 0x6c777e20, + 0x1b498: 0x6d301220, 0x1b499: 0x6cb3d220, 0x1b49a: 0x6c3f3620, 0x1b49b: 0x6cad3220, + 0x1b49c: 0x6c036020, 0x1b49d: 0x6c029c20, 0x1b49e: 0x6d2aa420, 0x1b49f: 0x6ce94820, + 0x1b4a0: 0x6c79b220, 0x1b4a1: 0x6c94d020, 0x1b4a2: 0x6cbb3820, 0x1b4a3: 0x6d287a20, + 0x1b4a4: 0x6c565620, 0x1b4a5: 0x6c063020, 0x1b4a6: 0x6c0dc420, 0x1b4a7: 0x6d34f420, + 0x1b4a8: 0x6cae5620, 0x1b4a9: 0x6cdf8c20, 0x1b4aa: 0x6c106c20, 0x1b4ab: 0x6caf3620, + 0x1b4ac: 0x6cdf1820, 0x1b4ad: 0x6d118c20, 0x1b4ae: 0x6d31b820, 0x1b4af: 0x6d2bc620, + 0x1b4b0: 0x6d0f4820, 0x1b4b1: 0x6c063220, 0x1b4b2: 0x6c508c20, 0x1b4b3: 0x6ca62820, + 0x1b4b4: 0x6d12ce20, 0x1b4b5: 0x6c2bda20, 0x1b4b6: 0x6c1bee20, 0x1b4b7: 0x6caf3820, + 0x1b4b8: 0x6c632220, 0x1b4b9: 0x6ca0a820, 0x1b4ba: 0x6c9a7620, 0x1b4bb: 0x6c185a20, + 0x1b4bc: 0x6d0ad220, 0x1b4bd: 0x6c1d6420, 0x1b4be: 0x6cc0e420, 0x1b4bf: 0x6c9f9420, + // Block 0x6d3, offset 0x1b4c0 + 0x1b4c0: 0x6c1f1020, 0x1b4c1: 0x6c632a20, 0x1b4c2: 0x6c3dee20, 0x1b4c3: 0x6d2c7220, + 0x1b4c4: 0x6d3a5c20, 0x1b4c5: 0x6c27bc20, 0x1b4c6: 0x6c146020, 0x1b4c7: 0x6ca2c420, + 0x1b4c8: 0x6ca6ec20, 0x1b4c9: 0x6c7e3e20, 0x1b4ca: 0x6c3f4220, 0x1b4cb: 0x6cad3420, + 0x1b4cc: 0x6c04ea20, 0x1b4cd: 0x6cabee20, 0x1b4ce: 0x6c8b9a20, 0x1b4cf: 0x6ca2d020, + 0x1b4d0: 0x6c48d820, 0x1b4d1: 0x6cb97420, 0x1b4d2: 0x6c71fc20, 0x1b4d3: 0x6cde2e20, + 0x1b4d4: 0x6c036820, 0x1b4d5: 0x6ceaac20, 0x1b4d6: 0x6ceaae20, 0x1b4d7: 0x6c02a020, + 0x1b4d8: 0x6c705a20, 0x1b4d9: 0x6d3cf020, 0x1b4da: 0x6caca020, 0x1b4db: 0x6d2f5a20, + 0x1b4dc: 0x6c043c20, 0x1b4dd: 0x6c043220, 0x1b4de: 0x6c2bdc20, 0x1b4df: 0x6ca62420, + 0x1b4e0: 0x6c720e20, 0x1b4e1: 0x6c7de820, 0x1b4e2: 0x6c903220, 0x1b4e3: 0x6c656420, + 0x1b4e4: 0x6cb83420, 0x1b4e5: 0x6d1d7e20, 0x1b4e6: 0x6c7f8c20, 0x1b4e7: 0x6ca8f620, + 0x1b4e8: 0x6c0e5020, 0x1b4e9: 0x6d2aa820, 0x1b4ea: 0x6cb8bc20, 0x1b4eb: 0x6c522e20, + 0x1b4ec: 0x6c7dea20, 0x1b4ed: 0x6cd33620, 0x1b4ee: 0x6c6a8e20, 0x1b4ef: 0x6d331e20, + 0x1b4f0: 0x6ca8ee20, 0x1b4f1: 0x6c45da20, 0x1b4f2: 0x6c45de20, 0x1b4f3: 0x6cc2ca20, + 0x1b4f4: 0x6cd68020, 0x1b4f5: 0x6c25a620, 0x1b4f6: 0x6d288a20, 0x1b4f7: 0x6c77a020, + 0x1b4f8: 0x6d149c20, 0x1b4f9: 0x6d008220, 0x1b4fa: 0x6c12d020, 0x1b4fb: 0x6c5a9420, + 0x1b4fc: 0x6cb1ea20, 0x1b4fd: 0x6d3b6620, 0x1b4fe: 0x6cd41020, 0x1b4ff: 0x6ca2d620, + // Block 0x6d4, offset 0x1b500 + 0x1b500: 0x6c03fc20, 0x1b501: 0x6c1b0c20, 0x1b502: 0x6c48ac20, 0x1b503: 0x6d359c20, + 0x1b504: 0x6c7dec20, 0x1b505: 0x6c348020, 0x1b506: 0x6c348220, 0x1b507: 0x6d350020, + 0x1b508: 0x6cbcaa20, 0x1b509: 0x6c01a420, 0x1b50a: 0x6ca9f220, 0x1b50b: 0x6d322020, + 0x1b50c: 0x6c43ca20, 0x1b50d: 0x6c698820, 0x1b50e: 0x6c7ae620, 0x1b50f: 0x6c306020, + 0x1b510: 0x6ca2d820, 0x1b511: 0x6ce55420, 0x1b512: 0x6c8ad220, 0x1b513: 0x6d2bca20, + 0x1b514: 0x6c937c20, 0x1b515: 0x6c2e7220, 0x1b516: 0x6cebca20, 0x1b517: 0x6c73fa20, + 0x1b518: 0x6c8b9420, 0x1b519: 0x6c71b020, 0x1b51a: 0x6d35b820, 0x1b51b: 0x6c943420, + 0x1b51c: 0x6d0b8620, 0x1b51d: 0x6cf27c20, 0x1b51e: 0x6cde3420, 0x1b51f: 0x6d008420, + 0x1b520: 0x6ca49c20, 0x1b521: 0x6c292820, 0x1b522: 0x6c68d020, 0x1b523: 0x6d329820, + 0x1b524: 0x6c612a20, 0x1b525: 0x6c5a9620, 0x1b526: 0x6cfb3420, 0x1b527: 0x6d24be20, + 0x1b528: 0x6c002020, 0x1b529: 0x6ceab420, 0x1b52a: 0x6caab820, 0x1b52b: 0x6c261c20, + 0x1b52c: 0x6c0ed420, 0x1b52d: 0x6c44fa20, 0x1b52e: 0x6ce3be20, 0x1b52f: 0x6d322c20, + 0x1b530: 0x6c19dc20, 0x1b531: 0x6cc94220, 0x1b532: 0x6cc94420, 0x1b533: 0x6c793220, + 0x1b534: 0x6c9a5020, 0x1b535: 0x6c906220, 0x1b536: 0x6c706820, 0x1b537: 0x6cae9020, + 0x1b538: 0x6c657a20, 0x1b539: 0x6d172820, 0x1b53a: 0x6ce6ba20, 0x1b53b: 0x6cccce20, + 0x1b53c: 0x6cc83a20, 0x1b53d: 0x6cecf820, 0x1b53e: 0x6d008a20, 0x1b53f: 0x6c138820, + // Block 0x6d5, offset 0x1b540 + 0x1b540: 0x6c3ca020, 0x1b541: 0x6c68da20, 0x1b542: 0x6cf43c20, 0x1b543: 0x6c75a420, + 0x1b544: 0x6c6fe820, 0x1b545: 0x6ce7b220, 0x1b546: 0x6c7da220, 0x1b547: 0x6c5dac20, + 0x1b548: 0x6ce89620, 0x1b549: 0x6d3cf620, 0x1b54a: 0x6cb3d620, 0x1b54b: 0x6c938820, + 0x1b54c: 0x6c033a20, 0x1b54d: 0x6c4e9820, 0x1b54e: 0x6cce6020, 0x1b54f: 0x6ca7da20, + 0x1b550: 0x6c72e420, 0x1b551: 0x6d2b4620, 0x1b552: 0x6cd5ba20, 0x1b553: 0x6d127620, + 0x1b554: 0x6c741220, 0x1b555: 0x6c103620, 0x1b556: 0x6cecd020, 0x1b557: 0x6c108420, + 0x1b558: 0x6d421620, 0x1b559: 0x6d172a20, 0x1b55a: 0x6d2ce820, 0x1b55b: 0x6c937e20, + 0x1b55c: 0x6cd9a420, 0x1b55d: 0x6ceab620, 0x1b55e: 0x6c813a20, 0x1b55f: 0x6cdce620, + 0x1b560: 0x6c052220, 0x1b561: 0x6c657c20, 0x1b562: 0x6c590220, 0x1b563: 0x6c29d420, + 0x1b564: 0x6cf13c20, 0x1b565: 0x6ced7820, 0x1b566: 0x6cbd6e20, 0x1b567: 0x6caf0220, + 0x1b568: 0x6ccf2c20, 0x1b569: 0x6c8af820, 0x1b56a: 0x6c9f4620, 0x1b56b: 0x6c9aca20, + 0x1b56c: 0x6c3f5a20, 0x1b56d: 0x6c041e20, 0x1b56e: 0x6c723e20, 0x1b56f: 0x6c29cc20, + 0x1b570: 0x6cf2b420, 0x1b571: 0x6c003e20, 0x1b572: 0x6c731c20, 0x1b573: 0x6d26a420, + 0x1b574: 0x6d3fec20, 0x1b575: 0x6c186420, 0x1b576: 0x6c20c820, 0x1b577: 0x6c6ab620, + 0x1b578: 0x6ce85420, 0x1b579: 0x6c07ae20, 0x1b57a: 0x6ca33220, 0x1b57b: 0x6ca72020, + 0x1b57c: 0x6cc90e20, 0x1b57d: 0x6d423620, 0x1b57e: 0x6cf2e220, 0x1b57f: 0x6cf5e820, + // Block 0x6d6, offset 0x1b580 + 0x1b580: 0x6cfa9820, 0x1b581: 0x6c19e620, 0x1b582: 0x6c2cc420, 0x1b583: 0x6ccae020, + 0x1b584: 0x6c94d220, 0x1b585: 0x6cbec620, 0x1b586: 0x6c427820, 0x1b587: 0x6c342a20, + 0x1b588: 0x6cd46020, 0x1b589: 0x6c2e1820, 0x1b58a: 0x6cb3d820, 0x1b58b: 0x6c2bf020, + 0x1b58c: 0x6d2f0420, 0x1b58d: 0x6c5d2420, 0x1b58e: 0x6c613620, 0x1b58f: 0x6ce1c220, + 0x1b590: 0x6cb82820, 0x1b591: 0x6cb5c420, 0x1b592: 0x6cabfa20, 0x1b593: 0x6cd4c820, + 0x1b594: 0x6cb8e220, 0x1b595: 0x6c8ce420, 0x1b596: 0x6d125c20, 0x1b597: 0x6d0b9c20, + 0x1b598: 0x6c742420, 0x1b599: 0x6d32b020, 0x1b59a: 0x6c899020, 0x1b59b: 0x6c48b020, + 0x1b59c: 0x6d175c20, 0x1b59d: 0x6c5dc220, 0x1b59e: 0x6ccd8220, 0x1b59f: 0x6d332020, + 0x1b5a0: 0x6c361020, 0x1b5a1: 0x6c112a20, 0x1b5a2: 0x6ce09420, 0x1b5a3: 0x6c181e20, + 0x1b5a4: 0x6c0db020, 0x1b5a5: 0x6c69fa20, 0x1b5a6: 0x6ce3ee20, 0x1b5a7: 0x6c79a420, + 0x1b5a8: 0x6ce99020, 0x1b5a9: 0x6d0d6620, 0x1b5aa: 0x6c262220, 0x1b5ab: 0x6d387420, + 0x1b5ac: 0x6c708a20, 0x1b5ad: 0x6ce53420, 0x1b5ae: 0x6cb98820, 0x1b5af: 0x6c791820, + 0x1b5b0: 0x6c040020, 0x1b5b1: 0x6cabd420, 0x1b5b2: 0x6c69fc20, 0x1b5b3: 0x6c91ba20, + 0x1b5b4: 0x6c48cc20, 0x1b5b5: 0x6ca04e20, 0x1b5b6: 0x6c454620, 0x1b5b7: 0x6d35e020, + 0x1b5b8: 0x6c283420, 0x1b5b9: 0x6c9c2a20, 0x1b5ba: 0x6c11f220, 0x1b5bb: 0x6ccaa620, + 0x1b5bc: 0x6c498220, 0x1b5bd: 0x6caf1020, 0x1b5be: 0x6d261c20, 0x1b5bf: 0x6caaee20, + // Block 0x6d7, offset 0x1b5c0 + 0x1b5c0: 0x6c659020, 0x1b5c1: 0x6d32c420, 0x1b5c2: 0x6c6f7220, 0x1b5c3: 0x6c659220, + 0x1b5c4: 0x6d212620, 0x1b5c5: 0x6d0ca820, 0x1b5c6: 0x6c7c7820, 0x1b5c7: 0x6ca42620, + 0x1b5c8: 0x6c52a420, 0x1b5c9: 0x6cc74a20, 0x1b5ca: 0x6cb09620, 0x1b5cb: 0x6cee8820, + 0x1b5cc: 0x6cc9c420, 0x1b5cd: 0x6d408820, 0x1b5ce: 0x6d079c20, 0x1b5cf: 0x6c9e7620, + 0x1b5d0: 0x6ce32420, 0x1b5d1: 0x6ca7dc20, 0x1b5d2: 0x6c139c20, 0x1b5d3: 0x6cd38620, + 0x1b5d4: 0x6d3ff220, 0x1b5d5: 0x6d324220, 0x1b5d6: 0x6d13f220, 0x1b5d7: 0x6d0a1020, + 0x1b5d8: 0x6d1df620, 0x1b5d9: 0x6c0af220, 0x1b5da: 0x6d0fb620, 0x1b5db: 0x6c592220, + 0x1b5dc: 0x6d0d8220, 0x1b5dd: 0x6d296a20, 0x1b5de: 0x6c018620, 0x1b5df: 0x6d059a20, + 0x1b5e0: 0x6d0bac20, 0x1b5e1: 0x6cf2ee20, 0x1b5e2: 0x6c784c20, 0x1b5e3: 0x6c1fb420, + 0x1b5e4: 0x6c600020, 0x1b5e5: 0x6ce3fa20, 0x1b5e6: 0x6c7e5e20, 0x1b5e7: 0x6c7e7a20, + 0x1b5e8: 0x6c18c820, 0x1b5e9: 0x6c762e20, 0x1b5ea: 0x6c6f7420, 0x1b5eb: 0x6c6f7c20, + 0x1b5ec: 0x6ce8ae20, 0x1b5ed: 0x6c6a1220, 0x1b5ee: 0x6c5ab420, 0x1b5ef: 0x6c44b420, + 0x1b5f0: 0x6c1d5020, 0x1b5f1: 0x6cfed620, 0x1b5f2: 0x6c2ea420, 0x1b5f3: 0x6d004020, + 0x1b5f4: 0x6d256220, 0x1b5f5: 0x6cb98a20, 0x1b5f6: 0x6d127c20, 0x1b5f7: 0x6c139e20, + 0x1b5f8: 0x6d2bda20, 0x1b5f9: 0x6c069e20, 0x1b5fa: 0x6d10f820, 0x1b5fb: 0x6cee8a20, + 0x1b5fc: 0x6c086a20, 0x1b5fd: 0x6c802820, 0x1b5fe: 0x6cf20c20, 0x1b5ff: 0x6cbe1420, + // Block 0x6d8, offset 0x1b600 + 0x1b600: 0x6c14ca20, 0x1b601: 0x6c439220, 0x1b602: 0x6c90e420, 0x1b603: 0x6d3ff420, + 0x1b604: 0x6c44ce20, 0x1b605: 0x6c68f220, 0x1b606: 0x6c46b820, 0x1b607: 0x6cbe1a20, + 0x1b608: 0x6cc68420, 0x1b609: 0x6cc3ca20, 0x1b60a: 0x6c1d7420, 0x1b60b: 0x6c1fb620, + 0x1b60c: 0x6d2df620, 0x1b60d: 0x6cdcf020, 0x1b60e: 0x6cdcd420, 0x1b60f: 0x6c0f1220, + 0x1b610: 0x6c1f4e20, 0x1b611: 0x6cc67420, 0x1b612: 0x6c057a20, 0x1b613: 0x6c25ba20, + 0x1b614: 0x6ccaac20, 0x1b615: 0x6c780620, 0x1b616: 0x6d111020, 0x1b617: 0x6c29dc20, + 0x1b618: 0x6d33ee20, 0x1b619: 0x6caa6620, 0x1b61a: 0x6c7e4820, 0x1b61b: 0x6c64b020, + 0x1b61c: 0x6cd9b020, 0x1b61d: 0x6cc0ae20, 0x1b61e: 0x6c430820, 0x1b61f: 0x6cfc1420, + 0x1b620: 0x6cd78620, 0x1b621: 0x6cca8020, 0x1b622: 0x6c6d1420, 0x1b623: 0x6c9edc20, + 0x1b624: 0x6c365820, 0x1b625: 0x6c20ce20, 0x1b626: 0x6caafc20, 0x1b627: 0x6cccea20, + 0x1b628: 0x6cde5c20, 0x1b629: 0x6d2c7e20, 0x1b62a: 0x6ce10220, 0x1b62b: 0x6cac6420, + 0x1b62c: 0x6c048620, 0x1b62d: 0x6c265020, 0x1b62e: 0x6c863020, 0x1b62f: 0x6ce1d620, + 0x1b630: 0x6c555c20, 0x1b631: 0x6d365620, 0x1b632: 0x6cebe220, 0x1b633: 0x6c574220, + 0x1b634: 0x6cb90220, 0x1b635: 0x6cf20e20, 0x1b636: 0x6cbb3e20, 0x1b637: 0x6ce4ac20, + 0x1b638: 0x6d316220, 0x1b639: 0x6c365a20, 0x1b63a: 0x6d00ba20, 0x1b63b: 0x6cab0220, + 0x1b63c: 0x6cc2fc20, 0x1b63d: 0x6c13e220, 0x1b63e: 0x6d2ccc20, 0x1b63f: 0x6c441020, + // Block 0x6d9, offset 0x1b640 + 0x1b640: 0x6cf44e20, 0x1b641: 0x6c372420, 0x1b642: 0x6ccf5220, 0x1b643: 0x6c776820, + 0x1b644: 0x6ccf5420, 0x1b645: 0x6cd4e820, 0x1b646: 0x6c042620, 0x1b647: 0x6d111220, + 0x1b648: 0x6c0d8020, 0x1b649: 0x6cd9be20, 0x1b64a: 0x6cdfae20, 0x1b64b: 0x6cc97820, + 0x1b64c: 0x6c15ca20, 0x1b64d: 0x6cdd2a20, 0x1b64e: 0x6c6f8020, 0x1b64f: 0x6c1cd220, + 0x1b650: 0x6c205620, 0x1b651: 0x6c48d220, 0x1b652: 0x6c0de620, 0x1b653: 0x6c3cac20, + 0x1b654: 0x6cd65620, 0x1b655: 0x6c2c7e20, 0x1b656: 0x6cb7ae20, 0x1b657: 0x6cd9cc20, + 0x1b658: 0x6d2cf820, 0x1b659: 0x6c88c220, 0x1b65a: 0x6c197c20, 0x1b65b: 0x6c1ab820, + 0x1b65c: 0x6c499820, 0x1b65d: 0x6c928220, 0x1b65e: 0x6c961420, 0x1b65f: 0x6c90ee20, + 0x1b660: 0x6d400020, 0x1b661: 0x6c413420, 0x1b662: 0x6c56b620, 0x1b663: 0x6d2bea20, + 0x1b664: 0x6c209420, 0x1b665: 0x6ce19e20, 0x1b666: 0x6c57ac20, 0x1b667: 0x6c24dc20, + 0x1b668: 0x6ca38420, 0x1b669: 0x6ca07220, 0x1b66a: 0x6c676820, 0x1b66b: 0x6c4a7a20, + 0x1b66c: 0x6d1cfc20, 0x1b66d: 0x6d348020, 0x1b66e: 0x6c026020, 0x1b66f: 0x6d36ae20, + 0x1b670: 0x6ca85c20, 0x1b671: 0x6c97ea20, 0x1b672: 0x6c163020, 0x1b673: 0x6c79c220, + 0x1b674: 0x6c1e6220, 0x1b675: 0x6ccf6420, 0x1b676: 0x6ce95420, 0x1b677: 0x6c691420, + 0x1b678: 0x6ca05620, 0x1b679: 0x6ca06820, 0x1b67a: 0x6d306c20, 0x1b67b: 0x6c11fc20, + 0x1b67c: 0x6c794820, 0x1b67d: 0x6c0c0a20, 0x1b67e: 0x6c67f620, 0x1b67f: 0x6d19f420, + // Block 0x6da, offset 0x1b680 + 0x1b680: 0x6c46ce20, 0x1b681: 0x6cb90420, 0x1b682: 0x6c8aa020, 0x1b683: 0x6c608420, + 0x1b684: 0x6d1bce20, 0x1b685: 0x6c73b420, 0x1b686: 0x6cb1d020, 0x1b687: 0x6cb1ca20, + 0x1b688: 0x6c813c20, 0x1b689: 0x6c33ac20, 0x1b68a: 0x6cfcfa20, 0x1b68b: 0x6cc84420, + 0x1b68c: 0x6c4b6620, 0x1b68d: 0x6d297420, 0x1b68e: 0x6d185020, 0x1b68f: 0x6cfb7e20, + 0x1b690: 0x6c198820, 0x1b691: 0x6c198a20, 0x1b692: 0x6cc94620, 0x1b693: 0x6ca4ba20, + 0x1b694: 0x6c53ca20, 0x1b695: 0x6cd81620, 0x1b696: 0x6c4ee020, 0x1b697: 0x6c4a2620, + 0x1b698: 0x6c266420, 0x1b699: 0x6d420c20, 0x1b69a: 0x6ca73420, 0x1b69b: 0x6c8c2a20, + 0x1b69c: 0x6d332c20, 0x1b69d: 0x6c5ae420, 0x1b69e: 0x6d3c4820, 0x1b69f: 0x6c692820, + 0x1b6a0: 0x6c615020, 0x1b6a1: 0x6c126620, 0x1b6a2: 0x6c283c20, 0x1b6a3: 0x6c283e20, + 0x1b6a4: 0x6c183220, 0x1b6a5: 0x6c0e8820, 0x1b6a6: 0x6c17ee20, 0x1b6a7: 0x6c73b620, + 0x1b6a8: 0x6c3f8020, 0x1b6a9: 0x6c89d220, 0x1b6aa: 0x6c07c220, 0x1b6ab: 0x6c3f8220, + 0x1b6ac: 0x6cbc5820, 0x1b6ad: 0x6c0e8a20, 0x1b6ae: 0x6c25c620, 0x1b6af: 0x6d3d7a20, + 0x1b6b0: 0x6d3bda20, 0x1b6b1: 0x6ceff020, 0x1b6b2: 0x6cb40e20, 0x1b6b3: 0x6cbe2220, + 0x1b6b4: 0x6c33a620, 0x1b6b5: 0x6ca73620, 0x1b6b6: 0x6c574420, 0x1b6b7: 0x6d00d820, + 0x1b6b8: 0x6c912e20, 0x1b6b9: 0x6c692a20, 0x1b6ba: 0x6c249020, 0x1b6bb: 0x6cde8c20, + 0x1b6bc: 0x6c4f0420, 0x1b6bd: 0x6cbc5c20, 0x1b6be: 0x6cf29a20, 0x1b6bf: 0x6c65d620, + // Block 0x6db, offset 0x1b6c0 + 0x1b6c0: 0x6c41ea20, 0x1b6c1: 0x6d1db220, 0x1b6c2: 0x6c825620, 0x1b6c3: 0x6ca46e20, + 0x1b6c4: 0x6c91da20, 0x1b6c5: 0x6ccda820, 0x1b6c6: 0x6d3d7c20, 0x1b6c7: 0x6d2afa20, + 0x1b6c8: 0x6cb41420, 0x1b6c9: 0x6c21d620, 0x1b6ca: 0x6c5f5220, 0x1b6cb: 0x6c293420, + 0x1b6cc: 0x6ccb5620, 0x1b6cd: 0x6c126820, 0x1b6ce: 0x6cbe8c20, 0x1b6cf: 0x6cbe8420, + 0x1b6d0: 0x6c595220, 0x1b6d1: 0x6c6a3020, 0x1b6d2: 0x6cbd9420, 0x1b6d3: 0x6c7b0220, + 0x1b6d4: 0x6c27fa20, 0x1b6d5: 0x6d00dc20, 0x1b6d6: 0x6c761420, 0x1b6d7: 0x6cb06e20, + 0x1b6d8: 0x6c040620, 0x1b6d9: 0x6c02f220, 0x1b6da: 0x6c728c20, 0x1b6db: 0x6d132620, + 0x1b6dc: 0x6c370620, 0x1b6dd: 0x6c9c2c20, 0x1b6de: 0x6cda2620, 0x1b6df: 0x6c9c7a20, + 0x1b6e0: 0x6c615420, 0x1b6e1: 0x6cdf4820, 0x1b6e2: 0x6d3da820, 0x1b6e3: 0x6c29f220, + 0x1b6e4: 0x6d040a20, 0x1b6e5: 0x6c804420, 0x1b6e6: 0x6c10da20, 0x1b6e7: 0x6c71d820, + 0x1b6e8: 0x6d129220, 0x1b6e9: 0x6cc80620, 0x1b6ea: 0x6d136820, 0x1b6eb: 0x6d135a20, + 0x1b6ec: 0x6ca65220, 0x1b6ed: 0x6cf31420, 0x1b6ee: 0x6c60bc20, 0x1b6ef: 0x6c0d8820, + 0x1b6f0: 0x6ca92420, 0x1b6f1: 0x6c43b420, 0x1b6f2: 0x6d370420, 0x1b6f3: 0x6d36de20, + 0x1b6f4: 0x6c7e1a20, 0x1b6f5: 0x6ca08620, 0x1b6f6: 0x6c66ec20, 0x1b6f7: 0x6d011020, + 0x1b6f8: 0x6c8b4c20, 0x1b6f9: 0x6cdfc020, 0x1b6fa: 0x6c042a20, 0x1b6fb: 0x6cda3020, + 0x1b6fc: 0x6c91e820, 0x1b6fd: 0x6c94ca20, 0x1b6fe: 0x6cc54220, 0x1b6ff: 0x6ce2fe20, + // Block 0x6dc, offset 0x1b700 + 0x1b700: 0x6cac4c20, 0x1b701: 0x6d103620, 0x1b702: 0x6c834c20, 0x1b703: 0x6c10dc20, + 0x1b704: 0x6cd51420, 0x1b705: 0x6d297a20, 0x1b706: 0x6ca74220, 0x1b707: 0x6cfc4020, + 0x1b708: 0x6c75fa20, 0x1b709: 0x6c5d6620, 0x1b70a: 0x6c86f420, 0x1b70b: 0x6c7ea420, + 0x1b70c: 0x6c58e420, 0x1b70d: 0x6d1cb620, 0x1b70e: 0x6c917020, 0x1b70f: 0x6c904420, + 0x1b710: 0x6cb93a20, 0x1b711: 0x6cb93c20, 0x1b712: 0x6d297c20, 0x1b713: 0x6cb94620, + 0x1b714: 0x6c7fe620, 0x1b715: 0x6cfafc20, 0x1b716: 0x6d1c1e20, 0x1b717: 0x6c9a3a20, + 0x1b718: 0x6cc50820, 0x1b719: 0x6c14e020, 0x1b71a: 0x6d1d6c20, 0x1b71b: 0x6c249820, + 0x1b71c: 0x6d012420, 0x1b71d: 0x6ccf8a20, 0x1b71e: 0x6c957420, 0x1b71f: 0x6c760820, + 0x1b720: 0x6c9cb220, 0x1b721: 0x6c84a620, 0x1b722: 0x6d298220, 0x1b723: 0x6c945820, + 0x1b724: 0x6cdfc420, 0x1b725: 0x6d416420, 0x1b726: 0x6c876620, 0x1b727: 0x6c2cf820, + 0x1b728: 0x6cec0020, 0x1b729: 0x6c293c20, 0x1b72a: 0x6c697420, 0x1b72b: 0x6c751c20, + 0x1b72c: 0x6c805c20, 0x1b72d: 0x6c879e20, 0x1b72e: 0x6ca47620, 0x1b72f: 0x6d337e20, + 0x1b730: 0x6c4b2820, 0x1b731: 0x6c4ad820, 0x1b732: 0x6cb4f020, 0x1b733: 0x6d0a3a20, + 0x1b734: 0x6cb3fc20, 0x1b735: 0x6cdba820, 0x1b736: 0x6cd42a20, 0x1b737: 0x6c779a20, + 0x1b738: 0x6d1e9020, 0x1b739: 0x6c410c20, 0x1b73a: 0x6d15bc20, 0x1b73b: 0x6c455e20, + 0x1b73c: 0x6c416620, 0x1b73d: 0x6c047220, 0x1b73e: 0x6c39e220, 0x1b73f: 0x6d334220, + // Block 0x6dd, offset 0x1b740 + 0x1b740: 0x6cb36c20, 0x1b741: 0x6c2cc020, 0x1b742: 0x6c79da20, 0x1b743: 0x6c9f9a20, + 0x1b744: 0x6cf4c420, 0x1b745: 0x6c480020, 0x1b746: 0x6c50f020, 0x1b747: 0x6c12d620, + 0x1b748: 0x6cffdc20, 0x1b749: 0x6c9ce620, 0x1b74a: 0x6c1f2420, 0x1b74b: 0x6c43d620, + 0x1b74c: 0x6c2b6220, 0x1b74d: 0x6d06b620, 0x1b74e: 0x6c699a20, 0x1b74f: 0x6c9fa820, + 0x1b750: 0x6c18bc20, 0x1b751: 0x6c6ff220, 0x1b752: 0x6ccfda20, 0x1b753: 0x6c344620, + 0x1b754: 0x6d224e20, 0x1b755: 0x6c1c0e20, 0x1b756: 0x6c024020, 0x1b757: 0x6c044020, + 0x1b758: 0x6d06b820, 0x1b759: 0x6c699c20, 0x1b75a: 0x6c344820, 0x1b75b: 0x6c88b420, + 0x1b75c: 0x6ca82c20, 0x1b75d: 0x6c097820, 0x1b75e: 0x6c172c20, 0x1b75f: 0x6c2d1a20, + 0x1b760: 0x6c342e20, 0x1b761: 0x6d179c20, 0x1b762: 0x6c41d420, 0x1b763: 0x6cca5420, + 0x1b764: 0x6c786820, 0x1b765: 0x6d0e7020, 0x1b766: 0x6c339a20, 0x1b767: 0x6c5ecc20, + 0x1b768: 0x6ce81420, 0x1b769: 0x6cffea20, 0x1b76a: 0x6c345020, 0x1b76b: 0x6c690620, + 0x1b76c: 0x6c6e8420, 0x1b76d: 0x6d0fc220, 0x1b76e: 0x6cf9ce20, 0x1b76f: 0x6c9f5e20, + 0x1b770: 0x6cd5e420, 0x1b771: 0x6c004820, 0x1b772: 0x6cbb8c20, 0x1b773: 0x6c004a20, + 0x1b774: 0x6d333220, 0x1b775: 0x6c2b8820, 0x1b776: 0x6d324c20, 0x1b777: 0x6c3d8e20, + 0x1b778: 0x6cd60020, 0x1b779: 0x6c8a1020, 0x1b77a: 0x6cc13620, 0x1b77b: 0x6d049e20, + 0x1b77c: 0x6d161020, 0x1b77d: 0x6c694020, 0x1b77e: 0x6ccdfc20, 0x1b77f: 0x6c694220, + // Block 0x6de, offset 0x1b780 + 0x1b780: 0x6d3daa20, 0x1b781: 0x6d18c220, 0x1b782: 0x6c88ca20, 0x1b783: 0x6c0a6820, + 0x1b784: 0x6c848820, 0x1b785: 0x6d002220, 0x1b786: 0x6d002420, 0x1b787: 0x6cf17a20, + 0x1b788: 0x6d08f420, 0x1b789: 0x6cb58220, 0x1b78a: 0x6cb5a220, 0x1b78b: 0x6d2cea20, + 0x1b78c: 0x6c0d3620, 0x1b78d: 0x6c742620, 0x1b78e: 0x6d2cf020, 0x1b78f: 0x6c80b820, + 0x1b790: 0x6c3a5620, 0x1b791: 0x6c048020, 0x1b792: 0x6c048820, 0x1b793: 0x6c7fb420, + 0x1b794: 0x6d22a620, 0x1b795: 0x6c7ff620, 0x1b796: 0x6cf06420, 0x1b797: 0x6c30f820, + 0x1b798: 0x6cd0de20, 0x1b799: 0x6c8a9420, 0x1b79a: 0x6c640a20, 0x1b79b: 0x6c554420, + 0x1b79c: 0x6d00a020, 0x1b79d: 0x6c641820, 0x1b79e: 0x6d225820, 0x1b79f: 0x6d316420, + 0x1b7a0: 0x6c69ae20, 0x1b7a1: 0x6cf30220, 0x1b7a2: 0x6ce5ca20, 0x1b7a3: 0x6c313a20, + 0x1b7a4: 0x6c6c1e20, 0x1b7a5: 0x6c1bdc20, 0x1b7a6: 0x6d1a2e20, 0x1b7a7: 0x6c3f4420, + 0x1b7a8: 0x6cbaa420, 0x1b7a9: 0x6d2ddc20, 0x1b7aa: 0x6cc17820, 0x1b7ab: 0x6d3d3220, + 0x1b7ac: 0x6d2de620, 0x1b7ad: 0x6c32ba20, 0x1b7ae: 0x6c262820, 0x1b7af: 0x6cd7e820, + 0x1b7b0: 0x6d02dc20, 0x1b7b1: 0x6d3d5c20, 0x1b7b2: 0x6d3d7e20, 0x1b7b3: 0x6cbd9620, + 0x1b7b4: 0x6c8bda20, 0x1b7b5: 0x6d3dac20, 0x1b7b6: 0x6c1f7c20, 0x1b7b7: 0x6c32e020, + 0x1b7b8: 0x6d3a9020, 0x1b7b9: 0x6c398020, 0x1b7ba: 0x6c159820, 0x1b7bb: 0x6c4f5e20, + 0x1b7bc: 0x6d20c220, 0x1b7bd: 0x6cd1aa20, 0x1b7be: 0x6cae0e20, 0x1b7bf: 0x6d1f0820, + // Block 0x6df, offset 0x1b7c0 + 0x1b7c0: 0x6c9a7c20, 0x1b7c1: 0x6cacfa20, 0x1b7c2: 0x6cb5a420, 0x1b7c3: 0x6d2d6820, + 0x1b7c4: 0x6c98d020, 0x1b7c5: 0x6c938a20, 0x1b7c6: 0x6cae1220, 0x1b7c7: 0x6caf6020, + 0x1b7c8: 0x6c8e4e20, 0x1b7c9: 0x6c3d6220, 0x1b7ca: 0x6c39d020, 0x1b7cb: 0x6d081020, + 0x1b7cc: 0x6c6daa20, 0x1b7cd: 0x6c6dac20, 0x1b7ce: 0x6ca63620, 0x1b7cf: 0x6d40b820, + 0x1b7d0: 0x6d2fb020, 0x1b7d1: 0x6d15ee20, 0x1b7d2: 0x6c8e6a20, 0x1b7d3: 0x6cce7420, + 0x1b7d4: 0x6c668a20, 0x1b7d5: 0x6d214c20, 0x1b7d6: 0x6d15fe20, 0x1b7d7: 0x6cb61a20, + 0x1b7d8: 0x6d36e020, 0x1b7d9: 0x6c385e20, 0x1b7da: 0x6cb16620, 0x1b7db: 0x6c386020, + 0x1b7dc: 0x6d2db220, 0x1b7dd: 0x6c7b4420, 0x1b7de: 0x6cdc9a20, 0x1b7df: 0x6d21d420, + 0x1b7e0: 0x6cf39a20, 0x1b7e1: 0x6c616c20, 0x1b7e2: 0x6c61a820, 0x1b7e3: 0x6c61ec20, + 0x1b7e4: 0x6c5dce20, 0x1b7e5: 0x6cc63620, 0x1b7e6: 0x6c285e20, 0x1b7e7: 0x6c6fca20, + 0x1b7e8: 0x6d34d820, 0x1b7e9: 0x6d2a3a20, 0x1b7ea: 0x6d006820, 0x1b7eb: 0x6ce54620, + 0x1b7ec: 0x6d09d620, 0x1b7ed: 0x6d066820, 0x1b7ee: 0x6c40bc20, 0x1b7ef: 0x6c7e5820, + 0x1b7f0: 0x6c420c20, 0x1b7f1: 0x6c4e8a20, 0x1b7f2: 0x6cdf1020, 0x1b7f3: 0x6c2c1620, + 0x1b7f4: 0x6d056620, 0x1b7f5: 0x6c159420, 0x1b7f6: 0x6cd23a20, 0x1b7f7: 0x6c7bde20, + 0x1b7f8: 0x6d0f7c20, 0x1b7f9: 0x6cd24620, 0x1b7fa: 0x6cee4c20, 0x1b7fb: 0x6c9f3020, + 0x1b7fc: 0x6c9f3220, 0x1b7fd: 0x6cea8620, 0x1b7fe: 0x6c20fc20, 0x1b7ff: 0x6cf42820, + // Block 0x6e0, offset 0x1b800 + 0x1b800: 0x6d278820, 0x1b801: 0x6c06e620, 0x1b802: 0x6c01f420, 0x1b803: 0x6d2b3e20, + 0x1b804: 0x6c04ba20, 0x1b805: 0x6c6a7420, 0x1b806: 0x6c7d4c20, 0x1b807: 0x6cd0e020, + 0x1b808: 0x6c566820, 0x1b809: 0x6c39c420, 0x1b80a: 0x6c501c20, 0x1b80b: 0x6c4b2e20, + 0x1b80c: 0x6c166020, 0x1b80d: 0x6d077c20, 0x1b80e: 0x6c9fe820, 0x1b80f: 0x6c5cb220, + 0x1b810: 0x6c3b1620, 0x1b811: 0x6cbdc820, 0x1b812: 0x6c54a220, 0x1b813: 0x6d16ba20, + 0x1b814: 0x6cf58620, 0x1b815: 0x6d02b220, 0x1b816: 0x6d0c6420, 0x1b817: 0x6d2b4020, + 0x1b818: 0x6c39c620, 0x1b819: 0x6cdfd220, 0x1b81a: 0x6cd09420, 0x1b81b: 0x6c721020, + 0x1b81c: 0x6d0f9620, 0x1b81d: 0x6d296020, 0x1b81e: 0x6c0dcc20, 0x1b81f: 0x6d036a20, + 0x1b820: 0x6d1d3420, 0x1b821: 0x6d087620, 0x1b822: 0x6cb36e20, 0x1b823: 0x6d31c020, + 0x1b824: 0x6c8cb420, 0x1b825: 0x6c210020, 0x1b826: 0x6c502020, 0x1b827: 0x6c9a7e20, + 0x1b828: 0x6d422e20, 0x1b829: 0x6ca0e020, 0x1b82a: 0x6c0b8620, 0x1b82b: 0x6d069020, + 0x1b82c: 0x6c5cb420, 0x1b82d: 0x6d2f5c20, 0x1b82e: 0x6d401820, 0x1b82f: 0x6cd33820, + 0x1b830: 0x6cd33a20, 0x1b831: 0x6d22e220, 0x1b832: 0x6c3a8e20, 0x1b833: 0x6c2e7420, + 0x1b834: 0x6c993220, 0x1b835: 0x6ca68620, 0x1b836: 0x6c16e620, 0x1b837: 0x6cf14a20, + 0x1b838: 0x6c2fe420, 0x1b839: 0x6c006220, 0x1b83a: 0x6c0dce20, 0x1b83b: 0x6c01f620, + 0x1b83c: 0x6d390e20, 0x1b83d: 0x6c8f7420, 0x1b83e: 0x6cfbec20, 0x1b83f: 0x6c7be820, + // Block 0x6e1, offset 0x1b840 + 0x1b840: 0x6ce5ba20, 0x1b841: 0x6c175c20, 0x1b842: 0x6cd25c20, 0x1b843: 0x6c5a8220, + 0x1b844: 0x6c5a4e20, 0x1b845: 0x6d084820, 0x1b846: 0x6c7c6220, 0x1b847: 0x6d058020, + 0x1b848: 0x6c68dc20, 0x1b849: 0x6c6cea20, 0x1b84a: 0x6d35ba20, 0x1b84b: 0x6c6cec20, + 0x1b84c: 0x6cce3620, 0x1b84d: 0x6ce72e20, 0x1b84e: 0x6c53a020, 0x1b84f: 0x6d0e5020, + 0x1b850: 0x6c40ec20, 0x1b851: 0x6cfde020, 0x1b852: 0x6ccc9c20, 0x1b853: 0x6cffa820, + 0x1b854: 0x6d12de20, 0x1b855: 0x6d274c20, 0x1b856: 0x6c5aa220, 0x1b857: 0x6c4dfe20, + 0x1b858: 0x6c4eac20, 0x1b859: 0x6c75ae20, 0x1b85a: 0x6ced0820, 0x1b85b: 0x6cfcb020, + 0x1b85c: 0x6c7d5820, 0x1b85d: 0x6d392020, 0x1b85e: 0x6cf5ea20, 0x1b85f: 0x6c19de20, + 0x1b860: 0x6cd15820, 0x1b861: 0x6c101420, 0x1b862: 0x6d304c20, 0x1b863: 0x6d304e20, + 0x1b864: 0x6cf4dc20, 0x1b865: 0x6c4eae20, 0x1b866: 0x6c5bb620, 0x1b867: 0x6c503420, + 0x1b868: 0x6c194e20, 0x1b869: 0x6ced1820, 0x1b86a: 0x6ce4f420, 0x1b86b: 0x6d3d5e20, + 0x1b86c: 0x6d41b220, 0x1b86d: 0x6d38e820, 0x1b86e: 0x6cb48c20, 0x1b86f: 0x6c6e2020, + 0x1b870: 0x6cf60c20, 0x1b871: 0x6ccd4020, 0x1b872: 0x6ca63820, 0x1b873: 0x6cf60e20, + 0x1b874: 0x6cbe7a20, 0x1b875: 0x6cb6fc20, 0x1b876: 0x6c6db420, 0x1b877: 0x6c4afc20, + 0x1b878: 0x6d332220, 0x1b879: 0x6d179e20, 0x1b87a: 0x6d362820, 0x1b87b: 0x6c01c220, + 0x1b87c: 0x6ced1a20, 0x1b87d: 0x6c8bb220, 0x1b87e: 0x6c89b820, 0x1b87f: 0x6c166e20, + // Block 0x6e2, offset 0x1b880 + 0x1b880: 0x6cee1820, 0x1b881: 0x6cffac20, 0x1b882: 0x6d298c20, 0x1b883: 0x6c3b0620, + 0x1b884: 0x6d07a620, 0x1b885: 0x6c453420, 0x1b886: 0x6d151820, 0x1b887: 0x6cf9d020, + 0x1b888: 0x6d275420, 0x1b889: 0x6c5ac220, 0x1b88a: 0x6d064220, 0x1b88b: 0x6c9fba20, + 0x1b88c: 0x6c7c8820, 0x1b88d: 0x6d126020, 0x1b88e: 0x6d1d3a20, 0x1b88f: 0x6cd55c20, + 0x1b890: 0x6cefd820, 0x1b891: 0x6cd55a20, 0x1b892: 0x6cbe8220, 0x1b893: 0x6c998e20, + 0x1b894: 0x6ca40020, 0x1b895: 0x6c65ac20, 0x1b896: 0x6caa9420, 0x1b897: 0x6c01c620, + 0x1b898: 0x6d0fc420, 0x1b899: 0x6c210a20, 0x1b89a: 0x6d111e20, 0x1b89b: 0x6cdd7820, + 0x1b89c: 0x6c6d2820, 0x1b89d: 0x6ca00e20, 0x1b89e: 0x6c691620, 0x1b89f: 0x6c766620, + 0x1b8a0: 0x6c430e20, 0x1b8a1: 0x6cf25620, 0x1b8a2: 0x6c171c20, 0x1b8a3: 0x6cb7b020, + 0x1b8a4: 0x6c505220, 0x1b8a5: 0x6d0e9420, 0x1b8a6: 0x6c864a20, 0x1b8a7: 0x6c00ba20, + 0x1b8a8: 0x6c623620, 0x1b8a9: 0x6c626020, 0x1b8aa: 0x6c9af820, 0x1b8ab: 0x6d299620, + 0x1b8ac: 0x6d01f820, 0x1b8ad: 0x6c505820, 0x1b8ae: 0x6ca2a220, 0x1b8af: 0x6ca14020, + 0x1b8b0: 0x6c233820, 0x1b8b1: 0x6ca6b820, 0x1b8b2: 0x6d2ed420, 0x1b8b3: 0x6c5c1420, + 0x1b8b4: 0x6c066220, 0x1b8b5: 0x6c4ef820, 0x1b8b6: 0x6d081e20, 0x1b8b7: 0x6c200420, + 0x1b8b8: 0x6c8a1820, 0x1b8b9: 0x6cfacc20, 0x1b8ba: 0x6c28ae20, 0x1b8bb: 0x6c6e2e20, + 0x1b8bc: 0x6cb1d220, 0x1b8bd: 0x6c8bdc20, 0x1b8be: 0x6cea2820, 0x1b8bf: 0x6cf80e20, + // Block 0x6e3, offset 0x1b8c0 + 0x1b8c0: 0x6d189220, 0x1b8c1: 0x6c627620, 0x1b8c2: 0x6c5a7620, 0x1b8c3: 0x6c278820, + 0x1b8c4: 0x6d131220, 0x1b8c5: 0x6d131420, 0x1b8c6: 0x6c867820, 0x1b8c7: 0x6ce00e20, + 0x1b8c8: 0x6ce78220, 0x1b8c9: 0x6cffba20, 0x1b8ca: 0x6c3ace20, 0x1b8cb: 0x6cd07420, + 0x1b8cc: 0x6d2fde20, 0x1b8cd: 0x6c506620, 0x1b8ce: 0x6d18c420, 0x1b8cf: 0x6cfdfc20, + 0x1b8d0: 0x6d03a220, 0x1b8d1: 0x6cd02620, 0x1b8d2: 0x6c694a20, 0x1b8d3: 0x6c067020, + 0x1b8d4: 0x6c6eaa20, 0x1b8d5: 0x6d0ed020, 0x1b8d6: 0x6c00de20, 0x1b8d7: 0x6d135c20, + 0x1b8d8: 0x6cc7dc20, 0x1b8d9: 0x6cd57420, 0x1b8da: 0x6c9b5820, 0x1b8db: 0x6d09b820, + 0x1b8dc: 0x6d122e20, 0x1b8dd: 0x6cb4bc20, 0x1b8de: 0x6c86ca20, 0x1b8df: 0x6c18f620, + 0x1b8e0: 0x6c7c0e20, 0x1b8e1: 0x6c2f0420, 0x1b8e2: 0x6c8a7e20, 0x1b8e3: 0x6d0ef820, + 0x1b8e4: 0x6c5e3e20, 0x1b8e5: 0x6c917e20, 0x1b8e6: 0x6cf73220, 0x1b8e7: 0x6cc6dc20, + 0x1b8e8: 0x6c8fd620, 0x1b8e9: 0x6ca47220, 0x1b8ea: 0x6c95d620, 0x1b8eb: 0x6c945a20, + 0x1b8ec: 0x6cccae20, 0x1b8ed: 0x6ce18e20, 0x1b8ee: 0x6d0e2420, 0x1b8ef: 0x6d3a4420, + 0x1b8f0: 0x6d264220, 0x1b8f1: 0x6d264420, 0x1b8f2: 0x6cc0c620, 0x1b8f3: 0x6d12bc20, + 0x1b8f4: 0x6c452620, 0x1b8f5: 0x6d12c420, 0x1b8f6: 0x6c54a420, 0x1b8f7: 0x6c50d620, + 0x1b8f8: 0x6cd4b820, 0x1b8f9: 0x6c127420, 0x1b8fa: 0x6c127020, 0x1b8fb: 0x6cd18620, + 0x1b8fc: 0x6c97da20, 0x1b8fd: 0x6c134820, 0x1b8fe: 0x6c135020, 0x1b8ff: 0x6ce3fc20, + // Block 0x6e4, offset 0x1b900 + 0x1b900: 0x6d41b020, 0x1b901: 0x6c11d020, 0x1b902: 0x6d06d620, 0x1b903: 0x6c5be220, + 0x1b904: 0x6d1af620, 0x1b905: 0x6cbcd220, 0x1b906: 0x6c3b4220, 0x1b907: 0x6cb03820, + 0x1b908: 0x6d266820, 0x1b909: 0x6d1f9820, 0x1b90a: 0x6cc85020, 0x1b90b: 0x6cae8e20, + 0x1b90c: 0x6c3b5a20, 0x1b90d: 0x6c3df220, 0x1b90e: 0x6c8cb620, 0x1b90f: 0x6c3a4820, + 0x1b910: 0x6cc17a20, 0x1b911: 0x6ce3da20, 0x1b912: 0x6caa7e20, 0x1b913: 0x6ce5bc20, + 0x1b914: 0x6cd77620, 0x1b915: 0x6d322e20, 0x1b916: 0x6c80fa20, 0x1b917: 0x6c80f820, + 0x1b918: 0x6d416c20, 0x1b919: 0x6c9ff620, 0x1b91a: 0x6c598c20, 0x1b91b: 0x6cee5220, + 0x1b91c: 0x6cea2020, 0x1b91d: 0x6c176220, 0x1b91e: 0x6c5ed220, 0x1b91f: 0x6cb4f220, + 0x1b920: 0x6d1bba20, 0x1b921: 0x6d3f9820, 0x1b922: 0x6cee5820, 0x1b923: 0x6ce78420, + 0x1b924: 0x6c811220, 0x1b925: 0x6c81fa20, 0x1b926: 0x6c9b5a20, 0x1b927: 0x6c8fd820, + 0x1b928: 0x6ca25c20, 0x1b929: 0x6c2ac820, 0x1b92a: 0x6cf06c20, 0x1b92b: 0x6ca0bc20, + 0x1b92c: 0x6c079220, 0x1b92d: 0x6d2c1620, 0x1b92e: 0x6cd59020, 0x1b92f: 0x6cd59220, + 0x1b930: 0x6ca26220, 0x1b931: 0x6d397e20, 0x1b932: 0x6cc56620, 0x1b933: 0x6c031420, + 0x1b934: 0x6cb48220, 0x1b935: 0x6c352a20, 0x1b936: 0x6c347020, 0x1b937: 0x6c29ba20, + 0x1b938: 0x6c857220, 0x1b939: 0x6c4abe20, 0x1b93a: 0x6c5e7820, 0x1b93b: 0x6c6f4820, + 0x1b93c: 0x6c08b220, 0x1b93d: 0x6d051c20, 0x1b93e: 0x6c19b420, 0x1b93f: 0x6c22a820, + // Block 0x6e5, offset 0x1b940 + 0x1b940: 0x6ccbc020, 0x1b941: 0x6cc83420, 0x1b942: 0x6d28ac20, 0x1b943: 0x6cc2b420, + 0x1b944: 0x6cb8a620, 0x1b945: 0x6d20b620, 0x1b946: 0x6c416820, 0x1b947: 0x6cf35420, + 0x1b948: 0x6c137c20, 0x1b949: 0x6cccbc20, 0x1b94a: 0x6d09dc20, 0x1b94b: 0x6c388420, + 0x1b94c: 0x6cf4aa20, 0x1b94d: 0x6d3ee620, 0x1b94e: 0x6c87d820, 0x1b94f: 0x6d041220, + 0x1b950: 0x6c110820, 0x1b951: 0x6c259220, 0x1b952: 0x6cc5c220, 0x1b953: 0x6c0bea20, + 0x1b954: 0x6ceaa220, 0x1b955: 0x6c2c1820, 0x1b956: 0x6d2f2220, 0x1b957: 0x6c983220, + 0x1b958: 0x6c1be220, 0x1b959: 0x6d168a20, 0x1b95a: 0x6c412c20, 0x1b95b: 0x6c456020, + 0x1b95c: 0x6c323420, 0x1b95d: 0x6c83a220, 0x1b95e: 0x6cb6d620, 0x1b95f: 0x6cd59820, + 0x1b960: 0x6c425620, 0x1b961: 0x6ce56a20, 0x1b962: 0x6c681a20, 0x1b963: 0x6ccdf820, + 0x1b964: 0x6cedb620, 0x1b965: 0x6c7ee020, 0x1b966: 0x6c704420, 0x1b967: 0x6c983420, + 0x1b968: 0x6d0f7e20, 0x1b969: 0x6c96b220, 0x1b96a: 0x6c9e8820, 0x1b96b: 0x6cd88e20, + 0x1b96c: 0x6d254020, 0x1b96d: 0x6c4f6020, 0x1b96e: 0x6c3a8620, 0x1b96f: 0x6c069020, + 0x1b970: 0x6c6a7e20, 0x1b971: 0x6c2fe020, 0x1b972: 0x6c430020, 0x1b973: 0x6d118e20, + 0x1b974: 0x6cfa7c20, 0x1b975: 0x6c1ed620, 0x1b976: 0x6c20fe20, 0x1b977: 0x6cabd020, + 0x1b978: 0x6cd4a820, 0x1b979: 0x6c578220, 0x1b97a: 0x6d02b420, 0x1b97b: 0x6c1e2020, + 0x1b97c: 0x6d3aae20, 0x1b97d: 0x6c1e2220, 0x1b97e: 0x6cd90420, 0x1b97f: 0x6c04bc20, + // Block 0x6e6, offset 0x1b980 + 0x1b980: 0x6cd90620, 0x1b981: 0x6c5fd420, 0x1b982: 0x6cf2d620, 0x1b983: 0x6c6cda20, + 0x1b984: 0x6c469420, 0x1b985: 0x6c5e8e20, 0x1b986: 0x6c98c620, 0x1b987: 0x6cafb820, + 0x1b988: 0x6c093a20, 0x1b989: 0x6cee6220, 0x1b98a: 0x6c021220, 0x1b98b: 0x6c398820, + 0x1b98c: 0x6c3b5c20, 0x1b98d: 0x6d16bc20, 0x1b98e: 0x6c3df420, 0x1b98f: 0x6ca3e420, + 0x1b990: 0x6cf58820, 0x1b991: 0x6c566a20, 0x1b992: 0x6d0ad420, 0x1b993: 0x6c30dc20, + 0x1b994: 0x6d02fe20, 0x1b995: 0x6d31ba20, 0x1b996: 0x6d109020, 0x1b997: 0x6c8ba020, + 0x1b998: 0x6cc8c220, 0x1b999: 0x6c35ac20, 0x1b99a: 0x6c99d620, 0x1b99b: 0x6d2f9a20, + 0x1b99c: 0x6c4cae20, 0x1b99d: 0x6d339620, 0x1b99e: 0x6c230420, 0x1b99f: 0x6d281c20, + 0x1b9a0: 0x6d41e420, 0x1b9a1: 0x6c30de20, 0x1b9a2: 0x6cd4aa20, 0x1b9a3: 0x6d2a3c20, + 0x1b9a4: 0x6c352c20, 0x1b9a5: 0x6c858e20, 0x1b9a6: 0x6c934620, 0x1b9a7: 0x6c656620, + 0x1b9a8: 0x6c19be20, 0x1b9a9: 0x6cd9a020, 0x1b9aa: 0x6cbaa620, 0x1b9ab: 0x6c3c2220, + 0x1b9ac: 0x6ca3e620, 0x1b9ad: 0x6cfe8620, 0x1b9ae: 0x6cfa8a20, 0x1b9af: 0x6c7a2e20, + 0x1b9b0: 0x6cb28420, 0x1b9b1: 0x6cdf1c20, 0x1b9b2: 0x6cf7d420, 0x1b9b3: 0x6d350220, + 0x1b9b4: 0x6c48da20, 0x1b9b5: 0x6cfe8c20, 0x1b9b6: 0x6c643a20, 0x1b9b7: 0x6c633420, + 0x1b9b8: 0x6c467620, 0x1b9b9: 0x6c05aa20, 0x1b9ba: 0x6ca0e220, 0x1b9bb: 0x6d16f220, + 0x1b9bc: 0x6d12d820, 0x1b9bd: 0x6d12e020, 0x1b9be: 0x6cd33c20, 0x1b9bf: 0x6ca7fa20, + // Block 0x6e7, offset 0x1b9c0 + 0x1b9c0: 0x6c08c220, 0x1b9c1: 0x6c34d820, 0x1b9c2: 0x6d149e20, 0x1b9c3: 0x6c8cb820, + 0x1b9c4: 0x6c0dd020, 0x1b9c5: 0x6ca63020, 0x1b9c6: 0x6c7e4020, 0x1b9c7: 0x6c50d820, + 0x1b9c8: 0x6c04f020, 0x1b9c9: 0x6c388620, 0x1b9ca: 0x6d37a420, 0x1b9cb: 0x6c274620, + 0x1b9cc: 0x6c222c20, 0x1b9cd: 0x6d100a20, 0x1b9ce: 0x6c3d4a20, 0x1b9cf: 0x6c041a20, + 0x1b9d0: 0x6ca1fe20, 0x1b9d1: 0x6c418620, 0x1b9d2: 0x6cb4d420, 0x1b9d3: 0x6cc4ba20, + 0x1b9d4: 0x6cc74220, 0x1b9d5: 0x6c995220, 0x1b9d6: 0x6cce9a20, 0x1b9d7: 0x6cd90e20, + 0x1b9d8: 0x6d30e620, 0x1b9d9: 0x6cf99620, 0x1b9da: 0x6d202a20, 0x1b9db: 0x6ccfba20, + 0x1b9dc: 0x6c4b3020, 0x1b9dd: 0x6ceb9a20, 0x1b9de: 0x6d2cb420, 0x1b9df: 0x6ca3ec20, + 0x1b9e0: 0x6ca8fe20, 0x1b9e1: 0x6d1e2420, 0x1b9e2: 0x6c2be420, 0x1b9e3: 0x6d359e20, + 0x1b9e4: 0x6d2bcc20, 0x1b9e5: 0x6c13cc20, 0x1b9e6: 0x6c287020, 0x1b9e7: 0x6c46f820, + 0x1b9e8: 0x6c107620, 0x1b9e9: 0x6c6fdc20, 0x1b9ea: 0x6c022820, 0x1b9eb: 0x6c3e0c20, + 0x1b9ec: 0x6c657020, 0x1b9ed: 0x6c032e20, 0x1b9ee: 0x6c34da20, 0x1b9ef: 0x6c77de20, + 0x1b9f0: 0x6ca3b020, 0x1b9f1: 0x6d3abe20, 0x1b9f2: 0x6c094820, 0x1b9f3: 0x6c8efa20, + 0x1b9f4: 0x6c147620, 0x1b9f5: 0x6cccd020, 0x1b9f6: 0x6cd89e20, 0x1b9f7: 0x6c1f1820, + 0x1b9f8: 0x6cadb620, 0x1b9f9: 0x6cd31a20, 0x1b9fa: 0x6c48dc20, 0x1b9fb: 0x6d2bce20, + 0x1b9fc: 0x6d119820, 0x1b9fd: 0x6c195620, 0x1b9fe: 0x6c6fde20, 0x1b9ff: 0x6cd33e20, + // Block 0x6e8, offset 0x1ba00 + 0x1ba00: 0x6d33a620, 0x1ba01: 0x6c8efc20, 0x1ba02: 0x6c99de20, 0x1ba03: 0x6c87da20, + 0x1ba04: 0x6cc65620, 0x1ba05: 0x6d2cb620, 0x1ba06: 0x6d2aa020, 0x1ba07: 0x6c0bec20, + 0x1ba08: 0x6d2e4c20, 0x1ba09: 0x6d35a020, 0x1ba0a: 0x6c8f7620, 0x1ba0b: 0x6c306220, + 0x1ba0c: 0x6c914420, 0x1ba0d: 0x6cd0ea20, 0x1ba0e: 0x6c85a620, 0x1ba0f: 0x6c7f9020, + 0x1ba10: 0x6d1e1c20, 0x1ba11: 0x6cd5ae20, 0x1ba12: 0x6d09f620, 0x1ba13: 0x6cd68420, + 0x1ba14: 0x6cb76820, 0x1ba15: 0x6d313820, 0x1ba16: 0x6cb4dc20, 0x1ba17: 0x6c85ca20, + 0x1ba18: 0x6d14c220, 0x1ba19: 0x6cfdba20, 0x1ba1a: 0x6d323020, 0x1ba1b: 0x6c85cc20, + 0x1ba1c: 0x6ccb1a20, 0x1ba1d: 0x6c484e20, 0x1ba1e: 0x6c76a420, 0x1ba1f: 0x6c078420, + 0x1ba20: 0x6cc58e20, 0x1ba21: 0x6cffde20, 0x1ba22: 0x6c041c20, 0x1ba23: 0x6cc59020, + 0x1ba24: 0x6c0e1220, 0x1ba25: 0x6d3e1620, 0x1ba26: 0x6c1d9820, 0x1ba27: 0x6d172c20, + 0x1ba28: 0x6c22be20, 0x1ba29: 0x6d063420, 0x1ba2a: 0x6d399220, 0x1ba2b: 0x6c666c20, + 0x1ba2c: 0x6d41a820, 0x1ba2d: 0x6c374a20, 0x1ba2e: 0x6c378e20, 0x1ba2f: 0x6d1fb820, + 0x1ba30: 0x6c380c20, 0x1ba31: 0x6c45e220, 0x1ba32: 0x6c77a620, 0x1ba33: 0x6c81ac20, + 0x1ba34: 0x6d2d6a20, 0x1ba35: 0x6c8aec20, 0x1ba36: 0x6d19be20, 0x1ba37: 0x6d104420, + 0x1ba38: 0x6c50f220, 0x1ba39: 0x6c449820, 0x1ba3a: 0x6d172e20, 0x1ba3b: 0x6cd34e20, + 0x1ba3c: 0x6c43dc20, 0x1ba3d: 0x6d28fc20, 0x1ba3e: 0x6c943620, 0x1ba3f: 0x6c3e3420, + // Block 0x6e9, offset 0x1ba40 + 0x1ba40: 0x6c6aa620, 0x1ba41: 0x6c525c20, 0x1ba42: 0x6c4b3e20, 0x1ba43: 0x6ce21020, + 0x1ba44: 0x6c49e420, 0x1ba45: 0x6ceef420, 0x1ba46: 0x6c7b9820, 0x1ba47: 0x6cc79620, + 0x1ba48: 0x6c01ac20, 0x1ba49: 0x6c012020, 0x1ba4a: 0x6c734a20, 0x1ba4b: 0x6d14c420, + 0x1ba4c: 0x6d3cf820, 0x1ba4d: 0x6c7a3620, 0x1ba4e: 0x6d35bc20, 0x1ba4f: 0x6cbf0420, + 0x1ba50: 0x6ce73020, 0x1ba51: 0x6cca6c20, 0x1ba52: 0x6cca6a20, 0x1ba53: 0x6c586a20, + 0x1ba54: 0x6c710420, 0x1ba55: 0x6c6fea20, 0x1ba56: 0x6d094c20, 0x1ba57: 0x6c34e020, + 0x1ba58: 0x6d3c7c20, 0x1ba59: 0x6d20f220, 0x1ba5a: 0x6d296420, + 0x1ba5c: 0x6d1ba620, 0x1ba5d: 0x6c6c1820, 0x1ba5e: 0x6c8f6220, 0x1ba5f: 0x6d2e5020, + 0x1ba60: 0x6d0ade20, 0x1ba61: 0x6cc52620, 0x1ba62: 0x6d313a20, 0x1ba63: 0x6c295e20, + 0x1ba64: 0x6cb4de20, 0x1ba65: 0x6cbbd820, 0x1ba66: 0x6c578c20, 0x1ba67: 0x6c4b4020, + 0x1ba68: 0x6c67a220, 0x1ba69: 0x6d3c1220, 0x1ba6a: 0x6d09f820, 0x1ba6b: 0x6cdd1620, + 0x1ba6c: 0x6ccbe620, 0x1ba6d: 0x6d314e20, 0x1ba6e: 0x6c069a20, 0x1ba6f: 0x6ce64020, + 0x1ba70: 0x6c7df220, 0x1ba71: 0x6c6e7020, 0x1ba72: 0x6cb3c220, 0x1ba73: 0x6c07b020, + 0x1ba74: 0x6c3e4e20, 0x1ba75: 0x6cc89a20, 0x1ba76: 0x6ce7b620, 0x1ba77: 0x6c742820, + 0x1ba78: 0x6cf5ec20, 0x1ba79: 0x6c80ba20, 0x1ba7a: 0x6c8f0420, 0x1ba7b: 0x6c3c3c20, + 0x1ba7c: 0x6cb4e820, 0x1ba7d: 0x6cf1d420, 0x1ba7e: 0x6c756c20, 0x1ba7f: 0x6c41d620, + // Block 0x6ea, offset 0x1ba80 + 0x1ba80: 0x6cdaa220, 0x1ba81: 0x6c894c20, 0x1ba82: 0x6cc04620, 0x1ba83: 0x6ce6be20, + 0x1ba84: 0x6d1fc020, 0x1ba85: 0x6c99ec20, 0x1ba86: 0x6c052420, 0x1ba87: 0x6c906620, + 0x1ba88: 0x6cae6820, 0x1ba89: 0x6d3c1620, 0x1ba8a: 0x6c2c4020, 0x1ba8b: 0x6d078c20, + 0x1ba8c: 0x6ce8a220, 0x1ba8d: 0x6d2a7e20, 0x1ba8e: 0x6c022a20, 0x1ba8f: 0x6c481020, + 0x1ba90: 0x6c097a20, 0x1ba91: 0x6c2b6820, 0x1ba92: 0x6c4e0020, 0x1ba93: 0x6d3f0820, + 0x1ba94: 0x6d33d420, 0x1ba95: 0x6cc5e620, 0x1ba96: 0x6c070e20, 0x1ba97: 0x6c450820, + 0x1ba98: 0x6c658620, 0x1ba99: 0x6c591020, 0x1ba9a: 0x6ced0a20, 0x1ba9b: 0x6caaba20, + 0x1ba9c: 0x6c634a20, 0x1ba9d: 0x6ce57c20, 0x1ba9e: 0x6c61ee20, 0x1ba9f: 0x6cfeb220, + 0x1baa0: 0x6c938e20, 0x1baa1: 0x6c5ce620, 0x1baa2: 0x6cce6820, 0x1baa3: 0x6c133020, + 0x1baa4: 0x6c3b6c20, 0x1baa5: 0x6cd91a20, 0x1baa6: 0x6c9c0220, 0x1baa7: 0x6cf3c020, + 0x1baa8: 0x6c83bc20, 0x1baa9: 0x6c83be20, 0x1baaa: 0x6c311020, 0x1baab: 0x6cbdd020, + 0x1baac: 0x6d1cea20, 0x1baad: 0x6cdd1820, 0x1baae: 0x6c708c20, 0x1baaf: 0x6ce2ea20, + 0x1bab0: 0x6d019020, 0x1bab1: 0x6c7da820, 0x1bab2: 0x6d3d5020, 0x1bab3: 0x6cd4ca20, + 0x1bab4: 0x6c14c020, 0x1bab5: 0x6c394220, 0x1bab6: 0x6cefae20, 0x1bab7: 0x6c6e7220, + 0x1bab8: 0x6c83c020, 0x1bab9: 0x6c0d3220, 0x1baba: 0x6cfa6420, 0x1babb: 0x6c3d1020, + 0x1babc: 0x6ce21c20, 0x1babd: 0x6d35e220, 0x1babe: 0x6c7efa20, 0x1babf: 0x6c87fc20, + // Block 0x6eb, offset 0x1bac0 + 0x1bac0: 0x6c658820, 0x1bac1: 0x6d3cfc20, 0x1bac2: 0x6c8ce620, 0x1bac3: 0x6c83d420, + 0x1bac4: 0x6cb79220, 0x1bac5: 0x6c0e2220, 0x1bac6: 0x6c94f820, 0x1bac7: 0x6c231620, + 0x1bac8: 0x6cba5420, 0x1bac9: 0x6c9dc420, 0x1baca: 0x6cb5e620, 0x1bacb: 0x6cb5e820, + 0x1bacc: 0x6c114620, 0x1bacd: 0x6c4bf820, 0x1bace: 0x6c14f420, 0x1bacf: 0x6c2a7020, + 0x1bad0: 0x6c3a5820, 0x1bad1: 0x6cabfe20, 0x1bad2: 0x6c057020, 0x1bad3: 0x6c057220, + 0x1bad4: 0x6c5cca20, 0x1bad5: 0x6d3f8e20, 0x1bad6: 0x6c1a0020, 0x1bad7: 0x6d2a4c20, + 0x1bad8: 0x6c603820, 0x1bad9: 0x6c861020, 0x1bada: 0x6caea020, 0x1badb: 0x6d233e20, + 0x1badc: 0x6d234020, 0x1badd: 0x6c481420, 0x1bade: 0x6c75ba20, 0x1badf: 0x6c307620, + 0x1bae0: 0x6ce0f620, 0x1bae1: 0x6c428020, 0x1bae2: 0x6cee1a20, 0x1bae3: 0x6c2c5620, + 0x1bae4: 0x6c262a20, 0x1bae5: 0x6c389c20, 0x1bae6: 0x6c195c20, 0x1bae7: 0x6d2e6220, + 0x1bae8: 0x6cb6fe20, 0x1bae9: 0x6d24f620, 0x1baea: 0x6d0d8820, 0x1baeb: 0x6d234220, + 0x1baec: 0x6cc29e20, 0x1baed: 0x6d17a020, 0x1baee: 0x6ccbaa20, 0x1baef: 0x6cc59820, + 0x1baf0: 0x6c20d220, 0x1baf1: 0x6c837820, 0x1baf2: 0x6cb4f420, 0x1baf3: 0x6d3d0220, + 0x1baf4: 0x6c3e7a20, 0x1baf5: 0x6c77f820, 0x1baf6: 0x6c7f0820, 0x1baf7: 0x6d405220, + 0x1baf8: 0x6d405420, 0x1baf9: 0x6d2fb220, 0x1bafa: 0x6c491620, 0x1bafb: 0x6c3b2a20, + 0x1bafc: 0x6c3b7420, 0x1bafd: 0x6ccfe620, 0x1bafe: 0x6cbe7c20, 0x1baff: 0x6ca5e420, + // Block 0x6ec, offset 0x1bb00 + 0x1bb00: 0x6ced1c20, 0x1bb01: 0x6c4cc020, 0x1bb02: 0x6c925420, 0x1bb03: 0x6c4fc620, + 0x1bb04: 0x6c6a1620, 0x1bb05: 0x6d15f020, 0x1bb06: 0x6c1dae20, 0x1bb07: 0x6c71b620, + 0x1bb08: 0x6c712220, 0x1bb09: 0x6c1a0220, 0x1bb0a: 0x6d423a20, 0x1bb0b: 0x6c895420, + 0x1bb0c: 0x6cbab820, 0x1bb0d: 0x6d346020, 0x1bb0e: 0x6c20d420, 0x1bb0f: 0x6d0af020, + 0x1bb10: 0x6c709220, 0x1bb11: 0x6c06a020, 0x1bb12: 0x6c684620, 0x1bb13: 0x6d3d6020, + 0x1bb14: 0x6d3e3a20, 0x1bb15: 0x6c0d3820, 0x1bb16: 0x6caea220, 0x1bb17: 0x6c2fa620, + 0x1bb18: 0x6c1eda20, 0x1bb19: 0x6c172e20, 0x1bb1a: 0x6c9b0620, 0x1bb1b: 0x6c57dc20, + 0x1bb1c: 0x6c659420, 0x1bb1d: 0x6c4a6820, 0x1bb1e: 0x6cf88820, 0x1bb1f: 0x6c319c20, + 0x1bb20: 0x6cba5620, 0x1bb21: 0x6c2a5820, 0x1bb22: 0x6c4bb420, 0x1bb23: 0x6c2da020, + 0x1bb24: 0x6c954620, 0x1bb25: 0x6d33e020, 0x1bb26: 0x6cc38220, 0x1bb27: 0x6ca04420, + 0x1bb28: 0x6c40b220, 0x1bb29: 0x6c454820, 0x1bb2a: 0x6caf1220, 0x1bb2b: 0x6d2dee20, + 0x1bb2c: 0x6d199420, 0x1bb2d: 0x6ceb7e20, 0x1bb2e: 0x6ccbac20, 0x1bb2f: 0x6c349a20, + 0x1bb30: 0x6d125e20, 0x1bb31: 0x6c400c20, 0x1bb32: 0x6cefda20, 0x1bb33: 0x6cee9a20, + 0x1bb34: 0x6c32c820, 0x1bb35: 0x6c641a20, 0x1bb36: 0x6d3f9a20, 0x1bb37: 0x6c64b220, + 0x1bb38: 0x6d151a20, 0x1bb39: 0x6cd0ae20, 0x1bb3a: 0x6cf78620, 0x1bb3b: 0x6d0e8220, + 0x1bb3c: 0x6d0da220, 0x1bb3d: 0x6c200020, 0x1bb3e: 0x6c64b420, 0x1bb3f: 0x6c210c20, + // Block 0x6ed, offset 0x1bb40 + 0x1bb40: 0x6d226a20, 0x1bb41: 0x6c513a20, 0x1bb42: 0x6d2be020, 0x1bb43: 0x6cf2fa20, + 0x1bb44: 0x6cb11420, 0x1bb45: 0x6c087a20, 0x1bb46: 0x6d10ac20, 0x1bb47: 0x6c5dd020, + 0x1bb48: 0x6d05b220, 0x1bb49: 0x6cc92020, 0x1bb4a: 0x6d0fc620, 0x1bb4b: 0x6c7e7c20, + 0x1bb4c: 0x6d0caa20, 0x1bb4d: 0x6c079e20, 0x1bb4e: 0x6c5ac420, 0x1bb4f: 0x6c7c8a20, + 0x1bb50: 0x6c6bea20, 0x1bb51: 0x6c7c8c20, 0x1bb52: 0x6cd7f220, 0x1bb53: 0x6c3c5420, + 0x1bb54: 0x6d004820, 0x1bb55: 0x6ceb8220, 0x1bb56: 0x6d35e420, 0x1bb57: 0x6c668c20, + 0x1bb58: 0x6ca29a20, 0x1bb59: 0x6c999020, 0x1bb5a: 0x6c1f9420, 0x1bb5b: 0x6c569e20, + 0x1bb5c: 0x6c556c20, 0x1bb5d: 0x6c890420, 0x1bb5e: 0x6c837a20, 0x1bb5f: 0x6ce67e20, + 0x1bb60: 0x6ca40220, 0x1bb61: 0x6d215220, 0x1bb62: 0x6d1f4620, 0x1bb63: 0x6c9a0820, + 0x1bb64: 0x6cd96620, 0x1bb65: 0x6d089a20, 0x1bb66: 0x6d089c20, 0x1bb67: 0x6d101e20, + 0x1bb68: 0x6d316620, 0x1bb69: 0x6cb11620, 0x1bb6a: 0x6d12fe20, 0x1bb6b: 0x6c605220, + 0x1bb6c: 0x6c6ae620, 0x1bb6d: 0x6d130020, 0x1bb6e: 0x6c1ee020, 0x1bb6f: 0x6c33fa20, + 0x1bb70: 0x6d212820, 0x1bb71: 0x6d408a20, 0x1bb72: 0x6cee9c20, 0x1bb73: 0x6c9a0a20, + 0x1bb74: 0x6ce40220, 0x1bb75: 0x6c603a20, 0x1bb76: 0x6c6ae820, 0x1bb77: 0x6c766220, + 0x1bb78: 0x6cbfb420, 0x1bb79: 0x6d1c7e20, 0x1bb7a: 0x6cc77a20, 0x1bb7b: 0x6c59d020, + 0x1bb7c: 0x6c909620, 0x1bb7d: 0x6c822220, 0x1bb7e: 0x6cc38420, 0x1bb7f: 0x6cfe7620, + // Block 0x6ee, offset 0x1bb80 + 0x1bb80: 0x6cb23c20, 0x1bb81: 0x6cd41820, 0x1bb82: 0x6c414420, 0x1bb83: 0x6cdfe820, + 0x1bb84: 0x6c802e20, 0x1bb85: 0x6cf15620, 0x1bb86: 0x6d215420, 0x1bb87: 0x6c192c20, + 0x1bb88: 0x6c935620, 0x1bb89: 0x6c71be20, 0x1bb8a: 0x6cd0cc20, 0x1bb8b: 0x6c1f9620, + 0x1bb8c: 0x6cb0ea20, 0x1bb8d: 0x6d01d420, 0x1bb8e: 0x6c642420, 0x1bb8f: 0x6d182420, + 0x1bb90: 0x6d2e0220, 0x1bb91: 0x6c3ec020, 0x1bb92: 0x6cab0620, 0x1bb93: 0x6c9d6620, + 0x1bb94: 0x6c80c220, 0x1bb95: 0x6cc69020, 0x1bb96: 0x6c47ae20, 0x1bb97: 0x6c66a820, + 0x1bb98: 0x6c71c020, 0x1bb99: 0x6cddf220, 0x1bb9a: 0x6d11c020, 0x1bb9b: 0x6d317a20, + 0x1bb9c: 0x6c055220, 0x1bb9d: 0x6ccc0820, 0x1bb9e: 0x6d259220, 0x1bb9f: 0x6d3f2020, + 0x1bba0: 0x6ca01020, 0x1bba1: 0x6cdae620, 0x1bba2: 0x6c644c20, 0x1bba3: 0x6d112020, + 0x1bba4: 0x6c6b0a20, 0x1bba5: 0x6c5a7420, 0x1bba6: 0x6c422a20, 0x1bba7: 0x6c3a6220, + 0x1bba8: 0x6d2cd020, 0x1bba9: 0x6cb9ae20, 0x1bbaa: 0x6c96ce20, 0x1bbab: 0x6cdcf420, + 0x1bbac: 0x6d259420, 0x1bbad: 0x6d01d620, 0x1bbae: 0x6cc69220, 0x1bbaf: 0x6cd27c20, + 0x1bbb0: 0x6d33fe20, 0x1bbb1: 0x6c24de20, 0x1bbb2: 0x6d27ba20, 0x1bbb3: 0x6ce68020, + 0x1bbb4: 0x6c8e7a20, 0x1bbb5: 0x6cc68620, 0x1bbb6: 0x6ce10e20, 0x1bbb7: 0x6cc3de20, + 0x1bbb8: 0x6d2cfa20, 0x1bbb9: 0x6cd80220, 0x1bbba: 0x6cd17420, 0x1bbbb: 0x6cde7020, + 0x1bbbc: 0x6c781420, 0x1bbbd: 0x6cf66c20, 0x1bbbe: 0x6c479c20, 0x1bbbf: 0x6cb51020, + // Block 0x6ef, offset 0x1bbc0 + 0x1bbc0: 0x6c431020, 0x1bbc1: 0x6c431220, 0x1bbc2: 0x6cdcdc20, 0x1bbc3: 0x6cac6620, + 0x1bbc4: 0x6ce1da20, 0x1bbc5: 0x6c441220, 0x1bbc6: 0x6d0a1a20, 0x1bbc7: 0x6c2cd420, + 0x1bbc8: 0x6caa2420, 0x1bbc9: 0x6c606420, 0x1bbca: 0x6cd78c20, 0x1bbcb: 0x6c46c220, + 0x1bbcc: 0x6c20d820, 0x1bbcd: 0x6cbacc20, 0x1bbce: 0x6c13ec20, 0x1bbcf: 0x6cba1620, + 0x1bbd0: 0x6c57ec20, 0x1bbd1: 0x6c9a1820, 0x1bbd2: 0x6d070a20, 0x1bbd3: 0x6c42ac20, + 0x1bbd4: 0x6c42cc20, 0x1bbd5: 0x6d3d8020, 0x1bbd6: 0x6ceb3620, 0x1bbd7: 0x6cbc7420, + 0x1bbd8: 0x6d105c20, 0x1bbd9: 0x6c2cd620, 0x1bbda: 0x6c642620, 0x1bbdb: 0x6c76e220, + 0x1bbdc: 0x6d41be20, 0x1bbdd: 0x6c2a5a20, 0x1bbde: 0x6c907220, 0x1bbdf: 0x6c0d4420, + 0x1bbe0: 0x6d39ba20, 0x1bbe1: 0x6ccaa420, 0x1bbe2: 0x6cf79c20, 0x1bbe3: 0x6c5f1420, + 0x1bbe4: 0x6c882220, 0x1bbe5: 0x6c5c1620, 0x1bbe6: 0x6d1da420, 0x1bbe7: 0x6cba7420, + 0x1bbe8: 0x6c4cc220, 0x1bbe9: 0x6c414620, 0x1bbea: 0x6c415020, 0x1bbeb: 0x6ce95820, + 0x1bbec: 0x6c57bc20, 0x1bbed: 0x6cb52020, 0x1bbee: 0x6ccbae20, 0x1bbef: 0x6c24e220, + 0x1bbf0: 0x6caeb220, 0x1bbf1: 0x6d1fe420, 0x1bbf2: 0x6c559020, 0x1bbf3: 0x6c67b620, + 0x1bbf4: 0x6c56be20, 0x1bbf5: 0x6c594a20, 0x1bbf6: 0x6c4b6820, 0x1bbf7: 0x6ca85e20, + 0x1bbf8: 0x6d185220, 0x1bbf9: 0x6c42d820, 0x1bbfa: 0x6c774420, 0x1bbfb: 0x6c4a8620, + 0x1bbfc: 0x6c4a8820, 0x1bbfd: 0x6c128a20, 0x1bbfe: 0x6c97fa20, 0x1bbff: 0x6c6cac20, + // Block 0x6f0, offset 0x1bc00 + 0x1bc00: 0x6c2b4020, 0x1bc01: 0x6d3c2220, 0x1bc02: 0x6c822620, 0x1bc03: 0x6c810a20, + 0x1bc04: 0x6c18dc20, 0x1bc05: 0x6c233a20, 0x1bc06: 0x6c841820, 0x1bc07: 0x6d04e220, + 0x1bc08: 0x6cbe8620, 0x1bc09: 0x6cd6da20, 0x1bc0a: 0x6c38b220, 0x1bc0b: 0x6ce7c220, + 0x1bc0c: 0x6c499e20, 0x1bc0d: 0x6d2ae820, 0x1bc0e: 0x6cdafc20, 0x1bc0f: 0x6c82d020, + 0x1bc10: 0x6c91d220, 0x1bc11: 0x6c896620, 0x1bc12: 0x6c9d7820, 0x1bc13: 0x6c90b020, + 0x1bc14: 0x6c177420, 0x1bc15: 0x6cdafe20, 0x1bc16: 0x6c782220, 0x1bc17: 0x6c1e6620, + 0x1bc18: 0x6ce12020, 0x1bc19: 0x6c0c1620, 0x1bc1a: 0x6c92a220, 0x1bc1b: 0x6c6f8420, + 0x1bc1c: 0x6d30fc20, 0x1bc1d: 0x6d2bf620, 0x1bc1e: 0x6cd50020, 0x1bc1f: 0x6d2ed620, + 0x1bc20: 0x6c977020, 0x1bc21: 0x6ca06a20, 0x1bc22: 0x6ca7a820, 0x1bc23: 0x6d106a20, + 0x1bc24: 0x6ce59820, 0x1bc25: 0x6caeb420, 0x1bc26: 0x6d3b1e20, 0x1bc27: 0x6ccc0e20, + 0x1bc28: 0x6cf6c020, 0x1bc29: 0x6cc31020, 0x1bc2a: 0x6c526c20, 0x1bc2b: 0x6c64ce20, + 0x1bc2c: 0x6c233c20, 0x1bc2d: 0x6c630e20, 0x1bc2e: 0x6d0f3a20, 0x1bc2f: 0x6cbb1820, + 0x1bc30: 0x6d098820, 0x1bc31: 0x6d1be420, 0x1bc32: 0x6c37de20, 0x1bc33: 0x6d0a3c20, + 0x1bc34: 0x6d349820, 0x1bc35: 0x6cbbf620, 0x1bc36: 0x6d417c20, 0x1bc37: 0x6c23b420, + 0x1bc38: 0x6cb49620, 0x1bc39: 0x6cd60a20, 0x1bc3a: 0x6c57ae20, 0x1bc3b: 0x6c7d1e20, + 0x1bc3c: 0x6d319020, 0x1bc3d: 0x6d41f220, 0x1bc3e: 0x6d26ec20, 0x1bc3f: 0x6ccdac20, + // Block 0x6f1, offset 0x1bc40 + 0x1bc40: 0x6cf6c420, 0x1bc41: 0x6c211420, 0x1bc42: 0x6c2d8020, 0x1bc43: 0x6c382620, + 0x1bc44: 0x6c41e620, 0x1bc45: 0x6ca07620, 0x1bc46: 0x6cf47a20, 0x1bc47: 0x6cbbaa20, + 0x1bc48: 0x6cc52c20, 0x1bc49: 0x6c8c6020, 0x1bc4a: 0x6c8e9620, 0x1bc4b: 0x6cbbf820, + 0x1bc4c: 0x6cfd0c20, 0x1bc4d: 0x6cc90820, 0x1bc4e: 0x6c38ba20, 0x1bc4f: 0x6d2e1420, + 0x1bc50: 0x6ceb4820, 0x1bc51: 0x6c81bc20, 0x1bc52: 0x6d27c620, 0x1bc53: 0x6cd75a20, + 0x1bc54: 0x6c33ae20, 0x1bc55: 0x6c199220, 0x1bc56: 0x6ce13220, 0x1bc57: 0x6c9b3820, + 0x1bc58: 0x6c715a20, 0x1bc59: 0x6c1a4220, 0x1bc5a: 0x6cdb3020, 0x1bc5b: 0x6c74ba20, + 0x1bc5c: 0x6c74bc20, 0x1bc5d: 0x6c2d8220, 0x1bc5e: 0x6c5c3020, 0x1bc5f: 0x6c5f3020, + 0x1bc60: 0x6caae020, 0x1bc61: 0x6cfe4e20, 0x1bc62: 0x6ceb8e20, 0x1bc63: 0x6ca94620, + 0x1bc64: 0x6cc8b020, 0x1bc65: 0x6d39c420, 0x1bc66: 0x6ce78620, 0x1bc67: 0x6d2b8e20, + 0x1bc68: 0x6c3b9420, 0x1bc69: 0x6cbf6020, 0x1bc6a: 0x6cc4d220, 0x1bc6b: 0x6c526e20, + 0x1bc6c: 0x6cb9c820, 0x1bc6d: 0x6c472e20, 0x1bc6e: 0x6c8f1a20, 0x1bc6f: 0x6c81e020, + 0x1bc70: 0x6c42dc20, 0x1bc71: 0x6c1eae20, 0x1bc72: 0x6cf94620, 0x1bc73: 0x6cd18820, + 0x1bc74: 0x6d3f6c20, 0x1bc75: 0x6cca6820, 0x1bc76: 0x6c60a620, 0x1bc77: 0x6c30c620, + 0x1bc78: 0x6c6eca20, 0x1bc79: 0x6c91dc20, 0x1bc7a: 0x6c673c20, 0x1bc7b: 0x6c1f9820, + 0x1bc7c: 0x6d25aa20, 0x1bc7d: 0x6cde9c20, 0x1bc7e: 0x6cd50c20, 0x1bc7f: 0x6c678220, + // Block 0x6f2, offset 0x1bc80 + 0x1bc80: 0x6ce01820, 0x1bc81: 0x6c8c3820, 0x1bc82: 0x6ca9cc20, 0x1bc83: 0x6d1b0620, + 0x1bc84: 0x6cf7a820, 0x1bc85: 0x6cdc8020, 0x1bc86: 0x6ccd1020, 0x1bc87: 0x6d41d020, + 0x1bc88: 0x6d082a20, 0x1bc89: 0x6c199a20, 0x1bc8a: 0x6c423420, 0x1bc8b: 0x6c716220, + 0x1bc8c: 0x6d41d820, 0x1bc8d: 0x6d18c620, 0x1bc8e: 0x6cbda220, 0x1bc8f: 0x6cb49c20, + 0x1bc90: 0x6d0cd620, 0x1bc91: 0x6c826020, 0x1bc92: 0x6c3c6a20, 0x1bc93: 0x6c5b6c20, + 0x1bc94: 0x6c299220, 0x1bc95: 0x6c629620, 0x1bc96: 0x6cdc7020, 0x1bc97: 0x6c0ff820, + 0x1bc98: 0x6cb2d420, 0x1bc99: 0x6c1a4420, 0x1bc9a: 0x6c1ef020, 0x1bc9b: 0x6d3b5a20, + 0x1bc9c: 0x6c4b7c20, 0x1bc9d: 0x6c60aa20, 0x1bc9e: 0x6c6ba020, 0x1bc9f: 0x6c643020, + 0x1bca0: 0x6cbe8e20, 0x1bca1: 0x6d2d2020, 0x1bca2: 0x6c65e020, 0x1bca3: 0x6cbb2820, + 0x1bca4: 0x6c2a3420, 0x1bca5: 0x6d161a20, 0x1bca6: 0x6c0c8220, 0x1bca7: 0x6cd93a20, + 0x1bca8: 0x6ccefe20, 0x1bca9: 0x6c8c3a20, 0x1bcaa: 0x6c87e420, 0x1bcab: 0x6c140e20, + 0x1bcac: 0x6c9b5c20, 0x1bcad: 0x6d1aa020, 0x1bcae: 0x6ce24820, 0x1bcaf: 0x6cdf4e20, + 0x1bcb0: 0x6c9de020, 0x1bcb1: 0x6cb67020, 0x1bcb2: 0x6ce96820, 0x1bcb3: 0x6c0d5c20, + 0x1bcb4: 0x6c5e0820, 0x1bcb5: 0x6c62aa20, 0x1bcb6: 0x6cb93420, 0x1bcb7: 0x6ca65820, + 0x1bcb8: 0x6ca92a20, 0x1bcb9: 0x6d142220, 0x1bcba: 0x6c432a20, 0x1bcbb: 0x6c76f620, + 0x1bcbc: 0x6d1b9220, 0x1bcbd: 0x6caa2c20, 0x1bcbe: 0x6cbeba20, 0x1bcbf: 0x6d0de620, + // Block 0x6f3, offset 0x1bcc0 + 0x1bcc0: 0x6cb67220, 0x1bcc1: 0x6c9d9e20, 0x1bcc2: 0x6d2fe820, 0x1bcc3: 0x6c4b8820, + 0x1bcc4: 0x6c212220, 0x1bcc5: 0x6c5f6a20, 0x1bcc6: 0x6c7ca420, 0x1bcc7: 0x6cb33c20, + 0x1bcc8: 0x6c2af020, 0x1bcc9: 0x6c1eba20, 0x1bcca: 0x6c449020, 0x1bccb: 0x6c9de420, + 0x1bccc: 0x6d1ec220, 0x1bccd: 0x6d373e20, 0x1bcce: 0x6c5a6620, 0x1bccf: 0x6cb93e20, + 0x1bcd0: 0x6c82f420, 0x1bcd1: 0x6c827020, 0x1bcd2: 0x6cc9a820, 0x1bcd3: 0x6c91f220, + 0x1bcd4: 0x6c86cc20, 0x1bcd5: 0x6c24a220, 0x1bcd6: 0x6c941220, 0x1bcd7: 0x6c9efc20, + 0x1bcd8: 0x6c5c7a20, 0x1bcd9: 0x6cab5c20, 0x1bcda: 0x6c916220, 0x1bcdb: 0x6d370620, + 0x1bcdc: 0x6c42ea20, 0x1bcdd: 0x6c31d020, 0x1bcde: 0x6d25c620, 0x1bcdf: 0x6c86f620, + 0x1bce0: 0x6c3ae820, 0x1bce1: 0x6d3dba20, 0x1bce2: 0x6cda3420, 0x1bce3: 0x6c886020, + 0x1bce4: 0x6c681c20, 0x1bce5: 0x6c1ec420, 0x1bce6: 0x6cbeec20, 0x1bce7: 0x6d39e020, + 0x1bce8: 0x6c918020, 0x1bce9: 0x6d0cfc20, 0x1bcea: 0x6c871a20, 0x1bceb: 0x6d39de20, + 0x1bcec: 0x6c193e20, 0x1bced: 0x6c6b5a20, 0x1bcee: 0x6c36d820, 0x1bcef: 0x6cda6820, + 0x1bcf0: 0x6c580020, 0x1bcf1: 0x6ca8a220, 0x1bcf2: 0x6d244e20, 0x1bcf3: 0x6c8fdc20, + 0x1bcf4: 0x6c7f7420, 0x1bcf5: 0x6c69f020, 0x1bcf6: 0x6cfc4620, 0x1bcf7: 0x6c4aa820, + 0x1bcf8: 0x6c71de20, 0x1bcf9: 0x6cff4820, 0x1bcfa: 0x6c8d9a20, 0x1bcfb: 0x6d1c2a20, + 0x1bcfc: 0x6c653c20, 0x1bcfd: 0x6d1b2420, 0x1bcfe: 0x6d1f9620, 0x1bcff: 0x6d1cc420, + // Block 0x6f4, offset 0x1bd00 + 0x1bd00: 0x6cfd9a20, 0x1bd01: 0x6ca9e020, 0x1bd02: 0x6c0fb620, 0x1bd03: 0x6c156020, + 0x1bd04: 0x6c7ff820, 0x1bd05: 0x6c71e220, 0x1bd06: 0x6cd6b220, 0x1bd07: 0x6ccf9020, + 0x1bd08: 0x6cef7420, 0x1bd09: 0x6c23cc20, 0x1bd0a: 0x6cc33020, 0x1bd0b: 0x6cc20620, + 0x1bd0c: 0x6c126220, 0x1bd0d: 0x6c704820, 0x1bd0e: 0x6d247a20, 0x1bd0f: 0x6c957e20, + 0x1bd10: 0x6c878a20, 0x1bd11: 0x6c24a820, 0x1bd12: 0x6c945c20, 0x1bd13: 0x6c294420, + 0x1bd14: 0x6c752820, 0x1bd15: 0x6d0f3e20, 0x1bd16: 0x6c806420, 0x1bd17: 0x6c800e20, + 0x1bd18: 0x6d3a4620, 0x1bd19: 0x6c82a220, 0x1bd1a: 0x6c855420, 0x1bd1b: 0x6c03e020, + 0x1bd1c: 0x6ca46620, 0x1bd1d: 0x6d249220, 0x1bd1e: 0x6c8dd820, 0x1bd1f: 0x6c4a3020, + 0x1bd20: 0x6cba3820, 0x1bd21: 0x6c22aa20, 0x1bd22: 0x6c596a20, 0x1bd23: 0x6d02b620, + 0x1bd24: 0x6d20b820, 0x1bd25: 0x6d16be20, 0x1bd26: 0x6cb8b220, 0x1bd27: 0x6cab3020, + 0x1bd28: 0x6d057820, 0x1bd29: 0x6c173c20, 0x1bd2a: 0x6c1f1a20, 0x1bd2b: 0x6cb78020, + 0x1bd2c: 0x6c768220, 0x1bd2d: 0x6d173020, 0x1bd2e: 0x6c741420, 0x1bd2f: 0x6cf87020, + 0x1bd30: 0x6d06a420, 0x1bd31: 0x6c509820, 0x1bd32: 0x6d231420, 0x1bd33: 0x6c7cf220, + 0x1bd34: 0x6c80ac20, 0x1bd35: 0x6c7b6220, 0x1bd36: 0x6cd77c20, 0x1bd37: 0x6cf5ee20, + 0x1bd38: 0x6c002220, 0x1bd39: 0x6d13f420, 0x1bd3a: 0x6cb4f620, 0x1bd3b: 0x6c1f9e20, + 0x1bd3c: 0x6c1ba620, 0x1bd3d: 0x6cbd3020, 0x1bd3e: 0x6c7b6620, 0x1bd3f: 0x6c76d420, + // Block 0x6f5, offset 0x1bd40 + 0x1bd40: 0x6c7b6820, 0x1bd41: 0x6c76dc20, 0x1bd42: 0x6c202220, 0x1bd43: 0x6ccc5a20, + 0x1bd44: 0x6c485a20, 0x1bd45: 0x6d19ea20, 0x1bd46: 0x6d02de20, 0x1bd47: 0x6d004a20, + 0x1bd48: 0x6d215620, 0x1bd49: 0x6cba6820, 0x1bd4a: 0x6cfeec20, 0x1bd4b: 0x6d131620, + 0x1bd4c: 0x6c43a020, 0x1bd4d: 0x6cf37420, 0x1bd4e: 0x6ce0a820, 0x1bd4f: 0x6c6d3e20, + 0x1bd50: 0x6cab4820, 0x1bd51: 0x6c54f820, 0x1bd52: 0x6ce40e20, 0x1bd53: 0x6c582c20, + 0x1bd54: 0x6d05d420, 0x1bd55: 0x6cae3820, 0x1bd56: 0x6cf81020, 0x1bd57: 0x6d000820, + 0x1bd58: 0x6c1fa220, 0x1bd59: 0x6ccf7820, 0x1bd5a: 0x6ccdae20, 0x1bd5b: 0x6c4dbe20, + 0x1bd5c: 0x6c1f7e20, 0x1bd5d: 0x6d18c820, 0x1bd5e: 0x6c36c420, 0x1bd5f: 0x6d21b420, + 0x1bd60: 0x6c21e220, 0x1bd61: 0x6c596e20, 0x1bd62: 0x6d34cc20, 0x1bd63: 0x6d333620, + 0x1bd64: 0x6c228a20, 0x1bd65: 0x6c105e20, 0x1bd66: 0x6cf42c20, 0x1bd67: 0x6cb58420, + 0x1bd68: 0x6c106e20, 0x1bd69: 0x6c107020, 0x1bd6a: 0x6cec4e20, 0x1bd6b: 0x6c721220, + 0x1bd6c: 0x6cb97e20, 0x1bd6d: 0x6c1b1620, 0x1bd6e: 0x6ccb2a20, 0x1bd6f: 0x6c1ba820, + 0x1bd70: 0x6ccb3620, 0x1bd71: 0x6d37fa20, 0x1bd72: 0x6cdc4620, 0x1bd73: 0x6cdc4820, + 0x1bd74: 0x6c864c20, 0x1bd75: 0x6c263420, 0x1bd76: 0x6d218220, 0x1bd77: 0x6c867c20, + 0x1bd78: 0x6c4a9a20, 0x1bd79: 0x6c271220, 0x1bd7a: 0x6c35ca20, 0x1bd7b: 0x6cd86c20, + 0x1bd7c: 0x6c646420, 0x1bd7d: 0x6d301c20, 0x1bd7e: 0x6ca0cc20, 0x1bd7f: 0x6ca0ce20, + // Block 0x6f6, offset 0x1bd80 + 0x1bd80: 0x6d109220, 0x1bd81: 0x6ca0d020, 0x1bd82: 0x6c242020, 0x1bd83: 0x6d0f5020, + 0x1bd84: 0x6ce4da20, 0x1bd85: 0x6cd0ee20, 0x1bd86: 0x6c274820, 0x1bd87: 0x6cce0020, + 0x1bd88: 0x6d06a620, 0x1bd89: 0x6d0a7c20, 0x1bd8a: 0x6cd4ba20, 0x1bd8b: 0x6c118c20, + 0x1bd8c: 0x6c742a20, 0x1bd8d: 0x6cb19420, 0x1bd8e: 0x6cb85c20, 0x1bd8f: 0x6cc04820, + 0x1bd90: 0x6cdaa420, 0x1bd91: 0x6cbe7820, 0x1bd92: 0x6d27e620, 0x1bd93: 0x6c88ee20, + 0x1bd94: 0x6d17a220, 0x1bd95: 0x6c3d2a20, 0x1bd96: 0x6d346220, 0x1bd97: 0x6d12f220, + 0x1bd98: 0x6c119620, 0x1bd99: 0x6c5cce20, 0x1bd9a: 0x6c27e020, 0x1bd9b: 0x6c603c20, + 0x1bd9c: 0x6c2ebe20, 0x1bd9d: 0x6d317c20, 0x1bd9e: 0x6d27f220, 0x1bd9f: 0x6cf15820, + 0x1bda0: 0x6c1e4820, 0x1bda1: 0x6c0d8220, 0x1bda2: 0x6ce41220, 0x1bda3: 0x6c6d4020, + 0x1bda4: 0x6cce1620, 0x1bda5: 0x6d1a9220, 0x1bda6: 0x6c2dda20, 0x1bda7: 0x6c702220, + 0x1bda8: 0x6c5c3220, 0x1bda9: 0x6c24b020, 0x1bdaa: 0x6d189820, 0x1bdab: 0x6c27fc20, + 0x1bdac: 0x6c327e20, 0x1bdad: 0x6c678420, 0x1bdae: 0x6c892020, 0x1bdaf: 0x6c0d8c20, + 0x1bdb0: 0x6c31d220, 0x1bdb1: 0x6c674020, 0x1bdb2: 0x6c653e20, 0x1bdb3: 0x6cd49820, + 0x1bdb4: 0x6cab3220, 0x1bdb5: 0x6c32b620, 0x1bdb6: 0x6d3ac020, 0x1bdb7: 0x6d19c020, + 0x1bdb8: 0x6cbec820, 0x1bdb9: 0x6d175e20, 0x1bdba: 0x6ccbda20, 0x1bdbb: 0x6cbc4020, + 0x1bdbc: 0x6c784e20, 0x1bdbd: 0x6cff8a20, 0x1bdbe: 0x6d0a8e20, 0x1bdbf: 0x6c2d5e20, + // Block 0x6f7, offset 0x1bdc0 + 0x1bdc0: 0x6c5b5620, 0x1bdc1: 0x6c5b5820, 0x1bdc2: 0x6c47a020, 0x1bdc3: 0x6cbb9020, + 0x1bdc4: 0x6c5f0620, 0x1bdc5: 0x6d185420, 0x1bdc6: 0x6cab4a20, 0x1bdc7: 0x6c5b6220, + 0x1bdc8: 0x6c32da20, 0x1bdc9: 0x6d142420, 0x1bdca: 0x6cff5c20, 0x1bdcb: 0x6cf39c20, + 0x1bdcc: 0x6c497220, 0x1bdcd: 0x6ca22020, 0x1bdce: 0x6c9a4820, 0x1bdcf: 0x6c9a4a20, + 0x1bdd0: 0x6c006020, 0x1bdd1: 0x6c6b9420, 0x1bdd2: 0x6c318820, 0x1bdd3: 0x6d239020, + 0x1bdd4: 0x6c08ac20, 0x1bdd5: 0x6c090a20, 0x1bdd6: 0x6c094e20, 0x1bdd7: 0x6cafc220, + 0x1bdd8: 0x6cafc420, 0x1bdd9: 0x6c095e20, 0x1bdda: 0x6c152c20, 0x1bddb: 0x6c98c020, + 0x1bddc: 0x6c4fbc20, 0x1bddd: 0x6c111a20, 0x1bdde: 0x6cafba20, 0x1bddf: 0x6c8b9020, + 0x1bde0: 0x6c633820, 0x1bde1: 0x6d2d6420, 0x1bde2: 0x6cc9c020, 0x1bde3: 0x6ca27620, + 0x1bde4: 0x6ceb9e20, 0x1bde5: 0x6d09fc20, 0x1bde6: 0x6c379020, 0x1bde7: 0x6cc66620, + 0x1bde8: 0x6cfbfa20, 0x1bde9: 0x6c710620, 0x1bdea: 0x6ca21020, 0x1bdeb: 0x6c4fc420, + 0x1bdec: 0x6cc04a20, 0x1bded: 0x6c311220, 0x1bdee: 0x6ccbea20, 0x1bdef: 0x6ce06020, + 0x1bdf0: 0x6cadd620, 0x1bdf1: 0x6c712420, 0x1bdf2: 0x6c343020, 0x1bdf3: 0x6c253c20, + 0x1bdf4: 0x6c087220, 0x1bdf5: 0x6cca0020, 0x1bdf6: 0x6cca6420, 0x1bdf7: 0x6c999420, + 0x1bdf8: 0x6cc9c820, 0x1bdf9: 0x6cd4ea20, 0x1bdfa: 0x6d208e20, 0x1bdfb: 0x6cebac20, + 0x1bdfc: 0x6c513c20, 0x1bdfd: 0x6c668e20, 0x1bdfe: 0x6cde7420, 0x1bdff: 0x6cca0620, + // Block 0x6f8, offset 0x1be00 + 0x1be00: 0x6c935e20, 0x1be01: 0x6ca21620, 0x1be02: 0x6c98fa20, 0x1be03: 0x6ce78820, + 0x1be04: 0x6cc72220, 0x1be05: 0x6c16f820, 0x1be06: 0x6cb49820, 0x1be07: 0x6c934e20, + 0x1be08: 0x6d2da820, 0x1be09: 0x6ccafc20, 0x1be0a: 0x6d2daa20, 0x1be0b: 0x6c9b5e20, + 0x1be0c: 0x6c91f420, 0x1be0d: 0x6cc20820, 0x1be0e: 0x6c2f2220, 0x1be0f: 0x6cd2e420, + 0x1be10: 0x6c2b0a20, 0x1be11: 0x6c9f2620, 0x1be12: 0x6c73d220, 0x1be13: 0x6c983620, + 0x1be14: 0x6cb72620, 0x1be15: 0x6cb1c420, 0x1be16: 0x6ca39220, 0x1be17: 0x6cb72e20, + 0x1be18: 0x6c29bc20, 0x1be19: 0x6cfa7a20, 0x1be1a: 0x6c1fde20, 0x1be1b: 0x6c3b1a20, + 0x1be1c: 0x6d0f8820, 0x1be1d: 0x6ca58620, 0x1be1e: 0x6c0d9a20, 0x1be1f: 0x6c3e1020, + 0x1be20: 0x6ccfbc20, 0x1be21: 0x6c2fe620, 0x1be22: 0x6cbe3420, 0x1be23: 0x6cb76a20, + 0x1be24: 0x6d19c220, 0x1be25: 0x6cf5c020, 0x1be26: 0x6c4d6020, 0x1be27: 0x6d100e20, + 0x1be28: 0x6c012220, 0x1be29: 0x6d0b8e20, 0x1be2a: 0x6c78a620, 0x1be2b: 0x6cbe4420, + 0x1be2c: 0x6d0bb020, 0x1be2d: 0x6c300220, 0x1be2e: 0x6c288a20, 0x1be2f: 0x6c93e020, + 0x1be30: 0x6cbe7e20, 0x1be31: 0x6d102620, 0x1be32: 0x6d275620, 0x1be33: 0x6d275c20, + 0x1be34: 0x6cd70220, 0x1be35: 0x6cd73c20, 0x1be36: 0x6d331620, 0x1be37: 0x6c0da420, + 0x1be38: 0x6d1e0c20, 0x1be39: 0x6c294e20, 0x1be3a: 0x6cd73e20, 0x1be3b: 0x6c821020, + 0x1be3c: 0x6ca67820, 0x1be3d: 0x6cea7620, 0x1be3e: 0x6c391420, 0x1be3f: 0x6c4abc20, + // Block 0x6f9, offset 0x1be40 + 0x1be40: 0x6ce62620, 0x1be41: 0x6d338220, 0x1be42: 0x6cc00020, 0x1be43: 0x6c0d1e20, + 0x1be44: 0x6d2b3620, 0x1be45: 0x6c9dfc20, 0x1be46: 0x6c248c20, 0x1be47: 0x6c5b8820, + 0x1be48: 0x6c2dac20, 0x1be49: 0x6c4e7c20, 0x1be4a: 0x6c142c20, 0x1be4b: 0x6d3d2020, + 0x1be4c: 0x6c202a20, 0x1be4d: 0x6cecba20, 0x1be4e: 0x6c391c20, 0x1be4f: 0x6c26e820, + 0x1be50: 0x6cf57220, 0x1be51: 0x6cea9c20, 0x1be52: 0x6c982a20, 0x1be53: 0x6cbffa20, + 0x1be54: 0x6cb73020, 0x1be55: 0x6ccd6a20, 0x1be56: 0x6cb24220, 0x1be57: 0x6c4e8620, + 0x1be58: 0x6cb89a20, 0x1be59: 0x6cf34620, 0x1be5a: 0x6cf34820, 0x1be5b: 0x6d0a6620, + 0x1be5c: 0x6cd87a20, 0x1be5d: 0x6cc7f420, 0x1be5e: 0x6c45d420, 0x1be5f: 0x6c674220, + 0x1be60: 0x6c1af620, 0x1be61: 0x6cf34a20, 0x1be62: 0x6ce92c20, 0x1be63: 0x6c704220, + 0x1be64: 0x6ce0b820, 0x1be65: 0x6d338c20, 0x1be66: 0x6d34e820, 0x1be67: 0x6cb8a820, + 0x1be68: 0x6c9d1c20, 0x1be69: 0x6c475820, 0x1be6a: 0x6cedc420, 0x1be6b: 0x6c6e0e20, + 0x1be6c: 0x6c6e1020, 0x1be6d: 0x6cc8be20, 0x1be6e: 0x6c755a20, 0x1be6f: 0x6c52f820, + 0x1be70: 0x6cdf6020, 0x1be71: 0x6cc34e20, 0x1be72: 0x6c5fcc20, 0x1be73: 0x6c0b7020, + 0x1be74: 0x6c0b7220, 0x1be75: 0x6c420e20, 0x1be76: 0x6cf1fe20, 0x1be77: 0x6d378820, + 0x1be78: 0x6c398420, 0x1be79: 0x6d045620, 0x1be7a: 0x6c73e020, 0x1be7b: 0x6c561020, + 0x1be7c: 0x6ca96820, 0x1be7d: 0x6cb73820, 0x1be7e: 0x6c3b5620, 0x1be7f: 0x6d067220, + // Block 0x6fa, offset 0x1be80 + 0x1be80: 0x6d068420, 0x1be81: 0x6cbe0620, 0x1be82: 0x6d146220, 0x1be83: 0x6cf2ce20, + 0x1be84: 0x6d278020, 0x1be85: 0x6d253e20, 0x1be86: 0x6c4f9020, 0x1be87: 0x6d0d3e20, + 0x1be88: 0x6c189c20, 0x1be89: 0x6c189e20, 0x1be8a: 0x6c286820, 0x1be8b: 0x6d1eec20, + 0x1be8c: 0x6c33da20, 0x1be8d: 0x6c565820, 0x1be8e: 0x6c5d9c20, 0x1be8f: 0x6cb4cc20, + 0x1be90: 0x6ca26820, 0x1be91: 0x6caa7620, 0x1be92: 0x6c99d220, 0x1be93: 0x6c268220, + 0x1be94: 0x6c9e0020, 0x1be95: 0x6c9d1e20, 0x1be96: 0x6c1cae20, 0x1be97: 0x6cacce20, + 0x1be98: 0x6c08bc20, 0x1be99: 0x6ccbc420, 0x1be9a: 0x6d34ea20, 0x1be9b: 0x6cae0220, + 0x1be9c: 0x6cac9e20, 0x1be9d: 0x6d3c7620, 0x1be9e: 0x6d288420, 0x1be9f: 0x6c463820, + 0x1bea0: 0x6c8e4220, 0x1bea1: 0x6c99d420, 0x1bea2: 0x6d2aa620, 0x1bea3: 0x6c3c1c20, + 0x1bea4: 0x6cab2e20, 0x1bea5: 0x6c858020, 0x1bea6: 0x6c94da20, 0x1bea7: 0x6c122220, + 0x1bea8: 0x6c3c1e20, 0x1bea9: 0x6ceee020, 0x1beaa: 0x6c565a20, 0x1beab: 0x6ca0d220, + 0x1beac: 0x6c9a7820, 0x1bead: 0x6cd59e20, 0x1beae: 0x6c71a620, 0x1beaf: 0x6d296220, + 0x1beb0: 0x6ceab020, 0x1beb1: 0x6ceaee20, 0x1beb2: 0x6ceaf020, 0x1beb3: 0x6c50c820, + 0x1beb4: 0x6c859020, 0x1beb5: 0x6c9cdc20, 0x1beb6: 0x6d147220, 0x1beb7: 0x6c37e420, + 0x1beb8: 0x6c3a8820, 0x1beb9: 0x6d1efe20, 0x1beba: 0x6ce48420, 0x1bebb: 0x6d358a20, + 0x1bebc: 0x6d2f8820, 0x1bebd: 0x6c46f220, 0x1bebe: 0x6d2d6020, 0x1bebf: 0x6d0c6820, + // Block 0x6fb, offset 0x1bec0 + 0x1bec0: 0x6cd7ce20, 0x1bec1: 0x6c7be420, 0x1bec2: 0x6c6ef820, 0x1bec3: 0x6c705c20, + 0x1bec4: 0x6d016020, 0x1bec5: 0x6cc00620, 0x1bec6: 0x6d16c220, 0x1bec7: 0x6c632c20, + 0x1bec8: 0x6d379a20, 0x1bec9: 0x6cc2c220, 0x1beca: 0x6cb2fc20, 0x1becb: 0x6c5b9020, + 0x1becc: 0x6c9d2620, 0x1becd: 0x6c077e20, 0x1bece: 0x6d2aaa20, 0x1becf: 0x6d39f420, + 0x1bed0: 0x6c821820, 0x1bed1: 0x6d1e9820, 0x1bed2: 0x6c46f420, 0x1bed3: 0x6c530420, + 0x1bed4: 0x6c417620, 0x1bed5: 0x6c382e20, 0x1bed6: 0x6c992e20, 0x1bed7: 0x6cd89020, + 0x1bed8: 0x6c54a620, 0x1bed9: 0x6cb27a20, 0x1beda: 0x6c229220, 0x1bedb: 0x6c392220, + 0x1bedc: 0x6d339a20, 0x1bedd: 0x6cda8020, 0x1bede: 0x6ca95420, 0x1bedf: 0x6c195420, + 0x1bee0: 0x6c8cac20, 0x1bee1: 0x6cad8220, 0x1bee2: 0x6c0e5220, 0x1bee3: 0x6cb74620, + 0x1bee4: 0x6cd88220, 0x1bee5: 0x6ca5c020, 0x1bee6: 0x6c70f620, 0x1bee7: 0x6cc96a20, + 0x1bee8: 0x6d3ab020, 0x1bee9: 0x6cd0e220, 0x1beea: 0x6c832020, 0x1beeb: 0x6d087020, + 0x1beec: 0x6c73f020, 0x1beed: 0x6c3df620, 0x1beee: 0x6caca220, 0x1beef: 0x6c9f9620, + 0x1bef0: 0x6cdf6820, 0x1bef1: 0x6d0f4a20, 0x1bef2: 0x6c612020, 0x1bef3: 0x6d1e1420, + 0x1bef4: 0x6c497c20, 0x1bef5: 0x6c083a20, 0x1bef6: 0x6d090020, 0x1bef7: 0x6c8f6c20, + 0x1bef8: 0x6c913a20, 0x1bef9: 0x6c28f420, 0x1befa: 0x6c95e020, 0x1befb: 0x6d016220, + 0x1befc: 0x6cb3c020, 0x1befd: 0x6d2aac20, 0x1befe: 0x6c6d9020, 0x1beff: 0x6d1a3c20, + // Block 0x6fc, offset 0x1bf00 + 0x1bf00: 0x6cac5420, 0x1bf01: 0x6c6a9020, 0x1bf02: 0x6d16f620, 0x1bf03: 0x6c5a9820, + 0x1bf04: 0x6c5b2620, 0x1bf05: 0x6d293020, 0x1bf06: 0x6c19ce20, 0x1bf07: 0x6d19b420, + 0x1bf08: 0x6ceeec20, 0x1bf09: 0x6c546620, 0x1bf0a: 0x6c665a20, 0x1bf0b: 0x6d0f9820, + 0x1bf0c: 0x6c8ad420, 0x1bf0d: 0x6cd8a820, 0x1bf0e: 0x6c61aa20, 0x1bf0f: 0x6c374020, + 0x1bf10: 0x6d03d020, 0x1bf11: 0x6c3e1220, 0x1bf12: 0x6cc94c20, 0x1bf13: 0x6ccb1820, + 0x1bf14: 0x6d350420, 0x1bf15: 0x6d1b3e20, 0x1bf16: 0x6cf3b620, 0x1bf17: 0x6cf7d620, + 0x1bf18: 0x6c77a420, 0x1bf19: 0x6d398a20, 0x1bf1a: 0x6c67da20, 0x1bf1b: 0x6c95e820, + 0x1bf1c: 0x6c95f420, 0x1bf1d: 0x6c01a620, 0x1bf1e: 0x6c306420, 0x1bf1f: 0x6ce3dc20, + 0x1bf20: 0x6ca1c820, 0x1bf21: 0x6c832220, 0x1bf22: 0x6d13da20, 0x1bf23: 0x6c9ce420, + 0x1bf24: 0x6cc2c420, 0x1bf25: 0x6c6c3020, 0x1bf26: 0x6cb37020, 0x1bf27: 0x6cef9820, + 0x1bf28: 0x6cff7020, 0x1bf29: 0x6d017220, 0x1bf2a: 0x6c531420, 0x1bf2b: 0x6d069420, + 0x1bf2c: 0x6cda8620, 0x1bf2d: 0x6c7b9220, 0x1bf2e: 0x6ce20a20, 0x1bf2f: 0x6cbcac20, + 0x1bf30: 0x6c71fe20, 0x1bf31: 0x6c378a20, 0x1bf32: 0x6d386020, 0x1bf33: 0x6cc81220, + 0x1bf34: 0x6cb28620, 0x1bf35: 0x6d09ec20, 0x1bf36: 0x6d046020, 0x1bf37: 0x6d35a220, + 0x1bf38: 0x6c49e020, 0x1bf39: 0x6c586420, 0x1bf3a: 0x6c9fec20, 0x1bf3b: 0x6c5d7020, + 0x1bf3c: 0x6cebcc20, 0x1bf3d: 0x6cb84c20, 0x1bf3e: 0x6cac1e20, 0x1bf3f: 0x6cf35820, + // Block 0x6fd, offset 0x1bf40 + 0x1bf40: 0x6cc0e820, 0x1bf41: 0x6c8e4a20, 0x1bf42: 0x6d16f820, 0x1bf43: 0x6c633a20, + 0x1bf44: 0x6c6e5a20, 0x1bf45: 0x6cb9f420, 0x1bf46: 0x6c675420, 0x1bf47: 0x6c683220, + 0x1bf48: 0x6d312a20, 0x1bf49: 0x6cd1ac20, 0x1bf4a: 0x6d3d3420, 0x1bf4b: 0x6c12d420, + 0x1bf4c: 0x6c380020, 0x1bf4d: 0x6c5b9c20, 0x1bf4e: 0x6c61ac20, 0x1bf4f: 0x6c8e4620, + 0x1bf50: 0x6c159c20, 0x1bf51: 0x6c5ce020, 0x1bf52: 0x6c561420, 0x1bf53: 0x6ca9b420, + 0x1bf54: 0x6d09ee20, 0x1bf55: 0x6c6ce220, 0x1bf56: 0x6c8aee20, 0x1bf57: 0x6cc03220, + 0x1bf58: 0x6cefa220, 0x1bf59: 0x6d30ea20, 0x1bf5a: 0x6c75a620, 0x1bf5b: 0x6c4df620, + 0x1bf5c: 0x6c052620, 0x1bf5d: 0x6c985220, 0x1bf5e: 0x6d3d3a20, 0x1bf5f: 0x6d1f1820, + 0x1bf60: 0x6cf5c220, 0x1bf61: 0x6c0ed620, 0x1bf62: 0x6c310420, 0x1bf63: 0x6c590420, + 0x1bf64: 0x6c532a20, 0x1bf65: 0x6d173220, 0x1bf66: 0x6cb48820, 0x1bf67: 0x6d1ce420, + 0x1bf68: 0x6c802420, 0x1bf69: 0x6c502e20, 0x1bf6a: 0x6c811820, 0x1bf6b: 0x6c4e5620, + 0x1bf6c: 0x6c850c20, 0x1bf6d: 0x6c44be20, 0x1bf6e: 0x6c3e3620, 0x1bf6f: 0x6cf3b820, + 0x1bf70: 0x6c88ea20, 0x1bf71: 0x6c213a20, 0x1bf72: 0x6c3ca220, 0x1bf73: 0x6d173420, + 0x1bf74: 0x6d22f220, 0x1bf75: 0x6ce73420, 0x1bf76: 0x6c815420, 0x1bf77: 0x6c4d3a20, + 0x1bf78: 0x6c6cee20, 0x1bf79: 0x6c634220, 0x1bf7a: 0x6c1cb820, 0x1bf7b: 0x6c6f0820, + 0x1bf7c: 0x6c9a5220, 0x1bf7d: 0x6cdbb820, 0x1bf7e: 0x6c195e20, 0x1bf7f: 0x6cae1420, + // Block 0x6fe, offset 0x1bf80 + 0x1bf80: 0x6cfcaa20, 0x1bf81: 0x6cd09820, 0x1bf82: 0x6ce92e20, 0x1bf83: 0x6c7dd020, + 0x1bf84: 0x6cb25020, 0x1bf85: 0x6ca80820, 0x1bf86: 0x6c4e9c20, 0x1bf87: 0x6c6da020, + 0x1bf88: 0x6cfea220, 0x1bf89: 0x6ccf3c20, 0x1bf8a: 0x6ca71e20, 0x1bf8b: 0x6ce84e20, + 0x1bf8c: 0x6d1e2620, 0x1bf8d: 0x6cffe020, 0x1bf8e: 0x6cfb3620, 0x1bf8f: 0x6ce6bc20, + 0x1bf90: 0x6c355820, 0x1bf91: 0x6cda8e20, 0x1bf92: 0x6cea1c20, 0x1bf93: 0x6c72e620, + 0x1bf94: 0x6c132c20, 0x1bf95: 0x6ce3e220, 0x1bf96: 0x6c85d020, 0x1bf97: 0x6cd71620, + 0x1bf98: 0x6cd8aa20, 0x1bf99: 0x6c832820, 0x1bf9a: 0x6cd71820, 0x1bf9b: 0x6ce1be20, + 0x1bf9c: 0x6c318e20, 0x1bf9d: 0x6c81ce20, 0x1bf9e: 0x6c7eec20, 0x1bf9f: 0x6c87f620, + 0x1bfa0: 0x6ceef620, 0x1bfa1: 0x6cf28020, 0x1bfa2: 0x6d279a20, 0x1bfa3: 0x6c590620, + 0x1bfa4: 0x6c2b6420, 0x1bfa5: 0x6c528a20, 0x1bfa6: 0x6cc8fa20, 0x1bfa7: 0x6c666e20, + 0x1bfa8: 0x6d2f0220, 0x1bfa9: 0x6ccb1c20, 0x1bfaa: 0x6c3e5220, 0x1bfab: 0x6c498420, + 0x1bfac: 0x6d042a20, 0x1bfad: 0x6cd46420, 0x1bfae: 0x6cd69020, 0x1bfaf: 0x6d0b2a20, + 0x1bfb0: 0x6c21b620, 0x1bfb1: 0x6d2f2e20, 0x1bfb2: 0x6d12e820, 0x1bfb3: 0x6c797620, + 0x1bfb4: 0x6cf2e420, 0x1bfb5: 0x6c4e0220, 0x1bfb6: 0x6ceac020, 0x1bfb7: 0x6c2ffa20, + 0x1bfb8: 0x6c510820, 0x1bfb9: 0x6cf28620, 0x1bfba: 0x6c708e20, 0x1bfbb: 0x6ccf4020, + 0x1bfbc: 0x6c894e20, 0x1bfbd: 0x6c5cc220, 0x1bfbe: 0x6cde4e20, 0x1bfbf: 0x6d3cfe20, + // Block 0x6ff, offset 0x1bfc0 + 0x1bfc0: 0x6c2d5220, 0x1bfc1: 0x6cbcb620, 0x1bfc2: 0x6c2a6a20, 0x1bfc3: 0x6c735620, + 0x1bfc4: 0x6d3e2420, 0x1bfc5: 0x6cf5f020, 0x1bfc6: 0x6cff8220, 0x1bfc7: 0x6cb5ca20, + 0x1bfc8: 0x6c477e20, 0x1bfc9: 0x6c4cb820, 0x1bfca: 0x6d0bf620, 0x1bfcb: 0x6c8bb020, + 0x1bfcc: 0x6ce17420, 0x1bfcd: 0x6d387620, 0x1bfce: 0x6caf0420, 0x1bfcf: 0x6c503820, + 0x1bfd0: 0x6c166620, 0x1bfd1: 0x6cd4cc20, 0x1bfd2: 0x6cb4ea20, 0x1bfd3: 0x6c399020, + 0x1bfd4: 0x6d345820, 0x1bfd5: 0x6c923c20, 0x1bfd6: 0x6ca53020, 0x1bfd7: 0x6c711420, + 0x1bfd8: 0x6ce21e20, 0x1bfd9: 0x6c239c20, 0x1bfda: 0x6c833020, 0x1bfdb: 0x6d30f020, + 0x1bfdc: 0x6cb29c20, 0x1bfdd: 0x6c3a3420, 0x1bfde: 0x6cd91c20, 0x1bfdf: 0x6ce4ee20, + 0x1bfe0: 0x6cb09020, 0x1bfe1: 0x6c288020, 0x1bfe2: 0x6d231620, 0x1bfe3: 0x6ca5d820, + 0x1bfe4: 0x6d208620, 0x1bfe5: 0x6c923e20, 0x1bfe6: 0x6c421a20, 0x1bfe7: 0x6c9d3a20, + 0x1bfe8: 0x6c6e7420, 0x1bfe9: 0x6c8ce820, 0x1bfea: 0x6c94f420, 0x1bfeb: 0x6d1a5c20, + 0x1bfec: 0x6c253620, 0x1bfed: 0x6cc18820, 0x1bfee: 0x6c57ea20, 0x1bfef: 0x6d231820, + 0x1bff0: 0x6ca72220, 0x1bff1: 0x6ccfde20, 0x1bff2: 0x6c0bf620, 0x1bff3: 0x6c214220, + 0x1bff4: 0x6c54c220, 0x1bff5: 0x6d24ec20, 0x1bff6: 0x6c7efc20, 0x1bff7: 0x6c5d2620, + 0x1bff8: 0x6cbe4620, 0x1bff9: 0x6d0bf820, 0x1bffa: 0x6cba0220, 0x1bffb: 0x6ce46220, + 0x1bffc: 0x6c9e9020, 0x1bffd: 0x6d350c20, 0x1bffe: 0x6d1ae420, 0x1bfff: 0x6c9d3c20, + // Block 0x700, offset 0x1c000 + 0x1c000: 0x6c07b220, 0x1c001: 0x6d24de20, 0x1c002: 0x6cf20820, 0x1c003: 0x6cc91c20, + 0x1c004: 0x6c39fa20, 0x1c005: 0x6cbe4820, 0x1c006: 0x6d24e020, 0x1c007: 0x6c786220, + 0x1c008: 0x6c61f220, 0x1c009: 0x6ccf4220, 0x1c00a: 0x6d24e220, 0x1c00b: 0x6ccba420, + 0x1c00c: 0x6c924020, 0x1c00d: 0x6d3f4420, 0x1c00e: 0x6c319620, 0x1c00f: 0x6cb81420, + 0x1c010: 0x6c667a20, 0x1c011: 0x6c9e1c20, 0x1c012: 0x6cb09220, 0x1c013: 0x6cf94420, + 0x1c014: 0x6d210220, 0x1c015: 0x6d24e420, 0x1c016: 0x6cd05c20, 0x1c017: 0x6cd09e20, + 0x1c018: 0x6cc74c20, 0x1c019: 0x6c592420, 0x1c01a: 0x6d3a6420, 0x1c01b: 0x6c659620, + 0x1c01c: 0x6caa9020, 0x1c01d: 0x6d212a20, 0x1c01e: 0x6cc06220, 0x1c01f: 0x6ce67220, + 0x1c020: 0x6cc18a20, 0x1c021: 0x6c325c20, 0x1c022: 0x6c389e20, 0x1c023: 0x6d2bdc20, + 0x1c024: 0x6c0f0420, 0x1c025: 0x6cf2f220, 0x1c026: 0x6cf28820, 0x1c027: 0x6c2c5820, + 0x1c028: 0x6cee8e20, 0x1c029: 0x6cf15020, 0x1c02a: 0x6cc7ac20, 0x1c02b: 0x6d01ae20, + 0x1c02c: 0x6c12ea20, 0x1c02d: 0x6cf09820, 0x1c02e: 0x6c510a20, 0x1c02f: 0x6c42a220, + 0x1c030: 0x6d0d8a20, 0x1c031: 0x6c534a20, 0x1c032: 0x6d089420, 0x1c033: 0x6c9cf220, + 0x1c034: 0x6c786a20, 0x1c035: 0x6c98da20, 0x1c036: 0x6d1bb020, 0x1c037: 0x6d0d8c20, + 0x1c038: 0x6d1f3820, 0x1c039: 0x6c52a620, 0x1c03a: 0x6c9e9220, 0x1c03b: 0x6cd13a20, + 0x1c03c: 0x6c9a5a20, 0x1c03d: 0x6d290420, 0x1c03e: 0x6c5cec20, 0x1c03f: 0x6ca3c420, + // Block 0x701, offset 0x1c040 + 0x1c040: 0x6c4afe20, 0x1c041: 0x6c1c2020, 0x1c042: 0x6c363820, 0x1c043: 0x6cac2620, + 0x1c044: 0x6c99fc20, 0x1c045: 0x6c88fc20, 0x1c046: 0x6cb79620, 0x1c047: 0x6cb79820, + 0x1c048: 0x6c99fe20, 0x1c049: 0x6ce4a020, 0x1c04a: 0x6c23ec20, 0x1c04b: 0x6cef1020, + 0x1c04c: 0x6c116a20, 0x1c04d: 0x6ce93220, 0x1c04e: 0x6c9e2620, 0x1c04f: 0x6c5bc420, + 0x1c050: 0x6ca11a20, 0x1c051: 0x6d059c20, 0x1c052: 0x6c604020, 0x1c053: 0x6cae4020, + 0x1c054: 0x6c649e20, 0x1c055: 0x6c658a20, 0x1c056: 0x6c555e20, 0x1c057: 0x6c3ce020, + 0x1c058: 0x6cfd7420, 0x1c059: 0x6d17a820, 0x1c05a: 0x6d1b5420, 0x1c05b: 0x6d2e6420, + 0x1c05c: 0x6cd26a20, 0x1c05d: 0x6c6a1820, 0x1c05e: 0x6c197020, 0x1c05f: 0x6c59c620, + 0x1c060: 0x6ce09a20, 0x1c061: 0x6d212c20, 0x1c062: 0x6c09a220, 0x1c063: 0x6c9fb020, + 0x1c064: 0x6cd1be20, 0x1c065: 0x6ce86020, 0x1c066: 0x6cd10220, 0x1c067: 0x6d1e3a20, + 0x1c068: 0x6c712620, 0x1c069: 0x6c307820, 0x1c06a: 0x6ce98a20, 0x1c06b: 0x6c68f620, + 0x1c06c: 0x6c690820, 0x1c06d: 0x6cc06420, 0x1c06e: 0x6d0c0820, 0x1c06f: 0x6ce0c020, + 0x1c070: 0x6c8f9420, 0x1c071: 0x6c5dd220, 0x1c072: 0x6d256420, 0x1c073: 0x6ca42820, + 0x1c074: 0x6c04f620, 0x1c075: 0x6d1fcc20, 0x1c076: 0x6cc2f020, 0x1c077: 0x6d3c1820, + 0x1c078: 0x6c89ba20, 0x1c079: 0x6c14f620, 0x1c07a: 0x6d0c9620, 0x1c07b: 0x6c214c20, + 0x1c07c: 0x6ca83020, 0x1c07d: 0x6d3e3e20, 0x1c07e: 0x6cec9020, 0x1c07f: 0x6cd1c020, + // Block 0x702, offset 0x1c080 + 0x1c080: 0x6c97ba20, 0x1c081: 0x6d1c7220, 0x1c082: 0x6c7ed620, 0x1c083: 0x6c7cfc20, + 0x1c084: 0x6c3d0020, 0x1c085: 0x6c669020, 0x1c086: 0x6d06da20, 0x1c087: 0x6c908a20, + 0x1c088: 0x6cef1220, 0x1c089: 0x6c413620, 0x1c08a: 0x6cfa6620, 0x1c08b: 0x6d1c7420, + 0x1c08c: 0x6cb31020, 0x1c08d: 0x6c6d1820, 0x1c08e: 0x6d0e8620, 0x1c08f: 0x6ce10420, + 0x1c090: 0x6d258220, 0x1c091: 0x6cdd7a20, 0x1c092: 0x6d258420, 0x1c093: 0x6c881420, + 0x1c094: 0x6d11b820, 0x1c095: 0x6c9c0620, 0x1c096: 0x6d3cde20, 0x1c097: 0x6c1a1c20, + 0x1c098: 0x6c78ba20, 0x1c099: 0x6cdf7a20, 0x1c09a: 0x6cde0a20, 0x1c09b: 0x6cebe420, + 0x1c09c: 0x6c8e3620, 0x1c09d: 0x6c465220, 0x1c09e: 0x6ccaae20, 0x1c09f: 0x6ca00620, + 0x1c0a0: 0x6d2cc420, 0x1c0a1: 0x6cd27220, 0x1c0a2: 0x6d17e820, 0x1c0a3: 0x6c952220, + 0x1c0a4: 0x6c969a20, 0x1c0a5: 0x6cb48e20, 0x1c0a6: 0x6cee9e20, 0x1c0a7: 0x6c863420, + 0x1c0a8: 0x6c111220, 0x1c0a9: 0x6cf50020, 0x1c0aa: 0x6cf64c20, 0x1c0ab: 0x6cf15a20, + 0x1c0ac: 0x6cbaba20, 0x1c0ad: 0x6d2ace20, 0x1c0ae: 0x6cd1ce20, 0x1c0af: 0x6cdace20, + 0x1c0b0: 0x6c004220, 0x1c0b1: 0x6cbd8420, 0x1c0b2: 0x6cd9b220, 0x1c0b3: 0x6d27b220, + 0x1c0b4: 0x6d054420, 0x1c0b5: 0x6d19ec20, 0x1c0b6: 0x6cc68a20, 0x1c0b7: 0x6c5d2e20, + 0x1c0b8: 0x6cdad020, 0x1c0b9: 0x6cddcc20, 0x1c0ba: 0x6ca6ac20, 0x1c0bb: 0x6cddf420, + 0x1c0bc: 0x6cd1d020, 0x1c0bd: 0x6cc81c20, 0x1c0be: 0x6c002a20, 0x1c0bf: 0x6cacba20, + // Block 0x703, offset 0x1c0c0 + 0x1c0c0: 0x6c1f5020, 0x1c0c1: 0x6c1e7e20, 0x1c0c2: 0x6cacdc20, 0x1c0c3: 0x6cf22c20, + 0x1c0c4: 0x6c123220, 0x1c0c5: 0x6c9ede20, 0x1c0c6: 0x6c440620, 0x1c0c7: 0x6c2cce20, + 0x1c0c8: 0x6c504420, 0x1c0c9: 0x6c5a7020, 0x1c0ca: 0x6cf8a020, 0x1c0cb: 0x6d3e4020, + 0x1c0cc: 0x6c2b7220, 0x1c0cd: 0x6d365a20, 0x1c0ce: 0x6d03f220, 0x1c0cf: 0x6c3f6c20, + 0x1c0d0: 0x6c6aea20, 0x1c0d1: 0x6c573e20, 0x1c0d2: 0x6c439a20, 0x1c0d3: 0x6d3f1a20, + 0x1c0d4: 0x6ce1d820, 0x1c0d5: 0x6ce2aa20, 0x1c0d6: 0x6cdbc820, 0x1c0d7: 0x6c09c820, + 0x1c0d8: 0x6c69a420, 0x1c0d9: 0x6c5be620, 0x1c0da: 0x6c4bce20, 0x1c0db: 0x6d1a7020, + 0x1c0dc: 0x6c42ca20, 0x1c0dd: 0x6c8f9620, 0x1c0de: 0x6d362c20, 0x1c0df: 0x6d0e8820, + 0x1c0e0: 0x6ccf5820, 0x1c0e1: 0x6c97be20, 0x1c0e2: 0x6d1c8020, 0x1c0e3: 0x6c215020, + 0x1c0e4: 0x6c93e620, 0x1c0e5: 0x6c807420, 0x1c0e6: 0x6c943e20, 0x1c0e7: 0x6d003420, + 0x1c0e8: 0x6c0d3c20, 0x1c0e9: 0x6cdfb020, 0x1c0ea: 0x6d236e20, 0x1c0eb: 0x6d052420, + 0x1c0ec: 0x6c56b820, 0x1c0ed: 0x6c09ca20, 0x1c0ee: 0x6c0c0c20, 0x1c0ef: 0x6d368e20, + 0x1c0f0: 0x6c67f220, 0x1c0f1: 0x6c79f620, 0x1c0f2: 0x6cd0be20, 0x1c0f3: 0x6cce0e20, + 0x1c0f4: 0x6c2b3a20, 0x1c0f5: 0x6c9d6820, 0x1c0f6: 0x6c025220, 0x1c0f7: 0x6c91cc20, + 0x1c0f8: 0x6c562820, 0x1c0f9: 0x6c54e820, 0x1c0fa: 0x6d1eac20, 0x1c0fb: 0x6c15cc20, + 0x1c0fc: 0x6c396420, 0x1c0fd: 0x6d1d9e20, 0x1c0fe: 0x6c4bd620, 0x1c0ff: 0x6c97c420, + // Block 0x704, offset 0x1c100 + 0x1c100: 0x6cbeae20, 0x1c101: 0x6d216e20, 0x1c102: 0x6cb1b820, 0x1c103: 0x6c623e20, + 0x1c104: 0x6d0b3420, 0x1c105: 0x6c176e20, 0x1c106: 0x6cb51220, 0x1c107: 0x6cf7fe20, + 0x1c108: 0x6c624020, 0x1c109: 0x6c928620, 0x1c10a: 0x6c90a620, 0x1c10b: 0x6c8f9c20, + 0x1c10c: 0x6c6ca020, 0x1c10d: 0x6c4c7a20, 0x1c10e: 0x6c23a620, 0x1c10f: 0x6c910e20, + 0x1c110: 0x6d349020, 0x1c111: 0x6c414c20, 0x1c112: 0x6cbb1a20, 0x1c113: 0x6c83e220, + 0x1c114: 0x6d0db420, 0x1c115: 0x6c127e20, 0x1c116: 0x6c69b020, 0x1c117: 0x6c232a20, + 0x1c118: 0x6c215620, 0x1c119: 0x6ce95620, 0x1c11a: 0x6cab4020, 0x1c11b: 0x6ce2a820, + 0x1c11c: 0x6d12b020, 0x1c11d: 0x6cf79220, 0x1c11e: 0x6c9d6a20, 0x1c11f: 0x6ce11220, + 0x1c120: 0x6ca12c20, 0x1c121: 0x6cce1020, 0x1c122: 0x6c4ee620, 0x1c123: 0x6c881620, + 0x1c124: 0x6c803220, 0x1c125: 0x6cebe820, 0x1c126: 0x6c1b4820, 0x1c127: 0x6c41aa20, + 0x1c128: 0x6c3cae20, 0x1c129: 0x6d081a20, 0x1c12a: 0x6d140420, 0x1c12b: 0x6c97ec20, + 0x1c12c: 0x6d3f5c20, 0x1c12d: 0x6c989620, 0x1c12e: 0x6c774020, 0x1c12f: 0x6c961620, + 0x1c130: 0x6cae7a20, 0x1c131: 0x6cd5f420, 0x1c132: 0x6d2f0620, 0x1c133: 0x6d2eca20, + 0x1c134: 0x6d3c4620, 0x1c135: 0x6d070c20, 0x1c136: 0x6c594020, 0x1c137: 0x6c5d9020, + 0x1c138: 0x6c66aa20, 0x1c139: 0x6d0c1c20, 0x1c13a: 0x6cd6d820, 0x1c13b: 0x6c89f820, + 0x1c13c: 0x6c24fa20, 0x1c13d: 0x6ce36420, 0x1c13e: 0x6d106020, 0x1c13f: 0x6c677220, + // Block 0x705, offset 0x1c140 + 0x1c140: 0x6c23a820, 0x1c141: 0x6d1d0620, 0x1c142: 0x6c537220, 0x1c143: 0x6d0a1c20, + 0x1c144: 0x6cd5f620, 0x1c145: 0x6c499a20, 0x1c146: 0x6d1c8620, 0x1c147: 0x6cfeee20, + 0x1c148: 0x6d404220, 0x1c149: 0x6c7de020, 0x1c14a: 0x6d070e20, 0x1c14b: 0x6c890c20, + 0x1c14c: 0x6d369020, 0x1c14d: 0x6cef2020, 0x1c14e: 0x6cb0ac20, 0x1c14f: 0x6d23c420, + 0x1c150: 0x6c69be20, 0x1c151: 0x6cb3c420, 0x1c152: 0x6c297820, 0x1c153: 0x6c5c1820, + 0x1c154: 0x6c6b1c20, 0x1c155: 0x6cf46820, 0x1c156: 0x6cabdc20, 0x1c157: 0x6c608620, + 0x1c158: 0x6cac4220, 0x1c159: 0x6cef2c20, 0x1c15a: 0x6cdb1820, 0x1c15b: 0x6cb9b820, + 0x1c15c: 0x6cb9ba20, 0x1c15d: 0x6cf69c20, 0x1c15e: 0x6c92cc20, 0x1c15f: 0x6cf8c620, + 0x1c160: 0x6d0aa220, 0x1c161: 0x6c340620, 0x1c162: 0x6c59da20, 0x1c163: 0x6c9fc620, + 0x1c164: 0x6cc90420, 0x1c165: 0x6cdb0020, 0x1c166: 0x6c81b820, 0x1c167: 0x6d318a20, + 0x1c168: 0x6c23aa20, 0x1c169: 0x6d182820, 0x1c16a: 0x6d30fe20, 0x1c16b: 0x6cec9820, + 0x1c16c: 0x6ccd9e20, 0x1c16d: 0x6ce00420, 0x1c16e: 0x6c177620, 0x1c16f: 0x6d0a3220, + 0x1c170: 0x6c7d0e20, 0x1c171: 0x6d126420, 0x1c172: 0x6ccee420, 0x1c173: 0x6ce8da20, + 0x1c174: 0x6d39bc20, 0x1c175: 0x6cc95820, 0x1c176: 0x6c522220, 0x1c177: 0x6c0a2a20, + 0x1c178: 0x6ccd0820, 0x1c179: 0x6c151c20, 0x1c17a: 0x6c151e20, 0x1c17b: 0x6cd56820, + 0x1c17c: 0x6ce77c20, 0x1c17d: 0x6cb41020, 0x1c17e: 0x6c8bce20, 0x1c17f: 0x6cef2e20, + // Block 0x706, offset 0x1c180 + 0x1c180: 0x6ccb6c20, 0x1c181: 0x6ccb4620, 0x1c182: 0x6c1a3820, 0x1c183: 0x6c6f3020, + 0x1c184: 0x6c1a3a20, 0x1c185: 0x6c57be20, 0x1c186: 0x6c686c20, 0x1c187: 0x6c81dc20, + 0x1c188: 0x6c183420, 0x1c189: 0x6c41e020, 0x1c18a: 0x6c259c20, 0x1c18b: 0x6c53cc20, + 0x1c18c: 0x6cd81820, 0x1c18d: 0x6cd60220, 0x1c18e: 0x6cae8420, 0x1c18f: 0x6c4e2a20, + 0x1c190: 0x6d27c020, 0x1c191: 0x6c8f3c20, 0x1c192: 0x6c53ce20, 0x1c193: 0x6c3ed820, + 0x1c194: 0x6c505a20, 0x1c195: 0x6c513e20, 0x1c196: 0x6cfb8020, 0x1c197: 0x6c66b620, + 0x1c198: 0x6ccd0a20, 0x1c199: 0x6cf8c820, 0x1c19a: 0x6d24c220, 0x1c19b: 0x6c934c20, + 0x1c19c: 0x6c7fac20, 0x1c19d: 0x6ca96020, 0x1c19e: 0x6d21a220, 0x1c19f: 0x6c8c3420, + 0x1c1a0: 0x6c9e4020, 0x1c1a1: 0x6d2a5020, 0x1c1a2: 0x6c290420, 0x1c1a3: 0x6c595420, + 0x1c1a4: 0x6d2afc20, 0x1c1a5: 0x6d021620, 0x1c1a6: 0x6d23ea20, 0x1c1a7: 0x6c853020, + 0x1c1a8: 0x6cd3da20, 0x1c1a9: 0x6d091c20, 0x1c1aa: 0x6c8d5820, 0x1c1ab: 0x6ced9420, + 0x1c1ac: 0x6d3e8a20, 0x1c1ad: 0x6d1db420, 0x1c1ae: 0x6c5c3420, 0x1c1af: 0x6c120420, + 0x1c1b0: 0x6c891620, 0x1c1b1: 0x6c2d8420, 0x1c1b2: 0x6d134020, 0x1c1b3: 0x6c02ec20, + 0x1c1b4: 0x6c589820, 0x1c1b5: 0x6d319220, 0x1c1b6: 0x6c152420, 0x1c1b7: 0x6c980420, + 0x1c1b8: 0x6c284420, 0x1c1b9: 0x6c28b220, 0x1c1ba: 0x6d189e20, 0x1c1bb: 0x6cdc5c20, + 0x1c1bc: 0x6cb0ba20, 0x1c1bd: 0x6c728e20, 0x1c1be: 0x6cde8e20, 0x1c1bf: 0x6cbda420, + // Block 0x707, offset 0x1c1c0 + 0x1c1c0: 0x6c5f3420, 0x1c1c1: 0x6d3d9a20, 0x1c1c2: 0x6c884c20, 0x1c1c3: 0x6ca9c620, + 0x1c1c4: 0x6c4c3020, 0x1c1c5: 0x6c6d4e20, 0x1c1c6: 0x6c3b8c20, 0x1c1c7: 0x6ccb5a20, + 0x1c1c8: 0x6c608820, 0x1c1c9: 0x6cdbda20, 0x1c1ca: 0x6c5c3620, 0x1c1cb: 0x6c1eea20, + 0x1c1cc: 0x6cdeac20, 0x1c1cd: 0x6cd93620, 0x1c1ce: 0x6c2f7e20, 0x1c1cf: 0x6ccba620, + 0x1c1d0: 0x6d3a7e20, 0x1c1d1: 0x6c7f5620, 0x1c1d2: 0x6c0d5220, 0x1c1d3: 0x6c884e20, + 0x1c1d4: 0x6c9d0220, 0x1c1d5: 0x6cd20220, 0x1c1d6: 0x6cd60c20, 0x1c1d7: 0x6c9d8620, + 0x1c1d8: 0x6ca95a20, 0x1c1d9: 0x6d1ca220, 0x1c1da: 0x6d1ca420, 0x1c1db: 0x6c9b4c20, + 0x1c1dc: 0x6c6d5e20, 0x1c1dd: 0x6cb65e20, 0x1c1de: 0x6c0a7020, 0x1c1df: 0x6c629820, + 0x1c1e0: 0x6c4ff420, 0x1c1e1: 0x6cc7d220, 0x1c1e2: 0x6c256a20, 0x1c1e3: 0x6cf31c20, + 0x1c1e4: 0x6ce1f020, 0x1c1e5: 0x6d1b0e20, 0x1c1e6: 0x6d1b1020, 0x1c1e7: 0x6c336820, + 0x1c1e8: 0x6c226c20, 0x1c1e9: 0x6c5df820, 0x1c1ea: 0x6c6eb220, 0x1c1eb: 0x6c807c20, + 0x1c1ec: 0x6c75f020, 0x1c1ed: 0x6c007820, 0x1c1ee: 0x6cb45820, 0x1c1ef: 0x6d3db020, + 0x1c1f0: 0x6cef4020, 0x1c1f1: 0x6c0d5420, 0x1c1f2: 0x6c47d620, 0x1c1f3: 0x6cb9d620, + 0x1c1f4: 0x6d1ca620, 0x1c1f5: 0x6c0d9c20, 0x1c1f6: 0x6c7e1c20, 0x1c1f7: 0x6c3ade20, + 0x1c1f8: 0x6c125e20, 0x1c1f9: 0x6c99c820, 0x1c1fa: 0x6c66f020, 0x1c1fb: 0x6cf02620, + 0x1c1fc: 0x6c963420, 0x1c1fd: 0x6d29a420, 0x1c1fe: 0x6c940e20, 0x1c1ff: 0x6c869e20, + // Block 0x708, offset 0x1c200 + 0x1c200: 0x6d1ebe20, 0x1c201: 0x6d106e20, 0x1c202: 0x6c91ea20, 0x1c203: 0x6cd8f420, + 0x1c204: 0x6d36e220, 0x1c205: 0x6d1cb220, 0x1c206: 0x6c31cc20, 0x1c207: 0x6cee3c20, + 0x1c208: 0x6c5afc20, 0x1c209: 0x6d024020, 0x1c20a: 0x6cac8020, 0x1c20b: 0x6cd08420, + 0x1c20c: 0x6c0c3820, 0x1c20d: 0x6c153820, 0x1c20e: 0x6ca17220, 0x1c20f: 0x6c8eba20, + 0x1c210: 0x6c651620, 0x1c211: 0x6cb4ba20, 0x1c212: 0x6ccb7420, 0x1c213: 0x6c1a4e20, + 0x1c214: 0x6c47e220, 0x1c215: 0x6c0d6820, 0x1c216: 0x6c5e2820, 0x1c217: 0x6cfd3020, + 0x1c218: 0x6c917220, 0x1c219: 0x6cbe2620, 0x1c21a: 0x6c4f2c20, 0x1c21b: 0x6d1cba20, + 0x1c21c: 0x6cc6d820, 0x1c21d: 0x6c86f820, 0x1c21e: 0x6c6eb420, 0x1c21f: 0x6cff3a20, + 0x1c220: 0x6d1cbc20, 0x1c221: 0x6cdc0e20, 0x1c222: 0x6cf03c20, 0x1c223: 0x6d025620, + 0x1c224: 0x6c57fc20, 0x1c225: 0x6d097820, 0x1c226: 0x6d39d420, 0x1c227: 0x6c8fc620, + 0x1c228: 0x6c7f6a20, 0x1c229: 0x6c337820, 0x1c22a: 0x6c38de20, 0x1c22b: 0x6c55ee20, + 0x1c22c: 0x6c7f6c20, 0x1c22d: 0x6cd63420, 0x1c22e: 0x6c8e3220, 0x1c22f: 0x6d1cbe20, + 0x1c230: 0x6c9ca020, 0x1c231: 0x6c62c820, 0x1c232: 0x6c892c20, 0x1c233: 0x6c66fe20, + 0x1c234: 0x6d1cc620, 0x1c235: 0x6c3c0220, 0x1c236: 0x6c8c0020, 0x1c237: 0x6d192c20, + 0x1c238: 0x6c653220, 0x1c239: 0x6d270a20, 0x1c23a: 0x6c155620, 0x1c23b: 0x6c27a620, + 0x1c23c: 0x6cc4e620, 0x1c23d: 0x6c661820, 0x1c23e: 0x6c7fe820, 0x1c23f: 0x6c38e020, + // Block 0x709, offset 0x1c240 + 0x1c240: 0x6cd6f420, 0x1c241: 0x6d252620, 0x1c242: 0x6d3dd420, 0x1c243: 0x6c3c8020, + 0x1c244: 0x6ccf8c20, 0x1c245: 0x6c830220, 0x1c246: 0x6c7fea20, 0x1c247: 0x6c23c620, + 0x1c248: 0x6cc20020, 0x1c249: 0x6d1dda20, 0x1c24a: 0x6cb9e020, 0x1c24b: 0x6c383620, + 0x1c24c: 0x6c49b420, 0x1c24d: 0x6cc41a20, 0x1c24e: 0x6d0f2220, 0x1c24f: 0x6c507c20, + 0x1c250: 0x6d1d7020, 0x1c251: 0x6cc95c20, 0x1c252: 0x6d29ba20, 0x1c253: 0x6c946020, + 0x1c254: 0x6d0f0420, 0x1c255: 0x6c84a820, 0x1c256: 0x6c9d0e20, 0x1c257: 0x6ccde820, + 0x1c258: 0x6cdfc620, 0x1c259: 0x6c293e20, 0x1c25a: 0x6c697620, 0x1c25b: 0x6c161820, + 0x1c25c: 0x6d1d7220, 0x1c25d: 0x6c508420, 0x1c25e: 0x6c03dc20, 0x1c25f: 0x6d3a4220, + 0x1c260: 0x6c805e20, 0x1c261: 0x6c800820, 0x1c262: 0x6ca47820, 0x1c263: 0x6cecac20, + 0x1c264: 0x6c947020, 0x1c265: 0x6d0a5e20, 0x1c266: 0x6cfc6a20, 0x1c267: 0x6d0f2820, + 0x1c268: 0x6c424820, 0x1c269: 0x6d0f3220, 0x1c26a: 0x6d24ac20, 0x1c26b: 0x6c5d8420, + 0x1c26c: 0x6c0be820, 0x1c26d: 0x6c9eca20, 0x1c26e: 0x6c49d220, 0x1c26f: 0x6c2a9a20, + 0x1c270: 0x6c5a8620, 0x1c271: 0x6cfe7a20, 0x1c272: 0x6cfe7c20, 0x1c273: 0x6c5caa20, + 0x1c274: 0x6c529620, 0x1c275: 0x6c8c9c20, 0x1c276: 0x6d2a6620, 0x1c277: 0x6d3bbe20, + 0x1c278: 0x6c6faa20, 0x1c279: 0x6d2ca820, 0x1c27a: 0x6d015820, 0x1c27b: 0x6c1be420, + 0x1c27c: 0x6d3d2420, 0x1c27d: 0x6d28f220, 0x1c27e: 0x6d28f420, 0x1c27f: 0x6c11ec20, + // Block 0x70a, offset 0x1c280 + 0x1c280: 0x6d0f8020, 0x1c281: 0x6cb74820, 0x1c282: 0x6d379c20, 0x1c283: 0x6c3b5e20, + 0x1c284: 0x6ca98220, 0x1c285: 0x6c6efa20, 0x1c286: 0x6cf18220, 0x1c287: 0x6cb36820, + 0x1c288: 0x6d16c420, 0x1c289: 0x6c913c20, 0x1c28a: 0x6c20b620, 0x1c28b: 0x6caf4020, + 0x1c28c: 0x6c767e20, 0x1c28d: 0x6caca420, 0x1c28e: 0x6d0c6a20, 0x1c28f: 0x6c768020, + 0x1c290: 0x6cad2620, 0x1c291: 0x6ca26e20, 0x1c292: 0x6c179020, 0x1c293: 0x6c8a9220, + 0x1c294: 0x6c4b3420, 0x1c295: 0x6c778220, 0x1c296: 0x6c33dc20, 0x1c297: 0x6c49d620, + 0x1c298: 0x6d02b820, 0x1c299: 0x6d358c20, 0x1c29a: 0x6c4a2e20, 0x1c29b: 0x6c49d820, + 0x1c29c: 0x6cef9420, 0x1c29d: 0x6cbb5420, 0x1c29e: 0x6c0be420, 0x1c29f: 0x6c268420, + 0x1c2a0: 0x6cf99820, 0x1c2a1: 0x6d329a20, 0x1c2a2: 0x6d39fc20, 0x1c2a3: 0x6c785e20, + 0x1c2a4: 0x6d2fa220, 0x1c2a5: 0x6c3e1420, 0x1c2a6: 0x6c036e20, 0x1c2a7: 0x6d017420, + 0x1c2a8: 0x6c34dc20, 0x1c2a9: 0x6c8e1e20, 0x1c2aa: 0x6d3cf220, 0x1c2ab: 0x6d087a20, + 0x1c2ac: 0x6c721420, 0x1c2ad: 0x6ce08e20, 0x1c2ae: 0x6cad8420, 0x1c2af: 0x6c6f0220, + 0x1c2b0: 0x6cad5020, 0x1c2b1: 0x6cdf1e20, 0x1c2b2: 0x6cdf2020, 0x1c2b3: 0x6c0dd220, + 0x1c2b4: 0x6d100c20, 0x1c2b5: 0x6ce6f020, 0x1c2b6: 0x6c4d9420, 0x1c2b7: 0x6d3ac220, + 0x1c2b8: 0x6d2cb820, 0x1c2b9: 0x6c2d0a20, 0x1c2ba: 0x6cf07a20, 0x1c2bb: 0x6cd25220, + 0x1c2bc: 0x6c88e620, 0x1c2bd: 0x6c1bfc20, 0x1c2be: 0x6c5a4a20, 0x1c2bf: 0x6d397820, + // Block 0x70b, offset 0x1c2c0 + 0x1c2c0: 0x6c54ae20, 0x1c2c1: 0x6cd77020, 0x1c2c2: 0x6c806e20, 0x1c2c3: 0x6ce63620, + 0x1c2c4: 0x6c68de20, 0x1c2c5: 0x6d06a820, 0x1c2c6: 0x6c525e20, 0x1c2c7: 0x6cc35420, + 0x1c2c8: 0x6c8af020, 0x1c2c9: 0x6c590820, 0x1c2ca: 0x6d0fa020, 0x1c2cb: 0x6d04c420, + 0x1c2cc: 0x6d04c620, 0x1c2cd: 0x6cfbfe20, 0x1c2ce: 0x6d1a3020, 0x1c2cf: 0x6cf36020, + 0x1c2d0: 0x6d386620, 0x1c2d1: 0x6d10e220, 0x1c2d2: 0x6cd35020, 0x1c2d3: 0x6cee6e20, + 0x1c2d4: 0x6ce73620, 0x1c2d5: 0x6c9ece20, 0x1c2d6: 0x6d28fe20, 0x1c2d7: 0x6c768420, + 0x1c2d8: 0x6c529e20, 0x1c2d9: 0x6c81d020, 0x1c2da: 0x6cf9a820, 0x1c2db: 0x6d3a0420, + 0x1c2dc: 0x6d084a20, 0x1c2dd: 0x6d32a020, 0x1c2de: 0x6cb37820, 0x1c2df: 0x6d0be420, + 0x1c2e0: 0x6c5b2e20, 0x1c2e1: 0x6c49e620, 0x1c2e2: 0x6c180e20, 0x1c2e3: 0x6c5aa420, + 0x1c2e4: 0x6c77a820, 0x1c2e5: 0x6c194c20, 0x1c2e6: 0x6c389020, 0x1c2e7: 0x6cce6220, + 0x1c2e8: 0x6d12e220, 0x1c2e9: 0x6c5bac20, 0x1c2eb: 0x6ce19a20, + 0x1c2ec: 0x6c6cf220, 0x1c2ed: 0x6cc55020, 0x1c2ee: 0x6c8b9620, 0x1c2ef: 0x6cf5f220, + 0x1c2f0: 0x6c3e5420, 0x1c2f1: 0x6c6f0a20, 0x1c2f2: 0x6d019420, 0x1c2f3: 0x6cb48a20, + 0x1c2f4: 0x6ce64220, 0x1c2f5: 0x6d3d3c20, 0x1c2f6: 0x6ce6c020, 0x1c2f7: 0x6cecd420, + 0x1c2f8: 0x6c4d4020, 0x1c2f9: 0x6cae6a20, 0x1c2fa: 0x6c80fc20, 0x1c2fb: 0x6d0e5220, + 0x1c2fc: 0x6d06bc20, 0x1c2fd: 0x6c3c3e20, 0x1c2fe: 0x6c1c1020, 0x1c2ff: 0x6cc66820, + // Block 0x70c, offset 0x1c300 + 0x1c300: 0x6c554620, 0x1c301: 0x6cf5f420, 0x1c302: 0x6cd4ce20, 0x1c303: 0x6c51c420, + 0x1c304: 0x6d099620, 0x1c305: 0x6c7a9220, 0x1c306: 0x6c72e820, 0x1c307: 0x6cfeb620, + 0x1c308: 0x6cf5f620, 0x1c309: 0x6d0bfa20, 0x1c30a: 0x6c4eb220, 0x1c30b: 0x6d3c3c20, + 0x1c30c: 0x6c75b020, 0x1c30d: 0x6c2c4220, 0x1c30e: 0x6d019620, 0x1c30f: 0x6c601c20, + 0x1c310: 0x6cf4e020, 0x1c311: 0x6d0bfc20, 0x1c312: 0x6c942c20, 0x1c313: 0x6c4e0620, + 0x1c314: 0x6d0e6220, 0x1c315: 0x6c591220, 0x1c316: 0x6c9aee20, 0x1c317: 0x6c711620, + 0x1c318: 0x6c2a1020, 0x1c319: 0x6c072420, 0x1c31a: 0x6c3b7a20, 0x1c31b: 0x6c8c5220, + 0x1c31c: 0x6c7d6220, 0x1c31d: 0x6c5d2820, 0x1c31e: 0x6cea2220, 0x1c31f: 0x6cf61620, + 0x1c320: 0x6c253e20, 0x1c321: 0x6cf3c820, 0x1c322: 0x6c52a820, 0x1c323: 0x6c179c20, + 0x1c324: 0x6c3f6220, 0x1c325: 0x6cf2f420, 0x1c326: 0x6c684820, 0x1c327: 0x6c231820, + 0x1c328: 0x6c3ce220, 0x1c329: 0x6cb2a620, 0x1c32a: 0x6cbf2620, 0x1c32b: 0x6cc91e20, + 0x1c32c: 0x6cf61820, 0x1c32d: 0x6cbf2820, 0x1c32e: 0x6d033420, 0x1c32f: 0x6c174420, + 0x1c330: 0x6d0e7420, 0x1c331: 0x6d0e7620, 0x1c332: 0x6d17aa20, 0x1c333: 0x6c744e20, + 0x1c334: 0x6d234620, 0x1c335: 0x6c42a820, 0x1c336: 0x6cc47820, 0x1c337: 0x6caff020, + 0x1c338: 0x6d049420, 0x1c339: 0x6cee6420, 0x1c33a: 0x6cd10420, 0x1c33b: 0x6c171420, + 0x1c33c: 0x6cce6e20, 0x1c33d: 0x6d048420, 0x1c33e: 0x6ca72420, 0x1c33f: 0x6c44d020, + // Block 0x70d, offset 0x1c340 + 0x1c340: 0x6cf13e20, 0x1c341: 0x6c18d420, 0x1c342: 0x6c51ce20, 0x1c343: 0x6c7cd220, + 0x1c344: 0x6d37fe20, 0x1c345: 0x6c32cc20, 0x1c346: 0x6cf96a20, 0x1c347: 0x6c5ac620, + 0x1c348: 0x6c3ce420, 0x1c349: 0x6c890620, 0x1c34a: 0x6d07a820, 0x1c34b: 0x6d037e20, + 0x1c34c: 0x6c59d220, 0x1c34d: 0x6c690a20, 0x1c34e: 0x6c64b620, 0x1c34f: 0x6c09cc20, + 0x1c350: 0x6d1bbc20, 0x1c351: 0x6d3a7020, 0x1c352: 0x6cefde20, 0x1c353: 0x6ce93620, + 0x1c354: 0x6ccd4a20, 0x1c355: 0x6cf67020, 0x1c356: 0x6caa9620, 0x1c357: 0x6caa9820, + 0x1c358: 0x6c150220, 0x1c359: 0x6d0c1220, 0x1c35a: 0x6c6f1020, 0x1c35b: 0x6c6f2420, + 0x1c35c: 0x6d237020, 0x1c35d: 0x6c9a9c20, 0x1c35e: 0x6ccbfc20, 0x1c35f: 0x6cf0a620, + 0x1c360: 0x6d2c3820, 0x1c361: 0x6d033620, 0x1c362: 0x6cbf3e20, 0x1c363: 0x6cc75020, + 0x1c364: 0x6c9a0c20, 0x1c365: 0x6c593620, 0x1c366: 0x6d06f420, 0x1c367: 0x6d2fbe20, + 0x1c368: 0x6ceea020, 0x1c369: 0x6c38a620, 0x1c36a: 0x6cc07620, 0x1c36b: 0x6cdc4a20, + 0x1c36c: 0x6d0fc820, 0x1c36d: 0x6c8b1620, 0x1c36e: 0x6d3a6e20, 0x1c36f: 0x6c6a2220, + 0x1c370: 0x6c434e20, 0x1c371: 0x6c485c20, 0x1c372: 0x6c05b420, 0x1c373: 0x6c557020, + 0x1c374: 0x6d275820, 0x1c375: 0x6cf96c20, 0x1c376: 0x6cd41a20, 0x1c377: 0x6c89ce20, + 0x1c378: 0x6c0afa20, 0x1c379: 0x6c46c420, 0x1c37a: 0x6cea0020, 0x1c37b: 0x6ce11420, + 0x1c37c: 0x6c17a020, 0x1c37d: 0x6cccfc20, 0x1c37e: 0x6c371a20, 0x1c37f: 0x6c0f2a20, + // Block 0x70e, offset 0x1c380 + 0x1c380: 0x6c5a5a20, 0x1c381: 0x6d00ce20, 0x1c382: 0x6cf8ae20, 0x1c383: 0x6cf50e20, + 0x1c384: 0x6cf67220, 0x1c385: 0x6d284220, 0x1c386: 0x6c515a20, 0x1c387: 0x6c51d220, + 0x1c388: 0x6cf67420, 0x1c389: 0x6d27bc20, 0x1c38a: 0x6d048020, 0x1c38b: 0x6ca37e20, + 0x1c38c: 0x6ccd5020, 0x1c38d: 0x6cbf8e20, 0x1c38e: 0x6d121620, 0x1c38f: 0x6d099e20, + 0x1c390: 0x6c9d6c20, 0x1c391: 0x6c882420, 0x1c392: 0x6d1c8820, 0x1c393: 0x6cf45a20, + 0x1c394: 0x6cc69a20, 0x1c395: 0x6c459e20, 0x1c396: 0x6d0f3820, 0x1c397: 0x6cbb5820, + 0x1c398: 0x6c8e3820, 0x1c399: 0x6cf67620, 0x1c39a: 0x6c09f820, 0x1c39b: 0x6c0c1820, + 0x1c39c: 0x6c233e20, 0x1c39d: 0x6c92a620, 0x1c39e: 0x6c64d620, 0x1c39f: 0x6cd53420, + 0x1c3a0: 0x6d185620, 0x1c3a1: 0x6c90b220, 0x1c3a2: 0x6caeb620, 0x1c3a3: 0x6cdbd420, + 0x1c3a4: 0x6d185820, 0x1c3a5: 0x6ce28e20, 0x1c3a6: 0x6c749420, 0x1c3a7: 0x6d3fb220, + 0x1c3a8: 0x6d284620, 0x1c3a9: 0x6c56c020, 0x1c3aa: 0x6d154820, 0x1c3ab: 0x6d36b420, + 0x1c3ac: 0x6c026220, 0x1c3ad: 0x6cf0bc20, 0x1c3ae: 0x6c8f1420, 0x1c3af: 0x6c4efa20, + 0x1c3b0: 0x6cab4c20, 0x1c3b1: 0x6cc55420, 0x1c3b2: 0x6c6f2c20, 0x1c3b3: 0x6c97fc20, + 0x1c3b4: 0x6c7de220, 0x1c3b5: 0x6cce1820, 0x1c3b6: 0x6c24b220, 0x1c3b7: 0x6d2b9020, + 0x1c3b8: 0x6c64f620, 0x1c3b9: 0x6cf6c620, 0x1c3ba: 0x6cf6c820, 0x1c3bb: 0x6cf6ca20, + 0x1c3bc: 0x6d185a20, 0x1c3bd: 0x6d000c20, 0x1c3be: 0x6c1c6e20, 0x1c3bf: 0x6c59ea20, + // Block 0x70f, offset 0x1c3c0 + 0x1c3c0: 0x6c15e420, 0x1c3c1: 0x6d131820, 0x1c3c2: 0x6ce01020, 0x1c3c3: 0x6cc48820, + 0x1c3c4: 0x6d0ec020, 0x1c3c5: 0x6cfb9420, 0x1c3c6: 0x6cbbae20, 0x1c3c7: 0x6c75e820, + 0x1c3c8: 0x6c2aaa20, 0x1c3c9: 0x6c340a20, 0x1c3ca: 0x6cd01820, 0x1c3cb: 0x6c687a20, + 0x1c3cc: 0x6c3b9620, 0x1c3cd: 0x6cd82a20, 0x1c3ce: 0x6c8a1a20, 0x1c3cf: 0x6d23ee20, + 0x1c3d0: 0x6c8bde20, 0x1c3d1: 0x6ce78a20, 0x1c3d2: 0x6cce8420, 0x1c3d3: 0x6c3b4620, + 0x1c3d4: 0x6c38bc20, 0x1c3d5: 0x6d0ec220, 0x1c3d6: 0x6d0a3e20, 0x1c3d7: 0x6c807620, + 0x1c3d8: 0x6c9a6a20, 0x1c3d9: 0x6ce1a220, 0x1c3da: 0x6d18a220, 0x1c3db: 0x6c6e3020, + 0x1c3dc: 0x6c9afc20, 0x1c3dd: 0x6c6ecc20, 0x1c3de: 0x6c694420, 0x1c3df: 0x6d1c9a20, + 0x1c3e0: 0x6d23f020, 0x1c3e1: 0x6d18ca20, 0x1c3e2: 0x6d091e20, 0x1c3e3: 0x6c7fc020, + 0x1c3e4: 0x6cdf8020, 0x1c3e5: 0x6d2a9220, 0x1c3e6: 0x6c120c20, 0x1c3e7: 0x6cdc7420, + 0x1c3e8: 0x6cf6ea20, 0x1c3e9: 0x6cc40220, 0x1c3ea: 0x6c235420, 0x1c3eb: 0x6c886220, + 0x1c3ec: 0x6c5b6e20, 0x1c3ed: 0x6d3a2c20, 0x1c3ee: 0x6d022c20, 0x1c3ef: 0x6c8d6e20, + 0x1c3f0: 0x6ceec020, 0x1c3f1: 0x6d18cc20, 0x1c3f2: 0x6d00fc20, 0x1c3f3: 0x6d2fe220, + 0x1c3f4: 0x6c5c5220, 0x1c3f5: 0x6c270020, 0x1c3f6: 0x6ca9ce20, 0x1c3f7: 0x6c7fc220, + 0x1c3f8: 0x6cc7de20, 0x1c3f9: 0x6cfc3a20, 0x1c3fa: 0x6c77b620, 0x1c3fb: 0x6d09ba20, + 0x1c3fc: 0x6c6d6620, 0x1c3fd: 0x6c1df820, 0x1c3fe: 0x6c2a3a20, 0x1c3ff: 0x6d123020, + // Block 0x710, offset 0x1c400 + 0x1c400: 0x6c51fc20, 0x1c401: 0x6c807e20, 0x1c402: 0x6c0c4220, 0x1c403: 0x6cc6ce20, + 0x1c404: 0x6c86d020, 0x1c405: 0x6ca18220, 0x1c406: 0x6c067820, 0x1c407: 0x6cc93220, + 0x1c408: 0x6c941420, 0x1c409: 0x6c7ea620, 0x1c40a: 0x6c023620, 0x1c40b: 0x6d0ab020, + 0x1c40c: 0x6c7c1020, 0x1c40d: 0x6cd7aa20, 0x1c40e: 0x6c8ab420, 0x1c40f: 0x6c872020, + 0x1c410: 0x6c918420, 0x1c411: 0x6c74ea20, 0x1c412: 0x6c8a8620, 0x1c413: 0x6d0efa20, + 0x1c414: 0x6cf73a20, 0x1c415: 0x6d025a20, 0x1c416: 0x6c8fde20, 0x1c417: 0x6d136e20, + 0x1c418: 0x6c121a20, 0x1c419: 0x6cc50c20, 0x1c41a: 0x6d271420, 0x1c41b: 0x6c808820, + 0x1c41c: 0x6c23ce20, 0x1c41d: 0x6c750c20, 0x1c41e: 0x6c1d3220, 0x1c41f: 0x6c49b620, + 0x1c420: 0x6c72d620, 0x1c421: 0x6c185620, 0x1c422: 0x6c9cba20, 0x1c423: 0x6ce19220, + 0x1c424: 0x6c809220, 0x1c425: 0x6d3a4820, 0x1c426: 0x6c809a20, 0x1c427: 0x6c8dda20, + 0x1c428: 0x6c24c420, 0x1c429: 0x6d24b220, 0x1c42a: 0x6d2f8020, 0x1c42b: 0x6d2ff420, + 0x1c42c: 0x6cabd220, 0x1c42d: 0x6d328c20, 0x1c42e: 0x6cad5220, 0x1c42f: 0x6c195820, + 0x1c430: 0x6d254620, 0x1c431: 0x6c009620, 0x1c432: 0x6cf09c20, 0x1c433: 0x6c4f4420, + 0x1c434: 0x6c749620, 0x1c435: 0x6c74c820, 0x1c436: 0x6c3fa020, 0x1c437: 0x6d13b020, + 0x1c438: 0x6c03aa20, 0x1c439: 0x6c2e5620, 0x1c43a: 0x6d13b420, 0x1c43b: 0x6d10c620, + 0x1c43c: 0x6d411020, 0x1c43d: 0x6cd6d020, 0x1c43e: 0x6c379e20, 0x1c43f: 0x6cac5020, + // Block 0x711, offset 0x1c440 + 0x1c440: 0x6c206e20, 0x1c441: 0x6c77e220, 0x1c442: 0x6d29d420, 0x1c443: 0x6c2ec020, + 0x1c444: 0x6cbace20, 0x1c445: 0x6d1dfc20, 0x1c446: 0x6cbb2a20, 0x1c447: 0x6cb14420, + 0x1c448: 0x6c04be20, 0x1c449: 0x6cacac20, 0x1c44a: 0x6c175a20, 0x1c44b: 0x6c64a020, + 0x1c44c: 0x6cac0020, 0x1c44d: 0x6c31a020, 0x1c44e: 0x6c205420, 0x1c44f: 0x6d215a20, + 0x1c450: 0x6d2c3a20, 0x1c451: 0x6c0afc20, 0x1c452: 0x6c2ec220, 0x1c453: 0x6c055420, + 0x1c454: 0x6c0f2c20, 0x1c455: 0x6c205a20, 0x1c456: 0x6d1fea20, 0x1c457: 0x6d206e20, + 0x1c458: 0x6c31d620, 0x1c459: 0x6d0b0820, 0x1c45a: 0x6c197220, 0x1c45b: 0x6ca96620, + 0x1c45c: 0x6ca9ac20, 0x1c45d: 0x6cb24020, 0x1c45e: 0x6c6f4c20, 0x1c45f: 0x6ca1be20, + 0x1c460: 0x6cdde020, 0x1c461: 0x6ca22420, 0x1c462: 0x6c814220, 0x1c463: 0x6cc5c420, + 0x1c464: 0x6c981a20, 0x1c465: 0x6c398a20, 0x1c466: 0x6c98ca20, 0x1c467: 0x6ca27020, + 0x1c468: 0x6c426020, 0x1c469: 0x6cf4b820, 0x1c46a: 0x6d0e4020, 0x1c46b: 0x6c437420, + 0x1c46c: 0x6c06ec20, 0x1c46d: 0x6cd8a020, 0x1c46e: 0x6c665e20, 0x1c46f: 0x6c476620, + 0x1c470: 0x6d202c20, 0x1c471: 0x6c437e20, 0x1c472: 0x6cd0f220, 0x1c473: 0x6ca23020, + 0x1c474: 0x6c2be620, 0x1c475: 0x6cb8be20, 0x1c476: 0x6cc37020, 0x1c477: 0x6cc2cc20, + 0x1c478: 0x6d3f4020, 0x1c479: 0x6ce27020, 0x1c47a: 0x6cf5c420, 0x1c47b: 0x6c985620, + 0x1c47c: 0x6c793820, 0x1c47d: 0x6cb8d820, 0x1c47e: 0x6cf44620, 0x1c47f: 0x6c481220, + // Block 0x712, offset 0x1c480 + 0x1c480: 0x6cf61a20, 0x1c481: 0x6c83c220, 0x1c482: 0x6c83da20, 0x1c483: 0x6cb3f420, + 0x1c484: 0x6c5ed420, 0x1c485: 0x6c428220, 0x1c486: 0x6d346420, 0x1c487: 0x6c078820, + 0x1c488: 0x6cc2f220, 0x1c489: 0x6c214e20, 0x1c48a: 0x6c31a220, 0x1c48b: 0x6c724a20, + 0x1c48c: 0x6c636e20, 0x1c48d: 0x6c64a220, 0x1c48e: 0x6c3c5620, 0x1c48f: 0x6cb0f820, + 0x1c490: 0x6c780820, 0x1c491: 0x6c713020, 0x1c492: 0x6c77c220, 0x1c493: 0x6c1e9c20, + 0x1c494: 0x6cf8b220, 0x1c495: 0x6c074020, 0x1c496: 0x6c961820, 0x1c497: 0x6c6bf220, + 0x1c498: 0x6c967220, 0x1c499: 0x6cca0820, 0x1c49a: 0x6cf0be20, 0x1c49b: 0x6c98fc20, + 0x1c49c: 0x6c33b020, 0x1c49d: 0x6ce78c20, 0x1c49e: 0x6cbc7620, 0x1c49f: 0x6c67fc20, + 0x1c4a0: 0x6cf94820, 0x1c4a1: 0x6c86d220, 0x1c4a2: 0x6c31d820, 0x1c4a3: 0x6c8b5e20, + 0x1c4a4: 0x6cac1020, 0x1c4a5: 0x6cb16e20, 0x1c4a6: 0x6c0fa620, 0x1c4a7: 0x6cf73c20, + 0x1c4a8: 0x6c1d8620, 0x1c4a9: 0x6cef6820, 0x1c4aa: 0x6c7cc220, 0x1c4ab: 0x6c1d8a20, + 0x1c4ac: 0x6cc34c20, 0x1c4ad: 0x6cc38020, 0x1c4ae: 0x6c035e20, 0x1c4af: 0x6c391620, + 0x1c4b0: 0x6cbff420, 0x1c4b1: 0x6c611c20, 0x1c4b2: 0x6c110420, 0x1c4b3: 0x6d3d2220, + 0x1c4b4: 0x6c019c20, 0x1c4b5: 0x6c436820, 0x1c4b6: 0x6d3c3020, 0x1c4b7: 0x6c4a0620, + 0x1c4b8: 0x6c96b020, 0x1c4b9: 0x6d1eee20, 0x1c4ba: 0x6c778020, 0x1c4bb: 0x6c0eae20, + 0x1c4bc: 0x6c544a20, 0x1c4bd: 0x6d0b7620, 0x1c4be: 0x6d1a2820, 0x1c4bf: 0x6c582620, + // Block 0x713, offset 0x1c4c0 + 0x1c4c0: 0x6d3c3420, 0x1c4c1: 0x6d27da20, 0x1c4c2: 0x6c7bba20, 0x1c4c3: 0x6ca97a20, + 0x1c4c4: 0x6c2b5420, 0x1c4c5: 0x6cbe2e20, 0x1c4c6: 0x6d381420, 0x1c4c7: 0x6ca26a20, + 0x1c4c8: 0x6c06d820, 0x1c4c9: 0x6caf4220, 0x1c4ca: 0x6c70fc20, 0x1c4cb: 0x6d147420, + 0x1c4cc: 0x6cd0e420, 0x1c4cd: 0x6cad4e20, 0x1c4ce: 0x6cf98e20, 0x1c4cf: 0x6ceaf220, + 0x1c4d0: 0x6c552620, 0x1c4d1: 0x6c8cae20, 0x1c4d2: 0x6c3a8a20, 0x1c4d3: 0x6cafbe20, + 0x1c4d4: 0x6ca62a20, 0x1c4d5: 0x6d119020, 0x1c4d6: 0x6d201a20, 0x1c4d7: 0x6c467020, + 0x1c4d8: 0x6d094620, 0x1c4d9: 0x6c705e20, 0x1c4da: 0x6c286a20, 0x1c4db: 0x6c0eb820, + 0x1c4dc: 0x6c7a7420, 0x1c4dd: 0x6cfbe820, 0x1c4de: 0x6ca8f820, 0x1c4df: 0x6c586620, + 0x1c4e0: 0x6c523c20, 0x1c4e1: 0x6c68d420, 0x1c4e2: 0x6c50dc20, 0x1c4e3: 0x6d2fa420, + 0x1c4e4: 0x6c5ff620, 0x1c4e5: 0x6d0a7220, 0x1c4e6: 0x6cccd220, 0x1c4e7: 0x6cde3820, + 0x1c4e8: 0x6cc65820, 0x1c4e9: 0x6cd45620, 0x1c4ea: 0x6ce72820, 0x1c4eb: 0x6c81a820, + 0x1c4ec: 0x6c318a20, 0x1c4ed: 0x6cf99c20, 0x1c4ee: 0x6cd1ae20, 0x1c4ef: 0x6c7b1a20, + 0x1c4f0: 0x6d329c20, 0x1c4f1: 0x6d22e420, 0x1c4f2: 0x6cdccc20, 0x1c4f3: 0x6d20f420, + 0x1c4f4: 0x6c096220, 0x1c4f5: 0x6c985420, 0x1c4f6: 0x6cf5c620, 0x1c4f7: 0x6c734c20, + 0x1c4f8: 0x6c87e020, 0x1c4f9: 0x6cf9aa20, 0x1c4fa: 0x6d1a4820, 0x1c4fb: 0x6cdb7e20, + 0x1c4fc: 0x6c80ae20, 0x1c4fd: 0x6c070220, 0x1c4fe: 0x6d35c020, 0x1c4ff: 0x6d0c7420, + // Block 0x714, offset 0x1c500 + 0x1c500: 0x6ccbdc20, 0x1c501: 0x6c85d220, 0x1c502: 0x6c4e9e20, 0x1c503: 0x6cfc0020, + 0x1c504: 0x6c6dae20, 0x1c505: 0x6cabfc20, 0x1c506: 0x6c3a0620, 0x1c507: 0x6cfeb820, + 0x1c508: 0x6c044220, 0x1c509: 0x6cb5cc20, 0x1c50a: 0x6ca5da20, 0x1c50b: 0x6c0bfc20, + 0x1c50c: 0x6d1b5620, 0x1c50d: 0x6c7efe20, 0x1c50e: 0x6c8b0220, 0x1c50f: 0x6c648820, + 0x1c510: 0x6cbaac20, 0x1c511: 0x6c7d5a20, 0x1c512: 0x6d0c0a20, 0x1c513: 0x6c4cba20, + 0x1c514: 0x6d402020, 0x1c515: 0x6c9c4820, 0x1c516: 0x6c166820, 0x1c517: 0x6d13e620, + 0x1c518: 0x6d35e820, 0x1c519: 0x6d32b420, 0x1c51a: 0x6d0b2c20, 0x1c51b: 0x6c9bce20, + 0x1c51c: 0x6c10f820, 0x1c51d: 0x6c243620, 0x1c51e: 0x6cceec20, 0x1c51f: 0x6c8b9820, + 0x1c520: 0x6c2d1620, 0x1c521: 0x6c953e20, 0x1c522: 0x6c556020, 0x1c523: 0x6d3f9020, + 0x1c524: 0x6c4b4620, 0x1c525: 0x6cefc820, 0x1c526: 0x6c3c4c20, 0x1c527: 0x6cf28c20, + 0x1c528: 0x6d256620, 0x1c529: 0x6d037420, 0x1c52a: 0x6d399820, 0x1c52b: 0x6c98ba20, + 0x1c52c: 0x6cf14020, 0x1c52d: 0x6c1fe420, 0x1c52e: 0x6cfcce20, 0x1c52f: 0x6ce93420, + 0x1c530: 0x6d0bb220, 0x1c531: 0x6ca4ac20, 0x1c532: 0x6d004220, 0x1c533: 0x6c636020, + 0x1c534: 0x6c540620, 0x1c535: 0x6c0af420, 0x1c536: 0x6d1f3a20, 0x1c537: 0x6d1f4820, + 0x1c538: 0x6c9a0020, 0x1c539: 0x6c13e420, 0x1c53a: 0x6d111420, 0x1c53b: 0x6cdcd620, + 0x1c53c: 0x6c0f1420, 0x1c53d: 0x6ca00820, 0x1c53e: 0x6c574020, 0x1c53f: 0x6d258620, + // Block 0x715, offset 0x1c540 + 0x1c540: 0x6cd9b420, 0x1c541: 0x6c96c420, 0x1c542: 0x6d258820, 0x1c543: 0x6c270c20, + 0x1c544: 0x6d239220, 0x1c545: 0x6cd1d220, 0x1c546: 0x6c4fcc20, 0x1c547: 0x6cbb6420, + 0x1c548: 0x6d17ea20, 0x1c549: 0x6d316a20, 0x1c54a: 0x6c123420, 0x1c54b: 0x6c4fe220, + 0x1c54c: 0x6c97ee20, 0x1c54d: 0x6c6e9620, 0x1c54e: 0x6c67b820, 0x1c54f: 0x6ca12e20, + 0x1c550: 0x6d2ecc20, 0x1c551: 0x6c150a20, 0x1c552: 0x6c026420, 0x1c553: 0x6c025420, + 0x1c554: 0x6c4fd420, 0x1c555: 0x6c24e020, 0x1c556: 0x6c07c420, 0x1c557: 0x6c749820, + 0x1c558: 0x6c0a2c20, 0x1c559: 0x6c09fe20, 0x1c55a: 0x6c59dc20, 0x1c55b: 0x6cb44a20, + 0x1c55c: 0x6c8bd020, 0x1c55d: 0x6d072620, 0x1c55e: 0x6ce77e20, 0x1c55f: 0x6d121e20, + 0x1c560: 0x6c8a1220, 0x1c561: 0x6cd79020, 0x1c562: 0x6cff0620, 0x1c563: 0x6cd49020, + 0x1c564: 0x6c33a820, 0x1c565: 0x6c69c620, 0x1c566: 0x6c442020, 0x1c567: 0x6c739020, + 0x1c568: 0x6c31b420, 0x1c569: 0x6c5c3820, 0x1c56a: 0x6c7b3e20, 0x1c56b: 0x6cfc2c20, + 0x1c56c: 0x6d021820, 0x1c56d: 0x6cde1820, 0x1c56e: 0x6cfc3220, 0x1c56f: 0x6d09b020, + 0x1c570: 0x6ca92620, 0x1c571: 0x6cb21820, 0x1c572: 0x6c5dfc20, 0x1c573: 0x6caa2a20, + 0x1c574: 0x6c9be620, 0x1c575: 0x6c8b5420, 0x1c576: 0x6ca51e20, 0x1c577: 0x6c4a0c20, + 0x1c578: 0x6cd48420, 0x1c579: 0x6c917420, 0x1c57a: 0x6cde2020, 0x1c57b: 0x6cfd3c20, + 0x1c57c: 0x6c9ca220, 0x1c57d: 0x6cc4e820, 0x1c57e: 0x6c584020, 0x1c57f: 0x6ca52820, + // Block 0x716, offset 0x1c580 + 0x1c580: 0x6c957820, 0x1c581: 0x6cfc5420, 0x1c582: 0x6cb6ac20, 0x1c583: 0x6c751e20, + 0x1c584: 0x6d07fa20, 0x1c585: 0x6c9eae20, 0x1c586: 0x6d3e1a20, 0x1c587: 0x6c93d620, + 0x1c588: 0x6c914c20, 0x1c589: 0x6d22b820, 0x1c58a: 0x6cda7a20, 0x1c58b: 0x6cedda20, + 0x1c58c: 0x6cbff620, 0x1c58d: 0x6c40d220, 0x1c58e: 0x6c2f4c20, 0x1c58f: 0x6c821620, + 0x1c590: 0x6c031620, 0x1c591: 0x6c5e7c20, 0x1c592: 0x6c52fa20, 0x1c593: 0x6c2c1a20, + 0x1c594: 0x6c202e20, 0x1c595: 0x6c416c20, 0x1c596: 0x6c6fac20, 0x1c597: 0x6d20be20, + 0x1c598: 0x6cb6d820, 0x1c599: 0x6d20c020, 0x1c59a: 0x6c170620, 0x1c59b: 0x6c969020, + 0x1c59c: 0x6c456420, 0x1c59d: 0x6cf43020, 0x1c59e: 0x6c3d4220, 0x1c59f: 0x6cf18420, + 0x1c5a0: 0x6c6bc620, 0x1c5a1: 0x6d0b1a20, 0x1c5a2: 0x6c0d2620, 0x1c5a3: 0x6c0b8020, + 0x1c5a4: 0x6c056220, 0x1c5a5: 0x6d268820, 0x1c5a6: 0x6c73f220, 0x1c5a7: 0x6c9ac220, + 0x1c5a8: 0x6c73f420, 0x1c5a9: 0x6cecca20, 0x1c5aa: 0x6c646e20, 0x1c5ab: 0x6c99da20, + 0x1c5ac: 0x6c282420, 0x1c5ad: 0x6cb20420, 0x1c5ae: 0x6cef9620, 0x1c5af: 0x6c585820, + 0x1c5b0: 0x6cfc8020, 0x1c5b1: 0x6cbaa820, 0x1c5b2: 0x6c8cbe20, 0x1c5b3: 0x6c274a20, + 0x1c5b4: 0x6d16fc20, 0x1c5b5: 0x6c016820, 0x1c5b6: 0x6cb28820, 0x1c5b7: 0x6c2d4620, + 0x1c5b8: 0x6c3e1620, 0x1c5b9: 0x6d080220, 0x1c5ba: 0x6cf7da20, 0x1c5bb: 0x6c0e5820, + 0x1c5bc: 0x6c229420, 0x1c5bd: 0x6c467820, 0x1c5be: 0x6c640620, 0x1c5bf: 0x6cce9e20, + // Block 0x717, offset 0x1c5c0 + 0x1c5c0: 0x6cb37220, 0x1c5c1: 0x6c222220, 0x1c5c2: 0x6c77e420, 0x1c5c3: 0x6cc4bc20, + 0x1c5c4: 0x6cd0f420, 0x1c5c5: 0x6ccfbe20, 0x1c5c6: 0x6d14a820, 0x1c5c7: 0x6d411220, + 0x1c5c8: 0x6c633c20, 0x1c5c9: 0x6c9f3a20, 0x1c5ca: 0x6cccd420, 0x1c5cb: 0x6c8efe20, + 0x1c5cc: 0x6c095020, 0x1c5cd: 0x6d312c20, 0x1c5ce: 0x6d312e20, 0x1c5cf: 0x6c73fc20, + 0x1c5d0: 0x6c383820, 0x1c5d1: 0x6c8f7820, 0x1c5d2: 0x6c6c3e20, 0x1c5d3: 0x6c698e20, + 0x1c5d4: 0x6c667020, 0x1c5d5: 0x6c85d420, 0x1c5d6: 0x6c4a1e20, 0x1c5d7: 0x6cfa9220, + 0x1c5d8: 0x6d386820, 0x1c5d9: 0x6c45e420, 0x1c5da: 0x6d0be820, 0x1c5db: 0x6d053420, + 0x1c5dc: 0x6d0fa420, 0x1c5dd: 0x6d063620, 0x1c5de: 0x6c95f620, 0x1c5df: 0x6cda9020, + 0x1c5e0: 0x6d399420, 0x1c5e1: 0x6cbd6420, 0x1c5e2: 0x6d1a4a20, 0x1c5e3: 0x6d09fe20, + 0x1c5e4: 0x6c05f620, 0x1c5e5: 0x6c379220, 0x1c5e6: 0x6cfe2a20, 0x1c5e7: 0x6d10e420, + 0x1c5e8: 0x6cf9ac20, 0x1c5e9: 0x6c4f6620, 0x1c5ea: 0x6c4a4a20, 0x1c5eb: 0x6c1cba20, + 0x1c5ec: 0x6d06ac20, 0x1c5ed: 0x6c047820, 0x1c5ee: 0x6cae1620, 0x1c5ef: 0x6c81f020, + 0x1c5f0: 0x6c28fa20, 0x1c5f1: 0x6d1d6420, 0x1c5f2: 0x6c5aa620, 0x1c5f3: 0x6cf19220, + 0x1c5f4: 0x6c355c20, 0x1c5f5: 0x6c19e820, 0x1c5f6: 0x6c2c4420, 0x1c5f7: 0x6cf44c20, + 0x1c5f8: 0x6cf3c420, 0x1c5f9: 0x6c19e020, 0x1c5fa: 0x6c75b220, 0x1c5fb: 0x6c99ee20, + 0x1c5fc: 0x6c071220, 0x1c5fd: 0x6ce6c220, 0x1c5fe: 0x6cfcb420, 0x1c5ff: 0x6c1f3220, + // Block 0x718, offset 0x1c600 + 0x1c600: 0x6c4e0820, 0x1c601: 0x6d081220, 0x1c602: 0x6d0c8820, 0x1c603: 0x6cc05020, + 0x1c604: 0x6d088a20, 0x1c605: 0x6c80be20, 0x1c606: 0x6c851420, 0x1c607: 0x6d053c20, + 0x1c608: 0x6c3e5620, 0x1c609: 0x6c8e5020, 0x1c60a: 0x6d0b1e20, 0x1c60b: 0x6cf5f820, + 0x1c60c: 0x6c8cec20, 0x1c60d: 0x6c83c420, 0x1c60e: 0x6c6d0420, 0x1c60f: 0x6c88b620, + 0x1c610: 0x6cdd6020, 0x1c611: 0x6cddd620, 0x1c612: 0x6c3cfe20, 0x1c613: 0x6cecd620, + 0x1c614: 0x6c2d5a20, 0x1c615: 0x6cb20c20, 0x1c616: 0x6d2df020, 0x1c617: 0x6ccb2c20, + 0x1c618: 0x6c9f5620, 0x1c619: 0x6d234820, 0x1c61a: 0x6c709420, 0x1c61b: 0x6c186820, + 0x1c61c: 0x6c7f0a20, 0x1c61d: 0x6cf19620, 0x1c61e: 0x6cd16c20, 0x1c61f: 0x6cef1420, + 0x1c620: 0x6ce4f620, 0x1c621: 0x6c1f4020, 0x1c622: 0x6d423c20, 0x1c623: 0x6c081e20, + 0x1c624: 0x6c196020, 0x1c625: 0x6c562220, 0x1c626: 0x6cb5ea20, 0x1c627: 0x6c365e20, + 0x1c628: 0x6c7d6420, 0x1c629: 0x6c167020, 0x1c62a: 0x6cb5ec20, 0x1c62b: 0x6c082020, + 0x1c62c: 0x6ced2020, 0x1c62d: 0x6c925620, 0x1c62e: 0x6c239e20, 0x1c62f: 0x6c495220, + 0x1c630: 0x6d0d9020, 0x1c631: 0x6c2dca20, 0x1c632: 0x6c072620, 0x1c633: 0x6c8bb620, + 0x1c634: 0x6cbd7220, 0x1c635: 0x6caff220, 0x1c636: 0x6cabd620, 0x1c637: 0x6cc3b820, + 0x1c638: 0x6d3d6220, 0x1c639: 0x6cbd7420, 0x1c63a: 0x6c383c20, 0x1c63b: 0x6c6d8020, + 0x1c63c: 0x6cbf2a20, 0x1c63d: 0x6c321a20, 0x1c63e: 0x6c6bec20, 0x1c63f: 0x6c5cf220, + // Block 0x719, offset 0x1c640 + 0x1c640: 0x6d226c20, 0x1c641: 0x6c999820, 0x1c642: 0x6c9a1020, 0x1c643: 0x6c210e20, + 0x1c644: 0x6d07aa20, 0x1c645: 0x6ce34a20, 0x1c646: 0x6d038020, 0x1c647: 0x6c277a20, + 0x1c648: 0x6cc75220, 0x1c649: 0x6c9f6020, 0x1c64a: 0x6c64b820, 0x1c64b: 0x6cefe020, + 0x1c64c: 0x6cc86620, 0x1c64d: 0x6c593820, 0x1c64e: 0x6d00be20, 0x1c64f: 0x6c1fe820, + 0x1c650: 0x6c65ae20, 0x1c651: 0x6d3bce20, 0x1c652: 0x6c171620, 0x1c653: 0x6c890a20, + 0x1c654: 0x6cc2fe20, 0x1c655: 0x6cf9d420, 0x1c656: 0x6c32ce20, 0x1c657: 0x6d262220, + 0x1c658: 0x6d0b2e20, 0x1c659: 0x6ca50220, 0x1c65a: 0x6c557220, 0x1c65b: 0x6d1bbe20, + 0x1c65c: 0x6d215e20, 0x1c65d: 0x6c59d620, 0x1c65e: 0x6cc8d420, 0x1c65f: 0x6ccb3020, + 0x1c660: 0x6c8e7c20, 0x1c661: 0x6cd1de20, 0x1c662: 0x6cc69e20, 0x1c663: 0x6cdd8220, + 0x1c664: 0x6d112620, 0x1c665: 0x6cf15c20, 0x1c666: 0x6cf45c20, 0x1c667: 0x6d317e20, + 0x1c668: 0x6c6d2a20, 0x1c669: 0x6d1c8a20, 0x1c66a: 0x6c969e20, 0x1c66b: 0x6ce1dc20, + 0x1c66c: 0x6c8e8220, 0x1c66d: 0x6ce11820, 0x1c66e: 0x6c864e20, 0x1c66f: 0x6c80c420, + 0x1c670: 0x6c4a7020, 0x1c671: 0x6d325020, 0x1c672: 0x6cbad020, 0x1c673: 0x6c25be20, + 0x1c674: 0x6c748020, 0x1c675: 0x6d2f8e20, 0x1c676: 0x6d112820, 0x1c677: 0x6c00bc20, + 0x1c678: 0x6c0d4620, 0x1c679: 0x6cd4f620, 0x1c67a: 0x6c16c020, 0x1c67b: 0x6c7d8020, + 0x1c67c: 0x6d3b8820, 0x1c67d: 0x6c234020, 0x1c67e: 0x6c6cb020, 0x1c67f: 0x6d141620, + // Block 0x71a, offset 0x1c680 + 0x1c680: 0x6c250020, 0x1c681: 0x6c234220, 0x1c682: 0x6cb63820, 0x1c683: 0x6c841a20, + 0x1c684: 0x6d1d0820, 0x1c685: 0x6cdd8a20, 0x1c686: 0x6cc08c20, 0x1c687: 0x6d082020, + 0x1c688: 0x6c026620, 0x1c689: 0x6c88c420, 0x1c68a: 0x6c9ad420, 0x1c68b: 0x6d2eda20, + 0x1c68c: 0x6d1a9620, 0x1c68d: 0x6c57e220, 0x1c68e: 0x6d1be620, 0x1c68f: 0x6cf0ce20, + 0x1c690: 0x6c92e620, 0x1c691: 0x6cf3ec20, 0x1c692: 0x6c2aac20, 0x1c693: 0x6d054820, + 0x1c694: 0x6d2b9420, 0x1c695: 0x6d0a4220, 0x1c696: 0x6cc1b420, 0x1c697: 0x6c299420, + 0x1c698: 0x6c8be020, 0x1c699: 0x6c8a1c20, 0x1c69a: 0x6cbf6220, 0x1c69b: 0x6cdb3420, + 0x1c69c: 0x6c59ec20, 0x1c69d: 0x6c4a8c20, 0x1c69e: 0x6cb45220, 0x1c69f: 0x6c6e3220, + 0x1c6a0: 0x6c38be20, 0x1c6a1: 0x6c6d4220, 0x1c6a2: 0x6c8e9820, 0x1c6a3: 0x6c5f3620, + 0x1c6a4: 0x6c5cae20, 0x1c6a5: 0x6c6e3420, 0x1c6a6: 0x6c00e220, 0x1c6a7: 0x6c0a8e20, + 0x1c6a8: 0x6c120e20, 0x1c6a9: 0x6cc1d820, 0x1c6aa: 0x6d2a5820, 0x1c6ab: 0x6c290c20, + 0x1c6ac: 0x6c694c20, 0x1c6ad: 0x6c4c0420, 0x1c6ae: 0x6ce07e20, 0x1c6af: 0x6c5c5420, + 0x1c6b0: 0x6c58a620, 0x1c6b1: 0x6ccb7020, 0x1c6b2: 0x6cdc7620, 0x1c6b3: 0x6ce4c620, + 0x1c6b4: 0x6c1f9a20, 0x1c6b5: 0x6d21b820, 0x1c6b6: 0x6c6d6820, 0x1c6b7: 0x6c917620, + 0x1c6b8: 0x6c0d6020, 0x1c6b9: 0x6cd54220, 0x1c6ba: 0x6cf21820, 0x1c6bb: 0x6d41a220, + 0x1c6bc: 0x6c7fd020, 0x1c6bd: 0x6cf82020, 0x1c6be: 0x6d3ea820, 0x1c6bf: 0x6d083020, + // Block 0x71b, offset 0x1c6c0 + 0x1c6c0: 0x6cc88420, 0x1c6c1: 0x6cf31e20, 0x1c6c2: 0x6c415820, 0x1c6c3: 0x6c827220, + 0x1c6c4: 0x6c31da20, 0x1c6c5: 0x6c86fe20, 0x1c6c6: 0x6d374020, 0x1c6c7: 0x6cc76a20, + 0x1c6c8: 0x6c848e20, 0x1c6c9: 0x6d29ac20, 0x1c6ca: 0x6cbf7620, 0x1c6cb: 0x6ce43a20, + 0x1c6cc: 0x6c4aa420, 0x1c6cd: 0x6cdc0020, 0x1c6ce: 0x6c7eb220, 0x1c6cf: 0x6c8fe020, + 0x1c6d0: 0x6c918620, 0x1c6d1: 0x6c872620, 0x1c6d2: 0x6d29b220, 0x1c6d3: 0x6c808a20, + 0x1c6d4: 0x6d1c2e20, 0x1c6d5: 0x6c9cb420, 0x1c6d6: 0x6cfd9c20, 0x1c6d7: 0x6cbf8820, + 0x1c6d8: 0x6c49b820, 0x1c6d9: 0x6c2a5020, 0x1c6da: 0x6d29c020, 0x1c6db: 0x6c58ce20, + 0x1c6dc: 0x6c483e20, 0x1c6dd: 0x6c0eba20, 0x1c6de: 0x6c2e8820, 0x1c6df: 0x6c0ed820, + 0x1c6e0: 0x6c568e20, 0x1c6e1: 0x6d347620, 0x1c6e2: 0x6cb18020, 0x1c6e3: 0x6c050c20, + 0x1c6e4: 0x6cc4f020, 0x1c6e5: 0x6c87a220, 0x1c6e6: 0x6cec0c20, + 0x1c6e8: 0x6cfdaa20, 0x1c6e9: 0x6cb8aa20, 0x1c6ea: 0x6c04c020, 0x1c6eb: 0x6cae3a20, + 0x1c6ec: 0x6c39c820, 0x1c6ed: 0x6c282620, 0x1c6ee: 0x6cf26c20, 0x1c6ef: 0x6cab3420, + 0x1c6f2: 0x6cec4a20, 0x1c6f3: 0x6c552a20, + 0x1c6f4: 0x6c8cc020, 0x1c6f5: 0x6d14aa20, 0x1c6f6: 0x6cb29420, 0x1c6f7: 0x6c223820, + 0x1c6f8: 0x6c042020, 0x1c6f9: 0x6c72ea20, 0x1c6fa: 0x6c16a820, 0x1c6fb: 0x6c1aa820, + 0x1c6fd: 0x6c296820, 0x1c6fe: 0x6c9bd620, 0x1c6ff: 0x6c109820, + // Block 0x71c, offset 0x1c700 + 0x1c700: 0x6d3c8820, 0x1c701: 0x6cb2aa20, 0x1c702: 0x6c0afe20, 0x1c703: 0x6d393220, + 0x1c704: 0x6d316c20, 0x1c706: 0x6c225020, 0x1c707: 0x6d1bd220, + 0x1c708: 0x6cb7b220, 0x1c709: 0x6cfb7420, 0x1c70a: 0x6c90f220, 0x1c70b: 0x6c2c9220, + 0x1c70c: 0x6cab5020, 0x1c70d: 0x6c9b2e20, 0x1c70e: 0x6d3b8a20, 0x1c70f: 0x6c084e20, + 0x1c710: 0x6c8c6420, 0x1c711: 0x6d2bb020, 0x1c712: 0x6cf47c20, 0x1c713: 0x6cb0c220, + 0x1c714: 0x6c280220, 0x1c715: 0x6cf27420, 0x1c716: 0x6d1c0820, 0x1c717: 0x6d0e0420, + 0x1c718: 0x6c415c20, 0x1c719: 0x6c273420, 0x1c71a: 0x6cd03820, 0x1c71b: 0x6ce49a20, + 0x1c71c: 0x6ce49c20, 0x1c71d: 0x6c4e1c20, 0x1c71e: 0x6c16b020, 0x1c71f: 0x6cd0d220, + 0x1c720: 0x6cbe6e20, 0x1c721: 0x6ccfcc20, 0x1c722: 0x6c15aa20, 0x1c723: 0x6c15ac20, + 0x1c724: 0x6cc89c20, 0x1c725: 0x6cd10620, 0x1c726: 0x6cda4c20, 0x1c727: 0x6cd00820, + 0x1c728: 0x6d1e6c20, 0x1c729: 0x6cd66020, 0x1c72a: 0x6c920e20, 0x1c72b: 0x6c40a820, + 0x1c72c: 0x6d1e1020, 0x1c72d: 0x6c080e20, 0x1c72e: 0x6c3cdc20, 0x1c72f: 0x6ca90820, + 0x1c730: 0x6ce47e20, 0x1c731: 0x6d1ee020, 0x1c732: 0x6c63fc20, 0x1c733: 0x6ccf9a20, + 0x1c734: 0x6d2c1820, 0x1c735: 0x6c2d3220, 0x1c736: 0x6c3dce20, 0x1c737: 0x6ca3e220, + 0x1c738: 0x6c2cbc20, 0x1c739: 0x6cb24820, 0x1c73a: 0x6ce62e20, 0x1c73b: 0x6c578420, + 0x1c73c: 0x6ce6b220, 0x1c73d: 0x6d321a20, 0x1c73e: 0x6d28f620, 0x1c73f: 0x6c9b0820, + // Block 0x71d, offset 0x1c740 + 0x1c740: 0x6c093c20, 0x1c741: 0x6cb58620, 0x1c742: 0x6c8f2620, 0x1c743: 0x6d09de20, + 0x1c744: 0x6c8e4420, 0x1c745: 0x6c170820, 0x1c746: 0x6ca23220, 0x1c747: 0x6d278a20, + 0x1c748: 0x6c393620, 0x1c749: 0x6c3e1820, 0x1c74a: 0x6c44bc20, 0x1c74b: 0x6ce48e20, + 0x1c74c: 0x6c6bca20, 0x1c74d: 0x6c6bcc20, 0x1c74e: 0x6cc35220, 0x1c74f: 0x6cf07c20, + 0x1c750: 0x6c3e1a20, 0x1c751: 0x6ce49020, 0x1c752: 0x6ca23420, 0x1c753: 0x6c341e20, + 0x1c754: 0x6cacb020, 0x1c755: 0x6c675620, 0x1c756: 0x6cebd220, 0x1c757: 0x6c269020, + 0x1c758: 0x6ca3f020, 0x1c759: 0x6c8e4c20, 0x1c75a: 0x6c079a20, 0x1c75b: 0x6d31c820, + 0x1c75c: 0x6c1f2820, 0x1c75d: 0x6ca23820, 0x1c75e: 0x6ca23a20, 0x1c75f: 0x6c12d820, + 0x1c760: 0x6ce49620, 0x1c761: 0x6c40f220, 0x1c762: 0x6c096420, 0x1c763: 0x6c269a20, + 0x1c764: 0x6d35ea20, 0x1c765: 0x6c361220, 0x1c766: 0x6cb5ce20, 0x1c767: 0x6c94a020, + 0x1c768: 0x6cac3e20, 0x1c769: 0x6d199020, 0x1c76a: 0x6c384e20, 0x1c76b: 0x6c579820, + 0x1c76c: 0x6ccef220, 0x1c76d: 0x6d212e20, 0x1c76e: 0x6ca24220, 0x1c76f: 0x6c75be20, + 0x1c770: 0x6d176620, 0x1c771: 0x6c8e5820, 0x1c772: 0x6ccef420, 0x1c773: 0x6c2eac20, + 0x1c774: 0x6c1db020, 0x1c775: 0x6c579e20, 0x1c776: 0x6c290020, 0x1c777: 0x6d3c9020, + 0x1c778: 0x6c5eea20, 0x1c779: 0x6ced2a20, 0x1c77a: 0x6c676620, 0x1c77b: 0x6c1a2620, + 0x1c77c: 0x6c171e20, 0x1c77d: 0x6cea8020, 0x1c77e: 0x6c825220, 0x1c77f: 0x6c5f1620, + // Block 0x71e, offset 0x1c780 + 0x1c780: 0x6c13b020, 0x1c781: 0x6c8e9a20, 0x1c782: 0x6c2f3c20, 0x1c783: 0x6ce98220, + 0x1c784: 0x6c8c6c20, 0x1c785: 0x6c678c20, 0x1c786: 0x6c679020, 0x1c787: 0x6c1e0020, + 0x1c788: 0x6cb0d620, 0x1c789: 0x6c2f0620, 0x1c78a: 0x6c2f1020, 0x1c78b: 0x6cb04420, + 0x1c78c: 0x6c6a8220, 0x1c78d: 0x6c287220, 0x1c78e: 0x6cd4da20, 0x1c78f: 0x6cd4dc20, + 0x1c790: 0x6d369220, 0x1c791: 0x6d153420, 0x1c792: 0x6ca54020, 0x1c793: 0x6ca39420, + 0x1c794: 0x6c2f4e20, 0x1c795: 0x6c08be20, 0x1c796: 0x6c69f620, 0x1c797: 0x6c89da20, + 0x1c798: 0x6c426220, 0x1c799: 0x6c437620, 0x1c79a: 0x6c6fd620, 0x1c79b: 0x6d38da20, + 0x1c79c: 0x6cfa3020, 0x1c79d: 0x6ccd7220, 0x1c79e: 0x6d057220, 0x1c79f: 0x6caa9e20, + 0x1c7a0: 0x6c859220, 0x1c7a1: 0x6d0f8a20, 0x1c7a2: 0x6c192020, 0x1c7a3: 0x6d1f0c20, + 0x1c7a4: 0x6c033220, 0x1c7a5: 0x6c6bce20, 0x1c7a6: 0x6c73fe20, 0x1c7a7: 0x6cb59620, + 0x1c7a8: 0x6cf95620, 0x1c7a9: 0x6c251e20, 0x1c7aa: 0x6c095220, 0x1c7ab: 0x6d16fe20, + 0x1c7ac: 0x6c85aa20, 0x1c7ad: 0x6d401a20, 0x1c7ae: 0x6c204e20, 0x1c7af: 0x6c3c2620, + 0x1c7b0: 0x6d3ad220, 0x1c7b1: 0x6cad8620, 0x1c7b2: 0x6cafd020, 0x1c7b3: 0x6c418a20, + 0x1c7b4: 0x6c77ee20, 0x1c7b5: 0x6c21fa20, 0x1c7b6: 0x6d08de20, 0x1c7b7: 0x6d33c620, + 0x1c7b8: 0x6c283020, 0x1c7b9: 0x6d31ca20, 0x1c7ba: 0x6c380220, 0x1c7bb: 0x6d350e20, + 0x1c7bc: 0x6ce29c20, 0x1c7bd: 0x6c706a20, 0x1c7be: 0x6c600220, 0x1c7bf: 0x6c3a9a20, + // Block 0x71f, offset 0x1c7c0 + 0x1c7c0: 0x6c706c20, 0x1c7c1: 0x6cccda20, 0x1c7c2: 0x6c634420, 0x1c7c3: 0x6d080820, + 0x1c7c4: 0x6d2cbc20, 0x1c7c5: 0x6c0e1420, 0x1c7c6: 0x6ca80a20, 0x1c7c7: 0x6d334620, + 0x1c7c8: 0x6d1d8020, 0x1c7c9: 0x6c6e6820, 0x1c7ca: 0x6cc2e020, 0x1c7cb: 0x6ce29e20, + 0x1c7cc: 0x6ce6f420, 0x1c7cd: 0x6d14e620, 0x1c7ce: 0x6c6a0020, 0x1c7cf: 0x6cefb020, + 0x1c7d0: 0x6c5b3620, 0x1c7d1: 0x6cdfa220, 0x1c7d2: 0x6d101220, 0x1c7d3: 0x6c1c1220, + 0x1c7d4: 0x6d35ec20, 0x1c7d5: 0x6c523220, 0x1c7d6: 0x6d0b5220, 0x1c7d7: 0x6c9a9220, + 0x1c7d8: 0x6c311a20, 0x1c7d9: 0x6c6e8620, 0x1c7da: 0x6cfec020, 0x1c7db: 0x6ce7c820, + 0x1c7dc: 0x6ce86220, 0x1c7dd: 0x6c986020, 0x1c7de: 0x6cb05e20, 0x1c7df: 0x6cfec220, + 0x1c7e0: 0x6cdb8020, 0x1c7e1: 0x6c3d7020, 0x1c7e2: 0x6c861220, 0x1c7e3: 0x6d363420, + 0x1c7e4: 0x6c25de20, 0x1c7e5: 0x6c345220, 0x1c7e6: 0x6cf4ee20, 0x1c7e7: 0x6ccbf420, + 0x1c7e8: 0x6c815a20, 0x1c7e9: 0x6cd46a20, 0x1c7ea: 0x6c592620, 0x1c7eb: 0x6cfb5e20, + 0x1c7ec: 0x6d17ee20, 0x1c7ed: 0x6c07f820, 0x1c7ee: 0x6d2f3420, 0x1c7ef: 0x6c495620, + 0x1c7f0: 0x6cdfec20, 0x1c7f1: 0x6c3ab820, 0x1c7f2: 0x6c966a20, 0x1c7f3: 0x6c8bba20, + 0x1c7f4: 0x6c1abc20, 0x1c7f5: 0x6c621a20, 0x1c7f6: 0x6ce50220, 0x1c7f7: 0x6c013820, + 0x1c7f8: 0x6c1c3220, 0x1c7f9: 0x6c09d020, 0x1c7fa: 0x6c09d220, 0x1c7fb: 0x6c9f6220, + 0x1c7fc: 0x6c481a20, 0x1c7fd: 0x6c330820, 0x1c7fe: 0x6c354220, 0x1c7ff: 0x6cefe220, + // Block 0x720, offset 0x1c800 + 0x1c800: 0x6d209220, 0x1c801: 0x6c254420, 0x1c802: 0x6d0b5620, 0x1c803: 0x6d3a1620, + 0x1c804: 0x6c244020, 0x1c805: 0x6c27e620, 0x1c806: 0x6cd0b020, 0x1c807: 0x6d380220, + 0x1c808: 0x6c1c4620, 0x1c809: 0x6d239420, 0x1c80a: 0x6c541c20, 0x1c80b: 0x6c3c5c20, + 0x1c80c: 0x6c7e8420, 0x1c80d: 0x6d0fd220, 0x1c80e: 0x6c18de20, 0x1c80f: 0x6ce8c420, + 0x1c810: 0x6d226e20, 0x1c811: 0x6c4c2820, 0x1c812: 0x6cf19e20, 0x1c813: 0x6c594420, + 0x1c814: 0x6c7aa220, 0x1c815: 0x6c642820, 0x1c816: 0x6d19f620, 0x1c817: 0x6d182c20, + 0x1c818: 0x6c911020, 0x1c819: 0x6ccaf820, 0x1c81a: 0x6c749a20, 0x1c81b: 0x6c1c5a20, + 0x1c81c: 0x6cf6a620, 0x1c81d: 0x6c492220, 0x1c81e: 0x6d185c20, 0x1c81f: 0x6cf16020, + 0x1c820: 0x6c608c20, 0x1c821: 0x6c205c20, 0x1c822: 0x6c049220, 0x1c823: 0x6c5bfe20, + 0x1c824: 0x6c8e8420, 0x1c825: 0x6c149c20, 0x1c826: 0x6cd47220, 0x1c827: 0x6caaaa20, + 0x1c828: 0x6c2cd820, 0x1c829: 0x6c26fc20, 0x1c82a: 0x6c0d0e20, 0x1c82b: 0x6cdfb820, + 0x1c82c: 0x6d2f4020, 0x1c82d: 0x6c0c1c20, 0x1c82e: 0x6cd0c620, 0x1c82f: 0x6c246220, + 0x1c830: 0x6c95c020, 0x1c831: 0x6d18a420, 0x1c832: 0x6d403220, 0x1c833: 0x6c1d7c20, + 0x1c834: 0x6d2f4220, 0x1c835: 0x6d2d4a20, 0x1c836: 0x6cda4220, 0x1c837: 0x6ccb5e20, + 0x1c838: 0x6cc39c20, 0x1c839: 0x6c2e3c20, 0x1c83a: 0x6c911a20, 0x1c83b: 0x6c911c20, + 0x1c83c: 0x6ca15220, 0x1c83d: 0x6cbda620, 0x1c83e: 0x6d1b0820, 0x1c83f: 0x6d1d0a20, + // Block 0x721, offset 0x1c840 + 0x1c840: 0x6c59fa20, 0x1c841: 0x6c3f0820, 0x1c842: 0x6c8a2620, 0x1c843: 0x6c8fac20, + 0x1c844: 0x6cbbfe20, 0x1c845: 0x6c8ea820, 0x1c846: 0x6c817a20, 0x1c847: 0x6cfba820, + 0x1c848: 0x6c3ad620, 0x1c849: 0x6c280420, 0x1c84a: 0x6d1b7420, 0x1c84b: 0x6c51f020, + 0x1c84c: 0x6c005420, 0x1c84d: 0x6c04a620, 0x1c84e: 0x6cfbaa20, 0x1c84f: 0x6c492a20, + 0x1c850: 0x6c4b8c20, 0x1c851: 0x6ca9f620, 0x1c852: 0x6d242e20, 0x1c853: 0x6cef4a20, + 0x1c854: 0x6d18e820, 0x1c855: 0x6d1dc620, 0x1c856: 0x6cb07820, 0x1c857: 0x6c82ee20, + 0x1c858: 0x6c86a820, 0x1c859: 0x6cd57820, 0x1c85a: 0x6c28d820, 0x1c85b: 0x6c8c3c20, + 0x1c85c: 0x6c2d8c20, 0x1c85d: 0x6c8c3e20, 0x1c85e: 0x6c7f6420, 0x1c85f: 0x6c0d1020, + 0x1c860: 0x6c62ba20, 0x1c861: 0x6c1ae820, 0x1c862: 0x6d103820, 0x1c863: 0x6d086220, + 0x1c864: 0x6c6a3820, 0x1c865: 0x6d330e20, 0x1c866: 0x6c99cc20, 0x1c867: 0x6c874420, + 0x1c868: 0x6c5e4820, 0x1c869: 0x6c7f7820, 0x1c86a: 0x6c631420, 0x1c86b: 0x6c2cf220, + 0x1c86c: 0x6d086620, 0x1c86d: 0x6d1d2e20, 0x1c86e: 0x6d1b2820, 0x1c86f: 0x6cc21420, + 0x1c870: 0x6d1dea20, 0x1c871: 0x6cdfc820, 0x1c872: 0x6c2cfe20, 0x1c873: 0x6c95da20, + 0x1c874: 0x6c947c20, 0x1c875: 0x6c948420, 0x1c876: 0x6c0e4620, 0x1c877: 0x6c0e5420, + 0x1c878: 0x6c4ada20, 0x1c879: 0x6c037020, 0x1c87a: 0x6c37e620, 0x1c87b: 0x6c2a9c20, + 0x1c87c: 0x6c37ec20, 0x1c87d: 0x6c040820, 0x1c87e: 0x6c041620, 0x1c87f: 0x6cbc8020, + // Block 0x722, offset 0x1c880 + 0x1c880: 0x6c5fd620, 0x1c881: 0x6d2a6820, 0x1c882: 0x6d2a6a20, 0x1c883: 0x6c994420, + 0x1c884: 0x6c2a8c20, 0x1c885: 0x6cabb820, 0x1c886: 0x6c69f820, 0x1c887: 0x6c59ac20, + 0x1c888: 0x6c4a3e20, 0x1c889: 0x6c229620, 0x1c88a: 0x6c8ccc20, 0x1c88b: 0x6c42b620, + 0x1c88c: 0x6ca0f020, 0x1c88d: 0x6c5ffa20, 0x1c88e: 0x6c68e420, 0x1c88f: 0x6caf0620, + 0x1c890: 0x6c42be20, 0x1c891: 0x6c004020, 0x1c892: 0x6c356620, 0x1c893: 0x6c503e20, + 0x1c894: 0x6c4ec420, 0x1c895: 0x6c09a420, 0x1c896: 0x6ced2220, 0x1c897: 0x6c1dbc20, + 0x1c898: 0x6cba5c20, 0x1c899: 0x6cf65220, 0x1c89a: 0x6c005020, 0x1c89b: 0x6cffb820, + 0x1c89c: 0x6c505c20, 0x1c89d: 0x6c5a7820, 0x1c89e: 0x6c505e20, 0x1c89f: 0x6d2b0220, + 0x1c8a0: 0x6c251020, 0x1c8a1: 0x6c506c20, 0x1c8a2: 0x6cffc220, 0x1c8a3: 0x6d132820, + 0x1c8a4: 0x6cb33820, 0x1c8a5: 0x6c507220, 0x1c8a6: 0x6c695220, 0x1c8a7: 0x6c00f220, + 0x1c8a8: 0x6d03ae20, 0x1c8a9: 0x6c5a8020, 0x1c8aa: 0x6c872820, 0x1c8ab: 0x6cb1a620, + 0x1c8ac: 0x6c51a220, 0x1c8ad: 0x6c69e220, 0x1c8ae: 0x6cafa820, 0x1c8af: 0x6c41ca20, + 0x1c8b0: 0x6cad8820, 0x1c8b1: 0x6d391c20, 0x1c8b2: 0x6c756e20, 0x1c8b3: 0x6cc06620, + 0x1c8b4: 0x6c259420, 0x1c8b5: 0x6cc3ce20, 0x1c8b6: 0x6d2bee20, 0x1c8b7: 0x6c47b420, + 0x1c8b8: 0x6c757620, 0x1c8b9: 0x6c757820, 0x1c8ba: 0x6d394420, 0x1c8bb: 0x6d2bfe20, + 0x1c8bc: 0x6c47d820, 0x1c8bd: 0x6d2f7c20, 0x1c8be: 0x6c31e020, 0x1c8bf: 0x6c9f8a20, + // Block 0x723, offset 0x1c8c0 + 0x1c8c0: 0x6cb6da20, 0x1c8c1: 0x6d1c5620, 0x1c8c2: 0x6d20c620, 0x1c8c3: 0x6c069220, + 0x1c8c4: 0x6d2f5e20, 0x1c8c5: 0x6d37a820, 0x1c8c6: 0x6cae3c20, 0x1c8c7: 0x6c50de20, + 0x1c8c8: 0x6d1c5c20, 0x1c8c9: 0x6c50f420, 0x1c8ca: 0x6d173820, 0x1c8cb: 0x6c0e6020, + 0x1c8cc: 0x6cecfc20, 0x1c8cd: 0x6c50f620, 0x1c8ce: 0x6c021620, 0x1c8cf: 0x6d2de220, + 0x1c8d0: 0x6d0c8020, 0x1c8d1: 0x6c647e20, 0x1c8d2: 0x6c510e20, 0x1c8d3: 0x6d208820, + 0x1c8d4: 0x6c7c3a20, 0x1c8d5: 0x6c394620, 0x1c8d6: 0x6c413220, 0x1c8d7: 0x6c2a1220, + 0x1c8d8: 0x6cac5620, 0x1c8d9: 0x6c3f6620, 0x1c8da: 0x6cc06820, 0x1c8db: 0x6cd15e20, + 0x1c8dc: 0x6c2a1620, 0x1c8dd: 0x6c926a20, 0x1c8de: 0x6d2df820, 0x1c8df: 0x6c9b2220, + 0x1c8e0: 0x6c841c20, 0x1c8e1: 0x6c6ca220, 0x1c8e2: 0x6d071220, 0x1c8e3: 0x6c64ca20, + 0x1c8e4: 0x6cac6a20, 0x1c8e5: 0x6c49a620, 0x1c8e6: 0x6c014e20, 0x1c8e7: 0x6c915c20, + 0x1c8e8: 0x6d065e20, 0x1c8e9: 0x6d38b420, 0x1c8ea: 0x6c299620, 0x1c8eb: 0x6c015620, + 0x1c8ec: 0x6c47e420, 0x1c8ed: 0x6c872a20, 0x1c8ee: 0x6ca26420, 0x1c8ef: 0x6c2f5020, + 0x1c8f0: 0x6c421020, 0x1c8f1: 0x6d057420, 0x1c8f2: 0x6c983a20, 0x1c8f3: 0x6cee4e20, + 0x1c8f4: 0x6d344020, 0x1c8f5: 0x6cb74a20, 0x1c8f6: 0x6d25e020, 0x1c8f7: 0x6ce49220, + 0x1c8f8: 0x6cfd6420, 0x1c8f9: 0x6c33ca20, 0x1c8fa: 0x6d02ba20, 0x1c8fb: 0x6cf86620, + 0x1c8fc: 0x6cacae20, 0x1c8fd: 0x6c3c2820, 0x1c8fe: 0x6c33de20, 0x1c8ff: 0x6c9f3c20, + // Block 0x724, offset 0x1c900 + 0x1c900: 0x6c9fee20, 0x1c901: 0x6cd12c20, 0x1c902: 0x6cd34420, 0x1c903: 0x6d278c20, + 0x1c904: 0x6c9e0e20, 0x1c905: 0x6cac3a20, 0x1c906: 0x6c39cc20, 0x1c907: 0x6c9e8a20, + 0x1c908: 0x6c27c220, 0x1c909: 0x6c99e020, 0x1c90a: 0x6c995820, 0x1c90b: 0x6c770420, + 0x1c90c: 0x6cfc9020, 0x1c90d: 0x6c79ba20, 0x1c90e: 0x6cd35620, 0x1c90f: 0x6d0f5420, + 0x1c910: 0x6d32a220, 0x1c911: 0x6d119c20, 0x1c912: 0x6ccfce20, 0x1c913: 0x6c5dae20, + 0x1c914: 0x6c26ec20, 0x1c915: 0x6d31cc20, 0x1c916: 0x6c7bee20, 0x1c917: 0x6c706e20, + 0x1c918: 0x6cd09a20, 0x1c919: 0x6d14d020, 0x1c91a: 0x6cd12e20, 0x1c91b: 0x6c9a8a20, + 0x1c91c: 0x6ca0f420, 0x1c91d: 0x6d3ad620, 0x1c91e: 0x6d313c20, 0x1c91f: 0x6d313e20, + 0x1c920: 0x6c9dbc20, 0x1c921: 0x6cd35820, 0x1c922: 0x6d24d620, 0x1c923: 0x6c2e8a20, + 0x1c924: 0x6ca69020, 0x1c925: 0x6d3f4620, 0x1c926: 0x6d3f4820, 0x1c927: 0x6c179620, + 0x1c928: 0x6d2c7620, 0x1c929: 0x6d087e20, 0x1c92a: 0x6c0dda20, 0x1c92b: 0x6c9cea20, + 0x1c92c: 0x6c8f7e20, 0x1c92d: 0x6cdbc220, 0x1c92e: 0x6ce73e20, 0x1c92f: 0x6c9c3020, + 0x1c930: 0x6c2f3620, 0x1c931: 0x6c2c4620, 0x1c932: 0x6ca54c20, 0x1c933: 0x6c9ff820, + 0x1c934: 0x6d088c20, 0x1c935: 0x6c1aaa20, 0x1c936: 0x6c7bf420, 0x1c937: 0x6c735a20, + 0x1c938: 0x6ca1ce20, 0x1c939: 0x6d323a20, 0x1c93a: 0x6ce5d220, 0x1c93b: 0x6d0fac20, + 0x1c93c: 0x6d0d6c20, 0x1c93d: 0x6ca10620, 0x1c93e: 0x6d382620, 0x1c93f: 0x6ca0f620, + // Block 0x725, offset 0x1c940 + 0x1c940: 0x6d311220, 0x1c941: 0x6d32b620, 0x1c942: 0x6c9a0220, 0x1c943: 0x6cdd1e20, + 0x1c944: 0x6cceda20, 0x1c945: 0x6c4ec820, 0x1c946: 0x6c592820, 0x1c947: 0x6c2c5c20, + 0x1c948: 0x6c1a7620, 0x1c949: 0x6c25e020, 0x1c94a: 0x6c736420, 0x1c94b: 0x6c356820, + 0x1c94c: 0x6c97bc20, 0x1c94d: 0x6cfcc420, 0x1c94e: 0x6cf61e20, 0x1c94f: 0x6c7dd420, + 0x1c950: 0x6c7f4820, 0x1c951: 0x6c659820, 0x1c952: 0x6ccd4e20, 0x1c953: 0x6ce50420, + 0x1c954: 0x6c4bfc20, 0x1c955: 0x6ced2c20, 0x1c956: 0x6c839820, 0x1c957: 0x6cd39c20, + 0x1c958: 0x6cbf4020, 0x1c959: 0x6c8b1820, 0x1c95a: 0x6d0b3020, 0x1c95b: 0x6c6ec820, + 0x1c95c: 0x6d32d420, 0x1c95d: 0x6c83ea20, 0x1c95e: 0x6c7f4a20, 0x1c95f: 0x6cdc4c20, + 0x1c960: 0x6c737420, 0x1c961: 0x6cd72820, 0x1c962: 0x6cdbca20, 0x1c963: 0x6c317420, + 0x1c964: 0x6c09d420, 0x1c965: 0x6cb0a620, 0x1c966: 0x6ca29c20, 0x1c967: 0x6c5cd420, + 0x1c968: 0x6ca6ae20, 0x1c969: 0x6c926c20, 0x1c96a: 0x6d17f220, 0x1c96b: 0x6c6aec20, + 0x1c96c: 0x6c113620, 0x1c96d: 0x6d38ea20, 0x1c96e: 0x6d217220, 0x1c96f: 0x6c5cd620, + 0x1c970: 0x6c96c620, 0x1c971: 0x6cfa4420, 0x1c972: 0x6d040420, 0x1c973: 0x6c5ada20, + 0x1c974: 0x6c4c0220, 0x1c975: 0x6d290a20, 0x1c976: 0x6c218620, 0x1c977: 0x6c64ba20, + 0x1c978: 0x6c9a9e20, 0x1c979: 0x6c322620, 0x1c97a: 0x6c541e20, 0x1c97b: 0x6d07b420, + 0x1c97c: 0x6ce53c20, 0x1c97d: 0x6c7c9220, 0x1c97e: 0x6c42ce20, 0x1c97f: 0x6cc8da20, + // Block 0x726, offset 0x1c980 + 0x1c980: 0x6c99a020, 0x1c981: 0x6d071420, 0x1c982: 0x6c381e20, 0x1c983: 0x6cf30820, + 0x1c984: 0x6c9e7820, 0x1c985: 0x6c1e2e20, 0x1c986: 0x6c7d0620, 0x1c987: 0x6c9c3220, + 0x1c988: 0x6cf25e20, 0x1c989: 0x6c7a0020, 0x1c98a: 0x6c298420, 0x1c98b: 0x6c188220, + 0x1c98c: 0x6c782420, 0x1c98d: 0x6cda2420, 0x1c98e: 0x6cf97620, 0x1c98f: 0x6cbf5020, + 0x1c990: 0x6ca15420, 0x1c991: 0x6ca01620, 0x1c992: 0x6c977220, 0x1c993: 0x6cd72c20, + 0x1c994: 0x6d2b0420, 0x1c995: 0x6d2f4420, 0x1c996: 0x6d18a620, 0x1c997: 0x6c2dde20, + 0x1c998: 0x6c79c420, 0x1c999: 0x6ca15620, 0x1c99a: 0x6cd75c20, 0x1c99b: 0x6c235620, + 0x1c99c: 0x6c907820, 0x1c99d: 0x6c1ad020, 0x1c99e: 0x6c977820, 0x1c99f: 0x6cb19a20, + 0x1c9a0: 0x6c199420, 0x1c9a1: 0x6c4b1a20, 0x1c9a2: 0x6c9b3a20, 0x1c9a3: 0x6c596c20, + 0x1c9a4: 0x6cc8f220, 0x1c9a5: 0x6cb1d420, 0x1c9a6: 0x6cf6f020, 0x1c9a7: 0x6cbc0220, + 0x1c9a8: 0x6cb45a20, 0x1c9a9: 0x6d3a8420, 0x1c9aa: 0x6c2aea20, 0x1c9ab: 0x6cd07e20, + 0x1c9ac: 0x6cd76020, 0x1c9ad: 0x6c8a7c20, 0x1c9ae: 0x6c185020, 0x1c9af: 0x6cfbac20, + 0x1c9b0: 0x6c771220, 0x1c9b1: 0x6d132a20, 0x1c9b2: 0x6d074820, 0x1c9b3: 0x6ce79220, + 0x1c9b4: 0x6ca1ea20, 0x1c9b5: 0x6c8be620, 0x1c9b6: 0x6c4b7e20, 0x1c9b7: 0x6c66e020, + 0x1c9b8: 0x6d136420, 0x1c9b9: 0x6c00f420, 0x1c9ba: 0x6c5c6a20, 0x1c9bb: 0x6d2dac20, + 0x1c9bc: 0x6c65f220, 0x1c9bd: 0x6c47e620, 0x1c9be: 0x6d2fea20, 0x1c9bf: 0x6cc1e420, + // Block 0x727, offset 0x1c9c0 + 0x1c9c0: 0x6c9a3420, 0x1c9c1: 0x6c1e3620, 0x1c9c2: 0x6ccb0620, 0x1c9c3: 0x6ca94c20, + 0x1c9c4: 0x6d09c020, 0x1c9c5: 0x6d123e20, 0x1c9c6: 0x6c5e1820, 0x1c9c7: 0x6c9b7020, + 0x1c9c8: 0x6c9de620, 0x1c9c9: 0x6cb22020, 0x1c9ca: 0x6c9de820, 0x1c9cb: 0x6c870220, + 0x1c9cc: 0x6c7c1420, 0x1c9cd: 0x6c750020, 0x1c9ce: 0x6d07e220, 0x1c9cf: 0x6c9dee20, + 0x1c9d0: 0x6c5e4a20, 0x1c9d1: 0x6c919220, 0x1c9d2: 0x6c9b8e20, 0x1c9d3: 0x6c8fe420, + 0x1c9d4: 0x6c49bc20, 0x1c9d5: 0x6c97d620, 0x1c9d6: 0x6cf82e20, 0x1c9d7: 0x6c1f9020, + 0x1c9d8: 0x6ce19620, 0x1c9d9: 0x6c771c20, 0x1c9da: 0x6d3a9620, 0x1c9db: 0x6c98c220, + 0x1c9dc: 0x6c6c3220, 0x1c9dd: 0x6c8ba620, 0x1c9de: 0x6d234a20, 0x1c9df: 0x6cd78420, + 0x1c9e0: 0x6d2ad220, 0x1c9e1: 0x6c752c20, 0x1c9e2: 0x6cd2a820, 0x1c9e3: 0x6d15c020, + 0x1c9e4: 0x6cd04820, 0x1c9e5: 0x6d339c20, 0x1c9e6: 0x6c53f020, 0x1c9e7: 0x6cd04e20, + 0x1c9e8: 0x6d1ce020, 0x1c9e9: 0x6c72d420, 0x1c9ea: 0x6d387820, 0x1c9eb: 0x6c68e820, + 0x1c9ec: 0x6c25e220, 0x1c9ed: 0x6c32ae20, 0x1c9ee: 0x6c006820, 0x1c9ef: 0x6c695020, + 0x1c9f0: 0x6d2b9820, 0x1c9f1: 0x6d265c20, 0x1c9f2: 0x6c03ce20, 0x1c9f3: 0x6cd22c20, + 0x1c9f4: 0x6c2f9420, 0x1c9f5: 0x6cb73a20, 0x1c9f6: 0x6c5e8620, 0x1c9f7: 0x6d3eee20, + 0x1c9f8: 0x6c417c20, 0x1c9f9: 0x6cf4ba20, 0x1c9fa: 0x6d302020, 0x1c9fb: 0x6c7a2a20, + 0x1c9fc: 0x6c426420, 0x1c9fd: 0x6cf84c20, 0x1c9fe: 0x6c388820, 0x1c9ff: 0x6c7be620, + // Block 0x728, offset 0x1ca00 + 0x1ca00: 0x6c295820, 0x1ca01: 0x6c969220, 0x1ca02: 0x6ccbd220, 0x1ca03: 0x6c27c420, + 0x1ca04: 0x6c740220, 0x1ca05: 0x6c85ac20, 0x1ca06: 0x6c3d4e20, 0x1ca07: 0x6c9f3e20, + 0x1ca08: 0x6c35b020, 0x1ca09: 0x6c5da620, 0x1ca0a: 0x6c772820, 0x1ca0b: 0x6d350620, + 0x1ca0c: 0x6cb75c20, 0x1ca0d: 0x6c76c420, 0x1ca0e: 0x6c6bd020, 0x1ca0f: 0x6c0d2a20, + 0x1ca10: 0x6c35e020, 0x1ca11: 0x6d0b8820, 0x1ca12: 0x6caf4e20, 0x1ca13: 0x6d302420, + 0x1ca14: 0x6d0c7820, 0x1ca15: 0x6cdc2a20, 0x1ca16: 0x6d3b7820, 0x1ca17: 0x6c17d220, + 0x1ca18: 0x6c33e020, 0x1ca19: 0x6cac3c20, 0x1ca1a: 0x6d0e4a20, 0x1ca1b: 0x6c6d7e20, + 0x1ca1c: 0x6c3c2a20, 0x1ca1d: 0x6c381020, 0x1ca1e: 0x6ca0f820, 0x1ca1f: 0x6d2c7820, + 0x1ca20: 0x6c707020, 0x1ca21: 0x6d22f620, 0x1ca22: 0x6c77f020, 0x1ca23: 0x6ceb0a20, + 0x1ca24: 0x6ceb0c20, 0x1ca25: 0x6c2bec20, 0x1ca26: 0x6d2d3c20, 0x1ca27: 0x6d314220, + 0x1ca28: 0x6c35fc20, 0x1ca29: 0x6c3e3820, 0x1ca2a: 0x6ca23e20, 0x1ca2b: 0x6d3ad820, + 0x1ca2c: 0x6c7e5c20, 0x1ca2d: 0x6c0aee20, 0x1ca2e: 0x6caa5620, 0x1ca2f: 0x6cb25220, + 0x1ca30: 0x6cae6020, 0x1ca31: 0x6c8cce20, 0x1ca32: 0x6cad8a20, 0x1ca33: 0x6c821e20, + 0x1ca34: 0x6cb37c20, 0x1ca35: 0x6c0e6220, 0x1ca36: 0x6cb37e20, 0x1ca37: 0x6ccfd020, + 0x1ca38: 0x6d28b020, 0x1ca39: 0x6c009820, 0x1ca3a: 0x6c85d620, 0x1ca3b: 0x6c8f8020, + 0x1ca3c: 0x6ce73a20, 0x1ca3d: 0x6d1e8420, 0x1ca3e: 0x6c85d820, 0x1ca3f: 0x6c7c2a20, + // Block 0x729, offset 0x1ca40 + 0x1ca40: 0x6c1ed820, 0x1ca41: 0x6c793620, 0x1ca42: 0x6cc2e420, 0x1ca43: 0x6d399c20, + 0x1ca44: 0x6c7b9c20, 0x1ca45: 0x6c4a5a20, 0x1ca46: 0x6c361420, 0x1ca47: 0x6ca4a620, + 0x1ca48: 0x6cb86420, 0x1ca49: 0x6c924420, 0x1ca4a: 0x6cefb220, 0x1ca4b: 0x6c009a20, + 0x1ca4c: 0x6c448420, 0x1ca4d: 0x6cfcb620, 0x1ca4e: 0x6d03e220, 0x1ca4f: 0x6d0c8a20, + 0x1ca50: 0x6c307420, 0x1ca51: 0x6cae6c20, 0x1ca52: 0x6cf5fc20, 0x1ca53: 0x6c81f220, + 0x1ca54: 0x6c533c20, 0x1ca55: 0x6cd78020, 0x1ca56: 0x6cf9b020, 0x1ca57: 0x6cbb7020, + 0x1ca58: 0x6cbeea20, 0x1ca59: 0x6cef0220, 0x1ca5a: 0x6cbbdc20, 0x1ca5b: 0x6d176820, + 0x1ca5c: 0x6c793e20, 0x1ca5d: 0x6cfec620, 0x1ca5e: 0x6cc3c220, 0x1ca5f: 0x6c162a20, + 0x1ca60: 0x6c80c820, 0x1ca61: 0x6c52ac20, 0x1ca62: 0x6d213020, 0x1ca63: 0x6cfec820, + 0x1ca64: 0x6cf9c620, 0x1ca65: 0x6c988e20, 0x1ca66: 0x6c960220, 0x1ca67: 0x6d1e3c20, + 0x1ca68: 0x6c17dc20, 0x1ca69: 0x6c182220, 0x1ca6a: 0x6cf2f620, 0x1ca6b: 0x6c8e5c20, + 0x1ca6c: 0x6d1d3c20, 0x1ca6d: 0x6c985a20, 0x1ca6e: 0x6cc3c420, 0x1ca6f: 0x6d0e7820, + 0x1ca70: 0x6ccbf620, 0x1ca71: 0x6c7dac20, 0x1ca72: 0x6d234c20, 0x1ca73: 0x6c1c2420, + 0x1ca74: 0x6c57de20, 0x1ca75: 0x6c91be20, 0x1ca76: 0x6c190420, 0x1ca77: 0x6c659a20, + 0x1ca78: 0x6caaa820, 0x1ca79: 0x6cd92620, 0x1ca7a: 0x6d3d6e20, 0x1ca7b: 0x6c794620, + 0x1ca7c: 0x6caeaa20, 0x1ca7d: 0x6d0c1420, 0x1ca7e: 0x6d3c9220, 0x1ca7f: 0x6c797e20, + // Block 0x72a, offset 0x1ca80 + 0x1ca80: 0x6c19ec20, 0x1ca81: 0x6cb5fc20, 0x1ca82: 0x6d402220, 0x1ca83: 0x6cbecc20, + 0x1ca84: 0x6c8bbc20, 0x1ca85: 0x6c757420, 0x1ca86: 0x6c0e7e20, 0x1ca87: 0x6c2fac20, + 0x1ca88: 0x6c9f6420, 0x1ca89: 0x6c2dce20, 0x1ca8a: 0x6c64bc20, 0x1ca8b: 0x6c51d020, + 0x1ca8c: 0x6c926e20, 0x1ca8d: 0x6c00ac20, 0x1ca8e: 0x6cdc4e20, 0x1ca8f: 0x6cc3d220, + 0x1ca90: 0x6c837c20, 0x1ca91: 0x6c06b020, 0x1ca92: 0x6d1a7420, 0x1ca93: 0x6c334c20, + 0x1ca94: 0x6cf45220, 0x1ca95: 0x6cb5fe20, 0x1ca96: 0x6c951820, 0x1ca97: 0x6ced2e20, + 0x1ca98: 0x6c2d2020, 0x1ca99: 0x6ca4b220, 0x1ca9a: 0x6c073420, 0x1ca9b: 0x6cb7a420, + 0x1ca9c: 0x6c190620, 0x1ca9d: 0x6cc87020, 0x1ca9e: 0x6d0cb620, 0x1ca9f: 0x6c2ed220, + 0x1caa0: 0x6c2fb020, 0x1caa1: 0x6c31a820, 0x1caa2: 0x6ceb2e20, 0x1caa3: 0x6c6b0c20, + 0x1caa4: 0x6d1bc620, 0x1caa5: 0x6c0b4420, 0x1caa6: 0x6c78c620, 0x1caa7: 0x6c0a0220, + 0x1caa8: 0x6cf0b020, 0x1caa9: 0x6cd79220, 0x1caaa: 0x6d318220, 0x1caab: 0x6c32d420, + 0x1caac: 0x6cf9de20, 0x1caad: 0x6c297a20, 0x1caae: 0x6ce35420, 0x1caaf: 0x6ca50c20, + 0x1cab0: 0x6caf1420, 0x1cab1: 0x6c65c420, 0x1cab2: 0x6c2c8220, 0x1cab3: 0x6ce0a220, + 0x1cab4: 0x6c13f620, 0x1cab5: 0x6ce54220, 0x1cab6: 0x6cb7b420, 0x1cab7: 0x6c341420, + 0x1cab8: 0x6c3c5e20, 0x1cab9: 0x6d08a420, 0x1caba: 0x6cc3f020, 0x1cabb: 0x6cc3f220, + 0x1cabc: 0x6c96a020, 0x1cabd: 0x6c45a620, 0x1cabe: 0x6ca73820, 0x1cabf: 0x6cdb0820, + // Block 0x72b, offset 0x1cac0 + 0x1cac0: 0x6c357820, 0x1cac1: 0x6c225420, 0x1cac2: 0x6c8e8820, 0x1cac3: 0x6cd81a20, + 0x1cac4: 0x6ce12620, 0x1cac5: 0x6c058820, 0x1cac6: 0x6c574620, 0x1cac7: 0x6caf8620, + 0x1cac8: 0x6ceff420, 0x1cac9: 0x6cca8820, 0x1caca: 0x6c82d220, 0x1cacb: 0x6c25c420, + 0x1cacc: 0x6ce4ba20, 0x1cacd: 0x6cf9e620, 0x1cace: 0x6cf6aa20, 0x1cacf: 0x6c883e20, + 0x1cad0: 0x6cac7020, 0x1cad1: 0x6cef3020, 0x1cad2: 0x6d27fc20, 0x1cad3: 0x6c330e20, + 0x1cad4: 0x6d307e20, 0x1cad5: 0x6c782620, 0x1cad6: 0x6c7e6020, 0x1cad7: 0x6d3b8c20, + 0x1cad8: 0x6cbed820, 0x1cad9: 0x6c4be420, 0x1cada: 0x6d3b9220, 0x1cadb: 0x6c152620, + 0x1cadc: 0x6cb7da20, 0x1cadd: 0x6c026c20, 0x1cade: 0x6cae8620, 0x1cadf: 0x6c8f4020, + 0x1cae0: 0x6c91de20, 0x1cae1: 0x6c771420, 0x1cae2: 0x6c209a20, 0x1cae3: 0x6c190e20, + 0x1cae4: 0x6d1afe20, 0x1cae5: 0x6c82d820, 0x1cae6: 0x6c0c1e20, 0x1cae7: 0x6cb7dc20, + 0x1cae8: 0x6ca07c20, 0x1cae9: 0x6cb7de20, 0x1caea: 0x6c24e820, 0x1caeb: 0x6d3fc220, + 0x1caec: 0x6cbeda20, 0x1caed: 0x6c21da20, 0x1caee: 0x6c952a20, 0x1caef: 0x6c5f5420, + 0x1caf0: 0x6ccdbe20, 0x1caf1: 0x6c817c20, 0x1caf2: 0x6cc1c020, 0x1caf3: 0x6d2b9a20, + 0x1caf4: 0x6c2aec20, 0x1caf5: 0x6c66e220, 0x1caf6: 0x6cf8f220, 0x1caf7: 0x6c8be820, + 0x1caf8: 0x6c2fbe20, 0x1caf9: 0x6ce01e20, 0x1cafa: 0x6c59fc20, 0x1cafb: 0x6cac7620, + 0x1cafc: 0x6d28ce20, 0x1cafd: 0x6cbbb820, 0x1cafe: 0x6c2b4820, 0x1caff: 0x6c86aa20, + // Block 0x72c, offset 0x1cb00 + 0x1cb00: 0x6c673e20, 0x1cb01: 0x6c688220, 0x1cb02: 0x6cf94a20, 0x1cb03: 0x6d2f0e20, + 0x1cb04: 0x6cbc0420, 0x1cb05: 0x6c33b620, 0x1cb06: 0x6c65f420, 0x1cb07: 0x6d241220, + 0x1cb08: 0x6d3cb420, 0x1cb09: 0x6c518420, 0x1cb0a: 0x6c78e020, 0x1cb0b: 0x6d2b1420, + 0x1cb0c: 0x6c826a20, 0x1cb0d: 0x6c787220, 0x1cb0e: 0x6c1ef620, 0x1cb0f: 0x6d137020, + 0x1cb10: 0x6cc40c20, 0x1cb11: 0x6c299a20, 0x1cb12: 0x6d161e20, 0x1cb13: 0x6c678e20, + 0x1cb14: 0x6caf9e20, 0x1cb15: 0x6cafa020, 0x1cb16: 0x6d243020, 0x1cb17: 0x6cb1f420, + 0x1cb18: 0x6c36d020, 0x1cb19: 0x6c00fe20, 0x1cb1a: 0x6c783e20, 0x1cb1b: 0x6c652220, + 0x1cb1c: 0x6d243220, 0x1cb1d: 0x6cc88e20, 0x1cb1e: 0x6c9b7220, 0x1cb1f: 0x6cada020, + 0x1cb20: 0x6c227820, 0x1cb21: 0x6c0f9020, 0x1cb22: 0x6d107c20, 0x1cb23: 0x6c96e420, + 0x1cb24: 0x6c10e620, 0x1cb25: 0x6cfbc820, 0x1cb26: 0x6c7c1620, 0x1cb27: 0x6c828020, + 0x1cb28: 0x6c82fe20, 0x1cb29: 0x6d375420, 0x1cb2a: 0x6c870420, 0x1cb2b: 0x6c872e20, + 0x1cb2c: 0x6c38e420, 0x1cb2d: 0x6cc41c20, 0x1cb2e: 0x6cada620, 0x1cb2f: 0x6d1c3020, + 0x1cb30: 0x6c874a20, 0x1cb31: 0x6c8fe620, 0x1cb32: 0x6c8fe820, 0x1cb33: 0x6ca19620, + 0x1cb34: 0x6c0fc220, 0x1cb35: 0x6cd6b420, 0x1cb36: 0x6c49be20, 0x1cb37: 0x6c800020, + 0x1cb38: 0x6d298620, 0x1cb39: 0x6d0d1820, 0x1cb3a: 0x6cd2f420, 0x1cb3b: 0x6cd2e620, + 0x1cb3c: 0x6c84f420, 0x1cb3d: 0x6cc61c20, 0x1cb3e: 0x6ccf3620, 0x1cb3f: 0x6d268020, + // Block 0x72d, offset 0x1cb40 + 0x1cb40: 0x6cd88420, 0x1cb41: 0x6cb56820, 0x1cb42: 0x6cdde220, 0x1cb43: 0x6c96b420, + 0x1cb44: 0x6d016420, 0x1cb45: 0x6d109420, 0x1cb46: 0x6cfa8020, 0x1cb47: 0x6cb58820, + 0x1cb48: 0x6cb58a20, 0x1cb49: 0x6d34f820, 0x1cb4a: 0x6c07d820, 0x1cb4b: 0x6c333a20, + 0x1cb4c: 0x6d381820, 0x1cb4d: 0x6cc5d620, 0x1cb4e: 0x6d13cc20, 0x1cb4f: 0x6cd25420, + 0x1cb50: 0x6d203020, 0x1cb51: 0x6d35a820, 0x1cb52: 0x6ce57a20, 0x1cb53: 0x6c3e1e20, + 0x1cb54: 0x6c3fc420, 0x1cb55: 0x6c9d2e20, 0x1cb56: 0x6d411420, 0x1cb57: 0x6d33ac20, + 0x1cb58: 0x6cdb9620, 0x1cb59: 0x6c9a8420, 0x1cb5a: 0x6d428620, 0x1cb5b: 0x6cc0ec20, + 0x1cb5c: 0x6c567220, 0x1cb5d: 0x6d3ac620, 0x1cb5e: 0x6cd03a20, 0x1cb5f: 0x6cdc3020, + 0x1cb60: 0x6c223020, 0x1cb61: 0x6c147a20, 0x1cb62: 0x6c9c3e20, 0x1cb63: 0x6c939020, + 0x1cb64: 0x6d223e20, 0x1cb65: 0x6cfdbc20, 0x1cb66: 0x6cf3c620, 0x1cb67: 0x6ce55620, + 0x1cb68: 0x6cb1ae20, 0x1cb69: 0x6d3ada20, 0x1cb6a: 0x6c4aec20, 0x1cb6b: 0x6cf9ae20, + 0x1cb6c: 0x6d33c820, 0x1cb6d: 0x6c61f420, 0x1cb6e: 0x6c434620, 0x1cb6f: 0x6d314420, + 0x1cb70: 0x6c434820, 0x1cb71: 0x6cd71e20, 0x1cb72: 0x6c6d0620, 0x1cb73: 0x6cd0a020, + 0x1cb74: 0x6c40f620, 0x1cb75: 0x6c7daa20, 0x1cb76: 0x6c2c4820, 0x1cb77: 0x6c29d820, + 0x1cb78: 0x6c5dc620, 0x1cb79: 0x6ce22820, 0x1cb7a: 0x6cb5ee20, 0x1cb7b: 0x6c481620, + 0x1cb7c: 0x6c498a20, 0x1cb7d: 0x6d41b420, 0x1cb7e: 0x6c8d0820, 0x1cb7f: 0x6c925a20, + // Block 0x72e, offset 0x1cb80 + 0x1cb80: 0x6c0de820, 0x1cb81: 0x6c6d1a20, 0x1cb82: 0x6c29da20, 0x1cb83: 0x6d346620, + 0x1cb84: 0x6c925820, 0x1cb85: 0x6c14f820, 0x1cb86: 0x6c06a620, 0x1cb87: 0x6d30d820, + 0x1cb88: 0x6c5aca20, 0x1cb89: 0x6d1fd620, 0x1cb8a: 0x6cf8a220, 0x1cb8b: 0x6d19ee20, + 0x1cb8c: 0x6d3e5420, 0x1cb8d: 0x6c5dd420, 0x1cb8e: 0x6d316e20, 0x1cb8f: 0x6c3e9c20, + 0x1cb90: 0x6d262420, 0x1cb91: 0x6cf3d020, 0x1cb92: 0x6cfc1820, 0x1cb93: 0x6d0fca20, + 0x1cb94: 0x6d33f420, 0x1cb95: 0x6d13fc20, 0x1cb96: 0x6c9a1220, 0x1cb97: 0x6cd7f820, + 0x1cb98: 0x6c2c6c20, 0x1cb99: 0x6c077a20, 0x1cb9a: 0x6d3d8220, 0x1cb9b: 0x6d318420, + 0x1cb9c: 0x6d1e5620, 0x1cb9d: 0x6c606c20, 0x1cb9e: 0x6c435220, 0x1cb9f: 0x6ce11a20, + 0x1cba0: 0x6cd80420, 0x1cba1: 0x6c96d020, 0x1cba2: 0x6cde7820, 0x1cba3: 0x6c40b620, + 0x1cba4: 0x6d07bc20, 0x1cba5: 0x6cb63c20, 0x1cba6: 0x6d241420, 0x1cba7: 0x6cf81220, + 0x1cba8: 0x6c5f3a20, 0x1cba9: 0x6cd8e020, 0x1cbaa: 0x6c152820, 0x1cbab: 0x6c28b420, + 0x1cbac: 0x6c4b8020, 0x1cbad: 0x6cdc7820, 0x1cbae: 0x6c853820, 0x1cbaf: 0x6ca9d020, + 0x1cbb0: 0x6c9c8a20, 0x1cbb1: 0x6c29f820, 0x1cbb2: 0x6c86d620, 0x1cbb3: 0x6cc4ee20, + 0x1cbb4: 0x6d271620, 0x1cbb5: 0x6ce3b420, 0x1cbb6: 0x6d29c220, 0x1cbb7: 0x6c836420, + 0x1cbb8: 0x6cc74020, 0x1cbb9: 0x6d222e20, 0x1cbba: 0x6d20dc20, 0x1cbbb: 0x6c83ae20, + 0x1cbbc: 0x6d019820, 0x1cbbd: 0x6cbd7620, 0x1cbbe: 0x6c50b220, 0x1cbbf: 0x6ce83c20, + // Block 0x72f, offset 0x1cbc0 + 0x1cbc0: 0x6d052c20, 0x1cbc1: 0x6cd7c620, 0x1cbc2: 0x6cc56c20, 0x1cbc3: 0x6ce83e20, + 0x1cbc4: 0x6d3ef020, 0x1cbc5: 0x6c13c820, 0x1cbc6: 0x6c41cc20, 0x1cbc7: 0x6d16cc20, + 0x1cbc8: 0x6cfa8220, 0x1cbc9: 0x6c0dc620, 0x1cbca: 0x6ca6f620, 0x1cbcb: 0x6cbfa620, + 0x1cbcc: 0x6cbfa820, 0x1cbcd: 0x6d37e820, 0x1cbce: 0x6c3bd420, 0x1cbcf: 0x6c502220, + 0x1cbd0: 0x6d279020, 0x1cbd1: 0x6c77e620, 0x1cbd2: 0x6c9e8c20, 0x1cbd3: 0x6d33ae20, + 0x1cbd4: 0x6c6d9820, 0x1cbd5: 0x6c08c820, 0x1cbd6: 0x6d33b020, 0x1cbd7: 0x6d22e620, + 0x1cbd8: 0x6c9d3420, 0x1cbd9: 0x6c7a8a20, 0x1cbda: 0x6c04f420, 0x1cbdb: 0x6caf5620, + 0x1cbdc: 0x6ca5ce20, 0x1cbdd: 0x6c85da20, 0x1cbde: 0x6d1f1a20, 0x1cbdf: 0x6d409a20, + 0x1cbe0: 0x6caf5820, 0x1cbe1: 0x6c0edc20, 0x1cbe2: 0x6c8cd020, 0x1cbe3: 0x6ca0fc20, + 0x1cbe4: 0x6c1a8020, 0x1cbe5: 0x6ca6fe20, 0x1cbe6: 0x6cbd6620, 0x1cbe7: 0x6d0f5620, + 0x1cbe8: 0x6d423220, 0x1cbe9: 0x6d35c420, 0x1cbea: 0x6d33ca20, 0x1cbeb: 0x6cd52420, + 0x1cbec: 0x6c721a20, 0x1cbed: 0x6d3ef620, 0x1cbee: 0x6c5d7220, 0x1cbef: 0x6c5ea820, + 0x1cbf0: 0x6c196220, 0x1cbf1: 0x6ce74220, 0x1cbf2: 0x6d35f820, 0x1cbf3: 0x6c5d7620, + 0x1cbf4: 0x6c511220, 0x1cbf5: 0x6d19ce20, 0x1cbf6: 0x6d3e2620, 0x1cbf7: 0x6d35fa20, + 0x1cbf8: 0x6c6a0220, 0x1cbf9: 0x6cc59420, 0x1cbfa: 0x6c325020, 0x1cbfb: 0x6d14e820, + 0x1cbfc: 0x6d399e20, 0x1cbfd: 0x6c5bb820, 0x1cbfe: 0x6ca9ba20, 0x1cbff: 0x6c3ff420, + // Block 0x730, offset 0x1cc00 + 0x1cc00: 0x6cf62020, 0x1cc01: 0x6c77aa20, 0x1cc02: 0x6c80ca20, 0x1cc03: 0x6c3d7420, + 0x1cc04: 0x6d0a9020, 0x1cc05: 0x6cd72020, 0x1cc06: 0x6c939420, 0x1cc07: 0x6c7dae20, + 0x1cc08: 0x6c41da20, 0x1cc09: 0x6c6db820, 0x1cc0a: 0x6ce32e20, 0x1cc0b: 0x6c1a0c20, + 0x1cc0c: 0x6ce8b420, 0x1cc0d: 0x6cce7020, 0x1cc0e: 0x6cd72220, 0x1cc0f: 0x6d0bc020, + 0x1cc10: 0x6c951a20, 0x1cc11: 0x6c927020, 0x1cc12: 0x6c481c20, 0x1cc13: 0x6d424420, + 0x1cc14: 0x6cc59a20, 0x1cc15: 0x6d3ce620, 0x1cc16: 0x6c057c20, 0x1cc17: 0x6c044a20, + 0x1cc18: 0x6c5eec20, 0x1cc19: 0x6d33f620, 0x1cc1a: 0x6d366020, 0x1cc1b: 0x6c7db420, + 0x1cc1c: 0x6c837e20, 0x1cc1d: 0x6caeac20, 0x1cc1e: 0x6c780a20, 0x1cc1f: 0x6c0dea20, + 0x1cc20: 0x6c1dbe20, 0x1cc21: 0x6d41b620, 0x1cc22: 0x6d237420, 0x1cc23: 0x6cda5220, + 0x1cc24: 0x6c94ae20, 0x1cc25: 0x6cfd8020, 0x1cc26: 0x6d140620, 0x1cc27: 0x6cf8b620, + 0x1cc28: 0x6c0b4620, 0x1cc29: 0x6c624820, 0x1cc2a: 0x6c3ec420, 0x1cc2b: 0x6cb0b020, + 0x1cc2c: 0x6cab0820, 0x1cc2d: 0x6c6a2c20, 0x1cc2e: 0x6d380420, 0x1cc2f: 0x6d3fa820, + 0x1cc30: 0x6d064e20, 0x1cc31: 0x6c197e20, 0x1cc32: 0x6c2a2220, 0x1cc33: 0x6cf1e820, + 0x1cc34: 0x6cfb8220, 0x1cc35: 0x6d3e6820, 0x1cc36: 0x6d23c820, 0x1cc37: 0x6c626420, + 0x1cc38: 0x6d072e20, 0x1cc39: 0x6d31f420, 0x1cc3a: 0x6d36b820, 0x1cc3b: 0x6c2a2a20, + 0x1cc3c: 0x6c645420, 0x1cc3d: 0x6c5f1820, 0x1cc3e: 0x6c431820, 0x1cc3f: 0x6c431a20, + // Block 0x731, offset 0x1cc40 + 0x1cc40: 0x6c47c420, 0x1cc41: 0x6cc6a020, 0x1cc42: 0x6cdc6020, 0x1cc43: 0x6cc73c20, + 0x1cc44: 0x6c627a20, 0x1cc45: 0x6c775220, 0x1cc46: 0x6ca2ac20, 0x1cc47: 0x6c11dc20, + 0x1cc48: 0x6c9a2620, 0x1cc49: 0x6d370c20, 0x1cc4a: 0x6c624a20, 0x1cc4b: 0x6c92d620, + 0x1cc4c: 0x6cda5a20, 0x1cc4d: 0x6c5f3c20, 0x1cc4e: 0x6d1d0c20, 0x1cc4f: 0x6cf1f020, + 0x1cc50: 0x6cbfc420, 0x1cc51: 0x6ccb6020, 0x1cc52: 0x6c51e620, 0x1cc53: 0x6d18aa20, + 0x1cc54: 0x6c59fe20, 0x1cc55: 0x6cbce620, 0x1cc56: 0x6c615620, 0x1cc57: 0x6cdc8820, + 0x1cc58: 0x6cff2020, 0x1cc59: 0x6cb45e20, 0x1cc5a: 0x6c688420, 0x1cc5b: 0x6d3d0c20, + 0x1cc5c: 0x6d380c20, 0x1cc5d: 0x6d41e620, 0x1cc5e: 0x6c93ba20, 0x1cc5f: 0x6cdc8c20, + 0x1cc60: 0x6ca9d420, 0x1cc61: 0x6ccb7820, 0x1cc62: 0x6c5c6c20, 0x1cc63: 0x6cc4de20, + 0x1cc64: 0x6cab1e20, 0x1cc65: 0x6d243420, 0x1cc66: 0x6cb1f820, 0x1cc67: 0x6c62bc20, + 0x1cc68: 0x6ce9ce20, 0x1cc69: 0x6cf1f420, 0x1cc6a: 0x6c199e20, 0x1cc6b: 0x6c5e1a20, + 0x1cc6c: 0x6c7c1820, 0x1cc6d: 0x6c93c020, 0x1cc6e: 0x6c0c4c20, 0x1cc6f: 0x6ccba820, + 0x1cc70: 0x6cc4f420, 0x1cc71: 0x6d3d1620, 0x1cc72: 0x6c84d420, 0x1cc73: 0x6c24aa20, + 0x1cc74: 0x6d08f220, 0x1cc75: 0x6cebc420, 0x1cc76: 0x6c6f5620, 0x1cc77: 0x6cbefa20, + 0x1cc78: 0x6cf59020, 0x1cc79: 0x6cbefe20, 0x1cc7a: 0x6c796820, 0x1cc7b: 0x6d207a20, + 0x1cc7c: 0x6ccfc020, 0x1cc7d: 0x6c6e1a20, 0x1cc7e: 0x6d11f220, 0x1cc7f: 0x6c1fe020, + // Block 0x732, offset 0x1cc80 + 0x1cc80: 0x6d3cce20, 0x1cc81: 0x6ce84420, 0x1cc82: 0x6c814620, 0x1cc83: 0x6cbca020, + 0x1cc84: 0x6d2d2820, 0x1cc85: 0x6d11a020, 0x1cc86: 0x6c0b3020, 0x1cc87: 0x6c05c420, + 0x1cc88: 0x6d11a220, 0x1cc89: 0x6c0ddc20, 0x1cc8a: 0x6cebd420, 0x1cc8b: 0x6d3a0820, + 0x1cc8c: 0x6c699020, 0x1cc8d: 0x6cbc3a20, 0x1cc8e: 0x6c2e1020, 0x1cc8f: 0x6cf36620, + 0x1cc90: 0x6c4a5e20, 0x1cc91: 0x6d10ea20, 0x1cc92: 0x6d35fc20, 0x1cc93: 0x6c205020, + 0x1cc94: 0x6d120220, 0x1cc95: 0x6ce5c220, 0x1cc96: 0x6c69a020, 0x1cc97: 0x6c205220, + 0x1cc98: 0x6c6f1220, 0x1cc99: 0x6cfeca20, 0x1cc9a: 0x6c19f020, 0x1cc9b: 0x6c79ec20, + 0x1cc9c: 0x6c24ac20, 0x1cc9d: 0x6cf29420, 0x1cc9e: 0x6c289420, 0x1cc9f: 0x6c7a4a20, + 0x1cca0: 0x6c780c20, 0x1cca1: 0x6d3d7020, 0x1cca2: 0x6d05b420, 0x1cca3: 0x6cda5420, + 0x1cca4: 0x6c491c20, 0x1cca5: 0x6c7c3e20, 0x1cca6: 0x6c312420, 0x1cca7: 0x6d3dfa20, + 0x1cca8: 0x6d09a020, 0x1cca9: 0x6cf29620, 0x1ccaa: 0x6cebea20, 0x1ccab: 0x6d0bc620, + 0x1ccac: 0x6d217820, 0x1ccad: 0x6c726a20, 0x1ccae: 0x6cbf5220, 0x1ccaf: 0x6d113a20, + 0x1ccb0: 0x6d113c20, 0x1ccb1: 0x6ce5cc20, 0x1ccb2: 0x6c177820, 0x1ccb3: 0x6d228020, + 0x1ccb4: 0x6ce4bc20, 0x1ccb5: 0x6c2e3e20, 0x1ccb6: 0x6c729220, 0x1ccb7: 0x6c8aa820, + 0x1ccb8: 0x6cf6ce20, 0x1ccb9: 0x6cf52220, 0x1ccba: 0x6c7c4420, 0x1ccbb: 0x6c206220, + 0x1ccbc: 0x6d2f7220, 0x1ccbd: 0x6c7b7c20, 0x1ccbe: 0x6c7b7420, 0x1ccbf: 0x6c907420, + // Block 0x733, offset 0x1ccc0 + 0x1ccc0: 0x6c199c20, 0x1ccc1: 0x6c256c20, 0x1ccc2: 0x6cb18420, 0x1ccc3: 0x6d2a9420, + 0x1ccc4: 0x6c24ba20, 0x1ccc5: 0x6cbc6820, 0x1ccc6: 0x6cbf7820, 0x1ccc7: 0x6c314c20, + 0x1ccc8: 0x6d2a9e20, 0x1ccc9: 0x6c904620, 0x1ccca: 0x6cbd0a20, 0x1cccb: 0x6c856c20, + 0x1cccc: 0x6c1f0a20, 0x1cccd: 0x6cd40c20, 0x1ccce: 0x6c3fb820, 0x1cccf: 0x6cba9220, + 0x1ccd0: 0x6c1f1c20, 0x1ccd1: 0x6c531820, 0x1ccd2: 0x6cb59820, 0x1ccd3: 0x6c508620, + 0x1ccd4: 0x6cd18420, 0x1ccd5: 0x6c3c0820, 0x1ccd6: 0x6cd5b220, 0x1ccd7: 0x6c9eb020, + 0x1ccd8: 0x6cc24020, 0x1ccd9: 0x6d2e5220, 0x1ccda: 0x6d3adc20, 0x1ccdb: 0x6c8cd420, + 0x1ccdc: 0x6c8f8220, 0x1ccdd: 0x6c0e1620, 0x1ccde: 0x6c6e6a20, 0x1ccdf: 0x6c6e7e20, + 0x1cce0: 0x6d2eb620, 0x1cce1: 0x6c046620, 0x1cce2: 0x6cd8c220, 0x1cce3: 0x6c75c020, + 0x1cce4: 0x6c534e20, 0x1cce5: 0x6ce74a20, 0x1cce6: 0x6cd95a20, 0x1cce7: 0x6c6e8820, + 0x1cce8: 0x6c2e2e20, 0x1cce9: 0x6d17f820, 0x1ccea: 0x6cd5e820, 0x1cceb: 0x6c6e7820, + 0x1ccec: 0x6cc24c20, 0x1cced: 0x6c6b1020, 0x1ccee: 0x6cb26020, 0x1ccef: 0x6c329e20, + 0x1ccf0: 0x6ccea620, 0x1ccf1: 0x6d3bac20, 0x1ccf2: 0x6c136220, 0x1ccf3: 0x6c2ab020, + 0x1ccf4: 0x6c259e20, 0x1ccf5: 0x6cec5a20, 0x1ccf6: 0x6c6ec020, 0x1ccf7: 0x6c76fa20, + 0x1ccf8: 0x6c6ec420, 0x1ccf9: 0x6d39f020, 0x1ccfa: 0x6d39f620, 0x1ccfb: 0x6c821a20, + 0x1ccfc: 0x6cae9220, 0x1ccfd: 0x6d20e020, 0x1ccfe: 0x6c1b0e20, 0x1ccff: 0x6c418820, + // Block 0x734, offset 0x1cd00 + 0x1cd00: 0x6c984220, 0x1cd01: 0x6d39fe20, 0x1cd02: 0x6cedb820, 0x1cd03: 0x6c321220, + 0x1cd04: 0x6c5eac20, 0x1cd05: 0x6cff7420, 0x1cd06: 0x6c03f020, 0x1cd07: 0x6cdb9820, + 0x1cd08: 0x6c5ffc20, 0x1cd09: 0x6cbdce20, 0x1cd0a: 0x6d2faa20, 0x1cd0b: 0x6cdce820, + 0x1cd0c: 0x6d0b2020, 0x1cd0d: 0x6d3c7e20, 0x1cd0e: 0x6d255220, 0x1cd0f: 0x6c568420, + 0x1cd10: 0x6c4f6820, 0x1cd11: 0x6cffe220, 0x1cd12: 0x6c132e20, 0x1cd13: 0x6c096c20, + 0x1cd14: 0x6c08d020, 0x1cd15: 0x6c658020, 0x1cd16: 0x6d15de20, 0x1cd17: 0x6c2ffc20, + 0x1cd18: 0x6ccce220, 0x1cd19: 0x6cd0fe20, 0x1cd1a: 0x6c264820, 0x1cd1b: 0x6c2b6c20, + 0x1cd1c: 0x6d3a0e20, 0x1cd1d: 0x6ca33420, 0x1cd1e: 0x6c1aac20, 0x1cd1f: 0x6c470620, + 0x1cd20: 0x6c85f620, 0x1cd21: 0x6cbcba20, 0x1cd22: 0x6c9faa20, 0x1cd23: 0x6c05ae20, + 0x1cd24: 0x6ce58220, 0x1cd25: 0x6cd8b620, 0x1cd26: 0x6c3e5820, 0x1cd27: 0x6c12de20, + 0x1cd28: 0x6c07b420, 0x1cd29: 0x6cae1a20, 0x1cd2a: 0x6c26a020, 0x1cd2b: 0x6d3f0620, + 0x1cd2c: 0x6c2c4a20, 0x1cd2d: 0x6c8cee20, 0x1cd2e: 0x6d2ac420, 0x1cd2f: 0x6caa4220, + 0x1cd30: 0x6c3e5a20, 0x1cd31: 0x6c467e20, 0x1cd32: 0x6c389620, 0x1cd33: 0x6c634e20, + 0x1cd34: 0x6c41d820, 0x1cd35: 0x6c394820, 0x1cd36: 0x6cd2cc20, 0x1cd37: 0x6c993820, + 0x1cd38: 0x6cb35620, 0x1cd39: 0x6ce45020, 0x1cd3a: 0x6c648a20, 0x1cd3b: 0x6cbf1820, + 0x1cd3c: 0x6c8f8a20, 0x1cd3d: 0x6c9fe420, 0x1cd3e: 0x6c0af020, 0x1cd3f: 0x6c960420, + // Block 0x735, offset 0x1cd40 + 0x1cd40: 0x6c4b4c20, 0x1cd41: 0x6cc10c20, 0x1cd42: 0x6c1b2620, 0x1cd43: 0x6d19e220, + 0x1cd44: 0x6d120820, 0x1cd45: 0x6cfc0e20, 0x1cd46: 0x6c08e220, 0x1cd47: 0x6cbf1a20, + 0x1cd48: 0x6c7dfa20, 0x1cd49: 0x6c2acc20, 0x1cd4a: 0x6cff8c20, 0x1cd4b: 0x6c6c4620, + 0x1cd4c: 0x6cc2f420, 0x1cd4d: 0x6cdcec20, 0x1cd4e: 0x6cc7ae20, 0x1cd4f: 0x6c381420, + 0x1cd50: 0x6c7b9e20, 0x1cd51: 0x6d3af620, 0x1cd52: 0x6ce7b820, 0x1cd53: 0x6c5ed820, + 0x1cd54: 0x6c26a820, 0x1cd55: 0x6c4f7a20, 0x1cd56: 0x6c12ee20, 0x1cd57: 0x6d383020, + 0x1cd58: 0x6c79ee20, 0x1cd59: 0x6c7f0e20, 0x1cd5a: 0x6c09a820, 0x1cd5b: 0x6ccc8a20, + 0x1cd5c: 0x6c28fe20, 0x1cd5d: 0x6d32c820, 0x1cd5e: 0x6c12fa20, 0x1cd5f: 0x6c3d7e20, + 0x1cd60: 0x6d27b420, 0x1cd61: 0x6ce8c620, 0x1cd62: 0x6cabd820, 0x1cd63: 0x6c83ec20, + 0x1cd64: 0x6c80d020, 0x1cd65: 0x6c71ba20, 0x1cd66: 0x6c495820, 0x1cd67: 0x6c65b020, + 0x1cd68: 0x6c4e1e20, 0x1cd69: 0x6ce75620, 0x1cd6a: 0x6cf9d620, 0x1cd6b: 0x6d366220, + 0x1cd6c: 0x6c1a0e20, 0x1cd6d: 0x6cdb9a20, 0x1cd6e: 0x6cd39e20, 0x1cd6f: 0x6d3b0c20, + 0x1cd70: 0x6d424620, 0x1cd71: 0x6cffb020, 0x1cd72: 0x6cce7620, 0x1cd73: 0x6ce67620, + 0x1cd74: 0x6c12fc20, 0x1cd75: 0x6d0c9e20, 0x1cd76: 0x6c435020, 0x1cd77: 0x6c7b2c20, + 0x1cd78: 0x6c41a020, 0x1cd79: 0x6c1dc020, 0x1cd7a: 0x6c7c2e20, 0x1cd7b: 0x6c42aa20, + 0x1cd7c: 0x6d27b620, 0x1cd7d: 0x6cab2a20, 0x1cd7e: 0x6cb8f420, 0x1cd7f: 0x6cffb220, + // Block 0x736, offset 0x1cd80 + 0x1cd80: 0x6c65b220, 0x1cd81: 0x6cb3de20, 0x1cd82: 0x6c7f1c20, 0x1cd83: 0x6d405c20, + 0x1cd84: 0x6c08ec20, 0x1cd85: 0x6c0a0420, 0x1cd86: 0x6c0a0620, 0x1cd87: 0x6c448c20, + 0x1cd88: 0x6cdf3020, 0x1cd89: 0x6c48e020, 0x1cd8a: 0x6d209420, 0x1cd8b: 0x6c64cc20, + 0x1cd8c: 0x6c2a2420, 0x1cd8d: 0x6c472420, 0x1cd8e: 0x6c1b4420, 0x1cd8f: 0x6d32e220, + 0x1cd90: 0x6cbed220, 0x1cd91: 0x6ccc6820, 0x1cd92: 0x6d38ec20, 0x1cd93: 0x6c928e20, + 0x1cd94: 0x6c0f3020, 0x1cd95: 0x6c5f0a20, 0x1cd96: 0x6c8bc420, 0x1cd97: 0x6cdb9e20, + 0x1cd98: 0x6c75d420, 0x1cd99: 0x6c3ec820, 0x1cd9a: 0x6d2c4220, 0x1cd9b: 0x6c472620, + 0x1cd9c: 0x6c798620, 0x1cd9d: 0x6cb9b220, 0x1cd9e: 0x6cb90a20, 0x1cd9f: 0x6c75d620, + 0x1cda0: 0x6c20dc20, 0x1cda1: 0x6c495a20, 0x1cda2: 0x6d250420, 0x1cda3: 0x6c130820, + 0x1cda4: 0x6d40cc20, 0x1cda5: 0x6c0fe620, 0x1cda6: 0x6d2ae420, 0x1cda7: 0x6cbcd620, + 0x1cda8: 0x6cebb020, 0x1cda9: 0x6c954e20, 0x1cdaa: 0x6c27ec20, 0x1cdab: 0x6cfef420, + 0x1cdac: 0x6cc92620, 0x1cdad: 0x6c66ba20, 0x1cdae: 0x6d07c020, 0x1cdaf: 0x6c0b0020, + 0x1cdb0: 0x6cdcfc20, 0x1cdb1: 0x6cfd8620, 0x1cdb2: 0x6cfc2420, 0x1cdb3: 0x6cb2c620, + 0x1cdb4: 0x6d318c20, 0x1cdb5: 0x6d039420, 0x1cdb6: 0x6c559420, 0x1cdb7: 0x6d154a20, + 0x1cdb8: 0x6d3b1420, 0x1cdb9: 0x6d265820, 0x1cdba: 0x6c211020, 0x1cdbb: 0x6c93f620, + 0x1cdbc: 0x6cf37e20, 0x1cdbd: 0x6c303820, 0x1cdbe: 0x6cd79a20, 0x1cdbf: 0x6c609020, + // Block 0x737, offset 0x1cdc0 + 0x1cdc0: 0x6c6af220, 0x1cdc1: 0x6c59ee20, 0x1cdc2: 0x6d039620, 0x1cdc3: 0x6c9aa820, + 0x1cdc4: 0x6c396a20, 0x1cdc5: 0x6c200a20, 0x1cdc6: 0x6d3bde20, 0x1cdc7: 0x6cb0fc20, + 0x1cdc8: 0x6c3c6220, 0x1cdc9: 0x6d3a2820, 0x1cdca: 0x6c59f020, 0x1cdcb: 0x6cbce020, + 0x1cdcc: 0x6c542420, 0x1cdcd: 0x6cbfbe20, 0x1cdce: 0x6c9e9a20, 0x1cdcf: 0x6cba7620, + 0x1cdd0: 0x6c483c20, 0x1cdd1: 0x6c7d1020, 0x1cdd2: 0x6cd41c20, 0x1cdd3: 0x6c90f420, + 0x1cdd4: 0x6d27c820, 0x1cdd5: 0x6c517020, 0x1cdd6: 0x6ce13420, 0x1cdd7: 0x6d26ee20, + 0x1cdd8: 0x6c1d7e20, 0x1cdd9: 0x6c42de20, 0x1cdda: 0x6c3a7020, 0x1cddb: 0x6cc92e20, + 0x1cddc: 0x6d32f420, 0x1cddd: 0x6c465e20, 0x1cdde: 0x6ca87220, 0x1cddf: 0x6cba7e20, + 0x1cde0: 0x6cffbc20, 0x1cde1: 0x6c24b420, 0x1cde2: 0x6c903820, 0x1cde3: 0x6caec620, + 0x1cde4: 0x6c322e20, 0x1cde5: 0x6c867e20, 0x1cde6: 0x6c0a5420, 0x1cde7: 0x6d3d9e20, + 0x1cde8: 0x6c1ea820, 0x1cde9: 0x6ccc9020, 0x1cdea: 0x6c1b5220, 0x1cdeb: 0x6d3b2c20, + 0x1cdec: 0x6cbada20, 0x1cded: 0x6c8fae20, 0x1cdee: 0x6c7fb620, 0x1cdef: 0x6c64fa20, + 0x1cdf0: 0x6c10ba20, 0x1cdf1: 0x6c844220, 0x1cdf2: 0x6c5c5820, 0x1cdf3: 0x6c0a5620, + 0x1cdf4: 0x6c2b9020, 0x1cdf5: 0x6c236420, 0x1cdf6: 0x6d0c3620, 0x1cdf7: 0x6caf2020, + 0x1cdf8: 0x6c11e020, 0x1cdf9: 0x6d3be620, 0x1cdfa: 0x6cb02220, 0x1cdfb: 0x6cb19e20, + 0x1cdfc: 0x6c30c820, 0x1cdfd: 0x6d243620, 0x1cdfe: 0x6c9ef820, 0x1cdff: 0x6ce96020, + // Block 0x738, offset 0x1ce00 + 0x1ce00: 0x6d2b1020, 0x1ce01: 0x6ccc9220, 0x1ce02: 0x6c4b8420, 0x1ce03: 0x6d156e20, + 0x1ce04: 0x6c56cc20, 0x1ce05: 0x6c15e620, 0x1ce06: 0x6c7a0820, 0x1ce07: 0x6c246820, + 0x1ce08: 0x6cb2d620, 0x1ce09: 0x6d2a9020, 0x1ce0a: 0x6c5f5620, 0x1ce0b: 0x6c4b1c20, + 0x1ce0c: 0x6cdb3820, 0x1ce0d: 0x6c90fc20, 0x1ce0e: 0x6c131a20, 0x1ce0f: 0x6c92e820, + 0x1ce10: 0x6ca73e20, 0x1ce11: 0x6cdd3820, 0x1ce12: 0x6c24b620, 0x1ce13: 0x6c2e5420, + 0x1ce14: 0x6cdd4020, 0x1ce15: 0x6c822a20, 0x1ce16: 0x6c32dc20, 0x1ce17: 0x6c89d020, + 0x1ce18: 0x6cff2220, 0x1ce19: 0x6c0f9420, 0x1ce1a: 0x6c9da020, 0x1ce1b: 0x6ccc9420, + 0x1ce1c: 0x6c299c20, 0x1ce1d: 0x6c8a3620, 0x1ce1e: 0x6c280c20, 0x1ce1f: 0x6c2d8e20, + 0x1ce20: 0x6c3f9020, 0x1ce21: 0x6c65f820, 0x1ce22: 0x6c9fd020, 0x1ce23: 0x6c7d2820, + 0x1ce24: 0x6c27a020, 0x1ce25: 0x6c689820, 0x1ce26: 0x6c2ab620, 0x1ce27: 0x6c5a0c20, + 0x1ce28: 0x6cdd0020, 0x1ce29: 0x6c818220, 0x1ce2a: 0x6d295220, 0x1ce2b: 0x6cff3c20, + 0x1ce2c: 0x6c931e20, 0x1ce2d: 0x6cd3f620, 0x1ce2e: 0x6d295420, 0x1ce2f: 0x6cb81c20, + 0x1ce30: 0x6cac0a20, 0x1ce31: 0x6cb81e20, 0x1ce32: 0x6cac0c20, 0x1ce33: 0x6c41f620, + 0x1ce34: 0x6c72b220, 0x1ce35: 0x6c328a20, 0x1ce36: 0x6c930620, 0x1ce37: 0x6d0cf220, + 0x1ce38: 0x6c0fea20, 0x1ce39: 0x6c291820, 0x1ce3a: 0x6cc9ec20, 0x1ce3b: 0x6d3b5e20, + 0x1ce3c: 0x6c8fca20, 0x1ce3d: 0x6cb94020, 0x1ce3e: 0x6c888420, 0x1ce3f: 0x6c10cc20, + // Block 0x739, offset 0x1ce40 + 0x1ce40: 0x6d396220, 0x1ce41: 0x6c7f6e20, 0x1ce42: 0x6cd42020, 0x1ce43: 0x6c7fec20, + 0x1ce44: 0x6c7d3420, 0x1ce45: 0x6d21d620, 0x1ce46: 0x6d270420, 0x1ce47: 0x6c500020, + 0x1ce48: 0x6d31a220, 0x1ce49: 0x6cdf5020, 0x1ce4a: 0x6ce43e20, 0x1ce4b: 0x6ca8a420, + 0x1ce4c: 0x6c1e0420, 0x1ce4d: 0x6c60ec20, 0x1ce4e: 0x6d199820, 0x1ce4f: 0x6cb82020, + 0x1ce50: 0x6ce2ca20, 0x1ce51: 0x6d3c0020, 0x1ce52: 0x6d396820, 0x1ce53: 0x6c387020, + 0x1ce54: 0x6cda3c20, 0x1ce55: 0x6d396620, 0x1ce56: 0x6cba9820, 0x1ce57: 0x6d3de020, + 0x1ce58: 0x6ce2d420, 0x1ce59: 0x6c933a20, 0x1ce5a: 0x6c919420, 0x1ce5b: 0x6c662a20, + 0x1ce5c: 0x6cebbe20, 0x1ce5d: 0x6d1cd420, 0x1ce5e: 0x6d248620, 0x1ce5f: 0x6c7f7e20, + 0x1ce60: 0x6c8ff420, 0x1ce61: 0x6cbd1620, 0x1ce62: 0x6c88a220, 0x1ce63: 0x6c800a20, + 0x1ce64: 0x6cb95c20, 0x1ce65: 0x6d272020, 0x1ce66: 0x6d37e420, 0x1ce67: 0x6cc20e20, + 0x1ce68: 0x6c88a420, 0x1ce69: 0x6c0b2820, 0x1ce6a: 0x6c32ea20, 0x1ce6b: 0x6d415a20, + 0x1ce6c: 0x6c84d620, 0x1ce6d: 0x6cd86220, 0x1ce6e: 0x6c958e20, 0x1ce6f: 0x6d1cde20, + 0x1ce70: 0x6d273820, 0x1ce71: 0x6d3df220, 0x1ce72: 0x6d24ae20, 0x1ce73: 0x6c9cd620, + 0x1ce74: 0x6c2b5820, 0x1ce75: 0x6c388a20, 0x1ce76: 0x6ccfb020, 0x1ce77: 0x6d302820, + 0x1ce78: 0x6ccfc220, 0x1ce79: 0x6caa7220, 0x1ce7a: 0x6c50e220, 0x1ce7b: 0x6c832420, + 0x1ce7c: 0x6cfa8e20, 0x1ce7d: 0x6d3efa20, 0x1ce7e: 0x6ca5c620, 0x1ce7f: 0x6c25b420, + // Block 0x73a, offset 0x1ce80 + 0x1ce80: 0x6d2f4620, 0x1ce81: 0x6cb8c020, 0x1ce82: 0x6d2d5a20, 0x1ce83: 0x6c08d220, + 0x1ce84: 0x6c04c620, 0x1ce85: 0x6cf4d820, 0x1ce86: 0x6ccbde20, 0x1ce87: 0x6c772a20, + 0x1ce88: 0x6cc77620, 0x1ce89: 0x6c3bba20, 0x1ce8a: 0x6c096e20, 0x1ce8b: 0x6c252620, + 0x1ce8c: 0x6d1b9a20, 0x1ce8d: 0x6d304020, 0x1ce8e: 0x6c1b9020, 0x1ce8f: 0x6cdf8620, + 0x1ce90: 0x6c56fa20, 0x1ce91: 0x6c033c20, 0x1ce92: 0x6c85f820, 0x1ce93: 0x6c419620, + 0x1ce94: 0x6c722e20, 0x1ce95: 0x6cb38420, 0x1ce96: 0x6ca10c20, 0x1ce97: 0x6c241020, + 0x1ce98: 0x6d2d6e20, 0x1ce99: 0x6d392220, 0x1ce9a: 0x6c83c620, 0x1ce9b: 0x6cdaac20, + 0x1ce9c: 0x6ce5d620, 0x1ce9d: 0x6c85fa20, 0x1ce9e: 0x6cf62220, 0x1ce9f: 0x6cdab620, + 0x1cea0: 0x6c535020, 0x1cea1: 0x6ce74c20, 0x1cea2: 0x6d3e4420, 0x1cea3: 0x6c12e020, + 0x1cea4: 0x6d26bc20, 0x1cea5: 0x6d388620, 0x1cea6: 0x6c8bb820, 0x1cea7: 0x6d3c1a20, + 0x1cea8: 0x6c042220, 0x1cea9: 0x6c81f620, 0x1ceaa: 0x6c3bda20, 0x1ceab: 0x6c375820, + 0x1ceac: 0x6cc10e20, 0x1cead: 0x6c521620, 0x1ceae: 0x6c895a20, 0x1ceaf: 0x6cfcd820, + 0x1ceb0: 0x6c3ea020, 0x1ceb1: 0x6c895c20, 0x1ceb2: 0x6c11fa20, 0x1ceb3: 0x6c6dc220, + 0x1ceb4: 0x6c851c20, 0x1ceb5: 0x6d26c620, 0x1ceb6: 0x6c929020, 0x1ceb7: 0x6c714020, + 0x1ceb8: 0x6cb61e20, 0x1ceb9: 0x6c254e20, 0x1ceba: 0x6c045220, 0x1cebb: 0x6d2ece20, + 0x1cebc: 0x6c8bc620, 0x1cebd: 0x6d402620, 0x1cebe: 0x6c6dcc20, 0x1cebf: 0x6c4cc420, + // Block 0x73b, offset 0x1cec0 + 0x1cec0: 0x6c57e020, 0x1cec1: 0x6cca2220, 0x1cec2: 0x6cca2620, 0x1cec3: 0x6ce12a20, + 0x1cec4: 0x6c0b4c20, 0x1cec5: 0x6cc75c20, 0x1cec6: 0x6c9e5c20, 0x1cec7: 0x6c542620, + 0x1cec8: 0x6d065220, 0x1cec9: 0x6d402a20, 0x1ceca: 0x6c56fe20, 0x1cecb: 0x6c66be20, + 0x1cecc: 0x6d294e20, 0x1cecd: 0x6c225e20, 0x1cece: 0x6c843020, 0x1cecf: 0x6d021a20, + 0x1ced0: 0x6c3da020, 0x1ced1: 0x6cab1220, 0x1ced2: 0x6c076020, 0x1ced3: 0x6c47d020, + 0x1ced4: 0x6d052820, 0x1ced5: 0x6c42e020, 0x1ced6: 0x6ce13620, 0x1ced7: 0x6cc0b220, + 0x1ced8: 0x6c645620, 0x1ced9: 0x6c126a20, 0x1ceda: 0x6d3c2420, 0x1cedb: 0x6ce14020, + 0x1cedc: 0x6c9c7c20, 0x1cedd: 0x6cca2c20, 0x1cede: 0x6c3bf420, 0x1cedf: 0x6d2a2620, + 0x1cee0: 0x6c775620, 0x1cee1: 0x6c67fe20, 0x1cee2: 0x6ca07e20, 0x1cee3: 0x6cca3020, + 0x1cee4: 0x6cca3220, 0x1cee5: 0x6cab1c20, 0x1cee6: 0x6cf70820, 0x1cee7: 0x6c897420, + 0x1cee8: 0x6c680820, 0x1cee9: 0x6c7b4620, 0x1ceea: 0x6c0ffa20, 0x1ceeb: 0x6c58b620, + 0x1ceec: 0x6cd63620, 0x1ceed: 0x6d403e20, 0x1ceee: 0x6cfd4020, 0x1ceef: 0x6cab2020, + 0x1cef0: 0x6ce97020, 0x1cef1: 0x6ca8b820, 0x1cef2: 0x6c873020, 0x1cef3: 0x6d42b220, + 0x1cef4: 0x6c2bb820, 0x1cef5: 0x6ca8ba20, 0x1cef6: 0x6ce5e420, 0x1cef7: 0x6c809820, + 0x1cef8: 0x6c9d1a20, 0x1cef9: 0x6cd7c020, 0x1cefa: 0x6c6f5820, 0x1cefb: 0x6cf83e20, + 0x1cefc: 0x6c456620, 0x1cefd: 0x6d331c20, 0x1cefe: 0x6c6f5e20, 0x1ceff: 0x6d201c20, + // Block 0x73c, offset 0x1cf00 + 0x1cf00: 0x6c61b020, 0x1cf01: 0x6c143a20, 0x1cf02: 0x6d391020, 0x1cf03: 0x6d09f020, + 0x1cf04: 0x6d264a20, 0x1cf05: 0x6c531c20, 0x1cf06: 0x6d207e20, 0x1cf07: 0x6c50e420, + 0x1cf08: 0x6cecce20, 0x1cf09: 0x6cc5d820, 0x1cf0a: 0x6cf1d220, 0x1cf0b: 0x6cf18c20, + 0x1cf0c: 0x6cc03620, 0x1cf0d: 0x6ca32820, 0x1cf0e: 0x6d3e1c20, 0x1cf0f: 0x6ce80c20, + 0x1cf10: 0x6ca99020, 0x1cf11: 0x6c3d1420, 0x1cf12: 0x6c61d020, 0x1cf13: 0x6cd4c020, + 0x1cf14: 0x6c213c20, 0x1cf15: 0x6caf5a20, 0x1cf16: 0x6d323220, 0x1cf17: 0x6ccbe020, + 0x1cf18: 0x6c532e20, 0x1cf19: 0x6d351220, 0x1cf1a: 0x6c5ffe20, 0x1cf1b: 0x6c3b2220, + 0x1cf1c: 0x6d279e20, 0x1cf1d: 0x6cc5de20, 0x1cf1e: 0x6c283220, 0x1cf1f: 0x6c6c4020, + 0x1cf20: 0x6cda9420, 0x1cf21: 0x6c39d220, 0x1cf22: 0x6cdd5a20, 0x1cf23: 0x6c252820, + 0x1cf24: 0x6c6fb820, 0x1cf25: 0x6d288c20, 0x1cf26: 0x6c03f220, 0x1cf27: 0x6c6c8c20, + 0x1cf28: 0x6c3d6a20, 0x1cf29: 0x6d35fe20, 0x1cf2a: 0x6c229820, 0x1cf2b: 0x6d3f1620, + 0x1cf2c: 0x6c1da620, 0x1cf2d: 0x6c533e20, 0x1cf2e: 0x6d288e20, 0x1cf2f: 0x6c833420, + 0x1cf30: 0x6cf87a20, 0x1cf31: 0x6c3e5c20, 0x1cf32: 0x6d019a20, 0x1cf33: 0x6ccfe020, + 0x1cf34: 0x6c0e6c20, 0x1cf35: 0x6d3ae820, 0x1cf36: 0x6cc0fc20, 0x1cf37: 0x6c8cf020, + 0x1cf38: 0x6d3aea20, 0x1cf39: 0x6cced620, 0x1cf3a: 0x6c421e20, 0x1cf3b: 0x6d101420, + 0x1cf3c: 0x6c3e5e20, 0x1cf3d: 0x6ceb1820, 0x1cf3e: 0x6d31d420, 0x1cf3f: 0x6c275e20, + // Block 0x73d, offset 0x1cf40 + 0x1cf40: 0x6c1f3420, 0x1cf41: 0x6cd1b420, 0x1cf42: 0x6d37b620, 0x1cf43: 0x6cfb4e20, + 0x1cf44: 0x6d411a20, 0x1cf45: 0x6c6ede20, 0x1cf46: 0x6c04f820, 0x1cf47: 0x6cc18c20, + 0x1cf48: 0x6ca10e20, 0x1cf49: 0x6cd5c620, 0x1cf4a: 0x6d41ac20, 0x1cf4b: 0x6c7c2c20, + 0x1cf4c: 0x6c6db020, 0x1cf4d: 0x6cc5f220, 0x1cf4e: 0x6c4f7c20, 0x1cf4f: 0x6d01b220, + 0x1cf50: 0x6c6ad620, 0x1cf51: 0x6d39a820, 0x1cf52: 0x6c1db420, 0x1cf53: 0x6c48b620, + 0x1cf54: 0x6c042420, 0x1cf55: 0x6c745420, 0x1cf56: 0x6c7bf620, 0x1cf57: 0x6c556220, + 0x1cf58: 0x6c22c620, 0x1cf59: 0x6c587820, 0x1cf5a: 0x6c44d220, 0x1cf5b: 0x6ce1c820, + 0x1cf5c: 0x6c6ad820, 0x1cf5d: 0x6c7a9a20, 0x1cf5e: 0x6c68fc20, 0x1cf5f: 0x6cc2f620, + 0x1cf60: 0x6c411620, 0x1cf61: 0x6c960620, 0x1cf62: 0x6d089620, 0x1cf63: 0x6c07ee20, + 0x1cf64: 0x6cfcc620, 0x1cf65: 0x6c3e8620, 0x1cf66: 0x6c449420, 0x1cf67: 0x6c307a20, + 0x1cf68: 0x6cc67a20, 0x1cf69: 0x6ce5d820, 0x1cf6a: 0x6d19e420, 0x1cf6b: 0x6c82c220, + 0x1cf6c: 0x6d01b420, 0x1cf6d: 0x6c736820, 0x1cf6e: 0x6d06e020, 0x1cf6f: 0x6c40f820, + 0x1cf70: 0x6c2eae20, 0x1cf71: 0x6ce7ba20, 0x1cf72: 0x6cd7ea20, 0x1cf73: 0x6c67e820, + 0x1cf74: 0x6cfdc420, 0x1cf75: 0x6c5bc820, 0x1cf76: 0x6c745620, 0x1cf77: 0x6d346820, + 0x1cf78: 0x6c65b420, 0x1cf79: 0x6c737620, 0x1cf7a: 0x6c1ac020, 0x1cf7b: 0x6c9e2c20, + 0x1cf7c: 0x6d31e820, 0x1cf7d: 0x6c939e20, 0x1cf7e: 0x6c1a1020, 0x1cf7f: 0x6cc07a20, + // Block 0x73e, offset 0x1cf80 + 0x1cf80: 0x6cd4ec20, 0x1cf81: 0x6c055020, 0x1cf82: 0x6ce7bc20, 0x1cf83: 0x6cfedc20, + 0x1cf84: 0x6c588020, 0x1cf85: 0x6cbd3620, 0x1cf86: 0x6c451220, 0x1cf87: 0x6d052620, + 0x1cf88: 0x6ce34c20, 0x1cf89: 0x6ce82e20, 0x1cf8a: 0x6d00c020, 0x1cf8b: 0x6c536420, + 0x1cf8c: 0x6cf8a420, 0x1cf8d: 0x6c3ea220, 0x1cf8e: 0x6ce64620, 0x1cf8f: 0x6cdbcc20, + 0x1cf90: 0x6c335220, 0x1cf91: 0x6c7db620, 0x1cf92: 0x6c3d8020, 0x1cf93: 0x6c6dc420, + 0x1cf94: 0x6c56a620, 0x1cf95: 0x6d33f820, 0x1cf96: 0x6d0ca020, 0x1cf97: 0x6c6f1c20, + 0x1cf98: 0x6c3cb020, 0x1cf99: 0x6c622020, 0x1cf9a: 0x6d077420, 0x1cf9b: 0x6cc60c20, + 0x1cf9c: 0x6d3faa20, 0x1cf9d: 0x6c187820, 0x1cf9e: 0x6c34a420, 0x1cf9f: 0x6c865020, + 0x1cfa0: 0x6c93ec20, 0x1cfa1: 0x6c896020, 0x1cfa2: 0x6c1dcc20, 0x1cfa3: 0x6cc36420, + 0x1cfa4: 0x6ccede20, 0x1cfa5: 0x6cb62020, 0x1cfa6: 0x6cb62220, 0x1cfa7: 0x6d3ce020, + 0x1cfa8: 0x6cb62420, 0x1cfa9: 0x6ced3420, 0x1cfaa: 0x6cba6a20, 0x1cfab: 0x6cfcec20, + 0x1cfac: 0x6cd47420, 0x1cfad: 0x6cef2220, 0x1cfae: 0x6cb70e20, 0x1cfaf: 0x6ce23020, + 0x1cfb0: 0x6ced3620, 0x1cfb1: 0x6c428c20, 0x1cfb2: 0x6cee3020, 0x1cfb3: 0x6c080420, + 0x1cfb4: 0x6d3cc620, 0x1cfb5: 0x6c113a20, 0x1cfb6: 0x6c4cc620, 0x1cfb7: 0x6c255020, + 0x1cfb8: 0x6c950420, 0x1cfb9: 0x6c8f1020, 0x1cfba: 0x6cb71020, 0x1cfbb: 0x6d2e6e20, + 0x1cfbc: 0x6c0a0820, 0x1cfbd: 0x6c21cc20, 0x1cfbe: 0x6c8d3c20, 0x1cfbf: 0x6c9dca20, + // Block 0x73f, offset 0x1cfc0 + 0x1cfc0: 0x6cb51420, 0x1cfc1: 0x6cbcd820, 0x1cfc2: 0x6ce4b420, 0x1cfc3: 0x6d3fac20, + 0x1cfc4: 0x6c4bd820, 0x1cfc5: 0x6d405e20, 0x1cfc6: 0x6cf67c20, 0x1cfc7: 0x6d3e6a20, + 0x1cfc8: 0x6d043220, 0x1cfc9: 0x6c899a20, 0x1cfca: 0x6c6ca420, 0x1cfcb: 0x6c3a1220, + 0x1cfcc: 0x6cc8a020, 0x1cfcd: 0x6c9f7220, 0x1cfce: 0x6d239e20, 0x1cfcf: 0x6d400420, + 0x1cfd0: 0x6c38ae20, 0x1cfd1: 0x6c93ee20, 0x1cfd2: 0x6d071620, 0x1cfd3: 0x6d1bd820, + 0x1cfd4: 0x6cce5620, 0x1cfd5: 0x6cb81820, 0x1cfd6: 0x6d073020, 0x1cfd7: 0x6cfd8820, + 0x1cfd8: 0x6c64dc20, 0x1cfd9: 0x6c78ce20, 0x1cfda: 0x6cfcfe20, 0x1cfdb: 0x6cc87620, + 0x1cfdc: 0x6c9dcc20, 0x1cfdd: 0x6c5f1c20, 0x1cfde: 0x6c32d820, 0x1cfdf: 0x6c1d1e20, + 0x1cfe0: 0x6c2c9420, 0x1cfe1: 0x6c9f7820, 0x1cfe2: 0x6c9e7c20, 0x1cfe3: 0x6d259c20, + 0x1cfe4: 0x6d01fe20, 0x1cfe5: 0x6c060e20, 0x1cfe6: 0x6cd82020, 0x1cfe7: 0x6cbfc020, + 0x1cfe8: 0x6c0b0220, 0x1cfe9: 0x6c58dc20, 0x1cfea: 0x6c44d820, 0x1cfeb: 0x6c234620, + 0x1cfec: 0x6c9e3820, 0x1cfed: 0x6cf0c420, 0x1cfee: 0x6c403620, 0x1cfef: 0x6cf00620, + 0x1cff0: 0x6ce7f420, 0x1cff1: 0x6c465a20, 0x1cff2: 0x6c9e9c20, 0x1cff3: 0x6d00de20, + 0x1cff4: 0x6c891220, 0x1cff5: 0x6d3fb620, 0x1cff6: 0x6c0bb620, 0x1cff7: 0x6d284a20, + 0x1cff8: 0x6d19fc20, 0x1cff9: 0x6ce36820, 0x1cffa: 0x6c486c20, 0x1cffb: 0x6d36ea20, + 0x1cffc: 0x6d284c20, 0x1cffd: 0x6c198c20, 0x1cffe: 0x6c152020, 0x1cfff: 0x6c278c20, + // Block 0x740, offset 0x1d000 + 0x1d000: 0x6cf9ea20, 0x1d001: 0x6d259e20, 0x1d002: 0x6d400620, 0x1d003: 0x6d05da20, + 0x1d004: 0x6d1d6a20, 0x1d005: 0x6cf14420, 0x1d006: 0x6c44da20, 0x1d007: 0x6d07c220, + 0x1d008: 0x6d1c9c20, 0x1d009: 0x6c6d5220, 0x1d00a: 0x6d18ae20, 0x1d00b: 0x6d3ca220, + 0x1d00c: 0x6ca6c020, 0x1d00d: 0x6c053c20, 0x1d00e: 0x6c47c820, 0x1d00f: 0x6cac7220, + 0x1d010: 0x6d395420, 0x1d011: 0x6c64fc20, 0x1d012: 0x6c220a20, 0x1d013: 0x6cc31620, + 0x1d014: 0x6cd6e020, 0x1d015: 0x6d276620, 0x1d016: 0x6cf9f220, 0x1d017: 0x6c24ea20, + 0x1d018: 0x6cf6d220, 0x1d019: 0x6cc6a620, 0x1d01a: 0x6ce1ea20, 0x1d01b: 0x6c405420, + 0x1d01c: 0x6d27ca20, 0x1d01d: 0x6c188820, 0x1d01e: 0x6c432020, 0x1d01f: 0x6cc82820, + 0x1d020: 0x6c55b820, 0x1d021: 0x6d294620, 0x1d022: 0x6ce2b420, 0x1d023: 0x6cfd1020, + 0x1d024: 0x6cdb1e20, 0x1d025: 0x6d31fc20, 0x1d026: 0x6d403420, 0x1d027: 0x6ce1ec20, + 0x1d028: 0x6c5a8420, 0x1d029: 0x6c114a20, 0x1d02a: 0x6c0a5820, 0x1d02b: 0x6c3cf620, + 0x1d02c: 0x6c246a20, 0x1d02d: 0x6c844620, 0x1d02e: 0x6cdd4220, 0x1d02f: 0x6d0ddc20, + 0x1d030: 0x6cf81820, 0x1d031: 0x6d403820, 0x1d032: 0x6c826420, 0x1d033: 0x6c739820, + 0x1d034: 0x6cba8220, 0x1d035: 0x6c980820, 0x1d036: 0x6d34a420, 0x1d037: 0x6c93bc20, + 0x1d038: 0x6ca2b220, 0x1d039: 0x6cb1a020, 0x1d03a: 0x6c885220, 0x1d03b: 0x6c9c8020, + 0x1d03c: 0x6d08bc20, 0x1d03d: 0x6d400a20, 0x1d03e: 0x6c5f5820, 0x1d03f: 0x6ccd1220, + // Block 0x741, offset 0x1d040 + 0x1d040: 0x6cdc8e20, 0x1d041: 0x6c38ca20, 0x1d042: 0x6c940620, 0x1d043: 0x6c083020, + 0x1d044: 0x6d141e20, 0x1d045: 0x6ccac220, 0x1d046: 0x6ca1ec20, 0x1d047: 0x6d114c20, + 0x1d048: 0x6cbb4a20, 0x1d049: 0x6c5d0220, 0x1d04a: 0x6cfd5a20, 0x1d04b: 0x6c629a20, + 0x1d04c: 0x6ccc8620, 0x1d04d: 0x6d055220, 0x1d04e: 0x6cc49420, 0x1d04f: 0x6d08be20, + 0x1d050: 0x6cdca020, 0x1d051: 0x6cbbc020, 0x1d052: 0x6d2b9e20, 0x1d053: 0x6d427020, + 0x1d054: 0x6d341e20, 0x1d055: 0x6ccdca20, 0x1d056: 0x6cca3420, 0x1d057: 0x6c8bf020, + 0x1d058: 0x6d243820, 0x1d059: 0x6c386220, 0x1d05a: 0x6c8a3820, 0x1d05b: 0x6c21e020, + 0x1d05c: 0x6d41f820, 0x1d05d: 0x6c66f220, 0x1d05e: 0x6cc54a20, 0x1d05f: 0x6c15f020, + 0x1d060: 0x6cc8b620, 0x1d061: 0x6d055620, 0x1d062: 0x6c5c6e20, 0x1d063: 0x6c57ca20, + 0x1d064: 0x6d414a20, 0x1d065: 0x6cf70a20, 0x1d066: 0x6cbb4e20, 0x1d067: 0x6d287c20, + 0x1d068: 0x6c270220, 0x1d069: 0x6cd12620, 0x1d06a: 0x6c5c7e20, 0x1d06b: 0x6cf91620, + 0x1d06c: 0x6ccb8020, 0x1d06d: 0x6c660020, 0x1d06e: 0x6c679220, 0x1d06f: 0x6c58b820, + 0x1d070: 0x6d2a5e20, 0x1d071: 0x6c236e20, 0x1d072: 0x6d026020, 0x1d073: 0x6c695a20, + 0x1d074: 0x6c0aa820, 0x1d075: 0x6c28de20, 0x1d076: 0x6d191020, 0x1d077: 0x6ca9ec20, + 0x1d078: 0x6cdca220, 0x1d079: 0x6d191220, 0x1d07a: 0x6ccc9a20, 0x1d07b: 0x6d060420, + 0x1d07c: 0x6c62cc20, 0x1d07d: 0x6c0d6c20, 0x1d07e: 0x6cba3020, 0x1d07f: 0x6c7fee20, + // Block 0x742, offset 0x1d080 + 0x1d080: 0x6cb47020, 0x1d081: 0x6d09c620, 0x1d082: 0x6d415420, 0x1d083: 0x6cb69620, + 0x1d084: 0x6caee820, 0x1d085: 0x6d124620, 0x1d086: 0x6ca19a20, 0x1d087: 0x6c835c20, + 0x1d088: 0x6d012820, 0x1d089: 0x6d415620, 0x1d08a: 0x6c7c1a20, 0x1d08b: 0x6d1ed220, + 0x1d08c: 0x6d076220, 0x1d08d: 0x6c828420, 0x1d08e: 0x6cfb0420, 0x1d08f: 0x6c156220, + 0x1d090: 0x6c69f220, 0x1d091: 0x6c919620, 0x1d092: 0x6c156a20, 0x1d093: 0x6d1c4020, + 0x1d094: 0x6c111820, 0x1d095: 0x6cc51620, 0x1d096: 0x6cfb1620, 0x1d097: 0x6d418620, + 0x1d098: 0x6d415c20, 0x1d099: 0x6c965220, 0x1d09a: 0x6c84e020, 0x1d09b: 0x6c2a5220, + 0x1d09c: 0x6c806a20, 0x1d09d: 0x6c82ac20, 0x1d09e: 0x6c894020, 0x1d09f: 0x6cd7b620, + 0x1d0a0: 0x6c6f4620, 0x1d0a1: 0x6d207420, 0x1d0a2: 0x6c52ee20, 0x1d0a3: 0x6d38f420, + 0x1d0a4: 0x6cfa7420, 0x1d0a5: 0x6c436a20, 0x1d0a6: 0x6d264820, 0x1d0a7: 0x6c5fce20, + 0x1d0a8: 0x6cecbc20, 0x1d0a9: 0x6c7bda20, 0x1d0aa: 0x6c617a20, 0x1d0ab: 0x6cc5b820, + 0x1d0ac: 0x6cef8820, 0x1d0ad: 0x6d278220, 0x1d0ae: 0x6c52fc20, 0x1d0af: 0x6c213420, + 0x1d0b0: 0x6caf2c20, 0x1d0b1: 0x6ccbca20, 0x1d0b2: 0x6c425820, 0x1d0b3: 0x6ca30820, + 0x1d0b4: 0x6cc5c620, 0x1d0b5: 0x6d401620, 0x1d0b6: 0x6c94dc20, 0x1d0b7: 0x6c3b1220, + 0x1d0b8: 0x6d34ec20, 0x1d0b9: 0x6cf17e20, 0x1d0ba: 0x6c39c220, 0x1d0bb: 0x6d3aa420, + 0x1d0bc: 0x6d321420, 0x1d0bd: 0x6ca97c20, 0x1d0be: 0x6cd4a020, 0x1d0bf: 0x6cfc8220, + // Block 0x743, offset 0x1d0c0 + 0x1d0c0: 0x6c421220, 0x1d0c1: 0x6d016620, 0x1d0c2: 0x6c3dfa20, 0x1d0c3: 0x6c88e420, + 0x1d0c4: 0x6d410c20, 0x1d0c5: 0x6ccfb220, 0x1d0c6: 0x6cf84e20, 0x1d0c7: 0x6d33a020, + 0x1d0c8: 0x6d37a020, 0x1d0c9: 0x6d390420, 0x1d0ca: 0x6c04ec20, 0x1d0cb: 0x6c3dfc20, + 0x1d0cc: 0x6c1f1420, 0x1d0cd: 0x6ccec820, 0x1d0ce: 0x6d16ce20, 0x1d0cf: 0x6c6d9220, + 0x1d0d0: 0x6c273820, 0x1d0d1: 0x6c054a20, 0x1d0d2: 0x6cc65a20, 0x1d0d3: 0x6c6a9820, + 0x1d0d4: 0x6c7a8620, 0x1d0d5: 0x6cc54620, 0x1d0d6: 0x6c2e7620, 0x1d0d7: 0x6c4f6420, + 0x1d0d8: 0x6c5b9e20, 0x1d0d9: 0x6c449220, 0x1d0da: 0x6d087c20, 0x1d0db: 0x6c67dc20, + 0x1d0dc: 0x6c95ea20, 0x1d0dd: 0x6c740420, 0x1d0de: 0x6c68d620, 0x1d0df: 0x6ce7ae20, + 0x1d0e0: 0x6c450020, 0x1d0e1: 0x6cfea820, 0x1d0e2: 0x6c735020, 0x1d0e3: 0x6d053620, + 0x1d0e4: 0x6cf87220, 0x1d0e5: 0x6cdbf020, 0x1d0e6: 0x6ce1c020, 0x1d0e7: 0x6c61d220, + 0x1d0e8: 0x6ce31820, 0x1d0e9: 0x6c5eb820, 0x1d0ea: 0x6d06be20, 0x1d0eb: 0x6c8cf220, + 0x1d0ec: 0x6d1bb220, 0x1d0ed: 0x6d06c020, 0x1d0ee: 0x6cb6f620, 0x1d0ef: 0x6c39fc20, + 0x1d0f0: 0x6c21b820, 0x1d0f1: 0x6cce5220, 0x1d0f2: 0x6c4bc220, 0x1d0f3: 0x6cd11e20, + 0x1d0f4: 0x6cef0420, 0x1d0f5: 0x6c9dc020, 0x1d0f6: 0x6cd46820, 0x1d0f7: 0x6c081a20, + 0x1d0f8: 0x6c1da820, 0x1d0f9: 0x6ce22220, 0x1d0fa: 0x6c8f0620, 0x1d0fb: 0x6cc35a20, + 0x1d0fc: 0x6d3f7820, 0x1d0fd: 0x6d2e5c20, 0x1d0fe: 0x6ced0c20, 0x1d0ff: 0x6c93d820, + // Block 0x744, offset 0x1d100 + 0x1d100: 0x6d3cc420, 0x1d101: 0x6d3e2820, 0x1d102: 0x6c78b420, 0x1d103: 0x6cfd7820, + 0x1d104: 0x6c64a420, 0x1d105: 0x6c9e2820, 0x1d106: 0x6c802a20, 0x1d107: 0x6ce33020, + 0x1d108: 0x6c9e9420, 0x1d109: 0x6c5eda20, 0x1d10a: 0x6d275020, 0x1d10b: 0x6c5bca20, + 0x1d10c: 0x6cd7ec20, 0x1d10d: 0x6c348620, 0x1d10e: 0x6c32c420, 0x1d10f: 0x6c0ba020, + 0x1d110: 0x6cfcc820, 0x1d111: 0x6c464a20, 0x1d112: 0x6d3c8a20, 0x1d113: 0x6c58d820, + 0x1d114: 0x6c2c5e20, 0x1d115: 0x6c93a020, 0x1d116: 0x6c0af620, 0x1d117: 0x6c9f5820, + 0x1d118: 0x6d256820, 0x1d119: 0x6c6d1c20, 0x1d11a: 0x6c401020, 0x1d11b: 0x6cc81e20, + 0x1d11c: 0x6d31ea20, 0x1d11d: 0x6c3ce620, 0x1d11e: 0x6c24ce20, 0x1d11f: 0x6c430c20, + 0x1d120: 0x6c150420, 0x1d121: 0x6c83f020, 0x1d122: 0x6d17fc20, 0x1d123: 0x6c64be20, + 0x1d124: 0x6c0d4020, 0x1d125: 0x6cb15a20, 0x1d126: 0x6c97f020, 0x1d127: 0x6c824820, + 0x1d128: 0x6d1bda20, 0x1d129: 0x6cdd2e20, 0x1d12a: 0x6ca1d820, 0x1d12b: 0x6ccaba20, + 0x1d12c: 0x6d00e020, 0x1d12d: 0x6c8a1420, 0x1d12e: 0x6ccda220, 0x1d12f: 0x6d2b8c20, + 0x1d130: 0x6c677a20, 0x1d131: 0x6cba2420, 0x1d132: 0x6cbbb220, 0x1d133: 0x6c589a20, + 0x1d134: 0x6c694620, 0x1d135: 0x6d415020, 0x1d136: 0x6c3d1a20, 0x1d137: 0x6d016820, + 0x1d138: 0x6c426820, 0x1d139: 0x6c3d2420, 0x1d13a: 0x6cc38a20, 0x1d13b: 0x6c3d2620, + 0x1d13c: 0x6cb81020, 0x1d13d: 0x6c0e6e20, 0x1d13e: 0x6cb2ac20, 0x1d13f: 0x6cfe3420, + // Block 0x745, offset 0x1d140 + 0x1d140: 0x6d2ff620, 0x1d141: 0x6c428e20, 0x1d142: 0x6d1bdc20, 0x1d143: 0x6d1bea20, + 0x1d144: 0x6cbee020, 0x1d145: 0x6cfa4c20, 0x1d146: 0x6c49aa20, 0x1d147: 0x6d41fa20, + 0x1d148: 0x6ce02a20, 0x1d149: 0x6c126020, 0x1d14a: 0x6cb7fe20, 0x1d14b: 0x6cf27620, + 0x1d14c: 0x6d1c2220, 0x1d14d: 0x6c828620, 0x1d14e: 0x6ce04820, 0x1d14f: 0x6c919820, + 0x1d150: 0x6c49c420, 0x1d151: 0x6cedf420, 0x1d152: 0x6cedf020, 0x1d153: 0x6c424e20, + 0x1d154: 0x6cedfe20, 0x1d155: 0x6c4e5020, 0x1d156: 0x6c953820, 0x1d157: 0x6c952c20, + 0x1d158: 0x6c3e2220, 0x1d159: 0x6c9c3a20, 0x1d15a: 0x6c380620, 0x1d15b: 0x6c470020, + 0x1d15c: 0x6d3a6020, 0x1d15d: 0x6c707220, 0x1d15e: 0x6c98d420, 0x1d15f: 0x6c477420, + 0x1d160: 0x6c9f4220, 0x1d161: 0x6c427220, 0x1d162: 0x6c03f420, 0x1d163: 0x6c48b220, + 0x1d164: 0x6ce33220, 0x1d165: 0x6c736a20, 0x1d166: 0x6c3e8820, 0x1d167: 0x6cd0b420, + 0x1d168: 0x6d0da820, 0x1d169: 0x6d2fc220, 0x1d16a: 0x6d41b820, 0x1d16b: 0x6c48b820, + 0x1d16c: 0x6d3d7220, 0x1d16d: 0x6d237620, 0x1d16e: 0x6d366620, 0x1d16f: 0x6c018e20, + 0x1d170: 0x6c382020, 0x1d171: 0x6c803420, 0x1d172: 0x6cd56220, 0x1d173: 0x6cd80620, + 0x1d174: 0x6cb00820, 0x1d175: 0x6c96da20, 0x1d176: 0x6c8f1620, 0x1d177: 0x6c03f820, + 0x1d178: 0x6c382420, 0x1d179: 0x6c844a20, 0x1d17a: 0x6c177e20, 0x1d17b: 0x6cf0d020, + 0x1d17c: 0x6c0a3420, 0x1d17d: 0x6c629c20, 0x1d17e: 0x6d2b9c20, 0x1d17f: 0x6c1ce620, + // Block 0x746, offset 0x1d180 + 0x1d180: 0x6c8f2220, 0x1d181: 0x6c5f5a20, 0x1d182: 0x6c739e20, 0x1d183: 0x6c9da220, + 0x1d184: 0x6d2fec20, 0x1d185: 0x6c956220, 0x1d186: 0x6cb03220, 0x1d187: 0x6c5f9e20, + 0x1d188: 0x6c5fb020, 0x1d189: 0x6c946820, 0x1d18a: 0x6d0f7620, 0x1d18b: 0x6c9cde20, + 0x1d18c: 0x6cba9e20, 0x1d18d: 0x6c268820, 0x1d18e: 0x6c9a4e20, 0x1d18f: 0x6d0f9a20, + 0x1d190: 0x6d1fbc20, 0x1d191: 0x6d1fb420, 0x1d192: 0x6c3b6620, 0x1d193: 0x6c033e20, + 0x1d194: 0x6c42b820, 0x1d195: 0x6d104a20, 0x1d196: 0x6c477620, 0x1d197: 0x6cbaaa20, + 0x1d198: 0x6d29d620, 0x1d199: 0x6c42ba20, 0x1d19a: 0x6c8cf620, 0x1d19b: 0x6d176e20, + 0x1d19c: 0x6d3aee20, 0x1d19d: 0x6c2b2820, 0x1d19e: 0x6d04c820, 0x1d19f: 0x6cbb3c20, + 0x1d1a0: 0x6d14fa20, 0x1d1a1: 0x6cfcca20, 0x1d1a2: 0x6cc67c20, 0x1d1a3: 0x6cc44a20, + 0x1d1a4: 0x6cc44c20, 0x1d1a5: 0x6cbb4420, 0x1d1a6: 0x6c588220, 0x1d1a7: 0x6cdd2620, + 0x1d1a8: 0x6cfcdc20, 0x1d1a9: 0x6d17fe20, 0x1d1aa: 0x6d107a20, 0x1d1ab: 0x6cbad220, + 0x1d1ac: 0x6cb9c220, 0x1d1ad: 0x6d218820, 0x1d1ae: 0x6c44dc20, 0x1d1af: 0x6c6b2220, + 0x1d1b0: 0x6ce0cc20, 0x1d1b1: 0x6d25ac20, 0x1d1b2: 0x6cf6d420, 0x1d1b3: 0x6c38d820, + 0x1d1b4: 0x6ccd1a20, 0x1d1b5: 0x6c3ba220, 0x1d1b6: 0x6ccd1e20, 0x1d1b7: 0x6c88d820, + 0x1d1b8: 0x6c827420, 0x1d1b9: 0x6c44e420, 0x1d1ba: 0x6caa0820, 0x1d1bb: 0x6cbb5e20, + 0x1d1bc: 0x6c164620, 0x1d1bd: 0x6d221c20, 0x1d1be: 0x6c461020, 0x1d1bf: 0x6d170420, + // Block 0x747, offset 0x1d1c0 + 0x1d1c0: 0x6c1cbe20, 0x1d1c1: 0x6cf22220, 0x1d1c2: 0x6c3b2420, 0x1d1c3: 0x6c533020, + 0x1d1c4: 0x6c1c0820, 0x1d1c5: 0x6c1c0a20, 0x1d1c6: 0x6c252a20, 0x1d1c7: 0x6c3e6020, + 0x1d1c8: 0x6cf9b220, 0x1d1c9: 0x6c079c20, 0x1d1ca: 0x6d177020, 0x1d1cb: 0x6c7e4220, + 0x1d1cc: 0x6d177220, 0x1d1cd: 0x6caf6220, 0x1d1ce: 0x6c8cf820, 0x1d1cf: 0x6c8f2e20, + 0x1d1d0: 0x6d360020, 0x1d1d1: 0x6cc18e20, 0x1d1d2: 0x6cf77a20, 0x1d1d3: 0x6d00ae20, + 0x1d1d4: 0x6cfdc620, 0x1d1d5: 0x6cf62420, 0x1d1d6: 0x6cf88e20, 0x1d1d7: 0x6c785020, + 0x1d1d8: 0x6cbc4620, 0x1d1d9: 0x6c5bcc20, 0x1d1da: 0x6c5aba20, 0x1d1db: 0x6cfecc20, + 0x1d1dc: 0x6ccc5e20, 0x1d1dd: 0x6c536620, 0x1d1de: 0x6c676c20, 0x1d1df: 0x6c2b7e20, + 0x1d1e0: 0x6c255220, 0x1d1e1: 0x6c3a6420, 0x1d1e2: 0x6c2a2620, 0x1d1e3: 0x6ccc6a20, + 0x1d1e4: 0x6c1c4a20, 0x1d1e5: 0x6d3b1620, 0x1d1e6: 0x6c65d220, 0x1d1e7: 0x6d07c420, + 0x1d1e8: 0x6c1c6220, 0x1d1e9: 0x6cb0fe20, 0x1d1ea: 0x6d3fb820, 0x1d1eb: 0x6cece620, + 0x1d1ec: 0x6c5aea20, 0x1d1ed: 0x6c542820, 0x1d1ee: 0x6c517420, 0x1d1ef: 0x6c51e820, + 0x1d1f0: 0x6c4f0a20, 0x1d1f1: 0x6c027220, 0x1d1f2: 0x6cb16820, 0x1d1f3: 0x6d18d020, + 0x1d1f4: 0x6c885420, 0x1d1f5: 0x6c543420, 0x1d1f6: 0x6c030820, 0x1d1f7: 0x6c8bf220, + 0x1d1f8: 0x6cae4820, 0x1d1f9: 0x6cbc6a20, 0x1d1fa: 0x6c027e20, 0x1d1fb: 0x6c386420, + 0x1d1fc: 0x6d18d220, 0x1d1fd: 0x6c5c8020, 0x1d1fe: 0x6d07e420, 0x1d1ff: 0x6c2a4a20, + // Block 0x748, offset 0x1d200 + 0x1d200: 0x6d124420, 0x1d201: 0x6c819a20, 0x1d202: 0x6c819820, 0x1d203: 0x6c779c20, + 0x1d204: 0x6c996620, 0x1d205: 0x6d30d220, 0x1d206: 0x6cb5a820, 0x1d207: 0x6c467a20, + 0x1d208: 0x6c468020, 0x1d209: 0x6c467c20, 0x1d20a: 0x6c2f3420, 0x1d20b: 0x6c2eb020, + 0x1d20c: 0x6c373020, 0x1d20d: 0x6cd64620, 0x1d20e: 0x6cc85620, 0x1d20f: 0x6ca3b220, + 0x1d210: 0x6ca3b420, 0x1d211: 0x6c329220, 0x1d212: 0x6c82b220, 0x1d213: 0x6ce63220, + 0x1d214: 0x6d3efc20, 0x1d215: 0x6c44c220, 0x1d216: 0x6c17b620, 0x1d217: 0x6c503220, + 0x1d218: 0x6d27a020, 0x1d219: 0x6c03b020, 0x1d21a: 0x6caf6420, 0x1d21b: 0x6d14ec20, + 0x1d21c: 0x6cd8bc20, 0x1d21d: 0x6cc26e20, 0x1d21e: 0x6c635220, 0x1d21f: 0x6c723220, + 0x1d220: 0x6c5d5620, 0x1d221: 0x6c1e8e20, 0x1d222: 0x6c81d420, 0x1d223: 0x6c951c20, + 0x1d224: 0x6c607020, 0x1d225: 0x6ce0c620, 0x1d226: 0x6cab8e20, 0x1d227: 0x6c90b420, + 0x1d228: 0x6caa2820, 0x1d229: 0x6c67be20, 0x1d22a: 0x6cad1e20, 0x1d22b: 0x6d2c5620, + 0x1d22c: 0x6c90be20, 0x1d22d: 0x6c5f7020, 0x1d22e: 0x6c81e420, 0x1d22f: 0x6c5e2e20, + 0x1d230: 0x6d1ed420, 0x1d231: 0x6ca1a020, 0x1d232: 0x6c580420, 0x1d233: 0x6c378420, + 0x1d234: 0x6d169620, 0x1d235: 0x6c2f5420, 0x1d236: 0x6d127420, 0x1d237: 0x6c264420, + 0x1d238: 0x6cd95820, 0x1d239: 0x6cbd6820, 0x1d23a: 0x6d27a220, 0x1d23b: 0x6c1b9420, + 0x1d23c: 0x6c27ca20, 0x1d23d: 0x6c27cc20, 0x1d23e: 0x6c533420, 0x1d23f: 0x6c450220, + // Block 0x749, offset 0x1d240 + 0x1d240: 0x6d344820, 0x1d241: 0x6cacb220, 0x1d242: 0x6ca80c20, 0x1d243: 0x6c27d420, + 0x1d244: 0x6d31d620, 0x1d245: 0x6c181a20, 0x1d246: 0x6c8cfa20, 0x1d247: 0x6d32ba20, + 0x1d248: 0x6d1fc220, 0x1d249: 0x6cec3020, 0x1d24a: 0x6c89e420, 0x1d24b: 0x6c8f8c20, + 0x1d24c: 0x6d345c20, 0x1d24d: 0x6ca90220, 0x1d24e: 0x6ce55e20, 0x1d24f: 0x6c375c20, + 0x1d250: 0x6d0bb420, 0x1d251: 0x6ce5f020, 0x1d252: 0x6c485e20, 0x1d253: 0x6d077220, + 0x1d254: 0x6c880420, 0x1d255: 0x6c504620, 0x1d256: 0x6cd16e20, 0x1d257: 0x6c8b1a20, + 0x1d258: 0x6cb24420, 0x1d259: 0x6c6dce20, 0x1d25a: 0x6c726c20, 0x1d25b: 0x6c08ee20, + 0x1d25c: 0x6c2bfe20, 0x1d25d: 0x6c4c7c20, 0x1d25e: 0x6cf1a220, 0x1d25f: 0x6d071a20, + 0x1d260: 0x6cb25820, 0x1d261: 0x6c232e20, 0x1d262: 0x6c2fc820, 0x1d263: 0x6ca5f820, + 0x1d264: 0x6ce68c20, 0x1d265: 0x6c71d020, 0x1d266: 0x6c234820, 0x1d267: 0x6c7c4220, + 0x1d268: 0x6c894420, 0x1d269: 0x6c7d1220, 0x1d26a: 0x6c234a20, 0x1d26b: 0x6c884020, + 0x1d26c: 0x6cf26020, 0x1d26d: 0x6c7d1420, 0x1d26e: 0x6c885820, 0x1d26f: 0x6c886820, + 0x1d270: 0x6c236620, 0x1d271: 0x6c027420, 0x1d272: 0x6cd11820, 0x1d273: 0x6cd96e20, + 0x1d274: 0x6ce64c20, 0x1d275: 0x6c7d2a20, 0x1d276: 0x6ca88820, 0x1d277: 0x6d34aa20, + 0x1d278: 0x6c281020, 0x1d279: 0x6ca93420, 0x1d27a: 0x6cbc8a20, 0x1d27b: 0x6ca65e20, + 0x1d27c: 0x6ce65220, 0x1d27d: 0x6ce65620, 0x1d27e: 0x6c8ff820, 0x1d27f: 0x6d22c620, + // Block 0x74a, offset 0x1d280 + 0x1d280: 0x6d22b620, 0x1d281: 0x6d2fac20, 0x1d282: 0x6cd8ac20, 0x1d283: 0x6cda8220, + 0x1d284: 0x6d180020, 0x1d285: 0x6cdad820, 0x1d286: 0x6cd8ca20, 0x1d287: 0x6d2fcc20, + 0x1d288: 0x6d2fce20, 0x1d289: 0x6cc78220, 0x1d28a: 0x6d164c20, 0x1d28b: 0x6c81fe20, + 0x1d28c: 0x6c5e8020, 0x1d28d: 0x6cbffe20, 0x1d28e: 0x6c78f220, 0x1d28f: 0x6c12b620, + 0x1d290: 0x6c437020, 0x1d291: 0x6c0eb020, 0x1d292: 0x6c58f020, 0x1d293: 0x6c597a20, + 0x1d294: 0x6d15c220, 0x1d295: 0x6cc5c820, 0x1d296: 0x6cffd220, 0x1d297: 0x6cc7f620, + 0x1d298: 0x6d38d820, 0x1d299: 0x6d25fc20, 0x1d29a: 0x6c323820, 0x1d29b: 0x6c425a20, + 0x1d29c: 0x6cc65420, 0x1d29d: 0x6c416e20, 0x1d29e: 0x6c138020, 0x1d29f: 0x6cf2d220, + 0x1d2a0: 0x6c169820, 0x1d2a1: 0x6c476020, 0x1d2a2: 0x6d33a220, 0x1d2a3: 0x6c4dd620, + 0x1d2a4: 0x6c3d4420, 0x1d2a5: 0x6c3a3220, 0x1d2a6: 0x6c3b6420, 0x1d2a7: 0x6cadb220, + 0x1d2a8: 0x6cad2820, 0x1d2a9: 0x6c647020, 0x1d2aa: 0x6c39a820, 0x1d2ab: 0x6d3ccc20, + 0x1d2ac: 0x6d1f0220, 0x1d2ad: 0x6ca31420, 0x1d2ae: 0x6c01e820, 0x1d2af: 0x6c78f620, + 0x1d2b0: 0x6cc46420, 0x1d2b1: 0x6c456820, 0x1d2b2: 0x6d22da20, 0x1d2b3: 0x6cf1d020, + 0x1d2b4: 0x6d10d020, 0x1d2b5: 0x6cb58c20, 0x1d2b6: 0x6cafc020, 0x1d2b7: 0x6cb9f620, + 0x1d2b8: 0x6cf59220, 0x1d2b9: 0x6cf59420, 0x1d2ba: 0x6c3a8c20, 0x1d2bb: 0x6c78f820, + 0x1d2bc: 0x6c6e1220, 0x1d2bd: 0x6cdf6420, 0x1d2be: 0x6cd09020, 0x1d2bf: 0x6d37e620, + // Block 0x74b, offset 0x1d2c0 + 0x1d2c0: 0x6d2f2820, 0x1d2c1: 0x6d007220, 0x1d2c2: 0x6cd09620, 0x1d2c3: 0x6cf07e20, + 0x1d2c4: 0x6d391220, 0x1d2c5: 0x6c2e7820, 0x1d2c6: 0x6c282c20, 0x1d2c7: 0x6c3a9020, + 0x1d2c8: 0x6c037220, 0x1d2c9: 0x6c0ec820, 0x1d2ca: 0x6cc17c20, 0x1d2cb: 0x6ce49420, + 0x1d2cc: 0x6c06f220, 0x1d2cd: 0x6c484a20, 0x1d2ce: 0x6cdf0420, 0x1d2cf: 0x6d3ef220, + 0x1d2d0: 0x6c7a3220, 0x1d2d1: 0x6d33b420, 0x1d2d2: 0x6ca68820, 0x1d2d3: 0x6cb28a20, + 0x1d2d4: 0x6d3f5420, 0x1d2d5: 0x6c3f4c20, 0x1d2d6: 0x6cad2a20, 0x1d2d7: 0x6d313020, + 0x1d2d8: 0x6cfb3820, 0x1d2d9: 0x6d428820, 0x1d2da: 0x6cadb820, 0x1d2db: 0x6c640820, + 0x1d2dc: 0x6cd15620, 0x1d2dd: 0x6d33b620, 0x1d2de: 0x6c05ac20, 0x1d2df: 0x6ca23620, + 0x1d2e0: 0x6cc0ee20, 0x1d2e1: 0x6c552e20, 0x1d2e2: 0x6c77ea20, 0x1d2e3: 0x6c1b8620, + 0x1d2e4: 0x6d1b4020, 0x1d2e5: 0x6d057a20, 0x1d2e6: 0x6d0f5220, 0x1d2e7: 0x6c8f7a20, + 0x1d2e8: 0x6c306620, 0x1d2e9: 0x6c761c20, 0x1d2ea: 0x6c914620, 0x1d2eb: 0x6c6e5c20, + 0x1d2ec: 0x6caa5820, 0x1d2ed: 0x6d0bea20, 0x1d2ee: 0x6cacd020, 0x1d2ef: 0x6c7ae820, + 0x1d2f0: 0x6d14d620, 0x1d2f1: 0x6c49e820, 0x1d2f2: 0x6c4d3e20, 0x1d2f3: 0x6c438220, + 0x1d2f4: 0x6c307020, 0x1d2f5: 0x6c1aa220, 0x1d2f6: 0x6c683e20, 0x1d2f7: 0x6d046420, + 0x1d2f8: 0x6d046620, 0x1d2f9: 0x6c374c20, 0x1d2fa: 0x6c01b020, 0x1d2fb: 0x6c526020, + 0x1d2fc: 0x6cb10a20, 0x1d2fd: 0x6ca5a420, 0x1d2fe: 0x6d3f5620, 0x1d2ff: 0x6c4a4c20, + // Block 0x74c, offset 0x1d300 + 0x1d300: 0x6c19e220, 0x1d301: 0x6ce5c020, 0x1d302: 0x6d33ce20, 0x1d303: 0x6c252c20, + 0x1d304: 0x6c99e620, 0x1d305: 0x6d009220, 0x1d306: 0x6c252e20, 0x1d307: 0x6d009420, + 0x1d308: 0x6c972e20, 0x1d309: 0x6c972a20, 0x1d30a: 0x6c600420, 0x1d30b: 0x6d029e20, + 0x1d30c: 0x6ca8f020, 0x1d30d: 0x6c7b2020, 0x1d30e: 0x6cc97220, 0x1d30f: 0x6d2a0420, + 0x1d310: 0x6cb5aa20, 0x1d311: 0x6ca4e820, 0x1d312: 0x6c9cec20, 0x1d313: 0x6ca9b820, + 0x1d314: 0x6c943a20, 0x1d315: 0x6ced7c20, 0x1d316: 0x6c0ef420, 0x1d317: 0x6cf1d820, + 0x1d318: 0x6ced0e20, 0x1d319: 0x6d04d020, 0x1d31a: 0x6c68ea20, 0x1d31b: 0x6c6e7a20, + 0x1d31c: 0x6d1fc420, 0x1d31d: 0x6c524e20, 0x1d31e: 0x6c260820, 0x1d31f: 0x6c8b0820, + 0x1d320: 0x6cccdc20, 0x1d321: 0x6ce6c420, 0x1d322: 0x6c99f020, 0x1d323: 0x6c214420, + 0x1d324: 0x6cd0a220, 0x1d325: 0x6cba0420, 0x1d326: 0x6c2a9220, 0x1d327: 0x6c72ee20, + 0x1d328: 0x6c243820, 0x1d329: 0x6d04cc20, 0x1d32a: 0x6d032e20, 0x1d32b: 0x6ceac220, + 0x1d32c: 0x6cad3820, 0x1d32d: 0x6c19f220, 0x1d32e: 0x6ca56c20, 0x1d32f: 0x6cb43620, + 0x1d330: 0x6c311420, 0x1d331: 0x6ceac420, 0x1d332: 0x6ca7d620, 0x1d333: 0x6ca53e20, + 0x1d334: 0x6cb05a20, 0x1d335: 0x6c478220, 0x1d336: 0x6c954020, 0x1d337: 0x6c85fc20, + 0x1d338: 0x6c88b820, 0x1d339: 0x6d2f3020, 0x1d33a: 0x6c254020, 0x1d33b: 0x6c6a1c20, + 0x1d33c: 0x6c899420, 0x1d33d: 0x6cd6fc20, 0x1d33e: 0x6caff420, 0x1d33f: 0x6c0bfe20, + // Block 0x74d, offset 0x1d340 + 0x1d340: 0x6c94fc20, 0x1d341: 0x6cb11020, 0x1d342: 0x6c82c420, 0x1d343: 0x6c7cfe20, + 0x1d344: 0x6c20d620, 0x1d345: 0x6c288c20, 0x1d346: 0x6ce4fa20, 0x1d347: 0x6ca57020, + 0x1d348: 0x6c6dbc20, 0x1d349: 0x6ca37a20, 0x1d34a: 0x6c7e7820, 0x1d34b: 0x6d12f420, + 0x1d34c: 0x6d0c0e20, 0x1d34d: 0x6cc5f420, 0x1d34e: 0x6cd0a420, 0x1d34f: 0x6c21c220, + 0x1d350: 0x6c3f7820, 0x1d351: 0x6c3f6a20, 0x1d352: 0x6c709620, 0x1d353: 0x6c3a3620, + 0x1d354: 0x6cbabc20, 0x1d355: 0x6ced8820, 0x1d356: 0x6c307c20, 0x1d357: 0x6caff620, + 0x1d358: 0x6c4c6e20, 0x1d359: 0x6d3f9220, 0x1d35a: 0x6c2fa820, 0x1d35b: 0x6cf2fe20, + 0x1d35c: 0x6c9a6020, 0x1d35d: 0x6ca5f420, 0x1d35e: 0x6d3bd020, 0x1d35f: 0x6c1c3420, + 0x1d360: 0x6c23f020, 0x1d361: 0x6c954820, 0x1d362: 0x6cab8020, 0x1d363: 0x6c2c6e20, + 0x1d364: 0x6c013c20, 0x1d365: 0x6d038220, 0x1d366: 0x6ca50420, 0x1d367: 0x6cd5ea20, + 0x1d368: 0x6cd69220, 0x1d369: 0x6ca42e20, 0x1d36a: 0x6d283c20, 0x1d36b: 0x6d380020, + 0x1d36c: 0x6cc78620, 0x1d36d: 0x6c366020, 0x1d36e: 0x6cc9ca20, 0x1d36f: 0x6ce8c820, + 0x1d370: 0x6d10ae20, 0x1d371: 0x6c669220, 0x1d372: 0x6cefe620, 0x1d373: 0x6c690e20, + 0x1d374: 0x6d213220, 0x1d375: 0x6c637220, 0x1d376: 0x6c32d020, 0x1d377: 0x6c09d820, + 0x1d378: 0x6c16b220, 0x1d379: 0x6c401220, 0x1d37a: 0x6cfcde20, 0x1d37b: 0x6ca6b020, + 0x1d37c: 0x6c9e2e20, 0x1d37d: 0x6cec3820, 0x1d37e: 0x6ce2a220, 0x1d37f: 0x6ce9e620, + // Block 0x74e, offset 0x1d380 + 0x1d380: 0x6c055620, 0x1d381: 0x6cba1820, 0x1d382: 0x6c93a820, 0x1d383: 0x6cec3a20, + 0x1d384: 0x6cda3e20, 0x1d385: 0x6ce11c20, 0x1d386: 0x6cdaee20, 0x1d387: 0x6d3c9820, + 0x1d388: 0x6c441420, 0x1d389: 0x6d183220, 0x1d38a: 0x6c100a20, 0x1d38b: 0x6c89fa20, + 0x1d38c: 0x6c607220, 0x1d38d: 0x6cb00a20, 0x1d38e: 0x6d00d020, 0x1d38f: 0x6c42d020, + 0x1d390: 0x6c93b420, 0x1d391: 0x6c0d8420, 0x1d392: 0x6cab6c20, 0x1d393: 0x6c16c220, + 0x1d394: 0x6c92ae20, 0x1d395: 0x6c4c8220, 0x1d396: 0x6cace020, 0x1d397: 0x6c1fbc20, + 0x1d398: 0x6c0c1a20, 0x1d399: 0x6c67c020, 0x1d39a: 0x6c3d9220, 0x1d39b: 0x6ce12c20, + 0x1d39c: 0x6ca06e20, 0x1d39d: 0x6cf6ac20, 0x1d39e: 0x6d3b8e20, 0x1d39f: 0x6c93f820, + 0x1d3a0: 0x6c686e20, 0x1d3a1: 0x6d1d4420, 0x1d3a2: 0x6c936220, 0x1d3a3: 0x6d36be20, + 0x1d3a4: 0x6d098620, 0x1d3a5: 0x6c211e20, 0x1d3a6: 0x6c8c6620, 0x1d3a7: 0x6ce78e20, + 0x1d3a8: 0x6caec820, 0x1d3a9: 0x6ca6cc20, 0x1d3aa: 0x6c1fcc20, 0x1d3ab: 0x6c8a1e20, + 0x1d3ac: 0x6c256620, 0x1d3ad: 0x6c4a8e20, 0x1d3ae: 0x6cff1620, 0x1d3af: 0x6ce29020, + 0x1d3b0: 0x6c38c220, 0x1d3b1: 0x6d349a20, 0x1d3b2: 0x6c688020, 0x1d3b3: 0x6ccdb420, + 0x1d3b4: 0x6c550420, 0x1d3b5: 0x6c255c20, 0x1d3b6: 0x6cc90a20, 0x1d3b7: 0x6cfd8a20, + 0x1d3b8: 0x6cdc1020, 0x1d3b9: 0x6c3bf020, 0x1d3ba: 0x6d1c0020, 0x1d3bb: 0x6ccd1620, + 0x1d3bc: 0x6d3b5c20, 0x1d3bd: 0x6c284c20, 0x1d3be: 0x6c7b4020, 0x1d3bf: 0x6ca9d220, + // Block 0x74f, offset 0x1d3c0 + 0x1d3c0: 0x6cea7020, 0x1d3c1: 0x6c886a20, 0x1d3c2: 0x6c0a7620, 0x1d3c3: 0x6d1dc020, + 0x1d3c4: 0x6c74cc20, 0x1d3c5: 0x6c1f8020, 0x1d3c6: 0x6d18d420, 0x1d3c7: 0x6c732c20, + 0x1d3c8: 0x6c7e9820, 0x1d3c9: 0x6c88ce20, 0x1d3ca: 0x6ccac420, 0x1d3cb: 0x6cea7420, + 0x1d3cc: 0x6c47da20, 0x1d3cd: 0x6cb67820, 0x1d3ce: 0x6c257c20, 0x1d3cf: 0x6c0d8e20, + 0x1d3d0: 0x6d09bc20, 0x1d3d1: 0x6ca53a20, 0x1d3d2: 0x6cf32020, 0x1d3d3: 0x6d2a0e20, + 0x1d3d4: 0x6cfd3420, 0x1d3d5: 0x6c0c4420, 0x1d3d6: 0x6d044020, 0x1d3d7: 0x6c7b5c20, + 0x1d3d8: 0x6c7eaa20, 0x1d3d9: 0x6d0c4220, 0x1d3da: 0x6c918820, 0x1d3db: 0x6c5e4220, + 0x1d3dc: 0x6d28a020, 0x1d3dd: 0x6c95cc20, 0x1d3de: 0x6cc21020, 0x1d3df: 0x6d2a1020, + 0x1d3e0: 0x6c946c20, 0x1d3e1: 0x6ca61e20, 0x1d3e2: 0x6d28aa20, 0x1d3e3: 0x6c189420, + 0x1d3e4: 0x6cb8b620, 0x1d3e5: 0x6cf2da20, 0x1d3e6: 0x6c4a2420, 0x1d3e7: 0x6d29e220, + 0x1d3e8: 0x6c8bea20, 0x1d3e9: 0x6c4a0e20, 0x1d3ea: 0x6d3f2a20, 0x1d3eb: 0x6c68c420, + 0x1d3ec: 0x6ca80e20, 0x1d3ed: 0x6c1e4020, 0x1d3ee: 0x6c620c20, 0x1d3ef: 0x6c42c820, + 0x1d3f0: 0x6c1e4420, 0x1d3f1: 0x6c9dce20, 0x1d3f2: 0x6ca87420, 0x1d3f3: 0x6d357020, + 0x1d3f4: 0x6d35c620, 0x1d3f5: 0x6c43f220, 0x1d3f6: 0x6c669420, 0x1d3f7: 0x6c2eb220, + 0x1d3f8: 0x6d33e420, 0x1d3f9: 0x6d04d820, 0x1d3fa: 0x6cdf3220, 0x1d3fb: 0x6d319820, + 0x1d3fc: 0x6c6fd020, 0x1d3fd: 0x6cfc8420, 0x1d3fe: 0x6d20ca20, 0x1d3ff: 0x6c138620, + // Block 0x750, offset 0x1d400 + 0x1d400: 0x6d11a420, 0x1d401: 0x6d20e820, 0x1d402: 0x6c1cc220, 0x1d403: 0x6cf89020, + 0x1d404: 0x6cf89220, 0x1d405: 0x6c700620, 0x1d406: 0x6d217a20, 0x1d407: 0x6d227220, + 0x1d408: 0x6d043820, 0x1d409: 0x6c71d420, 0x1d40a: 0x6c702a20, 0x1d40b: 0x6d035820, + 0x1d40c: 0x6ccf0620, 0x1d40d: 0x6ccf2820, 0x1d40e: 0x6ccf9620, 0x1d40f: 0x6c6fb220, + 0x1d410: 0x6cd36020, 0x1d411: 0x6cdfa420, 0x1d412: 0x6cd4e220, 0x1d413: 0x6cd3b620, + 0x1d414: 0x6ce50820, 0x1d415: 0x6ce0a420, 0x1d416: 0x6cb4b020, 0x1d417: 0x6cb4b220, + 0x1d418: 0x6c496420, 0x1d419: 0x6c57cc20, 0x1d41a: 0x6ce54020, 0x1d41b: 0x6c201620, + 0x1d41c: 0x6cd75220, 0x1d41d: 0x6cf9d820, 0x1d41e: 0x6cf45e20, 0x1d41f: 0x6d385220, + 0x1d420: 0x6c29be20, 0x1d421: 0x6c1ff420, 0x1d422: 0x6cccd620, 0x1d423: 0x6d15d420, + 0x1d424: 0x6c397c20, 0x1d425: 0x6cabc020, 0x1d426: 0x6cdf6a20, 0x1d427: 0x6c389420, + 0x1d428: 0x6c04c820, 0x1d429: 0x6c1ff620, 0x1d42a: 0x6c4f6c20, 0x1d42b: 0x6c39d420, + 0x1d42c: 0x6c047a20, 0x1d42d: 0x6c08d420, 0x1d42e: 0x6c934820, 0x1d42f: 0x6d37b020, + 0x1d430: 0x6c667220, 0x1d431: 0x6c122a20, 0x1d432: 0x6c8cfc20, 0x1d433: 0x6d3a1020, + 0x1d434: 0x6d2ac620, 0x1d435: 0x6c34f220, 0x1d436: 0x6c0ef620, 0x1d437: 0x6cfb5020, + 0x1d438: 0x6c447620, 0x1d439: 0x6c1ff820, 0x1d43a: 0x6cf9b420, 0x1d43b: 0x6c914e20, + 0x1d43c: 0x6cbf2e20, 0x1d43d: 0x6cacfc20, 0x1d43e: 0x6cf62a20, 0x1d43f: 0x6c7af420, + // Block 0x751, offset 0x1d440 + 0x1d440: 0x6c3ea420, 0x1d441: 0x6d2a8620, 0x1d442: 0x6c3cb220, 0x1d443: 0x6c83f220, + 0x1d444: 0x6cce7820, 0x1d445: 0x6d216420, 0x1d446: 0x6c80d220, 0x1d447: 0x6ce6ce20, + 0x1d448: 0x6d237820, 0x1d449: 0x6cefe820, 0x1d44a: 0x6c0f3220, 0x1d44b: 0x6c9be020, + 0x1d44c: 0x6ca76c20, 0x1d44d: 0x6c70b420, 0x1d44e: 0x6c59f420, 0x1d44f: 0x6cd44a20, + 0x1d450: 0x6c78d020, 0x1d451: 0x6c0bb820, 0x1d452: 0x6ca2a620, 0x1d453: 0x6c2ede20, + 0x1d454: 0x6c315c20, 0x1d455: 0x6c059020, 0x1d456: 0x6c13ae20, 0x1d457: 0x6d18b220, + 0x1d458: 0x6cd9d820, 0x1d459: 0x6c123a20, 0x1d45a: 0x6c129c20, 0x1d45b: 0x6c90c020, + 0x1d45c: 0x6c279820, 0x1d45d: 0x6d098a20, 0x1d45e: 0x6d123420, 0x1d45f: 0x6c1cee20, + 0x1d460: 0x6c2b0820, 0x1d461: 0x6c291c20, 0x1d462: 0x6cbb2c20, 0x1d463: 0x6c91f620, + 0x1d464: 0x6d162220, 0x1d465: 0x6c60e020, 0x1d466: 0x6c670e20, 0x1d467: 0x6c5e3020, + 0x1d468: 0x6c9b8620, 0x1d469: 0x6cb69820, 0x1d46a: 0x6c91fe20, 0x1d46b: 0x6c919a20, + 0x1d46c: 0x6c157220, 0x1d46d: 0x6cd6c020, 0x1d46e: 0x6c449e20, 0x1d46f: 0x6c894620, + 0x1d470: 0x6c647220, 0x1d471: 0x6c650020, 0x1d472: 0x6ccb1420, 0x1d473: 0x6d0e5420, + 0x1d474: 0x6c3e6820, 0x1d475: 0x6cb25a20, 0x1d476: 0x6d0eea20, 0x1d477: 0x6d0f1c20, + 0x1d478: 0x6c12aa20, 0x1d479: 0x6c12c020, 0x1d47a: 0x6d164220, 0x1d47b: 0x6c821220, + 0x1d47c: 0x6ce62820, 0x1d47d: 0x6c681e20, 0x1d47e: 0x6c008420, 0x1d47f: 0x6ca39020, + // Block 0x752, offset 0x1d480 + 0x1d480: 0x6ce56820, 0x1d481: 0x6c682020, 0x1d482: 0x6c6a5a20, 0x1d483: 0x6cae8c20, + 0x1d484: 0x6cecbe20, 0x1d485: 0x6d167020, 0x1d486: 0x6c145e20, 0x1d487: 0x6c9db820, + 0x1d488: 0x6c9cd820, 0x1d489: 0x6c416220, 0x1d48a: 0x6cb89e20, 0x1d48b: 0x6d22c820, + 0x1d48c: 0x6d22ca20, 0x1d48d: 0x6cce9620, 0x1d48e: 0x6cbeee20, 0x1d48f: 0x6c323020, + 0x1d490: 0x6c564c20, 0x1d491: 0x6cb6ce20, 0x1d492: 0x6c982c20, 0x1d493: 0x6d3f2e20, + 0x1d494: 0x6c5ba020, 0x1d495: 0x6cdbaa20, 0x1d496: 0x6d357220, 0x1d497: 0x6cfd6020, + 0x1d498: 0x6cafb020, 0x1d499: 0x6c3ddc20, 0x1d49a: 0x6cea4220, 0x1d49b: 0x6cef8a20, + 0x1d49c: 0x6cf3a820, 0x1d49d: 0x6d338420, 0x1d49e: 0x6cb73e20, 0x1d49f: 0x6cccbe20, + 0x1d4a0: 0x6cf18020, 0x1d4a1: 0x6cba3e20, 0x1d4a2: 0x6cc56e20, 0x1d4a3: 0x6c3dde20, + 0x1d4a4: 0x6c79b620, 0x1d4a5: 0x6c6bba20, 0x1d4a6: 0x6c913620, 0x1d4a7: 0x6d067420, + 0x1d4a8: 0x6c5e8220, 0x1d4a9: 0x6cbd5420, 0x1d4aa: 0x6cb57620, 0x1d4ab: 0x6d0c5a20, + 0x1d4ac: 0x6c3b1420, 0x1d4ad: 0x6c032020, 0x1d4ae: 0x6cc8c020, 0x1d4af: 0x6d02ac20, + 0x1d4b0: 0x6c618a20, 0x1d4b1: 0x6c570620, 0x1d4b2: 0x6c570820, 0x1d4b3: 0x6c398620, + 0x1d4b4: 0x6cf4ae20, 0x1d4b5: 0x6c73e420, 0x1d4b6: 0x6c466c20, 0x1d4b7: 0x6d34ee20, + 0x1d4b8: 0x6d278420, 0x1d4b9: 0x6cbd5620, 0x1d4ba: 0x6c029e20, 0x1d4bb: 0x6c1e7820, + 0x1d4bc: 0x6c994620, 0x1d4bd: 0x6d0b1420, 0x1d4be: 0x6c3a8020, 0x1d4bf: 0x6cc63220, + // Block 0x753, offset 0x1d4c0 + 0x1d4c0: 0x6c4f5a20, 0x1d4c1: 0x6c22fc20, 0x1d4c2: 0x6d1a2a20, 0x1d4c3: 0x6d1fa220, + 0x1d4c4: 0x6c0b7420, 0x1d4c5: 0x6d169a20, 0x1d4c6: 0x6cbd1020, 0x1d4c7: 0x6cef8c20, + 0x1d4c8: 0x6c858420, 0x1d4c9: 0x6cb05420, 0x1d4ca: 0x6c35d420, 0x1d4cb: 0x6cfc7c20, + 0x1d4cc: 0x6c169a20, 0x1d4cd: 0x6c122420, 0x1d4ce: 0x6d3aa620, 0x1d4cf: 0x6cda4820, + 0x1d4d0: 0x6ce30e20, 0x1d4d1: 0x6d260220, 0x1d4d2: 0x6cc4ae20, 0x1d4d3: 0x6c8cb020, + 0x1d4d4: 0x6cdf1a20, 0x1d4d5: 0x6cce9820, 0x1d4d6: 0x6c2b5c20, 0x1d4d7: 0x6c9e6e20, + 0x1d4d8: 0x6cbe9c20, 0x1d4d9: 0x6c859620, 0x1d4da: 0x6d1e7220, 0x1d4db: 0x6c77d820, + 0x1d4dc: 0x6ca27220, 0x1d4dd: 0x6c06ee20, 0x1d4de: 0x6c05a820, 0x1d4df: 0x6c467220, + 0x1d4e0: 0x6c9f3420, 0x1d4e1: 0x6d15c420, 0x1d4e2: 0x6d15ca20, 0x1d4e3: 0x6c720020, + 0x1d4e4: 0x6cb1de20, 0x1d4e5: 0x6cc91420, 0x1d4e6: 0x6c7a7620, 0x1d4e7: 0x6ca8fa20, + 0x1d4e8: 0x6ca62c20, 0x1d4e9: 0x6c0ebc20, 0x1d4ea: 0x6c0dc820, 0x1d4eb: 0x6cccc620, + 0x1d4ec: 0x6d051a20, 0x1d4ed: 0x6d119220, 0x1d4ee: 0x6cfa8420, 0x1d4ef: 0x6c079620, + 0x1d4f0: 0x6c530620, 0x1d4f1: 0x6d1ba220, 0x1d4f2: 0x6d2c7420, 0x1d4f3: 0x6c2fe220, + 0x1d4f4: 0x6c706020, 0x1d4f5: 0x6c2e6220, 0x1d4f6: 0x6ca7de20, 0x1d4f7: 0x6c417e20, + 0x1d4f8: 0x6c54a820, 0x1d4f9: 0x6cb27c20, 0x1d4fa: 0x6c99dc20, 0x1d4fb: 0x6c3e0220, + 0x1d4fc: 0x6cd0e820, 0x1d4fd: 0x6c46f620, 0x1d4fe: 0x6c093e20, 0x1d4ff: 0x6cf07620, + // Block 0x754, offset 0x1d500 + 0x1d500: 0x6c3e0420, 0x1d501: 0x6d3d2e20, 0x1d502: 0x6c994c20, 0x1d503: 0x6c393220, + 0x1d504: 0x6c633020, 0x1d505: 0x6c98cc20, 0x1d506: 0x6c98ce20, 0x1d507: 0x6c036a20, + 0x1d508: 0x6c223220, 0x1d509: 0x6ca0d620, 0x1d50a: 0x6d3e0620, 0x1d50b: 0x6c2be020, + 0x1d50c: 0x6c1b0a20, 0x1d50d: 0x6c61b220, 0x1d50e: 0x6c6d9420, 0x1d50f: 0x6c8f6e20, + 0x1d510: 0x6c23e220, 0x1d511: 0x6ca78e20, 0x1d512: 0x6d256c20, 0x1d513: 0x6d08fe20, + 0x1d514: 0x6d1c5a20, 0x1d515: 0x6cbf0020, 0x1d516: 0x6c43cc20, 0x1d517: 0x6c9ff020, + 0x1d518: 0x6c85ae20, 0x1d519: 0x6cc65c20, 0x1d51a: 0x6d1b3c20, 0x1d51b: 0x6c44b020, + 0x1d51c: 0x6cba4420, 0x1d51d: 0x6c148e20, 0x1d51e: 0x6c18aa20, 0x1d51f: 0x6d22e820, + 0x1d520: 0x6c4fa220, 0x1d521: 0x6d3f3420, 0x1d522: 0x6c8adc20, 0x1d523: 0x6cf3bc20, + 0x1d524: 0x6c61b420, 0x1d525: 0x6c4a4020, 0x1d526: 0x6c22bc20, 0x1d527: 0x6c657620, + 0x1d528: 0x6c223420, 0x1d529: 0x6c469e20, 0x1d52a: 0x6c49e220, 0x1d52b: 0x6c984420, + 0x1d52c: 0x6c13ce20, 0x1d52d: 0x6c683620, 0x1d52e: 0x6c683820, 0x1d52f: 0x6c3e2420, + 0x1d530: 0x6d20ea20, 0x1d531: 0x6d398e20, 0x1d532: 0x6d3e1420, 0x1d533: 0x6c675220, + 0x1d534: 0x6c5b2820, 0x1d535: 0x6d19b620, 0x1d536: 0x6c13d020, 0x1d537: 0x6c380820, + 0x1d538: 0x6cc64e20, 0x1d539: 0x6cc79420, 0x1d53a: 0x6c1cb620, 0x1d53b: 0x6c989220, + 0x1d53c: 0x6ce72c20, 0x1d53d: 0x6d381c20, 0x1d53e: 0x6cb8ac20, 0x1d53f: 0x6d3a0220, + // Block 0x755, offset 0x1d540 + 0x1d540: 0x6d09f220, 0x1d541: 0x6c586820, 0x1d542: 0x6c3d5420, 0x1d543: 0x6cc2c620, + 0x1d544: 0x6c40ea20, 0x1d545: 0x6c264620, 0x1d546: 0x6c6d9a20, 0x1d547: 0x6d041c20, + 0x1d548: 0x6c201c20, 0x1d549: 0x6c12ac20, 0x1d54a: 0x6c6d9c20, 0x1d54b: 0x6c374820, + 0x1d54c: 0x6c01a820, 0x1d54d: 0x6cbbd420, 0x1d54e: 0x6c1b1220, 0x1d54f: 0x6cc58c20, + 0x1d550: 0x6c666020, 0x1d551: 0x6ce31220, 0x1d552: 0x6c598420, 0x1d553: 0x6cb28e20, + 0x1d554: 0x6c85b020, 0x1d555: 0x6c6c3620, 0x1d556: 0x6c81aa20, 0x1d557: 0x6cd5b620, + 0x1d558: 0x6d3c0e20, 0x1d559: 0x6c268c20, 0x1d55a: 0x6c63a820, 0x1d55b: 0x6cc52220, + 0x1d55c: 0x6c095620, 0x1d55d: 0x6d2ab420, 0x1d55e: 0x6cbbd620, 0x1d55f: 0x6c5ba220, + 0x1d560: 0x6c61b620, 0x1d561: 0x6c295c20, 0x1d562: 0x6d24c020, 0x1d563: 0x6cc65e20, + 0x1d564: 0x6c5cb620, 0x1d565: 0x6d03d420, 0x1d566: 0x6c95ec20, 0x1d567: 0x6d1c5e20, + 0x1d568: 0x6d09f420, 0x1d569: 0x6c6ce420, 0x1d56a: 0x6cdcce20, 0x1d56b: 0x6d19b820, + 0x1d56c: 0x6c971220, 0x1d56d: 0x6c532020, 0x1d56e: 0x6d391420, 0x1d56f: 0x6d11f620, + 0x1d570: 0x6c324c20, 0x1d571: 0x6cefa420, 0x1d572: 0x6c83b020, 0x1d573: 0x6c310820, + 0x1d574: 0x6c3d6020, 0x1d575: 0x6cc59220, 0x1d576: 0x6d1a4c20, 0x1d577: 0x6c50fc20, + 0x1d578: 0x6c08a020, 0x1d579: 0x6c108820, 0x1d57a: 0x6d27e220, 0x1d57b: 0x6c2b6620, + 0x1d57c: 0x6ce89820, 0x1d57d: 0x6cdbba20, 0x1d57e: 0x6cdbbc20, 0x1d57f: 0x6c19d020, + // Block 0x756, offset 0x1d580 + 0x1d580: 0x6c18b420, 0x1d581: 0x6cf3be20, 0x1d582: 0x6c0ce420, 0x1d583: 0x6cf5d020, + 0x1d584: 0x6c450420, 0x1d585: 0x6c85de20, 0x1d586: 0x6cb43420, 0x1d587: 0x6d3ae020, + 0x1d588: 0x6ca10020, 0x1d589: 0x6c85e020, 0x1d58a: 0x6d3c1420, 0x1d58b: 0x6d423420, + 0x1d58c: 0x6ceab820, 0x1d58d: 0x6cc03820, 0x1d58e: 0x6ccbe420, 0x1d58f: 0x6cdd1220, + 0x1d590: 0x6c18b620, 0x1d591: 0x6cae9620, 0x1d592: 0x6c71ae20, 0x1d593: 0x6c99e820, + 0x1d594: 0x6c9b1220, 0x1d595: 0x6d042420, 0x1d596: 0x6c6da220, 0x1d597: 0x6c17d820, + 0x1d598: 0x6ccfd420, 0x1d599: 0x6c756820, 0x1d59a: 0x6d0c7a20, 0x1d59b: 0x6ce66620, + 0x1d59c: 0x6d1f2020, 0x1d59d: 0x6c261e20, 0x1d59e: 0x6c494c20, 0x1d59f: 0x6c4ea020, + 0x1d5a0: 0x6d1fbe20, 0x1d5a1: 0x6c262020, 0x1d5a2: 0x6c63b420, 0x1d5a3: 0x6cede220, + 0x1d5a4: 0x6cda9620, 0x1d5a5: 0x6ca99220, 0x1d5a6: 0x6cce6420, 0x1d5a7: 0x6cfcac20, + 0x1d5a8: 0x6c811a20, 0x1d5a9: 0x6c3e4020, 0x1d5aa: 0x6c355a20, 0x1d5ab: 0x6ca10220, + 0x1d5ac: 0x6cf20420, 0x1d5ad: 0x6c6aa820, 0x1d5ae: 0x6ca3f420, 0x1d5af: 0x6ca27c20, + 0x1d5b0: 0x6c76c820, 0x1d5b1: 0x6c7eee20, 0x1d5b2: 0x6c87f820, 0x1d5b3: 0x6cd26020, + 0x1d5b4: 0x6cf28220, 0x1d5b5: 0x6ce93020, 0x1d5b6: 0x6cfa9620, 0x1d5b7: 0x6c5db220, + 0x1d5b8: 0x6d1f2220, 0x1d5b9: 0x6d1c6020, 0x1d5ba: 0x6d1ba820, 0x1d5bb: 0x6c461e20, + 0x1d5bc: 0x6c213e20, 0x1d5bd: 0x6c988a20, 0x1d5be: 0x6c988c20, 0x1d5bf: 0x6c22c220, + // Block 0x757, offset 0x1d5c0 + 0x1d5c0: 0x6ced1020, 0x1d5c1: 0x6c6db220, 0x1d5c2: 0x6c2c4e20, 0x1d5c3: 0x6cc18020, + 0x1d5c4: 0x6c2ffe20, 0x1d5c5: 0x6c648c20, 0x1d5c6: 0x6d405020, 0x1d5c7: 0x6c483a20, + 0x1d5c8: 0x6c7e4420, 0x1d5c9: 0x6c924820, 0x1d5ca: 0x6c711c20, 0x1d5cb: 0x6cf08620, + 0x1d5cc: 0x6c757020, 0x1d5cd: 0x6ca82220, 0x1d5ce: 0x6c7d5c20, 0x1d5cf: 0x6c511a20, + 0x1d5d0: 0x6cb43a20, 0x1d5d1: 0x6d290020, 0x1d5d2: 0x6c430420, 0x1d5d3: 0x6c4cbc20, + 0x1d5d4: 0x6c3e6c20, 0x1d5d5: 0x6c94f620, 0x1d5d6: 0x6c166a20, 0x1d5d7: 0x6c1daa20, + 0x1d5d8: 0x6cd91e20, 0x1d5d9: 0x6c20ca20, 0x1d5da: 0x6d2e5e20, 0x1d5db: 0x6c9acc20, + 0x1d5dc: 0x6c114420, 0x1d5dd: 0x6c037820, 0x1d5de: 0x6c83c820, 0x1d5df: 0x6ce8aa20, + 0x1d5e0: 0x6c0e7020, 0x1d5e1: 0x6c4eb620, 0x1d5e2: 0x6c064620, 0x1d5e3: 0x6cbe1220, + 0x1d5e4: 0x6c731e20, 0x1d5e5: 0x6cf60020, 0x1d5e6: 0x6cbd6a20, 0x1d5e7: 0x6c2bf220, + 0x1d5e8: 0x6c6a0420, 0x1d5e9: 0x6cb43820, 0x1d5ea: 0x6c296220, 0x1d5eb: 0x6c6c9020, + 0x1d5ec: 0x6cbbde20, 0x1d5ed: 0x6cdf2220, 0x1d5ee: 0x6c44c820, 0x1d5ef: 0x6c573420, + 0x1d5f0: 0x6c470c20, 0x1d5f1: 0x6c8cfe20, 0x1d5f2: 0x6c39fe20, 0x1d5f3: 0x6cbd7020, + 0x1d5f4: 0x6c012a20, 0x1d5f5: 0x6cee1620, 0x1d5f6: 0x6c081c20, 0x1d5f7: 0x6d38e220, + 0x1d5f8: 0x6d0c0020, 0x1d5f9: 0x6c709020, 0x1d5fa: 0x6c648e20, 0x1d5fb: 0x6c8c1e20, + 0x1d5fc: 0x6ce05c20, 0x1d5fd: 0x6cd4d420, 0x1d5fe: 0x6ce49e20, 0x1d5ff: 0x6c2a1420, + // Block 0x758, offset 0x1d600 + 0x1d600: 0x6c561c20, 0x1d601: 0x6cb5d020, 0x1d602: 0x6c511c20, 0x1d603: 0x6c253820, + 0x1d604: 0x6ce22420, 0x1d605: 0x6c210420, 0x1d606: 0x6c098a20, 0x1d607: 0x6c16aa20, + 0x1d608: 0x6c586e20, 0x1d609: 0x6c3aa620, 0x1d60a: 0x6c7f0020, 0x1d60b: 0x6cb4ee20, + 0x1d60c: 0x6c9b1420, 0x1d60d: 0x6cb2a020, 0x1d60e: 0x6cee7420, 0x1d60f: 0x6c288220, + 0x1d610: 0x6ccc4e20, 0x1d611: 0x6c587020, 0x1d612: 0x6d0d6e20, 0x1d613: 0x6d14ee20, + 0x1d614: 0x6ce58420, 0x1d615: 0x6cb5d220, 0x1d616: 0x6ced1220, 0x1d617: 0x6c12e220, + 0x1d618: 0x6ca3bc20, 0x1d619: 0x6d327c20, 0x1d61a: 0x6ceba420, 0x1d61b: 0x6c6f6c20, + 0x1d61c: 0x6ce5ee20, 0x1d61d: 0x6c954220, 0x1d61e: 0x6c0ae020, 0x1d61f: 0x6d199220, + 0x1d620: 0x6c9b1620, 0x1d621: 0x6c100820, 0x1d622: 0x6cada820, 0x1d623: 0x6c2fc620, + 0x1d624: 0x6d1c6420, 0x1d625: 0x6d1c6620, 0x1d626: 0x6d1c6820, 0x1d627: 0x6cfebc20, + 0x1d628: 0x6cc97420, 0x1d629: 0x6cbfb020, 0x1d62a: 0x6c77fc20, 0x1d62b: 0x6cfe3620, + 0x1d62c: 0x6ced8620, 0x1d62d: 0x6d226020, 0x1d62e: 0x6d213620, 0x1d62f: 0x6c3ffa20, + 0x1d630: 0x6c88fe20, 0x1d631: 0x6d07a220, 0x1d632: 0x6d07a420, 0x1d633: 0x6ca42a20, + 0x1d634: 0x6c12f620, 0x1d635: 0x6cf28e20, 0x1d636: 0x6c217a20, 0x1d637: 0x6cfece20, + 0x1d638: 0x6d210620, 0x1d639: 0x6c0b4020, 0x1d63a: 0x6c998420, 0x1d63b: 0x6c013420, + 0x1d63c: 0x6c364020, 0x1d63d: 0x6c960a20, 0x1d63e: 0x6d1c7820, 0x1d63f: 0x6c7dfc20, + // Block 0x759, offset 0x1d640 + 0x1d640: 0x6c7dfe20, 0x1d641: 0x6c676420, 0x1d642: 0x6c9e2a20, 0x1d643: 0x6d42a020, + 0x1d644: 0x6d42a220, 0x1d645: 0x6d409c20, 0x1d646: 0x6c060020, 0x1d647: 0x6cc74e20, + 0x1d648: 0x6cf7ec20, 0x1d649: 0x6d12f620, 0x1d64a: 0x6c013620, 0x1d64b: 0x6cc19420, + 0x1d64c: 0x6c64a820, 0x1d64d: 0x6c3e8e20, 0x1d64e: 0x6c93e420, 0x1d64f: 0x6c6dbe20, + 0x1d650: 0x6cae4220, 0x1d651: 0x6c3c5020, 0x1d652: 0x6c535220, 0x1d653: 0x6c535420, + 0x1d654: 0x6c540820, 0x1d655: 0x6d0e7a20, 0x1d656: 0x6ce86420, 0x1d657: 0x6d311420, + 0x1d658: 0x6d3e4620, 0x1d659: 0x6cfd7a20, 0x1d65a: 0x6cc5f620, 0x1d65b: 0x6c43f420, + 0x1d65c: 0x6cb82c20, 0x1d65d: 0x6cbe8020, 0x1d65e: 0x6c9cf820, 0x1d65f: 0x6c59c820, + 0x1d660: 0x6ccff220, 0x1d661: 0x6cb43c20, 0x1d662: 0x6c413820, 0x1d663: 0x6c303020, + 0x1d664: 0x6d392a20, 0x1d665: 0x6c669620, 0x1d666: 0x6cefcc20, 0x1d667: 0x6c0f0820, + 0x1d668: 0x6cee9220, 0x1d669: 0x6cabc620, 0x1d66a: 0x6c620e20, 0x1d66b: 0x6c556620, + 0x1d66c: 0x6d2a0820, 0x1d66d: 0x6c636220, 0x1d66e: 0x6c32c620, 0x1d66f: 0x6d120a20, + 0x1d670: 0x6cdbc420, 0x1d671: 0x6c231c20, 0x1d672: 0x6cc2fa20, 0x1d673: 0x6cee9420, + 0x1d674: 0x6d315820, 0x1d675: 0x6c7c7a20, 0x1d676: 0x6ce67820, 0x1d677: 0x6c5cd220, + 0x1d678: 0x6cf7ee20, 0x1d679: 0x6cd1c220, 0x1d67a: 0x6cb79a20, 0x1d67b: 0x6c7f9e20, + 0x1d67c: 0x6d3f9420, 0x1d67d: 0x6d10a820, 0x1d67e: 0x6d24f020, 0x1d67f: 0x6c9a0620, + // Block 0x75a, offset 0x1d680 + 0x1d680: 0x6d275220, 0x1d681: 0x6cd5c820, 0x1d682: 0x6c2c6220, 0x1d683: 0x6d3bc620, + 0x1d684: 0x6c491820, 0x1d685: 0x6cc4dc20, 0x1d686: 0x6d08e020, 0x1d687: 0x6c15b820, + 0x1d688: 0x6c765a20, 0x1d689: 0x6c7d0020, 0x1d68a: 0x6c571620, 0x1d68b: 0x6c67a820, + 0x1d68c: 0x6c908e20, 0x1d68d: 0x6cefce20, 0x1d68e: 0x6cac2a20, 0x1d68f: 0x6d206c20, + 0x1d690: 0x6cd9b620, 0x1d691: 0x6d1b6220, 0x1d692: 0x6cd1d420, 0x1d693: 0x6c215420, + 0x1d694: 0x6cd27620, 0x1d695: 0x6d275a20, 0x1d696: 0x6d317220, 0x1d697: 0x6c812220, + 0x1d698: 0x6cc7b420, 0x1d699: 0x6c9b2a20, 0x1d69a: 0x6c863a20, 0x1d69b: 0x6cc38e20, + 0x1d69c: 0x6cdb9c20, 0x1d69d: 0x6d258a20, 0x1d69e: 0x6c863c20, 0x1d69f: 0x6c71c420, + 0x1d6a0: 0x6cf65620, 0x1d6a1: 0x6c057e20, 0x1d6a2: 0x6c1e8220, 0x1d6a3: 0x6d062020, + 0x1d6a4: 0x6ce8cc20, 0x1d6a5: 0x6c8e7020, 0x1d6a6: 0x6c5de020, 0x1d6a7: 0x6c2d2220, + 0x1d6a8: 0x6cba5e20, 0x1d6a9: 0x6d409e20, 0x1d6aa: 0x6cb39820, 0x1d6ab: 0x6c25e420, + 0x1d6ac: 0x6d24fa20, 0x1d6ad: 0x6c1e9020, 0x1d6ae: 0x6d237a20, 0x1d6af: 0x6c7afe20, + 0x1d6b0: 0x6cac6220, 0x1d6b1: 0x6cb43e20, 0x1d6b2: 0x6cb44020, 0x1d6b3: 0x6ca35820, + 0x1d6b4: 0x6cd78820, 0x1d6b5: 0x6cf78820, 0x1d6b6: 0x6c3b7c20, 0x1d6b7: 0x6d27b820, + 0x1d6b8: 0x6d32d220, 0x1d6b9: 0x6c64c020, 0x1d6ba: 0x6c605e20, 0x1d6bb: 0x6cc92220, + 0x1d6bc: 0x6c123620, 0x1d6bd: 0x6c371820, 0x1d6be: 0x6c9c5820, 0x1d6bf: 0x6c4fa820, + // Block 0x75b, offset 0x1d6c0 + 0x1d6c0: 0x6cdcd820, 0x1d6c1: 0x6d317420, 0x1d6c2: 0x6ca00c20, 0x1d6c3: 0x6cd9b820, + 0x1d6c4: 0x6d06fe20, 0x1d6c5: 0x6c8e7220, 0x1d6c6: 0x6cf78a20, 0x1d6c7: 0x6c479220, + 0x1d6c8: 0x6c80c020, 0x1d6c9: 0x6cc68c20, 0x1d6ca: 0x6cf25420, 0x1d6cb: 0x6c414820, + 0x1d6cc: 0x6c263020, 0x1d6cd: 0x6cd1d620, 0x1d6ce: 0x6ce10820, 0x1d6cf: 0x6c95b620, + 0x1d6d0: 0x6cc82020, 0x1d6d1: 0x6cdd2820, 0x1d6d2: 0x6d07ae20, 0x1d6d3: 0x6c073620, + 0x1d6d4: 0x6d11ba20, 0x1d6d5: 0x6c4b5620, 0x1d6d6: 0x6c09da20, 0x1d6d7: 0x6d3ffc20, + 0x1d6d8: 0x6c4bd220, 0x1d6d9: 0x6d42ba20, 0x1d6da: 0x6ce58620, 0x1d6db: 0x6c12fe20, + 0x1d6dc: 0x6cae2e20, 0x1d6dd: 0x6c7fa420, 0x1d6de: 0x6c28b620, 0x1d6df: 0x6c622420, + 0x1d6e0: 0x6c83f420, 0x1d6e1: 0x6ccffa20, 0x1d6e2: 0x6c810620, 0x1d6e3: 0x6d237c20, + 0x1d6e4: 0x6c8e2e20, 0x1d6e5: 0x6d1c8420, 0x1d6e6: 0x6ca13020, 0x1d6e7: 0x6c2e3020, + 0x1d6e8: 0x6ce58e20, 0x1d6e9: 0x6c993c20, 0x1d6ea: 0x6ce6fa20, 0x1d6eb: 0x6c1f5a20, + 0x1d6ec: 0x6caeae20, 0x1d6ed: 0x6c014020, 0x1d6ee: 0x6c881820, 0x1d6ef: 0x6c233220, + 0x1d6f0: 0x6cf80220, 0x1d6f1: 0x6cb2ae20, 0x1d6f2: 0x6cbfb820, 0x1d6f3: 0x6c6ca620, + 0x1d6f4: 0x6c215820, 0x1d6f5: 0x6c6b1420, 0x1d6f6: 0x6cef2420, 0x1d6f7: 0x6ce99620, + 0x1d6f8: 0x6c128220, 0x1d6f9: 0x6d23ca20, 0x1d6fa: 0x6d183620, 0x1d6fb: 0x6d3ed220, + 0x1d6fc: 0x6c8a7220, 0x1d6fd: 0x6c09dc20, 0x1d6fe: 0x6c91ce20, 0x1d6ff: 0x6d077620, + // Block 0x75c, offset 0x1d700 + 0x1d700: 0x6c10a820, 0x1d701: 0x6d2ed020, 0x1d702: 0x6c824a20, 0x1d703: 0x6cbb1c20, + 0x1d704: 0x6c97f220, 0x1d705: 0x6d0cb820, 0x1d706: 0x6c8d3e20, 0x1d707: 0x6c621020, + 0x1d708: 0x6c0c0e20, 0x1d709: 0x6c4bde20, 0x1d70a: 0x6c4e5c20, 0x1d70b: 0x6c2b8220, + 0x1d70c: 0x6cdaf020, 0x1d70d: 0x6c929620, 0x1d70e: 0x6ccf6c20, 0x1d70f: 0x6cce1420, + 0x1d710: 0x6c2b8420, 0x1d711: 0x6c9ee420, 0x1d712: 0x6d09a220, 0x1d713: 0x6c97f420, + 0x1d714: 0x6c0f3420, 0x1d715: 0x6c2c8420, 0x1d716: 0x6c25ea20, 0x1d717: 0x6d311620, + 0x1d718: 0x6cd00a20, 0x1d719: 0x6d08a620, 0x1d71a: 0x6cf0b220, 0x1d71b: 0x6c558220, + 0x1d71c: 0x6c025620, 0x1d71d: 0x6c9cfc20, 0x1d71e: 0x6c90aa20, 0x1d71f: 0x6c244a20, + 0x1d720: 0x6d37c220, 0x1d721: 0x6c114820, 0x1d722: 0x6cb33220, 0x1d723: 0x6c67b220, + 0x1d724: 0x6c9d6e20, 0x1d725: 0x6c233420, 0x1d726: 0x6ca7a220, 0x1d727: 0x6c5c0220, + 0x1d728: 0x6c738620, 0x1d729: 0x6d1a8420, 0x1d72a: 0x6c66ac20, 0x1d72b: 0x6ca6f020, + 0x1d72c: 0x6cd50220, 0x1d72d: 0x6d19f020, 0x1d72e: 0x6c4c7e20, 0x1d72f: 0x6c18d620, + 0x1d730: 0x6c56bc20, 0x1d731: 0x6ccc0020, 0x1d732: 0x6c79fc20, 0x1d733: 0x6cba6e20, + 0x1d734: 0x6c966e20, 0x1d735: 0x6d29e420, 0x1d736: 0x6d2b5a20, 0x1d737: 0x6cbb1620, + 0x1d738: 0x6c30ba20, 0x1d739: 0x6c88c620, 0x1d73a: 0x6c8c5a20, 0x1d73b: 0x6c79fe20, + 0x1d73c: 0x6c007020, 0x1d73d: 0x6c0a0a20, 0x1d73e: 0x6c843220, 0x1d73f: 0x6cf00a20, + // Block 0x75d, offset 0x1d740 + 0x1d740: 0x6c609620, 0x1d741: 0x6cb9c420, 0x1d742: 0x6cd17620, 0x1d743: 0x6c385c20, + 0x1d744: 0x6c9b3c20, 0x1d745: 0x6cab9020, 0x1d746: 0x6c15dc20, 0x1d747: 0x6c2d2820, + 0x1d748: 0x6d0aa420, 0x1d749: 0x6c687020, 0x1d74a: 0x6cc8ac20, 0x1d74b: 0x6cc8ae20, + 0x1d74c: 0x6c82d420, 0x1d74d: 0x6d218e20, 0x1d74e: 0x6cbbf220, 0x1d74f: 0x6c1ea020, + 0x1d750: 0x6c575220, 0x1d751: 0x6c64e220, 0x1d752: 0x6c971a20, 0x1d753: 0x6d27c220, + 0x1d754: 0x6c05b820, 0x1d755: 0x6d1f6820, 0x1d756: 0x6cc1aa20, 0x1d757: 0x6c92da20, + 0x1d758: 0x6cc52a20, 0x1d759: 0x6c5c1e20, 0x1d75a: 0x6c369020, 0x1d75b: 0x6ce36a20, + 0x1d75c: 0x6c3a6a20, 0x1d75d: 0x6c749e20, 0x1d75e: 0x6d41c820, 0x1d75f: 0x6c384020, + 0x1d760: 0x6cc7c020, 0x1d761: 0x6c3b8e20, 0x1d762: 0x6c7d1620, 0x1d763: 0x6cd75820, + 0x1d764: 0x6cc8a220, 0x1d765: 0x6d0b5e20, 0x1d766: 0x6d05dc20, 0x1d767: 0x6c403c20, + 0x1d768: 0x6c74a020, 0x1d769: 0x6c298a20, 0x1d76a: 0x6cf3e420, 0x1d76b: 0x6c303a20, + 0x1d76c: 0x6cd82420, 0x1d76d: 0x6cff1820, 0x1d76e: 0x6cf8d020, 0x1d76f: 0x6c8fa020, + 0x1d770: 0x6cf16420, 0x1d771: 0x6ccee820, 0x1d772: 0x6cb64220, 0x1d773: 0x6c64e420, + 0x1d774: 0x6d284e20, 0x1d775: 0x6cdcde20, 0x1d776: 0x6c8d5a20, 0x1d777: 0x6d23f220, + 0x1d778: 0x6cf9ec20, 0x1d779: 0x6cf27220, 0x1d77a: 0x6c609820, 0x1d77b: 0x6c538820, + 0x1d77c: 0x6cd8ee20, 0x1d77d: 0x6ca9ca20, 0x1d77e: 0x6c82da20, 0x1d77f: 0x6d07ce20, + // Block 0x75e, offset 0x1d780 + 0x1d780: 0x6d285620, 0x1d781: 0x6d23cc20, 0x1d782: 0x6cf7a420, 0x1d783: 0x6c506e20, + 0x1d784: 0x6c05d620, 0x1d785: 0x6c4fae20, 0x1d786: 0x6c00d220, 0x1d787: 0x6ceeba20, + 0x1d788: 0x6c5c3c20, 0x1d789: 0x6c5c3e20, 0x1d78a: 0x6c628220, 0x1d78b: 0x6c226e20, + 0x1d78c: 0x6cfd8420, 0x1d78d: 0x6ced9a20, 0x1d78e: 0x6c9ee820, 0x1d78f: 0x6d18b420, + 0x1d790: 0x6c838820, 0x1d791: 0x6c677e20, 0x1d792: 0x6c120820, 0x1d793: 0x6cd01e20, + 0x1d794: 0x6cbb2620, 0x1d795: 0x6c885a20, 0x1d796: 0x6c781c20, 0x1d797: 0x6d25ae20, + 0x1d798: 0x6c26c020, 0x1d799: 0x6ce42220, 0x1d79a: 0x6ce0d420, 0x1d79b: 0x6d08e820, + 0x1d79c: 0x6c0a5c20, 0x1d79d: 0x6d2d9a20, 0x1d79e: 0x6cdce020, 0x1d79f: 0x6cfad820, + 0x1d7a0: 0x6c38c420, 0x1d7a1: 0x6c2f8220, 0x1d7a2: 0x6d021c20, 0x1d7a3: 0x6c47d220, + 0x1d7a4: 0x6d021e20, 0x1d7a5: 0x6cd56e20, 0x1d7a6: 0x6c66d420, 0x1d7a7: 0x6c4fb020, + 0x1d7a8: 0x6c52ca20, 0x1d7a9: 0x6cc99820, 0x1d7aa: 0x6d02f220, 0x1d7ab: 0x6d09aa20, + 0x1d7ac: 0x6d122420, 0x1d7ad: 0x6c046a20, 0x1d7ae: 0x6cda2c20, 0x1d7af: 0x6cd57020, + 0x1d7b0: 0x6d09b420, 0x1d7b1: 0x6c336a20, 0x1d7b2: 0x6cb21a20, 0x1d7b3: 0x6cf01820, + 0x1d7b4: 0x6ca92820, 0x1d7b5: 0x6c1df020, 0x1d7b6: 0x6c970420, 0x1d7b7: 0x6cc7d420, + 0x1d7b8: 0x6cb18620, 0x1d7b9: 0x6cdf4c20, 0x1d7ba: 0x6c62a020, 0x1d7bb: 0x6d2a5a20, + 0x1d7bc: 0x6c18f020, 0x1d7bd: 0x6d319a20, 0x1d7be: 0x6c37a820, 0x1d7bf: 0x6ca65420, + // Block 0x75f, offset 0x1d7c0 + 0x1d7c0: 0x6d1ca820, 0x1d7c1: 0x6c432620, 0x1d7c2: 0x6c23b820, 0x1d7c3: 0x6cff2420, + 0x1d7c4: 0x6cb66020, 0x1d7c5: 0x6c382820, 0x1d7c6: 0x6c65e420, 0x1d7c7: 0x6d073e20, + 0x1d7c8: 0x6c7ca620, 0x1d7c9: 0x6c60c620, 0x1d7ca: 0x6c0b5820, 0x1d7cb: 0x6c2e4620, + 0x1d7cc: 0x6c9d9420, 0x1d7cd: 0x6c7fc420, 0x1d7ce: 0x6c6d6420, 0x1d7cf: 0x6c124e20, + 0x1d7d0: 0x6c9ea020, 0x1d7d1: 0x6cbf6e20, 0x1d7d2: 0x6cbcec20, 0x1d7d3: 0x6cfc3420, + 0x1d7d4: 0x6c8a5420, 0x1d7d5: 0x6cab9820, 0x1d7d6: 0x6cfbb620, 0x1d7d7: 0x6cdb4020, + 0x1d7d8: 0x6c936a20, 0x1d7d9: 0x6d18f020, 0x1d7da: 0x6d075220, 0x1d7db: 0x6d014c20, + 0x1d7dc: 0x6c847220, 0x1d7dd: 0x6d18f220, 0x1d7de: 0x6c7e6620, 0x1d7df: 0x6c82f020, + 0x1d7e0: 0x6c69ca20, 0x1d7e1: 0x6c2b9a20, 0x1d7e2: 0x6d355a20, 0x1d7e3: 0x6c06bc20, + 0x1d7e4: 0x6ce2c220, 0x1d7e5: 0x6d123620, 0x1d7e6: 0x6ca17c20, 0x1d7e7: 0x6c595e20, + 0x1d7e8: 0x6c0c3e20, 0x1d7e9: 0x6c386820, 0x1d7ea: 0x6cda3220, 0x1d7eb: 0x6ce02e20, + 0x1d7ec: 0x6ce99a20, 0x1d7ed: 0x6cbf8020, 0x1d7ee: 0x6cbc0820, 0x1d7ef: 0x6cf0f620, + 0x1d7f0: 0x6c8ebc20, 0x1d7f1: 0x6c5c5c20, 0x1d7f2: 0x6cabac20, 0x1d7f3: 0x6c432c20, + 0x1d7f4: 0x6d286220, 0x1d7f5: 0x6c068a20, 0x1d7f6: 0x6c870a20, 0x1d7f7: 0x6cd57e20, + 0x1d7f8: 0x6c1ebe20, 0x1d7f9: 0x6c007e20, 0x1d7fa: 0x6c8c7a20, 0x1d7fb: 0x6d2a6020, + 0x1d7fc: 0x6d07e620, 0x1d7fd: 0x6cbe2820, 0x1d7fe: 0x6c7f7220, 0x1d7ff: 0x6c5e3220, + // Block 0x760, offset 0x1d800 + 0x1d800: 0x6cebb620, 0x1d801: 0x6cf54420, 0x1d802: 0x6cc8b820, 0x1d803: 0x6cc8ba20, + 0x1d804: 0x6cb68420, 0x1d805: 0x6c528020, 0x1d806: 0x6c917820, 0x1d807: 0x6cda6420, + 0x1d808: 0x6ce9d020, 0x1d809: 0x6c9b8a20, 0x1d80a: 0x6d287020, 0x1d80b: 0x6cb2dc20, + 0x1d80c: 0x6d22b020, 0x1d80d: 0x6d09c220, 0x1d80e: 0x6c62be20, 0x1d80f: 0x6c6eec20, + 0x1d810: 0x6d07e820, 0x1d811: 0x6ca09020, 0x1d812: 0x6cc0c220, 0x1d813: 0x6cda6620, + 0x1d814: 0x6c6eee20, 0x1d815: 0x6c3d0420, 0x1d816: 0x6ca8a620, 0x1d817: 0x6c0ffe20, + 0x1d818: 0x6cc4ea20, 0x1d819: 0x6d193020, 0x1d81a: 0x6cfc4a20, 0x1d81b: 0x6d21e420, + 0x1d81c: 0x6c718820, 0x1d81d: 0x6c892e20, 0x1d81e: 0x6c88dc20, 0x1d81f: 0x6d1b1e20, + 0x1d820: 0x6cbb2e20, 0x1d821: 0x6d1c2420, 0x1d822: 0x6c8fcc20, 0x1d823: 0x6ce82220, + 0x1d824: 0x6cf05420, 0x1d825: 0x6d270c20, 0x1d826: 0x6c8d9420, 0x1d827: 0x6cc1f020, + 0x1d828: 0x6d117020, 0x1d829: 0x6c38e620, 0x1d82a: 0x6c9a3c20, 0x1d82b: 0x6c4f3020, + 0x1d82c: 0x6c7c5620, 0x1d82d: 0x6c7ff020, 0x1d82e: 0x6c62d220, 0x1d82f: 0x6c29a220, + 0x1d830: 0x6c981820, 0x1d831: 0x6c836220, 0x1d832: 0x6c828820, 0x1d833: 0x6c5b0a20, + 0x1d834: 0x6c3c8220, 0x1d835: 0x6d342820, 0x1d836: 0x6cf10e20, 0x1d837: 0x6c7cb620, + 0x1d838: 0x6d2ea220, 0x1d839: 0x6c580620, 0x1d83a: 0x6c84ac20, 0x1d83b: 0x6c62e220, + 0x1d83c: 0x6c9cb620, 0x1d83d: 0x6c830a20, 0x1d83e: 0x6c582220, 0x1d83f: 0x6c957a20, + // Block 0x761, offset 0x1d840 + 0x1d840: 0x6c5fa020, 0x1d841: 0x6c7cbe20, 0x1d842: 0x6c934020, 0x1d843: 0x6c655020, + 0x1d844: 0x6cc9ba20, 0x1d845: 0x6ce2e620, 0x1d846: 0x6c829e20, 0x1d847: 0x6cc36820, + 0x1d848: 0x6cff6020, 0x1d849: 0x6d197420, 0x1d84a: 0x6c947220, 0x1d84b: 0x6c9ae620, + 0x1d84c: 0x6c0cd420, 0x1d84d: 0x6c549420, 0x1d84e: 0x6c561220, 0x1d84f: 0x6c91b820, + 0x1d850: 0x6caaa220, 0x1d851: 0x6c93d420, 0x1d852: 0x6cd7da20, 0x1d853: 0x6cfeaa20, + 0x1d854: 0x6cb98220, 0x1d855: 0x6c1f3620, 0x1d856: 0x6c54c620, 0x1d857: 0x6d058a20, + 0x1d858: 0x6c25d820, 0x1d859: 0x6c3e6e20, 0x1d85a: 0x6d058c20, 0x1d85b: 0x6d05a820, + 0x1d85c: 0x6c91c420, 0x1d85d: 0x6c562420, 0x1d85e: 0x6d216620, 0x1d85f: 0x6c504a20, + 0x1d860: 0x6c686020, 0x1d861: 0x6c725820, 0x1d862: 0x6c4c8620, 0x1d863: 0x6c066820, + 0x1d864: 0x6d0cd220, 0x1d865: 0x6d2e8220, 0x1d866: 0x6d2e8420, 0x1d867: 0x6c7c4820, + 0x1d868: 0x6c0d5620, 0x1d869: 0x6cf90620, 0x1d86a: 0x6cd63220, 0x1d86b: 0x6c1d0820, + 0x1d86c: 0x6cc00220, 0x1d86d: 0x6c2db220, 0x1d86e: 0x6c612620, 0x1d86f: 0x6cc00c20, + 0x1d870: 0x6c2f5820, 0x1d871: 0x6cd19a20, 0x1d872: 0x6cf95020, 0x1d873: 0x6c740820, + 0x1d874: 0x6d302a20, 0x1d875: 0x6ccf0a20, 0x1d876: 0x6d208020, 0x1d877: 0x6c4dea20, + 0x1d878: 0x6d3efe20, 0x1d879: 0x6c532220, 0x1d87a: 0x6c5a9a20, 0x1d87b: 0x6c9b0c20, + 0x1d87c: 0x6c447e20, 0x1d87d: 0x6cdbb020, 0x1d87e: 0x6cf95a20, 0x1d87f: 0x6c149420, + // Block 0x762, offset 0x1d880 + 0x1d880: 0x6cd25620, 0x1d881: 0x6d15d620, 0x1d882: 0x6c969620, 0x1d883: 0x6cfe2020, + 0x1d884: 0x6c399420, 0x1d885: 0x6c360220, 0x1d886: 0x6c034020, 0x1d887: 0x6c1b9620, + 0x1d888: 0x6cb8ca20, 0x1d889: 0x6cf18e20, 0x1d88a: 0x6cf19020, 0x1d88b: 0x6cc8c620, + 0x1d88c: 0x6c056620, 0x1d88d: 0x6cafd220, 0x1d88e: 0x6d269a20, 0x1d88f: 0x6d269c20, + 0x1d890: 0x6c756a20, 0x1d891: 0x6cb5ae20, 0x1d892: 0x6ce73c20, 0x1d893: 0x6d1ad620, + 0x1d894: 0x6cb5b020, 0x1d895: 0x6c119020, 0x1d896: 0x6d255420, 0x1d897: 0x6c741a20, + 0x1d898: 0x6c5b3020, 0x1d899: 0x6cbd6c20, 0x1d89a: 0x6cb5b220, 0x1d89b: 0x6d382220, + 0x1d89c: 0x6d0b2220, 0x1d89d: 0x6c4fc220, 0x1d89e: 0x6ca27e20, 0x1d89f: 0x6cede420, + 0x1d8a0: 0x6c3b6820, 0x1d8a1: 0x6c3b6a20, 0x1d8a2: 0x6c4f6e20, 0x1d8a3: 0x6c462e20, + 0x1d8a4: 0x6d2a4620, 0x1d8a5: 0x6c3fd420, 0x1d8a6: 0x6cc47020, 0x1d8a7: 0x6c6bda20, + 0x1d8a8: 0x6c3e4220, 0x1d8a9: 0x6c1aa420, 0x1d8aa: 0x6c30ea20, 0x1d8ab: 0x6c064820, + 0x1d8ac: 0x6cfc0620, 0x1d8ad: 0x6ca5de20, 0x1d8ae: 0x6ce27820, 0x1d8af: 0x6cbfac20, + 0x1d8b0: 0x6d1f2c20, 0x1d8b1: 0x6d2cc220, 0x1d8b2: 0x6cb2a220, 0x1d8b3: 0x6c1b1e20, + 0x1d8b4: 0x6d204220, 0x1d8b5: 0x6c511e20, 0x1d8b6: 0x6c4da020, 0x1d8b7: 0x6c723420, + 0x1d8b8: 0x6c85fe20, 0x1d8b9: 0x6c3fe620, 0x1d8ba: 0x6cc47620, 0x1d8bb: 0x6d2c2a20, + 0x1d8bc: 0x6c468220, 0x1d8bd: 0x6cafe220, 0x1d8be: 0x6cafe420, 0x1d8bf: 0x6cfb5220, + // Block 0x763, offset 0x1d8c0 + 0x1d8c0: 0x6d3af020, 0x1d8c1: 0x6c2dc820, 0x1d8c2: 0x6c0ce820, 0x1d8c3: 0x6c0de220, + 0x1d8c4: 0x6c470e20, 0x1d8c5: 0x6d2d7020, 0x1d8c6: 0x6cc10620, 0x1d8c7: 0x6ccf1220, + 0x1d8c8: 0x6ce5fa20, 0x1d8c9: 0x6c8d0020, 0x1d8ca: 0x6c478420, 0x1d8cb: 0x6c288420, + 0x1d8cc: 0x6c478620, 0x1d8cd: 0x6d1c6a20, 0x1d8ce: 0x6c860020, 0x1d8cf: 0x6c196a20, + 0x1d8d0: 0x6cc11220, 0x1d8d1: 0x6ca1d620, 0x1d8d2: 0x6c43f620, 0x1d8d3: 0x6c22ca20, + 0x1d8d4: 0x6c5b3820, 0x1d8d5: 0x6c5b3a20, 0x1d8d6: 0x6c986a20, 0x1d8d7: 0x6c3ffc20, + 0x1d8d8: 0x6d0fbc20, 0x1d8d9: 0x6cebde20, 0x1d8da: 0x6c8b0e20, 0x1d8db: 0x6d39ac20, + 0x1d8dc: 0x6d13f820, 0x1d8dd: 0x6cfb6220, 0x1d8de: 0x6c7e0020, 0x1d8df: 0x6c684e20, + 0x1d8e0: 0x6c861a20, 0x1d8e1: 0x6d17be20, 0x1d8e2: 0x6cb2b020, 0x1d8e3: 0x6cb4fc20, + 0x1d8e4: 0x6c4cfe20, 0x1d8e5: 0x6ccf1a20, 0x1d8e6: 0x6d14fc20, 0x1d8e7: 0x6cee2420, + 0x1d8e8: 0x6ca11c20, 0x1d8e9: 0x6cbf3220, 0x1d8ea: 0x6cbcc420, 0x1d8eb: 0x6c4b0420, + 0x1d8ec: 0x6cbf3420, 0x1d8ed: 0x6d364020, 0x1d8ee: 0x6c976420, 0x1d8ef: 0x6c81f820, + 0x1d8f0: 0x6d305c20, 0x1d8f1: 0x6c63c220, 0x1d8f2: 0x6ca4ae20, 0x1d8f3: 0x6cd7ee20, + 0x1d8f4: 0x6cb5f020, 0x1d8f5: 0x6d038420, 0x1d8f6: 0x6c6bee20, 0x1d8f7: 0x6cc07c20, + 0x1d8f8: 0x6cce7a20, 0x1d8f9: 0x6d1e4c20, 0x1d8fa: 0x6c63ce20, 0x1d8fb: 0x6cea0220, + 0x1d8fc: 0x6c17de20, 0x1d8fd: 0x6c044e20, 0x1d8fe: 0x6c357620, 0x1d8ff: 0x6c4ed420, + // Block 0x764, offset 0x1d900 + 0x1d900: 0x6cd56420, 0x1d901: 0x6d081620, 0x1d902: 0x6c3c5820, 0x1d903: 0x6cd0b820, + 0x1d904: 0x6cd0ba20, 0x1d905: 0x6c3f7020, 0x1d906: 0x6cfce020, 0x1d907: 0x6d2ffe20, + 0x1d908: 0x6cf3da20, 0x1d909: 0x6c3ea820, 0x1d90a: 0x6c83f820, 0x1d90b: 0x6c80d420, + 0x1d90c: 0x6c09de20, 0x1d90d: 0x6c1e9220, 0x1d90e: 0x6d24fc20, 0x1d90f: 0x6d1fd820, + 0x1d910: 0x6c6af820, 0x1d911: 0x6c288e20, 0x1d912: 0x6d0ca220, 0x1d913: 0x6ce67a20, + 0x1d914: 0x6c2d6820, 0x1d915: 0x6cea0420, 0x1d916: 0x6c5b3c20, 0x1d917: 0x6cf29820, + 0x1d918: 0x6d340420, 0x1d919: 0x6cd92c20, 0x1d91a: 0x6c3a1420, 0x1d91b: 0x6c70b620, + 0x1d91c: 0x6c9d7020, 0x1d91d: 0x6cb62c20, 0x1d91e: 0x6cb62e20, 0x1d91f: 0x6d23a820, + 0x1d920: 0x6c75da20, 0x1d921: 0x6c7e8a20, 0x1d922: 0x6c9be220, 0x1d923: 0x6cbac420, + 0x1d924: 0x6cd80820, 0x1d925: 0x6cf68020, 0x1d926: 0x6c950820, 0x1d927: 0x6c865420, + 0x1d928: 0x6c2ed620, 0x1d929: 0x6ce59a20, 0x1d92a: 0x6ce23220, 0x1d92b: 0x6c7d7a20, + 0x1d92c: 0x6c4e2620, 0x1d92d: 0x6c4eec20, 0x1d92e: 0x6d23aa20, 0x1d92f: 0x6c058420, + 0x1d930: 0x6c3a4020, 0x1d931: 0x6cb00c20, 0x1d932: 0x6ceea820, 0x1d933: 0x6c339e20, + 0x1d934: 0x6d183820, 0x1d935: 0x6d250c20, 0x1d936: 0x6cddd020, 0x1d937: 0x6cc30c20, + 0x1d938: 0x6cba1a20, 0x1d939: 0x6cc8d820, 0x1d93a: 0x6ca5fc20, 0x1d93b: 0x6cbe5220, + 0x1d93c: 0x6cf0b420, 0x1d93d: 0x6c899e20, 0x1d93e: 0x6c4cc820, 0x1d93f: 0x6cec9620, + // Block 0x765, offset 0x1d940 + 0x1d940: 0x6c301020, 0x1d941: 0x6c367220, 0x1d942: 0x6c04d020, 0x1d943: 0x6c2c8620, + 0x1d944: 0x6cee3420, 0x1d945: 0x6c11a020, 0x1d946: 0x6d102820, 0x1d947: 0x6d1d6820, + 0x1d948: 0x6c4c3220, 0x1d949: 0x6c150e20, 0x1d94a: 0x6c2fb420, 0x1d94b: 0x6c7e8c20, + 0x1d94c: 0x6c782c20, 0x1d94d: 0x6c6afa20, 0x1d94e: 0x6d005020, 0x1d94f: 0x6ce68e20, + 0x1d950: 0x6c99b220, 0x1d951: 0x6d05de20, 0x1d952: 0x6c9dd020, 0x1d953: 0x6d219020, + 0x1d954: 0x6c6a3220, 0x1d955: 0x6cd28020, 0x1d956: 0x6d07c820, 0x1d957: 0x6c59f620, + 0x1d958: 0x6d0dce20, 0x1d959: 0x6c0b0420, 0x1d95a: 0x6cc75e20, 0x1d95b: 0x6ceeb220, + 0x1d95c: 0x6c403e20, 0x1d95d: 0x6d25a020, 0x1d95e: 0x6c9aaa20, 0x1d95f: 0x6cf14620, + 0x1d960: 0x6c3ee220, 0x1d961: 0x6cc7c220, 0x1d962: 0x6d00e220, 0x1d963: 0x6d1f6a20, + 0x1d964: 0x6cc09020, 0x1d965: 0x6c990020, 0x1d966: 0x6cf97820, 0x1d967: 0x6d1be020, + 0x1d968: 0x6cd1f020, 0x1d969: 0x6c1d2020, 0x1d96a: 0x6ce0ce20, 0x1d96b: 0x6d39be20, + 0x1d96c: 0x6d3fba20, 0x1d96d: 0x6ce36c20, 0x1d96e: 0x6c404020, 0x1d96f: 0x6d25a220, + 0x1d970: 0x6c7c9820, 0x1d971: 0x6c9b3e20, 0x1d972: 0x6c7e9620, 0x1d973: 0x6c31b220, + 0x1d974: 0x6c559620, 0x1d975: 0x6cbfc220, 0x1d976: 0x6c2ee020, 0x1d977: 0x6c866420, + 0x1d978: 0x6cf29c20, 0x1d979: 0x6d276220, 0x1d97a: 0x6cc24e20, 0x1d97b: 0x6ca43a20, + 0x1d97c: 0x6c90b620, 0x1d97d: 0x6c211220, 0x1d97e: 0x6cc6a820, 0x1d97f: 0x6d1c9220, + // Block 0x766, offset 0x1d980 + 0x1d980: 0x6c677620, 0x1d981: 0x6c051420, 0x1d982: 0x6c80d820, 0x1d983: 0x6cad0e20, + 0x1d984: 0x6cd82c20, 0x1d985: 0x6cf6da20, 0x1d986: 0x6c22de20, 0x1d987: 0x6cf6dc20, + 0x1d988: 0x6d25b020, 0x1d989: 0x6cf23c20, 0x1d98a: 0x6c885c20, 0x1d98b: 0x6cd9dc20, + 0x1d98c: 0x6c04a020, 0x1d98d: 0x6cc6b220, 0x1d98e: 0x6cc6b420, 0x1d98f: 0x6c60b220, + 0x1d990: 0x6cf38220, 0x1d991: 0x6d055020, 0x1d992: 0x6c4f0e20, 0x1d993: 0x6cbdac20, + 0x1d994: 0x6d156020, 0x1d995: 0x6c089020, 0x1d996: 0x6c575420, 0x1d997: 0x6ce13c20, + 0x1d998: 0x6d161420, 0x1d999: 0x6c327c20, 0x1d99a: 0x6ca3d620, 0x1d99b: 0x6c517820, + 0x1d99c: 0x6c55c020, 0x1d99d: 0x6c4a8a20, 0x1d99e: 0x6c96a420, 0x1d99f: 0x6ca01a20, + 0x1d9a0: 0x6d18b620, 0x1d9a1: 0x6cf1b020, 0x1d9a2: 0x6d1ca020, 0x1d9a3: 0x6ce28420, + 0x1d9a4: 0x6d37ca20, 0x1d9a5: 0x6c123c20, 0x1d9a6: 0x6ccb1020, 0x1d9a7: 0x6cb81a20, + 0x1d9a8: 0x6c97c820, 0x1d9a9: 0x6ce5e620, 0x1d9aa: 0x6cce2020, 0x1d9ab: 0x6cd3e620, + 0x1d9ac: 0x6c129e20, 0x1d9ad: 0x6c1ad620, 0x1d9ae: 0x6c2ca620, 0x1d9af: 0x6c027620, + 0x1d9b0: 0x6c92fa20, 0x1d9b1: 0x6cf0e820, 0x1d9b2: 0x6d371220, 0x1d9b3: 0x6ce14220, + 0x1d9b4: 0x6c18ea20, 0x1d9b5: 0x6cb16a20, 0x1d9b6: 0x6cc1c420, 0x1d9b7: 0x6cb02420, + 0x1d9b8: 0x6d21be20, 0x1d9b9: 0x6c66e420, 0x1d9ba: 0x6c955820, 0x1d9bb: 0x6c90c220, + 0x1d9bc: 0x6cbdea20, 0x1d9bd: 0x6d37ce20, 0x1d9be: 0x6d1b1420, 0x1d9bf: 0x6c678820, + // Block 0x767, offset 0x1d9c0 + 0x1d9c0: 0x6cd67620, 0x1d9c1: 0x6cf1b820, 0x1d9c2: 0x6cff2620, 0x1d9c3: 0x6ceda020, + 0x1d9c4: 0x6d30a220, 0x1d9c5: 0x6d310820, 0x1d9c6: 0x6c96f820, 0x1d9c7: 0x6c967a20, + 0x1d9c8: 0x6c4c4820, 0x1d9c9: 0x6c8eaa20, 0x1d9ca: 0x6c990a20, 0x1d9cb: 0x6cf6f220, + 0x1d9cc: 0x6c236a20, 0x1d9cd: 0x6c846220, 0x1d9ce: 0x6c97d020, 0x1d9cf: 0x6cff2820, + 0x1d9d0: 0x6c173020, 0x1d9d1: 0x6d2ee220, 0x1d9d2: 0x6c98a020, 0x1d9d3: 0x6cfe5e20, + 0x1d9d4: 0x6ca17e20, 0x1d9d5: 0x6d418220, 0x1d9d6: 0x6cd83c20, 0x1d9d7: 0x6cbfd420, + 0x1d9d8: 0x6ce28820, 0x1d9d9: 0x6d34ac20, 0x1d9da: 0x6caed820, 0x1d9db: 0x6caeda20, + 0x1d9dc: 0x6c695620, 0x1d9dd: 0x6cc1dc20, 0x1d9de: 0x6c0cc220, 0x1d9df: 0x6c8a3c20, + 0x1d9e0: 0x6cac8220, 0x1d9e1: 0x6c4b2220, 0x1d9e2: 0x6cf81c20, 0x1d9e3: 0x6c615a20, + 0x1d9e4: 0x6d3b9620, 0x1d9e5: 0x6c5a0e20, 0x1d9e6: 0x6c3a4220, 0x1d9e7: 0x6c818420, + 0x1d9e8: 0x6c74de20, 0x1d9e9: 0x6c74e020, 0x1d9ea: 0x6c5c7220, 0x1d9eb: 0x6d1aa220, + 0x1d9ec: 0x6c153a20, 0x1d9ed: 0x6c689c20, 0x1d9ee: 0x6ccdcc20, 0x1d9ef: 0x6ca4ca20, + 0x1d9f0: 0x6cff3e20, 0x1d9f1: 0x6cf40020, 0x1d9f2: 0x6c1d2620, 0x1d9f3: 0x6d0a5020, + 0x1d9f4: 0x6cd83e20, 0x1d9f5: 0x6c1f9c20, 0x1d9f6: 0x6c19a020, 0x1d9f7: 0x6c291e20, + 0x1d9f8: 0x6c854420, 0x1d9f9: 0x6d026620, 0x1d9fa: 0x6ccdd420, 0x1d9fb: 0x6d162420, + 0x1d9fc: 0x6c6e3a20, 0x1d9fd: 0x6c26c820, 0x1d9fe: 0x6c154420, 0x1d9ff: 0x6cb80020, + // Block 0x768, offset 0x1da00 + 0x1da00: 0x6c221820, 0x1da01: 0x6cfe0220, 0x1da02: 0x6ccf7e20, 0x1da03: 0x6c95c820, + 0x1da04: 0x6cbdb620, 0x1da05: 0x6d1d6e20, 0x1da06: 0x6c14a220, 0x1da07: 0x6c86da20, + 0x1da08: 0x6d2b6a20, 0x1da09: 0x6d07ea20, 0x1da0a: 0x6c888820, 0x1da0b: 0x6d3a3220, + 0x1da0c: 0x6d2b1e20, 0x1da0d: 0x6d005a20, 0x1da0e: 0x6c98a420, 0x1da0f: 0x6d026820, + 0x1da10: 0x6cb69a20, 0x1da11: 0x6cc6e220, 0x1da12: 0x6c661a20, 0x1da13: 0x6c9bf220, + 0x1da14: 0x6c500220, 0x1da15: 0x6cc7e420, 0x1da16: 0x6c5e3420, 0x1da17: 0x6d3dda20, + 0x1da18: 0x6c6b7820, 0x1da19: 0x6cb22420, 0x1da1a: 0x6c50aa20, 0x1da1b: 0x6c9f0e20, + 0x1da1c: 0x6c38ee20, 0x1da1d: 0x6c828a20, 0x1da1e: 0x6c6b7220, 0x1da1f: 0x6c7ec420, + 0x1da20: 0x6c9fda20, 0x1da21: 0x6c84ae20, 0x1da22: 0x6c219020, 0x1da23: 0x6c873220, + 0x1da24: 0x6cbfe620, 0x1da25: 0x6ca8bc20, 0x1da26: 0x6c919c20, 0x1da27: 0x6c328c20, + 0x1da28: 0x6cff5620, 0x1da29: 0x6d39ee20, 0x1da2a: 0x6c8ffc20, 0x1da2b: 0x6c875620, + 0x1da2c: 0x6c8ffe20, 0x1da2d: 0x6c3c8620, 0x1da2e: 0x6d127220, 0x1da2f: 0x6c086620, + 0x1da30: 0x6ca46020, 0x1da31: 0x6c47f220, 0x1da32: 0x6c730e20, 0x1da33: 0x6d1c4220, + 0x1da34: 0x6cd63820, 0x1da35: 0x6cf75820, 0x1da36: 0x6c11c820, 0x1da37: 0x6cc22420, + 0x1da38: 0x6cc33c20, 0x1da39: 0x6c329020, 0x1da3a: 0x6c11ca20, 0x1da3b: 0x6c97ae20, + 0x1da3c: 0x6cc22e20, 0x1da3d: 0x6c6b8e20, 0x1da3e: 0x6d3a4e20, 0x1da3f: 0x6d3d1820, + // Block 0x769, offset 0x1da40 + 0x1da40: 0x6d093820, 0x1da41: 0x6c598620, 0x1da42: 0x6ca9a420, 0x1da43: 0x6cadba20, + 0x1da44: 0x6caa8420, 0x1da45: 0x6d033020, 0x1da46: 0x6d383220, 0x1da47: 0x6c973420, + 0x1da48: 0x6c37ce20, 0x1da49: 0x6c761220, 0x1da4a: 0x6c9f1020, 0x1da4b: 0x6cf93c20, + 0x1da4c: 0x6d03ba20, 0x1da4d: 0x6d0d5c20, 0x1da4e: 0x6c770620, 0x1da4f: 0x6d260e20, + 0x1da50: 0x6cc28820, 0x1da51: 0x6c8d0220, 0x1da52: 0x6d089020, 0x1da53: 0x6cd5ca20, + 0x1da54: 0x6cfb5420, 0x1da55: 0x6ce7cc20, 0x1da56: 0x6cfe3820, 0x1da57: 0x6c6a1e20, + 0x1da58: 0x6cfb7020, 0x1da59: 0x6d0b3220, 0x1da5a: 0x6c559a20, 0x1da5b: 0x6cf0ca20, + 0x1da5c: 0x6c2a2c20, 0x1da5d: 0x6c1cdc20, 0x1da5e: 0x6cf0d420, 0x1da5f: 0x6c2a3620, + 0x1da60: 0x6d3cd820, 0x1da61: 0x6c527020, 0x1da62: 0x6cc22620, 0x1da63: 0x6d13be20, + 0x1da64: 0x6d198c20, 0x1da65: 0x6c103220, 0x1da66: 0x6c41ce20, 0x1da67: 0x6d20cc20, + 0x1da68: 0x6c0c7020, 0x1da69: 0x6c141820, 0x1da6a: 0x6d147a20, 0x1da6b: 0x6cccc820, + 0x1da6c: 0x6c191e20, 0x1da6d: 0x6c3d5620, 0x1da6e: 0x6c4bbc20, 0x1da6f: 0x6c3b1e20, + 0x1da70: 0x6cd65220, 0x1da71: 0x6c6a8820, 0x1da72: 0x6ca32020, 0x1da73: 0x6d37aa20, + 0x1da74: 0x6c282e20, 0x1da75: 0x6d170c20, 0x1da76: 0x6d381e20, 0x1da77: 0x6d37b220, + 0x1da78: 0x6c6bd220, 0x1da79: 0x6d350820, 0x1da7a: 0x6d009820, 0x1da7b: 0x6cc46820, + 0x1da7c: 0x6d33ba20, 0x1da7d: 0x6cc5da20, 0x1da7e: 0x6cbd2620, 0x1da7f: 0x6c6c3820, + // Block 0x76a, offset 0x1da80 + 0x1da80: 0x6c756220, 0x1da81: 0x6d255820, 0x1da82: 0x6c9a8620, 0x1da83: 0x6c149620, + 0x1da84: 0x6c02a220, 0x1da85: 0x6ca79820, 0x1da86: 0x6c5a9e20, 0x1da87: 0x6cc46a20, + 0x1da88: 0x6c635620, 0x1da89: 0x6ceb1020, 0x1da8a: 0x6c8e0e20, 0x1da8b: 0x6c276620, + 0x1da8c: 0x6c064a20, 0x1da8d: 0x6cad5620, 0x1da8e: 0x6d120020, 0x1da8f: 0x6d429420, + 0x1da90: 0x6c097020, 0x1da91: 0x6cced220, 0x1da92: 0x6ce05820, 0x1da93: 0x6c723620, + 0x1da94: 0x6c51c220, 0x1da95: 0x6d090220, 0x1da96: 0x6d053820, 0x1da97: 0x6d31d220, + 0x1da98: 0x6d14da20, 0x1da99: 0x6cabea20, 0x1da9a: 0x6c0e6420, 0x1da9b: 0x6c2b2220, + 0x1da9c: 0x6cec2a20, 0x1da9d: 0x6c3fd620, 0x1da9e: 0x6c4bc420, 0x1da9f: 0x6d35ca20, + 0x1daa0: 0x6d360a20, 0x1daa1: 0x6cc47220, 0x1daa2: 0x6cacb420, 0x1daa3: 0x6d174620, + 0x1daa4: 0x6c997420, 0x1daa5: 0x6ceaba20, 0x1daa6: 0x6ca32e20, 0x1daa7: 0x6c464420, + 0x1daa8: 0x6d088220, 0x1daa9: 0x6d304220, 0x1daaa: 0x6cc0f420, 0x1daab: 0x6c070420, + 0x1daac: 0x6c4bc620, 0x1daad: 0x6cf77c20, 0x1daae: 0x6ca6ea20, 0x1daaf: 0x6c0ee020, + 0x1dab0: 0x6c0e7220, 0x1dab1: 0x6c40ac20, 0x1dab2: 0x6c1bac20, 0x1dab3: 0x6c1ba220, + 0x1dab4: 0x6c7a9420, 0x1dab5: 0x6cc5ea20, 0x1dab6: 0x6c67e220, 0x1dab7: 0x6c63ba20, + 0x1dab8: 0x6c667e20, 0x1dab9: 0x6c0efa20, 0x1daba: 0x6c6aba20, 0x1dabb: 0x6c375420, + 0x1dabc: 0x6c438620, 0x1dabd: 0x6cc7a620, 0x1dabe: 0x6d39a020, 0x1dabf: 0x6c4a6020, + // Block 0x76b, offset 0x1dac0 + 0x1dac0: 0x6d19d020, 0x1dac1: 0x6c111020, 0x1dac2: 0x6c8b1020, 0x1dac3: 0x6c762220, + 0x1dac4: 0x6d044420, 0x1dac5: 0x6d3c1c20, 0x1dac6: 0x6c28fc20, 0x1dac7: 0x6d05aa20, + 0x1dac8: 0x6c7d5e20, 0x1dac9: 0x6c791a20, 0x1daca: 0x6ca79e20, 0x1dacb: 0x6cd5dc20, + 0x1dacc: 0x6c63c420, 0x1dacd: 0x6c7db020, 0x1dace: 0x6c1a1220, 0x1dacf: 0x6c852220, + 0x1dad0: 0x6c72f620, 0x1dad1: 0x6ccff420, 0x1dad2: 0x6cb3da20, 0x1dad3: 0x6c43fa20, + 0x1dad4: 0x6d180820, 0x1dad5: 0x6d235620, 0x1dad6: 0x6d31da20, 0x1dad7: 0x6c8e6020, + 0x1dad8: 0x6cc07e20, 0x1dad9: 0x6cc44820, 0x1dada: 0x6c622620, 0x1dadb: 0x6d180a20, + 0x1dadc: 0x6c103e20, 0x1dadd: 0x6d3c1e20, 0x1dade: 0x6cd72420, 0x1dadf: 0x6ccc0420, + 0x1dae0: 0x6cc44e20, 0x1dae1: 0x6c87e220, 0x1dae2: 0x6c880620, 0x1dae3: 0x6c88c020, + 0x1dae4: 0x6c7a9e20, 0x1dae5: 0x6c659e20, 0x1dae6: 0x6c3d1820, 0x1dae7: 0x6c14d020, + 0x1dae8: 0x6c09e020, 0x1dae9: 0x6c7d7020, 0x1daea: 0x6ce22e20, 0x1daeb: 0x6d262a20, + 0x1daec: 0x6c8d2220, 0x1daed: 0x6c1bb420, 0x1daee: 0x6c167420, 0x1daef: 0x6c1dc420, + 0x1daf0: 0x6c343220, 0x1daf1: 0x6c0c7420, 0x1daf2: 0x6c899620, 0x1daf3: 0x6cce5c20, + 0x1daf4: 0x6cade020, 0x1daf5: 0x6cade220, 0x1daf6: 0x6c3a0e20, 0x1daf7: 0x6d24fe20, + 0x1daf8: 0x6c95b820, 0x1daf9: 0x6c4cca20, 0x1dafa: 0x6d0daa20, 0x1dafb: 0x6c31aa20, + 0x1dafc: 0x6ce40420, 0x1dafd: 0x6d369a20, 0x1dafe: 0x6c70ae20, 0x1daff: 0x6d15fa20, + // Block 0x76c, offset 0x1db00 + 0x1db00: 0x6c622820, 0x1db01: 0x6d346c20, 0x1db02: 0x6c48ba20, 0x1db03: 0x6c791c20, + 0x1db04: 0x6cb81620, 0x1db05: 0x6ce40a20, 0x1db06: 0x6ce35820, 0x1db07: 0x6c402420, + 0x1db08: 0x6c1d1a20, 0x1db09: 0x6d01f020, 0x1db0a: 0x6c0b4820, 0x1db0b: 0x6c2ed820, + 0x1db0c: 0x6c7d7c20, 0x1db0d: 0x6c32a020, 0x1db0e: 0x6d054a20, 0x1db0f: 0x6d054c20, + 0x1db10: 0x6c51d620, 0x1db11: 0x6d262c20, 0x1db12: 0x6c05ba20, 0x1db13: 0x6c060620, + 0x1db14: 0x6c402620, 0x1db15: 0x6d217c20, 0x1db16: 0x6ce98c20, 0x1db17: 0x6d0dc420, + 0x1db18: 0x6c5adc20, 0x1db19: 0x6c074420, 0x1db1a: 0x6c1ee220, 0x1db1b: 0x6c93aa20, + 0x1db1c: 0x6cadaa20, 0x1db1d: 0x6c27ee20, 0x1db1e: 0x6d27f420, 0x1db1f: 0x6cddf820, + 0x1db20: 0x6c465c20, 0x1db21: 0x6c265c20, 0x1db22: 0x6c57ee20, 0x1db23: 0x6cc6aa20, + 0x1db24: 0x6d262e20, 0x1db25: 0x6cc82620, 0x1db26: 0x6ca3d420, 0x1db27: 0x6c6f3220, + 0x1db28: 0x6cdd8620, 0x1db29: 0x6c04a220, 0x1db2a: 0x6cea0a20, 0x1db2b: 0x6c1bbe20, + 0x1db2c: 0x6cca8a20, 0x1db2d: 0x6ca7ae20, 0x1db2e: 0x6d1bec20, 0x1db2f: 0x6c6bfa20, + 0x1db30: 0x6cb91e20, 0x1db31: 0x6c57f420, 0x1db32: 0x6c7aa820, 0x1db33: 0x6c884220, + 0x1db34: 0x6c7fae20, 0x1db35: 0x6c843420, 0x1db36: 0x6d30de20, 0x1db37: 0x6cd1fc20, + 0x1db38: 0x6c93b620, 0x1db39: 0x6d18b820, 0x1db3a: 0x6c2e5e20, 0x1db3b: 0x6d023220, + 0x1db3c: 0x6cfae020, 0x1db3d: 0x6cf0ea20, 0x1db3e: 0x6c0c7e20, 0x1db3f: 0x6c129620, + // Block 0x76d, offset 0x1db40 + 0x1db40: 0x6c5f4620, 0x1db41: 0x6cbb4c20, 0x1db42: 0x6ccbb020, 0x1db43: 0x6c05bc20, + 0x1db44: 0x6cfd8c20, 0x1db45: 0x6c0ae420, 0x1db46: 0x6c3f0c20, 0x1db47: 0x6c65e620, + 0x1db48: 0x6d3bea20, 0x1db49: 0x6c65e820, 0x1db4a: 0x6c257020, 0x1db4b: 0x6c60c820, + 0x1db4c: 0x6c280620, 0x1db4d: 0x6d28d020, 0x1db4e: 0x6c38cc20, 0x1db4f: 0x6c0f7e20, + 0x1db50: 0x6cfe5a20, 0x1db51: 0x6d030420, 0x1db52: 0x6c0cf820, 0x1db53: 0x6cc52e20, + 0x1db54: 0x6c97ca20, 0x1db55: 0x6c7fc620, 0x1db56: 0x6c02b220, 0x1db57: 0x6d2b1620, + 0x1db58: 0x6c4b8e20, 0x1db59: 0x6c12bc20, 0x1db5a: 0x6cdc9220, 0x1db5b: 0x6ca9d620, + 0x1db5c: 0x6c14dc20, 0x1db5d: 0x6c88d220, 0x1db5e: 0x6c0aac20, 0x1db5f: 0x6c6c6a20, + 0x1db60: 0x6c291620, 0x1db61: 0x6cd58220, 0x1db62: 0x6ce08020, 0x1db63: 0x6c0aae20, + 0x1db64: 0x6c7fd820, 0x1db65: 0x6cb46e20, 0x1db66: 0x6cc7e020, 0x1db67: 0x6d355e20, + 0x1db68: 0x6c32ec20, 0x1db69: 0x6cd58620, 0x1db6a: 0x6cec4220, 0x1db6b: 0x6cd40020, + 0x1db6c: 0x6c042c20, 0x1db6d: 0x6d012020, 0x1db6e: 0x6c0fbe20, 0x1db6f: 0x6c194220, + 0x1db70: 0x6c7f7c20, 0x1db71: 0x6c8fee20, 0x1db72: 0x6cf7c420, 0x1db73: 0x6cfb0c20, + 0x1db74: 0x6c800220, 0x1db75: 0x6d30e220, 0x1db76: 0x6c27aa20, 0x1db77: 0x6c72d820, + 0x1db78: 0x6d29c620, 0x1db79: 0x6cd21c20, 0x1db7a: 0x6c663820, 0x1db7b: 0x6cacc620, + 0x1db7c: 0x6d196820, 0x1db7d: 0x6c809c20, 0x1db7e: 0x6d0b7020, 0x1db7f: 0x6cf94020, + // Block 0x76e, offset 0x1db80 + 0x1db80: 0x6cf57420, 0x1db81: 0x6d11f820, 0x1db82: 0x6c3cc820, 0x1db83: 0x6cdfe620, + 0x1db84: 0x6c40b420, 0x1db85: 0x6c3d0620, 0x1db86: 0x6c407e20, 0x1db87: 0x6c03c820, + 0x1db88: 0x6c519620, 0x1db89: 0x6c5fa420, 0x1db8a: 0x6c5fb420, 0x1db8b: 0x6c665220, + 0x1db8c: 0x6c490820, 0x1db8d: 0x6c0b9020, 0x1db8e: 0x6d0e5620, 0x1db8f: 0x6c4a6220, + 0x1db90: 0x6c743020, 0x1db91: 0x6cb13a20, 0x1db92: 0x6c997620, 0x1db93: 0x6c9d4020, + 0x1db94: 0x6c9d4220, 0x1db95: 0x6c9ed620, 0x1db96: 0x6cd36c20, 0x1db97: 0x6cd8c420, + 0x1db98: 0x6c14cc20, 0x1db99: 0x6c954a20, 0x1db9a: 0x6c745a20, 0x1db9b: 0x6c9d6020, + 0x1db9c: 0x6ce5da20, 0x1db9d: 0x6c882620, 0x1db9e: 0x6d121820, 0x1db9f: 0x6d369c20, + 0x1dba0: 0x6c757a20, 0x1dba1: 0x6cf79620, 0x1dba2: 0x6ccd5a20, 0x1dba3: 0x6ceeb620, + 0x1dba4: 0x6cf8d220, 0x1dba5: 0x6ce51220, 0x1dba6: 0x6d21a620, 0x1dba7: 0x6c803e20, + 0x1dba8: 0x6c36aa20, 0x1dba9: 0x6c322a20, 0x1dbaa: 0x6cbd3e20, 0x1dbab: 0x6cad2220, + 0x1dbac: 0x6c62a220, 0x1dbad: 0x6ca01e20, 0x1dbae: 0x6d1caa20, 0x1dbaf: 0x6c46dc20, + 0x1dbb0: 0x6cc15020, 0x1dbb1: 0x6d2e8c20, 0x1dbb2: 0x6c6d6c20, 0x1dbb3: 0x6c492c20, + 0x1dbb4: 0x6c2abc20, 0x1dbb5: 0x6c670420, 0x1dbb6: 0x6c956420, 0x1dbb7: 0x6cc28220, + 0x1dbb8: 0x6c652620, 0x1dbb9: 0x6cef6220, 0x1dbba: 0x6c750220, 0x1dbbb: 0x6cc15c20, + 0x1dbbc: 0x6c956a20, 0x1dbbd: 0x6c805420, 0x1dbbe: 0x6cd08a20, 0x1dbbf: 0x6c2bba20, + // Block 0x76f, offset 0x1dbc0 + 0x1dbc0: 0x6c494420, 0x1dbc1: 0x6c664e20, 0x1dbc2: 0x6c490220, 0x1dbc3: 0x6d0e3e20, + 0x1dbc4: 0x6c4a3a20, 0x1dbc5: 0x6c9d2a20, 0x1dbc6: 0x6cd32020, 0x1dbc7: 0x6c14be20, + 0x1dbc8: 0x6c802020, 0x1dbc9: 0x6c740a20, 0x1dbca: 0x6c61d620, 0x1dbcb: 0x6cf77e20, + 0x1dbcc: 0x6c2b6e20, 0x1dbcd: 0x6ce4fc20, 0x1dbce: 0x6d216820, 0x1dbcf: 0x6c46cc20, + 0x1dbd0: 0x6c6d4620, 0x1dbd1: 0x6cc27220, 0x1dbd2: 0x6c68c620, 0x1dbd3: 0x6cc01820, + 0x1dbd4: 0x6c6c3a20, 0x1dbd5: 0x6c241220, 0x1dbd6: 0x6c743220, 0x1dbd7: 0x6d360c20, + 0x1dbd8: 0x6c17bc20, 0x1dbd9: 0x6c600a20, 0x1dbda: 0x6c471220, 0x1dbdb: 0x6c289020, + 0x1dbdc: 0x6d3e5820, 0x1dbdd: 0x6c2bf820, 0x1dbde: 0x6cce0420, 0x1dbdf: 0x6c57a020, + 0x1dbe0: 0x6cc30220, 0x1dbe1: 0x6c440c20, 0x1dbe2: 0x6cd3a020, 0x1dbe3: 0x6c6b9820, + 0x1dbe4: 0x6c4b0a20, 0x1dbe5: 0x6c459820, 0x1dbe6: 0x6c1f5c20, 0x1dbe7: 0x6c6b9a20, + 0x1dbe8: 0x6c5d3a20, 0x1dbe9: 0x6cc08420, 0x1dbea: 0x6d039020, 0x1dbeb: 0x6cdaf220, + 0x1dbec: 0x6ca60220, 0x1dbed: 0x6c5f1e20, 0x1dbee: 0x6c92b420, 0x1dbef: 0x6d36c020, + 0x1dbf0: 0x6d2bfa20, 0x1dbf1: 0x6c0a5e20, 0x1dbf2: 0x6d03a620, 0x1dbf3: 0x6c55cc20, + 0x1dbf4: 0x6cce2220, 0x1dbf5: 0x6c45be20, 0x1dbf6: 0x6d374820, 0x1dbf7: 0x6d092820, + 0x1dbf8: 0x6c1f8a20, 0x1dbf9: 0x6cf71a20, 0x1dbfa: 0x6d159420, 0x1dbfb: 0x6c877e20, + 0x1dbfc: 0x6c750e20, 0x1dbfd: 0x6cf75020, 0x1dbfe: 0x6d0f0c20, 0x1dbff: 0x6cf75e20, + // Block 0x770, offset 0x1dc00 + 0x1dc00: 0x6d0c5c20, 0x1dc01: 0x6d0f3620, 0x1dc02: 0x6c2f9a20, 0x1dc03: 0x6c3fc620, + 0x1dc04: 0x6cc01a20, 0x1dc05: 0x6cc01c20, 0x1dc06: 0x6c698a20, 0x1dc07: 0x6c529c20, + 0x1dc08: 0x6c61b820, 0x1dc09: 0x6c384c20, 0x1dc0a: 0x6d0a7e20, 0x1dc0b: 0x6c2e1420, + 0x1dc0c: 0x6c53b820, 0x1dc0d: 0x6c149820, 0x1dc0e: 0x6ce25c20, 0x1dc0f: 0x6d058620, + 0x1dc10: 0x6c6aaa20, 0x1dc11: 0x6d14dc20, 0x1dc12: 0x6cc5e020, 0x1dc13: 0x6d0ac020, + 0x1dc14: 0x6d1a4e20, 0x1dc15: 0x6ccd7e20, 0x1dc16: 0x6cb77020, 0x1dc17: 0x6ceabc20, + 0x1dc18: 0x6c61d820, 0x1dc19: 0x6d0a8020, 0x1dc1a: 0x6d1a5020, 0x1dc1b: 0x6c356020, + 0x1dc1c: 0x6c3b2c20, 0x1dc1d: 0x6d0ba420, 0x1dc1e: 0x6d109e20, 0x1dc1f: 0x6cd98c20, + 0x1dc20: 0x6cd06020, 0x1dc21: 0x6d1a5e20, 0x1dc22: 0x6d02ce20, 0x1dc23: 0x6c743420, + 0x1dc24: 0x6cff8620, 0x1dc25: 0x6ca54e20, 0x1dc26: 0x6c18c020, 0x1dc27: 0x6d1f2e20, + 0x1dc28: 0x6d352220, 0x1dc29: 0x6d046820, 0x1dc2a: 0x6c39d620, 0x1dc2b: 0x6d033220, + 0x1dc2c: 0x6c174020, 0x1dc2d: 0x6ccf4420, 0x1dc2e: 0x6cfaa220, 0x1dc2f: 0x6cc94e20, + 0x1dc30: 0x6d3ce220, 0x1dc31: 0x6d063c20, 0x1dc32: 0x6d177820, 0x1dc33: 0x6d177a20, + 0x1dc34: 0x6cdb7a20, 0x1dc35: 0x6c1ab220, 0x1dc36: 0x6c509e20, 0x1dc37: 0x6ccff620, + 0x1dc38: 0x6c512c20, 0x1dc39: 0x6d06e620, 0x1dc3a: 0x6d31de20, 0x1dc3b: 0x6d3afa20, + 0x1dc3c: 0x6d334e20, 0x1dc3d: 0x6c46a820, 0x1dc3e: 0x6d3e5c20, 0x1dc3f: 0x6d3f1c20, + // Block 0x771, offset 0x1dc40 + 0x1dc40: 0x6d2d7820, 0x1dc41: 0x6c479420, 0x1dc42: 0x6c3ffe20, 0x1dc43: 0x6c65a020, + 0x1dc44: 0x6c2eb420, 0x1dc45: 0x6c8d0a20, 0x1dc46: 0x6c2bfa20, 0x1dc47: 0x6d104e20, + 0x1dc48: 0x6c861c20, 0x1dc49: 0x6ca4b020, 0x1dc4a: 0x6cacb820, 0x1dc4b: 0x6d392e20, + 0x1dc4c: 0x6c422220, 0x1dc4d: 0x6d17c420, 0x1dc4e: 0x6c724420, 0x1dc4f: 0x6d120c20, + 0x1dc50: 0x6d2cc820, 0x1dc51: 0x6d150020, 0x1dc52: 0x6d150220, 0x1dc53: 0x6cc24a20, + 0x1dc54: 0x6d2fb620, 0x1dc55: 0x6cb2b220, 0x1dc56: 0x6c09ac20, 0x1dc57: 0x6d049620, + 0x1dc58: 0x6cc11620, 0x1dc59: 0x6c037c20, 0x1dc5a: 0x6c26aa20, 0x1dc5b: 0x6d411e20, + 0x1dc5c: 0x6ce1cc20, 0x1dc5d: 0x6d3a7220, 0x1dc5e: 0x6c224820, 0x1dc5f: 0x6d305e20, + 0x1dc60: 0x6d1e3e20, 0x1dc61: 0x6d064620, 0x1dc62: 0x6d0a2020, 0x1dc63: 0x6d180c20, + 0x1dc64: 0x6c5a5620, 0x1dc65: 0x6c514420, 0x1dc66: 0x6cd3a220, 0x1dc67: 0x6c13f020, + 0x1dc68: 0x6cfff820, 0x1dc69: 0x6cd1d820, 0x1dc6a: 0x6c523e20, 0x1dc6b: 0x6c144420, + 0x1dc6c: 0x6c46ba20, 0x1dc6d: 0x6c4b0c20, 0x1dc6e: 0x6cc30420, 0x1dc6f: 0x6c5bea20, + 0x1dc70: 0x6c6afc20, 0x1dc71: 0x6c57a220, 0x1dc72: 0x6c40fc20, 0x1dc73: 0x6cfdca20, + 0x1dc74: 0x6ceea420, 0x1dc75: 0x6ccffc20, 0x1dc76: 0x6d393420, 0x1dc77: 0x6ce75c20, + 0x1dc78: 0x6c9c6220, 0x1dc79: 0x6d2d8420, 0x1dc7a: 0x6ca04620, 0x1dc7b: 0x6c366420, + 0x1dc7c: 0x6c5ace20, 0x1dc7d: 0x6d0cb220, 0x1dc7e: 0x6d046e20, 0x1dc7f: 0x6c48bc20, + // Block 0x772, offset 0x1dc80 + 0x1dc80: 0x6c37d220, 0x1dc81: 0x6c0e2420, 0x1dc82: 0x6ce5c420, 0x1dc83: 0x6d152020, + 0x1dc84: 0x6c82ca20, 0x1dc85: 0x6d39b420, 0x1dc86: 0x6c7ba420, 0x1dc87: 0x6c7ac620, + 0x1dc88: 0x6cf3dc20, 0x1dc89: 0x6d238220, 0x1dc8a: 0x6ce2a420, 0x1dc8b: 0x6c625220, + 0x1dc8c: 0x6d36a020, 0x1dc8d: 0x6cc60220, 0x1dc8e: 0x6c244e20, 0x1dc8f: 0x6c810c20, + 0x1dc90: 0x6c357a20, 0x1dc91: 0x6c7bc620, 0x1dc92: 0x6c370c20, 0x1dc93: 0x6cd3b820, + 0x1dc94: 0x6ce6d820, 0x1dc95: 0x6c289620, 0x1dc96: 0x6c074620, 0x1dc97: 0x6c151020, + 0x1dc98: 0x6d205620, 0x1dc99: 0x6c794a20, 0x1dc9a: 0x6cbc4e20, 0x1dc9b: 0x6cbd3820, + 0x1dc9c: 0x6cd65020, 0x1dc9d: 0x6c014220, 0x1dc9e: 0x6d227c20, 0x1dc9f: 0x6cfffe20, + 0x1dca0: 0x6c1a2220, 0x1dca1: 0x6c6bf420, 0x1dca2: 0x6cfcee20, 0x1dca3: 0x6cf37a20, + 0x1dca4: 0x6cf51020, 0x1dca5: 0x6c435620, 0x1dca6: 0x6cd99a20, 0x1dca7: 0x6c101a20, + 0x1dca8: 0x6c5c0420, 0x1dca9: 0x6c6e9820, 0x1dcaa: 0x6cd76a20, 0x1dcab: 0x6d325220, + 0x1dcac: 0x6cd76c20, 0x1dcad: 0x6c31ae20, 0x1dcae: 0x6c57e420, 0x1dcaf: 0x6c172420, + 0x1dcb0: 0x6cd6fe20, 0x1dcb1: 0x6c6b2820, 0x1dcb2: 0x6c78d420, 0x1dcb3: 0x6cc13a20, + 0x1dcb4: 0x6c23ac20, 0x1dcb5: 0x6cff9820, 0x1dcb6: 0x6cdc6420, 0x1dcb7: 0x6cee3620, + 0x1dcb8: 0x6cfb8620, 0x1dcb9: 0x6c3a6c20, 0x1dcba: 0x6c1ad220, 0x1dcbb: 0x6cde9220, + 0x1dcbc: 0x6d186620, 0x1dcbd: 0x6ca6c220, 0x1dcbe: 0x6d1a9a20, 0x1dcbf: 0x6c2e3820, + // Block 0x773, offset 0x1dcc0 + 0x1dcc0: 0x6cb06820, 0x1dcc1: 0x6d3d8c20, 0x1dcc2: 0x6c15de20, 0x1dcc3: 0x6c188420, + 0x1dcc4: 0x6d3cd620, 0x1dcc5: 0x6c626a20, 0x1dcc6: 0x6cb52820, 0x1dcc7: 0x6ce00820, + 0x1dcc8: 0x6d3ca420, 0x1dcc9: 0x6cf00c20, 0x1dcca: 0x6c714c20, 0x1dccb: 0x6cbeb220, + 0x1dccc: 0x6c303c20, 0x1dccd: 0x6d335420, 0x1dcce: 0x6d2af220, 0x1dccf: 0x6d406020, + 0x1dcd0: 0x6cb91620, 0x1dcd1: 0x6d3d8e20, 0x1dcd2: 0x6c89c820, 0x1dcd3: 0x6c66c020, + 0x1dcd4: 0x6c1f6e20, 0x1dcd5: 0x6c4fe420, 0x1dcd6: 0x6c952620, 0x1dcd7: 0x6cd06e20, + 0x1dcd8: 0x6c0c7820, 0x1dcd9: 0x6c581220, 0x1dcda: 0x6cb12620, 0x1dcdb: 0x6d219420, + 0x1dcdc: 0x6c2eea20, 0x1dcdd: 0x6d05e820, 0x1dcde: 0x6cb14220, 0x1dcdf: 0x6cd3de20, + 0x1dce0: 0x6d07d220, 0x1dce1: 0x6cd3e020, 0x1dce2: 0x6c5d4220, 0x1dce3: 0x6c57c020, + 0x1dce4: 0x6c36ac20, 0x1dce5: 0x6d384020, 0x1dce6: 0x6c2c9c20, 0x1dce7: 0x6d00f220, + 0x1dce8: 0x6c3ef620, 0x1dce9: 0x6cb49420, 0x1dcea: 0x6ce69020, 0x1dceb: 0x6c66d620, + 0x1dcec: 0x6cb71e20, 0x1dced: 0x6d23f620, 0x1dcee: 0x6d3e9020, 0x1dcef: 0x6d3b9420, + 0x1dcf0: 0x6cf81420, 0x1dcf1: 0x6c5c4220, 0x1dcf2: 0x6d1a0220, 0x1dcf3: 0x6c015020, + 0x1dcf4: 0x6cfb9e20, 0x1dcf5: 0x6ca40e20, 0x1dcf6: 0x6c18ec20, 0x1dcf7: 0x6c3cce20, + 0x1dcf8: 0x6d39c620, 0x1dcf9: 0x6d0fd820, 0x1dcfa: 0x6d0ec420, 0x1dcfb: 0x6c5a0020, + 0x1dcfc: 0x6d07d420, 0x1dcfd: 0x6c443a20, 0x1dcfe: 0x6cab0e20, 0x1dcff: 0x6cb53220, + // Block 0x774, offset 0x1dd00 + 0x1dd00: 0x6ca1e820, 0x1dd01: 0x6d134620, 0x1dd02: 0x6cf0d620, 0x1dd03: 0x6d044620, + 0x1dd04: 0x6ce2ba20, 0x1dd05: 0x6d38b620, 0x1dd06: 0x6ccdc020, 0x1dd07: 0x6c65ec20, + 0x1dd08: 0x6cb33a20, 0x1dd09: 0x6c7d2220, 0x1dd0a: 0x6c5a6420, 0x1dd0b: 0x6c5e0c20, + 0x1dd0c: 0x6c43b620, 0x1dd0d: 0x6d1cac20, 0x1dd0e: 0x6c9c7420, 0x1dd0f: 0x6cffc020, + 0x1dd10: 0x6c9d9820, 0x1dd11: 0x6cf81a20, 0x1dd12: 0x6cbae220, 0x1dd13: 0x6c188c20, + 0x1dd14: 0x6d097220, 0x1dd15: 0x6ce38820, 0x1dd16: 0x6cdb4a20, 0x1dd17: 0x6c059420, + 0x1dd18: 0x6c1b5a20, 0x1dd19: 0x6cb92820, 0x1dd1a: 0x6cd3ea20, 0x1dd1b: 0x6c67c820, + 0x1dd1c: 0x6d25b620, 0x1dd1d: 0x6d023620, 0x1dd1e: 0x6c51f620, 0x1dd1f: 0x6ce1f220, + 0x1dd20: 0x6d115020, 0x1dd21: 0x6d115220, 0x1dd22: 0x6d378020, 0x1dd23: 0x6d21c820, + 0x1dd24: 0x6c0c4020, 0x1dd25: 0x6c23e020, 0x1dd26: 0x6cbee620, 0x1dd27: 0x6c846420, + 0x1dd28: 0x6ca08020, 0x1dd29: 0x6ca17620, 0x1dd2a: 0x6cce2420, 0x1dd2b: 0x6d30b020, + 0x1dd2c: 0x6ca05420, 0x1dd2d: 0x6c660420, 0x1dd2e: 0x6d2b1820, 0x1dd2f: 0x6c6a3a20, + 0x1dd30: 0x6c886e20, 0x1dd31: 0x6c90c620, 0x1dd32: 0x6c121020, 0x1dd33: 0x6cab5e20, + 0x1dd34: 0x6c4c0620, 0x1dd35: 0x6cf7ae20, 0x1dd36: 0x6d3dc020, 0x1dd37: 0x6c027a20, + 0x1dd38: 0x6c027c20, 0x1dd39: 0x6c6cc220, 0x1dd3a: 0x6d30b220, 0x1dd3b: 0x6d158620, + 0x1dd3c: 0x6c551220, 0x1dd3d: 0x6c680e20, 0x1dd3e: 0x6c978e20, 0x1dd3f: 0x6c178a20, + // Block 0x775, offset 0x1dd40 + 0x1dd40: 0x6c4f2620, 0x1dd41: 0x6c576020, 0x1dd42: 0x6c160020, 0x1dd43: 0x6d060020, + 0x1dd44: 0x6d2ba420, 0x1dd45: 0x6ccb9220, 0x1dd46: 0x6cf71c20, 0x1dd47: 0x6d2c0420, + 0x1dd48: 0x6c337a20, 0x1dd49: 0x6d336c20, 0x1dd4a: 0x6ca4ce20, 0x1dd4b: 0x6c7fda20, + 0x1dd4c: 0x6c359820, 0x1dd4d: 0x6d1c2620, 0x1dd4e: 0x6c74ee20, 0x1dd4f: 0x6c5f8220, + 0x1dd50: 0x6d421220, 0x1dd51: 0x6c696020, 0x1dd52: 0x6c0ffc20, 0x1dd53: 0x6c5c8620, + 0x1dd54: 0x6d3bf420, 0x1dd55: 0x6cf40820, 0x1dd56: 0x6d2b7a20, 0x1dd57: 0x6d2c6220, + 0x1dd58: 0x6cd42220, 0x1dd59: 0x6cbc6c20, 0x1dd5a: 0x6ce03620, 0x1dd5b: 0x6d2b7c20, + 0x1dd5c: 0x6cb4a020, 0x1dd5d: 0x6cd12820, 0x1dd5e: 0x6d07ee20, 0x1dd5f: 0x6d2a9820, + 0x1dd60: 0x6ce04020, 0x1dd61: 0x6c293620, 0x1dd62: 0x6cdcac20, 0x1dd63: 0x6cfc4e20, + 0x1dd64: 0x6c5f8c20, 0x1dd65: 0x6c69d820, 0x1dd66: 0x6c6e3c20, 0x1dd67: 0x6d2e9820, + 0x1dd68: 0x6ca45c20, 0x1dd69: 0x6d143220, 0x1dd6a: 0x6c010420, 0x1dd6b: 0x6d2dbc20, + 0x1dd6c: 0x6cb0d820, 0x1dd6d: 0x6c5b7e20, 0x1dd6e: 0x6c57d420, 0x1dd6f: 0x6d193220, + 0x1dd70: 0x6d193420, 0x1dd71: 0x6ccdd620, 0x1dd72: 0x6cc51c20, 0x1dd73: 0x6caa3220, + 0x1dd74: 0x6cba3220, 0x1dd75: 0x6d3cbe20, 0x1dd76: 0x6cdee420, 0x1dd77: 0x6c56e020, + 0x1dd78: 0x6d38c420, 0x1dd79: 0x6c500420, 0x1dd7a: 0x6c010620, 0x1dd7b: 0x6d1c3420, + 0x1dd7c: 0x6c671a20, 0x1dd7d: 0x6d246620, 0x1dd7e: 0x6c662c20, 0x1dd7f: 0x6c5c9c20, + // Block 0x776, offset 0x1dd80 + 0x1dd80: 0x6c31f020, 0x1dd81: 0x6d30bc20, 0x1dd82: 0x6d08d020, 0x1dd83: 0x6d29bc20, + 0x1dd84: 0x6c830c20, 0x1dd85: 0x6cd08c20, 0x1dd86: 0x6cf12220, 0x1dd87: 0x6c161a20, + 0x1dd88: 0x6c879020, 0x1dd89: 0x6d159a20, 0x1dd8a: 0x6c0bdc20, 0x1dd8b: 0x6d30c820, + 0x1dd8c: 0x6d0f0e20, 0x1dd8d: 0x6c36f220, 0x1dd8e: 0x6c1e0e20, 0x1dd8f: 0x6cf12a20, + 0x1dd90: 0x6c1e1020, 0x1dd91: 0x6d125620, 0x1dd92: 0x6c157c20, 0x1dd93: 0x6cc51e20, + 0x1dd94: 0x6d1b2c20, 0x1dd95: 0x6c801020, 0x1dd96: 0x6c194820, 0x1dd97: 0x6d013820, + 0x1dd98: 0x6ca8cc20, 0x1dd99: 0x6c584c20, 0x1dd9a: 0x6d29ca20, 0x1dd9b: 0x6d197c20, + 0x1dd9c: 0x6c294a20, 0x1dd9d: 0x6d2dda20, 0x1dd9e: 0x6d0f2a20, 0x1dd9f: 0x6c321020, + 0x1dda0: 0x6d0c5020, 0x1dda1: 0x6c616e20, 0x1dda2: 0x6c2f8c20, 0x1dda3: 0x6c3fa220, + 0x1dda4: 0x6cc5a420, 0x1dda5: 0x6c5e6620, 0x1dda6: 0x6c6a5c20, 0x1dda7: 0x6c53b420, + 0x1dda8: 0x6ce25820, 0x1dda9: 0x6cc51820, 0x1ddaa: 0x6ccd6620, 0x1ddab: 0x6cb72820, + 0x1ddac: 0x6cea9420, 0x1ddad: 0x6d0abe20, 0x1ddae: 0x6d164e20, 0x1ddaf: 0x6d0a6220, + 0x1ddb0: 0x6c617020, 0x1ddb1: 0x6cc5aa20, 0x1ddb2: 0x6c679c20, 0x1ddb3: 0x6c5b8c20, + 0x1ddb4: 0x6cab2c20, 0x1ddb5: 0x6c71f420, 0x1ddb6: 0x6d0b7220, 0x1ddb7: 0x6ca54220, + 0x1ddb8: 0x6d062420, 0x1ddb9: 0x6c354620, 0x1ddba: 0x6c952020, 0x1ddbb: 0x6d045220, + 0x1ddbc: 0x6cd97c20, 0x1ddbd: 0x6c3cc420, 0x1ddbe: 0x6ccf3220, 0x1ddbf: 0x6c39b820, + // Block 0x777, offset 0x1ddc0 + 0x1ddc0: 0x6c73d620, 0x1ddc1: 0x6d333a20, 0x1ddc2: 0x6c475a20, 0x1ddc3: 0x6c508a20, + 0x1ddc4: 0x6cb27020, 0x1ddc5: 0x6d410820, 0x1ddc6: 0x6cd40e20, 0x1ddc7: 0x6d048620, + 0x1ddc8: 0x6d2caa20, 0x1ddc9: 0x6cdb7820, 0x1ddca: 0x6d31b420, 0x1ddcb: 0x6c2bce20, + 0x1ddcc: 0x6d385420, 0x1ddcd: 0x6c221e20, 0x1ddce: 0x6cc0d420, 0x1ddcf: 0x6d2f9820, + 0x1ddd0: 0x6c092020, 0x1ddd1: 0x6d169c20, 0x1ddd2: 0x6d146620, 0x1ddd3: 0x6c7b8620, + 0x1ddd4: 0x6c82b620, 0x1ddd5: 0x6cd32220, 0x1ddd6: 0x6c48aa20, 0x1ddd7: 0x6cd19c20, + 0x1ddd8: 0x6c5fe420, 0x1ddd9: 0x6c5a8c20, 0x1ddda: 0x6c19c020, 0x1dddb: 0x6d398420, + 0x1dddc: 0x6ccfb420, 0x1dddd: 0x6c578620, 0x1ddde: 0x6c286c20, 0x1dddf: 0x6c469620, + 0x1dde0: 0x6cc2ba20, 0x1dde1: 0x6c4aca20, 0x1dde2: 0x6d09e020, 0x1dde3: 0x6d16d220, + 0x1dde4: 0x6d328e20, 0x1dde5: 0x6c40de20, 0x1dde6: 0x6cfdb020, 0x1dde7: 0x6c143220, + 0x1dde8: 0x6c5d1a20, 0x1dde9: 0x6d062e20, 0x1ddea: 0x6d386220, 0x1ddeb: 0x6c6bd420, + 0x1ddec: 0x6cf35c20, 0x1dded: 0x6d223020, 0x1ddee: 0x6cbc3220, 0x1ddef: 0x6cf4ce20, + 0x1ddf0: 0x6c433c20, 0x1ddf1: 0x6d203220, 0x1ddf2: 0x6c5ba420, 0x1ddf3: 0x6c7bbc20, + 0x1ddf4: 0x6cd76620, 0x1ddf5: 0x6cd98220, 0x1ddf6: 0x6c370a20, 0x1ddf7: 0x6cbea220, + 0x1ddf8: 0x6d399620, 0x1ddf9: 0x6d404a20, 0x1ddfa: 0x6caae620, 0x1ddfb: 0x6c319420, + 0x1ddfc: 0x6d3d3e20, 0x1ddfd: 0x6c3a4e20, 0x1ddfe: 0x6c789c20, 0x1ddff: 0x6cefa620, + // Block 0x778, offset 0x1de00 + 0x1de00: 0x6d20f820, 0x1de01: 0x6cd6fa20, 0x1de02: 0x6cd05420, 0x1de03: 0x6c2e1620, + 0x1de04: 0x6c15a220, 0x1de05: 0x6c89b020, 0x1de06: 0x6d3cd020, 0x1de07: 0x6cdc3220, + 0x1de08: 0x6cdfd620, 0x1de09: 0x6cd05620, 0x1de0a: 0x6d174820, 0x1de0b: 0x6ca1d020, + 0x1de0c: 0x6c18c220, 0x1de0d: 0x6c2e9620, 0x1de0e: 0x6c5a5220, 0x1de0f: 0x6c668220, + 0x1de10: 0x6d00a620, 0x1de11: 0x6d095a20, 0x1de12: 0x6d12ea20, 0x1de13: 0x6cf08820, + 0x1de14: 0x6c361a20, 0x1de15: 0x6d232420, 0x1de16: 0x6d078e20, 0x1de17: 0x6c14f020, + 0x1de18: 0x6d3e2c20, 0x1de19: 0x6c012c20, 0x1de1a: 0x6d0e6620, 0x1de1b: 0x6c2c5020, + 0x1de1c: 0x6c9c4e20, 0x1de1d: 0x6cb13c20, 0x1de1e: 0x6d059020, 0x1de1f: 0x6ca05820, + 0x1de20: 0x6c292e20, 0x1de21: 0x6cdab820, 0x1de22: 0x6d01b620, 0x1de23: 0x6d10fe20, + 0x1de24: 0x6c057420, 0x1de25: 0x6cd38c20, 0x1de26: 0x6cb8e420, 0x1de27: 0x6c9d4c20, + 0x1de28: 0x6c6c9820, 0x1de29: 0x6c976820, 0x1de2a: 0x6d306620, 0x1de2b: 0x6c65b620, + 0x1de2c: 0x6ca05220, 0x1de2d: 0x6cdff420, 0x1de2e: 0x6d2b7820, 0x1de2f: 0x6cbbe420, + 0x1de30: 0x6c7fa820, 0x1de31: 0x6cb49020, 0x1de32: 0x6c748620, 0x1de33: 0x6d0ea820, + 0x1de34: 0x6cba1e20, 0x1de35: 0x6d2d9020, 0x1de36: 0x6c193c20, 0x1de37: 0x6c475c20, + 0x1de38: 0x6cb8cc20, 0x1de39: 0x6c534020, 0x1de3a: 0x6cf96420, 0x1de3b: 0x6c602420, + 0x1de3c: 0x6c536820, 0x1de3d: 0x6c4db220, 0x1de3e: 0x6c52c020, 0x1de3f: 0x6cf6f420, + // Block 0x779, offset 0x1de40 + 0x1de40: 0x6cf6f620, 0x1de41: 0x6c5d6220, 0x1de42: 0x6c8a3e20, 0x1de43: 0x6c4e6a20, + 0x1de44: 0x6c31f220, 0x1de45: 0x6c900420, 0x1de46: 0x6c30fa20, 0x1de47: 0x6c675a20, + 0x1de48: 0x6cb6e820, 0x1de49: 0x6cd37220, 0x1de4a: 0x6c852420, 0x1de4b: 0x6c2a9e20, + 0x1de4c: 0x6cec9a20, 0x1de4d: 0x6c088a20, 0x1de4e: 0x6cd60820, 0x1de4f: 0x6cfd1c20, + 0x1de50: 0x6c3c7020, 0x1de51: 0x6d375a20, 0x1de52: 0x6d377620, 0x1de53: 0x6d0f2c20, + 0x1de54: 0x6d0f3020, 0x1de55: 0x6cd2b020, 0x1de56: 0x6c1f1620, 0x1de57: 0x6c5aae20, + 0x1de58: 0x6cea4e20, 0x1de59: 0x6d177c20, 0x1de5a: 0x6cea5020, 0x1de5b: 0x6d177e20, + 0x1de5c: 0x6c649020, 0x1de5d: 0x6c034a20, 0x1de5e: 0x6c547220, 0x1de5f: 0x6c364820, + 0x1de60: 0x6c1e8420, 0x1de61: 0x6cfe3020, 0x1de62: 0x6c593e20, 0x1de63: 0x6c64c220, + 0x1de64: 0x6c790420, 0x1de65: 0x6c40fe20, 0x1de66: 0x6c725a20, 0x1de67: 0x6c3d8a20, + 0x1de68: 0x6cf68420, 0x1de69: 0x6c0d4820, 0x1de6a: 0x6c4fd620, 0x1de6b: 0x6d23ce20, + 0x1de6c: 0x6d39c820, 0x1de6d: 0x6c638420, 0x1de6e: 0x6c3b9a20, 0x1de6f: 0x6cf6f820, + 0x1de70: 0x6c0f8020, 0x1de71: 0x6cf16620, 0x1de72: 0x6c58aa20, 0x1de73: 0x6c0d5820, + 0x1de74: 0x6c2ba620, 0x1de75: 0x6d3fce20, 0x1de76: 0x6c3ba620, 0x1de77: 0x6d191c20, + 0x1de78: 0x6d357c20, 0x1de79: 0x6c064020, 0x1de7a: 0x6c147820, 0x1de7b: 0x6c01b420, + 0x1de7c: 0x6cafe620, 0x1de7d: 0x6ca33c20, 0x1de7e: 0x6caf6620, 0x1de7f: 0x6c468a20, + // Block 0x77a, offset 0x1de80 + 0x1de80: 0x6ca34620, 0x1de81: 0x6d204820, 0x1de82: 0x6c2dcc20, 0x1de83: 0x6ca11e20, + 0x1de84: 0x6cd8ce20, 0x1de85: 0x6d04dc20, 0x1de86: 0x6c588420, 0x1de87: 0x6c7d7220, + 0x1de88: 0x6c514820, 0x1de89: 0x6c4fce20, 0x1de8a: 0x6ca13220, 0x1de8b: 0x6c4ef020, + 0x1de8c: 0x6c99a420, 0x1de8d: 0x6c842220, 0x1de8e: 0x6ca60420, 0x1de8f: 0x6c08f420, + 0x1de90: 0x6d229620, 0x1de91: 0x6c638620, 0x1de92: 0x6ce93a20, 0x1de93: 0x6c98be20, + 0x1de94: 0x6cb02620, 0x1de95: 0x6cf6fa20, 0x1de96: 0x6c36b820, 0x1de97: 0x6c72ae20, + 0x1de98: 0x6ca17820, 0x1de99: 0x6c1e6a20, 0x1de9a: 0x6ce03820, 0x1de9b: 0x6c584e20, + 0x1de9c: 0x6c753620, 0x1de9d: 0x6c06dc20, 0x1de9e: 0x6d313220, 0x1de9f: 0x6d254a20, + 0x1dea0: 0x6c3fc820, 0x1dea1: 0x6c110e20, 0x1dea2: 0x6c461420, 0x1dea3: 0x6ce27220, + 0x1dea4: 0x6d14de20, 0x1dea5: 0x6c4f7820, 0x1dea6: 0x6ced8020, 0x1dea7: 0x6cb20a20, + 0x1dea8: 0x6c5dc820, 0x1dea9: 0x6c395020, 0x1deaa: 0x6cdfa620, 0x1deab: 0x6c498620, + 0x1deac: 0x6d2ac820, 0x1dead: 0x6d345e20, 0x1deae: 0x6c37cc20, 0x1deaf: 0x6d3afe20, + 0x1deb0: 0x6cd38e20, 0x1deb1: 0x6c09ae20, 0x1deb2: 0x6d3e5e20, 0x1deb3: 0x6c37d020, + 0x1deb4: 0x6c4b4e20, 0x1deb5: 0x6cb14020, 0x1deb6: 0x6c0b3a20, 0x1deb7: 0x6c971420, + 0x1deb8: 0x6c277220, 0x1deb9: 0x6cd16820, 0x1deba: 0x6c7bf820, 0x1debb: 0x6c3ab220, + 0x1debc: 0x6ce5f420, 0x1debd: 0x6d150620, 0x1debe: 0x6c1b2a20, 0x1debf: 0x6c998620, + // Block 0x77b, offset 0x1dec0 + 0x1dec0: 0x6c51c820, 0x1dec1: 0x6c09b020, 0x1dec2: 0x6c927420, 0x1dec3: 0x6c8c5420, + 0x1dec4: 0x6c5bec20, 0x1dec5: 0x6c410020, 0x1dec6: 0x6cb11a20, 0x1dec7: 0x6d3e6020, + 0x1dec8: 0x6c642020, 0x1dec9: 0x6d070420, 0x1deca: 0x6d2b6020, 0x1decb: 0x6c691020, + 0x1decc: 0x6c414a20, 0x1decd: 0x6d29dc20, 0x1dece: 0x6c669e20, 0x1decf: 0x6d1be220, + 0x1ded0: 0x6d0a9c20, 0x1ded1: 0x6d325420, 0x1ded2: 0x6ccef820, 0x1ded3: 0x6c0d4a20, + 0x1ded4: 0x6c0d4c20, 0x1ded5: 0x6cc08620, 0x1ded6: 0x6ccefa20, 0x1ded7: 0x6c203c20, + 0x1ded8: 0x6d29e620, 0x1ded9: 0x6d38a220, 0x1deda: 0x6c7f5220, 0x1dedb: 0x6d299820, + 0x1dedc: 0x6c22e020, 0x1dedd: 0x6c188620, 0x1dede: 0x6cce3a20, 0x1dedf: 0x6ce51620, + 0x1dee0: 0x6cadee20, 0x1dee1: 0x6c44de20, 0x1dee2: 0x6cfb8820, 0x1dee3: 0x6c974020, + 0x1dee4: 0x6c66c220, 0x1dee5: 0x6cdc6820, 0x1dee6: 0x6c404420, 0x1dee7: 0x6ce0aa20, + 0x1dee8: 0x6c23ae20, 0x1dee9: 0x6c23b020, 0x1deea: 0x6d36c620, 0x1deeb: 0x6c5f2220, + 0x1deec: 0x6d2f3e20, 0x1deed: 0x6c322c20, 0x1deee: 0x6c6d5420, 0x1deef: 0x6d047420, + 0x1def0: 0x6c218820, 0x1def1: 0x6d280420, 0x1def2: 0x6c061420, 0x1def3: 0x6d290c20, + 0x1def4: 0x6c7f5820, 0x1def5: 0x6c3cf820, 0x1def6: 0x6c125c20, 0x1def7: 0x6c5f6020, + 0x1def8: 0x6cd17e20, 0x1def9: 0x6d18da20, 0x1defa: 0x6d3bec20, 0x1defb: 0x6c406820, + 0x1defc: 0x6c46de20, 0x1defd: 0x6cc9ea20, 0x1defe: 0x6d2b1a20, 0x1deff: 0x6c8a4020, + // Block 0x77c, offset 0x1df00 + 0x1df00: 0x6d18f820, 0x1df01: 0x6c045e20, 0x1df02: 0x6c191620, 0x1df03: 0x6ceda620, + 0x1df04: 0x6d373220, 0x1df05: 0x6d3cb620, 0x1df06: 0x6c0c4620, 0x1df07: 0x6d276e20, + 0x1df08: 0x6d2bb620, 0x1df09: 0x6c28e020, 0x1df0a: 0x6d29ae20, 0x1df0b: 0x6d0eec20, + 0x1df0c: 0x6cb4c420, 0x1df0d: 0x6ccdd820, 0x1df0e: 0x6cedac20, 0x1df0f: 0x6d1cca20, + 0x1df10: 0x6c6d7220, 0x1df11: 0x6c423c20, 0x1df12: 0x6cfbd420, 0x1df13: 0x6d29f020, + 0x1df14: 0x6c0ac620, 0x1df15: 0x6c31f420, 0x1df16: 0x6cd54820, 0x1df17: 0x6d0f0620, + 0x1df18: 0x6cce4220, 0x1df19: 0x6d08d420, 0x1df1a: 0x6c907020, 0x1df1b: 0x6c424420, + 0x1df1c: 0x6d29f420, 0x1df1d: 0x6c06d220, 0x1df1e: 0x6d311c20, 0x1df1f: 0x6c3fa820, + 0x1df20: 0x6d253420, 0x1df21: 0x6c460c20, 0x1df22: 0x6c110c20, 0x1df23: 0x6d2aae20, + 0x1df24: 0x6cfb2e20, 0x1df25: 0x6c043820, 0x1df26: 0x6d2f2a20, 0x1df27: 0x6c5da220, + 0x1df28: 0x6d358e20, 0x1df29: 0x6c393420, 0x1df2a: 0x6cdf9220, 0x1df2b: 0x6cb20620, + 0x1df2c: 0x6c0b2a20, 0x1df2d: 0x6c469820, 0x1df2e: 0x6d3ab420, 0x1df2f: 0x6c497a20, + 0x1df30: 0x6c37c420, 0x1df31: 0x6c666220, 0x1df32: 0x6c078220, 0x1df33: 0x6cd34820, + 0x1df34: 0x6ce5ec20, 0x1df35: 0x6c4b3a20, 0x1df36: 0x6c7bec20, 0x1df37: 0x6c274e20, + 0x1df38: 0x6c995a20, 0x1df39: 0x6c3a9220, 0x1df3a: 0x6c51be20, 0x1df3b: 0x6d14b020, + 0x1df3c: 0x6d2b5c20, 0x1df3d: 0x6d35ce20, 0x1df3e: 0x6c640e20, 0x1df3f: 0x6c5bb020, + // Block 0x77d, offset 0x1df40 + 0x1df40: 0x6d3e1e20, 0x1df41: 0x6c8c5020, 0x1df42: 0x6c922c20, 0x1df43: 0x6d29d820, + 0x1df44: 0x6d3e2020, 0x1df45: 0x6c40f020, 0x1df46: 0x6c6cfa20, 0x1df47: 0x6cc05220, + 0x1df48: 0x6d323c20, 0x1df49: 0x6c7f4620, 0x1df4a: 0x6ccef020, 0x1df4b: 0x6c400020, + 0x1df4c: 0x6c322020, 0x1df4d: 0x6c5edc20, 0x1df4e: 0x6cd52c20, 0x1df4f: 0x6cce3820, + 0x1df50: 0x6c22ce20, 0x1df51: 0x6c09b220, 0x1df52: 0x6d388c20, 0x1df53: 0x6c44d420, + 0x1df54: 0x6cadda20, 0x1df55: 0x6c283620, 0x1df56: 0x6c7f4c20, 0x1df57: 0x6c3ce820, + 0x1df58: 0x6d3c9e20, 0x1df59: 0x6c402820, 0x1df5a: 0x6d3bd620, 0x1df5b: 0x6cc9e620, + 0x1df5c: 0x6d2af420, 0x1df5d: 0x6d0ec820, 0x1df5e: 0x6d299a20, 0x1df5f: 0x6d276820, + 0x1df60: 0x6d2bb220, 0x1df61: 0x6ccdc220, 0x1df62: 0x6d1cae20, 0x1df63: 0x6c423e20, + 0x1df64: 0x6c1be820, 0x1df65: 0x6cf60220, 0x1df66: 0x6ccf4620, 0x1df67: 0x6ca42420, + 0x1df68: 0x6ce75e20, 0x1df69: 0x6cf8a820, 0x1df6a: 0x6c197620, 0x1df6b: 0x6c51dc20, + 0x1df6c: 0x6c199620, 0x1df6d: 0x6d30dc20, 0x1df6e: 0x6cf9f620, 0x1df6f: 0x6ce14620, + 0x1df70: 0x6d407e20, 0x1df71: 0x6d407c20, 0x1df72: 0x6c85b620, 0x1df73: 0x6c6f6020, + 0x1df74: 0x6c3fca20, 0x1df75: 0x6d2fa620, 0x1df76: 0x6c41d220, 0x1df77: 0x6cb6ea20, + 0x1df78: 0x6ccd8020, 0x1df79: 0x6cbf1c20, 0x1df7a: 0x6d1adc20, 0x1df7b: 0x6cfc0c20, + 0x1df7c: 0x6c21fe20, 0x1df7d: 0x6c743620, 0x1df7e: 0x6cbdd420, 0x1df7f: 0x6c1b2020, + // Block 0x77e, offset 0x1df80 + 0x1df80: 0x6c220020, 0x1df81: 0x6c192820, 0x1df82: 0x6c192a20, 0x1df83: 0x6c2eb620, + 0x1df84: 0x6c70a020, 0x1df85: 0x6c174820, 0x1df86: 0x6c2b3020, 0x1df87: 0x6cf89620, + 0x1df88: 0x6d2d7a20, 0x1df89: 0x6c745c20, 0x1df8a: 0x6d26be20, 0x1df8b: 0x6cc11820, + 0x1df8c: 0x6c606220, 0x1df8d: 0x6c1b3e20, 0x1df8e: 0x6c1e9420, 0x1df8f: 0x6c486420, + 0x1df90: 0x6d096820, 0x1df91: 0x6d3e6220, 0x1df92: 0x6ce59420, 0x1df93: 0x6c349c20, + 0x1df94: 0x6c8b1c20, 0x1df95: 0x6c41e220, 0x1df96: 0x6cdd3220, 0x1df97: 0x6c245020, + 0x1df98: 0x6cf79820, 0x1df99: 0x6d2fd220, 0x1df9a: 0x6cdaf420, 0x1df9b: 0x6d1b0020, + 0x1df9c: 0x6c715020, 0x1df9d: 0x6c66c420, 0x1df9e: 0x6cc3f420, 0x1df9f: 0x6ce1a020, + 0x1dfa0: 0x6c21d020, 0x1dfa1: 0x6c250420, 0x1dfa2: 0x6c92b820, 0x1dfa3: 0x6cc27420, + 0x1dfa4: 0x6c298c20, 0x1dfa5: 0x6cbfc820, 0x1dfa6: 0x6d3e9220, 0x1dfa7: 0x6ce37e20, + 0x1dfa8: 0x6cc14a20, 0x1dfa9: 0x6c1c8820, 0x1dfaa: 0x6c5a1e20, 0x1dfab: 0x6cbc0a20, + 0x1dfac: 0x6cbbc220, 0x1dfad: 0x6c69ce20, 0x1dfae: 0x6d2a9a20, 0x1dfaf: 0x6ce44220, + 0x1dfb0: 0x6c37b020, 0x1dfb1: 0x6d298420, 0x1dfb2: 0x6d298820, 0x1dfb3: 0x6d40a620, + 0x1dfb4: 0x6cabbc20, 0x1dfb5: 0x6c064220, 0x1dfb6: 0x6c7a8c20, 0x1dfb7: 0x6c77f220, + 0x1dfb8: 0x6c33cc20, 0x1dfb9: 0x6c743820, 0x1dfba: 0x6c3d6c20, 0x1dfbb: 0x6c190020, + 0x1dfbc: 0x6c658c20, 0x1dfbd: 0x6c39e420, 0x1dfbe: 0x6d352420, 0x1dfbf: 0x6cdde620, + // Block 0x77f, offset 0x1dfc0 + 0x1dfc0: 0x6d26a820, 0x1dfc1: 0x6c03b620, 0x1dfc2: 0x6cb5d820, 0x1dfc3: 0x6d26aa20, + 0x1dfc4: 0x6cbab420, 0x1dfc5: 0x6ceba820, 0x1dfc6: 0x6cdf2420, 0x1dfc7: 0x6d17c820, + 0x1dfc8: 0x6ca72620, 0x1dfc9: 0x6c8d0e20, 0x1dfca: 0x6c9a9420, 0x1dfcb: 0x6c038220, + 0x1dfcc: 0x6c2e5820, 0x1dfcd: 0x6c7a4420, 0x1dfce: 0x6ceb2420, 0x1dfcf: 0x6c636620, + 0x1dfd0: 0x6c220620, 0x1dfd1: 0x6cad7820, 0x1dfd2: 0x6cb83820, 0x1dfd3: 0x6d3b0020, + 0x1dfd4: 0x6c70a220, 0x1dfd5: 0x6c2d1c20, 0x1dfd6: 0x6d346e20, 0x1dfd7: 0x6c3d7620, + 0x1dfd8: 0x6cac5a20, 0x1dfd9: 0x6c724e20, 0x1dfda: 0x6ccce620, 0x1dfdb: 0x6c0fe420, + 0x1dfdc: 0x6ca5ec20, 0x1dfdd: 0x6c724620, 0x1dfde: 0x6c861e20, 0x1dfdf: 0x6c449a20, + 0x1dfe0: 0x6d152420, 0x1dfe1: 0x6c5ef420, 0x1dfe2: 0x6c34fe20, 0x1dfe3: 0x6cfc1c20, + 0x1dfe4: 0x6c685420, 0x1dfe5: 0x6c350020, 0x1dfe6: 0x6d39b620, 0x1dfe7: 0x6cc30620, + 0x1dfe8: 0x6c7aec20, 0x1dfe9: 0x6d3b6820, 0x1dfea: 0x6c4b5a20, 0x1dfeb: 0x6cbf4420, + 0x1dfec: 0x6c7cd620, 0x1dfed: 0x6cfdce20, 0x1dfee: 0x6c1c3620, 0x1dfef: 0x6c927620, + 0x1dff0: 0x6cb11c20, 0x1dff1: 0x6d367020, 0x1dff2: 0x6c63d020, 0x1dff3: 0x6ce5dc20, + 0x1dff4: 0x6c113820, 0x1dff5: 0x6c669820, 0x1dff6: 0x6cde6a20, 0x1dff7: 0x6cbb8020, + 0x1dff8: 0x6c09e220, 0x1dff9: 0x6cfab220, 0x1dffa: 0x6c350220, 0x1dffb: 0x6c5ef620, + 0x1dffc: 0x6c714620, 0x1dffd: 0x6c625420, 0x1dffe: 0x6cd4fa20, 0x1dfff: 0x6ce8e020, + // Block 0x780, offset 0x1e000 + 0x1e000: 0x6c1f6420, 0x1e001: 0x6c6e9a20, 0x1e002: 0x6ca85620, 0x1e003: 0x6cfef820, + 0x1e004: 0x6c10b020, 0x1e005: 0x6d091420, 0x1e006: 0x6c259a20, 0x1e007: 0x6ca25020, + 0x1e008: 0x6cd4fc20, 0x1e009: 0x6c896220, 0x1e00a: 0x6d1e5420, 0x1e00b: 0x6c691820, + 0x1e00c: 0x6c1dce20, 0x1e00d: 0x6cbb9220, 0x1e00e: 0x6ca1da20, 0x1e00f: 0x6cde9420, + 0x1e010: 0x6c66c620, 0x1e011: 0x6cb64620, 0x1e012: 0x6cf29e20, 0x1e013: 0x6cf00e20, + 0x1e014: 0x6c219820, 0x1e015: 0x6c6b2a20, 0x1e016: 0x6c609a20, 0x1e017: 0x6ca86420, + 0x1e018: 0x6c70be20, 0x1e019: 0x6c70c020, 0x1e01a: 0x6c950c20, 0x1e01b: 0x6c92bc20, + 0x1e01c: 0x6c839a20, 0x1e01d: 0x6c57f020, 0x1e01e: 0x6c728420, 0x1e01f: 0x6c1b4e20, + 0x1e020: 0x6ced4820, 0x1e021: 0x6cc31420, 0x1e022: 0x6ce2fa20, 0x1e023: 0x6c0f4c20, + 0x1e024: 0x6d40d220, 0x1e025: 0x6cbce220, 0x1e026: 0x6d160820, 0x1e027: 0x6c245e20, + 0x1e028: 0x6d3fbc20, 0x1e029: 0x6c113e20, 0x1e02a: 0x6d3fbe20, 0x1e02b: 0x6caf1620, + 0x1e02c: 0x6d36c820, 0x1e02d: 0x6d32d820, 0x1e02e: 0x6c2d2a20, 0x1e02f: 0x6d349420, + 0x1e030: 0x6d21aa20, 0x1e031: 0x6c346220, 0x1e032: 0x6c340c20, 0x1e033: 0x6c202820, + 0x1e034: 0x6d1e6020, 0x1e035: 0x6d380820, 0x1e036: 0x6c2c9e20, 0x1e037: 0x6d2c9220, + 0x1e038: 0x6c191020, 0x1e039: 0x6c1fce20, 0x1e03a: 0x6c66c820, 0x1e03b: 0x6c486e20, + 0x1e03c: 0x6ce13e20, 0x1e03d: 0x6c71d620, 0x1e03e: 0x6c3efa20, 0x1e03f: 0x6d40d820, + // Block 0x781, offset 0x1e040 + 0x1e040: 0x6c2eec20, 0x1e041: 0x6cb12e20, 0x1e042: 0x6cc76020, 0x1e043: 0x6cab1020, + 0x1e044: 0x6ce38020, 0x1e045: 0x6c142020, 0x1e046: 0x6ce9ec20, 0x1e047: 0x6c65ee20, + 0x1e048: 0x6c29f420, 0x1e049: 0x6c25ca20, 0x1e04a: 0x6cb53a20, 0x1e04b: 0x6cdeb020, + 0x1e04c: 0x6cbae420, 0x1e04d: 0x6ca74020, 0x1e04e: 0x6c2ce020, 0x1e04f: 0x6ce38a20, + 0x1e050: 0x6c60ce20, 0x1e051: 0x6ca87e20, 0x1e052: 0x6cac7820, 0x1e053: 0x6c8e3a20, + 0x1e054: 0x6d29aa20, 0x1e055: 0x6c0a7a20, 0x1e056: 0x6c1cf220, 0x1e057: 0x6c931020, + 0x1e058: 0x6c8a4220, 0x1e059: 0x6c246e20, 0x1e05a: 0x6ce0da20, 0x1e05b: 0x6c27a420, + 0x1e05c: 0x6cdb5420, 0x1e05d: 0x6cf81e20, 0x1e05e: 0x6c7ce220, 0x1e05f: 0x6c5f7820, + 0x1e060: 0x6d34ae20, 0x1e061: 0x6cbaee20, 0x1e062: 0x6c2ba820, 0x1e063: 0x6cac8420, + 0x1e064: 0x6d3fd020, 0x1e065: 0x6c887020, 0x1e066: 0x6c085c20, 0x1e067: 0x6d2a2a20, + 0x1e068: 0x6ca74820, 0x1e069: 0x6c0d0220, 0x1e06a: 0x6ce9d220, 0x1e06b: 0x6c717e20, + 0x1e06c: 0x6c2ac020, 0x1e06d: 0x6c137020, 0x1e06e: 0x6cfaf420, 0x1e06f: 0x6c38dc20, + 0x1e070: 0x6c1ec820, 0x1e071: 0x6d37d820, 0x1e072: 0x6c33be20, 0x1e073: 0x6c0e9a20, + 0x1e074: 0x6c247420, 0x1e075: 0x6c247620, 0x1e076: 0x6c74f220, 0x1e077: 0x6c74f420, + 0x1e078: 0x6c8c7e20, 0x1e079: 0x6cde0620, 0x1e07a: 0x6cbbc420, 0x1e07b: 0x6c73bc20, + 0x1e07c: 0x6cb4a220, 0x1e07d: 0x6c89d420, 0x1e07e: 0x6c33c020, 0x1e07f: 0x6c249620, + // Block 0x782, offset 0x1e080 + 0x1e080: 0x6c7c1220, 0x1e081: 0x6d2a9c20, 0x1e082: 0x6c26d220, 0x1e083: 0x6c0abc20, + 0x1e084: 0x6c0abe20, 0x1e085: 0x6d3a3820, 0x1e086: 0x6c72be20, 0x1e087: 0x6c1ec020, + 0x1e088: 0x6cbc7020, 0x1e089: 0x6c33d020, 0x1e08a: 0x6c1e0820, 0x1e08b: 0x6c5f9620, + 0x1e08c: 0x6cf48e20, 0x1e08d: 0x6d271820, 0x1e08e: 0x6ca74c20, 0x1e08f: 0x6c8c8220, + 0x1e090: 0x6c8b7620, 0x1e091: 0x6d34c020, 0x1e092: 0x6c878220, 0x1e093: 0x6d376a20, + 0x1e094: 0x6c156e20, 0x1e095: 0x6c1ece20, 0x1e096: 0x6c32e820, 0x1e097: 0x6cf12420, + 0x1e098: 0x6c900620, 0x1e099: 0x6c8c8c20, 0x1e09a: 0x6cfb0e20, 0x1e09b: 0x6cf12e20, + 0x1e09c: 0x6d414020, 0x1e09d: 0x6c801220, 0x1e09e: 0x6d028e20, 0x1e09f: 0x6cc4fa20, + 0x1e0a0: 0x6cc95e20, 0x1e0a1: 0x6ca8ce20, 0x1e0a2: 0x6cdef620, 0x1e0a3: 0x6cc22c20, + 0x1e0a4: 0x6c6c1220, 0x1e0a5: 0x6c249a20, 0x1e0a6: 0x6c260620, 0x1e0a7: 0x6cf83020, + 0x1e0a8: 0x6c7cc620, 0x1e0a9: 0x6c753a20, 0x1e0aa: 0x6c8c9020, 0x1e0ab: 0x6ccfa420, + 0x1e0ac: 0x6c457e20, 0x1e0ad: 0x6c27d820, 0x1e0ae: 0x6c3c0a20, 0x1e0af: 0x6cc10820, + 0x1e0b0: 0x6ce3c220, 0x1e0b1: 0x6c349e20, 0x1e0b2: 0x6c34a020, 0x1e0b3: 0x6c459a20, + 0x1e0b4: 0x6c80da20, 0x1e0b5: 0x6cc60e20, 0x1e0b6: 0x6c95be20, 0x1e0b7: 0x6c007620, + 0x1e0b8: 0x6c5f2420, 0x1e0b9: 0x6c715220, 0x1e0ba: 0x6ce18020, 0x1e0bb: 0x6c79ae20, + 0x1e0bc: 0x6c81de20, 0x1e0bd: 0x6d0dd820, 0x1e0be: 0x6c9abc20, 0x1e0bf: 0x6c775c20, + // Block 0x783, offset 0x1e0c0 + 0x1e0c0: 0x6cc15420, 0x1e0c1: 0x6c90ce20, 0x1e0c2: 0x6c81ea20, 0x1e0c3: 0x6c34c020, + 0x1e0c4: 0x6d34b420, 0x1e0c5: 0x6d0f3c20, 0x1e0c6: 0x6ce3cc20, 0x1e0c7: 0x6c2a4e20, + 0x1e0c8: 0x6d1d7420, 0x1e0c9: 0x6d249a20, 0x1e0ca: 0x6c17ce20, 0x1e0cb: 0x6d0b8220, + 0x1e0cc: 0x6c4ade20, 0x1e0cd: 0x6c756420, 0x1e0ce: 0x6cf08220, 0x1e0cf: 0x6d269e20, + 0x1e0d0: 0x6d032c20, 0x1e0d1: 0x6c275420, 0x1e0d2: 0x6d078a20, 0x1e0d3: 0x6c393e20, + 0x1e0d4: 0x6cc5e420, 0x1e0d5: 0x6cccde20, 0x1e0d6: 0x6c7bc020, 0x1e0d7: 0x6cd4d620, + 0x1e0d8: 0x6cea5220, 0x1e0d9: 0x6c18c420, 0x1e0da: 0x6c276820, 0x1e0db: 0x6c361c20, + 0x1e0dc: 0x6ca34020, 0x1e0dd: 0x6cb5dc20, 0x1e0de: 0x6c98de20, 0x1e0df: 0x6cc86020, + 0x1e0e0: 0x6cc5ec20, 0x1e0e1: 0x6cb98c20, 0x1e0e2: 0x6d3ba620, 0x1e0e3: 0x6c52a020, + 0x1e0e4: 0x6c54d220, 0x1e0e5: 0x6cc19c20, 0x1e0e6: 0x6c7bfa20, 0x1e0e7: 0x6c2bfc20, + 0x1e0e8: 0x6c8d1220, 0x1e0e9: 0x6c277420, 0x1e0ea: 0x6c022c20, 0x1e0eb: 0x6d31e220, + 0x1e0ec: 0x6c395620, 0x1e0ed: 0x6c7baa20, 0x1e0ee: 0x6d102220, 0x1e0ef: 0x6cae7420, + 0x1e0f0: 0x6c072820, 0x1e0f1: 0x6c471420, 0x1e0f2: 0x6c471620, 0x1e0f3: 0x6cad5e20, + 0x1e0f4: 0x6d3b0420, 0x1e0f5: 0x6cc71020, 0x1e0f6: 0x6c364a20, 0x1e0f7: 0x6c038420, + 0x1e0f8: 0x6d38d420, 0x1e0f9: 0x6d353020, 0x1e0fa: 0x6d110020, 0x1e0fb: 0x6c780020, + 0x1e0fc: 0x6d17ca20, 0x1e0fd: 0x6d364420, 0x1e0fe: 0x6cd3a820, 0x1e0ff: 0x6cb2b820, + // Block 0x784, offset 0x1e100 + 0x1e100: 0x6c375e20, 0x1e101: 0x6c45f420, 0x1e102: 0x6c713a20, 0x1e103: 0x6c69a820, + 0x1e104: 0x6c49ee20, 0x1e105: 0x6c514c20, 0x1e106: 0x6c766420, 0x1e107: 0x6cc30820, + 0x1e108: 0x6d389420, 0x1e109: 0x6d293c20, 0x1e10a: 0x6d367220, 0x1e10b: 0x6ccef620, + 0x1e10c: 0x6c89c420, 0x1e10d: 0x6d23ae20, 0x1e10e: 0x6cce7c20, 0x1e10f: 0x6d1f5c20, + 0x1e110: 0x6ced9020, 0x1e111: 0x6d1af820, 0x1e112: 0x6d307420, 0x1e113: 0x6ced3e20, + 0x1e114: 0x6c3f7c20, 0x1e115: 0x6cbe5420, 0x1e116: 0x6d38a620, 0x1e117: 0x6ca60620, + 0x1e118: 0x6c838420, 0x1e119: 0x6d308420, 0x1e11a: 0x6d2e7a20, 0x1e11b: 0x6c89ca20, + 0x1e11c: 0x6d3e8220, 0x1e11d: 0x6c5aee20, 0x1e11e: 0x6cee3820, 0x1e11f: 0x6c21d220, + 0x1e120: 0x6c4ccc20, 0x1e121: 0x6c76e820, 0x1e122: 0x6d160a20, 0x1e123: 0x6caec220, + 0x1e124: 0x6cba7a20, 0x1e125: 0x6c4be620, 0x1e126: 0x6ca73a20, 0x1e127: 0x6cb2c820, + 0x1e128: 0x6c496020, 0x1e129: 0x6c075220, 0x1e12a: 0x6c950e20, 0x1e12b: 0x6cac0420, + 0x1e12c: 0x6c896c20, 0x1e12d: 0x6cc88020, 0x1e12e: 0x6cc76220, 0x1e12f: 0x6c631020, + 0x1e130: 0x6d0fda20, 0x1e131: 0x6cfba020, 0x1e132: 0x6c201020, 0x1e133: 0x6c23fe20, + 0x1e134: 0x6c211c20, 0x1e135: 0x6c443c20, 0x1e136: 0x6d1f7220, 0x1e137: 0x6c52cc20, + 0x1e138: 0x6cd50820, 0x1e139: 0x6c405820, 0x1e13a: 0x6d3e9420, 0x1e13b: 0x6c3efc20, + 0x1e13c: 0x6cf16820, 0x1e13d: 0x6c07cc20, 0x1e13e: 0x6d2e2020, 0x1e13f: 0x6d21c020, + // Block 0x785, offset 0x1e140 + 0x1e140: 0x6cf16a20, 0x1e141: 0x6ce1f420, 0x1e142: 0x6c47dc20, 0x1e143: 0x6d319e20, + 0x1e144: 0x6cfa0220, 0x1e145: 0x6d25b820, 0x1e146: 0x6c931220, 0x1e147: 0x6c689e20, + 0x1e148: 0x6c178620, 0x1e149: 0x6d3bb420, 0x1e14a: 0x6cf0f820, 0x1e14b: 0x6c5d0420, + 0x1e14c: 0x6d098c20, 0x1e14d: 0x6d30b820, 0x1e14e: 0x6c69d020, 0x1e14f: 0x6d2e9020, + 0x1e150: 0x6c102620, 0x1e151: 0x6c81c620, 0x1e152: 0x6c3ba820, 0x1e153: 0x6c386a20, + 0x1e154: 0x6c8bfc20, 0x1e155: 0x6c445220, 0x1e156: 0x6ccb8e20, 0x1e157: 0x6c76fc20, + 0x1e158: 0x6c58be20, 0x1e159: 0x6d162820, 0x1e15a: 0x6c60f020, 0x1e15b: 0x6d3cc020, + 0x1e15c: 0x6c377820, 0x1e15d: 0x6d246820, 0x1e15e: 0x6c671c20, 0x1e15f: 0x6c52e020, + 0x1e160: 0x6c829220, 0x1e161: 0x6cae2c20, 0x1e162: 0x6c878420, 0x1e163: 0x6c879a20, + 0x1e164: 0x6c91a020, 0x1e165: 0x6c8c9220, 0x1e166: 0x6c17ca20, 0x1e167: 0x6d0b6a20, + 0x1e168: 0x6c4ac020, 0x1e169: 0x6d077a20, 0x1e16a: 0x6c272a20, 0x1e16b: 0x6cc5ca20, + 0x1e16c: 0x6d3ba020, 0x1e16d: 0x6c35e220, 0x1e16e: 0x6c94e020, 0x1e16f: 0x6cc85420, + 0x1e170: 0x6c529820, 0x1e171: 0x6c46fa20, 0x1e172: 0x6c77ec20, 0x1e173: 0x6c914820, + 0x1e174: 0x6d38d020, 0x1e175: 0x6d350a20, 0x1e176: 0x6d171020, 0x1e177: 0x6c54b220, + 0x1e178: 0x6d31c420, 0x1e179: 0x6c85ba20, 0x1e17a: 0x6d10dc20, 0x1e17b: 0x6cbe3620, + 0x1e17c: 0x6cd36220, 0x1e17d: 0x6d293420, 0x1e17e: 0x6d35d020, 0x1e17f: 0x6c699620, + // Block 0x786, offset 0x1e180 + 0x1e180: 0x6d386c20, 0x1e181: 0x6cc2d020, 0x1e182: 0x6c922e20, 0x1e183: 0x6c699820, + 0x1e184: 0x6d305420, 0x1e185: 0x6c3f6020, 0x1e186: 0x6c89b220, 0x1e187: 0x6ca72a20, + 0x1e188: 0x6c072a20, 0x1e189: 0x6c5abc20, 0x1e18a: 0x6c4bcc20, 0x1e18b: 0x6cee2620, + 0x1e18c: 0x6c895820, 0x1e18d: 0x6c21c420, 0x1e18e: 0x6d3e4820, 0x1e18f: 0x6c23f420, + 0x1e190: 0x6c3eae20, 0x1e191: 0x6c630c20, 0x1e192: 0x6cf15e20, 0x1e193: 0x6cd4f020, + 0x1e194: 0x6cae2020, 0x1e195: 0x6d259a20, 0x1e196: 0x6cf9e220, 0x1e197: 0x6ca72e20, + 0x1e198: 0x6c92c420, 0x1e199: 0x6d309420, 0x1e19a: 0x6c8be220, 0x1e19b: 0x6d02ae20, + 0x1e19c: 0x6c471820, 0x1e19d: 0x6c224a20, 0x1e19e: 0x6c225220, 0x1e19f: 0x6cb0a820, + 0x1e1a0: 0x6d41ba20, 0x1e1a1: 0x6c0bb020, 0x1e1a2: 0x6c7e8e20, 0x1e1a3: 0x6c7e9020, + 0x1e1a4: 0x6c226020, 0x1e1a5: 0x6d08ea20, 0x1e1a6: 0x6c050620, 0x1e1a7: 0x6c0bc020, + 0x1e1a8: 0x6c0bc220, 0x1e1a9: 0x6c0bc420, 0x1e1aa: 0x6d08ec20, 0x1e1ab: 0x6c0bcc20, + 0x1e1ac: 0x6c04a820, 0x1e1ad: 0x6c227e20, 0x1e1ae: 0x6c0bd620, 0x1e1af: 0x6c0bda20, + 0x1e1b0: 0x6c18a020, 0x1e1b1: 0x6cc7fc20, 0x1e1b2: 0x6ca9bc20, 0x1e1b3: 0x6ca9c220, + 0x1e1b4: 0x6c160420, 0x1e1b5: 0x6c21a820, 0x1e1b6: 0x6c21a420, 0x1e1b7: 0x6d198820, + 0x1e1b8: 0x6cc61820, 0x1e1b9: 0x6c0ae820, 0x1e1ba: 0x6c0aea20, 0x1e1bb: 0x6cd22e20, + 0x1e1bc: 0x6cc83220, 0x1e1bd: 0x6c89d620, 0x1e1be: 0x6c267620, 0x1e1bf: 0x6c14b620, + // Block 0x787, offset 0x1e1c0 + 0x1e1c0: 0x6c416420, 0x1e1c1: 0x6cb8a020, 0x1e1c2: 0x6d207620, 0x1e1c3: 0x6d207820, + 0x1e1c4: 0x6cb73420, 0x1e1c5: 0x6d0a6820, 0x1e1c6: 0x6d145820, 0x1e1c7: 0x6c4ce420, + 0x1e1c8: 0x6c972020, 0x1e1c9: 0x6cb4ca20, 0x1e1ca: 0x6d288620, 0x1e1cb: 0x6cee4a20, + 0x1e1cc: 0x6ce91e20, 0x1e1cd: 0x6d3cca20, 0x1e1ce: 0x6d1c5820, 0x1e1cf: 0x6ce3d620, + 0x1e1d0: 0x6d281620, 0x1e1d1: 0x6c6cd620, 0x1e1d2: 0x6c4f5c20, 0x1e1d3: 0x6d0b7a20, + 0x1e1d4: 0x6c390620, 0x1e1d5: 0x6cf4b020, 0x1e1d6: 0x6c267820, 0x1e1d7: 0x6c354c20, + 0x1e1d8: 0x6c4d1c20, 0x1e1d9: 0x6d30e420, 0x1e1da: 0x6d384c20, 0x1e1db: 0x6c6cd820, + 0x1e1dc: 0x6d25de20, 0x1e1dd: 0x6ceee420, 0x1e1de: 0x6c87ee20, 0x1e1df: 0x6c1b0220, + 0x1e1e0: 0x6c180420, 0x1e1e1: 0x6ca68020, 0x1e1e2: 0x6ce57420, 0x1e1e3: 0x6d359020, + 0x1e1e4: 0x6d147c20, 0x1e1e5: 0x6c6efc20, 0x1e1e6: 0x6c633220, 0x1e1e7: 0x6c18a620, + 0x1e1e8: 0x6c273a20, 0x1e1e9: 0x6c378820, 0x1e1ea: 0x6c2b5e20, 0x1e1eb: 0x6cb36a20, + 0x1e1ec: 0x6d3ab620, 0x1e1ed: 0x6c2e6420, 0x1e1ee: 0x6d2ab020, 0x1e1ef: 0x6ce20620, + 0x1e1f0: 0x6cd5a220, 0x1e1f1: 0x6ceaf620, 0x1e1f2: 0x6cc28620, 0x1e1f3: 0x6c6e5020, + 0x1e1f4: 0x6c5b2a20, 0x1e1f5: 0x6c306820, 0x1e1f6: 0x6d203420, 0x1e1f7: 0x6c9c4020, + 0x1e1f8: 0x6c083c20, 0x1e1f9: 0x6c5e9c20, 0x1e1fa: 0x6ca39c20, 0x1e1fb: 0x6d14b220, + 0x1e1fc: 0x6c6a9a20, 0x1e1fd: 0x6d3c5820, 0x1e1fe: 0x6c8ade20, 0x1e1ff: 0x6d0a7420, + // Block 0x788, offset 0x1e200 + 0x1e200: 0x6ce9f620, 0x1e201: 0x6cd98420, 0x1e202: 0x6cd34a20, 0x1e203: 0x6ce20e20, + 0x1e204: 0x6cacf820, 0x1e205: 0x6c546820, 0x1e206: 0x6ca68a20, 0x1e207: 0x6c33e420, + 0x1e208: 0x6c6f0420, 0x1e209: 0x6d084620, 0x1e20a: 0x6d0a7620, 0x1e20b: 0x6c101220, + 0x1e20c: 0x6d1e9c20, 0x1e20d: 0x6cfeac20, 0x1e20e: 0x6cc03a20, 0x1e20f: 0x6ce82420, + 0x1e210: 0x6d3a0a20, 0x1e211: 0x6cc03c20, 0x1e212: 0x6c2c3420, 0x1e213: 0x6c2c3620, + 0x1e214: 0x6ce89a20, 0x1e215: 0x6c6e6c20, 0x1e216: 0x6ce3e620, 0x1e217: 0x6c310a20, + 0x1e218: 0x6d15e020, 0x1e219: 0x6d30ee20, 0x1e21a: 0x6ce6f220, 0x1e21b: 0x6c4a2020, + 0x1e21c: 0x6cf4da20, 0x1e21d: 0x6cd36420, 0x1e21e: 0x6c1a6a20, 0x1e21f: 0x6cda9820, + 0x1e220: 0x6d2a7a20, 0x1e221: 0x6cc43620, 0x1e222: 0x6c3ca420, 0x1e223: 0x6c87fa20, + 0x1e224: 0x6cddc820, 0x1e225: 0x6c5b3220, 0x1e226: 0x6c850e20, 0x1e227: 0x6c483620, + 0x1e228: 0x6c7f0220, 0x1e229: 0x6c07b820, 0x1e22a: 0x6c262420, 0x1e22b: 0x6c743e20, + 0x1e22c: 0x6c083e20, 0x1e22d: 0x6c591820, 0x1e22e: 0x6c271620, 0x1e22f: 0x6c924a20, + 0x1e230: 0x6d1f3220, 0x1e231: 0x6d387c20, 0x1e232: 0x6c6d0820, 0x1e233: 0x6d232620, + 0x1e234: 0x6c219620, 0x1e235: 0x6c7c6820, 0x1e236: 0x6cee7620, 0x1e237: 0x6ce3f020, + 0x1e238: 0x6d178420, 0x1e239: 0x6c26a220, 0x1e23a: 0x6d25e620, 0x1e23b: 0x6c954420, + 0x1e23c: 0x6c087420, 0x1e23d: 0x6caaf220, 0x1e23e: 0x6d213a20, 0x1e23f: 0x6c296a20, + // Block 0x789, offset 0x1e240 + 0x1e240: 0x6cdbf620, 0x1e241: 0x6c33f420, 0x1e242: 0x6cdc4220, 0x1e243: 0x6d0d9820, + 0x1e244: 0x6c1ffc20, 0x1e245: 0x6c1b2c20, 0x1e246: 0x6ce33420, 0x1e247: 0x6d235c20, + 0x1e248: 0x6cd26c20, 0x1e249: 0x6d315a20, 0x1e24a: 0x6d1f4020, 0x1e24b: 0x6d283820, + 0x1e24c: 0x6c364c20, 0x1e24d: 0x6c0ba420, 0x1e24e: 0x6c4cec20, 0x1e24f: 0x6c364e20, + 0x1e250: 0x6cf9ca20, 0x1e251: 0x6c59ca20, 0x1e252: 0x6cc07020, 0x1e253: 0x6c2a1820, + 0x1e254: 0x6c26ac20, 0x1e255: 0x6cef1620, 0x1e256: 0x6ca45020, 0x1e257: 0x6d150820, + 0x1e258: 0x6c46be20, 0x1e259: 0x6d111620, 0x1e25a: 0x6c1e4620, 0x1e25b: 0x6c8e7420, + 0x1e25c: 0x6d0a9820, 0x1e25d: 0x6cde6c20, 0x1e25e: 0x6c2c7420, 0x1e25f: 0x6c1b4020, + 0x1e260: 0x6d25ec20, 0x1e261: 0x6cdada20, 0x1e262: 0x6cde6e20, 0x1e263: 0x6cba1420, + 0x1e264: 0x6c96f220, 0x1e265: 0x6d111820, 0x1e266: 0x6c499c20, 0x1e267: 0x6d2ed220, + 0x1e268: 0x6c025820, 0x1e269: 0x6cd3bc20, 0x1e26a: 0x6c10ea20, 0x1e26b: 0x6c1c4e20, + 0x1e26c: 0x6cdaf620, 0x1e26d: 0x6d2a1c20, 0x1e26e: 0x6d300420, 0x1e26f: 0x6c340220, + 0x1e270: 0x6c2c8820, 0x1e271: 0x6c90ac20, 0x1e272: 0x6c1b5020, 0x1e273: 0x6c25c220, + 0x1e274: 0x6c8bd620, 0x1e275: 0x6d41f020, 0x1e276: 0x6cc54820, 0x1e277: 0x6cb91820, + 0x1e278: 0x6d085820, 0x1e279: 0x6d23d620, 0x1e27a: 0x6d154e20, 0x1e27b: 0x6cf51c20, + 0x1e27c: 0x6c8a1620, 0x1e27d: 0x6c729820, 0x1e27e: 0x6cd3e220, 0x1e27f: 0x6c0a6020, + // Block 0x78a, offset 0x1e280 + 0x1e280: 0x6d10bc20, 0x1e281: 0x6c974220, 0x1e282: 0x6d022220, 0x1e283: 0x6cdc9420, + 0x1e284: 0x6c4d2a20, 0x1e285: 0x6d2d9e20, 0x1e286: 0x6ce2b020, 0x1e287: 0x6c37aa20, + 0x1e288: 0x6c9ea220, 0x1e289: 0x6c0b0c20, 0x1e28a: 0x6c0b1420, 0x1e28b: 0x6c7e5220, + 0x1e28c: 0x6c847a20, 0x1e28d: 0x6d25c820, 0x1e28e: 0x6d117620, 0x1e28f: 0x6c957c20, + 0x1e290: 0x6c854c20, 0x1e291: 0x6d169e20, 0x1e292: 0x6ce65a20, 0x1e293: 0x6c2ad420, + 0x1e294: 0x6cb6c420, 0x1e295: 0x6d1d8220, 0x1e296: 0x6cccb420, 0x1e297: 0x6c4dc820, + 0x1e298: 0x6d20a420, 0x1e299: 0x6c982220, 0x1e29a: 0x6cc78820, 0x1e29b: 0x6cbef620, + 0x1e29c: 0x6cedb420, 0x1e29d: 0x6c7bd620, 0x1e29e: 0x6c3d3620, 0x1e29f: 0x6c777a20, + 0x1e2a0: 0x6c0d2020, 0x1e2a1: 0x6c398220, 0x1e2a2: 0x6d03bc20, 0x1e2a3: 0x6ca30220, + 0x1e2a4: 0x6d02a620, 0x1e2a5: 0x6cd04220, 0x1e2a6: 0x6c051620, 0x1e2a7: 0x6d253620, + 0x1e2a8: 0x6c259020, 0x1e2a9: 0x6c5d8a20, 0x1e2aa: 0x6d006a20, 0x1e2ab: 0x6c052c20, + 0x1e2ac: 0x6cf34e20, 0x1e2ad: 0x6c720220, 0x1e2ae: 0x6d1ef620, 0x1e2af: 0x6c4dd020, + 0x1e2b0: 0x6cdf1220, 0x1e2b1: 0x6cbf9820, 0x1e2b2: 0x6c092220, 0x1e2b3: 0x6caf2e20, + 0x1e2b4: 0x6c0dbe20, 0x1e2b5: 0x6ccec620, 0x1e2b6: 0x6c06de20, 0x1e2b7: 0x6cec1020, + 0x1e2b8: 0x6c2bd020, 0x1e2b9: 0x6d404620, 0x1e2ba: 0x6d12c820, 0x1e2bb: 0x6c8b9e20, + 0x1e2bc: 0x6c7b8820, 0x1e2bd: 0x6c4a3c20, 0x1e2be: 0x6d398620, 0x1e2bf: 0x6cd19e20, + // Block 0x78b, offset 0x1e2c0 + 0x1e2c0: 0x6c7a2c20, 0x1e2c1: 0x6d22dc20, 0x1e2c2: 0x6c40e020, 0x1e2c3: 0x6c50ce20, + 0x1e2c4: 0x6cbc9a20, 0x1e2c5: 0x6d359420, 0x1e2c6: 0x6c5fe620, 0x1e2c7: 0x6c585c20, + 0x1e2c8: 0x6c545e20, 0x1e2c9: 0x6d03c820, 0x1e2ca: 0x6c682a20, 0x1e2cb: 0x6cf76a20, + 0x1e2cc: 0x6c4a7620, 0x1e2cd: 0x6caab420, 0x1e2ce: 0x6c80a220, 0x1e2cf: 0x6c63a620, + 0x1e2d0: 0x6c7b1420, 0x1e2d1: 0x6d333e20, 0x1e2d2: 0x6c813820, 0x1e2d3: 0x6d281e20, + 0x1e2d4: 0x6d0c6c20, 0x1e2d5: 0x6c19c220, 0x1e2d6: 0x6c30fc20, 0x1e2d7: 0x6cf5ae20, + 0x1e2d8: 0x6c935220, 0x1e2d9: 0x6c3f4e20, 0x1e2da: 0x6cf3aa20, 0x1e2db: 0x6c3e2620, + 0x1e2dc: 0x6c433e20, 0x1e2dd: 0x6c500a20, 0x1e2de: 0x6c80a420, 0x1e2df: 0x6c63aa20, + 0x1e2e0: 0x6c44f020, 0x1e2e1: 0x6c759a20, 0x1e2e2: 0x6d1ce220, 0x1e2e3: 0x6c0eca20, + 0x1e2e4: 0x6cf86820, 0x1e2e5: 0x6c06f420, 0x1e2e6: 0x6c85bc20, 0x1e2e7: 0x6d279220, + 0x1e2e8: 0x6c108c20, 0x1e2e9: 0x6cff7a20, 0x1e2ea: 0x6cb4e020, 0x1e2eb: 0x6cafd420, + 0x1e2ec: 0x6cbe3c20, 0x1e2ed: 0x6c4c1a20, 0x1e2ee: 0x6d386e20, 0x1e2ef: 0x6cdfd820, + 0x1e2f0: 0x6d404c20, 0x1e2f1: 0x6cb27e20, 0x1e2f2: 0x6c7ef020, 0x1e2f3: 0x6ca5d020, + 0x1e2f4: 0x6c186220, 0x1e2f5: 0x6d1f2420, 0x1e2f6: 0x6c10b420, 0x1e2f7: 0x6cfd6820, + 0x1e2f8: 0x6c27d020, 0x1e2f9: 0x6c711e20, 0x1e2fa: 0x6d1dba20, 0x1e2fb: 0x6cbb7420, + 0x1e2fc: 0x6d13ea20, 0x1e2fd: 0x6c30a620, 0x1e2fe: 0x6d0d7220, 0x1e2ff: 0x6c99f220, + // Block 0x78c, offset 0x1e300 + 0x1e300: 0x6cc91a20, 0x1e301: 0x6c071820, 0x1e302: 0x6c361e20, 0x1e303: 0x6cd4d820, + 0x1e304: 0x6c735e20, 0x1e305: 0x6d225220, 0x1e306: 0x6d282820, 0x1e307: 0x6c53f420, + 0x1e308: 0x6c7c6a20, 0x1e309: 0x6cfd6e20, 0x1e30a: 0x6cfd7020, 0x1e30b: 0x6cd9a820, + 0x1e30c: 0x6ce0f820, 0x1e30d: 0x6ca00220, 0x1e30e: 0x6cf63220, 0x1e30f: 0x6cc7fe20, + 0x1e310: 0x6c1f4c20, 0x1e311: 0x6d3e4a20, 0x1e312: 0x6d405820, 0x1e313: 0x6d12f820, + 0x1e314: 0x6cf36c20, 0x1e315: 0x6cfd7c20, 0x1e316: 0x6d27a820, 0x1e317: 0x6c504220, + 0x1e318: 0x6d1d9220, 0x1e319: 0x6c08e620, 0x1e31a: 0x6c998820, 0x1e31b: 0x6c176420, + 0x1e31c: 0x6c3d8620, 0x1e31d: 0x6c8a6e20, 0x1e31e: 0x6d1a7820, 0x1e31f: 0x6d3b8020, + 0x1e320: 0x6c56a820, 0x1e321: 0x6cbb8220, 0x1e322: 0x6d0c1820, 0x1e323: 0x6d2ebc20, + 0x1e324: 0x6c97e020, 0x1e325: 0x6cbb8420, 0x1e326: 0x6d065020, 0x1e327: 0x6c2adc20, + 0x1e328: 0x6c0a9c20, 0x1e329: 0x6d0a2820, 0x1e32a: 0x6c0a0c20, 0x1e32b: 0x6d2b8420, + 0x1e32c: 0x6cef2620, 0x1e32d: 0x6d335820, 0x1e32e: 0x6c99a820, 0x1e32f: 0x6ccd9620, + 0x1e330: 0x6c8bc820, 0x1e331: 0x6cb33420, 0x1e332: 0x6c27f020, 0x1e333: 0x6c9b4020, + 0x1e334: 0x6d133220, 0x1e335: 0x6c12b820, 0x1e336: 0x6c7b3620, 0x1e337: 0x6c3c6420, + 0x1e338: 0x6c9b4220, 0x1e339: 0x6d406420, 0x1e33a: 0x6c7c0220, 0x1e33b: 0x6c88d020, + 0x1e33c: 0x6d29a220, 0x1e33d: 0x6c153020, 0x1e33e: 0x6d1eb820, 0x1e33f: 0x6c5f6420, + // Block 0x78d, offset 0x1e340 + 0x1e340: 0x6d0ed820, 0x1e341: 0x6c154820, 0x1e342: 0x6c25f820, 0x1e343: 0x6c8d8820, + 0x1e344: 0x6c583a20, 0x1e345: 0x6cf74020, 0x1e346: 0x6c3c7820, 0x1e347: 0x6d29b620, + 0x1e348: 0x6c875820, 0x1e349: 0x6d1fa420, 0x1e34a: 0x6c2f5a20, 0x1e34b: 0x6cc02020, + 0x1e34c: 0x6d3d4020, 0x1e34d: 0x6cae1820, 0x1e34e: 0x6d391e20, 0x1e34f: 0x6d15e220, + 0x1e350: 0x6c418e20, 0x1e351: 0x6d20fe20, 0x1e352: 0x6c6fba20, 0x1e353: 0x6d0d7420, + 0x1e354: 0x6d41ae20, 0x1e355: 0x6c98e020, 0x1e356: 0x6d323e20, 0x1e357: 0x6d06c820, + 0x1e358: 0x6c311820, 0x1e359: 0x6d315420, 0x1e35a: 0x6c3b3020, 0x1e35b: 0x6d263e20, + 0x1e35c: 0x6c40ae20, 0x1e35d: 0x6d282a20, 0x1e35e: 0x6cdf7220, 0x1e35f: 0x6ce46a20, + 0x1e360: 0x6cb83a20, 0x1e361: 0x6ceb2c20, 0x1e362: 0x6c243e20, 0x1e363: 0x6c4da820, + 0x1e364: 0x6c471a20, 0x1e365: 0x6cda5020, 0x1e366: 0x6c37ee20, 0x1e367: 0x6c1dc620, + 0x1e368: 0x6d293e20, 0x1e369: 0x6ca03a20, 0x1e36a: 0x6c81d620, 0x1e36b: 0x6c21ca20, + 0x1e36c: 0x6c1e4e20, 0x1e36d: 0x6d205020, 0x1e36e: 0x6ce76020, 0x1e36f: 0x6d353c20, + 0x1e370: 0x6cfab420, 0x1e371: 0x6c67ec20, 0x1e372: 0x6c1a3020, 0x1e373: 0x6d1b6c20, + 0x1e374: 0x6ce8e220, 0x1e375: 0x6c69b220, 0x1e376: 0x6c9a1a20, 0x1e377: 0x6c7aa420, + 0x1e378: 0x6cdb8820, 0x1e379: 0x6c833c20, 0x1e37a: 0x6cb44420, 0x1e37b: 0x6d41c220, + 0x1e37c: 0x6c4d4420, 0x1e37d: 0x6d0e9c20, 0x1e37e: 0x6ccc8c20, 0x1e37f: 0x6ca77e20, + // Block 0x78e, offset 0x1e380 + 0x1e380: 0x6cef3420, 0x1e381: 0x6c92c620, 0x1e382: 0x6c803620, 0x1e383: 0x6d0c2c20, + 0x1e384: 0x6ce23820, 0x1e385: 0x6cadc220, 0x1e386: 0x6d2e1220, 0x1e387: 0x6c215e20, + 0x1e388: 0x6ce00a20, 0x1e389: 0x6d41ca20, 0x1e38a: 0x6d3ca620, 0x1e38b: 0x6c246020, + 0x1e38c: 0x6c7d8220, 0x1e38d: 0x6ce38220, 0x1e38e: 0x6cfba220, 0x1e38f: 0x6c317620, + 0x1e390: 0x6c55c420, 0x1e391: 0x6d065c20, 0x1e392: 0x6d040820, 0x1e393: 0x6ce07c20, + 0x1e394: 0x6cc09a20, 0x1e395: 0x6c216420, 0x1e396: 0x6d285a20, 0x1e397: 0x6cb3a620, + 0x1e398: 0x6c783620, 0x1e399: 0x6cd9e620, 0x1e39a: 0x6c9c7620, 0x1e39b: 0x6cc31820, + 0x1e39c: 0x6c1e3220, 0x1e39d: 0x6c25cc20, 0x1e39e: 0x6d285e20, 0x1e39f: 0x6d1e7e20, + 0x1e3a0: 0x6c022220, 0x1e3a1: 0x6d2ce420, 0x1e3a2: 0x6c4d4a20, 0x1e3a3: 0x6ce14a20, + 0x1e3a4: 0x6c680020, 0x1e3a5: 0x6cb1a220, 0x1e3a6: 0x6c191820, 0x1e3a7: 0x6d244020, + 0x1e3a8: 0x6c846620, 0x1e3a9: 0x6d2a2c20, 0x1e3aa: 0x6c818620, 0x1e3ab: 0x6d142c20, + 0x1e3ac: 0x6c680a20, 0x1e3ad: 0x6c102820, 0x1e3ae: 0x6c69d420, 0x1e3af: 0x6cf71e20, + 0x1e3b0: 0x6ce03c20, 0x1e3b1: 0x6c37f220, 0x1e3b2: 0x6ca9dc20, 0x1e3b3: 0x6d193620, + 0x1e3b4: 0x6c854620, 0x1e3b5: 0x6c72c020, 0x1e3b6: 0x6d0efc20, 0x1e3b7: 0x6d193820, + 0x1e3b8: 0x6ca78020, 0x1e3b9: 0x6cc7ec20, 0x1e3ba: 0x6d09cc20, 0x1e3bb: 0x6c1e0a20, + 0x1e3bc: 0x6d0f1220, 0x1e3bd: 0x6c8db420, 0x1e3be: 0x6c9cc820, 0x1e3bf: 0x6c9cca20, + // Block 0x78f, offset 0x1e3c0 + 0x1e3c0: 0x6ca78420, 0x1e3c1: 0x6d036020, 0x1e3c2: 0x6c69ea20, 0x1e3c3: 0x6ccc9620, + 0x1e3c4: 0x6c9cd420, 0x1e3c5: 0x6d0f2420, 0x1e3c6: 0x6c0b7820, 0x1e3c7: 0x6c111e20, + 0x1e3c8: 0x6cd37620, 0x1e3c9: 0x6d204a20, 0x1e3ca: 0x6cd39220, 0x1e3cb: 0x6cd40220, + 0x1e3cc: 0x6c84fc20, 0x1e3cd: 0x6d382020, 0x1e3ce: 0x6d12aa20, 0x1e3cf: 0x6c89c020, + 0x1e3d0: 0x6c847c20, 0x1e3d1: 0x6c6c2e20, 0x1e3d2: 0x6c6d7c20, 0x1e3d3: 0x6cc02220, + 0x1e3d4: 0x6d15d820, 0x1e3d5: 0x6c8a6c20, 0x1e3d6: 0x6c29c020, 0x1e3d7: 0x6d2f6220, + 0x1e3d8: 0x6c2f5c20, 0x1e3d9: 0x6cb38220, 0x1e3da: 0x6cc04220, 0x1e3db: 0x6c034220, + 0x1e3dc: 0x6c3f5620, 0x1e3dd: 0x6d314820, 0x1e3de: 0x6d344a20, 0x1e3df: 0x6c034420, + 0x1e3e0: 0x6c949820, 0x1e3e1: 0x6c3f5820, 0x1e3e2: 0x6ca3a020, 0x1e3e3: 0x6c2e2020, + 0x1e3e4: 0x6ccd8620, 0x1e3e5: 0x6cbc2220, 0x1e3e6: 0x6c79ea20, 0x1e3e7: 0x6c203420, + 0x1e3e8: 0x6d3f0e20, 0x1e3e9: 0x6c390e20, 0x1e3ea: 0x6c573620, 0x1e3eb: 0x6c573820, + 0x1e3ec: 0x6c4eb820, 0x1e3ed: 0x6c427c20, 0x1e3ee: 0x6cb5de20, 0x1e3ef: 0x6c985c20, + 0x1e3f0: 0x6cc64620, 0x1e3f1: 0x6c2c5220, 0x1e3f2: 0x6cd8be20, 0x1e3f3: 0x6cf87e20, + 0x1e3f4: 0x6d178620, 0x1e3f5: 0x6c146620, 0x1e3f6: 0x6cd1b620, 0x1e3f7: 0x6ce91a20, + 0x1e3f8: 0x6cf60620, 0x1e3f9: 0x6caa7420, 0x1e3fa: 0x6cb8dc20, 0x1e3fb: 0x6cc0c020, + 0x1e3fc: 0x6c668420, 0x1e3fd: 0x6cb09a20, 0x1e3fe: 0x6d128220, 0x1e3ff: 0x6c6c4820, + // Block 0x790, offset 0x1e400 + 0x1e400: 0x6c03a020, 0x1e401: 0x6c399620, 0x1e402: 0x6c18d020, 0x1e403: 0x6d03ee20, + 0x1e404: 0x6c30ee20, 0x1e405: 0x6d26c220, 0x1e406: 0x6cb8e620, 0x1e407: 0x6c3d7820, + 0x1e408: 0x6caf6820, 0x1e409: 0x6ca34820, 0x1e40a: 0x6d02d820, 0x1e40b: 0x6c356e20, + 0x1e40c: 0x6c746020, 0x1e40d: 0x6c33f820, 0x1e40e: 0x6c464c20, 0x1e40f: 0x6d1ae620, + 0x1e410: 0x6cb99a20, 0x1e411: 0x6c04ce20, 0x1e412: 0x6cc97620, 0x1e413: 0x6cc57220, + 0x1e414: 0x6c174a20, 0x1e415: 0x6ca99620, 0x1e416: 0x6c3b3220, 0x1e417: 0x6d27ec20, + 0x1e418: 0x6c614620, 0x1e419: 0x6cbd7820, 0x1e41a: 0x6caf6a20, 0x1e41b: 0x6c4c2020, + 0x1e41c: 0x6c535a20, 0x1e41d: 0x6d1a6c20, 0x1e41e: 0x6c757220, 0x1e41f: 0x6cd1ca20, + 0x1e420: 0x6d17ce20, 0x1e421: 0x6d37ba20, 0x1e422: 0x6cf7f020, 0x1e423: 0x6c413a20, + 0x1e424: 0x6cc64820, 0x1e425: 0x6c5d8e20, 0x1e426: 0x6cdf7620, 0x1e427: 0x6c778820, + 0x1e428: 0x6d264020, 0x1e429: 0x6c934a20, 0x1e42a: 0x6c365020, 0x1e42b: 0x6cf21c20, + 0x1e42c: 0x6c345420, 0x1e42d: 0x6d3e7220, 0x1e42e: 0x6ca64020, 0x1e42f: 0x6ce8d020, + 0x1e430: 0x6cd3aa20, 0x1e431: 0x6c9f6820, 0x1e432: 0x6c472220, 0x1e433: 0x6c780e20, + 0x1e434: 0x6c8d2420, 0x1e435: 0x6c0dec20, 0x1e436: 0x6cd8d020, 0x1e437: 0x6c47a420, + 0x1e438: 0x6c0f1c20, 0x1e439: 0x6caf7820, 0x1e43a: 0x6d238420, 0x1e43b: 0x6cd8d220, + 0x1e43c: 0x6d424820, 0x1e43d: 0x6c101820, 0x1e43e: 0x6d1f5020, 0x1e43f: 0x6ce4b020, + // Block 0x791, offset 0x1e440 + 0x1e440: 0x6c642220, 0x1e441: 0x6d317620, 0x1e442: 0x6cd2d420, 0x1e443: 0x6cd3ac20, + 0x1e444: 0x6d347a20, 0x1e445: 0x6c725220, 0x1e446: 0x6c14d220, 0x1e447: 0x6cd1da20, + 0x1e448: 0x6cd1dc20, 0x1e449: 0x6d089e20, 0x1e44a: 0x6d2f6820, 0x1e44b: 0x6c065420, + 0x1e44c: 0x6c514e20, 0x1e44d: 0x6c09e620, 0x1e44e: 0x6cd10e20, 0x1e44f: 0x6c1e9620, + 0x1e450: 0x6cd27820, 0x1e451: 0x6c0f1e20, 0x1e452: 0x6d3b0e20, 0x1e453: 0x6c1c3820, + 0x1e454: 0x6d289220, 0x1e455: 0x6cb31420, 0x1e456: 0x6ce76220, 0x1e457: 0x6cb9aa20, + 0x1e458: 0x6c3eb020, 0x1e459: 0x6d2d3020, 0x1e45a: 0x6c8f0c20, 0x1e45b: 0x6cb8f820, + 0x1e45c: 0x6c3eb220, 0x1e45d: 0x6c864020, 0x1e45e: 0x6d26ca20, 0x1e45f: 0x6caf7a20, + 0x1e460: 0x6d0f5e20, 0x1e461: 0x6c04fe20, 0x1e462: 0x6c0e8020, 0x1e463: 0x6c6b0020, + 0x1e464: 0x6c465420, 0x1e465: 0x6cd5ec20, 0x1e466: 0x6d32da20, 0x1e467: 0x6ca24c20, + 0x1e468: 0x6cf7f220, 0x1e469: 0x6cf7f420, 0x1e46a: 0x6c2c7620, 0x1e46b: 0x6c637420, + 0x1e46c: 0x6ca29e20, 0x1e46d: 0x6ce06420, 0x1e46e: 0x6c588820, 0x1e46f: 0x6d15f220, + 0x1e470: 0x6cd7fa20, 0x1e471: 0x6c7bfe20, 0x1e472: 0x6c761e20, 0x1e473: 0x6c06ce20, + 0x1e474: 0x6c66a020, 0x1e475: 0x6ce77020, 0x1e476: 0x6d03f420, 0x1e477: 0x6c537820, + 0x1e478: 0x6c691c20, 0x1e479: 0x6c1bbc20, 0x1e47a: 0x6c37d820, 0x1e47b: 0x6c961a20, + 0x1e47c: 0x6c0dee20, 0x1e47d: 0x6cd3be20, 0x1e47e: 0x6ca1dc20, 0x1e47f: 0x6c637820, + // Block 0x792, offset 0x1e480 + 0x1e480: 0x6d1a8620, 0x1e481: 0x6c757c20, 0x1e482: 0x6d389e20, 0x1e483: 0x6c1d5620, + 0x1e484: 0x6cfdf620, 0x1e485: 0x6ce77220, 0x1e486: 0x6ca14220, 0x1e487: 0x6c833e20, + 0x1e488: 0x6c5f0e20, 0x1e489: 0x6d23b020, 0x1e48a: 0x6d071e20, 0x1e48b: 0x6cc57820, + 0x1e48c: 0x6d421a20, 0x1e48d: 0x6d36a220, 0x1e48e: 0x6cbf4c20, 0x1e48f: 0x6ccd8e20, + 0x1e490: 0x6c1c5020, 0x1e491: 0x6cfc2220, 0x1e492: 0x6d03f620, 0x1e493: 0x6cc30e20, + 0x1e494: 0x6caf8020, 0x1e495: 0x6ce5fe20, 0x1e496: 0x6d39c020, 0x1e497: 0x6cfe4820, + 0x1e498: 0x6ca01220, 0x1e499: 0x6c7ada20, 0x1e49a: 0x6d112c20, 0x1e49b: 0x6cfac220, + 0x1e49c: 0x6cfb7620, 0x1e49d: 0x6d04ea20, 0x1e49e: 0x6c757e20, 0x1e49f: 0x6c13aa20, + 0x1e4a0: 0x6c81b620, 0x1e4a1: 0x6c607820, 0x1e4a2: 0x6cb06620, 0x1e4a3: 0x6cc7ba20, + 0x1e4a4: 0x6c9cfe20, 0x1e4a5: 0x6d140820, 0x1e4a6: 0x6d19fa20, 0x1e4a7: 0x6c49f220, + 0x1e4a8: 0x6c019020, 0x1e4a9: 0x6c2fd420, 0x1e4aa: 0x6d1fe020, 0x1e4ab: 0x6ccb3820, + 0x1e4ac: 0x6c77c620, 0x1e4ad: 0x6cb9b620, 0x1e4ae: 0x6c944220, 0x1e4af: 0x6cd90020, + 0x1e4b0: 0x6c003020, 0x1e4b1: 0x6c2e3220, 0x1e4b2: 0x6c4efe20, 0x1e4b3: 0x6cc8de20, + 0x1e4b4: 0x6cd3cc20, 0x1e4b5: 0x6c795020, 0x1e4b6: 0x6cc09220, 0x1e4b7: 0x6cff0c20, + 0x1e4b8: 0x6d308620, 0x1e4b9: 0x6d054e20, 0x1e4ba: 0x6d2a0c20, 0x1e4bb: 0x6ce37020, + 0x1e4bc: 0x6c263820, 0x1e4bd: 0x6c487020, 0x1e4be: 0x6c53d220, 0x1e4bf: 0x6d37c820, + // Block 0x793, offset 0x1e4c0 + 0x1e4c0: 0x6ce7de20, 0x1e4c1: 0x6c93ac20, 0x1e4c2: 0x6c9a2220, 0x1e4c3: 0x6c80e220, + 0x1e4c4: 0x6ced4a20, 0x1e4c5: 0x6d02e620, 0x1e4c6: 0x6d27c420, 0x1e4c7: 0x6c075420, + 0x1e4c8: 0x6cf51e20, 0x1e4c9: 0x6cdb0c20, 0x1e4ca: 0x6d23dc20, 0x1e4cb: 0x6c151420, + 0x1e4cc: 0x6c2fb620, 0x1e4cd: 0x6c0f4e20, 0x1e4ce: 0x6c4f0020, 0x1e4cf: 0x6c63de20, + 0x1e4d0: 0x6c538420, 0x1e4d1: 0x6c249220, 0x1e4d2: 0x6c3c6620, 0x1e4d3: 0x6c14d620, + 0x1e4d4: 0x6ced4c20, 0x1e4d5: 0x6d36d020, 0x1e4d6: 0x6cd82620, 0x1e4d7: 0x6d07ca20, + 0x1e4d8: 0x6c575620, 0x1e4d9: 0x6d228220, 0x1e4da: 0x6ce59e20, 0x1e4db: 0x6c45fa20, + 0x1e4dc: 0x6d3d9420, 0x1e4dd: 0x6c94bc20, 0x1e4de: 0x6d03fc20, 0x1e4df: 0x6cbde620, + 0x1e4e0: 0x6cd0c420, 0x1e4e1: 0x6c4e2e20, 0x1e4e2: 0x6c94be20, 0x1e4e3: 0x6d128a20, + 0x1e4e4: 0x6c1eac20, 0x1e4e5: 0x6d2bae20, 0x1e4e6: 0x6c70c420, 0x1e4e7: 0x6cfd0220, + 0x1e4e8: 0x6ce60020, 0x1e4e9: 0x6c987020, 0x1e4ea: 0x6cb4b420, 0x1e4eb: 0x6c843620, + 0x1e4ec: 0x6cacc020, 0x1e4ed: 0x6cc8e020, 0x1e4ee: 0x6c1a3220, 0x1e4ef: 0x6c435820, + 0x1e4f0: 0x6c852820, 0x1e4f1: 0x6ce28220, 0x1e4f2: 0x6c0e4420, 0x1e4f3: 0x6d3b2420, + 0x1e4f4: 0x6d327e20, 0x1e4f5: 0x6ce87a20, 0x1e4f6: 0x6c8f1820, 0x1e4f7: 0x6d41d420, + 0x1e4f8: 0x6c729a20, 0x1e4f9: 0x6c16fa20, 0x1e4fa: 0x6d25f020, 0x1e4fb: 0x6c66d820, + 0x1e4fc: 0x6c429220, 0x1e4fd: 0x6c2e4020, 0x1e4fe: 0x6ce24020, 0x1e4ff: 0x6c16c620, + // Block 0x794, offset 0x1e500 + 0x1e500: 0x6c951020, 0x1e501: 0x6c4cd020, 0x1e502: 0x6c8d5c20, 0x1e503: 0x6c06ba20, + 0x1e504: 0x6c92de20, 0x1e505: 0x6c845020, 0x1e506: 0x6cbade20, 0x1e507: 0x6cb3e220, + 0x1e508: 0x6c732e20, 0x1e509: 0x6c9f7a20, 0x1e50a: 0x6d41d620, 0x1e50b: 0x6caeca20, + 0x1e50c: 0x6c01d020, 0x1e50d: 0x6caf9020, 0x1e50e: 0x6cfd1420, 0x1e50f: 0x6d0afa20, + 0x1e510: 0x6d3c6820, 0x1e511: 0x6c834620, 0x1e512: 0x6c783220, 0x1e513: 0x6c798a20, + 0x1e514: 0x6cdea820, 0x1e515: 0x6c7d8420, 0x1e516: 0x6c31bc20, 0x1e517: 0x6ca59020, + 0x1e518: 0x6c20e220, 0x1e519: 0x6d3e9820, 0x1e51a: 0x6d32ec20, 0x1e51b: 0x6c078c20, + 0x1e51c: 0x6ca87620, 0x1e51d: 0x6d403620, 0x1e51e: 0x6c216620, 0x1e51f: 0x6ce01420, + 0x1e520: 0x6c2fba20, 0x1e521: 0x6cb65420, 0x1e522: 0x6cb9cc20, 0x1e523: 0x6d3cac20, + 0x1e524: 0x6c5f4820, 0x1e525: 0x6d23fa20, 0x1e526: 0x6c6cb620, 0x1e527: 0x6c496620, + 0x1e528: 0x6c990820, 0x1e529: 0x6c167c20, 0x1e52a: 0x6ce51c20, 0x1e52b: 0x6cf6de20, + 0x1e52c: 0x6c891e20, 0x1e52d: 0x6ce24220, 0x1e52e: 0x6c482820, 0x1e52f: 0x6c263a20, + 0x1e530: 0x6cd61420, 0x1e531: 0x6d319c20, 0x1e532: 0x6c92e020, 0x1e533: 0x6c9be820, + 0x1e534: 0x6c92e220, 0x1e535: 0x6c571820, 0x1e536: 0x6c0c8020, 0x1e537: 0x6c40cc20, + 0x1e538: 0x6c7f2c20, 0x1e539: 0x6c790e20, 0x1e53a: 0x6c39ec20, 0x1e53b: 0x6cf55820, + 0x1e53c: 0x6ca3d820, 0x1e53d: 0x6ced9c20, 0x1e53e: 0x6d299c20, 0x1e53f: 0x6c570020, + // Block 0x795, offset 0x1e540 + 0x1e540: 0x6c2a8620, 0x1e541: 0x6cfada20, 0x1e542: 0x6cb10220, 0x1e543: 0x6c5d6020, + 0x1e544: 0x6c89cc20, 0x1e545: 0x6c384820, 0x1e546: 0x6c9ad820, 0x1e547: 0x6c767220, + 0x1e548: 0x6d1bf220, 0x1e549: 0x6c2b4a20, 0x1e54a: 0x6c892220, 0x1e54b: 0x6c4c4020, + 0x1e54c: 0x6cfc3620, 0x1e54d: 0x6c328220, 0x1e54e: 0x6ce8fc20, 0x1e54f: 0x6cef4420, + 0x1e550: 0x6d3fca20, 0x1e551: 0x6c406a20, 0x1e552: 0x6cc76620, 0x1e553: 0x6c60d220, + 0x1e554: 0x6c36ba20, 0x1e555: 0x6c758620, 0x1e556: 0x6c191420, 0x1e557: 0x6ce38c20, + 0x1e558: 0x6d2c5820, 0x1e559: 0x6c56d420, 0x1e55a: 0x6d0fe020, 0x1e55b: 0x6c32de20, + 0x1e55c: 0x6cfa0420, 0x1e55d: 0x6d21c220, 0x1e55e: 0x6c795a20, 0x1e55f: 0x6d03aa20, + 0x1e560: 0x6c5a1020, 0x1e561: 0x6cf03220, 0x1e562: 0x6c406c20, 0x1e563: 0x6d2f7620, + 0x1e564: 0x6c13b620, 0x1e565: 0x6cbcee20, 0x1e566: 0x6cd20620, 0x1e567: 0x6c52d620, + 0x1e568: 0x6c7ca820, 0x1e569: 0x6ce51e20, 0x1e56a: 0x6ca1ee20, 0x1e56b: 0x6cbbbc20, + 0x1e56c: 0x6cbbbe20, 0x1e56d: 0x6c543820, 0x1e56e: 0x6ce7e020, 0x1e56f: 0x6c236c20, + 0x1e570: 0x6c58ae20, 0x1e571: 0x6d136620, 0x1e572: 0x6c9f7e20, 0x1e573: 0x6c66e620, + 0x1e574: 0x6c32a420, 0x1e575: 0x6c66da20, 0x1e576: 0x6cd94220, 0x1e577: 0x6c7caa20, + 0x1e578: 0x6c55d220, 0x1e579: 0x6d07d820, 0x1e57a: 0x6c34b620, 0x1e57b: 0x6c6b4a20, + 0x1e57c: 0x6d31a020, 0x1e57d: 0x6c0b0e20, 0x1e57e: 0x6d37d020, 0x1e57f: 0x6d3ea220, + // Block 0x796, offset 0x1e580 + 0x1e580: 0x6d04fe20, 0x1e581: 0x6d129020, 0x1e582: 0x6c9a6e20, 0x1e583: 0x6cac3420, + 0x1e584: 0x6c003620, 0x1e585: 0x6c6c0c20, 0x1e586: 0x6cba9420, 0x1e587: 0x6c9a3220, + 0x1e588: 0x6cdda220, 0x1e589: 0x6c26ca20, 0x1e58a: 0x6c059620, 0x1e58b: 0x6cfa0a20, + 0x1e58c: 0x6c887a20, 0x1e58d: 0x6cddaa20, 0x1e58e: 0x6c769a20, 0x1e58f: 0x6c8ec020, + 0x1e590: 0x6d116420, 0x1e591: 0x6d137420, 0x1e592: 0x6caa2e20, 0x1e593: 0x6cf23e20, + 0x1e594: 0x6cc6d420, 0x1e595: 0x6ce15420, 0x1e596: 0x6cddac20, 0x1e597: 0x6cbaf220, + 0x1e598: 0x6c86e020, 0x1e599: 0x6cd7a620, 0x1e59a: 0x6c20e420, 0x1e59b: 0x6c0f9620, + 0x1e59c: 0x6cac8620, 0x1e59d: 0x6c266e20, 0x1e59e: 0x6c089620, 0x1e59f: 0x6cca9020, + 0x1e5a0: 0x6c429420, 0x1e5a1: 0x6d3ea620, 0x1e5a2: 0x6cf38c20, 0x1e5a3: 0x6d1cb420, + 0x1e5a4: 0x6c5a7e20, 0x1e5a5: 0x6ce5aa20, 0x1e5a6: 0x6c8ec220, 0x1e5a7: 0x6c767420, + 0x1e5a8: 0x6cdd0220, 0x1e5a9: 0x6ccc2220, 0x1e5aa: 0x6cd9f020, 0x1e5ab: 0x6ceda820, + 0x1e5ac: 0x6c507620, 0x1e5ad: 0x6d327020, 0x1e5ae: 0x6d327220, 0x1e5af: 0x6c80e820, + 0x1e5b0: 0x6d18fc20, 0x1e5b1: 0x6d25c420, 0x1e5b2: 0x6ce18620, 0x1e5b3: 0x6ca88a20, + 0x1e5b4: 0x6cf7b020, 0x1e5b5: 0x6c638c20, 0x1e5b6: 0x6c43ba20, 0x1e5b7: 0x6c96a820, + 0x1e5b8: 0x6c730620, 0x1e5b9: 0x6cd9a220, 0x1e5ba: 0x6d413420, 0x1e5bb: 0x6cddae20, + 0x1e5bc: 0x6cfa5620, 0x1e5bd: 0x6c3d0220, 0x1e5be: 0x6cf21e20, 0x1e5bf: 0x6ca2ec20, + // Block 0x797, offset 0x1e5c0 + 0x1e5c0: 0x6c91fa20, 0x1e5c1: 0x6cddb020, 0x1e5c2: 0x6cab6020, 0x1e5c3: 0x6d40f620, + 0x1e5c4: 0x6ce96e20, 0x1e5c5: 0x6d050820, 0x1e5c6: 0x6c49b220, 0x1e5c7: 0x6d08cc20, + 0x1e5c8: 0x6c892620, 0x1e5c9: 0x6cd48620, 0x1e5ca: 0x6c02f820, 0x1e5cb: 0x6c97d420, + 0x1e5cc: 0x6ca18020, 0x1e5cd: 0x6c956620, 0x1e5ce: 0x6c0a9e20, 0x1e5cf: 0x6cf0fe20, + 0x1e5d0: 0x6c8ed020, 0x1e5d1: 0x6c2bb220, 0x1e5d2: 0x6cca3620, 0x1e5d3: 0x6d401220, + 0x1e5d4: 0x6d158a20, 0x1e5d5: 0x6c932020, 0x1e5d6: 0x6c028220, 0x1e5d7: 0x6c796220, + 0x1e5d8: 0x6cbafa20, 0x1e5d9: 0x6c24f820, 0x1e5da: 0x6cb54e20, 0x1e5db: 0x6c16d220, + 0x1e5dc: 0x6ce0dc20, 0x1e5dd: 0x6c981020, 0x1e5de: 0x6d1dd020, 0x1e5df: 0x6c160620, + 0x1e5e0: 0x6c3c7220, 0x1e5e1: 0x6c6ebe20, 0x1e5e2: 0x6c0c4820, 0x1e5e3: 0x6cd62a20, + 0x1e5e4: 0x6c912420, 0x1e5e5: 0x6d055820, 0x1e5e6: 0x6c237420, 0x1e5e7: 0x6c8fce20, + 0x1e5e8: 0x6d29b020, 0x1e5e9: 0x6c670820, 0x1e5ea: 0x6c12a220, 0x1e5eb: 0x6c849220, + 0x1e5ec: 0x6cfa5c20, 0x1e5ed: 0x6cf72020, 0x1e5ee: 0x6c776020, 0x1e5ef: 0x6cd6f820, + 0x1e5f0: 0x6c086220, 0x1e5f1: 0x6d2f4a20, 0x1e5f2: 0x6cba9620, 0x1e5f3: 0x6c19a620, + 0x1e5f4: 0x6c933420, 0x1e5f5: 0x6c576820, 0x1e5f6: 0x6c60f220, 0x1e5f7: 0x6cb47220, + 0x1e5f8: 0x6c5c8c20, 0x1e5f9: 0x6cbb5020, 0x1e5fa: 0x6cb32420, 0x1e5fb: 0x6c8c0220, + 0x1e5fc: 0x6ccb9020, 0x1e5fd: 0x6d055a20, 0x1e5fe: 0x6cca3c20, 0x1e5ff: 0x6c19a820, + // Block 0x798, offset 0x1e600 + 0x1e600: 0x6c7d3a20, 0x1e601: 0x6cd84820, 0x1e602: 0x6c8f5420, 0x1e603: 0x6ca4d220, + 0x1e604: 0x6c5a2220, 0x1e605: 0x6cb1e020, 0x1e606: 0x6cdcb020, 0x1e607: 0x6c38ea20, + 0x1e608: 0x6cbc0e20, 0x1e609: 0x6cc2aa20, 0x1e60a: 0x6d0fee20, 0x1e60b: 0x6ce0de20, + 0x1e60c: 0x6cfe6620, 0x1e60d: 0x6c750420, 0x1e60e: 0x6c68a420, 0x1e60f: 0x6d41fc20, + 0x1e610: 0x6c8a4e20, 0x1e611: 0x6cbd0420, 0x1e612: 0x6c819020, 0x1e613: 0x6c338020, + 0x1e614: 0x6d030620, 0x1e615: 0x6d295820, 0x1e616: 0x6c5f8e20, 0x1e617: 0x6c661e20, + 0x1e618: 0x6d37da20, 0x1e619: 0x6c2af620, 0x1e61a: 0x6d0b0620, 0x1e61b: 0x6d1d5c20, + 0x1e61c: 0x6c331e20, 0x1e61d: 0x6c750620, 0x1e61e: 0x6caa3020, 0x1e61f: 0x6d295a20, + 0x1e620: 0x6cb4a420, 0x1e621: 0x6ce60620, 0x1e622: 0x6c38ec20, 0x1e623: 0x6d2f4c20, + 0x1e624: 0x6c2f8a20, 0x1e625: 0x6ccdda20, 0x1e626: 0x6c764220, 0x1e627: 0x6c653820, + 0x1e628: 0x6c3af020, 0x1e629: 0x6cdcba20, 0x1e62a: 0x6c920020, 0x1e62b: 0x6c730c20, + 0x1e62c: 0x6c5c9420, 0x1e62d: 0x6d246a20, 0x1e62e: 0x6c889c20, 0x1e62f: 0x6d3dcc20, + 0x1e630: 0x6cbbc820, 0x1e631: 0x6c672220, 0x1e632: 0x6d3dde20, 0x1e633: 0x6c828c20, + 0x1e634: 0x6c0ac820, 0x1e635: 0x6ce60820, 0x1e636: 0x6c58c220, 0x1e637: 0x6d138c20, + 0x1e638: 0x6c346c20, 0x1e639: 0x6c4cd620, 0x1e63a: 0x6c29ac20, 0x1e63b: 0x6c72ce20, + 0x1e63c: 0x6c3bac20, 0x1e63d: 0x6c26d620, 0x1e63e: 0x6c077220, 0x1e63f: 0x6d194a20, + // Block 0x799, offset 0x1e640 + 0x1e640: 0x6c010820, 0x1e641: 0x6d3fe220, 0x1e642: 0x6d0aba20, 0x1e643: 0x6c2e4e20, + 0x1e644: 0x6d3b4e20, 0x1e645: 0x6c528620, 0x1e646: 0x6d3cc220, 0x1e647: 0x6c5fa220, + 0x1e648: 0x6ca8be20, 0x1e649: 0x6c51a620, 0x1e64a: 0x6c5e4c20, 0x1e64b: 0x6cbe6020, + 0x1e64c: 0x6c0d7020, 0x1e64d: 0x6d1c3e20, 0x1e64e: 0x6c7d4020, 0x1e64f: 0x6ca93c20, + 0x1e650: 0x6d060e20, 0x1e651: 0x6c672620, 0x1e652: 0x6c672820, 0x1e653: 0x6cba9a20, + 0x1e654: 0x6c142620, 0x1e655: 0x6d377220, 0x1e656: 0x6c9f1620, 0x1e657: 0x6c84ce20, + 0x1e658: 0x6c829820, 0x1e659: 0x6c5fa620, 0x1e65a: 0x6d416620, 0x1e65b: 0x6c7c2220, + 0x1e65c: 0x6cce4420, 0x1e65d: 0x6caefc20, 0x1e65e: 0x6c7ece20, 0x1e65f: 0x6c320020, + 0x1e660: 0x6cd7b020, 0x1e661: 0x6c21ec20, 0x1e662: 0x6c942820, 0x1e663: 0x6c0c6220, + 0x1e664: 0x6c068420, 0x1e665: 0x6c920420, 0x1e666: 0x6cfd5c20, 0x1e667: 0x6c7b7e20, + 0x1e668: 0x6c901020, 0x1e669: 0x6c36fa20, 0x1e66a: 0x6c91a220, 0x1e66b: 0x6d02f820, + 0x1e66c: 0x6c672c20, 0x1e66d: 0x6c809420, 0x1e66e: 0x6c0fd620, 0x1e66f: 0x6c655620, + 0x1e670: 0x6d125820, 0x1e671: 0x6c157e20, 0x1e672: 0x6cfda620, 0x1e673: 0x6c673020, + 0x1e674: 0x6cf76220, 0x1e675: 0x6c49c820, 0x1e676: 0x6c125620, 0x1e677: 0x6ca8d220, + 0x1e678: 0x6c831620, 0x1e679: 0x6c249c20, 0x1e67a: 0x6cc23020, 0x1e67b: 0x6cacc820, + 0x1e67c: 0x6c959420, 0x1e67d: 0x6d414420, 0x1e67e: 0x6c947a20, 0x1e67f: 0x6d2a3820, + // Block 0x79a, offset 0x1e680 + 0x1e680: 0x6ca8d820, 0x1e681: 0x6c753e20, 0x1e682: 0x6ce19820, 0x1e683: 0x6cd58e20, + 0x1e684: 0x6c801c20, 0x1e685: 0x6c6c2220, 0x1e686: 0x6c40c420, 0x1e687: 0x6d15b420, + 0x1e688: 0x6d312020, 0x1e689: 0x6c2f5220, 0x1e68a: 0x6d2f5220, 0x1e68b: 0x6cb2f020, + 0x1e68c: 0x6c8a6620, 0x1e68d: 0x6ce91820, 0x1e68e: 0x6cb8ba20, 0x1e68f: 0x6c203220, + 0x1e690: 0x6cccca20, 0x1e691: 0x6c5fe820, 0x1e692: 0x6c388e20, 0x1e693: 0x6c2e0a20, + 0x1e694: 0x6c9ac420, 0x1e695: 0x6caa7020, 0x1e696: 0x6d0f8c20, 0x1e697: 0x6c146420, + 0x1e698: 0x6d03d620, 0x1e699: 0x6c413020, 0x1e69a: 0x6c107a20, 0x1e69b: 0x6cdf6620, + 0x1e69c: 0x6c721c20, 0x1e69d: 0x6c33e620, 0x1e69e: 0x6c173e20, 0x1e69f: 0x6d37ac20, + 0x1e6a0: 0x6ca32220, 0x1e6a1: 0x6c06f620, 0x1e6a2: 0x6c426a20, 0x1e6a3: 0x6c04c420, + 0x1e6a4: 0x6cb97a20, 0x1e6a5: 0x6d11fa20, 0x1e6a6: 0x6cbd2220, 0x1e6a7: 0x6c756620, + 0x1e6a8: 0x6cf35e20, 0x1e6a9: 0x6c463c20, 0x1e6aa: 0x6c778420, 0x1e6ab: 0x6c398e20, + 0x1e6ac: 0x6c5d8c20, 0x1e6ad: 0x6ce80a20, 0x1e6ae: 0x6ca98e20, 0x1e6af: 0x6c039c20, + 0x1e6b0: 0x6d22fa20, 0x1e6b1: 0x6cb98420, 0x1e6b2: 0x6d32aa20, 0x1e6b3: 0x6cb98620, + 0x1e6b4: 0x6c477820, 0x1e6b5: 0x6c0e6820, 0x1e6b6: 0x6c353c20, 0x1e6b7: 0x6cb35220, + 0x1e6b8: 0x6c108e20, 0x1e6b9: 0x6c0ee220, 0x1e6ba: 0x6d26a020, 0x1e6bb: 0x6d413820, + 0x1e6bc: 0x6ca28020, 0x1e6bd: 0x6ce05a20, 0x1e6be: 0x6c641020, 0x1e6bf: 0x6c2d4a20, + // Block 0x79b, offset 0x1e6c0 + 0x1e6c0: 0x6d1f2620, 0x1e6c1: 0x6ce5f820, 0x1e6c2: 0x6c0ee420, 0x1e6c3: 0x6c8cd620, + 0x1e6c4: 0x6cd77a20, 0x1e6c5: 0x6cb8d020, 0x1e6c6: 0x6c993620, 0x1e6c7: 0x6c064420, + 0x1e6c8: 0x6cd36620, 0x1e6c9: 0x6d088420, 0x1e6ca: 0x6cdde820, 0x1e6cb: 0x6c097220, + 0x1e6cc: 0x6ca5d220, 0x1e6cd: 0x6caf5e20, 0x1e6ce: 0x6c344220, 0x1e6cf: 0x6d03e420, + 0x1e6d0: 0x6c77bc20, 0x1e6d1: 0x6c81b020, 0x1e6d2: 0x6c379420, 0x1e6d3: 0x6c985e20, + 0x1e6d4: 0x6d0ba820, 0x1e6d5: 0x6d1fc620, 0x1e6d6: 0x6c19f620, 0x1e6d7: 0x6c63bc20, + 0x1e6d8: 0x6d127e20, 0x1e6d9: 0x6ca4a820, 0x1e6da: 0x6d361020, 0x1e6db: 0x6c29aa20, + 0x1e6dc: 0x6ce74620, 0x1e6dd: 0x6c939820, 0x1e6de: 0x6c2e2220, 0x1e6df: 0x6d19d220, + 0x1e6e0: 0x6c765020, 0x1e6e1: 0x6d2c2e20, 0x1e6e2: 0x6d39a220, 0x1e6e3: 0x6cf7e420, + 0x1e6e4: 0x6c2fa220, 0x1e6e5: 0x6c2fd220, 0x1e6e6: 0x6cfaa420, 0x1e6e7: 0x6c573a20, + 0x1e6e8: 0x6cc2e820, 0x1e6e9: 0x6ccbf020, 0x1e6ea: 0x6c4cfa20, 0x1e6eb: 0x6c2e2420, + 0x1e6ec: 0x6c448620, 0x1e6ed: 0x6c9ffc20, 0x1e6ee: 0x6d32be20, 0x1e6ef: 0x6ccb2620, + 0x1e6f0: 0x6c68ec20, 0x1e6f1: 0x6d13ec20, 0x1e6f2: 0x6c15b220, 0x1e6f3: 0x6c1d4e20, + 0x1e6f4: 0x6ce0be20, 0x1e6f5: 0x6c018220, 0x1e6f6: 0x6d1a6220, 0x1e6f7: 0x6cc7a820, + 0x1e6f8: 0x6d3b0620, 0x1e6f9: 0x6c815c20, 0x1e6fa: 0x6cb4ac20, 0x1e6fb: 0x6cf3cc20, + 0x1e6fc: 0x6c7f1020, 0x1e6fd: 0x6ce27c20, 0x1e6fe: 0x6c890020, 0x1e6ff: 0x6c794420, + // Block 0x79c, offset 0x1e700 + 0x1e700: 0x6cfed020, 0x1e701: 0x6cdd6820, 0x1e702: 0x6c851a20, 0x1e703: 0x6d2bac20, + 0x1e704: 0x6c1e8620, 0x1e705: 0x6c4c2220, 0x1e706: 0x6c434a20, 0x1e707: 0x6c357020, + 0x1e708: 0x6d053e20, 0x1e709: 0x6c262e20, 0x1e70a: 0x6c94aa20, 0x1e70b: 0x6c3c5220, + 0x1e70c: 0x6d02da20, 0x1e70d: 0x6c8f0a20, 0x1e70e: 0x6c763220, 0x1e70f: 0x6c65a220, + 0x1e710: 0x6cc8d020, 0x1e711: 0x6ce2f220, 0x1e712: 0x6c80ce20, 0x1e713: 0x6cbdda20, + 0x1e714: 0x6c70a420, 0x1e715: 0x6c000820, 0x1e716: 0x6cbac620, 0x1e717: 0x6d30da20, + 0x1e718: 0x6cab0020, 0x1e719: 0x6c263220, 0x1e71a: 0x6c98ee20, 0x1e71b: 0x6c078a20, + 0x1e71c: 0x6cb60620, 0x1e71d: 0x6c2a7820, 0x1e71e: 0x6c78be20, 0x1e71f: 0x6c7d7420, + 0x1e720: 0x6c167620, 0x1e721: 0x6cf65e20, 0x1e722: 0x6c482020, 0x1e723: 0x6c954c20, + 0x1e724: 0x6c20da20, 0x1e725: 0x6d3c6420, 0x1e726: 0x6c6c9a20, 0x1e727: 0x6d367420, + 0x1e728: 0x6cfab620, 0x1e729: 0x6c732220, 0x1e72a: 0x6c5d5820, 0x1e72b: 0x6caddc20, + 0x1e72c: 0x6cdfee20, 0x1e72d: 0x6c2fae20, 0x1e72e: 0x6c66a220, 0x1e72f: 0x6c725c20, + 0x1e730: 0x6c9bdc20, 0x1e731: 0x6d3e6620, 0x1e732: 0x6cbcdc20, 0x1e733: 0x6d1bc820, + 0x1e734: 0x6c766a20, 0x1e735: 0x6cbad420, 0x1e736: 0x6cd80a20, 0x1e737: 0x6c367820, + 0x1e738: 0x6c13ac20, 0x1e739: 0x6cbb9420, 0x1e73a: 0x6d37c420, 0x1e73b: 0x6c32d620, + 0x1e73c: 0x6cd9d220, 0x1e73d: 0x6c59e820, 0x1e73e: 0x6c588c20, 0x1e73f: 0x6c003220, + // Block 0x79d, offset 0x1e740 + 0x1e740: 0x6c327020, 0x1e741: 0x6c9a6420, 0x1e742: 0x6c911420, 0x1e743: 0x6d3e7420, + 0x1e744: 0x6c3ac020, 0x1e745: 0x6c9a1c20, 0x1e746: 0x6ca15820, 0x1e747: 0x6d325c20, + 0x1e748: 0x6c0f5020, 0x1e749: 0x6c442a20, 0x1e74a: 0x6ca86620, 0x1e74b: 0x6ce18220, + 0x1e74c: 0x6c730220, 0x1e74d: 0x6ca86820, 0x1e74e: 0x6ca2e820, 0x1e74f: 0x6c8e8e20, + 0x1e750: 0x6c431e20, 0x1e751: 0x6c058a20, 0x1e752: 0x6d186c20, 0x1e753: 0x6c638020, + 0x1e754: 0x6c0d4e20, 0x1e755: 0x6cc6ac20, 0x1e756: 0x6c0c2420, 0x1e757: 0x6ce0d620, + 0x1e758: 0x6c980620, 0x1e759: 0x6c955420, 0x1e75a: 0x6c085420, 0x1e75b: 0x6d1dbc20, + 0x1e75c: 0x6c6eae20, 0x1e75d: 0x6c2b4620, 0x1e75e: 0x6d40dc20, 0x1e75f: 0x6d08b420, + 0x1e760: 0x6c8ea620, 0x1e761: 0x6c153220, 0x1e762: 0x6c74d020, 0x1e763: 0x6c8aac20, + 0x1e764: 0x6cb46420, 0x1e765: 0x6c91e220, 0x1e766: 0x6c336e20, 0x1e767: 0x6c7fc820, + 0x1e768: 0x6cb49e20, 0x1e769: 0x6c249420, 0x1e76a: 0x6cbae820, 0x1e76b: 0x6c2aee20, + 0x1e76c: 0x6c5e1e20, 0x1e76d: 0x6c826e20, 0x1e76e: 0x6c58b220, 0x1e76f: 0x6d3dc420, + 0x1e770: 0x6c887c20, 0x1e771: 0x6d18fe20, 0x1e772: 0x6c142420, 0x1e773: 0x6c0c4e20, + 0x1e774: 0x6c7eba20, 0x1e775: 0x6c157020, 0x1e776: 0x6cfda020, 0x1e777: 0x6d2f0020, + 0x1e778: 0x6c169c20, 0x1e779: 0x6c6fbc20, 0x1e77a: 0x6c02a420, 0x1e77b: 0x6c2eb820, + 0x1e77c: 0x6cc13c20, 0x1e77d: 0x6c8a8420, 0x1e77e: 0x6c9caa20, 0x1e77f: 0x6d2efa20, + // Block 0x79e, offset 0x1e780 + 0x1e780: 0x6c9ac620, 0x1e781: 0x6c96b620, 0x1e782: 0x6cd68220, 0x1e783: 0x6ccd3c20, + 0x1e784: 0x6c5db420, 0x1e785: 0x6c9ac820, 0x1e786: 0x6d0c8e20, 0x1e787: 0x6c098e20, + 0x1e788: 0x6c4eba20, 0x1e789: 0x6c099020, 0x1e78a: 0x6ccdfa20, 0x1e78b: 0x6c763420, + 0x1e78c: 0x6c778a20, 0x1e78d: 0x6c07f220, 0x1e78e: 0x6c535c20, 0x1e78f: 0x6cc8fe20, + 0x1e790: 0x6cca5820, 0x1e791: 0x6cfb6420, 0x1e792: 0x6cfb6620, 0x1e793: 0x6c64ac20, + 0x1e794: 0x6c9fb420, 0x1e795: 0x6cf96820, 0x1e796: 0x6cd74020, 0x1e797: 0x6c312020, + 0x1e798: 0x6d2c3c20, 0x1e799: 0x6ca53420, 0x1e79a: 0x6d2d8820, 0x1e79b: 0x6cae7820, + 0x1e79c: 0x6cfa2220, 0x1e79d: 0x6c8d2820, 0x1e79e: 0x6c0bae20, 0x1e79f: 0x6c09e820, + 0x1e7a0: 0x6cc90020, 0x1e7a1: 0x6c00be20, 0x1e7a2: 0x6c492020, 0x1e7a3: 0x6c441620, + 0x1e7a4: 0x6c441820, 0x1e7a5: 0x6c382220, 0x1e7a6: 0x6c1f6620, 0x1e7a7: 0x6c53c820, + 0x1e7a8: 0x6c4a7e20, 0x1e7a9: 0x6c9fbe20, 0x1e7aa: 0x6ccb1220, 0x1e7ab: 0x6c7dc020, + 0x1e7ac: 0x6c812c20, 0x1e7ad: 0x6c935a20, 0x1e7ae: 0x6ce68820, 0x1e7af: 0x6ccc7620, + 0x1e7b0: 0x6c714820, 0x1e7b1: 0x6d26e420, 0x1e7b2: 0x6d26e620, 0x1e7b3: 0x6c15e020, + 0x1e7b4: 0x6cc27620, 0x1e7b5: 0x6c8c6a20, 0x1e7b6: 0x6c167e20, 0x1e7b7: 0x6ccca420, + 0x1e7b8: 0x6c7dc220, 0x1e7b9: 0x6d0c3020, 0x1e7ba: 0x6cf1b220, 0x1e7bb: 0x6d0cd420, + 0x1e7bc: 0x6c36b020, 0x1e7bd: 0x6c5cda20, 0x1e7be: 0x6d23fc20, 0x1e7bf: 0x6cf1b420, + // Block 0x79f, offset 0x1e7c0 + 0x1e7c0: 0x6cfe6020, 0x1e7c1: 0x6c05be20, 0x1e7c2: 0x6c53d620, 0x1e7c3: 0x6cc28020, + 0x1e7c4: 0x6d11dc20, 0x1e7c5: 0x6cf1ba20, 0x1e7c6: 0x6c04d820, 0x1e7c7: 0x6c01d220, + 0x1e7c8: 0x6cef4620, 0x1e7c9: 0x6d1a1020, 0x1e7ca: 0x6c7e2020, 0x1e7cb: 0x6cc40a20, + 0x1e7cc: 0x6c7fca20, 0x1e7cd: 0x6c317c20, 0x1e7ce: 0x6cc38620, 0x1e7cf: 0x6c3c6e20, + 0x1e7d0: 0x6ce4cc20, 0x1e7d1: 0x6ca88c20, 0x1e7d2: 0x6cdec420, 0x1e7d3: 0x6c767620, + 0x1e7d4: 0x6c518a20, 0x1e7d5: 0x6cc40e20, 0x1e7d6: 0x6c209c20, 0x1e7d7: 0x6c493020, + 0x1e7d8: 0x6c314620, 0x1e7d9: 0x6cb72420, 0x1e7da: 0x6c7c4e20, 0x1e7db: 0x6ce15c20, + 0x1e7dc: 0x6c493420, 0x1e7dd: 0x6cb18a20, 0x1e7de: 0x6c771820, 0x1e7df: 0x6cf92420, + 0x1e7e0: 0x6c5c8e20, 0x1e7e1: 0x6c160e20, 0x1e7e2: 0x6cb0dc20, 0x1e7e3: 0x6c29a420, + 0x1e7e4: 0x6c58c420, 0x1e7e5: 0x6cdeda20, 0x1e7e6: 0x6cf1c220, 0x1e7e7: 0x6cde0220, + 0x1e7e8: 0x6c9abe20, 0x1e7e9: 0x6cd67e20, 0x1e7ea: 0x6ccd2820, 0x1e7eb: 0x6d0e3820, + 0x1e7ec: 0x6c4e8820, 0x1e7ed: 0x6c090e20, 0x1e7ee: 0x6cf1f820, 0x1e7ef: 0x6c208c20, + 0x1e7f0: 0x6cc8f820, 0x1e7f1: 0x6ceee620, 0x1e7f2: 0x6cfb2820, 0x1e7f3: 0x6c52fe20, + 0x1e7f4: 0x6c646620, 0x1e7f5: 0x6c9f9220, 0x1e7f6: 0x6c772620, 0x1e7f7: 0x6c9aea20, + 0x1e7f8: 0x6d2c2420, 0x1e7f9: 0x6ca52a20, 0x1e7fa: 0x6c4a4220, 0x1e7fb: 0x6cf18820, + 0x1e7fc: 0x6cde3e20, 0x1e7fd: 0x6c9fa020, 0x1e7fe: 0x6c935420, 0x1e7ff: 0x6c764e20, + // Block 0x7a0, offset 0x1e800 + 0x1e800: 0x6c380a20, 0x1e801: 0x6c43ce20, 0x1e802: 0x6c50e620, 0x1e803: 0x6c7da420, + 0x1e804: 0x6c6f6820, 0x1e805: 0x6d26a220, 0x1e806: 0x6c80b020, 0x1e807: 0x6c316c20, + 0x1e808: 0x6d232820, 0x1e809: 0x6d0c0420, 0x1e80a: 0x6c166c20, 0x1e80b: 0x6cf88020, + 0x1e80c: 0x6cf19420, 0x1e80d: 0x6c5cc620, 0x1e80e: 0x6d0c9020, 0x1e80f: 0x6c362020, + 0x1e810: 0x6c15b420, 0x1e811: 0x6c7fa020, 0x1e812: 0x6cc27020, 0x1e813: 0x6c5bce20, + 0x1e814: 0x6c7e0220, 0x1e815: 0x6cc3c620, 0x1e816: 0x6c515020, 0x1e817: 0x6ce4b220, + 0x1e818: 0x6c26b220, 0x1e819: 0x6cc39020, 0x1e81a: 0x6c4e5e20, 0x1e81b: 0x6c58a220, + 0x1e81c: 0x6c3fba20, 0x1e81d: 0x6c3f9e20, 0x1e81e: 0x6c820620, 0x1e81f: 0x6c332a20, + 0x1e820: 0x6d031020, 0x1e821: 0x6cb89020, 0x1e822: 0x6cf49a20, 0x1e823: 0x6c412620, + 0x1e824: 0x6d356a20, 0x1e825: 0x6d19a020, 0x1e826: 0x6d0f7820, 0x1e827: 0x6c30d620, + 0x1e828: 0x6c35ce20, 0x1e829: 0x6cd0d620, 0x1e82a: 0x6c04b220, 0x1e82b: 0x6cadc620, + 0x1e82c: 0x6c792220, 0x1e82d: 0x6d27d420, 0x1e82e: 0x6cc84c20, 0x1e82f: 0x6d34da20, + 0x1e830: 0x6cafac20, 0x1e831: 0x6c6e0420, 0x1e832: 0x6c39a020, 0x1e833: 0x6d0f7a20, + 0x1e834: 0x6d19a220, 0x1e835: 0x6d321020, 0x1e836: 0x6c69f420, 0x1e837: 0x6c195020, + 0x1e838: 0x6c35d620, 0x1e839: 0x6cc0d620, 0x1e83a: 0x6c2bd220, 0x1e83b: 0x6d410a20, + 0x1e83c: 0x6d427820, 0x1e83d: 0x6c2d3820, 0x1e83e: 0x6c8e0820, 0x1e83f: 0x6c000220, + // Block 0x7a1, offset 0x1e840 + 0x1e840: 0x6ceae620, 0x1e841: 0x6ceae820, 0x1e842: 0x6c068c20, 0x1e843: 0x6c0dc020, + 0x1e844: 0x6c3fae20, 0x1e845: 0x6c618e20, 0x1e846: 0x6c921420, 0x1e847: 0x6c902c20, + 0x1e848: 0x6c18a220, 0x1e849: 0x6d03c220, 0x1e84a: 0x6c34ce20, 0x1e84b: 0x6c910220, + 0x1e84c: 0x6ca0da20, 0x1e84d: 0x6c67d620, 0x1e84e: 0x6cd4ae20, 0x1e84f: 0x6c34d020, + 0x1e850: 0x6cfc8620, 0x1e851: 0x6c373820, 0x1e852: 0x6c4acc20, 0x1e853: 0x6d207c20, + 0x1e854: 0x6c40e220, 0x1e855: 0x6ccd2e20, 0x1e856: 0x6c759e20, 0x1e857: 0x6cbc3420, + 0x1e858: 0x6d03d820, 0x1e859: 0x6c213620, 0x1e85a: 0x6c3fd820, 0x1e85b: 0x6c095820, + 0x1e85c: 0x6cf99e20, 0x1e85d: 0x6ccd3820, 0x1e85e: 0x6cd0f620, 0x1e85f: 0x6d35aa20, + 0x1e860: 0x6cb40420, 0x1e861: 0x6c30e420, 0x1e862: 0x6d260620, 0x1e863: 0x6d322820, + 0x1e864: 0x6c1e7620, 0x1e865: 0x6cfc9820, 0x1e866: 0x6c2a5620, 0x1e867: 0x6ca7fe20, + 0x1e868: 0x6d27e020, 0x1e869: 0x6cfbf020, 0x1e86a: 0x6cadce20, 0x1e86b: 0x6c3aa020, + 0x1e86c: 0x6d404e20, 0x1e86d: 0x6d174c20, 0x1e86e: 0x6c334820, 0x1e86f: 0x6c94e620, + 0x1e870: 0x6d19c420, 0x1e871: 0x6c707820, 0x1e872: 0x6c20c620, 0x1e873: 0x6c18ba20, + 0x1e874: 0x6cafd620, 0x1e875: 0x6c8cd820, 0x1e876: 0x6ce21420, 0x1e877: 0x6cfcae20, + 0x1e878: 0x6c923020, 0x1e879: 0x6cd0fc20, 0x1e87a: 0x6cfc0a20, 0x1e87b: 0x6d19d420, + 0x1e87c: 0x6d3a6220, 0x1e87d: 0x6d0fb020, 0x1e87e: 0x6cc62c20, 0x1e87f: 0x6cf9bc20, + // Block 0x7a2, offset 0x1e880 + 0x1e880: 0x6c1d1420, 0x1e881: 0x6d0e6820, 0x1e882: 0x6d19d620, 0x1e883: 0x6cd5ce20, + 0x1e884: 0x6c2b2c20, 0x1e885: 0x6d210c20, 0x1e886: 0x6c8f9220, 0x1e887: 0x6cee7820, + 0x1e888: 0x6cee7a20, 0x1e889: 0x6ca82420, 0x1e88a: 0x6c334a20, 0x1e88b: 0x6cdbf220, + 0x1e88c: 0x6c018420, 0x1e88d: 0x6c59b620, 0x1e88e: 0x6c6a0620, 0x1e88f: 0x6cdbf420, + 0x1e890: 0x6d1ae220, 0x1e891: 0x6c413c20, 0x1e892: 0x6d0d9a20, 0x1e893: 0x6c5abe20, + 0x1e894: 0x6c43fc20, 0x1e895: 0x6d27ee20, 0x1e896: 0x6cf4f220, 0x1e897: 0x6c7c6c20, + 0x1e898: 0x6c009e20, 0x1e899: 0x6cf89820, 0x1e89a: 0x6ce10c20, 0x1e89b: 0x6c623020, + 0x1e89c: 0x6d2f3620, 0x1e89d: 0x6c29de20, 0x1e89e: 0x6c024820, 0x1e89f: 0x6cf8aa20, + 0x1e8a0: 0x6d1aee20, 0x1e8a1: 0x6cc9be20, 0x1e8a2: 0x6cc53a20, 0x1e8a3: 0x6c8bca20, + 0x1e8a4: 0x6ce9b220, 0x1e8a5: 0x6c2ade20, 0x1e8a6: 0x6c693820, 0x1e8a7: 0x6cdc5820, + 0x1e8a8: 0x6cdbfa20, 0x1e8a9: 0x6c02e220, 0x1e8aa: 0x6cfc2620, 0x1e8ab: 0x6c3b8220, + 0x1e8ac: 0x6ca64c20, 0x1e8ad: 0x6c376820, 0x1e8ae: 0x6c5f4a20, 0x1e8af: 0x6c29ec20, + 0x1e8b0: 0x6cf7a620, 0x1e8b1: 0x6d1b0a20, 0x1e8b2: 0x6c358220, 0x1e8b3: 0x6c5af420, + 0x1e8b4: 0x6c903c20, 0x1e8b5: 0x6cf72220, 0x1e8b6: 0x6c859820, 0x1e8b7: 0x6c868820, + 0x1e8b8: 0x6c86b420, 0x1e8b9: 0x6d3c5620, 0x1e8ba: 0x6c553a20, 0x1e8bb: 0x6d33d220, + 0x1e8bc: 0x6cdcea20, 0x1e8bd: 0x6c735220, 0x1e8be: 0x6ca3f620, 0x1e8bf: 0x6d178820, + // Block 0x7a3, offset 0x1e8c0 + 0x1e8c0: 0x6cc3ba20, 0x1e8c1: 0x6d0e7e20, 0x1e8c2: 0x6cbd7a20, 0x1e8c3: 0x6cb8e820, + 0x1e8c4: 0x6d047c20, 0x1e8c5: 0x6d0b5420, 0x1e8c6: 0x6c604620, 0x1e8c7: 0x6c481820, + 0x1e8c8: 0x6c587a20, 0x1e8c9: 0x6d367620, 0x1e8ca: 0x6c46c020, 0x1e8cb: 0x6c736e20, + 0x1e8cc: 0x6c225620, 0x1e8cd: 0x6d1d9420, 0x1e8ce: 0x6c70b020, 0x1e8cf: 0x6c1e9820, + 0x1e8d0: 0x6c54f020, 0x1e8d1: 0x6d28c420, 0x1e8d2: 0x6c961c20, 0x1e8d3: 0x6d219620, + 0x1e8d4: 0x6c1dde20, 0x1e8d5: 0x6c2de020, 0x1e8d6: 0x6cdbe020, 0x1e8d7: 0x6c4f2820, + 0x1e8d8: 0x6cf32220, 0x1e8d9: 0x6cd6a620, 0x1e8da: 0x6c49ae20, 0x1e8db: 0x6c1ec220, + 0x1e8dc: 0x6d28d220, 0x1e8dd: 0x6d1dcc20, 0x1e8de: 0x6c5f7c20, 0x1e8df: 0x6cf70c20, + 0x1e8e0: 0x6c1dfe20, 0x1e8e1: 0x6c8f5220, 0x1e8e2: 0x6c847e20, 0x1e8e3: 0x6ca41420, + 0x1e8e4: 0x6d092c20, 0x1e8e5: 0x6d28e420, 0x1e8e6: 0x6c610820, 0x1e8e7: 0x6c610a20, + 0x1e8e8: 0x6d222220, 0x1e8e9: 0x6d211020, 0x1e8ea: 0x6d093020, 0x1e8eb: 0x6ca2f820, + 0x1e8ec: 0x6c3d2e20, 0x1e8ed: 0x6ccb2820, 0x1e8ee: 0x6ca28e20, 0x1e8ef: 0x6cf19820, + 0x1e8f0: 0x6c3b3620, 0x1e8f1: 0x6cacda20, 0x1e8f2: 0x6d27aa20, 0x1e8f3: 0x6c862220, + 0x1e8f4: 0x6c1c3a20, 0x1e8f5: 0x6d0f6020, 0x1e8f6: 0x6c8d2a20, 0x1e8f7: 0x6c823e20, + 0x1e8f8: 0x6c016e20, 0x1e8f9: 0x6c05ce20, 0x1e8fa: 0x6cf50420, 0x1e8fb: 0x6c2d6a20, + 0x1e8fc: 0x6c297420, 0x1e8fd: 0x6c56ac20, 0x1e8fe: 0x6cf50620, 0x1e8ff: 0x6c2e3420, + // Block 0x7a4, offset 0x1e900 + 0x1e900: 0x6d05c220, 0x1e901: 0x6c625820, 0x1e902: 0x6ca2a820, 0x1e903: 0x6c18e820, + 0x1e904: 0x6cff1020, 0x1e905: 0x6d2cde20, 0x1e906: 0x6ce68a20, 0x1e907: 0x6d325e20, + 0x1e908: 0x6cae2820, 0x1e909: 0x6c9a2420, 0x1e90a: 0x6c8d4c20, 0x1e90b: 0x6cb53420, + 0x1e90c: 0x6d38b020, 0x1e90d: 0x6c5e0220, 0x1e90e: 0x6ccc7c20, 0x1e90f: 0x6c3a1a20, + 0x1e910: 0x6c538a20, 0x1e911: 0x6d2da020, 0x1e912: 0x6d1a0820, 0x1e913: 0x6ca60820, + 0x1e914: 0x6d3b2e20, 0x1e915: 0x6cea6e20, 0x1e916: 0x6c8be420, 0x1e917: 0x6c8e3020, + 0x1e918: 0x6c308e20, 0x1e919: 0x6d1bf620, 0x1e91a: 0x6cf53220, 0x1e91b: 0x6c8d7420, + 0x1e91c: 0x6cd6a420, 0x1e91d: 0x6c8d7620, 0x1e91e: 0x6cfa0620, 0x1e91f: 0x6c539020, + 0x1e920: 0x6d1a1220, 0x1e921: 0x6c974420, 0x1e922: 0x6c974620, 0x1e923: 0x6d280620, + 0x1e924: 0x6c8f4c20, 0x1e925: 0x6c9c1620, 0x1e926: 0x6c0d6a20, 0x1e927: 0x6cf54020, + 0x1e928: 0x6cf10020, 0x1e929: 0x6c7e2a20, 0x1e92a: 0x6d1aac20, 0x1e92b: 0x6cf7b220, + 0x1e92c: 0x6d191e20, 0x1e92d: 0x6c008020, 0x1e92e: 0x6c28e420, 0x1e92f: 0x6ce2e420, + 0x1e930: 0x6cca4020, 0x1e931: 0x6d246c20, 0x1e932: 0x6c933620, 0x1e933: 0x6c8fd020, + 0x1e934: 0x6c27a820, 0x1e935: 0x6c60f420, 0x1e936: 0x6cacec20, 0x1e937: 0x6d0ff420, + 0x1e938: 0x6c03d620, 0x1e939: 0x6cafa420, 0x1e93a: 0x6cef7020, 0x1e93b: 0x6c3c8420, + 0x1e93c: 0x6cf93420, 0x1e93d: 0x6c62e420, 0x1e93e: 0x6c970e20, 0x1e93f: 0x6c9bac20, + // Block 0x7a5, offset 0x1e940 + 0x1e940: 0x6c9bae20, 0x1e941: 0x6c829a20, 0x1e942: 0x6c87ae20, 0x1e943: 0x6c5e5820, + 0x1e944: 0x6c008220, 0x1e945: 0x6c3b0220, 0x1e946: 0x6c27ae20, 0x1e947: 0x6c901220, + 0x1e948: 0x6c8db620, 0x1e949: 0x6c010e20, 0x1e94a: 0x6c3c8e20, 0x1e94b: 0x6c87c820, + 0x1e94c: 0x6c062620, 0x1e94d: 0x6c521820, 0x1e94e: 0x6c521020, 0x1e94f: 0x6c521420, + 0x1e950: 0x6c0e3e20, 0x1e951: 0x6cbe3020, 0x1e952: 0x6cbe3220, 0x1e953: 0x6c6e8a20, + 0x1e954: 0x6ce46c20, 0x1e955: 0x6d317820, 0x1e956: 0x6c6e9220, 0x1e957: 0x6c198420, + 0x1e958: 0x6cbed420, 0x1e959: 0x6c6e9c20, 0x1e95a: 0x6c6ea620, 0x1e95b: 0x6c2d8620, + 0x1e95c: 0x6c6eb020, 0x1e95d: 0x6ce47a20, 0x1e95e: 0x6c39f220, 0x1e95f: 0x6c3a0a20, + 0x1e960: 0x6c77c820, 0x1e961: 0x6c9c9220, 0x1e962: 0x6c9e5620, 0x1e963: 0x6c9e5020, + 0x1e964: 0x6c065a20, 0x1e965: 0x6d133420, 0x1e966: 0x6ce52020, 0x1e967: 0x6c5c9820, + 0x1e968: 0x6d139c20, 0x1e969: 0x6c43d020, 0x1e96a: 0x6c2f5e20, 0x1e96b: 0x6c13ea20, + 0x1e96c: 0x6cb9a020, 0x1e96d: 0x6cc5f820, 0x1e96e: 0x6c2b7020, 0x1e96f: 0x6c326020, + 0x1e970: 0x6cf4f420, 0x1e971: 0x6cc5fa20, 0x1e972: 0x6cbd8820, 0x1e973: 0x6c6d2020, + 0x1e974: 0x6d08e420, 0x1e975: 0x6ca99e20, 0x1e976: 0x6c03a220, 0x1e977: 0x6d1af020, + 0x1e978: 0x6cc95020, 0x1e979: 0x6ca35e20, 0x1e97a: 0x6ca14420, 0x1e97b: 0x6d412220, + 0x1e97c: 0x6c26b620, 0x1e97d: 0x6c050020, 0x1e97e: 0x6d183e20, 0x1e97f: 0x6d121a20, + // Block 0x7a6, offset 0x1e980 + 0x1e980: 0x6ce23420, 0x1e981: 0x6c074c20, 0x1e982: 0x6c63d820, 0x1e983: 0x6c537a20, + 0x1e984: 0x6cad6220, 0x1e985: 0x6d0f6420, 0x1e986: 0x6c0e4220, 0x1e987: 0x6d1a0020, + 0x1e988: 0x6c442c20, 0x1e989: 0x6ce23c20, 0x1e98a: 0x6c6b2e20, 0x1e98b: 0x6d00e420, + 0x1e98c: 0x6c014820, 0x1e98d: 0x6c014a20, 0x1e98e: 0x6c523620, 0x1e98f: 0x6c45fc20, + 0x1e990: 0x6cb88a20, 0x1e991: 0x6c26c220, 0x1e992: 0x6cbbf420, 0x1e993: 0x6ce64a20, + 0x1e994: 0x6c978620, 0x1e995: 0x6d1d4e20, 0x1e996: 0x6cdbde20, 0x1e997: 0x6ce5a020, + 0x1e998: 0x6cbc6220, 0x1e999: 0x6d08b820, 0x1e99a: 0x6c79ac20, 0x1e99b: 0x6c083420, + 0x1e99c: 0x6cdeb420, 0x1e99d: 0x6cce5820, 0x1e99e: 0x6c0dfa20, 0x1e99f: 0x6c7e2220, + 0x1e9a0: 0x6c70d420, 0x1e9a1: 0x6c7eda20, 0x1e9a2: 0x6d024a20, 0x1e9a3: 0x6cc76820, + 0x1e9a4: 0x6c054420, 0x1e9a5: 0x6c372c20, 0x1e9a6: 0x6cbfd620, 0x1e9a7: 0x6cbfd820, + 0x1e9a8: 0x6c518c20, 0x1e9a9: 0x6d001620, 0x1e9aa: 0x6ca2ba20, 0x1e9ab: 0x6c70da20, + 0x1e9ac: 0x6c650a20, 0x1e9ad: 0x6c0b1620, 0x1e9ae: 0x6c2b4c20, 0x1e9af: 0x6c651c20, + 0x1e9b0: 0x6cf16e20, 0x1e9b1: 0x6ce1fa20, 0x1e9b2: 0x6c466620, 0x1e9b3: 0x6cdec620, + 0x1e9b4: 0x6c076c20, 0x1e9b5: 0x6d011c20, 0x1e9b6: 0x6cac8820, 0x1e9b7: 0x6c445420, + 0x1e9b8: 0x6c0ab020, 0x1e9b9: 0x6c7e2e20, 0x1e9ba: 0x6ce0e020, 0x1e9bb: 0x6c90d420, + 0x1e9bc: 0x6c4ba420, 0x1e9bd: 0x6cbc1220, 0x1e9be: 0x6d08ee20, 0x1e9bf: 0x6c5f9820, + // Block 0x7a7, offset 0x1e9c0 + 0x1e9c0: 0x6c654820, 0x1e9c1: 0x6c679820, 0x1e9c2: 0x6c164c20, 0x1e9c3: 0x6c26d820, + 0x1e9c4: 0x6c56e820, 0x1e9c5: 0x6cfc6420, 0x1e9c6: 0x6cb96020, 0x1e9c7: 0x6c320420, + 0x1e9c8: 0x6cec4420, 0x1e9c9: 0x6c655a20, 0x1e9ca: 0x6c801e20, 0x1e9cb: 0x6ceeee20, + 0x1e9cc: 0x6cc5fc20, 0x1e9cd: 0x6c3ecc20, 0x1e9ce: 0x6c9aa220, 0x1e9cf: 0x6cc37820, + 0x1e9d0: 0x6c442e20, 0x1e9d1: 0x6cf01020, 0x1e9d2: 0x6cbc6420, 0x1e9d3: 0x6c4e3e20, + 0x1e9d4: 0x6c172820, 0x1e9d5: 0x6c7e3420, 0x1e9d6: 0x6cc77c20, 0x1e9d7: 0x6d286620, + 0x1e9d8: 0x6ccf8020, 0x1e9d9: 0x6cf04620, 0x1e9da: 0x6c444e20, 0x1e9db: 0x6c046220, + 0x1e9dc: 0x6ce1fc20, 0x1e9dd: 0x6c466820, 0x1e9de: 0x6d286c20, 0x1e9df: 0x6c435e20, + 0x1e9e0: 0x6c0ab220, 0x1e9e1: 0x6cf05220, 0x1e9e2: 0x6cdcc220, 0x1e9e3: 0x6c31fa20, + 0x1e9e4: 0x6cec4620, 0x1e9e5: 0x6c320620, 0x1e9e6: 0x6ceed820, 0x1e9e7: 0x6cc5cc20, + 0x1e9e8: 0x6c3e2820, 0x1e9e9: 0x6c4e1a20, 0x1e9ea: 0x6cefea20, 0x1e9eb: 0x6d283e20, + 0x1e9ec: 0x6ce1e020, 0x1e9ed: 0x6c6fb420, 0x1e9ee: 0x6c6fc420, 0x1e9ef: 0x6cfad220, + 0x1e9f0: 0x6d022820, 0x1e9f1: 0x6cfae220, 0x1e9f2: 0x6c5f8820, 0x1e9f3: 0x6d19ba20, + 0x1e9f4: 0x6d28c220, 0x1e9f5: 0x6d284020, 0x1e9f6: 0x6ccea820, 0x1e9f7: 0x6c822420, + 0x1e9f8: 0x6caecc20, 0x1e9f9: 0x6c5a2020, 0x1e9fa: 0x6d1c0420, 0x1e9fb: 0x6d287220, + 0x1e9fc: 0x6caef020, 0x1e9fd: 0x6c016020, 0x1e9fe: 0x6d1a1820, 0x1e9ff: 0x6cfe0a20, + // Block 0x7a8, offset 0x1ea00 + 0x1ea00: 0x6c56ea20, 0x1ea01: 0x6d12dc20, 0x1ea02: 0x6c2f6e20, 0x1ea03: 0x6cbea820, + 0x1ea04: 0x6c7c7020, 0x1ea05: 0x6cfe3a20, 0x1ea06: 0x6cd75420, 0x1ea07: 0x6c4daa20, + 0x1ea08: 0x6d05ae20, 0x1ea09: 0x6d152a20, 0x1ea0a: 0x6d05b620, 0x1ea0b: 0x6c35b420, + 0x1ea0c: 0x6cd99020, 0x1ea0d: 0x6c7cd820, 0x1ea0e: 0x6cb60c20, 0x1ea0f: 0x6c4f8220, + 0x1ea10: 0x6d238620, 0x1ea11: 0x6cece020, 0x1ea12: 0x6c048c20, 0x1ea13: 0x6c33fe20, + 0x1ea14: 0x6c2b8620, 0x1ea15: 0x6c27f220, 0x1ea16: 0x6cacbe20, 0x1ea17: 0x6cb31820, + 0x1ea18: 0x6c8e1220, 0x1ea19: 0x6c182e20, 0x1ea1a: 0x6c6e2620, 0x1ea1b: 0x6c834020, + 0x1ea1c: 0x6c516a20, 0x1ea1d: 0x6cbb9e20, 0x1ea1e: 0x6c36a020, 0x1ea1f: 0x6c357c20, + 0x1ea20: 0x6cf01220, 0x1ea21: 0x6d00e620, 0x1ea22: 0x6c7e1020, 0x1ea23: 0x6cd07020, + 0x1ea24: 0x6d156620, 0x1ea25: 0x6cd07a20, 0x1ea26: 0x6c4d2420, 0x1ea27: 0x6c332820, + 0x1ea28: 0x6d228420, 0x1ea29: 0x6cb26620, 0x1ea2a: 0x6c834220, 0x1ea2b: 0x6c3f8420, + 0x1ea2c: 0x6c63e020, 0x1ea2d: 0x6ce7f820, 0x1ea2e: 0x6c5c4a20, 0x1ea2f: 0x6c7ca020, + 0x1ea30: 0x6c63ec20, 0x1ea31: 0x6c953220, 0x1ea32: 0x6ce6e220, 0x1ea33: 0x6c199820, + 0x1ea34: 0x6d1d1020, 0x1ea35: 0x6d276a20, 0x1ea36: 0x6c55c620, 0x1ea37: 0x6c4f1020, + 0x1ea38: 0x6c6e3620, 0x1ea39: 0x6ce9be20, 0x1ea3a: 0x6ce9c020, 0x1ea3b: 0x6cb21420, + 0x1ea3c: 0x6c7f5a20, 0x1ea3d: 0x6ce9c220, 0x1ea3e: 0x6d3eb420, 0x1ea3f: 0x6d3eb220, + // Block 0x7a9, offset 0x1ea40 + 0x1ea40: 0x6c20e620, 0x1ea41: 0x6c2fc020, 0x1ea42: 0x6c7f5c20, 0x1ea43: 0x6ce02020, + 0x1ea44: 0x6c4f2220, 0x1ea45: 0x6cb93220, 0x1ea46: 0x6c783820, 0x1ea47: 0x6c257220, + 0x1ea48: 0x6d085e20, 0x1ea49: 0x6cbd4420, 0x1ea4a: 0x6d157820, 0x1ea4b: 0x6cc9d420, + 0x1ea4c: 0x6ce39e20, 0x1ea4d: 0x6c358a20, 0x1ea4e: 0x6c36ca20, 0x1ea4f: 0x6d0ce220, + 0x1ea50: 0x6cf21420, 0x1ea51: 0x6c76f820, 0x1ea52: 0x6d1e0220, 0x1ea53: 0x6d3b9820, + 0x1ea54: 0x6d0ce420, 0x1ea55: 0x6cfc3c20, 0x1ea56: 0x6d035220, 0x1ea57: 0x6d162620, + 0x1ea58: 0x6d263820, 0x1ea59: 0x6cca9620, 0x1ea5a: 0x6c2ce620, 0x1ea5b: 0x6c2ce820, + 0x1ea5c: 0x6c67ca20, 0x1ea5d: 0x6c7c4a20, 0x1ea5e: 0x6c835420, 0x1ea5f: 0x6c819220, + 0x1ea60: 0x6cb1a820, 0x1ea61: 0x6cec7820, 0x1ea62: 0x6c979a20, 0x1ea63: 0x6c247c20, + 0x1ea64: 0x6d117820, 0x1ea65: 0x6c507e20, 0x1ea66: 0x6cbc1420, 0x1ea67: 0x6c482e20, + 0x1ea68: 0x6d0ab620, 0x1ea69: 0x6d0e1a20, 0x1ea6a: 0x6c5c9e20, 0x1ea6b: 0x6c164e20, + 0x1ea6c: 0x6cc7ee20, 0x1ea6d: 0x6c9bb620, 0x1ea6e: 0x6c0d7420, 0x1ea6f: 0x6cfc6620, + 0x1ea70: 0x6cb23220, 0x1ea71: 0x6c91a620, 0x1ea72: 0x6c806620, 0x1ea73: 0x6ca8d620, + 0x1ea74: 0x6cc34620, 0x1ea75: 0x6d12be20, 0x1ea76: 0x6c2f6a20, 0x1ea77: 0x6cbe9e20, + 0x1ea78: 0x6c4d9620, 0x1ea79: 0x6cfe2420, 0x1ea7a: 0x6cd74a20, 0x1ea7b: 0x6d057e20, + 0x1ea7c: 0x6d058820, 0x1ea7d: 0x6cecd220, 0x1ea7e: 0x6c480620, 0x1ea7f: 0x6c33ec20, + // Block 0x7aa, offset 0x1ea80 + 0x1ea80: 0x6cb5b420, 0x1ea81: 0x6c047c20, 0x1ea82: 0x6cd98820, 0x1ea83: 0x6c4f7220, + 0x1ea84: 0x6d22fc20, 0x1ea85: 0x6c915420, 0x1ea86: 0x6c8e1020, 0x1ea87: 0x6cb30c20, + 0x1ea88: 0x6c6e1e20, 0x1ea89: 0x6c6ada20, 0x1ea8a: 0x6c63c820, 0x1ea8b: 0x6ce6d420, + 0x1ea8c: 0x6c513220, 0x1ea8d: 0x6d1cf420, 0x1ea8e: 0x6c6f1420, 0x1ea8f: 0x6c780220, + 0x1ea90: 0x6d152c20, 0x1ea91: 0x6cb21220, 0x1ea92: 0x6c5bee20, 0x1ea93: 0x6ce9a820, + 0x1ea94: 0x6c4ed620, 0x1ea95: 0x6d1cf820, 0x1ea96: 0x6d1cfa20, 0x1ea97: 0x6c781e20, + 0x1ea98: 0x6ce37420, 0x1ea99: 0x6d1dfe20, 0x1ea9a: 0x6c36a220, 0x1ea9b: 0x6d3b9020, + 0x1ea9c: 0x6d0ccc20, 0x1ea9d: 0x6c357e20, 0x1ea9e: 0x6ca87820, 0x1ea9f: 0x6c975a20, + 0x1eaa0: 0x6c2cdc20, 0x1eaa1: 0x6cca8c20, 0x1eaa2: 0x6c507820, 0x1eaa3: 0x6c835020, + 0x1eaa4: 0x6c163c20, 0x1eaa5: 0x6cc7e620, 0x1eaa6: 0x6cb22620, 0x1eaa7: 0x6cc33e20, + 0x1eaa8: 0x6c3c2c20, 0x1eaa9: 0x6c0c0020, 0x1eaaa: 0x6c48be20, 0x1eaab: 0x6c3eb820, + 0x1eaac: 0x6cf96e20, 0x1eaad: 0x6d2e0c20, 0x1eaae: 0x6c0c1020, 0x1eaaf: 0x6cc98020, + 0x1eab0: 0x6c038820, 0x1eab1: 0x6cdf3420, 0x1eab2: 0x6c8b2a20, 0x1eab3: 0x6c487420, + 0x1eab4: 0x6d08ba20, 0x1eab5: 0x6cce8820, 0x1eab6: 0x6c72a820, 0x1eab7: 0x6c0c3420, + 0x1eab8: 0x6cd84020, 0x1eab9: 0x6cf04820, 0x1eaba: 0x6d0fec20, 0x1eabb: 0x6d116a20, + 0x1eabc: 0x6cd9f820, 0x1eabd: 0x6c767820, 0x1eabe: 0x6cd9fa20, 0x1eabf: 0x6c386c20, + // Block 0x7ab, offset 0x1eac0 + 0x1eac0: 0x6c8ed220, 0x1eac1: 0x6cf7bc20, 0x1eac2: 0x6c8f5620, 0x1eac3: 0x6cb17020, + 0x1eac4: 0x6cb17220, 0x1eac5: 0x6c8ede20, 0x1eac6: 0x6c0c5620, 0x1eac7: 0x6c0c5820, + 0x1eac8: 0x6c0c5a20, 0x1eac9: 0x6c8a5620, 0x1eaca: 0x6c0c9e20, 0x1eacb: 0x6ccb9c20, + 0x1eacc: 0x6c3c9020, 0x1eacd: 0x6d051820, 0x1eace: 0x6c3c0e20, 0x1eacf: 0x6d0f8220, + 0x1ead0: 0x6d2dde20, 0x1ead1: 0x6c0bee20, 0x1ead2: 0x6cc97020, 0x1ead3: 0x6c725420, + 0x1ead4: 0x6cd7fc20, 0x1ead5: 0x6cd9c620, 0x1ead6: 0x6d112e20, 0x1ead7: 0x6c8e7e20, + 0x1ead8: 0x6cb16020, 0x1ead9: 0x6c0c2620, 0x1eada: 0x6c0c2820, 0x1eadb: 0x6c39f420, + 0x1eadc: 0x6c387420, 0x1eadd: 0x6c3a2e20, 0x1eade: 0x6c39ee20, 0x1eadf: 0x6cd25820, + 0x1eae0: 0x6cd24c20, 0x1eae1: 0x6c116220, 0x1eae2: 0x6c5eb020, 0x1eae3: 0x6c2f9e20, + 0x1eae4: 0x6cd8ae20, 0x1eae5: 0x6ceac620, 0x1eae6: 0x6d2d7220, 0x1eae7: 0x6cdcd220, + 0x1eae8: 0x6cfde820, 0x1eae9: 0x6cea5a20, 0x1eaea: 0x6cc5fe20, 0x1eaeb: 0x6d235e20, + 0x1eaec: 0x6c737e20, 0x1eaed: 0x6c1c2a20, 0x1eaee: 0x6d1af220, 0x1eaef: 0x6c395c20, + 0x1eaf0: 0x6c395e20, 0x1eaf1: 0x6cdcda20, 0x1eaf2: 0x6d1ae820, 0x1eaf3: 0x6ce81620, + 0x1eaf4: 0x6d152e20, 0x1eaf5: 0x6d42a620, 0x1eaf6: 0x6c09ec20, 0x1eaf7: 0x6c6b9c20, + 0x1eaf8: 0x6ce1e220, 0x1eaf9: 0x6c8f0e20, 0x1eafa: 0x6c226220, 0x1eafb: 0x6ce61420, + 0x1eafc: 0x6cd8d420, 0x1eafd: 0x6c060420, 0x1eafe: 0x6cd3b020, 0x1eaff: 0x6c350620, + // Block 0x7ac, offset 0x1eb00 + 0x1eb00: 0x6c4d7220, 0x1eb01: 0x6cc60420, 0x1eb02: 0x6ce51020, 0x1eb03: 0x6c691e20, + 0x1eb04: 0x6c63da20, 0x1eb05: 0x6c0df020, 0x1eb06: 0x6d113020, 0x1eb07: 0x6ce77420, + 0x1eb08: 0x6c226420, 0x1eb09: 0x6cfdf820, 0x1eb0a: 0x6d102a20, 0x1eb0b: 0x6c738a20, + 0x1eb0c: 0x6c37a220, 0x1eb0d: 0x6d0eb220, 0x1eb0e: 0x6c823a20, 0x1eb0f: 0x6cf68c20, + 0x1eb10: 0x6c117220, 0x1eb11: 0x6c0e8e20, 0x1eb12: 0x6ca57220, 0x1eb13: 0x6c36a420, + 0x1eb14: 0x6c10b620, 0x1eb15: 0x6c75e620, 0x1eb16: 0x6c313620, 0x1eb17: 0x6cdb0e20, + 0x1eb18: 0x6d219820, 0x1eb19: 0x6cd3d020, 0x1eb1a: 0x6d114a20, 0x1eb1b: 0x6c5d0020, + 0x1eb1c: 0x6c4cd220, 0x1eb1d: 0x6cd3d220, 0x1eb1e: 0x6c66dc20, 0x1eb1f: 0x6d3cae20, + 0x1eb20: 0x6c0df420, 0x1eb21: 0x6cfd1620, 0x1eb22: 0x6c10c020, 0x1eb23: 0x6d135020, + 0x1eb24: 0x6ce01620, 0x1eb25: 0x6c3a1e20, 0x1eb26: 0x6d2ede20, 0x1eb27: 0x6cf0de20, + 0x1eb28: 0x6c496820, 0x1eb29: 0x6c36b220, 0x1eb2a: 0x6caa9a20, 0x1eb2b: 0x6d286020, + 0x1eb2c: 0x6c55d620, 0x1eb2d: 0x6c5a1420, 0x1eb2e: 0x6ce61c20, 0x1eb2f: 0x6c5c6220, + 0x1eb30: 0x6c650c20, 0x1eb31: 0x6c543c20, 0x1eb32: 0x6c00e820, 0x1eb33: 0x6ce14c20, + 0x1eb34: 0x6c3b4820, 0x1eb35: 0x6cf0ee20, 0x1eb36: 0x6c47de20, 0x1eb37: 0x6c13b820, + 0x1eb38: 0x6cd99e20, 0x1eb39: 0x6ce15820, 0x1eb3a: 0x6c0f9820, 0x1eb3b: 0x6c42e820, + 0x1eb3c: 0x6cf90c20, 0x1eb3d: 0x6c7d2620, 0x1eb3e: 0x6c8f4e20, 0x1eb3f: 0x6cd9f220, + // Block 0x7ad, offset 0x1eb40 + 0x1eb40: 0x6ce24a20, 0x1eb41: 0x6d137c20, 0x1eb42: 0x6d27cc20, 0x1eb43: 0x6ca08a20, + 0x1eb44: 0x6ce16020, 0x1eb45: 0x6c979420, 0x1eb46: 0x6c0aa020, 0x1eb47: 0x6d245620, + 0x1eb48: 0x6d050a20, 0x1eb49: 0x6c6cc820, 0x1eb4a: 0x6cca4420, 0x1eb4b: 0x6c7d3c20, + 0x1eb4c: 0x6d3bfc20, 0x1eb4d: 0x6ccdde20, 0x1eb4e: 0x6c1c9020, 0x1eb4f: 0x6c28e620, + 0x1eb50: 0x6d193c20, 0x1eb51: 0x6c5f9020, 0x1eb52: 0x6cc53220, 0x1eb53: 0x6c19ac20, + 0x1eb54: 0x6d1de420, 0x1eb55: 0x6ce20220, 0x1eb56: 0x6cf11c20, 0x1eb57: 0x6cfe0e20, + 0x1eb58: 0x6d2dc620, 0x1eb59: 0x6c3b4a20, 0x1eb5a: 0x6c4d8a20, 0x1eb5b: 0x6c9bb020, + 0x1eb5c: 0x6d0f1420, 0x1eb5d: 0x6ca0a220, 0x1eb5e: 0x6c158020, 0x1eb5f: 0x6cfe1020, + 0x1eb60: 0x6c959820, 0x1eb61: 0x6d29cc20, 0x1eb62: 0x6ca46c20, 0x1eb63: 0x6cd22620, + 0x1eb64: 0x6c2f9020, 0x1eb65: 0x6c5e6e20, 0x1eb66: 0x6cea9e20, 0x1eb67: 0x6ce0e420, + 0x1eb68: 0x6cea4420, 0x1eb69: 0x6cf84020, 0x1eb6a: 0x6cc5ce20, 0x1eb6b: 0x6d22d220, + 0x1eb6c: 0x6c1bea20, 0x1eb6d: 0x6c392420, 0x1eb6e: 0x6d1acc20, 0x1eb6f: 0x6c665620, + 0x1eb70: 0x6cd32620, 0x1eb71: 0x6c05e820, 0x1eb72: 0x6cd89420, 0x1eb73: 0x6c34d220, + 0x1eb74: 0x6d147e20, 0x1eb75: 0x6c378c20, 0x1eb76: 0x6cc52420, 0x1eb77: 0x6cfdde20, + 0x1eb78: 0x6c50e820, 0x1eb79: 0x6c823820, 0x1eb7a: 0x6c68d820, 0x1eb7b: 0x6cf5b020, + 0x1eb7c: 0x6c0dd420, 0x1eb7d: 0x6c0e6a20, 0x1eb7e: 0x6c310c20, 0x1eb7f: 0x6c360420, + // Block 0x7ae, offset 0x1eb80 + 0x1eb80: 0x6d210020, 0x1eb81: 0x6ca56a20, 0x1eb82: 0x6c75a820, 0x1eb83: 0x6c4cbe20, + 0x1eb84: 0x6c5ce820, 0x1eb85: 0x6cfcbe20, 0x1eb86: 0x6c495020, 0x1eb87: 0x6c13a020, + 0x1eb88: 0x6c7d0220, 0x1eb89: 0x6c479820, 0x1eb8a: 0x6cd9ba20, 0x1eb8b: 0x6c14fc20, + 0x1eb8c: 0x6d130a20, 0x1eb8d: 0x6ca06020, 0x1eb8e: 0x6c0f2220, 0x1eb8f: 0x6c8e7620, + 0x1eb90: 0x6d04de20, 0x1eb91: 0x6c6ca820, 0x1eb92: 0x6c976e20, 0x1eb93: 0x6cca2820, + 0x1eb94: 0x6d3be020, 0x1eb95: 0x6ca46420, 0x1eb96: 0x6cd44220, 0x1eb97: 0x6c7c7220, + 0x1eb98: 0x6c4c9020, 0x1eb99: 0x6cfd6620, 0x1eb9a: 0x6c3b8020, 0x1eb9b: 0x6c0f3c20, + 0x1eb9c: 0x6ca64420, 0x1eb9d: 0x6c0a1420, 0x1eb9e: 0x6c0f6e20, 0x1eb9f: 0x6ce8fa20, + 0x1eba0: 0x6c4dbc20, 0x1eba1: 0x6c3a2020, 0x1eba2: 0x6c650e20, 0x1eba3: 0x6c015420, + 0x1eba4: 0x6c00fa20, 0x1eba5: 0x6c408020, 0x1eba6: 0x6cfaf620, 0x1eba7: 0x6d276c20, + 0x1eba8: 0x6d02f420, 0x1eba9: 0x6c3bb020, 0x1ebaa: 0x6cb1fe20, 0x1ebab: 0x6d02fa20, + 0x1ebac: 0x6c969820, 0x1ebad: 0x6d236020, 0x1ebae: 0x6c3caa20, 0x1ebaf: 0x6c4ed820, + 0x1ebb0: 0x6c2b7420, 0x1ebb1: 0x6ceb3220, 0x1ebb2: 0x6d306820, 0x1ebb3: 0x6c1b4220, + 0x1ebb4: 0x6d0a2420, 0x1ebb5: 0x6d3b1020, 0x1ebb6: 0x6d340c20, 0x1ebb7: 0x6cae2420, + 0x1ebb8: 0x6d034620, 0x1ebb9: 0x6cc64a20, 0x1ebba: 0x6cc97a20, 0x1ebbb: 0x6d27f820, + 0x1ebbc: 0x6cf1a420, 0x1ebbd: 0x6d348a20, 0x1ebbe: 0x6c28a020, 0x1ebbf: 0x6c935c20, + // Block 0x7af, offset 0x1ebc0 + 0x1ebc0: 0x6d1f5e20, 0x1ebc1: 0x6c0f3e20, 0x1ebc2: 0x6c060a20, 0x1ebc3: 0x6c748a20, + 0x1ebc4: 0x6ceb4220, 0x1ebc5: 0x6d184020, 0x1ebc6: 0x6cc13020, 0x1ebc7: 0x6cb4c220, + 0x1ebc8: 0x6cc13e20, 0x1ebc9: 0x6c6ee620, 0x1ebca: 0x6cb35c20, 0x1ebcb: 0x6d2f7020, + 0x1ebcc: 0x6d251220, 0x1ebcd: 0x6cadf020, 0x1ebce: 0x6d394c20, 0x1ebcf: 0x6c727220, + 0x1ebd0: 0x6d3b2620, 0x1ebd1: 0x6caa4420, 0x1ebd2: 0x6c70c820, 0x1ebd3: 0x6caf8820, + 0x1ebd4: 0x6d29fa20, 0x1ebd5: 0x6c645020, 0x1ebd6: 0x6c8d4e20, 0x1ebd7: 0x6d31f620, + 0x1ebd8: 0x6cdf3a20, 0x1ebd9: 0x6c404820, 0x1ebda: 0x6d103020, 0x1ebdb: 0x6cd2d820, + 0x1ebdc: 0x6c0a4020, 0x1ebdd: 0x6cebc220, 0x1ebde: 0x6ceb4620, 0x1ebdf: 0x6cd8e420, + 0x1ebe0: 0x6c8e9020, 0x1ebe1: 0x6c96de20, 0x1ebe2: 0x6cb13220, 0x1ebe3: 0x6ce24620, + 0x1ebe4: 0x6d36f820, 0x1ebe5: 0x6cc6b820, 0x1ebe6: 0x6ce2b620, 0x1ebe7: 0x6c308a20, + 0x1ebe8: 0x6d09ac20, 0x1ebe9: 0x6cc2a420, 0x1ebea: 0x6cd02220, 0x1ebeb: 0x6c6ee820, + 0x1ebec: 0x6c37a620, 0x1ebed: 0x6c4d7a20, 0x1ebee: 0x6c0f7020, 0x1ebef: 0x6d39ce20, + 0x1ebf0: 0x6d1a0c20, 0x1ebf1: 0x6c962a20, 0x1ebf2: 0x6d397a20, 0x1ebf3: 0x6c28bc20, + 0x1ebf4: 0x6d023820, 0x1ebf5: 0x6c8eb020, 0x1ebf6: 0x6c716a20, 0x1ebf7: 0x6cd97020, + 0x1ebf8: 0x6cbd4620, 0x1ebf9: 0x6c987a20, 0x1ebfa: 0x6c80ec20, 0x1ebfb: 0x6c4f2420, + 0x1ebfc: 0x6ce90020, 0x1ebfd: 0x6d07da20, 0x1ebfe: 0x6cea1420, 0x1ebff: 0x6c75f220, + // Block 0x7b0, offset 0x1ec00 + 0x1ec00: 0x6c35be20, 0x1ec01: 0x6c1a7a20, 0x1ec02: 0x6d03ac20, 0x1ec03: 0x6c005820, + 0x1ec04: 0x6c931420, 0x1ec05: 0x6d3c6c20, 0x1ec06: 0x6d38be20, 0x1ec07: 0x6ccf8220, + 0x1ec08: 0x6cb13620, 0x1ec09: 0x6c7d8c20, 0x1ec0a: 0x6ce24c20, 0x1ec0b: 0x6c7f2e20, + 0x1ec0c: 0x6d3fd220, 0x1ec0d: 0x6c78e220, 0x1ec0e: 0x6cb67c20, 0x1ec0f: 0x6cb67e20, + 0x1ec10: 0x6d0ede20, 0x1ec11: 0x6c3a2220, 0x1ec12: 0x6ccacc20, 0x1ec13: 0x6d0df020, + 0x1ec14: 0x6c445820, 0x1ec15: 0x6d11e220, 0x1ec16: 0x6cf54820, 0x1ec17: 0x6cb14e20, + 0x1ec18: 0x6c237620, 0x1ec19: 0x6cb15020, 0x1ec1a: 0x6cb9da20, 0x1ec1b: 0x6c3a2420, + 0x1ec1c: 0x6c5a2420, 0x1ec1d: 0x6cb9d420, 0x1ec1e: 0x6c5d6820, 0x1ec1f: 0x6d21de20, + 0x1ec20: 0x6ce3a820, 0x1ec21: 0x6cc32420, 0x1ec22: 0x6cfa1620, 0x1ec23: 0x6d3fd620, + 0x1ec24: 0x6c7cae20, 0x1ec25: 0x6cc76c20, 0x1ec26: 0x6cd84620, 0x1ec27: 0x6c488020, + 0x1ec28: 0x6ceb5c20, 0x1ec29: 0x6c4aa220, 0x1ec2a: 0x6cda0020, 0x1ec2b: 0x6cb94a20, + 0x1ec2c: 0x6c1a5a20, 0x1ec2d: 0x6d374e20, 0x1ec2e: 0x6c8ed620, 0x1ec2f: 0x6caef820, + 0x1ec30: 0x6ce2c820, 0x1ec31: 0x6cf7be20, 0x1ec32: 0x6c12b420, 0x1ec33: 0x6c31ea20, + 0x1ec34: 0x6d0efe20, 0x1ec35: 0x6d25cc20, 0x1ec36: 0x6d407220, 0x1ec37: 0x6ccad020, + 0x1ec38: 0x6ccde020, 0x1ec39: 0x6c84b020, 0x1ec3a: 0x6d376220, 0x1ec3b: 0x6cd6b020, + 0x1ec3c: 0x6c933820, 0x1ec3d: 0x6cf7c020, 0x1ec3e: 0x6c956c20, 0x1ec3f: 0x6d2eec20, + // Block 0x7b1, offset 0x1ec40 + 0x1ec40: 0x6ca19020, 0x1ec41: 0x6c030020, 0x1ec42: 0x6c118420, 0x1ec43: 0x6c0c5c20, + 0x1ec44: 0x6c237a20, 0x1ec45: 0x6cc16220, 0x1ec46: 0x6c0ac220, 0x1ec47: 0x6d376420, + 0x1ec48: 0x6d248020, 0x1ec49: 0x6d060c20, 0x1ec4a: 0x6c576c20, 0x1ec4b: 0x6c0e9e20, + 0x1ec4c: 0x6cdb7020, 0x1ec4d: 0x6cff5820, 0x1ec4e: 0x6c8c0a20, 0x1ec4f: 0x6d2ea420, + 0x1ec50: 0x6c33c620, 0x1ec51: 0x6c8eea20, 0x1ec52: 0x6ceb6220, 0x1ec53: 0x6c136a20, + 0x1ec54: 0x6c2d9e20, 0x1ec55: 0x6c68b220, 0x1ec56: 0x6ce60c20, 0x1ec57: 0x6d0f1620, + 0x1ec58: 0x6c958620, 0x1ec59: 0x6d2dca20, 0x1ec5a: 0x6c6df820, 0x1ec5b: 0x6d196a20, + 0x1ec5c: 0x6d139e20, 0x1ec5d: 0x6ceadc20, 0x1ec5e: 0x6cb20020, 0x1ec5f: 0x6d397220, + 0x1ec60: 0x6d0f2620, 0x1ec61: 0x6c902020, 0x1ec62: 0x6c937220, 0x1ec63: 0x6ce2e020, + 0x1ec64: 0x6cfda820, 0x1ec65: 0x6c630220, 0x1ec66: 0x6cd6ca20, 0x1ec67: 0x6c719c20, + 0x1ec68: 0x6cf7d020, 0x1ec69: 0x6c585020, 0x1ec6a: 0x6c84ee20, 0x1ec6b: 0x6c0c6820, + 0x1ec6c: 0x6c968c20, 0x1ec6d: 0x6d22ba20, 0x1ec6e: 0x6ceae220, 0x1ec6f: 0x6d09da20, + 0x1ec70: 0x6c1afa20, 0x1ec71: 0x6cc0d820, 0x1ec72: 0x6cc63e20, 0x1ec73: 0x6c0eb220, + 0x1ec74: 0x6c935020, 0x1ec75: 0x6d29f820, 0x1ec76: 0x6cd2ba20, 0x1ec77: 0x6cd89620, + 0x1ec78: 0x6c3fbc20, 0x1ec79: 0x6c706420, 0x1ec7a: 0x6d404820, 0x1ec7b: 0x6d3ab820, + 0x1ec7c: 0x6cebc020, 0x1ec7d: 0x6caa4020, 0x1ec7e: 0x6c643820, 0x1ec7f: 0x6d16d420, + // Block 0x7b2, offset 0x1ec80 + 0x1ec80: 0x6c273c20, 0x1ec81: 0x6cfe9020, 0x1ec82: 0x6c96b820, 0x1ec83: 0x6d19bc20, + 0x1ec84: 0x6c683a20, 0x1ec85: 0x6c572e20, 0x1ec86: 0x6c95ee20, 0x1ec87: 0x6c4d5c20, + 0x1ec88: 0x6cb10820, 0x1ec89: 0x6c0bf020, 0x1ec8a: 0x6c83b420, 0x1ec8b: 0x6c1a6c20, + 0x1ec8c: 0x6d0e5820, 0x1ec8d: 0x6d036e20, 0x1ec8e: 0x6cbd2820, 0x1ec8f: 0x6c75aa20, + 0x1ec90: 0x6cb5e220, 0x1ec91: 0x6cb5e420, 0x1ec92: 0x6c78aa20, 0x1ec93: 0x6d3c5c20, + 0x1ec94: 0x6d3f7e20, 0x1ec95: 0x6cdaae20, 0x1ec96: 0x6c116420, 0x1ec97: 0x6cb14a20, + 0x1ec98: 0x6d364820, 0x1ec99: 0x6c7c8220, 0x1ec9a: 0x6ccab020, 0x1ec9b: 0x6cf4f620, + 0x1ec9c: 0x6c02da20, 0x1ec9d: 0x6c8e7820, 0x1ec9e: 0x6cb8fa20, 0x1ec9f: 0x6ccd9020, + 0x1eca0: 0x6c0c1220, 0x1eca1: 0x6c955020, 0x1eca2: 0x6c233620, 0x1eca3: 0x6c15e220, + 0x1eca4: 0x6d395c20, 0x1eca5: 0x6c62c420, 0x1eca6: 0x6cd6ac20, 0x1eca7: 0x6cfd9420, + 0x1eca8: 0x6c476e20, 0x1eca9: 0x6cefb420, 0x1ecaa: 0x6cefd220, 0x1ecab: 0x6cefd420, + 0x1ecac: 0x6d214020, 0x1ecad: 0x6c422420, 0x1ecae: 0x6d17d620, 0x1ecaf: 0x6c01ec20, + 0x1ecb0: 0x6ce7f220, 0x1ecb1: 0x6c6bf020, 0x1ecb2: 0x6c065e20, 0x1ecb3: 0x6c074e20, + 0x1ecb4: 0x6c220c20, 0x1ecb5: 0x6ce3c620, 0x1ecb6: 0x6c2c0020, 0x1ecb7: 0x6c7a5620, + 0x1ecb8: 0x6c4d2820, 0x1ecb9: 0x6cbba020, 0x1ecba: 0x6c543020, 0x1ecbb: 0x6c7af020, + 0x1ecbc: 0x6c443220, 0x1ecbd: 0x6ce9ee20, 0x1ecbe: 0x6c452020, 0x1ecbf: 0x6cb12a20, + // Block 0x7b3, offset 0x1ecc0 + 0x1ecc0: 0x6c0a8220, 0x1ecc1: 0x6c783c20, 0x1ecc2: 0x6cb87a20, 0x1ecc3: 0x6d21ce20, + 0x1ecc4: 0x6cdc1420, 0x1ecc5: 0x6c90d020, 0x1ecc6: 0x6c0fb220, 0x1ecc7: 0x6cff4620, + 0x1ecc8: 0x6c055a20, 0x1ecc9: 0x6c0fb420, 0x1ecca: 0x6c221420, 0x1eccb: 0x6c7b5e20, + 0x1eccc: 0x6c0d9220, 0x1eccd: 0x6ca09420, 0x1ecce: 0x6c8a5220, 0x1eccf: 0x6c90da20, + 0x1ecd0: 0x6cff5220, 0x1ecd1: 0x6c31fe20, 0x1ecd2: 0x6d29f220, 0x1ecd3: 0x6cdc1a20, + 0x1ecd4: 0x6ce3d020, 0x1ecd5: 0x6c0d9620, 0x1ecd6: 0x6c7b6020, 0x1ecd7: 0x6c91a820, + 0x1ecd8: 0x6c42bc20, 0x1ecd9: 0x6c42c420, 0x1ecda: 0x6cbc5020, 0x1ecdb: 0x6c779420, + 0x1ecdc: 0x6cbc2c20, 0x1ecdd: 0x6c819420, 0x1ecde: 0x6ccb0c20, 0x1ecdf: 0x6c0bf420, + 0x1ece0: 0x6c7d6e20, 0x1ece1: 0x6c7d7620, 0x1ece2: 0x6c2b7620, 0x1ece3: 0x6c39da20, + 0x1ece4: 0x6d04ec20, 0x1ece5: 0x6cc47e20, 0x1ece6: 0x6c98f820, 0x1ece7: 0x6c28a220, + 0x1ece8: 0x6c7d7e20, 0x1ece9: 0x6c0d8620, 0x1ecea: 0x6c383e20, 0x1eceb: 0x6ce5a220, + 0x1ecec: 0x6caf8a20, 0x1eced: 0x6d3e9c20, 0x1ecee: 0x6c384220, 0x1ecef: 0x6cc48620, + 0x1ecf0: 0x6ce41a20, 0x1ecf1: 0x6c066420, 0x1ecf2: 0x6c0a4220, 0x1ecf3: 0x6c990420, + 0x1ecf4: 0x6c3eea20, 0x1ecf5: 0x6c376a20, 0x1ecf6: 0x6cc6ba20, 0x1ecf7: 0x6cc14420, + 0x1ecf8: 0x6c45b620, 0x1ecf9: 0x6d04f820, 0x1ecfa: 0x6c7e1620, 0x1ecfb: 0x6c628e20, + 0x1ecfc: 0x6caed220, 0x1ecfd: 0x6d3b6020, 0x1ecfe: 0x6cce8e20, 0x1ecff: 0x6cdd4420, + // Block 0x7b4, offset 0x1ed00 + 0x1ed00: 0x6ce43620, 0x1ed01: 0x6c86ba20, 0x1ed02: 0x6c0d8a20, 0x1ed03: 0x6d3fd420, + 0x1ed04: 0x6c2baa20, 0x1ed05: 0x6caee420, 0x1ed06: 0x6cd94820, 0x1ed07: 0x6d32f820, + 0x1ed08: 0x6cc32220, 0x1ed09: 0x6d3fd820, 0x1ed0a: 0x6cd76220, 0x1ed0b: 0x6c660e20, + 0x1ed0c: 0x6ceb9620, 0x1ed0d: 0x6c55f420, 0x1ed0e: 0x6c7eae20, 0x1ed0f: 0x6c6f8e20, + 0x1ed10: 0x6cb6a020, 0x1ed11: 0x6c889820, 0x1ed12: 0x6d320420, 0x1ed13: 0x6c0d9420, + 0x1ed14: 0x6caefa20, 0x1ed15: 0x6c96e620, 0x1ed16: 0x6cca0e20, 0x1ed17: 0x6c979e20, + 0x1ed18: 0x6c97a020, 0x1ed19: 0x6ccbbc20, 0x1ed1a: 0x6d061020, 0x1ed1b: 0x6c8b7a20, + 0x1ed1c: 0x6cb95420, 0x1ed1d: 0x6cb95220, 0x1ed1e: 0x6ca46220, 0x1ed1f: 0x6c58cc20, + 0x1ed20: 0x6c7e3220, 0x1ed21: 0x6ca94220, 0x1ed22: 0x6c0d9820, 0x1ed23: 0x6c8b8a20, + 0x1ed24: 0x6cc4fe20, 0x1ed25: 0x6c310e20, 0x1ed26: 0x6c313420, 0x1ed27: 0x6ca53620, + 0x1ed28: 0x6c53dc20, 0x1ed29: 0x6cf90e20, 0x1ed2a: 0x6c314e20, 0x1ed2b: 0x6c4e7220, + 0x1ed2c: 0x6c315420, 0x1ed2d: 0x6c315220, 0x1ed2e: 0x6c6f9620, 0x1ed2f: 0x6c170e20, + 0x1ed30: 0x6d249c20, 0x1ed31: 0x6d24a420, 0x1ed32: 0x6c43e020, 0x1ed33: 0x6d0ecc20, + 0x1ed34: 0x6c3f8e20, 0x1ed35: 0x6cbdb820, 0x1ed36: 0x6c4a9e20, 0x1ed37: 0x6d3fdc20, + 0x1ed38: 0x6c8f5820, 0x1ed39: 0x6c4aa620, 0x1ed3a: 0x6cce2a20, 0x1ed3b: 0x6d248220, + 0x1ed3c: 0x6c4ae220, 0x1ed3d: 0x6c9a9620, 0x1ed3e: 0x6c623220, 0x1ed3f: 0x6cb61220, + // Block 0x7b5, offset 0x1ed40 + 0x1ed40: 0x6c40da20, 0x1ed41: 0x6c7c9020, 0x1ed42: 0x6c5cf620, 0x1ed43: 0x6c038c20, + 0x1ed44: 0x6cb39c20, 0x1ed45: 0x6c9aa620, 0x1ed46: 0x6d05c820, 0x1ed47: 0x6d0dd220, + 0x1ed48: 0x6cff1a20, 0x1ed49: 0x6c89a220, 0x1ed4a: 0x6d242620, 0x1ed4b: 0x6ce9ca20, + 0x1ed4c: 0x6cb53e20, 0x1ed4d: 0x6cee3e20, 0x1ed4e: 0x6c89a820, 0x1ed4f: 0x6cf0f020, + 0x1ed50: 0x6c41bc20, 0x1ed51: 0x6c1aea20, 0x1ed52: 0x6cb17420, 0x1ed53: 0x6c0ab620, + 0x1ed54: 0x6ca09620, 0x1ed55: 0x6c616220, 0x1ed56: 0x6d060820, 0x1ed57: 0x6c1e3e20, + 0x1ed58: 0x6d0e2620, 0x1ed59: 0x6d2dcc20, 0x1ed5a: 0x6d211220, 0x1ed5b: 0x6c29c420, + 0x1ed5c: 0x6cc57620, 0x1ed5d: 0x6c6b0220, 0x1ed5e: 0x6c03f620, 0x1ed5f: 0x6c537c20, + 0x1ed60: 0x6ceacc20, 0x1ed61: 0x6c2e3620, 0x1ed62: 0x6c614e20, 0x1ed63: 0x6d073620, + 0x1ed64: 0x6c358020, 0x1ed65: 0x6c367c20, 0x1ed66: 0x6ccc1220, 0x1ed67: 0x6c4f8620, + 0x1ed68: 0x6cea6620, 0x1ed69: 0x6ca15e20, 0x1ed6a: 0x6c6c0020, 0x1ed6b: 0x6cd07220, + 0x1ed6c: 0x6c04d620, 0x1ed6d: 0x6d25a420, 0x1ed6e: 0x6cb01420, 0x1ed6f: 0x6c91d420, + 0x1ed70: 0x6cf1aa20, 0x1ed71: 0x6c55a620, 0x1ed72: 0x6c915a20, 0x1ed73: 0x6d289a20, + 0x1ed74: 0x6c39ae20, 0x1ed75: 0x6c3b9020, 0x1ed76: 0x6ca36820, 0x1ed77: 0x6d1f6c20, + 0x1ed78: 0x6cb15220, 0x1ed79: 0x6ca1b620, 0x1ed7a: 0x6c517e20, 0x1ed7b: 0x6cf9fa20, + 0x1ed7c: 0x6cc14620, 0x1ed7d: 0x6c4e3820, 0x1ed7e: 0x6caf9420, 0x1ed7f: 0x6c8d6220, + // Block 0x7b6, offset 0x1ed80 + 0x1ed80: 0x6ceb5220, 0x1ed81: 0x6c0e9820, 0x1ed82: 0x6cc0a020, 0x1ed83: 0x6cb2d220, + 0x1ed84: 0x6c3f0620, 0x1ed85: 0x6c0a6420, 0x1ed86: 0x6c22a420, 0x1ed87: 0x6cf0e020, + 0x1ed88: 0x6c70ce20, 0x1ed89: 0x6c2de220, 0x1ed8a: 0x6c03c620, 0x1ed8b: 0x6d1f7a20, + 0x1ed8c: 0x6c4bf020, 0x1ed8d: 0x6caf9620, 0x1ed8e: 0x6ca70620, 0x1ed8f: 0x6d03a020, + 0x1ed90: 0x6cdf4020, 0x1ed91: 0x6c066a20, 0x1ed92: 0x6c406020, 0x1ed93: 0x6d2c9820, + 0x1ed94: 0x6c728620, 0x1ed95: 0x6c473620, 0x1ed96: 0x6cd41e20, 0x1ed97: 0x6c309a20, + 0x1ed98: 0x6c27b020, 0x1ed99: 0x6cdeba20, 0x1ed9a: 0x6c6b4c20, 0x1ed9b: 0x6cd50e20, + 0x1ed9c: 0x6c548220, 0x1ed9d: 0x6cfe0420, 0x1ed9e: 0x6c376e20, 0x1ed9f: 0x6c01d620, + 0x1eda0: 0x6cef4820, 0x1eda1: 0x6d2fe620, 0x1eda2: 0x6d39d020, 0x1eda3: 0x6d1b8220, + 0x1eda4: 0x6c8b4020, 0x1eda5: 0x6c962e20, 0x1eda6: 0x6ce79420, 0x1eda7: 0x6ce3c820, + 0x1eda8: 0x6d18e220, 0x1eda9: 0x6c0e3020, 0x1edaa: 0x6cf03420, 0x1edab: 0x6c688a20, + 0x1edac: 0x6c7a6820, 0x1edad: 0x6c4a9220, 0x1edae: 0x6cfae620, 0x1edaf: 0x6c444820, + 0x1edb0: 0x6c5b4420, 0x1edb1: 0x6c81fc20, 0x1edb2: 0x6c40b820, 0x1edb3: 0x6c77ca20, + 0x1edb4: 0x6d055e20, 0x1edb5: 0x6c346820, 0x1edb6: 0x6c758820, 0x1edb7: 0x6ce3a020, + 0x1edb8: 0x6c9e4620, 0x1edb9: 0x6cce9220, 0x1edba: 0x6d2c9a20, 0x1edbb: 0x6cdd4620, + 0x1edbc: 0x6cbd4820, 0x1edbd: 0x6d21d020, 0x1edbe: 0x6ca57820, 0x1edbf: 0x6d30b420, + // Block 0x7b7, offset 0x1edc0 + 0x1edc0: 0x6c4bf620, 0x1edc1: 0x6c452420, 0x1edc2: 0x6cdb7c20, 0x1edc3: 0x6cf40220, + 0x1edc4: 0x6cc0a620, 0x1edc5: 0x6ccd1820, 0x1edc6: 0x6cb42020, 0x1edc7: 0x6c596220, + 0x1edc8: 0x6ce5a820, 0x1edc9: 0x6c854020, 0x1edca: 0x6ccc2420, 0x1edcb: 0x6ccc2620, + 0x1edcc: 0x6c77d020, 0x1edcd: 0x6c9b7e20, 0x1edce: 0x6c1a8e20, 0x1edcf: 0x6c87e620, + 0x1edd0: 0x6d409820, 0x1edd1: 0x6cf94c20, 0x1edd2: 0x6d1e6420, 0x1edd3: 0x6ca61020, + 0x1edd4: 0x6d3eba20, 0x1edd5: 0x6cb68820, 0x1edd6: 0x6d330c20, 0x1edd7: 0x6cfe0620, + 0x1edd8: 0x6ca57a20, 0x1edd9: 0x6c216e20, 0x1edda: 0x6c62c620, 0x1eddb: 0x6c2dec20, + 0x1eddc: 0x6cbd0020, 0x1eddd: 0x6c482c20, 0x1edde: 0x6d38f220, 0x1eddf: 0x6c302420, + 0x1ede0: 0x6c7f3020, 0x1ede1: 0x6c3aec20, 0x1ede2: 0x6ca61420, 0x1ede3: 0x6d192220, + 0x1ede4: 0x6c7d8e20, 0x1ede5: 0x6c932620, 0x1ede6: 0x6c703820, 0x1ede7: 0x6c168620, + 0x1ede8: 0x6c6de620, 0x1ede9: 0x6c951220, 0x1edea: 0x6c8d8a20, 0x1edeb: 0x6d406e20, + 0x1edec: 0x6c849420, 0x1eded: 0x6c9bf420, 0x1edee: 0x6d3fde20, 0x1edef: 0x6d375220, + 0x1edf0: 0x6ca70c20, 0x1edf1: 0x6c570420, 0x1edf2: 0x6d24c420, 0x1edf3: 0x6c2cb620, + 0x1edf4: 0x6cd20c20, 0x1edf5: 0x6cd02c20, 0x1edf6: 0x6c5d1620, 0x1edf7: 0x6ce3ac20, + 0x1edf8: 0x6c544020, 0x1edf9: 0x6d03b220, 0x1edfa: 0x6d39e420, 0x1edfb: 0x6c7ebc20, + 0x1edfc: 0x6d3fe020, 0x1edfd: 0x6d2b6820, 0x1edfe: 0x6c0b1820, 0x1edff: 0x6c0b1a20, + // Block 0x7b8, offset 0x1ee00 + 0x1ee00: 0x6c596420, 0x1ee01: 0x6cc32a20, 0x1ee02: 0x6d2b7020, 0x1ee03: 0x6ceeca20, + 0x1ee04: 0x6ceecc20, 0x1ee05: 0x6d21e620, 0x1ee06: 0x6c212420, 0x1ee07: 0x6cc77020, + 0x1ee08: 0x6c2f0a20, 0x1ee09: 0x6c5a2e20, 0x1ee0a: 0x6c893220, 0x1ee0b: 0x6d0e0620, + 0x1ee0c: 0x6cbfda20, 0x1ee0d: 0x6cbfdc20, 0x1ee0e: 0x6c661020, 0x1ee0f: 0x6c089c20, + 0x1ee10: 0x6c36dc20, 0x1ee11: 0x6d0ff220, 0x1ee12: 0x6c409020, 0x1ee13: 0x6cc9d820, + 0x1ee14: 0x6c41fa20, 0x1ee15: 0x6cf98220, 0x1ee16: 0x6ceb9820, 0x1ee17: 0x6c55fa20, + 0x1ee18: 0x6cd42420, 0x1ee19: 0x6cc93420, 0x1ee1a: 0x6d08d620, 0x1ee1b: 0x6cf17220, + 0x1ee1c: 0x6cba8820, 0x1ee1d: 0x6c508020, 0x1ee1e: 0x6cf39020, 0x1ee1f: 0x6c39b420, + 0x1ee20: 0x6ccad620, 0x1ee21: 0x6c8ee420, 0x1ee22: 0x6c96aa20, 0x1ee23: 0x6cd29620, + 0x1ee24: 0x6cd21420, 0x1ee25: 0x6c493a20, 0x1ee26: 0x6d3ec220, 0x1ee27: 0x6ce2d020, + 0x1ee28: 0x6cde2620, 0x1ee29: 0x6d117a20, 0x1ee2a: 0x6c35a820, 0x1ee2b: 0x6d1e0820, + 0x1ee2c: 0x6cb9e420, 0x1ee2d: 0x6cb6a420, 0x1ee2e: 0x6cf17420, 0x1ee2f: 0x6cc93820, + 0x1ee30: 0x6cd0ce20, 0x1ee31: 0x6c889e20, 0x1ee32: 0x6c028e20, 0x1ee33: 0x6c823420, + 0x1ee34: 0x6c5b0c20, 0x1ee35: 0x6c9fdc20, 0x1ee36: 0x6c62e620, 0x1ee37: 0x6ce5b620, + 0x1ee38: 0x6cc16820, 0x1ee39: 0x6c654a20, 0x1ee3a: 0x6cd03020, 0x1ee3b: 0x6c97a820, + 0x1ee3c: 0x6cf7c620, 0x1ee3d: 0x6cc0aa20, 0x1ee3e: 0x6c0c9c20, 0x1ee3f: 0x6c62e820, + // Block 0x7b9, offset 0x1ee40 + 0x1ee40: 0x6c62d820, 0x1ee41: 0x6d3a3c20, 0x1ee42: 0x6c679a20, 0x1ee43: 0x6d051420, + 0x1ee44: 0x6d3b9c20, 0x1ee45: 0x6d1de620, 0x1ee46: 0x6d2eee20, 0x1ee47: 0x6c776420, + 0x1ee48: 0x6d093620, 0x1ee49: 0x6c0cce20, 0x1ee4a: 0x6d248a20, 0x1ee4b: 0x6cc16a20, + 0x1ee4c: 0x6cfe6e20, 0x1ee4d: 0x6c0ea220, 0x1ee4e: 0x6c697820, 0x1ee4f: 0x6d0a5a20, + 0x1ee50: 0x6cdb7220, 0x1ee51: 0x6c5a3a20, 0x1ee52: 0x6d420020, 0x1ee53: 0x6ccdee20, + 0x1ee54: 0x6ccdf020, 0x1ee55: 0x6c387620, 0x1ee56: 0x6c4bae20, 0x1ee57: 0x6c8c0c20, + 0x1ee58: 0x6d0a5c20, 0x1ee59: 0x6c9e8620, 0x1ee5a: 0x6cf82c20, 0x1ee5b: 0x6d2bbe20, + 0x1ee5c: 0x6cfe7820, 0x1ee5d: 0x6c3c0620, 0x1ee5e: 0x6c494620, 0x1ee5f: 0x6c548a20, + 0x1ee60: 0x6c7b4e20, 0x1ee61: 0x6d2b7220, 0x1ee62: 0x6ccada20, 0x1ee63: 0x6d2dd020, + 0x1ee64: 0x6c420420, 0x1ee65: 0x6c4bb220, 0x1ee66: 0x6d1d6020, 0x1ee67: 0x6c855220, + 0x1ee68: 0x6c16da20, 0x1ee69: 0x6c836e20, 0x1ee6a: 0x6cd63a20, 0x1ee6b: 0x6c011020, + 0x1ee6c: 0x6cc7f220, 0x1ee6d: 0x6c62fe20, 0x1ee6e: 0x6d076e20, 0x1ee6f: 0x6c56f220, + 0x1ee70: 0x6cd63c20, 0x1ee71: 0x6c87bc20, 0x1ee72: 0x6c8b8e20, 0x1ee73: 0x6c87c620, + 0x1ee74: 0x6c9f2020, 0x1ee75: 0x6d31a620, 0x1ee76: 0x6cfe1220, 0x1ee77: 0x6c370220, + 0x1ee78: 0x6c91ac20, 0x1ee79: 0x6c49ca20, 0x1ee7a: 0x6c84f020, 0x1ee7b: 0x6cfb1c20, + 0x1ee7c: 0x6d20ce20, 0x1ee7d: 0x6c29c220, 0x1ee7e: 0x6c613a20, 0x1ee7f: 0x6d1f4220, + // Block 0x7ba, offset 0x1ee80 + 0x1ee80: 0x6cea5c20, 0x1ee81: 0x6c91c020, 0x1ee82: 0x6c39ac20, 0x1ee83: 0x6c035420, + 0x1ee84: 0x6c515220, 0x1ee85: 0x6c03be20, 0x1ee86: 0x6cb2ba20, 0x1ee87: 0x6ca70020, + 0x1ee88: 0x6c915620, 0x1ee89: 0x6d1f5220, 0x1ee8a: 0x6d2c8020, 0x1ee8b: 0x6c401420, + 0x1ee8c: 0x6c03c020, 0x1ee8d: 0x6c065620, 0x1ee8e: 0x6c547620, 0x1ee8f: 0x6cb00220, + 0x1ee90: 0x6cdf2c20, 0x1ee91: 0x6c4a8220, 0x1ee92: 0x6c6b1620, 0x1ee93: 0x6c77b420, + 0x1ee94: 0x6ceffa20, 0x1ee95: 0x6c376420, 0x1ee96: 0x6ce77620, 0x1ee97: 0x6d2b6220, + 0x1ee98: 0x6c547c20, 0x1ee99: 0x6c7b2e20, 0x1ee9a: 0x6c625a20, 0x1ee9b: 0x6c686220, + 0x1ee9c: 0x6cfac620, 0x1ee9d: 0x6d2c8820, 0x1ee9e: 0x6cfdfa20, 0x1ee9f: 0x6d0a2c20, + 0x1eea0: 0x6c451e20, 0x1eea1: 0x6c843820, 0x1eea2: 0x6c884620, 0x1eea3: 0x6c64ea20, + 0x1eea4: 0x6c852c20, 0x1eea5: 0x6cd28820, 0x1eea6: 0x6ce5a420, 0x1eea7: 0x6c4be820, + 0x1eea8: 0x6ccc1620, 0x1eea9: 0x6c595020, 0x1eeaa: 0x6c758020, 0x1eeab: 0x6c626e20, + 0x1eeac: 0x6d1e5a20, 0x1eead: 0x6cbe5820, 0x1eeae: 0x6c8d6420, 0x1eeaf: 0x6cb65820, + 0x1eeb0: 0x6d406820, 0x1eeb1: 0x6c3a1c20, 0x1eeb2: 0x6c7d8620, 0x1eeb3: 0x6c168020, + 0x1eeb4: 0x6c482a20, 0x1eeb5: 0x6ca60a20, 0x1eeb6: 0x6ca70820, 0x1eeb7: 0x6c2de420, + 0x1eeb8: 0x6c6dd420, 0x1eeb9: 0x6cd02420, 0x1eeba: 0x6cd20020, 0x1eebb: 0x6d3e9e20, + 0x1eebc: 0x6c3bf820, 0x1eebd: 0x6c2ef620, 0x1eebe: 0x6c089420, 0x1eebf: 0x6c16ce20, + // Block 0x7bb, offset 0x1eec0 + 0x1eec0: 0x6ce39020, 0x1eec1: 0x6cf16c20, 0x1eec2: 0x6ceec420, 0x1eec3: 0x6cc9d220, + 0x1eec4: 0x6c36c020, 0x1eec5: 0x6cbfd220, 0x1eec6: 0x6c407020, 0x1eec7: 0x6c5a1620, + 0x1eec8: 0x6cc31e20, 0x1eec9: 0x6c678a20, 0x1eeca: 0x6c0b1220, 0x1eecb: 0x6ccac820, + 0x1eecc: 0x6c028020, 0x1eecd: 0x6cb68020, 0x1eece: 0x6cde1e20, 0x1eecf: 0x6c493220, + 0x1eed0: 0x6d116620, 0x1eed1: 0x6cad1220, 0x1eed2: 0x6c651e20, 0x1eed3: 0x6c823020, + 0x1eed4: 0x6c0c9a20, 0x1eed5: 0x6d093420, 0x1eed6: 0x6c0cc820, 0x1eed7: 0x6c979820, + 0x1eed8: 0x6c9fd820, 0x1eed9: 0x6d1dd220, 0x1eeda: 0x6cf10420, 0x1eedb: 0x6cf7b620, + 0x1eedc: 0x6c4ba020, 0x1eedd: 0x6ccde220, 0x1eede: 0x6c8c0620, 0x1eedf: 0x6d41fe20, + 0x1eee0: 0x6c56e420, 0x1eee1: 0x6c41fe20, 0x1eee2: 0x6c854a20, 0x1eee3: 0x6d2dc820, + 0x1eee4: 0x6c496e20, 0x1eee5: 0x6ca79a20, 0x1eee6: 0x6d15f420, 0x1eee7: 0x6c3ebc20, + 0x1eee8: 0x6c864220, 0x1eee9: 0x6c6f7e20, 0x1eeea: 0x6c102220, 0x1eeeb: 0x6d0e8e20, + 0x1eeec: 0x6c3f5020, 0x1eeed: 0x6c2dd020, 0x1eeee: 0x6c5efc20, 0x1eeef: 0x6c3cea20, + 0x1eef0: 0x6cc83620, 0x1eef1: 0x6c41ac20, 0x1eef2: 0x6cd1e820, 0x1eef3: 0x6c3cee20, + 0x1eef4: 0x6ca01420, 0x1eef5: 0x6c060c20, 0x1eef6: 0x6d250820, 0x1eef7: 0x6d341420, + 0x1eef8: 0x6c56c420, 0x1eef9: 0x6cbd9a20, 0x1eefa: 0x6c3d9820, 0x1eefb: 0x6c049620, + 0x1eefc: 0x6cf1ac20, 0x1eefd: 0x6c64ec20, 0x1eefe: 0x6cd1f620, 0x1eeff: 0x6d23e420, + // Block 0x7bc, offset 0x1ef00 + 0x1ef00: 0x6c3d3220, 0x1ef01: 0x6d10b620, 0x1ef02: 0x6c74b020, 0x1ef03: 0x6c74b220, + 0x1ef04: 0x6cb06c20, 0x1ef05: 0x6c583020, 0x1ef06: 0x6d326820, 0x1ef07: 0x6c061220, + 0x1ef08: 0x6d0eb420, 0x1ef09: 0x6d0af620, 0x1ef0a: 0x6d336420, 0x1ef0b: 0x6c399c20, + 0x1ef0c: 0x6c3cf020, 0x1ef0d: 0x6cf1ae20, 0x1ef0e: 0x6cab5220, 0x1ef0f: 0x6c279220, + 0x1ef10: 0x6c43ac20, 0x1ef11: 0x6cc7ca20, 0x1ef12: 0x6c8d6620, 0x1ef13: 0x6c9eea20, + 0x1ef14: 0x6c3eec20, 0x1ef15: 0x6ceb5420, 0x1ef16: 0x6c9f7c20, 0x1ef17: 0x6c869620, + 0x1ef18: 0x6c0b5020, 0x1ef19: 0x6d36fc20, 0x1ef1a: 0x6c43ae20, 0x1ef1b: 0x6d251420, + 0x1ef1c: 0x6c227620, 0x1ef1d: 0x6cc1cc20, 0x1ef1e: 0x6cff1c20, 0x1ef1f: 0x6c1adc20, + 0x1ef20: 0x6c28c020, 0x1ef21: 0x6c70d020, 0x1ef22: 0x6d11d620, 0x1ef23: 0x6c473820, + 0x1ef24: 0x6c301820, 0x1ef25: 0x6d240020, 0x1ef26: 0x6d0f6e20, 0x1ef27: 0x6cc73a20, + 0x1ef28: 0x6d0afe20, 0x1ef29: 0x6ce60420, 0x1ef2a: 0x6d240220, 0x1ef2b: 0x6ce54420, + 0x1ef2c: 0x6d1bf820, 0x1ef2d: 0x6c331620, 0x1ef2e: 0x6cf38620, 0x1ef2f: 0x6c377020, + 0x1ef30: 0x6c487c20, 0x1ef31: 0x6c00d420, 0x1ef32: 0x6d341a20, 0x1ef33: 0x6d0ed620, + 0x1ef34: 0x6c527a20, 0x1ef35: 0x6cff2c20, 0x1ef36: 0x6c63f020, 0x1ef37: 0x6c8b4220, + 0x1ef38: 0x6d39d220, 0x1ef39: 0x6d0fe220, 0x1ef3a: 0x6ce39220, 0x1ef3b: 0x6c539220, + 0x1ef3c: 0x6c963020, 0x1ef3d: 0x6cc7da20, 0x1ef3e: 0x6ca1f220, 0x1ef3f: 0x6c43b820, + // Block 0x7bd, offset 0x1ef40 + 0x1ef40: 0x6cc57e20, 0x1ef41: 0x6c688c20, 0x1ef42: 0x6d050220, 0x1ef43: 0x6d38ba20, + 0x1ef44: 0x6d341c20, 0x1ef45: 0x6c963220, 0x1ef46: 0x6c528c20, 0x1ef47: 0x6ca77620, + 0x1ef48: 0x6c370820, 0x1ef49: 0x6c944620, 0x1ef4a: 0x6c63f220, 0x1ef4b: 0x6c62b420, + 0x1ef4c: 0x6ce90420, 0x1ef4d: 0x6c583820, 0x1ef4e: 0x6ceb9220, 0x1ef4f: 0x6c104a20, + 0x1ef50: 0x6cf40420, 0x1ef51: 0x6c730820, 0x1ef52: 0x6d244820, 0x1ef53: 0x6c0f9c20, + 0x1ef54: 0x6c75f620, 0x1ef55: 0x6d0aae20, 0x1ef56: 0x6c089220, 0x1ef57: 0x6cf71020, + 0x1ef58: 0x6c75f820, 0x1ef59: 0x6c717620, 0x1ef5a: 0x6ce87e20, 0x1ef5b: 0x6c6de420, + 0x1ef5c: 0x6ce3a220, 0x1ef5d: 0x6c359020, 0x1ef5e: 0x6c359220, 0x1ef5f: 0x6c7bcc20, + 0x1ef60: 0x6c55e820, 0x1ef61: 0x6cf48a20, 0x1ef62: 0x6cd02a20, 0x1ef63: 0x6c7f6620, + 0x1ef64: 0x6c69ee20, 0x1ef65: 0x6cacca20, 0x1ef66: 0x6c932820, 0x1ef67: 0x6cb02c20, + 0x1ef68: 0x6cd51a20, 0x1ef69: 0x6c3f2220, 0x1ef6a: 0x6c015e20, 0x1ef6b: 0x6d3dd020, + 0x1ef6c: 0x6caef420, 0x1ef6d: 0x6cbdba20, 0x1ef6e: 0x6cb94220, 0x1ef6f: 0x6c06be20, + 0x1ef70: 0x6c2dee20, 0x1ef71: 0x6c932a20, 0x1ef72: 0x6cc42c20, 0x1ef73: 0x6c652a20, + 0x1ef74: 0x6c718420, 0x1ef75: 0x6ce92a20, 0x1ef76: 0x6d0b0420, 0x1ef77: 0x6d252020, + 0x1ef78: 0x6cb68e20, 0x1ef79: 0x6c849620, 0x1ef7a: 0x6d138620, 0x1ef7b: 0x6d3c7020, + 0x1ef7c: 0x6c798e20, 0x1ef7d: 0x6c352020, 0x1ef7e: 0x6c7d9020, 0x1ef7f: 0x6cd11c20, + // Block 0x7be, offset 0x1ef80 + 0x1ef80: 0x6cb69020, 0x1ef81: 0x6c6de820, 0x1ef82: 0x6d192420, 0x1ef83: 0x6d192620, + 0x1ef84: 0x6c6dea20, 0x1ef85: 0x6d3ebc20, 0x1ef86: 0x6c7f3220, 0x1ef87: 0x6c302620, + 0x1ef88: 0x6cb55020, 0x1ef89: 0x6c219420, 0x1ef8a: 0x6c44e620, 0x1ef8b: 0x6c70e020, + 0x1ef8c: 0x6c74f620, 0x1ef8d: 0x6d199620, 0x1ef8e: 0x6d422420, 0x1ef8f: 0x6c5f8a20, + 0x1ef90: 0x6cd62c20, 0x1ef91: 0x6d1c1420, 0x1ef92: 0x6c1c9220, 0x1ef93: 0x6c9e8220, + 0x1ef94: 0x6cc77220, 0x1ef95: 0x6c016220, 0x1ef96: 0x6cbfe020, 0x1ef97: 0x6ce3ae20, + 0x1ef98: 0x6c55fc20, 0x1ef99: 0x6ce3b020, 0x1ef9a: 0x6c36e020, 0x1ef9b: 0x6c6a4420, + 0x1ef9c: 0x6c991220, 0x1ef9d: 0x6c3f2620, 0x1ef9e: 0x6c212820, 0x1ef9f: 0x6ce90820, + 0x1efa0: 0x6d0e0820, 0x1efa1: 0x6c51a020, 0x1efa2: 0x6d25d020, 0x1efa3: 0x6cb10620, + 0x1efa4: 0x6c7d9620, 0x1efa5: 0x6c9a3e20, 0x1efa6: 0x6c55fe20, 0x1efa7: 0x6d1c1620, + 0x1efa8: 0x6c204820, 0x1efa9: 0x6cf54c20, 0x1efaa: 0x6c718a20, 0x1efab: 0x6c309c20, + 0x1efac: 0x6c124420, 0x1efad: 0x6c39e020, 0x1efae: 0x6c520a20, 0x1efaf: 0x6d1c3620, + 0x1efb0: 0x6d25d220, 0x1efb1: 0x6cfb0620, 0x1efb2: 0x6cf24620, 0x1efb3: 0x6cd21620, + 0x1efb4: 0x6c520c20, 0x1efb5: 0x6c1eca20, 0x1efb6: 0x6ce16820, 0x1efb7: 0x6cfa1a20, + 0x1efb8: 0x6cc93a20, 0x1efb9: 0x6c8ee620, 0x1efba: 0x6c60fe20, 0x1efbb: 0x6c474c20, + 0x1efbc: 0x6c654620, 0x1efbd: 0x6cdd0420, 0x1efbe: 0x6c4f3a20, 0x1efbf: 0x6c228020, + // Block 0x7bf, offset 0x1efc0 + 0x1efc0: 0x6c228220, 0x1efc1: 0x6d195420, 0x1efc2: 0x6d124820, 0x1efc3: 0x6d0f0220, + 0x1efc4: 0x6c5f9a20, 0x1efc5: 0x6c875c20, 0x1efc6: 0x6ce4d220, 0x1efc7: 0x6c7a0e20, + 0x1efc8: 0x6ce30620, 0x1efc9: 0x6ce30820, 0x1efca: 0x6d195620, 0x1efcb: 0x6ce90c20, + 0x1efcc: 0x6c96ac20, 0x1efcd: 0x6c68ae20, 0x1efce: 0x6c42f420, 0x1efcf: 0x6ce4d420, + 0x1efd0: 0x6c18fe20, 0x1efd1: 0x6c610020, 0x1efd2: 0x6ce97620, 0x1efd3: 0x6d311020, + 0x1efd4: 0x6c029020, 0x1efd5: 0x6d11e620, 0x1efd6: 0x6d143c20, 0x1efd7: 0x6cab6620, + 0x1efd8: 0x6c1c9820, 0x1efd9: 0x6d376e20, 0x1efda: 0x6c8f5c20, 0x1efdb: 0x6d1de820, + 0x1efdc: 0x6c937020, 0x1efdd: 0x6c0aca20, 0x1efde: 0x6cd6b820, 0x1efdf: 0x6d3de420, + 0x1efe0: 0x6d21fa20, 0x1efe1: 0x6cf41020, 0x1efe2: 0x6c752620, 0x1efe3: 0x6d1ab620, + 0x1efe4: 0x6ce3b820, 0x1efe5: 0x6cd85620, 0x1efe6: 0x6c68b420, 0x1efe7: 0x6d196c20, + 0x1efe8: 0x6c577020, 0x1efe9: 0x6c0ad020, 0x1efea: 0x6d1c4620, 0x1efeb: 0x6cdb7420, + 0x1efec: 0x6c5a3c20, 0x1efed: 0x6c38f820, 0x1efee: 0x6c68b620, 0x1efef: 0x6c8a5a20, + 0x1eff0: 0x6d0f1820, 0x1eff1: 0x6c42f820, 0x1eff2: 0x6c704020, 0x1eff3: 0x6cfbda20, + 0x1eff4: 0x6cfbdc20, 0x1eff5: 0x6ce90e20, 0x1eff6: 0x6c971c20, 0x1eff7: 0x6d420220, + 0x1eff8: 0x6d248e20, 0x1eff9: 0x6d1c4a20, 0x1effa: 0x6c934220, 0x1effb: 0x6ce97820, + 0x1effc: 0x6cfbde20, 0x1effd: 0x6d092e20, 0x1effe: 0x6d197820, 0x1efff: 0x6cb0e020, + // Block 0x7c0, offset 0x1f000 + 0x1f000: 0x6c1efc20, 0x1f001: 0x6c958c20, 0x1f002: 0x6cf75c20, 0x1f003: 0x6d15a220, + 0x1f004: 0x6c5fb220, 0x1f005: 0x6d2b2c20, 0x1f006: 0x6d220820, 0x1f007: 0x6d2dd220, + 0x1f008: 0x6d13a420, 0x1f009: 0x6d0ffa20, 0x1f00a: 0x6cb0e220, 0x1f00b: 0x6ca94420, + 0x1f00c: 0x6c56f420, 0x1f00d: 0x6c9cd220, 0x1f00e: 0x6d1c5020, 0x1f00f: 0x6c9bc420, + 0x1f010: 0x6c2bc220, 0x1f011: 0x6d273620, 0x1f012: 0x6d249020, 0x1f013: 0x6c831a20, + 0x1f014: 0x6c068620, 0x1f015: 0x6c91ae20, 0x1f016: 0x6c521220, 0x1f017: 0x6c902220, + 0x1f018: 0x6cd6cc20, 0x1f019: 0x6d274020, 0x1f01a: 0x6d1c5220, 0x1f01b: 0x6c49cc20, + 0x1f01c: 0x6cc23820, 0x1f01d: 0x6c84f220, 0x1f01e: 0x6c948820, 0x1f01f: 0x6ca78a20, + 0x1f020: 0x6c6f5a20, 0x1f021: 0x6c5e8820, 0x1f022: 0x6d24ca20, 0x1f023: 0x6c9fea20, + 0x1f024: 0x6cd1a020, 0x1f025: 0x6cab3620, 0x1f026: 0x6d0ada20, 0x1f027: 0x6c122620, + 0x1f028: 0x6c05ec20, 0x1f029: 0x6d322a20, 0x1f02a: 0x6c470420, 0x1f02b: 0x6c2fec20, + 0x1f02c: 0x6c914a20, 0x1f02d: 0x6d0ae420, 0x1f02e: 0x6cfeae20, 0x1f02f: 0x6d0f5820, + 0x1f030: 0x6c8cda20, 0x1f031: 0x6c1aa620, 0x1f032: 0x6cc18220, 0x1f033: 0x6d24d820, + 0x1f034: 0x6d090420, 0x1f035: 0x6ceb1220, 0x1f036: 0x6cd7de20, 0x1f037: 0x6d361220, + 0x1f038: 0x6c375620, 0x1f039: 0x6c485820, 0x1f03a: 0x6d04d220, 0x1f03b: 0x6c526620, + 0x1f03c: 0x6d388020, 0x1f03d: 0x6c438a20, 0x1f03e: 0x6c943820, 0x1f03f: 0x6c534820, + // Block 0x7c1, offset 0x1f040 + 0x1f040: 0x6cf3ce20, 0x1f041: 0x6c0f0c20, 0x1f042: 0x6c83dc20, 0x1f043: 0x6c72f820, + 0x1f044: 0x6c479a20, 0x1f045: 0x6c357220, 0x1f046: 0x6d236220, 0x1f047: 0x6cfb6820, + 0x1f048: 0x6ce33a20, 0x1f049: 0x6cf45420, 0x1f04a: 0x6cc42a20, 0x1f04b: 0x6c9e7a20, + 0x1f04c: 0x6c013e20, 0x1f04d: 0x6c7d7820, 0x1f04e: 0x6c06b420, 0x1f04f: 0x6caeb020, + 0x1f050: 0x6cb8fc20, 0x1f051: 0x6c219220, 0x1f052: 0x6c44d620, 0x1f053: 0x6d250220, + 0x1f054: 0x6cdadc20, 0x1f055: 0x6c558e20, 0x1f056: 0x6c516020, 0x1f057: 0x6c367e20, + 0x1f058: 0x6c47bc20, 0x1f059: 0x6cbfba20, 0x1f05a: 0x6c225a20, 0x1f05b: 0x6c9a1e20, + 0x1f05c: 0x6cf51220, 0x1f05d: 0x6d187820, 0x1f05e: 0x6d122020, 0x1f05f: 0x6cf23820, + 0x1f060: 0x6c8e9420, 0x1f061: 0x6c60a020, 0x1f062: 0x6d187a20, 0x1f063: 0x6c64ee20, + 0x1f064: 0x6c51e220, 0x1f065: 0x6d141c20, 0x1f066: 0x6d1bfa20, 0x1f067: 0x6d310420, + 0x1f068: 0x6c8f4420, 0x1f069: 0x6c8a2e20, 0x1f06a: 0x6c689220, 0x1f06b: 0x6c703020, + 0x1f06c: 0x6d242a20, 0x1f06d: 0x6c931820, 0x1f06e: 0x6c58b420, 0x1f06f: 0x6d2db020, + 0x1f070: 0x6d1c0c20, 0x1f071: 0x6c56da20, 0x1f072: 0x6c9b8020, 0x1f073: 0x6c49c020, + 0x1f074: 0x6cd6ba20, 0x1f075: 0x6c91bc20, 0x1f076: 0x6c6c5820, 0x1f077: 0x6c8d6820, + 0x1f078: 0x6c661220, 0x1f079: 0x6cfbd020, 0x1f07a: 0x6c25fe20, 0x1f07b: 0x6c662620, + 0x1f07c: 0x6c664020, 0x1f07d: 0x6d0d1a20, 0x1f07e: 0x6c25f420, 0x1f07f: 0x6c924c20, + // Block 0x7c2, offset 0x1f080 + 0x1f080: 0x6d1eaa20, 0x1f081: 0x6c241620, 0x1f082: 0x6c614c20, 0x1f083: 0x6cad6820, + 0x1f084: 0x6c241820, 0x1f085: 0x6cad6c20, 0x1f086: 0x6d3b3220, 0x1f087: 0x6c758220, + 0x1f088: 0x6d3a8220, 0x1f089: 0x6c651020, 0x1f08a: 0x6c9c8420, 0x1f08b: 0x6c9c8620, + 0x1f08c: 0x6d22a820, 0x1f08d: 0x6c8ec820, 0x1f08e: 0x6c18f420, 0x1f08f: 0x6c758a20, + 0x1f090: 0x6c8bf620, 0x1f091: 0x6ca61a20, 0x1f092: 0x6cb69420, 0x1f093: 0x6c932c20, + 0x1f094: 0x6c703a20, 0x1f095: 0x6c758c20, 0x1f096: 0x6c6df020, 0x1f097: 0x6c871420, + 0x1f098: 0x6cfd9820, 0x1f099: 0x6cfbd220, 0x1f09a: 0x6c639020, 0x1f09b: 0x6c9ca620, + 0x1f09c: 0x6c875e20, 0x1f09d: 0x6ccf8e20, 0x1f09e: 0x6d2ef220, 0x1f09f: 0x6c8c1020, + 0x1f0a0: 0x6c6dfa20, 0x1f0a1: 0x6cb6b620, 0x1f0a2: 0x6c8de220, 0x1f0a3: 0x6d0d2820, + 0x1f0a4: 0x6c241a20, 0x1f0a5: 0x6c973220, 0x1f0a6: 0x6c972620, 0x1f0a7: 0x6c516220, + 0x1f0a8: 0x6c17a620, 0x1f0a9: 0x6c3d9c20, 0x1f0aa: 0x6c9e5e20, 0x1f0ab: 0x6c9e3e20, + 0x1f0ac: 0x6c3da820, 0x1f0ad: 0x6cad9c20, 0x1f0ae: 0x6cc27e20, 0x1f0af: 0x6cc14c20, + 0x1f0b0: 0x6ca1f420, 0x1f0b1: 0x6c3db020, 0x1f0b2: 0x6cfd2c20, 0x1f0b3: 0x6c7f3420, + 0x1f0b4: 0x6cc15820, 0x1f0b5: 0x6c9e6a20, 0x1f0b6: 0x6c1ca620, 0x1f0b7: 0x6c3c9420, + 0x1f0b8: 0x6c3d6e20, 0x1f0b9: 0x6cc14020, 0x1f0ba: 0x6c9e6420, 0x1f0bb: 0x6c966820, + 0x1f0bc: 0x6c99c420, 0x1f0bd: 0x6ca07020, 0x1f0be: 0x6c5af020, 0x1f0bf: 0x6ca1b820, + // Block 0x7c3, offset 0x1f0c0 + 0x1f0c0: 0x6d407020, 0x1f0c1: 0x6caaae20, 0x1f0c2: 0x6c3bb420, 0x1f0c3: 0x6c59ce20, + 0x1f0c4: 0x6c59b820, 0x1f0c5: 0x6c6c5a20, 0x1f0c6: 0x6c49f620, 0x1f0c7: 0x6ce47420, + 0x1f0c8: 0x6ce81c20, 0x1f0c9: 0x6c538c20, 0x1f0ca: 0x6c57c820, 0x1f0cb: 0x6c7c0820, + 0x1f0cc: 0x6c539a20, 0x1f0cd: 0x6cd56020, 0x1f0ce: 0x6c843a20, 0x1f0cf: 0x6ca70a20, + 0x1f0d0: 0x6c1af220, 0x1f0d1: 0x6c521c20, 0x1f0d2: 0x6c521a20, 0x1f0d3: 0x6d187c20, + 0x1f0d4: 0x6cb9ce20, 0x1f0d5: 0x6c284820, 0x1f0d6: 0x6cf8ea20, 0x1f0d7: 0x6cea2e20, + 0x1f0d8: 0x6ca17020, 0x1f0d9: 0x6ca15020, 0x1f0da: 0x6cb9d220, 0x1f0db: 0x6c279e20, + 0x1f0dc: 0x6c1f8420, 0x1f0dd: 0x6d1ff620, 0x1f0de: 0x6c2d2e20, 0x1f0df: 0x6d143020, + 0x1f0e0: 0x6cfa1220, 0x1f0e1: 0x6d0df220, 0x1f0e2: 0x6cc15a20, 0x1f0e3: 0x6c9a7220, + 0x1f0e4: 0x6d0e0a20, 0x1f0e5: 0x6cbe9420, 0x1f0e6: 0x6d271220, 0x1f0e7: 0x6c84a220, + 0x1f0e8: 0x6c293820, 0x1f0e9: 0x6c31ec20, 0x1f0ea: 0x6c11e820, 0x1f0eb: 0x6d0c4820, + 0x1f0ec: 0x6d0d0820, 0x1f0ed: 0x6d0e1420, 0x1f0ee: 0x6c285820, 0x1f0ef: 0x6c01e420, + 0x1f0f0: 0x6d320a20, 0x1f0f1: 0x6c27ac20, 0x1f0f2: 0x6c11ea20, 0x1f0f3: 0x6d144020, + 0x1f0f4: 0x6c9a4620, 0x1f0f5: 0x6d2e4220, 0x1f0f6: 0x6d0e3420, 0x1f0f7: 0x6c320e20, + 0x1f0f8: 0x6c91b020, 0x1f0f9: 0x6d353420, 0x1f0fa: 0x6c3bc220, 0x1f0fb: 0x6c3f1020, + 0x1f0fc: 0x6c3f9820, 0x1f0fd: 0x6c9e3220, 0x1f0fe: 0x6c9e0a20, 0x1f0ff: 0x6d25bc20, + // Block 0x7c4, offset 0x1f100 + 0x1f100: 0x6c247220, 0x1f101: 0x6cc28420, 0x1f102: 0x6c178820, 0x1f103: 0x6cebfc20, + 0x1f104: 0x6d39e620, 0x1f105: 0x6d342a20, 0x1f106: 0x6c9bbe20, 0x1f107: 0x6c029420, + 0x1f108: 0x6c0cd020, 0x1f109: 0x6ceb6a20, 0x1f10a: 0x6c0ada20, 0x1f10b: 0x6d257220, + 0x1f10c: 0x6c176620, 0x1f10d: 0x6ceb5e20, 0x1f10e: 0x6c2f7420, 0x1f10f: 0x6c9d7420, + 0x1f110: 0x6ca3d020, 0x1f111: 0x6c2f7c20, 0x1f112: 0x6d3e8420, 0x1f113: 0x6c47a620, + 0x1f114: 0x6c47a820, 0x1f115: 0x6c302220, 0x1f116: 0x6c3ba420, 0x1f117: 0x6ce25020, + 0x1f118: 0x6d252820, 0x1f119: 0x6cb03a20, 0x1f11a: 0x6c168e20, 0x1f11b: 0x6c42f620, + 0x1f11c: 0x6cb80820, 0x1f11d: 0x6d252a20, 0x1f11e: 0x6ce0e220, 0x1f11f: 0x6ce29820, + 0x1f120: 0x6cd56620, 0x1f121: 0x6cd55220, 0x1f122: 0x6c3b9e20, 0x1f123: 0x6c3adc20, + 0x1f124: 0x6cf1be20, 0x1f125: 0x6c039620, 0x1f126: 0x6c2dea20, 0x1f127: 0x6ceb5a20, + 0x1f128: 0x6d37d420, 0x1f129: 0x6cc1ee20, 0x1f12a: 0x6cd11a20, 0x1f12b: 0x6cd28e20, + 0x1f12c: 0x6d205e20, 0x1f12d: 0x6cd29420, 0x1f12e: 0x6ce69e20, 0x1f12f: 0x6cf40c20, + 0x1f130: 0x6ca77220, 0x1f131: 0x6c6df620, 0x1f132: 0x6c5d1020, 0x1f133: 0x6c719820, + 0x1f134: 0x6d0e1e20, 0x1f135: 0x6ce88020, 0x1f136: 0x6cd85c20, 0x1f137: 0x6cf75420, + 0x1f138: 0x6cfd4e20, 0x1f139: 0x6d0e2820, 0x1f13a: 0x6c82ae20, 0x1f13b: 0x6c08a220, + 0x1f13c: 0x6d11da20, 0x1f13d: 0x6cc0a220, 0x1f13e: 0x6c4dc020, 0x1f13f: 0x6cf53a20, + // Block 0x7c5, offset 0x1f140 + 0x1f140: 0x6cf54220, 0x1f141: 0x6c53e620, 0x1f142: 0x6d028620, 0x1f143: 0x6c36f820, + 0x1f144: 0x6d2c1020, 0x1f145: 0x6d055c20, 0x1f146: 0x6cf27820, 0x1f147: 0x6d2c1220, + 0x1f148: 0x6ca9f820, 0x1f149: 0x6ca48c20, 0x1f14a: 0x6cb63420, 0x1f14b: 0x6d2d0020, + 0x1f14c: 0x6c62b620, 0x1f14d: 0x6d3ebe20, 0x1f14e: 0x6c5f9c20, 0x1f14f: 0x6c5fac20, + 0x1f150: 0x6cb56c20, 0x1f151: 0x6c5f2820, 0x1f152: 0x6c1bc220, 0x1f153: 0x6c193020, + 0x1f154: 0x6c193420, 0x1f155: 0x6c519220, 0x1f156: 0x6d0b3a20, 0x1f157: 0x6d1aae20, + 0x1f158: 0x6d026c20, 0x1f159: 0x6c05c020, 0x1f15a: 0x6d2b2620, 0x1f15b: 0x6d027620, + 0x1f15c: 0x6c148c20, 0x1f15d: 0x6c1aec20, 0x1f15e: 0x6d0e0c20, 0x1f15f: 0x6c71e020, + 0x1f160: 0x6ce5b220, 0x1f161: 0x6c8d9620, 0x1f162: 0x6c8d7820, 0x1f163: 0x6c1e6e20, + 0x1f164: 0x6cc33220, 0x1f165: 0x6d027e20, 0x1f166: 0x6c791420, 0x1f167: 0x6ca8ae20, + 0x1f168: 0x6c703e20, 0x1f169: 0x6d11e420, 0x1f16a: 0x6c21e820, 0x1f16b: 0x6c7dc820, + 0x1f16c: 0x6d22b220, 0x1f16d: 0x6c1efa20, 0x1f16e: 0x6d163020, 0x1f16f: 0x6ca61c20, + 0x1f170: 0x6d2b2a20, 0x1f171: 0x6d407820, 0x1f172: 0x6cc25820, 0x1f173: 0x6d281020, + 0x1f174: 0x6d0e3020, 0x1f175: 0x6cab6e20, 0x1f176: 0x6c36fe20, 0x1f177: 0x6cf33820, + 0x1f178: 0x6d198020, 0x1f179: 0x6c221a20, 0x1f17a: 0x6d407a20, 0x1f17b: 0x6c2d0020, + 0x1f17c: 0x6c1efe20, 0x1f17d: 0x6c6d7a20, 0x1f17e: 0x6d0bd420, 0x1f17f: 0x6c1b8020, + // Block 0x7c6, offset 0x1f180 + 0x1f180: 0x6c192420, 0x1f181: 0x6c512220, 0x1f182: 0x6d1a6e20, 0x1f183: 0x6c71c620, + 0x1f184: 0x6c8d3220, 0x1f185: 0x6c05b620, 0x1f186: 0x6ce59620, 0x1f187: 0x6d3e7820, + 0x1f188: 0x6c790620, 0x1f189: 0x6d228620, 0x1f18a: 0x6c21d420, 0x1f18b: 0x6cc25220, + 0x1f18c: 0x6cf32620, 0x1f18d: 0x6c8fb020, 0x1f18e: 0x6cad1420, 0x1f18f: 0x6c45c020, + 0x1f190: 0x6cad1620, 0x1f191: 0x6d0e0e20, 0x1f192: 0x6c8ff220, 0x1f193: 0x6c904820, + 0x1f194: 0x6c45c820, 0x1f195: 0x6c76b820, 0x1f196: 0x6c26dc20, 0x1f197: 0x6c8e0020, + 0x1f198: 0x6c26de20, 0x1f199: 0x6c8f6620, 0x1f19a: 0x6c458620, 0x1f19b: 0x6c76a820, + 0x1f19c: 0x6c4a9620, 0x1f19d: 0x6cbfea20, 0x1f19e: 0x6c0cd620, 0x1f19f: 0x6c4a3820, + 0x1f1a0: 0x6d26f620, 0x1f1a1: 0x6c20f820, 0x1f1a2: 0x6c51aa20, 0x1f1a3: 0x6c753020, + 0x1f1a4: 0x6d013c20, 0x1f1a5: 0x6d249820, + // Block 0x7c7, offset 0x1f1c0 + 0x1f1c3: 0x6ccd4220, + // Block 0x7c8, offset 0x1f200 + 0x1f200: 0x6cb6e820, 0x1f201: 0x6c452620, 0x1f202: 0x6c17ce20, 0x1f203: 0x6c642020, + 0x1f204: 0x6c573e20, 0x1f205: 0x6c202c20, 0x1f206: 0x6c71ea20, 0x1f207: 0x6c4a9620, + 0x1f208: 0x6c4a9620, 0x1f209: 0x6cb75220, 0x1f20a: 0x6c6c2e20, 0x1f20b: 0x6c7e6220, + 0x1f20c: 0x6ca3ac20, 0x1f20d: 0x6c804a20, 0x1f20e: 0x6c7f7820, 0x1f20f: 0x6c956220, + 0x1f210: 0x6c957a20, 0x1f211: 0x6c955820, 0x1f212: 0x6c95b820, 0x1f213: 0x6c957c20, + 0x1f214: 0x6c822620, 0x1f215: 0x6c95e820, 0x1f216: 0x6c81d020, 0x1f217: 0x6c95f620, + 0x1f218: 0x6c960a20, 0x1f219: 0x6c81d620, 0x1f21a: 0x6c962a20, 0x1f21b: 0x6c949a20, + 0x1f21c: 0x6c948c20, 0x1f21d: 0x6c7ff820, 0x1f21e: 0x6c808820, 0x1f21f: 0x6c7ff020, + 0x1f220: 0x6c948820, 0x1f221: 0x6c7f9a20, 0x1f222: 0x6c807c20, 0x1f223: 0x6c7fc420, + 0x1f224: 0x6c7fd820, 0x1f225: 0x6c7e3e20, 0x1f226: 0x6c7eaa20, 0x1f227: 0x6c7ec420, + 0x1f228: 0x6c80b420, 0x1f229: 0x6c80f820, 0x1f22a: 0x6c811820, 0x1f22b: 0x6c80ae20, + 0x1f22c: 0x6c80a220, 0x1f22d: 0x6c7ee220, 0x1f22e: 0x6c839020, 0x1f22f: 0x6c815620, + 0x1f230: 0x6c91da20, 0x1f231: 0x6c91f220, 0x1f232: 0x6c918420, 0x1f233: 0x6c915c20, + 0x1f234: 0x6c819a20, 0x1f235: 0x6c917820, 0x1f236: 0x6c91c420, 0x1f237: 0x6c927620, + 0x1f238: 0x6c933620, 0x1f239: 0x6c91d420, 0x1f23a: 0x6c934220, 0x1f23b: 0x6c926e20, + 0x1f23c: 0x6c925a20, 0x1f23d: 0x6c93ec20, 0x1f23e: 0x6c924820, 0x1f23f: 0x6c92de20, + // Block 0x7c9, offset 0x1f240 + 0x1f240: 0x6c924c20, 0x1f241: 0x6c952620, 0x1f242: 0x6c903e20, 0x1f243: 0x6ca9f020, + 0x1f244: 0x6c8ff420, 0x1f245: 0x6c8ff820, 0x1f246: 0x6c814220, 0x1f247: 0x6c82d220, + 0x1f248: 0x6c927420, 0x1f249: 0x6c823e20, 0x1f24a: 0x6c82e220, 0x1f24b: 0x6c93a620, + 0x1f24c: 0x6c90b020, 0x1f24d: 0x6c833020, 0x1f24e: 0x6c910e20, 0x1f24f: 0x6c833420, + 0x1f250: 0x6c93bc20, 0x1f251: 0x6c910220, 0x1f252: 0x6c823c20, 0x1f253: 0x6c81fe20, + 0x1f254: 0x6c8c2820, 0x1f255: 0x6c8cc420, 0x1f256: 0x6c837e20, 0x1f257: 0x6c8d3c20, + 0x1f258: 0x6c8cfe20, 0x1f259: 0x6c8cd820, 0x1f25a: 0x6c31f020, 0x1f25b: 0x6ca2d020, + 0x1f25c: 0x6c822620, 0x1f25d: 0x6cab0e20, 0x1f25e: 0x6c27b220, 0x1f25f: 0x6ca91020, + 0x1f260: 0x6caa5e20, 0x1f261: 0x6c93d620, 0x1f262: 0x6d176620, 0x1f263: 0x6c06c620, + 0x1f264: 0x6cac7620, 0x1f265: 0x6c0b8220, 0x1f266: 0x6c3ff020, 0x1f267: 0x6c105620, + 0x1f268: 0x6c9d2620, 0x1f269: 0x6cd60020, 0x1f26a: 0x6cdd5a20, 0x1f26b: 0x6c115e20, + 0x1f26c: 0x6cc9c620, 0x1f26d: 0x6cd12c20, 0x1f26e: 0x6d12f620, 0x1f26f: 0x6cd76a20, + 0x1f270: 0x6ccbda20, 0x1f271: 0x6c18a020, 0x1f272: 0x6c189c20, 0x1f273: 0x6cd41020, + 0x1f274: 0x6cc91420, 0x1f275: 0x6c361020, 0x1f276: 0x6c361220, 0x1f277: 0x6c89aa20, + 0x1f278: 0x6c898820, 0x1f279: 0x6c894a20, 0x1f27a: 0x6c894c20, 0x1f27b: 0x6c897420, + 0x1f27c: 0x6c894620, 0x1f27d: 0x6c89c820, 0x1f27e: 0x6c89c020, 0x1f27f: 0x6c867020, + // Block 0x7ca, offset 0x1f280 + 0x1f280: 0x6c937620, 0x1f281: 0x6caa6e20, 0x1f282: 0x6c916e20, 0x1f283: 0x6c938a20, + 0x1f284: 0x6c940e20, 0x1f285: 0x6c870420, 0x1f286: 0x6c935a20, 0x1f287: 0x6c84ee20, + 0x1f288: 0x6c871420, 0x1f289: 0x6c843a20, 0x1f28a: 0x6c855c20, 0x1f28b: 0x6c867820, + 0x1f28c: 0x6c867c20, 0x1f28d: 0x6c878420, 0x1f28e: 0x6ca6f220, 0x1f28f: 0x6c883620, + 0x1f290: 0x6c893820, 0x1f291: 0x6ca73420, 0x1f292: 0x6c881620, 0x1f293: 0x6c890620, + 0x1f294: 0x6c88c420, 0x1f295: 0x6ca6f620, 0x1f296: 0x6c891220, 0x1f297: 0x6c886820, + 0x1f298: 0x6ca73a20, 0x1f299: 0x6c881820, 0x1f29a: 0x6c87fa20, 0x1f29b: 0x6c892220, + 0x1f29c: 0x6c8abc20, 0x1f29d: 0x6c8abe20, 0x1f29e: 0x6d0e4220, 0x1f29f: 0x6c8af020, + 0x1f2a0: 0x6c8b1020, 0x1f2a1: 0x6cd76a20, 0x1f2a2: 0x6c881020, 0x1f2a3: 0x6ca75a20, + 0x1f2a4: 0x6ca72020, 0x1f2a5: 0x6c892020, 0x1f2a6: 0x6c888420, 0x1f2a7: 0x6c8b5420, + 0x1f2a8: 0x6c8e1820, 0x1f2a9: 0x6c8c9e20, 0x1f2aa: 0x6ca91020, 0x1f2ab: 0x6c8e1420, + 0x1f2ac: 0x6c87f420, 0x1f2ad: 0x6c8cbe20, 0x1f2ae: 0x6d1c8a20, 0x1f2af: 0x6c8cf620, + 0x1f2b0: 0x6c8cfa20, 0x1f2b1: 0x6c8d2420, 0x1f2b2: 0x6c8d2a20, 0x1f2b3: 0x6c8db620, + 0x1f2b4: 0x6c8e1220, 0x1f2b5: 0x6c858620, 0x1f2b6: 0x6c853820, 0x1f2b7: 0x6c854620, + 0x1f2b8: 0x6c86b420, 0x1f2b9: 0x6c363420, 0x1f2ba: 0x6c823620, 0x1f2bb: 0x6c89ec20, + 0x1f2bc: 0x6c8a0620, 0x1f2bd: 0x6ca7d020, 0x1f2be: 0x6c8a9420, 0x1f2bf: 0x6c822620, + // Block 0x7cb, offset 0x1f2c0 + 0x1f2c0: 0x6c8a1a20, 0x1f2c1: 0x6c8a2620, 0x1f2c2: 0x6c8a7220, 0x1f2c3: 0x6c8a1620, + 0x1f2c4: 0x6c8fb020, 0x1f2c5: 0x6d275420, 0x1f2c6: 0x6cc84c20, 0x1f2c7: 0x6c8e8020, + 0x1f2c8: 0x6c1e2020, 0x1f2c9: 0x6c8efa20, 0x1f2ca: 0x6c8e4a20, 0x1f2cb: 0x6c8e3620, + 0x1f2cc: 0x6c8e5020, 0x1f2cd: 0x6c8e4c20, 0x1f2ce: 0x6c8e5c20, 0x1f2cf: 0x6ca99020, + 0x1f2d0: 0x6c835420, 0x1f2d1: 0x6c8f2420, 0x1f2d2: 0x6c92a020, 0x1f2d3: 0x6c923020, + 0x1f2d4: 0x6c94e420, 0x1f2d5: 0x6c94f020, 0x1f2d6: 0x6c94f420, 0x1f2d7: 0x6c950e20, + 0x1f2d8: 0x6c93d020, 0x1f2d9: 0x6c862e20, 0x1f2da: 0x6c85ca20, 0x1f2db: 0x6c93d620, + 0x1f2dc: 0x6c8f9220, 0x1f2dd: 0x6c857620, 0x1f2de: 0x6c856e20, 0x1f2df: 0x6c93ae20, + 0x1f2e0: 0x6d16ba20, 0x1f2e1: 0x6c87d820, 0x1f2e2: 0x6c83bc20, 0x1f2e3: 0x6ca5c020, + 0x1f2e4: 0x6c851420, 0x1f2e5: 0x6c861220, 0x1f2e6: 0x6c844a20, 0x1f2e7: 0x6c852220, + 0x1f2e8: 0x6c87e220, 0x1f2e9: 0x6c84fc20, 0x1f2ea: 0x6c847e20, 0x1f2eb: 0x6ca68c20, + 0x1f2ec: 0x6ca6ac20, 0x1f2ed: 0x6c8c4420, 0x1f2ee: 0x6c8bde20, 0x1f2ef: 0x6c8be020, + 0x1f2f0: 0x6c8c7a20, 0x1f2f1: 0x6c8bca20, 0x1f2f2: 0x6c8c0c20, 0x1f2f3: 0x6c8c1020, + 0x1f2f4: 0x6c8ba020, 0x1f2f5: 0x6c8bb020, 0x1f2f6: 0x6c8bea20, 0x1f2f7: 0x6c856c20, + 0x1f2f8: 0x6c85f620, 0x1f2f9: 0x6c85f820, 0x1f2fa: 0x6d3c3420, 0x1f2fb: 0x6d358c20, + 0x1f2fc: 0x6cd42220, 0x1f2fd: 0x6cd03620, 0x1f2fe: 0x6c13d020, 0x1f2ff: 0x6c22b220, + // Block 0x7cc, offset 0x1f300 + 0x1f300: 0x6cbc9020, 0x1f301: 0x6c324420, 0x1f302: 0x6cde2e20, 0x1f303: 0x6ce13620, + 0x1f304: 0x6d2d1820, 0x1f305: 0x6c306420, 0x1f306: 0x6c066220, 0x1f307: 0x6c3efc20, + 0x1f308: 0x6d03ba20, 0x1f309: 0x6c67d620, 0x1f30a: 0x6c665220, 0x1f30b: 0x6c7e0420, + 0x1f30c: 0x6cf49020, 0x1f30d: 0x6c56a220, 0x1f30e: 0x43f41c20, 0x1f30f: 0x43f41e20, + 0x1f310: 0x6d37f420, 0x1f311: 0x43f42220, 0x1f312: 0x6cbe7a20, 0x1f313: 0x43f42620, + 0x1f314: 0x43f42820, 0x1f315: 0x6cf6b620, 0x1f316: 0x6d399820, 0x1f317: 0x6d173820, + 0x1f318: 0x6c84f420, 0x1f319: 0x6cd03a20, 0x1f31a: 0x6cfdbc20, 0x1f31b: 0x6c3e9c20, + 0x1f31c: 0x6c6e9220, 0x1f31d: 0x6c6dcc20, 0x1f31e: 0x6d221c20, 0x1f31f: 0x43f43e20, + 0x1f320: 0x6cc0c220, 0x1f321: 0x43f44220, 0x1f322: 0x6d39c620, 0x1f323: 0x43f44620, + 0x1f324: 0x43f44820, 0x1f325: 0x6d178420, 0x1f326: 0x6c30a620, 0x1f327: 0x43f44e20, + 0x1f328: 0x43f45020, 0x1f329: 0x43f45220, 0x1f32a: 0x6c395c20, 0x1f32b: 0x6cd8d420, + 0x1f32c: 0x6c496820, 0x1f32d: 0x6c520c20, 0x1f32e: 0x6c80a420, 0x1f32f: 0x6c868820, + 0x1f330: 0x6cf43220, 0x1f331: 0x6ccbb820, 0x1f332: 0x6c9dfe20, 0x1f333: 0x6c9e0c20, + 0x1f334: 0x6cbd7c20, 0x1f335: 0x6c068e20, 0x1f336: 0x6c509c20, 0x1f337: 0x6ce0a020, + 0x1f338: 0x6cb7ce20, 0x1f339: 0x6cb2ec20, 0x1f33a: 0x6ca16020, 0x1f33b: 0x6c135420, + 0x1f33c: 0x6c17fa20, 0x1f33d: 0x6c5b4c20, 0x1f33e: 0x6c765820, 0x1f33f: 0x6d2b8a20, + // Block 0x7cd, offset 0x1f340 + 0x1f340: 0x6c1a5420, 0x1f341: 0x6c9fa820, 0x1f342: 0x6c61a820, 0x1f343: 0x6cd55a20, + 0x1f344: 0x6c99ec20, 0x1f345: 0x6c4d3a20, 0x1f346: 0x6d3a6420, 0x1f347: 0x6c4ee620, + 0x1f348: 0x6d3a6e20, 0x1f349: 0x6d2ff420, 0x1f34a: 0x6d423c20, 0x1f34b: 0x6c06b020, + 0x1f34c: 0x6ccf3620, 0x1f34d: 0x6d34f820, 0x1f34e: 0x6cb58a20, 0x1f34f: 0x6d203020, + 0x1f350: 0x6d411420, 0x1f351: 0x6d3ac620, 0x1f352: 0x6c5dd420, 0x1f353: 0x6d316e20, + 0x1f354: 0x6c47c420, 0x1f355: 0x6ce84420, 0x1f356: 0x6c6af220, 0x1f357: 0x6c891220, + 0x1f358: 0x6c6d5220, 0x1f359: 0x6c38ca20, 0x1f35a: 0x6cd56220, 0x1f35b: 0x6d30d220, + 0x1f35c: 0x6c1e4020, 0x1f35d: 0x6c12c020, 0x1f35e: 0x6c12c020, 0x1f35f: 0x6d311420, + 0x1f360: 0x6c51d620, 0x1f361: 0x6cd36c20, 0x1f362: 0x6d134620, 0x1f363: 0x6c6cc220, + 0x1f364: 0x6c0d4a20, 0x1f365: 0x6d2bb620, 0x1f366: 0x6c21a420, 0x1f367: 0x6d178420, + 0x1f368: 0x6ca41420, 0x1f369: 0x6cfe0a20, 0x1f36a: 0x6cb21420, 0x1f36b: 0x6c5baa20, + 0x1f36c: 0x4885dc20, 0x1f36d: 0x6c496420, + 0x1f370: 0x6c0e0820, 0x1f371: 0x6c7bdc20, 0x1f372: 0x6cc2b220, 0x1f373: 0x6d03c620, + 0x1f374: 0x6c1ca820, 0x1f375: 0x6c627020, 0x1f376: 0x6d1e1820, 0x1f377: 0x6cce9420, + 0x1f378: 0x6c509c20, 0x1f379: 0x6ce21620, 0x1f37a: 0x6c5bbc20, 0x1f37b: 0x6cec3420, + 0x1f37c: 0x6d37f420, 0x1f37d: 0x6c3b8420, 0x1f37e: 0x6d0d4620, 0x1f37f: 0x6c077c20, + // Block 0x7ce, offset 0x1f380 + 0x1f380: 0x6c097420, 0x1f381: 0x6c226820, 0x1f382: 0x6c025020, 0x1f383: 0x6d182220, + 0x1f384: 0x6c112620, 0x1f385: 0x6d110c20, 0x1f386: 0x6cee0e20, 0x1f387: 0x6cd0ac20, + 0x1f388: 0x6d236a20, 0x1f389: 0x6d2b8a20, 0x1f38a: 0x6c02d820, 0x1f38b: 0x6c1a5420, + 0x1f38c: 0x6c279420, 0x1f38d: 0x6d212620, 0x1f38e: 0x6cd9b020, 0x1f38f: 0x6c0de620, + 0x1f390: 0x6c024020, 0x1f391: 0x6cbe7a20, 0x1f392: 0x6c80f820, 0x1f393: 0x6cee5220, + 0x1f394: 0x6d2f2220, 0x1f395: 0x6c271220, 0x1f396: 0x6ccbda20, 0x1f397: 0x6c8e4a20, + 0x1f398: 0x6d1a7020, 0x1f399: 0x6d3e4020, 0x1f39a: 0x6c4ee620, 0x1f39b: 0x6c6eb420, + 0x1f39c: 0x6d3a6e20, 0x1f39d: 0x6cbc0220, 0x1f39e: 0x6c74c820, 0x1f39f: 0x6c391620, + 0x1f3a0: 0x6d399820, 0x1f3a1: 0x6d325020, 0x1f3a2: 0x6c225020, 0x1f3a3: 0x6c578420, + 0x1f3a4: 0x6c492220, 0x1f3a5: 0x6cf16020, 0x1f3a6: 0x6d173820, 0x1f3a7: 0x6cd15e20, + 0x1f3a8: 0x6d344020, 0x1f3a9: 0x6c736420, 0x1f3aa: 0x6d311220, 0x1f3ab: 0x6ce4ba20, + 0x1f3ac: 0x6ce5cc20, 0x1f3ad: 0x6c6af220, 0x1f3ae: 0x6c832420, 0x1f3af: 0x6ce1c820, + 0x1f3b0: 0x6c891220, 0x1f3b1: 0x6cb2ac20, 0x1f3b2: 0x6d30d220, 0x1f3b3: 0x6c598420, + 0x1f3b4: 0x6c573420, 0x1f3b5: 0x6d276220, 0x1f3b6: 0x6cbb4c20, 0x1f3b7: 0x6c407e20, + 0x1f3b8: 0x6cd36c20, 0x1f3b9: 0x6c2e3820, 0x1f3ba: 0x6d39c620, 0x1f3bb: 0x6cbeb220, + 0x1f3bc: 0x6d134620, 0x1f3bd: 0x6cab0e20, 0x1f3be: 0x6d23f620, 0x1f3bf: 0x6c6cc220, + // Block 0x7cf, offset 0x1f3c0 + 0x1f3c0: 0x6c0bdc20, 0x1f3c1: 0x6d2bb620, 0x1f3c2: 0x6cd50820, 0x1f3c3: 0x6c1b5020, + 0x1f3c4: 0x6cd9e620, 0x1f3c5: 0x6d03f420, 0x1f3c6: 0x6d3a6220, 0x1f3c7: 0x6ca41420, + 0x1f3c8: 0x6c6e9220, 0x1f3c9: 0x6c046220, 0x1f3ca: 0x6cfe0a20, 0x1f3cb: 0x6c35b420, + 0x1f3cc: 0x6cb21420, 0x1f3cd: 0x6d320420, 0x1f3ce: 0x6c4a9620, 0x1f3cf: 0x48509420, + 0x1f3d0: 0x48508820, 0x1f3d1: 0x4867aa20, 0x1f3d2: 0x6c513820, 0x1f3d3: 0x6d008620, + 0x1f3d4: 0x6c6ad220, 0x1f3d5: 0x48a49220, 0x1f3d6: 0x6cba2c20, 0x1f3d7: 0x6c084620, + 0x1f3d8: 0x6c36f820, 0x1f3d9: 0x6cad1420, + // Block 0x7d0, offset 0x1f400 + 0x1f400: 0xf0001c1c, 0x1f401: 0xf0001c1c, 0x1f402: 0x00658c9c, + 0x1f410: 0x2cd43683, 0x1f411: 0x2d3f2883, 0x1f412: 0x2cd6a083, 0x1f413: 0xf0001c1c, + 0x1f414: 0x2c37b483, 0x1f415: 0x2c341683, 0x1f416: 0x2c6b9883, 0x1f417: 0x2ce45483, + 0x1f418: 0x2c682283, 0x1f419: 0x2d1d3483, 0x1f41a: 0x2cf3c883, 0x1f41b: 0x2c8a9483, + 0x1f41c: 0x2cb97883, 0x1f41d: 0x2c546483, 0x1f41e: 0x2d292683, 0x1f41f: 0x2d02dc83, + 0x1f420: 0x2c1e5483, 0x1f421: 0x2d37b683, 0x1f422: 0x2cd0d283, 0x1f423: 0x2c395083, + 0x1f424: 0x2cd0dc83, 0x1f425: 0x2c20b483, 0x1f426: 0x2d0db483, 0x1f427: 0x2ce7e683, + 0x1f428: 0x2c103683, 0x1f429: 0x2d13b683, 0x1f42a: 0x2cc9f283, 0x1f42b: 0x2d1f4083, + 0x1f42c: 0x2d426083, 0x1f42d: 0x2d378283, 0x1f42e: 0x2d200883, 0x1f42f: 0x2d350083, + 0x1f430: 0x2d407e83, 0x1f431: 0x2c26e083, 0x1f432: 0x2c6d1a83, 0x1f433: 0x2c796883, + 0x1f434: 0x2c50b683, 0x1f435: 0x2c97ba83, 0x1f436: 0x2d1f9883, 0x1f437: 0x2d266883, + 0x1f438: 0x2ccf9a83, 0x1f439: 0x2c438c83, 0x1f43a: 0x2d1c6283, + // Block 0x7d1, offset 0x1f440 + 0x1f440: 0xe000b3f2, 0x1f441: 0xe000b406, 0x1f442: 0xe000b402, 0x1f443: 0xe000b3ea, + 0x1f444: 0xe000b3fe, 0x1f445: 0xe000b3f6, 0x1f446: 0xe000b3fa, 0x1f447: 0xe000b40a, + 0x1f448: 0xe000b3ee, + 0x1f450: 0x2c2a9083, 0x1f451: 0x2c785283, + // Block 0x7d2, offset 0x1f480 + 0x1f480: 0x6c508820, 0x1f481: 0x6cb4c820, 0x1f483: 0x6cbc8c20, + 0x1f485: 0x6c4d4c20, + 0x1f489: 0x6cbf9020, 0x1f48a: 0x6c126420, + 0x1f48d: 0x6cd2ec20, + 0x1f493: 0x6cd7ba20, + 0x1f494: 0x6c73ca20, + 0x1f49b: 0x6d22c020, + 0x1f49d: 0x6c796620, + 0x1f4a2: 0x6d3dfc20, + 0x1f4a6: 0x6d03be20, + 0x1f4b1: 0x6ca1fc20, + 0x1f4b7: 0x6c5e9420, + 0x1f4b8: 0x6d12d220, 0x1f4b9: 0x6c755e20, + 0x1f4bc: 0x6cb97c20, 0x1f4bd: 0x6c922420, + // Block 0x7d3, offset 0x1f4c0 + 0x1f4c9: 0x6c1e5e20, + 0x1f4d7: 0x6cd3d420, + 0x1f4e0: 0x6cbd0220, + 0x1f4e5: 0x6c40ce20, + 0x1f4ed: 0x6cb58e20, + 0x1f4f7: 0x6c15c420, + // Block 0x7d4, offset 0x1f500 + 0x1f504: 0x6c582a20, 0x1f506: 0x6d163620, 0x1f507: 0x6d425e20, + 0x1f508: 0x6c6a4a20, + 0x1f511: 0x6d404420, + 0x1f514: 0x6d3ed420, + 0x1f51f: 0x6c6c2020, + 0x1f522: 0x6cac1620, + 0x1f524: 0x6c32ee20, 0x1f525: 0x6c238220, 0x1f527: 0x6cd08e20, + 0x1f538: 0x6c59aa20, + // Block 0x7d5, offset 0x1f540 + 0x1f54a: 0x6d1abe20, + 0x1f54c: 0x6c4bb820, + 0x1f556: 0x6c6f3a20, + 0x1f56b: 0x6ccfa220, + 0x1f57a: 0x6c6fe220, + // Block 0x7d6, offset 0x1f580 + 0x1f585: 0x6d130c20, + 0x1f589: 0x6c308c20, + 0x1f58c: 0x6c73c020, 0x1f58d: 0x6c6a4c20, 0x1f58f: 0x6c2df020, + 0x1f591: 0x6c73c220, 0x1f592: 0x6c20ba20, + 0x1f596: 0x6c8c9820, + 0x1f59a: 0x6ce63e20, + 0x1f5a3: 0x6c44aa20, + 0x1f5ae: 0x6d0b7e20, + 0x1f5b1: 0x6d148020, + 0x1f5bf: 0x6cef1c20, + // Block 0x7d7, offset 0x1f5c0 + 0x1f5c2: 0x6c6a5820, + 0x1f5cc: 0x6d146a20, + 0x1f5d7: 0x6c2f3220, + 0x1f5da: 0x6cb59a20, + 0x1f5ec: 0x6c05b020, + 0x1f5f1: 0x6d01a620, + 0x1f5f9: 0x6d2f3220, + // Block 0x7d8, offset 0x1f600 + 0x1f60c: 0x6d1daa20, + 0x1f610: 0x6d073820, + 0x1f619: 0x6c2f3820, 0x1f61b: 0x6c280820, + 0x1f61f: 0x6cf06220, + 0x1f623: 0x6c488620, + 0x1f629: 0x6c391220, + 0x1f62e: 0x6ca0ba20, + 0x1f631: 0x6cf56220, 0x1f632: 0x6d0d3220, + 0x1f635: 0x6ca5b820, 0x1f636: 0x6c286020, + // Block 0x7d9, offset 0x1f640 + 0x1f64b: 0x6c281a20, + 0x1f64f: 0x6ce1ac20, + 0x1f652: 0x6c455620, + 0x1f657: 0x6c7abc20, + 0x1f658: 0x6c1f0420, + 0x1f66f: 0x6cc25e20, + 0x1f671: 0x6ca0be20, 0x1f673: 0x6cd19220, + 0x1f675: 0x6c41c620, 0x1f677: 0x6cd0d820, + // Block 0x7da, offset 0x1f680 + 0x1f681: 0x6ceaa020, + 0x1f685: 0x6cd42c20, + 0x1f68a: 0x6ca7e620, + 0x1f6a4: 0x6d281a20, 0x1f6a5: 0x6c489220, + 0x1f6ac: 0x6cfe7e20, 0x1f6ad: 0x6c814420, + 0x1f6b0: 0x6c286e20, 0x1f6b1: 0x6cdd0620, + 0x1f6b5: 0x6c988420, 0x1f6b6: 0x6d148220, + 0x1f6b8: 0x6ce26e20, 0x1f6ba: 0x6c094020, + // Block 0x7db, offset 0x1f6c0 + 0x1f6c2: 0x6cde3020, + 0x1f6d7: 0x6c95e420, + 0x1f6e2: 0x6cf7d220, 0x1f6e3: 0x6c5cb820, + 0x1f6e4: 0x6c268e20, 0x1f6e7: 0x6c722420, + 0x1f6e9: 0x6c318c20, + 0x1f6ec: 0x6c017c20, + // Block 0x7dc, offset 0x1f700 + 0x1f709: 0x6c9a8820, + 0x1f70c: 0x6cc46c20, 0x1f70e: 0x6c003820, 0x1f70f: 0x6d22ec20, + 0x1f712: 0x6c666620, + 0x1f714: 0x6cb76620, + 0x1f71f: 0x6c9fa220, + 0x1f723: 0x6d391620, + 0x1f724: 0x6d35ac20, 0x1f725: 0x6d37ea20, 0x1f726: 0x6ca4e220, 0x1f727: 0x6c0e1a20, + 0x1f729: 0x6d3bc020, 0x1f72a: 0x6cd5be20, 0x1f72b: 0x6d0a8420, + 0x1f72c: 0x6c741e20, 0x1f72d: 0x6cb9fe20, + 0x1f730: 0x6c489a20, 0x1f732: 0x6ce85220, + 0x1f736: 0x6d1d3820, 0x1f737: 0x6d35d620, + 0x1f73e: 0x6c7c6620, + // Block 0x7dd, offset 0x1f740 + 0x1f746: 0x6c192620, + 0x1f756: 0x6c88ec20, 0x1f757: 0x6d0ae620, + 0x1f75c: 0x6c4ce820, 0x1f75d: 0x6c9e8e20, 0x1f75e: 0x6ccf0e20, 0x1f75f: 0x6d223620, + 0x1f761: 0x6cd8b020, 0x1f762: 0x6cda1220, + 0x1f764: 0x6d35d820, 0x1f767: 0x6cbc7c20, + 0x1f769: 0x6c3fde20, + 0x1f76c: 0x6c710a20, 0x1f76d: 0x6c071e20, 0x1f76f: 0x6c099220, + 0x1f772: 0x6cdd6220, + 0x1f775: 0x6cba0820, 0x1f776: 0x6ca03220, 0x1f777: 0x6c15b620, + 0x1f77a: 0x6ccaa820, 0x1f77b: 0x6c5ec020, + // Block 0x7de, offset 0x1f780 + 0x1f795: 0x6c461620, 0x1f796: 0x6cbf1e20, + 0x1f79a: 0x6cc73820, + 0x1f79e: 0x6cda1a20, 0x1f79f: 0x6cda1e20, + 0x1f7a0: 0x6d10f420, + 0x1f7aa: 0x6c1d6a20, + 0x1f7ad: 0x6cd66620, 0x1f7ae: 0x6d2ffa20, 0x1f7af: 0x6c862420, + 0x1f7b0: 0x6c413e20, 0x1f7b1: 0x6cdbc620, 0x1f7b2: 0x6d2d7c20, + 0x1f7b4: 0x6d3c4220, + 0x1f7bd: 0x6c400820, + // Block 0x7df, offset 0x1f7c0 + 0x1f7c3: 0x6c5ee020, + 0x1f7c4: 0x6c30b220, + 0x1f7d7: 0x6c5bd020, + 0x1f7da: 0x6c65a420, 0x1f7db: 0x6d0d9c20, + 0x1f7dc: 0x6d364a20, + 0x1f7e8: 0x6c9a5c20, 0x1f7e9: 0x6d120e20, 0x1f7ea: 0x6c2b3220, 0x1f7eb: 0x6d150e20, + 0x1f7ef: 0x6c0cf220, + 0x1f7f2: 0x6cc1a220, 0x1f7f3: 0x6d181a20, + 0x1f7f5: 0x6d105420, + 0x1f7f9: 0x6d2c3e20, + 0x1f7fd: 0x6ccc6020, + // Block 0x7e0, offset 0x1f800 + 0x1f819: 0x6c7f1820, + 0x1f82e: 0x6c746e20, + 0x1f830: 0x6cb50620, 0x1f833: 0x6d216a20, + 0x1f836: 0x6d291820, 0x1f837: 0x6cc98220, + 0x1f838: 0x6ccb3a20, 0x1f83b: 0x6c340420, + 0x1f83f: 0x6c6b9e20, + // Block 0x7e1, offset 0x1f840 + 0x1f840: 0x6c782020, 0x1f843: 0x6d265420, + 0x1f847: 0x6c65ca20, + 0x1f848: 0x6d113220, + 0x1f853: 0x6cfaca20, + 0x1f855: 0x6d000220, 0x1f856: 0x6cbb9620, + 0x1f85a: 0x6d23b820, 0x1f85b: 0x6cc1ae20, + 0x1f861: 0x6cfac820, 0x1f862: 0x6c962020, + 0x1f864: 0x6c4a0a20, 0x1f867: 0x6c198620, + 0x1f868: 0x6c209620, 0x1f869: 0x6d155620, 0x1f86b: 0x6d333020, + 0x1f86d: 0x6d403020, 0x1f86e: 0x6c335c20, + 0x1f870: 0x6d2d3420, + 0x1f87f: 0x6c3a6e20, + // Block 0x7e2, offset 0x1f880 + 0x1f880: 0x6d155820, 0x1f881: 0x6c9b4420, + 0x1f888: 0x6c0b0a20, 0x1f889: 0x6c6b4020, 0x1f88a: 0x6cd61820, 0x1f88b: 0x6c8a2220, + 0x1f88c: 0x6c08fa20, 0x1f88d: 0x6cda7620, + 0x1f891: 0x6c2ca220, + 0x1f8a1: 0x6c076220, 0x1f8a2: 0x6cf21220, + 0x1f8a7: 0x6c9b6a20, + 0x1f8a9: 0x6c15ea20, + 0x1f8b5: 0x6c29f620, + 0x1f8ba: 0x6cb21c20, 0x1f8bb: 0x6c660820, + 0x1f8bc: 0x6c8c7420, 0x1f8bd: 0x6c4b9220, 0x1f8be: 0x6cb54620, 0x1f8bf: 0x6c52dc20, + // Block 0x7e3, offset 0x1f8c0 + 0x1f8c3: 0x6c60e820, + 0x1f8c4: 0x6d024e20, 0x1f8c5: 0x6d330820, 0x1f8c6: 0x6c15fa20, + 0x1f8d0: 0x6d116c20, 0x1f8d1: 0x6c160a20, + 0x1f8d8: 0x6c2cee20, 0x1f8d9: 0x6c1d6020, 0x1f8da: 0x6ca56220, 0x1f8db: 0x6ca56420, + 0x1f8de: 0x6d2d5420, 0x1f8df: 0x6c0b1e20, + 0x1f8e1: 0x6c161020, + 0x1f8ea: 0x6cff5a20, + 0x1f8ef: 0x6c248620, + 0x1f8f0: 0x6d02f620, 0x1f8f1: 0x6c6e4420, 0x1f8f2: 0x6cb96620, + 0x1f8f4: 0x6cbe6820, + 0x1f8f9: 0x6c475220, + // Block 0x7e4, offset 0x1f900 + 0x1f904: 0x6cf4b420, + 0x1f91c: 0x6d25e420, 0x1f91d: 0x6c0dde20, + 0x1f922: 0x6cecde20, + 0x1f930: 0x6ca7a620, + 0x1f935: 0x6c891020, + 0x1f938: 0x6cc53e20, + 0x1f93e: 0x6c396e20, 0x1f93f: 0x6c2b9420, + // Block 0x7e5, offset 0x1f940 + 0x1f94a: 0x6c5af820, 0x1f94b: 0x6d190620, + 0x1f94c: 0x6cfbbc20, + 0x1f956: 0x6c800420, 0x1f957: 0x6c40a020, + 0x1f959: 0x6d04ae20, + 0x1f95c: 0x6c897e20, 0x1f95d: 0x6ce1a620, 0x1f95e: 0x6c5fba20, + 0x1f962: 0x6c6ba620, 0x1f963: 0x6d2c1a20, + 0x1f964: 0x6cd19420, + 0x1f96a: 0x6cb59220, 0x1f96b: 0x6c0b2c20, + 0x1f96d: 0x6c802220, 0x1f96e: 0x6c8c1a20, + 0x1f976: 0x6d364c20, 0x1f977: 0x6c09bc20, + 0x1f978: 0x6cd17020, + 0x1f97d: 0x6cd17a20, 0x1f97f: 0x6cbdbc20, + // Block 0x7e6, offset 0x1f980 + 0x1f982: 0x6c0be620, 0x1f983: 0x6cf55e20, + 0x1f989: 0x6c733a20, 0x1f98b: 0x6c5e8420, + 0x1f98d: 0x6cf57620, 0x1f98e: 0x6cbdc420, + 0x1f991: 0x6c4d5620, + 0x1f995: 0x6c94e220, + 0x1f9a0: 0x6d26b420, + 0x1f9a8: 0x6c880a20, + 0x1f9af: 0x6c048e20, + 0x1f9b2: 0x6c526820, + 0x1f9b6: 0x6cb54020, + 0x1f9ba: 0x6cb93820, 0x1f9bb: 0x6d337820, + 0x1f9bc: 0x6c991a20, + // Block 0x7e7, offset 0x1f9c0 + 0x1f9c1: 0x6c238020, + 0x1f9c4: 0x6ca30020, + 0x1f9ca: 0x6ce6a820, + 0x1f9cc: 0x6d3f6e20, + 0x1f9d5: 0x6c6ed420, 0x1f9d6: 0x6d2f8620, + 0x1f9df: 0x6ca71c20, + 0x1f9e0: 0x6c19e420, 0x1f9e3: 0x6cb86620, + 0x1f9e6: 0x6d236420, 0x1f9e7: 0x6c690020, + 0x1f9ed: 0x6d2fda20, + 0x1f9f3: 0x6c2b5020, + 0x1f9f4: 0x6c6f3c20, + 0x1f9f8: 0x6cdc0a20, 0x1f9fb: 0x6d108220, + 0x1f9ff: 0x6cedbe20, + // Block 0x7e8, offset 0x1fa00 + 0x1fa02: 0x6c89d820, + 0x1fa04: 0x6ce71220, 0x1fa06: 0x6c9bfc20, + 0x1fa0b: 0x6d1faa20, + 0x1fa13: 0x6cd7e020, + 0x1fa1b: 0x6c910820, + 0x1fa1f: 0x6d19f820, + 0x1fa25: 0x6c1d4420, + 0x1fa2b: 0x6c420020, + 0x1fa2c: 0x6c6f3820, + 0x1fa36: 0x6cbdf820, 0x1fa37: 0x6c6ef220, + 0x1fa39: 0x6d006e20, + // Block 0x7e9, offset 0x1fa40 + 0x1fa42: 0x6c51b820, + 0x1fa46: 0x6ce1ae20, + 0x1fa48: 0x6cc01220, 0x1fa49: 0x6d007420, 0x1fa4a: 0x6c6e5420, 0x1fa4b: 0x6ca71620, + 0x1fa4c: 0x6c6e5620, 0x1fa4f: 0x6c5fea20, + 0x1fa58: 0x6ce4de20, 0x1fa5a: 0x6c252220, 0x1fa5b: 0x6c2e7c20, + 0x1fa5d: 0x6cbea020, + 0x1fa65: 0x6cb2e620, 0x1fa66: 0x6cb29620, + 0x1fa68: 0x6c2e9020, 0x1fa69: 0x6c910420, + 0x1fa73: 0x6c88ba20, + 0x1fa74: 0x6c4e0a20, 0x1fa75: 0x6cacd620, 0x1fa76: 0x6ce0f020, + 0x1fa7a: 0x6d151020, 0x1fa7b: 0x6d081420, + 0x1fa7c: 0x6cddca20, 0x1fa7d: 0x6c8e6420, 0x1fa7e: 0x6cd6d220, 0x1fa7f: 0x6cd0a820, + // Block 0x7ea, offset 0x1fa80 + 0x1fa81: 0x6c10a020, 0x1fa82: 0x6cd9bc20, + 0x1fa85: 0x6cbd8c20, 0x1fa86: 0x6cd06620, + 0x1fa8a: 0x6ca9f420, 0x1fa8b: 0x6ce6de20, + 0x1fa8c: 0x6c677020, + 0x1fa95: 0x6cf6b820, 0x1fa96: 0x6d36fe20, + 0x1fa9d: 0x6c7f5e20, 0x1fa9e: 0x6c86be20, 0x1fa9f: 0x6c86c020, + 0x1faa2: 0x6c519420, 0x1faa3: 0x6c69cc20, + 0x1faa5: 0x6d0d0a20, 0x1faa7: 0x6cd49420, + 0x1faaa: 0x6cd2a220, + 0x1fab1: 0x6d31ae20, 0x1fab3: 0x6d1e8620, + 0x1faba: 0x6cddc620, 0x1fabb: 0x6cf39e20, + // Block 0x7eb, offset 0x1fac0 + 0x1fac1: 0x6c169620, 0x1fac2: 0x6c238820, + 0x1fac6: 0x6c720820, + 0x1face: 0x6cd4a420, + 0x1fad4: 0x6c6fe620, 0x1fad5: 0x6ceef020, + 0x1fade: 0x6c5db620, + 0x1fae4: 0x6c6a2020, + 0x1faec: 0x6d2a4e20, + 0x1faf6: 0x6cab7220, + 0x1fafc: 0x6c488c20, + // Block 0x7ec, offset 0x1fb00 + 0x1fb03: 0x6c4fba20, + 0x1fb04: 0x6c84f620, 0x1fb05: 0x6d356c20, 0x1fb06: 0x6cfc7220, + 0x1fb09: 0x6c100c20, 0x1fb0a: 0x6c170020, + 0x1fb13: 0x6d274a20, + 0x1fb14: 0x6c510020, + 0x1fb1c: 0x6ce1e420, + 0x1fb20: 0x6c0c4a20, + 0x1fb25: 0x6c2da420, 0x1fb27: 0x6c37b620, + 0x1fb28: 0x6c6f3e20, + 0x1fb2d: 0x6c2c0a20, 0x1fb2e: 0x6d164420, 0x1fb2f: 0x6c7d4620, + 0x1fb31: 0x6d300a20, 0x1fb33: 0x6c7de420, + 0x1fb34: 0x6d384e20, 0x1fb35: 0x6c71ee20, + 0x1fb39: 0x6ccd6820, 0x1fb3a: 0x6ccc3820, 0x1fb3b: 0x6c2da820, + 0x1fb3c: 0x6c046c20, 0x1fb3d: 0x6c5e7420, + // Block 0x7ed, offset 0x1fb40 + 0x1fb40: 0x6d378620, 0x1fb43: 0x6d144e20, + 0x1fb45: 0x6c79b020, 0x1fb46: 0x6cf33e20, + 0x1fb4a: 0x6c436420, 0x1fb4b: 0x6c031220, + 0x1fb4e: 0x6c463620, + 0x1fb51: 0x6cfb2420, 0x1fb52: 0x6c484020, 0x1fb53: 0x6c8ef620, + 0x1fb54: 0x6c1b7620, 0x1fb55: 0x6c48c020, 0x1fb56: 0x6c1fdc20, + 0x1fb58: 0x6c83a020, 0x1fb59: 0x6c242a20, 0x1fb5a: 0x6cd63e20, + 0x1fb61: 0x6c08b620, + 0x1fb65: 0x6c0dbc20, 0x1fb66: 0x6c857820, + 0x1fb69: 0x6c6fae20, 0x1fb6a: 0x6ce54a20, 0x1fb6b: 0x6c347220, + 0x1fb6d: 0x6d0bde20, 0x1fb6e: 0x6cc28a20, + 0x1fb71: 0x6c8ac820, 0x1fb73: 0x6c787c20, + 0x1fb75: 0x6c449620, 0x1fb76: 0x6d312420, + 0x1fb78: 0x6c3b5820, + // Block 0x7ee, offset 0x1fb80 + 0x1fb81: 0x6d146e20, 0x1fb83: 0x6c6fd220, + 0x1fb84: 0x6d067c20, 0x1fb85: 0x6c68cc20, + 0x1fb88: 0x6c93cc20, 0x1fb89: 0x6c6fb020, 0x1fb8b: 0x6c1e1e20, + 0x1fb8e: 0x6cfc7e20, + 0x1fb90: 0x6c7b1620, 0x1fb91: 0x6c333e20, + 0x1fb96: 0x6c952e20, 0x1fb97: 0x6cf59a20, + 0x1fb98: 0x6cbe0820, 0x1fb99: 0x6c107420, + 0x1fba4: 0x6cb84620, + 0x1fbb1: 0x6caf5020, 0x1fbb2: 0x6d0adc20, 0x1fbb3: 0x6c07da20, + 0x1fbb4: 0x6c4cb220, 0x1fbb5: 0x6c484c20, + 0x1fbb9: 0x6c710020, + 0x1fbbc: 0x6cb82420, 0x1fbbe: 0x6c741020, + // Block 0x7ef, offset 0x1fbc0 + 0x1fbc4: 0x6c85c020, + 0x1fbd0: 0x6c570c20, 0x1fbd1: 0x6c683c20, + 0x1fbd8: 0x6cb84e20, 0x1fbda: 0x6d2c2620, 0x1fbdb: 0x6cb82620, + 0x1fbdd: 0x6d304620, 0x1fbde: 0x6c139020, 0x1fbdf: 0x6d1ce820, + 0x1fbe2: 0x6d0bee20, + 0x1fbe4: 0x6c1cc020, + 0x1fbe8: 0x6c1b9a20, 0x1fbea: 0x6cec8620, + 0x1fbec: 0x6cd9a620, + 0x1fbf2: 0x6c76cc20, 0x1fbf3: 0x6d255c20, + 0x1fbfd: 0x6c1d9c20, 0x1fbff: 0x6cdd6420, + // Block 0x7f0, offset 0x1fc00 + 0x1fc00: 0x6ce85820, 0x1fc03: 0x6d305620, + 0x1fc04: 0x6ce2ee20, 0x1fc06: 0x6cf36820, + 0x1fc08: 0x6c264a20, 0x1fc09: 0x6c860820, 0x1fc0a: 0x6c139420, + 0x1fc15: 0x6cc66e20, 0x1fc16: 0x6c461820, 0x1fc17: 0x6cc3bc20, + 0x1fc19: 0x6c83ce20, + 0x1fc1e: 0x6ce1c620, + 0x1fc24: 0x6c860a20, 0x1fc27: 0x6c9c5c20, + 0x1fc29: 0x6c1c3020, + 0x1fc2c: 0x6c4bfa20, 0x1fc2d: 0x6c909420, 0x1fc2e: 0x6c209020, 0x1fc2f: 0x6cdd6e20, + 0x1fc30: 0x6c690420, 0x1fc31: 0x6c6d0c20, + 0x1fc35: 0x6c381620, 0x1fc36: 0x6d2cf620, + 0x1fc3e: 0x6c6d0e20, 0x1fc3f: 0x6c254220, + // Block 0x7f1, offset 0x1fc40 + 0x1fc42: 0x6c136c20, 0x1fc43: 0x6d420820, + 0x1fc45: 0x6d2fc420, + 0x1fc48: 0x6cb1c620, 0x1fc49: 0x6d2dfc20, 0x1fc4a: 0x6cf66420, 0x1fc4b: 0x6d121420, + 0x1fc4c: 0x6c3f7420, 0x1fc4d: 0x6c1cce20, + 0x1fc53: 0x6c254a20, + 0x1fc57: 0x6c486820, + 0x1fc63: 0x6c5f0020, + 0x1fc66: 0x6ccb3c20, 0x1fc67: 0x6d2d8e20, + 0x1fc68: 0x6c8e2420, 0x1fc69: 0x6ccb3e20, 0x1fc6a: 0x6d132220, + 0x1fc70: 0x6c70ba20, + 0x1fc76: 0x6ce87220, + 0x1fc7a: 0x6cc7c620, 0x1fc7b: 0x6d2af820, + 0x1fc7c: 0x6c589020, + // Block 0x7f2, offset 0x1fc80 + 0x1fc81: 0x6cfc2820, 0x1fc83: 0x6cb91a20, + 0x1fc84: 0x6d2fdc20, + 0x1fc8b: 0x6c11b220, + 0x1fc8e: 0x6c7e1820, 0x1fc8f: 0x6c869a20, + 0x1fc90: 0x6cc76420, + 0x1fc94: 0x6c31c020, 0x1fc97: 0x6c8b3020, + 0x1fc9c: 0x6d1c0620, 0x1fc9d: 0x6c86c220, + 0x1fca0: 0x6c31c620, 0x1fca2: 0x6c8d8020, + 0x1fcaa: 0x6ceca220, + 0x1fcaf: 0x6c2f1820, + 0x1fcb3: 0x6c6f4020, + 0x1fcb5: 0x6c855e20, 0x1fcb6: 0x6c7a1620, 0x1fcb7: 0x6c791e20, + 0x1fcb9: 0x6d31b220, + // Block 0x7f3, offset 0x1fcc0 + 0x1fcc0: 0x6c51b420, 0x1fcc2: 0x6c091220, + 0x1fcc4: 0x6caf2820, + 0x1fcca: 0x6c4f4820, + 0x1fcd1: 0x6d3d2820, 0x1fcd2: 0x6c332020, + 0x1fcd4: 0x6d16a420, + 0x1fcdc: 0x6c787e20, 0x1fcdd: 0x6d16a620, 0x1fcde: 0x6ca0dc20, + 0x1fce1: 0x6c118a20, 0x1fce3: 0x6c44ee20, + 0x1fce4: 0x6c788820, 0x1fce5: 0x6cd32a20, + 0x1fced: 0x6c8cc620, 0x1fcee: 0x6c07dc20, + 0x1fcf1: 0x6c32b820, + 0x1fcf6: 0x6c72e020, 0x1fcf7: 0x6ca4e420, + 0x1fcf8: 0x6d3f0020, 0x1fcfb: 0x6d401e20, + // Block 0x7f4, offset 0x1fd00 + 0x1fd03: 0x6ce0ea20, + 0x1fd06: 0x6cf9be20, 0x1fd07: 0x6c4ec020, + 0x1fd0c: 0x6c94a620, 0x1fd0d: 0x6cb99020, + 0x1fd13: 0x6ca12220, + 0x1fd14: 0x6cab3a20, 0x1fd15: 0x6c4fc820, + 0x1fd19: 0x6d2c3420, 0x1fd1a: 0x6c737020, 0x1fd1b: 0x6c23a020, + 0x1fd20: 0x6c864420, 0x1fd21: 0x6d2c4020, 0x1fd22: 0x6d1fdc20, 0x1fd23: 0x6c2d6c20, + 0x1fd24: 0x6c747820, 0x1fd25: 0x6c073a20, + 0x1fd29: 0x6d11bc20, 0x1fd2a: 0x6cb1c820, + 0x1fd31: 0x6c6d3620, 0x1fd32: 0x6c766c20, 0x1fd33: 0x6ccb4020, + 0x1fd34: 0x6d102c20, 0x1fd35: 0x6c6d3820, + 0x1fd39: 0x6c78dc20, + // Block 0x7f5, offset 0x1fd40 + 0x1fd44: 0x6c14de20, 0x1fd47: 0x6ca74a20, + 0x1fd49: 0x6cedb020, 0x1fd4a: 0x6c942a20, + 0x1fd50: 0x6d277a20, 0x1fd51: 0x6d108420, 0x1fd52: 0x6c05a020, + 0x1fd55: 0x6c755220, 0x1fd56: 0x6d07fc20, + 0x1fd58: 0x6d385820, + 0x1fd60: 0x6c7ce820, 0x1fd61: 0x6c3cda20, + 0x1fd6a: 0x6cc17e20, 0x1fd6b: 0x6ccecc20, + 0x1fd6c: 0x6cdce420, + 0x1fd70: 0x6c316820, 0x1fd72: 0x6c7af820, 0x1fd73: 0x6cad8c20, + 0x1fd7a: 0x6c065020, + 0x1fd7e: 0x6c401620, 0x1fd7f: 0x6c700c20, + // Block 0x7f6, offset 0x1fd80 + 0x1fd80: 0x6cc47c20, + 0x1fd84: 0x6c70ca20, + 0x1fd8a: 0x6cbf6a20, + 0x1fd8d: 0x6d38c220, 0x1fd8e: 0x6c577420, 0x1fd8f: 0x6c05e020, + 0x1fd95: 0x6d145c20, 0x1fd97: 0x6d148420, + 0x1fd98: 0x6d148620, + 0x1fd9d: 0x6c995020, + 0x1fda6: 0x6cc86c20, + 0x1fdab: 0x6c227c20, + 0x1fdae: 0x6c4dca20, + 0x1fdb0: 0x6c238420, + 0x1fdb4: 0x6cf83a20, + 0x1fdb9: 0x6cc2b820, 0x1fdba: 0x6ce56c20, + 0x1fdbc: 0x6c2e0c20, 0x1fdbe: 0x6c4ddc20, + // Block 0x7f7, offset 0x1fdc0 + 0x1fdc7: 0x6d12a620, + 0x1fdcd: 0x6c353420, 0x1fdce: 0x6ceef820, + 0x1fdd0: 0x6c122e20, 0x1fdd1: 0x6c2e2620, + 0x1fdd5: 0x6c362620, 0x1fdd6: 0x6c2c6820, + 0x1fdd8: 0x6cdb9220, 0x1fdd9: 0x6cc30a20, + 0x1fddc: 0x6c368020, 0x1fddd: 0x6cab4420, 0x1fdde: 0x6d081c20, + 0x1fde2: 0x6cf47820, + 0x1fde6: 0x6d190820, + 0x1fde8: 0x6ca1fa20, + 0x1fdf0: 0x6c549620, + 0x1fdf4: 0x6c4dde20, + 0x1fdff: 0x6cd22820, + // Block 0x7f8, offset 0x1fe00 + 0x1fe03: 0x6cc96420, + 0x1fe08: 0x6c090820, 0x1fe0a: 0x6c4dcc20, 0x1fe0b: 0x6c6e4620, + 0x1fe0e: 0x6cbdfa20, 0x1fe0f: 0x6c25d420, + 0x1fe10: 0x6c22a620, 0x1fe12: 0x6c046e20, + 0x1fe17: 0x6c32f020, + 0x1fe1c: 0x6cf84220, + 0x1fe27: 0x6d33c020, + 0x1fe28: 0x6c949220, 0x1fe2a: 0x6c54b620, 0x1fe2b: 0x6c601420, + 0x1fe2c: 0x6c48c820, + 0x1fe32: 0x6cacd820, + // Block 0x7f9, offset 0x1fe40 + 0x1fe40: 0x6d39c220, + 0x1fe45: 0x6c08fc20, 0x1fe47: 0x6d21ae20, + 0x1fe52: 0x6cb6c220, + 0x1fe55: 0x6c50b420, 0x1fe56: 0x6c1ed420, + 0x1fe59: 0x6ccec220, 0x1fe5a: 0x6c1be020, 0x1fe5b: 0x6c0eac20, + 0x1fe5f: 0x6cc62420, + 0x1fe60: 0x6d1ef820, + 0x1fe64: 0x6ca39620, + 0x1fe69: 0x6c5b9420, 0x1fe6a: 0x6ce57620, 0x1fe6b: 0x6c04c220, + 0x1fe70: 0x6d057620, + 0x1fe74: 0x6d1f1020, 0x1fe75: 0x6c1c0620, + 0x1fe7f: 0x6c526220, + // Block 0x7fa, offset 0x1fe80 + 0x1fe83: 0x6cec7020, + 0x1fe86: 0x6d01ce20, + 0x1fe8a: 0x6c748c20, + 0x1fe8c: 0x6cdbec20, 0x1fe8d: 0x6cbe2c20, 0x1fe8e: 0x6d3bbc20, + 0x1fe95: 0x6c617620, + 0x1fe98: 0x6c091420, 0x1fe9a: 0x6cf59c20, + 0x1fea0: 0x6c602820, 0x1fea2: 0x6c75c620, + 0x1fea5: 0x6c89ee20, 0x1fea6: 0x6d1eb620, + 0x1fead: 0x6c70ea20, + 0x1feb2: 0x6d266a20, + 0x1feb5: 0x6c055e20, + 0x1feb8: 0x6cafaa20, 0x1febb: 0x6d2b3820, + 0x1febe: 0x6d165820, 0x1febf: 0x6c2bc820, + // Block 0x7fb, offset 0x1fec0 + 0x1fec2: 0x6cbc9220, + 0x1fec4: 0x6cdd4c20, 0x1fec6: 0x6c22ae20, + 0x1fec8: 0x6d3aa220, 0x1fec9: 0x6d267420, + 0x1fecf: 0x6c682820, + 0x1fed4: 0x6cd23e20, 0x1fed7: 0x6d148820, + 0x1fed8: 0x6cf99220, + 0x1fee0: 0x6d254220, + 0x1fee5: 0x6c4c6020, 0x1fee7: 0x6c789020, + 0x1feea: 0x6c252420, 0x1feeb: 0x6d171a20, + 0x1fef5: 0x6c85c220, 0x1fef7: 0x6c2d0c20, + 0x1fefa: 0x6cf5d620, + 0x1feff: 0x6c09c020, + // Block 0x7fc, offset 0x1ff00 + 0x1ff02: 0x6c0b3420, 0x1ff03: 0x6c99ea20, + 0x1ff04: 0x6c85e420, 0x1ff07: 0x6cda1820, + 0x1ff10: 0x6c8e5620, 0x1ff11: 0x6c4b5420, 0x1ff12: 0x6c78b620, + 0x1ff17: 0x6d151220, + 0x1ff19: 0x6cf7f620, 0x1ff1a: 0x6d1a7c20, + 0x1ff1f: 0x6c78c020, + 0x1ff23: 0x6ccf6020, + 0x1ff27: 0x6cf2bc20, + 0x1ff2e: 0x6cb0b620, + 0x1ff36: 0x6d26dc20, 0x1ff37: 0x6c538020, + 0x1ff3a: 0x6c867220, 0x1ff3b: 0x6c405020, + // Block 0x7fd, offset 0x1ff40 + 0x1ff43: 0x6c74d620, + 0x1ff44: 0x6cfae820, + 0x1ff49: 0x6c2cf020, + 0x1ff4c: 0x6c878820, + 0x1ff53: 0x6ce83420, + 0x1ff58: 0x6c645820, 0x1ff5b: 0x6c041420, + 0x1ff5c: 0x6c2c0c20, 0x1ff5d: 0x6d2efc20, + 0x1ff63: 0x6d22bc20, + 0x1ff68: 0x6c333420, + 0x1ff6d: 0x6c115c20, 0x1ff6e: 0x6ce88620, + 0x1ff76: 0x6cdf9420, 0x1ff77: 0x6c5fee20, + 0x1ff78: 0x6cb59420, 0x1ff79: 0x6ccd7620, 0x1ff7a: 0x6ca6fa20, + // Block 0x7fe, offset 0x1ff80 + 0x1ff86: 0x6c498c20, + 0x1ff88: 0x6c08e420, 0x1ff8b: 0x6d037820, + 0x1ff93: 0x6d31fa20, + 0x1ff99: 0x6cc94a20, 0x1ff9b: 0x6ca0b820, + 0x1ff9d: 0x6c3dc420, + 0x1ffa2: 0x6ce1a820, 0x1ffa3: 0x6c055c20, + 0x1ffaa: 0x6c0c8a20, + 0x1ffac: 0x6cf56620, 0x1ffae: 0x6c6a5e20, + 0x1ffb6: 0x6c6cd220, + 0x1ffbe: 0x6cb8b020, + // Block 0x7ff, offset 0x1ffc0 + 0x1ffc8: 0x6cd89820, 0x1ffc9: 0x6c6e1620, 0x1ffcb: 0x6c1b8820, + 0x1ffd7: 0x6c6e1c20, + 0x1ffe5: 0x6cdc3a20, + 0x1ffef: 0x6d2bde20, + 0x1fff0: 0x6c83e020, + 0x1fff4: 0x6d3d0620, + 0x1fff9: 0x6c0ba820, + 0x1ffff: 0x6cea6220, + // Block 0x800, offset 0x20000 + 0x20003: 0x6c0a1820, + 0x20006: 0x6c3ac220, + 0x2000a: 0x6c2a8220, + 0x2000c: 0x6d3a2620, + 0x20011: 0x6c70dc20, + 0x20019: 0x6d15b020, + 0x2001c: 0x6d0b6420, 0x2001f: 0x6c1bd820, + 0x20020: 0x6c488e20, 0x20021: 0x6d34d020, + 0x20028: 0x6cc61620, 0x2002b: 0x6d1e8a20, + 0x2002d: 0x6c0ea820, 0x2002f: 0x6c611820, + 0x20030: 0x6cb23620, 0x20033: 0x6d1b9c20, + 0x20034: 0x6d0f4220, 0x20035: 0x6c98b420, + 0x2003d: 0x6c904e20, 0x2003e: 0x6ca2ca20, 0x2003f: 0x6cc9bc20, + // Block 0x801, offset 0x20040 + 0x20040: 0x6c1fda20, 0x20042: 0x6c221c20, 0x20043: 0x6cf41a20, + 0x20044: 0x6cc5ae20, + 0x20048: 0x6c272420, 0x20049: 0x6c5fc420, 0x2004b: 0x6d15b820, + 0x2004d: 0x6cc45e20, + 0x20050: 0x6c5d9820, 0x20051: 0x6c484220, 0x20053: 0x6d301020, + 0x20054: 0x6cb08220, 0x20057: 0x6d288220, + 0x20058: 0x6c04e020, 0x20059: 0x6c6a6a20, + 0x2005c: 0x6c53e220, 0x2005f: 0x6cfc7620, + 0x20060: 0x6c5a8820, + 0x20069: 0x6d2bc420, 0x2006a: 0x6c270820, 0x2006b: 0x6c436c20, + 0x2006d: 0x6cb08420, 0x2006f: 0x6cb14620, + 0x20070: 0x6cd23620, 0x20071: 0x6c898620, 0x20072: 0x6d267620, 0x20073: 0x6c565020, + 0x20074: 0x6c0b6a20, 0x20077: 0x6cc61e20, + 0x20079: 0x6cc62020, + // Block 0x802, offset 0x20080 + 0x20084: 0x6d13c420, 0x20085: 0x6d338820, 0x20087: 0x6c6c2820, + 0x20088: 0x6cf22020, 0x20089: 0x6c173420, 0x2008b: 0x6cbf9a20, + 0x2008d: 0x6d3a5620, 0x2008f: 0x6d2c1c20, + 0x20090: 0x6cb34820, 0x20091: 0x6c019e20, 0x20093: 0x6c50c220, + 0x20095: 0x6c1e5620, 0x20096: 0x6d0c6020, + 0x2009a: 0x6cd31820, 0x2009b: 0x6c566020, + 0x2009c: 0x6c35dc20, + 0x200b4: 0x6cd24020, + 0x200b9: 0x6ceaaa20, 0x200ba: 0x6c272c20, 0x200bb: 0x6cec6a20, + 0x200bc: 0x6cb2f420, 0x200bd: 0x6cc6f420, 0x200be: 0x6c705220, + // Block 0x803, offset 0x200c0 + 0x200c0: 0x6c0e4a20, + 0x200d0: 0x6d222820, 0x200d1: 0x6c30a220, 0x200d3: 0x6c4ace20, + 0x200d4: 0x6cd45420, 0x200d7: 0x6cdd0820, + 0x200d8: 0x6ca68220, 0x200d9: 0x6d385c20, 0x200da: 0x6c905220, 0x200db: 0x6c0dca20, + 0x200dc: 0x6d421420, 0x200dd: 0x6d12d620, 0x200de: 0x6cc4b420, + 0x200e0: 0x6c8cb220, 0x200e1: 0x6cc96c20, + 0x200e4: 0x6c82b820, 0x200e5: 0x6c35e820, 0x200e7: 0x6d381a20, + 0x200e8: 0x6c612820, 0x200eb: 0x6c35ea20, + 0x200ef: 0x6d428420, + 0x200f2: 0x6ca31820, 0x200f3: 0x6d27dc20, + // Block 0x804, offset 0x20100 + 0x2010a: 0x6d016c20, 0x2010b: 0x6d418a20, + 0x2010c: 0x6cd5aa20, 0x2010d: 0x6c2fce20, 0x2010e: 0x6c384620, 0x2010f: 0x6cc58a20, + 0x20111: 0x6c051820, 0x20112: 0x6c4de020, 0x20113: 0x6c530a20, + 0x20114: 0x6d13d020, 0x20116: 0x6d13d220, + 0x20119: 0x6c77da20, 0x2011a: 0x6d16de20, 0x2011b: 0x6c5b1e20, + 0x2011c: 0x6d329020, + 0x2012e: 0x6c6e6220, + 0x20131: 0x6c43d220, + 0x20134: 0x6ca9fa20, 0x20135: 0x6cbca220, 0x20137: 0x6c2e7e20, + 0x20139: 0x6c61c420, 0x2013a: 0x6d171e20, 0x2013b: 0x6d14b620, + 0x2013d: 0x6c3e2c20, 0x2013e: 0x6cd77220, 0x2013f: 0x6cd77420, + // Block 0x805, offset 0x20140 + 0x20140: 0x6d1e1e20, 0x20141: 0x6c78fe20, 0x20142: 0x6c573020, 0x20143: 0x6c53b620, + 0x20147: 0x6c50ec20, + 0x2014a: 0x6c509620, 0x2014b: 0x6cb9f820, + 0x2014c: 0x6cb85020, 0x2014e: 0x6cd8a620, + 0x20150: 0x6c051e20, + 0x2016c: 0x6c6d9e20, 0x2016d: 0x6c789220, + 0x20173: 0x6c001a20, + 0x20174: 0x6c908020, 0x20176: 0x6ce84820, + 0x20179: 0x6c207020, + 0x2017c: 0x6cd98620, 0x2017d: 0x6c19d620, 0x2017f: 0x6cee6a20, + // Block 0x806, offset 0x20180 + 0x20182: 0x6caa5220, + 0x20184: 0x6c6fb620, 0x20187: 0x6c0d2c20, + 0x201a1: 0x6cffda20, 0x201a2: 0x6cd0f820, 0x201a3: 0x6c545020, + 0x201a6: 0x6d3ad020, + 0x201a8: 0x6c490e20, 0x201a9: 0x6c5eb220, 0x201ab: 0x6c61dc20, + 0x201ad: 0x6cf5da20, 0x201af: 0x6ccf3e20, + 0x201b0: 0x6cab7e20, 0x201b1: 0x6c553c20, 0x201b2: 0x6cde4220, 0x201b3: 0x6cff7c20, + 0x201b5: 0x6d2a7c20, + 0x201b8: 0x6c0fee20, 0x201b9: 0x6cb77820, 0x201ba: 0x6cebd620, 0x201bb: 0x6ceabe20, + 0x201bc: 0x6c2a0c20, 0x201be: 0x6ca33020, + // Block 0x807, offset 0x201c0 + 0x201e0: 0x6d2cee20, 0x201e3: 0x6d0b9020, + 0x201e6: 0x6cf44020, 0x201e7: 0x6d31aa20, + 0x201e8: 0x6c2a8e20, 0x201e9: 0x6c509a20, 0x201eb: 0x6c01ea20, + 0x201ec: 0x6cafda20, 0x201ed: 0x6ccb2220, 0x201ee: 0x6c3bbc20, 0x201ef: 0x6c485420, + 0x201f3: 0x6cb35420, + 0x201f7: 0x6d088820, + 0x201f8: 0x6c4d9c20, 0x201f9: 0x6c427420, 0x201fa: 0x6c034620, 0x201fb: 0x6d3f7620, + 0x201fc: 0x6c9c0020, 0x201fe: 0x6c5dba20, + // Block 0x808, offset 0x20200 + 0x20227: 0x6c2cc220, + 0x20228: 0x6cf5dc20, 0x2022b: 0x6c26ee20, + 0x2022c: 0x6ca47a20, + 0x20230: 0x6c2dbe20, 0x20231: 0x6c95f820, 0x20232: 0x6c789e20, + 0x20237: 0x6d178e20, + 0x20238: 0x6c744420, 0x20239: 0x6c512420, 0x2023b: 0x6c602c20, + 0x2023e: 0x6c51c620, 0x2023f: 0x6ca82820, + // Block 0x809, offset 0x20240 + 0x20240: 0x6cc8f620, 0x20241: 0x6cb99220, 0x20242: 0x6c276c20, 0x20243: 0x6cce6c20, + 0x20244: 0x6c78ae20, 0x20245: 0x6d3a1220, 0x20247: 0x6cd1b820, + 0x20248: 0x6c93da20, 0x20249: 0x6c635c20, 0x2024a: 0x6cb10c20, 0x2024b: 0x6c546e20, + 0x2024c: 0x6c5ec420, 0x2024d: 0x6cde5420, 0x2024e: 0x6c1dac20, 0x2024f: 0x6cf29020, + 0x20250: 0x6c6e8020, 0x20251: 0x6cb30e20, 0x20252: 0x6d2cf220, 0x20253: 0x6d02d420, + 0x20256: 0x6c0b9420, + 0x20259: 0x6d06ce20, + 0x2025e: 0x6c471020, 0x2025f: 0x6c6be620, + 0x20262: 0x6cfb6a20, + 0x20278: 0x6c356420, 0x2027a: 0x6c0f0020, 0x2027b: 0x6cb15420, + 0x2027f: 0x6d28ea20, + // Block 0x80a, offset 0x20280 + 0x20281: 0x6cac2420, 0x20282: 0x6ce85a20, + 0x20284: 0x6d1bb420, + 0x202ae: 0x6cfde220, + 0x202b1: 0x6caaf420, 0x202b2: 0x6c438e20, 0x202b3: 0x6c0f0220, + 0x202b4: 0x6d01a420, + 0x202b8: 0x6d315c20, 0x202b9: 0x6d214620, 0x202ba: 0x6ca6a420, + // Block 0x80b, offset 0x202c0 + 0x202c0: 0x6d0a9220, 0x202c1: 0x6cec3620, 0x202c3: 0x6c021820, + 0x202c4: 0x6c4ece20, 0x202c5: 0x6c52b220, 0x202c6: 0x6c27e220, + 0x202c8: 0x6caac220, 0x202ca: 0x6c12b020, 0x202cb: 0x6c604820, + 0x202cc: 0x6ca5ae20, 0x202cd: 0x6d1e4020, 0x202ce: 0x6cfed220, + 0x202d0: 0x6c1faa20, 0x202d1: 0x6d121020, 0x202d3: 0x6c440220, + 0x202d4: 0x6ce0fc20, 0x202d5: 0x6c065220, 0x202d6: 0x6c15be20, + 0x202d8: 0x6d06ec20, 0x202db: 0x6c4d2020, + 0x202dd: 0x6c1db620, 0x202df: 0x6c65a620, + 0x202e0: 0x6d422620, + 0x202e4: 0x6cf0a420, 0x202e5: 0x6c265220, 0x202e6: 0x6caf6c20, + // Block 0x80c, offset 0x20300 + 0x20310: 0x6c592c20, 0x20312: 0x6cf63a20, + 0x20314: 0x6cae4c20, 0x20315: 0x6c8e3420, 0x20316: 0x6ca24a20, 0x20317: 0x6c9ec620, + 0x20318: 0x6c812020, 0x20319: 0x6ce9fe20, 0x2031a: 0x6c048420, + 0x2031d: 0x6c439820, 0x2031f: 0x6c7aa020, + 0x20322: 0x6c636a20, 0x20323: 0x6c0e7c20, + // Block 0x80d, offset 0x20340 + 0x2034d: 0x6c592e20, 0x2034f: 0x6d40c420, + 0x20350: 0x6c960e20, + 0x20357: 0x6c840a20, + 0x20359: 0x6c515620, 0x2035a: 0x6ca06220, + 0x2035c: 0x6cd72a20, 0x2035d: 0x6cd00420, 0x2035e: 0x6c777020, 0x2035f: 0x6c1c4020, + 0x20360: 0x6c8d3420, 0x20361: 0x6c95ba20, + 0x20364: 0x6d0dae20, 0x20365: 0x6d2fc620, 0x20366: 0x6c1fae20, 0x20367: 0x6c47ac20, + 0x20368: 0x6cbde020, 0x2036a: 0x6cdff220, 0x2036b: 0x6c3be220, + 0x2036c: 0x6ce8d220, + 0x20371: 0x6c8d3620, + 0x20374: 0x6c810820, + // Block 0x80e, offset 0x20380 + 0x20396: 0x6c7fa620, 0x20397: 0x6d299220, + 0x20398: 0x6cf50820, + 0x2039d: 0x6c840c20, 0x2039e: 0x6c000a20, 0x2039f: 0x6c94b620, + 0x203a0: 0x6d353e20, 0x203a1: 0x6c1dc820, 0x203a2: 0x6c67f020, + 0x203a4: 0x6c64c620, + 0x203a9: 0x6c950020, 0x203aa: 0x6d153020, + 0x203ac: 0x6cce0820, + 0x203bb: 0x6c5f0220, + // Block 0x80f, offset 0x203c0 + 0x203dc: 0x6d181e20, 0x203dd: 0x6ca8ea20, + 0x203e1: 0x6c5c0a20, 0x203e3: 0x6d2bf020, + 0x203e6: 0x6c4e6020, + 0x203e8: 0x6d1afa20, 0x203e9: 0x6c0a1a20, 0x203ea: 0x6c014620, 0x203eb: 0x6cf97220, + 0x203ec: 0x6ca60020, + 0x203f0: 0x6c2b3e20, 0x203f1: 0x6c65cc20, 0x203f2: 0x6cac6820, + 0x203f5: 0x6d23bc20, 0x203f6: 0x6c1fc620, 0x203f7: 0x6d289820, + 0x203f9: 0x6c13fc20, 0x203fb: 0x6d307620, + 0x203fc: 0x6ccb4220, 0x203fe: 0x6cae3620, 0x203ff: 0x6c472820, + // Block 0x810, offset 0x20400 + 0x20400: 0x6d307820, + 0x20406: 0x6c842420, 0x20407: 0x6c30be20, + 0x20409: 0x6c1dd020, 0x2040b: 0x6d419620, + 0x2040c: 0x6cb39e20, 0x2040f: 0x6ccefc20, + 0x20410: 0x6c8fa220, + 0x20422: 0x6cd5fe20, + 0x20424: 0x6c6d3a20, 0x20425: 0x6c8d4820, + 0x20428: 0x6c774220, 0x20429: 0x6c7e9220, 0x2042b: 0x6d05cc20, + 0x2042c: 0x6c6d3c20, 0x2042e: 0x6c1fea20, + 0x20432: 0x6d26de20, + // Block 0x811, offset 0x20440 + 0x20446: 0x6c971820, 0x20447: 0x6d020820, + 0x20448: 0x6c6f8620, 0x20449: 0x6c627420, 0x2044b: 0x6d26e820, + 0x2044f: 0x6c64f220, + 0x20451: 0x6c4e3020, 0x20453: 0x6cc98a20, + 0x20454: 0x6c5c2820, 0x20455: 0x6cbc5a20, 0x20457: 0x6ccb5220, + 0x20458: 0x6d419a20, 0x2045b: 0x6c91d620, + 0x2045c: 0x6c57c420, 0x2045d: 0x6c1e6820, 0x2045e: 0x6ccd5c20, 0x2045f: 0x6cf31220, + 0x20460: 0x6c60a220, 0x20461: 0x6d3d9620, 0x20462: 0x6cfb8c20, 0x20463: 0x6d141020, + 0x20464: 0x6c4c8820, 0x20465: 0x6c7d1c20, + // Block 0x812, offset 0x20480 + 0x20491: 0x6d38a820, + 0x20494: 0x6c929e20, 0x20496: 0x6c0e9020, 0x20497: 0x6cd28a20, + 0x20498: 0x6d1d4a20, 0x20499: 0x6c7a5c20, + 0x204b9: 0x6d36d820, 0x204ba: 0x6d00e820, + 0x204bd: 0x6d135420, 0x204be: 0x6c36b420, 0x204bf: 0x6c940420, + // Block 0x813, offset 0x204c0 + 0x204c0: 0x6c4f1420, 0x204c1: 0x6d135620, + 0x204c6: 0x6c962c20, 0x204c7: 0x6c21dc20, + 0x204c8: 0x6c397020, 0x204c9: 0x6d34a020, 0x204ca: 0x6d1d5020, 0x204cb: 0x6cf1f220, + 0x204cc: 0x6cebf220, 0x204cd: 0x6c00d620, 0x204ce: 0x6d21b020, + 0x204d1: 0x6c571a20, 0x204d3: 0x6c8b3220, + 0x204d4: 0x6c6dd620, 0x204d5: 0x6d28ca20, + 0x204e7: 0x6d29e820, + 0x204e8: 0x6c336420, 0x204ea: 0x6c629220, + 0x204ee: 0x6cf2a220, + 0x204f0: 0x6c60ba20, 0x204f1: 0x6cf6e420, 0x204f3: 0x6d2e8620, + 0x204f4: 0x6ce95c20, + // Block 0x814, offset 0x20500 + 0x2050a: 0x6d21b220, + 0x2050f: 0x6c8b4620, + 0x20512: 0x6d372420, 0x20513: 0x6cd20a20, + 0x20515: 0x6c81c220, 0x20516: 0x6c7f6020, 0x20517: 0x6cf03620, + 0x20518: 0x6cad7220, 0x20519: 0x6c1b6220, 0x2051a: 0x6d1d1420, 0x2051b: 0x6c314020, + 0x2051d: 0x6c314220, 0x2051f: 0x6c067620, + 0x20520: 0x6cbcf020, 0x20521: 0x6cd62020, 0x20523: 0x6d34a820, + 0x20529: 0x6c8b4820, 0x2052b: 0x6caed620, + 0x2052d: 0x6d300620, + 0x2053f: 0x6cab5a20, + // Block 0x815, offset 0x20540 + 0x20542: 0x6d023c20, 0x20543: 0x6c60d820, + 0x20544: 0x6c7f6220, 0x20545: 0x6d1cb020, 0x20546: 0x6c134c20, + 0x20556: 0x6c820020, + 0x2055d: 0x6c952820, + 0x20561: 0x6c8fbc20, 0x20562: 0x6cf91020, + 0x20566: 0x6c8c7620, + 0x20569: 0x6c4aa020, + 0x20573: 0x6d03b020, + 0x20577: 0x6c848620, + 0x20578: 0x6c221620, + // Block 0x816, offset 0x20580 + 0x20587: 0x6cbebc20, + 0x20591: 0x6c652e20, 0x20592: 0x6c2a4420, 0x20593: 0x6c661420, + 0x20594: 0x6cbee820, 0x20595: 0x6d026e20, 0x20596: 0x6d1d5a20, + 0x2059f: 0x6c4d0020, + 0x205a1: 0x6d311820, 0x205a2: 0x6ccf0420, 0x205a3: 0x6c9c9a20, + 0x205a4: 0x6c58ba20, + 0x205b1: 0x6c248220, 0x205b2: 0x6cc7e820, 0x205b3: 0x6cc95a20, + 0x205b4: 0x6c5e4620, 0x205b5: 0x6d143420, 0x205b7: 0x6c2b4e20, + 0x205b9: 0x6c949e20, 0x205bb: 0x6d193e20, + // Block 0x817, offset 0x205c0 + 0x205c2: 0x6c100020, 0x205c3: 0x6cad1820, + 0x205c4: 0x6ce04220, 0x205c5: 0x6c35a420, 0x205c6: 0x6d29ee20, 0x205c7: 0x6c23c420, + 0x205d3: 0x6d2d0a20, + 0x205d5: 0x6cf82620, 0x205d6: 0x6c98b020, + 0x205d8: 0x6c7eca20, 0x205d9: 0x6d287820, + 0x205e1: 0x6c36e620, + 0x205e5: 0x6c2f0e20, + 0x205ed: 0x6c493c20, + 0x205f1: 0x6c596620, + 0x205f5: 0x6cd40620, 0x205f6: 0x6c663220, + 0x205f9: 0x6d2dce20, 0x205fa: 0x6c610620, 0x205fb: 0x6c596820, + // Block 0x818, offset 0x20600 + 0x20605: 0x6cedb220, 0x20606: 0x6c95d820, + 0x2060f: 0x6c315620, + 0x20615: 0x6c893c20, + 0x20623: 0x6ca7ea20, + 0x20624: 0x6ca41c20, 0x20625: 0x6c6fc820, 0x20626: 0x6d266c20, + 0x20629: 0x6d108820, 0x2062a: 0x6c204c20, + 0x2062e: 0x6c11cc20, 0x2062f: 0x6c84f820, + 0x20630: 0x6c33d420, 0x20631: 0x6ca41e20, 0x20632: 0x6ca42020, + 0x20638: 0x6cc63820, + 0x2063d: 0x6d267820, + // Block 0x819, offset 0x20640 + 0x20640: 0x6d1ee620, 0x20642: 0x6d19a420, + 0x20644: 0x6c4c5820, + 0x20648: 0x6c295420, + 0x20651: 0x6d312620, 0x20652: 0x6c9c3c20, 0x20653: 0x6c2e6820, + 0x20656: 0x6d312820, + 0x2065a: 0x6c7abe20, + 0x2065c: 0x6c4de220, 0x2065d: 0x6cd98020, 0x2065e: 0x6c50d020, 0x2065f: 0x6c5e9620, + 0x20660: 0x6d302e20, + 0x20664: 0x6c0dd620, 0x20666: 0x6ceef220, 0x20667: 0x6ce7d220, + 0x20669: 0x6ce88c20, + 0x2066c: 0x6c426e20, 0x2066d: 0x6c908220, 0x2066e: 0x6cc2c820, 0x2066f: 0x6c5d2220, + 0x20670: 0x6d3ba420, 0x20671: 0x6cc3b220, 0x20673: 0x6c533a20, + 0x20675: 0x6c296020, 0x20676: 0x6c510420, 0x20677: 0x6cdf6e20, + 0x20678: 0x6c48ca20, 0x2067a: 0x6d230220, + 0x2067c: 0x6d0baa20, 0x2067f: 0x6cec8c20, + // Block 0x81a, offset 0x20680 + 0x20680: 0x6cc43820, + 0x20685: 0x6c744620, 0x20686: 0x6cab3820, + 0x20689: 0x6cc29c20, 0x2068a: 0x6d347220, + 0x2068d: 0x6c8d1820, 0x2068e: 0x6cf37020, 0x2068f: 0x6d033c20, + 0x20690: 0x6c26ae20, 0x20692: 0x6d24f220, 0x20693: 0x6d261e20, + 0x20697: 0x6ca13820, + 0x20699: 0x6d1f5420, + 0x2069e: 0x6cf45820, + 0x206a0: 0x6d2ebe20, 0x206a3: 0x6d07b820, + 0x206a6: 0x6cc53c20, 0x206a7: 0x6c4be220, + 0x206a8: 0x6d23be20, + 0x206ae: 0x6cf9fc20, 0x206af: 0x6c0b5220, + 0x206b0: 0x6d1f7e20, 0x206b2: 0x6d1a1420, + 0x206b4: 0x6d083220, 0x206b5: 0x6d1f8c20, 0x206b6: 0x6c827a20, + 0x206bc: 0x6ce6a620, 0x206bf: 0x6d311a20, + // Block 0x81b, offset 0x206c0 + 0x206c4: 0x6d292420, 0x206c5: 0x6c40ba20, 0x206c6: 0x6c7e5620, + 0x206c9: 0x6cc39e20, + 0x206ce: 0x6c70ec20, + 0x206d0: 0x6c20fa20, 0x206d1: 0x6c263e20, 0x206d2: 0x6cea3a20, 0x206d3: 0x6c001220, + 0x206d7: 0x6d3edc20, + 0x206da: 0x6c59a620, 0x206db: 0x6d167c20, + 0x206e9: 0x6c062e20, 0x206ea: 0x6c1afc20, + 0x206ed: 0x6cc63a20, + 0x206f4: 0x6c913220, 0x206f7: 0x6c6a6c20, + 0x206f8: 0x6cd30a20, 0x206fa: 0x6d413620, + // Block 0x81c, offset 0x20700 + 0x20701: 0x6d167e20, + 0x20704: 0x6c3bc820, 0x20705: 0x6c3bca20, + 0x20709: 0x6ca0c420, + 0x2070d: 0x6cd59a20, + 0x2071b: 0x6c023e20, + 0x2071d: 0x6cb05620, 0x2071e: 0x6cb27820, 0x2071f: 0x6cb2f820, + 0x20720: 0x6c639e20, 0x20721: 0x6d38ca20, 0x20723: 0x6cbf9e20, + 0x20727: 0x6d1fa620, + 0x20728: 0x6cdfd020, 0x2072b: 0x6cc6f620, + 0x2072d: 0x6c9d2020, + 0x20736: 0x6d16ac20, + 0x20738: 0x6cc6fc20, 0x2073b: 0x6c8ace20, + 0x2073c: 0x6cbf0220, + // Block 0x81d, offset 0x20740 + 0x20759: 0x6c5b2020, 0x2075a: 0x6c61a020, + 0x2075f: 0x6c433a20, + 0x20767: 0x6d1f0420, + 0x20768: 0x6c138220, 0x20769: 0x6c2a6020, 0x2076a: 0x6d19ac20, + 0x2076c: 0x6d22de20, 0x2076d: 0x6c06fc20, 0x2076f: 0x6c0ed020, + // Block 0x81e, offset 0x20780 + 0x20794: 0x6cbb6820, + 0x2079a: 0x6c141c20, + 0x2079c: 0x6d02be20, 0x2079e: 0x6c1b1420, + 0x207a3: 0x6d2a7220, + 0x207a4: 0x6c7c6020, 0x207a6: 0x6c3aa220, + 0x207a9: 0x6cddea20, 0x207aa: 0x6c48f420, + 0x207ad: 0x6c342620, + 0x207b2: 0x6c4a5420, + 0x207b4: 0x6d345020, + // Block 0x81f, offset 0x207c0 + 0x207cc: 0x6c15a620, 0x207cd: 0x6ca4ec20, + 0x207d0: 0x6c553e20, 0x207d2: 0x6ce21820, + 0x207e1: 0x6d175620, + 0x207e4: 0x6ca82a20, 0x207e5: 0x6d2d3e20, 0x207e6: 0x6c587220, + 0x207e8: 0x6c325620, 0x207ea: 0x6cb78620, 0x207eb: 0x6c12e420, + 0x207ee: 0x6c20cc20, + 0x207f2: 0x6c264e20, + 0x207f6: 0x6d361820, 0x207f7: 0x6c453020, + 0x207fb: 0x6cf26e20, + // Block 0x820, offset 0x20800 + 0x20809: 0x6c325820, + 0x2080d: 0x6c1b2420, + 0x20811: 0x6c01be20, 0x20812: 0x6c7df820, + 0x20814: 0x6cf2e820, + 0x20818: 0x6d1bb620, 0x2081a: 0x6cb13e20, + 0x2082b: 0x6d2c3020, + 0x2082c: 0x6d3b6420, 0x2082e: 0x6cdac420, + 0x20833: 0x6ca6a620, + 0x2083a: 0x6d3a1420, 0x2083b: 0x6c14fe20, + 0x2083e: 0x6c084020, 0x2083f: 0x6ca5f220, + // Block 0x821, offset 0x20840 + 0x20840: 0x6d347420, 0x20841: 0x6c5bd420, + 0x20858: 0x6cfa3a20, 0x2085a: 0x6d364e20, 0x2085b: 0x6cf63c20, + 0x2085e: 0x6c67aa20, + 0x20869: 0x6c330220, 0x2086a: 0x6c3d7c20, + 0x2086d: 0x6c685c20, 0x2086e: 0x6c176820, 0x2086f: 0x6c045020, + 0x20875: 0x6c8b1e20, + 0x2087c: 0x6c025a20, + // Block 0x822, offset 0x20880 + 0x2088b: 0x6d2a1620, + 0x2088c: 0x6c1f6020, 0x2088f: 0x6ceb8620, + 0x20892: 0x6c4fd220, 0x20893: 0x6c773620, + 0x20894: 0x6d1a7e20, 0x20896: 0x6cfcea20, + 0x2089d: 0x6c401820, 0x2089e: 0x6c0cb620, + 0x208a0: 0x6c7c4020, + 0x208a4: 0x6cbcde20, 0x208a5: 0x6cc98420, + 0x208bf: 0x6c266220, + // Block 0x823, offset 0x208c0 + 0x208c0: 0x6d12b220, + 0x208c4: 0x6d2f0820, 0x208c6: 0x6c896420, + 0x208c8: 0x6c332620, + 0x208cd: 0x6c816620, 0x208ce: 0x6d09a620, + 0x208d8: 0x6d36a420, 0x208da: 0x6c7a5a20, + 0x208de: 0x6cdc6a20, 0x208df: 0x6cf2a020, + 0x208e3: 0x6c7a5e20, + 0x208ef: 0x6c65d420, + 0x208f6: 0x6c67ba20, + 0x208fb: 0x6d3caa20, + 0x208fd: 0x6cd6dc20, 0x208fe: 0x6d219c20, + // Block 0x824, offset 0x20900 + 0x20901: 0x6cc98c20, 0x20903: 0x6d23e620, + 0x20904: 0x6c803a20, + 0x2090a: 0x6d240620, + 0x2090c: 0x6cba2820, 0x2090d: 0x6c72a220, 0x2090f: 0x6c8b3420, + 0x20912: 0x6cd53e20, 0x20913: 0x6cfd1a20, + 0x20916: 0x6c415420, + 0x20922: 0x6cdf4420, + 0x20927: 0x6ce52220, + 0x2092f: 0x6c9c1020, + 0x20931: 0x6c2ba220, 0x20933: 0x6c9ddc20, + 0x2093e: 0x6c5afa20, + // Block 0x825, offset 0x20940 + 0x20949: 0x6c351c20, + 0x2094d: 0x6c8b4a20, + 0x20952: 0x6c7f6820, 0x20953: 0x6d1aa820, + 0x20954: 0x6c804620, 0x20956: 0x6c68a020, + 0x20958: 0x6c5e2620, + 0x20963: 0x6c4c4c20, + 0x20966: 0x6d2e9420, + 0x2096d: 0x6c9d0820, + 0x20970: 0x6c7c5020, + 0x20977: 0x6c352620, + 0x2097f: 0x6d1ab020, + // Block 0x826, offset 0x20980 + 0x20987: 0x6c836020, + 0x20995: 0x6c462a20, + 0x2099b: 0x6ce6ac20, + 0x2099c: 0x6d10c820, 0x2099e: 0x6cedf620, + 0x209a3: 0x6c6aa020, + 0x209a8: 0x6d04c220, 0x209aa: 0x6cd5c020, + 0x209b1: 0x6cf08c20, + 0x209b4: 0x6d236620, + // Block 0x827, offset 0x209c0 + 0x209c1: 0x6d2da620, + 0x209c9: 0x6c01ee20, + 0x209cf: 0x6cca9a20, + 0x209d0: 0x6c1e0c20, 0x209d2: 0x6c7ae220, + 0x209d6: 0x6c71a020, 0x209d7: 0x6c4d5220, + 0x209e2: 0x6c9e0420, + 0x209e7: 0x6c4f9420, + 0x209ea: 0x6c1d9e20, + 0x209ee: 0x6c8d1a20, + 0x209f0: 0x6d3f9620, + // Block 0x828, offset 0x20a00 + 0x20a09: 0x6c7d4820, + 0x20a0c: 0x6d378c20, 0x20a0e: 0x6d2f5420, + 0x20a10: 0x6c2f2e20, 0x20a11: 0x6c467420, 0x20a12: 0x6d279620, 0x20a13: 0x6c27c620, + 0x20a14: 0x6caada20, + 0x20a1b: 0x6c0dd820, + 0x20a1d: 0x6cc47420, 0x20a1e: 0x6c14c420, + 0x20a22: 0x6cc70620, 0x20a23: 0x6d19c820, + 0x20a24: 0x6c14c620, 0x20a27: 0x6d361a20, + 0x20a2a: 0x6c48f820, 0x20a2b: 0x6caabe20, + 0x20a2c: 0x6ccfe420, 0x20a2f: 0x6cdac620, + 0x20a32: 0x6cf2b820, 0x20a33: 0x6c1bb220, + 0x20a3a: 0x6c9ee220, 0x20a3b: 0x6d347e20, + 0x20a3e: 0x6cb50a20, + // Block 0x829, offset 0x20a40 + 0x20a41: 0x6c465820, + 0x20a46: 0x6c90fa20, + 0x20a48: 0x6d3ea020, + 0x20a4d: 0x6c293a20, 0x20a4f: 0x6cfc6820, + 0x20a51: 0x6cc77e20, + 0x20a57: 0x6caefe20, + 0x20a5e: 0x6cf56c20, + 0x20a62: 0x6c7aba20, + 0x20a64: 0x6c4b2620, 0x20a65: 0x6c212e20, 0x20a66: 0x6c6baa20, + 0x20a72: 0x6c6bac20, 0x20a73: 0x6cf57820, + 0x20a75: 0x6c7a1a20, 0x20a77: 0x6c46ec20, + 0x20a78: 0x6d2cac20, 0x20a79: 0x6c392620, + 0x20a7c: 0x6d015a20, + // Block 0x82a, offset 0x20a80 + 0x20a8d: 0x6c585e20, 0x20a8f: 0x6ca79020, + 0x20a90: 0x6cf85820, + 0x20a9b: 0x6c240820, + 0x20a9d: 0x6c4bba20, + 0x20aa1: 0x6cf5b620, + 0x20aa7: 0x6cb83620, + 0x20aaa: 0x6c981c20, + 0x20aad: 0x6d303220, + 0x20ab0: 0x6c734620, + 0x20ab4: 0x6c0ca020, + // Block 0x82b, offset 0x20ac0 + 0x20ac0: 0x6c0ca220, + 0x20ac5: 0x6cc2d620, + 0x20acb: 0x6cf88620, + 0x20ace: 0x6c68f020, + 0x20ad0: 0x6cc2ea20, 0x20ad1: 0x6d352620, 0x20ad2: 0x6ce46820, 0x20ad3: 0x6c762a20, + 0x20ad8: 0x6cca1a20, 0x20adb: 0x6d3e4c20, + 0x20ae3: 0x6c6adc20, + 0x20aea: 0x6c0cec20, + 0x20aec: 0x6c312c20, 0x20aed: 0x6d417620, + 0x20af6: 0x6d0db020, + // Block 0x82c, offset 0x20b00 + 0x20b01: 0x6c0a1c20, + 0x20b05: 0x6c7b0020, 0x20b07: 0x6d0eb620, + 0x20b08: 0x6cef3820, 0x20b0a: 0x6c583420, + 0x20b0c: 0x6c506420, + 0x20b11: 0x6c45b820, + 0x20b14: 0x6c9b5420, 0x20b17: 0x6c82e420, + 0x20b19: 0x6c2cae20, 0x20b1b: 0x6c0e0220, + 0x20b1c: 0x6c584420, 0x20b1f: 0x6cebfe20, + 0x20b20: 0x6c751420, + 0x20b28: 0x6c1bda20, + 0x20b2d: 0x6c030e20, 0x20b2e: 0x6c6fa420, + 0x20b37: 0x6c2c0e20, + 0x20b39: 0x6d2f1c20, 0x20b3b: 0x6c26e620, + 0x20b3c: 0x6cd23820, 0x20b3d: 0x6c501420, + // Block 0x82d, offset 0x20b40 + 0x20b4c: 0x6d12c020, + 0x20b57: 0x6c091a20, + 0x20b58: 0x6cb05020, 0x20b59: 0x6d118820, + 0x20b5c: 0x6c2b1420, 0x20b5d: 0x6c11ee20, 0x20b5e: 0x6cb20220, 0x20b5f: 0x6d268420, + 0x20b60: 0x6cbc7820, 0x20b61: 0x6caf3220, + 0x20b75: 0x6ceb7020, 0x20b76: 0x6d015c20, + 0x20b7d: 0x6d12cc20, + // Block 0x82e, offset 0x20b80 + 0x20b80: 0x6c392820, 0x20b81: 0x6c484620, 0x20b82: 0x6c566e20, 0x20b83: 0x6cc7fa20, + 0x20b89: 0x6cc4b620, 0x20b8a: 0x6c3d2020, 0x20b8b: 0x6c598020, + 0x20b9a: 0x6cc79020, + 0x20ba2: 0x6c993020, + 0x20ba5: 0x6c32f620, 0x20ba6: 0x6c5b9820, 0x20ba7: 0x6cf85a20, + 0x20ba8: 0x6d04bc20, 0x20bab: 0x6cc4b820, + 0x20bac: 0x6d13d620, 0x20baf: 0x6d303420, + 0x20bb1: 0x6c61c620, 0x20bb2: 0x6c434020, 0x20bb3: 0x6d203820, + 0x20bb5: 0x6cb40620, + // Block 0x82f, offset 0x20bc0 + 0x20bc8: 0x6c1f2220, 0x20bc9: 0x6c240a20, 0x20bca: 0x6d303620, 0x20bcb: 0x6ca79220, + 0x20bcd: 0x6cbca620, + 0x20bd0: 0x6c13d220, 0x20bd2: 0x6ca79420, 0x20bd3: 0x6cdbb620, + 0x20bd9: 0x6c13d420, 0x20bda: 0x6c19da20, 0x20bdb: 0x6d10e020, + 0x20bdc: 0x6c324820, 0x20bdd: 0x6cedc820, 0x20bdf: 0x6ca76220, + 0x20be0: 0x6c9c4420, + 0x20be6: 0x6caa1620, 0x20be7: 0x6cf87820, + 0x20be9: 0x6d109820, 0x20beb: 0x6c14c820, + // Block 0x830, offset 0x20c00 + 0x20c18: 0x6d018c20, 0x20c19: 0x6c9ed420, 0x20c1a: 0x6c796420, + 0x20c1c: 0x6c243a20, 0x20c1e: 0x6cd13620, 0x20c1f: 0x6cacb620, + 0x20c20: 0x6c569c20, 0x20c22: 0x6c78b020, 0x20c23: 0x6cfcc220, + 0x20c25: 0x6c53fa20, 0x20c26: 0x6cbf2020, 0x20c27: 0x6d3f8220, + 0x20c2a: 0x6c3e7420, 0x20c2b: 0x6ca3be20, + 0x20c2d: 0x6ca69e20, 0x20c2f: 0x6c7a7a20, + 0x20c3e: 0x6ca59820, + // Block 0x831, offset 0x20c40 + 0x20c4d: 0x6c439020, + 0x20c51: 0x6c53fc20, 0x20c53: 0x6c002620, + 0x20c55: 0x6cd1ba20, + 0x20c5e: 0x6d04d420, 0x20c5f: 0x6c230e20, + 0x20c60: 0x6c684420, 0x20c62: 0x6d2c3220, 0x20c63: 0x6cfebe20, + 0x20c64: 0x6c88f820, 0x20c65: 0x6cc24820, + 0x20c68: 0x6ccd4420, 0x20c69: 0x6d01c020, 0x20c6b: 0x6c461c20, + 0x20c6c: 0x6c9ed820, 0x20c6d: 0x6c148020, 0x20c6f: 0x6c371620, + 0x20c73: 0x6c312220, + // Block 0x832, offset 0x20c80 + 0x20c86: 0x6c79f020, + 0x20c8a: 0x6ce58a20, 0x20c8b: 0x6cd1cc20, + 0x20c8f: 0x6cca7020, + 0x20c92: 0x6c491a20, + 0x20c96: 0x6c505620, 0x20c97: 0x6d367c20, + 0x20c98: 0x6d106620, 0x20c99: 0x6ce70020, 0x20c9a: 0x6c09ee20, + 0x20c9c: 0x6ca06420, 0x20c9e: 0x6c3ebe20, + 0x20ca5: 0x6cbb1420, + 0x20cb9: 0x6d367e20, + 0x20cbc: 0x6cd9ca20, 0x20cbf: 0x6ca7a020, + // Block 0x833, offset 0x20cc0 + 0x20cc0: 0x6c738020, 0x20cc2: 0x6d105620, + 0x20cc4: 0x6c599e20, + 0x20cc8: 0x6c080020, 0x20cc9: 0x6ca06620, 0x20cca: 0x6c176a20, + 0x20cce: 0x6c93a420, 0x20ccf: 0x6cce8220, + 0x20cd0: 0x6c104220, 0x20cd1: 0x6d2b8820, 0x20cd2: 0x6cd81020, + 0x20cd4: 0x6d41c420, 0x20cd5: 0x6d265620, 0x20cd6: 0x6d294c20, 0x20cd7: 0x6c948e20, + 0x20ce5: 0x6cc1b020, + 0x20cfa: 0x6c9e9820, + // Block 0x834, offset 0x20d00 + 0x20d00: 0x6d3bd820, + 0x20d08: 0x6c297e20, 0x20d0a: 0x6d250a20, + 0x20d12: 0x6c71d220, + 0x20d15: 0x6c5b6020, 0x20d16: 0x6cb7d020, + 0x20d18: 0x6d285220, 0x20d1a: 0x6c97fe20, + 0x20d1c: 0x6ca0aa20, + 0x20d31: 0x6cb16220, 0x20d33: 0x6c6d4a20, + 0x20d39: 0x6d10b820, + // Block 0x835, offset 0x20d40 + 0x20d40: 0x6c1c6820, 0x20d41: 0x6ca6c620, 0x20d42: 0x6cd9de20, + 0x20d48: 0x6cd61a20, 0x20d4b: 0x6cb16420, + 0x20d54: 0x6c4f1620, + 0x20d60: 0x6d10be20, 0x20d62: 0x6ca56020, + 0x20d6a: 0x6cd3f020, + 0x20d6c: 0x6d251820, 0x20d6e: 0x6c114c20, 0x20d6f: 0x6c6b5220, + 0x20d79: 0x6d023e20, + 0x20d7d: 0x6d0cec20, 0x20d7e: 0x6cff3620, + // Block 0x836, offset 0x20d80 + 0x20d8b: 0x6d025020, + 0x20d8c: 0x6c86ec20, 0x20d8e: 0x6c397620, + 0x20d97: 0x6d3b3c20, + 0x20d99: 0x6ca37220, 0x20d9b: 0x6d3bb620, + 0x20d9e: 0x6c7c4c20, + 0x20da2: 0x6c957020, + 0x20dab: 0x6cb83220, + 0x20db6: 0x6ceca820, + 0x20dbd: 0x6cd54c20, 0x20dbf: 0x6c1a7c20, + // Block 0x837, offset 0x20dc0 + 0x20dc1: 0x6d164620, + 0x20dc6: 0x6c500820, + 0x20dc8: 0x6c698220, 0x20dcb: 0x6c5b8e20, + 0x20dcd: 0x6cffce20, 0x20dce: 0x6c222020, + 0x20dde: 0x6c61a220, + 0x20de6: 0x6ca62e20, + 0x20de8: 0x6ca63420, 0x20de9: 0x6ce3bc20, + 0x20df6: 0x6c724820, + 0x20df8: 0x6ca04220, + 0x20dfd: 0x6c83d220, 0x20dff: 0x6d382c20, + // Block 0x838, offset 0x20e00 + 0x20e01: 0x6d06d420, 0x20e03: 0x6cbf3820, + 0x20e04: 0x6c3e9620, 0x20e06: 0x6c0d7e20, + 0x20e0a: 0x6c621620, + 0x20e0d: 0x6cb5f420, 0x20e0e: 0x6cf89c20, + 0x20e14: 0x6c2ada20, 0x20e15: 0x6c376020, + 0x20e1b: 0x6cd53220, + 0x20e1c: 0x6ce77820, 0x20e1d: 0x6cff9620, 0x20e1f: 0x6cb01c20, + 0x20e28: 0x6c284020, 0x20e2a: 0x6c60da20, + 0x20e33: 0x6d002020, + 0x20e37: 0x6c23ca20, + 0x20e3b: 0x6c0d1c20, + 0x20e3c: 0x6cc6f020, + // Block 0x839, offset 0x20e40 + 0x20e4d: 0x6c9e4a20, + 0x20e52: 0x6c9e4c20, + 0x20e54: 0x6cd49c20, 0x20e55: 0x6cff6c20, 0x20e56: 0x6c05e420, 0x20e57: 0x6cec2220, + 0x20e59: 0x6cad8020, + 0x20e63: 0x6c410e20, + 0x20e65: 0x6c549c20, 0x20e66: 0x6c525420, + 0x20e68: 0x6d39f220, 0x20e69: 0x6c48c420, + 0x20e6d: 0x6c4b3820, + 0x20e79: 0x6c273e20, + 0x20e7c: 0x6c0d2820, 0x20e7d: 0x6c5a4420, + // Block 0x83a, offset 0x20e80 + 0x20e80: 0x6c13d620, + 0x20e84: 0x6cfa3420, 0x20e85: 0x6c710220, 0x20e87: 0x6d119a20, + 0x20e96: 0x6c3bb620, 0x20e97: 0x6d2a7420, + 0x20e9b: 0x6c3c3020, + 0x20ea2: 0x6c708020, 0x20ea3: 0x6d230a20, + 0x20ea9: 0x6c5cbe20, + 0x20eb2: 0x6c6ab020, 0x20eb3: 0x6d049020, + 0x20eb5: 0x6ca3ba20, + 0x20ebb: 0x6caa1820, + 0x20ebd: 0x6cd13820, 0x20ebf: 0x6d233420, + // Block 0x83b, offset 0x20ec0 + 0x20ec2: 0x6c587620, 0x20ec3: 0x6c450c20, + 0x20ec4: 0x6ced1620, 0x20ec6: 0x6ceb1e20, 0x20ec7: 0x6cbb7820, + 0x20ed8: 0x6d1b5220, 0x20eda: 0x6c635e20, + 0x20ee1: 0x6cdd7220, 0x20ee3: 0x6c6ade20, + 0x20ee4: 0x6cf64020, 0x20ee5: 0x6cf25020, + 0x20ee9: 0x6c986620, + 0x20ef6: 0x6d0fbe20, + 0x20ef8: 0x6d110820, + 0x20efd: 0x6c986c20, 0x20efe: 0x6cab3e20, + // Block 0x83c, offset 0x20f00 + 0x20f01: 0x6c017020, + 0x20f05: 0x6c910c20, + 0x20f11: 0x6c366e20, 0x20f12: 0x6d3f1e20, + 0x20f17: 0x6c367020, + 0x20f19: 0x6c01c820, + 0x20f1e: 0x6c5de220, + 0x20f20: 0x6c135220, + 0x20f30: 0x6d049c20, 0x20f31: 0x6c625e20, 0x20f33: 0x6d424e20, + 0x20f35: 0x6cb63620, + 0x20f3a: 0x6d32ee20, + // Block 0x83d, offset 0x20f40 + 0x20f40: 0x6c5f2e20, 0x20f41: 0x6cb52e20, 0x20f42: 0x6c732420, 0x20f43: 0x6ca91c20, + 0x20f5f: 0x6ccb7220, + 0x20f65: 0x6c51fa20, 0x20f66: 0x6cc72c20, 0x20f67: 0x6cbdec20, + 0x20f6c: 0x6c70de20, 0x20f6f: 0x6c86ee20, + 0x20f75: 0x6cd29020, + 0x20f78: 0x6ca6da20, 0x20f79: 0x6cfbc420, 0x20f7a: 0x6c3dbc20, + 0x20f7d: 0x6cc80820, + // Block 0x83e, offset 0x20f80 + 0x20f81: 0x6d04ac20, 0x20f82: 0x6c4ba220, + 0x20f84: 0x6c62e020, 0x20f86: 0x6c9bf820, 0x20f87: 0x6c3dc020, + 0x20f89: 0x6cc9ee20, 0x20f8a: 0x6d247820, 0x20f8b: 0x6c69de20, + 0x20f8c: 0x6c9c2220, 0x20f8d: 0x6c900e20, 0x20f8e: 0x6cbb0020, + 0x20f90: 0x6c9cc620, 0x20f93: 0x6d15a420, + 0x20f96: 0x6c4dc620, 0x20f97: 0x6ca6e620, + 0x20f98: 0x6c81ee20, 0x20f99: 0x6ccbbe20, + 0x20f9c: 0x6c8c4220, 0x20f9e: 0x6d22c220, + 0x20fa5: 0x6caab020, + 0x20fab: 0x6cf4c020, + 0x20faf: 0x6c0b3620, + 0x20fb2: 0x6c0b3820, 0x20fb3: 0x6d079620, + 0x20fb5: 0x6c649620, + 0x20fb8: 0x6c0b3c20, + // Block 0x83f, offset 0x20fc0 + 0x20fc2: 0x6c2a7a20, + 0x20fc7: 0x6d3b8620, + 0x20fcb: 0x6cc72020, + 0x20fd0: 0x6cd69820, + 0x20fd8: 0x6c631820, 0x20fdb: 0x6c5b4a20, + 0x20fde: 0x6d2d5c20, + 0x20fe2: 0x6c042e20, 0x20fe3: 0x6c8ac420, + 0x20fe5: 0x6d003820, + 0x20fed: 0x6c656c20, 0x20fee: 0x6cd44020, + 0x20ff3: 0x6c77ba20, + 0x20ff7: 0x6c490c20, + 0x20ff8: 0x6c949420, + 0x20ffe: 0x6caa1a20, 0x20fff: 0x6c16e820, + // Block 0x840, offset 0x21000 + 0x2100e: 0x6c895220, + 0x21019: 0x6ca3c620, 0x2101a: 0x6cc80020, + 0x2101e: 0x6d368020, + 0x21026: 0x6c128620, + 0x21030: 0x6c867420, + 0x2103b: 0x6c7fcc20, + 0x2103f: 0x6c14e220, + // Block 0x841, offset 0x21040 + 0x21041: 0x6cedba20, + 0x21044: 0x6c856620, 0x21047: 0x6cf49620, + 0x21048: 0x6cad4220, 0x21049: 0x6d200a20, 0x2104b: 0x6c415e20, + 0x2104f: 0x6c011420, + 0x21050: 0x6d04b420, 0x21051: 0x6cd70420, 0x21052: 0x6cc8aa20, + 0x21058: 0x6c04b620, 0x21059: 0x6d1eea20, + 0x21062: 0x6c5d6e20, + 0x21065: 0x6c5a9c20, + 0x21068: 0x6d428c20, 0x21069: 0x6cfe9820, 0x2106b: 0x6c9dba20, + 0x21070: 0x6c40d620, 0x21071: 0x6d25e220, 0x21073: 0x6c0ff020, + 0x21074: 0x6c17ba20, 0x21075: 0x6ce9e220, 0x21077: 0x6c0ff220, + 0x2107d: 0x6c40d820, 0x2107f: 0x6ce55820, + // Block 0x842, offset 0x21080 + 0x21080: 0x6ca2dc20, + 0x21085: 0x6c556a20, 0x21086: 0x6ca83c20, + 0x2108b: 0x6c5b3e20, + 0x2108c: 0x6c90ea20, 0x2108e: 0x6ce35020, + 0x21090: 0x6cbc5420, 0x21091: 0x6cbbee20, 0x21092: 0x6d380620, + 0x21096: 0x6c2b4220, + 0x2109a: 0x6c8bd820, + 0x2109d: 0x6cc32c20, 0x2109e: 0x6d3b9a20, + 0x210a0: 0x6c828e20, 0x210a2: 0x6d013620, + 0x210a5: 0x6cc56220, + 0x210a8: 0x6c28f620, 0x210aa: 0x6c316020, 0x210ab: 0x6ca71420, + 0x210af: 0x6cd2ae20, + 0x210b2: 0x6cfb2020, + 0x210b9: 0x6d343820, + 0x210bd: 0x6c008820, 0x210be: 0x6c21f220, 0x210bf: 0x6cb42a20, + // Block 0x843, offset 0x210c0 + 0x210c1: 0x6cd2b620, + 0x210c5: 0x6cc0de20, 0x210c6: 0x6cd55020, 0x210c7: 0x6c2cbe20, + 0x210c9: 0x6cffa420, 0x210ca: 0x6cd70a20, + 0x210cc: 0x6c586020, + 0x210d0: 0x6d149220, 0x210d1: 0x6c72dc20, + 0x210d4: 0x6d34fc20, + 0x210dc: 0x6d2f9e20, + 0x210e3: 0x6d06a220, + 0x210ef: 0x6c905a20, + 0x210f1: 0x6d3aca20, 0x210f3: 0x6cdd5620, + 0x210f7: 0x6c2e8020, + 0x210fa: 0x6cc18420, + 0x210fc: 0x6c78a220, 0x210fd: 0x6c54ba20, 0x210fe: 0x6c708220, + // Block 0x844, offset 0x21100 + 0x21100: 0x6cbea420, + 0x2110d: 0x6c0dae20, + 0x21115: 0x6ce3f220, 0x21117: 0x6c744820, + 0x2111a: 0x6cc05a20, + 0x21123: 0x6c67e420, + 0x2112a: 0x6d282e20, + 0x2112d: 0x6c9a9a20, 0x2112e: 0x6caf6e20, + 0x21130: 0x6cc1a020, + 0x2113c: 0x6c9d5220, 0x2113f: 0x6ce3fe20, + // Block 0x845, offset 0x21140 + 0x21142: 0x6c768c20, + 0x21144: 0x6c08e820, 0x21146: 0x6cc11c20, + 0x2114f: 0x6ce56620, + 0x21151: 0x6c1f6c20, + 0x21158: 0x6c714a20, 0x2115a: 0x6cf69620, + 0x2115e: 0x6c8c5e20, + 0x2116d: 0x6c1bca20, 0x2116e: 0x6c5f7e20, + 0x21174: 0x6c917a20, + 0x21178: 0x6c876220, + 0x2117e: 0x6c73c820, + // Block 0x846, offset 0x21180 + 0x21185: 0x6d397c20, 0x21186: 0x6c921020, + 0x2118e: 0x6ca7f620, + 0x21194: 0x6cc2c020, + 0x211ad: 0x6d0b6820, 0x211af: 0x6c35c220, + 0x211b1: 0x6c564020, + // Block 0x847, offset 0x211c0 + 0x211c0: 0x6c982620, + 0x211c9: 0x6cf4a020, + 0x211cc: 0x6c137620, + 0x211d1: 0x6cbd1820, 0x211d2: 0x6c6a6220, 0x211d3: 0x6c52f420, + 0x211d5: 0x6c27b620, 0x211d6: 0x6c371c20, 0x211d7: 0x6d2b3a20, + 0x211d8: 0x6c565220, 0x211d9: 0x6c020e20, 0x211da: 0x6c6bb220, 0x211db: 0x6c3faa20, + 0x211dc: 0x6d1e7020, 0x211de: 0x6c3c1a20, + 0x211ec: 0x6ca26620, + 0x211f6: 0x6ccb1620, 0x211f7: 0x6c238a20, + 0x211fb: 0x6c772220, + // Block 0x848, offset 0x21200 + 0x21202: 0x6d11ea20, 0x21203: 0x6c008c20, + 0x21204: 0x6c05a620, 0x21206: 0x6cb34c20, + 0x21208: 0x6cd2b820, 0x21209: 0x6c392a20, 0x2120b: 0x6c70f420, + 0x2120c: 0x6cafb420, 0x2120e: 0x6cf07420, 0x2120f: 0x6c7a2220, + 0x21210: 0x6cbc8620, 0x21211: 0x6c417220, + 0x21222: 0x6c7be220, 0x21223: 0x6cdc2420, + 0x21224: 0x6c07d620, 0x21225: 0x6c632820, 0x21226: 0x6d0b8020, + 0x2122a: 0x6c76fe20, 0x2122b: 0x6ca7f820, + 0x2122d: 0x6d03cc20, 0x2122f: 0x6cf85c20, + 0x21231: 0x6c8c4a20, 0x21232: 0x6c347e20, + 0x21234: 0x6c159a20, + // Block 0x849, offset 0x21240 + 0x21248: 0x6cd32e20, 0x2124b: 0x6c334020, + 0x2124d: 0x6c675020, 0x2124e: 0x6d222a20, 0x2124f: 0x6c922020, + 0x21250: 0x6c372020, 0x21253: 0x6c476420, + 0x21255: 0x6cefa020, 0x21256: 0x6c17d620, 0x21257: 0x6c590020, + 0x21258: 0x6c0ce220, 0x2125b: 0x6c4e9420, + 0x2125c: 0x6ce99e20, 0x2125d: 0x6ca32420, 0x2125e: 0x6cb6e620, + 0x21260: 0x6ce7e820, 0x21261: 0x6d24d220, 0x21262: 0x6cede020, + 0x21264: 0x6cf3b020, 0x21265: 0x6c434220, + 0x21268: 0x6c792e20, 0x2126a: 0x6d14ba20, + 0x21278: 0x6cfe9a20, 0x2127a: 0x6c4ae420, 0x2127b: 0x6d0b8c20, + 0x2127c: 0x6cdc2e20, 0x2127d: 0x6cd95420, 0x2127f: 0x6d3d3820, + // Block 0x84a, offset 0x21280 + 0x21282: 0x6ce84a20, 0x21283: 0x6cfbf420, + 0x21288: 0x6d2b4420, 0x21289: 0x6c85c620, + 0x2128c: 0x6d3acc20, 0x2128e: 0x6c6aa220, + 0x21291: 0x6ce3e820, + 0x21294: 0x6d009c20, 0x21295: 0x6cbf1220, 0x21297: 0x6d0b9420, + 0x21298: 0x6c708620, 0x2129b: 0x6d1a5a20, + 0x2129c: 0x6d345220, 0x2129e: 0x6c76d020, 0x2129f: 0x6d3e2220, + 0x212a1: 0x6c77f420, 0x212a3: 0x6ca81220, + 0x212a4: 0x6cbb0620, 0x212a5: 0x6ced0220, 0x212a6: 0x6d2abc20, + 0x212a8: 0x6c708820, 0x212aa: 0x6d3f4220, + // Block 0x84b, offset 0x212c0 + 0x212c4: 0x6d0b9620, 0x212c7: 0x6c8bae20, + 0x212c9: 0x6cb5c020, + 0x212ce: 0x6c5b3420, + 0x212d3: 0x6cb77a20, + 0x212d5: 0x6d0fa820, 0x212d6: 0x6cdc3620, + 0x212d8: 0x6cb6f220, 0x212d9: 0x6c4a5620, + 0x212e2: 0x6cbe1020, 0x212e3: 0x6c353e20, + 0x212e5: 0x6d429820, + 0x212e8: 0x6d2b4820, 0x212e9: 0x6cb77c20, 0x212ea: 0x6c602e20, + 0x212ec: 0x6ceb2020, 0x212ed: 0x6c2e9c20, 0x212ef: 0x6c5bbe20, + 0x212f0: 0x6c98e420, 0x212f2: 0x6d063e20, + 0x212f5: 0x6c53fe20, 0x212f6: 0x6d0d7c20, 0x212f7: 0x6cfdc220, + 0x212f8: 0x6c231020, 0x212f9: 0x6c555820, + 0x212fc: 0x6c01c020, 0x212fe: 0x6c0de420, + // Block 0x84c, offset 0x21300 + 0x21307: 0x6c348e20, + 0x21310: 0x6d3a6a20, 0x21311: 0x6c2e9e20, 0x21312: 0x6d1ea220, 0x21313: 0x6cb6fa20, + 0x21314: 0x6cd26820, 0x21315: 0x6d099a20, 0x21316: 0x6d1ea420, 0x21317: 0x6c76ae20, + 0x21318: 0x6cbc2420, 0x2131b: 0x6cbab620, + 0x2131c: 0x6cae3e20, 0x2131f: 0x6cc2ee20, + 0x21321: 0x6d1c6e20, + 0x21327: 0x6ccbf220, + 0x2132b: 0x6ce1d020, + 0x2132d: 0x6c53c020, 0x2132e: 0x6cb06220, 0x2132f: 0x6d110a20, + 0x21334: 0x6ce8bc20, 0x21335: 0x6c148220, 0x21337: 0x6cfa3c20, + 0x21338: 0x6cb5f620, 0x2133a: 0x6cbf3a20, + 0x2133d: 0x6c6d1220, + // Block 0x84d, offset 0x21340 + 0x21348: 0x6d316020, + 0x2134c: 0x6d39ae20, 0x2134e: 0x6cf64420, + 0x21350: 0x6cf22a20, 0x21351: 0x6d37f820, + 0x21355: 0x6cdc4420, + 0x21358: 0x6c781020, 0x21359: 0x6c7e0c20, 0x2135a: 0x6c777220, + 0x2135d: 0x6c176c20, 0x2135e: 0x6c09f020, 0x2135f: 0x6ca13a20, + 0x21360: 0x6d3b1220, 0x21361: 0x6c4edc20, 0x21362: 0x6d227820, 0x21363: 0x6d153220, + 0x21364: 0x6c966c20, 0x21367: 0x6cb7aa20, + 0x21368: 0x6c4c0020, 0x21369: 0x6c97e420, 0x2136a: 0x6c89f420, 0x2136b: 0x6c8bc020, + 0x2136c: 0x6d40c620, 0x2136d: 0x6c82cc20, 0x2136e: 0x6c56b220, 0x2136f: 0x6c209220, + 0x21370: 0x6cb7ac20, 0x21371: 0x6c824420, + // Block 0x84e, offset 0x21380 + 0x21381: 0x6c1ac420, 0x21383: 0x6cb33020, + 0x21384: 0x6c2eca20, + 0x2138a: 0x6c82ce20, + 0x2138e: 0x6d160420, + 0x21393: 0x6c2d7620, + 0x21396: 0x6c33a420, 0x21397: 0x6c42d620, + 0x21398: 0x6c54f220, 0x2139a: 0x6cff0020, 0x2139b: 0x6c40ca20, + 0x2139c: 0x6cae8020, + 0x213ac: 0x6cd06a20, + 0x213b1: 0x6cef2a20, + 0x213bb: 0x6c335820, + 0x213bc: 0x6c177220, 0x213bd: 0x6d1b0420, 0x213be: 0x6c7b3a20, 0x213bf: 0x6c7a6020, + // Block 0x84f, offset 0x213c0 + 0x213c1: 0x6d41ce20, 0x213c2: 0x6c47ca20, + 0x213c5: 0x6d285420, 0x213c6: 0x6d36da20, + 0x213c9: 0x6c629420, 0x213ca: 0x6c199020, + 0x213d6: 0x6d020e20, + 0x213db: 0x6d419e20, + 0x213dc: 0x6c017420, 0x213dd: 0x6c4fb220, + 0x213e0: 0x6cb36020, 0x213e2: 0x6c2b9820, 0x213e3: 0x6d135820, + 0x213e7: 0x6ca4c420, + 0x213f1: 0x6c6b4220, 0x213f2: 0x6c059220, 0x213f3: 0x6c804020, + 0x213f4: 0x6c124820, 0x213f6: 0x6c0a6620, + 0x213fb: 0x6d2e1a20, + 0x213fc: 0x6cb7e620, + // Block 0x850, offset 0x21400 + 0x21402: 0x6ca4c620, + 0x21405: 0x6c940c20, 0x21407: 0x6c7c0a20, + 0x21409: 0x6ca08420, 0x2140b: 0x6c82e620, + 0x2140c: 0x6cad7420, + 0x21412: 0x6c86c420, 0x21413: 0x6c136420, + 0x21415: 0x6c299820, 0x21416: 0x6c82e820, + 0x21419: 0x6c36cc20, 0x2141b: 0x6c086020, + 0x2141c: 0x6c74e820, + 0x21425: 0x6d083420, 0x21426: 0x6ca89420, + 0x21428: 0x6c4d7c20, + 0x2142e: 0x6cfc4220, + 0x21430: 0x6c661620, 0x21431: 0x6c9c9e20, 0x21432: 0x6ca8a020, + 0x2143b: 0x6c124a20, + 0x2143c: 0x6cd97820, 0x2143d: 0x6d2ba820, 0x2143e: 0x6d194220, + // Block 0x851, offset 0x21440 + 0x21442: 0x6c1d3020, + 0x21444: 0x6c125020, + 0x21449: 0x6c830620, 0x2144a: 0x6caad220, 0x2144b: 0x6c876420, + 0x2144e: 0x6c84ba20, 0x2144f: 0x6c957220, + 0x21453: 0x6ce18a20, + 0x21456: 0x6ca8c420, 0x21457: 0x6ca8c620, + 0x21459: 0x6c5fae20, 0x2145b: 0x6c831220, + 0x2145d: 0x6ca48020, + 0x21460: 0x6c8c1420, 0x21461: 0x6c8dce20, + 0x21464: 0x6cfbe220, 0x21465: 0x6d24a820, 0x21467: 0x6d28ec20, + 0x21468: 0x6cc34a20, 0x21469: 0x6c8ac020, + 0x2146f: 0x6d22ce20, + 0x21470: 0x6c597620, + 0x2147a: 0x6ca4de20, + 0x2147c: 0x6d0a7820, 0x2147e: 0x6c711020, 0x2147f: 0x6c5dbc20, + // Block 0x852, offset 0x21480 + 0x21481: 0x6d179420, + 0x2148a: 0x6cf71420, 0x2148b: 0x6ccb8a20, + 0x2148c: 0x6c697020, 0x2148d: 0x6d1de020, + 0x21495: 0x6cd18c20, 0x21496: 0x6c6d8420, 0x21497: 0x6ced6e20, + 0x21498: 0x6d129e20, 0x21499: 0x6c6f4420, + 0x2149c: 0x6c45d020, + 0x214a1: 0x6c5aa020, + 0x214aa: 0x6c37a420, + 0x214b5: 0x6c4e7a20, + 0x214bc: 0x6c3e3020, + // Block 0x853, offset 0x214c0 + 0x214c0: 0x6c3e4a20, 0x214c1: 0x6d3d4a20, 0x214c2: 0x6c5eb620, + 0x214cf: 0x6c053a20, + 0x214d2: 0x6cb56620, 0x214d3: 0x6cd2a620, + 0x214d5: 0x6c2df420, 0x214d6: 0x6cadfa20, 0x214d7: 0x6cfbe420, + 0x214d8: 0x6cc9f620, + 0x214dd: 0x6c169220, 0x214de: 0x6d264620, + 0x214e0: 0x6c455820, 0x214e2: 0x6cf34220, + 0x214e4: 0x6c3b0a20, 0x214e7: 0x6c159020, + 0x214e9: 0x6ca58420, 0x214ea: 0x6c73d820, + 0x214ec: 0x6d2f8220, 0x214ee: 0x6cb96c20, + 0x214f1: 0x6c029820, + 0x214f6: 0x6cedf820, 0x214f7: 0x6d379020, + 0x214f9: 0x6c597820, 0x214fb: 0x6c106620, + 0x214fc: 0x6d3a5a20, 0x214fd: 0x6c092e20, 0x214fe: 0x6c173620, 0x214ff: 0x6d328620, + // Block 0x854, offset 0x21500 + 0x21500: 0x6c3de620, 0x21501: 0x6c79b820, 0x21503: 0x6d422c20, + 0x21504: 0x6d086c20, 0x21506: 0x6c3fb220, + 0x2150a: 0x6d118a20, + 0x2150d: 0x6c0e4e20, 0x2150f: 0x6c06e220, + 0x21510: 0x6d007c20, 0x21511: 0x6cd33020, 0x21512: 0x6d149620, + 0x21514: 0x6c531020, 0x21515: 0x6c251c20, 0x21517: 0x6d16e620, + 0x21518: 0x6d3b7620, + 0x2151d: 0x6c1bf620, + 0x21524: 0x6cb2fe20, + 0x21528: 0x6d1a3a20, + 0x21531: 0x6d260a20, + 0x21536: 0x6c6edc20, + 0x21539: 0x6c995c20, 0x2153a: 0x6cba4820, + 0x2153c: 0x6d172420, + // Block 0x855, offset 0x21540 + 0x21540: 0x6cf3b220, + 0x2154d: 0x6c069820, 0x2154e: 0x6c5dbe20, 0x2154f: 0x6c239420, + 0x21550: 0x6c797220, + 0x21555: 0x6cde4820, 0x21557: 0x6c4ea620, + 0x21558: 0x6cba4e20, + 0x2155c: 0x6d345420, + 0x21562: 0x6ccb2420, + 0x21565: 0x6cb8d620, 0x21566: 0x6c4cb420, + 0x21569: 0x6c4bbe20, + 0x2156c: 0x6c649820, 0x2156d: 0x6d37b820, 0x2156e: 0x6c9e2220, 0x2156f: 0x6c4afa20, + 0x21570: 0x6cd37e20, 0x21571: 0x6ca1d220, 0x21572: 0x6c363220, 0x21573: 0x6c039e20, + 0x21574: 0x6c7e7220, + 0x21578: 0x6d392820, 0x2157a: 0x6c603020, + // Block 0x856, offset 0x21580 + 0x21580: 0x6d2a4a20, + 0x21584: 0x6d2bd820, 0x21585: 0x6d179820, 0x21587: 0x6c468420, + 0x2158a: 0x6c4a6e20, 0x2158b: 0x6d1bc420, + 0x2158c: 0x6ccc9820, 0x2158d: 0x6c513420, 0x2158e: 0x6c057820, 0x2158f: 0x6ca12a20, + 0x21590: 0x6c9b1e20, 0x21593: 0x6cf4fe20, + 0x21594: 0x6c277620, 0x21597: 0x6c6f1620, + 0x2159c: 0x6c4ed020, 0x2159f: 0x6ce70220, + 0x215a0: 0x6c79be20, 0x215a1: 0x6c841220, 0x215a2: 0x6d368220, 0x215a3: 0x6c5bf420, + 0x215a4: 0x6d296e20, 0x215a6: 0x6c2dfc20, 0x215a7: 0x6c244420, + 0x215b1: 0x6d368420, 0x215b3: 0x6c7adc20, + 0x215b5: 0x6cfe4a20, 0x215b6: 0x6c57ba20, 0x215b7: 0x6c8a0c20, + 0x215b8: 0x6c255620, 0x215b9: 0x6cbb9a20, 0x215ba: 0x6c692420, + 0x215bc: 0x6d05d020, 0x215bd: 0x6c37da20, 0x215bf: 0x6cead020, + // Block 0x857, offset 0x215c0 + 0x215c0: 0x6ce00020, 0x215c1: 0x6d36a820, + 0x215c8: 0x6ca51020, 0x215c9: 0x6c99ac20, 0x215ca: 0x6c2c8c20, 0x215cb: 0x6c135820, + 0x215ce: 0x6c693a20, 0x215cf: 0x6c884820, + 0x215d1: 0x6ccc1820, 0x215d2: 0x6c28aa20, + 0x215d5: 0x6cdc6c20, 0x215d6: 0x6c884a20, 0x215d7: 0x6c4cf020, + 0x215da: 0x6c0c7c20, + 0x215dc: 0x6c22e220, 0x215dd: 0x6c2d7e20, 0x215de: 0x6c93fc20, 0x215df: 0x6ca64e20, + 0x215e0: 0x6d0dda20, 0x215e1: 0x6c7fbc20, + 0x215e4: 0x6c415620, 0x215e5: 0x6c1eb420, + 0x215e9: 0x6c0a8820, 0x215ea: 0x6d40ea20, 0x215eb: 0x6c5c6620, + 0x215ed: 0x6c7f4220, 0x215ee: 0x6cfbba20, 0x215ef: 0x6c3bfc20, + 0x215f0: 0x6c520220, + 0x215f9: 0x6d124020, 0x215fa: 0x6d2e3220, + 0x215fc: 0x6ca56620, 0x215fe: 0x6c95d020, + // Block 0x858, offset 0x21600 + 0x21600: 0x6d25d620, 0x21602: 0x6ca5ac20, + 0x21609: 0x6cc58220, + 0x2161c: 0x6c43e820, 0x2161e: 0x6c65a820, 0x2161f: 0x6cb2b420, + 0x21623: 0x6c0d1620, + 0x21626: 0x6c66d020, + 0x21629: 0x6c0e2e20, + 0x2162f: 0x6c9d1820, + 0x21630: 0x6c563420, + 0x21634: 0x6c2df220, 0x21636: 0x6d1e8c20, 0x21637: 0x6d108c20, + 0x21638: 0x6c07d020, 0x2163a: 0x6c189820, 0x2163b: 0x6c5e8c20, + 0x2163d: 0x6d108e20, + // Block 0x859, offset 0x21640 + 0x21647: 0x6c491020, + 0x21648: 0x6d0e5e20, + 0x21655: 0x6c1bc820, 0x21657: 0x6ccc3a20, + 0x21658: 0x6d0d3820, 0x21659: 0x6d165e20, 0x2165a: 0x6d166020, 0x2165b: 0x6c17fc20, + 0x2165e: 0x6c4e8220, 0x2165f: 0x6c597420, + 0x21664: 0x6cd71020, 0x21665: 0x6cdc2220, 0x21666: 0x6cc56820, 0x21667: 0x6cdfcc20, + 0x21668: 0x6d34e420, 0x2166a: 0x6c391e20, 0x2166b: 0x6c3cc620, + 0x21670: 0x6cdfce20, 0x21672: 0x6c9c3620, 0x21673: 0x6cafb620, + 0x21674: 0x6c106820, 0x21675: 0x6ca30e20, 0x21676: 0x6ce48220, 0x21677: 0x6c036620, + 0x21678: 0x6d16b020, + // Block 0x85a, offset 0x21680 + 0x21682: 0x6d0d4820, + 0x21684: 0x6ce54c20, 0x21686: 0x6d10ce20, 0x21687: 0x6cd04c20, + 0x21688: 0x6c77dc20, 0x21689: 0x6ce72420, 0x2168b: 0x6d084420, + 0x21693: 0x6d202820, + 0x21695: 0x6c043a20, + 0x21699: 0x6cf9a220, 0x2169a: 0x6c938420, 0x2169b: 0x6c7dce20, + 0x2169c: 0x6d29d220, 0x2169d: 0x6cc02c20, + 0x216a0: 0x6c243020, 0x216a1: 0x6d416a20, 0x216a2: 0x6c90e020, + 0x216a4: 0x6cf9a420, + 0x216af: 0x6ccfca20, + 0x216b2: 0x6cb43020, + 0x216b4: 0x6c6da620, 0x216b5: 0x6cbaae20, 0x216b6: 0x6d175820, + 0x216b8: 0x6ca81420, 0x216b9: 0x6c32fc20, 0x216bb: 0x6c6ab420, + 0x216bc: 0x6cdc3820, 0x216bd: 0x6d2e5820, 0x216be: 0x6c23e420, + // Block 0x85b, offset 0x216c0 + 0x216c1: 0x6c07e420, 0x216c2: 0x6c491220, 0x216c3: 0x6ccf2a20, + 0x216c5: 0x6c6cfe20, 0x216c6: 0x6c2c3e20, + 0x216d1: 0x6c27d220, 0x216d3: 0x6ca3a220, + 0x216d5: 0x6ca9fc20, 0x216d7: 0x6c601820, + 0x216d8: 0x6d0c8220, 0x216da: 0x6caa2020, + 0x216dc: 0x6c325a20, 0x216dd: 0x6cf09020, 0x216de: 0x6cb0f420, + 0x216e2: 0x6c555a20, + 0x216e4: 0x6c644020, 0x216e5: 0x6d12ee20, 0x216e6: 0x6c759220, 0x216e7: 0x6c7f9c20, + 0x216e8: 0x6c7e7420, 0x216e9: 0x6d19de20, + 0x216ed: 0x6ce9a220, + 0x216f5: 0x6ca4f620, + 0x216fa: 0x6d411c20, + 0x216ff: 0x6c96c220, + // Block 0x85c, offset 0x21700 + 0x21700: 0x6cd7f020, 0x21701: 0x6d365420, + 0x21704: 0x6c5ac020, 0x21705: 0x6d3c8e20, 0x21707: 0x6c5bd820, + 0x2170d: 0x6c1e8c20, 0x2170f: 0x6c182420, + 0x21712: 0x6d04da20, 0x21713: 0x6c7fa220, + 0x21715: 0x6c232620, 0x21716: 0x6cd0bc20, 0x21717: 0x6ca13c20, + 0x21718: 0x6d140220, 0x21719: 0x6d111a20, 0x2171a: 0x6cf7fa20, 0x2171b: 0x6d419020, + 0x2171c: 0x6c0e2820, + 0x21727: 0x6d216c20, + 0x21729: 0x6c927e20, + 0x2172e: 0x6ce9b620, 0x2172f: 0x6ceffe20, + 0x21731: 0x6c3b8820, 0x21732: 0x6cd06c20, + 0x2173b: 0x6c8a0e20, + // Block 0x85d, offset 0x21740 + 0x21742: 0x6cd56a20, 0x21743: 0x6c284220, + 0x21744: 0x6c732620, 0x21745: 0x6d21a020, 0x21746: 0x6d034a20, 0x21747: 0x6d114220, + 0x21748: 0x6cda5820, + 0x21752: 0x6c5d8020, + 0x21754: 0x6cb92220, + 0x2175a: 0x6c967c20, + 0x2175d: 0x6c767020, + 0x21761: 0x6c91e620, 0x21763: 0x6d1ebc20, + 0x2176e: 0x6cfd2e20, + 0x21779: 0x6cf40620, 0x2177b: 0x6d1b2020, + 0x2177c: 0x6cf72c20, 0x2177f: 0x6d2d0820, + // Block 0x85e, offset 0x21780 + 0x21780: 0x6d027020, + 0x21784: 0x6cc1fa20, + 0x21788: 0x6c84be20, + 0x2178d: 0x6cb95820, + 0x21794: 0x6c8dd020, 0x21795: 0x6c947820, + 0x2179a: 0x6c14b220, + 0x217a6: 0x6d334420, + 0x217a8: 0x6d0c8420, + 0x217b2: 0x6d1b3820, 0x217b3: 0x6c7c5c20, + 0x217b7: 0x6cc0d220, + 0x217b9: 0x6c3dd820, 0x217bb: 0x6d22d420, + // Block 0x85f, offset 0x217c0 + 0x217c1: 0x6cb57e20, + 0x217c6: 0x6cb75620, 0x217c7: 0x6c61a620, + 0x217c8: 0x6d24ce20, + 0x217ce: 0x6c434420, 0x217cf: 0x6c734820, + 0x217d1: 0x6cb5a020, 0x217d3: 0x6c411020, + 0x217d5: 0x6cc37220, + 0x217da: 0x6cf09220, + 0x217e7: 0x6d368620, + 0x217eb: 0x6c65ba20, + 0x217ed: 0x6cd8d620, + 0x217f0: 0x6d188c20, 0x217f1: 0x6cb91c20, + 0x217fc: 0x6c856220, 0x217ff: 0x6d29ce20, + // Block 0x860, offset 0x21800 + 0x21800: 0x6d168020, 0x21802: 0x6c110620, 0x21803: 0x6d168220, + 0x21804: 0x6c437220, 0x21806: 0x6c2e6e20, + 0x21808: 0x6d33a420, 0x21809: 0x6d16ec20, 0x2180b: 0x6d28fa20, + 0x2180c: 0x6c275220, 0x2180e: 0x6cdab220, + 0x21814: 0x6c6b4420, 0x21815: 0x6c193820, 0x21816: 0x6cc1fc20, + 0x21818: 0x6c4e7820, 0x21819: 0x6cfb1e20, + 0x21820: 0x6cc2ae20, 0x21821: 0x6c6a5620, + 0x21825: 0x6c733820, + 0x2182a: 0x6c285c20, + 0x2182d: 0x6c6c2420, + 0x21834: 0x6c0da820, 0x21835: 0x6c551a20, + 0x21839: 0x6c73da20, 0x2183b: 0x6d20b020, + // Block 0x861, offset 0x21840 + 0x21843: 0x6c84fa20, + 0x21844: 0x6cbb0420, 0x21845: 0x6cd70620, 0x21846: 0x6c7a2420, + 0x21848: 0x6d31b620, + 0x2184d: 0x6c3de820, 0x2184e: 0x6ccfac20, + 0x21852: 0x6c20c020, + 0x21855: 0x6ce72620, 0x21857: 0x6d16ee20, + 0x21859: 0x6d0f9220, + 0x2185c: 0x6ceafa20, 0x2185d: 0x6d385e20, 0x2185e: 0x6c5ff220, + 0x21864: 0x6d0a7a20, 0x21866: 0x6cd05220, 0x21867: 0x6d078820, + 0x2186d: 0x6c8e4820, 0x2186e: 0x6d24dc20, 0x2186f: 0x6c554220, + 0x21870: 0x6d334820, 0x21873: 0x6cae6620, + 0x21877: 0x6c742220, + // Block 0x862, offset 0x21880 + 0x21882: 0x6d362020, 0x21883: 0x6cb0f620, + 0x21884: 0x6d261820, 0x21886: 0x6c649a20, + 0x2188a: 0x6cad0220, + 0x2188e: 0x6d3bca20, + 0x21890: 0x6cfb6e20, 0x21892: 0x6c080220, + 0x21894: 0x6c232820, 0x21896: 0x6ca13e20, + 0x2189a: 0x6c4c7420, + 0x2189e: 0x6c1a3420, 0x2189f: 0x6cbb9c20, + 0x218a6: 0x6c0a4a20, + 0x218a9: 0x6cbb4820, 0x218ab: 0x6d38aa20, + 0x218b2: 0x6c38d020, 0x218b3: 0x6c0cc420, + 0x218be: 0x6c0fa020, 0x218bf: 0x6cc73220, + // Block 0x863, offset 0x218c0 + 0x218c5: 0x6c2f8820, 0x218c6: 0x6cc32e20, 0x218c7: 0x6c703c20, + 0x218c8: 0x6d117420, + 0x218d3: 0x6cf98620, + 0x218d6: 0x6d2a3e20, + 0x218dd: 0x6c27c820, 0x218df: 0x6cf44420, + 0x218e0: 0x6ceb1420, 0x218e2: 0x6c54c820, + 0x218e7: 0x6cf64620, + 0x218ec: 0x6c7f1a20, 0x218ee: 0x6c3a1620, + 0x218f9: 0x6c55ec20, + // Block 0x864, offset 0x21900 + 0x21906: 0x6cfa7220, + 0x21909: 0x6ccd2c20, + 0x2190d: 0x6c3a8420, + 0x21910: 0x6c261820, 0x21912: 0x6c3e3220, + 0x21914: 0x6c1f3020, + 0x2191d: 0x6c2fd020, 0x2191e: 0x6c807020, + 0x21929: 0x6cf7fc20, + 0x2192f: 0x6c0c1420, + 0x21930: 0x6d23e820, 0x21931: 0x6cdc6e20, 0x21932: 0x6cf80c20, + 0x21937: 0x6cb3e620, + 0x2193e: 0x6c697c20, + // Block 0x865, offset 0x21940 + 0x21940: 0x6d166420, 0x21943: 0x6cecb820, + 0x21944: 0x6c611e20, 0x21946: 0x6cecc620, 0x21947: 0x6ce9f220, + 0x2194b: 0x6c021020, + 0x2194d: 0x6ce45820, 0x2194e: 0x6c1b0020, + 0x21952: 0x6cc46220, + 0x21954: 0x6cc96820, 0x21955: 0x6d1a2c20, 0x21956: 0x6caf3420, 0x21957: 0x6c228e20, + 0x21958: 0x6ce71a20, 0x21959: 0x6d1ace20, + 0x2195c: 0x6c43c820, 0x2195d: 0x6ce55020, 0x2195e: 0x6d329620, 0x2195f: 0x6d390c20, + 0x21961: 0x6d149820, 0x21962: 0x6c7ae420, 0x21963: 0x6cd90c20, + 0x21967: 0x6c2c2820, + 0x2196c: 0x6d008820, 0x2196e: 0x6cfe9e20, 0x2196f: 0x6c4a1c20, + 0x21970: 0x6ceb7420, 0x21971: 0x6c3c3620, 0x21972: 0x6cf3b420, + 0x21975: 0x6d053220, + 0x2197f: 0x6d1f1620, + // Block 0x866, offset 0x21980 + 0x21981: 0x6c8ce020, 0x21982: 0x6d0e6020, + 0x21985: 0x6c2ff620, 0x21986: 0x6cb77e20, 0x21987: 0x6ce21a20, + 0x21988: 0x6c4dfc20, 0x2198a: 0x6c1b1c20, 0x2198b: 0x6cd91820, + 0x21991: 0x6cc35820, + 0x21994: 0x6c4ea820, + 0x2199f: 0x6cc77820, + 0x219a0: 0x6cb78e20, 0x219a1: 0x6c762c20, 0x219a2: 0x6d211e20, 0x219a3: 0x6c139a20, + 0x219a4: 0x6c1a8220, 0x219a5: 0x6d233a20, 0x219a7: 0x6c0e2020, + 0x219a9: 0x6c231220, 0x219aa: 0x6d39a420, + 0x219ac: 0x6d235420, + 0x219b1: 0x6c744a20, 0x219b2: 0x6c8f3620, 0x219b3: 0x6ccab220, + 0x219b4: 0x6d236820, + // Block 0x867, offset 0x219c0 + 0x219c5: 0x6cd66820, + 0x219cb: 0x6d262020, + 0x219ce: 0x6d2eba20, + 0x219d1: 0x6cd66a20, 0x219d3: 0x6c1ee420, + 0x219d4: 0x6d2ec620, 0x219d5: 0x6cca2020, 0x219d6: 0x6cfabe20, + 0x219d8: 0x6c24d820, 0x219d9: 0x6c9bde20, 0x219da: 0x6c2b7c20, + 0x219de: 0x6d368820, 0x219df: 0x6c02de20, + 0x219e6: 0x6d04e020, + 0x219e8: 0x6cb11e20, 0x219ea: 0x6c69bc20, 0x219eb: 0x6c7b6c20, + 0x219ec: 0x6cc98620, 0x219ed: 0x6cfcf420, 0x219ee: 0x6d2cda20, 0x219ef: 0x6c2d7820, + 0x219f7: 0x6d154420, + 0x219fa: 0x6c5c2e20, 0x219fb: 0x6ccda620, + // Block 0x868, offset 0x21a00 + 0x21a04: 0x6c1d2220, 0x21a05: 0x6d156220, 0x21a06: 0x6d021220, 0x21a07: 0x6d36dc20, + 0x21a08: 0x6ce5e020, 0x21a0a: 0x6cb26c20, 0x21a0b: 0x6cfbb020, + 0x21a0e: 0x6cfadc20, 0x21a0f: 0x6cdb4c20, + 0x21a11: 0x6c24a020, + 0x21a17: 0x6cd97220, + 0x21a1b: 0x6c522820, + 0x21a1d: 0x6cfd3a20, 0x21a1f: 0x6d1f8e20, + 0x21a21: 0x6d246420, + 0x21a24: 0x6cdf5220, 0x21a26: 0x6c751820, 0x21a27: 0x6ca48220, + 0x21a29: 0x6c2cba20, 0x21a2b: 0x6d164820, + 0x21a2c: 0x6c090620, + 0x21a33: 0x6d056220, + 0x21a34: 0x6d166820, 0x21a35: 0x6cc81020, 0x21a37: 0x6c455a20, + 0x21a3a: 0x6d166a20, + 0x21a3f: 0x6d356e20, + // Block 0x869, offset 0x21a40 + 0x21a40: 0x6d02a420, 0x21a42: 0x6c617820, + 0x21a44: 0x6cfa2c20, + 0x21a48: 0x6d2f4e20, 0x21a49: 0x6ca54620, 0x21a4a: 0x6d015620, + 0x21a4e: 0x6d168620, + 0x21a6b: 0x6c3f3420, + 0x21a6d: 0x6ccf3420, 0x21a6f: 0x6d253c20, + 0x21a70: 0x6c390420, 0x21a72: 0x6c3d3c20, 0x21a73: 0x6cf4a820, + 0x21a74: 0x6cf57c20, 0x21a75: 0x6c539c20, + 0x21a79: 0x6c618220, 0x21a7a: 0x6c170420, + 0x21a7f: 0x6ca0ca20, + // Block 0x86a, offset 0x21a80 + 0x21a80: 0x6cae0820, 0x21a83: 0x6ca20e20, + 0x21a84: 0x6cc00420, 0x21a85: 0x6c994a20, 0x21a87: 0x6c268020, + 0x21a89: 0x6cf98c20, 0x21a8a: 0x6ccfae20, 0x21a8b: 0x6ce26c20, + 0x21a8c: 0x6c530220, 0x21a8d: 0x6c093620, + 0x21a9d: 0x6ca62620, 0x21a9f: 0x6cbbd220, + 0x21aa7: 0x6cc84e20, + 0x21ab8: 0x6c67d820, 0x21ab9: 0x6c138420, 0x21aba: 0x6c9ce220, + 0x21abd: 0x6d16f020, 0x21abf: 0x6cdd0a20, + // Block 0x86b, offset 0x21ac0 + 0x21ac1: 0x6cf4c220, 0x21ac2: 0x6d078420, + 0x21ac5: 0x6cf76c20, 0x21ac7: 0x6d15d020, + 0x21ad0: 0x6ca49a20, 0x21ad3: 0x6cf07820, + 0x21aee: 0x6c770220, + 0x21af1: 0x6c906020, 0x21af2: 0x6c938620, 0x21af3: 0x6d3c2a20, + 0x21afa: 0x6d35b420, + 0x21afc: 0x6d042220, 0x21afe: 0x6c44f820, 0x21aff: 0x6c6ce620, + // Block 0x86c, offset 0x21b00 + 0x21b00: 0x6cfca420, 0x21b01: 0x6c61c820, 0x21b02: 0x6c261a20, + 0x21b04: 0x6c815020, 0x21b05: 0x6c3bb820, 0x21b06: 0x6c722a20, + 0x21b0b: 0x6c9eb220, + 0x21b0c: 0x6cf9a620, + 0x21b11: 0x6cda8c20, + 0x21b28: 0x6d35b620, 0x21b2a: 0x6c567e20, 0x21b2b: 0x6c79e220, + 0x21b2d: 0x6cdd5820, 0x21b2e: 0x6ca68e20, + 0x21b3a: 0x6ce28c20, 0x21b3b: 0x6d3ace20, + // Block 0x86d, offset 0x21b40 + 0x21b41: 0x6c269820, 0x21b43: 0x6cc04420, + 0x21b44: 0x6d0b9820, 0x21b46: 0x6cfb4820, + 0x21b49: 0x6ca58820, + 0x21b4d: 0x6d351420, 0x21b4e: 0x6c0ce620, + 0x21b52: 0x6c1d3a20, 0x21b53: 0x6c7f9820, + 0x21b54: 0x6c2ff820, 0x21b55: 0x6cc43a20, 0x21b56: 0x6cfe2e20, + 0x21b58: 0x6cff8020, 0x21b59: 0x6ced0620, 0x21b5a: 0x6cc81420, 0x21b5b: 0x6cee5020, + 0x21b5c: 0x6ca69820, 0x21b5e: 0x6c03fe20, 0x21b5f: 0x6d0b9a20, + 0x21b65: 0x6cd7e220, 0x21b66: 0x6d1ad820, + 0x21b68: 0x6d231220, + 0x21b6e: 0x6c83b820, 0x21b6f: 0x6c5dc020, + // Block 0x86e, offset 0x21b80 + 0x21b97: 0x6c056820, + 0x21ba3: 0x6cf5e620, + 0x21ba5: 0x6c6f6a20, + 0x21ba8: 0x6d01ac20, 0x21ba9: 0x6cb8e020, 0x21baa: 0x6caaf820, 0x21bab: 0x6d040020, + 0x21bac: 0x6c344e20, 0x21bad: 0x6c614020, 0x21bae: 0x6cf44a20, 0x21baf: 0x6ca21220, + 0x21bb0: 0x6d0e6e20, 0x21bb1: 0x6cb79020, 0x21bb2: 0x6ca2de20, 0x21bb3: 0x6c1c1e20, + 0x21bb4: 0x6c540220, 0x21bb6: 0x6ccaf220, + 0x21bb8: 0x6ca4aa20, 0x21bbb: 0x6c1a7020, + 0x21bbc: 0x6c1a7220, 0x21bbd: 0x6c7cd020, 0x21bbf: 0x6c644220, + // Block 0x86f, offset 0x21bc0 + 0x21bc0: 0x6ce8ac20, 0x21bc2: 0x6c319a20, + 0x21bc5: 0x6cf9c220, 0x21bc6: 0x6d382e20, 0x21bc7: 0x6c5dcc20, + 0x21bc8: 0x6c1d1620, 0x21bc9: 0x6c26a420, + 0x21bcc: 0x6c997c20, 0x21bcd: 0x6d120620, + 0x21bd3: 0x6c72f220, + 0x21bec: 0x6cd38420, 0x21bef: 0x6d1a6420, + 0x21bf3: 0x6c478a20, + 0x21bf4: 0x6cf4ec20, + 0x21bf8: 0x6c4cee20, 0x21bf9: 0x6ce3f620, 0x21bfb: 0x6c52a220, + // Block 0x870, offset 0x21c00 + 0x21c07: 0x6cc54e20, + 0x21c09: 0x6d14f420, 0x21c0b: 0x6cea7c20, + 0x21c0f: 0x6cbf3c20, + 0x21c10: 0x6c4d6e20, 0x21c12: 0x6cb79e20, + 0x21c15: 0x6c5dd820, 0x21c16: 0x6ce40020, 0x21c17: 0x6caf7020, + 0x21c1a: 0x6c451020, + 0x21c1c: 0x6d01c420, 0x21c1e: 0x6c9d5620, 0x21c1f: 0x6c434c20, + 0x21c20: 0x6cddf020, 0x21c21: 0x6cfdec20, 0x21c23: 0x6cd4e620, + 0x21c26: 0x6c3e9820, + 0x21c2c: 0x6d3b7e20, 0x21c2d: 0x6c8f3820, + // Block 0x871, offset 0x21c40 + 0x21c45: 0x6d1f4420, + 0x21c4a: 0x6c1a7820, 0x21c4b: 0x6c330620, + 0x21c62: 0x6c841420, 0x21c63: 0x6d105820, + 0x21c64: 0x6c841620, 0x21c67: 0x6c91c820, + 0x21c68: 0x6ca24e20, 0x21c69: 0x6cdc5220, 0x21c6a: 0x6c00b620, + 0x21c6d: 0x6c79f420, 0x21c6f: 0x6d306a20, + 0x21c70: 0x6c00b820, 0x21c71: 0x6ce2a620, 0x21c73: 0x6c93ea20, + 0x21c74: 0x6ce9ac20, 0x21c75: 0x6c088020, + 0x21c7e: 0x6c5bf620, 0x21c7f: 0x6c588a20, + // Block 0x872, offset 0x21c80 + 0x21c9b: 0x6c7e0e20, + 0x21c9d: 0x6d02e020, + 0x21ca1: 0x6ccaf420, + 0x21cab: 0x6cd5f020, + 0x21cac: 0x6cc3da20, 0x21cad: 0x6c035620, 0x21cae: 0x6cea0620, + 0x21cb2: 0x6c403220, 0x21cb3: 0x6c0cba20, + 0x21cb5: 0x6ce17e20, 0x21cb7: 0x6cfe4c20, + 0x21cb9: 0x6cd81420, 0x21cba: 0x6c0f4020, + 0x21cbc: 0x6c970020, 0x21cbd: 0x6c298020, 0x21cbf: 0x6c4b6420, + // Block 0x873, offset 0x21cc0 + 0x21cc0: 0x6c522020, 0x21cc1: 0x6cf69a20, 0x21cc2: 0x6c298220, 0x21cc3: 0x6d184e20, + 0x21cc5: 0x6c088420, 0x21cc7: 0x6c472c20, + 0x21cc8: 0x6c255820, 0x21cc9: 0x6ccb4420, + 0x21ccd: 0x6c441e20, 0x21cce: 0x6d23c220, 0x21ccf: 0x6ca2fa20, + 0x21cd1: 0x6c865620, 0x21cd2: 0x6d36ac20, + 0x21cf0: 0x6d2fd420, + 0x21cf4: 0x6c5f1220, 0x21cf5: 0x6cc87220, + 0x21cf9: 0x6c1d5820, + // Block 0x874, offset 0x21d00 + 0x21d02: 0x6c6b1820, + 0x21d0c: 0x6c172020, 0x21d0d: 0x6d307a20, + 0x21d12: 0x6cdb1020, 0x21d13: 0x6d1db020, + 0x21d16: 0x6cb7d420, 0x21d17: 0x6d3d9820, + 0x21d1a: 0x6c769620, + 0x21d1c: 0x6d133c20, 0x21d1e: 0x6cb7d620, + 0x21d39: 0x6d04a420, + // Block 0x875, offset 0x21d40 + 0x21d49: 0x6d141420, 0x21d4a: 0x6c1e3020, + 0x21d4e: 0x6ce98020, 0x21d4f: 0x6c00da20, + 0x21d50: 0x6cb1f220, 0x21d53: 0x6c8b3620, + 0x21d54: 0x6c9dd820, 0x21d55: 0x6c00dc20, 0x21d57: 0x6ca0ae20, + 0x21d58: 0x6cf0e220, 0x21d59: 0x6d1d5220, 0x21d5a: 0x6ca65020, + 0x21d5e: 0x6c0f7420, + 0x21d60: 0x6c8f4620, + 0x21d73: 0x6cc8e620, + 0x21d7b: 0x6c936620, + 0x21d7c: 0x6c140c20, 0x21d7f: 0x6c1f8620, + // Block 0x876, offset 0x21d80 + 0x21d81: 0x6ccb0220, 0x21d82: 0x6c847020, + 0x21d84: 0x6cd94620, 0x21d86: 0x6c86c620, + 0x21d8b: 0x6cf90420, + 0x21d8d: 0x6d0c3e20, 0x21d8e: 0x6c25ce20, + 0x21d90: 0x6c8eb620, + 0x21d98: 0x6c9b6c20, 0x21d9a: 0x6d2e8a20, + 0x21da4: 0x6d3c4c20, 0x21da7: 0x6c9ea620, + 0x21da9: 0x6c86f220, 0x21dab: 0x6c71da20, + 0x21daf: 0x6d025220, + 0x21db0: 0x6d025420, 0x21db1: 0x6c904220, 0x21db2: 0x6c8fc220, + // Block 0x877, offset 0x21dc0 + 0x21dc2: 0x6ce2c620, 0x21dc3: 0x6d3b3820, + 0x21dcb: 0x6c155220, + 0x21dcc: 0x6cfc4420, 0x21dcf: 0x6d1cc220, + 0x21dd0: 0x6cae2a20, + 0x21dd8: 0x6d012220, 0x21dda: 0x6c69dc20, + 0x21dde: 0x6c1cf820, + 0x21df3: 0x6c50ae20, + 0x21dfd: 0x6cea8420, + // Block 0x878, offset 0x21e00 + 0x21e05: 0x6c53b220, + 0x21e08: 0x6c97b020, 0x21e0a: 0x6c6c7a20, + 0x21e0c: 0x6cc17020, 0x21e0d: 0x6c30d420, 0x21e0e: 0x6cbff820, 0x21e0f: 0x6d28ee20, + 0x21e11: 0x6cd0d420, 0x21e12: 0x6d28f020, + 0x21e15: 0x6d15ba20, + 0x21e1a: 0x6c578020, + 0x21e1f: 0x6c76a220, + 0x21e30: 0x6d268e20, 0x21e31: 0x6ca68420, 0x21e32: 0x6cd7d620, + 0x21e34: 0x6cf2aa20, + 0x21e38: 0x6c118e20, 0x21e3a: 0x6c647c20, + 0x21e3c: 0x6c9ecc20, 0x21e3d: 0x6ccea020, 0x21e3f: 0x6cc70820, + // Block 0x879, offset 0x21e40 + 0x21e40: 0x6c419220, + 0x21e45: 0x6cbb0a20, 0x21e47: 0x6cd52a20, + 0x21e48: 0x6d3d5820, + 0x21e4f: 0x6cd1bc20, + 0x21e51: 0x6ce3f820, + 0x21e56: 0x6d2c3620, 0x21e57: 0x6d2d7e20, + 0x21e5d: 0x6c3bdc20, 0x21e5e: 0x6c9eda20, + 0x21e60: 0x6d2b5220, + 0x21e64: 0x6d368a20, 0x21e65: 0x6cb90020, 0x21e66: 0x6c4ede20, 0x21e67: 0x6c440e20, + 0x21e6e: 0x6c119e20, + 0x21e70: 0x6c4c7820, 0x21e71: 0x6c685e20, 0x21e73: 0x6d1da220, + 0x21e74: 0x6c026820, + 0x21e7b: 0x6d2c4620, + 0x21e7d: 0x6cf8c420, + // Block 0x87a, offset 0x21e80 + 0x21e81: 0x6d05d220, 0x21e82: 0x6cf46620, + 0x21e8f: 0x6c74b820, + 0x21e90: 0x6c5f2a20, 0x21e92: 0x6c1c6a20, + 0x21e94: 0x6ced5420, 0x21e96: 0x6c9ef220, 0x21e97: 0x6d2b6420, + 0x21e9c: 0x6c6b6e20, 0x21e9d: 0x6cd29220, 0x21e9f: 0x6cf72e20, + 0x21ea1: 0x6c36e220, + 0x21ea5: 0x6c564220, 0x21ea6: 0x6c564a20, + 0x21ea8: 0x6c857020, 0x21eab: 0x6c1f0820, + 0x21eae: 0x6d13c820, 0x21eaf: 0x6c992c20, + 0x21eb0: 0x6d056c20, 0x21eb1: 0x6d379820, 0x21eb3: 0x6d16b820, + 0x21eba: 0x6c89de20, + 0x21ebf: 0x6c647820, + // Block 0x87b, offset 0x21ec0 + 0x21ec0: 0x6c656e20, 0x21ec1: 0x6c70fa20, + 0x21ec4: 0x6d3abc20, + 0x21ec8: 0x6cf43a20, + 0x21ecf: 0x6c78a420, + 0x21ed0: 0x6c786020, 0x21ed1: 0x6c860e20, 0x21ed2: 0x6c08dc20, 0x21ed3: 0x6c43ec20, + 0x21ed5: 0x6d059820, 0x21ed6: 0x6ccbfa20, 0x21ed7: 0x6c8d1c20, + 0x21ed8: 0x6c781220, + 0x21ede: 0x6c0f4220, 0x21edf: 0x6c0b0820, + 0x21ee0: 0x6cd68820, 0x21ee1: 0x6cb66e20, 0x21ee2: 0x6ccde420, + 0x21ee6: 0x6c5e6420, + 0x21ee8: 0x6cbc1c20, + 0x21eee: 0x6d166c20, 0x21eef: 0x6c73d020, + 0x21ef0: 0x6d2efe20, 0x21ef2: 0x6d031620, + 0x21ef7: 0x6cea9a20, + 0x21ef8: 0x6c4d5020, 0x21ef9: 0x6cfa2e20, 0x21efb: 0x6ceae020, + 0x21efc: 0x6d145620, + // Block 0x87c, offset 0x21f00 + 0x21f03: 0x6c242c20, + 0x21f07: 0x6c674620, + 0x21f08: 0x6ca3de20, 0x21f0b: 0x6caf0020, + 0x21f0d: 0x6c6a7020, 0x21f0e: 0x6d08d820, 0x21f0f: 0x6c552020, + 0x21f25: 0x6d1f9e20, 0x21f26: 0x6caa4c20, 0x21f27: 0x6d12c220, + 0x21f2a: 0x6d1b3a20, + 0x21f2c: 0x6c799420, + 0x21f36: 0x6cfe8420, 0x21f37: 0x6cfd6220, + 0x21f3c: 0x6ca49620, 0x21f3e: 0x6d2f2420, + // Block 0x87d, offset 0x21f40 + 0x21f50: 0x6c6a7c20, 0x21f53: 0x6caa5020, + 0x21f54: 0x6ccd7020, + 0x21f62: 0x6c63a020, + 0x21f67: 0x6d38dc20, + 0x21f68: 0x6cc6fe20, 0x21f6b: 0x6c922220, + 0x21f6c: 0x6cc96e20, 0x21f6d: 0x6caa6020, 0x21f6f: 0x6c0ec420, + 0x21f70: 0x6d302220, 0x21f72: 0x6cbdca20, + 0x21f74: 0x6c21f620, 0x21f75: 0x6d40ac20, 0x21f77: 0x6cf2ac20, + 0x21f78: 0x6cf43620, 0x21f7b: 0x6ca7e020, + 0x21f7f: 0x6cfa8820, + // Block 0x87e, offset 0x21f80 + 0x21f80: 0x6c531220, + 0x21fab: 0x6ce6e820, + 0x21fac: 0x6c6c8a20, + 0x21fb1: 0x6c6aa420, 0x21fb2: 0x6c51c020, 0x21fb3: 0x6ce84c20, + 0x21fb4: 0x6d303a20, 0x21fb5: 0x6cb1ec20, 0x21fb6: 0x6c6ce820, 0x21fb7: 0x6ca44420, + 0x21fbc: 0x6c33e820, 0x21fbe: 0x6cf5be20, 0x21fbf: 0x6d018020, + // Block 0x87f, offset 0x21fc0 + 0x21fc1: 0x6cf86c20, 0x21fc2: 0x6c815220, 0x21fc3: 0x6c32ac20, + 0x21fc4: 0x6c61ca20, 0x21fc5: 0x6c138a20, 0x21fc6: 0x6c1d6620, + 0x21fc8: 0x6c427020, + 0x21fce: 0x6cfdb820, 0x21fcf: 0x6c29d620, + 0x21fe5: 0x6c0b8e20, 0x21fe6: 0x6cfea020, 0x21fe7: 0x6d02c220, + // Block 0x880, offset 0x22000 + 0x22001: 0x6d224c20, 0x22002: 0x6cfb4a20, 0x22003: 0x6c83ba20, + 0x22004: 0x6cba0020, 0x22007: 0x6c9a5420, + 0x22009: 0x6cbb6c20, 0x2200a: 0x6d0b9e20, + 0x2200c: 0x6cb82a20, 0x2200d: 0x6cbf8a20, 0x2200f: 0x6c056a20, + 0x22010: 0x6d32b220, + 0x2201a: 0x6d2b4a20, 0x2201b: 0x6cd68e20, + 0x2201e: 0x6ccaf020, + // Block 0x881, offset 0x22040 + 0x22045: 0x6c923a20, + 0x22049: 0x6d009e20, 0x2204b: 0x6c3f5c20, + 0x2204c: 0x6d2d3a20, + 0x22069: 0x6d2b5020, 0x2206b: 0x6c32c220, + 0x2206d: 0x6c2ad620, 0x2206e: 0x6d233c20, + 0x22070: 0x6c93de20, 0x22072: 0x6ced8220, 0x22073: 0x6d090e20, + 0x22074: 0x6c68f420, 0x22075: 0x6d266420, 0x22076: 0x6d362420, 0x22077: 0x6cefc420, + 0x22079: 0x6c43ee20, 0x2207a: 0x6c71b420, + 0x2207c: 0x6d0d8420, 0x2207d: 0x6c262620, 0x2207e: 0x6c997e20, + // Block 0x882, offset 0x22080 + 0x22086: 0x6c3e7820, 0x22087: 0x6c002820, + 0x2208a: 0x6d079e20, + 0x2208c: 0x6c427e20, 0x2208d: 0x6c013220, + 0x22092: 0x6c603620, + 0x22098: 0x6cafea20, 0x22099: 0x6d352820, + 0x2209c: 0x6caac020, + 0x220bf: 0x6cacbc20, + // Block 0x883, offset 0x220c0 + 0x220c1: 0x6d14f620, + 0x220c4: 0x6c6ac820, 0x220c6: 0x6d3e3820, + 0x220c8: 0x6c644420, 0x220c9: 0x6cec6420, + 0x220cc: 0x6c644620, + 0x220df: 0x6c15c020, + 0x220e1: 0x6cdd7420, 0x220e2: 0x6cdd7620, 0x220e3: 0x6c605020, + 0x220e4: 0x6cd96420, 0x220e6: 0x6ce2f420, 0x220e7: 0x6caf7420, + 0x220e8: 0x6cb32c20, + 0x220ee: 0x6c9d5a20, + 0x220f4: 0x6d12fc20, 0x220f6: 0x6cbe1c20, 0x220f7: 0x6c6d1620, + 0x220fa: 0x6c73ae20, + 0x220fd: 0x6d24f420, 0x220fe: 0x6cc83e20, + // Block 0x884, offset 0x22100 + 0x22114: 0x6c04fa20, + 0x22130: 0x6c0d3a20, + 0x22134: 0x6cf0ae20, 0x22135: 0x6d2a8820, 0x22136: 0x6cbcd020, 0x22137: 0x6cd9ce20, + 0x22138: 0x6c91ca20, + 0x2213c: 0x6c2ecc20, 0x2213d: 0x6c1fb820, 0x2213e: 0x6c09f620, 0x2213f: 0x6d3a1a20, + // Block 0x885, offset 0x22140 + 0x22140: 0x6c966220, 0x22141: 0x6c3aba20, 0x22142: 0x6cb1cc20, 0x22143: 0x6d1b6620, + 0x22144: 0x6d08a220, 0x22146: 0x6c02e020, 0x22147: 0x6d3d7820, + 0x22148: 0x6d40c820, 0x2214b: 0x6c08ea20, + 0x22151: 0x6c812620, 0x22153: 0x6ce40820, + 0x22159: 0x6ce5c820, 0x2215a: 0x6c64c820, + 0x2215f: 0x6ce7c020, + 0x2217d: 0x6c343420, 0x2217e: 0x6c308420, + // Block 0x886, offset 0x22180 + 0x22182: 0x6c0b4220, + 0x221a0: 0x6d36b020, 0x221a2: 0x6c3b8a20, + 0x221a6: 0x6c776a20, 0x221a7: 0x6d36b220, + 0x221a8: 0x6d2cfc20, 0x221a9: 0x6c0a1e20, 0x221aa: 0x6c7b6e20, + 0x221ac: 0x6c050220, 0x221ad: 0x6c73b820, 0x221ae: 0x6cc13420, + 0x221b0: 0x6cb51e20, 0x221b1: 0x6c824e20, 0x221b2: 0x6d00da20, 0x221b3: 0x6ce0ca20, + 0x221bc: 0x6cd9d420, 0x221be: 0x6c075020, + // Block 0x887, offset 0x221c0 + 0x221c7: 0x6d106820, + 0x221c8: 0x6c65ce20, + 0x221e5: 0x6d2a8a20, + // Block 0x888, offset 0x22200 + 0x22200: 0x6d3b6a20, 0x22203: 0x6c38b820, + 0x22205: 0x6ccf2420, 0x22207: 0x6cbf5e20, + 0x22209: 0x6cb3a020, 0x2220b: 0x6ce60220, + 0x2220c: 0x6ccc1a20, 0x2220d: 0x6d28c820, + 0x22211: 0x6ca7ac20, 0x22212: 0x6c48fa20, 0x22213: 0x6c250a20, + 0x22221: 0x6cbc5e20, 0x22223: 0x6c2ee420, + 0x22233: 0x6cb1ee20, + 0x22234: 0x6c226a20, 0x22236: 0x6c058e20, + // Block 0x889, offset 0x22240 + 0x2224d: 0x6d1b8a20, + 0x22251: 0x6cfc3020, + 0x22254: 0x6d161820, 0x22255: 0x6c9e9e20, 0x22256: 0x6c32b220, 0x22257: 0x6d395620, + 0x22259: 0x6c798c20, + 0x22262: 0x6d2ee020, + 0x22276: 0x6c8eb820, + 0x22278: 0x6d355820, 0x22279: 0x6c15ee20, 0x2227a: 0x6c31ca20, 0x2227b: 0x6d25c020, + 0x2227e: 0x6cddd220, 0x2227f: 0x6c6b5820, + // Block 0x88a, offset 0x22280 + 0x22280: 0x6c86c820, 0x22281: 0x6c460420, + 0x2228c: 0x6c054220, + 0x22297: 0x6c4c9220, + 0x22298: 0x6c8a3420, 0x22299: 0x6cd08220, + 0x222a3: 0x6ca7c020, + 0x222a5: 0x6c24bc20, 0x222a6: 0x6cf04c20, + 0x222a8: 0x6cead620, 0x222ab: 0x6cda6020, + 0x222ad: 0x6c8fc420, + 0x222b3: 0x6cff3820, + 0x222b4: 0x6d0df820, + // Block 0x88b, offset 0x222c0 + 0x222c3: 0x6cbebe20, + 0x222cd: 0x6cf73020, 0x222cf: 0x6d21e220, + 0x222d1: 0x6d337220, 0x222d2: 0x6d027420, 0x222d3: 0x6c146e20, + 0x222d4: 0x6c3c0020, 0x222d6: 0x6c4c9c20, + 0x222d8: 0x6c6e3e20, 0x222d9: 0x6c808220, 0x222da: 0x6cfafe20, + 0x222dd: 0x6c8d8e20, + 0x222ee: 0x6c830020, + 0x222f2: 0x6c760220, 0x222f3: 0x6d002a20, + 0x222fc: 0x6d28d820, + // Block 0x88c, offset 0x22300 + 0x22304: 0x6c493e20, 0x22305: 0x6cbd0820, 0x22306: 0x6c963e20, 0x22307: 0x6d124a20, + 0x22308: 0x6c945620, 0x22309: 0x6cdeee20, + 0x22311: 0x6c964020, + 0x2231e: 0x6c03a420, 0x2231f: 0x6c165420, + 0x22321: 0x6d3dec20, + 0x2232b: 0x6ce5d020, + 0x2232f: 0x6cecaa20, + 0x22330: 0x6c8dd420, + 0x22334: 0x6d24aa20, 0x22335: 0x6cb72c20, 0x22337: 0x6cb58020, + 0x2233c: 0x6c619420, 0x2233d: 0x6c0eb620, 0x2233f: 0x6cd1a420, + // Block 0x88d, offset 0x22340 + 0x22340: 0x6c3f4a20, 0x22342: 0x6c4a4620, + 0x22345: 0x6c2d0e20, 0x22347: 0x6c4fa420, + 0x22349: 0x6c411220, 0x2234b: 0x6cb5c820, + 0x22353: 0x6c19fe20, + 0x22354: 0x6c5bc220, 0x22357: 0x6cf9cc20, + 0x22358: 0x6cd27020, 0x22359: 0x6d365820, 0x2235a: 0x6cb61420, + 0x2235c: 0x6c4d7420, 0x2235f: 0x6c692c20, + 0x22360: 0x6c867620, 0x22362: 0x6c8a7820, + 0x22364: 0x6cbba620, + 0x22368: 0x6cc99c20, 0x2236a: 0x6cb55220, 0x2236b: 0x6cd19620, + 0x2236e: 0x6c6a7220, + 0x22375: 0x6c06e420, 0x22376: 0x6c0aec20, 0x22377: 0x6c032420, + 0x22378: 0x6c755c20, 0x22379: 0x6caf3a20, + 0x2237c: 0x6c282220, 0x2237f: 0x6ce0e620, + // Block 0x88e, offset 0x22380 + 0x22380: 0x6c7cca20, 0x22381: 0x6c7a2820, 0x22383: 0x6c79d020, + 0x22389: 0x6cd1a620, 0x2238a: 0x6cd1a820, 0x2238b: 0x6c5e9a20, + 0x2238c: 0x6c063620, + 0x22390: 0x6c785a20, 0x22391: 0x6c7b9020, + 0x22396: 0x6c9f9c20, + 0x22399: 0x6c89e020, 0x2239a: 0x6c35f220, 0x2239b: 0x6c43d820, + 0x2239f: 0x6cee0420, + 0x223a0: 0x6c344020, 0x223a3: 0x6cb85220, + 0x223a4: 0x6c573220, 0x223a6: 0x6c539e20, + 0x223a9: 0x6cae5e20, 0x223ab: 0x6c698c20, + 0x223b0: 0x6cc0f020, 0x223b1: 0x6d3f3c20, 0x223b2: 0x6d391820, 0x223b3: 0x6c7b9620, + 0x223b5: 0x6ccbd820, 0x223b7: 0x6c61cc20, + 0x223b8: 0x6cee6c20, 0x223b9: 0x6cb40820, 0x223ba: 0x6d090620, + 0x223bc: 0x6cce6620, + // Block 0x88f, offset 0x223c0 + 0x223c2: 0x6c80b620, 0x223c3: 0x6d351620, + 0x223c4: 0x6ce6c620, 0x223c7: 0x6c26f020, + 0x223d5: 0x6d0faa20, 0x223d6: 0x6c6d0020, 0x223d7: 0x6d351820, + 0x223da: 0x6d3d5a20, + 0x223dc: 0x6d28b420, 0x223dd: 0x6c14f220, + 0x223e2: 0x6c998020, + 0x223e6: 0x6c797820, 0x223e7: 0x6d388420, + 0x223e8: 0x6c54ca20, 0x223e9: 0x6cae7220, + 0x223ed: 0x6c6ffc20, + 0x223f8: 0x6c21bc20, 0x223f9: 0x6c9fae20, + 0x223fe: 0x6cffec20, + // Block 0x890, offset 0x22400 + 0x22400: 0x6c322220, 0x22401: 0x6cef1820, 0x22403: 0x6c119a20, + 0x22404: 0x6d214a20, 0x22405: 0x6c326220, 0x22406: 0x6c763620, 0x22407: 0x6cb0a220, + 0x2240a: 0x6c1a1a20, + 0x2240e: 0x6c218020, + 0x22410: 0x6cceb420, 0x22411: 0x6d0d9e20, 0x22412: 0x6c7b2820, + 0x22414: 0x6d265020, + 0x22426: 0x6cb61620, 0x22427: 0x6d32e020, + 0x22429: 0x6c78c220, 0x2242a: 0x6cb61820, 0x2242b: 0x6d354020, + 0x2242c: 0x6c928420, + 0x22431: 0x6caf7c20, 0x22432: 0x6cab0420, 0x22433: 0x6cad7c20, + 0x2243a: 0x6c3a6020, + 0x2243f: 0x6cf19c20, + // Block 0x891, offset 0x22440 + 0x22442: 0x6c9b2c20, + 0x22448: 0x6ccd5620, + 0x2244c: 0x6d04a020, 0x2244e: 0x6c351020, 0x2244f: 0x6c0c9220, + 0x2245a: 0x6d1eb020, + 0x2245c: 0x6c97f620, 0x2245e: 0x6c8a7a20, + 0x22461: 0x6d00ea20, 0x22462: 0x6c949c20, 0x22463: 0x6cbba820, + 0x22464: 0x6c2ae620, 0x22466: 0x6c1a3e20, 0x22467: 0x6c1a4020, + 0x2246d: 0x6c21d820, + 0x22478: 0x6c131420, + // Block 0x892, offset 0x22480 + 0x22480: 0x6c825e20, 0x22481: 0x6d2e1c20, 0x22482: 0x6c853620, 0x22483: 0x6c885e20, + 0x22484: 0x6cc45820, + 0x2248d: 0x6c18ee20, 0x2248f: 0x6c1a4820, + 0x22490: 0x6c473c20, 0x22492: 0x6d403a20, 0x22493: 0x6c1df420, + 0x22494: 0x6c204420, + 0x2249c: 0x6c835220, 0x2249d: 0x6cd7a820, 0x2249e: 0x6c941020, + 0x224a3: 0x6c3f2420, + 0x224a5: 0x6c871620, 0x224a7: 0x6cca6020, + 0x224ab: 0x6cca0c20, + 0x224af: 0x6cc9b220, + 0x224b3: 0x6ca8b020, + 0x224b6: 0x6d413c20, 0x224b7: 0x6c855020, + 0x224bb: 0x6cd58c20, + 0x224be: 0x6c3f2a20, + // Block 0x893, offset 0x224c0 + 0x224c9: 0x6c094620, + 0x224cd: 0x6c2a0820, + 0x224d2: 0x6cd1b220, + 0x224d6: 0x6c422020, 0x224d7: 0x6ce09e20, + 0x224dc: 0x6c97f820, 0x224df: 0x6c842820, + 0x224e2: 0x6c0a4c20, + 0x224e6: 0x6cac7e20, + 0x224e8: 0x6d1eca20, + 0x224ed: 0x6c6f5020, 0x224ef: 0x6c4c1220, + 0x224f0: 0x6c89dc20, 0x224f3: 0x6cf2de20, + 0x224f4: 0x6cb85420, 0x224f5: 0x6c30e820, 0x224f7: 0x6c8afa20, + 0x224f9: 0x6c68e020, 0x224fb: 0x6c8afc20, + // Block 0x894, offset 0x22500 + 0x22501: 0x6ce56020, + 0x22504: 0x6c4c2620, 0x22506: 0x6cacde20, 0x22507: 0x6cbb8e20, + 0x22509: 0x6c2b8a20, 0x2250a: 0x6d284420, + 0x22512: 0x6c821420, + 0x22516: 0x6cd7cc20, 0x22517: 0x6d02b020, + 0x2251c: 0x6d02c420, 0x2251d: 0x6cfe2620, 0x2251e: 0x6c95ac20, + 0x22524: 0x6c07e820, 0x22525: 0x6ce55a20, + 0x2252c: 0x6cffee20, 0x2252e: 0x6c30b420, + 0x22533: 0x6c296e20, + 0x22534: 0x6ce67c20, 0x22535: 0x6d3bcc20, + 0x2253b: 0x6cab4620, + 0x2253d: 0x6cf30e20, + // Block 0x895, offset 0x22540 + 0x22544: 0x6d02ee20, 0x22545: 0x6cc87a20, + 0x22548: 0x6d3dae20, 0x22549: 0x6c299020, + 0x2254d: 0x6c257420, + 0x22551: 0x6d3dc820, + 0x22557: 0x6c238620, + 0x22558: 0x6c159220, + 0x2255d: 0x6d100820, + 0x22567: 0x6d0d5e20, + 0x22573: 0x6d0d6820, + 0x22575: 0x6d323620, + 0x2257d: 0x6caade20, 0x2257e: 0x6d0e7220, + // Block 0x896, offset 0x22580 + 0x22585: 0x6c39d820, + 0x22589: 0x6d0da020, 0x2258a: 0x6d214e20, + 0x2258d: 0x6ce34020, 0x2258e: 0x6c401a20, 0x2258f: 0x6c07a020, + 0x22591: 0x6d0db220, 0x22593: 0x6c5ad220, + 0x22599: 0x6c5a6220, + 0x2259c: 0x6c4b7420, 0x2259d: 0x6d0ece20, 0x2259f: 0x6c55da20, + 0x225a0: 0x6c0c3620, + 0x225a7: 0x6cdcc420, + 0x225ae: 0x6d3f3020, 0x225af: 0x6c618620, + 0x225b0: 0x6c35ae20, 0x225b1: 0x6c61ce20, 0x225b2: 0x6c7ccc20, + 0x225b4: 0x6c89b620, + 0x225b8: 0x6c5dda20, 0x225ba: 0x6cef3a20, 0x225bb: 0x6d3cea20, + 0x225bf: 0x6ce6ae20, + // Block 0x897, offset 0x225c0 + 0x225c3: 0x6d290e20, + 0x225c4: 0x6d201020, + 0x225c9: 0x6cc5c020, + 0x225cd: 0x6c9e4e20, + 0x225da: 0x6ca31020, + 0x225dd: 0x6ce84220, 0x225df: 0x6c27be20, + 0x225e1: 0x6c73ec20, + 0x225e4: 0x6d056e20, 0x225e5: 0x6c2b1820, + 0x225f0: 0x6cfe1a20, + 0x225f7: 0x6d048a20, + 0x225fa: 0x6d1fac20, 0x225fb: 0x6c489620, + 0x225fe: 0x6cf5a420, + // Block 0x898, offset 0x22600 + 0x22608: 0x6c51bc20, + 0x2260d: 0x6c2f6c20, + 0x22610: 0x6c914020, 0x22612: 0x6d061a20, + 0x22614: 0x6d391a20, 0x22615: 0x6cfca820, 0x22616: 0x6c598820, 0x22617: 0x6c138c20, + 0x22618: 0x6cd2c420, 0x22619: 0x6c421820, 0x2261a: 0x6caadc20, 0x2261b: 0x6c01aa20, + 0x2261f: 0x6d003c20, + 0x22627: 0x6c502c20, + 0x22632: 0x6cbd2a20, 0x22633: 0x6c450620, + 0x22634: 0x6ccce020, 0x22635: 0x6c3e4c20, + 0x2263d: 0x6d2b4c20, + // Block 0x899, offset 0x22640 + 0x22647: 0x6c287c20, + 0x22656: 0x6c2d1420, 0x22657: 0x6ccfdc20, + 0x22659: 0x6d411820, + 0x22662: 0x6c0ca620, + 0x22666: 0x6c20d020, 0x22667: 0x6d30f820, + 0x22668: 0x6c276e20, 0x2266b: 0x6cf2b620, + 0x2266c: 0x6cbf2420, + 0x22670: 0x6c8bb420, 0x22672: 0x6c5cc820, 0x22673: 0x6c5ed020, + // Block 0x89a, offset 0x22680 + 0x22685: 0x6c127620, + 0x2268a: 0x6ca28620, + 0x2268d: 0x6c2ea820, 0x2268e: 0x6cf09620, + 0x226a0: 0x6c0b9a20, 0x226a1: 0x6ce3c020, + 0x226a5: 0x6ce8be20, + 0x226b6: 0x6c453620, + // Block 0x89b, offset 0x226c0 + 0x226c4: 0x6c1b3220, 0x226c5: 0x6c23ee20, 0x226c6: 0x6ce3c420, + 0x226d2: 0x6c5de620, 0x226d3: 0x6cb50e20, + 0x226d4: 0x6ccab820, 0x226d5: 0x6ccaa020, 0x226d6: 0x6d085220, 0x226d7: 0x6c021c20, + 0x226d8: 0x6ca3ce20, 0x226da: 0x6d0fd020, 0x226db: 0x6cd4f420, + 0x226dc: 0x6ccc0620, + 0x226e1: 0x6ce6d620, + 0x226e9: 0x6d0bc420, 0x226ea: 0x6c5a5820, + 0x226ee: 0x6c0d4220, + 0x226fe: 0x6caba020, 0x226ff: 0x6c128820, + // Block 0x89c, offset 0x22700 + 0x22701: 0x6c026a20, 0x22703: 0x6c99ae20, + 0x22714: 0x6c9b3620, 0x22716: 0x6ce47220, + 0x2271d: 0x6ccaa220, 0x2271e: 0x6d073a20, 0x2271f: 0x6c771020, + 0x22727: 0x6c811020, + 0x22736: 0x6c0cc020, 0x22737: 0x6c23b220, + 0x2273a: 0x6cfb8e20, + // Block 0x89d, offset 0x22740 + 0x22744: 0x6cea2a20, + 0x22749: 0x6d240a20, 0x2274a: 0x6c28c220, 0x2274b: 0x6d1d5420, + 0x2274d: 0x6d2f7820, 0x2274f: 0x6cb4b620, + 0x22758: 0x6c5c4e20, + 0x2275e: 0x6c00ea20, 0x2275f: 0x6ca0b220, + 0x22762: 0x6c6dde20, 0x22763: 0x6c7fce20, + 0x22772: 0x6c8b5820, 0x22773: 0x6cb1a420, + 0x22775: 0x6c0fa420, 0x22776: 0x6cbf8220, + 0x22779: 0x6c0aa220, + 0x2277f: 0x6d1dd420, + // Block 0x89e, offset 0x22780 + 0x22785: 0x6c871820, + 0x2278d: 0x6ca8b220, 0x2278f: 0x6c2a8820, + 0x22793: 0x6c584620, + 0x22797: 0x6d272420, + 0x2279a: 0x6c212c20, + 0x2279c: 0x6c87b020, 0x2279e: 0x6d2ef420, 0x2279f: 0x6c8dd620, + 0x227a0: 0x6c217020, + 0x227a7: 0x6c12d220, + 0x227a8: 0x6d09ea20, + 0x227ac: 0x6c71ac20, 0x227ad: 0x6c5cac20, + 0x227be: 0x6ce6f820, + // Block 0x89f, offset 0x227c0 + 0x227c6: 0x6ca91220, 0x227c7: 0x6c727a20, + 0x227cf: 0x6c144c20, + 0x227d6: 0x6d2a2e20, + 0x227db: 0x6d24a020, + 0x227df: 0x6c78f420, + 0x227e6: 0x6c7bea20, 0x227e7: 0x6c3a4a20, + 0x227ef: 0x6d282620, + 0x227f0: 0x6cb9fc20, + 0x227f4: 0x6cc2dc20, + 0x227f8: 0x6cb38a20, 0x227fa: 0x6cadf620, + // Block 0x8a0, offset 0x22800 + 0x22804: 0x6c453820, 0x22805: 0x6d17e420, 0x22806: 0x6c961020, + 0x22811: 0x6c7b5a20, 0x22813: 0x6d085420, + 0x22814: 0x6ca76e20, + 0x2281a: 0x6c55ac20, 0x2281b: 0x6c715820, + 0x22829: 0x6d136a20, + 0x2282e: 0x6cf73420, + 0x22831: 0x6d271c20, 0x22832: 0x6ce19020, 0x22833: 0x6cb23e20, + 0x22834: 0x6c33c820, 0x22835: 0x6c06d420, + 0x22838: 0x6c8a6020, + // Block 0x8a1, offset 0x22840 + 0x22840: 0x6d1e0e20, + 0x2284e: 0x6d0acc20, + 0x22851: 0x6c68bc20, + 0x22854: 0x6c7dcc20, 0x22856: 0x6d321820, 0x22857: 0x6cd59c20, + 0x2285a: 0x6cd24820, + 0x2285e: 0x6d1efa20, 0x2285f: 0x6cac1a20, + 0x22860: 0x6cff6e20, 0x22861: 0x6c5fe020, + 0x22876: 0x6cb4d220, 0x22877: 0x6c50c620, + 0x2287a: 0x6c799620, + // Block 0x8a2, offset 0x22880 + 0x22882: 0x6d12d020, 0x22883: 0x6c1bf020, + 0x2288a: 0x6c77a220, 0x2288b: 0x6d269020, + 0x2288e: 0x6cec1a20, 0x2288f: 0x6ca71820, + 0x22891: 0x6c222e20, 0x22893: 0x6d14a020, + 0x228a4: 0x6c704620, + 0x228ab: 0x6d0f4e20, + 0x228ac: 0x6c83a620, 0x228ae: 0x6c270a20, 0x228af: 0x6c1d0c20, + 0x228b5: 0x6d14c620, + 0x228ba: 0x6c4e9a20, + 0x228bf: 0x6d13de20, + // Block 0x8a3, offset 0x228c0 + 0x228c1: 0x6c1d4a20, 0x228c2: 0x6c568020, 0x228c3: 0x6d3b6220, + 0x228e6: 0x6cbf0a20, 0x228e7: 0x6c34de20, + 0x228f8: 0x6ce73220, 0x228f9: 0x6cfa9020, + 0x228ff: 0x6c3e5020, + // Block 0x8a4, offset 0x22900 + 0x22902: 0x6c2d5020, 0x22903: 0x6cf77820, + 0x22904: 0x6d003e20, 0x22905: 0x6d323820, 0x22906: 0x6cbc3e20, 0x22907: 0x6ce85620, + 0x22937: 0x6c4eb020, + 0x22938: 0x6c7bf220, 0x22939: 0x6cdd1a20, 0x2293b: 0x6cd46220, + 0x2293c: 0x6ce58020, + // Block 0x8a5, offset 0x22940 + 0x22940: 0x6d315020, 0x22943: 0x6ca58c20, + 0x22945: 0x6cba0a20, 0x22946: 0x6d1a6620, + 0x22948: 0x6c899220, 0x22949: 0x6ccc5420, 0x2294a: 0x6d3f4c20, 0x2294b: 0x6cafec20, + 0x2294c: 0x6c42c620, 0x2294f: 0x6c6d0a20, + 0x22950: 0x6d1f3620, 0x22952: 0x6ccd8c20, + 0x22954: 0x6c9d4620, 0x22955: 0x6cab9c20, 0x22957: 0x6c54cc20, + 0x2295b: 0x6d204620, + 0x2295d: 0x6c9bd420, + // Block 0x8a6, offset 0x22980 + 0x22990: 0x6d352a20, 0x22993: 0x6c08e020, + 0x22997: 0x6ccfe820, + 0x22998: 0x6cb79420, 0x22999: 0x6cfaa620, 0x2299a: 0x6cac5820, 0x2299b: 0x6c776e20, + 0x229ab: 0x6cd68620, + 0x229ac: 0x6cafee20, 0x229ae: 0x6d290220, 0x229af: 0x6d3a6c20, + 0x229b1: 0x6cd9c020, 0x229b2: 0x6c6f1820, + 0x229b5: 0x6c150020, 0x229b6: 0x6c38a420, 0x229b7: 0x6cff8e20, + 0x229b8: 0x6d1aec20, 0x229b9: 0x6c540e20, 0x229ba: 0x6c999220, 0x229bb: 0x6ce8c020, + 0x229bd: 0x6c621820, + // Block 0x8a7, offset 0x229c0 + 0x229c1: 0x6d151c20, 0x229c3: 0x6d236c20, + 0x229c4: 0x6c6ee020, 0x229c5: 0x6cad9220, 0x229c7: 0x6cfed820, + 0x229c9: 0x6c468c20, + 0x229cc: 0x6c465020, 0x229cd: 0x6cdcf220, 0x229ce: 0x6cfc1620, 0x229cf: 0x6d3baa20, + 0x229fe: 0x6c1dba20, + // Block 0x8a8, offset 0x22a00 + 0x22a04: 0x6cbb7e20, 0x22a05: 0x6ce34220, 0x22a06: 0x6d27b020, + 0x22a09: 0x6cccec20, 0x22a0a: 0x6c8b1420, + 0x22a0c: 0x6d353620, + 0x22a10: 0x6cabf220, + 0x22a23: 0x6c712e20, + 0x22a24: 0x6c7f1220, + 0x22a28: 0x6d3f1820, 0x22a2a: 0x6cc1a420, 0x22a2b: 0x6c47b020, + 0x22a2c: 0x6c747a20, 0x22a2d: 0x6d348220, 0x22a2e: 0x6c021e20, 0x22a2f: 0x6cbe2020, + 0x22a30: 0x6cb00620, 0x22a31: 0x6d417820, 0x22a33: 0x6cb9b020, + 0x22a35: 0x6c25e620, 0x22a37: 0x6c606620, + 0x22a38: 0x6ce35220, 0x22a39: 0x6cc7b620, 0x22a3b: 0x6c4d4220, + 0x22a3c: 0x6d0a2620, 0x22a3e: 0x6c073c20, 0x22a3f: 0x6d348420, + // Block 0x8a9, offset 0x22a40 + 0x22a41: 0x6c340020, + 0x22a4b: 0x6c293220, + 0x22a50: 0x6cc62e20, + 0x22a72: 0x6c41a820, + 0x22a75: 0x6c42ae20, 0x22a76: 0x6cde7220, + 0x22a78: 0x6cebae20, 0x22a79: 0x6d105e20, 0x22a7a: 0x6c7a4e20, 0x22a7b: 0x6d368c20, + // Block 0x8aa, offset 0x22a80 + 0x22a96: 0x6c64d020, 0x22a97: 0x6ca6be20, + 0x22a98: 0x6cd00e20, 0x22a99: 0x6c058620, 0x22a9a: 0x6cd66e20, 0x22a9b: 0x6c30c020, + 0x22a9d: 0x6cb91420, 0x22a9e: 0x6c4e2820, 0x22a9f: 0x6cb83020, + 0x22aa0: 0x6c41e420, 0x22aa3: 0x6c215a20, + 0x22aa4: 0x6c13fe20, 0x22aa5: 0x6c0a2620, 0x22aa6: 0x6d140c20, 0x22aa7: 0x6c3d9020, + 0x22aa8: 0x6c35b820, 0x22aaa: 0x6c816c20, 0x22aab: 0x6c4fe020, + 0x22aac: 0x6c842a20, + 0x22ab1: 0x6ce28020, 0x22ab2: 0x6cd01020, + 0x22ab4: 0x6d1a9020, 0x22ab7: 0x6c64d220, + 0x22abb: 0x6c140020, + // Block 0x8ab, offset 0x22ac0 + 0x22ad7: 0x6ca86020, + 0x22ad8: 0x6c23f620, 0x22adb: 0x6d154620, + 0x22adf: 0x6ce12220, + 0x22ae2: 0x6c738820, + 0x22af0: 0x6c1c5820, 0x22af1: 0x6c468e20, + 0x22af4: 0x6c6b1a20, 0x22af5: 0x6d307c20, 0x22af6: 0x6c559220, 0x22af7: 0x6c987220, + 0x22afb: 0x6d406220, + 0x22afc: 0x6cd8e820, 0x22aff: 0x6c3ad020, + // Block 0x8ac, offset 0x22b00 + 0x22b00: 0x6d3e8620, 0x22b01: 0x6d3e8820, 0x22b03: 0x6c6b3420, + 0x22b04: 0x6cd82820, 0x22b06: 0x6c211620, 0x22b07: 0x6cad9820, + 0x22b0b: 0x6d128e20, + 0x22b0c: 0x6c2b4420, 0x22b0e: 0x6c825820, 0x22b0f: 0x6d05e420, + 0x22b10: 0x6cc7c820, 0x22b12: 0x6cabde20, 0x22b13: 0x6c738e20, + 0x22b14: 0x6cf8dc20, 0x22b15: 0x6d133e20, 0x22b16: 0x6c014c20, + 0x22b18: 0x6d189420, 0x22b19: 0x6c64f420, + 0x22b1c: 0x6cd93820, 0x22b1d: 0x6cf2c420, 0x22b1f: 0x6ccb5820, + 0x22b20: 0x6d355020, 0x22b21: 0x6c088e20, 0x22b22: 0x6d3be220, + 0x22b26: 0x6c67fa20, 0x22b27: 0x6c506820, + 0x22b29: 0x6c1c6c20, 0x22b2a: 0x6c340820, + // Block 0x8ad, offset 0x22b40 + 0x22b53: 0x6c0f5820, + 0x22b54: 0x6c60a820, 0x22b55: 0x6c1fb020, 0x22b57: 0x6c962620, + 0x22b5a: 0x6cc8b220, + 0x22b6b: 0x6c55b020, + 0x22b71: 0x6c28c420, + 0x22b74: 0x6c4e6420, 0x22b75: 0x6cc3fe20, 0x22b76: 0x6ccc1e20, 0x22b77: 0x6d2e1e20, + 0x22b78: 0x6d2b0e20, 0x22b79: 0x6c201220, 0x22b7a: 0x6cb53620, 0x22b7b: 0x6c2ef020, + 0x22b7d: 0x6d2ce220, 0x22b7e: 0x6ce83220, + // Block 0x8ae, offset 0x22b80 + 0x22b81: 0x6c221220, 0x22b82: 0x6cc99e20, + 0x22b84: 0x6c955620, 0x22b87: 0x6c60be20, + 0x22ba2: 0x6c95c220, 0x22ba3: 0x6cbdb220, + 0x22ba7: 0x6cbf6c20, + 0x22ba8: 0x6c739420, + 0x22bac: 0x6c00e020, 0x22bad: 0x6c65e220, + 0x22bb9: 0x6ce42a20, 0x22bba: 0x6cf1b620, + 0x22bbd: 0x6cbbb620, + // Block 0x8af, offset 0x22bc0 + 0x22bc1: 0x6cac0820, 0x22bc2: 0x6c5d0620, + 0x22bc5: 0x6c00ec20, 0x22bc7: 0x6cd7a220, + 0x22bc8: 0x6c887220, 0x22bc9: 0x6c337420, 0x22bcb: 0x6cdebc20, + 0x22bcc: 0x6c6cbe20, 0x22bcd: 0x6c0a8a20, 0x22bce: 0x6d0de820, 0x22bcf: 0x6c435a20, + 0x22bd0: 0x6cb18820, 0x22bd1: 0x6d242c20, 0x22bd2: 0x6ccf7c20, + 0x22bd5: 0x6c651420, 0x22bd7: 0x6c55dc20, + 0x22bda: 0x6c8b4e20, + 0x22bdc: 0x6c0bce20, 0x22bdd: 0x6cdb4e20, 0x22bde: 0x6c689420, + 0x22bf8: 0x6d3cb820, + 0x22bfd: 0x6c4dc220, + // Block 0x8b0, offset 0x22c00 + 0x22c07: 0x6c340e20, + 0x22c10: 0x6d014e20, 0x22c11: 0x6c9b8220, 0x22c12: 0x6c3db420, 0x22c13: 0x6c931a20, + 0x22c14: 0x6ce0b220, 0x22c17: 0x6c8ecc20, + 0x22c18: 0x6cfaee20, 0x22c19: 0x6cca9420, + 0x22c1c: 0x6c240220, 0x22c1d: 0x6d3c2620, 0x22c1f: 0x6c188e20, + 0x22c30: 0x6c892820, + 0x22c34: 0x6c848c20, + // Block 0x8b1, offset 0x22c40 + 0x22c40: 0x6caf1a20, 0x22c41: 0x6ceb9420, + 0x22c44: 0x6cebb820, 0x22c46: 0x6c8a4a20, 0x22c47: 0x6d002620, + 0x22c48: 0x6c20f620, 0x22c49: 0x6c581a20, 0x22c4a: 0x6ca7c220, 0x22c4b: 0x6cb94820, + 0x22c4c: 0x6c871c20, 0x22c4f: 0x6cad3e20, + 0x22c50: 0x6ce5b020, 0x22c51: 0x6c8ece20, 0x22c52: 0x6cf40a20, + 0x22c64: 0x6d1d2620, 0x22c66: 0x6d2c6820, + 0x22c70: 0x6d21ee20, 0x22c72: 0x6cfc5020, 0x22c73: 0x6d083820, + 0x22c74: 0x6cd68a20, 0x22c75: 0x6cf74220, + 0x22c78: 0x6c9a4220, 0x22c79: 0x6ccbb420, 0x22c7a: 0x6c893420, + 0x22c7c: 0x6c6f9020, 0x22c7d: 0x6c81ec20, + // Block 0x8b2, offset 0x22c80 + 0x22c8e: 0x6cff5020, 0x22c8f: 0x6d407420, + 0x22c9a: 0x6c8ee820, + 0x22c9c: 0x6d2ff020, 0x22c9e: 0x6d30c220, + 0x22ca0: 0x6c830820, + 0x22cad: 0x6c32b420, + 0x22cb7: 0x6c663420, + 0x22cb8: 0x6cd68c20, 0x22cb9: 0x6d425620, 0x22cba: 0x6cbd0c20, + 0x22cbc: 0x6c81ca20, + // Block 0x8b3, offset 0x22cc0 + 0x22cc9: 0x6d248420, 0x22cca: 0x6d196620, 0x22ccb: 0x6ca66e20, + 0x22cce: 0x6c134620, + 0x22cd5: 0x6d0f1a20, 0x22cd7: 0x6cc89020, + 0x22cde: 0x6d0d1c20, 0x22cdf: 0x6c2f1e20, + 0x22ce0: 0x6c9df620, + 0x22ce7: 0x6c82a420, + 0x22ce9: 0x6cecae20, + 0x22cf0: 0x6ca2fe20, + 0x22cf6: 0x6d0d2420, + 0x22cfa: 0x6c831c20, + 0x22cfd: 0x6ccc3020, 0x22cfe: 0x6c551620, + // Block 0x8b4, offset 0x22d00 + 0x22d01: 0x6cf58020, 0x22d02: 0x6cf58220, + 0x22d04: 0x6d1fa020, 0x22d05: 0x6c4d9220, 0x22d07: 0x6c4d0820, + 0x22d09: 0x6cebc820, 0x22d0a: 0x6d068220, 0x22d0b: 0x6caf3c20, + 0x22d0c: 0x6cdf8e20, 0x22d0d: 0x6cf58a20, 0x22d0e: 0x6cf58c20, 0x22d0f: 0x6c0d2420, + 0x22d10: 0x6cbd1a20, 0x22d11: 0x6cf58e20, 0x22d12: 0x6d20c420, 0x22d13: 0x6cf84a20, + 0x22d15: 0x6c22b620, 0x22d16: 0x6cba4020, 0x22d17: 0x6cf95420, + 0x22d1a: 0x6cec0620, 0x22d1b: 0x6c35f420, + 0x22d1c: 0x6d1fae20, 0x22d1d: 0x6d041a20, 0x22d1e: 0x6ca5c220, 0x22d1f: 0x6c4de420, + 0x22d20: 0x6c094a20, 0x22d21: 0x6cd0ec20, + 0x22d24: 0x6d2d6220, 0x22d25: 0x6c2d4420, 0x22d26: 0x6d222c20, + 0x22d28: 0x6cab7a20, 0x22d2a: 0x6c4ae820, 0x22d2b: 0x6cee0620, + 0x22d2c: 0x6cb8c620, 0x22d2d: 0x6d14c820, + 0x22d30: 0x6d40b020, 0x22d32: 0x6cb8c820, 0x22d33: 0x6c2f9c20, + 0x22d34: 0x6c793420, 0x22d36: 0x6c1f2620, 0x22d37: 0x6d13e020, + 0x22d3a: 0x6c4d9e20, 0x22d3b: 0x6c7b6420, + // Block 0x8b5, offset 0x22d40 + 0x22d48: 0x6c2d5820, 0x22d49: 0x6cf88a20, 0x22d4a: 0x6d3e3c20, 0x22d4b: 0x6c8d0420, + 0x22d4c: 0x6d3f4e20, 0x22d4e: 0x6d234420, 0x22d4f: 0x6c5ccc20, + 0x22d51: 0x6cd86e20, 0x22d52: 0x6c76d620, + 0x22d5a: 0x6c01c420, + 0x22d5c: 0x6d1fca20, 0x22d5d: 0x6c605420, 0x22d5e: 0x6c5d2c20, 0x22d5f: 0x6cb82e20, + 0x22d60: 0x6c541020, 0x22d61: 0x6c541220, 0x22d63: 0x6c2d5c20, + 0x22d69: 0x6d004c20, + 0x22d6d: 0x6ccf5620, 0x22d6e: 0x6ccc5c20, + 0x22d72: 0x6d00ca20, 0x22d73: 0x6d112220, + 0x22d74: 0x6c26f420, 0x22d76: 0x6d01d820, 0x22d77: 0x6c1ac620, + 0x22d78: 0x6d1fde20, 0x22d79: 0x6c50a220, 0x22d7a: 0x6ccc6220, + 0x22d7f: 0x6cdf2e20, + // Block 0x8b6, offset 0x22d80 + 0x22d81: 0x6d3a1c20, 0x22d83: 0x6c006c20, + 0x22d87: 0x6cc3e020, + 0x22d88: 0x6d2aea20, 0x22d8a: 0x6c7e4a20, 0x22d8b: 0x6c911620, + 0x22d8c: 0x6c1fc820, 0x22d8e: 0x6d1fe620, + 0x22d96: 0x6ce41020, + 0x22d98: 0x6cd1fa20, + 0x22da1: 0x6d000a20, 0x22da2: 0x6cf8ee20, + 0x22da8: 0x6c5e1220, 0x22da9: 0x6c1c8620, 0x22daa: 0x6d18e620, + 0x22daf: 0x6cd54420, + 0x22db0: 0x6d270020, 0x22db1: 0x6c155420, 0x22db2: 0x6c36da20, 0x22db3: 0x6cf73620, + 0x22db4: 0x6cf74420, 0x22db5: 0x6d1d2a20, 0x22db6: 0x6d410020, 0x22db7: 0x6d28a220, + 0x22dba: 0x6d28a820, + // Block 0x8b7, offset 0x22dc0 + 0x22dc2: 0x6cde2c20, 0x22dc3: 0x6ced7020, + 0x22dc7: 0x6d031e20, + 0x22dca: 0x6cee4820, 0x22dcb: 0x6c3f3820, + 0x22dd0: 0x6c91b620, + 0x22dde: 0x6c656820, + 0x22de1: 0x6d0c6620, 0x22de3: 0x6c094c20, + 0x22de4: 0x6c78fc20, 0x22de5: 0x6c497820, + 0x22de8: 0x6d3e1820, + 0x22dee: 0x6c7cce20, 0x22def: 0x6d38e020, + 0x22df0: 0x6d35be20, 0x22df3: 0x6ce8a420, + 0x22df7: 0x6cde4c20, + 0x22df9: 0x6c1f3e20, 0x22dfa: 0x6c196e20, 0x22dfb: 0x6c1a7420, + 0x22dfc: 0x6d3af420, 0x22dfe: 0x6c26f220, + // Block 0x8b8, offset 0x22e00 + 0x22e07: 0x6c09c620, + 0x22e09: 0x6c641c20, + 0x22e0c: 0x6d17e620, 0x22e0f: 0x6d26c420, + 0x22e10: 0x6c428a20, + 0x22e16: 0x6c41ae20, + 0x22e1c: 0x6cbbac20, + 0x22e20: 0x6c1eb020, 0x22e21: 0x6c1eb620, 0x22e22: 0x6c0a6a20, + 0x22e26: 0x6c4b8a20, + 0x22e29: 0x6c47e020, 0x22e2a: 0x6c0e0020, 0x22e2b: 0x6d1b9420, + 0x22e2c: 0x6d3cbc20, 0x22e2d: 0x6c47ec20, 0x22e2f: 0x6c876820, + 0x22e35: 0x6c35c420, 0x22e36: 0x6c271420, + 0x22e3c: 0x6c118620, + // Block 0x8b9, offset 0x22e40 + 0x22e42: 0x6ce3d420, 0x22e43: 0x6c323620, + 0x22e44: 0x6d168c20, + 0x22e48: 0x6c2e6020, 0x22e4a: 0x6ca97e20, + 0x22e4c: 0x6d094420, 0x22e4d: 0x6ca54a20, 0x22e4e: 0x6c4b3220, 0x22e4f: 0x6c779e20, + 0x22e52: 0x6c201a20, + 0x22e56: 0x6d2c2020, 0x22e57: 0x6d1efc20, + 0x22e59: 0x6c043420, 0x22e5a: 0x6cd24a20, 0x22e5b: 0x6c2d3e20, + 0x22e5c: 0x6cabb420, 0x22e5d: 0x6cc01620, + 0x22e61: 0x6d094820, 0x22e63: 0x6ca0e420, + 0x22e64: 0x6c77e020, 0x22e65: 0x6d1fb020, 0x22e66: 0x6c68d220, 0x22e67: 0x6c0ec620, + 0x22e6c: 0x6d052020, + 0x22e72: 0x6c9ce820, 0x22e73: 0x6c95f220, + 0x22e75: 0x6d094e20, 0x22e77: 0x6c34e220, + 0x22e79: 0x6c37c620, 0x22e7a: 0x6cccd820, + 0x22e7c: 0x6c7cee20, 0x22e7d: 0x6ca52c20, 0x22e7e: 0x6c9e1420, 0x22e7f: 0x6c85ce20, + // Block 0x8ba, offset 0x22e80 + 0x22e80: 0x6c949620, 0x22e82: 0x6c2e8420, + 0x22e84: 0x6cb85620, 0x22e85: 0x6c832a20, 0x22e87: 0x6c997020, + 0x22e89: 0x6c524c20, 0x22e8a: 0x6c181620, 0x22e8b: 0x6d35e620, + 0x22e8d: 0x6c477c20, 0x22e8e: 0x6c25b820, + 0x22e93: 0x6cf4de20, + 0x22e94: 0x6ce26420, 0x22e97: 0x6cf61220, + 0x22e98: 0x6d10a620, 0x22e99: 0x6cefc620, 0x22e9b: 0x6d40be20, + 0x22e9c: 0x6c96be20, 0x22e9d: 0x6d225a20, 0x22e9e: 0x6caf0820, 0x22e9f: 0x6d17a420, + 0x22ea0: 0x6cbe1620, 0x22ea1: 0x6d26b620, 0x22ea2: 0x6c754c20, 0x22ea3: 0x6c67e620, + 0x22ea4: 0x6d06d820, 0x22ea5: 0x6c07ea20, + 0x22eaa: 0x6c95b020, 0x22eab: 0x6d3c6020, + 0x22eb2: 0x6c326420, 0x22eb3: 0x6cfe4020, + 0x22eb6: 0x6c5be420, + 0x22eba: 0x6c479e20, 0x22ebb: 0x6c77b020, + 0x22ebe: 0x6d037c20, 0x22ebf: 0x6c5cf020, + // Block 0x8bb, offset 0x22ec0 + 0x22ec0: 0x6c0af820, + 0x22ec4: 0x6c78c420, 0x22ec5: 0x6c77b220, + 0x22ec8: 0x6c25e820, + 0x22ecf: 0x6c92a420, + 0x22ed1: 0x6d41c620, 0x22ed2: 0x6d2a2020, 0x22ed3: 0x6c692e20, + 0x22ed4: 0x6c49a020, + 0x22ed9: 0x6d0c2220, 0x22eda: 0x6c376620, + 0x22edc: 0x6cbe8820, 0x22edf: 0x6c2ae820, + 0x22ee0: 0x6cd8ea20, 0x22ee1: 0x6cdc7220, 0x22ee2: 0x6c8aa420, + 0x22ee7: 0x6ccdb020, + 0x22ee9: 0x6c0a6e20, 0x22eea: 0x6cf0e420, 0x22eeb: 0x6d136020, + 0x22eed: 0x6d2d5020, 0x22eef: 0x6d129420, + 0x22ef0: 0x6c2e4c20, 0x22ef1: 0x6c00ee20, + 0x22ef4: 0x6c680620, 0x22ef7: 0x6cda6220, + 0x22ef9: 0x6c581c20, 0x22efa: 0x6d246020, + 0x22efd: 0x6cc50a20, + // Block 0x8bc, offset 0x22f00 + 0x22f00: 0x6c2cfa20, 0x22f01: 0x6d413e20, 0x22f02: 0x6c047420, + 0x22f04: 0x6cbd5a20, 0x22f07: 0x6c633620, + 0x22f09: 0x6cafcc20, + 0x22f0c: 0x6ce7ec20, + 0x22f10: 0x6c1da220, + 0x22f15: 0x6c4af020, + 0x22f20: 0x6c5ee620, + 0x22f28: 0x6d096420, 0x22f2a: 0x6c2d6020, + 0x22f2d: 0x6c0bac20, 0x22f2e: 0x6d291c20, 0x22f2f: 0x6ce76820, + 0x22f36: 0x6ccd5820, + 0x22f38: 0x6c482620, 0x22f39: 0x6cc3ec20, + // Block 0x8bd, offset 0x22f40 + 0x22f40: 0x6c47cc20, + 0x22f48: 0x6c55b220, 0x22f49: 0x6c7b0420, + 0x22f4c: 0x6c46d820, 0x22f4e: 0x6cdb3220, + 0x22f50: 0x6c1df620, 0x22f52: 0x6c795c20, + 0x22f54: 0x6c317e20, + 0x22f59: 0x6d190a20, + 0x22f5c: 0x6c2a4220, 0x22f5d: 0x6cbaf820, + 0x22f63: 0x6c900220, + 0x22f65: 0x6c84cc20, 0x22f67: 0x6c87a020, + 0x22f68: 0x6cbe6420, 0x22f6a: 0x6ceed420, + 0x22f6c: 0x6ca1bc20, + 0x22f71: 0x6cb74420, 0x22f73: 0x6c67a020, + 0x22f74: 0x6d008c20, + 0x22f79: 0x6c277820, 0x22f7b: 0x6c90a420, + // Block 0x8be, offset 0x22f80 + 0x22f82: 0x6c497620, + 0x22f86: 0x6cadc820, + 0x22f89: 0x6cafce20, 0x22f8b: 0x6c735420, + 0x22f8d: 0x6c06aa20, 0x22f8e: 0x6c747c20, 0x22f8f: 0x6c738420, + 0x22f90: 0x6cd3b420, + 0x22f95: 0x6d014a20, + 0x22f98: 0x6cc8a820, 0x22f99: 0x6c6ec220, 0x22f9a: 0x6cb3be20, 0x22f9b: 0x6cc9f420, + 0x22fa0: 0x6c5e7a20, + 0x22fa9: 0x6c3b1820, 0x22faa: 0x6c06e820, 0x22fab: 0x6c6bc220, + 0x22fac: 0x6cc94020, 0x22fae: 0x6caf3e20, + 0x22fb4: 0x6c2c2220, 0x22fb5: 0x6c98c820, 0x22fb6: 0x6c03ec20, 0x22fb7: 0x6c03ee20, + 0x22fb8: 0x6ce57820, 0x22fb9: 0x6c8cba20, 0x22fba: 0x6cd0f020, 0x22fbb: 0x6d31c220, + 0x22fbc: 0x6caf4620, 0x22fbd: 0x6cf4c620, 0x22fbf: 0x6d2b4220, + // Block 0x8bf, offset 0x22fc0 + 0x22fc0: 0x6c063a20, + 0x22fc7: 0x6c938020, + 0x22fd6: 0x6c4fa020, 0x22fd7: 0x6c30e020, + 0x22fd8: 0x6c3e0e20, 0x22fd9: 0x6ca5c420, + 0x22fdd: 0x6c43de20, + 0x22fe0: 0x6cc79820, 0x22fe1: 0x6cfbfc20, + 0x22fe4: 0x6c096020, + 0x22fee: 0x6c98d220, + 0x22ff2: 0x6cc70a20, 0x22ff3: 0x6cc04c20, + 0x22ff7: 0x6c0ee820, + 0x22ff9: 0x6c4fa620, 0x22ffa: 0x6ca4ee20, 0x22ffb: 0x6d0c8620, + // Block 0x8c0, offset 0x23000 + 0x23003: 0x6cad5c20, + 0x23004: 0x6cdbc020, 0x23006: 0x6ceba220, + 0x23008: 0x6cc10a20, 0x23009: 0x6c83d620, 0x2300a: 0x6c2a7220, + 0x2300c: 0x6c6aca20, 0x2300d: 0x6c6acc20, 0x2300e: 0x6c4bc820, 0x2300f: 0x6c649c20, + 0x23010: 0x6c099e20, + 0x23020: 0x6cca5620, 0x23021: 0x6c053020, 0x23022: 0x6c214a20, + 0x23026: 0x6ca3c220, 0x23027: 0x6c054e20, + 0x2302a: 0x6cc68820, 0x2302b: 0x6c636c20, + 0x2302c: 0x6cd9c220, + 0x23030: 0x6c2a7420, + 0x2303e: 0x6cfaac20, 0x2303f: 0x6d2d8020, + // Block 0x8c1, offset 0x23040 + 0x23040: 0x6c999620, 0x23043: 0x6d3e5020, + 0x23045: 0x6c623c20, 0x23046: 0x6cb61c20, + 0x2304b: 0x6cc82420, + 0x2304c: 0x6cdd2c20, 0x2304d: 0x6cc71620, 0x2304e: 0x6cf50c20, 0x2304f: 0x6cc69620, + 0x23050: 0x6cc69820, + 0x2305a: 0x6cde7620, + 0x2305c: 0x6cd9d020, + 0x23064: 0x6c842c20, 0x23067: 0x6c24fc20, + 0x23068: 0x6d3fb020, 0x23069: 0x6c9ad220, 0x2306a: 0x6cf80820, + 0x2306c: 0x6c989e20, 0x2306d: 0x6ca86220, 0x2306f: 0x6cdbd220, + 0x23071: 0x6cadea20, + 0x23074: 0x6c0a2820, 0x23075: 0x6c2c9020, + 0x23078: 0x6cc1be20, 0x23079: 0x6cbbfa20, 0x2307b: 0x6c3b4420, + 0x2307c: 0x6cdb1620, + // Block 0x8c2, offset 0x23080 + 0x23083: 0x6d05e620, + 0x23087: 0x6cc72420, + 0x23088: 0x6c5f3220, 0x2308b: 0x6cc1d620, + 0x2308c: 0x6c8b3820, + 0x23095: 0x6ccafe20, + 0x23098: 0x6c7dd620, 0x2309a: 0x6c257620, 0x2309b: 0x6d136c20, + 0x2309c: 0x6c0e3220, 0x2309e: 0x6c6b5c20, + 0x230a0: 0x6cc1e020, 0x230a1: 0x6cc1e220, + 0x230a5: 0x6c9b6e20, 0x230a6: 0x6cc49020, + 0x230a8: 0x6c0d5e20, 0x230a9: 0x6c178220, + 0x230ac: 0x6c31d420, + 0x230b6: 0x6cc4ec20, 0x230b7: 0x6cfb0220, + 0x230ba: 0x6ce25220, 0x230bb: 0x6cc20a20, + 0x230bc: 0x6ca8b420, 0x230bf: 0x6cd51c20, + // Block 0x8c3, offset 0x230c0 + 0x230c0: 0x6c920220, 0x230c2: 0x6c7dda20, + 0x230c8: 0x6c9f3620, 0x230c9: 0x6c9f9e20, + 0x230cd: 0x6c287e20, + 0x230d0: 0x6d1b6820, 0x230d3: 0x6d001020, + 0x230d7: 0x6c618820, + 0x230dc: 0x6d19b220, + 0x230e6: 0x6c3b3820, 0x230e7: 0x6d383420, + 0x230eb: 0x6c47c020, + 0x230f1: 0x6c13c420, 0x230f3: 0x6c8e3c20, + 0x230f6: 0x6c102c20, + 0x230fa: 0x6cabae20, 0x230fb: 0x6cd87620, + 0x230fc: 0x6c29b820, 0x230fd: 0x6d31b020, + // Block 0x8c4, offset 0x23100 + 0x23100: 0x6cccb620, 0x23102: 0x6c1fbe20, + 0x23104: 0x6c6fa820, + 0x2310a: 0x6c787620, 0x2310b: 0x6c1af820, + 0x23111: 0x6c565c20, 0x23112: 0x6c858220, 0x23113: 0x6ccbc620, + 0x23116: 0x6cac1820, 0x23117: 0x6ceee220, + 0x23118: 0x6cf42620, + 0x2311c: 0x6d1c5420, + 0x23121: 0x6ccbc820, 0x23122: 0x6c2b1020, + 0x23125: 0x6c27b820, + 0x23131: 0x6ce83a20, 0x23132: 0x6c50ca20, 0x23133: 0x6cb34e20, + 0x23135: 0x6d34f620, 0x23136: 0x6ca98020, 0x23137: 0x6ca67e20, + 0x2313d: 0x6cc6f820, 0x2313e: 0x6c48ea20, + // Block 0x8c5, offset 0x23140 + 0x23140: 0x6d343e20, 0x23143: 0x6c5fe220, + 0x2315c: 0x6c392c20, 0x2315f: 0x6c6a8020, + 0x23160: 0x6c4d3820, + 0x23164: 0x6d2e4e20, 0x23166: 0x6cf86420, + 0x23169: 0x6d3e1220, + 0x2316c: 0x6cf76e20, 0x2316d: 0x6cb1ac20, + 0x23170: 0x6c078020, 0x23172: 0x6c657220, + // Block 0x8c6, offset 0x23180 + 0x23193: 0x6c665c20, + 0x23196: 0x6d28ae20, + 0x2319e: 0x6c07ac20, 0x2319f: 0x6c995e20, + 0x231a2: 0x6d2a7620, 0x231a3: 0x6d3c3820, + 0x231a5: 0x6c7bbe20, + 0x231a8: 0x6c089e20, 0x231aa: 0x6cac2220, + 0x231bc: 0x6c996020, 0x231bd: 0x6ce09020, + // Block 0x8c7, offset 0x231c0 + 0x231de: 0x6cea7a20, 0x231df: 0x6c95aa20, + 0x231e2: 0x6cdf9a20, + 0x231f1: 0x6c016a20, + 0x231f7: 0x6c4e0420, + 0x231f8: 0x6d3a0c20, 0x231fa: 0x6c34e820, 0x231fb: 0x6c34ea20, + 0x231fc: 0x6c421c20, + // Block 0x8c8, offset 0x23200 + 0x23206: 0x6cbf8c20, + 0x23208: 0x6cee1220, 0x2320a: 0x6ca10420, 0x2320b: 0x6d30f220, + 0x2320c: 0x6cf1d620, 0x2320d: 0x6d3c3a20, 0x2320f: 0x6c69fe20, + 0x23210: 0x6cad8e20, + 0x23218: 0x6cdaa820, + 0x2321d: 0x6c724020, + 0x23220: 0x6cb4ec20, 0x23221: 0x6c11f420, 0x23223: 0x6ce94a20, + 0x23224: 0x6ccbec20, 0x23226: 0x6ceb1620, + 0x23229: 0x6c579420, 0x2322b: 0x6d176220, + // Block 0x8c9, offset 0x23240 + 0x23260: 0x6c9f4820, 0x23261: 0x6d37b420, + 0x23265: 0x6cd77e20, + 0x23269: 0x6d176420, 0x2326a: 0x6cee1420, 0x2326b: 0x6c024220, + 0x23276: 0x6cda7820, + 0x2327e: 0x6c4b0020, 0x2327f: 0x6ceb8020, + // Block 0x8ca, offset 0x23280 + 0x23280: 0x6c5b5220, 0x23283: 0x6d06dc20, + 0x23284: 0x6d296c20, 0x23286: 0x6d3f1220, 0x23287: 0x6c0b9e20, + 0x23289: 0x6c26a620, 0x2328a: 0x6d19ca20, 0x2328b: 0x6cc35c20, + 0x2328e: 0x6c580e20, 0x2328f: 0x6ca2e020, + 0x23290: 0x6d28ba20, 0x23292: 0x6ce32620, + 0x23298: 0x6d14f820, 0x23299: 0x6cdfaa20, 0x2329a: 0x6ccf1820, 0x2329b: 0x6cd78220, + 0x2329d: 0x6d03e620, + 0x232a0: 0x6d1fce20, 0x232a3: 0x6c3b7620, + // Block 0x8cb, offset 0x232c0 + 0x232c7: 0x6c78b220, + 0x232cb: 0x6c3e7c20, + 0x232d2: 0x6c9fb220, + 0x232da: 0x6cb09820, + 0x232dc: 0x6c604220, 0x232dd: 0x6cbc4a20, 0x232de: 0x6d37fc20, 0x232df: 0x6c422820, + 0x232e0: 0x6d24f820, 0x232e1: 0x6c1b3620, + 0x232e5: 0x6cba5a20, 0x232e7: 0x6d424220, + 0x232e9: 0x6d00bc20, 0x232ea: 0x6c98ea20, + 0x232ec: 0x6c556e20, 0x232ee: 0x6cb0a420, 0x232ef: 0x6d0a9420, + 0x232f1: 0x6cf9d220, 0x232f2: 0x6ce34420, + 0x232f5: 0x6ca34e20, 0x232f6: 0x6c1fac20, + // Block 0x8cc, offset 0x23300 + 0x23300: 0x6cf45020, + 0x2332c: 0x6c599820, 0x2332d: 0x6d096620, 0x2332e: 0x6ce26620, + 0x23330: 0x6cbc4c20, 0x23333: 0x6c685020, + 0x2333c: 0x6c293020, 0x2333d: 0x6c044620, + // Block 0x8cd, offset 0x23340 + 0x2334d: 0x6c297620, 0x2334e: 0x6c79f820, + 0x23350: 0x6c70b220, 0x23351: 0x6ccc0a20, 0x23352: 0x6c6dc820, + 0x23355: 0x6ca06c20, 0x23356: 0x6caa0220, + 0x23358: 0x6cd78e20, 0x2335a: 0x6cd5f820, 0x2335b: 0x6d3c2020, + 0x2335c: 0x6c3ec220, 0x2335f: 0x6d29de20, + 0x23360: 0x6d00cc20, 0x23361: 0x6c812820, 0x23362: 0x6ce70420, + 0x23369: 0x6d306e20, + 0x2336c: 0x6c11fe20, 0x2336e: 0x6d26cc20, + 0x23371: 0x6d393620, + // Block 0x8ce, offset 0x23380 + 0x2339a: 0x6cdfb420, + 0x2339e: 0x6d0cb420, 0x2339f: 0x6c928820, + 0x233a0: 0x6d0db620, + 0x233a6: 0x6d2ae020, 0x233a7: 0x6cd66c20, + // Block 0x8cf, offset 0x233c0 + 0x233c5: 0x6c4c3620, 0x233c6: 0x6d3a2020, + 0x233c8: 0x6cc7bc20, 0x233c9: 0x6cc7be20, + 0x233cc: 0x6c76e620, 0x233cd: 0x6c626220, 0x233ce: 0x6c42da20, + 0x233d2: 0x6d01fa20, + 0x233d5: 0x6caba220, 0x233d6: 0x6c64d420, + 0x233da: 0x6d349220, 0x233db: 0x6d2c4820, + 0x233dd: 0x6c53a820, 0x233df: 0x6c7b7020, + 0x233e1: 0x6c0f4420, + 0x233e4: 0x6ccb4820, 0x233e5: 0x6c01cc20, 0x233e6: 0x6c66b820, + 0x233e8: 0x6ce2ac20, 0x233eb: 0x6cd93420, + 0x233ed: 0x6c9c0c20, 0x233ee: 0x6d1a9420, 0x233ef: 0x6cdfb620, + 0x233f0: 0x6c4c3820, 0x233f3: 0x6cc84620, + 0x233f4: 0x6cf0ba20, 0x233f7: 0x6cd8de20, + // Block 0x8d0, offset 0x23400 + 0x23424: 0x6cb7c220, 0x23426: 0x6d2f0a20, + // Block 0x8d1, offset 0x23440 + 0x23445: 0x6c304020, 0x23446: 0x6c3eee20, 0x23447: 0x6cd07620, + 0x23448: 0x6cdb1a20, 0x23449: 0x6d18a020, 0x2344a: 0x6c891820, + 0x2344c: 0x6c516e20, 0x2344e: 0x6d319420, + 0x23450: 0x6d2afe20, 0x23452: 0x6c250c20, 0x23453: 0x6c250e20, + 0x2345d: 0x6c3cf220, 0x2345e: 0x6c853220, 0x2345f: 0x6c7a0220, + 0x23463: 0x6d000620, + 0x23464: 0x6d1fee20, + // Block 0x8d2, offset 0x23480 + 0x23483: 0x6c4fea20, + 0x23489: 0x6c4f0620, 0x2348a: 0x6c790c20, + 0x2349d: 0x6d23ec20, + 0x234a3: 0x6c58e220, + 0x234a4: 0x6cdd3e20, 0x234a6: 0x6c7e9c20, + 0x234a8: 0x6c313c20, 0x234a9: 0x6c66de20, 0x234aa: 0x6cb32020, 0x234ab: 0x6c0b5420, + 0x234b0: 0x6d097420, 0x234b2: 0x6c0bc820, + 0x234b7: 0x6cf0e620, + // Block 0x8d3, offset 0x234c0 + 0x234e1: 0x6c28d620, 0x234e2: 0x6c6b5e20, 0x234e3: 0x6c046020, + 0x234e5: 0x6ca74420, 0x234e6: 0x6cfd2620, 0x234e7: 0x6ccb7620, + 0x234ea: 0x6c576420, 0x234eb: 0x6c1fa420, + 0x234ee: 0x6caba620, 0x234ef: 0x6c8b5020, + 0x234f0: 0x6c2ba420, 0x234f1: 0x6c114e20, 0x234f3: 0x6d2c5e20, + 0x234f5: 0x6c936820, + 0x234f9: 0x6c5e1420, + 0x234fc: 0x6c86ce20, 0x234fd: 0x6d1d1620, 0x234ff: 0x6cf03a20, + // Block 0x8d4, offset 0x23500 + 0x23500: 0x6c0a8c20, 0x23501: 0x6c4c9620, 0x23503: 0x6cb0ce20, + 0x23506: 0x6c0c3a20, + 0x23520: 0x6d0dea20, + 0x23524: 0x6d3bee20, + 0x23532: 0x6c539420, + 0x23536: 0x6c8c7820, 0x23537: 0x6c36ce20, + 0x23539: 0x6d1b1820, 0x2353a: 0x6c808020, + 0x2353c: 0x6d123820, 0x2353f: 0x6d08c820, + // Block 0x8d5, offset 0x23540 + 0x23540: 0x6c86fa20, + 0x23568: 0x6c808420, 0x23569: 0x6c8d9020, 0x2356a: 0x6cf73820, 0x2356b: 0x6c52de20, + 0x2356d: 0x6c696a20, 0x2356e: 0x6d3dd220, + 0x23572: 0x6d34b620, + 0x23575: 0x6c0fb820, 0x23576: 0x6ce29620, 0x23577: 0x6c019820, + 0x2357a: 0x6d0a5220, 0x2357b: 0x6c82fa20, + 0x2357c: 0x6d29ec20, 0x2357d: 0x6c5b7c20, + // Block 0x8d6, offset 0x23580 + 0x2358e: 0x6cf92620, 0x2358f: 0x6c539820, + 0x23591: 0x6c397820, 0x23592: 0x6c662420, 0x23593: 0x6c23c820, + 0x23594: 0x6d28da20, 0x23596: 0x6c10e020, + 0x23598: 0x6d1ece20, 0x2359b: 0x6c338820, + 0x2359c: 0x6cac4e20, + 0x235a5: 0x6cdede20, 0x235a7: 0x6cacc420, + 0x235ab: 0x6c386e20, + 0x235ac: 0x6cf74620, + 0x235b6: 0x6d124c20, 0x235b7: 0x6c957620, + 0x235ba: 0x6c0b2220, + 0x235bc: 0x6c6d7420, 0x235bd: 0x6c876a20, + // Block 0x8d7, offset 0x235c0 + 0x235ca: 0x6d0f0a20, 0x235cb: 0x6c315020, + 0x235ce: 0x6c981620, + 0x235d0: 0x6c45ca20, 0x235d1: 0x6cc51420, 0x235d2: 0x6c121220, + 0x235e3: 0x6c9ae420, + 0x235f1: 0x6c47fc20, 0x235f2: 0x6cd69e20, + 0x235f8: 0x6d0d2020, 0x235f9: 0x6c0adc20, + // Block 0x8d8, offset 0x23600 + 0x23600: 0x6c0c6a20, 0x23601: 0x6c1a6220, 0x23602: 0x6c7ce620, + 0x23604: 0x6c5d8820, + 0x2360d: 0x6c1be620, 0x2360f: 0x6cf2d020, + 0x23611: 0x6c23e820, 0x23612: 0x6d357a20, + 0x23619: 0x6cd70820, + 0x2361c: 0x6c48a220, 0x2361d: 0x6cb40020, 0x2361e: 0x6d068620, 0x2361f: 0x6cd7d020, + 0x23621: 0x6cf42e20, + 0x2362e: 0x6c3d4020, + 0x23630: 0x6cd31e20, 0x23633: 0x6c5b9220, + 0x23634: 0x6c597c20, 0x23635: 0x6cabb620, + 0x2363c: 0x6d3a5e20, 0x2363e: 0x6d14a220, + // Block 0x8d9, offset 0x23640 + 0x23643: 0x6c85a820, + 0x23644: 0x6ccd3420, + 0x2365c: 0x6c9f3820, 0x2365e: 0x6c437c20, + 0x23660: 0x6c54b020, + 0x2366f: 0x6c371220, + 0x23670: 0x6c380e20, 0x23673: 0x6d06aa20, + 0x23674: 0x6d14ca20, + 0x2367e: 0x6d1d3620, + // Block 0x8da, offset 0x23680 + 0x23694: 0x6c1b1820, + 0x23699: 0x6d14cc20, + 0x236a5: 0x6c2b6a20, 0x236a6: 0x6c5b5020, 0x236a7: 0x6c510c20, + 0x236a9: 0x6d2c7a20, + 0x236b6: 0x6d27a420, 0x236b7: 0x6cfa9c20, + // Block 0x8db, offset 0x236c0 + 0x236cc: 0x6cfb4c20, 0x236cd: 0x6c81d220, 0x236ce: 0x6cced420, 0x236cf: 0x6cd36820, + 0x236d0: 0x6d3d5220, + 0x236e4: 0x6c0ca820, 0x236e5: 0x6c6fc020, 0x236e6: 0x6cf29220, 0x236e7: 0x6c68f820, + 0x236e8: 0x6c3e7e20, 0x236ea: 0x6cfd7620, 0x236eb: 0x6c768a20, + // Block 0x8dc, offset 0x23700 + 0x23732: 0x6ca4fe20, + 0x23734: 0x6c5ddc20, 0x23735: 0x6c605620, 0x23736: 0x6c7e7e20, + 0x2373b: 0x6c3d1220, + 0x2373c: 0x6ccd4c20, 0x2373d: 0x6c8a9c20, 0x2373e: 0x6c9ee020, 0x2373f: 0x6c182620, + // Block 0x8dd, offset 0x23740 + 0x23742: 0x6ca05e20, + 0x2374f: 0x6c909820, + 0x23768: 0x6c34f620, 0x2376b: 0x6ca50020, + 0x2376d: 0x6c5ee820, + 0x23770: 0x6d3b0820, + // Block 0x8de, offset 0x23780 + 0x23782: 0x6cdad220, 0x23783: 0x6c34f820, + 0x23787: 0x6c6f2820, + 0x2378a: 0x6d291e20, 0x2378b: 0x6c5b5c20, + 0x2378c: 0x6d1cfe20, 0x2378d: 0x6c557a20, 0x2378e: 0x6c8c5820, 0x2378f: 0x6cf25820, + 0x23790: 0x6c4ee820, + 0x23794: 0x6ca40620, + 0x237b7: 0x6cf8b020, + 0x237b9: 0x6c422c20, + 0x237be: 0x6c51d420, 0x237bf: 0x6c5f0820, + // Block 0x8df, offset 0x237c0 + 0x237c0: 0x6cfdf020, 0x237c1: 0x6ccc0c20, + 0x237d0: 0x6cea0c20, 0x237d2: 0x6d2f6c20, 0x237d3: 0x6cd60420, + 0x237d5: 0x6d1fe820, 0x237d6: 0x6c64d820, + 0x237dc: 0x6d2a8c20, + 0x237e4: 0x6d2ed820, + 0x237fd: 0x6cc92c20, + // Block 0x8e0, offset 0x23800 + 0x23804: 0x6d0c2420, + 0x2380b: 0x6c255a20, + 0x23817: 0x6c608a20, + 0x23818: 0x6cce1a20, + 0x23823: 0x6c36a820, + 0x23824: 0x6c817420, 0x23825: 0x6ce07820, 0x23827: 0x6d3b2820, + 0x2382d: 0x6c8c3620, 0x2382f: 0x6d2b9220, + 0x23831: 0x6c732a20, 0x23832: 0x6c550220, + // Block 0x8e1, offset 0x23840 + 0x23857: 0x6cd07820, + 0x23858: 0x6c5dfa20, + 0x2385c: 0x6c7d2020, + 0x23871: 0x6c1f7620, 0x23872: 0x6d395020, + 0x23876: 0x6c023020, + 0x23878: 0x6d3db220, + 0x2387d: 0x6d03a420, 0x2387f: 0x6c9ef420, + // Block 0x8e2, offset 0x23880 + 0x23880: 0x6c550c20, + 0x23894: 0x6ce01a20, + 0x23899: 0x6c0a7220, + 0x238a3: 0x6c2f8420, + 0x238a9: 0x6c769820, 0x238ab: 0x6c0c3c20, + 0x238b0: 0x6c5e1620, 0x238b1: 0x6c8b5220, 0x238b2: 0x6c24b820, + // Block 0x8e3, offset 0x238c0 + 0x238c3: 0x6cfd2820, + 0x238c4: 0x6cc55620, + 0x238d3: 0x6d270220, + 0x238d5: 0x6d09be20, 0x238d7: 0x6c8a8020, + 0x238e3: 0x6ccc2a20, + 0x238e6: 0x6cd3fc20, + 0x238ea: 0x6d025c20, + 0x238f3: 0x6cff4a20, + 0x238f7: 0x6d129620, + 0x238f8: 0x6c805020, 0x238f9: 0x6d192e20, + 0x238ff: 0x6c88da20, + // Block 0x8e4, offset 0x23900 + 0x23914: 0x6c0fba20, 0x23915: 0x6c126e20, + 0x2391d: 0x6d124220, + 0x23926: 0x6c893620, + 0x2393b: 0x6cdef020, + // Block 0x8e5, offset 0x23940 + 0x23951: 0x6c62ec20, + 0x23954: 0x6cf75220, 0x23955: 0x6d377020, + 0x2395a: 0x6cf75620, + 0x2395d: 0x6d273220, + 0x23964: 0x6cfc6c20, 0x23966: 0x6d3df820, + 0x2396f: 0x6d2ef820, + 0x23975: 0x6d410620, 0x23977: 0x6ca2ce20, + 0x2397e: 0x6c2a0420, 0x2397f: 0x6c8ad620, + // Block 0x8e6, offset 0x23980 + 0x23980: 0x6ca2d220, + 0x23989: 0x6cad5420, 0x2398b: 0x6c721620, + 0x23996: 0x6c95b220, + 0x23999: 0x6cd64820, 0x2399a: 0x6cce5420, + 0x2399d: 0x6c95b420, 0x2399f: 0x6c3b3a20, + 0x239a3: 0x6c065820, + 0x239a8: 0x6c865820, 0x239ab: 0x6d04a220, + 0x239b6: 0x6c290820, + // Block 0x8e7, offset 0x239c0 + 0x239c0: 0x6c1a8c20, + 0x239c4: 0x6d2f1420, 0x239c7: 0x6cda3a20, + 0x239ca: 0x6cd03e20, + 0x239d2: 0x6c447220, + 0x239d8: 0x6d209020, 0x239da: 0x6c5ad420, 0x239db: 0x6c183e20, + 0x239dd: 0x6c698420, 0x239de: 0x6d3ac420, 0x239df: 0x6cd4b220, + 0x239e2: 0x6cff8420, + 0x239e6: 0x6ca91420, + 0x239ed: 0x6c674420, 0x239ef: 0x6c674820, + 0x239f7: 0x6c2e0e20, + 0x239fd: 0x6cbb0c20, 0x239fe: 0x6cc04e20, + // Block 0x8e8, offset 0x23a00 + 0x23a00: 0x6c3c4020, + 0x23a06: 0x6d2e6620, 0x23a07: 0x6c77fa20, + 0x23a12: 0x6c2ece20, 0x23a13: 0x6d2aec20, + 0x23a16: 0x6c49f820, 0x23a17: 0x6ccb5c20, + 0x23a18: 0x6c3bea20, 0x23a1b: 0x6c67bc20, + 0x23a1d: 0x6d0cd820, 0x23a1e: 0x6d370820, + 0x23a22: 0x6c872220, + 0x23a26: 0x6c8ddc20, + 0x23a2a: 0x6d146420, + 0x23a2c: 0x6cc23e20, 0x23a2d: 0x6cac5220, 0x23a2e: 0x6c463a20, + 0x23a30: 0x6c640220, 0x23a31: 0x6c50da20, 0x23a33: 0x6caf0c20, + 0x23a35: 0x6c721820, 0x23a37: 0x6c180620, + 0x23a3a: 0x6c8af220, 0x23a3b: 0x6cd35220, + 0x23a3c: 0x6cb37a20, 0x23a3d: 0x6cfe2820, 0x23a3f: 0x6cb08e20, + // Block 0x8e9, offset 0x23a40 + 0x23a40: 0x6c95ae20, 0x23a41: 0x6c243420, 0x23a43: 0x6d225020, + 0x23a47: 0x6c79a820, + 0x23a48: 0x6d01b020, + 0x23a4d: 0x6ced1e20, 0x23a4e: 0x6d0d8e20, 0x23a4f: 0x6cadd820, + 0x23a53: 0x6c1a0620, + 0x23a58: 0x6ce34620, 0x23a59: 0x6c182820, 0x23a5a: 0x6c09ce20, 0x23a5b: 0x6c890820, + 0x23a5c: 0x6c641e20, 0x23a5e: 0x6ce68220, + 0x23a62: 0x6ce2f620, + 0x23a68: 0x6c2edc20, 0x23a6a: 0x6cd60620, 0x23a6b: 0x6c842e20, + 0x23a6c: 0x6c936020, 0x23a6d: 0x6cf97420, 0x23a6f: 0x6c24e420, + 0x23a73: 0x6c0e9220, + 0x23a74: 0x6ce9ba20, 0x23a75: 0x6cb45020, 0x23a77: 0x6c8c6220, + 0x23a78: 0x6c3bec20, 0x23a7a: 0x6c0f7620, 0x23a7b: 0x6c163620, + 0x23a7e: 0x6c290a20, 0x23a7f: 0x6cdf5820, + // Block 0x8ea, offset 0x23a80 + 0x23a80: 0x6c2a3c20, 0x23a83: 0x6c872420, + 0x23a85: 0x6d0b1220, 0x23a86: 0x6d0b1820, 0x23a87: 0x6d2d6620, + 0x23a8a: 0x6d14e220, + 0x23a8c: 0x6cb4fa20, + 0x23a94: 0x6c564420, 0x23a96: 0x6ce62a20, + 0x23a98: 0x6c79cc20, 0x23a9b: 0x6c213220, + 0x23a9c: 0x6d1f0020, 0x23a9d: 0x6c3bd020, 0x23a9f: 0x6caab220, + 0x23aa0: 0x6ce53020, 0x23aa1: 0x6c6cde20, 0x23aa2: 0x6cafbc20, 0x23aa3: 0x6c18a420, + 0x23aa4: 0x6cb08820, 0x23aa6: 0x6c6bc420, 0x23aa7: 0x6c4ac820, + 0x23ab2: 0x6d3c3220, + 0x23ab5: 0x6c552420, 0x23ab6: 0x6c1e2420, 0x23ab7: 0x6cd5a020, + 0x23ab8: 0x6ce1b420, 0x23ab9: 0x6cafc620, 0x23aba: 0x6cc70020, 0x23abb: 0x6cc70220, + 0x23abd: 0x6c544e20, 0x23abe: 0x6cae5a20, + // Block 0x8eb, offset 0x23ac0 + 0x23ac5: 0x6c043e20, 0x23ac7: 0x6cf99a20, + 0x23acb: 0x6cbdcc20, + 0x23acc: 0x6ca63220, 0x23ace: 0x6ce1b620, 0x23acf: 0x6cc26a20, + 0x23ad2: 0x6d008e20, + 0x23ad4: 0x6d2fa820, 0x23ad5: 0x6c570e20, 0x23ad6: 0x6d02c820, + 0x23ad8: 0x6cd42e20, 0x23adb: 0x6ce8a620, + 0x23add: 0x6c895020, 0x23ade: 0x6c097c20, 0x23adf: 0x6c1e5a20, + 0x23ae1: 0x6d037020, 0x23ae3: 0x6d02cc20, + 0x23ae4: 0x6c3d6820, + 0x23ae9: 0x6c6bde20, + 0x23aed: 0x6c3f5e20, + 0x23af0: 0x6ce27a20, 0x23af1: 0x6ccf4c20, + 0x23af4: 0x6c174620, 0x23af5: 0x6c20b820, + 0x23afc: 0x6cc47a20, 0x23afd: 0x6c545620, 0x23afe: 0x6c07ec20, + // Block 0x8ec, offset 0x23b00 + 0x23b00: 0x6c113020, + 0x23b05: 0x6ca21420, + 0x23b09: 0x6d059e20, 0x23b0a: 0x6c2eaa20, + 0x23b0d: 0x6c15c220, 0x23b0e: 0x6d215c20, 0x23b0f: 0x6d383620, + 0x23b13: 0x6c83e620, + 0x23b14: 0x6cd43420, + 0x23b1a: 0x6c31a420, + 0x23b1c: 0x6c98bc20, 0x23b1d: 0x6c59d420, 0x23b1f: 0x6ce22c20, + 0x23b21: 0x6c326620, 0x23b22: 0x6ce34820, 0x23b23: 0x6cd10820, + 0x23b24: 0x6c9a0e20, + 0x23b28: 0x6d316820, 0x23b29: 0x6cbd9020, 0x23b2a: 0x6cb0ae20, 0x23b2b: 0x6ce11620, + 0x23b2c: 0x6c123820, 0x23b2d: 0x6d112420, 0x23b2f: 0x6d054620, + 0x23b30: 0x6c053620, 0x23b31: 0x6c47b220, + 0x23b35: 0x6c10aa20, + 0x23b3c: 0x6c46c620, 0x23b3d: 0x6c0f2e20, + // Block 0x8ed, offset 0x23b40 + 0x23b41: 0x6cf21020, + 0x23b44: 0x6c624420, + 0x23b4a: 0x6c7e4c20, + 0x23b4d: 0x6c24e620, 0x23b4e: 0x6c9fc820, 0x23b4f: 0x6c242820, + 0x23b50: 0x6cab4e20, 0x23b51: 0x6d1da620, + 0x23b56: 0x6c98fe20, 0x23b57: 0x6c78c820, + 0x23b58: 0x6c981e20, 0x23b59: 0x6c2f8020, 0x23b5a: 0x6c582e20, 0x23b5b: 0x6c34ac20, + 0x23b5c: 0x6c677420, 0x23b5d: 0x6cdb0220, + 0x23b62: 0x6c135c20, 0x23b63: 0x6cde9e20, + 0x23b65: 0x6c59f820, 0x23b66: 0x6c74be20, 0x23b67: 0x6d0a4020, + 0x23b6a: 0x6d04a620, + 0x23b6c: 0x6c9d8820, 0x23b6d: 0x6cc45620, 0x23b6e: 0x6c817620, + 0x23b71: 0x6d370a20, 0x23b72: 0x6cf02820, + 0x23b77: 0x6ccb6e20, + 0x23b7b: 0x6d29ea20, + // Block 0x8ee, offset 0x23b80 + 0x23b81: 0x6c019620, 0x23b82: 0x6cf10c20, + 0x23b84: 0x6c581e20, 0x23b87: 0x6d2e9e20, + 0x23b89: 0x6d1c2c20, 0x23b8a: 0x6c43bc20, 0x23b8b: 0x6c5c9220, + 0x23b8d: 0x6cc33420, + 0x23b93: 0x6c8b7c20, + 0x23b94: 0x6c719a20, 0x23b95: 0x6c03de20, 0x23b96: 0x6c82a620, + 0x23b98: 0x6c97ac20, 0x23b99: 0x6c8dde20, + 0x23b9c: 0x6c856a20, 0x23b9d: 0x6c611420, + 0x23ba1: 0x6c5b1620, 0x23ba2: 0x6d031820, 0x23ba3: 0x6cd30020, + 0x23ba4: 0x6d300e20, 0x23ba7: 0x6c0e4820, + 0x23bab: 0x6c137a20, + 0x23baf: 0x6c137e20, + 0x23bb0: 0x6c6d8c20, 0x23bb1: 0x6c031c20, 0x23bb2: 0x6c06da20, + 0x23bb5: 0x6d0e3c20, 0x23bb7: 0x6c565e20, + 0x23bb9: 0x6d20ba20, 0x23bbb: 0x6c091e20, + 0x23bbc: 0x6c1ff220, 0x23bbe: 0x6c612220, + // Block 0x8ef, offset 0x23bc0 + 0x23bc2: 0x6ca26c20, + 0x23bc4: 0x6c98c420, 0x23bc5: 0x6d379420, 0x23bc7: 0x6d12c620, + 0x23bc8: 0x6c30a020, 0x23bc9: 0x6d12a420, + 0x23bcd: 0x6cc63c20, 0x23bce: 0x6d19a620, + 0x23bd0: 0x6c501e20, 0x23bd2: 0x6ca31220, 0x23bd3: 0x6ce61020, + 0x23bd4: 0x6c3fb620, 0x23bd5: 0x6ca22c20, 0x23bd6: 0x6d291020, + 0x23bd8: 0x6c552820, 0x23bda: 0x6c185c20, 0x23bdb: 0x6ceaf420, + 0x23bde: 0x6c1f1220, 0x23bdf: 0x6c3df820, + 0x23be7: 0x6c063420, + 0x23bec: 0x6c2bde20, 0x23bed: 0x6c111c20, 0x23bee: 0x6c921220, 0x23bef: 0x6cb35020, + 0x23bf0: 0x6c268620, 0x23bf1: 0x6d12da20, 0x23bf3: 0x6d15d220, + 0x23bf7: 0x6cfdb620, + 0x23bf8: 0x6c086e20, 0x23bf9: 0x6d398c20, 0x23bfb: 0x6d14a620, + 0x23bfd: 0x6c93d220, 0x23bff: 0x6c7b9420, + // Block 0x8f0, offset 0x23c00 + 0x23c02: 0x6d35a420, + 0x23c07: 0x6cec0820, + 0x23c08: 0x6c2b1c20, 0x23c09: 0x6cd5b020, 0x23c0a: 0x6c8ad820, 0x23c0b: 0x6d2a4220, + 0x23c0c: 0x6d35a620, 0x23c0d: 0x6ca49e20, + 0x23c17: 0x6c147220, + 0x23c1a: 0x6cfea620, 0x23c1b: 0x6d2a0220, + 0x23c1e: 0x6d22f420, 0x23c1f: 0x6c310620, + 0x23c20: 0x6c143e20, 0x23c21: 0x6d009020, 0x23c22: 0x6d0fa220, + 0x23c24: 0x6cfc0220, 0x23c25: 0x6c05f220, + 0x23c2e: 0x6d2cec20, + 0x23c30: 0x6cc03420, 0x23c32: 0x6c553420, 0x23c33: 0x6d293220, + 0x23c34: 0x6c741620, 0x23c36: 0x6c4d9a20, + 0x23c3f: 0x6c01ae20, + // Block 0x8f1, offset 0x23c40 + 0x23c40: 0x6d2a7820, 0x23c43: 0x6ccc4c20, + 0x23c45: 0x6cfcb220, 0x23c46: 0x6c1b9e20, 0x23c47: 0x6d0d6a20, + 0x23c49: 0x6c01ba20, + 0x23c4d: 0x6d305220, 0x23c4e: 0x6c742c20, + 0x23c51: 0x6c85ea20, 0x23c53: 0x6c822020, + 0x23c56: 0x6c112c20, + 0x23c58: 0x6c924220, 0x23c5a: 0x6c634c20, + 0x23c5d: 0x6cfa3820, 0x23c5e: 0x6cfff020, 0x23c5f: 0x6d0c0c20, + 0x23c60: 0x6d05a020, 0x23c62: 0x6c33f020, 0x23c63: 0x6d1c7620, + 0x23c64: 0x6c5ab820, 0x23c65: 0x6ce32820, 0x23c66: 0x6caa0020, 0x23c67: 0x6cf7e820, + 0x23c6a: 0x6ce8b220, + 0x23c77: 0x6cec5620, + 0x23c78: 0x6c186620, + 0x23c7c: 0x6c52aa20, 0x23c7e: 0x6ce32a20, 0x23c7f: 0x6d07a020, + // Block 0x8f2, offset 0x23c80 + 0x23c80: 0x6d28bc20, + 0x23c87: 0x6c43f020, + 0x23c8b: 0x6c908c20, + 0x23c8c: 0x6c147c20, 0x23c8d: 0x6cac6020, 0x23c8e: 0x6c605820, + 0x23c90: 0x6cde5e20, 0x23c93: 0x6cf64e20, + 0x23c96: 0x6cfeda20, + 0x23c98: 0x6ccab620, 0x23c99: 0x6c637020, 0x23c9a: 0x6cdad420, 0x23c9b: 0x6c599a20, + 0x23c9d: 0x6c25bc20, 0x23c9f: 0x6cde6020, + 0x23ca0: 0x6cd65420, + 0x23caa: 0x6c3e9a20, 0x23cab: 0x6c863620, + 0x23cad: 0x6ccf5a20, 0x23caf: 0x6ce10620, + 0x23cb6: 0x6c2cd020, + 0x23cba: 0x6c09fa20, + 0x23cbc: 0x6c46c820, 0x23cbd: 0x6c244620, 0x23cbf: 0x6cb90820, + // Block 0x8f3, offset 0x23cc0 + 0x23cc2: 0x6c824620, 0x23cc3: 0x6cdaea20, + 0x23cc6: 0x6d402420, 0x23cc7: 0x6c4faa20, + 0x23ccf: 0x6c1c4420, + 0x23cd0: 0x6c128020, 0x23cd3: 0x6cf30420, + 0x23cd4: 0x6cfef220, 0x23cd5: 0x6c8b2020, 0x23cd6: 0x6d0c1e20, + 0x23cdd: 0x6c09fc20, 0x23cdf: 0x6c594220, + 0x23ce1: 0x6cf67820, 0x23ce2: 0x6c1ac820, 0x23ce3: 0x6d05d620, + 0x23ce4: 0x6ca4bc20, 0x23ce5: 0x6d0cc020, 0x23ce7: 0x6d01fc20, + 0x23ce8: 0x6d2c4a20, 0x23cea: 0x6cdc5e20, + 0x23cec: 0x6cf8ca20, 0x23ced: 0x6c080620, 0x23cee: 0x6cc48420, 0x23cef: 0x6cd79820, + 0x23cf0: 0x6c049020, 0x23cf1: 0x6c4b6a20, 0x23cf2: 0x6c763c20, 0x23cf3: 0x6c188020, + 0x23cf6: 0x6d072820, + 0x23cfe: 0x6c368620, 0x23cff: 0x6c865a20, + // Block 0x8f4, offset 0x23d00 + 0x23d00: 0x6cf69e20, 0x23d01: 0x6c594c20, 0x23d02: 0x6cdb0420, + 0x23d04: 0x6c16f620, + 0x23d0a: 0x6c92a820, 0x23d0b: 0x6d0cc220, + 0x23d0e: 0x6c290620, 0x23d0f: 0x6c284620, + 0x23d10: 0x6d0f6a20, 0x23d12: 0x6d2d3620, 0x23d13: 0x6c729020, + 0x23d15: 0x6c345e20, 0x23d16: 0x6ccabe20, 0x23d17: 0x6c7f2a20, + 0x23d18: 0x6cdb1c20, + 0x23d1f: 0x6d2b0020, + 0x23d23: 0x6c0a5020, + 0x23d26: 0x6d1b8c20, + 0x23d28: 0x6c4fb420, 0x23d2a: 0x6c8b3a20, + 0x23d2d: 0x6c4ff620, 0x23d2e: 0x6d0fdc20, + 0x23d34: 0x6cd7a420, 0x23d35: 0x6c00f020, 0x23d36: 0x6cbf7420, + 0x23d39: 0x6c82ec20, 0x23d3a: 0x6d011220, + 0x23d3c: 0x6cd3f220, + // Block 0x8f5, offset 0x23d40 + 0x23d43: 0x6c91ec20, + 0x23d45: 0x6cc41220, 0x23d46: 0x6c888020, + 0x23d4c: 0x6d001a20, 0x23d4e: 0x6d1c2020, + 0x23d51: 0x6d012620, + 0x23d58: 0x6c8d9e20, 0x23d59: 0x6d1ed620, + 0x23d5e: 0x6c294020, 0x23d5f: 0x6c806020, + 0x23d60: 0x6cff5e20, + 0x23d68: 0x6d182a20, + 0x23d6c: 0x6cf34c20, 0x23d6e: 0x6d168e20, 0x23d6f: 0x6ceaa420, + 0x23d70: 0x6c102e20, 0x23d72: 0x6d032020, + 0x23d75: 0x6cd7c420, 0x23d76: 0x6c6c2a20, + 0x23d78: 0x6c031e20, 0x23d79: 0x6c383020, 0x23d7b: 0x6ca0d420, + 0x23d7c: 0x6cc91220, + // Block 0x8f6, offset 0x23d80 + 0x23d8a: 0x6c26ea20, 0x23d8b: 0x6c619820, + 0x23d90: 0x6cda8820, 0x23d91: 0x6cbf0620, 0x23d92: 0x6c033020, + 0x23da6: 0x6ce48c20, 0x23da7: 0x6d1f0a20, + 0x23da9: 0x6ceb0020, 0x23dab: 0x6cec6c20, + 0x23dac: 0x6d202e20, 0x23dae: 0x6c2fe820, + 0x23db1: 0x6cf7d820, 0x23db2: 0x6c799820, + 0x23db6: 0x6cbf0c20, 0x23db7: 0x6c32f820, + 0x23db8: 0x6c34e420, 0x23dba: 0x6d173620, + // Block 0x8f7, offset 0x23dc0 + 0x23dd2: 0x6cf5c820, 0x23dd3: 0x6cbd2420, + 0x23dd4: 0x6cda9220, 0x23dd7: 0x6c8e5220, + 0x23dd9: 0x6cecd820, + 0x23ded: 0x6c17da20, 0x23dee: 0x6d399a20, + 0x23df0: 0x6c997220, + 0x23df7: 0x6cc2de20, + 0x23dfd: 0x6d208c20, 0x23dff: 0x6d17ac20, + // Block 0x8f8, offset 0x23e00 + 0x23e00: 0x6c9c5020, 0x23e03: 0x6c7f0c20, + 0x23e04: 0x6d362e20, + 0x23e24: 0x6ca5e620, 0x23e26: 0x6c048220, + 0x23e2a: 0x6c300420, + 0x23e2e: 0x6d363020, + // Block 0x8f9, offset 0x23e40 + 0x23e55: 0x6d17ec20, + 0x23e58: 0x6c8d1e20, 0x23e59: 0x6d216020, 0x23e5a: 0x6c231e20, 0x23e5b: 0x6c2c6a20, + 0x23e5c: 0x6d365c20, + 0x23e60: 0x6cc86820, 0x23e63: 0x6c669a20, + 0x23e69: 0x6ced8c20, 0x23e6b: 0x6c6d2c20, + 0x23e6d: 0x6cad0820, + // Block 0x8fa, offset 0x23e80 + 0x23e8d: 0x6c928a20, 0x23e8e: 0x6cc1a620, + 0x23e90: 0x6cf80020, 0x23e91: 0x6c26b420, + 0x23e96: 0x6c56c220, 0x23e97: 0x6c95bc20, + 0x23e99: 0x6c822820, + 0x23eb6: 0x6c45f820, + 0x23ebb: 0x6c8e2620, + // Block 0x8fb, offset 0x23ec0 + 0x23ec2: 0x6c817820, + 0x23ec4: 0x6d3be420, + 0x23ee8: 0x6d2a5220, 0x23ee9: 0x6c506a20, 0x23eea: 0x6cfe5420, + 0x23eed: 0x6c507020, 0x23eee: 0x6c86a220, + 0x23ef1: 0x6c2d8820, 0x23ef2: 0x6c444020, + 0x23efd: 0x6c58a820, + // Block 0x8fc, offset 0x23f00 + 0x23f04: 0x6c36b620, 0x23f06: 0x6cf9fe20, + 0x23f0b: 0x6c651820, + 0x23f0c: 0x6cb67420, 0x23f0d: 0x6cfa0820, 0x23f0e: 0x6d1ffa20, + 0x23f21: 0x6d330420, + 0x23f2a: 0x6d3bf220, + 0x23f2e: 0x6c163a20, + // Block 0x8fd, offset 0x23f40 + 0x23f49: 0x6d027a20, + 0x23f55: 0x6ca4d620, + 0x23f5d: 0x6c62ee20, 0x23f5e: 0x6ce4d620, + 0x23f63: 0x6d0e3220, + 0x23f67: 0x6c500c20, + 0x23f68: 0x6d030820, 0x23f69: 0x6c8de020, 0x23f6b: 0x6c047620, + 0x23f6c: 0x6c081220, + 0x23f71: 0x6c463e20, 0x23f72: 0x6c8cc820, + 0x23f75: 0x6c7df420, 0x23f76: 0x6cb85e20, 0x23f77: 0x6c699e20, + 0x23f79: 0x6c371420, 0x23f7a: 0x6d10fa20, 0x23f7b: 0x6c316e20, + // Block 0x8fe, offset 0x23f80 + 0x23f81: 0x6c5d9220, 0x23f82: 0x6c322420, 0x23f83: 0x6cadbe20, + 0x23f8c: 0x6d259820, 0x23f8f: 0x6c90b820, + 0x23f90: 0x6d03f820, 0x23f93: 0x6c883a20, + 0x23f94: 0x6d113820, 0x23f95: 0x6cf6a020, 0x23f96: 0x6d114420, + 0x23f98: 0x6cf70020, 0x23f9b: 0x6c918a20, + 0x23f9d: 0x6d0f0020, + 0x23fa0: 0x6cc33820, + 0x23fa5: 0x6cc50020, 0x23fa6: 0x6cec2020, 0x23fa7: 0x6d40a420, + 0x23fa8: 0x6c392e20, 0x23fa9: 0x6d16c620, 0x23faa: 0x6c323c20, 0x23fab: 0x6cdc2620, + 0x23fad: 0x6caf4820, 0x23faf: 0x6c4de820, + 0x23fb1: 0x6d069820, 0x23fb3: 0x6c45e620, + 0x23fb5: 0x6c2c2e20, 0x23fb7: 0x6ca32620, + 0x23fbe: 0x6c34ec20, 0x23fbf: 0x6cebda20, + // Block 0x8ff, offset 0x23fc0 + 0x23fc2: 0x6ca81820, + 0x23fc8: 0x6c2e1a20, 0x23fc9: 0x6c598e20, + 0x23fcc: 0x6ce32c20, 0x23fcd: 0x6c395420, + 0x23fd1: 0x6cf3ca20, 0x23fd2: 0x6c01fe20, + 0x23fd4: 0x6cb2a820, + 0x23fd9: 0x6c4e1420, 0x23fdb: 0x6c428820, + 0x23fdc: 0x6c83e820, 0x23fde: 0x6c339c20, 0x23fdf: 0x6c400e20, + 0x23fe0: 0x6ca35020, 0x23fe2: 0x6c132220, + 0x23fe7: 0x6c6a2820, + 0x23fe9: 0x6cbed020, 0x23feb: 0x6d1bd020, + 0x23fec: 0x6cfdd220, + 0x23ff1: 0x6c557c20, + 0x23ff4: 0x6cdaec20, + 0x23ffb: 0x6c43a420, + 0x23ffc: 0x6c368820, 0x23ffd: 0x6d072a20, + // Block 0x900, offset 0x24000 + 0x24006: 0x6cf6cc20, + 0x2400a: 0x6c774c20, 0x2400b: 0x6c4c8a20, + 0x2400c: 0x6c6a3620, 0x2400d: 0x6c200c20, 0x2400e: 0x6c826220, 0x2400f: 0x6c527620, + 0x24010: 0x6d41f420, + 0x24015: 0x6cb1e620, + 0x24018: 0x6c2ab420, 0x24019: 0x6cf70220, 0x2401a: 0x6c826820, + 0x2401c: 0x6ccdc620, + 0x24027: 0x6c918c20, + 0x24029: 0x6c338a20, 0x2402a: 0x6c760420, + 0x2402d: 0x6c164820, 0x2402f: 0x6d012c20, + 0x24030: 0x6cec0220, 0x24031: 0x6d30c420, 0x24033: 0x6d3b9e20, + 0x24037: 0x6c8f6020, + 0x24038: 0x6c82aa20, + 0x2403c: 0x6c273620, 0x2403d: 0x6c417820, + // Block 0x901, offset 0x24040 + 0x24044: 0x6cd34020, 0x24047: 0x6d0da420, + 0x2404c: 0x6c41b420, + 0x24050: 0x6d0d0020, + 0x24056: 0x6cdbac20, + 0x2405a: 0x6d37a620, + 0x2405c: 0x6cd34220, + 0x24061: 0x6cd15c20, + 0x24065: 0x6c15ae20, + 0x24077: 0x6c5a0820, + 0x24078: 0x6d1b8e20, 0x2407b: 0x6c9bee20, + // Block 0x902, offset 0x24080 + 0x24082: 0x6cc4f220, + 0x24085: 0x6cfdae20, + 0x24088: 0x6c071420, + 0x2408c: 0x6c200820, + 0x24091: 0x6cb47620, + 0x24099: 0x6c77d220, 0x2409a: 0x6c7e3820, + 0x2409d: 0x6cc35020, 0x2409f: 0x6c4f9220, + 0x240a0: 0x6c1bf220, 0x240a1: 0x6c983820, + 0x240a6: 0x6d2cb020, + 0x240aa: 0x6c3bd220, + 0x240ac: 0x6c17b420, + 0x240b3: 0x6c6e1820, + // Block 0x903, offset 0x240c0 + 0x240c3: 0x6c8ada20, + 0x240c5: 0x6ca31c20, 0x240c6: 0x6ca31e20, 0x240c7: 0x6ce72a20, + 0x240cb: 0x6cc46620, + 0x240cc: 0x6d411620, 0x240cd: 0x6caf5420, 0x240ce: 0x6d1fba20, + 0x240d0: 0x6cd4be20, + 0x240db: 0x6c8af420, + 0x240dc: 0x6cd43020, 0x240dd: 0x6ce97e20, 0x240df: 0x6c430220, + 0x240e0: 0x6ccea220, 0x240e1: 0x6ceb0420, 0x240e3: 0x6ca3f220, + 0x240e7: 0x6ceb7a20, + 0x240e8: 0x6c458220, 0x240e9: 0x6c2e1c20, + 0x240f4: 0x6c9bd020, 0x240f5: 0x6c052820, 0x240f7: 0x6d00a420, + 0x240f8: 0x6cd8b420, 0x240f9: 0x6ce6c820, 0x240fa: 0x6c4b4220, + 0x240fd: 0x6c3e8020, 0x240fe: 0x6c4b4820, + // Block 0x904, offset 0x24100 + 0x24109: 0x6c4b4a20, + 0x24111: 0x6d3a7420, 0x24113: 0x6c7f1420, + 0x24115: 0x6c951620, 0x24116: 0x6ce50020, 0x24117: 0x6cc4c620, + 0x2411a: 0x6c300820, + 0x24128: 0x6c737220, 0x24129: 0x6d0cac20, + 0x2412c: 0x6cc84020, 0x2412d: 0x6c283a20, + 0x24130: 0x6c999e20, + 0x24136: 0x6c944020, + 0x24138: 0x6d072c20, 0x2413a: 0x6cf6a220, + // Block 0x905, offset 0x24140 + 0x24142: 0x6c967420, 0x24143: 0x6cb52220, + 0x24145: 0x6c144820, + 0x24148: 0x6cce1e20, 0x24149: 0x6c4f0820, 0x2414a: 0x6cb2ce20, + 0x2414e: 0x6c5f3820, + 0x24153: 0x6c86a620, + 0x24155: 0x6d240c20, 0x24156: 0x6c04a420, + 0x24158: 0x6ce29220, + 0x2415d: 0x6c1de820, + 0x24160: 0x6c1dea20, + 0x24164: 0x6cb54420, 0x24165: 0x6cf70420, 0x24166: 0x6c076820, + 0x2416a: 0x6d138020, + 0x2416d: 0x6c4a1020, 0x2416f: 0x6d3b3a20, + 0x24173: 0x6c827c20, + 0x24174: 0x6c827e20, 0x24175: 0x6c13be20, + // Block 0x906, offset 0x24180 + 0x24180: 0x6c4a1420, + 0x2418d: 0x6c2f2420, + 0x24193: 0x6d0b4420, + 0x24198: 0x6ca7fc20, 0x24199: 0x6cd4de20, 0x2419b: 0x6d363220, + 0x2419f: 0x6d36e420, + 0x241a2: 0x6d36e620, 0x241a3: 0x6cb07620, + 0x241a5: 0x6c6f4e20, 0x241a6: 0x6c6f5220, 0x241a7: 0x6d169020, + 0x241a8: 0x6d201220, 0x241aa: 0x6c6f5420, + 0x241af: 0x6c58f220, + 0x241b1: 0x6c323e20, + 0x241bb: 0x6ce20c20, + 0x241bc: 0x6cbc9e20, 0x241bd: 0x6cbd5c20, 0x241be: 0x6d032420, 0x241bf: 0x6c14bc20, + // Block 0x907, offset 0x241c0 + 0x241c0: 0x6c61ae20, 0x241c2: 0x6cbe0a20, + 0x241ca: 0x6c324620, 0x241cb: 0x6d33aa20, + 0x241ce: 0x6cab7820, + 0x241d0: 0x6cf4c820, 0x241d2: 0x6cf18620, + 0x241d8: 0x6c096620, 0x241db: 0x6c069420, + 0x241dd: 0x6ca23c20, 0x241de: 0x6c6cf420, 0x241df: 0x6ce21220, + 0x241e0: 0x6c89e220, + 0x241e5: 0x6c127220, 0x241e6: 0x6d2c2820, + 0x241ec: 0x6c1b8e20, 0x241ed: 0x6d0ae020, 0x241ee: 0x6c7c6420, 0x241ef: 0x6d1b4420, + 0x241f8: 0x6c8f8820, 0x241f9: 0x6cb86020, 0x241fb: 0x6c4f4c20, + 0x241fc: 0x6cce5020, 0x241fd: 0x6c4d6420, 0x241fe: 0x6c139220, + // Block 0x908, offset 0x24200 + 0x24200: 0x6c68e220, 0x24201: 0x6c81ae20, + 0x24208: 0x6cf5fa20, 0x2420b: 0x6c0ef220, + 0x24213: 0x6d351a20, + 0x24215: 0x6cea8a20, 0x24216: 0x6c3e8220, + 0x24218: 0x6c54ce20, 0x2421a: 0x6ca83220, 0x2421b: 0x6d17ae20, + 0x2421c: 0x6d3c4020, + 0x24220: 0x6c13e620, + 0x24224: 0x6cdb8220, 0x24227: 0x6d283620, + 0x2422e: 0x6c325e20, + 0x24230: 0x6cf61c20, 0x24231: 0x6c203620, 0x24232: 0x6d03e820, 0x24233: 0x6c68fa20, + 0x24234: 0x6ccfea20, + // Block 0x909, offset 0x24240 + 0x24240: 0x6cedca20, 0x24241: 0x6c06a220, 0x24242: 0x6c3a3a20, 0x24243: 0x6c669c20, + 0x24244: 0x6cc30020, 0x24245: 0x6d17f020, 0x24246: 0x6c300a20, 0x24247: 0x6d06f620, + 0x24248: 0x6ca35220, 0x24249: 0x6c605a20, + 0x2424c: 0x6d31e620, 0x2424d: 0x6cb5fa20, 0x2424e: 0x6c330a20, 0x2424f: 0x6d1a7220, + 0x24251: 0x6c700420, 0x24252: 0x6caffe20, 0x24253: 0x6d033e20, + 0x24254: 0x6c94fe20, 0x24255: 0x6c113420, 0x24256: 0x6c8e2020, 0x24257: 0x6c0cac20, + 0x24258: 0x6c2a1c20, 0x24259: 0x6c2a7620, + 0x2425f: 0x6c7ed820, + 0x24261: 0x6cf65020, 0x24262: 0x6c725620, + 0x24264: 0x6cff9020, 0x24266: 0x6c6dc020, + 0x24279: 0x6cec7220, 0x2427b: 0x6ca50a20, + 0x2427c: 0x6cfd8220, 0x2427d: 0x6cc3e220, 0x2427e: 0x6cbcd420, 0x2427f: 0x6ce86a20, + // Block 0x90a, offset 0x24280 + 0x24280: 0x6d064a20, 0x24281: 0x6c5bfc20, + 0x24285: 0x6c9f6c20, 0x24286: 0x6ceff220, + 0x24288: 0x6d1f5620, 0x24289: 0x6ce9ae20, 0x2428a: 0x6c278020, + 0x2428e: 0x6c786c20, 0x2428f: 0x6ca36220, + 0x24291: 0x6c401c20, 0x24292: 0x6d239620, 0x24293: 0x6d354420, + 0x24295: 0x6c4dae20, 0x24296: 0x6c002e20, 0x24297: 0x6c401e20, + 0x242a1: 0x6d0f6220, + 0x242a4: 0x6cd27e20, 0x242a6: 0x6c150c20, + 0x242aa: 0x6c1c5c20, 0x242ab: 0x6d284820, + 0x242ac: 0x6cd65a20, 0x242ae: 0x6cdb0620, 0x242af: 0x6cca8620, + 0x242b1: 0x6c368a20, 0x242b2: 0x6d332e20, 0x242b3: 0x6c004e20, + 0x242b4: 0x6cdd8c20, 0x242b5: 0x6c10b220, 0x242b7: 0x6cc45220, + 0x242b8: 0x6d185e20, 0x242b9: 0x6d0dca20, 0x242bb: 0x6ca36620, + 0x242bc: 0x6cf46a20, + // Block 0x90b, offset 0x242c0 + 0x242c7: 0x6c865c20, + 0x242c8: 0x6c865e20, 0x242ca: 0x6cf6a820, 0x242cb: 0x6c749c20, + 0x242cc: 0x6cd1ea20, 0x242ce: 0x6d0b5c20, + 0x242db: 0x6c18e420, + 0x242dc: 0x6d1c8c20, 0x242dd: 0x6c0a5220, 0x242de: 0x6c184020, + 0x242e1: 0x6d2bfc20, 0x242e2: 0x6ceb9020, 0x242e3: 0x6c56c620, + 0x242e4: 0x6ce2b220, 0x242e5: 0x6d1d4c20, 0x242e6: 0x6c08f820, 0x242e7: 0x6ca91e20, + 0x242e8: 0x6c891a20, 0x242e9: 0x6d034c20, 0x242ea: 0x6d229020, + 0x242f2: 0x6c075e20, + 0x242f4: 0x6ca07820, 0x242f5: 0x6c331420, 0x242f7: 0x6c29ea20, + 0x242f8: 0x6cb64c20, + // Block 0x90c, offset 0x24300 + 0x24300: 0x6cd65c20, 0x24303: 0x6cff1e20, + 0x24304: 0x6d380a20, 0x24305: 0x6d3cb220, 0x24307: 0x6c0bca20, + 0x24309: 0x6cf02a20, 0x2430a: 0x6cf6ec20, + 0x2430c: 0x6c2aae20, 0x2430e: 0x6d005620, 0x2430f: 0x6cac4620, + 0x24310: 0x6ca87a20, 0x24313: 0x6c0cfa20, + 0x24314: 0x6ccf7a20, 0x24315: 0x6c3ad820, 0x24316: 0x6c9fcc20, 0x24317: 0x6cb7e820, + 0x2432a: 0x6ccdbc20, 0x2432b: 0x6cdd9c20, + 0x24337: 0x6c60c020, + 0x2433a: 0x6c285020, 0x2433b: 0x6c739c20, + 0x2433c: 0x6c930420, 0x2433e: 0x6c02f620, + // Block 0x90d, offset 0x24340 + 0x24342: 0x6d18ea20, 0x24343: 0x6cd57a20, + 0x24344: 0x6cdc9c20, 0x24345: 0x6cf0f220, 0x24346: 0x6cecec20, 0x24347: 0x6c1ef420, + 0x2434c: 0x6cf32820, + 0x24356: 0x6c0aa420, + 0x24358: 0x6d1b1a20, 0x24359: 0x6c5d8220, + 0x2435c: 0x6c769c20, 0x2435d: 0x6ca93020, + 0x24362: 0x6c00fc20, + 0x24364: 0x6c870020, 0x24366: 0x6d2d0220, + 0x24371: 0x6c933020, + 0x24376: 0x6c0bd420, 0x24377: 0x6cac8a20, + 0x2437f: 0x6c4b9c20, + // Block 0x90e, offset 0x24380 + 0x24380: 0x6cda6a20, 0x24381: 0x6c9ba020, 0x24382: 0x6cfc5220, 0x24383: 0x6c906e20, + 0x24385: 0x6cb80220, + 0x2438b: 0x6c164a20, + 0x2438c: 0x6d195c20, 0x2438d: 0x6c4f8e20, 0x2438f: 0x6c88e020, + 0x24390: 0x6c49c220, 0x24392: 0x6cf06020, + 0x24397: 0x6c752020, + 0x24398: 0x6c829c20, 0x24399: 0x6c946620, 0x2439a: 0x6c87a620, + 0x2439c: 0x6cb03e20, + 0x243a2: 0x6c58e820, + 0x243ae: 0x6c4a5820, + 0x243b3: 0x6c713420, + 0x243b6: 0x6c2aa220, + 0x243ba: 0x6c3ad220, + // Block 0x90f, offset 0x243c0 + 0x243c1: 0x6d338e20, 0x243c3: 0x6c9a7a20, + 0x243c5: 0x6c58f420, + 0x243c9: 0x6cabba20, 0x243ca: 0x6c08c420, + 0x243cc: 0x6cb30020, + 0x243d3: 0x6c374220, + 0x243d5: 0x6c58fc20, + 0x243e3: 0x6c170c20, + 0x243e5: 0x6c95fc20, 0x243e6: 0x6c3d2820, + 0x243ef: 0x6c1db220, + 0x243f1: 0x6d40c020, 0x243f2: 0x6ca3fe20, 0x243f3: 0x6cffae20, + 0x243f9: 0x6c044820, 0x243fa: 0x6c926620, + 0x243fc: 0x6c961220, 0x243ff: 0x6ca76620, + // Block 0x910, offset 0x24400 + 0x24400: 0x6d2ad020, + 0x24404: 0x6d3b0a20, 0x24405: 0x6c557420, + 0x24408: 0x6c5ad820, 0x24409: 0x6ce17c20, 0x2440a: 0x6c1dca20, + 0x24411: 0x6c59e020, 0x24412: 0x6c30b820, + 0x2441b: 0x6c9eba20, + 0x2441d: 0x6c0f5a20, + 0x24420: 0x6c2ca420, 0x24422: 0x6c2ad020, 0x24423: 0x6cb41620, + 0x24425: 0x6cd94020, 0x24426: 0x6c1dec20, + 0x2442b: 0x6d123c20, + 0x2442c: 0x6c9bf020, 0x2442d: 0x6c8fc820, + 0x24432: 0x6c888220, + 0x24435: 0x6c0d0620, + 0x2443a: 0x6c93c220, + 0x2443f: 0x6ccba020, + // Block 0x911, offset 0x24440 + 0x24440: 0x6d425820, + 0x24444: 0x6c25aa20, 0x24445: 0x6c8de420, 0x24446: 0x6d331a20, 0x24447: 0x6cb05220, + 0x24448: 0x6c05c220, 0x2444b: 0x6cc3a420, + 0x2444e: 0x6caf4a20, 0x2444f: 0x6ca44220, + 0x24450: 0x6caf4c20, 0x24451: 0x6c0fe220, 0x24452: 0x6c06f020, 0x24453: 0x6c37e820, + 0x24455: 0x6c9fa620, 0x24456: 0x6ca0f220, 0x24457: 0x6cec2420, + 0x24458: 0x6d2f6020, 0x24459: 0x6d35c220, 0x2445a: 0x6c240c20, + 0x2445f: 0x6d0a0620, + 0x24460: 0x6c602020, 0x24461: 0x6c4b4420, 0x24463: 0x6c19ea20, + 0x24467: 0x6c4ec620, + 0x24468: 0x6cfff220, 0x24469: 0x6cc3c020, 0x2446b: 0x6c21be20, + 0x2446d: 0x6c3f6420, + 0x24473: 0x6cbdde20, + 0x24474: 0x6c926820, 0x24475: 0x6cc3d020, 0x24476: 0x6c2d1e20, 0x24477: 0x6cb8f020, + 0x2447c: 0x6c16ee20, 0x2447d: 0x6cde6220, 0x2447e: 0x6c06ae20, + // Block 0x912, offset 0x24480 + 0x24481: 0x6c326c20, 0x24482: 0x6c082620, 0x24483: 0x6c547820, + 0x24488: 0x6d2c8420, 0x24489: 0x6d2c8620, + 0x2448e: 0x6cc3ee20, 0x2448f: 0x6c967620, + 0x24490: 0x6c4e2c20, 0x24493: 0x6c8e8620, + 0x24494: 0x6c92d020, 0x24496: 0x6d3e8c20, + 0x24498: 0x6cb07020, 0x24499: 0x6d395220, 0x2449b: 0x6d2a2420, + 0x2449d: 0x6ca9a020, + 0x244a0: 0x6c5c5620, 0x244a3: 0x6d092020, + 0x244a5: 0x6c7ea020, + 0x244ab: 0x6caa0620, + 0x244ac: 0x6d0dfa20, 0x244ad: 0x6cc4d820, 0x244ae: 0x6ca52220, + 0x244b0: 0x6c7eb420, 0x244b1: 0x6c4a1220, 0x244b2: 0x6c31e220, + 0x244b5: 0x6c919020, + 0x244b9: 0x6c663c20, 0x244ba: 0x6d028c20, 0x244bb: 0x6cb80e20, + 0x244be: 0x6cfe7420, + // Block 0x913, offset 0x244c0 + 0x244c1: 0x6c4cb020, 0x244c2: 0x6c6a8420, 0x244c3: 0x6c98b620, + 0x244c6: 0x6cf95820, 0x244c7: 0x6c7c3620, + 0x244ce: 0x6d1e7620, + 0x244d0: 0x6c4d3c20, 0x244d1: 0x6c9d3220, 0x244d2: 0x6d11fc20, + 0x244d5: 0x6cf14c20, + 0x244df: 0x6c85f220, + 0x244e0: 0x6c735820, 0x244e1: 0x6cf36420, 0x244e2: 0x6cbbda20, + 0x244ee: 0x6c2e2a20, 0x244ef: 0x6c1f4220, + 0x244f2: 0x6cdd1c20, + 0x244f5: 0x6c1cc420, + 0x244f8: 0x6cc2a020, 0x244f9: 0x6ccf5e20, + // Block 0x914, offset 0x24500 + 0x24502: 0x6c9bd820, 0x24503: 0x6c726820, + 0x2450b: 0x6ce8e620, + 0x24512: 0x6ca9c020, 0x24513: 0x6ca07a20, + 0x24519: 0x6c3bee20, + 0x24522: 0x6c027020, 0x24523: 0x6c4c3e20, + 0x24524: 0x6c55b420, 0x24525: 0x6c11b820, 0x24526: 0x6c33b220, 0x24527: 0x6c4d4820, + 0x24528: 0x6c694e20, + 0x24530: 0x6c473a20, + 0x24535: 0x6c6c6020, + 0x24538: 0x6d0fe420, + // Block 0x915, offset 0x24540 + 0x24540: 0x6c145020, + 0x2454c: 0x6c5b0820, + 0x24554: 0x6cc20c20, 0x24555: 0x6c784420, + 0x2455f: 0x6cbe6620, + 0x24560: 0x6d197a20, 0x24563: 0x6c767a20, + 0x24564: 0x6c68b820, 0x24567: 0x6c1d6220, + 0x24568: 0x6c103020, 0x24569: 0x6c44ae20, 0x2456a: 0x6c682620, 0x2456b: 0x6d339020, + 0x2456e: 0x6cf20020, + 0x24570: 0x6c0d2220, + 0x24574: 0x6d048820, 0x24575: 0x6c393020, + 0x24578: 0x6d147620, 0x24579: 0x6c203020, 0x2457a: 0x6d11ee20, + 0x2457d: 0x6d0f4c20, 0x2457e: 0x6c324020, 0x2457f: 0x6d0d4a20, + // Block 0x916, offset 0x24580 + 0x24581: 0x6c9b0a20, + 0x24587: 0x6c1a9620, + 0x24588: 0x6ca27420, 0x24589: 0x6c683420, 0x2458b: 0x6caa7a20, + 0x2458d: 0x6c4c6420, 0x2458e: 0x6d094a20, + 0x24591: 0x6c3e1c20, 0x24592: 0x6d08dc20, 0x24593: 0x6c3d4c20, + 0x24594: 0x6cae1020, 0x24595: 0x6ca0ea20, 0x24596: 0x6cf5a820, 0x24597: 0x6cf2dc20, + 0x24598: 0x6ccd3620, 0x2459b: 0x6cf5aa20, + 0x2459c: 0x6cb75a20, 0x2459d: 0x6c9e5220, + 0x245a6: 0x6c282820, + 0x245a8: 0x6c1e2820, + 0x245b1: 0x6c3a9c20, 0x245b2: 0x6c9ec820, + 0x245b4: 0x6d095020, 0x245b5: 0x6d06ae20, 0x245b6: 0x6cd7dc20, 0x245b7: 0x6c71b220, + 0x245b8: 0x6c993420, 0x245b9: 0x6c063e20, 0x245bb: 0x6d14d220, + 0x245bc: 0x6c485020, 0x245bd: 0x6ca69220, 0x245bf: 0x6d14d420, + // Block 0x917, offset 0x245c0 + 0x245c1: 0x6d429020, + 0x245c4: 0x6caa5420, + 0x245d1: 0x6c2d4820, 0x245d2: 0x6c393c20, 0x245d3: 0x6d173a20, + 0x245d4: 0x6cd35a20, 0x245d7: 0x6c240e20, + 0x245d8: 0x6d31ce20, + 0x245de: 0x6cd36a20, 0x245df: 0x6c68e620, + 0x245e0: 0x6c546a20, 0x245e1: 0x6c375020, + 0x245e6: 0x6c833220, 0x245e7: 0x6d095420, + 0x245e8: 0x6c452c20, 0x245ea: 0x6cd43220, + 0x245ec: 0x6c72ec20, + 0x245f4: 0x6c6ab820, 0x245f5: 0x6cef0020, 0x245f7: 0x6cd44620, + 0x245f8: 0x6c6e7620, 0x245fa: 0x6d061c20, 0x245fb: 0x6c1d4c20, + // Block 0x918, offset 0x24600 + 0x24605: 0x6c675e20, 0x24606: 0x6ca20a20, + 0x24609: 0x6d231a20, + 0x2460c: 0x6c745220, + 0x24611: 0x6ce6ea20, + 0x24614: 0x6cfec420, 0x24616: 0x6c30ac20, + 0x24618: 0x6c4c6c20, 0x24619: 0x6c986220, 0x2461a: 0x6cedcc20, 0x2461b: 0x6d06de20, + 0x2461c: 0x6cee5420, 0x2461d: 0x6cdd2020, 0x2461e: 0x6c736620, 0x2461f: 0x6d26b820, + 0x24621: 0x6c4e1620, 0x24623: 0x6ccfec20, + 0x24625: 0x6d00ac20, 0x24626: 0x6c8e5a20, 0x24627: 0x6cc8f020, + 0x2462f: 0x6c09a620, + 0x24632: 0x6ca53220, + 0x24636: 0x6ced8420, 0x24637: 0x6c700020, + 0x24638: 0x6cc38c20, + // Block 0x919, offset 0x24640 + 0x24644: 0x6ca6a220, 0x24646: 0x6c9c5220, 0x24647: 0x6cdd2220, + 0x24649: 0x6cbb4020, + 0x2464c: 0x6c4ed220, 0x2464d: 0x6d3d6c20, 0x2464e: 0x6c9c5e20, 0x2464f: 0x6d06f820, + 0x24651: 0x6c810420, 0x24652: 0x6c6aee20, 0x24653: 0x6c2faa20, + 0x24654: 0x6c171820, 0x24655: 0x6d365e20, 0x24656: 0x6c3a0c20, 0x24657: 0x6c63cc20, + 0x24658: 0x6c75cc20, 0x24659: 0x6c5dde20, 0x2465a: 0x6cb4fe20, 0x2465b: 0x6c70a620, + 0x2465c: 0x6d3cd420, 0x2465e: 0x6c2d6420, 0x2465f: 0x6c690c20, + 0x24660: 0x6d0af220, 0x24662: 0x6d2dfa20, + 0x2466d: 0x6d33f220, 0x2466f: 0x6c973620, + 0x24670: 0x6c54da20, 0x24671: 0x6d01ca20, 0x24672: 0x6cd27420, 0x24673: 0x6c4a7220, + 0x2467f: 0x6d06fa20, + // Block 0x91a, offset 0x24680 + 0x24682: 0x6c606a20, + 0x24684: 0x6c20b020, 0x24686: 0x6c99a220, 0x24687: 0x6cc84220, + 0x24688: 0x6d05bc20, 0x24689: 0x6c594620, 0x2468a: 0x6ccc6420, 0x2468b: 0x6c71c820, + 0x2468f: 0x6c7c0020, + 0x24691: 0x6c542020, 0x24692: 0x6c491e20, 0x24693: 0x6c486a20, + 0x24695: 0x6c9c6420, 0x24696: 0x6c2ed020, 0x24697: 0x6c0a0020, + 0x24698: 0x6c899820, 0x24699: 0x6c7e8620, 0x2469a: 0x6ccd5220, 0x2469b: 0x6c928c20, + 0x2469c: 0x6cf8b420, 0x2469f: 0x6cda2220, + 0x246ac: 0x6cab4220, 0x246ae: 0x6c838020, + 0x246b7: 0x6c7a5020, + 0x246b8: 0x6c4a7c20, 0x246bb: 0x6cf67a20, + 0x246bc: 0x6cac6c20, 0x246bd: 0x6ccb4c20, 0x246be: 0x6c754e20, 0x246bf: 0x6c53d020, + // Block 0x91b, offset 0x246c0 + 0x246c0: 0x6c49a220, 0x246c1: 0x6c727c20, 0x246c3: 0x6ca3d220, + 0x246c4: 0x6c575020, 0x246c5: 0x6c442220, 0x246c6: 0x6c866020, 0x246c7: 0x6c46d020, + 0x246c8: 0x6ce41420, 0x246ca: 0x6c96d820, 0x246cb: 0x6ce2ae20, + 0x246cc: 0x6c26ba20, + 0x246d0: 0x6cb52420, 0x246d1: 0x6d23c620, 0x246d2: 0x6c693020, 0x246d3: 0x6c9ee620, + 0x246d4: 0x6c451820, 0x246d5: 0x6c9c0e20, 0x246d6: 0x6cf0c020, + 0x246d8: 0x6ce36620, 0x246d9: 0x6cb63a20, + 0x246dc: 0x6c18e620, 0x246dd: 0x6c30c220, 0x246df: 0x6cac6e20, + 0x246f0: 0x6c4efc20, + 0x246f4: 0x6c9d8a20, 0x246f5: 0x6c967820, 0x246f6: 0x6c92d220, 0x246f7: 0x6cb53020, + 0x246f8: 0x6c795220, 0x246fa: 0x6c2ee820, 0x246fb: 0x6cb7d820, + 0x246fc: 0x6c687c20, 0x246fd: 0x6c774e20, 0x246fe: 0x6cbbb020, 0x246ff: 0x6c9d8c20, + // Block 0x91c, offset 0x24700 + 0x24700: 0x6ccd0c20, + 0x24707: 0x6c64da20, + 0x24708: 0x6c843c20, 0x24709: 0x6c78d620, 0x2470a: 0x6d073c20, + 0x24711: 0x6c977a20, 0x24712: 0x6c3cf420, 0x24713: 0x6c163420, + 0x24714: 0x6c5b6420, + 0x24727: 0x6c7a0420, + 0x2472a: 0x6cf02c20, 0x2472b: 0x6c49a820, + 0x2472c: 0x6c60c220, 0x2472d: 0x6d421c20, 0x2472e: 0x6c5e0a20, 0x2472f: 0x6d00fe20, + 0x24734: 0x6cdc8420, 0x24736: 0x6cc88220, + 0x24738: 0x6ce28620, + 0x2473c: 0x6d336820, 0x2473d: 0x6c7d8820, 0x2473e: 0x6cfe0020, 0x2473f: 0x6c9dda20, + // Block 0x91d, offset 0x24740 + 0x24741: 0x6cf8f020, + 0x2474c: 0x6cc94820, + 0x24759: 0x6c36c620, 0x2475a: 0x6c9efe20, 0x2475b: 0x6d3a8820, + 0x2475c: 0x6d406c20, 0x2475d: 0x6c9bec20, 0x2475f: 0x6cf70620, + 0x24761: 0x6ce14e20, 0x24763: 0x6c645220, + 0x24764: 0x6c16d020, 0x24765: 0x6c60dc20, + 0x2476e: 0x6d3dbc20, + 0x2477f: 0x6c520420, + // Block 0x91e, offset 0x24780 + 0x24780: 0x6c141020, 0x24781: 0x6cb7fc20, 0x24782: 0x6c9dea20, 0x24783: 0x6d320220, + 0x24784: 0x6c7a6c20, 0x24785: 0x6d138220, 0x24786: 0x6d38c020, + 0x24788: 0x6c652020, 0x2478a: 0x6cacc220, + 0x2478d: 0x6c5b0220, 0x2478f: 0x6ca02220, + 0x24790: 0x6c8f5020, + 0x24798: 0x6cd73420, 0x2479a: 0x6c974a20, 0x2479b: 0x6c849c20, + 0x2479e: 0x6cd7ae20, 0x2479f: 0x6d159020, + 0x247a4: 0x6c872c20, + 0x247a8: 0x6d005e20, 0x247a9: 0x6ce28a20, 0x247aa: 0x6d051020, + 0x247ad: 0x6d08ce20, 0x247ae: 0x6c874820, 0x247af: 0x6c9ba220, + 0x247b0: 0x6cef6a20, 0x247b1: 0x6c9ba420, + 0x247ba: 0x6d124e20, 0x247bb: 0x6c7ffe20, + 0x247bc: 0x6c8da020, 0x247bd: 0x6d1c3820, 0x247be: 0x6d1c3a20, 0x247bf: 0x6c876c20, + // Block 0x91f, offset 0x247c0 + 0x247c0: 0x6c662820, 0x247c1: 0x6c4aaa20, + 0x247c5: 0x6c494020, 0x247c6: 0x6d028220, + 0x247c9: 0x6ccf9220, 0x247cb: 0x6d418420, + 0x247d3: 0x6c771e20, + 0x247d4: 0x6c82a820, + 0x247da: 0x6c0bde20, + 0x247dd: 0x6cd54e20, 0x247de: 0x6caa7820, 0x247df: 0x6d069a20, + 0x247e3: 0x6c503020, + 0x247e8: 0x6c4af220, 0x247ea: 0x6d2d4020, 0x247eb: 0x6c80c620, + 0x247ec: 0x6c248e20, 0x247ed: 0x6d363620, 0x247ee: 0x6c3ca820, 0x247ef: 0x6cbd3220, + 0x247f1: 0x6d2acc20, 0x247f2: 0x6ca35420, 0x247f3: 0x6ca99a20, + 0x247f4: 0x6d17f420, 0x247f7: 0x6c232c20, + 0x247f8: 0x6cd1e020, 0x247f9: 0x6c65c220, 0x247fa: 0x6d3fa420, 0x247fb: 0x6d0db820, + 0x247fc: 0x6d1bd620, + // Block 0x920, offset 0x24800 + 0x24800: 0x6cc86e20, 0x24802: 0x6cc6a420, 0x24803: 0x6cf8cc20, + 0x24805: 0x6c492420, 0x24806: 0x6c769420, + 0x24808: 0x6cf51420, 0x2480a: 0x6cbda820, 0x2480b: 0x6c235820, + 0x2480d: 0x6d2b0620, 0x2480e: 0x6d024220, + 0x24810: 0x6d241020, 0x24811: 0x6d29a020, 0x24812: 0x6c206620, 0x24813: 0x6c853c20, + 0x24814: 0x6c853e20, 0x24815: 0x6d075020, 0x24816: 0x6c9c9020, 0x24817: 0x6d075420, + 0x24818: 0x6cc88c20, 0x2481b: 0x6c4b9420, + 0x2481c: 0x6cc73020, 0x2481f: 0x6c991420, + 0x24821: 0x6cbdbe20, 0x24822: 0x6c24be20, 0x24823: 0x6c24c020, + 0x24824: 0x6c24c620, + 0x2482e: 0x6cf35a20, + 0x24830: 0x6c383220, 0x24831: 0x6c037620, + 0x24838: 0x6cb85820, 0x24839: 0x6d35ee20, 0x2483a: 0x6ce5d420, + // Block 0x921, offset 0x24840 + 0x24844: 0x6d35f020, 0x24845: 0x6d345a20, 0x24847: 0x6c591420, + 0x24848: 0x6c1da420, 0x2484a: 0x6d35f220, + 0x2484e: 0x6d1cf020, + 0x24852: 0x6cf4f020, 0x24853: 0x6c06a420, + 0x24855: 0x6c534c20, 0x24856: 0x6cd06420, + 0x24858: 0x6c746620, 0x24859: 0x6c7d0420, + 0x2485c: 0x6d15f820, 0x2485d: 0x6d0bbe20, + 0x24860: 0x6c087c20, + 0x24864: 0x6c7aea20, 0x24865: 0x6cb8f220, + 0x24868: 0x6d2f6620, 0x2486a: 0x6c766820, 0x2486b: 0x6cce1220, + 0x2486e: 0x6c01ca20, 0x2486f: 0x6d307020, + 0x24870: 0x6d369420, + 0x24877: 0x6d36b620, + 0x24879: 0x6c693220, + // Block 0x922, offset 0x24880 + 0x24880: 0x6cd83020, 0x24881: 0x6cb45c20, 0x24882: 0x6cab9420, + 0x2488a: 0x6d3dbe20, + 0x24891: 0x6d1c3c20, 0x24893: 0x6c584a20, + 0x24895: 0x6d0b6e20, + 0x24898: 0x6cd23c20, 0x24899: 0x6cabb220, 0x2489a: 0x6cb48420, + 0x2489e: 0x6c983c20, 0x2489f: 0x6c146220, + 0x248a9: 0x6d278e20, + 0x248ac: 0x6c476a20, + 0x248b9: 0x6c282a20, 0x248bb: 0x6ca4a020, + 0x248bd: 0x6d302620, 0x248bf: 0x6c552c20, + // Block 0x923, offset 0x248c0 + 0x248c5: 0x6c792c20, 0x248c7: 0x6c2e8c20, + 0x248c8: 0x6ce63c20, 0x248cb: 0x6c48ee20, + 0x248ce: 0x6cbef020, 0x248cf: 0x6cd2ca20, + 0x248d0: 0x6c640c20, 0x248d1: 0x6c02ca20, 0x248d2: 0x6ca2f620, 0x248d3: 0x6cb23a20, + 0x248d4: 0x6c63b220, + 0x248e1: 0x6d30ec20, 0x248e2: 0x6c108620, 0x248e3: 0x6cf2b020, + 0x248e5: 0x6c141e20, + 0x248ea: 0x6ca4a420, 0x248eb: 0x6c76c620, + 0x248ef: 0x6c319220, + 0x248f0: 0x6c48f020, 0x248f1: 0x6cbf0e20, 0x248f3: 0x6cc66a20, + 0x248f4: 0x6d15e820, 0x248f5: 0x6c32fe20, 0x248f6: 0x6c82c020, + 0x248f8: 0x6d387a20, 0x248f9: 0x6c7ac220, 0x248fa: 0x6c354020, 0x248fb: 0x6cfa9e20, + 0x248fc: 0x6c2d5420, 0x248fd: 0x6caaf020, 0x248fe: 0x6c361620, 0x248ff: 0x6d1d8620, + // Block 0x924, offset 0x24900 + 0x24900: 0x6cf4e220, 0x24901: 0x6c793a20, + 0x24913: 0x6d35f420, + 0x24917: 0x6d351c20, + 0x24918: 0x6d0a0820, 0x2491b: 0x6d334a20, + 0x2491e: 0x6d0fae20, + 0x24920: 0x6c5dc420, 0x24921: 0x6c602220, 0x24922: 0x6ca4f020, + 0x24927: 0x6d0ba020, + 0x24928: 0x6c924620, 0x2492b: 0x6c3d7220, + 0x2492c: 0x6cca1c20, 0x2492d: 0x6c1f4420, 0x2492e: 0x6cefca20, + 0x24930: 0x6c3f6820, 0x24931: 0x6c794020, 0x24932: 0x6cd8c020, 0x24933: 0x6c778620, + 0x24935: 0x6d17b020, 0x24936: 0x6c579a20, + 0x2493e: 0x6d225e20, + // Block 0x925, offset 0x24940 + 0x24943: 0x6c861420, + 0x24946: 0x6c8c2020, 0x24947: 0x6c321e20, + 0x24948: 0x6c363c20, + 0x2494c: 0x6cbb4220, 0x2494d: 0x6c31a620, + 0x24950: 0x6c6af020, 0x24951: 0x6c21c620, 0x24952: 0x6cfcd420, + 0x24956: 0x6c430a20, + 0x2496c: 0x6c2a1e20, + 0x24970: 0x6c52b420, + 0x2497b: 0x6d3fa620, + 0x2497e: 0x6cb7b620, 0x2497f: 0x6ceb3820, + // Block 0x926, offset 0x24980 + 0x24980: 0x6c52b820, 0x24981: 0x6cb06420, 0x24982: 0x6c453c20, + 0x24984: 0x6ca85020, 0x24987: 0x6c798420, + 0x2498a: 0x6d354620, + 0x24991: 0x6cffb420, + 0x249a1: 0x6ccf6620, 0x249a2: 0x6d217620, 0x249a3: 0x6c676a20, + 0x249a9: 0x6cb70a20, 0x249aa: 0x6c190a20, 0x249ab: 0x6cca8220, + 0x249ad: 0x6cdd8e20, 0x249ae: 0x6cb9bc20, 0x249af: 0x6c5c1a20, + 0x249b1: 0x6ccda020, 0x249b2: 0x6c368c20, + 0x249bb: 0x6cbfbc20, + 0x249bd: 0x6c78ca20, + // Block 0x927, offset 0x249c0 + 0x249c0: 0x6cf23420, 0x249c1: 0x6d3e7c20, 0x249c2: 0x6c608e20, + 0x249c7: 0x6c26e220, + 0x249c9: 0x6c263620, + 0x249cd: 0x6c90f620, 0x249ce: 0x6c775020, 0x249cf: 0x6c7e1220, + 0x249d0: 0x6c2b8e20, 0x249d1: 0x6cbc7e20, 0x249d3: 0x6ca16420, + 0x249d6: 0x6c4cce20, 0x249d7: 0x6c52c620, + 0x249d8: 0x6c177c20, 0x249d9: 0x6c522620, + 0x249e2: 0x6c129020, 0x249e3: 0x6d308c20, + 0x249e6: 0x6c4bea20, + 0x249f0: 0x6d05ec20, 0x249f1: 0x6caece20, 0x249f2: 0x6c74ca20, + 0x249f5: 0x6c41ee20, 0x249f6: 0x6cd83220, + 0x249f8: 0x6cdc8620, 0x249f9: 0x6cc40420, 0x249fb: 0x6cf3f220, + 0x249fc: 0x6d0cda20, 0x249fd: 0x6caf1820, 0x249fe: 0x6cffc420, 0x249ff: 0x6cac4820, + // Block 0x928, offset 0x24a00 + 0x24a0d: 0x6c7e9e20, + 0x24a17: 0x6c085a20, + 0x24a18: 0x6d320020, 0x24a19: 0x6c60de20, + 0x24a1c: 0x6c6cc020, 0x24a1d: 0x6c887420, 0x24a1e: 0x6c791220, + 0x24a20: 0x6d38d620, + 0x24a28: 0x6d2a9620, 0x24a2a: 0x6c822e20, 0x24a2b: 0x6cb54820, + 0x24a2c: 0x6c0e3820, + 0x24a35: 0x6d1b1c20, 0x24a36: 0x6cb1f620, + 0x24a3b: 0x6cda3820, + 0x24a3c: 0x6c941620, 0x24a3e: 0x6c2bb420, 0x24a3f: 0x6c31e420, + // Block 0x929, offset 0x24a40 + 0x24a40: 0x6c8a8820, 0x24a41: 0x6d3dd620, + 0x24a4a: 0x6c16fc20, + 0x24a52: 0x6c194020, 0x24a53: 0x6cdee020, + 0x24a59: 0x6cc41e20, 0x24a5a: 0x6c2a4c20, + 0x24a5d: 0x6cc51020, 0x24a5f: 0x6cb3ba20, + 0x24a66: 0x6d37e020, 0x24a67: 0x6d006020, + 0x24a6a: 0x6c679620, 0x24a6b: 0x6cc21820, + 0x24a6c: 0x6c831020, 0x24a6d: 0x6c10f020, 0x24a6e: 0x6cc39a20, + 0x24a75: 0x6cfe7220, 0x24a76: 0x6c836820, + 0x24a7a: 0x6c809620, + 0x24a7f: 0x6c7e6820, + // Block 0x92a, offset 0x24a80 + 0x24a81: 0x6c7e6a20, + 0x24a84: 0x6d24b420, + 0x24a8a: 0x6c697e20, 0x24a8b: 0x6cbd4e20, + 0x24a8c: 0x6c5e7e20, 0x24a8f: 0x6c41c820, + 0x24a92: 0x6d169220, + 0x24aa0: 0x6d16c820, 0x24aa1: 0x6d339e20, + 0x24aa4: 0x6c0c6e20, 0x24aa5: 0x6cd0e620, 0x24aa6: 0x6c6fd820, + 0x24aab: 0x6c509420, + 0x24aac: 0x6c3e2020, 0x24aae: 0x6c706620, + // Block 0x92b, offset 0x24ac0 + 0x24ac0: 0x6d426620, 0x24ac1: 0x6d14ac20, + 0x24ac6: 0x6cfc9420, 0x24ac7: 0x6d14ae20, + 0x24ac9: 0x6cd8a220, 0x24acb: 0x6c20f220, + 0x24ace: 0x6ca0fa20, + 0x24ae1: 0x6d2d6c20, 0x24ae3: 0x6d0a0020, + 0x24ae6: 0x6cc79a20, + 0x24ae8: 0x6c5db020, + 0x24aec: 0x6cce6a20, + 0x24af0: 0x6cd46620, + 0x24afe: 0x6d203e20, 0x24aff: 0x6d231c20, + // Block 0x92c, offset 0x24b00 + 0x24b02: 0x6c75b420, + 0x24b09: 0x6d3e4220, 0x24b0a: 0x6c925c20, + 0x24b1a: 0x6c1baa20, 0x24b1b: 0x6c7d6620, + 0x24b20: 0x6d3ce420, + 0x24b26: 0x6c541420, + 0x24b29: 0x6d064420, + 0x24b3e: 0x6d3f9c20, 0x24b3f: 0x6d1d4220, + // Block 0x92d, offset 0x24b40 + 0x24b42: 0x6d39b020, + 0x24b45: 0x6c8f3a20, + 0x24b51: 0x6caa6820, + 0x24b58: 0x6c0a3020, 0x24b5a: 0x6c1c5e20, + 0x24b5c: 0x6d412420, 0x24b5d: 0x6c3cb820, 0x24b5e: 0x6c92aa20, 0x24b5f: 0x6cb49220, + 0x24b65: 0x6d3bdc20, 0x24b67: 0x6d308020, + 0x24b68: 0x6cd1ec20, 0x24b69: 0x6d227e20, 0x24b6a: 0x6c92ac20, 0x24b6b: 0x6c896820, + 0x24b6f: 0x6c74c020, + 0x24b70: 0x6c8aa620, 0x24b71: 0x6c080820, + // Block 0x92e, offset 0x24b80 + 0x24b83: 0x6d18ce20, + 0x24b84: 0x6c492820, + 0x24b8c: 0x6c02ae20, 0x24b8f: 0x6c4b8220, + 0x24b90: 0x6c9fce20, 0x24b92: 0x6d0dec20, 0x24b93: 0x6c7fd220, + 0x24b96: 0x6c0f9220, + 0x24b99: 0x6d29a620, 0x24b9a: 0x6d1ffe20, + 0x24ba5: 0x6d194420, 0x24ba6: 0x6ca66020, + 0x24bac: 0x6ca66620, 0x24bad: 0x6c4ce020, 0x24bae: 0x6c760a20, + 0x24bb0: 0x6cd21820, 0x24bb2: 0x6cfc5c20, + 0x24bb4: 0x6cb95e20, 0x24bb5: 0x6cc42020, 0x24bb6: 0x6c7cc420, + // Block 0x92f, offset 0x24bc0 + 0x24bc0: 0x6ccf1620, 0x24bc2: 0x6c5dd620, + 0x24bc4: 0x6ced8e20, + 0x24bca: 0x6c3af220, 0x24bcb: 0x6c3b0020, + 0x24bcd: 0x6d22c420, + 0x24bd1: 0x6d339220, 0x24bd2: 0x6c48a420, + 0x24bd4: 0x6c6a8620, 0x24bd5: 0x6c983e20, 0x24bd6: 0x6c50cc20, + 0x24bd8: 0x6d1fa820, + 0x24bdf: 0x6c324220, + 0x24be0: 0x6cd7d220, 0x24be2: 0x6c859420, + 0x24be5: 0x6c6a9420, 0x24be6: 0x6ca98a20, 0x24be7: 0x6c03ac20, + 0x24be8: 0x6d20de20, + 0x24bee: 0x6d33b220, + 0x24bf8: 0x6c50e020, 0x24bf9: 0x6c77e820, + 0x24bfe: 0x6c324a20, 0x24bff: 0x6c634820, + // Block 0x930, offset 0x24c00 + 0x24c01: 0x6c186020, 0x24c03: 0x6c20f420, + 0x24c04: 0x6c50f820, 0x24c05: 0x6d2d2620, + 0x24c0a: 0x6c9a8c20, + 0x24c0d: 0x6c50fa20, 0x24c0e: 0x6d3f0420, 0x24c0f: 0x6d3a0620, + 0x24c12: 0x6ceb0e20, + 0x24c18: 0x6d421820, 0x24c1a: 0x6cc7a220, 0x24c1b: 0x6c34ee20, + 0x24c1c: 0x6c67e020, + 0x24c27: 0x6c526420, + 0x24c29: 0x6c07e620, 0x24c2a: 0x6ca10820, + 0x24c2f: 0x6d40ba20, + 0x24c32: 0x6c0caa20, + 0x24c34: 0x6c7a9820, 0x24c35: 0x6c63c020, + 0x24c3a: 0x6d3d0420, + 0x24c3c: 0x6d04d620, + // Block 0x931, offset 0x24c40 + 0x24c43: 0x6c512820, + 0x24c45: 0x6cbb7220, + 0x24c4d: 0x6c3a5c20, 0x24c4e: 0x6cd10a20, + 0x24c52: 0x6d3c9620, 0x24c53: 0x6c7b6a20, + 0x24c54: 0x6d2b5420, 0x24c55: 0x6cfaae20, 0x24c57: 0x6c09d620, + 0x24c58: 0x6d17f620, 0x24c5a: 0x6c171a20, + 0x24c6a: 0x6c999a20, + 0x24c76: 0x6ced3020, + 0x24c7d: 0x6cf37620, 0x24c7e: 0x6c7a5220, 0x24c7f: 0x6cf2be20, + // Block 0x932, offset 0x24c80 + 0x24c80: 0x6d038a20, 0x24c81: 0x6c781620, 0x24c83: 0x6c6f8220, + 0x24c84: 0x6c329c20, 0x24c85: 0x6c594820, + 0x24c88: 0x6d369620, 0x24c89: 0x6c130620, 0x24c8a: 0x6cc75a20, 0x24c8b: 0x6c606e20, + 0x24c8d: 0x6d131a20, + 0x24c9b: 0x6c6dca20, + 0x24c9c: 0x6d106220, + 0x24ca1: 0x6d400220, + 0x24ca9: 0x6c11d620, + 0x24cb1: 0x6cd81c20, 0x24cb2: 0x6c866220, 0x24cb3: 0x6c47c620, + 0x24cb4: 0x6c172220, 0x24cb6: 0x6c3a6820, 0x24cb7: 0x6c8e8a20, + 0x24cb9: 0x6c6b1e20, 0x24cba: 0x6d276020, + 0x24cbd: 0x6d36ba20, + // Block 0x933, offset 0x24cc0 + 0x24cc0: 0x6c1dd220, 0x24cc1: 0x6c0cbc20, + 0x24cd2: 0x6c5f1a20, + 0x24cdc: 0x6c955220, 0x24cdd: 0x6c64f820, 0x24cdf: 0x6c206020, + 0x24ce0: 0x6cd6de20, 0x24ce2: 0x6c93fe20, 0x24ce3: 0x6c75ea20, + 0x24ce4: 0x6c69c820, 0x24ce6: 0x6ce42020, 0x24ce7: 0x6d2c0020, + 0x24cea: 0x6d18a820, + 0x24cec: 0x6c235a20, 0x24ced: 0x6ca57420, 0x24cee: 0x6c638220, + 0x24cf4: 0x6c627c20, + 0x24cfd: 0x6c00ce20, + // Block 0x934, offset 0x24d00 + 0x24d07: 0x6c65d820, + 0x24d0a: 0x6c07ca20, + 0x24d0c: 0x6c38c620, 0x24d0d: 0x6cdc8a20, 0x24d0e: 0x6d421e20, + 0x24d10: 0x6c42e420, 0x24d11: 0x6c432420, 0x24d12: 0x6c817e20, + 0x24d14: 0x6d3db620, + 0x24d1f: 0x6c56ca20, + 0x24d22: 0x6ce9c420, + 0x24d26: 0x6c0a7420, 0x24d27: 0x6c716420, + 0x24d2e: 0x6c575a20, + 0x24d32: 0x6c1a4a20, + 0x24d36: 0x6c7b4220, 0x24d37: 0x6c291420, + 0x24d38: 0x6c444c20, 0x24d39: 0x6d011420, 0x24d3b: 0x6c6b6220, + 0x24d3d: 0x6c117620, + // Block 0x935, offset 0x24d40 + 0x24d46: 0x6d40ec20, + 0x24d48: 0x6cb46820, 0x24d4b: 0x6cd57c20, + 0x24d4c: 0x6c104820, + 0x24d57: 0x6ca93220, + 0x24d58: 0x6d0dfc20, 0x24d59: 0x6d396020, 0x24d5b: 0x6c9b8420, + 0x24d5d: 0x6c0b5e20, 0x24d5f: 0x6cfe6420, + 0x24d64: 0x6c931c20, 0x24d65: 0x6c849020, + 0x24d69: 0x6c62ca20, 0x24d6b: 0x6c9f0a20, + 0x24d6c: 0x6c835620, 0x24d6e: 0x6d375820, 0x24d6f: 0x6d1ecc20, + 0x24d70: 0x6c0b6020, + 0x24d78: 0x6ca2bc20, 0x24d79: 0x6cc4da20, + // Block 0x936, offset 0x24d80 + 0x24d82: 0x6ca7c620, + 0x24d8a: 0x6cc33a20, 0x24d8b: 0x6d30c620, + 0x24d90: 0x6c836620, + 0x24d97: 0x6c294820, + 0x24d98: 0x6c752e20, + 0x24d9c: 0x6c8dc420, 0x24d9e: 0x6c8de820, 0x24d9f: 0x6d0d2620, + 0x24da3: 0x6d118620, + 0x24da4: 0x6d321220, 0x24da5: 0x6cb4ce20, 0x24da6: 0x6c008a20, + 0x24da8: 0x6caa3e20, 0x24da9: 0x6c988220, + 0x24db1: 0x6c76c220, 0x24db3: 0x6c6f5c20, + 0x24db4: 0x6d0d5820, 0x24db5: 0x6c9e5420, 0x24db7: 0x6d1a3e20, + 0x24db8: 0x6ceccc20, 0x24db9: 0x6d11f420, 0x24dba: 0x6cebce20, 0x24dbb: 0x6cafc820, + 0x24dbc: 0x6cdc2c20, + // Block 0x937, offset 0x24dc0 + 0x24dc5: 0x6c799a20, + 0x24dc8: 0x6c532c20, 0x24dca: 0x6ca03020, 0x24dcb: 0x6c8cd220, + 0x24dcc: 0x6d173e20, 0x24dcd: 0x6ccfd220, 0x24dcf: 0x6d429220, + 0x24ddb: 0x6ce85020, + 0x24ddd: 0x6d1e7820, 0x24ddf: 0x6cec2620, + 0x24de0: 0x6c4af420, 0x24de1: 0x6c53bc20, + 0x24de5: 0x6cd36e20, 0x24de7: 0x6d049220, + 0x24de9: 0x6c000620, + 0x24df1: 0x6c19ee20, 0x24df3: 0x6c793c20, + 0x24df4: 0x6d176c20, 0x24df5: 0x6d104820, 0x24df6: 0x6ce67420, 0x24df7: 0x6c311e20, + 0x24df8: 0x6c13e820, 0x24df9: 0x6c8f3020, + 0x24dfd: 0x6cc06a20, 0x24dfe: 0x6d084e20, 0x24dff: 0x6ccfee20, + // Block 0x938, offset 0x24e00 + 0x24e00: 0x6c7b5420, 0x24e01: 0x6ce7ca20, 0x24e03: 0x6cba0e20, + 0x24e05: 0x6c1e4220, + 0x24e0a: 0x6cf1de20, + 0x24e0c: 0x6c906820, 0x24e0d: 0x6c018820, + 0x24e14: 0x6c76d820, 0x24e16: 0x6d11b020, + 0x24e18: 0x6c3e8420, + 0x24e1c: 0x6c084220, 0x24e1d: 0x6c803020, 0x24e1e: 0x6cb86c20, 0x24e1f: 0x6c2d6620, + 0x24e22: 0x6c69a620, 0x24e23: 0x6c4a7420, + 0x24e25: 0x6d049820, + 0x24e28: 0x6c78bc20, + 0x24e36: 0x6cfcd620, 0x24e37: 0x6cf33a20, + // Block 0x939, offset 0x24e40 + 0x24e42: 0x6c45f620, + 0x24e46: 0x6cab8620, 0x24e47: 0x6c781820, + 0x24e4b: 0x6c7a5420, + 0x24e51: 0x6ce4be20, 0x24e52: 0x6c46d420, 0x24e53: 0x6c96a220, + 0x24e55: 0x6c8f3e20, + 0x24e59: 0x6cf0c220, 0x24e5a: 0x6cf1ec20, + 0x24e61: 0x6c462020, 0x24e63: 0x6ce8e820, + 0x24e64: 0x6ca91620, 0x24e67: 0x6c9d7c20, + 0x24e6b: 0x6c80e020, + 0x24e6c: 0x6cba2220, 0x24e6d: 0x6c977e20, 0x24e6e: 0x6d308e20, + 0x24e70: 0x6c57c620, 0x24e71: 0x6d1db620, 0x24e72: 0x6c6d5020, + 0x24e74: 0x6c9aae20, 0x24e77: 0x6c3ef020, + 0x24e7b: 0x6cc1c220, + // Block 0x93a, offset 0x24e80 + 0x24e8c: 0x6c8f4820, 0x24e8d: 0x6c406220, 0x24e8e: 0x6c28c620, + 0x24e90: 0x6c460020, 0x24e92: 0x6c256e20, + 0x24e95: 0x6d040c20, + 0x24e9c: 0x6ce87c20, 0x24e9d: 0x6cd48020, + 0x24eaa: 0x6cbf8420, + 0x24eb3: 0x6cc6e020, + 0x24ebb: 0x6c874c20, + 0x24ebf: 0x6c5f9220, + // Block 0x93b, offset 0x24ec0 + 0x24ec0: 0x6cebbc20, + 0x24ecc: 0x6ce7aa20, + 0x24ed2: 0x6ce04c20, + 0x24ed4: 0x6c8dea20, 0x24ed6: 0x6d169420, 0x24ed7: 0x6cc85220, + 0x24ed9: 0x6cabe220, + 0x24edd: 0x6c10e820, + 0x24ee1: 0x6d269820, 0x24ee2: 0x6cc3b020, 0x24ee3: 0x6d3ade20, + 0x24ee4: 0x6c4d6220, + 0x24ef1: 0x6c381220, 0x24ef2: 0x6c4d6820, + // Block 0x93c, offset 0x24f00 + 0x24f00: 0x6c101620, 0x24f01: 0x6cb25620, 0x24f02: 0x6c8b0c20, + 0x24f0a: 0x6c7cd420, 0x24f0b: 0x6c3e9e20, + 0x24f0c: 0x6ce50620, 0x24f0d: 0x6cf2fc20, 0x24f0f: 0x6c70aa20, + 0x24f18: 0x6d318620, 0x24f1a: 0x6c3ec620, + 0x24f22: 0x6c8f9e20, + 0x24f26: 0x6cf8ce20, 0x24f27: 0x6ce4c020, + 0x24f2b: 0x6c626620, + 0x24f2f: 0x6d122c20, + 0x24f31: 0x6c246620, + 0x24f34: 0x6cad3020, 0x24f35: 0x6cbce820, + 0x24f3b: 0x6c8fb420, + 0x24f3c: 0x6c615820, + // Block 0x93d, offset 0x24f40 + 0x24f42: 0x6ce79a20, 0x24f43: 0x6d158420, + 0x24f45: 0x6c168420, + 0x24f4b: 0x6c45c220, + 0x24f4e: 0x6c309620, + 0x24f56: 0x6cfda420, + 0x24f59: 0x6ce6b620, 0x24f5b: 0x6d3b7020, + 0x24f5c: 0x6d15c820, 0x24f5d: 0x6d170020, 0x24f5e: 0x6d3ef820, 0x24f5f: 0x6cb6e020, + 0x24f62: 0x6c141a20, + 0x24f6c: 0x6c33e220, 0x24f6f: 0x6c1cbc20, + 0x24f70: 0x6c922a20, 0x24f71: 0x6c33ea20, 0x24f73: 0x6c399220, + 0x24f74: 0x6cd35c20, 0x24f75: 0x6ce3e420, 0x24f76: 0x6c5eaa20, 0x24f77: 0x6cbfaa20, + 0x24f78: 0x6cd70e20, 0x24f79: 0x6c18b020, + 0x24f7c: 0x6c5a6820, 0x24f7d: 0x6cd41220, + // Block 0x93e, offset 0x24f80 + 0x24f80: 0x6d279c20, + 0x24f86: 0x6c8f8420, + 0x24f88: 0x6c97b620, 0x24f89: 0x6c464220, + 0x24f8d: 0x6cfaa020, 0x24f8e: 0x6ca10a20, + 0x24f90: 0x6cd05e20, 0x24f92: 0x6cb30820, 0x24f93: 0x6d120420, + 0x24f94: 0x6cc0fa20, 0x24f95: 0x6cc4c020, + 0x24f99: 0x6c724220, + 0x24f9c: 0x6d1ada20, 0x24f9d: 0x6c041020, 0x24f9e: 0x6ca81c20, + 0x24fa0: 0x6c1d6c20, + 0x24faa: 0x6cc67820, 0x24fab: 0x6c202020, + 0x24fac: 0x6ca83420, 0x24fad: 0x6c861620, 0x24fae: 0x6c676220, 0x24faf: 0x6c77ac20, + 0x24fb0: 0x6c12f020, 0x24fb1: 0x6c1d5220, 0x24fb2: 0x6d3b5620, 0x24fb3: 0x6d3f1420, + 0x24fb4: 0x6d0fb820, + 0x24fbc: 0x6cf1e020, + // Block 0x93f, offset 0x24fc0 + 0x24fcb: 0x6c620420, + 0x24fcc: 0x6c620620, + 0x24fd0: 0x6c93e820, 0x24fd1: 0x6cc07820, 0x24fd2: 0x6c33fc20, 0x24fd3: 0x6c05cc20, + 0x24fd4: 0x6c14ce20, 0x24fd6: 0x6c0f1620, + 0x24fd8: 0x6c1abe20, 0x24fd9: 0x6d30fa20, 0x24fda: 0x6c98b820, + 0x24fdc: 0x6c621c20, 0x24fdd: 0x6c9eb620, 0x24fde: 0x6d262620, + 0x24fe0: 0x6cf3d220, 0x24fe1: 0x6d366420, 0x24fe2: 0x6cb25c20, + 0x24fe5: 0x6c1ccc20, + 0x24feb: 0x6c9c6020, + 0x24fec: 0x6c3a3c20, 0x24fed: 0x6c25c020, 0x24fee: 0x6c9b2420, + // Block 0x940, offset 0x25000 + 0x2500d: 0x6d1a8220, 0x2500e: 0x6c989a20, 0x2500f: 0x6c2d2420, + 0x25010: 0x6c2dd620, 0x25012: 0x6cb9b420, + 0x25015: 0x6c4f9820, 0x25016: 0x6d348620, 0x25017: 0x6c713e20, + 0x25018: 0x6ca76820, + 0x2501c: 0x6c9c6620, 0x2501d: 0x6c47b620, + 0x25023: 0x6d3b5820, + 0x25024: 0x6ca85220, 0x25025: 0x6d3d8420, 0x25027: 0x6d131c20, + 0x25028: 0x6c23dc20, 0x2502a: 0x6d05be20, + 0x2502c: 0x6cf8b820, 0x2502f: 0x6c0e8420, + 0x2503e: 0x6c11d820, + // Block 0x941, offset 0x25040 + 0x25043: 0x6d0dba20, + 0x25051: 0x6c6cb220, + 0x25054: 0x6c71ce20, 0x25055: 0x6c298620, 0x25056: 0x6c327620, + 0x25058: 0x6d128c20, 0x25059: 0x6c6ea020, 0x2505a: 0x6c78cc20, 0x2505b: 0x6c962220, + 0x2505c: 0x6cf00220, 0x2505d: 0x6ce87620, 0x2505e: 0x6d1f6020, 0x2505f: 0x6cac3020, + 0x25061: 0x6cb01020, 0x25062: 0x6c2fb820, + 0x25064: 0x6cf00420, 0x25065: 0x6c183620, 0x25066: 0x6c66bc20, + 0x25068: 0x6cd81e20, 0x25069: 0x6d3d8a20, 0x2506a: 0x6cda4020, + 0x2506c: 0x6cc87420, 0x2506e: 0x6d218420, + 0x25073: 0x6c368e20, + 0x25076: 0x6c7a7e20, + 0x25078: 0x6d3b2220, + 0x2507e: 0x6cf9e820, + // Block 0x942, offset 0x25080 + 0x2509b: 0x6c3ef220, + 0x2509c: 0x6ce23e20, 0x2509d: 0x6cf6d020, 0x2509e: 0x6c1d8020, 0x2509f: 0x6c41ec20, + 0x250a0: 0x6c936420, 0x250a1: 0x6c131620, 0x250a2: 0x6ccdb220, 0x250a3: 0x6c8e9c20, + 0x250a5: 0x6cf8e020, 0x250a6: 0x6c5f3e20, 0x250a7: 0x6d161220, + 0x250a8: 0x6ce01220, 0x250aa: 0x6c55b620, + 0x250ad: 0x6c25c820, 0x250ae: 0x6c447820, + 0x250b0: 0x6cd3dc20, 0x250b1: 0x6ccac020, 0x250b2: 0x6c53d420, 0x250b3: 0x6cfd0e20, + 0x250b6: 0x6cf9f020, + 0x250bb: 0x6ca2ae20, + 0x250bc: 0x6cdd9620, 0x250be: 0x6d2d4c20, + // Block 0x943, offset 0x250c0 + 0x250c0: 0x6c3d9e20, 0x250c1: 0x6ccb6220, 0x250c2: 0x6caa4620, 0x250c3: 0x6d18ac20, + 0x250e7: 0x6cbdaa20, + 0x250e8: 0x6cbedc20, + 0x250f5: 0x6c5c5a20, 0x250f6: 0x6cd6e220, 0x250f7: 0x6c284a20, + 0x250f8: 0x6cab5420, 0x250f9: 0x6ca17420, 0x250fa: 0x6cb92420, 0x250fb: 0x6c1c8020, + 0x250fc: 0x6cac0620, 0x250fd: 0x6c739620, + // Block 0x944, offset 0x25100 + 0x25100: 0x6c178020, 0x25101: 0x6c8b3c20, 0x25102: 0x6c0db420, 0x25103: 0x6c7a0a20, + 0x25104: 0x6c28c820, 0x25105: 0x6c1dee20, 0x25106: 0x6ce70620, 0x25107: 0x6c28ca20, + 0x25108: 0x6c97ce20, 0x25109: 0x6c56ce20, 0x2510a: 0x6c8a2820, 0x2510b: 0x6cfbae20, + 0x2510d: 0x6c129820, 0x2510e: 0x6c92ea20, 0x2510f: 0x6c204220, + 0x25110: 0x6cf3f420, 0x25111: 0x6c978820, + 0x25115: 0x6d3f2420, 0x25117: 0x6c328020, + 0x2511a: 0x6cd6f220, 0x2511b: 0x6c406420, + 0x2511c: 0x6c72a620, 0x2511d: 0x6d395820, 0x2511f: 0x6c2e4220, + 0x25120: 0x6cee5a20, 0x25121: 0x6c206820, 0x25122: 0x6cb92620, 0x25123: 0x6cea1220, + 0x25125: 0x6c886420, 0x25126: 0x6c0c2e20, 0x25127: 0x6c845420, + 0x2512a: 0x6c845620, + // Block 0x945, offset 0x25140 + 0x25146: 0x6c0a9220, 0x25147: 0x6c407620, + 0x25148: 0x6c257820, 0x25149: 0x6c318020, 0x2514b: 0x6d29a820, + 0x2514c: 0x6c8fb620, 0x2514d: 0x6d0a4a20, 0x2514e: 0x6cbf7a20, 0x2514f: 0x6c5f6e20, + 0x25150: 0x6cba2c20, 0x25152: 0x6c65fa20, 0x25153: 0x6cce9020, + 0x25154: 0x6c351e20, 0x25155: 0x6cd51620, 0x25156: 0x6c10c820, 0x25157: 0x6d05f820, + 0x25158: 0x6c304420, 0x2515a: 0x6cc49220, + 0x2515c: 0x6d0fe620, 0x2515d: 0x6cc8b420, 0x2515e: 0x6c8c7020, 0x2515f: 0x6c65fc20, + 0x25160: 0x6c2ca820, 0x25161: 0x6c3ba020, 0x25162: 0x6c2d9020, 0x25163: 0x6d41dc20, + 0x25165: 0x6ca94820, + 0x2516a: 0x6cdba020, 0x2516b: 0x6ce52420, + 0x2516c: 0x6c01da20, 0x2516f: 0x6c131c20, + 0x25170: 0x6c2fc220, 0x25171: 0x6cd02820, 0x25172: 0x6c328420, 0x25173: 0x6ce39420, + 0x25174: 0x6c695420, 0x25175: 0x6d41de20, 0x25176: 0x6d2f1020, 0x25177: 0x6c65fe20, + 0x25178: 0x6c28da20, 0x25179: 0x6c285420, 0x2517a: 0x6cd97420, + // Block 0x946, offset 0x25180 + 0x25190: 0x6d2e2620, 0x25191: 0x6ce69620, 0x25192: 0x6d372a20, + 0x25195: 0x6d1f8220, 0x25196: 0x6cac0e20, + 0x251a1: 0x6c854220, + 0x251a4: 0x6cb9d820, 0x251a6: 0x6cdca620, 0x251a7: 0x6c71dc20, + 0x251a8: 0x6c010020, 0x251a9: 0x6c445020, 0x251aa: 0x6c72b420, 0x251ab: 0x6cea7220, + 0x251ac: 0x6c0aa620, 0x251ad: 0x6cb87e20, 0x251ae: 0x6c0fa820, 0x251af: 0x6c5c7c20, + 0x251b1: 0x6c670020, + 0x251b4: 0x6c466420, 0x251b5: 0x6cdba420, + 0x251ba: 0x6c227a20, 0x251bb: 0x6cbb5c20, + 0x251bf: 0x6d0cf420, + // Block 0x947, offset 0x251c0 + 0x251cf: 0x6c2d9420, + 0x251d2: 0x6c9f0420, + 0x251dc: 0x6cb3b620, 0x251dd: 0x6c8e1620, 0x251de: 0x6c6b7420, 0x251df: 0x6d3b3e20, + 0x251e0: 0x6c47ee20, 0x251e3: 0x6c32aa20, + 0x251e4: 0x6d2fee20, 0x251e6: 0x6ccebe20, 0x251e7: 0x6cbdf020, + 0x251e8: 0x6c9ca420, 0x251ea: 0x6cb2e220, 0x251eb: 0x6c23c020, + 0x251ec: 0x6c1d8820, 0x251ef: 0x6cc9ae20, + 0x251f6: 0x6ce52620, + // Block 0x948, offset 0x25200 + 0x25205: 0x6c8edc20, 0x25206: 0x6c936c20, 0x25207: 0x6c91fc20, + 0x25208: 0x6d407620, + 0x2520c: 0x6c941e20, 0x2520d: 0x6c58e620, 0x2520f: 0x6ce5b420, + 0x25210: 0x6ce9d820, 0x25211: 0x6cbb5220, 0x25212: 0x6c8c8020, 0x25213: 0x6c06c220, + 0x25214: 0x6cad7620, 0x25215: 0x6d2dc420, 0x25217: 0x6c874e20, + 0x2521b: 0x6ce3b220, + 0x2521c: 0x6c560020, + 0x25222: 0x6c8b6c20, + 0x25235: 0x6c5b8020, 0x25236: 0x6cc16420, 0x25237: 0x6d086820, + 0x25239: 0x6c6ec620, 0x2523a: 0x6c2f1220, 0x2523b: 0x6cdc0820, + 0x2523d: 0x6cf11e20, 0x2523f: 0x6d0d1420, + // Block 0x949, offset 0x25240 + 0x25240: 0x6d0c4a20, 0x25241: 0x6c050e20, 0x25243: 0x6c67ce20, + 0x25244: 0x6ca66820, 0x25245: 0x6c876e20, 0x25246: 0x6c560620, 0x25247: 0x6cb80420, + 0x25248: 0x6d37e220, + 0x25251: 0x6c0acc20, + 0x25254: 0x6d220020, 0x25255: 0x6c2f1420, 0x25256: 0x6c8c8a20, 0x25257: 0x6c878c20, + 0x25258: 0x6d3de620, 0x25259: 0x6c62f020, 0x2525a: 0x6c70e620, + 0x2525c: 0x6c3c8820, 0x2525e: 0x6d248820, + 0x25268: 0x6c8b7e20, 0x25269: 0x6d28e020, 0x2526a: 0x6cb9e820, 0x2526b: 0x6c6a4620, + 0x2526c: 0x6c494220, 0x2526e: 0x6d3dee20, + 0x25271: 0x6c40a220, + 0x25279: 0x6ccba220, + 0x2527c: 0x6c248a20, + // Block 0x94a, offset 0x25280 + 0x25283: 0x6c5b8220, + 0x25288: 0x6c29a620, 0x25289: 0x6c901c20, 0x2528a: 0x6d198420, + 0x25297: 0x6cc96020, + 0x25298: 0x6d274220, 0x2529a: 0x6c2bc620, + 0x252a1: 0x6c420820, 0x252a2: 0x6d295c20, 0x252a3: 0x6ccdf420, + 0x252a4: 0x6d24b020, 0x252a5: 0x6c0fde20, 0x252a7: 0x6c2f9820, + 0x252a8: 0x6c388c20, 0x252aa: 0x6d22d820, + 0x252ac: 0x6ccfc420, + 0x252b2: 0x6c457020, + 0x252b4: 0x6c9ed020, 0x252b5: 0x6cea4a20, + 0x252b8: 0x6c8af620, + // Block 0x94b, offset 0x252c0 + 0x252c1: 0x6d2bd420, 0x252c2: 0x6cadbc20, + 0x252c4: 0x6c9c4a20, 0x252c6: 0x6c9ffa20, 0x252c7: 0x6c394a20, + 0x252c9: 0x6ca33620, 0x252ca: 0x6cd8b820, 0x252cb: 0x6d14ea20, + 0x252cc: 0x6c635020, 0x252cd: 0x6d3ae620, + 0x252d3: 0x6c047e20, + 0x252d4: 0x6d231e20, 0x252d6: 0x6cb35820, + 0x252da: 0x6c582820, 0x252db: 0x6c11f820, + 0x252dc: 0x6c684a20, + 0x252e0: 0x6cdfe420, + 0x252e9: 0x6d363a20, 0x252eb: 0x6c9cf420, + 0x252ec: 0x6c77ae20, + 0x252f1: 0x6d109a20, 0x252f2: 0x6c335020, 0x252f3: 0x6cc36020, + 0x252f4: 0x6c10a420, 0x252f5: 0x6c1f5420, 0x252f6: 0x6cbc2820, 0x252f7: 0x6c8e6c20, + 0x252f8: 0x6c0f1820, 0x252fa: 0x6c772e20, 0x252fb: 0x6c3bde20, + // Block 0x94c, offset 0x25300 + 0x25305: 0x6c2a2020, + 0x25309: 0x6c312820, 0x2530a: 0x6c440820, + 0x25319: 0x6c8d3a20, 0x2531a: 0x6cf79420, + 0x2531c: 0x6ca6ba20, 0x2531d: 0x6d389620, 0x2531e: 0x6d389820, + 0x25323: 0x6c1d7820, + 0x25334: 0x6ca6ee20, 0x25335: 0x6c5f0c20, 0x25337: 0x6cc12420, + // Block 0x94d, offset 0x25340 + 0x25344: 0x6c763e20, 0x25347: 0x6cfcfc20, + 0x25349: 0x6c516820, 0x2534b: 0x6c8bd220, + 0x2534d: 0x6d3e7e20, + 0x25351: 0x6cab8c20, 0x25352: 0x6c245620, + 0x25357: 0x6c140420, + 0x2535d: 0x6d383820, 0x2535e: 0x6c102420, + 0x25364: 0x6c1d8220, 0x25365: 0x6cf8e220, 0x25366: 0x6cc99220, 0x25367: 0x6cfb9620, + 0x25368: 0x6ccb6420, 0x25369: 0x6c9e6020, 0x2536b: 0x6c38c020, + 0x2536c: 0x6d341620, 0x2536e: 0x6c256420, + 0x25374: 0x6cfa4620, + 0x2537e: 0x6cab1420, 0x2537f: 0x6c845820, + // Block 0x94e, offset 0x25380 + 0x25380: 0x6d40de20, 0x25382: 0x6c24f220, 0x25383: 0x6d2b1220, + 0x25385: 0x6c845a20, + 0x25398: 0x6cb67620, 0x2539a: 0x6d3d1020, 0x2539b: 0x6c257a20, + 0x2539c: 0x6cb41e20, 0x2539e: 0x6c38d620, 0x2539f: 0x6ce02620, + 0x253a9: 0x6d3eac20, 0x253aa: 0x6d412a20, 0x253ab: 0x6d38bc20, + 0x253ac: 0x6cc6d020, 0x253ad: 0x6c8bee20, 0x253ae: 0x6ce02820, + 0x253b6: 0x6cd3fe20, + 0x253ba: 0x6c251420, 0x253bb: 0x6d3eb820, + 0x253bc: 0x6c3db620, + // Block 0x94f, offset 0x253c0 + 0x253c1: 0x6d001c20, + 0x253c8: 0x6c3c7420, + 0x253cf: 0x6cfd4220, + 0x253d0: 0x6c670c20, 0x253d2: 0x6c3c0420, + 0x253d7: 0x6c875020, + 0x253d8: 0x6ca19820, + 0x253df: 0x6d1ed020, + 0x253e5: 0x6c5e5020, 0x253e7: 0x6cc16620, + 0x253ec: 0x6ca78220, + 0x253f0: 0x6c9cbe20, 0x253f3: 0x6cb80a20, + 0x253f6: 0x6c51ae20, + 0x253f8: 0x6c893a20, + 0x253ff: 0x6d42b420, + // Block 0x950, offset 0x25400 + 0x25402: 0x6c8df220, + 0x25405: 0x6d39f820, 0x25407: 0x6ca78c20, + 0x2540a: 0x6c612420, 0x2540b: 0x6cc62620, + 0x2540c: 0x6c6a9620, 0x2540d: 0x6c41d020, + 0x25410: 0x6d170220, 0x25413: 0x6d38ce20, + 0x25415: 0x6cf4ca20, + 0x2541a: 0x6c44fe20, 0x2541b: 0x6c243220, + 0x2541d: 0x6c9ed220, + 0x25421: 0x6d0a0220, 0x25423: 0x6d33cc20, + 0x25424: 0x6cff7620, 0x25427: 0x6c3e3a20, + 0x25428: 0x6c553620, + 0x2542c: 0x6c2b1e20, 0x2542e: 0x6c741820, 0x2542f: 0x6c2e1220, + 0x25439: 0x6cd44420, + 0x2543c: 0x6cee0a20, + // Block 0x951, offset 0x25440 + 0x25443: 0x6ca33820, + 0x25444: 0x6c2b2620, 0x25445: 0x6cd37020, 0x25446: 0x6c224020, 0x25447: 0x6cd4d220, + 0x25449: 0x6cec2c20, 0x2544a: 0x6c181820, 0x2544b: 0x6c389820, + 0x2544d: 0x6c470820, 0x2544e: 0x6d24e620, + 0x25451: 0x6c491420, + 0x2545a: 0x6cbcbc20, + 0x2545c: 0x6d2de820, 0x2545d: 0x6c276020, 0x2545e: 0x6cceee20, + 0x25466: 0x6d388820, 0x25467: 0x6cfde420, + 0x25468: 0x6ca00020, 0x25469: 0x6d3f5020, 0x2546a: 0x6c599620, 0x2546b: 0x6c9c5420, + 0x2546d: 0x6cf88c20, 0x2546e: 0x6d363c20, 0x2546f: 0x6cac2820, + 0x25470: 0x6c349420, + 0x25474: 0x6c22c820, 0x25475: 0x6ca1d420, 0x25477: 0x6c17be20, + 0x25479: 0x6d17b620, 0x2547a: 0x6c464820, + // Block 0x952, offset 0x25480 + 0x25487: 0x6c6dba20, + 0x25493: 0x6d2b8020, + 0x25494: 0x6cb25e20, 0x25495: 0x6d130420, 0x25496: 0x6c6af420, + 0x25498: 0x6caf7620, 0x2549b: 0x6ccbfe20, + 0x2549c: 0x6d3c4420, 0x2549d: 0x6c6f1e20, + 0x254a0: 0x6c8e6e20, 0x254a1: 0x6d227020, 0x254a3: 0x6c70ac20, + 0x254a8: 0x6caafe20, + 0x254b8: 0x6c999c20, + // Block 0x953, offset 0x254c0 + 0x254c4: 0x6c187420, 0x254c6: 0x6d3bd420, 0x254c7: 0x6ca76a20, + 0x254c8: 0x6c79aa20, 0x254c9: 0x6c6a2e20, 0x254ca: 0x6c57b020, + 0x254cd: 0x6d02e220, 0x254ce: 0x6d424a20, 0x254cf: 0x6d0e9620, + 0x254d0: 0x6c748220, + 0x254d5: 0x6c54ea20, 0x254d6: 0x6d393a20, 0x254d7: 0x6ccf6a20, + 0x254d9: 0x6d0dbc20, 0x254db: 0x6d01de20, + 0x254dc: 0x6c2ed420, 0x254df: 0x6c187a20, + 0x254f2: 0x6c65c620, 0x254f3: 0x6c624c20, + 0x254f6: 0x6c21ce20, 0x254f7: 0x6c537420, + // Block 0x954, offset 0x25500 + 0x25500: 0x6c26bc20, + 0x25504: 0x6c764020, 0x25505: 0x6d039820, 0x25506: 0x6c5c1c20, 0x25507: 0x6c65d020, + 0x25508: 0x6d394820, 0x25509: 0x6d2c8c20, 0x2550a: 0x6c403820, 0x2550b: 0x6c1c6020, + 0x2550c: 0x6c082e20, 0x2550d: 0x6cab0a20, + 0x25511: 0x6c626820, 0x25512: 0x6cb9c020, + 0x25514: 0x6ced9620, 0x25515: 0x6cab6a20, 0x25516: 0x6c0a3220, 0x25517: 0x6cd79c20, + 0x25520: 0x6c6dd020, 0x25521: 0x6d132e20, + // Block 0x955, offset 0x25540 + 0x25544: 0x6c3a7220, 0x25547: 0x6c844420, + 0x2554a: 0x6c868020, 0x2554b: 0x6cb01e20, + 0x25552: 0x6cdc7a20, 0x25553: 0x6c8e9e20, + 0x25554: 0x6c517220, 0x25555: 0x6c5d1420, 0x25556: 0x6ce07a20, 0x25557: 0x6cd79e20, + 0x25558: 0x6d36ec20, 0x25559: 0x6c0f5c20, + 0x2555d: 0x6cf8e420, + 0x25561: 0x6cb33620, 0x25562: 0x6cc45c20, + 0x25564: 0x6ca2b020, + 0x2557d: 0x6d1db820, + // Block 0x956, offset 0x25580 + 0x25582: 0x6c279620, + 0x2558a: 0x6cb72220, 0x2558b: 0x6c2e0220, + 0x2558c: 0x6ca87c20, 0x2558d: 0x6cd6e420, 0x2558f: 0x6cce8c20, + 0x25590: 0x6c7dc420, 0x25591: 0x6cdc9020, 0x25593: 0x6c30ca20, + 0x25594: 0x6c2ef220, + 0x2559c: 0x6c45ba20, + 0x255af: 0x6d3bb020, + 0x255b0: 0x6c4c8c20, + 0x255bc: 0x6d05fa20, 0x255bd: 0x6cc1e820, + // Block 0x957, offset 0x255c0 + 0x255c0: 0x6d0a4c20, 0x255c3: 0x6c689a20, + 0x255c4: 0x6d30aa20, 0x255c6: 0x6c2d9220, 0x255c7: 0x6cca7620, + 0x255c8: 0x6c080c20, 0x255ca: 0x6cdda620, 0x255cb: 0x6cba2e20, + 0x255cf: 0x6d05fc20, + 0x255d1: 0x6d0a4e20, + 0x255d4: 0x6ca17a20, + 0x255f5: 0x6cdca820, 0x255f6: 0x6c7ea820, 0x255f7: 0x6d3a8a20, + 0x255f8: 0x6d396420, 0x255fa: 0x6c870820, + 0x255fc: 0x6c280e20, 0x255fd: 0x6c717820, 0x255ff: 0x6d286e20, + // Block 0x958, offset 0x25600 + 0x25600: 0x6c15fc20, 0x25601: 0x6c956020, + 0x25604: 0x6ccb8220, 0x25606: 0x6c888620, + 0x25608: 0x6d414e20, 0x2560b: 0x6c7f7020, + 0x2560c: 0x6cd6ec20, 0x2560d: 0x6cbcfe20, + 0x25618: 0x6c30ce20, + 0x2561e: 0x6cf54a20, 0x2561f: 0x6c9b9020, + 0x25621: 0x6c62ce20, + 0x25624: 0x6c1aee20, 0x25626: 0x6ca65c20, + 0x25638: 0x6d116e20, 0x2563b: 0x6c7ec020, + 0x2563e: 0x6c942020, + // Block 0x959, offset 0x25640 + 0x25640: 0x6cdcbe20, 0x25641: 0x6c3dbe20, + 0x25644: 0x6c830420, 0x25645: 0x6cf05820, + 0x2564e: 0x6c237820, + 0x25654: 0x6c877020, 0x25656: 0x6cb22820, + 0x25658: 0x6c759020, 0x25659: 0x6c71e420, 0x2565b: 0x6c7ecc20, + 0x25667: 0x6c62f220, + 0x2566a: 0x6c9f1a20, + 0x2566c: 0x6d125020, 0x2566d: 0x6c0b2620, + 0x25671: 0x6c23d420, 0x25672: 0x6cd85e20, + 0x25675: 0x6cd86020, + 0x25678: 0x6c51b020, + // Block 0x95a, offset 0x25680 + 0x25683: 0x6ca48820, + 0x25685: 0x6c2f2620, + 0x25688: 0x6c180220, 0x25689: 0x6d282220, 0x2568b: 0x6d052220, + 0x2568c: 0x6cd4c220, 0x2568e: 0x6c15b020, 0x2568f: 0x6c9f4c20, + 0x25690: 0x6c87fe20, 0x25691: 0x6d19e620, 0x25692: 0x6d037620, 0x25693: 0x6cee9020, + 0x25694: 0x6c479020, 0x25695: 0x6ce7f020, 0x25696: 0x6cddf620, 0x25697: 0x6c3a5e20, + 0x25698: 0x6c265420, 0x25699: 0x6ca84620, 0x2569a: 0x6c244820, 0x2569b: 0x6d426e20, + 0x2569c: 0x6c6b2020, 0x2569d: 0x6d08b020, 0x2569e: 0x6c0f5e20, 0x2569f: 0x6c6c5e20, + 0x256a0: 0x6d1b1220, 0x256a1: 0x6d05f020, 0x256a3: 0x6d20e420, + 0x256a4: 0x6d048c20, 0x256a6: 0x6cb76c20, 0x256a7: 0x6c069620, + 0x256a8: 0x6d03dc20, 0x256a9: 0x6c45ec20, + 0x256ac: 0x6d418c20, + 0x256b0: 0x6c6a1a20, 0x256b2: 0x6c763020, + 0x256b5: 0x6d03f020, 0x256b6: 0x6c06b220, 0x256b7: 0x6cd4ee20, + 0x256b8: 0x6d23a020, 0x256ba: 0x6d38ee20, 0x256bb: 0x6d2e0420, + // Block 0x95b, offset 0x256c0 + 0x256c2: 0x6d37c620, + 0x256c6: 0x6c140620, + 0x256c8: 0x6c20e020, 0x256c9: 0x6c8f4220, + 0x256ce: 0x6cdbdc20, + 0x256d0: 0x6d3a8620, + 0x256d9: 0x6c0bd220, + 0x256dd: 0x6d035420, 0x256df: 0x6d0bce20, + 0x256e2: 0x6c8daa20, + 0x256e7: 0x6d0bd220, + 0x256ec: 0x6ce63020, + 0x256f9: 0x6c2b5a20, + // Block 0x95c, offset 0x25700 + 0x25701: 0x6cafca20, 0x25702: 0x6c567620, 0x25703: 0x6c132a20, + 0x2570a: 0x6ce45e20, 0x2570b: 0x6ca20220, + 0x2570c: 0x6c731620, 0x2570e: 0x6ca20420, + 0x25710: 0x6c723020, 0x25711: 0x6c8f0020, 0x25713: 0x6c8e0c20, + 0x25717: 0x6c8f0220, + 0x25718: 0x6c568820, + 0x25726: 0x6c3e3e20, 0x25727: 0x6c553820, + 0x2572a: 0x6c361820, 0x2572b: 0x6c458420, + 0x2572c: 0x6c470a20, + 0x25731: 0x6c48b420, + 0x25739: 0x6c94a420, 0x2573b: 0x6c389a20, + 0x2573c: 0x6c93e220, 0x2573d: 0x6c9b1820, 0x2573e: 0x6c3e8a20, 0x2573f: 0x6c8e5e20, + // Block 0x95d, offset 0x25740 + 0x25745: 0x6d00c220, 0x25746: 0x6c471e20, + 0x25748: 0x6cfcda20, 0x25749: 0x6c0f1a20, 0x2574b: 0x6c622220, + 0x25753: 0x6cc2a220, + 0x25754: 0x6c927220, + 0x2575e: 0x6cd79420, + 0x25761: 0x6ca20820, 0x25762: 0x6d23a420, 0x25763: 0x6c4eea20, + 0x25769: 0x6d26d020, 0x2576a: 0x6c289e20, + 0x2576f: 0x6d218620, + 0x25770: 0x6c64de20, 0x25773: 0x6c429020, + 0x2577f: 0x6c129420, + // Block 0x95e, offset 0x25780 + 0x25780: 0x6cd0c820, 0x25781: 0x6c8f1c20, + 0x25786: 0x6c687e20, + 0x25789: 0x6cdb2020, 0x2578a: 0x6cdb2220, 0x2578b: 0x6d383e20, + 0x25792: 0x6c8aaa20, + 0x25794: 0x6d085c20, 0x25795: 0x6c92ee20, 0x25797: 0x6c629e20, + 0x2579a: 0x6d0cdc20, + 0x2579f: 0x6c930820, + 0x257a1: 0x6c9fd220, 0x257a2: 0x6ce39620, + 0x257a6: 0x6c595c20, + 0x257a9: 0x6d18ec20, 0x257aa: 0x6ce08220, + 0x257ac: 0x6cf48820, + 0x257b0: 0x6c5f8020, + 0x257b7: 0x6c31e620, + 0x257b8: 0x6c7d9420, 0x257ba: 0x6c758e20, + 0x257bf: 0x6cd21a20, + // Block 0x95f, offset 0x257c0 + 0x257c0: 0x6ca44e20, 0x257c1: 0x6cb3bc20, + 0x257c4: 0x6cd52020, 0x257c5: 0x6cc37e20, + 0x257cc: 0x6cc5bc20, 0x257cf: 0x6c3b6220, + 0x257d2: 0x6cde3a20, 0x257d3: 0x6cea4820, + 0x257d5: 0x6d0f9c20, + 0x257e6: 0x6c342c20, 0x257e7: 0x6c21fc20, + 0x257e9: 0x6c478020, 0x257ea: 0x6c3b6e20, + 0x257ed: 0x6cc74620, + 0x257f1: 0x6c42c020, 0x257f2: 0x6cfdbe20, + 0x257f4: 0x6cfdc020, 0x257f5: 0x6c545420, 0x257f7: 0x6ce1c420, + 0x257f8: 0x6ccd8420, 0x257f9: 0x6d0fba20, 0x257fa: 0x6d3f5220, + 0x257fc: 0x6d256a20, + // Block 0x960, offset 0x25800 + 0x25804: 0x6cda7420, 0x25807: 0x6c203820, + 0x25808: 0x6cfdc820, 0x2580a: 0x6c048a20, + 0x2580c: 0x6c97c020, 0x2580e: 0x6c3f6e20, 0x2580f: 0x6c7e6420, + 0x25810: 0x6c851e20, 0x25812: 0x6c6af620, 0x25813: 0x6d1ea820, + 0x25818: 0x6d23a620, 0x2581a: 0x6c1c4820, + 0x2581c: 0x6c203a20, 0x2581d: 0x6d182e20, 0x2581e: 0x6ccd0020, + 0x25822: 0x6c609220, 0x25823: 0x6d0c2820, + 0x25826: 0x6cf51820, 0x25827: 0x6c215c20, + 0x25828: 0x6c987420, + 0x2582d: 0x6c3ede20, 0x2582e: 0x6c637c20, 0x2582f: 0x6c46d620, + 0x25830: 0x6c474420, 0x25831: 0x6c63e420, + 0x25835: 0x6cfb9820, 0x25837: 0x6c6d6020, + 0x25838: 0x6d3f6420, 0x25839: 0x6c90bc20, + 0x2583c: 0x6c46da20, + // Block 0x961, offset 0x25840 + 0x25840: 0x6cc57c20, 0x25842: 0x6ccd1420, + 0x25845: 0x6c74da20, 0x25846: 0x6ce79c20, 0x25847: 0x6d1ffc20, + 0x25854: 0x6c651a20, 0x25855: 0x6c31dc20, 0x25857: 0x6c55f020, + 0x2585b: 0x6ccace20, + 0x2585c: 0x6d246220, + 0x25862: 0x6c974e20, + 0x25864: 0x6d342620, 0x25865: 0x6d0c4420, 0x25866: 0x6c42f020, + 0x25868: 0x6c582020, + 0x2586e: 0x6cc34420, + 0x25871: 0x6d103e20, 0x25873: 0x6d418820, + 0x25877: 0x6cfe8e20, + 0x25878: 0x6d170620, 0x25879: 0x6d0d5a20, 0x2587a: 0x6c531e20, 0x2587b: 0x6d20e620, + 0x2587f: 0x6c1c0020, + // Block 0x962, offset 0x25880 + 0x25881: 0x6c1b1020, + 0x25884: 0x6c4f6a20, 0x25885: 0x6ccb1e20, 0x25886: 0x6cabbe20, 0x25887: 0x6cde4020, + 0x25888: 0x6c3b2620, 0x25889: 0x6c1aa020, + 0x2588c: 0x6c533220, 0x2588d: 0x6d095220, + 0x25896: 0x6d351e20, + 0x2589b: 0x6cc19020, + 0x258a0: 0x6cf5fe20, 0x258a1: 0x6c3e6220, 0x258a3: 0x6cd4e020, + 0x258a4: 0x6c4d6a20, 0x258a6: 0x6cb38c20, + 0x258a8: 0x6c229a20, + 0x258b0: 0x6c149a20, 0x258b3: 0x6c52ae20, + 0x258b8: 0x6cad7a20, 0x258b9: 0x6ccff820, 0x258ba: 0x6cfede20, + 0x258bd: 0x6d07ac20, 0x258be: 0x6c229e20, 0x258bf: 0x6ce68420, + // Block 0x963, offset 0x258c0 + 0x258c0: 0x6cb39620, + 0x258c7: 0x6cde7e20, + 0x258c8: 0x6c13a820, 0x258cb: 0x6d40ce20, + 0x258cc: 0x6c5de820, 0x258cd: 0x6d071820, 0x258ce: 0x6d0e9820, 0x258cf: 0x6c149e20, + 0x258d1: 0x6ceb3420, + 0x258d8: 0x6cfb8420, 0x258d9: 0x6d07c620, 0x258da: 0x6c542a20, 0x258db: 0x6c58de20, + 0x258dc: 0x6c442620, 0x258dd: 0x6c1d3c20, 0x258de: 0x6c0a3620, 0x258df: 0x6c52bc20, + 0x258e0: 0x6c52be20, 0x258e1: 0x6c1b4a20, 0x258e3: 0x6c140820, + 0x258ef: 0x6d2c8e20, + 0x258f1: 0x6d2d1e20, 0x258f2: 0x6cdea220, + 0x258f5: 0x6cb3a220, 0x258f6: 0x6cdea420, + 0x258f8: 0x6d1f6e20, 0x258f9: 0x6c3ef420, 0x258fa: 0x6c220e20, 0x258fb: 0x6c26be20, + 0x258fc: 0x6cde1a20, 0x258fe: 0x6c8ea020, + // Block 0x964, offset 0x25900 + 0x25901: 0x6c221020, 0x25903: 0x6c52d420, + 0x25905: 0x6c4f1a20, 0x25906: 0x6c7e5020, + 0x25908: 0x6cd20420, + 0x2590d: 0x6ce79e20, 0x2590e: 0x6c5c7020, 0x2590f: 0x6c518620, + 0x25910: 0x6cb1d820, 0x25911: 0x6d243a20, + 0x2591c: 0x6cfaf020, 0x2591d: 0x6c4e6c20, 0x2591f: 0x6cb3ac20, + 0x25926: 0x6c7ec220, 0x25927: 0x6c5e5220, + 0x25930: 0x6cdf8420, + 0x25934: 0x6c819e20, 0x25936: 0x6cd5b420, + 0x2593a: 0x6c2a0a20, 0x2593b: 0x6c2d1020, + // Block 0x965, offset 0x25940 + 0x25948: 0x6d04a820, 0x2594b: 0x6cee6020, + 0x2594d: 0x6c17f820, 0x2594e: 0x6ca3ae20, + 0x25950: 0x6c73d420, 0x25953: 0x6c375220, + 0x25954: 0x6c375a20, 0x25955: 0x6caa6c20, 0x25956: 0x6caa8820, + 0x2595d: 0x6d3bae20, + 0x25962: 0x6cab2220, + 0x25964: 0x6c8ac220, 0x25965: 0x6c82b420, 0x25967: 0x6c032a20, + 0x2596c: 0x6c196820, 0x2596f: 0x6c4a6a20, + 0x25970: 0x6cc2f820, 0x25971: 0x6c448820, 0x25973: 0x6c45ee20, + 0x25974: 0x6ccee020, + 0x25979: 0x6c7f2020, 0x2597a: 0x6d32e820, 0x2597b: 0x6d183020, + 0x2597c: 0x6c4bda20, 0x2597d: 0x6ceea620, 0x2597e: 0x6c951e20, + // Block 0x966, offset 0x25980 + 0x25982: 0x6cd28620, 0x25983: 0x6d1be820, + 0x25984: 0x6cd14620, 0x25985: 0x6ce8ea20, 0x25986: 0x6c0a3820, + 0x25988: 0x6d2aee20, 0x25989: 0x6d383a20, 0x2598b: 0x6cc72620, + 0x2598c: 0x6cb64e20, 0x2598d: 0x6c405620, 0x2598e: 0x6c131820, + 0x25993: 0x6c845c20, + 0x25994: 0x6c978c20, 0x25996: 0x6c886620, 0x25997: 0x6c0c3020, + 0x2599b: 0x6c207e20, + 0x2599c: 0x6d18ee20, + 0x259a0: 0x6cac3620, + 0x259a5: 0x6d191420, 0x259a6: 0x6c7b4820, + 0x259a9: 0x6c0c5220, 0x259ab: 0x6c1c9e20, + 0x259ac: 0x6cc22020, 0x259ad: 0x6ca1ae20, 0x259ae: 0x6d301620, 0x259af: 0x6ccc3c20, + 0x259b0: 0x6ccc3e20, + 0x259b7: 0x6d109620, + 0x259b8: 0x6c457420, 0x259b9: 0x6ca3b620, + 0x259bc: 0x6d018420, 0x259bf: 0x6ce53220, + // Block 0x967, offset 0x259c0 + 0x259c6: 0x6d127820, + 0x259c9: 0x6ccbe220, + 0x259cf: 0x6ccaec20, + 0x259d2: 0x6c2cc620, 0x259d3: 0x6d06c220, + 0x259d9: 0x6cc19220, + 0x259e0: 0x6c52b020, 0x259e1: 0x6cd16620, 0x259e2: 0x6ce6ec20, + 0x259f0: 0x6c352e20, + 0x259f5: 0x6c89ea20, 0x259f7: 0x6c53c220, + 0x259f8: 0x6c852020, 0x259fa: 0x6cfdee20, + 0x259fd: 0x6cd0b620, + // Block 0x968, offset 0x25a00 + 0x25a00: 0x6c3d8220, + 0x25a08: 0x6d0dc020, 0x25a09: 0x6cee3220, 0x25a0a: 0x6cb51620, 0x25a0b: 0x6c34a620, + 0x25a0d: 0x6c57b220, 0x25a0e: 0x6cb90c20, + 0x25a10: 0x6d01e020, + 0x25a1d: 0x6c22d620, 0x25a1e: 0x6cd11020, + 0x25a22: 0x6c37dc20, + 0x25a24: 0x6d039a20, 0x25a26: 0x6cea0e20, 0x25a27: 0x6d0ea220, + 0x25a29: 0x6c8b2820, + 0x25a2c: 0x6c9c6e20, + 0x25a38: 0x6d402c20, 0x25a3a: 0x6d3e8020, + 0x25a3c: 0x6c55ba20, 0x25a3d: 0x6d1c9e20, 0x25a3e: 0x6c885620, 0x25a3f: 0x6c266a20, + // Block 0x969, offset 0x25a40 + 0x25a40: 0x6ce4c420, 0x25a41: 0x6ce53e20, + 0x25a4b: 0x6cc6b020, + 0x25a4d: 0x6c00d020, + 0x25a50: 0x6c00e420, 0x25a51: 0x6d309e20, 0x25a52: 0x6c4c4620, 0x25a53: 0x6c92f020, + 0x25a54: 0x6d2f7a20, 0x25a55: 0x6c9c8220, 0x25a56: 0x6c8a2a20, 0x25a57: 0x6d30a020, + 0x25a5b: 0x6cc25020, + 0x25a5c: 0x6c236820, 0x25a5f: 0x6ce65020, + 0x25a61: 0x6ce02c20, 0x25a62: 0x6d2e2820, 0x25a63: 0x6c55e020, + 0x25a65: 0x6cb1da20, 0x25a67: 0x6c267020, + 0x25a68: 0x6cc6d220, + 0x25a6e: 0x6ca52020, + 0x25a73: 0x6ca45a20, + 0x25a74: 0x6c291a20, 0x25a75: 0x6c695c20, + 0x25a7b: 0x6c72b620, + 0x25a7c: 0x6c37ac20, + // Block 0x96a, offset 0x25a80 + 0x25a8a: 0x6c877420, + 0x25a8c: 0x6c4c4e20, 0x25a8d: 0x6cec7e20, + 0x25a92: 0x6ca7ee20, + 0x25a94: 0x6c6c3420, + 0x25aa9: 0x6cb04a20, 0x25aaa: 0x6c1bde20, + 0x25ab2: 0x6cb04c20, 0x25ab3: 0x6d166e20, + 0x25ab4: 0x6c316220, 0x25ab5: 0x6cec1420, 0x25ab6: 0x6d099020, + 0x25ab8: 0x6cb73c20, 0x25ab9: 0x6ccd6c20, + 0x25abc: 0x6d056a20, 0x25abf: 0x6c509020, + // Block 0x96b, offset 0x25ac0 + 0x25ac0: 0x6caca620, 0x25ac2: 0x6cadb420, + 0x25ac4: 0x6d045a20, 0x25ac6: 0x6c1b7e20, 0x25ac7: 0x6cdf9020, + 0x25ac8: 0x6d41a620, 0x25ac9: 0x6d414820, 0x25aca: 0x6cb74c20, 0x25acb: 0x6c316420, + 0x25ad9: 0x6cd70c20, + 0x25adc: 0x6ca2f220, 0x25add: 0x6cf59620, + 0x25ae7: 0x6c179420, + 0x25ae8: 0x6d16d020, 0x25aeb: 0x6d329e20, + 0x25aee: 0x6c70fe20, 0x25aef: 0x6c274c20, + 0x25af1: 0x6cc9fc20, + 0x25af4: 0x6d3ac820, 0x25af5: 0x6ced7620, + 0x25af8: 0x6cc9fe20, 0x25af9: 0x6c04f220, 0x25afa: 0x6c643c20, 0x25afb: 0x6c972c20, + // Block 0x96c, offset 0x25b00 + 0x25b08: 0x6ceb9c20, 0x25b0a: 0x6cb76020, + 0x25b0f: 0x6d3c0c20, + 0x25b10: 0x6ceb0220, 0x25b13: 0x6cb28c20, + 0x25b1d: 0x6cae6220, 0x25b1e: 0x6c7b9a20, 0x25b1f: 0x6d14d820, + 0x25b21: 0x6d018620, 0x25b22: 0x6d264c20, 0x25b23: 0x6c523020, + 0x25b25: 0x6c53f220, 0x25b26: 0x6d32a420, 0x25b27: 0x6c217420, + 0x25b28: 0x6cd35e20, 0x25b29: 0x6cec1c20, 0x25b2b: 0x6d009620, + 0x25b38: 0x6c452a20, + // Block 0x96d, offset 0x25b40 + 0x25b45: 0x6c35fe20, + 0x25b4f: 0x6c7a7220, + 0x25b50: 0x6ca32c20, 0x25b53: 0x6c707420, + 0x25b54: 0x6d088e20, 0x25b55: 0x6cc0fe20, 0x25b56: 0x6c181c20, 0x25b57: 0x6c939620, + 0x25b58: 0x6c511420, 0x25b59: 0x6cd16020, 0x25b5a: 0x6ca44620, + 0x25b5c: 0x6c511620, 0x25b5d: 0x6c13de20, 0x25b5e: 0x6d0bfe20, 0x25b5f: 0x6c450a20, + 0x25b60: 0x6ca81e20, 0x25b62: 0x6c4c6a20, 0x25b63: 0x6d0c8c20, + 0x25b64: 0x6c494e20, 0x25b67: 0x6d360420, + 0x25b68: 0x6c81f420, + 0x25b6f: 0x6c321820, + 0x25b70: 0x6cb78220, 0x25b71: 0x6cc10020, 0x25b72: 0x6c742e20, + // Block 0x96e, offset 0x25b80 + 0x25b81: 0x6c3c4220, 0x25b83: 0x6d06c420, + 0x25b84: 0x6ce9fc20, 0x25b86: 0x6c4e1820, 0x25b87: 0x6c7a4220, + 0x25b8a: 0x6ccff020, 0x25b8b: 0x6d363e20, + 0x25b8d: 0x6cad2c20, 0x25b8e: 0x6d32cc20, 0x25b8f: 0x6c861820, + 0x25b90: 0x6ced2620, 0x25b92: 0x6c391020, 0x25b93: 0x6d033a20, + 0x25b96: 0x6d0bb620, + 0x25b9b: 0x6c709820, + 0x25b9c: 0x6cd0a620, + 0x25bad: 0x6c989020, 0x25baf: 0x6cea7e20, + 0x25bb0: 0x6d3d6620, 0x25bb1: 0x6cf62820, 0x25bb2: 0x6d1b5820, 0x25bb3: 0x6c6db620, + 0x25bb4: 0x6cea5420, 0x25bb7: 0x6c453220, + 0x25bb8: 0x6c620a20, + // Block 0x96f, offset 0x25bc0 + 0x25bcf: 0x6d3ba820, + 0x25bd2: 0x6ce5f220, + 0x25bd4: 0x6d33e220, 0x25bd6: 0x6c604420, + 0x25bda: 0x6d1c8220, 0x25bdb: 0x6cf0aa20, + 0x25bdd: 0x6c593c20, 0x25bde: 0x6ce68620, 0x25bdf: 0x6c150620, + 0x25be2: 0x6c7c8e20, 0x25be3: 0x6cb86e20, + 0x25be4: 0x6c04fc20, 0x25be5: 0x6c13a420, 0x25be6: 0x6ceb8420, 0x25be7: 0x6ca43020, + 0x25be8: 0x6c6a2420, 0x25bea: 0x6d0c1620, + 0x25bec: 0x6ce8ca20, 0x25bee: 0x6cf1e620, + 0x25bf0: 0x6c232020, 0x25bf3: 0x6d06fc20, + 0x25bf4: 0x6d1b6020, 0x25bf7: 0x6c084420, + 0x25bfc: 0x6c935820, + // Block 0x970, offset 0x25c00 + 0x25c01: 0x6d290620, 0x25c02: 0x6c265820, + 0x25c06: 0x6ca84820, 0x25c07: 0x6c71c220, + 0x25c08: 0x6c541620, + 0x25c0c: 0x6c453a20, + 0x25c15: 0x6c541820, 0x25c16: 0x6c76b220, 0x25c17: 0x6c459620, + 0x25c19: 0x6c5b5e20, 0x25c1a: 0x6d01e220, + 0x25c1d: 0x6cf8ba20, 0x25c1e: 0x6c4e2420, 0x25c1f: 0x6c9c6820, + 0x25c21: 0x6cf25c20, 0x25c22: 0x6c5d3620, 0x25c23: 0x6ccabc20, + 0x25c24: 0x6d034220, 0x25c25: 0x6d307220, 0x25c26: 0x6c5dea20, + 0x25c28: 0x6c45a020, 0x25c2b: 0x6cc9e420, + 0x25c2c: 0x6c6c4a20, 0x25c2d: 0x6cebec20, + 0x25c31: 0x6c332420, 0x25c32: 0x6c1aca20, + 0x25c3d: 0x6cf67e20, + // Block 0x971, offset 0x25c40 + 0x25c42: 0x6c9c6a20, 0x25c43: 0x6d29e020, + 0x25c44: 0x6cca8420, + 0x25c53: 0x6cea5e20, + 0x25c54: 0x6d366820, 0x25c55: 0x6cf1ea20, + 0x25c58: 0x6d1a9820, 0x25c59: 0x6cea8220, 0x25c5b: 0x6c1cda20, + 0x25c5c: 0x6d2af020, 0x25c5e: 0x6cff0a20, 0x25c5f: 0x6ca07420, + 0x25c60: 0x6c245820, 0x25c63: 0x6c0b4e20, + 0x25c64: 0x6d04f020, 0x25c67: 0x6d154c20, + 0x25c6e: 0x6c5a6020, + 0x25c70: 0x6d2bf820, 0x25c71: 0x6cdd3620, 0x25c72: 0x6c5cfe20, 0x25c73: 0x6c727e20, + // Block 0x972, offset 0x25c80 + 0x25c81: 0x6c245a20, + 0x25c84: 0x6c5f4020, 0x25c85: 0x6d0a4420, 0x25c86: 0x6cdcfe20, 0x25c87: 0x6c135e20, + 0x25c89: 0x6d18b020, + 0x25c8e: 0x6c0c2220, + 0x25c92: 0x6c74c220, 0x25c93: 0x6c868220, + 0x25c96: 0x6cad9a20, + 0x25c9b: 0x6d289c20, + 0x25c9c: 0x6d134220, 0x25c9e: 0x6c0a5a20, 0x25c9f: 0x6d310020, + 0x25ca0: 0x6d310220, 0x25ca2: 0x6c702420, 0x25ca3: 0x6d309020, + 0x25ca6: 0x6cd60e20, + 0x25caa: 0x6cf6d620, + 0x25cb7: 0x6d065820, + 0x25cb8: 0x6ca3a620, 0x25cb9: 0x6cfb9a20, 0x25cba: 0x6c4bec20, 0x25cbb: 0x6cf0d220, + 0x25cbe: 0x6c60c420, 0x25cbf: 0x6cc9a220, + // Block 0x973, offset 0x25cc0 + 0x25cc2: 0x6c304220, 0x25cc3: 0x6caac820, + 0x25cc4: 0x6c327a20, 0x25cc5: 0x6d32fc20, 0x25cc6: 0x6c7a6420, + 0x25cc9: 0x6ca01c20, + 0x25cd5: 0x6c05d820, 0x25cd6: 0x6c5c5020, + 0x25cd9: 0x6d3fc620, + 0x25ce8: 0x6cca5c20, 0x25cea: 0x6ce29420, 0x25ceb: 0x6d157220, + 0x25ced: 0x6d241620, + 0x25cf1: 0x6d123220, 0x25cf2: 0x6ca94a20, + 0x25cf4: 0x6c1dfa20, 0x25cf5: 0x6c5d4820, 0x25cf7: 0x6c337620, + 0x25cf9: 0x6cb7f220, 0x25cfa: 0x6d1d1820, 0x25cfb: 0x6c0e3420, + 0x25cfc: 0x6ca92e20, 0x25cfd: 0x6c5a1a20, + // Block 0x974, offset 0x25d00 + 0x25d06: 0x6d1d1a20, + 0x25d0a: 0x6c05da20, + 0x25d0e: 0x6c4a2820, 0x25d0f: 0x6c82f620, + 0x25d10: 0x6d421020, + 0x25d19: 0x6c15fe20, + 0x25d23: 0x6c660a20, + 0x25d27: 0x6c9b9220, + 0x25d29: 0x6d002820, + 0x25d2f: 0x6d035620, + 0x25d31: 0x6c849e20, + 0x25d3a: 0x6cbc2e20, + 0x25d3f: 0x6cf05c20, + // Block 0x975, offset 0x25d40 + 0x25d40: 0x6ca37620, 0x25d42: 0x6cacee20, + 0x25d44: 0x6c829020, 0x25d47: 0x6c958220, + 0x25d4b: 0x6c946220, + 0x25d4d: 0x6c44ea20, 0x25d4f: 0x6c946420, + 0x25d52: 0x6cc22220, + 0x25d56: 0x6c959020, + 0x25d58: 0x6ca46820, 0x25d5b: 0x6c959220, + 0x25d5c: 0x6d273e20, + 0x25d62: 0x6cd71a20, + 0x25d65: 0x6c9d3e20, 0x25d66: 0x6cede820, 0x25d67: 0x6c12f420, + 0x25d68: 0x6c64a620, 0x25d69: 0x6cee2020, + 0x25d6f: 0x6c637e20, + 0x25d74: 0x6c58c020, + 0x25d78: 0x6c894220, 0x25d79: 0x6d3f2c20, 0x25d7a: 0x6c040a20, 0x25d7b: 0x6cd43c20, + 0x25d7e: 0x6cecf220, + // Block 0x976, offset 0x25d80 + 0x25d82: 0x6cd4c420, + 0x25d87: 0x6c4a4e20, + 0x25d88: 0x6cf5cc20, 0x25d8a: 0x6cc79c20, 0x25d8b: 0x6d11fe20, + 0x25d8e: 0x6c42c220, + 0x25d95: 0x6d26d220, + 0x25d98: 0x6d1da820, 0x25d99: 0x6cec3c20, 0x25d9a: 0x6c0f4620, + 0x25d9f: 0x6d034e20, + 0x25da2: 0x6cb0c620, 0x25da3: 0x6c0f7820, + 0x25da6: 0x6c4d7e20, 0x25da7: 0x6d2d5220, + 0x25da8: 0x6cf33020, 0x25daa: 0x6d138420, 0x25dab: 0x6c0ab820, + 0x25dac: 0x6c4d8620, + 0x25db8: 0x6c1c0220, 0x25dbb: 0x6d360620, + 0x25dbd: 0x6ca5dc20, + // Block 0x977, offset 0x25dc0 + 0x25dc1: 0x6cf3d420, 0x25dc2: 0x6c006e20, + 0x25dc8: 0x6c006a20, 0x25dc9: 0x6d229220, 0x25dca: 0x6c1c7020, + 0x25dcd: 0x6c6eac20, 0x25dce: 0x6d371020, 0x25dcf: 0x6d372c20, + 0x25dd0: 0x6d372e20, 0x25dd1: 0x6c70ee20, + 0x25dd6: 0x6c4dd820, + 0x25dda: 0x6cb24c20, + 0x25ddd: 0x6d11a620, + 0x25de3: 0x6d1f1e20, + 0x25de4: 0x6cb25420, 0x25de6: 0x6ca11020, + 0x25dec: 0x6d429e20, 0x25ded: 0x6cb38e20, 0x25def: 0x6d091220, + 0x25df0: 0x6c7bc420, 0x25df1: 0x6d17bc20, 0x25df2: 0x6cb39020, + 0x25dfb: 0x6d3c9c20, + // Block 0x978, offset 0x25e00 + 0x25e03: 0x6ca5fa20, + 0x25e04: 0x6cc0b020, 0x25e05: 0x6c23f820, + 0x25e0c: 0x6d11cc20, + 0x25e11: 0x6c3b9820, + 0x25e15: 0x6cf9f420, 0x25e17: 0x6c677c20, + 0x25e18: 0x6c13b220, 0x25e1b: 0x6d000e20, + 0x25e1c: 0x6c13b420, + 0x25e22: 0x6c1a5020, 0x25e23: 0x6c257e20, + 0x25e27: 0x6cbf7c20, + 0x25e29: 0x6d245220, 0x25e2b: 0x6d21d820, + 0x25e2f: 0x6cf21620, + 0x25e31: 0x6c13c020, 0x25e32: 0x6d22ae20, + 0x25e39: 0x6d425420, 0x25e3a: 0x6c29fc20, + 0x25e3d: 0x6c73a820, 0x25e3e: 0x6c29fe20, 0x25e3f: 0x6d1c4c20, + // Block 0x979, offset 0x25e40 + 0x25e41: 0x6c3cd420, + 0x25e45: 0x6cf27a20, + 0x25e48: 0x6c6cf620, 0x25e49: 0x6cb76e20, 0x25e4b: 0x6cbe0e20, + 0x25e4d: 0x6c7dee20, 0x25e4f: 0x6cdf9e20, + 0x25e50: 0x6cfa9420, 0x25e52: 0x6ce46420, + 0x25e54: 0x6c7df620, 0x25e56: 0x6ce53a20, + 0x25e58: 0x6c556420, 0x25e59: 0x6d39aa20, 0x25e5a: 0x6d2d7620, 0x25e5b: 0x6cde5820, + 0x25e5d: 0x6ce46e20, 0x25e5e: 0x6cde6820, 0x25e5f: 0x6cde8020, + 0x25e60: 0x6c574820, 0x25e61: 0x6d0dc220, 0x25e62: 0x6ce61620, + 0x25e64: 0x6ce61820, 0x25e65: 0x6cde8220, + 0x25e6c: 0x6c581020, 0x25e6e: 0x6c63e620, 0x25e6f: 0x6cb7e020, + 0x25e71: 0x6cdeae20, + 0x25e74: 0x6cdfc220, 0x25e75: 0x6c57ce20, + 0x25e78: 0x6d3bf620, 0x25e79: 0x6c572220, + 0x25e7c: 0x6c800c20, + // Block 0x97a, offset 0x25e80 + 0x25e86: 0x6d420420, 0x25e87: 0x6d169820, + 0x25e88: 0x6c3dfe20, 0x25e89: 0x6cf4bc20, 0x25e8b: 0x6c3e0020, + 0x25e8d: 0x6c2f5620, 0x25e8e: 0x6cde3c20, + 0x25e96: 0x6c17b820, + 0x25e99: 0x6cc64220, 0x25e9a: 0x6cc35620, + 0x25e9c: 0x6c438420, + 0x25ea1: 0x6c3e6620, 0x25ea2: 0x6c2c4c20, 0x25ea3: 0x6c2dc620, + 0x25ea4: 0x6d1e3020, 0x25ea6: 0x6c643e20, + 0x25ea9: 0x6c8f8e20, + 0x25eac: 0x6d1e3220, 0x25ead: 0x6cafe020, 0x25eaf: 0x6c5d7820, + 0x25eb0: 0x6cbf3020, 0x25eb2: 0x6c38a020, 0x25eb3: 0x6cf3d620, + 0x25eb4: 0x6ce74e20, 0x25eb5: 0x6c4f7e20, + 0x25eb8: 0x6cdfac20, + 0x25ebe: 0x6c525020, + // Block 0x97b, offset 0x25ec0 + 0x25ec4: 0x6ce56220, + 0x25ec8: 0x6d388e20, 0x25ecb: 0x6c045420, + 0x25ecc: 0x6d01e420, 0x25ecd: 0x6c29c620, 0x25ecf: 0x6c6c4c20, + 0x25ed5: 0x6c54ec20, 0x25ed6: 0x6c06b620, + 0x25ed8: 0x6c2fb220, + 0x25edc: 0x6caac420, 0x25edd: 0x6cf0c620, 0x25ede: 0x6d218c20, + 0x25ee0: 0x6d039c20, 0x25ee1: 0x6c3ee020, 0x25ee2: 0x6cfd0020, 0x25ee3: 0x6cb7c420, + 0x25ee4: 0x6ce87820, 0x25ee7: 0x6c609420, + 0x25ee9: 0x6d1d4620, 0x25eeb: 0x6c2ae420, + 0x25eec: 0x6ceeb020, 0x25eed: 0x6cf6ae20, 0x25eef: 0x6cac0220, + 0x25ef1: 0x6cd12020, 0x25ef2: 0x6d1fec20, + 0x25ef4: 0x6c005220, 0x25ef5: 0x6c66d220, 0x25ef7: 0x6c466020, + 0x25ef8: 0x6cc93020, + 0x25efc: 0x6c462220, 0x25eff: 0x6ccc6e20, + // Block 0x97c, offset 0x25f00 + 0x25f00: 0x6ce13a20, + 0x25f07: 0x6c92f220, + 0x25f08: 0x6c027820, 0x25f0a: 0x6cb7ee20, 0x25f0b: 0x6d04fc20, + 0x25f0d: 0x6c271020, + 0x25f11: 0x6c382a20, 0x25f12: 0x6cf0f420, + 0x25f14: 0x6c341020, 0x25f15: 0x6c8a3a20, 0x25f16: 0x6c386620, 0x25f17: 0x6c5a1c20, + 0x25f18: 0x6c74dc20, 0x25f19: 0x6cdec020, 0x25f1a: 0x6d422020, 0x25f1b: 0x6cc53020, + 0x25f1c: 0x6c117a20, 0x25f1d: 0x6ce2c020, + 0x25f20: 0x6c57d020, 0x25f21: 0x6d05fe20, 0x25f23: 0x6d2dae20, + 0x25f27: 0x6c41f420, + 0x25f2a: 0x6caeea20, 0x25f2b: 0x6c118020, + 0x25f2c: 0x6d005820, 0x25f2d: 0x6c26d020, + 0x25f31: 0x6c62d020, + 0x25f36: 0x6c854820, + 0x25f39: 0x6cac9020, + 0x25f3d: 0x6c8ffa20, 0x25f3e: 0x6c877620, 0x25f3f: 0x6cf7c220, + // Block 0x97d, offset 0x25f40 + 0x25f40: 0x6ce2d620, 0x25f43: 0x6c8dac20, + 0x25f48: 0x6c855820, 0x25f49: 0x6cc4a220, 0x25f4a: 0x6c8df420, + 0x25f4e: 0x6c4bca20, + 0x25f54: 0x6cb30a20, 0x25f55: 0x6ca11220, 0x25f56: 0x6cabf020, + 0x25f59: 0x6c03b420, + 0x25f61: 0x6cb62820, + 0x25f64: 0x6d0cc420, + 0x25f6a: 0x6cec3e20, 0x25f6b: 0x6c020c20, + 0x25f6d: 0x6ca04a20, 0x25f6e: 0x6c9fca20, 0x25f6f: 0x6d0ab220, + 0x25f70: 0x6c9b9420, 0x25f73: 0x6c48d620, + 0x25f76: 0x6c682420, + 0x25f7b: 0x6c410a20, + // Block 0x97e, offset 0x25f80 + 0x25f81: 0x6c110a20, 0x25f82: 0x6cf4ac20, 0x25f83: 0x6d301820, + 0x25f84: 0x6cc58820, 0x25f85: 0x6c79b420, + 0x25f94: 0x6d2f8a20, 0x25f95: 0x6d37a220, 0x25f96: 0x6cc00a20, 0x25f97: 0x6c4c1420, + 0x25f98: 0x6c456a20, 0x25f99: 0x6cb40220, 0x25f9a: 0x6c566c20, 0x25f9b: 0x6c9e0820, + 0x25f9e: 0x6ce45a20, + 0x25fa3: 0x6cee0020, + 0x25fb8: 0x6d3a0020, 0x25fb9: 0x6c268a20, 0x25fba: 0x6d048e20, 0x25fbb: 0x6ca2d420, + 0x25fbe: 0x6c72de20, + // Block 0x97f, offset 0x25fc0 + 0x25fc1: 0x6ca71a20, + 0x25fc8: 0x6c567820, 0x25fc9: 0x6ccbd420, + 0x25fdc: 0x6d33b820, 0x25fdf: 0x6cdde420, + 0x25fe1: 0x6cd7d820, + 0x25fe5: 0x6d170820, + 0x25fed: 0x6cbf1020, 0x25fee: 0x6d35c820, 0x25fef: 0x6c939220, + 0x25ff0: 0x6cc79e20, 0x25ff2: 0x6cb5ac20, 0x25ff3: 0x6d224020, + 0x25ff4: 0x6d386a20, 0x25ff5: 0x6d0fa620, 0x25ff6: 0x6cfc0420, 0x25ff7: 0x6ca1cc20, + 0x25ff8: 0x6c1d9a20, 0x25ff9: 0x6c5aa820, 0x25ffa: 0x6c6f6420, 0x25ffb: 0x6c6fec20, + 0x25ffc: 0x6cb19220, + // Block 0x980, offset 0x26000 + 0x26001: 0x6c699220, 0x26003: 0x6c48c620, + 0x26005: 0x6ca0fe20, + 0x26010: 0x6cf5ce20, 0x26011: 0x6cb43220, + 0x2602f: 0x6c61d420, + 0x26036: 0x6cf1da20, 0x26037: 0x6c071620, + 0x26038: 0x6d15ea20, 0x26039: 0x6c3e6a20, 0x2603a: 0x6cd7e420, 0x2603b: 0x6c72f020, + 0x2603c: 0x6c61f620, 0x2603e: 0x6ca69a20, + // Block 0x981, offset 0x26040 + 0x26040: 0x6c07b620, + 0x26045: 0x6d06c620, + 0x26048: 0x6cbdd220, 0x26049: 0x6c0ef820, + 0x2604c: 0x6cede620, 0x2604d: 0x6d30f620, 0x2604f: 0x6cf2e620, + 0x26050: 0x6ccea420, 0x26051: 0x6d2a8020, 0x26052: 0x6d101820, + 0x26055: 0x6cd98a20, 0x26056: 0x6ca82020, + 0x2605b: 0x6c098620, + 0x26063: 0x6c242420, + 0x26064: 0x6cbab220, + 0x2606a: 0x6cffe620, 0x2606b: 0x6d33d620, + 0x2606c: 0x6ccf1020, 0x2606f: 0x6d360820, + 0x26070: 0x6cae7020, + // Block 0x982, offset 0x26080 + 0x2608f: 0x6c2e1e20, + 0x26096: 0x6cf2f820, + 0x26098: 0x6d352020, 0x26099: 0x6c098820, 0x2609b: 0x6c3b7020, + 0x260a5: 0x6c052a20, + 0x260aa: 0x6cc06c20, 0x260ab: 0x6ca63a20, + 0x260ac: 0x6c0f0620, 0x260ad: 0x6c33f220, 0x260af: 0x6cd2d020, + 0x260b0: 0x6d05a220, 0x260b1: 0x6c16ac20, 0x260b2: 0x6d05a420, 0x260b3: 0x6d128020, + 0x260b4: 0x6c9c5620, + 0x260b8: 0x6d02d620, 0x260b9: 0x6d3d6820, 0x260ba: 0x6c3ff620, + 0x260bd: 0x6cb06020, 0x260be: 0x6d095e20, + // Block 0x983, offset 0x260c0 + 0x260c0: 0x6d235020, 0x260c1: 0x6cfb6020, 0x260c2: 0x6d235220, 0x260c3: 0x6d213420, + 0x260c5: 0x6c709a20, 0x260c6: 0x6cddec20, 0x260c7: 0x6c797c20, + 0x260ca: 0x6d32ce20, 0x260cb: 0x6c9b1a20, + 0x260cc: 0x6c428420, + 0x260d2: 0x6ca28a20, 0x260d3: 0x6cf7ea20, + 0x260d4: 0x6c09aa20, 0x260d6: 0x6c3ff820, + 0x260dc: 0x6cfff420, + 0x260e0: 0x6c6f7620, 0x260e3: 0x6c468820, + 0x260f0: 0x6c1b2820, 0x260f1: 0x6c6f7820, 0x260f2: 0x6c6f7a20, + 0x260f5: 0x6ccbf820, 0x260f7: 0x6c3a0820, + // Block 0x984, offset 0x26100 + 0x2612b: 0x6c3e8c20, + 0x2612f: 0x6ced8a20, + 0x26130: 0x6d05a620, 0x26131: 0x6c0e7620, + // Block 0x985, offset 0x26140 + 0x26141: 0x6c504820, 0x26143: 0x6d00c420, + 0x26144: 0x6cb11820, 0x26145: 0x6d227420, 0x26147: 0x6ce4ae20, + 0x26148: 0x6cb00020, 0x2614a: 0x6cd2d220, 0x2614b: 0x6c7afc20, + 0x2614c: 0x6c5ef020, 0x2614f: 0x6d2be420, + 0x26150: 0x6ca3cc20, 0x26151: 0x6ca20620, 0x26153: 0x6c3ea620, + 0x26154: 0x6c326820, 0x26157: 0x6cd13e20, + 0x26158: 0x6c13ee20, 0x2615a: 0x6c1b3820, 0x2615b: 0x6c4b0820, + 0x2615c: 0x6c9f6620, 0x2615d: 0x6ce0c220, 0x2615e: 0x6c044c20, 0x2615f: 0x6cbac220, + 0x26161: 0x6d3d7420, 0x26162: 0x6cf0ac20, 0x26163: 0x6d0a1e20, + 0x26165: 0x6c9e9620, 0x26166: 0x6d290820, 0x26167: 0x6d1f4a20, + 0x26169: 0x6d204c20, 0x2616b: 0x6cccee20, + 0x2616c: 0x6c514220, 0x2616d: 0x6c93a220, 0x2616e: 0x6d347820, + 0x26172: 0x6c6e9020, 0x26173: 0x6d317020, + 0x26176: 0x6c9b2620, 0x26177: 0x6d1f4c20, + 0x26179: 0x6cf30020, 0x2617a: 0x6c038620, + 0x2617d: 0x6c737820, 0x2617e: 0x6cc7b220, 0x2617f: 0x6c23f220, + // Block 0x986, offset 0x26180 + 0x26180: 0x6d33fc20, + 0x26189: 0x6c557620, 0x2618a: 0x6d0f5c20, + 0x2618c: 0x6c75d020, 0x2618d: 0x6ccf1c20, 0x2618e: 0x6c79f220, + 0x26191: 0x6cb9a820, + 0x26194: 0x6c9b2820, + 0x2619a: 0x6ce58c20, + // Block 0x987, offset 0x261c0 + 0x261d0: 0x6ca84a20, + 0x261df: 0x6c1b3a20, + 0x261e1: 0x6d047220, 0x261e3: 0x6c5d3820, + 0x261e6: 0x6c2b8020, 0x261e7: 0x6c80d620, + 0x261e9: 0x6d2a1a20, 0x261ea: 0x6c130a20, 0x261eb: 0x6cdd8420, + 0x261ec: 0x6d412c20, 0x261ed: 0x6cdbd020, 0x261ef: 0x6cf9e020, + 0x261f1: 0x6d01e620, + 0x261f4: 0x6c6b1220, 0x261f5: 0x6d1f5820, 0x261f7: 0x6c46ca20, + 0x261f8: 0x6c451620, + 0x261fc: 0x6c75d820, 0x261fd: 0x6c5a5e20, 0x261fe: 0x6c607420, 0x261ff: 0x6cb3ca20, + // Block 0x988, offset 0x26200 + 0x26200: 0x6cf37820, 0x26202: 0x6d183420, + 0x26205: 0x6ca3a420, 0x26207: 0x6cc71820, + 0x26208: 0x6ca40820, 0x2620a: 0x6cb2c020, 0x2620b: 0x6ccd9420, + 0x2620c: 0x6c2dd820, 0x2620d: 0x6c607620, 0x2620e: 0x6c571420, 0x2620f: 0x6c335620, + 0x26210: 0x6c79a020, 0x26211: 0x6cde8620, 0x26213: 0x6c53c620, + 0x26215: 0x6cd4f820, + 0x26219: 0x6c526a20, 0x2621a: 0x6c3bc020, + 0x26232: 0x6c79fa20, + // Block 0x989, offset 0x26240 + 0x26259: 0x6ca70220, + 0x2625d: 0x6c1e9e20, + 0x26266: 0x6cbb5a20, + 0x26272: 0x6cf8bc20, 0x26273: 0x6c558020, + 0x26274: 0x6cd99620, 0x26275: 0x6cf30a20, 0x26277: 0x6c4d7620, + 0x26278: 0x6cc7b820, 0x26279: 0x6c9b3020, 0x2627b: 0x6cca2420, + 0x2627d: 0x6cf3de20, 0x2627f: 0x6d1f6420, + // Block 0x98a, offset 0x26280 + 0x26281: 0x6cdfba20, 0x26282: 0x6cd01220, + 0x26286: 0x6cb71220, + 0x26288: 0x6c4c8420, 0x26289: 0x6cb87420, 0x2628a: 0x6cfad020, + 0x2628f: 0x6cdbd620, + 0x26290: 0x6c92b020, 0x26293: 0x6cb52620, + 0x26294: 0x6c2ddc20, 0x26297: 0x6cb64020, + 0x26298: 0x6c63dc20, 0x26299: 0x6d1f6620, 0x2629a: 0x6cf79e20, 0x2629b: 0x6c177a20, + 0x262a1: 0x6c9d7e20, 0x262a2: 0x6c911820, 0x262a3: 0x6c08f220, + 0x262aa: 0x6cadec20, + 0x262ae: 0x6d318e20, 0x262af: 0x6cd01420, + 0x262b0: 0x6c15da20, 0x262b1: 0x6c403a20, + 0x262b6: 0x6cc13820, 0x262b7: 0x6cd82220, + 0x262ba: 0x6d417a20, + // Block 0x98b, offset 0x262c0 + 0x262eb: 0x6d2fd620, + 0x262fd: 0x6cb01220, + // Block 0x98c, offset 0x26300 + 0x26300: 0x6c23fa20, + 0x26306: 0x6c42e220, 0x26307: 0x6c31b620, + 0x26309: 0x6c3da420, 0x2630a: 0x6c492620, 0x2630b: 0x6ccae620, + 0x2630c: 0x6cda2a20, 0x2630d: 0x6c65da20, 0x2630e: 0x6cb3e020, + 0x26310: 0x6c11ac20, 0x26311: 0x6c085020, 0x26312: 0x6ca20c20, 0x26313: 0x6d2f7420, + 0x26314: 0x6cff9a20, 0x26316: 0x6c715c20, 0x26317: 0x6cd50620, + 0x26318: 0x6c65dc20, 0x26319: 0x6c844e20, 0x2631b: 0x6c203e20, + 0x2631c: 0x6c81e220, 0x2631e: 0x6c51ea20, 0x2631f: 0x6c55bc20, + 0x26320: 0x6c473220, 0x26321: 0x6d2f0c20, 0x26322: 0x6c6b3620, 0x26323: 0x6cfe5620, + 0x26325: 0x6c317820, 0x26326: 0x6c4e3220, 0x26327: 0x6c63e820, + 0x26328: 0x6cfe5820, 0x26329: 0x6c60ae20, 0x2632a: 0x6cd56c20, 0x2632b: 0x6c812e20, + 0x2632c: 0x6c5f4220, 0x2632d: 0x6ccd0e20, + 0x26330: 0x6ce1ee20, 0x26331: 0x6d3e8e20, 0x26332: 0x6cd69620, + 0x26334: 0x6c60b020, 0x26335: 0x6c1f7820, 0x26336: 0x6c628020, 0x26337: 0x6cd01c20, + 0x26338: 0x6c8c6820, 0x26339: 0x6c8a2020, 0x2633b: 0x6cca2a20, + 0x2633d: 0x6c019220, 0x2633e: 0x6cc87c20, + // Block 0x98d, offset 0x26340 + 0x26340: 0x6ce37820, 0x26341: 0x6c28b820, 0x26343: 0x6c589c20, + 0x26345: 0x6cc99420, + // Block 0x98e, offset 0x26380 + 0x26386: 0x6cc8a420, 0x26387: 0x6cf38020, + 0x26388: 0x6c729620, 0x26389: 0x6c589e20, 0x2638a: 0x6c838620, 0x2638b: 0x6c92dc20, + 0x2638e: 0x6cdfbe20, 0x2638f: 0x6d2b9620, + 0x26393: 0x6cb9ca20, + 0x26397: 0x6cf6d820, + 0x263a1: 0x6c22a220, 0x263a2: 0x6ccf2620, + 0x263a7: 0x6cc99620, + 0x263aa: 0x6c99bc20, 0x263ab: 0x6cc1da20, + 0x263ad: 0x6c0f7a20, 0x263ae: 0x6c41f020, + 0x263b0: 0x6cbcea20, 0x263b1: 0x6c739a20, 0x263b2: 0x6c290e20, 0x263b3: 0x6c16cc20, + 0x263b4: 0x6d0fde20, 0x263b5: 0x6c518020, 0x263b7: 0x6c5f5c20, + 0x263b9: 0x6c0df820, 0x263bb: 0x6c9a3020, + 0x263bf: 0x6c33b820, + // Block 0x98f, offset 0x263c0 + 0x263c0: 0x6c02b020, 0x263c1: 0x6c6dd820, 0x263c2: 0x6c92f420, 0x263c3: 0x6c9e6620, + 0x263c4: 0x6c2d8a20, 0x263c5: 0x6c51f220, 0x263c7: 0x6c650420, + 0x263ca: 0x6c575e20, 0x263cb: 0x6c466220, + 0x263ce: 0x6c92f620, 0x263cf: 0x6c3f0a20, + 0x263d0: 0x6c5b7220, 0x263d2: 0x6d2b6620, + 0x263d4: 0x6c6d6220, 0x263d5: 0x6cd83420, 0x263d6: 0x6cc43e20, + 0x263dc: 0x6c28cc20, 0x263de: 0x6ced9e20, 0x263df: 0x6c0b5620, + 0x263e4: 0x6c63ee20, + 0x263eb: 0x6c284e20, + 0x263ec: 0x6c6f8a20, 0x263ed: 0x6cfb9c20, 0x263ee: 0x6c0f7c20, + // Block 0x990, offset 0x26400 + 0x2640f: 0x6cfa0020, + 0x26411: 0x6c0c3220, + 0x26415: 0x6cb3a820, + 0x26418: 0x6ccae820, 0x26419: 0x6c076620, 0x2641a: 0x6ccc8020, 0x2641b: 0x6cf02e20, + 0x2641d: 0x6c123e20, 0x2641e: 0x6c92f820, + 0x26429: 0x6c28ce20, 0x2642b: 0x6c47e820, + 0x2642c: 0x6d289e20, 0x2642d: 0x6c055820, 0x2642e: 0x6c423820, + 0x26431: 0x6c175420, 0x26432: 0x6c62ae20, 0x26433: 0x6c8ab620, + 0x26435: 0x6cbf7e20, 0x26436: 0x6c66f420, 0x26437: 0x6c930a20, + 0x26438: 0x6c32a620, 0x26439: 0x6cdb8a20, 0x2643a: 0x6d116020, 0x2643b: 0x6d1b1620, + 0x2643d: 0x6cdec220, 0x2643e: 0x6d116220, 0x2643f: 0x6c6de020, + // Block 0x991, offset 0x26440 + 0x26440: 0x6c1ebc20, 0x26441: 0x6c3f1220, 0x26442: 0x6d25c220, 0x26443: 0x6ccebc20, + 0x26445: 0x6c0e3620, 0x26446: 0x6c299e20, 0x26447: 0x6cd3f820, + 0x2644a: 0x6c916420, 0x2644b: 0x6cbcf220, + 0x2644c: 0x6c955c20, 0x2644d: 0x6cb3ae20, 0x2644f: 0x6c9b7a20, + 0x26450: 0x6c6b6620, 0x26453: 0x6c5f7220, + 0x26456: 0x6c930c20, + // Block 0x992, offset 0x26480 + 0x26484: 0x6c172a20, 0x26485: 0x6c9f0020, 0x26486: 0x6c9b7c20, 0x26487: 0x6c660220, + 0x2648a: 0x6c114020, + 0x2648c: 0x6cdb5220, + 0x26494: 0x6c51fe20, 0x26495: 0x6cc9aa20, 0x26497: 0x6d3eae20, + 0x26498: 0x6c795e20, 0x26499: 0x6c452220, 0x2649a: 0x6cd83a20, + 0x264a0: 0x6ce3a420, 0x264a1: 0x6d2e8e20, 0x264a2: 0x6d026420, 0x264a3: 0x6cd70020, + 0x264a4: 0x6c1bcc20, 0x264a5: 0x6d1ec620, 0x264a6: 0x6c91f820, 0x264a7: 0x6c9c1a20, + 0x264a8: 0x6c8b6020, 0x264a9: 0x6cd8f620, + 0x264ac: 0x6cf71820, 0x264ad: 0x6c38da20, 0x264ae: 0x6c3db820, 0x264af: 0x6cd08820, + 0x264b0: 0x6ce3a620, 0x264b1: 0x6c14a420, 0x264b2: 0x6d270620, + 0x264b4: 0x6c3dba20, 0x264b5: 0x6c670220, 0x264b6: 0x6c2cb020, + 0x264ba: 0x6d011a20, 0x264bb: 0x6c281220, + 0x264bf: 0x6d34b020, + // Block 0x993, offset 0x264c0 + 0x264c3: 0x6d075620, + 0x264c8: 0x6ca89820, 0x264c9: 0x6c397420, 0x264ca: 0x6c9b8820, 0x264cb: 0x6c9fd420, + 0x264fe: 0x6c90d220, 0x264ff: 0x6c31e820, + // Block 0x994, offset 0x26500 + 0x26501: 0x6d2e9620, 0x26502: 0x6c671020, 0x26503: 0x6c4f2e20, + 0x26504: 0x6c28e220, 0x26505: 0x6ccbb220, 0x26506: 0x6c671220, 0x26507: 0x6ce03e20, + 0x26508: 0x6c696c20, 0x26509: 0x6cb34220, 0x2650b: 0x6cb2e420, + 0x2650d: 0x6d3bf820, 0x2650f: 0x6c8a4c20, + 0x26510: 0x6d3f6620, 0x26512: 0x6d3dd820, + 0x26514: 0x6c56de20, + 0x26519: 0x6cf92020, 0x2651b: 0x6c9b9620, + 0x2651c: 0x6c72ba20, 0x2651d: 0x6c9f0c20, 0x2651e: 0x6cfbcc20, + 0x26520: 0x6c7d3820, 0x26521: 0x6c9b9820, 0x26522: 0x6c653420, + 0x26526: 0x6caa0a20, + 0x26528: 0x6c2cb220, 0x26529: 0x6ccad220, + // Block 0x995, offset 0x26540 + 0x2654f: 0x6c1f8c20, + 0x26550: 0x6d34bc20, 0x26551: 0x6cb9e220, 0x26552: 0x6c93c420, + 0x26554: 0x6d3ddc20, + 0x26558: 0x6d42b020, 0x26559: 0x6c4e4820, 0x2655a: 0x6cdc1820, 0x2655b: 0x6c46e220, + 0x2655d: 0x6c1e3c20, 0x2655e: 0x6c62da20, 0x2655f: 0x6d194820, + 0x26560: 0x6d21f020, + 0x26568: 0x6caa0c20, 0x26569: 0x6ca66420, 0x2656a: 0x6cc93620, + 0x2656e: 0x6c8c0820, + 0x26571: 0x6ca93820, + // Block 0x996, offset 0x26580 + 0x2658d: 0x6cbc1620, 0x2658e: 0x6d117c20, 0x2658f: 0x6c409c20, + 0x26590: 0x6cd6b620, 0x26591: 0x6c7d3e20, 0x26592: 0x6cc21220, 0x26593: 0x6c304a20, + 0x26594: 0x6cd58a20, + 0x2659a: 0x6c84c020, 0x2659b: 0x6c719220, + 0x2659c: 0x6cc8bc20, + 0x265a0: 0x6d2c6c20, + 0x265a4: 0x6cff5420, + 0x265b8: 0x6c9ae220, 0x265b9: 0x6cd29820, 0x265ba: 0x6c2cfc20, 0x265bb: 0x6c878e20, + 0x265bc: 0x6c2b0420, 0x265bd: 0x6d29c420, 0x265bf: 0x6c958420, + // Block 0x997, offset 0x265c0 + 0x265c0: 0x6c11c620, 0x265c3: 0x6c023c20, + 0x265c6: 0x6c663620, + 0x265c8: 0x6c2e5020, 0x265cb: 0x6d1cd820, + 0x265d6: 0x6d197220, 0x265d7: 0x6c294620, + 0x265d8: 0x6caa1220, 0x265da: 0x6d272620, + 0x265ee: 0x6c855620, 0x265ef: 0x6c84e220, + 0x265f0: 0x6c56f620, 0x265f2: 0x6d206420, + 0x265fa: 0x6ca48420, + // Block 0x998, offset 0x26600 + 0x26602: 0x6c194a20, + 0x26609: 0x6c3c9220, 0x2660a: 0x6c0cd220, + 0x2660f: 0x6c97d820, + 0x26610: 0x6c424a20, 0x26611: 0x6c5e6020, 0x26613: 0x6c241c20, + 0x26615: 0x6d200020, + 0x26618: 0x6d206620, + 0x2661c: 0x6d057c20, + 0x26621: 0x6d06b020, 0x26622: 0x6c561820, 0x26623: 0x6c915020, + 0x26625: 0x6cf9b820, 0x26626: 0x6d177420, + 0x2662e: 0x6c561e20, 0x2662f: 0x6c569020, + 0x26630: 0x6d3f0a20, + 0x26637: 0x6c458c20, + 0x26638: 0x6ce99220, 0x26639: 0x6cf36a20, 0x2663a: 0x6c8d2020, 0x2663b: 0x6c472020, + 0x2663c: 0x6d37be20, + // Block 0x999, offset 0x26640 + 0x26644: 0x6c915820, + 0x26648: 0x6d412e20, + 0x2664c: 0x6ce76a20, 0x2664d: 0x6cf97020, 0x2664e: 0x6c515c20, + 0x26653: 0x6d26e220, + 0x26659: 0x6ca40c20, 0x2665a: 0x6c0f4820, 0x2665b: 0x6c54fa20, + 0x2665c: 0x6cb7e220, 0x2665d: 0x6cd53a20, 0x2665e: 0x6cbadc20, 0x2665f: 0x6d38ae20, + 0x26660: 0x6d122620, 0x26661: 0x6c473420, + 0x26665: 0x6c049e20, 0x26666: 0x6c76ec20, + 0x2666e: 0x6c517620, 0x2666f: 0x6c628420, + 0x26670: 0x6c55be20, 0x26671: 0x6d0cde20, + 0x26676: 0x6c212020, 0x26677: 0x6c2f8620, + 0x26678: 0x6cbfce20, 0x26679: 0x6c543620, + 0x2667c: 0x6c507420, 0x2667f: 0x6d413220, + // Block 0x99a, offset 0x26680 + 0x26681: 0x6cfbb820, + 0x26684: 0x6cfa5220, 0x26685: 0x6cf91820, + 0x26688: 0x6ccb8420, + 0x2668c: 0x6c445a20, 0x2668d: 0x6cf92220, + 0x26691: 0x6c445e20, + 0x26694: 0x6c93c620, 0x26696: 0x6c446020, 0x26697: 0x6c78ea20, + 0x26699: 0x6cd48a20, 0x2669a: 0x6d3b5020, + 0x2669c: 0x6ce2de20, 0x2669d: 0x6d0b7820, 0x2669e: 0x6ca67c20, + 0x266a6: 0x6c95e220, 0x266a7: 0x6cdbae20, + 0x266aa: 0x6c159e20, + 0x266ad: 0x6cf4cc20, 0x266af: 0x6d208220, + 0x266b9: 0x6d2a4420, 0x266bb: 0x6d174420, + 0x266bc: 0x6cf5d220, 0x266bd: 0x6c533620, 0x266be: 0x6cc2ce20, 0x266bf: 0x6cee0c20, + // Block 0x99b, offset 0x266c0 + 0x266c0: 0x6c1b9820, 0x266c1: 0x6cf87420, 0x266c2: 0x6ce4e020, 0x266c3: 0x6d27e420, + 0x266c5: 0x6d13e220, 0x266c6: 0x6c600620, 0x266c7: 0x6c5aaa20, + 0x266c8: 0x6c3d1620, 0x266ca: 0x6c3f5420, + 0x266cd: 0x6c600820, 0x266ce: 0x6d080a20, + 0x266d1: 0x6cdf6c20, 0x266d3: 0x6c324e20, + 0x266d7: 0x6d255620, + 0x266db: 0x6c2c3220, + 0x266de: 0x6d3a6620, 0x266df: 0x6cdf0620, + 0x266e1: 0x6cc70c20, 0x266e2: 0x6d090a20, 0x266e3: 0x6d232020, + 0x266e4: 0x6c394e20, 0x266e5: 0x6c06ca20, 0x266e7: 0x6cc24420, + 0x266e9: 0x6c109620, 0x266ea: 0x6c635420, 0x266eb: 0x6d2c2c20, + 0x266ed: 0x6caa5a20, 0x266ee: 0x6ccf1420, + 0x266f2: 0x6c860220, + // Block 0x99c, offset 0x26700 + 0x26704: 0x6c4af620, 0x26705: 0x6c48de20, 0x26707: 0x6c276420, + 0x2670f: 0x6c40fa20, + 0x26712: 0x6c22cc20, + 0x26714: 0x6d0d9220, 0x26715: 0x6cd92220, 0x26716: 0x6cd38820, + 0x26718: 0x6c7a9c20, 0x26719: 0x6d352e20, 0x2671a: 0x6ce75020, 0x2671b: 0x6cc19620, + 0x2671c: 0x6c364220, 0x2671e: 0x6d03ea20, 0x2671f: 0x6cc7b020, + 0x26720: 0x6d213820, 0x26723: 0x6d17c020, + 0x26724: 0x6d17c220, 0x26725: 0x6d06e420, 0x26726: 0x6c3d2c20, 0x26727: 0x6c43f820, + 0x2672c: 0x6c512a20, 0x2672d: 0x6d19e820, 0x2672f: 0x6c53be20, + 0x26731: 0x6c349820, + 0x2673d: 0x6d03ec20, 0x2673e: 0x6c38a220, + // Block 0x99d, offset 0x26740 + 0x26749: 0x6cb50020, 0x2674a: 0x6ccc0220, + 0x2674c: 0x6c326a20, 0x2674d: 0x6c2c7220, 0x2674e: 0x6c83fa20, 0x2674f: 0x6d180620, + 0x26750: 0x6cf78c20, 0x26751: 0x6c451420, 0x26752: 0x6ce75820, 0x26753: 0x6c77c020, + 0x26754: 0x6c53c420, 0x26755: 0x6c7db820, 0x26756: 0x6ca84c20, 0x26757: 0x6c1b3c20, + 0x26758: 0x6ce34e20, 0x2675a: 0x6ce75a20, + 0x26760: 0x6c83fc20, 0x26761: 0x6ca35c20, + 0x26771: 0x6d2d8220, 0x26772: 0x6c06cc20, + // Block 0x99e, offset 0x26780 + 0x26781: 0x6ce59220, 0x26783: 0x6d289420, + 0x26784: 0x6c367420, 0x26785: 0x6cd47620, 0x26786: 0x6c798820, 0x26787: 0x6caeb820, + 0x26788: 0x6c402020, 0x26789: 0x6c929820, 0x2678a: 0x6d01e820, 0x2678b: 0x6d01ea20, + 0x2678c: 0x6d04e820, 0x2678d: 0x6c929a20, 0x2678e: 0x6ce50a20, 0x2678f: 0x6cde8820, + 0x26790: 0x6c22da20, 0x26791: 0x6cc12a20, 0x26793: 0x6c402220, + 0x26794: 0x6d340620, 0x26796: 0x6d01ec20, 0x26797: 0x6d408220, + 0x26798: 0x6c3abe20, 0x26799: 0x6c9f7420, 0x2679a: 0x6d038c20, + 0x2679d: 0x6ce76c20, 0x2679e: 0x6cb60220, + 0x267a0: 0x6cb15c20, 0x267a2: 0x6cdc5620, 0x267a3: 0x6c37a020, + 0x267a7: 0x6c562c20, + 0x267bb: 0x6cd92e20, + 0x267bd: 0x6c0cb020, 0x267be: 0x6c2f6620, 0x267bf: 0x6c04d220, + // Block 0x99f, offset 0x267c0 + 0x267c0: 0x6cd1e220, 0x267c1: 0x6d01ee20, 0x267c2: 0x6cff9420, 0x267c3: 0x6c3a6620, + 0x267d2: 0x6c202620, 0x267d3: 0x6cd67020, + 0x267d4: 0x6d10b220, 0x267d5: 0x6c74a220, 0x267d6: 0x6cd14820, + 0x267d8: 0x6d1eb220, 0x267d9: 0x6c396c20, + 0x267dc: 0x6c7c9a20, 0x267dd: 0x6c2c9820, 0x267df: 0x6c990220, + 0x267e0: 0x6c6b2420, 0x267e2: 0x6d0cc820, + 0x267e5: 0x6ceeb420, + 0x267e8: 0x6cca7220, 0x267e9: 0x6c6b2620, 0x267ea: 0x6d219220, 0x267eb: 0x6cf0c820, + 0x267ec: 0x6c369220, 0x267ed: 0x6cc31220, 0x267ee: 0x6c6f2e20, 0x267ef: 0x6c3cba20, + 0x267f0: 0x6c8fa620, 0x267f1: 0x6c2ee220, 0x267f2: 0x6cb12420, + 0x267f4: 0x6c891420, 0x267f5: 0x6c559820, 0x267f6: 0x6c93fa20, + 0x267ff: 0x6c2d7a20, + // Block 0x9a0, offset 0x26800 + 0x26803: 0x6c255e20, + 0x26804: 0x6ca1e420, + 0x26815: 0x6cedea20, 0x26816: 0x6c72fe20, 0x26817: 0x6c782e20, + 0x26818: 0x6d0cca20, 0x26819: 0x6c693420, + 0x26821: 0x6c45b020, 0x26823: 0x6cc6b620, + 0x26824: 0x6cdce220, 0x26825: 0x6ccdb620, + 0x26828: 0x6c1b5420, 0x2682a: 0x6cb65220, 0x2682b: 0x6cdd9820, + 0x2682d: 0x6d134420, 0x2682e: 0x6d2a5420, 0x2682f: 0x6cc39620, + 0x26830: 0x6d2e1820, 0x26831: 0x6c035a20, 0x26832: 0x6d40d620, 0x26833: 0x6cdd9a20, + 0x26834: 0x6d309220, 0x26835: 0x6cf8e820, 0x26837: 0x6c1eec20, + 0x26838: 0x6c694820, 0x26839: 0x6d41d220, 0x2683a: 0x6c43aa20, 0x2683b: 0x6cf52420, + 0x2683e: 0x6c94c020, 0x2683f: 0x6c60b420, + // Block 0x9a1, offset 0x26840 + 0x26842: 0x6d00ec20, 0x26843: 0x6d00ee20, + 0x26846: 0x6c30f620, + 0x2684b: 0x6cbfc620, + 0x26851: 0x6cb2d020, 0x26853: 0x6c8ea420, + 0x26865: 0x6c6b3820, 0x26867: 0x6c5c4020, + 0x2686b: 0x6ccc7a20, + 0x26878: 0x6d34a620, 0x26879: 0x6c00e620, 0x2687a: 0x6d074a20, 0x2687b: 0x6c0a7820, + 0x2687d: 0x6d126820, 0x2687e: 0x6ca6d820, 0x2687f: 0x6d3a2e20, + // Block 0x9a2, offset 0x26880 + 0x26881: 0x6cdb4220, 0x26883: 0x6d010220, + 0x26884: 0x6d241820, 0x26885: 0x6cc14820, + 0x26888: 0x6d40e020, 0x26889: 0x6d341820, 0x2688a: 0x6d2ee420, 0x2688b: 0x6c94c420, + 0x2688c: 0x6cf03020, 0x2688d: 0x6c1ce820, 0x2688e: 0x6c9d9620, + 0x26890: 0x6c5f5e20, 0x26892: 0x6cdb4420, 0x26893: 0x6d12b620, + 0x26894: 0x6cf7ac20, 0x26895: 0x6ce96420, 0x26896: 0x6c886c20, 0x26897: 0x6d082e20, + 0x26899: 0x6cf52c20, + 0x2689f: 0x6c990c20, + 0x268ac: 0x6c538e20, 0x268af: 0x6c94c620, + 0x268b0: 0x6c31ce20, 0x268b1: 0x6c23ba20, 0x268b2: 0x6c152e20, 0x268b3: 0x6c92fc20, + 0x268b4: 0x6cdb4620, + // Block 0x9a3, offset 0x268c0 + 0x268c0: 0x6c94c820, + 0x268c6: 0x6d37d220, 0x268c7: 0x6c847420, + 0x268c8: 0x6c3ae220, 0x268ca: 0x6c6e3820, 0x268cb: 0x6c7d2c20, + 0x268cc: 0x6d18f420, 0x268cd: 0x6c576620, 0x268ce: 0x6c258020, + 0x268d0: 0x6d243c20, 0x268d1: 0x6c083620, 0x268d2: 0x6cea3020, 0x268d3: 0x6cd58020, + 0x268d4: 0x6c27a220, 0x268d5: 0x6cf38a20, 0x268d6: 0x6c22ea20, 0x268d7: 0x6ca95e20, + 0x268d8: 0x6c29a020, 0x268d9: 0x6d40ee20, 0x268da: 0x6c4e4220, + 0x268dc: 0x6cb02e20, 0x268dd: 0x6c204620, + 0x268e0: 0x6c328620, 0x268e1: 0x6cabe020, + 0x268e4: 0x6d39d620, 0x268e6: 0x6d011620, 0x268e7: 0x6d30ac20, + 0x268e8: 0x6cbcf420, 0x268e9: 0x6d07dc20, 0x268eb: 0x6ccb0820, + // Block 0x9a4, offset 0x26900 + 0x26900: 0x6c0a9620, 0x26902: 0x6c407c20, + 0x26908: 0x6c86d820, + 0x2690e: 0x6c359620, + 0x26910: 0x6d126e20, 0x26911: 0x6cd58420, 0x26913: 0x6ccb8620, + 0x26915: 0x6cb54a20, 0x26916: 0x6c4cf220, 0x26917: 0x6ccb8820, + 0x26919: 0x6c408620, 0x2691a: 0x6c990e20, + 0x2691c: 0x6c827620, 0x2691d: 0x6d2db420, + 0x26928: 0x6c14a620, + 0x2692d: 0x6cf0fc20, + 0x2693d: 0x6c827820, 0x2693f: 0x6d2b6c20, + // Block 0x9a5, offset 0x26940 + 0x26940: 0x6d1c0e20, 0x26941: 0x6c010220, 0x26942: 0x6d005c20, + 0x26944: 0x6c0aaa20, + 0x2694b: 0x6c155a20, + 0x2694e: 0x6cb03620, 0x2694f: 0x6c23c220, + 0x26950: 0x6c8b6620, 0x26951: 0x6cb69c20, 0x26953: 0x6c62d420, + 0x26954: 0x6c6df220, 0x26955: 0x6c302820, 0x26956: 0x6c3a4620, 0x26957: 0x6d159220, + 0x26958: 0x6ce97220, + 0x26968: 0x6c9bf620, 0x26969: 0x6c11be20, 0x2696a: 0x6d0b3c20, + 0x26972: 0x6d103c20, + 0x26974: 0x6ce6a220, + 0x26978: 0x6d34be20, 0x2697a: 0x6d027c20, 0x2697b: 0x6c942220, + 0x2697d: 0x6c875420, 0x2697f: 0x6c991620, + // Block 0x9a6, offset 0x26980 + 0x26982: 0x6cfa1820, + 0x26985: 0x6cda4420, + 0x26996: 0x6cda6c20, 0x26997: 0x6d097e20, + 0x2699d: 0x6c877a20, 0x2699e: 0x6d25d820, + 0x269a1: 0x6d2e4020, 0x269a3: 0x6cdef220, + 0x269a4: 0x6d083a20, 0x269a5: 0x6cf12020, 0x269a6: 0x6d139620, 0x269a7: 0x6cad1a20, + 0x269a8: 0x6c991820, 0x269a9: 0x6ce3b620, 0x269aa: 0x6cb22a20, + 0x269ac: 0x6c328e20, 0x269ad: 0x6cc0a820, 0x269ae: 0x6d162c20, + 0x269b3: 0x6ceb6020, + 0x269b4: 0x6c14aa20, 0x269b7: 0x6c6d7620, + 0x269bc: 0x6c35aa20, + // Block 0x9a7, offset 0x269c0 + 0x269c3: 0x6c157420, + 0x269c4: 0x6d1c4420, 0x269c5: 0x6c8dae20, 0x269c7: 0x6cfc5e20, + 0x269c9: 0x6cb55a20, 0x269cb: 0x6d272220, + 0x269cc: 0x6c94ce20, 0x269cd: 0x6d1cda20, 0x269ce: 0x6cc21a20, + 0x269d2: 0x6c3a7820, 0x269d3: 0x6d3eca20, + 0x269d9: 0x6cbe6220, + 0x269dd: 0x6ca94020, 0x269de: 0x6cf13220, 0x269df: 0x6cd6c220, + 0x269e1: 0x6c40a420, + 0x269e4: 0x6ca1aa20, 0x269e5: 0x6ca1ac20, 0x269e6: 0x6ceb6820, 0x269e7: 0x6c14ae20, + 0x269e8: 0x6d2a1220, + 0x269ee: 0x6c84da20, 0x269ef: 0x6c84e420, + 0x269f1: 0x6cfa2020, 0x269f2: 0x6c733420, + 0x269f4: 0x6ca41a20, 0x269f5: 0x6c9db420, + 0x269f8: 0x6c5a3e20, 0x269fa: 0x6cd6f620, + 0x269fc: 0x6d066420, 0x269ff: 0x6c3a7a20, + // Block 0x9a8, offset 0x26a00 + 0x26a01: 0x6d029420, + 0x26a06: 0x6cdefa20, 0x26a07: 0x6d1e6a20, + 0x26a09: 0x6d2e4420, + 0x26a11: 0x6cbb3420, 0x26a12: 0x6ca46a20, + 0x26a14: 0x6c8c9420, + 0x26a18: 0x6c948220, 0x26a19: 0x6cfc6e20, 0x26a1a: 0x6c3f2c20, + 0x26a1c: 0x6c8df820, + 0x26a20: 0x6ccadc20, 0x26a22: 0x6c5ca620, + 0x26a28: 0x6ce66020, 0x26a2a: 0x6cbe7020, + 0x26a2c: 0x6c598a20, 0x26a2e: 0x6c01b220, + 0x26a35: 0x6c97c220, 0x26a37: 0x6ca6b220, + 0x26a3b: 0x6c4c8020, + 0x26a3c: 0x6cab8820, 0x26a3f: 0x6cfe4620, + // Block 0x9a9, offset 0x26a40 + 0x26a41: 0x6c6c5620, + 0x26a46: 0x6d32f620, + 0x26a48: 0x6ca2cc20, 0x26a4b: 0x6cca5e20, + 0x26a4c: 0x6c56d020, 0x26a4e: 0x6d40f020, 0x26a4f: 0x6c5b7620, + 0x26a52: 0x6c5f7420, + 0x26a56: 0x6d138a20, + 0x26a66: 0x6d03de20, + 0x26a69: 0x6c7e6c20, 0x26a6a: 0x6d232220, 0x26a6b: 0x6c745820, + 0x26a71: 0x6cd5da20, 0x26a72: 0x6d32d620, + 0x26a74: 0x6d1e4e20, 0x26a76: 0x6c439c20, + 0x26a78: 0x6c66ae20, 0x26a79: 0x6d034820, + 0x26a7c: 0x6c5aec20, 0x26a7f: 0x6cd67820, + // Block 0x9aa, offset 0x26a80 + 0x26a82: 0x6c1cf020, 0x26a83: 0x6c4f8a20, + 0x26a88: 0x6c8a6420, + 0x26a8d: 0x6c674a20, 0x26a8f: 0x6c456c20, + 0x26a91: 0x6d3d3020, + 0x26a97: 0x6cb6de20, + 0x26a9c: 0x6cb8b820, 0x26a9e: 0x6c30e220, 0x26a9f: 0x6cb30220, + 0x26aa2: 0x6c567a20, + 0x26aa5: 0x6ca98c20, 0x26aa7: 0x6cb76420, + 0x26aa8: 0x6c2db420, 0x26aa9: 0x6c2db620, 0x26aab: 0x6c85b220, + 0x26aae: 0x6d046220, + 0x26abd: 0x6ca2da20, 0x26abf: 0x6d32a620, + // Block 0x9ab, offset 0x26ac0 + 0x26ac0: 0x6c7e6e20, 0x26ac1: 0x6d35cc20, 0x26ac3: 0x6c35b220, + 0x26ac4: 0x6c0e6620, 0x26ac5: 0x6cb30620, 0x26ac6: 0x6d058420, 0x26ac7: 0x6d1e7a20, + 0x26ac8: 0x6c223c20, 0x26ac9: 0x6c85e220, + 0x26acc: 0x6cad5820, 0x26acf: 0x6d053a20, + 0x26adb: 0x6cb4a820, + 0x26add: 0x6c17e420, 0x26ade: 0x6cb78420, + 0x26ae1: 0x6d177620, 0x26ae3: 0x6ce31c20, + 0x26ae4: 0x6c348820, 0x26ae5: 0x6c8f9020, 0x26ae7: 0x6c668020, + 0x26aed: 0x6d2e6020, 0x26aee: 0x6d261220, + 0x26af6: 0x6d210820, + 0x26af8: 0x6c44ca20, 0x26afa: 0x6c546c20, + 0x26afe: 0x6cb6f820, + // Block 0x9ac, offset 0x26b00 + 0x26b00: 0x6ca28c20, 0x26b01: 0x6c592a20, 0x26b02: 0x6c906a20, 0x26b03: 0x6cf89420, + 0x26b04: 0x6c356c20, 0x26b05: 0x6c80fe20, 0x26b06: 0x6c3aae20, 0x26b07: 0x6ced2820, + 0x26b09: 0x6c259620, 0x26b0b: 0x6caea420, + 0x26b0f: 0x6c262c20, + 0x26b10: 0x6cf22420, + 0x26b21: 0x6c430620, + 0x26b25: 0x6c254820, + 0x26b28: 0x6cb7a620, 0x26b29: 0x6c83fe20, 0x26b2a: 0x6cbcc820, 0x26b2b: 0x6cba6020, + 0x26b2c: 0x6c798220, 0x26b2d: 0x6c082220, 0x26b2f: 0x6cd46c20, + 0x26b37: 0x6ceea220, + // Block 0x9ad, offset 0x26b40 + 0x26b44: 0x6cccf220, + 0x26b4f: 0x6d3e6e20, + 0x26b52: 0x6ce40c20, 0x26b53: 0x6cb90e20, + 0x26b54: 0x6c31ac20, 0x26b57: 0x6ce8dc20, + 0x26b5a: 0x6ceeaa20, + 0x26b5e: 0x6c558420, 0x26b5f: 0x6d038e20, + 0x26b61: 0x6ccd0220, 0x26b62: 0x6d354a20, + 0x26b67: 0x6c1bb820, + 0x26b78: 0x6d394a20, 0x26b79: 0x6cf23620, 0x26b7a: 0x6c1b4c20, 0x26b7b: 0x6cdd9420, + 0x26b7c: 0x6d020220, 0x26b7e: 0x6c78d220, + // Block 0x9ae, offset 0x26b80 + 0x26b81: 0x6ccca220, 0x26b82: 0x6cd1f220, 0x26b83: 0x6cd47820, + 0x26b85: 0x6c6bfc20, + 0x26b89: 0x6c431c20, 0x26b8a: 0x6c93b220, + 0x26b94: 0x6d020420, + 0x26b9a: 0x6d354c20, + 0x26b9e: 0x6c978220, + 0x26ba0: 0x6cd67420, 0x26ba1: 0x6c78da20, 0x26ba3: 0x6c2dfe20, + 0x26ba4: 0x6d141a20, 0x26ba6: 0x6cdb2420, 0x26ba7: 0x6c206420, + 0x26bb1: 0x6c256820, 0x26bb2: 0x6cebb220, + 0x26bb5: 0x6d022020, + 0x26bbd: 0x6d082620, + // Block 0x9af, offset 0x26bc0 + 0x26bc2: 0x6c51f420, 0x26bc3: 0x6c74ce20, + 0x26bc6: 0x6ce43020, 0x26bc7: 0x6c3ada20, + 0x26bc9: 0x6d355620, 0x26bca: 0x6cd3e820, 0x26bcb: 0x6ce9c620, + 0x26bce: 0x6c1cea20, + 0x26bd0: 0x6ce43220, 0x26bd1: 0x6d2e8820, 0x26bd2: 0x6c527820, + 0x26bd4: 0x6cc1de20, 0x26bd5: 0x6cef4220, 0x26bd7: 0x6c33ba20, + 0x26bd8: 0x6c067220, + 0x26bdc: 0x6c8a2c20, + 0x26be4: 0x6cd83620, + 0x26bea: 0x6c0c8420, 0x26beb: 0x6d023420, + 0x26bec: 0x6c0cfc20, 0x26bee: 0x6c23d820, + 0x26bf2: 0x6c72ac20, 0x26bf3: 0x6c518820, + 0x26bf7: 0x6c7d3020, + 0x26bf8: 0x6d1dc820, + // Block 0x9b0, offset 0x26c00 + 0x26c00: 0x6cd62220, + 0x26c0d: 0x6ca89a20, 0x26c0f: 0x6d21da20, + 0x26c10: 0x6d3dca20, 0x26c11: 0x6c9b8c20, 0x26c12: 0x6c55f220, + 0x26c15: 0x6c8b6220, + 0x26c1d: 0x6c6a4020, 0x26c1e: 0x6d048220, + 0x26c23: 0x6d0e0020, + 0x26c29: 0x6c6b7a20, 0x26c2a: 0x6c7eb820, 0x26c2b: 0x6cd62e20, + 0x26c2c: 0x6c6b7c20, 0x26c2d: 0x6c828220, + 0x26c30: 0x6d40fc20, 0x26c32: 0x6cd40420, + 0x26c38: 0x6cef6c20, 0x26c39: 0x6c318620, 0x26c3a: 0x6cdb6420, + // Block 0x9b1, offset 0x26c40 + 0x26c43: 0x6d012e20, + 0x26c44: 0x6cc4f620, + 0x26c4c: 0x6c964e20, + 0x26c51: 0x6cb96420, + 0x26c58: 0x6ca48620, 0x26c59: 0x6c8dec20, + 0x26c5c: 0x6c630620, + 0x26c60: 0x6ca03e20, 0x26c63: 0x6c476220, + 0x26c68: 0x6d080c20, + 0x26c6c: 0x6d058e20, + 0x26c71: 0x6c0f3620, + 0x26c7c: 0x6ceebc20, + // Block 0x9b2, offset 0x26c80 + 0x26c82: 0x6c7a6e20, + 0x26c86: 0x6cecf020, + 0x26c88: 0x6c143c20, 0x26c8a: 0x6c996820, 0x26c8b: 0x6c789a20, + 0x26c8e: 0x6c22c420, + 0x26c92: 0x6cfcbc20, 0x26c93: 0x6ca11620, + 0x26c9a: 0x6c5cc420, 0x26c9b: 0x6c162c20, + 0x26c9c: 0x6cd1c620, 0x26c9d: 0x6d31dc20, 0x26c9e: 0x6c364420, 0x26c9f: 0x6c9c5a20, + 0x26ca1: 0x6cd1c820, 0x26ca2: 0x6cc11420, 0x26ca3: 0x6cd4e420, + 0x26ca5: 0x6c220420, 0x26ca6: 0x6d0d9420, + 0x26ca9: 0x6c54dc20, 0x26caa: 0x6cb50220, 0x26cab: 0x6d366c20, + 0x26cac: 0x6c599c20, + 0x26cb4: 0x6d353820, 0x26cb6: 0x6d1fda20, + 0x26cbc: 0x6c435420, 0x26cbd: 0x6d11c420, 0x26cbe: 0x6cb3cc20, + // Block 0x9b3, offset 0x26cc0 + 0x26cc7: 0x6d153620, + 0x26cc8: 0x6c1a8420, 0x26cc9: 0x6c625020, 0x26ccb: 0x6c007420, + 0x26ccd: 0x6c308620, 0x26ccf: 0x6cdc6220, + 0x26cd1: 0x6c701c20, + 0x26cd8: 0x6cb7c820, 0x26cd9: 0x6c884420, 0x26cda: 0x6d085620, + 0x26cdc: 0x6c8a7620, + 0x26ce1: 0x6d285820, 0x26ce2: 0x6d085a20, 0x26ce3: 0x6c23e620, + 0x26ce4: 0x6cb10020, 0x26ce6: 0x6c7c9c20, + 0x26ce8: 0x6ce37a20, 0x26ce9: 0x6c58e020, 0x26cea: 0x6c280020, 0x26ceb: 0x6c4b7820, + 0x26cec: 0x6c188a20, 0x26cee: 0x6cce3c20, 0x26cef: 0x6c628620, + 0x26cf4: 0x6c891c20, 0x26cf5: 0x6c76b620, 0x26cf6: 0x6cd17820, + 0x26cf8: 0x6c30cc20, 0x26cf9: 0x6d1f8020, 0x26cfa: 0x6cb66220, + 0x26cfc: 0x6cffc620, + // Block 0x9b4, offset 0x26d00 + 0x26d02: 0x6d18f620, 0x26d03: 0x6c90c420, + 0x26d06: 0x6c206a20, + 0x26d0b: 0x6c81e620, + 0x26d0c: 0x6c42ec20, + 0x26d10: 0x6d2ba220, 0x26d12: 0x6cef6420, + 0x26d16: 0x6c653620, + 0x26d1b: 0x6d1c3220, + 0x26d1c: 0x6c38f420, 0x26d1d: 0x6c877c20, 0x26d1e: 0x6cb94e20, + 0x26d22: 0x6d125420, + 0x26d26: 0x6c7c5a20, 0x26d27: 0x6cef7a20, + 0x26d29: 0x6cc42620, + 0x26d2c: 0x6cffca20, 0x26d2d: 0x6cc42820, + 0x26d30: 0x6c551820, + 0x26d35: 0x6c342020, 0x26d36: 0x6c1f1e20, + 0x26d39: 0x6ccfd620, + 0x26d3c: 0x6d3d5620, 0x26d3d: 0x6c355e20, 0x26d3e: 0x6c61f820, + // Block 0x9b5, offset 0x26d40 + 0x26d41: 0x6cdfde20, 0x26d43: 0x6cabc420, + 0x26d4b: 0x6c6be220, + 0x26d4c: 0x6cbc4220, + 0x26d51: 0x6cb99620, 0x26d52: 0x6c724c20, + 0x26d55: 0x6cc06e20, 0x26d56: 0x6ceb2220, + 0x26d5a: 0x6caafa20, 0x26d5b: 0x6cd8c620, + 0x26d5f: 0x6d14fe20, + 0x26d61: 0x6c47a220, 0x26d62: 0x6c5d3220, 0x26d63: 0x6cabda20, + 0x26d64: 0x6d3e5a20, 0x26d66: 0x6c685220, + 0x26d69: 0x6cf80420, 0x26d6a: 0x6cceb820, + 0x26d6c: 0x6d153820, 0x26d6d: 0x6d369e20, + 0x26d75: 0x6c952420, 0x26d77: 0x6d38a020, + 0x26d78: 0x6c74a420, 0x26d79: 0x6ce00620, 0x26d7a: 0x6cab0c20, 0x26d7b: 0x6c728020, + 0x26d7c: 0x6c559c20, 0x26d7e: 0x6d36c220, + // Block 0x9b6, offset 0x26d80 + 0x26d83: 0x6c088820, + 0x26d8d: 0x6c1c7220, 0x26d8e: 0x6d07d020, 0x26d8f: 0x6c60b620, + 0x26d90: 0x6c48a020, 0x26d91: 0x6c715e20, 0x26d92: 0x6cf31620, 0x26d93: 0x6ceb4a20, + 0x26d95: 0x6cc09820, 0x26d96: 0x6ceebe20, 0x26d97: 0x6c32a220, + 0x26d99: 0x6cd47c20, 0x26d9b: 0x6d31fe20, + 0x26d9c: 0x6ca55420, 0x26d9f: 0x6cf8f620, + 0x26da0: 0x6d30a420, 0x26da1: 0x6d371620, 0x26da3: 0x6ca2ea20, + 0x26da8: 0x6c650620, + 0x26dae: 0x6d114e20, 0x26daf: 0x6c4c9820, + 0x26db2: 0x6c2c0820, + 0x26db4: 0x6c5e1c20, 0x26db5: 0x6c6de220, + 0x26dbc: 0x6c74ec20, 0x26dbd: 0x6d270820, + // Block 0x9b7, offset 0x26dc0 + 0x26dc4: 0x6c60ee20, 0x26dc6: 0x6cdb5c20, + 0x26dc8: 0x6c654020, 0x26dca: 0x6c7d9820, 0x26dcb: 0x6cf33220, + 0x26dcc: 0x6c7c1e20, 0x26dcd: 0x6c0c6020, 0x26dce: 0x6c751220, + 0x26dd1: 0x6c0ad620, 0x26dd3: 0x6c157a20, + 0x26dd5: 0x6d3ecc20, 0x26dd6: 0x6c87c220, + 0x26dda: 0x6c3d0e20, 0x26ddb: 0x6cb9f020, + 0x26ddc: 0x6d0d4020, 0x26dde: 0x6ce08c20, 0x26ddf: 0x6ca0d820, + 0x26de3: 0x6c79e420, + 0x26de4: 0x6cf5d420, + 0x26dee: 0x6c569220, 0x26def: 0x6c569420, + 0x26df1: 0x6c3e7020, + 0x26df4: 0x6d104c20, 0x26df5: 0x6c4cea20, 0x26df7: 0x6cc57020, + 0x26df8: 0x6d1b4c20, 0x26df9: 0x6c3c4420, 0x26dfa: 0x6c75b620, + 0x26dfc: 0x6d27a620, 0x26dff: 0x6d0a8820, + // Block 0x9b8, offset 0x26e00 + 0x26e01: 0x6cf87c20, + 0x26e0e: 0x6cf96220, + 0x26e11: 0x6c4f7620, + 0x26e1a: 0x6c569620, + 0x26e1d: 0x6c54d020, 0x26e1e: 0x6cb4aa20, 0x26e1f: 0x6c385020, + 0x26e24: 0x6c636420, 0x26e27: 0x6d150420, + 0x26e2d: 0x6ceac820, 0x26e2e: 0x6ca2e220, + 0x26e38: 0x6d1a6a20, 0x26e39: 0x6d1b5a20, + // Block 0x9b9, offset 0x26e40 + 0x26e43: 0x6c622a20, + 0x26e44: 0x6cee5620, 0x26e45: 0x6cd3a420, 0x26e46: 0x6c330c20, 0x26e47: 0x6c34fc20, + 0x26e49: 0x6ceb3020, 0x26e4a: 0x6cebe620, 0x26e4b: 0x6c863e20, + 0x26e4f: 0x6cc55220, + 0x26e52: 0x6c22d020, 0x26e53: 0x6d070220, + 0x26e54: 0x6d389020, 0x26e55: 0x6d3f5a20, + 0x26e5c: 0x6cee2a20, 0x26e5d: 0x6d0b5820, 0x26e5f: 0x6c622c20, + 0x26e60: 0x6c179e20, + 0x26e69: 0x6c606020, + 0x26e75: 0x6ccd5420, 0x26e76: 0x6ce8de20, + 0x26e78: 0x6c0cf620, 0x26e79: 0x6cf8be20, 0x26e7a: 0x6caf7e20, 0x26e7b: 0x6d2cd420, + 0x26e7e: 0x6c5c0620, + // Block 0x9ba, offset 0x26e80 + 0x26e80: 0x6cdd3020, 0x26e82: 0x6c51da20, + 0x26e84: 0x6d265220, 0x26e86: 0x6cf37c20, + 0x26e88: 0x6c8d4020, 0x26e8a: 0x6d2cd620, 0x26e8b: 0x6c574a20, + 0x26e97: 0x6c151220, + 0x26e9f: 0x6c367620, + 0x26ea1: 0x6c18e020, + 0x26ea7: 0x6cdc6620, + 0x26ea9: 0x6ce51420, + 0x26eb0: 0x6d36c420, 0x26eb1: 0x6ce41620, 0x26eb2: 0x6c022e20, 0x26eb3: 0x6d3d9020, + 0x26eb4: 0x6d3f6020, 0x26eb5: 0x6c783020, 0x26eb7: 0x6ccb4e20, + 0x26eb8: 0x6ce4c220, 0x26eb9: 0x6c92b620, + 0x26ebe: 0x6ccd2620, 0x26ebf: 0x6d2c9020, + // Block 0x9bb, offset 0x26ec0 + 0x26ec3: 0x6c1cde20, + 0x26ec5: 0x6d0ea620, + 0x26ed2: 0x6ca25420, 0x26ed3: 0x6c54fc20, + 0x26eda: 0x6c1ad420, + 0x26edd: 0x6cdb0a20, + 0x26ee3: 0x6ca51420, + 0x26ee6: 0x6c60b820, 0x26ee7: 0x6c346020, + 0x26ee8: 0x6c547e20, 0x26eea: 0x6c23de20, 0x26eeb: 0x6d2c0220, + 0x26eec: 0x6d1a9c20, 0x26eee: 0x6cffbe20, + 0x26ef0: 0x6c0bbc20, 0x26ef1: 0x6c085220, 0x26ef2: 0x6c7e9a20, + 0x26ef4: 0x6c1ad820, 0x26ef6: 0x6cb87820, + 0x26ef8: 0x6c015220, 0x26ef9: 0x6cd1fe20, + 0x26efc: 0x6c1c7420, + // Block 0x9bc, offset 0x26f00 + 0x26f05: 0x6caa6a20, 0x26f07: 0x6c628820, + 0x26f13: 0x6cab9220, + 0x26f15: 0x6cf97a20, + 0x26f18: 0x6c14a020, 0x26f1a: 0x6c005620, + 0x26f1d: 0x6cd17c20, 0x26f1e: 0x6c518220, + 0x26f20: 0x6c60ca20, 0x26f21: 0x6c1ade20, 0x26f22: 0x6cf8fa20, 0x26f23: 0x6d32fe20, + 0x26f26: 0x6cde0020, + 0x26f28: 0x6c96e220, 0x26f2b: 0x6caf9a20, + 0x26f2e: 0x6d05f220, 0x26f2f: 0x6cba2a20, + 0x26f39: 0x6cfa4e20, + // Block 0x9bd, offset 0x26f40 + 0x26f4a: 0x6d241a20, + 0x26f51: 0x6c6b4620, 0x26f52: 0x6cfa5420, 0x26f53: 0x6c91ee20, + 0x26f55: 0x6cbcf620, 0x26f57: 0x6c145220, + 0x26f5b: 0x6d107020, + 0x26f5c: 0x6c62b020, 0x26f5d: 0x6ccc3620, 0x26f5e: 0x6c912020, + 0x26f60: 0x6c5f7620, 0x26f61: 0x6d373020, 0x26f62: 0x6cee5c20, + 0x26f64: 0x6c0a9820, 0x26f65: 0x6c015820, 0x26f66: 0x6d142a20, 0x26f67: 0x6c015a20, + 0x26f6c: 0x6c847620, + 0x26f79: 0x6cfaec20, + 0x26f7e: 0x6c703620, 0x26f7f: 0x6ce08420, + // Block 0x9be, offset 0x26f80 + 0x26f81: 0x6c507a20, 0x26f82: 0x6c520620, + 0x26f85: 0x6d2c0620, 0x26f86: 0x6d2e2e20, 0x26f87: 0x6d191a20, + 0x26f88: 0x6cf91a20, 0x26f8a: 0x6cf91c20, 0x26f8b: 0x6c384420, + 0x26f8c: 0x6d0cf620, 0x26f8f: 0x6ca25620, + 0x26f95: 0x6c474020, + 0x26f9e: 0x6d27d020, + 0x26fa4: 0x6d384820, 0x26fa6: 0x6c160220, 0x26fa7: 0x6c208620, + 0x26fa8: 0x6c5c8a20, 0x26fa9: 0x6d28d620, 0x26faa: 0x6c4c0820, 0x26fab: 0x6c661c20, + 0x26fac: 0x6d0b3e20, + 0x26fb0: 0x6cfe6820, 0x26fb1: 0x6c520820, + // Block 0x9bf, offset 0x26fc0 + 0x26fc3: 0x6c28e820, + 0x26fc7: 0x6c9df020, + 0x26fc8: 0x6ca93a20, 0x26fca: 0x6c9ba620, + 0x26fcc: 0x6c8b6e20, 0x26fcd: 0x6d396a20, 0x26fce: 0x6cb42220, 0x26fcf: 0x6cdf0a20, + 0x26fd3: 0x6d1cd020, + 0x26fd4: 0x6ce2cc20, 0x26fd5: 0x6c4ca220, + 0x26fda: 0x6cbb3020, + 0x26fdc: 0x6c942420, 0x26fdd: 0x6cc9b820, 0x26fde: 0x6c8b7020, 0x26fdf: 0x6c1b6c20, + 0x26fe0: 0x6d015020, 0x26fe3: 0x6c4ca820, + 0x26fe4: 0x6c067e20, 0x26fe5: 0x6c964220, 0x26fe6: 0x6c73a420, + 0x26fea: 0x6c36e820, + 0x26ff3: 0x6c51a820, + 0x26ff5: 0x6c9aba20, + 0x26ff8: 0x6d028820, 0x26ff9: 0x6cb22c20, 0x26ffb: 0x6c4dc420, + 0x26ffc: 0x6c194420, 0x26ffd: 0x6ccdec20, 0x26ffe: 0x6c5ca020, + // Block 0x9c0, offset 0x27000 + 0x27006: 0x6d1c4820, + 0x27008: 0x6c663e20, + 0x2700d: 0x6c016620, + 0x27011: 0x6cdef420, 0x27012: 0x6d144220, 0x27013: 0x6ce9dc20, + 0x27017: 0x6c8ef220, + 0x27019: 0x6d425a20, 0x2701b: 0x6c84ec20, + 0x2701d: 0x6cb23420, 0x2701e: 0x6d098420, + 0x27020: 0x6ca5a220, 0x27021: 0x6c315820, + 0x27024: 0x6c806c20, + 0x2702a: 0x6d2d5e20, 0x2702b: 0x6c73e620, + 0x2702c: 0x6d314620, 0x2702d: 0x6c600c20, 0x2702e: 0x6cb8ce20, + 0x27030: 0x6c4da220, 0x27031: 0x6c3b7220, 0x27033: 0x6c4da420, + 0x27034: 0x6c535620, 0x27035: 0x6c514620, 0x27036: 0x6c541a20, + 0x2703a: 0x6d2e7820, 0x2703b: 0x6c1dd420, + 0x2703c: 0x6cdf7e20, 0x2703d: 0x6cba7820, 0x2703f: 0x6ccf7420, + // Block 0x9c1, offset 0x27040 + 0x27040: 0x6d1bee20, 0x27043: 0x6cbd4020, + 0x27046: 0x6c5e0e20, + 0x27048: 0x6cf8fc20, 0x27049: 0x6c51f820, 0x2704a: 0x6cf90820, 0x2704b: 0x6cf97e20, + 0x2704c: 0x6c4fb620, 0x2704d: 0x6c81e820, 0x2704f: 0x6c870c20, + 0x27052: 0x6c19a220, + 0x27056: 0x6c760620, 0x27057: 0x6cf76020, + 0x27058: 0x6c4e7620, + 0x2705e: 0x6c311620, + 0x27060: 0x6c30ae20, 0x27061: 0x6cec9220, + 0x27064: 0x6c30b020, 0x27065: 0x6d293820, 0x27066: 0x6c737a20, + 0x27068: 0x6c90e620, 0x27069: 0x6c1f6220, 0x2706b: 0x6d32ea20, + 0x2706f: 0x6cb64420, + 0x27070: 0x6c770e20, 0x27071: 0x6c5df420, 0x27072: 0x6c7f2420, + 0x2707a: 0x6c410620, + 0x2707c: 0x6cd48220, 0x2707e: 0x6c301a20, + // Block 0x9c2, offset 0x27080 + 0x27083: 0x6c90c820, + 0x27084: 0x6ce93e20, 0x27087: 0x6d21ca20, + 0x27088: 0x6cf52e20, 0x2708a: 0x6ce4ce20, + 0x27092: 0x6c4c9e20, + 0x27098: 0x6ce04420, 0x27099: 0x6cb6ae20, + 0x270a0: 0x6c8b8020, 0x270a1: 0x6c87b420, 0x270a3: 0x6d09d020, + 0x270a8: 0x6c452820, 0x270a9: 0x6ce63820, 0x270aa: 0x6c4ea220, 0x270ab: 0x6c1f2a20, + 0x270ad: 0x6cea4c20, 0x270af: 0x6d047a20, + 0x270b0: 0x6d1f3020, 0x270b1: 0x6ca11820, 0x270b2: 0x6c1ba420, + 0x270b4: 0x6c562020, 0x270b5: 0x6c317020, 0x270b7: 0x6ca24420, + 0x270b9: 0x6ca34420, 0x270bb: 0x6c8d0c20, + 0x270bf: 0x6c00ae20, + // Block 0x9c3, offset 0x270c0 + 0x270c0: 0x6cfab020, + 0x270c4: 0x6c76e020, 0x270c5: 0x6cd8cc20, 0x270c6: 0x6cca0420, + 0x270ca: 0x6d180e20, + 0x270cf: 0x6d183c20, + 0x270d0: 0x6d000020, 0x270d2: 0x6d340820, 0x270d3: 0x6c313020, + 0x270d8: 0x6c973e20, + 0x270dc: 0x6c950a20, 0x270dd: 0x6c74a820, + 0x270e1: 0x6cbad620, 0x270e2: 0x6c8d4a20, + 0x270e9: 0x6cb12c20, 0x270ea: 0x6c23fc20, 0x270eb: 0x6c351820, + 0x270ec: 0x6d229420, + 0x270f0: 0x6d3d0a20, 0x270f2: 0x6cf8fe20, 0x270f3: 0x6c581620, + 0x270f4: 0x6ca02020, 0x270f5: 0x6ce14420, + 0x270f9: 0x6cb41820, 0x270fb: 0x6c9da420, + 0x270fc: 0x6c979020, 0x270fe: 0x6c48d420, + // Block 0x9c4, offset 0x27100 + 0x27100: 0x6cb93620, 0x27102: 0x6c8bfa20, 0x27103: 0x6c9fd620, + 0x27104: 0x6cf04e20, 0x27105: 0x6c136820, 0x27107: 0x6c56e220, + 0x27108: 0x6cdc0420, 0x2710b: 0x6c72bc20, + 0x2710c: 0x6ccc8420, 0x2710d: 0x6c9ba820, + 0x27117: 0x6cef7620, + 0x27118: 0x6cf75a20, 0x27119: 0x6c8e2a20, + 0x2711c: 0x6c0ad820, 0x2711d: 0x6cf13820, + 0x27121: 0x6c85b420, 0x27122: 0x6d304420, + 0x27124: 0x6d1df220, 0x27125: 0x6c554e20, 0x27126: 0x6cecda20, 0x27127: 0x6c034c20, + 0x27128: 0x6c649220, + 0x2712d: 0x6d426a20, 0x2712e: 0x6d2df220, 0x2712f: 0x6c0e7a20, + 0x27130: 0x6cbfb220, 0x27131: 0x6d0f5a20, + 0x27134: 0x6c300620, 0x27135: 0x6cc19820, + 0x2713a: 0x6caff820, 0x2713b: 0x6d2d2c20, + 0x2713e: 0x6cccf420, 0x2713f: 0x6c46bc20, + // Block 0x9c5, offset 0x27140 + 0x27140: 0x6c0c9020, 0x27141: 0x6d152220, 0x27142: 0x6c3eaa20, + 0x27144: 0x6d034020, 0x27145: 0x6cd3a620, 0x27146: 0x6ce6fc20, + 0x27149: 0x6c2f6220, + 0x2714c: 0x6ce86e20, 0x2714d: 0x6cfef620, 0x2714e: 0x6cf3e020, 0x2714f: 0x6cade420, + 0x27150: 0x6c5ade20, + 0x27155: 0x6c7f2220, + 0x27159: 0x6cd8e220, 0x2715a: 0x6c250220, 0x2715b: 0x6ccc7220, + 0x2715c: 0x6d38f020, 0x2715d: 0x6d2fd820, 0x2715e: 0x6cef3220, 0x2715f: 0x6c7f2620, + 0x27160: 0x6c0a3a20, 0x27163: 0x6c303e20, + 0x27166: 0x6ca51620, 0x27167: 0x6d005420, + 0x27168: 0x6cc54020, 0x27169: 0x6ce98e20, 0x2716a: 0x6cf0d820, 0x2716b: 0x6d1f7020, + 0x2716c: 0x6c9a2820, 0x2716d: 0x6d25b220, 0x2716e: 0x6d384220, + 0x27176: 0x6cd9ea20, + 0x27178: 0x6c474820, 0x27179: 0x6ccee620, 0x2717b: 0x6d2f9220, + 0x2717c: 0x6cb02820, 0x2717f: 0x6ce70820, + // Block 0x9c6, offset 0x27180 + 0x27181: 0x6c1ae220, 0x27182: 0x6caedc20, 0x27183: 0x6c153c20, + 0x27184: 0x6d1dca20, 0x27185: 0x6cd6ea20, 0x27187: 0x6cf48420, + 0x27189: 0x6cb03020, 0x2718a: 0x6c596020, + 0x2718c: 0x6c3f1e20, 0x2718e: 0x6c0c9620, + 0x27193: 0x6ca4d020, + 0x27195: 0x6c0c9820, 0x27196: 0x6cf11420, 0x27197: 0x6d1dd620, + 0x27199: 0x6ca52620, 0x2719a: 0x6c48fe20, + 0x271a0: 0x6c879220, 0x271a2: 0x6d035e20, 0x271a3: 0x6d0d2220, + 0x271a4: 0x6cb37420, 0x271a5: 0x6cadca20, + 0x271aa: 0x6cdd5c20, + 0x271ac: 0x6cc5e220, 0x271ad: 0x6ccd3a20, + 0x271b2: 0x6cdd5e20, + 0x271b8: 0x6c27d620, 0x271ba: 0x6c9af020, + // Block 0x9c7, offset 0x271c0 + 0x271c3: 0x6cd44820, + 0x271c8: 0x6c46a620, 0x271ca: 0x6c4da620, 0x271cb: 0x6cd39020, + 0x271cc: 0x6d102020, 0x271ce: 0x6c479620, + 0x271db: 0x6c77fe20, + 0x271de: 0x6c709c20, + 0x271e0: 0x6cac2e20, 0x271e1: 0x6c12f820, 0x271e2: 0x6c05b220, 0x271e3: 0x6d047020, + 0x271e4: 0x6c111420, 0x271e7: 0x6c8c2420, + 0x271e8: 0x6c00b020, + 0x271ec: 0x6c9d6220, 0x271ed: 0x6c7f3e20, + 0x271f1: 0x6cfee020, 0x271f3: 0x6ccf1e20, + 0x271fb: 0x6c5d7c20, + 0x271fc: 0x6ca6b420, + // Block 0x9c8, offset 0x27200 + 0x27204: 0x6d335620, 0x27206: 0x6c8c5c20, 0x27207: 0x6d2c4420, + 0x2720a: 0x6d27be20, + 0x2720d: 0x6d071c20, + 0x27214: 0x6c1a2a20, 0x27215: 0x6cf2c020, 0x27216: 0x6cf68620, + 0x27219: 0x6c074820, + 0x2721c: 0x6cce1c20, + 0x27220: 0x6d23d020, 0x27221: 0x6c9d8020, + 0x27232: 0x6c32b020, + 0x27235: 0x6c144a20, 0x27237: 0x6d2b0820, + 0x27238: 0x6c1a8820, 0x2723a: 0x6ce69220, + // Block 0x9c9, offset 0x27240 + 0x27245: 0x6d157020, + 0x2724b: 0x6d10ba20, + 0x2724e: 0x6c7a6620, + 0x27250: 0x6c3b9c20, 0x27251: 0x6d010420, 0x27252: 0x6c1a8a20, + 0x2725b: 0x6c7d2420, + 0x2725f: 0x6c0d6220, + 0x27261: 0x6c90cc20, + 0x27265: 0x6d18fa20, 0x27266: 0x6c9da620, 0x27267: 0x6d024620, + 0x27271: 0x6c4a9c20, 0x27273: 0x6c955e20, + 0x27276: 0x6ccdce20, + 0x2727e: 0x6c717a20, 0x2727f: 0x6c318420, + // Block 0x9ca, offset 0x27280 + 0x27282: 0x6cfaf220, + 0x27285: 0x6d356020, + 0x27288: 0x6c0d9020, + 0x27295: 0x6d356220, 0x27296: 0x6d3bfa20, 0x27297: 0x6d092a20, + 0x27298: 0x6c893020, 0x27299: 0x6cdcb220, + 0x272a6: 0x6c808c20, 0x272a7: 0x6c72cc20, + 0x272a8: 0x6c9df220, 0x272a9: 0x6d0ab420, 0x272aa: 0x6d2ea020, 0x272ab: 0x6c4c0c20, + 0x272b2: 0x6d376820, + 0x272bd: 0x6cf12c20, 0x272be: 0x6cc36a20, 0x272bf: 0x6c14ac20, + // Block 0x9cb, offset 0x272c0 + 0x272c8: 0x6cc63020, 0x272ca: 0x6d272820, + 0x272cc: 0x6d3ece20, + 0x272d0: 0x6c965420, 0x272d1: 0x6c4b3620, 0x272d3: 0x6c19f420, + 0x272d5: 0x6c709e20, 0x272d6: 0x6ce4fe20, 0x272d7: 0x6ced9820, + 0x272db: 0x6d33d820, + 0x272de: 0x6ca42c20, + 0x272e3: 0x6c4db420, + 0x272e8: 0x6cf6b020, 0x272e9: 0x6c8bd420, + 0x272ec: 0x6d0c2e20, 0x272ed: 0x6d074220, + 0x272f2: 0x6c56d220, 0x272f3: 0x6c423620, + 0x272f4: 0x6d074c20, 0x272f6: 0x6cf90a20, + 0x272fa: 0x6c258420, + 0x272fd: 0x6cf92a20, 0x272fe: 0x6c560220, + // Block 0x9cc, offset 0x27300 + 0x27305: 0x6d0c4c20, + 0x2730e: 0x6d170e20, 0x2730f: 0x6c1b1a20, + 0x27310: 0x6c741c20, 0x27312: 0x6d40b220, + 0x2731c: 0x6c699420, 0x2731d: 0x6d178220, 0x2731f: 0x6ce05e20, + 0x27320: 0x6c1c1420, 0x27321: 0x6c037a20, 0x27322: 0x6ce82820, 0x27323: 0x6d3f7a20, + 0x27324: 0x6cc05420, 0x27327: 0x6c1c1620, + 0x27328: 0x6cf7e020, + 0x27330: 0x6ca69c20, 0x27332: 0x6c241420, + 0x27334: 0x6cf44820, 0x27336: 0x6c1f4820, 0x27337: 0x6cda4e20, + 0x27338: 0x6d1df820, 0x27339: 0x6c71bc20, 0x2733a: 0x6c037e20, + 0x2733c: 0x6c229c20, 0x2733d: 0x6c2c6420, 0x2733e: 0x6cac9820, 0x2733f: 0x6c1c2620, + // Block 0x9cd, offset 0x27340 + 0x27341: 0x6cc0ac20, 0x27343: 0x6d0ca420, + 0x2734d: 0x6d2d2e20, + 0x27352: 0x6cfce220, 0x27353: 0x6c084620, + 0x27354: 0x6c7ba620, 0x27355: 0x6cb7a820, 0x27356: 0x6d389220, 0x27357: 0x6c713820, + 0x27358: 0x6cbcca20, 0x27359: 0x6ca13420, 0x2735a: 0x6d258c20, + 0x2735c: 0x6c4b5820, 0x2735d: 0x6d417220, + 0x27367: 0x6cbccc20, + 0x27370: 0x6c558a20, 0x27371: 0x6cc08820, 0x27372: 0x6c4d2220, 0x27373: 0x6c402c20, + 0x27374: 0x6c812a20, 0x27375: 0x6ccc6c20, 0x27376: 0x6cf68820, 0x27377: 0x6c101c20, + 0x27378: 0x6cd3ba20, 0x27379: 0x6d1e5220, 0x2737a: 0x6c49f020, + 0x2737c: 0x6ca85420, 0x2737f: 0x6c545820, + // Block 0x9ce, offset 0x27380 + 0x2738a: 0x6c9d7220, + 0x2738e: 0x6c369420, 0x2738f: 0x6cfb8a20, + 0x27390: 0x6d280020, 0x27391: 0x6d073220, 0x27392: 0x6cbde420, 0x27393: 0x6c301220, + 0x27394: 0x6c838220, 0x27395: 0x6cb7ca20, 0x27396: 0x6c7fb020, 0x27397: 0x6c3ee420, + 0x27398: 0x6cb71420, 0x27399: 0x6c1d3e20, + 0x2739c: 0x6c245c20, 0x2739f: 0x6ca16620, + 0x273a0: 0x6c06b820, + 0x273a4: 0x6c2a2e20, + 0x273a8: 0x6c6b3a20, 0x273a9: 0x6c1d5c20, 0x273aa: 0x6c1c7620, 0x273ab: 0x6d23f820, + 0x273ac: 0x6c24ee20, 0x273ad: 0x6cdb2620, 0x273ae: 0x6ce42420, 0x273af: 0x6cd61020, + 0x273b0: 0x6d2c4c20, 0x273b1: 0x6c3ef820, 0x273b3: 0x6c184620, + 0x273b4: 0x6c3d0c20, 0x273b5: 0x6c543220, 0x273b6: 0x6d2c4e20, + // Block 0x9cf, offset 0x273c0 + 0x273c4: 0x6c6b3c20, 0x273c5: 0x6d2c5020, 0x273c6: 0x6d2d9c20, + 0x273c9: 0x6d0dde20, 0x273ca: 0x6c4d3020, 0x273cb: 0x6cf48220, + 0x273cc: 0x6c576220, 0x273cd: 0x6c2cde20, 0x273ce: 0x6d115420, 0x273cf: 0x6cd9ec20, + 0x273d0: 0x6cb92c20, 0x273d1: 0x6c60cc20, 0x273d2: 0x6d04aa20, 0x273d3: 0x6cb7f020, + 0x273d4: 0x6c758420, 0x273d6: 0x6c4d3220, + 0x273de: 0x6d0dee20, 0x273df: 0x6c6b6820, + 0x273e0: 0x6c24f420, 0x273e2: 0x6ce96a20, 0x273e3: 0x6d2ee620, + 0x273e4: 0x6cb16c20, 0x273e5: 0x6c930e20, 0x273e6: 0x6d342020, 0x273e7: 0x6c1f8820, + 0x273e8: 0x6c9da820, 0x273e9: 0x6cbaec20, 0x273eb: 0x6c892420, + 0x273f2: 0x6c86dc20, + 0x273f6: 0x6c359a20, 0x273f7: 0x6cdb5820, + 0x273f8: 0x6c74f020, 0x273fb: 0x6c717c20, + 0x273fc: 0x6ce03a20, 0x273fd: 0x6c8a4820, 0x273fe: 0x6cca0a20, 0x273ff: 0x6c309220, + // Block 0x9d0, offset 0x27400 + 0x27401: 0x6d28d420, 0x27402: 0x6d34b220, + 0x27406: 0x6d08ca20, 0x27407: 0x6c8d8620, + 0x2740a: 0x6c2abe20, + 0x2740d: 0x6d2dbe20, 0x2740e: 0x6d07f020, 0x2740f: 0x6cbdf220, + 0x27410: 0x6c69da20, 0x27411: 0x6cb0da20, + 0x27414: 0x6c4e6e20, + 0x2741a: 0x6d21f220, 0x2741b: 0x6c4ca420, + 0x2741d: 0x6d0a5420, + 0x27420: 0x6d0a5620, 0x27421: 0x6c156c20, 0x27422: 0x6c6b8020, 0x27423: 0x6c719420, + 0x27424: 0x6d0e1820, 0x27425: 0x6c31f620, 0x27427: 0x6c53e020, + 0x27428: 0x6cfd4a20, 0x27429: 0x6d0a5820, + 0x2742e: 0x6c8db020, 0x2742f: 0x6c6b8620, + 0x27430: 0x6d197e20, 0x27431: 0x6cc22a20, 0x27432: 0x6c41c020, 0x27433: 0x6c3c8c20, + 0x27435: 0x6c753820, 0x27436: 0x6cc16e20, + 0x2743b: 0x6c6fe020, + 0x2743d: 0x6c61ba20, 0x2743e: 0x6c612c20, + // Block 0x9d1, offset 0x27440 + 0x27445: 0x6cf77420, 0x27446: 0x6cacd220, + 0x27448: 0x6c7bf020, 0x27449: 0x6c7a8e20, 0x2744b: 0x6c7a9020, + 0x2744c: 0x6d2cbe20, 0x2744f: 0x6c03b220, + 0x27452: 0x6c190220, 0x27453: 0x6c569820, + 0x27454: 0x6caa6220, 0x27455: 0x6c356220, 0x27456: 0x6d046a20, 0x27457: 0x6c33ce20, + 0x27458: 0x6cd10020, 0x27459: 0x6cecdc20, 0x2745a: 0x6c3b2e20, + 0x2745d: 0x6cf60420, 0x2745e: 0x6d3e2e20, + 0x27460: 0x6c569a20, + 0x27465: 0x6c0cea20, 0x27467: 0x6ceba620, + 0x27468: 0x6c04cc20, 0x27469: 0x6c43e420, 0x2746b: 0x6c77f620, + 0x27472: 0x6d3c8c20, 0x27473: 0x6c3e9220, + 0x27474: 0x6ca12020, 0x27475: 0x6c63c620, 0x27476: 0x6ceb2620, 0x27477: 0x6d235a20, + 0x27479: 0x6ca24620, 0x2747a: 0x6c745e20, 0x2747b: 0x6c712820, + 0x2747c: 0x6c486220, 0x2747d: 0x6cb35a20, + // Block 0x9d2, offset 0x27480 + 0x27480: 0x6ca63c20, + 0x27484: 0x6cec1e20, 0x27485: 0x6d0d9620, + 0x27494: 0x6c1e2c20, 0x27495: 0x6c7ba820, 0x27496: 0x6c4d7020, + 0x27498: 0x6cfdd020, 0x27499: 0x6cf65c20, 0x2749b: 0x6c25a820, + 0x2749c: 0x6ce6fe20, 0x2749d: 0x6cc92420, 0x2749f: 0x6c345820, + 0x274a0: 0x6c182a20, + 0x274a4: 0x6c833820, 0x274a5: 0x6d3e6420, 0x274a7: 0x6d332420, + 0x274a8: 0x6d426c20, 0x274ab: 0x6c773020, + 0x274ac: 0x6d293a20, 0x274ae: 0x6d250020, 0x274af: 0x6cbf4620, + 0x274b3: 0x6c381820, + 0x274b4: 0x6d0a2220, 0x274b6: 0x6c622e20, + 0x274b8: 0x6c13a620, + // Block 0x9d3, offset 0x274c0 + 0x274c0: 0x6cd4fe20, 0x274c1: 0x6d08a820, 0x274c2: 0x6d00d220, 0x274c3: 0x6ce2f820, + 0x274c4: 0x6c4ef220, 0x274c5: 0x6cfac020, 0x274c6: 0x6ccd0420, 0x274c7: 0x6cea8c20, + 0x274c8: 0x6c4f8420, 0x274c9: 0x6c7dbc20, 0x274ca: 0x6c133620, 0x274cb: 0x6c30bc20, + 0x274cc: 0x6caac620, 0x274cd: 0x6d0e9a20, 0x274ce: 0x6c1a2c20, 0x274cf: 0x6cb40a20, + 0x274d0: 0x6cb7ba20, 0x274d1: 0x6d26d420, 0x274d2: 0x6c3d8c20, + 0x274d7: 0x6ce6dc20, + 0x274df: 0x6cf2c220, + 0x274e0: 0x6cd11220, 0x274e1: 0x6ceb8c20, + 0x274f4: 0x6ce06a20, 0x274f6: 0x6d0b6020, 0x274f7: 0x6d36ca20, + 0x274f8: 0x6c92be20, 0x274f9: 0x6d0dd020, 0x274fa: 0x6c70c220, + 0x274fd: 0x6c2a8020, 0x274ff: 0x6c1f7020, + // Block 0x9d4, offset 0x27500 + 0x27500: 0x6d412620, 0x27501: 0x6c369620, 0x27502: 0x6d349620, 0x27503: 0x6caec020, + 0x27505: 0x6c0cbe20, 0x27507: 0x6c2c0220, + 0x27510: 0x6c7f2820, 0x27512: 0x6d133020, + 0x2751c: 0x6c4fe620, 0x2751d: 0x6cac7420, 0x2751e: 0x6ce0ae20, 0x2751f: 0x6c774a20, + 0x27520: 0x6d05ea20, 0x27521: 0x6d408e20, 0x27522: 0x6c628c20, 0x27523: 0x6cf52620, + 0x27526: 0x6c204020, + 0x27529: 0x6cb3a420, 0x2752a: 0x6d0dd620, 0x2752b: 0x6cebb420, + 0x2752d: 0x6c31b820, 0x2752f: 0x6cb13020, + 0x27530: 0x6c1c7820, 0x27531: 0x6c5d4420, 0x27532: 0x6cb26820, + 0x27534: 0x6c235c20, 0x27535: 0x6d2c9620, + 0x2753a: 0x6cec9e20, + 0x2753f: 0x6cec6620, + // Block 0x9d5, offset 0x27540 + 0x27543: 0x6c36ae20, + 0x27544: 0x6cf0da20, 0x27545: 0x6c040420, 0x27547: 0x6c678020, + 0x27553: 0x6c140a20, + 0x27555: 0x6c1f8220, 0x27556: 0x6c7af220, 0x27557: 0x6ce2bc20, + 0x27558: 0x6d406a20, 0x27559: 0x6c86ac20, 0x2755a: 0x6cdeb220, 0x2755b: 0x6cc9a420, + 0x2755e: 0x6cac7a20, 0x2755f: 0x6cac7c20, + 0x27563: 0x6ccb0020, + 0x27564: 0x6cbbba20, + 0x2756d: 0x6d40e220, 0x2756f: 0x6d371820, + 0x27570: 0x6d0de020, 0x27572: 0x6c6b4820, 0x27573: 0x6ca5aa20, + // Block 0x9d6, offset 0x27580 + 0x27584: 0x6c944420, 0x27585: 0x6cc15220, 0x27587: 0x6c2af220, + 0x27588: 0x6c897620, 0x27589: 0x6c15f220, 0x2758a: 0x6cbcf820, 0x2758b: 0x6c912220, + 0x2758c: 0x6c2efe20, 0x2758d: 0x6c24f620, + 0x27590: 0x6c615c20, 0x27593: 0x6c178420, + 0x27594: 0x6cd69a20, 0x27595: 0x6d40f220, 0x27597: 0x6c775a20, + 0x2759a: 0x6cbaf020, 0x2759b: 0x6c847820, + 0x275ae: 0x6cd65e20, 0x275af: 0x6d243e20, + 0x275b0: 0x6d2ee820, 0x275b1: 0x6c82f220, + // Block 0x9d7, offset 0x275c0 + 0x275c5: 0x6cb33e20, + 0x275ca: 0x6d30b620, 0x275cb: 0x6d001e20, + 0x275cd: 0x6ce08620, 0x275ce: 0x6c258620, 0x275cf: 0x6c7fdc20, + 0x275d1: 0x6d060220, 0x275d2: 0x6cd62820, 0x275d3: 0x6d2c9c20, + 0x275d4: 0x6c11ba20, 0x275d7: 0x6c08fe20, + 0x275d8: 0x6caf1c20, + 0x275dd: 0x6c1a5620, + 0x275e3: 0x6cbc0c20, + 0x275e4: 0x6c5f8620, + 0x275ea: 0x6d2d0420, + 0x275ec: 0x6c7fde20, + // Block 0x9d8, offset 0x27600 + 0x27601: 0x6ce52820, 0x27602: 0x6cc9b020, 0x27603: 0x6c6c6e20, + 0x27604: 0x6d3b4020, 0x27605: 0x6c352220, 0x27607: 0x6c145620, + 0x27608: 0x6c73a020, 0x27609: 0x6ce16220, 0x2760a: 0x6c086420, + 0x2760c: 0x6c38e820, 0x2760d: 0x6c8b6820, 0x2760e: 0x6d2b6e20, 0x2760f: 0x6cdcb420, + 0x27619: 0x6ccb8c20, + 0x27627: 0x6d375c20, + 0x27628: 0x6ce9d420, 0x2762a: 0x6cbe5e20, + 0x2762c: 0x6c21e620, + 0x27630: 0x6cdee620, 0x27631: 0x6c0e3c20, 0x27632: 0x6cf1f620, + 0x27635: 0x6cb36220, + 0x2763d: 0x6ca09a20, 0x2763e: 0x6c10e420, + // Block 0x9d9, offset 0x27640 + 0x27641: 0x6c7c2020, 0x27643: 0x6c260220, + 0x27644: 0x6cc54420, 0x27645: 0x6c068020, 0x27646: 0x6c7f8020, + 0x2764d: 0x6ca75220, 0x2764e: 0x6c84c220, + 0x27655: 0x6c697220, 0x27656: 0x6c919e20, 0x27657: 0x6c879620, + 0x27658: 0x6c900820, 0x27659: 0x6c4baa20, + 0x2765d: 0x6c161c20, + 0x27664: 0x6cfb1820, 0x27666: 0x6c165620, + 0x27668: 0x6d029020, 0x27669: 0x6d2ea820, + 0x2766f: 0x6cd6c620, + 0x2767b: 0x6c9d1220, + 0x2767c: 0x6c947420, 0x2767d: 0x6c965620, + // Block 0x9da, offset 0x27680 + 0x27680: 0x6c2d0220, + 0x27688: 0x6c2f2820, 0x2768a: 0x6cecb220, 0x2768b: 0x6d274620, + 0x2768c: 0x6c948620, 0x2768e: 0x6c948a20, + 0x27693: 0x6c837220, + 0x27695: 0x6cec6020, 0x27696: 0x6c2f3e20, 0x27697: 0x6ca59620, + 0x27698: 0x6cceb220, 0x27699: 0x6d019e20, 0x2769a: 0x6cafe820, + 0x276a5: 0x6c98dc20, 0x276a7: 0x6d1ade20, + 0x276a9: 0x6c0f0a20, 0x276ab: 0x6d3b0220, + 0x276ae: 0x6c1cc820, + 0x276b6: 0x6ca24820, 0x276b7: 0x6ceb2820, + 0x276b9: 0x6ce7be20, 0x276ba: 0x6d128820, + // Block 0x9db, offset 0x276c0 + 0x276c1: 0x6c5a7220, 0x276c3: 0x6cc60020, + 0x276c5: 0x6d130620, + 0x276cb: 0x6ceb3a20, + 0x276d6: 0x6d413a20, 0x276d7: 0x6d23d220, + 0x276da: 0x6c000c20, + 0x276dc: 0x6d38a420, 0x276dd: 0x6cec9c20, + 0x276e1: 0x6c34ae20, 0x276e2: 0x6d384420, 0x276e3: 0x6c4cfc20, + 0x276e4: 0x6c5a0420, 0x276e5: 0x6c9e6220, + 0x276e9: 0x6c211a20, 0x276ea: 0x6cbce420, 0x276eb: 0x6c45b220, + 0x276ec: 0x6ce69420, 0x276ed: 0x6c9a2a20, + 0x276f1: 0x6ce1a420, + 0x276f4: 0x6cc6c420, 0x276f7: 0x6cc6c620, + 0x276f8: 0x6cb66420, 0x276f9: 0x6c4c9a20, + 0x276fd: 0x6cfe6220, 0x276fe: 0x6ce4ca20, + // Block 0x9dc, offset 0x27700 + 0x27705: 0x6cff4020, + 0x27708: 0x6d2db620, 0x27709: 0x6c258820, + 0x27714: 0x6c7ffc20, + 0x27718: 0x6cd02e20, 0x2771a: 0x6c830e20, 0x2771b: 0x6c879820, + 0x2771d: 0x6c14e620, 0x2771e: 0x6ca8d020, 0x2771f: 0x6c947620, + 0x27721: 0x6ce63a20, 0x27722: 0x6c5ba620, + 0x27727: 0x6c458020, + 0x27730: 0x6cb77220, 0x27731: 0x6d20fa20, 0x27733: 0x6d02d220, + 0x27738: 0x6d26ae20, 0x27739: 0x6c034e20, 0x2773a: 0x6c276a20, 0x2773b: 0x6c5eba20, + 0x2773c: 0x6d089220, 0x2773f: 0x6c743c20, + // Block 0x9dd, offset 0x27740 + 0x27740: 0x6ca99420, + 0x27748: 0x6c325220, 0x27749: 0x6c602620, + 0x27750: 0x6cabc820, 0x27751: 0x6c45f020, 0x27752: 0x6c07ba20, + 0x27754: 0x6c794220, 0x27755: 0x6d105020, 0x27756: 0x6c8f0820, 0x27757: 0x6ca5ee20, + 0x27758: 0x6d2cca20, 0x27759: 0x6d1b5c20, 0x2775a: 0x6ca72820, 0x2775b: 0x6cad9020, + 0x2775d: 0x6c458e20, 0x2775e: 0x6c109e20, 0x2775f: 0x6c512e20, + 0x27760: 0x6cc71220, 0x27761: 0x6c4b5020, + 0x27765: 0x6c09b620, 0x27766: 0x6cf63020, 0x27767: 0x6c712a20, + 0x27768: 0x6c5cf420, 0x27769: 0x6c09e420, 0x2776b: 0x6ce56420, + 0x2776c: 0x6d332820, 0x2776f: 0x6d181020, + 0x27770: 0x6c22d220, 0x27772: 0x6c0e2620, + 0x27777: 0x6c459c20, + 0x2777a: 0x6c381a20, + 0x2777d: 0x6d0fce20, 0x2777e: 0x6d064820, + // Block 0x9de, offset 0x27780 + 0x27781: 0x6c52b620, + 0x27784: 0x6d2a0a20, 0x27785: 0x6c148420, 0x27786: 0x6c537620, + 0x27788: 0x6ce4b820, + 0x2778c: 0x6d340a20, 0x2778d: 0x6d039220, 0x2778e: 0x6d062220, + 0x27791: 0x6d325820, + 0x27794: 0x6ced4020, + 0x27798: 0x6c75dc20, + 0x2779d: 0x6cf30c20, + 0x277a0: 0x6c92c220, 0x277a2: 0x6d32f220, 0x277a3: 0x6cc71a20, + 0x277a4: 0x6c1a3c20, 0x277a5: 0x6c3ee620, 0x277a7: 0x6c369820, + 0x277a8: 0x6ce1e620, 0x277a9: 0x6ce12e20, 0x277ab: 0x6c730020, + 0x277ac: 0x6c17c020, 0x277ad: 0x6cde9620, 0x277ae: 0x6c2c0420, + 0x277b0: 0x6d3fc020, 0x277b3: 0x6c794c20, + 0x277b4: 0x6ce99820, 0x277b6: 0x6c794e20, + // Block 0x9df, offset 0x277c0 + 0x277c5: 0x6cc71c20, 0x277c6: 0x6d276420, 0x277c7: 0x6c517a20, + 0x277c8: 0x6d400820, 0x277c9: 0x6c235e20, 0x277ca: 0x6cbfcc20, + 0x277ce: 0x6ca2b420, 0x277cf: 0x6c346420, + 0x277d0: 0x6d065a20, 0x277d1: 0x6c795620, 0x277d2: 0x6cfd1220, + 0x277db: 0x6c31ba20, + 0x277dc: 0x6c76ee20, 0x277de: 0x6d1bf020, + 0x277e2: 0x6d3e9620, + 0x277e7: 0x6c5a0620, + 0x277e9: 0x6caed020, 0x277eb: 0x6c86ae20, + 0x277ed: 0x6c0f8220, 0x277ee: 0x6c444420, 0x277ef: 0x6c716620, + 0x277f0: 0x6c783420, 0x277f2: 0x6c55ce20, 0x277f3: 0x6d115820, + 0x277f4: 0x6ce14820, 0x277f6: 0x6cbf7020, 0x277f7: 0x6cc72820, + 0x277f8: 0x6c8f1e20, 0x277f9: 0x6c5c5e20, 0x277fa: 0x6c5f6220, + // Block 0x9e0, offset 0x27800 + 0x27809: 0x6d371a20, 0x2780b: 0x6ce15220, + 0x2780c: 0x6d355c20, 0x2780d: 0x6c775e20, + 0x27814: 0x6d107220, 0x27816: 0x6ce18420, 0x27817: 0x6c52d820, + 0x2781b: 0x6c897820, + 0x2781d: 0x6c12a020, + 0x27821: 0x6ca3aa20, 0x27822: 0x6d400e20, + 0x27824: 0x6c2af420, 0x27826: 0x6c68a220, 0x27827: 0x6caeec20, + 0x27829: 0x6c49fa20, 0x2782a: 0x6c377420, 0x2782b: 0x6c670620, + 0x2782c: 0x6c69d220, 0x2782d: 0x6caaca20, 0x2782e: 0x6d2a6220, + 0x27833: 0x6caef620, + 0x27834: 0x6c292020, 0x27836: 0x6cc1f620, 0x27837: 0x6c889620, + 0x27838: 0x6ca2be20, 0x27839: 0x6c805220, + 0x2783e: 0x6c3baa20, + // Block 0x9e1, offset 0x27840 + 0x27842: 0x6c5d0e20, + 0x27846: 0x6c7bb420, + 0x27848: 0x6d1b2a20, 0x27849: 0x6cd69c20, 0x2784a: 0x6c671e20, + 0x27852: 0x6c964420, + 0x27854: 0x6c933c20, + 0x2785a: 0x6c446a20, 0x2785b: 0x6cc51220, + 0x2785e: 0x6cb22e20, + 0x27860: 0x6c900a20, + 0x27864: 0x6d320c20, 0x27865: 0x6cfd4c20, + 0x27868: 0x6c8c8e20, 0x27869: 0x6c88aa20, 0x2786a: 0x6ccd2420, 0x2786b: 0x6c0fd420, + 0x2786c: 0x6c87a820, + 0x27873: 0x6d013a20, + 0x27874: 0x6c446e20, 0x27875: 0x6c9fe020, 0x27876: 0x6c88ae20, + 0x27879: 0x6c753c20, 0x2787a: 0x6d38c820, + 0x2787f: 0x6c784820, + // Block 0x9e2, offset 0x27880 + 0x27881: 0x6c2f2a20, 0x27883: 0x6d30ce20, + 0x27885: 0x6cd4ac20, 0x27886: 0x6c5e9020, 0x27887: 0x6c8f7c20, + 0x27888: 0x6c49ea20, 0x27889: 0x6d2a5620, 0x2788a: 0x6cfd4420, 0x2788b: 0x6cb8ae20, + 0x2788d: 0x6ccfd820, + 0x27890: 0x6d1ae020, 0x27891: 0x6c6be420, + 0x27894: 0x6ccffe20, 0x27895: 0x6cd00020, 0x27896: 0x6cc95220, + 0x2789b: 0x6cf8c020, + 0x278a1: 0x6c7aac20, 0x278a3: 0x6cc1c620, + 0x278a5: 0x6c443e20, 0x278a6: 0x6c050820, + 0x278a8: 0x6c0a7c20, 0x278a9: 0x6cb92e20, + 0x278b0: 0x6c0d6420, 0x278b1: 0x6c050a20, 0x278b3: 0x6d42ae20, + 0x278b4: 0x6cb0d020, 0x278b6: 0x6c5e3620, + 0x278be: 0x6c051020, + // Block 0x9e3, offset 0x278c0 + 0x278ca: 0x6ca9d820, + 0x278cc: 0x6c18fc20, 0x278ce: 0x6cae4e20, + 0x278d1: 0x6c3f2e20, 0x278d2: 0x6ce88220, + 0x278dc: 0x6cb04e20, 0x278dd: 0x6cb36420, + 0x278e0: 0x6c1b7420, 0x278e3: 0x6d093e20, + 0x278e4: 0x6cb74020, 0x278e5: 0x6cf4b220, + 0x278e8: 0x6d357e20, 0x278e9: 0x6c2c1c20, 0x278ea: 0x6c22fe20, 0x278eb: 0x6d1ef420, + 0x278f9: 0x6c230020, + 0x278fc: 0x6c2c1e20, 0x278fd: 0x6d3d2620, 0x278ff: 0x6d408020, + // Block 0x9e4, offset 0x27900 + 0x27900: 0x6c238c20, 0x27903: 0x6caca820, + 0x27904: 0x6d0d4c20, 0x27905: 0x6cb74e20, 0x27906: 0x6cc6fa20, 0x27907: 0x6c63a420, + 0x27909: 0x6d359220, 0x2790a: 0x6cc00e20, 0x2790b: 0x6d268a20, + 0x2790d: 0x6cd32420, + 0x27911: 0x6c4fc020, + 0x27919: 0x6ceab220, + 0x2791c: 0x6c0cde20, 0x2791e: 0x6c770020, + 0x27922: 0x6c21aa20, + 0x27924: 0x6c229020, 0x27926: 0x6d1ad020, 0x27927: 0x6cd34c20, + 0x27928: 0x6ca3b820, 0x27929: 0x6cc85820, 0x2792b: 0x6d0f9e20, + 0x2792c: 0x6c1a9820, 0x2792e: 0x6c21f820, + 0x27931: 0x6c457620, 0x27932: 0x6c9c4220, + 0x27934: 0x6c612e20, + 0x2793c: 0x6c44b220, 0x2793d: 0x6d2a6c20, + // Block 0x9e5, offset 0x27940 + 0x27941: 0x6c081420, + 0x27947: 0x6d030c20, + 0x27948: 0x6c7df020, 0x2794a: 0x6c2e8e20, + 0x2794d: 0x6ce66a20, + 0x2795a: 0x6cd71c20, + 0x2795e: 0x6c275620, + 0x27966: 0x6c851020, + 0x27968: 0x6d1e2820, 0x27969: 0x6c684220, + 0x2796c: 0x6cde0420, 0x2796d: 0x6cc24620, 0x2796e: 0x6d1a6020, 0x2796f: 0x6d24e820, + 0x27970: 0x6c6abc20, 0x27972: 0x6cb8da20, 0x27973: 0x6d10a020, + 0x27974: 0x6d0ba620, 0x27977: 0x6cbe4a20, + 0x2797f: 0x6cadd420, + // Block 0x9e6, offset 0x27980 + 0x27997: 0x6c635820, + 0x27999: 0x6ce82c20, 0x2799b: 0x6ce2ec20, + 0x279a1: 0x6c33f620, 0x279a2: 0x6c15ba20, 0x279a3: 0x6c636820, + 0x279a4: 0x6c1c2820, 0x279a5: 0x6c64aa20, 0x279a6: 0x6cd5e020, + 0x279af: 0x6cde5a20, + // Block 0x9e7, offset 0x279c0 + 0x279d5: 0x6d33ea20, 0x279d7: 0x6d256e20, + 0x279da: 0x6c54d420, + 0x279dc: 0x6c8b1220, + 0x279e0: 0x6d2ad420, 0x279e2: 0x6c1f5e20, + 0x279e6: 0x6cc0ba20, 0x279e7: 0x6c07fa20, + 0x279f9: 0x6c588620, 0x279fa: 0x6c7aca20, 0x279fb: 0x6cd10c20, + 0x279fd: 0x6c6afe20, 0x279ff: 0x6cee2c20, + // Block 0x9e8, offset 0x27a00 + 0x27a03: 0x6c54de20, + 0x27a0a: 0x6d2ae620, 0x27a0b: 0x6d297020, + 0x27a0c: 0x6d106420, 0x27a0e: 0x6c1bba20, 0x27a0f: 0x6c701220, + 0x27a1a: 0x6c89fe20, 0x27a1b: 0x6d209620, + 0x27a20: 0x6c0b4a20, 0x27a22: 0x6c7bc820, + 0x27a2c: 0x6c1e4a20, 0x27a2d: 0x6d0b3620, 0x27a2e: 0x6d3d8620, + 0x27a30: 0x6cbcda20, 0x27a31: 0x6cfcf020, 0x27a33: 0x6d250620, + 0x27a34: 0x6cf46e20, 0x27a35: 0x6c693620, 0x27a36: 0x6cfe5020, 0x27a37: 0x6ccc7420, + 0x27a39: 0x6d36cc20, + 0x27a3c: 0x6c1d5a20, 0x27a3e: 0x6c0b0620, 0x27a3f: 0x6ceeb820, + // Block 0x9e9, offset 0x27a40 + 0x27a53: 0x6c2a3220, + 0x27a5d: 0x6d23d820, 0x27a5e: 0x6ce9b820, + 0x27a61: 0x6c17c220, + 0x27a65: 0x6c5c4420, 0x27a66: 0x6cba2620, + 0x27a68: 0x6cf01a20, + 0x27a70: 0x6d1f7420, + 0x27a7c: 0x6c2ca020, 0x27a7e: 0x6c26f620, + // Block 0x9ea, offset 0x27a80 + 0x27a81: 0x6d1f7620, 0x27a82: 0x6c702620, 0x27a83: 0x6ce9bc20, + 0x27a84: 0x6d297620, 0x27a87: 0x6c5c6020, + 0x27a89: 0x6ccc8220, + 0x27a8c: 0x6c5e1020, + 0x27a94: 0x6d115a20, + 0x27a99: 0x6cfd1e20, + 0x27a9e: 0x6cfd2020, + 0x27aac: 0x6c2caa20, 0x27aae: 0x6c703220, + 0x27ab2: 0x6c5c7420, + 0x27ab4: 0x6c77cc20, 0x27ab5: 0x6d1f8420, + 0x27ab8: 0x6c870e20, + 0x27abc: 0x6c201420, 0x27abe: 0x6c1b6820, + // Block 0x9eb, offset 0x27ac0 + 0x27ac0: 0x6c5e3820, 0x27ac2: 0x6d1f9020, + 0x27ac4: 0x6d270e20, + 0x27ace: 0x6cded820, 0x27acf: 0x6d29b420, + 0x27ad3: 0x6ca8ac20, + 0x27ad4: 0x6d3b4a20, + 0x27ae1: 0x6cfc6220, + 0x27ae9: 0x6cd22a20, 0x27aeb: 0x6c79ca20, + 0x27aec: 0x6cb6c620, 0x27aed: 0x6ce91420, 0x27aee: 0x6c387e20, 0x27aef: 0x6c258e20, + 0x27af2: 0x6cea3820, 0x27af3: 0x6c137420, + 0x27af4: 0x6c110020, 0x27af5: 0x6cfe1420, 0x27af6: 0x6cadfc20, 0x27af7: 0x6c6e0220, + 0x27af8: 0x6cb56a20, 0x27af9: 0x6cceae20, 0x27afa: 0x6ca97420, 0x27afb: 0x6ca30420, + 0x27afd: 0x6cbd5020, + // Block 0x9ec, offset 0x27b00 + 0x27b0d: 0x6c090c20, + 0x27b13: 0x6c092420, + 0x27b14: 0x6c05a220, 0x27b15: 0x6c0b7620, 0x27b16: 0x6d3e0220, 0x27b17: 0x6ca30a20, + 0x27b18: 0x6cf07020, 0x27b19: 0x6c4fbe20, + 0x27b21: 0x6c6c8220, 0x27b23: 0x6d333c20, + 0x27b27: 0x6cbc8220, + 0x27b2e: 0x6c501620, 0x27b2f: 0x6ce71e20, + 0x27b30: 0x6d2a4020, 0x27b31: 0x6cd15420, 0x27b32: 0x6c25a420, 0x27b33: 0x6c597e20, + 0x27b34: 0x6cc78e20, 0x27b35: 0x6d292e20, 0x27b36: 0x6ca6f820, + 0x27b3e: 0x6cfa8620, + // Block 0x9ed, offset 0x27b40 + 0x27b48: 0x6cc2bc20, 0x27b49: 0x6c619a20, 0x27b4a: 0x6d1a3620, 0x27b4b: 0x6c850620, + 0x27b4c: 0x6c984620, 0x27b4d: 0x6cceca20, 0x27b4e: 0x6c4e8e20, 0x27b4f: 0x6c260e20, + 0x27b50: 0x6c759c20, 0x27b51: 0x6c61bc20, 0x27b52: 0x6c107820, 0x27b53: 0x6c905420, + 0x27b54: 0x6c3d2220, 0x27b55: 0x6d1f0e20, 0x27b56: 0x6c7b1c20, + 0x27b5c: 0x6cfe2220, + 0x27b61: 0x6d279420, 0x27b63: 0x6cbd5e20, + 0x27b64: 0x6c5b2c20, 0x27b65: 0x6cb42e20, + 0x27b6b: 0x6c83b220, + 0x27b6c: 0x6cadcc20, 0x27b6d: 0x6cd4c620, 0x27b6e: 0x6c707620, 0x27b6f: 0x6d14e020, + 0x27b70: 0x6d32a820, 0x27b71: 0x6c1d0e20, 0x27b73: 0x6cf77620, + 0x27b75: 0x6c561a20, 0x27b76: 0x6cc74420, + // Block 0x9ee, offset 0x27b80 + 0x27b8c: 0x6c590c20, 0x27b8d: 0x6cbc3c20, 0x27b8e: 0x6d33d020, 0x27b8f: 0x6d1c6c20, + 0x27b90: 0x6cf7e220, 0x27b91: 0x6cbb7620, 0x27b92: 0x6c61fa20, 0x27b93: 0x6d32bc20, + 0x27b94: 0x6c59b420, 0x27b96: 0x6d210a20, 0x27b97: 0x6d405a20, + 0x27b98: 0x6c99f420, + 0x27b9c: 0x6cd13220, + 0x27ba9: 0x6cc2e620, + 0x27bb0: 0x6c676020, 0x27bb1: 0x6c512020, 0x27bb3: 0x6ce75220, + 0x27bb4: 0x6c513020, 0x27bb5: 0x6cf15220, 0x27bb6: 0x6d17cc20, 0x27bb7: 0x6cacfe20, + 0x27bba: 0x6cf22620, 0x27bbb: 0x6cb99820, + 0x27bbc: 0x6c862020, 0x27bbd: 0x6d150a20, 0x27bbe: 0x6c20ac20, 0x27bbf: 0x6d06e820, + // Block 0x9ef, offset 0x27bc0 + 0x27bc0: 0x6cefd020, + 0x27bc6: 0x6c439420, + 0x27bc8: 0x6d226220, 0x27bcb: 0x6d2d4420, + 0x27bcc: 0x6c41a220, 0x27bcd: 0x6cb8f620, 0x27bce: 0x6c773220, 0x27bcf: 0x6c840220, + 0x27bd0: 0x6cd00220, 0x27bd1: 0x6c499220, 0x27bd3: 0x6cb17c20, + 0x27bd6: 0x6c840420, + 0x27bd8: 0x6c562620, 0x27bdb: 0x6ce8ce20, + 0x27bdc: 0x6cd75620, 0x27bde: 0x6c56aa20, 0x27bdf: 0x6c840620, + 0x27be2: 0x6c910a20, + 0x27be6: 0x6c297020, + 0x27be8: 0x6d42a420, 0x27be9: 0x6cccf620, 0x27beb: 0x6ccf6e20, + 0x27bed: 0x6c3cb620, 0x27bee: 0x6c726e20, 0x27bef: 0x6ce76e20, + 0x27bf0: 0x6c691a20, 0x27bf1: 0x6cbbe620, 0x27bf2: 0x6c42d420, 0x27bf3: 0x6d3e7020, + 0x27bf4: 0x6c59e620, 0x27bf5: 0x6ccd0620, + 0x27bf8: 0x6cdff620, + // Block 0x9f0, offset 0x27c00 + 0x27c0c: 0x6ceaca20, 0x27c0e: 0x6c8e2220, + 0x27c10: 0x6c1a2e20, 0x27c11: 0x6cf27020, 0x27c12: 0x6d425020, 0x27c13: 0x6d23da20, + 0x27c15: 0x6d3a2220, 0x27c17: 0x6cc45420, + 0x27c18: 0x6cf80a20, 0x27c19: 0x6cc1b620, 0x27c1b: 0x6c442820, + 0x27c22: 0x6cb52a20, 0x27c23: 0x6d05e020, + 0x27c28: 0x6c415220, 0x27c29: 0x6cc3f820, 0x27c2a: 0x6c1ddc20, 0x27c2b: 0x6c9b4e20, + 0x27c32: 0x6cd02020, 0x27c33: 0x6cc1c820, + 0x27c36: 0x6cbbb420, 0x27c37: 0x6c11b420, + 0x27c3a: 0x6c86b020, + 0x27c3c: 0x6ceda220, 0x27c3d: 0x6c826620, 0x27c3e: 0x6d03a820, 0x27c3f: 0x6c80ea20, + // Block 0x9f1, offset 0x27c40 + 0x27c42: 0x6cd3ec20, 0x27c43: 0x6d330020, + 0x27c44: 0x6c38ce20, + 0x27c4a: 0x6d371c20, + 0x27c4f: 0x6d1aa420, + 0x27c51: 0x6c86de20, + 0x27c56: 0x6ca08820, 0x27c57: 0x6cf04020, + 0x27c59: 0x6d1c1020, 0x27c5a: 0x6cc4e420, + 0x27c60: 0x6cc2a820, + 0x27c65: 0x6c95ce20, + 0x27c72: 0x6c275820, + 0x27c74: 0x6d1b4e20, 0x27c75: 0x6c08da20, 0x27c76: 0x6c438820, + 0x27c78: 0x6cf20a20, 0x27c79: 0x6d0d7620, 0x27c7a: 0x6c9e1e20, + 0x27c7c: 0x6c42a020, 0x27c7d: 0x6cc05620, 0x27c7e: 0x6d33da20, + // Block 0x9f2, offset 0x27c80 + 0x27c8b: 0x6c471c20, + 0x27c8c: 0x6ce75420, 0x27c8e: 0x6c8d1420, 0x27c8f: 0x6ce33620, + 0x27c90: 0x6c224c20, 0x27c91: 0x6d150c20, 0x27c92: 0x6c395a20, 0x27c93: 0x6cb31220, + 0x27c94: 0x6c09b820, 0x27c96: 0x6c064e20, + 0x27c9f: 0x6cae7620, + 0x27ca1: 0x6cdb8420, + 0x27ca4: 0x6cd92820, 0x27ca5: 0x6cef1a20, 0x27ca6: 0x6cff9220, + 0x27cac: 0x6c504c20, 0x27cad: 0x6d0dac20, + 0x27cb6: 0x6d152620, 0x27cb7: 0x6d2a1e20, + 0x27cb8: 0x6d1d0020, 0x27cb9: 0x6ca43220, + 0x27cbf: 0x6d289620, + // Block 0x9f3, offset 0x27cc0 + 0x27cc1: 0x6ce50c20, 0x27cc2: 0x6cf68a20, 0x27cc3: 0x6c69b420, + 0x27cc4: 0x6d0cbc20, + 0x27ccc: 0x6ca55e20, 0x27ccd: 0x6ce07020, 0x27cce: 0x6d0eaa20, 0x27ccf: 0x6ce51a20, + 0x27cd0: 0x6d36ce20, 0x27cd1: 0x6c1d7a20, 0x27cd2: 0x6ce23a20, + 0x27cd7: 0x6d2cdc20, + 0x27cde: 0x6c9e3a20, + 0x27ce1: 0x6cf47020, 0x27ce2: 0x6d1b0220, 0x27ce3: 0x6d0eac20, + 0x27ce4: 0x6c81ba20, + 0x27ce9: 0x6cb31e20, 0x27ceb: 0x6c5d4620, + 0x27cec: 0x6c4d4620, 0x27ced: 0x6ca21a20, 0x27cee: 0x6c236020, + 0x27cf1: 0x6c7aae20, 0x27cf2: 0x6c1d8420, + 0x27cf4: 0x6d1ff020, + 0x27cf8: 0x6d3da020, 0x27cfb: 0x6cd9e420, + // Block 0x9f4, offset 0x27d00 + 0x27d02: 0x6d1b7e20, + 0x27d05: 0x6d41da20, 0x27d06: 0x6cca7420, 0x27d07: 0x6c8f4a20, + 0x27d08: 0x6c4f2020, 0x27d09: 0x6cf0ec20, 0x27d0a: 0x6c9b6020, 0x27d0b: 0x6c55d020, + 0x27d0c: 0x6c86b220, 0x27d0e: 0x6c9d9c20, + 0x27d10: 0x6c054020, 0x27d11: 0x6c65f020, + 0x27d1c: 0x6cc40620, + 0x27d20: 0x6c9b6220, 0x27d22: 0x6ca21c20, 0x27d23: 0x6c53ac20, + 0x27d24: 0x6c56d820, 0x27d25: 0x6c9c8e20, 0x27d26: 0x6ccca820, + 0x27d29: 0x6cce2620, 0x27d2a: 0x6c17c620, + 0x27d2c: 0x6d3dc220, 0x27d2e: 0x6d342220, 0x27d2f: 0x6ca77020, + 0x27d35: 0x6c62b220, + 0x27d38: 0x6c784020, 0x27d39: 0x6d330620, + 0x27d3f: 0x6c281420, + // Block 0x9f5, offset 0x27d40 + 0x27d40: 0x6c8a8220, 0x27d41: 0x6d2e3020, 0x27d42: 0x6c460620, 0x27d43: 0x6c818c20, + 0x27d44: 0x6c571e20, 0x27d45: 0x6c1fd220, 0x27d47: 0x6c660c20, + 0x27d48: 0x6c7d3220, + 0x27d4d: 0x6ccf0220, + 0x27d54: 0x6c191c20, 0x27d55: 0x6ce08820, 0x27d57: 0x6c55f820, + 0x27d58: 0x6c9b9e20, 0x27d59: 0x6cada420, 0x27d5a: 0x6d2e3820, 0x27d5b: 0x6c16d620, + 0x27d5d: 0x6c41f820, + 0x27d60: 0x6d193a20, 0x27d62: 0x6cdcb620, + 0x27d66: 0x6d076420, 0x27d67: 0x6c62de20, + 0x27d68: 0x6c808e20, + 0x27d6c: 0x6d159620, 0x27d6f: 0x6c9dae20, + 0x27d71: 0x6c9f1420, + 0x27d75: 0x6c24a620, + 0x27d78: 0x6c805a20, 0x27d7b: 0x6d0c4e20, + 0x27d7e: 0x6c9ccc20, + // Block 0x9f6, offset 0x27d80 + 0x27d82: 0x6d1e6820, 0x27d83: 0x6c125420, + 0x27d84: 0x6c664420, 0x27d87: 0x6cda0a20, + 0x27d8e: 0x6d0d2a20, + 0x27d91: 0x6c736020, + 0x27d95: 0x6c369c20, + 0x27d98: 0x6c3bf220, 0x27d9a: 0x6c3bf620, + 0x27da1: 0x6c4a2a20, 0x27da2: 0x6c96fc20, + 0x27da4: 0x6c8ab820, + 0x27da9: 0x6c1cca20, 0x27dab: 0x6c840820, + 0x27db1: 0x6d349c20, + 0x27db4: 0x6d024820, 0x27db7: 0x6c1dfc20, + 0x27db9: 0x6c60fc20, + 0x27dbd: 0x6caf5c20, + // Block 0x9f7, offset 0x27dc0 + 0x27dc2: 0x6c6abe20, + 0x27dc7: 0x6d38e420, + 0x27dcd: 0x6d046c20, + 0x27dd1: 0x6c7bfc20, + 0x27dd9: 0x6c6e2220, 0x27ddb: 0x6c56a020, + 0x27dde: 0x6cb99c20, + 0x27de3: 0x6c133220, + 0x27de6: 0x6cb60420, 0x27de7: 0x6ced3220, + 0x27de8: 0x6c98ec20, 0x27dea: 0x6c30f020, + 0x27df4: 0x6c79d220, 0x27df6: 0x6c277c20, + 0x27df8: 0x6ca4b420, 0x27dfa: 0x6c536a20, + // Block 0x9f8, offset 0x27e00 + 0x27e02: 0x6c7f4020, 0x27e03: 0x6c34aa20, + 0x27e04: 0x6cb91020, 0x27e06: 0x6d1a8820, + 0x27e16: 0x6c911220, 0x27e17: 0x6c5ae020, + 0x27e1b: 0x6c402e20, + 0x27e1c: 0x6c98f420, 0x27e1e: 0x6d389a20, + 0x27e21: 0x6d1dfa20, + 0x27e2d: 0x6c817020, 0x27e2e: 0x6c609c20, 0x27e2f: 0x6d186a20, + 0x27e30: 0x6c8e8c20, 0x27e31: 0x6c235220, 0x27e33: 0x6ca43c20, + // Block 0x9f9, offset 0x27e40 + 0x27e50: 0x6cea2620, 0x27e51: 0x6cfe5220, + 0x27e55: 0x6c0bba20, 0x27e56: 0x6c207820, 0x27e57: 0x6cf52020, + 0x27e59: 0x6c70c620, + 0x27e65: 0x6d005220, 0x27e66: 0x6caf9220, 0x27e67: 0x6d3da220, + 0x27e68: 0x6cc8e420, 0x27e6a: 0x6ccafa20, 0x27e6b: 0x6d3f6220, + 0x27e6d: 0x6d336220, + 0x27e70: 0x6d40da20, 0x27e71: 0x6cc14220, 0x27e73: 0x6c1c7a20, + 0x27e75: 0x6d36f020, + // Block 0x9fa, offset 0x27e80 + 0x27e97: 0x6cc37a20, + 0x27e98: 0x6cb92020, 0x27e99: 0x6d0afc20, 0x27e9a: 0x6c17c420, 0x27e9b: 0x6c517c20, + 0x27e9c: 0x6cc80420, + 0x27ea0: 0x6c70cc20, 0x27ea1: 0x6cf52820, + 0x27eac: 0x6c1c7c20, 0x27ead: 0x6c7c0420, 0x27eaf: 0x6c240020, + 0x27eb0: 0x6cc89220, 0x27eb1: 0x6c7e1e20, 0x27eb2: 0x6c1b5e20, 0x27eb3: 0x6d40e420, + 0x27eb4: 0x6c688620, 0x27eb6: 0x6d21c420, 0x27eb7: 0x6ce8fe20, + 0x27eb8: 0x6c9b6420, 0x27eb9: 0x6c266c20, 0x27eba: 0x6cd7a020, + // Block 0x9fb, offset 0x27ec0 + 0x27ee5: 0x6c3c6c20, 0x27ee6: 0x6c469020, 0x27ee7: 0x6c301c20, + 0x27ee8: 0x6c142220, 0x27ee9: 0x6c99be20, 0x27eea: 0x6c15e820, 0x27eeb: 0x6c0b1020, + 0x27eec: 0x6d241e20, 0x27eef: 0x6cecea20, + 0x27ef0: 0x6d40e620, 0x27ef2: 0x6d3ea420, + 0x27ef4: 0x6c1fec20, 0x27ef5: 0x6ced5620, 0x27ef6: 0x6cebf420, + 0x27ef8: 0x6cc2a620, 0x27efb: 0x6ced5820, + 0x27efd: 0x6cfa5020, + // Block 0x9fc, offset 0x27f00 + 0x27f04: 0x6d1d5620, 0x27f05: 0x6c66e820, + 0x27f08: 0x6cf04220, 0x27f09: 0x6ce39a20, 0x27f0a: 0x6ccaca20, + 0x27f0c: 0x6cb67a20, 0x27f0d: 0x6ccc2020, 0x27f0e: 0x6d244220, 0x27f0f: 0x6c60e220, + 0x27f10: 0x6c314420, 0x27f11: 0x6c15f620, 0x27f12: 0x6ce96c20, + 0x27f15: 0x6c8ec420, 0x27f17: 0x6d3cba20, + 0x27f33: 0x6cc89420, + 0x27f36: 0x6d0eda20, 0x27f37: 0x6c47ea20, + 0x27f39: 0x6c86e220, 0x27f3a: 0x6c13ba20, + 0x27f3e: 0x6c2cac20, + // Block 0x9fd, offset 0x27f40 + 0x27f40: 0x6d2e2a20, 0x27f41: 0x6cb32220, + 0x27f52: 0x6c912620, + 0x27f54: 0x6d374c20, + // Block 0x9fe, offset 0x27f80 + 0x27f81: 0x6c888a20, + 0x27f85: 0x6c95ca20, + 0x27f8d: 0x6c352420, + 0x27f90: 0x6c750820, 0x27f91: 0x6c873420, 0x27f92: 0x6c7ff220, + 0x27f94: 0x6cc89620, 0x27f95: 0x6c474220, 0x27f96: 0x6c155c20, 0x27f97: 0x6d060620, + 0x27f9a: 0x6d356420, + // Block 0x9ff, offset 0x27fc0 + 0x27fc1: 0x6d097c20, 0x27fc2: 0x6c0e9c20, 0x27fc3: 0x6c19aa20, + 0x27fc5: 0x6d3b4220, 0x27fc6: 0x6c522a20, + 0x27fc9: 0x6c04ac20, + 0x27fd3: 0x6c2f0820, + 0x27fd6: 0x6d2e3a20, 0x27fd7: 0x6c4ca620, + 0x27fda: 0x6c0c5420, 0x27fdb: 0x6c7ec620, + 0x27ffa: 0x6c6c7620, + // Block 0xa00, offset 0x28000 + 0x28002: 0x6c411c20, + 0x28012: 0x6c9c1e20, + 0x28014: 0x6d247e20, + 0x2802a: 0x6cf82a20, + 0x2802c: 0x6cb17820, 0x2802d: 0x6cd85020, + 0x28034: 0x6c2b0020, + 0x28038: 0x6c219e20, 0x28039: 0x6c2bbe20, 0x2803a: 0x6c5fa820, 0x2803b: 0x6c157620, + 0x2803f: 0x6d3dea20, + // Block 0xa01, offset 0x28040 + 0x28053: 0x6c115220, + 0x2805e: 0x6c681620, + 0x28072: 0x6ce80220, + 0x2807d: 0x6c84e820, + // Block 0xa02, offset 0x28080 + 0x28082: 0x6cba9020, + 0x28086: 0x6c21a020, + 0x2808f: 0x6cdef820, + 0x28091: 0x6c2e5220, 0x28093: 0x6c664820, + 0x2809b: 0x6d356820, + 0x2809c: 0x6c753220, 0x2809e: 0x6ca0a420, + 0x280a0: 0x6c959620, + 0x280a6: 0x6c062420, + 0x280ad: 0x6d415e20, + 0x280b5: 0x6d300820, + 0x280b8: 0x6d220c20, 0x280bb: 0x6c062a20, + 0x280be: 0x6c969420, 0x280bf: 0x6cf85020, + // Block 0xa03, offset 0x280c0 + 0x280c0: 0x6c567c20, 0x280c1: 0x6d171220, 0x280c2: 0x6c355020, 0x280c3: 0x6c470220, + 0x280c4: 0x6ce89e20, 0x280c5: 0x6d314a20, 0x280c7: 0x6cc07220, + 0x280c8: 0x6cdaba20, 0x280c9: 0x6c89c620, 0x280ca: 0x6cc11a20, 0x280cb: 0x6c8d2620, + 0x280cc: 0x6c499420, 0x280cd: 0x6c80e420, 0x280ce: 0x6ce7dc20, 0x280cf: 0x6c266620, + 0x280d0: 0x6c911e20, 0x280d1: 0x6c5a1220, 0x280d2: 0x6cd47e20, 0x280d3: 0x6c688820, + 0x280d4: 0x6d41f620, 0x280d5: 0x6c411a20, 0x280d6: 0x6cef5220, + 0x280d9: 0x6c7d4e20, 0x280da: 0x6c32bc20, 0x280db: 0x6cd92020, + 0x280dc: 0x6cb5e020, 0x280dd: 0x6d101a20, + 0x280e1: 0x6cd37820, 0x280e3: 0x6c411420, + 0x280e6: 0x6c2a1a20, 0x280e7: 0x6d11b220, + 0x280eb: 0x6cb99e20, + 0x280ed: 0x6cce7220, 0x280ee: 0x6c16ae20, 0x280ef: 0x6ca05020, + 0x280f1: 0x6ca05a20, + 0x280f5: 0x6ca50620, + 0x280f8: 0x6c232220, 0x280fa: 0x6ca84e20, 0x280fb: 0x6d2f6a20, + 0x280fc: 0x6c133420, 0x280ff: 0x6cd92a20, + // Block 0xa04, offset 0x28100 + 0x28100: 0x6ca85820, 0x28101: 0x6c22dc20, + 0x28104: 0x6c75de20, 0x28106: 0x6cce7e20, + 0x28108: 0x6d3a2420, 0x28109: 0x6c34b020, 0x2810a: 0x6c01ce20, 0x2810b: 0x6c088c20, + 0x2810e: 0x6ce41820, + 0x28110: 0x6cb06a20, 0x28111: 0x6cf9ee20, 0x28112: 0x6cc09420, 0x28113: 0x6cd14e20, + 0x28117: 0x6ce0d820, + 0x2811b: 0x6c978420, + 0x2811c: 0x6cb10420, 0x2811e: 0x6ce43420, 0x2811f: 0x6cc6cc20, + 0x28127: 0x6c237220, + 0x2812a: 0x6c5f7a20, 0x2812b: 0x6c3cc020, + 0x2812c: 0x6cf53c20, 0x2812d: 0x6c69d620, 0x2812e: 0x6c818e20, 0x2812f: 0x6d2ba620, + 0x28130: 0x6caeee20, 0x28131: 0x6c11e420, 0x28133: 0x6ca9de20, + 0x28135: 0x6c160c20, + 0x2813e: 0x6c97a420, 0x2813f: 0x6c4ba820, + // Block 0xa05, offset 0x28140 + 0x28140: 0x6ca7d820, 0x28141: 0x6c1d0220, 0x28142: 0x6c165820, + 0x28146: 0x6ca48a20, + 0x28149: 0x6cf95c20, 0x2814a: 0x6c6f6620, 0x2814b: 0x6c613020, + 0x2814c: 0x6d323420, + 0x28151: 0x6ce6ca20, + 0x28154: 0x6c9ace20, 0x28155: 0x6d26b220, 0x28157: 0x6d37bc20, + 0x28158: 0x6cea5620, 0x28159: 0x6cc8d220, 0x2815a: 0x6d01ba20, 0x2815b: 0x6cf63420, + 0x2815d: 0x6ce6d220, 0x2815e: 0x6ca99820, + 0x28160: 0x6cee2820, 0x28161: 0x6c64ae20, 0x28163: 0x6c3b3420, + 0x28172: 0x6c0ba620, + 0x28177: 0x6d152820, + 0x2817a: 0x6c2ec420, 0x2817b: 0x6c5ef820, + 0x2817c: 0x6c41de20, 0x2817f: 0x6c64c420, + // Block 0xa06, offset 0x28180 + 0x28180: 0x6c6ee220, + 0x28186: 0x6c763820, + 0x2818a: 0x6cc3d620, + 0x2818c: 0x6ca40420, 0x2818d: 0x6ca1de20, 0x2818e: 0x6d072220, 0x2818f: 0x6cd96a20, + 0x28190: 0x6cd0c020, 0x28191: 0x6c7bac20, 0x28192: 0x6cc3e620, 0x28193: 0x6cef2820, + 0x28197: 0x6c2eda20, + 0x28198: 0x6ca40a20, 0x2819a: 0x6cc92a20, 0x2819b: 0x6c45a220, + 0x2819c: 0x6c313220, 0x2819e: 0x6ca73020, + 0x281a1: 0x6c175020, 0x281a2: 0x6c515e20, 0x281a3: 0x6d0e9e20, + 0x281a9: 0x6ce8f020, 0x281aa: 0x6c104420, + 0x281ac: 0x6c559e20, 0x281ad: 0x6d1e5820, 0x281af: 0x6cd2d620, + 0x281b0: 0x6c1f7220, + 0x281b9: 0x6cff0e20, 0x281ba: 0x6c9ad620, 0x281bb: 0x6c852a20, + 0x281bc: 0x6ce37220, 0x281be: 0x6c64e620, + // Block 0xa07, offset 0x281c0 + 0x281c2: 0x6d354e20, 0x281c3: 0x6c487220, + 0x281c4: 0x6c496220, 0x281c6: 0x6cb7cc20, + 0x281c8: 0x6c3a1820, 0x281c9: 0x6d229820, 0x281ca: 0x6d309620, 0x281cb: 0x6cf01c20, + 0x281cc: 0x6c35ba20, 0x281cd: 0x6c14da20, 0x281ce: 0x6cf6e020, + 0x281d0: 0x6c47d420, + 0x281d7: 0x6cc3fa20, + 0x281d8: 0x6c5c4620, 0x281da: 0x6d00f620, 0x281db: 0x6d1bf420, + 0x281dd: 0x6cdeaa20, 0x281de: 0x6cec5820, 0x281df: 0x6c3efe20, + 0x281e0: 0x6c6c0820, 0x281e1: 0x6cb0bc20, + 0x281e5: 0x6cd15020, 0x281e6: 0x6d21c620, 0x281e7: 0x6c7ace20, + 0x281e9: 0x6cb0ca20, 0x281ea: 0x6d010620, 0x281eb: 0x6caaac20, + 0x281ec: 0x6cfd2420, 0x281ed: 0x6c66ea20, 0x281ee: 0x6d074e20, + 0x281f0: 0x6c0a7e20, + 0x281f4: 0x6ca41220, 0x281f6: 0x6c897020, + 0x281f8: 0x6cb13420, + 0x281fc: 0x6c6eb820, + // Block 0xa08, offset 0x28200 + 0x28200: 0x6cde1c20, 0x28201: 0x6d0edc20, 0x28202: 0x6c00f820, + 0x28205: 0x6cff3020, 0x28206: 0x6cbaf420, 0x28207: 0x6cf48620, + 0x28208: 0x6ce15620, 0x2820a: 0x6c75f420, + 0x28210: 0x6c7e2820, + 0x28217: 0x6c813220, + 0x28219: 0x6ca5b020, + 0x2821c: 0x6c314a20, 0x2821d: 0x6cd54620, 0x2821f: 0x6c696220, + 0x28220: 0x6ca89c20, 0x28222: 0x6d21dc20, + 0x28228: 0x6c132020, 0x2822a: 0x6c696420, + 0x2822c: 0x6c57d620, 0x2822d: 0x6cf1c020, 0x2822e: 0x6d127020, 0x2822f: 0x6c35a020, + 0x28230: 0x6c49fe20, 0x28231: 0x6c572020, 0x28232: 0x6c68a620, + 0x2823a: 0x6c835820, + 0x2823c: 0x6cce2820, 0x2823d: 0x6d1e8020, 0x2823f: 0x6c2ac220, + // Block 0xa09, offset 0x28240 + 0x28240: 0x6c493820, 0x28241: 0x6ca97220, 0x28243: 0x6cdcc020, + 0x28244: 0x6cfe6c20, 0x28246: 0x6cc9b420, 0x28247: 0x6c168c20, + 0x2824e: 0x6cc90c20, + 0x28250: 0x6d277020, 0x28252: 0x6c3b4c20, 0x28253: 0x6c672420, + 0x28254: 0x6d076a20, + 0x28258: 0x6cf93020, 0x28259: 0x6cd54a20, + 0x28265: 0x6d013220, 0x28266: 0x6c87ac20, + 0x28269: 0x6ce80420, + 0x2826c: 0x6c9d1020, 0x2826d: 0x6c162020, 0x2826e: 0x6c5d6a20, + 0x28271: 0x6d3bb820, 0x28272: 0x6d273420, + 0x2827b: 0x6c801a20, + 0x2827d: 0x6d0d2c20, 0x2827e: 0x6c29a820, 0x2827f: 0x6cfe1820, + // Block 0xa0a, offset 0x28280 + 0x28280: 0x6d267220, 0x28281: 0x6ce6b020, 0x28282: 0x6c07d220, 0x28283: 0x6cca4620, + 0x28284: 0x6cfc9620, 0x28285: 0x6c2e7a20, 0x28286: 0x6cb09c20, 0x28287: 0x6cb11220, + 0x28289: 0x6cde0c20, 0x2828b: 0x6c687220, + 0x2828c: 0x6d126620, 0x2828e: 0x6d271020, + 0x28290: 0x6cc61420, 0x28291: 0x6cbc1820, 0x28292: 0x6cb56220, 0x28293: 0x6c2da620, + 0x28294: 0x6cb56420, 0x28297: 0x6c4e7e20, + 0x28298: 0x6d253220, 0x28299: 0x6d1ee220, 0x2829a: 0x6c5fd020, 0x2829b: 0x6c412820, + 0x2829c: 0x6c4d0620, 0x2829d: 0x6cd30420, 0x2829f: 0x6cc0c820, + 0x282a9: 0x6cf1fa20, + 0x282ac: 0x6d321620, 0x282ad: 0x6cb2f220, 0x282ae: 0x6d0c5e20, 0x282af: 0x6c46e820, + 0x282b0: 0x6c720420, 0x282b1: 0x6ce52e20, + 0x282b7: 0x6c35d820, + 0x282ba: 0x6d0ace20, 0x282bb: 0x6c8c4620, + 0x282bc: 0x6c092620, + // Block 0xa0b, offset 0x282c0 + 0x282c0: 0x6d3eea20, 0x282c1: 0x6c530820, 0x282c3: 0x6c347420, + 0x282c5: 0x6c333c20, 0x282c6: 0x6d087220, + 0x282c8: 0x6ccd3020, 0x282ca: 0x6ccd3220, 0x282cb: 0x6d10d220, + 0x282cc: 0x6cc4b020, + 0x282d4: 0x6ceaf820, 0x282d7: 0x6c0dac20, + 0x282d8: 0x6d069e20, 0x282d9: 0x6cea1a20, 0x282da: 0x6c19d220, + 0x282dc: 0x6c30fe20, 0x282dd: 0x6d171420, + 0x282e1: 0x6c180820, + 0x282f5: 0x6c731a20, 0x282f6: 0x6c5eae20, + 0x282f8: 0x6d2fae20, 0x282f9: 0x6c07de20, 0x282fb: 0x6ce4e220, + // Block 0xa0c, offset 0x28300 + 0x28300: 0x6cae6420, + 0x28305: 0x6c3fda20, + 0x28316: 0x6ceb7620, + 0x28318: 0x6cfb3e20, 0x28319: 0x6ca69420, 0x2831a: 0x6c8f8620, + 0x2831d: 0x6d3d4220, 0x2831f: 0x6d32c020, + 0x28320: 0x6cd74820, 0x28321: 0x6d3f7c20, 0x28322: 0x6c3c4620, 0x28323: 0x6c32be20, + 0x28324: 0x6cb09420, 0x28325: 0x6d0d7820, 0x28326: 0x6cda1620, 0x28327: 0x6cc05820, + 0x28328: 0x6c362220, 0x28329: 0x6cb98e20, 0x2832b: 0x6cba0620, + 0x2832d: 0x6c10d420, 0x2832e: 0x6d0a8a20, + 0x28335: 0x6d3c8220, + 0x28338: 0x6c993a20, 0x28339: 0x6c68ee20, + 0x2833f: 0x6d2dea20, + // Block 0xa0d, offset 0x28340 + 0x28340: 0x6caffa20, 0x28341: 0x6cf63620, 0x28342: 0x6d0e7c20, 0x28343: 0x6c3ab420, + 0x28344: 0x6ca83620, 0x28346: 0x6d364620, + 0x28348: 0x6cdd6a20, 0x2834a: 0x6d17d020, + 0x2834c: 0x6c82c620, 0x2834d: 0x6d06ea20, 0x2834f: 0x6d17d220, + 0x28352: 0x6cee9620, + 0x28355: 0x6c5ede20, 0x28356: 0x6c186e20, 0x28357: 0x6c2eba20, + 0x28363: 0x6d257020, + 0x28365: 0x6cf78020, 0x28367: 0x6c8e6220, + 0x28368: 0x6cdd6c20, + 0x28371: 0x6c07fc20, 0x28372: 0x6cfa4020, 0x28373: 0x6d0e8c20, + 0x28375: 0x6c24d020, 0x28377: 0x6c773420, + 0x2837a: 0x6cbe4e20, 0x2837b: 0x6c909a20, + 0x2837c: 0x6c087e20, + // Block 0xa0e, offset 0x28380 + 0x28388: 0x6d2e6a20, 0x28389: 0x6c24ae20, 0x2838a: 0x6cf3e220, 0x2838b: 0x6d05c020, + 0x2838c: 0x6c187e20, 0x2838d: 0x6c4fd820, 0x2838e: 0x6c748820, + 0x28390: 0x6c192e20, 0x28391: 0x6c13fa20, 0x28392: 0x6c15ce20, 0x28393: 0x6d348820, + 0x28394: 0x6d0a2a20, + 0x283a3: 0x6c441a20, + 0x283a4: 0x6c18e220, 0x283a5: 0x6d132020, + 0x283aa: 0x6c1ee820, 0x283ab: 0x6cc1b820, + 0x283ac: 0x6d020620, 0x283ae: 0x6d2e7c20, 0x283af: 0x6c790820, + 0x283b1: 0x6c74ae20, + 0x283bd: 0x6cc1ba20, 0x283bf: 0x6c9b5020, + // Block 0xa0f, offset 0x283c0 + 0x283c0: 0x6d134e20, 0x283c1: 0x6d406620, 0x283c2: 0x6cb45620, + 0x283c4: 0x6cd3e420, + 0x283c9: 0x6cd57220, 0x283ca: 0x6c152a20, + 0x283cd: 0x6c31c420, 0x283cf: 0x6c4c4a20, + 0x283d0: 0x6c92fe20, 0x283d1: 0x6d0c3820, + 0x283d6: 0x6ca7ba20, 0x283d7: 0x6c0d6620, + 0x283df: 0x6ce9cc20, + 0x283e6: 0x6ca6dc20, 0x283e7: 0x6c584220, + 0x283e8: 0x6cb9de20, + 0x283ef: 0x6cfa6020, + 0x283f2: 0x6c8dc620, + 0x283f7: 0x6c882820, + 0x283f9: 0x6d186e20, 0x283fb: 0x6c866620, + 0x283fc: 0x6cd8f020, 0x283ff: 0x6c279a20, + // Block 0xa10, offset 0x28400 + 0x28402: 0x6cf11620, + 0x28405: 0x6c22c020, + 0x28409: 0x6c6fbe20, 0x2840a: 0x6c534420, + 0x2840c: 0x6d210e20, 0x2840e: 0x6c7c6e20, + 0x28412: 0x6c4f8020, 0x28413: 0x6c439620, + 0x28414: 0x6c39e620, 0x28417: 0x6c7c8020, + 0x2841a: 0x6c4a6c20, 0x2841b: 0x6c1bb020, + 0x2841e: 0x6c6fc220, + 0x28421: 0x6cdbce20, + 0x28424: 0x6c2ec620, + 0x2842c: 0x6cdc0c20, + 0x28430: 0x6cbd8620, + 0x28434: 0x6c4a8020, + 0x2843b: 0x6d3c6620, + 0x2843e: 0x6ce5de20, + // Block 0xa11, offset 0x28440 + 0x28441: 0x6d26d820, + 0x28447: 0x6d419220, + 0x2844f: 0x6cf3e820, + 0x28450: 0x6c250820, + 0x2845b: 0x6d36d220, + 0x28460: 0x6cd72e20, 0x28462: 0x6c301420, + 0x2846d: 0x6cef3c20, + 0x2847f: 0x6c1d4220, + // Block 0xa12, offset 0x28480 + 0x2848b: 0x6cc8f420, + 0x28496: 0x6c60d420, + 0x2849c: 0x6c2de820, 0x2849e: 0x6c124020, + 0x284a0: 0x6c7a0c20, 0x284a3: 0x6cef5420, + 0x284a7: 0x6c11bc20, + 0x284aa: 0x6c968020, 0x284ab: 0x6caba820, + 0x284b2: 0x6cca3820, + 0x284b6: 0x6cef6620, + 0x284bc: 0x6cca3e20, 0x284bf: 0x6c6c7020, + // Block 0xa13, offset 0x284c0 + 0x284cc: 0x6cef6e20, + 0x284de: 0x6c115420, 0x284df: 0x6c84d020, + 0x284ef: 0x6d273a20, + 0x284f4: 0x6d277220, 0x284f7: 0x6c196420, + 0x284fa: 0x6ccce420, + // Block 0xa14, offset 0x28500 + 0x28502: 0x6c54d620, 0x28503: 0x6ccc9e20, + 0x28504: 0x6cea5820, 0x28506: 0x6c3d3020, + 0x28508: 0x6cbe1820, 0x28509: 0x6d05ac20, + 0x2850d: 0x6c1fe620, 0x2850e: 0x6c400420, + 0x28512: 0x6d181220, 0x28513: 0x6c300c20, + 0x28514: 0x6c3eb420, 0x28515: 0x6c3eb620, 0x28516: 0x6d2ad620, 0x28517: 0x6cb4ae20, + 0x28519: 0x6c8d2c20, + 0x2851d: 0x6ccca020, 0x2851e: 0x6cad9420, + 0x28522: 0x6d1a8a20, 0x28523: 0x6c961e20, + 0x28524: 0x6c57b620, 0x28525: 0x6d1b6e20, 0x28526: 0x6c084a20, 0x28527: 0x6d209820, + 0x28528: 0x6ccf7020, 0x2852a: 0x6d01f220, 0x2852b: 0x6c1ee620, + 0x28534: 0x6ccf7220, 0x28535: 0x6c2d7220, + 0x28539: 0x6d187020, 0x2853b: 0x6c183a20, + 0x2853c: 0x6c451c20, 0x2853d: 0x6c8fa820, 0x2853e: 0x6cb2ca20, 0x2853f: 0x6d280220, + // Block 0xa15, offset 0x28540 + 0x28540: 0x6d0eae20, 0x28541: 0x6ca15a20, 0x28543: 0x6cdbd820, + 0x2854b: 0x6c6ea420, + 0x2854d: 0x6cd99c20, 0x2854e: 0x6cad0c20, + 0x28550: 0x6d0b3820, 0x28551: 0x6ccb5020, 0x28552: 0x6c34b820, + 0x28555: 0x6c207a20, 0x28556: 0x6d022420, + 0x28558: 0x6ce95a20, 0x28559: 0x6c45b420, 0x2855a: 0x6d08b620, + 0x2855c: 0x6c7e4e20, 0x2855e: 0x6c8d5e20, + 0x28560: 0x6c279020, 0x28561: 0x6d2c5220, + 0x2856c: 0x6d1a0a20, 0x2856d: 0x6cd93c20, 0x2856f: 0x6d229a20, + 0x28570: 0x6ceb4c20, 0x28571: 0x6ceb4e20, + 0x28574: 0x6c03c420, 0x28575: 0x6cc4d620, 0x28576: 0x6c0f8420, 0x28577: 0x6c279c20, + 0x28579: 0x6d2c5a20, 0x2857a: 0x6c543a20, + 0x2857e: 0x6c5b7820, + // Block 0xa16, offset 0x28580 + 0x28585: 0x6c916020, + 0x2858a: 0x6c8e2820, 0x2858b: 0x6cc7d620, + 0x28595: 0x6c28d220, 0x28596: 0x6c9b6620, 0x28597: 0x6cfa5820, + 0x28598: 0x6cf26220, 0x28599: 0x6c4e4620, 0x2859a: 0x6d3eb020, 0x2859b: 0x6d327420, + 0x2859c: 0x6ccb7c20, 0x2859d: 0x6c25fa20, 0x2859e: 0x6c86e420, + 0x285a0: 0x6c2ce220, 0x285a1: 0x6c887e20, 0x285a2: 0x6c46e020, + 0x285a6: 0x6caee020, + 0x285aa: 0x6d1c0a20, + 0x285ac: 0x6c548420, 0x285ae: 0x6c336c20, 0x285af: 0x6cf53e20, + 0x285b7: 0x6cb1be20, + 0x285b8: 0x6c520020, 0x285ba: 0x6c8fb820, 0x285bb: 0x6ca18420, + 0x285bc: 0x6c3a7620, 0x285bd: 0x6c93be20, 0x285be: 0x6d2b2020, 0x285bf: 0x6c0fae20, + // Block 0xa17, offset 0x285c0 + 0x285c0: 0x6c2d9620, 0x285c1: 0x6c98aa20, 0x285c3: 0x6d3c4e20, + 0x285c4: 0x6c932220, 0x285c5: 0x6cace820, 0x285c6: 0x6c337c20, 0x285c7: 0x6c10ce20, + 0x285cc: 0x6c189020, 0x285cd: 0x6c981220, + 0x285d6: 0x6cf72420, + 0x285dd: 0x6c019a20, 0x285de: 0x6d37dc20, + 0x285e0: 0x6ca44a20, 0x285e1: 0x6cebba20, 0x285e2: 0x6c519c20, + 0x285e5: 0x6c338220, 0x285e6: 0x6ceca020, 0x285e7: 0x6d37de20, + 0x285e8: 0x6c133e20, 0x285e9: 0x6c873620, 0x285ea: 0x6cd6aa20, + 0x285ee: 0x6c134020, + 0x285f0: 0x6cd84a20, 0x285f2: 0x6c338420, + 0x285f4: 0x6c5cdc20, + 0x285fc: 0x6c654220, 0x285fd: 0x6ca9e220, 0x285fe: 0x6c28ea20, 0x285ff: 0x6c409820, + // Block 0xa18, offset 0x28600 + 0x28600: 0x6c5e4e20, 0x28601: 0x6c5c9620, 0x28602: 0x6c228420, + 0x28604: 0x6d1e6620, 0x28605: 0x6cc9b620, 0x28606: 0x6ce6a420, + 0x2860e: 0x6c8f5a20, + 0x28611: 0x6cdb8c20, 0x28612: 0x6c8da220, 0x28613: 0x6c97a620, + 0x28614: 0x6c2d9c20, + 0x28618: 0x6cad4020, 0x2861a: 0x6c8da420, + 0x2861d: 0x6c878620, 0x2861f: 0x6caa1020, + 0x28623: 0x6c8b7820, + 0x28624: 0x6ccd6220, 0x28626: 0x6c3afe20, + 0x2862b: 0x6ccd6420, + 0x2862e: 0x6c8db820, 0x2862f: 0x6d2eaa20, + 0x28631: 0x6c0d7820, 0x28632: 0x6c84dc20, + 0x28635: 0x6cd86420, 0x28636: 0x6cc4fc20, 0x28637: 0x6c655820, + 0x28638: 0x6d3df020, 0x2863b: 0x6c8dbe20, + 0x2863c: 0x6c8dc020, 0x2863d: 0x6c9c2420, 0x2863f: 0x6cd6c820, + // Block 0xa19, offset 0x28640 + 0x28644: 0x6c8dc820, 0x28647: 0x6c5d5020, + 0x2864e: 0x6c8dee20, 0x2864f: 0x6c655e20, + 0x28650: 0x6cc23a20, + 0x28654: 0x6ca9ea20, 0x28655: 0x6c6e7c20, 0x28656: 0x6c187020, + 0x2865c: 0x6d318820, 0x2865d: 0x6cbede20, 0x2865f: 0x6cbee220, + 0x28660: 0x6c36c820, 0x28663: 0x6ccb9420, + 0x28669: 0x6c071a20, 0x2866b: 0x6c3a0020, + 0x2866e: 0x6c3ab620, 0x2866f: 0x6c3a3820, + 0x28674: 0x6c399820, 0x28675: 0x6c7a7c20, + 0x2867a: 0x6d28c620, 0x2867b: 0x6c5c2220, + 0x2867d: 0x6c3a4420, + // Block 0xa1a, offset 0x28680 + 0x28681: 0x6c338620, + 0x28686: 0x6cabca20, 0x28687: 0x6ca99c20, + 0x28688: 0x6cad2e20, 0x28689: 0x6c289820, 0x2868a: 0x6c27e820, 0x2868b: 0x6c00b220, + 0x2868d: 0x6ce50e20, 0x2868e: 0x6c17a420, 0x2868f: 0x6c02ac20, + 0x28690: 0x6c9aa020, 0x28691: 0x6ca43420, + 0x28694: 0x6c0ff420, 0x28695: 0x6d23b420, 0x28696: 0x6cfac420, 0x28697: 0x6c973a20, + 0x2869a: 0x6cb26420, + 0x2869c: 0x6c331020, 0x2869e: 0x6c2a3020, + 0x286a1: 0x6d043a20, 0x286a2: 0x6ca6ce20, 0x286a3: 0x6c4dba20, + 0x286a4: 0x6c1f7a20, 0x286a5: 0x6cd64a20, 0x286a6: 0x6c97cc20, + 0x286ac: 0x6ceda420, 0x286ad: 0x6d18dc20, 0x286ae: 0x6c2e4820, 0x286af: 0x6d0c3a20, + 0x286b1: 0x6cf32420, 0x286b2: 0x6cdba220, + 0x286b4: 0x6c019420, 0x286b5: 0x6c7fd420, 0x286b6: 0x6ca43e20, + 0x286b8: 0x6cc0b620, 0x286b9: 0x6c9e6820, 0x286ba: 0x6caae420, 0x286bb: 0x6c11c020, + 0x286bc: 0x6c11e620, + // Block 0xa1b, offset 0x286c0 + 0x286c0: 0x6c808620, 0x286c1: 0x6ce52a20, 0x286c2: 0x6d139220, + 0x286c4: 0x6ca74e20, 0x286c6: 0x6cd64e20, + 0x286cb: 0x6c228620, + 0x286cd: 0x6c663a20, + 0x286d0: 0x6c424020, + 0x286d4: 0x6c673220, 0x286d5: 0x6c4caa20, 0x286d7: 0x6d2dd620, + 0x286d9: 0x6c95dc20, + 0x286dc: 0x6c5ebc20, 0x286dd: 0x6c4b5220, + 0x286e1: 0x6c63d220, 0x286e2: 0x6c614a20, + 0x286e5: 0x6d08a020, 0x286e7: 0x6c3c5a20, + 0x286eb: 0x6c09ea20, + 0x286ec: 0x6cb60a20, 0x286ef: 0x6d258e20, + 0x286f0: 0x6c021a20, 0x286f1: 0x6c2b3820, + 0x286f4: 0x6c366820, 0x286f5: 0x6c3b7e20, + 0x286f8: 0x6c727020, 0x286f9: 0x6ca64220, 0x286fa: 0x6ceb3c20, + 0x286fc: 0x6cd00c20, 0x286fd: 0x6c3eca20, 0x286fe: 0x6cf9e420, 0x286ff: 0x6cc1ac20, + // Block 0xa1c, offset 0x28700 + 0x28700: 0x6cb39a20, 0x28701: 0x6ced4220, 0x28702: 0x6c8d4220, 0x28703: 0x6c96d220, + 0x28704: 0x6d394020, 0x28705: 0x6c065c20, 0x28707: 0x6d23b620, + 0x2870c: 0x6c082a20, 0x2870d: 0x6c973c20, 0x2870f: 0x6c637a20, + 0x28711: 0x6d102e20, 0x28713: 0x6c7ade20, + 0x28714: 0x6c69c020, 0x28716: 0x6c0df220, + 0x2871a: 0x6c962420, 0x2871b: 0x6c4b1820, + 0x2871c: 0x6c351420, 0x2871d: 0x6d36d420, + 0x28721: 0x6d326020, 0x28722: 0x6c369e20, 0x28723: 0x6d39ca20, + 0x28724: 0x6c039020, + 0x28728: 0x6d326220, 0x28729: 0x6c3c6820, 0x2872a: 0x6c313820, 0x2872b: 0x6ca73c20, + 0x2872c: 0x6c10bc20, 0x2872d: 0x6c336020, 0x2872e: 0x6ccc1c20, 0x2872f: 0x6ccb6820, + 0x28730: 0x6c0a6220, + 0x28734: 0x6d36f420, 0x28735: 0x6d309820, 0x28736: 0x6c10be20, + 0x2873a: 0x6c74c420, 0x2873b: 0x6d0aa820, + 0x2873f: 0x6cf90020, + // Block 0xa1d, offset 0x28740 + 0x28741: 0x6d3db820, 0x28742: 0x6c045a20, 0x28743: 0x6d115c20, + 0x28744: 0x6c1e3420, 0x28745: 0x6cdeb620, 0x28746: 0x6cb93020, + 0x28748: 0x6ca53820, 0x28749: 0x6d242020, 0x2874a: 0x6c36bc20, 0x2874b: 0x6c650820, + 0x2874c: 0x6d18de20, 0x2874d: 0x6cff2a20, 0x2874f: 0x6ca88020, + 0x28752: 0x6c0db620, + 0x28757: 0x6c4cd420, + 0x28758: 0x6d010820, 0x28759: 0x6c2e4a20, + 0x2875c: 0x6c70d620, 0x2875d: 0x6cdda420, 0x2875e: 0x6c2ef420, 0x2875f: 0x6c3f1420, + 0x28760: 0x6c9e4420, 0x28761: 0x6cd3fa20, 0x28762: 0x6d08c420, 0x28763: 0x6ce39c20, + 0x28764: 0x6d244420, 0x28767: 0x6d011820, + 0x28768: 0x6c3f1620, 0x28769: 0x6d373420, 0x2876a: 0x6ca65a20, 0x2876b: 0x6d08c620, + 0x2876c: 0x6d0fe820, 0x2876e: 0x6c3cd020, 0x2876f: 0x6d403c20, + 0x28770: 0x6d395e20, 0x28771: 0x6d07de20, + 0x28775: 0x6d39d820, 0x28777: 0x6c7edc20, + 0x28779: 0x6d1d5820, 0x2877a: 0x6c435c20, 0x2877b: 0x6c7e2c20, + 0x2877d: 0x6c358820, 0x2877e: 0x6cef5620, 0x2877f: 0x6c9a3620, + // Block 0xa1e, offset 0x28780 + 0x28783: 0x6c57fe20, + 0x28784: 0x6c1e3820, 0x28786: 0x6cddb220, 0x28787: 0x6cdec820, + 0x28788: 0x6cddb420, 0x28789: 0x6cdeca20, 0x2878a: 0x6d097a20, + 0x2878c: 0x6c460820, 0x2878d: 0x6c643220, 0x2878f: 0x6c0fb020, + 0x28790: 0x6cdecc20, 0x28791: 0x6d25f620, + 0x28798: 0x6cdece20, + 0x2879d: 0x6c20ec20, + 0x287a0: 0x6d047820, 0x287a1: 0x6c519820, 0x287a2: 0x6cdd4820, + 0x287a7: 0x6ca18a20, + 0x287a8: 0x6c1d2c20, 0x287a9: 0x6cdbe420, 0x287aa: 0x6d2b2220, 0x287ab: 0x6c933220, + 0x287ac: 0x6d2eea20, 0x287ad: 0x6c963c20, 0x287ae: 0x6d075820, 0x287af: 0x6c653a20, + 0x287b0: 0x6ccd2220, 0x287b2: 0x6d075a20, + 0x287be: 0x6c67cc20, + // Block 0xa1f, offset 0x287c0 + 0x287c2: 0x6c067c20, 0x287c3: 0x6c970c20, + 0x287c5: 0x6ce7a020, 0x287c6: 0x6cf92c20, + 0x287c9: 0x6cc6e620, 0x287cb: 0x6cd12a20, + 0x287cc: 0x6d396c20, 0x287ce: 0x6c654420, 0x287cf: 0x6c409a20, + 0x287d0: 0x6c2afa20, 0x287d3: 0x6d1de220, + 0x287d4: 0x6c70e420, 0x287d6: 0x6d195e20, 0x287d7: 0x6c054820, + 0x287d9: 0x6ccb9620, 0x287da: 0x6cdcc620, + 0x287dc: 0x6c346e20, 0x287dd: 0x6d028420, + 0x287e1: 0x6c58c820, + 0x287e5: 0x6cc80c20, 0x287e6: 0x6ca66c20, 0x287e7: 0x6d397020, + 0x287e8: 0x6c4bac20, 0x287ea: 0x6c964820, + 0x287f2: 0x6d342e20, 0x287f3: 0x6d076c20, + 0x287f5: 0x6d343020, 0x287f7: 0x6c752a20, + 0x287f8: 0x6c70e820, 0x287fb: 0x6d25da20, + 0x287fc: 0x6c91a420, 0x287ff: 0x6c0fda20, + // Block 0xa20, offset 0x28800 + 0x28802: 0x6cc6ea20, 0x28803: 0x6d029620, + 0x28809: 0x6cf83220, 0x2880a: 0x6c959a20, + 0x2880e: 0x6c447020, + 0x28811: 0x6d414620, 0x28812: 0x6c4eca20, + 0x28814: 0x6c685620, 0x28815: 0x6cc95420, 0x28816: 0x6cbd8a20, 0x28817: 0x6cc43c20, + 0x28818: 0x6cad6420, 0x28819: 0x6d26da20, 0x2881a: 0x6c182c20, 0x2881b: 0x6c3ece20, + 0x2881c: 0x6cadc020, 0x2881f: 0x6c9aa420, + 0x28822: 0x6ce1de20, + 0x28824: 0x6c78f020, 0x28825: 0x6cf8d420, + 0x2882b: 0x6c351620, + 0x2882d: 0x6d187220, + 0x28830: 0x6cdc7e20, 0x28832: 0x6cf9f820, 0x28833: 0x6c730420, + 0x28835: 0x6cef3e20, 0x28837: 0x6d18ba20, + 0x28839: 0x6d242220, 0x2883b: 0x6c045c20, + 0x2883c: 0x6ceb5820, 0x2883d: 0x6cdeb820, 0x2883e: 0x6cad6e20, + // Block 0xa21, offset 0x28840 + 0x28842: 0x6c0dfc20, + 0x28845: 0x6d286820, 0x28846: 0x6d286a20, 0x28847: 0x6c32e220, + 0x28848: 0x6cc88620, 0x28849: 0x6cef5820, + 0x2884f: 0x6cf05020, + 0x28850: 0x6c4b9820, 0x28852: 0x6c26d420, 0x28853: 0x6cfa1420, + 0x28856: 0x6c5d4a20, 0x28857: 0x6c733220, + 0x28858: 0x6cdbe620, 0x2885a: 0x6cdcbc20, + 0x2885d: 0x6c90d620, 0x2885e: 0x6c046420, 0x2885f: 0x6d246e20, + 0x28860: 0x6d337420, 0x28861: 0x6c4ba620, 0x28863: 0x6c7c5820, + 0x28864: 0x6c42f220, 0x28865: 0x6c281620, + 0x28869: 0x6cfc5a20, 0x2886a: 0x6d2d2420, 0x2886b: 0x6ccb9820, + 0x2886d: 0x6c784620, 0x2886e: 0x6c105020, 0x2886f: 0x6c0fce20, + 0x28872: 0x6cdcc820, + 0x28874: 0x6d249420, 0x28875: 0x6c105220, 0x28876: 0x6c6f9220, 0x28877: 0x6c6f9420, + 0x28879: 0x6c73aa20, 0x2887a: 0x6c754220, + 0x2887c: 0x6ca31620, 0x2887d: 0x6d2d1c20, 0x2887e: 0x6ce1ba20, 0x2887f: 0x6cefec20, + // Block 0xa22, offset 0x28880 + 0x28880: 0x6cf9dc20, 0x28881: 0x6d01cc20, + 0x28885: 0x6cc9a620, 0x28886: 0x6c5f6620, + 0x28889: 0x6d026a20, + 0x2888c: 0x6c338c20, 0x2888d: 0x6d3f2620, + 0x28898: 0x6d25ee20, 0x28899: 0x6cbe1e20, 0x2889a: 0x6c3ed020, 0x2889b: 0x6caeba20, + 0x2889c: 0x6cad6620, 0x2889e: 0x6d1b7620, + 0x288a0: 0x6c52c220, 0x288a1: 0x6d40d420, 0x288a3: 0x6c45a820, + 0x288a4: 0x6c308820, 0x288a5: 0x6c50a820, 0x288a6: 0x6cf31020, + 0x288a8: 0x6cace220, 0x288ab: 0x6cdb2820, + 0x288ac: 0x6c76f020, 0x288ad: 0x6ca88220, 0x288ae: 0x6c4ffa20, 0x288af: 0x6c3cfa20, + 0x288b0: 0x6c36be20, 0x288b1: 0x6d137620, + 0x288b4: 0x6ce69820, 0x288b5: 0x6c309420, 0x288b6: 0x6d30ba20, 0x288b7: 0x6cca7820, + 0x288bb: 0x6ca18c20, + 0x288bc: 0x6cdb6020, 0x288be: 0x6c823220, + // Block 0xa23, offset 0x288c0 + 0x288c0: 0x6cb4a620, 0x288c1: 0x6c35a620, 0x288c2: 0x6d3de220, 0x288c3: 0x6d139820, + 0x288c7: 0x6cfda220, + 0x288c8: 0x6c4a2c20, 0x288c9: 0x6cc59e20, 0x288ca: 0x6c8dfe20, + 0x288cd: 0x6c02cc20, + 0x288d0: 0x6c146820, 0x288d2: 0x6c345620, 0x288d3: 0x6cbf3620, + 0x288d4: 0x6c7a4620, 0x288d5: 0x6d05b020, 0x288d6: 0x6c587c20, 0x288d7: 0x6d10aa20, + 0x288d8: 0x6d324620, 0x288d9: 0x6ce6da20, 0x288da: 0x6c082420, + 0x288dd: 0x6c020220, 0x288df: 0x6c76b420, + 0x288e1: 0x6c7a4c20, 0x288e2: 0x6cadde20, 0x288e3: 0x6d205220, + 0x288e4: 0x6c02aa20, 0x288e5: 0x6c9ad020, 0x288e6: 0x6ca13620, + 0x288ec: 0x6c3f7220, 0x288ed: 0x6cbe5020, 0x288ee: 0x6c7e8220, 0x288ef: 0x6c30f220, + 0x288f0: 0x6ce06c20, 0x288f3: 0x6cba1c20, + 0x288f4: 0x6d121c20, 0x288f5: 0x6cf0b620, 0x288f6: 0x6c558c20, 0x288f7: 0x6ca14620, + 0x288f8: 0x6c50a620, 0x288f9: 0x6d08ac20, 0x288fb: 0x6c0a1220, + 0x288fc: 0x6cb31a20, 0x288fe: 0x6c2b3c20, + // Block 0xa24, offset 0x28900 + 0x28900: 0x6d31f020, 0x28902: 0x6cd1e420, 0x28903: 0x6c76e420, + 0x28904: 0x6c130c20, 0x28907: 0x6d05c420, + 0x28908: 0x6d31f220, 0x2890a: 0x6d3a7820, + 0x2890f: 0x6c5c2420, + 0x28910: 0x6c1bc020, 0x28913: 0x6c53aa20, + 0x28914: 0x6caa0420, 0x28915: 0x6ca86a20, 0x28916: 0x6d0eb020, + 0x28918: 0x6c1d4020, 0x28919: 0x6c3f8620, 0x2891a: 0x6c49f420, 0x2891b: 0x6cb52c20, + 0x2891d: 0x6c44a220, 0x2891e: 0x6ce6e020, + 0x28922: 0x6ce07220, 0x28923: 0x6cba2020, + 0x28926: 0x6c702020, 0x28927: 0x6d05e220, + 0x28928: 0x6cb71620, 0x2892a: 0x6d326420, + 0x2892e: 0x6cc09c20, + 0x28930: 0x6c35bc20, 0x28933: 0x6c5c4c20, + 0x28934: 0x6c53d820, 0x28935: 0x6cbeb420, 0x28937: 0x6c17e020, + 0x2893a: 0x6c405c20, + 0x2893c: 0x6c52ce20, 0x2893d: 0x6cf6e220, 0x2893e: 0x6cf3ee20, 0x2893f: 0x6c987820, + // Block 0xa25, offset 0x28940 + 0x28942: 0x6ce2fc20, + 0x28945: 0x6c52d020, + 0x28950: 0x6c0f6a20, 0x28952: 0x6cbde820, 0x28953: 0x6c44a420, + 0x28956: 0x6c3f0020, 0x28957: 0x6c7cde20, + 0x2895d: 0x6c0cfe20, 0x2895e: 0x6c6eba20, 0x2895f: 0x6c76f220, + 0x28960: 0x6c4a9020, 0x28962: 0x6c432820, 0x28963: 0x6d05f420, + 0x28964: 0x6c01d420, 0x28965: 0x6d26f420, 0x28966: 0x6cf53420, 0x28967: 0x6d157a20, + 0x28968: 0x6c6dda20, 0x2896a: 0x6c930220, 0x2896b: 0x6cc31c20, + 0x2896c: 0x6ce9c820, 0x2896e: 0x6c62a420, + 0x2897a: 0x6c6f3420, 0x2897b: 0x6c74d420, + 0x2897c: 0x6cb1d620, 0x2897d: 0x6c7d8a20, + // Block 0xa26, offset 0x28980 + 0x28980: 0x6cec7420, 0x28981: 0x6c5c7620, 0x28982: 0x6c341220, 0x28983: 0x6d25f420, + 0x28984: 0x6c6b6a20, 0x28986: 0x6c4b9020, 0x28987: 0x6c432e20, + 0x28988: 0x6cb3b220, 0x28989: 0x6c9ade20, 0x2898a: 0x6d3bf020, 0x2898b: 0x6c4f9c20, + 0x28994: 0x6d1e0420, 0x28995: 0x6cc0a420, 0x28997: 0x6c834e20, + 0x28998: 0x6c020620, 0x28999: 0x6cb08020, 0x2899a: 0x6cf24220, + 0x2899d: 0x6cbe2a20, 0x2899f: 0x6cbdee20, + 0x289a0: 0x6c9f0620, 0x289a1: 0x6c30d020, 0x289a2: 0x6c9c9420, 0x289a3: 0x6d2db820, + 0x289a5: 0x6cbec020, 0x289a6: 0x6d158c20, + 0x289ae: 0x6c04aa20, + 0x289b1: 0x6c730a20, 0x289b3: 0x6d2b2420, + 0x289b4: 0x6d075c20, 0x289b5: 0x6c7ff420, 0x289b6: 0x6c968220, 0x289b7: 0x6c968420, + 0x289b8: 0x6cab6220, 0x289b9: 0x6c06c020, 0x289bb: 0x6cb3e820, + 0x289bc: 0x6d075e20, + // Block 0xa27, offset 0x289c0 + 0x289c0: 0x6c02fe20, + 0x289c6: 0x6c53ae20, + 0x289c9: 0x6c53b020, 0x289ca: 0x6d2e3c20, + 0x289cc: 0x6ccbb620, 0x289cd: 0x6c433020, 0x289cf: 0x6cb34420, + 0x289d0: 0x6c8aae20, + 0x289d5: 0x6cec7a20, 0x289d6: 0x6d07f420, + 0x289dc: 0x6c7cb820, 0x289df: 0x6c36ea20, + 0x289e0: 0x6c4f3e20, 0x289e1: 0x6ccb9a20, + 0x289e4: 0x6c28ee20, + 0x289ea: 0x6d07f620, + 0x289ec: 0x6c36f420, 0x289ed: 0x6c415a20, 0x289ef: 0x6c29c820, + 0x289f1: 0x6c9bfa20, 0x289f2: 0x6d143e20, 0x289f3: 0x6ca94e20, + 0x289f5: 0x6cb23020, + 0x289f9: 0x6c124620, + 0x289fe: 0x6d263c20, + // Block 0xa28, offset 0x28a00 + 0x28a00: 0x6c36fc20, 0x28a01: 0x6ca8ca20, + 0x28a04: 0x6d1b2e20, 0x28a07: 0x6cbbca20, + 0x28a09: 0x6c52e220, 0x28a0a: 0x6c8dca20, + 0x28a0c: 0x6c14e820, 0x28a0d: 0x6d1d3020, + 0x28a12: 0x6c494820, + 0x28a14: 0x6ca7ca20, 0x28a15: 0x6d05c620, 0x28a16: 0x6cdff820, 0x28a17: 0x6c6d6e20, + 0x28a1b: 0x6caea620, + 0x28a1d: 0x6c89e820, + 0x28a20: 0x6c072c20, 0x28a23: 0x6d030020, + 0x28a24: 0x6cea6020, 0x28a25: 0x6c174e20, 0x28a26: 0x6c41a420, + 0x28a28: 0x6c54e020, 0x28a29: 0x6cee2e20, + 0x28a2c: 0x6c3eba20, 0x28a2d: 0x6cae2220, 0x28a2f: 0x6ca4b620, + 0x28a30: 0x6d0a1820, 0x28a31: 0x6d096c20, + 0x28a34: 0x6c8f1220, 0x28a35: 0x6c8d4420, 0x28a36: 0x6d097020, 0x28a37: 0x6cc12e20, + 0x28a38: 0x6c4fda20, 0x28a39: 0x6d153c20, 0x28a3a: 0x6c4ef420, + 0x28a3c: 0x6c3ed220, 0x28a3d: 0x6c038a20, 0x28a3e: 0x6d153e20, + // Block 0xa29, offset 0x28a40 + 0x28a40: 0x6c0f3820, + 0x28a44: 0x6c52c420, 0x28a45: 0x6c866a20, + 0x28a49: 0x6cc98820, 0x28a4a: 0x6cf6b220, + 0x28a4e: 0x6cd3ce20, 0x28a4f: 0x6cb15e20, + 0x28a50: 0x6c57c220, 0x28a51: 0x6d155220, 0x28a52: 0x6c0f5220, 0x28a53: 0x6c0f6c20, + 0x28a54: 0x6ca57620, 0x28a55: 0x6cc09e20, + 0x28a58: 0x6cf01e20, 0x28a59: 0x6c184a20, 0x28a5a: 0x6d1f7820, + 0x28a5c: 0x6cf0dc20, 0x28a5d: 0x6c5b6820, 0x28a5e: 0x6cc99a20, + 0x28a62: 0x6c53da20, 0x28a63: 0x6cd9e820, + 0x28a64: 0x6c4f1220, 0x28a65: 0x6cad6a20, 0x28a67: 0x6c39b020, + 0x28a69: 0x6c8eae20, 0x28a6a: 0x6d395a20, 0x28a6b: 0x6cb02a20, + 0x28a6d: 0x6c86b620, + 0x28a70: 0x6c20e820, 0x28a71: 0x6cf6fc20, 0x28a72: 0x6d330220, + 0x28a74: 0x6c085620, 0x28a75: 0x6d333420, 0x28a76: 0x6cdc9620, 0x28a77: 0x6d0de420, + 0x28a7c: 0x6cbe5a20, 0x28a7d: 0x6cf53620, 0x28a7e: 0x6c89a620, + // Block 0xa2a, offset 0x28a80 + 0x28a80: 0x6d2fe420, 0x28a81: 0x6c897220, + 0x28a85: 0x6c6a3c20, 0x28a87: 0x6c52da20, + 0x28a88: 0x6d1ec020, 0x28a8a: 0x6c7ea220, 0x28a8b: 0x6c548620, + 0x28a8d: 0x6d263620, 0x28a8e: 0x6c539620, 0x28a8f: 0x6d137820, + 0x28a91: 0x6d1d1c20, 0x28a92: 0x6d086020, 0x28a93: 0x6d1f8620, + 0x28a98: 0x6cc32020, + 0x28a9c: 0x6ce15e20, 0x28a9d: 0x6cddb620, 0x28a9f: 0x6c871020, + 0x28aa0: 0x6cd9fc20, 0x28aa1: 0x6c871220, + 0x28aa4: 0x6d245420, 0x28aa7: 0x6d192020, + 0x28aad: 0x6d051220, 0x28aae: 0x6c028620, 0x28aaf: 0x6ce97420, + 0x28ab0: 0x6cdb6220, 0x28ab1: 0x6cd67a20, 0x28ab3: 0x6d247020, + 0x28ab5: 0x6c3c7a20, + 0x28ab9: 0x6cdb6620, 0x28aba: 0x6ce9da20, 0x28abb: 0x6d247220, + 0x28abc: 0x6d331020, 0x28abd: 0x6d331220, 0x28abf: 0x6ce25420, + // Block 0xa2b, offset 0x28ac0 + 0x28ac4: 0x6c8ee020, 0x28ac6: 0x6c1a5c20, 0x28ac7: 0x6cdc0620, + 0x28ac8: 0x6ccad820, + 0x28acf: 0x6c47f420, + 0x28ad0: 0x6c3c8a20, 0x28ad1: 0x6c8b8420, 0x28ad2: 0x6cb17a20, + 0x28ad6: 0x6c87b620, + 0x28ad8: 0x6c901820, 0x28ad9: 0x6c1e7020, 0x28ada: 0x6cff6220, 0x28adb: 0x6c52e420, + 0x28adc: 0x6d029820, 0x28add: 0x6ccf9420, + 0x28ae0: 0x6c902620, 0x28ae1: 0x6c53ea20, 0x28ae2: 0x6d083e20, 0x28ae3: 0x6c3c9620, + 0x28ae5: 0x6c037420, 0x28ae6: 0x6c0ecc20, 0x28ae7: 0x6ce22620, + 0x28ae8: 0x6cdabc20, 0x28ae9: 0x6d2fb820, 0x28aea: 0x6c0c0220, 0x28aeb: 0x6cd9c420, + 0x28aec: 0x6ce9aa20, 0x28aed: 0x6cdd8820, 0x28aee: 0x6cfefa20, 0x28aef: 0x6c527220, + 0x28af0: 0x6ccac620, 0x28af2: 0x6c3a1020, + 0x28af7: 0x6ca9aa20, + 0x28af8: 0x6c98ac20, + 0x28afd: 0x6c58ca20, 0x28afe: 0x6d343420, + // Block 0xa2c, offset 0x28b00 + 0x28b02: 0x6d171620, + 0x28b04: 0x6d22fe20, 0x28b07: 0x6d14f020, + 0x28b08: 0x6d264e20, 0x28b09: 0x6c1b2220, + 0x28b15: 0x6d1aea20, 0x28b16: 0x6ca9a620, 0x28b17: 0x6cc71420, + 0x28b1b: 0x6ca34a20, + 0x28b23: 0x6ce4a620, + 0x28b25: 0x6c035020, + 0x28b2a: 0x6c379c20, 0x28b2b: 0x6d32dc20, + 0x28b2c: 0x6c366a20, 0x28b2d: 0x6cb3dc20, 0x28b2e: 0x6c5efa20, 0x28b2f: 0x6ca5f620, + 0x28b31: 0x6c6f2020, 0x28b32: 0x6c63d420, + 0x28b35: 0x6c41a620, + 0x28b39: 0x6c8d2e20, 0x28b3b: 0x6d41bc20, + 0x28b3e: 0x6c073820, + // Block 0xa2d, offset 0x28b40 + 0x28b45: 0x6cd4f220, 0x28b46: 0x6d15fc20, 0x28b47: 0x6cabf420, + 0x28b4b: 0x6ca50e20, + 0x28b4c: 0x6cd3c020, 0x28b4e: 0x6c97c620, 0x28b4f: 0x6cd3c220, + 0x28b51: 0x6ce35e20, + 0x28b58: 0x6c45a420, + 0x28b5d: 0x6c834420, 0x28b5e: 0x6c061020, 0x28b5f: 0x6d251020, + 0x28b60: 0x6d422820, 0x28b61: 0x6c80e620, 0x28b62: 0x6d04f220, + 0x28b65: 0x6d294220, 0x28b66: 0x6c1a8620, 0x28b67: 0x6c64e820, + 0x28b68: 0x6c99b420, 0x28b69: 0x6c63e220, 0x28b6a: 0x6d23de20, + 0x28b6d: 0x6d23e020, 0x28b6e: 0x6d155420, + 0x28b72: 0x6c982020, 0x28b73: 0x6d294420, + 0x28b75: 0x6d3ca820, 0x28b76: 0x6ce37620, + 0x28b79: 0x6cf8d620, 0x28b7a: 0x6c716020, 0x28b7b: 0x6d299e20, + 0x28b7c: 0x6c92e420, 0x28b7d: 0x6ce24420, + // Block 0xa2e, offset 0x28b80 + 0x28b80: 0x6d3cb020, 0x28b81: 0x6c8d6020, 0x28b83: 0x6c729c20, + 0x28b86: 0x6c5f4c20, 0x28b87: 0x6c733020, + 0x28b8a: 0x6d3e9a20, + 0x28b8c: 0x6d265a20, 0x28b8d: 0x6c301620, + 0x28b92: 0x6ca47020, + 0x28b96: 0x6c1d2420, + 0x28b9f: 0x6c022020, + 0x28ba3: 0x6c44e020, + 0x28ba5: 0x6c0e9420, 0x28ba6: 0x6c2fbc20, 0x28ba7: 0x6cf02220, + 0x28bac: 0x6cc31a20, 0x28bad: 0x6c783a20, + 0x28bb0: 0x6cb0cc20, 0x28bb1: 0x6c76f420, 0x28bb2: 0x6c3f0e20, 0x28bb3: 0x6d1e6220, + 0x28bb5: 0x6ce96620, 0x28bb6: 0x6ce81e20, 0x28bb7: 0x6d205a20, + 0x28bb8: 0x6d10c020, 0x28bba: 0x6d126c20, + 0x28bbd: 0x6d0ed220, + // Block 0xa2f, offset 0x28bc0 + 0x28bc8: 0x6cfbb220, 0x28bca: 0x6ce38e20, + 0x28bcc: 0x6cdc9820, + 0x28bd0: 0x6c227420, + 0x28bd4: 0x6d066220, 0x28bd5: 0x6cf53820, 0x28bd6: 0x6c117420, 0x28bd7: 0x6d242420, + 0x28bda: 0x6c15f820, 0x28bdb: 0x6cfa1020, + 0x28bdd: 0x6c77ce20, 0x28bde: 0x6c124220, 0x28bdf: 0x6c13bc20, + 0x28be0: 0x6cc0b420, 0x28be3: 0x6c267220, + 0x28be5: 0x6cdb5620, + 0x28be8: 0x6c571c20, + 0x28bf7: 0x6cf38e20, + 0x28bf8: 0x6d251a20, + 0x28bfd: 0x6c681220, 0x28bfe: 0x6cfe0820, 0x28bff: 0x6d2d0620, + // Block 0xa30, offset 0x28c00 + 0x28c00: 0x6cca3a20, 0x28c01: 0x6ca09220, 0x28c03: 0x6cce3e20, + 0x28c04: 0x6c12a420, 0x28c05: 0x6cdbe220, 0x28c06: 0x6c208420, 0x28c07: 0x6c9c9620, + 0x28c08: 0x6d3a3420, 0x28c09: 0x6c1d2820, 0x28c0a: 0x6c62c220, 0x28c0b: 0x6c1d2a20, + 0x28c19: 0x6c889020, + 0x28c1e: 0x6c4d8020, + 0x28c24: 0x6c33c220, 0x28c25: 0x6cfe0c20, 0x28c26: 0x6c19ae20, 0x28c27: 0x6cce4020, + 0x28c28: 0x6c873820, 0x28c29: 0x6c5a2c20, + 0x28c2c: 0x6c2af820, 0x28c2f: 0x6c897a20, + 0x28c36: 0x6d28a420, + 0x28c3a: 0x6c5e4420, 0x28c3b: 0x6c8c0420, + 0x28c3e: 0x6c31ee20, 0x28c3f: 0x6c4f3620, + // Block 0xa31, offset 0x28c40 + 0x28c40: 0x6d1ddc20, 0x28c41: 0x6d263a20, 0x28c42: 0x6c4cf420, 0x28c43: 0x6c8d9c20, + 0x28c45: 0x6c88de20, 0x28c47: 0x6c030220, + 0x28c48: 0x6c292220, 0x28c49: 0x6d194e20, 0x28c4a: 0x6ca9e420, 0x28c4b: 0x6ccde620, + 0x28c4d: 0x6d035c20, + 0x28c50: 0x6c26da20, 0x28c51: 0x6d247420, 0x28c52: 0x6c118220, 0x28c53: 0x6cf33420, + 0x28c54: 0x6c141420, 0x28c55: 0x6c0fca20, 0x28c57: 0x6c663020, + 0x28c5e: 0x6c9bb820, 0x28c5f: 0x6cf05e20, + 0x28c60: 0x6ca09e20, + 0x28c65: 0x6cd73820, 0x28c66: 0x6c6b8220, 0x28c67: 0x6cd7b220, + 0x28c68: 0x6c5e5420, 0x28c6b: 0x6c21ee20, + 0x28c6d: 0x6c901420, 0x28c6e: 0x6c582420, + 0x28c70: 0x6ceada20, 0x28c73: 0x6d220620, + 0x28c76: 0x6c165a20, 0x28c77: 0x6d1dee20, + 0x28c78: 0x6c5e5e20, 0x28c7a: 0x6c806820, + 0x28c7f: 0x6ca30c20, + // Block 0xa32, offset 0x28c80 + 0x28c80: 0x6c032220, 0x28c81: 0x6c418020, 0x28c82: 0x6d15cc20, 0x28c83: 0x6c63ac20, + 0x28c85: 0x6c269220, 0x28c86: 0x6c2fa420, 0x28c87: 0x6d0a8220, + 0x28c88: 0x6cc59620, 0x28c89: 0x6c732020, 0x28c8a: 0x6ce94c20, 0x28c8b: 0x6d064020, + 0x28c8c: 0x6cd99220, 0x28c8e: 0x6c128420, 0x28c8f: 0x6c198e20, + 0x28c91: 0x6c2f7020, + 0x28c9a: 0x6c4d2620, + 0x28c9f: 0x6cf47220, + 0x28ca6: 0x6cb72020, + 0x28ca8: 0x6c5f6820, + 0x28cae: 0x6c7cac20, 0x28caf: 0x6cef5e20, + 0x28cb6: 0x6cd44e20, 0x28cb7: 0x6c3f2820, + 0x28cb9: 0x6ce97a20, 0x28cbb: 0x6c0cf020, + 0x28cbd: 0x6cdff020, 0x28cbe: 0x6c4f5220, 0x28cbf: 0x6cb1ce20, + // Block 0xa33, offset 0x28cc0 + 0x28cc3: 0x6d217e20, + 0x28cc4: 0x6cdffa20, + 0x28ccc: 0x6cfd9020, 0x28cce: 0x6d050c20, + 0x28cd3: 0x6cf26820, + 0x28cd4: 0x6c4d8220, 0x28cd5: 0x6caef220, + 0x28cdd: 0x6ce04620, 0x28cdf: 0x6c0d0a20, + 0x28ce0: 0x6cfd9e20, 0x28ce3: 0x6d162e20, + 0x28ce6: 0x6cb19020, 0x28ce7: 0x6c586c20, + 0x28ce8: 0x6ca24020, 0x28ce9: 0x6c035220, 0x28ceb: 0x6c396020, + 0x28cef: 0x6c2f6020, + 0x28cf7: 0x6c3b3c20, + 0x28cfa: 0x6c6bf620, + 0x28cfe: 0x6cdd4a20, + // Block 0xa34, offset 0x28d00 + 0x28d04: 0x6ced9220, 0x28d05: 0x6c43a220, + 0x28d08: 0x6c3b3e20, 0x28d0a: 0x6ceb4420, + 0x28d0c: 0x6cf1a620, 0x28d0d: 0x6c487620, 0x28d0e: 0x6c343620, + 0x28d10: 0x6d308820, 0x28d11: 0x6c22a020, 0x28d12: 0x6d11ce20, + 0x28d14: 0x6c050420, 0x28d15: 0x6c10b820, 0x28d16: 0x6ca15c20, + 0x28d18: 0x6cb35e20, 0x28d1b: 0x6c443020, + 0x28d1e: 0x6c8e9220, + 0x28d21: 0x6cc4d020, + 0x28d28: 0x6c41b020, 0x28d2a: 0x6c55a220, 0x28d2b: 0x6ca1e620, + 0x28d2e: 0x6d04f620, 0x28d2f: 0x6c59a220, + 0x28d30: 0x6c3f0220, 0x28d31: 0x6c5b4220, 0x28d33: 0x6cc1ca20, + 0x28d34: 0x6c6b3e20, 0x28d35: 0x6cead220, 0x28d36: 0x6d21ac20, 0x28d37: 0x6ca16820, + 0x28d38: 0x6d38b220, 0x28d39: 0x6c702820, 0x28d3b: 0x6cd53c20, + 0x28d3c: 0x6c7bae20, 0x28d3d: 0x6cbf6620, 0x28d3e: 0x6c8b2c20, 0x28d3f: 0x6c405e20, + // Block 0xa35, offset 0x28d40 + 0x28d4a: 0x6d074420, + 0x28d56: 0x6c8c6e20, + 0x28d58: 0x6ca88420, 0x28d5a: 0x6caf9c20, + 0x28d5c: 0x6c406e20, 0x28d5d: 0x6c10c620, 0x28d5e: 0x6d18e020, + 0x28d61: 0x6c0f8620, 0x28d63: 0x6c358420, + 0x28d69: 0x6d30a620, 0x28d6b: 0x6c86b820, + 0x28d6e: 0x6ce92620, 0x28d6f: 0x6c26cc20, + 0x28d71: 0x6c931620, 0x28d72: 0x6d0c4020, 0x28d73: 0x6c301e20, + 0x28d74: 0x6cbcfc20, 0x28d75: 0x6ced5c20, 0x28d76: 0x6ca03c20, 0x28d77: 0x6d418020, + 0x28d78: 0x6c408420, 0x28d79: 0x6cc15620, 0x28d7a: 0x6c078e20, 0x28d7b: 0x6c02b420, + 0x28d7c: 0x6cbaf620, + // Block 0xa36, offset 0x28d80 + 0x28d81: 0x6cc44020, + 0x28d88: 0x6cc41020, 0x28d89: 0x6c576a20, 0x28d8a: 0x6cfd2a20, 0x28d8b: 0x6c7dd820, + 0x28d8f: 0x6c258220, + 0x28d92: 0x6d158820, + 0x28d96: 0x6c1ae420, 0x28d97: 0x6d404020, + 0x28d98: 0x6ca52420, 0x28d99: 0x6c1a5820, 0x28d9a: 0x6c32a820, 0x28d9b: 0x6d1e0620, + 0x28d9c: 0x6d30e020, 0x28d9e: 0x6ce0b020, 0x28d9f: 0x6d0ff020, + 0x28da0: 0x6d011e20, 0x28da1: 0x6d07ec20, 0x28da3: 0x6c32e420, + 0x28da4: 0x6cd64c20, 0x28da5: 0x6cfbbe20, 0x28da6: 0x6cfbc020, + 0x28da9: 0x6c359e20, + 0x28db2: 0x6c7e5420, + 0x28db8: 0x6cf10220, 0x28db9: 0x6d1ec820, 0x28dba: 0x6d21e020, + 0x28dbd: 0x6ce30420, 0x28dbf: 0x6c6c7220, + // Block 0xa37, offset 0x28dc0 + 0x28dc1: 0x6ce16420, 0x28dc2: 0x6cb69e20, + 0x28dc4: 0x6c2cec20, 0x28dc5: 0x6ce1fe20, 0x28dc6: 0x6c941820, 0x28dc7: 0x6d2e9a20, + 0x28dc8: 0x6cf17020, 0x28dc9: 0x6c62d620, 0x28dca: 0x6c023820, 0x28dcb: 0x6cabaa20, + 0x28dcc: 0x6cb88420, + 0x28dd0: 0x6cd21220, 0x28dd1: 0x6cde2420, + 0x28dd4: 0x6ca18e20, + 0x28dd8: 0x6d1f9220, + 0x28de0: 0x6d2c6a20, 0x28de3: 0x6d117220, + 0x28deb: 0x6c1cfa20, + 0x28dec: 0x6c84b220, 0x28ded: 0x6d21f420, 0x28dee: 0x6c161420, 0x28def: 0x6d143620, + 0x28df2: 0x6c1c9420, + 0x28df4: 0x6c84b420, + 0x28dfd: 0x6ce90a20, 0x28dff: 0x6d40fe20, + // Block 0xa38, offset 0x28e00 + 0x28e02: 0x6cfbd620, + 0x28e07: 0x6cf93620, + 0x28e09: 0x6c0d0c20, 0x28e0a: 0x6c4e4a20, 0x28e0b: 0x6cb6b020, + 0x28e0c: 0x6cca7a20, 0x28e0e: 0x6c3a2c20, + 0x28e10: 0x6ccdea20, + 0x28e18: 0x6c584820, + 0x28e20: 0x6c059a20, 0x28e21: 0x6d220220, 0x28e22: 0x6d220420, + 0x28e24: 0x6c610420, + 0x28e31: 0x6c7b0620, 0x28e32: 0x6d3fe420, + 0x28e39: 0x6cfd5420, 0x28e3a: 0x6c9bc020, + // Block 0xa39, offset 0x28e40 + 0x28e43: 0x6c87b820, + 0x28e44: 0x6d377820, 0x28e45: 0x6c38fc20, 0x28e46: 0x6c8b8820, 0x28e47: 0x6c115620, + 0x28e48: 0x6c320a20, 0x28e49: 0x6c4a0020, 0x28e4a: 0x6d04b020, 0x28e4b: 0x6c84ea20, + 0x28e4c: 0x6cb80c20, 0x28e4f: 0x6c753420, + 0x28e50: 0x6ceade20, 0x28e52: 0x6c72d220, 0x28e53: 0x6cff6420, + 0x28e58: 0x6cc23420, + 0x28e5c: 0x6d3bba20, + 0x28e61: 0x6c754420, + 0x28e66: 0x6c6bbc20, + 0x28e68: 0x6d390620, 0x28e69: 0x6cfc8820, 0x28e6a: 0x6c8f7020, 0x28e6b: 0x6d100420, + 0x28e6c: 0x6cc4b220, 0x28e6d: 0x6d16d620, 0x28e6e: 0x6c8ae020, 0x28e6f: 0x6c0e5620, + 0x28e70: 0x6c5ce220, 0x28e71: 0x6c61be20, 0x28e72: 0x6c306a20, 0x28e73: 0x6d386420, + 0x28e74: 0x6cc29220, 0x28e75: 0x6c6a9c20, + 0x28e7a: 0x6c710820, + 0x28e7c: 0x6c078620, 0x28e7f: 0x6c087620, + // Block 0xa3a, offset 0x28e80 + 0x28e80: 0x6c43fe20, 0x28e81: 0x6c217c20, 0x28e83: 0x6cb9a220, + 0x28e84: 0x6cd9c820, 0x28e85: 0x6cf0a020, 0x28e86: 0x6c1a1420, 0x28e87: 0x6c909020, + 0x28e88: 0x6d213e20, 0x28e89: 0x6c7e4620, 0x28e8a: 0x6cb9a420, 0x28e8b: 0x6c2cd220, + 0x28e8c: 0x6cde0e20, 0x28e8d: 0x6d2e6c20, 0x28e8f: 0x6c38b620, + 0x28e90: 0x6c8b5620, 0x28e91: 0x6ce64420, 0x28e92: 0x6c5ebe20, 0x28e93: 0x6cb8de20, + 0x28e94: 0x6c556820, 0x28e97: 0x6d214220, + 0x28e98: 0x6cb79c20, 0x28e99: 0x6d214420, 0x28e9a: 0x6cebe020, + 0x28e9c: 0x6c03bc20, 0x28e9d: 0x6cb61020, 0x28e9e: 0x6cc95620, 0x28e9f: 0x6cbb8620, + 0x28ea0: 0x6d0bc220, 0x28ea1: 0x6cfc1e20, + 0x28ea8: 0x6c220820, 0x28ea9: 0x6c396220, 0x28eab: 0x6c7dba20, + 0x28eac: 0x6c4be020, 0x28ead: 0x6cc39220, 0x28eae: 0x6c367a20, 0x28eaf: 0x6cbf4e20, + 0x28eb2: 0x6c96d420, 0x28eb3: 0x6c7a5820, + 0x28eb4: 0x6d11c620, 0x28eb7: 0x6cc39420, + 0x28eb8: 0x6c1e6420, 0x28eb9: 0x6c642c20, 0x28ebb: 0x6d3a7a20, + 0x28ebd: 0x6c331220, 0x28ebe: 0x6cec0a20, + // Block 0xa3b, offset 0x28ec0 + 0x28ec0: 0x6ca51220, + 0x28ec4: 0x6d0cce20, 0x28ec5: 0x6ce78020, + 0x28ecb: 0x6d03fe20, + 0x28ecc: 0x6c4bee20, 0x28ecd: 0x6cb26a20, + 0x28ed1: 0x6d229c20, 0x28ed2: 0x6c51ec20, + 0x28ed4: 0x6d3da420, 0x28ed7: 0x6ccf0020, + 0x28ed8: 0x6d22a220, 0x28edb: 0x6c62a620, + 0x28edd: 0x6cbaea20, 0x28ede: 0x6cd73220, 0x28edf: 0x6c21de20, + 0x28ee0: 0x6d40e820, 0x28ee1: 0x6c838e20, 0x28ee2: 0x6ca60e20, + 0x28ee4: 0x6cebf820, 0x28ee5: 0x6d2c5c20, 0x28ee7: 0x6c28d420, + 0x28eee: 0x6c328820, 0x28eef: 0x6c0bd020, + 0x28ef0: 0x6c6a3e20, 0x28ef1: 0x6cb87c20, 0x28ef2: 0x6c519020, 0x28ef3: 0x6c1d5e20, + 0x28ef4: 0x6d0ce620, 0x28ef6: 0x6d0ee020, + 0x28efa: 0x6cd94e20, 0x28efb: 0x6ce2c420, + 0x28efc: 0x6d11e020, 0x28efe: 0x6c779620, + // Block 0xa3c, offset 0x28f00 + 0x28f00: 0x6d3c6e20, 0x28f01: 0x6c4b9a20, 0x28f02: 0x6c005a20, 0x28f03: 0x6c4d8420, + 0x28f08: 0x6cddb820, 0x28f09: 0x6d076020, 0x28f0a: 0x6c0c5020, + 0x28f0c: 0x6c3cfc20, 0x28f0d: 0x6cc15e20, 0x28f0e: 0x6c98ae20, + 0x28f10: 0x6c4ca020, + 0x28f16: 0x6c0ac420, 0x28f17: 0x6c751020, + 0x28f18: 0x6c208a20, 0x28f1b: 0x6cb47420, + 0x28f1f: 0x6d195020, + 0x28f22: 0x6cb95020, 0x28f23: 0x6d196220, + 0x28f24: 0x6c36ec20, 0x28f25: 0x6c8da620, 0x28f27: 0x6c0ace20, + 0x28f2d: 0x6c5e5620, 0x28f2e: 0x6ca0b620, + 0x28f31: 0x6d09ce20, + 0x28f34: 0x6d0f1e20, + 0x28f38: 0x6c87ba20, 0x28f3a: 0x6ce04e20, + 0x28f3e: 0x6c947e20, + // Block 0xa3d, offset 0x28f40 + 0x28f40: 0x6c769020, 0x28f41: 0x6c99aa20, 0x28f42: 0x6cfefc20, + 0x28f47: 0x6c007220, + 0x28f4a: 0x6cde1420, + 0x28f4d: 0x6c9aac20, 0x28f4f: 0x6c4c4220, + 0x28f53: 0x6c432220, + 0x28f54: 0x6ca4c220, 0x28f55: 0x6c4ffc20, + 0x28f60: 0x6cc39820, + 0x28f65: 0x6c12a620, 0x28f66: 0x6ccb0a20, + 0x28f6b: 0x6cb03c20, + 0x28f72: 0x6d006220, 0x28f73: 0x6cff6620, + 0x28f74: 0x6c712c20, + 0x28f79: 0x6c1a2420, 0x28f7a: 0x6ca50820, + // Block 0xa3e, offset 0x28f80 + 0x28f80: 0x6ca58e20, + 0x28f8d: 0x6ca25220, 0x28f8f: 0x6cce8020, + 0x28f91: 0x6c2cda20, + 0x28f94: 0x6c8d5220, 0x28f96: 0x6d31f820, 0x28f97: 0x6d11d020, + 0x28f99: 0x6c404a20, 0x28f9a: 0x6cb9c620, 0x28f9b: 0x6cbf5820, + 0x28f9c: 0x6c715620, 0x28f9d: 0x6c0e2c20, 0x28f9e: 0x6c990620, 0x28f9f: 0x6d2ce020, + 0x28fa0: 0x6cdf0820, + 0x28fa4: 0x6c1ce020, + 0x28fab: 0x6d2d3220, + 0x28fad: 0x6cd1f420, 0x28fae: 0x6d1e7c20, + 0x28fb0: 0x6cbf6820, 0x28fb1: 0x6c2a3820, 0x28fb2: 0x6ce42620, 0x28fb3: 0x6d3c7820, + 0x28fb5: 0x6d1b8020, 0x28fb7: 0x6ca51820, + 0x28fb8: 0x6c0e9620, 0x28fb9: 0x6c7bb220, 0x28fba: 0x6d355220, 0x28fbb: 0x6c34ba20, + 0x28fbc: 0x6c236220, 0x28fbd: 0x6c061620, + // Block 0xa3f, offset 0x28fc0 + 0x28fc7: 0x6c846820, + 0x28fca: 0x6c716c20, 0x28fcb: 0x6cf1bc20, + 0x28fcc: 0x6c8b3e20, 0x28fcf: 0x6cf2c620, + 0x28fd0: 0x6cd2de20, 0x28fd1: 0x6ca7b620, 0x28fd2: 0x6c987c20, 0x28fd3: 0x6c6f8c20, + 0x28fd8: 0x6d050020, + 0x28fdd: 0x6cf2a420, 0x28fdf: 0x6c2a4020, + 0x28fe1: 0x6cf70e20, 0x28fe2: 0x6c01e020, 0x28fe3: 0x6c26ce20, + 0x28fe4: 0x6d401020, 0x28fe5: 0x6c4f2a20, 0x28fe6: 0x6c20ea20, 0x28fe7: 0x6c089820, + 0x28fe9: 0x6c309020, 0x28feb: 0x6d2f1220, + 0x28fef: 0x6d0b0220, + 0x28ff2: 0x6c2bac20, 0x28ff3: 0x6c5d6420, + 0x28ff7: 0x6c9f8020, + 0x28ffa: 0x6c408820, + 0x28ffc: 0x6c061e20, 0x28ffd: 0x6c78e420, 0x28ffe: 0x6c991020, 0x28fff: 0x6cc55820, + // Block 0xa40, offset 0x29000 + 0x29000: 0x6d3fda20, 0x29001: 0x6cb88020, 0x29002: 0x6cf98020, 0x29003: 0x6cda0220, + 0x29004: 0x6d050e20, 0x29005: 0x6ca36e20, + 0x29009: 0x6c979620, + 0x2900e: 0x6d2c0820, 0x2900f: 0x6c154a20, + 0x29010: 0x6ccf8420, 0x29011: 0x6cf2ca20, + 0x29016: 0x6c005c20, 0x29017: 0x6c059820, + 0x29018: 0x6c4fb820, 0x2901a: 0x6ccad420, 0x2901b: 0x6cddba20, + 0x2901c: 0x6ce44020, 0x2901d: 0x6d0bcc20, 0x2901f: 0x6c0e3a20, + 0x29020: 0x6cc6e420, + 0x2902b: 0x6ccc2c20, + 0x2902c: 0x6cf26a20, 0x2902f: 0x6c028a20, + 0x29031: 0x6d3c2820, 0x29033: 0x6cb1c020, + 0x29034: 0x6cdbe820, 0x29035: 0x6d143820, 0x29036: 0x6cda0420, 0x29037: 0x6c30d220, + 0x29038: 0x6cda0620, 0x29039: 0x6c956e20, + // Block 0xa41, offset 0x29040 + 0x29043: 0x6c3afc20, + 0x29044: 0x6d422220, 0x29046: 0x6ca53c20, 0x29047: 0x6c2ac420, + 0x29048: 0x6d34c220, 0x29049: 0x6c25d020, 0x2904a: 0x6c8a5820, 0x2904b: 0x6c616420, + 0x2904c: 0x6c0ea020, 0x2904d: 0x6c23d020, 0x2904e: 0x6c1a6020, 0x2904f: 0x6c104e20, + 0x29051: 0x6cca1020, 0x29052: 0x6d29be20, + 0x29058: 0x6c69e420, 0x2905b: 0x6d125220, + 0x2905c: 0x6c920620, 0x2905e: 0x6c121420, + 0x29068: 0x6ca67020, + 0x29070: 0x6c6b8820, 0x29071: 0x6cb47c20, 0x29072: 0x6d3c5020, 0x29073: 0x6d29c820, + 0x2907a: 0x6c87c420, + 0x2907d: 0x6c7ed020, + // Block 0xa42, offset 0x29080 + 0x29080: 0x6c1d0620, 0x29083: 0x6d2eae20, + 0x2908d: 0x6c0bb420, 0x2908e: 0x6cf23220, + 0x29093: 0x6c53de20, + 0x29097: 0x6cb1fc20, + 0x29099: 0x6ccb9e20, + 0x2909e: 0x6ca67220, 0x2909f: 0x6c3b4e20, + 0x290a0: 0x6d065620, 0x290a2: 0x6cd2da20, + 0x290a4: 0x6c72c220, + 0x290a8: 0x6c752420, 0x290aa: 0x6d24a220, + 0x290ac: 0x6c4c2a20, 0x290ad: 0x6c4c3420, 0x290af: 0x6c55a420, + 0x290b2: 0x6c869020, 0x290b3: 0x6d00fa20, + 0x290b4: 0x6c376c20, 0x290b5: 0x6d25b420, 0x290b6: 0x6c4d2e20, + 0x290b9: 0x6c6ebc20, 0x290bb: 0x6c78de20, + 0x290bd: 0x6d3fcc20, 0x290be: 0x6c3ae620, + // Block 0xa43, offset 0x290c0 + 0x290c0: 0x6cae8820, 0x290c1: 0x6c44e220, 0x290c3: 0x6c652820, + 0x290c4: 0x6ca61220, 0x290c6: 0x6cfbc220, 0x290c7: 0x6c873c20, + 0x290c8: 0x6c17a820, 0x290ca: 0x6c377620, 0x290cb: 0x6c44e820, + 0x290cc: 0x6d247620, 0x290cd: 0x6c560420, 0x290ce: 0x6c3af820, 0x290cf: 0x6c028c20, + 0x290d3: 0x6c37b220, + 0x290d8: 0x6c78ec20, 0x290d9: 0x6c7ab620, 0x290da: 0x6c0fd020, + 0x290dd: 0x6d13a020, 0x290de: 0x6c69e820, + 0x290e6: 0x6c17ae20, 0x290e7: 0x6c44ec20, + 0x290e8: 0x6cc82e20, 0x290ea: 0x6d273c20, + 0x290ec: 0x6c8c1620, + 0x290f1: 0x6d24a620, 0x290f2: 0x6d274820, 0x290f3: 0x6d2d1220, + 0x290f4: 0x6cff6820, 0x290f7: 0x6c9f2420, + 0x290fb: 0x6c4af820, + 0x290fc: 0x6c6f6e20, 0x290fe: 0x6cebaa20, + // Block 0xa44, offset 0x29100 + 0x29101: 0x6cf78220, 0x29102: 0x6cefd620, 0x29103: 0x6d3d6a20, + 0x29104: 0x6cf0a220, 0x29105: 0x6c7c8420, + 0x29108: 0x6c9a9820, 0x2910a: 0x6c505020, 0x2910b: 0x6c4f5020, + 0x2910c: 0x6c399a20, 0x2910d: 0x6ca96e20, 0x2910e: 0x6d205420, 0x2910f: 0x6c57a420, + 0x29112: 0x6c812420, + 0x29120: 0x6d3a1820, 0x29121: 0x6c4b1620, 0x29122: 0x6c0a1620, 0x29123: 0x6c642e20, + 0x29124: 0x6ce59c20, 0x29126: 0x6c93f020, 0x29127: 0x6c79a220, + 0x29128: 0x6d419420, 0x29129: 0x6c8d4620, 0x2912a: 0x6cb63220, + 0x2912c: 0x6d3a1e20, + 0x29131: 0x6c47ba20, 0x29132: 0x6d413020, + 0x29134: 0x6d0f6620, 0x29135: 0x6cda5620, 0x29137: 0x6c7c9620, + 0x29139: 0x6c167a20, 0x2913b: 0x6d113e20, + 0x2913e: 0x6d23e220, + // Block 0xa45, offset 0x29140 + 0x29145: 0x6cd50420, 0x29146: 0x6c7f5420, 0x29147: 0x6d187620, + 0x29148: 0x6c30c420, + 0x2914c: 0x6cf3f020, 0x2914d: 0x6d1d1220, 0x2914e: 0x6c3f0420, 0x2914f: 0x6d3be820, + 0x29150: 0x6c3f8a20, 0x29152: 0x6cdb2a20, 0x29153: 0x6c853420, + 0x29154: 0x6d122820, 0x29155: 0x6cea1020, + 0x2915d: 0x6c4b7a20, + 0x29161: 0x6c940020, 0x29162: 0x6d0ed420, 0x29163: 0x6cb66620, + 0x29164: 0x6c813020, 0x29165: 0x6d3a3020, 0x29167: 0x6c4b1e20, + 0x29168: 0x6c551020, + 0x2916f: 0x6c6ddc20, + 0x29172: 0x6c1bc620, + 0x29175: 0x6c717220, 0x29176: 0x6d2c6020, + 0x29178: 0x6c9e8020, + // Block 0xa46, offset 0x29180 + 0x29180: 0x6d39da20, 0x29181: 0x6c41ba20, 0x29182: 0x6d047620, 0x29183: 0x6c60e620, + 0x29187: 0x6cccaa20, + 0x29188: 0x6c9ab620, 0x29189: 0x6d287420, + 0x2918d: 0x6cd48820, + 0x29190: 0x6c941a20, 0x29191: 0x6d206020, 0x29192: 0x6c681420, 0x29193: 0x6caacc20, + 0x29198: 0x6c72c420, 0x29199: 0x6d206220, + 0x2919c: 0x6d195220, 0x2919d: 0x6ce2ce20, 0x2919e: 0x6cef7220, 0x2919f: 0x6c17f620, + 0x291a0: 0x6c8c8620, 0x291a1: 0x6c483020, 0x291a3: 0x6c875a20, + 0x291a4: 0x6c8ab020, 0x291a7: 0x6c68ac20, + 0x291a8: 0x6d0ff620, 0x291a9: 0x6c0c5e20, 0x291aa: 0x6cb6a220, + 0x291ae: 0x6d196420, + 0x291b1: 0x6c0d7620, 0x291b2: 0x6c9bbc20, 0x291b3: 0x6c145a20, + 0x291b5: 0x6c41be20, + 0x291b9: 0x6cc21c20, 0x291ba: 0x6c2bc020, 0x291bb: 0x6c82a020, + // Block 0xa47, offset 0x291c0 + 0x291c0: 0x6c8dcc20, + 0x291c4: 0x6c585220, 0x291c5: 0x6cc23220, 0x291c7: 0x6c959c20, + 0x291c9: 0x6c7cc820, + 0x291cd: 0x6cc08020, 0x291ce: 0x6d227620, 0x291cf: 0x6c57a620, + 0x291d3: 0x6c833a20, + 0x291d5: 0x6cc60620, 0x291d6: 0x6cffb620, 0x291d7: 0x6cd8da20, + 0x291da: 0x6c327220, 0x291db: 0x6c0cb420, + 0x291e0: 0x6ca97020, 0x291e2: 0x6c51e020, 0x291e3: 0x6cadc420, + 0x291e5: 0x6c3acc20, 0x291e6: 0x6ca2aa20, + 0x291e9: 0x6c3d9620, + 0x291ec: 0x6c55a820, 0x291ed: 0x6cedec20, 0x291ee: 0x6ccc1420, + 0x291f0: 0x6c687420, 0x291f1: 0x6cf47420, + 0x291f9: 0x6c404c20, + // Block 0xa48, offset 0x29200 + 0x29201: 0x6c0df620, 0x29202: 0x6d3b3020, + 0x29204: 0x6d3a2a20, 0x29205: 0x6c1ada20, 0x29207: 0x6cd07c20, + 0x29208: 0x6c550820, 0x29209: 0x6c101e20, + 0x2920e: 0x6cc4d420, + 0x29216: 0x6ca2b620, + 0x29218: 0x6c869220, 0x2921b: 0x6c638820, + 0x2921e: 0x6c96e020, + 0x29221: 0x6c9b6820, 0x29222: 0x6ca1f020, 0x29223: 0x6d38b820, + 0x29224: 0x6cfc3820, 0x29225: 0x6c5b7420, 0x29226: 0x6c48fc20, 0x29227: 0x6c702c20, + 0x29229: 0x6ca2b820, 0x2922b: 0x6cc82a20, + 0x2922d: 0x6cf3fc20, 0x2922f: 0x6cc7d820, + 0x29231: 0x6d2ce620, + // Block 0xa49, offset 0x29240 + 0x29241: 0x6caae220, 0x29242: 0x6d010a20, + 0x29244: 0x6c680220, + 0x2924b: 0x6c853a20, + 0x2924c: 0x6cd51020, 0x2924d: 0x6d190020, 0x2924e: 0x6c2bae20, 0x2924f: 0x6cbe9220, + 0x29250: 0x6c717420, 0x29253: 0x6d373620, + 0x29255: 0x6c80f020, 0x29256: 0x6c10ca20, 0x29257: 0x6c7bca20, + 0x29258: 0x6d190220, 0x2925a: 0x6c0f9a20, + 0x29267: 0x6c1c8c20, + 0x2926d: 0x6c680c20, 0x2926f: 0x6cf32a20, + 0x29270: 0x6d0aac20, + 0x29275: 0x6cea3220, 0x29276: 0x6c987e20, + 0x29278: 0x6c39b220, 0x29279: 0x6d3dce20, 0x2927b: 0x6cb88220, + 0x2927d: 0x6cde2220, 0x2927e: 0x6cb68a20, + // Block 0xa4a, offset 0x29280 + 0x29280: 0x6caf1e20, 0x29281: 0x6c0cc620, 0x29282: 0x6c3bfe20, 0x29283: 0x6ce92820, + 0x29284: 0x6c57d220, 0x29287: 0x6c36d220, + 0x2928b: 0x6c36d420, + 0x2928e: 0x6c2fc420, + 0x29290: 0x6cc7e220, + 0x29296: 0x6c36d620, + 0x2929e: 0x6d0ef020, 0x2929f: 0x6cd8f820, + 0x292a5: 0x6d1cc020, 0x292a6: 0x6ca61620, 0x292a7: 0x6ca61820, + 0x292a8: 0x6d158e20, + 0x292b9: 0x6c9c9820, + 0x292be: 0x6d129820, 0x292bf: 0x6cb32620, + // Block 0xa4b, offset 0x292c0 + 0x292c0: 0x6c240420, 0x292c2: 0x6cf11820, + 0x292c4: 0x6c4d8820, 0x292c5: 0x6d1c2820, 0x292c7: 0x6ce6a020, + 0x292c8: 0x6d375e20, 0x292c9: 0x6c3a2a20, 0x292ca: 0x6d1f9420, + 0x292cd: 0x6c7cb020, 0x292ce: 0x6c01e220, 0x292cf: 0x6c03d220, + 0x292d1: 0x6c4f3420, + 0x292de: 0x6ca41620, 0x292df: 0x6ca3da20, + 0x292e2: 0x6c6df420, + 0x292e5: 0x6ceece20, + 0x292f1: 0x6c1f8e20, 0x292f3: 0x6cddbe20, + 0x292f4: 0x6ce20020, 0x292f5: 0x6cb6a620, 0x292f6: 0x6ce16620, 0x292f7: 0x6cf05a20, + 0x292f8: 0x6c41fc20, 0x292fa: 0x6c446420, + 0x292fc: 0x6c4f3820, 0x292fe: 0x6ca37420, 0x292ff: 0x6c446620, + // Block 0xa4c, offset 0x29300 + 0x29304: 0x6d331420, + 0x29317: 0x6cde2820, + 0x2931b: 0x6cd84c20, + 0x2931d: 0x6ca6de20, 0x2931e: 0x6cca9820, + 0x2932b: 0x6d012a20, + 0x2932f: 0x6d410220, + 0x29330: 0x6d21fc20, 0x29331: 0x6ca6e020, 0x29332: 0x6cb55420, + 0x29335: 0x6cd03220, + 0x2933c: 0x6c102020, + // Block 0xa4d, offset 0x29340 + 0x2934b: 0x6c7d9a20, + 0x2934c: 0x6c84c420, 0x2934e: 0x6c488220, + 0x29356: 0x6d0e1c20, 0x29357: 0x6c10d220, + 0x29358: 0x6c672a20, 0x2935a: 0x6cf40e20, 0x2935b: 0x6c134420, + 0x2935c: 0x6c8c0e20, 0x2935d: 0x6d3c0420, 0x2935f: 0x6c5b0e20, + 0x29361: 0x6ce7a620, 0x29362: 0x6d2ca220, + 0x29364: 0x6c522c20, 0x29367: 0x6c4ce220, + 0x29371: 0x6c6e4220, + 0x29375: 0x6c2f1620, 0x29377: 0x6d1cdc20, + 0x2937c: 0x6d377420, + // Block 0xa4e, offset 0x29380 + 0x29382: 0x6cf06620, + 0x29384: 0x6c62fa20, 0x29385: 0x6cc73620, + 0x29388: 0x6c030620, 0x29389: 0x6c292420, 0x2938a: 0x6c958a20, 0x2938b: 0x6d13a220, + 0x2938c: 0x6ceed220, + 0x29392: 0x6cbb3220, + 0x29399: 0x6c446c20, 0x2939a: 0x6c62fc20, + 0x293a6: 0x6d409620, + 0x293a8: 0x6d15a620, 0x293ab: 0x6d2ca420, + 0x293ad: 0x6c8b8c20, + 0x293b4: 0x6d13a820, + 0x293bc: 0x6d2dd420, + // Block 0xa4f, offset 0x293c0 + 0x293c0: 0x6c1e1620, 0x293c1: 0x6c0c6620, + 0x293c6: 0x6d077020, 0x293c7: 0x6d1eda20, + 0x293cd: 0x6d029a20, 0x293ce: 0x6cef7c20, 0x293cf: 0x6c87ca20, + 0x293db: 0x6c0fdc20, + 0x293dc: 0x6c664c20, 0x293dd: 0x6c158220, 0x293de: 0x6c7d9e20, + 0x293e1: 0x6cbe9a20, + 0x293e7: 0x6cd6ce20, + 0x293e8: 0x6cf76420, 0x293e9: 0x6cc23620, + 0x293f0: 0x6c95a020, 0x293f3: 0x6c294c20, + 0x293f4: 0x6ca71020, 0x293f5: 0x6c855a20, 0x293f7: 0x6c03e420, + 0x293f9: 0x6c365220, 0x293fa: 0x6c3d7a20, 0x293fb: 0x6c400620, + 0x293fc: 0x6c5d1220, 0x293fd: 0x6d2cd820, 0x293fe: 0x6c014420, + // Block 0xa50, offset 0x29400 + 0x29401: 0x6cc09620, 0x29402: 0x6c1dd620, 0x29403: 0x6c9e3c20, + 0x29404: 0x6d0aa620, 0x29405: 0x6ce92420, 0x29406: 0x6ca60c20, 0x29407: 0x6c570220, + 0x29408: 0x6cd50a20, 0x2940a: 0x6d05f620, 0x2940b: 0x6d384620, + 0x2940c: 0x6c776220, + 0x29412: 0x6cfee220, 0x29413: 0x6cfee420, + 0x29414: 0x6c22d420, 0x29415: 0x6c1c3c20, 0x29417: 0x6c2dd220, + 0x29418: 0x6d181420, 0x2941a: 0x6c2f6420, + 0x2941d: 0x6c4ef620, 0x2941e: 0x6cece420, + 0x29420: 0x6d160220, 0x29421: 0x6c066020, 0x29422: 0x6d184220, + 0x29427: 0x6d0a9e20, + 0x2942c: 0x6cfdd420, + 0x29433: 0x6c08a420, + 0x29436: 0x6c6b3020, 0x29437: 0x6c43a620, + 0x29438: 0x6d2b5620, 0x2943a: 0x6d326a20, 0x2943b: 0x6c55aa20, + 0x2943c: 0x6cf6b420, 0x2943d: 0x6d02e820, 0x2943e: 0x6cff1220, 0x2943f: 0x6c404e20, + // Block 0xa51, offset 0x29440 + 0x29440: 0x6d383c20, 0x29442: 0x6c99b620, 0x29443: 0x6d02ea20, + 0x29444: 0x6cbad820, + 0x29448: 0x6c3b9220, 0x29449: 0x6c049820, 0x2944a: 0x6c583220, + 0x29451: 0x6c687620, 0x29453: 0x6c066620, + 0x29454: 0x6d0af820, 0x29455: 0x6d114020, + 0x2945b: 0x6cf8d820, + 0x2945d: 0x6c729e20, 0x2945f: 0x6cc27c20, + 0x29460: 0x6d26f020, 0x29461: 0x6cdf4220, 0x29462: 0x6ce81820, 0x29463: 0x6ca16c20, + 0x29464: 0x6d2c5420, 0x29465: 0x6cc1ce20, 0x29467: 0x6c3da620, + 0x29469: 0x6cc1d020, 0x2946a: 0x6c1c7e20, + 0x2946c: 0x6d1f7c20, + 0x29477: 0x6ce38620, + 0x2947a: 0x6cebf020, + 0x2947d: 0x6ceb5620, 0x2947f: 0x6c1eb220, + // Block 0xa52, offset 0x29480 + 0x29481: 0x6c43b020, + 0x29488: 0x6d251620, 0x29489: 0x6c43b220, 0x2948a: 0x6cc1d220, + 0x2948f: 0x6c72a020, + 0x29492: 0x6c2ef820, 0x29493: 0x6d157e20, + 0x29494: 0x6cd20820, 0x29495: 0x6d18e420, 0x29497: 0x6c4b2020, + 0x29498: 0x6c680420, 0x2949a: 0x6cd94420, 0x2949b: 0x6cbf7220, + 0x2949d: 0x6c36c220, 0x2949e: 0x6c59a420, 0x2949f: 0x6c5b4620, + 0x294a0: 0x6d0a4620, 0x294a3: 0x6c717020, + 0x294a5: 0x6d2d2220, 0x294a6: 0x6c1c8220, 0x294a7: 0x6c81c020, + 0x294a9: 0x6cb66820, 0x294aa: 0x6d050420, + 0x294ac: 0x6c5af620, 0x294ad: 0x6ce79820, + 0x294ba: 0x6c407220, + 0x294bd: 0x6d0a4820, 0x294be: 0x6c6b4e20, 0x294bf: 0x6c9d0620, + // Block 0xa53, offset 0x294c0 + 0x294c0: 0x6d242820, + 0x294c8: 0x6d3c4a20, 0x294c9: 0x6c688e20, 0x294ca: 0x6d373820, 0x294cb: 0x6c1a5220, + 0x294cd: 0x6c6b6c20, 0x294ce: 0x6cff3220, 0x294cf: 0x6c18f220, + 0x294d0: 0x6c848220, 0x294d1: 0x6d26fe20, 0x294d3: 0x6d373a20, + 0x294d4: 0x6c818820, 0x294d5: 0x6cf32c20, 0x294d6: 0x6cc1ea20, + 0x294d8: 0x6cedce20, 0x294da: 0x6d142e20, 0x294db: 0x6d190420, + 0x294dc: 0x6c80f220, 0x294de: 0x6ce7fa20, 0x294df: 0x6c015c20, + 0x294e0: 0x6c74e420, 0x294e1: 0x6d0ee420, + 0x294e5: 0x6c72b020, 0x294e7: 0x6d327620, + 0x294e9: 0x6d373c20, 0x294ea: 0x6c98a820, + 0x294ee: 0x6d055420, + 0x294f1: 0x6c208020, 0x294f2: 0x6c1e6c20, + 0x294f8: 0x6cbafc20, 0x294f9: 0x6c3a2620, 0x294fa: 0x6c16d420, + 0x294fc: 0x6c9dec20, 0x294fd: 0x6cdb5a20, 0x294fe: 0x6c02b820, + // Block 0xa54, offset 0x29500 + 0x29500: 0x6c3f9620, + 0x29504: 0x6cf10620, 0x29505: 0x6d342420, 0x29506: 0x6c9f8220, 0x29507: 0x6c168820, + 0x29508: 0x6d0cfa20, 0x29509: 0x6d245820, 0x2950b: 0x6c408a20, + 0x2950c: 0x6cded020, 0x2950d: 0x6c616020, 0x2950f: 0x6c3aee20, + 0x29512: 0x6c55f620, 0x29513: 0x6c70e220, + 0x29515: 0x6d22ac20, + 0x2951b: 0x6cb69220, + 0x2951c: 0x6c9a3820, 0x2951f: 0x6c0ccc20, + 0x29520: 0x6c4cd820, + 0x29524: 0x6ca04c20, 0x29526: 0x6ced5e20, 0x29527: 0x6ced6020, + 0x29534: 0x6c6dec20, 0x29535: 0x6d245a20, 0x29536: 0x6cfbce20, + 0x29539: 0x6c212a20, 0x2953a: 0x6c60f820, + 0x2953c: 0x6cfd9620, 0x2953d: 0x6cae4420, 0x2953e: 0x6c409220, + // Block 0xa55, offset 0x29540 + 0x29542: 0x6c8ed820, + 0x29544: 0x6cc9da20, 0x29545: 0x6d08f020, 0x29546: 0x6d409220, + 0x29548: 0x6c6b7e20, 0x2954b: 0x6d2dc220, + 0x2954d: 0x6d21e820, 0x2954e: 0x6d21ea20, 0x2954f: 0x6c9a4020, + 0x29550: 0x6c9ea820, 0x29551: 0x6c99c020, 0x29552: 0x6c346a20, 0x29553: 0x6c409420, + 0x2955b: 0x6c671820, + 0x29566: 0x6c9e8420, + 0x29568: 0x6c023a20, + 0x2956d: 0x6c78e620, + 0x29576: 0x6c544420, + 0x2957a: 0x6c46e420, + 0x2957c: 0x6cf74c20, 0x2957e: 0x6cc6e820, 0x2957f: 0x6c43be20, + // Block 0xa56, offset 0x29580 + 0x29580: 0x6cac9220, 0x29581: 0x6d25d420, 0x29582: 0x6cfa5e20, + 0x29585: 0x6ccc2e20, 0x29586: 0x6cafa620, + 0x29588: 0x6cbe9620, 0x29589: 0x6d1dde20, 0x2958a: 0x6cc20220, + 0x2958c: 0x6c462820, 0x2958e: 0x6c446820, 0x2958f: 0x6cfb0820, + 0x29591: 0x6cdb6820, + 0x29595: 0x6c04ae20, 0x29596: 0x6cb6a820, 0x29597: 0x6c548820, + 0x2959b: 0x6cf74e20, + 0x2959d: 0x6cf39220, + 0x295ad: 0x6cb55620, 0x295ae: 0x6c56ec20, 0x295af: 0x6c4aae20, + 0x295b1: 0x6c2bbc20, 0x295b2: 0x6cce2c20, 0x295b3: 0x6c975220, + 0x295b4: 0x6c9fde20, 0x295b5: 0x6c62ea20, 0x295b6: 0x6cf7c820, 0x295b7: 0x6cfb1020, + 0x295b8: 0x6c610220, 0x295b9: 0x6c16d820, 0x295ba: 0x6c7a1220, 0x295bb: 0x6c1cfc20, + // Block 0xa57, offset 0x295c0 + 0x295c2: 0x6d2ef020, 0x295c3: 0x6cb1aa20, + 0x295c4: 0x6cdb6c20, 0x295c5: 0x6c94cc20, 0x295c6: 0x6c84c620, 0x295c7: 0x6c9c2020, + 0x295c8: 0x6c1cfe20, 0x295c9: 0x6ce47c20, 0x295cb: 0x6c8da820, + 0x295cd: 0x6c1c9a20, + 0x295d6: 0x6c1d0020, + 0x295d9: 0x6c1c9c20, + 0x295dd: 0x6ca7c820, 0x295df: 0x6d1e0a20, + 0x295ee: 0x6c9db020, + 0x295f0: 0x6cd51e20, 0x295f2: 0x6cf93820, + 0x295f4: 0x6c36f620, 0x295f5: 0x6d3ec820, + 0x295f8: 0x6c6b8420, 0x295f9: 0x6c5faa20, 0x295fa: 0x6c53e820, 0x295fb: 0x6cd18220, + 0x295fc: 0x6c879c20, 0x295fe: 0x6cb55c20, + // Block 0xa58, offset 0x29600 + 0x29600: 0x6d38c620, 0x29601: 0x6cd85820, 0x29602: 0x6cc21e20, + 0x2960b: 0x6d013420, + 0x29617: 0x6cd85a20, + 0x2961b: 0x6d061220, + 0x29620: 0x6c409e20, + 0x2962f: 0x6ca9e620, + 0x29630: 0x6d0bd020, 0x29631: 0x6c8ef020, 0x29632: 0x6c643420, 0x29633: 0x6c4ab020, + 0x29634: 0x6c7cc020, 0x29635: 0x6c1ca220, 0x29636: 0x6c121620, 0x29637: 0x6c1ed020, + 0x29639: 0x6c4c5020, 0x2963b: 0x6c285a20, + 0x2963f: 0x6c672e20, + // Block 0xa59, offset 0x29640 + 0x29641: 0x6c292620, 0x29642: 0x6c548c20, + 0x29644: 0x6c7a1420, 0x29646: 0x6c1f9220, 0x29647: 0x6cb96220, + 0x29648: 0x6c010c20, 0x2964a: 0x6cb0e420, + 0x29651: 0x6d0abc20, 0x29652: 0x6c6dfc20, 0x29653: 0x6c9c2620, + 0x29655: 0x6c0d7a20, 0x29656: 0x6c801620, 0x29657: 0x6c47fa20, + 0x29658: 0x6c1e1420, 0x2965b: 0x6d1dec20, + 0x2965c: 0x6c488420, 0x2965d: 0x6d220a20, 0x2965e: 0x6d397420, + 0x2966d: 0x6c115820, 0x2966f: 0x6c8ef420, + 0x29670: 0x6c105420, 0x29671: 0x6c965820, 0x29672: 0x6c6b8c20, 0x29673: 0x6d31a820, + 0x29674: 0x6c9f2220, 0x29675: 0x6c4a1620, 0x29677: 0x6c63f820, + 0x29679: 0x6c7ed220, + // Block 0xa5a, offset 0x29680 + 0x29680: 0x6cd48c20, 0x29683: 0x6c4c5220, + 0x29686: 0x6c9c2820, 0x29687: 0x6cb9ea20, + 0x29688: 0x6c7f8420, 0x2968a: 0x6c51b220, 0x2968b: 0x6ce97c20, + 0x29691: 0x6c5b1020, + 0x29698: 0x6c52e620, + 0x2969c: 0x6c93c820, 0x2969f: 0x6c63fa20, + 0x296a5: 0x6c4ab220, + 0x296a8: 0x6d144420, 0x296a9: 0x6c585420, + 0x296b0: 0x6c95a220, + 0x296b4: 0x6c754620, + 0x296b8: 0x6c49ce20, 0x296bb: 0x6cc34820, + 0x296bc: 0x6ca7cc20, 0x296bf: 0x6c97b220, + // Block 0xa5b, offset 0x296c0 + 0x296c2: 0x6d282420, 0x296c3: 0x6cf18a20, + 0x296c4: 0x6c1c0c20, 0x296c5: 0x6c1c1820, 0x296c6: 0x6d33dc20, + 0x296c8: 0x6c224420, 0x296c9: 0x6d3c3e20, 0x296ca: 0x6c573c20, 0x296cb: 0x6c6ac020, + 0x296cc: 0x6cc19e20, 0x296cd: 0x6ce86620, 0x296ce: 0x6c9f6a20, 0x296cf: 0x6c9a2020, + 0x296d0: 0x6d218020, 0x296d1: 0x6c026e20, 0x296d2: 0x6c049a20, + 0x296d4: 0x6caf8c20, 0x296d5: 0x6d31a420, 0x296d6: 0x6c91d020, 0x296d7: 0x6c1c5420, + 0x296d8: 0x6ce7f620, 0x296da: 0x6c6a3420, + 0x296dc: 0x6d2da420, + 0x296e2: 0x6c6c6820, 0x296e3: 0x6c91f020, + 0x296e6: 0x6c670a20, 0x296e7: 0x6ce0b420, + 0x296e8: 0x6c168a20, 0x296ea: 0x6c22ee20, + 0x296ed: 0x6cec5c20, 0x296ee: 0x6c240620, 0x296ef: 0x6c771a20, + 0x296f1: 0x6c0bd820, + 0x296f8: 0x6cf17620, 0x296fb: 0x6cb95620, + 0x296ff: 0x6c424220, + // Block 0xa5c, offset 0x29700 + 0x29702: 0x6c5ca220, + 0x29704: 0x6c420620, 0x29706: 0x6c630020, 0x29707: 0x6c424620, + 0x29709: 0x6c580820, + 0x2970d: 0x6cd8dc20, + 0x29710: 0x6c3d9a20, + 0x29715: 0x6cb01620, 0x29717: 0x6c10d620, + 0x2971c: 0x6c07c620, + 0x29722: 0x6cd2dc20, + 0x29725: 0x6c58b020, 0x29727: 0x6c4a9420, + 0x2972a: 0x6cab9620, + 0x29733: 0x6cad7020, + 0x29735: 0x6d1d2020, 0x29736: 0x6ce6e620, 0x29737: 0x6d001820, + 0x29739: 0x6d3b3620, 0x2973b: 0x6d21d220, + // Block 0xa5d, offset 0x29740 + 0x29741: 0x6c66fa20, + 0x29744: 0x6cc25420, 0x29745: 0x6ced6220, 0x29746: 0x6c7d9220, 0x29747: 0x6d3c7220, + 0x29749: 0x6d245c20, 0x2974a: 0x6c4cda20, 0x2974b: 0x6cb2de20, + 0x2974c: 0x6d41a420, 0x2974d: 0x6d40fa20, 0x2974f: 0x6d39e820, + 0x29750: 0x6caa9c20, 0x29751: 0x6d39ea20, + 0x29756: 0x6cb17620, 0x29757: 0x6c9cac20, + 0x2975c: 0x6c0ad220, 0x2975d: 0x6cdb6e20, + 0x29761: 0x6cb47a20, 0x29762: 0x6c9cc420, + 0x2976b: 0x6d13a620, + 0x2976c: 0x6d22b420, 0x2976e: 0x6d249620, + 0x29770: 0x6d3a9420, 0x29773: 0x6c8dc220, + 0x2977a: 0x6caa3620, + 0x2977e: 0x6c8d3020, + // Block 0xa5e, offset 0x29780 + 0x29780: 0x6c8a7020, 0x29782: 0x6ceace20, + 0x29784: 0x6c08f020, 0x29785: 0x6ca36a20, 0x29786: 0x6cc1bc20, + 0x29788: 0x6cb01820, 0x29789: 0x6c30f420, 0x2978a: 0x6ca86e20, 0x2978b: 0x6cea6820, + 0x2978d: 0x6c5f2620, 0x2978f: 0x6c8d5420, + 0x29793: 0x6c7aaa20, + 0x29794: 0x6cdb2c20, + 0x29798: 0x6ce81a20, + 0x2979e: 0x6ca38620, 0x2979f: 0x6d2b0c20, + 0x297a2: 0x6ce7c420, 0x297a3: 0x6c444a20, + 0x297a4: 0x6c331820, 0x297a7: 0x6c6b5020, + 0x297a9: 0x6ce4c820, 0x297aa: 0x6ce5e220, 0x297ab: 0x6c1b6020, + 0x297ac: 0x6cc14e20, 0x297ae: 0x6ccc2820, + 0x297b0: 0x6c0f9e20, 0x297b1: 0x6c848420, 0x297b3: 0x6c963a20, + 0x297b5: 0x6c8a4420, 0x297b6: 0x6cd62620, 0x297b7: 0x6c2ad220, + 0x297b9: 0x6c1ae620, 0x297ba: 0x6c9f0220, + 0x297bc: 0x6ce24e20, 0x297bd: 0x6c5d0c20, 0x297bf: 0x6ca7e220, + // Block 0xa5f, offset 0x297c0 + 0x297c1: 0x6c75fe20, 0x297c2: 0x6c56dc20, + 0x297c4: 0x6c932e20, 0x297c5: 0x6d138820, 0x297c7: 0x6ca18620, + 0x297c8: 0x6c17c820, + 0x297cc: 0x6cddd420, 0x297ce: 0x6c784220, 0x297cf: 0x6c409620, + 0x297d1: 0x6c17aa20, + 0x297d4: 0x6cddbc20, 0x297d7: 0x6cbfe220, + 0x297db: 0x6cdb6a20, + 0x297dd: 0x6d287620, 0x297df: 0x6cddc220, + 0x297e0: 0x6c7a7020, 0x297e1: 0x6c0fc420, 0x297e3: 0x6c90fe20, + 0x297e4: 0x6ca1a220, 0x297e6: 0x6c88e220, 0x297e7: 0x6d08d220, + 0x297e8: 0x6cddc420, 0x297e9: 0x6c97aa20, 0x297ea: 0x6c0ad420, + 0x297f2: 0x6ce44820, + 0x297f4: 0x6c88a620, 0x297f5: 0x6ce04a20, 0x297f6: 0x6ccdf220, + 0x297f8: 0x6cc22820, 0x297f9: 0x6c320820, 0x297fa: 0x6c58d420, 0x297fb: 0x6ccb0e20, + 0x297ff: 0x6c7c2620, + // Block 0xa60, offset 0x29800 + 0x29803: 0x6ca8dc20, + 0x29805: 0x6ca8de20, 0x29806: 0x6c95a420, 0x29807: 0x6d425c20, + 0x29808: 0x6d174e20, 0x29809: 0x6cfcc020, 0x2980a: 0x6c179820, 0x2980b: 0x6ce61220, + 0x29812: 0x6cd79620, + 0x29814: 0x6c9d0020, 0x29817: 0x6c9c7220, + 0x2981b: 0x6ced5220, + 0x2981d: 0x6c07c820, 0x2981e: 0x6cbae020, + 0x29820: 0x6ca0b020, 0x29823: 0x6c8eca20, + 0x29824: 0x6cf32e20, 0x29826: 0x6c9a7020, + 0x29828: 0x6ce7fe20, 0x2982b: 0x6ca25a20, + 0x2982d: 0x6c9a4420, + 0x29832: 0x6d42b620, + 0x29834: 0x6cea6420, 0x29835: 0x6c778c20, 0x29836: 0x6cea6a20, + 0x2983a: 0x6c184c20, 0x2983b: 0x6d336a20, + 0x2983d: 0x6c1cec20, 0x2983e: 0x6ce47820, + // Block 0xa61, offset 0x29840 + 0x29840: 0x6d372020, 0x29841: 0x6c153420, 0x29842: 0x6c153e20, + 0x29845: 0x6cbe5c20, 0x29846: 0x6cea3420, 0x29847: 0x6c5b7a20, + 0x29848: 0x6cc41420, 0x29849: 0x6d2dba20, 0x2984a: 0x6c652c20, 0x2984b: 0x6c154c20, + 0x2984d: 0x6c5a2620, 0x2984f: 0x6c5b0620, + 0x29850: 0x6c1b6a20, 0x29852: 0x6c5a2820, 0x29853: 0x6c528220, + 0x29854: 0x6d280820, 0x29856: 0x6ce94020, 0x29857: 0x6c0b1c20, + 0x29859: 0x6c5a3620, 0x2985a: 0x6d280a20, + 0x2985f: 0x6ca1a420, + 0x29860: 0x6c45c420, 0x29862: 0x6c45c620, + 0x29864: 0x6c4bb020, 0x29866: 0x6c157820, + 0x29868: 0x6cc42220, 0x29869: 0x6cc8ee20, 0x2986a: 0x6c7c2820, 0x2986b: 0x6cb1c220, + 0x2986e: 0x6cc80220, + 0x29872: 0x6ca9a220, 0x29873: 0x6c56c820, + 0x29874: 0x6c6cb820, 0x29875: 0x6ca6d220, 0x29876: 0x6c067420, + 0x29878: 0x6ca65620, 0x2987a: 0x6c0a8420, 0x2987b: 0x6c55d820, + 0x2987c: 0x6c846a20, 0x2987f: 0x6d39dc20, + // Block 0xa62, offset 0x29880 + 0x29880: 0x6ca2fc20, 0x29882: 0x6cc36620, 0x29883: 0x6c3cd220, + 0x29884: 0x6c090020, 0x29885: 0x6c84a020, 0x29886: 0x6c0d0820, 0x29887: 0x6ca70e20, + 0x29888: 0x6c304820, 0x2988b: 0x6c88a020, + 0x2988c: 0x6ca6e420, 0x2988d: 0x6c88a820, 0x2988e: 0x6c968820, 0x2988f: 0x6d30ca20, + 0x29893: 0x6c639420, + 0x29894: 0x6d15a820, 0x29896: 0x6c904c20, + 0x29898: 0x6d181820, + 0x2989d: 0x6c278e20, 0x2989e: 0x6c327820, + 0x298a3: 0x6d160c20, + 0x298a5: 0x6cdf8220, 0x298a6: 0x6c4f5420, 0x298a7: 0x6cd61620, + 0x298ac: 0x6cece820, 0x298ae: 0x6cdb2e20, 0x298af: 0x6d11d820, + 0x298b0: 0x6c37e020, 0x298b2: 0x6d326e20, + 0x298ba: 0x6c313e20, 0x298bb: 0x6c651220, + 0x298bf: 0x6cace620, + // Block 0xa63, offset 0x298c0 + 0x298c0: 0x6c5afe20, 0x298c2: 0x6c145420, 0x298c3: 0x6ccd1c20, + 0x298c4: 0x6c916620, 0x298c6: 0x6d244c20, + 0x298c8: 0x6d0ef420, 0x298c9: 0x6ced6420, 0x298ca: 0x6cbc6e20, 0x298cb: 0x6c953420, + 0x298cc: 0x6d245e20, 0x298cf: 0x6ce90620, + 0x298d0: 0x6cf10820, 0x298d2: 0x6cea8e20, + 0x298d5: 0x6c5d1820, 0x298d6: 0x6c079020, 0x298d7: 0x6cbd0620, + 0x298d9: 0x6c6c7420, 0x298da: 0x6c7f3620, + 0x298dc: 0x6d356620, 0x298dd: 0x6d21ec20, 0x298df: 0x6c22f020, + 0x298e6: 0x6d139420, 0x298e7: 0x6c2f0c20, + 0x298e8: 0x6c145820, 0x298e9: 0x6c2d9a20, 0x298ea: 0x6c97a220, + 0x298ec: 0x6c2afc20, 0x298ed: 0x6ceed020, 0x298ee: 0x6ca75020, 0x298ef: 0x6c835e20, + 0x298f0: 0x6c0db820, 0x298f1: 0x6cf39420, 0x298f3: 0x6d320820, + 0x298f6: 0x6cc77420, 0x298f7: 0x6cec7c20, + 0x298f8: 0x6c9dac20, 0x298f9: 0x6c6c1020, 0x298fb: 0x6c544620, + 0x298fd: 0x6d2d5620, 0x298fe: 0x6cc80a20, 0x298ff: 0x6d3ec620, + // Block 0xa64, offset 0x29900 + 0x29900: 0x6cac9420, 0x29902: 0x6ca1a620, + 0x29904: 0x6c9db220, 0x29906: 0x6cb55820, 0x29907: 0x6ca1a820, + 0x2990a: 0x6d342c20, 0x2990b: 0x6c04b020, + 0x2990d: 0x6c9f1820, 0x2990f: 0x6c933e20, + 0x29911: 0x6cb55e20, 0x29912: 0x6c1d0420, + 0x29914: 0x6c84d220, 0x29915: 0x6d196e20, + 0x29918: 0x6c2b0620, 0x29919: 0x6c25d220, 0x2991b: 0x6c339020, + 0x2991c: 0x6c96e820, 0x2991d: 0x6d0e2c20, 0x2991f: 0x6d2bba20, + 0x29920: 0x6d0e2e20, 0x29921: 0x6c339220, 0x29922: 0x6cb42620, + 0x29925: 0x6d273020, + 0x29929: 0x6c5e5c20, 0x2992a: 0x6c975420, 0x2992b: 0x6c664620, + 0x2992c: 0x6ca9e820, 0x2992d: 0x6cbdc020, 0x2992f: 0x6cbdc220, + 0x29932: 0x6d13aa20, + 0x29934: 0x6cdf5420, + 0x29939: 0x6c655c20, + 0x2993c: 0x6c141620, 0x2993e: 0x6c28f220, 0x2993f: 0x6ce2e220, + // Block 0xa65, offset 0x29940 + 0x29940: 0x6c87ce20, 0x29943: 0x6ca77c20, + 0x29944: 0x6c158420, 0x29945: 0x6d29f620, + 0x2994a: 0x6d24b820, + 0x2994c: 0x6d41e220, 0x2994d: 0x6c0b2020, + 0x29950: 0x6c1ef820, + 0x29958: 0x6cc48c20, 0x2995a: 0x6cc49820, 0x2995b: 0x6d0f7020, + 0x2995c: 0x6c0fe820, + 0x29961: 0x6c247820, + 0x2996c: 0x6c9cae20, 0x2996e: 0x6c787420, + 0x29970: 0x6c248420, + 0x29977: 0x6cf7ce20, + 0x29979: 0x6c968a20, 0x2997b: 0x6cd22020, + 0x2997c: 0x6c2d0420, 0x2997f: 0x6cd22220, + // Block 0xa66, offset 0x29980 + 0x29982: 0x6c2f7620, 0x29983: 0x6c6ee420, + 0x29985: 0x6d25a820, 0x29986: 0x6c41b220, + 0x2998a: 0x6c5ca420, 0x2998b: 0x6c5f4e20, + 0x2998d: 0x6caed420, 0x2998f: 0x6c2ab220, + 0x29991: 0x6c085e20, + 0x29994: 0x6cacea20, 0x29995: 0x6cded420, 0x29997: 0x6d252220, + 0x29998: 0x6c42ee20, 0x29999: 0x6d252420, + 0x2999f: 0x6c639220, + 0x299a3: 0x6c799020, + 0x299a6: 0x6c309820, + 0x299a9: 0x6cfbd820, 0x299aa: 0x6cb80620, + 0x299ac: 0x6cca7c20, + 0x299b0: 0x6d1b9820, 0x299b3: 0x6c901a20, + 0x299b6: 0x6ce29a20, 0x299b7: 0x6c902420, + 0x299ba: 0x6cc60820, + 0x299bd: 0x6d1b9020, 0x299be: 0x6cb2d820, 0x299bf: 0x6cb41c20, + // Block 0xa67, offset 0x299c0 + 0x299c0: 0x6d25be20, 0x299c1: 0x6cc72a20, 0x299c3: 0x6c399e20, + 0x299c7: 0x6c4f5820, + 0x299c8: 0x6c9c8820, 0x299c9: 0x6c55ea20, 0x299ca: 0x6d3eb620, + 0x299cc: 0x6c8d7e20, 0x299cd: 0x6c6eea20, 0x299ce: 0x6cc72e20, + 0x299d2: 0x6cb2e020, 0x299d3: 0x6c49fc20, + 0x299d4: 0x6c37ae20, + 0x299dd: 0x6c247e20, 0x299de: 0x6c760020, + 0x299e6: 0x6d052a20, + 0x299e8: 0x6c377a20, 0x299e9: 0x6ce44420, 0x299eb: 0x6d0ff820, + 0x299ed: 0x6c010a20, 0x299ee: 0x6c560820, 0x299ef: 0x6cf7ca20, + 0x299f1: 0x6c560a20, 0x299f3: 0x6cd85220, + 0x299f4: 0x6c854e20, 0x299f6: 0x6d197020, 0x299f7: 0x6c47f620, + 0x299f9: 0x6ce16a20, + // Block 0xa68, offset 0x29a00 + 0x29a00: 0x6cc42420, 0x29a01: 0x6d3fe620, 0x29a02: 0x6c84de20, + 0x29a04: 0x6c69ec20, 0x29a07: 0x6c38fe20, + 0x29a08: 0x6cb47e20, 0x29a09: 0x6cd86620, 0x29a0b: 0x6c6b9020, + 0x29a0c: 0x6c91b220, 0x29a0d: 0x6c87d020, 0x29a0e: 0x6c158620, + 0x29a10: 0x6d122220, + 0x29a15: 0x6c5b0020, + 0x29a19: 0x6c53e420, 0x29a1a: 0x6c2cea20, 0x29a1b: 0x6cc0be20, + 0x29a1c: 0x6c74f820, 0x29a1e: 0x6cb0d420, + 0x29a22: 0x6c7c5220, + 0x29a25: 0x6cf82820, 0x29a26: 0x6ce30c20, + 0x29a29: 0x6d076820, + 0x29a2f: 0x6c0b6220, + 0x29a32: 0x6c50b020, 0x29a33: 0x6c88ac20, + 0x29a36: 0x6cdb7620, 0x29a37: 0x6c8ab220, + 0x29a3c: 0x6c6c7820, + // Block 0xa69, offset 0x29a40 + 0x29a41: 0x6c87d220, 0x29a42: 0x6c158820, + 0x29a45: 0x6cb65a20, 0x29a46: 0x6cb66c20, + 0x29a49: 0x6d3ec020, 0x29a4b: 0x6d3ec420, + 0x29a4d: 0x6cb6b220, 0x29a4f: 0x6cb6b820, + 0x29a50: 0x6d3ed020, 0x29a52: 0x6d2d1020, 0x29a53: 0x6d2d1420, + 0x29a54: 0x6cabec20, 0x29a56: 0x6c70d820, + 0x29a59: 0x6d0df420, + 0x29a5c: 0x6c4f8c20, 0x29a5d: 0x6ca37020, + 0x29a64: 0x6d0e0220, 0x29a66: 0x6d2e9c20, 0x29a67: 0x6cd2e020, + 0x29a68: 0x6d34ba20, + 0x29a6d: 0x6d2c0a20, + 0x29a74: 0x6cc73420, 0x29a75: 0x6d2c0c20, 0x29a77: 0x6d195820, + 0x29a78: 0x6ca02820, 0x29a79: 0x6d0b4020, 0x29a7b: 0x6d376620, + 0x29a7d: 0x6c7e3020, 0x29a7e: 0x6cfa1c20, + // Block 0xa6a, offset 0x29a80 + 0x29a80: 0x6cb13820, 0x29a81: 0x6cdeec20, 0x29a83: 0x6d162a20, + 0x29a86: 0x6d051620, 0x29a87: 0x6d2d0c20, + 0x29a89: 0x6c34c420, 0x29a8a: 0x6c36e420, + 0x29a8e: 0x6d1ab420, + 0x29a90: 0x6c36ee20, 0x29a91: 0x6cdb8e20, 0x29a92: 0x6c016420, 0x29a93: 0x6c260420, + 0x29a95: 0x6ceb6420, 0x29a97: 0x6ceb6620, + 0x29a98: 0x6cfa1e20, 0x29a9b: 0x6c21ea20, + 0x29a9d: 0x6cdb9020, + 0x29aa5: 0x6c62f420, 0x29aa6: 0x6cba3620, 0x29aa7: 0x6d410420, + 0x29aa8: 0x6d2d0e20, 0x29aa9: 0x6d280e20, 0x29aaa: 0x6d2ea620, + 0x29aac: 0x6d159c20, + 0x29ab2: 0x6d0b4220, 0x29ab3: 0x6d266020, + 0x29ab9: 0x6c51ac20, 0x29aba: 0x6cb88820, + 0x29abe: 0x6c13c220, + // Block 0xa6b, offset 0x29ac0 + 0x29ac3: 0x6cab7020, + 0x29ac8: 0x6c560c20, 0x29aca: 0x6d0f2020, + 0x29acc: 0x6cbd0e20, 0x29acd: 0x6c0fd820, 0x29ace: 0x6cbafe20, 0x29acf: 0x6c6c1420, + 0x29adb: 0x6ca6e820, + 0x29ade: 0x6c162420, 0x29adf: 0x6cbdf620, + 0x29ae1: 0x6d2a3220, + 0x29ae4: 0x6d1b3220, 0x29ae5: 0x6d029c20, 0x29ae7: 0x6cb6ba20, + 0x29ae8: 0x6c673420, 0x29aeb: 0x6d061420, + 0x29aed: 0x6d2bbc20, 0x29aef: 0x6c370420, + 0x29af3: 0x6d40a020, + 0x29af4: 0x6d163220, + 0x29af9: 0x6d34c820, 0x29afa: 0x6c87d420, + 0x29afd: 0x6c87d620, 0x29afe: 0x6d1aba20, + // Block 0xa6c, offset 0x29b00 + 0x29b01: 0x6c88b220, 0x29b03: 0x6c158a20, + 0x29b05: 0x6c754820, 0x29b07: 0x6d28e620, + 0x29b0e: 0x6d2d1620, 0x29b0f: 0x6cb12220, + 0x29b11: 0x6c8fd220, 0x29b13: 0x6c8fd420, + 0x29b18: 0x6c8fe220, + 0x29b1d: 0x6c900020, + 0x29b20: 0x6c900c20, 0x29b22: 0x6c98b220, + 0x29b25: 0x6d30d020, + 0x29b2c: 0x6c423a20, 0x29b2d: 0x6c466a20, 0x29b2e: 0x6cc49a20, 0x29b2f: 0x6c248020, + 0x29b30: 0x6c68aa20, + 0x29b37: 0x6c0fec20, + 0x29b39: 0x6d3b4c20, 0x29b3a: 0x6cbfe820, 0x29b3b: 0x6d0f7220, + // Block 0xa6d, offset 0x29b40 + 0x29b40: 0x6d003020, 0x29b42: 0x6c5b4820, 0x29b43: 0x6cc16c20, + 0x29b48: 0x6c8e0220, 0x29b4a: 0x6d1ab220, + 0x29b4e: 0x6cb0e820, + 0x29b52: 0x6c88b020, + // Block 0xa6e, offset 0x29b80 + 0x29b9d: 0x6c343c20, + // Block 0xa6f, offset 0x29bc0 + 0x29bc8: 0x6c040c20, + 0x29bcf: 0x6d2d9220, + // Block 0xa70, offset 0x29c00 + 0x29c2e: 0x6c943c20, + // Block 0xa71, offset 0x29c40 + 0x29c4a: 0x6cd94a20, + 0x29c57: 0x6c73ac20, + // Block 0xa72, offset 0x29c80 + 0x29c9d: 0x6d1d8e20, + // Block 0xa73, offset 0x29cc0 + 0x29cf9: 0x6caa5c20, + // Block 0xa74, offset 0x29d00 + 0x29d10: 0x6c230620, + // Block 0xa75, offset 0x29d40 + 0x29d62: 0x6cfc9220, + // Block 0xa76, offset 0x29d80 + 0x29da1: 0x6c85dc20, + // Block 0xa77, offset 0x29dc0 + 0x29dc8: 0x6c3abc20, + 0x29dd9: 0x6cdb3a20, + // Block 0xa78, offset 0x29e00 + 0x29e1c: 0x6c79dc20, + // Block 0xa79, offset 0x29e40 + 0x29e68: 0x6c1a9e20, + 0x29e78: 0x6d09b220, + // Block 0xa7a, offset 0x29e80 + 0x29eb0: 0x6cb86a20, + // Block 0xa7b, offset 0x29ec0 + 0x29ed0: 0x6c45fe20, + // Block 0xa7c, offset 0x29f00 + 0x29f00: 0x6c5ef220, + 0x29f28: 0x6c953a20, + // Block 0xa7d, offset 0x29f40 + 0x29f59: 0x6d165020, + 0x29f5f: 0x6d146820, + 0x29f62: 0x6ca49820, + 0x29f70: 0x6cf7de20, 0x29f72: 0x6cffaa20, + // Block 0xa7e, offset 0x29f80 + 0x29f8b: 0x6c73b020, + // Block 0xa7f, offset 0x29fc0 + 0x29fc4: 0x6d268220, 0x29fc6: 0x6c7b1020, + 0x29fc9: 0x6c8cc220, + 0x29fd0: 0x6ca5f020, 0x29fd3: 0x6c108a20, + // Block 0xa80, offset 0x2a000 + 0x2a036: 0x6c4e3a20, + // Block 0xa81, offset 0x2a040 + 0x2a067: 0x6c3d5820, + 0x2a069: 0x6c230a20, + // Block 0xa82, offset 0x2a080 + 0x2a08e: 0x6c74d220, + // Block 0xa83, offset 0x2a0c0 + 0x2a0e0: 0x6d2eb220, + 0x2a0e6: 0x6c109020, 0x2a0e7: 0x6cda9a20, + 0x2a0ee: 0x6c59cc20, + 0x2a0f4: 0x6d2da220, + // Block 0xa84, offset 0x2a100 + 0x2a11d: 0x6c73ea20, + 0x2a123: 0x6c4ea420, + 0x2a124: 0x6c003a20, + 0x2a128: 0x6ce33820, + // Block 0xa85, offset 0x2a140 + 0x2a148: 0x6d06ca20, 0x2a149: 0x6c534620, + 0x2a152: 0x6c3e4620, + 0x2a154: 0x6c5b4020, 0x2a155: 0x6cd1e620, + 0x2a159: 0x6cb41220, + // Block 0xa86, offset 0x2a180 + 0x2a19b: 0x6d33bc20, + 0x2a19e: 0x6c740c20, + 0x2a1a2: 0x6ca90020, + 0x2a1b6: 0x6c1c5220, + 0x2a1b8: 0x6ce36020, + // Block 0xa87, offset 0x2a1c0 + 0x2a1c0: 0x6c857420, 0x2a1c1: 0x6cecb420, 0x2a1c2: 0x6d144620, 0x2a1c3: 0x48024420, + 0x2a1c4: 0x6ca62220, 0x2a1c5: 0x6cf43220, 0x2a1c6: 0x6ce9f420, 0x2a1c7: 0x6c0e1020, + 0x2a1c8: 0x6d28b220, 0x2a1c9: 0x6c071c20, 0x2a1ca: 0x6ccbb820, 0x2a1cb: 0x6cfe3c20, + 0x2a1cc: 0x6c75ee20, 0x2a1cd: 0x6cddc620, 0x2a1ce: 0x6c9dfe20, 0x2a1cf: 0x6ce92020, + 0x2a1d0: 0x6c5a2a20, 0x2a1d1: 0x6c720620, 0x2a1d2: 0x480a3820, 0x2a1d3: 0x44697220, + 0x2a1d4: 0x6ca57e20, 0x2a1d5: 0x6d292620, 0x2a1d6: 0x480a9620, 0x2a1d7: 0x6cc6ec20, + 0x2a1d8: 0x6d24d020, 0x2a1d9: 0x6c0da020, 0x2a1da: 0x6c2fd820, 0x2a1db: 0x6c7bdc20, + 0x2a1dc: 0x6cbee220, 0x2a1dd: 0x6cb9ec20, 0x2a1de: 0x6cc5a020, 0x2a1df: 0x6cafae20, + 0x2a1e0: 0x6c787a20, 0x2a1e1: 0x6c95a620, 0x2a1e2: 0x6c438c20, 0x2a1e3: 0x6c15bc20, + 0x2a1e4: 0x6c5fc020, 0x2a1e5: 0x6d1e1820, 0x2a1e6: 0x6c9e0c20, 0x2a1e7: 0x6cbd7c20, + 0x2a1e8: 0x6cce9420, 0x2a1e9: 0x6c059e20, 0x2a1ea: 0x6c22f420, 0x2a1eb: 0x6c06c620, + 0x2a1ec: 0x6c5b8420, 0x2a1ed: 0x6c068e20, 0x2a1ee: 0x6c0efe20, 0x2a1ef: 0x6c5fd220, + 0x2a1f0: 0x6c5fec20, 0x2a1f1: 0x6cbe3a20, 0x2a1f2: 0x6cbe3a20, 0x2a1f3: 0x6cbe3a20, + 0x2a1f4: 0x48145820, 0x2a1f5: 0x6c5a8620, 0x2a1f6: 0x6c5fb820, 0x2a1f7: 0x6cda0e20, + 0x2a1f8: 0x4816c620, 0x2a1f9: 0x6c697a20, 0x2a1fa: 0x6c1bd620, 0x2a1fb: 0x6d108620, + 0x2a1fc: 0x6cfc7820, 0x2a1fd: 0x6cf56a20, 0x2a1fe: 0x6c19b620, 0x2a1ff: 0x6d385a20, + // Block 0xa88, offset 0x2a200 + 0x2a200: 0x6c35e420, 0x2a201: 0x6c9ec220, 0x2a202: 0x6ce0e820, 0x2a203: 0x6cb6ec20, + 0x2a204: 0x6cfb5820, 0x2a205: 0x6ccd8a20, 0x2a206: 0x6ccd8a20, 0x2a207: 0x6c5bbc20, + 0x2a208: 0x6c1aae20, 0x2a209: 0x6d2bd620, 0x2a20a: 0x6d110420, 0x2a20b: 0x6ce8d420, + 0x2a20c: 0x6ce0a020, 0x2a20d: 0x6ce8d620, 0x2a20e: 0x6c4fd020, 0x2a20f: 0x6cae3420, + 0x2a210: 0x6cbc9020, 0x2a211: 0x6d3c2c20, 0x2a212: 0x6c19c620, 0x2a213: 0x6d344c20, + 0x2a214: 0x6ce92220, 0x2a215: 0x6d03ca20, 0x2a216: 0x6c223620, 0x2a217: 0x6c064c20, + 0x2a218: 0x6c2c7c20, 0x2a219: 0x4829c820, 0x2a21a: 0x6c972420, 0x2a21b: 0x6c554020, + 0x2a21c: 0x6c3c9c20, 0x2a21d: 0x6c341620, 0x2a21e: 0x6c9c0420, 0x2a21f: 0x6cceea20, + 0x2a220: 0x6c1bda20, 0x2a221: 0x482dd420, 0x2a222: 0x6c5ea220, 0x2a223: 0x6d20ec20, + 0x2a224: 0x6ce9f820, 0x2a225: 0x6cb1e820, 0x2a226: 0x6c3fe420, 0x2a227: 0x6ccae220, + 0x2a228: 0x6c139820, 0x2a229: 0x6cc52820, 0x2a22a: 0x6c804820, 0x2a22b: 0x6c804820, + 0x2a22c: 0x48339020, 0x2a22d: 0x6d24da20, 0x2a22e: 0x6d365020, 0x2a22f: 0x6ca91020, + 0x2a230: 0x6c061c20, 0x2a231: 0x6c81ee20, 0x2a232: 0x6cd45020, 0x2a233: 0x6c674e20, + 0x2a234: 0x6c28f820, 0x2a235: 0x6d1edc20, 0x2a236: 0x6d11f020, 0x2a237: 0x6ce8a020, + 0x2a238: 0x6c17fa20, 0x2a239: 0x6d053020, 0x2a23a: 0x6cb8a420, 0x2a23b: 0x6cf3b020, + 0x2a23c: 0x6d0d7a20, 0x2a23d: 0x483bcc20, 0x2a23e: 0x6c2ccc20, 0x2a23f: 0x6d3e3620, + // Block 0xa89, offset 0x2a240 + 0x2a240: 0x6c15c620, 0x2a241: 0x6d09d820, 0x2a242: 0x6c175e20, 0x2a243: 0x6d15b220, + 0x2a244: 0x6d0a8c20, 0x2a245: 0x6cd71420, 0x2a246: 0x6c997a20, 0x2a247: 0x6c3b8620, + 0x2a248: 0x6c980020, 0x2a249: 0x48430620, 0x2a24a: 0x6d16e820, 0x2a24b: 0x6c0e0e20, + 0x2a24c: 0x6c097620, 0x2a24d: 0x6cd5c220, 0x2a24e: 0x6c80b420, 0x2a24f: 0x6cd79620, + 0x2a250: 0x6c45cc20, 0x2a251: 0x48466220, 0x2a252: 0x48466220, 0x2a253: 0x6d20e820, + 0x2a254: 0x6ce1b020, 0x2a255: 0x6ce1b020, 0x2a256: 0x6d16b220, 0x2a257: 0x48657020, + 0x2a258: 0x48c3b420, 0x2a259: 0x6d03c020, 0x2a25a: 0x6c2dc420, 0x2a25b: 0x6ccd7820, + 0x2a25c: 0x6c300020, 0x2a25d: 0x6cc58620, 0x2a25e: 0x6d357420, 0x2a25f: 0x6c7bb620, + 0x2a260: 0x6d24d420, 0x2a261: 0x6c5a4620, 0x2a262: 0x6c73f820, 0x2a263: 0x6c5b4c20, + 0x2a264: 0x6c2ff820, 0x2a265: 0x6c339820, 0x2a266: 0x6c224e20, 0x2a267: 0x6c599420, + 0x2a268: 0x6cd0ac20, 0x2a269: 0x6c599420, 0x2a26a: 0x6c90a220, 0x2a26b: 0x6d2b8a20, + 0x2a26c: 0x6cfd0820, 0x2a26d: 0x6c3be420, 0x2a26e: 0x6c11da20, 0x2a26f: 0x6c9b4a20, + 0x2a270: 0x6c1a5420, 0x2a271: 0x6c804a20, 0x2a272: 0x6c19b220, 0x2a273: 0x6c63b620, + 0x2a274: 0x6c7a1820, 0x2a275: 0x6c063220, 0x2a276: 0x6c036820, 0x2a277: 0x6c72e420, + 0x2a278: 0x48561820, 0x2a279: 0x6cecf820, 0x2a27a: 0x6cb1ea20, 0x2a27b: 0x6ccf2c20, + 0x2a27c: 0x6ccae020, 0x2a27d: 0x6c600020, 0x2a27e: 0x4857e220, 0x2a27f: 0x6c6d1420, + // Block 0xa8a, offset 0x2a280 + 0x2a280: 0x6d0ca820, 0x2a281: 0x6d0d6620, 0x2a282: 0x6c30b620, 0x2a283: 0x6ca07220, + 0x2a284: 0x6c67f620, 0x2a285: 0x6c5ae420, 0x2a286: 0x6c691420, 0x2a287: 0x4474d820, + 0x2a288: 0x6c9fa820, 0x2a289: 0x6c6e8420, 0x2a28a: 0x48601420, 0x2a28b: 0x6c61ec20, + 0x2a28c: 0x6cd4b820, 0x2a28d: 0x6c6cea20, 0x2a28e: 0x6cf01620, 0x2a28f: 0x6cd55a20, + 0x2a290: 0x6cf15420, 0x2a291: 0x6c16e420, 0x2a292: 0x6c994e20, 0x2a293: 0x6c9e1820, + 0x2a294: 0x6d41b020, 0x2a295: 0x6c6d2820, 0x2a296: 0x6ca31420, 0x2a297: 0x6ce05420, + 0x2a298: 0x6c80f820, 0x2a299: 0x6cee5220, 0x2a29a: 0x6d3f9820, 0x2a29b: 0x6cb6d620, + 0x2a29c: 0x6c0bea20, 0x2a29d: 0x48678620, 0x2a29e: 0x6c572820, 0x2a29f: 0x6c48dc20, + 0x2a2a0: 0x6c5e8e20, 0x2a2a1: 0x6cca6a20, 0x2a2a2: 0x6c99ec20, 0x2a2a3: 0x4868da20, + 0x2a2a4: 0x6c022a20, 0x2a2a5: 0x6c078420, 0x2a2a6: 0x6d3e3a20, 0x2a2a7: 0x6c513820, + 0x2a2a8: 0x6d2be020, 0x2a2a9: 0x6d112020, 0x2a2aa: 0x6c415020, 0x2a2ab: 0x6ccefe20, + 0x2a2ac: 0x486d4620, 0x2a2ad: 0x6d370620, 0x2a2ae: 0x6d159820, 0x2a2af: 0x6c22aa20, + 0x2a2b0: 0x48714e20, 0x2a2b1: 0x6d05d420, 0x2a2b2: 0x6c7d9c20, 0x2a2b3: 0x6cdc4620, + 0x2a2b4: 0x6cf15820, 0x2a2b5: 0x6ccbda20, 0x2a2b6: 0x6cbc4020, 0x2a2b7: 0x48751a20, + 0x2a2b8: 0x483a1620, 0x2a2b9: 0x4875f420, 0x2a2ba: 0x6c391c20, 0x2a2bb: 0x48797820, + 0x2a2bc: 0x6d0c6820, 0x2a2bd: 0x6c077e20, 0x2a2be: 0x6cb8a820, 0x2a2bf: 0x6cf3b620, + // Block 0xa8b, offset 0x2a2c0 + 0x2a2c0: 0x6cac1e20, 0x2a2c1: 0x6c4d3a20, 0x2a2c2: 0x6c8e4a20, 0x2a2c3: 0x6c502e20, + 0x2a2c4: 0x6c6cee20, 0x2a2c5: 0x6ca80820, 0x2a2c6: 0x6c07ac20, 0x2a2c7: 0x6cb28620, + 0x2a2c8: 0x6c42a220, 0x2a2c9: 0x6d0c0820, 0x2a2ca: 0x6c903620, 0x2a2cb: 0x6d3e4020, + 0x2a2cc: 0x6c2cce20, 0x2a2cd: 0x6ccc0a20, 0x2a2ce: 0x6d0bf820, 0x2a2cf: 0x6c177620, + 0x2a2d0: 0x487ebc20, 0x2a2d1: 0x487f1c20, 0x2a2d2: 0x6c3b8c20, 0x2a2d3: 0x6d270a20, + 0x2a2d4: 0x6c6eb420, 0x2a2d5: 0x6d1cba20, 0x2a2d6: 0x6cd63020, 0x2a2d7: 0x6cb9e020, + 0x2a2d8: 0x6d28f220, 0x2a2d9: 0x6d3bbe20, 0x2a2da: 0x6ce08e20, 0x2a2db: 0x480a4a20, + 0x2a2dc: 0x6c32cc20, 0x2a2dd: 0x4884c620, 0x2a2de: 0x6c233e20, 0x2a2df: 0x48875620, + 0x2a2e0: 0x6c24c420, 0x2a2e1: 0x6c74c820, 0x2a2e2: 0x6d2c3a20, 0x2a2e3: 0x488c1020, + 0x2a2e4: 0x6cf61a20, 0x2a2e5: 0x6c074020, 0x2a2e6: 0x6d0e3c20, 0x2a2e7: 0x48902820, + 0x2a2e8: 0x6cde2020, 0x2a2e9: 0x6cedda20, 0x2a2ea: 0x6c45d620, 0x2a2eb: 0x6d268820, + 0x2a2ec: 0x6cb29020, 0x2a2ed: 0x6cb29020, 0x2a2ee: 0x6c277a20, 0x2a2ef: 0x6d215e20, + 0x2a2f0: 0x6d325020, 0x2a2f1: 0x6cdd8a20, 0x2a2f2: 0x6cbf7620, 0x2a2f3: 0x6d03d220, + 0x2a2f4: 0x6cc89c20, 0x2a2f5: 0x48986c20, 0x2a2f6: 0x6d28f620, 0x2a2f7: 0x48992420, + 0x2a2f8: 0x6d176620, 0x2a2f9: 0x6cb2b420, 0x2a2fa: 0x6d226e20, 0x2a2fb: 0x489f4220, + 0x2a2fc: 0x489f7020, 0x2a2fd: 0x48a08820, 0x2a2fe: 0x6d0c7620, 0x2a2ff: 0x6c627820, + // Block 0xa8c, offset 0x2a300 + 0x2a300: 0x6d344020, 0x2a301: 0x48a1e620, 0x2a302: 0x48a1e420, 0x2a303: 0x48a23220, + 0x2a304: 0x48a26620, 0x2a305: 0x6d313c20, 0x2a306: 0x6d313e20, 0x2a307: 0x6d313e20, + 0x2a308: 0x6c736420, 0x2a309: 0x6c6ad220, 0x2a30a: 0x6c188220, 0x2a30b: 0x6d130220, + 0x2a30c: 0x6cd23420, 0x2a30d: 0x48a83a20, 0x2a30e: 0x6d03e220, 0x2a30f: 0x6c926e20, + 0x2a310: 0x6ce4ba20, 0x2a311: 0x6c5b7020, 0x2a312: 0x6c6fd820, 0x2a313: 0x6d411420, + 0x2a314: 0x6c1baa20, 0x2a315: 0x6c8f3a20, 0x2a316: 0x6c3e9c20, 0x2a317: 0x6cd52420, + 0x2a318: 0x6c657420, 0x2a319: 0x6c47c420, 0x2a31a: 0x6c624a20, 0x2a31b: 0x6cf1f020, + 0x2a31c: 0x48b2f820, 0x2a31d: 0x6ce4c020, 0x2a31e: 0x6ce4c020, 0x2a31f: 0x6cb26020, + 0x2a320: 0x6cb2be20, 0x2a321: 0x48b75620, 0x2a322: 0x6d3bde20, 0x2a323: 0x6d3a2820, + 0x2a324: 0x6cf00020, 0x2a325: 0x6c178020, 0x2a326: 0x6c076020, 0x2a327: 0x6cf8f420, + 0x2a328: 0x6c680820, 0x2a329: 0x6cca3020, 0x2a32a: 0x6c61b020, 0x2a32b: 0x48bf0c20, + 0x2a32c: 0x6c07ee20, 0x2a32d: 0x6d10b020, 0x2a32e: 0x6d3e6a20, 0x2a32f: 0x6d400620, + 0x2a330: 0x6ccac220, 0x2a331: 0x6c965020, 0x2a332: 0x6d03dc20, 0x2a333: 0x48c48e20, + 0x2a334: 0x6c9a0420, 0x2a335: 0x48c5b220, 0x2a336: 0x6c177e20, 0x2a337: 0x48c67c20, + 0x2a338: 0x6d104a20, 0x2a339: 0x6c027e20, 0x2a33a: 0x6d30d220, 0x2a33b: 0x48c9b420, + 0x2a33c: 0x48ca4620, 0x2a33d: 0x6cb25820, 0x2a33e: 0x48cb5020, 0x2a33f: 0x6c236620, + // Block 0xa8d, offset 0x2a340 + 0x2a340: 0x6c78f420, 0x2a341: 0x6cc5d220, 0x2a342: 0x6d22da20, 0x2a343: 0x6c252c20, + 0x2a344: 0x6c231a20, 0x2a345: 0x6caff420, 0x2a346: 0x6d1d4020, 0x2a347: 0x48cf4e20, + 0x2a348: 0x48cf6a20, 0x2a349: 0x6d085420, 0x2a34a: 0x48673820, 0x2a34b: 0x6d20e820, + 0x2a34c: 0x6cf89220, 0x2a34d: 0x6c225220, 0x2a34e: 0x6c07f020, 0x2a34f: 0x6cb6ce20, + 0x2a350: 0x6d22c820, 0x2a351: 0x6d338420, 0x2a352: 0x6c813e20, 0x2a353: 0x6c570620, + 0x2a354: 0x6c398620, 0x2a355: 0x6d0b1420, 0x2a356: 0x6c7a7620, 0x2a357: 0x48d67820, + 0x2a358: 0x6cc91420, 0x2a359: 0x6c148e20, 0x2a35a: 0x6cc65e20, 0x2a35b: 0x6c6aa820, + 0x2a35c: 0x6cf3bc20, 0x2a35d: 0x6c988a20, 0x2a35e: 0x6c2bf220, 0x2a35f: 0x6d311420, + 0x2a360: 0x6cb28e20, 0x2a361: 0x6c711c20, 0x2a362: 0x6c757020, 0x2a363: 0x6c114420, + 0x2a364: 0x48d86c20, 0x2a365: 0x6cdd8420, 0x2a366: 0x48d9aa20, 0x2a367: 0x448a5620, + 0x2a368: 0x6cb2ae20, 0x2a369: 0x6c6ca620, 0x2a36a: 0x6c25ea20, 0x2a36b: 0x48e79420, + 0x2a36c: 0x6cc8a220, 0x2a36d: 0x48de5820, 0x2a36e: 0x6c19a420, 0x2a36f: 0x6c936e20, + 0x2a370: 0x6c175420, 0x2a371: 0x6c93c420, 0x2a372: 0x6c7cba20, 0x2a373: 0x6caaa220, + 0x2a374: 0x6c91c420, 0x2a375: 0x6c7c4820, 0x2a376: 0x6cf90620, 0x2a377: 0x6c1aa420, + 0x2a378: 0x6cb8ca20, 0x2a379: 0x6d24fc20, 0x2a37a: 0x6cb2b020, 0x2a37b: 0x6d276220, + 0x2a37c: 0x6c2ed620, 0x2a37d: 0x6d39be20, 0x2a37e: 0x6c22de20, 0x2a37f: 0x6c5f4420, + // Block 0xa8e, offset 0x2a380 + 0x2a380: 0x6c4b2220, 0x2a381: 0x6cfe0220, 0x2a382: 0x6c22ec20, 0x2a383: 0x6d3cd820, + 0x2a384: 0x6d13be20, 0x2a385: 0x6c668020, 0x2a386: 0x6c8e6020, 0x2a387: 0x6cd72420, + 0x2a388: 0x6c929c20, 0x2a389: 0x6d0daa20, 0x2a38a: 0x6c996a20, 0x2a38b: 0x48f15c20, + 0x2a38c: 0x48f2cc20, 0x2a38d: 0x6ca8e820, 0x2a38e: 0x6d25ea20, 0x2a38f: 0x6c1a2220, + 0x2a390: 0x6d23f620, 0x2a391: 0x6c0bdc20, 0x2a392: 0x6cd2b020, 0x2a393: 0x6c649220, + 0x2a394: 0x6c498620, 0x2a395: 0x6c09b020, 0x2a396: 0x6c424420, 0x2a397: 0x6cb6ea20, + 0x2a398: 0x6cd61020, 0x2a399: 0x6d2fdc20, 0x2a39a: 0x6c038220, 0x2a39b: 0x6c658c20, + 0x2a39c: 0x6cb11c20, 0x2a39d: 0x4811bc20, 0x2a39e: 0x6cc5e420, 0x2a39f: 0x6cd50820, + 0x2a3a0: 0x490ba420, 0x2a3a1: 0x490bda20, 0x2a3a2: 0x6cb6c420, 0x2a3a3: 0x6cb27e20, + 0x2a3a4: 0x6d3e4a20, 0x2a3a5: 0x490e5c20, 0x2a3a6: 0x6c176420, 0x2a3a7: 0x6c0f1c20, + 0x2a3a8: 0x6d07ca20, 0x2a3a9: 0x6c575620, 0x2a3aa: 0x6c0dee20, 0x2a3ab: 0x6cbb5020, + 0x2a3ac: 0x6d295820, 0x2a3ad: 0x4917f420, 0x2a3ae: 0x6c763420, 0x2a3af: 0x6cae7c20, + 0x2a3b0: 0x6ccca420, 0x2a3b1: 0x491aee20, 0x2a3b2: 0x6cef3620, 0x2a3b3: 0x6cb8e820, + 0x2a3b4: 0x6cf69820, 0x2a3b5: 0x6d280620, 0x2a3b6: 0x6cace820, 0x2a3b7: 0x6cb26420, + 0x2a3b8: 0x6c930020, 0x2a3b9: 0x6c160820, 0x2a3ba: 0x6c0ab220, 0x2a3bb: 0x49281420, + 0x2a3bc: 0x6c7d6c20, 0x2a3bd: 0x6d0eb020, 0x2a3be: 0x6c35b420, 0x2a3bf: 0x6c35b420, + // Block 0xa8f, offset 0x2a3c0 + 0x2a3c0: 0x6cb26620, 0x2a3c1: 0x6d097020, 0x2a3c2: 0x6c5eb020, 0x2a3c3: 0x6c04d420, + 0x2a3c4: 0x6c36b220, 0x2a3c5: 0x6d276c20, 0x2a3c6: 0x6c060a20, 0x2a3c7: 0x6cea1420, + 0x2a3c8: 0x6c423020, 0x2a3c9: 0x6cbf6820, 0x2a3ca: 0x6d320420, 0x2a3cb: 0x6c62d820, + 0x2a3cc: 0x6c64ec20, 0x2a3cd: 0x6c702e20, 0x2a3ce: 0x6c60f620, 0x2a3cf: 0x6cb02c20, + 0x2a3d0: 0x6d21ea20, 0x2a3d1: 0x6c968620, 0x2a3d2: 0x6ccc2e20, 0x2a3d3: 0x49441c20, + 0x2a3d4: 0x49452220, 0x2a3d5: 0x6c966820, 0x2a3d6: 0x6cba8620, 0x2a3d7: 0x6d353420, + 0x2a3d8: 0x6c9e0a20, 0x2a3d9: 0x6d342a20, 0x2a3da: 0x6c9d7420, 0x2a3db: 0x6c3ba420, + 0x2a3dc: 0x6c08a220, 0x2a3dd: 0x6cb13820, + // Block 0xa90, offset 0x2a400 + 0x2a400: 0x6c00c220, 0x2a401: 0xe0002416, 0x2a402: 0x029cb684, 0x2a403: 0x029cb484, + 0x2a404: 0x6c000e20, 0x2a405: 0x029d7684, 0x2a406: 0x6c008a20, 0x2a407: 0x6c009220, + 0x2a408: 0x6c009e20, 0x2a409: 0x02a40484, 0x2a40a: 0x6c00b820, 0x2a40b: 0xe0002413, + 0x2a40c: 0x6c01a420, 0x2a40d: 0x6c01a620, 0x2a40e: 0xe000241f, 0x2a40f: 0x02b84684, + 0x2a410: 0x02b84484, 0x2a411: 0xe0002422, 0x2a412: 0x02bbe684, 0x2a413: 0x02bcf484, + 0x2a414: 0x02bea284, 0x2a415: 0x6c01e620, 0x2a416: 0x02bf8884, 0x2a417: 0xe0002428, + 0x2a418: 0x02c49884, 0x2a419: 0x02ca6a84, 0x2a41b: 0x02cbc284, + 0x2a41c: 0x6c049420, 0x2a41d: 0x6c049a20, 0x2a41e: 0xe0002436, 0x2a41f: 0x2c098083, + 0x2a420: 0x02d82284, 0x2a421: 0x02d86a84, 0x2a422: 0x02d87484, 0x2a423: 0x02e0d884, + 0x2a424: 0x02e45684, 0x2a425: 0x6c04d420, 0x2a426: 0x029c5884, 0x2a427: 0x6c04ee20, + 0x2a428: 0x02e55a84, 0x2a429: 0xe000243f, 0x2a42a: 0x6c0a1820, 0x2a42b: 0xe0002445, + 0x2a42c: 0x6c0a3220, 0x2a42d: 0x02f27684, 0x2a42e: 0x6c13f420, 0x2a42f: 0x02f9f284, + 0x2a430: 0x02fd3e84, 0x2a431: 0x02fea684, 0x2a432: 0x02fea484, 0x2a433: 0xe0002451, + 0x2a434: 0xe0002454, 0x2a435: 0xe000244e, 0x2a436: 0x6c143820, 0x2a437: 0xe000245a, + 0x2a438: 0x02ff1684, 0x2a439: 0x03000484, 0x2a43a: 0x03010084, 0x2a43b: 0xe000245d, + 0x2a43c: 0x6c050a20, 0x2a43d: 0xe0002463, 0x2a43e: 0x6c020220, 0x2a43f: 0xe0002466, + // Block 0xa91, offset 0x2a440 + 0x2a440: 0xe0002469, 0x2a441: 0x030c9c84, 0x2a442: 0x0310c884, 0x2a443: 0x03130084, + 0x2a444: 0x0312fe84, 0x2a445: 0x03138284, 0x2a446: 0x6c26a420, 0x2a447: 0xe000246c, + 0x2a448: 0x03174084, 0x2a449: 0x031a3a84, 0x2a44a: 0x6c270020, 0x2a44b: 0x031ecc84, + 0x2a44c: 0x6c020620, 0x2a44d: 0x6c051c20, 0x2a44e: 0xe0002475, 0x2a44f: 0x6c00cc20, + 0x2a450: 0x03290a84, 0x2a451: 0x032aee84, 0x2a452: 0x032af084, 0x2a453: 0x032afe84, + 0x2a454: 0x032bd084, 0x2a455: 0xe000247b, 0x2a456: 0x6c00ce20, 0x2a457: 0x6c427620, + 0x2a458: 0x032ea484, 0x2a459: 0x032fcc84, 0x2a45a: 0x0330ea84, 0x2a45b: 0x03319c84, + 0x2a45c: 0x0331bc84, 0x2a45d: 0x0331be84, 0x2a45e: 0x6c636020, 0x2a45f: 0x0331c084, + 0x2a460: 0x0332c684, 0x2a461: 0xe0002484, 0x2a462: 0x0334d884, 0x2a463: 0x6c63aa20, + 0x2a464: 0xe000248a, 0x2a465: 0x0338f884, 0x2a466: 0x033c3e84, 0x2a467: 0xe000248d, + 0x2a468: 0x033d4c84, 0x2a469: 0x033d8884, 0x2a46a: 0x033dfc84, 0x2a46b: 0xe0002490, + 0x2a46c: 0x033ea084, 0x2a46d: 0xe0002493, 0x2a46e: 0x033efe84, 0x2a46f: 0xe0002496, + 0x2a470: 0x033f3284, 0x2a471: 0xe0002499, 0x2a472: 0xe000249c, 0x2a473: 0x2c28ac83, + // Block 0xa92, offset 0x2a480 + 0x2a480: 0x2c000286, 0x2a481: 0x2c000483, 0x2a482: 0x2c000683, 0x2a483: 0x2c000883, + 0x2a484: 0x2c001084, 0x2a485: 0x2c002483, 0x2a486: 0x2c007486, 0x2a487: 0x2c007c83, + 0x2a488: 0x2c007e84, 0x2a489: 0x2c008483, 0x2a48a: 0x2c008683, 0x2a48b: 0x2c008884, + 0x2a48c: 0x2c008c83, 0x2a48d: 0x2c008e83, 0x2a48e: 0x2c009083, 0x2a48f: 0x2c009483, + 0x2a490: 0x2c009a83, 0x2a491: 0x2c00a083, 0x2a492: 0x2c00a883, 0x2a493: 0x2c00aa83, + 0x2a494: 0x2c00ac83, 0x2a495: 0x2c00b083, 0x2a496: 0x2c00b483, 0x2a497: 0x2c00b685, + 0x2a498: 0x2c00ba83, 0x2a499: 0x2c00bc83, 0x2a49a: 0x2c00be83, 0x2a49b: 0x2c00c083, + 0x2a49c: 0x2c00c483, 0x2a49d: 0x2c018083, 0x2a49e: 0x2c018283, 0x2a49f: 0x2c018484, + 0x2a4a0: 0x2c018683, 0x2a4a1: 0x2c018883, 0x2a4a2: 0x2c018c83, 0x2a4a3: 0x2c018e83, + 0x2a4a4: 0x2c019083, 0x2a4a5: 0x2c019484, 0x2a4a6: 0x2c019683, 0x2a4a7: 0x2c01a083, + 0x2a4a8: 0x2c01a283, 0x2a4a9: 0x2c01a883, 0x2a4aa: 0x2c01ac83, 0x2a4ab: 0x2c01b283, + 0x2a4ac: 0x2c01b683, 0x2a4ad: 0x2c01ba83, 0x2a4ae: 0x2c01bc83, 0x2a4af: 0x2c01c483, + 0x2a4b0: 0x2c01c683, 0x2a4b1: 0x2c01cc83, 0x2a4b2: 0x2c01ce83, 0x2a4b3: 0x2c01d283, + 0x2a4b4: 0x2c01d483, 0x2a4b5: 0x2c01d683, 0x2a4b6: 0x2c01d883, 0x2a4b7: 0x2c01dc83, + 0x2a4b8: 0x2c01e083, 0x2a4b9: 0x2c01e883, 0x2a4ba: 0x2c01ec83, 0x2a4bb: 0x2c01ee83, + 0x2a4bc: 0x2c046683, 0x2a4bd: 0x2c046c83, 0x2a4be: 0x2c046e83, 0x2a4bf: 0x2c047484, + // Block 0xa93, offset 0x2a4c0 + 0x2a4c0: 0x2c047e83, 0x2a4c1: 0x2c048083, 0x2a4c2: 0x2c048484, 0x2a4c3: 0x2c048683, + 0x2a4c4: 0x2c048a83, 0x2a4c5: 0x2c048e83, 0x2a4c6: 0x2c049083, 0x2a4c7: 0x2c049684, + 0x2a4c8: 0x2c049883, 0x2a4c9: 0x2c049c85, 0x2a4ca: 0x2c049e84, 0x2a4cb: 0x2c04a683, + 0x2a4cc: 0x2c04a883, 0x2a4cd: 0x2c04ae83, 0x2a4ce: 0x2c04b483, 0x2a4cf: 0x2c04b683, + 0x2a4d0: 0x2c04bc83, 0x2a4d1: 0x2c04be83, 0x2a4d2: 0x2c04c283, 0x2a4d3: 0x2c04c483, + 0x2a4d4: 0x2c04c684, 0x2a4d5: 0x2c04d084, 0x2a4d6: 0x2c04d683, 0x2a4d7: 0x2c04de83, + 0x2a4d8: 0x2c04e083, 0x2a4d9: 0x2c04e483, 0x2a4da: 0x2c04e883, 0x2a4db: 0x2c04ec83, + 0x2a4dc: 0x2c04f083, 0x2a4dd: 0x2c04f483, 0x2a4de: 0x2c09ee83, 0x2a4df: 0x2c09f283, + 0x2a4e0: 0x2c09fa83, 0x2a4e1: 0x2c09fc83, 0x2a4e2: 0x2c09fe83, 0x2a4e3: 0x2c0a0284, + 0x2a4e4: 0x2c0a0683, 0x2a4e5: 0x2c0a0a83, 0x2a4e6: 0x2c0a1a83, 0x2a4e7: 0x2c0a2083, + 0x2a4e8: 0x2c0a2283, 0x2a4e9: 0x2c0a2483, 0x2a4ea: 0x2c0a2683, 0x2a4eb: 0x2c0a2883, + 0x2a4ec: 0x2c0a2a83, 0x2a4ed: 0x2c0a2c83, 0x2a4ee: 0x2c0a2e83, 0x2a4ef: 0x2c0a3083, + 0x2a4f0: 0x2c0a3483, 0x2a4f1: 0x2c0a3883, 0x2a4f2: 0x2c0a3c83, 0x2a4f3: 0x2c0a4083, + 0x2a4f4: 0x2c0a4483, 0x2a4f5: 0x2c141083, 0x2a4f6: 0x2c141483, 0x2a4f7: 0x2c141683, + 0x2a4f8: 0x2c143083, 0x2a4f9: 0x2c143483, 0x2a4fa: 0x2c143a83, 0x2a4fb: 0x2c144283, + 0x2a4fc: 0x2c144483, 0x2a4fd: 0x2c144883, 0x2a4fe: 0x2c144c83, 0x2a4ff: 0x2c145083, + // Block 0xa94, offset 0x2a500 + 0x2a500: 0x2c145283, 0x2a501: 0x2c145683, 0x2a502: 0x2c147a83, 0x2a503: 0x2c147e83, + 0x2a504: 0x2c148283, 0x2a505: 0x2c148883, 0x2a506: 0x2c149083, 0x2a507: 0x2c149283, + 0x2a508: 0x2c149483, 0x2a509: 0x2c149883, 0x2a50a: 0x2c149a83, 0x2a50b: 0x2c149e83, + 0x2a50c: 0x2c14ca83, 0x2a50d: 0x2c14cc83, 0x2a50e: 0x2c14ce83, 0x2a50f: 0x2c14d083, + 0x2a510: 0x2c14d283, 0x2a511: 0x2c14d483, 0x2a512: 0x2c26a083, 0x2a513: 0x2c26a683, + 0x2a514: 0x2c26aa83, 0x2a515: 0x2c26e683, 0x2a516: 0x2c26ea83, 0x2a517: 0x2c26ec83, + 0x2a518: 0x2c26f283, 0x2a519: 0x2c26f483, 0x2a51a: 0x2c26fa83, 0x2a51b: 0x2c26fc84, + 0x2a51c: 0x2c270283, 0x2a51d: 0x2c270683, 0x2a51e: 0x2c270e83, 0x2a51f: 0x2c271c83, + 0x2a520: 0x2c272083, 0x2a521: 0x2c272683, 0x2a522: 0x2c278a83, 0x2a523: 0x2c27ec83, + 0x2a524: 0x2c27ee83, 0x2a525: 0x2c27f083, 0x2a526: 0x2c41dc84, 0x2a527: 0x2c41fe83, + 0x2a528: 0x2c420283, 0x2a529: 0x2c421083, 0x2a52a: 0x2c427283, 0x2a52b: 0x2c427483, + 0x2a52c: 0x2c427883, 0x2a52d: 0x2c427a83, 0x2a52e: 0x2c427e83, 0x2a52f: 0x2c632e83, + 0x2a530: 0x2c633283, 0x2a531: 0x2c633483, 0x2a532: 0x2c633c83, 0x2a533: 0x2c633e83, + 0x2a534: 0x2c634083, 0x2a535: 0x2c634e83, 0x2a536: 0x2c635c83, 0x2a537: 0x2c636283, + 0x2a538: 0x2c637e83, 0x2a539: 0x2c638283, 0x2a53a: 0x2c8a8e83, 0x2a53b: 0x2c8aae83, + 0x2a53c: 0x2c8ab083, 0x2a53d: 0x2c8ab283, 0x2a53e: 0x2c8ab483, 0x2a53f: 0x2c8aba83, + // Block 0xa95, offset 0x2a540 + 0x2a540: 0x2c8abc83, 0x2a541: 0x2c8abe83, 0x2a542: 0x2cb74483, 0x2a543: 0x2cb75283, + 0x2a544: 0x2cb78283, 0x2a545: 0x2cb78683, 0x2a546: 0x2cb78a83, 0x2a547: 0x2cb79483, + 0x2a548: 0x2ce8b483, 0x2a549: 0x2ce8b883, 0x2a54a: 0x2ce8ba83, 0x2a54b: 0x2ce8be83, + 0x2a54c: 0x2d187483, 0x2a54d: 0x2d187883, 0x2a54e: 0x2d187a83, 0x2a54f: 0x2d188083, + 0x2a550: 0x2d478083, 0x2a551: 0x2d478283, 0x2a552: 0x2d75b683, 0x2a553: 0x2d9f9c83, + 0x2a554: 0x2d9f9e83, 0x2a555: 0x2dc24283, + 0x2a570: 0x40273a20, 0x2a571: 0x40273c20, 0x2a572: 0x40273e20, 0x2a573: 0x40274020, + 0x2a574: 0x40274220, 0x2a575: 0x40274420, 0x2a576: 0x40274620, 0x2a577: 0x40274820, + 0x2a578: 0x40274a20, 0x2a579: 0x40274c20, 0x2a57a: 0x40274e20, 0x2a57b: 0x40275020, + // Block 0xa96, offset 0x2a580 + 0x2a580: 0x00021283, 0x2a581: 0x40025c20, 0x2a582: 0x40030420, 0x2a583: 0x40051220, + 0x2a584: 0x40279a20, 0x2a585: 0x6c021420, 0x2a586: 0x6c002820, 0x2a587: 0x6c002a20, + 0x2a588: 0x40049c20, 0x2a589: 0x40049e20, 0x2a58a: 0x4004a020, 0x2a58b: 0x4004a220, + 0x2a58c: 0x4004a420, 0x2a58d: 0x4004a620, 0x2a58e: 0x4004a820, 0x2a58f: 0x4004aa20, + 0x2a590: 0x4004ac20, 0x2a591: 0x4004ae20, 0x2a592: 0x40279c20, 0x2a593: 0x40279e20, + 0x2a594: 0x4004b020, 0x2a595: 0x4004b220, 0x2a596: 0x4004b420, 0x2a597: 0x4004b620, + 0x2a598: 0x4004b820, 0x2a599: 0x4004ba20, 0x2a59a: 0x4004bc20, 0x2a59b: 0x4004be20, + 0x2a59c: 0x40023820, 0x2a59d: 0x4003ea20, 0x2a59e: 0x4003ec20, 0x2a59f: 0x4003ee20, + 0x2a5a0: 0x4027a020, 0x2a5a1: 0x6c002c20, 0x2a5a2: 0x6c00d220, 0x2a5a3: 0x6c021620, + 0x2a5a4: 0x6c00d420, 0x2a5a5: 0x6c002e20, 0x2a5a6: 0x6c00d620, 0x2a5a7: 0x6c021820, + 0x2a5a8: 0x6c053820, 0x2a5a9: 0x6c053a20, 0x2a5aa: 0xada12202, 0x2a5ab: 0xae412302, + 0x2a5ac: 0xae812402, 0x2a5ad: 0xade12502, 0x2a5ae: 0xae012602, 0x2a5af: 0xae012702, + 0x2a5b0: 0x40023a20, 0x2a5b1: 0x4027ce20, 0x2a5b2: 0xe0000152, 0x2a5b3: 0x4027d020, + 0x2a5b4: 0xe0000155, 0x2a5b5: 0x4027d220, 0x2a5b6: 0x00279c84, 0x2a5b7: 0x4027a220, + 0x2a5b8: 0x2c00b684, 0x2a5b9: 0x2c00e683, 0x2a5ba: 0x2c036883, 0x2a5bb: 0x6c003020, + 0x2a5bc: 0xe000231a, 0x2a5bd: 0x40051420, 0x2a5be: 0x4027a420, 0x2a5bf: 0x4027a620, + // Block 0xa97, offset 0x2a5c0 + 0x2a5c0: 0x00633a84, 0x2a5c1: 0x00634484, 0x2a5c2: 0x0064f684, 0x2a5c3: 0x0064f884, + 0x2a5c4: 0x00635a84, 0x2a5c5: 0x00635c84, 0x2a5c6: 0x00635e84, 0x2a5c7: 0x0063ee84, + 0x2a5c8: 0x0063f084, 0x2a5c9: 0x0063f684, 0x2a5ca: 0x00640884, 0x2a5cb: 0x00640a84, + 0x2a5cc: 0x00640e84, 0x2a5cd: 0x00642284, 0x2a5ce: 0x00642884, + 0x2a5d0: 0x4027a820, 0x2a5d1: 0x4027aa20, 0x2a5d2: 0x2c000285, 0x2a5d3: 0x2c007485, + 0x2a5d4: 0x2c00dc85, 0x2a5d5: 0x2c079084, 0x2a5d6: 0x2c00de84, 0x2a5d7: 0x2c023685, + 0x2a5d8: 0x2c00e084, 0x2a5d9: 0x2c0a0e83, 0x2a5da: 0x2c001083, 0x2a5db: 0x2c054883, + 0x2a5dc: 0x2c003283, 0x2a5dd: 0x2c03de84, 0x2a5de: 0x2c0ed083, 0x2a5df: 0x2c007e83, + 0x2a5e0: 0xe000237a, 0x2a5e1: 0xe0002383, 0x2a5e2: 0xe0002380, 0x2a5e3: 0xe000237d, + 0x2a5e4: 0x40661c20, 0x2a5e5: 0xe000238c, 0x2a5e6: 0x40661620, 0x2a5e7: 0xe0002389, + 0x2a5e8: 0xe000239e, 0x2a5e9: 0xe0002386, 0x2a5ea: 0xe0002395, 0x2a5eb: 0xe000239b, + 0x2a5ec: 0x40663420, 0x2a5ed: 0x4065f220, 0x2a5ee: 0xe000238f, 0x2a5ef: 0xe0002392, + 0x2a5f0: 0x40663020, 0x2a5f1: 0x40663220, 0x2a5f2: 0x40662c20, 0x2a5f3: 0xe0002398, + 0x2a5f4: 0x0065dc99, 0x2a5f5: 0x0065e699, 0x2a5f6: 0x0065ee99, 0x2a5f7: 0x0065f499, + 0x2a5f8: 0x40660c20, 0x2a5f9: 0x40660e20, 0x2a5fa: 0x40661020, + // Block 0xa98, offset 0x2a600 + 0x2a600: 0xf0000404, 0x2a601: 0xf0000404, 0x2a602: 0xf0000404, 0x2a603: 0xf0000404, + 0x2a604: 0xf0000404, 0x2a605: 0xf0000404, 0x2a606: 0xf0000404, 0x2a607: 0xf0000404, + 0x2a608: 0xf0000404, 0x2a609: 0xf0000404, 0x2a60a: 0xf0000404, 0x2a60b: 0xf0000404, + 0x2a60c: 0xf0000404, 0x2a60d: 0xf0000404, 0x2a60e: 0xe000004c, 0x2a60f: 0xe0000051, + 0x2a610: 0xe0000056, 0x2a611: 0xe000005b, 0x2a612: 0xe0000060, 0x2a613: 0xe0000065, + 0x2a614: 0xe000006a, 0x2a615: 0xe000006f, 0x2a616: 0xe0000083, 0x2a617: 0xe000008d, + 0x2a618: 0xe0000092, 0x2a619: 0xe0000097, 0x2a61a: 0xe000009c, 0x2a61b: 0xe00000a1, + 0x2a61c: 0xe0000088, 0x2a61d: 0xe0000074, 0x2a61e: 0xe000007c, + 0x2a620: 0xe000b549, 0x2a621: 0xe000b555, 0x2a622: 0xe000b561, 0x2a623: 0xe000b589, + 0x2a624: 0xe000b569, 0x2a625: 0xe000b56d, 0x2a626: 0xe000b54d, 0x2a627: 0xe000b559, + 0x2a628: 0xe000b551, 0x2a629: 0xe000b55d, 0x2a62a: 0xe000b575, 0x2a62b: 0xe000b581, + 0x2a62c: 0xe000b57d, 0x2a62d: 0xe000b579, 0x2a62e: 0xe000b5b9, 0x2a62f: 0xe000b565, + 0x2a630: 0xe000b571, 0x2a631: 0xe000b5bd, 0x2a632: 0xe000b599, 0x2a633: 0xe000b5b5, + 0x2a634: 0xe000b595, 0x2a635: 0xe000b5c1, 0x2a636: 0xe000b5c9, 0x2a637: 0xe000b5c5, + 0x2a638: 0xe000b5a5, 0x2a639: 0xe000b585, 0x2a63a: 0xe000b5ad, 0x2a63b: 0xe000b5b1, + 0x2a63c: 0xe000b5d5, 0x2a63d: 0xe000b58d, 0x2a63e: 0xe000b5d1, 0x2a63f: 0xe000b5a9, + // Block 0xa99, offset 0x2a640 + 0x2a640: 0xe000b5cd, 0x2a641: 0xe000b591, 0x2a642: 0xe000b59d, 0x2a643: 0xe000b5a1, + 0x2a644: 0x2c8e8e83, 0x2a645: 0x2c08be83, 0x2a646: 0x2c048483, 0x2a647: 0x2d326883, + 0x2a648: 0xe00002e3, 0x2a649: 0xe00003d8, 0x2a64a: 0xe00004b3, 0x2a64b: 0xe000057d, + 0x2a64c: 0xe0000648, 0x2a64d: 0xe00006f0, 0x2a64e: 0xe000079c, 0x2a64f: 0xe0000841, + 0x2a650: 0xe0000ec0, 0x2a651: 0xf0000606, 0x2a652: 0xf0000606, 0x2a653: 0xf0000606, + 0x2a654: 0xf0000606, 0x2a655: 0xf0000606, 0x2a656: 0xf0000606, 0x2a657: 0xf0000606, + 0x2a658: 0xf0000606, 0x2a659: 0xf0000606, 0x2a65a: 0xf0000606, 0x2a65b: 0xf0000606, + 0x2a65c: 0xf0000606, 0x2a65d: 0xf0000606, 0x2a65e: 0xf0000606, 0x2a65f: 0xf0000606, + 0x2a660: 0x0062ac86, 0x2a661: 0x0062b086, 0x2a662: 0x0062b286, 0x2a663: 0x0062b686, + 0x2a664: 0x0062b886, 0x2a665: 0x0062ba86, 0x2a666: 0x0062be86, 0x2a667: 0x0062c286, + 0x2a668: 0x0062c486, 0x2a669: 0x0062c886, 0x2a66a: 0x0062ca86, 0x2a66b: 0x0062cc86, + 0x2a66c: 0x0062ce86, 0x2a66d: 0x0062d086, 0x2a66e: 0xf0000606, 0x2a66f: 0xf0000606, + 0x2a670: 0xf0000606, 0x2a671: 0xf0000606, 0x2a672: 0xf0000606, 0x2a673: 0xf0000606, + 0x2a674: 0xf0000606, 0x2a675: 0xf0000606, 0x2a676: 0xf0000606, 0x2a677: 0xf0000606, + 0x2a678: 0xf0000606, 0x2a679: 0xf0000606, 0x2a67a: 0xf0000606, 0x2a67b: 0xf0000606, + 0x2a67c: 0xe0002127, 0x2a67d: 0xe0002122, 0x2a67e: 0xf0000606, 0x2a67f: 0x4027ac20, + // Block 0xa9a, offset 0x2a680 + 0x2a680: 0x2c000284, 0x2a681: 0x2c007484, 0x2a682: 0x2c00dc84, 0x2a683: 0x2c079083, + 0x2a684: 0x2c028883, 0x2a685: 0x2c02d883, 0x2a686: 0x2c003683, 0x2a687: 0x2c008883, + 0x2a688: 0x2c006283, 0x2a689: 0x2c00b683, 0x2a68a: 0x2c049c84, 0x2a68b: 0x2c04d083, + 0x2a68c: 0x2c04c683, 0x2a68d: 0x2c049e83, 0x2a68e: 0x2c41dc83, 0x2a68f: 0x2c018483, + 0x2a690: 0x2c049683, 0x2a691: 0x2c741683, 0x2a692: 0x2c127484, 0x2a693: 0x2c3cee83, + 0x2a694: 0x2c0e3e83, 0x2a695: 0x2c791683, 0x2a696: 0x2c86f083, 0x2a697: 0x2c7de083, + 0x2a698: 0x2c185283, 0x2a699: 0x2c7e3883, 0x2a69a: 0x2c24b683, 0x2a69b: 0x2c019483, + 0x2a69c: 0x2d6c7483, 0x2a69d: 0x2d9fc483, 0x2a69e: 0x2c0db883, 0x2a69f: 0x2c38fa83, + 0x2a6a0: 0x2ce74883, 0x2a6a1: 0x2c0bc083, 0x2a6a2: 0x2c063e83, 0x2a6a3: 0x2c097683, + 0x2a6a4: 0x2c00de83, 0x2a6a5: 0x2c023684, 0x2a6a6: 0x2c00e083, 0x2a6a7: 0x2c089284, + 0x2a6a8: 0x2c075484, 0x2a6a9: 0x2c18a683, 0x2a6aa: 0x2c300483, 0x2a6ab: 0x2c2fd883, + 0x2a6ac: 0x2d2efa83, 0x2a6ad: 0x2c0ba083, 0x2a6ae: 0x2d0f3883, 0x2a6af: 0x2c2bb283, + 0x2a6b0: 0x2c2e8e83, 0x2a6b1: 0xf0000606, 0x2a6b2: 0xf0000606, 0x2a6b3: 0xf0000606, + 0x2a6b4: 0xf0000606, 0x2a6b5: 0xf0000606, 0x2a6b6: 0xf0000606, 0x2a6b7: 0xf0000606, + 0x2a6b8: 0xf0000606, 0x2a6b9: 0xf0000606, 0x2a6ba: 0xf0000606, 0x2a6bb: 0xf0000606, + 0x2a6bc: 0xf0000606, 0x2a6bd: 0xf0000606, 0x2a6be: 0xf0000606, 0x2a6bf: 0xf0000606, + // Block 0xa9b, offset 0x2a6c0 + 0x2a6c0: 0xf0000203, 0x2a6c1: 0xf0000203, 0x2a6c2: 0xf0000203, 0x2a6c3: 0xf0000203, + 0x2a6c4: 0xf0000203, 0x2a6c5: 0xf0000203, 0x2a6c6: 0xf0000203, 0x2a6c7: 0xf0000203, + 0x2a6c8: 0xf0000203, 0x2a6c9: 0xe000b601, 0x2a6ca: 0xe000b60d, 0x2a6cb: 0xe000b619, + 0x2a6cc: 0xf0001c1d, 0x2a6cd: 0xe0000b85, 0x2a6ce: 0xf0001d1c, 0x2a6cf: 0xe0000d14, + 0x2a6d0: 0x00657693, 0x2a6d1: 0x00657893, 0x2a6d2: 0x00657a93, 0x2a6d3: 0x00657e93, + 0x2a6d4: 0x00658093, 0x2a6d5: 0x00658293, 0x2a6d6: 0x00658493, 0x2a6d7: 0x00658693, + 0x2a6d8: 0x00658893, 0x2a6d9: 0x00658a93, 0x2a6da: 0x00658c93, 0x2a6db: 0x00658e93, + 0x2a6dc: 0x00659093, 0x2a6dd: 0x00659293, 0x2a6de: 0x00659493, 0x2a6df: 0x00659693, + 0x2a6e0: 0x00659893, 0x2a6e1: 0x00659a93, 0x2a6e2: 0x00659c93, 0x2a6e3: 0x00659e93, + 0x2a6e4: 0x0065a093, 0x2a6e5: 0x0065a293, 0x2a6e6: 0x0065a493, 0x2a6e7: 0x0065a693, + 0x2a6e8: 0x0065a893, 0x2a6e9: 0x0065aa93, 0x2a6ea: 0x0065ac93, 0x2a6eb: 0x0065ae93, + 0x2a6ec: 0x0065b093, 0x2a6ed: 0x0065b293, 0x2a6ee: 0x0065b493, 0x2a6ef: 0x0065b693, + 0x2a6f0: 0x0065b893, 0x2a6f1: 0x0065ba93, 0x2a6f2: 0x0065bc93, 0x2a6f3: 0x0065be93, + 0x2a6f4: 0x0065c093, 0x2a6f5: 0x0065c493, 0x2a6f6: 0x0065c693, 0x2a6f7: 0x0065c893, + 0x2a6f8: 0x0065ca93, 0x2a6f9: 0x0065cc93, 0x2a6fa: 0x0065ce93, 0x2a6fb: 0x0065d093, + 0x2a6fc: 0x0065d293, 0x2a6fd: 0x0065d493, 0x2a6fe: 0x0065d693, + // Block 0xa9c, offset 0x2a700 + 0x2a700: 0xe000230b, 0x2a701: 0xe00022f8, 0x2a702: 0xe00022fc, 0x2a703: 0xe0002311, + 0x2a704: 0xe0002316, 0x2a705: 0xe000231d, 0x2a706: 0xe0002321, 0x2a707: 0xe0002325, + 0x2a708: 0xe000232b, 0x2a709: 0xf0001c1c, 0x2a70a: 0xe0002330, 0x2a70b: 0xe000233c, + 0x2a70c: 0xe0002340, 0x2a70d: 0xe0002337, 0x2a70e: 0xe0002346, 0x2a70f: 0xe000234b, + 0x2a710: 0xe000234f, 0x2a711: 0xe0002353, 0x2a712: 0xf0001c1c, 0x2a713: 0xe000235e, + 0x2a714: 0xe0002358, 0x2a715: 0xf0001c1c, 0x2a716: 0xe0002363, 0x2a717: 0xe000236d, + 0x2a718: 0xf0000203, 0x2a719: 0xf0000203, 0x2a71a: 0xf0000203, 0x2a71b: 0xf0000203, + 0x2a71c: 0xf0000203, 0x2a71d: 0xf0000203, 0x2a71e: 0xf0000203, 0x2a71f: 0xf0000203, + 0x2a720: 0xf0000203, 0x2a721: 0xf0000203, 0x2a722: 0xe000b605, 0x2a723: 0xe000b611, + 0x2a724: 0xe000b61d, 0x2a725: 0xe000b625, 0x2a726: 0xe000b62d, 0x2a727: 0xe000b635, + 0x2a728: 0xe000b63d, 0x2a729: 0xe000b645, 0x2a72a: 0xe000b64d, 0x2a72b: 0xe000b655, + 0x2a72c: 0xe000b65d, 0x2a72d: 0xe000b665, 0x2a72e: 0xe000b66d, 0x2a72f: 0xe000b675, + 0x2a730: 0xe000b67d, 0x2a731: 0xe0000c1e, 0x2a732: 0xf0001c1c, 0x2a733: 0xf0001d1d, + 0x2a734: 0xe0000a31, 0x2a735: 0xf0001d1c, 0x2a736: 0xf0001c1c, 0x2a737: 0xf0001c1c, + 0x2a738: 0xe0000ac2, 0x2a739: 0xe0000ac6, 0x2a73a: 0xf0001d1d, 0x2a73b: 0xf0000203, + 0x2a73c: 0xf0000203, 0x2a73d: 0xf0000203, 0x2a73e: 0xf0000203, 0x2a73f: 0xe000b69d, + // Block 0xa9d, offset 0x2a740 + 0x2a740: 0xf0001d1c, 0x2a741: 0xf0001d1d, 0x2a742: 0xe00009b7, 0x2a743: 0xf0001c1d, + 0x2a744: 0xf0001c1c, 0x2a745: 0xf0001c1c, 0x2a746: 0xe0000a66, 0x2a747: 0xe0000a7a, + 0x2a748: 0xf0001d1c, 0x2a749: 0xf0001c1d, 0x2a74a: 0xf0001c1c, 0x2a74b: 0xf0001d1d, + 0x2a74c: 0xf0001c1c, 0x2a74d: 0xf0001d1d, 0x2a74e: 0xf0001d1d, 0x2a74f: 0xf0001c1c, + 0x2a750: 0xf0001c1c, 0x2a751: 0xf0001c1c, 0x2a752: 0xe0000d0d, 0x2a753: 0xf0001c1c, + 0x2a754: 0xf0001c1c, 0x2a755: 0xe0000d3a, 0x2a756: 0xe0000d46, 0x2a757: 0xf0001d1d, + 0x2a758: 0xe0000eb0, 0x2a759: 0xe0000eb8, 0x2a75a: 0xf0001d1d, 0x2a75b: 0xf0001c1c, + 0x2a75c: 0xf0001c1d, 0x2a75d: 0xf0001c1d, 0x2a75e: 0xe00010b2, 0x2a75f: 0xe00009c8, + 0x2a760: 0xf0000203, 0x2a761: 0xf0000203, 0x2a762: 0xf0000203, 0x2a763: 0xf0000203, + 0x2a764: 0xf0000203, 0x2a765: 0xf0000203, 0x2a766: 0xf0000203, 0x2a767: 0xf0000203, + 0x2a768: 0xf0000203, 0x2a769: 0xe000b5fd, 0x2a76a: 0xe000b609, 0x2a76b: 0xe000b615, + 0x2a76c: 0xe000b621, 0x2a76d: 0xe000b629, 0x2a76e: 0xe000b631, 0x2a76f: 0xe000b639, + 0x2a770: 0xe000b641, 0x2a771: 0xe000b649, 0x2a772: 0xe000b651, 0x2a773: 0xe000b659, + 0x2a774: 0xe000b661, 0x2a775: 0xe000b669, 0x2a776: 0xe000b671, 0x2a777: 0xe000b679, + 0x2a778: 0xe000b681, 0x2a779: 0xe000b685, 0x2a77a: 0xe000b689, 0x2a77b: 0xe000b68d, + 0x2a77c: 0xe000b691, 0x2a77d: 0xe000b695, 0x2a77e: 0xe000b699, 0x2a77f: 0xe0000bdf, + // Block 0xa9e, offset 0x2a780 + 0x2a780: 0x6c053e20, 0x2a781: 0x6c0acc20, 0x2a782: 0x6c0ace20, 0x2a783: 0x6c00f620, + 0x2a784: 0x6c00f820, 0x2a785: 0x6c004e20, 0x2a786: 0x6c0aee20, 0x2a787: 0x6c011a20, + 0x2a788: 0x6c011c20, 0x2a789: 0x6c011e20, 0x2a78a: 0x6c025820, 0x2a78b: 0x6c025a20, + 0x2a78c: 0x6c059820, 0x2a78d: 0x6c059a20, 0x2a78e: 0x6c059c20, 0x2a78f: 0x6c059e20, + 0x2a790: 0x6c0b0e20, 0x2a791: 0x6c0b1020, 0x2a792: 0x6c0b1220, 0x2a793: 0x6c0b1420, + 0x2a794: 0x6c0b1620, 0x2a795: 0x6c0b1820, 0x2a796: 0x6c160a20, 0x2a797: 0x6c160c20, + 0x2a798: 0x6c160e20, 0x2a799: 0x6c28d820, 0x2a79a: 0x6c28da20, 0x2a79b: 0x6c28dc20, + 0x2a79c: 0x6c430a20, 0x2a79d: 0x6c430c20, 0x2a79e: 0x6c430e20, 0x2a79f: 0x6c431020, + 0x2a7a0: 0x6c431220, 0x2a7a1: 0x6c8b0620, 0x2a7a2: 0x6c8b0820, 0x2a7a3: 0x6c8b0a20, + 0x2a7a4: 0x6cb7b020, 0x2a7a5: 0x6d75d620, 0x2a7a6: 0x6de00620, 0x2a7a7: 0x6c027820, + 0x2a7a8: 0x6c28f220, 0x2a7a9: 0x6c28fa20, 0x2a7aa: 0x6c0b5020, 0x2a7ab: 0x6c0b5220, + 0x2a7ac: 0x6c163420, 0x2a7ad: 0x6c290c20, 0x2a7ae: 0x6ce8e420, 0x2a7af: 0x6d9fa820, + 0x2a7b0: 0x6c05b820, 0x2a7b1: 0x6c05ba20, 0x2a7b2: 0x6c05bc20, 0x2a7b3: 0x6c05be20, + 0x2a7b4: 0x6c05c020, 0x2a7b5: 0x6c05c220, 0x2a7b6: 0x6c05c420, 0x2a7b7: 0x6c05c620, + 0x2a7b8: 0x6c0b6820, 0x2a7b9: 0x6c0b6a20, 0x2a7ba: 0x6c0b6c20, 0x2a7bb: 0x6c0b6e20, + 0x2a7bc: 0x6c0b7020, 0x2a7bd: 0x6c0b7220, 0x2a7be: 0x6c0b7420, 0x2a7bf: 0x6c0b7620, + // Block 0xa9f, offset 0x2a7c0 + 0x2a7c0: 0x6c0b7820, 0x2a7c1: 0x6c164620, 0x2a7c2: 0x6c164820, 0x2a7c3: 0x6c164a20, + 0x2a7c4: 0x6c164c20, 0x2a7c5: 0x6c164e20, 0x2a7c6: 0x6c165020, 0x2a7c7: 0x6c165220, + 0x2a7c8: 0x6c165420, 0x2a7c9: 0x6c292220, 0x2a7ca: 0x6c292420, 0x2a7cb: 0x6c292620, + 0x2a7cc: 0x6c292820, 0x2a7cd: 0x6c292a20, 0x2a7ce: 0x6c292c20, 0x2a7cf: 0x6c292e20, + 0x2a7d0: 0x6c293020, 0x2a7d1: 0x6c293220, 0x2a7d2: 0x6c293420, 0x2a7d3: 0x6c293620, + 0x2a7d4: 0x6c293820, 0x2a7d5: 0x6c293a20, 0x2a7d6: 0x6c293c20, 0x2a7d7: 0x6c434620, + 0x2a7d8: 0x6c434820, 0x2a7d9: 0x6c434a20, 0x2a7da: 0x6c434c20, 0x2a7db: 0x6c434e20, + 0x2a7dc: 0x6c435020, 0x2a7dd: 0x6c435220, 0x2a7de: 0x6c435420, 0x2a7df: 0x6c435620, + 0x2a7e0: 0x6c435820, 0x2a7e1: 0x6c435a20, 0x2a7e2: 0x6c435c20, 0x2a7e3: 0x6c641a20, + 0x2a7e4: 0x6c8b3e20, 0x2a7e5: 0x6c641c20, 0x2a7e6: 0x6c641e20, 0x2a7e7: 0x6c642020, + 0x2a7e8: 0x6c642220, 0x2a7e9: 0x6c642420, 0x2a7ea: 0x6c642620, 0x2a7eb: 0x6c642820, + 0x2a7ec: 0x6c642a20, 0x2a7ed: 0x6c642c20, 0x2a7ee: 0x6c8b4020, 0x2a7ef: 0x6c8b4220, + 0x2a7f0: 0x6c8b4420, 0x2a7f1: 0x6c8b4620, 0x2a7f2: 0x6c8b4820, 0x2a7f3: 0x6cb7da20, + 0x2a7f4: 0x6cb7dc20, 0x2a7f5: 0x6cb7de20, 0x2a7f6: 0x6cb7e020, 0x2a7f7: 0x6cb7e220, + 0x2a7f8: 0x6cb7e420, 0x2a7f9: 0x6cb7e620, 0x2a7fa: 0x6cb7e820, 0x2a7fb: 0x6ce8fe20, + 0x2a7fc: 0x6ce90020, 0x2a7fd: 0x6ce90220, 0x2a7fe: 0x6ce90420, 0x2a7ff: 0x6ce90620, + // Block 0xaa0, offset 0x2a800 + 0x2a800: 0x6ce90820, 0x2a801: 0x6ce90a20, 0x2a802: 0x6d18ae20, 0x2a803: 0x6d18b020, + 0x2a804: 0x6d18b220, 0x2a805: 0x6d18b420, 0x2a806: 0x6d18b620, 0x2a807: 0x6d18b820, + 0x2a808: 0x6d18ba20, 0x2a809: 0x6d18bc20, 0x2a80a: 0x6d18be20, 0x2a80b: 0x6d18c020, + 0x2a80c: 0x6d18c220, 0x2a80d: 0x6d18c420, 0x2a80e: 0x6d18c620, 0x2a80f: 0x6d18c820, + 0x2a810: 0x6d18ca20, 0x2a811: 0x6d47b220, 0x2a812: 0x6d47b420, 0x2a813: 0x6d47b620, + 0x2a814: 0x6d47b820, 0x2a815: 0x6d47ba20, 0x2a816: 0x6d47bc20, 0x2a817: 0x6d47be20, + 0x2a818: 0x6d47c020, 0x2a819: 0x6d75f420, 0x2a81a: 0x6d75f620, 0x2a81b: 0x6d75f820, + 0x2a81c: 0x6d75fa20, 0x2a81d: 0x6d9faa20, 0x2a81e: 0x6d9fac20, 0x2a81f: 0x6dc24a20, + 0x2a820: 0x6dc24c20, 0x2a821: 0x6de00e20, 0x2a822: 0x6de01020, 0x2a823: 0x6de01220, + 0x2a824: 0x6df86e20, 0x2a825: 0x6df87020, 0x2a826: 0x6df87220, 0x2a827: 0x6e0c3e20, + 0x2a828: 0x6e0c4020, 0x2a829: 0x6e284a20, 0x2a82a: 0x6e3ce220, 0x2a82b: 0x6c0c4420, + 0x2a82c: 0x6c2a2c20, 0x2a82d: 0x6c657020, 0x2a82e: 0x6c8c6620, 0x2a82f: 0x6dc28c20, + 0x2a830: 0x6c061620, 0x2a831: 0x6c061820, 0x2a832: 0x6c0c5820, 0x2a833: 0x6c174e20, + 0x2a834: 0x6c175020, 0x2a835: 0x6c175c20, 0x2a836: 0x6c175e20, 0x2a837: 0x6c176020, + 0x2a838: 0x6c447420, 0x2a839: 0x6df89620, 0x2a83a: 0x6c2a5c20, 0x2a83b: 0x6c8c8420, + 0x2a83c: 0x6c8c8620, 0x2a83d: 0x6cb8f220, 0x2a83e: 0x6cea0820, 0x2a83f: 0x6e1c1c20, + // Block 0xaa1, offset 0x2a840 + 0x2a840: 0x6c02fa20, 0x2a841: 0x6c02fc20, 0x2a842: 0x6c449020, 0x2a843: 0x6cb8fc20, + 0x2a844: 0x6d487620, 0x2a845: 0x6c030620, 0x2a846: 0x6c0c9820, 0x2a847: 0x6c0c9a20, + 0x2a848: 0x6c178e20, 0x2a849: 0x6c2a7420, 0x2a84a: 0x6c2a7620, 0x2a84b: 0x6c2a7820, + 0x2a84c: 0x6c2a7a20, 0x2a84d: 0x6c2a7c20, 0x2a84e: 0x6c44a020, 0x2a84f: 0x6c44a220, + 0x2a850: 0x6c65c220, 0x2a851: 0x6c65c420, 0x2a852: 0x6c65c620, 0x2a853: 0x6c8c9620, + 0x2a854: 0x6cb90c20, 0x2a855: 0x6cb90e20, 0x2a856: 0x6cea1220, 0x2a857: 0x6d19ea20, + 0x2a858: 0x6c8cbe20, 0x2a859: 0x6c0cd220, 0x2a85a: 0x6c067c20, 0x2a85b: 0x6c067e20, + 0x2a85c: 0x6c068020, 0x2a85d: 0x6c0ce620, 0x2a85e: 0x6c0ce820, 0x2a85f: 0x6c17da20, + 0x2a860: 0x6c17dc20, 0x2a861: 0x6c2abc20, 0x2a862: 0x6c2abe20, 0x2a863: 0x6c2ac020, + 0x2a864: 0x6c2ac220, 0x2a865: 0x6c2ac420, 0x2a866: 0x6c2ac620, 0x2a867: 0x6c44e020, + 0x2a868: 0x6c44e220, 0x2a869: 0x6c44e420, 0x2a86a: 0x6c44e620, 0x2a86b: 0x6c44e820, + 0x2a86c: 0x6c661220, 0x2a86d: 0x6c661420, 0x2a86e: 0x6c661620, 0x2a86f: 0x6c661820, + 0x2a870: 0x6c661a20, 0x2a871: 0x6c8cd820, 0x2a872: 0x6c8cda20, 0x2a873: 0x6c8cdc20, + 0x2a874: 0x6c8cde20, 0x2a875: 0x6c8ce020, 0x2a876: 0x6c8ce220, 0x2a877: 0x6cb94620, + 0x2a878: 0x6cb94820, 0x2a879: 0x6cb94a20, 0x2a87a: 0x6cb94c20, 0x2a87b: 0x6cb94e20, + 0x2a87c: 0x6cea3c20, 0x2a87d: 0x6cea3e20, 0x2a87e: 0x6d1a0e20, 0x2a87f: 0x6d1a1020, + // Block 0xaa2, offset 0x2a880 + 0x2a880: 0x6d1a1220, 0x2a881: 0x6d1a1420, 0x2a882: 0x6d1a1620, 0x2a883: 0x6d1a1820, + 0x2a884: 0x6d1a1a20, 0x2a885: 0x6d1a1c20, 0x2a886: 0x6d1a1e20, 0x2a887: 0x6d1a2020, + 0x2a888: 0x6d1a2220, 0x2a889: 0x6d1a2420, 0x2a88a: 0x6d489620, 0x2a88b: 0x6d76a420, + 0x2a88c: 0x6d76a620, 0x2a88d: 0x6d76a820, 0x2a88e: 0x6da03020, 0x2a88f: 0x6da03220, + 0x2a890: 0x6dc2b620, 0x2a891: 0x6de05620, 0x2a892: 0x6df8a620, 0x2a893: 0x6c06a020, + 0x2a894: 0x6c0d3a20, 0x2a895: 0x6c0d3c20, 0x2a896: 0x6c0d3e20, 0x2a897: 0x6c183820, + 0x2a898: 0x6c183a20, 0x2a899: 0x6c2b4c20, 0x2a89a: 0x6c2b4e20, 0x2a89b: 0x6c2b5020, + 0x2a89c: 0x6c454e20, 0x2a89d: 0x6c66a620, 0x2a89e: 0x6c66a820, 0x2a89f: 0x6c66aa20, + 0x2a8a0: 0x6c8d4220, 0x2a8a1: 0x6cb9aa20, 0x2a8a2: 0x6d1a7620, 0x2a8a3: 0x6da05420, + 0x2a8a4: 0x6da05620, 0x2a8a5: 0x6da05820, 0x2a8a6: 0x6da05a20, 0x2a8a7: 0x6dc2c420, + 0x2a8a8: 0x6c8d6a20, 0x2a8a9: 0x6cb9d420, 0x2a8aa: 0x6ceac220, 0x2a8ab: 0x6c035820, + 0x2a8ac: 0x6c2b9a20, 0x2a8ad: 0x6c8d8020, 0x2a8ae: 0x6e123e20, 0x2a8af: 0x6c188c20, + 0x2a8b0: 0x6c188e20, 0x2a8b1: 0x6c8d8620, 0x2a8b2: 0x6cead220, 0x2a8b3: 0x6cead420, + 0x2a8b4: 0x6cead620, 0x2a8b5: 0x6d1aba20, 0x2a8b6: 0x6e3cf020, 0x2a8b7: 0x6c18a420, + 0x2a8b8: 0x6cb9f020, 0x2a8b9: 0x6c036620, 0x2a8ba: 0x6c0d8020, 0x2a8bb: 0x6c0d8220, + 0x2a8bc: 0x6ceae020, 0x2a8bd: 0x6c2bd420, 0x2a8be: 0x6c016e20, 0x2a8bf: 0x6c017020, + // Block 0xaa3, offset 0x2a8c0 + 0x2a8c0: 0x6c18d020, 0x2a8c1: 0x6c2bf220, 0x2a8c2: 0x6c0dc820, 0x2a8c3: 0x6c0dca20, + 0x2a8c4: 0x6c0dcc20, 0x2a8c5: 0x6c18dc20, 0x2a8c6: 0x6c18de20, 0x2a8c7: 0x6c18e020, + 0x2a8c8: 0x6c2c0020, 0x2a8c9: 0x6c2c0220, 0x2a8ca: 0x6c45f620, 0x2a8cb: 0x6c673220, + 0x2a8cc: 0x6c673420, 0x2a8cd: 0x6c673620, 0x2a8ce: 0x6cba0a20, 0x2a8cf: 0x6ceb0220, + 0x2a8d0: 0x6d1adc20, 0x2a8d1: 0x6d1ade20, 0x2a8d2: 0x6d491820, 0x2a8d3: 0x6da08620, + 0x2a8d4: 0x6e319620, 0x2a8d5: 0x6c039020, 0x2a8d6: 0x6c677020, 0x2a8d7: 0x6c8de220, + 0x2a8d8: 0x6c8de420, 0x2a8d9: 0x6d493a20, 0x2a8da: 0x6c039c20, 0x2a8db: 0x6c039e20, + 0x2a8dc: 0x6c0e0620, 0x2a8dd: 0x6c190c20, 0x2a8de: 0x6c2c3a20, 0x2a8df: 0x6c463e20, + 0x2a8e0: 0x6cba4220, 0x2a8e1: 0x6d1b2020, 0x2a8e2: 0x6d3d7420, 0x2a8e3: 0x6c073020, + 0x2a8e4: 0x6c073220, 0x2a8e5: 0x6c073420, 0x2a8e6: 0x6c0e1c20, 0x2a8e7: 0x6c0e1e20, + 0x2a8e8: 0x6c0e2020, 0x2a8e9: 0x6c192220, 0x2a8ea: 0x6c192420, 0x2a8eb: 0x6c192620, + 0x2a8ec: 0x6c192820, 0x2a8ed: 0x6c192a20, 0x2a8ee: 0x6c192c20, 0x2a8ef: 0x6c192e20, + 0x2a8f0: 0x6c193020, 0x2a8f1: 0x6c193220, 0x2a8f2: 0x6c193420, 0x2a8f3: 0x6c193620, + 0x2a8f4: 0x6c193820, 0x2a8f5: 0x6c193a20, 0x2a8f6: 0x6c193c20, 0x2a8f7: 0x6c2c5620, + 0x2a8f8: 0x6c2c5820, 0x2a8f9: 0x6c2c5a20, 0x2a8fa: 0x6c2c5c20, 0x2a8fb: 0x6c2c5e20, + 0x2a8fc: 0x6c2c6020, 0x2a8fd: 0x6c2c6220, 0x2a8fe: 0x6c2c6420, 0x2a8ff: 0x6c2c6620, + // Block 0xaa4, offset 0x2a900 + 0x2a900: 0x6c466820, 0x2a901: 0x6c466a20, 0x2a902: 0x6c466c20, 0x2a903: 0x6c466e20, + 0x2a904: 0x6c467020, 0x2a905: 0x6c467220, 0x2a906: 0x6c467420, 0x2a907: 0x6c467620, + 0x2a908: 0x6c467820, 0x2a909: 0x6c467a20, 0x2a90a: 0x6c467c20, 0x2a90b: 0x6c467e20, + 0x2a90c: 0x6c468020, 0x2a90d: 0x6c468220, 0x2a90e: 0x6c468420, 0x2a90f: 0x6c679a20, + 0x2a910: 0x6c679c20, 0x2a911: 0x6c679e20, 0x2a912: 0x6c67a020, 0x2a913: 0x6c67a220, + 0x2a914: 0x6c67a420, 0x2a915: 0x6c67a620, 0x2a916: 0x6c67a820, 0x2a917: 0x6c67aa20, + 0x2a918: 0x6c67ac20, 0x2a919: 0x6c67ae20, 0x2a91a: 0x6c67b020, 0x2a91b: 0x6c67b220, + 0x2a91c: 0x6c67b420, 0x2a91d: 0x6c67b620, 0x2a91e: 0x6c67b820, 0x2a91f: 0x6c8e1220, + 0x2a920: 0x6c8e1420, 0x2a921: 0x6c8e1620, 0x2a922: 0x6c8e1820, 0x2a923: 0x6c8e1a20, + 0x2a924: 0x6c8e1c20, 0x2a925: 0x6c8e1e20, 0x2a926: 0x6c8e2020, 0x2a927: 0x6c8e2220, + 0x2a928: 0x6c8e2420, 0x2a929: 0x6c8e2620, 0x2a92a: 0x6c8e2820, 0x2a92b: 0x6c8e2a20, + 0x2a92c: 0x6c8e2c20, 0x2a92d: 0x6c8e2e20, 0x2a92e: 0x6c8e3020, 0x2a92f: 0x6c8e3220, + 0x2a930: 0x6c8e3420, 0x2a931: 0x6c8e3620, 0x2a932: 0x6c8e3820, 0x2a933: 0x6c8e3a20, + 0x2a934: 0x6c8e3c20, 0x2a935: 0x6c8e3e20, 0x2a936: 0x6cba5c20, 0x2a937: 0x6cba5e20, + 0x2a938: 0x6cba6020, 0x2a939: 0x6cba6220, 0x2a93a: 0x6cba6420, 0x2a93b: 0x6cba6620, + 0x2a93c: 0x6cba6820, 0x2a93d: 0x6cba6a20, 0x2a93e: 0x6cba6c20, 0x2a93f: 0x6cba6e20, + // Block 0xaa5, offset 0x2a940 + 0x2a940: 0x6cba7020, 0x2a941: 0x6cba7220, 0x2a942: 0x6cba7420, 0x2a943: 0x6cba7620, + 0x2a944: 0x6cba7820, 0x2a945: 0x6cba7a20, 0x2a946: 0x6cba7c20, 0x2a947: 0x6cba7e20, + 0x2a948: 0x6cba8020, 0x2a949: 0x6cba8220, 0x2a94a: 0x6cba8420, 0x2a94b: 0x6cba8620, + 0x2a94c: 0x6cba8820, 0x2a94d: 0x6cba8a20, 0x2a94e: 0x6cba8c20, 0x2a94f: 0x6cba8e20, + 0x2a950: 0x6cba9020, 0x2a951: 0x6cba9220, 0x2a952: 0x6ceb4e20, 0x2a953: 0x6ceb5020, + 0x2a954: 0x6ceb5220, 0x2a955: 0x6ceb5420, 0x2a956: 0x6ceb5620, 0x2a957: 0x6ceb5820, + 0x2a958: 0x6ceb5a20, 0x2a959: 0x6ceb5c20, 0x2a95a: 0x6ceb5e20, 0x2a95b: 0x6ceb6020, + 0x2a95c: 0x6ceb6220, 0x2a95d: 0x6ceb6420, 0x2a95e: 0x6ceb6620, 0x2a95f: 0x6ceb6820, + 0x2a960: 0x6ceb6a20, 0x2a961: 0x6ceb6c20, 0x2a962: 0x6d1b3420, 0x2a963: 0x6d1b3620, + 0x2a964: 0x6d1b3820, 0x2a965: 0x6d1b3a20, 0x2a966: 0x6d1b3c20, 0x2a967: 0x6d1b3e20, + 0x2a968: 0x6d1b4020, 0x2a969: 0x6d1b4220, 0x2a96a: 0x6d1b4420, 0x2a96b: 0x6d1b4620, + 0x2a96c: 0x6d1b4820, 0x2a96d: 0x6d1b4a20, 0x2a96e: 0x6d1b4c20, 0x2a96f: 0x6d1b4e20, + 0x2a970: 0x6d1b5020, 0x2a971: 0x6d494e20, 0x2a972: 0x6d495020, 0x2a973: 0x6d495220, + 0x2a974: 0x6d495420, 0x2a975: 0x6d495620, 0x2a976: 0x6d495820, 0x2a977: 0x6d495a20, + 0x2a978: 0x6d495c20, 0x2a979: 0x6d495e20, 0x2a97a: 0x6d496020, 0x2a97b: 0x6d770e20, + 0x2a97c: 0x6d771020, 0x2a97d: 0x6d771220, 0x2a97e: 0x6d771420, 0x2a97f: 0x6d771620, + // Block 0xaa6, offset 0x2a980 + 0x2a980: 0x6d771820, 0x2a981: 0x6d771a20, 0x2a982: 0x6d771c20, 0x2a983: 0x6d771e20, + 0x2a984: 0x6d772020, 0x2a985: 0x6da09a20, 0x2a986: 0x6da09c20, 0x2a987: 0x6da09e20, + 0x2a988: 0x6da0a020, 0x2a989: 0x6dc2fa20, 0x2a98a: 0x6dc2fc20, 0x2a98b: 0x6dc2fe20, + 0x2a98c: 0x6dc30020, 0x2a98d: 0x6dc30220, 0x2a98e: 0x6dc30420, 0x2a98f: 0x6dc30620, + 0x2a990: 0x6de07e20, 0x2a991: 0x6de08020, 0x2a992: 0x6de08220, 0x2a993: 0x6df8cc20, + 0x2a994: 0x6df8ce20, 0x2a995: 0x6e0c9220, 0x2a996: 0x6e0c9420, 0x2a997: 0x6e0c9620, + 0x2a998: 0x6e1c2e20, 0x2a999: 0x6e287220, 0x2a99a: 0x6e287420, 0x2a99b: 0x6e384620, + 0x2a99c: 0x6e3cf820, 0x2a99d: 0x6c078820, 0x2a99e: 0x6c06a220, 0x2a99f: 0x6c0e9620, + 0x2a9a0: 0x6c2d7e20, 0x2a9a1: 0x6c2d8020, 0x2a9a2: 0x6c47dc20, 0x2a9a3: 0x6c694e20, + 0x2a9a4: 0x6d1cf020, 0x2a9a5: 0x6df92a20, 0x2a9a6: 0x6c07a020, 0x2a9a7: 0x6c1a9820, + 0x2a9a8: 0x6c1a9a20, 0x2a9a9: 0x6c1a9c20, 0x2a9aa: 0x6c1a9e20, 0x2a9ab: 0x6c1aa020, + 0x2a9ac: 0x6c1aa220, 0x2a9ad: 0x6c1aa420, 0x2a9ae: 0x6c1aa620, 0x2a9af: 0x6c1aa820, + 0x2a9b0: 0x6c1aaa20, 0x2a9b1: 0x6c2daa20, 0x2a9b2: 0x6c2dac20, 0x2a9b3: 0x6c2dae20, + 0x2a9b4: 0x6c2db020, 0x2a9b5: 0x6c2db220, 0x2a9b6: 0x6c480020, 0x2a9b7: 0x6c480220, + 0x2a9b8: 0x6c480420, 0x2a9b9: 0x6c480620, 0x2a9ba: 0x6c480820, 0x2a9bb: 0x6c480a20, + 0x2a9bc: 0x6c480c20, 0x2a9bd: 0x6c480e20, 0x2a9be: 0x6c481020, 0x2a9bf: 0x6c697e20, + // Block 0xaa7, offset 0x2a9c0 + 0x2a9c0: 0x6c698020, 0x2a9c1: 0x6c698220, 0x2a9c2: 0x6c698420, 0x2a9c3: 0x6c698620, + 0x2a9c4: 0x6c698820, 0x2a9c5: 0x6c698a20, 0x2a9c6: 0x6c698c20, 0x2a9c7: 0x6c904620, + 0x2a9c8: 0x6c904820, 0x2a9c9: 0x6c904a20, 0x2a9ca: 0x6c904c20, 0x2a9cb: 0x6c904e20, + 0x2a9cc: 0x6c905020, 0x2a9cd: 0x6c905220, 0x2a9ce: 0x6cbc6420, 0x2a9cf: 0x6cbc6620, + 0x2a9d0: 0x6cbc6820, 0x2a9d1: 0x6cbc6a20, 0x2a9d2: 0x6cbc6c20, 0x2a9d3: 0x6cbc6e20, + 0x2a9d4: 0x6cbc7020, 0x2a9d5: 0x6cbc7220, 0x2a9d6: 0x6cbc7420, 0x2a9d7: 0x6cbc7620, + 0x2a9d8: 0x6cbc7820, 0x2a9d9: 0x6ced4a20, 0x2a9da: 0x6ced4c20, 0x2a9db: 0x6ced4e20, + 0x2a9dc: 0x6ced5020, 0x2a9dd: 0x6ced5220, 0x2a9de: 0x6ced5420, 0x2a9df: 0x6ced5620, + 0x2a9e0: 0x6d1d1620, 0x2a9e1: 0x6d1d1820, 0x2a9e2: 0x6d1d1a20, 0x2a9e3: 0x6d1d1c20, + 0x2a9e4: 0x6d1d1e20, 0x2a9e5: 0x6d1d2020, 0x2a9e6: 0x6d1d2220, 0x2a9e7: 0x6d4ac820, + 0x2a9e8: 0x6d4aca20, 0x2a9e9: 0x6d4acc20, 0x2a9ea: 0x6d4ace20, 0x2a9eb: 0x6d4ad020, + 0x2a9ec: 0x6d4ad220, 0x2a9ed: 0x6d4ad420, 0x2a9ee: 0x6d4ad620, 0x2a9ef: 0x6d4ad820, + 0x2a9f0: 0x6d786620, 0x2a9f1: 0x6d786820, 0x2a9f2: 0x6d786a20, 0x2a9f3: 0x6d786c20, + 0x2a9f4: 0x6d786e20, 0x2a9f5: 0x6d787020, 0x2a9f6: 0x6d787220, 0x2a9f7: 0x6da18820, + 0x2a9f8: 0x6da18a20, 0x2a9f9: 0x6da18c20, 0x2a9fa: 0x6da18e20, 0x2a9fb: 0x6dc3e020, + 0x2a9fc: 0x6dc3e220, 0x2a9fd: 0x6dc3e420, 0x2a9fe: 0x6de10220, 0x2a9ff: 0x6de10420, + // Block 0xaa8, offset 0x2aa00 + 0x2aa00: 0x6df93220, 0x2aa01: 0x6e31c220, 0x2aa02: 0x6e385e20, 0x2aa03: 0x6cbd8620, + 0x2aa04: 0x6d4ba020, 0x2aa05: 0x6c48f020, 0x2aa06: 0x6c48f420, 0x2aa07: 0x6c48f620, + 0x2aa08: 0x6c07ce20, 0x2aa09: 0x6c2e8c20, 0x2aa0a: 0x6cbd9820, 0x2aa0b: 0x6d1e0c20, + 0x2aa0c: 0x6d1e0e20, 0x2aa0d: 0x6dc44620, 0x2aa0e: 0x6c07dc20, 0x2aa0f: 0x6c0f2c20, + 0x2aa10: 0x6c0f2e20, 0x2aa11: 0x6c0f3020, 0x2aa12: 0x6c1b8a20, 0x2aa13: 0x6c1b8c20, + 0x2aa14: 0x6c2e9a20, 0x2aa15: 0x6c2e9c20, 0x2aa16: 0x6c2e9e20, 0x2aa17: 0x6c2ea020, + 0x2aa18: 0x6c2ea220, 0x2aa19: 0x6c2ea420, 0x2aa1a: 0x6c490220, 0x2aa1b: 0x6c490420, + 0x2aa1c: 0x6c919820, 0x2aa1d: 0x6c919a20, 0x2aa1e: 0x6c919c20, 0x2aa1f: 0x6cbdb620, + 0x2aa20: 0x6cee7620, 0x2aa21: 0x6d791c20, 0x2aa22: 0x6c07fc20, 0x2aa23: 0x6c0f5620, + 0x2aa24: 0x6c0f5820, 0x2aa25: 0x6c0f5a20, 0x2aa26: 0x6c0f5c20, 0x2aa27: 0x6c0f5e20, + 0x2aa28: 0x6c0f6020, 0x2aa29: 0x6c1bc420, 0x2aa2a: 0x6c1bc620, 0x2aa2b: 0x6c1bc820, + 0x2aa2c: 0x6c1bca20, 0x2aa2d: 0x6c1bcc20, 0x2aa2e: 0x6c1bce20, 0x2aa2f: 0x6c1bd020, + 0x2aa30: 0x6c2ef420, 0x2aa31: 0x6c2ef620, 0x2aa32: 0x6c2ef820, 0x2aa33: 0x6c2efa20, + 0x2aa34: 0x6c2efc20, 0x2aa35: 0x6c2efe20, 0x2aa36: 0x6c2f0020, 0x2aa37: 0x6c2f0220, + 0x2aa38: 0x6c2f0420, 0x2aa39: 0x6c2f0620, 0x2aa3a: 0x6c2f0820, 0x2aa3b: 0x6c2f0a20, + 0x2aa3c: 0x6c2f0c20, 0x2aa3d: 0x6c2f0e20, 0x2aa3e: 0x6c2f1020, 0x2aa3f: 0x6c2f1220, + // Block 0xaa9, offset 0x2aa40 + 0x2aa40: 0x6c2f1420, 0x2aa41: 0x6c2f1620, 0x2aa42: 0x6c493e20, 0x2aa43: 0x6c494020, + 0x2aa44: 0x6c494220, 0x2aa45: 0x6c494420, 0x2aa46: 0x6c494620, 0x2aa47: 0x6c494820, + 0x2aa48: 0x6c494a20, 0x2aa49: 0x6c494c20, 0x2aa4a: 0x6c494e20, 0x2aa4b: 0x6c495020, + 0x2aa4c: 0x6c495220, 0x2aa4d: 0x6c6aea20, 0x2aa4e: 0x6c6aec20, 0x2aa4f: 0x6c6aee20, + 0x2aa50: 0x6c6af020, 0x2aa51: 0x6c6af220, 0x2aa52: 0x6c6af420, 0x2aa53: 0x6c6af620, + 0x2aa54: 0x6c6af820, 0x2aa55: 0x6c6afa20, 0x2aa56: 0x6c6afc20, 0x2aa57: 0x6c6afe20, + 0x2aa58: 0x6c6b0020, 0x2aa59: 0x6c6b0220, 0x2aa5a: 0x6c6b0420, 0x2aa5b: 0x6c6b0620, + 0x2aa5c: 0x6c6b0820, 0x2aa5d: 0x6c6b0a20, 0x2aa5e: 0x6c6b0c20, 0x2aa5f: 0x6c6b0e20, + 0x2aa60: 0x6c1bd220, 0x2aa61: 0x6c6b1020, 0x2aa62: 0x6c6b1220, 0x2aa63: 0x6c6b1420, + 0x2aa64: 0x6c6b1620, 0x2aa65: 0x6c91da20, 0x2aa66: 0x6c91dc20, 0x2aa67: 0x6c91de20, + 0x2aa68: 0x6c91e020, 0x2aa69: 0x6c91e220, 0x2aa6a: 0x6c91e420, 0x2aa6b: 0x6c91e620, + 0x2aa6c: 0x6c91e820, 0x2aa6d: 0x6c91ea20, 0x2aa6e: 0x6cbdf220, 0x2aa6f: 0x6cbdf420, + 0x2aa70: 0x6cbdf620, 0x2aa71: 0x6cbdf820, 0x2aa72: 0x6cbdfa20, 0x2aa73: 0x6cbdfc20, + 0x2aa74: 0x6cbdfe20, 0x2aa75: 0x6cbe0020, 0x2aa76: 0x6cbe0220, 0x2aa77: 0x6cbe0420, + 0x2aa78: 0x6cbe0620, 0x2aa79: 0x6cbe0820, 0x2aa7a: 0x6cbe0a20, 0x2aa7b: 0x6cbe0c20, + 0x2aa7c: 0x6cbe0e20, 0x2aa7d: 0x6cbe1020, 0x2aa7e: 0x6cbe1220, 0x2aa7f: 0x6cbe1420, + // Block 0xaaa, offset 0x2aa80 + 0x2aa80: 0x6cbe1620, 0x2aa81: 0x6cbe1820, 0x2aa82: 0x6cbe1a20, 0x2aa83: 0x6cbe1c20, + 0x2aa84: 0x6cbe1e20, 0x2aa85: 0x6ceea620, 0x2aa86: 0x6ceea820, 0x2aa87: 0x6ceeaa20, + 0x2aa88: 0x6ceeac20, 0x2aa89: 0x6ceeae20, 0x2aa8a: 0x6ceeb020, 0x2aa8b: 0x6ceeb220, + 0x2aa8c: 0x6ceeb420, 0x2aa8d: 0x6ceeb620, 0x2aa8e: 0x6ceeb820, 0x2aa8f: 0x6ceeba20, + 0x2aa90: 0x6ceebc20, 0x2aa91: 0x6ceebe20, 0x2aa92: 0x6ceec020, 0x2aa93: 0x6ceec220, + 0x2aa94: 0x6ceec420, 0x2aa95: 0x6d1e5220, 0x2aa96: 0x6d1e5420, 0x2aa97: 0x6d1e5620, + 0x2aa98: 0x6d1e5820, 0x2aa99: 0x6d1e5a20, 0x2aa9a: 0x6d1e5c20, 0x2aa9b: 0x6d1e5e20, + 0x2aa9c: 0x6d1e6020, 0x2aa9d: 0x6d1e6220, 0x2aa9e: 0x6d1e6420, 0x2aa9f: 0x6d1e6620, + 0x2aaa0: 0x6d1e6820, 0x2aaa1: 0x6d1e6a20, 0x2aaa2: 0x6d1e6c20, 0x2aaa3: 0x6d4bde20, + 0x2aaa4: 0x6d4be020, 0x2aaa5: 0x6d4be220, 0x2aaa6: 0x6d4be420, 0x2aaa7: 0x6d4be620, + 0x2aaa8: 0x6d4be820, 0x2aaa9: 0x6d793820, 0x2aaaa: 0x6d793a20, 0x2aaab: 0x6d793c20, + 0x2aaac: 0x6d793e20, 0x2aaad: 0x6d794020, 0x2aaae: 0x6da22220, 0x2aaaf: 0x6da22420, + 0x2aab0: 0x6dc45420, 0x2aab1: 0x6dc45620, 0x2aab2: 0x6de15a20, 0x2aab3: 0x6de15c20, + 0x2aab4: 0x6de15e20, 0x2aab5: 0x6de16020, 0x2aab6: 0x6df95c20, 0x2aab7: 0x6df95e20, + 0x2aab8: 0x6df96020, 0x2aab9: 0x6e0d2820, 0x2aaba: 0x6e1c9820, 0x2aabb: 0x6e3d1620, + 0x2aabc: 0x6e3d1820, 0x2aabd: 0x6c0fa620, 0x2aabe: 0x6c1c6220, 0x2aabf: 0x6c1c6420, + // Block 0xaab, offset 0x2aac0 + 0x2aac0: 0x6c2fc820, 0x2aac1: 0x6c4a1c20, 0x2aac2: 0x6c6bdc20, 0x2aac3: 0x6c6bde20, + 0x2aac4: 0x6cbf4220, 0x2aac5: 0x6cef7820, 0x2aac6: 0x6d4cb620, 0x2aac7: 0x6d79e020, + 0x2aac8: 0x6e386820, 0x2aac9: 0x6c03f620, 0x2aaca: 0x6c081e20, 0x2aacb: 0x6c082020, + 0x2aacc: 0x6c0fb820, 0x2aacd: 0x6c0fba20, 0x2aace: 0x6c1c8620, 0x2aacf: 0x6c1c8820, + 0x2aad0: 0x6c1c8a20, 0x2aad1: 0x6c1c8c20, 0x2aad2: 0x6c2ffa20, 0x2aad3: 0x6c4a4020, + 0x2aad4: 0x6c4a4220, 0x2aad5: 0x6c4a4420, 0x2aad6: 0x6c4a4620, 0x2aad7: 0x6c6bf620, + 0x2aad8: 0x6c6bf820, 0x2aad9: 0x6c6bfa20, 0x2aada: 0x6c6bfc20, 0x2aadb: 0x6c932220, + 0x2aadc: 0x6c932420, 0x2aadd: 0x6c932620, 0x2aade: 0x6c932820, 0x2aadf: 0x6c932a20, + 0x2aae0: 0x6c932c20, 0x2aae1: 0x6c932e20, 0x2aae2: 0x6cbf6420, 0x2aae3: 0x6cbf6620, + 0x2aae4: 0x6cef9a20, 0x2aae5: 0x6cef9c20, 0x2aae6: 0x6cef9e20, 0x2aae7: 0x6cefa020, + 0x2aae8: 0x6cefa220, 0x2aae9: 0x6d1f3c20, 0x2aaea: 0x6d1f3e20, 0x2aaeb: 0x6d1f4020, + 0x2aaec: 0x6d1f4220, 0x2aaed: 0x6d4cc820, 0x2aaee: 0x6d4cca20, 0x2aaef: 0x6d4ccc20, + 0x2aaf0: 0x6dc49420, 0x2aaf1: 0x6e0d4620, 0x2aaf2: 0x6e3d1a20, 0x2aaf3: 0x6c083020, + 0x2aaf4: 0x6c1cbc20, 0x2aaf5: 0x6c304420, 0x2aaf6: 0x6c6c7220, 0x2aaf7: 0x6cbfd420, + 0x2aaf8: 0x6c6c7c20, 0x2aaf9: 0x6cbfea20, 0x2aafa: 0x6d1fba20, 0x2aafb: 0x6d4d3820, + 0x2aafc: 0x6c0ffa20, 0x2aafd: 0x6c1cd620, 0x2aafe: 0x6c306a20, 0x2aaff: 0x6c306c20, + // Block 0xaac, offset 0x2ab00 + 0x2ab00: 0x6c4aba20, 0x2ab01: 0x6c4abc20, 0x2ab02: 0x6c6c9420, 0x2ab03: 0x6c93b820, + 0x2ab04: 0x6c93ba20, 0x2ab05: 0x6c93bc20, 0x2ab06: 0x6c93be20, 0x2ab07: 0x6cc00220, + 0x2ab08: 0x6cc00420, 0x2ab09: 0x6cf01220, 0x2ab0a: 0x6cf01420, 0x2ab0b: 0x6c085020, + 0x2ab0c: 0x6c100a20, 0x2ab0d: 0x6c100c20, 0x2ab0e: 0x6c1cf820, 0x2ab0f: 0x6c308020, + 0x2ab10: 0x6c308220, 0x2ab11: 0x6c308420, 0x2ab12: 0x6c4acc20, 0x2ab13: 0x6c4ace20, + 0x2ab14: 0x6c4ad020, 0x2ab15: 0x6c4ad220, 0x2ab16: 0x6c4ad420, 0x2ab17: 0x6c6cac20, + 0x2ab18: 0x6c93cc20, 0x2ab19: 0x6c93ce20, 0x2ab1a: 0x6cc02020, 0x2ab1b: 0x6cc02220, + 0x2ab1c: 0x6d1fda20, 0x2ab1d: 0x6d1fdc20, 0x2ab1e: 0x6d1fde20, 0x2ab1f: 0x6d4d5e20, + 0x2ab20: 0x6d4d6020, 0x2ab21: 0x6de1be20, 0x2ab22: 0x6c040c20, 0x2ab23: 0x6c1d1e20, + 0x2ab24: 0x6c086420, 0x2ab25: 0x6c086620, 0x2ab26: 0x6c086820, 0x2ab27: 0x6c086a20, + 0x2ab28: 0x6c103620, 0x2ab29: 0x6c103820, 0x2ab2a: 0x6c103a20, 0x2ab2b: 0x6c103c20, + 0x2ab2c: 0x6c103e20, 0x2ab2d: 0x6c104020, 0x2ab2e: 0x6c104220, 0x2ab2f: 0x6c104420, + 0x2ab30: 0x6c1d2c20, 0x2ab31: 0x6c1d2e20, 0x2ab32: 0x6c1d3020, 0x2ab33: 0x6c1d3220, + 0x2ab34: 0x6c1d3420, 0x2ab35: 0x6c1d3620, 0x2ab36: 0x6c1d3820, 0x2ab37: 0x6c1d2020, + 0x2ab38: 0x6c1d3a20, 0x2ab39: 0x6c30b820, 0x2ab3a: 0x6c30ba20, 0x2ab3b: 0x6c30bc20, + 0x2ab3c: 0x6c30be20, 0x2ab3d: 0x6c30c020, 0x2ab3e: 0x6c30c220, 0x2ab3f: 0x6c30c420, + // Block 0xaad, offset 0x2ab40 + 0x2ab40: 0x6c30c620, 0x2ab41: 0x6c30c820, 0x2ab42: 0x6c30ca20, 0x2ab43: 0x6c30cc20, + 0x2ab44: 0x6c4b2020, 0x2ab45: 0x6c4b2220, 0x2ab46: 0x6c4b2420, 0x2ab47: 0x6c6d0020, + 0x2ab48: 0x6c6d0220, 0x2ab49: 0x6c6d0420, 0x2ab4a: 0x6c6d0620, 0x2ab4b: 0x6c6d0820, + 0x2ab4c: 0x6c6d0a20, 0x2ab4d: 0x6c6d0c20, 0x2ab4e: 0x6c6d0e20, 0x2ab4f: 0x6c6d1020, + 0x2ab50: 0x6c6d1220, 0x2ab51: 0x6c6d1420, 0x2ab52: 0x6c6d1620, 0x2ab53: 0x6c6d1820, + 0x2ab54: 0x6c6d1a20, 0x2ab55: 0x6c6d1c20, 0x2ab56: 0x6c6d1e20, 0x2ab57: 0x6c941620, + 0x2ab58: 0x6c941820, 0x2ab59: 0x6c941a20, 0x2ab5a: 0x6c941c20, 0x2ab5b: 0x6c941e20, + 0x2ab5c: 0x6c942020, 0x2ab5d: 0x6c942220, 0x2ab5e: 0x6c942420, 0x2ab5f: 0x6c942620, + 0x2ab60: 0x6c942820, 0x2ab61: 0x6c942a20, 0x2ab62: 0x6c942c20, 0x2ab63: 0x6c942e20, + 0x2ab64: 0x6c943020, 0x2ab65: 0x6c943220, 0x2ab66: 0x6cc07020, 0x2ab67: 0x6cc07220, + 0x2ab68: 0x6cc07420, 0x2ab69: 0x6cc07620, 0x2ab6a: 0x6cc07820, 0x2ab6b: 0x6cc07a20, + 0x2ab6c: 0x6cc07c20, 0x2ab6d: 0x6cc07e20, 0x2ab6e: 0x6cc08020, 0x2ab6f: 0x6cc08220, + 0x2ab70: 0x6cf06820, 0x2ab71: 0x6cf06a20, 0x2ab72: 0x6cf06c20, 0x2ab73: 0x6cf06e20, + 0x2ab74: 0x6cf07020, 0x2ab75: 0x6cf07220, 0x2ab76: 0x6cf07420, 0x2ab77: 0x6cf07620, + 0x2ab78: 0x6cf07820, 0x2ab79: 0x6d200020, 0x2ab7a: 0x6d200220, 0x2ab7b: 0x6d200420, + 0x2ab7c: 0x6d200620, 0x2ab7d: 0x6d200820, 0x2ab7e: 0x6d200a20, 0x2ab7f: 0x6d200c20, + // Block 0xaae, offset 0x2ab80 + 0x2ab80: 0x6d200e20, 0x2ab81: 0x6d201020, 0x2ab82: 0x6d201220, 0x2ab83: 0x6d201420, + 0x2ab84: 0x6d201620, 0x2ab85: 0x6d4d9420, 0x2ab86: 0x6d4d9620, 0x2ab87: 0x6d4d9820, + 0x2ab88: 0x6d4d9a20, 0x2ab89: 0x6d4d9c20, 0x2ab8a: 0x6d4d9e20, 0x2ab8b: 0x6d4da020, + 0x2ab8c: 0x6d4da220, 0x2ab8d: 0x6d4da420, 0x2ab8e: 0x6d4da620, 0x2ab8f: 0x6d4da820, + 0x2ab90: 0x6d4daa20, 0x2ab91: 0x6d7a6020, 0x2ab92: 0x6d7a6220, 0x2ab93: 0x6d7a6420, + 0x2ab94: 0x6d7a6620, 0x2ab95: 0x6d7a6820, 0x2ab96: 0x6d7a6a20, 0x2ab97: 0x6d7a6c20, + 0x2ab98: 0x6da2e220, 0x2ab99: 0x6da2e420, 0x2ab9a: 0x6da2e620, 0x2ab9b: 0x6da2e820, + 0x2ab9c: 0x6da2ea20, 0x2ab9d: 0x6dc4d020, 0x2ab9e: 0x6dc4d220, 0x2ab9f: 0x6dc4d420, + 0x2aba0: 0x6de1d020, 0x2aba1: 0x6de1d220, 0x2aba2: 0x6de1d420, 0x2aba3: 0x6de1d620, + 0x2aba4: 0x6df9b020, 0x2aba5: 0x6e0d7020, 0x2aba6: 0x6e0d7220, 0x2aba7: 0x6e1cd620, + 0x2aba8: 0x6e429020, 0x2aba9: 0x6c109220, 0x2abaa: 0x6c041c20, 0x2abab: 0x6c6de820, + 0x2abac: 0x6c6dea20, 0x2abad: 0x6cc16e20, 0x2abae: 0x6d4e4c20, 0x2abaf: 0x6c08a020, + 0x2abb0: 0x6c318820, 0x2abb1: 0x6c955820, 0x2abb2: 0x6c08a620, 0x2abb3: 0x6c08a820, + 0x2abb4: 0x6c10ae20, 0x2abb5: 0x6c10b020, 0x2abb6: 0x6c10b220, 0x2abb7: 0x6c1dea20, + 0x2abb8: 0x6c1dec20, 0x2abb9: 0x6c1dee20, 0x2abba: 0x6c1df020, 0x2abbb: 0x6c1df220, + 0x2abbc: 0x6c1df420, 0x2abbd: 0x6c319220, 0x2abbe: 0x6c319420, 0x2abbf: 0x6c319620, + // Block 0xaaf, offset 0x2abc0 + 0x2abc0: 0x6c319820, 0x2abc1: 0x6c4bf020, 0x2abc2: 0x6c4bf220, 0x2abc3: 0x6c4bf420, + 0x2abc4: 0x6c4bf620, 0x2abc5: 0x6c4bf820, 0x2abc6: 0x6c4bfa20, 0x2abc7: 0x6c6dfc20, + 0x2abc8: 0x6c6dfe20, 0x2abc9: 0x6c956420, 0x2abca: 0x6c956620, 0x2abcb: 0x6c956820, + 0x2abcc: 0x6c956a20, 0x2abcd: 0x6c956c20, 0x2abce: 0x6c956e20, 0x2abcf: 0x6cc18820, + 0x2abd0: 0x6cc18a20, 0x2abd1: 0x6cc18c20, 0x2abd2: 0x6cc18e20, 0x2abd3: 0x6cc19020, + 0x2abd4: 0x6cc19220, 0x2abd5: 0x6cc19420, 0x2abd6: 0x6cc19620, 0x2abd7: 0x6cf11a20, + 0x2abd8: 0x6cf11c20, 0x2abd9: 0x6cf11e20, 0x2abda: 0x6cf12020, 0x2abdb: 0x6cf12220, + 0x2abdc: 0x6d20c020, 0x2abdd: 0x6d20c220, 0x2abde: 0x6d20c420, 0x2abdf: 0x6d20c620, + 0x2abe0: 0x6d4e5a20, 0x2abe1: 0x6d4e5c20, 0x2abe2: 0x6d7ae820, 0x2abe3: 0x6d7aea20, + 0x2abe4: 0x6d7aec20, 0x2abe5: 0x6da35c20, 0x2abe6: 0x6da35e20, 0x2abe7: 0x6df9dc20, + 0x2abe8: 0x6df9de20, 0x2abe9: 0x6e1d0420, 0x2abea: 0x6e1d0620, 0x2abeb: 0x6cc1fc20, + 0x2abec: 0x6cc1fe20, 0x2abed: 0x6d210c20, 0x2abee: 0x6d7b2420, 0x2abef: 0x6c10e420, + 0x2abf0: 0x6c10e620, 0x2abf1: 0x6c10e820, 0x2abf2: 0x6c1e4220, 0x2abf3: 0x6c1e4420, + 0x2abf4: 0x6c31f220, 0x2abf5: 0x6c31f420, 0x2abf6: 0x6c31f620, 0x2abf7: 0x6c31f820, + 0x2abf8: 0x6c31fa20, 0x2abf9: 0x6c31fc20, 0x2abfa: 0x6c31fe20, 0x2abfb: 0x6c320020, + 0x2abfc: 0x6c4c6820, 0x2abfd: 0x6c4c6a20, 0x2abfe: 0x6c4c6c20, 0x2abff: 0x6c4c6e20, + // Block 0xab0, offset 0x2ac00 + 0x2ac00: 0x6c4c7020, 0x2ac01: 0x6c4c7220, 0x2ac02: 0x6c4c7420, 0x2ac03: 0x6c6e6020, + 0x2ac04: 0x6c6e6220, 0x2ac05: 0x6c6e6420, 0x2ac06: 0x6c6e6620, 0x2ac07: 0x6c6e6820, + 0x2ac08: 0x6c95d820, 0x2ac09: 0x6c95da20, 0x2ac0a: 0x6c95dc20, 0x2ac0b: 0x6c95de20, + 0x2ac0c: 0x6c95e020, 0x2ac0d: 0x6cc20420, 0x2ac0e: 0x6cc20620, 0x2ac0f: 0x6cc20820, + 0x2ac10: 0x6cc20a20, 0x2ac11: 0x6cf16a20, 0x2ac12: 0x6d211620, 0x2ac13: 0x6d211820, + 0x2ac14: 0x6d211a20, 0x2ac15: 0x6d211c20, 0x2ac16: 0x6d4eb620, 0x2ac17: 0x6d4eb820, + 0x2ac18: 0x6d4eba20, 0x2ac19: 0x6d7b2620, 0x2ac1a: 0x6d7b2820, 0x2ac1b: 0x6d7b2a20, + 0x2ac1c: 0x6d7b2c20, 0x2ac1d: 0x6de23020, 0x2ac1e: 0x6df9ec20, 0x2ac1f: 0x6c110820, + 0x2ac20: 0x6c324420, 0x2ac21: 0x6d217420, 0x2ac22: 0x6d4f0020, 0x2ac23: 0x6d7b5c20, + 0x2ac24: 0x6c1ea620, 0x2ac25: 0x6c4ce020, 0x2ac26: 0x6cf1b820, 0x2ac27: 0x6c044820, + 0x2ac28: 0x6c112020, 0x2ac29: 0x6c112220, 0x2ac2a: 0x6c112420, 0x2ac2b: 0x6c112620, + 0x2ac2c: 0x6c1eb220, 0x2ac2d: 0x6c1eb420, 0x2ac2e: 0x6c326020, 0x2ac2f: 0x6c326220, + 0x2ac30: 0x6c326420, 0x2ac31: 0x6c326620, 0x2ac32: 0x6c4cec20, 0x2ac33: 0x6c4cee20, + 0x2ac34: 0x6c4cf020, 0x2ac35: 0x6c4cf220, 0x2ac36: 0x6c4cf420, 0x2ac37: 0x6c4cf620, + 0x2ac38: 0x6c6ed820, 0x2ac39: 0x6c6eda20, 0x2ac3a: 0x6c966820, 0x2ac3b: 0x6c966a20, + 0x2ac3c: 0x6c966c20, 0x2ac3d: 0x6cc27e20, 0x2ac3e: 0x6cc28020, 0x2ac3f: 0x6cc28220, + // Block 0xab1, offset 0x2ac40 + 0x2ac40: 0x6cf1c220, 0x2ac41: 0x6cf1c420, 0x2ac42: 0x6cf1c620, 0x2ac43: 0x6d218420, + 0x2ac44: 0x6d4f0820, 0x2ac45: 0x6d4f0a20, 0x2ac46: 0x6e0dac20, 0x2ac47: 0x6c329a20, + 0x2ac48: 0x6d7b7820, 0x2ac49: 0x6c115620, 0x2ac4a: 0x6c1ede20, 0x2ac4b: 0x6c32a420, + 0x2ac4c: 0x6c32a620, 0x2ac4d: 0x6c32a820, 0x2ac4e: 0x6c96aa20, 0x2ac4f: 0x6cc2ae20, + 0x2ac50: 0x6cc2b020, 0x2ac51: 0x6d21b220, 0x2ac52: 0x6d4f2620, 0x2ac53: 0x6d7b8220, + 0x2ac54: 0x6c090020, 0x2ac55: 0x6c116020, 0x2ac56: 0x6c1eea20, 0x2ac57: 0x6c1eec20, + 0x2ac58: 0x6c32b420, 0x2ac59: 0x6c32b620, 0x2ac5a: 0x6c4d3c20, 0x2ac5b: 0x6c4d3e20, + 0x2ac5c: 0x6c4d4020, 0x2ac5d: 0x6c4d4220, 0x2ac5e: 0x6c4d4420, 0x2ac5f: 0x6c4d4620, + 0x2ac60: 0x6c4d4820, 0x2ac61: 0x6c4d4a20, 0x2ac62: 0x6c6f1220, 0x2ac63: 0x6c6f1420, + 0x2ac64: 0x6c96c620, 0x2ac65: 0x6c96c820, 0x2ac66: 0x6c96ca20, 0x2ac67: 0x6c96cc20, + 0x2ac68: 0x6c96ce20, 0x2ac69: 0x6c96d020, 0x2ac6a: 0x6cc2c020, 0x2ac6b: 0x6cc2c220, + 0x2ac6c: 0x6cc2c420, 0x2ac6d: 0x6cc2c620, 0x2ac6e: 0x6cc2c820, 0x2ac6f: 0x6cf1f620, + 0x2ac70: 0x6d21bc20, 0x2ac71: 0x6d21be20, 0x2ac72: 0x6d21c020, 0x2ac73: 0x6d4f3620, + 0x2ac74: 0x6d4f3820, 0x2ac75: 0x6d7b8c20, 0x2ac76: 0x6d7b8e20, 0x2ac77: 0x6da3c020, + 0x2ac78: 0x6de27220, 0x2ac79: 0x6dfa1a20, 0x2ac7a: 0x6c090620, 0x2ac7b: 0x6c116e20, + 0x2ac7c: 0x6c117220, 0x2ac7d: 0x6c1f1c20, 0x2ac7e: 0x6c117420, 0x2ac7f: 0x6c117620, + // Block 0xab2, offset 0x2ac80 + 0x2ac80: 0x6c1f1e20, 0x2ac81: 0x6c32e020, 0x2ac82: 0x6c32e220, 0x2ac83: 0x6c1f3220, + 0x2ac84: 0x6c1f3420, 0x2ac85: 0x6c32e420, 0x2ac86: 0x6c1f3620, 0x2ac87: 0x6c1f3820, + 0x2ac88: 0x6c1f3a20, 0x2ac89: 0x6c1f3c20, 0x2ac8a: 0x6c1f3e20, 0x2ac8b: 0x6c1f4020, + 0x2ac8c: 0x6c32fc20, 0x2ac8d: 0x6c4d7c20, 0x2ac8e: 0x6c4d7e20, 0x2ac8f: 0x6c32fe20, + 0x2ac90: 0x6c330020, 0x2ac91: 0x6c330220, 0x2ac92: 0x6c330420, 0x2ac93: 0x6c330620, + 0x2ac94: 0x6c330820, 0x2ac95: 0x6c330a20, 0x2ac96: 0x6c330c20, 0x2ac97: 0x6c4d8020, + 0x2ac98: 0x6c330e20, 0x2ac99: 0x6c4d8220, 0x2ac9a: 0x6c4da220, 0x2ac9b: 0x6c4da420, + 0x2ac9c: 0x6c4da620, 0x2ac9d: 0x6c4da820, 0x2ac9e: 0x6c4daa20, 0x2ac9f: 0x6c6f5620, + 0x2aca0: 0x6c6f5820, 0x2aca1: 0x6c4dac20, 0x2aca2: 0x6c4dae20, 0x2aca3: 0x6c6f5a20, + 0x2aca4: 0x6c4db020, 0x2aca5: 0x6c4db220, 0x2aca6: 0x6c4db420, 0x2aca7: 0x6c4db620, + 0x2aca8: 0x6c4db820, 0x2aca9: 0x6c6f5c20, 0x2acaa: 0x6c6f5e20, 0x2acab: 0x6c6f6020, + 0x2acac: 0x6c4dba20, 0x2acad: 0x6c4dbc20, 0x2acae: 0x6c972e20, 0x2acaf: 0x6c6f8a20, + 0x2acb0: 0x6c973020, 0x2acb1: 0x6c6f8c20, 0x2acb2: 0x6c973220, 0x2acb3: 0x6c6f8e20, + 0x2acb4: 0x6c6f9020, 0x2acb5: 0x6c973420, 0x2acb6: 0x6c6f9220, 0x2acb7: 0x6c6f9420, + 0x2acb8: 0x6c6f9620, 0x2acb9: 0x6c6f9820, 0x2acba: 0x6c4dbe20, 0x2acbb: 0x6c973620, + 0x2acbc: 0x6c6f9a20, 0x2acbd: 0x6c6f9c20, 0x2acbe: 0x6c975620, 0x2acbf: 0x6c975820, + // Block 0xab3, offset 0x2acc0 + 0x2acc0: 0x6c975a20, 0x2acc1: 0x6cc30420, 0x2acc2: 0x6c975c20, 0x2acc3: 0x6c975e20, + 0x2acc4: 0x6c976020, 0x2acc5: 0x6c976220, 0x2acc6: 0x6c976420, 0x2acc7: 0x6c976620, + 0x2acc8: 0x6cc30620, 0x2acc9: 0x6c976820, 0x2acca: 0x6c976a20, 0x2accb: 0x6cc30820, + 0x2accc: 0x6c976c20, 0x2accd: 0x6c976e20, 0x2acce: 0x6cc30a20, 0x2accf: 0x6c977020, + 0x2acd0: 0x6cc30c20, 0x2acd1: 0x6cc30e20, 0x2acd2: 0x6c977220, 0x2acd3: 0x6c977420, + 0x2acd4: 0x6c977620, 0x2acd5: 0x6cc31020, 0x2acd6: 0x6cc31220, 0x2acd7: 0x6c977820, + 0x2acd8: 0x6c977a20, 0x2acd9: 0x6c977c20, 0x2acda: 0x6cc33c20, 0x2acdb: 0x6cc33e20, + 0x2acdc: 0x6cc34020, 0x2acdd: 0x6cc34220, 0x2acde: 0x6cc34420, 0x2acdf: 0x6cc34620, + 0x2ace0: 0x6cc34820, 0x2ace1: 0x6cc34a20, 0x2ace2: 0x6cc34c20, 0x2ace3: 0x6cf24220, + 0x2ace4: 0x6cf24420, 0x2ace5: 0x6cc34e20, 0x2ace6: 0x6cf24620, 0x2ace7: 0x6cc35020, + 0x2ace8: 0x6cf24820, 0x2ace9: 0x6cc35220, 0x2acea: 0x6cc35420, 0x2aceb: 0x6cc35620, + 0x2acec: 0x6cf26620, 0x2aced: 0x6cf26820, 0x2acee: 0x6cf26a20, 0x2acef: 0x6d220420, + 0x2acf0: 0x6cf26c20, 0x2acf1: 0x6cf26e20, 0x2acf2: 0x6d220620, 0x2acf3: 0x6cf27020, + 0x2acf4: 0x6cf27220, 0x2acf5: 0x6cf27420, 0x2acf6: 0x6d220820, 0x2acf7: 0x6d220a20, + 0x2acf8: 0x6d220c20, 0x2acf9: 0x6d220e20, 0x2acfa: 0x6cf27620, 0x2acfb: 0x6d221020, + 0x2acfc: 0x6d222a20, 0x2acfd: 0x6d222c20, 0x2acfe: 0x6d222e20, 0x2acff: 0x6d4f6420, + // Block 0xab4, offset 0x2ad00 + 0x2ad00: 0x6d223020, 0x2ad01: 0x6d4f6620, 0x2ad02: 0x6d4f6820, 0x2ad03: 0x6d223220, + 0x2ad04: 0x6d4f6a20, 0x2ad05: 0x6d223420, 0x2ad06: 0x6d223620, 0x2ad07: 0x6d223820, + 0x2ad08: 0x6d223a20, 0x2ad09: 0x6d4f9820, 0x2ad0a: 0x6d4f9a20, 0x2ad0b: 0x6d4f9c20, + 0x2ad0c: 0x6d7bb220, 0x2ad0d: 0x6d4f9e20, 0x2ad0e: 0x6d4fa020, 0x2ad0f: 0x6d4fa220, + 0x2ad10: 0x6d4fa420, 0x2ad11: 0x6d4fa620, 0x2ad12: 0x6d4fa820, 0x2ad13: 0x6d4faa20, + 0x2ad14: 0x6d7bb420, 0x2ad15: 0x6d4fac20, 0x2ad16: 0x6d4fae20, 0x2ad17: 0x6d7bce20, + 0x2ad18: 0x6da3d420, 0x2ad19: 0x6d7bd020, 0x2ad1a: 0x6dc57420, 0x2ad1b: 0x6dc57620, + 0x2ad1c: 0x6da3e620, 0x2ad1d: 0x6dc57820, 0x2ad1e: 0x6dc57a20, 0x2ad1f: 0x6dc57c20, + 0x2ad20: 0x6da3e820, 0x2ad21: 0x6dc58820, 0x2ad22: 0x6dc58a20, 0x2ad23: 0x6dfa2a20, + 0x2ad24: 0x6dfa2c20, 0x2ad25: 0x6de28420, 0x2ad26: 0x6de28620, 0x2ad27: 0x6de28820, + 0x2ad28: 0x6dfa3020, 0x2ad29: 0x6dfa3220, 0x2ad2a: 0x6dfa3420, 0x2ad2b: 0x6e1d3420, + 0x2ad2c: 0x6e1d3620, 0x2ad2d: 0x6e403c20, 0x2ad2e: 0x6c1ffc20, 0x2ad2f: 0x6c1ffe20, + 0x2ad30: 0x6c33dc20, 0x2ad31: 0x6c33de20, 0x2ad32: 0x6c33e020, 0x2ad33: 0x6c4e9e20, + 0x2ad34: 0x6c709620, 0x2ad35: 0x6c709820, 0x2ad36: 0x6c709a20, 0x2ad37: 0x6c98b620, + 0x2ad38: 0x6cc48e20, 0x2ad39: 0x6cf37620, 0x2ad3a: 0x6d233220, 0x2ad3b: 0x6d50be20, + 0x2ad3c: 0x6d50c020, 0x2ad3d: 0x6da46820, 0x2ad3e: 0x6c201620, 0x2ad3f: 0x6c340220, + // Block 0xab5, offset 0x2ad40 + 0x2ad40: 0x6c340420, 0x2ad41: 0x6c4ec820, 0x2ad42: 0x6c4eca20, 0x2ad43: 0x6c093220, + 0x2ad44: 0x6c093420, 0x2ad45: 0x6c093620, 0x2ad46: 0x6c11d620, 0x2ad47: 0x6c11d820, + 0x2ad48: 0x6c11da20, 0x2ad49: 0x6c202820, 0x2ad4a: 0x6c202a20, 0x2ad4b: 0x6c202c20, + 0x2ad4c: 0x6c202e20, 0x2ad4d: 0x6c203020, 0x2ad4e: 0x6c203220, 0x2ad4f: 0x6c203420, + 0x2ad50: 0x6c203620, 0x2ad51: 0x6c203820, 0x2ad52: 0x6c341e20, 0x2ad53: 0x6c342020, + 0x2ad54: 0x6c342220, 0x2ad55: 0x6c342420, 0x2ad56: 0x6c342620, 0x2ad57: 0x6c342820, + 0x2ad58: 0x6c4ef220, 0x2ad59: 0x6c342a20, 0x2ad5a: 0x6c342c20, 0x2ad5b: 0x6c342e20, + 0x2ad5c: 0x6c343020, 0x2ad5d: 0x6c343220, 0x2ad5e: 0x6c343420, 0x2ad5f: 0x6c343620, + 0x2ad60: 0x6c343820, 0x2ad61: 0x6c4ef820, 0x2ad62: 0x6c4efa20, 0x2ad63: 0x6c4efc20, + 0x2ad64: 0x6c4efe20, 0x2ad65: 0x6c4f0020, 0x2ad66: 0x6c4f0220, 0x2ad67: 0x6c4f0420, + 0x2ad68: 0x6c4f0620, 0x2ad69: 0x6c4f0820, 0x2ad6a: 0x6c4f0a20, 0x2ad6b: 0x6c4f0c20, + 0x2ad6c: 0x6c70ca20, 0x2ad6d: 0x6c70cc20, 0x2ad6e: 0x6c4f0e20, 0x2ad6f: 0x6c4f1020, + 0x2ad70: 0x6c4f1220, 0x2ad71: 0x6c70ce20, 0x2ad72: 0x6c70e020, 0x2ad73: 0x6c98e220, + 0x2ad74: 0x6c70e220, 0x2ad75: 0x6c70e420, 0x2ad76: 0x6c70e620, 0x2ad77: 0x6c70e820, + 0x2ad78: 0x6c70ea20, 0x2ad79: 0x6c98e820, 0x2ad7a: 0x6c98ea20, 0x2ad7b: 0x6c98ec20, + 0x2ad7c: 0x6c98ee20, 0x2ad7d: 0x6c98f020, 0x2ad7e: 0x6c98f220, 0x2ad7f: 0x6c98f420, + // Block 0xab6, offset 0x2ad80 + 0x2ad80: 0x6c98f620, 0x2ad81: 0x6c98f820, 0x2ad82: 0x6c98fa20, 0x2ad83: 0x6c98fc20, + 0x2ad84: 0x6c98fe20, 0x2ad85: 0x6c990020, 0x2ad86: 0x6c990220, 0x2ad87: 0x6cc4bc20, + 0x2ad88: 0x6c990420, 0x2ad89: 0x6cc4c820, 0x2ad8a: 0x6cc4ca20, 0x2ad8b: 0x6cc4cc20, + 0x2ad8c: 0x6cf3a820, 0x2ad8d: 0x6cf3aa20, 0x2ad8e: 0x6cc4ce20, 0x2ad8f: 0x6cc4d020, + 0x2ad90: 0x6cc4d220, 0x2ad91: 0x6cc4d420, 0x2ad92: 0x6cc4d620, 0x2ad93: 0x6cc4d820, + 0x2ad94: 0x6cc4da20, 0x2ad95: 0x6cc4dc20, 0x2ad96: 0x6cc66c20, 0x2ad97: 0x6cc4de20, + 0x2ad98: 0x6cc4e020, 0x2ad99: 0x6cf3b220, 0x2ad9a: 0x6cf3b420, 0x2ad9b: 0x6cf3b620, + 0x2ad9c: 0x6cf3b820, 0x2ad9d: 0x6cf3ba20, 0x2ad9e: 0x6cf3bc20, 0x2ad9f: 0x6cf3be20, + 0x2ada0: 0x6cf3c020, 0x2ada1: 0x6cf3c220, 0x2ada2: 0x6cf3c420, 0x2ada3: 0x6cf3c620, + 0x2ada4: 0x6cf3c820, 0x2ada5: 0x6cf3ca20, 0x2ada6: 0x6cf3cc20, 0x2ada7: 0x6cf3ce20, + 0x2ada8: 0x6cf3d020, 0x2ada9: 0x6cf3d220, 0x2adaa: 0x6cf3d420, 0x2adab: 0x6cf3d620, + 0x2adac: 0x6cf3d820, 0x2adad: 0x6d237220, 0x2adae: 0x6d237420, 0x2adaf: 0x6d237620, + 0x2adb0: 0x6d237820, 0x2adb1: 0x6d237a20, 0x2adb2: 0x6d237c20, 0x2adb3: 0x6d237e20, + 0x2adb4: 0x6d238020, 0x2adb5: 0x6d238220, 0x2adb6: 0x6d238420, 0x2adb7: 0x6d238620, + 0x2adb8: 0x6d238820, 0x2adb9: 0x6d238a20, 0x2adba: 0x6d238c20, 0x2adbb: 0x6d50fc20, + 0x2adbc: 0x6d50fe20, 0x2adbd: 0x6d238e20, 0x2adbe: 0x6d239020, 0x2adbf: 0x6d239220, + // Block 0xab7, offset 0x2adc0 + 0x2adc0: 0x6d239420, 0x2adc1: 0x6d239620, 0x2adc2: 0x6d239820, 0x2adc3: 0x6d511020, + 0x2adc4: 0x6d511220, 0x2adc5: 0x6d511420, 0x2adc6: 0x6d511620, 0x2adc7: 0x6d511820, + 0x2adc8: 0x6d511a20, 0x2adc9: 0x6d511c20, 0x2adca: 0x6d511e20, 0x2adcb: 0x6d512020, + 0x2adcc: 0x6d512220, 0x2adcd: 0x6d512420, 0x2adce: 0x6d512620, 0x2adcf: 0x6d512820, + 0x2add0: 0x6d512a20, 0x2add1: 0x6d512c20, 0x2add2: 0x6d7cb420, 0x2add3: 0x6da47a20, + 0x2add4: 0x6d7cb620, 0x2add5: 0x6d7cb820, 0x2add6: 0x6d7cba20, 0x2add7: 0x6d7cbc20, + 0x2add8: 0x6d7cbe20, 0x2add9: 0x6d7cc020, 0x2adda: 0x6da48220, 0x2addb: 0x6da48420, + 0x2addc: 0x6da48620, 0x2addd: 0x6da48820, 0x2adde: 0x6da48a20, 0x2addf: 0x6da48c20, + 0x2ade0: 0x6dc60e20, 0x2ade1: 0x6dc61020, 0x2ade2: 0x6dc61220, 0x2ade3: 0x6dc61420, + 0x2ade4: 0x6dc61620, 0x2ade5: 0x6dc61820, 0x2ade6: 0x6dc61a20, 0x2ade7: 0x6dc61c20, + 0x2ade8: 0x6dc61e20, 0x2ade9: 0x6dc62020, 0x2adea: 0x6dc62220, 0x2adeb: 0x6dc62420, + 0x2adec: 0x6de2ea20, 0x2aded: 0x6de2ec20, 0x2adee: 0x6dfa5c20, 0x2adef: 0x6dfa5e20, + 0x2adf0: 0x6dfa6020, 0x2adf1: 0x6e0df020, 0x2adf2: 0x6e0df220, 0x2adf3: 0x6e0df420, + 0x2adf4: 0x6e0df620, 0x2adf5: 0x6e28f820, 0x2adf6: 0x6e28fa20, 0x2adf7: 0x6e28fc20, + 0x2adf8: 0x6e389020, 0x2adf9: 0x6e389220, 0x2adfa: 0x6c352e20, 0x2adfb: 0x6c722220, + 0x2adfc: 0x6c722420, 0x2adfd: 0x6c9a9420, 0x2adfe: 0x6cc67020, 0x2adff: 0x6c211c20, + // Block 0xab8, offset 0x2ae00 + 0x2ae00: 0x6c211e20, 0x2ae01: 0x6c354020, 0x2ae02: 0x6c354220, 0x2ae03: 0x6c503420, + 0x2ae04: 0x6c503620, 0x2ae05: 0x6c503820, 0x2ae06: 0x6c503a20, 0x2ae07: 0x6c723620, + 0x2ae08: 0x6c723820, 0x2ae09: 0x6c723a20, 0x2ae0a: 0x6c9aa020, 0x2ae0b: 0x6c9aa220, + 0x2ae0c: 0x6c9aa420, 0x2ae0d: 0x6c9aa620, 0x2ae0e: 0x6c9aa820, 0x2ae0f: 0x6cc68220, + 0x2ae10: 0x6cc68420, 0x2ae11: 0x6cc68620, 0x2ae12: 0x6cc68820, 0x2ae13: 0x6cc68a20, + 0x2ae14: 0x6cc68c20, 0x2ae15: 0x6cc68e20, 0x2ae16: 0x6cc69020, 0x2ae17: 0x6cc69220, + 0x2ae18: 0x6cc69420, 0x2ae19: 0x6cc69620, 0x2ae1a: 0x6cc69820, 0x2ae1b: 0x6cf52c20, + 0x2ae1c: 0x6cf52e20, 0x2ae1d: 0x6cf53020, 0x2ae1e: 0x6cf53220, 0x2ae1f: 0x6cf53420, + 0x2ae20: 0x6d24f020, 0x2ae21: 0x6d24f220, 0x2ae22: 0x6d24f420, 0x2ae23: 0x6d24f620, + 0x2ae24: 0x6d527220, 0x2ae25: 0x6d527420, 0x2ae26: 0x6d527620, 0x2ae27: 0x6d7dae20, + 0x2ae28: 0x6d7db020, 0x2ae29: 0x6d7db220, 0x2ae2a: 0x6d7db420, 0x2ae2b: 0x6dc6b620, + 0x2ae2c: 0x6dc6b820, 0x2ae2d: 0x6dfab220, 0x2ae2e: 0x6e0e2c20, 0x2ae2f: 0x6c213a20, + 0x2ae30: 0x6c728c20, 0x2ae31: 0x6cf58c20, 0x2ae32: 0x6c124020, 0x2ae33: 0x6c124220, + 0x2ae34: 0x6c358220, 0x2ae35: 0x6c507a20, 0x2ae36: 0x6c729a20, 0x2ae37: 0x6c9b2820, + 0x2ae38: 0x6cc71420, 0x2ae39: 0x6d52cc20, 0x2ae3a: 0x6da54220, 0x2ae3b: 0x6e292a20, + 0x2ae3c: 0x6c508220, 0x2ae3d: 0x6c508420, 0x2ae3e: 0x6c72aa20, 0x2ae3f: 0x6c72ac20, + // Block 0xab9, offset 0x2ae40 + 0x2ae40: 0x6cc72420, 0x2ae41: 0x6d255620, 0x2ae42: 0x6d52d620, 0x2ae43: 0x6c124620, + 0x2ae44: 0x6c359e20, 0x2ae45: 0x6c72b420, 0x2ae46: 0x6c508e20, 0x2ae47: 0x6c72b620, + 0x2ae48: 0x6c72b820, 0x2ae49: 0x6c72ba20, 0x2ae4a: 0x6c9b4220, 0x2ae4b: 0x6c9b4420, + 0x2ae4c: 0x6c9b4620, 0x2ae4d: 0x6cc74420, 0x2ae4e: 0x6d52e420, 0x2ae4f: 0x6d52e620, + 0x2ae50: 0x6c124c20, 0x2ae51: 0x6c124e20, 0x2ae52: 0x6c215020, 0x2ae53: 0x6c215220, + 0x2ae54: 0x6c215420, 0x2ae55: 0x6c215620, 0x2ae56: 0x6c215820, 0x2ae57: 0x6c215a20, + 0x2ae58: 0x6c35b020, 0x2ae59: 0x6c35b220, 0x2ae5a: 0x6c35b420, 0x2ae5b: 0x6c50b020, + 0x2ae5c: 0x6c50b220, 0x2ae5d: 0x6c50b420, 0x2ae5e: 0x6c50b620, 0x2ae5f: 0x6c50b820, + 0x2ae60: 0x6c50ba20, 0x2ae61: 0x6c50bc20, 0x2ae62: 0x6c50be20, 0x2ae63: 0x6c50c020, + 0x2ae64: 0x6c50c220, 0x2ae65: 0x6c72f020, 0x2ae66: 0x6c72f220, 0x2ae67: 0x6c72f420, + 0x2ae68: 0x6c72f620, 0x2ae69: 0x6c72f820, 0x2ae6a: 0x6c72fa20, 0x2ae6b: 0x6c72fc20, + 0x2ae6c: 0x6c72fe20, 0x2ae6d: 0x6c730020, 0x2ae6e: 0x6c730220, 0x2ae6f: 0x6c9b7020, + 0x2ae70: 0x6c9b7220, 0x2ae71: 0x6c9b7420, 0x2ae72: 0x6c9b7620, 0x2ae73: 0x6c9b7820, + 0x2ae74: 0x6c9b7a20, 0x2ae75: 0x6cc76e20, 0x2ae76: 0x6cc77020, 0x2ae77: 0x6cc77220, + 0x2ae78: 0x6cc77420, 0x2ae79: 0x6cc77620, 0x2ae7a: 0x6cc77820, 0x2ae7b: 0x6cc77a20, + 0x2ae7c: 0x6cc77c20, 0x2ae7d: 0x6cc77e20, 0x2ae7e: 0x6cc78020, 0x2ae7f: 0x6cc78220, + // Block 0xaba, offset 0x2ae80 + 0x2ae80: 0x6cc78420, 0x2ae81: 0x6cf5d820, 0x2ae82: 0x6cf5da20, 0x2ae83: 0x6cf5dc20, + 0x2ae84: 0x6cf5de20, 0x2ae85: 0x6cf5e020, 0x2ae86: 0x6cf5e220, 0x2ae87: 0x6cf5e420, + 0x2ae88: 0x6cf5e620, 0x2ae89: 0x6cf5e820, 0x2ae8a: 0x6cf5ea20, 0x2ae8b: 0x6cf5ec20, + 0x2ae8c: 0x6cf5ee20, 0x2ae8d: 0x6d257620, 0x2ae8e: 0x6d257820, 0x2ae8f: 0x6d257a20, + 0x2ae90: 0x6d257c20, 0x2ae91: 0x6d52f420, 0x2ae92: 0x6d52f620, 0x2ae93: 0x6d52f820, + 0x2ae94: 0x6d52fa20, 0x2ae95: 0x6d52fc20, 0x2ae96: 0x6d52fe20, 0x2ae97: 0x6d7e3220, + 0x2ae98: 0x6d7e3420, 0x2ae99: 0x6d7e3620, 0x2ae9a: 0x6d7e3820, 0x2ae9b: 0x6d7e3a20, + 0x2ae9c: 0x6d7e3c20, 0x2ae9d: 0x6d7e3e20, 0x2ae9e: 0x6d7e4020, 0x2ae9f: 0x6d7e4220, + 0x2aea0: 0x6da55e20, 0x2aea1: 0x6da56020, 0x2aea2: 0x6da56220, 0x2aea3: 0x6dc6fa20, + 0x2aea4: 0x6dc6fc20, 0x2aea5: 0x6dc6fe20, 0x2aea6: 0x6dc70020, 0x2aea7: 0x6dc70220, + 0x2aea8: 0x6dc70420, 0x2aea9: 0x6de38420, 0x2aeaa: 0x6de38620, 0x2aeab: 0x6dfade20, + 0x2aeac: 0x6e1d9a20, 0x2aead: 0x6e1d9c20, 0x2aeae: 0x6e292e20, 0x2aeaf: 0x6e38a620, + 0x2aeb0: 0x6c126e20, 0x2aeb1: 0x6d7ed420, 0x2aeb2: 0x6da5aa20, 0x2aeb3: 0x6c364a20, + 0x2aeb4: 0x6c73aa20, 0x2aeb5: 0x6c73ac20, 0x2aeb6: 0x6c9c1620, 0x2aeb7: 0x6c9c1820, + 0x2aeb8: 0x6cc85820, 0x2aeb9: 0x6cd95a20, 0x2aeba: 0x6d260220, 0x2aebb: 0x6d260420, + 0x2aebc: 0x6d538020, 0x2aebd: 0x6d538220, 0x2aebe: 0x6d538420, 0x2aebf: 0x6d7ee420, + // Block 0xabb, offset 0x2aec0 + 0x2aec0: 0x6da5b020, 0x2aec1: 0x6c127a20, 0x2aec2: 0x6c21b020, 0x2aec3: 0x6c21b220, + 0x2aec4: 0x6c21b420, 0x2aec5: 0x6c21b620, 0x2aec6: 0x6c21b820, 0x2aec7: 0x6c365820, + 0x2aec8: 0x6c365a20, 0x2aec9: 0x6c365c20, 0x2aeca: 0x6c365e20, 0x2aecb: 0x6c366020, + 0x2aecc: 0x6c366220, 0x2aecd: 0x6c366420, 0x2aece: 0x6c366620, 0x2aecf: 0x6c366820, + 0x2aed0: 0x6c366a20, 0x2aed1: 0x6c518620, 0x2aed2: 0x6c518820, 0x2aed3: 0x6c518a20, + 0x2aed4: 0x6c518c20, 0x2aed5: 0x6c518e20, 0x2aed6: 0x6c519020, 0x2aed7: 0x6c519220, + 0x2aed8: 0x6c73c620, 0x2aed9: 0x6c73c820, 0x2aeda: 0x6c73ca20, 0x2aedb: 0x6c73cc20, + 0x2aedc: 0x6c73ce20, 0x2aedd: 0x6c73d020, 0x2aede: 0x6c73d220, 0x2aedf: 0x6c73d420, + 0x2aee0: 0x6c73d620, 0x2aee1: 0x6c73d820, 0x2aee2: 0x6c73da20, 0x2aee3: 0x6c73dc20, + 0x2aee4: 0x6c73de20, 0x2aee5: 0x6c73e020, 0x2aee6: 0x6c73e220, 0x2aee7: 0x6c73e420, + 0x2aee8: 0x6c9c3620, 0x2aee9: 0x6c9c3820, 0x2aeea: 0x6c9c3a20, 0x2aeeb: 0x6c9c3c20, + 0x2aeec: 0x6c9c3e20, 0x2aeed: 0x6c9c4020, 0x2aeee: 0x6c9c4220, 0x2aeef: 0x6c9c4420, + 0x2aef0: 0x6c9c4620, 0x2aef1: 0x6c9c4820, 0x2aef2: 0x6c9c4a20, 0x2aef3: 0x6c9c4c20, + 0x2aef4: 0x6c9c4e20, 0x2aef5: 0x6c9c5020, 0x2aef6: 0x6cc88620, 0x2aef7: 0x6c9c5220, + 0x2aef8: 0x6cc88820, 0x2aef9: 0x6cc88a20, 0x2aefa: 0x6cc88c20, 0x2aefb: 0x6cc88e20, + 0x2aefc: 0x6cc89020, 0x2aefd: 0x6cc89220, 0x2aefe: 0x6cc89420, 0x2aeff: 0x6cc89620, + // Block 0xabc, offset 0x2af00 + 0x2af00: 0x6cc89820, 0x2af01: 0x6cc89a20, 0x2af02: 0x6cc89c20, 0x2af03: 0x6cc89e20, + 0x2af04: 0x6cc8a020, 0x2af05: 0x6cc8a220, 0x2af06: 0x6cc8a420, 0x2af07: 0x6cc8a620, + 0x2af08: 0x6cc8a820, 0x2af09: 0x6cc8aa20, 0x2af0a: 0x6cc8ac20, 0x2af0b: 0x6cf6b220, + 0x2af0c: 0x6cf6b420, 0x2af0d: 0x6cf6b620, 0x2af0e: 0x6cf6b820, 0x2af0f: 0x6cf6ba20, + 0x2af10: 0x6cf6bc20, 0x2af11: 0x6cf6be20, 0x2af12: 0x6cf6c020, 0x2af13: 0x6cf6c220, + 0x2af14: 0x6cf6c420, 0x2af15: 0x6cf6c620, 0x2af16: 0x6cf6c820, 0x2af17: 0x6cf6ca20, + 0x2af18: 0x6cf6cc20, 0x2af19: 0x6cf6ce20, 0x2af1a: 0x6cf6d020, 0x2af1b: 0x6cf6d220, + 0x2af1c: 0x6cf6d420, 0x2af1d: 0x6cf6d620, 0x2af1e: 0x6cf6d820, 0x2af1f: 0x6cf6da20, + 0x2af20: 0x6cf6dc20, 0x2af21: 0x6cfbd820, 0x2af22: 0x6cf6de20, 0x2af23: 0x6cf6e020, + 0x2af24: 0x6d261a20, 0x2af25: 0x6d261c20, 0x2af26: 0x6d261e20, 0x2af27: 0x6d262020, + 0x2af28: 0x6d262220, 0x2af29: 0x6d262420, 0x2af2a: 0x6d262620, 0x2af2b: 0x6d262820, + 0x2af2c: 0x6d262a20, 0x2af2d: 0x6d262c20, 0x2af2e: 0x6d262e20, 0x2af2f: 0x6d263020, + 0x2af30: 0x6d263220, 0x2af31: 0x6d263420, 0x2af32: 0x6d263620, 0x2af33: 0x6d263820, + 0x2af34: 0x6d263a20, 0x2af35: 0x6d263c20, 0x2af36: 0x6d263e20, 0x2af37: 0x6d264020, + 0x2af38: 0x6d264220, 0x2af39: 0x6d264420, 0x2af3a: 0x6d264620, 0x2af3b: 0x6d264820, + 0x2af3c: 0x6d264a20, 0x2af3d: 0x6d264c20, 0x2af3e: 0x6d539e20, 0x2af3f: 0x6d53a020, + // Block 0xabd, offset 0x2af40 + 0x2af40: 0x6d53a220, 0x2af41: 0x6d53a420, 0x2af42: 0x6d53a620, 0x2af43: 0x6d53a820, + 0x2af44: 0x6d53aa20, 0x2af45: 0x6d53ac20, 0x2af46: 0x6d53ae20, 0x2af47: 0x6d53b020, + 0x2af48: 0x6d53b220, 0x2af49: 0x6d53b420, 0x2af4a: 0x6d53b620, 0x2af4b: 0x6d53b820, + 0x2af4c: 0x6d53ba20, 0x2af4d: 0x6d53bc20, 0x2af4e: 0x6d53be20, 0x2af4f: 0x6d53c020, + 0x2af50: 0x6d7f0220, 0x2af51: 0x6d53c220, 0x2af52: 0x6d53c420, 0x2af53: 0x6d7f0420, + 0x2af54: 0x6d7f0620, 0x2af55: 0x6d7f0820, 0x2af56: 0x6d7f0a20, 0x2af57: 0x6d7f0c20, + 0x2af58: 0x6d7f0e20, 0x2af59: 0x6d7f1020, 0x2af5a: 0x6d7f1220, 0x2af5b: 0x6d7f1420, + 0x2af5c: 0x6d7f1620, 0x2af5d: 0x6d7f1820, 0x2af5e: 0x6d7f1a20, 0x2af5f: 0x6d7f1c20, + 0x2af60: 0x6d53c620, 0x2af61: 0x6d7f1e20, 0x2af62: 0x6d7f2020, 0x2af63: 0x6d7f2220, + 0x2af64: 0x6d7f2420, 0x2af65: 0x6d7f2620, 0x2af66: 0x6d7f2820, 0x2af67: 0x6d7f2a20, + 0x2af68: 0x6d7f2c20, 0x2af69: 0x6d7f2e20, 0x2af6a: 0x6da5c220, 0x2af6b: 0x6da5c420, + 0x2af6c: 0x6da5c620, 0x2af6d: 0x6da5c820, 0x2af6e: 0x6da5ca20, 0x2af6f: 0x6da5cc20, + 0x2af70: 0x6da5ce20, 0x2af71: 0x6da5d020, 0x2af72: 0x6da5d220, 0x2af73: 0x6da5d420, + 0x2af74: 0x6da5d620, 0x2af75: 0x6da5d820, 0x2af76: 0x6da5da20, 0x2af77: 0x6dc75420, + 0x2af78: 0x6dc75620, 0x2af79: 0x6dc75820, 0x2af7a: 0x6dc75a20, 0x2af7b: 0x6dc75c20, + 0x2af7c: 0x6dc75e20, 0x2af7d: 0x6dc76020, 0x2af7e: 0x6de3b420, 0x2af7f: 0x6de3b620, + // Block 0xabe, offset 0x2af80 + 0x2af80: 0x6de3b820, 0x2af81: 0x6de3ba20, 0x2af82: 0x6de3bc20, 0x2af83: 0x6de3be20, + 0x2af84: 0x6de3c020, 0x2af85: 0x6de3c220, 0x2af86: 0x6de3c420, 0x2af87: 0x6de3c620, + 0x2af88: 0x6de3c820, 0x2af89: 0x6dfb0820, 0x2af8a: 0x6dfb0a20, 0x2af8b: 0x6dfb0c20, + 0x2af8c: 0x6dfb0e20, 0x2af8d: 0x6dfb1020, 0x2af8e: 0x6dfb1220, 0x2af8f: 0x6dfb1420, + 0x2af90: 0x6dfb1620, 0x2af91: 0x6dfb1820, 0x2af92: 0x6dfb1a20, 0x2af93: 0x6dfb1c20, + 0x2af94: 0x6e0e5e20, 0x2af95: 0x6e0e6020, 0x2af96: 0x6dfb1e20, 0x2af97: 0x6e1db220, + 0x2af98: 0x6e1db420, 0x2af99: 0x6e293a20, 0x2af9a: 0x6e293c20, 0x2af9b: 0x6e293e20, + 0x2af9c: 0x6e294020, 0x2af9d: 0x6c223820, 0x2af9e: 0x6c223a20, 0x2af9f: 0x6c376620, + 0x2afa0: 0x6c376820, 0x2afa1: 0x6c376a20, 0x2afa2: 0x6c376c20, 0x2afa3: 0x6c52c220, + 0x2afa4: 0x6c52c420, 0x2afa5: 0x6c52c620, 0x2afa6: 0x6c52c820, 0x2afa7: 0x6c52ca20, + 0x2afa8: 0x6c52cc20, 0x2afa9: 0x6c754820, 0x2afaa: 0x6c754a20, 0x2afab: 0x6c754c20, + 0x2afac: 0x6c754e20, 0x2afad: 0x6c755020, 0x2afae: 0x6c9da620, 0x2afaf: 0x6c9da820, + 0x2afb0: 0x6c9daa20, 0x2afb1: 0x6c9dac20, 0x2afb2: 0x6cca8c20, 0x2afb3: 0x6cca8e20, + 0x2afb4: 0x6cca9020, 0x2afb5: 0x6cca9220, 0x2afb6: 0x6cca9420, 0x2afb7: 0x6c75a620, + 0x2afb8: 0x6cca9620, 0x2afb9: 0x6cf8bc20, 0x2afba: 0x6cf8be20, 0x2afbb: 0x6cf8c020, + 0x2afbc: 0x6cf8c220, 0x2afbd: 0x6cf8c420, 0x2afbe: 0x6cf8c620, 0x2afbf: 0x6d280220, + // Block 0xabf, offset 0x2afc0 + 0x2afc0: 0x6d280420, 0x2afc1: 0x6d280620, 0x2afc2: 0x6d555220, 0x2afc3: 0x6d555420, + 0x2afc4: 0x6d80d020, 0x2afc5: 0x6d80d220, 0x2afc6: 0x6da6f420, 0x2afc7: 0x6da6f620, + 0x2afc8: 0x6da6f820, 0x2afc9: 0x6da6fa20, 0x2afca: 0x6de47a20, 0x2afcb: 0x6dfb9a20, + 0x2afcc: 0x6e1e0c20, 0x2afcd: 0x6e297620, 0x2afce: 0x6e38d620, 0x2afcf: 0x6c12ba20, + 0x2afd0: 0x6c224e20, 0x2afd1: 0x6c225020, 0x2afd2: 0x6c52f820, 0x2afd3: 0x6c52fa20, + 0x2afd4: 0x6c52fc20, 0x2afd5: 0x6ccad220, 0x2afd6: 0x6ccad420, 0x2afd7: 0x6d284220, + 0x2afd8: 0x6dc85c20, 0x2afd9: 0x6c12c220, 0x2afda: 0x6c37ca20, 0x2afdb: 0x6c37cc20, + 0x2afdc: 0x6c37ce20, 0x2afdd: 0x6c37d020, 0x2afde: 0x6c530820, 0x2afdf: 0x6c530a20, + 0x2afe0: 0x6c530c20, 0x2afe1: 0x6c75a820, 0x2afe2: 0x6c9de820, 0x2afe3: 0x6c9dea20, + 0x2afe4: 0x6ccaf820, 0x2afe5: 0x6ccafa20, 0x2afe6: 0x6ccafc20, 0x2afe7: 0x6ccafe20, + 0x2afe8: 0x6ccb0020, 0x2afe9: 0x6ccb0220, 0x2afea: 0x6cf92220, 0x2afeb: 0x6cf92420, + 0x2afec: 0x6cf92620, 0x2afed: 0x6cf92820, 0x2afee: 0x6cf92a20, 0x2afef: 0x6d285020, + 0x2aff0: 0x6d285220, 0x2aff1: 0x6d285420, 0x2aff2: 0x6d285620, 0x2aff3: 0x6d559a20, + 0x2aff4: 0x6d559c20, 0x2aff5: 0x6d810220, 0x2aff6: 0x6d810420, 0x2aff7: 0x6d810620, + 0x2aff8: 0x6da71e20, 0x2aff9: 0x6dfba420, 0x2affa: 0x6dfba620, 0x2affb: 0x6e297e20, + 0x2affc: 0x6c227420, 0x2affd: 0x6c380420, 0x2affe: 0x6c75dc20, 0x2afff: 0x6c75de20, + // Block 0xac0, offset 0x2b000 + 0x2b000: 0x6c9e2020, 0x2b001: 0x6ccb4a20, 0x2b002: 0x6ccb4c20, 0x2b003: 0x6ccb4e20, + 0x2b004: 0x6cf95620, 0x2b005: 0x6d287620, 0x2b006: 0x6d812820, 0x2b007: 0x6d812a20, + 0x2b008: 0x6d812c20, 0x2b009: 0x6da73620, 0x2b00a: 0x6dc87e20, 0x2b00b: 0x6c535620, + 0x2b00c: 0x6c12da20, 0x2b00d: 0x6c382020, 0x2b00e: 0x6c382220, 0x2b00f: 0x6c382420, + 0x2b010: 0x6c382620, 0x2b011: 0x6c382820, 0x2b012: 0x6c535e20, 0x2b013: 0x6c75f620, + 0x2b014: 0x6c9e5420, 0x2b015: 0x6c9e5620, 0x2b016: 0x6c9e5820, 0x2b017: 0x6c9e5a20, + 0x2b018: 0x6c9e5c20, 0x2b019: 0x6c9e5e20, 0x2b01a: 0x6c9e6020, 0x2b01b: 0x6ccb6a20, + 0x2b01c: 0x6ccb6c20, 0x2b01d: 0x6ccb6e20, 0x2b01e: 0x6ccb7020, 0x2b01f: 0x6cf98220, + 0x2b020: 0x6cf98420, 0x2b021: 0x6cf98620, 0x2b022: 0x6cf98820, 0x2b023: 0x6cf98a20, + 0x2b024: 0x6d289e20, 0x2b025: 0x6d28a020, 0x2b026: 0x6d28a220, 0x2b027: 0x6d28a420, + 0x2b028: 0x6d28a620, 0x2b029: 0x6d28a820, 0x2b02a: 0x6d815c20, 0x2b02b: 0x6d815e20, + 0x2b02c: 0x6d816020, 0x2b02d: 0x6d816220, 0x2b02e: 0x6d816420, 0x2b02f: 0x6dc89220, + 0x2b030: 0x6dc89420, 0x2b031: 0x6de4a220, 0x2b032: 0x6e3d4820, 0x2b033: 0x6c763820, + 0x2b034: 0x6c385620, 0x2b035: 0x6c9ea020, 0x2b036: 0x6d561220, 0x2b037: 0x6d819620, + 0x2b038: 0x6c04c820, 0x2b039: 0x6c099620, 0x2b03a: 0x6c099820, 0x2b03b: 0x6c12f420, + 0x2b03c: 0x6c099a20, 0x2b03d: 0x6c12fa20, 0x2b03e: 0x6c22a020, 0x2b03f: 0x6c12fc20, + // Block 0xac1, offset 0x2b040 + 0x2b040: 0x6c22a620, 0x2b041: 0x6c22a820, 0x2b042: 0x6c22aa20, 0x2b043: 0x6c22ac20, + 0x2b044: 0x6c22ae20, 0x2b045: 0x6c22b020, 0x2b046: 0x6c22b220, 0x2b047: 0x6c22b420, + 0x2b048: 0x6c22b620, 0x2b049: 0x6c22b820, 0x2b04a: 0x6c22ba20, 0x2b04b: 0x6c387020, + 0x2b04c: 0x6c387220, 0x2b04d: 0x6c387420, 0x2b04e: 0x6c387620, 0x2b04f: 0x6c387820, + 0x2b050: 0x6c387a20, 0x2b051: 0x6c387c20, 0x2b052: 0x6c387e20, 0x2b053: 0x6c388020, + 0x2b054: 0x6c388220, 0x2b055: 0x6c388420, 0x2b056: 0x6c53d820, 0x2b057: 0x6c53da20, + 0x2b058: 0x6c53dc20, 0x2b059: 0x6c53de20, 0x2b05a: 0x6c53e020, 0x2b05b: 0x6c53e220, + 0x2b05c: 0x6c53e420, 0x2b05d: 0x6c53e620, 0x2b05e: 0x6c53e820, 0x2b05f: 0x6c9eaa20, + 0x2b060: 0x6c53ea20, 0x2b061: 0x6c53ec20, 0x2b062: 0x6c53ee20, 0x2b063: 0x6c53f020, + 0x2b064: 0x6c765220, 0x2b065: 0x6c765420, 0x2b066: 0x6c765620, 0x2b067: 0x6c765820, + 0x2b068: 0x6c765a20, 0x2b069: 0x6c765c20, 0x2b06a: 0x6c765e20, 0x2b06b: 0x6c9eac20, + 0x2b06c: 0x6c766020, 0x2b06d: 0x6c766220, 0x2b06e: 0x6c766420, 0x2b06f: 0x6c766620, + 0x2b070: 0x6c766820, 0x2b071: 0x6c766a20, 0x2b072: 0x6c766c20, 0x2b073: 0x6c766e20, + 0x2b074: 0x6c9eb020, 0x2b075: 0x6c9eb220, 0x2b076: 0x6c9eb420, 0x2b077: 0x6c9eb620, + 0x2b078: 0x6c9eb820, 0x2b079: 0x6c9eba20, 0x2b07a: 0x6c9ebc20, 0x2b07b: 0x6c9ebe20, + 0x2b07c: 0x6ccbd620, 0x2b07d: 0x6c9ec020, 0x2b07e: 0x6c9ec220, 0x2b07f: 0x6c9ec420, + // Block 0xac2, offset 0x2b080 + 0x2b080: 0x6c9ec620, 0x2b081: 0x6c9ec820, 0x2b082: 0x6c9eca20, 0x2b083: 0x6c9ecc20, + 0x2b084: 0x6c9ece20, 0x2b085: 0x6ccbd820, 0x2b086: 0x6c9ed020, 0x2b087: 0x6ccbda20, + 0x2b088: 0x6c9ed220, 0x2b089: 0x6c9ed420, 0x2b08a: 0x6c9ed620, 0x2b08b: 0x6c9ed820, + 0x2b08c: 0x6c9eda20, 0x2b08d: 0x6c9edc20, 0x2b08e: 0x6c9ede20, 0x2b08f: 0x6ccbe020, + 0x2b090: 0x6ccbe220, 0x2b091: 0x6ccbe420, 0x2b092: 0x6ccbe620, 0x2b093: 0x6ccbe820, + 0x2b094: 0x6ccbea20, 0x2b095: 0x6ccbec20, 0x2b096: 0x6ccbee20, 0x2b097: 0x6ccbf020, + 0x2b098: 0x6ccbf220, 0x2b099: 0x6ccbf420, 0x2b09a: 0x6ccbf620, 0x2b09b: 0x6ccbf820, + 0x2b09c: 0x6ccbfa20, 0x2b09d: 0x6ccbfc20, 0x2b09e: 0x6ccbfe20, 0x2b09f: 0x6ccc0020, + 0x2b0a0: 0x6ccc0220, 0x2b0a1: 0x6ccc0420, 0x2b0a2: 0x6ccc0620, 0x2b0a3: 0x6ccc0820, + 0x2b0a4: 0x6ccc0a20, 0x2b0a5: 0x6cf9e420, 0x2b0a6: 0x6cf9e620, 0x2b0a7: 0x6cf9e820, + 0x2b0a8: 0x6cf9ea20, 0x2b0a9: 0x6cf9ec20, 0x2b0aa: 0x6cf9ee20, 0x2b0ab: 0x6cf9f020, + 0x2b0ac: 0x6cf9f220, 0x2b0ad: 0x6cf9f420, 0x2b0ae: 0x6cf9f620, 0x2b0af: 0x6cf9f820, + 0x2b0b0: 0x6cf9fa20, 0x2b0b1: 0x6cf9fc20, 0x2b0b2: 0x6cf9fe20, 0x2b0b3: 0x6cfa0020, + 0x2b0b4: 0x6cfa0220, 0x2b0b5: 0x6cfa0420, 0x2b0b6: 0x6cfa0620, 0x2b0b7: 0x6cfa0820, + 0x2b0b8: 0x6cfa0a20, 0x2b0b9: 0x6cfa0c20, 0x2b0ba: 0x6cfa0e20, 0x2b0bb: 0x6cfa1020, + 0x2b0bc: 0x6d28f620, 0x2b0bd: 0x6d28f820, 0x2b0be: 0x6d28fa20, 0x2b0bf: 0x6d28fc20, + // Block 0xac3, offset 0x2b0c0 + 0x2b0c0: 0x6d28fe20, 0x2b0c1: 0x6d290020, 0x2b0c2: 0x6d290220, 0x2b0c3: 0x6d290420, + 0x2b0c4: 0x6d290620, 0x2b0c5: 0x6d290820, 0x2b0c6: 0x6d290a20, 0x2b0c7: 0x6d290c20, + 0x2b0c8: 0x6d290e20, 0x2b0c9: 0x6d291020, 0x2b0ca: 0x6d562420, 0x2b0cb: 0x6d562620, + 0x2b0cc: 0x6d562820, 0x2b0cd: 0x6d562a20, 0x2b0ce: 0x6d562c20, 0x2b0cf: 0x6d562e20, + 0x2b0d0: 0x6d563020, 0x2b0d1: 0x6d563220, 0x2b0d2: 0x6d563420, 0x2b0d3: 0x6d563620, + 0x2b0d4: 0x6d563820, 0x2b0d5: 0x6d563a20, 0x2b0d6: 0x6d563c20, 0x2b0d7: 0x6d563e20, + 0x2b0d8: 0x6d819820, 0x2b0d9: 0x6d564020, 0x2b0da: 0x6d564220, 0x2b0db: 0x6d564420, + 0x2b0dc: 0x6d564620, 0x2b0dd: 0x6d819e20, 0x2b0de: 0x6d81a020, 0x2b0df: 0x6d81a220, + 0x2b0e0: 0x6d81a420, 0x2b0e1: 0x6d81a620, 0x2b0e2: 0x6d81a820, 0x2b0e3: 0x6d81aa20, + 0x2b0e4: 0x6d81ac20, 0x2b0e5: 0x6d81ae20, 0x2b0e6: 0x6d81b020, 0x2b0e7: 0x6d81b220, + 0x2b0e8: 0x6da77620, 0x2b0e9: 0x6d81b420, 0x2b0ea: 0x6d81b620, 0x2b0eb: 0x6d81b820, + 0x2b0ec: 0x6d81ba20, 0x2b0ed: 0x6d81bc20, 0x2b0ee: 0x6d81be20, 0x2b0ef: 0x6da77c20, + 0x2b0f0: 0x6da77e20, 0x2b0f1: 0x6da78020, 0x2b0f2: 0x6da78220, 0x2b0f3: 0x6da78420, + 0x2b0f4: 0x6da78620, 0x2b0f5: 0x6da78820, 0x2b0f6: 0x6da78a20, 0x2b0f7: 0x6da78c20, + 0x2b0f8: 0x6da78e20, 0x2b0f9: 0x6da79020, 0x2b0fa: 0x6da79220, 0x2b0fb: 0x6da79420, + 0x2b0fc: 0x6da79620, 0x2b0fd: 0x6dc8c420, 0x2b0fe: 0x6dc8c620, 0x2b0ff: 0x6dc8c820, + // Block 0xac4, offset 0x2b100 + 0x2b100: 0x6dc8ca20, 0x2b101: 0x6dc8cc20, 0x2b102: 0x6dc8ce20, 0x2b103: 0x6dc8d020, + 0x2b104: 0x6de4b220, 0x2b105: 0x6de4b420, 0x2b106: 0x6de4b620, 0x2b107: 0x6de4b820, + 0x2b108: 0x6de4ba20, 0x2b109: 0x6de4bc20, 0x2b10a: 0x6de4be20, 0x2b10b: 0x6de4c020, + 0x2b10c: 0x6dfbc420, 0x2b10d: 0x6dfbc620, 0x2b10e: 0x6dfbc820, 0x2b10f: 0x6dfbca20, + 0x2b110: 0x6dfbcc20, 0x2b111: 0x6dfbce20, 0x2b112: 0x6e0efa20, 0x2b113: 0x6e0efc20, + 0x2b114: 0x6e0efe20, 0x2b115: 0x6e0f0020, 0x2b116: 0x6e0f0220, 0x2b117: 0x6e1e2e20, + 0x2b118: 0x6e0f0420, 0x2b119: 0x6e1e3020, 0x2b11a: 0x6e1e3220, 0x2b11b: 0x6e299820, + 0x2b11c: 0x6e299a20, 0x2b11d: 0x6e299c20, 0x2b11e: 0x6e329e20, 0x2b11f: 0x6e32a020, + 0x2b120: 0x6e3d5020, 0x2b121: 0x6c135620, 0x2b122: 0x6c135820, 0x2b123: 0x6c238a20, + 0x2b124: 0x6c238c20, 0x2b125: 0x6c238e20, 0x2b126: 0x6c399420, 0x2b127: 0x6c399620, + 0x2b128: 0x6c399820, 0x2b129: 0x6c399a20, 0x2b12a: 0x6c399c20, 0x2b12b: 0x6c551820, + 0x2b12c: 0x6c551a20, 0x2b12d: 0x6c551c20, 0x2b12e: 0x6c551e20, 0x2b12f: 0x6c552020, + 0x2b130: 0x6c552220, 0x2b131: 0x6c552420, 0x2b132: 0x6c552620, 0x2b133: 0x6c77ea20, + 0x2b134: 0x6c77ec20, 0x2b135: 0x6c77ee20, 0x2b136: 0x6c77f020, 0x2b137: 0x6c77f220, + 0x2b138: 0x6c77f420, 0x2b139: 0x6ca0de20, 0x2b13a: 0x6ca0e020, 0x2b13b: 0x6ca0e220, + 0x2b13c: 0x6ca0e420, 0x2b13d: 0x6ca0e620, 0x2b13e: 0x6ca0e820, 0x2b13f: 0x6ca0ea20, + // Block 0xac5, offset 0x2b140 + 0x2b140: 0x6ca0ec20, 0x2b141: 0x6ca0ee20, 0x2b142: 0x6ccdde20, 0x2b143: 0x6ccde020, + 0x2b144: 0x6ccde220, 0x2b145: 0x6ccde420, 0x2b146: 0x6ccde620, 0x2b147: 0x6ccde820, + 0x2b148: 0x6ccdea20, 0x2b149: 0x6ccdec20, 0x2b14a: 0x6ccdee20, 0x2b14b: 0x6ccdf020, + 0x2b14c: 0x6ccdf220, 0x2b14d: 0x6ccdf420, 0x2b14e: 0x6cfbda20, 0x2b14f: 0x6cfbdc20, + 0x2b150: 0x6cfbde20, 0x2b151: 0x6cfbe020, 0x2b152: 0x6cfbe220, 0x2b153: 0x6cfbe420, + 0x2b154: 0x6cfbe620, 0x2b155: 0x6cfbe820, 0x2b156: 0x6cfbea20, 0x2b157: 0x6cfbec20, + 0x2b158: 0x6cfbee20, 0x2b159: 0x6cfbf020, 0x2b15a: 0x6cfbf220, 0x2b15b: 0x6cfbf420, + 0x2b15c: 0x6cfbf620, 0x2b15d: 0x6cfbf820, 0x2b15e: 0x6cfbfa20, 0x2b15f: 0x6d2ad220, + 0x2b160: 0x6d2ad420, 0x2b161: 0x6d2ad620, 0x2b162: 0x6d2ad820, 0x2b163: 0x6d2ada20, + 0x2b164: 0x6d2adc20, 0x2b165: 0x6d2ade20, 0x2b166: 0x6d2ae020, 0x2b167: 0x6d2ae220, + 0x2b168: 0x6d2ae420, 0x2b169: 0x6d2ae620, 0x2b16a: 0x6d2ae820, 0x2b16b: 0x6d580e20, + 0x2b16c: 0x6d581020, 0x2b16d: 0x6d581220, 0x2b16e: 0x6d581420, 0x2b16f: 0x6d581620, + 0x2b170: 0x6d581820, 0x2b171: 0x6d581a20, 0x2b172: 0x6d581c20, 0x2b173: 0x6d82fe20, + 0x2b174: 0x6d830020, 0x2b175: 0x6d830220, 0x2b176: 0x6d830420, 0x2b177: 0x6d830620, + 0x2b178: 0x6d830820, 0x2b179: 0x6d830a20, 0x2b17a: 0x6d830c20, 0x2b17b: 0x6d830e20, + 0x2b17c: 0x6d831020, 0x2b17d: 0x6d831220, 0x2b17e: 0x6da87020, 0x2b17f: 0x6da87220, + // Block 0xac6, offset 0x2b180 + 0x2b180: 0x6da87420, 0x2b181: 0x6da87620, 0x2b182: 0x6da87820, 0x2b183: 0x6da87a20, + 0x2b184: 0x6dc9ba20, 0x2b185: 0x6dc9bc20, 0x2b186: 0x6de57220, 0x2b187: 0x6de57420, + 0x2b188: 0x6dfc4a20, 0x2b189: 0x6de57620, 0x2b18a: 0x6dfc4c20, 0x2b18b: 0x6dfc4e20, + 0x2b18c: 0x6dfc5020, 0x2b18d: 0x6e0f7c20, 0x2b18e: 0x6e1e6e20, 0x2b18f: 0x6e29d620, + 0x2b190: 0x6e29d820, 0x2b191: 0x6e3d6620, 0x2b192: 0x6c3a2420, 0x2b193: 0x6c3a2620, + 0x2b194: 0x6ca1ce20, 0x2b195: 0x6d2bda20, 0x2b196: 0x6c561420, 0x2b197: 0x6c78d420, + 0x2b198: 0x6ca1da20, 0x2b199: 0x6cfd3e20, 0x2b19a: 0x6c3a4020, 0x2b19b: 0x6c561e20, + 0x2b19c: 0x6ccf2820, 0x2b19d: 0x6c3a4e20, 0x2b19e: 0x6c3a5020, 0x2b19f: 0x6c78ee20, + 0x2b1a0: 0x6c78f020, 0x2b1a1: 0x6c78f220, 0x2b1a2: 0x6d2bfa20, 0x2b1a3: 0x6da93c20, + 0x2b1a4: 0x6dca4420, 0x2b1a5: 0x6e0fb620, 0x2b1a6: 0x6c04ea20, 0x2b1a7: 0x6c790220, + 0x2b1a8: 0x6c137e20, 0x2b1a9: 0x6c23e820, 0x2b1aa: 0x6c23ea20, 0x2b1ab: 0x6c3a6220, + 0x2b1ac: 0x6c3a6420, 0x2b1ad: 0x6c3a6620, 0x2b1ae: 0x6c3a6820, 0x2b1af: 0x6c3a6a20, + 0x2b1b0: 0x6c564220, 0x2b1b1: 0x6c564420, 0x2b1b2: 0x6c564620, 0x2b1b3: 0x6c564820, + 0x2b1b4: 0x6c564a20, 0x2b1b5: 0x6c790820, 0x2b1b6: 0x6c790a20, 0x2b1b7: 0x6c790c20, + 0x2b1b8: 0x6c790e20, 0x2b1b9: 0x6ca20e20, 0x2b1ba: 0x6ca21020, 0x2b1bb: 0x6ca21220, + 0x2b1bc: 0x6ca21420, 0x2b1bd: 0x6ca21620, 0x2b1be: 0x6ca21820, 0x2b1bf: 0x6ca21a20, + // Block 0xac7, offset 0x2b1c0 + 0x2b1c0: 0x6ca21c20, 0x2b1c1: 0x6ccf7220, 0x2b1c2: 0x6ccf7420, 0x2b1c3: 0x6ccf7620, + 0x2b1c4: 0x6d2c0e20, 0x2b1c5: 0x6cfd7020, 0x2b1c6: 0x6cfd7220, 0x2b1c7: 0x6cfd7420, + 0x2b1c8: 0x6cfd7620, 0x2b1c9: 0x6d2c1020, 0x2b1ca: 0x6d2c1220, 0x2b1cb: 0x6d2c1420, + 0x2b1cc: 0x6d594620, 0x2b1cd: 0x6d594820, 0x2b1ce: 0x6d594a20, 0x2b1cf: 0x6d594c20, + 0x2b1d0: 0x6d594e20, 0x2b1d1: 0x6d845220, 0x2b1d2: 0x6d845420, 0x2b1d3: 0x6d845620, + 0x2b1d4: 0x6da94820, 0x2b1d5: 0x6da94a20, 0x2b1d6: 0x6da94c20, 0x2b1d7: 0x6dca5020, + 0x2b1d8: 0x6dca5220, 0x2b1d9: 0x6de5e420, 0x2b1da: 0x6e0fba20, 0x2b1db: 0x6e1e9a20, + 0x2b1dc: 0x6c3ab420, 0x2b1dd: 0x6c240220, 0x2b1de: 0x6c240420, 0x2b1df: 0x6c240620, + 0x2b1e0: 0x6c240820, 0x2b1e1: 0x6c3ab820, 0x2b1e2: 0x6c3aba20, 0x2b1e3: 0x6c3abc20, + 0x2b1e4: 0x6c3abe20, 0x2b1e5: 0x6c3ac020, 0x2b1e6: 0x6c3ac220, 0x2b1e7: 0x6c3ac420, + 0x2b1e8: 0x6c3ac620, 0x2b1e9: 0x6c3ac820, 0x2b1ea: 0x6c3aca20, 0x2b1eb: 0x6c569820, + 0x2b1ec: 0x6c569a20, 0x2b1ed: 0x6c569c20, 0x2b1ee: 0x6c569e20, 0x2b1ef: 0x6c56a020, + 0x2b1f0: 0x6c56a220, 0x2b1f1: 0x6c793420, 0x2b1f2: 0x6c793620, 0x2b1f3: 0x6c793820, + 0x2b1f4: 0x6c793a20, 0x2b1f5: 0x6c793c20, 0x2b1f6: 0x6c793e20, 0x2b1f7: 0x6c794020, + 0x2b1f8: 0x6c794220, 0x2b1f9: 0x6ca25420, 0x2b1fa: 0x6ca25620, 0x2b1fb: 0x6ca25820, + 0x2b1fc: 0x6ca25a20, 0x2b1fd: 0x6ca25c20, 0x2b1fe: 0x6ca25e20, 0x2b1ff: 0x6ca26020, + // Block 0xac8, offset 0x2b200 + 0x2b200: 0x6ca26220, 0x2b201: 0x6ccfd820, 0x2b202: 0x6ccfda20, 0x2b203: 0x6ccfdc20, + 0x2b204: 0x6ccfde20, 0x2b205: 0x6ccfe020, 0x2b206: 0x6ccfe220, 0x2b207: 0x6cfdc420, + 0x2b208: 0x6cfdc620, 0x2b209: 0x6cfdc820, 0x2b20a: 0x6cfdca20, 0x2b20b: 0x6cfdcc20, + 0x2b20c: 0x6cfdce20, 0x2b20d: 0x6cfdd020, 0x2b20e: 0x6d2c6c20, 0x2b20f: 0x6d2c6e20, + 0x2b210: 0x6d2c7020, 0x2b211: 0x6d2c7220, 0x2b212: 0x6d2c7420, 0x2b213: 0x6d2c7620, + 0x2b214: 0x6d598820, 0x2b215: 0x6d598a20, 0x2b216: 0x6d598c20, 0x2b217: 0x6d598e20, + 0x2b218: 0x6d599020, 0x2b219: 0x6d599220, 0x2b21a: 0x6d848020, 0x2b21b: 0x6d848220, + 0x2b21c: 0x6d848420, 0x2b21d: 0x6da96420, 0x2b21e: 0x6da96620, 0x2b21f: 0x6da96820, + 0x2b220: 0x6dca5820, 0x2b221: 0x6de60220, 0x2b222: 0x6de60420, 0x2b223: 0x6dfce820, + 0x2b224: 0x6dfcea20, 0x2b225: 0x6dfcec20, 0x2b226: 0x6dfcee20, 0x2b227: 0x6e32d420, + 0x2b228: 0x6c13b620, 0x2b229: 0x6c13b820, 0x2b22a: 0x6c13ba20, 0x2b22b: 0x6c13bc20, + 0x2b22c: 0x6c246c20, 0x2b22d: 0x6c246e20, 0x2b22e: 0x6c247020, 0x2b22f: 0x6c247220, + 0x2b230: 0x6c3b3820, 0x2b231: 0x6c572a20, 0x2b232: 0x6c3b3a20, 0x2b233: 0x6c3b3c20, + 0x2b234: 0x6c3b3e20, 0x2b235: 0x6c3b4020, 0x2b236: 0x6c3b4220, 0x2b237: 0x6c572c20, + 0x2b238: 0x6c79bc20, 0x2b239: 0x6c572e20, 0x2b23a: 0x6c573020, 0x2b23b: 0x6c573220, + 0x2b23c: 0x6c573420, 0x2b23d: 0x6c573620, 0x2b23e: 0x6c573820, 0x2b23f: 0x6c79c220, + // Block 0xac9, offset 0x2b240 + 0x2b240: 0x6c79c420, 0x2b241: 0x6c79c620, 0x2b242: 0x6c79c820, 0x2b243: 0x6c79ca20, + 0x2b244: 0x6c79cc20, 0x2b245: 0x6c79ce20, 0x2b246: 0x6c79d020, 0x2b247: 0x6c79d220, + 0x2b248: 0x6c79d420, 0x2b249: 0x6ca2da20, 0x2b24a: 0x6ca2dc20, 0x2b24b: 0x6ca2de20, + 0x2b24c: 0x6ca2e020, 0x2b24d: 0x6ca2e220, 0x2b24e: 0x6ca2e420, 0x2b24f: 0x6ca2e620, + 0x2b250: 0x6ca2e820, 0x2b251: 0x6cd07620, 0x2b252: 0x6cd07820, 0x2b253: 0x6cd07a20, + 0x2b254: 0x6cd07c20, 0x2b255: 0x6cd07e20, 0x2b256: 0x6cd08020, 0x2b257: 0x6cfe4a20, + 0x2b258: 0x6cd08220, 0x2b259: 0x6cd08420, 0x2b25a: 0x6cd08620, 0x2b25b: 0x6cd08820, + 0x2b25c: 0x6cd08a20, 0x2b25d: 0x6cfe4e20, 0x2b25e: 0x6cfe5020, 0x2b25f: 0x6cfe5220, + 0x2b260: 0x6cfe5420, 0x2b261: 0x6cfe5620, 0x2b262: 0x6cfe5820, 0x2b263: 0x6cfe5a20, + 0x2b264: 0x6cfe5c20, 0x2b265: 0x6cfe5e20, 0x2b266: 0x6cfe6020, 0x2b267: 0x6d2ce220, + 0x2b268: 0x6d2ce420, 0x2b269: 0x6d2ce620, 0x2b26a: 0x6d2ce820, 0x2b26b: 0x6d5a0a20, + 0x2b26c: 0x6d5a0c20, 0x2b26d: 0x6d5a0e20, 0x2b26e: 0x6d5a1020, 0x2b26f: 0x6d5a1220, + 0x2b270: 0x6d5a1420, 0x2b271: 0x6d5a1620, 0x2b272: 0x6d5a1820, 0x2b273: 0x6d5a1a20, + 0x2b274: 0x6d5a1c20, 0x2b275: 0x6d84ce20, 0x2b276: 0x6d84d020, 0x2b277: 0x6d84d220, + 0x2b278: 0x6d84d420, 0x2b279: 0x6da99620, 0x2b27a: 0x6da99820, 0x2b27b: 0x6d84d620, + 0x2b27c: 0x6d84d820, 0x2b27d: 0x6da99e20, 0x2b27e: 0x6dca8420, 0x2b27f: 0x6da9a020, + // Block 0xaca, offset 0x2b280 + 0x2b280: 0x6da9a220, 0x2b281: 0x6da9a420, 0x2b282: 0x6dca8620, 0x2b283: 0x6de62020, + 0x2b284: 0x6de62220, 0x2b285: 0x6de62420, 0x2b286: 0x6de62620, 0x2b287: 0x6dfcfe20, + 0x2b288: 0x6e2a1a20, 0x2b289: 0x6c57c620, 0x2b28a: 0x6c57c820, 0x2b28b: 0x6c7a7420, + 0x2b28c: 0x6c7a7620, 0x2b28d: 0x6ca37c20, 0x2b28e: 0x6ca37e20, 0x2b28f: 0x6cd16020, + 0x2b290: 0x6d2d8620, 0x2b291: 0x6d2d8820, 0x2b292: 0x6d2d8a20, 0x2b293: 0x6d5ab220, + 0x2b294: 0x6d5ab420, 0x2b295: 0x6dcae220, 0x2b296: 0x6e3d7020, 0x2b297: 0x6c24a020, + 0x2b298: 0x6c3bb220, 0x2b299: 0x6c3bb420, 0x2b29a: 0x6c57d620, 0x2b29b: 0x6c57d820, + 0x2b29c: 0x6c7a8620, 0x2b29d: 0x6c7a8820, 0x2b29e: 0x6c7a8a20, 0x2b29f: 0x6c7a8c20, + 0x2b2a0: 0x6c7a8e20, 0x2b2a1: 0x6ca38c20, 0x2b2a2: 0x6ca38e20, 0x2b2a3: 0x6ca39020, + 0x2b2a4: 0x6ca39220, 0x2b2a5: 0x6ca39420, 0x2b2a6: 0x6ca39620, 0x2b2a7: 0x6cd17020, + 0x2b2a8: 0x6cd17220, 0x2b2a9: 0x6cd17420, 0x2b2aa: 0x6cd17620, 0x2b2ab: 0x6cff5220, + 0x2b2ac: 0x6cff5420, 0x2b2ad: 0x6cff5620, 0x2b2ae: 0x6cff5820, 0x2b2af: 0x6cff5a20, + 0x2b2b0: 0x6cff5c20, 0x2b2b1: 0x6cff5e20, 0x2b2b2: 0x6d2d9820, 0x2b2b3: 0x6d2d9a20, + 0x2b2b4: 0x6d2d9c20, 0x2b2b5: 0x6d2d9e20, 0x2b2b6: 0x6d2da020, 0x2b2b7: 0x6d2da220, + 0x2b2b8: 0x6d5ac620, 0x2b2b9: 0x6d5ac820, 0x2b2ba: 0x6d5aca20, 0x2b2bb: 0x6d857220, + 0x2b2bc: 0x6d857420, 0x2b2bd: 0x6d857620, 0x2b2be: 0x6d857820, 0x2b2bf: 0x6daa1220, + // Block 0xacb, offset 0x2b2c0 + 0x2b2c0: 0x6daa1420, 0x2b2c1: 0x6daa1620, 0x2b2c2: 0x6daa1820, 0x2b2c3: 0x6daa1a20, + 0x2b2c4: 0x6daa1c20, 0x2b2c5: 0x6daa1e20, 0x2b2c6: 0x6dcaea20, 0x2b2c7: 0x6dcaec20, + 0x2b2c8: 0x6de66a20, 0x2b2c9: 0x6de66c20, 0x2b2ca: 0x6e1ecc20, 0x2b2cb: 0x6e32e820, + 0x2b2cc: 0x6e392220, 0x2b2cd: 0x6c7aae20, 0x2b2ce: 0x6cff8820, 0x2b2cf: 0x6d2dd220, + 0x2b2d0: 0x6d5af020, 0x2b2d1: 0x6daa3a20, 0x2b2d2: 0x6cd1a220, 0x2b2d3: 0x6d5af620, + 0x2b2d4: 0x6d859a20, 0x2b2d5: 0x6c24b020, 0x2b2d6: 0x6c24b220, 0x2b2d7: 0x6c24b420, + 0x2b2d8: 0x6c581e20, 0x2b2d9: 0x6c582020, 0x2b2da: 0x6c582220, 0x2b2db: 0x6c7aba20, + 0x2b2dc: 0x6c7abc20, 0x2b2dd: 0x6ca3d220, 0x2b2de: 0x6ca3d420, 0x2b2df: 0x6cd1ba20, + 0x2b2e0: 0x6cd1bc20, 0x2b2e1: 0x6cffa220, 0x2b2e2: 0x6cffa420, 0x2b2e3: 0x6cffa620, + 0x2b2e4: 0x6cffa820, 0x2b2e5: 0x6d2de020, 0x2b2e6: 0x6d5afe20, 0x2b2e7: 0x6d5b0020, + 0x2b2e8: 0x6d5b0220, 0x2b2e9: 0x6d859e20, 0x2b2ea: 0x6daa4420, 0x2b2eb: 0x6dcb0a20, + 0x2b2ec: 0x6dcb0c20, 0x2b2ed: 0x6de67e20, 0x2b2ee: 0x6dfd3420, 0x2b2ef: 0x6e2a4020, + 0x2b2f0: 0x6cfff020, 0x2b2f1: 0x6c24d420, 0x2b2f2: 0x6c24d620, 0x2b2f3: 0x6c3c1820, + 0x2b2f4: 0x6c3c1a20, 0x2b2f5: 0x6c3c1c20, 0x2b2f6: 0x6c3c1e20, 0x2b2f7: 0x6c589020, + 0x2b2f8: 0x6c589220, 0x2b2f9: 0x6c589420, 0x2b2fa: 0x6c589620, 0x2b2fb: 0x6c589820, + 0x2b2fc: 0x6c589a20, 0x2b2fd: 0x6c7b1220, 0x2b2fe: 0x6c7b1420, 0x2b2ff: 0x6c7b1620, + // Block 0xacc, offset 0x2b300 + 0x2b300: 0x6c7b1820, 0x2b301: 0x6c7b1a20, 0x2b302: 0x6c7b1c20, 0x2b303: 0x6c7b1e20, + 0x2b304: 0x6c7b2020, 0x2b305: 0x6c7b2220, 0x2b306: 0x6c7b2420, 0x2b307: 0x6c7b2620, + 0x2b308: 0x6c7b2820, 0x2b309: 0x6c7b2a20, 0x2b30a: 0x6ca41c20, 0x2b30b: 0x6ca41e20, + 0x2b30c: 0x6ca42020, 0x2b30d: 0x6ca42220, 0x2b30e: 0x6ca42420, 0x2b30f: 0x6ca42620, + 0x2b310: 0x6ca42820, 0x2b311: 0x6ca42a20, 0x2b312: 0x6ca42c20, 0x2b313: 0x6cd21220, + 0x2b314: 0x6cd21420, 0x2b315: 0x6cd21620, 0x2b316: 0x6cd21820, 0x2b317: 0x6cd21a20, + 0x2b318: 0x6cd21c20, 0x2b319: 0x6cd21e20, 0x2b31a: 0x6cd22020, 0x2b31b: 0x6cd22220, + 0x2b31c: 0x6cd22420, 0x2b31d: 0x6cd22620, 0x2b31e: 0x6cd22820, 0x2b31f: 0x6cd22a20, + 0x2b320: 0x6cd22c20, 0x2b321: 0x6cd22e20, 0x2b322: 0x6cfff620, 0x2b323: 0x6cfff820, + 0x2b324: 0x6cfffa20, 0x2b325: 0x6cfffc20, 0x2b326: 0x6cfffe20, 0x2b327: 0x6d000020, + 0x2b328: 0x6d000220, 0x2b329: 0x6d000420, 0x2b32a: 0x6d2e0820, 0x2b32b: 0x6d2e0a20, + 0x2b32c: 0x6d2e0c20, 0x2b32d: 0x6d2e0e20, 0x2b32e: 0x6d2e1020, 0x2b32f: 0x6d2e1220, + 0x2b330: 0x6d2e1420, 0x2b331: 0x6d2e1620, 0x2b332: 0x6d2e1820, 0x2b333: 0x6d2e1a20, + 0x2b334: 0x6d2e1c20, 0x2b335: 0x6d2e1e20, 0x2b336: 0x6d5b3220, 0x2b337: 0x6d5b3420, + 0x2b338: 0x6d5b3620, 0x2b339: 0x6d5b3820, 0x2b33a: 0x6d5b3a20, 0x2b33b: 0x6d5b3c20, + 0x2b33c: 0x6d5b3e20, 0x2b33d: 0x6d5b4020, 0x2b33e: 0x6d5b4220, 0x2b33f: 0x6d5b4420, + // Block 0xacd, offset 0x2b340 + 0x2b340: 0x6d5b4620, 0x2b341: 0x6d5b4820, 0x2b342: 0x6d85c620, 0x2b343: 0x6d85c820, + 0x2b344: 0x6d85ca20, 0x2b345: 0x6d85cc20, 0x2b346: 0x6d85ce20, 0x2b347: 0x6d85d020, + 0x2b348: 0x6d85d220, 0x2b349: 0x6daa7020, 0x2b34a: 0x6daa7220, 0x2b34b: 0x6dcb2020, + 0x2b34c: 0x6dcb2220, 0x2b34d: 0x6dcb2420, 0x2b34e: 0x6dcb2620, 0x2b34f: 0x6dcb2820, + 0x2b350: 0x6dcb2a20, 0x2b351: 0x6de69620, 0x2b352: 0x6de69820, 0x2b353: 0x6de69a20, + 0x2b354: 0x6dfd4a20, 0x2b355: 0x6e101e20, 0x2b356: 0x6e102020, 0x2b357: 0x6e102220, + 0x2b358: 0x6e1ee820, 0x2b359: 0x6e2a4820, 0x2b35a: 0x6e32ee20, 0x2b35b: 0x6e32f020, + 0x2b35c: 0x6e42c820, 0x2b35d: 0x6c24f820, 0x2b35e: 0x6c590c20, 0x2b35f: 0x6c7baa20, + 0x2b360: 0x6ca48e20, 0x2b361: 0x6ca49020, 0x2b362: 0x6d00ba20, 0x2b363: 0x6d2ea820, + 0x2b364: 0x6d2eaa20, 0x2b365: 0x6d5bdc20, 0x2b366: 0x6d865220, 0x2b367: 0x6de6dc20, + 0x2b368: 0x6e104420, 0x2b369: 0x6e393020, 0x2b36a: 0x6c3c5420, 0x2b36b: 0x6c593a20, + 0x2b36c: 0x6c593c20, 0x2b36d: 0x6c7bd420, 0x2b36e: 0x6c7bd620, 0x2b36f: 0x6ca4a820, + 0x2b370: 0x6ca4aa20, 0x2b371: 0x6cd2ee20, 0x2b372: 0x6d00e420, 0x2b373: 0x6d00e620, + 0x2b374: 0x6d2ec820, 0x2b375: 0x6d2eca20, 0x2b376: 0x6d5bf820, 0x2b377: 0x6d5bfa20, + 0x2b378: 0x6d866420, 0x2b379: 0x6dcb9220, 0x2b37a: 0x6dfd8020, 0x2b37b: 0x6c3c6620, + 0x2b37c: 0x6c594e20, 0x2b37d: 0x6c595020, 0x2b37e: 0x6c7bf020, 0x2b37f: 0x6c7bf220, + // Block 0xace, offset 0x2b380 + 0x2b380: 0x6c7bf420, 0x2b381: 0x6ca4be20, 0x2b382: 0x6ca4c020, 0x2b383: 0x6cd30a20, + 0x2b384: 0x6d010820, 0x2b385: 0x6d010a20, 0x2b386: 0x6d2ef220, 0x2b387: 0x6d867e20, + 0x2b388: 0x6d868020, 0x2b389: 0x6dab1e20, 0x2b38a: 0x6de6fa20, 0x2b38b: 0x6e105420, + 0x2b38c: 0x6e1f0820, 0x2b38d: 0x6e443e20, 0x2b38e: 0x6c251420, 0x2b38f: 0x6c251620, + 0x2b390: 0x6c3c7620, 0x2b391: 0x6c3c7820, 0x2b392: 0x6c3c7a20, 0x2b393: 0x6c3c7c20, + 0x2b394: 0x6c3c7e20, 0x2b395: 0x6c597420, 0x2b396: 0x6c597620, 0x2b397: 0x6c597820, + 0x2b398: 0x6c597a20, 0x2b399: 0x6c597c20, 0x2b39a: 0x6c597e20, 0x2b39b: 0x6c598020, + 0x2b39c: 0x6c598220, 0x2b39d: 0x6c598420, 0x2b39e: 0x6c598620, 0x2b39f: 0x6c7c2e20, + 0x2b3a0: 0x6c7c3020, 0x2b3a1: 0x6c7c3220, 0x2b3a2: 0x6c7c3420, 0x2b3a3: 0x6c7c3620, + 0x2b3a4: 0x6c7c3820, 0x2b3a5: 0x6c7c3a20, 0x2b3a6: 0x6c7c3c20, 0x2b3a7: 0x6ca4f220, + 0x2b3a8: 0x6ca4f420, 0x2b3a9: 0x6ca4f620, 0x2b3aa: 0x6ca4f820, 0x2b3ab: 0x6ca4fa20, + 0x2b3ac: 0x6ca4fc20, 0x2b3ad: 0x6ca4fe20, 0x2b3ae: 0x6ca50020, 0x2b3af: 0x6cd32c20, + 0x2b3b0: 0x6cd32e20, 0x2b3b1: 0x6cd33020, 0x2b3b2: 0x6cd33220, 0x2b3b3: 0x6cd33420, + 0x2b3b4: 0x6cd33620, 0x2b3b5: 0x6cd33820, 0x2b3b6: 0x6cd33a20, 0x2b3b7: 0x6cd33c20, + 0x2b3b8: 0x6cd33e20, 0x2b3b9: 0x6cd34020, 0x2b3ba: 0x6cd34220, 0x2b3bb: 0x6cd34420, + 0x2b3bc: 0x6cd34620, 0x2b3bd: 0x6cd34820, 0x2b3be: 0x6cd34a20, 0x2b3bf: 0x6cd34c20, + // Block 0xacf, offset 0x2b3c0 + 0x2b3c0: 0x6cd34e20, 0x2b3c1: 0x6d013020, 0x2b3c2: 0x6d013220, 0x2b3c3: 0x6d013420, + 0x2b3c4: 0x6d013620, 0x2b3c5: 0x6d013820, 0x2b3c6: 0x6d013a20, 0x2b3c7: 0x6d013c20, + 0x2b3c8: 0x6d013e20, 0x2b3c9: 0x6d014020, 0x2b3ca: 0x6d2f0820, 0x2b3cb: 0x6d2f0a20, + 0x2b3cc: 0x6d2f0c20, 0x2b3cd: 0x6d2f0e20, 0x2b3ce: 0x6d2f1020, 0x2b3cf: 0x6d2f1220, + 0x2b3d0: 0x6d2f1420, 0x2b3d1: 0x6d2f1620, 0x2b3d2: 0x6d2f1820, 0x2b3d3: 0x6d2f1a20, + 0x2b3d4: 0x6d2f1c20, 0x2b3d5: 0x6d2f1e20, 0x2b3d6: 0x6d2f2020, 0x2b3d7: 0x6d5c2820, + 0x2b3d8: 0x6d5c2a20, 0x2b3d9: 0x6d5c2c20, 0x2b3da: 0x6d5c2e20, 0x2b3db: 0x6d5c3020, + 0x2b3dc: 0x6d5c3220, 0x2b3dd: 0x6d5c3420, 0x2b3de: 0x6d5c3620, 0x2b3df: 0x6d5c3820, + 0x2b3e0: 0x6d5c3a20, 0x2b3e1: 0x6d5c3c20, 0x2b3e2: 0x6d86ae20, 0x2b3e3: 0x6d86b020, + 0x2b3e4: 0x6d86b220, 0x2b3e5: 0x6d86b420, 0x2b3e6: 0x6d86b620, 0x2b3e7: 0x6d86b820, + 0x2b3e8: 0x6d86ba20, 0x2b3e9: 0x6d86bc20, 0x2b3ea: 0x6d86be20, 0x2b3eb: 0x6dab4e20, + 0x2b3ec: 0x6dab5020, 0x2b3ed: 0x6dab5220, 0x2b3ee: 0x6dab5420, 0x2b3ef: 0x6dab5620, + 0x2b3f0: 0x6dab5820, 0x2b3f1: 0x6dab5a20, 0x2b3f2: 0x6dab5c20, 0x2b3f3: 0x6dab5e20, + 0x2b3f4: 0x6dcbbe20, 0x2b3f5: 0x6dcbc020, 0x2b3f6: 0x6dcbc220, 0x2b3f7: 0x6dcbc420, + 0x2b3f8: 0x6dcbc620, 0x2b3f9: 0x6dcbc820, 0x2b3fa: 0x6dcbca20, 0x2b3fb: 0x6dfda620, + 0x2b3fc: 0x6dfda820, 0x2b3fd: 0x6dfdaa20, 0x2b3fe: 0x6dfdac20, 0x2b3ff: 0x6e105c20, + // Block 0xad0, offset 0x2b400 + 0x2b400: 0x6e105e20, 0x2b401: 0x6e1f1620, 0x2b402: 0x6e2a6820, 0x2b403: 0x6e2a6a20, + 0x2b404: 0x6e393820, 0x2b405: 0x6e452e20, 0x2b406: 0x6c3cb220, 0x2b407: 0x6c5a1a20, + 0x2b408: 0x6ca59420, 0x2b409: 0x6d2fce20, 0x2b40a: 0x6dabea20, 0x2b40b: 0x6dabec20, + 0x2b40c: 0x6dabee20, 0x2b40d: 0x6dfde020, 0x2b40e: 0x6e332220, 0x2b40f: 0x6c7ce420, + 0x2b410: 0x6c7ce620, 0x2b411: 0x6c7cfc20, 0x2b412: 0x6ca59c20, 0x2b413: 0x6cd40a20, + 0x2b414: 0x6d020620, 0x2b415: 0x6d2fe820, 0x2b416: 0x6c13ee20, 0x2b417: 0x6c253820, + 0x2b418: 0x6c3cbc20, 0x2b419: 0x6c3cbe20, 0x2b41a: 0x6c5a3c20, 0x2b41b: 0x6c5a3e20, + 0x2b41c: 0x6c5a4020, 0x2b41d: 0x6c5a4220, 0x2b41e: 0x6c5a4420, 0x2b41f: 0x6c7cfe20, + 0x2b420: 0x6c7d0020, 0x2b421: 0x6c7d0220, 0x2b422: 0x6c7d0420, 0x2b423: 0x6c7d0620, + 0x2b424: 0x6c7d0820, 0x2b425: 0x6c7d0a20, 0x2b426: 0x6c7d0c20, 0x2b427: 0x6c7d0e20, + 0x2b428: 0x6c7d1020, 0x2b429: 0x6ca5d020, 0x2b42a: 0x6ca5d220, 0x2b42b: 0x6ca5d420, + 0x2b42c: 0x6ca5d620, 0x2b42d: 0x6ca5d820, 0x2b42e: 0x6ca5da20, 0x2b42f: 0x6ca5dc20, + 0x2b430: 0x6cd42620, 0x2b431: 0x6cd42820, 0x2b432: 0x6cd42a20, 0x2b433: 0x6cd42c20, + 0x2b434: 0x6cd42e20, 0x2b435: 0x6cd43020, 0x2b436: 0x6cd43220, 0x2b437: 0x6d023020, + 0x2b438: 0x6d023220, 0x2b439: 0x6d023420, 0x2b43a: 0x6d023620, 0x2b43b: 0x6d023820, + 0x2b43c: 0x6d023a20, 0x2b43d: 0x6d023c20, 0x2b43e: 0x6d023e20, 0x2b43f: 0x6d024020, + // Block 0xad1, offset 0x2b440 + 0x2b440: 0x6d024220, 0x2b441: 0x6d024420, 0x2b442: 0x6d024620, 0x2b443: 0x6d024820, + 0x2b444: 0x6d024a20, 0x2b445: 0x6d024c20, 0x2b446: 0x6d024e20, 0x2b447: 0x6d025020, + 0x2b448: 0x6d2ffc20, 0x2b449: 0x6d2ffe20, 0x2b44a: 0x6d300020, 0x2b44b: 0x6d300220, + 0x2b44c: 0x6d300420, 0x2b44d: 0x6d300620, 0x2b44e: 0x6d300820, 0x2b44f: 0x6d300a20, + 0x2b450: 0x6d300c20, 0x2b451: 0x6d5cf820, 0x2b452: 0x6d5cfa20, 0x2b453: 0x6d5cfc20, + 0x2b454: 0x6d5cfe20, 0x2b455: 0x6d5d0020, 0x2b456: 0x6d5d0220, 0x2b457: 0x6d5d0420, + 0x2b458: 0x6d876a20, 0x2b459: 0x6d876c20, 0x2b45a: 0x6d876e20, 0x2b45b: 0x6d877020, + 0x2b45c: 0x6d877220, 0x2b45d: 0x6d877420, 0x2b45e: 0x6d877620, 0x2b45f: 0x6dac0a20, + 0x2b460: 0x6d877820, 0x2b461: 0x6dac0c20, 0x2b462: 0x6dac0e20, 0x2b463: 0x6dac1020, + 0x2b464: 0x6dac1220, 0x2b465: 0x6dac1420, 0x2b466: 0x6dac1620, 0x2b467: 0x6dac1820, + 0x2b468: 0x6dac1a20, 0x2b469: 0x6dcc4220, 0x2b46a: 0x6dcc4420, 0x2b46b: 0x6dcc4620, + 0x2b46c: 0x6dcc4820, 0x2b46d: 0x6dcc4a20, 0x2b46e: 0x6dcc4c20, 0x2b46f: 0x6dcc4e20, + 0x2b470: 0x6de76a20, 0x2b471: 0x6dfdec20, 0x2b472: 0x6dfdee20, 0x2b473: 0x6dfdf020, + 0x2b474: 0x6e108c20, 0x2b475: 0x6e108e20, 0x2b476: 0x6e109020, 0x2b477: 0x6e109220, + 0x2b478: 0x6e1f3420, 0x2b479: 0x6e1f3620, 0x2b47a: 0x6e332420, 0x2b47b: 0x6e3d9620, + 0x2b47c: 0x6c254c20, 0x2b47d: 0x6c5abe20, 0x2b47e: 0x6c5ac020, 0x2b47f: 0x6c5ac220, + // Block 0xad2, offset 0x2b480 + 0x2b480: 0x6c5ac420, 0x2b481: 0x6c7dbe20, 0x2b482: 0x6c7dc020, 0x2b483: 0x6c7dc220, + 0x2b484: 0x6ca68c20, 0x2b485: 0x6ca68e20, 0x2b486: 0x6ca69020, 0x2b487: 0x6cd4b820, + 0x2b488: 0x6cd4ba20, 0x2b489: 0x6cd4bc20, 0x2b48a: 0x6cd4be20, 0x2b48b: 0x6d030820, + 0x2b48c: 0x6d030a20, 0x2b48d: 0x6d030c20, 0x2b48e: 0x6d030e20, 0x2b48f: 0x6d031020, + 0x2b490: 0x6d031220, 0x2b491: 0x6d031420, 0x2b492: 0x6d031620, 0x2b493: 0x6d30b420, + 0x2b494: 0x6d30b620, 0x2b495: 0x6d30b820, 0x2b496: 0x6d30ba20, 0x2b497: 0x6d30bc20, + 0x2b498: 0x6d5d8820, 0x2b499: 0x6d5d8a20, 0x2b49a: 0x6d87f420, 0x2b49b: 0x6d87f620, + 0x2b49c: 0x6d87f820, 0x2b49d: 0x6d87fa20, 0x2b49e: 0x6d87fc20, 0x2b49f: 0x6dac9e20, + 0x2b4a0: 0x6dcca020, 0x2b4a1: 0x6dcca220, 0x2b4a2: 0x6de7aa20, 0x2b4a3: 0x6dfe3820, + 0x2b4a4: 0x6e10bc20, 0x2b4a5: 0x6e444820, 0x2b4a6: 0x6c256420, 0x2b4a7: 0x6c256620, + 0x2b4a8: 0x6c3d2e20, 0x2b4a9: 0x6c3d3020, 0x2b4aa: 0x6c3d3220, 0x2b4ab: 0x6c3d3420, + 0x2b4ac: 0x6c3d3620, 0x2b4ad: 0x6c3d3820, 0x2b4ae: 0x6c5b2e20, 0x2b4af: 0x6c5b3020, + 0x2b4b0: 0x6c5b3220, 0x2b4b1: 0x6c5b3420, 0x2b4b2: 0x6c5b3620, 0x2b4b3: 0x6c5b3820, + 0x2b4b4: 0x6c5b3a20, 0x2b4b5: 0x6c5b3c20, 0x2b4b6: 0x6c7e3020, 0x2b4b7: 0x6c7e3220, + 0x2b4b8: 0x6c7e3420, 0x2b4b9: 0x6c7e3620, 0x2b4ba: 0x6ca6f820, 0x2b4bb: 0x6ca6fa20, + 0x2b4bc: 0x6ca6fc20, 0x2b4bd: 0x6ca6fe20, 0x2b4be: 0x6ca70020, 0x2b4bf: 0x6ca70220, + // Block 0xad3, offset 0x2b4c0 + 0x2b4c0: 0x6ca70420, 0x2b4c1: 0x6ca70620, 0x2b4c2: 0x6ca70820, 0x2b4c3: 0x6ca70a20, + 0x2b4c4: 0x6ca70c20, 0x2b4c5: 0x6ca70e20, 0x2b4c6: 0x6ca71020, 0x2b4c7: 0x6ca71220, + 0x2b4c8: 0x6ca71420, 0x2b4c9: 0x6ca71620, 0x2b4ca: 0x6ca71820, 0x2b4cb: 0x6cd52e20, + 0x2b4cc: 0x6cd53020, 0x2b4cd: 0x6cd53220, 0x2b4ce: 0x6cd53420, 0x2b4cf: 0x6cd53620, + 0x2b4d0: 0x6cd53820, 0x2b4d1: 0x6cd53a20, 0x2b4d2: 0x6cd53c20, 0x2b4d3: 0x6cd53e20, + 0x2b4d4: 0x6d037c20, 0x2b4d5: 0x6d037e20, 0x2b4d6: 0x6d038020, 0x2b4d7: 0x6d038220, + 0x2b4d8: 0x6d038420, 0x2b4d9: 0x6d038620, 0x2b4da: 0x6d038820, 0x2b4db: 0x6d038a20, + 0x2b4dc: 0x6d038c20, 0x2b4dd: 0x6d038e20, 0x2b4de: 0x6d039020, 0x2b4df: 0x6d039220, + 0x2b4e0: 0x6d311a20, 0x2b4e1: 0x6d311c20, 0x2b4e2: 0x6d311e20, 0x2b4e3: 0x6d312020, + 0x2b4e4: 0x6d312220, 0x2b4e5: 0x6d312420, 0x2b4e6: 0x6d312620, 0x2b4e7: 0x6d312820, + 0x2b4e8: 0x6d312a20, 0x2b4e9: 0x6d312c20, 0x2b4ea: 0x6d312e20, 0x2b4eb: 0x6d313020, + 0x2b4ec: 0x6d5dd820, 0x2b4ed: 0x6d5dda20, 0x2b4ee: 0x6d5ddc20, 0x2b4ef: 0x6d5dde20, + 0x2b4f0: 0x6d5de020, 0x2b4f1: 0x6d5de220, 0x2b4f2: 0x6d5de420, 0x2b4f3: 0x6d5de620, + 0x2b4f4: 0x6d5de820, 0x2b4f5: 0x6d5dea20, 0x2b4f6: 0x6d5dec20, 0x2b4f7: 0x6d883420, + 0x2b4f8: 0x6d883620, 0x2b4f9: 0x6d883820, 0x2b4fa: 0x6d883a20, 0x2b4fb: 0x6d883c20, + 0x2b4fc: 0x6d883e20, 0x2b4fd: 0x6d884020, 0x2b4fe: 0x6dacce20, 0x2b4ff: 0x6dacd020, + // Block 0xad4, offset 0x2b500 + 0x2b500: 0x6dacd220, 0x2b501: 0x6dccc020, 0x2b502: 0x6dccc220, 0x2b503: 0x6dccc420, + 0x2b504: 0x6dccc620, 0x2b505: 0x6dccc820, 0x2b506: 0x6dccca20, 0x2b507: 0x6dcccc20, + 0x2b508: 0x6dfe4620, 0x2b509: 0x6dfe4820, 0x2b50a: 0x6e10ca20, 0x2b50b: 0x6e10cc20, + 0x2b50c: 0x6e10ce20, 0x2b50d: 0x6e10d020, 0x2b50e: 0x6e1f6620, 0x2b50f: 0x6e1f6820, + 0x2b510: 0x6e453020, 0x2b511: 0x6c257a20, 0x2b512: 0x6c3d6820, 0x2b513: 0x6c5b9220, + 0x2b514: 0x6c5b9420, 0x2b515: 0x6c5b9620, 0x2b516: 0x6c5b9820, 0x2b517: 0x6c7ea620, + 0x2b518: 0x6c7ea820, 0x2b519: 0x6c7eaa20, 0x2b51a: 0x6ca77820, 0x2b51b: 0x6ca77a20, + 0x2b51c: 0x6ca77c20, 0x2b51d: 0x6ca77e20, 0x2b51e: 0x6ca78020, 0x2b51f: 0x6ca78220, + 0x2b520: 0x6ca78420, 0x2b521: 0x6cd5a220, 0x2b522: 0x6cd5a420, 0x2b523: 0x6cd5a620, + 0x2b524: 0x6cd5a820, 0x2b525: 0x6cd5aa20, 0x2b526: 0x6d042a20, 0x2b527: 0x6d042c20, + 0x2b528: 0x6d042e20, 0x2b529: 0x6d043020, 0x2b52a: 0x6d31c420, 0x2b52b: 0x6d31c620, + 0x2b52c: 0x6d5e6a20, 0x2b52d: 0x6d5e6c20, 0x2b52e: 0x6d5e6e20, 0x2b52f: 0x6d88bc20, + 0x2b530: 0x6d88be20, 0x2b531: 0x6d88c020, 0x2b532: 0x6d88c220, 0x2b533: 0x6d88c420, + 0x2b534: 0x6d88c620, 0x2b535: 0x6dad4220, 0x2b536: 0x6dad4420, 0x2b537: 0x6dad4620, + 0x2b538: 0x6dad4820, 0x2b539: 0x6dad4a20, 0x2b53a: 0x6dad4c20, 0x2b53b: 0x6dad4e20, + 0x2b53c: 0x6dcd1c20, 0x2b53d: 0x6dcd1e20, 0x2b53e: 0x6de7f220, 0x2b53f: 0x6de7f420, + // Block 0xad5, offset 0x2b540 + 0x2b540: 0x6dfe8420, 0x2b541: 0x6e1f7620, 0x2b542: 0x6c140e20, 0x2b543: 0x6c3d8c20, + 0x2b544: 0x6c3d8e20, 0x2b545: 0x6c5bd220, 0x2b546: 0x6c5bd420, 0x2b547: 0x6c7ef620, + 0x2b548: 0x6c7ef820, 0x2b549: 0x6c7efa20, 0x2b54a: 0x6c7efc20, 0x2b54b: 0x6ca7c620, + 0x2b54c: 0x6cd60a20, 0x2b54d: 0x6cd60c20, 0x2b54e: 0x6d048620, 0x2b54f: 0x6d048820, + 0x2b550: 0x6d048a20, 0x2b551: 0x6d048c20, 0x2b552: 0x6d892020, 0x2b553: 0x6dad8820, + 0x2b554: 0x6dcd3820, 0x2b555: 0x6de80620, 0x2b556: 0x6c5bf620, 0x2b557: 0x6c7f3220, + 0x2b558: 0x6c7f3420, 0x2b559: 0x6c7f3620, 0x2b55a: 0x6c7f3820, 0x2b55b: 0x6c7f3a20, + 0x2b55c: 0x6c7f3c20, 0x2b55d: 0x6c7f3e20, 0x2b55e: 0x6ca7e820, 0x2b55f: 0x6ca7ea20, + 0x2b560: 0x6ca7ec20, 0x2b561: 0x6ca7ee20, 0x2b562: 0x6ca7f020, 0x2b563: 0x6ca7f220, + 0x2b564: 0x6ca7f420, 0x2b565: 0x6ca7f620, 0x2b566: 0x6ca7f820, 0x2b567: 0x6cd63620, + 0x2b568: 0x6cd63820, 0x2b569: 0x6cd63a20, 0x2b56a: 0x6cd63c20, 0x2b56b: 0x6cd63e20, + 0x2b56c: 0x6cd64020, 0x2b56d: 0x6cd64220, 0x2b56e: 0x6cd64420, 0x2b56f: 0x6cd64620, + 0x2b570: 0x6cd64820, 0x2b571: 0x6cd64a20, 0x2b572: 0x6cd64c20, 0x2b573: 0x6cd64e20, + 0x2b574: 0x6cd65020, 0x2b575: 0x6d04b620, 0x2b576: 0x6d04b820, 0x2b577: 0x6d04ba20, + 0x2b578: 0x6d04bc20, 0x2b579: 0x6d04be20, 0x2b57a: 0x6d04c020, 0x2b57b: 0x6d04c220, + 0x2b57c: 0x6d04c420, 0x2b57d: 0x6d04c620, 0x2b57e: 0x6d04c820, 0x2b57f: 0x6d04ca20, + // Block 0xad6, offset 0x2b580 + 0x2b580: 0x6d04cc20, 0x2b581: 0x6d323220, 0x2b582: 0x6d323420, 0x2b583: 0x6d323620, + 0x2b584: 0x6d323820, 0x2b585: 0x6d323a20, 0x2b586: 0x6d323c20, 0x2b587: 0x6d323e20, + 0x2b588: 0x6d324020, 0x2b589: 0x6d324220, 0x2b58a: 0x6d324420, 0x2b58b: 0x6d324620, + 0x2b58c: 0x6d324820, 0x2b58d: 0x6d324a20, 0x2b58e: 0x6d5ecc20, 0x2b58f: 0x6d5ece20, + 0x2b590: 0x6d5ed020, 0x2b591: 0x6d5ed220, 0x2b592: 0x6d5ed420, 0x2b593: 0x6d5ed620, + 0x2b594: 0x6d5ed820, 0x2b595: 0x6d5eda20, 0x2b596: 0x6d5edc20, 0x2b597: 0x6d5ede20, + 0x2b598: 0x6d5ee020, 0x2b599: 0x6d5ee220, 0x2b59a: 0x6d5ee420, 0x2b59b: 0x6d5ee620, + 0x2b59c: 0x6d5ee820, 0x2b59d: 0x6d5eea20, 0x2b59e: 0x6d5eec20, 0x2b59f: 0x6d5eee20, + 0x2b5a0: 0x6d5ef020, 0x2b5a1: 0x6d5ef220, 0x2b5a2: 0x6d5ef420, 0x2b5a3: 0x6d5ef620, + 0x2b5a4: 0x6d5ef820, 0x2b5a5: 0x6d5efa20, 0x2b5a6: 0x6d5efc20, 0x2b5a7: 0x6d5efe20, + 0x2b5a8: 0x6d5f0020, 0x2b5a9: 0x6d5f0220, 0x2b5aa: 0x6d892e20, 0x2b5ab: 0x6d893020, + 0x2b5ac: 0x6d893220, 0x2b5ad: 0x6d893420, 0x2b5ae: 0x6d893620, 0x2b5af: 0x6d893820, + 0x2b5b0: 0x6d893a20, 0x2b5b1: 0x6d893c20, 0x2b5b2: 0x6d893e20, 0x2b5b3: 0x6d894020, + 0x2b5b4: 0x6d894220, 0x2b5b5: 0x6d894420, 0x2b5b6: 0x6d894620, 0x2b5b7: 0x6d894820, + 0x2b5b8: 0x6dada820, 0x2b5b9: 0x6dadaa20, 0x2b5ba: 0x6dadac20, 0x2b5bb: 0x6dadae20, + 0x2b5bc: 0x6dadb020, 0x2b5bd: 0x6dadb220, 0x2b5be: 0x6dadb420, 0x2b5bf: 0x6dadb620, + // Block 0xad7, offset 0x2b5c0 + 0x2b5c0: 0x6dadb820, 0x2b5c1: 0x6dadba20, 0x2b5c2: 0x6dadbc20, 0x2b5c3: 0x6dadbe20, + 0x2b5c4: 0x6dadc020, 0x2b5c5: 0x6dadc220, 0x2b5c6: 0x6dadc420, 0x2b5c7: 0x6dadc620, + 0x2b5c8: 0x6dcd4c20, 0x2b5c9: 0x6dcd4e20, 0x2b5ca: 0x6dcd5020, 0x2b5cb: 0x6dcd5220, + 0x2b5cc: 0x6dcd5420, 0x2b5cd: 0x6dcd5620, 0x2b5ce: 0x6dcd5820, 0x2b5cf: 0x6de81420, + 0x2b5d0: 0x6dcd5a20, 0x2b5d1: 0x6dcd5c20, 0x2b5d2: 0x6dcd5e20, 0x2b5d3: 0x6dcd6020, + 0x2b5d4: 0x6dcd6220, 0x2b5d5: 0x6dcd6420, 0x2b5d6: 0x6dcd6620, 0x2b5d7: 0x6dcd6820, + 0x2b5d8: 0x6dcd6a20, 0x2b5d9: 0x6dcd6c20, 0x2b5da: 0x6dcd6e20, 0x2b5db: 0x6de81620, + 0x2b5dc: 0x6de81820, 0x2b5dd: 0x6de81a20, 0x2b5de: 0x6de81c20, 0x2b5df: 0x6de81e20, + 0x2b5e0: 0x6de82020, 0x2b5e1: 0x6de82220, 0x2b5e2: 0x6de82420, 0x2b5e3: 0x6dcd7020, + 0x2b5e4: 0x6de82620, 0x2b5e5: 0x6dfeaa20, 0x2b5e6: 0x6e110820, 0x2b5e7: 0x6e110a20, + 0x2b5e8: 0x6e110c20, 0x2b5e9: 0x6e110e20, 0x2b5ea: 0x6e111020, 0x2b5eb: 0x6e111220, + 0x2b5ec: 0x6e111420, 0x2b5ed: 0x6e111620, 0x2b5ee: 0x6e1f8620, 0x2b5ef: 0x6e1f8820, + 0x2b5f0: 0x6e1f8a20, 0x2b5f1: 0x6e1f8c20, 0x2b5f2: 0x6e2ac620, 0x2b5f3: 0x6e2ac820, + 0x2b5f4: 0x6e2aca20, 0x2b5f5: 0x6e2e7820, 0x2b5f6: 0x6e335220, 0x2b5f7: 0x6e3dac20, + 0x2b5f8: 0x6e408e20, 0x2b5f9: 0x6e453220, 0x2b5fa: 0x6c5c2e20, 0x2b5fb: 0x6c7faa20, + 0x2b5fc: 0x6c7fac20, 0x2b5fd: 0x6ca89220, 0x2b5fe: 0x6ca89420, 0x2b5ff: 0x6ca89620, + // Block 0xad8, offset 0x2b600 + 0x2b600: 0x6ca89820, 0x2b601: 0x6cd6e020, 0x2b602: 0x6cd6e220, 0x2b603: 0x6cd6e420, + 0x2b604: 0x6cd6e620, 0x2b605: 0x6cd6e820, 0x2b606: 0x6cd6ea20, 0x2b607: 0x6d059820, + 0x2b608: 0x6d059a20, 0x2b609: 0x6d059c20, 0x2b60a: 0x6d059e20, 0x2b60b: 0x6d05a020, + 0x2b60c: 0x6d05a220, 0x2b60d: 0x6d333820, 0x2b60e: 0x6d333a20, 0x2b60f: 0x6d333c20, + 0x2b610: 0x6d333e20, 0x2b611: 0x6d334020, 0x2b612: 0x6d334220, 0x2b613: 0x6d5fee20, + 0x2b614: 0x6d5ff020, 0x2b615: 0x6d5ff220, 0x2b616: 0x6d5ff420, 0x2b617: 0x6d5ff620, + 0x2b618: 0x6d5ff820, 0x2b619: 0x6d5ffa20, 0x2b61a: 0x6d8a5220, 0x2b61b: 0x6d8a5420, + 0x2b61c: 0x6daec620, 0x2b61d: 0x6daec820, 0x2b61e: 0x6daeca20, 0x2b61f: 0x6daecc20, + 0x2b620: 0x6daece20, 0x2b621: 0x6daed020, 0x2b622: 0x6daed220, 0x2b623: 0x6dce6420, + 0x2b624: 0x6dce6620, 0x2b625: 0x6dce6820, 0x2b626: 0x6dce6a20, 0x2b627: 0x6dce6c20, + 0x2b628: 0x6dce6e20, 0x2b629: 0x6dce7020, 0x2b62a: 0x6de8c220, 0x2b62b: 0x6de8c420, + 0x2b62c: 0x6de8c620, 0x2b62d: 0x6dff1c20, 0x2b62e: 0x6dff1e20, 0x2b62f: 0x6e118a20, + 0x2b630: 0x6e1fe220, 0x2b631: 0x6e2b0420, 0x2b632: 0x6e2b0620, 0x2b633: 0x6e398420, + 0x2b634: 0x6e398620, 0x2b635: 0x6c3dba20, 0x2b636: 0x6c5c5e20, 0x2b637: 0x6c5c6020, + 0x2b638: 0x6c5c6220, 0x2b639: 0x6c5c6420, 0x2b63a: 0x6c7fee20, 0x2b63b: 0x6c7ff020, + 0x2b63c: 0x6c7ff220, 0x2b63d: 0x6c7ff420, 0x2b63e: 0x6c7ff620, 0x2b63f: 0x6c7ff820, + // Block 0xad9, offset 0x2b640 + 0x2b640: 0x6c7ffa20, 0x2b641: 0x6c7ffc20, 0x2b642: 0x6c7ffe20, 0x2b643: 0x6c800020, + 0x2b644: 0x6c800220, 0x2b645: 0x6c800420, 0x2b646: 0x6c800620, 0x2b647: 0x6c800820, + 0x2b648: 0x6ca8f220, 0x2b649: 0x6ca8f420, 0x2b64a: 0x6ca8f620, 0x2b64b: 0x6ca8f820, + 0x2b64c: 0x6ca8fa20, 0x2b64d: 0x6ca8fc20, 0x2b64e: 0x6ca8fe20, 0x2b64f: 0x6ca90020, + 0x2b650: 0x6ca90220, 0x2b651: 0x6ca90420, 0x2b652: 0x6ca90620, 0x2b653: 0x6ca90820, + 0x2b654: 0x6ca90a20, 0x2b655: 0x6cd74620, 0x2b656: 0x6cd74820, 0x2b657: 0x6cd74a20, + 0x2b658: 0x6cd74c20, 0x2b659: 0x6cd74e20, 0x2b65a: 0x6cd75020, 0x2b65b: 0x6cd75220, + 0x2b65c: 0x6cd75420, 0x2b65d: 0x6cd75620, 0x2b65e: 0x6cd75820, 0x2b65f: 0x6d060420, + 0x2b660: 0x6d060620, 0x2b661: 0x6d060820, 0x2b662: 0x6d060a20, 0x2b663: 0x6d060c20, + 0x2b664: 0x6d060e20, 0x2b665: 0x6d061020, 0x2b666: 0x6d061220, 0x2b667: 0x6d33b820, + 0x2b668: 0x6d33ba20, 0x2b669: 0x6d33bc20, 0x2b66a: 0x6d33be20, 0x2b66b: 0x6d33c020, + 0x2b66c: 0x6d33c220, 0x2b66d: 0x6d33c420, 0x2b66e: 0x6d33c620, 0x2b66f: 0x6d33c820, + 0x2b670: 0x6d33ca20, 0x2b671: 0x6d33cc20, 0x2b672: 0x6d33ce20, 0x2b673: 0x6d606420, + 0x2b674: 0x6d606620, 0x2b675: 0x6d606820, 0x2b676: 0x6d606a20, 0x2b677: 0x6d606c20, + 0x2b678: 0x6d606e20, 0x2b679: 0x6d607020, 0x2b67a: 0x6d607220, 0x2b67b: 0x6d607420, + 0x2b67c: 0x6d607620, 0x2b67d: 0x6d607820, 0x2b67e: 0x6d607a20, 0x2b67f: 0x6d607c20, + // Block 0xada, offset 0x2b680 + 0x2b680: 0x6d607e20, 0x2b681: 0x6d608020, 0x2b682: 0x6d608220, 0x2b683: 0x6d608420, + 0x2b684: 0x6d608620, 0x2b685: 0x6d8aac20, 0x2b686: 0x6d8aae20, 0x2b687: 0x6d8ab020, + 0x2b688: 0x6d8ab220, 0x2b689: 0x6d8ab420, 0x2b68a: 0x6d8ab620, 0x2b68b: 0x6d8ab820, + 0x2b68c: 0x6daf2020, 0x2b68d: 0x6daf2220, 0x2b68e: 0x6daf2420, 0x2b68f: 0x6daf2620, + 0x2b690: 0x6daf2820, 0x2b691: 0x6daf2a20, 0x2b692: 0x6daf2c20, 0x2b693: 0x6daf2e20, + 0x2b694: 0x6daf3020, 0x2b695: 0x6daf3220, 0x2b696: 0x6dcec020, 0x2b697: 0x6dcec220, + 0x2b698: 0x6dcec420, 0x2b699: 0x6dcec620, 0x2b69a: 0x6dcec820, 0x2b69b: 0x6dceca20, + 0x2b69c: 0x6de90c20, 0x2b69d: 0x6de90e20, 0x2b69e: 0x6de91020, 0x2b69f: 0x6de91220, + 0x2b6a0: 0x6de91420, 0x2b6a1: 0x6de91620, 0x2b6a2: 0x6de91820, 0x2b6a3: 0x6dff3820, + 0x2b6a4: 0x6dff3a20, 0x2b6a5: 0x6dff3c20, 0x2b6a6: 0x6dff3e20, 0x2b6a7: 0x6dff4020, + 0x2b6a8: 0x6e11a620, 0x2b6a9: 0x6e11a820, 0x2b6aa: 0x6e200020, 0x2b6ab: 0x6e200220, + 0x2b6ac: 0x6e200420, 0x2b6ad: 0x6e200620, 0x2b6ae: 0x6e2b1420, 0x2b6af: 0x6e338a20, + 0x2b6b0: 0x6e338c20, 0x2b6b1: 0x6e338e20, 0x2b6b2: 0x6e339020, 0x2b6b3: 0x6e399420, + 0x2b6b4: 0x6e399620, 0x2b6b5: 0x6e40a420, 0x2b6b6: 0x6c5c9820, 0x2b6b7: 0x6ca99e20, + 0x2b6b8: 0x6c809c20, 0x2b6b9: 0x6ca9a020, 0x2b6ba: 0x6cd80e20, 0x2b6bb: 0x6cd81020, + 0x2b6bc: 0x6d06cc20, 0x2b6bd: 0x6d34c620, 0x2b6be: 0x6d617c20, 0x2b6bf: 0x6d617e20, + // Block 0xadb, offset 0x2b6c0 + 0x2b6c0: 0x6d8b9420, 0x2b6c1: 0x6de9a020, 0x2b6c2: 0x6c5cc420, 0x2b6c3: 0x6c80c420, + 0x2b6c4: 0x6ca9e220, 0x2b6c5: 0x6ca9e420, 0x2b6c6: 0x6ca9e620, 0x2b6c7: 0x6ca9e820, + 0x2b6c8: 0x6ca9ea20, 0x2b6c9: 0x6ca9ec20, 0x2b6ca: 0x6cd85220, 0x2b6cb: 0x6d34e020, + 0x2b6cc: 0x6d34e220, 0x2b6cd: 0x6d8ba620, 0x2b6ce: 0x6e2b3220, 0x2b6cf: 0x6c0a4820, + 0x2b6d0: 0x6c3e0220, 0x2b6d1: 0x6c5cce20, 0x2b6d2: 0x6c5cd020, 0x2b6d3: 0x6c5cd220, + 0x2b6d4: 0x6c5cd420, 0x2b6d5: 0x6c80d220, 0x2b6d6: 0x6c80d420, 0x2b6d7: 0x6c80d620, + 0x2b6d8: 0x6ca9fe20, 0x2b6d9: 0x6cd86420, 0x2b6da: 0x6cd86620, 0x2b6db: 0x6d06fc20, + 0x2b6dc: 0x6d06fe20, 0x2b6dd: 0x6d070020, 0x2b6de: 0x6d34fc20, 0x2b6df: 0x6d34fe20, + 0x2b6e0: 0x6d8bba20, 0x2b6e1: 0x6d8bbc20, 0x2b6e2: 0x6db00620, 0x2b6e3: 0x6dcf8c20, + 0x2b6e4: 0x6de9b420, 0x2b6e5: 0x6e120820, 0x2b6e6: 0x6e33ae20, 0x2b6e7: 0x6c812420, + 0x2b6e8: 0x6c812620, 0x2b6e9: 0x6c812820, 0x2b6ea: 0x6caa2a20, 0x2b6eb: 0x6caa2c20, + 0x2b6ec: 0x6caa2e20, 0x2b6ed: 0x6caa3020, 0x2b6ee: 0x6cd88220, 0x2b6ef: 0x6cd88420, + 0x2b6f0: 0x6cd88620, 0x2b6f1: 0x6d074620, 0x2b6f2: 0x6d352e20, 0x2b6f3: 0x6d353020, + 0x2b6f4: 0x6d353220, 0x2b6f5: 0x6d353420, 0x2b6f6: 0x6d353620, 0x2b6f7: 0x6d61ca20, + 0x2b6f8: 0x6d8bf220, 0x2b6f9: 0x6d8bf420, 0x2b6fa: 0x6db02c20, 0x2b6fb: 0x6dcfa820, + 0x2b6fc: 0x6dcfaa20, 0x2b6fd: 0x6e204220, 0x2b6fe: 0x6c815620, 0x2b6ff: 0x6c815820, + // Block 0xadc, offset 0x2b700 + 0x2b700: 0x6caa6e20, 0x2b701: 0x6caa7020, 0x2b702: 0x6caa7220, 0x2b703: 0x6caa7420, + 0x2b704: 0x6caa7620, 0x2b705: 0x6caa7820, 0x2b706: 0x6caa7a20, 0x2b707: 0x6cd8aa20, + 0x2b708: 0x6cd8ac20, 0x2b709: 0x6cd8ae20, 0x2b70a: 0x6cd8b020, 0x2b70b: 0x6d077c20, + 0x2b70c: 0x6d077e20, 0x2b70d: 0x6d078020, 0x2b70e: 0x6d078220, 0x2b70f: 0x6d355020, + 0x2b710: 0x6d355220, 0x2b711: 0x6d355420, 0x2b712: 0x6d355620, 0x2b713: 0x6d355820, + 0x2b714: 0x6d8c0c20, 0x2b715: 0x6d8c0e20, 0x2b716: 0x6dcfd820, 0x2b717: 0x6dcfda20, + 0x2b718: 0x6dcfdc20, 0x2b719: 0x6dffb220, 0x2b71a: 0x6e122220, 0x2b71b: 0x6c5d2e20, + 0x2b71c: 0x6cd8f220, 0x2b71d: 0x6cd8f420, 0x2b71e: 0x6cd8f620, 0x2b71f: 0x6c5d3a20, + 0x2b720: 0x6c5d3c20, 0x2b721: 0x6c81a620, 0x2b722: 0x6c5d4820, 0x2b723: 0x6caaba20, + 0x2b724: 0x6d07b020, 0x2b725: 0x6d07b220, 0x2b726: 0x6d359420, 0x2b727: 0x6d359620, + 0x2b728: 0x6d359820, 0x2b729: 0x6d359a20, 0x2b72a: 0x6d359c20, 0x2b72b: 0x6d624c20, + 0x2b72c: 0x6d624e20, 0x2b72d: 0x6db07e20, 0x2b72e: 0x6db08020, 0x2b72f: 0x6db08220, + 0x2b730: 0x6dd01020, 0x2b731: 0x6e122c20, 0x2b732: 0x6c25e420, 0x2b733: 0x6c81b620, + 0x2b734: 0x6c81b820, 0x2b735: 0x6caad020, 0x2b736: 0x6caad220, 0x2b737: 0x6cd90e20, + 0x2b738: 0x6d07c020, 0x2b739: 0x6d07c220, 0x2b73a: 0x6d35ba20, 0x2b73b: 0x6d35bc20, + 0x2b73c: 0x6d35be20, 0x2b73d: 0x6d35c020, 0x2b73e: 0x6d35c220, 0x2b73f: 0x6d626820, + // Block 0xadd, offset 0x2b740 + 0x2b740: 0x6d626a20, 0x2b741: 0x6d8c6220, 0x2b742: 0x6d8c6420, 0x2b743: 0x6d8c6620, + 0x2b744: 0x6db09820, 0x2b745: 0x6db09a20, 0x2b746: 0x6db09c20, 0x2b747: 0x6db09e20, + 0x2b748: 0x6dd02a20, 0x2b749: 0x6dffc620, 0x2b74a: 0x6e205c20, 0x2b74b: 0x6d07fc20, + 0x2b74c: 0x6c145820, 0x2b74d: 0x6c145a20, 0x2b74e: 0x6c25ea20, 0x2b74f: 0x6c25ec20, + 0x2b750: 0x6c3e6220, 0x2b751: 0x6c81fe20, 0x2b752: 0x6c3e6420, 0x2b753: 0x6c3e6620, + 0x2b754: 0x6c3e6820, 0x2b755: 0x6c3e6a20, 0x2b756: 0x6c3e6c20, 0x2b757: 0x6c3e6e20, + 0x2b758: 0x6c3e7020, 0x2b759: 0x6c3e7220, 0x2b75a: 0x6c3e7420, 0x2b75b: 0x6c3e7620, + 0x2b75c: 0x6c3e7820, 0x2b75d: 0x6c3e7a20, 0x2b75e: 0x6c5d6220, 0x2b75f: 0x6c5d6420, + 0x2b760: 0x6c5d6620, 0x2b761: 0x6c5d6820, 0x2b762: 0x6c5d6a20, 0x2b763: 0x6c5d6c20, + 0x2b764: 0x6c5d6e20, 0x2b765: 0x6c5d7020, 0x2b766: 0x6c820020, 0x2b767: 0x6c820220, + 0x2b768: 0x6c820420, 0x2b769: 0x6c820620, 0x2b76a: 0x6c820820, 0x2b76b: 0x6c820a20, + 0x2b76c: 0x6c820c20, 0x2b76d: 0x6c820e20, 0x2b76e: 0x6c821020, 0x2b76f: 0x6cab1220, + 0x2b770: 0x6cab1420, 0x2b771: 0x6cab1620, 0x2b772: 0x6cab1820, 0x2b773: 0x6cab1a20, + 0x2b774: 0x6cab1c20, 0x2b775: 0x6cab1e20, 0x2b776: 0x6cab2020, 0x2b777: 0x6cab2220, + 0x2b778: 0x6cab2420, 0x2b779: 0x6cab2620, 0x2b77a: 0x6cab2820, 0x2b77b: 0x6cab2a20, + 0x2b77c: 0x6cd95c20, 0x2b77d: 0x6cd95e20, 0x2b77e: 0x6cd96020, 0x2b77f: 0x6cd96220, + // Block 0xade, offset 0x2b780 + 0x2b780: 0x6cd96420, 0x2b781: 0x6cd96620, 0x2b782: 0x6cd96820, 0x2b783: 0x6cd96a20, + 0x2b784: 0x6cd96c20, 0x2b785: 0x6cd96e20, 0x2b786: 0x6cd97020, 0x2b787: 0x6cd97220, + 0x2b788: 0x6cd97420, 0x2b789: 0x6cd97620, 0x2b78a: 0x6cd97820, 0x2b78b: 0x6cd97a20, + 0x2b78c: 0x6cd97c20, 0x2b78d: 0x6d080a20, 0x2b78e: 0x6d080c20, 0x2b78f: 0x6d080e20, + 0x2b790: 0x6d081020, 0x2b791: 0x6d081220, 0x2b792: 0x6d081420, 0x2b793: 0x6d081620, + 0x2b794: 0x6d081820, 0x2b795: 0x6d081a20, 0x2b796: 0x6d081c20, 0x2b797: 0x6d081e20, + 0x2b798: 0x6d082020, 0x2b799: 0x6d082220, 0x2b79a: 0x6d082420, 0x2b79b: 0x6d082620, + 0x2b79c: 0x6d361c20, 0x2b79d: 0x6d361e20, 0x2b79e: 0x6d362020, 0x2b79f: 0x6d362220, + 0x2b7a0: 0x6d362420, 0x2b7a1: 0x6d8c9e20, 0x2b7a2: 0x6d362620, 0x2b7a3: 0x6d362820, + 0x2b7a4: 0x6d362a20, 0x2b7a5: 0x6d362c20, 0x2b7a6: 0x6d362e20, 0x2b7a7: 0x6d363020, + 0x2b7a8: 0x6d363220, 0x2b7a9: 0x6d363420, 0x2b7aa: 0x6d363620, 0x2b7ab: 0x6d62bc20, + 0x2b7ac: 0x6d62be20, 0x2b7ad: 0x6d62c020, 0x2b7ae: 0x6d62c220, 0x2b7af: 0x6d62c420, + 0x2b7b0: 0x6d62c620, 0x2b7b1: 0x6d62c820, 0x2b7b2: 0x6d62ca20, 0x2b7b3: 0x6d62cc20, + 0x2b7b4: 0x6d62ce20, 0x2b7b5: 0x6d8ca220, 0x2b7b6: 0x6d8ca420, 0x2b7b7: 0x6d8ca620, + 0x2b7b8: 0x6d8ca820, 0x2b7b9: 0x6d8caa20, 0x2b7ba: 0x6d8cac20, 0x2b7bb: 0x6d8cae20, + 0x2b7bc: 0x6d8cb020, 0x2b7bd: 0x6d8cb220, 0x2b7be: 0x6db0d620, 0x2b7bf: 0x6db0d820, + // Block 0xadf, offset 0x2b7c0 + 0x2b7c0: 0x6db0da20, 0x2b7c1: 0x6db0dc20, 0x2b7c2: 0x6dd05e20, 0x2b7c3: 0x6dd06020, + 0x2b7c4: 0x6dd06220, 0x2b7c5: 0x6dd06420, 0x2b7c6: 0x6dea2020, 0x2b7c7: 0x6dea2220, + 0x2b7c8: 0x6dea2420, 0x2b7c9: 0x6dffe020, 0x2b7ca: 0x6dffe220, 0x2b7cb: 0x6e124020, + 0x2b7cc: 0x6e124220, 0x2b7cd: 0x6e124420, 0x2b7ce: 0x6e124620, 0x2b7cf: 0x6e206820, + 0x2b7d0: 0x6cabdc20, 0x2b7d1: 0x6dd0b020, 0x2b7d2: 0x6c5e4020, 0x2b7d3: 0x6d08fc20, + 0x2b7d4: 0x6c82fa20, 0x2b7d5: 0x6cabf220, 0x2b7d6: 0x6d370020, 0x2b7d7: 0x6d637020, + 0x2b7d8: 0x6d8d7420, 0x2b7d9: 0x6c831020, 0x2b7da: 0x6c831220, 0x2b7db: 0x6cac0420, + 0x2b7dc: 0x6d638620, 0x2b7dd: 0x6d372e20, 0x2b7de: 0x6d8d9620, 0x2b7df: 0x6e126a20, + 0x2b7e0: 0x6c3f3420, 0x2b7e1: 0x6c5e5a20, 0x2b7e2: 0x6c5e5c20, 0x2b7e3: 0x6c5e5e20, + 0x2b7e4: 0x6c832820, 0x2b7e5: 0x6c832a20, 0x2b7e6: 0x6cac1020, 0x2b7e7: 0x6cac1220, + 0x2b7e8: 0x6cac1420, 0x2b7e9: 0x6cac1620, 0x2b7ea: 0x6cdac020, 0x2b7eb: 0x6cdac220, + 0x2b7ec: 0x6cdac420, 0x2b7ed: 0x6cdac620, 0x2b7ee: 0x6cdac820, 0x2b7ef: 0x6d091e20, + 0x2b7f0: 0x6d092020, 0x2b7f1: 0x6d373220, 0x2b7f2: 0x6d373420, 0x2b7f3: 0x6d373620, + 0x2b7f4: 0x6d373820, 0x2b7f5: 0x6d373a20, 0x2b7f6: 0x6d373c20, 0x2b7f7: 0x6d373e20, + 0x2b7f8: 0x6d374020, 0x2b7f9: 0x6d639c20, 0x2b7fa: 0x6d639e20, 0x2b7fb: 0x6d63a020, + 0x2b7fc: 0x6d8d9820, 0x2b7fd: 0x6d8d9a20, 0x2b7fe: 0x6d8d9c20, 0x2b7ff: 0x6db18e20, + // Block 0xae0, offset 0x2b800 + 0x2b800: 0x6db19020, 0x2b801: 0x6db19220, 0x2b802: 0x6db19420, 0x2b803: 0x6db19620, + 0x2b804: 0x6db19820, 0x2b805: 0x6db19a20, 0x2b806: 0x6dd0dc20, 0x2b807: 0x6dd0de20, + 0x2b808: 0x6dd0e020, 0x2b809: 0x6e003420, 0x2b80a: 0x6c5e7a20, 0x2b80b: 0x6cac4c20, + 0x2b80c: 0x6d8dca20, 0x2b80d: 0x6d8dcc20, 0x2b80e: 0x6dd11820, 0x2b80f: 0x6dd11a20, + 0x2b810: 0x6e209c20, 0x2b811: 0x6c149c20, 0x2b812: 0x6c3f4620, 0x2b813: 0x6c3f4820, + 0x2b814: 0x6c3f4a20, 0x2b815: 0x6c5e7e20, 0x2b816: 0x6c5e8020, 0x2b817: 0x6c5e8220, + 0x2b818: 0x6c5e8420, 0x2b819: 0x6c5e8620, 0x2b81a: 0x6c836020, 0x2b81b: 0x6c836220, + 0x2b81c: 0x6c836420, 0x2b81d: 0x6c836620, 0x2b81e: 0x6c836820, 0x2b81f: 0x6c836a20, + 0x2b820: 0x6c836c20, 0x2b821: 0x6c836e20, 0x2b822: 0x6c837020, 0x2b823: 0x6c837220, + 0x2b824: 0x6c837420, 0x2b825: 0x6c837620, 0x2b826: 0x6cac5c20, 0x2b827: 0x6cac5e20, + 0x2b828: 0x6cac6020, 0x2b829: 0x6cac6220, 0x2b82a: 0x6cac6420, 0x2b82b: 0x6cac6620, + 0x2b82c: 0x6cac6820, 0x2b82d: 0x6cac6a20, 0x2b82e: 0x6cac6c20, 0x2b82f: 0x6cac6e20, + 0x2b830: 0x6cdaf220, 0x2b831: 0x6cdaf420, 0x2b832: 0x6cdaf620, 0x2b833: 0x6cdaf820, + 0x2b834: 0x6cdafa20, 0x2b835: 0x6cdafc20, 0x2b836: 0x6cdafe20, 0x2b837: 0x6cdb0020, + 0x2b838: 0x6cdb0220, 0x2b839: 0x6cdb0420, 0x2b83a: 0x6cdb0620, 0x2b83b: 0x6cdb0820, + 0x2b83c: 0x6cdb0a20, 0x2b83d: 0x6cdb0c20, 0x2b83e: 0x6cdb0e20, 0x2b83f: 0x6cdb1020, + // Block 0xae1, offset 0x2b840 + 0x2b840: 0x6cdb1220, 0x2b841: 0x6cdb1420, 0x2b842: 0x6d095a20, 0x2b843: 0x6d095c20, + 0x2b844: 0x6d095e20, 0x2b845: 0x6d096020, 0x2b846: 0x6d096220, 0x2b847: 0x6d096420, + 0x2b848: 0x6d096620, 0x2b849: 0x6d096820, 0x2b84a: 0x6d096a20, 0x2b84b: 0x6d096c20, + 0x2b84c: 0x6d096e20, 0x2b84d: 0x6d097020, 0x2b84e: 0x6d097220, 0x2b84f: 0x6d097420, + 0x2b850: 0x6d097620, 0x2b851: 0x6d097820, 0x2b852: 0x6d097a20, 0x2b853: 0x6d097c20, + 0x2b854: 0x6d097e20, 0x2b855: 0x6d378020, 0x2b856: 0x6d098020, 0x2b857: 0x6d378220, + 0x2b858: 0x6d378420, 0x2b859: 0x6d378620, 0x2b85a: 0x6d378820, 0x2b85b: 0x6d378a20, + 0x2b85c: 0x6d378c20, 0x2b85d: 0x6d378e20, 0x2b85e: 0x6d379020, 0x2b85f: 0x6d379220, + 0x2b860: 0x6d379420, 0x2b861: 0x6d379620, 0x2b862: 0x6d379820, 0x2b863: 0x6d379a20, + 0x2b864: 0x6d379c20, 0x2b865: 0x6d379e20, 0x2b866: 0x6d37a020, 0x2b867: 0x6d37a220, + 0x2b868: 0x6d37a420, 0x2b869: 0x6d37a620, 0x2b86a: 0x6d37a820, 0x2b86b: 0x6d37aa20, + 0x2b86c: 0x6d37ac20, 0x2b86d: 0x6d37ae20, 0x2b86e: 0x6d63f220, 0x2b86f: 0x6d63f420, + 0x2b870: 0x6d63f620, 0x2b871: 0x6d63f820, 0x2b872: 0x6d63fa20, 0x2b873: 0x6d63fc20, + 0x2b874: 0x6d63fe20, 0x2b875: 0x6d640020, 0x2b876: 0x6d640220, 0x2b877: 0x6d640420, + 0x2b878: 0x6d640620, 0x2b879: 0x6d640820, 0x2b87a: 0x6d640a20, 0x2b87b: 0x6d640c20, + 0x2b87c: 0x6d8dda20, 0x2b87d: 0x6d8ddc20, 0x2b87e: 0x6d8dde20, 0x2b87f: 0x6d8de020, + // Block 0xae2, offset 0x2b880 + 0x2b880: 0x6d8de220, 0x2b881: 0x6d8de420, 0x2b882: 0x6d8de620, 0x2b883: 0x6d8de820, + 0x2b884: 0x6d8dea20, 0x2b885: 0x6d8dec20, 0x2b886: 0x6d8dee20, 0x2b887: 0x6d8df020, + 0x2b888: 0x6d8df220, 0x2b889: 0x6d8df420, 0x2b88a: 0x6d8df620, 0x2b88b: 0x6d8df820, + 0x2b88c: 0x6d8dfa20, 0x2b88d: 0x6d8dfc20, 0x2b88e: 0x6db1c020, 0x2b88f: 0x6db1c220, + 0x2b890: 0x6db1c420, 0x2b891: 0x6db1c620, 0x2b892: 0x6db1c820, 0x2b893: 0x6db1ca20, + 0x2b894: 0x6db1cc20, 0x2b895: 0x6db1ce20, 0x2b896: 0x6db1d020, 0x2b897: 0x6db1d220, + 0x2b898: 0x6db1d420, 0x2b899: 0x6db1d620, 0x2b89a: 0x6db1d820, 0x2b89b: 0x6db1da20, + 0x2b89c: 0x6db1dc20, 0x2b89d: 0x6db1de20, 0x2b89e: 0x6db1e020, 0x2b89f: 0x6db1e220, + 0x2b8a0: 0x6db1e420, 0x2b8a1: 0x6db1e620, 0x2b8a2: 0x6db1e820, 0x2b8a3: 0x6db1ea20, + 0x2b8a4: 0x6db1ec20, 0x2b8a5: 0x6db1ee20, 0x2b8a6: 0x6db1f020, 0x2b8a7: 0x6db1f220, + 0x2b8a8: 0x6db1f420, 0x2b8a9: 0x6db1f620, 0x2b8aa: 0x6db1f820, 0x2b8ab: 0x6db1fa20, + 0x2b8ac: 0x6db1fc20, 0x2b8ad: 0x6dd11c20, 0x2b8ae: 0x6dd11e20, 0x2b8af: 0x6dd12020, + 0x2b8b0: 0x6dd12220, 0x2b8b1: 0x6dd12420, 0x2b8b2: 0x6dd12620, 0x2b8b3: 0x6dd12820, + 0x2b8b4: 0x6dd12a20, 0x2b8b5: 0x6dd12c20, 0x2b8b6: 0x6dd12e20, 0x2b8b7: 0x6dd13020, + 0x2b8b8: 0x6dd13220, 0x2b8b9: 0x6dd13420, 0x2b8ba: 0x6dd13620, 0x2b8bb: 0x6dd13820, + 0x2b8bc: 0x6dd13a20, 0x2b8bd: 0x6dd13c20, 0x2b8be: 0x6dd13e20, 0x2b8bf: 0x6dd14020, + // Block 0xae3, offset 0x2b8c0 + 0x2b8c0: 0x6dd14220, 0x2b8c1: 0x6dd14420, 0x2b8c2: 0x6dd14620, 0x2b8c3: 0x6dd14820, + 0x2b8c4: 0x6dd14a20, 0x2b8c5: 0x6deaa420, 0x2b8c6: 0x6deaa620, 0x2b8c7: 0x6deaa820, + 0x2b8c8: 0x6deaaa20, 0x2b8c9: 0x6deaac20, 0x2b8ca: 0x6deaae20, 0x2b8cb: 0x6deab020, + 0x2b8cc: 0x6deab220, 0x2b8cd: 0x6deab420, 0x2b8ce: 0x6deab620, 0x2b8cf: 0x6deab820, + 0x2b8d0: 0x6deaba20, 0x2b8d1: 0x6deabc20, 0x2b8d2: 0x6e005220, 0x2b8d3: 0x6e005420, + 0x2b8d4: 0x6e005620, 0x2b8d5: 0x6e005820, 0x2b8d6: 0x6e005a20, 0x2b8d7: 0x6e005c20, + 0x2b8d8: 0x6e005e20, 0x2b8d9: 0x6e006020, 0x2b8da: 0x6e006220, 0x2b8db: 0x6e006420, + 0x2b8dc: 0x6e006620, 0x2b8dd: 0x6e006820, 0x2b8de: 0x6e127a20, 0x2b8df: 0x6e127c20, + 0x2b8e0: 0x6e127e20, 0x2b8e1: 0x6e128020, 0x2b8e2: 0x6e128220, 0x2b8e3: 0x6e128420, + 0x2b8e4: 0x6e128620, 0x2b8e5: 0x6e128820, 0x2b8e6: 0x6e209e20, 0x2b8e7: 0x6e20a020, + 0x2b8e8: 0x6e20a220, 0x2b8e9: 0x6e20a420, 0x2b8ea: 0x6e20a620, 0x2b8eb: 0x6e20a820, + 0x2b8ec: 0x6e20aa20, 0x2b8ed: 0x6e20ac20, 0x2b8ee: 0x6e20ae20, 0x2b8ef: 0x6e20b020, + 0x2b8f0: 0x6e20b220, 0x2b8f1: 0x6e20b420, 0x2b8f2: 0x6e20b620, 0x2b8f3: 0x6e2b7420, + 0x2b8f4: 0x6e2b7620, 0x2b8f5: 0x6e2b7820, 0x2b8f6: 0x6e2b7a20, 0x2b8f7: 0x6e2b7c20, + 0x2b8f8: 0x6e33e620, 0x2b8f9: 0x6e33e820, 0x2b8fa: 0x6e33ea20, 0x2b8fb: 0x6e39c420, + 0x2b8fc: 0x6e39c620, 0x2b8fd: 0x6e39c820, 0x2b8fe: 0x6e3df220, 0x2b8ff: 0x6e40c820, + // Block 0xae4, offset 0x2b900 + 0x2b900: 0x6e40ca20, 0x2b901: 0x6e42ee20, 0x2b902: 0x6e446020, 0x2b903: 0x6e446220, + 0x2b904: 0x6e446420, 0x2b905: 0x6e454820, 0x2b906: 0x6e454a20, 0x2b907: 0x6e46ce20, + 0x2b908: 0x6c400e20, 0x2b909: 0x6c5f9420, 0x2b90a: 0x6c84c620, 0x2b90b: 0x6c84c820, + 0x2b90c: 0x6c84ca20, 0x2b90d: 0x6c84cc20, 0x2b90e: 0x6cae2220, 0x2b90f: 0x6cae2420, + 0x2b910: 0x6cdd4820, 0x2b911: 0x6cdd4a20, 0x2b912: 0x6d0bc220, 0x2b913: 0x6d0bc420, + 0x2b914: 0x6d0bc620, 0x2b915: 0x6d0bc820, 0x2b916: 0x6d0bca20, 0x2b917: 0x6d65f420, + 0x2b918: 0x6d8fc820, 0x2b919: 0x6db39820, 0x2b91a: 0x6dd29620, 0x2b91b: 0x6dd29820, + 0x2b91c: 0x6debd220, 0x2b91d: 0x6c268820, 0x2b91e: 0x6c5fa220, 0x2b91f: 0x6c5fa420, + 0x2b920: 0x6c5fa620, 0x2b921: 0x6c84de20, 0x2b922: 0x6c84e020, 0x2b923: 0x6c84e220, + 0x2b924: 0x6cae4e20, 0x2b925: 0x6cae5020, 0x2b926: 0x6cae5220, 0x2b927: 0x6cae5420, + 0x2b928: 0x6cae5620, 0x2b929: 0x6cae5820, 0x2b92a: 0x6cae5a20, 0x2b92b: 0x6cae5c20, + 0x2b92c: 0x6cae5e20, 0x2b92d: 0x6cdd6620, 0x2b92e: 0x6cdd6820, 0x2b92f: 0x6cdd6a20, + 0x2b930: 0x6cdd6c20, 0x2b931: 0x6cdd6e20, 0x2b932: 0x6cdd7020, 0x2b933: 0x6cdd7220, + 0x2b934: 0x6cdd7420, 0x2b935: 0x6cdd7620, 0x2b936: 0x6d0bde20, 0x2b937: 0x6d0be020, + 0x2b938: 0x6d0be220, 0x2b939: 0x6d0be420, 0x2b93a: 0x6d0be620, 0x2b93b: 0x6d0be820, + 0x2b93c: 0x6d0bea20, 0x2b93d: 0x6d0bec20, 0x2b93e: 0x6d0bee20, 0x2b93f: 0x6d39e220, + // Block 0xae5, offset 0x2b940 + 0x2b940: 0x6d39e420, 0x2b941: 0x6d39e620, 0x2b942: 0x6d39e820, 0x2b943: 0x6d39ea20, + 0x2b944: 0x6d39ec20, 0x2b945: 0x6d39ee20, 0x2b946: 0x6d39f020, 0x2b947: 0x6d39f220, + 0x2b948: 0x6d39f420, 0x2b949: 0x6d39f620, 0x2b94a: 0x6d39f820, 0x2b94b: 0x6d661220, + 0x2b94c: 0x6d661420, 0x2b94d: 0x6d661620, 0x2b94e: 0x6d661820, 0x2b94f: 0x6d661a20, + 0x2b950: 0x6d661c20, 0x2b951: 0x6d661e20, 0x2b952: 0x6d662020, 0x2b953: 0x6d662220, + 0x2b954: 0x6d662420, 0x2b955: 0x6d39fa20, 0x2b956: 0x6d662620, 0x2b957: 0x6d8ffa20, + 0x2b958: 0x6d8ffc20, 0x2b959: 0x6d8ffe20, 0x2b95a: 0x6d900020, 0x2b95b: 0x6d900220, + 0x2b95c: 0x6d900420, 0x2b95d: 0x6d900620, 0x2b95e: 0x6d900820, 0x2b95f: 0x6db3b420, + 0x2b960: 0x6db3b620, 0x2b961: 0x6db3b820, 0x2b962: 0x6db3ba20, 0x2b963: 0x6db3bc20, + 0x2b964: 0x6db3be20, 0x2b965: 0x6db3c020, 0x2b966: 0x6db3c220, 0x2b967: 0x6db3c420, + 0x2b968: 0x6db3c620, 0x2b969: 0x6db3c820, 0x2b96a: 0x6db3ca20, 0x2b96b: 0x6db3cc20, + 0x2b96c: 0x6db3ce20, 0x2b96d: 0x6db3d020, 0x2b96e: 0x6db3d220, 0x2b96f: 0x6dd2b020, + 0x2b970: 0x6dd2b220, 0x2b971: 0x6dd2b420, 0x2b972: 0x6dd2b620, 0x2b973: 0x6dd2b820, + 0x2b974: 0x6debe620, 0x2b975: 0x6debe820, 0x2b976: 0x6debea20, 0x2b977: 0x6debec20, + 0x2b978: 0x6debee20, 0x2b979: 0x6debf020, 0x2b97a: 0x6debf220, 0x2b97b: 0x6debf420, + 0x2b97c: 0x6e016420, 0x2b97d: 0x6e016620, 0x2b97e: 0x6e016820, 0x2b97f: 0x6e016a20, + // Block 0xae6, offset 0x2b980 + 0x2b980: 0x6e016c20, 0x2b981: 0x6e016e20, 0x2b982: 0x6e135020, 0x2b983: 0x6e135220, + 0x2b984: 0x6e135420, 0x2b985: 0x6e212220, 0x2b986: 0x6e212420, 0x2b987: 0x6e212620, + 0x2b988: 0x6e212820, 0x2b989: 0x6e212a20, 0x2b98a: 0x6e2bdc20, 0x2b98b: 0x6e2bde20, + 0x2b98c: 0x6e2be020, 0x2b98d: 0x6e39ea20, 0x2b98e: 0x6e42fc20, 0x2b98f: 0x6c5ff620, + 0x2b990: 0x6c858220, 0x2b991: 0x6caf1a20, 0x2b992: 0x6d0cbc20, 0x2b993: 0x6d3b1020, + 0x2b994: 0x6d673a20, 0x2b995: 0x6c859420, 0x2b996: 0x6cde5020, 0x2b997: 0x6d912020, + 0x2b998: 0x6d912220, 0x2b999: 0x6e01e020, 0x2b99a: 0x6c404420, 0x2b99b: 0x6c404620, + 0x2b99c: 0x6c600c20, 0x2b99d: 0x6c600e20, 0x2b99e: 0x6c601020, 0x2b99f: 0x6c85a020, + 0x2b9a0: 0x6c85a220, 0x2b9a1: 0x6c85a420, 0x2b9a2: 0x6caf3420, 0x2b9a3: 0x6caf3620, + 0x2b9a4: 0x6caf3820, 0x2b9a5: 0x6caf3a20, 0x2b9a6: 0x6caf3c20, 0x2b9a7: 0x6caf3e20, + 0x2b9a8: 0x6cde6a20, 0x2b9a9: 0x6cde6c20, 0x2b9aa: 0x6cde6e20, 0x2b9ab: 0x6cde7020, + 0x2b9ac: 0x6cde7220, 0x2b9ad: 0x6cde7420, 0x2b9ae: 0x6cde7620, 0x2b9af: 0x6d0cd820, + 0x2b9b0: 0x6d0cda20, 0x2b9b1: 0x6d0cdc20, 0x2b9b2: 0x6d0cde20, 0x2b9b3: 0x6d3b2820, + 0x2b9b4: 0x6d3b2a20, 0x2b9b5: 0x6d3b2c20, 0x2b9b6: 0x6d3b2e20, 0x2b9b7: 0x6d3b3020, + 0x2b9b8: 0x6d3b3220, 0x2b9b9: 0x6d3b3420, 0x2b9ba: 0x6d3b3620, 0x2b9bb: 0x6d3b3820, + 0x2b9bc: 0x6d3b3a20, 0x2b9bd: 0x6d3b3c20, 0x2b9be: 0x6d3b3e20, 0x2b9bf: 0x6d3b4020, + // Block 0xae7, offset 0x2b9c0 + 0x2b9c0: 0x6d3b4220, 0x2b9c1: 0x6d3b4420, 0x2b9c2: 0x6d3b4620, 0x2b9c3: 0x6d675820, + 0x2b9c4: 0x6d675a20, 0x2b9c5: 0x6d675c20, 0x2b9c6: 0x6d675e20, 0x2b9c7: 0x6d676020, + 0x2b9c8: 0x6d676220, 0x2b9c9: 0x6d676420, 0x2b9ca: 0x6d676620, 0x2b9cb: 0x6d676820, + 0x2b9cc: 0x6d676a20, 0x2b9cd: 0x6d676c20, 0x2b9ce: 0x6d913020, 0x2b9cf: 0x6d913220, + 0x2b9d0: 0x6d913420, 0x2b9d1: 0x6d913620, 0x2b9d2: 0x6d913820, 0x2b9d3: 0x6d913a20, + 0x2b9d4: 0x6db4da20, 0x2b9d5: 0x6db4dc20, 0x2b9d6: 0x6db4de20, 0x2b9d7: 0x6db4e020, + 0x2b9d8: 0x6db4e220, 0x2b9d9: 0x6db4e420, 0x2b9da: 0x6db4e620, 0x2b9db: 0x6db4e820, + 0x2b9dc: 0x6db4ea20, 0x2b9dd: 0x6db4ec20, 0x2b9de: 0x6dd3aa20, 0x2b9df: 0x6dd3ac20, + 0x2b9e0: 0x6dd3ae20, 0x2b9e1: 0x6dd3b020, 0x2b9e2: 0x6dd3b220, 0x2b9e3: 0x6dd3b420, + 0x2b9e4: 0x6decac20, 0x2b9e5: 0x6decae20, 0x2b9e6: 0x6e01e420, 0x2b9e7: 0x6e01e620, + 0x2b9e8: 0x6e01e820, 0x2b9e9: 0x6e01ea20, 0x2b9ea: 0x6e13d020, 0x2b9eb: 0x6e218c20, + 0x2b9ec: 0x6e2c2220, 0x2b9ed: 0x6e2c2420, 0x2b9ee: 0x6e346020, 0x2b9ef: 0x6e346220, + 0x2b9f0: 0x6e3a0a20, 0x2b9f1: 0x6e40fe20, 0x2b9f2: 0x6c606420, 0x2b9f3: 0x6c862220, + 0x2b9f4: 0x6cafe220, 0x2b9f5: 0x6cdefa20, 0x2b9f6: 0x6cdefc20, 0x2b9f7: 0x6c862a20, + 0x2b9f8: 0x6c862c20, 0x2b9f9: 0x6cafee20, 0x2b9fa: 0x6caff020, 0x2b9fb: 0x6caff220, + 0x2b9fc: 0x6cdf0a20, 0x2b9fd: 0x6cdf0c20, 0x2b9fe: 0x6cdf0e20, 0x2b9ff: 0x6cdf1020, + // Block 0xae8, offset 0x2ba00 + 0x2ba00: 0x6d0d7c20, 0x2ba01: 0x6d0d7e20, 0x2ba02: 0x6d3bec20, 0x2ba03: 0x6d3bee20, + 0x2ba04: 0x6d67f820, 0x2ba05: 0x6d67fa20, 0x2ba06: 0x6d91c220, 0x2ba07: 0x6d91c420, + 0x2ba08: 0x6d91c620, 0x2ba09: 0x6d91c820, 0x2ba0a: 0x6db58020, 0x2ba0b: 0x6db58220, + 0x2ba0c: 0x6db58420, 0x2ba0d: 0x6dd41420, 0x2ba0e: 0x6dd41620, 0x2ba0f: 0x6ded0420, + 0x2ba10: 0x6ded0620, 0x2ba11: 0x6ded0820, 0x2ba12: 0x6ded0a20, 0x2ba13: 0x6ded0c20, + 0x2ba14: 0x6e13fc20, 0x2ba15: 0x6e3e2e20, 0x2ba16: 0x6e45d820, 0x2ba17: 0x6cb01e20, + 0x2ba18: 0x6d0db020, 0x2ba19: 0x6d0db220, 0x2ba1a: 0x6d0db420, 0x2ba1b: 0x6d3c2020, + 0x2ba1c: 0x6d683a20, 0x2ba1d: 0x6d683c20, 0x2ba1e: 0x6d683e20, 0x2ba1f: 0x6d684020, + 0x2ba20: 0x6d684220, 0x2ba21: 0x6d920220, 0x2ba22: 0x6d920420, 0x2ba23: 0x6d920620, + 0x2ba24: 0x6d920820, 0x2ba25: 0x6db5a820, 0x2ba26: 0x6db5aa20, 0x2ba27: 0x6dd43620, + 0x2ba28: 0x6ded2420, 0x2ba29: 0x6ded2620, 0x2ba2a: 0x6e022e20, 0x2ba2b: 0x6e023020, + 0x2ba2c: 0x6ded2820, 0x2ba2d: 0x6e3a3620, 0x2ba2e: 0x6c608620, 0x2ba2f: 0x6c608820, + 0x2ba30: 0x6c608a20, 0x2ba31: 0x6c864a20, 0x2ba32: 0x6c864c20, 0x2ba33: 0x6cb05620, + 0x2ba34: 0x6cb05820, 0x2ba35: 0x6cb05a20, 0x2ba36: 0x6cb05c20, 0x2ba37: 0x6cb05e20, + 0x2ba38: 0x6cb06020, 0x2ba39: 0x6cb06220, 0x2ba3a: 0x6cb06420, 0x2ba3b: 0x6cb06620, + 0x2ba3c: 0x6cb06820, 0x2ba3d: 0x6cb06a20, 0x2ba3e: 0x6cb06c20, 0x2ba3f: 0x6cb06e20, + // Block 0xae9, offset 0x2ba40 + 0x2ba40: 0x6cb07020, 0x2ba41: 0x6cb07220, 0x2ba42: 0x6cb07420, 0x2ba43: 0x6cb07620, + 0x2ba44: 0x6cdf6020, 0x2ba45: 0x6cdf6220, 0x2ba46: 0x6cdf6420, 0x2ba47: 0x6cdf6620, + 0x2ba48: 0x6cdf6820, 0x2ba49: 0x6cdf6a20, 0x2ba4a: 0x6cdf6c20, 0x2ba4b: 0x6cdf6e20, + 0x2ba4c: 0x6cdf7020, 0x2ba4d: 0x6cdf7220, 0x2ba4e: 0x6cdf7420, 0x2ba4f: 0x6cdf7620, + 0x2ba50: 0x6cdf7820, 0x2ba51: 0x6cdf7a20, 0x2ba52: 0x6cdf7c20, 0x2ba53: 0x6cdf7e20, + 0x2ba54: 0x6d0de020, 0x2ba55: 0x6d0de220, 0x2ba56: 0x6d0de420, 0x2ba57: 0x6d0de620, + 0x2ba58: 0x6d0de820, 0x2ba59: 0x6d0dea20, 0x2ba5a: 0x6d0dec20, 0x2ba5b: 0x6d0dee20, + 0x2ba5c: 0x6d0df020, 0x2ba5d: 0x6d3c4220, 0x2ba5e: 0x6d3c4420, 0x2ba5f: 0x6d3c4620, + 0x2ba60: 0x6d3c4820, 0x2ba61: 0x6d3c4a20, 0x2ba62: 0x6d3c4c20, 0x2ba63: 0x6d3c4e20, + 0x2ba64: 0x6d3c5020, 0x2ba65: 0x6d3c5220, 0x2ba66: 0x6d3c5420, 0x2ba67: 0x6d3c5620, + 0x2ba68: 0x6d3c5820, 0x2ba69: 0x6d687e20, 0x2ba6a: 0x6d688020, 0x2ba6b: 0x6d688220, + 0x2ba6c: 0x6d688420, 0x2ba6d: 0x6d688620, 0x2ba6e: 0x6d688820, 0x2ba6f: 0x6d688a20, + 0x2ba70: 0x6d688c20, 0x2ba71: 0x6d688e20, 0x2ba72: 0x6d689020, 0x2ba73: 0x6d689220, + 0x2ba74: 0x6d689420, 0x2ba75: 0x6d689620, 0x2ba76: 0x6d689820, 0x2ba77: 0x6d689a20, + 0x2ba78: 0x6d689c20, 0x2ba79: 0x6d923220, 0x2ba7a: 0x6d923420, 0x2ba7b: 0x6d923620, + 0x2ba7c: 0x6d923820, 0x2ba7d: 0x6d923a20, 0x2ba7e: 0x6db5d620, 0x2ba7f: 0x6db5d820, + // Block 0xaea, offset 0x2ba80 + 0x2ba80: 0x6db5da20, 0x2ba81: 0x6db5dc20, 0x2ba82: 0x6db5de20, 0x2ba83: 0x6dd45220, + 0x2ba84: 0x6dd45420, 0x2ba85: 0x6dd45620, 0x2ba86: 0x6dd45820, 0x2ba87: 0x6dd45a20, + 0x2ba88: 0x6dd45c20, 0x2ba89: 0x6dd45e20, 0x2ba8a: 0x6dd46020, 0x2ba8b: 0x6ded4220, + 0x2ba8c: 0x6ded4420, 0x2ba8d: 0x6ded4620, 0x2ba8e: 0x6ded4820, 0x2ba8f: 0x6ded4a20, + 0x2ba90: 0x6ded4c20, 0x2ba91: 0x6ded4e20, 0x2ba92: 0x6e024020, 0x2ba93: 0x6e024220, + 0x2ba94: 0x6e024420, 0x2ba95: 0x6e024620, 0x2ba96: 0x6e024820, 0x2ba97: 0x6e024a20, + 0x2ba98: 0x6e024c20, 0x2ba99: 0x6e141620, 0x2ba9a: 0x6e141820, 0x2ba9b: 0x6e141a20, + 0x2ba9c: 0x6e141c20, 0x2ba9d: 0x6e141e20, 0x2ba9e: 0x6e142020, 0x2ba9f: 0x6e21c220, + 0x2baa0: 0x6e21c420, 0x2baa1: 0x6e21c620, 0x2baa2: 0x6e2c4420, 0x2baa3: 0x6cb10a20, + 0x2baa4: 0x6d0eb220, 0x2baa5: 0x6d697a20, 0x2baa6: 0x6db69820, 0x2baa7: 0x6db69a20, + 0x2baa8: 0x6dd4fc20, 0x2baa9: 0x6e2c7620, 0x2baaa: 0x6c60be20, 0x2baab: 0x6c86c420, + 0x2baac: 0x6ce04820, 0x2baad: 0x6ce04a20, 0x2baae: 0x6d3d1620, 0x2baaf: 0x6d698420, + 0x2bab0: 0x6db69e20, 0x2bab1: 0x6dd4fe20, 0x2bab2: 0x6e221620, 0x2bab3: 0x6c40b620, + 0x2bab4: 0x6cb15020, 0x2bab5: 0x6ce05020, 0x2bab6: 0x6d0eca20, 0x2bab7: 0x6d3d1e20, + 0x2bab8: 0x6d3d2020, 0x2bab9: 0x6d3d2220, 0x2baba: 0x6d699620, 0x2babb: 0x6d930c20, + 0x2babc: 0x6d930e20, 0x2babd: 0x6d931020, 0x2babe: 0x6d931220, 0x2babf: 0x6d931420, + // Block 0xaeb, offset 0x2bac0 + 0x2bac0: 0x6db6ae20, 0x2bac1: 0x6db6b020, 0x2bac2: 0x6db6b220, 0x2bac3: 0x6e147020, + 0x2bac4: 0x6e3a5420, 0x2bac5: 0x6c86d820, 0x2bac6: 0x6cb15820, 0x2bac7: 0x6cb15a20, + 0x2bac8: 0x6ce05c20, 0x2bac9: 0x6d0ed620, 0x2baca: 0x6d69b420, 0x2bacb: 0x6d69b620, + 0x2bacc: 0x6d69b820, 0x2bacd: 0x6d932020, 0x2bace: 0x6d932220, 0x2bacf: 0x6dd51420, + 0x2bad0: 0x6dee0620, 0x2bad1: 0x6dee0820, 0x2bad2: 0x6e147620, 0x2bad3: 0x6e222220, + 0x2bad4: 0x6e3a5c20, 0x2bad5: 0x6e3a5e20, 0x2bad6: 0x6cb17820, 0x2bad7: 0x6cb17a20, + 0x2bad8: 0x6cb17c20, 0x2bad9: 0x6cb17e20, 0x2bada: 0x6ce07a20, 0x2badb: 0x6ce07c20, + 0x2badc: 0x6d3d4e20, 0x2badd: 0x6d69dc20, 0x2bade: 0x6d69de20, 0x2badf: 0x6d934020, + 0x2bae0: 0x6db6e220, 0x2bae1: 0x6dd52820, 0x2bae2: 0x6dd52a20, 0x2bae3: 0x6dee1820, + 0x2bae4: 0x6dee1a20, 0x2bae5: 0x6dee1c20, 0x2bae6: 0x6dee1e20, 0x2bae7: 0x6cb19420, + 0x2bae8: 0x6cb19620, 0x2bae9: 0x6ce0ae20, 0x2baea: 0x6ce0b020, 0x2baeb: 0x6ce0b220, + 0x2baec: 0x6ce0b420, 0x2baed: 0x6ce0b620, 0x2baee: 0x6ce0b820, 0x2baef: 0x6ce0ba20, + 0x2baf0: 0x6d0f2820, 0x2baf1: 0x6d0f2a20, 0x2baf2: 0x6d0f2c20, 0x2baf3: 0x6d3d7620, + 0x2baf4: 0x6d3d7820, 0x2baf5: 0x6d3d7a20, 0x2baf6: 0x6d6a0020, 0x2baf7: 0x6d6a0220, + 0x2baf8: 0x6d6a0420, 0x2baf9: 0x6d6a0620, 0x2bafa: 0x6d6a0820, 0x2bafb: 0x6d6a0a20, + 0x2bafc: 0x6d6a0c20, 0x2bafd: 0x6d6a0e20, 0x2bafe: 0x6d6a1020, 0x2baff: 0x6d6a1220, + // Block 0xaec, offset 0x2bb00 + 0x2bb00: 0x6d936820, 0x2bb01: 0x6d936a20, 0x2bb02: 0x6d936c20, 0x2bb03: 0x6d936e20, + 0x2bb04: 0x6d937020, 0x2bb05: 0x6db70420, 0x2bb06: 0x6db70620, 0x2bb07: 0x6dd54620, + 0x2bb08: 0x6dee3620, 0x2bb09: 0x6e02e220, 0x2bb0a: 0x6e223020, 0x2bb0b: 0x6e2c8a20, + 0x2bb0c: 0x6d0f9020, 0x2bb0d: 0x6d6a6e20, 0x2bb0e: 0x6d6a7020, 0x2bb0f: 0x6d93be20, + 0x2bb10: 0x6d93c020, 0x2bb11: 0x6c872620, 0x2bb12: 0x6d0f9820, 0x2bb13: 0x6d3dca20, + 0x2bb14: 0x6d3dcc20, 0x2bb15: 0x6e14a620, 0x2bb16: 0x6c872820, 0x2bb17: 0x6c872a20, + 0x2bb18: 0x6c872c20, 0x2bb19: 0x6cb1f220, 0x2bb1a: 0x6cb1f420, 0x2bb1b: 0x6cb1f620, + 0x2bb1c: 0x6cb1f820, 0x2bb1d: 0x6ce13e20, 0x2bb1e: 0x6ce14020, 0x2bb1f: 0x6ce14220, + 0x2bb20: 0x6ce14420, 0x2bb21: 0x6ce14620, 0x2bb22: 0x6ce14820, 0x2bb23: 0x6ce14a20, + 0x2bb24: 0x6ce14c20, 0x2bb25: 0x6d0fa820, 0x2bb26: 0x6d0faa20, 0x2bb27: 0x6d0fac20, + 0x2bb28: 0x6d0fae20, 0x2bb29: 0x6d0fb020, 0x2bb2a: 0x6d0fb220, 0x2bb2b: 0x6d3dd820, + 0x2bb2c: 0x6d3dda20, 0x2bb2d: 0x6d3ddc20, 0x2bb2e: 0x6d3dde20, 0x2bb2f: 0x6d3de020, + 0x2bb30: 0x6d3de220, 0x2bb31: 0x6d3de420, 0x2bb32: 0x6d3de620, 0x2bb33: 0x6d6a8420, + 0x2bb34: 0x6d6a8620, 0x2bb35: 0x6d6a8820, 0x2bb36: 0x6d6a8a20, 0x2bb37: 0x6d6a8c20, + 0x2bb38: 0x6d6a8e20, 0x2bb39: 0x6d93dc20, 0x2bb3a: 0x6d93de20, 0x2bb3b: 0x6d93e020, + 0x2bb3c: 0x6d93e220, 0x2bb3d: 0x6db74e20, 0x2bb3e: 0x6db75020, 0x2bb3f: 0x6db75220, + // Block 0xaed, offset 0x2bb40 + 0x2bb40: 0x6db75420, 0x2bb41: 0x6dd59c20, 0x2bb42: 0x6dd59e20, 0x2bb43: 0x6dd5a020, + 0x2bb44: 0x6dd5a220, 0x2bb45: 0x6dd5a420, 0x2bb46: 0x6dd5a620, 0x2bb47: 0x6dee8620, + 0x2bb48: 0x6e030a20, 0x2bb49: 0x6e030c20, 0x2bb4a: 0x6e030e20, 0x2bb4b: 0x6e031020, + 0x2bb4c: 0x6e14ae20, 0x2bb4d: 0x6e225c20, 0x2bb4e: 0x6e225e20, 0x2bb4f: 0x6e226020, + 0x2bb50: 0x6e2cae20, 0x2bb51: 0x6e34ba20, 0x2bb52: 0x6e3a6e20, 0x2bb53: 0x6c611620, + 0x2bb54: 0x6c611820, 0x2bb55: 0x6c875020, 0x2bb56: 0x6c875220, 0x2bb57: 0x6cb23e20, + 0x2bb58: 0x6cb24020, 0x2bb59: 0x6cb24220, 0x2bb5a: 0x6cb24420, 0x2bb5b: 0x6cb24620, + 0x2bb5c: 0x6cb24820, 0x2bb5d: 0x6cb24a20, 0x2bb5e: 0x6cb24c20, 0x2bb5f: 0x6ce19c20, + 0x2bb60: 0x6ce19e20, 0x2bb61: 0x6ce1a020, 0x2bb62: 0x6ce1a220, 0x2bb63: 0x6ce1a420, + 0x2bb64: 0x6ce1a620, 0x2bb65: 0x6ce1a820, 0x2bb66: 0x6ce1aa20, 0x2bb67: 0x6ce1ac20, + 0x2bb68: 0x6ce1ae20, 0x2bb69: 0x6ce1b020, 0x2bb6a: 0x6ce1b220, 0x2bb6b: 0x6ce1b420, + 0x2bb6c: 0x6ce1b620, 0x2bb6d: 0x6ce1b820, 0x2bb6e: 0x6d100a20, 0x2bb6f: 0x6d100c20, + 0x2bb70: 0x6d100e20, 0x2bb71: 0x6d101020, 0x2bb72: 0x6d101220, 0x2bb73: 0x6d101420, + 0x2bb74: 0x6d3e3a20, 0x2bb75: 0x6d3e3c20, 0x2bb76: 0x6d3e3e20, 0x2bb77: 0x6d3e4020, + 0x2bb78: 0x6d3e4220, 0x2bb79: 0x6d3e4420, 0x2bb7a: 0x6d3e4620, 0x2bb7b: 0x6d3e4820, + 0x2bb7c: 0x6d6ada20, 0x2bb7d: 0x6d3e4a20, 0x2bb7e: 0x6d6adc20, 0x2bb7f: 0x6d6ade20, + // Block 0xaee, offset 0x2bb80 + 0x2bb80: 0x6d6ae020, 0x2bb81: 0x6d6ae220, 0x2bb82: 0x6d6ae420, 0x2bb83: 0x6d6ae620, + 0x2bb84: 0x6d6ae820, 0x2bb85: 0x6d6aea20, 0x2bb86: 0x6d6aec20, 0x2bb87: 0x6d6aee20, + 0x2bb88: 0x6d6af020, 0x2bb89: 0x6d6af220, 0x2bb8a: 0x6d6af420, 0x2bb8b: 0x6d6af620, + 0x2bb8c: 0x6d6af820, 0x2bb8d: 0x6d943220, 0x2bb8e: 0x6d943420, 0x2bb8f: 0x6d943620, + 0x2bb90: 0x6d943820, 0x2bb91: 0x6d943a20, 0x2bb92: 0x6d943c20, 0x2bb93: 0x6d943e20, + 0x2bb94: 0x6d944020, 0x2bb95: 0x6d944220, 0x2bb96: 0x6d944420, 0x2bb97: 0x6db78420, + 0x2bb98: 0x6db78620, 0x2bb99: 0x6db78820, 0x2bb9a: 0x6db78a20, 0x2bb9b: 0x6db78c20, + 0x2bb9c: 0x6db78e20, 0x2bb9d: 0x6db79020, 0x2bb9e: 0x6dd5de20, 0x2bb9f: 0x6dd5e020, + 0x2bba0: 0x6dd5e220, 0x2bba1: 0x6dd5e420, 0x2bba2: 0x6dd5e620, 0x2bba3: 0x6deebe20, + 0x2bba4: 0x6deec020, 0x2bba5: 0x6deec220, 0x2bba6: 0x6deec420, 0x2bba7: 0x6deec620, + 0x2bba8: 0x6e032c20, 0x2bba9: 0x6e032e20, 0x2bbaa: 0x6e14c420, 0x2bbab: 0x6e14c620, + 0x2bbac: 0x6e227020, 0x2bbad: 0x6e2cbe20, 0x2bbae: 0x6e2cc020, 0x2bbaf: 0x6e34c020, + 0x2bbb0: 0x6e3a7a20, 0x2bbb1: 0x6e432220, 0x2bbb2: 0x6ce23a20, 0x2bbb3: 0x6ce23c20, + 0x2bbb4: 0x6ce23e20, 0x2bbb5: 0x6ce24020, 0x2bbb6: 0x6ce24220, 0x2bbb7: 0x6d10b020, + 0x2bbb8: 0x6d10b220, 0x2bbb9: 0x6d10b420, 0x2bbba: 0x6d10b620, 0x2bbbb: 0x6d6b9c20, + 0x2bbbc: 0x6d94e220, 0x2bbbd: 0x6db81620, 0x2bbbe: 0x6db81820, 0x2bbbf: 0x6def6a20, + // Block 0xaef, offset 0x2bbc0 + 0x2bbc0: 0x6e039a20, 0x2bbc1: 0x6e2ce820, 0x2bbc2: 0x6c612c20, 0x2bbc3: 0x6c612e20, + 0x2bbc4: 0x6c613020, 0x2bbc5: 0x6c878c20, 0x2bbc6: 0x6cb2d220, 0x2bbc7: 0x6cb2d420, + 0x2bbc8: 0x6cb2d620, 0x2bbc9: 0x6cb2d820, 0x2bbca: 0x6cb2da20, 0x2bbcb: 0x6cb2dc20, + 0x2bbcc: 0x6cb2de20, 0x2bbcd: 0x6cb2e020, 0x2bbce: 0x6cb2e220, 0x2bbcf: 0x6ce26420, + 0x2bbd0: 0x6ce26620, 0x2bbd1: 0x6ce26820, 0x2bbd2: 0x6ce26a20, 0x2bbd3: 0x6d10e020, + 0x2bbd4: 0x6d10e220, 0x2bbd5: 0x6d10e420, 0x2bbd6: 0x6d10e620, 0x2bbd7: 0x6d10e820, + 0x2bbd8: 0x6d3f0220, 0x2bbd9: 0x6d3f0420, 0x2bbda: 0x6d3f0620, 0x2bbdb: 0x6d3f0820, + 0x2bbdc: 0x6d6bc820, 0x2bbdd: 0x6d6bca20, 0x2bbde: 0x6d6bcc20, 0x2bbdf: 0x6d6bce20, + 0x2bbe0: 0x6d94fe20, 0x2bbe1: 0x6d950020, 0x2bbe2: 0x6d950220, 0x2bbe3: 0x6d950420, + 0x2bbe4: 0x6d950620, 0x2bbe5: 0x6db83620, 0x2bbe6: 0x6db83820, 0x2bbe7: 0x6db83a20, + 0x2bbe8: 0x6db83c20, 0x2bbe9: 0x6db83e20, 0x2bbea: 0x6db84020, 0x2bbeb: 0x6dd6c020, + 0x2bbec: 0x6dd6c220, 0x2bbed: 0x6dd6c420, 0x2bbee: 0x6dd6c620, 0x2bbef: 0x6dd6c820, + 0x2bbf0: 0x6dd6ca20, 0x2bbf1: 0x6dd6cc20, 0x2bbf2: 0x6def9220, 0x2bbf3: 0x6def9420, + 0x2bbf4: 0x6def9620, 0x2bbf5: 0x6def9820, 0x2bbf6: 0x6e03ac20, 0x2bbf7: 0x6e151220, + 0x2bbf8: 0x6e151420, 0x2bbf9: 0x6e151620, 0x2bbfa: 0x6e22b420, 0x2bbfb: 0x6e22b620, + 0x2bbfc: 0x6e34e020, 0x2bbfd: 0x6e3e5e20, 0x2bbfe: 0x6e412e20, 0x2bbff: 0x6e45de20, + // Block 0xaf0, offset 0x2bc00 + 0x2bc00: 0x6c87b820, 0x2bc01: 0x6cb33820, 0x2bc02: 0x6c614420, 0x2bc03: 0x6d6c5420, + 0x2bc04: 0x6e03ec20, 0x2bc05: 0x6d115e20, 0x2bc06: 0x6d3f7620, 0x2bc07: 0x6d6c6020, + 0x2bc08: 0x6e03f820, 0x2bc09: 0x6e03fa20, 0x2bc0a: 0x6c272820, 0x2bc0b: 0x6c272a20, + 0x2bc0c: 0x6c40f820, 0x2bc0d: 0x6c40fa20, 0x2bc0e: 0x6c40fc20, 0x2bc0f: 0x6c40fe20, + 0x2bc10: 0x6c616620, 0x2bc11: 0x6c616820, 0x2bc12: 0x6c87d820, 0x2bc13: 0x6c87da20, + 0x2bc14: 0x6c87dc20, 0x2bc15: 0x6c87de20, 0x2bc16: 0x6c87e020, 0x2bc17: 0x6c87e220, + 0x2bc18: 0x6c87e420, 0x2bc19: 0x6cb34820, 0x2bc1a: 0x6cb34a20, 0x2bc1b: 0x6cb34c20, + 0x2bc1c: 0x6ce2fa20, 0x2bc1d: 0x6ce2fc20, 0x2bc1e: 0x6ce2fe20, 0x2bc1f: 0x6ce30020, + 0x2bc20: 0x6ce30220, 0x2bc21: 0x6d116820, 0x2bc22: 0x6d3f7820, 0x2bc23: 0x6d3f7a20, + 0x2bc24: 0x6d3f7c20, 0x2bc25: 0x6d3f7e20, 0x2bc26: 0x6d6c6620, 0x2bc27: 0x6d6c6820, + 0x2bc28: 0x6d6c6a20, 0x2bc29: 0x6d6c6c20, 0x2bc2a: 0x6d959620, 0x2bc2b: 0x6d959820, + 0x2bc2c: 0x6d959a20, 0x2bc2d: 0x6d959c20, 0x2bc2e: 0x6db8b020, 0x2bc2f: 0x6dd71e20, + 0x2bc30: 0x6dd72020, 0x2bc31: 0x6defda20, 0x2bc32: 0x6e34f820, 0x2bc33: 0x6c0a8c20, + 0x2bc34: 0x6c153a20, 0x2bc35: 0x6c278c20, 0x2bc36: 0x6c278e20, 0x2bc37: 0x6c279020, + 0x2bc38: 0x6c417c20, 0x2bc39: 0x6c417e20, 0x2bc3a: 0x6c418020, 0x2bc3b: 0x6c61d220, + 0x2bc3c: 0x6c61d420, 0x2bc3d: 0x6d11fc20, 0x2bc3e: 0x6c61d620, 0x2bc3f: 0x6c61d820, + // Block 0xaf1, offset 0x2bc40 + 0x2bc40: 0x6c61da20, 0x2bc41: 0x6c61dc20, 0x2bc42: 0x6c61de20, 0x2bc43: 0x6c886c20, + 0x2bc44: 0x6c886e20, 0x2bc45: 0x6c887020, 0x2bc46: 0x6c887220, 0x2bc47: 0x6c887420, + 0x2bc48: 0x6d400420, 0x2bc49: 0x6d400620, 0x2bc4a: 0x6cb40020, 0x2bc4b: 0x6cb40220, + 0x2bc4c: 0x6cb40420, 0x2bc4d: 0x6cb40620, 0x2bc4e: 0x6cb40820, 0x2bc4f: 0x6cb40a20, + 0x2bc50: 0x6ce3c020, 0x2bc51: 0x6ce3c220, 0x2bc52: 0x6ce3c420, 0x2bc53: 0x6d120020, + 0x2bc54: 0x6d120220, 0x2bc55: 0x6d120420, 0x2bc56: 0x6db90420, 0x2bc57: 0x6d120620, + 0x2bc58: 0x6d400a20, 0x2bc59: 0x6d400c20, 0x2bc5a: 0x6d400e20, 0x2bc5b: 0x6d401020, + 0x2bc5c: 0x6d401220, 0x2bc5d: 0x6d6cfa20, 0x2bc5e: 0x6d6cfc20, 0x2bc5f: 0x6d6cfe20, + 0x2bc60: 0x6d6d0020, 0x2bc61: 0x6d95fc20, 0x2bc62: 0x6db90620, 0x2bc63: 0x6e2d1620, + 0x2bc64: 0x6e2d1820, 0x2bc65: 0x6c625620, 0x2bc66: 0x6c625820, 0x2bc67: 0x6c88ea20, + 0x2bc68: 0x6c88ec20, 0x2bc69: 0x6cb47420, 0x2bc6a: 0x6cb47620, 0x2bc6b: 0x6cb47820, + 0x2bc6c: 0x6cb47a20, 0x2bc6d: 0x6cb47c20, 0x2bc6e: 0x6ce42020, 0x2bc6f: 0x6ce42220, + 0x2bc70: 0x6ce42420, 0x2bc71: 0x6d126a20, 0x2bc72: 0x6ce42620, 0x2bc73: 0x6ce42820, + 0x2bc74: 0x6d126c20, 0x2bc75: 0x6d126e20, 0x2bc76: 0x6d127020, 0x2bc77: 0x6d127220, + 0x2bc78: 0x6d127420, 0x2bc79: 0x6d127620, 0x2bc7a: 0x6d407a20, 0x2bc7b: 0x6d407c20, + 0x2bc7c: 0x6d6d4820, 0x2bc7d: 0x6d6d4a20, 0x2bc7e: 0x6d6d4c20, 0x2bc7f: 0x6d6d4e20, + // Block 0xaf2, offset 0x2bc80 + 0x2bc80: 0x6d963020, 0x2bc81: 0x6d963220, 0x2bc82: 0x6d963420, 0x2bc83: 0x6d963620, + 0x2bc84: 0x6d963820, 0x2bc85: 0x6d963a20, 0x2bc86: 0x6d963c20, 0x2bc87: 0x6d963e20, + 0x2bc88: 0x6d964020, 0x2bc89: 0x6db93420, 0x2bc8a: 0x6db93620, 0x2bc8b: 0x6db93820, + 0x2bc8c: 0x6db93a20, 0x2bc8d: 0x6dd78020, 0x2bc8e: 0x6df00a20, 0x2bc8f: 0x6df00c20, + 0x2bc90: 0x6df00e20, 0x2bc91: 0x6df01020, 0x2bc92: 0x6df01220, 0x2bc93: 0x6e155c20, + 0x2bc94: 0x6e155e20, 0x2bc95: 0x6e22f020, 0x2bc96: 0x6e22f220, 0x2bc97: 0x6e34fe20, + 0x2bc98: 0x6e350020, 0x2bc99: 0x6e433820, 0x2bc9a: 0x6cb4ca20, 0x2bc9b: 0x6c890c20, + 0x2bc9c: 0x6cb4d420, 0x2bc9d: 0x6ce47c20, 0x2bc9e: 0x6ce47e20, 0x2bc9f: 0x6ce48020, + 0x2bca0: 0x6ce48220, 0x2bca1: 0x6d12c020, 0x2bca2: 0x6d12c220, 0x2bca3: 0x6d12c420, + 0x2bca4: 0x6d40d620, 0x2bca5: 0x6d40d820, 0x2bca6: 0x6d40da20, 0x2bca7: 0x6d40dc20, + 0x2bca8: 0x6d40de20, 0x2bca9: 0x6d40e020, 0x2bcaa: 0x6d40e220, 0x2bcab: 0x6d6db220, + 0x2bcac: 0x6d6db420, 0x2bcad: 0x6d6db620, 0x2bcae: 0x6d6db820, 0x2bcaf: 0x6d6dba20, + 0x2bcb0: 0x6d6dbc20, 0x2bcb1: 0x6d6dbe20, 0x2bcb2: 0x6d6dc020, 0x2bcb3: 0x6d969a20, + 0x2bcb4: 0x6d969c20, 0x2bcb5: 0x6d969e20, 0x2bcb6: 0x6d96a020, 0x2bcb7: 0x6db9a020, + 0x2bcb8: 0x6db9a220, 0x2bcb9: 0x6db9a420, 0x2bcba: 0x6db9a620, 0x2bcbb: 0x6db9a820, + 0x2bcbc: 0x6db9aa20, 0x2bcbd: 0x6dd7d820, 0x2bcbe: 0x6dd7da20, 0x2bcbf: 0x6dd7dc20, + // Block 0xaf3, offset 0x2bcc0 + 0x2bcc0: 0x6dd7de20, 0x2bcc1: 0x6dd7e020, 0x2bcc2: 0x6dd7e220, 0x2bcc3: 0x6dd7e420, + 0x2bcc4: 0x6dd7e620, 0x2bcc5: 0x6dd7e820, 0x2bcc6: 0x6dd7ea20, 0x2bcc7: 0x6dd7ec20, + 0x2bcc8: 0x6df05620, 0x2bcc9: 0x6df05820, 0x2bcca: 0x6df05a20, 0x2bccb: 0x6df05c20, + 0x2bccc: 0x6df05e20, 0x2bccd: 0x6df06020, 0x2bcce: 0x6df06220, 0x2bccf: 0x6df06420, + 0x2bcd0: 0x6df06620, 0x2bcd1: 0x6df06820, 0x2bcd2: 0x6df06a20, 0x2bcd3: 0x6df06c20, + 0x2bcd4: 0x6e046a20, 0x2bcd5: 0x6e046c20, 0x2bcd6: 0x6e046e20, 0x2bcd7: 0x6e047020, + 0x2bcd8: 0x6e047220, 0x2bcd9: 0x6e047420, 0x2bcda: 0x6e047620, 0x2bcdb: 0x6e047820, + 0x2bcdc: 0x6e047a20, 0x2bcdd: 0x6e158020, 0x2bcde: 0x6e158220, 0x2bcdf: 0x6e158420, + 0x2bce0: 0x6e158620, 0x2bce1: 0x6e158820, 0x2bce2: 0x6e158a20, 0x2bce3: 0x6e158c20, + 0x2bce4: 0x6e158e20, 0x2bce5: 0x6e159020, 0x2bce6: 0x6e159220, 0x2bce7: 0x6e230620, + 0x2bce8: 0x6e230820, 0x2bce9: 0x6e230a20, 0x2bcea: 0x6e230c20, 0x2bceb: 0x6e230e20, + 0x2bcec: 0x6e231020, 0x2bced: 0x6e231220, 0x2bcee: 0x6e231420, 0x2bcef: 0x6e2d3a20, + 0x2bcf0: 0x6e2d3c20, 0x2bcf1: 0x6e2d3e20, 0x2bcf2: 0x6e2d4020, 0x2bcf3: 0x6e2d4220, + 0x2bcf4: 0x6e2d4420, 0x2bcf5: 0x6e351620, 0x2bcf6: 0x6e351820, 0x2bcf7: 0x6e351a20, + 0x2bcf8: 0x6e3ab220, 0x2bcf9: 0x6e449220, 0x2bcfa: 0x6ce52420, 0x2bcfb: 0x6ce52620, + 0x2bcfc: 0x6ce52820, 0x2bcfd: 0x6d139e20, 0x2bcfe: 0x6d13a020, 0x2bcff: 0x6d13a220, + // Block 0xaf4, offset 0x2bd00 + 0x2bd00: 0x6d41c220, 0x2bd01: 0x6d6ed020, 0x2bd02: 0x6dd8fa20, 0x2bd03: 0x6e058c20, + 0x2bd04: 0x6e058e20, 0x2bd05: 0x6e059020, 0x2bd06: 0x6e435820, 0x2bd07: 0x6cb58820, + 0x2bd08: 0x6d13f620, 0x2bd09: 0x6d13f820, 0x2bd0a: 0x6d41fc20, 0x2bd0b: 0x6df16420, + 0x2bd0c: 0x6cb5a620, 0x2bd0d: 0x6cb5a820, 0x2bd0e: 0x6ce58c20, 0x2bd0f: 0x6ce58e20, + 0x2bd10: 0x6ce59020, 0x2bd11: 0x6ce59220, 0x2bd12: 0x6d141820, 0x2bd13: 0x6d141a20, + 0x2bd14: 0x6d141c20, 0x2bd15: 0x6d420c20, 0x2bd16: 0x6d420e20, 0x2bd17: 0x6d421020, + 0x2bd18: 0x6d421220, 0x2bd19: 0x6d421420, 0x2bd1a: 0x6d421620, 0x2bd1b: 0x6d421820, + 0x2bd1c: 0x6d6f1c20, 0x2bd1d: 0x6d6f1e20, 0x2bd1e: 0x6d6f2020, 0x2bd1f: 0x6d6f2220, + 0x2bd20: 0x6d982420, 0x2bd21: 0x6d982620, 0x2bd22: 0x6d982820, 0x2bd23: 0x6d982a20, + 0x2bd24: 0x6d982c20, 0x2bd25: 0x6d982e20, 0x2bd26: 0x6d983020, 0x2bd27: 0x6d983220, + 0x2bd28: 0x6d983420, 0x2bd29: 0x6dbb2620, 0x2bd2a: 0x6dbb2820, 0x2bd2b: 0x6dbb2a20, + 0x2bd2c: 0x6dbb2c20, 0x2bd2d: 0x6dbb2e20, 0x2bd2e: 0x6dbb3020, 0x2bd2f: 0x6dbb3220, + 0x2bd30: 0x6df17420, 0x2bd31: 0x6e05a020, 0x2bd32: 0x6e165620, 0x2bd33: 0x6e165820, + 0x2bd34: 0x6e165a20, 0x2bd35: 0x6e23a420, 0x2bd36: 0x6d426220, 0x2bd37: 0x6d6f8220, + 0x2bd38: 0x6dbb8620, 0x2bd39: 0x6c0ab020, 0x2bd3a: 0x6c0ab220, 0x2bd3b: 0x6c15a220, + 0x2bd3c: 0x6c281e20, 0x2bd3d: 0x6c282020, 0x2bd3e: 0x6c89a220, 0x2bd3f: 0x6c282220, + // Block 0xaf5, offset 0x2bd40 + 0x2bd40: 0x6c282420, 0x2bd41: 0x6c421220, 0x2bd42: 0x6c421420, 0x2bd43: 0x6c421620, + 0x2bd44: 0x6c62cc20, 0x2bd45: 0x6c62ce20, 0x2bd46: 0x6c62d020, 0x2bd47: 0x6c62d220, + 0x2bd48: 0x6c62d420, 0x2bd49: 0x6c89a420, 0x2bd4a: 0x6c89a620, 0x2bd4b: 0x6c89a820, + 0x2bd4c: 0x6c89aa20, 0x2bd4d: 0x6c89ac20, 0x2bd4e: 0x6c89ae20, 0x2bd4f: 0x6c89b020, + 0x2bd50: 0x6cb5da20, 0x2bd51: 0x6cb5dc20, 0x2bd52: 0x6cb5de20, 0x2bd53: 0x6cb5e020, + 0x2bd54: 0x6cb5e220, 0x2bd55: 0x6cb5e420, 0x2bd56: 0x6cb5e620, 0x2bd57: 0x6ce5fc20, + 0x2bd58: 0x6ce5fe20, 0x2bd59: 0x6ce60020, 0x2bd5a: 0x6d148020, 0x2bd5b: 0x6d148220, + 0x2bd5c: 0x6d148420, 0x2bd5d: 0x6d148620, 0x2bd5e: 0x6d148820, 0x2bd5f: 0x6d148a20, + 0x2bd60: 0x6d426c20, 0x2bd61: 0x6d426e20, 0x2bd62: 0x6d427020, 0x2bd63: 0x6d427220, + 0x2bd64: 0x6d6f8820, 0x2bd65: 0x6d6f8a20, 0x2bd66: 0x6d6f8c20, 0x2bd67: 0x6d989220, + 0x2bd68: 0x6d989420, 0x2bd69: 0x6d6f8e20, 0x2bd6a: 0x6d989620, 0x2bd6b: 0x6dbb8c20, + 0x2bd6c: 0x6dbb8e20, 0x2bd6d: 0x6dbb9020, 0x2bd6e: 0x6df1a220, 0x2bd6f: 0x6e05da20, + 0x2bd70: 0x6e169020, 0x2bd71: 0x6c8a3020, 0x2bd72: 0x6cb66020, 0x2bd73: 0x6cb66220, + 0x2bd74: 0x6ce68a20, 0x2bd75: 0x6ce68c20, 0x2bd76: 0x6ce68e20, 0x2bd77: 0x6d14e020, + 0x2bd78: 0x6d14e220, 0x2bd79: 0x6d14e420, 0x2bd7a: 0x6d14e620, 0x2bd7b: 0x6d42d020, + 0x2bd7c: 0x6d6fcc20, 0x2bd7d: 0x6d6fce20, 0x2bd7e: 0x6d98c820, 0x2bd7f: 0x6d98ca20, + // Block 0xaf6, offset 0x2bd80 + 0x2bd80: 0x6d8a5620, 0x2bd81: 0x6dbbb620, 0x2bd82: 0x6dbbb820, 0x2bd83: 0x6dd98a20, + 0x2bd84: 0x6df1ae20, 0x2bd85: 0x6e05ee20, 0x2bd86: 0x6e05f020, 0x2bd87: 0x6e05f220, + 0x2bd88: 0x6e23be20, 0x2bd89: 0x6e3afa20, 0x2bd8a: 0x6e464620, 0x2bd8b: 0x6cb67c20, + 0x2bd8c: 0x6ce6be20, 0x2bd8d: 0x6ce6c020, 0x2bd8e: 0x6d151820, 0x2bd8f: 0x6d430c20, + 0x2bd90: 0x6d430e20, 0x2bd91: 0x6d431020, 0x2bd92: 0x6d431220, 0x2bd93: 0x6d431420, + 0x2bd94: 0x6d431620, 0x2bd95: 0x6d431820, 0x2bd96: 0x6d431a20, 0x2bd97: 0x6d6ffc20, + 0x2bd98: 0x6d6ffe20, 0x2bd99: 0x6d700020, 0x2bd9a: 0x6d990e20, 0x2bd9b: 0x6d991020, + 0x2bd9c: 0x6d991220, 0x2bd9d: 0x6d991420, 0x2bd9e: 0x6dbbec20, 0x2bd9f: 0x6dbbee20, + 0x2bda0: 0x6dbbf020, 0x2bda1: 0x6dbbf220, 0x2bda2: 0x6dbbf420, 0x2bda3: 0x6dbbf620, + 0x2bda4: 0x6dbbf820, 0x2bda5: 0x6dd9be20, 0x2bda6: 0x6dd9c020, 0x2bda7: 0x6dd9c220, + 0x2bda8: 0x6dd9c420, 0x2bda9: 0x6dd9c620, 0x2bdaa: 0x6dd9c820, 0x2bdab: 0x6df1d420, + 0x2bdac: 0x6df1d620, 0x2bdad: 0x6df1d820, 0x2bdae: 0x6df1da20, 0x2bdaf: 0x6df1dc20, + 0x2bdb0: 0x6e061a20, 0x2bdb1: 0x6e061c20, 0x2bdb2: 0x6e23d220, 0x2bdb3: 0x6e23d420, + 0x2bdb4: 0x6e23d620, 0x2bdb5: 0x6e2de620, 0x2bdb6: 0x6e2de820, 0x2bdb7: 0x6e358e20, + 0x2bdb8: 0x6e3b0220, 0x2bdb9: 0x6e416620, 0x2bdba: 0x6e46f020, 0x2bdbb: 0x6e473e20, + 0x2bdbc: 0x6e240c20, 0x2bdbd: 0x6cb69c20, 0x2bdbe: 0x6cb69e20, 0x2bdbf: 0x6ce6fe20, + // Block 0xaf7, offset 0x2bdc0 + 0x2bdc0: 0x6d705020, 0x2bdc1: 0x6e067220, 0x2bdc2: 0x6d156820, 0x2bdc3: 0x6d156a20, + 0x2bdc4: 0x6d156c20, 0x2bdc5: 0x6d435c20, 0x2bdc6: 0x6d435e20, 0x2bdc7: 0x6d436020, + 0x2bdc8: 0x6d998620, 0x2bdc9: 0x6d998820, 0x2bdca: 0x6dbc5620, 0x2bdcb: 0x6e067c20, + 0x2bdcc: 0x6e16f020, 0x2bdcd: 0x6e16f220, 0x2bdce: 0x6e240e20, 0x2bdcf: 0x6e35b420, + 0x2bdd0: 0x6ce71820, 0x2bdd1: 0x6ce71a20, 0x2bdd2: 0x6ce71c20, 0x2bdd3: 0x6d157c20, + 0x2bdd4: 0x6d157e20, 0x2bdd5: 0x6d158020, 0x2bdd6: 0x6d158220, 0x2bdd7: 0x6d158420, + 0x2bdd8: 0x6d158620, 0x2bdd9: 0x6d437e20, 0x2bdda: 0x6d438020, 0x2bddb: 0x6d438220, + 0x2bddc: 0x6d438420, 0x2bddd: 0x6d438620, 0x2bdde: 0x6d438820, 0x2bddf: 0x6d707220, + 0x2bde0: 0x6d99a220, 0x2bde1: 0x6d99a420, 0x2bde2: 0x6d99a620, 0x2bde3: 0x6d99a820, + 0x2bde4: 0x6d99aa20, 0x2bde5: 0x6d99ac20, 0x2bde6: 0x6d99ae20, 0x2bde7: 0x6d99b020, + 0x2bde8: 0x6dbc6620, 0x2bde9: 0x6dbc6820, 0x2bdea: 0x6dbc6a20, 0x2bdeb: 0x6dbc6c20, + 0x2bdec: 0x6dbc6e20, 0x2bded: 0x6dbc7020, 0x2bdee: 0x6dbc7220, 0x2bdef: 0x6dda3020, + 0x2bdf0: 0x6dda3220, 0x2bdf1: 0x6dda3420, 0x2bdf2: 0x6dda3620, 0x2bdf3: 0x6dda3820, + 0x2bdf4: 0x6dda3a20, 0x2bdf5: 0x6dda3c20, 0x2bdf6: 0x6df24220, 0x2bdf7: 0x6df24420, + 0x2bdf8: 0x6df24620, 0x2bdf9: 0x6df24820, 0x2bdfa: 0x6df24a20, 0x2bdfb: 0x6df24c20, + 0x2bdfc: 0x6e068a20, 0x2bdfd: 0x6e068c20, 0x2bdfe: 0x6e068e20, 0x2bdff: 0x6e170a20, + // Block 0xaf8, offset 0x2be00 + 0x2be00: 0x6e170c20, 0x2be01: 0x6e170e20, 0x2be02: 0x6e171020, 0x2be03: 0x6e171220, + 0x2be04: 0x6e171420, 0x2be05: 0x6e241420, 0x2be06: 0x6e241620, 0x2be07: 0x6e2e0a20, + 0x2be08: 0x6e2e0c20, 0x2be09: 0x6e35ba20, 0x2be0a: 0x6e3b2020, 0x2be0b: 0x6e3b2220, + 0x2be0c: 0x6e3edc20, 0x2be0d: 0x6e3ede20, 0x2be0e: 0x6e417620, 0x2be0f: 0x6d15c620, + 0x2be10: 0x6d43d820, 0x2be11: 0x6d43da20, 0x2be12: 0x6d43dc20, 0x2be13: 0x6d43de20, + 0x2be14: 0x6d99ec20, 0x2be15: 0x6dbcc420, 0x2be16: 0x6ddaa420, 0x2be17: 0x6ddaa620, + 0x2be18: 0x6ddaa820, 0x2be19: 0x6df2a420, 0x2be1a: 0x6df2a620, 0x2be1b: 0x6e174020, + 0x2be1c: 0x6e244620, 0x2be1d: 0x6e2e2c20, 0x2be1e: 0x6d15de20, 0x2be1f: 0x6d70e020, + 0x2be20: 0x6dbce820, 0x2be21: 0x6df2c220, 0x2be22: 0x6df2c420, 0x2be23: 0x6e06ea20, + 0x2be24: 0x6e175620, 0x2be25: 0x6e2e3620, 0x2be26: 0x6ce73c20, 0x2be27: 0x6ce73e20, + 0x2be28: 0x6ce74020, 0x2be29: 0x6d15e620, 0x2be2a: 0x6d440220, 0x2be2b: 0x6d9a0820, + 0x2be2c: 0x6d9a0a20, 0x2be2d: 0x6ddaca20, 0x2be2e: 0x6df2cc20, 0x2be2f: 0x6df2ce20, + 0x2be30: 0x6e245c20, 0x2be31: 0x6ce74420, 0x2be32: 0x6ce74620, 0x2be33: 0x6d15f420, + 0x2be34: 0x6d15f620, 0x2be35: 0x6d15f820, 0x2be36: 0x6d441420, 0x2be37: 0x6d441620, + 0x2be38: 0x6d441820, 0x2be39: 0x6d441a20, 0x2be3a: 0x6d441c20, 0x2be3b: 0x6d441e20, + 0x2be3c: 0x6d442020, 0x2be3d: 0x6d442220, 0x2be3e: 0x6d442420, 0x2be3f: 0x6d70f820, + // Block 0xaf9, offset 0x2be40 + 0x2be40: 0x6d70fa20, 0x2be41: 0x6d70fc20, 0x2be42: 0x6d70fe20, 0x2be43: 0x6d9a1a20, + 0x2be44: 0x6d9a1c20, 0x2be45: 0x6d9a1e20, 0x2be46: 0x6d9a2020, 0x2be47: 0x6d9a2220, + 0x2be48: 0x6d9a2420, 0x2be49: 0x6d9a2620, 0x2be4a: 0x6d9a2820, 0x2be4b: 0x6dbcfa20, + 0x2be4c: 0x6dbcfc20, 0x2be4d: 0x6dbcfe20, 0x2be4e: 0x6dbd0020, 0x2be4f: 0x6dbd0220, + 0x2be50: 0x6dbd0420, 0x2be51: 0x6dbd0620, 0x2be52: 0x6dbd0820, 0x2be53: 0x6dbd0a20, + 0x2be54: 0x6ddadc20, 0x2be55: 0x6ddade20, 0x2be56: 0x6ddae020, 0x2be57: 0x6ddae220, + 0x2be58: 0x6ddae420, 0x2be59: 0x6ddae620, 0x2be5a: 0x6ddae820, 0x2be5b: 0x6ddaea20, + 0x2be5c: 0x6ddaec20, 0x2be5d: 0x6ddaee20, 0x2be5e: 0x6df2dc20, 0x2be5f: 0x6df2de20, + 0x2be60: 0x6df2e020, 0x2be61: 0x6df2e220, 0x2be62: 0x6df2e420, 0x2be63: 0x6df2e620, + 0x2be64: 0x6df2e820, 0x2be65: 0x6df2ea20, 0x2be66: 0x6df2ec20, 0x2be67: 0x6df2ee20, + 0x2be68: 0x6e070620, 0x2be69: 0x6e070820, 0x2be6a: 0x6e070a20, 0x2be6b: 0x6e070c20, + 0x2be6c: 0x6e176620, 0x2be6d: 0x6e176820, 0x2be6e: 0x6e176a20, 0x2be6f: 0x6e176c20, + 0x2be70: 0x6e176e20, 0x2be71: 0x6e177020, 0x2be72: 0x6e246820, 0x2be73: 0x6e246a20, + 0x2be74: 0x6e246c20, 0x2be75: 0x6e35da20, 0x2be76: 0x6e35dc20, 0x2be77: 0x6e3b3620, + 0x2be78: 0x6cb6cc20, 0x2be79: 0x6ce77820, 0x2be7a: 0x6d165020, 0x2be7b: 0x6d165220, + 0x2be7c: 0x6d165420, 0x2be7d: 0x6d165620, 0x2be7e: 0x6d447e20, 0x2be7f: 0x6d448020, + // Block 0xafa, offset 0x2be80 + 0x2be80: 0x6d448220, 0x2be81: 0x6d448420, 0x2be82: 0x6d448620, 0x2be83: 0x6d448820, + 0x2be84: 0x6d716c20, 0x2be85: 0x6d716e20, 0x2be86: 0x6d9abc20, 0x2be87: 0x6d9abe20, + 0x2be88: 0x6d9ac020, 0x2be89: 0x6d9ac220, 0x2be8a: 0x6d9ac420, 0x2be8b: 0x6dbd6c20, + 0x2be8c: 0x6dbd6e20, 0x2be8d: 0x6dbd7020, 0x2be8e: 0x6dbd7220, 0x2be8f: 0x6dbd7420, + 0x2be90: 0x6dbd7620, 0x2be91: 0x6ddb4220, 0x2be92: 0x6ddb4420, 0x2be93: 0x6ddb4620, + 0x2be94: 0x6ddb4820, 0x2be95: 0x6ddb4a20, 0x2be96: 0x6ddb4c20, 0x2be97: 0x6ddb4e20, + 0x2be98: 0x6df33c20, 0x2be99: 0x6df33e20, 0x2be9a: 0x6df34020, 0x2be9b: 0x6e074a20, + 0x2be9c: 0x6e074c20, 0x2be9d: 0x6e17ae20, 0x2be9e: 0x6e2e6e20, 0x2be9f: 0x6e35f220, + 0x2bea0: 0x6dbdbc20, 0x2bea1: 0x6ddb8620, 0x2bea2: 0x6cb6d620, 0x2bea3: 0x6ce79820, + 0x2bea4: 0x6ce79a20, 0x2bea5: 0x6ce79c20, 0x2bea6: 0x6d168a20, 0x2bea7: 0x6d168c20, + 0x2bea8: 0x6d168e20, 0x2bea9: 0x6d169020, 0x2beaa: 0x6d169220, 0x2beab: 0x6d44c220, + 0x2beac: 0x6d44c420, 0x2bead: 0x6d44c620, 0x2beae: 0x6d44c820, 0x2beaf: 0x6d44ca20, + 0x2beb0: 0x6d44cc20, 0x2beb1: 0x6d44ce20, 0x2beb2: 0x6d44d020, 0x2beb3: 0x6d44d220, + 0x2beb4: 0x6d44d420, 0x2beb5: 0x6d719820, 0x2beb6: 0x6d719a20, 0x2beb7: 0x6d719c20, + 0x2beb8: 0x6d719e20, 0x2beb9: 0x6d71a020, 0x2beba: 0x6d71a220, 0x2bebb: 0x6d71a420, + 0x2bebc: 0x6d9afa20, 0x2bebd: 0x6d9afc20, 0x2bebe: 0x6d9afe20, 0x2bebf: 0x6d9b0020, + // Block 0xafb, offset 0x2bec0 + 0x2bec0: 0x6d9b0220, 0x2bec1: 0x6d9b0420, 0x2bec2: 0x6d9b0620, 0x2bec3: 0x6dbdc020, + 0x2bec4: 0x6dbdc220, 0x2bec5: 0x6dbdc420, 0x2bec6: 0x6dbdc620, 0x2bec7: 0x6dbdc820, + 0x2bec8: 0x6ddb8a20, 0x2bec9: 0x6ddb8c20, 0x2beca: 0x6ddb8e20, 0x2becb: 0x6ddb9020, + 0x2becc: 0x6ddb9220, 0x2becd: 0x6ddb9420, 0x2bece: 0x6ddb9620, 0x2becf: 0x6ddb9820, + 0x2bed0: 0x6df37e20, 0x2bed1: 0x6df38020, 0x2bed2: 0x6df38220, 0x2bed3: 0x6df38420, + 0x2bed4: 0x6df38620, 0x2bed5: 0x6e076e20, 0x2bed6: 0x6e077020, 0x2bed7: 0x6e077220, + 0x2bed8: 0x6e17e220, 0x2bed9: 0x6e17e420, 0x2beda: 0x6e17e620, 0x2bedb: 0x6e17e820, + 0x2bedc: 0x6e17ea20, 0x2bedd: 0x6e24a620, 0x2bede: 0x6e24a820, 0x2bedf: 0x6e24aa20, + 0x2bee0: 0x6e24ac20, 0x2bee1: 0x6e2e7a20, 0x2bee2: 0x6e2e7c20, 0x2bee3: 0x6e2e7e20, + 0x2bee4: 0x6e2e8020, 0x2bee5: 0x6e360020, 0x2bee6: 0x6e3f0420, 0x2bee7: 0x6e3f0620, + 0x2bee8: 0x6e419620, 0x2bee9: 0x6e437420, 0x2beea: 0x6e182020, 0x2beeb: 0x6d720820, + 0x2beec: 0x6d720a20, 0x2beed: 0x6ddbfa20, 0x2beee: 0x6df3e420, 0x2beef: 0x6d453420, + 0x2bef0: 0x6dbe5020, 0x2bef1: 0x6dbe5220, 0x2bef2: 0x6dbe5420, 0x2bef3: 0x6e419e20, + 0x2bef4: 0x6ce7f020, 0x2bef5: 0x6d171020, 0x2bef6: 0x6d171220, 0x2bef7: 0x6d454820, + 0x2bef8: 0x6d454a20, 0x2bef9: 0x6d454c20, 0x2befa: 0x6d454e20, 0x2befb: 0x6d455020, + 0x2befc: 0x6d455220, 0x2befd: 0x6d455420, 0x2befe: 0x6d455620, 0x2beff: 0x6d722420, + // Block 0xafc, offset 0x2bf00 + 0x2bf00: 0x6d722620, 0x2bf01: 0x6d722820, 0x2bf02: 0x6d722a20, 0x2bf03: 0x6d722c20, + 0x2bf04: 0x6d722e20, 0x2bf05: 0x6d723020, 0x2bf06: 0x6d9baa20, 0x2bf07: 0x6d9bac20, + 0x2bf08: 0x6d9bae20, 0x2bf09: 0x6d9bb020, 0x2bf0a: 0x6d9bb220, 0x2bf0b: 0x6d9bb420, + 0x2bf0c: 0x6d9bb620, 0x2bf0d: 0x6d9bb820, 0x2bf0e: 0x6dbe6620, 0x2bf0f: 0x6dbe6820, + 0x2bf10: 0x6dbe6a20, 0x2bf11: 0x6dbe6c20, 0x2bf12: 0x6dbe6e20, 0x2bf13: 0x6ddc1620, + 0x2bf14: 0x6ddc1820, 0x2bf15: 0x6ddc1a20, 0x2bf16: 0x6ddc1c20, 0x2bf17: 0x6ddc1e20, + 0x2bf18: 0x6ddc2020, 0x2bf19: 0x6ddc2220, 0x2bf1a: 0x6ddc2420, 0x2bf1b: 0x6ddc2620, + 0x2bf1c: 0x6df3fc20, 0x2bf1d: 0x6df3fe20, 0x2bf1e: 0x6df40020, 0x2bf1f: 0x6df40220, + 0x2bf20: 0x6df40420, 0x2bf21: 0x6df40620, 0x2bf22: 0x6df40820, 0x2bf23: 0x6e07d820, + 0x2bf24: 0x6e07da20, 0x2bf25: 0x6e07dc20, 0x2bf26: 0x6e07de20, 0x2bf27: 0x6e07e020, + 0x2bf28: 0x6e07e220, 0x2bf29: 0x6e07e420, 0x2bf2a: 0x6e183220, 0x2bf2b: 0x6e183420, + 0x2bf2c: 0x6e183620, 0x2bf2d: 0x6e183820, 0x2bf2e: 0x6e183a20, 0x2bf2f: 0x6e183c20, + 0x2bf30: 0x6e183e20, 0x2bf31: 0x6e184020, 0x2bf32: 0x6e24e420, 0x2bf33: 0x6e24e620, + 0x2bf34: 0x6e24e820, 0x2bf35: 0x6e24ea20, 0x2bf36: 0x6e24ec20, 0x2bf37: 0x6e2e9e20, + 0x2bf38: 0x6e2ea020, 0x2bf39: 0x6e2ea220, 0x2bf3a: 0x6e361c20, 0x2bf3b: 0x6e361e20, + 0x2bf3c: 0x6e362020, 0x2bf3d: 0x6e3b5620, 0x2bf3e: 0x6e3f1220, 0x2bf3f: 0x6e41a220, + // Block 0xafd, offset 0x2bf40 + 0x2bf40: 0x6e437820, 0x2bf41: 0x6e44c020, 0x2bf42: 0x6e46b820, 0x2bf43: 0x6d9c3020, + 0x2bf44: 0x6dbec220, 0x2bf45: 0x6e086c20, 0x2bf46: 0x6cb72e20, 0x2bf47: 0x6ce82a20, + 0x2bf48: 0x6d45b820, 0x2bf49: 0x6d45ba20, 0x2bf4a: 0x6d72b220, 0x2bf4b: 0x6d72b420, + 0x2bf4c: 0x6d72b620, 0x2bf4d: 0x6d72b820, 0x2bf4e: 0x6d72ba20, 0x2bf4f: 0x6d9c3620, + 0x2bf50: 0x6d9c3820, 0x2bf51: 0x6d9c3a20, 0x2bf52: 0x6d9c3c20, 0x2bf53: 0x6d9c3e20, + 0x2bf54: 0x6d9c4020, 0x2bf55: 0x6dbec620, 0x2bf56: 0x6dbec820, 0x2bf57: 0x6dbeca20, + 0x2bf58: 0x6dbecc20, 0x2bf59: 0x6dbece20, 0x2bf5a: 0x6dbed020, 0x2bf5b: 0x6ddca820, + 0x2bf5c: 0x6ddcaa20, 0x2bf5d: 0x6df48420, 0x2bf5e: 0x6df48620, 0x2bf5f: 0x6df48820, + 0x2bf60: 0x6df48a20, 0x2bf61: 0x6e087420, 0x2bf62: 0x6e189220, 0x2bf63: 0x6e254420, + 0x2bf64: 0x6e2ee420, 0x2bf65: 0x6e364220, 0x2bf66: 0x6e3b7220, 0x2bf67: 0x6ce83e20, + 0x2bf68: 0x6d177220, 0x2bf69: 0x6d45e420, 0x2bf6a: 0x6df4a420, 0x2bf6b: 0x6e256220, + 0x2bf6c: 0x6e3b7e20, 0x2bf6d: 0x6ce84220, 0x2bf6e: 0x6ce84420, 0x2bf6f: 0x6d45fa20, + 0x2bf70: 0x6d45fc20, 0x2bf71: 0x6d45fe20, 0x2bf72: 0x6d460020, 0x2bf73: 0x6d460220, + 0x2bf74: 0x6d460420, 0x2bf75: 0x6d72ee20, 0x2bf76: 0x6d72f020, 0x2bf77: 0x6d9c7c20, + 0x2bf78: 0x6d9c7e20, 0x2bf79: 0x6dbf0c20, 0x2bf7a: 0x6dbf0e20, 0x2bf7b: 0x6dbf1020, + 0x2bf7c: 0x6dbf1220, 0x2bf7d: 0x6ddce420, 0x2bf7e: 0x6ddce620, 0x2bf7f: 0x6ddce820, + // Block 0xafe, offset 0x2bf80 + 0x2bf80: 0x6ddcea20, 0x2bf81: 0x6ddcec20, 0x2bf82: 0x6ddcee20, 0x2bf83: 0x6ddcf020, + 0x2bf84: 0x6df4aa20, 0x2bf85: 0x6df4ac20, 0x2bf86: 0x6df4ae20, 0x2bf87: 0x6df4b020, + 0x2bf88: 0x6e08aa20, 0x2bf89: 0x6e08ac20, 0x2bf8a: 0x6e08ae20, 0x2bf8b: 0x6e08b020, + 0x2bf8c: 0x6e18b020, 0x2bf8d: 0x6e18b220, 0x2bf8e: 0x6e256a20, 0x2bf8f: 0x6e365420, + 0x2bf90: 0x6e365620, 0x2bf91: 0x6e365820, 0x2bf92: 0x6e365a20, 0x2bf93: 0x6e3b8220, + 0x2bf94: 0x6e3b8420, 0x2bf95: 0x6e3f3020, 0x2bf96: 0x6e44c820, 0x2bf97: 0x6e08ec20, + 0x2bf98: 0x6e18e820, 0x2bf99: 0x6d464420, 0x2bf9a: 0x6d464620, 0x2bf9b: 0x6d734c20, + 0x2bf9c: 0x6d9cc620, 0x2bf9d: 0x6e25ac20, 0x2bf9e: 0x6e3b9c20, 0x2bf9f: 0x6d464e20, + 0x2bfa0: 0x6d735420, 0x2bfa1: 0x6d735620, 0x2bfa2: 0x6d9cda20, 0x2bfa3: 0x6d9cdc20, + 0x2bfa4: 0x6ddd4e20, 0x2bfa5: 0x6ddd5020, 0x2bfa6: 0x6ddd5220, 0x2bfa7: 0x6ddd5420, + 0x2bfa8: 0x6df50420, 0x2bfa9: 0x6df50620, 0x2bfaa: 0x6e090020, 0x2bfab: 0x6e25b820, + 0x2bfac: 0x6e25ba20, 0x2bfad: 0x6e25bc20, 0x2bfae: 0x6e2f3420, 0x2bfaf: 0x6e368620, + 0x2bfb0: 0x6e368820, 0x2bfb1: 0x6e46ba20, 0x2bfb2: 0x6ce86c20, 0x2bfb3: 0x6d17c420, + 0x2bfb4: 0x6d468c20, 0x2bfb5: 0x6d468e20, 0x2bfb6: 0x6d469020, 0x2bfb7: 0x6d738620, + 0x2bfb8: 0x6d738820, 0x2bfb9: 0x6d738a20, 0x2bfba: 0x6d738c20, 0x2bfbb: 0x6d738e20, + 0x2bfbc: 0x6d739020, 0x2bfbd: 0x6d739220, 0x2bfbe: 0x6d739420, 0x2bfbf: 0x6d9d0e20, + // Block 0xaff, offset 0x2bfc0 + 0x2bfc0: 0x6d9d1020, 0x2bfc1: 0x6d9d1220, 0x2bfc2: 0x6d9d1420, 0x2bfc3: 0x6d9d1620, + 0x2bfc4: 0x6d9d1820, 0x2bfc5: 0x6d9d1a20, 0x2bfc6: 0x6d9d1c20, 0x2bfc7: 0x6d9d1e20, + 0x2bfc8: 0x6d9d2020, 0x2bfc9: 0x6d9d2220, 0x2bfca: 0x6dbf9220, 0x2bfcb: 0x6dbf9420, + 0x2bfcc: 0x6dbf9620, 0x2bfcd: 0x6dbf9820, 0x2bfce: 0x6dbf9a20, 0x2bfcf: 0x6ddd8420, + 0x2bfd0: 0x6ddd8620, 0x2bfd1: 0x6ddd8820, 0x2bfd2: 0x6ddd8a20, 0x2bfd3: 0x6ddd8c20, + 0x2bfd4: 0x6ddd8e20, 0x2bfd5: 0x6ddd9020, 0x2bfd6: 0x6ddd9220, 0x2bfd7: 0x6ddd9420, + 0x2bfd8: 0x6ddd9620, 0x2bfd9: 0x6df51e20, 0x2bfda: 0x6df52020, 0x2bfdb: 0x6df52220, + 0x2bfdc: 0x6df52420, 0x2bfdd: 0x6df52620, 0x2bfde: 0x6df52820, 0x2bfdf: 0x6df52a20, + 0x2bfe0: 0x6df52c20, 0x2bfe1: 0x6df52e20, 0x2bfe2: 0x6df53020, 0x2bfe3: 0x6df53220, + 0x2bfe4: 0x6df53420, 0x2bfe5: 0x6df53620, 0x2bfe6: 0x6df53820, 0x2bfe7: 0x6df53a20, + 0x2bfe8: 0x6df53c20, 0x2bfe9: 0x6df53e20, 0x2bfea: 0x6df54020, 0x2bfeb: 0x6e091e20, + 0x2bfec: 0x6e092020, 0x2bfed: 0x6e092220, 0x2bfee: 0x6e092420, 0x2bfef: 0x6e092620, + 0x2bff0: 0x6e092820, 0x2bff1: 0x6e092a20, 0x2bff2: 0x6e092c20, 0x2bff3: 0x6e092e20, + 0x2bff4: 0x6e093020, 0x2bff5: 0x6e193420, 0x2bff6: 0x6e193620, 0x2bff7: 0x6e193820, + 0x2bff8: 0x6e193a20, 0x2bff9: 0x6e193c20, 0x2bffa: 0x6e193e20, 0x2bffb: 0x6e194020, + 0x2bffc: 0x6e194220, 0x2bffd: 0x6e194420, 0x2bffe: 0x6e25c820, 0x2bfff: 0x6e25ca20, + // Block 0xb00, offset 0x2c000 + 0x2c000: 0x6e25cc20, 0x2c001: 0x6e25ce20, 0x2c002: 0x6e25d020, 0x2c003: 0x6e25d220, + 0x2c004: 0x6e25d420, 0x2c005: 0x6e25d620, 0x2c006: 0x6e25d820, 0x2c007: 0x6e25da20, + 0x2c008: 0x6e25dc20, 0x2c009: 0x6e2f4820, 0x2c00a: 0x6e2f4a20, 0x2c00b: 0x6e2f4c20, + 0x2c00c: 0x6e2f4e20, 0x2c00d: 0x6e2f5020, 0x2c00e: 0x6e2f5220, 0x2c00f: 0x6e2f5420, + 0x2c010: 0x6e369a20, 0x2c011: 0x6e369c20, 0x2c012: 0x6e369e20, 0x2c013: 0x6e36a020, + 0x2c014: 0x6e36a220, 0x2c015: 0x6e36a420, 0x2c016: 0x6e3ba620, 0x2c017: 0x6e3ba820, + 0x2c018: 0x6e3baa20, 0x2c019: 0x6e3f5220, 0x2c01a: 0x6e41d620, 0x2c01b: 0x6e41d820, + 0x2c01c: 0x6e473220, 0x2c01d: 0x6d740a20, 0x2c01e: 0x6d9dac20, 0x2c01f: 0x6d9dae20, + 0x2c020: 0x6e09e820, 0x2c021: 0x6e09ea20, 0x2c022: 0x6e19f220, 0x2c023: 0x6e19f420, + 0x2c024: 0x6e19f620, 0x2c025: 0x6d180620, 0x2c026: 0x6d46e820, 0x2c027: 0x6d46ea20, + 0x2c028: 0x6d46ec20, 0x2c029: 0x6d46ee20, 0x2c02a: 0x6d46f020, 0x2c02b: 0x6d46f220, + 0x2c02c: 0x6d743620, 0x2c02d: 0x6d743820, 0x2c02e: 0x6d743a20, 0x2c02f: 0x6d743c20, + 0x2c030: 0x6d743e20, 0x2c031: 0x6d744020, 0x2c032: 0x6d744220, 0x2c033: 0x6d744420, + 0x2c034: 0x6d744620, 0x2c035: 0x6d744820, 0x2c036: 0x6d744a20, 0x2c037: 0x6d744c20, + 0x2c038: 0x6d744e20, 0x2c039: 0x6d9de220, 0x2c03a: 0x6d9de420, 0x2c03b: 0x6d9de620, + 0x2c03c: 0x6d9de820, 0x2c03d: 0x6d9dea20, 0x2c03e: 0x6d9dec20, 0x2c03f: 0x6d9dee20, + // Block 0xb01, offset 0x2c040 + 0x2c040: 0x6d9df020, 0x2c041: 0x6d9df220, 0x2c042: 0x6d9df420, 0x2c043: 0x6d9df620, + 0x2c044: 0x6d9df820, 0x2c045: 0x6d9dfa20, 0x2c046: 0x6d9dfc20, 0x2c047: 0x6d9dfe20, + 0x2c048: 0x6d9e0020, 0x2c049: 0x6d9e0220, 0x2c04a: 0x6d9e0420, 0x2c04b: 0x6dc06c20, + 0x2c04c: 0x6dc06e20, 0x2c04d: 0x6dc07020, 0x2c04e: 0x6dc07220, 0x2c04f: 0x6dc07420, + 0x2c050: 0x6dc07620, 0x2c051: 0x6dc07820, 0x2c052: 0x6dc07a20, 0x2c053: 0x6dc07c20, + 0x2c054: 0x6dc07e20, 0x2c055: 0x6dde3e20, 0x2c056: 0x6dde4020, 0x2c057: 0x6dde4220, + 0x2c058: 0x6dde4420, 0x2c059: 0x6dde4620, 0x2c05a: 0x6dde4820, 0x2c05b: 0x6dde4a20, + 0x2c05c: 0x6dde4c20, 0x2c05d: 0x6df63a20, 0x2c05e: 0x6df63c20, 0x2c05f: 0x6df63e20, + 0x2c060: 0x6df64020, 0x2c061: 0x6df64220, 0x2c062: 0x6df64420, 0x2c063: 0x6df64620, + 0x2c064: 0x6df64820, 0x2c065: 0x6df64a20, 0x2c066: 0x6e09f820, 0x2c067: 0x6e09fa20, + 0x2c068: 0x6e09fc20, 0x2c069: 0x6e09fe20, 0x2c06a: 0x6e0a0020, 0x2c06b: 0x6e0a0220, + 0x2c06c: 0x6e0a0420, 0x2c06d: 0x6e0a0620, 0x2c06e: 0x6e0a0820, 0x2c06f: 0x6e0a0a20, + 0x2c070: 0x6e0a0c20, 0x2c071: 0x6e1a0420, 0x2c072: 0x6e1a0620, 0x2c073: 0x6e1a0820, + 0x2c074: 0x6e1a0a20, 0x2c075: 0x6e1a0c20, 0x2c076: 0x6e1a0e20, 0x2c077: 0x6e267820, + 0x2c078: 0x6e267a20, 0x2c079: 0x6e267c20, 0x2c07a: 0x6e267e20, 0x2c07b: 0x6e268020, + 0x2c07c: 0x6e268220, 0x2c07d: 0x6e268420, 0x2c07e: 0x6e2fe020, 0x2c07f: 0x6e2fe220, + // Block 0xb02, offset 0x2c080 + 0x2c080: 0x6e2fe420, 0x2c081: 0x6e2fe620, 0x2c082: 0x6e2fe820, 0x2c083: 0x6e2fea20, + 0x2c084: 0x6e2fec20, 0x2c085: 0x6e2fee20, 0x2c086: 0x6e2ff020, 0x2c087: 0x6e371820, + 0x2c088: 0x6e371a20, 0x2c089: 0x6e371c20, 0x2c08a: 0x6e371e20, 0x2c08b: 0x6e372020, + 0x2c08c: 0x6e3be620, 0x2c08d: 0x6e3be820, 0x2c08e: 0x6e3f8620, 0x2c08f: 0x6e41f820, + 0x2c090: 0x6e45fe20, 0x2c091: 0x6e46bc20, 0x2c092: 0x6e46d420, 0x2c093: 0x6d74de20, + 0x2c094: 0x6dc13420, 0x2c095: 0x6dc13620, 0x2c096: 0x6df72e20, 0x2c097: 0x6e0ad420, + 0x2c098: 0x6e1ac220, 0x2c099: 0x6e378a20, 0x2c09a: 0x6d74fe20, 0x2c09b: 0x6ddef020, + 0x2c09c: 0x6e1ac420, 0x2c09d: 0x6e30a820, 0x2c09e: 0x6e3c3220, 0x2c09f: 0x6d474a20, + 0x2c0a0: 0x6d750c20, 0x2c0a1: 0x6d750e20, 0x2c0a2: 0x6d751020, 0x2c0a3: 0x6d9edc20, + 0x2c0a4: 0x6d9ede20, 0x2c0a5: 0x6d9ee020, 0x2c0a6: 0x6ddefa20, 0x2c0a7: 0x6df74620, + 0x2c0a8: 0x6e1ad420, 0x2c0a9: 0x6e274220, 0x2c0aa: 0x6e379620, 0x2c0ab: 0x6e379820, + 0x2c0ac: 0x6d475020, 0x2c0ad: 0x6d475220, 0x2c0ae: 0x6d475420, 0x2c0af: 0x6d753020, + 0x2c0b0: 0x6d753220, 0x2c0b1: 0x6d9efe20, 0x2c0b2: 0x6d9f0020, 0x2c0b3: 0x6d9f0220, + 0x2c0b4: 0x6d9f0420, 0x2c0b5: 0x6dc16e20, 0x2c0b6: 0x6ddf2820, 0x2c0b7: 0x6ddf2a20, + 0x2c0b8: 0x6ddf2c20, 0x2c0b9: 0x6df76a20, 0x2c0ba: 0x6df76c20, 0x2c0bb: 0x6df76e20, + 0x2c0bc: 0x6df77020, 0x2c0bd: 0x6df77220, 0x2c0be: 0x6e1ae420, 0x2c0bf: 0x6e1ae620, + // Block 0xb03, offset 0x2c0c0 + 0x2c0c0: 0x6e1ae820, 0x2c0c1: 0x6e275020, 0x2c0c2: 0x6e275220, 0x2c0c3: 0x6e30c820, + 0x2c0c4: 0x6e37a420, 0x2c0c5: 0x6e275420, 0x2c0c6: 0x6e3c4820, 0x2c0c7: 0x6d756220, + 0x2c0c8: 0x6e0b2620, 0x2c0c9: 0x6e0b2820, 0x2c0ca: 0x6d9f3220, 0x2c0cb: 0x6ddf5820, + 0x2c0cc: 0x6df7a420, 0x2c0cd: 0x6e0b3020, 0x2c0ce: 0x6e1afe20, 0x2c0cf: 0x6e30de20, + 0x2c0d0: 0x6e37b620, 0x2c0d1: 0x6d757e20, 0x2c0d2: 0x6d9f3a20, 0x2c0d3: 0x6d9f3c20, + 0x2c0d4: 0x6e0b3e20, 0x2c0d5: 0x6e0b4020, 0x2c0d6: 0x6e0b4220, 0x2c0d7: 0x6e1b0c20, + 0x2c0d8: 0x6e1b0e20, 0x2c0d9: 0x6e1b1020, 0x2c0da: 0x6e278220, 0x2c0db: 0x6e30e620, + 0x2c0dc: 0x6e3c4e20, 0x2c0dd: 0x6d187020, 0x2c0de: 0x6d477220, 0x2c0df: 0x6d758620, + 0x2c0e0: 0x6dc1bc20, 0x2c0e1: 0x6d9f4a20, 0x2c0e2: 0x6dc1be20, 0x2c0e3: 0x6dc1c020, + 0x2c0e4: 0x6ddf6a20, 0x2c0e5: 0x6ddf6c20, 0x2c0e6: 0x6ddf6e20, 0x2c0e7: 0x6ddf7020, + 0x2c0e8: 0x6df7c220, 0x2c0e9: 0x6df7c420, 0x2c0ea: 0x6e0b4e20, 0x2c0eb: 0x6e0b5020, + 0x2c0ec: 0x6e0b5220, 0x2c0ed: 0x6e1b1a20, 0x2c0ee: 0x6e1b1c20, 0x2c0ef: 0x6e1b1e20, + 0x2c0f0: 0x6e30f020, 0x2c0f1: 0x6e37c020, 0x2c0f2: 0x6e3c5220, 0x2c0f3: 0x6e3c5420, + 0x2c0f4: 0x6e3c5620, 0x2c0f5: 0x6e3fc620, 0x2c0f6: 0x6ddf8c20, 0x2c0f7: 0x6df7e220, + 0x2c0f8: 0x6e27ae20, 0x2c0f9: 0x6e37e420, 0x2c0fa: 0x6d9f7620, 0x2c0fb: 0x6e37e820, + 0x2c0fc: 0x6e37ea20, 0x2c0fd: 0x6ddfa420, 0x2c0fe: 0x6ddfa620, 0x2c0ff: 0x6ddfa820, + // Block 0xb04, offset 0x2c100 + 0x2c100: 0x6df7f620, 0x2c101: 0x6e1b6c20, 0x2c102: 0x6d9f8020, 0x2c103: 0x6dc20020, + 0x2c104: 0x6ddfb620, 0x2c105: 0x6df80a20, 0x2c106: 0x6e1b7e20, 0x2c107: 0x6e27d620, + 0x2c108: 0x6e311820, 0x2c109: 0x6e311a20, 0x2c10a: 0x6ddfdc20, 0x2c10b: 0x6ddfde20, + 0x2c10c: 0x6df82020, 0x2c10d: 0x6e0bc420, 0x2c10e: 0x6e0bc620, 0x2c10f: 0x6e1b8820, + 0x2c110: 0x6e424c20, 0x2c111: 0x6e45a820, 0x2c112: 0x6dc22820, 0x2c113: 0x6dc22a20, + 0x2c114: 0x6ddff420, 0x2c115: 0x6df83a20, 0x2c116: 0x6df83c20, 0x2c117: 0x6e0bd420, + 0x2c118: 0x6e0bd620, 0x2c119: 0x6e0bd820, 0x2c11a: 0x6e1ba020, 0x2c11b: 0x6e1ba220, + 0x2c11c: 0x6e27fc20, 0x2c11d: 0x6e27fe20, 0x2c11e: 0x6e314620, 0x2c11f: 0x6e314820, + 0x2c120: 0x6e380c20, 0x2c121: 0x6e380e20, 0x2c122: 0x6e381020, 0x2c123: 0x6e3ca420, + 0x2c124: 0x6e3ca620, 0x2c125: 0x6e3fe620, 0x2c126: 0x6e3fe820, 0x2c127: 0x6e425620, + 0x2c128: 0x6e440420, 0x2c129: 0x6e450c20, 0x2c12a: 0x6e450e20, 0x2c12b: 0x6e46da20, + 0x2c12c: 0x6e283620, 0x2c12d: 0x6e0c2020, 0x2c12e: 0x6e0c2220, 0x2c12f: 0x6df86420, + 0x2c130: 0x6e0c2420, 0x2c131: 0x6e1be620, 0x2c132: 0x6e1be820, 0x2c133: 0x6e1bfe20, + 0x2c134: 0x6e3cd820, 0x2c135: 0x6e427e20, + // Block 0xb05, offset 0x2c140 + 0x2c140: 0x6c000220, 0x2c141: 0x6c003220, 0x2c142: 0x6c003420, 0x2c143: 0x6c003620, + 0x2c144: 0x6c003820, 0x2c145: 0x6c003a20, 0x2c146: 0x6c003c20, 0x2c147: 0x6c00d820, + 0x2c148: 0x6c00da20, 0x2c149: 0x6c00dc20, 0x2c14a: 0x6c00de20, 0x2c14b: 0x6c00e020, + 0x2c14c: 0x6c00e220, 0x2c14d: 0x6c021a20, 0x2c14e: 0x6c021c20, 0x2c14f: 0x6c021e20, + 0x2c150: 0x6c022020, 0x2c151: 0x6c022220, 0x2c152: 0x6c022420, 0x2c153: 0x6c022620, + 0x2c154: 0x6c054020, 0x2c155: 0x6c054220, 0x2c156: 0x6c054420, 0x2c157: 0x6c053c20, + 0x2c158: 0x6c054620, 0x2c159: 0x6c054820, 0x2c15a: 0x6c054a20, 0x2c15b: 0x6c054c20, + 0x2c15c: 0x6c054e20, 0x2c15d: 0x6c055020, 0x2c15e: 0x6c0ad020, 0x2c15f: 0x6c0ad220, + 0x2c160: 0x6c0ad420, 0x2c161: 0x6c0ad620, 0x2c162: 0x6c0ad820, 0x2c163: 0x6c15e420, + 0x2c164: 0x6c15e620, 0x2c165: 0x6c15e820, 0x2c166: 0x6c28ae20, 0x2c167: 0x6c28b020, + 0x2c168: 0x6c000420, 0x2c169: 0x6c004420, 0x2c16a: 0x6c00fa20, 0x2c16b: 0x6c00fc20, + 0x2c16c: 0x6c04e220, 0x2c16d: 0x6c023620, 0x2c16e: 0x6c023820, 0x2c16f: 0x6c023a20, + 0x2c170: 0x6c023c20, 0x2c171: 0x6c056820, 0x2c172: 0x6c160020, 0x2c173: 0x6c28c420, + 0x2c174: 0x6c42f620, 0x2c175: 0x6c63d820, 0x2c176: 0x6c000620, 0x2c177: 0x6c004a20, + 0x2c178: 0x6c00fe20, 0x2c179: 0x6c024220, 0x2c17a: 0x6c024420, 0x2c17b: 0x6c056c20, + 0x2c17c: 0x6c056e20, 0x2c17d: 0x6c15ea20, 0x2c17e: 0x6c430020, 0x2c17f: 0x6c000820, + // Block 0xb06, offset 0x2c180 + 0x2c180: 0x6c000a20, 0x2c181: 0x6c000c20, 0x2c182: 0x6c005020, 0x2c183: 0x6c005220, + 0x2c184: 0x6c005420, 0x2c185: 0x6c010620, 0x2c186: 0x6c010820, 0x2c187: 0x6c010a20, + 0x2c188: 0x6c010c20, 0x2c189: 0x6c010020, 0x2c18a: 0x6c010e20, 0x2c18b: 0x6c024820, + 0x2c18c: 0x6c024a20, 0x2c18d: 0x6c057420, 0x2c18e: 0x6c057620, 0x2c18f: 0x6c057820, + 0x2c190: 0x6c057a20, 0x2c191: 0x6c0af020, 0x2c192: 0x6c0af220, 0x2c193: 0x6c0af420, + 0x2c194: 0x6c0af620, 0x2c195: 0x6c160620, 0x2c196: 0x6c28d020, 0x2c197: 0x6c430220, + 0x2c198: 0x6c63e020, 0x2c199: 0x6c001020, 0x2c19a: 0x6c001220, 0x2c19b: 0x6c001420, + 0x2c19c: 0x6c006020, 0x2c19d: 0x6c006220, 0x2c19e: 0x6c012020, 0x2c19f: 0x6c012220, + 0x2c1a0: 0x6c012420, 0x2c1a1: 0x6c01d020, 0x2c1a2: 0x6c041020, 0x2c1a3: 0x6c025c20, + 0x2c1a4: 0x6c025e20, 0x2c1a5: 0x6c026020, 0x2c1a6: 0x6c026220, 0x2c1a7: 0x6c05a020, + 0x2c1a8: 0x6c0b1a20, 0x2c1a9: 0x6c0b1c20, 0x2c1aa: 0x6c0b1e20, 0x2c1ab: 0x6c0b2020, + 0x2c1ac: 0x6c0b2220, 0x2c1ad: 0x6c0b2420, 0x2c1ae: 0x6c0b2620, 0x2c1af: 0x6c0b2820, + 0x2c1b0: 0x6c0b2a20, 0x2c1b1: 0x6c161020, 0x2c1b2: 0x6c161220, 0x2c1b3: 0x6c28de20, + 0x2c1b4: 0x6c28e020, 0x2c1b5: 0x6c28e220, 0x2c1b6: 0x6c28e420, 0x2c1b7: 0x6c28e620, + 0x2c1b8: 0x6c28e820, 0x2c1b9: 0x6c431420, 0x2c1ba: 0x6c431620, 0x2c1bb: 0x6c431820, + 0x2c1bc: 0x6c431a20, 0x2c1bd: 0x6c63f220, 0x2c1be: 0x6c8b0c20, 0x2c1bf: 0x6c8b0e20, + // Block 0xb07, offset 0x2c1c0 + 0x2c1c0: 0x6c8b1020, 0x2c1c1: 0x6cb7b220, 0x2c1c2: 0x6ce8d220, 0x2c1c3: 0x6ce8d420, + 0x2c1c4: 0x6ce8d620, 0x2c1c5: 0x6c002420, 0x2c1c6: 0x6c006a20, 0x2c1c7: 0x6c012c20, + 0x2c1c8: 0x6c027a20, 0x2c1c9: 0x6c0b3820, 0x2c1ca: 0x6c162020, 0x2c1cb: 0x6c28f420, + 0x2c1cc: 0x6c007420, 0x2c1cd: 0x6c013020, 0x2c1ce: 0x6c013220, 0x2c1cf: 0x6c013420, + 0x2c1d0: 0x6c00e420, 0x2c1d1: 0x6c028220, 0x2c1d2: 0x6c028420, 0x2c1d3: 0x6c028620, + 0x2c1d4: 0x6c028820, 0x2c1d5: 0x6c028a20, 0x2c1d6: 0x6c028c20, 0x2c1d7: 0x6c05b020, + 0x2c1d8: 0x6c0b3e20, 0x2c1d9: 0x6c0b4020, 0x2c1da: 0x6c0b4220, 0x2c1db: 0x6c28f820, + 0x2c1dc: 0x6c162a20, 0x2c1dd: 0x6c28fc20, 0x2c1de: 0x6c28fe20, 0x2c1df: 0x6c290020, + 0x2c1e0: 0x6c007c20, 0x2c1e1: 0x6c013620, 0x2c1e2: 0x6c029020, 0x2c1e3: 0x6c029220, + 0x2c1e4: 0x6c0b5420, 0x2c1e5: 0x6c0b5620, 0x2c1e6: 0x6c0b5820, 0x2c1e7: 0x6c0b5a20, + 0x2c1e8: 0x6c163620, 0x2c1e9: 0x6c163820, 0x2c1ea: 0x6c163a20, 0x2c1eb: 0x6c290e20, + 0x2c1ec: 0x6c291020, 0x2c1ed: 0x6c433420, 0x2c1ee: 0x6c433620, 0x2c1ef: 0x6c433820, + 0x2c1f0: 0x6c433a20, 0x2c1f1: 0x6c433c20, 0x2c1f2: 0x6c433e20, 0x2c1f3: 0x6c640a20, + 0x2c1f4: 0x6cb7c020, 0x2c1f5: 0x6cb7c220, 0x2c1f6: 0x6ce8e620, 0x2c1f7: 0x6ce8e820, + 0x2c1f8: 0x6d75da20, 0x2c1f9: 0x6e1c0620, 0x2c1fa: 0x6c007e20, 0x2c1fb: 0x6c008020, + 0x2c1fc: 0x6c013820, 0x2c1fd: 0x6c013a20, 0x2c1fe: 0x6c013c20, 0x2c1ff: 0x6c013e20, + // Block 0xb08, offset 0x2c200 + 0x2c200: 0x6c029620, 0x2c201: 0x6c029820, 0x2c202: 0x6c029a20, 0x2c203: 0x6c029c20, + 0x2c204: 0x6c029e20, 0x2c205: 0x6c02a020, 0x2c206: 0x6c02a220, 0x2c207: 0x6c02a420, + 0x2c208: 0x6c02a620, 0x2c209: 0x6c02a820, 0x2c20a: 0x6c02aa20, 0x2c20b: 0x6c02ac20, + 0x2c20c: 0x6c02ae20, 0x2c20d: 0x6c02b020, 0x2c20e: 0x6c02b220, 0x2c20f: 0x6c02b420, + 0x2c210: 0x6c02b620, 0x2c211: 0x6c02b820, 0x2c212: 0x6c02ba20, 0x2c213: 0x6c02bc20, + 0x2c214: 0x6c05c820, 0x2c215: 0x6c05ca20, 0x2c216: 0x6c05cc20, 0x2c217: 0x6c05ce20, + 0x2c218: 0x6c05d020, 0x2c219: 0x6c05d220, 0x2c21a: 0x6c05d420, 0x2c21b: 0x6c05d620, + 0x2c21c: 0x6c05d820, 0x2c21d: 0x6c05da20, 0x2c21e: 0x6c05dc20, 0x2c21f: 0x6c05de20, + 0x2c220: 0x6c05e020, 0x2c221: 0x6c05e220, 0x2c222: 0x6c05e420, 0x2c223: 0x6c05e620, + 0x2c224: 0x6c05e820, 0x2c225: 0x6c05ea20, 0x2c226: 0x6c05ec20, 0x2c227: 0x6c05ee20, + 0x2c228: 0x6c05f020, 0x2c229: 0x6c05f220, 0x2c22a: 0x6c05f420, 0x2c22b: 0x6c05f620, + 0x2c22c: 0x6c05f820, 0x2c22d: 0x6c05fa20, 0x2c22e: 0x6c0b7a20, 0x2c22f: 0x6c0b7c20, + 0x2c230: 0x6c0b7e20, 0x2c231: 0x6c0b8020, 0x2c232: 0x6c0b8220, 0x2c233: 0x6c0b8420, + 0x2c234: 0x6c0b8620, 0x2c235: 0x6c0b8820, 0x2c236: 0x6c0b8a20, 0x2c237: 0x6c0b8c20, + 0x2c238: 0x6c0b8e20, 0x2c239: 0x6c0b9020, 0x2c23a: 0x6c0b9220, 0x2c23b: 0x6c0b9420, + 0x2c23c: 0x6c0b9620, 0x2c23d: 0x6c0b9820, 0x2c23e: 0x6c0b9a20, 0x2c23f: 0x6c0b9c20, + // Block 0xb09, offset 0x2c240 + 0x2c240: 0x6c0b9e20, 0x2c241: 0x6c0ba020, 0x2c242: 0x6c0ba220, 0x2c243: 0x6c0ba420, + 0x2c244: 0x6c0ba620, 0x2c245: 0x6c0ba820, 0x2c246: 0x6c0baa20, 0x2c247: 0x6c0bac20, + 0x2c248: 0x6c0bae20, 0x2c249: 0x6c0bb020, 0x2c24a: 0x6c0bb220, 0x2c24b: 0x6c0bb420, + 0x2c24c: 0x6c0bb620, 0x2c24d: 0x6c0bb820, 0x2c24e: 0x6c0bba20, 0x2c24f: 0x6c0bbc20, + 0x2c250: 0x6c0bbe20, 0x2c251: 0x6c0bc020, 0x2c252: 0x6c0bc220, 0x2c253: 0x6c0bc420, + 0x2c254: 0x6c0bc620, 0x2c255: 0x6c0bc820, 0x2c256: 0x6c0bca20, 0x2c257: 0x6c0bcc20, + 0x2c258: 0x6c0bce20, 0x2c259: 0x6c0bd020, 0x2c25a: 0x6c0bd220, 0x2c25b: 0x6c0bd420, + 0x2c25c: 0x6c0bd620, 0x2c25d: 0x6c0bd820, 0x2c25e: 0x6c0bda20, 0x2c25f: 0x6c0bdc20, + 0x2c260: 0x6c0bde20, 0x2c261: 0x6c0be020, 0x2c262: 0x6c0be220, 0x2c263: 0x6c0be420, + 0x2c264: 0x6c0be620, 0x2c265: 0x6c0be820, 0x2c266: 0x6c0bea20, 0x2c267: 0x6c0bec20, + 0x2c268: 0x6c0bee20, 0x2c269: 0x6c0bf020, 0x2c26a: 0x6c0bf220, 0x2c26b: 0x6c0bf420, + 0x2c26c: 0x6c0bf620, 0x2c26d: 0x6c165620, 0x2c26e: 0x6c165820, 0x2c26f: 0x6c165a20, + 0x2c270: 0x6c165c20, 0x2c271: 0x6c165e20, 0x2c272: 0x6c166020, 0x2c273: 0x6c166220, + 0x2c274: 0x6c166420, 0x2c275: 0x6c166620, 0x2c276: 0x6c166820, 0x2c277: 0x6c166a20, + 0x2c278: 0x6c166c20, 0x2c279: 0x6c166e20, 0x2c27a: 0x6c167020, 0x2c27b: 0x6c167220, + 0x2c27c: 0x6c167420, 0x2c27d: 0x6c167620, 0x2c27e: 0x6c167820, 0x2c27f: 0x6c167a20, + // Block 0xb0a, offset 0x2c280 + 0x2c280: 0x6c167c20, 0x2c281: 0x6c167e20, 0x2c282: 0x6c168020, 0x2c283: 0x6c168220, + 0x2c284: 0x6c168420, 0x2c285: 0x6c168620, 0x2c286: 0x6c168820, 0x2c287: 0x6c168a20, + 0x2c288: 0x6c168c20, 0x2c289: 0x6c168e20, 0x2c28a: 0x6c169020, 0x2c28b: 0x6c169220, + 0x2c28c: 0x6c292020, 0x2c28d: 0x6c169420, 0x2c28e: 0x6c169620, 0x2c28f: 0x6c169820, + 0x2c290: 0x6c169a20, 0x2c291: 0x6c169c20, 0x2c292: 0x6c169e20, 0x2c293: 0x6c16a020, + 0x2c294: 0x6c16a220, 0x2c295: 0x6c16a420, 0x2c296: 0x6c16a620, 0x2c297: 0x6c16a820, + 0x2c298: 0x6c16aa20, 0x2c299: 0x6c16ac20, 0x2c29a: 0x6c16ae20, 0x2c29b: 0x6c16b020, + 0x2c29c: 0x6c16b220, 0x2c29d: 0x6c16b420, 0x2c29e: 0x6c16b620, 0x2c29f: 0x6c16b820, + 0x2c2a0: 0x6c16ba20, 0x2c2a1: 0x6c16bc20, 0x2c2a2: 0x6c16be20, 0x2c2a3: 0x6c16c020, + 0x2c2a4: 0x6c0bf820, 0x2c2a5: 0x6c16c220, 0x2c2a6: 0x6c16c420, 0x2c2a7: 0x6c16c620, + 0x2c2a8: 0x6c16c820, 0x2c2a9: 0x6c293e20, 0x2c2aa: 0x6c294020, 0x2c2ab: 0x6c294220, + 0x2c2ac: 0x6c294420, 0x2c2ad: 0x6c294620, 0x2c2ae: 0x6c294820, 0x2c2af: 0x6c294a20, + 0x2c2b0: 0x6c294c20, 0x2c2b1: 0x6c294e20, 0x2c2b2: 0x6c295020, 0x2c2b3: 0x6c295220, + 0x2c2b4: 0x6c295420, 0x2c2b5: 0x6c295620, 0x2c2b6: 0x6c295820, 0x2c2b7: 0x6c295a20, + 0x2c2b8: 0x6c295c20, 0x2c2b9: 0x6c295e20, 0x2c2ba: 0x6c296020, 0x2c2bb: 0x6c296220, + 0x2c2bc: 0x6c296420, 0x2c2bd: 0x6c296620, 0x2c2be: 0x6c296820, 0x2c2bf: 0x6c296a20, + // Block 0xb0b, offset 0x2c2c0 + 0x2c2c0: 0x6c296c20, 0x2c2c1: 0x6c296e20, 0x2c2c2: 0x6c297020, 0x2c2c3: 0x6c297220, + 0x2c2c4: 0x6c297420, 0x2c2c5: 0x6c297620, 0x2c2c6: 0x6c297820, 0x2c2c7: 0x6c297a20, + 0x2c2c8: 0x6c297c20, 0x2c2c9: 0x6c297e20, 0x2c2ca: 0x6c298020, 0x2c2cb: 0x6c298220, + 0x2c2cc: 0x6c298420, 0x2c2cd: 0x6c298620, 0x2c2ce: 0x6c298820, 0x2c2cf: 0x6c298a20, + 0x2c2d0: 0x6c298c20, 0x2c2d1: 0x6c298e20, 0x2c2d2: 0x6c299020, 0x2c2d3: 0x6c299220, + 0x2c2d4: 0x6c299420, 0x2c2d5: 0x6c299620, 0x2c2d6: 0x6c299820, 0x2c2d7: 0x6c299a20, + 0x2c2d8: 0x6c299c20, 0x2c2d9: 0x6c299e20, 0x2c2da: 0x6c29a020, 0x2c2db: 0x6c29a220, + 0x2c2dc: 0x6c29a420, 0x2c2dd: 0x6c29a620, 0x2c2de: 0x6c29a820, 0x2c2df: 0x6c29aa20, + 0x2c2e0: 0x6c29ac20, 0x2c2e1: 0x6c29ae20, 0x2c2e2: 0x6c29b020, 0x2c2e3: 0x6c29b220, + 0x2c2e4: 0x6c29b420, 0x2c2e5: 0x6c29b620, 0x2c2e6: 0x6c29b820, 0x2c2e7: 0x6c29ba20, + 0x2c2e8: 0x6c29bc20, 0x2c2e9: 0x6c29be20, 0x2c2ea: 0x6c29c020, 0x2c2eb: 0x6c29c220, + 0x2c2ec: 0x6c29c420, 0x2c2ed: 0x6c29c620, 0x2c2ee: 0x6c435e20, 0x2c2ef: 0x6c436020, + 0x2c2f0: 0x6c436220, 0x2c2f1: 0x6c436420, 0x2c2f2: 0x6c436620, 0x2c2f3: 0x6c436820, + 0x2c2f4: 0x6c436a20, 0x2c2f5: 0x6c436c20, 0x2c2f6: 0x6c436e20, 0x2c2f7: 0x6c437020, + 0x2c2f8: 0x6c437220, 0x2c2f9: 0x6c437420, 0x2c2fa: 0x6c437620, 0x2c2fb: 0x6c437820, + 0x2c2fc: 0x6c437a20, 0x2c2fd: 0x6c437c20, 0x2c2fe: 0x6c437e20, 0x2c2ff: 0x6c438020, + // Block 0xb0c, offset 0x2c300 + 0x2c300: 0x6c438220, 0x2c301: 0x6c438420, 0x2c302: 0x6c438620, 0x2c303: 0x6c438820, + 0x2c304: 0x6c438a20, 0x2c305: 0x6c438c20, 0x2c306: 0x6c438e20, 0x2c307: 0x6c439020, + 0x2c308: 0x6c439220, 0x2c309: 0x6c439420, 0x2c30a: 0x6c439620, 0x2c30b: 0x6c439820, + 0x2c30c: 0x6c439a20, 0x2c30d: 0x6c439c20, 0x2c30e: 0x6c439e20, 0x2c30f: 0x6c43a020, + 0x2c310: 0x6c43a220, 0x2c311: 0x6c43a420, 0x2c312: 0x6c43a620, 0x2c313: 0x6c43a820, + 0x2c314: 0x6c43aa20, 0x2c315: 0x6c43ac20, 0x2c316: 0x6c43ae20, 0x2c317: 0x6c43b020, + 0x2c318: 0x6c43b220, 0x2c319: 0x6c43b420, 0x2c31a: 0x6c43b620, 0x2c31b: 0x6c43b820, + 0x2c31c: 0x6c43ba20, 0x2c31d: 0x6c43bc20, 0x2c31e: 0x6c43be20, 0x2c31f: 0x6c43c020, + 0x2c320: 0x6c43c220, 0x2c321: 0x6c43c420, 0x2c322: 0x6c43c620, 0x2c323: 0x6c43c820, + 0x2c324: 0x6c43ca20, 0x2c325: 0x6c43cc20, 0x2c326: 0x6c43ce20, 0x2c327: 0x6c43d020, + 0x2c328: 0x6c43d220, 0x2c329: 0x6c43d420, 0x2c32a: 0x6c43d620, 0x2c32b: 0x6c43d820, + 0x2c32c: 0x6c43da20, 0x2c32d: 0x6c43dc20, 0x2c32e: 0x6c642e20, 0x2c32f: 0x6c643020, + 0x2c330: 0x6c643220, 0x2c331: 0x6c643420, 0x2c332: 0x6c643620, 0x2c333: 0x6c643820, + 0x2c334: 0x6c643a20, 0x2c335: 0x6c643c20, 0x2c336: 0x6c643e20, 0x2c337: 0x6c644020, + 0x2c338: 0x6c644220, 0x2c339: 0x6c644420, 0x2c33a: 0x6c644620, 0x2c33b: 0x6c644820, + 0x2c33c: 0x6c644a20, 0x2c33d: 0x6c644c20, 0x2c33e: 0x6c644e20, 0x2c33f: 0x6c645020, + // Block 0xb0d, offset 0x2c340 + 0x2c340: 0x6c645220, 0x2c341: 0x6c645420, 0x2c342: 0x6c645620, 0x2c343: 0x6c645820, + 0x2c344: 0x6c645a20, 0x2c345: 0x6c645c20, 0x2c346: 0x6c645e20, 0x2c347: 0x6c646020, + 0x2c348: 0x6c646220, 0x2c349: 0x6c646420, 0x2c34a: 0x6c646620, 0x2c34b: 0x6c646820, + 0x2c34c: 0x6c646a20, 0x2c34d: 0x6c646c20, 0x2c34e: 0x6c646e20, 0x2c34f: 0x6c647020, + 0x2c350: 0x6c647220, 0x2c351: 0x6c647420, 0x2c352: 0x6c647620, 0x2c353: 0x6c647820, + 0x2c354: 0x6c647a20, 0x2c355: 0x6c647c20, 0x2c356: 0x6c647e20, 0x2c357: 0x6c648020, + 0x2c358: 0x6c648220, 0x2c359: 0x6c648420, 0x2c35a: 0x6c648620, 0x2c35b: 0x6c648820, + 0x2c35c: 0x6c648a20, 0x2c35d: 0x6c648c20, 0x2c35e: 0x6c648e20, 0x2c35f: 0x6c649020, + 0x2c360: 0x6c649220, 0x2c361: 0x6c649420, 0x2c362: 0x6c649620, 0x2c363: 0x6c649820, + 0x2c364: 0x6c649a20, 0x2c365: 0x6c649c20, 0x2c366: 0x6c649e20, 0x2c367: 0x6c64a020, + 0x2c368: 0x6c64a220, 0x2c369: 0x6c64a420, 0x2c36a: 0x6c64a620, 0x2c36b: 0x6c64a820, + 0x2c36c: 0x6c64aa20, 0x2c36d: 0x6c64ac20, 0x2c36e: 0x6c64ae20, 0x2c36f: 0x6c64b020, + 0x2c370: 0x6c64b220, 0x2c371: 0x6c64b420, 0x2c372: 0x6c64b620, 0x2c373: 0x6c64b820, + 0x2c374: 0x6c64ba20, 0x2c375: 0x6c64bc20, 0x2c376: 0x6c64be20, 0x2c377: 0x6c64c020, + 0x2c378: 0x6c64c220, 0x2c379: 0x6c64c420, 0x2c37a: 0x6c64c620, 0x2c37b: 0x6c64c820, + 0x2c37c: 0x6c64ca20, 0x2c37d: 0x6c64cc20, 0x2c37e: 0x6c64ce20, 0x2c37f: 0x6c64d020, + // Block 0xb0e, offset 0x2c380 + 0x2c380: 0x6c8b4a20, 0x2c381: 0x6c8b4c20, 0x2c382: 0x6c8b4e20, 0x2c383: 0x6c8b5020, + 0x2c384: 0x6c8b5220, 0x2c385: 0x6c8b5420, 0x2c386: 0x6c8b5620, 0x2c387: 0x6c8b5820, + 0x2c388: 0x6c8b5a20, 0x2c389: 0x6c8b5c20, 0x2c38a: 0x6c8b5e20, 0x2c38b: 0x6c8b6020, + 0x2c38c: 0x6c8b6220, 0x2c38d: 0x6c8b6420, 0x2c38e: 0x6c8b6620, 0x2c38f: 0x6c8b6820, + 0x2c390: 0x6c8b6a20, 0x2c391: 0x6c8b6c20, 0x2c392: 0x6c8b6e20, 0x2c393: 0x6c8b7020, + 0x2c394: 0x6c8b7220, 0x2c395: 0x6c8b7420, 0x2c396: 0x6c656e20, 0x2c397: 0x6c8b7620, + 0x2c398: 0x6c8b7820, 0x2c399: 0x6c8b7a20, 0x2c39a: 0x6c8b7c20, 0x2c39b: 0x6c8b7e20, + 0x2c39c: 0x6c8b8020, 0x2c39d: 0x6c8b8220, 0x2c39e: 0x6c8b8420, 0x2c39f: 0x6c8b8620, + 0x2c3a0: 0x6c8b8820, 0x2c3a1: 0x6c8b8a20, 0x2c3a2: 0x6c8b8c20, 0x2c3a3: 0x6c8b8e20, + 0x2c3a4: 0x6c8b9020, 0x2c3a5: 0x6c8b9220, 0x2c3a6: 0x6c8b9420, 0x2c3a7: 0x6c8b9620, + 0x2c3a8: 0x6cb7d820, 0x2c3a9: 0x6c8b9820, 0x2c3aa: 0x6c8b9a20, 0x2c3ab: 0x6c8b9c20, + 0x2c3ac: 0x6c8b9e20, 0x2c3ad: 0x6c8ba020, 0x2c3ae: 0x6c8ba220, 0x2c3af: 0x6c8ba420, + 0x2c3b0: 0x6c8ba620, 0x2c3b1: 0x6c8ba820, 0x2c3b2: 0x6c8baa20, 0x2c3b3: 0x6c8bac20, + 0x2c3b4: 0x6c8bae20, 0x2c3b5: 0x6c8bb020, 0x2c3b6: 0x6c8bb220, 0x2c3b7: 0x6c8bb420, + 0x2c3b8: 0x6c8bb620, 0x2c3b9: 0x6c8bb820, 0x2c3ba: 0x6c8bba20, 0x2c3bb: 0x6c8bbc20, + 0x2c3bc: 0x6c8bbe20, 0x2c3bd: 0x6c8bc020, 0x2c3be: 0x6c8bc220, 0x2c3bf: 0x6c8bc420, + // Block 0xb0f, offset 0x2c3c0 + 0x2c3c0: 0x6cb7ea20, 0x2c3c1: 0x6cb7ec20, 0x2c3c2: 0x6cb7ee20, 0x2c3c3: 0x6cb7f020, + 0x2c3c4: 0x6cb7f220, 0x2c3c5: 0x6cb7f420, 0x2c3c6: 0x6cb7f620, 0x2c3c7: 0x6cb7f820, + 0x2c3c8: 0x6cb7fa20, 0x2c3c9: 0x6cb7fc20, 0x2c3ca: 0x6cb7fe20, 0x2c3cb: 0x6cb80020, + 0x2c3cc: 0x6cb80220, 0x2c3cd: 0x6cb80420, 0x2c3ce: 0x6cb80620, 0x2c3cf: 0x6cb80820, + 0x2c3d0: 0x6cb80a20, 0x2c3d1: 0x6cb80c20, 0x2c3d2: 0x6cb80e20, 0x2c3d3: 0x6cb81020, + 0x2c3d4: 0x6cb81220, 0x2c3d5: 0x6cb81420, 0x2c3d6: 0x6cb81620, 0x2c3d7: 0x6cb81820, + 0x2c3d8: 0x6cb81a20, 0x2c3d9: 0x6cb81c20, 0x2c3da: 0x6cb81e20, 0x2c3db: 0x6cb82020, + 0x2c3dc: 0x6cb82220, 0x2c3dd: 0x6cb82420, 0x2c3de: 0x6cb82620, 0x2c3df: 0x6cb82820, + 0x2c3e0: 0x6cb82a20, 0x2c3e1: 0x6cb82c20, 0x2c3e2: 0x6cb82e20, 0x2c3e3: 0x6cb83020, + 0x2c3e4: 0x6cb83220, 0x2c3e5: 0x6cb83420, 0x2c3e6: 0x6cb83620, 0x2c3e7: 0x6cb83820, + 0x2c3e8: 0x6cb83a20, 0x2c3e9: 0x6cb83c20, 0x2c3ea: 0x6ce90c20, 0x2c3eb: 0x6ce90e20, + 0x2c3ec: 0x6ce91020, 0x2c3ed: 0x6ce91220, 0x2c3ee: 0x6ce91420, 0x2c3ef: 0x6ce91620, + 0x2c3f0: 0x6ce91820, 0x2c3f1: 0x6ce91a20, 0x2c3f2: 0x6ce91c20, 0x2c3f3: 0x6ce91e20, + 0x2c3f4: 0x6ce92020, 0x2c3f5: 0x6ce92220, 0x2c3f6: 0x6ce92420, 0x2c3f7: 0x6ce92620, + 0x2c3f8: 0x6ce92820, 0x2c3f9: 0x6ce92a20, 0x2c3fa: 0x6ce92c20, 0x2c3fb: 0x6ce92e20, + 0x2c3fc: 0x6ce93020, 0x2c3fd: 0x6ce93220, 0x2c3fe: 0x6ce93420, 0x2c3ff: 0x6ce93620, + // Block 0xb10, offset 0x2c400 + 0x2c400: 0x6ce93820, 0x2c401: 0x6ce93a20, 0x2c402: 0x6ce93c20, 0x2c403: 0x6ce93e20, + 0x2c404: 0x6ce94020, 0x2c405: 0x6ce94220, 0x2c406: 0x6ce94420, 0x2c407: 0x6ce94620, + 0x2c408: 0x6ce94820, 0x2c409: 0x6ce94a20, 0x2c40a: 0x6ce94c20, 0x2c40b: 0x6ce94e20, + 0x2c40c: 0x6ce95020, 0x2c40d: 0x6ce95220, 0x2c40e: 0x6d18cc20, 0x2c40f: 0x6d18ce20, + 0x2c410: 0x6d18d020, 0x2c411: 0x6d18d220, 0x2c412: 0x6d18d420, 0x2c413: 0x6d18d620, + 0x2c414: 0x6d18d820, 0x2c415: 0x6d18da20, 0x2c416: 0x6d18dc20, 0x2c417: 0x6d18de20, + 0x2c418: 0x6d18e020, 0x2c419: 0x6d18e220, 0x2c41a: 0x6d18e420, 0x2c41b: 0x6d18e620, + 0x2c41c: 0x6d18e820, 0x2c41d: 0x6d18ea20, 0x2c41e: 0x6d18ec20, 0x2c41f: 0x6d18ee20, + 0x2c420: 0x6d18f020, 0x2c421: 0x6d18f220, 0x2c422: 0x6d18f420, 0x2c423: 0x6d18f620, + 0x2c424: 0x6d18f820, 0x2c425: 0x6d18fa20, 0x2c426: 0x6d18fc20, 0x2c427: 0x6d18fe20, + 0x2c428: 0x6d190020, 0x2c429: 0x6d190220, 0x2c42a: 0x6d190420, 0x2c42b: 0x6d190620, + 0x2c42c: 0x6d190820, 0x2c42d: 0x6d190a20, 0x2c42e: 0x6d190c20, 0x2c42f: 0x6d190e20, + 0x2c430: 0x6d191020, 0x2c431: 0x6d191220, 0x2c432: 0x6d19b420, 0x2c433: 0x6d191420, + 0x2c434: 0x6d191620, 0x2c435: 0x6d47c220, 0x2c436: 0x6d47c420, 0x2c437: 0x6d191820, + 0x2c438: 0x6d47c620, 0x2c439: 0x6d47c820, 0x2c43a: 0x6d47ca20, 0x2c43b: 0x6d47cc20, + 0x2c43c: 0x6d47ce20, 0x2c43d: 0x6d47d020, 0x2c43e: 0x6d47d220, 0x2c43f: 0x6d47d420, + // Block 0xb11, offset 0x2c440 + 0x2c440: 0x6d47d620, 0x2c441: 0x6d47d820, 0x2c442: 0x6d47da20, 0x2c443: 0x6d47dc20, + 0x2c444: 0x6d47de20, 0x2c445: 0x6d47e020, 0x2c446: 0x6d47e220, 0x2c447: 0x6d47e420, + 0x2c448: 0x6d47e620, 0x2c449: 0x6d47e820, 0x2c44a: 0x6d47ea20, 0x2c44b: 0x6d47ec20, + 0x2c44c: 0x6d47ee20, 0x2c44d: 0x6d47f020, 0x2c44e: 0x6d47f220, 0x2c44f: 0x6d47f420, + 0x2c450: 0x6d75fc20, 0x2c451: 0x6d75fe20, 0x2c452: 0x6d760020, 0x2c453: 0x6d760220, + 0x2c454: 0x6d760420, 0x2c455: 0x6d760620, 0x2c456: 0x6d760820, 0x2c457: 0x6d760a20, + 0x2c458: 0x6d760c20, 0x2c459: 0x6d760e20, 0x2c45a: 0x6d761020, 0x2c45b: 0x6d761220, + 0x2c45c: 0x6d761420, 0x2c45d: 0x6d761620, 0x2c45e: 0x6d761820, 0x2c45f: 0x6d9fae20, + 0x2c460: 0x6d9fb020, 0x2c461: 0x6d9fb220, 0x2c462: 0x6d9fb420, 0x2c463: 0x6d9fb620, + 0x2c464: 0x6d9fb820, 0x2c465: 0x6d9fba20, 0x2c466: 0x6d9fbc20, 0x2c467: 0x6d9fbe20, + 0x2c468: 0x6d9fc020, 0x2c469: 0x6d9fc220, 0x2c46a: 0x6d9fc420, 0x2c46b: 0x6d761a20, + 0x2c46c: 0x6d9fc620, 0x2c46d: 0x6dc24e20, 0x2c46e: 0x6dc25020, 0x2c46f: 0x6dc25220, + 0x2c470: 0x6d485a20, 0x2c471: 0x6dc25420, 0x2c472: 0x6da00220, 0x2c473: 0x6de01420, + 0x2c474: 0x6de01620, 0x2c475: 0x6de01820, 0x2c476: 0x6df87420, 0x2c477: 0x6e0c4220, + 0x2c478: 0x6e0c4420, 0x2c479: 0x6e0c4620, 0x2c47a: 0x6e0c4820, 0x2c47b: 0x6e1c0820, + 0x2c47c: 0x6e1c0a20, 0x2c47d: 0x6e284c20, 0x2c47e: 0x6e318820, 0x2c47f: 0x6c008420, + // Block 0xb12, offset 0x2c480 + 0x2c480: 0x6c014620, 0x2c481: 0x6c02c620, 0x2c482: 0x6c02c820, 0x2c483: 0x6c02ca20, + 0x2c484: 0x6c060e20, 0x2c485: 0x6c061420, 0x2c486: 0x6c0c4620, 0x2c487: 0x6c0c4820, + 0x2c488: 0x6c0c4a20, 0x2c489: 0x6c0c4c20, 0x2c48a: 0x6c0c4e20, 0x2c48b: 0x6c173420, + 0x2c48c: 0x6c173620, 0x2c48d: 0x6c173820, 0x2c48e: 0x6c173a20, 0x2c48f: 0x6c173c20, + 0x2c490: 0x6c173e20, 0x2c491: 0x6c174020, 0x2c492: 0x6c2a2e20, 0x2c493: 0x6c2a3020, + 0x2c494: 0x6c2a3220, 0x2c495: 0x6c2a3420, 0x2c496: 0x6c2a3620, 0x2c497: 0x6c445a20, + 0x2c498: 0x6c445c20, 0x2c499: 0x6c445e20, 0x2c49a: 0x6c657220, 0x2c49b: 0x6c657420, + 0x2c49c: 0x6c8c6820, 0x2c49d: 0x6c8c6a20, 0x2c49e: 0x6c8c6c20, 0x2c49f: 0x6cb8c620, + 0x2c4a0: 0x6cb8c820, 0x2c4a1: 0x6ce9e220, 0x2c4a2: 0x6d19b620, 0x2c4a3: 0x6d766620, + 0x2c4a4: 0x6e0c6420, 0x2c4a5: 0x6c008620, 0x2c4a6: 0x6c014820, 0x2c4a7: 0x6c02ce20, + 0x2c4a8: 0x6c0c5a20, 0x2c4a9: 0x6c2a4c20, 0x2c4aa: 0x6c446c20, 0x2c4ab: 0x6c008820, + 0x2c4ac: 0x6c02d620, 0x2c4ad: 0x6c02d820, 0x2c4ae: 0x6c02da20, 0x2c4af: 0x6c02dc20, + 0x2c4b0: 0x6c061c20, 0x2c4b1: 0x6c0c6820, 0x2c4b2: 0x6c0c6a20, 0x2c4b3: 0x6c0c6c20, + 0x2c4b4: 0x6c0c6e20, 0x2c4b5: 0x6c176220, 0x2c4b6: 0x6c2a5020, 0x2c4b7: 0x6c2a5220, + 0x2c4b8: 0x6c2a5420, 0x2c4b9: 0x6c447620, 0x2c4ba: 0x6c659020, 0x2c4bb: 0x6c447820, + 0x2c4bc: 0x6c659220, 0x2c4bd: 0x6c8c7e20, 0x2c4be: 0x6ce9f420, 0x2c4bf: 0x6ce9f620, + // Block 0xb13, offset 0x2c4c0 + 0x2c4c0: 0x6d767a20, 0x2c4c1: 0x6dc29820, 0x2c4c2: 0x6c008c20, 0x2c4c3: 0x6c02e620, + 0x2c4c4: 0x6c02e820, 0x2c4c5: 0x6c02ea20, 0x2c4c6: 0x6c02ec20, 0x2c4c7: 0x6c02ee20, + 0x2c4c8: 0x6c02f020, 0x2c4c9: 0x6c062220, 0x2c4ca: 0x6c062420, 0x2c4cb: 0x6c062620, + 0x2c4cc: 0x6c062820, 0x2c4cd: 0x6c0c7820, 0x2c4ce: 0x6c0c7a20, 0x2c4cf: 0x6c177020, + 0x2c4d0: 0x6c2a5e20, 0x2c4d1: 0x6c448620, 0x2c4d2: 0x6c448820, 0x2c4d3: 0x6c659a20, + 0x2c4d4: 0x6c659c20, 0x2c4d5: 0x6c8c8820, 0x2c4d6: 0x6c008e20, 0x2c4d7: 0x6c02fe20, + 0x2c4d8: 0x6c030020, 0x2c4d9: 0x6c063e20, 0x2c4da: 0x6c064020, 0x2c4db: 0x6c0c8620, + 0x2c4dc: 0x6c0c8820, 0x2c4dd: 0x6c178020, 0x2c4de: 0x6c2a6a20, 0x2c4df: 0x6c449220, + 0x2c4e0: 0x6c449420, 0x2c4e1: 0x6c65a420, 0x2c4e2: 0x6c65a620, 0x2c4e3: 0x6c65a820, + 0x2c4e4: 0x6c65aa20, 0x2c4e5: 0x6c65ac20, 0x2c4e6: 0x6c65ae20, 0x2c4e7: 0x6c65b020, + 0x2c4e8: 0x6c8c9020, 0x2c4e9: 0x6d19e020, 0x2c4ea: 0x6d768820, 0x2c4eb: 0x6c009020, + 0x2c4ec: 0x6c064a20, 0x2c4ed: 0x6c064c20, 0x2c4ee: 0x6c064e20, 0x2c4ef: 0x6c065020, + 0x2c4f0: 0x6c0c9c20, 0x2c4f1: 0x6c0c9e20, 0x2c4f2: 0x6c0ca020, 0x2c4f3: 0x6c0ca220, + 0x2c4f4: 0x6c0ca420, 0x2c4f5: 0x6c179020, 0x2c4f6: 0x6c179220, 0x2c4f7: 0x6c179420, + 0x2c4f8: 0x6c179620, 0x2c4f9: 0x6c179820, 0x2c4fa: 0x6c179a20, 0x2c4fb: 0x6c179c20, + 0x2c4fc: 0x6c2a7e20, 0x2c4fd: 0x6c2a8020, 0x2c4fe: 0x6c2a8220, 0x2c4ff: 0x6c2a8420, + // Block 0xb14, offset 0x2c500 + 0x2c500: 0x6c2a8620, 0x2c501: 0x6c44a420, 0x2c502: 0x6c44a620, 0x2c503: 0x6c44a820, + 0x2c504: 0x6c65c820, 0x2c505: 0x6c65ca20, 0x2c506: 0x6c65cc20, 0x2c507: 0x6c65ce20, + 0x2c508: 0x6c65d020, 0x2c509: 0x6c65d220, 0x2c50a: 0x6c65d420, 0x2c50b: 0x6c65d620, + 0x2c50c: 0x6c65d820, 0x2c50d: 0x6c65da20, 0x2c50e: 0x6c65dc20, 0x2c50f: 0x6c8c9820, + 0x2c510: 0x6c8c9a20, 0x2c511: 0x6c8c9c20, 0x2c512: 0x6cb91020, 0x2c513: 0x6cb91220, + 0x2c514: 0x6cb91420, 0x2c515: 0x6cb91620, 0x2c516: 0x6cb91820, 0x2c517: 0x6cea1420, + 0x2c518: 0x6d19ec20, 0x2c519: 0x6d487820, 0x2c51a: 0x6d487a20, 0x2c51b: 0x6d487c20, + 0x2c51c: 0x6d487e20, 0x2c51d: 0x6d768e20, 0x2c51e: 0x6d769020, 0x2c51f: 0x6da01a20, + 0x2c520: 0x6c009420, 0x2c521: 0x6c015220, 0x2c522: 0x6c015420, 0x2c523: 0x6c015620, + 0x2c524: 0x6c030a20, 0x2c525: 0x6c065a20, 0x2c526: 0x6c065c20, 0x2c527: 0x6c065e20, + 0x2c528: 0x6c0cba20, 0x2c529: 0x6c0cbc20, 0x2c52a: 0x6c0cbe20, 0x2c52b: 0x6c0cc020, + 0x2c52c: 0x6c17b820, 0x2c52d: 0x6c2a9820, 0x2c52e: 0x6c2a9a20, 0x2c52f: 0x6c2a9c20, + 0x2c530: 0x6c8cc020, 0x2c531: 0x6cb93020, 0x2c532: 0x6cb93220, 0x2c533: 0x6d19fe20, + 0x2c534: 0x6d1a0020, 0x2c535: 0x6c009a20, 0x2c536: 0x6c031c20, 0x2c537: 0x6c066820, + 0x2c538: 0x6c066a20, 0x2c539: 0x6c066c20, 0x2c53a: 0x6c066e20, 0x2c53b: 0x6c067020, + 0x2c53c: 0x6c0cd420, 0x2c53d: 0x6c2ab220, 0x2c53e: 0x6c44d820, 0x2c53f: 0x6cb94020, + // Block 0xb15, offset 0x2c540 + 0x2c540: 0x6c00a020, 0x2c541: 0x6c00a220, 0x2c542: 0x6c00a420, 0x2c543: 0x6c015a20, + 0x2c544: 0x6c015c20, 0x2c545: 0x6c032420, 0x2c546: 0x6c032620, 0x2c547: 0x6c032820, + 0x2c548: 0x6c032a20, 0x2c549: 0x6c068220, 0x2c54a: 0x6c068420, 0x2c54b: 0x6c068620, + 0x2c54c: 0x6c068820, 0x2c54d: 0x6c068a20, 0x2c54e: 0x6c0cea20, 0x2c54f: 0x6c0cec20, + 0x2c550: 0x6c0cee20, 0x2c551: 0x6c0cf020, 0x2c552: 0x6c0cf220, 0x2c553: 0x6c0cf420, + 0x2c554: 0x6c0cf620, 0x2c555: 0x6c0cf820, 0x2c556: 0x6c0cfa20, 0x2c557: 0x6c0cfc20, + 0x2c558: 0x6c0cfe20, 0x2c559: 0x6c0d0020, 0x2c55a: 0x6c0d0220, 0x2c55b: 0x6c0d0420, + 0x2c55c: 0x6c17de20, 0x2c55d: 0x6c17e020, 0x2c55e: 0x6c17e220, 0x2c55f: 0x6c17e420, + 0x2c560: 0x6c17e620, 0x2c561: 0x6c17e820, 0x2c562: 0x6c17ea20, 0x2c563: 0x6c17ec20, + 0x2c564: 0x6c17ee20, 0x2c565: 0x6c17f020, 0x2c566: 0x6c17f220, 0x2c567: 0x6c17f420, + 0x2c568: 0x6c17f620, 0x2c569: 0x6c17f820, 0x2c56a: 0x6c17fa20, 0x2c56b: 0x6c17fc20, + 0x2c56c: 0x6c17fe20, 0x2c56d: 0x6c180020, 0x2c56e: 0x6c2ac820, 0x2c56f: 0x6c2aca20, + 0x2c570: 0x6c2acc20, 0x2c571: 0x6c2ace20, 0x2c572: 0x6c2ad020, 0x2c573: 0x6c2ad220, + 0x2c574: 0x6c2ad420, 0x2c575: 0x6c2ad620, 0x2c576: 0x6c2ad820, 0x2c577: 0x6c2ada20, + 0x2c578: 0x6c2adc20, 0x2c579: 0x6c2ade20, 0x2c57a: 0x6c2ae020, 0x2c57b: 0x6c2ae220, + 0x2c57c: 0x6c2ae420, 0x2c57d: 0x6c2ae620, 0x2c57e: 0x6c2ae820, 0x2c57f: 0x6c2aea20, + // Block 0xb16, offset 0x2c580 + 0x2c580: 0x6c2aec20, 0x2c581: 0x6c2aee20, 0x2c582: 0x6c2af020, 0x2c583: 0x6c44ea20, + 0x2c584: 0x6c44ec20, 0x2c585: 0x6c44ee20, 0x2c586: 0x6c2b4a20, 0x2c587: 0x6c44f020, + 0x2c588: 0x6c44f220, 0x2c589: 0x6c44f420, 0x2c58a: 0x6c44f620, 0x2c58b: 0x6c44f820, + 0x2c58c: 0x6c44fa20, 0x2c58d: 0x6c44fc20, 0x2c58e: 0x6c44fe20, 0x2c58f: 0x6c450020, + 0x2c590: 0x6c450220, 0x2c591: 0x6c450420, 0x2c592: 0x6c661c20, 0x2c593: 0x6c661e20, + 0x2c594: 0x6c662020, 0x2c595: 0x6c662220, 0x2c596: 0x6c662420, 0x2c597: 0x6c662620, + 0x2c598: 0x6c662820, 0x2c599: 0x6c662a20, 0x2c59a: 0x6c662c20, 0x2c59b: 0x6c662e20, + 0x2c59c: 0x6c663020, 0x2c59d: 0x6c663220, 0x2c59e: 0x6c663420, 0x2c59f: 0x6c663620, + 0x2c5a0: 0x6c663820, 0x2c5a1: 0x6c663a20, 0x2c5a2: 0x6c663c20, 0x2c5a3: 0x6c663e20, + 0x2c5a4: 0x6c664020, 0x2c5a5: 0x6c664220, 0x2c5a6: 0x6c664420, 0x2c5a7: 0x6c664620, + 0x2c5a8: 0x6c8ce420, 0x2c5a9: 0x6cb95020, 0x2c5aa: 0x6c8ce620, 0x2c5ab: 0x6c8ce820, + 0x2c5ac: 0x6c8cea20, 0x2c5ad: 0x6c8cec20, 0x2c5ae: 0x6c8cee20, 0x2c5af: 0x6c8cf020, + 0x2c5b0: 0x6c8cf220, 0x2c5b1: 0x6c8cf420, 0x2c5b2: 0x6cb95220, 0x2c5b3: 0x6cb95420, + 0x2c5b4: 0x6cb95620, 0x2c5b5: 0x6cb95820, 0x2c5b6: 0x6c8cf620, 0x2c5b7: 0x6cea4020, + 0x2c5b8: 0x6cea4220, 0x2c5b9: 0x6cea4420, 0x2c5ba: 0x6cea4620, 0x2c5bb: 0x6cea4820, + 0x2c5bc: 0x6cea4a20, 0x2c5bd: 0x6cea4c20, 0x2c5be: 0x6cea4e20, 0x2c5bf: 0x6cea5020, + // Block 0xb17, offset 0x2c5c0 + 0x2c5c0: 0x6d1a2620, 0x2c5c1: 0x6d1a2820, 0x2c5c2: 0x6d1a2a20, 0x2c5c3: 0x6d1a2c20, + 0x2c5c4: 0x6d1a2e20, 0x2c5c5: 0x6d489820, 0x2c5c6: 0x6d489a20, 0x2c5c7: 0x6d489c20, + 0x2c5c8: 0x6d489e20, 0x2c5c9: 0x6d48a020, 0x2c5ca: 0x6d48a220, 0x2c5cb: 0x6d48a420, + 0x2c5cc: 0x6d48a620, 0x2c5cd: 0x6d48a820, 0x2c5ce: 0x6d48aa20, 0x2c5cf: 0x6d48ac20, + 0x2c5d0: 0x6d76aa20, 0x2c5d1: 0x6d76ac20, 0x2c5d2: 0x6d76ae20, 0x2c5d3: 0x6d76b020, + 0x2c5d4: 0x6d76b220, 0x2c5d5: 0x6da03420, 0x2c5d6: 0x6de05820, 0x2c5d7: 0x6e0c7220, + 0x2c5d8: 0x6e0c7420, 0x2c5d9: 0x6e286020, 0x2c5da: 0x6e286220, 0x2c5db: 0x6c00a820, + 0x2c5dc: 0x6c016020, 0x2c5dd: 0x6c033c20, 0x2c5de: 0x6c033e20, 0x2c5df: 0x6c06a420, + 0x2c5e0: 0x6c06a620, 0x2c5e1: 0x6c06a820, 0x2c5e2: 0x6c06aa20, 0x2c5e3: 0x6c0d4020, + 0x2c5e4: 0x6c0d4220, 0x2c5e5: 0x6c0d4420, 0x2c5e6: 0x6c0d4620, 0x2c5e7: 0x6c0d4820, + 0x2c5e8: 0x6c0d4a20, 0x2c5e9: 0x6c183c20, 0x2c5ea: 0x6c183e20, 0x2c5eb: 0x6c184020, + 0x2c5ec: 0x6c184220, 0x2c5ed: 0x6c184420, 0x2c5ee: 0x6c184620, 0x2c5ef: 0x6c184820, + 0x2c5f0: 0x6c184a20, 0x2c5f1: 0x6c184c20, 0x2c5f2: 0x6c184e20, 0x2c5f3: 0x6c185020, + 0x2c5f4: 0x6c185220, 0x2c5f5: 0x6c2b5220, 0x2c5f6: 0x6c2b5420, 0x2c5f7: 0x6c2b5620, + 0x2c5f8: 0x6c2b5820, 0x2c5f9: 0x6c2b5a20, 0x2c5fa: 0x6c2b5c20, 0x2c5fb: 0x6c2b5e20, + 0x2c5fc: 0x6c2b6020, 0x2c5fd: 0x6c2b6220, 0x2c5fe: 0x6c2b6420, 0x2c5ff: 0x6c2b6620, + // Block 0xb18, offset 0x2c600 + 0x2c600: 0x6c455020, 0x2c601: 0x6c455220, 0x2c602: 0x6c455420, 0x2c603: 0x6c455620, + 0x2c604: 0x6c455820, 0x2c605: 0x6c455a20, 0x2c606: 0x6c2b8620, 0x2c607: 0x6c455c20, + 0x2c608: 0x6c455e20, 0x2c609: 0x6c456020, 0x2c60a: 0x6c456220, 0x2c60b: 0x6c456420, + 0x2c60c: 0x6c66ac20, 0x2c60d: 0x6c66ae20, 0x2c60e: 0x6c66b020, 0x2c60f: 0x6c66b220, + 0x2c610: 0x6c66b420, 0x2c611: 0x6c66b620, 0x2c612: 0x6c8d4420, 0x2c613: 0x6c8d4620, + 0x2c614: 0x6c8d4820, 0x2c615: 0x6c8d4a20, 0x2c616: 0x6c8d4c20, 0x2c617: 0x6c9b7c20, + 0x2c618: 0x6c8d4e20, 0x2c619: 0x6c8d5020, 0x2c61a: 0x6c8d5220, 0x2c61b: 0x6cb9ac20, + 0x2c61c: 0x6cb9ae20, 0x2c61d: 0x6cb9b020, 0x2c61e: 0x6cb9b220, 0x2c61f: 0x6cea9220, + 0x2c620: 0x6cea9420, 0x2c621: 0x6cea9620, 0x2c622: 0x6cea9820, 0x2c623: 0x6cea9a20, + 0x2c624: 0x6cea9c20, 0x2c625: 0x6cea9e20, 0x2c626: 0x6ceaa020, 0x2c627: 0x6ceaa220, + 0x2c628: 0x6d1a7820, 0x2c629: 0x6d1a7a20, 0x2c62a: 0x6d1a7c20, 0x2c62b: 0x6d1a7e20, + 0x2c62c: 0x6d1a8020, 0x2c62d: 0x6d1a8220, 0x2c62e: 0x6d48da20, 0x2c62f: 0x6d48dc20, + 0x2c630: 0x6d48de20, 0x2c631: 0x6d48e020, 0x2c632: 0x6d48e220, 0x2c633: 0x6d76da20, + 0x2c634: 0x6da05c20, 0x2c635: 0x6da05e20, 0x2c636: 0x6da06020, 0x2c637: 0x6de06020, + 0x2c638: 0x6de06620, 0x2c639: 0x6c00aa20, 0x2c63a: 0x6c016420, 0x2c63b: 0x6c034620, + 0x2c63c: 0x6c034820, 0x2c63d: 0x6c034a20, 0x2c63e: 0x6c034c20, 0x2c63f: 0x6c034e20, + // Block 0xb19, offset 0x2c640 + 0x2c640: 0x6c035020, 0x2c641: 0x6c035220, 0x2c642: 0x6c035420, 0x2c643: 0x6c06b420, + 0x2c644: 0x6c06b620, 0x2c645: 0x6c06b820, 0x2c646: 0x6c06ba20, 0x2c647: 0x6c06bc20, + 0x2c648: 0x6c0d5e20, 0x2c649: 0x6c187820, 0x2c64a: 0x6c2b8820, 0x2c64b: 0x6c2b8a20, + 0x2c64c: 0x6c2b8c20, 0x2c64d: 0x6c458220, 0x2c64e: 0x6c66de20, 0x2c64f: 0x6c8d6c20, + 0x2c650: 0x6c8d6e20, 0x2c651: 0x6cb9d620, 0x2c652: 0x6cb9d820, 0x2c653: 0x6c8d7e20, + 0x2c654: 0x6d48f220, 0x2c655: 0x6c00ac20, 0x2c656: 0x6c035a20, 0x2c657: 0x6c06c620, + 0x2c658: 0x6c8d8220, 0x2c659: 0x6c8d8420, 0x2c65a: 0x6c00b020, 0x2c65b: 0x6c06ca20, + 0x2c65c: 0x6c06cc20, 0x2c65d: 0x6c06ce20, 0x2c65e: 0x6c06d020, 0x2c65f: 0x6c0d6820, + 0x2c660: 0x6c0d6a20, 0x2c661: 0x6c0d6c20, 0x2c662: 0x6c0d6e20, 0x2c663: 0x6c189020, + 0x2c664: 0x6c189220, 0x2c665: 0x6c189420, 0x2c666: 0x6c2b9e20, 0x2c667: 0x6c45a020, + 0x2c668: 0x6c45a220, 0x2c669: 0x6c45a420, 0x2c66a: 0x6c66fc20, 0x2c66b: 0x6c66fe20, + 0x2c66c: 0x6c8d8820, 0x2c66d: 0x6c8d8a20, 0x2c66e: 0x6c8d8c20, 0x2c66f: 0x6cead820, + 0x2c670: 0x6d1abc20, 0x2c671: 0x6d1abe20, 0x2c672: 0x6d1ac020, 0x2c673: 0x6d48f620, + 0x2c674: 0x6d76ea20, 0x2c675: 0x6da07820, 0x2c676: 0x6de06820, 0x2c677: 0x6df8ba20, + 0x2c678: 0x6c00b420, 0x2c679: 0x6c036020, 0x2c67a: 0x6c036220, 0x2c67b: 0x6c18a620, + 0x2c67c: 0x6c2ba820, 0x2c67d: 0x6c45c020, 0x2c67e: 0x6c8d9220, 0x2c67f: 0x6c8d9420, + // Block 0xb1a, offset 0x2c680 + 0x2c680: 0x6c8d9620, 0x2c681: 0x6c00b620, 0x2c682: 0x6c016820, 0x2c683: 0x6c016a20, + 0x2c684: 0x6c00e620, 0x2c685: 0x6c036820, 0x2c686: 0x6c036a20, 0x2c687: 0x6c036c20, + 0x2c688: 0x6c036e20, 0x2c689: 0x6c06d220, 0x2c68a: 0x6c06d420, 0x2c68b: 0x6c0d8420, + 0x2c68c: 0x6c06d620, 0x2c68d: 0x6c0d8620, 0x2c68e: 0x6c0d8820, 0x2c68f: 0x6c0d8a20, + 0x2c690: 0x6c0d8c20, 0x2c691: 0x6c2bac20, 0x2c692: 0x6c2bae20, 0x2c693: 0x6c2bb020, + 0x2c694: 0x6c2bb220, 0x2c695: 0x6c2bb420, 0x2c696: 0x6c2bb620, 0x2c697: 0x6c45c820, + 0x2c698: 0x6c45ca20, 0x2c699: 0x6c8d9820, 0x2c69a: 0x6cb9f220, 0x2c69b: 0x6e0c8420, + 0x2c69c: 0x6c00ba20, 0x2c69d: 0x6c037620, 0x2c69e: 0x6c037820, 0x2c69f: 0x6c06e220, + 0x2c6a0: 0x6c06e420, 0x2c6a1: 0x6c06e620, 0x2c6a2: 0x6c06e820, 0x2c6a3: 0x6c18c020, + 0x2c6a4: 0x6c18c220, 0x2c6a5: 0x6c2bd620, 0x2c6a6: 0x6c2bd820, 0x2c6a7: 0x6c2bda20, + 0x2c6a8: 0x6c8da820, 0x2c6a9: 0x6c00bc20, 0x2c6aa: 0x6c017220, 0x2c6ab: 0x6c017420, + 0x2c6ac: 0x6c037c20, 0x2c6ad: 0x6c06ec20, 0x2c6ae: 0x6c06ee20, 0x2c6af: 0x6c06f020, + 0x2c6b0: 0x6c0db820, 0x2c6b1: 0x6c0dba20, 0x2c6b2: 0x6c18d220, 0x2c6b3: 0x6c18d420, + 0x2c6b4: 0x6c18d620, 0x2c6b5: 0x6c18d820, 0x2c6b6: 0x6c2bf420, 0x2c6b7: 0x6c2bf620, + 0x2c6b8: 0x6c2bf820, 0x2c6b9: 0x6c2bfa20, 0x2c6ba: 0x6c2bfc20, 0x2c6bb: 0x6c45e420, + 0x2c6bc: 0x6c45e620, 0x2c6bd: 0x6c45e820, 0x2c6be: 0x6c8db620, 0x2c6bf: 0x6c673020, + // Block 0xb1b, offset 0x2c6c0 + 0x2c6c0: 0x6ceaf820, 0x2c6c1: 0x6ceafa20, 0x2c6c2: 0x6c00be20, 0x2c6c3: 0x6c038620, + 0x2c6c4: 0x6c038820, 0x2c6c5: 0x6c038a20, 0x2c6c6: 0x6c038c20, 0x2c6c7: 0x6c06f420, + 0x2c6c8: 0x6c06f620, 0x2c6c9: 0x6c06f820, 0x2c6ca: 0x6c0dce20, 0x2c6cb: 0x6c0dd020, + 0x2c6cc: 0x6c0dd220, 0x2c6cd: 0x6c0dd420, 0x2c6ce: 0x6c18e220, 0x2c6cf: 0x6c18e420, + 0x2c6d0: 0x6c18e620, 0x2c6d1: 0x6c18e820, 0x2c6d2: 0x6c2c0420, 0x2c6d3: 0x6c2c0620, + 0x2c6d4: 0x6c2c0820, 0x2c6d5: 0x6c2c0a20, 0x2c6d6: 0x6c45f820, 0x2c6d7: 0x6c45fa20, + 0x2c6d8: 0x6c45fc20, 0x2c6d9: 0x6c45fe20, 0x2c6da: 0x6c460020, 0x2c6db: 0x6c460220, + 0x2c6dc: 0x6c673820, 0x2c6dd: 0x6c673a20, 0x2c6de: 0x6c673c20, 0x2c6df: 0x6c673e20, + 0x2c6e0: 0x6c8db820, 0x2c6e1: 0x6c8dba20, 0x2c6e2: 0x6c8dbc20, 0x2c6e3: 0x6c8dbe20, + 0x2c6e4: 0x6cba0c20, 0x2c6e5: 0x6cba0e20, 0x2c6e6: 0x6cba1020, 0x2c6e7: 0x6cba1220, + 0x2c6e8: 0x6cba1420, 0x2c6e9: 0x6c8dc020, 0x2c6ea: 0x6ceb0420, 0x2c6eb: 0x6ceb0620, + 0x2c6ec: 0x6d1ae020, 0x2c6ed: 0x6d1ae220, 0x2c6ee: 0x6d1ae420, 0x2c6ef: 0x6ceb2020, + 0x2c6f0: 0x6d1ae620, 0x2c6f1: 0x6d491a20, 0x2c6f2: 0x6d491c20, 0x2c6f3: 0x6da08820, + 0x2c6f4: 0x6de07020, 0x2c6f5: 0x6e451620, 0x2c6f6: 0x6c00c020, 0x2c6f7: 0x6c039220, + 0x2c6f8: 0x6c039420, 0x2c6f9: 0x6c039620, 0x2c6fa: 0x6c070a20, 0x2c6fb: 0x6c070c20, + 0x2c6fc: 0x6c070e20, 0x2c6fd: 0x6c0df220, 0x2c6fe: 0x6c0df420, 0x2c6ff: 0x6c190420, + // Block 0xb1c, offset 0x2c700 + 0x2c700: 0x6c2c2820, 0x2c701: 0x6c2c2a20, 0x2c702: 0x6c2c2c20, 0x2c703: 0x6c8de620, + 0x2c704: 0x6c8de820, 0x2c705: 0x6cba2e20, 0x2c706: 0x6d1b1420, 0x2c707: 0x6d493c20, + 0x2c708: 0x6c00c420, 0x2c709: 0x6c017e20, 0x2c70a: 0x6c03a020, 0x2c70b: 0x6c03a220, + 0x2c70c: 0x6c03a420, 0x2c70d: 0x6c03a620, 0x2c70e: 0x6c03a820, 0x2c70f: 0x6c071a20, + 0x2c710: 0x6c071c20, 0x2c711: 0x6c071e20, 0x2c712: 0x6c0e0820, 0x2c713: 0x6c190e20, + 0x2c714: 0x6c2c3c20, 0x2c715: 0x6c2c3e20, 0x2c716: 0x6c2c4020, 0x2c717: 0x6c2c4220, + 0x2c718: 0x6c2c4420, 0x2c719: 0x6c464020, 0x2c71a: 0x6c464220, 0x2c71b: 0x6c464420, + 0x2c71c: 0x6c464620, 0x2c71d: 0x6c464820, 0x2c71e: 0x6c677c20, 0x2c71f: 0x6c677e20, + 0x2c720: 0x6ceb3220, 0x2c721: 0x6d76fc20, 0x2c722: 0x6dc2f620, 0x2c723: 0x6c018020, + 0x2c724: 0x6c073620, 0x2c725: 0x6c073820, 0x2c726: 0x6c073a20, 0x2c727: 0x6c073c20, + 0x2c728: 0x6c073e20, 0x2c729: 0x6c074020, 0x2c72a: 0x6c074220, 0x2c72b: 0x6c074420, + 0x2c72c: 0x6c074620, 0x2c72d: 0x6c074820, 0x2c72e: 0x6c074a20, 0x2c72f: 0x6c074c20, + 0x2c730: 0x6c074e20, 0x2c731: 0x6c075020, 0x2c732: 0x6c075220, 0x2c733: 0x6c075420, + 0x2c734: 0x6c075620, 0x2c735: 0x6c075820, 0x2c736: 0x6c075a20, 0x2c737: 0x6c075c20, + 0x2c738: 0x6c075e20, 0x2c739: 0x6c076020, 0x2c73a: 0x6c076220, 0x2c73b: 0x6c076420, + 0x2c73c: 0x6c076620, 0x2c73d: 0x6c076820, 0x2c73e: 0x6c076a20, 0x2c73f: 0x6c0e2220, + // Block 0xb1d, offset 0x2c740 + 0x2c740: 0x6c0e2420, 0x2c741: 0x6c0e2620, 0x2c742: 0x6c0e2820, 0x2c743: 0x6c0e2a20, + 0x2c744: 0x6c0e2c20, 0x2c745: 0x6c0e2e20, 0x2c746: 0x6c0e3020, 0x2c747: 0x6c0e3220, + 0x2c748: 0x6c0e3420, 0x2c749: 0x6c0e3620, 0x2c74a: 0x6c0e3820, 0x2c74b: 0x6c0e3a20, + 0x2c74c: 0x6c0e3c20, 0x2c74d: 0x6c0e3e20, 0x2c74e: 0x6c0e4020, 0x2c74f: 0x6c0e4220, + 0x2c750: 0x6c0e4420, 0x2c751: 0x6c0e4620, 0x2c752: 0x6c0e4820, 0x2c753: 0x6c0e4a20, + 0x2c754: 0x6c0e4c20, 0x2c755: 0x6c0e4e20, 0x2c756: 0x6c0e5020, 0x2c757: 0x6c0e5220, + 0x2c758: 0x6c193e20, 0x2c759: 0x6c194020, 0x2c75a: 0x6c194220, 0x2c75b: 0x6c194420, + 0x2c75c: 0x6c194620, 0x2c75d: 0x6c194820, 0x2c75e: 0x6c194a20, 0x2c75f: 0x6c194c20, + 0x2c760: 0x6c194e20, 0x2c761: 0x6c195020, 0x2c762: 0x6c195220, 0x2c763: 0x6c195420, + 0x2c764: 0x6c195620, 0x2c765: 0x6c195820, 0x2c766: 0x6c195a20, 0x2c767: 0x6c195c20, + 0x2c768: 0x6c195e20, 0x2c769: 0x6c196020, 0x2c76a: 0x6c196220, 0x2c76b: 0x6c196420, + 0x2c76c: 0x6c196620, 0x2c76d: 0x6c196820, 0x2c76e: 0x6c196a20, 0x2c76f: 0x6c196c20, + 0x2c770: 0x6c196e20, 0x2c771: 0x6c197020, 0x2c772: 0x6c197220, 0x2c773: 0x6c197420, + 0x2c774: 0x6c197620, 0x2c775: 0x6c197820, 0x2c776: 0x6c197a20, 0x2c777: 0x6c197c20, + 0x2c778: 0x6c197e20, 0x2c779: 0x6c198020, 0x2c77a: 0x6c198220, 0x2c77b: 0x6c198420, + 0x2c77c: 0x6c198620, 0x2c77d: 0x6c198820, 0x2c77e: 0x6c198a20, 0x2c77f: 0x6c198c20, + // Block 0xb1e, offset 0x2c780 + 0x2c780: 0x6c198e20, 0x2c781: 0x6c199020, 0x2c782: 0x6c199220, 0x2c783: 0x6c199420, + 0x2c784: 0x6c199620, 0x2c785: 0x6c199820, 0x2c786: 0x6c199a20, 0x2c787: 0x6c199c20, + 0x2c788: 0x6c199e20, 0x2c789: 0x6c19a020, 0x2c78a: 0x6c19a220, 0x2c78b: 0x6c19a420, + 0x2c78c: 0x6c19a620, 0x2c78d: 0x6c19a820, 0x2c78e: 0x6c19aa20, 0x2c78f: 0x6c19ac20, + 0x2c790: 0x6c19ae20, 0x2c791: 0x6c19b020, 0x2c792: 0x6c19b220, 0x2c793: 0x6c19b420, + 0x2c794: 0x6c19b620, 0x2c795: 0x6c19b820, 0x2c796: 0x6c19ba20, 0x2c797: 0x6c19bc20, + 0x2c798: 0x6c19be20, 0x2c799: 0x6c19c020, 0x2c79a: 0x6c19c220, 0x2c79b: 0x6c19c420, + 0x2c79c: 0x6c19c620, 0x2c79d: 0x6c2c6820, 0x2c79e: 0x6c2c6a20, 0x2c79f: 0x6c2c6c20, + 0x2c7a0: 0x6c2c6e20, 0x2c7a1: 0x6c2c7020, 0x2c7a2: 0x6c2c7220, 0x2c7a3: 0x6c2c7420, + 0x2c7a4: 0x6c2c7620, 0x2c7a5: 0x6c2c7820, 0x2c7a6: 0x6c2c7a20, 0x2c7a7: 0x6c2c7c20, + 0x2c7a8: 0x6c2c7e20, 0x2c7a9: 0x6c2c8020, 0x2c7aa: 0x6c2c8220, 0x2c7ab: 0x6c2c8420, + 0x2c7ac: 0x6c2c8620, 0x2c7ad: 0x6c2c8820, 0x2c7ae: 0x6c2c8a20, 0x2c7af: 0x6c2c8c20, + 0x2c7b0: 0x6c466420, 0x2c7b1: 0x6c2c8e20, 0x2c7b2: 0x6c466620, 0x2c7b3: 0x6c2c9020, + 0x2c7b4: 0x6c2c9220, 0x2c7b5: 0x6c2c9420, 0x2c7b6: 0x6c2c9620, 0x2c7b7: 0x6c2c9820, + 0x2c7b8: 0x6c2c9a20, 0x2c7b9: 0x6c2c9c20, 0x2c7ba: 0x6c2c9e20, 0x2c7bb: 0x6c2ca020, + 0x2c7bc: 0x6c2ca220, 0x2c7bd: 0x6c2ca420, 0x2c7be: 0x6c2ca620, 0x2c7bf: 0x6c2ca820, + // Block 0xb1f, offset 0x2c7c0 + 0x2c7c0: 0x6c2caa20, 0x2c7c1: 0x6c2cac20, 0x2c7c2: 0x6c2cae20, 0x2c7c3: 0x6c2cb020, + 0x2c7c4: 0x6c2cb220, 0x2c7c5: 0x6c2cb420, 0x2c7c6: 0x6c2cb620, 0x2c7c7: 0x6c2cb820, + 0x2c7c8: 0x6c2cba20, 0x2c7c9: 0x6c2cbc20, 0x2c7ca: 0x6c2cbe20, 0x2c7cb: 0x6c2cc020, + 0x2c7cc: 0x6c2cc220, 0x2c7cd: 0x6c2cc420, 0x2c7ce: 0x6c2cc620, 0x2c7cf: 0x6c2cc820, + 0x2c7d0: 0x6c2cca20, 0x2c7d1: 0x6c2ccc20, 0x2c7d2: 0x6c2cce20, 0x2c7d3: 0x6c2cd020, + 0x2c7d4: 0x6c2cd220, 0x2c7d5: 0x6c2cd420, 0x2c7d6: 0x6c2cd620, 0x2c7d7: 0x6c2cd820, + 0x2c7d8: 0x6c2cda20, 0x2c7d9: 0x6c2cdc20, 0x2c7da: 0x6c2cde20, 0x2c7db: 0x6c2ce020, + 0x2c7dc: 0x6c2ce220, 0x2c7dd: 0x6c2ce420, 0x2c7de: 0x6c468620, 0x2c7df: 0x6c468820, + 0x2c7e0: 0x6c468a20, 0x2c7e1: 0x6c468c20, 0x2c7e2: 0x6c468e20, 0x2c7e3: 0x6c469020, + 0x2c7e4: 0x6c469220, 0x2c7e5: 0x6c469420, 0x2c7e6: 0x6c469620, 0x2c7e7: 0x6c469820, + 0x2c7e8: 0x6c469a20, 0x2c7e9: 0x6c469c20, 0x2c7ea: 0x6c469e20, 0x2c7eb: 0x6c46a020, + 0x2c7ec: 0x6c46a220, 0x2c7ed: 0x6c46a420, 0x2c7ee: 0x6c46a620, 0x2c7ef: 0x6c46a820, + 0x2c7f0: 0x6c46aa20, 0x2c7f1: 0x6c46ac20, 0x2c7f2: 0x6c46ae20, 0x2c7f3: 0x6c46b020, + 0x2c7f4: 0x6c46b220, 0x2c7f5: 0x6c46b420, 0x2c7f6: 0x6c46b620, 0x2c7f7: 0x6c46b820, + 0x2c7f8: 0x6c46ba20, 0x2c7f9: 0x6c46bc20, 0x2c7fa: 0x6c46be20, 0x2c7fb: 0x6c46c020, + 0x2c7fc: 0x6c46c220, 0x2c7fd: 0x6c46c420, 0x2c7fe: 0x6c46c620, 0x2c7ff: 0x6c46c820, + // Block 0xb20, offset 0x2c800 + 0x2c800: 0x6c46ca20, 0x2c801: 0x6c46cc20, 0x2c802: 0x6c46ce20, 0x2c803: 0x6c46d020, + 0x2c804: 0x6c46d220, 0x2c805: 0x6c46d420, 0x2c806: 0x6c46d620, 0x2c807: 0x6c46d820, + 0x2c808: 0x6c46da20, 0x2c809: 0x6c46dc20, 0x2c80a: 0x6c46de20, 0x2c80b: 0x6c46e020, + 0x2c80c: 0x6c46e220, 0x2c80d: 0x6c46e420, 0x2c80e: 0x6c46e620, 0x2c80f: 0x6c46e820, + 0x2c810: 0x6c46ea20, 0x2c811: 0x6c46ec20, 0x2c812: 0x6c46ee20, 0x2c813: 0x6c46f020, + 0x2c814: 0x6c46f220, 0x2c815: 0x6c46f420, 0x2c816: 0x6c46f620, 0x2c817: 0x6c46f820, + 0x2c818: 0x6c46fa20, 0x2c819: 0x6c46fc20, 0x2c81a: 0x6c46fe20, 0x2c81b: 0x6c470020, + 0x2c81c: 0x6c470220, 0x2c81d: 0x6c470420, 0x2c81e: 0x6c470620, 0x2c81f: 0x6c470820, + 0x2c820: 0x6c67ba20, 0x2c821: 0x6c67bc20, 0x2c822: 0x6c67be20, 0x2c823: 0x6c67c020, + 0x2c824: 0x6c67c220, 0x2c825: 0x6c67c420, 0x2c826: 0x6c67c620, 0x2c827: 0x6c67c820, + 0x2c828: 0x6c67ca20, 0x2c829: 0x6c67cc20, 0x2c82a: 0x6c67ce20, 0x2c82b: 0x6c67d020, + 0x2c82c: 0x6c67d220, 0x2c82d: 0x6c67d420, 0x2c82e: 0x6c67d620, 0x2c82f: 0x6c67d820, + 0x2c830: 0x6c67da20, 0x2c831: 0x6c67dc20, 0x2c832: 0x6c67de20, 0x2c833: 0x6c67e020, + 0x2c834: 0x6c67e220, 0x2c835: 0x6c67e420, 0x2c836: 0x6c67e620, 0x2c837: 0x6c67e820, + 0x2c838: 0x6c67ea20, 0x2c839: 0x6c67ec20, 0x2c83a: 0x6c67ee20, 0x2c83b: 0x6c67f020, + 0x2c83c: 0x6c67f220, 0x2c83d: 0x6c67f420, 0x2c83e: 0x6c67f620, 0x2c83f: 0x6c67f820, + // Block 0xb21, offset 0x2c840 + 0x2c840: 0x6c67fa20, 0x2c841: 0x6c67fc20, 0x2c842: 0x6c67fe20, 0x2c843: 0x6c680020, + 0x2c844: 0x6c680220, 0x2c845: 0x6c680420, 0x2c846: 0x6c680620, 0x2c847: 0x6c680820, + 0x2c848: 0x6c680a20, 0x2c849: 0x6c680c20, 0x2c84a: 0x6c680e20, 0x2c84b: 0x6c681020, + 0x2c84c: 0x6c8e1020, 0x2c84d: 0x6c681220, 0x2c84e: 0x6c681420, 0x2c84f: 0x6c681620, + 0x2c850: 0x6c681820, 0x2c851: 0x6c681a20, 0x2c852: 0x6c681c20, 0x2c853: 0x6c681e20, + 0x2c854: 0x6c682020, 0x2c855: 0x6c682220, 0x2c856: 0x6c682420, 0x2c857: 0x6c682620, + 0x2c858: 0x6c682820, 0x2c859: 0x6c682a20, 0x2c85a: 0x6c682c20, 0x2c85b: 0x6c682e20, + 0x2c85c: 0x6c683020, 0x2c85d: 0x6c683220, 0x2c85e: 0x6c683420, 0x2c85f: 0x6c683620, + 0x2c860: 0x6c683820, 0x2c861: 0x6c683a20, 0x2c862: 0x6c683c20, 0x2c863: 0x6c683e20, + 0x2c864: 0x6c684020, 0x2c865: 0x6c684220, 0x2c866: 0x6c684420, 0x2c867: 0x6c684620, + 0x2c868: 0x6c8e4020, 0x2c869: 0x6c8e4220, 0x2c86a: 0x6c8e4420, 0x2c86b: 0x6c8e4620, + 0x2c86c: 0x6c8e4820, 0x2c86d: 0x6c8e4a20, 0x2c86e: 0x6c8e4c20, 0x2c86f: 0x6c8e4e20, + 0x2c870: 0x6c8e5020, 0x2c871: 0x6c8e5220, 0x2c872: 0x6c8e5420, 0x2c873: 0x6c8e5620, + 0x2c874: 0x6c8e5820, 0x2c875: 0x6c8e5a20, 0x2c876: 0x6c8e5c20, 0x2c877: 0x6c8e5e20, + 0x2c878: 0x6c8e6020, 0x2c879: 0x6c8e6220, 0x2c87a: 0x6c8e6420, 0x2c87b: 0x6c8e6620, + 0x2c87c: 0x6c8e6820, 0x2c87d: 0x6c8e6a20, 0x2c87e: 0x6c8e6c20, 0x2c87f: 0x6c8e6e20, + // Block 0xb22, offset 0x2c880 + 0x2c880: 0x6c8e7020, 0x2c881: 0x6c8e7220, 0x2c882: 0x6c8e7420, 0x2c883: 0x6c8e7620, + 0x2c884: 0x6c8e7820, 0x2c885: 0x6c8e7a20, 0x2c886: 0x6c8e7c20, 0x2c887: 0x6c8e7e20, + 0x2c888: 0x6c8e8020, 0x2c889: 0x6c8e8220, 0x2c88a: 0x6c8e8420, 0x2c88b: 0x6c8e8620, + 0x2c88c: 0x6c8e8820, 0x2c88d: 0x6c8e8a20, 0x2c88e: 0x6c8e8c20, 0x2c88f: 0x6c8e8e20, + 0x2c890: 0x6c8e9020, 0x2c891: 0x6c8e9220, 0x2c892: 0x6c8e9420, 0x2c893: 0x6c8e9620, + 0x2c894: 0x6c8e9820, 0x2c895: 0x6c8e9a20, 0x2c896: 0x6c8e9c20, 0x2c897: 0x6c8e9e20, + 0x2c898: 0x6c8ea020, 0x2c899: 0x6cba9420, 0x2c89a: 0x6c8ea220, 0x2c89b: 0x6c8ea420, + 0x2c89c: 0x6c8ea620, 0x2c89d: 0x6c8ea820, 0x2c89e: 0x6c8eaa20, 0x2c89f: 0x6c9aaa20, + 0x2c8a0: 0x6c8eac20, 0x2c8a1: 0x6c8eae20, 0x2c8a2: 0x6c8eb020, 0x2c8a3: 0x6c8eb220, + 0x2c8a4: 0x6c8eb420, 0x2c8a5: 0x6c8eb620, 0x2c8a6: 0x6c8eb820, 0x2c8a7: 0x6c8eba20, + 0x2c8a8: 0x6c8ebc20, 0x2c8a9: 0x6c8ebe20, 0x2c8aa: 0x6c8ec020, 0x2c8ab: 0x6c901820, + 0x2c8ac: 0x6c8ec220, 0x2c8ad: 0x6c8ec420, 0x2c8ae: 0x6c8ec620, 0x2c8af: 0x6c8ec820, + 0x2c8b0: 0x6c8eca20, 0x2c8b1: 0x6c8ecc20, 0x2c8b2: 0x6c8ece20, 0x2c8b3: 0x6c8ed020, + 0x2c8b4: 0x6c8ed220, 0x2c8b5: 0x6c8ed420, 0x2c8b6: 0x6c8ed620, 0x2c8b7: 0x6c8ed820, + 0x2c8b8: 0x6c8eda20, 0x2c8b9: 0x6c8edc20, 0x2c8ba: 0x6cba9620, 0x2c8bb: 0x6cba9820, + 0x2c8bc: 0x6cba9a20, 0x2c8bd: 0x6cba9c20, 0x2c8be: 0x6cba9e20, 0x2c8bf: 0x6cbaa020, + // Block 0xb23, offset 0x2c8c0 + 0x2c8c0: 0x6cbaa220, 0x2c8c1: 0x6cbaa420, 0x2c8c2: 0x6cbaa620, 0x2c8c3: 0x6cbaa820, + 0x2c8c4: 0x6cbaaa20, 0x2c8c5: 0x6cbaac20, 0x2c8c6: 0x6cbaae20, 0x2c8c7: 0x6cbab020, + 0x2c8c8: 0x6cbab220, 0x2c8c9: 0x6cbab420, 0x2c8ca: 0x6cbab620, 0x2c8cb: 0x6cbab820, + 0x2c8cc: 0x6cbaba20, 0x2c8cd: 0x6ceb6e20, 0x2c8ce: 0x6cbabc20, 0x2c8cf: 0x6cbabe20, + 0x2c8d0: 0x6cbac020, 0x2c8d1: 0x6cbac220, 0x2c8d2: 0x6cbac420, 0x2c8d3: 0x6cbac620, + 0x2c8d4: 0x6cbac820, 0x2c8d5: 0x6cbaca20, 0x2c8d6: 0x6cbacc20, 0x2c8d7: 0x6cbace20, + 0x2c8d8: 0x6cbad020, 0x2c8d9: 0x6cbad220, 0x2c8da: 0x6cbad420, 0x2c8db: 0x6cbad620, + 0x2c8dc: 0x6cbad820, 0x2c8dd: 0x6cbada20, 0x2c8de: 0x6cbadc20, 0x2c8df: 0x6cbade20, + 0x2c8e0: 0x6cbae020, 0x2c8e1: 0x6cbae220, 0x2c8e2: 0x6cbae420, 0x2c8e3: 0x6cbae620, + 0x2c8e4: 0x6cbae820, 0x2c8e5: 0x6cbaea20, 0x2c8e6: 0x6cbaec20, 0x2c8e7: 0x6cbaee20, + 0x2c8e8: 0x6cbaf020, 0x2c8e9: 0x6cbaf220, 0x2c8ea: 0x6cbaf420, 0x2c8eb: 0x6cbaf620, + 0x2c8ec: 0x6cbaf820, 0x2c8ed: 0x6cbafa20, 0x2c8ee: 0x6cbafc20, 0x2c8ef: 0x6cbafe20, + 0x2c8f0: 0x6cbb0020, 0x2c8f1: 0x6cbb0220, 0x2c8f2: 0x6cbb0420, 0x2c8f3: 0x6cbb0620, + 0x2c8f4: 0x6cbb0820, 0x2c8f5: 0x6cbb0a20, 0x2c8f6: 0x6c901a20, 0x2c8f7: 0x6cbb0c20, + 0x2c8f8: 0x6cbb0e20, 0x2c8f9: 0x6cbb1020, 0x2c8fa: 0x6cbb1220, 0x2c8fb: 0x6cbb1420, + 0x2c8fc: 0x6cbb1620, 0x2c8fd: 0x6cbb1820, 0x2c8fe: 0x6cbb1a20, 0x2c8ff: 0x6ceb7020, + // Block 0xb24, offset 0x2c900 + 0x2c900: 0x6ceb7220, 0x2c901: 0x6ceb7420, 0x2c902: 0x6ceb7620, 0x2c903: 0x6ceb7820, + 0x2c904: 0x6ceb7a20, 0x2c905: 0x6ceb7c20, 0x2c906: 0x6ceb7e20, 0x2c907: 0x6ceb8020, + 0x2c908: 0x6ceb8220, 0x2c909: 0x6ceb8420, 0x2c90a: 0x6ceb8620, 0x2c90b: 0x6ceb8820, + 0x2c90c: 0x6ceb8a20, 0x2c90d: 0x6ceb8c20, 0x2c90e: 0x6ceb8e20, 0x2c90f: 0x6ceb9020, + 0x2c910: 0x6ceb9220, 0x2c911: 0x6ceb9420, 0x2c912: 0x6ceb9620, 0x2c913: 0x6ceb9820, + 0x2c914: 0x6ceb9a20, 0x2c915: 0x6ceb9c20, 0x2c916: 0x6ceb9e20, 0x2c917: 0x6ceba020, + 0x2c918: 0x6ceba220, 0x2c919: 0x6ceba420, 0x2c91a: 0x6ceba620, 0x2c91b: 0x6ceba820, + 0x2c91c: 0x6cebaa20, 0x2c91d: 0x6cebac20, 0x2c91e: 0x6cbc3e20, 0x2c91f: 0x6cebae20, + 0x2c920: 0x6cebb020, 0x2c921: 0x6cebb220, 0x2c922: 0x6cebb420, 0x2c923: 0x6cebb620, + 0x2c924: 0x6cebb820, 0x2c925: 0x6cebba20, 0x2c926: 0x6cebbc20, 0x2c927: 0x6cebbe20, + 0x2c928: 0x6cebc020, 0x2c929: 0x6cebc220, 0x2c92a: 0x6cebc420, 0x2c92b: 0x6cebc620, + 0x2c92c: 0x6cebc820, 0x2c92d: 0x6cebca20, 0x2c92e: 0x6cebcc20, 0x2c92f: 0x6cebce20, + 0x2c930: 0x6cebd020, 0x2c931: 0x6cebd220, 0x2c932: 0x6cebd420, 0x2c933: 0x6cebd620, + 0x2c934: 0x6cebd820, 0x2c935: 0x6cebda20, 0x2c936: 0x6d1b5220, 0x2c937: 0x6d1b5420, + 0x2c938: 0x6d1b5620, 0x2c939: 0x6d1b5820, 0x2c93a: 0x6d1b5a20, 0x2c93b: 0x6d1b5c20, + 0x2c93c: 0x6d1b5e20, 0x2c93d: 0x6d1b6020, 0x2c93e: 0x6d1b6220, 0x2c93f: 0x6d1b6420, + // Block 0xb25, offset 0x2c940 + 0x2c940: 0x6d1b6620, 0x2c941: 0x6d1b6820, 0x2c942: 0x6d1b6a20, 0x2c943: 0x6d1b6c20, + 0x2c944: 0x6d1b6e20, 0x2c945: 0x6d1b7020, 0x2c946: 0x6d1b7220, 0x2c947: 0x6d1b7420, + 0x2c948: 0x6d1b7620, 0x2c949: 0x6d1b7820, 0x2c94a: 0x6d1b7a20, 0x2c94b: 0x6d1b7c20, + 0x2c94c: 0x6d1b7e20, 0x2c94d: 0x6d1b8020, 0x2c94e: 0x6d1b8220, 0x2c94f: 0x6d1b8420, + 0x2c950: 0x6d1b8620, 0x2c951: 0x6d1b8820, 0x2c952: 0x6d1b8a20, 0x2c953: 0x6d1b8c20, + 0x2c954: 0x6d1b8e20, 0x2c955: 0x6d1b9020, 0x2c956: 0x6d1b9220, 0x2c957: 0x6d1b9420, + 0x2c958: 0x6d1b9620, 0x2c959: 0x6d1b9820, 0x2c95a: 0x6d1b9a20, 0x2c95b: 0x6d1b9c20, + 0x2c95c: 0x6d1b9e20, 0x2c95d: 0x6d1ba020, 0x2c95e: 0x6d1ba220, 0x2c95f: 0x6d1cec20, + 0x2c960: 0x6d496220, 0x2c961: 0x6d1ba420, 0x2c962: 0x6d1ba620, 0x2c963: 0x6d1ba820, + 0x2c964: 0x6d1baa20, 0x2c965: 0x6d1bac20, 0x2c966: 0x6d1bae20, 0x2c967: 0x6d1bb020, + 0x2c968: 0x6d1cee20, 0x2c969: 0x6d496420, 0x2c96a: 0x6d496620, 0x2c96b: 0x6d496820, + 0x2c96c: 0x6d496a20, 0x2c96d: 0x6d496c20, 0x2c96e: 0x6d496e20, 0x2c96f: 0x6d497020, + 0x2c970: 0x6d497220, 0x2c971: 0x6d497420, 0x2c972: 0x6d497620, 0x2c973: 0x6d497820, + 0x2c974: 0x6d497a20, 0x2c975: 0x6d497c20, 0x2c976: 0x6d497e20, 0x2c977: 0x6d498020, + 0x2c978: 0x6d498220, 0x2c979: 0x6d498420, 0x2c97a: 0x6d498620, 0x2c97b: 0x6d498820, + 0x2c97c: 0x6d498a20, 0x2c97d: 0x6d498c20, 0x2c97e: 0x6d498e20, 0x2c97f: 0x6d499020, + // Block 0xb26, offset 0x2c980 + 0x2c980: 0x6d499220, 0x2c981: 0x6d499420, 0x2c982: 0x6d499620, 0x2c983: 0x6d499820, + 0x2c984: 0x6d499a20, 0x2c985: 0x6cbb1c20, 0x2c986: 0x6d499c20, 0x2c987: 0x6d499e20, + 0x2c988: 0x6d49a020, 0x2c989: 0x6d49a220, 0x2c98a: 0x6d49a420, 0x2c98b: 0x6d49a620, + 0x2c98c: 0x6d49a820, 0x2c98d: 0x6d49aa20, 0x2c98e: 0x6d49ac20, 0x2c98f: 0x6d49ae20, + 0x2c990: 0x6d49b020, 0x2c991: 0x6d1bb220, 0x2c992: 0x6d49b220, 0x2c993: 0x6d494c20, + 0x2c994: 0x6d49b420, 0x2c995: 0x6d590220, 0x2c996: 0x6d49b620, 0x2c997: 0x6d49b820, + 0x2c998: 0x6d49ba20, 0x2c999: 0x6d49bc20, 0x2c99a: 0x6d49be20, 0x2c99b: 0x6d49c020, + 0x2c99c: 0x6d49c220, 0x2c99d: 0x6d49c420, 0x2c99e: 0x6d772220, 0x2c99f: 0x6d772420, + 0x2c9a0: 0x6d772620, 0x2c9a1: 0x6d772820, 0x2c9a2: 0x6d772a20, 0x2c9a3: 0x6d772c20, + 0x2c9a4: 0x6d772e20, 0x2c9a5: 0x6d773020, 0x2c9a6: 0x6d773220, 0x2c9a7: 0x6d773420, + 0x2c9a8: 0x6d773620, 0x2c9a9: 0x6d773820, 0x2c9aa: 0x6d773a20, 0x2c9ab: 0x6d773c20, + 0x2c9ac: 0x6d773e20, 0x2c9ad: 0x6d774020, 0x2c9ae: 0x6d774220, 0x2c9af: 0x6d774420, + 0x2c9b0: 0x6d774620, 0x2c9b1: 0x6d774820, 0x2c9b2: 0x6d774a20, 0x2c9b3: 0x6d774c20, + 0x2c9b4: 0x6d49c620, 0x2c9b5: 0x6d774e20, 0x2c9b6: 0x6d775020, 0x2c9b7: 0x6d775220, + 0x2c9b8: 0x6d775420, 0x2c9b9: 0x6d775620, 0x2c9ba: 0x6d775820, 0x2c9bb: 0x6d775a20, + 0x2c9bc: 0x6d775c20, 0x2c9bd: 0x6da0a220, 0x2c9be: 0x6da0a420, 0x2c9bf: 0x6da0a620, + // Block 0xb27, offset 0x2c9c0 + 0x2c9c0: 0x6da0a820, 0x2c9c1: 0x6da0aa20, 0x2c9c2: 0x6da0ac20, 0x2c9c3: 0x6da0ae20, + 0x2c9c4: 0x6da0b020, 0x2c9c5: 0x6da0b220, 0x2c9c6: 0x6da0b420, 0x2c9c7: 0x6da0b620, + 0x2c9c8: 0x6da0b820, 0x2c9c9: 0x6da0ba20, 0x2c9ca: 0x6da0bc20, 0x2c9cb: 0x6da0be20, + 0x2c9cc: 0x6da0c020, 0x2c9cd: 0x6da0c220, 0x2c9ce: 0x6da0c420, 0x2c9cf: 0x6da0c620, + 0x2c9d0: 0x6da0c820, 0x2c9d1: 0x6da0ca20, 0x2c9d2: 0x6da0cc20, 0x2c9d3: 0x6da0ce20, + 0x2c9d4: 0x6dc30820, 0x2c9d5: 0x6dc30a20, 0x2c9d6: 0x6dc30c20, 0x2c9d7: 0x6dc30e20, + 0x2c9d8: 0x6dc31020, 0x2c9d9: 0x6dc31220, 0x2c9da: 0x6dc31420, 0x2c9db: 0x6dc31620, + 0x2c9dc: 0x6dc31820, 0x2c9dd: 0x6dc31a20, 0x2c9de: 0x6dc31c20, 0x2c9df: 0x6dc31e20, + 0x2c9e0: 0x6dc32020, 0x2c9e1: 0x6dc32220, 0x2c9e2: 0x6dc32420, 0x2c9e3: 0x6dc32620, + 0x2c9e4: 0x6dc32820, 0x2c9e5: 0x6de08420, 0x2c9e6: 0x6de08620, 0x2c9e7: 0x6de08820, + 0x2c9e8: 0x6de08a20, 0x2c9e9: 0x6de08c20, 0x2c9ea: 0x6de08e20, 0x2c9eb: 0x6de09020, + 0x2c9ec: 0x6de09220, 0x2c9ed: 0x6de09420, 0x2c9ee: 0x6dc3dc20, 0x2c9ef: 0x6de09620, + 0x2c9f0: 0x6de09820, 0x2c9f1: 0x6df8d020, 0x2c9f2: 0x6df8d220, 0x2c9f3: 0x6df8d420, + 0x2c9f4: 0x6df8d620, 0x2c9f5: 0x6df8d820, 0x2c9f6: 0x6df8da20, 0x2c9f7: 0x6df8dc20, + 0x2c9f8: 0x6df8de20, 0x2c9f9: 0x6df8e020, 0x2c9fa: 0x6e0c9020, 0x2c9fb: 0x6e0c9820, + 0x2c9fc: 0x6df92820, 0x2c9fd: 0x6e0c9a20, 0x2c9fe: 0x6e0c9c20, 0x2c9ff: 0x6e0c9e20, + // Block 0xb28, offset 0x2ca00 + 0x2ca00: 0x6e0ca020, 0x2ca01: 0x6e0ca220, 0x2ca02: 0x6e0ca420, 0x2ca03: 0x6e0ca620, + 0x2ca04: 0x6e0ca820, 0x2ca05: 0x6e1c3020, 0x2ca06: 0x6e1c3220, 0x2ca07: 0x6e1c3420, + 0x2ca08: 0x6e1c3620, 0x2ca09: 0x6e1c3820, 0x2ca0a: 0x6e1c3a20, 0x2ca0b: 0x6e1c3c20, + 0x2ca0c: 0x6e287620, 0x2ca0d: 0x6e0caa20, 0x2ca0e: 0x6e1c3e20, 0x2ca0f: 0x6e287820, + 0x2ca10: 0x6e287a20, 0x2ca11: 0x6e319e20, 0x2ca12: 0x6e31a020, 0x2ca13: 0x6e31a220, + 0x2ca14: 0x6e384820, 0x2ca15: 0x6e384a20, 0x2ca16: 0x6e428420, 0x2ca17: 0x6c018220, + 0x2ca18: 0x6c078a20, 0x2ca19: 0x6c078c20, 0x2ca1a: 0x6c078e20, 0x2ca1b: 0x6c079020, + 0x2ca1c: 0x6c079220, 0x2ca1d: 0x6c0e9820, 0x2ca1e: 0x6c0e9a20, 0x2ca1f: 0x6c0e9c20, + 0x2ca20: 0x6c0e9e20, 0x2ca21: 0x6c0ea020, 0x2ca22: 0x6c0ea220, 0x2ca23: 0x6c0ea420, + 0x2ca24: 0x6c1a4a20, 0x2ca25: 0x6c1a4c20, 0x2ca26: 0x6c1a4e20, 0x2ca27: 0x6c1a5020, + 0x2ca28: 0x6c1a5220, 0x2ca29: 0x6c1a5420, 0x2ca2a: 0x6c1a5620, 0x2ca2b: 0x6c1a5820, + 0x2ca2c: 0x6c1a5a20, 0x2ca2d: 0x6c1a5c20, 0x2ca2e: 0x6c1a5e20, 0x2ca2f: 0x6c1a6020, + 0x2ca30: 0x6c1a6220, 0x2ca31: 0x6c1a6420, 0x2ca32: 0x6c1a6620, 0x2ca33: 0x6c1a6820, + 0x2ca34: 0x6c1a6a20, 0x2ca35: 0x6c1a6c20, 0x2ca36: 0x6c2d8220, 0x2ca37: 0x6c2d8420, + 0x2ca38: 0x6c2d8620, 0x2ca39: 0x6c2d8820, 0x2ca3a: 0x6c2d8a20, 0x2ca3b: 0x6c2d8c20, + 0x2ca3c: 0x6c2d8e20, 0x2ca3d: 0x6c2d9020, 0x2ca3e: 0x6c2d9220, 0x2ca3f: 0x6c47de20, + // Block 0xb29, offset 0x2ca40 + 0x2ca40: 0x6c47e020, 0x2ca41: 0x6c695020, 0x2ca42: 0x6c695220, 0x2ca43: 0x6c695420, + 0x2ca44: 0x6c695620, 0x2ca45: 0x6c695820, 0x2ca46: 0x6c695a20, 0x2ca47: 0x6c901c20, + 0x2ca48: 0x6c901e20, 0x2ca49: 0x6c902020, 0x2ca4a: 0x6c902220, 0x2ca4b: 0x6c902420, + 0x2ca4c: 0x6cbc4020, 0x2ca4d: 0x6cbc4220, 0x2ca4e: 0x6cbc4420, 0x2ca4f: 0x6c902620, + 0x2ca50: 0x6cbc4620, 0x2ca51: 0x6ced2820, 0x2ca52: 0x6ced2a20, 0x2ca53: 0x6ced2c20, + 0x2ca54: 0x6ced2e20, 0x2ca55: 0x6ced3020, 0x2ca56: 0x6d1cf220, 0x2ca57: 0x6d1cf420, + 0x2ca58: 0x6d1cf620, 0x2ca59: 0x6d1cf820, 0x2ca5a: 0x6d4ab620, 0x2ca5b: 0x6d785820, + 0x2ca5c: 0x6d785a20, 0x2ca5d: 0x6e1c7420, 0x2ca5e: 0x6e3d0e20, 0x2ca5f: 0x6c018420, + 0x2ca60: 0x6c03ce20, 0x2ca61: 0x6c03d020, 0x2ca62: 0x6c07a220, 0x2ca63: 0x6c07a420, + 0x2ca64: 0x6c07a620, 0x2ca65: 0x6c07a820, 0x2ca66: 0x6c07aa20, 0x2ca67: 0x6c07ac20, + 0x2ca68: 0x6c0ec020, 0x2ca69: 0x6c0ec220, 0x2ca6a: 0x6c0ec420, 0x2ca6b: 0x6c0ec620, + 0x2ca6c: 0x6c0ec820, 0x2ca6d: 0x6c0eca20, 0x2ca6e: 0x6c0ecc20, 0x2ca6f: 0x6c0ece20, + 0x2ca70: 0x6c0ed020, 0x2ca71: 0x6c0ed220, 0x2ca72: 0x6c0ed420, 0x2ca73: 0x6c0ed620, + 0x2ca74: 0x6c0ed820, 0x2ca75: 0x6c0eda20, 0x2ca76: 0x6c0edc20, 0x2ca77: 0x6c0ede20, + 0x2ca78: 0x6c0ee020, 0x2ca79: 0x6c0ee220, 0x2ca7a: 0x6c0ee420, 0x2ca7b: 0x6c1aac20, + 0x2ca7c: 0x6c1aae20, 0x2ca7d: 0x6c1ab020, 0x2ca7e: 0x6c1ab220, 0x2ca7f: 0x6c1ab420, + // Block 0xb2a, offset 0x2ca80 + 0x2ca80: 0x6c1ab620, 0x2ca81: 0x6c1ab820, 0x2ca82: 0x6c1aba20, 0x2ca83: 0x6c1abc20, + 0x2ca84: 0x6c1abe20, 0x2ca85: 0x6c1ac020, 0x2ca86: 0x6c1ac220, 0x2ca87: 0x6c1ac420, + 0x2ca88: 0x6c1ac620, 0x2ca89: 0x6c1ac820, 0x2ca8a: 0x6c1aca20, 0x2ca8b: 0x6c1acc20, + 0x2ca8c: 0x6c1ace20, 0x2ca8d: 0x6c1ad020, 0x2ca8e: 0x6c1ad220, 0x2ca8f: 0x6c1ad420, + 0x2ca90: 0x6c1ad620, 0x2ca91: 0x6c1ad820, 0x2ca92: 0x6c1ada20, 0x2ca93: 0x6c1adc20, + 0x2ca94: 0x6c1ade20, 0x2ca95: 0x6c1ae020, 0x2ca96: 0x6c1ae220, 0x2ca97: 0x6c1ae420, + 0x2ca98: 0x6c1ae620, 0x2ca99: 0x6c1ae820, 0x2ca9a: 0x6c1aea20, 0x2ca9b: 0x6c1aec20, + 0x2ca9c: 0x6c1aee20, 0x2ca9d: 0x6c1af020, 0x2ca9e: 0x6c1af220, 0x2ca9f: 0x6c1af420, + 0x2caa0: 0x6c1af620, 0x2caa1: 0x6c2db420, 0x2caa2: 0x6c2db620, 0x2caa3: 0x6c2db820, + 0x2caa4: 0x6c2dba20, 0x2caa5: 0x6c2dbc20, 0x2caa6: 0x6c2dbe20, 0x2caa7: 0x6c2dc020, + 0x2caa8: 0x6c2dc220, 0x2caa9: 0x6c2dc420, 0x2caaa: 0x6c2dc620, 0x2caab: 0x6c2dc820, + 0x2caac: 0x6c2dca20, 0x2caad: 0x6c2dcc20, 0x2caae: 0x6c2dce20, 0x2caaf: 0x6c2dd020, + 0x2cab0: 0x6c2dd220, 0x2cab1: 0x6c2dd420, 0x2cab2: 0x6c2dd620, 0x2cab3: 0x6c2dd820, + 0x2cab4: 0x6c2dda20, 0x2cab5: 0x6c2ddc20, 0x2cab6: 0x6c2dde20, 0x2cab7: 0x6c2de020, + 0x2cab8: 0x6c2de220, 0x2cab9: 0x6c2de420, 0x2caba: 0x6c2de620, 0x2cabb: 0x6c2de820, + 0x2cabc: 0x6c2dea20, 0x2cabd: 0x6c2dec20, 0x2cabe: 0x6c2dee20, 0x2cabf: 0x6c2df020, + // Block 0xb2b, offset 0x2cac0 + 0x2cac0: 0x6c2df220, 0x2cac1: 0x6c2df420, 0x2cac2: 0x6c2df620, 0x2cac3: 0x6c2df820, + 0x2cac4: 0x6c2dfa20, 0x2cac5: 0x6c2dfc20, 0x2cac6: 0x6c2dfe20, 0x2cac7: 0x6c2e0020, + 0x2cac8: 0x6c2e0220, 0x2cac9: 0x6c2e0420, 0x2caca: 0x6c2e0620, 0x2cacb: 0x6c481220, + 0x2cacc: 0x6c481420, 0x2cacd: 0x6c481620, 0x2cace: 0x6c481820, 0x2cacf: 0x6c481a20, + 0x2cad0: 0x6c481c20, 0x2cad1: 0x6c481e20, 0x2cad2: 0x6c482020, 0x2cad3: 0x6c482220, + 0x2cad4: 0x6c482420, 0x2cad5: 0x6c482620, 0x2cad6: 0x6c482820, 0x2cad7: 0x6c482a20, + 0x2cad8: 0x6c482c20, 0x2cad9: 0x6c482e20, 0x2cada: 0x6c483020, 0x2cadb: 0x6c483220, + 0x2cadc: 0x6c483420, 0x2cadd: 0x6c483620, 0x2cade: 0x6c483820, 0x2cadf: 0x6c483a20, + 0x2cae0: 0x6c483c20, 0x2cae1: 0x6c483e20, 0x2cae2: 0x6c484020, 0x2cae3: 0x6c484220, + 0x2cae4: 0x6c484420, 0x2cae5: 0x6c484620, 0x2cae6: 0x6c484820, 0x2cae7: 0x6c484a20, + 0x2cae8: 0x6c484c20, 0x2cae9: 0x6c484e20, 0x2caea: 0x6c485020, 0x2caeb: 0x6c485220, + 0x2caec: 0x6c485420, 0x2caed: 0x6c485620, 0x2caee: 0x6c485820, 0x2caef: 0x6c485a20, + 0x2caf0: 0x6c485c20, 0x2caf1: 0x6c485e20, 0x2caf2: 0x6c486020, 0x2caf3: 0x6c486220, + 0x2caf4: 0x6c486420, 0x2caf5: 0x6c486620, 0x2caf6: 0x6c698e20, 0x2caf7: 0x6c699020, + 0x2caf8: 0x6c699220, 0x2caf9: 0x6c699420, 0x2cafa: 0x6c699620, 0x2cafb: 0x6c699820, + 0x2cafc: 0x6c699a20, 0x2cafd: 0x6c699c20, 0x2cafe: 0x6c699e20, 0x2caff: 0x6c69a020, + // Block 0xb2c, offset 0x2cb00 + 0x2cb00: 0x6c69a220, 0x2cb01: 0x6c69a420, 0x2cb02: 0x6c69a620, 0x2cb03: 0x6c69a820, + 0x2cb04: 0x6c69aa20, 0x2cb05: 0x6c69ac20, 0x2cb06: 0x6c69ae20, 0x2cb07: 0x6c69b020, + 0x2cb08: 0x6c69b220, 0x2cb09: 0x6c69b420, 0x2cb0a: 0x6c69b620, 0x2cb0b: 0x6c69b820, + 0x2cb0c: 0x6c69ba20, 0x2cb0d: 0x6c69bc20, 0x2cb0e: 0x6c486820, 0x2cb0f: 0x6c69be20, + 0x2cb10: 0x6c69c020, 0x2cb11: 0x6c69c220, 0x2cb12: 0x6c69c420, 0x2cb13: 0x6c69c620, + 0x2cb14: 0x6c69c820, 0x2cb15: 0x6c69ca20, 0x2cb16: 0x6c69cc20, 0x2cb17: 0x6c69ce20, + 0x2cb18: 0x6c69d020, 0x2cb19: 0x6c69d220, 0x2cb1a: 0x6c69d420, 0x2cb1b: 0x6c69d620, + 0x2cb1c: 0x6c905420, 0x2cb1d: 0x6c905620, 0x2cb1e: 0x6c905820, 0x2cb1f: 0x6c905a20, + 0x2cb20: 0x6c905c20, 0x2cb21: 0x6c905e20, 0x2cb22: 0x6c906020, 0x2cb23: 0x6c906220, + 0x2cb24: 0x6c906420, 0x2cb25: 0x6c906620, 0x2cb26: 0x6c906820, 0x2cb27: 0x6c906a20, + 0x2cb28: 0x6c906c20, 0x2cb29: 0x6c906e20, 0x2cb2a: 0x6c915e20, 0x2cb2b: 0x6c907020, + 0x2cb2c: 0x6c907220, 0x2cb2d: 0x6c907420, 0x2cb2e: 0x6c907620, 0x2cb2f: 0x6c907820, + 0x2cb30: 0x6c907a20, 0x2cb31: 0x6c907c20, 0x2cb32: 0x6c907e20, 0x2cb33: 0x6c908020, + 0x2cb34: 0x6c908220, 0x2cb35: 0x6c908420, 0x2cb36: 0x6c908620, 0x2cb37: 0x6c908820, + 0x2cb38: 0x6c908a20, 0x2cb39: 0x6c908c20, 0x2cb3a: 0x6c908e20, 0x2cb3b: 0x6c909020, + 0x2cb3c: 0x6c909220, 0x2cb3d: 0x6c909420, 0x2cb3e: 0x6c909620, 0x2cb3f: 0x6c909820, + // Block 0xb2d, offset 0x2cb40 + 0x2cb40: 0x6c909a20, 0x2cb41: 0x6c909c20, 0x2cb42: 0x6c909e20, 0x2cb43: 0x6c90a020, + 0x2cb44: 0x6c90a220, 0x2cb45: 0x6c90a420, 0x2cb46: 0x6c90a620, 0x2cb47: 0x6c90a820, + 0x2cb48: 0x6c90aa20, 0x2cb49: 0x6c90ac20, 0x2cb4a: 0x6c90ae20, 0x2cb4b: 0x6c90b020, + 0x2cb4c: 0x6c90b220, 0x2cb4d: 0x6c90b420, 0x2cb4e: 0x6c90b620, 0x2cb4f: 0x6c90b820, + 0x2cb50: 0x6c90ba20, 0x2cb51: 0x6c90bc20, 0x2cb52: 0x6c90be20, 0x2cb53: 0x6c90c020, + 0x2cb54: 0x6c90c220, 0x2cb55: 0x6c90c420, 0x2cb56: 0x6cbc7a20, 0x2cb57: 0x6cbc7c20, + 0x2cb58: 0x6cbc7e20, 0x2cb59: 0x6cbc8020, 0x2cb5a: 0x6cbc8220, 0x2cb5b: 0x6cbc8420, + 0x2cb5c: 0x6cbc8620, 0x2cb5d: 0x6cbc8820, 0x2cb5e: 0x6cbc8a20, 0x2cb5f: 0x6cbc8c20, + 0x2cb60: 0x6cbc8e20, 0x2cb61: 0x6cbc9020, 0x2cb62: 0x6cbc9220, 0x2cb63: 0x6cbc9420, + 0x2cb64: 0x6cbc9620, 0x2cb65: 0x6cbc9820, 0x2cb66: 0x6cbc9a20, 0x2cb67: 0x6cbc9c20, + 0x2cb68: 0x6cbc9e20, 0x2cb69: 0x6cbca020, 0x2cb6a: 0x6cbca220, 0x2cb6b: 0x6cbca420, + 0x2cb6c: 0x6cbca620, 0x2cb6d: 0x6cbca820, 0x2cb6e: 0x6cbcaa20, 0x2cb6f: 0x6cbcac20, + 0x2cb70: 0x6cbcae20, 0x2cb71: 0x6cbcb020, 0x2cb72: 0x6c6a6e20, 0x2cb73: 0x6cbcb220, + 0x2cb74: 0x6cbcb420, 0x2cb75: 0x6c916020, 0x2cb76: 0x6cbcb620, 0x2cb77: 0x6cbcb820, + 0x2cb78: 0x6cbcba20, 0x2cb79: 0x6cbcbc20, 0x2cb7a: 0x6cbcbe20, 0x2cb7b: 0x6cbcc020, + 0x2cb7c: 0x6cbcc220, 0x2cb7d: 0x6ced5820, 0x2cb7e: 0x6cbcc420, 0x2cb7f: 0x6cbcc620, + // Block 0xb2e, offset 0x2cb80 + 0x2cb80: 0x6cbcc820, 0x2cb81: 0x6cbcca20, 0x2cb82: 0x6cbccc20, 0x2cb83: 0x6ced5a20, + 0x2cb84: 0x6cbcce20, 0x2cb85: 0x6cbcd020, 0x2cb86: 0x6cbcd220, 0x2cb87: 0x6cbcd420, + 0x2cb88: 0x6cbcd620, 0x2cb89: 0x6ced5c20, 0x2cb8a: 0x6ced5e20, 0x2cb8b: 0x6ced6020, + 0x2cb8c: 0x6ced6220, 0x2cb8d: 0x6ced6420, 0x2cb8e: 0x6ced6620, 0x2cb8f: 0x6ced6820, + 0x2cb90: 0x6ced6a20, 0x2cb91: 0x6ced6c20, 0x2cb92: 0x6ced6e20, 0x2cb93: 0x6ced7020, + 0x2cb94: 0x6ced7220, 0x2cb95: 0x6ced7420, 0x2cb96: 0x6ced7620, 0x2cb97: 0x6ced7820, + 0x2cb98: 0x6ced7a20, 0x2cb99: 0x6ced7c20, 0x2cb9a: 0x6ced7e20, 0x2cb9b: 0x6ced8020, + 0x2cb9c: 0x6ced8220, 0x2cb9d: 0x6ced8420, 0x2cb9e: 0x6ced8620, 0x2cb9f: 0x6ced8820, + 0x2cba0: 0x6ced8a20, 0x2cba1: 0x6ced8c20, 0x2cba2: 0x6ced8e20, 0x2cba3: 0x6ced9020, + 0x2cba4: 0x6ced9220, 0x2cba5: 0x6ced9420, 0x2cba6: 0x6ced9620, 0x2cba7: 0x6ced9820, + 0x2cba8: 0x6ced9a20, 0x2cba9: 0x6ced9c20, 0x2cbaa: 0x6ced9e20, 0x2cbab: 0x6ceda020, + 0x2cbac: 0x6ceda220, 0x2cbad: 0x6ceda420, 0x2cbae: 0x6ceda620, 0x2cbaf: 0x6ceda820, + 0x2cbb0: 0x6cedaa20, 0x2cbb1: 0x6cedac20, 0x2cbb2: 0x6d1d2420, 0x2cbb3: 0x6d1d2620, + 0x2cbb4: 0x6d1d2820, 0x2cbb5: 0x6d1d2a20, 0x2cbb6: 0x6d1d2c20, 0x2cbb7: 0x6d1d2e20, + 0x2cbb8: 0x6d1d3020, 0x2cbb9: 0x6d1d3220, 0x2cbba: 0x6d1d3420, 0x2cbbb: 0x6d1d3620, + 0x2cbbc: 0x6d1d3820, 0x2cbbd: 0x6d1d3a20, 0x2cbbe: 0x6d1d3c20, 0x2cbbf: 0x6d1d3e20, + // Block 0xb2f, offset 0x2cbc0 + 0x2cbc0: 0x6d4ac620, 0x2cbc1: 0x6d1d4020, 0x2cbc2: 0x6d1d4220, 0x2cbc3: 0x6d1d4420, + 0x2cbc4: 0x6d1d4620, 0x2cbc5: 0x6d1d4820, 0x2cbc6: 0x6d1d4a20, 0x2cbc7: 0x6d1d4c20, + 0x2cbc8: 0x6d1d4e20, 0x2cbc9: 0x6d1d5020, 0x2cbca: 0x6d1d5220, 0x2cbcb: 0x6d1d5420, + 0x2cbcc: 0x6d1d5620, 0x2cbcd: 0x6d1d5820, 0x2cbce: 0x6d1d5a20, 0x2cbcf: 0x6d1d5c20, + 0x2cbd0: 0x6d1d5e20, 0x2cbd1: 0x6d1d6020, 0x2cbd2: 0x6d1d6220, 0x2cbd3: 0x6d1d6420, + 0x2cbd4: 0x6d1d6620, 0x2cbd5: 0x6d1d6820, 0x2cbd6: 0x6d1d6a20, 0x2cbd7: 0x6d1d6c20, + 0x2cbd8: 0x6d1d6e20, 0x2cbd9: 0x6d1d7020, 0x2cbda: 0x6d1d7220, 0x2cbdb: 0x6d1d7420, + 0x2cbdc: 0x6d4ada20, 0x2cbdd: 0x6d4adc20, 0x2cbde: 0x6d4ade20, 0x2cbdf: 0x6d4ae020, + 0x2cbe0: 0x6d4ae220, 0x2cbe1: 0x6d4ae420, 0x2cbe2: 0x6d4ae620, 0x2cbe3: 0x6d4ae820, + 0x2cbe4: 0x6d4aea20, 0x2cbe5: 0x6d4aec20, 0x2cbe6: 0x6d4aee20, 0x2cbe7: 0x6d4af020, + 0x2cbe8: 0x6d758820, 0x2cbe9: 0x6d4af220, 0x2cbea: 0x6d4af420, 0x2cbeb: 0x6d4af620, + 0x2cbec: 0x6d4af820, 0x2cbed: 0x6d1df220, 0x2cbee: 0x6d4afa20, 0x2cbef: 0x6d4afc20, + 0x2cbf0: 0x6d4afe20, 0x2cbf1: 0x6d4b0020, 0x2cbf2: 0x6d4b0220, 0x2cbf3: 0x6d4b0420, + 0x2cbf4: 0x6d4b0620, 0x2cbf5: 0x6d4b0820, 0x2cbf6: 0x6d4b0a20, 0x2cbf7: 0x6d4b0c20, + 0x2cbf8: 0x6d4b0e20, 0x2cbf9: 0x6d4b1020, 0x2cbfa: 0x6d787420, 0x2cbfb: 0x6d787620, + 0x2cbfc: 0x6d787820, 0x2cbfd: 0x6d787a20, 0x2cbfe: 0x6d787c20, 0x2cbff: 0x6d787e20, + // Block 0xb30, offset 0x2cc00 + 0x2cc00: 0x6d788020, 0x2cc01: 0x6d788220, 0x2cc02: 0x6d788420, 0x2cc03: 0x6d788620, + 0x2cc04: 0x6d788820, 0x2cc05: 0x6d788a20, 0x2cc06: 0x6d788c20, 0x2cc07: 0x6d788e20, + 0x2cc08: 0x6d789020, 0x2cc09: 0x6d789220, 0x2cc0a: 0x6d789420, 0x2cc0b: 0x6d789620, + 0x2cc0c: 0x6d789820, 0x2cc0d: 0x6da19020, 0x2cc0e: 0x6da19220, 0x2cc0f: 0x6da19420, + 0x2cc10: 0x6da19620, 0x2cc11: 0x6da19820, 0x2cc12: 0x6da19a20, 0x2cc13: 0x6da19c20, + 0x2cc14: 0x6da19e20, 0x2cc15: 0x6da1a020, 0x2cc16: 0x6da1a220, 0x2cc17: 0x6da1a420, + 0x2cc18: 0x6dc3e620, 0x2cc19: 0x6dc3e820, 0x2cc1a: 0x6de10620, 0x2cc1b: 0x6de10820, + 0x2cc1c: 0x6de10a20, 0x2cc1d: 0x6de10c20, 0x2cc1e: 0x6de10e20, 0x2cc1f: 0x6de11020, + 0x2cc20: 0x6de11220, 0x2cc21: 0x6de07820, 0x2cc22: 0x6de11420, 0x2cc23: 0x6df93420, + 0x2cc24: 0x6df93620, 0x2cc25: 0x6df93820, 0x2cc26: 0x6e0cfc20, 0x2cc27: 0x6e288e20, + 0x2cc28: 0x6e289020, 0x2cc29: 0x6e31c420, 0x2cc2a: 0x6e386020, 0x2cc2b: 0x6c018620, + 0x2cc2c: 0x6c03da20, 0x2cc2d: 0x6c07c420, 0x2cc2e: 0x6c0f0e20, 0x2cc2f: 0x6c1b6620, + 0x2cc30: 0x6c1b6820, 0x2cc31: 0x6c1b6a20, 0x2cc32: 0x6c1b6c20, 0x2cc33: 0x6c1b6e20, + 0x2cc34: 0x6c48e620, 0x2cc35: 0x6c48e820, 0x2cc36: 0x6c6a7020, 0x2cc37: 0x6c916220, + 0x2cc38: 0x6c916420, 0x2cc39: 0x6cbd8820, 0x2cc3a: 0x6cbd8a20, 0x2cc3b: 0x6cbd8c20, + 0x2cc3c: 0x6cee4e20, 0x2cc3d: 0x6d1df420, 0x2cc3e: 0x6d1df620, 0x2cc3f: 0x6d4ba220, + // Block 0xb31, offset 0x2cc40 + 0x2cc40: 0x6d4ba420, 0x2cc41: 0x6d790020, 0x2cc42: 0x6c018820, 0x2cc43: 0x6c03dc20, + 0x2cc44: 0x6c07c820, 0x2cc45: 0x6c0f1220, 0x2cc46: 0x6c1b7420, 0x2cc47: 0x6c2e8020, + 0x2cc48: 0x6c48f220, 0x2cc49: 0x6c48f820, 0x2cc4a: 0x6c018c20, 0x2cc4b: 0x6c1b7c20, + 0x2cc4c: 0x6c2e8220, 0x2cc4d: 0x6c48fa20, 0x2cc4e: 0x6c6a8420, 0x2cc4f: 0x6c6a8620, + 0x2cc50: 0x6d1e0220, 0x2cc51: 0x6dc43a20, 0x2cc52: 0x6de14820, 0x2cc53: 0x6dc43c20, + 0x2cc54: 0x6e0d1e20, 0x2cc55: 0x6c018e20, 0x2cc56: 0x6c07d020, 0x2cc57: 0x6c07d220, + 0x2cc58: 0x6c07d420, 0x2cc59: 0x6c0f1c20, 0x2cc5a: 0x6c0f1e20, 0x2cc5b: 0x6c0f2020, + 0x2cc5c: 0x6c2e8e20, 0x2cc5d: 0x6c2e9020, 0x2cc5e: 0x6c6a8c20, 0x2cc5f: 0x6c918020, + 0x2cc60: 0x6c918220, 0x2cc61: 0x6cbd9a20, 0x2cc62: 0x6d1e1020, 0x2cc63: 0x6d1e1220, + 0x2cc64: 0x6d1e1420, 0x2cc65: 0x6d1e1620, 0x2cc66: 0x6d4bae20, 0x2cc67: 0x6c019020, + 0x2cc68: 0x6c019220, 0x2cc69: 0x6c03de20, 0x2cc6a: 0x6c03e020, 0x2cc6b: 0x6c03e220, + 0x2cc6c: 0x6c03e420, 0x2cc6d: 0x6c03e620, 0x2cc6e: 0x6c07de20, 0x2cc6f: 0x6c07e020, + 0x2cc70: 0x6c07e220, 0x2cc71: 0x6c07e420, 0x2cc72: 0x6c07e620, 0x2cc73: 0x6c07e820, + 0x2cc74: 0x6c07ea20, 0x2cc75: 0x6c0f3220, 0x2cc76: 0x6c0f3420, 0x2cc77: 0x6c0f3620, + 0x2cc78: 0x6c0f3820, 0x2cc79: 0x6c0f3a20, 0x2cc7a: 0x6c0f3c20, 0x2cc7b: 0x6c0f3e20, + 0x2cc7c: 0x6c0f4020, 0x2cc7d: 0x6c1b8e20, 0x2cc7e: 0x6c1b9020, 0x2cc7f: 0x6c1b9220, + // Block 0xb32, offset 0x2cc80 + 0x2cc80: 0x6c1b9420, 0x2cc81: 0x6c1b9620, 0x2cc82: 0x6c1b9820, 0x2cc83: 0x6c2ea620, + 0x2cc84: 0x6c2ea820, 0x2cc85: 0x6c2eaa20, 0x2cc86: 0x6c2eac20, 0x2cc87: 0x6c2eae20, + 0x2cc88: 0x6c2eb020, 0x2cc89: 0x6c2eb220, 0x2cc8a: 0x6c6aaa20, 0x2cc8b: 0x6c2eb420, + 0x2cc8c: 0x6c2eb620, 0x2cc8d: 0x6c2eb820, 0x2cc8e: 0x6c490620, 0x2cc8f: 0x6c490820, + 0x2cc90: 0x6c490a20, 0x2cc91: 0x6c490c20, 0x2cc92: 0x6c490e20, 0x2cc93: 0x6c491020, + 0x2cc94: 0x6c2ef220, 0x2cc95: 0x6c491220, 0x2cc96: 0x6c491420, 0x2cc97: 0x6c6aac20, + 0x2cc98: 0x6c6aae20, 0x2cc99: 0x6c6ab020, 0x2cc9a: 0x6c6ab220, 0x2cc9b: 0x6c919e20, + 0x2cc9c: 0x6c91a020, 0x2cc9d: 0x6c91a220, 0x2cc9e: 0x6c91a420, 0x2cc9f: 0x6c91d220, + 0x2cca0: 0x6cbdb820, 0x2cca1: 0x6cbdba20, 0x2cca2: 0x6c91d420, 0x2cca3: 0x6cbdbc20, + 0x2cca4: 0x6cbdbe20, 0x2cca5: 0x6cbdc020, 0x2cca6: 0x6cee7820, 0x2cca7: 0x6cee7a20, + 0x2cca8: 0x6cee7c20, 0x2cca9: 0x6d1e2e20, 0x2ccaa: 0x6d1e3020, 0x2ccab: 0x6d1e3220, + 0x2ccac: 0x6d1e3420, 0x2ccad: 0x6d4bb820, 0x2ccae: 0x6d791e20, 0x2ccaf: 0x6d792020, + 0x2ccb0: 0x6dc44c20, 0x2ccb1: 0x6e1c9220, 0x2ccb2: 0x6e28a420, 0x2ccb3: 0x6c019420, + 0x2ccb4: 0x6c07fe20, 0x2ccb5: 0x6c080020, 0x2ccb6: 0x6c080220, 0x2ccb7: 0x6c0f6220, + 0x2ccb8: 0x6c0f6420, 0x2ccb9: 0x6c0f6620, 0x2ccba: 0x6c0f6820, 0x2ccbb: 0x6c0f6a20, + 0x2ccbc: 0x6c0f6c20, 0x2ccbd: 0x6c0f6e20, 0x2ccbe: 0x6c0f7020, 0x2ccbf: 0x6c0f7220, + // Block 0xb33, offset 0x2ccc0 + 0x2ccc0: 0x6c0f7420, 0x2ccc1: 0x6c0f7620, 0x2ccc2: 0x6c0f7820, 0x2ccc3: 0x6c0f7a20, + 0x2ccc4: 0x6c0f7c20, 0x2ccc5: 0x6c0f7e20, 0x2ccc6: 0x6c0f8020, 0x2ccc7: 0x6c0f8220, + 0x2ccc8: 0x6c0f8420, 0x2ccc9: 0x6c1bd420, 0x2ccca: 0x6c1bd620, 0x2cccb: 0x6c1bd820, + 0x2cccc: 0x6c1bda20, 0x2cccd: 0x6c495420, 0x2ccce: 0x6c1bdc20, 0x2cccf: 0x6c1bde20, + 0x2ccd0: 0x6c1be020, 0x2ccd1: 0x6c1be220, 0x2ccd2: 0x6c1be420, 0x2ccd3: 0x6c1be620, + 0x2ccd4: 0x6c1be820, 0x2ccd5: 0x6c1bea20, 0x2ccd6: 0x6c1bec20, 0x2ccd7: 0x6c1bee20, + 0x2ccd8: 0x6c1bf020, 0x2ccd9: 0x6c1bf220, 0x2ccda: 0x6c1bf420, 0x2ccdb: 0x6c1bf620, + 0x2ccdc: 0x6c1bf820, 0x2ccdd: 0x6c1bfa20, 0x2ccde: 0x6c1bfc20, 0x2ccdf: 0x6c1bfe20, + 0x2cce0: 0x6c1c0020, 0x2cce1: 0x6c1c0220, 0x2cce2: 0x6c1c0420, 0x2cce3: 0x6c1c0620, + 0x2cce4: 0x6c1c0820, 0x2cce5: 0x6c1c0a20, 0x2cce6: 0x6c1c0c20, 0x2cce7: 0x6c1c0e20, + 0x2cce8: 0x6c1c1020, 0x2cce9: 0x6c1c1220, 0x2ccea: 0x6c1c1420, 0x2cceb: 0x6c1c1620, + 0x2ccec: 0x6c2f1820, 0x2cced: 0x6c2f1a20, 0x2ccee: 0x6c2f1c20, 0x2ccef: 0x6c2f1e20, + 0x2ccf0: 0x6c2f2020, 0x2ccf1: 0x6c2f2220, 0x2ccf2: 0x6c2f2420, 0x2ccf3: 0x6c2f2620, + 0x2ccf4: 0x6c2f2820, 0x2ccf5: 0x6c2f2a20, 0x2ccf6: 0x6c2f2c20, 0x2ccf7: 0x6c2f2e20, + 0x2ccf8: 0x6c2f3020, 0x2ccf9: 0x6c2f3220, 0x2ccfa: 0x6c2f3420, 0x2ccfb: 0x6c2f3620, + 0x2ccfc: 0x6c2f3820, 0x2ccfd: 0x6c2f3a20, 0x2ccfe: 0x6c2f3c20, 0x2ccff: 0x6c2f3e20, + // Block 0xb34, offset 0x2cd00 + 0x2cd00: 0x6c2f4020, 0x2cd01: 0x6c2f4220, 0x2cd02: 0x6c2f4420, 0x2cd03: 0x6c2f4620, + 0x2cd04: 0x6c2f4820, 0x2cd05: 0x6c2f4a20, 0x2cd06: 0x6c2f4c20, 0x2cd07: 0x6c2f4e20, + 0x2cd08: 0x6c2f5020, 0x2cd09: 0x6c2f5220, 0x2cd0a: 0x6c2f5420, 0x2cd0b: 0x6c2f5620, + 0x2cd0c: 0x6c2f5820, 0x2cd0d: 0x6c2f5a20, 0x2cd0e: 0x6c2f5c20, 0x2cd0f: 0x6c2f5e20, + 0x2cd10: 0x6c2f6020, 0x2cd11: 0x6c2f6220, 0x2cd12: 0x6c2f6420, 0x2cd13: 0x6c2f6620, + 0x2cd14: 0x6c2f6820, 0x2cd15: 0x6c493c20, 0x2cd16: 0x6c2f6a20, 0x2cd17: 0x6c2f6c20, + 0x2cd18: 0x6c495620, 0x2cd19: 0x6c495820, 0x2cd1a: 0x6c495a20, 0x2cd1b: 0x6c495c20, + 0x2cd1c: 0x6c495e20, 0x2cd1d: 0x6c496020, 0x2cd1e: 0x6c496220, 0x2cd1f: 0x6c496420, + 0x2cd20: 0x6c496620, 0x2cd21: 0x6c496820, 0x2cd22: 0x6c496a20, 0x2cd23: 0x6c496c20, + 0x2cd24: 0x6c496e20, 0x2cd25: 0x6c497020, 0x2cd26: 0x6c497220, 0x2cd27: 0x6c497420, + 0x2cd28: 0x6c497620, 0x2cd29: 0x6c497820, 0x2cd2a: 0x6c497a20, 0x2cd2b: 0x6c497c20, + 0x2cd2c: 0x6c6b1820, 0x2cd2d: 0x6c497e20, 0x2cd2e: 0x6c498020, 0x2cd2f: 0x6c498220, + 0x2cd30: 0x6c498420, 0x2cd31: 0x6c498620, 0x2cd32: 0x6c498820, 0x2cd33: 0x6c498a20, + 0x2cd34: 0x6c498c20, 0x2cd35: 0x6c498e20, 0x2cd36: 0x6c499020, 0x2cd37: 0x6c499220, + 0x2cd38: 0x6c499420, 0x2cd39: 0x6c499620, 0x2cd3a: 0x6c499820, 0x2cd3b: 0x6c499a20, + 0x2cd3c: 0x6c499c20, 0x2cd3d: 0x6c499e20, 0x2cd3e: 0x6c49a020, 0x2cd3f: 0x6c49a220, + // Block 0xb35, offset 0x2cd40 + 0x2cd40: 0x6c49a420, 0x2cd41: 0x6c49a620, 0x2cd42: 0x6c49a820, 0x2cd43: 0x6c49aa20, + 0x2cd44: 0x6c5c3020, 0x2cd45: 0x6c49ac20, 0x2cd46: 0x6c49ae20, 0x2cd47: 0x6c49b020, + 0x2cd48: 0x6c49b220, 0x2cd49: 0x6c6b1a20, 0x2cd4a: 0x6c6b1c20, 0x2cd4b: 0x6c6b1e20, + 0x2cd4c: 0x6c6b2020, 0x2cd4d: 0x6c4a1a20, 0x2cd4e: 0x6c6b2220, 0x2cd4f: 0x6c6b2420, + 0x2cd50: 0x6c6b2620, 0x2cd51: 0x6c6b2820, 0x2cd52: 0x6c6b2a20, 0x2cd53: 0x6c6b2c20, + 0x2cd54: 0x6c6b2e20, 0x2cd55: 0x6c6b3020, 0x2cd56: 0x6c6b3220, 0x2cd57: 0x6c6b3420, + 0x2cd58: 0x6c6b3620, 0x2cd59: 0x6c6b3820, 0x2cd5a: 0x6c6b3a20, 0x2cd5b: 0x6c6b3c20, + 0x2cd5c: 0x6c6b3e20, 0x2cd5d: 0x6c6b4020, 0x2cd5e: 0x6c6b4220, 0x2cd5f: 0x6c6b4420, + 0x2cd60: 0x6c6b4620, 0x2cd61: 0x6c6b4820, 0x2cd62: 0x6c6b4a20, 0x2cd63: 0x6c6b4c20, + 0x2cd64: 0x6c6b4e20, 0x2cd65: 0x6c6b5020, 0x2cd66: 0x6c6b5220, 0x2cd67: 0x6c6b5420, + 0x2cd68: 0x6c6b5620, 0x2cd69: 0x6c6b5820, 0x2cd6a: 0x6c6b5a20, 0x2cd6b: 0x6c91d620, + 0x2cd6c: 0x6c91ec20, 0x2cd6d: 0x6c6b5c20, 0x2cd6e: 0x6c6b5e20, 0x2cd6f: 0x6c6b6020, + 0x2cd70: 0x6c6b6220, 0x2cd71: 0x6c6b6420, 0x2cd72: 0x6c6b6620, 0x2cd73: 0x6c6b6820, + 0x2cd74: 0x6c6b6a20, 0x2cd75: 0x6c91ee20, 0x2cd76: 0x6c91f020, 0x2cd77: 0x6c91f220, + 0x2cd78: 0x6c91f420, 0x2cd79: 0x6c91f620, 0x2cd7a: 0x6c91f820, 0x2cd7b: 0x6c91fa20, + 0x2cd7c: 0x6c91fc20, 0x2cd7d: 0x6c91d820, 0x2cd7e: 0x6c91fe20, 0x2cd7f: 0x6c920020, + // Block 0xb36, offset 0x2cd80 + 0x2cd80: 0x6c920220, 0x2cd81: 0x6c920420, 0x2cd82: 0x6c920620, 0x2cd83: 0x6c920820, + 0x2cd84: 0x6c920a20, 0x2cd85: 0x6c920c20, 0x2cd86: 0x6c920e20, 0x2cd87: 0x6c921020, + 0x2cd88: 0x6c921220, 0x2cd89: 0x6c921420, 0x2cd8a: 0x6c921620, 0x2cd8b: 0x6c921820, + 0x2cd8c: 0x6c921a20, 0x2cd8d: 0x6c921c20, 0x2cd8e: 0x6c921e20, 0x2cd8f: 0x6c922020, + 0x2cd90: 0x6c922220, 0x2cd91: 0x6c922420, 0x2cd92: 0x6c922620, 0x2cd93: 0x6c922820, + 0x2cd94: 0x6c922a20, 0x2cd95: 0x6c922c20, 0x2cd96: 0x6c922e20, 0x2cd97: 0x6c923020, + 0x2cd98: 0x6c923220, 0x2cd99: 0x6c923420, 0x2cd9a: 0x6c923620, 0x2cd9b: 0x6c923820, + 0x2cd9c: 0x6c923a20, 0x2cd9d: 0x6c923c20, 0x2cd9e: 0x6c923e20, 0x2cd9f: 0x6c924020, + 0x2cda0: 0x6c924220, 0x2cda1: 0x6c924420, 0x2cda2: 0x6c924620, 0x2cda3: 0x6c924820, + 0x2cda4: 0x6c924a20, 0x2cda5: 0x6c924c20, 0x2cda6: 0x6c924e20, 0x2cda7: 0x6c925020, + 0x2cda8: 0x6c925220, 0x2cda9: 0x6c925420, 0x2cdaa: 0x6c925620, 0x2cdab: 0x6c925820, + 0x2cdac: 0x6c925a20, 0x2cdad: 0x6c925c20, 0x2cdae: 0x6c925e20, 0x2cdaf: 0x6c926020, + 0x2cdb0: 0x6c926220, 0x2cdb1: 0x6c926420, 0x2cdb2: 0x6c926620, 0x2cdb3: 0x6c926820, + 0x2cdb4: 0x6c926a20, 0x2cdb5: 0x6c926c20, 0x2cdb6: 0x6c926e20, 0x2cdb7: 0x6cbe2020, + 0x2cdb8: 0x6cbe2220, 0x2cdb9: 0x6cbe2420, 0x2cdba: 0x6cbe2620, 0x2cdbb: 0x6cbe2820, + 0x2cdbc: 0x6cbe2a20, 0x2cdbd: 0x6cbe2c20, 0x2cdbe: 0x6cbe2e20, 0x2cdbf: 0x6cbe3020, + // Block 0xb37, offset 0x2cdc0 + 0x2cdc0: 0x6cbe3220, 0x2cdc1: 0x6cbe3420, 0x2cdc2: 0x6cbe3620, 0x2cdc3: 0x6cbe3820, + 0x2cdc4: 0x6cbe3a20, 0x2cdc5: 0x6cbe3c20, 0x2cdc6: 0x6cbe3e20, 0x2cdc7: 0x6cbe4020, + 0x2cdc8: 0x6cbe4220, 0x2cdc9: 0x6cbe4420, 0x2cdca: 0x6cbe4620, 0x2cdcb: 0x6cbe4820, + 0x2cdcc: 0x6cbe4a20, 0x2cdcd: 0x6cbe4c20, 0x2cdce: 0x6c930220, 0x2cdcf: 0x6cbe4e20, + 0x2cdd0: 0x6ceec620, 0x2cdd1: 0x6cbe5020, 0x2cdd2: 0x6cbe5220, 0x2cdd3: 0x6cbe5420, + 0x2cdd4: 0x6cbe5620, 0x2cdd5: 0x6cbe5820, 0x2cdd6: 0x6cbe5a20, 0x2cdd7: 0x6cbe5c20, + 0x2cdd8: 0x6cbe5e20, 0x2cdd9: 0x6cbe6020, 0x2cdda: 0x6cbe6220, 0x2cddb: 0x6cbe6420, + 0x2cddc: 0x6cbe6620, 0x2cddd: 0x6cbe6820, 0x2cdde: 0x6cbe6a20, 0x2cddf: 0x6cbe6c20, + 0x2cde0: 0x6cbe6e20, 0x2cde1: 0x6cbe7020, 0x2cde2: 0x6cbe7220, 0x2cde3: 0x6cbe7420, + 0x2cde4: 0x6cbe7620, 0x2cde5: 0x6cbe7820, 0x2cde6: 0x6cbe7a20, 0x2cde7: 0x6cbe7c20, + 0x2cde8: 0x6cbe7e20, 0x2cde9: 0x6cbe8020, 0x2cdea: 0x6cbe8220, 0x2cdeb: 0x6cbe8420, + 0x2cdec: 0x6cbe8620, 0x2cded: 0x6cbe8820, 0x2cdee: 0x6cbe8a20, 0x2cdef: 0x6cbe8c20, + 0x2cdf0: 0x6ceec820, 0x2cdf1: 0x6ceeca20, 0x2cdf2: 0x6ceecc20, 0x2cdf3: 0x6ceece20, + 0x2cdf4: 0x6ceed020, 0x2cdf5: 0x6ceed220, 0x2cdf6: 0x6ceed420, 0x2cdf7: 0x6ceed620, + 0x2cdf8: 0x6ceed820, 0x2cdf9: 0x6ceeda20, 0x2cdfa: 0x6ceedc20, 0x2cdfb: 0x6ceede20, + 0x2cdfc: 0x6ceee020, 0x2cdfd: 0x6ceee220, 0x2cdfe: 0x6ceee420, 0x2cdff: 0x6ceee620, + // Block 0xb38, offset 0x2ce00 + 0x2ce00: 0x6ceee820, 0x2ce01: 0x6ceeea20, 0x2ce02: 0x6ceeec20, 0x2ce03: 0x6ceeee20, + 0x2ce04: 0x6ceef020, 0x2ce05: 0x6ceef220, 0x2ce06: 0x6ceef420, 0x2ce07: 0x6ceef620, + 0x2ce08: 0x6ceef820, 0x2ce09: 0x6ceefa20, 0x2ce0a: 0x6ceefc20, 0x2ce0b: 0x6ceefe20, + 0x2ce0c: 0x6cef0020, 0x2ce0d: 0x6cef0220, 0x2ce0e: 0x6cef0420, 0x2ce0f: 0x6cbe8e20, + 0x2ce10: 0x6cef0620, 0x2ce11: 0x6cef0820, 0x2ce12: 0x6cef0a20, 0x2ce13: 0x6cef0c20, + 0x2ce14: 0x6cef0e20, 0x2ce15: 0x6d1e6e20, 0x2ce16: 0x6d1e7020, 0x2ce17: 0x6d1e7220, + 0x2ce18: 0x6d1e7420, 0x2ce19: 0x6d1e7620, 0x2ce1a: 0x6d1e7820, 0x2ce1b: 0x6d1e7a20, + 0x2ce1c: 0x6d1e7c20, 0x2ce1d: 0x6d1e7e20, 0x2ce1e: 0x6d1e8020, 0x2ce1f: 0x6d1e8220, + 0x2ce20: 0x6d1e8420, 0x2ce21: 0x6d1e8620, 0x2ce22: 0x6d1e8820, 0x2ce23: 0x6d1e8a20, + 0x2ce24: 0x6d1e8c20, 0x2ce25: 0x6d1e8e20, 0x2ce26: 0x6d1e9020, 0x2ce27: 0x6d1e9220, + 0x2ce28: 0x6d1e9420, 0x2ce29: 0x6d1e9620, 0x2ce2a: 0x6d1e9820, 0x2ce2b: 0x6d1e9a20, + 0x2ce2c: 0x6d1e9c20, 0x2ce2d: 0x6d1e9e20, 0x2ce2e: 0x6d1ea020, 0x2ce2f: 0x6d1ea220, + 0x2ce30: 0x6d1ea420, 0x2ce31: 0x6d1ea620, 0x2ce32: 0x6d1ea820, 0x2ce33: 0x6d1f2820, + 0x2ce34: 0x6d4bea20, 0x2ce35: 0x6d4bec20, 0x2ce36: 0x6d4bee20, 0x2ce37: 0x6d4bf020, + 0x2ce38: 0x6d4bf220, 0x2ce39: 0x6d4bf420, 0x2ce3a: 0x6d4bf620, 0x2ce3b: 0x6d4bf820, + 0x2ce3c: 0x6d4bfa20, 0x2ce3d: 0x6d4bfc20, 0x2ce3e: 0x6d4bfe20, 0x2ce3f: 0x6d4c0020, + // Block 0xb39, offset 0x2ce40 + 0x2ce40: 0x6d4c0220, 0x2ce41: 0x6d4c0420, 0x2ce42: 0x6d4c0620, 0x2ce43: 0x6d4c0820, + 0x2ce44: 0x6d4c0a20, 0x2ce45: 0x6d4c0c20, 0x2ce46: 0x6d4c0e20, 0x2ce47: 0x6d4c1020, + 0x2ce48: 0x6d4c1220, 0x2ce49: 0x6d4c1420, 0x2ce4a: 0x6d4c1620, 0x2ce4b: 0x6d4c1820, + 0x2ce4c: 0x6d4c1a20, 0x2ce4d: 0x6d4c1c20, 0x2ce4e: 0x6d4c1e20, 0x2ce4f: 0x6d4c2020, + 0x2ce50: 0x6d794220, 0x2ce51: 0x6d794420, 0x2ce52: 0x6d794620, 0x2ce53: 0x6d794820, + 0x2ce54: 0x6d794a20, 0x2ce55: 0x6d794c20, 0x2ce56: 0x6d794e20, 0x2ce57: 0x6d795020, + 0x2ce58: 0x6d795220, 0x2ce59: 0x6d795420, 0x2ce5a: 0x6d795620, 0x2ce5b: 0x6d795820, + 0x2ce5c: 0x6d795a20, 0x2ce5d: 0x6d795c20, 0x2ce5e: 0x6d795e20, 0x2ce5f: 0x6d796020, + 0x2ce60: 0x6d796220, 0x2ce61: 0x6d796420, 0x2ce62: 0x6d796620, 0x2ce63: 0x6da22620, + 0x2ce64: 0x6da22820, 0x2ce65: 0x6da22a20, 0x2ce66: 0x6da22c20, 0x2ce67: 0x6da22e20, + 0x2ce68: 0x6d79de20, 0x2ce69: 0x6da23020, 0x2ce6a: 0x6da23220, 0x2ce6b: 0x6da23420, + 0x2ce6c: 0x6da23620, 0x2ce6d: 0x6da23820, 0x2ce6e: 0x6da23a20, 0x2ce6f: 0x6da23c20, + 0x2ce70: 0x6da23e20, 0x2ce71: 0x6da24020, 0x2ce72: 0x6da24220, 0x2ce73: 0x6da24420, + 0x2ce74: 0x6d796820, 0x2ce75: 0x6da24620, 0x2ce76: 0x6da24820, 0x2ce77: 0x6da24a20, + 0x2ce78: 0x6dc45820, 0x2ce79: 0x6de16220, 0x2ce7a: 0x6dc45a20, 0x2ce7b: 0x6dc45c20, + 0x2ce7c: 0x6dc45e20, 0x2ce7d: 0x6de15820, 0x2ce7e: 0x6de16420, 0x2ce7f: 0x6de16620, + // Block 0xb3a, offset 0x2ce80 + 0x2ce80: 0x6df96220, 0x2ce81: 0x6df96420, 0x2ce82: 0x6df96620, 0x2ce83: 0x6df96820, + 0x2ce84: 0x6df96a20, 0x2ce85: 0x6df96c20, 0x2ce86: 0x6df96e20, 0x2ce87: 0x6e0d2a20, + 0x2ce88: 0x6e0d2c20, 0x2ce89: 0x6e0d2e20, 0x2ce8a: 0x6e1c9a20, 0x2ce8b: 0x6e1c9c20, + 0x2ce8c: 0x6e1c9e20, 0x2ce8d: 0x6e28a620, 0x2ce8e: 0x6e31d820, 0x2ce8f: 0x6e31da20, + 0x2ce90: 0x6c019620, 0x2ce91: 0x6c019820, 0x2ce92: 0x6c019a20, 0x2ce93: 0x6c019c20, + 0x2ce94: 0x6c03f220, 0x2ce95: 0x6c081220, 0x2ce96: 0x6c0fa820, 0x2ce97: 0x6c0faa20, + 0x2ce98: 0x6c0fac20, 0x2ce99: 0x6c0fae20, 0x2ce9a: 0x6c1c6620, 0x2ce9b: 0x6c1c6820, + 0x2ce9c: 0x6c1c6a20, 0x2ce9d: 0x6c1c6c20, 0x2ce9e: 0x6c1c6e20, 0x2ce9f: 0x6c2fca20, + 0x2cea0: 0x6c2fcc20, 0x2cea1: 0x6c2fce20, 0x2cea2: 0x6c2fd020, 0x2cea3: 0x6c2fd220, + 0x2cea4: 0x6c2fd420, 0x2cea5: 0x6c2fd620, 0x2cea6: 0x6c2fd820, 0x2cea7: 0x6c2fda20, + 0x2cea8: 0x6c4a1e20, 0x2cea9: 0x6c4a2020, 0x2ceaa: 0x6c4a2220, 0x2ceab: 0x6c6be020, + 0x2ceac: 0x6c6be220, 0x2cead: 0x6c6be420, 0x2ceae: 0x6c930420, 0x2ceaf: 0x6c930620, + 0x2ceb0: 0x6c930820, 0x2ceb1: 0x6cbf4420, 0x2ceb2: 0x6c930a20, 0x2ceb3: 0x6cbf6220, + 0x2ceb4: 0x6cef7a20, 0x2ceb5: 0x6d1f2a20, 0x2ceb6: 0x6cef9820, 0x2ceb7: 0x6d1f2c20, + 0x2ceb8: 0x6d79e220, 0x2ceb9: 0x6d79e420, 0x2ceba: 0x6da29620, 0x2cebb: 0x6da29820, + 0x2cebc: 0x6de19020, 0x2cebd: 0x6df98620, 0x2cebe: 0x6df98820, 0x2cebf: 0x6e1cb420, + // Block 0xb3b, offset 0x2cec0 + 0x2cec0: 0x6c01a020, 0x2cec1: 0x6c082220, 0x2cec2: 0x6c082420, 0x2cec3: 0x6c082620, + 0x2cec4: 0x6c082820, 0x2cec5: 0x6c0fbc20, 0x2cec6: 0x6c0fbe20, 0x2cec7: 0x6c0fc020, + 0x2cec8: 0x6c0fc220, 0x2cec9: 0x6c0fc420, 0x2ceca: 0x6c1c8e20, 0x2cecb: 0x6c1c9020, + 0x2cecc: 0x6c1c9220, 0x2cecd: 0x6c1c9420, 0x2cece: 0x6c1c9620, 0x2cecf: 0x6c1c9820, + 0x2ced0: 0x6c1c9a20, 0x2ced1: 0x6c1c9c20, 0x2ced2: 0x6c1c9e20, 0x2ced3: 0x6c2ffc20, + 0x2ced4: 0x6c2ffe20, 0x2ced5: 0x6c300020, 0x2ced6: 0x6c300220, 0x2ced7: 0x6c300420, + 0x2ced8: 0x6c300620, 0x2ced9: 0x6c300820, 0x2ceda: 0x6c300a20, 0x2cedb: 0x6c300c20, + 0x2cedc: 0x6c300e20, 0x2cedd: 0x6c301020, 0x2cede: 0x6c301220, 0x2cedf: 0x6c301420, + 0x2cee0: 0x6c301620, 0x2cee1: 0x6c301820, 0x2cee2: 0x6c4a4820, 0x2cee3: 0x6c4a4a20, + 0x2cee4: 0x6c4a4c20, 0x2cee5: 0x6c4a4e20, 0x2cee6: 0x6c4a5020, 0x2cee7: 0x6c6bfe20, + 0x2cee8: 0x6c4a5220, 0x2cee9: 0x6c4a5420, 0x2ceea: 0x6c4a5620, 0x2ceeb: 0x6c4a5820, + 0x2ceec: 0x6c6c0020, 0x2ceed: 0x6c6c0220, 0x2ceee: 0x6c6c0420, 0x2ceef: 0x6c6c0620, + 0x2cef0: 0x6c6c0820, 0x2cef1: 0x6c6c0a20, 0x2cef2: 0x6c6c0c20, 0x2cef3: 0x6c6c0e20, + 0x2cef4: 0x6c6c1020, 0x2cef5: 0x6c6c1220, 0x2cef6: 0x6c6c1420, 0x2cef7: 0x6c6c1620, + 0x2cef8: 0x6c6c1820, 0x2cef9: 0x6c6c1a20, 0x2cefa: 0x6c6c1c20, 0x2cefb: 0x6c6c1e20, + 0x2cefc: 0x6c6c2020, 0x2cefd: 0x6c6c2220, 0x2cefe: 0x6c6c2420, 0x2ceff: 0x6c933020, + // Block 0xb3c, offset 0x2cf00 + 0x2cf00: 0x6c933220, 0x2cf01: 0x6c933420, 0x2cf02: 0x6c933620, 0x2cf03: 0x6c933820, + 0x2cf04: 0x6c933a20, 0x2cf05: 0x6c933c20, 0x2cf06: 0x6c933e20, 0x2cf07: 0x6c934020, + 0x2cf08: 0x6c934220, 0x2cf09: 0x6c934420, 0x2cf0a: 0x6cbf6820, 0x2cf0b: 0x6cbf6a20, + 0x2cf0c: 0x6cbf6c20, 0x2cf0d: 0x6cbf6e20, 0x2cf0e: 0x6cbf7020, 0x2cf0f: 0x6cbf7220, + 0x2cf10: 0x6cbf7420, 0x2cf11: 0x6cbf7620, 0x2cf12: 0x6cbf7820, 0x2cf13: 0x6cbf7a20, + 0x2cf14: 0x6cbf7c20, 0x2cf15: 0x6cbf7e20, 0x2cf16: 0x6cefa420, 0x2cf17: 0x6cefa620, + 0x2cf18: 0x6cefa820, 0x2cf19: 0x6cefaa20, 0x2cf1a: 0x6cefac20, 0x2cf1b: 0x6cefae20, + 0x2cf1c: 0x6cefb020, 0x2cf1d: 0x6cefb220, 0x2cf1e: 0x6d1f4420, 0x2cf1f: 0x6d1f4620, + 0x2cf20: 0x6d1f4820, 0x2cf21: 0x6d1f4a20, 0x2cf22: 0x6d1f4c20, 0x2cf23: 0x6d1f4e20, + 0x2cf24: 0x6d1f5020, 0x2cf25: 0x6d1f5220, 0x2cf26: 0x6d1f5420, 0x2cf27: 0x6d1f5620, + 0x2cf28: 0x6d1f5820, 0x2cf29: 0x6d4cce20, 0x2cf2a: 0x6cbf8020, 0x2cf2b: 0x6d4cd020, + 0x2cf2c: 0x6d4cd220, 0x2cf2d: 0x6d4cd420, 0x2cf2e: 0x6d4cd620, 0x2cf2f: 0x6d79fe20, + 0x2cf30: 0x6d7a0020, 0x2cf31: 0x6da2a020, 0x2cf32: 0x6da2a220, 0x2cf33: 0x6de19a20, + 0x2cf34: 0x6de19c20, 0x2cf35: 0x6de19e20, 0x2cf36: 0x6df99620, 0x2cf37: 0x6e0d4820, + 0x2cf38: 0x6c01a220, 0x2cf39: 0x6c083220, 0x2cf3a: 0x6c0fe220, 0x2cf3b: 0x6c0fe420, + 0x2cf3c: 0x6c0fe620, 0x2cf3d: 0x6c1cbe20, 0x2cf3e: 0x6c1cc020, 0x2cf3f: 0x6c1cc220, + // Block 0xb3d, offset 0x2cf40 + 0x2cf40: 0x6c304620, 0x2cf41: 0x6c4a8e20, 0x2cf42: 0x6c4a9020, 0x2cf43: 0x6c6c7420, + 0x2cf44: 0x6c6c7620, 0x2cf45: 0x6c6c7820, 0x2cf46: 0x6c4a9220, 0x2cf47: 0x6c938220, + 0x2cf48: 0x6c938420, 0x2cf49: 0x6c938620, 0x2cf4a: 0x6cbfd620, 0x2cf4b: 0x6cbfd820, + 0x2cf4c: 0x6cbfda20, 0x2cf4d: 0x6d1fac20, 0x2cf4e: 0x6d4d2220, 0x2cf4f: 0x6c01a820, + 0x2cf50: 0x6c03fc20, 0x2cf51: 0x6c03fe20, 0x2cf52: 0x6c083420, 0x2cf53: 0x6c083620, + 0x2cf54: 0x6c083820, 0x2cf55: 0x6c083a20, 0x2cf56: 0x6c0fec20, 0x2cf57: 0x6c0fee20, + 0x2cf58: 0x6c0ff020, 0x2cf59: 0x6c305820, 0x2cf5a: 0x6c305a20, 0x2cf5b: 0x6c4aa020, + 0x2cf5c: 0x6c4aa220, 0x2cf5d: 0x6c4aa420, 0x2cf5e: 0x6cbfec20, 0x2cf5f: 0x6cf00020, + 0x2cf60: 0x6cf00220, 0x2cf61: 0x6d1fbc20, 0x2cf62: 0x6c01ac20, 0x2cf63: 0x6c040420, + 0x2cf64: 0x6c040620, 0x2cf65: 0x6c0ffc20, 0x2cf66: 0x6c0ffe20, 0x2cf67: 0x6c100020, + 0x2cf68: 0x6c1cd820, 0x2cf69: 0x6c1cda20, 0x2cf6a: 0x6c1cdc20, 0x2cf6b: 0x6c1cde20, + 0x2cf6c: 0x6c1ce020, 0x2cf6d: 0x6c306e20, 0x2cf6e: 0x6c4abe20, 0x2cf6f: 0x6c4ac020, + 0x2cf70: 0x6cc00620, 0x2cf71: 0x6cc00820, 0x2cf72: 0x6cf01620, 0x2cf73: 0x6cf01820, + 0x2cf74: 0x6cf01a20, 0x2cf75: 0x6d4d5020, 0x2cf76: 0x6da2d220, 0x2cf77: 0x6da2d420, + 0x2cf78: 0x6c01b220, 0x2cf79: 0x6c024c20, 0x2cf7a: 0x6c040a20, 0x2cf7b: 0x6c085220, + 0x2cf7c: 0x6c085420, 0x2cf7d: 0x6c100e20, 0x2cf7e: 0x6c1cfa20, 0x2cf7f: 0x6c1cfc20, + // Block 0xb3e, offset 0x2cf80 + 0x2cf80: 0x6c1cfe20, 0x2cf81: 0x6c1d0020, 0x2cf82: 0x6c1d0220, 0x2cf83: 0x6c1d0420, + 0x2cf84: 0x6c308620, 0x2cf85: 0x6c308820, 0x2cf86: 0x6c308a20, 0x2cf87: 0x6c308c20, + 0x2cf88: 0x6c308e20, 0x2cf89: 0x6c309020, 0x2cf8a: 0x6c309220, 0x2cf8b: 0x6c4ad620, + 0x2cf8c: 0x6c4ad820, 0x2cf8d: 0x6c4ada20, 0x2cf8e: 0x6c4adc20, 0x2cf8f: 0x6c4ade20, + 0x2cf90: 0x6c6cae20, 0x2cf91: 0x6c6cb020, 0x2cf92: 0x6c6cb220, 0x2cf93: 0x6c6cb420, + 0x2cf94: 0x6c6cb620, 0x2cf95: 0x6c6cb820, 0x2cf96: 0x6c6cba20, 0x2cf97: 0x6c6cbc20, + 0x2cf98: 0x6c6cbe20, 0x2cf99: 0x6c93d020, 0x2cf9a: 0x6c93d220, 0x2cf9b: 0x6c93d420, + 0x2cf9c: 0x6c93d620, 0x2cf9d: 0x6c93d820, 0x2cf9e: 0x6cc02420, 0x2cf9f: 0x6cc02620, + 0x2cfa0: 0x6c941020, 0x2cfa1: 0x6cc02820, 0x2cfa2: 0x6d1fe020, 0x2cfa3: 0x6d1fe220, + 0x2cfa4: 0x6d4d6220, 0x2cfa5: 0x6d4d6420, 0x2cfa6: 0x6d4d6620, 0x2cfa7: 0x6d4d6820, + 0x2cfa8: 0x6da2da20, 0x2cfa9: 0x6dc4c620, 0x2cfaa: 0x6dc4c820, 0x2cfab: 0x6de1c020, + 0x2cfac: 0x6e0d6420, 0x2cfad: 0x6e31f020, 0x2cfae: 0x6c01b620, 0x2cfaf: 0x6c040e20, + 0x2cfb0: 0x6c102820, 0x2cfb1: 0x6c01ba20, 0x2cfb2: 0x6c041220, 0x2cfb3: 0x6c086c20, + 0x2cfb4: 0x6c086e20, 0x2cfb5: 0x6c087020, 0x2cfb6: 0x6c087220, 0x2cfb7: 0x6c087420, + 0x2cfb8: 0x6c104620, 0x2cfb9: 0x6c104820, 0x2cfba: 0x6c104a20, 0x2cfbb: 0x6c104c20, + 0x2cfbc: 0x6c104e20, 0x2cfbd: 0x6c105020, 0x2cfbe: 0x6c105220, 0x2cfbf: 0x6c105420, + // Block 0xb3f, offset 0x2cfc0 + 0x2cfc0: 0x6c105620, 0x2cfc1: 0x6c105820, 0x2cfc2: 0x6c105a20, 0x2cfc3: 0x6c105c20, + 0x2cfc4: 0x6c1d3c20, 0x2cfc5: 0x6c1d3e20, 0x2cfc6: 0x6c1d4020, 0x2cfc7: 0x6c1d4220, + 0x2cfc8: 0x6c1d4420, 0x2cfc9: 0x6c1d4620, 0x2cfca: 0x6c1d4820, 0x2cfcb: 0x6c1d4a20, + 0x2cfcc: 0x6c1d4c20, 0x2cfcd: 0x6c1dd220, 0x2cfce: 0x6c1d4e20, 0x2cfcf: 0x6c1d5020, + 0x2cfd0: 0x6c1d5220, 0x2cfd1: 0x6c1d5420, 0x2cfd2: 0x6c1d5620, 0x2cfd3: 0x6c1d5820, + 0x2cfd4: 0x6c1d5a20, 0x2cfd5: 0x6c1d5c20, 0x2cfd6: 0x6c1d5e20, 0x2cfd7: 0x6c1d6020, + 0x2cfd8: 0x6c1d6220, 0x2cfd9: 0x6c1d6420, 0x2cfda: 0x6c1d6620, 0x2cfdb: 0x6c1d6820, + 0x2cfdc: 0x6c1d6a20, 0x2cfdd: 0x6c30ce20, 0x2cfde: 0x6c30d020, 0x2cfdf: 0x6c30d220, + 0x2cfe0: 0x6c30d420, 0x2cfe1: 0x6c30d620, 0x2cfe2: 0x6c30d820, 0x2cfe3: 0x6c30da20, + 0x2cfe4: 0x6c30dc20, 0x2cfe5: 0x6c30de20, 0x2cfe6: 0x6c30e020, 0x2cfe7: 0x6c30e220, + 0x2cfe8: 0x6c30e420, 0x2cfe9: 0x6c30e620, 0x2cfea: 0x6c30e820, 0x2cfeb: 0x6c30ea20, + 0x2cfec: 0x6c30ec20, 0x2cfed: 0x6c30ee20, 0x2cfee: 0x6c30f020, 0x2cfef: 0x6c30f220, + 0x2cff0: 0x6c30f420, 0x2cff1: 0x6c30f620, 0x2cff2: 0x6c30f820, 0x2cff3: 0x6c30fa20, + 0x2cff4: 0x6c30fc20, 0x2cff5: 0x6c30fe20, 0x2cff6: 0x6c310020, 0x2cff7: 0x6c310220, + 0x2cff8: 0x6c310420, 0x2cff9: 0x6c310620, 0x2cffa: 0x6c310820, 0x2cffb: 0x6c310a20, + 0x2cffc: 0x6c310c20, 0x2cffd: 0x6c310e20, 0x2cffe: 0x6c311020, 0x2cfff: 0x6c311220, + // Block 0xb40, offset 0x2d000 + 0x2d000: 0x6c311420, 0x2d001: 0x6c311620, 0x2d002: 0x6c311820, 0x2d003: 0x6c311a20, + 0x2d004: 0x6c311c20, 0x2d005: 0x6c311e20, 0x2d006: 0x6c4b2620, 0x2d007: 0x6c4b2820, + 0x2d008: 0x6c4b2a20, 0x2d009: 0x6c4b2c20, 0x2d00a: 0x6c4b2e20, 0x2d00b: 0x6c4b3020, + 0x2d00c: 0x6c4b3220, 0x2d00d: 0x6c4b3420, 0x2d00e: 0x6c4b3620, 0x2d00f: 0x6c4b3820, + 0x2d010: 0x6c4b3a20, 0x2d011: 0x6c4b3c20, 0x2d012: 0x6c4b3e20, 0x2d013: 0x6c4b4020, + 0x2d014: 0x6c4b4220, 0x2d015: 0x6c4b4420, 0x2d016: 0x6c4b4620, 0x2d017: 0x6c4b4820, + 0x2d018: 0x6c4b4a20, 0x2d019: 0x6c4b4c20, 0x2d01a: 0x6c4b4e20, 0x2d01b: 0x6c4b5020, + 0x2d01c: 0x6c4b5220, 0x2d01d: 0x6c4b5420, 0x2d01e: 0x6c4b5620, 0x2d01f: 0x6c4b5820, + 0x2d020: 0x6c4b5a20, 0x2d021: 0x6c4b5c20, 0x2d022: 0x6c4b5e20, 0x2d023: 0x6c4b6020, + 0x2d024: 0x6c4b6220, 0x2d025: 0x6c4b6420, 0x2d026: 0x6c4b6620, 0x2d027: 0x6c4b6820, + 0x2d028: 0x6c6d2020, 0x2d029: 0x6c6d2220, 0x2d02a: 0x6c6d2420, 0x2d02b: 0x6c6d2620, + 0x2d02c: 0x6c6d2820, 0x2d02d: 0x6c6d2a20, 0x2d02e: 0x6c6d2c20, 0x2d02f: 0x6c6d2e20, + 0x2d030: 0x6c6d3020, 0x2d031: 0x6c6d3220, 0x2d032: 0x6c6d3420, 0x2d033: 0x6c6d3620, + 0x2d034: 0x6c6d3820, 0x2d035: 0x6c6d3a20, 0x2d036: 0x6c6d3c20, 0x2d037: 0x6c6d3e20, + 0x2d038: 0x6c4bcc20, 0x2d039: 0x6c6d4020, 0x2d03a: 0x6c6d4220, 0x2d03b: 0x6c6d4420, + 0x2d03c: 0x6c6d4620, 0x2d03d: 0x6c6d4820, 0x2d03e: 0x6c6d4a20, 0x2d03f: 0x6c6d4c20, + // Block 0xb41, offset 0x2d040 + 0x2d040: 0x6c6d4e20, 0x2d041: 0x6c6d5020, 0x2d042: 0x6c6d5220, 0x2d043: 0x6c6d5420, + 0x2d044: 0x6c6d5620, 0x2d045: 0x6c6d5820, 0x2d046: 0x6c943420, 0x2d047: 0x6c943620, + 0x2d048: 0x6c943820, 0x2d049: 0x6c943a20, 0x2d04a: 0x6c943c20, 0x2d04b: 0x6c943e20, + 0x2d04c: 0x6c944020, 0x2d04d: 0x6c944220, 0x2d04e: 0x6c944420, 0x2d04f: 0x6c944620, + 0x2d050: 0x6c944820, 0x2d051: 0x6c944a20, 0x2d052: 0x6c944c20, 0x2d053: 0x6c944e20, + 0x2d054: 0x6c945020, 0x2d055: 0x6c945220, 0x2d056: 0x6c945420, 0x2d057: 0x6c945620, + 0x2d058: 0x6c945820, 0x2d059: 0x6c945a20, 0x2d05a: 0x6c945c20, 0x2d05b: 0x6c945e20, + 0x2d05c: 0x6c946020, 0x2d05d: 0x6c946220, 0x2d05e: 0x6c946420, 0x2d05f: 0x6c946620, + 0x2d060: 0x6c946820, 0x2d061: 0x6c946a20, 0x2d062: 0x6c946c20, 0x2d063: 0x6c946e20, + 0x2d064: 0x6c947020, 0x2d065: 0x6c947220, 0x2d066: 0x6c947420, 0x2d067: 0x6c947620, + 0x2d068: 0x6c947820, 0x2d069: 0x6c947a20, 0x2d06a: 0x6c947c20, 0x2d06b: 0x6c947e20, + 0x2d06c: 0x6c948020, 0x2d06d: 0x6c948220, 0x2d06e: 0x6c948420, 0x2d06f: 0x6c948620, + 0x2d070: 0x6c948820, 0x2d071: 0x6cc08420, 0x2d072: 0x6cc08620, 0x2d073: 0x6cc08820, + 0x2d074: 0x6cc08a20, 0x2d075: 0x6cc08c20, 0x2d076: 0x6cc08e20, 0x2d077: 0x6cc09020, + 0x2d078: 0x6cc09220, 0x2d079: 0x6cc09420, 0x2d07a: 0x6cc09620, 0x2d07b: 0x6cc09820, + 0x2d07c: 0x6cc09a20, 0x2d07d: 0x6cc09c20, 0x2d07e: 0x6cc09e20, 0x2d07f: 0x6cc0a020, + // Block 0xb42, offset 0x2d080 + 0x2d080: 0x6cc0a220, 0x2d081: 0x6cc0a420, 0x2d082: 0x6cc0a620, 0x2d083: 0x6cc0a820, + 0x2d084: 0x6cc0aa20, 0x2d085: 0x6cc0ac20, 0x2d086: 0x6cc0ae20, 0x2d087: 0x6cc0b020, + 0x2d088: 0x6cc0b220, 0x2d089: 0x6cc0b420, 0x2d08a: 0x6cf07a20, 0x2d08b: 0x6cc0b620, + 0x2d08c: 0x6cc0b820, 0x2d08d: 0x6cc0ba20, 0x2d08e: 0x6cc0bc20, 0x2d08f: 0x6cc0be20, + 0x2d090: 0x6cc0c020, 0x2d091: 0x6cc0c220, 0x2d092: 0x6cc0c420, 0x2d093: 0x6cc0c620, + 0x2d094: 0x6cc0c820, 0x2d095: 0x6cc0ca20, 0x2d096: 0x6cc0cc20, 0x2d097: 0x6cc0ce20, + 0x2d098: 0x6cc0d020, 0x2d099: 0x6cc0d220, 0x2d09a: 0x6cc0d420, 0x2d09b: 0x6cc0d620, + 0x2d09c: 0x6cc0d820, 0x2d09d: 0x6cc0da20, 0x2d09e: 0x6cf07c20, 0x2d09f: 0x6cf07e20, + 0x2d0a0: 0x6cf08020, 0x2d0a1: 0x6cf08220, 0x2d0a2: 0x6cf08420, 0x2d0a3: 0x6cf08620, + 0x2d0a4: 0x6cf08820, 0x2d0a5: 0x6cf08a20, 0x2d0a6: 0x6cf08c20, 0x2d0a7: 0x6cf08e20, + 0x2d0a8: 0x6cf09020, 0x2d0a9: 0x6cf09220, 0x2d0aa: 0x6cf09420, 0x2d0ab: 0x6cc16a20, + 0x2d0ac: 0x6cf09620, 0x2d0ad: 0x6cf09820, 0x2d0ae: 0x6cf09a20, 0x2d0af: 0x6cf09c20, + 0x2d0b0: 0x6cf09e20, 0x2d0b1: 0x6cf0a020, 0x2d0b2: 0x6cf0a220, 0x2d0b3: 0x6cf0a420, + 0x2d0b4: 0x6cf0a620, 0x2d0b5: 0x6cf0a820, 0x2d0b6: 0x6cf0aa20, 0x2d0b7: 0x6d201820, + 0x2d0b8: 0x6d201a20, 0x2d0b9: 0x6d201c20, 0x2d0ba: 0x6d201e20, 0x2d0bb: 0x6d202020, + 0x2d0bc: 0x6d202220, 0x2d0bd: 0x6d202420, 0x2d0be: 0x6d202620, 0x2d0bf: 0x6d202820, + // Block 0xb43, offset 0x2d0c0 + 0x2d0c0: 0x6d202a20, 0x2d0c1: 0x6d202c20, 0x2d0c2: 0x6d202e20, 0x2d0c3: 0x6d203020, + 0x2d0c4: 0x6d203220, 0x2d0c5: 0x6d203420, 0x2d0c6: 0x6d203620, 0x2d0c7: 0x6d203820, + 0x2d0c8: 0x6d203a20, 0x2d0c9: 0x6d203c20, 0x2d0ca: 0x6d203e20, 0x2d0cb: 0x6d204020, + 0x2d0cc: 0x6d204220, 0x2d0cd: 0x6d204420, 0x2d0ce: 0x6d204620, 0x2d0cf: 0x6d4dac20, + 0x2d0d0: 0x6d4dae20, 0x2d0d1: 0x6d4db020, 0x2d0d2: 0x6d4db220, 0x2d0d3: 0x6d4db420, + 0x2d0d4: 0x6d4db620, 0x2d0d5: 0x6d4db820, 0x2d0d6: 0x6d4dba20, 0x2d0d7: 0x6d4dbc20, + 0x2d0d8: 0x6d4dbe20, 0x2d0d9: 0x6d4dc020, 0x2d0da: 0x6d4dc220, 0x2d0db: 0x6d4dc420, + 0x2d0dc: 0x6d4dc620, 0x2d0dd: 0x6d4dc820, 0x2d0de: 0x6d4dca20, 0x2d0df: 0x6d4dcc20, + 0x2d0e0: 0x6d4dce20, 0x2d0e1: 0x6d4dd020, 0x2d0e2: 0x6d4dd220, 0x2d0e3: 0x6d4dd420, + 0x2d0e4: 0x6d4dd620, 0x2d0e5: 0x6d4dd820, 0x2d0e6: 0x6d7a6e20, 0x2d0e7: 0x6d7a7020, + 0x2d0e8: 0x6d7a7220, 0x2d0e9: 0x6d7a7420, 0x2d0ea: 0x6d7a7620, 0x2d0eb: 0x6d7a7820, + 0x2d0ec: 0x6d7a7a20, 0x2d0ed: 0x6d7a7c20, 0x2d0ee: 0x6d7a7e20, 0x2d0ef: 0x6d7a8020, + 0x2d0f0: 0x6d7a8220, 0x2d0f1: 0x6d7a8420, 0x2d0f2: 0x6d7a8620, 0x2d0f3: 0x6d7a8820, + 0x2d0f4: 0x6d7a8a20, 0x2d0f5: 0x6d7a8c20, 0x2d0f6: 0x6d7a8e20, 0x2d0f7: 0x6da2ec20, + 0x2d0f8: 0x6da2ee20, 0x2d0f9: 0x6da2f020, 0x2d0fa: 0x6da2f220, 0x2d0fb: 0x6da35220, + 0x2d0fc: 0x6da2f420, 0x2d0fd: 0x6da2f620, 0x2d0fe: 0x6da2f820, 0x2d0ff: 0x6da2fa20, + // Block 0xb44, offset 0x2d100 + 0x2d100: 0x6dc4d620, 0x2d101: 0x6dc4d820, 0x2d102: 0x6dc4da20, 0x2d103: 0x6de1d820, + 0x2d104: 0x6de1da20, 0x2d105: 0x6de1dc20, 0x2d106: 0x6df9b220, 0x2d107: 0x6df9b420, + 0x2d108: 0x6df9b620, 0x2d109: 0x6df9b820, 0x2d10a: 0x6df9ba20, 0x2d10b: 0x6e0d6e20, + 0x2d10c: 0x6df9bc20, 0x2d10d: 0x6e0d7420, 0x2d10e: 0x6e1cd820, 0x2d10f: 0x6e0d7620, + 0x2d110: 0x6e0d7820, 0x2d111: 0x6e1cda20, 0x2d112: 0x6e1cdc20, 0x2d113: 0x6e1cde20, + 0x2d114: 0x6e1ce020, 0x2d115: 0x6e1ce220, 0x2d116: 0x6e28b220, 0x2d117: 0x6e1ce420, + 0x2d118: 0x6e28b420, 0x2d119: 0x6e31f420, 0x2d11a: 0x6e28b620, 0x2d11b: 0x6c01bc20, + 0x2d11c: 0x6c00c620, 0x2d11d: 0x6c01be20, 0x2d11e: 0x6c109420, 0x2d11f: 0x6c109620, + 0x2d120: 0x6c1dd420, 0x2d121: 0x6c272c20, 0x2d122: 0x6c954a20, 0x2d123: 0x6c954c20, + 0x2d124: 0x6d4e4820, 0x2d125: 0x6c01c420, 0x2d126: 0x6c089220, 0x2d127: 0x6c089420, + 0x2d128: 0x6c089620, 0x2d129: 0x6c10a220, 0x2d12a: 0x6c10a420, 0x2d12b: 0x6c1dde20, + 0x2d12c: 0x6c4bda20, 0x2d12d: 0x6c4bdc20, 0x2d12e: 0x6c6dec20, 0x2d12f: 0x6cc17020, + 0x2d130: 0x6cf11020, 0x2d131: 0x6c01c620, 0x2d132: 0x6c01c820, 0x2d133: 0x6c01ca20, + 0x2d134: 0x6c042820, 0x2d135: 0x6c1de620, 0x2d136: 0x6c318a20, 0x2d137: 0x6c4be020, + 0x2d138: 0x6c4be220, 0x2d139: 0x6c4be420, 0x2d13a: 0x6c4be620, 0x2d13b: 0x6c4be820, + 0x2d13c: 0x6c6df220, 0x2d13d: 0x6cc17820, 0x2d13e: 0x6c01cc20, 0x2d13f: 0x6c042c20, + // Block 0xb45, offset 0x2d140 + 0x2d140: 0x6c042e20, 0x2d141: 0x6c043020, 0x2d142: 0x6c08aa20, 0x2d143: 0x6c08ac20, + 0x2d144: 0x6c08ae20, 0x2d145: 0x6c08b020, 0x2d146: 0x6c10b420, 0x2d147: 0x6c10b620, + 0x2d148: 0x6c10b820, 0x2d149: 0x6c1df620, 0x2d14a: 0x6c1df820, 0x2d14b: 0x6c1dfa20, + 0x2d14c: 0x6c1dfc20, 0x2d14d: 0x6c1dfe20, 0x2d14e: 0x6c1e0020, 0x2d14f: 0x6c1e0220, + 0x2d150: 0x6c1e0420, 0x2d151: 0x6c319a20, 0x2d152: 0x6c319c20, 0x2d153: 0x6c319e20, + 0x2d154: 0x6c31a020, 0x2d155: 0x6c31a220, 0x2d156: 0x6c31a420, 0x2d157: 0x6c31a620, + 0x2d158: 0x6c31a820, 0x2d159: 0x6c31aa20, 0x2d15a: 0x6c31ac20, 0x2d15b: 0x6c31ae20, + 0x2d15c: 0x6c31b020, 0x2d15d: 0x6c4bfc20, 0x2d15e: 0x6c4bfe20, 0x2d15f: 0x6c4c0020, + 0x2d160: 0x6c4c0220, 0x2d161: 0x6c4c0420, 0x2d162: 0x6c4c0620, 0x2d163: 0x6c4c0820, + 0x2d164: 0x6c4c0a20, 0x2d165: 0x6c4c0c20, 0x2d166: 0x6c4c0e20, 0x2d167: 0x6c4c1020, + 0x2d168: 0x6c6e0020, 0x2d169: 0x6c6e0220, 0x2d16a: 0x6c6e0420, 0x2d16b: 0x6c6e0620, + 0x2d16c: 0x6c6e0820, 0x2d16d: 0x6c6e0a20, 0x2d16e: 0x6c6e0c20, 0x2d16f: 0x6c6e0e20, + 0x2d170: 0x6c6e1020, 0x2d171: 0x6c6e1220, 0x2d172: 0x6c957020, 0x2d173: 0x6c957220, + 0x2d174: 0x6c957420, 0x2d175: 0x6c957620, 0x2d176: 0x6c957820, 0x2d177: 0x6c957a20, + 0x2d178: 0x6c957c20, 0x2d179: 0x6c957e20, 0x2d17a: 0x6c958020, 0x2d17b: 0x6c958220, + 0x2d17c: 0x6c958420, 0x2d17d: 0x6cc19820, 0x2d17e: 0x6c95ca20, 0x2d17f: 0x6cc19a20, + // Block 0xb46, offset 0x2d180 + 0x2d180: 0x6cc19c20, 0x2d181: 0x6cc19e20, 0x2d182: 0x6cc1a020, 0x2d183: 0x6cc1a220, + 0x2d184: 0x6cc1a420, 0x2d185: 0x6cc1a620, 0x2d186: 0x6cc1a820, 0x2d187: 0x6cc1aa20, + 0x2d188: 0x6cc1f220, 0x2d189: 0x6cc1ac20, 0x2d18a: 0x6cf12420, 0x2d18b: 0x6cf12620, + 0x2d18c: 0x6cf12820, 0x2d18d: 0x6cf12a20, 0x2d18e: 0x6cf12c20, 0x2d18f: 0x6cf12e20, + 0x2d190: 0x6d082820, 0x2d191: 0x6d20c820, 0x2d192: 0x6d20ca20, 0x2d193: 0x6d20cc20, + 0x2d194: 0x6d20ce20, 0x2d195: 0x6d20d020, 0x2d196: 0x6d20d220, 0x2d197: 0x6d20d420, + 0x2d198: 0x6d20d620, 0x2d199: 0x6d20d820, 0x2d19a: 0x6d4e5e20, 0x2d19b: 0x6d20da20, + 0x2d19c: 0x6d4e6020, 0x2d19d: 0x6d4e6220, 0x2d19e: 0x6d4e6420, 0x2d19f: 0x6d4e6620, + 0x2d1a0: 0x6d4e6820, 0x2d1a1: 0x6d4e6a20, 0x2d1a2: 0x6d4e6c20, 0x2d1a3: 0x6d210620, + 0x2d1a4: 0x6d4e6e20, 0x2d1a5: 0x6d4e7020, 0x2d1a6: 0x6d7aee20, 0x2d1a7: 0x6d7af020, + 0x2d1a8: 0x6d7af220, 0x2d1a9: 0x6d4ea820, 0x2d1aa: 0x6da36020, 0x2d1ab: 0x6da36220, + 0x2d1ac: 0x6da36420, 0x2d1ad: 0x6dc51020, 0x2d1ae: 0x6dc51220, 0x2d1af: 0x6d7b1a20, + 0x2d1b0: 0x6de21220, 0x2d1b1: 0x6df9e020, 0x2d1b2: 0x6c01ce20, 0x2d1b3: 0x6c08ba20, + 0x2d1b4: 0x6c10da20, 0x2d1b5: 0x6c10dc20, 0x2d1b6: 0x6c10de20, 0x2d1b7: 0x6c31dc20, + 0x2d1b8: 0x6c31de20, 0x2d1b9: 0x6cf15a20, 0x2d1ba: 0x6c01d220, 0x2d1bb: 0x6c043220, + 0x2d1bc: 0x6c08be20, 0x2d1bd: 0x6c4c5e20, 0x2d1be: 0x6cc20020, 0x2d1bf: 0x6c01d420, + // Block 0xb47, offset 0x2d1c0 + 0x2d1c0: 0x6c08c820, 0x2d1c1: 0x6c08ca20, 0x2d1c2: 0x6c08cc20, 0x2d1c3: 0x6c08ce20, + 0x2d1c4: 0x6c10ea20, 0x2d1c5: 0x6c10ec20, 0x2d1c6: 0x6c10ee20, 0x2d1c7: 0x6c1e4620, + 0x2d1c8: 0x6c1e4820, 0x2d1c9: 0x6c1e4a20, 0x2d1ca: 0x6c1e4c20, 0x2d1cb: 0x6c1e4e20, + 0x2d1cc: 0x6c1e5020, 0x2d1cd: 0x6c1e5220, 0x2d1ce: 0x6c1e5420, 0x2d1cf: 0x6c1e5620, + 0x2d1d0: 0x6c1e5820, 0x2d1d1: 0x6c1e5a20, 0x2d1d2: 0x6c1e5c20, 0x2d1d3: 0x6c1e5e20, + 0x2d1d4: 0x6c1e6020, 0x2d1d5: 0x6c320220, 0x2d1d6: 0x6c320420, 0x2d1d7: 0x6c320620, + 0x2d1d8: 0x6c31f020, 0x2d1d9: 0x6c320820, 0x2d1da: 0x6c320a20, 0x2d1db: 0x6c4c6620, + 0x2d1dc: 0x6c320c20, 0x2d1dd: 0x6c320e20, 0x2d1de: 0x6c321020, 0x2d1df: 0x6c321220, + 0x2d1e0: 0x6c4c7620, 0x2d1e1: 0x6c4c7820, 0x2d1e2: 0x6c4c7a20, 0x2d1e3: 0x6c4c7c20, + 0x2d1e4: 0x6c4c7e20, 0x2d1e5: 0x6c4c8020, 0x2d1e6: 0x6c4c8220, 0x2d1e7: 0x6c6e6a20, + 0x2d1e8: 0x6c6e6c20, 0x2d1e9: 0x6c6e6e20, 0x2d1ea: 0x6c6e7020, 0x2d1eb: 0x6c6e7220, + 0x2d1ec: 0x6c6e7420, 0x2d1ed: 0x6c6e7620, 0x2d1ee: 0x6c6e7820, 0x2d1ef: 0x6c6e7a20, + 0x2d1f0: 0x6c4cac20, 0x2d1f1: 0x6c95e220, 0x2d1f2: 0x6c95e420, 0x2d1f3: 0x6c95e620, + 0x2d1f4: 0x6c95e820, 0x2d1f5: 0x6c95ea20, 0x2d1f6: 0x6c95ec20, 0x2d1f7: 0x6c95ee20, + 0x2d1f8: 0x6c95f020, 0x2d1f9: 0x6c95f220, 0x2d1fa: 0x6c95f420, 0x2d1fb: 0x6c95f620, + 0x2d1fc: 0x6c95f820, 0x2d1fd: 0x6cc20c20, 0x2d1fe: 0x6c965020, 0x2d1ff: 0x6cc20e20, + // Block 0xb48, offset 0x2d200 + 0x2d200: 0x6cc21020, 0x2d201: 0x6cc21220, 0x2d202: 0x6cc21420, 0x2d203: 0x6cc21620, + 0x2d204: 0x6cc26420, 0x2d205: 0x6cf16c20, 0x2d206: 0x6cf16e20, 0x2d207: 0x6cf17020, + 0x2d208: 0x6cf17220, 0x2d209: 0x6cf17420, 0x2d20a: 0x6cc21820, 0x2d20b: 0x6cf17620, + 0x2d20c: 0x6cf17820, 0x2d20d: 0x6d211e20, 0x2d20e: 0x6d212020, 0x2d20f: 0x6d212220, + 0x2d210: 0x6d212420, 0x2d211: 0x6d212620, 0x2d212: 0x6d212820, 0x2d213: 0x6d212a20, + 0x2d214: 0x6d212c20, 0x2d215: 0x6d212e20, 0x2d216: 0x6d213020, 0x2d217: 0x6d213220, + 0x2d218: 0x6d213420, 0x2d219: 0x6d216c20, 0x2d21a: 0x6d4ebc20, 0x2d21b: 0x6d4ebe20, + 0x2d21c: 0x6d216e20, 0x2d21d: 0x6d4ec020, 0x2d21e: 0x6d4ec220, 0x2d21f: 0x6d4ec420, + 0x2d220: 0x6d4ec620, 0x2d221: 0x6d4ec820, 0x2d222: 0x6d4eca20, 0x2d223: 0x6d4ecc20, + 0x2d224: 0x6d4ece20, 0x2d225: 0x6d7b2e20, 0x2d226: 0x6d7b3020, 0x2d227: 0x6d7b3220, + 0x2d228: 0x6d7b3420, 0x2d229: 0x6d7b3620, 0x2d22a: 0x6d7b3820, 0x2d22b: 0x6dc52020, + 0x2d22c: 0x6de23220, 0x2d22d: 0x6de23420, 0x2d22e: 0x6df9ee20, 0x2d22f: 0x6df9f020, + 0x2d230: 0x6df9f220, 0x2d231: 0x6e0da020, 0x2d232: 0x6e1d1220, 0x2d233: 0x6e388020, + 0x2d234: 0x6c01d620, 0x2d235: 0x6c110a20, 0x2d236: 0x6c324220, 0x2d237: 0x6c1e8420, + 0x2d238: 0x6c324620, 0x2d239: 0x6c324820, 0x2d23a: 0x6c4cae20, 0x2d23b: 0x6c4cb020, + 0x2d23c: 0x6c4cb220, 0x2d23d: 0x6c6eba20, 0x2d23e: 0x6c01d820, 0x2d23f: 0x6c043c20, + // Block 0xb49, offset 0x2d240 + 0x2d240: 0x6c043e20, 0x2d241: 0x6c08da20, 0x2d242: 0x6c110e20, 0x2d243: 0x6c1e9020, + 0x2d244: 0x6c1e9220, 0x2d245: 0x6c1e9420, 0x2d246: 0x6c324c20, 0x2d247: 0x6c4cc220, + 0x2d248: 0x6c4cc420, 0x2d249: 0x6c6ec220, 0x2d24a: 0x6d218220, 0x2d24b: 0x6c01dc20, + 0x2d24c: 0x6c044220, 0x2d24d: 0x6c08e020, 0x2d24e: 0x6c111620, 0x2d24f: 0x6c111820, + 0x2d250: 0x6c111a20, 0x2d251: 0x6cc27a20, 0x2d252: 0x6cf1ba20, 0x2d253: 0x6c01e020, + 0x2d254: 0x6c044a20, 0x2d255: 0x6c044c20, 0x2d256: 0x6c044e20, 0x2d257: 0x6c08e220, + 0x2d258: 0x6c08e420, 0x2d259: 0x6c112820, 0x2d25a: 0x6c112a20, 0x2d25b: 0x6c112c20, + 0x2d25c: 0x6c112e20, 0x2d25d: 0x6c1eb620, 0x2d25e: 0x6c1eb820, 0x2d25f: 0x6c1eba20, + 0x2d260: 0x6c1ebc20, 0x2d261: 0x6c326820, 0x2d262: 0x6c326a20, 0x2d263: 0x6c326c20, + 0x2d264: 0x6c326e20, 0x2d265: 0x6c327020, 0x2d266: 0x6c327220, 0x2d267: 0x6c327420, + 0x2d268: 0x6c327620, 0x2d269: 0x6c327820, 0x2d26a: 0x6c327a20, 0x2d26b: 0x6c4cf820, + 0x2d26c: 0x6c4cfa20, 0x2d26d: 0x6c4cfc20, 0x2d26e: 0x6c4cfe20, 0x2d26f: 0x6c4d0020, + 0x2d270: 0x6c6edc20, 0x2d271: 0x6c6ede20, 0x2d272: 0x6c6ee020, 0x2d273: 0x6c6ee220, + 0x2d274: 0x6c966e20, 0x2d275: 0x6c967020, 0x2d276: 0x6c967220, 0x2d277: 0x6c967420, + 0x2d278: 0x6c967620, 0x2d279: 0x6c967820, 0x2d27a: 0x6cc28420, 0x2d27b: 0x6cc28620, + 0x2d27c: 0x6cc28820, 0x2d27d: 0x6cc28a20, 0x2d27e: 0x6cc28c20, 0x2d27f: 0x6cf1c820, + // Block 0xb4a, offset 0x2d280 + 0x2d280: 0x6cf1ca20, 0x2d281: 0x6cf1cc20, 0x2d282: 0x6cf1ce20, 0x2d283: 0x6d218620, + 0x2d284: 0x6d218820, 0x2d285: 0x6d218a20, 0x2d286: 0x6d21a620, 0x2d287: 0x6d4f0c20, + 0x2d288: 0x6d4f0e20, 0x2d289: 0x6d4f1020, 0x2d28a: 0x6d7b6820, 0x2d28b: 0x6d7b6a20, + 0x2d28c: 0x6da3aa20, 0x2d28d: 0x6dc54020, 0x2d28e: 0x6e1d2220, 0x2d28f: 0x6e28ca20, + 0x2d290: 0x6c01e820, 0x2d291: 0x6c01ea20, 0x2d292: 0x6c08f820, 0x2d293: 0x6c114a20, + 0x2d294: 0x6c329c20, 0x2d295: 0x6c329e20, 0x2d296: 0x6c4d2a20, 0x2d297: 0x6c96a020, + 0x2d298: 0x6cc2a620, 0x2d299: 0x6cf1e020, 0x2d29a: 0x6cf1e220, 0x2d29b: 0x6d7b7a20, + 0x2d29c: 0x6d7b7c20, 0x2d29d: 0x6dc54e20, 0x2d29e: 0x6dc55020, 0x2d29f: 0x6de26820, + 0x2d2a0: 0x6e3d2420, 0x2d2a1: 0x6c01ec20, 0x2d2a2: 0x6c1ee020, 0x2d2a3: 0x6c1ee220, + 0x2d2a4: 0x6c1ee420, 0x2d2a5: 0x6c4d3420, 0x2d2a6: 0x6c4d3620, 0x2d2a7: 0x6c6f0020, + 0x2d2a8: 0x6c6f0220, 0x2d2a9: 0x6c96ac20, 0x2d2aa: 0x6cae2020, 0x2d2ab: 0x6c96ae20, + 0x2d2ac: 0x6c96b020, 0x2d2ad: 0x6cc2b220, 0x2d2ae: 0x6cf1ea20, 0x2d2af: 0x6d21b420, + 0x2d2b0: 0x6d21b620, 0x2d2b1: 0x6d4f2820, 0x2d2b2: 0x6e1d2820, 0x2d2b3: 0x6c01ee20, + 0x2d2b4: 0x6c116220, 0x2d2b5: 0x6c116420, 0x2d2b6: 0x6c1eee20, 0x2d2b7: 0x6c1ef020, + 0x2d2b8: 0x6c1ef220, 0x2d2b9: 0x6c1ef420, 0x2d2ba: 0x6c1ef620, 0x2d2bb: 0x6c1ef820, + 0x2d2bc: 0x6c32b820, 0x2d2bd: 0x6c32ba20, 0x2d2be: 0x6c32bc20, 0x2d2bf: 0x6c32be20, + // Block 0xb4b, offset 0x2d2c0 + 0x2d2c0: 0x6c32c020, 0x2d2c1: 0x6c32c220, 0x2d2c2: 0x6c32c420, 0x2d2c3: 0x6c32c620, + 0x2d2c4: 0x6c32c820, 0x2d2c5: 0x6c4d4c20, 0x2d2c6: 0x6c4d4e20, 0x2d2c7: 0x6c4d5020, + 0x2d2c8: 0x6c4d5220, 0x2d2c9: 0x6c4d5420, 0x2d2ca: 0x6c4d5620, 0x2d2cb: 0x6c4d5820, + 0x2d2cc: 0x6c4d5a20, 0x2d2cd: 0x6c4d5c20, 0x2d2ce: 0x6c6f1620, 0x2d2cf: 0x6c6f1820, + 0x2d2d0: 0x6c6f1a20, 0x2d2d1: 0x6c6f1c20, 0x2d2d2: 0x6c6f1e20, 0x2d2d3: 0x6c6f2020, + 0x2d2d4: 0x6c4d5e20, 0x2d2d5: 0x6c6f2220, 0x2d2d6: 0x6c96d220, 0x2d2d7: 0x6c96d420, + 0x2d2d8: 0x6c96d620, 0x2d2d9: 0x6c96d820, 0x2d2da: 0x6cc2ca20, 0x2d2db: 0x6c96da20, + 0x2d2dc: 0x6c96dc20, 0x2d2dd: 0x6c96de20, 0x2d2de: 0x6c96e020, 0x2d2df: 0x6c96e220, + 0x2d2e0: 0x6c96e420, 0x2d2e1: 0x6c96e620, 0x2d2e2: 0x6c96e820, 0x2d2e3: 0x6c96ea20, + 0x2d2e4: 0x6c96ec20, 0x2d2e5: 0x6cc2cc20, 0x2d2e6: 0x6cc2ce20, 0x2d2e7: 0x6cc2d020, + 0x2d2e8: 0x6cc2d220, 0x2d2e9: 0x6cc2d420, 0x2d2ea: 0x6cc2d620, 0x2d2eb: 0x6cc2d820, + 0x2d2ec: 0x6cf1f820, 0x2d2ed: 0x6cf1fa20, 0x2d2ee: 0x6cf1fc20, 0x2d2ef: 0x6cf1fe20, + 0x2d2f0: 0x6cf20020, 0x2d2f1: 0x6d21c220, 0x2d2f2: 0x6d4f3a20, 0x2d2f3: 0x6d21c420, + 0x2d2f4: 0x6d21c620, 0x2d2f5: 0x6d4f3c20, 0x2d2f6: 0x6d220220, 0x2d2f7: 0x6d4f3e20, + 0x2d2f8: 0x6d4f4020, 0x2d2f9: 0x6d4f4220, 0x2d2fa: 0x6d4f4420, 0x2d2fb: 0x6d7b9020, + 0x2d2fc: 0x6d7b9220, 0x2d2fd: 0x6da3c220, 0x2d2fe: 0x6da3c420, 0x2d2ff: 0x6de27420, + // Block 0xb4c, offset 0x2d300 + 0x2d300: 0x6dfa1c20, 0x2d301: 0x6dfa1e20, 0x2d302: 0x6e0dba20, 0x2d303: 0x6c046620, + 0x2d304: 0x6c01f020, 0x2d305: 0x6c090820, 0x2d306: 0x6c046820, 0x2d307: 0x6c090a20, + 0x2d308: 0x6c117020, 0x2d309: 0x6c090c20, 0x2d30a: 0x6c090e20, 0x2d30b: 0x6c117820, + 0x2d30c: 0x6c1f2020, 0x2d30d: 0x6c1f2220, 0x2d30e: 0x6c1f2420, 0x2d30f: 0x6c117a20, + 0x2d310: 0x6c1f2620, 0x2d311: 0x6c1f2820, 0x2d312: 0x6c1f2a20, 0x2d313: 0x6c117c20, + 0x2d314: 0x6c117e20, 0x2d315: 0x6c118020, 0x2d316: 0x6c118220, 0x2d317: 0x6c1f2c20, + 0x2d318: 0x6c1f2e20, 0x2d319: 0x6c118420, 0x2d31a: 0x6c118620, 0x2d31b: 0x6c118820, + 0x2d31c: 0x6c1f3020, 0x2d31d: 0x6c32e620, 0x2d31e: 0x6c32e820, 0x2d31f: 0x6c1f4220, + 0x2d320: 0x6c32ea20, 0x2d321: 0x6c1f4420, 0x2d322: 0x6c32ec20, 0x2d323: 0x6c1f4620, + 0x2d324: 0x6c1f4820, 0x2d325: 0x6c32ee20, 0x2d326: 0x6c1f4a20, 0x2d327: 0x6c1f4c20, + 0x2d328: 0x6c1f4e20, 0x2d329: 0x6c32f020, 0x2d32a: 0x6c1f5020, 0x2d32b: 0x6c1f5220, + 0x2d32c: 0x6c1f5420, 0x2d32d: 0x6c1f5620, 0x2d32e: 0x6c1f5820, 0x2d32f: 0x6c1f5a20, + 0x2d330: 0x6c1f5c20, 0x2d331: 0x6c1f5e20, 0x2d332: 0x6c1f6020, 0x2d333: 0x6c1f6220, + 0x2d334: 0x6c1f6420, 0x2d335: 0x6c32f220, 0x2d336: 0x6c1f6620, 0x2d337: 0x6c1f6820, + 0x2d338: 0x6c1f6a20, 0x2d339: 0x6c1f6c20, 0x2d33a: 0x6c1f6e20, 0x2d33b: 0x6c1f7020, + 0x2d33c: 0x6c1f7220, 0x2d33d: 0x6c32f420, 0x2d33e: 0x6c1f7420, 0x2d33f: 0x6c32f620, + // Block 0xb4d, offset 0x2d340 + 0x2d340: 0x6c1f7620, 0x2d341: 0x6c32f820, 0x2d342: 0x6c32fa20, 0x2d343: 0x6c1f7820, + 0x2d344: 0x6c1f7a20, 0x2d345: 0x6c1f7c20, 0x2d346: 0x6c1f7e20, 0x2d347: 0x6c331020, + 0x2d348: 0x6c331220, 0x2d349: 0x6c331420, 0x2d34a: 0x6c331620, 0x2d34b: 0x6c331820, + 0x2d34c: 0x6c331a20, 0x2d34d: 0x6c331c20, 0x2d34e: 0x6c4d8420, 0x2d34f: 0x6c331e20, + 0x2d350: 0x6c332020, 0x2d351: 0x6c332220, 0x2d352: 0x6c4d8620, 0x2d353: 0x6c332420, + 0x2d354: 0x6c332620, 0x2d355: 0x6c332820, 0x2d356: 0x6c332a20, 0x2d357: 0x6c332c20, + 0x2d358: 0x6c4d8820, 0x2d359: 0x6c332e20, 0x2d35a: 0x6c333020, 0x2d35b: 0x6c333220, + 0x2d35c: 0x6c333420, 0x2d35d: 0x6c4d8a20, 0x2d35e: 0x6c333620, 0x2d35f: 0x6c333820, + 0x2d360: 0x6c4d8c20, 0x2d361: 0x6c333a20, 0x2d362: 0x6c333c20, 0x2d363: 0x6c4d8e20, + 0x2d364: 0x6c4d9020, 0x2d365: 0x6c4d9220, 0x2d366: 0x6c333e20, 0x2d367: 0x6c334020, + 0x2d368: 0x6c4d9420, 0x2d369: 0x6c334220, 0x2d36a: 0x6c334420, 0x2d36b: 0x6c334620, + 0x2d36c: 0x6c334820, 0x2d36d: 0x6c334a20, 0x2d36e: 0x6c334c20, 0x2d36f: 0x6c334e20, + 0x2d370: 0x6c335020, 0x2d371: 0x6c4d9620, 0x2d372: 0x6c335220, 0x2d373: 0x6c335420, + 0x2d374: 0x6c335620, 0x2d375: 0x6c335820, 0x2d376: 0x6c335a20, 0x2d377: 0x6c4d9820, + 0x2d378: 0x6c4d9a20, 0x2d379: 0x6c4d9c20, 0x2d37a: 0x6c335c20, 0x2d37b: 0x6c4d9e20, + 0x2d37c: 0x6c4da020, 0x2d37d: 0x6c335e20, 0x2d37e: 0x6c336020, 0x2d37f: 0x6c336220, + // Block 0xb4e, offset 0x2d380 + 0x2d380: 0x6c4dc020, 0x2d381: 0x6c6f6220, 0x2d382: 0x6c4dc220, 0x2d383: 0x6c4dc420, + 0x2d384: 0x6c4dc620, 0x2d385: 0x6c4dc820, 0x2d386: 0x6c4dca20, 0x2d387: 0x6c4dcc20, + 0x2d388: 0x6c4dce20, 0x2d389: 0x6c4dd020, 0x2d38a: 0x6c4dd220, 0x2d38b: 0x6c6f6420, + 0x2d38c: 0x6c4dd420, 0x2d38d: 0x6c4dd620, 0x2d38e: 0x6c4dd820, 0x2d38f: 0x6c6f6620, + 0x2d390: 0x6c6f6820, 0x2d391: 0x6c4dda20, 0x2d392: 0x6c4ddc20, 0x2d393: 0x6c4dde20, + 0x2d394: 0x6c4de020, 0x2d395: 0x6c6f6a20, 0x2d396: 0x6c6f6c20, 0x2d397: 0x6c4de220, + 0x2d398: 0x6c4de420, 0x2d399: 0x6c6f6e20, 0x2d39a: 0x6c6f7020, 0x2d39b: 0x6c4de620, + 0x2d39c: 0x6c4de820, 0x2d39d: 0x6c6f7220, 0x2d39e: 0x6c4dea20, 0x2d39f: 0x6c4dec20, + 0x2d3a0: 0x6c4dee20, 0x2d3a1: 0x6c4df020, 0x2d3a2: 0x6c4df220, 0x2d3a3: 0x6c6f7420, + 0x2d3a4: 0x6c4df420, 0x2d3a5: 0x6c6f7620, 0x2d3a6: 0x6c4df620, 0x2d3a7: 0x6c6f7820, + 0x2d3a8: 0x6c4df820, 0x2d3a9: 0x6c6f7a20, 0x2d3aa: 0x6c4dfa20, 0x2d3ab: 0x6c4dfc20, + 0x2d3ac: 0x6c4dfe20, 0x2d3ad: 0x6c6f7c20, 0x2d3ae: 0x6c4e0020, 0x2d3af: 0x6c6f7e20, + 0x2d3b0: 0x6c4e0220, 0x2d3b1: 0x6c4e0420, 0x2d3b2: 0x6c4e0620, 0x2d3b3: 0x6c6f8020, + 0x2d3b4: 0x6c6f8220, 0x2d3b5: 0x6c6f8420, 0x2d3b6: 0x6c6f8620, 0x2d3b7: 0x6c6f8820, + 0x2d3b8: 0x6c4e0820, 0x2d3b9: 0x6c4e0a20, 0x2d3ba: 0x6c4e0c20, 0x2d3bb: 0x6c4e0e20, + 0x2d3bc: 0x6c4e1020, 0x2d3bd: 0x6c4e1220, 0x2d3be: 0x6c6f9e20, 0x2d3bf: 0x6c973820, + // Block 0xb4f, offset 0x2d3c0 + 0x2d3c0: 0x6c6fa020, 0x2d3c1: 0x6c6fa220, 0x2d3c2: 0x6c6fa420, 0x2d3c3: 0x6c6fa620, + 0x2d3c4: 0x6c6fa820, 0x2d3c5: 0x6c6faa20, 0x2d3c6: 0x6c973a20, 0x2d3c7: 0x6c6fac20, + 0x2d3c8: 0x6c6fae20, 0x2d3c9: 0x6c973c20, 0x2d3ca: 0x6c973e20, 0x2d3cb: 0x6c6fb020, + 0x2d3cc: 0x6c6fb220, 0x2d3cd: 0x6c6fb420, 0x2d3ce: 0x6c6fb620, 0x2d3cf: 0x6c6fb820, + 0x2d3d0: 0x6c974020, 0x2d3d1: 0x6c6fba20, 0x2d3d2: 0x6c6fbc20, 0x2d3d3: 0x6c6fbe20, + 0x2d3d4: 0x6c6fc020, 0x2d3d5: 0x6c6fc220, 0x2d3d6: 0x6c6fc420, 0x2d3d7: 0x6c6fc620, + 0x2d3d8: 0x6c974220, 0x2d3d9: 0x6c6fc820, 0x2d3da: 0x6c6fca20, 0x2d3db: 0x6c6fcc20, + 0x2d3dc: 0x6c6fce20, 0x2d3dd: 0x6c6fd020, 0x2d3de: 0x6c6fd220, 0x2d3df: 0x6c6fd420, + 0x2d3e0: 0x6c974420, 0x2d3e1: 0x6c974620, 0x2d3e2: 0x6c6fd620, 0x2d3e3: 0x6c974820, + 0x2d3e4: 0x6c974a20, 0x2d3e5: 0x6c974c20, 0x2d3e6: 0x6c6fd820, 0x2d3e7: 0x6c6fda20, + 0x2d3e8: 0x6c974e20, 0x2d3e9: 0x6c6fdc20, 0x2d3ea: 0x6c975020, 0x2d3eb: 0x6c975220, + 0x2d3ec: 0x6c975420, 0x2d3ed: 0x6c6fde20, 0x2d3ee: 0x6c6fe020, 0x2d3ef: 0x6c6fe220, + 0x2d3f0: 0x6c977e20, 0x2d3f1: 0x6c978020, 0x2d3f2: 0x6cc31420, 0x2d3f3: 0x6cc31620, + 0x2d3f4: 0x6c978220, 0x2d3f5: 0x6c978420, 0x2d3f6: 0x6cc31820, 0x2d3f7: 0x6c978620, + 0x2d3f8: 0x6c978820, 0x2d3f9: 0x6cc31a20, 0x2d3fa: 0x6c978a20, 0x2d3fb: 0x6c978c20, + 0x2d3fc: 0x6c978e20, 0x2d3fd: 0x6c979020, 0x2d3fe: 0x6c979220, 0x2d3ff: 0x6c979420, + // Block 0xb50, offset 0x2d400 + 0x2d400: 0x6c979620, 0x2d401: 0x6cc31c20, 0x2d402: 0x6c979820, 0x2d403: 0x6c979a20, + 0x2d404: 0x6cc31e20, 0x2d405: 0x6c979c20, 0x2d406: 0x6c979e20, 0x2d407: 0x6c97a020, + 0x2d408: 0x6c97a220, 0x2d409: 0x6cc32020, 0x2d40a: 0x6c97a420, 0x2d40b: 0x6c97a620, + 0x2d40c: 0x6cc32220, 0x2d40d: 0x6c97a820, 0x2d40e: 0x6cc32420, 0x2d40f: 0x6c97aa20, + 0x2d410: 0x6c97ac20, 0x2d411: 0x6cc32620, 0x2d412: 0x6cc32820, 0x2d413: 0x6c97ae20, + 0x2d414: 0x6c97b020, 0x2d415: 0x6c97b220, 0x2d416: 0x6cc32a20, 0x2d417: 0x6c97b420, + 0x2d418: 0x6c97b620, 0x2d419: 0x6c97b820, 0x2d41a: 0x6c97ba20, 0x2d41b: 0x6c97bc20, + 0x2d41c: 0x6c97be20, 0x2d41d: 0x6c97c020, 0x2d41e: 0x6c97c220, 0x2d41f: 0x6c97c420, + 0x2d420: 0x6cc32c20, 0x2d421: 0x6cc32e20, 0x2d422: 0x6cc33020, 0x2d423: 0x6cc33220, + 0x2d424: 0x6c97c620, 0x2d425: 0x6cc33420, 0x2d426: 0x6c97c820, 0x2d427: 0x6c97ca20, + 0x2d428: 0x6c97cc20, 0x2d429: 0x6cc33620, 0x2d42a: 0x6cc33820, 0x2d42b: 0x6cc33a20, + 0x2d42c: 0x6c97ce20, 0x2d42d: 0x6c97d020, 0x2d42e: 0x6c97d220, 0x2d42f: 0x6c97d420, + 0x2d430: 0x6cc35820, 0x2d431: 0x6cc35a20, 0x2d432: 0x6cc35c20, 0x2d433: 0x6cf24a20, + 0x2d434: 0x6cc35e20, 0x2d435: 0x6cc36020, 0x2d436: 0x6cc36220, 0x2d437: 0x6cf24c20, + 0x2d438: 0x6cc36420, 0x2d439: 0x6cf24e20, 0x2d43a: 0x6cc36620, 0x2d43b: 0x6cc36820, + 0x2d43c: 0x6cc36a20, 0x2d43d: 0x6cc36c20, 0x2d43e: 0x6cc36e20, 0x2d43f: 0x6cc37020, + // Block 0xb51, offset 0x2d440 + 0x2d440: 0x6cc37220, 0x2d441: 0x6cf25020, 0x2d442: 0x6cf25220, 0x2d443: 0x6cc37420, + 0x2d444: 0x6cc37620, 0x2d445: 0x6cc37820, 0x2d446: 0x6cf25420, 0x2d447: 0x6cc37a20, + 0x2d448: 0x6cf25620, 0x2d449: 0x6cc37c20, 0x2d44a: 0x6cc37e20, 0x2d44b: 0x6cc38020, + 0x2d44c: 0x6cc38220, 0x2d44d: 0x6cf25820, 0x2d44e: 0x6cc38420, 0x2d44f: 0x6cf25a20, + 0x2d450: 0x6cc38620, 0x2d451: 0x6cc38820, 0x2d452: 0x6cc38a20, 0x2d453: 0x6cc38c20, + 0x2d454: 0x6cc38e20, 0x2d455: 0x6cc39020, 0x2d456: 0x6cc39220, 0x2d457: 0x6cf25c20, + 0x2d458: 0x6cc39420, 0x2d459: 0x6cf25e20, 0x2d45a: 0x6cf26020, 0x2d45b: 0x6cf26220, + 0x2d45c: 0x6cc39620, 0x2d45d: 0x6cc39820, 0x2d45e: 0x6cc39a20, 0x2d45f: 0x6cf26420, + 0x2d460: 0x6cc39c20, 0x2d461: 0x6cc39e20, 0x2d462: 0x6cc3a020, 0x2d463: 0x6cc3a220, + 0x2d464: 0x6cc3a420, 0x2d465: 0x6cc3a620, 0x2d466: 0x6cc3a820, 0x2d467: 0x6cf27820, + 0x2d468: 0x6d221220, 0x2d469: 0x6cf27a20, 0x2d46a: 0x6cf27c20, 0x2d46b: 0x6cf27e20, + 0x2d46c: 0x6d221420, 0x2d46d: 0x6cf28020, 0x2d46e: 0x6cf28220, 0x2d46f: 0x6cf28420, + 0x2d470: 0x6cf28620, 0x2d471: 0x6cf28820, 0x2d472: 0x6cf28a20, 0x2d473: 0x6d221620, + 0x2d474: 0x6cf28c20, 0x2d475: 0x6cf28e20, 0x2d476: 0x6cf29020, 0x2d477: 0x6cf29220, + 0x2d478: 0x6d221820, 0x2d479: 0x6cf29420, 0x2d47a: 0x6cf29620, 0x2d47b: 0x6d221a20, + 0x2d47c: 0x6cf29820, 0x2d47d: 0x6cf29a20, 0x2d47e: 0x6cf29c20, 0x2d47f: 0x6d221c20, + // Block 0xb52, offset 0x2d480 + 0x2d480: 0x6cf29e20, 0x2d481: 0x6d221e20, 0x2d482: 0x6d222020, 0x2d483: 0x6cf2a020, + 0x2d484: 0x6cf2a220, 0x2d485: 0x6cf2a420, 0x2d486: 0x6cf2a620, 0x2d487: 0x6d222220, + 0x2d488: 0x6d222420, 0x2d489: 0x6cf2a820, 0x2d48a: 0x6cf2aa20, 0x2d48b: 0x6d222620, + 0x2d48c: 0x6cf2ac20, 0x2d48d: 0x6cf2ae20, 0x2d48e: 0x6cf2b020, 0x2d48f: 0x6cf2b220, + 0x2d490: 0x6d222820, 0x2d491: 0x6cf2b420, 0x2d492: 0x6d223c20, 0x2d493: 0x6d223e20, + 0x2d494: 0x6d224020, 0x2d495: 0x6d4f6c20, 0x2d496: 0x6d224220, 0x2d497: 0x6d4f6e20, + 0x2d498: 0x6d224420, 0x2d499: 0x6d4f7020, 0x2d49a: 0x6d224620, 0x2d49b: 0x6d224820, + 0x2d49c: 0x6d4f7220, 0x2d49d: 0x6d4f7420, 0x2d49e: 0x6d224a20, 0x2d49f: 0x6d224c20, + 0x2d4a0: 0x6d224e20, 0x2d4a1: 0x6d225020, 0x2d4a2: 0x6d225220, 0x2d4a3: 0x6d225420, + 0x2d4a4: 0x6d4f7620, 0x2d4a5: 0x6d225620, 0x2d4a6: 0x6d4f7820, 0x2d4a7: 0x6d4f7a20, + 0x2d4a8: 0x6cc3aa20, 0x2d4a9: 0x6d225820, 0x2d4aa: 0x6d225a20, 0x2d4ab: 0x6d4f7c20, + 0x2d4ac: 0x6d225c20, 0x2d4ad: 0x6d4fb020, 0x2d4ae: 0x6d4f7e20, 0x2d4af: 0x6d225e20, + 0x2d4b0: 0x6d4f8020, 0x2d4b1: 0x6d226020, 0x2d4b2: 0x6d226220, 0x2d4b3: 0x6d226420, + 0x2d4b4: 0x6d226620, 0x2d4b5: 0x6d226820, 0x2d4b6: 0x6d4f8220, 0x2d4b7: 0x6d226a20, + 0x2d4b8: 0x6d4f8420, 0x2d4b9: 0x6d4f8620, 0x2d4ba: 0x6d226c20, 0x2d4bb: 0x6d226e20, + 0x2d4bc: 0x6d4f8820, 0x2d4bd: 0x6d227020, 0x2d4be: 0x6d4f8a20, 0x2d4bf: 0x6d4f8c20, + // Block 0xb53, offset 0x2d4c0 + 0x2d4c0: 0x6d227220, 0x2d4c1: 0x6d227420, 0x2d4c2: 0x6d4f8e20, 0x2d4c3: 0x6d4f9020, + 0x2d4c4: 0x6d4f9220, 0x2d4c5: 0x6d4f9420, 0x2d4c6: 0x6d227620, 0x2d4c7: 0x6d4f9620, + 0x2d4c8: 0x6d227820, 0x2d4c9: 0x6d4fb220, 0x2d4ca: 0x6d7bb620, 0x2d4cb: 0x6d4fb420, + 0x2d4cc: 0x6d7bb820, 0x2d4cd: 0x6d4fb620, 0x2d4ce: 0x6d4fb820, 0x2d4cf: 0x6d4fba20, + 0x2d4d0: 0x6d4fbc20, 0x2d4d1: 0x6d7bba20, 0x2d4d2: 0x6d4fbe20, 0x2d4d3: 0x6d4fc020, + 0x2d4d4: 0x6d4fc220, 0x2d4d5: 0x6d4fc420, 0x2d4d6: 0x6d7bbc20, 0x2d4d7: 0x6d7bbe20, + 0x2d4d8: 0x6d4fc620, 0x2d4d9: 0x6d7bc020, 0x2d4da: 0x6d4fc820, 0x2d4db: 0x6d4fca20, + 0x2d4dc: 0x6d4fcc20, 0x2d4dd: 0x6d7bc220, 0x2d4de: 0x6d4fce20, 0x2d4df: 0x6d4fd020, + 0x2d4e0: 0x6d7bc420, 0x2d4e1: 0x6d4fd220, 0x2d4e2: 0x6d4fd420, 0x2d4e3: 0x6d4fd620, + 0x2d4e4: 0x6d4fd820, 0x2d4e5: 0x6d7bc620, 0x2d4e6: 0x6d4fda20, 0x2d4e7: 0x6d4fdc20, + 0x2d4e8: 0x6d7bc820, 0x2d4e9: 0x6d7bca20, 0x2d4ea: 0x6d4fde20, 0x2d4eb: 0x6d4fe020, + 0x2d4ec: 0x6d4fe220, 0x2d4ed: 0x6d4fe420, 0x2d4ee: 0x6d4fe620, 0x2d4ef: 0x6d4fe820, + 0x2d4f0: 0x6d4fea20, 0x2d4f1: 0x6d4fec20, 0x2d4f2: 0x6d7bcc20, 0x2d4f3: 0x6d4fee20, + 0x2d4f4: 0x6d7bd220, 0x2d4f5: 0x6da3d620, 0x2d4f6: 0x6d7bd420, 0x2d4f7: 0x6d7bd620, + 0x2d4f8: 0x6d7bd820, 0x2d4f9: 0x6d7bda20, 0x2d4fa: 0x6d7bdc20, 0x2d4fb: 0x6d7c8e20, + 0x2d4fc: 0x6da3d820, 0x2d4fd: 0x6d7bde20, 0x2d4fe: 0x6d7be020, 0x2d4ff: 0x6d7be220, + // Block 0xb54, offset 0x2d500 + 0x2d500: 0x6d7be420, 0x2d501: 0x6d7be620, 0x2d502: 0x6da3da20, 0x2d503: 0x6da3dc20, + 0x2d504: 0x6d7be820, 0x2d505: 0x6d7bea20, 0x2d506: 0x6d7bec20, 0x2d507: 0x6da3de20, + 0x2d508: 0x6d7bee20, 0x2d509: 0x6da3e020, 0x2d50a: 0x6d7bf020, 0x2d50b: 0x6da3e220, + 0x2d50c: 0x6d7bf220, 0x2d50d: 0x6d7bf420, 0x2d50e: 0x6d7bf620, 0x2d50f: 0x6d7bf820, + 0x2d510: 0x6d7bfa20, 0x2d511: 0x6da3e420, 0x2d512: 0x6d7bfc20, 0x2d513: 0x6d7bfe20, + 0x2d514: 0x6d7c0020, 0x2d515: 0x6dc57e20, 0x2d516: 0x6dc58020, 0x2d517: 0x6da3ea20, + 0x2d518: 0x6dc58220, 0x2d519: 0x6da3ec20, 0x2d51a: 0x6da3ee20, 0x2d51b: 0x6da3f020, + 0x2d51c: 0x6da3f220, 0x2d51d: 0x6da3f420, 0x2d51e: 0x6da3f620, 0x2d51f: 0x6dc58420, + 0x2d520: 0x6da3f820, 0x2d521: 0x6da3fa20, 0x2d522: 0x6da3fc20, 0x2d523: 0x6dc58620, + 0x2d524: 0x6da3fe20, 0x2d525: 0x6da40020, 0x2d526: 0x6da40220, 0x2d527: 0x6da40420, + 0x2d528: 0x6da40620, 0x2d529: 0x6dc58c20, 0x2d52a: 0x6dc58e20, 0x2d52b: 0x6dc59020, + 0x2d52c: 0x6de27e20, 0x2d52d: 0x6dc59220, 0x2d52e: 0x6dc59420, 0x2d52f: 0x6de28020, + 0x2d530: 0x6dc59620, 0x2d531: 0x6dc59820, 0x2d532: 0x6de28220, 0x2d533: 0x6dc59a20, + 0x2d534: 0x6dc59c20, 0x2d535: 0x6de28a20, 0x2d536: 0x6de28c20, 0x2d537: 0x6de28e20, + 0x2d538: 0x6dfa2e20, 0x2d539: 0x6dfa3620, 0x2d53a: 0x6dfa3820, 0x2d53b: 0x6de2de20, + 0x2d53c: 0x6e0dc020, 0x2d53d: 0x6e0dc220, 0x2d53e: 0x6e0dc420, 0x2d53f: 0x6e1d3220, + // Block 0xb55, offset 0x2d540 + 0x2d540: 0x6e28d020, 0x2d541: 0x6e28d220, 0x2d542: 0x6e1d3820, 0x2d543: 0x6e28d420, + 0x2d544: 0x6e28d620, 0x2d545: 0x6e388a20, 0x2d546: 0x6e388c20, 0x2d547: 0x6e429820, + 0x2d548: 0x6c046c20, 0x2d549: 0x6c092020, 0x2d54a: 0x6c092220, 0x2d54b: 0x6c092420, + 0x2d54c: 0x6c11ba20, 0x2d54d: 0x6c11bc20, 0x2d54e: 0x6c11be20, 0x2d54f: 0x6c11c020, + 0x2d550: 0x6c11c220, 0x2d551: 0x6c200020, 0x2d552: 0x6c200220, 0x2d553: 0x6c200420, + 0x2d554: 0x6c33e220, 0x2d555: 0x6c33e420, 0x2d556: 0x6c33e620, 0x2d557: 0x6c33e820, + 0x2d558: 0x6c4ea020, 0x2d559: 0x6c709c20, 0x2d55a: 0x6c98b820, 0x2d55b: 0x6c98ba20, + 0x2d55c: 0x6c98bc20, 0x2d55d: 0x6c98be20, 0x2d55e: 0x6cc49020, 0x2d55f: 0x6cc49220, + 0x2d560: 0x6cf37820, 0x2d561: 0x6cf37a20, 0x2d562: 0x6cf37c20, 0x2d563: 0x6cf37e20, + 0x2d564: 0x6cf38020, 0x2d565: 0x6cf38220, 0x2d566: 0x6cf37420, 0x2d567: 0x6d233420, + 0x2d568: 0x6d233620, 0x2d569: 0x6d233820, 0x2d56a: 0x6d233a20, 0x2d56b: 0x6d233c20, + 0x2d56c: 0x6d233e20, 0x2d56d: 0x6d50c220, 0x2d56e: 0x6d50c420, 0x2d56f: 0x6d50c620, + 0x2d570: 0x6d7c9220, 0x2d571: 0x6d7c9020, 0x2d572: 0x6da46a20, 0x2d573: 0x6dc60020, + 0x2d574: 0x6da46c20, 0x2d575: 0x6e1d5220, 0x2d576: 0x6c046e20, 0x2d577: 0x6c047020, + 0x2d578: 0x6c047220, 0x2d579: 0x6c092c20, 0x2d57a: 0x6c201820, 0x2d57b: 0x6c201a20, + 0x2d57c: 0x6c201c20, 0x2d57d: 0x6c340620, 0x2d57e: 0x6c340820, 0x2d57f: 0x6c340a20, + // Block 0xb56, offset 0x2d580 + 0x2d580: 0x6c340c20, 0x2d581: 0x6c4ecc20, 0x2d582: 0x6c4ece20, 0x2d583: 0x6c4ed020, + 0x2d584: 0x6c70b220, 0x2d585: 0x6c70b420, 0x2d586: 0x6c70b620, 0x2d587: 0x6c70b820, + 0x2d588: 0x6c98d620, 0x2d589: 0x6cc4ae20, 0x2d58a: 0x6cc4b020, 0x2d58b: 0x6c047420, + 0x2d58c: 0x6c01f420, 0x2d58d: 0x6c01f620, 0x2d58e: 0x6c047620, 0x2d58f: 0x6c095020, + 0x2d590: 0x6c093820, 0x2d591: 0x6c093a20, 0x2d592: 0x6c093c20, 0x2d593: 0x6c093e20, + 0x2d594: 0x6c094020, 0x2d595: 0x6c094220, 0x2d596: 0x6c094420, 0x2d597: 0x6c11dc20, + 0x2d598: 0x6c11de20, 0x2d599: 0x6c11e020, 0x2d59a: 0x6c11e220, 0x2d59b: 0x6c11e420, + 0x2d59c: 0x6c11e620, 0x2d59d: 0x6c11e820, 0x2d59e: 0x6c11ea20, 0x2d59f: 0x6c123420, + 0x2d5a0: 0x6c11ec20, 0x2d5a1: 0x6c11ee20, 0x2d5a2: 0x6c11f020, 0x2d5a3: 0x6c11f220, + 0x2d5a4: 0x6c11f420, 0x2d5a5: 0x6c11f620, 0x2d5a6: 0x6c11f820, 0x2d5a7: 0x6c11fa20, + 0x2d5a8: 0x6c11fc20, 0x2d5a9: 0x6c11fe20, 0x2d5aa: 0x6c120020, 0x2d5ab: 0x6c120220, + 0x2d5ac: 0x6c120420, 0x2d5ad: 0x6c203a20, 0x2d5ae: 0x6c203c20, 0x2d5af: 0x6c203e20, + 0x2d5b0: 0x6c204020, 0x2d5b1: 0x6c204220, 0x2d5b2: 0x6c204420, 0x2d5b3: 0x6c204620, + 0x2d5b4: 0x6c204820, 0x2d5b5: 0x6c204a20, 0x2d5b6: 0x6c204c20, 0x2d5b7: 0x6c204e20, + 0x2d5b8: 0x6c211820, 0x2d5b9: 0x6c205020, 0x2d5ba: 0x6c205220, 0x2d5bb: 0x6c205420, + 0x2d5bc: 0x6c205620, 0x2d5bd: 0x6c205820, 0x2d5be: 0x6c205a20, 0x2d5bf: 0x6c341c20, + // Block 0xb57, offset 0x2d5c0 + 0x2d5c0: 0x6c205c20, 0x2d5c1: 0x6c205e20, 0x2d5c2: 0x6c206020, 0x2d5c3: 0x6c206220, + 0x2d5c4: 0x6c206420, 0x2d5c5: 0x6c206620, 0x2d5c6: 0x6c206820, 0x2d5c7: 0x6c206a20, + 0x2d5c8: 0x6c206c20, 0x2d5c9: 0x6c206e20, 0x2d5ca: 0x6c207020, 0x2d5cb: 0x6c207220, + 0x2d5cc: 0x6c207420, 0x2d5cd: 0x6c207620, 0x2d5ce: 0x6c207820, 0x2d5cf: 0x6c207a20, + 0x2d5d0: 0x6c207c20, 0x2d5d1: 0x6c207e20, 0x2d5d2: 0x6c208020, 0x2d5d3: 0x6c208220, + 0x2d5d4: 0x6c208420, 0x2d5d5: 0x6c208620, 0x2d5d6: 0x6c208820, 0x2d5d7: 0x6c208a20, + 0x2d5d8: 0x6c208c20, 0x2d5d9: 0x6c208e20, 0x2d5da: 0x6c209020, 0x2d5db: 0x6c209220, + 0x2d5dc: 0x6c209420, 0x2d5dd: 0x6c209620, 0x2d5de: 0x6c209820, 0x2d5df: 0x6c209a20, + 0x2d5e0: 0x6c209c20, 0x2d5e1: 0x6c209e20, 0x2d5e2: 0x6c20a020, 0x2d5e3: 0x6c20a220, + 0x2d5e4: 0x6c20a420, 0x2d5e5: 0x6c20a620, 0x2d5e6: 0x6c343a20, 0x2d5e7: 0x6c343c20, + 0x2d5e8: 0x6c343e20, 0x2d5e9: 0x6c344020, 0x2d5ea: 0x6c344220, 0x2d5eb: 0x6c344420, + 0x2d5ec: 0x6c344620, 0x2d5ed: 0x6c344820, 0x2d5ee: 0x6c344a20, 0x2d5ef: 0x6c344c20, + 0x2d5f0: 0x6c344e20, 0x2d5f1: 0x6c345020, 0x2d5f2: 0x6c345220, 0x2d5f3: 0x6c345420, + 0x2d5f4: 0x6c345620, 0x2d5f5: 0x6c345820, 0x2d5f6: 0x6c345a20, 0x2d5f7: 0x6c345c20, + 0x2d5f8: 0x6c345e20, 0x2d5f9: 0x6c346020, 0x2d5fa: 0x6c346220, 0x2d5fb: 0x6c346420, + 0x2d5fc: 0x6c346620, 0x2d5fd: 0x6c346820, 0x2d5fe: 0x6c346a20, 0x2d5ff: 0x6c346c20, + // Block 0xb58, offset 0x2d600 + 0x2d600: 0x6c346e20, 0x2d601: 0x6c347020, 0x2d602: 0x6c347220, 0x2d603: 0x6c347420, + 0x2d604: 0x6c347620, 0x2d605: 0x6c347820, 0x2d606: 0x6c347a20, 0x2d607: 0x6c347c20, + 0x2d608: 0x6c347e20, 0x2d609: 0x6c348020, 0x2d60a: 0x6c348220, 0x2d60b: 0x6c348420, + 0x2d60c: 0x6c348620, 0x2d60d: 0x6c348820, 0x2d60e: 0x6c348a20, 0x2d60f: 0x6c4ef420, + 0x2d610: 0x6c348c20, 0x2d611: 0x6c348e20, 0x2d612: 0x6c349020, 0x2d613: 0x6c349220, + 0x2d614: 0x6c349420, 0x2d615: 0x6c349620, 0x2d616: 0x6c349820, 0x2d617: 0x6c349a20, + 0x2d618: 0x6c349c20, 0x2d619: 0x6c349e20, 0x2d61a: 0x6c34a020, 0x2d61b: 0x6c34a220, + 0x2d61c: 0x6c4ef620, 0x2d61d: 0x6c34a420, 0x2d61e: 0x6c34a620, 0x2d61f: 0x6c34a820, + 0x2d620: 0x6c34aa20, 0x2d621: 0x6c34ac20, 0x2d622: 0x6c34ae20, 0x2d623: 0x6c34b020, + 0x2d624: 0x6c34b220, 0x2d625: 0x6c34b420, 0x2d626: 0x6c34b620, 0x2d627: 0x6c34b820, + 0x2d628: 0x6c34ba20, 0x2d629: 0x6c34bc20, 0x2d62a: 0x6c4f1420, 0x2d62b: 0x6c4f1620, + 0x2d62c: 0x6c4f1820, 0x2d62d: 0x6c4f1a20, 0x2d62e: 0x6c4f1c20, 0x2d62f: 0x6c4f1e20, + 0x2d630: 0x6c4f2020, 0x2d631: 0x6c4f2220, 0x2d632: 0x6c70d020, 0x2d633: 0x6c70d220, + 0x2d634: 0x6c4f2420, 0x2d635: 0x6c4f2620, 0x2d636: 0x6c4f2820, 0x2d637: 0x6c4f2a20, + 0x2d638: 0x6c4f2c20, 0x2d639: 0x6c4f2e20, 0x2d63a: 0x6c4f3020, 0x2d63b: 0x6c4f3220, + 0x2d63c: 0x6c4f3420, 0x2d63d: 0x6c4f3620, 0x2d63e: 0x6c4f3820, 0x2d63f: 0x6c70d420, + // Block 0xb59, offset 0x2d640 + 0x2d640: 0x6c4f3a20, 0x2d641: 0x6c4f3c20, 0x2d642: 0x6c4f3e20, 0x2d643: 0x6c4f4020, + 0x2d644: 0x6c4f4220, 0x2d645: 0x6c4f4420, 0x2d646: 0x6c4f4620, 0x2d647: 0x6c4f4820, + 0x2d648: 0x6c70d620, 0x2d649: 0x6c4f4a20, 0x2d64a: 0x6c4f4c20, 0x2d64b: 0x6c4f4e20, + 0x2d64c: 0x6c4f5020, 0x2d64d: 0x6c4f5220, 0x2d64e: 0x6c4f5420, 0x2d64f: 0x6c4f5620, + 0x2d650: 0x6c70d820, 0x2d651: 0x6c4f5820, 0x2d652: 0x6c4f5a20, 0x2d653: 0x6c4f5c20, + 0x2d654: 0x6c4f5e20, 0x2d655: 0x6c4f6020, 0x2d656: 0x6c4f6220, 0x2d657: 0x6c4f6420, + 0x2d658: 0x6c4f6620, 0x2d659: 0x6c70da20, 0x2d65a: 0x6c70dc20, 0x2d65b: 0x6c70de20, + 0x2d65c: 0x6c4f6820, 0x2d65d: 0x6c4f6a20, 0x2d65e: 0x6c4f6c20, 0x2d65f: 0x6c4f6e20, + 0x2d660: 0x6c4f7020, 0x2d661: 0x6c4f7220, 0x2d662: 0x6c4f7420, 0x2d663: 0x6c4f7620, + 0x2d664: 0x6c4f7820, 0x2d665: 0x6c4f7a20, 0x2d666: 0x6c4f7c20, 0x2d667: 0x6c4f7e20, + 0x2d668: 0x6c70ec20, 0x2d669: 0x6c70ee20, 0x2d66a: 0x6c70f020, 0x2d66b: 0x6c70f220, + 0x2d66c: 0x6c70f420, 0x2d66d: 0x6c70f620, 0x2d66e: 0x6c70f820, 0x2d66f: 0x6c70fa20, + 0x2d670: 0x6c70fc20, 0x2d671: 0x6c70fe20, 0x2d672: 0x6c98e420, 0x2d673: 0x6c710020, + 0x2d674: 0x6c710220, 0x2d675: 0x6c710420, 0x2d676: 0x6c710620, 0x2d677: 0x6c710820, + 0x2d678: 0x6c710a20, 0x2d679: 0x6c710c20, 0x2d67a: 0x6c710e20, 0x2d67b: 0x6c98e620, + 0x2d67c: 0x6c711020, 0x2d67d: 0x6c711220, 0x2d67e: 0x6c711420, 0x2d67f: 0x6c711620, + // Block 0xb5a, offset 0x2d680 + 0x2d680: 0x6c711820, 0x2d681: 0x6c711a20, 0x2d682: 0x6c711c20, 0x2d683: 0x6c711e20, + 0x2d684: 0x6c712020, 0x2d685: 0x6c712220, 0x2d686: 0x6c712420, 0x2d687: 0x6c712620, + 0x2d688: 0x6c712820, 0x2d689: 0x6c712a20, 0x2d68a: 0x6c712c20, 0x2d68b: 0x6c712e20, + 0x2d68c: 0x6c713020, 0x2d68d: 0x6c713220, 0x2d68e: 0x6c713420, 0x2d68f: 0x6c713620, + 0x2d690: 0x6c713820, 0x2d691: 0x6c713a20, 0x2d692: 0x6c713c20, 0x2d693: 0x6c713e20, + 0x2d694: 0x6c714020, 0x2d695: 0x6c714220, 0x2d696: 0x6c714420, 0x2d697: 0x6c714620, + 0x2d698: 0x6c714820, 0x2d699: 0x6c714a20, 0x2d69a: 0x6c714c20, 0x2d69b: 0x6c714e20, + 0x2d69c: 0x6c715020, 0x2d69d: 0x6c715220, 0x2d69e: 0x6c715420, 0x2d69f: 0x6c715620, + 0x2d6a0: 0x6c715820, 0x2d6a1: 0x6c715a20, 0x2d6a2: 0x6c715c20, 0x2d6a3: 0x6c715e20, + 0x2d6a4: 0x6c716020, 0x2d6a5: 0x6c990620, 0x2d6a6: 0x6c990820, 0x2d6a7: 0x6c990a20, + 0x2d6a8: 0x6c990c20, 0x2d6a9: 0x6c990e20, 0x2d6aa: 0x6c991020, 0x2d6ab: 0x6c991220, + 0x2d6ac: 0x6c991420, 0x2d6ad: 0x6c991620, 0x2d6ae: 0x6c991820, 0x2d6af: 0x6c991a20, + 0x2d6b0: 0x6c991c20, 0x2d6b1: 0x6c991e20, 0x2d6b2: 0x6c992020, 0x2d6b3: 0x6c992220, + 0x2d6b4: 0x6c992420, 0x2d6b5: 0x6c992620, 0x2d6b6: 0x6c992820, 0x2d6b7: 0x6c992a20, + 0x2d6b8: 0x6c992c20, 0x2d6b9: 0x6c992e20, 0x2d6ba: 0x6c993020, 0x2d6bb: 0x6c993220, + 0x2d6bc: 0x6c993420, 0x2d6bd: 0x6c993620, 0x2d6be: 0x6c993820, 0x2d6bf: 0x6c993a20, + // Block 0xb5b, offset 0x2d6c0 + 0x2d6c0: 0x6c993c20, 0x2d6c1: 0x6c993e20, 0x2d6c2: 0x6c994020, 0x2d6c3: 0x6c994220, + 0x2d6c4: 0x6c994420, 0x2d6c5: 0x6c994620, 0x2d6c6: 0x6c994820, 0x2d6c7: 0x6c994a20, + 0x2d6c8: 0x6c994c20, 0x2d6c9: 0x6c994e20, 0x2d6ca: 0x6c995020, 0x2d6cb: 0x6c995220, + 0x2d6cc: 0x6cc4be20, 0x2d6cd: 0x6c995420, 0x2d6ce: 0x6c995620, 0x2d6cf: 0x6c995820, + 0x2d6d0: 0x6c995a20, 0x2d6d1: 0x6c995c20, 0x2d6d2: 0x6c995e20, 0x2d6d3: 0x6c996020, + 0x2d6d4: 0x6cc4c020, 0x2d6d5: 0x6c996220, 0x2d6d6: 0x6c996420, 0x2d6d7: 0x6c996620, + 0x2d6d8: 0x6c996820, 0x2d6d9: 0x6c996a20, 0x2d6da: 0x6c996c20, 0x2d6db: 0x6c996e20, + 0x2d6dc: 0x6c997020, 0x2d6dd: 0x6c997220, 0x2d6de: 0x6c997420, 0x2d6df: 0x6c997620, + 0x2d6e0: 0x6c997820, 0x2d6e1: 0x6c997a20, 0x2d6e2: 0x6c997c20, 0x2d6e3: 0x6cc4c220, + 0x2d6e4: 0x6c997e20, 0x2d6e5: 0x6c998020, 0x2d6e6: 0x6c998220, 0x2d6e7: 0x6c998420, + 0x2d6e8: 0x6c998620, 0x2d6e9: 0x6c998820, 0x2d6ea: 0x6c998a20, 0x2d6eb: 0x6c998c20, + 0x2d6ec: 0x6c998e20, 0x2d6ed: 0x6c999020, 0x2d6ee: 0x6c999220, 0x2d6ef: 0x6c999420, + 0x2d6f0: 0x6cc4c420, 0x2d6f1: 0x6cc4c620, 0x2d6f2: 0x6c9a9220, 0x2d6f3: 0x6c999620, + 0x2d6f4: 0x6c999820, 0x2d6f5: 0x6c999a20, 0x2d6f6: 0x6c999c20, 0x2d6f7: 0x6c999e20, + 0x2d6f8: 0x6c99a020, 0x2d6f9: 0x6c99a220, 0x2d6fa: 0x6c99a420, 0x2d6fb: 0x6c99a620, + 0x2d6fc: 0x6c99a820, 0x2d6fd: 0x6c99aa20, 0x2d6fe: 0x6cc4e220, 0x2d6ff: 0x6cc4e420, + // Block 0xb5c, offset 0x2d700 + 0x2d700: 0x6cc4e620, 0x2d701: 0x6cc4e820, 0x2d702: 0x6cc4ea20, 0x2d703: 0x6cc4ec20, + 0x2d704: 0x6cc4ee20, 0x2d705: 0x6cf51c20, 0x2d706: 0x6cc4f020, 0x2d707: 0x6cc4f220, + 0x2d708: 0x6cc4f420, 0x2d709: 0x6cc4f620, 0x2d70a: 0x6cc4f820, 0x2d70b: 0x6cc4fa20, + 0x2d70c: 0x6cc4fc20, 0x2d70d: 0x6cc4fe20, 0x2d70e: 0x6cc50020, 0x2d70f: 0x6cc50220, + 0x2d710: 0x6cc50420, 0x2d711: 0x6cc50620, 0x2d712: 0x6cc50820, 0x2d713: 0x6cc50a20, + 0x2d714: 0x6cc50c20, 0x2d715: 0x6cc50e20, 0x2d716: 0x6cc51020, 0x2d717: 0x6cc51220, + 0x2d718: 0x6cc51420, 0x2d719: 0x6cc51620, 0x2d71a: 0x6cc51820, 0x2d71b: 0x6cc51a20, + 0x2d71c: 0x6cc51c20, 0x2d71d: 0x6cc51e20, 0x2d71e: 0x6cc52020, 0x2d71f: 0x6cc52220, + 0x2d720: 0x6cc52420, 0x2d721: 0x6cc52620, 0x2d722: 0x6cc52820, 0x2d723: 0x6cc52a20, + 0x2d724: 0x6c722020, 0x2d725: 0x6cc52c20, 0x2d726: 0x6cc52e20, 0x2d727: 0x6cf3ac20, + 0x2d728: 0x6cc53020, 0x2d729: 0x6cc53220, 0x2d72a: 0x6cc53420, 0x2d72b: 0x6cf3ae20, + 0x2d72c: 0x6cc53620, 0x2d72d: 0x6cc53820, 0x2d72e: 0x6cc53a20, 0x2d72f: 0x6cc53c20, + 0x2d730: 0x6cc53e20, 0x2d731: 0x6cf3b020, 0x2d732: 0x6cc54020, 0x2d733: 0x6cc54220, + 0x2d734: 0x6cc54420, 0x2d735: 0x6cc54620, 0x2d736: 0x6cc54820, 0x2d737: 0x6cc54a20, + 0x2d738: 0x6cc54c20, 0x2d739: 0x6cc54e20, 0x2d73a: 0x6cc55020, 0x2d73b: 0x6cc55220, + 0x2d73c: 0x6cc55420, 0x2d73d: 0x6cc55620, 0x2d73e: 0x6cc55820, 0x2d73f: 0x6cc55a20, + // Block 0xb5d, offset 0x2d740 + 0x2d740: 0x6cc55c20, 0x2d741: 0x6cc55e20, 0x2d742: 0x6cc56020, 0x2d743: 0x6cc56220, + 0x2d744: 0x6cc56420, 0x2d745: 0x6cc56620, 0x2d746: 0x6cf3da20, 0x2d747: 0x6cf3dc20, + 0x2d748: 0x6cf3de20, 0x2d749: 0x6cf3e020, 0x2d74a: 0x6cf3e220, 0x2d74b: 0x6cf3e420, + 0x2d74c: 0x6cf3e620, 0x2d74d: 0x6cf3e820, 0x2d74e: 0x6cf3ea20, 0x2d74f: 0x6cf3ec20, + 0x2d750: 0x6cf3ee20, 0x2d751: 0x6cf3f020, 0x2d752: 0x6cf3f220, 0x2d753: 0x6cf3f420, + 0x2d754: 0x6cf3f620, 0x2d755: 0x6cf3f820, 0x2d756: 0x6cf3fa20, 0x2d757: 0x6cf3fc20, + 0x2d758: 0x6cf3fe20, 0x2d759: 0x6cf40020, 0x2d75a: 0x6cf40220, 0x2d75b: 0x6cf40420, + 0x2d75c: 0x6cf40620, 0x2d75d: 0x6cf40820, 0x2d75e: 0x6cf40a20, 0x2d75f: 0x6cf40c20, + 0x2d760: 0x6cf40e20, 0x2d761: 0x6cf41020, 0x2d762: 0x6cf41220, 0x2d763: 0x6cf41420, + 0x2d764: 0x6cf41620, 0x2d765: 0x6cf41820, 0x2d766: 0x6cf41a20, 0x2d767: 0x6cf41c20, + 0x2d768: 0x6cf41e20, 0x2d769: 0x6cf42020, 0x2d76a: 0x6cf42220, 0x2d76b: 0x6d236a20, + 0x2d76c: 0x6cf42420, 0x2d76d: 0x6cf42620, 0x2d76e: 0x6cf42820, 0x2d76f: 0x6cf42a20, + 0x2d770: 0x6cf42c20, 0x2d771: 0x6cf51e20, 0x2d772: 0x6cf42e20, 0x2d773: 0x6cf43020, + 0x2d774: 0x6d236c20, 0x2d775: 0x6cf43220, 0x2d776: 0x6cf43420, 0x2d777: 0x6cf43620, + 0x2d778: 0x6cf43820, 0x2d779: 0x6cf43a20, 0x2d77a: 0x6cf43c20, 0x2d77b: 0x6d236e20, + 0x2d77c: 0x6cf43e20, 0x2d77d: 0x6cf44020, 0x2d77e: 0x6cf44220, 0x2d77f: 0x6d237020, + // Block 0xb5e, offset 0x2d780 + 0x2d780: 0x6cf44420, 0x2d781: 0x6cf44620, 0x2d782: 0x6cf44820, 0x2d783: 0x6cf44a20, + 0x2d784: 0x6cf44c20, 0x2d785: 0x6cf44e20, 0x2d786: 0x6cf45020, 0x2d787: 0x6cf45220, + 0x2d788: 0x6cf45420, 0x2d789: 0x6cf45620, 0x2d78a: 0x6cf45820, 0x2d78b: 0x6d239a20, + 0x2d78c: 0x6d239c20, 0x2d78d: 0x6d239e20, 0x2d78e: 0x6d23a020, 0x2d78f: 0x6d23a220, + 0x2d790: 0x6d23a420, 0x2d791: 0x6d23a620, 0x2d792: 0x6cc56820, 0x2d793: 0x6d23a820, + 0x2d794: 0x6d23aa20, 0x2d795: 0x6d23ac20, 0x2d796: 0x6d24e620, 0x2d797: 0x6d23ae20, + 0x2d798: 0x6d23b020, 0x2d799: 0x6d23b220, 0x2d79a: 0x6d23b420, 0x2d79b: 0x6d23b620, + 0x2d79c: 0x6d23b820, 0x2d79d: 0x6d23ba20, 0x2d79e: 0x6d23bc20, 0x2d79f: 0x6d23be20, + 0x2d7a0: 0x6d23c020, 0x2d7a1: 0x6cc66e20, 0x2d7a2: 0x6d23c220, 0x2d7a3: 0x6d23c420, + 0x2d7a4: 0x6d23c620, 0x2d7a5: 0x6d23c820, 0x2d7a6: 0x6d23ca20, 0x2d7a7: 0x6d23cc20, + 0x2d7a8: 0x6d510020, 0x2d7a9: 0x6d510220, 0x2d7aa: 0x6d23ce20, 0x2d7ab: 0x6d23d020, + 0x2d7ac: 0x6d23d220, 0x2d7ad: 0x6d23d420, 0x2d7ae: 0x6d510420, 0x2d7af: 0x6d510620, + 0x2d7b0: 0x6d510820, 0x2d7b1: 0x6d23d620, 0x2d7b2: 0x6d23d820, 0x2d7b3: 0x6d23da20, + 0x2d7b4: 0x6d23dc20, 0x2d7b5: 0x6d23de20, 0x2d7b6: 0x6d23e020, 0x2d7b7: 0x6d23e220, + 0x2d7b8: 0x6d23e420, 0x2d7b9: 0x6d510a20, 0x2d7ba: 0x6d23e620, 0x2d7bb: 0x6d23e820, + 0x2d7bc: 0x6d23ea20, 0x2d7bd: 0x6d23ec20, 0x2d7be: 0x6d23ee20, 0x2d7bf: 0x6d23f020, + // Block 0xb5f, offset 0x2d7c0 + 0x2d7c0: 0x6d510c20, 0x2d7c1: 0x6d23f220, 0x2d7c2: 0x6d23f420, 0x2d7c3: 0x6d510e20, + 0x2d7c4: 0x6d23f620, 0x2d7c5: 0x6d512e20, 0x2d7c6: 0x6d513020, 0x2d7c7: 0x6d23f820, + 0x2d7c8: 0x6d513220, 0x2d7c9: 0x6d7cb220, 0x2d7ca: 0x6d513420, 0x2d7cb: 0x6d513620, + 0x2d7cc: 0x6d513820, 0x2d7cd: 0x6d513a20, 0x2d7ce: 0x6d513c20, 0x2d7cf: 0x6d513e20, + 0x2d7d0: 0x6d514020, 0x2d7d1: 0x6d514220, 0x2d7d2: 0x6d514420, 0x2d7d3: 0x6d514620, + 0x2d7d4: 0x6d514820, 0x2d7d5: 0x6d514a20, 0x2d7d6: 0x6d514c20, 0x2d7d7: 0x6d514e20, + 0x2d7d8: 0x6d515020, 0x2d7d9: 0x6d515220, 0x2d7da: 0x6d515420, 0x2d7db: 0x6d515620, + 0x2d7dc: 0x6d515820, 0x2d7dd: 0x6d515a20, 0x2d7de: 0x6d515c20, 0x2d7df: 0x6d515e20, + 0x2d7e0: 0x6d516020, 0x2d7e1: 0x6d516220, 0x2d7e2: 0x6d516420, 0x2d7e3: 0x6d516620, + 0x2d7e4: 0x6d516820, 0x2d7e5: 0x6d516a20, 0x2d7e6: 0x6d24e820, 0x2d7e7: 0x6d516c20, + 0x2d7e8: 0x6d516e20, 0x2d7e9: 0x6d517020, 0x2d7ea: 0x6d517220, 0x2d7eb: 0x6d517420, + 0x2d7ec: 0x6d517620, 0x2d7ed: 0x6d517820, 0x2d7ee: 0x6d517a20, 0x2d7ef: 0x6d517c20, + 0x2d7f0: 0x6d517e20, 0x2d7f1: 0x6d518020, 0x2d7f2: 0x6d518220, 0x2d7f3: 0x6d518420, + 0x2d7f4: 0x6d518620, 0x2d7f5: 0x6d518820, 0x2d7f6: 0x6d518a20, 0x2d7f7: 0x6d518c20, + 0x2d7f8: 0x6d518e20, 0x2d7f9: 0x6d519020, 0x2d7fa: 0x6d519220, 0x2d7fb: 0x6d7cc220, + 0x2d7fc: 0x6d7cc420, 0x2d7fd: 0x6d7cc620, 0x2d7fe: 0x6d7cc820, 0x2d7ff: 0x6d7cca20, + // Block 0xb60, offset 0x2d800 + 0x2d800: 0x6d7ccc20, 0x2d801: 0x6d7cce20, 0x2d802: 0x6d7cd020, 0x2d803: 0x6d7cd220, + 0x2d804: 0x6d7cd420, 0x2d805: 0x6d7cd620, 0x2d806: 0x6d519420, 0x2d807: 0x6d7cd820, + 0x2d808: 0x6d7cda20, 0x2d809: 0x6d7cdc20, 0x2d80a: 0x6da47c20, 0x2d80b: 0x6d7cde20, + 0x2d80c: 0x6d7ce020, 0x2d80d: 0x6d7ce220, 0x2d80e: 0x6da47e20, 0x2d80f: 0x6d7ce420, + 0x2d810: 0x6d7ce620, 0x2d811: 0x6d7ce820, 0x2d812: 0x6d7cea20, 0x2d813: 0x6d7cec20, + 0x2d814: 0x6d7cee20, 0x2d815: 0x6d7cf020, 0x2d816: 0x6d7cf220, 0x2d817: 0x6d7cf420, + 0x2d818: 0x6da48020, 0x2d819: 0x6d7cf620, 0x2d81a: 0x6d7cf820, 0x2d81b: 0x6d7cfa20, + 0x2d81c: 0x6d7cfc20, 0x2d81d: 0x6d7cfe20, 0x2d81e: 0x6d7d0020, 0x2d81f: 0x6da48e20, + 0x2d820: 0x6da49020, 0x2d821: 0x6da49220, 0x2d822: 0x6da49420, 0x2d823: 0x6da49620, + 0x2d824: 0x6da49820, 0x2d825: 0x6dc62620, 0x2d826: 0x6da49a20, 0x2d827: 0x6dc60a20, + 0x2d828: 0x6da49c20, 0x2d829: 0x6da49e20, 0x2d82a: 0x6dc60c20, 0x2d82b: 0x6da4a020, + 0x2d82c: 0x6da4a220, 0x2d82d: 0x6da4a420, 0x2d82e: 0x6da4a620, 0x2d82f: 0x6da4a820, + 0x2d830: 0x6da4aa20, 0x2d831: 0x6da4ac20, 0x2d832: 0x6dc62820, 0x2d833: 0x6d7d9e20, + 0x2d834: 0x6dc62a20, 0x2d835: 0x6dc62c20, 0x2d836: 0x6dc62e20, 0x2d837: 0x6dc63020, + 0x2d838: 0x6dc63220, 0x2d839: 0x6dc63420, 0x2d83a: 0x6dc63620, 0x2d83b: 0x6dc63820, + 0x2d83c: 0x6dc63a20, 0x2d83d: 0x6dc63c20, 0x2d83e: 0x6dc63e20, 0x2d83f: 0x6dc64020, + // Block 0xb61, offset 0x2d840 + 0x2d840: 0x6de2e820, 0x2d841: 0x6dc64220, 0x2d842: 0x6dc64420, 0x2d843: 0x6dc64620, + 0x2d844: 0x6dc64820, 0x2d845: 0x6dc64a20, 0x2d846: 0x6dc64c20, 0x2d847: 0x6de2ee20, + 0x2d848: 0x6de2f020, 0x2d849: 0x6de2f220, 0x2d84a: 0x6de2f420, 0x2d84b: 0x6de2f620, + 0x2d84c: 0x6de2f820, 0x2d84d: 0x6de2fa20, 0x2d84e: 0x6de2fc20, 0x2d84f: 0x6de2fe20, + 0x2d850: 0x6de30020, 0x2d851: 0x6e0dee20, 0x2d852: 0x6de30220, 0x2d853: 0x6dfa6220, + 0x2d854: 0x6dfa6420, 0x2d855: 0x6dfa6620, 0x2d856: 0x6dfa6820, 0x2d857: 0x6dfa6a20, + 0x2d858: 0x6dfa6c20, 0x2d859: 0x6dfa6e20, 0x2d85a: 0x6dfa7020, 0x2d85b: 0x6e0df820, + 0x2d85c: 0x6e0dfa20, 0x2d85d: 0x6e0dfc20, 0x2d85e: 0x6e1d5620, 0x2d85f: 0x6e1d5820, + 0x2d860: 0x6e1d5a20, 0x2d861: 0x6e1d5c20, 0x2d862: 0x6e1d5e20, 0x2d863: 0x6e28f620, + 0x2d864: 0x6e1d6020, 0x2d865: 0x6e28fe20, 0x2d866: 0x6e1d6220, 0x2d867: 0x6e1d6420, + 0x2d868: 0x6e290020, 0x2d869: 0x6e290220, 0x2d86a: 0x6e290420, 0x2d86b: 0x6e290620, + 0x2d86c: 0x6e322620, 0x2d86d: 0x6e322820, 0x2d86e: 0x6e389420, 0x2d86f: 0x6c047e20, + 0x2d870: 0x6c123620, 0x2d871: 0x6c502a20, 0x2d872: 0x6cc67220, 0x2d873: 0x6d7da020, + 0x2d874: 0x6c048020, 0x2d875: 0x6c048220, 0x2d876: 0x6c123a20, 0x2d877: 0x6c123c20, + 0x2d878: 0x6c212020, 0x2d879: 0x6c212220, 0x2d87a: 0x6c212420, 0x2d87b: 0x6c212620, + 0x2d87c: 0x6c212820, 0x2d87d: 0x6c354420, 0x2d87e: 0x6c354620, 0x2d87f: 0x6c503220, + // Block 0xb62, offset 0x2d880 + 0x2d880: 0x6c503c20, 0x2d881: 0x6c503e20, 0x2d882: 0x6c504020, 0x2d883: 0x6c504220, + 0x2d884: 0x6c504420, 0x2d885: 0x6c504620, 0x2d886: 0x6c723c20, 0x2d887: 0x6c723e20, + 0x2d888: 0x6c724020, 0x2d889: 0x6c724220, 0x2d88a: 0x6c724420, 0x2d88b: 0x6c724620, + 0x2d88c: 0x6c724820, 0x2d88d: 0x6c9aac20, 0x2d88e: 0x6c9aae20, 0x2d88f: 0x6c9ab020, + 0x2d890: 0x6c9ab220, 0x2d891: 0x6c9ab420, 0x2d892: 0x6c9ab620, 0x2d893: 0x6c9ab820, + 0x2d894: 0x6c9aba20, 0x2d895: 0x6c9abc20, 0x2d896: 0x6c9abe20, 0x2d897: 0x6c9ac020, + 0x2d898: 0x6c9ac220, 0x2d899: 0x6c9ac420, 0x2d89a: 0x6c9ac620, 0x2d89b: 0x6c9ac820, + 0x2d89c: 0x6cc69a20, 0x2d89d: 0x6c9b1420, 0x2d89e: 0x6cc69c20, 0x2d89f: 0x6cc69e20, + 0x2d8a0: 0x6cc6a020, 0x2d8a1: 0x6cc6a220, 0x2d8a2: 0x6cc6a420, 0x2d8a3: 0x6cc6a620, + 0x2d8a4: 0x6cc6a820, 0x2d8a5: 0x6cc6aa20, 0x2d8a6: 0x6cc6ac20, 0x2d8a7: 0x6cc6ae20, + 0x2d8a8: 0x6cc6b020, 0x2d8a9: 0x6cc6b220, 0x2d8aa: 0x6cc6b420, 0x2d8ab: 0x6cf53620, + 0x2d8ac: 0x6cf53820, 0x2d8ad: 0x6cf52a20, 0x2d8ae: 0x6cf53a20, 0x2d8af: 0x6cf53c20, + 0x2d8b0: 0x6cf53e20, 0x2d8b1: 0x6d24f820, 0x2d8b2: 0x6d24fa20, 0x2d8b3: 0x6d24fc20, + 0x2d8b4: 0x6d7dac20, 0x2d8b5: 0x6d527820, 0x2d8b6: 0x6d527a20, 0x2d8b7: 0x6d527c20, + 0x2d8b8: 0x6d527e20, 0x2d8b9: 0x6d528020, 0x2d8ba: 0x6d528220, 0x2d8bb: 0x6d528420, + 0x2d8bc: 0x6d7db620, 0x2d8bd: 0x6d7db820, 0x2d8be: 0x6d7dba20, 0x2d8bf: 0x6d7dbc20, + // Block 0xb63, offset 0x2d8c0 + 0x2d8c0: 0x6da51420, 0x2d8c1: 0x6da51620, 0x2d8c2: 0x6da51820, 0x2d8c3: 0x6da53e20, + 0x2d8c4: 0x6de35a20, 0x2d8c5: 0x6dfab420, 0x2d8c6: 0x6dfab620, 0x2d8c7: 0x6c048420, + 0x2d8c8: 0x6c213c20, 0x2d8c9: 0x6c357620, 0x2d8ca: 0x6c728e20, 0x2d8cb: 0x6c729020, + 0x2d8cc: 0x6cc70220, 0x2d8cd: 0x6c9b1620, 0x2d8ce: 0x6c9b1820, 0x2d8cf: 0x6c9b1a20, + 0x2d8d0: 0x6cc70420, 0x2d8d1: 0x6cc70620, 0x2d8d2: 0x6cf58e20, 0x2d8d3: 0x6d7e0420, + 0x2d8d4: 0x6dc6dc20, 0x2d8d5: 0x6e0e3c20, 0x2d8d6: 0x6e292620, 0x2d8d7: 0x6c048620, + 0x2d8d8: 0x6c214220, 0x2d8d9: 0x6c729c20, 0x2d8da: 0x6c729e20, 0x2d8db: 0x6c9b2a20, + 0x2d8dc: 0x6c9b2c20, 0x2d8dd: 0x6cc71620, 0x2d8de: 0x6cc72220, 0x2d8df: 0x6cf59820, + 0x2d8e0: 0x6d254820, 0x2d8e1: 0x6d254a20, 0x2d8e2: 0x6d7e0a20, 0x2d8e3: 0x6da54420, + 0x2d8e4: 0x6c048a20, 0x2d8e5: 0x6c095220, 0x2d8e6: 0x6c358a20, 0x2d8e7: 0x6c358c20, + 0x2d8e8: 0x6c358e20, 0x2d8e9: 0x6c359020, 0x2d8ea: 0x6c508620, 0x2d8eb: 0x6c508820, + 0x2d8ec: 0x6c9b3820, 0x2d8ed: 0x6c9b3a20, 0x2d8ee: 0x6cc72620, 0x2d8ef: 0x6cc72820, + 0x2d8f0: 0x6cf5a220, 0x2d8f1: 0x6cc74220, 0x2d8f2: 0x6d255820, 0x2d8f3: 0x6d52d820, + 0x2d8f4: 0x6d7e0c20, 0x2d8f5: 0x6da54c20, 0x2d8f6: 0x6da54e20, 0x2d8f7: 0x6dc6e020, + 0x2d8f8: 0x6e38a220, 0x2d8f9: 0x6c048e20, 0x2d8fa: 0x6c35a020, 0x2d8fb: 0x6c35a220, + 0x2d8fc: 0x6c35a420, 0x2d8fd: 0x6c509020, 0x2d8fe: 0x6c509220, 0x2d8ff: 0x6c509420, + // Block 0xb64, offset 0x2d900 + 0x2d900: 0x6c509620, 0x2d901: 0x6c72bc20, 0x2d902: 0x6c72be20, 0x2d903: 0x6c72c020, + 0x2d904: 0x6c72c220, 0x2d905: 0x6c72c420, 0x2d906: 0x6c72c620, 0x2d907: 0x6c9b4820, + 0x2d908: 0x6c9b4a20, 0x2d909: 0x6c9b4c20, 0x2d90a: 0x6c72c820, 0x2d90b: 0x6c9b4e20, + 0x2d90c: 0x6c9b5020, 0x2d90d: 0x6c9b5220, 0x2d90e: 0x6c9b5420, 0x2d90f: 0x6c9b5620, + 0x2d910: 0x6cc74620, 0x2d911: 0x6cc74820, 0x2d912: 0x6cf5b620, 0x2d913: 0x6cf5b820, + 0x2d914: 0x6cf5ba20, 0x2d915: 0x6cf5bc20, 0x2d916: 0x6d256420, 0x2d917: 0x6d256620, + 0x2d918: 0x6d7e1c20, 0x2d919: 0x6d7e1e20, 0x2d91a: 0x6da55a20, 0x2d91b: 0x6dc6ec20, + 0x2d91c: 0x6de37820, 0x2d91d: 0x6de37a20, 0x2d91e: 0x6de37c20, 0x2d91f: 0x6dfad820, + 0x2d920: 0x6c049020, 0x2d921: 0x6c049220, 0x2d922: 0x6c50ac20, 0x2d923: 0x6c9b6e20, + 0x2d924: 0x6cf5ce20, 0x2d925: 0x6c049620, 0x2d926: 0x6c095420, 0x2d927: 0x6c095620, + 0x2d928: 0x6c125020, 0x2d929: 0x6c125220, 0x2d92a: 0x6c125420, 0x2d92b: 0x6c125620, + 0x2d92c: 0x6c125820, 0x2d92d: 0x6c125a20, 0x2d92e: 0x6c125c20, 0x2d92f: 0x6c125e20, + 0x2d930: 0x6c215c20, 0x2d931: 0x6c215e20, 0x2d932: 0x6c216020, 0x2d933: 0x6c216220, + 0x2d934: 0x6c216420, 0x2d935: 0x6c216620, 0x2d936: 0x6c216820, 0x2d937: 0x6c216a20, + 0x2d938: 0x6c216c20, 0x2d939: 0x6c35b620, 0x2d93a: 0x6c35b820, 0x2d93b: 0x6c35ba20, + 0x2d93c: 0x6c35bc20, 0x2d93d: 0x6c35be20, 0x2d93e: 0x6c35c020, 0x2d93f: 0x6c35c220, + // Block 0xb65, offset 0x2d940 + 0x2d940: 0x6c35c420, 0x2d941: 0x6c35c620, 0x2d942: 0x6c35c820, 0x2d943: 0x6c35ca20, + 0x2d944: 0x6c35cc20, 0x2d945: 0x6c35ce20, 0x2d946: 0x6c35d020, 0x2d947: 0x6c35d220, + 0x2d948: 0x6c35d420, 0x2d949: 0x6c35d620, 0x2d94a: 0x6c35d820, 0x2d94b: 0x6c35da20, + 0x2d94c: 0x6c35dc20, 0x2d94d: 0x6c35de20, 0x2d94e: 0x6c35e020, 0x2d94f: 0x6c35e220, + 0x2d950: 0x6c35e420, 0x2d951: 0x6c35e620, 0x2d952: 0x6c35e820, 0x2d953: 0x6c35ea20, + 0x2d954: 0x6c35ec20, 0x2d955: 0x6c35ee20, 0x2d956: 0x6c35f020, 0x2d957: 0x6c35f220, + 0x2d958: 0x6c35f420, 0x2d959: 0x6c35f620, 0x2d95a: 0x6c50c420, 0x2d95b: 0x6c50c620, + 0x2d95c: 0x6c50c820, 0x2d95d: 0x6c50ca20, 0x2d95e: 0x6c50cc20, 0x2d95f: 0x6c50ce20, + 0x2d960: 0x6c50d020, 0x2d961: 0x6c50d220, 0x2d962: 0x6c50d420, 0x2d963: 0x6c50d620, + 0x2d964: 0x6c50d820, 0x2d965: 0x6c50da20, 0x2d966: 0x6c50dc20, 0x2d967: 0x6c50de20, + 0x2d968: 0x6c50e020, 0x2d969: 0x6c50e220, 0x2d96a: 0x6c50e420, 0x2d96b: 0x6c50e620, + 0x2d96c: 0x6c50e820, 0x2d96d: 0x6c50ea20, 0x2d96e: 0x6c50ec20, 0x2d96f: 0x6c50ee20, + 0x2d970: 0x6c50f020, 0x2d971: 0x6c50f220, 0x2d972: 0x6c50f420, 0x2d973: 0x6c50f620, + 0x2d974: 0x6c50f820, 0x2d975: 0x6c50fa20, 0x2d976: 0x6c50fc20, 0x2d977: 0x6c50fe20, + 0x2d978: 0x6c510020, 0x2d979: 0x6c510220, 0x2d97a: 0x6c510420, 0x2d97b: 0x6c510620, + 0x2d97c: 0x6c510820, 0x2d97d: 0x6c510a20, 0x2d97e: 0x6c510c20, 0x2d97f: 0x6c510e20, + // Block 0xb66, offset 0x2d980 + 0x2d980: 0x6c730420, 0x2d981: 0x6c730620, 0x2d982: 0x6c730820, 0x2d983: 0x6c730a20, + 0x2d984: 0x6c730c20, 0x2d985: 0x6c730e20, 0x2d986: 0x6c731020, 0x2d987: 0x6c731220, + 0x2d988: 0x6c731420, 0x2d989: 0x6c731620, 0x2d98a: 0x6c731820, 0x2d98b: 0x6c731a20, + 0x2d98c: 0x6c731c20, 0x2d98d: 0x6c731e20, 0x2d98e: 0x6c732020, 0x2d98f: 0x6c732220, + 0x2d990: 0x6c732420, 0x2d991: 0x6c732620, 0x2d992: 0x6c732820, 0x2d993: 0x6c732a20, + 0x2d994: 0x6c732c20, 0x2d995: 0x6c732e20, 0x2d996: 0x6c733020, 0x2d997: 0x6c9b7e20, + 0x2d998: 0x6c9b8020, 0x2d999: 0x6c9b8220, 0x2d99a: 0x6c9b8420, 0x2d99b: 0x6c9b8620, + 0x2d99c: 0x6c9b8820, 0x2d99d: 0x6c9b8a20, 0x2d99e: 0x6c9b8c20, 0x2d99f: 0x6c738c20, + 0x2d9a0: 0x6c738e20, 0x2d9a1: 0x6c9b8e20, 0x2d9a2: 0x6c9b9020, 0x2d9a3: 0x6c9b9220, + 0x2d9a4: 0x6c9b9420, 0x2d9a5: 0x6c9b9620, 0x2d9a6: 0x6c9b9820, 0x2d9a7: 0x6c9b9a20, + 0x2d9a8: 0x6c9b9c20, 0x2d9a9: 0x6c9b9e20, 0x2d9aa: 0x6cc78620, 0x2d9ab: 0x6cc78820, + 0x2d9ac: 0x6cc78a20, 0x2d9ad: 0x6cc78c20, 0x2d9ae: 0x6cc78e20, 0x2d9af: 0x6cc79020, + 0x2d9b0: 0x6cc79220, 0x2d9b1: 0x6cc79420, 0x2d9b2: 0x6cc79620, 0x2d9b3: 0x6cc79820, + 0x2d9b4: 0x6cc79a20, 0x2d9b5: 0x6cc79c20, 0x2d9b6: 0x6cc79e20, 0x2d9b7: 0x6cc7a020, + 0x2d9b8: 0x6cf5d620, 0x2d9b9: 0x6cc7a220, 0x2d9ba: 0x6cc7a420, 0x2d9bb: 0x6cc7a620, + 0x2d9bc: 0x6cc7a820, 0x2d9bd: 0x6cc7aa20, 0x2d9be: 0x6cc7ac20, 0x2d9bf: 0x6cc7ae20, + // Block 0xb67, offset 0x2d9c0 + 0x2d9c0: 0x6cc7b020, 0x2d9c1: 0x6cc7b220, 0x2d9c2: 0x6cc7b420, 0x2d9c3: 0x6cc7b620, + 0x2d9c4: 0x6cf5f020, 0x2d9c5: 0x6cf5f220, 0x2d9c6: 0x6cf5f420, 0x2d9c7: 0x6cf5f620, + 0x2d9c8: 0x6cf5f820, 0x2d9c9: 0x6cf5fa20, 0x2d9ca: 0x6cf5fc20, 0x2d9cb: 0x6cf5fe20, + 0x2d9cc: 0x6cf60020, 0x2d9cd: 0x6cf60220, 0x2d9ce: 0x6cf60420, 0x2d9cf: 0x6cf60620, + 0x2d9d0: 0x6cf60820, 0x2d9d1: 0x6cc7b820, 0x2d9d2: 0x6cf60a20, 0x2d9d3: 0x6cf60c20, + 0x2d9d4: 0x6cf60e20, 0x2d9d5: 0x6cf61020, 0x2d9d6: 0x6cf61220, 0x2d9d7: 0x6cf61420, + 0x2d9d8: 0x6cf61620, 0x2d9d9: 0x6cf61820, 0x2d9da: 0x6d257e20, 0x2d9db: 0x6d258020, + 0x2d9dc: 0x6d258220, 0x2d9dd: 0x6d258420, 0x2d9de: 0x6d258620, 0x2d9df: 0x6d258820, + 0x2d9e0: 0x6d258a20, 0x2d9e1: 0x6d258c20, 0x2d9e2: 0x6d258e20, 0x2d9e3: 0x6d259020, + 0x2d9e4: 0x6d259220, 0x2d9e5: 0x6d259420, 0x2d9e6: 0x6d259620, 0x2d9e7: 0x6d259820, + 0x2d9e8: 0x6d259a20, 0x2d9e9: 0x6d530020, 0x2d9ea: 0x6d530220, 0x2d9eb: 0x6d530420, + 0x2d9ec: 0x6d530620, 0x2d9ed: 0x6d530820, 0x2d9ee: 0x6d530a20, 0x2d9ef: 0x6d530c20, + 0x2d9f0: 0x6d530e20, 0x2d9f1: 0x6d531020, 0x2d9f2: 0x6d531220, 0x2d9f3: 0x6d531420, + 0x2d9f4: 0x6d531620, 0x2d9f5: 0x6d531820, 0x2d9f6: 0x6d531a20, 0x2d9f7: 0x6d531c20, + 0x2d9f8: 0x6d7e4420, 0x2d9f9: 0x6d7e4620, 0x2d9fa: 0x6d7e4820, 0x2d9fb: 0x6d7e4a20, + 0x2d9fc: 0x6d537220, 0x2d9fd: 0x6d7e4c20, 0x2d9fe: 0x6d7e4e20, 0x2d9ff: 0x6d7e5020, + // Block 0xb68, offset 0x2da00 + 0x2da00: 0x6d7e5220, 0x2da01: 0x6d7e5420, 0x2da02: 0x6d7e5620, 0x2da03: 0x6d7e5820, + 0x2da04: 0x6d7e5a20, 0x2da05: 0x6d7e5c20, 0x2da06: 0x6d7e5e20, 0x2da07: 0x6d7e6020, + 0x2da08: 0x6d7e6220, 0x2da09: 0x6d7e6420, 0x2da0a: 0x6d7e6620, 0x2da0b: 0x6d7e6820, + 0x2da0c: 0x6d7e6a20, 0x2da0d: 0x6d7e6c20, 0x2da0e: 0x6da56420, 0x2da0f: 0x6d7ed220, + 0x2da10: 0x6da56620, 0x2da11: 0x6da56820, 0x2da12: 0x6da56a20, 0x2da13: 0x6da56c20, + 0x2da14: 0x6da56e20, 0x2da15: 0x6da57020, 0x2da16: 0x6da57220, 0x2da17: 0x6da57420, + 0x2da18: 0x6dc70620, 0x2da19: 0x6da5a820, 0x2da1a: 0x6da57620, 0x2da1b: 0x6dc70820, + 0x2da1c: 0x6dc70a20, 0x2da1d: 0x6de38820, 0x2da1e: 0x6de38a20, 0x2da1f: 0x6de38c20, + 0x2da20: 0x6de38e20, 0x2da21: 0x6de39020, 0x2da22: 0x6de39220, 0x2da23: 0x6dfae020, + 0x2da24: 0x6dfae220, 0x2da25: 0x6dfae420, 0x2da26: 0x6dfae620, 0x2da27: 0x6dfae820, + 0x2da28: 0x6dfaea20, 0x2da29: 0x6e0e4620, 0x2da2a: 0x6e293020, 0x2da2b: 0x6e293220, + 0x2da2c: 0x6e293420, 0x2da2d: 0x6e324a20, 0x2da2e: 0x6e324c20, 0x2da2f: 0x6e38a820, + 0x2da30: 0x6c049820, 0x2da31: 0x6c095e20, 0x2da32: 0x6c127020, 0x2da33: 0x6c127220, + 0x2da34: 0x6c219c20, 0x2da35: 0x6c219e20, 0x2da36: 0x6c364020, 0x2da37: 0x6c515c20, + 0x2da38: 0x6c739020, 0x2da39: 0x6c9c0a20, 0x2da3a: 0x6c739220, 0x2da3b: 0x6c73a820, + 0x2da3c: 0x6c9c0c20, 0x2da3d: 0x6c9ba020, 0x2da3e: 0x6cc84a20, 0x2da3f: 0x6cc84c20, + // Block 0xb69, offset 0x2da40 + 0x2da40: 0x6cb8f420, 0x2da41: 0x6cc84e20, 0x2da42: 0x6cc85020, 0x2da43: 0x6cf68820, + 0x2da44: 0x6d25f820, 0x2da45: 0x6d25fa20, 0x2da46: 0x6d7ed620, 0x2da47: 0x6e0e5820, + 0x2da48: 0x6c049c20, 0x2da49: 0x6c127420, 0x2da4a: 0x6c364c20, 0x2da4b: 0x6c364e20, + 0x2da4c: 0x6c365020, 0x2da4d: 0x6c365220, 0x2da4e: 0x6c516c20, 0x2da4f: 0x6c516e20, + 0x2da50: 0x6c517020, 0x2da51: 0x6c517220, 0x2da52: 0x6c73ae20, 0x2da53: 0x6c73b020, + 0x2da54: 0x6c73b220, 0x2da55: 0x6c73b420, 0x2da56: 0x6c9c1a20, 0x2da57: 0x6c73be20, + 0x2da58: 0x6c9c1c20, 0x2da59: 0x6c9c1e20, 0x2da5a: 0x6c9c2020, 0x2da5b: 0x6c9c2220, + 0x2da5c: 0x6cc85a20, 0x2da5d: 0x6cc85c20, 0x2da5e: 0x6cc85e20, 0x2da5f: 0x6cc86020, + 0x2da60: 0x6cf69420, 0x2da61: 0x6cf69620, 0x2da62: 0x6d260620, 0x2da63: 0x6d7ee620, + 0x2da64: 0x6d7ee820, 0x2da65: 0x6d7eea20, 0x2da66: 0x6dc74820, 0x2da67: 0x6dfb0220, + 0x2da68: 0x6c049e20, 0x2da69: 0x6c04a020, 0x2da6a: 0x6c096220, 0x2da6b: 0x6c096420, + 0x2da6c: 0x6c096620, 0x2da6d: 0x6c096820, 0x2da6e: 0x6c096a20, 0x2da6f: 0x6c096c20, + 0x2da70: 0x6c096e20, 0x2da71: 0x6c127c20, 0x2da72: 0x6c127e20, 0x2da73: 0x6c128020, + 0x2da74: 0x6c128220, 0x2da75: 0x6c128420, 0x2da76: 0x6c128620, 0x2da77: 0x6c128820, + 0x2da78: 0x6c128a20, 0x2da79: 0x6c128c20, 0x2da7a: 0x6c128e20, 0x2da7b: 0x6c129020, + 0x2da7c: 0x6c129220, 0x2da7d: 0x6c129420, 0x2da7e: 0x6c129620, 0x2da7f: 0x6c129820, + // Block 0xb6a, offset 0x2da80 + 0x2da80: 0x6c129a20, 0x2da81: 0x6c129c20, 0x2da82: 0x6c129e20, 0x2da83: 0x6c12a020, + 0x2da84: 0x6c21ba20, 0x2da85: 0x6c21bc20, 0x2da86: 0x6c21be20, 0x2da87: 0x6c21c020, + 0x2da88: 0x6c21c220, 0x2da89: 0x6c21c420, 0x2da8a: 0x6c21c620, 0x2da8b: 0x6c21c820, + 0x2da8c: 0x6c21ca20, 0x2da8d: 0x6c21cc20, 0x2da8e: 0x6c21ce20, 0x2da8f: 0x6c21d020, + 0x2da90: 0x6c21d220, 0x2da91: 0x6c21d420, 0x2da92: 0x6c21d620, 0x2da93: 0x6c21d820, + 0x2da94: 0x6c21da20, 0x2da95: 0x6c21dc20, 0x2da96: 0x6c21de20, 0x2da97: 0x6c21e020, + 0x2da98: 0x6c21e220, 0x2da99: 0x6c21e420, 0x2da9a: 0x6c21e620, 0x2da9b: 0x6c21e820, + 0x2da9c: 0x6c21ea20, 0x2da9d: 0x6c21ec20, 0x2da9e: 0x6c21ee20, 0x2da9f: 0x6c21f020, + 0x2daa0: 0x6c21f220, 0x2daa1: 0x6c21f420, 0x2daa2: 0x6c21f620, 0x2daa3: 0x6c21f820, + 0x2daa4: 0x6c21fa20, 0x2daa5: 0x6c21fc20, 0x2daa6: 0x6c21fe20, 0x2daa7: 0x6c220020, + 0x2daa8: 0x6c220220, 0x2daa9: 0x6c220420, 0x2daaa: 0x6c366c20, 0x2daab: 0x6c366e20, + 0x2daac: 0x6c367020, 0x2daad: 0x6c367220, 0x2daae: 0x6c367420, 0x2daaf: 0x6c367620, + 0x2dab0: 0x6c367820, 0x2dab1: 0x6c367a20, 0x2dab2: 0x6c367c20, 0x2dab3: 0x6c367e20, + 0x2dab4: 0x6c368020, 0x2dab5: 0x6c368220, 0x2dab6: 0x6c368420, 0x2dab7: 0x6c368620, + 0x2dab8: 0x6c368820, 0x2dab9: 0x6c368a20, 0x2daba: 0x6c368c20, 0x2dabb: 0x6c368e20, + 0x2dabc: 0x6c369020, 0x2dabd: 0x6c369220, 0x2dabe: 0x6c369420, 0x2dabf: 0x6c369620, + // Block 0xb6b, offset 0x2dac0 + 0x2dac0: 0x6c369820, 0x2dac1: 0x6c220620, 0x2dac2: 0x6c369a20, 0x2dac3: 0x6c369c20, + 0x2dac4: 0x6c369e20, 0x2dac5: 0x6c36a020, 0x2dac6: 0x6c36a220, 0x2dac7: 0x6c36a420, + 0x2dac8: 0x6c36a620, 0x2dac9: 0x6c36a820, 0x2daca: 0x6c36aa20, 0x2dacb: 0x6c36ac20, + 0x2dacc: 0x6c36ae20, 0x2dacd: 0x6c36b020, 0x2dace: 0x6c36b220, 0x2dacf: 0x6c36b420, + 0x2dad0: 0x6c36b620, 0x2dad1: 0x6c36b820, 0x2dad2: 0x6c36ba20, 0x2dad3: 0x6c36bc20, + 0x2dad4: 0x6c36be20, 0x2dad5: 0x6c36c020, 0x2dad6: 0x6c36c220, 0x2dad7: 0x6c36c420, + 0x2dad8: 0x6c36c620, 0x2dad9: 0x6c36c820, 0x2dada: 0x6c36ca20, 0x2dadb: 0x6c36cc20, + 0x2dadc: 0x6c36ce20, 0x2dadd: 0x6c36d020, 0x2dade: 0x6c36d220, 0x2dadf: 0x6c36d420, + 0x2dae0: 0x6c36d620, 0x2dae1: 0x6c36d820, 0x2dae2: 0x6c36da20, 0x2dae3: 0x6c36dc20, + 0x2dae4: 0x6c36de20, 0x2dae5: 0x6c36e020, 0x2dae6: 0x6c36e220, 0x2dae7: 0x6c36e420, + 0x2dae8: 0x6c36e620, 0x2dae9: 0x6c36e820, 0x2daea: 0x6c36ea20, 0x2daeb: 0x6c36ec20, + 0x2daec: 0x6c36ee20, 0x2daed: 0x6c36f020, 0x2daee: 0x6c519420, 0x2daef: 0x6c519620, + 0x2daf0: 0x6c519820, 0x2daf1: 0x6c519a20, 0x2daf2: 0x6c519c20, 0x2daf3: 0x6c519e20, + 0x2daf4: 0x6c51a020, 0x2daf5: 0x6c51a220, 0x2daf6: 0x6c51a420, 0x2daf7: 0x6c51a620, + 0x2daf8: 0x6c51a820, 0x2daf9: 0x6c51aa20, 0x2dafa: 0x6c51ac20, 0x2dafb: 0x6c51ae20, + 0x2dafc: 0x6c51b020, 0x2dafd: 0x6c73c020, 0x2dafe: 0x6c51b220, 0x2daff: 0x6c51b420, + // Block 0xb6c, offset 0x2db00 + 0x2db00: 0x6c51b620, 0x2db01: 0x6c51b820, 0x2db02: 0x6c51ba20, 0x2db03: 0x6c51bc20, + 0x2db04: 0x6c51be20, 0x2db05: 0x6c51c020, 0x2db06: 0x6c51c220, 0x2db07: 0x6c51c420, + 0x2db08: 0x6c51c620, 0x2db09: 0x6c51c820, 0x2db0a: 0x6c51ca20, 0x2db0b: 0x6c51cc20, + 0x2db0c: 0x6c51ce20, 0x2db0d: 0x6c51d020, 0x2db0e: 0x6c51d220, 0x2db0f: 0x6c51d420, + 0x2db10: 0x6c51d620, 0x2db11: 0x6c51d820, 0x2db12: 0x6c51da20, 0x2db13: 0x6c51dc20, + 0x2db14: 0x6c51de20, 0x2db15: 0x6c51e020, 0x2db16: 0x6c51e220, 0x2db17: 0x6c51e420, + 0x2db18: 0x6c51e620, 0x2db19: 0x6c51e820, 0x2db1a: 0x6c51ea20, 0x2db1b: 0x6c51ec20, + 0x2db1c: 0x6c51ee20, 0x2db1d: 0x6c51f020, 0x2db1e: 0x6c51f220, 0x2db1f: 0x6c51f420, + 0x2db20: 0x6c51f620, 0x2db21: 0x6c73c220, 0x2db22: 0x6c51f820, 0x2db23: 0x6c51fa20, + 0x2db24: 0x6c51fc20, 0x2db25: 0x6c51fe20, 0x2db26: 0x6c520020, 0x2db27: 0x6c520220, + 0x2db28: 0x6c520420, 0x2db29: 0x6c520620, 0x2db2a: 0x6c520820, 0x2db2b: 0x6c520a20, + 0x2db2c: 0x6c520c20, 0x2db2d: 0x6c520e20, 0x2db2e: 0x6c521020, 0x2db2f: 0x6c521220, + 0x2db30: 0x6c521420, 0x2db31: 0x6c521620, 0x2db32: 0x6c521820, 0x2db33: 0x6c521a20, + 0x2db34: 0x6c73c420, 0x2db35: 0x6c521c20, 0x2db36: 0x6c521e20, 0x2db37: 0x6c522020, + 0x2db38: 0x6c522220, 0x2db39: 0x6c376420, 0x2db3a: 0x6c522420, 0x2db3b: 0x6c522620, + 0x2db3c: 0x6c522820, 0x2db3d: 0x6c522a20, 0x2db3e: 0x6c522c20, 0x2db3f: 0x6c522e20, + // Block 0xb6d, offset 0x2db40 + 0x2db40: 0x6c523020, 0x2db41: 0x6c523220, 0x2db42: 0x6c523420, 0x2db43: 0x6c523620, + 0x2db44: 0x6c523820, 0x2db45: 0x6c523a20, 0x2db46: 0x6c523c20, 0x2db47: 0x6c523e20, + 0x2db48: 0x6c524020, 0x2db49: 0x6c524220, 0x2db4a: 0x6c524420, 0x2db4b: 0x6c524620, + 0x2db4c: 0x6c524820, 0x2db4d: 0x6c524a20, 0x2db4e: 0x6c524c20, 0x2db4f: 0x6c524e20, + 0x2db50: 0x6c525020, 0x2db51: 0x6c525220, 0x2db52: 0x6c73e620, 0x2db53: 0x6c73e820, + 0x2db54: 0x6c73ea20, 0x2db55: 0x6c73ec20, 0x2db56: 0x6c73ee20, 0x2db57: 0x6c73f020, + 0x2db58: 0x6c73f220, 0x2db59: 0x6c73f420, 0x2db5a: 0x6c73f620, 0x2db5b: 0x6c73f820, + 0x2db5c: 0x6c73fa20, 0x2db5d: 0x6c73fc20, 0x2db5e: 0x6c73fe20, 0x2db5f: 0x6c740020, + 0x2db60: 0x6c740220, 0x2db61: 0x6c740420, 0x2db62: 0x6c740620, 0x2db63: 0x6c740820, + 0x2db64: 0x6c740a20, 0x2db65: 0x6c740c20, 0x2db66: 0x6c740e20, 0x2db67: 0x6c741020, + 0x2db68: 0x6c741220, 0x2db69: 0x6c741420, 0x2db6a: 0x6c741620, 0x2db6b: 0x6c741820, + 0x2db6c: 0x6c741a20, 0x2db6d: 0x6c741c20, 0x2db6e: 0x6c741e20, 0x2db6f: 0x6c742020, + 0x2db70: 0x6c742220, 0x2db71: 0x6c742420, 0x2db72: 0x6c742620, 0x2db73: 0x6c742820, + 0x2db74: 0x6c742a20, 0x2db75: 0x6c742c20, 0x2db76: 0x6c742e20, 0x2db77: 0x6c743020, + 0x2db78: 0x6c743220, 0x2db79: 0x6c743420, 0x2db7a: 0x6c743620, 0x2db7b: 0x6c743820, + 0x2db7c: 0x6c743a20, 0x2db7d: 0x6c743c20, 0x2db7e: 0x6c743e20, 0x2db7f: 0x6c744020, + // Block 0xb6e, offset 0x2db80 + 0x2db80: 0x6c744220, 0x2db81: 0x6c744420, 0x2db82: 0x6c744620, 0x2db83: 0x6c744820, + 0x2db84: 0x6c744a20, 0x2db85: 0x6c744c20, 0x2db86: 0x6c744e20, 0x2db87: 0x6c745020, + 0x2db88: 0x6c745220, 0x2db89: 0x6c745420, 0x2db8a: 0x6c745620, 0x2db8b: 0x6c745820, + 0x2db8c: 0x6c745a20, 0x2db8d: 0x6c745c20, 0x2db8e: 0x6c745e20, 0x2db8f: 0x6c746020, + 0x2db90: 0x6c746220, 0x2db91: 0x6c746420, 0x2db92: 0x6c52c020, 0x2db93: 0x6c746620, + 0x2db94: 0x6c746820, 0x2db95: 0x6c746a20, 0x2db96: 0x6c746c20, 0x2db97: 0x6c746e20, + 0x2db98: 0x6c747020, 0x2db99: 0x6c747220, 0x2db9a: 0x6c747420, 0x2db9b: 0x6c747620, + 0x2db9c: 0x6c747820, 0x2db9d: 0x6c747a20, 0x2db9e: 0x6c747c20, 0x2db9f: 0x6c747e20, + 0x2dba0: 0x6c748020, 0x2dba1: 0x6c748220, 0x2dba2: 0x6c748420, 0x2dba3: 0x6c748620, + 0x2dba4: 0x6c748820, 0x2dba5: 0x6c748a20, 0x2dba6: 0x6c748c20, 0x2dba7: 0x6c748e20, + 0x2dba8: 0x6c749020, 0x2dba9: 0x6c749220, 0x2dbaa: 0x6c749420, 0x2dbab: 0x6c9c5420, + 0x2dbac: 0x6c9c5620, 0x2dbad: 0x6c9c5820, 0x2dbae: 0x6c9c5a20, 0x2dbaf: 0x6c9c5c20, + 0x2dbb0: 0x6c9c5e20, 0x2dbb1: 0x6c9c6020, 0x2dbb2: 0x6c9c6220, 0x2dbb3: 0x6c9c6420, + 0x2dbb4: 0x6c9c6620, 0x2dbb5: 0x6c9c6820, 0x2dbb6: 0x6c9c6a20, 0x2dbb7: 0x6c9c6c20, + 0x2dbb8: 0x6c9c6e20, 0x2dbb9: 0x6c9c7020, 0x2dbba: 0x6c9c7220, 0x2dbbb: 0x6c9c7420, + 0x2dbbc: 0x6c9c7620, 0x2dbbd: 0x6c9c7820, 0x2dbbe: 0x6c9c7a20, 0x2dbbf: 0x6c9c7c20, + // Block 0xb6f, offset 0x2dbc0 + 0x2dbc0: 0x6c9c7e20, 0x2dbc1: 0x6c9c8020, 0x2dbc2: 0x6c9c8220, 0x2dbc3: 0x6c9c8420, + 0x2dbc4: 0x6c9c8620, 0x2dbc5: 0x6c9c8820, 0x2dbc6: 0x6c9c8a20, 0x2dbc7: 0x6c9c8c20, + 0x2dbc8: 0x6c9c8e20, 0x2dbc9: 0x6c9c9020, 0x2dbca: 0x6c9c9220, 0x2dbcb: 0x6c9c9420, + 0x2dbcc: 0x6c9c9620, 0x2dbcd: 0x6c9c9820, 0x2dbce: 0x6c9c9a20, 0x2dbcf: 0x6c9c9c20, + 0x2dbd0: 0x6c9c9e20, 0x2dbd1: 0x6c9ca020, 0x2dbd2: 0x6c9ca220, 0x2dbd3: 0x6c9ca420, + 0x2dbd4: 0x6c9ca620, 0x2dbd5: 0x6c9ca820, 0x2dbd6: 0x6c9caa20, 0x2dbd7: 0x6c9cac20, + 0x2dbd8: 0x6c9cae20, 0x2dbd9: 0x6c9cb020, 0x2dbda: 0x6c9cb220, 0x2dbdb: 0x6c9cb420, + 0x2dbdc: 0x6c9cb620, 0x2dbdd: 0x6c9cb820, 0x2dbde: 0x6c9cba20, 0x2dbdf: 0x6c9cbc20, + 0x2dbe0: 0x6c9cbe20, 0x2dbe1: 0x6c9cc020, 0x2dbe2: 0x6c9cc220, 0x2dbe3: 0x6c9cc420, + 0x2dbe4: 0x6c9cc620, 0x2dbe5: 0x6c9cc820, 0x2dbe6: 0x6c9cca20, 0x2dbe7: 0x6c9ccc20, + 0x2dbe8: 0x6c9cce20, 0x2dbe9: 0x6c9cd020, 0x2dbea: 0x6c9cd220, 0x2dbeb: 0x6c9cd420, + 0x2dbec: 0x6c9cd620, 0x2dbed: 0x6c9cd820, 0x2dbee: 0x6c9cda20, 0x2dbef: 0x6c9cdc20, + 0x2dbf0: 0x6c9cde20, 0x2dbf1: 0x6c9ce020, 0x2dbf2: 0x6c9ce220, 0x2dbf3: 0x6c9ce420, + 0x2dbf4: 0x6cc88420, 0x2dbf5: 0x6c9ce620, 0x2dbf6: 0x6c9ce820, 0x2dbf7: 0x6c9cea20, + 0x2dbf8: 0x6c9cec20, 0x2dbf9: 0x6c9cee20, 0x2dbfa: 0x6c9cf020, 0x2dbfb: 0x6c9cf220, + 0x2dbfc: 0x6c9cf420, 0x2dbfd: 0x6c9cf620, 0x2dbfe: 0x6c9cf820, 0x2dbff: 0x6c9cfa20, + // Block 0xb70, offset 0x2dc00 + 0x2dc00: 0x6c9cfc20, 0x2dc01: 0x6c9cfe20, 0x2dc02: 0x6c9d0020, 0x2dc03: 0x6cc8ae20, + 0x2dc04: 0x6cc8b020, 0x2dc05: 0x6cc8b220, 0x2dc06: 0x6cc8b420, 0x2dc07: 0x6cc8b620, + 0x2dc08: 0x6cc8b820, 0x2dc09: 0x6cc8ba20, 0x2dc0a: 0x6cc8bc20, 0x2dc0b: 0x6cc8be20, + 0x2dc0c: 0x6cc8c020, 0x2dc0d: 0x6cc8c220, 0x2dc0e: 0x6cc8c420, 0x2dc0f: 0x6cc8c620, + 0x2dc10: 0x6cc8c820, 0x2dc11: 0x6cc8ca20, 0x2dc12: 0x6cc8cc20, 0x2dc13: 0x6cc8ce20, + 0x2dc14: 0x6cc8d020, 0x2dc15: 0x6cc8d220, 0x2dc16: 0x6cc8d420, 0x2dc17: 0x6cc8d620, + 0x2dc18: 0x6cc8d820, 0x2dc19: 0x6cc8da20, 0x2dc1a: 0x6cc8dc20, 0x2dc1b: 0x6cc8de20, + 0x2dc1c: 0x6cc8e020, 0x2dc1d: 0x6cc8e220, 0x2dc1e: 0x6cc8e420, 0x2dc1f: 0x6cc8e620, + 0x2dc20: 0x6cc8e820, 0x2dc21: 0x6cc8ea20, 0x2dc22: 0x6cc8ec20, 0x2dc23: 0x6cc8ee20, + 0x2dc24: 0x6cc8f020, 0x2dc25: 0x6cc8f220, 0x2dc26: 0x6cc8f420, 0x2dc27: 0x6cc8f620, + 0x2dc28: 0x6cc8f820, 0x2dc29: 0x6cc8fa20, 0x2dc2a: 0x6cc8fc20, 0x2dc2b: 0x6cc8fe20, + 0x2dc2c: 0x6cc90020, 0x2dc2d: 0x6cc90220, 0x2dc2e: 0x6cc90420, 0x2dc2f: 0x6cc90620, + 0x2dc30: 0x6cc90820, 0x2dc31: 0x6cc90a20, 0x2dc32: 0x6cc90c20, 0x2dc33: 0x6cc90e20, + 0x2dc34: 0x6cc91020, 0x2dc35: 0x6cc91220, 0x2dc36: 0x6cc91420, 0x2dc37: 0x6cc91620, + 0x2dc38: 0x6cc91820, 0x2dc39: 0x6cc91a20, 0x2dc3a: 0x6cc91c20, 0x2dc3b: 0x6cc91e20, + 0x2dc3c: 0x6cc92020, 0x2dc3d: 0x6cc92220, 0x2dc3e: 0x6cc92420, 0x2dc3f: 0x6cc92620, + // Block 0xb71, offset 0x2dc40 + 0x2dc40: 0x6cc92820, 0x2dc41: 0x6cc92a20, 0x2dc42: 0x6cc92c20, 0x2dc43: 0x6cc92e20, + 0x2dc44: 0x6cc93020, 0x2dc45: 0x6cc93220, 0x2dc46: 0x6cc93420, 0x2dc47: 0x6cc93620, + 0x2dc48: 0x6cc93820, 0x2dc49: 0x6cc93a20, 0x2dc4a: 0x6cc93c20, 0x2dc4b: 0x6cc93e20, + 0x2dc4c: 0x6cc94020, 0x2dc4d: 0x6cc94220, 0x2dc4e: 0x6cc94420, 0x2dc4f: 0x6cc94620, + 0x2dc50: 0x6cc94820, 0x2dc51: 0x6cc94a20, 0x2dc52: 0x6cc94c20, 0x2dc53: 0x6cc94e20, + 0x2dc54: 0x6cc95020, 0x2dc55: 0x6cc95220, 0x2dc56: 0x6cc95420, 0x2dc57: 0x6cc95620, + 0x2dc58: 0x6cc95820, 0x2dc59: 0x6cc95a20, 0x2dc5a: 0x6cc95c20, 0x2dc5b: 0x6cc95e20, + 0x2dc5c: 0x6cc96020, 0x2dc5d: 0x6cc96220, 0x2dc5e: 0x6cc96420, 0x2dc5f: 0x6cc96620, + 0x2dc60: 0x6cc96820, 0x2dc61: 0x6cc96a20, 0x2dc62: 0x6cc96c20, 0x2dc63: 0x6cc96e20, + 0x2dc64: 0x6cc97020, 0x2dc65: 0x6cc97220, 0x2dc66: 0x6cc97420, 0x2dc67: 0x6cc97620, + 0x2dc68: 0x6cc97820, 0x2dc69: 0x6cc97a20, 0x2dc6a: 0x6cc97c20, 0x2dc6b: 0x6cc97e20, + 0x2dc6c: 0x6cc98020, 0x2dc6d: 0x6cc98220, 0x2dc6e: 0x6cc98420, 0x2dc6f: 0x6cf6e220, + 0x2dc70: 0x6cf6e420, 0x2dc71: 0x6cf6e620, 0x2dc72: 0x6cf6e820, 0x2dc73: 0x6cf6ea20, + 0x2dc74: 0x6cf6ec20, 0x2dc75: 0x6cf6ee20, 0x2dc76: 0x6cf6f020, 0x2dc77: 0x6cf6f220, + 0x2dc78: 0x6cf6f420, 0x2dc79: 0x6cf6f620, 0x2dc7a: 0x6cf6f820, 0x2dc7b: 0x6cf6fa20, + 0x2dc7c: 0x6cf6fc20, 0x2dc7d: 0x6cf6fe20, 0x2dc7e: 0x6cf70020, 0x2dc7f: 0x6cf70220, + // Block 0xb72, offset 0x2dc80 + 0x2dc80: 0x6cf70420, 0x2dc81: 0x6cf70620, 0x2dc82: 0x6cf70820, 0x2dc83: 0x6cf70a20, + 0x2dc84: 0x6cf70c20, 0x2dc85: 0x6cf70e20, 0x2dc86: 0x6cf71020, 0x2dc87: 0x6cf71220, + 0x2dc88: 0x6cf71420, 0x2dc89: 0x6cf71620, 0x2dc8a: 0x6cf71820, 0x2dc8b: 0x6cf71a20, + 0x2dc8c: 0x6cf71c20, 0x2dc8d: 0x6cf71e20, 0x2dc8e: 0x6cf72020, 0x2dc8f: 0x6cf72220, + 0x2dc90: 0x6cf72420, 0x2dc91: 0x6cf72620, 0x2dc92: 0x6cf72820, 0x2dc93: 0x6cf72a20, + 0x2dc94: 0x6cf72c20, 0x2dc95: 0x6cf72e20, 0x2dc96: 0x6c9da420, 0x2dc97: 0x6cf73020, + 0x2dc98: 0x6cf73220, 0x2dc99: 0x6cf73420, 0x2dc9a: 0x6cf73620, 0x2dc9b: 0x6cf73820, + 0x2dc9c: 0x6cf73a20, 0x2dc9d: 0x6cf73c20, 0x2dc9e: 0x6cf73e20, 0x2dc9f: 0x6cf74020, + 0x2dca0: 0x6cf74220, 0x2dca1: 0x6cf74420, 0x2dca2: 0x6cf74620, 0x2dca3: 0x6cf74820, + 0x2dca4: 0x6cf74a20, 0x2dca5: 0x6cf74c20, 0x2dca6: 0x6cf74e20, 0x2dca7: 0x6cf75020, + 0x2dca8: 0x6cf75220, 0x2dca9: 0x6cf75420, 0x2dcaa: 0x6cf75620, 0x2dcab: 0x6cf75820, + 0x2dcac: 0x6cf75a20, 0x2dcad: 0x6cf75c20, 0x2dcae: 0x6cca8820, 0x2dcaf: 0x6cf75e20, + 0x2dcb0: 0x6cca8a20, 0x2dcb1: 0x6cf76020, 0x2dcb2: 0x6cf76220, 0x2dcb3: 0x6cf76420, + 0x2dcb4: 0x6cf76620, 0x2dcb5: 0x6cf76820, 0x2dcb6: 0x6cf76a20, 0x2dcb7: 0x6cf76c20, + 0x2dcb8: 0x6cf76e20, 0x2dcb9: 0x6cf77020, 0x2dcba: 0x6cf77220, 0x2dcbb: 0x6cf77420, + 0x2dcbc: 0x6cf77620, 0x2dcbd: 0x6cf77820, 0x2dcbe: 0x6cf77a20, 0x2dcbf: 0x6cf77c20, + // Block 0xb73, offset 0x2dcc0 + 0x2dcc0: 0x6cf77e20, 0x2dcc1: 0x6cf78020, 0x2dcc2: 0x6cf78220, 0x2dcc3: 0x6cf78420, + 0x2dcc4: 0x6cf78620, 0x2dcc5: 0x6cf78820, 0x2dcc6: 0x6cf78a20, 0x2dcc7: 0x6cf78c20, + 0x2dcc8: 0x6cf78e20, 0x2dcc9: 0x6cf79020, 0x2dcca: 0x6d264e20, 0x2dccb: 0x6cf79220, + 0x2dccc: 0x6cf79420, 0x2dccd: 0x6d265020, 0x2dcce: 0x6d265220, 0x2dccf: 0x6d265420, + 0x2dcd0: 0x6d265620, 0x2dcd1: 0x6d265820, 0x2dcd2: 0x6d265a20, 0x2dcd3: 0x6d265c20, + 0x2dcd4: 0x6cf79620, 0x2dcd5: 0x6d265e20, 0x2dcd6: 0x6d266020, 0x2dcd7: 0x6d266220, + 0x2dcd8: 0x6cf79820, 0x2dcd9: 0x6d266420, 0x2dcda: 0x6d266620, 0x2dcdb: 0x6d266820, + 0x2dcdc: 0x6d266a20, 0x2dcdd: 0x6d266c20, 0x2dcde: 0x6d266e20, 0x2dcdf: 0x6d267020, + 0x2dce0: 0x6d267220, 0x2dce1: 0x6d267420, 0x2dce2: 0x6d267620, 0x2dce3: 0x6d267820, + 0x2dce4: 0x6d267a20, 0x2dce5: 0x6d267c20, 0x2dce6: 0x6d267e20, 0x2dce7: 0x6d268020, + 0x2dce8: 0x6d268220, 0x2dce9: 0x6d268420, 0x2dcea: 0x6d268620, 0x2dceb: 0x6d268820, + 0x2dcec: 0x6d268a20, 0x2dced: 0x6d268c20, 0x2dcee: 0x6d268e20, 0x2dcef: 0x6d269020, + 0x2dcf0: 0x6d269220, 0x2dcf1: 0x6d269420, 0x2dcf2: 0x6d269620, 0x2dcf3: 0x6d269820, + 0x2dcf4: 0x6d269a20, 0x2dcf5: 0x6d269c20, 0x2dcf6: 0x6d269e20, 0x2dcf7: 0x6d26a020, + 0x2dcf8: 0x6d26a220, 0x2dcf9: 0x6d26a420, 0x2dcfa: 0x6d26a620, 0x2dcfb: 0x6d26a820, + 0x2dcfc: 0x6d26aa20, 0x2dcfd: 0x6d26ac20, 0x2dcfe: 0x6d26ae20, 0x2dcff: 0x6d26b020, + // Block 0xb74, offset 0x2dd00 + 0x2dd00: 0x6d26b220, 0x2dd01: 0x6d26b420, 0x2dd02: 0x6d26b620, 0x2dd03: 0x6d26b820, + 0x2dd04: 0x6d26ba20, 0x2dd05: 0x6d26bc20, 0x2dd06: 0x6d26be20, 0x2dd07: 0x6d26c020, + 0x2dd08: 0x6d26c220, 0x2dd09: 0x6d26c420, 0x2dd0a: 0x6d26c620, 0x2dd0b: 0x6d26c820, + 0x2dd0c: 0x6d26ca20, 0x2dd0d: 0x6d26cc20, 0x2dd0e: 0x6d26ce20, 0x2dd0f: 0x6d26d020, + 0x2dd10: 0x6d26d220, 0x2dd11: 0x6d26d420, 0x2dd12: 0x6d26d620, 0x2dd13: 0x6d26d820, + 0x2dd14: 0x6d26da20, 0x2dd15: 0x6d26dc20, 0x2dd16: 0x6d26de20, 0x2dd17: 0x6d26e020, + 0x2dd18: 0x6d26e220, 0x2dd19: 0x6d26e420, 0x2dd1a: 0x6d26e620, 0x2dd1b: 0x6d26e820, + 0x2dd1c: 0x6d26ea20, 0x2dd1d: 0x6d26ec20, 0x2dd1e: 0x6d26ee20, 0x2dd1f: 0x6d26f020, + 0x2dd20: 0x6d26f220, 0x2dd21: 0x6d26f420, 0x2dd22: 0x6d53c820, 0x2dd23: 0x6d53ca20, + 0x2dd24: 0x6d53cc20, 0x2dd25: 0x6d53ce20, 0x2dd26: 0x6d53d020, 0x2dd27: 0x6d53d220, + 0x2dd28: 0x6d53d420, 0x2dd29: 0x6d539c20, 0x2dd2a: 0x6d53d620, 0x2dd2b: 0x6d53d820, + 0x2dd2c: 0x6d53da20, 0x2dd2d: 0x6d53dc20, 0x2dd2e: 0x6d53de20, 0x2dd2f: 0x6d53e020, + 0x2dd30: 0x6d53e220, 0x2dd31: 0x6d53e420, 0x2dd32: 0x6d53e620, 0x2dd33: 0x6d53e820, + 0x2dd34: 0x6d53ea20, 0x2dd35: 0x6d53ec20, 0x2dd36: 0x6d53ee20, 0x2dd37: 0x6d53f020, + 0x2dd38: 0x6d53f220, 0x2dd39: 0x6d53f420, 0x2dd3a: 0x6d53f620, 0x2dd3b: 0x6d53f820, + 0x2dd3c: 0x6d53fa20, 0x2dd3d: 0x6d53fc20, 0x2dd3e: 0x6d53fe20, 0x2dd3f: 0x6d540020, + // Block 0xb75, offset 0x2dd40 + 0x2dd40: 0x6d540220, 0x2dd41: 0x6d540420, 0x2dd42: 0x6d540620, 0x2dd43: 0x6d280020, + 0x2dd44: 0x6d540820, 0x2dd45: 0x6d540a20, 0x2dd46: 0x6d540c20, 0x2dd47: 0x6d540e20, + 0x2dd48: 0x6d541020, 0x2dd49: 0x6d541220, 0x2dd4a: 0x6d541420, 0x2dd4b: 0x6d541620, + 0x2dd4c: 0x6d541820, 0x2dd4d: 0x6d541a20, 0x2dd4e: 0x6d541c20, 0x2dd4f: 0x6d541e20, + 0x2dd50: 0x6d542020, 0x2dd51: 0x6d542220, 0x2dd52: 0x6d542420, 0x2dd53: 0x6d542620, + 0x2dd54: 0x6d542820, 0x2dd55: 0x6d542a20, 0x2dd56: 0x6d542c20, 0x2dd57: 0x6d542e20, + 0x2dd58: 0x6d543020, 0x2dd59: 0x6d543220, 0x2dd5a: 0x6d543420, 0x2dd5b: 0x6d543620, + 0x2dd5c: 0x6d543820, 0x2dd5d: 0x6d543a20, 0x2dd5e: 0x6d543c20, 0x2dd5f: 0x6d543e20, + 0x2dd60: 0x6d544020, 0x2dd61: 0x6d544220, 0x2dd62: 0x6d544420, 0x2dd63: 0x6d544620, + 0x2dd64: 0x6d544820, 0x2dd65: 0x6d544a20, 0x2dd66: 0x6d544c20, 0x2dd67: 0x6d544e20, + 0x2dd68: 0x6d7efe20, 0x2dd69: 0x6d545020, 0x2dd6a: 0x6d545220, 0x2dd6b: 0x6d545420, + 0x2dd6c: 0x6d545620, 0x2dd6d: 0x6d545820, 0x2dd6e: 0x6d26f620, 0x2dd6f: 0x6d545a20, + 0x2dd70: 0x6d545c20, 0x2dd71: 0x6d545e20, 0x2dd72: 0x6d7f3020, 0x2dd73: 0x6d7f3220, + 0x2dd74: 0x6d7f3420, 0x2dd75: 0x6d7f3620, 0x2dd76: 0x6d7f3820, 0x2dd77: 0x6d7f3a20, + 0x2dd78: 0x6d7f3c20, 0x2dd79: 0x6d7f3e20, 0x2dd7a: 0x6d7f4020, 0x2dd7b: 0x6d7f4220, + 0x2dd7c: 0x6d7f4420, 0x2dd7d: 0x6d7f4620, 0x2dd7e: 0x6d7f4820, 0x2dd7f: 0x6d7f4a20, + // Block 0xb76, offset 0x2dd80 + 0x2dd80: 0x6d7f4c20, 0x2dd81: 0x6d7f4e20, 0x2dd82: 0x6d7f5020, 0x2dd83: 0x6d7f5220, + 0x2dd84: 0x6d7f5420, 0x2dd85: 0x6d7f5620, 0x2dd86: 0x6d7f5820, 0x2dd87: 0x6d7f5a20, + 0x2dd88: 0x6d7f5c20, 0x2dd89: 0x6d7f5e20, 0x2dd8a: 0x6d7f6020, 0x2dd8b: 0x6d7f6220, + 0x2dd8c: 0x6d7f6420, 0x2dd8d: 0x6d7f6620, 0x2dd8e: 0x6d7f6820, 0x2dd8f: 0x6d7f6a20, + 0x2dd90: 0x6d7f6c20, 0x2dd91: 0x6d7f6e20, 0x2dd92: 0x6d7f7020, 0x2dd93: 0x6d7f7220, + 0x2dd94: 0x6d7f7420, 0x2dd95: 0x6d7f7620, 0x2dd96: 0x6d7f7820, 0x2dd97: 0x6d7f7a20, + 0x2dd98: 0x6d7f7c20, 0x2dd99: 0x6d7f7e20, 0x2dd9a: 0x6d7f8020, 0x2dd9b: 0x6d7f8220, + 0x2dd9c: 0x6d7f8420, 0x2dd9d: 0x6d7f8620, 0x2dd9e: 0x6d7f8820, 0x2dd9f: 0x6d7f8a20, + 0x2dda0: 0x6d7f8c20, 0x2dda1: 0x6d7f8e20, 0x2dda2: 0x6d7f9020, 0x2dda3: 0x6d7f9220, + 0x2dda4: 0x6d7f9420, 0x2dda5: 0x6d546020, 0x2dda6: 0x6d7f9620, 0x2dda7: 0x6d7f9820, + 0x2dda8: 0x6d7f9a20, 0x2dda9: 0x6d7f9c20, 0x2ddaa: 0x6d7f9e20, 0x2ddab: 0x6d7fa020, + 0x2ddac: 0x6d7fa220, 0x2ddad: 0x6d7fa420, 0x2ddae: 0x6d7fa620, 0x2ddaf: 0x6d7fa820, + 0x2ddb0: 0x6d7faa20, 0x2ddb1: 0x6d7fac20, 0x2ddb2: 0x6d7fae20, 0x2ddb3: 0x6d7fb020, + 0x2ddb4: 0x6d7f0020, 0x2ddb5: 0x6d7fb220, 0x2ddb6: 0x6d7fb420, 0x2ddb7: 0x6d7fb620, + 0x2ddb8: 0x6d7fb820, 0x2ddb9: 0x6d7fba20, 0x2ddba: 0x6d7fbc20, 0x2ddbb: 0x6d7fbe20, + 0x2ddbc: 0x6d7fc020, 0x2ddbd: 0x6da5dc20, 0x2ddbe: 0x6da5de20, 0x2ddbf: 0x6da5e020, + // Block 0xb77, offset 0x2ddc0 + 0x2ddc0: 0x6da5e220, 0x2ddc1: 0x6da5e420, 0x2ddc2: 0x6da5e620, 0x2ddc3: 0x6da5e820, + 0x2ddc4: 0x6da5ea20, 0x2ddc5: 0x6da5ec20, 0x2ddc6: 0x6da5ee20, 0x2ddc7: 0x6da5f020, + 0x2ddc8: 0x6da5f220, 0x2ddc9: 0x6da5f420, 0x2ddca: 0x6da5f620, 0x2ddcb: 0x6da5f820, + 0x2ddcc: 0x6da5fa20, 0x2ddcd: 0x6da5fc20, 0x2ddce: 0x6da5fe20, 0x2ddcf: 0x6da60020, + 0x2ddd0: 0x6da60220, 0x2ddd1: 0x6da60420, 0x2ddd2: 0x6da60620, 0x2ddd3: 0x6da60820, + 0x2ddd4: 0x6da60a20, 0x2ddd5: 0x6da60c20, 0x2ddd6: 0x6da60e20, 0x2ddd7: 0x6da61020, + 0x2ddd8: 0x6da61220, 0x2ddd9: 0x6da61420, 0x2ddda: 0x6da61620, 0x2dddb: 0x6da61820, + 0x2dddc: 0x6da61a20, 0x2dddd: 0x6da61c20, 0x2ddde: 0x6da61e20, 0x2dddf: 0x6da62020, + 0x2dde0: 0x6da62220, 0x2dde1: 0x6da62420, 0x2dde2: 0x6da62620, 0x2dde3: 0x6da62820, + 0x2dde4: 0x6da62a20, 0x2dde5: 0x6da62c20, 0x2dde6: 0x6da62e20, 0x2dde7: 0x6da63020, + 0x2dde8: 0x6da63220, 0x2dde9: 0x6da63420, 0x2ddea: 0x6da63620, 0x2ddeb: 0x6dc76220, + 0x2ddec: 0x6dc76420, 0x2dded: 0x6dc76620, 0x2ddee: 0x6dc76820, 0x2ddef: 0x6dc76a20, + 0x2ddf0: 0x6dc76c20, 0x2ddf1: 0x6dc76e20, 0x2ddf2: 0x6dc77020, 0x2ddf3: 0x6dc77220, + 0x2ddf4: 0x6dc77420, 0x2ddf5: 0x6dc77620, 0x2ddf6: 0x6dc77820, 0x2ddf7: 0x6dc77a20, + 0x2ddf8: 0x6dc77c20, 0x2ddf9: 0x6dc77e20, 0x2ddfa: 0x6dc78020, 0x2ddfb: 0x6dc78220, + 0x2ddfc: 0x6dc78420, 0x2ddfd: 0x6dc78620, 0x2ddfe: 0x6dc78820, 0x2ddff: 0x6dc78a20, + // Block 0xb78, offset 0x2de00 + 0x2de00: 0x6dc78c20, 0x2de01: 0x6dc78e20, 0x2de02: 0x6dc79020, 0x2de03: 0x6dc79220, + 0x2de04: 0x6dc79420, 0x2de05: 0x6dc79620, 0x2de06: 0x6dc79820, 0x2de07: 0x6dc79a20, + 0x2de08: 0x6dc79c20, 0x2de09: 0x6dc79e20, 0x2de0a: 0x6dc7a020, 0x2de0b: 0x6de3ca20, + 0x2de0c: 0x6de3cc20, 0x2de0d: 0x6de3ce20, 0x2de0e: 0x6de3d020, 0x2de0f: 0x6de3d220, + 0x2de10: 0x6de3d420, 0x2de11: 0x6de3d620, 0x2de12: 0x6de3d820, 0x2de13: 0x6de3da20, + 0x2de14: 0x6de3dc20, 0x2de15: 0x6de3de20, 0x2de16: 0x6de3e020, 0x2de17: 0x6de3e220, + 0x2de18: 0x6de3e420, 0x2de19: 0x6de3e620, 0x2de1a: 0x6de3e820, 0x2de1b: 0x6da6f220, + 0x2de1c: 0x6de3ea20, 0x2de1d: 0x6de3ec20, 0x2de1e: 0x6de3ee20, 0x2de1f: 0x6de3f020, + 0x2de20: 0x6de3f220, 0x2de21: 0x6dc84c20, 0x2de22: 0x6de3f420, 0x2de23: 0x6de3f620, + 0x2de24: 0x6de3f820, 0x2de25: 0x6de3fa20, 0x2de26: 0x6de3fc20, 0x2de27: 0x6de47820, + 0x2de28: 0x6dfb2020, 0x2de29: 0x6dfb2220, 0x2de2a: 0x6dfb2420, 0x2de2b: 0x6de3fe20, + 0x2de2c: 0x6dfb2620, 0x2de2d: 0x6dc84e20, 0x2de2e: 0x6dfb2820, 0x2de2f: 0x6dfb2a20, + 0x2de30: 0x6dfb2c20, 0x2de31: 0x6dfb2e20, 0x2de32: 0x6dfb3020, 0x2de33: 0x6dfb3220, + 0x2de34: 0x6dfb3420, 0x2de35: 0x6dfb3620, 0x2de36: 0x6dfb3820, 0x2de37: 0x6e1db620, + 0x2de38: 0x6e0e6220, 0x2de39: 0x6dfb9820, 0x2de3a: 0x6e0e6420, 0x2de3b: 0x6e0e6620, + 0x2de3c: 0x6e0e6820, 0x2de3d: 0x6e0e6a20, 0x2de3e: 0x6e0e6c20, 0x2de3f: 0x6e0e6e20, + // Block 0xb79, offset 0x2de40 + 0x2de40: 0x6e0e7020, 0x2de41: 0x6e0e7220, 0x2de42: 0x6e0e7420, 0x2de43: 0x6e0e7620, + 0x2de44: 0x6e0e7820, 0x2de45: 0x6e0e7a20, 0x2de46: 0x6e1db820, 0x2de47: 0x6e1dba20, + 0x2de48: 0x6e1dbc20, 0x2de49: 0x6e1dbe20, 0x2de4a: 0x6e1dc020, 0x2de4b: 0x6e1dc220, + 0x2de4c: 0x6e0e7c20, 0x2de4d: 0x6e1dc420, 0x2de4e: 0x6e1dc620, 0x2de4f: 0x6e294220, + 0x2de50: 0x6e294420, 0x2de51: 0x6e294620, 0x2de52: 0x6e294820, 0x2de53: 0x6e325e20, + 0x2de54: 0x6e326020, 0x2de55: 0x6e326220, 0x2de56: 0x6e38b020, 0x2de57: 0x6e38b220, + 0x2de58: 0x6e38b420, 0x2de59: 0x6e38b620, 0x2de5a: 0x6e38b820, 0x2de5b: 0x6e38ba20, + 0x2de5c: 0x6e3d3020, 0x2de5d: 0x6e38d420, 0x2de5e: 0x6e42a620, 0x2de5f: 0x6e42a820, + 0x2de60: 0x6c04a620, 0x2de61: 0x6c12b420, 0x2de62: 0x6c12b620, 0x2de63: 0x6c376e20, + 0x2de64: 0x6c223c20, 0x2de65: 0x6c377020, 0x2de66: 0x6c377220, 0x2de67: 0x6c377420, + 0x2de68: 0x6c52ce20, 0x2de69: 0x6c52d020, 0x2de6a: 0x6c52d220, 0x2de6b: 0x6c755220, + 0x2de6c: 0x6c755420, 0x2de6d: 0x6c755620, 0x2de6e: 0x6c755820, 0x2de6f: 0x6c755a20, + 0x2de70: 0x6c755c20, 0x2de71: 0x6c755e20, 0x2de72: 0x6c9dae20, 0x2de73: 0x6c9db020, + 0x2de74: 0x6c758620, 0x2de75: 0x6c9db220, 0x2de76: 0x6c9db420, 0x2de77: 0x6c9db620, + 0x2de78: 0x6c9db820, 0x2de79: 0x6cca9820, 0x2de7a: 0x6cca9a20, 0x2de7b: 0x6cca9c20, + 0x2de7c: 0x6cca9e20, 0x2de7d: 0x6ccaa020, 0x2de7e: 0x6ccaa220, 0x2de7f: 0x6ccaa420, + // Block 0xb7a, offset 0x2de80 + 0x2de80: 0x6cf8c820, 0x2de81: 0x6cf8ca20, 0x2de82: 0x6cf8cc20, 0x2de83: 0x6cf8ce20, + 0x2de84: 0x6cf8d020, 0x2de85: 0x6cf8d220, 0x2de86: 0x6cf8d420, 0x2de87: 0x6cf8d620, + 0x2de88: 0x6cf8d820, 0x2de89: 0x6d280820, 0x2de8a: 0x6d280a20, 0x2de8b: 0x6d280c20, + 0x2de8c: 0x6d280e20, 0x2de8d: 0x6d281020, 0x2de8e: 0x6d555620, 0x2de8f: 0x6d555820, + 0x2de90: 0x6d555a20, 0x2de91: 0x6d555c20, 0x2de92: 0x6d555e20, 0x2de93: 0x6d556020, + 0x2de94: 0x6d80d420, 0x2de95: 0x6d80d620, 0x2de96: 0x6d80d820, 0x2de97: 0x6d80da20, + 0x2de98: 0x6d80dc20, 0x2de99: 0x6d80de20, 0x2de9a: 0x6d80e020, 0x2de9b: 0x6da6fc20, + 0x2de9c: 0x6da6fe20, 0x2de9d: 0x6da70020, 0x2de9e: 0x6dc85020, 0x2de9f: 0x6dc85220, + 0x2dea0: 0x6de47c20, 0x2dea1: 0x6e1e0e20, 0x2dea2: 0x6c04a820, 0x2dea3: 0x6c097620, + 0x2dea4: 0x6c12bc20, 0x2dea5: 0x6c225220, 0x2dea6: 0x6c379420, 0x2dea7: 0x6c379620, + 0x2dea8: 0x6c379820, 0x2dea9: 0x6c379a20, 0x2deaa: 0x6c52fe20, 0x2deab: 0x6c530020, + 0x2deac: 0x6c758820, 0x2dead: 0x6c758a20, 0x2deae: 0x6ccad620, 0x2deaf: 0x6ccad820, + 0x2deb0: 0x6d284020, 0x2deb1: 0x6cf90620, 0x2deb2: 0x6cf90820, 0x2deb3: 0x6cf90a20, + 0x2deb4: 0x6d284420, 0x2deb5: 0x6d558420, 0x2deb6: 0x6d558620, 0x2deb7: 0x6d80f220, + 0x2deb8: 0x6dc85e20, 0x2deb9: 0x6c04ae20, 0x2deba: 0x6c097c20, 0x2debb: 0x6c12c420, + 0x2debc: 0x6c225e20, 0x2debd: 0x6c37d220, 0x2debe: 0x6c37d420, 0x2debf: 0x6c37d620, + // Block 0xb7b, offset 0x2dec0 + 0x2dec0: 0x6c37d820, 0x2dec1: 0x6c37da20, 0x2dec2: 0x6c530e20, 0x2dec3: 0x6c531020, + 0x2dec4: 0x6c531220, 0x2dec5: 0x6c531420, 0x2dec6: 0x6c531620, 0x2dec7: 0x6c531820, + 0x2dec8: 0x6c75aa20, 0x2dec9: 0x6c75ac20, 0x2deca: 0x6c75ae20, 0x2decb: 0x6c75b020, + 0x2decc: 0x6c9dec20, 0x2decd: 0x6c9dee20, 0x2dece: 0x6c9df020, 0x2decf: 0x6c9df220, + 0x2ded0: 0x6c9df420, 0x2ded1: 0x6c9df620, 0x2ded2: 0x6c9df820, 0x2ded3: 0x6c9dfa20, + 0x2ded4: 0x6ccb0420, 0x2ded5: 0x6ccb0620, 0x2ded6: 0x6ccb0820, 0x2ded7: 0x6ccb0a20, + 0x2ded8: 0x6ccb0c20, 0x2ded9: 0x6ccb0e20, 0x2deda: 0x6ccb1020, 0x2dedb: 0x6cf92c20, + 0x2dedc: 0x6cf92e20, 0x2dedd: 0x6d285820, 0x2dede: 0x6d285a20, 0x2dedf: 0x6d285c20, + 0x2dee0: 0x6d285e20, 0x2dee1: 0x6d286020, 0x2dee2: 0x6d559e20, 0x2dee3: 0x6d55a020, + 0x2dee4: 0x6d55a220, 0x2dee5: 0x6d55a420, 0x2dee6: 0x6d55a620, 0x2dee7: 0x6d810820, + 0x2dee8: 0x6d810a20, 0x2dee9: 0x6d810c20, 0x2deea: 0x6d810e20, 0x2deeb: 0x6d811020, + 0x2deec: 0x6da72020, 0x2deed: 0x6da72220, 0x2deee: 0x6da72420, 0x2deef: 0x6dc86c20, + 0x2def0: 0x6de48a20, 0x2def1: 0x6de48c20, 0x2def2: 0x6e0ee220, 0x2def3: 0x6c04b420, + 0x2def4: 0x6c380620, 0x2def5: 0x6c534820, 0x2def6: 0x6c534a20, 0x2def7: 0x6c75e020, + 0x2def8: 0x6c9e2220, 0x2def9: 0x6c9e2420, 0x2defa: 0x6c9e2620, 0x2defb: 0x6c9e2820, + 0x2defc: 0x6ccb5020, 0x2defd: 0x6ccb5220, 0x2defe: 0x6ccb6820, 0x2deff: 0x6cf95820, + // Block 0xb7c, offset 0x2df00 + 0x2df00: 0x6cf95a20, 0x2df01: 0x6cf95c20, 0x2df02: 0x6cf95e20, 0x2df03: 0x6d287820, + 0x2df04: 0x6d287a20, 0x2df05: 0x6d55ca20, 0x2df06: 0x6d55cc20, 0x2df07: 0x6d812e20, + 0x2df08: 0x6d813020, 0x2df09: 0x6dc89020, 0x2df0a: 0x6e298620, 0x2df0b: 0x6c04b620, + 0x2df0c: 0x6c04b820, 0x2df0d: 0x6c098020, 0x2df0e: 0x6c12d420, 0x2df0f: 0x6c227620, + 0x2df10: 0x6c227820, 0x2df11: 0x6c380e20, 0x2df12: 0x6c535220, 0x2df13: 0x6cf97c20, + 0x2df14: 0x6c04bc20, 0x2df15: 0x6c12d820, 0x2df16: 0x6c535820, 0x2df17: 0x6c535a20, + 0x2df18: 0x6c535c20, 0x2df19: 0x6c75ee20, 0x2df1a: 0x6da74620, 0x2df1b: 0x6c04be20, + 0x2df1c: 0x6c228220, 0x2df1d: 0x6c228420, 0x2df1e: 0x6c382a20, 0x2df1f: 0x6c382c20, + 0x2df20: 0x6c536020, 0x2df21: 0x6c536220, 0x2df22: 0x6c75f820, 0x2df23: 0x6c75fa20, + 0x2df24: 0x6c75fc20, 0x2df25: 0x6c75fe20, 0x2df26: 0x6c760020, 0x2df27: 0x6c760220, + 0x2df28: 0x6c760420, 0x2df29: 0x6c760620, 0x2df2a: 0x6c760820, 0x2df2b: 0x6c9e6220, + 0x2df2c: 0x6c9e6420, 0x2df2d: 0x6c9e6620, 0x2df2e: 0x6c9e6820, 0x2df2f: 0x6ccb7220, + 0x2df30: 0x6ccb7420, 0x2df31: 0x6ccb7620, 0x2df32: 0x6ccb7820, 0x2df33: 0x6ccb7a20, + 0x2df34: 0x6ccb7c20, 0x2df35: 0x6ccb7e20, 0x2df36: 0x6ccb8020, 0x2df37: 0x6cf98c20, + 0x2df38: 0x6cf98e20, 0x2df39: 0x6cf99020, 0x2df3a: 0x6cf99220, 0x2df3b: 0x6cf99420, + 0x2df3c: 0x6cf99620, 0x2df3d: 0x6cf99820, 0x2df3e: 0x6d28aa20, 0x2df3f: 0x6d55de20, + // Block 0xb7d, offset 0x2df40 + 0x2df40: 0x6d55e020, 0x2df41: 0x6d55e220, 0x2df42: 0x6d55e420, 0x2df43: 0x6d816620, + 0x2df44: 0x6d816820, 0x2df45: 0x6d816a20, 0x2df46: 0x6d816c20, 0x2df47: 0x6d816e20, + 0x2df48: 0x6da74a20, 0x2df49: 0x6da74c20, 0x2df4a: 0x6da74e20, 0x2df4b: 0x6dc89620, + 0x2df4c: 0x6de4a420, 0x2df4d: 0x6e1e2420, 0x2df4e: 0x6e3d4a20, 0x2df4f: 0x6c04c220, + 0x2df50: 0x6c098420, 0x2df51: 0x6c098620, 0x2df52: 0x6c12e620, 0x2df53: 0x6c385020, + 0x2df54: 0x6c04c420, 0x2df55: 0x6c098a20, 0x2df56: 0x6c12ea20, 0x2df57: 0x6c12ec20, + 0x2df58: 0x6c12ee20, 0x2df59: 0x6c229620, 0x2df5a: 0x6c229820, 0x2df5b: 0x6c385820, + 0x2df5c: 0x6c385a20, 0x2df5d: 0x6c385c20, 0x2df5e: 0x6c53b820, 0x2df5f: 0x6c53ba20, + 0x2df60: 0x6c53bc20, 0x2df61: 0x6c53be20, 0x2df62: 0x6c53c020, 0x2df63: 0x6c763a20, + 0x2df64: 0x6c763c20, 0x2df65: 0x6c763e20, 0x2df66: 0x6c764020, 0x2df67: 0x6c764220, + 0x2df68: 0x6c764420, 0x2df69: 0x6c764620, 0x2df6a: 0x6c9ea220, 0x2df6b: 0x6c9ea420, + 0x2df6c: 0x6ccbc620, 0x2df6d: 0x6ccbc820, 0x2df6e: 0x6ccbca20, 0x2df6f: 0x6ccbcc20, + 0x2df70: 0x6ccbce20, 0x2df71: 0x6cf9d820, 0x2df72: 0x6d28ec20, 0x2df73: 0x6d28ee20, + 0x2df74: 0x6c04c620, 0x2df75: 0x6c01fa20, 0x2df76: 0x6c098e20, 0x2df77: 0x6c099020, + 0x2df78: 0x6c099220, 0x2df79: 0x6c099420, 0x2df7a: 0x6c098c20, 0x2df7b: 0x6c099c20, + 0x2df7c: 0x6c12f620, 0x2df7d: 0x6c0c5c20, 0x2df7e: 0x6c099e20, 0x2df7f: 0x6c09a020, + // Block 0xb7e, offset 0x2df80 + 0x2df80: 0x6c09a220, 0x2df81: 0x6c09a420, 0x2df82: 0x6c229e20, 0x2df83: 0x6c09a620, + 0x2df84: 0x6c09a820, 0x2df85: 0x6c09aa20, 0x2df86: 0x6c12f820, 0x2df87: 0x6c09ac20, + 0x2df88: 0x6c09ae20, 0x2df89: 0x6c09b020, 0x2df8a: 0x6c12fe20, 0x2df8b: 0x6c130020, + 0x2df8c: 0x6c130220, 0x2df8d: 0x6c130420, 0x2df8e: 0x6c130620, 0x2df8f: 0x6c130820, + 0x2df90: 0x6c130a20, 0x2df91: 0x6c130c20, 0x2df92: 0x6c130e20, 0x2df93: 0x6c131020, + 0x2df94: 0x6c131220, 0x2df95: 0x6c131420, 0x2df96: 0x6c22a220, 0x2df97: 0x6c131620, + 0x2df98: 0x6c131820, 0x2df99: 0x6c131a20, 0x2df9a: 0x6c131c20, 0x2df9b: 0x6c131e20, + 0x2df9c: 0x6c132020, 0x2df9d: 0x6c132220, 0x2df9e: 0x6c22a420, 0x2df9f: 0x6c132420, + 0x2dfa0: 0x6c132620, 0x2dfa1: 0x6c132820, 0x2dfa2: 0x6c132a20, 0x2dfa3: 0x6c132c20, + 0x2dfa4: 0x6c132e20, 0x2dfa5: 0x6c22bc20, 0x2dfa6: 0x6c22be20, 0x2dfa7: 0x6c22c020, + 0x2dfa8: 0x6c22c220, 0x2dfa9: 0x6c22c420, 0x2dfaa: 0x6c22c620, 0x2dfab: 0x6c22c820, + 0x2dfac: 0x6c386620, 0x2dfad: 0x6c22ca20, 0x2dfae: 0x6c22cc20, 0x2dfaf: 0x6c22ce20, + 0x2dfb0: 0x6c22d020, 0x2dfb1: 0x6c22d220, 0x2dfb2: 0x6c22d420, 0x2dfb3: 0x6c22d620, + 0x2dfb4: 0x6c22d820, 0x2dfb5: 0x6c22da20, 0x2dfb6: 0x6c22dc20, 0x2dfb7: 0x6c135420, + 0x2dfb8: 0x6c22de20, 0x2dfb9: 0x6c22e020, 0x2dfba: 0x6c22e220, 0x2dfbb: 0x6c22e420, + 0x2dfbc: 0x6c22e620, 0x2dfbd: 0x6c22e820, 0x2dfbe: 0x6c22ea20, 0x2dfbf: 0x6c22ec20, + // Block 0xb7f, offset 0x2dfc0 + 0x2dfc0: 0x6c386820, 0x2dfc1: 0x6c22ee20, 0x2dfc2: 0x6c22f020, 0x2dfc3: 0x6c22f220, + 0x2dfc4: 0x6c22f420, 0x2dfc5: 0x6c22f620, 0x2dfc6: 0x6c22f820, 0x2dfc7: 0x6c22fa20, + 0x2dfc8: 0x6c22fc20, 0x2dfc9: 0x6c22fe20, 0x2dfca: 0x6c386a20, 0x2dfcb: 0x6c230020, + 0x2dfcc: 0x6c230220, 0x2dfcd: 0x6c230420, 0x2dfce: 0x6c230620, 0x2dfcf: 0x6c230820, + 0x2dfd0: 0x6c230a20, 0x2dfd1: 0x6c230c20, 0x2dfd2: 0x6c230e20, 0x2dfd3: 0x6c386c20, + 0x2dfd4: 0x6c231020, 0x2dfd5: 0x6c231220, 0x2dfd6: 0x6c231420, 0x2dfd7: 0x6c53ce20, + 0x2dfd8: 0x6c231620, 0x2dfd9: 0x6c231820, 0x2dfda: 0x6c231a20, 0x2dfdb: 0x6c231c20, + 0x2dfdc: 0x6c231e20, 0x2dfdd: 0x6c386e20, 0x2dfde: 0x6c232020, 0x2dfdf: 0x6c232220, + 0x2dfe0: 0x6c232420, 0x2dfe1: 0x6c232620, 0x2dfe2: 0x6c232820, 0x2dfe3: 0x6c232a20, + 0x2dfe4: 0x6c232c20, 0x2dfe5: 0x6c232e20, 0x2dfe6: 0x6c233020, 0x2dfe7: 0x6c233220, + 0x2dfe8: 0x6c233420, 0x2dfe9: 0x6c233620, 0x2dfea: 0x6c233820, 0x2dfeb: 0x6c388620, + 0x2dfec: 0x6c388820, 0x2dfed: 0x6c388a20, 0x2dfee: 0x6c388c20, 0x2dfef: 0x6c53d020, + 0x2dff0: 0x6c388e20, 0x2dff1: 0x6c389020, 0x2dff2: 0x6c389220, 0x2dff3: 0x6c389420, + 0x2dff4: 0x6c389620, 0x2dff5: 0x6c389820, 0x2dff6: 0x6c389a20, 0x2dff7: 0x6c389c20, + 0x2dff8: 0x6c389e20, 0x2dff9: 0x6c38a020, 0x2dffa: 0x6c38a220, 0x2dffb: 0x6c38a420, + 0x2dffc: 0x6c38a620, 0x2dffd: 0x6c38a820, 0x2dffe: 0x6c38aa20, 0x2dfff: 0x6c38ac20, + // Block 0xb80, offset 0x2e000 + 0x2e000: 0x6c38ae20, 0x2e001: 0x6c38b020, 0x2e002: 0x6c38b220, 0x2e003: 0x6c38b420, + 0x2e004: 0x6c38b620, 0x2e005: 0x6c38b820, 0x2e006: 0x6c38ba20, 0x2e007: 0x6c38bc20, + 0x2e008: 0x6c38be20, 0x2e009: 0x6c53d220, 0x2e00a: 0x6c38c020, 0x2e00b: 0x6c38c220, + 0x2e00c: 0x6c38c420, 0x2e00d: 0x6c38c620, 0x2e00e: 0x6c38c820, 0x2e00f: 0x6c38ca20, + 0x2e010: 0x6c38cc20, 0x2e011: 0x6c38ce20, 0x2e012: 0x6c38d020, 0x2e013: 0x6c38d220, + 0x2e014: 0x6c38d420, 0x2e015: 0x6c38d620, 0x2e016: 0x6c38d820, 0x2e017: 0x6c38da20, + 0x2e018: 0x6c38dc20, 0x2e019: 0x6c38de20, 0x2e01a: 0x6c53f220, 0x2e01b: 0x6c38e020, + 0x2e01c: 0x6c38e220, 0x2e01d: 0x6c38e420, 0x2e01e: 0x6c38e620, 0x2e01f: 0x6c38e820, + 0x2e020: 0x6c38ea20, 0x2e021: 0x6c38ec20, 0x2e022: 0x6c38ee20, 0x2e023: 0x6c38f020, + 0x2e024: 0x6c38f220, 0x2e025: 0x6c38f420, 0x2e026: 0x6c38f620, 0x2e027: 0x6c38f820, + 0x2e028: 0x6c38fa20, 0x2e029: 0x6c38fc20, 0x2e02a: 0x6c38fe20, 0x2e02b: 0x6c390020, + 0x2e02c: 0x6c390220, 0x2e02d: 0x6c390420, 0x2e02e: 0x6c390620, 0x2e02f: 0x6c390820, + 0x2e030: 0x6c764a20, 0x2e031: 0x6c390a20, 0x2e032: 0x6c390c20, 0x2e033: 0x6c390e20, + 0x2e034: 0x6c53d420, 0x2e035: 0x6c5a4620, 0x2e036: 0x6c53d620, 0x2e037: 0x6c391020, + 0x2e038: 0x6c391220, 0x2e039: 0x6c391420, 0x2e03a: 0x6c391620, 0x2e03b: 0x6c391820, + 0x2e03c: 0x6c391a20, 0x2e03d: 0x6c391c20, 0x2e03e: 0x6c391e20, 0x2e03f: 0x6c53f420, + // Block 0xb81, offset 0x2e040 + 0x2e040: 0x6c53f620, 0x2e041: 0x6c53f820, 0x2e042: 0x6c53fa20, 0x2e043: 0x6c53fc20, + 0x2e044: 0x6c53fe20, 0x2e045: 0x6c540020, 0x2e046: 0x6c540220, 0x2e047: 0x6c540420, + 0x2e048: 0x6c540620, 0x2e049: 0x6c540820, 0x2e04a: 0x6c540a20, 0x2e04b: 0x6c540c20, + 0x2e04c: 0x6c540e20, 0x2e04d: 0x6c767020, 0x2e04e: 0x6c541020, 0x2e04f: 0x6c541220, + 0x2e050: 0x6c541420, 0x2e051: 0x6c541620, 0x2e052: 0x6c541820, 0x2e053: 0x6c541a20, + 0x2e054: 0x6c541c20, 0x2e055: 0x6c541e20, 0x2e056: 0x6c767220, 0x2e057: 0x6c542020, + 0x2e058: 0x6c542220, 0x2e059: 0x6c542420, 0x2e05a: 0x6c542620, 0x2e05b: 0x6c542820, + 0x2e05c: 0x6c764c20, 0x2e05d: 0x6c542a20, 0x2e05e: 0x6c542c20, 0x2e05f: 0x6c542e20, + 0x2e060: 0x6c543020, 0x2e061: 0x6c543220, 0x2e062: 0x6c543420, 0x2e063: 0x6c543620, + 0x2e064: 0x6c543820, 0x2e065: 0x6c543a20, 0x2e066: 0x6c543c20, 0x2e067: 0x6c543e20, + 0x2e068: 0x6c544020, 0x2e069: 0x6c544220, 0x2e06a: 0x6c544420, 0x2e06b: 0x6c544620, + 0x2e06c: 0x6c544820, 0x2e06d: 0x6c544a20, 0x2e06e: 0x6c544c20, 0x2e06f: 0x6c764e20, + 0x2e070: 0x6c399020, 0x2e071: 0x6c544e20, 0x2e072: 0x6c545020, 0x2e073: 0x6c545220, + 0x2e074: 0x6c545420, 0x2e075: 0x6c545620, 0x2e076: 0x6c545820, 0x2e077: 0x6c545a20, + 0x2e078: 0x6c545c20, 0x2e079: 0x6c545e20, 0x2e07a: 0x6c546020, 0x2e07b: 0x6c546220, + 0x2e07c: 0x6c546420, 0x2e07d: 0x6c546620, 0x2e07e: 0x6c546820, 0x2e07f: 0x6c546a20, + // Block 0xb82, offset 0x2e080 + 0x2e080: 0x6c546c20, 0x2e081: 0x6c546e20, 0x2e082: 0x6c547020, 0x2e083: 0x6c547220, + 0x2e084: 0x6c547420, 0x2e085: 0x6c547620, 0x2e086: 0x6c765020, 0x2e087: 0x6c547820, + 0x2e088: 0x6c547a20, 0x2e089: 0x6c547c20, 0x2e08a: 0x6c547e20, 0x2e08b: 0x6c548020, + 0x2e08c: 0x6c548220, 0x2e08d: 0x6c548420, 0x2e08e: 0x6c548620, 0x2e08f: 0x6c548820, + 0x2e090: 0x6c548a20, 0x2e091: 0x6c548c20, 0x2e092: 0x6c548e20, 0x2e093: 0x6c549020, + 0x2e094: 0x6c549220, 0x2e095: 0x6c549420, 0x2e096: 0x6c767420, 0x2e097: 0x6c767620, + 0x2e098: 0x6c767820, 0x2e099: 0x6c767a20, 0x2e09a: 0x6c767c20, 0x2e09b: 0x6c767e20, + 0x2e09c: 0x6c768020, 0x2e09d: 0x6c768220, 0x2e09e: 0x6c768420, 0x2e09f: 0x6c768620, + 0x2e0a0: 0x6c768820, 0x2e0a1: 0x6c768a20, 0x2e0a2: 0x6c768c20, 0x2e0a3: 0x6c768e20, + 0x2e0a4: 0x6c769020, 0x2e0a5: 0x6c769220, 0x2e0a6: 0x6c769420, 0x2e0a7: 0x6c769620, + 0x2e0a8: 0x6c769820, 0x2e0a9: 0x6c769a20, 0x2e0aa: 0x6c769c20, 0x2e0ab: 0x6c769e20, + 0x2e0ac: 0x6c76a020, 0x2e0ad: 0x6c76a220, 0x2e0ae: 0x6c76a420, 0x2e0af: 0x6c76a620, + 0x2e0b0: 0x6c76a820, 0x2e0b1: 0x6c76aa20, 0x2e0b2: 0x6c76ac20, 0x2e0b3: 0x6c76ae20, + 0x2e0b4: 0x6c76b020, 0x2e0b5: 0x6c76b220, 0x2e0b6: 0x6c76b420, 0x2e0b7: 0x6c76b620, + 0x2e0b8: 0x6c76b820, 0x2e0b9: 0x6c76ba20, 0x2e0ba: 0x6c76bc20, 0x2e0bb: 0x6c76be20, + 0x2e0bc: 0x6c76c020, 0x2e0bd: 0x6c76c220, 0x2e0be: 0x6c76c420, 0x2e0bf: 0x6c76c620, + // Block 0xb83, offset 0x2e0c0 + 0x2e0c0: 0x6c76c820, 0x2e0c1: 0x6c76ca20, 0x2e0c2: 0x6c76cc20, 0x2e0c3: 0x6c76ce20, + 0x2e0c4: 0x6c76d020, 0x2e0c5: 0x6c76d220, 0x2e0c6: 0x6c76d420, 0x2e0c7: 0x6c76d620, + 0x2e0c8: 0x6c76d820, 0x2e0c9: 0x6c76da20, 0x2e0ca: 0x6c76dc20, 0x2e0cb: 0x6c76de20, + 0x2e0cc: 0x6c76e020, 0x2e0cd: 0x6c76e220, 0x2e0ce: 0x6c9eae20, 0x2e0cf: 0x6c76e420, + 0x2e0d0: 0x6c76e620, 0x2e0d1: 0x6c76e820, 0x2e0d2: 0x6c76ea20, 0x2e0d3: 0x6c76ec20, + 0x2e0d4: 0x6c76ee20, 0x2e0d5: 0x6c76f020, 0x2e0d6: 0x6c76f220, 0x2e0d7: 0x6c76f420, + 0x2e0d8: 0x6c76f620, 0x2e0d9: 0x6c9ee020, 0x2e0da: 0x6c76f820, 0x2e0db: 0x6c76fa20, + 0x2e0dc: 0x6c76fc20, 0x2e0dd: 0x6c76fe20, 0x2e0de: 0x6c770020, 0x2e0df: 0x6c770220, + 0x2e0e0: 0x6c770420, 0x2e0e1: 0x6c770620, 0x2e0e2: 0x6c770820, 0x2e0e3: 0x6c770a20, + 0x2e0e4: 0x6c770c20, 0x2e0e5: 0x6c770e20, 0x2e0e6: 0x6c771020, 0x2e0e7: 0x6c771220, + 0x2e0e8: 0x6c771420, 0x2e0e9: 0x6c771620, 0x2e0ea: 0x6c9ee220, 0x2e0eb: 0x6c9ee420, + 0x2e0ec: 0x6c9ee620, 0x2e0ed: 0x6c9ee820, 0x2e0ee: 0x6c9eea20, 0x2e0ef: 0x6c9eec20, + 0x2e0f0: 0x6c9eee20, 0x2e0f1: 0x6c9ef020, 0x2e0f2: 0x6c9ef220, 0x2e0f3: 0x6c9ef420, + 0x2e0f4: 0x6c9ef620, 0x2e0f5: 0x6c9ef820, 0x2e0f6: 0x6c9efa20, 0x2e0f7: 0x6c9efc20, + 0x2e0f8: 0x6c9efe20, 0x2e0f9: 0x6c9f0020, 0x2e0fa: 0x6c9f0220, 0x2e0fb: 0x6c9f0420, + 0x2e0fc: 0x6c9f0620, 0x2e0fd: 0x6c9f0820, 0x2e0fe: 0x6c9f0a20, 0x2e0ff: 0x6c9f0c20, + // Block 0xb84, offset 0x2e100 + 0x2e100: 0x6c9f0e20, 0x2e101: 0x6c9f1020, 0x2e102: 0x6c9f1220, 0x2e103: 0x6c9f1420, + 0x2e104: 0x6c9f1620, 0x2e105: 0x6c9f1820, 0x2e106: 0x6c9f1a20, 0x2e107: 0x6c9f1c20, + 0x2e108: 0x6c9f1e20, 0x2e109: 0x6c9f2020, 0x2e10a: 0x6c9f2220, 0x2e10b: 0x6c9f2420, + 0x2e10c: 0x6c9f2620, 0x2e10d: 0x6c9f2820, 0x2e10e: 0x6c9f2a20, 0x2e10f: 0x6c9f2c20, + 0x2e110: 0x6c9f2e20, 0x2e111: 0x6c9f3020, 0x2e112: 0x6c9f3220, 0x2e113: 0x6c9f3420, + 0x2e114: 0x6c9f3620, 0x2e115: 0x6c9f3820, 0x2e116: 0x6c9f3a20, 0x2e117: 0x6c9f3c20, + 0x2e118: 0x6c9f3e20, 0x2e119: 0x6c9f4020, 0x2e11a: 0x6c9f4220, 0x2e11b: 0x6c9f4420, + 0x2e11c: 0x6c9f4620, 0x2e11d: 0x6c9f4820, 0x2e11e: 0x6c9f4a20, 0x2e11f: 0x6c9f4c20, + 0x2e120: 0x6c9f4e20, 0x2e121: 0x6c9f5020, 0x2e122: 0x6c9f5220, 0x2e123: 0x6c9f5420, + 0x2e124: 0x6c9f5620, 0x2e125: 0x6c9f5820, 0x2e126: 0x6c9f5a20, 0x2e127: 0x6c9f5c20, + 0x2e128: 0x6c9f5e20, 0x2e129: 0x6c9f6020, 0x2e12a: 0x6c9f6220, 0x2e12b: 0x6c9f6420, + 0x2e12c: 0x6c9f6620, 0x2e12d: 0x6c9f6820, 0x2e12e: 0x6c9f6a20, 0x2e12f: 0x6c9f6c20, + 0x2e130: 0x6c9f6e20, 0x2e131: 0x6c9f7020, 0x2e132: 0x6c9f7220, 0x2e133: 0x6c9f7420, + 0x2e134: 0x6c9f7620, 0x2e135: 0x6c9f7820, 0x2e136: 0x6c9f7a20, 0x2e137: 0x6c9f7c20, + 0x2e138: 0x6c9f7e20, 0x2e139: 0x6c9f8020, 0x2e13a: 0x6c9f8220, 0x2e13b: 0x6c9f8420, + 0x2e13c: 0x6ccbdc20, 0x2e13d: 0x6c9f8620, 0x2e13e: 0x6ccbde20, 0x2e13f: 0x6c9f8820, + // Block 0xb85, offset 0x2e140 + 0x2e140: 0x6c9f8a20, 0x2e141: 0x6c9f8c20, 0x2e142: 0x6c9f8e20, 0x2e143: 0x6ccc0c20, + 0x2e144: 0x6c9f9020, 0x2e145: 0x6c9f9220, 0x2e146: 0x6c9f9420, 0x2e147: 0x6c9f9620, + 0x2e148: 0x6c9f9820, 0x2e149: 0x6c9f9a20, 0x2e14a: 0x6c9f9c20, 0x2e14b: 0x6c9f9e20, + 0x2e14c: 0x6c9fa020, 0x2e14d: 0x6c9fa220, 0x2e14e: 0x6c9fa420, 0x2e14f: 0x6c9fa620, + 0x2e150: 0x6c9fa820, 0x2e151: 0x6c9faa20, 0x2e152: 0x6c9fac20, 0x2e153: 0x6c9fae20, + 0x2e154: 0x6c9fb020, 0x2e155: 0x6c9fb220, 0x2e156: 0x6c9fb420, 0x2e157: 0x6c9fb620, + 0x2e158: 0x6ccc0e20, 0x2e159: 0x6ccc1020, 0x2e15a: 0x6c9fb820, 0x2e15b: 0x6ccc1220, + 0x2e15c: 0x6ccc1420, 0x2e15d: 0x6ccc1620, 0x2e15e: 0x6ccc1820, 0x2e15f: 0x6ccc1a20, + 0x2e160: 0x6ccc1c20, 0x2e161: 0x6ccc1e20, 0x2e162: 0x6ccc2020, 0x2e163: 0x6ccc2220, + 0x2e164: 0x6ccc2420, 0x2e165: 0x6ccc2620, 0x2e166: 0x6ccc2820, 0x2e167: 0x6ccc2a20, + 0x2e168: 0x6ccc2c20, 0x2e169: 0x6ccc2e20, 0x2e16a: 0x6ccc3020, 0x2e16b: 0x6ccc3220, + 0x2e16c: 0x6ccc3420, 0x2e16d: 0x6ccc3620, 0x2e16e: 0x6ccc3820, 0x2e16f: 0x6ccc3a20, + 0x2e170: 0x6ccc3c20, 0x2e171: 0x6ccc3e20, 0x2e172: 0x6ccc4020, 0x2e173: 0x6ccc4220, + 0x2e174: 0x6ccc4420, 0x2e175: 0x6ccc4620, 0x2e176: 0x6ccc4820, 0x2e177: 0x6ccc4a20, + 0x2e178: 0x6ccc4c20, 0x2e179: 0x6ccc4e20, 0x2e17a: 0x6ccc5020, 0x2e17b: 0x6ccc5220, + 0x2e17c: 0x6ccc5420, 0x2e17d: 0x6ccc5620, 0x2e17e: 0x6ccc5820, 0x2e17f: 0x6ccc5a20, + // Block 0xb86, offset 0x2e180 + 0x2e180: 0x6ccc5c20, 0x2e181: 0x6ccc5e20, 0x2e182: 0x6ccc6020, 0x2e183: 0x6ccc6220, + 0x2e184: 0x6ccc6420, 0x2e185: 0x6ccc6620, 0x2e186: 0x6ccc6820, 0x2e187: 0x6ccc6a20, + 0x2e188: 0x6ccc6c20, 0x2e189: 0x6ccc6e20, 0x2e18a: 0x6ccc7020, 0x2e18b: 0x6ccc7220, + 0x2e18c: 0x6ccc7420, 0x2e18d: 0x6ccc7620, 0x2e18e: 0x6ccc7820, 0x2e18f: 0x6ccc7a20, + 0x2e190: 0x6ccc7c20, 0x2e191: 0x6ccc7e20, 0x2e192: 0x6ccc8020, 0x2e193: 0x6ccc8220, + 0x2e194: 0x6ccc8420, 0x2e195: 0x6ccc8620, 0x2e196: 0x6ccc8820, 0x2e197: 0x6ccc8a20, + 0x2e198: 0x6ccc8c20, 0x2e199: 0x6ccc8e20, 0x2e19a: 0x6ccc9020, 0x2e19b: 0x6ccc9220, + 0x2e19c: 0x6ccc9420, 0x2e19d: 0x6ccc9620, 0x2e19e: 0x6ccc9820, 0x2e19f: 0x6ccc9a20, + 0x2e1a0: 0x6ccc9c20, 0x2e1a1: 0x6ccc9e20, 0x2e1a2: 0x6ccca020, 0x2e1a3: 0x6ccca220, + 0x2e1a4: 0x6ccca420, 0x2e1a5: 0x6ccca620, 0x2e1a6: 0x6ccca820, 0x2e1a7: 0x6cccaa20, + 0x2e1a8: 0x6cccac20, 0x2e1a9: 0x6cccae20, 0x2e1aa: 0x6cccb020, 0x2e1ab: 0x6cccb220, + 0x2e1ac: 0x6cf9e220, 0x2e1ad: 0x6cccb420, 0x2e1ae: 0x6cccb620, 0x2e1af: 0x6cccb820, + 0x2e1b0: 0x6cccba20, 0x2e1b1: 0x6cccbc20, 0x2e1b2: 0x6cccbe20, 0x2e1b3: 0x6cccc020, + 0x2e1b4: 0x6c9fba20, 0x2e1b5: 0x6cccc220, 0x2e1b6: 0x6cccc420, 0x2e1b7: 0x6cccc620, + 0x2e1b8: 0x6cccc820, 0x2e1b9: 0x6cccca20, 0x2e1ba: 0x6ccccc20, 0x2e1bb: 0x6cccce20, + 0x2e1bc: 0x6cccd020, 0x2e1bd: 0x6cccd220, 0x2e1be: 0x6cccd420, 0x2e1bf: 0x6cccd620, + // Block 0xb87, offset 0x2e1c0 + 0x2e1c0: 0x6cccd820, 0x2e1c1: 0x6cccda20, 0x2e1c2: 0x6cccdc20, 0x2e1c3: 0x6cccde20, + 0x2e1c4: 0x6ccce020, 0x2e1c5: 0x6ccce220, 0x2e1c6: 0x6ccce420, 0x2e1c7: 0x6ccce620, + 0x2e1c8: 0x6ccce820, 0x2e1c9: 0x6cccea20, 0x2e1ca: 0x6cccec20, 0x2e1cb: 0x6cccee20, + 0x2e1cc: 0x6cccf020, 0x2e1cd: 0x6cfa1220, 0x2e1ce: 0x6cfa1420, 0x2e1cf: 0x6cfa1620, + 0x2e1d0: 0x6cfa1820, 0x2e1d1: 0x6cfa1a20, 0x2e1d2: 0x6cfa1c20, 0x2e1d3: 0x6cfa1e20, + 0x2e1d4: 0x6cfa2020, 0x2e1d5: 0x6cfa2220, 0x2e1d6: 0x6cfa2420, 0x2e1d7: 0x6cfa2620, + 0x2e1d8: 0x6cfa2820, 0x2e1d9: 0x6cfa2a20, 0x2e1da: 0x6cfa2c20, 0x2e1db: 0x6cfa2e20, + 0x2e1dc: 0x6cfa3020, 0x2e1dd: 0x6cfa3220, 0x2e1de: 0x6cfa3420, 0x2e1df: 0x6cfa3620, + 0x2e1e0: 0x6cfa3820, 0x2e1e1: 0x6cfa3a20, 0x2e1e2: 0x6cfa3c20, 0x2e1e3: 0x6cfa3e20, + 0x2e1e4: 0x6cfa4020, 0x2e1e5: 0x6cfa4220, 0x2e1e6: 0x6cfa4420, 0x2e1e7: 0x6cfa4620, + 0x2e1e8: 0x6cfa4820, 0x2e1e9: 0x6cfa4a20, 0x2e1ea: 0x6cfa4c20, 0x2e1eb: 0x6cfa4e20, + 0x2e1ec: 0x6cfa5020, 0x2e1ed: 0x6cfa5220, 0x2e1ee: 0x6cfa5420, 0x2e1ef: 0x6cfa5620, + 0x2e1f0: 0x6cfa5820, 0x2e1f1: 0x6cfa5a20, 0x2e1f2: 0x6cfa5c20, 0x2e1f3: 0x6cfa5e20, + 0x2e1f4: 0x6cfa6020, 0x2e1f5: 0x6cfa6220, 0x2e1f6: 0x6cfa6420, 0x2e1f7: 0x6cfa6620, + 0x2e1f8: 0x6cfa6820, 0x2e1f9: 0x6cfa6a20, 0x2e1fa: 0x6cfa6c20, 0x2e1fb: 0x6cfa6e20, + 0x2e1fc: 0x6cfa7020, 0x2e1fd: 0x6cfa7220, 0x2e1fe: 0x6cfa7420, 0x2e1ff: 0x6cfa7620, + // Block 0xb88, offset 0x2e200 + 0x2e200: 0x6cfa7820, 0x2e201: 0x6cfa7a20, 0x2e202: 0x6cfa7c20, 0x2e203: 0x6cfa7e20, + 0x2e204: 0x6cfa8020, 0x2e205: 0x6cfa8220, 0x2e206: 0x6cfa8420, 0x2e207: 0x6cfa8620, + 0x2e208: 0x6cfa8820, 0x2e209: 0x6cfa8a20, 0x2e20a: 0x6cfa8c20, 0x2e20b: 0x6cccf220, + 0x2e20c: 0x6d291220, 0x2e20d: 0x6cfa8e20, 0x2e20e: 0x6d28f420, 0x2e20f: 0x6cfa9020, + 0x2e210: 0x6cfa9220, 0x2e211: 0x6cfa9420, 0x2e212: 0x6cfa9620, 0x2e213: 0x6cfa9820, + 0x2e214: 0x6cfa9a20, 0x2e215: 0x6d561820, 0x2e216: 0x6cfa9c20, 0x2e217: 0x6cfa9e20, + 0x2e218: 0x6cfaa020, 0x2e219: 0x6cfaa220, 0x2e21a: 0x6cfbd620, 0x2e21b: 0x6cfaa420, + 0x2e21c: 0x6cfaa620, 0x2e21d: 0x6cfaa820, 0x2e21e: 0x6cccf420, 0x2e21f: 0x6cfaaa20, + 0x2e220: 0x6cfaac20, 0x2e221: 0x6cfaae20, 0x2e222: 0x6cfab020, 0x2e223: 0x6cfab220, + 0x2e224: 0x6cfab420, 0x2e225: 0x6cfab620, 0x2e226: 0x6cfab820, 0x2e227: 0x6cfaba20, + 0x2e228: 0x6cfabc20, 0x2e229: 0x6cfabe20, 0x2e22a: 0x6cfac020, 0x2e22b: 0x6d291420, + 0x2e22c: 0x6d291620, 0x2e22d: 0x6d291820, 0x2e22e: 0x6d291a20, 0x2e22f: 0x6d291c20, + 0x2e230: 0x6d291e20, 0x2e231: 0x6d292020, 0x2e232: 0x6d292220, 0x2e233: 0x6d292420, + 0x2e234: 0x6d292620, 0x2e235: 0x6d292820, 0x2e236: 0x6d292a20, 0x2e237: 0x6d292c20, + 0x2e238: 0x6d292e20, 0x2e239: 0x6d293020, 0x2e23a: 0x6d293220, 0x2e23b: 0x6d293420, + 0x2e23c: 0x6d293620, 0x2e23d: 0x6d293820, 0x2e23e: 0x6d293a20, 0x2e23f: 0x6d293c20, + // Block 0xb89, offset 0x2e240 + 0x2e240: 0x6d561a20, 0x2e241: 0x6d293e20, 0x2e242: 0x6d294020, 0x2e243: 0x6d294220, + 0x2e244: 0x6d294420, 0x2e245: 0x6d294620, 0x2e246: 0x6d294820, 0x2e247: 0x6d294a20, + 0x2e248: 0x6d294c20, 0x2e249: 0x6d294e20, 0x2e24a: 0x6d295020, 0x2e24b: 0x6d564820, + 0x2e24c: 0x6d295220, 0x2e24d: 0x6d295420, 0x2e24e: 0x6d295620, 0x2e24f: 0x6d295820, + 0x2e250: 0x6d561c20, 0x2e251: 0x6d295a20, 0x2e252: 0x6d295c20, 0x2e253: 0x6cfac220, + 0x2e254: 0x6d295e20, 0x2e255: 0x6d296020, 0x2e256: 0x6d296220, 0x2e257: 0x6d296420, + 0x2e258: 0x6d296620, 0x2e259: 0x6d296820, 0x2e25a: 0x6d296a20, 0x2e25b: 0x6d296c20, + 0x2e25c: 0x6d296e20, 0x2e25d: 0x6d297020, 0x2e25e: 0x6d297220, 0x2e25f: 0x6d297420, + 0x2e260: 0x6d297620, 0x2e261: 0x6d297820, 0x2e262: 0x6d297a20, 0x2e263: 0x6d297c20, + 0x2e264: 0x6d297e20, 0x2e265: 0x6d298020, 0x2e266: 0x6d561e20, 0x2e267: 0x6d298220, + 0x2e268: 0x6d298420, 0x2e269: 0x6d298620, 0x2e26a: 0x6d298820, 0x2e26b: 0x6d298a20, + 0x2e26c: 0x6d298c20, 0x2e26d: 0x6d298e20, 0x2e26e: 0x6d299020, 0x2e26f: 0x6d299220, + 0x2e270: 0x6d299420, 0x2e271: 0x6d299620, 0x2e272: 0x6d299820, 0x2e273: 0x6d299a20, + 0x2e274: 0x6d299c20, 0x2e275: 0x6d299e20, 0x2e276: 0x6d29a020, 0x2e277: 0x6d29a220, + 0x2e278: 0x6d29a420, 0x2e279: 0x6d29a620, 0x2e27a: 0x6d29a820, 0x2e27b: 0x6d29aa20, + 0x2e27c: 0x6d29ac20, 0x2e27d: 0x6d564a20, 0x2e27e: 0x6d29ae20, 0x2e27f: 0x6d562020, + // Block 0xb8a, offset 0x2e280 + 0x2e280: 0x6d29b020, 0x2e281: 0x6d562220, 0x2e282: 0x6d29b220, 0x2e283: 0x6d29b420, + 0x2e284: 0x6d29b620, 0x2e285: 0x6d29b820, 0x2e286: 0x6d29ba20, 0x2e287: 0x6d29bc20, + 0x2e288: 0x6d29be20, 0x2e289: 0x6d29c020, 0x2e28a: 0x6d29c220, 0x2e28b: 0x6d29c420, + 0x2e28c: 0x6d29c620, 0x2e28d: 0x6d29c820, 0x2e28e: 0x6d2aca20, 0x2e28f: 0x6d564c20, + 0x2e290: 0x6d564e20, 0x2e291: 0x6d565020, 0x2e292: 0x6d565220, 0x2e293: 0x6d565420, + 0x2e294: 0x6d565620, 0x2e295: 0x6d565820, 0x2e296: 0x6d565a20, 0x2e297: 0x6d565c20, + 0x2e298: 0x6d565e20, 0x2e299: 0x6d566020, 0x2e29a: 0x6d566220, 0x2e29b: 0x6d566420, + 0x2e29c: 0x6d566620, 0x2e29d: 0x6d566820, 0x2e29e: 0x6d819a20, 0x2e29f: 0x6d566a20, + 0x2e2a0: 0x6d566c20, 0x2e2a1: 0x6d566e20, 0x2e2a2: 0x6d567020, 0x2e2a3: 0x6d567220, + 0x2e2a4: 0x6d567420, 0x2e2a5: 0x6d567620, 0x2e2a6: 0x6d567820, 0x2e2a7: 0x6d567a20, + 0x2e2a8: 0x6d567c20, 0x2e2a9: 0x6d567e20, 0x2e2aa: 0x6d568020, 0x2e2ab: 0x6d568220, + 0x2e2ac: 0x6d568420, 0x2e2ad: 0x6d568620, 0x2e2ae: 0x6d568820, 0x2e2af: 0x6d568a20, + 0x2e2b0: 0x6d568c20, 0x2e2b1: 0x6d568e20, 0x2e2b2: 0x6d569020, 0x2e2b3: 0x6d2acc20, + 0x2e2b4: 0x6d569220, 0x2e2b5: 0x6d569420, 0x2e2b6: 0x6d569620, 0x2e2b7: 0x6d569820, + 0x2e2b8: 0x6d569a20, 0x2e2b9: 0x6d569c20, 0x2e2ba: 0x6d569e20, 0x2e2bb: 0x6d56a020, + 0x2e2bc: 0x6d56a220, 0x2e2bd: 0x6d56a420, 0x2e2be: 0x6d56a620, 0x2e2bf: 0x6d56a820, + // Block 0xb8b, offset 0x2e2c0 + 0x2e2c0: 0x6da79820, 0x2e2c1: 0x6d56aa20, 0x2e2c2: 0x6d56ac20, 0x2e2c3: 0x6d819c20, + 0x2e2c4: 0x6d56ae20, 0x2e2c5: 0x6d56b020, 0x2e2c6: 0x6d56b220, 0x2e2c7: 0x6d56b420, + 0x2e2c8: 0x6d56b620, 0x2e2c9: 0x6d56b820, 0x2e2ca: 0x6d56ba20, 0x2e2cb: 0x6d56bc20, + 0x2e2cc: 0x6d56be20, 0x2e2cd: 0x6d56c020, 0x2e2ce: 0x6d56c220, 0x2e2cf: 0x6d56c420, + 0x2e2d0: 0x6d56c620, 0x2e2d1: 0x6d56c820, 0x2e2d2: 0x6d56ca20, 0x2e2d3: 0x6d56cc20, + 0x2e2d4: 0x6d56ce20, 0x2e2d5: 0x6d56d020, 0x2e2d6: 0x6d56d220, 0x2e2d7: 0x6d56d420, + 0x2e2d8: 0x6d56d620, 0x2e2d9: 0x6d81c020, 0x2e2da: 0x6d56d820, 0x2e2db: 0x6d56da20, + 0x2e2dc: 0x6d56dc20, 0x2e2dd: 0x6d56de20, 0x2e2de: 0x6d81c220, 0x2e2df: 0x6d81c420, + 0x2e2e0: 0x6d81c620, 0x2e2e1: 0x6d81c820, 0x2e2e2: 0x6d81ca20, 0x2e2e3: 0x6d81cc20, + 0x2e2e4: 0x6d81ce20, 0x2e2e5: 0x6d81d020, 0x2e2e6: 0x6d81d220, 0x2e2e7: 0x6d81d420, + 0x2e2e8: 0x6d81d620, 0x2e2e9: 0x6da77820, 0x2e2ea: 0x6d81d820, 0x2e2eb: 0x6d81da20, + 0x2e2ec: 0x6d81dc20, 0x2e2ed: 0x6d81de20, 0x2e2ee: 0x6d81e020, 0x2e2ef: 0x6d81e220, + 0x2e2f0: 0x6d81e420, 0x2e2f1: 0x6d81e620, 0x2e2f2: 0x6d81e820, 0x2e2f3: 0x6d81ea20, + 0x2e2f4: 0x6d81ec20, 0x2e2f5: 0x6d81ee20, 0x2e2f6: 0x6d81f020, 0x2e2f7: 0x6d81f220, + 0x2e2f8: 0x6d81f420, 0x2e2f9: 0x6d81f620, 0x2e2fa: 0x6d81f820, 0x2e2fb: 0x6d81fa20, + 0x2e2fc: 0x6d81fc20, 0x2e2fd: 0x6d81fe20, 0x2e2fe: 0x6d820020, 0x2e2ff: 0x6d820220, + // Block 0xb8c, offset 0x2e300 + 0x2e300: 0x6d820420, 0x2e301: 0x6d820620, 0x2e302: 0x6d820820, 0x2e303: 0x6d820a20, + 0x2e304: 0x6d820c20, 0x2e305: 0x6d820e20, 0x2e306: 0x6d580a20, 0x2e307: 0x6d821020, + 0x2e308: 0x6d821220, 0x2e309: 0x6d821420, 0x2e30a: 0x6d821620, 0x2e30b: 0x6d821820, + 0x2e30c: 0x6da77a20, 0x2e30d: 0x6d821a20, 0x2e30e: 0x6d821c20, 0x2e30f: 0x6d821e20, + 0x2e310: 0x6d56e020, 0x2e311: 0x6d822020, 0x2e312: 0x6d822220, 0x2e313: 0x6d822420, + 0x2e314: 0x6da79a20, 0x2e315: 0x6da79c20, 0x2e316: 0x6d822620, 0x2e317: 0x6da79e20, + 0x2e318: 0x6da7a020, 0x2e319: 0x6da7a220, 0x2e31a: 0x6da7a420, 0x2e31b: 0x6da7a620, + 0x2e31c: 0x6da7a820, 0x2e31d: 0x6da7aa20, 0x2e31e: 0x6da7ac20, 0x2e31f: 0x6da7ae20, + 0x2e320: 0x6da7b020, 0x2e321: 0x6da7b220, 0x2e322: 0x6da7b420, 0x2e323: 0x6da7b620, + 0x2e324: 0x6da7b820, 0x2e325: 0x6da7ba20, 0x2e326: 0x6da7bc20, 0x2e327: 0x6da7be20, + 0x2e328: 0x6da7c020, 0x2e329: 0x6da7c220, 0x2e32a: 0x6da7c420, 0x2e32b: 0x6da7c620, + 0x2e32c: 0x6da7c820, 0x2e32d: 0x6da7ca20, 0x2e32e: 0x6da7cc20, 0x2e32f: 0x6da7ce20, + 0x2e330: 0x6da7d020, 0x2e331: 0x6da7d220, 0x2e332: 0x6da7d420, 0x2e333: 0x6de4c220, + 0x2e334: 0x6da7d620, 0x2e335: 0x6da7d820, 0x2e336: 0x6da7da20, 0x2e337: 0x6dc8c220, + 0x2e338: 0x6da7dc20, 0x2e339: 0x6dc8d220, 0x2e33a: 0x6dc8d420, 0x2e33b: 0x6dc8d620, + 0x2e33c: 0x6dc8d820, 0x2e33d: 0x6dc8da20, 0x2e33e: 0x6dc8dc20, 0x2e33f: 0x6dc8de20, + // Block 0xb8d, offset 0x2e340 + 0x2e340: 0x6dc8e020, 0x2e341: 0x6dc8e220, 0x2e342: 0x6dc8e420, 0x2e343: 0x6dc8e620, + 0x2e344: 0x6d82fc20, 0x2e345: 0x6dc8e820, 0x2e346: 0x6dc8ea20, 0x2e347: 0x6dc8ec20, + 0x2e348: 0x6dc8ee20, 0x2e349: 0x6dc8f020, 0x2e34a: 0x6dc8f220, 0x2e34b: 0x6dc8f420, + 0x2e34c: 0x6dc8f620, 0x2e34d: 0x6dc8f820, 0x2e34e: 0x6dc8fa20, 0x2e34f: 0x6dc8fc20, + 0x2e350: 0x6dc8fe20, 0x2e351: 0x6dc90020, 0x2e352: 0x6dc90220, 0x2e353: 0x6dc90420, + 0x2e354: 0x6dc90620, 0x2e355: 0x6de4c420, 0x2e356: 0x6de4c620, 0x2e357: 0x6de4c820, + 0x2e358: 0x6de4ca20, 0x2e359: 0x6de4cc20, 0x2e35a: 0x6de4ce20, 0x2e35b: 0x6de4d020, + 0x2e35c: 0x6de4d220, 0x2e35d: 0x6de4d420, 0x2e35e: 0x6de4d620, 0x2e35f: 0x6de4d820, + 0x2e360: 0x6de4da20, 0x2e361: 0x6de4dc20, 0x2e362: 0x6de4de20, 0x2e363: 0x6de4e020, + 0x2e364: 0x6de4e220, 0x2e365: 0x6de4e420, 0x2e366: 0x6dc9b820, 0x2e367: 0x6de4e620, + 0x2e368: 0x6de4e820, 0x2e369: 0x6de4ea20, 0x2e36a: 0x6dfbc220, 0x2e36b: 0x6de4ec20, + 0x2e36c: 0x6de4ee20, 0x2e36d: 0x6de4f020, 0x2e36e: 0x6de4f220, 0x2e36f: 0x6dfbd020, + 0x2e370: 0x6dfbd220, 0x2e371: 0x6dfbd420, 0x2e372: 0x6dfbd620, 0x2e373: 0x6dfbd820, + 0x2e374: 0x6dfbda20, 0x2e375: 0x6dfbdc20, 0x2e376: 0x6dfbde20, 0x2e377: 0x6dfbe020, + 0x2e378: 0x6dfbe220, 0x2e379: 0x6dfbe420, 0x2e37a: 0x6dfbe620, 0x2e37b: 0x6dfbe820, + 0x2e37c: 0x6dfbea20, 0x2e37d: 0x6dfbec20, 0x2e37e: 0x6dfbee20, 0x2e37f: 0x6dfbf020, + // Block 0xb8e, offset 0x2e380 + 0x2e380: 0x6dfbf220, 0x2e381: 0x6dfbf420, 0x2e382: 0x6dfc4820, 0x2e383: 0x6e0f0620, + 0x2e384: 0x6e0f0820, 0x2e385: 0x6e0f0a20, 0x2e386: 0x6e0f0c20, 0x2e387: 0x6e0f0e20, + 0x2e388: 0x6e0f1020, 0x2e389: 0x6e0f1220, 0x2e38a: 0x6e0f1420, 0x2e38b: 0x6e0f1620, + 0x2e38c: 0x6e0f1820, 0x2e38d: 0x6e0f1a20, 0x2e38e: 0x6e3d5220, 0x2e38f: 0x6e0f1c20, + 0x2e390: 0x6e0f1e20, 0x2e391: 0x6e1e3420, 0x2e392: 0x6e1e3620, 0x2e393: 0x6e299620, + 0x2e394: 0x6e1e3820, 0x2e395: 0x6e1e3a20, 0x2e396: 0x6e1e3c20, 0x2e397: 0x6e1e3e20, + 0x2e398: 0x6e1e4020, 0x2e399: 0x6e299e20, 0x2e39a: 0x6e29a020, 0x2e39b: 0x6e29a220, + 0x2e39c: 0x6e29a420, 0x2e39d: 0x6e32a220, 0x2e39e: 0x6e32a420, 0x2e39f: 0x6e32a620, + 0x2e3a0: 0x6e32a820, 0x2e3a1: 0x6e32aa20, 0x2e3a2: 0x6e38e020, 0x2e3a3: 0x6e38e220, + 0x2e3a4: 0x6e3d5420, 0x2e3a5: 0x6e405c20, 0x2e3a6: 0x6e3d5620, 0x2e3a7: 0x6e405e20, + 0x2e3a8: 0x6e406020, 0x2e3a9: 0x6e45c420, 0x2e3aa: 0x6e463020, 0x2e3ab: 0x6c04d020, + 0x2e3ac: 0x6c04d220, 0x2e3ad: 0x6c09ca20, 0x2e3ae: 0x6c135a20, 0x2e3af: 0x6c135c20, + 0x2e3b0: 0x6c135e20, 0x2e3b1: 0x6c136020, 0x2e3b2: 0x6c136220, 0x2e3b3: 0x6c136420, + 0x2e3b4: 0x6c239020, 0x2e3b5: 0x6c239220, 0x2e3b6: 0x6c239420, 0x2e3b7: 0x6c239620, + 0x2e3b8: 0x6c239820, 0x2e3b9: 0x6c239a20, 0x2e3ba: 0x6c239c20, 0x2e3bb: 0x6c239e20, + 0x2e3bc: 0x6c23a020, 0x2e3bd: 0x6c23a220, 0x2e3be: 0x6c23a420, 0x2e3bf: 0x6c23a620, + // Block 0xb8f, offset 0x2e3c0 + 0x2e3c0: 0x6c23a820, 0x2e3c1: 0x6c399e20, 0x2e3c2: 0x6c39a020, 0x2e3c3: 0x6c39a220, + 0x2e3c4: 0x6c39a420, 0x2e3c5: 0x6c39a620, 0x2e3c6: 0x6c39a820, 0x2e3c7: 0x6c399220, + 0x2e3c8: 0x6c39aa20, 0x2e3c9: 0x6c39ac20, 0x2e3ca: 0x6c39ae20, 0x2e3cb: 0x6c39b020, + 0x2e3cc: 0x6c39b220, 0x2e3cd: 0x6c39b420, 0x2e3ce: 0x6c39b620, 0x2e3cf: 0x6c39b820, + 0x2e3d0: 0x6c39ba20, 0x2e3d1: 0x6c39bc20, 0x2e3d2: 0x6c39be20, 0x2e3d3: 0x6c39c020, + 0x2e3d4: 0x6c39c220, 0x2e3d5: 0x6c39c420, 0x2e3d6: 0x6c39c620, 0x2e3d7: 0x6c39c820, + 0x2e3d8: 0x6c39ca20, 0x2e3d9: 0x6c39cc20, 0x2e3da: 0x6c39ce20, 0x2e3db: 0x6c39d020, + 0x2e3dc: 0x6c39d220, 0x2e3dd: 0x6c39d420, 0x2e3de: 0x6c39d620, 0x2e3df: 0x6c552820, + 0x2e3e0: 0x6c552a20, 0x2e3e1: 0x6c552c20, 0x2e3e2: 0x6c552e20, 0x2e3e3: 0x6c553020, + 0x2e3e4: 0x6c553220, 0x2e3e5: 0x6c553420, 0x2e3e6: 0x6c553620, 0x2e3e7: 0x6c553820, + 0x2e3e8: 0x6c553a20, 0x2e3e9: 0x6c553c20, 0x2e3ea: 0x6c553e20, 0x2e3eb: 0x6c554020, + 0x2e3ec: 0x6c554220, 0x2e3ed: 0x6c554420, 0x2e3ee: 0x6c554620, 0x2e3ef: 0x6c554820, + 0x2e3f0: 0x6c554a20, 0x2e3f1: 0x6c554c20, 0x2e3f2: 0x6c554e20, 0x2e3f3: 0x6c555020, + 0x2e3f4: 0x6c555220, 0x2e3f5: 0x6c555420, 0x2e3f6: 0x6c555620, 0x2e3f7: 0x6c555820, + 0x2e3f8: 0x6c555a20, 0x2e3f9: 0x6c555c20, 0x2e3fa: 0x6c555e20, 0x2e3fb: 0x6c556020, + 0x2e3fc: 0x6c556220, 0x2e3fd: 0x6c556420, 0x2e3fe: 0x6c556620, 0x2e3ff: 0x6c556820, + // Block 0xb90, offset 0x2e400 + 0x2e400: 0x6c556a20, 0x2e401: 0x6c556c20, 0x2e402: 0x6c556e20, 0x2e403: 0x6c557020, + 0x2e404: 0x6c77f620, 0x2e405: 0x6c77f820, 0x2e406: 0x6c77fa20, 0x2e407: 0x6c77fc20, + 0x2e408: 0x6c77fe20, 0x2e409: 0x6c780020, 0x2e40a: 0x6c780220, 0x2e40b: 0x6c780420, + 0x2e40c: 0x6c780620, 0x2e40d: 0x6c780820, 0x2e40e: 0x6c780a20, 0x2e40f: 0x6c780c20, + 0x2e410: 0x6c780e20, 0x2e411: 0x6c781020, 0x2e412: 0x6c781220, 0x2e413: 0x6c781420, + 0x2e414: 0x6c781620, 0x2e415: 0x6c781820, 0x2e416: 0x6c781a20, 0x2e417: 0x6c781c20, + 0x2e418: 0x6c781e20, 0x2e419: 0x6c782020, 0x2e41a: 0x6c782220, 0x2e41b: 0x6c782420, + 0x2e41c: 0x6c782620, 0x2e41d: 0x6c782820, 0x2e41e: 0x6c782a20, 0x2e41f: 0x6c782c20, + 0x2e420: 0x6c782e20, 0x2e421: 0x6c783020, 0x2e422: 0x6c783220, 0x2e423: 0x6c783420, + 0x2e424: 0x6c783620, 0x2e425: 0x6c783820, 0x2e426: 0x6c783a20, 0x2e427: 0x6c783c20, + 0x2e428: 0x6c783e20, 0x2e429: 0x6c784020, 0x2e42a: 0x6c784220, 0x2e42b: 0x6c784420, + 0x2e42c: 0x6c784620, 0x2e42d: 0x6c784820, 0x2e42e: 0x6c784a20, 0x2e42f: 0x6ca0f020, + 0x2e430: 0x6ca0f220, 0x2e431: 0x6ca0f420, 0x2e432: 0x6ca0f620, 0x2e433: 0x6ca0f820, + 0x2e434: 0x6ca0fa20, 0x2e435: 0x6ca0fc20, 0x2e436: 0x6ca0fe20, 0x2e437: 0x6ca10020, + 0x2e438: 0x6ca10220, 0x2e439: 0x6ca10420, 0x2e43a: 0x6ca10620, 0x2e43b: 0x6ccddc20, + 0x2e43c: 0x6ca10820, 0x2e43d: 0x6ca10a20, 0x2e43e: 0x6ca10c20, 0x2e43f: 0x6ca10e20, + // Block 0xb91, offset 0x2e440 + 0x2e440: 0x6ca11020, 0x2e441: 0x6ca11220, 0x2e442: 0x6ca11420, 0x2e443: 0x6ca11620, + 0x2e444: 0x6ca11820, 0x2e445: 0x6ca11a20, 0x2e446: 0x6ca11c20, 0x2e447: 0x6ca11e20, + 0x2e448: 0x6ca12020, 0x2e449: 0x6ca12220, 0x2e44a: 0x6ca12420, 0x2e44b: 0x6ca12620, + 0x2e44c: 0x6ca12820, 0x2e44d: 0x6ca12a20, 0x2e44e: 0x6ca12c20, 0x2e44f: 0x6ca12e20, + 0x2e450: 0x6ca13020, 0x2e451: 0x6ca13220, 0x2e452: 0x6ca13420, 0x2e453: 0x6ca13620, + 0x2e454: 0x6ca1cc20, 0x2e455: 0x6ca13820, 0x2e456: 0x6ca13a20, 0x2e457: 0x6ca13c20, + 0x2e458: 0x6ca13e20, 0x2e459: 0x6ccdf620, 0x2e45a: 0x6ccdf820, 0x2e45b: 0x6ccdfa20, + 0x2e45c: 0x6ccdfc20, 0x2e45d: 0x6ccdfe20, 0x2e45e: 0x6cce0020, 0x2e45f: 0x6cce0220, + 0x2e460: 0x6cce0420, 0x2e461: 0x6cce0620, 0x2e462: 0x6cce0820, 0x2e463: 0x6cce0a20, + 0x2e464: 0x6cce0c20, 0x2e465: 0x6cce0e20, 0x2e466: 0x6cce1020, 0x2e467: 0x6cce1220, + 0x2e468: 0x6cce1420, 0x2e469: 0x6cce1620, 0x2e46a: 0x6cce1820, 0x2e46b: 0x6cce1a20, + 0x2e46c: 0x6cce1c20, 0x2e46d: 0x6cce1e20, 0x2e46e: 0x6cce2020, 0x2e46f: 0x6cce2220, + 0x2e470: 0x6cce2420, 0x2e471: 0x6cce2620, 0x2e472: 0x6cce2820, 0x2e473: 0x6cce2a20, + 0x2e474: 0x6cce2c20, 0x2e475: 0x6cce2e20, 0x2e476: 0x6cce3020, 0x2e477: 0x6cce3220, + 0x2e478: 0x6cce3420, 0x2e479: 0x6cce3620, 0x2e47a: 0x6cce3820, 0x2e47b: 0x6cce3a20, + 0x2e47c: 0x6cce3c20, 0x2e47d: 0x6cce3e20, 0x2e47e: 0x6cce4020, 0x2e47f: 0x6cce4220, + // Block 0xb92, offset 0x2e480 + 0x2e480: 0x6cce4420, 0x2e481: 0x6cfbfc20, 0x2e482: 0x6cfbfe20, 0x2e483: 0x6cfc0020, + 0x2e484: 0x6cfc0220, 0x2e485: 0x6cfc0420, 0x2e486: 0x6cfc0620, 0x2e487: 0x6cfc0820, + 0x2e488: 0x6cfc0a20, 0x2e489: 0x6cfc0c20, 0x2e48a: 0x6cfc0e20, 0x2e48b: 0x6cfc1020, + 0x2e48c: 0x6cfc1220, 0x2e48d: 0x6cfc1420, 0x2e48e: 0x6cfc1620, 0x2e48f: 0x6cfc1820, + 0x2e490: 0x6cfc1a20, 0x2e491: 0x6cfc1c20, 0x2e492: 0x6cfc1e20, 0x2e493: 0x6cfc2020, + 0x2e494: 0x6cfc2220, 0x2e495: 0x6d2ace20, 0x2e496: 0x6cfc2420, 0x2e497: 0x6cfc2620, + 0x2e498: 0x6cfc2820, 0x2e499: 0x6cfc2a20, 0x2e49a: 0x6cfc2c20, 0x2e49b: 0x6d2ad020, + 0x2e49c: 0x6cfc2e20, 0x2e49d: 0x6cfc3020, 0x2e49e: 0x6cfc3220, 0x2e49f: 0x6cfc3420, + 0x2e4a0: 0x6cfc3620, 0x2e4a1: 0x6cfc3820, 0x2e4a2: 0x6cfc3a20, 0x2e4a3: 0x6cfc3c20, + 0x2e4a4: 0x6cfc3e20, 0x2e4a5: 0x6cfc4020, 0x2e4a6: 0x6cfc4220, 0x2e4a7: 0x6cfc4420, + 0x2e4a8: 0x6cfc4620, 0x2e4a9: 0x6cfc4820, 0x2e4aa: 0x6cfc4a20, 0x2e4ab: 0x6cfc4c20, + 0x2e4ac: 0x6cfc4e20, 0x2e4ad: 0x6cfc5020, 0x2e4ae: 0x6cce4620, 0x2e4af: 0x6cfc5220, + 0x2e4b0: 0x6cfc5420, 0x2e4b1: 0x6cfc5620, 0x2e4b2: 0x6cfc5820, 0x2e4b3: 0x6cfc5a20, + 0x2e4b4: 0x6cfc5c20, 0x2e4b5: 0x6cfc5e20, 0x2e4b6: 0x6cfc6020, 0x2e4b7: 0x6cfc6220, + 0x2e4b8: 0x6cfc6420, 0x2e4b9: 0x6d2aea20, 0x2e4ba: 0x6cfc6620, 0x2e4bb: 0x6d2aec20, + 0x2e4bc: 0x6d2aee20, 0x2e4bd: 0x6d2af020, 0x2e4be: 0x6d2af220, 0x2e4bf: 0x6d2af420, + // Block 0xb93, offset 0x2e4c0 + 0x2e4c0: 0x6d2af620, 0x2e4c1: 0x6d2af820, 0x2e4c2: 0x6d2afa20, 0x2e4c3: 0x6d2afc20, + 0x2e4c4: 0x6d2afe20, 0x2e4c5: 0x6d2b0020, 0x2e4c6: 0x6d2b0220, 0x2e4c7: 0x6d2b0420, + 0x2e4c8: 0x6d2b0620, 0x2e4c9: 0x6d2b0820, 0x2e4ca: 0x6d2b0a20, 0x2e4cb: 0x6d2b0c20, + 0x2e4cc: 0x6d2b0e20, 0x2e4cd: 0x6d2b1020, 0x2e4ce: 0x6d2b1220, 0x2e4cf: 0x6d2b1420, + 0x2e4d0: 0x6d2b1620, 0x2e4d1: 0x6d2b1820, 0x2e4d2: 0x6d2b1a20, 0x2e4d3: 0x6d2b1c20, + 0x2e4d4: 0x6d2b1e20, 0x2e4d5: 0x6d2b2020, 0x2e4d6: 0x6d2b2220, 0x2e4d7: 0x6d2b2420, + 0x2e4d8: 0x6d2b2620, 0x2e4d9: 0x6d2b2820, 0x2e4da: 0x6d581e20, 0x2e4db: 0x6d582020, + 0x2e4dc: 0x6d582220, 0x2e4dd: 0x6d582420, 0x2e4de: 0x6d582620, 0x2e4df: 0x6d582820, + 0x2e4e0: 0x6d582a20, 0x2e4e1: 0x6d582c20, 0x2e4e2: 0x6d582e20, 0x2e4e3: 0x6d583020, + 0x2e4e4: 0x6d583220, 0x2e4e5: 0x6d583420, 0x2e4e6: 0x6d580c20, 0x2e4e7: 0x6d583620, + 0x2e4e8: 0x6d583820, 0x2e4e9: 0x6d583a20, 0x2e4ea: 0x6d583c20, 0x2e4eb: 0x6d583e20, + 0x2e4ec: 0x6d584020, 0x2e4ed: 0x6d584220, 0x2e4ee: 0x6d584420, 0x2e4ef: 0x6d584620, + 0x2e4f0: 0x6d584820, 0x2e4f1: 0x6d584a20, 0x2e4f2: 0x6d584c20, 0x2e4f3: 0x6d584e20, + 0x2e4f4: 0x6d585020, 0x2e4f5: 0x6d585220, 0x2e4f6: 0x6d831420, 0x2e4f7: 0x6d831620, + 0x2e4f8: 0x6d831820, 0x2e4f9: 0x6d831a20, 0x2e4fa: 0x6d831c20, 0x2e4fb: 0x6d831e20, + 0x2e4fc: 0x6d832020, 0x2e4fd: 0x6d832220, 0x2e4fe: 0x6d832420, 0x2e4ff: 0x6d832620, + // Block 0xb94, offset 0x2e500 + 0x2e500: 0x6d832820, 0x2e501: 0x6d832a20, 0x2e502: 0x6d832c20, 0x2e503: 0x6d832e20, + 0x2e504: 0x6d833020, 0x2e505: 0x6d833220, 0x2e506: 0x6d833420, 0x2e507: 0x6d833620, + 0x2e508: 0x6d833820, 0x2e509: 0x6d833a20, 0x2e50a: 0x6d833c20, 0x2e50b: 0x6d833e20, + 0x2e50c: 0x6d834020, 0x2e50d: 0x6d834220, 0x2e50e: 0x6d834420, 0x2e50f: 0x6d834620, + 0x2e510: 0x6d834820, 0x2e511: 0x6d834a20, 0x2e512: 0x6d834c20, 0x2e513: 0x6d834e20, + 0x2e514: 0x6d835020, 0x2e515: 0x6d835220, 0x2e516: 0x6d835420, 0x2e517: 0x6d835620, + 0x2e518: 0x6d835820, 0x2e519: 0x6d835a20, 0x2e51a: 0x6d835c20, 0x2e51b: 0x6d835e20, + 0x2e51c: 0x6d836020, 0x2e51d: 0x6d836220, 0x2e51e: 0x6d836420, 0x2e51f: 0x6da87c20, + 0x2e520: 0x6da87e20, 0x2e521: 0x6da88020, 0x2e522: 0x6da88220, 0x2e523: 0x6da88420, + 0x2e524: 0x6da88620, 0x2e525: 0x6da88820, 0x2e526: 0x6da88a20, 0x2e527: 0x6da88c20, + 0x2e528: 0x6da88e20, 0x2e529: 0x6da89020, 0x2e52a: 0x6da89220, 0x2e52b: 0x6da89420, + 0x2e52c: 0x6da89620, 0x2e52d: 0x6da89820, 0x2e52e: 0x6da89a20, 0x2e52f: 0x6da89c20, + 0x2e530: 0x6da89e20, 0x2e531: 0x6da8a020, 0x2e532: 0x6da8a220, 0x2e533: 0x6da8a420, + 0x2e534: 0x6da8a620, 0x2e535: 0x6da8a820, 0x2e536: 0x6da8aa20, 0x2e537: 0x6da8ac20, + 0x2e538: 0x6dc9be20, 0x2e539: 0x6dc9c020, 0x2e53a: 0x6dc9c220, 0x2e53b: 0x6dc9c420, + 0x2e53c: 0x6dc9c620, 0x2e53d: 0x6dc9c820, 0x2e53e: 0x6dc9ca20, 0x2e53f: 0x6dc9cc20, + // Block 0xb95, offset 0x2e540 + 0x2e540: 0x6dc9ce20, 0x2e541: 0x6dc9d020, 0x2e542: 0x6de57020, 0x2e543: 0x6dc9d220, + 0x2e544: 0x6de57820, 0x2e545: 0x6de57a20, 0x2e546: 0x6de57c20, 0x2e547: 0x6de57e20, + 0x2e548: 0x6de58020, 0x2e549: 0x6de58220, 0x2e54a: 0x6de58420, 0x2e54b: 0x6dfc5220, + 0x2e54c: 0x6de58620, 0x2e54d: 0x6de58820, 0x2e54e: 0x6de58a20, 0x2e54f: 0x6dfc5420, + 0x2e550: 0x6dfc5620, 0x2e551: 0x6dfc5820, 0x2e552: 0x6dfc5a20, 0x2e553: 0x6dfc5c20, + 0x2e554: 0x6dfc5e20, 0x2e555: 0x6de58c20, 0x2e556: 0x6dfc6020, 0x2e557: 0x6dfc6220, + 0x2e558: 0x6dfc6420, 0x2e559: 0x6e0f7e20, 0x2e55a: 0x6e0f8020, 0x2e55b: 0x6e0f8220, + 0x2e55c: 0x6e1e7020, 0x2e55d: 0x6e0fb220, 0x2e55e: 0x6e1e7220, 0x2e55f: 0x6e1e7420, + 0x2e560: 0x6e1e7620, 0x2e561: 0x6e29da20, 0x2e562: 0x6e29dc20, 0x2e563: 0x6e32c020, + 0x2e564: 0x6e38f220, 0x2e565: 0x6e38f420, 0x2e566: 0x6e38f620, 0x2e567: 0x6e42b620, + 0x2e568: 0x6e443420, 0x2e569: 0x6e468220, 0x2e56a: 0x6c04d620, 0x2e56b: 0x6c04d820, + 0x2e56c: 0x6c3a2820, 0x2e56d: 0x6c3a2a20, 0x2e56e: 0x6c55ee20, 0x2e56f: 0x6c55f020, + 0x2e570: 0x6c55f220, 0x2e571: 0x6c78ca20, 0x2e572: 0x6ccf0a20, 0x2e573: 0x6d2bdc20, + 0x2e574: 0x6d590420, 0x2e575: 0x6da93020, 0x2e576: 0x6c04de20, 0x2e577: 0x6c137a20, + 0x2e578: 0x6c3a3a20, 0x2e579: 0x6c78d620, 0x2e57a: 0x6cfd4020, 0x2e57b: 0x6c04e020, + 0x2e57c: 0x6c561820, 0x2e57d: 0x6ca1e020, 0x2e57e: 0x6d2bec20, 0x2e57f: 0x6c04e420, + // Block 0xb96, offset 0x2e580 + 0x2e580: 0x6c3a4620, 0x2e581: 0x6c562020, 0x2e582: 0x6c78e220, 0x2e583: 0x6cfd4820, + 0x2e584: 0x6d2bf020, 0x2e585: 0x6d591e20, 0x2e586: 0x6da93220, 0x2e587: 0x6c04e820, + 0x2e588: 0x6c3a5220, 0x2e589: 0x6c562a20, 0x2e58a: 0x6c562c20, 0x2e58b: 0x6ccf3c20, + 0x2e58c: 0x6ccf3e20, 0x2e58d: 0x6ccf4020, 0x2e58e: 0x6cfd5020, 0x2e58f: 0x6cfd5220, + 0x2e590: 0x6cfd5420, 0x2e591: 0x6cfd5620, 0x2e592: 0x6cfd5820, 0x2e593: 0x6d2bfc20, + 0x2e594: 0x6d2bfe20, 0x2e595: 0x6d592820, 0x2e596: 0x6d592a20, 0x2e597: 0x6d592c20, + 0x2e598: 0x6de5e220, 0x2e599: 0x6c04ec20, 0x2e59a: 0x6ccf6620, 0x2e59b: 0x6c04f020, + 0x2e59c: 0x6c04f220, 0x2e59d: 0x6c138020, 0x2e59e: 0x6c138220, 0x2e59f: 0x6c138420, + 0x2e5a0: 0x6c23ec20, 0x2e5a1: 0x6c23ee20, 0x2e5a2: 0x6c23f020, 0x2e5a3: 0x6c23f220, + 0x2e5a4: 0x6c23f420, 0x2e5a5: 0x6c3a6c20, 0x2e5a6: 0x6c3a6e20, 0x2e5a7: 0x6c3a7020, + 0x2e5a8: 0x6c3a7220, 0x2e5a9: 0x6c3a7420, 0x2e5aa: 0x6c3a7620, 0x2e5ab: 0x6c3a7820, + 0x2e5ac: 0x6c3a7a20, 0x2e5ad: 0x6c564c20, 0x2e5ae: 0x6c564e20, 0x2e5af: 0x6c565020, + 0x2e5b0: 0x6c565220, 0x2e5b1: 0x6c565420, 0x2e5b2: 0x6c565620, 0x2e5b3: 0x6c565820, + 0x2e5b4: 0x6c565a20, 0x2e5b5: 0x6c565c20, 0x2e5b6: 0x6c791020, 0x2e5b7: 0x6c791220, + 0x2e5b8: 0x6c791420, 0x2e5b9: 0x6c791620, 0x2e5ba: 0x6c791820, 0x2e5bb: 0x6ca21e20, + 0x2e5bc: 0x6ca22020, 0x2e5bd: 0x6ca22220, 0x2e5be: 0x6ca22420, 0x2e5bf: 0x6ca22620, + // Block 0xb97, offset 0x2e5c0 + 0x2e5c0: 0x6ccf7820, 0x2e5c1: 0x6ca22820, 0x2e5c2: 0x6ccf7a20, 0x2e5c3: 0x6ccf7c20, + 0x2e5c4: 0x6ccf7e20, 0x2e5c5: 0x6ccf8020, 0x2e5c6: 0x6ccf8220, 0x2e5c7: 0x6ccf8420, + 0x2e5c8: 0x6ccf8620, 0x2e5c9: 0x6ccf8820, 0x2e5ca: 0x6ccf8a20, 0x2e5cb: 0x6ccf8c20, + 0x2e5cc: 0x6cfd7820, 0x2e5cd: 0x6cfd7a20, 0x2e5ce: 0x6cfd7c20, 0x2e5cf: 0x6cfd7e20, + 0x2e5d0: 0x6cfd8020, 0x2e5d1: 0x6cfd8220, 0x2e5d2: 0x6d2c1620, 0x2e5d3: 0x6d2c1820, + 0x2e5d4: 0x6d2c1a20, 0x2e5d5: 0x6d2c1c20, 0x2e5d6: 0x6d2c1e20, 0x2e5d7: 0x6d2c2020, + 0x2e5d8: 0x6d595020, 0x2e5d9: 0x6d595220, 0x2e5da: 0x6d595420, 0x2e5db: 0x6d595620, + 0x2e5dc: 0x6d845820, 0x2e5dd: 0x6d845a20, 0x2e5de: 0x6d845c20, 0x2e5df: 0x6d845e20, + 0x2e5e0: 0x6da94e20, 0x2e5e1: 0x6de5e620, 0x2e5e2: 0x6de5e820, 0x2e5e3: 0x6de5ea20, + 0x2e5e4: 0x6de5ec20, 0x2e5e5: 0x6de5ee20, 0x2e5e6: 0x6de5f020, 0x2e5e7: 0x6dfcd820, + 0x2e5e8: 0x6dfcda20, 0x2e5e9: 0x6e1e9c20, 0x2e5ea: 0x6e390e20, 0x2e5eb: 0x6e407820, + 0x2e5ec: 0x6c04f420, 0x2e5ed: 0x6c01fe20, 0x2e5ee: 0x6c09dc20, 0x2e5ef: 0x6c09de20, + 0x2e5f0: 0x6c09e020, 0x2e5f1: 0x6c138c20, 0x2e5f2: 0x6c138e20, 0x2e5f3: 0x6c139020, + 0x2e5f4: 0x6c139220, 0x2e5f5: 0x6c139420, 0x2e5f6: 0x6c240020, 0x2e5f7: 0x6c139620, + 0x2e5f8: 0x6c139820, 0x2e5f9: 0x6c240a20, 0x2e5fa: 0x6c240c20, 0x2e5fb: 0x6c240e20, + 0x2e5fc: 0x6c241020, 0x2e5fd: 0x6c241220, 0x2e5fe: 0x6c241420, 0x2e5ff: 0x6c241620, + // Block 0xb98, offset 0x2e600 + 0x2e600: 0x6c3ab620, 0x2e601: 0x6c241820, 0x2e602: 0x6c241a20, 0x2e603: 0x6c241c20, + 0x2e604: 0x6c241e20, 0x2e605: 0x6c242020, 0x2e606: 0x6c242220, 0x2e607: 0x6c242420, + 0x2e608: 0x6c242620, 0x2e609: 0x6c3acc20, 0x2e60a: 0x6c569620, 0x2e60b: 0x6c3ace20, + 0x2e60c: 0x6c3ad020, 0x2e60d: 0x6c3ad220, 0x2e60e: 0x6c3ad420, 0x2e60f: 0x6c3ad620, + 0x2e610: 0x6c3ad820, 0x2e611: 0x6c3ada20, 0x2e612: 0x6c3adc20, 0x2e613: 0x6c3ade20, + 0x2e614: 0x6c3ae020, 0x2e615: 0x6c3ae220, 0x2e616: 0x6c3ae420, 0x2e617: 0x6c3ae620, + 0x2e618: 0x6c3ae820, 0x2e619: 0x6c3aea20, 0x2e61a: 0x6c3aec20, 0x2e61b: 0x6c3aee20, + 0x2e61c: 0x6c3af020, 0x2e61d: 0x6c3af220, 0x2e61e: 0x6c3af420, 0x2e61f: 0x6c56a420, + 0x2e620: 0x6c56a620, 0x2e621: 0x6c56a820, 0x2e622: 0x6c56aa20, 0x2e623: 0x6c56ac20, + 0x2e624: 0x6c56ae20, 0x2e625: 0x6c56b020, 0x2e626: 0x6c56b220, 0x2e627: 0x6c56b420, + 0x2e628: 0x6c56b620, 0x2e629: 0x6c56b820, 0x2e62a: 0x6c56ba20, 0x2e62b: 0x6c56bc20, + 0x2e62c: 0x6c56be20, 0x2e62d: 0x6c56c020, 0x2e62e: 0x6c56c220, 0x2e62f: 0x6c56c420, + 0x2e630: 0x6c56c620, 0x2e631: 0x6c56c820, 0x2e632: 0x6c56ca20, 0x2e633: 0x6c794420, + 0x2e634: 0x6c794620, 0x2e635: 0x6c794820, 0x2e636: 0x6c794a20, 0x2e637: 0x6c794c20, + 0x2e638: 0x6c794e20, 0x2e639: 0x6c795020, 0x2e63a: 0x6c795220, 0x2e63b: 0x6c795420, + 0x2e63c: 0x6c795620, 0x2e63d: 0x6c795820, 0x2e63e: 0x6c795a20, 0x2e63f: 0x6ca25220, + // Block 0xb99, offset 0x2e640 + 0x2e640: 0x6c795c20, 0x2e641: 0x6c795e20, 0x2e642: 0x6c796020, 0x2e643: 0x6c796220, + 0x2e644: 0x6ca26420, 0x2e645: 0x6ca26620, 0x2e646: 0x6ccfce20, 0x2e647: 0x6ca26820, + 0x2e648: 0x6ca26a20, 0x2e649: 0x6ca26c20, 0x2e64a: 0x6ca26e20, 0x2e64b: 0x6ccfd020, + 0x2e64c: 0x6ccfd220, 0x2e64d: 0x6ca27020, 0x2e64e: 0x6ca27220, 0x2e64f: 0x6ca27420, + 0x2e650: 0x6ca27620, 0x2e651: 0x6ca27820, 0x2e652: 0x6ccfd420, 0x2e653: 0x6ca27a20, + 0x2e654: 0x6ca27c20, 0x2e655: 0x6ca27e20, 0x2e656: 0x6ca28020, 0x2e657: 0x6ca28220, + 0x2e658: 0x6ca28420, 0x2e659: 0x6ca28620, 0x2e65a: 0x6ca28820, 0x2e65b: 0x6ca28a20, + 0x2e65c: 0x6ca28c20, 0x2e65d: 0x6ca28e20, 0x2e65e: 0x6ca29020, 0x2e65f: 0x6ca29220, + 0x2e660: 0x6ca29420, 0x2e661: 0x6ca29620, 0x2e662: 0x6ccfe420, 0x2e663: 0x6ccfe620, + 0x2e664: 0x6ccfe820, 0x2e665: 0x6ccfea20, 0x2e666: 0x6ccfec20, 0x2e667: 0x6ccfee20, + 0x2e668: 0x6ccff020, 0x2e669: 0x6ccff220, 0x2e66a: 0x6ca29820, 0x2e66b: 0x6ccfd620, + 0x2e66c: 0x6ccff420, 0x2e66d: 0x6ccff620, 0x2e66e: 0x6cfdbe20, 0x2e66f: 0x6ccff820, + 0x2e670: 0x6ccffa20, 0x2e671: 0x6ccffc20, 0x2e672: 0x6ccffe20, 0x2e673: 0x6cd00020, + 0x2e674: 0x6cd00220, 0x2e675: 0x6cd00420, 0x2e676: 0x6cd00620, 0x2e677: 0x6cfdc020, + 0x2e678: 0x6cd00820, 0x2e679: 0x6cd00a20, 0x2e67a: 0x6cfdd220, 0x2e67b: 0x6cfdd420, + 0x2e67c: 0x6cfdd620, 0x2e67d: 0x6cfdd820, 0x2e67e: 0x6cfdda20, 0x2e67f: 0x6cfddc20, + // Block 0xb9a, offset 0x2e680 + 0x2e680: 0x6cfdde20, 0x2e681: 0x6cfdc220, 0x2e682: 0x6cfde020, 0x2e683: 0x6d2c6a20, + 0x2e684: 0x6d2c7820, 0x2e685: 0x6cfde220, 0x2e686: 0x6cfde420, 0x2e687: 0x6cfde620, + 0x2e688: 0x6cfde820, 0x2e689: 0x6cfdea20, 0x2e68a: 0x6cfdec20, 0x2e68b: 0x6d599420, + 0x2e68c: 0x6d2c7a20, 0x2e68d: 0x6d2c7c20, 0x2e68e: 0x6d598620, 0x2e68f: 0x6d2c7e20, + 0x2e690: 0x6d2c8020, 0x2e691: 0x6d2c8220, 0x2e692: 0x6d2c8420, 0x2e693: 0x6d2c6820, + 0x2e694: 0x6d2c8620, 0x2e695: 0x6d2c8820, 0x2e696: 0x6d599620, 0x2e697: 0x6d599820, + 0x2e698: 0x6d599a20, 0x2e699: 0x6d599c20, 0x2e69a: 0x6d599e20, 0x2e69b: 0x6d59a020, + 0x2e69c: 0x6d59a220, 0x2e69d: 0x6d59a420, 0x2e69e: 0x6d59a620, 0x2e69f: 0x6d59a820, + 0x2e6a0: 0x6d59aa20, 0x2e6a1: 0x6d59ac20, 0x2e6a2: 0x6d59ae20, 0x2e6a3: 0x6d847e20, + 0x2e6a4: 0x6d59b020, 0x2e6a5: 0x6d848620, 0x2e6a6: 0x6d848820, 0x2e6a7: 0x6d848a20, + 0x2e6a8: 0x6d848c20, 0x2e6a9: 0x6d848e20, 0x2e6aa: 0x6d849020, 0x2e6ab: 0x6d849220, + 0x2e6ac: 0x6d849420, 0x2e6ad: 0x6d849620, 0x2e6ae: 0x6da96a20, 0x2e6af: 0x6da96c20, + 0x2e6b0: 0x6da96e20, 0x2e6b1: 0x6da97020, 0x2e6b2: 0x6da97220, 0x2e6b3: 0x6da97420, + 0x2e6b4: 0x6da97620, 0x2e6b5: 0x6dca5a20, 0x2e6b6: 0x6dca5c20, 0x2e6b7: 0x6dca5e20, + 0x2e6b8: 0x6de60020, 0x2e6b9: 0x6de60620, 0x2e6ba: 0x6de60820, 0x2e6bb: 0x6dfce620, + 0x2e6bc: 0x6dfcf020, 0x2e6bd: 0x6dfcf220, 0x2e6be: 0x6e0fc820, 0x2e6bf: 0x6e1ea820, + // Block 0xb9b, offset 0x2e6c0 + 0x2e6c0: 0x6e1eaa20, 0x2e6c1: 0x6e2a0c20, 0x2e6c2: 0x6e2a0e20, 0x2e6c3: 0x6e2a1020, + 0x2e6c4: 0x6c09ee20, 0x2e6c5: 0x6c572620, 0x2e6c6: 0x6c79ba20, 0x2e6c7: 0x6ca2d620, + 0x2e6c8: 0x6ca2d820, 0x2e6c9: 0x6c09f220, 0x2e6ca: 0x6c09f420, 0x2e6cb: 0x6c04fa20, + 0x2e6cc: 0x6c09f620, 0x2e6cd: 0x6c09f820, 0x2e6ce: 0x6c13be20, 0x2e6cf: 0x6c13c020, + 0x2e6d0: 0x6c13c220, 0x2e6d1: 0x6c13c420, 0x2e6d2: 0x6c247420, 0x2e6d3: 0x6c247620, + 0x2e6d4: 0x6c247820, 0x2e6d5: 0x6c247a20, 0x2e6d6: 0x6c247c20, 0x2e6d7: 0x6c247e20, + 0x2e6d8: 0x6c248020, 0x2e6d9: 0x6c248220, 0x2e6da: 0x6c248420, 0x2e6db: 0x6c248620, + 0x2e6dc: 0x6c3b4420, 0x2e6dd: 0x6c3b4620, 0x2e6de: 0x6c3b4820, 0x2e6df: 0x6c3b4a20, + 0x2e6e0: 0x6c3b4c20, 0x2e6e1: 0x6c3b4e20, 0x2e6e2: 0x6c3b5020, 0x2e6e3: 0x6c3b5220, + 0x2e6e4: 0x6c3b5420, 0x2e6e5: 0x6c3b5620, 0x2e6e6: 0x6c3b5820, 0x2e6e7: 0x6c3b5a20, + 0x2e6e8: 0x6c3b5c20, 0x2e6e9: 0x6c3b5e20, 0x2e6ea: 0x6c3b6020, 0x2e6eb: 0x6c3b6220, + 0x2e6ec: 0x6c3b6420, 0x2e6ed: 0x6c3b6620, 0x2e6ee: 0x6c3b6820, 0x2e6ef: 0x6c3b6a20, + 0x2e6f0: 0x6c3b6c20, 0x2e6f1: 0x6c3b6e20, 0x2e6f2: 0x6c573a20, 0x2e6f3: 0x6c573c20, + 0x2e6f4: 0x6c573e20, 0x2e6f5: 0x6c574020, 0x2e6f6: 0x6c574220, 0x2e6f7: 0x6c574420, + 0x2e6f8: 0x6c574620, 0x2e6f9: 0x6c574820, 0x2e6fa: 0x6c79be20, 0x2e6fb: 0x6c574a20, + 0x2e6fc: 0x6c79c020, 0x2e6fd: 0x6c574c20, 0x2e6fe: 0x6c574e20, 0x2e6ff: 0x6c575020, + // Block 0xb9c, offset 0x2e700 + 0x2e700: 0x6c575220, 0x2e701: 0x6c575420, 0x2e702: 0x6c575620, 0x2e703: 0x6c575820, + 0x2e704: 0x6c575a20, 0x2e705: 0x6c575c20, 0x2e706: 0x6c575e20, 0x2e707: 0x6c576020, + 0x2e708: 0x6c576220, 0x2e709: 0x6c576420, 0x2e70a: 0x6c576620, 0x2e70b: 0x6c576820, + 0x2e70c: 0x6c576a20, 0x2e70d: 0x6c576c20, 0x2e70e: 0x6c576e20, 0x2e70f: 0x6c577020, + 0x2e710: 0x6c577220, 0x2e711: 0x6c577420, 0x2e712: 0x6c79d620, 0x2e713: 0x6c79d820, + 0x2e714: 0x6c79da20, 0x2e715: 0x6c79dc20, 0x2e716: 0x6c79de20, 0x2e717: 0x6c79e020, + 0x2e718: 0x6c79e220, 0x2e719: 0x6c79e420, 0x2e71a: 0x6c79e620, 0x2e71b: 0x6c79e820, + 0x2e71c: 0x6c79ea20, 0x2e71d: 0x6c79ec20, 0x2e71e: 0x6c79ee20, 0x2e71f: 0x6c79f020, + 0x2e720: 0x6c79f220, 0x2e721: 0x6c79f420, 0x2e722: 0x6c79f620, 0x2e723: 0x6c79f820, + 0x2e724: 0x6c79fa20, 0x2e725: 0x6c79fc20, 0x2e726: 0x6c79fe20, 0x2e727: 0x6c7a0020, + 0x2e728: 0x6c7a0220, 0x2e729: 0x6c7a0420, 0x2e72a: 0x6c7a0620, 0x2e72b: 0x6c7a0820, + 0x2e72c: 0x6c7a0a20, 0x2e72d: 0x6c7a0c20, 0x2e72e: 0x6c7a0e20, 0x2e72f: 0x6c7a1020, + 0x2e730: 0x6c7a1220, 0x2e731: 0x6c7a1420, 0x2e732: 0x6c7a1620, 0x2e733: 0x6ca2ea20, + 0x2e734: 0x6ca2ec20, 0x2e735: 0x6ca2ee20, 0x2e736: 0x6ca2f020, 0x2e737: 0x6cd08c20, + 0x2e738: 0x6ca2f220, 0x2e739: 0x6c7a7220, 0x2e73a: 0x6ca2f420, 0x2e73b: 0x6ca2f620, + 0x2e73c: 0x6ca2f820, 0x2e73d: 0x6ca2fa20, 0x2e73e: 0x6ca2fc20, 0x2e73f: 0x6ca2fe20, + // Block 0xb9d, offset 0x2e740 + 0x2e740: 0x6ca30020, 0x2e741: 0x6ca30220, 0x2e742: 0x6ca30420, 0x2e743: 0x6ca30620, + 0x2e744: 0x6ca30820, 0x2e745: 0x6ca30a20, 0x2e746: 0x6ca30c20, 0x2e747: 0x6ca30e20, + 0x2e748: 0x6ca31020, 0x2e749: 0x6c7a1820, 0x2e74a: 0x6ca31220, 0x2e74b: 0x6ca31420, + 0x2e74c: 0x6ca31620, 0x2e74d: 0x6ca31820, 0x2e74e: 0x6ca31a20, 0x2e74f: 0x6ca31c20, + 0x2e750: 0x6ca31e20, 0x2e751: 0x6ca32020, 0x2e752: 0x6ca32220, 0x2e753: 0x6ca32420, + 0x2e754: 0x6cd08e20, 0x2e755: 0x6cd09020, 0x2e756: 0x6cd09220, 0x2e757: 0x6cd09420, + 0x2e758: 0x6cd09620, 0x2e759: 0x6cd09820, 0x2e75a: 0x6cd09a20, 0x2e75b: 0x6cd09c20, + 0x2e75c: 0x6cd09e20, 0x2e75d: 0x6cd0a020, 0x2e75e: 0x6cfe6220, 0x2e75f: 0x6cd0a220, + 0x2e760: 0x6cd0a420, 0x2e761: 0x6cd0a620, 0x2e762: 0x6cd0a820, 0x2e763: 0x6cd0aa20, + 0x2e764: 0x6cd0ac20, 0x2e765: 0x6cd0ae20, 0x2e766: 0x6cd0b020, 0x2e767: 0x6cfe4c20, + 0x2e768: 0x6cd0b220, 0x2e769: 0x6cd0b420, 0x2e76a: 0x6cd0b620, 0x2e76b: 0x6cd0b820, + 0x2e76c: 0x6cd0ba20, 0x2e76d: 0x6cd0bc20, 0x2e76e: 0x6cd0be20, 0x2e76f: 0x6cd0c020, + 0x2e770: 0x6cd0c220, 0x2e771: 0x6cd0c420, 0x2e772: 0x6cd0c620, 0x2e773: 0x6cd0c820, + 0x2e774: 0x6cd0ca20, 0x2e775: 0x6cd0cc20, 0x2e776: 0x6cd0ce20, 0x2e777: 0x6cd0d020, + 0x2e778: 0x6cd0d220, 0x2e779: 0x6cd0d420, 0x2e77a: 0x6cd0d620, 0x2e77b: 0x6cd0d820, + 0x2e77c: 0x6cd0da20, 0x2e77d: 0x6cfe6420, 0x2e77e: 0x6cfe6620, 0x2e77f: 0x6cfe6820, + // Block 0xb9e, offset 0x2e780 + 0x2e780: 0x6cfe6a20, 0x2e781: 0x6cfe6c20, 0x2e782: 0x6cfe6e20, 0x2e783: 0x6cfe7020, + 0x2e784: 0x6cfe7220, 0x2e785: 0x6cfe7420, 0x2e786: 0x6cfe7620, 0x2e787: 0x6cfe7820, + 0x2e788: 0x6cfe7a20, 0x2e789: 0x6cfe7c20, 0x2e78a: 0x6cfe7e20, 0x2e78b: 0x6cfe8020, + 0x2e78c: 0x6cfe8220, 0x2e78d: 0x6cfe8420, 0x2e78e: 0x6cfe8620, 0x2e78f: 0x6cfe8820, + 0x2e790: 0x6cfe8a20, 0x2e791: 0x6cfe8c20, 0x2e792: 0x6cfe8e20, 0x2e793: 0x6cfe9020, + 0x2e794: 0x6cfe9220, 0x2e795: 0x6cfe9420, 0x2e796: 0x6cfe9620, 0x2e797: 0x6cfe9820, + 0x2e798: 0x6cfe9a20, 0x2e799: 0x6cfe9c20, 0x2e79a: 0x6cfe9e20, 0x2e79b: 0x6cfea020, + 0x2e79c: 0x6cfea220, 0x2e79d: 0x6cfea420, 0x2e79e: 0x6cfea620, 0x2e79f: 0x6cfea820, + 0x2e7a0: 0x6d2cea20, 0x2e7a1: 0x6d2cec20, 0x2e7a2: 0x6d2cee20, 0x2e7a3: 0x6d2cf020, + 0x2e7a4: 0x6d2cf220, 0x2e7a5: 0x6d2cf420, 0x2e7a6: 0x6d2cf620, 0x2e7a7: 0x6d2cf820, + 0x2e7a8: 0x6d2cfa20, 0x2e7a9: 0x6d5a0620, 0x2e7aa: 0x6d2cfc20, 0x2e7ab: 0x6d2cfe20, + 0x2e7ac: 0x6d5a0820, 0x2e7ad: 0x6d2d0020, 0x2e7ae: 0x6d2d0220, 0x2e7af: 0x6cff4020, + 0x2e7b0: 0x6d2d0420, 0x2e7b1: 0x6d2d0620, 0x2e7b2: 0x6d2d0820, 0x2e7b3: 0x6d2d0a20, + 0x2e7b4: 0x6d2d0c20, 0x2e7b5: 0x6d2d0e20, 0x2e7b6: 0x6d2d1020, 0x2e7b7: 0x6d2d1220, + 0x2e7b8: 0x6d2d1420, 0x2e7b9: 0x6d5a1e20, 0x2e7ba: 0x6d5a2020, 0x2e7bb: 0x6d5a2220, + 0x2e7bc: 0x6d5a2420, 0x2e7bd: 0x6d5a2620, 0x2e7be: 0x6d5a2820, 0x2e7bf: 0x6d84cc20, + // Block 0xb9f, offset 0x2e7c0 + 0x2e7c0: 0x6d5a2a20, 0x2e7c1: 0x6d5a2c20, 0x2e7c2: 0x6d5a2e20, 0x2e7c3: 0x6d5a3020, + 0x2e7c4: 0x6d5a3220, 0x2e7c5: 0x6d5a3420, 0x2e7c6: 0x6d5a3620, 0x2e7c7: 0x6d5a3820, + 0x2e7c8: 0x6d5a3a20, 0x2e7c9: 0x6d5a3c20, 0x2e7ca: 0x6d5a3e20, 0x2e7cb: 0x6d5a4020, + 0x2e7cc: 0x6d5a4220, 0x2e7cd: 0x6d84da20, 0x2e7ce: 0x6d5a4420, 0x2e7cf: 0x6d84dc20, + 0x2e7d0: 0x6da99a20, 0x2e7d1: 0x6d84de20, 0x2e7d2: 0x6d84e020, 0x2e7d3: 0x6d5a4620, + 0x2e7d4: 0x6d84e220, 0x2e7d5: 0x6d84e420, 0x2e7d6: 0x6d84e620, 0x2e7d7: 0x6da99c20, + 0x2e7d8: 0x6d84e820, 0x2e7d9: 0x6d84ea20, 0x2e7da: 0x6d84ec20, 0x2e7db: 0x6d84ee20, + 0x2e7dc: 0x6d84f020, 0x2e7dd: 0x6d84f220, 0x2e7de: 0x6d84f420, 0x2e7df: 0x6d84f620, + 0x2e7e0: 0x6d84f820, 0x2e7e1: 0x6d84fa20, 0x2e7e2: 0x6d856820, 0x2e7e3: 0x6d84fc20, + 0x2e7e4: 0x6d84fe20, 0x2e7e5: 0x6da9a620, 0x2e7e6: 0x6da9a820, 0x2e7e7: 0x6dca8820, + 0x2e7e8: 0x6da9aa20, 0x2e7e9: 0x6da9ac20, 0x2e7ea: 0x6da9ae20, 0x2e7eb: 0x6da9b020, + 0x2e7ec: 0x6da9b220, 0x2e7ed: 0x6da9b420, 0x2e7ee: 0x6da9b620, 0x2e7ef: 0x6da9b820, + 0x2e7f0: 0x6da9ba20, 0x2e7f1: 0x6da9bc20, 0x2e7f2: 0x6da9be20, 0x2e7f3: 0x6da9c020, + 0x2e7f4: 0x6da9c220, 0x2e7f5: 0x6dca8a20, 0x2e7f6: 0x6dca8c20, 0x2e7f7: 0x6de61c20, + 0x2e7f8: 0x6dca8e20, 0x2e7f9: 0x6dca9020, 0x2e7fa: 0x6dfcfc20, 0x2e7fb: 0x6dca9220, + 0x2e7fc: 0x6dca9420, 0x2e7fd: 0x6de61e20, 0x2e7fe: 0x6dca9620, 0x2e7ff: 0x6dca9820, + // Block 0xba0, offset 0x2e800 + 0x2e800: 0x6dca9a20, 0x2e801: 0x6dca9c20, 0x2e802: 0x6dca9e20, 0x2e803: 0x6de62820, + 0x2e804: 0x6de62a20, 0x2e805: 0x6de62c20, 0x2e806: 0x6de62e20, 0x2e807: 0x6de63020, + 0x2e808: 0x6de63220, 0x2e809: 0x6de63420, 0x2e80a: 0x6de63620, 0x2e80b: 0x6de63820, + 0x2e80c: 0x6dfd0020, 0x2e80d: 0x6dfd0220, 0x2e80e: 0x6dfd0420, 0x2e80f: 0x6dfd0620, + 0x2e810: 0x6dfd0820, 0x2e811: 0x6dfd0a20, 0x2e812: 0x6dfd0c20, 0x2e813: 0x6e0fd620, + 0x2e814: 0x6e0fd820, 0x2e815: 0x6e1eb420, 0x2e816: 0x6e0fda20, 0x2e817: 0x6e1eb620, + 0x2e818: 0x6e1eb820, 0x2e819: 0x6e1eba20, 0x2e81a: 0x6e2a1c20, 0x2e81b: 0x6e32de20, + 0x2e81c: 0x6c09fa20, 0x2e81d: 0x6c3bac20, 0x2e81e: 0x6c7a7820, 0x2e81f: 0x6c7a7a20, + 0x2e820: 0x6ca38020, 0x2e821: 0x6cff4220, 0x2e822: 0x6d856a20, 0x2e823: 0x6de66820, + 0x2e824: 0x6e1ec620, 0x2e825: 0x6e32e420, 0x2e826: 0x6c09fc20, 0x2e827: 0x6c24a220, + 0x2e828: 0x6c3bb620, 0x2e829: 0x6c3bb820, 0x2e82a: 0x6c57da20, 0x2e82b: 0x6c57dc20, + 0x2e82c: 0x6c57de20, 0x2e82d: 0x6c57e020, 0x2e82e: 0x6c57e220, 0x2e82f: 0x6c57e420, + 0x2e830: 0x6c57e620, 0x2e831: 0x6c57e820, 0x2e832: 0x6c57ea20, 0x2e833: 0x6c7a9020, + 0x2e834: 0x6c7a9220, 0x2e835: 0x6c7a9420, 0x2e836: 0x6ca39820, 0x2e837: 0x6ca39a20, + 0x2e838: 0x6ca39c20, 0x2e839: 0x6cd17820, 0x2e83a: 0x6cd17a20, 0x2e83b: 0x6cd17c20, + 0x2e83c: 0x6cd17e20, 0x2e83d: 0x6cff6020, 0x2e83e: 0x6cff6220, 0x2e83f: 0x6cff6420, + // Block 0xba1, offset 0x2e840 + 0x2e840: 0x6d2d9620, 0x2e841: 0x6cff6620, 0x2e842: 0x6d2da420, 0x2e843: 0x6d2da620, + 0x2e844: 0x6d2da820, 0x2e845: 0x6d2daa20, 0x2e846: 0x6d2dac20, 0x2e847: 0x6d5acc20, + 0x2e848: 0x6d5ace20, 0x2e849: 0x6d5ad020, 0x2e84a: 0x6d857a20, 0x2e84b: 0x6d857c20, + 0x2e84c: 0x6d857e20, 0x2e84d: 0x6d858020, 0x2e84e: 0x6d858220, 0x2e84f: 0x6daa2020, + 0x2e850: 0x6daa2220, 0x2e851: 0x6daa2420, 0x2e852: 0x6daa2620, 0x2e853: 0x6dcaee20, + 0x2e854: 0x6dcaf020, 0x2e855: 0x6dcaf220, 0x2e856: 0x6de66e20, 0x2e857: 0x6e0ffa20, + 0x2e858: 0x6c09fe20, 0x2e859: 0x6c3bc420, 0x2e85a: 0x6c57fe20, 0x2e85b: 0x6ca3ba20, + 0x2e85c: 0x6ca3bc20, 0x2e85d: 0x6cff8a20, 0x2e85e: 0x6cff8c20, 0x2e85f: 0x6c0a0220, + 0x2e860: 0x6c580a20, 0x2e861: 0x6c7ab220, 0x2e862: 0x6ca3be20, 0x2e863: 0x6ca3c020, + 0x2e864: 0x6cd1a420, 0x2e865: 0x6cd1a620, 0x2e866: 0x6cd1a820, 0x2e867: 0x6d2dd620, + 0x2e868: 0x6c0a0620, 0x2e869: 0x6c0a0820, 0x2e86a: 0x6c13d020, 0x2e86b: 0x6c24aa20, + 0x2e86c: 0x6c24ac20, 0x2e86d: 0x6c581a20, 0x2e86e: 0x6c581c20, 0x2e86f: 0x6cd1b620, + 0x2e870: 0x6c0a0a20, 0x2e871: 0x6c0a0c20, 0x2e872: 0x6c0a0e20, 0x2e873: 0x6c0a1020, + 0x2e874: 0x6c0a1220, 0x2e875: 0x6c0a1420, 0x2e876: 0x6c13d620, 0x2e877: 0x6c24b620, + 0x2e878: 0x6c24b820, 0x2e879: 0x6c24ba20, 0x2e87a: 0x6c24bc20, 0x2e87b: 0x6c3be220, + 0x2e87c: 0x6c24be20, 0x2e87d: 0x6c3be420, 0x2e87e: 0x6c3be620, 0x2e87f: 0x6c3be820, + // Block 0xba2, offset 0x2e880 + 0x2e880: 0x6c3bea20, 0x2e881: 0x6c3bec20, 0x2e882: 0x6c3bee20, 0x2e883: 0x6c3bf020, + 0x2e884: 0x6c3bf220, 0x2e885: 0x6c3bf420, 0x2e886: 0x6c582420, 0x2e887: 0x6c582620, + 0x2e888: 0x6c582820, 0x2e889: 0x6c582a20, 0x2e88a: 0x6c582c20, 0x2e88b: 0x6c582e20, + 0x2e88c: 0x6c583020, 0x2e88d: 0x6c583220, 0x2e88e: 0x6c583420, 0x2e88f: 0x6c583620, + 0x2e890: 0x6c583820, 0x2e891: 0x6c583a20, 0x2e892: 0x6c583c20, 0x2e893: 0x6c583e20, + 0x2e894: 0x6c7abe20, 0x2e895: 0x6c7ac020, 0x2e896: 0x6c7ac220, 0x2e897: 0x6c7ac420, + 0x2e898: 0x6c7ac620, 0x2e899: 0x6c7ac820, 0x2e89a: 0x6c7aca20, 0x2e89b: 0x6c7acc20, + 0x2e89c: 0x6c7ace20, 0x2e89d: 0x6c7ad020, 0x2e89e: 0x6c7ad220, 0x2e89f: 0x6c7ad420, + 0x2e8a0: 0x6c7bac20, 0x2e8a1: 0x6ca3d620, 0x2e8a2: 0x6ca3d820, 0x2e8a3: 0x6ca3da20, + 0x2e8a4: 0x6ca3dc20, 0x2e8a5: 0x6ca3de20, 0x2e8a6: 0x6ca3e020, 0x2e8a7: 0x6ca3e220, + 0x2e8a8: 0x6ca89a20, 0x2e8a9: 0x6ca3e420, 0x2e8aa: 0x6cd1be20, 0x2e8ab: 0x6cd1c020, + 0x2e8ac: 0x6cd1c220, 0x2e8ad: 0x6cd1c420, 0x2e8ae: 0x6cd1c620, 0x2e8af: 0x6cd1c820, + 0x2e8b0: 0x6ca3e620, 0x2e8b1: 0x6cd20620, 0x2e8b2: 0x6cd1ca20, 0x2e8b3: 0x6cd1cc20, + 0x2e8b4: 0x6cd1ce20, 0x2e8b5: 0x6cffaa20, 0x2e8b6: 0x6cffac20, 0x2e8b7: 0x6cffae20, + 0x2e8b8: 0x6cffb020, 0x2e8b9: 0x6cffb220, 0x2e8ba: 0x6cffb420, 0x2e8bb: 0x6d2de220, + 0x2e8bc: 0x6d2de420, 0x2e8bd: 0x6d2de620, 0x2e8be: 0x6d5b0420, 0x2e8bf: 0x6d5b0620, + // Block 0xba3, offset 0x2e8c0 + 0x2e8c0: 0x6d85a020, 0x2e8c1: 0x6d85a220, 0x2e8c2: 0x6d85a420, 0x2e8c3: 0x6daa4620, + 0x2e8c4: 0x6daa4820, 0x2e8c5: 0x6dcb0e20, 0x2e8c6: 0x6de68020, 0x2e8c7: 0x6de68220, + 0x2e8c8: 0x6dfd3620, 0x2e8c9: 0x6dfd4820, 0x2e8ca: 0x6e1ede20, 0x2e8cb: 0x6c0a1a20, + 0x2e8cc: 0x6c3c1420, 0x2e8cd: 0x6c7b0e20, 0x2e8ce: 0x6cd20820, 0x2e8cf: 0x6cd20a20, + 0x2e8d0: 0x6d2e0420, 0x2e8d1: 0x6d2e0620, 0x2e8d2: 0x6c0a2020, 0x2e8d3: 0x6c24d820, + 0x2e8d4: 0x6c24da20, 0x2e8d5: 0x6c24dc20, 0x2e8d6: 0x6c24de20, 0x2e8d7: 0x6c24e020, + 0x2e8d8: 0x6c3c2020, 0x2e8d9: 0x6c3c2220, 0x2e8da: 0x6c3c2420, 0x2e8db: 0x6c3c2620, + 0x2e8dc: 0x6c3c2820, 0x2e8dd: 0x6c3c2a20, 0x2e8de: 0x6c3c2c20, 0x2e8df: 0x6c3c2e20, + 0x2e8e0: 0x6c3c3020, 0x2e8e1: 0x6c3c4220, 0x2e8e2: 0x6c589c20, 0x2e8e3: 0x6c589e20, + 0x2e8e4: 0x6c58a020, 0x2e8e5: 0x6c58a220, 0x2e8e6: 0x6c58a420, 0x2e8e7: 0x6c58a620, + 0x2e8e8: 0x6c58a820, 0x2e8e9: 0x6c58aa20, 0x2e8ea: 0x6c58ac20, 0x2e8eb: 0x6c58ae20, + 0x2e8ec: 0x6c58b020, 0x2e8ed: 0x6c58b220, 0x2e8ee: 0x6c58b420, 0x2e8ef: 0x6c58b620, + 0x2e8f0: 0x6c7b2c20, 0x2e8f1: 0x6c7b2e20, 0x2e8f2: 0x6c7b3020, 0x2e8f3: 0x6c7b3220, + 0x2e8f4: 0x6c7b3420, 0x2e8f5: 0x6ca41a20, 0x2e8f6: 0x6c7b3620, 0x2e8f7: 0x6c7b3820, + 0x2e8f8: 0x6c7b3a20, 0x2e8f9: 0x6c7b3c20, 0x2e8fa: 0x6c58b820, 0x2e8fb: 0x6c7b3e20, + 0x2e8fc: 0x6c7b4020, 0x2e8fd: 0x6c7b4220, 0x2e8fe: 0x6c7b4420, 0x2e8ff: 0x6c7b4620, + // Block 0xba4, offset 0x2e900 + 0x2e900: 0x6c7b4820, 0x2e901: 0x6c7b4a20, 0x2e902: 0x6c7b4c20, 0x2e903: 0x6c7b4e20, + 0x2e904: 0x6c7b5020, 0x2e905: 0x6c7b5220, 0x2e906: 0x6c7b5420, 0x2e907: 0x6c7b5620, + 0x2e908: 0x6c7b5820, 0x2e909: 0x6c7b5a20, 0x2e90a: 0x6ca42e20, 0x2e90b: 0x6ca43020, + 0x2e90c: 0x6ca43220, 0x2e90d: 0x6ca43420, 0x2e90e: 0x6ca43620, 0x2e90f: 0x6ca43820, + 0x2e910: 0x6ca43a20, 0x2e911: 0x6ca43c20, 0x2e912: 0x6ca43e20, 0x2e913: 0x6ca44020, + 0x2e914: 0x6ca44220, 0x2e915: 0x6ca44420, 0x2e916: 0x6ca44620, 0x2e917: 0x6cd23020, + 0x2e918: 0x6cd23220, 0x2e919: 0x6cd23420, 0x2e91a: 0x6cd23620, 0x2e91b: 0x6cd23820, + 0x2e91c: 0x6cd23a20, 0x2e91d: 0x6cd23c20, 0x2e91e: 0x6cd23e20, 0x2e91f: 0x6cd24020, + 0x2e920: 0x6cd24220, 0x2e921: 0x6cd24420, 0x2e922: 0x6cd24620, 0x2e923: 0x6cd24820, + 0x2e924: 0x6cd24a20, 0x2e925: 0x6cd24c20, 0x2e926: 0x6cd24e20, 0x2e927: 0x6cd25020, + 0x2e928: 0x6cd25220, 0x2e929: 0x6cd25420, 0x2e92a: 0x6cd25620, 0x2e92b: 0x6cd25820, + 0x2e92c: 0x6d000620, 0x2e92d: 0x6d000820, 0x2e92e: 0x6d000a20, 0x2e92f: 0x6d000c20, + 0x2e930: 0x6d000e20, 0x2e931: 0x6d001020, 0x2e932: 0x6d001220, 0x2e933: 0x6d001420, + 0x2e934: 0x6d001620, 0x2e935: 0x6d001820, 0x2e936: 0x6d001a20, 0x2e937: 0x6d001c20, + 0x2e938: 0x6d001e20, 0x2e939: 0x6d002020, 0x2e93a: 0x6d002220, 0x2e93b: 0x6d002420, + 0x2e93c: 0x6d002620, 0x2e93d: 0x6d002820, 0x2e93e: 0x6d002a20, 0x2e93f: 0x6d002c20, + // Block 0xba5, offset 0x2e940 + 0x2e940: 0x6d002e20, 0x2e941: 0x6d003020, 0x2e942: 0x6d003220, 0x2e943: 0x6d003420, + 0x2e944: 0x6d003620, 0x2e945: 0x6d003820, 0x2e946: 0x6d003a20, 0x2e947: 0x6d2e2020, + 0x2e948: 0x6d2e2220, 0x2e949: 0x6d2e2420, 0x2e94a: 0x6d2e2620, 0x2e94b: 0x6d2e2820, + 0x2e94c: 0x6d2e2a20, 0x2e94d: 0x6d2e2c20, 0x2e94e: 0x6d2e2e20, 0x2e94f: 0x6d00b020, + 0x2e950: 0x6d00b220, 0x2e951: 0x6d2e3020, 0x2e952: 0x6d2e3220, 0x2e953: 0x6d2e3420, + 0x2e954: 0x6d2e3620, 0x2e955: 0x6d2e3820, 0x2e956: 0x6d2e3a20, 0x2e957: 0x6d2e3c20, + 0x2e958: 0x6d2e3e20, 0x2e959: 0x6d5b4a20, 0x2e95a: 0x6d5b4c20, 0x2e95b: 0x6d5b4e20, + 0x2e95c: 0x6d5b5020, 0x2e95d: 0x6d5b5220, 0x2e95e: 0x6d5b5420, 0x2e95f: 0x6d5b3020, + 0x2e960: 0x6d5b5620, 0x2e961: 0x6d5b5820, 0x2e962: 0x6d5b5a20, 0x2e963: 0x6d5b5c20, + 0x2e964: 0x6d5b5e20, 0x2e965: 0x6d5b6020, 0x2e966: 0x6d5b6220, 0x2e967: 0x6d2e4020, + 0x2e968: 0x6d5b6420, 0x2e969: 0x6d5b6620, 0x2e96a: 0x6d5b6820, 0x2e96b: 0x6d5b6a20, + 0x2e96c: 0x6d85d420, 0x2e96d: 0x6d85d620, 0x2e96e: 0x6d85d820, 0x2e96f: 0x6d85da20, + 0x2e970: 0x6d85dc20, 0x2e971: 0x6d85de20, 0x2e972: 0x6d85e020, 0x2e973: 0x6d85e220, + 0x2e974: 0x6d85e420, 0x2e975: 0x6d85e620, 0x2e976: 0x6d85e820, 0x2e977: 0x6d85ea20, + 0x2e978: 0x6d85ec20, 0x2e979: 0x6d85ee20, 0x2e97a: 0x6d85f020, 0x2e97b: 0x6d85f220, + 0x2e97c: 0x6d85f420, 0x2e97d: 0x6d85f620, 0x2e97e: 0x6d85f820, 0x2e97f: 0x6d85fa20, + // Block 0xba6, offset 0x2e980 + 0x2e980: 0x6daa7420, 0x2e981: 0x6daa7620, 0x2e982: 0x6daa7820, 0x2e983: 0x6daa7a20, + 0x2e984: 0x6daa7c20, 0x2e985: 0x6daa7e20, 0x2e986: 0x6daa8020, 0x2e987: 0x6daa8220, + 0x2e988: 0x6daa8420, 0x2e989: 0x6daa8620, 0x2e98a: 0x6d85fc20, 0x2e98b: 0x6daa8820, + 0x2e98c: 0x6daa8a20, 0x2e98d: 0x6daa8c20, 0x2e98e: 0x6daa8e20, 0x2e98f: 0x6dcb2c20, + 0x2e990: 0x6dcb2e20, 0x2e991: 0x6dcb3020, 0x2e992: 0x6dcb3220, 0x2e993: 0x6dcb3420, + 0x2e994: 0x6dcb3620, 0x2e995: 0x6dcb3820, 0x2e996: 0x6dcb3a20, 0x2e997: 0x6dcb3c20, + 0x2e998: 0x6dcb3e20, 0x2e999: 0x6dcb4020, 0x2e99a: 0x6dcb4220, 0x2e99b: 0x6dcb4420, + 0x2e99c: 0x6dcb4620, 0x2e99d: 0x6dcb4820, 0x2e99e: 0x6dcb4a20, 0x2e99f: 0x6de69c20, + 0x2e9a0: 0x6de69e20, 0x2e9a1: 0x6de6a020, 0x2e9a2: 0x6dfd4c20, 0x2e9a3: 0x6de6a220, + 0x2e9a4: 0x6dcb8220, 0x2e9a5: 0x6dfd4e20, 0x2e9a6: 0x6dfd5020, 0x2e9a7: 0x6e102420, + 0x2e9a8: 0x6e102620, 0x2e9a9: 0x6e102820, 0x2e9aa: 0x6e102a20, 0x2e9ab: 0x6e102c20, + 0x2e9ac: 0x6e1eea20, 0x2e9ad: 0x6e1eec20, 0x2e9ae: 0x6e1eee20, 0x2e9af: 0x6e2a4a20, + 0x2e9b0: 0x6e2a4c20, 0x2e9b1: 0x6e32f220, 0x2e9b2: 0x6e32f420, 0x2e9b3: 0x6e3d8020, + 0x2e9b4: 0x6e42ca20, 0x2e9b5: 0x6e452a20, 0x2e9b6: 0x6c0a2220, 0x2e9b7: 0x6c3c4420, + 0x2e9b8: 0x6c590220, 0x2e9b9: 0x6c590420, 0x2e9ba: 0x6c590620, 0x2e9bb: 0x6cd2b820, + 0x2e9bc: 0x6cd2ba20, 0x2e9bd: 0x6c0a2420, 0x2e9be: 0x6c13e020, 0x2e9bf: 0x6c13e220, + // Block 0xba7, offset 0x2e9c0 + 0x2e9c0: 0x6c24fa20, 0x2e9c1: 0x6c24fc20, 0x2e9c2: 0x6c24fe20, 0x2e9c3: 0x6c250020, + 0x2e9c4: 0x6c3c4620, 0x2e9c5: 0x6c590e20, 0x2e9c6: 0x6c591020, 0x2e9c7: 0x6c591220, + 0x2e9c8: 0x6c591420, 0x2e9c9: 0x6ca48c20, 0x2e9ca: 0x6c7bae20, 0x2e9cb: 0x6c7bb020, + 0x2e9cc: 0x6c7bb220, 0x2e9cd: 0x6c7bb420, 0x2e9ce: 0x6ca49220, 0x2e9cf: 0x6ca49420, + 0x2e9d0: 0x6ca49620, 0x2e9d1: 0x6ca49820, 0x2e9d2: 0x6cd2c420, 0x2e9d3: 0x6cd2c620, + 0x2e9d4: 0x6cd2c820, 0x2e9d5: 0x6cd2ca20, 0x2e9d6: 0x6cd2cc20, 0x2e9d7: 0x6d00bc20, + 0x2e9d8: 0x6d00be20, 0x2e9d9: 0x6d00c020, 0x2e9da: 0x6d5bde20, 0x2e9db: 0x6d5be020, + 0x2e9dc: 0x6d5be220, 0x2e9dd: 0x6d5be420, 0x2e9de: 0x6d5be620, 0x2e9df: 0x6d865420, + 0x2e9e0: 0x6d865620, 0x2e9e1: 0x6d865820, 0x2e9e2: 0x6dab0020, 0x2e9e3: 0x6dab0220, + 0x2e9e4: 0x6dab0420, 0x2e9e5: 0x6dab0620, 0x2e9e6: 0x6dcb8420, 0x2e9e7: 0x6dcb8620, + 0x2e9e8: 0x6dcb8820, 0x2e9e9: 0x6de6de20, 0x2e9ea: 0x6dfd7420, 0x2e9eb: 0x6dfd7620, + 0x2e9ec: 0x6e104620, 0x2e9ed: 0x6e1f0020, 0x2e9ee: 0x6c0a2620, 0x2e9ef: 0x6c3c5620, + 0x2e9f0: 0x6c7bd820, 0x2e9f1: 0x6c7bda20, 0x2e9f2: 0x6ca4ac20, 0x2e9f3: 0x6cd2f020, + 0x2e9f4: 0x6cd2f220, 0x2e9f5: 0x6d00e820, 0x2e9f6: 0x6d2ecc20, 0x2e9f7: 0x6d2ece20, + 0x2e9f8: 0x6d2ed020, 0x2e9f9: 0x6d2ed220, 0x2e9fa: 0x6d5bfc20, 0x2e9fb: 0x6d866620, + 0x2e9fc: 0x6dab1620, 0x2e9fd: 0x6dcb9420, 0x2e9fe: 0x6dfd8220, 0x2e9ff: 0x6c0a2820, + // Block 0xba8, offset 0x2ea00 + 0x2ea00: 0x6c250c20, 0x2ea01: 0x6c250e20, 0x2ea02: 0x6c3c6820, 0x2ea03: 0x6c595220, + 0x2ea04: 0x6c595420, 0x2ea05: 0x6c595620, 0x2ea06: 0x6c595820, 0x2ea07: 0x6c595a20, + 0x2ea08: 0x6c595c20, 0x2ea09: 0x6c7bf620, 0x2ea0a: 0x6c7bf820, 0x2ea0b: 0x6c7bfa20, + 0x2ea0c: 0x6c7bfc20, 0x2ea0d: 0x6c7bfe20, 0x2ea0e: 0x6c7c0020, 0x2ea0f: 0x6c7c0220, + 0x2ea10: 0x6c7c0420, 0x2ea11: 0x6c7c0620, 0x2ea12: 0x6ca4c220, 0x2ea13: 0x6ca4c420, + 0x2ea14: 0x6ca4c620, 0x2ea15: 0x6ca4c820, 0x2ea16: 0x6ca4ca20, 0x2ea17: 0x6ca4cc20, + 0x2ea18: 0x6ca4ce20, 0x2ea19: 0x6cd30c20, 0x2ea1a: 0x6cd30e20, 0x2ea1b: 0x6ca4d020, + 0x2ea1c: 0x6cd31020, 0x2ea1d: 0x6d010c20, 0x2ea1e: 0x6d010e20, 0x2ea1f: 0x6d011020, + 0x2ea20: 0x6d2ef420, 0x2ea21: 0x6d2ef620, 0x2ea22: 0x6d2ef820, 0x2ea23: 0x6d2efa20, + 0x2ea24: 0x6d5c0c20, 0x2ea25: 0x6d868220, 0x2ea26: 0x6d868420, 0x2ea27: 0x6d868620, + 0x2ea28: 0x6dab2020, 0x2ea29: 0x6dab2220, 0x2ea2a: 0x6dab2420, 0x2ea2b: 0x6dcba820, + 0x2ea2c: 0x6dcbaa20, 0x2ea2d: 0x6dfd8e20, 0x2ea2e: 0x6c0a2a20, 0x2ea2f: 0x6c251820, + 0x2ea30: 0x6c3c8020, 0x2ea31: 0x6c3c8220, 0x2ea32: 0x6c3c8420, 0x2ea33: 0x6c3c8620, + 0x2ea34: 0x6c3c8820, 0x2ea35: 0x6c3c8a20, 0x2ea36: 0x6c598820, 0x2ea37: 0x6c598a20, + 0x2ea38: 0x6c598c20, 0x2ea39: 0x6c598e20, 0x2ea3a: 0x6c599020, 0x2ea3b: 0x6c599220, + 0x2ea3c: 0x6c599420, 0x2ea3d: 0x6c599620, 0x2ea3e: 0x6c599820, 0x2ea3f: 0x6c599a20, + // Block 0xba9, offset 0x2ea40 + 0x2ea40: 0x6c599c20, 0x2ea41: 0x6c599e20, 0x2ea42: 0x6c59a020, 0x2ea43: 0x6c59a220, + 0x2ea44: 0x6c59a420, 0x2ea45: 0x6c59a620, 0x2ea46: 0x6c59a820, 0x2ea47: 0x6c59aa20, + 0x2ea48: 0x6c59ac20, 0x2ea49: 0x6c59ae20, 0x2ea4a: 0x6c59b020, 0x2ea4b: 0x6c59b220, + 0x2ea4c: 0x6c59b420, 0x2ea4d: 0x6c59b620, 0x2ea4e: 0x6c7c3e20, 0x2ea4f: 0x6c7c4020, + 0x2ea50: 0x6c7c4220, 0x2ea51: 0x6c7c4420, 0x2ea52: 0x6c7c4620, 0x2ea53: 0x6c7c4820, + 0x2ea54: 0x6c7c4a20, 0x2ea55: 0x6c7c4c20, 0x2ea56: 0x6c7c4e20, 0x2ea57: 0x6c7c5020, + 0x2ea58: 0x6c7c5220, 0x2ea59: 0x6c7c5420, 0x2ea5a: 0x6c7c5620, 0x2ea5b: 0x6c7c5820, + 0x2ea5c: 0x6c7c5a20, 0x2ea5d: 0x6c7c5c20, 0x2ea5e: 0x6c7c5e20, 0x2ea5f: 0x6c7c6020, + 0x2ea60: 0x6c7c6220, 0x2ea61: 0x6c7c6420, 0x2ea62: 0x6c7c6620, 0x2ea63: 0x6c7c6820, + 0x2ea64: 0x6c7c6a20, 0x2ea65: 0x6ca4ee20, 0x2ea66: 0x6ca4f020, 0x2ea67: 0x6c7c6c20, + 0x2ea68: 0x6c7c6e20, 0x2ea69: 0x6c7c7020, 0x2ea6a: 0x6c7c7220, 0x2ea6b: 0x6c7c7420, + 0x2ea6c: 0x6c7c7620, 0x2ea6d: 0x6ca50220, 0x2ea6e: 0x6ca50420, 0x2ea6f: 0x6ca50620, + 0x2ea70: 0x6ca50820, 0x2ea71: 0x6ca50a20, 0x2ea72: 0x6ca50c20, 0x2ea73: 0x6ca50e20, + 0x2ea74: 0x6ca51020, 0x2ea75: 0x6ca51220, 0x2ea76: 0x6ca51420, 0x2ea77: 0x6ca51620, + 0x2ea78: 0x6ca51820, 0x2ea79: 0x6ca51a20, 0x2ea7a: 0x6ca51c20, 0x2ea7b: 0x6ca51e20, + 0x2ea7c: 0x6ca52020, 0x2ea7d: 0x6ca52220, 0x2ea7e: 0x6ca52420, 0x2ea7f: 0x6c7c7820, + // Block 0xbaa, offset 0x2ea80 + 0x2ea80: 0x6ca59220, 0x2ea81: 0x6ca52620, 0x2ea82: 0x6cd35020, 0x2ea83: 0x6cd35220, + 0x2ea84: 0x6cd35420, 0x2ea85: 0x6cd35620, 0x2ea86: 0x6cd35820, 0x2ea87: 0x6cd35a20, + 0x2ea88: 0x6cd35c20, 0x2ea89: 0x6cd35e20, 0x2ea8a: 0x6cd36020, 0x2ea8b: 0x6cd36220, + 0x2ea8c: 0x6cd36420, 0x2ea8d: 0x6cd36620, 0x2ea8e: 0x6cd36820, 0x2ea8f: 0x6cd36a20, + 0x2ea90: 0x6cd36c20, 0x2ea91: 0x6cd36e20, 0x2ea92: 0x6d014220, 0x2ea93: 0x6d014420, + 0x2ea94: 0x6d014620, 0x2ea95: 0x6d014820, 0x2ea96: 0x6d014a20, 0x2ea97: 0x6d014c20, + 0x2ea98: 0x6d014e20, 0x2ea99: 0x6d015020, 0x2ea9a: 0x6d015220, 0x2ea9b: 0x6d015420, + 0x2ea9c: 0x6d015620, 0x2ea9d: 0x6d015820, 0x2ea9e: 0x6d015a20, 0x2ea9f: 0x6d015c20, + 0x2eaa0: 0x6d015e20, 0x2eaa1: 0x6d01f620, 0x2eaa2: 0x6d016020, 0x2eaa3: 0x6d016220, + 0x2eaa4: 0x6d016420, 0x2eaa5: 0x6d016620, 0x2eaa6: 0x6d016820, 0x2eaa7: 0x6d016a20, + 0x2eaa8: 0x6d016c20, 0x2eaa9: 0x6d016e20, 0x2eaaa: 0x6d017020, 0x2eaab: 0x6d017220, + 0x2eaac: 0x6d017420, 0x2eaad: 0x6d017620, 0x2eaae: 0x6d2f2220, 0x2eaaf: 0x6d2f2420, + 0x2eab0: 0x6d2f2620, 0x2eab1: 0x6d2f2820, 0x2eab2: 0x6d2f2a20, 0x2eab3: 0x6d2f2c20, + 0x2eab4: 0x6d2f2e20, 0x2eab5: 0x6d2f3020, 0x2eab6: 0x6d2f3220, 0x2eab7: 0x6d2f3420, + 0x2eab8: 0x6d2f3620, 0x2eab9: 0x6d01f820, 0x2eaba: 0x6d2f3820, 0x2eabb: 0x6d2f3a20, + 0x2eabc: 0x6d2f3c20, 0x2eabd: 0x6d2f3e20, 0x2eabe: 0x6d2f4020, 0x2eabf: 0x6d2f4220, + // Block 0xbab, offset 0x2eac0 + 0x2eac0: 0x6d2f4420, 0x2eac1: 0x6d2f4620, 0x2eac2: 0x6d2f4820, 0x2eac3: 0x6d2f4a20, + 0x2eac4: 0x6d2f4c20, 0x2eac5: 0x6d2f4e20, 0x2eac6: 0x6d2f5020, 0x2eac7: 0x6d5c3e20, + 0x2eac8: 0x6d5c4020, 0x2eac9: 0x6d5c4220, 0x2eaca: 0x6d5c4420, 0x2eacb: 0x6d5c4620, + 0x2eacc: 0x6d5c4820, 0x2eacd: 0x6d5c4a20, 0x2eace: 0x6d5c4c20, 0x2eacf: 0x6d5c4e20, + 0x2ead0: 0x6d5c5020, 0x2ead1: 0x6d5c5220, 0x2ead2: 0x6d5c5420, 0x2ead3: 0x6d5c5620, + 0x2ead4: 0x6d86c020, 0x2ead5: 0x6d86c220, 0x2ead6: 0x6d86c420, 0x2ead7: 0x6d86c620, + 0x2ead8: 0x6d86c820, 0x2ead9: 0x6d86ca20, 0x2eada: 0x6d86cc20, 0x2eadb: 0x6d86ce20, + 0x2eadc: 0x6d86d020, 0x2eadd: 0x6d86d220, 0x2eade: 0x6d86d420, 0x2eadf: 0x6d86d620, + 0x2eae0: 0x6d86d820, 0x2eae1: 0x6d86da20, 0x2eae2: 0x6d86dc20, 0x2eae3: 0x6d86de20, + 0x2eae4: 0x6dab6020, 0x2eae5: 0x6d875220, 0x2eae6: 0x6dab6220, 0x2eae7: 0x6dab6420, + 0x2eae8: 0x6dab6620, 0x2eae9: 0x6dab6820, 0x2eaea: 0x6dab6a20, 0x2eaeb: 0x6dab6c20, + 0x2eaec: 0x6dab6e20, 0x2eaed: 0x6dab7020, 0x2eaee: 0x6dab7220, 0x2eaef: 0x6dab7420, + 0x2eaf0: 0x6dab7620, 0x2eaf1: 0x6dab7820, 0x2eaf2: 0x6dab7a20, 0x2eaf3: 0x6dab7c20, + 0x2eaf4: 0x6dab7e20, 0x2eaf5: 0x6dab8020, 0x2eaf6: 0x6dab8220, 0x2eaf7: 0x6dab8420, + 0x2eaf8: 0x6dcbcc20, 0x2eaf9: 0x6dcbce20, 0x2eafa: 0x6dcbd020, 0x2eafb: 0x6dcbd220, + 0x2eafc: 0x6dcbd420, 0x2eafd: 0x6dcbd620, 0x2eafe: 0x6dcbd820, 0x2eaff: 0x6dcbda20, + // Block 0xbac, offset 0x2eb00 + 0x2eb00: 0x6dcbdc20, 0x2eb01: 0x6dcbde20, 0x2eb02: 0x6dcbe020, 0x2eb03: 0x6de70c20, + 0x2eb04: 0x6de70e20, 0x2eb05: 0x6de71020, 0x2eb06: 0x6de71220, 0x2eb07: 0x6de71420, + 0x2eb08: 0x6de71620, 0x2eb09: 0x6de71820, 0x2eb0a: 0x6de71a20, 0x2eb0b: 0x6dfdae20, + 0x2eb0c: 0x6dfdb020, 0x2eb0d: 0x6dfdb220, 0x2eb0e: 0x6dfdb420, 0x2eb0f: 0x6dfdb620, + 0x2eb10: 0x6e106020, 0x2eb11: 0x6e106220, 0x2eb12: 0x6e106420, 0x2eb13: 0x6e106620, + 0x2eb14: 0x6e2a6c20, 0x2eb15: 0x6e331420, 0x2eb16: 0x6e332020, 0x2eb17: 0x6e331620, + 0x2eb18: 0x6e393a20, 0x2eb19: 0x6e393c20, 0x2eb1a: 0x6e3d8a20, 0x2eb1b: 0x6c0a2c20, + 0x2eb1c: 0x6c5a1c20, 0x2eb1d: 0x6c7cd620, 0x2eb1e: 0x6cd3f420, 0x2eb1f: 0x6cd3f620, + 0x2eb20: 0x6d01fa20, 0x2eb21: 0x6e394020, 0x2eb22: 0x6c0a2e20, 0x2eb23: 0x6c253220, + 0x2eb24: 0x6c3cb620, 0x2eb25: 0x6c3cb820, 0x2eb26: 0x6c5a2420, 0x2eb27: 0x6c5a2620, + 0x2eb28: 0x6c5a2820, 0x2eb29: 0x6c7ce820, 0x2eb2a: 0x6ca59e20, 0x2eb2b: 0x6ca5a020, + 0x2eb2c: 0x6cd40c20, 0x2eb2d: 0x6cd40e20, 0x2eb2e: 0x6d020820, 0x2eb2f: 0x6dabf820, + 0x2eb30: 0x6dabfa20, 0x2eb31: 0x6de76020, 0x2eb32: 0x6dfde820, 0x2eb33: 0x6c0a3020, + 0x2eb34: 0x6c253a20, 0x2eb35: 0x6c253c20, 0x2eb36: 0x6c253e20, 0x2eb37: 0x6c3cc020, + 0x2eb38: 0x6c3cc220, 0x2eb39: 0x6c3cc420, 0x2eb3a: 0x6c3cc620, 0x2eb3b: 0x6c3cc820, + 0x2eb3c: 0x6c3cca20, 0x2eb3d: 0x6c3ccc20, 0x2eb3e: 0x6c3cce20, 0x2eb3f: 0x6c3cd020, + // Block 0xbad, offset 0x2eb40 + 0x2eb40: 0x6c3cd220, 0x2eb41: 0x6c3cd420, 0x2eb42: 0x6c5a4820, 0x2eb43: 0x6c5a4a20, + 0x2eb44: 0x6c5a4c20, 0x2eb45: 0x6c5a4e20, 0x2eb46: 0x6c5a5020, 0x2eb47: 0x6c5a5220, + 0x2eb48: 0x6c5a5420, 0x2eb49: 0x6c5a5620, 0x2eb4a: 0x6c5a5820, 0x2eb4b: 0x6c5a5a20, + 0x2eb4c: 0x6c5a5c20, 0x2eb4d: 0x6c5a5e20, 0x2eb4e: 0x6c5a6020, 0x2eb4f: 0x6c5a6220, + 0x2eb50: 0x6c5a6420, 0x2eb51: 0x6c5a6620, 0x2eb52: 0x6c5a6820, 0x2eb53: 0x6c5a6a20, + 0x2eb54: 0x6c5a6c20, 0x2eb55: 0x6c5a6e20, 0x2eb56: 0x6c5a7020, 0x2eb57: 0x6c5a7220, + 0x2eb58: 0x6c5a7420, 0x2eb59: 0x6c5a7620, 0x2eb5a: 0x6c5a7820, 0x2eb5b: 0x6c5a7a20, + 0x2eb5c: 0x6c5a7c20, 0x2eb5d: 0x6c7d1220, 0x2eb5e: 0x6c7d1420, 0x2eb5f: 0x6c7d1620, + 0x2eb60: 0x6c7d1820, 0x2eb61: 0x6c7d1a20, 0x2eb62: 0x6c7d1c20, 0x2eb63: 0x6c7d1e20, + 0x2eb64: 0x6c7d2020, 0x2eb65: 0x6c7d2220, 0x2eb66: 0x6ca5ce20, 0x2eb67: 0x6c7d2420, + 0x2eb68: 0x6c7d2620, 0x2eb69: 0x6c7d2820, 0x2eb6a: 0x6c7d2a20, 0x2eb6b: 0x6c7d2c20, + 0x2eb6c: 0x6c7d2e20, 0x2eb6d: 0x6c7d3020, 0x2eb6e: 0x6c7d3220, 0x2eb6f: 0x6c7d3420, + 0x2eb70: 0x6c7d3620, 0x2eb71: 0x6c7d3820, 0x2eb72: 0x6c7d3a20, 0x2eb73: 0x6c7d3c20, + 0x2eb74: 0x6c7d3e20, 0x2eb75: 0x6c7d4020, 0x2eb76: 0x6c7d4220, 0x2eb77: 0x6c7d4420, + 0x2eb78: 0x6c7d4620, 0x2eb79: 0x6c7d4820, 0x2eb7a: 0x6c7d4a20, 0x2eb7b: 0x6c7d4c20, + 0x2eb7c: 0x6c7d4e20, 0x2eb7d: 0x6c7d5020, 0x2eb7e: 0x6c7d5220, 0x2eb7f: 0x6c7d5420, + // Block 0xbae, offset 0x2eb80 + 0x2eb80: 0x6c7d5620, 0x2eb81: 0x6c7d5820, 0x2eb82: 0x6ca5de20, 0x2eb83: 0x6ca5e020, + 0x2eb84: 0x6ca5e220, 0x2eb85: 0x6ca5e420, 0x2eb86: 0x6ca5e620, 0x2eb87: 0x6ca5e820, + 0x2eb88: 0x6ca5ea20, 0x2eb89: 0x6ca5ec20, 0x2eb8a: 0x6ca5ee20, 0x2eb8b: 0x6ca5f020, + 0x2eb8c: 0x6ca5f220, 0x2eb8d: 0x6ca5f420, 0x2eb8e: 0x6ca5f620, 0x2eb8f: 0x6ca5f820, + 0x2eb90: 0x6ca5fa20, 0x2eb91: 0x6ca5fc20, 0x2eb92: 0x6ca5fe20, 0x2eb93: 0x6ca60020, + 0x2eb94: 0x6ca60220, 0x2eb95: 0x6ca60420, 0x2eb96: 0x6ca60620, 0x2eb97: 0x6ca60820, + 0x2eb98: 0x6ca60a20, 0x2eb99: 0x6ca60c20, 0x2eb9a: 0x6ca60e20, 0x2eb9b: 0x6ca61020, + 0x2eb9c: 0x6cd43420, 0x2eb9d: 0x6cd43620, 0x2eb9e: 0x6cd43820, 0x2eb9f: 0x6cd43a20, + 0x2eba0: 0x6cd43c20, 0x2eba1: 0x6cd43e20, 0x2eba2: 0x6cd44020, 0x2eba3: 0x6cd44220, + 0x2eba4: 0x6cd44420, 0x2eba5: 0x6cd44620, 0x2eba6: 0x6cd44820, 0x2eba7: 0x6cd44a20, + 0x2eba8: 0x6cd44c20, 0x2eba9: 0x6cd44e20, 0x2ebaa: 0x6cd45020, 0x2ebab: 0x6cd45220, + 0x2ebac: 0x6cd45420, 0x2ebad: 0x6cd45620, 0x2ebae: 0x6cd45820, 0x2ebaf: 0x6cd45a20, + 0x2ebb0: 0x6cd45c20, 0x2ebb1: 0x6cd45e20, 0x2ebb2: 0x6cd46020, 0x2ebb3: 0x6cd46220, + 0x2ebb4: 0x6cd46420, 0x2ebb5: 0x6cd46620, 0x2ebb6: 0x6cd46820, 0x2ebb7: 0x6cd46a20, + 0x2ebb8: 0x6d025220, 0x2ebb9: 0x6d025420, 0x2ebba: 0x6d025620, 0x2ebbb: 0x6d025820, + 0x2ebbc: 0x6d025a20, 0x2ebbd: 0x6d025c20, 0x2ebbe: 0x6d300e20, 0x2ebbf: 0x6d025e20, + // Block 0xbaf, offset 0x2ebc0 + 0x2ebc0: 0x6d026020, 0x2ebc1: 0x6d026220, 0x2ebc2: 0x6d026420, 0x2ebc3: 0x6d026620, + 0x2ebc4: 0x6d026820, 0x2ebc5: 0x6d026a20, 0x2ebc6: 0x6d026c20, 0x2ebc7: 0x6d026e20, + 0x2ebc8: 0x6d027020, 0x2ebc9: 0x6d027220, 0x2ebca: 0x6d027420, 0x2ebcb: 0x6d027620, + 0x2ebcc: 0x6d027820, 0x2ebcd: 0x6d027a20, 0x2ebce: 0x6d027c20, 0x2ebcf: 0x6d027e20, + 0x2ebd0: 0x6d028020, 0x2ebd1: 0x6d028220, 0x2ebd2: 0x6d028420, 0x2ebd3: 0x6d028620, + 0x2ebd4: 0x6d028820, 0x2ebd5: 0x6d028a20, 0x2ebd6: 0x6d028c20, 0x2ebd7: 0x6d028e20, + 0x2ebd8: 0x6d029020, 0x2ebd9: 0x6d029220, 0x2ebda: 0x6d029420, 0x2ebdb: 0x6d029620, + 0x2ebdc: 0x6d029820, 0x2ebdd: 0x6d301020, 0x2ebde: 0x6d301220, 0x2ebdf: 0x6d301420, + 0x2ebe0: 0x6d301620, 0x2ebe1: 0x6d301820, 0x2ebe2: 0x6d301a20, 0x2ebe3: 0x6d301c20, + 0x2ebe4: 0x6d301e20, 0x2ebe5: 0x6d302020, 0x2ebe6: 0x6d302220, 0x2ebe7: 0x6d302420, + 0x2ebe8: 0x6d302620, 0x2ebe9: 0x6d302820, 0x2ebea: 0x6d302a20, 0x2ebeb: 0x6d302c20, + 0x2ebec: 0x6d302e20, 0x2ebed: 0x6d303020, 0x2ebee: 0x6d303220, 0x2ebef: 0x6d303420, + 0x2ebf0: 0x6d029a20, 0x2ebf1: 0x6d303620, 0x2ebf2: 0x6d303820, 0x2ebf3: 0x6d303a20, + 0x2ebf4: 0x6d303c20, 0x2ebf5: 0x6d303e20, 0x2ebf6: 0x6d304020, 0x2ebf7: 0x6d304220, + 0x2ebf8: 0x6d304420, 0x2ebf9: 0x6d304620, 0x2ebfa: 0x6d5d0620, 0x2ebfb: 0x6d5d0820, + 0x2ebfc: 0x6d5d0a20, 0x2ebfd: 0x6d5d0c20, 0x2ebfe: 0x6d5d0e20, 0x2ebff: 0x6d5d1020, + // Block 0xbb0, offset 0x2ec00 + 0x2ec00: 0x6d5d1220, 0x2ec01: 0x6d304820, 0x2ec02: 0x6d5d1420, 0x2ec03: 0x6d5d1620, + 0x2ec04: 0x6d5d1820, 0x2ec05: 0x6d5d1a20, 0x2ec06: 0x6d5d1c20, 0x2ec07: 0x6d5d1e20, + 0x2ec08: 0x6d5d2020, 0x2ec09: 0x6d5d2220, 0x2ec0a: 0x6d5d2420, 0x2ec0b: 0x6d5d2620, + 0x2ec0c: 0x6d5d2820, 0x2ec0d: 0x6d5d2a20, 0x2ec0e: 0x6d5d2c20, 0x2ec0f: 0x6d5d2e20, + 0x2ec10: 0x6d5d3020, 0x2ec11: 0x6d5d3220, 0x2ec12: 0x6d5d3420, 0x2ec13: 0x6d5d3620, + 0x2ec14: 0x6d5d3820, 0x2ec15: 0x6d5d3a20, 0x2ec16: 0x6d876620, 0x2ec17: 0x6d5d3c20, + 0x2ec18: 0x6d5d3e20, 0x2ec19: 0x6d5d4020, 0x2ec1a: 0x6d877a20, 0x2ec1b: 0x6d877c20, + 0x2ec1c: 0x6d876820, 0x2ec1d: 0x6d877e20, 0x2ec1e: 0x6d878020, 0x2ec1f: 0x6d878220, + 0x2ec20: 0x6d878420, 0x2ec21: 0x6d878620, 0x2ec22: 0x6d878820, 0x2ec23: 0x6d878a20, + 0x2ec24: 0x6d5d4220, 0x2ec25: 0x6d878c20, 0x2ec26: 0x6d878e20, 0x2ec27: 0x6d879020, + 0x2ec28: 0x6d879220, 0x2ec29: 0x6d879420, 0x2ec2a: 0x6d879620, 0x2ec2b: 0x6d879820, + 0x2ec2c: 0x6d879a20, 0x2ec2d: 0x6d879c20, 0x2ec2e: 0x6d879e20, 0x2ec2f: 0x6dac1c20, + 0x2ec30: 0x6dac1e20, 0x2ec31: 0x6dac2020, 0x2ec32: 0x6dac2220, 0x2ec33: 0x6dac2420, + 0x2ec34: 0x6dac2620, 0x2ec35: 0x6dac2820, 0x2ec36: 0x6dac2a20, 0x2ec37: 0x6dac2c20, + 0x2ec38: 0x6dac2e20, 0x2ec39: 0x6dac3020, 0x2ec3a: 0x6dac3220, 0x2ec3b: 0x6dac3420, + 0x2ec3c: 0x6dac3620, 0x2ec3d: 0x6dac3820, 0x2ec3e: 0x6dac3a20, 0x2ec3f: 0x6dac3c20, + // Block 0xbb1, offset 0x2ec40 + 0x2ec40: 0x6dac3e20, 0x2ec41: 0x6dac4020, 0x2ec42: 0x6dac4220, 0x2ec43: 0x6dac4420, + 0x2ec44: 0x6dac4620, 0x2ec45: 0x6dac4820, 0x2ec46: 0x6dcc5020, 0x2ec47: 0x6dcc5220, + 0x2ec48: 0x6dcc5420, 0x2ec49: 0x6dcc5620, 0x2ec4a: 0x6dcc5820, 0x2ec4b: 0x6dcc5a20, + 0x2ec4c: 0x6dcc5c20, 0x2ec4d: 0x6dcc5e20, 0x2ec4e: 0x6dcc6020, 0x2ec4f: 0x6dcc6220, + 0x2ec50: 0x6dcc6420, 0x2ec51: 0x6dcc6620, 0x2ec52: 0x6dcc6820, 0x2ec53: 0x6dcc6a20, + 0x2ec54: 0x6dcc6c20, 0x2ec55: 0x6dcc6e20, 0x2ec56: 0x6dcc7020, 0x2ec57: 0x6de76c20, + 0x2ec58: 0x6de76e20, 0x2ec59: 0x6de77020, 0x2ec5a: 0x6de77220, 0x2ec5b: 0x6de77420, + 0x2ec5c: 0x6de77620, 0x2ec5d: 0x6de77820, 0x2ec5e: 0x6de77a20, 0x2ec5f: 0x6de77c20, + 0x2ec60: 0x6de77e20, 0x2ec61: 0x6de78020, 0x2ec62: 0x6dfdf220, 0x2ec63: 0x6dfdf420, + 0x2ec64: 0x6dfdf620, 0x2ec65: 0x6dfdf820, 0x2ec66: 0x6dfdfa20, 0x2ec67: 0x6dfdfc20, + 0x2ec68: 0x6dfdfe20, 0x2ec69: 0x6dfe0020, 0x2ec6a: 0x6dfe0220, 0x2ec6b: 0x6dfe0420, + 0x2ec6c: 0x6dfe0620, 0x2ec6d: 0x6e109420, 0x2ec6e: 0x6e109620, 0x2ec6f: 0x6e109820, + 0x2ec70: 0x6e109a20, 0x2ec71: 0x6e109c20, 0x2ec72: 0x6e109e20, 0x2ec73: 0x6e10a020, + 0x2ec74: 0x6e10a220, 0x2ec75: 0x6e1f3820, 0x2ec76: 0x6e2a8820, 0x2ec77: 0x6e2a8a20, + 0x2ec78: 0x6e332620, 0x2ec79: 0x6e394220, 0x2ec7a: 0x6c0a3420, 0x2ec7b: 0x6c04fe20, + 0x2ec7c: 0x6c13f620, 0x2ec7d: 0x6c254e20, 0x2ec7e: 0x6c3cee20, 0x2ec7f: 0x6c3cf020, + // Block 0xbb2, offset 0x2ec80 + 0x2ec80: 0x6c3cf220, 0x2ec81: 0x6c3cf420, 0x2ec82: 0x6c3cf620, 0x2ec83: 0x6c3cf820, + 0x2ec84: 0x6c5ac620, 0x2ec85: 0x6c5ac820, 0x2ec86: 0x6c5aca20, 0x2ec87: 0x6c5acc20, + 0x2ec88: 0x6c5ace20, 0x2ec89: 0x6c5ad020, 0x2ec8a: 0x6c5ad220, 0x2ec8b: 0x6c5ad420, + 0x2ec8c: 0x6c5ad620, 0x2ec8d: 0x6c5ad820, 0x2ec8e: 0x6c5ada20, 0x2ec8f: 0x6c7dc420, + 0x2ec90: 0x6c7dc620, 0x2ec91: 0x6c7dc820, 0x2ec92: 0x6c7dca20, 0x2ec93: 0x6c7dcc20, + 0x2ec94: 0x6c7dce20, 0x2ec95: 0x6c7dd020, 0x2ec96: 0x6c7dd220, 0x2ec97: 0x6c7dd420, + 0x2ec98: 0x6c7dd620, 0x2ec99: 0x6c7dd820, 0x2ec9a: 0x6c7dda20, 0x2ec9b: 0x6c7ddc20, + 0x2ec9c: 0x6c7dde20, 0x2ec9d: 0x6c7de020, 0x2ec9e: 0x6c7de220, 0x2ec9f: 0x6c7de420, + 0x2eca0: 0x6c7de620, 0x2eca1: 0x6ca68a20, 0x2eca2: 0x6c7de820, 0x2eca3: 0x6ca69220, + 0x2eca4: 0x6ca69420, 0x2eca5: 0x6ca69620, 0x2eca6: 0x6cd4c020, 0x2eca7: 0x6ca69820, + 0x2eca8: 0x6ca69a20, 0x2eca9: 0x6ca69c20, 0x2ecaa: 0x6ca69e20, 0x2ecab: 0x6ca6a020, + 0x2ecac: 0x6ca6a220, 0x2ecad: 0x6ca6a420, 0x2ecae: 0x6ca6a620, 0x2ecaf: 0x6ca6a820, + 0x2ecb0: 0x6cd4c220, 0x2ecb1: 0x6cd4c420, 0x2ecb2: 0x6cd4c620, 0x2ecb3: 0x6cd4c820, + 0x2ecb4: 0x6cd4ca20, 0x2ecb5: 0x6cd4cc20, 0x2ecb6: 0x6cd4ce20, 0x2ecb7: 0x6cd4d020, + 0x2ecb8: 0x6cd4d220, 0x2ecb9: 0x6d031820, 0x2ecba: 0x6d031a20, 0x2ecbb: 0x6d031c20, + 0x2ecbc: 0x6d031e20, 0x2ecbd: 0x6d032020, 0x2ecbe: 0x6d032220, 0x2ecbf: 0x6d032420, + // Block 0xbb3, offset 0x2ecc0 + 0x2ecc0: 0x6d032620, 0x2ecc1: 0x6d032820, 0x2ecc2: 0x6d032a20, 0x2ecc3: 0x6d032c20, + 0x2ecc4: 0x6cd4d420, 0x2ecc5: 0x6d032e20, 0x2ecc6: 0x6d033020, 0x2ecc7: 0x6d30be20, + 0x2ecc8: 0x6d30c020, 0x2ecc9: 0x6d30c220, 0x2ecca: 0x6d30c420, 0x2eccb: 0x6d30c620, + 0x2eccc: 0x6d30c820, 0x2eccd: 0x6d30ca20, 0x2ecce: 0x6d30cc20, 0x2eccf: 0x6d30ce20, + 0x2ecd0: 0x6d30d020, 0x2ecd1: 0x6d30d220, 0x2ecd2: 0x6d30d420, 0x2ecd3: 0x6d30d620, + 0x2ecd4: 0x6d30d820, 0x2ecd5: 0x6d30da20, 0x2ecd6: 0x6d30dc20, 0x2ecd7: 0x6d30de20, + 0x2ecd8: 0x6d30e020, 0x2ecd9: 0x6d30e220, 0x2ecda: 0x6d5d8c20, 0x2ecdb: 0x6d5d8e20, + 0x2ecdc: 0x6d5d9020, 0x2ecdd: 0x6d5d9220, 0x2ecde: 0x6d5d9420, 0x2ecdf: 0x6d5d9620, + 0x2ece0: 0x6d5d9820, 0x2ece1: 0x6d5d9a20, 0x2ece2: 0x6d5d9c20, 0x2ece3: 0x6d5d9e20, + 0x2ece4: 0x6d87fe20, 0x2ece5: 0x6d880020, 0x2ece6: 0x6d880220, 0x2ece7: 0x6daca020, + 0x2ece8: 0x6daca220, 0x2ece9: 0x6d880420, 0x2ecea: 0x6daca420, 0x2eceb: 0x6daca620, + 0x2ecec: 0x6dcca420, 0x2eced: 0x6dcca620, 0x2ecee: 0x6dcca820, 0x2ecef: 0x6dccaa20, + 0x2ecf0: 0x6de7ac20, 0x2ecf1: 0x6de7ae20, 0x2ecf2: 0x6dfe3a20, 0x2ecf3: 0x6e1f5620, + 0x2ecf4: 0x6e1f5820, 0x2ecf5: 0x6e2aa020, 0x2ecf6: 0x6e333020, 0x2ecf7: 0x6e333220, + 0x2ecf8: 0x6c0a3820, 0x2ecf9: 0x6c5b2a20, 0x2ecfa: 0x6c5b2c20, 0x2ecfb: 0x6ca6f420, + 0x2ecfc: 0x6cd52620, 0x2ecfd: 0x6d037620, 0x2ecfe: 0x6c0a3c20, 0x2ecff: 0x6c256820, + // Block 0xbb4, offset 0x2ed00 + 0x2ed00: 0x6c256a20, 0x2ed01: 0x6c256c20, 0x2ed02: 0x6c256e20, 0x2ed03: 0x6c257020, + 0x2ed04: 0x6c3d3a20, 0x2ed05: 0x6c3d3c20, 0x2ed06: 0x6c3d3e20, 0x2ed07: 0x6c3d4020, + 0x2ed08: 0x6c3d4220, 0x2ed09: 0x6c3d4420, 0x2ed0a: 0x6c3d4620, 0x2ed0b: 0x6c5b3e20, + 0x2ed0c: 0x6c5b4020, 0x2ed0d: 0x6c5b4220, 0x2ed0e: 0x6c5b4420, 0x2ed0f: 0x6c5b4620, + 0x2ed10: 0x6c5b4820, 0x2ed11: 0x6c5b4a20, 0x2ed12: 0x6c5b4c20, 0x2ed13: 0x6c5b4e20, + 0x2ed14: 0x6c5b5020, 0x2ed15: 0x6c5b5220, 0x2ed16: 0x6c5b5420, 0x2ed17: 0x6c5b5620, + 0x2ed18: 0x6c7e3820, 0x2ed19: 0x6c7e3a20, 0x2ed1a: 0x6c7e3c20, 0x2ed1b: 0x6c7e3e20, + 0x2ed1c: 0x6c7e4020, 0x2ed1d: 0x6c7e4220, 0x2ed1e: 0x6c7e4420, 0x2ed1f: 0x6c7e4620, + 0x2ed20: 0x6c7e4820, 0x2ed21: 0x6c7e4a20, 0x2ed22: 0x6c7e4c20, 0x2ed23: 0x6c7e4e20, + 0x2ed24: 0x6c7e5020, 0x2ed25: 0x6c7e5220, 0x2ed26: 0x6c7e5420, 0x2ed27: 0x6c7e5620, + 0x2ed28: 0x6c7e5820, 0x2ed29: 0x6c7e5a20, 0x2ed2a: 0x6c7e5c20, 0x2ed2b: 0x6c7e5e20, + 0x2ed2c: 0x6c7e6020, 0x2ed2d: 0x6c7e6220, 0x2ed2e: 0x6c7e6420, 0x2ed2f: 0x6c7e6620, + 0x2ed30: 0x6c7e6820, 0x2ed31: 0x6ca71a20, 0x2ed32: 0x6ca71c20, 0x2ed33: 0x6ca71e20, + 0x2ed34: 0x6ca72020, 0x2ed35: 0x6ca72220, 0x2ed36: 0x6ca72420, 0x2ed37: 0x6ca72620, + 0x2ed38: 0x6ca72820, 0x2ed39: 0x6ca72a20, 0x2ed3a: 0x6ca72c20, 0x2ed3b: 0x6ca72e20, + 0x2ed3c: 0x6ca73020, 0x2ed3d: 0x6ca73220, 0x2ed3e: 0x6ca73420, 0x2ed3f: 0x6cd54020, + // Block 0xbb5, offset 0x2ed40 + 0x2ed40: 0x6cd54220, 0x2ed41: 0x6cd54420, 0x2ed42: 0x6cd54620, 0x2ed43: 0x6cd54820, + 0x2ed44: 0x6cd54a20, 0x2ed45: 0x6cd54c20, 0x2ed46: 0x6ca73620, 0x2ed47: 0x6cd54e20, + 0x2ed48: 0x6cd55020, 0x2ed49: 0x6cd55220, 0x2ed4a: 0x6cd55420, 0x2ed4b: 0x6cd55620, + 0x2ed4c: 0x6cd55820, 0x2ed4d: 0x6cd55a20, 0x2ed4e: 0x6cd55c20, 0x2ed4f: 0x6d039420, + 0x2ed50: 0x6d039620, 0x2ed51: 0x6d039820, 0x2ed52: 0x6d039a20, 0x2ed53: 0x6d039c20, + 0x2ed54: 0x6d039e20, 0x2ed55: 0x6d03a020, 0x2ed56: 0x6d03a220, 0x2ed57: 0x6d03a420, + 0x2ed58: 0x6d03a620, 0x2ed59: 0x6d03a820, 0x2ed5a: 0x6d03aa20, 0x2ed5b: 0x6d03ac20, + 0x2ed5c: 0x6d03ae20, 0x2ed5d: 0x6d03b020, 0x2ed5e: 0x6d03b220, 0x2ed5f: 0x6d03b420, + 0x2ed60: 0x6d03b620, 0x2ed61: 0x6d03b820, 0x2ed62: 0x6d03ba20, 0x2ed63: 0x6d03bc20, + 0x2ed64: 0x6d03be20, 0x2ed65: 0x6d03c020, 0x2ed66: 0x6d313220, 0x2ed67: 0x6d313420, + 0x2ed68: 0x6d313620, 0x2ed69: 0x6d313820, 0x2ed6a: 0x6d313a20, 0x2ed6b: 0x6d313c20, + 0x2ed6c: 0x6d313e20, 0x2ed6d: 0x6d314020, 0x2ed6e: 0x6d314220, 0x2ed6f: 0x6d314420, + 0x2ed70: 0x6d314620, 0x2ed71: 0x6d314820, 0x2ed72: 0x6d314a20, 0x2ed73: 0x6d314c20, + 0x2ed74: 0x6d5dee20, 0x2ed75: 0x6d31c220, 0x2ed76: 0x6d5df020, 0x2ed77: 0x6d5df220, + 0x2ed78: 0x6d5df420, 0x2ed79: 0x6d5df620, 0x2ed7a: 0x6d5df820, 0x2ed7b: 0x6d5dfa20, + 0x2ed7c: 0x6d5dfc20, 0x2ed7d: 0x6d5dfe20, 0x2ed7e: 0x6d5e0020, 0x2ed7f: 0x6d5e0220, + // Block 0xbb6, offset 0x2ed80 + 0x2ed80: 0x6d5e0420, 0x2ed81: 0x6d5e0620, 0x2ed82: 0x6d5e0820, 0x2ed83: 0x6d5e0a20, + 0x2ed84: 0x6d884220, 0x2ed85: 0x6d884420, 0x2ed86: 0x6d884620, 0x2ed87: 0x6d884820, + 0x2ed88: 0x6d884a20, 0x2ed89: 0x6dacd420, 0x2ed8a: 0x6d314e20, 0x2ed8b: 0x6d884c20, + 0x2ed8c: 0x6d884e20, 0x2ed8d: 0x6d885020, 0x2ed8e: 0x6d885220, 0x2ed8f: 0x6d885420, + 0x2ed90: 0x6d885620, 0x2ed91: 0x6d885820, 0x2ed92: 0x6d885a20, 0x2ed93: 0x6d88ba20, + 0x2ed94: 0x6dacd620, 0x2ed95: 0x6dacd820, 0x2ed96: 0x6dacda20, 0x2ed97: 0x6dacdc20, + 0x2ed98: 0x6dacde20, 0x2ed99: 0x6dace020, 0x2ed9a: 0x6dace220, 0x2ed9b: 0x6dace420, + 0x2ed9c: 0x6dace620, 0x2ed9d: 0x6dace820, 0x2ed9e: 0x6dacea20, 0x2ed9f: 0x6dccce20, + 0x2eda0: 0x6dccd020, 0x2eda1: 0x6dccd220, 0x2eda2: 0x6dccd420, 0x2eda3: 0x6dccd620, + 0x2eda4: 0x6de7bc20, 0x2eda5: 0x6de7be20, 0x2eda6: 0x6de7c020, 0x2eda7: 0x6de7c220, + 0x2eda8: 0x6de7c420, 0x2eda9: 0x6de7c620, 0x2edaa: 0x6de7c820, 0x2edab: 0x6de7ca20, + 0x2edac: 0x6dfe4a20, 0x2edad: 0x6dfe4c20, 0x2edae: 0x6dfe4e20, 0x2edaf: 0x6dfe5020, + 0x2edb0: 0x6e1f6a20, 0x2edb1: 0x6e1f7420, 0x2edb2: 0x6e333e20, 0x2edb3: 0x6e333c20, + 0x2edb4: 0x6c0a4020, 0x2edb5: 0x6c140c20, 0x2edb6: 0x6c257c20, 0x2edb7: 0x6c257e20, + 0x2edb8: 0x6c3d6a20, 0x2edb9: 0x6c3d6c20, 0x2edba: 0x6c3d6e20, 0x2edbb: 0x6c3d7020, + 0x2edbc: 0x6c5b9a20, 0x2edbd: 0x6c5b9c20, 0x2edbe: 0x6c5b9e20, 0x2edbf: 0x6c5ba020, + // Block 0xbb7, offset 0x2edc0 + 0x2edc0: 0x6c5ba220, 0x2edc1: 0x6c5ba420, 0x2edc2: 0x6c5ba620, 0x2edc3: 0x6c5ba820, + 0x2edc4: 0x6c7eac20, 0x2edc5: 0x6c7eae20, 0x2edc6: 0x6c7eb020, 0x2edc7: 0x6c7eb220, + 0x2edc8: 0x6c7eb420, 0x2edc9: 0x6c7eb620, 0x2edca: 0x6c7eb820, 0x2edcb: 0x6c7eba20, + 0x2edcc: 0x6c7ebc20, 0x2edcd: 0x6c7ebe20, 0x2edce: 0x6c7ec020, 0x2edcf: 0x6ca78620, + 0x2edd0: 0x6ca78820, 0x2edd1: 0x6ca78a20, 0x2edd2: 0x6ca78c20, 0x2edd3: 0x6ca78e20, + 0x2edd4: 0x6ca79020, 0x2edd5: 0x6ca79220, 0x2edd6: 0x6cd5ac20, 0x2edd7: 0x6cd5ae20, + 0x2edd8: 0x6cd5b020, 0x2edd9: 0x6cd5b220, 0x2edda: 0x6ca7c420, 0x2eddb: 0x6cd5b420, + 0x2eddc: 0x6cd5b620, 0x2eddd: 0x6cd5b820, 0x2edde: 0x6d043220, 0x2eddf: 0x6d043420, + 0x2ede0: 0x6d043620, 0x2ede1: 0x6d043820, 0x2ede2: 0x6d043a20, 0x2ede3: 0x6d043c20, + 0x2ede4: 0x6d043e20, 0x2ede5: 0x6d044020, 0x2ede6: 0x6d044220, 0x2ede7: 0x6d044420, + 0x2ede8: 0x6d31c820, 0x2ede9: 0x6d31ca20, 0x2edea: 0x6d31cc20, 0x2edeb: 0x6d31ce20, + 0x2edec: 0x6d31d020, 0x2eded: 0x6d31d220, 0x2edee: 0x6d5e7020, 0x2edef: 0x6d5e7220, + 0x2edf0: 0x6d5e7420, 0x2edf1: 0x6d5e7620, 0x2edf2: 0x6d5e7820, 0x2edf3: 0x6d5e7a20, + 0x2edf4: 0x6d5e7c20, 0x2edf5: 0x6d88c820, 0x2edf6: 0x6d88ca20, 0x2edf7: 0x6d88cc20, + 0x2edf8: 0x6d88ce20, 0x2edf9: 0x6d88d020, 0x2edfa: 0x6d88d220, 0x2edfb: 0x6d88d420, + 0x2edfc: 0x6d88d620, 0x2edfd: 0x6d88d820, 0x2edfe: 0x6dad5020, 0x2edff: 0x6dad5220, + // Block 0xbb8, offset 0x2ee00 + 0x2ee00: 0x6dad5420, 0x2ee01: 0x6dad5620, 0x2ee02: 0x6dad5820, 0x2ee03: 0x6e10de20, + 0x2ee04: 0x6dcd2020, 0x2ee05: 0x6dcd2220, 0x2ee06: 0x6de7f620, 0x2ee07: 0x6dfe8620, + 0x2ee08: 0x6e10e020, 0x2ee09: 0x6e10e220, 0x2ee0a: 0x6e1f7820, 0x2ee0b: 0x6c0a4420, + 0x2ee0c: 0x6c258a20, 0x2ee0d: 0x6c258c20, 0x2ee0e: 0x6c3d9020, 0x2ee0f: 0x6c3d9220, + 0x2ee10: 0x6c5bd620, 0x2ee11: 0x6c5bd820, 0x2ee12: 0x6c5bda20, 0x2ee13: 0x6c5bdc20, + 0x2ee14: 0x6c5bde20, 0x2ee15: 0x6c5be020, 0x2ee16: 0x6c5be220, 0x2ee17: 0x6c5be420, + 0x2ee18: 0x6c7efe20, 0x2ee19: 0x6c7f0020, 0x2ee1a: 0x6c7f0220, 0x2ee1b: 0x6c7f0420, + 0x2ee1c: 0x6c7f0620, 0x2ee1d: 0x6c7f0820, 0x2ee1e: 0x6c7f0a20, 0x2ee1f: 0x6cb6ae20, + 0x2ee20: 0x6cb6b020, 0x2ee21: 0x6ca7c820, 0x2ee22: 0x6cd60e20, 0x2ee23: 0x6cd61020, + 0x2ee24: 0x6cd61220, 0x2ee25: 0x6cd61420, 0x2ee26: 0x6cd61620, 0x2ee27: 0x6cd61820, + 0x2ee28: 0x6d048e20, 0x2ee29: 0x6d049020, 0x2ee2a: 0x6d049220, 0x2ee2b: 0x6d049420, + 0x2ee2c: 0x6d320820, 0x2ee2d: 0x6d320a20, 0x2ee2e: 0x6d322e20, 0x2ee2f: 0x6d320c20, + 0x2ee30: 0x6d320e20, 0x2ee31: 0x6d892220, 0x2ee32: 0x6dad8a20, 0x2ee33: 0x6dad8c20, + 0x2ee34: 0x6dad8e20, 0x2ee35: 0x6dcd3a20, 0x2ee36: 0x6dfe9a20, 0x2ee37: 0x6dfe9c20, + 0x2ee38: 0x6e1f7e20, 0x2ee39: 0x6c141020, 0x2ee3a: 0x6c3d9a20, 0x2ee3b: 0x6c3d9c20, + 0x2ee3c: 0x6c5bf820, 0x2ee3d: 0x6c5bfa20, 0x2ee3e: 0x6c5bfc20, 0x2ee3f: 0x6c5bfe20, + // Block 0xbb9, offset 0x2ee40 + 0x2ee40: 0x6c5c0020, 0x2ee41: 0x6c5c0220, 0x2ee42: 0x6c5c0420, 0x2ee43: 0x6c5c0620, + 0x2ee44: 0x6c7fa820, 0x2ee45: 0x6c7f4020, 0x2ee46: 0x6c7f4220, 0x2ee47: 0x6c7f4420, + 0x2ee48: 0x6c7f4620, 0x2ee49: 0x6c7f4820, 0x2ee4a: 0x6c7f4a20, 0x2ee4b: 0x6c7f4c20, + 0x2ee4c: 0x6c7f4e20, 0x2ee4d: 0x6c7f5020, 0x2ee4e: 0x6c7f5220, 0x2ee4f: 0x6c7f5420, + 0x2ee50: 0x6c7f5620, 0x2ee51: 0x6c7f5820, 0x2ee52: 0x6c7f5a20, 0x2ee53: 0x6c7f5c20, + 0x2ee54: 0x6c7f5e20, 0x2ee55: 0x6c7f6020, 0x2ee56: 0x6ca7fa20, 0x2ee57: 0x6ca7fc20, + 0x2ee58: 0x6ca7fe20, 0x2ee59: 0x6ca80020, 0x2ee5a: 0x6ca80220, 0x2ee5b: 0x6ca80420, + 0x2ee5c: 0x6ca80620, 0x2ee5d: 0x6ca80820, 0x2ee5e: 0x6ca80a20, 0x2ee5f: 0x6ca80c20, + 0x2ee60: 0x6ca80e20, 0x2ee61: 0x6ca81020, 0x2ee62: 0x6ca81220, 0x2ee63: 0x6ca81420, + 0x2ee64: 0x6ca81620, 0x2ee65: 0x6ca81820, 0x2ee66: 0x6ca81a20, 0x2ee67: 0x6ca81c20, + 0x2ee68: 0x6ca81e20, 0x2ee69: 0x6ca82020, 0x2ee6a: 0x6ca82220, 0x2ee6b: 0x6ca82420, + 0x2ee6c: 0x6ca82620, 0x2ee6d: 0x6ca82820, 0x2ee6e: 0x6ca82a20, 0x2ee6f: 0x6ca82c20, + 0x2ee70: 0x6ca82e20, 0x2ee71: 0x6ca83020, 0x2ee72: 0x6ca83220, 0x2ee73: 0x6ca83420, + 0x2ee74: 0x6ca83620, 0x2ee75: 0x6ca83820, 0x2ee76: 0x6ca83a20, 0x2ee77: 0x6ca83c20, + 0x2ee78: 0x6ca83e20, 0x2ee79: 0x6ca84020, 0x2ee7a: 0x6ca84220, 0x2ee7b: 0x6ca84420, + 0x2ee7c: 0x6ca84620, 0x2ee7d: 0x6ca84820, 0x2ee7e: 0x6ca84a20, 0x2ee7f: 0x6cd65220, + // Block 0xbba, offset 0x2ee80 + 0x2ee80: 0x6cd65420, 0x2ee81: 0x6cd65620, 0x2ee82: 0x6cd65820, 0x2ee83: 0x6cd65a20, + 0x2ee84: 0x6cd65c20, 0x2ee85: 0x6cd65e20, 0x2ee86: 0x6cd66020, 0x2ee87: 0x6cd66220, + 0x2ee88: 0x6cd66420, 0x2ee89: 0x6cd66620, 0x2ee8a: 0x6cd66820, 0x2ee8b: 0x6cd66a20, + 0x2ee8c: 0x6cd66c20, 0x2ee8d: 0x6cd66e20, 0x2ee8e: 0x6cd67020, 0x2ee8f: 0x6cd67220, + 0x2ee90: 0x6cd67420, 0x2ee91: 0x6cd67620, 0x2ee92: 0x6cd67820, 0x2ee93: 0x6cd67a20, + 0x2ee94: 0x6cd67c20, 0x2ee95: 0x6cd67e20, 0x2ee96: 0x6cd68020, 0x2ee97: 0x6cd68220, + 0x2ee98: 0x6cd68420, 0x2ee99: 0x6cd68620, 0x2ee9a: 0x6cd68820, 0x2ee9b: 0x6cd68a20, + 0x2ee9c: 0x6cd68c20, 0x2ee9d: 0x6cd68e20, 0x2ee9e: 0x6d04ce20, 0x2ee9f: 0x6d04d020, + 0x2eea0: 0x6d04d220, 0x2eea1: 0x6d04d420, 0x2eea2: 0x6d04d620, 0x2eea3: 0x6d04d820, + 0x2eea4: 0x6d04da20, 0x2eea5: 0x6d04dc20, 0x2eea6: 0x6d04de20, 0x2eea7: 0x6d04e020, + 0x2eea8: 0x6d04e220, 0x2eea9: 0x6d04e420, 0x2eeaa: 0x6d04e620, 0x2eeab: 0x6d04e820, + 0x2eeac: 0x6cd6de20, 0x2eead: 0x6d04ea20, 0x2eeae: 0x6d04ec20, 0x2eeaf: 0x6d04ee20, + 0x2eeb0: 0x6d04f020, 0x2eeb1: 0x6d04f220, 0x2eeb2: 0x6d04f420, 0x2eeb3: 0x6d04f620, + 0x2eeb4: 0x6d04f820, 0x2eeb5: 0x6d323020, 0x2eeb6: 0x6d04fa20, 0x2eeb7: 0x6d04fc20, + 0x2eeb8: 0x6d04fe20, 0x2eeb9: 0x6d050020, 0x2eeba: 0x6d050220, 0x2eebb: 0x6d050420, + 0x2eebc: 0x6d050620, 0x2eebd: 0x6d050820, 0x2eebe: 0x6d050a20, 0x2eebf: 0x6d050c20, + // Block 0xbbb, offset 0x2eec0 + 0x2eec0: 0x6d050e20, 0x2eec1: 0x6d324c20, 0x2eec2: 0x6d324e20, 0x2eec3: 0x6d325020, + 0x2eec4: 0x6d325220, 0x2eec5: 0x6d325420, 0x2eec6: 0x6d325620, 0x2eec7: 0x6d325820, + 0x2eec8: 0x6d325a20, 0x2eec9: 0x6d325c20, 0x2eeca: 0x6d325e20, 0x2eecb: 0x6d326020, + 0x2eecc: 0x6d326220, 0x2eecd: 0x6d326420, 0x2eece: 0x6d326620, 0x2eecf: 0x6d326820, + 0x2eed0: 0x6d326a20, 0x2eed1: 0x6d326c20, 0x2eed2: 0x6d326e20, 0x2eed3: 0x6d327020, + 0x2eed4: 0x6d327220, 0x2eed5: 0x6d327420, 0x2eed6: 0x6d327620, 0x2eed7: 0x6d327820, + 0x2eed8: 0x6d327a20, 0x2eed9: 0x6d327c20, 0x2eeda: 0x6d327e20, 0x2eedb: 0x6d328020, + 0x2eedc: 0x6d328220, 0x2eedd: 0x6d328420, 0x2eede: 0x6d328620, 0x2eedf: 0x6d328820, + 0x2eee0: 0x6d328a20, 0x2eee1: 0x6d328c20, 0x2eee2: 0x6d328e20, 0x2eee3: 0x6d329020, + 0x2eee4: 0x6d329220, 0x2eee5: 0x6d329420, 0x2eee6: 0x6d329620, 0x2eee7: 0x6d329820, + 0x2eee8: 0x6d329a20, 0x2eee9: 0x6d329c20, 0x2eeea: 0x6d329e20, 0x2eeeb: 0x6d32a020, + 0x2eeec: 0x6d5f0420, 0x2eeed: 0x6d5f0620, 0x2eeee: 0x6d5f0820, 0x2eeef: 0x6d5f0a20, + 0x2eef0: 0x6d5f0c20, 0x2eef1: 0x6d5f0e20, 0x2eef2: 0x6d5f1020, 0x2eef3: 0x6d5f1220, + 0x2eef4: 0x6d5f1420, 0x2eef5: 0x6d5f1620, 0x2eef6: 0x6d5f1820, 0x2eef7: 0x6d5f1a20, + 0x2eef8: 0x6d333620, 0x2eef9: 0x6d5f1c20, 0x2eefa: 0x6d5f1e20, 0x2eefb: 0x6d5f2020, + 0x2eefc: 0x6d5f2220, 0x2eefd: 0x6d5f2420, 0x2eefe: 0x6d5f2620, 0x2eeff: 0x6d5f2820, + // Block 0xbbc, offset 0x2ef00 + 0x2ef00: 0x6d051020, 0x2ef01: 0x6d5f2a20, 0x2ef02: 0x6d5f2c20, 0x2ef03: 0x6d5f2e20, + 0x2ef04: 0x6d5f3020, 0x2ef05: 0x6d5f3220, 0x2ef06: 0x6d5f3420, 0x2ef07: 0x6d5f3620, + 0x2ef08: 0x6d5f3820, 0x2ef09: 0x6d894a20, 0x2ef0a: 0x6d5f3a20, 0x2ef0b: 0x6d5f3c20, + 0x2ef0c: 0x6d5f3e20, 0x2ef0d: 0x6d5f4020, 0x2ef0e: 0x6d5f4220, 0x2ef0f: 0x6d5f4420, + 0x2ef10: 0x6d5f4620, 0x2ef11: 0x6d5f4820, 0x2ef12: 0x6d5f4a20, 0x2ef13: 0x6d5f4c20, + 0x2ef14: 0x6d894c20, 0x2ef15: 0x6d894e20, 0x2ef16: 0x6d895020, 0x2ef17: 0x6d895220, + 0x2ef18: 0x6d895420, 0x2ef19: 0x6d895620, 0x2ef1a: 0x6d895820, 0x2ef1b: 0x6d895a20, + 0x2ef1c: 0x6d895c20, 0x2ef1d: 0x6d895e20, 0x2ef1e: 0x6d896020, 0x2ef1f: 0x6d896220, + 0x2ef20: 0x6d896420, 0x2ef21: 0x6d896620, 0x2ef22: 0x6d896820, 0x2ef23: 0x6d896a20, + 0x2ef24: 0x6d896c20, 0x2ef25: 0x6d896e20, 0x2ef26: 0x6d897020, 0x2ef27: 0x6d897220, + 0x2ef28: 0x6d897420, 0x2ef29: 0x6d897620, 0x2ef2a: 0x6d897820, 0x2ef2b: 0x6d897a20, + 0x2ef2c: 0x6d897c20, 0x2ef2d: 0x6d897e20, 0x2ef2e: 0x6d898020, 0x2ef2f: 0x6d898220, + 0x2ef30: 0x6dadc820, 0x2ef31: 0x6dadca20, 0x2ef32: 0x6dadcc20, 0x2ef33: 0x6dadce20, + 0x2ef34: 0x6dadd020, 0x2ef35: 0x6dadd220, 0x2ef36: 0x6dadd420, 0x2ef37: 0x6dadd620, + 0x2ef38: 0x6dadd820, 0x2ef39: 0x6d8a5020, 0x2ef3a: 0x6dadda20, 0x2ef3b: 0x6daddc20, + 0x2ef3c: 0x6dadde20, 0x2ef3d: 0x6dade020, 0x2ef3e: 0x6dade220, 0x2ef3f: 0x6dade420, + // Block 0xbbd, offset 0x2ef40 + 0x2ef40: 0x6dade620, 0x2ef41: 0x6dade820, 0x2ef42: 0x6dadea20, 0x2ef43: 0x6dadec20, + 0x2ef44: 0x6dadee20, 0x2ef45: 0x6dadf020, 0x2ef46: 0x6dadf220, 0x2ef47: 0x6dadf420, + 0x2ef48: 0x6dadf620, 0x2ef49: 0x6dadf820, 0x2ef4a: 0x6dadfa20, 0x2ef4b: 0x6dadfc20, + 0x2ef4c: 0x6dadfe20, 0x2ef4d: 0x6dae0020, 0x2ef4e: 0x6dae0220, 0x2ef4f: 0x6dae0420, + 0x2ef50: 0x6dae0620, 0x2ef51: 0x6d898420, 0x2ef52: 0x6dae0820, 0x2ef53: 0x6dae0a20, + 0x2ef54: 0x6dae0c20, 0x2ef55: 0x6dada620, 0x2ef56: 0x6dae0e20, 0x2ef57: 0x6dae1020, + 0x2ef58: 0x6daec420, 0x2ef59: 0x6dcd7220, 0x2ef5a: 0x6dcd7420, 0x2ef5b: 0x6dcd7620, + 0x2ef5c: 0x6dcd7820, 0x2ef5d: 0x6dcd7a20, 0x2ef5e: 0x6dcd7c20, 0x2ef5f: 0x6dcd7e20, + 0x2ef60: 0x6dcd8020, 0x2ef61: 0x6dcd8220, 0x2ef62: 0x6dcd8420, 0x2ef63: 0x6dcd8620, + 0x2ef64: 0x6dcd8820, 0x2ef65: 0x6dcd8a20, 0x2ef66: 0x6dcd8c20, 0x2ef67: 0x6dcd8e20, + 0x2ef68: 0x6dcd9020, 0x2ef69: 0x6dcd9220, 0x2ef6a: 0x6dcd9420, 0x2ef6b: 0x6dcd9620, + 0x2ef6c: 0x6de81220, 0x2ef6d: 0x6dcd9820, 0x2ef6e: 0x6dcd9a20, 0x2ef6f: 0x6dcd9c20, + 0x2ef70: 0x6dcd9e20, 0x2ef71: 0x6dcda020, 0x2ef72: 0x6dcda220, 0x2ef73: 0x6de82820, + 0x2ef74: 0x6de82a20, 0x2ef75: 0x6de82c20, 0x2ef76: 0x6de82e20, 0x2ef77: 0x6de83020, + 0x2ef78: 0x6de83220, 0x2ef79: 0x6de83420, 0x2ef7a: 0x6de83620, 0x2ef7b: 0x6de83820, + 0x2ef7c: 0x6de83a20, 0x2ef7d: 0x6de83c20, 0x2ef7e: 0x6de83e20, 0x2ef7f: 0x6de84020, + // Block 0xbbe, offset 0x2ef80 + 0x2ef80: 0x6de84220, 0x2ef81: 0x6de84420, 0x2ef82: 0x6de84620, 0x2ef83: 0x6dfeac20, + 0x2ef84: 0x6dfeae20, 0x2ef85: 0x6dfeb020, 0x2ef86: 0x6dfeb220, 0x2ef87: 0x6dfeb420, + 0x2ef88: 0x6dfeb620, 0x2ef89: 0x6dfeb820, 0x2ef8a: 0x6dfeba20, 0x2ef8b: 0x6dfebc20, + 0x2ef8c: 0x6dfebe20, 0x2ef8d: 0x6dfec020, 0x2ef8e: 0x6dfec220, 0x2ef8f: 0x6dfec420, + 0x2ef90: 0x6e111820, 0x2ef91: 0x6e111a20, 0x2ef92: 0x6e111c20, 0x2ef93: 0x6e111e20, + 0x2ef94: 0x6e112020, 0x2ef95: 0x6dfec620, 0x2ef96: 0x6e110620, 0x2ef97: 0x6e1f8e20, + 0x2ef98: 0x6e1f9020, 0x2ef99: 0x6e1f9220, 0x2ef9a: 0x6e1f9420, 0x2ef9b: 0x6e1f9620, + 0x2ef9c: 0x6e1f9820, 0x2ef9d: 0x6e1f9a20, 0x2ef9e: 0x6e2ac420, 0x2ef9f: 0x6e1f9c20, + 0x2efa0: 0x6e1f9e20, 0x2efa1: 0x6e1fa020, 0x2efa2: 0x6e2acc20, 0x2efa3: 0x6e2ace20, + 0x2efa4: 0x6e2ad020, 0x2efa5: 0x6e2ad220, 0x2efa6: 0x6e2ad420, 0x2efa7: 0x6e2ad620, + 0x2efa8: 0x6e2ad820, 0x2efa9: 0x6e396020, 0x2efaa: 0x6e335420, 0x2efab: 0x6e396220, + 0x2efac: 0x6e396420, 0x2efad: 0x6e396620, 0x2efae: 0x6e396820, 0x2efaf: 0x6e3dae20, + 0x2efb0: 0x6e3db020, 0x2efb1: 0x6e453420, 0x2efb2: 0x6e463620, 0x2efb3: 0x6c141420, + 0x2efb4: 0x6c3da820, 0x2efb5: 0x6c3daa20, 0x2efb6: 0x6c3dac20, 0x2efb7: 0x6c5c3220, + 0x2efb8: 0x6c5c3420, 0x2efb9: 0x6c5c3620, 0x2efba: 0x6c5c3820, 0x2efbb: 0x6c5c3a20, + 0x2efbc: 0x6c5c3c20, 0x2efbd: 0x6c5c3e20, 0x2efbe: 0x6c5c4020, 0x2efbf: 0x6c5c4220, + // Block 0xbbf, offset 0x2efc0 + 0x2efc0: 0x6c5c4420, 0x2efc1: 0x6c5c4620, 0x2efc2: 0x6c5c4820, 0x2efc3: 0x6c7fae20, + 0x2efc4: 0x6c7fb020, 0x2efc5: 0x6c7fb220, 0x2efc6: 0x6c7fb420, 0x2efc7: 0x6c7fb620, + 0x2efc8: 0x6c7fb820, 0x2efc9: 0x6c7fba20, 0x2efca: 0x6c7fbc20, 0x2efcb: 0x6c7fbe20, + 0x2efcc: 0x6c7fc020, 0x2efcd: 0x6c7fc220, 0x2efce: 0x6c7fc420, 0x2efcf: 0x6c7fc620, + 0x2efd0: 0x6c7fc820, 0x2efd1: 0x6c7fca20, 0x2efd2: 0x6ca89c20, 0x2efd3: 0x6ca89e20, + 0x2efd4: 0x6ca8a020, 0x2efd5: 0x6ca8a220, 0x2efd6: 0x6ca8a420, 0x2efd7: 0x6ca8a620, + 0x2efd8: 0x6ca8a820, 0x2efd9: 0x6ca8aa20, 0x2efda: 0x6ca8ac20, 0x2efdb: 0x6ca8ae20, + 0x2efdc: 0x6ca8b020, 0x2efdd: 0x6ca8b220, 0x2efde: 0x6cd6ec20, 0x2efdf: 0x6cd6ee20, + 0x2efe0: 0x6cd6f020, 0x2efe1: 0x6cd6f220, 0x2efe2: 0x6cd6f420, 0x2efe3: 0x6ca8b420, + 0x2efe4: 0x6cd6f620, 0x2efe5: 0x6cd6f820, 0x2efe6: 0x6cd6fa20, 0x2efe7: 0x6cd6fc20, + 0x2efe8: 0x6cd6fe20, 0x2efe9: 0x6cd70020, 0x2efea: 0x6cd70220, 0x2efeb: 0x6cd70420, + 0x2efec: 0x6cd70620, 0x2efed: 0x6cd70820, 0x2efee: 0x6d05a420, 0x2efef: 0x6d05a620, + 0x2eff0: 0x6d05a820, 0x2eff1: 0x6d05aa20, 0x2eff2: 0x6d05ac20, 0x2eff3: 0x6d05ae20, + 0x2eff4: 0x6d05b020, 0x2eff5: 0x6d05b220, 0x2eff6: 0x6d334420, 0x2eff7: 0x6d334620, + 0x2eff8: 0x6d334820, 0x2eff9: 0x6d334a20, 0x2effa: 0x6d334c20, 0x2effb: 0x6d334e20, + 0x2effc: 0x6d335020, 0x2effd: 0x6d335220, 0x2effe: 0x6d335420, 0x2efff: 0x6d335620, + // Block 0xbc0, offset 0x2f000 + 0x2f000: 0x6d05b420, 0x2f001: 0x6d335820, 0x2f002: 0x6d5ffc20, 0x2f003: 0x6d5ffe20, + 0x2f004: 0x6d600020, 0x2f005: 0x6d600220, 0x2f006: 0x6d600420, 0x2f007: 0x6d600620, + 0x2f008: 0x6d600820, 0x2f009: 0x6d600a20, 0x2f00a: 0x6d600c20, 0x2f00b: 0x6d600e20, + 0x2f00c: 0x6d601020, 0x2f00d: 0x6d601220, 0x2f00e: 0x6d601420, 0x2f00f: 0x6d8a5820, + 0x2f010: 0x6d8a5a20, 0x2f011: 0x6d8a5c20, 0x2f012: 0x6d8a5e20, 0x2f013: 0x6d8a6020, + 0x2f014: 0x6d8a6220, 0x2f015: 0x6d8a6420, 0x2f016: 0x6d8a6620, 0x2f017: 0x6d8a6820, + 0x2f018: 0x6d8a6a20, 0x2f019: 0x6daed420, 0x2f01a: 0x6daed620, 0x2f01b: 0x6daed820, + 0x2f01c: 0x6daeda20, 0x2f01d: 0x6daedc20, 0x2f01e: 0x6daede20, 0x2f01f: 0x6daee020, + 0x2f020: 0x6daee220, 0x2f021: 0x6daee420, 0x2f022: 0x6daee620, 0x2f023: 0x6dce7220, + 0x2f024: 0x6dce7420, 0x2f025: 0x6dce7620, 0x2f026: 0x6dce7820, 0x2f027: 0x6dce7a20, + 0x2f028: 0x6daee820, 0x2f029: 0x6de8c820, 0x2f02a: 0x6de8ca20, 0x2f02b: 0x6de8cc20, + 0x2f02c: 0x6de8ce20, 0x2f02d: 0x6de8d020, 0x2f02e: 0x6dff2020, 0x2f02f: 0x6dff2220, + 0x2f030: 0x6dff2420, 0x2f031: 0x6e1fe420, 0x2f032: 0x6e118c20, 0x2f033: 0x6e3dc220, + 0x2f034: 0x6e1fe620, 0x2f035: 0x6e2b0820, 0x2f036: 0x6e398820, 0x2f037: 0x6e409e20, + 0x2f038: 0x6c141620, 0x2f039: 0x6c141820, 0x2f03a: 0x6c259a20, 0x2f03b: 0x6c259c20, + 0x2f03c: 0x6c3dbc20, 0x2f03d: 0x6c3dbe20, 0x2f03e: 0x6c3dc020, 0x2f03f: 0x6c3dc220, + // Block 0xbc1, offset 0x2f040 + 0x2f040: 0x6c5c6620, 0x2f041: 0x6c5c6820, 0x2f042: 0x6c5c6a20, 0x2f043: 0x6c5c6c20, + 0x2f044: 0x6c5c6e20, 0x2f045: 0x6c5c7020, 0x2f046: 0x6c5c7220, 0x2f047: 0x6c5c7420, + 0x2f048: 0x6c5c7620, 0x2f049: 0x6c5c7820, 0x2f04a: 0x6c800a20, 0x2f04b: 0x6c800c20, + 0x2f04c: 0x6c800e20, 0x2f04d: 0x6c801020, 0x2f04e: 0x6c801220, 0x2f04f: 0x6c801420, + 0x2f050: 0x6c801620, 0x2f051: 0x6c801820, 0x2f052: 0x6c801a20, 0x2f053: 0x6c801c20, + 0x2f054: 0x6c801e20, 0x2f055: 0x6c802020, 0x2f056: 0x6c802220, 0x2f057: 0x6c802420, + 0x2f058: 0x6c802620, 0x2f059: 0x6c802820, 0x2f05a: 0x6c802a20, 0x2f05b: 0x6c802c20, + 0x2f05c: 0x6c802e20, 0x2f05d: 0x6c803020, 0x2f05e: 0x6c803220, 0x2f05f: 0x6c803420, + 0x2f060: 0x6c803620, 0x2f061: 0x6c803820, 0x2f062: 0x6c803a20, 0x2f063: 0x6c803c20, + 0x2f064: 0x6c803e20, 0x2f065: 0x6c804020, 0x2f066: 0x6c804220, 0x2f067: 0x6c804420, + 0x2f068: 0x6ca90c20, 0x2f069: 0x6ca90e20, 0x2f06a: 0x6cd74220, 0x2f06b: 0x6cd74420, + 0x2f06c: 0x6ca91020, 0x2f06d: 0x6ca91220, 0x2f06e: 0x6ca91420, 0x2f06f: 0x6ca91620, + 0x2f070: 0x6ca91820, 0x2f071: 0x6ca91a20, 0x2f072: 0x6ca91c20, 0x2f073: 0x6ca91e20, + 0x2f074: 0x6ca92020, 0x2f075: 0x6ca92220, 0x2f076: 0x6ca92420, 0x2f077: 0x6ca92620, + 0x2f078: 0x6ca92820, 0x2f079: 0x6ca92a20, 0x2f07a: 0x6ca92c20, 0x2f07b: 0x6ca92e20, + 0x2f07c: 0x6ca93020, 0x2f07d: 0x6ca93220, 0x2f07e: 0x6ca93420, 0x2f07f: 0x6ca93620, + // Block 0xbc2, offset 0x2f080 + 0x2f080: 0x6ca93820, 0x2f081: 0x6ca93a20, 0x2f082: 0x6ca93c20, 0x2f083: 0x6ca93e20, + 0x2f084: 0x6ca94020, 0x2f085: 0x6ca94220, 0x2f086: 0x6ca94420, 0x2f087: 0x6ca94620, + 0x2f088: 0x6ca94820, 0x2f089: 0x6ca94a20, 0x2f08a: 0x6ca94c20, 0x2f08b: 0x6ca94e20, + 0x2f08c: 0x6ca95020, 0x2f08d: 0x6cd75a20, 0x2f08e: 0x6cd75c20, 0x2f08f: 0x6cd75e20, + 0x2f090: 0x6cd76020, 0x2f091: 0x6cd76220, 0x2f092: 0x6cd76420, 0x2f093: 0x6cd76620, + 0x2f094: 0x6cd76820, 0x2f095: 0x6cd76a20, 0x2f096: 0x6cd76c20, 0x2f097: 0x6cd76e20, + 0x2f098: 0x6cd77020, 0x2f099: 0x6cd77220, 0x2f09a: 0x6cd77420, 0x2f09b: 0x6d061420, + 0x2f09c: 0x6cd77620, 0x2f09d: 0x6cd77820, 0x2f09e: 0x6cd77a20, 0x2f09f: 0x6cd77c20, + 0x2f0a0: 0x6cd77e20, 0x2f0a1: 0x6cd78020, 0x2f0a2: 0x6cd78220, 0x2f0a3: 0x6cd78420, + 0x2f0a4: 0x6cd78620, 0x2f0a5: 0x6cd78820, 0x2f0a6: 0x6cd78a20, 0x2f0a7: 0x6cd78c20, + 0x2f0a8: 0x6cd78e20, 0x2f0a9: 0x6cd79020, 0x2f0aa: 0x6cd79220, 0x2f0ab: 0x6cd79420, + 0x2f0ac: 0x6cd79620, 0x2f0ad: 0x6cd79820, 0x2f0ae: 0x6cd79a20, 0x2f0af: 0x6cd79c20, + 0x2f0b0: 0x6cd79e20, 0x2f0b1: 0x6cd7a020, 0x2f0b2: 0x6cd7a220, 0x2f0b3: 0x6cd7a420, + 0x2f0b4: 0x6cd7a620, 0x2f0b5: 0x6cd7a820, 0x2f0b6: 0x6cd7aa20, 0x2f0b7: 0x6cd7ac20, + 0x2f0b8: 0x6d061620, 0x2f0b9: 0x6d061820, 0x2f0ba: 0x6d061a20, 0x2f0bb: 0x6d061c20, + 0x2f0bc: 0x6d061e20, 0x2f0bd: 0x6d062020, 0x2f0be: 0x6cd80c20, 0x2f0bf: 0x6d062220, + // Block 0xbc3, offset 0x2f0c0 + 0x2f0c0: 0x6d062420, 0x2f0c1: 0x6d062620, 0x2f0c2: 0x6d062820, 0x2f0c3: 0x6d062a20, + 0x2f0c4: 0x6d062c20, 0x2f0c5: 0x6d062e20, 0x2f0c6: 0x6d063020, 0x2f0c7: 0x6d063220, + 0x2f0c8: 0x6d063420, 0x2f0c9: 0x6d063620, 0x2f0ca: 0x6d063820, 0x2f0cb: 0x6d063a20, + 0x2f0cc: 0x6d063c20, 0x2f0cd: 0x6d063e20, 0x2f0ce: 0x6d064020, 0x2f0cf: 0x6d064220, + 0x2f0d0: 0x6d064420, 0x2f0d1: 0x6d064620, 0x2f0d2: 0x6d064820, 0x2f0d3: 0x6d064a20, + 0x2f0d4: 0x6d064c20, 0x2f0d5: 0x6d064e20, 0x2f0d6: 0x6d33b420, 0x2f0d7: 0x6d065020, + 0x2f0d8: 0x6d065220, 0x2f0d9: 0x6d065420, 0x2f0da: 0x6d065620, 0x2f0db: 0x6d065820, + 0x2f0dc: 0x6d33d020, 0x2f0dd: 0x6d33d220, 0x2f0de: 0x6d33d420, 0x2f0df: 0x6d33d620, + 0x2f0e0: 0x6d33d820, 0x2f0e1: 0x6d33da20, 0x2f0e2: 0x6d33dc20, 0x2f0e3: 0x6d33de20, + 0x2f0e4: 0x6d33e020, 0x2f0e5: 0x6d33e220, 0x2f0e6: 0x6d33e420, 0x2f0e7: 0x6d33e620, + 0x2f0e8: 0x6d33e820, 0x2f0e9: 0x6d33ea20, 0x2f0ea: 0x6d33ec20, 0x2f0eb: 0x6d33ee20, + 0x2f0ec: 0x6d33f020, 0x2f0ed: 0x6d33f220, 0x2f0ee: 0x6d33f420, 0x2f0ef: 0x6d33f620, + 0x2f0f0: 0x6d33f820, 0x2f0f1: 0x6d33fa20, 0x2f0f2: 0x6d33fc20, 0x2f0f3: 0x6d33fe20, + 0x2f0f4: 0x6d340020, 0x2f0f5: 0x6d340220, 0x2f0f6: 0x6d340420, 0x2f0f7: 0x6d340620, + 0x2f0f8: 0x6d340820, 0x2f0f9: 0x6d340a20, 0x2f0fa: 0x6d340c20, 0x2f0fb: 0x6d340e20, + 0x2f0fc: 0x6d341020, 0x2f0fd: 0x6d341220, 0x2f0fe: 0x6d341420, 0x2f0ff: 0x6d341620, + // Block 0xbc4, offset 0x2f100 + 0x2f100: 0x6d341820, 0x2f101: 0x6d341a20, 0x2f102: 0x6d341c20, 0x2f103: 0x6d341e20, + 0x2f104: 0x6d342020, 0x2f105: 0x6d342220, 0x2f106: 0x6d342420, 0x2f107: 0x6d342620, + 0x2f108: 0x6d342820, 0x2f109: 0x6d342a20, 0x2f10a: 0x6d342c20, 0x2f10b: 0x6d342e20, + 0x2f10c: 0x6d343020, 0x2f10d: 0x6d343220, 0x2f10e: 0x6d343420, 0x2f10f: 0x6d343620, + 0x2f110: 0x6d33b620, 0x2f111: 0x6d343820, 0x2f112: 0x6d343a20, 0x2f113: 0x6d608820, + 0x2f114: 0x6d343c20, 0x2f115: 0x6d343e20, 0x2f116: 0x6d608a20, 0x2f117: 0x6d608c20, + 0x2f118: 0x6d608e20, 0x2f119: 0x6d609020, 0x2f11a: 0x6d609220, 0x2f11b: 0x6d609420, + 0x2f11c: 0x6d609620, 0x2f11d: 0x6d609820, 0x2f11e: 0x6d609a20, 0x2f11f: 0x6d609c20, + 0x2f120: 0x6d609e20, 0x2f121: 0x6d60a020, 0x2f122: 0x6d60a220, 0x2f123: 0x6d60a420, + 0x2f124: 0x6d60a620, 0x2f125: 0x6d60a820, 0x2f126: 0x6d60aa20, 0x2f127: 0x6d60ac20, + 0x2f128: 0x6d60ae20, 0x2f129: 0x6d60b020, 0x2f12a: 0x6d60b220, 0x2f12b: 0x6d60b420, + 0x2f12c: 0x6d60b620, 0x2f12d: 0x6d60b820, 0x2f12e: 0x6d60ba20, 0x2f12f: 0x6d60bc20, + 0x2f130: 0x6d60be20, 0x2f131: 0x6d60c020, 0x2f132: 0x6d60c220, 0x2f133: 0x6d60c420, + 0x2f134: 0x6d60c620, 0x2f135: 0x6d60c820, 0x2f136: 0x6d60ca20, 0x2f137: 0x6d60cc20, + 0x2f138: 0x6d60ce20, 0x2f139: 0x6d60d020, 0x2f13a: 0x6d60d220, 0x2f13b: 0x6d60d420, + 0x2f13c: 0x6d60d620, 0x2f13d: 0x6d60d820, 0x2f13e: 0x6d60da20, 0x2f13f: 0x6d60dc20, + // Block 0xbc5, offset 0x2f140 + 0x2f140: 0x6d60de20, 0x2f141: 0x6d60e020, 0x2f142: 0x6d60e220, 0x2f143: 0x6d60e420, + 0x2f144: 0x6d60e620, 0x2f145: 0x6d60e820, 0x2f146: 0x6d60ea20, 0x2f147: 0x6d60ec20, + 0x2f148: 0x6d8aba20, 0x2f149: 0x6d8abc20, 0x2f14a: 0x6d8abe20, 0x2f14b: 0x6d8ac020, + 0x2f14c: 0x6d8ac220, 0x2f14d: 0x6d8ac420, 0x2f14e: 0x6d8ac620, 0x2f14f: 0x6d8ac820, + 0x2f150: 0x6d8aca20, 0x2f151: 0x6d8acc20, 0x2f152: 0x6d8ace20, 0x2f153: 0x6d8ad020, + 0x2f154: 0x6d8ad220, 0x2f155: 0x6d8ad420, 0x2f156: 0x6d8ad620, 0x2f157: 0x6d8ad820, + 0x2f158: 0x6d8ada20, 0x2f159: 0x6d8adc20, 0x2f15a: 0x6d8ade20, 0x2f15b: 0x6d8ae020, + 0x2f15c: 0x6d8ae220, 0x2f15d: 0x6d8ae420, 0x2f15e: 0x6d8ae620, 0x2f15f: 0x6d8ae820, + 0x2f160: 0x6d8aea20, 0x2f161: 0x6d8aec20, 0x2f162: 0x6d8aee20, 0x2f163: 0x6d8af020, + 0x2f164: 0x6d8af220, 0x2f165: 0x6d8af420, 0x2f166: 0x6d8af620, 0x2f167: 0x6d8af820, + 0x2f168: 0x6d8afa20, 0x2f169: 0x6daf3420, 0x2f16a: 0x6daf3620, 0x2f16b: 0x6daf3820, + 0x2f16c: 0x6daf3a20, 0x2f16d: 0x6daf3c20, 0x2f16e: 0x6daf3e20, 0x2f16f: 0x6daf4020, + 0x2f170: 0x6daf4220, 0x2f171: 0x6daf4420, 0x2f172: 0x6daf4620, 0x2f173: 0x6daf4820, + 0x2f174: 0x6daf4a20, 0x2f175: 0x6daf4c20, 0x2f176: 0x6daf4e20, 0x2f177: 0x6daf5020, + 0x2f178: 0x6daf5220, 0x2f179: 0x6daf5420, 0x2f17a: 0x6daf5620, 0x2f17b: 0x6daf5820, + 0x2f17c: 0x6daf5a20, 0x2f17d: 0x6daf5c20, 0x2f17e: 0x6daf5e20, 0x2f17f: 0x6daf6020, + // Block 0xbc6, offset 0x2f180 + 0x2f180: 0x6daf6220, 0x2f181: 0x6daf6420, 0x2f182: 0x6daf6620, 0x2f183: 0x6daf6820, + 0x2f184: 0x6daf6a20, 0x2f185: 0x6daf6c20, 0x2f186: 0x6daf6e20, 0x2f187: 0x6daf7020, + 0x2f188: 0x6dafea20, 0x2f189: 0x6daf7220, 0x2f18a: 0x6daf7420, 0x2f18b: 0x6de91a20, + 0x2f18c: 0x6daf7620, 0x2f18d: 0x6daf7820, 0x2f18e: 0x6dcecc20, 0x2f18f: 0x6dcece20, + 0x2f190: 0x6dced020, 0x2f191: 0x6dced220, 0x2f192: 0x6dced420, 0x2f193: 0x6dced620, + 0x2f194: 0x6dced820, 0x2f195: 0x6dceda20, 0x2f196: 0x6dcedc20, 0x2f197: 0x6dcede20, + 0x2f198: 0x6dcee020, 0x2f199: 0x6dcee220, 0x2f19a: 0x6dcee420, 0x2f19b: 0x6dcee620, + 0x2f19c: 0x6dcee820, 0x2f19d: 0x6dceea20, 0x2f19e: 0x6dceec20, 0x2f19f: 0x6dceee20, + 0x2f1a0: 0x6dcef020, 0x2f1a1: 0x6dcef220, 0x2f1a2: 0x6dcef420, 0x2f1a3: 0x6dcef620, + 0x2f1a4: 0x6dcef820, 0x2f1a5: 0x6dcefa20, 0x2f1a6: 0x6de91c20, 0x2f1a7: 0x6dcefc20, + 0x2f1a8: 0x6de91e20, 0x2f1a9: 0x6de92020, 0x2f1aa: 0x6de92220, 0x2f1ab: 0x6de92420, + 0x2f1ac: 0x6de92620, 0x2f1ad: 0x6de92820, 0x2f1ae: 0x6de92a20, 0x2f1af: 0x6de92c20, + 0x2f1b0: 0x6de92e20, 0x2f1b1: 0x6dcefe20, 0x2f1b2: 0x6de93020, 0x2f1b3: 0x6de93220, + 0x2f1b4: 0x6de93420, 0x2f1b5: 0x6de93620, 0x2f1b6: 0x6de93820, 0x2f1b7: 0x6de93a20, + 0x2f1b8: 0x6de93c20, 0x2f1b9: 0x6de93e20, 0x2f1ba: 0x6de94020, 0x2f1bb: 0x6dff4220, + 0x2f1bc: 0x6dff4420, 0x2f1bd: 0x6dff4620, 0x2f1be: 0x6dff4820, 0x2f1bf: 0x6dff4a20, + // Block 0xbc7, offset 0x2f1c0 + 0x2f1c0: 0x6dff4c20, 0x2f1c1: 0x6dff4e20, 0x2f1c2: 0x6dff5020, 0x2f1c3: 0x6dff5220, + 0x2f1c4: 0x6e11aa20, 0x2f1c5: 0x6e11ac20, 0x2f1c6: 0x6e11ae20, 0x2f1c7: 0x6e11b020, + 0x2f1c8: 0x6e11b220, 0x2f1c9: 0x6e11b420, 0x2f1ca: 0x6e11b620, 0x2f1cb: 0x6e11b820, + 0x2f1cc: 0x6e11ba20, 0x2f1cd: 0x6e11bc20, 0x2f1ce: 0x6e11be20, 0x2f1cf: 0x6e11c020, + 0x2f1d0: 0x6e11c220, 0x2f1d1: 0x6e200820, 0x2f1d2: 0x6e200a20, 0x2f1d3: 0x6e2b1620, + 0x2f1d4: 0x6e2b1820, 0x2f1d5: 0x6e2b1a20, 0x2f1d6: 0x6e2b1c20, 0x2f1d7: 0x6e339220, + 0x2f1d8: 0x6e399820, 0x2f1d9: 0x6e399a20, 0x2f1da: 0x6e399c20, 0x2f1db: 0x6e399e20, + 0x2f1dc: 0x6e40a620, 0x2f1dd: 0x6e40a820, 0x2f1de: 0x6e445a20, 0x2f1df: 0x6c020020, + 0x2f1e0: 0x6c0a4620, 0x2f1e1: 0x6c141a20, 0x2f1e2: 0x6c141c20, 0x2f1e3: 0x6c141e20, + 0x2f1e4: 0x6c142020, 0x2f1e5: 0x6c142220, 0x2f1e6: 0x6c142420, 0x2f1e7: 0x6c142620, + 0x2f1e8: 0x6c142820, 0x2f1e9: 0x6c142a20, 0x2f1ea: 0x6c142c20, 0x2f1eb: 0x6c142e20, + 0x2f1ec: 0x6c25a020, 0x2f1ed: 0x6c25a220, 0x2f1ee: 0x6c25a420, 0x2f1ef: 0x6c25a620, + 0x2f1f0: 0x6c25a820, 0x2f1f1: 0x6c25aa20, 0x2f1f2: 0x6c25ac20, 0x2f1f3: 0x6c25ae20, + 0x2f1f4: 0x6c25b020, 0x2f1f5: 0x6c25b220, 0x2f1f6: 0x6c259e20, 0x2f1f7: 0x6c25b420, + 0x2f1f8: 0x6c25b620, 0x2f1f9: 0x6c25b820, 0x2f1fa: 0x6c25ba20, 0x2f1fb: 0x6c25bc20, + 0x2f1fc: 0x6c25be20, 0x2f1fd: 0x6c25c020, 0x2f1fe: 0x6c25c220, 0x2f1ff: 0x6c3dd620, + // Block 0xbc8, offset 0x2f200 + 0x2f200: 0x6c3dd820, 0x2f201: 0x6c3dda20, 0x2f202: 0x6c3ddc20, 0x2f203: 0x6c3dde20, + 0x2f204: 0x6c3de020, 0x2f205: 0x6c3de220, 0x2f206: 0x6c3de420, 0x2f207: 0x6c3de620, + 0x2f208: 0x6c3de820, 0x2f209: 0x6c3dea20, 0x2f20a: 0x6c3dec20, 0x2f20b: 0x6c3dee20, + 0x2f20c: 0x6c3df020, 0x2f20d: 0x6c3df220, 0x2f20e: 0x6c3df420, 0x2f20f: 0x6c3df620, + 0x2f210: 0x6c3df820, 0x2f211: 0x6c5c9a20, 0x2f212: 0x6c5c9c20, 0x2f213: 0x6c5c9e20, + 0x2f214: 0x6c5ca020, 0x2f215: 0x6c5ca220, 0x2f216: 0x6c5ca420, 0x2f217: 0x6c5ca620, + 0x2f218: 0x6c5ca820, 0x2f219: 0x6c5caa20, 0x2f21a: 0x6c5cac20, 0x2f21b: 0x6c5cae20, + 0x2f21c: 0x6c5cb020, 0x2f21d: 0x6c5cb220, 0x2f21e: 0x6c5cb420, 0x2f21f: 0x6c5cb620, + 0x2f220: 0x6c809e20, 0x2f221: 0x6c80a020, 0x2f222: 0x6c80a220, 0x2f223: 0x6c80a420, + 0x2f224: 0x6c80a620, 0x2f225: 0x6c80a820, 0x2f226: 0x6c80aa20, 0x2f227: 0x6c80ac20, + 0x2f228: 0x6c80ae20, 0x2f229: 0x6ca9a220, 0x2f22a: 0x6ca9a420, 0x2f22b: 0x6ca9a620, + 0x2f22c: 0x6ca9a820, 0x2f22d: 0x6ca9aa20, 0x2f22e: 0x6ca9ac20, 0x2f22f: 0x6ca9ae20, + 0x2f230: 0x6ca9b020, 0x2f231: 0x6ca9b220, 0x2f232: 0x6ca9b420, 0x2f233: 0x6ca9b620, + 0x2f234: 0x6ca9b820, 0x2f235: 0x6ca9ba20, 0x2f236: 0x6ca9bc20, 0x2f237: 0x6ca9be20, + 0x2f238: 0x6ca9c020, 0x2f239: 0x6ca9c220, 0x2f23a: 0x6ca9c420, 0x2f23b: 0x6ca9c620, + 0x2f23c: 0x6ca9c820, 0x2f23d: 0x6ca9ca20, 0x2f23e: 0x6ca9cc20, 0x2f23f: 0x6ca9ce20, + // Block 0xbc9, offset 0x2f240 + 0x2f240: 0x6ca9d020, 0x2f241: 0x6ca9d220, 0x2f242: 0x6cd81220, 0x2f243: 0x6cd81420, + 0x2f244: 0x6cd81620, 0x2f245: 0x6cd81820, 0x2f246: 0x6cd81a20, 0x2f247: 0x6cd81c20, + 0x2f248: 0x6cd81e20, 0x2f249: 0x6cd82020, 0x2f24a: 0x6cd82220, 0x2f24b: 0x6cd82420, + 0x2f24c: 0x6cd82620, 0x2f24d: 0x6cd82820, 0x2f24e: 0x6cd82a20, 0x2f24f: 0x6cd82c20, + 0x2f250: 0x6cd82e20, 0x2f251: 0x6cd83020, 0x2f252: 0x6cd83220, 0x2f253: 0x6cd83420, + 0x2f254: 0x6cd83620, 0x2f255: 0x6cd83820, 0x2f256: 0x6cd83a20, 0x2f257: 0x6cd83c20, + 0x2f258: 0x6cd83e20, 0x2f259: 0x6d06ce20, 0x2f25a: 0x6d06d020, 0x2f25b: 0x6d06d220, + 0x2f25c: 0x6d06d420, 0x2f25d: 0x6d06d620, 0x2f25e: 0x6d06d820, 0x2f25f: 0x6d06da20, + 0x2f260: 0x6d06dc20, 0x2f261: 0x6d06de20, 0x2f262: 0x6d06e020, 0x2f263: 0x6d06e220, + 0x2f264: 0x6d06e420, 0x2f265: 0x6d34c820, 0x2f266: 0x6d34ca20, 0x2f267: 0x6d34cc20, + 0x2f268: 0x6d34ce20, 0x2f269: 0x6d34d020, 0x2f26a: 0x6d34d220, 0x2f26b: 0x6d34d420, + 0x2f26c: 0x6d618020, 0x2f26d: 0x6d618220, 0x2f26e: 0x6d618420, 0x2f26f: 0x6d618620, + 0x2f270: 0x6d8b9620, 0x2f271: 0x6d8b9820, 0x2f272: 0x6d8b9a20, 0x2f273: 0x6d8b9c20, + 0x2f274: 0x6d8b9e20, 0x2f275: 0x6de9a220, 0x2f276: 0x6c143020, 0x2f277: 0x6c3e0020, + 0x2f278: 0x6c5cc620, 0x2f279: 0x6c80c620, 0x2f27a: 0x6c80c820, 0x2f27b: 0x6ca9ee20, + 0x2f27c: 0x6c80ca20, 0x2f27d: 0x6ca9f020, 0x2f27e: 0x6cd85420, 0x2f27f: 0x6cd85620, + // Block 0xbca, offset 0x2f280 + 0x2f280: 0x6cd85820, 0x2f281: 0x6d34e420, 0x2f282: 0x6d34e620, 0x2f283: 0x6d8ba820, + 0x2f284: 0x6daff420, 0x2f285: 0x6daff620, 0x2f286: 0x6daff820, 0x2f287: 0x6dcf7c20, + 0x2f288: 0x6dcf7e20, 0x2f289: 0x6dcf8020, 0x2f28a: 0x6de9a420, 0x2f28b: 0x6de9a620, + 0x2f28c: 0x6dff9020, 0x2f28d: 0x6e120220, 0x2f28e: 0x6e203a20, 0x2f28f: 0x6e203c20, + 0x2f290: 0x6e33a620, 0x2f291: 0x6c143420, 0x2f292: 0x6c0a4a20, 0x2f293: 0x6c050420, + 0x2f294: 0x6c3e0420, 0x2f295: 0x6c25dc20, 0x2f296: 0x6c3e0620, 0x2f297: 0x6c3e0820, + 0x2f298: 0x6c5cd620, 0x2f299: 0x6c3e2020, 0x2f29a: 0x6c5cd820, 0x2f29b: 0x6c80d820, + 0x2f29c: 0x6c80da20, 0x2f29d: 0x6c80dc20, 0x2f29e: 0x6c80de20, 0x2f29f: 0x6c80e020, + 0x2f2a0: 0x6c80e220, 0x2f2a1: 0x6c80e420, 0x2f2a2: 0x6c80e620, 0x2f2a3: 0x6caa0020, + 0x2f2a4: 0x6cd86820, 0x2f2a5: 0x6cd86a20, 0x2f2a6: 0x6cd86c20, 0x2f2a7: 0x6d070220, + 0x2f2a8: 0x6d070420, 0x2f2a9: 0x6d070620, 0x2f2aa: 0x6d070820, 0x2f2ab: 0x6d070a20, + 0x2f2ac: 0x6d070c20, 0x2f2ad: 0x6d070e20, 0x2f2ae: 0x6d071020, 0x2f2af: 0x6d350020, + 0x2f2b0: 0x6d350220, 0x2f2b1: 0x6d350420, 0x2f2b2: 0x6d071220, 0x2f2b3: 0x6d350620, + 0x2f2b4: 0x6d350820, 0x2f2b5: 0x6d61a420, 0x2f2b6: 0x6d61a620, 0x2f2b7: 0x6d61a820, + 0x2f2b8: 0x6d61aa20, 0x2f2b9: 0x6d8bbe20, 0x2f2ba: 0x6d8bc020, 0x2f2bb: 0x6d8bc220, + 0x2f2bc: 0x6d8bc420, 0x2f2bd: 0x6db00820, 0x2f2be: 0x6db00a20, 0x2f2bf: 0x6db00c20, + // Block 0xbcb, offset 0x2f2c0 + 0x2f2c0: 0x6dcf8a20, 0x2f2c1: 0x6db00e20, 0x2f2c2: 0x6dcf8e20, 0x2f2c3: 0x6de9b620, + 0x2f2c4: 0x6de9b820, 0x2f2c5: 0x6de9ba20, 0x2f2c6: 0x6de9bc20, 0x2f2c7: 0x6e204020, + 0x2f2c8: 0x6e33b020, 0x2f2c9: 0x6e33b220, 0x2f2ca: 0x6c143a20, 0x2f2cb: 0x6c3e2220, + 0x2f2cc: 0x6c3e2420, 0x2f2cd: 0x6c5cf620, 0x2f2ce: 0x6c5cf820, 0x2f2cf: 0x6c5cfa20, + 0x2f2d0: 0x6c812220, 0x2f2d1: 0x6c5cfc20, 0x2f2d2: 0x6c812a20, 0x2f2d3: 0x6c812c20, + 0x2f2d4: 0x6c812e20, 0x2f2d5: 0x6caa3220, 0x2f2d6: 0x6c813020, 0x2f2d7: 0x6c813220, + 0x2f2d8: 0x6c813420, 0x2f2d9: 0x6c813620, 0x2f2da: 0x6caa3420, 0x2f2db: 0x6caa3620, + 0x2f2dc: 0x6caa3820, 0x2f2dd: 0x6caa3a20, 0x2f2de: 0x6caa3c20, 0x2f2df: 0x6caa3e20, + 0x2f2e0: 0x6cd88820, 0x2f2e1: 0x6cd88a20, 0x2f2e2: 0x6cd88c20, 0x2f2e3: 0x6d074820, + 0x2f2e4: 0x6d074a20, 0x2f2e5: 0x6d074c20, 0x2f2e6: 0x6d074e20, 0x2f2e7: 0x6d075020, + 0x2f2e8: 0x6d075220, 0x2f2e9: 0x6d075420, 0x2f2ea: 0x6d075620, 0x2f2eb: 0x6d353820, + 0x2f2ec: 0x6d61cc20, 0x2f2ed: 0x6d61ce20, 0x2f2ee: 0x6d61d020, 0x2f2ef: 0x6d61d220, + 0x2f2f0: 0x6d61d420, 0x2f2f1: 0x6d8bf620, 0x2f2f2: 0x6d8bf820, 0x2f2f3: 0x6dcfac20, + 0x2f2f4: 0x6dcfae20, 0x2f2f5: 0x6dcfb020, 0x2f2f6: 0x6de9d620, 0x2f2f7: 0x6de9d820, + 0x2f2f8: 0x6de9da20, 0x2f2f9: 0x6de9dc20, 0x2f2fa: 0x6dffa220, 0x2f2fb: 0x6e121020, + 0x2f2fc: 0x6e121220, 0x2f2fd: 0x6c144220, 0x2f2fe: 0x6c5d0c20, 0x2f2ff: 0x6c5d0e20, + // Block 0xbcc, offset 0x2f300 + 0x2f300: 0x6c815a20, 0x2f301: 0x6c815c20, 0x2f302: 0x6c815e20, 0x2f303: 0x6c816020, + 0x2f304: 0x6c816220, 0x2f305: 0x6c816420, 0x2f306: 0x6c816620, 0x2f307: 0x6caa7c20, + 0x2f308: 0x6caa7e20, 0x2f309: 0x6caa8020, 0x2f30a: 0x6caa8220, 0x2f30b: 0x6caa8420, + 0x2f30c: 0x6caa8620, 0x2f30d: 0x6caa8820, 0x2f30e: 0x6caa8a20, 0x2f30f: 0x6caa8c20, + 0x2f310: 0x6caa8e20, 0x2f311: 0x6caa9020, 0x2f312: 0x6caa9220, 0x2f313: 0x6cd8b220, + 0x2f314: 0x6cd8b420, 0x2f315: 0x6cd8b620, 0x2f316: 0x6cd8b820, 0x2f317: 0x6cd8ba20, + 0x2f318: 0x6cd8bc20, 0x2f319: 0x6cd8be20, 0x2f31a: 0x6cd8c020, 0x2f31b: 0x6d078420, + 0x2f31c: 0x6d078620, 0x2f31d: 0x6d078820, 0x2f31e: 0x6d355a20, 0x2f31f: 0x6d355c20, + 0x2f320: 0x6d355e20, 0x2f321: 0x6d356020, 0x2f322: 0x6d356220, 0x2f323: 0x6d356420, + 0x2f324: 0x6d356620, 0x2f325: 0x6d358c20, 0x2f326: 0x6d61f620, 0x2f327: 0x6d61f820, + 0x2f328: 0x6d61fa20, 0x2f329: 0x6d61fc20, 0x2f32a: 0x6d61fe20, 0x2f32b: 0x6d620020, + 0x2f32c: 0x6d620220, 0x2f32d: 0x6d620420, 0x2f32e: 0x6d8c1020, 0x2f32f: 0x6d8c1220, + 0x2f330: 0x6d8c1420, 0x2f331: 0x6d8c1620, 0x2f332: 0x6db05020, 0x2f333: 0x6db05220, + 0x2f334: 0x6db05420, 0x2f335: 0x6db05620, 0x2f336: 0x6db05820, 0x2f337: 0x6dcfde20, + 0x2f338: 0x6dcfe020, 0x2f339: 0x6dcfe220, 0x2f33a: 0x6dcfe420, 0x2f33b: 0x6dcfe620, + 0x2f33c: 0x6db05a20, 0x2f33d: 0x6de9ec20, 0x2f33e: 0x6de9ee20, 0x2f33f: 0x6dffb420, + // Block 0xbcd, offset 0x2f340 + 0x2f340: 0x6dffb620, 0x2f341: 0x6c144420, 0x2f342: 0x6c050620, 0x2f343: 0x6c144620, + 0x2f344: 0x6c819020, 0x2f345: 0x6c3e3620, 0x2f346: 0x6c819220, 0x2f347: 0x6c5d3820, + 0x2f348: 0x6caab220, 0x2f349: 0x6caab420, 0x2f34a: 0x6c81a420, 0x2f34b: 0x6cd8f820, + 0x2f34c: 0x6c144820, 0x2f34d: 0x6c5d3e20, 0x2f34e: 0x6c5d4020, 0x2f34f: 0x6c5d4220, + 0x2f350: 0x6c5d4420, 0x2f351: 0x6c5d4620, 0x2f352: 0x6c144c20, 0x2f353: 0x6c3e3e20, + 0x2f354: 0x6c5d4a20, 0x2f355: 0x6c81aa20, 0x2f356: 0x6c81ac20, 0x2f357: 0x6c81ae20, + 0x2f358: 0x6c81b020, 0x2f359: 0x6c81b220, 0x2f35a: 0x6caabc20, 0x2f35b: 0x6caabe20, + 0x2f35c: 0x6caac020, 0x2f35d: 0x6caac220, 0x2f35e: 0x6caac420, 0x2f35f: 0x6caac620, + 0x2f360: 0x6cd8fe20, 0x2f361: 0x6d07b420, 0x2f362: 0x6d07b620, 0x2f363: 0x6d359e20, + 0x2f364: 0x6d35a020, 0x2f365: 0x6d35a220, 0x2f366: 0x6d625020, 0x2f367: 0x6d625220, + 0x2f368: 0x6d8c4a20, 0x2f369: 0x6d8c4c20, 0x2f36a: 0x6d8c4e20, 0x2f36b: 0x6db08420, + 0x2f36c: 0x6db08620, 0x2f36d: 0x6dd01220, 0x2f36e: 0x6dd01420, 0x2f36f: 0x6dffc420, + 0x2f370: 0x6e122e20, 0x2f371: 0x6e205820, 0x2f372: 0x6e205a20, 0x2f373: 0x6c145020, + 0x2f374: 0x6c25e620, 0x2f375: 0x6c3e4620, 0x2f376: 0x6c5d5220, 0x2f377: 0x6c5d5420, + 0x2f378: 0x6c81ba20, 0x2f379: 0x6c81bc20, 0x2f37a: 0x6c81be20, 0x2f37b: 0x6c81c020, + 0x2f37c: 0x6c81c220, 0x2f37d: 0x6c81c420, 0x2f37e: 0x6c81c620, 0x2f37f: 0x6c81c820, + // Block 0xbce, offset 0x2f380 + 0x2f380: 0x6c81ca20, 0x2f381: 0x6c81cc20, 0x2f382: 0x6c81ce20, 0x2f383: 0x6caad420, + 0x2f384: 0x6caad620, 0x2f385: 0x6caad820, 0x2f386: 0x6caada20, 0x2f387: 0x6caadc20, + 0x2f388: 0x6caade20, 0x2f389: 0x6caae020, 0x2f38a: 0x6caae220, 0x2f38b: 0x6caae420, + 0x2f38c: 0x6caae620, 0x2f38d: 0x6caae820, 0x2f38e: 0x6cd91020, 0x2f38f: 0x6cd91220, + 0x2f390: 0x6cd91420, 0x2f391: 0x6cd91620, 0x2f392: 0x6cd91820, 0x2f393: 0x6cd91a20, + 0x2f394: 0x6cd91c20, 0x2f395: 0x6d07c420, 0x2f396: 0x6d07c620, 0x2f397: 0x6d07c820, + 0x2f398: 0x6d07ca20, 0x2f399: 0x6d35c420, 0x2f39a: 0x6d35c620, 0x2f39b: 0x6d35c820, + 0x2f39c: 0x6d35ca20, 0x2f39d: 0x6d35cc20, 0x2f39e: 0x6d35ce20, 0x2f39f: 0x6d35d020, + 0x2f3a0: 0x6cd91e20, 0x2f3a1: 0x6d35d220, 0x2f3a2: 0x6d35d420, 0x2f3a3: 0x6d35d620, + 0x2f3a4: 0x6d626c20, 0x2f3a5: 0x6d626e20, 0x2f3a6: 0x6d627020, 0x2f3a7: 0x6d627220, + 0x2f3a8: 0x6d627420, 0x2f3a9: 0x6d627620, 0x2f3aa: 0x6d627820, 0x2f3ab: 0x6d627a20, + 0x2f3ac: 0x6d8c6820, 0x2f3ad: 0x6d8c6a20, 0x2f3ae: 0x6d8c9a20, 0x2f3af: 0x6db0a020, + 0x2f3b0: 0x6db0a220, 0x2f3b1: 0x6db0a420, 0x2f3b2: 0x6db0a620, 0x2f3b3: 0x6db0a820, + 0x2f3b4: 0x6db0cc20, 0x2f3b5: 0x6dd02c20, 0x2f3b6: 0x6dd02e20, 0x2f3b7: 0x6dd03020, + 0x2f3b8: 0x6dea0220, 0x2f3b9: 0x6dffc820, 0x2f3ba: 0x6dffca20, 0x2f3bb: 0x6dffcc20, + 0x2f3bc: 0x6dffce20, 0x2f3bd: 0x6e205e20, 0x2f3be: 0x6e206020, 0x2f3bf: 0x6c145220, + // Block 0xbcf, offset 0x2f3c0 + 0x2f3c0: 0x6c050820, 0x2f3c1: 0x6c81fa20, 0x2f3c2: 0x6c81fc20, 0x2f3c3: 0x6c3e5e20, + 0x2f3c4: 0x6d07fe20, 0x2f3c5: 0x6d080020, 0x2f3c6: 0x6d080220, 0x2f3c7: 0x6d360e20, + 0x2f3c8: 0x6d361020, 0x2f3c9: 0x6c145620, 0x2f3ca: 0x6c0a5420, 0x2f3cb: 0x6c145c20, + 0x2f3cc: 0x6c145e20, 0x2f3cd: 0x6c146020, 0x2f3ce: 0x6c146220, 0x2f3cf: 0x6c3e6020, + 0x2f3d0: 0x6c25ee20, 0x2f3d1: 0x6c25f020, 0x2f3d2: 0x6c25f220, 0x2f3d3: 0x6c25f420, + 0x2f3d4: 0x6c25f620, 0x2f3d5: 0x6c25f820, 0x2f3d6: 0x6c25fa20, 0x2f3d7: 0x6c25fc20, + 0x2f3d8: 0x6c25fe20, 0x2f3d9: 0x6c260020, 0x2f3da: 0x6c260220, 0x2f3db: 0x6c260420, + 0x2f3dc: 0x6c260620, 0x2f3dd: 0x6c260820, 0x2f3de: 0x6c260a20, 0x2f3df: 0x6c260c20, + 0x2f3e0: 0x6c260e20, 0x2f3e1: 0x6c3e7c20, 0x2f3e2: 0x6c3e7e20, 0x2f3e3: 0x6c3e8020, + 0x2f3e4: 0x6c3e8220, 0x2f3e5: 0x6c3e8420, 0x2f3e6: 0x6c3e8620, 0x2f3e7: 0x6c3e8820, + 0x2f3e8: 0x6c3e8a20, 0x2f3e9: 0x6c3e8c20, 0x2f3ea: 0x6c3e8e20, 0x2f3eb: 0x6c3e9020, + 0x2f3ec: 0x6c3e9220, 0x2f3ed: 0x6c3e9420, 0x2f3ee: 0x6c3e9620, 0x2f3ef: 0x6c3e9820, + 0x2f3f0: 0x6c3e9a20, 0x2f3f1: 0x6c3e9c20, 0x2f3f2: 0x6c3e9e20, 0x2f3f3: 0x6c3ea020, + 0x2f3f4: 0x6c3ea220, 0x2f3f5: 0x6c3ea420, 0x2f3f6: 0x6c3ea620, 0x2f3f7: 0x6c3ea820, + 0x2f3f8: 0x6c3eaa20, 0x2f3f9: 0x6c3eac20, 0x2f3fa: 0x6c3eae20, 0x2f3fb: 0x6c3eb020, + 0x2f3fc: 0x6c3eb220, 0x2f3fd: 0x6c3eb420, 0x2f3fe: 0x6c3eb620, 0x2f3ff: 0x6c3eb820, + // Block 0xbd0, offset 0x2f400 + 0x2f400: 0x6c3eba20, 0x2f401: 0x6c3ebc20, 0x2f402: 0x6c5d7220, 0x2f403: 0x6c5d7420, + 0x2f404: 0x6c5d7620, 0x2f405: 0x6c5d7820, 0x2f406: 0x6c5d7a20, 0x2f407: 0x6c5d7c20, + 0x2f408: 0x6c5d7e20, 0x2f409: 0x6c5d8020, 0x2f40a: 0x6c5d8220, 0x2f40b: 0x6c5d8420, + 0x2f40c: 0x6c5d8620, 0x2f40d: 0x6c5d8820, 0x2f40e: 0x6c5d8a20, 0x2f40f: 0x6c5d8c20, + 0x2f410: 0x6c5d8e20, 0x2f411: 0x6c5d9020, 0x2f412: 0x6c5d9220, 0x2f413: 0x6c5d9420, + 0x2f414: 0x6cd95220, 0x2f415: 0x6c5d9620, 0x2f416: 0x6c5d9820, 0x2f417: 0x6c5d9a20, + 0x2f418: 0x6c5d9c20, 0x2f419: 0x6c5d9e20, 0x2f41a: 0x6c5da020, 0x2f41b: 0x6c5da220, + 0x2f41c: 0x6c5da420, 0x2f41d: 0x6c5da620, 0x2f41e: 0x6c5da820, 0x2f41f: 0x6c5daa20, + 0x2f420: 0x6c5dac20, 0x2f421: 0x6c5dae20, 0x2f422: 0x6c5db020, 0x2f423: 0x6c5db220, + 0x2f424: 0x6c5db420, 0x2f425: 0x6c5db620, 0x2f426: 0x6c5db820, 0x2f427: 0x6c5dba20, + 0x2f428: 0x6c5dbc20, 0x2f429: 0x6c5dbe20, 0x2f42a: 0x6c5dc020, 0x2f42b: 0x6c5dc220, + 0x2f42c: 0x6cab1020, 0x2f42d: 0x6c821220, 0x2f42e: 0x6c821420, 0x2f42f: 0x6c821620, + 0x2f430: 0x6c821820, 0x2f431: 0x6c821a20, 0x2f432: 0x6c821c20, 0x2f433: 0x6c821e20, + 0x2f434: 0x6c822020, 0x2f435: 0x6c822220, 0x2f436: 0x6c822420, 0x2f437: 0x6c822620, + 0x2f438: 0x6c822820, 0x2f439: 0x6c822a20, 0x2f43a: 0x6c822c20, 0x2f43b: 0x6c822e20, + 0x2f43c: 0x6c823020, 0x2f43d: 0x6c823220, 0x2f43e: 0x6cd95420, 0x2f43f: 0x6c823420, + // Block 0xbd1, offset 0x2f440 + 0x2f440: 0x6c823620, 0x2f441: 0x6c823820, 0x2f442: 0x6c823a20, 0x2f443: 0x6c823c20, + 0x2f444: 0x6c823e20, 0x2f445: 0x6c824020, 0x2f446: 0x6c824220, 0x2f447: 0x6c824420, + 0x2f448: 0x6c824620, 0x2f449: 0x6c5dc420, 0x2f44a: 0x6c824820, 0x2f44b: 0x6c824a20, + 0x2f44c: 0x6c824c20, 0x2f44d: 0x6c824e20, 0x2f44e: 0x6c825020, 0x2f44f: 0x6c825220, + 0x2f450: 0x6c825420, 0x2f451: 0x6c825620, 0x2f452: 0x6c825820, 0x2f453: 0x6c825a20, + 0x2f454: 0x6cd95620, 0x2f455: 0x6cab2c20, 0x2f456: 0x6cab2e20, 0x2f457: 0x6cab3020, + 0x2f458: 0x6cab3220, 0x2f459: 0x6cab3420, 0x2f45a: 0x6cab3620, 0x2f45b: 0x6cab3820, + 0x2f45c: 0x6cab3a20, 0x2f45d: 0x6cab3c20, 0x2f45e: 0x6cab3e20, 0x2f45f: 0x6cab4020, + 0x2f460: 0x6cd95820, 0x2f461: 0x6cab4220, 0x2f462: 0x6cab4420, 0x2f463: 0x6cab4620, + 0x2f464: 0x6cab4820, 0x2f465: 0x6cab4a20, 0x2f466: 0x6cab4c20, 0x2f467: 0x6cab4e20, + 0x2f468: 0x6cab5020, 0x2f469: 0x6cab5220, 0x2f46a: 0x6cab5420, 0x2f46b: 0x6cab5620, + 0x2f46c: 0x6cab5820, 0x2f46d: 0x6cab5a20, 0x2f46e: 0x6cab5c20, 0x2f46f: 0x6cab5e20, + 0x2f470: 0x6cab6020, 0x2f471: 0x6cab6220, 0x2f472: 0x6cab6420, 0x2f473: 0x6cab6620, + 0x2f474: 0x6cab6820, 0x2f475: 0x6cab6a20, 0x2f476: 0x6cab6c20, 0x2f477: 0x6cab6e20, + 0x2f478: 0x6cab7020, 0x2f479: 0x6cd97e20, 0x2f47a: 0x6cd98020, 0x2f47b: 0x6cd98220, + 0x2f47c: 0x6cd98420, 0x2f47d: 0x6cd98620, 0x2f47e: 0x6cd98820, 0x2f47f: 0x6cd98a20, + // Block 0xbd2, offset 0x2f480 + 0x2f480: 0x6cd98c20, 0x2f481: 0x6cd98e20, 0x2f482: 0x6cd99020, 0x2f483: 0x6cd99220, + 0x2f484: 0x6cd99420, 0x2f485: 0x6cd99620, 0x2f486: 0x6cd99820, 0x2f487: 0x6cd99a20, + 0x2f488: 0x6cd99c20, 0x2f489: 0x6cd99e20, 0x2f48a: 0x6cd9a020, 0x2f48b: 0x6cd9a220, + 0x2f48c: 0x6cd9a420, 0x2f48d: 0x6cd9a620, 0x2f48e: 0x6cd9a820, 0x2f48f: 0x6cd9aa20, + 0x2f490: 0x6d361a20, 0x2f491: 0x6cd9ac20, 0x2f492: 0x6cd9ae20, 0x2f493: 0x6cd9b020, + 0x2f494: 0x6cd9b220, 0x2f495: 0x6cd9b420, 0x2f496: 0x6cd9b620, 0x2f497: 0x6cd9b820, + 0x2f498: 0x6cd9ba20, 0x2f499: 0x6cd9bc20, 0x2f49a: 0x6cd9be20, 0x2f49b: 0x6d082a20, + 0x2f49c: 0x6d082c20, 0x2f49d: 0x6d082e20, 0x2f49e: 0x6d083020, 0x2f49f: 0x6d083220, + 0x2f4a0: 0x6d083420, 0x2f4a1: 0x6d083620, 0x2f4a2: 0x6d083820, 0x2f4a3: 0x6d083a20, + 0x2f4a4: 0x6d083c20, 0x2f4a5: 0x6d083e20, 0x2f4a6: 0x6d084020, 0x2f4a7: 0x6d084220, + 0x2f4a8: 0x6d084420, 0x2f4a9: 0x6d084620, 0x2f4aa: 0x6d084820, 0x2f4ab: 0x6d084a20, + 0x2f4ac: 0x6d084c20, 0x2f4ad: 0x6d084e20, 0x2f4ae: 0x6d085020, 0x2f4af: 0x6d085220, + 0x2f4b0: 0x6d085420, 0x2f4b1: 0x6d085620, 0x2f4b2: 0x6d085820, 0x2f4b3: 0x6d085a20, + 0x2f4b4: 0x6cda6e20, 0x2f4b5: 0x6d085c20, 0x2f4b6: 0x6d085e20, 0x2f4b7: 0x6d086020, + 0x2f4b8: 0x6d086220, 0x2f4b9: 0x6d086420, 0x2f4ba: 0x6d086620, 0x2f4bb: 0x6d086820, + 0x2f4bc: 0x6d086a20, 0x2f4bd: 0x6d086c20, 0x2f4be: 0x6d086e20, 0x2f4bf: 0x6d363820, + // Block 0xbd3, offset 0x2f4c0 + 0x2f4c0: 0x6d363a20, 0x2f4c1: 0x6d363c20, 0x2f4c2: 0x6d363e20, 0x2f4c3: 0x6d364020, + 0x2f4c4: 0x6d364220, 0x2f4c5: 0x6d364420, 0x2f4c6: 0x6d364620, 0x2f4c7: 0x6d364820, + 0x2f4c8: 0x6d364a20, 0x2f4c9: 0x6d364c20, 0x2f4ca: 0x6d364e20, 0x2f4cb: 0x6d365020, + 0x2f4cc: 0x6d365220, 0x2f4cd: 0x6d365420, 0x2f4ce: 0x6d365620, 0x2f4cf: 0x6d365820, + 0x2f4d0: 0x6d8ca020, 0x2f4d1: 0x6d365a20, 0x2f4d2: 0x6d62d020, 0x2f4d3: 0x6d62d220, + 0x2f4d4: 0x6d62d420, 0x2f4d5: 0x6d62d620, 0x2f4d6: 0x6d62d820, 0x2f4d7: 0x6d62da20, + 0x2f4d8: 0x6d62dc20, 0x2f4d9: 0x6d62de20, 0x2f4da: 0x6d62e020, 0x2f4db: 0x6d62e220, + 0x2f4dc: 0x6d62e420, 0x2f4dd: 0x6d62e620, 0x2f4de: 0x6d62e820, 0x2f4df: 0x6d62ea20, + 0x2f4e0: 0x6d62ec20, 0x2f4e1: 0x6d62ee20, 0x2f4e2: 0x6d62f020, 0x2f4e3: 0x6d62f220, + 0x2f4e4: 0x6d538620, 0x2f4e5: 0x6db0d420, 0x2f4e6: 0x6d8cb420, 0x2f4e7: 0x6d8cb620, + 0x2f4e8: 0x6d8cb820, 0x2f4e9: 0x6d8cba20, 0x2f4ea: 0x6d8cbc20, 0x2f4eb: 0x6d8cbe20, + 0x2f4ec: 0x6d8cc020, 0x2f4ed: 0x6d8cc220, 0x2f4ee: 0x6d8cc420, 0x2f4ef: 0x6d8cc620, + 0x2f4f0: 0x6d8cc820, 0x2f4f1: 0x6d8cca20, 0x2f4f2: 0x6d8ccc20, 0x2f4f3: 0x6d8cce20, + 0x2f4f4: 0x6d8cd020, 0x2f4f5: 0x6d8cd220, 0x2f4f6: 0x6d8cd420, 0x2f4f7: 0x6d8d5820, + 0x2f4f8: 0x6db0de20, 0x2f4f9: 0x6d8d5a20, 0x2f4fa: 0x6db0e020, 0x2f4fb: 0x6db0e220, + 0x2f4fc: 0x6db0e420, 0x2f4fd: 0x6db0e620, 0x2f4fe: 0x6db0e820, 0x2f4ff: 0x6db0ea20, + // Block 0xbd4, offset 0x2f500 + 0x2f500: 0x6db0ec20, 0x2f501: 0x6db0ee20, 0x2f502: 0x6db0f020, 0x2f503: 0x6db0f220, + 0x2f504: 0x6db0f420, 0x2f505: 0x6db0f620, 0x2f506: 0x6db0f820, 0x2f507: 0x6db0fa20, + 0x2f508: 0x6db0fc20, 0x2f509: 0x6db0fe20, 0x2f50a: 0x6db10020, 0x2f50b: 0x6dea1e20, + 0x2f50c: 0x6db10220, 0x2f50d: 0x6dd06620, 0x2f50e: 0x6dd06820, 0x2f50f: 0x6dd06a20, + 0x2f510: 0x6dd06c20, 0x2f511: 0x6dd06e20, 0x2f512: 0x6dd07020, 0x2f513: 0x6dd07220, + 0x2f514: 0x6dea2620, 0x2f515: 0x6dea2820, 0x2f516: 0x6dffe420, 0x2f517: 0x6dea2a20, + 0x2f518: 0x6dea2c20, 0x2f519: 0x6dffe620, 0x2f51a: 0x6dffe820, 0x2f51b: 0x6dffea20, + 0x2f51c: 0x6dffec20, 0x2f51d: 0x6e124820, 0x2f51e: 0x6e206a20, 0x2f51f: 0x6e206c20, + 0x2f520: 0x6e39ae20, 0x2f521: 0x6e39b020, 0x2f522: 0x6e2b4820, 0x2f523: 0x6c147a20, + 0x2f524: 0x6c3f1a20, 0x2f525: 0x6c3f1c20, 0x2f526: 0x6cda7020, 0x2f527: 0x6d36e420, + 0x2f528: 0x6db16420, 0x2f529: 0x6db16620, 0x2f52a: 0x6c147e20, 0x2f52b: 0x6c262820, + 0x2f52c: 0x6c82dc20, 0x2f52d: 0x6c82de20, 0x2f52e: 0x6cda7c20, 0x2f52f: 0x6cda7e20, + 0x2f530: 0x6cda8020, 0x2f531: 0x6d635a20, 0x2f532: 0x6d8d5e20, 0x2f533: 0x6c148220, + 0x2f534: 0x6c5e4220, 0x2f535: 0x6cda8c20, 0x2f536: 0x6cda8e20, 0x2f537: 0x6cda9020, + 0x2f538: 0x6cda9220, 0x2f539: 0x6cda9820, 0x2f53a: 0x6d36f420, 0x2f53b: 0x6d8d6620, + 0x2f53c: 0x6c148820, 0x2f53d: 0x6c3f2220, 0x2f53e: 0x6c3f2420, 0x2f53f: 0x6c5e4a20, + // Block 0xbd5, offset 0x2f540 + 0x2f540: 0x6c82fc20, 0x2f541: 0x6c82fe20, 0x2f542: 0x6cabf420, 0x2f543: 0x6cda9a20, + 0x2f544: 0x6cda9c20, 0x2f545: 0x6d090220, 0x2f546: 0x6d8d7620, 0x2f547: 0x6d370220, + 0x2f548: 0x6d8d7220, 0x2f549: 0x6d8d7820, 0x2f54a: 0x6dd0c020, 0x2f54b: 0x6dea7220, + 0x2f54c: 0x6c149020, 0x2f54d: 0x6c3f2c20, 0x2f54e: 0x6c3f2e20, 0x2f54f: 0x6c3f3020, + 0x2f550: 0x6c831420, 0x2f551: 0x6cac0620, 0x2f552: 0x6cdaac20, 0x2f553: 0x6d371820, + 0x2f554: 0x6d371a20, 0x2f555: 0x6d371c20, 0x2f556: 0x6d638820, 0x2f557: 0x6d638a20, + 0x2f558: 0x6d8d8a20, 0x2f559: 0x6dd0d220, 0x2f55a: 0x6dea8020, 0x2f55b: 0x6c149220, + 0x2f55c: 0x6cdabe20, 0x2f55d: 0x6d091c20, 0x2f55e: 0x6d373020, 0x2f55f: 0x6c149420, + 0x2f560: 0x6c3f3620, 0x2f561: 0x6c5e6020, 0x2f562: 0x6c5e6220, 0x2f563: 0x6c5e6420, + 0x2f564: 0x6c5e6620, 0x2f565: 0x6c832c20, 0x2f566: 0x6c832e20, 0x2f567: 0x6c833020, + 0x2f568: 0x6c833220, 0x2f569: 0x6c833420, 0x2f56a: 0x6c833620, 0x2f56b: 0x6c833820, + 0x2f56c: 0x6c833a20, 0x2f56d: 0x6c833c20, 0x2f56e: 0x6c833e20, 0x2f56f: 0x6c834020, + 0x2f570: 0x6c834220, 0x2f571: 0x6c834420, 0x2f572: 0x6cac1820, 0x2f573: 0x6cac1a20, + 0x2f574: 0x6cac1c20, 0x2f575: 0x6cac1e20, 0x2f576: 0x6cac2020, 0x2f577: 0x6cac2220, + 0x2f578: 0x6cac2420, 0x2f579: 0x6cac2620, 0x2f57a: 0x6cac2820, 0x2f57b: 0x6cac2a20, + 0x2f57c: 0x6cdaca20, 0x2f57d: 0x6cdacc20, 0x2f57e: 0x6cdace20, 0x2f57f: 0x6cdad020, + // Block 0xbd6, offset 0x2f580 + 0x2f580: 0x6d092220, 0x2f581: 0x6d092420, 0x2f582: 0x6d092620, 0x2f583: 0x6d092820, + 0x2f584: 0x6d092a20, 0x2f585: 0x6d092c20, 0x2f586: 0x6d092e20, 0x2f587: 0x6d093020, + 0x2f588: 0x6d093220, 0x2f589: 0x6d093420, 0x2f58a: 0x6d374220, 0x2f58b: 0x6d374420, + 0x2f58c: 0x6d374620, 0x2f58d: 0x6d374820, 0x2f58e: 0x6d63a220, 0x2f58f: 0x6d63a420, + 0x2f590: 0x6d63a620, 0x2f591: 0x6d63a820, 0x2f592: 0x6d63aa20, 0x2f593: 0x6d63ac20, + 0x2f594: 0x6d63ae20, 0x2f595: 0x6d8d9e20, 0x2f596: 0x6d8da020, 0x2f597: 0x6d8da220, + 0x2f598: 0x6d8da420, 0x2f599: 0x6d8da620, 0x2f59a: 0x6db19c20, 0x2f59b: 0x6db19e20, + 0x2f59c: 0x6db1a020, 0x2f59d: 0x6db1a220, 0x2f59e: 0x6dd0e220, 0x2f59f: 0x6dd0e420, + 0x2f5a0: 0x6dd0e620, 0x2f5a1: 0x6dea8620, 0x2f5a2: 0x6dea8820, 0x2f5a3: 0x6dea8a20, + 0x2f5a4: 0x6dea8c20, 0x2f5a5: 0x6dea8e20, 0x2f5a6: 0x6e003620, 0x2f5a7: 0x6e003820, + 0x2f5a8: 0x6e003a20, 0x2f5a9: 0x6e003c20, 0x2f5aa: 0x6e126c20, 0x2f5ab: 0x6e208820, + 0x2f5ac: 0x6e2b6e20, 0x2f5ad: 0x6e33e220, 0x2f5ae: 0x6c149820, 0x2f5af: 0x6c263620, + 0x2f5b0: 0x6c3f4420, 0x2f5b1: 0x6db1bc20, 0x2f5b2: 0x6c149a20, 0x2f5b3: 0x6c835e20, + 0x2f5b4: 0x6cac4e20, 0x2f5b5: 0x6cdaf020, 0x2f5b6: 0x6deaa220, 0x2f5b7: 0x6e33e420, + 0x2f5b8: 0x6c149e20, 0x2f5b9: 0x6c020420, 0x2f5ba: 0x6c0a5620, 0x2f5bb: 0x6c14a020, + 0x2f5bc: 0x6c14a220, 0x2f5bd: 0x6c14a420, 0x2f5be: 0x6c14a620, 0x2f5bf: 0x6c14a820, + // Block 0xbd7, offset 0x2f5c0 + 0x2f5c0: 0x6c14aa20, 0x2f5c1: 0x6c14ac20, 0x2f5c2: 0x6c14ae20, 0x2f5c3: 0x6c263820, + 0x2f5c4: 0x6c263a20, 0x2f5c5: 0x6c263c20, 0x2f5c6: 0x6c263e20, 0x2f5c7: 0x6c264020, + 0x2f5c8: 0x6c264220, 0x2f5c9: 0x6c264420, 0x2f5ca: 0x6c264620, 0x2f5cb: 0x6c264820, + 0x2f5cc: 0x6c264a20, 0x2f5cd: 0x6c264c20, 0x2f5ce: 0x6c264e20, 0x2f5cf: 0x6c265020, + 0x2f5d0: 0x6c265220, 0x2f5d1: 0x6c265420, 0x2f5d2: 0x6c265620, 0x2f5d3: 0x6c265820, + 0x2f5d4: 0x6c5e8820, 0x2f5d5: 0x6c265a20, 0x2f5d6: 0x6c265c20, 0x2f5d7: 0x6c265e20, + 0x2f5d8: 0x6c3f4c20, 0x2f5d9: 0x6c3f4e20, 0x2f5da: 0x6c3f5020, 0x2f5db: 0x6c3f5220, + 0x2f5dc: 0x6c3f5420, 0x2f5dd: 0x6c3f5620, 0x2f5de: 0x6c3f5820, 0x2f5df: 0x6c3f5a20, + 0x2f5e0: 0x6c3f5c20, 0x2f5e1: 0x6c3f5e20, 0x2f5e2: 0x6c3f6020, 0x2f5e3: 0x6c3f6220, + 0x2f5e4: 0x6c3f6420, 0x2f5e5: 0x6c3f6620, 0x2f5e6: 0x6c3f6820, 0x2f5e7: 0x6c3f6a20, + 0x2f5e8: 0x6c3f6c20, 0x2f5e9: 0x6c3f6e20, 0x2f5ea: 0x6c3f7020, 0x2f5eb: 0x6c3f7220, + 0x2f5ec: 0x6c3f7420, 0x2f5ed: 0x6c3f7620, 0x2f5ee: 0x6c3f7820, 0x2f5ef: 0x6c3f7a20, + 0x2f5f0: 0x6c3f7c20, 0x2f5f1: 0x6c3f7e20, 0x2f5f2: 0x6c3f8020, 0x2f5f3: 0x6c3f8220, + 0x2f5f4: 0x6c3f8420, 0x2f5f5: 0x6c3f8620, 0x2f5f6: 0x6c3f8820, 0x2f5f7: 0x6c3f8a20, + 0x2f5f8: 0x6c3f8c20, 0x2f5f9: 0x6c3f8e20, 0x2f5fa: 0x6c3f9020, 0x2f5fb: 0x6c837820, + 0x2f5fc: 0x6c3f9220, 0x2f5fd: 0x6c3f9420, 0x2f5fe: 0x6c3f9620, 0x2f5ff: 0x6c400c20, + // Block 0xbd8, offset 0x2f600 + 0x2f600: 0x6c3f9820, 0x2f601: 0x6c3f9a20, 0x2f602: 0x6c3f9c20, 0x2f603: 0x6c3f9e20, + 0x2f604: 0x6c3fa020, 0x2f605: 0x6c3fa220, 0x2f606: 0x6c3fa420, 0x2f607: 0x6c3fa620, + 0x2f608: 0x6c3fa820, 0x2f609: 0x6c3faa20, 0x2f60a: 0x6c3fac20, 0x2f60b: 0x6c3fae20, + 0x2f60c: 0x6c3fb020, 0x2f60d: 0x6c3fb220, 0x2f60e: 0x6c3fb420, 0x2f60f: 0x6c3fb620, + 0x2f610: 0x6c5e8a20, 0x2f611: 0x6c5e8c20, 0x2f612: 0x6c5e8e20, 0x2f613: 0x6c5e9020, + 0x2f614: 0x6c5e9220, 0x2f615: 0x6c5e9420, 0x2f616: 0x6c5e9620, 0x2f617: 0x6c5e9820, + 0x2f618: 0x6c5e9a20, 0x2f619: 0x6c5e9c20, 0x2f61a: 0x6c5e9e20, 0x2f61b: 0x6c5ea020, + 0x2f61c: 0x6c5ea220, 0x2f61d: 0x6c5ea420, 0x2f61e: 0x6c5ea620, 0x2f61f: 0x6c5ea820, + 0x2f620: 0x6c5eaa20, 0x2f621: 0x6c5eac20, 0x2f622: 0x6c5eae20, 0x2f623: 0x6c5eb020, + 0x2f624: 0x6c5eb220, 0x2f625: 0x6c5eb420, 0x2f626: 0x6c5eb620, 0x2f627: 0x6c5eb820, + 0x2f628: 0x6c5eba20, 0x2f629: 0x6c5ebc20, 0x2f62a: 0x6c5ebe20, 0x2f62b: 0x6c5ec020, + 0x2f62c: 0x6c5ec220, 0x2f62d: 0x6c5ec420, 0x2f62e: 0x6c5ec620, 0x2f62f: 0x6c5ec820, + 0x2f630: 0x6c5eca20, 0x2f631: 0x6c5ecc20, 0x2f632: 0x6c5ece20, 0x2f633: 0x6c5ed020, + 0x2f634: 0x6c5ed220, 0x2f635: 0x6c5ed420, 0x2f636: 0x6c5ed620, 0x2f637: 0x6c5ed820, + 0x2f638: 0x6c5eda20, 0x2f639: 0x6c5edc20, 0x2f63a: 0x6c5ede20, 0x2f63b: 0x6c5ee020, + 0x2f63c: 0x6c5ee220, 0x2f63d: 0x6c5ee420, 0x2f63e: 0x6c5ee620, 0x2f63f: 0x6c5ee820, + // Block 0xbd9, offset 0x2f640 + 0x2f640: 0x6c5eea20, 0x2f641: 0x6c5eec20, 0x2f642: 0x6c5eee20, 0x2f643: 0x6c5ef020, + 0x2f644: 0x6c5ef220, 0x2f645: 0x6c5ef420, 0x2f646: 0x6c5ef620, 0x2f647: 0x6c5ef820, + 0x2f648: 0x6c837a20, 0x2f649: 0x6c5efa20, 0x2f64a: 0x6c5efc20, 0x2f64b: 0x6c5efe20, + 0x2f64c: 0x6c5f0020, 0x2f64d: 0x6c5f0220, 0x2f64e: 0x6c5f0420, 0x2f64f: 0x6c5f0620, + 0x2f650: 0x6c5f0820, 0x2f651: 0x6c5f0a20, 0x2f652: 0x6cdb1620, 0x2f653: 0x6c5f0c20, + 0x2f654: 0x6c5f0e20, 0x2f655: 0x6c5f1020, 0x2f656: 0x6c837c20, 0x2f657: 0x6c837e20, + 0x2f658: 0x6c838020, 0x2f659: 0x6c838220, 0x2f65a: 0x6c838420, 0x2f65b: 0x6c838620, + 0x2f65c: 0x6c838820, 0x2f65d: 0x6cac7420, 0x2f65e: 0x6c838a20, 0x2f65f: 0x6c838c20, + 0x2f660: 0x6c838e20, 0x2f661: 0x6c839020, 0x2f662: 0x6c839220, 0x2f663: 0x6cac7620, + 0x2f664: 0x6c839420, 0x2f665: 0x6c839620, 0x2f666: 0x6c839820, 0x2f667: 0x6c839a20, + 0x2f668: 0x6c839c20, 0x2f669: 0x6c839e20, 0x2f66a: 0x6c83a020, 0x2f66b: 0x6c83a220, + 0x2f66c: 0x6c83a420, 0x2f66d: 0x6c83a620, 0x2f66e: 0x6c83a820, 0x2f66f: 0x6c83aa20, + 0x2f670: 0x6c83ac20, 0x2f671: 0x6c83ae20, 0x2f672: 0x6c83b020, 0x2f673: 0x6c83b220, + 0x2f674: 0x6c83b420, 0x2f675: 0x6c83b620, 0x2f676: 0x6c83b820, 0x2f677: 0x6c83ba20, + 0x2f678: 0x6c83bc20, 0x2f679: 0x6c83be20, 0x2f67a: 0x6c5f9220, 0x2f67b: 0x6cdb1820, + 0x2f67c: 0x6c83c020, 0x2f67d: 0x6c83c220, 0x2f67e: 0x6c3fb820, 0x2f67f: 0x6c83c420, + // Block 0xbda, offset 0x2f680 + 0x2f680: 0x6c83c620, 0x2f681: 0x6c83c820, 0x2f682: 0x6c83ca20, 0x2f683: 0x6c83cc20, + 0x2f684: 0x6c83ce20, 0x2f685: 0x6c83d020, 0x2f686: 0x6cdb1a20, 0x2f687: 0x6c83d220, + 0x2f688: 0x6c83d420, 0x2f689: 0x6c83d620, 0x2f68a: 0x6c83d820, 0x2f68b: 0x6c83da20, + 0x2f68c: 0x6c83dc20, 0x2f68d: 0x6c83de20, 0x2f68e: 0x6c83e020, 0x2f68f: 0x6c83e220, + 0x2f690: 0x6c83e420, 0x2f691: 0x6c83e620, 0x2f692: 0x6c83e820, 0x2f693: 0x6c84c420, + 0x2f694: 0x6c83ea20, 0x2f695: 0x6c83ec20, 0x2f696: 0x6c83ee20, 0x2f697: 0x6c83f020, + 0x2f698: 0x6c83f220, 0x2f699: 0x6cac7020, 0x2f69a: 0x6c83f420, 0x2f69b: 0x6c83f620, + 0x2f69c: 0x6c83f820, 0x2f69d: 0x6c83fa20, 0x2f69e: 0x6c83fc20, 0x2f69f: 0x6c83fe20, + 0x2f6a0: 0x6c840020, 0x2f6a1: 0x6c840220, 0x2f6a2: 0x6c840420, 0x2f6a3: 0x6c840620, + 0x2f6a4: 0x6c840820, 0x2f6a5: 0x6c840a20, 0x2f6a6: 0x6c840c20, 0x2f6a7: 0x6c840e20, + 0x2f6a8: 0x6c841020, 0x2f6a9: 0x6c841220, 0x2f6aa: 0x6c841420, 0x2f6ab: 0x6cac7220, + 0x2f6ac: 0x6c841620, 0x2f6ad: 0x6c841820, 0x2f6ae: 0x6c841a20, 0x2f6af: 0x6c841c20, + 0x2f6b0: 0x6cac7820, 0x2f6b1: 0x6cac7a20, 0x2f6b2: 0x6cac7c20, 0x2f6b3: 0x6cac7e20, + 0x2f6b4: 0x6cac8020, 0x2f6b5: 0x6cac8220, 0x2f6b6: 0x6cac8420, 0x2f6b7: 0x6cac8620, + 0x2f6b8: 0x6cac8820, 0x2f6b9: 0x6cac8a20, 0x2f6ba: 0x6cac8c20, 0x2f6bb: 0x6cac8e20, + 0x2f6bc: 0x6cac9020, 0x2f6bd: 0x6cac9220, 0x2f6be: 0x6cac9420, 0x2f6bf: 0x6cac9620, + // Block 0xbdb, offset 0x2f6c0 + 0x2f6c0: 0x6cac9820, 0x2f6c1: 0x6cac9a20, 0x2f6c2: 0x6cac9c20, 0x2f6c3: 0x6cac9e20, + 0x2f6c4: 0x6caca020, 0x2f6c5: 0x6caca220, 0x2f6c6: 0x6caca420, 0x2f6c7: 0x6caca620, + 0x2f6c8: 0x6caca820, 0x2f6c9: 0x6cacaa20, 0x2f6ca: 0x6cacac20, 0x2f6cb: 0x6cacae20, + 0x2f6cc: 0x6cacb020, 0x2f6cd: 0x6cacb220, 0x2f6ce: 0x6cacb420, 0x2f6cf: 0x6cacb620, + 0x2f6d0: 0x6cacb820, 0x2f6d1: 0x6cacba20, 0x2f6d2: 0x6cacbc20, 0x2f6d3: 0x6cacbe20, + 0x2f6d4: 0x6cacc020, 0x2f6d5: 0x6cacc220, 0x2f6d6: 0x6cacc420, 0x2f6d7: 0x6cacc620, + 0x2f6d8: 0x6cacc820, 0x2f6d9: 0x6cacca20, 0x2f6da: 0x6cdb1c20, 0x2f6db: 0x6caccc20, + 0x2f6dc: 0x6cacce20, 0x2f6dd: 0x6cacd020, 0x2f6de: 0x6cacd220, 0x2f6df: 0x6cacd420, + 0x2f6e0: 0x6cacd620, 0x2f6e1: 0x6cacd820, 0x2f6e2: 0x6cacda20, 0x2f6e3: 0x6cacdc20, + 0x2f6e4: 0x6cacde20, 0x2f6e5: 0x6cace020, 0x2f6e6: 0x6cace220, 0x2f6e7: 0x6cace420, + 0x2f6e8: 0x6cace620, 0x2f6e9: 0x6cace820, 0x2f6ea: 0x6cacea20, 0x2f6eb: 0x6cacec20, + 0x2f6ec: 0x6cacee20, 0x2f6ed: 0x6cae1e20, 0x2f6ee: 0x6cacf020, 0x2f6ef: 0x6cacf220, + 0x2f6f0: 0x6cacf420, 0x2f6f1: 0x6cacf620, 0x2f6f2: 0x6cacf820, 0x2f6f3: 0x6cacfa20, + 0x2f6f4: 0x6cacfc20, 0x2f6f5: 0x6cacfe20, 0x2f6f6: 0x6cad0020, 0x2f6f7: 0x6cad0220, + 0x2f6f8: 0x6cad0420, 0x2f6f9: 0x6cad0620, 0x2f6fa: 0x6cad0820, 0x2f6fb: 0x6d098220, + 0x2f6fc: 0x6cad0a20, 0x2f6fd: 0x6cad0c20, 0x2f6fe: 0x6cdb1e20, 0x2f6ff: 0x6cdb2020, + // Block 0xbdc, offset 0x2f700 + 0x2f700: 0x6cdb2220, 0x2f701: 0x6cdb2420, 0x2f702: 0x6cdb2620, 0x2f703: 0x6cdb2820, + 0x2f704: 0x6cdb2a20, 0x2f705: 0x6cdb2c20, 0x2f706: 0x6cdb2e20, 0x2f707: 0x6cdb3020, + 0x2f708: 0x6cdb3220, 0x2f709: 0x6cdb3420, 0x2f70a: 0x6cdb3620, 0x2f70b: 0x6cdb3820, + 0x2f70c: 0x6cdb3a20, 0x2f70d: 0x6cdb3c20, 0x2f70e: 0x6cdb3e20, 0x2f70f: 0x6cdb4020, + 0x2f710: 0x6cdb4220, 0x2f711: 0x6cdb4420, 0x2f712: 0x6cdb4620, 0x2f713: 0x6cdb4820, + 0x2f714: 0x6cdb4a20, 0x2f715: 0x6cdb4c20, 0x2f716: 0x6cdb4e20, 0x2f717: 0x6cdb5020, + 0x2f718: 0x6cdb5220, 0x2f719: 0x6d098420, 0x2f71a: 0x6cdb5420, 0x2f71b: 0x6cdb5620, + 0x2f71c: 0x6cdb5820, 0x2f71d: 0x6cdb5a20, 0x2f71e: 0x6cdb5c20, 0x2f71f: 0x6cdb5e20, + 0x2f720: 0x6cdb6020, 0x2f721: 0x6cdb6220, 0x2f722: 0x6cdb6420, 0x2f723: 0x6cdb6620, + 0x2f724: 0x6cdb6820, 0x2f725: 0x6cdb6a20, 0x2f726: 0x6cdb6c20, 0x2f727: 0x6cdb6e20, + 0x2f728: 0x6cdb7020, 0x2f729: 0x6cdb7220, 0x2f72a: 0x6cdb7420, 0x2f72b: 0x6cdb7620, + 0x2f72c: 0x6cdb7820, 0x2f72d: 0x6cdb7a20, 0x2f72e: 0x6cdb7c20, 0x2f72f: 0x6cdb7e20, + 0x2f730: 0x6cdb8020, 0x2f731: 0x6cdb8220, 0x2f732: 0x6cdb8420, 0x2f733: 0x6cdb8620, + 0x2f734: 0x6cdb8820, 0x2f735: 0x6cdb8a20, 0x2f736: 0x6cdb8c20, 0x2f737: 0x6cdb8e20, + 0x2f738: 0x6cdb9020, 0x2f739: 0x6cdb9220, 0x2f73a: 0x6cdb9420, 0x2f73b: 0x6cdb9620, + 0x2f73c: 0x6cdb9820, 0x2f73d: 0x6cdb9a20, 0x2f73e: 0x6cdb9c20, 0x2f73f: 0x6cdb9e20, + // Block 0xbdd, offset 0x2f740 + 0x2f740: 0x6cdba020, 0x2f741: 0x6cdba220, 0x2f742: 0x6cdba420, 0x2f743: 0x6cdba620, + 0x2f744: 0x6cdba820, 0x2f745: 0x6cdbaa20, 0x2f746: 0x6cdbac20, 0x2f747: 0x6cdbae20, + 0x2f748: 0x6cdbb020, 0x2f749: 0x6cdbb220, 0x2f74a: 0x6cdbb420, 0x2f74b: 0x6cdbb620, + 0x2f74c: 0x6cdbb820, 0x2f74d: 0x6cdbba20, 0x2f74e: 0x6cdbbc20, 0x2f74f: 0x6cdbbe20, + 0x2f750: 0x6cdbc020, 0x2f751: 0x6cdbc220, 0x2f752: 0x6cdbc420, 0x2f753: 0x6cdbc620, + 0x2f754: 0x6cdbc820, 0x2f755: 0x6cdbca20, 0x2f756: 0x6cdbcc20, 0x2f757: 0x6cdbce20, + 0x2f758: 0x6cdbd020, 0x2f759: 0x6cdbd220, 0x2f75a: 0x6cdbd420, 0x2f75b: 0x6cdbd620, + 0x2f75c: 0x6cdbd820, 0x2f75d: 0x6cdbda20, 0x2f75e: 0x6cdbdc20, 0x2f75f: 0x6cdbde20, + 0x2f760: 0x6cdbe020, 0x2f761: 0x6cdbe220, 0x2f762: 0x6cdbe420, 0x2f763: 0x6cdbe620, + 0x2f764: 0x6cdbe820, 0x2f765: 0x6d098620, 0x2f766: 0x6cdbea20, 0x2f767: 0x6cdbec20, + 0x2f768: 0x6d098820, 0x2f769: 0x6d098a20, 0x2f76a: 0x6d098c20, 0x2f76b: 0x6d098e20, + 0x2f76c: 0x6d037820, 0x2f76d: 0x6d099020, 0x2f76e: 0x6d099220, 0x2f76f: 0x6d099420, + 0x2f770: 0x6d099620, 0x2f771: 0x6d099820, 0x2f772: 0x6d099a20, 0x2f773: 0x6d099c20, + 0x2f774: 0x6d099e20, 0x2f775: 0x6d09a020, 0x2f776: 0x6d09a220, 0x2f777: 0x6d09a420, + 0x2f778: 0x6cdd4420, 0x2f779: 0x6d09a620, 0x2f77a: 0x6d09a820, 0x2f77b: 0x6d09aa20, + 0x2f77c: 0x6d09ac20, 0x2f77d: 0x6d09ae20, 0x2f77e: 0x6d09b020, 0x2f77f: 0x6d09b220, + // Block 0xbde, offset 0x2f780 + 0x2f780: 0x6d09b420, 0x2f781: 0x6d09b620, 0x2f782: 0x6d09b820, 0x2f783: 0x6d09ba20, + 0x2f784: 0x6d09bc20, 0x2f785: 0x6d09be20, 0x2f786: 0x6d09c020, 0x2f787: 0x6d09c220, + 0x2f788: 0x6d09c420, 0x2f789: 0x6d09c620, 0x2f78a: 0x6d09c820, 0x2f78b: 0x6d09ca20, + 0x2f78c: 0x6d09cc20, 0x2f78d: 0x6d09ce20, 0x2f78e: 0x6d09d020, 0x2f78f: 0x6d09d220, + 0x2f790: 0x6d09d420, 0x2f791: 0x6d09d620, 0x2f792: 0x6d09d820, 0x2f793: 0x6d09da20, + 0x2f794: 0x6d09dc20, 0x2f795: 0x6d09de20, 0x2f796: 0x6d09e020, 0x2f797: 0x6cdbee20, + 0x2f798: 0x6d09e220, 0x2f799: 0x6d09e420, 0x2f79a: 0x6d09e620, 0x2f79b: 0x6d09e820, + 0x2f79c: 0x6d09ea20, 0x2f79d: 0x6d09ec20, 0x2f79e: 0x6d09ee20, 0x2f79f: 0x6d09f020, + 0x2f7a0: 0x6d09f220, 0x2f7a1: 0x6d09f420, 0x2f7a2: 0x6d09f620, 0x2f7a3: 0x6d09f820, + 0x2f7a4: 0x6d09fa20, 0x2f7a5: 0x6d09fc20, 0x2f7a6: 0x6d09fe20, 0x2f7a7: 0x6d0a0020, + 0x2f7a8: 0x6d0a0220, 0x2f7a9: 0x6d0a0420, 0x2f7aa: 0x6d0a0620, 0x2f7ab: 0x6d0a0820, + 0x2f7ac: 0x6d0a0a20, 0x2f7ad: 0x6d0a0c20, 0x2f7ae: 0x6d0a0e20, 0x2f7af: 0x6d0a1020, + 0x2f7b0: 0x6d0a1220, 0x2f7b1: 0x6d0a1420, 0x2f7b2: 0x6d0a1620, 0x2f7b3: 0x6d0a1820, + 0x2f7b4: 0x6d0a1a20, 0x2f7b5: 0x6d0a1c20, 0x2f7b6: 0x6d0a1e20, 0x2f7b7: 0x6d0a2020, + 0x2f7b8: 0x6d0a2220, 0x2f7b9: 0x6d0a2420, 0x2f7ba: 0x6d0a2620, 0x2f7bb: 0x6d0a2820, + 0x2f7bc: 0x6d0a2a20, 0x2f7bd: 0x6d0a2c20, 0x2f7be: 0x6d0a2e20, 0x2f7bf: 0x6d0a3020, + // Block 0xbdf, offset 0x2f7c0 + 0x2f7c0: 0x6d0a3220, 0x2f7c1: 0x6d0a3420, 0x2f7c2: 0x6d0a3620, 0x2f7c3: 0x6d0a3820, + 0x2f7c4: 0x6d0a3a20, 0x2f7c5: 0x6d0a3c20, 0x2f7c6: 0x6d0a3e20, 0x2f7c7: 0x6d0a4020, + 0x2f7c8: 0x6d0a4220, 0x2f7c9: 0x6d0a4420, 0x2f7ca: 0x6d640e20, 0x2f7cb: 0x6d0a4620, + 0x2f7cc: 0x6d0a4820, 0x2f7cd: 0x6d0a4a20, 0x2f7ce: 0x6d0a4c20, 0x2f7cf: 0x6d0a4e20, + 0x2f7d0: 0x6d37b020, 0x2f7d1: 0x6d37b220, 0x2f7d2: 0x6d37b420, 0x2f7d3: 0x6d37b620, + 0x2f7d4: 0x6d37b820, 0x2f7d5: 0x6d37ba20, 0x2f7d6: 0x6d37bc20, 0x2f7d7: 0x6d37be20, + 0x2f7d8: 0x6d37c020, 0x2f7d9: 0x6d37c220, 0x2f7da: 0x6d37c420, 0x2f7db: 0x6d37c620, + 0x2f7dc: 0x6d37c820, 0x2f7dd: 0x6d37ca20, 0x2f7de: 0x6d37cc20, 0x2f7df: 0x6d37ce20, + 0x2f7e0: 0x6d37d020, 0x2f7e1: 0x6d37d220, 0x2f7e2: 0x6d37d420, 0x2f7e3: 0x6d37d620, + 0x2f7e4: 0x6d37d820, 0x2f7e5: 0x6d37da20, 0x2f7e6: 0x6d37dc20, 0x2f7e7: 0x6d37de20, + 0x2f7e8: 0x6d37e020, 0x2f7e9: 0x6d37e220, 0x2f7ea: 0x6d37e420, 0x2f7eb: 0x6d37e620, + 0x2f7ec: 0x6d37e820, 0x2f7ed: 0x6d37ea20, 0x2f7ee: 0x6d37ec20, 0x2f7ef: 0x6d37ee20, + 0x2f7f0: 0x6d37f020, 0x2f7f1: 0x6d37f220, 0x2f7f2: 0x6d37f420, 0x2f7f3: 0x6d37f620, + 0x2f7f4: 0x6d37f820, 0x2f7f5: 0x6d37fa20, 0x2f7f6: 0x6d37fc20, 0x2f7f7: 0x6d37fe20, + 0x2f7f8: 0x6d2b2a20, 0x2f7f9: 0x6d380020, 0x2f7fa: 0x6d380220, 0x2f7fb: 0x6d380420, + 0x2f7fc: 0x6d380620, 0x2f7fd: 0x6d380820, 0x2f7fe: 0x6d380a20, 0x2f7ff: 0x6d380c20, + // Block 0xbe0, offset 0x2f800 + 0x2f800: 0x6d380e20, 0x2f801: 0x6d381020, 0x2f802: 0x6d381220, 0x2f803: 0x6d381420, + 0x2f804: 0x6d381620, 0x2f805: 0x6d0bb820, 0x2f806: 0x6d381820, 0x2f807: 0x6d381a20, + 0x2f808: 0x6d0bba20, 0x2f809: 0x6d381c20, 0x2f80a: 0x6d381e20, 0x2f80b: 0x6d382020, + 0x2f80c: 0x6d382220, 0x2f80d: 0x6d382420, 0x2f80e: 0x6d382620, 0x2f80f: 0x6d382820, + 0x2f810: 0x6d382a20, 0x2f811: 0x6d382c20, 0x2f812: 0x6d382e20, 0x2f813: 0x6d383020, + 0x2f814: 0x6d383220, 0x2f815: 0x6d383420, 0x2f816: 0x6d383620, 0x2f817: 0x6d383820, + 0x2f818: 0x6d383a20, 0x2f819: 0x6d383c20, 0x2f81a: 0x6d383e20, 0x2f81b: 0x6d384020, + 0x2f81c: 0x6d384220, 0x2f81d: 0x6d384420, 0x2f81e: 0x6d8dfe20, 0x2f81f: 0x6d384620, + 0x2f820: 0x6d641020, 0x2f821: 0x6d384820, 0x2f822: 0x6d384a20, 0x2f823: 0x6d384c20, + 0x2f824: 0x6d384e20, 0x2f825: 0x6d39b820, 0x2f826: 0x6d385020, 0x2f827: 0x6d641220, + 0x2f828: 0x6d641420, 0x2f829: 0x6d641620, 0x2f82a: 0x6d641820, 0x2f82b: 0x6d641a20, + 0x2f82c: 0x6d641c20, 0x2f82d: 0x6d641e20, 0x2f82e: 0x6d642020, 0x2f82f: 0x6d642220, + 0x2f830: 0x6d642420, 0x2f831: 0x6d0bbc20, 0x2f832: 0x6d642620, 0x2f833: 0x6d642820, + 0x2f834: 0x6d642a20, 0x2f835: 0x6d642c20, 0x2f836: 0x6d642e20, 0x2f837: 0x6d643020, + 0x2f838: 0x6d643220, 0x2f839: 0x6d643420, 0x2f83a: 0x6d643620, 0x2f83b: 0x6d643820, + 0x2f83c: 0x6d643a20, 0x2f83d: 0x6d643c20, 0x2f83e: 0x6d643e20, 0x2f83f: 0x6d644020, + // Block 0xbe1, offset 0x2f840 + 0x2f840: 0x6d644220, 0x2f841: 0x6d644420, 0x2f842: 0x6d644620, 0x2f843: 0x6d644820, + 0x2f844: 0x6d644a20, 0x2f845: 0x6d644c20, 0x2f846: 0x6d644e20, 0x2f847: 0x6d0bbe20, + 0x2f848: 0x6d645020, 0x2f849: 0x6d645220, 0x2f84a: 0x6d645420, 0x2f84b: 0x6d645620, + 0x2f84c: 0x6d645820, 0x2f84d: 0x6d645a20, 0x2f84e: 0x6d645c20, 0x2f84f: 0x6d645e20, + 0x2f850: 0x6d646020, 0x2f851: 0x6d646220, 0x2f852: 0x6d646420, 0x2f853: 0x6d646620, + 0x2f854: 0x6d646820, 0x2f855: 0x6d646a20, 0x2f856: 0x6d646c20, 0x2f857: 0x6d646e20, + 0x2f858: 0x6d647020, 0x2f859: 0x6d647220, 0x2f85a: 0x6d647420, 0x2f85b: 0x6d647620, + 0x2f85c: 0x6d647820, 0x2f85d: 0x6d647a20, 0x2f85e: 0x6d647c20, 0x2f85f: 0x6d647e20, + 0x2f860: 0x6d648020, 0x2f861: 0x6d648220, 0x2f862: 0x6d648420, 0x2f863: 0x6d648620, + 0x2f864: 0x6d648820, 0x2f865: 0x6d648a20, 0x2f866: 0x6d648c20, 0x2f867: 0x6d648e20, + 0x2f868: 0x6d649020, 0x2f869: 0x6d649220, 0x2f86a: 0x6d649420, 0x2f86b: 0x6d649620, + 0x2f86c: 0x6d649820, 0x2f86d: 0x6d649a20, 0x2f86e: 0x6d649c20, 0x2f86f: 0x6d649e20, + 0x2f870: 0x6d64a020, 0x2f871: 0x6d64a220, 0x2f872: 0x6d64a420, 0x2f873: 0x6d64a620, + 0x2f874: 0x6d64a820, 0x2f875: 0x6d64aa20, 0x2f876: 0x6d64ac20, 0x2f877: 0x6d64ae20, + 0x2f878: 0x6d64b020, 0x2f879: 0x6d64b220, 0x2f87a: 0x6d64b420, 0x2f87b: 0x6d64b620, + 0x2f87c: 0x6d64b820, 0x2f87d: 0x6d65f020, 0x2f87e: 0x6d8e0020, 0x2f87f: 0x6d8e0220, + // Block 0xbe2, offset 0x2f880 + 0x2f880: 0x6d8e0420, 0x2f881: 0x6d8e0620, 0x2f882: 0x6d8e0820, 0x2f883: 0x6d8e0a20, + 0x2f884: 0x6d8e0c20, 0x2f885: 0x6d8e0e20, 0x2f886: 0x6d8e1020, 0x2f887: 0x6d8e1220, + 0x2f888: 0x6d8e1420, 0x2f889: 0x6d8e1620, 0x2f88a: 0x6d8e1820, 0x2f88b: 0x6d8e1a20, + 0x2f88c: 0x6d8e1c20, 0x2f88d: 0x6d8e1e20, 0x2f88e: 0x6d8e2020, 0x2f88f: 0x6d65f220, + 0x2f890: 0x6d8e2220, 0x2f891: 0x6d8e2420, 0x2f892: 0x6d8e2620, 0x2f893: 0x6d8e2820, + 0x2f894: 0x6d8e2a20, 0x2f895: 0x6d8e2c20, 0x2f896: 0x6d8e2e20, 0x2f897: 0x6db1fe20, + 0x2f898: 0x6d8e3020, 0x2f899: 0x6d8e3220, 0x2f89a: 0x6d8e3420, 0x2f89b: 0x6d8e3620, + 0x2f89c: 0x6d8e3820, 0x2f89d: 0x6d8e3a20, 0x2f89e: 0x6d8e3c20, 0x2f89f: 0x6d8e3e20, + 0x2f8a0: 0x6d8e4020, 0x2f8a1: 0x6d8e4220, 0x2f8a2: 0x6d8e4420, 0x2f8a3: 0x6d8e4620, + 0x2f8a4: 0x6d8e4820, 0x2f8a5: 0x6d8e4a20, 0x2f8a6: 0x6d8e4c20, 0x2f8a7: 0x6d8e4e20, + 0x2f8a8: 0x6d8e5020, 0x2f8a9: 0x6d8e5220, 0x2f8aa: 0x6d8e5420, 0x2f8ab: 0x6d8e5620, + 0x2f8ac: 0x6d8e5820, 0x2f8ad: 0x6d8e5a20, 0x2f8ae: 0x6d8e5c20, 0x2f8af: 0x6d8e5e20, + 0x2f8b0: 0x6d8e6020, 0x2f8b1: 0x6d8e6220, 0x2f8b2: 0x6d8e6420, 0x2f8b3: 0x6d8e6620, + 0x2f8b4: 0x6d8e6820, 0x2f8b5: 0x6d8e6a20, 0x2f8b6: 0x6db20020, 0x2f8b7: 0x6db20220, + 0x2f8b8: 0x6db20420, 0x2f8b9: 0x6db20620, 0x2f8ba: 0x6db20820, 0x2f8bb: 0x6db20a20, + 0x2f8bc: 0x6db20c20, 0x2f8bd: 0x6db20e20, 0x2f8be: 0x6db21020, 0x2f8bf: 0x6db21220, + // Block 0xbe3, offset 0x2f8c0 + 0x2f8c0: 0x6db21420, 0x2f8c1: 0x6db21620, 0x2f8c2: 0x6db21820, 0x2f8c3: 0x6db21a20, + 0x2f8c4: 0x6db21c20, 0x2f8c5: 0x6db21e20, 0x2f8c6: 0x6db22020, 0x2f8c7: 0x6db22220, + 0x2f8c8: 0x6db22420, 0x2f8c9: 0x6db22620, 0x2f8ca: 0x6db22820, 0x2f8cb: 0x6db22a20, + 0x2f8cc: 0x6d8fc420, 0x2f8cd: 0x6db22c20, 0x2f8ce: 0x6db22e20, 0x2f8cf: 0x6db23020, + 0x2f8d0: 0x6db23220, 0x2f8d1: 0x6db23420, 0x2f8d2: 0x6db23620, 0x2f8d3: 0x6db23820, + 0x2f8d4: 0x6db23a20, 0x2f8d5: 0x6db23c20, 0x2f8d6: 0x6db23e20, 0x2f8d7: 0x6db24020, + 0x2f8d8: 0x6db24220, 0x2f8d9: 0x6db24420, 0x2f8da: 0x6db24620, 0x2f8db: 0x6db24820, + 0x2f8dc: 0x6db24a20, 0x2f8dd: 0x6db24c20, 0x2f8de: 0x6db24e20, 0x2f8df: 0x6db25020, + 0x2f8e0: 0x6db25220, 0x2f8e1: 0x6db25420, 0x2f8e2: 0x6db25620, 0x2f8e3: 0x6db25820, + 0x2f8e4: 0x6db25a20, 0x2f8e5: 0x6db25c20, 0x2f8e6: 0x6db25e20, 0x2f8e7: 0x6db26020, + 0x2f8e8: 0x6db26220, 0x2f8e9: 0x6dd14c20, 0x2f8ea: 0x6db26420, 0x2f8eb: 0x6db26620, + 0x2f8ec: 0x6db26820, 0x2f8ed: 0x6db39420, 0x2f8ee: 0x6db26a20, 0x2f8ef: 0x6db39620, + 0x2f8f0: 0x6dd14e20, 0x2f8f1: 0x6dd15020, 0x2f8f2: 0x6dd15220, 0x2f8f3: 0x6dd15420, + 0x2f8f4: 0x6dd15620, 0x2f8f5: 0x6dd15820, 0x2f8f6: 0x6dd15a20, 0x2f8f7: 0x6dd15c20, + 0x2f8f8: 0x6dd15e20, 0x2f8f9: 0x6dd16020, 0x2f8fa: 0x6dd16220, 0x2f8fb: 0x6dd16420, + 0x2f8fc: 0x6dd16620, 0x2f8fd: 0x6dd16820, 0x2f8fe: 0x6dd16a20, 0x2f8ff: 0x6dd16c20, + // Block 0xbe4, offset 0x2f900 + 0x2f900: 0x6dd16e20, 0x2f901: 0x6dd17020, 0x2f902: 0x6dd17220, 0x2f903: 0x6dd17420, + 0x2f904: 0x6dd17620, 0x2f905: 0x6dd17820, 0x2f906: 0x6dd17a20, 0x2f907: 0x6dd17c20, + 0x2f908: 0x6dd17e20, 0x2f909: 0x6dd18020, 0x2f90a: 0x6dd18220, 0x2f90b: 0x6dd18420, + 0x2f90c: 0x6dd18620, 0x2f90d: 0x6dd18820, 0x2f90e: 0x6dd18a20, 0x2f90f: 0x6dd18c20, + 0x2f910: 0x6dd18e20, 0x2f911: 0x6deac020, 0x2f912: 0x6dd19020, 0x2f913: 0x6dd19220, + 0x2f914: 0x6e128a20, 0x2f915: 0x6deac220, 0x2f916: 0x6deac420, 0x2f917: 0x6deac620, + 0x2f918: 0x6deac820, 0x2f919: 0x6deaca20, 0x2f91a: 0x6deacc20, 0x2f91b: 0x6deace20, + 0x2f91c: 0x6dead020, 0x2f91d: 0x6dead220, 0x2f91e: 0x6dead420, 0x2f91f: 0x6dead620, + 0x2f920: 0x6dead820, 0x2f921: 0x6deada20, 0x2f922: 0x6deadc20, 0x2f923: 0x6deade20, + 0x2f924: 0x6deae020, 0x2f925: 0x6deae220, 0x2f926: 0x6deae420, 0x2f927: 0x6deae620, + 0x2f928: 0x6deae820, 0x2f929: 0x6deaea20, 0x2f92a: 0x6deaec20, 0x2f92b: 0x6deaee20, + 0x2f92c: 0x6deaf020, 0x2f92d: 0x6deaf220, 0x2f92e: 0x6e006c20, 0x2f92f: 0x6deaf420, + 0x2f930: 0x6deaf620, 0x2f931: 0x6deaf820, 0x2f932: 0x6deafa20, 0x2f933: 0x6deafc20, + 0x2f934: 0x6deafe20, 0x2f935: 0x6deb0020, 0x2f936: 0x6e006e20, 0x2f937: 0x6debce20, + 0x2f938: 0x6debd020, 0x2f939: 0x6e007020, 0x2f93a: 0x6e007220, 0x2f93b: 0x6e007420, + 0x2f93c: 0x6e007620, 0x2f93d: 0x6e007820, 0x2f93e: 0x6e007a20, 0x2f93f: 0x6e007c20, + // Block 0xbe5, offset 0x2f940 + 0x2f940: 0x6e007e20, 0x2f941: 0x6e008020, 0x2f942: 0x6e008220, 0x2f943: 0x6e008420, + 0x2f944: 0x6e008620, 0x2f945: 0x6e008820, 0x2f946: 0x6e008a20, 0x2f947: 0x6e008c20, + 0x2f948: 0x6e008e20, 0x2f949: 0x6e009020, 0x2f94a: 0x6e009220, 0x2f94b: 0x6e009420, + 0x2f94c: 0x6e009620, 0x2f94d: 0x6e009820, 0x2f94e: 0x6e009a20, 0x2f94f: 0x6e009c20, + 0x2f950: 0x6e009e20, 0x2f951: 0x6e00a020, 0x2f952: 0x6e015420, 0x2f953: 0x6e00a220, + 0x2f954: 0x6e00a420, 0x2f955: 0x6e128c20, 0x2f956: 0x6e128e20, 0x2f957: 0x6e129020, + 0x2f958: 0x6e129220, 0x2f959: 0x6e129420, 0x2f95a: 0x6e129620, 0x2f95b: 0x6e015620, + 0x2f95c: 0x6e129820, 0x2f95d: 0x6e129a20, 0x2f95e: 0x6e129c20, 0x2f95f: 0x6e129e20, + 0x2f960: 0x6e12a020, 0x2f961: 0x6e12a220, 0x2f962: 0x6e00a620, 0x2f963: 0x6e12a420, + 0x2f964: 0x6e006a20, 0x2f965: 0x6e12a620, 0x2f966: 0x6e12a820, 0x2f967: 0x6e12aa20, + 0x2f968: 0x6e12ac20, 0x2f969: 0x6e12ae20, 0x2f96a: 0x6e12b020, 0x2f96b: 0x6e12b220, + 0x2f96c: 0x6e20b820, 0x2f96d: 0x6e12b420, 0x2f96e: 0x6e12b620, 0x2f96f: 0x6e12b820, + 0x2f970: 0x6e015820, 0x2f971: 0x6e2b7e20, 0x2f972: 0x6e20ba20, 0x2f973: 0x6e20bc20, + 0x2f974: 0x6e20be20, 0x2f975: 0x6e20c020, 0x2f976: 0x6e20c220, 0x2f977: 0x6e20c420, + 0x2f978: 0x6e2b8020, 0x2f979: 0x6e2b8220, 0x2f97a: 0x6e2b8420, 0x2f97b: 0x6e2b8620, + 0x2f97c: 0x6e2b8820, 0x2f97d: 0x6e2b8a20, 0x2f97e: 0x6e2b8c20, 0x2f97f: 0x6e2b8e20, + // Block 0xbe6, offset 0x2f980 + 0x2f980: 0x6e2b9020, 0x2f981: 0x6e2b9220, 0x2f982: 0x6e39ca20, 0x2f983: 0x6e33ec20, + 0x2f984: 0x6e3df420, 0x2f985: 0x6e33ee20, 0x2f986: 0x6e39cc20, 0x2f987: 0x6e39ce20, + 0x2f988: 0x6e39d020, 0x2f989: 0x6e39d220, 0x2f98a: 0x6e40cc20, 0x2f98b: 0x6e446620, + 0x2f98c: 0x6e42fa20, 0x2f98d: 0x6c14ca20, 0x2f98e: 0x6c401020, 0x2f98f: 0x6c401220, + 0x2f990: 0x6c5f9620, 0x2f991: 0x6c84ce20, 0x2f992: 0x6c674020, 0x2f993: 0x6c84d020, + 0x2f994: 0x6c84d220, 0x2f995: 0x6cae2620, 0x2f996: 0x6cae2820, 0x2f997: 0x6cae2a20, + 0x2f998: 0x6cae2c20, 0x2f999: 0x6cae2e20, 0x2f99a: 0x6cae3020, 0x2f99b: 0x6cdd4c20, + 0x2f99c: 0x6d0bc020, 0x2f99d: 0x6cdd4e20, 0x2f99e: 0x6d0bcc20, 0x2f99f: 0x6d0bce20, + 0x2f9a0: 0x6d39ba20, 0x2f9a1: 0x6d39bc20, 0x2f9a2: 0x6d65f620, 0x2f9a3: 0x6d8fc620, + 0x2f9a4: 0x6d8fca20, 0x2f9a5: 0x6d8fcc20, 0x2f9a6: 0x6d8fce20, 0x2f9a7: 0x6db39a20, + 0x2f9a8: 0x6db39c20, 0x2f9a9: 0x6dd29a20, 0x2f9aa: 0x6e3e1220, 0x2f9ab: 0x6c14cc20, + 0x2f9ac: 0x6c268a20, 0x2f9ad: 0x6c401620, 0x2f9ae: 0x6c401820, 0x2f9af: 0x6c401a20, + 0x2f9b0: 0x6c401c20, 0x2f9b1: 0x6c401e20, 0x2f9b2: 0x6c402020, 0x2f9b3: 0x6c5fa820, + 0x2f9b4: 0x6c5faa20, 0x2f9b5: 0x6c5fac20, 0x2f9b6: 0x6c5fae20, 0x2f9b7: 0x6c5fb020, + 0x2f9b8: 0x6c5fb220, 0x2f9b9: 0x6c5fb420, 0x2f9ba: 0x6c5fb620, 0x2f9bb: 0x6c5fb820, + 0x2f9bc: 0x6c5fba20, 0x2f9bd: 0x6c5fbc20, 0x2f9be: 0x6c5fbe20, 0x2f9bf: 0x6c5fc020, + // Block 0xbe7, offset 0x2f9c0 + 0x2f9c0: 0x6c5fc220, 0x2f9c1: 0x6c5fc420, 0x2f9c2: 0x6c5fc620, 0x2f9c3: 0x6c5fc820, + 0x2f9c4: 0x6c84e420, 0x2f9c5: 0x6c84e620, 0x2f9c6: 0x6c84e820, 0x2f9c7: 0x6c84ea20, + 0x2f9c8: 0x6cdd7820, 0x2f9c9: 0x6c84ec20, 0x2f9ca: 0x6c84ee20, 0x2f9cb: 0x6c84f020, + 0x2f9cc: 0x6c84f220, 0x2f9cd: 0x6c84f420, 0x2f9ce: 0x6c84f620, 0x2f9cf: 0x6c84f820, + 0x2f9d0: 0x6c84fa20, 0x2f9d1: 0x6c84fc20, 0x2f9d2: 0x6c84fe20, 0x2f9d3: 0x6c850020, + 0x2f9d4: 0x6c850220, 0x2f9d5: 0x6c850420, 0x2f9d6: 0x6c850620, 0x2f9d7: 0x6c850820, + 0x2f9d8: 0x6c850a20, 0x2f9d9: 0x6c850c20, 0x2f9da: 0x6c850e20, 0x2f9db: 0x6c851020, + 0x2f9dc: 0x6c851220, 0x2f9dd: 0x6c851420, 0x2f9de: 0x6c851620, 0x2f9df: 0x6c851820, + 0x2f9e0: 0x6c851a20, 0x2f9e1: 0x6c851c20, 0x2f9e2: 0x6c851e20, 0x2f9e3: 0x6c852020, + 0x2f9e4: 0x6c852220, 0x2f9e5: 0x6c852420, 0x2f9e6: 0x6c852620, 0x2f9e7: 0x6c852820, + 0x2f9e8: 0x6c852a20, 0x2f9e9: 0x6c852c20, 0x2f9ea: 0x6c852e20, 0x2f9eb: 0x6cae6020, + 0x2f9ec: 0x6c853020, 0x2f9ed: 0x6cae6220, 0x2f9ee: 0x6cae6420, 0x2f9ef: 0x6cae6620, + 0x2f9f0: 0x6cae6820, 0x2f9f1: 0x6cae6a20, 0x2f9f2: 0x6cae6c20, 0x2f9f3: 0x6cae6e20, + 0x2f9f4: 0x6cae7020, 0x2f9f5: 0x6cae7220, 0x2f9f6: 0x6cae7420, 0x2f9f7: 0x6cae7620, + 0x2f9f8: 0x6cae7820, 0x2f9f9: 0x6cae7a20, 0x2f9fa: 0x6cae7c20, 0x2f9fb: 0x6cae7e20, + 0x2f9fc: 0x6cae8020, 0x2f9fd: 0x6cae8220, 0x2f9fe: 0x6cae8420, 0x2f9ff: 0x6cae8620, + // Block 0xbe8, offset 0x2fa00 + 0x2fa00: 0x6cae8820, 0x2fa01: 0x6cae8a20, 0x2fa02: 0x6cae8c20, 0x2fa03: 0x6cae8e20, + 0x2fa04: 0x6cae9020, 0x2fa05: 0x6cae9220, 0x2fa06: 0x6cae9420, 0x2fa07: 0x6cae9620, + 0x2fa08: 0x6cae9820, 0x2fa09: 0x6cae9a20, 0x2fa0a: 0x6cae9c20, 0x2fa0b: 0x6cae9e20, + 0x2fa0c: 0x6caea020, 0x2fa0d: 0x6caea220, 0x2fa0e: 0x6caea420, 0x2fa0f: 0x6caea620, + 0x2fa10: 0x6cdd7a20, 0x2fa11: 0x6cdd7c20, 0x2fa12: 0x6cdd7e20, 0x2fa13: 0x6cdd8020, + 0x2fa14: 0x6cdd8220, 0x2fa15: 0x6cdd8420, 0x2fa16: 0x6d0bf020, 0x2fa17: 0x6cdd8620, + 0x2fa18: 0x6cdd8820, 0x2fa19: 0x6cdd8a20, 0x2fa1a: 0x6cdd8c20, 0x2fa1b: 0x6cdd8e20, + 0x2fa1c: 0x6cdd9020, 0x2fa1d: 0x6cdd9220, 0x2fa1e: 0x6cdd9420, 0x2fa1f: 0x6cdd9620, + 0x2fa20: 0x6cdd9820, 0x2fa21: 0x6cdd9a20, 0x2fa22: 0x6cdd9c20, 0x2fa23: 0x6cdd9e20, + 0x2fa24: 0x6cdda020, 0x2fa25: 0x6cdda220, 0x2fa26: 0x6cdda420, 0x2fa27: 0x6cdda620, + 0x2fa28: 0x6cdda820, 0x2fa29: 0x6cddaa20, 0x2fa2a: 0x6cddac20, 0x2fa2b: 0x6cddae20, + 0x2fa2c: 0x6cddb020, 0x2fa2d: 0x6cddb220, 0x2fa2e: 0x6cddb420, 0x2fa2f: 0x6cddb620, + 0x2fa30: 0x6cddb820, 0x2fa31: 0x6cddba20, 0x2fa32: 0x6cddbc20, 0x2fa33: 0x6cddbe20, + 0x2fa34: 0x6cddc020, 0x2fa35: 0x6d0bf220, 0x2fa36: 0x6d0bf420, 0x2fa37: 0x6d0bf620, + 0x2fa38: 0x6d0bf820, 0x2fa39: 0x6d0bfa20, 0x2fa3a: 0x6d0bfc20, 0x2fa3b: 0x6d0bfe20, + 0x2fa3c: 0x6d0c0020, 0x2fa3d: 0x6d0c0220, 0x2fa3e: 0x6d0c0420, 0x2fa3f: 0x6d0c0620, + // Block 0xbe9, offset 0x2fa40 + 0x2fa40: 0x6d0c0820, 0x2fa41: 0x6d0c0a20, 0x2fa42: 0x6d0c0c20, 0x2fa43: 0x6d0c0e20, + 0x2fa44: 0x6d0c1020, 0x2fa45: 0x6d0c1220, 0x2fa46: 0x6d0c1420, 0x2fa47: 0x6d0c1620, + 0x2fa48: 0x6d0c1820, 0x2fa49: 0x6d0c1a20, 0x2fa4a: 0x6d0c1c20, 0x2fa4b: 0x6d0c1e20, + 0x2fa4c: 0x6d0c2020, 0x2fa4d: 0x6d0c2220, 0x2fa4e: 0x6d0c2420, 0x2fa4f: 0x6d0c2620, + 0x2fa50: 0x6d0c2820, 0x2fa51: 0x6d39dc20, 0x2fa52: 0x6d39de20, 0x2fa53: 0x6d0c2a20, + 0x2fa54: 0x6d0c2c20, 0x2fa55: 0x6d0c2e20, 0x2fa56: 0x6d0c3020, 0x2fa57: 0x6d0c3220, + 0x2fa58: 0x6d39fc20, 0x2fa59: 0x6d39fe20, 0x2fa5a: 0x6d3a0020, 0x2fa5b: 0x6d3a0220, + 0x2fa5c: 0x6d3a0420, 0x2fa5d: 0x6d3a0620, 0x2fa5e: 0x6d3a0820, 0x2fa5f: 0x6d3a0a20, + 0x2fa60: 0x6d3a0c20, 0x2fa61: 0x6d3a0e20, 0x2fa62: 0x6d3a1020, 0x2fa63: 0x6d3a1220, + 0x2fa64: 0x6d3a1420, 0x2fa65: 0x6d3a1620, 0x2fa66: 0x6d3a1820, 0x2fa67: 0x6d3a1a20, + 0x2fa68: 0x6d3a1c20, 0x2fa69: 0x6d3a1e20, 0x2fa6a: 0x6d3a2020, 0x2fa6b: 0x6d39e020, + 0x2fa6c: 0x6d3a2220, 0x2fa6d: 0x6d3a2420, 0x2fa6e: 0x6d3a2620, 0x2fa6f: 0x6d3a2820, + 0x2fa70: 0x6d3a2a20, 0x2fa71: 0x6d3a2c20, 0x2fa72: 0x6d3a2e20, 0x2fa73: 0x6d3a3020, + 0x2fa74: 0x6d3a3220, 0x2fa75: 0x6d3a3420, 0x2fa76: 0x6d3a3620, 0x2fa77: 0x6d3a3820, + 0x2fa78: 0x6d3a3a20, 0x2fa79: 0x6d3a3c20, 0x2fa7a: 0x6d3a3e20, 0x2fa7b: 0x6d3a4020, + 0x2fa7c: 0x6d3a4220, 0x2fa7d: 0x6d3a4420, 0x2fa7e: 0x6d3a4620, 0x2fa7f: 0x6d3a4820, + // Block 0xbea, offset 0x2fa80 + 0x2fa80: 0x6d3a4a20, 0x2fa81: 0x6d3a4c20, 0x2fa82: 0x6d3a4e20, 0x2fa83: 0x6d3a5020, + 0x2fa84: 0x6d3a5220, 0x2fa85: 0x6d3a5420, 0x2fa86: 0x6d0c3420, 0x2fa87: 0x6d3a5620, + 0x2fa88: 0x6d3a5820, 0x2fa89: 0x6d3a5a20, 0x2fa8a: 0x6d3a5c20, 0x2fa8b: 0x6d3a5e20, + 0x2fa8c: 0x6d662820, 0x2fa8d: 0x6d0cba20, 0x2fa8e: 0x6d662a20, 0x2fa8f: 0x6d662c20, + 0x2fa90: 0x6d662e20, 0x2fa91: 0x6d663020, 0x2fa92: 0x6d663220, 0x2fa93: 0x6d663420, + 0x2fa94: 0x6d663620, 0x2fa95: 0x6d3b0c20, 0x2fa96: 0x6d663820, 0x2fa97: 0x6d663a20, + 0x2fa98: 0x6d663c20, 0x2fa99: 0x6d663e20, 0x2fa9a: 0x6d664020, 0x2fa9b: 0x6d664220, + 0x2fa9c: 0x6d664420, 0x2fa9d: 0x6d664620, 0x2fa9e: 0x6d664820, 0x2fa9f: 0x6d664a20, + 0x2faa0: 0x6d664c20, 0x2faa1: 0x6d664e20, 0x2faa2: 0x6d665020, 0x2faa3: 0x6d665220, + 0x2faa4: 0x6d665420, 0x2faa5: 0x6d665620, 0x2faa6: 0x6d665820, 0x2faa7: 0x6d665a20, + 0x2faa8: 0x6d665c20, 0x2faa9: 0x6d665e20, 0x2faaa: 0x6d666020, 0x2faab: 0x6d3b0e20, + 0x2faac: 0x6d666220, 0x2faad: 0x6d666420, 0x2faae: 0x6d666620, 0x2faaf: 0x6d666820, + 0x2fab0: 0x6d666a20, 0x2fab1: 0x6d666c20, 0x2fab2: 0x6d666e20, 0x2fab3: 0x6d667020, + 0x2fab4: 0x6d667220, 0x2fab5: 0x6d667420, 0x2fab6: 0x6d667620, 0x2fab7: 0x6d667820, + 0x2fab8: 0x6d667a20, 0x2fab9: 0x6d900a20, 0x2faba: 0x6d667c20, 0x2fabb: 0x6d667e20, + 0x2fabc: 0x6d668020, 0x2fabd: 0x6d668220, 0x2fabe: 0x6d668420, 0x2fabf: 0x6d668620, + // Block 0xbeb, offset 0x2fac0 + 0x2fac0: 0x6d668820, 0x2fac1: 0x6d900c20, 0x2fac2: 0x6d673820, 0x2fac3: 0x6d900e20, + 0x2fac4: 0x6d901020, 0x2fac5: 0x6d901220, 0x2fac6: 0x6d901420, 0x2fac7: 0x6d901620, + 0x2fac8: 0x6d901820, 0x2fac9: 0x6d901a20, 0x2faca: 0x6d901c20, 0x2facb: 0x6d901e20, + 0x2facc: 0x6d902020, 0x2facd: 0x6d902220, 0x2face: 0x6d902420, 0x2facf: 0x6d902620, + 0x2fad0: 0x6d902820, 0x2fad1: 0x6d902a20, 0x2fad2: 0x6d902c20, 0x2fad3: 0x6d902e20, + 0x2fad4: 0x6d903020, 0x2fad5: 0x6d903220, 0x2fad6: 0x6d903420, 0x2fad7: 0x6d903620, + 0x2fad8: 0x6d903820, 0x2fad9: 0x6d903a20, 0x2fada: 0x6d903c20, 0x2fadb: 0x6d903e20, + 0x2fadc: 0x6d904020, 0x2fadd: 0x6d904220, 0x2fade: 0x6d904420, 0x2fadf: 0x6d904620, + 0x2fae0: 0x6d904820, 0x2fae1: 0x6d904a20, 0x2fae2: 0x6d904c20, 0x2fae3: 0x6d904e20, + 0x2fae4: 0x6d905020, 0x2fae5: 0x6d905220, 0x2fae6: 0x6d905420, 0x2fae7: 0x6d905620, + 0x2fae8: 0x6d905820, 0x2fae9: 0x6d905a20, 0x2faea: 0x6db3d420, 0x2faeb: 0x6db3d620, + 0x2faec: 0x6db3d820, 0x2faed: 0x6db3da20, 0x2faee: 0x6db3dc20, 0x2faef: 0x6db3de20, + 0x2faf0: 0x6db3e020, 0x2faf1: 0x6db3e220, 0x2faf2: 0x6db3e420, 0x2faf3: 0x6db3e620, + 0x2faf4: 0x6db3e820, 0x2faf5: 0x6db3ea20, 0x2faf6: 0x6db3ec20, 0x2faf7: 0x6db3ee20, + 0x2faf8: 0x6db3f020, 0x2faf9: 0x6db3f220, 0x2fafa: 0x6db3f420, 0x2fafb: 0x6db3f620, + 0x2fafc: 0x6db3f820, 0x2fafd: 0x6db3fa20, 0x2fafe: 0x6db3fc20, 0x2faff: 0x6db3fe20, + // Block 0xbec, offset 0x2fb00 + 0x2fb00: 0x6db40020, 0x2fb01: 0x6db40220, 0x2fb02: 0x6db40420, 0x2fb03: 0x6db40620, + 0x2fb04: 0x6db40820, 0x2fb05: 0x6db40a20, 0x2fb06: 0x6db40c20, 0x2fb07: 0x6db40e20, + 0x2fb08: 0x6db41020, 0x2fb09: 0x6db41220, 0x2fb0a: 0x6db41420, 0x2fb0b: 0x6db41620, + 0x2fb0c: 0x6db41820, 0x2fb0d: 0x6db41a20, 0x2fb0e: 0x6db41c20, 0x2fb0f: 0x6db41e20, + 0x2fb10: 0x6db42020, 0x2fb11: 0x6db42220, 0x2fb12: 0x6db42420, 0x2fb13: 0x6dd2ba20, + 0x2fb14: 0x6dd2bc20, 0x2fb15: 0x6debe420, 0x2fb16: 0x6dd2be20, 0x2fb17: 0x6dd2ae20, + 0x2fb18: 0x6dd2c020, 0x2fb19: 0x6dd2c220, 0x2fb1a: 0x6dd2c420, 0x2fb1b: 0x6dd2c620, + 0x2fb1c: 0x6dd2c820, 0x2fb1d: 0x6dd2ca20, 0x2fb1e: 0x6db4c620, 0x2fb1f: 0x6dd2cc20, + 0x2fb20: 0x6dd2ce20, 0x2fb21: 0x6d668a20, 0x2fb22: 0x6dd2d020, 0x2fb23: 0x6dd2d220, + 0x2fb24: 0x6dd2d420, 0x2fb25: 0x6dd2d620, 0x2fb26: 0x6dd2d820, 0x2fb27: 0x6dd2da20, + 0x2fb28: 0x6dd2dc20, 0x2fb29: 0x6dd2de20, 0x2fb2a: 0x6dd2e020, 0x2fb2b: 0x6dd2e220, + 0x2fb2c: 0x6dd2e420, 0x2fb2d: 0x6dd2e620, 0x2fb2e: 0x6dd2e820, 0x2fb2f: 0x6dd2ea20, + 0x2fb30: 0x6dd2ec20, 0x2fb31: 0x6dd2ee20, 0x2fb32: 0x6dd2f020, 0x2fb33: 0x6dd2f220, + 0x2fb34: 0x6dd2f420, 0x2fb35: 0x6dd2f620, 0x2fb36: 0x6debf620, 0x2fb37: 0x6debf820, + 0x2fb38: 0x6debfa20, 0x2fb39: 0x6debfc20, 0x2fb3a: 0x6debfe20, 0x2fb3b: 0x6dec0020, + 0x2fb3c: 0x6dec0220, 0x2fb3d: 0x6dec0420, 0x2fb3e: 0x6dec0620, 0x2fb3f: 0x6dec0820, + // Block 0xbed, offset 0x2fb40 + 0x2fb40: 0x6dec0a20, 0x2fb41: 0x6debe220, 0x2fb42: 0x6dec0c20, 0x2fb43: 0x6dec0e20, + 0x2fb44: 0x6dec1020, 0x2fb45: 0x6dec1220, 0x2fb46: 0x6dec1420, 0x2fb47: 0x6dec1620, + 0x2fb48: 0x6dec1820, 0x2fb49: 0x6dec1a20, 0x2fb4a: 0x6dec1c20, 0x2fb4b: 0x6dec1e20, + 0x2fb4c: 0x6dec2020, 0x2fb4d: 0x6dec2220, 0x2fb4e: 0x6dd2f820, 0x2fb4f: 0x6dec2420, + 0x2fb50: 0x6e017020, 0x2fb51: 0x6e017220, 0x2fb52: 0x6e017420, 0x2fb53: 0x6e017620, + 0x2fb54: 0x6e017820, 0x2fb55: 0x6e017a20, 0x2fb56: 0x6e017c20, 0x2fb57: 0x6e017e20, + 0x2fb58: 0x6e018020, 0x2fb59: 0x6e018220, 0x2fb5a: 0x6e135620, 0x2fb5b: 0x6e135820, + 0x2fb5c: 0x6e135a20, 0x2fb5d: 0x6e135c20, 0x2fb5e: 0x6deca420, 0x2fb5f: 0x6e135e20, + 0x2fb60: 0x6e136020, 0x2fb61: 0x6e136220, 0x2fb62: 0x6e136420, 0x2fb63: 0x6e136620, + 0x2fb64: 0x6e136820, 0x2fb65: 0x6e212c20, 0x2fb66: 0x6e212e20, 0x2fb67: 0x6e213020, + 0x2fb68: 0x6e213220, 0x2fb69: 0x6e13c620, 0x2fb6a: 0x6e213420, 0x2fb6b: 0x6e13c820, + 0x2fb6c: 0x6e213620, 0x2fb6d: 0x6e2be220, 0x2fb6e: 0x6e2be420, 0x2fb6f: 0x6e2be620, + 0x2fb70: 0x6e2be820, 0x2fb71: 0x6e2bea20, 0x2fb72: 0x6e2bec20, 0x2fb73: 0x6e2bee20, + 0x2fb74: 0x6e2bda20, 0x2fb75: 0x6e342620, 0x2fb76: 0x6e342820, 0x2fb77: 0x6e342a20, + 0x2fb78: 0x6e342c20, 0x2fb79: 0x6e342e20, 0x2fb7a: 0x6e343020, 0x2fb7b: 0x6e39ec20, + 0x2fb7c: 0x6e3e1620, 0x2fb7d: 0x6e40de20, 0x2fb7e: 0x6e40e020, 0x2fb7f: 0x6e40fa20, + // Block 0xbee, offset 0x2fb80 + 0x2fb80: 0x6c14ce20, 0x2fb81: 0x6c5ff820, 0x2fb82: 0x6c5ffa20, 0x2fb83: 0x6c858420, + 0x2fb84: 0x6c858620, 0x2fb85: 0x6caf1c20, 0x2fb86: 0x6cde4420, 0x2fb87: 0x6cde4620, + 0x2fb88: 0x6cde4820, 0x2fb89: 0x6cde4a20, 0x2fb8a: 0x6e13ca20, 0x2fb8b: 0x6e345c20, + 0x2fb8c: 0x6c14d020, 0x2fb8d: 0x6c5ffe20, 0x2fb8e: 0x6c600020, 0x2fb8f: 0x6c859620, + 0x2fb90: 0x6caf2620, 0x2fb91: 0x6caf2820, 0x2fb92: 0x6caf2a20, 0x2fb93: 0x6caf2c20, + 0x2fb94: 0x6caf2e20, 0x2fb95: 0x6cde5220, 0x2fb96: 0x6cde5420, 0x2fb97: 0x6cde5620, + 0x2fb98: 0x6d0cc820, 0x2fb99: 0x6d0cca20, 0x2fb9a: 0x6d674620, 0x2fb9b: 0x6d674820, + 0x2fb9c: 0x6d674a20, 0x2fb9d: 0x6d674c20, 0x2fb9e: 0x6d912420, 0x2fb9f: 0x6d912620, + 0x2fba0: 0x6d912820, 0x2fba1: 0x6d912a20, 0x2fba2: 0x6e345e20, 0x2fba3: 0x6c14d220, + 0x2fba4: 0x6c0a6020, 0x2fba5: 0x6c404820, 0x2fba6: 0x6c601220, 0x2fba7: 0x6c601420, + 0x2fba8: 0x6c404a20, 0x2fba9: 0x6c601620, 0x2fbaa: 0x6c601820, 0x2fbab: 0x6c601a20, + 0x2fbac: 0x6c601c20, 0x2fbad: 0x6c85a620, 0x2fbae: 0x6c85a820, 0x2fbaf: 0x6c85aa20, + 0x2fbb0: 0x6c85ac20, 0x2fbb1: 0x6c85ae20, 0x2fbb2: 0x6c85b020, 0x2fbb3: 0x6c85b220, + 0x2fbb4: 0x6c85b420, 0x2fbb5: 0x6c85b620, 0x2fbb6: 0x6c85b820, 0x2fbb7: 0x6c85ba20, + 0x2fbb8: 0x6c85bc20, 0x2fbb9: 0x6c85be20, 0x2fbba: 0x6c85c020, 0x2fbbb: 0x6c85c220, + 0x2fbbc: 0x6c85c420, 0x2fbbd: 0x6c85c620, 0x2fbbe: 0x6c85c820, 0x2fbbf: 0x6c85ca20, + // Block 0xbef, offset 0x2fbc0 + 0x2fbc0: 0x6c85cc20, 0x2fbc1: 0x6c85ce20, 0x2fbc2: 0x6c85d020, 0x2fbc3: 0x6c85d220, + 0x2fbc4: 0x6c85d420, 0x2fbc5: 0x6c85d620, 0x2fbc6: 0x6c85d820, 0x2fbc7: 0x6c85da20, + 0x2fbc8: 0x6caf4020, 0x2fbc9: 0x6caf4220, 0x2fbca: 0x6caf4420, 0x2fbcb: 0x6caf4620, + 0x2fbcc: 0x6caf4820, 0x2fbcd: 0x6caf4a20, 0x2fbce: 0x6caf4c20, 0x2fbcf: 0x6caf4e20, + 0x2fbd0: 0x6caf5020, 0x2fbd1: 0x6caf5220, 0x2fbd2: 0x6caf5420, 0x2fbd3: 0x6caf5620, + 0x2fbd4: 0x6caf5820, 0x2fbd5: 0x6caf5a20, 0x2fbd6: 0x6caf5c20, 0x2fbd7: 0x6caf5e20, + 0x2fbd8: 0x6caf6020, 0x2fbd9: 0x6caf6220, 0x2fbda: 0x6caf6420, 0x2fbdb: 0x6caf6620, + 0x2fbdc: 0x6caf6820, 0x2fbdd: 0x6caf6a20, 0x2fbde: 0x6caf6c20, 0x2fbdf: 0x6caf6e20, + 0x2fbe0: 0x6caf7020, 0x2fbe1: 0x6caf7220, 0x2fbe2: 0x6caf7420, 0x2fbe3: 0x6caf7620, + 0x2fbe4: 0x6caf7820, 0x2fbe5: 0x6caf7a20, 0x2fbe6: 0x6caf7c20, 0x2fbe7: 0x6caf7e20, + 0x2fbe8: 0x6caf8020, 0x2fbe9: 0x6caf8220, 0x2fbea: 0x6caf8420, 0x2fbeb: 0x6caf8620, + 0x2fbec: 0x6caf8820, 0x2fbed: 0x6caf8a20, 0x2fbee: 0x6caf8c20, 0x2fbef: 0x6caf9020, + 0x2fbf0: 0x6caf8e20, 0x2fbf1: 0x6cde7820, 0x2fbf2: 0x6cde7a20, 0x2fbf3: 0x6cde7c20, + 0x2fbf4: 0x6cde7e20, 0x2fbf5: 0x6cde8020, 0x2fbf6: 0x6cde8220, 0x2fbf7: 0x6cde8420, + 0x2fbf8: 0x6cde8620, 0x2fbf9: 0x6cde8820, 0x2fbfa: 0x6cde8a20, 0x2fbfb: 0x6cde8c20, + 0x2fbfc: 0x6cde8e20, 0x2fbfd: 0x6cde9020, 0x2fbfe: 0x6cde9220, 0x2fbff: 0x6cde9420, + // Block 0xbf0, offset 0x2fc00 + 0x2fc00: 0x6cde9620, 0x2fc01: 0x6cde9820, 0x2fc02: 0x6cde9a20, 0x2fc03: 0x6cde9c20, + 0x2fc04: 0x6cde9e20, 0x2fc05: 0x6cdea020, 0x2fc06: 0x6cdea220, 0x2fc07: 0x6cdea420, + 0x2fc08: 0x6cdea620, 0x2fc09: 0x6cdea820, 0x2fc0a: 0x6d0ce020, 0x2fc0b: 0x6d0ce220, + 0x2fc0c: 0x6d0ce420, 0x2fc0d: 0x6d0ce620, 0x2fc0e: 0x6d0ce820, 0x2fc0f: 0x6d0cea20, + 0x2fc10: 0x6d0cec20, 0x2fc11: 0x6d0cee20, 0x2fc12: 0x6d0cf020, 0x2fc13: 0x6d0cf220, + 0x2fc14: 0x6d0cf420, 0x2fc15: 0x6d0cf620, 0x2fc16: 0x6d0cf820, 0x2fc17: 0x6cdeaa20, + 0x2fc18: 0x6d0cfa20, 0x2fc19: 0x6d0cfc20, 0x2fc1a: 0x6d0cfe20, 0x2fc1b: 0x6d0d0020, + 0x2fc1c: 0x6d0d0220, 0x2fc1d: 0x6d0d0420, 0x2fc1e: 0x6d0d0620, 0x2fc1f: 0x6d0d0820, + 0x2fc20: 0x6d0d0a20, 0x2fc21: 0x6d0d0c20, 0x2fc22: 0x6d3b2620, 0x2fc23: 0x6d0d0e20, + 0x2fc24: 0x6d0d1020, 0x2fc25: 0x6d0d1220, 0x2fc26: 0x6d676e20, 0x2fc27: 0x6d3b4820, + 0x2fc28: 0x6d3b4a20, 0x2fc29: 0x6d3b4c20, 0x2fc2a: 0x6d3b4e20, 0x2fc2b: 0x6d3b5020, + 0x2fc2c: 0x6d3b5220, 0x2fc2d: 0x6d3b5420, 0x2fc2e: 0x6d3b5620, 0x2fc2f: 0x6d3b5820, + 0x2fc30: 0x6d3b5a20, 0x2fc31: 0x6d3b5c20, 0x2fc32: 0x6d3b5e20, 0x2fc33: 0x6d3b6020, + 0x2fc34: 0x6d3b6220, 0x2fc35: 0x6d3b6420, 0x2fc36: 0x6d3b6620, 0x2fc37: 0x6d3b6820, + 0x2fc38: 0x6d3b6a20, 0x2fc39: 0x6d3b6c20, 0x2fc3a: 0x6d3b6e20, 0x2fc3b: 0x6d3b7020, + 0x2fc3c: 0x6d3b7220, 0x2fc3d: 0x6d3b7420, 0x2fc3e: 0x6d3b7620, 0x2fc3f: 0x6d3b7820, + // Block 0xbf1, offset 0x2fc40 + 0x2fc40: 0x6d3b7a20, 0x2fc41: 0x6cdef820, 0x2fc42: 0x6d3b7c20, 0x2fc43: 0x6d3b7e20, + 0x2fc44: 0x6d3b8020, 0x2fc45: 0x6d677020, 0x2fc46: 0x6d677220, 0x2fc47: 0x6d677420, + 0x2fc48: 0x6d677620, 0x2fc49: 0x6d677820, 0x2fc4a: 0x6d677a20, 0x2fc4b: 0x6d677c20, + 0x2fc4c: 0x6d677e20, 0x2fc4d: 0x6d678020, 0x2fc4e: 0x6d678220, 0x2fc4f: 0x6d678420, + 0x2fc50: 0x6d678620, 0x2fc51: 0x6d678820, 0x2fc52: 0x6d678a20, 0x2fc53: 0x6d678c20, + 0x2fc54: 0x6d678e20, 0x2fc55: 0x6d679020, 0x2fc56: 0x6d679220, 0x2fc57: 0x6d679420, + 0x2fc58: 0x6d679620, 0x2fc59: 0x6d679820, 0x2fc5a: 0x6d3b8220, 0x2fc5b: 0x6d679a20, + 0x2fc5c: 0x6d679c20, 0x2fc5d: 0x6d679e20, 0x2fc5e: 0x6d913c20, 0x2fc5f: 0x6d913e20, + 0x2fc60: 0x6d914020, 0x2fc61: 0x6d914220, 0x2fc62: 0x6d914420, 0x2fc63: 0x6d914620, + 0x2fc64: 0x6d914820, 0x2fc65: 0x6d914a20, 0x2fc66: 0x6d914c20, 0x2fc67: 0x6d914e20, + 0x2fc68: 0x6d915020, 0x2fc69: 0x6d915220, 0x2fc6a: 0x6d915420, 0x2fc6b: 0x6d915620, + 0x2fc6c: 0x6d915820, 0x2fc6d: 0x6d915a20, 0x2fc6e: 0x6d915c20, 0x2fc6f: 0x6d915e20, + 0x2fc70: 0x6d916020, 0x2fc71: 0x6d916220, 0x2fc72: 0x6d916420, 0x2fc73: 0x6db4ee20, + 0x2fc74: 0x6d916620, 0x2fc75: 0x6db4f020, 0x2fc76: 0x6db4f220, 0x2fc77: 0x6db4f420, + 0x2fc78: 0x6db4f620, 0x2fc79: 0x6db4f820, 0x2fc7a: 0x6db4fa20, 0x2fc7b: 0x6db4fc20, + 0x2fc7c: 0x6db4fe20, 0x2fc7d: 0x6db50020, 0x2fc7e: 0x6db50220, 0x2fc7f: 0x6db50420, + // Block 0xbf2, offset 0x2fc80 + 0x2fc80: 0x6db50620, 0x2fc81: 0x6db50820, 0x2fc82: 0x6db50a20, 0x2fc83: 0x6db50c20, + 0x2fc84: 0x6db50e20, 0x2fc85: 0x6db51020, 0x2fc86: 0x6dd3b620, 0x2fc87: 0x6dd3b820, + 0x2fc88: 0x6dd3ba20, 0x2fc89: 0x6dd3bc20, 0x2fc8a: 0x6dd3be20, 0x2fc8b: 0x6dd3c020, + 0x2fc8c: 0x6dd3c220, 0x2fc8d: 0x6dd3c420, 0x2fc8e: 0x6dd3c620, 0x2fc8f: 0x6dd3c820, + 0x2fc90: 0x6dd3ca20, 0x2fc91: 0x6dd3cc20, 0x2fc92: 0x6db51420, 0x2fc93: 0x6dd3ce20, + 0x2fc94: 0x6db51220, 0x2fc95: 0x6dd3d020, 0x2fc96: 0x6decb020, 0x2fc97: 0x6decb220, + 0x2fc98: 0x6decb420, 0x2fc99: 0x6decb620, 0x2fc9a: 0x6decb820, 0x2fc9b: 0x6decba20, + 0x2fc9c: 0x6decbc20, 0x2fc9d: 0x6decbe20, 0x2fc9e: 0x6decc020, 0x2fc9f: 0x6decc220, + 0x2fca0: 0x6decc420, 0x2fca1: 0x6decc620, 0x2fca2: 0x6decc820, 0x2fca3: 0x6e01ec20, + 0x2fca4: 0x6e01ee20, 0x2fca5: 0x6e01f020, 0x2fca6: 0x6e01f220, 0x2fca7: 0x6e01f420, + 0x2fca8: 0x6e01f620, 0x2fca9: 0x6e13d220, 0x2fcaa: 0x6e13d420, 0x2fcab: 0x6e13d620, + 0x2fcac: 0x6e13d820, 0x2fcad: 0x6e13da20, 0x2fcae: 0x6e13dc20, 0x2fcaf: 0x6e218e20, + 0x2fcb0: 0x6e219020, 0x2fcb1: 0x6e219220, 0x2fcb2: 0x6e219420, 0x2fcb3: 0x6e2c2620, + 0x2fcb4: 0x6e2c2820, 0x2fcb5: 0x6e346420, 0x2fcb6: 0x6e2c2a20, 0x2fcb7: 0x6e346620, + 0x2fcb8: 0x6e3a0c20, 0x2fcb9: 0x6e3a0e20, 0x2fcba: 0x6e3a1020, 0x2fcbb: 0x6e3a1220, + 0x2fcbc: 0x6e3a1420, 0x2fcbd: 0x6e40fc20, 0x2fcbe: 0x6c14d420, 0x2fcbf: 0x6c14d620, + // Block 0xbf3, offset 0x2fcc0 + 0x2fcc0: 0x6c14d820, 0x2fcc1: 0x6c606620, 0x2fcc2: 0x6cafe420, 0x2fcc3: 0x6cdefe20, + 0x2fcc4: 0x6cdf0020, 0x2fcc5: 0x6d0d7620, 0x2fcc6: 0x6dd40e20, 0x2fcc7: 0x6decfe20, + 0x2fcc8: 0x6ded0020, 0x2fcc9: 0x6e2c3820, 0x2fcca: 0x6e3a2020, 0x2fccb: 0x6c26a020, + 0x2fccc: 0x6c606e20, 0x2fccd: 0x6c862e20, 0x2fcce: 0x6c863020, 0x2fccf: 0x6caff420, + 0x2fcd0: 0x6caff620, 0x2fcd1: 0x6caff820, 0x2fcd2: 0x6caffa20, 0x2fcd3: 0x6caffc20, + 0x2fcd4: 0x6caffe20, 0x2fcd5: 0x6cdf1220, 0x2fcd6: 0x6ca6aa20, 0x2fcd7: 0x6cdf1420, + 0x2fcd8: 0x6cdf1620, 0x2fcd9: 0x6cdf0820, 0x2fcda: 0x6cdf1820, 0x2fcdb: 0x6d0d8020, + 0x2fcdc: 0x6d0d8220, 0x2fcdd: 0x6d3bf020, 0x2fcde: 0x6d3bf220, 0x2fcdf: 0x6d3bf420, + 0x2fce0: 0x6d3bf620, 0x2fce1: 0x6d3bf820, 0x2fce2: 0x6d67fc20, 0x2fce3: 0x6d67fe20, + 0x2fce4: 0x6d680020, 0x2fce5: 0x6d680220, 0x2fce6: 0x6d91ca20, 0x2fce7: 0x6d91cc20, + 0x2fce8: 0x6d91ce20, 0x2fce9: 0x6d683220, 0x2fcea: 0x6d91d020, 0x2fceb: 0x6db58620, + 0x2fcec: 0x6db58820, 0x2fced: 0x6db58a20, 0x2fcee: 0x6db58c20, 0x2fcef: 0x6db58e20, + 0x2fcf0: 0x6dd41820, 0x2fcf1: 0x6dd41a20, 0x2fcf2: 0x6dd41c20, 0x2fcf3: 0x6dd41e20, + 0x2fcf4: 0x6ded0e20, 0x2fcf5: 0x6ded1020, 0x2fcf6: 0x6ded1220, 0x2fcf7: 0x6ded1420, + 0x2fcf8: 0x6ded1620, 0x2fcf9: 0x6e021a20, 0x2fcfa: 0x6e021c20, 0x2fcfb: 0x6e021e20, + 0x2fcfc: 0x6e13fe20, 0x2fcfd: 0x6e140020, 0x2fcfe: 0x6e21a220, 0x2fcff: 0x6e21a420, + // Block 0xbf4, offset 0x2fd00 + 0x2fd00: 0x6e3a2420, 0x2fd01: 0x6c050c20, 0x2fd02: 0x6c14da20, 0x2fd03: 0x6c26a220, + 0x2fd04: 0x6c407220, 0x2fd05: 0x6c407420, 0x2fd06: 0x6c5adc20, 0x2fd07: 0x6c607220, + 0x2fd08: 0x6c607420, 0x2fd09: 0x6c607620, 0x2fd0a: 0x6c863e20, 0x2fd0b: 0x6cb01c20, + 0x2fd0c: 0x6cdf3420, 0x2fd0d: 0x6cdf3620, 0x2fd0e: 0x6d0dac20, 0x2fd0f: 0x6d3c1e20, + 0x2fd10: 0x6d683420, 0x2fd11: 0x6d683620, 0x2fd12: 0x6c26a620, 0x2fd13: 0x6c607c20, + 0x2fd14: 0x6c607e20, 0x2fd15: 0x6cb02020, 0x2fd16: 0x6cb02220, 0x2fd17: 0x6cb02420, + 0x2fd18: 0x6cb02620, 0x2fd19: 0x6cb02820, 0x2fd1a: 0x6cdf3820, 0x2fd1b: 0x6cdf3a20, + 0x2fd1c: 0x6d0db620, 0x2fd1d: 0x6cdf3c20, 0x2fd1e: 0x6cdf3e20, 0x2fd1f: 0x6d0db820, + 0x2fd20: 0x6d0dba20, 0x2fd21: 0x6d0dbc20, 0x2fd22: 0x6d0dbe20, 0x2fd23: 0x6d0dc020, + 0x2fd24: 0x6d0dc220, 0x2fd25: 0x6d0dc420, 0x2fd26: 0x6d0dc620, 0x2fd27: 0x6d0dc820, + 0x2fd28: 0x6d3c2220, 0x2fd29: 0x6d3c2420, 0x2fd2a: 0x6d3c2620, 0x2fd2b: 0x6d3c2820, + 0x2fd2c: 0x6d684420, 0x2fd2d: 0x6d684620, 0x2fd2e: 0x6d684820, 0x2fd2f: 0x6d684a20, + 0x2fd30: 0x6d687a20, 0x2fd31: 0x6d920a20, 0x2fd32: 0x6db5ac20, 0x2fd33: 0x6db5ae20, + 0x2fd34: 0x6dd43820, 0x2fd35: 0x6ded2a20, 0x2fd36: 0x6ded2c20, 0x2fd37: 0x6e023220, + 0x2fd38: 0x6e023420, 0x2fd39: 0x6e023620, 0x2fd3a: 0x6e140a20, 0x2fd3b: 0x6e21b420, + 0x2fd3c: 0x6e21b620, 0x2fd3d: 0x6e2c3c20, 0x2fd3e: 0x6e2c3e20, 0x2fd3f: 0x6e3a3820, + // Block 0xbf5, offset 0x2fd40 + 0x2fd40: 0x6c26aa20, 0x2fd41: 0x6c26ac20, 0x2fd42: 0x6c608c20, 0x2fd43: 0x6c608e20, + 0x2fd44: 0x6c609020, 0x2fd45: 0x6c609220, 0x2fd46: 0x6c609420, 0x2fd47: 0x6c609620, + 0x2fd48: 0x6c609820, 0x2fd49: 0x6c864e20, 0x2fd4a: 0x6c865020, 0x2fd4b: 0x6c865220, + 0x2fd4c: 0x6c865420, 0x2fd4d: 0x6c865620, 0x2fd4e: 0x6c865820, 0x2fd4f: 0x6c865a20, + 0x2fd50: 0x6c865c20, 0x2fd51: 0x6c865e20, 0x2fd52: 0x6c866020, 0x2fd53: 0x6c866220, + 0x2fd54: 0x6c866420, 0x2fd55: 0x6c866620, 0x2fd56: 0x6c866820, 0x2fd57: 0x6c866a20, + 0x2fd58: 0x6c866c20, 0x2fd59: 0x6c866e20, 0x2fd5a: 0x6c867020, 0x2fd5b: 0x6cb07820, + 0x2fd5c: 0x6cb07a20, 0x2fd5d: 0x6cb07c20, 0x2fd5e: 0x6cb07e20, 0x2fd5f: 0x6cb08020, + 0x2fd60: 0x6cb08220, 0x2fd61: 0x6cb08420, 0x2fd62: 0x6cb08620, 0x2fd63: 0x6cb08820, + 0x2fd64: 0x6cb08a20, 0x2fd65: 0x6cb08c20, 0x2fd66: 0x6cb08e20, 0x2fd67: 0x6cb09020, + 0x2fd68: 0x6cb09220, 0x2fd69: 0x6cb09420, 0x2fd6a: 0x6cb09620, 0x2fd6b: 0x6cb09820, + 0x2fd6c: 0x6cb09a20, 0x2fd6d: 0x6cb09c20, 0x2fd6e: 0x6cb09e20, 0x2fd6f: 0x6cb0a020, + 0x2fd70: 0x6cb0a220, 0x2fd71: 0x6cb0a420, 0x2fd72: 0x6cb0a620, 0x2fd73: 0x6cb0a820, + 0x2fd74: 0x6cdf8020, 0x2fd75: 0x6cdf8220, 0x2fd76: 0x6cdf8420, 0x2fd77: 0x6cdf8620, + 0x2fd78: 0x6cdf8820, 0x2fd79: 0x6cdf8a20, 0x2fd7a: 0x6cdf8c20, 0x2fd7b: 0x6cdf8e20, + 0x2fd7c: 0x6cdf9020, 0x2fd7d: 0x6cdf9220, 0x2fd7e: 0x6d0ddc20, 0x2fd7f: 0x6d0dde20, + // Block 0xbf6, offset 0x2fd80 + 0x2fd80: 0x6cdf9420, 0x2fd81: 0x6cdf9620, 0x2fd82: 0x6cdf9820, 0x2fd83: 0x6cdf9a20, + 0x2fd84: 0x6cdf9c20, 0x2fd85: 0x6cdf9e20, 0x2fd86: 0x6cdfa020, 0x2fd87: 0x6cdfa220, + 0x2fd88: 0x6cdfa420, 0x2fd89: 0x6cdfa620, 0x2fd8a: 0x6cdfa820, 0x2fd8b: 0x6cdfaa20, + 0x2fd8c: 0x6cdfac20, 0x2fd8d: 0x6cdfae20, 0x2fd8e: 0x6cdfb020, 0x2fd8f: 0x6cdfb220, + 0x2fd90: 0x6cdfb420, 0x2fd91: 0x6cdfb620, 0x2fd92: 0x6cdfb820, 0x2fd93: 0x6cdfba20, + 0x2fd94: 0x6cdfbc20, 0x2fd95: 0x6cdfbe20, 0x2fd96: 0x6cdfc020, 0x2fd97: 0x6cdfc220, + 0x2fd98: 0x6cdfc420, 0x2fd99: 0x6cdfc620, 0x2fd9a: 0x6cdfc820, 0x2fd9b: 0x6cdfca20, + 0x2fd9c: 0x6cdfcc20, 0x2fd9d: 0x6cdfce20, 0x2fd9e: 0x6cdfd020, 0x2fd9f: 0x6cdfd220, + 0x2fda0: 0x6cdfd420, 0x2fda1: 0x6d0df220, 0x2fda2: 0x6d0df420, 0x2fda3: 0x6d0df620, + 0x2fda4: 0x6d0df820, 0x2fda5: 0x6d0dfa20, 0x2fda6: 0x6d0dfc20, 0x2fda7: 0x6d0dfe20, + 0x2fda8: 0x6d0e0020, 0x2fda9: 0x6d0e0220, 0x2fdaa: 0x6d0e0420, 0x2fdab: 0x6d0e0620, + 0x2fdac: 0x6d0e0820, 0x2fdad: 0x6d0e0a20, 0x2fdae: 0x6d0e0c20, 0x2fdaf: 0x6d0e0e20, + 0x2fdb0: 0x6d0e1020, 0x2fdb1: 0x6d0e1220, 0x2fdb2: 0x6d0e1420, 0x2fdb3: 0x6d0e1620, + 0x2fdb4: 0x6d0e1820, 0x2fdb5: 0x6d0e1a20, 0x2fdb6: 0x6d0e1c20, 0x2fdb7: 0x6d0e1e20, + 0x2fdb8: 0x6d0e2020, 0x2fdb9: 0x6d0e2220, 0x2fdba: 0x6d0e2420, 0x2fdbb: 0x6d0e2620, + 0x2fdbc: 0x6d0e2820, 0x2fdbd: 0x6d0e2a20, 0x2fdbe: 0x6d0e2c20, 0x2fdbf: 0x6d0e2e20, + // Block 0xbf7, offset 0x2fdc0 + 0x2fdc0: 0x6d0e3020, 0x2fdc1: 0x6d0e3220, 0x2fdc2: 0x6d0e3420, 0x2fdc3: 0x6d0e3620, + 0x2fdc4: 0x6d0e3820, 0x2fdc5: 0x6d0e3a20, 0x2fdc6: 0x6d0e3c20, 0x2fdc7: 0x6d0e3e20, + 0x2fdc8: 0x6d0e4020, 0x2fdc9: 0x6d0e4220, 0x2fdca: 0x6d0e4420, 0x2fdcb: 0x6d3c5a20, + 0x2fdcc: 0x6d3c5c20, 0x2fdcd: 0x6d3c5e20, 0x2fdce: 0x6d3c6020, 0x2fdcf: 0x6d3c6220, + 0x2fdd0: 0x6d3c6420, 0x2fdd1: 0x6d3c6620, 0x2fdd2: 0x6d3c6820, 0x2fdd3: 0x6d3c6a20, + 0x2fdd4: 0x6d3c6c20, 0x2fdd5: 0x6d687c20, 0x2fdd6: 0x6d3c6e20, 0x2fdd7: 0x6d3c7020, + 0x2fdd8: 0x6d3c7220, 0x2fdd9: 0x6d3c7420, 0x2fdda: 0x6d3c7620, 0x2fddb: 0x6d3c7820, + 0x2fddc: 0x6d3c7a20, 0x2fddd: 0x6d3c7c20, 0x2fdde: 0x6d3c7e20, 0x2fddf: 0x6d3c8020, + 0x2fde0: 0x6d0e4620, 0x2fde1: 0x6d3c8220, 0x2fde2: 0x6d3c8420, 0x2fde3: 0x6d3c8620, + 0x2fde4: 0x6d3c8820, 0x2fde5: 0x6d3c8a20, 0x2fde6: 0x6d3c8c20, 0x2fde7: 0x6d3c8e20, + 0x2fde8: 0x6d3c9020, 0x2fde9: 0x6d3c9220, 0x2fdea: 0x6d3c9420, 0x2fdeb: 0x6d3c9620, + 0x2fdec: 0x6d3c9820, 0x2fded: 0x6d3c9a20, 0x2fdee: 0x6d3c9c20, 0x2fdef: 0x6d689e20, + 0x2fdf0: 0x6d68a020, 0x2fdf1: 0x6d68a220, 0x2fdf2: 0x6d68a420, 0x2fdf3: 0x6d68a620, + 0x2fdf4: 0x6d68a820, 0x2fdf5: 0x6d68aa20, 0x2fdf6: 0x6d68ac20, 0x2fdf7: 0x6d68ae20, + 0x2fdf8: 0x6d68b020, 0x2fdf9: 0x6d68b220, 0x2fdfa: 0x6d68b420, 0x2fdfb: 0x6d68b620, + 0x2fdfc: 0x6d68b820, 0x2fdfd: 0x6d68ba20, 0x2fdfe: 0x6d68bc20, 0x2fdff: 0x6d68be20, + // Block 0xbf8, offset 0x2fe00 + 0x2fe00: 0x6d68c020, 0x2fe01: 0x6d68c220, 0x2fe02: 0x6d68c420, 0x2fe03: 0x6d68c620, + 0x2fe04: 0x6d68c820, 0x2fe05: 0x6d68ca20, 0x2fe06: 0x6d68cc20, 0x2fe07: 0x6d68ce20, + 0x2fe08: 0x6d68d020, 0x2fe09: 0x6d68d220, 0x2fe0a: 0x6d68d420, 0x2fe0b: 0x6d68d620, + 0x2fe0c: 0x6d68d820, 0x2fe0d: 0x6d68da20, 0x2fe0e: 0x6d68dc20, 0x2fe0f: 0x6d68de20, + 0x2fe10: 0x6d68e020, 0x2fe11: 0x6d68e220, 0x2fe12: 0x6d68e420, 0x2fe13: 0x6d68e620, + 0x2fe14: 0x6d68e820, 0x2fe15: 0x6d68ea20, 0x2fe16: 0x6d68ec20, 0x2fe17: 0x6d68ee20, + 0x2fe18: 0x6d68f020, 0x2fe19: 0x6d68f220, 0x2fe1a: 0x6d68f420, 0x2fe1b: 0x6d697620, + 0x2fe1c: 0x6d923c20, 0x2fe1d: 0x6d923e20, 0x2fe1e: 0x6d924020, 0x2fe1f: 0x6d924220, + 0x2fe20: 0x6d924420, 0x2fe21: 0x6d924620, 0x2fe22: 0x6d924820, 0x2fe23: 0x6d924a20, + 0x2fe24: 0x6d924c20, 0x2fe25: 0x6d924e20, 0x2fe26: 0x6d925020, 0x2fe27: 0x6d925220, + 0x2fe28: 0x6d925420, 0x2fe29: 0x6d68f620, 0x2fe2a: 0x6d925620, 0x2fe2b: 0x6d925820, + 0x2fe2c: 0x6d925a20, 0x2fe2d: 0x6d925c20, 0x2fe2e: 0x6d925e20, 0x2fe2f: 0x6d926020, + 0x2fe30: 0x6d926220, 0x2fe31: 0x6d926420, 0x2fe32: 0x6d926620, 0x2fe33: 0x6d926820, + 0x2fe34: 0x6d926a20, 0x2fe35: 0x6d926c20, 0x2fe36: 0x6d926e20, 0x2fe37: 0x6d927020, + 0x2fe38: 0x6d697820, 0x2fe39: 0x6d927220, 0x2fe3a: 0x6d927420, 0x2fe3b: 0x6d927620, + 0x2fe3c: 0x6d927820, 0x2fe3d: 0x6d927a20, 0x2fe3e: 0x6d927c20, 0x2fe3f: 0x6d927e20, + // Block 0xbf9, offset 0x2fe40 + 0x2fe40: 0x6d928020, 0x2fe41: 0x6d928220, 0x2fe42: 0x6d928420, 0x2fe43: 0x6d928620, + 0x2fe44: 0x6db5e020, 0x2fe45: 0x6db5e220, 0x2fe46: 0x6db5e420, 0x2fe47: 0x6db5e620, + 0x2fe48: 0x6db5e820, 0x2fe49: 0x6db5ea20, 0x2fe4a: 0x6db5ec20, 0x2fe4b: 0x6db5ee20, + 0x2fe4c: 0x6db5f020, 0x2fe4d: 0x6db5f220, 0x2fe4e: 0x6db5f420, 0x2fe4f: 0x6db5f620, + 0x2fe50: 0x6db5f820, 0x2fe51: 0x6db5fa20, 0x2fe52: 0x6db5fc20, 0x2fe53: 0x6db5fe20, + 0x2fe54: 0x6d92fc20, 0x2fe55: 0x6db60020, 0x2fe56: 0x6db60220, 0x2fe57: 0x6db60420, + 0x2fe58: 0x6db60620, 0x2fe59: 0x6db60820, 0x2fe5a: 0x6db60a20, 0x2fe5b: 0x6db60c20, + 0x2fe5c: 0x6db60e20, 0x2fe5d: 0x6db61020, 0x2fe5e: 0x6db61220, 0x2fe5f: 0x6db61420, + 0x2fe60: 0x6db61620, 0x2fe61: 0x6db61820, 0x2fe62: 0x6db61a20, 0x2fe63: 0x6dd46220, + 0x2fe64: 0x6dd46420, 0x2fe65: 0x6dd46620, 0x2fe66: 0x6dd46820, 0x2fe67: 0x6dd46a20, + 0x2fe68: 0x6dd46c20, 0x2fe69: 0x6dd46e20, 0x2fe6a: 0x6dd47020, 0x2fe6b: 0x6dd47220, + 0x2fe6c: 0x6dd47420, 0x2fe6d: 0x6dd47620, 0x2fe6e: 0x6dd47820, 0x2fe6f: 0x6dd47a20, + 0x2fe70: 0x6dd47c20, 0x2fe71: 0x6dd47e20, 0x2fe72: 0x6dd48020, 0x2fe73: 0x6dd48220, + 0x2fe74: 0x6dd48420, 0x2fe75: 0x6dd48620, 0x2fe76: 0x6dd48820, 0x2fe77: 0x6dd48a20, + 0x2fe78: 0x6dd48c20, 0x2fe79: 0x6dd48e20, 0x2fe7a: 0x6dd49020, 0x2fe7b: 0x6dd49220, + 0x2fe7c: 0x6dd49420, 0x2fe7d: 0x6dd49620, 0x2fe7e: 0x6dd49820, 0x2fe7f: 0x6ded5020, + // Block 0xbfa, offset 0x2fe80 + 0x2fe80: 0x6ded5220, 0x2fe81: 0x6ded5420, 0x2fe82: 0x6ded5620, 0x2fe83: 0x6ded5820, + 0x2fe84: 0x6ded5a20, 0x2fe85: 0x6e141420, 0x2fe86: 0x6ded5c20, 0x2fe87: 0x6dd4fa20, + 0x2fe88: 0x6ded5e20, 0x2fe89: 0x6ded6020, 0x2fe8a: 0x6ded6220, 0x2fe8b: 0x6ded6420, + 0x2fe8c: 0x6ded6620, 0x2fe8d: 0x6e024e20, 0x2fe8e: 0x6ded6820, 0x2fe8f: 0x6ded6a20, + 0x2fe90: 0x6ded6c20, 0x2fe91: 0x6ded6e20, 0x2fe92: 0x6ded7020, 0x2fe93: 0x6ded7220, + 0x2fe94: 0x6ded7420, 0x2fe95: 0x6ded7620, 0x2fe96: 0x6ded7820, 0x2fe97: 0x6ded7a20, + 0x2fe98: 0x6ded7c20, 0x2fe99: 0x6ded7e20, 0x2fe9a: 0x6ded8020, 0x2fe9b: 0x6ded8220, + 0x2fe9c: 0x6ded8420, 0x2fe9d: 0x6e025020, 0x2fe9e: 0x6e025220, 0x2fe9f: 0x6e025420, + 0x2fea0: 0x6e025620, 0x2fea1: 0x6e025820, 0x2fea2: 0x6e025a20, 0x2fea3: 0x6e025c20, + 0x2fea4: 0x6e025e20, 0x2fea5: 0x6e026020, 0x2fea6: 0x6e026220, 0x2fea7: 0x6e026420, + 0x2fea8: 0x6e026620, 0x2fea9: 0x6e026820, 0x2feaa: 0x6e026a20, 0x2feab: 0x6e026c20, + 0x2feac: 0x6e026e20, 0x2fead: 0x6e027020, 0x2feae: 0x6e027220, 0x2feaf: 0x6e027420, + 0x2feb0: 0x6e027620, 0x2feb1: 0x6e027820, 0x2feb2: 0x6e027a20, 0x2feb3: 0x6e142220, + 0x2feb4: 0x6e142420, 0x2feb5: 0x6e142620, 0x2feb6: 0x6e142820, 0x2feb7: 0x6e142a20, + 0x2feb8: 0x6e142c20, 0x2feb9: 0x6e142e20, 0x2feba: 0x6e143020, 0x2febb: 0x6e143220, + 0x2febc: 0x6e143420, 0x2febd: 0x6e143620, 0x2febe: 0x6e21c820, 0x2febf: 0x6e21ca20, + // Block 0xbfb, offset 0x2fec0 + 0x2fec0: 0x6e21cc20, 0x2fec1: 0x6e21ce20, 0x2fec2: 0x6e21d020, 0x2fec3: 0x6e21d220, + 0x2fec4: 0x6e21d420, 0x2fec5: 0x6e21d620, 0x2fec6: 0x6e221420, 0x2fec7: 0x6e2c4620, + 0x2fec8: 0x6e2c4820, 0x2fec9: 0x6e2c4a20, 0x2feca: 0x6e2c4c20, 0x2fecb: 0x6e2c4e20, + 0x2fecc: 0x6e2c5020, 0x2fecd: 0x6e2c5220, 0x2fece: 0x6e2c5420, 0x2fecf: 0x6e2c5620, + 0x2fed0: 0x6e2c5820, 0x2fed1: 0x6e347c20, 0x2fed2: 0x6e347e20, 0x2fed3: 0x6e348020, + 0x2fed4: 0x6e348220, 0x2fed5: 0x6e348420, 0x2fed6: 0x6e348620, 0x2fed7: 0x6e3a3c20, + 0x2fed8: 0x6e3a3e20, 0x2fed9: 0x6e3a4020, 0x2feda: 0x6e3e3420, 0x2fedb: 0x6e3e3620, + 0x2fedc: 0x6e410420, 0x2fedd: 0x6e410620, 0x2fede: 0x6e410820, 0x2fedf: 0x6e448020, + 0x2fee0: 0x6c00c820, 0x2fee1: 0x6c050e20, 0x2fee2: 0x6c051020, 0x2fee3: 0x6c051220, + 0x2fee4: 0x6c051420, 0x2fee5: 0x6c051620, 0x2fee6: 0x6c0a6420, 0x2fee7: 0x6c0a6620, + 0x2fee8: 0x6c0a6820, 0x2fee9: 0x6c0a6a20, 0x2feea: 0x6c0a6c20, 0x2feeb: 0x6c0a6e20, + 0x2feec: 0x6c0a7020, 0x2feed: 0x6c0a7220, 0x2feee: 0x6c0a7420, 0x2feef: 0x6c0a7620, + 0x2fef0: 0x6c0a7820, 0x2fef1: 0x6c0a7a20, 0x2fef2: 0x6c14dc20, 0x2fef3: 0x6c14de20, + 0x2fef4: 0x6c14e020, 0x2fef5: 0x6c14e220, 0x2fef6: 0x6c14e420, 0x2fef7: 0x6c14e620, + 0x2fef8: 0x6c14e820, 0x2fef9: 0x6c14ea20, 0x2fefa: 0x6c14ec20, 0x2fefb: 0x6c14ee20, + 0x2fefc: 0x6c14f020, 0x2fefd: 0x6c14f220, 0x2fefe: 0x6c14f420, 0x2feff: 0x6c14f620, + // Block 0xbfc, offset 0x2ff00 + 0x2ff00: 0x6c14f820, 0x2ff01: 0x6c26b220, 0x2ff02: 0x6c26b420, 0x2ff03: 0x6c26b620, + 0x2ff04: 0x6c26b820, 0x2ff05: 0x6c26ba20, 0x2ff06: 0x6c26bc20, 0x2ff07: 0x6c26be20, + 0x2ff08: 0x6c26c020, 0x2ff09: 0x6c26c220, 0x2ff0a: 0x6c26c420, 0x2ff0b: 0x6c26c620, + 0x2ff0c: 0x6c26c820, 0x2ff0d: 0x6c26ca20, 0x2ff0e: 0x6c26cc20, 0x2ff0f: 0x6c26ce20, + 0x2ff10: 0x6c26d020, 0x2ff11: 0x6c26d220, 0x2ff12: 0x6c26d420, 0x2ff13: 0x6c407e20, + 0x2ff14: 0x6c408020, 0x2ff15: 0x6c408220, 0x2ff16: 0x6c408420, 0x2ff17: 0x6c408620, + 0x2ff18: 0x6c408820, 0x2ff19: 0x6c408a20, 0x2ff1a: 0x6c408c20, 0x2ff1b: 0x6c408e20, + 0x2ff1c: 0x6c409020, 0x2ff1d: 0x6c409220, 0x2ff1e: 0x6c409420, 0x2ff1f: 0x6c409620, + 0x2ff20: 0x6c409820, 0x2ff21: 0x6c409a20, 0x2ff22: 0x6c409c20, 0x2ff23: 0x6c409e20, + 0x2ff24: 0x6c40a020, 0x2ff25: 0x6c40a220, 0x2ff26: 0x6c40a420, 0x2ff27: 0x6c40a620, + 0x2ff28: 0x6c40a820, 0x2ff29: 0x6c40aa20, 0x2ff2a: 0x6c609c20, 0x2ff2b: 0x6c609e20, + 0x2ff2c: 0x6c60a020, 0x2ff2d: 0x6c60a220, 0x2ff2e: 0x6c60a420, 0x2ff2f: 0x6c60a620, + 0x2ff30: 0x6c60a820, 0x2ff31: 0x6c60aa20, 0x2ff32: 0x6c60ac20, 0x2ff33: 0x6c60ae20, + 0x2ff34: 0x6c60b020, 0x2ff35: 0x6c60b220, 0x2ff36: 0x6c60b420, 0x2ff37: 0x6c869020, + 0x2ff38: 0x6c869220, 0x2ff39: 0x6c869420, 0x2ff3a: 0x6c869620, 0x2ff3b: 0x6c869820, + 0x2ff3c: 0x6c869a20, 0x2ff3d: 0x6c869c20, 0x2ff3e: 0x6c869e20, 0x2ff3f: 0x6c86a020, + // Block 0xbfd, offset 0x2ff40 + 0x2ff40: 0x6c86a220, 0x2ff41: 0x6c86a420, 0x2ff42: 0x6c86a620, 0x2ff43: 0x6c86a820, + 0x2ff44: 0x6c86aa20, 0x2ff45: 0x6c86ac20, 0x2ff46: 0x6c86ae20, 0x2ff47: 0x6c86b020, + 0x2ff48: 0x6c86b220, 0x2ff49: 0x6c86b420, 0x2ff4a: 0x6c86b620, 0x2ff4b: 0x6cb10c20, + 0x2ff4c: 0x6cb10e20, 0x2ff4d: 0x6cb11020, 0x2ff4e: 0x6cb11220, 0x2ff4f: 0x6cb11420, + 0x2ff50: 0x6cb11620, 0x2ff51: 0x6cb11820, 0x2ff52: 0x6cb11a20, 0x2ff53: 0x6cb11c20, + 0x2ff54: 0x6cb11e20, 0x2ff55: 0x6cb12020, 0x2ff56: 0x6cb12220, 0x2ff57: 0x6cb12420, + 0x2ff58: 0x6cb12620, 0x2ff59: 0x6cb12820, 0x2ff5a: 0x6cb12a20, 0x2ff5b: 0x6cb12c20, + 0x2ff5c: 0x6cb12e20, 0x2ff5d: 0x6cb13020, 0x2ff5e: 0x6cb13220, 0x2ff5f: 0x6ce02c20, + 0x2ff60: 0x6ce02e20, 0x2ff61: 0x6ce03020, 0x2ff62: 0x6ce03220, 0x2ff63: 0x6ce03420, + 0x2ff64: 0x6ce03620, 0x2ff65: 0x6ce03820, 0x2ff66: 0x6ce03a20, 0x2ff67: 0x6ce03c20, + 0x2ff68: 0x6d0eb420, 0x2ff69: 0x6d0eb620, 0x2ff6a: 0x6d0eb820, 0x2ff6b: 0x6d0eba20, + 0x2ff6c: 0x6d0ebc20, 0x2ff6d: 0x6d3d0620, 0x2ff6e: 0x6d3d0820, 0x2ff6f: 0x6d3d0a20, + 0x2ff70: 0x6d3d0c20, 0x2ff71: 0x6d3d0e20, 0x2ff72: 0x6d3d1020, 0x2ff73: 0x6d697c20, + 0x2ff74: 0x6d697e20, 0x2ff75: 0x6d698020, 0x2ff76: 0x6dede020, 0x2ff77: 0x6c26e620, + 0x2ff78: 0x6c86c620, 0x2ff79: 0x6cb14020, 0x2ff7a: 0x6cb14220, 0x2ff7b: 0x6cb14420, + 0x2ff7c: 0x6d0ec220, 0x2ff7d: 0x6d3d1820, 0x2ff7e: 0x6d698620, 0x2ff7f: 0x6db6a020, + // Block 0xbfe, offset 0x2ff80 + 0x2ff80: 0x6db6a220, 0x2ff81: 0x6db6a420, 0x2ff82: 0x6dd50020, 0x2ff83: 0x6dede220, + 0x2ff84: 0x6e221820, 0x2ff85: 0x6e2c7820, 0x2ff86: 0x6c26ea20, 0x2ff87: 0x6c86ce20, + 0x2ff88: 0x6c86d020, 0x2ff89: 0x6cb15220, 0x2ff8a: 0x6d0ecc20, 0x2ff8b: 0x6d0ece20, + 0x2ff8c: 0x6d699820, 0x2ff8d: 0x6d699a20, 0x2ff8e: 0x6d699c20, 0x2ff8f: 0x6db6b420, + 0x2ff90: 0x6dd50420, 0x2ff91: 0x6e02ba20, 0x2ff92: 0x6e3a5620, 0x2ff93: 0x6e411420, + 0x2ff94: 0x6e431e20, 0x2ff95: 0x6c26ec20, 0x2ff96: 0x6c40b820, 0x2ff97: 0x6c86da20, + 0x2ff98: 0x6cb15c20, 0x2ff99: 0x6cb15e20, 0x2ff9a: 0x6cb16020, 0x2ff9b: 0x6cb16220, + 0x2ff9c: 0x6cb16420, 0x2ff9d: 0x6cb16620, 0x2ff9e: 0x6ce05e20, 0x2ff9f: 0x6ce06020, + 0x2ffa0: 0x6ce06220, 0x2ffa1: 0x6ce06420, 0x2ffa2: 0x6d0ed820, 0x2ffa3: 0x6d0eda20, + 0x2ffa4: 0x6d0edc20, 0x2ffa5: 0x6d0ede20, 0x2ffa6: 0x6d0ee020, 0x2ffa7: 0x6d3d2c20, + 0x2ffa8: 0x6d3d2e20, 0x2ffa9: 0x6d3d3020, 0x2ffaa: 0x6d3d3220, 0x2ffab: 0x6d932420, + 0x2ffac: 0x6d69da20, 0x2ffad: 0x6d932620, 0x2ffae: 0x6d932820, 0x2ffaf: 0x6db6c620, + 0x2ffb0: 0x6db6c820, 0x2ffb1: 0x6db6ca20, 0x2ffb2: 0x6db6cc20, 0x2ffb3: 0x6db6ce20, + 0x2ffb4: 0x6dd51620, 0x2ffb5: 0x6dd51820, 0x2ffb6: 0x6dee1620, 0x2ffb7: 0x6dee0a20, + 0x2ffb8: 0x6c26f220, 0x2ffb9: 0x6c86e420, 0x2ffba: 0x6c86e620, 0x2ffbb: 0x6c86e820, + 0x2ffbc: 0x6cb18020, 0x2ffbd: 0x6cb18220, 0x2ffbe: 0x6ce07e20, 0x2ffbf: 0x6ce08020, + // Block 0xbff, offset 0x2ffc0 + 0x2ffc0: 0x6ce08220, 0x2ffc1: 0x6ce08420, 0x2ffc2: 0x6ce08620, 0x2ffc3: 0x6ce08820, + 0x2ffc4: 0x6d0efe20, 0x2ffc5: 0x6d0f0020, 0x2ffc6: 0x6d0f0220, 0x2ffc7: 0x6d0f0420, + 0x2ffc8: 0x6d0f0620, 0x2ffc9: 0x6d0f0820, 0x2ffca: 0x6d0f0a20, 0x2ffcb: 0x6d3d5020, + 0x2ffcc: 0x6d3d5220, 0x2ffcd: 0x6d3d5420, 0x2ffce: 0x6d69e020, 0x2ffcf: 0x6d69e220, + 0x2ffd0: 0x6d934220, 0x2ffd1: 0x6d934420, 0x2ffd2: 0x6d934620, 0x2ffd3: 0x6d934820, + 0x2ffd4: 0x6db6e420, 0x2ffd5: 0x6db6e620, 0x2ffd6: 0x6db6e820, 0x2ffd7: 0x6dd52c20, + 0x2ffd8: 0x6dd52e20, 0x2ffd9: 0x6dd53020, 0x2ffda: 0x6dee2020, 0x2ffdb: 0x6e3a6620, + 0x2ffdc: 0x6e411c20, 0x2ffdd: 0x6c26f420, 0x2ffde: 0x6c60c820, 0x2ffdf: 0x6c60ca20, + 0x2ffe0: 0x6c60cc20, 0x2ffe1: 0x6c86f020, 0x2ffe2: 0x6c86f220, 0x2ffe3: 0x6c86f420, + 0x2ffe4: 0x6c86f620, 0x2ffe5: 0x6cb19820, 0x2ffe6: 0x6cb19a20, 0x2ffe7: 0x6cb19c20, + 0x2ffe8: 0x6cb19e20, 0x2ffe9: 0x6cb1a020, 0x2ffea: 0x6cb1a220, 0x2ffeb: 0x6cb1a420, + 0x2ffec: 0x6cb1a620, 0x2ffed: 0x6cb1a820, 0x2ffee: 0x6cb1aa20, 0x2ffef: 0x6ce0bc20, + 0x2fff0: 0x6ce0be20, 0x2fff1: 0x6ce0c020, 0x2fff2: 0x6d0f2620, 0x2fff3: 0x6ce0c220, + 0x2fff4: 0x6ce0c420, 0x2fff5: 0x6ce0c620, 0x2fff6: 0x6ce0c820, 0x2fff7: 0x6ce0ca20, + 0x2fff8: 0x6ce0cc20, 0x2fff9: 0x6ce0ce20, 0x2fffa: 0x6ce0d020, 0x2fffb: 0x6ce0d220, + 0x2fffc: 0x6ce0d420, 0x2fffd: 0x6ce0d620, 0x2fffe: 0x6ce0d820, 0x2ffff: 0x6ce0da20, + // Block 0xc00, offset 0x30000 + 0x30000: 0x6ce0dc20, 0x30001: 0x6ce0de20, 0x30002: 0x6d0f2e20, 0x30003: 0x6d0f3020, + 0x30004: 0x6d0f3220, 0x30005: 0x6d0f3420, 0x30006: 0x6d0f3620, 0x30007: 0x6d0f3820, + 0x30008: 0x6d0f3a20, 0x30009: 0x6d0f3c20, 0x3000a: 0x6d0f3e20, 0x3000b: 0x6d0f4020, + 0x3000c: 0x6d0f4220, 0x3000d: 0x6d0f4420, 0x3000e: 0x6d0f4620, 0x3000f: 0x6d3d7c20, + 0x30010: 0x6d3d7e20, 0x30011: 0x6d3d8020, 0x30012: 0x6d3d8220, 0x30013: 0x6d3d8420, + 0x30014: 0x6d3d8620, 0x30015: 0x6d3d8820, 0x30016: 0x6d3d8a20, 0x30017: 0x6d3d8c20, + 0x30018: 0x6d3d8e20, 0x30019: 0x6d6a1420, 0x3001a: 0x6d6a1620, 0x3001b: 0x6d6a1820, + 0x3001c: 0x6d6a1a20, 0x3001d: 0x6d6a1c20, 0x3001e: 0x6d6a1e20, 0x3001f: 0x6d6a2020, + 0x30020: 0x6d6a2220, 0x30021: 0x6d6a2420, 0x30022: 0x6d6a2620, 0x30023: 0x6d6a2820, + 0x30024: 0x6d6a2a20, 0x30025: 0x6d6a2c20, 0x30026: 0x6d6a2e20, 0x30027: 0x6d6a3020, + 0x30028: 0x6d6a3220, 0x30029: 0x6d6a3420, 0x3002a: 0x6d6a3620, 0x3002b: 0x6d6a3820, + 0x3002c: 0x6d6a3a20, 0x3002d: 0x6d6a6c20, 0x3002e: 0x6d937220, 0x3002f: 0x6d937420, + 0x30030: 0x6d937620, 0x30031: 0x6d937820, 0x30032: 0x6d937a20, 0x30033: 0x6d937c20, + 0x30034: 0x6d937e20, 0x30035: 0x6d938020, 0x30036: 0x6db70820, 0x30037: 0x6db70a20, + 0x30038: 0x6db70c20, 0x30039: 0x6db70e20, 0x3003a: 0x6db71020, 0x3003b: 0x6db71220, + 0x3003c: 0x6db71420, 0x3003d: 0x6db71620, 0x3003e: 0x6dd54820, 0x3003f: 0x6dd54a20, + // Block 0xc01, offset 0x30040 + 0x30040: 0x6dd54c20, 0x30041: 0x6dc6ba20, 0x30042: 0x6dd54e20, 0x30043: 0x6dd55020, + 0x30044: 0x6dd55220, 0x30045: 0x6dd55420, 0x30046: 0x6dee3820, 0x30047: 0x6dee3a20, + 0x30048: 0x6dee3c20, 0x30049: 0x6dee3e20, 0x3004a: 0x6dee4020, 0x3004b: 0x6dee4220, + 0x3004c: 0x6dee4420, 0x3004d: 0x6e02e420, 0x3004e: 0x6e02e620, 0x3004f: 0x6e02e820, + 0x30050: 0x6e148420, 0x30051: 0x6e148620, 0x30052: 0x6e148820, 0x30053: 0x6e148a20, + 0x30054: 0x6e148c20, 0x30055: 0x6e223220, 0x30056: 0x6e223420, 0x30057: 0x6e223620, + 0x30058: 0x6e223820, 0x30059: 0x6e2c8c20, 0x3005a: 0x6e2c8e20, 0x3005b: 0x6e34b020, + 0x3005c: 0x6e3a6820, 0x3005d: 0x6c051820, 0x3005e: 0x6c150020, 0x3005f: 0x6c150220, + 0x30060: 0x6c150420, 0x30061: 0x6c26f620, 0x30062: 0x6c26f820, 0x30063: 0x6c40c020, + 0x30064: 0x6c40c220, 0x30065: 0x6c40c420, 0x30066: 0x6c40c620, 0x30067: 0x6c40c820, + 0x30068: 0x6c40ca20, 0x30069: 0x6c40cc20, 0x3006a: 0x6c40ce20, 0x3006b: 0x6c40d020, + 0x3006c: 0x6c40d220, 0x3006d: 0x6c40d420, 0x3006e: 0x6c40d620, 0x3006f: 0x6c40d820, + 0x30070: 0x6c60dc20, 0x30071: 0x6c60de20, 0x30072: 0x6c60e020, 0x30073: 0x6c60e220, + 0x30074: 0x6c60e420, 0x30075: 0x6c60e620, 0x30076: 0x6c60e820, 0x30077: 0x6c60ea20, + 0x30078: 0x6c60ec20, 0x30079: 0x6c60ee20, 0x3007a: 0x6c60f020, 0x3007b: 0x6c60f220, + 0x3007c: 0x6c871020, 0x3007d: 0x6c871220, 0x3007e: 0x6c871420, 0x3007f: 0x6c871620, + // Block 0xc02, offset 0x30080 + 0x30080: 0x6c871820, 0x30081: 0x6c871a20, 0x30082: 0x6c871c20, 0x30083: 0x6c871e20, + 0x30084: 0x6c872020, 0x30085: 0x6c872220, 0x30086: 0x6c872420, 0x30087: 0x6cb1dc20, + 0x30088: 0x6cb1de20, 0x30089: 0x6cb1e020, 0x3008a: 0x6cb1e220, 0x3008b: 0x6ce11820, + 0x3008c: 0x6ce11a20, 0x3008d: 0x6ce11c20, 0x3008e: 0x6ce11e20, 0x3008f: 0x6ce12020, + 0x30090: 0x6ce12220, 0x30091: 0x6ce12420, 0x30092: 0x6ce12620, 0x30093: 0x6ce12820, + 0x30094: 0x6ce12a20, 0x30095: 0x6ce12c20, 0x30096: 0x6d0f9220, 0x30097: 0x6d0f9420, + 0x30098: 0x6d3dc220, 0x30099: 0x6d3dc420, 0x3009a: 0x6d3dc620, 0x3009b: 0x6d3dc820, + 0x3009c: 0x6d6a7220, 0x3009d: 0x6d93c220, 0x3009e: 0x6d93c420, 0x3009f: 0x6d93c620, + 0x300a0: 0x6d93c820, 0x300a1: 0x6db74020, 0x300a2: 0x6db74220, 0x300a3: 0x6e14a420, + 0x300a4: 0x6c26fa20, 0x300a5: 0x6cb1e820, 0x300a6: 0x6cb1ea20, 0x300a7: 0x6cb1ec20, + 0x300a8: 0x6d0f9a20, 0x300a9: 0x6d0f9c20, 0x300aa: 0x6d0f9e20, 0x300ab: 0x6d3dce20, + 0x300ac: 0x6d93cc20, 0x300ad: 0x6d6a8220, 0x300ae: 0x6d93ce20, 0x300af: 0x6db74420, + 0x300b0: 0x6c26fc20, 0x300b1: 0x6c150620, 0x300b2: 0x6c60fe20, 0x300b3: 0x6c610020, + 0x300b4: 0x6c610220, 0x300b5: 0x6c610420, 0x300b6: 0x6c872e20, 0x300b7: 0x6c873020, + 0x300b8: 0x6c873220, 0x300b9: 0x6cb1fa20, 0x300ba: 0x6cb1fc20, 0x300bb: 0x6cb1fe20, + 0x300bc: 0x6cb20020, 0x300bd: 0x6cb20220, 0x300be: 0x6cb20420, 0x300bf: 0x6cb20620, + // Block 0xc03, offset 0x300c0 + 0x300c0: 0x6ce14e20, 0x300c1: 0x6ce15020, 0x300c2: 0x6ce15220, 0x300c3: 0x6ce15420, + 0x300c4: 0x6ce15620, 0x300c5: 0x6ce15820, 0x300c6: 0x6ce15a20, 0x300c7: 0x6ce15c20, + 0x300c8: 0x6ce15e20, 0x300c9: 0x6ce16020, 0x300ca: 0x6ce16220, 0x300cb: 0x6ce16420, + 0x300cc: 0x6d0fb420, 0x300cd: 0x6d0fb620, 0x300ce: 0x6d0fb820, 0x300cf: 0x6d0fba20, + 0x300d0: 0x6d0fbc20, 0x300d1: 0x6d0fbe20, 0x300d2: 0x6d0fc020, 0x300d3: 0x6d0fc220, + 0x300d4: 0x6d0fc420, 0x300d5: 0x6d3de820, 0x300d6: 0x6d3dea20, 0x300d7: 0x6d3dec20, + 0x300d8: 0x6d3dee20, 0x300d9: 0x6d3df020, 0x300da: 0x6d3df220, 0x300db: 0x6d6a9020, + 0x300dc: 0x6d6a9220, 0x300dd: 0x6d6a9420, 0x300de: 0x6d6a9620, 0x300df: 0x6d6a9820, + 0x300e0: 0x6d6a9a20, 0x300e1: 0x6d6a9c20, 0x300e2: 0x6d6a9e20, 0x300e3: 0x6d6aa020, + 0x300e4: 0x6d6aa220, 0x300e5: 0x6d93e420, 0x300e6: 0x6d93e620, 0x300e7: 0x6d93e820, + 0x300e8: 0x6db75620, 0x300e9: 0x6dd5dc20, 0x300ea: 0x6dee8820, 0x300eb: 0x6dee8a20, + 0x300ec: 0x6dee8c20, 0x300ed: 0x6dee8e20, 0x300ee: 0x6e031220, 0x300ef: 0x6e14b020, + 0x300f0: 0x6e14b220, 0x300f1: 0x6e2cb020, 0x300f2: 0x6e3e4a20, 0x300f3: 0x6c270220, + 0x300f4: 0x6c611a20, 0x300f5: 0x6c875420, 0x300f6: 0x6c875620, 0x300f7: 0x6c875820, + 0x300f8: 0x6c875a20, 0x300f9: 0x6cb24e20, 0x300fa: 0x6cb25020, 0x300fb: 0x6cb25220, + 0x300fc: 0x6d101620, 0x300fd: 0x6cb25420, 0x300fe: 0x6cb25620, 0x300ff: 0x6cb25820, + // Block 0xc04, offset 0x30100 + 0x30100: 0x6cb25a20, 0x30101: 0x6cb25c20, 0x30102: 0x6cb25e20, 0x30103: 0x6cb26020, + 0x30104: 0x6cb26220, 0x30105: 0x6ce1ba20, 0x30106: 0x6ce1bc20, 0x30107: 0x6ce1be20, + 0x30108: 0x6ce1c020, 0x30109: 0x6ce1c220, 0x3010a: 0x6ce1c420, 0x3010b: 0x6ce1c620, + 0x3010c: 0x6ce1c820, 0x3010d: 0x6ce1ca20, 0x3010e: 0x6ce1cc20, 0x3010f: 0x6ce1ce20, + 0x30110: 0x6d100820, 0x30111: 0x6ce1d020, 0x30112: 0x6ce1d220, 0x30113: 0x6ce1d420, + 0x30114: 0x6ce1d620, 0x30115: 0x6ce1d820, 0x30116: 0x6ce1da20, 0x30117: 0x6ce1dc20, + 0x30118: 0x6ce1de20, 0x30119: 0x6ce1e020, 0x3011a: 0x6ce1e220, 0x3011b: 0x6ce1e420, + 0x3011c: 0x6ce1e620, 0x3011d: 0x6ce1e820, 0x3011e: 0x6ce1ea20, 0x3011f: 0x6d101820, + 0x30120: 0x6d101a20, 0x30121: 0x6d101c20, 0x30122: 0x6d101e20, 0x30123: 0x6d102020, + 0x30124: 0x6d102220, 0x30125: 0x6d102420, 0x30126: 0x6d102620, 0x30127: 0x6d102820, + 0x30128: 0x6d102a20, 0x30129: 0x6d102c20, 0x3012a: 0x6d102e20, 0x3012b: 0x6d103020, + 0x3012c: 0x6d103220, 0x3012d: 0x6d103420, 0x3012e: 0x6d103620, 0x3012f: 0x6d103820, + 0x30130: 0x6d103a20, 0x30131: 0x6d103c20, 0x30132: 0x6d103e20, 0x30133: 0x6d104020, + 0x30134: 0x6d104220, 0x30135: 0x6ce1ec20, 0x30136: 0x6d104420, 0x30137: 0x6d104620, + 0x30138: 0x6d104820, 0x30139: 0x6d104a20, 0x3013a: 0x6d104c20, 0x3013b: 0x6d104e20, + 0x3013c: 0x6d3e4c20, 0x3013d: 0x6d3e4e20, 0x3013e: 0x6d3e5020, 0x3013f: 0x6d3e5220, + // Block 0xc05, offset 0x30140 + 0x30140: 0x6d3e5420, 0x30141: 0x6d3e5620, 0x30142: 0x6d3e5820, 0x30143: 0x6d3e5a20, + 0x30144: 0x6d3e5c20, 0x30145: 0x6d3e5e20, 0x30146: 0x6d3e6020, 0x30147: 0x6d3e6220, + 0x30148: 0x6d3e6420, 0x30149: 0x6d3e6620, 0x3014a: 0x6d3e6820, 0x3014b: 0x6d3e6a20, + 0x3014c: 0x6d3e6c20, 0x3014d: 0x6d3e6e20, 0x3014e: 0x6d3e7020, 0x3014f: 0x6d6afa20, + 0x30150: 0x6d6afc20, 0x30151: 0x6d6afe20, 0x30152: 0x6d6b0020, 0x30153: 0x6d6b0220, + 0x30154: 0x6d6b0420, 0x30155: 0x6d6b0620, 0x30156: 0x6d6b0820, 0x30157: 0x6d6b0a20, + 0x30158: 0x6d6b0c20, 0x30159: 0x6d6b0e20, 0x3015a: 0x6d6b1020, 0x3015b: 0x6d6b1220, + 0x3015c: 0x6d6b1420, 0x3015d: 0x6d6b1620, 0x3015e: 0x6d6b1820, 0x3015f: 0x6d6b1a20, + 0x30160: 0x6d6b1c20, 0x30161: 0x6d6b1e20, 0x30162: 0x6d6b2020, 0x30163: 0x6d6b2220, + 0x30164: 0x6d6b2420, 0x30165: 0x6d6b2620, 0x30166: 0x6d6b2820, 0x30167: 0x6d6b2a20, + 0x30168: 0x6d6b2c20, 0x30169: 0x6d6b2e20, 0x3016a: 0x6d6b3020, 0x3016b: 0x6d6b9820, + 0x3016c: 0x6d6b3220, 0x3016d: 0x6d6b3420, 0x3016e: 0x6d6b3620, 0x3016f: 0x6d6b3820, + 0x30170: 0x6d944620, 0x30171: 0x6d944820, 0x30172: 0x6d944a20, 0x30173: 0x6d944c20, + 0x30174: 0x6d944e20, 0x30175: 0x6d945020, 0x30176: 0x6d945220, 0x30177: 0x6d6b9a20, + 0x30178: 0x6d945420, 0x30179: 0x6d945620, 0x3017a: 0x6d6b3a20, 0x3017b: 0x6d945820, + 0x3017c: 0x6d945a20, 0x3017d: 0x6d945c20, 0x3017e: 0x6d945e20, 0x3017f: 0x6d946020, + // Block 0xc06, offset 0x30180 + 0x30180: 0x6d946220, 0x30181: 0x6d946420, 0x30182: 0x6d946620, 0x30183: 0x6d946820, + 0x30184: 0x6d946a20, 0x30185: 0x6d946c20, 0x30186: 0x6db79220, 0x30187: 0x6db79420, + 0x30188: 0x6db79620, 0x30189: 0x6db79820, 0x3018a: 0x6db79a20, 0x3018b: 0x6db79c20, + 0x3018c: 0x6db79e20, 0x3018d: 0x6db7a020, 0x3018e: 0x6db7a220, 0x3018f: 0x6db7a420, + 0x30190: 0x6db7a620, 0x30191: 0x6db7a820, 0x30192: 0x6db7aa20, 0x30193: 0x6db7ac20, + 0x30194: 0x6dd5e820, 0x30195: 0x6dd5ea20, 0x30196: 0x6dd5ec20, 0x30197: 0x6dd5ee20, + 0x30198: 0x6dd5f020, 0x30199: 0x6dd5f220, 0x3019a: 0x6dd5f420, 0x3019b: 0x6dd5f620, + 0x3019c: 0x6dd5f820, 0x3019d: 0x6dd5fa20, 0x3019e: 0x6dd5fc20, 0x3019f: 0x6dd5fe20, + 0x301a0: 0x6dd60020, 0x301a1: 0x6dd60220, 0x301a2: 0x6dd60420, 0x301a3: 0x6dd60620, + 0x301a4: 0x6dd60820, 0x301a5: 0x6dd60a20, 0x301a6: 0x6dd60c20, 0x301a7: 0x6dd60e20, + 0x301a8: 0x6deec820, 0x301a9: 0x6dd6aa20, 0x301aa: 0x6deeca20, 0x301ab: 0x6deecc20, + 0x301ac: 0x6deece20, 0x301ad: 0x6deed020, 0x301ae: 0x6dd61020, 0x301af: 0x6deed220, + 0x301b0: 0x6deed420, 0x301b1: 0x6deed620, 0x301b2: 0x6deed820, 0x301b3: 0x6deeda20, + 0x301b4: 0x6deedc20, 0x301b5: 0x6deede20, 0x301b6: 0x6deee020, 0x301b7: 0x6deee220, + 0x301b8: 0x6deee420, 0x301b9: 0x6deee620, 0x301ba: 0x6deee820, 0x301bb: 0x6deeea20, + 0x301bc: 0x6deeec20, 0x301bd: 0x6deeee20, 0x301be: 0x6deef020, 0x301bf: 0x6deef220, + // Block 0xc07, offset 0x301c0 + 0x301c0: 0x6dd61220, 0x301c1: 0x6e033020, 0x301c2: 0x6e033220, 0x301c3: 0x6e033420, + 0x301c4: 0x6e033620, 0x301c5: 0x6e033820, 0x301c6: 0x6e033a20, 0x301c7: 0x6def6820, + 0x301c8: 0x6e033c20, 0x301c9: 0x6e033e20, 0x301ca: 0x6e14c820, 0x301cb: 0x6e14ca20, + 0x301cc: 0x6e14cc20, 0x301cd: 0x6e14ce20, 0x301ce: 0x6e14d020, 0x301cf: 0x6e14d220, + 0x301d0: 0x6e227220, 0x301d1: 0x6e227420, 0x301d2: 0x6e227620, 0x301d3: 0x6e227820, + 0x301d4: 0x6e227a20, 0x301d5: 0x6e227c20, 0x301d6: 0x6e227e20, 0x301d7: 0x6e22aa20, + 0x301d8: 0x6e2cc220, 0x301d9: 0x6e2cc420, 0x301da: 0x6e22ac20, 0x301db: 0x6e2cc620, + 0x301dc: 0x6e2cc820, 0x301dd: 0x6e34c220, 0x301de: 0x6e34c420, 0x301df: 0x6e34c620, + 0x301e0: 0x6e34c820, 0x301e1: 0x6e3a7c20, 0x301e2: 0x6e3a7e20, 0x301e3: 0x6e3a8020, + 0x301e4: 0x6e3a8220, 0x301e5: 0x6e3a8420, 0x301e6: 0x6e3e4c20, 0x301e7: 0x6e3e4e20, + 0x301e8: 0x6e432420, 0x301e9: 0x6e412220, 0x301ea: 0x6e412420, 0x301eb: 0x6c270620, + 0x301ec: 0x6c878020, 0x301ed: 0x6cb2aa20, 0x301ee: 0x6cb2ac20, 0x301ef: 0x6cb2ae20, + 0x301f0: 0x6ce24420, 0x301f1: 0x6d10b820, 0x301f2: 0x6d10ba20, 0x301f3: 0x6d3ee220, + 0x301f4: 0x6d3ee420, 0x301f5: 0x6d3ee620, 0x301f6: 0x6d6b9e20, 0x301f7: 0x6d6ba020, + 0x301f8: 0x6d6ba220, 0x301f9: 0x6d6ba420, 0x301fa: 0x6d6ba620, 0x301fb: 0x6d6ba820, + 0x301fc: 0x6d6baa20, 0x301fd: 0x6d94e420, 0x301fe: 0x6d94e620, 0x301ff: 0x6dd6ac20, + // Block 0xc08, offset 0x30200 + 0x30200: 0x6dd6ae20, 0x30201: 0x6dd6b020, 0x30202: 0x6def6c20, 0x30203: 0x6def6e20, + 0x30204: 0x6def7020, 0x30205: 0x6def7220, 0x30206: 0x6e039c20, 0x30207: 0x6e150620, + 0x30208: 0x6e34de20, 0x30209: 0x6e412c20, 0x3020a: 0x6c270e20, 0x3020b: 0x6c40e420, + 0x3020c: 0x6c613220, 0x3020d: 0x6c613420, 0x3020e: 0x6c878e20, 0x3020f: 0x6c879020, + 0x30210: 0x6c879220, 0x30211: 0x6c879420, 0x30212: 0x6c879620, 0x30213: 0x6c879820, + 0x30214: 0x6c879a20, 0x30215: 0x6c879c20, 0x30216: 0x6cb2e420, 0x30217: 0x6cb2e620, + 0x30218: 0x6cb2e820, 0x30219: 0x6cb2ea20, 0x3021a: 0x6cb2ec20, 0x3021b: 0x6cb2ee20, + 0x3021c: 0x6cb2f020, 0x3021d: 0x6cb2f220, 0x3021e: 0x6cb2f420, 0x3021f: 0x6cb2f620, + 0x30220: 0x6cb2f820, 0x30221: 0x6cb2fa20, 0x30222: 0x6cb2fc20, 0x30223: 0x6cb2fe20, + 0x30224: 0x6ce26c20, 0x30225: 0x6ce26e20, 0x30226: 0x6ce27020, 0x30227: 0x6ce27220, + 0x30228: 0x6ce27420, 0x30229: 0x6ce27620, 0x3022a: 0x6ce27820, 0x3022b: 0x6ce27a20, + 0x3022c: 0x6ce27c20, 0x3022d: 0x6d10ea20, 0x3022e: 0x6ce27e20, 0x3022f: 0x6ce28020, + 0x30230: 0x6ce28220, 0x30231: 0x6ce28420, 0x30232: 0x6ce28620, 0x30233: 0x6ce28820, + 0x30234: 0x6ce28a20, 0x30235: 0x6ce28c20, 0x30236: 0x6ce28e20, 0x30237: 0x6ce29020, + 0x30238: 0x6ce29220, 0x30239: 0x6ce29420, 0x3023a: 0x6ce29620, 0x3023b: 0x6ce29820, + 0x3023c: 0x6ce29a20, 0x3023d: 0x6ce29c20, 0x3023e: 0x6d10ec20, 0x3023f: 0x6d10ee20, + // Block 0xc09, offset 0x30240 + 0x30240: 0x6d10f020, 0x30241: 0x6d10f220, 0x30242: 0x6d10f420, 0x30243: 0x6d10f620, + 0x30244: 0x6d10f820, 0x30245: 0x6d10fa20, 0x30246: 0x6d10fc20, 0x30247: 0x6d10fe20, + 0x30248: 0x6d110020, 0x30249: 0x6d110220, 0x3024a: 0x6d110420, 0x3024b: 0x6d110620, + 0x3024c: 0x6d110820, 0x3024d: 0x6d3f0a20, 0x3024e: 0x6d3f0c20, 0x3024f: 0x6d3f0e20, + 0x30250: 0x6d3f1020, 0x30251: 0x6d3f1220, 0x30252: 0x6d3f1420, 0x30253: 0x6d3f1620, + 0x30254: 0x6d3f1820, 0x30255: 0x6d3f1a20, 0x30256: 0x6d6bd020, 0x30257: 0x6d6bd220, + 0x30258: 0x6d6bd420, 0x30259: 0x6d6bd620, 0x3025a: 0x6d6bd820, 0x3025b: 0x6d6bda20, + 0x3025c: 0x6d6bdc20, 0x3025d: 0x6d6bde20, 0x3025e: 0x6d6be020, 0x3025f: 0x6d6be220, + 0x30260: 0x6d6be420, 0x30261: 0x6d6be620, 0x30262: 0x6d6be820, 0x30263: 0x6d6bea20, + 0x30264: 0x6d6bec20, 0x30265: 0x6d6bee20, 0x30266: 0x6d6bf020, 0x30267: 0x6d6bf220, + 0x30268: 0x6d6bf420, 0x30269: 0x6d6bf620, 0x3026a: 0x6d6bf820, 0x3026b: 0x6d6bfa20, + 0x3026c: 0x6d6bfc20, 0x3026d: 0x6d950820, 0x3026e: 0x6d950a20, 0x3026f: 0x6d950c20, + 0x30270: 0x6d950e20, 0x30271: 0x6d951020, 0x30272: 0x6d951220, 0x30273: 0x6d951420, + 0x30274: 0x6d951620, 0x30275: 0x6d951820, 0x30276: 0x6d951a20, 0x30277: 0x6d951c20, + 0x30278: 0x6d951e20, 0x30279: 0x6d952020, 0x3027a: 0x6d952220, 0x3027b: 0x6d952420, + 0x3027c: 0x6d952620, 0x3027d: 0x6db84220, 0x3027e: 0x6db84420, 0x3027f: 0x6db84620, + // Block 0xc0a, offset 0x30280 + 0x30280: 0x6db84820, 0x30281: 0x6db84a20, 0x30282: 0x6db84c20, 0x30283: 0x6db84e20, + 0x30284: 0x6db85020, 0x30285: 0x6db85220, 0x30286: 0x6dd6ce20, 0x30287: 0x6dd6d020, + 0x30288: 0x6dd6d220, 0x30289: 0x6dd6d420, 0x3028a: 0x6dd6d620, 0x3028b: 0x6dd6d820, + 0x3028c: 0x6dd6da20, 0x3028d: 0x6def9a20, 0x3028e: 0x6def9c20, 0x3028f: 0x6def9e20, + 0x30290: 0x6defa020, 0x30291: 0x6defa220, 0x30292: 0x6defa420, 0x30293: 0x6defa620, + 0x30294: 0x6defa820, 0x30295: 0x6e03ae20, 0x30296: 0x6e03b020, 0x30297: 0x6e03b220, + 0x30298: 0x6e03b420, 0x30299: 0x6e03b620, 0x3029a: 0x6e03b820, 0x3029b: 0x6e151820, + 0x3029c: 0x6e151a20, 0x3029d: 0x6e151c20, 0x3029e: 0x6e151e20, 0x3029f: 0x6e152020, + 0x302a0: 0x6e22b820, 0x302a1: 0x6e22ba20, 0x302a2: 0x6e22bc20, 0x302a3: 0x6e2cee20, + 0x302a4: 0x6e2cf020, 0x302a5: 0x6e413020, 0x302a6: 0x6c051a20, 0x302a7: 0x6c0a7e20, + 0x302a8: 0x6c150820, 0x302a9: 0x6c271020, 0x302aa: 0x6c271220, 0x302ab: 0x6c271420, + 0x302ac: 0x6c40e620, 0x302ad: 0x6c40e820, 0x302ae: 0x6c40ea20, 0x302af: 0x6c40ec20, + 0x302b0: 0x6c40ee20, 0x302b1: 0x6c614620, 0x302b2: 0x6c614820, 0x302b3: 0x6c614a20, + 0x302b4: 0x6c614c20, 0x302b5: 0x6c614e20, 0x302b6: 0x6c615020, 0x302b7: 0x6c615220, + 0x302b8: 0x6c615420, 0x302b9: 0x6c615620, 0x302ba: 0x6c615820, 0x302bb: 0x6c615a20, + 0x302bc: 0x6c87ba20, 0x302bd: 0x6c87bc20, 0x302be: 0x6c87be20, 0x302bf: 0x6c87c020, + // Block 0xc0b, offset 0x302c0 + 0x302c0: 0x6c87c220, 0x302c1: 0x6c87c420, 0x302c2: 0x6c87c620, 0x302c3: 0x6c87c820, + 0x302c4: 0x6cb33a20, 0x302c5: 0x6cb33c20, 0x302c6: 0x6cb33e20, 0x302c7: 0x6ce2d820, + 0x302c8: 0x6ce2da20, 0x302c9: 0x6ce2dc20, 0x302ca: 0x6ce2de20, 0x302cb: 0x6ce2e020, + 0x302cc: 0x6ce2e220, 0x302cd: 0x6ce2e420, 0x302ce: 0x6ce2e620, 0x302cf: 0x6d113e20, + 0x302d0: 0x6d114020, 0x302d1: 0x6d114220, 0x302d2: 0x6d114420, 0x302d3: 0x6d114620, + 0x302d4: 0x6d114820, 0x302d5: 0x6d3f5e20, 0x302d6: 0x6d3f6020, 0x302d7: 0x6d3f6220, + 0x302d8: 0x6d6c4e20, 0x302d9: 0x6d957020, 0x302da: 0x6d957220, 0x302db: 0x6c271c20, + 0x302dc: 0x6ce2f020, 0x302dd: 0x6ce2f220, 0x302de: 0x6d114c20, 0x302df: 0x6d114e20, + 0x302e0: 0x6d115020, 0x302e1: 0x6d3f6820, 0x302e2: 0x6d3f6a20, 0x302e3: 0x6d3f6c20, + 0x302e4: 0x6d6c5620, 0x302e5: 0x6d957820, 0x302e6: 0x6d957a20, 0x302e7: 0x6d957c20, + 0x302e8: 0x6d957e20, 0x302e9: 0x6d958020, 0x302ea: 0x6d958220, 0x302eb: 0x6db89e20, + 0x302ec: 0x6dd71620, 0x302ed: 0x6defca20, 0x302ee: 0x6e03ee20, 0x302ef: 0x6e153620, + 0x302f0: 0x6c272020, 0x302f1: 0x6c87d620, 0x302f2: 0x6d116020, 0x302f3: 0x6d6c6220, + 0x302f4: 0x6defd620, 0x302f5: 0x6c272620, 0x302f6: 0x6c051e20, 0x302f7: 0x6c0a8020, + 0x302f8: 0x6c150a20, 0x302f9: 0x6c150c20, 0x302fa: 0x6c150e20, 0x302fb: 0x6c151020, + 0x302fc: 0x6c151220, 0x302fd: 0x6c151420, 0x302fe: 0x6c272e20, 0x302ff: 0x6c273020, + // Block 0xc0c, offset 0x30300 + 0x30300: 0x6c273220, 0x30301: 0x6c273420, 0x30302: 0x6c273620, 0x30303: 0x6c273820, + 0x30304: 0x6c273a20, 0x30305: 0x6c273c20, 0x30306: 0x6c273e20, 0x30307: 0x6c274020, + 0x30308: 0x6c274220, 0x30309: 0x6c274420, 0x3030a: 0x6c410020, 0x3030b: 0x6c410220, + 0x3030c: 0x6c410420, 0x3030d: 0x6c410620, 0x3030e: 0x6c410820, 0x3030f: 0x6c410a20, + 0x30310: 0x6c410c20, 0x30311: 0x6c410e20, 0x30312: 0x6c411020, 0x30313: 0x6c411220, + 0x30314: 0x6c411420, 0x30315: 0x6c411620, 0x30316: 0x6c411820, 0x30317: 0x6c411a20, + 0x30318: 0x6c411c20, 0x30319: 0x6c411e20, 0x3031a: 0x6c412020, 0x3031b: 0x6c412220, + 0x3031c: 0x6c412420, 0x3031d: 0x6c412620, 0x3031e: 0x6c412820, 0x3031f: 0x6c412a20, + 0x30320: 0x6c616a20, 0x30321: 0x6c616c20, 0x30322: 0x6c616e20, 0x30323: 0x6c617020, + 0x30324: 0x6c617220, 0x30325: 0x6c617420, 0x30326: 0x6c617620, 0x30327: 0x6c617820, + 0x30328: 0x6c617a20, 0x30329: 0x6c617c20, 0x3032a: 0x6c617e20, 0x3032b: 0x6c618020, + 0x3032c: 0x6c412c20, 0x3032d: 0x6c618220, 0x3032e: 0x6c618420, 0x3032f: 0x6c618620, + 0x30330: 0x6c618820, 0x30331: 0x6c618a20, 0x30332: 0x6c618c20, 0x30333: 0x6c618e20, + 0x30334: 0x6c87e620, 0x30335: 0x6c87e820, 0x30336: 0x6c87ea20, 0x30337: 0x6c87ec20, + 0x30338: 0x6c87ee20, 0x30339: 0x6c87f020, 0x3033a: 0x6c87f220, 0x3033b: 0x6c87f420, + 0x3033c: 0x6c87f620, 0x3033d: 0x6c87f820, 0x3033e: 0x6c87fa20, 0x3033f: 0x6c87fc20, + // Block 0xc0d, offset 0x30340 + 0x30340: 0x6c87fe20, 0x30341: 0x6c880020, 0x30342: 0x6c880220, 0x30343: 0x6c880420, + 0x30344: 0x6c880620, 0x30345: 0x6c880820, 0x30346: 0x6c880a20, 0x30347: 0x6c880c20, + 0x30348: 0x6c880e20, 0x30349: 0x6c881020, 0x3034a: 0x6c881220, 0x3034b: 0x6cb34e20, + 0x3034c: 0x6cb35020, 0x3034d: 0x6cb35220, 0x3034e: 0x6cb35420, 0x3034f: 0x6cb35620, + 0x30350: 0x6cb35820, 0x30351: 0x6cb35a20, 0x30352: 0x6cb35c20, 0x30353: 0x6cb35e20, + 0x30354: 0x6cb36020, 0x30355: 0x6cb36220, 0x30356: 0x6cb36420, 0x30357: 0x6cb36620, + 0x30358: 0x6cb36820, 0x30359: 0x6cb36a20, 0x3035a: 0x6cb36c20, 0x3035b: 0x6cb36e20, + 0x3035c: 0x6cb37020, 0x3035d: 0x6cb37220, 0x3035e: 0x6cb37420, 0x3035f: 0x6cb37620, + 0x30360: 0x6cb37820, 0x30361: 0x6cb37a20, 0x30362: 0x6cb37c20, 0x30363: 0x6cb37e20, + 0x30364: 0x6cb38020, 0x30365: 0x6cb38220, 0x30366: 0x6cb38420, 0x30367: 0x6cb38620, + 0x30368: 0x6ce30420, 0x30369: 0x6ce30620, 0x3036a: 0x6ce30820, 0x3036b: 0x6ce30a20, + 0x3036c: 0x6ce30c20, 0x3036d: 0x6ce30e20, 0x3036e: 0x6ce31020, 0x3036f: 0x6ce31220, + 0x30370: 0x6ce31420, 0x30371: 0x6ce31620, 0x30372: 0x6ce31820, 0x30373: 0x6ce31a20, + 0x30374: 0x6ce31c20, 0x30375: 0x6ce31e20, 0x30376: 0x6ce32020, 0x30377: 0x6ce32220, + 0x30378: 0x6ce32420, 0x30379: 0x6ce32620, 0x3037a: 0x6ce32820, 0x3037b: 0x6ce32a20, + 0x3037c: 0x6d116a20, 0x3037d: 0x6d116c20, 0x3037e: 0x6d116e20, 0x3037f: 0x6d117020, + // Block 0xc0e, offset 0x30380 + 0x30380: 0x6d117220, 0x30381: 0x6d117420, 0x30382: 0x6d117620, 0x30383: 0x6d117820, + 0x30384: 0x6d117a20, 0x30385: 0x6d117c20, 0x30386: 0x6d117e20, 0x30387: 0x6d118020, + 0x30388: 0x6d118220, 0x30389: 0x6d118420, 0x3038a: 0x6d118620, 0x3038b: 0x6d118820, + 0x3038c: 0x6d118a20, 0x3038d: 0x6d118c20, 0x3038e: 0x6d118e20, 0x3038f: 0x6d119020, + 0x30390: 0x6d119220, 0x30391: 0x6d119420, 0x30392: 0x6d119620, 0x30393: 0x6d119820, + 0x30394: 0x6d119a20, 0x30395: 0x6d119c20, 0x30396: 0x6d119e20, 0x30397: 0x6d11a020, + 0x30398: 0x6d3f8020, 0x30399: 0x6d3f8220, 0x3039a: 0x6d3f8420, 0x3039b: 0x6d3f8620, + 0x3039c: 0x6d3f8820, 0x3039d: 0x6d3f8a20, 0x3039e: 0x6d3f8c20, 0x3039f: 0x6d3f8e20, + 0x303a0: 0x6d3f9020, 0x303a1: 0x6d3f9220, 0x303a2: 0x6d3f9420, 0x303a3: 0x6d3f9620, + 0x303a4: 0x6d3f9820, 0x303a5: 0x6d3f9a20, 0x303a6: 0x6d6c6e20, 0x303a7: 0x6d6c7020, + 0x303a8: 0x6d6c7220, 0x303a9: 0x6d6c7420, 0x303aa: 0x6d6c7620, 0x303ab: 0x6d6c7820, + 0x303ac: 0x6d6c7a20, 0x303ad: 0x6d6c7c20, 0x303ae: 0x6d6c7e20, 0x303af: 0x6d6c8020, + 0x303b0: 0x6d6c8220, 0x303b1: 0x6d6c8420, 0x303b2: 0x6d959e20, 0x303b3: 0x6d6c8620, + 0x303b4: 0x6d95a020, 0x303b5: 0x6d95a220, 0x303b6: 0x6d95a420, 0x303b7: 0x6d6c8820, + 0x303b8: 0x6d95a620, 0x303b9: 0x6d95a820, 0x303ba: 0x6d95aa20, 0x303bb: 0x6d95ac20, + 0x303bc: 0x6d95ae20, 0x303bd: 0x6db8b220, 0x303be: 0x6db8b420, 0x303bf: 0x6db8b620, + // Block 0xc0f, offset 0x303c0 + 0x303c0: 0x6db8b820, 0x303c1: 0x6db8ba20, 0x303c2: 0x6db8bc20, 0x303c3: 0x6db8be20, + 0x303c4: 0x6db8c020, 0x303c5: 0x6db8c220, 0x303c6: 0x6d95b020, 0x303c7: 0x6dd72220, + 0x303c8: 0x6dd72420, 0x303c9: 0x6db8c420, 0x303ca: 0x6defdc20, 0x303cb: 0x6defde20, + 0x303cc: 0x6defe020, 0x303cd: 0x6e03fc20, 0x303ce: 0x6e153c20, 0x303cf: 0x6e2d0820, + 0x303d0: 0x6e2d0a20, 0x303d1: 0x6c278a20, 0x303d2: 0x6c0a8e20, 0x303d3: 0x6c0a9020, + 0x303d4: 0x6c153c20, 0x303d5: 0x6c886a20, 0x303d6: 0x6c153e20, 0x303d7: 0x6c154020, + 0x303d8: 0x6c154220, 0x303d9: 0x6c154420, 0x303da: 0x6c154620, 0x303db: 0x6c154820, + 0x303dc: 0x6c154a20, 0x303dd: 0x6c154c20, 0x303de: 0x6c279220, 0x303df: 0x6c279420, + 0x303e0: 0x6c279620, 0x303e1: 0x6c279820, 0x303e2: 0x6c279a20, 0x303e3: 0x6c279c20, + 0x303e4: 0x6c279e20, 0x303e5: 0x6c27a020, 0x303e6: 0x6c27a220, 0x303e7: 0x6c27a420, + 0x303e8: 0x6c27a620, 0x303e9: 0x6c27a820, 0x303ea: 0x6c27aa20, 0x303eb: 0x6cb3fc20, + 0x303ec: 0x6c27ac20, 0x303ed: 0x6c418220, 0x303ee: 0x6c418420, 0x303ef: 0x6c418620, + 0x303f0: 0x6c418820, 0x303f1: 0x6c418a20, 0x303f2: 0x6c418c20, 0x303f3: 0x6c418e20, + 0x303f4: 0x6c419020, 0x303f5: 0x6c419220, 0x303f6: 0x6c419420, 0x303f7: 0x6c419620, + 0x303f8: 0x6c419820, 0x303f9: 0x6c419a20, 0x303fa: 0x6c419c20, 0x303fb: 0x6c419e20, + 0x303fc: 0x6c61e020, 0x303fd: 0x6c61e220, 0x303fe: 0x6c61e420, 0x303ff: 0x6c61e620, + // Block 0xc10, offset 0x30400 + 0x30400: 0x6c61e820, 0x30401: 0x6c61ea20, 0x30402: 0x6c61ec20, 0x30403: 0x6c61ee20, + 0x30404: 0x6c61f020, 0x30405: 0x6c61f220, 0x30406: 0x6c61f420, 0x30407: 0x6c61f620, + 0x30408: 0x6c61f820, 0x30409: 0x6c61fa20, 0x3040a: 0x6c61fc20, 0x3040b: 0x6c61fe20, + 0x3040c: 0x6d11fe20, 0x3040d: 0x6c620020, 0x3040e: 0x6c620220, 0x3040f: 0x6c620420, + 0x30410: 0x6c620620, 0x30411: 0x6c620820, 0x30412: 0x6d400820, 0x30413: 0x6c620a20, + 0x30414: 0x6cb3fe20, 0x30415: 0x6c620c20, 0x30416: 0x6c887620, 0x30417: 0x6c887820, + 0x30418: 0x6c887a20, 0x30419: 0x6c887c20, 0x3041a: 0x6c887e20, 0x3041b: 0x6c888020, + 0x3041c: 0x6c888220, 0x3041d: 0x6c888420, 0x3041e: 0x6c888620, 0x3041f: 0x6c888820, + 0x30420: 0x6c888a20, 0x30421: 0x6c888c20, 0x30422: 0x6c888e20, 0x30423: 0x6c889020, + 0x30424: 0x6c889220, 0x30425: 0x6c889420, 0x30426: 0x6c889620, 0x30427: 0x6c889820, + 0x30428: 0x6cb40c20, 0x30429: 0x6cb40e20, 0x3042a: 0x6cb41020, 0x3042b: 0x6cb41220, + 0x3042c: 0x6cb41420, 0x3042d: 0x6cb41620, 0x3042e: 0x6cb41820, 0x3042f: 0x6cb41a20, + 0x30430: 0x6cb41c20, 0x30431: 0x6c625420, 0x30432: 0x6cb41e20, 0x30433: 0x6cb42020, + 0x30434: 0x6cb42220, 0x30435: 0x6ce3be20, 0x30436: 0x6d6cf820, 0x30437: 0x6cb42420, + 0x30438: 0x6cb42620, 0x30439: 0x6ce3c620, 0x3043a: 0x6d95fa20, 0x3043b: 0x6ce3c820, + 0x3043c: 0x6ce3ca20, 0x3043d: 0x6cb42820, 0x3043e: 0x6ce3cc20, 0x3043f: 0x6ce3ce20, + // Block 0xc11, offset 0x30440 + 0x30440: 0x6ce3d020, 0x30441: 0x6ce3d220, 0x30442: 0x6ce3d420, 0x30443: 0x6ce3d620, + 0x30444: 0x6ce3d820, 0x30445: 0x6ce3da20, 0x30446: 0x6ce3dc20, 0x30447: 0x6ce3de20, + 0x30448: 0x6ce3e020, 0x30449: 0x6ce3e220, 0x3044a: 0x6ce3e420, 0x3044b: 0x6d120820, + 0x3044c: 0x6d120a20, 0x3044d: 0x6d120c20, 0x3044e: 0x6d120e20, 0x3044f: 0x6d121020, + 0x30450: 0x6d121220, 0x30451: 0x6d121420, 0x30452: 0x6d121620, 0x30453: 0x6d121820, + 0x30454: 0x6d121a20, 0x30455: 0x6d121c20, 0x30456: 0x6d121e20, 0x30457: 0x6d122020, + 0x30458: 0x6d401420, 0x30459: 0x6d401620, 0x3045a: 0x6d401820, 0x3045b: 0x6d401a20, + 0x3045c: 0x6d401c20, 0x3045d: 0x6d401e20, 0x3045e: 0x6d402020, 0x3045f: 0x6d402220, + 0x30460: 0x6d402420, 0x30461: 0x6d402620, 0x30462: 0x6d402820, 0x30463: 0x6d402a20, + 0x30464: 0x6d402c20, 0x30465: 0x6d402e20, 0x30466: 0x6d6d0220, 0x30467: 0x6d6d0420, + 0x30468: 0x6dd75620, 0x30469: 0x6d6d0620, 0x3046a: 0x6d6d0820, 0x3046b: 0x6d6d0a20, + 0x3046c: 0x6ce41e20, 0x3046d: 0x6d6d0c20, 0x3046e: 0x6d6d0e20, 0x3046f: 0x6d6d1020, + 0x30470: 0x6d6d1220, 0x30471: 0x6d6d1420, 0x30472: 0x6d6d1620, 0x30473: 0x6d95fe20, + 0x30474: 0x6d960020, 0x30475: 0x6d960220, 0x30476: 0x6d960420, 0x30477: 0x6d960620, + 0x30478: 0x6db90820, 0x30479: 0x6db90a20, 0x3047a: 0x6dd75820, 0x3047b: 0x6dd75a20, + 0x3047c: 0x6dd75c20, 0x3047d: 0x6dd75e20, 0x3047e: 0x6dd76020, 0x3047f: 0x6deff620, + // Block 0xc12, offset 0x30480 + 0x30480: 0x6deff820, 0x30481: 0x6e042620, 0x30482: 0x6deffa20, 0x30483: 0x6e042820, + 0x30484: 0x6e154e20, 0x30485: 0x6e155020, 0x30486: 0x6e155220, 0x30487: 0x6e22ea20, + 0x30488: 0x6e22ec20, 0x30489: 0x6c27ec20, 0x3048a: 0x6c625a20, 0x3048b: 0x6c625c20, + 0x3048c: 0x6c88ee20, 0x3048d: 0x6c88f020, 0x3048e: 0x6c88f220, 0x3048f: 0x6c88f420, + 0x30490: 0x6c88f620, 0x30491: 0x6c88f820, 0x30492: 0x6c88fa20, 0x30493: 0x6cb47e20, + 0x30494: 0x6cb48020, 0x30495: 0x6cb48220, 0x30496: 0x6cb48420, 0x30497: 0x6cb48620, + 0x30498: 0x6cb48820, 0x30499: 0x6cb48a20, 0x3049a: 0x6cb48c20, 0x3049b: 0x6cb48e20, + 0x3049c: 0x6cb49020, 0x3049d: 0x6cb49220, 0x3049e: 0x6cb49420, 0x3049f: 0x6ce42a20, + 0x304a0: 0x6ce42c20, 0x304a1: 0x6ce42e20, 0x304a2: 0x6ce43020, 0x304a3: 0x6ce43220, + 0x304a4: 0x6ce43420, 0x304a5: 0x6ce43620, 0x304a6: 0x6d127820, 0x304a7: 0x6d127a20, + 0x304a8: 0x6d127c20, 0x304a9: 0x6d127e20, 0x304aa: 0x6d128020, 0x304ab: 0x6d128220, + 0x304ac: 0x6d128420, 0x304ad: 0x6d128620, 0x304ae: 0x6d128820, 0x304af: 0x6d128a20, + 0x304b0: 0x6d128c20, 0x304b1: 0x6d128e20, 0x304b2: 0x6d407e20, 0x304b3: 0x6d408020, + 0x304b4: 0x6d408220, 0x304b5: 0x6d408420, 0x304b6: 0x6d408620, 0x304b7: 0x6d408820, + 0x304b8: 0x6d408a20, 0x304b9: 0x6d408c20, 0x304ba: 0x6d408e20, 0x304bb: 0x6d409020, + 0x304bc: 0x6d409220, 0x304bd: 0x6d409420, 0x304be: 0x6d409620, 0x304bf: 0x6d409820, + // Block 0xc13, offset 0x304c0 + 0x304c0: 0x6d6d5020, 0x304c1: 0x6d6d5220, 0x304c2: 0x6d6d5420, 0x304c3: 0x6d6d5620, + 0x304c4: 0x6d6d5820, 0x304c5: 0x6d6d5a20, 0x304c6: 0x6d6d5c20, 0x304c7: 0x6d6d5e20, + 0x304c8: 0x6d6d6020, 0x304c9: 0x6d6d6220, 0x304ca: 0x6d6d6420, 0x304cb: 0x6d6d6620, + 0x304cc: 0x6d6d6820, 0x304cd: 0x6d964220, 0x304ce: 0x6d964420, 0x304cf: 0x6d964620, + 0x304d0: 0x6d964820, 0x304d1: 0x6d964a20, 0x304d2: 0x6d964c20, 0x304d3: 0x6d964e20, + 0x304d4: 0x6d965020, 0x304d5: 0x6d965220, 0x304d6: 0x6d965420, 0x304d7: 0x6d965620, + 0x304d8: 0x6db93c20, 0x304d9: 0x6db93e20, 0x304da: 0x6db94020, 0x304db: 0x6db94220, + 0x304dc: 0x6db94420, 0x304dd: 0x6db94620, 0x304de: 0x6db94820, 0x304df: 0x6db94a20, + 0x304e0: 0x6db94c20, 0x304e1: 0x6db94e20, 0x304e2: 0x6db95020, 0x304e3: 0x6db95220, + 0x304e4: 0x6db95420, 0x304e5: 0x6dd78220, 0x304e6: 0x6dd78420, 0x304e7: 0x6dd78620, + 0x304e8: 0x6dd78820, 0x304e9: 0x6dd78a20, 0x304ea: 0x6dd78c20, 0x304eb: 0x6dd78e20, + 0x304ec: 0x6dd79020, 0x304ed: 0x6df01420, 0x304ee: 0x6df01620, 0x304ef: 0x6df01820, + 0x304f0: 0x6df01a20, 0x304f1: 0x6df01c20, 0x304f2: 0x6e043420, 0x304f3: 0x6e043620, + 0x304f4: 0x6e043820, 0x304f5: 0x6e043a20, 0x304f6: 0x6e043c20, 0x304f7: 0x6e043e20, + 0x304f8: 0x6e044020, 0x304f9: 0x6e156020, 0x304fa: 0x6e156220, 0x304fb: 0x6e156420, + 0x304fc: 0x6e2d2620, 0x304fd: 0x6e350220, 0x304fe: 0x6e350420, 0x304ff: 0x6e350620, + // Block 0xc14, offset 0x30500 + 0x30500: 0x6e350820, 0x30501: 0x6e3aaa20, 0x30502: 0x6e351420, 0x30503: 0x6e3e6e20, + 0x30504: 0x6e3e7020, 0x30505: 0x6e413820, 0x30506: 0x6c27ee20, 0x30507: 0x6c41da20, + 0x30508: 0x6cb4c420, 0x30509: 0x6ce46a20, 0x3050a: 0x6ce46c20, 0x3050b: 0x6e046220, + 0x3050c: 0x6c27f020, 0x3050d: 0x6c625e20, 0x3050e: 0x6cb4cc20, 0x3050f: 0x6ce47020, + 0x30510: 0x6dd7ce20, 0x30511: 0x6c41dc20, 0x30512: 0x6c41de20, 0x30513: 0x6c626220, + 0x30514: 0x6c626420, 0x30515: 0x6c890e20, 0x30516: 0x6c891020, 0x30517: 0x6c891220, + 0x30518: 0x6c891420, 0x30519: 0x6c891620, 0x3051a: 0x6c891820, 0x3051b: 0x6c891a20, + 0x3051c: 0x6c891c20, 0x3051d: 0x6c891e20, 0x3051e: 0x6c892020, 0x3051f: 0x6c892220, + 0x30520: 0x6c892420, 0x30521: 0x6c892620, 0x30522: 0x6c892820, 0x30523: 0x6cb4d620, + 0x30524: 0x6cb4d820, 0x30525: 0x6cb4da20, 0x30526: 0x6cb4dc20, 0x30527: 0x6cb4de20, + 0x30528: 0x6cb4e020, 0x30529: 0x6cb4e220, 0x3052a: 0x6cb4e420, 0x3052b: 0x6cb4e620, + 0x3052c: 0x6cb4e820, 0x3052d: 0x6cb4ea20, 0x3052e: 0x6cb4ec20, 0x3052f: 0x6cb4ee20, + 0x30530: 0x6cb4f020, 0x30531: 0x6cb4f220, 0x30532: 0x6cb4f420, 0x30533: 0x6cb4f620, + 0x30534: 0x6cb4f820, 0x30535: 0x6cb4fa20, 0x30536: 0x6cb4fc20, 0x30537: 0x6cb4fe20, + 0x30538: 0x6cb50020, 0x30539: 0x6cb50220, 0x3053a: 0x6cb50420, 0x3053b: 0x6cb50620, + 0x3053c: 0x6cb50820, 0x3053d: 0x6ce48420, 0x3053e: 0x6ce48620, 0x3053f: 0x6ce48820, + // Block 0xc15, offset 0x30540 + 0x30540: 0x6ce48a20, 0x30541: 0x6ce48c20, 0x30542: 0x6ce48e20, 0x30543: 0x6ce49020, + 0x30544: 0x6ce49220, 0x30545: 0x6ce49420, 0x30546: 0x6ce49620, 0x30547: 0x6ce49820, + 0x30548: 0x6ce49a20, 0x30549: 0x6ce49c20, 0x3054a: 0x6ce49e20, 0x3054b: 0x6ce4a020, + 0x3054c: 0x6ce4a220, 0x3054d: 0x6ce4a420, 0x3054e: 0x6ce4a620, 0x3054f: 0x6ce4a820, + 0x30550: 0x6ce4aa20, 0x30551: 0x6ce4ac20, 0x30552: 0x6ce4ae20, 0x30553: 0x6ce4b020, + 0x30554: 0x6ce4b220, 0x30555: 0x6ce4b420, 0x30556: 0x6ce4b620, 0x30557: 0x6ce4b820, + 0x30558: 0x6ce4ba20, 0x30559: 0x6ce4bc20, 0x3055a: 0x6ce4be20, 0x3055b: 0x6ce4c020, + 0x3055c: 0x6ce4c220, 0x3055d: 0x6ce4c420, 0x3055e: 0x6ce4c620, 0x3055f: 0x6ce4c820, + 0x30560: 0x6ce4ca20, 0x30561: 0x6ce4cc20, 0x30562: 0x6ce4ce20, 0x30563: 0x6ce4d020, + 0x30564: 0x6ce4d220, 0x30565: 0x6ce4d420, 0x30566: 0x6ce4d620, 0x30567: 0x6ce4d820, + 0x30568: 0x6ce4da20, 0x30569: 0x6ce4dc20, 0x3056a: 0x6ce4de20, 0x3056b: 0x6ce4e020, + 0x3056c: 0x6ce4e220, 0x3056d: 0x6d40d420, 0x3056e: 0x6d12c620, 0x3056f: 0x6d12c820, + 0x30570: 0x6d12ca20, 0x30571: 0x6d12cc20, 0x30572: 0x6d12ce20, 0x30573: 0x6d12d020, + 0x30574: 0x6d12d220, 0x30575: 0x6d12d420, 0x30576: 0x6d12d620, 0x30577: 0x6d12d820, + 0x30578: 0x6d12da20, 0x30579: 0x6d12dc20, 0x3057a: 0x6d12de20, 0x3057b: 0x6d12e020, + 0x3057c: 0x6d12e220, 0x3057d: 0x6d12e420, 0x3057e: 0x6d12e620, 0x3057f: 0x6d12e820, + // Block 0xc16, offset 0x30580 + 0x30580: 0x6d12ea20, 0x30581: 0x6d12ec20, 0x30582: 0x6d12ee20, 0x30583: 0x6d12f020, + 0x30584: 0x6d12f220, 0x30585: 0x6d12f420, 0x30586: 0x6d12f620, 0x30587: 0x6d12f820, + 0x30588: 0x6d12fa20, 0x30589: 0x6d12fc20, 0x3058a: 0x6d12fe20, 0x3058b: 0x6d130020, + 0x3058c: 0x6d130220, 0x3058d: 0x6d130420, 0x3058e: 0x6d130620, 0x3058f: 0x6d130820, + 0x30590: 0x6d130a20, 0x30591: 0x6d130c20, 0x30592: 0x6d130e20, 0x30593: 0x6d131020, + 0x30594: 0x6d131220, 0x30595: 0x6d131420, 0x30596: 0x6d131620, 0x30597: 0x6d131820, + 0x30598: 0x6d131a20, 0x30599: 0x6d131c20, 0x3059a: 0x6d131e20, 0x3059b: 0x6d132020, + 0x3059c: 0x6d132220, 0x3059d: 0x6d132420, 0x3059e: 0x6d132620, 0x3059f: 0x6d132820, + 0x305a0: 0x6d132a20, 0x305a1: 0x6d132c20, 0x305a2: 0x6d132e20, 0x305a3: 0x6d133020, + 0x305a4: 0x6d133220, 0x305a5: 0x6d133420, 0x305a6: 0x6d133620, 0x305a7: 0x6d133820, + 0x305a8: 0x6d133a20, 0x305a9: 0x6d133c20, 0x305aa: 0x6d133e20, 0x305ab: 0x6d134020, + 0x305ac: 0x6d134220, 0x305ad: 0x6d134420, 0x305ae: 0x6d134620, 0x305af: 0x6d134820, + 0x305b0: 0x6d134a20, 0x305b1: 0x6d134c20, 0x305b2: 0x6d134e20, 0x305b3: 0x6d135020, + 0x305b4: 0x6d135220, 0x305b5: 0x6d40e420, 0x305b6: 0x6d40e620, 0x305b7: 0x6d40e820, + 0x305b8: 0x6d40ea20, 0x305b9: 0x6d40ec20, 0x305ba: 0x6d40ee20, 0x305bb: 0x6d40f020, + 0x305bc: 0x6d41c020, 0x305bd: 0x6d40f220, 0x305be: 0x6d40f420, 0x305bf: 0x6d40f620, + // Block 0xc17, offset 0x305c0 + 0x305c0: 0x6d40f820, 0x305c1: 0x6d40fa20, 0x305c2: 0x6d40fc20, 0x305c3: 0x6d40fe20, + 0x305c4: 0x6d410020, 0x305c5: 0x6d410220, 0x305c6: 0x6d410420, 0x305c7: 0x6d410620, + 0x305c8: 0x6d410820, 0x305c9: 0x6d410a20, 0x305ca: 0x6d410c20, 0x305cb: 0x6d410e20, + 0x305cc: 0x6d411020, 0x305cd: 0x6d411220, 0x305ce: 0x6d411420, 0x305cf: 0x6d135420, + 0x305d0: 0x6d411620, 0x305d1: 0x6d411820, 0x305d2: 0x6d411a20, 0x305d3: 0x6d411c20, + 0x305d4: 0x6d411e20, 0x305d5: 0x6d412020, 0x305d6: 0x6d412220, 0x305d7: 0x6d412420, + 0x305d8: 0x6d412620, 0x305d9: 0x6d412820, 0x305da: 0x6d412a20, 0x305db: 0x6d412c20, + 0x305dc: 0x6d412e20, 0x305dd: 0x6d413020, 0x305de: 0x6d413220, 0x305df: 0x6d413420, + 0x305e0: 0x6d413620, 0x305e1: 0x6d413820, 0x305e2: 0x6d413a20, 0x305e3: 0x6d413c20, + 0x305e4: 0x6d413e20, 0x305e5: 0x6d414020, 0x305e6: 0x6d414220, 0x305e7: 0x6d414420, + 0x305e8: 0x6d414620, 0x305e9: 0x6d414820, 0x305ea: 0x6d414a20, 0x305eb: 0x6d414c20, + 0x305ec: 0x6d414e20, 0x305ed: 0x6d415020, 0x305ee: 0x6d415220, 0x305ef: 0x6d415420, + 0x305f0: 0x6d415620, 0x305f1: 0x6d415820, 0x305f2: 0x6d6dc220, 0x305f3: 0x6d6dc420, + 0x305f4: 0x6d6dc620, 0x305f5: 0x6d6dc820, 0x305f6: 0x6d6dca20, 0x305f7: 0x6d6dcc20, + 0x305f8: 0x6d6dce20, 0x305f9: 0x6d6dd020, 0x305fa: 0x6d6dd220, 0x305fb: 0x6d6dd420, + 0x305fc: 0x6d6dd620, 0x305fd: 0x6d6dd820, 0x305fe: 0x6d6dda20, 0x305ff: 0x6d6ddc20, + // Block 0xc18, offset 0x30600 + 0x30600: 0x6d6dde20, 0x30601: 0x6d6de020, 0x30602: 0x6d6de220, 0x30603: 0x6d6de420, + 0x30604: 0x6d6de620, 0x30605: 0x6d6de820, 0x30606: 0x6d6dea20, 0x30607: 0x6d6dec20, + 0x30608: 0x6d6dee20, 0x30609: 0x6d6df020, 0x3060a: 0x6d6df220, 0x3060b: 0x6d969820, + 0x3060c: 0x6d6df420, 0x3060d: 0x6d6df620, 0x3060e: 0x6d6df820, 0x3060f: 0x6d6dfa20, + 0x30610: 0x6d6dfc20, 0x30611: 0x6d6dfe20, 0x30612: 0x6d6e0020, 0x30613: 0x6d6e0220, + 0x30614: 0x6d6e0420, 0x30615: 0x6d6e0620, 0x30616: 0x6d6e0820, 0x30617: 0x6d6e0a20, + 0x30618: 0x6d6e0c20, 0x30619: 0x6d6e0e20, 0x3061a: 0x6d6e1020, 0x3061b: 0x6d6e1220, + 0x3061c: 0x6d6e1420, 0x3061d: 0x6d6e1620, 0x3061e: 0x6d6e1820, 0x3061f: 0x6d6e1a20, + 0x30620: 0x6d6e1c20, 0x30621: 0x6d6e1e20, 0x30622: 0x6d6e2020, 0x30623: 0x6d6e2220, + 0x30624: 0x6d6e2420, 0x30625: 0x6d6e2620, 0x30626: 0x6d6e2820, 0x30627: 0x6d6e2a20, + 0x30628: 0x6d6e2c20, 0x30629: 0x6d6e2e20, 0x3062a: 0x6d6e3020, 0x3062b: 0x6d6e3220, + 0x3062c: 0x6d6e3420, 0x3062d: 0x6d6e3620, 0x3062e: 0x6d41be20, 0x3062f: 0x6d6e3820, + 0x30630: 0x6d6e3a20, 0x30631: 0x6d6e3c20, 0x30632: 0x6d6e3e20, 0x30633: 0x6d6e4020, + 0x30634: 0x6d6e4220, 0x30635: 0x6d6e4420, 0x30636: 0x6d6e4620, 0x30637: 0x6d96a220, + 0x30638: 0x6d96a420, 0x30639: 0x6d96a620, 0x3063a: 0x6d96a820, 0x3063b: 0x6d96aa20, + 0x3063c: 0x6d96ac20, 0x3063d: 0x6d96ae20, 0x3063e: 0x6d96b020, 0x3063f: 0x6d96b220, + // Block 0xc19, offset 0x30640 + 0x30640: 0x6d96b420, 0x30641: 0x6d96b620, 0x30642: 0x6d96b820, 0x30643: 0x6d96ba20, + 0x30644: 0x6d96bc20, 0x30645: 0x6d96be20, 0x30646: 0x6d96c020, 0x30647: 0x6d96c220, + 0x30648: 0x6d96c420, 0x30649: 0x6d96c620, 0x3064a: 0x6d96c820, 0x3064b: 0x6d96ca20, + 0x3064c: 0x6d96cc20, 0x3064d: 0x6d96ce20, 0x3064e: 0x6d96d020, 0x3064f: 0x6d96d220, + 0x30650: 0x6d96d420, 0x30651: 0x6d96d620, 0x30652: 0x6d96d820, 0x30653: 0x6d96da20, + 0x30654: 0x6d96dc20, 0x30655: 0x6d96de20, 0x30656: 0x6d96e020, 0x30657: 0x6d96e220, + 0x30658: 0x6d96e420, 0x30659: 0x6d96e620, 0x3065a: 0x6d96e820, 0x3065b: 0x6d96ea20, + 0x3065c: 0x6d96ec20, 0x3065d: 0x6d96ee20, 0x3065e: 0x6d96f020, 0x3065f: 0x6d96f220, + 0x30660: 0x6d96f420, 0x30661: 0x6d96f620, 0x30662: 0x6d96f820, 0x30663: 0x6d96fa20, + 0x30664: 0x6d96fc20, 0x30665: 0x6d96fe20, 0x30666: 0x6d970020, 0x30667: 0x6d970220, + 0x30668: 0x6db9ac20, 0x30669: 0x6d970420, 0x3066a: 0x6d970620, 0x3066b: 0x6d970820, + 0x3066c: 0x6d970a20, 0x3066d: 0x6d970c20, 0x3066e: 0x6d970e20, 0x3066f: 0x6d971020, + 0x30670: 0x6d971220, 0x30671: 0x6d971420, 0x30672: 0x6d971620, 0x30673: 0x6d971820, + 0x30674: 0x6d971a20, 0x30675: 0x6d971c20, 0x30676: 0x6d971e20, 0x30677: 0x6d972020, + 0x30678: 0x6d972220, 0x30679: 0x6d972420, 0x3067a: 0x6d972620, 0x3067b: 0x6d972820, + 0x3067c: 0x6d972a20, 0x3067d: 0x6d972c20, 0x3067e: 0x6d972e20, 0x3067f: 0x6d973020, + // Block 0xc1a, offset 0x30680 + 0x30680: 0x6d973220, 0x30681: 0x6d973420, 0x30682: 0x6d973620, 0x30683: 0x6d973820, + 0x30684: 0x6d973a20, 0x30685: 0x6d973c20, 0x30686: 0x6d973e20, 0x30687: 0x6db9ae20, + 0x30688: 0x6d974020, 0x30689: 0x6db9b020, 0x3068a: 0x6db9b220, 0x3068b: 0x6db9b420, + 0x3068c: 0x6db9b620, 0x3068d: 0x6db9b820, 0x3068e: 0x6db9ba20, 0x3068f: 0x6db9bc20, + 0x30690: 0x6db9be20, 0x30691: 0x6db9c020, 0x30692: 0x6db9c220, 0x30693: 0x6db9c420, + 0x30694: 0x6db9c620, 0x30695: 0x6db9c820, 0x30696: 0x6db9ca20, 0x30697: 0x6db9cc20, + 0x30698: 0x6db9ce20, 0x30699: 0x6db9d020, 0x3069a: 0x6db9d220, 0x3069b: 0x6db9d420, + 0x3069c: 0x6db9d620, 0x3069d: 0x6db9d820, 0x3069e: 0x6db9da20, 0x3069f: 0x6db9dc20, + 0x306a0: 0x6db9de20, 0x306a1: 0x6db9e020, 0x306a2: 0x6db9e220, 0x306a3: 0x6db9e420, + 0x306a4: 0x6db9e620, 0x306a5: 0x6db9e820, 0x306a6: 0x6db9ea20, 0x306a7: 0x6db9ec20, + 0x306a8: 0x6db9ee20, 0x306a9: 0x6db9f020, 0x306aa: 0x6db9f220, 0x306ab: 0x6db9f420, + 0x306ac: 0x6db9f620, 0x306ad: 0x6db9f820, 0x306ae: 0x6db9fa20, 0x306af: 0x6db9fc20, + 0x306b0: 0x6db9fe20, 0x306b1: 0x6dba0020, 0x306b2: 0x6dba0220, 0x306b3: 0x6dba0420, + 0x306b4: 0x6dba0620, 0x306b5: 0x6dba0820, 0x306b6: 0x6dba0a20, 0x306b7: 0x6dba0c20, + 0x306b8: 0x6dba0e20, 0x306b9: 0x6dba1020, 0x306ba: 0x6d97ec20, 0x306bb: 0x6dba1220, + 0x306bc: 0x6dba1420, 0x306bd: 0x6dba1620, 0x306be: 0x6dba1820, 0x306bf: 0x6dba1a20, + // Block 0xc1b, offset 0x306c0 + 0x306c0: 0x6dba1c20, 0x306c1: 0x6dba1e20, 0x306c2: 0x6dba2020, 0x306c3: 0x6dba2220, + 0x306c4: 0x6dba2420, 0x306c5: 0x6dba2620, 0x306c6: 0x6dba2820, 0x306c7: 0x6dba2a20, + 0x306c8: 0x6dd7ee20, 0x306c9: 0x6dd7f020, 0x306ca: 0x6dd7f220, 0x306cb: 0x6dd7f420, + 0x306cc: 0x6dd7f620, 0x306cd: 0x6dd7f820, 0x306ce: 0x6dd7fa20, 0x306cf: 0x6dd7fc20, + 0x306d0: 0x6dd7fe20, 0x306d1: 0x6dd80020, 0x306d2: 0x6dd80220, 0x306d3: 0x6dd80420, + 0x306d4: 0x6dd80620, 0x306d5: 0x6dd80820, 0x306d6: 0x6dd80a20, 0x306d7: 0x6dd80c20, + 0x306d8: 0x6dd80e20, 0x306d9: 0x6dd81020, 0x306da: 0x6dd81220, 0x306db: 0x6dd81420, + 0x306dc: 0x6dd81620, 0x306dd: 0x6dd81820, 0x306de: 0x6dd81a20, 0x306df: 0x6dd81c20, + 0x306e0: 0x6dd81e20, 0x306e1: 0x6dbaec20, 0x306e2: 0x6dd82020, 0x306e3: 0x6dd82220, + 0x306e4: 0x6dd82420, 0x306e5: 0x6dd82620, 0x306e6: 0x6dd82820, 0x306e7: 0x6dd82a20, + 0x306e8: 0x6dd82c20, 0x306e9: 0x6df06e20, 0x306ea: 0x6dd82e20, 0x306eb: 0x6dd83020, + 0x306ec: 0x6dd83220, 0x306ed: 0x6dd83420, 0x306ee: 0x6dd83620, 0x306ef: 0x6dbaee20, + 0x306f0: 0x6dd83820, 0x306f1: 0x6dd83a20, 0x306f2: 0x6dd83c20, 0x306f3: 0x6dd83e20, + 0x306f4: 0x6dd84020, 0x306f5: 0x6dd84220, 0x306f6: 0x6dd84420, 0x306f7: 0x6dd84620, + 0x306f8: 0x6dd84820, 0x306f9: 0x6dd84a20, 0x306fa: 0x6dd84c20, 0x306fb: 0x6dd84e20, + 0x306fc: 0x6dd85020, 0x306fd: 0x6dd85220, 0x306fe: 0x6dd85420, 0x306ff: 0x6dd85620, + // Block 0xc1c, offset 0x30700 + 0x30700: 0x6df07020, 0x30701: 0x6df07220, 0x30702: 0x6df07420, 0x30703: 0x6df07620, + 0x30704: 0x6df07820, 0x30705: 0x6df07a20, 0x30706: 0x6df07c20, 0x30707: 0x6df07e20, + 0x30708: 0x6df08020, 0x30709: 0x6df08220, 0x3070a: 0x6df08420, 0x3070b: 0x6df08620, + 0x3070c: 0x6df08820, 0x3070d: 0x6df08a20, 0x3070e: 0x6df08c20, 0x3070f: 0x6df08e20, + 0x30710: 0x6df09020, 0x30711: 0x6df09220, 0x30712: 0x6df09420, 0x30713: 0x6df09620, + 0x30714: 0x6df09820, 0x30715: 0x6df09a20, 0x30716: 0x6df09c20, 0x30717: 0x6df09e20, + 0x30718: 0x6df0a020, 0x30719: 0x6df0a220, 0x3071a: 0x6df0a420, 0x3071b: 0x6df0a620, + 0x3071c: 0x6df0a820, 0x3071d: 0x6df0aa20, 0x3071e: 0x6df0ac20, 0x3071f: 0x6df0ae20, + 0x30720: 0x6df0b020, 0x30721: 0x6df0b220, 0x30722: 0x6df0b420, 0x30723: 0x6df0b620, + 0x30724: 0x6df0b820, 0x30725: 0x6df0ba20, 0x30726: 0x6df0bc20, 0x30727: 0x6df0be20, + 0x30728: 0x6df0c020, 0x30729: 0x6df0c220, 0x3072a: 0x6df0c420, 0x3072b: 0x6df0c620, + 0x3072c: 0x6df0c820, 0x3072d: 0x6df0ca20, 0x3072e: 0x6df0cc20, 0x3072f: 0x6df0ce20, + 0x30730: 0x6df0d020, 0x30731: 0x6df0d220, 0x30732: 0x6df0d420, 0x30733: 0x6e047c20, + 0x30734: 0x6e159420, 0x30735: 0x6e047e20, 0x30736: 0x6e048020, 0x30737: 0x6e048220, + 0x30738: 0x6e048420, 0x30739: 0x6df0d620, 0x3073a: 0x6e048620, 0x3073b: 0x6e048820, + 0x3073c: 0x6e048a20, 0x3073d: 0x6e048c20, 0x3073e: 0x6e048e20, 0x3073f: 0x6e049020, + // Block 0xc1d, offset 0x30740 + 0x30740: 0x6e049220, 0x30741: 0x6e049420, 0x30742: 0x6e049620, 0x30743: 0x6e049820, + 0x30744: 0x6e049a20, 0x30745: 0x6e049c20, 0x30746: 0x6e049e20, 0x30747: 0x6e04a020, + 0x30748: 0x6e04a220, 0x30749: 0x6e04a420, 0x3074a: 0x6e04a620, 0x3074b: 0x6e04a820, + 0x3074c: 0x6e04aa20, 0x3074d: 0x6e04ac20, 0x3074e: 0x6e04ae20, 0x3074f: 0x6e04b020, + 0x30750: 0x6e04b220, 0x30751: 0x6e04b420, 0x30752: 0x6e04b620, 0x30753: 0x6e04b820, + 0x30754: 0x6e04ba20, 0x30755: 0x6e04bc20, 0x30756: 0x6e04be20, 0x30757: 0x6e04c020, + 0x30758: 0x6e04c220, 0x30759: 0x6e04c420, 0x3075a: 0x6e04c620, 0x3075b: 0x6e04c820, + 0x3075c: 0x6e04ca20, 0x3075d: 0x6e04cc20, 0x3075e: 0x6e04ce20, 0x3075f: 0x6e04d020, + 0x30760: 0x6e04d220, 0x30761: 0x6e04d420, 0x30762: 0x6e04d620, 0x30763: 0x6e04d820, + 0x30764: 0x6e04da20, 0x30765: 0x6e04dc20, 0x30766: 0x6e04de20, 0x30767: 0x6e04e020, + 0x30768: 0x6e04e220, 0x30769: 0x6e159620, 0x3076a: 0x6e159820, 0x3076b: 0x6e159a20, + 0x3076c: 0x6e159c20, 0x3076d: 0x6e159e20, 0x3076e: 0x6e15a020, 0x3076f: 0x6e058820, + 0x30770: 0x6e15a220, 0x30771: 0x6e15a420, 0x30772: 0x6e15a620, 0x30773: 0x6e15a820, + 0x30774: 0x6e15aa20, 0x30775: 0x6e15ac20, 0x30776: 0x6e15ae20, 0x30777: 0x6e15b020, + 0x30778: 0x6e15b220, 0x30779: 0x6e15b420, 0x3077a: 0x6e15b620, 0x3077b: 0x6e15b820, + 0x3077c: 0x6e058a20, 0x3077d: 0x6e15ba20, 0x3077e: 0x6e15bc20, 0x3077f: 0x6e15be20, + // Block 0xc1e, offset 0x30780 + 0x30780: 0x6e15c020, 0x30781: 0x6e15c220, 0x30782: 0x6e231620, 0x30783: 0x6e231820, + 0x30784: 0x6e231a20, 0x30785: 0x6e231c20, 0x30786: 0x6e231e20, 0x30787: 0x6e232020, + 0x30788: 0x6e232220, 0x30789: 0x6e232420, 0x3078a: 0x6e232620, 0x3078b: 0x6e232820, + 0x3078c: 0x6e232a20, 0x3078d: 0x6e232c20, 0x3078e: 0x6e232e20, 0x3078f: 0x6e233020, + 0x30790: 0x6e233220, 0x30791: 0x6e233420, 0x30792: 0x6e233620, 0x30793: 0x6e233820, + 0x30794: 0x6e233a20, 0x30795: 0x6e2d4620, 0x30796: 0x6e2d4820, 0x30797: 0x6e2d4a20, + 0x30798: 0x6e2d4c20, 0x30799: 0x6e2d4e20, 0x3079a: 0x6e2d5020, 0x3079b: 0x6e2d5220, + 0x3079c: 0x6e2d5420, 0x3079d: 0x6e2d5620, 0x3079e: 0x6e2d5820, 0x3079f: 0x6e2d5a20, + 0x307a0: 0x6e2d5c20, 0x307a1: 0x6e2d5e20, 0x307a2: 0x6e2d6020, 0x307a3: 0x6e2d6220, + 0x307a4: 0x6e2d6420, 0x307a5: 0x6e2d6620, 0x307a6: 0x6e2d6820, 0x307a7: 0x6e233c20, + 0x307a8: 0x6e351c20, 0x307a9: 0x6e351e20, 0x307aa: 0x6e352020, 0x307ab: 0x6e352220, + 0x307ac: 0x6e352420, 0x307ad: 0x6e3ab420, 0x307ae: 0x6e3ab620, 0x307af: 0x6e3ab820, + 0x307b0: 0x6e3aba20, 0x307b1: 0x6e3abc20, 0x307b2: 0x6e3abe20, 0x307b3: 0x6e3ac020, + 0x307b4: 0x6e3e7620, 0x307b5: 0x6e3e7820, 0x307b6: 0x6e3e7a20, 0x307b7: 0x6e3e7c20, + 0x307b8: 0x6e3e7e20, 0x307b9: 0x6e3e8020, 0x307ba: 0x6e3e8220, 0x307bb: 0x6e414020, + 0x307bc: 0x6e414220, 0x307bd: 0x6e414420, 0x307be: 0x6e414620, 0x307bf: 0x6e434020, + // Block 0xc1f, offset 0x307c0 + 0x307c0: 0x6e434220, 0x307c1: 0x6e434420, 0x307c2: 0x6e434620, 0x307c3: 0x6e449420, + 0x307c4: 0x6e449620, 0x307c5: 0x6c0aaa20, 0x307c6: 0x6c158c20, 0x307c7: 0x6c158e20, + 0x307c8: 0x6c27f220, 0x307c9: 0x6c27f420, 0x307ca: 0x6c27f620, 0x307cb: 0x6c27f820, + 0x307cc: 0x6c27fa20, 0x307cd: 0x6c41e020, 0x307ce: 0x6c41e220, 0x307cf: 0x6c41e420, + 0x307d0: 0x6c41e620, 0x307d1: 0x6c41e820, 0x307d2: 0x6c41ea20, 0x307d3: 0x6c41ec20, + 0x307d4: 0x6c41ee20, 0x307d5: 0x6c41f020, 0x307d6: 0x6c41f220, 0x307d7: 0x6c41f420, + 0x307d8: 0x6c626620, 0x307d9: 0x6c626820, 0x307da: 0x6c626a20, 0x307db: 0x6c626c20, + 0x307dc: 0x6c626e20, 0x307dd: 0x6c627020, 0x307de: 0x6c627220, 0x307df: 0x6c627420, + 0x307e0: 0x6c627620, 0x307e1: 0x6c627820, 0x307e2: 0x6c627a20, 0x307e3: 0x6c627c20, + 0x307e4: 0x6c627e20, 0x307e5: 0x6c628020, 0x307e6: 0x6c628220, 0x307e7: 0x6c628420, + 0x307e8: 0x6c628620, 0x307e9: 0x6c628820, 0x307ea: 0x6c628a20, 0x307eb: 0x6c628c20, + 0x307ec: 0x6c628e20, 0x307ed: 0x6c629020, 0x307ee: 0x6c629220, 0x307ef: 0x6c629420, + 0x307f0: 0x6c893420, 0x307f1: 0x6c893620, 0x307f2: 0x6c893820, 0x307f3: 0x6c893a20, + 0x307f4: 0x6c893c20, 0x307f5: 0x6c893e20, 0x307f6: 0x6c894020, 0x307f7: 0x6c894220, + 0x307f8: 0x6c894420, 0x307f9: 0x6c894620, 0x307fa: 0x6c894820, 0x307fb: 0x6c894a20, + 0x307fc: 0x6c894c20, 0x307fd: 0x6c894e20, 0x307fe: 0x6c895020, 0x307ff: 0x6c895220, + // Block 0xc20, offset 0x30800 + 0x30800: 0x6c895420, 0x30801: 0x6c895620, 0x30802: 0x6c895820, 0x30803: 0x6c895a20, + 0x30804: 0x6c895c20, 0x30805: 0x6c895e20, 0x30806: 0x6c896020, 0x30807: 0x6c896220, + 0x30808: 0x6c896420, 0x30809: 0x6c896620, 0x3080a: 0x6c896820, 0x3080b: 0x6c896a20, + 0x3080c: 0x6c896c20, 0x3080d: 0x6c896e20, 0x3080e: 0x6c897020, 0x3080f: 0x6cb52220, + 0x30810: 0x6cb52420, 0x30811: 0x6cb52620, 0x30812: 0x6cb52820, 0x30813: 0x6cb52a20, + 0x30814: 0x6cb52c20, 0x30815: 0x6cb52e20, 0x30816: 0x6cb53020, 0x30817: 0x6cb53220, + 0x30818: 0x6cb53420, 0x30819: 0x6cb53620, 0x3081a: 0x6cb53820, 0x3081b: 0x6cb53a20, + 0x3081c: 0x6cb53c20, 0x3081d: 0x6cb53e20, 0x3081e: 0x6cb54020, 0x3081f: 0x6cb54220, + 0x30820: 0x6cb54420, 0x30821: 0x6cb54620, 0x30822: 0x6cb54820, 0x30823: 0x6cb54a20, + 0x30824: 0x6cb54c20, 0x30825: 0x6cb54e20, 0x30826: 0x6cb55020, 0x30827: 0x6cb55220, + 0x30828: 0x6cb55420, 0x30829: 0x6cb55620, 0x3082a: 0x6cb55820, 0x3082b: 0x6cb55a20, + 0x3082c: 0x6cb55c20, 0x3082d: 0x6cb55e20, 0x3082e: 0x6cb56020, 0x3082f: 0x6cb56220, + 0x30830: 0x6cb56420, 0x30831: 0x6cb56620, 0x30832: 0x6cb56820, 0x30833: 0x6cb56a20, + 0x30834: 0x6cb56c20, 0x30835: 0x6cb56e20, 0x30836: 0x6cb57020, 0x30837: 0x6cb57220, + 0x30838: 0x6ce52a20, 0x30839: 0x6ce52c20, 0x3083a: 0x6ce52e20, 0x3083b: 0x6ce53020, + 0x3083c: 0x6ce53220, 0x3083d: 0x6ce53420, 0x3083e: 0x6ce53620, 0x3083f: 0x6ce53820, + // Block 0xc21, offset 0x30840 + 0x30840: 0x6ce53a20, 0x30841: 0x6ce53c20, 0x30842: 0x6ce53e20, 0x30843: 0x6ce54020, + 0x30844: 0x6ce54220, 0x30845: 0x6ce54420, 0x30846: 0x6ce54620, 0x30847: 0x6ce54820, + 0x30848: 0x6ce54a20, 0x30849: 0x6ce54c20, 0x3084a: 0x6ce54e20, 0x3084b: 0x6ce55020, + 0x3084c: 0x6ce55220, 0x3084d: 0x6ce55420, 0x3084e: 0x6ce55620, 0x3084f: 0x6ce55820, + 0x30850: 0x6ce55a20, 0x30851: 0x6ce55c20, 0x30852: 0x6ce55e20, 0x30853: 0x6ce56020, + 0x30854: 0x6ce56220, 0x30855: 0x6ce56420, 0x30856: 0x6d13a420, 0x30857: 0x6d13a620, + 0x30858: 0x6d13a820, 0x30859: 0x6d13aa20, 0x3085a: 0x6d13ac20, 0x3085b: 0x6d13ae20, + 0x3085c: 0x6d13b020, 0x3085d: 0x6d13b220, 0x3085e: 0x6d13b420, 0x3085f: 0x6d13b620, + 0x30860: 0x6d13b820, 0x30861: 0x6d13ba20, 0x30862: 0x6d13bc20, 0x30863: 0x6d13be20, + 0x30864: 0x6d13c020, 0x30865: 0x6d13c220, 0x30866: 0x6d13c420, 0x30867: 0x6d13c620, + 0x30868: 0x6d13c820, 0x30869: 0x6d13ca20, 0x3086a: 0x6d13cc20, 0x3086b: 0x6d13ce20, + 0x3086c: 0x6d13d020, 0x3086d: 0x6d13d220, 0x3086e: 0x6d13d420, 0x3086f: 0x6d13d620, + 0x30870: 0x6d13d820, 0x30871: 0x6d13da20, 0x30872: 0x6d41c420, 0x30873: 0x6d41c620, + 0x30874: 0x6d41c820, 0x30875: 0x6d41ca20, 0x30876: 0x6d41cc20, 0x30877: 0x6d41ce20, + 0x30878: 0x6d41d020, 0x30879: 0x6d41d220, 0x3087a: 0x6d41d420, 0x3087b: 0x6d41d620, + 0x3087c: 0x6d41d820, 0x3087d: 0x6d41da20, 0x3087e: 0x6d41dc20, 0x3087f: 0x6d41de20, + // Block 0xc22, offset 0x30880 + 0x30880: 0x6d41e020, 0x30881: 0x6d41e220, 0x30882: 0x6d41e420, 0x30883: 0x6d41e620, + 0x30884: 0x6d41e820, 0x30885: 0x6d41ea20, 0x30886: 0x6d6ed220, 0x30887: 0x6d6ed420, + 0x30888: 0x6d6ed620, 0x30889: 0x6d6ed820, 0x3088a: 0x6d6eda20, 0x3088b: 0x6d6edc20, + 0x3088c: 0x6d6ede20, 0x3088d: 0x6d6ee020, 0x3088e: 0x6d6ee220, 0x3088f: 0x6d6ee420, + 0x30890: 0x6d6ee620, 0x30891: 0x6d6ee820, 0x30892: 0x6d6eea20, 0x30893: 0x6d6eec20, + 0x30894: 0x6d6eee20, 0x30895: 0x6d6ef020, 0x30896: 0x6d97ee20, 0x30897: 0x6d97f020, + 0x30898: 0x6d97f220, 0x30899: 0x6d97f420, 0x3089a: 0x6d97f620, 0x3089b: 0x6d97f820, + 0x3089c: 0x6d97fa20, 0x3089d: 0x6d97fc20, 0x3089e: 0x6d97fe20, 0x3089f: 0x6d980020, + 0x308a0: 0x6d980220, 0x308a1: 0x6dbaf020, 0x308a2: 0x6dbaf220, 0x308a3: 0x6dbaf420, + 0x308a4: 0x6dbaf620, 0x308a5: 0x6dbaf820, 0x308a6: 0x6dbafa20, 0x308a7: 0x6dbafc20, + 0x308a8: 0x6dbafe20, 0x308a9: 0x6dbb0020, 0x308aa: 0x6dbb0220, 0x308ab: 0x6dbb0420, + 0x308ac: 0x6dd8fc20, 0x308ad: 0x6dd8fe20, 0x308ae: 0x6dd90020, 0x308af: 0x6dd90220, + 0x308b0: 0x6dd90420, 0x308b1: 0x6dd90620, 0x308b2: 0x6df15e20, 0x308b3: 0x6e059220, + 0x308b4: 0x6e059420, 0x308b5: 0x6e239420, 0x308b6: 0x6e239620, 0x308b7: 0x6c41fe20, + 0x308b8: 0x6c420020, 0x308b9: 0x6cb58a20, 0x308ba: 0x6cb58c20, 0x308bb: 0x6ce57220, + 0x308bc: 0x6d6f0020, 0x308bd: 0x6df16620, 0x308be: 0x6e239820, 0x308bf: 0x6c0aac20, + // Block 0xc23, offset 0x308c0 + 0x308c0: 0x6c420220, 0x308c1: 0x6c62ac20, 0x308c2: 0x6c62ae20, 0x308c3: 0x6c898420, + 0x308c4: 0x6c898620, 0x308c5: 0x6c898820, 0x308c6: 0x6cb5aa20, 0x308c7: 0x6cb5ac20, + 0x308c8: 0x6cb5ae20, 0x308c9: 0x6cb5b020, 0x308ca: 0x6cb5b220, 0x308cb: 0x6ce59420, + 0x308cc: 0x6ce59620, 0x308cd: 0x6ce59820, 0x308ce: 0x6ce59a20, 0x308cf: 0x6ce59c20, + 0x308d0: 0x6ce59e20, 0x308d1: 0x6ce5a020, 0x308d2: 0x6ce5a220, 0x308d3: 0x6ce5a420, + 0x308d4: 0x6ce5a620, 0x308d5: 0x6ce5a820, 0x308d6: 0x6ce5aa20, 0x308d7: 0x6ce5ac20, + 0x308d8: 0x6d141e20, 0x308d9: 0x6d142020, 0x308da: 0x6d142220, 0x308db: 0x6d142420, + 0x308dc: 0x6d142620, 0x308dd: 0x6d142820, 0x308de: 0x6d142a20, 0x308df: 0x6d142c20, + 0x308e0: 0x6d142e20, 0x308e1: 0x6d421a20, 0x308e2: 0x6d421c20, 0x308e3: 0x6d421e20, + 0x308e4: 0x6d422020, 0x308e5: 0x6d422220, 0x308e6: 0x6d422420, 0x308e7: 0x6d422620, + 0x308e8: 0x6d422820, 0x308e9: 0x6d422a20, 0x308ea: 0x6d422c20, 0x308eb: 0x6d6f2420, + 0x308ec: 0x6d6f2620, 0x308ed: 0x6d6f2820, 0x308ee: 0x6d6f2a20, 0x308ef: 0x6d6f2c20, + 0x308f0: 0x6d6f2e20, 0x308f1: 0x6d6f3020, 0x308f2: 0x6d6f3220, 0x308f3: 0x6d6f3420, + 0x308f4: 0x6d6f3620, 0x308f5: 0x6d983620, 0x308f6: 0x6d983820, 0x308f7: 0x6dbb3420, + 0x308f8: 0x6d983a20, 0x308f9: 0x6d983c20, 0x308fa: 0x6d983e20, 0x308fb: 0x6d984020, + 0x308fc: 0x6d984220, 0x308fd: 0x6d984420, 0x308fe: 0x6d984620, 0x308ff: 0x6d984820, + // Block 0xc24, offset 0x30900 + 0x30900: 0x6dbb2420, 0x30901: 0x6d984a20, 0x30902: 0x6d984c20, 0x30903: 0x6dbb3620, + 0x30904: 0x6dbb3820, 0x30905: 0x6dbb3a20, 0x30906: 0x6dbb3c20, 0x30907: 0x6dbb3e20, + 0x30908: 0x6dbb4020, 0x30909: 0x6dbb4220, 0x3090a: 0x6dbb4420, 0x3090b: 0x6dbb4620, + 0x3090c: 0x6dbb4820, 0x3090d: 0x6d988e20, 0x3090e: 0x6dbb4a20, 0x3090f: 0x6dbb4c20, + 0x30910: 0x6dd92020, 0x30911: 0x6dd92220, 0x30912: 0x6dd92420, 0x30913: 0x6dd92620, + 0x30914: 0x6dd92820, 0x30915: 0x6dd92a20, 0x30916: 0x6dd92c20, 0x30917: 0x6dd92e20, + 0x30918: 0x6dd93020, 0x30919: 0x6df17620, 0x3091a: 0x6df17820, 0x3091b: 0x6df17a20, + 0x3091c: 0x6df17c20, 0x3091d: 0x6df17e20, 0x3091e: 0x6e05a220, 0x3091f: 0x6e05a420, + 0x30920: 0x6e05a620, 0x30921: 0x6e05a820, 0x30922: 0x6e165c20, 0x30923: 0x6e165e20, + 0x30924: 0x6e166020, 0x30925: 0x6e166220, 0x30926: 0x6e166420, 0x30927: 0x6e23a620, + 0x30928: 0x6c020a20, 0x30929: 0x6c052620, 0x3092a: 0x6c0aae20, 0x3092b: 0x6c159020, + 0x3092c: 0x6c159220, 0x3092d: 0x6c159420, 0x3092e: 0x6c159620, 0x3092f: 0x6c159820, + 0x30930: 0x6c280420, 0x30931: 0x6c280620, 0x30932: 0x6c280820, 0x30933: 0x6c280a20, + 0x30934: 0x6c280c20, 0x30935: 0x6c280e20, 0x30936: 0x6c281020, 0x30937: 0x6c281220, + 0x30938: 0x6c420820, 0x30939: 0x6c420a20, 0x3093a: 0x6c62b420, 0x3093b: 0x6c62b620, + 0x3093c: 0x6c62b820, 0x3093d: 0x6c62ba20, 0x3093e: 0x6c62bc20, 0x3093f: 0x6c62be20, + // Block 0xc25, offset 0x30940 + 0x30940: 0x6c62c020, 0x30941: 0x6c62c220, 0x30942: 0x6c62c420, 0x30943: 0x6c899620, + 0x30944: 0x6c899820, 0x30945: 0x6c899a20, 0x30946: 0x6c899c20, 0x30947: 0x6cb5c420, + 0x30948: 0x6cb5c620, 0x30949: 0x6cb5c820, 0x3094a: 0x6cb5ca20, 0x3094b: 0x6cb5cc20, + 0x3094c: 0x6cb5ce20, 0x3094d: 0x6cb5d020, 0x3094e: 0x6cb5d220, 0x3094f: 0x6cb5d420, + 0x30950: 0x6cb5d620, 0x30951: 0x6ce5ea20, 0x30952: 0x6ce5ec20, 0x30953: 0x6ce5ee20, + 0x30954: 0x6ce5f020, 0x30955: 0x6ce5f220, 0x30956: 0x6d146e20, 0x30957: 0x6d147020, + 0x30958: 0x6d147220, 0x30959: 0x6d147420, 0x3095a: 0x6d426420, 0x3095b: 0x6d989020, + 0x3095c: 0x6c421020, 0x3095d: 0x6c020c20, 0x3095e: 0x6c0ab420, 0x3095f: 0x6c0ab620, + 0x30960: 0x6c15a420, 0x30961: 0x6c15a620, 0x30962: 0x6c15a820, 0x30963: 0x6c15aa20, + 0x30964: 0x6c15ac20, 0x30965: 0x6c282620, 0x30966: 0x6c282820, 0x30967: 0x6c282a20, + 0x30968: 0x6c282c20, 0x30969: 0x6c282e20, 0x3096a: 0x6c283020, 0x3096b: 0x6c283220, + 0x3096c: 0x6c283420, 0x3096d: 0x6c283620, 0x3096e: 0x6c283820, 0x3096f: 0x6c283a20, + 0x30970: 0x6c283c20, 0x30971: 0x6c283e20, 0x30972: 0x6c284020, 0x30973: 0x6c284220, + 0x30974: 0x6c284420, 0x30975: 0x6c284620, 0x30976: 0x6c284820, 0x30977: 0x6c421820, + 0x30978: 0x6c421a20, 0x30979: 0x6c421c20, 0x3097a: 0x6c421e20, 0x3097b: 0x6c422020, + 0x3097c: 0x6c422220, 0x3097d: 0x6c422420, 0x3097e: 0x6c422620, 0x3097f: 0x6c422820, + // Block 0xc26, offset 0x30980 + 0x30980: 0x6c422a20, 0x30981: 0x6c422c20, 0x30982: 0x6c422e20, 0x30983: 0x6c423020, + 0x30984: 0x6c423220, 0x30985: 0x6c423420, 0x30986: 0x6c423620, 0x30987: 0x6c423820, + 0x30988: 0x6c423a20, 0x30989: 0x6c423c20, 0x3098a: 0x6c62d620, 0x3098b: 0x6c62d820, + 0x3098c: 0x6c62da20, 0x3098d: 0x6c62dc20, 0x3098e: 0x6c62de20, 0x3098f: 0x6c62e020, + 0x30990: 0x6c62e220, 0x30991: 0x6c62e420, 0x30992: 0x6c62e620, 0x30993: 0x6c62e820, + 0x30994: 0x6c62ea20, 0x30995: 0x6c62ec20, 0x30996: 0x6c89b220, 0x30997: 0x6c89b420, + 0x30998: 0x6c89b620, 0x30999: 0x6c89b820, 0x3099a: 0x6c89d820, 0x3099b: 0x6c89ba20, + 0x3099c: 0x6c89bc20, 0x3099d: 0x6c89be20, 0x3099e: 0x6c89c020, 0x3099f: 0x6c89c220, + 0x309a0: 0x6c89c420, 0x309a1: 0x6c89c620, 0x309a2: 0x6c89c820, 0x309a3: 0x6c89ca20, + 0x309a4: 0x6c89cc20, 0x309a5: 0x6c89ce20, 0x309a6: 0x6c89d020, 0x309a7: 0x6c89d220, + 0x309a8: 0x6c89d420, 0x309a9: 0x6c89d620, 0x309aa: 0x6cb5e820, 0x309ab: 0x6cb5ea20, + 0x309ac: 0x6cb5ec20, 0x309ad: 0x6cb5ee20, 0x309ae: 0x6cb5f020, 0x309af: 0x6cb5f220, + 0x309b0: 0x6cb5f420, 0x309b1: 0x6cb5f620, 0x309b2: 0x6ce5fa20, 0x309b3: 0x6cb5f820, + 0x309b4: 0x6cb5fa20, 0x309b5: 0x6cb5fc20, 0x309b6: 0x6cb5fe20, 0x309b7: 0x6cb60020, + 0x309b8: 0x6cb60220, 0x309b9: 0x6cb60420, 0x309ba: 0x6cb60620, 0x309bb: 0x6ce60220, + 0x309bc: 0x6cb60820, 0x309bd: 0x6ce60420, 0x309be: 0x6ce60620, 0x309bf: 0x6ce60820, + // Block 0xc27, offset 0x309c0 + 0x309c0: 0x6ce60a20, 0x309c1: 0x6ce60c20, 0x309c2: 0x6ce60e20, 0x309c3: 0x6ce61020, + 0x309c4: 0x6ce61220, 0x309c5: 0x6ce61420, 0x309c6: 0x6ce61620, 0x309c7: 0x6ce61820, + 0x309c8: 0x6ce61a20, 0x309c9: 0x6ce61c20, 0x309ca: 0x6ce61e20, 0x309cb: 0x6ce62020, + 0x309cc: 0x6ce62220, 0x309cd: 0x6ce62420, 0x309ce: 0x6ce62620, 0x309cf: 0x6d147e20, + 0x309d0: 0x6ce62820, 0x309d1: 0x6d148c20, 0x309d2: 0x6d148e20, 0x309d3: 0x6d149020, + 0x309d4: 0x6d149220, 0x309d5: 0x6d149420, 0x309d6: 0x6d149620, 0x309d7: 0x6d149820, + 0x309d8: 0x6d149a20, 0x309d9: 0x6d426a20, 0x309da: 0x6d427420, 0x309db: 0x6d427620, + 0x309dc: 0x6d427820, 0x309dd: 0x6d427a20, 0x309de: 0x6d427c20, 0x309df: 0x6d427e20, + 0x309e0: 0x6d428020, 0x309e1: 0x6d428220, 0x309e2: 0x6d6f9020, 0x309e3: 0x6d6f9220, + 0x309e4: 0x6d6f9420, 0x309e5: 0x6d6f9620, 0x309e6: 0x6d989820, 0x309e7: 0x6d989a20, + 0x309e8: 0x6d989c20, 0x309e9: 0x6d989e20, 0x309ea: 0x6d98a020, 0x309eb: 0x6d98a220, + 0x309ec: 0x6dbb9220, 0x309ed: 0x6dbb9420, 0x309ee: 0x6dbb9620, 0x309ef: 0x6dbb9820, + 0x309f0: 0x6dbb9a20, 0x309f1: 0x6dbb9c20, 0x309f2: 0x6dbb9e20, 0x309f3: 0x6dd96a20, + 0x309f4: 0x6df1a420, 0x309f5: 0x6e05dc20, 0x309f6: 0x6c427220, 0x309f7: 0x6d98c020, + 0x309f8: 0x6dbbb220, 0x309f9: 0x6c427420, 0x309fa: 0x6c8a3220, 0x309fb: 0x6c8a3420, + 0x309fc: 0x6c8a3620, 0x309fd: 0x6c8a3820, 0x309fe: 0x6c8a3a20, 0x309ff: 0x6cb66420, + // Block 0xc28, offset 0x30a00 + 0x30a00: 0x6cb66620, 0x30a01: 0x6ce69020, 0x30a02: 0x6ce69220, 0x30a03: 0x6ce69420, + 0x30a04: 0x6ce69620, 0x30a05: 0x6ce69820, 0x30a06: 0x6ce69a20, 0x30a07: 0x6ce69c20, + 0x30a08: 0x6ce69e20, 0x30a09: 0x6d14e820, 0x30a0a: 0x6d14ea20, 0x30a0b: 0x6d14ec20, + 0x30a0c: 0x6d42ce20, 0x30a0d: 0x6d14ee20, 0x30a0e: 0x6d14f020, 0x30a0f: 0x6d14f220, + 0x30a10: 0x6d42d220, 0x30a11: 0x6d42d420, 0x30a12: 0x6d42d620, 0x30a13: 0x6d6fd020, + 0x30a14: 0x6d98cc20, 0x30a15: 0x6d98ce20, 0x30a16: 0x6dbbba20, 0x30a17: 0x6dd98c20, + 0x30a18: 0x6dd98e20, 0x30a19: 0x6dd99020, 0x30a1a: 0x6dd99220, 0x30a1b: 0x6dd99420, + 0x30a1c: 0x6dd99620, 0x30a1d: 0x6dd99820, 0x30a1e: 0x6dd99a20, 0x30a1f: 0x6dd99c20, + 0x30a20: 0x6dd99e20, 0x30a21: 0x6df1b020, 0x30a22: 0x6dd9bc20, 0x30a23: 0x6df1b220, + 0x30a24: 0x6e169620, 0x30a25: 0x6e358020, 0x30a26: 0x6e358220, 0x30a27: 0x6e435c20, + 0x30a28: 0x6c427820, 0x30a29: 0x6cb67e20, 0x30a2a: 0x6cb68020, 0x30a2b: 0x6cb68220, + 0x30a2c: 0x6ce6c220, 0x30a2d: 0x6ce6c420, 0x30a2e: 0x6ce6c620, 0x30a2f: 0x6ce6c820, + 0x30a30: 0x6ce6ca20, 0x30a31: 0x6ce6cc20, 0x30a32: 0x6ce6ce20, 0x30a33: 0x6ce6d020, + 0x30a34: 0x6d151a20, 0x30a35: 0x6d151c20, 0x30a36: 0x6d151e20, 0x30a37: 0x6d152020, + 0x30a38: 0x6d152220, 0x30a39: 0x6d152420, 0x30a3a: 0x6d152620, 0x30a3b: 0x6d152820, + 0x30a3c: 0x6d152a20, 0x30a3d: 0x6d152c20, 0x30a3e: 0x6d152e20, 0x30a3f: 0x6d431c20, + // Block 0xc29, offset 0x30a40 + 0x30a40: 0x6d431e20, 0x30a41: 0x6d432020, 0x30a42: 0x6d700220, 0x30a43: 0x6d700420, + 0x30a44: 0x6d700620, 0x30a45: 0x6d700820, 0x30a46: 0x6d700a20, 0x30a47: 0x6d700c20, + 0x30a48: 0x6d700e20, 0x30a49: 0x6d701020, 0x30a4a: 0x6d701220, 0x30a4b: 0x6d991620, + 0x30a4c: 0x6d991820, 0x30a4d: 0x6d991a20, 0x30a4e: 0x6d991c20, 0x30a4f: 0x6d991e20, + 0x30a50: 0x6d992020, 0x30a51: 0x6d992220, 0x30a52: 0x6d992420, 0x30a53: 0x6d992620, + 0x30a54: 0x6d992820, 0x30a55: 0x6d992a20, 0x30a56: 0x6d992c20, 0x30a57: 0x6d992e20, + 0x30a58: 0x6dbbfa20, 0x30a59: 0x6dbbfc20, 0x30a5a: 0x6dbbfe20, 0x30a5b: 0x6dbc0020, + 0x30a5c: 0x6dbc0220, 0x30a5d: 0x6dbc0420, 0x30a5e: 0x6dbc0620, 0x30a5f: 0x6dbc0820, + 0x30a60: 0x6dbc0a20, 0x30a61: 0x6dbc5220, 0x30a62: 0x6dd9ca20, 0x30a63: 0x6dd9cc20, + 0x30a64: 0x6dd9ce20, 0x30a65: 0x6dd9d020, 0x30a66: 0x6df1de20, 0x30a67: 0x6df1e020, + 0x30a68: 0x6df1e220, 0x30a69: 0x6df1e420, 0x30a6a: 0x6df1e620, 0x30a6b: 0x6df1e820, + 0x30a6c: 0x6df1ea20, 0x30a6d: 0x6df1ec20, 0x30a6e: 0x6e061e20, 0x30a6f: 0x6e062020, + 0x30a70: 0x6e062220, 0x30a71: 0x6e062420, 0x30a72: 0x6e16b020, 0x30a73: 0x6e062620, + 0x30a74: 0x6e062820, 0x30a75: 0x6e16b220, 0x30a76: 0x6e16b420, 0x30a77: 0x6e16b620, + 0x30a78: 0x6e16b820, 0x30a79: 0x6e16ba20, 0x30a7a: 0x6e16bc20, 0x30a7b: 0x6e16be20, + 0x30a7c: 0x6e23d820, 0x30a7d: 0x6e23da20, 0x30a7e: 0x6e23dc20, 0x30a7f: 0x6e23de20, + // Block 0xc2a, offset 0x30a80 + 0x30a80: 0x6e23e020, 0x30a81: 0x6e2dea20, 0x30a82: 0x6e359020, 0x30a83: 0x6e359220, + 0x30a84: 0x6e359420, 0x30a85: 0x6e359620, 0x30a86: 0x6e359820, 0x30a87: 0x6e359a20, + 0x30a88: 0x6e359c20, 0x30a89: 0x6e3b0420, 0x30a8a: 0x6e3ec220, 0x30a8b: 0x6e416820, + 0x30a8c: 0x6e416a20, 0x30a8d: 0x6e416c20, 0x30a8e: 0x6e416e20, 0x30a8f: 0x6e44a620, + 0x30a90: 0x6e472220, 0x30a91: 0x6c427a20, 0x30a92: 0x6c427c20, 0x30a93: 0x6ce6f620, + 0x30a94: 0x6ce6f820, 0x30a95: 0x6d155420, 0x30a96: 0x6d155620, 0x30a97: 0x6d435020, + 0x30a98: 0x6d435220, 0x30a99: 0x6d435420, 0x30a9a: 0x6d704e20, 0x30a9b: 0x6d997a20, + 0x30a9c: 0x6d997c20, 0x30a9d: 0x6dda1c20, 0x30a9e: 0x6c427e20, 0x30a9f: 0x6ce70020, + 0x30aa0: 0x6d705220, 0x30aa1: 0x6df23a20, 0x30aa2: 0x6c632e20, 0x30aa3: 0x6c428020, + 0x30aa4: 0x6d436220, 0x30aa5: 0x6d705c20, 0x30aa6: 0x6d998a20, 0x30aa7: 0x6e16f420, + 0x30aa8: 0x6e2dfe20, 0x30aa9: 0x6c633220, 0x30aaa: 0x6cb6a820, 0x30aab: 0x6ce71e20, + 0x30aac: 0x6ce72020, 0x30aad: 0x6ce72220, 0x30aae: 0x6ce72420, 0x30aaf: 0x6ce72620, + 0x30ab0: 0x6ce72820, 0x30ab1: 0x6ce72a20, 0x30ab2: 0x6d158820, 0x30ab3: 0x6d158a20, + 0x30ab4: 0x6d158c20, 0x30ab5: 0x6d158e20, 0x30ab6: 0x6d159020, 0x30ab7: 0x6d159220, + 0x30ab8: 0x6d159420, 0x30ab9: 0x6d159620, 0x30aba: 0x6d438a20, 0x30abb: 0x6d438c20, + 0x30abc: 0x6d438e20, 0x30abd: 0x6d439020, 0x30abe: 0x6d439220, 0x30abf: 0x6d439420, + // Block 0xc2b, offset 0x30ac0 + 0x30ac0: 0x6d439620, 0x30ac1: 0x6d439820, 0x30ac2: 0x6d439a20, 0x30ac3: 0x6d439c20, + 0x30ac4: 0x6d439e20, 0x30ac5: 0x6d43a020, 0x30ac6: 0x6d43a220, 0x30ac7: 0x6d707420, + 0x30ac8: 0x6d707620, 0x30ac9: 0x6d707820, 0x30aca: 0x6d707a20, 0x30acb: 0x6d707c20, + 0x30acc: 0x6d707e20, 0x30acd: 0x6d708020, 0x30ace: 0x6d708220, 0x30acf: 0x6d708420, + 0x30ad0: 0x6d708620, 0x30ad1: 0x6d708820, 0x30ad2: 0x6d708a20, 0x30ad3: 0x6d99b220, + 0x30ad4: 0x6d99b420, 0x30ad5: 0x6d99b620, 0x30ad6: 0x6d99b820, 0x30ad7: 0x6d99ba20, + 0x30ad8: 0x6d99bc20, 0x30ad9: 0x6d99be20, 0x30ada: 0x6dbc7420, 0x30adb: 0x6dbc7620, + 0x30adc: 0x6dbc7820, 0x30add: 0x6dbc7a20, 0x30ade: 0x6dbc7c20, 0x30adf: 0x6dbc7e20, + 0x30ae0: 0x6dbc8020, 0x30ae1: 0x6dbc8220, 0x30ae2: 0x6dda3e20, 0x30ae3: 0x6dda4020, + 0x30ae4: 0x6dda4220, 0x30ae5: 0x6dda4420, 0x30ae6: 0x6dda4620, 0x30ae7: 0x6dda4820, + 0x30ae8: 0x6dda4a20, 0x30ae9: 0x6dda4c20, 0x30aea: 0x6dda4e20, 0x30aeb: 0x6dda5020, + 0x30aec: 0x6dda5220, 0x30aed: 0x6dda5420, 0x30aee: 0x6dda5620, 0x30aef: 0x6dda5820, + 0x30af0: 0x6dda5a20, 0x30af1: 0x6df24e20, 0x30af2: 0x6df25020, 0x30af3: 0x6df25220, + 0x30af4: 0x6df25420, 0x30af5: 0x6df25620, 0x30af6: 0x6df25820, 0x30af7: 0x6df25a20, + 0x30af8: 0x6e069020, 0x30af9: 0x6e069220, 0x30afa: 0x6e069420, 0x30afb: 0x6e069620, + 0x30afc: 0x6e171620, 0x30afd: 0x6e171820, 0x30afe: 0x6e171a20, 0x30aff: 0x6e171c20, + // Block 0xc2c, offset 0x30b00 + 0x30b00: 0x6e241820, 0x30b01: 0x6e241a20, 0x30b02: 0x6e241c20, 0x30b03: 0x6e241e20, + 0x30b04: 0x6e2e0e20, 0x30b05: 0x6e2e1020, 0x30b06: 0x6e35bc20, 0x30b07: 0x6e35be20, + 0x30b08: 0x6e35c020, 0x30b09: 0x6e3ee020, 0x30b0a: 0x6e456e20, 0x30b0b: 0x6c633420, + 0x30b0c: 0x6ce73420, 0x30b0d: 0x6d43e020, 0x30b0e: 0x6d43e220, 0x30b0f: 0x6d70c220, + 0x30b10: 0x6d70c420, 0x30b11: 0x6d70c620, 0x30b12: 0x6d99ee20, 0x30b13: 0x6dbcc620, + 0x30b14: 0x6dbcc820, 0x30b15: 0x6dbcca20, 0x30b16: 0x6ddaaa20, 0x30b17: 0x6ddaac20, + 0x30b18: 0x6ddaae20, 0x30b19: 0x6ddab020, 0x30b1a: 0x6ddab220, 0x30b1b: 0x6e06d420, + 0x30b1c: 0x6df2a820, 0x30b1d: 0x6df2aa20, 0x30b1e: 0x6df2ac20, 0x30b1f: 0x6df2ae20, + 0x30b20: 0x6e06d620, 0x30b21: 0x6e174220, 0x30b22: 0x6e174420, 0x30b23: 0x6e244820, + 0x30b24: 0x6e35ce20, 0x30b25: 0x6e35d020, 0x30b26: 0x6c053420, 0x30b27: 0x6c287c20, + 0x30b28: 0x6c633620, 0x30b29: 0x6ce73820, 0x30b2a: 0x6d15d420, 0x30b2b: 0x6d15d620, + 0x30b2c: 0x6d43fc20, 0x30b2d: 0x6c633c20, 0x30b2e: 0x6d15e020, 0x30b2f: 0x6d70e220, + 0x30b30: 0x6d9a0420, 0x30b31: 0x6dbcea20, 0x30b32: 0x6df2c620, 0x30b33: 0x6c633e20, + 0x30b34: 0x6d15e820, 0x30b35: 0x6d15ea20, 0x30b36: 0x6d440420, 0x30b37: 0x6d440620, + 0x30b38: 0x6d9a0c20, 0x30b39: 0x6ddacc20, 0x30b3a: 0x6ddace20, 0x30b3b: 0x6df2d020, + 0x30b3c: 0x6df2d220, 0x30b3d: 0x6e06f220, 0x30b3e: 0x6e06f420, 0x30b3f: 0x6e06f620, + // Block 0xc2d, offset 0x30b40 + 0x30b40: 0x6e2e3c20, 0x30b41: 0x6c634020, 0x30b42: 0x6cb6b220, 0x30b43: 0x6cb6b420, + 0x30b44: 0x6cb6b620, 0x30b45: 0x6ce74820, 0x30b46: 0x6ce74a20, 0x30b47: 0x6ce74c20, + 0x30b48: 0x6ce74e20, 0x30b49: 0x6d15f220, 0x30b4a: 0x6d15fa20, 0x30b4b: 0x6d15fc20, + 0x30b4c: 0x6d15fe20, 0x30b4d: 0x6d160020, 0x30b4e: 0x6d160220, 0x30b4f: 0x6d160420, + 0x30b50: 0x6d160620, 0x30b51: 0x6d160820, 0x30b52: 0x6d160a20, 0x30b53: 0x6d160c20, + 0x30b54: 0x6d442620, 0x30b55: 0x6d442820, 0x30b56: 0x6d442a20, 0x30b57: 0x6d442c20, + 0x30b58: 0x6d442e20, 0x30b59: 0x6d441220, 0x30b5a: 0x6d443020, 0x30b5b: 0x6d710020, + 0x30b5c: 0x6d710220, 0x30b5d: 0x6d710420, 0x30b5e: 0x6d710620, 0x30b5f: 0x6d710820, + 0x30b60: 0x6d710a20, 0x30b61: 0x6d710c20, 0x30b62: 0x6d710e20, 0x30b63: 0x6d711020, + 0x30b64: 0x6d9a2a20, 0x30b65: 0x6d9a2c20, 0x30b66: 0x6d711220, 0x30b67: 0x6d711420, + 0x30b68: 0x6d711620, 0x30b69: 0x6d711820, 0x30b6a: 0x6d711a20, 0x30b6b: 0x6d711c20, + 0x30b6c: 0x6d711e20, 0x30b6d: 0x6d9a2e20, 0x30b6e: 0x6d9a3020, 0x30b6f: 0x6d9a3220, + 0x30b70: 0x6d9a3420, 0x30b71: 0x6d9a3620, 0x30b72: 0x6d9a3820, 0x30b73: 0x6d9a3a20, + 0x30b74: 0x6d9a3c20, 0x30b75: 0x6d9a3e20, 0x30b76: 0x6d9a4020, 0x30b77: 0x6d9a4220, + 0x30b78: 0x6d9a4420, 0x30b79: 0x6d9a4620, 0x30b7a: 0x6d9a4820, 0x30b7b: 0x6d9a4a20, + 0x30b7c: 0x6d9a4c20, 0x30b7d: 0x6d9a4e20, 0x30b7e: 0x6ddaf020, 0x30b7f: 0x6ddada20, + // Block 0xc2e, offset 0x30b80 + 0x30b80: 0x6dbd0c20, 0x30b81: 0x6dbd0e20, 0x30b82: 0x6dbd1020, 0x30b83: 0x6dbd1220, + 0x30b84: 0x6dbd1420, 0x30b85: 0x6dbd1620, 0x30b86: 0x6dbd1820, 0x30b87: 0x6dbd1a20, + 0x30b88: 0x6dbd1c20, 0x30b89: 0x6dbd1e20, 0x30b8a: 0x6dbd2020, 0x30b8b: 0x6ddaf220, + 0x30b8c: 0x6ddaf420, 0x30b8d: 0x6ddaf620, 0x30b8e: 0x6ddaf820, 0x30b8f: 0x6ddafa20, + 0x30b90: 0x6ddafc20, 0x30b91: 0x6ddafe20, 0x30b92: 0x6ddb0020, 0x30b93: 0x6ddb0220, + 0x30b94: 0x6ddb0420, 0x30b95: 0x6ddb0620, 0x30b96: 0x6df2f020, 0x30b97: 0x6df2f220, + 0x30b98: 0x6df2f420, 0x30b99: 0x6df2f620, 0x30b9a: 0x6df2f820, 0x30b9b: 0x6df2fa20, + 0x30b9c: 0x6df2fc20, 0x30b9d: 0x6df2fe20, 0x30b9e: 0x6df30020, 0x30b9f: 0x6e070e20, + 0x30ba0: 0x6e071020, 0x30ba1: 0x6e071220, 0x30ba2: 0x6e071420, 0x30ba3: 0x6e071620, + 0x30ba4: 0x6e177220, 0x30ba5: 0x6e177420, 0x30ba6: 0x6e177620, 0x30ba7: 0x6e177820, + 0x30ba8: 0x6e177a20, 0x30ba9: 0x6e246e20, 0x30baa: 0x6e247020, 0x30bab: 0x6e247220, + 0x30bac: 0x6e2e4020, 0x30bad: 0x6e2e4220, 0x30bae: 0x6e2e4420, 0x30baf: 0x6e2e4620, + 0x30bb0: 0x6e35de20, 0x30bb1: 0x6e3b3820, 0x30bb2: 0x6e3b3a20, 0x30bb3: 0x6e418220, + 0x30bb4: 0x6e418420, 0x30bb5: 0x6c15d220, 0x30bb6: 0x6c428620, 0x30bb7: 0x6c428820, + 0x30bb8: 0x6c634420, 0x30bb9: 0x6c634620, 0x30bba: 0x6c634820, 0x30bbb: 0x6c634a20, + 0x30bbc: 0x6c8a5220, 0x30bbd: 0x6c8a5420, 0x30bbe: 0x6c8a5620, 0x30bbf: 0x6c8a5820, + // Block 0xc2f, offset 0x30bc0 + 0x30bc0: 0x6c8a5a20, 0x30bc1: 0x6c8a5c20, 0x30bc2: 0x6c8a5e20, 0x30bc3: 0x6c8a6020, + 0x30bc4: 0x6c8a6220, 0x30bc5: 0x6cb6c020, 0x30bc6: 0x6cb6c220, 0x30bc7: 0x6cb6c420, + 0x30bc8: 0x6cb6c620, 0x30bc9: 0x6ce76220, 0x30bca: 0x6ce76420, 0x30bcb: 0x6ce76620, + 0x30bcc: 0x6ce76820, 0x30bcd: 0x6ce76a20, 0x30bce: 0x6ce76c20, 0x30bcf: 0x6ce76e20, + 0x30bd0: 0x6d163e20, 0x30bd1: 0x6d164020, 0x30bd2: 0x6d164220, 0x30bd3: 0x6d164420, + 0x30bd4: 0x6d164620, 0x30bd5: 0x6d164820, 0x30bd6: 0x6d164a20, 0x30bd7: 0x6d447220, + 0x30bd8: 0x6d715e20, 0x30bd9: 0x6d716020, 0x30bda: 0x6d716220, 0x30bdb: 0x6d716420, + 0x30bdc: 0x6d716620, 0x30bdd: 0x6d716820, 0x30bde: 0x6d9ab220, 0x30bdf: 0x6d9ab420, + 0x30be0: 0x6d9ab620, 0x30be1: 0x6d9ab820, 0x30be2: 0x6ddb3e20, 0x30be3: 0x6ddb4020, + 0x30be4: 0x6df33820, 0x30be5: 0x6e074820, 0x30be6: 0x6e17aa20, 0x30be7: 0x6e2e6c20, + 0x30be8: 0x6c634e20, 0x30be9: 0x6ce77a20, 0x30bea: 0x6ce77c20, 0x30beb: 0x6d165820, + 0x30bec: 0x6d165a20, 0x30bed: 0x6d448a20, 0x30bee: 0x6d448c20, 0x30bef: 0x6d448e20, + 0x30bf0: 0x6d449020, 0x30bf1: 0x6d449220, 0x30bf2: 0x6d717020, 0x30bf3: 0x6d717220, + 0x30bf4: 0x6d9ac620, 0x30bf5: 0x6d9ac820, 0x30bf6: 0x6dbd7820, 0x30bf7: 0x6dbd7a20, + 0x30bf8: 0x6ddb5020, 0x30bf9: 0x6ddb5220, 0x30bfa: 0x6ddb5420, 0x30bfb: 0x6df34220, + 0x30bfc: 0x6df34420, 0x30bfd: 0x6df34620, 0x30bfe: 0x6df34820, 0x30bff: 0x6df34a20, + // Block 0xc30, offset 0x30c00 + 0x30c00: 0x6df34c20, 0x30c01: 0x6e074e20, 0x30c02: 0x6e075020, 0x30c03: 0x6e075220, + 0x30c04: 0x6e075420, 0x30c05: 0x6e17b020, 0x30c06: 0x6e17b220, 0x30c07: 0x6e17b420, + 0x30c08: 0x6e17b620, 0x30c09: 0x6e17b820, 0x30c0a: 0x6e17ba20, 0x30c0b: 0x6e249020, + 0x30c0c: 0x6e418c20, 0x30c0d: 0x6e418e20, 0x30c0e: 0x6c053620, 0x30c0f: 0x6c287e20, + 0x30c10: 0x6c635020, 0x30c11: 0x6c635220, 0x30c12: 0x6c635420, 0x30c13: 0x6ce78e20, + 0x30c14: 0x6d168020, 0x30c15: 0x6d44b820, 0x30c16: 0x6d44b620, 0x30c17: 0x6d44ba20, + 0x30c18: 0x6d719420, 0x30c19: 0x6d9af420, 0x30c1a: 0x6d9af620, 0x30c1b: 0x6c635c20, + 0x30c1c: 0x6e17dc20, 0x30c1d: 0x6e419420, 0x30c1e: 0x6c020e20, 0x30c1f: 0x6c636220, + 0x30c20: 0x6c636420, 0x30c21: 0x6cb6d820, 0x30c22: 0x6c8a6820, 0x30c23: 0x6c8a6a20, + 0x30c24: 0x6c8a6c20, 0x30c25: 0x6cb6da20, 0x30c26: 0x6cb6dc20, 0x30c27: 0x6ce79e20, + 0x30c28: 0x6ce7a020, 0x30c29: 0x6ce7a220, 0x30c2a: 0x6ce7a420, 0x30c2b: 0x6ce7a620, + 0x30c2c: 0x6d169420, 0x30c2d: 0x6ce7a820, 0x30c2e: 0x6d169620, 0x30c2f: 0x6ce7aa20, + 0x30c30: 0x6ce7ac20, 0x30c31: 0x6d169820, 0x30c32: 0x6ce7ae20, 0x30c33: 0x6d169a20, + 0x30c34: 0x6d169c20, 0x30c35: 0x6d169e20, 0x30c36: 0x6d16a020, 0x30c37: 0x6d16a220, + 0x30c38: 0x6d44d620, 0x30c39: 0x6d16a420, 0x30c3a: 0x6d71a620, 0x30c3b: 0x6d16a620, + 0x30c3c: 0x6d16a820, 0x30c3d: 0x6d16aa20, 0x30c3e: 0x6d16ac20, 0x30c3f: 0x6d16ae20, + // Block 0xc31, offset 0x30c40 + 0x30c40: 0x6d44d820, 0x30c41: 0x6d44da20, 0x30c42: 0x6d44dc20, 0x30c43: 0x6d44de20, + 0x30c44: 0x6d44e020, 0x30c45: 0x6d44e220, 0x30c46: 0x6d44e420, 0x30c47: 0x6d44e620, + 0x30c48: 0x6d71a820, 0x30c49: 0x6d44e820, 0x30c4a: 0x6d71aa20, 0x30c4b: 0x6d71ac20, + 0x30c4c: 0x6d44ea20, 0x30c4d: 0x6d71ae20, 0x30c4e: 0x6d44ec20, 0x30c4f: 0x6d44ee20, + 0x30c50: 0x6d9b0820, 0x30c51: 0x6d71b020, 0x30c52: 0x6d71b220, 0x30c53: 0x6d71b420, + 0x30c54: 0x6d71b620, 0x30c55: 0x6d71b820, 0x30c56: 0x6d71ba20, 0x30c57: 0x6d71bc20, + 0x30c58: 0x6d71be20, 0x30c59: 0x6d71c020, 0x30c5a: 0x6d9b0c20, 0x30c5b: 0x6d9b0e20, + 0x30c5c: 0x6d9b1020, 0x30c5d: 0x6d9b0a20, 0x30c5e: 0x6d9b1220, 0x30c5f: 0x6d9b1420, + 0x30c60: 0x6d9b1620, 0x30c61: 0x6d9b1820, 0x30c62: 0x6d9b1a20, 0x30c63: 0x6d9b1c20, + 0x30c64: 0x6d9b1e20, 0x30c65: 0x6dbdca20, 0x30c66: 0x6d9b2020, 0x30c67: 0x6d9b2220, + 0x30c68: 0x6d9b2420, 0x30c69: 0x6d9b2620, 0x30c6a: 0x6dbdcc20, 0x30c6b: 0x6dbdce20, + 0x30c6c: 0x6dbdd020, 0x30c6d: 0x6dbdd220, 0x30c6e: 0x6ddb9a20, 0x30c6f: 0x6dbdd420, + 0x30c70: 0x6dbdd620, 0x30c71: 0x6dbdd820, 0x30c72: 0x6dbdda20, 0x30c73: 0x6dbddc20, + 0x30c74: 0x6d9b8c20, 0x30c75: 0x6dbdde20, 0x30c76: 0x6ddb9c20, 0x30c77: 0x6dbde020, + 0x30c78: 0x6ddb9e20, 0x30c79: 0x6ddba020, 0x30c7a: 0x6ddba220, 0x30c7b: 0x6ddba420, + 0x30c7c: 0x6ddba620, 0x30c7d: 0x6ddba820, 0x30c7e: 0x6ddbaa20, 0x30c7f: 0x6ddbac20, + // Block 0xc32, offset 0x30c80 + 0x30c80: 0x6ddbae20, 0x30c81: 0x6ddbb020, 0x30c82: 0x6dbe4420, 0x30c83: 0x6df38820, + 0x30c84: 0x6df38a20, 0x30c85: 0x6df38c20, 0x30c86: 0x6dbe4620, 0x30c87: 0x6df38e20, + 0x30c88: 0x6df39020, 0x30c89: 0x6df39220, 0x30c8a: 0x6e077420, 0x30c8b: 0x6e077620, + 0x30c8c: 0x6e077820, 0x30c8d: 0x6e077a20, 0x30c8e: 0x6e077c20, 0x30c8f: 0x6e17ec20, + 0x30c90: 0x6e077e20, 0x30c91: 0x6e078020, 0x30c92: 0x6e078220, 0x30c93: 0x6e078420, + 0x30c94: 0x6e24ae20, 0x30c95: 0x6e24b020, 0x30c96: 0x6e17ee20, 0x30c97: 0x6e17f020, + 0x30c98: 0x6e17f220, 0x30c99: 0x6e07c220, 0x30c9a: 0x6e24b220, 0x30c9b: 0x6e24b420, + 0x30c9c: 0x6e2e8220, 0x30c9d: 0x6e360220, 0x30c9e: 0x6e3b4c20, 0x30c9f: 0x6e3b4e20, + 0x30ca0: 0x6e419820, 0x30ca1: 0x6e419a20, 0x30ca2: 0x6e457220, 0x30ca3: 0x6c021020, + 0x30ca4: 0x6c0ac220, 0x30ca5: 0x6c0ac420, 0x30ca6: 0x6c15d420, 0x30ca7: 0x6c15d620, + 0x30ca8: 0x6c288020, 0x30ca9: 0x6c288220, 0x30caa: 0x6c288420, 0x30cab: 0x6c288620, + 0x30cac: 0x6c288820, 0x30cad: 0x6c288a20, 0x30cae: 0x6c288c20, 0x30caf: 0x6c429820, + 0x30cb0: 0x6c429a20, 0x30cb1: 0x6c429c20, 0x30cb2: 0x6c429e20, 0x30cb3: 0x6c42a020, + 0x30cb4: 0x6c42a220, 0x30cb5: 0x6c636820, 0x30cb6: 0x6c636a20, 0x30cb7: 0x6c636c20, + 0x30cb8: 0x6c636e20, 0x30cb9: 0x6c637020, 0x30cba: 0x6c637220, 0x30cbb: 0x6c637420, + 0x30cbc: 0x6c637620, 0x30cbd: 0x6c8a7420, 0x30cbe: 0x6c8a7620, 0x30cbf: 0x6c8a7820, + // Block 0xc33, offset 0x30cc0 + 0x30cc0: 0x6c8a7a20, 0x30cc1: 0x6c8a7c20, 0x30cc2: 0x6c8a7e20, 0x30cc3: 0x6cb6fa20, + 0x30cc4: 0x6cb6fc20, 0x30cc5: 0x6cb6fe20, 0x30cc6: 0x6cb70020, 0x30cc7: 0x6ce7d820, + 0x30cc8: 0x6ce7da20, 0x30cc9: 0x6d16f420, 0x30cca: 0x6ce7dc20, 0x30ccb: 0x6ce7de20, + 0x30ccc: 0x6d16f620, 0x30ccd: 0x6d16f820, 0x30cce: 0x6d16fa20, 0x30ccf: 0x6d16fc20, + 0x30cd0: 0x6d16fe20, 0x30cd1: 0x6d452020, 0x30cd2: 0x6d452220, 0x30cd3: 0x6d71fe20, + 0x30cd4: 0x6d720020, 0x30cd5: 0x6e3b5220, 0x30cd6: 0x6c637e20, 0x30cd7: 0x6cb70c20, + 0x30cd8: 0x6dbe4820, 0x30cd9: 0x6c638220, 0x30cda: 0x6d170820, 0x30cdb: 0x6d453620, + 0x30cdc: 0x6d453820, 0x30cdd: 0x6d453a20, 0x30cde: 0x6d9ba020, 0x30cdf: 0x6d9ba220, + 0x30ce0: 0x6d9ba420, 0x30ce1: 0x6dbe5620, 0x30ce2: 0x6dbe5820, 0x30ce3: 0x6dbe5a20, + 0x30ce4: 0x6ddc0420, 0x30ce5: 0x6ddc0620, 0x30ce6: 0x6df3ec20, 0x30ce7: 0x6df3ee20, + 0x30ce8: 0x6e07ca20, 0x30ce9: 0x6e182420, 0x30cea: 0x6e2e9a20, 0x30ceb: 0x6e41a020, + 0x30cec: 0x6c8a8e20, 0x30ced: 0x6ce7f220, 0x30cee: 0x6ce7f420, 0x30cef: 0x6d171420, + 0x30cf0: 0x6d171620, 0x30cf1: 0x6d171820, 0x30cf2: 0x6d171a20, 0x30cf3: 0x6d171c20, + 0x30cf4: 0x6d171e20, 0x30cf5: 0x6d172020, 0x30cf6: 0x6d455820, 0x30cf7: 0x6d455a20, + 0x30cf8: 0x6d455c20, 0x30cf9: 0x6d455e20, 0x30cfa: 0x6d456020, 0x30cfb: 0x6d456220, + 0x30cfc: 0x6d456420, 0x30cfd: 0x6d456620, 0x30cfe: 0x6d456820, 0x30cff: 0x6d456a20, + // Block 0xc34, offset 0x30d00 + 0x30d00: 0x6d456c20, 0x30d01: 0x6d456e20, 0x30d02: 0x6d457020, 0x30d03: 0x6d457220, + 0x30d04: 0x6d457420, 0x30d05: 0x6d457620, 0x30d06: 0x6d457820, 0x30d07: 0x6d457a20, + 0x30d08: 0x6d723220, 0x30d09: 0x6d723420, 0x30d0a: 0x6d723620, 0x30d0b: 0x6d723820, + 0x30d0c: 0x6d723a20, 0x30d0d: 0x6d723c20, 0x30d0e: 0x6d723e20, 0x30d0f: 0x6d724020, + 0x30d10: 0x6d724220, 0x30d11: 0x6d724420, 0x30d12: 0x6d724620, 0x30d13: 0x6d724820, + 0x30d14: 0x6d724a20, 0x30d15: 0x6d724c20, 0x30d16: 0x6d724e20, 0x30d17: 0x6d725020, + 0x30d18: 0x6d725220, 0x30d19: 0x6d725420, 0x30d1a: 0x6d725620, 0x30d1b: 0x6d725820, + 0x30d1c: 0x6d725a20, 0x30d1d: 0x6d725c20, 0x30d1e: 0x6d725e20, 0x30d1f: 0x6d726020, + 0x30d20: 0x6d726220, 0x30d21: 0x6d9bba20, 0x30d22: 0x6d9bbc20, 0x30d23: 0x6d9bbe20, + 0x30d24: 0x6d9bc020, 0x30d25: 0x6d9bc220, 0x30d26: 0x6d9bc420, 0x30d27: 0x6d9bc620, + 0x30d28: 0x6d9bc820, 0x30d29: 0x6d9bca20, 0x30d2a: 0x6d9bcc20, 0x30d2b: 0x6d9bce20, + 0x30d2c: 0x6d9bd020, 0x30d2d: 0x6d9bd220, 0x30d2e: 0x6d9bd420, 0x30d2f: 0x6d9bd620, + 0x30d30: 0x6d9bd820, 0x30d31: 0x6d9bda20, 0x30d32: 0x6d9bdc20, 0x30d33: 0x6dbec020, + 0x30d34: 0x6dbe7020, 0x30d35: 0x6dbe7220, 0x30d36: 0x6dbe7420, 0x30d37: 0x6dbe7620, + 0x30d38: 0x6dbe7820, 0x30d39: 0x6dbe7a20, 0x30d3a: 0x6dbe7c20, 0x30d3b: 0x6dbe7e20, + 0x30d3c: 0x6dbe8020, 0x30d3d: 0x6dbe8220, 0x30d3e: 0x6dbe8420, 0x30d3f: 0x6dbe8620, + // Block 0xc35, offset 0x30d40 + 0x30d40: 0x6dbe8820, 0x30d41: 0x6dbe8a20, 0x30d42: 0x6dbe8c20, 0x30d43: 0x6dbe8e20, + 0x30d44: 0x6ddc2820, 0x30d45: 0x6ddc2a20, 0x30d46: 0x6ddc2c20, 0x30d47: 0x6ddc2e20, + 0x30d48: 0x6ddc3020, 0x30d49: 0x6ddc3220, 0x30d4a: 0x6ddc3420, 0x30d4b: 0x6ddc3620, + 0x30d4c: 0x6ddc3820, 0x30d4d: 0x6ddc3a20, 0x30d4e: 0x6ddc3c20, 0x30d4f: 0x6ddc3e20, + 0x30d50: 0x6ddc4020, 0x30d51: 0x6ddc4220, 0x30d52: 0x6ddc4420, 0x30d53: 0x6ddc4620, + 0x30d54: 0x6df40a20, 0x30d55: 0x6df40c20, 0x30d56: 0x6df40e20, 0x30d57: 0x6df41020, + 0x30d58: 0x6df41220, 0x30d59: 0x6df41420, 0x30d5a: 0x6df41620, 0x30d5b: 0x6df41820, + 0x30d5c: 0x6df41a20, 0x30d5d: 0x6df41c20, 0x30d5e: 0x6df41e20, 0x30d5f: 0x6df42020, + 0x30d60: 0x6df42220, 0x30d61: 0x6df42420, 0x30d62: 0x6df42620, 0x30d63: 0x6df42820, + 0x30d64: 0x6df42a20, 0x30d65: 0x6df42c20, 0x30d66: 0x6df42e20, 0x30d67: 0x6df43020, + 0x30d68: 0x6df43220, 0x30d69: 0x6e07e620, 0x30d6a: 0x6e07e820, 0x30d6b: 0x6e07ea20, + 0x30d6c: 0x6e07ec20, 0x30d6d: 0x6e07ee20, 0x30d6e: 0x6e07f020, 0x30d6f: 0x6e07f220, + 0x30d70: 0x6e07f420, 0x30d71: 0x6e07f620, 0x30d72: 0x6e07f820, 0x30d73: 0x6e07fa20, + 0x30d74: 0x6e07fc20, 0x30d75: 0x6e07fe20, 0x30d76: 0x6e080020, 0x30d77: 0x6e080220, + 0x30d78: 0x6e080420, 0x30d79: 0x6e184220, 0x30d7a: 0x6e184420, 0x30d7b: 0x6e184620, + 0x30d7c: 0x6e184820, 0x30d7d: 0x6e184a20, 0x30d7e: 0x6e184c20, 0x30d7f: 0x6e184e20, + // Block 0xc36, offset 0x30d80 + 0x30d80: 0x6e185020, 0x30d81: 0x6e185220, 0x30d82: 0x6e185420, 0x30d83: 0x6e185620, + 0x30d84: 0x6e185820, 0x30d85: 0x6e185a20, 0x30d86: 0x6e185c20, 0x30d87: 0x6e185e20, + 0x30d88: 0x6e24ee20, 0x30d89: 0x6e24f020, 0x30d8a: 0x6e24f220, 0x30d8b: 0x6e24f420, + 0x30d8c: 0x6e24f620, 0x30d8d: 0x6e24f820, 0x30d8e: 0x6e24fa20, 0x30d8f: 0x6e24fc20, + 0x30d90: 0x6e24fe20, 0x30d91: 0x6e250020, 0x30d92: 0x6e250220, 0x30d93: 0x6e250420, + 0x30d94: 0x6e250620, 0x30d95: 0x6e250820, 0x30d96: 0x6e2ea420, 0x30d97: 0x6e2ea620, + 0x30d98: 0x6e2ea820, 0x30d99: 0x6e2eaa20, 0x30d9a: 0x6e2eac20, 0x30d9b: 0x6e2eae20, + 0x30d9c: 0x6e2eb020, 0x30d9d: 0x6e362220, 0x30d9e: 0x6e362420, 0x30d9f: 0x6e362620, + 0x30da0: 0x6e3f1420, 0x30da1: 0x6e3f1620, 0x30da2: 0x6e3f1820, 0x30da3: 0x6e3f1a20, + 0x30da4: 0x6e41a420, 0x30da5: 0x6e3f2620, 0x30da6: 0x6e41a620, 0x30da7: 0x6e41a820, + 0x30da8: 0x6e437a20, 0x30da9: 0x6e437c20, 0x30daa: 0x6e44c220, 0x30dab: 0x6e457620, + 0x30dac: 0x6c021220, 0x30dad: 0x6c0ac620, 0x30dae: 0x6c15da20, 0x30daf: 0x6c15dc20, + 0x30db0: 0x6c15de20, 0x30db1: 0x6c289820, 0x30db2: 0x6c289a20, 0x30db3: 0x6c289c20, + 0x30db4: 0x6c289e20, 0x30db5: 0x6c42ae20, 0x30db6: 0x6c42b020, 0x30db7: 0x6c42b220, + 0x30db8: 0x6c42b420, 0x30db9: 0x6c42b620, 0x30dba: 0x6c42b820, 0x30dbb: 0x6c42ba20, + 0x30dbc: 0x6c42bc20, 0x30dbd: 0x6c42be20, 0x30dbe: 0x6c42c020, 0x30dbf: 0x6c42c220, + // Block 0xc37, offset 0x30dc0 + 0x30dc0: 0x6c42c420, 0x30dc1: 0x6c638420, 0x30dc2: 0x6c638620, 0x30dc3: 0x6c638820, + 0x30dc4: 0x6c638a20, 0x30dc5: 0x6c638c20, 0x30dc6: 0x6c638e20, 0x30dc7: 0x6c639020, + 0x30dc8: 0x6c639220, 0x30dc9: 0x6c639420, 0x30dca: 0x6c8a9420, 0x30dcb: 0x6c8a9620, + 0x30dcc: 0x6c8a9820, 0x30dcd: 0x6c8a9a20, 0x30dce: 0x6c8a9c20, 0x30dcf: 0x6c8a9e20, + 0x30dd0: 0x6cb71420, 0x30dd1: 0x6cb71620, 0x30dd2: 0x6cb71820, 0x30dd3: 0x6cb71a20, + 0x30dd4: 0x6cb71c20, 0x30dd5: 0x6cb71e20, 0x30dd6: 0x6cb72020, 0x30dd7: 0x6ce80420, + 0x30dd8: 0x6ce80620, 0x30dd9: 0x6ce80820, 0x30dda: 0x6ce80a20, 0x30ddb: 0x6ce80c20, + 0x30ddc: 0x6d173220, 0x30ddd: 0x6d173420, 0x30dde: 0x6d173620, 0x30ddf: 0x6d173820, + 0x30de0: 0x6d45ac20, 0x30de1: 0x6d45ae20, 0x30de2: 0x6d45b020, 0x30de3: 0x6d72aa20, + 0x30de4: 0x6dbec420, 0x30de5: 0x6df48220, 0x30de6: 0x6e086e20, 0x30de7: 0x6e087020, + 0x30de8: 0x6c8aae20, 0x30de9: 0x6ce82c20, 0x30dea: 0x6d174820, 0x30deb: 0x6d174a20, + 0x30dec: 0x6d174c20, 0x30ded: 0x6d174e20, 0x30dee: 0x6d175020, 0x30def: 0x6d45bc20, + 0x30df0: 0x6d45be20, 0x30df1: 0x6d45c020, 0x30df2: 0x6d72bc20, 0x30df3: 0x6d72be20, + 0x30df4: 0x6d72c020, 0x30df5: 0x6d72c220, 0x30df6: 0x6d72c420, 0x30df7: 0x6d72c620, + 0x30df8: 0x6d9c4220, 0x30df9: 0x6d9c4420, 0x30dfa: 0x6d9c4620, 0x30dfb: 0x6d9c4820, + 0x30dfc: 0x6d9c4a20, 0x30dfd: 0x6dbed220, 0x30dfe: 0x6dbed420, 0x30dff: 0x6d9c6820, + // Block 0xc38, offset 0x30e00 + 0x30e00: 0x6ddcac20, 0x30e01: 0x6ddcae20, 0x30e02: 0x6df48c20, 0x30e03: 0x6df48e20, + 0x30e04: 0x6e087220, 0x30e05: 0x6df49020, 0x30e06: 0x6e087620, 0x30e07: 0x6e087820, + 0x30e08: 0x6e087a20, 0x30e09: 0x6e087c20, 0x30e0a: 0x6e087e20, 0x30e0b: 0x6e088020, + 0x30e0c: 0x6e088220, 0x30e0d: 0x6e189420, 0x30e0e: 0x6e189620, 0x30e0f: 0x6e189820, + 0x30e10: 0x6e254620, 0x30e11: 0x6e2ee620, 0x30e12: 0x6e254820, 0x30e13: 0x6e2ee820, + 0x30e14: 0x6e2eea20, 0x30e15: 0x6e364420, 0x30e16: 0x6e3b7420, 0x30e17: 0x6e3f2820, + 0x30e18: 0x6c8ab020, 0x30e19: 0x6cb73620, 0x30e1a: 0x6d45e620, 0x30e1b: 0x6d72e220, + 0x30e1c: 0x6ddcda20, 0x30e1d: 0x6e256420, 0x30e1e: 0x6e2ef820, 0x30e1f: 0x6c8ab220, + 0x30e20: 0x6ce84620, 0x30e21: 0x6d177820, 0x30e22: 0x6d177a20, 0x30e23: 0x6d460620, + 0x30e24: 0x6d460820, 0x30e25: 0x6d460a20, 0x30e26: 0x6d460c20, 0x30e27: 0x6d460e20, + 0x30e28: 0x6d461020, 0x30e29: 0x6d461220, 0x30e2a: 0x6d461420, 0x30e2b: 0x6d72f220, + 0x30e2c: 0x6d72f420, 0x30e2d: 0x6d9c7a20, 0x30e2e: 0x6d72f620, 0x30e2f: 0x6d72f820, + 0x30e30: 0x6d72fa20, 0x30e31: 0x6d72fc20, 0x30e32: 0x6d72fe20, 0x30e33: 0x6d730020, + 0x30e34: 0x6d730220, 0x30e35: 0x6d9c8020, 0x30e36: 0x6d9c8220, 0x30e37: 0x6d9c8420, + 0x30e38: 0x6d9c8620, 0x30e39: 0x6d9c8820, 0x30e3a: 0x6d9c8a20, 0x30e3b: 0x6d9c8c20, + 0x30e3c: 0x6dbf1420, 0x30e3d: 0x6dbf1620, 0x30e3e: 0x6dbf1820, 0x30e3f: 0x6dbf1a20, + // Block 0xc39, offset 0x30e40 + 0x30e40: 0x6dbf1c20, 0x30e41: 0x6dbf1e20, 0x30e42: 0x6dbf2020, 0x30e43: 0x6ddcf220, + 0x30e44: 0x6ddcf420, 0x30e45: 0x6ddcf620, 0x30e46: 0x6ddcf820, 0x30e47: 0x6d9c8e20, + 0x30e48: 0x6ddcfa20, 0x30e49: 0x6df4b220, 0x30e4a: 0x6df4b420, 0x30e4b: 0x6df4b620, + 0x30e4c: 0x6df4b820, 0x30e4d: 0x6df4ba20, 0x30e4e: 0x6df4bc20, 0x30e4f: 0x6df4be20, + 0x30e50: 0x6e08b220, 0x30e51: 0x6e08b420, 0x30e52: 0x6e08b620, 0x30e53: 0x6e08b820, + 0x30e54: 0x6e18b420, 0x30e55: 0x6e18b620, 0x30e56: 0x6e18b820, 0x30e57: 0x6e18ba20, + 0x30e58: 0x6e18bc20, 0x30e59: 0x6e256c20, 0x30e5a: 0x6e256e20, 0x30e5b: 0x6e257020, + 0x30e5c: 0x6e257220, 0x30e5d: 0x6e256820, 0x30e5e: 0x6e2f0020, 0x30e5f: 0x6e2f0220, + 0x30e60: 0x6e2f0420, 0x30e61: 0x6e365c20, 0x30e62: 0x6e365e20, 0x30e63: 0x6e3b8620, + 0x30e64: 0x6e41be20, 0x30e65: 0x6c8ab420, 0x30e66: 0x6d463c20, 0x30e67: 0x6d734420, + 0x30e68: 0x6d9cc020, 0x30e69: 0x6ddd3820, 0x30e6a: 0x6e08ee20, 0x30e6b: 0x6e25a420, + 0x30e6c: 0x6e367420, 0x30e6d: 0x6e367620, 0x30e6e: 0x6e41c820, 0x30e6f: 0x6c8aba20, + 0x30e70: 0x6e41ca20, 0x30e71: 0x6e44ca20, 0x30e72: 0x6c8abc20, 0x30e73: 0x6d9cc820, + 0x30e74: 0x6dbf5620, 0x30e75: 0x6ddd4020, 0x30e76: 0x6ddd4220, 0x30e77: 0x6df4fa20, + 0x30e78: 0x6e08f420, 0x30e79: 0x6e18f420, 0x30e7a: 0x6e18f620, 0x30e7b: 0x6e25ae20, + 0x30e7c: 0x6c8abe20, 0x30e7d: 0x6d179220, 0x30e7e: 0x6d465020, 0x30e7f: 0x6d465220, + // Block 0xc3a, offset 0x30e80 + 0x30e80: 0x6d465420, 0x30e81: 0x6d465620, 0x30e82: 0x6d465820, 0x30e83: 0x6d735820, + 0x30e84: 0x6d735a20, 0x30e85: 0x6d735c20, 0x30e86: 0x6d735e20, 0x30e87: 0x6d9cde20, + 0x30e88: 0x6dbf6220, 0x30e89: 0x6dbf6420, 0x30e8a: 0x6ddd5620, 0x30e8b: 0x6ddd5820, + 0x30e8c: 0x6ddd5a20, 0x30e8d: 0x6ddd5c20, 0x30e8e: 0x6ddd5e20, 0x30e8f: 0x6ddd6020, + 0x30e90: 0x6e090220, 0x30e91: 0x6e190620, 0x30e92: 0x6e190820, 0x30e93: 0x6e190a20, + 0x30e94: 0x6e190c20, 0x30e95: 0x6e25be20, 0x30e96: 0x6e25c020, 0x30e97: 0x6e368a20, + 0x30e98: 0x6e368c20, 0x30e99: 0x6e368e20, 0x30e9a: 0x6cb74420, 0x30e9b: 0x6d17c620, + 0x30e9c: 0x6d17c820, 0x30e9d: 0x6d17ca20, 0x30e9e: 0x6d17cc20, 0x30e9f: 0x6d469220, + 0x30ea0: 0x6d469420, 0x30ea1: 0x6d469620, 0x30ea2: 0x6d469820, 0x30ea3: 0x6d739620, + 0x30ea4: 0x6d739820, 0x30ea5: 0x6d739a20, 0x30ea6: 0x6d739c20, 0x30ea7: 0x6d739e20, + 0x30ea8: 0x6d73a020, 0x30ea9: 0x6d73a220, 0x30eaa: 0x6d73a420, 0x30eab: 0x6d73a620, + 0x30eac: 0x6d73a820, 0x30ead: 0x6d73aa20, 0x30eae: 0x6d73ac20, 0x30eaf: 0x6d73ae20, + 0x30eb0: 0x6d73b020, 0x30eb1: 0x6d73b220, 0x30eb2: 0x6d73b420, 0x30eb3: 0x6d73b620, + 0x30eb4: 0x6d73b820, 0x30eb5: 0x6d73ba20, 0x30eb6: 0x6d73bc20, 0x30eb7: 0x6d73be20, + 0x30eb8: 0x6d73c020, 0x30eb9: 0x6d73c220, 0x30eba: 0x6d9d2420, 0x30ebb: 0x6d9d2620, + 0x30ebc: 0x6d9d2820, 0x30ebd: 0x6d9d2a20, 0x30ebe: 0x6d9d2c20, 0x30ebf: 0x6d9d2e20, + // Block 0xc3b, offset 0x30ec0 + 0x30ec0: 0x6d9d3020, 0x30ec1: 0x6d9d3220, 0x30ec2: 0x6d9d3420, 0x30ec3: 0x6d9d3620, + 0x30ec4: 0x6d9d3820, 0x30ec5: 0x6d9d3a20, 0x30ec6: 0x6dbf9020, 0x30ec7: 0x6d9d3c20, + 0x30ec8: 0x6d9d3e20, 0x30ec9: 0x6d9d4020, 0x30eca: 0x6d9d4220, 0x30ecb: 0x6d9d4420, + 0x30ecc: 0x6d9d4620, 0x30ecd: 0x6d9d4820, 0x30ece: 0x6d9d4a20, 0x30ecf: 0x6d9d4c20, + 0x30ed0: 0x6d9d4e20, 0x30ed1: 0x6d9d5020, 0x30ed2: 0x6d9d5220, 0x30ed3: 0x6d9d5420, + 0x30ed4: 0x6d9d5620, 0x30ed5: 0x6d9d5820, 0x30ed6: 0x6d9d5a20, 0x30ed7: 0x6d9d5c20, + 0x30ed8: 0x6d9d5e20, 0x30ed9: 0x6dbf9c20, 0x30eda: 0x6dbf9e20, 0x30edb: 0x6dbfa020, + 0x30edc: 0x6dbfa220, 0x30edd: 0x6dbfa420, 0x30ede: 0x6dbfa620, 0x30edf: 0x6dbfa820, + 0x30ee0: 0x6dbfaa20, 0x30ee1: 0x6dbfac20, 0x30ee2: 0x6dbfae20, 0x30ee3: 0x6d9d6020, + 0x30ee4: 0x6dbfb020, 0x30ee5: 0x6dbfb220, 0x30ee6: 0x6dbfb420, 0x30ee7: 0x6dbfb620, + 0x30ee8: 0x6dbfb820, 0x30ee9: 0x6dbfba20, 0x30eea: 0x6dbfbc20, 0x30eeb: 0x6dbfbe20, + 0x30eec: 0x6dbfc020, 0x30eed: 0x6dbfc220, 0x30eee: 0x6dbfc420, 0x30eef: 0x6dbfc620, + 0x30ef0: 0x6dbfc820, 0x30ef1: 0x6dbfca20, 0x30ef2: 0x6dbfcc20, 0x30ef3: 0x6dbfce20, + 0x30ef4: 0x6dbfd020, 0x30ef5: 0x6ddd9820, 0x30ef6: 0x6ddd9a20, 0x30ef7: 0x6ddd9c20, + 0x30ef8: 0x6ddd9e20, 0x30ef9: 0x6ddda020, 0x30efa: 0x6dbfd220, 0x30efb: 0x6ddda220, + 0x30efc: 0x6ddda420, 0x30efd: 0x6ddda620, 0x30efe: 0x6ddda820, 0x30eff: 0x6dddaa20, + // Block 0xc3c, offset 0x30f00 + 0x30f00: 0x6dddac20, 0x30f01: 0x6dddae20, 0x30f02: 0x6dddb020, 0x30f03: 0x6dddb220, + 0x30f04: 0x6dddb420, 0x30f05: 0x6df51c20, 0x30f06: 0x6dddb620, 0x30f07: 0x6dddb820, + 0x30f08: 0x6dddba20, 0x30f09: 0x6dddbc20, 0x30f0a: 0x6dddbe20, 0x30f0b: 0x6dddc020, + 0x30f0c: 0x6dddc220, 0x30f0d: 0x6dddc420, 0x30f0e: 0x6dc03a20, 0x30f0f: 0x6dddc620, + 0x30f10: 0x6dddc820, 0x30f11: 0x6dddca20, 0x30f12: 0x6dddcc20, 0x30f13: 0x6dddce20, + 0x30f14: 0x6df54220, 0x30f15: 0x6df54420, 0x30f16: 0x6df54620, 0x30f17: 0x6df54820, + 0x30f18: 0x6df54a20, 0x30f19: 0x6df54c20, 0x30f1a: 0x6df54e20, 0x30f1b: 0x6df55020, + 0x30f1c: 0x6df55220, 0x30f1d: 0x6df55420, 0x30f1e: 0x6df55620, 0x30f1f: 0x6df55820, + 0x30f20: 0x6df55a20, 0x30f21: 0x6df55c20, 0x30f22: 0x6df55e20, 0x30f23: 0x6df56020, + 0x30f24: 0x6df56220, 0x30f25: 0x6df56420, 0x30f26: 0x6df56620, 0x30f27: 0x6df56820, + 0x30f28: 0x6df56a20, 0x30f29: 0x6df56c20, 0x30f2a: 0x6df56e20, 0x30f2b: 0x6df57020, + 0x30f2c: 0x6df57220, 0x30f2d: 0x6df57420, 0x30f2e: 0x6df57620, 0x30f2f: 0x6df57820, + 0x30f30: 0x6df57a20, 0x30f31: 0x6df57c20, 0x30f32: 0x6df57e20, 0x30f33: 0x6df58020, + 0x30f34: 0x6df58220, 0x30f35: 0x6df58420, 0x30f36: 0x6e093220, 0x30f37: 0x6e093420, + 0x30f38: 0x6e093620, 0x30f39: 0x6e093820, 0x30f3a: 0x6df61c20, 0x30f3b: 0x6e091c20, + 0x30f3c: 0x6e093a20, 0x30f3d: 0x6dddd020, 0x30f3e: 0x6e093c20, 0x30f3f: 0x6e093e20, + // Block 0xc3d, offset 0x30f40 + 0x30f40: 0x6e094020, 0x30f41: 0x6e094220, 0x30f42: 0x6e094420, 0x30f43: 0x6e094620, + 0x30f44: 0x6e094820, 0x30f45: 0x6e094a20, 0x30f46: 0x6e094c20, 0x30f47: 0x6e094e20, + 0x30f48: 0x6e095020, 0x30f49: 0x6e095220, 0x30f4a: 0x6e095420, 0x30f4b: 0x6e095620, + 0x30f4c: 0x6e095820, 0x30f4d: 0x6e095a20, 0x30f4e: 0x6e095c20, 0x30f4f: 0x6e095e20, + 0x30f50: 0x6e096020, 0x30f51: 0x6e096220, 0x30f52: 0x6e096420, 0x30f53: 0x6e096620, + 0x30f54: 0x6e096820, 0x30f55: 0x6e096a20, 0x30f56: 0x6e096c20, 0x30f57: 0x6e096e20, + 0x30f58: 0x6e097020, 0x30f59: 0x6e097220, 0x30f5a: 0x6e097420, 0x30f5b: 0x6e097620, + 0x30f5c: 0x6e194620, 0x30f5d: 0x6e194820, 0x30f5e: 0x6e194a20, 0x30f5f: 0x6e194c20, + 0x30f60: 0x6e097820, 0x30f61: 0x6e194e20, 0x30f62: 0x6e195020, 0x30f63: 0x6e195220, + 0x30f64: 0x6e195420, 0x30f65: 0x6e195620, 0x30f66: 0x6e195820, 0x30f67: 0x6e195a20, + 0x30f68: 0x6e195c20, 0x30f69: 0x6e195e20, 0x30f6a: 0x6e196020, 0x30f6b: 0x6e196220, + 0x30f6c: 0x6e196420, 0x30f6d: 0x6e196620, 0x30f6e: 0x6e196820, 0x30f6f: 0x6e196a20, + 0x30f70: 0x6e196c20, 0x30f71: 0x6e25de20, 0x30f72: 0x6e25e020, 0x30f73: 0x6e25e220, + 0x30f74: 0x6e25e420, 0x30f75: 0x6e25e620, 0x30f76: 0x6e25e820, 0x30f77: 0x6e25ea20, + 0x30f78: 0x6e25ec20, 0x30f79: 0x6e25ee20, 0x30f7a: 0x6e25f020, 0x30f7b: 0x6e25f220, + 0x30f7c: 0x6e25f420, 0x30f7d: 0x6e25f620, 0x30f7e: 0x6e25f820, 0x30f7f: 0x6e25fa20, + // Block 0xc3e, offset 0x30f80 + 0x30f80: 0x6e09e620, 0x30f81: 0x6e25fc20, 0x30f82: 0x6e25fe20, 0x30f83: 0x6e260020, + 0x30f84: 0x6e260220, 0x30f85: 0x6e260420, 0x30f86: 0x6e260620, 0x30f87: 0x6e260820, + 0x30f88: 0x6e260a20, 0x30f89: 0x6e267220, 0x30f8a: 0x6e2f5620, 0x30f8b: 0x6e2f5820, + 0x30f8c: 0x6e2f5a20, 0x30f8d: 0x6e2f5c20, 0x30f8e: 0x6e2f5e20, 0x30f8f: 0x6e2f6020, + 0x30f90: 0x6e2f6220, 0x30f91: 0x6e2f6420, 0x30f92: 0x6e2f6620, 0x30f93: 0x6e2f6820, + 0x30f94: 0x6e2f6a20, 0x30f95: 0x6e2f6c20, 0x30f96: 0x6e2f6e20, 0x30f97: 0x6e2f7020, + 0x30f98: 0x6e2f7220, 0x30f99: 0x6e2f7420, 0x30f9a: 0x6e2f7620, 0x30f9b: 0x6e2f7820, + 0x30f9c: 0x6e36a620, 0x30f9d: 0x6e36a820, 0x30f9e: 0x6e36aa20, 0x30f9f: 0x6e36ac20, + 0x30fa0: 0x6e36ae20, 0x30fa1: 0x6e36b020, 0x30fa2: 0x6e36b220, 0x30fa3: 0x6e36b420, + 0x30fa4: 0x6e36b620, 0x30fa5: 0x6e36b820, 0x30fa6: 0x6e36ba20, 0x30fa7: 0x6e36bc20, + 0x30fa8: 0x6e3bac20, 0x30fa9: 0x6e36be20, 0x30faa: 0x6e2fda20, 0x30fab: 0x6e36c020, + 0x30fac: 0x6e3bae20, 0x30fad: 0x6e3bb020, 0x30fae: 0x6e3bb220, 0x30faf: 0x6e3bb420, + 0x30fb0: 0x6e371420, 0x30fb1: 0x6e3f5420, 0x30fb2: 0x6e3f5620, 0x30fb3: 0x6e3f5820, + 0x30fb4: 0x6e3f5a20, 0x30fb5: 0x6e3f5c20, 0x30fb6: 0x6e3f5e20, 0x30fb7: 0x6e41da20, + 0x30fb8: 0x6e41dc20, 0x30fb9: 0x6e44d220, 0x30fba: 0x6e458220, 0x30fbb: 0x6e469a20, + 0x30fbc: 0x6c42dc20, 0x30fbd: 0x6c8ac020, 0x30fbe: 0x6cb74a20, 0x30fbf: 0x6ce86e20, + // Block 0xc3f, offset 0x30fc0 + 0x30fc0: 0x6ce87020, 0x30fc1: 0x6ce87220, 0x30fc2: 0x6ce87420, 0x30fc3: 0x6ce87620, + 0x30fc4: 0x6d17e020, 0x30fc5: 0x6d17e220, 0x30fc6: 0x6d17e420, 0x30fc7: 0x6d17e620, + 0x30fc8: 0x6d17e820, 0x30fc9: 0x6d17ea20, 0x30fca: 0x6d17ec20, 0x30fcb: 0x6d17ee20, + 0x30fcc: 0x6d17f020, 0x30fcd: 0x6d17f220, 0x30fce: 0x6d17f420, 0x30fcf: 0x6d17f620, + 0x30fd0: 0x6d17f820, 0x30fd1: 0x6d46b620, 0x30fd2: 0x6d46b820, 0x30fd3: 0x6d46ba20, + 0x30fd4: 0x6d46bc20, 0x30fd5: 0x6d46be20, 0x30fd6: 0x6d46c020, 0x30fd7: 0x6d46c220, + 0x30fd8: 0x6d46c420, 0x30fd9: 0x6d46c620, 0x30fda: 0x6d46c820, 0x30fdb: 0x6d46ca20, + 0x30fdc: 0x6d46cc20, 0x30fdd: 0x6d46ce20, 0x30fde: 0x6d46d020, 0x30fdf: 0x6d46d220, + 0x30fe0: 0x6d740c20, 0x30fe1: 0x6d740e20, 0x30fe2: 0x6d741020, 0x30fe3: 0x6d741220, + 0x30fe4: 0x6d741420, 0x30fe5: 0x6d741620, 0x30fe6: 0x6d741820, 0x30fe7: 0x6d741a20, + 0x30fe8: 0x6d741c20, 0x30fe9: 0x6d741e20, 0x30fea: 0x6d742020, 0x30feb: 0x6d742220, + 0x30fec: 0x6d742420, 0x30fed: 0x6d9db020, 0x30fee: 0x6d9db220, 0x30fef: 0x6d9db420, + 0x30ff0: 0x6d9db620, 0x30ff1: 0x6d9db820, 0x30ff2: 0x6d9dba20, 0x30ff3: 0x6d9dbc20, + 0x30ff4: 0x6d9dbe20, 0x30ff5: 0x6d9dc020, 0x30ff6: 0x6d9dc220, 0x30ff7: 0x6d9dc420, + 0x30ff8: 0x6d9dc620, 0x30ff9: 0x6d9dc820, 0x30ffa: 0x6d9dca20, 0x30ffb: 0x6d9dcc20, + 0x30ffc: 0x6dc03c20, 0x30ffd: 0x6dc03e20, 0x30ffe: 0x6dc06820, 0x30fff: 0x6dc04020, + // Block 0xc40, offset 0x31000 + 0x31000: 0x6dc04220, 0x31001: 0x6dc04420, 0x31002: 0x6dc04620, 0x31003: 0x6dc04820, + 0x31004: 0x6dc04a20, 0x31005: 0x6dc04c20, 0x31006: 0x6dc04e20, 0x31007: 0x6dc05020, + 0x31008: 0x6dc05220, 0x31009: 0x6dc05420, 0x3100a: 0x6dc05620, 0x3100b: 0x6dc05820, + 0x3100c: 0x6dde2e20, 0x3100d: 0x6dde3020, 0x3100e: 0x6dde3220, 0x3100f: 0x6dde3420, + 0x31010: 0x6dde3620, 0x31011: 0x6dde3820, 0x31012: 0x6dde3a20, 0x31013: 0x6df61e20, + 0x31014: 0x6df62020, 0x31015: 0x6df62220, 0x31016: 0x6df62420, 0x31017: 0x6df62620, + 0x31018: 0x6df62820, 0x31019: 0x6df62a20, 0x3101a: 0x6df62c20, 0x3101b: 0x6df62e20, + 0x3101c: 0x6e09ec20, 0x3101d: 0x6e09ee20, 0x3101e: 0x6e09f020, 0x3101f: 0x6e09f220, + 0x31020: 0x6e19f820, 0x31021: 0x6e19fa20, 0x31022: 0x6e19fc20, 0x31023: 0x6e19fe20, + 0x31024: 0x6e267420, 0x31025: 0x6cb75220, 0x31026: 0x6ce88620, 0x31027: 0x6d180820, + 0x31028: 0x6d180a20, 0x31029: 0x6d180c20, 0x3102a: 0x6d180e20, 0x3102b: 0x6d181020, + 0x3102c: 0x6c63ac20, 0x3102d: 0x6d181220, 0x3102e: 0x6d181420, 0x3102f: 0x6d181620, + 0x31030: 0x6d181820, 0x31031: 0x6d46f420, 0x31032: 0x6d46f620, 0x31033: 0x6d46f820, + 0x31034: 0x6d46fa20, 0x31035: 0x6d46fc20, 0x31036: 0x6d46fe20, 0x31037: 0x6d745020, + 0x31038: 0x6d745220, 0x31039: 0x6d745420, 0x3103a: 0x6d745620, 0x3103b: 0x6d745820, + 0x3103c: 0x6d745a20, 0x3103d: 0x6d745c20, 0x3103e: 0x6d745e20, 0x3103f: 0x6d746020, + // Block 0xc41, offset 0x31040 + 0x31040: 0x6d746220, 0x31041: 0x6d746420, 0x31042: 0x6d746620, 0x31043: 0x6d746820, + 0x31044: 0x6d746a20, 0x31045: 0x6d746c20, 0x31046: 0x6d746e20, 0x31047: 0x6d747020, + 0x31048: 0x6d747220, 0x31049: 0x6d747420, 0x3104a: 0x6d9e0620, 0x3104b: 0x6d747620, + 0x3104c: 0x6d747820, 0x3104d: 0x6d747a20, 0x3104e: 0x6d747c20, 0x3104f: 0x6d9e0820, + 0x31050: 0x6d9e0a20, 0x31051: 0x6d9e0c20, 0x31052: 0x6d9e0e20, 0x31053: 0x6d9e1020, + 0x31054: 0x6d9e1220, 0x31055: 0x6d9e1420, 0x31056: 0x6d9e1620, 0x31057: 0x6d9e1820, + 0x31058: 0x6d9e1a20, 0x31059: 0x6d9e1c20, 0x3105a: 0x6d9e1e20, 0x3105b: 0x6d9e2020, + 0x3105c: 0x6dc06a20, 0x3105d: 0x6d9e2220, 0x3105e: 0x6d9e2420, 0x3105f: 0x6d9e2620, + 0x31060: 0x6d9e2820, 0x31061: 0x6d9e2a20, 0x31062: 0x6d9e2c20, 0x31063: 0x6d9e2e20, + 0x31064: 0x6d9e3020, 0x31065: 0x6d9e3220, 0x31066: 0x6d9e3420, 0x31067: 0x6d9e3620, + 0x31068: 0x6d9e3820, 0x31069: 0x6d9e3a20, 0x3106a: 0x6d9e3c20, 0x3106b: 0x6d9e3e20, + 0x3106c: 0x6d9e4020, 0x3106d: 0x6dc08020, 0x3106e: 0x6dc08220, 0x3106f: 0x6dc08420, + 0x31070: 0x6dc08620, 0x31071: 0x6dc08820, 0x31072: 0x6dc08a20, 0x31073: 0x6dc08c20, + 0x31074: 0x6dc08e20, 0x31075: 0x6dc09020, 0x31076: 0x6dc09220, 0x31077: 0x6dc09420, + 0x31078: 0x6dc09620, 0x31079: 0x6dc09820, 0x3107a: 0x6dc09a20, 0x3107b: 0x6dc09c20, + 0x3107c: 0x6dc09e20, 0x3107d: 0x6dc0a020, 0x3107e: 0x6dc0a220, 0x3107f: 0x6dc0a420, + // Block 0xc42, offset 0x31080 + 0x31080: 0x6dc0a620, 0x31081: 0x6dc0a820, 0x31082: 0x6dc0aa20, 0x31083: 0x6dc0ac20, + 0x31084: 0x6dc0ae20, 0x31085: 0x6dc0b020, 0x31086: 0x6dc0b220, 0x31087: 0x6dc0b420, + 0x31088: 0x6dc0b620, 0x31089: 0x6dc0b820, 0x3108a: 0x6dde4e20, 0x3108b: 0x6dde5020, + 0x3108c: 0x6dde5220, 0x3108d: 0x6dde5420, 0x3108e: 0x6dde5620, 0x3108f: 0x6dde5820, + 0x31090: 0x6dde5a20, 0x31091: 0x6dde5c20, 0x31092: 0x6dde5e20, 0x31093: 0x6dde6020, + 0x31094: 0x6dde6220, 0x31095: 0x6dde6420, 0x31096: 0x6dde6620, 0x31097: 0x6dde6820, + 0x31098: 0x6dde6a20, 0x31099: 0x6dde6c20, 0x3109a: 0x6dde6e20, 0x3109b: 0x6dde7020, + 0x3109c: 0x6dde7220, 0x3109d: 0x6dde7420, 0x3109e: 0x6dde7620, 0x3109f: 0x6dde7820, + 0x310a0: 0x6dde7a20, 0x310a1: 0x6df63820, 0x310a2: 0x6dde7c20, 0x310a3: 0x6dde7e20, + 0x310a4: 0x6dd43a20, 0x310a5: 0x6dde8020, 0x310a6: 0x6df64c20, 0x310a7: 0x6dc13220, + 0x310a8: 0x6df64e20, 0x310a9: 0x6df65020, 0x310aa: 0x6df65220, 0x310ab: 0x6df65420, + 0x310ac: 0x6df65620, 0x310ad: 0x6df65820, 0x310ae: 0x6df65a20, 0x310af: 0x6df65c20, + 0x310b0: 0x6df65e20, 0x310b1: 0x6df66020, 0x310b2: 0x6df66220, 0x310b3: 0x6df66420, + 0x310b4: 0x6df66620, 0x310b5: 0x6df66820, 0x310b6: 0x6df66a20, 0x310b7: 0x6df66c20, + 0x310b8: 0x6df66e20, 0x310b9: 0x6df67020, 0x310ba: 0x6df67220, 0x310bb: 0x6df67420, + 0x310bc: 0x6df67620, 0x310bd: 0x6df67820, 0x310be: 0x6df67a20, 0x310bf: 0x6df67c20, + // Block 0xc43, offset 0x310c0 + 0x310c0: 0x6df67e20, 0x310c1: 0x6df68020, 0x310c2: 0x6df68220, 0x310c3: 0x6df68420, + 0x310c4: 0x6df68620, 0x310c5: 0x6df68820, 0x310c6: 0x6df68a20, 0x310c7: 0x6df68c20, + 0x310c8: 0x6df68e20, 0x310c9: 0x6df69020, 0x310ca: 0x6df69220, 0x310cb: 0x6df69420, + 0x310cc: 0x6df69620, 0x310cd: 0x6df69820, 0x310ce: 0x6df69a20, 0x310cf: 0x6df69c20, + 0x310d0: 0x6e0a0e20, 0x310d1: 0x6df69e20, 0x310d2: 0x6e0a1020, 0x310d3: 0x6e0a1220, + 0x310d4: 0x6e0a1420, 0x310d5: 0x6e0a1620, 0x310d6: 0x6e0a1820, 0x310d7: 0x6e0a1a20, + 0x310d8: 0x6e0a1c20, 0x310d9: 0x6e0a1e20, 0x310da: 0x6e0a2020, 0x310db: 0x6e0a2220, + 0x310dc: 0x6e0a2420, 0x310dd: 0x6e0a2620, 0x310de: 0x6e0a2820, 0x310df: 0x6e0a2a20, + 0x310e0: 0x6e0a2c20, 0x310e1: 0x6e0a2e20, 0x310e2: 0x6e0a3020, 0x310e3: 0x6e0a3220, + 0x310e4: 0x6e0a3420, 0x310e5: 0x6e0a3620, 0x310e6: 0x6e0a3820, 0x310e7: 0x6e0a3a20, + 0x310e8: 0x6e0a3c20, 0x310e9: 0x6e0a3e20, 0x310ea: 0x6e0a4020, 0x310eb: 0x6e0a4220, + 0x310ec: 0x6e1a1020, 0x310ed: 0x6e1a1220, 0x310ee: 0x6e1a1420, 0x310ef: 0x6e1a1620, + 0x310f0: 0x6e1a1820, 0x310f1: 0x6e1a1a20, 0x310f2: 0x6e1a1c20, 0x310f3: 0x6e1a1e20, + 0x310f4: 0x6e1a2020, 0x310f5: 0x6e1a2220, 0x310f6: 0x6e1a2420, 0x310f7: 0x6e1a2620, + 0x310f8: 0x6e1a2820, 0x310f9: 0x6e1a2a20, 0x310fa: 0x6e1a2c20, 0x310fb: 0x6e1a2e20, + 0x310fc: 0x6e1a3020, 0x310fd: 0x6e1a3220, 0x310fe: 0x6e1a3420, 0x310ff: 0x6e0ad220, + // Block 0xc44, offset 0x31100 + 0x31100: 0x6e1a3620, 0x31101: 0x6e1a3820, 0x31102: 0x6e1a3a20, 0x31103: 0x6e1a3c20, + 0x31104: 0x6e1a3e20, 0x31105: 0x6e1a4020, 0x31106: 0x6e1a4220, 0x31107: 0x6e1a4420, + 0x31108: 0x6e1a4620, 0x31109: 0x6e1a4820, 0x3110a: 0x6e1a4a20, 0x3110b: 0x6e268620, + 0x3110c: 0x6e1a4c20, 0x3110d: 0x6e1a4e20, 0x3110e: 0x6e1a5020, 0x3110f: 0x6e1a5220, + 0x31110: 0x6e268820, 0x31111: 0x6e268a20, 0x31112: 0x6e268c20, 0x31113: 0x6e268e20, + 0x31114: 0x6e269020, 0x31115: 0x6e269220, 0x31116: 0x6e269420, 0x31117: 0x6e269620, + 0x31118: 0x6e269820, 0x31119: 0x6e269a20, 0x3111a: 0x6e269c20, 0x3111b: 0x6e269e20, + 0x3111c: 0x6e26a020, 0x3111d: 0x6e26a220, 0x3111e: 0x6e26a420, 0x3111f: 0x6e26a620, + 0x31120: 0x6e260c20, 0x31121: 0x6e2ff220, 0x31122: 0x6e2ff420, 0x31123: 0x6e2ff620, + 0x31124: 0x6e2ff820, 0x31125: 0x6e2ffa20, 0x31126: 0x6e2ffc20, 0x31127: 0x6e2ffe20, + 0x31128: 0x6e300020, 0x31129: 0x6e273020, 0x3112a: 0x6e300220, 0x3112b: 0x6e300420, + 0x3112c: 0x6e300620, 0x3112d: 0x6e300820, 0x3112e: 0x6e300a20, 0x3112f: 0x6e300c20, + 0x31130: 0x6e300e20, 0x31131: 0x6e301020, 0x31132: 0x6e301220, 0x31133: 0x6e301420, + 0x31134: 0x6e301620, 0x31135: 0x6e273220, 0x31136: 0x6e301820, 0x31137: 0x6e301a20, + 0x31138: 0x6e301c20, 0x31139: 0x6e372220, 0x3113a: 0x6e371620, 0x3113b: 0x6e301e20, + 0x3113c: 0x6e302020, 0x3113d: 0x6e372420, 0x3113e: 0x6e372620, 0x3113f: 0x6e372820, + // Block 0xc45, offset 0x31140 + 0x31140: 0x6e372a20, 0x31141: 0x6e372c20, 0x31142: 0x6e372e20, 0x31143: 0x6e373020, + 0x31144: 0x6e373220, 0x31145: 0x6e373420, 0x31146: 0x6e373620, 0x31147: 0x6e373820, + 0x31148: 0x6e373a20, 0x31149: 0x6e373c20, 0x3114a: 0x6e373e20, 0x3114b: 0x6e3bea20, + 0x3114c: 0x6e3bec20, 0x3114d: 0x6e3bee20, 0x3114e: 0x6e3bf020, 0x3114f: 0x6e3bf220, + 0x31150: 0x6e3bf420, 0x31151: 0x6e3bf620, 0x31152: 0x6e3bf820, 0x31153: 0x6e3f8820, + 0x31154: 0x6e3f8a20, 0x31155: 0x6e41fa20, 0x31156: 0x6e41fc20, 0x31157: 0x6e41fe20, + 0x31158: 0x6e43c020, 0x31159: 0x6e43c220, 0x3115a: 0x6e43c420, 0x3115b: 0x6e44e620, + 0x3115c: 0x6e44e820, 0x3115d: 0x6e458c20, 0x3115e: 0x6e458e20, 0x3115f: 0x6c0ac820, + 0x31160: 0x6c28a620, 0x31161: 0x6c28a820, 0x31162: 0x6c42de20, 0x31163: 0x6c42e020, + 0x31164: 0x6c42e220, 0x31165: 0x6c63ae20, 0x31166: 0x6c63b020, 0x31167: 0x6c63b220, + 0x31168: 0x6c63b420, 0x31169: 0x6c63b620, 0x3116a: 0x6c8ac420, 0x3116b: 0x6c8ac620, + 0x3116c: 0x6c8ac820, 0x3116d: 0x6c8aca20, 0x3116e: 0x6c8acc20, 0x3116f: 0x6c8ace20, + 0x31170: 0x6c8ad020, 0x31171: 0x6c8ad220, 0x31172: 0x6c8ad420, 0x31173: 0x6c8ad620, + 0x31174: 0x6c8ad820, 0x31175: 0x6c8ada20, 0x31176: 0x6c8adc20, 0x31177: 0x6cb75620, + 0x31178: 0x6cb75820, 0x31179: 0x6cb75a20, 0x3117a: 0x6cb75c20, 0x3117b: 0x6cb75e20, + 0x3117c: 0x6cb76020, 0x3117d: 0x6cb76220, 0x3117e: 0x6cb76420, 0x3117f: 0x6cb76620, + // Block 0xc46, offset 0x31180 + 0x31180: 0x6ce89020, 0x31181: 0x6ce89220, 0x31182: 0x6ce89420, 0x31183: 0x6ce89620, + 0x31184: 0x6ce89820, 0x31185: 0x6ce89a20, 0x31186: 0x6ce89c20, 0x31187: 0x6ce89e20, + 0x31188: 0x6ce8a020, 0x31189: 0x6d183020, 0x3118a: 0x6d183220, 0x3118b: 0x6d183420, + 0x3118c: 0x6d183620, 0x3118d: 0x6d183820, 0x3118e: 0x6d183a20, 0x3118f: 0x6d183c20, + 0x31190: 0x6d183e20, 0x31191: 0x6d184020, 0x31192: 0x6d184220, 0x31193: 0x6d184420, + 0x31194: 0x6d184620, 0x31195: 0x6d472620, 0x31196: 0x6d472820, 0x31197: 0x6d472a20, + 0x31198: 0x6d74e020, 0x31199: 0x6d472c20, 0x3119a: 0x6d472e20, 0x3119b: 0x6d473020, + 0x3119c: 0x6d473220, 0x3119d: 0x6d74e220, 0x3119e: 0x6d74e420, 0x3119f: 0x6d74e620, + 0x311a0: 0x6d74e820, 0x311a1: 0x6d74ea20, 0x311a2: 0x6d74ec20, 0x311a3: 0x6d74ee20, + 0x311a4: 0x6d74f020, 0x311a5: 0x6d9eba20, 0x311a6: 0x6d9ebc20, 0x311a7: 0x6d9ebe20, + 0x311a8: 0x6d9ec020, 0x311a9: 0x6dc13820, 0x311aa: 0x6dc13a20, 0x311ab: 0x6dc13c20, + 0x311ac: 0x6dc13e20, 0x311ad: 0x6ddee620, 0x311ae: 0x6ddee820, 0x311af: 0x6ddeea20, + 0x311b0: 0x6ddeec20, 0x311b1: 0x6df73020, 0x311b2: 0x6df73220, 0x311b3: 0x6e273420, + 0x311b4: 0x6e273620, 0x311b5: 0x6cb78220, 0x311b6: 0x6d750020, 0x311b7: 0x6d9eca20, + 0x311b8: 0x6df73620, 0x311b9: 0x6e0ad820, 0x311ba: 0x6e1ac620, 0x311bb: 0x6e1ac820, + 0x311bc: 0x6e378c20, 0x311bd: 0x6e378e20, 0x311be: 0x6d9ed820, 0x311bf: 0x6cb78620, + // Block 0xc47, offset 0x311c0 + 0x311c0: 0x6d185620, 0x311c1: 0x6d185820, 0x311c2: 0x6d185a20, 0x311c3: 0x6d751220, + 0x311c4: 0x6d751420, 0x311c5: 0x6d9ee220, 0x311c6: 0x6d9ee420, 0x311c7: 0x6d9ee620, + 0x311c8: 0x6d9ee820, 0x311c9: 0x6dc14820, 0x311ca: 0x6dc14a20, 0x311cb: 0x6dc14c20, + 0x311cc: 0x6ddefc20, 0x311cd: 0x6ddefe20, 0x311ce: 0x6ddf0020, 0x311cf: 0x6ddf0220, + 0x311d0: 0x6ddf0420, 0x311d1: 0x6df74820, 0x311d2: 0x6df74a20, 0x311d3: 0x6df74c20, + 0x311d4: 0x6df74e20, 0x311d5: 0x6df75020, 0x311d6: 0x6df75220, 0x311d7: 0x6df75420, + 0x311d8: 0x6e0aec20, 0x311d9: 0x6e0aee20, 0x311da: 0x6e0af020, 0x311db: 0x6e0af220, + 0x311dc: 0x6e1ad620, 0x311dd: 0x6e1ad820, 0x311de: 0x6e274420, 0x311df: 0x6e30b220, + 0x311e0: 0x6e379a20, 0x311e1: 0x6e3c3820, 0x311e2: 0x6e43e220, 0x311e3: 0x6e460a20, + 0x311e4: 0x6e46a220, 0x311e5: 0x6cb78a20, 0x311e6: 0x6c28aa20, 0x311e7: 0x6d475620, + 0x311e8: 0x6d753420, 0x311e9: 0x6d753620, 0x311ea: 0x6d753820, 0x311eb: 0x6d753a20, + 0x311ec: 0x6d9f0620, 0x311ed: 0x6d9f0820, 0x311ee: 0x6d9f0a20, 0x311ef: 0x6dc17020, + 0x311f0: 0x6dc17220, 0x311f1: 0x6ddf2e20, 0x311f2: 0x6ddf3020, 0x311f3: 0x6df77420, + 0x311f4: 0x6df77620, 0x311f5: 0x6e0b0620, 0x311f6: 0x6e275620, 0x311f7: 0x6e44fe20, + 0x311f8: 0x6cb78c20, 0x311f9: 0x6d755a20, 0x311fa: 0x6d9f2620, 0x311fb: 0x6cb79420, + 0x311fc: 0x6d476420, 0x311fd: 0x6d476620, 0x311fe: 0x6d756420, 0x311ff: 0x6ddf5220, + // Block 0xc48, offset 0x31200 + 0x31200: 0x6df79a20, 0x31201: 0x6e0b2a20, 0x31202: 0x6e30dc20, 0x31203: 0x6ce8b420, + 0x31204: 0x6ce8b620, 0x31205: 0x6d9f3420, 0x31206: 0x6d9f3620, 0x31207: 0x6dc19420, + 0x31208: 0x6dc19620, 0x31209: 0x6dc19820, 0x3120a: 0x6ddf5a20, 0x3120b: 0x6ddf5c20, + 0x3120c: 0x6e3c4c20, 0x3120d: 0x6ce8b820, 0x3120e: 0x6d758020, 0x3120f: 0x6dc1a820, + 0x31210: 0x6e278420, 0x31211: 0x6ce8ba20, 0x31212: 0x6cb79620, 0x31213: 0x6d758a20, + 0x31214: 0x6d9f4c20, 0x31215: 0x6d9f4e20, 0x31216: 0x6d9f5020, 0x31217: 0x6d9f5220, + 0x31218: 0x6d9f5420, 0x31219: 0x6d585420, 0x3121a: 0x6dc1c220, 0x3121b: 0x6dc1c420, + 0x3121c: 0x6dc1c620, 0x3121d: 0x6dc1c820, 0x3121e: 0x6dc1ca20, 0x3121f: 0x6ddf7220, + 0x31220: 0x6ddf7420, 0x31221: 0x6ddf7620, 0x31222: 0x6df7c620, 0x31223: 0x6df7c820, + 0x31224: 0x6e0b5420, 0x31225: 0x6e0b5620, 0x31226: 0x6e0b5820, 0x31227: 0x6e0b5a20, + 0x31228: 0x6e0b5c20, 0x31229: 0x6e0b5e20, 0x3122a: 0x6e0b6020, 0x3122b: 0x6e1b2020, + 0x3122c: 0x6e1b2220, 0x3122d: 0x6e1b2420, 0x3122e: 0x6e1b2620, 0x3122f: 0x6e1b2820, + 0x31230: 0x6e278820, 0x31231: 0x6e278a20, 0x31232: 0x6e30f220, 0x31233: 0x6e30f420, + 0x31234: 0x6e30f620, 0x31235: 0x6e3c5820, 0x31236: 0x6e3fc820, 0x31237: 0x6e423420, + 0x31238: 0x6e43f420, 0x31239: 0x6ce8be20, 0x3123a: 0x6d9f7220, 0x3123b: 0x6dc1e620, + 0x3123c: 0x6df7e020, 0x3123d: 0x6d187420, 0x3123e: 0x6c42e420, 0x3123f: 0x6dc1e820, + // Block 0xc49, offset 0x31240 + 0x31240: 0x6ddf8e20, 0x31241: 0x6ddf9020, 0x31242: 0x6ddf9220, 0x31243: 0x6df7e420, + 0x31244: 0x6df7e620, 0x31245: 0x6e1b6620, 0x31246: 0x6e310c20, 0x31247: 0x6e310e20, + 0x31248: 0x6e3c7020, 0x31249: 0x6e3c7220, 0x3124a: 0x6e3fd420, 0x3124b: 0x6ce8c020, + 0x3124c: 0x6d187620, 0x3124d: 0x6e0b9620, 0x3124e: 0x6d187820, 0x3124f: 0x6d75a020, + 0x31250: 0x6d75a220, 0x31251: 0x6d75a420, 0x31252: 0x6d9f7820, 0x31253: 0x6d187a20, + 0x31254: 0x6d187c20, 0x31255: 0x6ddfaa20, 0x31256: 0x6ddfac20, 0x31257: 0x6df7f820, + 0x31258: 0x6e1b6e20, 0x31259: 0x6e1b7020, 0x3125a: 0x6e1b7220, 0x3125b: 0x6e1b7420, + 0x3125c: 0x6e311420, 0x3125d: 0x6e3c7a20, 0x3125e: 0x6e37ec20, 0x3125f: 0x6e3c7c20, + 0x31260: 0x6d188020, 0x31261: 0x6c42e620, 0x31262: 0x6dc20220, 0x31263: 0x6dc20420, + 0x31264: 0x6dc20620, 0x31265: 0x6ddfb820, 0x31266: 0x6ddfba20, 0x31267: 0x6ddfbc20, + 0x31268: 0x6ddfbe20, 0x31269: 0x6ddfc020, 0x3126a: 0x6ddfc220, 0x3126b: 0x6ddfc420, + 0x3126c: 0x6ddfc620, 0x3126d: 0x6df80c20, 0x3126e: 0x6e0ba420, 0x3126f: 0x6e0ba620, + 0x31270: 0x6e0ba820, 0x31271: 0x6e1b8020, 0x31272: 0x6e27d820, 0x31273: 0x6e27da20, + 0x31274: 0x6e27dc20, 0x31275: 0x6e27de20, 0x31276: 0x6e311c20, 0x31277: 0x6e311e20, + 0x31278: 0x6e312020, 0x31279: 0x6e312220, 0x3127a: 0x6e440020, 0x3127b: 0x6d478020, + 0x3127c: 0x6d9f8820, 0x3127d: 0x6d9f8a20, 0x3127e: 0x6dc22020, 0x3127f: 0x6dc22220, + // Block 0xc4a, offset 0x31280 + 0x31280: 0x6df82220, 0x31281: 0x6df82420, 0x31282: 0x6e27f420, 0x31283: 0x6e313820, + 0x31284: 0x6e313a20, 0x31285: 0x6e380020, 0x31286: 0x6e380220, 0x31287: 0x6e3c9220, + 0x31288: 0x6e424e20, 0x31289: 0x6e46fc20, 0x3128a: 0x6d478220, 0x3128b: 0x6dc22c20, + 0x3128c: 0x6ddfec20, 0x3128d: 0x6df83420, 0x3128e: 0x6e1b9a20, 0x3128f: 0x6e314420, + 0x31290: 0x6c15e220, 0x31291: 0x6d75b420, 0x31292: 0x6d75b620, 0x31293: 0x6d9f9220, + 0x31294: 0x6dc23020, 0x31295: 0x6ddff620, 0x31296: 0x6df83e20, 0x31297: 0x6df84020, + 0x31298: 0x6df84220, 0x31299: 0x6e0bda20, 0x3129a: 0x6e0bdc20, 0x3129b: 0x6e0bde20, + 0x3129c: 0x6e1b9e20, 0x3129d: 0x6e0be020, 0x3129e: 0x6e0be220, 0x3129f: 0x6e0be420, + 0x312a0: 0x6e0be620, 0x312a1: 0x6e0be820, 0x312a2: 0x6dc23a20, 0x312a3: 0x6e0bea20, + 0x312a4: 0x6e1ba420, 0x312a5: 0x6e1ba620, 0x312a6: 0x6e1ba820, 0x312a7: 0x6e1baa20, + 0x312a8: 0x6e1bac20, 0x312a9: 0x6e1bae20, 0x312aa: 0x6e280020, 0x312ab: 0x6e280220, + 0x312ac: 0x6e280420, 0x312ad: 0x6e314a20, 0x312ae: 0x6e314c20, 0x312af: 0x6e314e20, + 0x312b0: 0x6e315020, 0x312b1: 0x6e315220, 0x312b2: 0x6e381220, 0x312b3: 0x6e381420, + 0x312b4: 0x6e381620, 0x312b5: 0x6e381820, 0x312b6: 0x6e381a20, 0x312b7: 0x6e381c20, + 0x312b8: 0x6e3ca820, 0x312b9: 0x6e3caa20, 0x312ba: 0x6e3cac20, 0x312bb: 0x6e3cae20, + 0x312bc: 0x6e440620, 0x312bd: 0x6e440820, 0x312be: 0x6e46dc20, 0x312bf: 0x6c42e820, + // Block 0xc4b, offset 0x312c0 + 0x312c0: 0x6c8aee20, 0x312c1: 0x6cb79820, 0x312c2: 0x6ce8c420, 0x312c3: 0x6d188220, + 0x312c4: 0x6d188420, 0x312c5: 0x6d188620, 0x312c6: 0x6d188820, 0x312c7: 0x6d478620, + 0x312c8: 0x6d478820, 0x312c9: 0x6d75ba20, 0x312ca: 0x6d75bc20, 0x312cb: 0x6dc23c20, + 0x312cc: 0x6dc23e20, 0x312cd: 0x6d9f9c20, 0x312ce: 0x6de00020, 0x312cf: 0x6df85a20, + 0x312d0: 0x6de23620, 0x312d1: 0x6e0c1220, 0x312d2: 0x6e1be220, 0x312d3: 0x6e283820, + 0x312d4: 0x6e283a20, 0x312d5: 0x6e283c20, 0x312d6: 0x6e467820, 0x312d7: 0x6e46a820, + 0x312d8: 0x6e473c20, 0x312d9: 0x6c0aca20, 0x312da: 0x6cb79a20, 0x312db: 0x6cb79c20, + 0x312dc: 0x6d9f9e20, 0x312dd: 0x6e1bea20, 0x312de: 0x6e441620, 0x312df: 0x6c28ac20, + 0x312e0: 0x6dc24220, 0x312e1: 0x6e1c0020, 0x312e2: 0x6e284620, 0x312e3: 0x6e3cda20, + 0x312e4: 0x6e3ffc20, 0x312e5: 0x6e3ffe20, 0x312e6: 0x6d585620, 0x312e7: 0x6d7e6e20, + 0x312e8: 0x6c670020, 0x312e9: 0x6db26c20, 0x312ea: 0x6c610620, 0x312eb: 0x6ce29e20, + 0x312ec: 0x6d974220, 0x312ed: 0x6e186020, 0x312ee: 0x6e41aa20, 0x312ef: 0x6d135620, + 0x312f0: 0x6c04aa20, 0x312f1: 0x6c079420, 0x312f2: 0x6dd85820, 0x312f3: 0x6d789a20, + 0x312f4: 0x6c006420, 0x312f5: 0x6c01f820, 0x312f6: 0x6c03d220, 0x312f7: 0x6c0a5820, + 0x312f8: 0x6c083c20, 0x312f9: 0x6c0c7020, 0x312fa: 0x6c2bb820, 0x312fb: 0x6ded8620, + 0x312fc: 0x6da1a620, 0x312fd: 0x6d585820, 0x312fe: 0x6d00ea20, 0x312ff: 0x6cae1c20, + // Block 0xc4c, offset 0x31300 + 0x31300: 0x6e134020, 0x31301: 0x6d0e4820, 0x31302: 0x6dd6dc20, 0x31303: 0x6cd37020, + 0x31304: 0x6c749620, 0x31305: 0x6daca820, 0x31306: 0x6c3cfa20, 0x31307: 0x6c29c820, + 0x31308: 0x6c1efa20, 0x31309: 0x6c1efc20, 0x3130a: 0x6cad0e20, 0x3130b: 0x6db51620, + // Block 0xc4d, offset 0x31340 + 0x31340: 0x6c86d020, 0x31341: 0x6c219c20, 0x31342: 0x6c270e20, 0x31343: 0x6d0f3a20, + 0x31344: 0x6cfa9420, 0x31345: 0x6c160020, 0x31346: 0x6c073820, 0x31347: 0x6d9f9e20, + 0x31348: 0x6d9f9e20, 0x31349: 0x6c490c20, 0x3134a: 0x6c41dc20, 0x3134b: 0x6cbab020, + 0x3134c: 0x6c2eb020, 0x3134d: 0x6de28c20, 0x3134e: 0x6e102820, 0x3134f: 0x6de9ba20, + 0x31350: 0x6e2b8e20, 0x31351: 0x6db3f420, 0x31352: 0x6d3b6a20, 0x31353: 0x6e2d0820, + 0x31354: 0x6d540620, 0x31355: 0x6c542820, 0x31356: 0x6c782020, 0x31357: 0x6c79ee20, + 0x31358: 0x6d09ae20, 0x31359: 0x6d128020, 0x3135a: 0x6d9bda20, 0x3135b: 0x6ce8d220, + 0x3135c: 0x6c18d820, 0x3135d: 0x6e0e7820, 0x3135e: 0x6e0f8220, 0x3135f: 0x6e12b420, + 0x31360: 0x6e458e20, 0x31361: 0x6cc0c020, 0x31362: 0x6da7c620, 0x31363: 0x6dd18820, + 0x31364: 0x6e01ee20, 0x31365: 0x6c348020, 0x31366: 0x6dea2c20, 0x31367: 0x6e135e20, + 0x31368: 0x6cc21820, 0x31369: 0x6c73be20, 0x3136a: 0x6c769c20, 0x3136b: 0x6c795620, + 0x3136c: 0x6c620220, 0x3136d: 0x6c297820, 0x3136e: 0x6c179420, 0x3136f: 0x6cb9b220, + 0x31370: 0x6d7cd420, 0x31371: 0x6de3da20, 0x31372: 0x6dfc5620, 0x31373: 0x6d868620, + 0x31374: 0x6c144420, 0x31375: 0x6e008a20, 0x31376: 0x6d0bc020, 0x31377: 0x6d103820, + 0x31378: 0x6e16b020, 0x31379: 0x6d73ae20, 0x3137a: 0x6e371620, 0x3137b: 0x6d027820, + 0x3137c: 0x6d032420, 0x3137d: 0x6d33d820, 0x3137e: 0x6cdb3420, 0x3137f: 0x6d96bc20, + // Block 0xc4e, offset 0x31380 + 0x31380: 0x6cb78620, 0x31381: 0x6d68ec20, 0x31382: 0x6de11020, 0x31383: 0x6c1e9220, + 0x31384: 0x6e1f9e20, 0x31385: 0x6e206020, 0x31386: 0x6c23f020, 0x31387: 0x6d5d2420, + 0x31388: 0x6d0f2e20, 0x31389: 0x6d152020, 0x3138a: 0x6dc3e620, 0x3138b: 0x6d1fe020, + 0x3138c: 0x6d542620, 0x3138d: 0x6c9f4220, 0x3138e: 0x6d295820, 0x3138f: 0x6ca91620, + 0x31390: 0x6daf5020, 0x31391: 0x6c62d820, 0x31392: 0x6c8d4420, 0x31393: 0x6c145c20, + 0x31394: 0x6d487e20, 0x31395: 0x6c65d820, 0x31396: 0x6d03ae20, 0x31397: 0x6d341420, + 0x31398: 0x6cdb8220, 0x31399: 0x6cb5fc20, 0x3139a: 0x6e21cc20, 0x3139b: 0x6c4ef420, + 0x3139c: 0x6d540620, 0x3139d: 0x6d927c20, 0x3139e: 0x6c024220, 0x3139f: 0x6d1f5620, + 0x313a0: 0x6c4d8620, 0x313a1: 0x6ca2d620, 0x313a2: 0x6ca3e620, 0x313a3: 0x6c06c620, + 0x313a4: 0x6dac3420, 0x313a5: 0x6c438020, 0x313a6: 0x6cc2d420, 0x313a7: 0x6c021a20, + 0x313a8: 0x6c38c420, 0x313a9: 0x6d527e20, 0x313aa: 0x6c803a20, 0x313ab: 0x6c8de620, + 0x313ac: 0x6ced8620, 0x313ad: 0x6c599e20, 0x313ae: 0x6d09c620, 0x313af: 0x6d3c9420, + 0x313b0: 0x6c9e2620, 0x313b1: 0x6c272020, 0x313b2: 0x6c22fc20, 0x313b3: 0x6c4f3820, + 0x313b4: 0x6c5eb420, 0x313b5: 0x6c997820, 0x313b6: 0x6ca3de20, 0x313b7: 0x6c433620, + 0x313b8: 0x6c2a4c20, 0x313b9: 0x6c65d220, 0x313ba: 0x6c9c8020, 0x313bb: 0x6dce7a20, + 0x313bc: 0x6c263620, 0x313bd: 0x6d68e420, 0x313be: 0x6ce47020, 0x313bf: 0x6da05e20, + // Block 0xc4f, offset 0x313c0 + 0x313c0: 0x6c199220, 0x313c1: 0x6c019420, 0x313c2: 0x6de23220, 0x313c3: 0x6c72c420, + 0x313c4: 0x6dc8dc20, 0x313c5: 0x6dfe0220, 0x313c6: 0x6d6f2820, 0x313c7: 0x6e44c220, + 0x313c8: 0x6df75420, 0x313c9: 0x6d758020, 0x313ca: 0x6c00a820, 0x313cb: 0x6d7e5e20, + 0x313cc: 0x6d80f220, 0x313cd: 0x6e22bc20, 0x313ce: 0x6c10da20, 0x313cf: 0x6d4fbc20, + 0x313d0: 0x6e28d020, 0x313d1: 0x6d515420, 0x313d2: 0x6d297c20, 0x313d3: 0x6cfc0c20, + 0x313d4: 0x6d5a3c20, 0x313d5: 0x6c3d4620, 0x313d6: 0x6d60c620, 0x313d7: 0x6db0a020, + 0x313d8: 0x6d6bf020, 0x313d9: 0x6d642020, 0x313da: 0x6cb37e20, 0x313db: 0x6db9b220, + 0x313dc: 0x6c0cfc20, 0x313dd: 0x6c0d4020, 0x313de: 0x6c46c420, 0x313df: 0x6c77fe20, + 0x313e0: 0x6cde9a20, 0x313e1: 0x6d3c9420, 0x313e2: 0x6cf17420, 0x313e3: 0x6c32f220, + 0x313e4: 0x6c993220, 0x313e5: 0x6da72420, 0x313e6: 0x6de83e20, 0x313e7: 0x6dca5a20, + 0x313e8: 0x6c05e820, 0x313e9: 0x6c2d8820, 0x313ea: 0x6d1f5620, 0x313eb: 0x6da2f220, + 0x313ec: 0x6c333420, 0x313ed: 0x6c573a20, 0x313ee: 0x6d5a0620, 0x313ef: 0x6caa3420, + 0x313f0: 0x6caada20, 0x313f1: 0x6d12d220, 0x313f2: 0x6d151e20, 0x313f3: 0x6e359c20, + 0x313f4: 0x6d442e20, 0x313f5: 0x6c298220, 0x313f6: 0x6dcca820, 0x313f7: 0x6e043820, + 0x313f8: 0x6dbbb220, 0x313f9: 0x6cc32e20, 0x313fa: 0x6c006a20, 0x313fb: 0x6d18e420, + 0x313fc: 0x6d4cd620, 0x313fd: 0x6c1cfc20, 0x313fe: 0x6c729c20, 0x313ff: 0x6d540620, + // Block 0xc50, offset 0x31400 + 0x31400: 0x6d834420, 0x31401: 0x6daa7820, 0x31402: 0x6d643a20, 0x31403: 0x6d95ae20, + 0x31404: 0x6d9f9c20, 0x31405: 0x6cf5f820, 0x31406: 0x6c283820, 0x31407: 0x6d48a020, + 0x31408: 0x6c368e20, 0x31409: 0x6c521a20, 0x3140a: 0x6c546e20, 0x3140b: 0x6cfa3020, + 0x3140c: 0x6c7a1820, 0x3140d: 0x6c7ac820, 0x3140e: 0x6cd45220, 0x3140f: 0x6c801620, + 0x31410: 0x6df30020, 0x31411: 0x6c02d820, 0x31412: 0x6d50c420, 0x31413: 0x6cb60220, + 0x31414: 0x6c64a820, 0x31415: 0x6c945a20, 0x31416: 0x6c9f6220, 0x31417: 0x6d6bf820, + 0x31418: 0x6c4d5820, 0x31419: 0x6cf2a220, 0x3141a: 0x6c73f020, 0x3141b: 0x6ca2d620, + 0x3141c: 0x6ce61620, 0x3141d: 0x6c17f820, 0x3141e: 0x6c0e4220, 0x3141f: 0x6d4d6420, + 0x31420: 0x6c35ea20, 0x31421: 0x6c21ce20, 0x31422: 0x6c9cce20, 0x31423: 0x6c38f420, + 0x31424: 0x6ca30c20, 0x31425: 0x6cd24620, 0x31426: 0x6d8bbe20, 0x31427: 0x6d0cea20, + 0x31428: 0x6d0d0c20, 0x31429: 0x6c27f020, 0x3142a: 0x6dd9bc20, 0x3142b: 0x6c8d9420, + 0x3142c: 0x6cfa6c20, 0x3142d: 0x6c194820, 0x3142e: 0x6d834820, 0x3142f: 0x6d84e820, + 0x31430: 0x6e007220, 0x31431: 0x6d6f9220, 0x31432: 0x6e2f7020, 0x31433: 0x6e30b220, + 0x31434: 0x6c36c420, 0x31435: 0x6c9f2420, 0x31436: 0x6db16420, 0x31437: 0x6c0a4420, + 0x31438: 0x6ca80e20, 0x31439: 0x6ca89c20, 0x3143a: 0x6c3ab620, 0x3143b: 0x6c39cc20, + 0x3143c: 0x6ded7c20, 0x3143d: 0x6c029620, 0x3143e: 0x6c83b820, 0x3143f: 0x6c2ae020, + // Block 0xc51, offset 0x31440 + 0x31440: 0x6c032820, 0x31441: 0x6c4c8220, 0x31442: 0x6c349220, 0x31443: 0x6d8a6620, + 0x31444: 0x6c0fbc20, 0x31445: 0x6c542c20, 0x31446: 0x6d531620, 0x31447: 0x6d952420, + 0x31448: 0x6c14d020, 0x31449: 0x6c62dc20, 0x3144a: 0x6c26a020, 0x3144b: 0x6d212a20, + 0x3144c: 0x6c014620, 0x3144d: 0x6ceb7220, 0x3144e: 0x6ceb3420, 0x3144f: 0x6c69d820, + 0x31450: 0x6ced7e20, 0x31451: 0x6cc0dc20, 0x31452: 0x6cc79a20, 0x31453: 0x6cf79a20, + 0x31454: 0x6d26f820, 0x31455: 0x6d769020, 0x31456: 0x6ca29820, 0x31457: 0x6c7bf820, + 0x31458: 0x6c13f620, 0x31459: 0x6c7de220, 0x3145a: 0x6ca69620, 0x3145b: 0x6d30ce20, + 0x3145c: 0x6d155620, 0x3145d: 0x6d335420, 0x3145e: 0x6c144220, 0x3145f: 0x6deabe20, + 0x31460: 0x6e015420, 0x31461: 0x6caea820, 0x31462: 0x6d697820, 0x31463: 0x6cb20820, + 0x31464: 0x6c412e20, 0x31465: 0x6ce32420, 0x31466: 0x6cb42820, 0x31467: 0x6d6e4820, + 0x31468: 0x6d974420, 0x31469: 0x6d149c20, 0x3146a: 0x6ce7aa20, 0x3146b: 0x6d16a820, + 0x3146c: 0x6d9b2420, 0x3146d: 0x6e1a2020, 0x3146e: 0x6c888620, 0x3146f: 0x6d98c020, + 0x31470: 0x6c435e20, 0x31471: 0x6d18fe20, 0x31472: 0x6c173820, 0x31473: 0x6c456020, + 0x31474: 0x6cea9c20, 0x31475: 0x6c2bac20, 0x31476: 0x6cbada20, 0x31477: 0x6d1b7220, + 0x31478: 0x6d773620, 0x31479: 0x6cbcc820, 0x3147a: 0x6d758820, 0x3147b: 0x6d4d6220, + 0x3147c: 0x6c01b620, 0x3147d: 0x6c6fc020, 0x3147e: 0x6cc3aa20, 0x3147f: 0x6d4fb820, + // Block 0xc52, offset 0x31480 + 0x31480: 0x6de28220, 0x31481: 0x6c9ab020, 0x31482: 0x6c50ac20, 0x31483: 0x6cc7b820, + 0x31484: 0x6c9c8820, 0x31485: 0x6c76b620, 0x31486: 0x6c9fb820, 0x31487: 0x6d297a20, + 0x31488: 0x6cce4620, 0x31489: 0x6c04d820, 0x3148a: 0x6cd0a820, 0x3148b: 0x6d028220, + 0x3148c: 0x6c3cee20, 0x3148d: 0x6c5ad020, 0x3148e: 0x6c5ace20, 0x3148f: 0x6c7dc620, + 0x31490: 0x6c7dd220, 0x31491: 0x6c7de020, 0x31492: 0x6d30ca20, 0x31493: 0x6d30cc20, + 0x31494: 0x6d5e0420, 0x31495: 0x6c5ba420, 0x31496: 0x6d051020, 0x31497: 0x6d60c620, + 0x31498: 0x6d8abc20, 0x31499: 0x6daf6420, 0x3149a: 0x6d071220, 0x3149b: 0x6c3e3620, + 0x3149c: 0x6c82de20, 0x3149d: 0x6c020420, 0x3149e: 0x6c020420, 0x3149f: 0x6cdbee20, + 0x314a0: 0x6d678620, 0x314a1: 0x6ca6aa20, 0x314a2: 0x6d928220, 0x314a3: 0x6dd48e20, + 0x314a4: 0x6d3d8420, 0x314a5: 0x6dee3c20, 0x314a6: 0x6c051e20, 0x314a7: 0x6ce32420, + 0x314a8: 0x6df1b220, 0x314a9: 0x6e06f620, 0x314aa: 0x6d9a4a20, 0x314ab: 0x6c6f8420, + 0x314ac: 0x6cfce020, 0x314ad: 0x6d8d8a20, + 0x314b0: 0x6c28ae20, 0x314b1: 0x6c179020, 0x314b2: 0x6c0c5a20, 0x314b3: 0x6c296c20, + 0x314b4: 0x6c061420, 0x314b5: 0x6d767a20, 0x314b6: 0x6c455c20, 0x314b7: 0x6c016420, + 0x314b8: 0x6cbada20, 0x314b9: 0x6c8e9a20, 0x314ba: 0x6cbad220, 0x314bb: 0x6cebb420, + 0x314bc: 0x6ced7e20, 0x314bd: 0x6d4b0420, 0x314be: 0x6c2ea820, 0x314bf: 0x6c2ef220, + // Block 0xc53, offset 0x314c0 + 0x314c0: 0x6c924620, 0x314c1: 0x6d79de20, 0x314c2: 0x6d212820, 0x314c3: 0x6d216c20, + 0x314c4: 0x6c96ac20, 0x314c5: 0x6cf1fa20, 0x314c6: 0x6c97b620, 0x314c7: 0x6cf2b020, + 0x314c8: 0x6cf25620, 0x314c9: 0x6d4fb820, 0x314ca: 0x6d224e20, 0x314cb: 0x6de28220, + 0x314cc: 0x6da46c20, 0x314cd: 0x6cc4ee20, 0x314ce: 0x6cf40620, 0x314cf: 0x6cc56820, + 0x314d0: 0x6c9abe20, 0x314d1: 0x6cc79a20, 0x314d2: 0x6c73be20, 0x314d3: 0x6c9c2220, + 0x314d4: 0x6c21de20, 0x314d5: 0x6c04ae20, 0x314d6: 0x6c9e2620, 0x314d7: 0x6c546e20, + 0x314d8: 0x6cfaa420, 0x314d9: 0x6cccf220, 0x314da: 0x6d297a20, 0x314db: 0x6de4d620, + 0x314dc: 0x6cce4620, 0x314dd: 0x6dab6420, 0x314de: 0x6da93020, 0x314df: 0x6c09de20, + 0x314e0: 0x6ca29820, 0x314e1: 0x6d2d0620, 0x314e2: 0x6d2dac20, 0x314e3: 0x6c3be220, + 0x314e4: 0x6d5b5220, 0x314e5: 0x6d5b3020, 0x314e6: 0x6c7bf820, 0x314e7: 0x6ca4d020, + 0x314e8: 0x6c3c8820, 0x314e9: 0x6cd36020, 0x314ea: 0x6ca59220, 0x314eb: 0x6d5d2820, + 0x314ec: 0x6d5e7620, 0x314ed: 0x6d051020, 0x314ee: 0x6c5c3a20, 0x314ef: 0x6d061420, + 0x314f0: 0x6d60c620, 0x314f1: 0x6cd85420, 0x314f2: 0x6c3e3620, 0x314f3: 0x6c83e820, + 0x314f4: 0x6cdb7e20, 0x314f5: 0x6d900a20, 0x314f6: 0x6db50820, 0x314f7: 0x6dd40e20, + 0x314f8: 0x6ca6aa20, 0x314f9: 0x6d68be20, 0x314fa: 0x6d697820, 0x314fb: 0x6d68d620, + 0x314fc: 0x6d928220, 0x314fd: 0x6d927c20, 0x314fe: 0x6d925c20, 0x314ff: 0x6dd48e20, + // Block 0xc54, offset 0x31500 + 0x31500: 0x6e2c4c20, 0x31501: 0x6dee3c20, 0x31502: 0x6d951e20, 0x31503: 0x6d959e20, + 0x31504: 0x6db93e20, 0x31505: 0x6d40e620, 0x31506: 0x6cb60820, 0x31507: 0x6df1b220, + 0x31508: 0x6d155620, 0x31509: 0x6e06d420, 0x3150a: 0x6e06f620, 0x3150b: 0x6d15fc20, + 0x3150c: 0x6d9a4a20, 0x3150d: 0x6e08b620, 0x3150e: 0x6d9f9e20, 0x3150f: 0x6d502220, + 0x31510: 0x6d501620, 0x31511: 0x6c36f420, 0x31512: 0x6cf6d620, 0x31513: 0x6c597a20, + 0x31514: 0x6cd34020, 0x31515: 0x6d5c7220, 0x31516: 0x6dcdba20, 0x31517: 0x6d0fcc20, + 0x31518: 0x6e313820, 0x31519: 0x6de00020, + // Block 0xc55, offset 0x31540 + 0x31540: 0xf0001c1c, 0x31541: 0xf0001c1c, 0x31542: 0x00658c9c, + 0x31550: 0x2c047483, 0x31551: 0x2c0faa83, 0x31552: 0x2c03a483, 0x31553: 0xf0001c1c, + 0x31554: 0x2c007483, 0x31555: 0x2c0f1e83, 0x31556: 0x2d0dc083, 0x31557: 0x2c03de83, + 0x31558: 0x2c0b5483, 0x31559: 0x2c50d083, 0x3155a: 0x2cce0683, 0x3155b: 0x2c729c83, + 0x3155c: 0x2c44fc83, 0x3155d: 0x2c4d5a83, 0x3155e: 0x2c0c7883, 0x3155f: 0x2cf5a283, + 0x31560: 0x2c17e083, 0x31561: 0x2ca93c83, 0x31562: 0x2c0a0283, 0x31563: 0x2cb1a083, + 0x31564: 0x2c1b6883, 0x31565: 0x2c198083, 0x31566: 0x2d295e83, 0x31567: 0x2c208683, + 0x31568: 0x2c714283, 0x31569: 0x2c000283, 0x3156a: 0x2c00dc83, 0x3156b: 0x2d118683, + 0x3156c: 0x2c089283, 0x3156d: 0x2c023683, 0x3156e: 0x2c075483, 0x3156f: 0x2c4f4883, + 0x31570: 0x2c26fc83, 0x31571: 0x2c093e83, 0x31572: 0x2d032883, 0x31573: 0x2c3d6e83, + 0x31574: 0x2c0e3483, 0x31575: 0x2cccd883, 0x31576: 0x2c127483, 0x31577: 0x2c049c83, + 0x31578: 0x2c0a1083, 0x31579: 0x2cb95283, 0x3157a: 0x2c901a83, + // Block 0xc56, offset 0x31580 + 0x31580: 0xe000b5e5, 0x31581: 0xe000b5dd, 0x31582: 0xe000b5d9, 0x31583: 0xe000b5e9, + 0x31584: 0xe000b5ed, 0x31585: 0xe000b5e1, 0x31586: 0xe000b5f5, 0x31587: 0xe000b5f9, + 0x31588: 0xe000b5f1, + 0x31590: 0x2c96d483, 0x31591: 0x2c074c83, + // Block 0xc57, offset 0x315c0 + 0x315c0: 0x6c003e20, 0x315c1: 0x6c004020, 0x315c2: 0x6c004220, 0x315c3: 0x6c00e820, + 0x315c4: 0x6c00ea20, 0x315c5: 0x6c00ec20, 0x315c6: 0x6c00ee20, 0x315c7: 0x6c022820, + 0x315c8: 0x6c022a20, 0x315c9: 0x6c022c20, 0x315ca: 0x6c022e20, 0x315cb: 0x6c023020, + 0x315cc: 0x6c023220, 0x315cd: 0x6c055220, 0x315ce: 0x6c055420, 0x315cf: 0x6c055620, + 0x315d0: 0x6c055820, 0x315d1: 0x6c055a20, 0x315d2: 0x6c055c20, 0x315d3: 0x6c055e20, + 0x315d4: 0x6c056020, 0x315d5: 0x6c056220, 0x315d6: 0x6c056420, 0x315d7: 0x6c056620, + 0x315d8: 0x6c0ada20, 0x315d9: 0x6c0adc20, 0x315da: 0x6c0ade20, 0x315db: 0x6c0f4220, + 0x315dc: 0x6c0ae020, 0x315dd: 0x6c0dac20, 0x315de: 0x6c0ae220, 0x315df: 0x6c0ae420, + 0x315e0: 0x6c0ae620, 0x315e1: 0x6c15ec20, 0x315e2: 0x6c15ee20, 0x315e3: 0x6c15f020, + 0x315e4: 0x6c15f220, 0x315e5: 0x6c162c20, 0x315e6: 0x6c15f420, 0x315e7: 0x6c15f620, + 0x315e8: 0x6c15f820, 0x315e9: 0x6c0b3a20, 0x315ea: 0x6c15fa20, 0x315eb: 0x6c15fc20, + 0x315ec: 0x6c28b220, 0x315ed: 0x6c28b420, 0x315ee: 0x6c28b620, 0x315ef: 0x6c2d9420, + 0x315f0: 0x6c28b820, 0x315f1: 0x6c28ba20, 0x315f2: 0x6c28bc20, 0x315f3: 0x6c28be20, + 0x315f4: 0x6c28c020, 0x315f5: 0x6c42ea20, 0x315f6: 0x6c42ec20, 0x315f7: 0x6c470a20, + 0x315f8: 0x6c42ee20, 0x315f9: 0x6c470c20, 0x315fa: 0x6c42f020, 0x315fb: 0x6c42f220, + 0x315fc: 0x6c6a8820, 0x315fd: 0x6c63cc20, 0x315fe: 0x6c63ce20, 0x315ff: 0x6c63d020, + // Block 0xc58, offset 0x31600 + 0x31600: 0x6c63d220, 0x31601: 0x6c8af020, 0x31602: 0x6c8af220, 0x31603: 0x6c8af420, + 0x31604: 0x6c8af620, 0x31605: 0x6c8af820, 0x31606: 0x6cb79e20, 0x31607: 0x6cb7a020, + 0x31608: 0x6cb7a220, 0x31609: 0x6cb93420, 0x3160a: 0x6cb7a420, 0x3160b: 0x6cb7a620, + 0x3160c: 0x6ce8ca20, 0x3160d: 0x6ce8cc20, 0x3160e: 0x6d188c20, 0x3160f: 0x6d188e20, + 0x31610: 0x6d189020, 0x31611: 0x6d189220, 0x31612: 0x6d189420, 0x31613: 0x6d479020, + 0x31614: 0x6d479220, 0x31615: 0x6d75c220, 0x31616: 0x6d9fa420, 0x31617: 0x6d75c420, + 0x31618: 0x6d75c620, 0x31619: 0x6d75c820, 0x3161a: 0x6d75ca20, 0x3161b: 0x6d75cc20, + 0x3161c: 0x6da01620, 0x3161d: 0x6d75ce20, 0x3161e: 0x6da57820, 0x3161f: 0x6dc24420, + 0x31620: 0x6df86a20, 0x31621: 0x6c004620, 0x31622: 0x6c004820, 0x31623: 0x6c023e20, + 0x31624: 0x6c079620, 0x31625: 0x6c056a20, 0x31626: 0x6c0aea20, 0x31627: 0x6c160220, + 0x31628: 0x6c160420, 0x31629: 0x6c28c620, 0x3162a: 0x6c28c820, 0x3162b: 0x6c28ca20, + 0x3162c: 0x6c28cc20, 0x3162d: 0x6c42f820, 0x3162e: 0x6c42fa20, 0x3162f: 0x6c42fc20, + 0x31630: 0x6c63da20, 0x31631: 0x6c63dc20, 0x31632: 0x6c15ae20, 0x31633: 0x6c8afc20, + 0x31634: 0x6cb7a820, 0x31635: 0x6cb7aa20, 0x31636: 0x6d189820, 0x31637: 0x6d1bb420, + 0x31638: 0x6d479420, 0x31639: 0x6dc24620, 0x3163a: 0x6de00420, 0x3163b: 0x6e1c0420, + 0x3163c: 0x6c010220, 0x3163d: 0x6c010420, 0x3163e: 0x6c026420, 0x3163f: 0x6c024620, + // Block 0xc59, offset 0x31640 + 0x31640: 0x6c057020, 0x31641: 0x6c057220, 0x31642: 0x6c0aec20, 0x31643: 0x6c63de20, + 0x31644: 0x6ce8ce20, 0x31645: 0x6d75d420, 0x31646: 0x6c005620, 0x31647: 0x6c005820, + 0x31648: 0x6c005a20, 0x31649: 0x6c005c20, 0x3164a: 0x6c005e20, 0x3164b: 0x6c011020, + 0x3164c: 0x6c011220, 0x3164d: 0x6c011420, 0x3164e: 0x6c011620, 0x3164f: 0x6c024e20, + 0x31650: 0x6c025020, 0x31651: 0x6c025220, 0x31652: 0x6c025420, 0x31653: 0x6c025620, + 0x31654: 0x6c057c20, 0x31655: 0x6c057e20, 0x31656: 0x6c058020, 0x31657: 0x6c058220, + 0x31658: 0x6c058420, 0x31659: 0x6c058620, 0x3165a: 0x6c058820, 0x3165b: 0x6c058a20, + 0x3165c: 0x6c058c20, 0x3165d: 0x6c058e20, 0x3165e: 0x6c059020, 0x3165f: 0x6c059220, + 0x31660: 0x6c059420, 0x31661: 0x6c059620, 0x31662: 0x6c0af820, 0x31663: 0x6c0afa20, + 0x31664: 0x6c0afc20, 0x31665: 0x6c0afe20, 0x31666: 0x6c0b0020, 0x31667: 0x6c0b0220, + 0x31668: 0x6c149620, 0x31669: 0x6c0b0420, 0x3166a: 0x6c0b0620, 0x3166b: 0x6c0b0820, + 0x3166c: 0x6c0dd620, 0x3166d: 0x6c0b0a20, 0x3166e: 0x6c0dd820, 0x3166f: 0x6c160820, + 0x31670: 0x6c18ea20, 0x31671: 0x6c227c20, 0x31672: 0x6c28d220, 0x31673: 0x6c28d420, + 0x31674: 0x6c430420, 0x31675: 0x6c3bd820, 0x31676: 0x6c28d620, 0x31677: 0x6c430620, + 0x31678: 0x6c431c20, 0x31679: 0x6c63e220, 0x3167a: 0x6c63e420, 0x3167b: 0x6c63e620, + 0x3167c: 0x6c63e820, 0x3167d: 0x6c63ea20, 0x3167e: 0x6c63ec20, 0x3167f: 0x6c8afe20, + // Block 0xc5a, offset 0x31680 + 0x31680: 0x6c8b0020, 0x31681: 0x6c8b0220, 0x31682: 0x6c8b0420, 0x31683: 0x6cb7ac20, + 0x31684: 0x6cb7ae20, 0x31685: 0x6d189a20, 0x31686: 0x6ce8d020, 0x31687: 0x6d479620, + 0x31688: 0x6e284820, 0x31689: 0x6c001620, 0x3168a: 0x6c001820, 0x3168b: 0x6c001a20, + 0x3168c: 0x6c001c20, 0x3168d: 0x6c001e20, 0x3168e: 0x6c002020, 0x3168f: 0x6c006620, + 0x31690: 0x6c006820, 0x31691: 0x6c002220, 0x31692: 0x6c012620, 0x31693: 0x6c012820, + 0x31694: 0x6c012a20, 0x31695: 0x6c026620, 0x31696: 0x6c026820, 0x31697: 0x6c026a20, + 0x31698: 0x6c026c20, 0x31699: 0x6c026e20, 0x3169a: 0x6c027020, 0x3169b: 0x6c027220, + 0x3169c: 0x6c027420, 0x3169d: 0x6c027620, 0x3169e: 0x6c05a220, 0x3169f: 0x6c05a420, + 0x316a0: 0x6c05a620, 0x316a1: 0x6c05a820, 0x316a2: 0x6c05aa20, 0x316a3: 0x6c05ac20, + 0x316a4: 0x6c0b2c20, 0x316a5: 0x6c0b2e20, 0x316a6: 0x6c0b3020, 0x316a7: 0x6c0b3220, + 0x316a8: 0x6c0b3420, 0x316a9: 0x6c161420, 0x316aa: 0x6c161620, 0x316ab: 0x6c24c020, + 0x316ac: 0x6c161820, 0x316ad: 0x6c28ea20, 0x316ae: 0x6c28ec20, 0x316af: 0x6c28ee20, + 0x316b0: 0x6c3bda20, 0x316b1: 0x6c2fdc20, 0x316b2: 0x6c431e20, 0x316b3: 0x6c432020, + 0x316b4: 0x6c432220, 0x316b5: 0x6c432420, 0x316b6: 0x6c432620, 0x316b7: 0x6c432820, + 0x316b8: 0x6c63f420, 0x316b9: 0x6c63f620, 0x316ba: 0x6c63f820, 0x316bb: 0x6c63fa20, + 0x316bc: 0x6c8b1220, 0x316bd: 0x6c8b1420, 0x316be: 0x6c8b1620, 0x316bf: 0x6c8b1820, + // Block 0xc5b, offset 0x316c0 + 0x316c0: 0x6c8b1a20, 0x316c1: 0x6c8b1c20, 0x316c2: 0x6c8b1e20, 0x316c3: 0x6ce8d820, + 0x316c4: 0x6ce8da20, 0x316c5: 0x6d189c20, 0x316c6: 0x6d189e20, 0x316c7: 0x6d18a020, + 0x316c8: 0x6d18a220, 0x316c9: 0x6d9fa620, 0x316ca: 0x6de00820, 0x316cb: 0x6df86c20, + 0x316cc: 0x6c002620, 0x316cd: 0x6c006c20, 0x316ce: 0x6c006e20, 0x316cf: 0x6c007020, + 0x316d0: 0x6c007220, 0x316d1: 0x6c012e20, 0x316d2: 0x6c027c20, 0x316d3: 0x6c027e20, + 0x316d4: 0x6c028020, 0x316d5: 0x6c0b3c20, 0x316d6: 0x6c162220, 0x316d7: 0x6c162420, + 0x316d8: 0x6c162620, 0x316d9: 0x6c28f620, 0x316da: 0x6c8b2220, 0x316db: 0x6cb7ba20, + 0x316dc: 0x6d479820, 0x316dd: 0x6d75d820, 0x316de: 0x6c007620, 0x316df: 0x6c007820, + 0x316e0: 0x6c007a20, 0x316e1: 0x6c028e20, 0x316e2: 0x6c0b4420, 0x316e3: 0x6c0b4620, + 0x316e4: 0x6c0b4820, 0x316e5: 0x6c0b4a20, 0x316e6: 0x6c0b4c20, 0x316e7: 0x6c0b4e20, + 0x316e8: 0x6c162e20, 0x316e9: 0x6c163020, 0x316ea: 0x6c163220, 0x316eb: 0x6c290220, + 0x316ec: 0x6c290420, 0x316ed: 0x6c290620, 0x316ee: 0x6c290820, 0x316ef: 0x6c290a20, + 0x316f0: 0x6c432c20, 0x316f1: 0x6c432e20, 0x316f2: 0x6c433020, 0x316f3: 0x6c433220, + 0x316f4: 0x6c4d0220, 0x316f5: 0x6c640220, 0x316f6: 0x6c640420, 0x316f7: 0x6c640620, + 0x316f8: 0x6c640820, 0x316f9: 0x6c8b2420, 0x316fa: 0x6c8b2620, 0x316fb: 0x6cb7be20, + 0x316fc: 0x6ce8de20, 0x316fd: 0x6ce8e020, 0x316fe: 0x6ce8e220, 0x316ff: 0x6d18a620, + // Block 0xc5c, offset 0x31700 + 0x31700: 0x6d479a20, 0x31701: 0x6c029420, 0x31702: 0x6c05b220, 0x31703: 0x6c0b5c20, + 0x31704: 0x6c0b5e20, 0x31705: 0x6c0b6020, 0x31706: 0x6c0b6220, 0x31707: 0x6c0b6420, + 0x31708: 0x6c163c20, 0x31709: 0x6c163e20, 0x3170a: 0x6c164020, 0x3170b: 0x6c164220, + 0x3170c: 0x6c291220, 0x3170d: 0x6c291420, 0x3170e: 0x6c291620, 0x3170f: 0x6c291820, + 0x31710: 0x6c291a20, 0x31711: 0x6c291c20, 0x31712: 0x6c291e20, 0x31713: 0x6c434020, + 0x31714: 0x6c434220, 0x31715: 0x6c434420, 0x31716: 0x6c640c20, 0x31717: 0x6c6a8e20, + 0x31718: 0x6c640e20, 0x31719: 0x6c641020, 0x3171a: 0x6c641220, 0x3171b: 0x6c641420, + 0x3171c: 0x6c641620, 0x3171d: 0x6c641820, 0x3171e: 0x6c8b2820, 0x3171f: 0x6c8b2a20, + 0x31720: 0x6c8b2c20, 0x31721: 0x6c8b2e20, 0x31722: 0x6c8b3020, 0x31723: 0x6c8b3220, + 0x31724: 0x6c8b3420, 0x31725: 0x6c8b3620, 0x31726: 0x6c8b3820, 0x31727: 0x6c8b3a20, + 0x31728: 0x6cb7c420, 0x31729: 0x6cb7c620, 0x3172a: 0x6cb7c820, 0x3172b: 0x6cb7ca20, + 0x3172c: 0x6cb7cc20, 0x3172d: 0x6cb7ce20, 0x3172e: 0x6cb7d020, 0x3172f: 0x6cb7d220, + 0x31730: 0x6cd41020, 0x31731: 0x6cbd9c20, 0x31732: 0x6cb7d420, 0x31733: 0x6ce8ea20, + 0x31734: 0x6ce8ec20, 0x31735: 0x6ce8ee20, 0x31736: 0x6ce8f020, 0x31737: 0x6ce8f220, + 0x31738: 0x6ce8f420, 0x31739: 0x6cf16620, 0x3173a: 0x6ce8f620, 0x3173b: 0x6ce8f820, + 0x3173c: 0x6ce8fa20, 0x3173d: 0x6cf00420, 0x3173e: 0x6d18aa20, 0x3173f: 0x6d18ac20, + // Block 0xc5d, offset 0x31740 + 0x31740: 0x6ce8fc20, 0x31741: 0x6d479e20, 0x31742: 0x6d47a020, 0x31743: 0x6d47a220, + 0x31744: 0x6d47a420, 0x31745: 0x6d47a620, 0x31746: 0x6d47a820, 0x31747: 0x6d47aa20, + 0x31748: 0x6d47ac20, 0x31749: 0x6d47ae20, 0x3174a: 0x6d49c820, 0x3174b: 0x6d75dc20, + 0x3174c: 0x6d75de20, 0x3174d: 0x6d75e020, 0x3174e: 0x6d75e220, 0x3174f: 0x6d75e420, + 0x31750: 0x6d75e620, 0x31751: 0x6d75e820, 0x31752: 0x6d75ea20, 0x31753: 0x6d790e20, + 0x31754: 0x6d75ec20, 0x31755: 0x6d791020, 0x31756: 0x6d75ee20, 0x31757: 0x6d75f020, + 0x31758: 0x6d75f220, 0x31759: 0x6da20a20, 0x3175a: 0x6dc24820, 0x3175b: 0x6dc70c20, + 0x3175c: 0x6ddfee20, 0x3175d: 0x6de00a20, 0x3175e: 0x6e0c3c20, 0x3175f: 0x6e318620, + 0x31760: 0x6e428220, 0x31761: 0x6e442020, 0x31762: 0x6c008220, 0x31763: 0x6c014020, + 0x31764: 0x6c014220, 0x31765: 0x6c014420, 0x31766: 0x6c02be20, 0x31767: 0x6c02c020, + 0x31768: 0x6c02c220, 0x31769: 0x6c05fc20, 0x3176a: 0x6c05fe20, 0x3176b: 0x6c060020, + 0x3176c: 0x6c060220, 0x3176d: 0x6c060420, 0x3176e: 0x6c06ac20, 0x3176f: 0x6c060620, + 0x31770: 0x6c060820, 0x31771: 0x6c06d820, 0x31772: 0x6c08d020, 0x31773: 0x6c060a20, + 0x31774: 0x6c0bfa20, 0x31775: 0x6c0bfc20, 0x31776: 0x6c0bfe20, 0x31777: 0x6c0c0020, + 0x31778: 0x6c0c0220, 0x31779: 0x6c0c0420, 0x3177a: 0x6c0c0620, 0x3177b: 0x6c0c0820, + 0x3177c: 0x6c0c0a20, 0x3177d: 0x6c0c0c20, 0x3177e: 0x6c0c0e20, 0x3177f: 0x6c0c1020, + // Block 0xc5e, offset 0x31780 + 0x31780: 0x6c0c1220, 0x31781: 0x6c0c1420, 0x31782: 0x6c0c1620, 0x31783: 0x6c0c1820, + 0x31784: 0x6c0c1a20, 0x31785: 0x6c0c1c20, 0x31786: 0x6c0c1e20, 0x31787: 0x6c0c2020, + 0x31788: 0x6c0c2220, 0x31789: 0x6c0c2420, 0x3178a: 0x6c0c2620, 0x3178b: 0x6c0c2820, + 0x3178c: 0x6c0c2a20, 0x3178d: 0x6c0c2c20, 0x3178e: 0x6c0c2e20, 0x3178f: 0x6c0c3020, + 0x31790: 0x6c0c3220, 0x31791: 0x6c0c3420, 0x31792: 0x6c0c5e20, 0x31793: 0x6c0c3620, + 0x31794: 0x6c0c3820, 0x31795: 0x6c0c3a20, 0x31796: 0x6c16ca20, 0x31797: 0x6c16cc20, + 0x31798: 0x6c16ce20, 0x31799: 0x6c16d020, 0x3179a: 0x6c16d220, 0x3179b: 0x6c16d420, + 0x3179c: 0x6c16d620, 0x3179d: 0x6c16d820, 0x3179e: 0x6c16da20, 0x3179f: 0x6c16dc20, + 0x317a0: 0x6c16de20, 0x317a1: 0x6c16e020, 0x317a2: 0x6c16e220, 0x317a3: 0x6c16e420, + 0x317a4: 0x6c16e620, 0x317a5: 0x6c16e820, 0x317a6: 0x6c16ea20, 0x317a7: 0x6c16ec20, + 0x317a8: 0x6c16ee20, 0x317a9: 0x6c16f020, 0x317aa: 0x6c16f220, 0x317ab: 0x6c16f420, + 0x317ac: 0x6c16f620, 0x317ad: 0x6c16f820, 0x317ae: 0x6c16fa20, 0x317af: 0x6c16fc20, + 0x317b0: 0x6c16fe20, 0x317b1: 0x6c170020, 0x317b2: 0x6c170220, 0x317b3: 0x6c170420, + 0x317b4: 0x6c170620, 0x317b5: 0x6c170820, 0x317b6: 0x6c170a20, 0x317b7: 0x6c170c20, + 0x317b8: 0x6c170e20, 0x317b9: 0x6c171020, 0x317ba: 0x6c171220, 0x317bb: 0x6c171420, + 0x317bc: 0x6c171620, 0x317bd: 0x6c171820, 0x317be: 0x6c171a20, 0x317bf: 0x6c171c20, + // Block 0xc5f, offset 0x317c0 + 0x317c0: 0x6c171e20, 0x317c1: 0x6c172020, 0x317c2: 0x6c19c820, 0x317c3: 0x6c29ca20, + 0x317c4: 0x6c29cc20, 0x317c5: 0x6c29ce20, 0x317c6: 0x6c29d020, 0x317c7: 0x6c29d220, + 0x317c8: 0x6c29d420, 0x317c9: 0x6c29d620, 0x317ca: 0x6c29d820, 0x317cb: 0x6c29da20, + 0x317cc: 0x6c29dc20, 0x317cd: 0x6c29de20, 0x317ce: 0x6c29e020, 0x317cf: 0x6c29e220, + 0x317d0: 0x6c29e420, 0x317d1: 0x6c29e620, 0x317d2: 0x6c29e820, 0x317d3: 0x6c29ea20, + 0x317d4: 0x6c29ec20, 0x317d5: 0x6c29ee20, 0x317d6: 0x6c29f020, 0x317d7: 0x6c29f220, + 0x317d8: 0x6c29f420, 0x317d9: 0x6c29f620, 0x317da: 0x6c29f820, 0x317db: 0x6c29fa20, + 0x317dc: 0x6c29fc20, 0x317dd: 0x6c29fe20, 0x317de: 0x6c2a0020, 0x317df: 0x6c2a0220, + 0x317e0: 0x6c2a0420, 0x317e1: 0x6c2a0620, 0x317e2: 0x6c2a0820, 0x317e3: 0x6c2a0a20, + 0x317e4: 0x6c305c20, 0x317e5: 0x6c2a0c20, 0x317e6: 0x6c2a0e20, 0x317e7: 0x6c2a1020, + 0x317e8: 0x6c2a1220, 0x317e9: 0x6c2a1420, 0x317ea: 0x6c2a1620, 0x317eb: 0x6c2a1820, + 0x317ec: 0x6c2a1a20, 0x317ed: 0x6c43de20, 0x317ee: 0x6c43e020, 0x317ef: 0x6c43e220, + 0x317f0: 0x6c43e420, 0x317f1: 0x6c43e620, 0x317f2: 0x6c43e820, 0x317f3: 0x6c43ea20, + 0x317f4: 0x6c43ec20, 0x317f5: 0x6c43ee20, 0x317f6: 0x6c43f020, 0x317f7: 0x6c43f220, + 0x317f8: 0x6c43f420, 0x317f9: 0x6c43f620, 0x317fa: 0x6c43f820, 0x317fb: 0x6c43fa20, + 0x317fc: 0x6c43fc20, 0x317fd: 0x6c43fe20, 0x317fe: 0x6c440020, 0x317ff: 0x6c440220, + // Block 0xc60, offset 0x31800 + 0x31800: 0x6c440420, 0x31801: 0x6c440620, 0x31802: 0x6c440820, 0x31803: 0x6c440a20, + 0x31804: 0x6c440c20, 0x31805: 0x6c440e20, 0x31806: 0x6c441020, 0x31807: 0x6c441220, + 0x31808: 0x6c441420, 0x31809: 0x6c441620, 0x3180a: 0x6c441820, 0x3180b: 0x6c441a20, + 0x3180c: 0x6c441c20, 0x3180d: 0x6c441e20, 0x3180e: 0x6c442020, 0x3180f: 0x6c442220, + 0x31810: 0x6c442420, 0x31811: 0x6c442620, 0x31812: 0x6c442820, 0x31813: 0x6c442a20, + 0x31814: 0x6c442c20, 0x31815: 0x6c442e20, 0x31816: 0x6c443020, 0x31817: 0x6c443220, + 0x31818: 0x6c443420, 0x31819: 0x6c443620, 0x3181a: 0x6c443820, 0x3181b: 0x6c443a20, + 0x3181c: 0x6c443c20, 0x3181d: 0x6c443e20, 0x3181e: 0x6c444020, 0x3181f: 0x6c444220, + 0x31820: 0x6c444420, 0x31821: 0x6c444620, 0x31822: 0x6c444820, 0x31823: 0x6c64d220, + 0x31824: 0x6c64d420, 0x31825: 0x6c64d620, 0x31826: 0x6c64d820, 0x31827: 0x6c64da20, + 0x31828: 0x6c64dc20, 0x31829: 0x6c64de20, 0x3182a: 0x6c64e020, 0x3182b: 0x6c64e220, + 0x3182c: 0x6c64e420, 0x3182d: 0x6c64e620, 0x3182e: 0x6c64e820, 0x3182f: 0x6c64ea20, + 0x31830: 0x6c64ec20, 0x31831: 0x6c64ee20, 0x31832: 0x6c64f020, 0x31833: 0x6c64f220, + 0x31834: 0x6c64f420, 0x31835: 0x6c64f620, 0x31836: 0x6c64f820, 0x31837: 0x6c64fa20, + 0x31838: 0x6c64fc20, 0x31839: 0x6c64fe20, 0x3183a: 0x6c650020, 0x3183b: 0x6c650220, + 0x3183c: 0x6c650420, 0x3183d: 0x6c650620, 0x3183e: 0x6c650820, 0x3183f: 0x6c650a20, + // Block 0xc61, offset 0x31840 + 0x31840: 0x6c650c20, 0x31841: 0x6c650e20, 0x31842: 0x6c651020, 0x31843: 0x6c651220, + 0x31844: 0x6c651420, 0x31845: 0x6c651620, 0x31846: 0x6c651820, 0x31847: 0x6c651a20, + 0x31848: 0x6c651c20, 0x31849: 0x6c651e20, 0x3184a: 0x6c652020, 0x3184b: 0x6c652220, + 0x3184c: 0x6c652420, 0x3184d: 0x6c652620, 0x3184e: 0x6c652820, 0x3184f: 0x6c652a20, + 0x31850: 0x6c652c20, 0x31851: 0x6c652e20, 0x31852: 0x6c653020, 0x31853: 0x6c653220, + 0x31854: 0x6c653420, 0x31855: 0x6c653620, 0x31856: 0x6c653820, 0x31857: 0x6c653a20, + 0x31858: 0x6c653c20, 0x31859: 0x6c653e20, 0x3185a: 0x6c654020, 0x3185b: 0x6c654220, + 0x3185c: 0x6c654420, 0x3185d: 0x6c654620, 0x3185e: 0x6c654820, 0x3185f: 0x6c654a20, + 0x31860: 0x6c654c20, 0x31861: 0x6c654e20, 0x31862: 0x6c655020, 0x31863: 0x6c655220, + 0x31864: 0x6c655420, 0x31865: 0x6c655620, 0x31866: 0x6c655820, 0x31867: 0x6c8bc620, + 0x31868: 0x6c8bc820, 0x31869: 0x6c8bca20, 0x3186a: 0x6c8bcc20, 0x3186b: 0x6c8bce20, + 0x3186c: 0x6c8bd020, 0x3186d: 0x6c8bd220, 0x3186e: 0x6c8bd420, 0x3186f: 0x6c8bd620, + 0x31870: 0x6c8bd820, 0x31871: 0x6c8bda20, 0x31872: 0x6c8bdc20, 0x31873: 0x6c8bde20, + 0x31874: 0x6c8be020, 0x31875: 0x6c8be220, 0x31876: 0x6c8be420, 0x31877: 0x6c8be620, + 0x31878: 0x6c8be820, 0x31879: 0x6c8bea20, 0x3187a: 0x6c8bec20, 0x3187b: 0x6c8bee20, + 0x3187c: 0x6c8bf020, 0x3187d: 0x6c8bf220, 0x3187e: 0x6c8bf420, 0x3187f: 0x6c8bf620, + // Block 0xc62, offset 0x31880 + 0x31880: 0x6c8bf820, 0x31881: 0x6c8bfa20, 0x31882: 0x6c8bfc20, 0x31883: 0x6c8bfe20, + 0x31884: 0x6c8c0020, 0x31885: 0x6c8c0220, 0x31886: 0x6c8c0420, 0x31887: 0x6c8c0620, + 0x31888: 0x6c8c0820, 0x31889: 0x6c8c0a20, 0x3188a: 0x6c8c0c20, 0x3188b: 0x6c8c0e20, + 0x3188c: 0x6c8c1020, 0x3188d: 0x6c8c1220, 0x3188e: 0x6c8c1420, 0x3188f: 0x6c8c1620, + 0x31890: 0x6c8c1820, 0x31891: 0x6c428e20, 0x31892: 0x6c8c1a20, 0x31893: 0x6c8c1c20, + 0x31894: 0x6c8c1e20, 0x31895: 0x6c8c2020, 0x31896: 0x6c8c2220, 0x31897: 0x6c8c2420, + 0x31898: 0x6c8c2620, 0x31899: 0x6c8c2820, 0x3189a: 0x6c8c2a20, 0x3189b: 0x6c8c2c20, + 0x3189c: 0x6c8c2e20, 0x3189d: 0x6c8c3020, 0x3189e: 0x6c8c3220, 0x3189f: 0x6c655a20, + 0x318a0: 0x6c8c3420, 0x318a1: 0x6c8c3620, 0x318a2: 0x6c8c3820, 0x318a3: 0x6c8c3a20, + 0x318a4: 0x6c8c3c20, 0x318a5: 0x6c8c3e20, 0x318a6: 0x6c8c4020, 0x318a7: 0x6c8c4220, + 0x318a8: 0x6c8c4420, 0x318a9: 0x6c8c4620, 0x318aa: 0x6c8c4820, 0x318ab: 0x6c8c4a20, + 0x318ac: 0x6c8c4c20, 0x318ad: 0x6cb83e20, 0x318ae: 0x6cb84020, 0x318af: 0x6cb84220, + 0x318b0: 0x6cb84420, 0x318b1: 0x6cb84620, 0x318b2: 0x6cb84820, 0x318b3: 0x6cb84a20, + 0x318b4: 0x6cb84c20, 0x318b5: 0x6cb84e20, 0x318b6: 0x6cb85020, 0x318b7: 0x6cb85220, + 0x318b8: 0x6cb85420, 0x318b9: 0x6cb85620, 0x318ba: 0x6cb85820, 0x318bb: 0x6cb85a20, + 0x318bc: 0x6cb85c20, 0x318bd: 0x6cb85e20, 0x318be: 0x6cb86020, 0x318bf: 0x6cb86220, + // Block 0xc63, offset 0x318c0 + 0x318c0: 0x6cb86420, 0x318c1: 0x6cb86620, 0x318c2: 0x6cb86820, 0x318c3: 0x6cb86a20, + 0x318c4: 0x6cb86c20, 0x318c5: 0x6cb86e20, 0x318c6: 0x6cb8d620, 0x318c7: 0x6cb87020, + 0x318c8: 0x6cb87220, 0x318c9: 0x6cb87420, 0x318ca: 0x6cb87620, 0x318cb: 0x6cb87820, + 0x318cc: 0x6cb87a20, 0x318cd: 0x6cb87c20, 0x318ce: 0x6cb87e20, 0x318cf: 0x6cb88020, + 0x318d0: 0x6cb88220, 0x318d1: 0x6cb88420, 0x318d2: 0x6cb88620, 0x318d3: 0x6cb88820, + 0x318d4: 0x6cb88a20, 0x318d5: 0x6cb88c20, 0x318d6: 0x6cb88e20, 0x318d7: 0x6cb89020, + 0x318d8: 0x6cb89220, 0x318d9: 0x6cb89420, 0x318da: 0x6cb89620, 0x318db: 0x6cb89820, + 0x318dc: 0x6cb89a20, 0x318dd: 0x6cb89c20, 0x318de: 0x6cbd9420, 0x318df: 0x6cd2ce20, + 0x318e0: 0x6cb89e20, 0x318e1: 0x6cb8a020, 0x318e2: 0x6cb8a220, 0x318e3: 0x6cb8a420, + 0x318e4: 0x6cb8a620, 0x318e5: 0x6cb8a820, 0x318e6: 0x6cb8aa20, 0x318e7: 0x6cb8ac20, + 0x318e8: 0x6cb8ae20, 0x318e9: 0x6cb8b020, 0x318ea: 0x6ca52820, 0x318eb: 0x6ce95420, + 0x318ec: 0x6ce95620, 0x318ed: 0x6ce95820, 0x318ee: 0x6ce95a20, 0x318ef: 0x6ce95c20, + 0x318f0: 0x6ce95e20, 0x318f1: 0x6ce96020, 0x318f2: 0x6ce96220, 0x318f3: 0x6ce96420, + 0x318f4: 0x6ce96620, 0x318f5: 0x6ce96820, 0x318f6: 0x6ce96a20, 0x318f7: 0x6ce96c20, + 0x318f8: 0x6ce96e20, 0x318f9: 0x6ce97020, 0x318fa: 0x6ce97220, 0x318fb: 0x6ce97420, + 0x318fc: 0x6ce97620, 0x318fd: 0x6ce97820, 0x318fe: 0x6ce97a20, 0x318ff: 0x6ce97c20, + // Block 0xc64, offset 0x31900 + 0x31900: 0x6ce97e20, 0x31901: 0x6ce98020, 0x31902: 0x6ce98220, 0x31903: 0x6ce98420, + 0x31904: 0x6ce98620, 0x31905: 0x6ce98820, 0x31906: 0x6ce98a20, 0x31907: 0x6ce98c20, + 0x31908: 0x6ce98e20, 0x31909: 0x6ce99020, 0x3190a: 0x6ce99220, 0x3190b: 0x6ce99420, + 0x3190c: 0x6ce99620, 0x3190d: 0x6ce99820, 0x3190e: 0x6ce99a20, 0x3190f: 0x6ce99c20, + 0x31910: 0x6ce99e20, 0x31911: 0x6ce9a020, 0x31912: 0x6ce9a220, 0x31913: 0x6ce9a420, + 0x31914: 0x6ce9a620, 0x31915: 0x6ce9a820, 0x31916: 0x6ce9aa20, 0x31917: 0x6ce9ac20, + 0x31918: 0x6ce9ae20, 0x31919: 0x6ce9b020, 0x3191a: 0x6ce9b220, 0x3191b: 0x6ce9b420, + 0x3191c: 0x6ce9b620, 0x3191d: 0x6ce9b820, 0x3191e: 0x6ce9ba20, 0x3191f: 0x6ce9bc20, + 0x31920: 0x6ce9be20, 0x31921: 0x6ce9c020, 0x31922: 0x6d01fc20, 0x31923: 0x6ce9c220, + 0x31924: 0x6ce9c420, 0x31925: 0x6d191a20, 0x31926: 0x6ce9c620, 0x31927: 0x6ce9c820, + 0x31928: 0x6ce9ca20, 0x31929: 0x6ce9cc20, 0x3192a: 0x6ce9ce20, 0x3192b: 0x6ce9d020, + 0x3192c: 0x6ce9d220, 0x3192d: 0x6d191c20, 0x3192e: 0x6d191e20, 0x3192f: 0x6d192020, + 0x31930: 0x6d192220, 0x31931: 0x6d192420, 0x31932: 0x6d192620, 0x31933: 0x6d192820, + 0x31934: 0x6d192a20, 0x31935: 0x6d192c20, 0x31936: 0x6d192e20, 0x31937: 0x6d193020, + 0x31938: 0x6d193220, 0x31939: 0x6d193420, 0x3193a: 0x6d193620, 0x3193b: 0x6d193820, + 0x3193c: 0x6d193a20, 0x3193d: 0x6d193c20, 0x3193e: 0x6d193e20, 0x3193f: 0x6d194020, + // Block 0xc65, offset 0x31940 + 0x31940: 0x6d194220, 0x31941: 0x6d194420, 0x31942: 0x6d194620, 0x31943: 0x6d194820, + 0x31944: 0x6d194a20, 0x31945: 0x6d194c20, 0x31946: 0x6d194e20, 0x31947: 0x6d195020, + 0x31948: 0x6d195220, 0x31949: 0x6d195420, 0x3194a: 0x6d195620, 0x3194b: 0x6d195820, + 0x3194c: 0x6d195a20, 0x3194d: 0x6d195c20, 0x3194e: 0x6d195e20, 0x3194f: 0x6d196020, + 0x31950: 0x6d196220, 0x31951: 0x6d196420, 0x31952: 0x6d196620, 0x31953: 0x6d196820, + 0x31954: 0x6d196a20, 0x31955: 0x6d196c20, 0x31956: 0x6d196e20, 0x31957: 0x6d197020, + 0x31958: 0x6d311420, 0x31959: 0x6d197220, 0x3195a: 0x6d197420, 0x3195b: 0x6d2bee20, + 0x3195c: 0x6e0bec20, 0x3195d: 0x6d197620, 0x3195e: 0x6d197820, 0x3195f: 0x6d197a20, + 0x31960: 0x6d197c20, 0x31961: 0x6d197e20, 0x31962: 0x6d198020, 0x31963: 0x6d198220, + 0x31964: 0x6d198420, 0x31965: 0x6d198620, 0x31966: 0x6d198820, 0x31967: 0x6d198a20, + 0x31968: 0x6d198c20, 0x31969: 0x6d198e20, 0x3196a: 0x6d199020, 0x3196b: 0x6d199220, + 0x3196c: 0x6d199420, 0x3196d: 0x6d199620, 0x3196e: 0x6d199820, 0x3196f: 0x6d199a20, + 0x31970: 0x6d199c20, 0x31971: 0x6d199e20, 0x31972: 0x6d19a020, 0x31973: 0x6d19a220, + 0x31974: 0x6d19a420, 0x31975: 0x6ce9d420, 0x31976: 0x6d234020, 0x31977: 0x6d47f620, + 0x31978: 0x6d47f820, 0x31979: 0x6d47fa20, 0x3197a: 0x6d47fc20, 0x3197b: 0x6d47fe20, + 0x3197c: 0x6d480020, 0x3197d: 0x6d480220, 0x3197e: 0x6d480420, 0x3197f: 0x6d480620, + // Block 0xc66, offset 0x31980 + 0x31980: 0x6d480820, 0x31981: 0x6d480a20, 0x31982: 0x6d480c20, 0x31983: 0x6d480e20, + 0x31984: 0x6d481020, 0x31985: 0x6d481220, 0x31986: 0x6d481420, 0x31987: 0x6d481620, + 0x31988: 0x6d481820, 0x31989: 0x6d481a20, 0x3198a: 0x6d481c20, 0x3198b: 0x6d481e20, + 0x3198c: 0x6d482020, 0x3198d: 0x6d482220, 0x3198e: 0x6d482420, 0x3198f: 0x6d482620, + 0x31990: 0x6d19a620, 0x31991: 0x6d482820, 0x31992: 0x6d761c20, 0x31993: 0x6d49ca20, + 0x31994: 0x6d482a20, 0x31995: 0x6d482c20, 0x31996: 0x6d482e20, 0x31997: 0x6d483020, + 0x31998: 0x6d483220, 0x31999: 0x6d483420, 0x3199a: 0x6d483620, 0x3199b: 0x6d483820, + 0x3199c: 0x6d483a20, 0x3199d: 0x6d483c20, 0x3199e: 0x6d483e20, 0x3199f: 0x6d484020, + 0x319a0: 0x6d484220, 0x319a1: 0x6d484420, 0x319a2: 0x6d484620, 0x319a3: 0x6d484820, + 0x319a4: 0x6d484a20, 0x319a5: 0x6d484c20, 0x319a6: 0x6d484e20, 0x319a7: 0x6d49cc20, + 0x319a8: 0x6d761e20, 0x319a9: 0x6d762020, 0x319aa: 0x6d762220, 0x319ab: 0x6d762420, + 0x319ac: 0x6d762620, 0x319ad: 0x6d762820, 0x319ae: 0x6d762a20, 0x319af: 0x6d762c20, + 0x319b0: 0x6d762e20, 0x319b1: 0x6d763020, 0x319b2: 0x6d763220, 0x319b3: 0x6d763420, + 0x319b4: 0x6d763620, 0x319b5: 0x6d763820, 0x319b6: 0x6d763a20, 0x319b7: 0x6d763c20, + 0x319b8: 0x6d763e20, 0x319b9: 0x6d764020, 0x319ba: 0x6d764220, 0x319bb: 0x6d764420, + 0x319bc: 0x6d764620, 0x319bd: 0x6d764820, 0x319be: 0x6d764a20, 0x319bf: 0x6d764c20, + // Block 0xc67, offset 0x319c0 + 0x319c0: 0x6d764e20, 0x319c1: 0x6d765020, 0x319c2: 0x6d765220, 0x319c3: 0x6d765420, + 0x319c4: 0x6d765620, 0x319c5: 0x6d765820, 0x319c6: 0x6d765a20, 0x319c7: 0x6d765c20, + 0x319c8: 0x6d9fc820, 0x319c9: 0x6d9fca20, 0x319ca: 0x6d9fcc20, 0x319cb: 0x6d9fce20, + 0x319cc: 0x6d9fd020, 0x319cd: 0x6d9fd220, 0x319ce: 0x6d9fd420, 0x319cf: 0x6d9fd620, + 0x319d0: 0x6d9fd820, 0x319d1: 0x6d9fda20, 0x319d2: 0x6d9fdc20, 0x319d3: 0x6d9fde20, + 0x319d4: 0x6d9fe020, 0x319d5: 0x6d9fe220, 0x319d6: 0x6d9fe420, 0x319d7: 0x6d9fe620, + 0x319d8: 0x6d9fe820, 0x319d9: 0x6d9fea20, 0x319da: 0x6d9fec20, 0x319db: 0x6d9fee20, + 0x319dc: 0x6db61c20, 0x319dd: 0x6d9ff020, 0x319de: 0x6d9ff220, 0x319df: 0x6d9ff420, + 0x319e0: 0x6d9ff620, 0x319e1: 0x6d9ff820, 0x319e2: 0x6d9ffa20, 0x319e3: 0x6dc25620, + 0x319e4: 0x6dc25820, 0x319e5: 0x6dc25a20, 0x319e6: 0x6dc25c20, 0x319e7: 0x6dc25e20, + 0x319e8: 0x6dc26020, 0x319e9: 0x6dc26220, 0x319ea: 0x6dc26420, 0x319eb: 0x6dc26620, + 0x319ec: 0x6dc26820, 0x319ed: 0x6dc26a20, 0x319ee: 0x6dc26c20, 0x319ef: 0x6dc26e20, + 0x319f0: 0x6dc27020, 0x319f1: 0x6dc27220, 0x319f2: 0x6dc27420, 0x319f3: 0x6dc27620, + 0x319f4: 0x6dc27820, 0x319f5: 0x6dc27a20, 0x319f6: 0x6dc27c20, 0x319f7: 0x6dc27e20, + 0x319f8: 0x6dc28020, 0x319f9: 0x6dc28220, 0x319fa: 0x6dc28420, 0x319fb: 0x6de01a20, + 0x319fc: 0x6de01c20, 0x319fd: 0x6de01e20, 0x319fe: 0x6de02020, 0x319ff: 0x6de02220, + // Block 0xc68, offset 0x31a00 + 0x31a00: 0x6de02420, 0x31a01: 0x6de02620, 0x31a02: 0x6de5da20, 0x31a03: 0x6de02820, + 0x31a04: 0x6de02a20, 0x31a05: 0x6de02c20, 0x31a06: 0x6de02e20, 0x31a07: 0x6de03020, + 0x31a08: 0x6de03220, 0x31a09: 0x6de03420, 0x31a0a: 0x6de03620, 0x31a0b: 0x6de03820, + 0x31a0c: 0x6de03a20, 0x31a0d: 0x6df87620, 0x31a0e: 0x6df87820, 0x31a0f: 0x6df87a20, + 0x31a10: 0x6df87c20, 0x31a11: 0x6df87e20, 0x31a12: 0x6df88020, 0x31a13: 0x6df88220, + 0x31a14: 0x6df88420, 0x31a15: 0x6df88620, 0x31a16: 0x6df88820, 0x31a17: 0x6e0c4a20, + 0x31a18: 0x6e0c4c20, 0x31a19: 0x6e0c4e20, 0x31a1a: 0x6e0c5020, 0x31a1b: 0x6e0c5220, + 0x31a1c: 0x6e0c5420, 0x31a1d: 0x6e0c5620, 0x31a1e: 0x6df88a20, 0x31a1f: 0x6e0c5820, + 0x31a20: 0x6e0c5a20, 0x31a21: 0x6e0c5c20, 0x31a22: 0x6e0c5e20, 0x31a23: 0x6e0c6020, + 0x31a24: 0x6e1c0c20, 0x31a25: 0x6e1c0e20, 0x31a26: 0x6e1c1020, 0x31a27: 0x6e1c1220, + 0x31a28: 0x6e1c1420, 0x31a29: 0x6e1c1620, 0x31a2a: 0x6e284e20, 0x31a2b: 0x6e285020, + 0x31a2c: 0x6e285220, 0x31a2d: 0x6e285420, 0x31a2e: 0x6e285620, 0x31a2f: 0x6e285820, + 0x31a30: 0x6e318a20, 0x31a31: 0x6e38ae20, 0x31a32: 0x6e3ce420, 0x31a33: 0x6e3ce620, + 0x31a34: 0x6e446c20, 0x31a35: 0x6e442220, 0x31a36: 0x6c02cc20, 0x31a37: 0x6c061020, + 0x31a38: 0x6c061220, 0x31a39: 0x6c0c5020, 0x31a3a: 0x6c0c5220, 0x31a3b: 0x6c0c5420, + 0x31a3c: 0x6c0c5620, 0x31a3d: 0x6c174220, 0x31a3e: 0x6c174420, 0x31a3f: 0x6c174620, + // Block 0xc69, offset 0x31a40 + 0x31a40: 0x6c174820, 0x31a41: 0x6c174a20, 0x31a42: 0x6c174c20, 0x31a43: 0x6c2a3820, + 0x31a44: 0x6c2a3a20, 0x31a45: 0x6c2a3c20, 0x31a46: 0x6c2a3e20, 0x31a47: 0x6c2a4020, + 0x31a48: 0x6c2a4220, 0x31a49: 0x6c2a4420, 0x31a4a: 0x6c2a4620, 0x31a4b: 0x6c2a4820, + 0x31a4c: 0x6c446020, 0x31a4d: 0x6c446220, 0x31a4e: 0x6c446420, 0x31a4f: 0x6c446620, + 0x31a50: 0x6c657620, 0x31a51: 0x6c657820, 0x31a52: 0x6c657a20, 0x31a53: 0x6c657c20, + 0x31a54: 0x6c657e20, 0x31a55: 0x6c658020, 0x31a56: 0x6c658220, 0x31a57: 0x6c8c6e20, + 0x31a58: 0x6c8c7020, 0x31a59: 0x6c8c7220, 0x31a5a: 0x6c8c7420, 0x31a5b: 0x6c8c7620, + 0x31a5c: 0x6c8c7820, 0x31a5d: 0x6c8c7a20, 0x31a5e: 0x6cb8ca20, 0x31a5f: 0x6cb8cc20, + 0x31a60: 0x6cb8ce20, 0x31a61: 0x6cb8d020, 0x31a62: 0x6cb8d220, 0x31a63: 0x6cb8d420, + 0x31a64: 0x6ce9e420, 0x31a65: 0x6ce9e620, 0x31a66: 0x6ce9e820, 0x31a67: 0x6d19b820, + 0x31a68: 0x6d19ba20, 0x31a69: 0x6d19bc20, 0x31a6a: 0x6d19be20, 0x31a6b: 0x6d19c020, + 0x31a6c: 0x6d19c220, 0x31a6d: 0x6d19c420, 0x31a6e: 0x6d19c620, 0x31a6f: 0x6d19c820, + 0x31a70: 0x6d485c20, 0x31a71: 0x6d485e20, 0x31a72: 0x6d486020, 0x31a73: 0x6d766820, + 0x31a74: 0x6d486220, 0x31a75: 0x6d486420, 0x31a76: 0x6d486620, 0x31a77: 0x6d486820, + 0x31a78: 0x6d766a20, 0x31a79: 0x6d766c20, 0x31a7a: 0x6d766e20, 0x31a7b: 0x6d767020, + 0x31a7c: 0x6d767220, 0x31a7d: 0x6d767420, 0x31a7e: 0x6d767620, 0x31a7f: 0x6da00420, + // Block 0xc6a, offset 0x31a80 + 0x31a80: 0x6da00620, 0x31a81: 0x6da00820, 0x31a82: 0x6da00a20, 0x31a83: 0x6da00c20, + 0x31a84: 0x6da00e20, 0x31a85: 0x6da01020, 0x31a86: 0x6dc28e20, 0x31a87: 0x6da01220, + 0x31a88: 0x6dc29020, 0x31a89: 0x6dc29220, 0x31a8a: 0x6dc29420, 0x31a8b: 0x6de04220, + 0x31a8c: 0x6de23820, 0x31a8d: 0x6df88e20, 0x31a8e: 0x6de04420, 0x31a8f: 0x6df89020, + 0x31a90: 0x6df89220, 0x31a91: 0x6e0c6620, 0x31a92: 0x6e0c6820, 0x31a93: 0x6e1c1820, + 0x31a94: 0x6e1c1a20, 0x31a95: 0x6e285a20, 0x31a96: 0x6e285c20, 0x31a97: 0x6e318c20, + 0x31a98: 0x6e318e20, 0x31a99: 0x6e319020, 0x31a9a: 0x6e3ce820, 0x31a9b: 0x6c014a20, + 0x31a9c: 0x6c02d020, 0x31a9d: 0x6c02d220, 0x31a9e: 0x6c02d420, 0x31a9f: 0x6c061a20, + 0x31aa0: 0x6c0c6020, 0x31aa1: 0x6c0c6220, 0x31aa2: 0x6c0c6420, 0x31aa3: 0x6c0c6620, + 0x31aa4: 0x6c175220, 0x31aa5: 0x6c175420, 0x31aa6: 0x6c175620, 0x31aa7: 0x6c175820, + 0x31aa8: 0x6c175a20, 0x31aa9: 0x6c2a4e20, 0x31aaa: 0x6c446e20, 0x31aab: 0x6c447020, + 0x31aac: 0x6c447220, 0x31aad: 0x6c658620, 0x31aae: 0x6c658820, 0x31aaf: 0x6c658a20, + 0x31ab0: 0x6c658c20, 0x31ab1: 0x6c8c7c20, 0x31ab2: 0x6cb8d820, 0x31ab3: 0x6cb8da20, + 0x31ab4: 0x6ce9ec20, 0x31ab5: 0x6ce9ee20, 0x31ab6: 0x6ce9f020, 0x31ab7: 0x6ce9f220, + 0x31ab8: 0x6d19ca20, 0x31ab9: 0x6d19cc20, 0x31aba: 0x6d19ce20, 0x31abb: 0x6d19d020, + 0x31abc: 0x6d767820, 0x31abd: 0x6da01420, 0x31abe: 0x6dc29620, 0x31abf: 0x6df89420, + // Block 0xc6b, offset 0x31ac0 + 0x31ac0: 0x6c014c20, 0x31ac1: 0x6c02de20, 0x31ac2: 0x6c02e020, 0x31ac3: 0x6c02e220, + 0x31ac4: 0x6c02e420, 0x31ac5: 0x6c061e20, 0x31ac6: 0x6c062020, 0x31ac7: 0x6c020820, + 0x31ac8: 0x6c0c7220, 0x31ac9: 0x6c0c7420, 0x31aca: 0x6c176420, 0x31acb: 0x6c176620, + 0x31acc: 0x6c176820, 0x31acd: 0x6c176a20, 0x31ace: 0x6c176c20, 0x31acf: 0x6c176e20, + 0x31ad0: 0x6c2a5620, 0x31ad1: 0x6c2a5820, 0x31ad2: 0x6c447a20, 0x31ad3: 0x6c447c20, + 0x31ad4: 0x6c447e20, 0x31ad5: 0x6c448020, 0x31ad6: 0x6c448220, 0x31ad7: 0x6c448420, + 0x31ad8: 0x6c4d0420, 0x31ad9: 0x6c659420, 0x31ada: 0x6c659620, 0x31adb: 0x6c659820, + 0x31adc: 0x6c8c8020, 0x31add: 0x6c8c8220, 0x31ade: 0x6cb8dc20, 0x31adf: 0x6cb8de20, + 0x31ae0: 0x6cb8e020, 0x31ae1: 0x6cb8e220, 0x31ae2: 0x6cb8e420, 0x31ae3: 0x6cb8e620, + 0x31ae4: 0x6cb8e820, 0x31ae5: 0x6cb8ea20, 0x31ae6: 0x6cb8ec20, 0x31ae7: 0x6cb8ee20, + 0x31ae8: 0x6ce9f820, 0x31ae9: 0x6ce9fa20, 0x31aea: 0x6ce9fc20, 0x31aeb: 0x6ce9fe20, + 0x31aec: 0x6cea0020, 0x31aed: 0x6cea0220, 0x31aee: 0x6cea0420, 0x31aef: 0x6d19d220, + 0x31af0: 0x6d19d420, 0x31af1: 0x6d19d620, 0x31af2: 0x6d1b1620, 0x31af3: 0x6d767c20, + 0x31af4: 0x6d767e20, 0x31af5: 0x6d768020, 0x31af6: 0x6dc29a20, 0x31af7: 0x6dc29c20, + 0x31af8: 0x6de04820, 0x31af9: 0x6de04a20, 0x31afa: 0x6de04c20, 0x31afb: 0x6e474020, + 0x31afc: 0x6c014e20, 0x31afd: 0x6c02f220, 0x31afe: 0x6c02f420, 0x31aff: 0x6c02f620, + // Block 0xc6c, offset 0x31b00 + 0x31b00: 0x6c02f820, 0x31b01: 0x6c062a20, 0x31b02: 0x6c062c20, 0x31b03: 0x6c062e20, + 0x31b04: 0x6c063020, 0x31b05: 0x6c063220, 0x31b06: 0x6c063420, 0x31b07: 0x6c063620, + 0x31b08: 0x6c063820, 0x31b09: 0x6c063a20, 0x31b0a: 0x6c063c20, 0x31b0b: 0x6c0c7c20, + 0x31b0c: 0x6c0c7e20, 0x31b0d: 0x6c0c8020, 0x31b0e: 0x6c0c8220, 0x31b0f: 0x6c0c8420, + 0x31b10: 0x6c177220, 0x31b11: 0x6c177420, 0x31b12: 0x6c177620, 0x31b13: 0x6c177820, + 0x31b14: 0x6c177a20, 0x31b15: 0x6c177c20, 0x31b16: 0x6c2a6020, 0x31b17: 0x6c2a6220, + 0x31b18: 0x6c2a6420, 0x31b19: 0x6c2a6620, 0x31b1a: 0x6c2a6820, 0x31b1b: 0x6c448a20, + 0x31b1c: 0x6c448c20, 0x31b1d: 0x6c659e20, 0x31b1e: 0x6c65a020, 0x31b1f: 0x6c65a220, + 0x31b20: 0x6c8c8a20, 0x31b21: 0x6c8c8c20, 0x31b22: 0x6c8c8e20, 0x31b23: 0x6cb8f620, + 0x31b24: 0x6cb8f820, 0x31b25: 0x6cb8fa20, 0x31b26: 0x6cea0a20, 0x31b27: 0x6cea0c20, + 0x31b28: 0x6d19dc20, 0x31b29: 0x6d19de20, 0x31b2a: 0x6d487220, 0x31b2b: 0x6d227a20, + 0x31b2c: 0x6d487420, 0x31b2d: 0x6d768420, 0x31b2e: 0x6d768620, 0x31b2f: 0x6dc29e20, + 0x31b30: 0x6dc2a020, 0x31b31: 0x6df89820, 0x31b32: 0x6e1c1e20, 0x31b33: 0x6c030220, + 0x31b34: 0x6c030420, 0x31b35: 0x6c064220, 0x31b36: 0x6c064420, 0x31b37: 0x6c064620, + 0x31b38: 0x6c064820, 0x31b39: 0x6c0c8a20, 0x31b3a: 0x6c0c8c20, 0x31b3b: 0x6c0c8e20, + 0x31b3c: 0x6c0c9020, 0x31b3d: 0x6c0c9220, 0x31b3e: 0x6c0c9420, 0x31b3f: 0x6c0c9620, + // Block 0xc6d, offset 0x31b40 + 0x31b40: 0x6c178220, 0x31b41: 0x6c178420, 0x31b42: 0x6c178620, 0x31b43: 0x6c178820, + 0x31b44: 0x6c2a6c20, 0x31b45: 0x6c2a6e20, 0x31b46: 0x6c2a7020, 0x31b47: 0x6c449620, + 0x31b48: 0x6c449820, 0x31b49: 0x6c449a20, 0x31b4a: 0x6c449c20, 0x31b4b: 0x6c449e20, + 0x31b4c: 0x6c65b220, 0x31b4d: 0x6c65b420, 0x31b4e: 0x6c65b620, 0x31b4f: 0x6c65b820, + 0x31b50: 0x6c65ba20, 0x31b51: 0x6c65bc20, 0x31b52: 0x6c65be20, 0x31b53: 0x6c8c9220, + 0x31b54: 0x6cb8fe20, 0x31b55: 0x6cb90020, 0x31b56: 0x6cb90220, 0x31b57: 0x6cb90420, + 0x31b58: 0x6cb90620, 0x31b59: 0x6cb90820, 0x31b5a: 0x6cea0e20, 0x31b5b: 0x6cea1020, + 0x31b5c: 0x6d19e220, 0x31b5d: 0x6d19e420, 0x31b5e: 0x6d19e620, 0x31b5f: 0x6d30e420, + 0x31b60: 0x6d768a20, 0x31b61: 0x6d768c20, 0x31b62: 0x6da01820, 0x31b63: 0x6dc2a220, + 0x31b64: 0x6dc2a420, 0x31b65: 0x6dc2a620, 0x31b66: 0x6df89a20, 0x31b67: 0x6df89c20, + 0x31b68: 0x6df89e20, 0x31b69: 0x6e0c6a20, 0x31b6a: 0x6e1c2020, 0x31b6b: 0x6e285e20, + 0x31b6c: 0x6c015020, 0x31b6d: 0x6c030820, 0x31b6e: 0x6c065220, 0x31b6f: 0x6c065420, + 0x31b70: 0x6c065620, 0x31b71: 0x6c0ca620, 0x31b72: 0x6c0ca820, 0x31b73: 0x6c0caa20, + 0x31b74: 0x6c0cac20, 0x31b75: 0x6c0cae20, 0x31b76: 0x6c0cb020, 0x31b77: 0x6c179e20, + 0x31b78: 0x6c17a020, 0x31b79: 0x6c17a220, 0x31b7a: 0x6c17a420, 0x31b7b: 0x6c17a620, + 0x31b7c: 0x6c17a820, 0x31b7d: 0x6c17aa20, 0x31b7e: 0x6c17ac20, 0x31b7f: 0x6c17ae20, + // Block 0xc6e, offset 0x31b80 + 0x31b80: 0x6c2a8820, 0x31b81: 0x6c17b020, 0x31b82: 0x6c2a8a20, 0x31b83: 0x6c2a8c20, + 0x31b84: 0x6c2a8e20, 0x31b85: 0x6c2a9020, 0x31b86: 0x6c2a9220, 0x31b87: 0x6c2a9420, + 0x31b88: 0x6c44aa20, 0x31b89: 0x6c44ac20, 0x31b8a: 0x6c44ae20, 0x31b8b: 0x6c44b020, + 0x31b8c: 0x6c44b220, 0x31b8d: 0x6c44b420, 0x31b8e: 0x6c44b620, 0x31b8f: 0x6c44b820, + 0x31b90: 0x6c44ba20, 0x31b91: 0x6c44bc20, 0x31b92: 0x6c44be20, 0x31b93: 0x6c44c020, + 0x31b94: 0x6c44c220, 0x31b95: 0x6c44c420, 0x31b96: 0x6c44c620, 0x31b97: 0x6c44c820, + 0x31b98: 0x6c65de20, 0x31b99: 0x6c65e020, 0x31b9a: 0x6c65e220, 0x31b9b: 0x6c65e420, + 0x31b9c: 0x6c65e620, 0x31b9d: 0x6c65e820, 0x31b9e: 0x6c65ea20, 0x31b9f: 0x6c65ec20, + 0x31ba0: 0x6c65ee20, 0x31ba1: 0x6c65f020, 0x31ba2: 0x6c65f220, 0x31ba3: 0x6c65f420, + 0x31ba4: 0x6c65f620, 0x31ba5: 0x6c8c9e20, 0x31ba6: 0x6c8ca020, 0x31ba7: 0x6c8ca220, + 0x31ba8: 0x6c8ca420, 0x31ba9: 0x6c8ca620, 0x31baa: 0x6c8ca820, 0x31bab: 0x6c8caa20, + 0x31bac: 0x6c8cac20, 0x31bad: 0x6c8cae20, 0x31bae: 0x6c8cb020, 0x31baf: 0x6c8cb220, + 0x31bb0: 0x6c8cb420, 0x31bb1: 0x6cb91a20, 0x31bb2: 0x6cb91c20, 0x31bb3: 0x6cb91e20, + 0x31bb4: 0x6cb92020, 0x31bb5: 0x6cb92220, 0x31bb6: 0x6cb92420, 0x31bb7: 0x6cb92620, + 0x31bb8: 0x6cb92820, 0x31bb9: 0x6cb92a20, 0x31bba: 0x6cea1620, 0x31bbb: 0x6cea1820, + 0x31bbc: 0x6cea1a20, 0x31bbd: 0x6cea1c20, 0x31bbe: 0x6cea1e20, 0x31bbf: 0x6cea2020, + // Block 0xc6f, offset 0x31bc0 + 0x31bc0: 0x6cea2220, 0x31bc1: 0x6cea2420, 0x31bc2: 0x6cea2620, 0x31bc3: 0x6cea2820, + 0x31bc4: 0x6d19ee20, 0x31bc5: 0x6d19f020, 0x31bc6: 0x6d19f220, 0x31bc7: 0x6d19f420, + 0x31bc8: 0x6d19f620, 0x31bc9: 0x6d19f820, 0x31bca: 0x6d488020, 0x31bcb: 0x6d488220, + 0x31bcc: 0x6d488420, 0x31bcd: 0x6d488620, 0x31bce: 0x6d488820, 0x31bcf: 0x6d488a20, + 0x31bd0: 0x6d488c20, 0x31bd1: 0x6d488e20, 0x31bd2: 0x6d769220, 0x31bd3: 0x6d19fa20, + 0x31bd4: 0x6d769420, 0x31bd5: 0x6d769620, 0x31bd6: 0x6da01c20, 0x31bd7: 0x6da01e20, + 0x31bd8: 0x6da02020, 0x31bd9: 0x6da02220, 0x31bda: 0x6da02420, 0x31bdb: 0x6da02620, + 0x31bdc: 0x6da02820, 0x31bdd: 0x6dc2a820, 0x31bde: 0x6dc2aa20, 0x31bdf: 0x6dc2ac20, + 0x31be0: 0x6dc2ae20, 0x31be1: 0x6dc2b020, 0x31be2: 0x6de04e20, 0x31be3: 0x6de05020, + 0x31be4: 0x6e0c6c20, 0x31be5: 0x6e1c2220, 0x31be6: 0x6e3cea20, 0x31be7: 0x6c009620, + 0x31be8: 0x6c009820, 0x31be9: 0x6c030c20, 0x31bea: 0x6c030e20, 0x31beb: 0x6c031020, + 0x31bec: 0x6c031220, 0x31bed: 0x6c031420, 0x31bee: 0x6c031620, 0x31bef: 0x6c031820, + 0x31bf0: 0x6c031a20, 0x31bf1: 0x6c066020, 0x31bf2: 0x6c066220, 0x31bf3: 0x6c066420, + 0x31bf4: 0x6c066620, 0x31bf5: 0x6c0cc220, 0x31bf6: 0x6c0cc420, 0x31bf7: 0x6c0cc620, + 0x31bf8: 0x6c0cc820, 0x31bf9: 0x6c0cca20, 0x31bfa: 0x6c0ccc20, 0x31bfb: 0x6c0cce20, + 0x31bfc: 0x6c17ba20, 0x31bfd: 0x6c17bc20, 0x31bfe: 0x6c17be20, 0x31bff: 0x6c17c020, + // Block 0xc70, offset 0x31c00 + 0x31c00: 0x6c17c220, 0x31c01: 0x6c17c420, 0x31c02: 0x6c17c620, 0x31c03: 0x6c17c820, + 0x31c04: 0x6c17ca20, 0x31c05: 0x6c17cc20, 0x31c06: 0x6c2a9e20, 0x31c07: 0x6c2aa020, + 0x31c08: 0x6c2aa220, 0x31c09: 0x6c2aa420, 0x31c0a: 0x6c2aa620, 0x31c0b: 0x6c2aa820, + 0x31c0c: 0x6c2aaa20, 0x31c0d: 0x6c2aac20, 0x31c0e: 0x6c2aae20, 0x31c0f: 0x6c44d220, + 0x31c10: 0x6c44d420, 0x31c11: 0x6c44d620, 0x31c12: 0x6c660020, 0x31c13: 0x6c660220, + 0x31c14: 0x6c660420, 0x31c15: 0x6c660620, 0x31c16: 0x6c660820, 0x31c17: 0x6c6de220, + 0x31c18: 0x6c8cc220, 0x31c19: 0x6c8cc420, 0x31c1a: 0x6c916e20, 0x31c1b: 0x6c8cc620, + 0x31c1c: 0x6c8cc820, 0x31c1d: 0x6c8cca20, 0x31c1e: 0x6c8ccc20, 0x31c1f: 0x6cb93620, + 0x31c20: 0x6cb93820, 0x31c21: 0x6cb93a20, 0x31c22: 0x6cb93c20, 0x31c23: 0x6cb93e20, + 0x31c24: 0x6cea2e20, 0x31c25: 0x6cea3020, 0x31c26: 0x6cea3220, 0x31c27: 0x6cea3420, + 0x31c28: 0x6d1a0220, 0x31c29: 0x6d1a0420, 0x31c2a: 0x6d1a0620, 0x31c2b: 0x6d489220, + 0x31c2c: 0x6d717420, 0x31c2d: 0x6d769a20, 0x31c2e: 0x6d769c20, 0x31c2f: 0x6d769e20, + 0x31c30: 0x6d76a020, 0x31c31: 0x6da02c20, 0x31c32: 0x6df8a220, 0x31c33: 0x6e0c6e20, + 0x31c34: 0x6c009c20, 0x31c35: 0x6c015820, 0x31c36: 0x6c031e20, 0x31c37: 0x6c032020, + 0x31c38: 0x6c032220, 0x31c39: 0x6c067220, 0x31c3a: 0x6c067420, 0x31c3b: 0x6c067620, + 0x31c3c: 0x6c076c20, 0x31c3d: 0x6c067820, 0x31c3e: 0x6c0cd620, 0x31c3f: 0x6c0cd820, + // Block 0xc71, offset 0x31c40 + 0x31c40: 0x6c0cda20, 0x31c41: 0x6c0cdc20, 0x31c42: 0x6c0cde20, 0x31c43: 0x6c0ce020, + 0x31c44: 0x6c0ce220, 0x31c45: 0x6c0ce420, 0x31c46: 0x6c17d020, 0x31c47: 0x6c17d220, + 0x31c48: 0x6c17d420, 0x31c49: 0x6c17d620, 0x31c4a: 0x6c17d820, 0x31c4b: 0x6c2ab420, + 0x31c4c: 0x6c2ab620, 0x31c4d: 0x6c2ab820, 0x31c4e: 0x6c44da20, 0x31c4f: 0x6c44dc20, + 0x31c50: 0x6c44de20, 0x31c51: 0x6c633020, 0x31c52: 0x6c660c20, 0x31c53: 0x6c660e20, + 0x31c54: 0x6c8cd020, 0x31c55: 0x6c8cd220, 0x31c56: 0x6c8cd420, 0x31c57: 0x6c8cd620, + 0x31c58: 0x6cb94220, 0x31c59: 0x6d1a0820, 0x31c5a: 0x6d1a0a20, 0x31c5b: 0x6d4b1220, + 0x31c5c: 0x6d489420, 0x31c5d: 0x6d76a220, 0x31c5e: 0x6da02e20, 0x31c5f: 0x6de05220, + 0x31c60: 0x6df8a420, 0x31c61: 0x6e0c7020, 0x31c62: 0x6e319220, 0x31c63: 0x6c00a620, + 0x31c64: 0x6c015e20, 0x31c65: 0x6c032c20, 0x31c66: 0x6c032e20, 0x31c67: 0x6c033020, + 0x31c68: 0x6c033220, 0x31c69: 0x6c033420, 0x31c6a: 0x6c033620, 0x31c6b: 0x6c033820, + 0x31c6c: 0x6c033a20, 0x31c6d: 0x6c068c20, 0x31c6e: 0x6c068e20, 0x31c6f: 0x6c069020, + 0x31c70: 0x6c069220, 0x31c71: 0x6c069420, 0x31c72: 0x6c069620, 0x31c73: 0x6c069820, + 0x31c74: 0x6c069a20, 0x31c75: 0x6c0d0620, 0x31c76: 0x6c069c20, 0x31c77: 0x6c0d0820, + 0x31c78: 0x6c0d0a20, 0x31c79: 0x6c0d0c20, 0x31c7a: 0x6c0d0e20, 0x31c7b: 0x6c069e20, + 0x31c7c: 0x6c0d1020, 0x31c7d: 0x6c0d1220, 0x31c7e: 0x6c0d1420, 0x31c7f: 0x6c0d1620, + // Block 0xc72, offset 0x31c80 + 0x31c80: 0x6c0d1820, 0x31c81: 0x6c0d1a20, 0x31c82: 0x6c0d1c20, 0x31c83: 0x6c0d1e20, + 0x31c84: 0x6c0d2020, 0x31c85: 0x6c0d2220, 0x31c86: 0x6c0d2420, 0x31c87: 0x6c0d2620, + 0x31c88: 0x6c0d2820, 0x31c89: 0x6c0d2a20, 0x31c8a: 0x6c0d2c20, 0x31c8b: 0x6c0d2e20, + 0x31c8c: 0x6c0d3020, 0x31c8d: 0x6c0d3220, 0x31c8e: 0x6c180220, 0x31c8f: 0x6c180420, + 0x31c90: 0x6c180620, 0x31c91: 0x6c180820, 0x31c92: 0x6c180a20, 0x31c93: 0x6c180c20, + 0x31c94: 0x6c180e20, 0x31c95: 0x6c181020, 0x31c96: 0x6c181220, 0x31c97: 0x6c181420, + 0x31c98: 0x6c181620, 0x31c99: 0x6c181820, 0x31c9a: 0x6c181a20, 0x31c9b: 0x6c181c20, + 0x31c9c: 0x6c181e20, 0x31c9d: 0x6c182020, 0x31c9e: 0x6c182220, 0x31c9f: 0x6c182420, + 0x31ca0: 0x6c182620, 0x31ca1: 0x6c182820, 0x31ca2: 0x6c182a20, 0x31ca3: 0x6c182c20, + 0x31ca4: 0x6c182e20, 0x31ca5: 0x6c183020, 0x31ca6: 0x6c183220, 0x31ca7: 0x6c2af220, + 0x31ca8: 0x6c2af420, 0x31ca9: 0x6c2af620, 0x31caa: 0x6c2af820, 0x31cab: 0x6c2afa20, + 0x31cac: 0x6c2afc20, 0x31cad: 0x6c2afe20, 0x31cae: 0x6c2b0020, 0x31caf: 0x6c2b0220, + 0x31cb0: 0x6c2b0420, 0x31cb1: 0x6c2b0620, 0x31cb2: 0x6c2b0820, 0x31cb3: 0x6c2b0a20, + 0x31cb4: 0x6c2b0c20, 0x31cb5: 0x6c2b0e20, 0x31cb6: 0x6c2b1020, 0x31cb7: 0x6c2b1220, + 0x31cb8: 0x6c2b1420, 0x31cb9: 0x6c2b1620, 0x31cba: 0x6c2b1820, 0x31cbb: 0x6c2b1a20, + 0x31cbc: 0x6c2b1c20, 0x31cbd: 0x6c2b1e20, 0x31cbe: 0x6c2b2020, 0x31cbf: 0x6c2b2220, + // Block 0xc73, offset 0x31cc0 + 0x31cc0: 0x6c2b2420, 0x31cc1: 0x6c2b2620, 0x31cc2: 0x6c2b2820, 0x31cc3: 0x6c2b2a20, + 0x31cc4: 0x6c2b2c20, 0x31cc5: 0x6c2b2e20, 0x31cc6: 0x6c2b3020, 0x31cc7: 0x6c2b3220, + 0x31cc8: 0x6c2b3420, 0x31cc9: 0x6c2b3620, 0x31cca: 0x6c2b3820, 0x31ccb: 0x6c2b3a20, + 0x31ccc: 0x6c2b3c20, 0x31ccd: 0x6c2b3e20, 0x31cce: 0x6c2b4020, 0x31ccf: 0x6c2b4220, + 0x31cd0: 0x6c450620, 0x31cd1: 0x6c450820, 0x31cd2: 0x6c450a20, 0x31cd3: 0x6c450c20, + 0x31cd4: 0x6c450e20, 0x31cd5: 0x6c451020, 0x31cd6: 0x6c451220, 0x31cd7: 0x6c451420, + 0x31cd8: 0x6c451620, 0x31cd9: 0x6c451820, 0x31cda: 0x6c451a20, 0x31cdb: 0x6c451c20, + 0x31cdc: 0x6c451e20, 0x31cdd: 0x6c452020, 0x31cde: 0x6c452220, 0x31cdf: 0x6c452420, + 0x31ce0: 0x6c452620, 0x31ce1: 0x6c452820, 0x31ce2: 0x6c452a20, 0x31ce3: 0x6c452c20, + 0x31ce4: 0x6c452e20, 0x31ce5: 0x6c453020, 0x31ce6: 0x6c453220, 0x31ce7: 0x6c453420, + 0x31ce8: 0x6c453620, 0x31ce9: 0x6c453820, 0x31cea: 0x6c453a20, 0x31ceb: 0x6c453c20, + 0x31cec: 0x6c453e20, 0x31ced: 0x6c454020, 0x31cee: 0x6c454220, 0x31cef: 0x6c454420, + 0x31cf0: 0x6c454620, 0x31cf1: 0x6c664820, 0x31cf2: 0x6c664a20, 0x31cf3: 0x6c664c20, + 0x31cf4: 0x6c664e20, 0x31cf5: 0x6c665020, 0x31cf6: 0x6c665220, 0x31cf7: 0x6c665420, + 0x31cf8: 0x6c665620, 0x31cf9: 0x6c665820, 0x31cfa: 0x6c665a20, 0x31cfb: 0x6c665c20, + 0x31cfc: 0x6c665e20, 0x31cfd: 0x6c666020, 0x31cfe: 0x6c666220, 0x31cff: 0x6c666420, + // Block 0xc74, offset 0x31d00 + 0x31d00: 0x6c666620, 0x31d01: 0x6c666820, 0x31d02: 0x6c666a20, 0x31d03: 0x6c666c20, + 0x31d04: 0x6c666e20, 0x31d05: 0x6c667020, 0x31d06: 0x6c667220, 0x31d07: 0x6c667420, + 0x31d08: 0x6c667620, 0x31d09: 0x6c667820, 0x31d0a: 0x6c667a20, 0x31d0b: 0x6c667c20, + 0x31d0c: 0x6c667e20, 0x31d0d: 0x6c668020, 0x31d0e: 0x6c668220, 0x31d0f: 0x6c668420, + 0x31d10: 0x6c668620, 0x31d11: 0x6c668820, 0x31d12: 0x6c668a20, 0x31d13: 0x6c668c20, + 0x31d14: 0x6c668e20, 0x31d15: 0x6c669020, 0x31d16: 0x6c669220, 0x31d17: 0x6c669420, + 0x31d18: 0x6c669620, 0x31d19: 0x6c669820, 0x31d1a: 0x6c669a20, 0x31d1b: 0x6c669c20, + 0x31d1c: 0x6c669e20, 0x31d1d: 0x6c8cf820, 0x31d1e: 0x6c8cfa20, 0x31d1f: 0x6c8cfc20, + 0x31d20: 0x6c8cfe20, 0x31d21: 0x6c8d0020, 0x31d22: 0x6c8d0220, 0x31d23: 0x6c8d0420, + 0x31d24: 0x6c8d0620, 0x31d25: 0x6c8d0820, 0x31d26: 0x6c8d0a20, 0x31d27: 0x6c8d0c20, + 0x31d28: 0x6c8d0e20, 0x31d29: 0x6c8d1020, 0x31d2a: 0x6c8d1220, 0x31d2b: 0x6c8d1420, + 0x31d2c: 0x6c8d1620, 0x31d2d: 0x6c8d1820, 0x31d2e: 0x6c8d1a20, 0x31d2f: 0x6c8d1c20, + 0x31d30: 0x6c8d1e20, 0x31d31: 0x6c8d2020, 0x31d32: 0x6c8d2220, 0x31d33: 0x6c8d2420, + 0x31d34: 0x6c8d2620, 0x31d35: 0x6c8d2820, 0x31d36: 0x6c66a020, 0x31d37: 0x6c8d2a20, + 0x31d38: 0x6c8d2c20, 0x31d39: 0x6c8d2e20, 0x31d3a: 0x6c8d3020, 0x31d3b: 0x6c8d3220, + 0x31d3c: 0x6c8d3420, 0x31d3d: 0x6c8d3620, 0x31d3e: 0x6c8d3820, 0x31d3f: 0x6cb95a20, + // Block 0xc75, offset 0x31d40 + 0x31d40: 0x6cb95c20, 0x31d41: 0x6cb95e20, 0x31d42: 0x6cb96020, 0x31d43: 0x6cb96220, + 0x31d44: 0x6cb96420, 0x31d45: 0x6cb96620, 0x31d46: 0x6cb96820, 0x31d47: 0x6cb96a20, + 0x31d48: 0x6cb96c20, 0x31d49: 0x6cb96e20, 0x31d4a: 0x6cb97020, 0x31d4b: 0x6cb97220, + 0x31d4c: 0x6cb97420, 0x31d4d: 0x6cb97620, 0x31d4e: 0x6cb97820, 0x31d4f: 0x6cb97a20, + 0x31d50: 0x6cb97c20, 0x31d51: 0x6cb97e20, 0x31d52: 0x6cb98020, 0x31d53: 0x6cb98220, + 0x31d54: 0x6cb98420, 0x31d55: 0x6cb98620, 0x31d56: 0x6cb98820, 0x31d57: 0x6cb98a20, + 0x31d58: 0x6cb98c20, 0x31d59: 0x6cb98e20, 0x31d5a: 0x6cb99020, 0x31d5b: 0x6cb99220, + 0x31d5c: 0x6cd55e20, 0x31d5d: 0x6cb99420, 0x31d5e: 0x6cb99620, 0x31d5f: 0x6cb99820, + 0x31d60: 0x6cb99a20, 0x31d61: 0x6cb99c20, 0x31d62: 0x6cb99e20, 0x31d63: 0x6cb9a020, + 0x31d64: 0x6cb9a220, 0x31d65: 0x6cea5220, 0x31d66: 0x6cea5420, 0x31d67: 0x6cea5620, + 0x31d68: 0x6cea5820, 0x31d69: 0x6cea5a20, 0x31d6a: 0x6cea5c20, 0x31d6b: 0x6cea5e20, + 0x31d6c: 0x6cea6020, 0x31d6d: 0x6cea6220, 0x31d6e: 0x6cea6420, 0x31d6f: 0x6cea6620, + 0x31d70: 0x6cea6820, 0x31d71: 0x6cea6a20, 0x31d72: 0x6cea6c20, 0x31d73: 0x6cea6e20, + 0x31d74: 0x6cea7020, 0x31d75: 0x6cea7220, 0x31d76: 0x6cea7420, 0x31d77: 0x6cea7620, + 0x31d78: 0x6cea7820, 0x31d79: 0x6cea7a20, 0x31d7a: 0x6cea7c20, 0x31d7b: 0x6cea7e20, + 0x31d7c: 0x6cea8020, 0x31d7d: 0x6cea8220, 0x31d7e: 0x6cea8420, 0x31d7f: 0x6cea8620, + // Block 0xc76, offset 0x31d80 + 0x31d80: 0x6cea8820, 0x31d81: 0x6cea8a20, 0x31d82: 0x6d1a3020, 0x31d83: 0x6d1a3220, + 0x31d84: 0x6d1a3420, 0x31d85: 0x6d1a3620, 0x31d86: 0x6d1a3820, 0x31d87: 0x6d1a3a20, + 0x31d88: 0x6d1a3c20, 0x31d89: 0x6d1a3e20, 0x31d8a: 0x6d1a4020, 0x31d8b: 0x6d1a4220, + 0x31d8c: 0x6d1a4420, 0x31d8d: 0x6d1a4620, 0x31d8e: 0x6d1a4820, 0x31d8f: 0x6d1a4a20, + 0x31d90: 0x6d1a4c20, 0x31d91: 0x6d1a4e20, 0x31d92: 0x6d1a5020, 0x31d93: 0x6d1a5220, + 0x31d94: 0x6d1a5420, 0x31d95: 0x6d1a5620, 0x31d96: 0x6d1a5820, 0x31d97: 0x6d1a5a20, + 0x31d98: 0x6d1a5c20, 0x31d99: 0x6d1a5e20, 0x31d9a: 0x6d1a6020, 0x31d9b: 0x6d1a6220, + 0x31d9c: 0x6d1a6420, 0x31d9d: 0x6d1a6620, 0x31d9e: 0x6d1a6820, 0x31d9f: 0x6d1a6a20, + 0x31da0: 0x6d48ae20, 0x31da1: 0x6d1a6c20, 0x31da2: 0x6d1a6e20, 0x31da3: 0x6d1a7020, + 0x31da4: 0x6d1a7220, 0x31da5: 0x6d1a7420, 0x31da6: 0x6d48b020, 0x31da7: 0x6d48b220, + 0x31da8: 0x6d48b420, 0x31da9: 0x6d48b620, 0x31daa: 0x6d48b820, 0x31dab: 0x6d48ba20, + 0x31dac: 0x6d48bc20, 0x31dad: 0x6d48be20, 0x31dae: 0x6d48c020, 0x31daf: 0x6d48c220, + 0x31db0: 0x6d48c420, 0x31db1: 0x6d48c620, 0x31db2: 0x6d48c820, 0x31db3: 0x6d48ca20, + 0x31db4: 0x6d48cc20, 0x31db5: 0x6d48ce20, 0x31db6: 0x6d48d020, 0x31db7: 0x6d48d220, + 0x31db8: 0x6d48d420, 0x31db9: 0x6d48d620, 0x31dba: 0x6d76b420, 0x31dbb: 0x6d76b620, + 0x31dbc: 0x6d76b820, 0x31dbd: 0x6d76ba20, 0x31dbe: 0x6d76bc20, 0x31dbf: 0x6d76be20, + // Block 0xc77, offset 0x31dc0 + 0x31dc0: 0x6d76c020, 0x31dc1: 0x6d76c220, 0x31dc2: 0x6d76c420, 0x31dc3: 0x6d76c620, + 0x31dc4: 0x6d76c820, 0x31dc5: 0x6d76ca20, 0x31dc6: 0x6d76cc20, 0x31dc7: 0x6d76ce20, + 0x31dc8: 0x6d76d020, 0x31dc9: 0x6d76d220, 0x31dca: 0x6d76d420, 0x31dcb: 0x6d938220, + 0x31dcc: 0x6da03620, 0x31dcd: 0x6da03820, 0x31dce: 0x6da03a20, 0x31dcf: 0x6da03c20, + 0x31dd0: 0x6da03e20, 0x31dd1: 0x6da04020, 0x31dd2: 0x6da04220, 0x31dd3: 0x6da04420, + 0x31dd4: 0x6da04620, 0x31dd5: 0x6da04820, 0x31dd6: 0x6da04a20, 0x31dd7: 0x6da04c20, + 0x31dd8: 0x6da04e20, 0x31dd9: 0x6da05020, 0x31dda: 0x6da05220, 0x31ddb: 0x6dc2b820, + 0x31ddc: 0x6dc2ba20, 0x31ddd: 0x6dc2bc20, 0x31dde: 0x6dc2be20, 0x31ddf: 0x6dc2c020, + 0x31de0: 0x6dc2c220, 0x31de1: 0x6de05a20, 0x31de2: 0x6de05c20, 0x31de3: 0x6de05e20, + 0x31de4: 0x6df8a820, 0x31de5: 0x6e0c7620, 0x31de6: 0x6df8aa20, 0x31de7: 0x6df8ac20, + 0x31de8: 0x6df8ae20, 0x31de9: 0x6df8b020, 0x31dea: 0x6e0c7820, 0x31deb: 0x6e0c7a20, + 0x31dec: 0x6e0c7c20, 0x31ded: 0x6e0c7e20, 0x31dee: 0x6e286420, 0x31def: 0x6e319420, + 0x31df0: 0x6e3cec20, 0x31df1: 0x6e3cee20, 0x31df2: 0x6c016220, 0x31df3: 0x6c034020, + 0x31df4: 0x6c034220, 0x31df5: 0x6c034420, 0x31df6: 0x6c06ae20, 0x31df7: 0x6c06b020, + 0x31df8: 0x6c06b220, 0x31df9: 0x6c0d4c20, 0x31dfa: 0x6c0d4e20, 0x31dfb: 0x6c0d5020, + 0x31dfc: 0x6c0d5220, 0x31dfd: 0x6c0d5420, 0x31dfe: 0x6c0d5620, 0x31dff: 0x6c0d5820, + // Block 0xc78, offset 0x31e00 + 0x31e00: 0x6c0d5a20, 0x31e01: 0x6c0d5c20, 0x31e02: 0x6c185420, 0x31e03: 0x6c185620, + 0x31e04: 0x6c185820, 0x31e05: 0x6c185a20, 0x31e06: 0x6c185c20, 0x31e07: 0x6c185e20, + 0x31e08: 0x6c186020, 0x31e09: 0x6c186220, 0x31e0a: 0x6c186420, 0x31e0b: 0x6c186620, + 0x31e0c: 0x6c186820, 0x31e0d: 0x6c186a20, 0x31e0e: 0x6c186c20, 0x31e0f: 0x6c186e20, + 0x31e10: 0x6c187020, 0x31e11: 0x6c2b6820, 0x31e12: 0x6c2b6a20, 0x31e13: 0x6c2b6c20, + 0x31e14: 0x6c2b6e20, 0x31e15: 0x6c2b7020, 0x31e16: 0x6c2b7220, 0x31e17: 0x6c2b7420, + 0x31e18: 0x6c2b7620, 0x31e19: 0x6c2b7820, 0x31e1a: 0x6c2b7a20, 0x31e1b: 0x6c2b7c20, + 0x31e1c: 0x6c2b7e20, 0x31e1d: 0x6c2b8020, 0x31e1e: 0x6c456620, 0x31e1f: 0x6c456820, + 0x31e20: 0x6c456a20, 0x31e21: 0x6c456c20, 0x31e22: 0x6c456e20, 0x31e23: 0x6c457020, + 0x31e24: 0x6c457220, 0x31e25: 0x6c457420, 0x31e26: 0x6c457620, 0x31e27: 0x6c457820, + 0x31e28: 0x6c457a20, 0x31e29: 0x6c457c20, 0x31e2a: 0x6c457e20, 0x31e2b: 0x6c66b820, + 0x31e2c: 0x6c66ba20, 0x31e2d: 0x6c66bc20, 0x31e2e: 0x6c66be20, 0x31e2f: 0x6c66c020, + 0x31e30: 0x6c66c220, 0x31e31: 0x6c66c420, 0x31e32: 0x6c66c620, 0x31e33: 0x6c66c820, + 0x31e34: 0x6c66ca20, 0x31e35: 0x6c66cc20, 0x31e36: 0x6c66ce20, 0x31e37: 0x6c66d020, + 0x31e38: 0x6c66d220, 0x31e39: 0x6c66d420, 0x31e3a: 0x6c66d620, 0x31e3b: 0x6c8d5420, + 0x31e3c: 0x6c8d5620, 0x31e3d: 0x6c8d5820, 0x31e3e: 0x6c8d5a20, 0x31e3f: 0x6c8d5c20, + // Block 0xc79, offset 0x31e40 + 0x31e40: 0x6c8d5e20, 0x31e41: 0x6c8d6020, 0x31e42: 0x6c8d6220, 0x31e43: 0x6c8d6420, + 0x31e44: 0x6c8d6620, 0x31e45: 0x6cb9b420, 0x31e46: 0x6cb9b620, 0x31e47: 0x6cb9b820, + 0x31e48: 0x6cb9ba20, 0x31e49: 0x6cb9bc20, 0x31e4a: 0x6cb9be20, 0x31e4b: 0x6cb9c020, + 0x31e4c: 0x6cb9c220, 0x31e4d: 0x6cb9c420, 0x31e4e: 0x6cb9c620, 0x31e4f: 0x6cb9c820, + 0x31e50: 0x6cb9ca20, 0x31e51: 0x6cb9cc20, 0x31e52: 0x6cb9ce20, 0x31e53: 0x6ceaa420, + 0x31e54: 0x6ceaa620, 0x31e55: 0x6ceaa820, 0x31e56: 0x6ceaaa20, 0x31e57: 0x6ceaac20, + 0x31e58: 0x6ceaae20, 0x31e59: 0x6ceab020, 0x31e5a: 0x6ceab220, 0x31e5b: 0x6ceab420, + 0x31e5c: 0x6ceab620, 0x31e5d: 0x6ceab820, 0x31e5e: 0x6ceaba20, 0x31e5f: 0x6ceabc20, + 0x31e60: 0x6d1a8420, 0x31e61: 0x6d1a8620, 0x31e62: 0x6d1a8820, 0x31e63: 0x6d1a8a20, + 0x31e64: 0x6d1a8c20, 0x31e65: 0x6d1a8e20, 0x31e66: 0x6d1a9020, 0x31e67: 0x6d1a9220, + 0x31e68: 0x6d1a9420, 0x31e69: 0x6d1a9620, 0x31e6a: 0x6d1a9820, 0x31e6b: 0x6d1a9a20, + 0x31e6c: 0x6d1a9c20, 0x31e6d: 0x6d1a9e20, 0x31e6e: 0x6d1aa020, 0x31e6f: 0x6d1aa220, + 0x31e70: 0x6d48e420, 0x31e71: 0x6d48e620, 0x31e72: 0x6d48e820, 0x31e73: 0x6d48ea20, + 0x31e74: 0x6d48ec20, 0x31e75: 0x6d48ee20, 0x31e76: 0x6d76dc20, 0x31e77: 0x6d76de20, + 0x31e78: 0x6d76e020, 0x31e79: 0x6da06220, 0x31e7a: 0x6da06420, 0x31e7b: 0x6da06620, + 0x31e7c: 0x6da06820, 0x31e7d: 0x6da06a20, 0x31e7e: 0x6da06c20, 0x31e7f: 0x6da06e20, + // Block 0xc7a, offset 0x31e80 + 0x31e80: 0x6dc2c620, 0x31e81: 0x6dc2c820, 0x31e82: 0x6dc2ca20, 0x31e83: 0x6dc2cc20, + 0x31e84: 0x6de06220, 0x31e85: 0x6de06420, 0x31e86: 0x6df8b220, 0x31e87: 0x6e0c8020, + 0x31e88: 0x6e286620, 0x31e89: 0x6e286820, 0x31e8a: 0x6e384220, 0x31e8b: 0x6e46ae20, + 0x31e8c: 0x6c035620, 0x31e8d: 0x6c06be20, 0x31e8e: 0x6c06c020, 0x31e8f: 0x6c06c220, + 0x31e90: 0x6c06c420, 0x31e91: 0x6c0d6020, 0x31e92: 0x6c0d6220, 0x31e93: 0x6c0d6420, + 0x31e94: 0x6c187a20, 0x31e95: 0x6c187c20, 0x31e96: 0x6c187e20, 0x31e97: 0x6c188020, + 0x31e98: 0x6c2b8e20, 0x31e99: 0x6c2b9020, 0x31e9a: 0x6c2b9220, 0x31e9b: 0x6c2b9420, + 0x31e9c: 0x6c2b9620, 0x31e9d: 0x6c2b9820, 0x31e9e: 0x6c458420, 0x31e9f: 0x6c458620, + 0x31ea0: 0x6c458820, 0x31ea1: 0x6c458a20, 0x31ea2: 0x6c458c20, 0x31ea3: 0x6c458e20, + 0x31ea4: 0x6c66e020, 0x31ea5: 0x6c66e220, 0x31ea6: 0x6c66e420, 0x31ea7: 0x6c66e620, + 0x31ea8: 0x6c66e820, 0x31ea9: 0x6c66ea20, 0x31eaa: 0x6c66ec20, 0x31eab: 0x6c66ee20, + 0x31eac: 0x6c66f020, 0x31ead: 0x6c66f220, 0x31eae: 0x6c8d7020, 0x31eaf: 0x6c8d7220, + 0x31eb0: 0x6c8d7420, 0x31eb1: 0x6c8d7620, 0x31eb2: 0x6c8d7820, 0x31eb3: 0x6c8d7a20, + 0x31eb4: 0x6c8d7c20, 0x31eb5: 0x6cb9da20, 0x31eb6: 0x6cb9dc20, 0x31eb7: 0x6cb9de20, + 0x31eb8: 0x6ceac420, 0x31eb9: 0x6ceac620, 0x31eba: 0x6ceac820, 0x31ebb: 0x6ceaca20, + 0x31ebc: 0x6ceacc20, 0x31ebd: 0x6d1aa820, 0x31ebe: 0x6d1aaa20, 0x31ebf: 0x6d1aac20, + // Block 0xc7b, offset 0x31ec0 + 0x31ec0: 0x6d1aae20, 0x31ec1: 0x6d1ab020, 0x31ec2: 0x6d1ab220, 0x31ec3: 0x6d48f420, + 0x31ec4: 0x6d76e220, 0x31ec5: 0x6d76e420, 0x31ec6: 0x6d76e620, 0x31ec7: 0x6d76e820, + 0x31ec8: 0x6da07020, 0x31ec9: 0x6da07220, 0x31eca: 0x6da07420, 0x31ecb: 0x6df8b420, + 0x31ecc: 0x6df8b620, 0x31ecd: 0x6df8b820, 0x31ece: 0x6c00ae20, 0x31ecf: 0x6c035c20, + 0x31ed0: 0x6c06c820, 0x31ed1: 0x6c188220, 0x31ed2: 0x6c188420, 0x31ed3: 0x6c188620, + 0x31ed4: 0x6c188820, 0x31ed5: 0x6c188a20, 0x31ed6: 0x6c2b9c20, 0x31ed7: 0x6c459020, + 0x31ed8: 0x6c459220, 0x31ed9: 0x6c459420, 0x31eda: 0x6c459620, 0x31edb: 0x6c459820, + 0x31edc: 0x6c459a20, 0x31edd: 0x6c459c20, 0x31ede: 0x6c66f420, 0x31edf: 0x6c66f620, + 0x31ee0: 0x6c66f820, 0x31ee1: 0x6c66fa20, 0x31ee2: 0x6c63d420, 0x31ee3: 0x6cb9e020, + 0x31ee4: 0x6cb9e220, 0x31ee5: 0x6ceace20, 0x31ee6: 0x6d1ab420, 0x31ee7: 0x6d1ab620, + 0x31ee8: 0x6d1ab820, 0x31ee9: 0x6da07620, 0x31eea: 0x6dc2ce20, 0x31eeb: 0x6dea7420, + 0x31eec: 0x6c00b220, 0x31eed: 0x6c035e20, 0x31eee: 0x6c0d7020, 0x31eef: 0x6c0d7220, + 0x31ef0: 0x6c0d7420, 0x31ef1: 0x6c0d7620, 0x31ef2: 0x6c0d7a20, 0x31ef3: 0x6c189620, + 0x31ef4: 0x6c189820, 0x31ef5: 0x6c189a20, 0x31ef6: 0x6c189c20, 0x31ef7: 0x6c189e20, + 0x31ef8: 0x6c2ba020, 0x31ef9: 0x6c2ba220, 0x31efa: 0x6c2ba420, 0x31efb: 0x6c2ba620, + 0x31efc: 0x6c45a620, 0x31efd: 0x6c45a820, 0x31efe: 0x6c45aa20, 0x31eff: 0x6c45ac20, + // Block 0xc7c, offset 0x31f00 + 0x31f00: 0x6c45ae20, 0x31f01: 0x6c45b020, 0x31f02: 0x6c45b220, 0x31f03: 0x6c45c220, + 0x31f04: 0x6c45b420, 0x31f05: 0x6c45b620, 0x31f06: 0x6c45b820, 0x31f07: 0x6c45ba20, + 0x31f08: 0x6c45bc20, 0x31f09: 0x6c670220, 0x31f0a: 0x6c670420, 0x31f0b: 0x6c670620, + 0x31f0c: 0x6c670820, 0x31f0d: 0x6c670a20, 0x31f0e: 0x6c8d8e20, 0x31f0f: 0x6c8d9020, + 0x31f10: 0x6cb9e420, 0x31f11: 0x6cb9e620, 0x31f12: 0x6cb9e820, 0x31f13: 0x6cb9ea20, + 0x31f14: 0x6cb9ec20, 0x31f15: 0x6cb9ee20, 0x31f16: 0x6ceada20, 0x31f17: 0x6ceadc20, + 0x31f18: 0x6ceade20, 0x31f19: 0x6d1ac220, 0x31f1a: 0x6d1ac420, 0x31f1b: 0x6d1ac620, + 0x31f1c: 0x6d48f820, 0x31f1d: 0x6d48fa20, 0x31f1e: 0x6d48fc20, 0x31f1f: 0x6d48fe20, + 0x31f20: 0x6d490020, 0x31f21: 0x6d490220, 0x31f22: 0x6d76ec20, 0x31f23: 0x6d76ee20, + 0x31f24: 0x6dc2d020, 0x31f25: 0x6dc2d220, 0x31f26: 0x6de06a20, 0x31f27: 0x6de06c20, + 0x31f28: 0x6df8bc20, 0x31f29: 0x6df8be20, 0x31f2a: 0x6e1c2420, 0x31f2b: 0x6e3cf220, + 0x31f2c: 0x6e451420, 0x31f2d: 0x6c036420, 0x31f2e: 0x6c0d7c20, 0x31f2f: 0x6c0d7e20, + 0x31f30: 0x6c18a820, 0x31f31: 0x6c18aa20, 0x31f32: 0x6c18ac20, 0x31f33: 0x6c2baa20, + 0x31f34: 0x6c45c420, 0x31f35: 0x6c45c620, 0x31f36: 0x6c670e20, 0x31f37: 0x6d1aca20, + 0x31f38: 0x6df8c220, 0x31f39: 0x6e1c2620, 0x31f3a: 0x6e1c2820, 0x31f3b: 0x6c037020, + 0x31f3c: 0x6c037220, 0x31f3d: 0x6c06da20, 0x31f3e: 0x6c06dc20, 0x31f3f: 0x6c037420, + // Block 0xc7d, offset 0x31f40 + 0x31f40: 0x6c06de20, 0x31f41: 0x6c06e020, 0x31f42: 0x6c0d8e20, 0x31f43: 0x6c0d9020, + 0x31f44: 0x6c0d9220, 0x31f45: 0x6c0d9420, 0x31f46: 0x6c0d9620, 0x31f47: 0x6c0d9820, + 0x31f48: 0x6c0d9a20, 0x31f49: 0x6c0d9c20, 0x31f4a: 0x6c0d9e20, 0x31f4b: 0x6c0da020, + 0x31f4c: 0x6c0da220, 0x31f4d: 0x6c0da420, 0x31f4e: 0x6c0da620, 0x31f4f: 0x6c0da820, + 0x31f50: 0x6c0daa20, 0x31f51: 0x6c18ae20, 0x31f52: 0x6c18b020, 0x31f53: 0x6c18b220, + 0x31f54: 0x6c18b420, 0x31f55: 0x6c18b620, 0x31f56: 0x6c18b820, 0x31f57: 0x6c18ba20, + 0x31f58: 0x6c2bba20, 0x31f59: 0x6c2bbc20, 0x31f5a: 0x6c2bbe20, 0x31f5b: 0x6c2bc020, + 0x31f5c: 0x6c2bc220, 0x31f5d: 0x6c2bc420, 0x31f5e: 0x6c2bc620, 0x31f5f: 0x6c2bc820, + 0x31f60: 0x6c2bca20, 0x31f61: 0x6c2bcc20, 0x31f62: 0x6c2bce20, 0x31f63: 0x6c671020, + 0x31f64: 0x6c671220, 0x31f65: 0x6c671420, 0x31f66: 0x6c671620, 0x31f67: 0x6c671820, + 0x31f68: 0x6c671a20, 0x31f69: 0x6c671c20, 0x31f6a: 0x6c8d9a20, 0x31f6b: 0x6c8d9c20, + 0x31f6c: 0x6c8d9e20, 0x31f6d: 0x6c8da020, 0x31f6e: 0x6c8da220, 0x31f6f: 0x6c8da420, + 0x31f70: 0x6cb9f420, 0x31f71: 0x6cb9f620, 0x31f72: 0x6cb9f820, 0x31f73: 0x6cb9fa20, + 0x31f74: 0x6ceae220, 0x31f75: 0x6ceae420, 0x31f76: 0x6ceae620, 0x31f77: 0x6ceae820, + 0x31f78: 0x6ceaea20, 0x31f79: 0x6ceaec20, 0x31f7a: 0x6ceaee20, 0x31f7b: 0x6ceaf020, + 0x31f7c: 0x6ceaf220, 0x31f7d: 0x6d1acc20, 0x31f7e: 0x6d1ace20, 0x31f7f: 0x6d1ad020, + // Block 0xc7e, offset 0x31f80 + 0x31f80: 0x6d490420, 0x31f81: 0x6d490620, 0x31f82: 0x6d490820, 0x31f83: 0x6d490a20, + 0x31f84: 0x6d490c20, 0x31f85: 0x6da07a20, 0x31f86: 0x6da07c20, 0x31f87: 0x6da07e20, + 0x31f88: 0x6da08020, 0x31f89: 0x6dc2d420, 0x31f8a: 0x6dc2d620, 0x31f8b: 0x6dc2d820, + 0x31f8c: 0x6dc2da20, 0x31f8d: 0x6dc2dc20, 0x31f8e: 0x6de06e20, 0x31f8f: 0x6e0c8620, + 0x31f90: 0x6e384420, 0x31f91: 0x6e3cf420, 0x31f92: 0x6c016c20, 0x31f93: 0x6c06ea20, + 0x31f94: 0x6c0dae20, 0x31f95: 0x6c0db020, 0x31f96: 0x6c0db220, 0x31f97: 0x6c0db420, + 0x31f98: 0x6c0db620, 0x31f99: 0x6c18c420, 0x31f9a: 0x6c18c620, 0x31f9b: 0x6c18c820, + 0x31f9c: 0x6c18ca20, 0x31f9d: 0x6c161a20, 0x31f9e: 0x6c2bdc20, 0x31f9f: 0x6c2bde20, + 0x31fa0: 0x6c2be020, 0x31fa1: 0x6c2be220, 0x31fa2: 0x6c2be420, 0x31fa3: 0x6c2be620, + 0x31fa4: 0x6c2be820, 0x31fa5: 0x6c2bea20, 0x31fa6: 0x6c2bec20, 0x31fa7: 0x6c2bee20, + 0x31fa8: 0x6c2bf020, 0x31fa9: 0x6c45ce20, 0x31faa: 0x6c45d020, 0x31fab: 0x6c45d220, + 0x31fac: 0x6c45d420, 0x31fad: 0x6c45d620, 0x31fae: 0x6c45d820, 0x31faf: 0x6c45da20, + 0x31fb0: 0x6c45dc20, 0x31fb1: 0x6c45de20, 0x31fb2: 0x6c45e020, 0x31fb3: 0x6c672020, + 0x31fb4: 0x6c672220, 0x31fb5: 0x6c672420, 0x31fb6: 0x6c672620, 0x31fb7: 0x6c672820, + 0x31fb8: 0x6cb78420, 0x31fb9: 0x6c672a20, 0x31fba: 0x6c8daa20, 0x31fbb: 0x6c8dac20, + 0x31fbc: 0x6c8dae20, 0x31fbd: 0x6c8db020, 0x31fbe: 0x6c8db220, 0x31fbf: 0x6c8db420, + // Block 0xc7f, offset 0x31fc0 + 0x31fc0: 0x6cb9fc20, 0x31fc1: 0x6cb9fe20, 0x31fc2: 0x6cba0020, 0x31fc3: 0x6cbd9e20, + 0x31fc4: 0x6cba0220, 0x31fc5: 0x6ceaf620, 0x31fc6: 0x6d1ad420, 0x31fc7: 0x6d1ad620, + 0x31fc8: 0x6d491220, 0x31fc9: 0x6d491420, 0x31fca: 0x6d491620, 0x31fcb: 0x6e400820, + 0x31fcc: 0x6e467a20, 0x31fcd: 0x6c037e20, 0x31fce: 0x6c038020, 0x31fcf: 0x6c038220, + 0x31fd0: 0x6c038420, 0x31fd1: 0x6c06f220, 0x31fd2: 0x6c0dbc20, 0x31fd3: 0x6c0dbe20, + 0x31fd4: 0x6c0dc020, 0x31fd5: 0x6c0dc220, 0x31fd6: 0x6c0dc420, 0x31fd7: 0x6c0dc620, + 0x31fd8: 0x6c18da20, 0x31fd9: 0x6c45ea20, 0x31fda: 0x6c45ec20, 0x31fdb: 0x6c45ee20, + 0x31fdc: 0x6c45f020, 0x31fdd: 0x6c45f220, 0x31fde: 0x6c672e20, 0x31fdf: 0x6cba0420, + 0x31fe0: 0x6cba0620, 0x31fe1: 0x6cba0820, 0x31fe2: 0x6ceafc20, 0x31fe3: 0x6ceafe20, + 0x31fe4: 0x6ceb0020, 0x31fe5: 0x6d1ada20, 0x31fe6: 0x6da08420, 0x31fe7: 0x6dc2e020, + 0x31fe8: 0x6dc2e220, 0x31fe9: 0x6dc2e420, 0x31fea: 0x6dc2e620, 0x31feb: 0x6e3cf620, + 0x31fec: 0x6c038e20, 0x31fed: 0x6c06fa20, 0x31fee: 0x6c06fc20, 0x31fef: 0x6c06fe20, + 0x31ff0: 0x6c070020, 0x31ff1: 0x6c070220, 0x31ff2: 0x6c070420, 0x31ff3: 0x6c070620, + 0x31ff4: 0x6c0dda20, 0x31ff5: 0x6c0ddc20, 0x31ff6: 0x6c0dde20, 0x31ff7: 0x6c0de020, + 0x31ff8: 0x6c0de220, 0x31ff9: 0x6c0de420, 0x31ffa: 0x6c0de620, 0x31ffb: 0x6c0de820, + 0x31ffc: 0x6c0dea20, 0x31ffd: 0x6c0dec20, 0x31ffe: 0x6c0dee20, 0x31fff: 0x6c0df020, + // Block 0xc80, offset 0x32000 + 0x32000: 0x6c18ec20, 0x32001: 0x6c18ee20, 0x32002: 0x6c18f020, 0x32003: 0x6c18f220, + 0x32004: 0x6c18f420, 0x32005: 0x6c18f620, 0x32006: 0x6c18f820, 0x32007: 0x6c18fa20, + 0x32008: 0x6c18fc20, 0x32009: 0x6c18fe20, 0x3200a: 0x6c2c0c20, 0x3200b: 0x6c2c0e20, + 0x3200c: 0x6c2c1020, 0x3200d: 0x6c2c1220, 0x3200e: 0x6c2c1420, 0x3200f: 0x6c2c1620, + 0x32010: 0x6c2c1820, 0x32011: 0x6c2c1a20, 0x32012: 0x6c2c1c20, 0x32013: 0x6c2c1e20, + 0x32014: 0x6c2c2020, 0x32015: 0x6c2c2220, 0x32016: 0x6c2a5a20, 0x32017: 0x6c460420, + 0x32018: 0x6c460620, 0x32019: 0x6c460820, 0x3201a: 0x6c460a20, 0x3201b: 0x6c460c20, + 0x3201c: 0x6c460e20, 0x3201d: 0x6c461020, 0x3201e: 0x6c461220, 0x3201f: 0x6c461420, + 0x32020: 0x6c461620, 0x32021: 0x6c461820, 0x32022: 0x6c461a20, 0x32023: 0x6c461c20, + 0x32024: 0x6c461e20, 0x32025: 0x6c462020, 0x32026: 0x6c462220, 0x32027: 0x6c674220, + 0x32028: 0x6c674420, 0x32029: 0x6c674620, 0x3202a: 0x6c674820, 0x3202b: 0x6c674a20, + 0x3202c: 0x6c674c20, 0x3202d: 0x6c674e20, 0x3202e: 0x6c675020, 0x3202f: 0x6c675220, + 0x32030: 0x6c675420, 0x32031: 0x6c675620, 0x32032: 0x6c675820, 0x32033: 0x6c675a20, + 0x32034: 0x6c675c20, 0x32035: 0x6c675e20, 0x32036: 0x6c676020, 0x32037: 0x6c676220, + 0x32038: 0x6c8dc220, 0x32039: 0x6c8dc420, 0x3203a: 0x6c8dc620, 0x3203b: 0x6c8dc820, + 0x3203c: 0x6c8dca20, 0x3203d: 0x6c8dcc20, 0x3203e: 0x6c8dce20, 0x3203f: 0x6ceb0820, + // Block 0xc81, offset 0x32040 + 0x32040: 0x6c8dd020, 0x32041: 0x6c8dd220, 0x32042: 0x6c8dd420, 0x32043: 0x6c8dd620, + 0x32044: 0x6c8dd820, 0x32045: 0x6c8dda20, 0x32046: 0x6c8ddc20, 0x32047: 0x6cba1620, + 0x32048: 0x6cba1820, 0x32049: 0x6cba1a20, 0x3204a: 0x6cba1c20, 0x3204b: 0x6cba1e20, + 0x3204c: 0x6cba2020, 0x3204d: 0x6cba2220, 0x3204e: 0x6cba2420, 0x3204f: 0x6cba2620, + 0x32050: 0x6cba2820, 0x32051: 0x6ceb0a20, 0x32052: 0x6ceb0c20, 0x32053: 0x6ceb0e20, + 0x32054: 0x6ceb1020, 0x32055: 0x6ceb1220, 0x32056: 0x6ceb1420, 0x32057: 0x6ceb1620, + 0x32058: 0x6ceb1820, 0x32059: 0x6d1ae820, 0x3205a: 0x6d1aea20, 0x3205b: 0x6d1aec20, + 0x3205c: 0x6d1aee20, 0x3205d: 0x6d1af020, 0x3205e: 0x6d1af220, 0x3205f: 0x6d1af420, + 0x32060: 0x6d1af620, 0x32061: 0x6d1af820, 0x32062: 0x6d1afa20, 0x32063: 0x6d1afc20, + 0x32064: 0x6d1afe20, 0x32065: 0x6d1b0020, 0x32066: 0x6d1b0220, 0x32067: 0x6d1b0420, + 0x32068: 0x6d1b0620, 0x32069: 0x6d1b0820, 0x3206a: 0x6d1b0a20, 0x3206b: 0x6d1b0c20, + 0x3206c: 0x6d1b0e20, 0x3206d: 0x6d491e20, 0x3206e: 0x6d492020, 0x3206f: 0x6d492220, + 0x32070: 0x6d492420, 0x32071: 0x6d492620, 0x32072: 0x6d492820, 0x32073: 0x6d492a20, + 0x32074: 0x6d492c20, 0x32075: 0x6d492e20, 0x32076: 0x6d493020, 0x32077: 0x6d493220, + 0x32078: 0x6d493420, 0x32079: 0x6d5ad220, 0x3207a: 0x6d76f020, 0x3207b: 0x6d76f220, + 0x3207c: 0x6d76f420, 0x3207d: 0x6d76f620, 0x3207e: 0x6d76f820, 0x3207f: 0x6da08a20, + // Block 0xc82, offset 0x32080 + 0x32080: 0x6dc2e820, 0x32081: 0x6dc2ea20, 0x32082: 0x6dc2ec20, 0x32083: 0x6dc2ee20, + 0x32084: 0x6dc2f020, 0x32085: 0x6dc2f220, 0x32086: 0x6dc2f420, 0x32087: 0x6df8c620, + 0x32088: 0x6dfbb620, 0x32089: 0x6e0c8820, 0x3208a: 0x6e0c8a20, 0x3208b: 0x6e1c2a20, + 0x3208c: 0x6e286a20, 0x3208d: 0x6e286c20, 0x3208e: 0x6e286e20, 0x3208f: 0x6e319820, + 0x32090: 0x6e442420, 0x32091: 0x6e462220, 0x32092: 0x6e467c20, 0x32093: 0x6c017620, + 0x32094: 0x6c017820, 0x32095: 0x6c017a20, 0x32096: 0x6c017c20, 0x32097: 0x6c039820, + 0x32098: 0x6c039a20, 0x32099: 0x6c071020, 0x3209a: 0x6c071220, 0x3209b: 0x6c071420, + 0x3209c: 0x6c071620, 0x3209d: 0x6c071820, 0x3209e: 0x6c0df620, 0x3209f: 0x6c0df820, + 0x320a0: 0x6c0dfa20, 0x320a1: 0x6c0dfc20, 0x320a2: 0x6c0dfe20, 0x320a3: 0x6c0e0020, + 0x320a4: 0x6c0e0220, 0x320a5: 0x6c0e0420, 0x320a6: 0x6c190620, 0x320a7: 0x6c190820, + 0x320a8: 0x6c190a20, 0x320a9: 0x6c2c2e20, 0x320aa: 0x6c2c3020, 0x320ab: 0x6c2c3220, + 0x320ac: 0x6c2c3420, 0x320ad: 0x6c2c3620, 0x320ae: 0x6c2ab020, 0x320af: 0x6c2c3820, + 0x320b0: 0x6c462c20, 0x320b1: 0x6c462e20, 0x320b2: 0x6c463020, 0x320b3: 0x6c464a20, + 0x320b4: 0x6c463220, 0x320b5: 0x6c463420, 0x320b6: 0x6c463620, 0x320b7: 0x6c463820, + 0x320b8: 0x6c463a20, 0x320b9: 0x6c677220, 0x320ba: 0x6c677420, 0x320bb: 0x6c677620, + 0x320bc: 0x6c677820, 0x320bd: 0x6c8dea20, 0x320be: 0x6c8dec20, 0x320bf: 0x6cba3020, + // Block 0xc83, offset 0x320c0 + 0x320c0: 0x6cba3220, 0x320c1: 0x6cba3420, 0x320c2: 0x6cba3620, 0x320c3: 0x6cba3820, + 0x320c4: 0x6cba3a20, 0x320c5: 0x6cba3c20, 0x320c6: 0x6ceb2220, 0x320c7: 0x6ceb2420, + 0x320c8: 0x6ceb2620, 0x320c9: 0x6ceb2820, 0x320ca: 0x6ceb2a20, 0x320cb: 0x6ceb2c20, + 0x320cc: 0x6ceb2e20, 0x320cd: 0x6d1b1820, 0x320ce: 0x6d1b1a20, 0x320cf: 0x6d1b1c20, + 0x320d0: 0x6d1b1e20, 0x320d1: 0x6d493e20, 0x320d2: 0x6d494020, 0x320d3: 0x6d76fa20, + 0x320d4: 0x6de07220, 0x320d5: 0x6da08e20, 0x320d6: 0x6da09020, 0x320d7: 0x6da09220, + 0x320d8: 0x6de07420, 0x320d9: 0x6de07620, 0x320da: 0x6c03aa20, 0x320db: 0x6c03ac20, + 0x320dc: 0x6c03ae20, 0x320dd: 0x6c03b020, 0x320de: 0x6c03b220, 0x320df: 0x6c03b420, + 0x320e0: 0x6c03b620, 0x320e1: 0x6c072020, 0x320e2: 0x6c072220, 0x320e3: 0x6c072420, + 0x320e4: 0x6c072620, 0x320e5: 0x6c072820, 0x320e6: 0x6c072a20, 0x320e7: 0x6c072c20, + 0x320e8: 0x6c072e20, 0x320e9: 0x6c0e0a20, 0x320ea: 0x6c0e0c20, 0x320eb: 0x6c0e0e20, + 0x320ec: 0x6c0e1020, 0x320ed: 0x6c0e1220, 0x320ee: 0x6c0e1420, 0x320ef: 0x6c0e1620, + 0x320f0: 0x6c0e1820, 0x320f1: 0x6c191020, 0x320f2: 0x6c191220, 0x320f3: 0x6c191420, + 0x320f4: 0x6c191620, 0x320f5: 0x6c191820, 0x320f6: 0x6c191a20, 0x320f7: 0x6c191c20, + 0x320f8: 0x6c191e20, 0x320f9: 0x6c2c4620, 0x320fa: 0x6c2c4820, 0x320fb: 0x6c2c4a20, + 0x320fc: 0x6c2c4c20, 0x320fd: 0x6c2c4e20, 0x320fe: 0x6c2c5020, 0x320ff: 0x6c464c20, + // Block 0xc84, offset 0x32100 + 0x32100: 0x6c464e20, 0x32101: 0x6c465020, 0x32102: 0x6c465220, 0x32103: 0x6c465420, + 0x32104: 0x6c465620, 0x32105: 0x6c465820, 0x32106: 0x6c465a20, 0x32107: 0x6c465c20, + 0x32108: 0x6c465e20, 0x32109: 0x6c45e220, 0x3210a: 0x6c678020, 0x3210b: 0x6c678220, + 0x3210c: 0x6c678420, 0x3210d: 0x6c678620, 0x3210e: 0x6c678820, 0x3210f: 0x6c678a20, + 0x32110: 0x6c678c20, 0x32111: 0x6c678e20, 0x32112: 0x6c679020, 0x32113: 0x6c679220, + 0x32114: 0x6c679420, 0x32115: 0x6c8df020, 0x32116: 0x6c8df220, 0x32117: 0x6c8df420, + 0x32118: 0x6c8df620, 0x32119: 0x6c8df820, 0x3211a: 0x6c8dfa20, 0x3211b: 0x6c8dfc20, + 0x3211c: 0x6c8dfe20, 0x3211d: 0x6c8e0020, 0x3211e: 0x6c8e0220, 0x3211f: 0x6c8e0420, + 0x32120: 0x6c8e0620, 0x32121: 0x6c8e0820, 0x32122: 0x6c8e0a20, 0x32123: 0x6c8e0c20, + 0x32124: 0x6c8e0e20, 0x32125: 0x6cba4420, 0x32126: 0x6cba4620, 0x32127: 0x6cba4820, + 0x32128: 0x6cba4a20, 0x32129: 0x6cba4c20, 0x3212a: 0x6cba4e20, 0x3212b: 0x6cba5020, + 0x3212c: 0x6cba5220, 0x3212d: 0x6cba5420, 0x3212e: 0x6cba5620, 0x3212f: 0x6ceb3620, + 0x32130: 0x6ceb3820, 0x32131: 0x6ceb3a20, 0x32132: 0x6ceb3c20, 0x32133: 0x6ceb3e20, + 0x32134: 0x6ceb4020, 0x32135: 0x6ceb4220, 0x32136: 0x6cee5e20, 0x32137: 0x6ceb4420, + 0x32138: 0x6ceb4620, 0x32139: 0x6ceb4820, 0x3213a: 0x6ceb4a20, 0x3213b: 0x6d19d820, + 0x3213c: 0x6d1b2220, 0x3213d: 0x6d1b2420, 0x3213e: 0x6d1b2620, 0x3213f: 0x6d1b2820, + // Block 0xc85, offset 0x32140 + 0x32140: 0x6d1b2a20, 0x32141: 0x6d1b2c20, 0x32142: 0x6d1b2e20, 0x32143: 0x6d494420, + 0x32144: 0x6d494620, 0x32145: 0x6d494820, 0x32146: 0x6d494a20, 0x32147: 0x6d76fe20, + 0x32148: 0x6d770020, 0x32149: 0x6d770220, 0x3214a: 0x6d770420, 0x3214b: 0x6d770620, + 0x3214c: 0x6d770820, 0x3214d: 0x6da09420, 0x3214e: 0x6da09620, 0x3214f: 0x6da09820, + 0x32150: 0x6dc2f820, 0x32151: 0x6de07a20, 0x32152: 0x6de07c20, 0x32153: 0x6e0c8c20, + 0x32154: 0x6e0c8e20, 0x32155: 0x6e1c2c20, 0x32156: 0x6e287020, 0x32157: 0x6e319a20, + 0x32158: 0x6e319c20, 0x32159: 0x6c03bc20, 0x3215a: 0x6c03be20, 0x3215b: 0x6c03c020, + 0x3215c: 0x6c03c220, 0x3215d: 0x6c03c420, 0x3215e: 0x6c03c620, 0x3215f: 0x6c076e20, + 0x32160: 0x6c077020, 0x32161: 0x6c077220, 0x32162: 0x6c077420, 0x32163: 0x6c077620, + 0x32164: 0x6c077820, 0x32165: 0x6c077a20, 0x32166: 0x6c077c20, 0x32167: 0x6c077e20, + 0x32168: 0x6c078020, 0x32169: 0x6c078220, 0x3216a: 0x6c078420, 0x3216b: 0x6c0e5420, + 0x3216c: 0x6c0e5620, 0x3216d: 0x6c0e5820, 0x3216e: 0x6c0e5a20, 0x3216f: 0x6c0e5c20, + 0x32170: 0x6c0e5e20, 0x32171: 0x6c0e6020, 0x32172: 0x6c0e6220, 0x32173: 0x6c0e6420, + 0x32174: 0x6c0e6620, 0x32175: 0x6c0e6820, 0x32176: 0x6c0e6a20, 0x32177: 0x6c0e6c20, + 0x32178: 0x6c0e6e20, 0x32179: 0x6c0e7020, 0x3217a: 0x6c0e7220, 0x3217b: 0x6c0e7420, + 0x3217c: 0x6c0e7620, 0x3217d: 0x6c0e7820, 0x3217e: 0x6c0e7a20, 0x3217f: 0x6c0e7c20, + // Block 0xc86, offset 0x32180 + 0x32180: 0x6c0e7e20, 0x32181: 0x6c0e8020, 0x32182: 0x6c0e8220, 0x32183: 0x6c0e8420, + 0x32184: 0x6c0e8620, 0x32185: 0x6c0e8820, 0x32186: 0x6c0e8a20, 0x32187: 0x6c0e8c20, + 0x32188: 0x6c0e8e20, 0x32189: 0x6c0e9020, 0x3218a: 0x6c0e9220, 0x3218b: 0x6c19ca20, + 0x3218c: 0x6c19cc20, 0x3218d: 0x6c19ce20, 0x3218e: 0x6c19d020, 0x3218f: 0x6c19d220, + 0x32190: 0x6c19d420, 0x32191: 0x6c19d620, 0x32192: 0x6c19d820, 0x32193: 0x6c19da20, + 0x32194: 0x6c19dc20, 0x32195: 0x6c19de20, 0x32196: 0x6c19e020, 0x32197: 0x6c19e220, + 0x32198: 0x6c19e420, 0x32199: 0x6c19e620, 0x3219a: 0x6c19e820, 0x3219b: 0x6c19ea20, + 0x3219c: 0x6c19ec20, 0x3219d: 0x6c19ee20, 0x3219e: 0x6c19f020, 0x3219f: 0x6c19f220, + 0x321a0: 0x6c19f420, 0x321a1: 0x6c19f620, 0x321a2: 0x6c19f820, 0x321a3: 0x6c19fa20, + 0x321a4: 0x6c19fc20, 0x321a5: 0x6c19fe20, 0x321a6: 0x6c1a0020, 0x321a7: 0x6c1a0220, + 0x321a8: 0x6c1a0420, 0x321a9: 0x6c1a0620, 0x321aa: 0x6c1a0820, 0x321ab: 0x6c1a0a20, + 0x321ac: 0x6c1a0c20, 0x321ad: 0x6c1a0e20, 0x321ae: 0x6c1a1020, 0x321af: 0x6c1a1220, + 0x321b0: 0x6c1a1420, 0x321b1: 0x6c1a1620, 0x321b2: 0x6c1a1820, 0x321b3: 0x6c1a1a20, + 0x321b4: 0x6c1a1c20, 0x321b5: 0x6c1a1e20, 0x321b6: 0x6c1a2020, 0x321b7: 0x6c1a2220, + 0x321b8: 0x6c1a2420, 0x321b9: 0x6c1a2620, 0x321ba: 0x6c1a2820, 0x321bb: 0x6c1a2a20, + 0x321bc: 0x6c1a2c20, 0x321bd: 0x6c1a2e20, 0x321be: 0x6c1a3020, 0x321bf: 0x6c1a3220, + // Block 0xc87, offset 0x321c0 + 0x321c0: 0x6c1a3420, 0x321c1: 0x6c1a3620, 0x321c2: 0x6c1a3820, 0x321c3: 0x6c1a3a20, + 0x321c4: 0x6c1a3c20, 0x321c5: 0x6c1a3e20, 0x321c6: 0x6c1a4020, 0x321c7: 0x6c1a4220, + 0x321c8: 0x6c2ce620, 0x321c9: 0x6c2ce820, 0x321ca: 0x6c2cea20, 0x321cb: 0x6c2cec20, + 0x321cc: 0x6c2cee20, 0x321cd: 0x6c2cf020, 0x321ce: 0x6c2cf220, 0x321cf: 0x6c2cf420, + 0x321d0: 0x6c2cf620, 0x321d1: 0x6c2cf820, 0x321d2: 0x6c2cfa20, 0x321d3: 0x6c2cfc20, + 0x321d4: 0x6c2cfe20, 0x321d5: 0x6c2d0020, 0x321d6: 0x6c2d0220, 0x321d7: 0x6c2d0420, + 0x321d8: 0x6c2d0620, 0x321d9: 0x6c2d0820, 0x321da: 0x6c2d0a20, 0x321db: 0x6c2d0c20, + 0x321dc: 0x6c2d0e20, 0x321dd: 0x6c2d1020, 0x321de: 0x6c2d1220, 0x321df: 0x6c2d1420, + 0x321e0: 0x6c2d1620, 0x321e1: 0x6c2d1820, 0x321e2: 0x6c2d1a20, 0x321e3: 0x6c2d1c20, + 0x321e4: 0x6c2d1e20, 0x321e5: 0x6c2d2020, 0x321e6: 0x6c2d2220, 0x321e7: 0x6c2d2420, + 0x321e8: 0x6c2d2620, 0x321e9: 0x6c2d2820, 0x321ea: 0x6c2d2a20, 0x321eb: 0x6c2d2c20, + 0x321ec: 0x6c2d2e20, 0x321ed: 0x6c2d3020, 0x321ee: 0x6c2d3220, 0x321ef: 0x6c2d3420, + 0x321f0: 0x6c2d3620, 0x321f1: 0x6c2d3820, 0x321f2: 0x6c2d3a20, 0x321f3: 0x6c2d3c20, + 0x321f4: 0x6c2d3e20, 0x321f5: 0x6c2d4020, 0x321f6: 0x6c2d4220, 0x321f7: 0x6c2d4420, + 0x321f8: 0x6c2d4620, 0x321f9: 0x6c2d4820, 0x321fa: 0x6c2d4a20, 0x321fb: 0x6c2d4c20, + 0x321fc: 0x6c2d4e20, 0x321fd: 0x6c2d5020, 0x321fe: 0x6c2d5220, 0x321ff: 0x6c2d5420, + // Block 0xc88, offset 0x32200 + 0x32200: 0x6c2d5620, 0x32201: 0x6c2d5820, 0x32202: 0x6c2d5a20, 0x32203: 0x6c2d5c20, + 0x32204: 0x6c2d5e20, 0x32205: 0x6c2d6020, 0x32206: 0x6c2d6220, 0x32207: 0x6c2d6420, + 0x32208: 0x6c2d6620, 0x32209: 0x6c2d6820, 0x3220a: 0x6c2d6a20, 0x3220b: 0x6c2d6c20, + 0x3220c: 0x6c2d6e20, 0x3220d: 0x6c2d7020, 0x3220e: 0x6c2d7220, 0x3220f: 0x6c2d7420, + 0x32210: 0x6c470e20, 0x32211: 0x6c471020, 0x32212: 0x6c471220, 0x32213: 0x6c471420, + 0x32214: 0x6c471620, 0x32215: 0x6c471820, 0x32216: 0x6c471a20, 0x32217: 0x6c471c20, + 0x32218: 0x6c471e20, 0x32219: 0x6c472020, 0x3221a: 0x6c472220, 0x3221b: 0x6c472420, + 0x3221c: 0x6c472620, 0x3221d: 0x6c472820, 0x3221e: 0x6c472a20, 0x3221f: 0x6c472c20, + 0x32220: 0x6c472e20, 0x32221: 0x6c473020, 0x32222: 0x6c473220, 0x32223: 0x6c473420, + 0x32224: 0x6c473620, 0x32225: 0x6c473820, 0x32226: 0x6c473a20, 0x32227: 0x6c473c20, + 0x32228: 0x6c473e20, 0x32229: 0x6c474020, 0x3222a: 0x6c474220, 0x3222b: 0x6c474420, + 0x3222c: 0x6c474620, 0x3222d: 0x6c474820, 0x3222e: 0x6c474a20, 0x3222f: 0x6c474c20, + 0x32230: 0x6c474e20, 0x32231: 0x6c475020, 0x32232: 0x6c475220, 0x32233: 0x6c475420, + 0x32234: 0x6c475620, 0x32235: 0x6c475820, 0x32236: 0x6c475a20, 0x32237: 0x6c475c20, + 0x32238: 0x6c475e20, 0x32239: 0x6c476020, 0x3223a: 0x6c476220, 0x3223b: 0x6c476420, + 0x3223c: 0x6c476620, 0x3223d: 0x6c476820, 0x3223e: 0x6c476a20, 0x3223f: 0x6c476c20, + // Block 0xc89, offset 0x32240 + 0x32240: 0x6c476e20, 0x32241: 0x6c477020, 0x32242: 0x6c477220, 0x32243: 0x6c477420, + 0x32244: 0x6c477620, 0x32245: 0x6c477820, 0x32246: 0x6c477a20, 0x32247: 0x6c477c20, + 0x32248: 0x6c477e20, 0x32249: 0x6c478020, 0x3224a: 0x6c478220, 0x3224b: 0x6c478420, + 0x3224c: 0x6c478620, 0x3224d: 0x6c478820, 0x3224e: 0x6c478a20, 0x3224f: 0x6c478c20, + 0x32250: 0x6c478e20, 0x32251: 0x6c479020, 0x32252: 0x6c479220, 0x32253: 0x6c479420, + 0x32254: 0x6c479620, 0x32255: 0x6c479820, 0x32256: 0x6c479a20, 0x32257: 0x6c479c20, + 0x32258: 0x6c479e20, 0x32259: 0x6c47a020, 0x3225a: 0x6c47a220, 0x3225b: 0x6c47a420, + 0x3225c: 0x6c47a620, 0x3225d: 0x6c47a820, 0x3225e: 0x6c47aa20, 0x3225f: 0x6c47ac20, + 0x32260: 0x6c47ae20, 0x32261: 0x6c47b020, 0x32262: 0x6c47b220, 0x32263: 0x6c47b420, + 0x32264: 0x6c47b620, 0x32265: 0x6c47b820, 0x32266: 0x6c47ba20, 0x32267: 0x6c47bc20, + 0x32268: 0x6c47be20, 0x32269: 0x6c47c020, 0x3226a: 0x6c47c220, 0x3226b: 0x6c47c420, + 0x3226c: 0x6c684820, 0x3226d: 0x6c684a20, 0x3226e: 0x6c684c20, 0x3226f: 0x6c684e20, + 0x32270: 0x6c685020, 0x32271: 0x6c685220, 0x32272: 0x6c685420, 0x32273: 0x6c685620, + 0x32274: 0x6c685820, 0x32275: 0x6c685a20, 0x32276: 0x6c685c20, 0x32277: 0x6c685e20, + 0x32278: 0x6c686020, 0x32279: 0x6c686220, 0x3227a: 0x6c686420, 0x3227b: 0x6c686620, + 0x3227c: 0x6c686820, 0x3227d: 0x6c686a20, 0x3227e: 0x6c686c20, 0x3227f: 0x6c686e20, + // Block 0xc8a, offset 0x32280 + 0x32280: 0x6c687020, 0x32281: 0x6c687220, 0x32282: 0x6c687420, 0x32283: 0x6c687620, + 0x32284: 0x6c687820, 0x32285: 0x6c687a20, 0x32286: 0x6c687c20, 0x32287: 0x6c687e20, + 0x32288: 0x6c688020, 0x32289: 0x6c688220, 0x3228a: 0x6c688420, 0x3228b: 0x6c688620, + 0x3228c: 0x6c688820, 0x3228d: 0x6c688a20, 0x3228e: 0x6c688c20, 0x3228f: 0x6c688e20, + 0x32290: 0x6c689020, 0x32291: 0x6c689220, 0x32292: 0x6c689420, 0x32293: 0x6c689620, + 0x32294: 0x6c689820, 0x32295: 0x6c689a20, 0x32296: 0x6c689c20, 0x32297: 0x6c689e20, + 0x32298: 0x6c68a020, 0x32299: 0x6c68a220, 0x3229a: 0x6c68a420, 0x3229b: 0x6c68a620, + 0x3229c: 0x6c68a820, 0x3229d: 0x6c68aa20, 0x3229e: 0x6c68ac20, 0x3229f: 0x6c68ae20, + 0x322a0: 0x6c68b020, 0x322a1: 0x6c68b220, 0x322a2: 0x6c68b420, 0x322a3: 0x6c68b620, + 0x322a4: 0x6c68b820, 0x322a5: 0x6c8ede20, 0x322a6: 0x6c68ba20, 0x322a7: 0x6c68bc20, + 0x322a8: 0x6c68be20, 0x322a9: 0x6c68c020, 0x322aa: 0x6c68c220, 0x322ab: 0x6c7ab620, + 0x322ac: 0x6c68c420, 0x322ad: 0x6c68c620, 0x322ae: 0x6c68c820, 0x322af: 0x6c68ca20, + 0x322b0: 0x6c68cc20, 0x322b1: 0x6c68ce20, 0x322b2: 0x6c68d020, 0x322b3: 0x6c68d220, + 0x322b4: 0x6c68d420, 0x322b5: 0x6c68d620, 0x322b6: 0x6c68d820, 0x322b7: 0x6c68da20, + 0x322b8: 0x6c68dc20, 0x322b9: 0x6c68de20, 0x322ba: 0x6c68e020, 0x322bb: 0x6c68e220, + 0x322bc: 0x6c68e420, 0x322bd: 0x6c68e620, 0x322be: 0x6c68e820, 0x322bf: 0x6c68ea20, + // Block 0xc8b, offset 0x322c0 + 0x322c0: 0x6c68ec20, 0x322c1: 0x6c68ee20, 0x322c2: 0x6c68f020, 0x322c3: 0x6c68f220, + 0x322c4: 0x6c68f420, 0x322c5: 0x6c68f620, 0x322c6: 0x6c68f820, 0x322c7: 0x6c68fa20, + 0x322c8: 0x6c68fc20, 0x322c9: 0x6c68fe20, 0x322ca: 0x6c690020, 0x322cb: 0x6c690220, + 0x322cc: 0x6c690420, 0x322cd: 0x6c690620, 0x322ce: 0x6c690820, 0x322cf: 0x6c690a20, + 0x322d0: 0x6c690c20, 0x322d1: 0x6c690e20, 0x322d2: 0x6c691020, 0x322d3: 0x6c691220, + 0x322d4: 0x6c691420, 0x322d5: 0x6c691620, 0x322d6: 0x6c691820, 0x322d7: 0x6c691a20, + 0x322d8: 0x6c691c20, 0x322d9: 0x6c691e20, 0x322da: 0x6c692020, 0x322db: 0x6c692220, + 0x322dc: 0x6c692420, 0x322dd: 0x6c692620, 0x322de: 0x6c692820, 0x322df: 0x6c692a20, + 0x322e0: 0x6c692c20, 0x322e1: 0x6c692e20, 0x322e2: 0x6c693020, 0x322e3: 0x6c693220, + 0x322e4: 0x6c693420, 0x322e5: 0x6c693620, 0x322e6: 0x6c7a1a20, 0x322e7: 0x6c8ee020, + 0x322e8: 0x6c8ee220, 0x322e9: 0x6c8ee420, 0x322ea: 0x6c8ee620, 0x322eb: 0x6c8ee820, + 0x322ec: 0x6c8eea20, 0x322ed: 0x6c8eec20, 0x322ee: 0x6c8eee20, 0x322ef: 0x6c8ef020, + 0x322f0: 0x6c8ef220, 0x322f1: 0x6c8ef420, 0x322f2: 0x6c8ef620, 0x322f3: 0x6c8ef820, + 0x322f4: 0x6c8efa20, 0x322f5: 0x6c8efc20, 0x322f6: 0x6c8efe20, 0x322f7: 0x6c8f0020, + 0x322f8: 0x6c8f0220, 0x322f9: 0x6c8f0420, 0x322fa: 0x6c8f0620, 0x322fb: 0x6c8f0820, + 0x322fc: 0x6c8f0a20, 0x322fd: 0x6c8f0c20, 0x322fe: 0x6c8f0e20, 0x322ff: 0x6c8f1020, + // Block 0xc8c, offset 0x32300 + 0x32300: 0x6c8f1220, 0x32301: 0x6c8f1420, 0x32302: 0x6c8f1620, 0x32303: 0x6c8f1820, + 0x32304: 0x6c8f1a20, 0x32305: 0x6c8f1c20, 0x32306: 0x6c8f1e20, 0x32307: 0x6c8f2020, + 0x32308: 0x6c8f2220, 0x32309: 0x6c8f2420, 0x3230a: 0x6c8f2620, 0x3230b: 0x6c8f2820, + 0x3230c: 0x6c8f2a20, 0x3230d: 0x6c8f2c20, 0x3230e: 0x6c8f2e20, 0x3230f: 0x6c8f3020, + 0x32310: 0x6c8f3220, 0x32311: 0x6c8f3420, 0x32312: 0x6c8f3620, 0x32313: 0x6c8f3820, + 0x32314: 0x6c8f3a20, 0x32315: 0x6c8f3c20, 0x32316: 0x6c8f3e20, 0x32317: 0x6c8f4020, + 0x32318: 0x6c8f4220, 0x32319: 0x6c8f4420, 0x3231a: 0x6c8f4620, 0x3231b: 0x6c8f4820, + 0x3231c: 0x6c8f4a20, 0x3231d: 0x6c8f4c20, 0x3231e: 0x6c8f4e20, 0x3231f: 0x6c8f5020, + 0x32320: 0x6c8f5220, 0x32321: 0x6c8f5420, 0x32322: 0x6c8f5620, 0x32323: 0x6c8f5820, + 0x32324: 0x6c8f5a20, 0x32325: 0x6c8f5c20, 0x32326: 0x6c8f5e20, 0x32327: 0x6c8f6020, + 0x32328: 0x6c8f6220, 0x32329: 0x6c8f6420, 0x3232a: 0x6c8f6620, 0x3232b: 0x6c8f6820, + 0x3232c: 0x6c8f6a20, 0x3232d: 0x6c8f6c20, 0x3232e: 0x6c8f6e20, 0x3232f: 0x6c8f7020, + 0x32330: 0x6c8f7220, 0x32331: 0x6c8f7420, 0x32332: 0x6c8f7620, 0x32333: 0x6c8f7820, + 0x32334: 0x6c8f7a20, 0x32335: 0x6c8f7c20, 0x32336: 0x6c8f7e20, 0x32337: 0x6c8f8020, + 0x32338: 0x6c8f8220, 0x32339: 0x6c8f8420, 0x3233a: 0x6c8f8620, 0x3233b: 0x6c8f8820, + 0x3233c: 0x6c8f8a20, 0x3233d: 0x6c8f8c20, 0x3233e: 0x6c8f8e20, 0x3233f: 0x6c8f9020, + // Block 0xc8d, offset 0x32340 + 0x32340: 0x6c8f9220, 0x32341: 0x6c8f9420, 0x32342: 0x6c8f9620, 0x32343: 0x6c8f9820, + 0x32344: 0x6c8f9a20, 0x32345: 0x6c8f9c20, 0x32346: 0x6c8f9e20, 0x32347: 0x6c8fa020, + 0x32348: 0x6c8fa220, 0x32349: 0x6c8fa420, 0x3234a: 0x6c8fa620, 0x3234b: 0x6c8fa820, + 0x3234c: 0x6c8faa20, 0x3234d: 0x6c8fac20, 0x3234e: 0x6c8fae20, 0x3234f: 0x6c8fb020, + 0x32350: 0x6c8fb220, 0x32351: 0x6c8fb420, 0x32352: 0x6c8fb620, 0x32353: 0x6c8fb820, + 0x32354: 0x6c8fba20, 0x32355: 0x6c8fbc20, 0x32356: 0x6c8fbe20, 0x32357: 0x6c8fc020, + 0x32358: 0x6c8fc220, 0x32359: 0x6c8fc420, 0x3235a: 0x6c8fc620, 0x3235b: 0x6c8fc820, + 0x3235c: 0x6c8fca20, 0x3235d: 0x6c8fcc20, 0x3235e: 0x6c8fce20, 0x3235f: 0x6c8fd020, + 0x32360: 0x6c8fd220, 0x32361: 0x6c8fd420, 0x32362: 0x6c8fd620, 0x32363: 0x6c8fd820, + 0x32364: 0x6c8fda20, 0x32365: 0x6c8fdc20, 0x32366: 0x6c8fde20, 0x32367: 0x6c8fe020, + 0x32368: 0x6c8fe220, 0x32369: 0x6c8fe420, 0x3236a: 0x6c8fe620, 0x3236b: 0x6c8fe820, + 0x3236c: 0x6c8fea20, 0x3236d: 0x6c8fec20, 0x3236e: 0x6c8fee20, 0x3236f: 0x6c8ff020, + 0x32370: 0x6c8ff220, 0x32371: 0x6c8ff420, 0x32372: 0x6c8ff620, 0x32373: 0x6c8ff820, + 0x32374: 0x6c8ffa20, 0x32375: 0x6c8ffc20, 0x32376: 0x6c8ffe20, 0x32377: 0x6cbb1e20, + 0x32378: 0x6cbb2020, 0x32379: 0x6cbb2220, 0x3237a: 0x6cbb2420, 0x3237b: 0x6cbb2620, + 0x3237c: 0x6cbb2820, 0x3237d: 0x6cbb2a20, 0x3237e: 0x6cbb2c20, 0x3237f: 0x6cbb2e20, + // Block 0xc8e, offset 0x32380 + 0x32380: 0x6cbb3020, 0x32381: 0x6cbb3220, 0x32382: 0x6cbb3420, 0x32383: 0x6cbb3620, + 0x32384: 0x6cbb3820, 0x32385: 0x6cbb3a20, 0x32386: 0x6cbb3c20, 0x32387: 0x6cbb3e20, + 0x32388: 0x6cbb4020, 0x32389: 0x6cbb4220, 0x3238a: 0x6cbb4420, 0x3238b: 0x6cbb4620, + 0x3238c: 0x6cbb4820, 0x3238d: 0x6cbb4a20, 0x3238e: 0x6cbb4c20, 0x3238f: 0x6cbb4e20, + 0x32390: 0x6cbb5020, 0x32391: 0x6cbb5220, 0x32392: 0x6cbb5420, 0x32393: 0x6cbb5620, + 0x32394: 0x6cbb5820, 0x32395: 0x6cbb5a20, 0x32396: 0x6cbb5c20, 0x32397: 0x6cbb5e20, + 0x32398: 0x6cbb6020, 0x32399: 0x6cbb6220, 0x3239a: 0x6cbb6420, 0x3239b: 0x6cbb6620, + 0x3239c: 0x6cbb6820, 0x3239d: 0x6cbb6a20, 0x3239e: 0x6cbb6c20, 0x3239f: 0x6cbb6e20, + 0x323a0: 0x6cbb7020, 0x323a1: 0x6cbb7220, 0x323a2: 0x6cebdc20, 0x323a3: 0x6cbb7420, + 0x323a4: 0x6cbb7620, 0x323a5: 0x6cbb7820, 0x323a6: 0x6cbb7a20, 0x323a7: 0x6cbb7c20, + 0x323a8: 0x6cbb7e20, 0x323a9: 0x6cbb8020, 0x323aa: 0x6cbb8220, 0x323ab: 0x6cbb8420, + 0x323ac: 0x6cbb8620, 0x323ad: 0x6cbb8820, 0x323ae: 0x6cbb8a20, 0x323af: 0x6cbb8c20, + 0x323b0: 0x6cbb8e20, 0x323b1: 0x6cbb9020, 0x323b2: 0x6cbb9220, 0x323b3: 0x6cbb9420, + 0x323b4: 0x6cbb9620, 0x323b5: 0x6cbb9820, 0x323b6: 0x6cbb9a20, 0x323b7: 0x6cbb9c20, + 0x323b8: 0x6cbb9e20, 0x323b9: 0x6cbba020, 0x323ba: 0x6cbba220, 0x323bb: 0x6cbba420, + 0x323bc: 0x6cbba620, 0x323bd: 0x6cbba820, 0x323be: 0x6cbbaa20, 0x323bf: 0x6cbbac20, + // Block 0xc8f, offset 0x323c0 + 0x323c0: 0x6cbbae20, 0x323c1: 0x6cbbb020, 0x323c2: 0x6cbbb220, 0x323c3: 0x6cbbb420, + 0x323c4: 0x6cbbb620, 0x323c5: 0x6cbbb820, 0x323c6: 0x6cbbba20, 0x323c7: 0x6cbbbc20, + 0x323c8: 0x6cbbbe20, 0x323c9: 0x6cbbc020, 0x323ca: 0x6cbbc220, 0x323cb: 0x6cbbc420, + 0x323cc: 0x6cbbc620, 0x323cd: 0x6cbbc820, 0x323ce: 0x6cbbca20, 0x323cf: 0x6cbbcc20, + 0x323d0: 0x6cbbce20, 0x323d1: 0x6cbbd020, 0x323d2: 0x6cbbd220, 0x323d3: 0x6cbbd420, + 0x323d4: 0x6cbbd620, 0x323d5: 0x6cbbd820, 0x323d6: 0x6cbbda20, 0x323d7: 0x6cbbdc20, + 0x323d8: 0x6cbbde20, 0x323d9: 0x6cbbe020, 0x323da: 0x6cbbe220, 0x323db: 0x6cbbe420, + 0x323dc: 0x6cbbe620, 0x323dd: 0x6cbbe820, 0x323de: 0x6cbbea20, 0x323df: 0x6cbbec20, + 0x323e0: 0x6cbbee20, 0x323e1: 0x6cbbf020, 0x323e2: 0x6cbbf220, 0x323e3: 0x6cbbf420, + 0x323e4: 0x6cbbf620, 0x323e5: 0x6cbbf820, 0x323e6: 0x6cbbfa20, 0x323e7: 0x6cbbfc20, + 0x323e8: 0x6cbbfe20, 0x323e9: 0x6cbc0020, 0x323ea: 0x6cbc0220, 0x323eb: 0x6cbc0420, + 0x323ec: 0x6cbc0620, 0x323ed: 0x6cbc0820, 0x323ee: 0x6cbc0a20, 0x323ef: 0x6cbc0c20, + 0x323f0: 0x6cbc0e20, 0x323f1: 0x6cbc1020, 0x323f2: 0x6cbc1220, 0x323f3: 0x6cbc1420, + 0x323f4: 0x6cbc1620, 0x323f5: 0x6cbc1820, 0x323f6: 0x6cebde20, 0x323f7: 0x6cebe020, + 0x323f8: 0x6cebe220, 0x323f9: 0x6cebe420, 0x323fa: 0x6cebe620, 0x323fb: 0x6cbc1a20, + 0x323fc: 0x6cbc1c20, 0x323fd: 0x6cbc1e20, 0x323fe: 0x6cbc2020, 0x323ff: 0x6cebe820, + // Block 0xc90, offset 0x32400 + 0x32400: 0x6cebea20, 0x32401: 0x6cebec20, 0x32402: 0x6cebee20, 0x32403: 0x6cebf020, + 0x32404: 0x6cebf220, 0x32405: 0x6cebf420, 0x32406: 0x6cebf620, 0x32407: 0x6cebf820, + 0x32408: 0x6cebfa20, 0x32409: 0x6cebfc20, 0x3240a: 0x6cebfe20, 0x3240b: 0x6cec0020, + 0x3240c: 0x6cec0220, 0x3240d: 0x6cec0420, 0x3240e: 0x6cec0620, 0x3240f: 0x6cec0820, + 0x32410: 0x6cec0a20, 0x32411: 0x6cec0c20, 0x32412: 0x6cec0e20, 0x32413: 0x6cec1020, + 0x32414: 0x6cec1220, 0x32415: 0x6cec1420, 0x32416: 0x6cec1620, 0x32417: 0x6cec1820, + 0x32418: 0x6cec1a20, 0x32419: 0x6cec1c20, 0x3241a: 0x6cec1e20, 0x3241b: 0x6cec2020, + 0x3241c: 0x6cec2220, 0x3241d: 0x6cec2420, 0x3241e: 0x6cec2620, 0x3241f: 0x6cec2820, + 0x32420: 0x6cec2a20, 0x32421: 0x6cec2c20, 0x32422: 0x6cec2e20, 0x32423: 0x6cec3020, + 0x32424: 0x6cec3220, 0x32425: 0x6cec3420, 0x32426: 0x6cec3620, 0x32427: 0x6cec3820, + 0x32428: 0x6cec3a20, 0x32429: 0x6cec3c20, 0x3242a: 0x6cec3e20, 0x3242b: 0x6cec4020, + 0x3242c: 0x6cec4220, 0x3242d: 0x6cec4420, 0x3242e: 0x6cec4620, 0x3242f: 0x6cec4820, + 0x32430: 0x6d49ce20, 0x32431: 0x6d49d020, 0x32432: 0x6d49d220, 0x32433: 0x6cec4a20, + 0x32434: 0x6cec4c20, 0x32435: 0x6cec4e20, 0x32436: 0x6cec5020, 0x32437: 0x6cec5220, + 0x32438: 0x6cec5420, 0x32439: 0x6cec5620, 0x3243a: 0x6cec5820, 0x3243b: 0x6cec5a20, + 0x3243c: 0x6cec5c20, 0x3243d: 0x6cec5e20, 0x3243e: 0x6cec6020, 0x3243f: 0x6cec6220, + // Block 0xc91, offset 0x32440 + 0x32440: 0x6cec6420, 0x32441: 0x6cec6620, 0x32442: 0x6cec6820, 0x32443: 0x6cec6a20, + 0x32444: 0x6cec6c20, 0x32445: 0x6cec6e20, 0x32446: 0x6cec7020, 0x32447: 0x6cec7220, + 0x32448: 0x6cec7420, 0x32449: 0x6cec7620, 0x3244a: 0x6cec7820, 0x3244b: 0x6cec7a20, + 0x3244c: 0x6cec7c20, 0x3244d: 0x6cec7e20, 0x3244e: 0x6cec8020, 0x3244f: 0x6cec8220, + 0x32450: 0x6cec8420, 0x32451: 0x6cec8620, 0x32452: 0x6cec8820, 0x32453: 0x6cec8a20, + 0x32454: 0x6cec8c20, 0x32455: 0x6cec8e20, 0x32456: 0x6cec9020, 0x32457: 0x6cec9220, + 0x32458: 0x6cec9420, 0x32459: 0x6cec9620, 0x3245a: 0x6cec9820, 0x3245b: 0x6cec9a20, + 0x3245c: 0x6cec9c20, 0x3245d: 0x6cec9e20, 0x3245e: 0x6ceca020, 0x3245f: 0x6ceca220, + 0x32460: 0x6ceca420, 0x32461: 0x6ceca620, 0x32462: 0x6ceca820, 0x32463: 0x6cecaa20, + 0x32464: 0x6cecac20, 0x32465: 0x6cecae20, 0x32466: 0x6cecb020, 0x32467: 0x6cecb220, + 0x32468: 0x6cecb420, 0x32469: 0x6cecb620, 0x3246a: 0x6cecb820, 0x3246b: 0x6cecba20, + 0x3246c: 0x6cecbc20, 0x3246d: 0x6cecbe20, 0x3246e: 0x6cecc020, 0x3246f: 0x6cecc220, + 0x32470: 0x6cecc420, 0x32471: 0x6cecc620, 0x32472: 0x6cecc820, 0x32473: 0x6cecca20, + 0x32474: 0x6ceccc20, 0x32475: 0x6cecce20, 0x32476: 0x6cecd020, 0x32477: 0x6cecd220, + 0x32478: 0x6cecd420, 0x32479: 0x6cecd620, 0x3247a: 0x6cecd820, 0x3247b: 0x6cecda20, + 0x3247c: 0x6cecdc20, 0x3247d: 0x6cecde20, 0x3247e: 0x6cece020, 0x3247f: 0x6cece220, + // Block 0xc92, offset 0x32480 + 0x32480: 0x6cece420, 0x32481: 0x6cece620, 0x32482: 0x6cece820, 0x32483: 0x6cecea20, + 0x32484: 0x6cecec20, 0x32485: 0x6cecee20, 0x32486: 0x6cecf020, 0x32487: 0x6cecf220, + 0x32488: 0x6cecf420, 0x32489: 0x6cecf620, 0x3248a: 0x6cecf820, 0x3248b: 0x6cecfa20, + 0x3248c: 0x6cecfc20, 0x3248d: 0x6cecfe20, 0x3248e: 0x6ced0020, 0x3248f: 0x6ced0220, + 0x32490: 0x6ced0420, 0x32491: 0x6ced0620, 0x32492: 0x6ced0820, 0x32493: 0x6ced0a20, + 0x32494: 0x6d1bb620, 0x32495: 0x6d1bb820, 0x32496: 0x6d1bba20, 0x32497: 0x6d1bbc20, + 0x32498: 0x6d1bbe20, 0x32499: 0x6d1bc020, 0x3249a: 0x6d1bc220, 0x3249b: 0x6d1bc420, + 0x3249c: 0x6d1bc620, 0x3249d: 0x6d1bc820, 0x3249e: 0x6d1bca20, 0x3249f: 0x6d1bcc20, + 0x324a0: 0x6d1bce20, 0x324a1: 0x6d1bd020, 0x324a2: 0x6d1bd220, 0x324a3: 0x6d1bd420, + 0x324a4: 0x6d1bd620, 0x324a5: 0x6d1bd820, 0x324a6: 0x6d1bda20, 0x324a7: 0x6d1bdc20, + 0x324a8: 0x6d1bde20, 0x324a9: 0x6d1be020, 0x324aa: 0x6d1be220, 0x324ab: 0x6d1be420, + 0x324ac: 0x6d1be620, 0x324ad: 0x6d1be820, 0x324ae: 0x6d1bea20, 0x324af: 0x6d1bec20, + 0x324b0: 0x6d1bee20, 0x324b1: 0x6d1bf020, 0x324b2: 0x6d1bf220, 0x324b3: 0x6d1bf420, + 0x324b4: 0x6d1bf620, 0x324b5: 0x6d1bf820, 0x324b6: 0x6d1bfa20, 0x324b7: 0x6d1bfc20, + 0x324b8: 0x6d1bfe20, 0x324b9: 0x6d1c0020, 0x324ba: 0x6d1c0220, 0x324bb: 0x6d1c0420, + 0x324bc: 0x6d1c0620, 0x324bd: 0x6d1c0820, 0x324be: 0x6d1c0a20, 0x324bf: 0x6d1c0c20, + // Block 0xc93, offset 0x324c0 + 0x324c0: 0x6d1c0e20, 0x324c1: 0x6d1c1020, 0x324c2: 0x6d1c1220, 0x324c3: 0x6d1c1420, + 0x324c4: 0x6d1c1620, 0x324c5: 0x6d1c1820, 0x324c6: 0x6d1c1a20, 0x324c7: 0x6d1c1c20, + 0x324c8: 0x6d1c1e20, 0x324c9: 0x6d1c2020, 0x324ca: 0x6d1c2220, 0x324cb: 0x6d1c2420, + 0x324cc: 0x6d1c2620, 0x324cd: 0x6d1c2820, 0x324ce: 0x6d1c2a20, 0x324cf: 0x6d1c2c20, + 0x324d0: 0x6d1c2e20, 0x324d1: 0x6d1c3020, 0x324d2: 0x6d1c3220, 0x324d3: 0x6d1c3420, + 0x324d4: 0x6d1c3620, 0x324d5: 0x6d1c3820, 0x324d6: 0x6d1c3a20, 0x324d7: 0x6d1c3c20, + 0x324d8: 0x6d1c3e20, 0x324d9: 0x6d1c4020, 0x324da: 0x6d1c4220, 0x324db: 0x6d1c4420, + 0x324dc: 0x6d1c4620, 0x324dd: 0x6d1c4820, 0x324de: 0x6d1c4a20, 0x324df: 0x6d1c4c20, + 0x324e0: 0x6d1c4e20, 0x324e1: 0x6d1c5020, 0x324e2: 0x6d1c5220, 0x324e3: 0x6d1c5420, + 0x324e4: 0x6d1c5620, 0x324e5: 0x6d1c5820, 0x324e6: 0x6d1c5a20, 0x324e7: 0x6d1c5c20, + 0x324e8: 0x6d1c5e20, 0x324e9: 0x6d1c6020, 0x324ea: 0x6d1c6220, 0x324eb: 0x6d1c6420, + 0x324ec: 0x6d1c6620, 0x324ed: 0x6d1c6820, 0x324ee: 0x6d1c6a20, 0x324ef: 0x6d1c6c20, + 0x324f0: 0x6d1c6e20, 0x324f1: 0x6d1c7020, 0x324f2: 0x6d1c7220, 0x324f3: 0x6d1c7420, + 0x324f4: 0x6d1c7620, 0x324f5: 0x6d1c7820, 0x324f6: 0x6d1c7a20, 0x324f7: 0x6d1c7c20, + 0x324f8: 0x6d1c7e20, 0x324f9: 0x6d1c8020, 0x324fa: 0x6d1c8220, 0x324fb: 0x6d1c8420, + 0x324fc: 0x6d1c8620, 0x324fd: 0x6d1c8820, 0x324fe: 0x6d1c8a20, 0x324ff: 0x6d1c8c20, + // Block 0xc94, offset 0x32500 + 0x32500: 0x6d1c8e20, 0x32501: 0x6d1c9020, 0x32502: 0x6d1c9220, 0x32503: 0x6d1c9420, + 0x32504: 0x6d1c9620, 0x32505: 0x6d1c9820, 0x32506: 0x6d1c9a20, 0x32507: 0x6d1c9c20, + 0x32508: 0x6d1c9e20, 0x32509: 0x6d1ca020, 0x3250a: 0x6d1ca220, 0x3250b: 0x6d1ca420, + 0x3250c: 0x6d1ca620, 0x3250d: 0x6d1ca820, 0x3250e: 0x6d1caa20, 0x3250f: 0x6d1cac20, + 0x32510: 0x6d1cae20, 0x32511: 0x6d1cb020, 0x32512: 0x6d1cb220, 0x32513: 0x6d1cb420, + 0x32514: 0x6d1cb620, 0x32515: 0x6d1cb820, 0x32516: 0x6d1cba20, 0x32517: 0x6d1cbc20, + 0x32518: 0x6d1cbe20, 0x32519: 0x6d1cc020, 0x3251a: 0x6d1cc220, 0x3251b: 0x6d1cc420, + 0x3251c: 0x6d1cc620, 0x3251d: 0x6d1cc820, 0x3251e: 0x6d1cca20, 0x3251f: 0x6d1ccc20, + 0x32520: 0x6d1cce20, 0x32521: 0x6d49d420, 0x32522: 0x6d49d620, 0x32523: 0x6d49d820, + 0x32524: 0x6d49da20, 0x32525: 0x6d49dc20, 0x32526: 0x6d49de20, 0x32527: 0x6d49e020, + 0x32528: 0x6d49e220, 0x32529: 0x6d49e420, 0x3252a: 0x6d49e620, 0x3252b: 0x6d49e820, + 0x3252c: 0x6d49ea20, 0x3252d: 0x6d49ec20, 0x3252e: 0x6d49ee20, 0x3252f: 0x6d49f020, + 0x32530: 0x6d49f220, 0x32531: 0x6d49f420, 0x32532: 0x6d49f620, 0x32533: 0x6d49f820, + 0x32534: 0x6d49fa20, 0x32535: 0x6d49fc20, 0x32536: 0x6d49fe20, 0x32537: 0x6d4a0020, + 0x32538: 0x6d4a0220, 0x32539: 0x6d4a0420, 0x3253a: 0x6d4a0620, 0x3253b: 0x6d4a0820, + 0x3253c: 0x6d4a0a20, 0x3253d: 0x6d4a0c20, 0x3253e: 0x6d4a0e20, 0x3253f: 0x6d4a1020, + // Block 0xc95, offset 0x32540 + 0x32540: 0x6d4a1220, 0x32541: 0x6d4a1420, 0x32542: 0x6d4a1620, 0x32543: 0x6d4a1820, + 0x32544: 0x6d4a1a20, 0x32545: 0x6d4a1c20, 0x32546: 0x6d4a1e20, 0x32547: 0x6d4a2020, + 0x32548: 0x6d4a2220, 0x32549: 0x6d4a2420, 0x3254a: 0x6d4a2620, 0x3254b: 0x6d4a2820, + 0x3254c: 0x6d4a2a20, 0x3254d: 0x6d4a2c20, 0x3254e: 0x6d4a2e20, 0x3254f: 0x6d4a3020, + 0x32550: 0x6d4a3220, 0x32551: 0x6d4a3420, 0x32552: 0x6d4a3620, 0x32553: 0x6d4a3820, + 0x32554: 0x6d4a3a20, 0x32555: 0x6d4a3c20, 0x32556: 0x6d4a3e20, 0x32557: 0x6d4a4020, + 0x32558: 0x6d4a4220, 0x32559: 0x6d4a4420, 0x3255a: 0x6d4a4620, 0x3255b: 0x6d4a4820, + 0x3255c: 0x6d4a4a20, 0x3255d: 0x6d4a4c20, 0x3255e: 0x6d4a4e20, 0x3255f: 0x6d4a5020, + 0x32560: 0x6d4a5220, 0x32561: 0x6d4a5420, 0x32562: 0x6d4a5620, 0x32563: 0x6d4a5820, + 0x32564: 0x6d4a5a20, 0x32565: 0x6d4a5c20, 0x32566: 0x6d4a5e20, 0x32567: 0x6d311620, + 0x32568: 0x6d4a6020, 0x32569: 0x6d4a6220, 0x3256a: 0x6d4a6420, 0x3256b: 0x6d4a6620, + 0x3256c: 0x6d4a6820, 0x3256d: 0x6d4a6a20, 0x3256e: 0x6d4a6c20, 0x3256f: 0x6d4a6e20, + 0x32570: 0x6d4a7020, 0x32571: 0x6d4a7220, 0x32572: 0x6d4a7420, 0x32573: 0x6d4a7620, + 0x32574: 0x6d4a7820, 0x32575: 0x6d4a7a20, 0x32576: 0x6d4a7c20, 0x32577: 0x6d4a7e20, + 0x32578: 0x6d4a8020, 0x32579: 0x6d4a8220, 0x3257a: 0x6d4a8420, 0x3257b: 0x6d4a8620, + 0x3257c: 0x6d4a8820, 0x3257d: 0x6d4a8a20, 0x3257e: 0x6d4a8c20, 0x3257f: 0x6d4a8e20, + // Block 0xc96, offset 0x32580 + 0x32580: 0x6d4a9020, 0x32581: 0x6d4a9220, 0x32582: 0x6d4a9420, 0x32583: 0x6d4a9620, + 0x32584: 0x6d4a9820, 0x32585: 0x6d4a9a20, 0x32586: 0x6d4a9c20, 0x32587: 0x6d775e20, + 0x32588: 0x6d776020, 0x32589: 0x6d776220, 0x3258a: 0x6d776420, 0x3258b: 0x6d776620, + 0x3258c: 0x6d776820, 0x3258d: 0x6d776a20, 0x3258e: 0x6d776c20, 0x3258f: 0x6d776e20, + 0x32590: 0x6d777020, 0x32591: 0x6d777220, 0x32592: 0x6d777420, 0x32593: 0x6d777620, + 0x32594: 0x6d777820, 0x32595: 0x6d777a20, 0x32596: 0x6d777c20, 0x32597: 0x6d777e20, + 0x32598: 0x6d778020, 0x32599: 0x6d778220, 0x3259a: 0x6d778420, 0x3259b: 0x6d778620, + 0x3259c: 0x6d778820, 0x3259d: 0x6d778a20, 0x3259e: 0x6d778c20, 0x3259f: 0x6d778e20, + 0x325a0: 0x6d779020, 0x325a1: 0x6d779220, 0x325a2: 0x6d779420, 0x325a3: 0x6d779620, + 0x325a4: 0x6d779820, 0x325a5: 0x6d779a20, 0x325a6: 0x6d779c20, 0x325a7: 0x6d779e20, + 0x325a8: 0x6d77a020, 0x325a9: 0x6d77a220, 0x325aa: 0x6d77a420, 0x325ab: 0x6d77a620, + 0x325ac: 0x6d77a820, 0x325ad: 0x6d77aa20, 0x325ae: 0x6d77ac20, 0x325af: 0x6d77ae20, + 0x325b0: 0x6d77b020, 0x325b1: 0x6d77b220, 0x325b2: 0x6d77b420, 0x325b3: 0x6d77b620, + 0x325b4: 0x6d77b820, 0x325b5: 0x6d77ba20, 0x325b6: 0x6d77bc20, 0x325b7: 0x6d77be20, + 0x325b8: 0x6d77c020, 0x325b9: 0x6d77c220, 0x325ba: 0x6d77c420, 0x325bb: 0x6d77c620, + 0x325bc: 0x6d77c820, 0x325bd: 0x6d77ca20, 0x325be: 0x6d77cc20, 0x325bf: 0x6d77ce20, + // Block 0xc97, offset 0x325c0 + 0x325c0: 0x6d77d020, 0x325c1: 0x6d77d220, 0x325c2: 0x6d77d420, 0x325c3: 0x6d77d620, + 0x325c4: 0x6d77d820, 0x325c5: 0x6d77da20, 0x325c6: 0x6d77dc20, 0x325c7: 0x6d77de20, + 0x325c8: 0x6d77e020, 0x325c9: 0x6d77e220, 0x325ca: 0x6d77e420, 0x325cb: 0x6d77e620, + 0x325cc: 0x6d77e820, 0x325cd: 0x6d77ea20, 0x325ce: 0x6d77ec20, 0x325cf: 0x6d77ee20, + 0x325d0: 0x6d77f020, 0x325d1: 0x6d77f220, 0x325d2: 0x6d77f420, 0x325d3: 0x6d77f620, + 0x325d4: 0x6d4a9e20, 0x325d5: 0x6d77f820, 0x325d6: 0x6d77fa20, 0x325d7: 0x6d77fc20, + 0x325d8: 0x6d77fe20, 0x325d9: 0x6d780020, 0x325da: 0x6d780220, 0x325db: 0x6d780420, + 0x325dc: 0x6d780620, 0x325dd: 0x6d780820, 0x325de: 0x6d780a20, 0x325df: 0x6d780c20, + 0x325e0: 0x6d780e20, 0x325e1: 0x6d781020, 0x325e2: 0x6d781220, 0x325e3: 0x6d781420, + 0x325e4: 0x6d781620, 0x325e5: 0x6d781820, 0x325e6: 0x6d4aa020, 0x325e7: 0x6d781a20, + 0x325e8: 0x6d781c20, 0x325e9: 0x6d781e20, 0x325ea: 0x6d782020, 0x325eb: 0x6d782220, + 0x325ec: 0x6d782420, 0x325ed: 0x6d782620, 0x325ee: 0x6d782820, 0x325ef: 0x6d782a20, + 0x325f0: 0x6d782c20, 0x325f1: 0x6d782e20, 0x325f2: 0x6d783020, 0x325f3: 0x6d783220, + 0x325f4: 0x6d783420, 0x325f5: 0x6d783620, 0x325f6: 0x6d783820, 0x325f7: 0x6d783a20, + 0x325f8: 0x6d783c20, 0x325f9: 0x6d783e20, 0x325fa: 0x6d784020, 0x325fb: 0x6d784220, + 0x325fc: 0x6d784420, 0x325fd: 0x6da0d020, 0x325fe: 0x6da0d220, 0x325ff: 0x6da0d420, + // Block 0xc98, offset 0x32600 + 0x32600: 0x6da0d620, 0x32601: 0x6da0d820, 0x32602: 0x6da0da20, 0x32603: 0x6da0dc20, + 0x32604: 0x6da0de20, 0x32605: 0x6da0e020, 0x32606: 0x6da0e220, 0x32607: 0x6da0e420, + 0x32608: 0x6da0e620, 0x32609: 0x6da0e820, 0x3260a: 0x6da0ea20, 0x3260b: 0x6da0ec20, + 0x3260c: 0x6da0ee20, 0x3260d: 0x6da0f020, 0x3260e: 0x6da0f220, 0x3260f: 0x6da0f420, + 0x32610: 0x6da0f620, 0x32611: 0x6da0f820, 0x32612: 0x6da0fa20, 0x32613: 0x6da0fc20, + 0x32614: 0x6da0fe20, 0x32615: 0x6da10020, 0x32616: 0x6da10220, 0x32617: 0x6da10420, + 0x32618: 0x6da10620, 0x32619: 0x6da10820, 0x3261a: 0x6da10a20, 0x3261b: 0x6da10c20, + 0x3261c: 0x6da10e20, 0x3261d: 0x6da11020, 0x3261e: 0x6da11220, 0x3261f: 0x6da11420, + 0x32620: 0x6da11620, 0x32621: 0x6da11820, 0x32622: 0x6da11a20, 0x32623: 0x6da11c20, + 0x32624: 0x6da11e20, 0x32625: 0x6da12020, 0x32626: 0x6da12220, 0x32627: 0x6da12420, + 0x32628: 0x6da12620, 0x32629: 0x6da12820, 0x3262a: 0x6da12a20, 0x3262b: 0x6da12c20, + 0x3262c: 0x6da12e20, 0x3262d: 0x6da13020, 0x3262e: 0x6da13220, 0x3262f: 0x6da13420, + 0x32630: 0x6da13620, 0x32631: 0x6da13820, 0x32632: 0x6da13a20, 0x32633: 0x6da13c20, + 0x32634: 0x6da13e20, 0x32635: 0x6da14020, 0x32636: 0x6da14220, 0x32637: 0x6da14420, + 0x32638: 0x6da14620, 0x32639: 0x6da14820, 0x3263a: 0x6da14a20, 0x3263b: 0x6da14c20, + 0x3263c: 0x6da14e20, 0x3263d: 0x6da15020, 0x3263e: 0x6da15220, 0x3263f: 0x6da15420, + // Block 0xc99, offset 0x32640 + 0x32640: 0x6da15620, 0x32641: 0x6da15820, 0x32642: 0x6da15a20, 0x32643: 0x6da15c20, + 0x32644: 0x6da15e20, 0x32645: 0x6da16020, 0x32646: 0x6da16220, 0x32647: 0x6da16420, + 0x32648: 0x6da16620, 0x32649: 0x6da16820, 0x3264a: 0x6da16a20, 0x3264b: 0x6da16c20, + 0x3264c: 0x6da16e20, 0x3264d: 0x6da17020, 0x3264e: 0x6da17220, 0x3264f: 0x6dc32a20, + 0x32650: 0x6dc32c20, 0x32651: 0x6dc32e20, 0x32652: 0x6dc33020, 0x32653: 0x6dc33220, + 0x32654: 0x6dc33420, 0x32655: 0x6dc33620, 0x32656: 0x6dc33820, 0x32657: 0x6dc33a20, + 0x32658: 0x6dc33c20, 0x32659: 0x6dc33e20, 0x3265a: 0x6dc34020, 0x3265b: 0x6dc34220, + 0x3265c: 0x6dc34420, 0x3265d: 0x6dc34620, 0x3265e: 0x6dc34820, 0x3265f: 0x6dc34a20, + 0x32660: 0x6dc34c20, 0x32661: 0x6dc34e20, 0x32662: 0x6dc35020, 0x32663: 0x6dc35220, + 0x32664: 0x6dc35420, 0x32665: 0x6dc35620, 0x32666: 0x6dc35820, 0x32667: 0x6dc35a20, + 0x32668: 0x6dc35c20, 0x32669: 0x6dc35e20, 0x3266a: 0x6dc36020, 0x3266b: 0x6dc36220, + 0x3266c: 0x6dc36420, 0x3266d: 0x6dc36620, 0x3266e: 0x6dc36820, 0x3266f: 0x6dc36a20, + 0x32670: 0x6dc36c20, 0x32671: 0x6dc36e20, 0x32672: 0x6dc37020, 0x32673: 0x6dc37220, + 0x32674: 0x6dc37420, 0x32675: 0x6dc37620, 0x32676: 0x6dc37820, 0x32677: 0x6dc37a20, + 0x32678: 0x6dc37c20, 0x32679: 0x6dc37e20, 0x3267a: 0x6dc38020, 0x3267b: 0x6dc38220, + 0x3267c: 0x6dc38420, 0x3267d: 0x6dc38620, 0x3267e: 0x6dc38820, 0x3267f: 0x6dc38a20, + // Block 0xc9a, offset 0x32680 + 0x32680: 0x6dc38c20, 0x32681: 0x6dc38e20, 0x32682: 0x6dc39020, 0x32683: 0x6dc39220, + 0x32684: 0x6dc39420, 0x32685: 0x6dc39620, 0x32686: 0x6dc39820, 0x32687: 0x6dc39a20, + 0x32688: 0x6dc39c20, 0x32689: 0x6dc39e20, 0x3268a: 0x6dc3a020, 0x3268b: 0x6dc3a220, + 0x3268c: 0x6dc3a420, 0x3268d: 0x6dc3a620, 0x3268e: 0x6dc3a820, 0x3268f: 0x6dc3aa20, + 0x32690: 0x6dc3ac20, 0x32691: 0x6dc3ae20, 0x32692: 0x6dc3b020, 0x32693: 0x6dc3b220, + 0x32694: 0x6dc3b420, 0x32695: 0x6dc3b620, 0x32696: 0x6dc3b820, 0x32697: 0x6dc3ba20, + 0x32698: 0x6dc3bc20, 0x32699: 0x6dc3be20, 0x3269a: 0x6dc3c020, 0x3269b: 0x6dc3c220, + 0x3269c: 0x6dc3c420, 0x3269d: 0x6dc3c620, 0x3269e: 0x6dc3c820, 0x3269f: 0x6dc3ca20, + 0x326a0: 0x6de09a20, 0x326a1: 0x6de09c20, 0x326a2: 0x6de09e20, 0x326a3: 0x6de0a020, + 0x326a4: 0x6de0a220, 0x326a5: 0x6de0a420, 0x326a6: 0x6de0a620, 0x326a7: 0x6de0a820, + 0x326a8: 0x6de0aa20, 0x326a9: 0x6de0ac20, 0x326aa: 0x6de0ae20, 0x326ab: 0x6de0b020, + 0x326ac: 0x6de0b220, 0x326ad: 0x6de0b420, 0x326ae: 0x6de0b620, 0x326af: 0x6de0b820, + 0x326b0: 0x6dc3cc20, 0x326b1: 0x6de0ba20, 0x326b2: 0x6de0bc20, 0x326b3: 0x6de0be20, + 0x326b4: 0x6de0c020, 0x326b5: 0x6de0c220, 0x326b6: 0x6de0c420, 0x326b7: 0x6de0c620, + 0x326b8: 0x6de0c820, 0x326b9: 0x6de0ca20, 0x326ba: 0x6de0cc20, 0x326bb: 0x6de0ce20, + 0x326bc: 0x6de0d020, 0x326bd: 0x6de0d220, 0x326be: 0x6de0d420, 0x326bf: 0x6de0d620, + // Block 0xc9b, offset 0x326c0 + 0x326c0: 0x6de0d820, 0x326c1: 0x6de0da20, 0x326c2: 0x6de0dc20, 0x326c3: 0x6de0de20, + 0x326c4: 0x6de0e020, 0x326c5: 0x6de0e220, 0x326c6: 0x6de0e420, 0x326c7: 0x6de0e620, + 0x326c8: 0x6de0e820, 0x326c9: 0x6de5dc20, 0x326ca: 0x6de0ea20, 0x326cb: 0x6de0ec20, + 0x326cc: 0x6de0ee20, 0x326cd: 0x6de0f020, 0x326ce: 0x6de0f220, 0x326cf: 0x6de0f420, + 0x326d0: 0x6de0f620, 0x326d1: 0x6df8e220, 0x326d2: 0x6df8e420, 0x326d3: 0x6df8e620, + 0x326d4: 0x6df8e820, 0x326d5: 0x6df8ea20, 0x326d6: 0x6df8ec20, 0x326d7: 0x6df8ee20, + 0x326d8: 0x6df8f020, 0x326d9: 0x6df8f220, 0x326da: 0x6df8f420, 0x326db: 0x6df8f620, + 0x326dc: 0x6df8f820, 0x326dd: 0x6df8fa20, 0x326de: 0x6df8fc20, 0x326df: 0x6df8fe20, + 0x326e0: 0x6df90020, 0x326e1: 0x6df90220, 0x326e2: 0x6df90420, 0x326e3: 0x6df90620, + 0x326e4: 0x6df90820, 0x326e5: 0x6df90a20, 0x326e6: 0x6df90c20, 0x326e7: 0x6df90e20, + 0x326e8: 0x6df91020, 0x326e9: 0x6df91220, 0x326ea: 0x6df91420, 0x326eb: 0x6df91620, + 0x326ec: 0x6df91820, 0x326ed: 0x6df91a20, 0x326ee: 0x6df91c20, 0x326ef: 0x6df91e20, + 0x326f0: 0x6df92020, 0x326f1: 0x6e0cac20, 0x326f2: 0x6e0cae20, 0x326f3: 0x6e0cb020, + 0x326f4: 0x6e0cb220, 0x326f5: 0x6e0cb420, 0x326f6: 0x6e0cb620, 0x326f7: 0x6e0cb820, + 0x326f8: 0x6e0cba20, 0x326f9: 0x6e0cbc20, 0x326fa: 0x6e0cbe20, 0x326fb: 0x6e0cc020, + 0x326fc: 0x6e0cc220, 0x326fd: 0x6e0cc420, 0x326fe: 0x6e0cc620, 0x326ff: 0x6e0cc820, + // Block 0xc9c, offset 0x32700 + 0x32700: 0x6e0cca20, 0x32701: 0x6e0ccc20, 0x32702: 0x6e0cce20, 0x32703: 0x6e0cd020, + 0x32704: 0x6e0cd220, 0x32705: 0x6e0cd420, 0x32706: 0x6e0cd620, 0x32707: 0x6e0cd820, + 0x32708: 0x6e0cda20, 0x32709: 0x6e0cdc20, 0x3270a: 0x6e0cde20, 0x3270b: 0x6e0ce020, + 0x3270c: 0x6e0ce220, 0x3270d: 0x6e0ce420, 0x3270e: 0x6e0ce620, 0x3270f: 0x6e0ce820, + 0x32710: 0x6e0cea20, 0x32711: 0x6e0cec20, 0x32712: 0x6e0cee20, 0x32713: 0x6e0cf020, + 0x32714: 0x6e0cf220, 0x32715: 0x6e0d1c20, 0x32716: 0x6e121420, 0x32717: 0x6e1c4020, + 0x32718: 0x6e1c4220, 0x32719: 0x6e1c4420, 0x3271a: 0x6e1c4620, 0x3271b: 0x6e1c4820, + 0x3271c: 0x6e1c4a20, 0x3271d: 0x6e1c4c20, 0x3271e: 0x6e1c4e20, 0x3271f: 0x6e1c5020, + 0x32720: 0x6e1c5220, 0x32721: 0x6e1c5420, 0x32722: 0x6e1c5620, 0x32723: 0x6e0cf420, + 0x32724: 0x6e1c5820, 0x32725: 0x6e1c5a20, 0x32726: 0x6e1c5c20, 0x32727: 0x6e1c5e20, + 0x32728: 0x6e1c6020, 0x32729: 0x6e1c6220, 0x3272a: 0x6e1c6420, 0x3272b: 0x6e1c6620, + 0x3272c: 0x6e1c6820, 0x3272d: 0x6e1c6a20, 0x3272e: 0x6e1c6c20, 0x3272f: 0x6e1c6e20, + 0x32730: 0x6e287c20, 0x32731: 0x6e287e20, 0x32732: 0x6e288020, 0x32733: 0x6e288220, + 0x32734: 0x6e288420, 0x32735: 0x6e288620, 0x32736: 0x6e288820, 0x32737: 0x6e288a20, + 0x32738: 0x6e288c20, 0x32739: 0x6e31a420, 0x3273a: 0x6e31a620, 0x3273b: 0x6e31a820, + 0x3273c: 0x6e31aa20, 0x3273d: 0x6e31ac20, 0x3273e: 0x6e31ae20, 0x3273f: 0x6e31b020, + // Block 0xc9d, offset 0x32740 + 0x32740: 0x6e31b220, 0x32741: 0x6e31b420, 0x32742: 0x6e31b620, 0x32743: 0x6e31b820, + 0x32744: 0x6e31ba20, 0x32745: 0x6e31bc20, 0x32746: 0x6e384c20, 0x32747: 0x6e384e20, + 0x32748: 0x6e385020, 0x32749: 0x6e385220, 0x3274a: 0x6e385420, 0x3274b: 0x6e385620, + 0x3274c: 0x6e385820, 0x3274d: 0x6e385a20, 0x3274e: 0x6e385c20, 0x3274f: 0x6e3cfa20, + 0x32750: 0x6e3cfc20, 0x32751: 0x6e3cfe20, 0x32752: 0x6e3d0020, 0x32753: 0x6e3d0220, + 0x32754: 0x6e3d0420, 0x32755: 0x6e3d0620, 0x32756: 0x6e3d0820, 0x32757: 0x6e3d0a20, + 0x32758: 0x6e3d0c20, 0x32759: 0x6e400a20, 0x3275a: 0x6e400c20, 0x3275b: 0x6e428620, + 0x3275c: 0x6e428820, 0x3275d: 0x6e428a20, 0x3275e: 0x6e400e20, 0x3275f: 0x6e45bc20, + 0x32760: 0x6c03c820, 0x32761: 0x6c03ca20, 0x32762: 0x6c03cc20, 0x32763: 0x6c079820, + 0x32764: 0x6c079a20, 0x32765: 0x6c079c20, 0x32766: 0x6c079e20, 0x32767: 0x6c0ea620, + 0x32768: 0x6c0ea820, 0x32769: 0x6c0eaa20, 0x3276a: 0x6c0eac20, 0x3276b: 0x6c0eae20, + 0x3276c: 0x6c0eb020, 0x3276d: 0x6c0eb220, 0x3276e: 0x6c0eb420, 0x3276f: 0x6c0eb620, + 0x32770: 0x6c0eb820, 0x32771: 0x6c0eba20, 0x32772: 0x6c0ebc20, 0x32773: 0x6c0ebe20, + 0x32774: 0x6c1a6e20, 0x32775: 0x6c1a7020, 0x32776: 0x6c1a7220, 0x32777: 0x6c1a7420, + 0x32778: 0x6c1a7620, 0x32779: 0x6c1a7820, 0x3277a: 0x6c1a7a20, 0x3277b: 0x6c1a7c20, + 0x3277c: 0x6c1a7e20, 0x3277d: 0x6c1a8020, 0x3277e: 0x6c1a8220, 0x3277f: 0x6c1a8420, + // Block 0xc9e, offset 0x32780 + 0x32780: 0x6c1a8620, 0x32781: 0x6c1a8820, 0x32782: 0x6c1a8a20, 0x32783: 0x6c1a8c20, + 0x32784: 0x6c1a8e20, 0x32785: 0x6c1a9020, 0x32786: 0x6c1a9220, 0x32787: 0x6c1a9420, + 0x32788: 0x6c2d9620, 0x32789: 0x6c2d9820, 0x3278a: 0x6c2d9a20, 0x3278b: 0x6c2d9c20, + 0x3278c: 0x6c2d9e20, 0x3278d: 0x6c3bf620, 0x3278e: 0x6c2da020, 0x3278f: 0x6c2da220, + 0x32790: 0x6c2da420, 0x32791: 0x6c2da620, 0x32792: 0x6c47e220, 0x32793: 0x6c47e420, + 0x32794: 0x6c47e620, 0x32795: 0x6c47e820, 0x32796: 0x6c47ea20, 0x32797: 0x6c47ec20, + 0x32798: 0x6c47ee20, 0x32799: 0x6c47f020, 0x3279a: 0x6c47f220, 0x3279b: 0x6c47f420, + 0x3279c: 0x6c47f620, 0x3279d: 0x6c47f820, 0x3279e: 0x6c47fa20, 0x3279f: 0x6c47fc20, + 0x327a0: 0x6c695c20, 0x327a1: 0x6c695e20, 0x327a2: 0x6c696020, 0x327a3: 0x6c696220, + 0x327a4: 0x6c696420, 0x327a5: 0x6c696620, 0x327a6: 0x6c696820, 0x327a7: 0x6c696a20, + 0x327a8: 0x6c696c20, 0x327a9: 0x6c696e20, 0x327aa: 0x6c697020, 0x327ab: 0x6c697220, + 0x327ac: 0x6c697420, 0x327ad: 0x6c697620, 0x327ae: 0x6c697820, 0x327af: 0x6c697a20, + 0x327b0: 0x6c902820, 0x327b1: 0x6c902a20, 0x327b2: 0x6c902c20, 0x327b3: 0x6c902e20, + 0x327b4: 0x6c903020, 0x327b5: 0x6c903220, 0x327b6: 0x6c903420, 0x327b7: 0x6c903620, + 0x327b8: 0x6c903820, 0x327b9: 0x6c903a20, 0x327ba: 0x6c903c20, 0x327bb: 0x6c903e20, + 0x327bc: 0x6cbc4820, 0x327bd: 0x6cbc4a20, 0x327be: 0x6cbc4c20, 0x327bf: 0x6cbc4e20, + // Block 0xc9f, offset 0x327c0 + 0x327c0: 0x6c904020, 0x327c1: 0x6cbc5020, 0x327c2: 0x6cbc5220, 0x327c3: 0x6cbc5420, + 0x327c4: 0x6cbc5620, 0x327c5: 0x6cbc5820, 0x327c6: 0x6cbc5a20, 0x327c7: 0x6cbc5c20, + 0x327c8: 0x6cbc5e20, 0x327c9: 0x6cbc6020, 0x327ca: 0x6ced3220, 0x327cb: 0x6ced3420, + 0x327cc: 0x6ced3620, 0x327cd: 0x6ced3820, 0x327ce: 0x6ced3a20, 0x327cf: 0x6ced3c20, + 0x327d0: 0x6ced3e20, 0x327d1: 0x6ced4020, 0x327d2: 0x6ced4220, 0x327d3: 0x6ced4420, + 0x327d4: 0x6ced4620, 0x327d5: 0x6d1cfa20, 0x327d6: 0x6d1cfc20, 0x327d7: 0x6d1cfe20, + 0x327d8: 0x6d1d0020, 0x327d9: 0x6d1d0220, 0x327da: 0x6d1d0420, 0x327db: 0x6d1d0620, + 0x327dc: 0x6d1d0820, 0x327dd: 0x6d1d0a20, 0x327de: 0x6d1d0c20, 0x327df: 0x6d1d0e20, + 0x327e0: 0x6d1d1020, 0x327e1: 0x6d1d1220, 0x327e2: 0x6d4ab820, 0x327e3: 0x6d4aba20, + 0x327e4: 0x6d4abc20, 0x327e5: 0x6d785c20, 0x327e6: 0x6d4abe20, 0x327e7: 0x6d4ac020, + 0x327e8: 0x6d4ac220, 0x327e9: 0x6d4ac420, 0x327ea: 0x6d785e20, 0x327eb: 0x6d786020, + 0x327ec: 0x6d786220, 0x327ed: 0x6da17e20, 0x327ee: 0x6da18020, 0x327ef: 0x6da18220, + 0x327f0: 0x6da18420, 0x327f1: 0x6da18620, 0x327f2: 0x6dc3de20, 0x327f3: 0x6de0fe20, + 0x327f4: 0x6de10020, 0x327f5: 0x6df92c20, 0x327f6: 0x6df92e20, 0x327f7: 0x6df93020, + 0x327f8: 0x6e0cf620, 0x327f9: 0x6e0cf820, 0x327fa: 0x6e0cfa20, 0x327fb: 0x6e3d1020, + 0x327fc: 0x6c03d420, 0x327fd: 0x6c03d620, 0x327fe: 0x6c03d820, 0x327ff: 0x6c07ae20, + // Block 0xca0, offset 0x32800 + 0x32800: 0x6c07b020, 0x32801: 0x6c07b220, 0x32802: 0x6c07b420, 0x32803: 0x6c07b620, + 0x32804: 0x6c07b820, 0x32805: 0x6c07ba20, 0x32806: 0x6c07bc20, 0x32807: 0x6c07be20, + 0x32808: 0x6c0ee620, 0x32809: 0x6c0ee820, 0x3280a: 0x6c0eea20, 0x3280b: 0x6c0eec20, + 0x3280c: 0x6c0eee20, 0x3280d: 0x6c0ef020, 0x3280e: 0x6c0ef220, 0x3280f: 0x6c0ef420, + 0x32810: 0x6c0ef620, 0x32811: 0x6c0ef820, 0x32812: 0x6c0efa20, 0x32813: 0x6c0efc20, + 0x32814: 0x6c0efe20, 0x32815: 0x6c0f0020, 0x32816: 0x6c0f0220, 0x32817: 0x6c0fb020, + 0x32818: 0x6c1af820, 0x32819: 0x6c1afa20, 0x3281a: 0x6c1afc20, 0x3281b: 0x6c1afe20, + 0x3281c: 0x6c1b0020, 0x3281d: 0x6c1b0220, 0x3281e: 0x6c1b0420, 0x3281f: 0x6c1b0620, + 0x32820: 0x6c1b0820, 0x32821: 0x6c1b0a20, 0x32822: 0x6c1b0c20, 0x32823: 0x6c1b0e20, + 0x32824: 0x6c1b1020, 0x32825: 0x6c1b1220, 0x32826: 0x6c1b1420, 0x32827: 0x6c1b1620, + 0x32828: 0x6c1b1820, 0x32829: 0x6c1b1a20, 0x3282a: 0x6c1b1c20, 0x3282b: 0x6c1b1e20, + 0x3282c: 0x6c1b2020, 0x3282d: 0x6c1b2220, 0x3282e: 0x6c1b2420, 0x3282f: 0x6c1b2620, + 0x32830: 0x6c1b2820, 0x32831: 0x6c1b2a20, 0x32832: 0x6c1b2c20, 0x32833: 0x6c1b2e20, + 0x32834: 0x6c1b3020, 0x32835: 0x6c1b3220, 0x32836: 0x6c1b3420, 0x32837: 0x6c1b3620, + 0x32838: 0x6c1b3820, 0x32839: 0x6c1b3a20, 0x3283a: 0x6c1b3c20, 0x3283b: 0x6c1b3e20, + 0x3283c: 0x6c1b4020, 0x3283d: 0x6c1b4220, 0x3283e: 0x6c1b4420, 0x3283f: 0x6c1b4620, + // Block 0xca1, offset 0x32840 + 0x32840: 0x6c1b4820, 0x32841: 0x6c1b4a20, 0x32842: 0x6c1b4c20, 0x32843: 0x6c1b4e20, + 0x32844: 0x6c2e0820, 0x32845: 0x6c2e0a20, 0x32846: 0x6c2e0c20, 0x32847: 0x6c2e0e20, + 0x32848: 0x6c2e1020, 0x32849: 0x6c2e1220, 0x3284a: 0x6c2e1420, 0x3284b: 0x6c2e1620, + 0x3284c: 0x6c2e1820, 0x3284d: 0x6c2e1a20, 0x3284e: 0x6c2e1c20, 0x3284f: 0x6c2e1e20, + 0x32850: 0x6c2e2020, 0x32851: 0x6c2e2220, 0x32852: 0x6c2e2420, 0x32853: 0x6c2e2620, + 0x32854: 0x6c2e2820, 0x32855: 0x6c2e2a20, 0x32856: 0x6c2e2c20, 0x32857: 0x6c2e2e20, + 0x32858: 0x6c2e3020, 0x32859: 0x6c2e3220, 0x3285a: 0x6c2e3420, 0x3285b: 0x6c2e3620, + 0x3285c: 0x6c2e3820, 0x3285d: 0x6c2e3a20, 0x3285e: 0x6c2e3c20, 0x3285f: 0x6c2e3e20, + 0x32860: 0x6c2e4020, 0x32861: 0x6c2e4220, 0x32862: 0x6c2e4420, 0x32863: 0x6c2e4620, + 0x32864: 0x6c2e4820, 0x32865: 0x6c2e4a20, 0x32866: 0x6c2e4c20, 0x32867: 0x6c2e4e20, + 0x32868: 0x6c2e5020, 0x32869: 0x6c2e5220, 0x3286a: 0x6c2e5420, 0x3286b: 0x6c2e5620, + 0x3286c: 0x6c2e5820, 0x3286d: 0x6c2e5a20, 0x3286e: 0x6c2e5c20, 0x3286f: 0x6c2e5e20, + 0x32870: 0x6c2e6020, 0x32871: 0x6c2e6220, 0x32872: 0x6c2e6420, 0x32873: 0x6c2e6620, + 0x32874: 0x6c2e6820, 0x32875: 0x6c2e6a20, 0x32876: 0x6c2e6c20, 0x32877: 0x6c486a20, + 0x32878: 0x6c486c20, 0x32879: 0x6c486e20, 0x3287a: 0x6c487020, 0x3287b: 0x6c487220, + 0x3287c: 0x6c487420, 0x3287d: 0x6c487620, 0x3287e: 0x6c487820, 0x3287f: 0x6c487a20, + // Block 0xca2, offset 0x32880 + 0x32880: 0x6c487c20, 0x32881: 0x6c487e20, 0x32882: 0x6c488020, 0x32883: 0x6c488220, + 0x32884: 0x6c488420, 0x32885: 0x6c488620, 0x32886: 0x6c488820, 0x32887: 0x6c488a20, + 0x32888: 0x6c488c20, 0x32889: 0x6c488e20, 0x3288a: 0x6c489020, 0x3288b: 0x6c489220, + 0x3288c: 0x6c489420, 0x3288d: 0x6c489620, 0x3288e: 0x6c489820, 0x3288f: 0x6c489a20, + 0x32890: 0x6c489c20, 0x32891: 0x6c489e20, 0x32892: 0x6c48a020, 0x32893: 0x6c48a220, + 0x32894: 0x6c48a420, 0x32895: 0x6c48a620, 0x32896: 0x6c48a820, 0x32897: 0x6c48aa20, + 0x32898: 0x6c48ac20, 0x32899: 0x6c48ae20, 0x3289a: 0x6c48b020, 0x3289b: 0x6c48b220, + 0x3289c: 0x6c5dc620, 0x3289d: 0x6c48b420, 0x3289e: 0x6c48b620, 0x3289f: 0x6c48b820, + 0x328a0: 0x6c48ba20, 0x328a1: 0x6c48bc20, 0x328a2: 0x6c48be20, 0x328a3: 0x6c48c020, + 0x328a4: 0x6c48c220, 0x328a5: 0x6c48c420, 0x328a6: 0x6c48c620, 0x328a7: 0x6c48c820, + 0x328a8: 0x6c48ca20, 0x328a9: 0x6c48cc20, 0x328aa: 0x6c48ce20, 0x328ab: 0x6c48d020, + 0x328ac: 0x6c48d220, 0x328ad: 0x6c69da20, 0x328ae: 0x6c69dc20, 0x328af: 0x6c69de20, + 0x328b0: 0x6c69e020, 0x328b1: 0x6c69e220, 0x328b2: 0x6c69e420, 0x328b3: 0x6c69e620, + 0x328b4: 0x6c69e820, 0x328b5: 0x6c69ea20, 0x328b6: 0x6c69ec20, 0x328b7: 0x6c69ee20, + 0x328b8: 0x6c69f020, 0x328b9: 0x6c69f220, 0x328ba: 0x6c69f420, 0x328bb: 0x6c69f620, + 0x328bc: 0x6c69f820, 0x328bd: 0x6c69fa20, 0x328be: 0x6c69fc20, 0x328bf: 0x6c69fe20, + // Block 0xca3, offset 0x328c0 + 0x328c0: 0x6c6a0020, 0x328c1: 0x6c6a0220, 0x328c2: 0x6c6a0420, 0x328c3: 0x6c6a0620, + 0x328c4: 0x6c6a0820, 0x328c5: 0x6c6a0a20, 0x328c6: 0x6c6a0c20, 0x328c7: 0x6c6a0e20, + 0x328c8: 0x6c6a1020, 0x328c9: 0x6c6a1220, 0x328ca: 0x6c6a1420, 0x328cb: 0x6c6a1620, + 0x328cc: 0x6c6a1820, 0x328cd: 0x6c6a1a20, 0x328ce: 0x6c6a1c20, 0x328cf: 0x6c6a1e20, + 0x328d0: 0x6c6a2020, 0x328d1: 0x6c6a2220, 0x328d2: 0x6c6a2420, 0x328d3: 0x6c6a2620, + 0x328d4: 0x6c6a2820, 0x328d5: 0x6c6a2a20, 0x328d6: 0x6c6a2c20, 0x328d7: 0x6c6a2e20, + 0x328d8: 0x6c6a3020, 0x328d9: 0x6c6a3220, 0x328da: 0x6c6a3420, 0x328db: 0x6c6a3620, + 0x328dc: 0x6c6a3820, 0x328dd: 0x6c6a3a20, 0x328de: 0x6c6a3c20, 0x328df: 0x6c6a3e20, + 0x328e0: 0x6c6a4020, 0x328e1: 0x6c6a4220, 0x328e2: 0x6c6a4420, 0x328e3: 0x6c6a4620, + 0x328e4: 0x6c6a4820, 0x328e5: 0x6c6a4a20, 0x328e6: 0x6c90c620, 0x328e7: 0x6c90c820, + 0x328e8: 0x6c90ca20, 0x328e9: 0x6c90cc20, 0x328ea: 0x6c90ce20, 0x328eb: 0x6c90d020, + 0x328ec: 0x6c90d220, 0x328ed: 0x6c90d420, 0x328ee: 0x6c90d620, 0x328ef: 0x6c90d820, + 0x328f0: 0x6c90da20, 0x328f1: 0x6c90dc20, 0x328f2: 0x6c90de20, 0x328f3: 0x6c90e020, + 0x328f4: 0x6c90e220, 0x328f5: 0x6c90e420, 0x328f6: 0x6c90e620, 0x328f7: 0x6c90e820, + 0x328f8: 0x6c90ea20, 0x328f9: 0x6c90ec20, 0x328fa: 0x6c90ee20, 0x328fb: 0x6c90f020, + 0x328fc: 0x6c90f220, 0x328fd: 0x6c90f420, 0x328fe: 0x6c90f620, 0x328ff: 0x6c90f820, + // Block 0xca4, offset 0x32900 + 0x32900: 0x6c90fa20, 0x32901: 0x6c90fc20, 0x32902: 0x6c90fe20, 0x32903: 0x6c910020, + 0x32904: 0x6c910220, 0x32905: 0x6c910420, 0x32906: 0x6c910620, 0x32907: 0x6c910820, + 0x32908: 0x6c910a20, 0x32909: 0x6c910c20, 0x3290a: 0x6c910e20, 0x3290b: 0x6c911020, + 0x3290c: 0x6c911220, 0x3290d: 0x6c911420, 0x3290e: 0x6c911620, 0x3290f: 0x6c911820, + 0x32910: 0x6c911a20, 0x32911: 0x6c911c20, 0x32912: 0x6c911e20, 0x32913: 0x6c912020, + 0x32914: 0x6c912220, 0x32915: 0x6c912420, 0x32916: 0x6c912620, 0x32917: 0x6c912820, + 0x32918: 0x6c912a20, 0x32919: 0x6c912c20, 0x3291a: 0x6c912e20, 0x3291b: 0x6c913020, + 0x3291c: 0x6c913220, 0x3291d: 0x6c913420, 0x3291e: 0x6c913620, 0x3291f: 0x6c913820, + 0x32920: 0x6c913a20, 0x32921: 0x6c913c20, 0x32922: 0x6c913e20, 0x32923: 0x6c914020, + 0x32924: 0x6cbcd820, 0x32925: 0x6cbcda20, 0x32926: 0x6cbcdc20, 0x32927: 0x6cbcde20, + 0x32928: 0x6cbce020, 0x32929: 0x6cbce220, 0x3292a: 0x6cbce420, 0x3292b: 0x6cbce620, + 0x3292c: 0x6cbce820, 0x3292d: 0x6cbcea20, 0x3292e: 0x6cbcec20, 0x3292f: 0x6cbcee20, + 0x32930: 0x6cbcf020, 0x32931: 0x6cbcf220, 0x32932: 0x6cbcf420, 0x32933: 0x6cbcf620, + 0x32934: 0x6cbcf820, 0x32935: 0x6cbcfa20, 0x32936: 0x6cbcfc20, 0x32937: 0x6cbcfe20, + 0x32938: 0x6cbd0020, 0x32939: 0x6cbd0220, 0x3293a: 0x6cbd0420, 0x3293b: 0x6cbd0620, + 0x3293c: 0x6cbd0820, 0x3293d: 0x6cbd0a20, 0x3293e: 0x6cbd0c20, 0x3293f: 0x6cbd0e20, + // Block 0xca5, offset 0x32940 + 0x32940: 0x6cbd1020, 0x32941: 0x6cbd1220, 0x32942: 0x6cbd1420, 0x32943: 0x6cbd1620, + 0x32944: 0x6cbd1820, 0x32945: 0x6cbd1a20, 0x32946: 0x6cbd1c20, 0x32947: 0x6cbd1e20, + 0x32948: 0x6cbd2020, 0x32949: 0x6cbd2220, 0x3294a: 0x6cbd2420, 0x3294b: 0x6cbd2620, + 0x3294c: 0x6cbd2820, 0x3294d: 0x6cbd2a20, 0x3294e: 0x6cbd2c20, 0x3294f: 0x6cbd2e20, + 0x32950: 0x6cbd3020, 0x32951: 0x6cbd3220, 0x32952: 0x6cbd3420, 0x32953: 0x6cbd3620, + 0x32954: 0x6cbd3820, 0x32955: 0x6cbd3a20, 0x32956: 0x6cbd3c20, 0x32957: 0x6cbd3e20, + 0x32958: 0x6cbd4020, 0x32959: 0x6cbd4220, 0x3295a: 0x6cbd4420, 0x3295b: 0x6cbd4620, + 0x3295c: 0x6cbd4820, 0x3295d: 0x6cbd4a20, 0x3295e: 0x6cbd4c20, 0x3295f: 0x6cbd4e20, + 0x32960: 0x6cbd5020, 0x32961: 0x6cbd5220, 0x32962: 0x6cbd5420, 0x32963: 0x6cbd5620, + 0x32964: 0x6cbd5820, 0x32965: 0x6cbd5a20, 0x32966: 0x6cbd5c20, 0x32967: 0x6cbd5e20, + 0x32968: 0x6cbd6020, 0x32969: 0x6cbd6220, 0x3296a: 0x6cbd6420, 0x3296b: 0x6cbd6620, + 0x3296c: 0x6cbd6820, 0x3296d: 0x6cbd6a20, 0x3296e: 0x6cedae20, 0x3296f: 0x6cedb020, + 0x32970: 0x6cedb220, 0x32971: 0x6cedb420, 0x32972: 0x6cedb620, 0x32973: 0x6cedb820, + 0x32974: 0x6cedba20, 0x32975: 0x6cedbc20, 0x32976: 0x6cedbe20, 0x32977: 0x6cedc020, + 0x32978: 0x6cedc220, 0x32979: 0x6cedc420, 0x3297a: 0x6cedc620, 0x3297b: 0x6cedc820, + 0x3297c: 0x6cedca20, 0x3297d: 0x6cedcc20, 0x3297e: 0x6cedce20, 0x3297f: 0x6cedd020, + // Block 0xca6, offset 0x32980 + 0x32980: 0x6cedd220, 0x32981: 0x6cedd420, 0x32982: 0x6cedd620, 0x32983: 0x6cedd820, + 0x32984: 0x6cedda20, 0x32985: 0x6ceddc20, 0x32986: 0x6cedde20, 0x32987: 0x6cede020, + 0x32988: 0x6cede220, 0x32989: 0x6cede420, 0x3298a: 0x6cede620, 0x3298b: 0x6cede820, + 0x3298c: 0x6cedea20, 0x3298d: 0x6cedec20, 0x3298e: 0x6cedee20, 0x3298f: 0x6cedf020, + 0x32990: 0x6cedf220, 0x32991: 0x6cedf420, 0x32992: 0x6cedf620, 0x32993: 0x6cedf820, + 0x32994: 0x6cedfa20, 0x32995: 0x6cedfc20, 0x32996: 0x6cedfe20, 0x32997: 0x6cee0020, + 0x32998: 0x6cee0220, 0x32999: 0x6cee0420, 0x3299a: 0x6cee0620, 0x3299b: 0x6cee0820, + 0x3299c: 0x6cee0a20, 0x3299d: 0x6cee0c20, 0x3299e: 0x6cee0e20, 0x3299f: 0x6cee1020, + 0x329a0: 0x6cee1220, 0x329a1: 0x6cee1420, 0x329a2: 0x6cee1620, 0x329a3: 0x6cee1820, + 0x329a4: 0x6cee1a20, 0x329a5: 0x6cee1c20, 0x329a6: 0x6cee1e20, 0x329a7: 0x6cee2020, + 0x329a8: 0x6cee2220, 0x329a9: 0x6cee2420, 0x329aa: 0x6cee2620, 0x329ab: 0x6cee2820, + 0x329ac: 0x6cee2a20, 0x329ad: 0x6d1d7620, 0x329ae: 0x6d1d7820, 0x329af: 0x6d1d7a20, + 0x329b0: 0x6d1d7c20, 0x329b1: 0x6d1d7e20, 0x329b2: 0x6d1d8020, 0x329b3: 0x6d1d8220, + 0x329b4: 0x6d1d8420, 0x329b5: 0x6d1d8620, 0x329b6: 0x6d1d8820, 0x329b7: 0x6d1d8a20, + 0x329b8: 0x6d1d8c20, 0x329b9: 0x6d1d8e20, 0x329ba: 0x6d1d9020, 0x329bb: 0x6d1d9220, + 0x329bc: 0x6d1d9420, 0x329bd: 0x6d1d9620, 0x329be: 0x6d1d9820, 0x329bf: 0x6d1d9a20, + // Block 0xca7, offset 0x329c0 + 0x329c0: 0x6d1d9c20, 0x329c1: 0x6d1d9e20, 0x329c2: 0x6d1da020, 0x329c3: 0x6d1da220, + 0x329c4: 0x6d1da420, 0x329c5: 0x6d1da620, 0x329c6: 0x6d1da820, 0x329c7: 0x6d1daa20, + 0x329c8: 0x6d1dac20, 0x329c9: 0x6d1dae20, 0x329ca: 0x6d1db020, 0x329cb: 0x6d1db220, + 0x329cc: 0x6d1db420, 0x329cd: 0x6d1db620, 0x329ce: 0x6d1db820, 0x329cf: 0x6d1dba20, + 0x329d0: 0x6d1dbc20, 0x329d1: 0x6d1dbe20, 0x329d2: 0x6d1dc020, 0x329d3: 0x6d1dc220, + 0x329d4: 0x6d1dc420, 0x329d5: 0x6d1dc620, 0x329d6: 0x6d1dc820, 0x329d7: 0x6d1dca20, + 0x329d8: 0x6d1dcc20, 0x329d9: 0x6d1dce20, 0x329da: 0x6d1dd020, 0x329db: 0x6d1dd220, + 0x329dc: 0x6d1dd420, 0x329dd: 0x6d1dd620, 0x329de: 0x6d4b1420, 0x329df: 0x6d4b1620, + 0x329e0: 0x6d4b1820, 0x329e1: 0x6d4b1a20, 0x329e2: 0x6d4b1c20, 0x329e3: 0x6d4b1e20, + 0x329e4: 0x6d4b2020, 0x329e5: 0x6d4b2220, 0x329e6: 0x6d4b2420, 0x329e7: 0x6d4b2620, + 0x329e8: 0x6d4b2820, 0x329e9: 0x6d4b2a20, 0x329ea: 0x6d4b2c20, 0x329eb: 0x6d4b2e20, + 0x329ec: 0x6d4b3020, 0x329ed: 0x6d4b3220, 0x329ee: 0x6d4b3420, 0x329ef: 0x6d4b3620, + 0x329f0: 0x6d4b3820, 0x329f1: 0x6d4b3a20, 0x329f2: 0x6d4b3c20, 0x329f3: 0x6d4b3e20, + 0x329f4: 0x6d4b4020, 0x329f5: 0x6d4b4220, 0x329f6: 0x6d4b4420, 0x329f7: 0x6d4b4620, + 0x329f8: 0x6d4b4820, 0x329f9: 0x6d4b4a20, 0x329fa: 0x6d4b4c20, 0x329fb: 0x6d4b4e20, + 0x329fc: 0x6d4b5020, 0x329fd: 0x6d4b5220, 0x329fe: 0x6d4b5420, 0x329ff: 0x6d4b5620, + // Block 0xca8, offset 0x32a00 + 0x32a00: 0x6d4b5820, 0x32a01: 0x6d4b5a20, 0x32a02: 0x6d4b5c20, 0x32a03: 0x6d4b5e20, + 0x32a04: 0x6d4b6020, 0x32a05: 0x6d4b6220, 0x32a06: 0x6d4b6420, 0x32a07: 0x6d4b6620, + 0x32a08: 0x6d4b6820, 0x32a09: 0x6d4b6a20, 0x32a0a: 0x6d4b6c20, 0x32a0b: 0x6d4b6e20, + 0x32a0c: 0x6d4b7020, 0x32a0d: 0x6d4b7220, 0x32a0e: 0x6d4b7420, 0x32a0f: 0x6d4b7620, + 0x32a10: 0x6d4b7820, 0x32a11: 0x6d4b7a20, 0x32a12: 0x6d4b7c20, 0x32a13: 0x6d4b7e20, + 0x32a14: 0x6d4b8020, 0x32a15: 0x6d4b8220, 0x32a16: 0x6d4b8420, 0x32a17: 0x6d4b8620, + 0x32a18: 0x6d4b8820, 0x32a19: 0x6d4b8a20, 0x32a1a: 0x6d4b8c20, 0x32a1b: 0x6d4b8e20, + 0x32a1c: 0x6d4b9020, 0x32a1d: 0x6d4b9220, 0x32a1e: 0x6d789c20, 0x32a1f: 0x6d789e20, + 0x32a20: 0x6d78a020, 0x32a21: 0x6d78a220, 0x32a22: 0x6d78a420, 0x32a23: 0x6d78a620, + 0x32a24: 0x6d78a820, 0x32a25: 0x6d78aa20, 0x32a26: 0x6d78ac20, 0x32a27: 0x6d78ae20, + 0x32a28: 0x6d78b020, 0x32a29: 0x6d78b220, 0x32a2a: 0x6d78b420, 0x32a2b: 0x6d78b620, + 0x32a2c: 0x6d78b820, 0x32a2d: 0x6d78ba20, 0x32a2e: 0x6d78bc20, 0x32a2f: 0x6d78be20, + 0x32a30: 0x6d78c020, 0x32a31: 0x6d78c220, 0x32a32: 0x6d78c420, 0x32a33: 0x6d78c620, + 0x32a34: 0x6d78c820, 0x32a35: 0x6d78ca20, 0x32a36: 0x6d78cc20, 0x32a37: 0x6d78ce20, + 0x32a38: 0x6d78d020, 0x32a39: 0x6d78d220, 0x32a3a: 0x6d980c20, 0x32a3b: 0x6d78d420, + 0x32a3c: 0x6d78d620, 0x32a3d: 0x6d78d820, 0x32a3e: 0x6d78da20, 0x32a3f: 0x6d78dc20, + // Block 0xca9, offset 0x32a40 + 0x32a40: 0x6d78de20, 0x32a41: 0x6d78e020, 0x32a42: 0x6d78e220, 0x32a43: 0x6d78e420, + 0x32a44: 0x6d78e620, 0x32a45: 0x6d78e820, 0x32a46: 0x6d78ea20, 0x32a47: 0x6d78ec20, + 0x32a48: 0x6d78ee20, 0x32a49: 0x6da1a820, 0x32a4a: 0x6da1aa20, 0x32a4b: 0x6da1ac20, + 0x32a4c: 0x6da1ae20, 0x32a4d: 0x6da1b020, 0x32a4e: 0x6da1b220, 0x32a4f: 0x6da1b420, + 0x32a50: 0x6da1b620, 0x32a51: 0x6da1b820, 0x32a52: 0x6da1ba20, 0x32a53: 0x6da1bc20, + 0x32a54: 0x6da1be20, 0x32a55: 0x6da1c020, 0x32a56: 0x6da1c220, 0x32a57: 0x6da1c420, + 0x32a58: 0x6da1c620, 0x32a59: 0x6da1c820, 0x32a5a: 0x6da1ca20, 0x32a5b: 0x6da1cc20, + 0x32a5c: 0x6da1ce20, 0x32a5d: 0x6da1d020, 0x32a5e: 0x6da1d220, 0x32a5f: 0x6da1d420, + 0x32a60: 0x6da1d620, 0x32a61: 0x6dc1f820, 0x32a62: 0x6da1d820, 0x32a63: 0x6da1da20, + 0x32a64: 0x6da1dc20, 0x32a65: 0x6da1de20, 0x32a66: 0x6da1e020, 0x32a67: 0x6da1e220, + 0x32a68: 0x6da1e420, 0x32a69: 0x6da1e620, 0x32a6a: 0x6da1e820, 0x32a6b: 0x6da1ea20, + 0x32a6c: 0x6da1ec20, 0x32a6d: 0x6da1ee20, 0x32a6e: 0x6da1f020, 0x32a6f: 0x6da1f220, + 0x32a70: 0x6dc3ea20, 0x32a71: 0x6dc3ec20, 0x32a72: 0x6dc3ee20, 0x32a73: 0x6dc3f020, + 0x32a74: 0x6dc3f220, 0x32a75: 0x6dc3f420, 0x32a76: 0x6dc3f620, 0x32a77: 0x6dc3f820, + 0x32a78: 0x6dc3fa20, 0x32a79: 0x6dc3fc20, 0x32a7a: 0x6dc3fe20, 0x32a7b: 0x6dc40020, + 0x32a7c: 0x6dc40220, 0x32a7d: 0x6dc40420, 0x32a7e: 0x6dc40620, 0x32a7f: 0x6dc40820, + // Block 0xcaa, offset 0x32a80 + 0x32a80: 0x6de11620, 0x32a81: 0x6dc40a20, 0x32a82: 0x6dc40c20, 0x32a83: 0x6dc40e20, + 0x32a84: 0x6dc41020, 0x32a85: 0x6dc41220, 0x32a86: 0x6dc41420, 0x32a87: 0x6dc41620, + 0x32a88: 0x6dc41820, 0x32a89: 0x6dc41a20, 0x32a8a: 0x6dc41c20, 0x32a8b: 0x6dc41e20, + 0x32a8c: 0x6dc42020, 0x32a8d: 0x6dc42220, 0x32a8e: 0x6dc42420, 0x32a8f: 0x6dc42620, + 0x32a90: 0x6de11820, 0x32a91: 0x6de11a20, 0x32a92: 0x6de11c20, 0x32a93: 0x6de11e20, + 0x32a94: 0x6de12020, 0x32a95: 0x6de12220, 0x32a96: 0x6de12420, 0x32a97: 0x6de12620, + 0x32a98: 0x6de12820, 0x32a99: 0x6de12a20, 0x32a9a: 0x6de12c20, 0x32a9b: 0x6dede420, + 0x32a9c: 0x6de12e20, 0x32a9d: 0x6de13020, 0x32a9e: 0x6de13220, 0x32a9f: 0x6de13420, + 0x32aa0: 0x6de13620, 0x32aa1: 0x6de13820, 0x32aa2: 0x6de13a20, 0x32aa3: 0x6de13c20, + 0x32aa4: 0x6de13e20, 0x32aa5: 0x6de14020, 0x32aa6: 0x6df93a20, 0x32aa7: 0x6df93c20, + 0x32aa8: 0x6df93e20, 0x32aa9: 0x6df94020, 0x32aaa: 0x6df94220, 0x32aab: 0x6df94420, + 0x32aac: 0x6df94620, 0x32aad: 0x6df94820, 0x32aae: 0x6df94a20, 0x32aaf: 0x6df94c20, + 0x32ab0: 0x6df94e20, 0x32ab1: 0x6e0cfe20, 0x32ab2: 0x6e0d0020, 0x32ab3: 0x6e0d0220, + 0x32ab4: 0x6e0d0420, 0x32ab5: 0x6e0d0620, 0x32ab6: 0x6e0d0820, 0x32ab7: 0x6e078620, + 0x32ab8: 0x6e0d0a20, 0x32ab9: 0x6e0d0c20, 0x32aba: 0x6e1c7620, 0x32abb: 0x6e0d0e20, + 0x32abc: 0x6e0d1020, 0x32abd: 0x6e0d1220, 0x32abe: 0x6e0d1420, 0x32abf: 0x6e0d1620, + // Block 0xcab, offset 0x32ac0 + 0x32ac0: 0x6e0d1820, 0x32ac1: 0x6e0d1a20, 0x32ac2: 0x6e1c7820, 0x32ac3: 0x6e1c7a20, + 0x32ac4: 0x6e1c7c20, 0x32ac5: 0x6e1c7e20, 0x32ac6: 0x6e1c8020, 0x32ac7: 0x6e1c8220, + 0x32ac8: 0x6e1c8420, 0x32ac9: 0x6e1c8620, 0x32aca: 0x6e289220, 0x32acb: 0x6e289420, + 0x32acc: 0x6e289620, 0x32acd: 0x6e289820, 0x32ace: 0x6e289a20, 0x32acf: 0x6e31c620, + 0x32ad0: 0x6e31c820, 0x32ad1: 0x6e31ca20, 0x32ad2: 0x6e31cc20, 0x32ad3: 0x6e31ce20, + 0x32ad4: 0x6e31d020, 0x32ad5: 0x6e31d220, 0x32ad6: 0x6e3d1220, 0x32ad7: 0x6e442620, + 0x32ad8: 0x6e451820, 0x32ad9: 0x6e46e220, 0x32ada: 0x6e471e20, 0x32adb: 0x6c07c620, + 0x32adc: 0x6c0f1020, 0x32add: 0x6c1b7020, 0x32ade: 0x6c1b7220, 0x32adf: 0x6c2e7e20, + 0x32ae0: 0x6c48ea20, 0x32ae1: 0x6c48ec20, 0x32ae2: 0x6c48ee20, 0x32ae3: 0x6c6a7220, + 0x32ae4: 0x6c6a7420, 0x32ae5: 0x6c6a7620, 0x32ae6: 0x6c6a7820, 0x32ae7: 0x6c6a7a20, + 0x32ae8: 0x6c6a7c20, 0x32ae9: 0x6c6a7e20, 0x32aea: 0x6c916620, 0x32aeb: 0x6c916820, + 0x32aec: 0x6c916a20, 0x32aed: 0x6c916c20, 0x32aee: 0x6cbd8e20, 0x32aef: 0x6cbd9020, + 0x32af0: 0x6cee5020, 0x32af1: 0x6cbdc220, 0x32af2: 0x6cee5220, 0x32af3: 0x6cee5420, + 0x32af4: 0x6cee5620, 0x32af5: 0x6cee5820, 0x32af6: 0x6d1df820, 0x32af7: 0x6d187e20, + 0x32af8: 0x6d1dfa20, 0x32af9: 0x6d1dfc20, 0x32afa: 0x6d1dfe20, 0x32afb: 0x6d1e0020, + 0x32afc: 0x6d4ba620, 0x32afd: 0x6d4ba820, 0x32afe: 0x6d790220, 0x32aff: 0x6d790420, + // Block 0xcac, offset 0x32b00 + 0x32b00: 0x6d790620, 0x32b01: 0x6da20020, 0x32b02: 0x6da20220, 0x32b03: 0x6da20420, + 0x32b04: 0x6da20620, 0x32b05: 0x6dc43020, 0x32b06: 0x6dd50620, 0x32b07: 0x6dc43220, + 0x32b08: 0x6dc43420, 0x32b09: 0x6dc43620, 0x32b0a: 0x6dc43820, 0x32b0b: 0x6de14420, + 0x32b0c: 0x6de14620, 0x32b0d: 0x6df95220, 0x32b0e: 0x6dfe0820, 0x32b0f: 0x6e1c8820, + 0x32b10: 0x6e1c8a20, 0x32b11: 0x6e1c8c20, 0x32b12: 0x6c018a20, 0x32b13: 0x6c07ca20, + 0x32b14: 0x6c07cc20, 0x32b15: 0x6c0f1420, 0x32b16: 0x6c0f1620, 0x32b17: 0x6c1b7620, + 0x32b18: 0x6c1b7820, 0x32b19: 0x6c1b7a20, 0x32b1a: 0x6c6a8220, 0x32b1b: 0x6c917020, + 0x32b1c: 0x6c917220, 0x32b1d: 0x6cee5c20, 0x32b1e: 0x6c0f1820, 0x32b1f: 0x6c0f1a20, + 0x32b20: 0x6c1b7e20, 0x32b21: 0x6c1b8020, 0x32b22: 0x6c2e8420, 0x32b23: 0x6c2e8620, + 0x32b24: 0x6c2e8820, 0x32b25: 0x6c2e8a20, 0x32b26: 0x6c6a8a20, 0x32b27: 0x6c917420, + 0x32b28: 0x6c917620, 0x32b29: 0x6c917820, 0x32b2a: 0x6c917a20, 0x32b2b: 0x6c917c20, + 0x32b2c: 0x6c917e20, 0x32b2d: 0x6cbd9620, 0x32b2e: 0x6cee6020, 0x32b2f: 0x6cee6220, + 0x32b30: 0x6cee6420, 0x32b31: 0x6cee6620, 0x32b32: 0x6d1e0420, 0x32b33: 0x6d1e0620, + 0x32b34: 0x6d1e0820, 0x32b35: 0x6d1e0a20, 0x32b36: 0x6d4baa20, 0x32b37: 0x6d4bac20, + 0x32b38: 0x6d790820, 0x32b39: 0x6d790a20, 0x32b3a: 0x6d790c20, 0x32b3b: 0x6da20820, + 0x32b3c: 0x6dc43e20, 0x32b3d: 0x6dc44020, 0x32b3e: 0x6dc44220, 0x32b3f: 0x6dc44420, + // Block 0xcad, offset 0x32b40 + 0x32b40: 0x6de14a20, 0x32b41: 0x6df95620, 0x32b42: 0x6e289c20, 0x32b43: 0x6e451a20, + 0x32b44: 0x6c07d620, 0x32b45: 0x6c07d820, 0x32b46: 0x6c07da20, 0x32b47: 0x6c0f2220, + 0x32b48: 0x6c0f2420, 0x32b49: 0x6c0f2620, 0x32b4a: 0x6c1b8220, 0x32b4b: 0x6c1b8420, + 0x32b4c: 0x6c1b8620, 0x32b4d: 0x6c2e9220, 0x32b4e: 0x6c2e9420, 0x32b4f: 0x6c2e9620, + 0x32b50: 0x6c48fc20, 0x32b51: 0x6c48fe20, 0x32b52: 0x6c6a9020, 0x32b53: 0x6c6a9220, + 0x32b54: 0x6c6a9420, 0x32b55: 0x6c6a9620, 0x32b56: 0x6c6a9820, 0x32b57: 0x6c6a9a20, + 0x32b58: 0x6c6a9c20, 0x32b59: 0x6c6a9e20, 0x32b5a: 0x6c6aa020, 0x32b5b: 0x6c6aa220, + 0x32b5c: 0x6c6aa420, 0x32b5d: 0x6c918420, 0x32b5e: 0x6c918620, 0x32b5f: 0x6c918820, + 0x32b60: 0x6c918a20, 0x32b61: 0x6c918c20, 0x32b62: 0x6c918e20, 0x32b63: 0x6c919020, + 0x32b64: 0x6c919220, 0x32b65: 0x6c919420, 0x32b66: 0x6cbda020, 0x32b67: 0x6cbda220, + 0x32b68: 0x6cbda420, 0x32b69: 0x6cbda620, 0x32b6a: 0x6cbda820, 0x32b6b: 0x6cbdaa20, + 0x32b6c: 0x6cbdac20, 0x32b6d: 0x6cbdae20, 0x32b6e: 0x6cbdb020, 0x32b6f: 0x6cee6a20, + 0x32b70: 0x6cbdb220, 0x32b71: 0x6cee6c20, 0x32b72: 0x6cee6e20, 0x32b73: 0x6cee7020, + 0x32b74: 0x6cee7220, 0x32b75: 0x6cee7420, 0x32b76: 0x6d1e1820, 0x32b77: 0x6d1e1a20, + 0x32b78: 0x6d1e1c20, 0x32b79: 0x6d1e1e20, 0x32b7a: 0x6d1e2020, 0x32b7b: 0x6d1e2220, + 0x32b7c: 0x6d1e2420, 0x32b7d: 0x6d1e2620, 0x32b7e: 0x6d1e2820, 0x32b7f: 0x6d4bb020, + // Block 0xcae, offset 0x32b80 + 0x32b80: 0x6d4bb220, 0x32b81: 0x6d4bb420, 0x32b82: 0x6d791220, 0x32b83: 0x6d791420, + 0x32b84: 0x6d791620, 0x32b85: 0x6d791820, 0x32b86: 0x6da20c20, 0x32b87: 0x6da20e20, + 0x32b88: 0x6da21020, 0x32b89: 0x6dc44820, 0x32b8a: 0x6dc44a20, 0x32b8b: 0x6de14c20, + 0x32b8c: 0x6de14e20, 0x32b8d: 0x6e0d2020, 0x32b8e: 0x6e0d2220, 0x32b8f: 0x6e3d1420, + 0x32b90: 0x6de15020, 0x32b91: 0x6e45be20, 0x32b92: 0x6c03e820, 0x32b93: 0x6c03ea20, + 0x32b94: 0x6c03ec20, 0x32b95: 0x6c07ec20, 0x32b96: 0x6c07ee20, 0x32b97: 0x6c07f020, + 0x32b98: 0x6c07f220, 0x32b99: 0x6c07f420, 0x32b9a: 0x6c07f620, 0x32b9b: 0x6c07f820, + 0x32b9c: 0x6c04f620, 0x32b9d: 0x6c0f4420, 0x32b9e: 0x6c0f4620, 0x32b9f: 0x6c0f4820, + 0x32ba0: 0x6c0f4a20, 0x32ba1: 0x6c0f4c20, 0x32ba2: 0x6c0f4e20, 0x32ba3: 0x6c0f5020, + 0x32ba4: 0x6c0f5220, 0x32ba5: 0x6c1b9a20, 0x32ba6: 0x6c1b9c20, 0x32ba7: 0x6c1b9e20, + 0x32ba8: 0x6c1ba020, 0x32ba9: 0x6c1ba220, 0x32baa: 0x6c1ba420, 0x32bab: 0x6c1ba620, + 0x32bac: 0x6c1ba820, 0x32bad: 0x6c1baa20, 0x32bae: 0x6c1bac20, 0x32baf: 0x6c1bae20, + 0x32bb0: 0x6c1bb020, 0x32bb1: 0x6c1bb220, 0x32bb2: 0x6c1bb420, 0x32bb3: 0x6c1bb620, + 0x32bb4: 0x6c1bb820, 0x32bb5: 0x6c1bba20, 0x32bb6: 0x6c1bbc20, 0x32bb7: 0x6c2eba20, + 0x32bb8: 0x6c2ebc20, 0x32bb9: 0x6c2ebe20, 0x32bba: 0x6c2ec020, 0x32bbb: 0x6c2ec220, + 0x32bbc: 0x6c2ec420, 0x32bbd: 0x6c2ec620, 0x32bbe: 0x6c2ec820, 0x32bbf: 0x6c2eca20, + // Block 0xcaf, offset 0x32bc0 + 0x32bc0: 0x6c2ecc20, 0x32bc1: 0x6c2ece20, 0x32bc2: 0x6c2ed020, 0x32bc3: 0x6c2ed220, + 0x32bc4: 0x6c2ed420, 0x32bc5: 0x6c2ed620, 0x32bc6: 0x6c2ed820, 0x32bc7: 0x6c2eda20, + 0x32bc8: 0x6c2edc20, 0x32bc9: 0x6c2ede20, 0x32bca: 0x6c2ee020, 0x32bcb: 0x6c2ee220, + 0x32bcc: 0x6c2ee420, 0x32bcd: 0x6c491620, 0x32bce: 0x6c491820, 0x32bcf: 0x6c491a20, + 0x32bd0: 0x6c491c20, 0x32bd1: 0x6c491e20, 0x32bd2: 0x6c492020, 0x32bd3: 0x6c492220, + 0x32bd4: 0x6c492420, 0x32bd5: 0x6c492620, 0x32bd6: 0x6c492820, 0x32bd7: 0x6c492a20, + 0x32bd8: 0x6c492c20, 0x32bd9: 0x6c492e20, 0x32bda: 0x6c493020, 0x32bdb: 0x6c493220, + 0x32bdc: 0x6c493420, 0x32bdd: 0x6c6ab420, 0x32bde: 0x6c6ab620, 0x32bdf: 0x6c6ab820, + 0x32be0: 0x6c6aba20, 0x32be1: 0x6c6abc20, 0x32be2: 0x6c6abe20, 0x32be3: 0x6c6ac020, + 0x32be4: 0x6c6ac220, 0x32be5: 0x6c6ac420, 0x32be6: 0x6c6ac620, 0x32be7: 0x6c6ac820, + 0x32be8: 0x6c6aca20, 0x32be9: 0x6c6acc20, 0x32bea: 0x6c6ace20, 0x32beb: 0x6c6ad020, + 0x32bec: 0x6c6ad220, 0x32bed: 0x6c6ad420, 0x32bee: 0x6c6ad620, 0x32bef: 0x6c6ad820, + 0x32bf0: 0x6c6ada20, 0x32bf1: 0x6c6adc20, 0x32bf2: 0x6c6ade20, 0x32bf3: 0x6c6ae020, + 0x32bf4: 0x6c91a620, 0x32bf5: 0x6c91a820, 0x32bf6: 0x6c91aa20, 0x32bf7: 0x6c91ac20, + 0x32bf8: 0x6c91ae20, 0x32bf9: 0x6c91b020, 0x32bfa: 0x6c91b220, 0x32bfb: 0x6c91b420, + 0x32bfc: 0x6c91b620, 0x32bfd: 0x6c91b820, 0x32bfe: 0x6c91ba20, 0x32bff: 0x6c91bc20, + // Block 0xcb0, offset 0x32c00 + 0x32c00: 0x6c91be20, 0x32c01: 0x6c91c020, 0x32c02: 0x6c91c220, 0x32c03: 0x6c91c420, + 0x32c04: 0x6c91c620, 0x32c05: 0x6c91c820, 0x32c06: 0x6c91ca20, 0x32c07: 0x6cbdc420, + 0x32c08: 0x6cbdc620, 0x32c09: 0x6cbdc820, 0x32c0a: 0x6cbdca20, 0x32c0b: 0x6cbdcc20, + 0x32c0c: 0x6cbdce20, 0x32c0d: 0x6cbdd020, 0x32c0e: 0x6cbdd220, 0x32c0f: 0x6cbdd420, + 0x32c10: 0x6cbdd620, 0x32c11: 0x6cbdd820, 0x32c12: 0x6cbdda20, 0x32c13: 0x6cbddc20, + 0x32c14: 0x6cbdde20, 0x32c15: 0x6cbde020, 0x32c16: 0x6cbde220, 0x32c17: 0x6cbde420, + 0x32c18: 0x6cbde620, 0x32c19: 0x6cbde820, 0x32c1a: 0x6cbdea20, 0x32c1b: 0x6cee7e20, + 0x32c1c: 0x6cee8020, 0x32c1d: 0x6cee8220, 0x32c1e: 0x6cee8420, 0x32c1f: 0x6cee8620, + 0x32c20: 0x6cee8820, 0x32c21: 0x6cee8a20, 0x32c22: 0x6cee8c20, 0x32c23: 0x6cee8e20, + 0x32c24: 0x6cee9020, 0x32c25: 0x6cee9220, 0x32c26: 0x6cee9420, 0x32c27: 0x6cee9620, + 0x32c28: 0x6cee9820, 0x32c29: 0x6cee9a20, 0x32c2a: 0x6cee9c20, 0x32c2b: 0x6cee9e20, + 0x32c2c: 0x6d1e3620, 0x32c2d: 0x6d1e3820, 0x32c2e: 0x6d1e3a20, 0x32c2f: 0x6d1e3c20, + 0x32c30: 0x6d1e3e20, 0x32c31: 0x6d1e4020, 0x32c32: 0x6d1e4220, 0x32c33: 0x6d1e4420, + 0x32c34: 0x6d1e4620, 0x32c35: 0x6d1e4820, 0x32c36: 0x6d1e4a20, 0x32c37: 0x6d4bba20, + 0x32c38: 0x6d4bbc20, 0x32c39: 0x6d4bbe20, 0x32c3a: 0x6d4bc020, 0x32c3b: 0x6d4bc220, + 0x32c3c: 0x6d4bc420, 0x32c3d: 0x6d4bc620, 0x32c3e: 0x6d4bc820, 0x32c3f: 0x6d4bca20, + // Block 0xcb1, offset 0x32c40 + 0x32c40: 0x6d4bcc20, 0x32c41: 0x6d4bce20, 0x32c42: 0x6d4bd020, 0x32c43: 0x6d4bd220, + 0x32c44: 0x6d4bd420, 0x32c45: 0x6d4bd620, 0x32c46: 0x6d792220, 0x32c47: 0x6d792420, + 0x32c48: 0x6d792620, 0x32c49: 0x6d792820, 0x32c4a: 0x6d792a20, 0x32c4b: 0x6d792c20, + 0x32c4c: 0x6d792e20, 0x32c4d: 0x6d793020, 0x32c4e: 0x6d793220, 0x32c4f: 0x6da21220, + 0x32c50: 0x6da21420, 0x32c51: 0x6da21620, 0x32c52: 0x6da21820, 0x32c53: 0x6da21a20, + 0x32c54: 0x6da21c20, 0x32c55: 0x6da21e20, 0x32c56: 0x6da22020, 0x32c57: 0x6dc44e20, + 0x32c58: 0x6de15220, 0x32c59: 0x6de15420, 0x32c5a: 0x6de15620, 0x32c5b: 0x6df95820, + 0x32c5c: 0x6e0d2420, 0x32c5d: 0x6e0d2620, 0x32c5e: 0x6e1c9420, 0x32c5f: 0x6e1c9620, + 0x32c60: 0x6e289e20, 0x32c61: 0x6e28a020, 0x32c62: 0x6e28a220, 0x32c63: 0x6e31d420, + 0x32c64: 0x6e31d620, 0x32c65: 0x6e401220, 0x32c66: 0x6c03f020, 0x32c67: 0x6c080420, + 0x32c68: 0x6c080620, 0x32c69: 0x6c080820, 0x32c6a: 0x6c080a20, 0x32c6b: 0x6c080c20, + 0x32c6c: 0x6c080e20, 0x32c6d: 0x6c081020, 0x32c6e: 0x6c0f8620, 0x32c6f: 0x6c0f8820, + 0x32c70: 0x6c0f8a20, 0x32c71: 0x6c0f8c20, 0x32c72: 0x6c0f8e20, 0x32c73: 0x6c0f9020, + 0x32c74: 0x6c0f9220, 0x32c75: 0x6c0f9420, 0x32c76: 0x6c0f9620, 0x32c77: 0x6c0f9820, + 0x32c78: 0x6c0f9a20, 0x32c79: 0x6c0f9c20, 0x32c7a: 0x6c0f9e20, 0x32c7b: 0x6c0fa020, + 0x32c7c: 0x6c1c1820, 0x32c7d: 0x6c1c1a20, 0x32c7e: 0x6c1c1c20, 0x32c7f: 0x6c1c1e20, + // Block 0xcb2, offset 0x32c80 + 0x32c80: 0x6c1c2020, 0x32c81: 0x6c1c2220, 0x32c82: 0x6c1c2420, 0x32c83: 0x6c1c2620, + 0x32c84: 0x6c1c2820, 0x32c85: 0x6c1c2a20, 0x32c86: 0x6c1c2c20, 0x32c87: 0x6c1c2e20, + 0x32c88: 0x6c1c3020, 0x32c89: 0x6c1c3220, 0x32c8a: 0x6c1c3420, 0x32c8b: 0x6c1c3620, + 0x32c8c: 0x6c1c3820, 0x32c8d: 0x6c1c3a20, 0x32c8e: 0x6c1c3c20, 0x32c8f: 0x6c1c3e20, + 0x32c90: 0x6c1c4020, 0x32c91: 0x6c1c4220, 0x32c92: 0x6c1c4420, 0x32c93: 0x6c1c4620, + 0x32c94: 0x6c1c4820, 0x32c95: 0x6c1c4a20, 0x32c96: 0x6c1c4c20, 0x32c97: 0x6c1c4e20, + 0x32c98: 0x6c1c5020, 0x32c99: 0x6c2f6e20, 0x32c9a: 0x6c2f7020, 0x32c9b: 0x6c2f7220, + 0x32c9c: 0x6c2f7420, 0x32c9d: 0x6c2f7620, 0x32c9e: 0x6c2f7820, 0x32c9f: 0x6c2f7a20, + 0x32ca0: 0x6c2f7c20, 0x32ca1: 0x6c2f7e20, 0x32ca2: 0x6c2f8020, 0x32ca3: 0x6c2f8220, + 0x32ca4: 0x6c2f8420, 0x32ca5: 0x6c2f8620, 0x32ca6: 0x6c2f8820, 0x32ca7: 0x6c2f8a20, + 0x32ca8: 0x6c2f8c20, 0x32ca9: 0x6c2f8e20, 0x32caa: 0x6c2f9020, 0x32cab: 0x6c2f9220, + 0x32cac: 0x6c2f9420, 0x32cad: 0x6c2f9620, 0x32cae: 0x6c2f9820, 0x32caf: 0x6c2f9a20, + 0x32cb0: 0x6c2f9c20, 0x32cb1: 0x6c2f9e20, 0x32cb2: 0x6c2fa020, 0x32cb3: 0x6c2fa220, + 0x32cb4: 0x6c2fa420, 0x32cb5: 0x6c2fa620, 0x32cb6: 0x6c2fa820, 0x32cb7: 0x6c2faa20, + 0x32cb8: 0x6c2fac20, 0x32cb9: 0x6c2fae20, 0x32cba: 0x6c2fb020, 0x32cbb: 0x6c2fb220, + 0x32cbc: 0x6c2fb420, 0x32cbd: 0x6c2fb620, 0x32cbe: 0x6c2fb820, 0x32cbf: 0x6c2fba20, + // Block 0xcb3, offset 0x32cc0 + 0x32cc0: 0x6c2fbc20, 0x32cc1: 0x6c2fbe20, 0x32cc2: 0x6c49b420, 0x32cc3: 0x6c49b620, + 0x32cc4: 0x6c49b820, 0x32cc5: 0x6c49ba20, 0x32cc6: 0x6c49bc20, 0x32cc7: 0x6c49be20, + 0x32cc8: 0x6c49c020, 0x32cc9: 0x6c49c220, 0x32cca: 0x6c49c420, 0x32ccb: 0x6c49c620, + 0x32ccc: 0x6c49c820, 0x32ccd: 0x6c49ca20, 0x32cce: 0x6c49cc20, 0x32ccf: 0x6c49ce20, + 0x32cd0: 0x6c49d020, 0x32cd1: 0x6c49d220, 0x32cd2: 0x6c49d420, 0x32cd3: 0x6c49d620, + 0x32cd4: 0x6c49d820, 0x32cd5: 0x6c49da20, 0x32cd6: 0x6c49dc20, 0x32cd7: 0x6c49de20, + 0x32cd8: 0x6c49e020, 0x32cd9: 0x6c49e220, 0x32cda: 0x6c49e420, 0x32cdb: 0x6c49e620, + 0x32cdc: 0x6c49e820, 0x32cdd: 0x6c49ea20, 0x32cde: 0x6c49ec20, 0x32cdf: 0x6c49ee20, + 0x32ce0: 0x6c49f020, 0x32ce1: 0x6c49f220, 0x32ce2: 0x6c49f420, 0x32ce3: 0x6c49f620, + 0x32ce4: 0x6c49f820, 0x32ce5: 0x6c49fa20, 0x32ce6: 0x6c49fc20, 0x32ce7: 0x6c49fe20, + 0x32ce8: 0x6c4a0020, 0x32ce9: 0x6c4a0220, 0x32cea: 0x6c4a0420, 0x32ceb: 0x6c4a0620, + 0x32cec: 0x6c4a0820, 0x32ced: 0x6c4a0a20, 0x32cee: 0x6c6b6c20, 0x32cef: 0x6c6b6e20, + 0x32cf0: 0x6c6b7020, 0x32cf1: 0x6c6b7220, 0x32cf2: 0x6c6b7420, 0x32cf3: 0x6c6b7620, + 0x32cf4: 0x6c6b7820, 0x32cf5: 0x6c6b7a20, 0x32cf6: 0x6c6b7c20, 0x32cf7: 0x6c6b7e20, + 0x32cf8: 0x6c6b8020, 0x32cf9: 0x6c6b8220, 0x32cfa: 0x6c6b8420, 0x32cfb: 0x6c6b8620, + 0x32cfc: 0x6c6b8820, 0x32cfd: 0x6c6b8a20, 0x32cfe: 0x6c6b8c20, 0x32cff: 0x6c6b8e20, + // Block 0xcb4, offset 0x32d00 + 0x32d00: 0x6c6b9020, 0x32d01: 0x6c6b9220, 0x32d02: 0x6c6b9420, 0x32d03: 0x6c6b9620, + 0x32d04: 0x6c6b9820, 0x32d05: 0x6c6b9a20, 0x32d06: 0x6c6b9c20, 0x32d07: 0x6c6b9e20, + 0x32d08: 0x6c6ba020, 0x32d09: 0x6c6ba220, 0x32d0a: 0x6c6ba420, 0x32d0b: 0x6c6ba620, + 0x32d0c: 0x6c6ba820, 0x32d0d: 0x6c6baa20, 0x32d0e: 0x6c6bac20, 0x32d0f: 0x6c6bae20, + 0x32d10: 0x6c6bb020, 0x32d11: 0x6c6bb220, 0x32d12: 0x6c6bb420, 0x32d13: 0x6c6bb620, + 0x32d14: 0x6c6bb820, 0x32d15: 0x6c6bba20, 0x32d16: 0x6c6bbc20, 0x32d17: 0x6c6bbe20, + 0x32d18: 0x6c6bc020, 0x32d19: 0x6c6bc220, 0x32d1a: 0x6c6bc420, 0x32d1b: 0x6c6bc620, + 0x32d1c: 0x6c6bc820, 0x32d1d: 0x6c6bca20, 0x32d1e: 0x6c927020, 0x32d1f: 0x6c927220, + 0x32d20: 0x6c927420, 0x32d21: 0x6c927620, 0x32d22: 0x6c927820, 0x32d23: 0x6c927a20, + 0x32d24: 0x6c927c20, 0x32d25: 0x6c927e20, 0x32d26: 0x6c928020, 0x32d27: 0x6c928220, + 0x32d28: 0x6c928420, 0x32d29: 0x6c928620, 0x32d2a: 0x6c928820, 0x32d2b: 0x6c928a20, + 0x32d2c: 0x6c928c20, 0x32d2d: 0x6c928e20, 0x32d2e: 0x6c929020, 0x32d2f: 0x6c929220, + 0x32d30: 0x6c929420, 0x32d31: 0x6c929620, 0x32d32: 0x6c929820, 0x32d33: 0x6c929a20, + 0x32d34: 0x6c929c20, 0x32d35: 0x6c929e20, 0x32d36: 0x6c92a020, 0x32d37: 0x6c92a220, + 0x32d38: 0x6c92a420, 0x32d39: 0x6c92a620, 0x32d3a: 0x6c92a820, 0x32d3b: 0x6c92aa20, + 0x32d3c: 0x6c92ac20, 0x32d3d: 0x6c92ae20, 0x32d3e: 0x6c92b020, 0x32d3f: 0x6c92b220, + // Block 0xcb5, offset 0x32d40 + 0x32d40: 0x6c92b420, 0x32d41: 0x6c92b620, 0x32d42: 0x6c92b820, 0x32d43: 0x6c92ba20, + 0x32d44: 0x6c92bc20, 0x32d45: 0x6c92be20, 0x32d46: 0x6c92c020, 0x32d47: 0x6c92c220, + 0x32d48: 0x6c92c420, 0x32d49: 0x6c92c620, 0x32d4a: 0x6c92c820, 0x32d4b: 0x6c92ca20, + 0x32d4c: 0x6c92cc20, 0x32d4d: 0x6c92ce20, 0x32d4e: 0x6c92d020, 0x32d4f: 0x6c92d220, + 0x32d50: 0x6c92d420, 0x32d51: 0x6c92d620, 0x32d52: 0x6c92d820, 0x32d53: 0x6c92da20, + 0x32d54: 0x6c92dc20, 0x32d55: 0x6c92de20, 0x32d56: 0x6c92e020, 0x32d57: 0x6c92e220, + 0x32d58: 0x6c92e420, 0x32d59: 0x6c92e620, 0x32d5a: 0x6c92e820, 0x32d5b: 0x6c92ea20, + 0x32d5c: 0x6cbe9020, 0x32d5d: 0x6cbe9220, 0x32d5e: 0x6cbe9420, 0x32d5f: 0x6cbe9620, + 0x32d60: 0x6cbe9820, 0x32d61: 0x6cbe9a20, 0x32d62: 0x6cbe9c20, 0x32d63: 0x6cbe9e20, + 0x32d64: 0x6cbea020, 0x32d65: 0x6cbea220, 0x32d66: 0x6cbea420, 0x32d67: 0x6cbea620, + 0x32d68: 0x6cbea820, 0x32d69: 0x6cbeaa20, 0x32d6a: 0x6cbeac20, 0x32d6b: 0x6cbeae20, + 0x32d6c: 0x6cbeb020, 0x32d6d: 0x6cbeb220, 0x32d6e: 0x6cbeb420, 0x32d6f: 0x6cbeb620, + 0x32d70: 0x6cbeb820, 0x32d71: 0x6cbeba20, 0x32d72: 0x6cbebc20, 0x32d73: 0x6cbebe20, + 0x32d74: 0x6cbec020, 0x32d75: 0x6cbec220, 0x32d76: 0x6cbec420, 0x32d77: 0x6cbec620, + 0x32d78: 0x6cbec820, 0x32d79: 0x6cbeca20, 0x32d7a: 0x6cbecc20, 0x32d7b: 0x6cbece20, + 0x32d7c: 0x6cbed020, 0x32d7d: 0x6cbed220, 0x32d7e: 0x6cbed420, 0x32d7f: 0x6cbed620, + // Block 0xcb6, offset 0x32d80 + 0x32d80: 0x6cbed820, 0x32d81: 0x6cbeda20, 0x32d82: 0x6cbedc20, 0x32d83: 0x6cbede20, + 0x32d84: 0x6cbee020, 0x32d85: 0x6cbee220, 0x32d86: 0x6cbee420, 0x32d87: 0x6cbee620, + 0x32d88: 0x6cbee820, 0x32d89: 0x6cbeea20, 0x32d8a: 0x6cbeec20, 0x32d8b: 0x6cbeee20, + 0x32d8c: 0x6cbef020, 0x32d8d: 0x6cbef220, 0x32d8e: 0x6cbef420, 0x32d8f: 0x6cbef620, + 0x32d90: 0x6cbef820, 0x32d91: 0x6cbefa20, 0x32d92: 0x6cbefc20, 0x32d93: 0x6cbefe20, + 0x32d94: 0x6cbf0020, 0x32d95: 0x6cbf0220, 0x32d96: 0x6cbf0420, 0x32d97: 0x6cbf0620, + 0x32d98: 0x6cbf0820, 0x32d99: 0x6cbf0a20, 0x32d9a: 0x6cbf0c20, 0x32d9b: 0x6cbf0e20, + 0x32d9c: 0x6cbf1020, 0x32d9d: 0x6cbf1220, 0x32d9e: 0x6cbf1420, 0x32d9f: 0x6cbf1620, + 0x32da0: 0x6cbf1820, 0x32da1: 0x6cbf1a20, 0x32da2: 0x6cbf1c20, 0x32da3: 0x6cbf1e20, + 0x32da4: 0x6cbf2020, 0x32da5: 0x6cbf2220, 0x32da6: 0x6cbf2420, 0x32da7: 0x6cbf2620, + 0x32da8: 0x6cef1020, 0x32da9: 0x6cef1220, 0x32daa: 0x6cef1420, 0x32dab: 0x6cef1620, + 0x32dac: 0x6cef1820, 0x32dad: 0x6cef1a20, 0x32dae: 0x6cef1c20, 0x32daf: 0x6cef1e20, + 0x32db0: 0x6cef2020, 0x32db1: 0x6cef2220, 0x32db2: 0x6cef2420, 0x32db3: 0x6cef2620, + 0x32db4: 0x6cef2820, 0x32db5: 0x6cef2a20, 0x32db6: 0x6cef2c20, 0x32db7: 0x6cef2e20, + 0x32db8: 0x6cef3020, 0x32db9: 0x6cef3220, 0x32dba: 0x6cef3420, 0x32dbb: 0x6cef3620, + 0x32dbc: 0x6cef3820, 0x32dbd: 0x6cef3a20, 0x32dbe: 0x6cef3c20, 0x32dbf: 0x6cef3e20, + // Block 0xcb7, offset 0x32dc0 + 0x32dc0: 0x6cef4020, 0x32dc1: 0x6cef4220, 0x32dc2: 0x6cef4420, 0x32dc3: 0x6cef4620, + 0x32dc4: 0x6cef4820, 0x32dc5: 0x6cef4a20, 0x32dc6: 0x6cef4c20, 0x32dc7: 0x6cef4e20, + 0x32dc8: 0x6cef5020, 0x32dc9: 0x6cef5220, 0x32dca: 0x6cef5420, 0x32dcb: 0x6cef5620, + 0x32dcc: 0x6cef5820, 0x32dcd: 0x6cef5a20, 0x32dce: 0x6cef5c20, 0x32dcf: 0x6cef5e20, + 0x32dd0: 0x6cef6020, 0x32dd1: 0x6cef6220, 0x32dd2: 0x6cef6420, 0x32dd3: 0x6cef6620, + 0x32dd4: 0x6cef6820, 0x32dd5: 0x6cef6a20, 0x32dd6: 0x6d4c2220, 0x32dd7: 0x6d1eaa20, + 0x32dd8: 0x6d4c2420, 0x32dd9: 0x6d1eac20, 0x32dda: 0x6d1eae20, 0x32ddb: 0x6d1eb020, + 0x32ddc: 0x6d1eb220, 0x32ddd: 0x6d1eb420, 0x32dde: 0x6d1eb620, 0x32ddf: 0x6d1eb820, + 0x32de0: 0x6d1eba20, 0x32de1: 0x6d1ebc20, 0x32de2: 0x6d1ebe20, 0x32de3: 0x6cbf2820, + 0x32de4: 0x6d1ec020, 0x32de5: 0x6d1ec220, 0x32de6: 0x6d1ec420, 0x32de7: 0x6d1ec620, + 0x32de8: 0x6d1ec820, 0x32de9: 0x6d1eca20, 0x32dea: 0x6d1ecc20, 0x32deb: 0x6d1ece20, + 0x32dec: 0x6d1ed020, 0x32ded: 0x6d1ed220, 0x32dee: 0x6d1ed420, 0x32def: 0x6d1ed620, + 0x32df0: 0x6d1ed820, 0x32df1: 0x6d1eda20, 0x32df2: 0x6d4c2620, 0x32df3: 0x6d1edc20, + 0x32df4: 0x6d1ede20, 0x32df5: 0x6d1ee020, 0x32df6: 0x6d1ee220, 0x32df7: 0x6d1ee420, + 0x32df8: 0x6d1ee620, 0x32df9: 0x6d1ee820, 0x32dfa: 0x6d1eea20, 0x32dfb: 0x6d1eec20, + 0x32dfc: 0x6d1eee20, 0x32dfd: 0x6d1ef020, 0x32dfe: 0x6d1ef220, 0x32dff: 0x6d1ef420, + // Block 0xcb8, offset 0x32e00 + 0x32e00: 0x6d1ef620, 0x32e01: 0x6d1ef820, 0x32e02: 0x6d1efa20, 0x32e03: 0x6d1efc20, + 0x32e04: 0x6d1efe20, 0x32e05: 0x6d1f0020, 0x32e06: 0x6d1f0220, 0x32e07: 0x6d1f0420, + 0x32e08: 0x6d1f0620, 0x32e09: 0x6d1f0820, 0x32e0a: 0x6d1f0a20, 0x32e0b: 0x6d1f0c20, + 0x32e0c: 0x6d1f0e20, 0x32e0d: 0x6d1f1020, 0x32e0e: 0x6d1f1220, 0x32e0f: 0x6d4c2820, + 0x32e10: 0x6d4c2a20, 0x32e11: 0x6d4c2c20, 0x32e12: 0x6d4c2e20, 0x32e13: 0x6d4c3020, + 0x32e14: 0x6d4c3220, 0x32e15: 0x6d4c3420, 0x32e16: 0x6d4c3620, 0x32e17: 0x6d4c3820, + 0x32e18: 0x6d4c3a20, 0x32e19: 0x6d4c3c20, 0x32e1a: 0x6d4c3e20, 0x32e1b: 0x6d4c4020, + 0x32e1c: 0x6d4c4220, 0x32e1d: 0x6d4c4420, 0x32e1e: 0x6d4c4620, 0x32e1f: 0x6d4c4820, + 0x32e20: 0x6d4c4a20, 0x32e21: 0x6d4c4c20, 0x32e22: 0x6d4c4e20, 0x32e23: 0x6d4c5020, + 0x32e24: 0x6d4c5220, 0x32e25: 0x6d4c5420, 0x32e26: 0x6d4c5620, 0x32e27: 0x6d4c5820, + 0x32e28: 0x6d4c5a20, 0x32e29: 0x6d4c5c20, 0x32e2a: 0x6d4c5e20, 0x32e2b: 0x6d4c6020, + 0x32e2c: 0x6d4c6220, 0x32e2d: 0x6d4c6420, 0x32e2e: 0x6d4c6620, 0x32e2f: 0x6d4c6820, + 0x32e30: 0x6d4c6a20, 0x32e31: 0x6d4c6c20, 0x32e32: 0x6d4c6e20, 0x32e33: 0x6d4c7020, + 0x32e34: 0x6d4c7220, 0x32e35: 0x6d4c7420, 0x32e36: 0x6d4c7620, 0x32e37: 0x6d4c7820, + 0x32e38: 0x6d4c7a20, 0x32e39: 0x6d4c7c20, 0x32e3a: 0x6d4c7e20, 0x32e3b: 0x6d4c8020, + 0x32e3c: 0x6d4c8220, 0x32e3d: 0x6d4c8420, 0x32e3e: 0x6d4c8620, 0x32e3f: 0x6d4c8820, + // Block 0xcb9, offset 0x32e40 + 0x32e40: 0x6d4c8a20, 0x32e41: 0x6d4c8c20, 0x32e42: 0x6d4c8e20, 0x32e43: 0x6d4c9020, + 0x32e44: 0x6d4c9220, 0x32e45: 0x6d4c9420, 0x32e46: 0x6d4c9620, 0x32e47: 0x6d4c9820, + 0x32e48: 0x6d4c9a20, 0x32e49: 0x6d4c9c20, 0x32e4a: 0x6d4c9e20, 0x32e4b: 0x6d4ca020, + 0x32e4c: 0x6d4ca220, 0x32e4d: 0x6d4ca420, 0x32e4e: 0x6d796a20, 0x32e4f: 0x6d601620, + 0x32e50: 0x6d4ca620, 0x32e51: 0x6d796c20, 0x32e52: 0x6d796e20, 0x32e53: 0x6d797020, + 0x32e54: 0x6d797220, 0x32e55: 0x6d797420, 0x32e56: 0x6d797620, 0x32e57: 0x6d797820, + 0x32e58: 0x6d797a20, 0x32e59: 0x6d797c20, 0x32e5a: 0x6d797e20, 0x32e5b: 0x6d798020, + 0x32e5c: 0x6d798220, 0x32e5d: 0x6d798420, 0x32e5e: 0x6d798620, 0x32e5f: 0x6d798820, + 0x32e60: 0x6d798a20, 0x32e61: 0x6d798c20, 0x32e62: 0x6d798e20, 0x32e63: 0x6d799020, + 0x32e64: 0x6d799220, 0x32e65: 0x6d799420, 0x32e66: 0x6d799620, 0x32e67: 0x6d799820, + 0x32e68: 0x6d799a20, 0x32e69: 0x6d799c20, 0x32e6a: 0x6d799e20, 0x32e6b: 0x6d79a020, + 0x32e6c: 0x6d79a220, 0x32e6d: 0x6d79a420, 0x32e6e: 0x6d79a620, 0x32e6f: 0x6d79a820, + 0x32e70: 0x6d79aa20, 0x32e71: 0x6d79ac20, 0x32e72: 0x6d79ae20, 0x32e73: 0x6d79b020, + 0x32e74: 0x6d79b220, 0x32e75: 0x6d79b420, 0x32e76: 0x6d79b620, 0x32e77: 0x6d79b820, + 0x32e78: 0x6d79ba20, 0x32e79: 0x6d79bc20, 0x32e7a: 0x6d79be20, 0x32e7b: 0x6d79c020, + 0x32e7c: 0x6d79c220, 0x32e7d: 0x6d79c420, 0x32e7e: 0x6d79c620, 0x32e7f: 0x6d79c820, + // Block 0xcba, offset 0x32e80 + 0x32e80: 0x6d79ca20, 0x32e81: 0x6d79cc20, 0x32e82: 0x6d79ce20, 0x32e83: 0x6d79d020, + 0x32e84: 0x6d79d220, 0x32e85: 0x6da24c20, 0x32e86: 0x6da24e20, 0x32e87: 0x6da25020, + 0x32e88: 0x6da25220, 0x32e89: 0x6da25420, 0x32e8a: 0x6da25620, 0x32e8b: 0x6da25820, + 0x32e8c: 0x6da25a20, 0x32e8d: 0x6da25c20, 0x32e8e: 0x6da25e20, 0x32e8f: 0x6da26020, + 0x32e90: 0x6da26220, 0x32e91: 0x6da26420, 0x32e92: 0x6da26620, 0x32e93: 0x6da26820, + 0x32e94: 0x6da26a20, 0x32e95: 0x6da26c20, 0x32e96: 0x6da26e20, 0x32e97: 0x6da27020, + 0x32e98: 0x6da27220, 0x32e99: 0x6da27420, 0x32e9a: 0x6da27620, 0x32e9b: 0x6da27820, + 0x32e9c: 0x6da27a20, 0x32e9d: 0x6da27c20, 0x32e9e: 0x6da27e20, 0x32e9f: 0x6da28020, + 0x32ea0: 0x6da28220, 0x32ea1: 0x6da28420, 0x32ea2: 0x6db99820, 0x32ea3: 0x6da28620, + 0x32ea4: 0x6da28820, 0x32ea5: 0x6da28a20, 0x32ea6: 0x6da28c20, 0x32ea7: 0x6da28e20, + 0x32ea8: 0x6da29020, 0x32ea9: 0x6da29220, 0x32eaa: 0x6dc46020, 0x32eab: 0x6dc46220, + 0x32eac: 0x6dc46420, 0x32ead: 0x6dc46620, 0x32eae: 0x6dc46820, 0x32eaf: 0x6dc46a20, + 0x32eb0: 0x6dc46c20, 0x32eb1: 0x6dc46e20, 0x32eb2: 0x6dc47020, 0x32eb3: 0x6dc47220, + 0x32eb4: 0x6dc47420, 0x32eb5: 0x6dc47620, 0x32eb6: 0x6dc47820, 0x32eb7: 0x6dc47a20, + 0x32eb8: 0x6dc47c20, 0x32eb9: 0x6dc47e20, 0x32eba: 0x6dc48020, 0x32ebb: 0x6dc48220, + 0x32ebc: 0x6dc48420, 0x32ebd: 0x6de16820, 0x32ebe: 0x6de16a20, 0x32ebf: 0x6de16c20, + // Block 0xcbb, offset 0x32ec0 + 0x32ec0: 0x6de16e20, 0x32ec1: 0x6de17020, 0x32ec2: 0x6de17220, 0x32ec3: 0x6de17420, + 0x32ec4: 0x6de17620, 0x32ec5: 0x6de17820, 0x32ec6: 0x6de17a20, 0x32ec7: 0x6de17c20, + 0x32ec8: 0x6de17e20, 0x32ec9: 0x6de18020, 0x32eca: 0x6de18220, 0x32ecb: 0x6de18420, + 0x32ecc: 0x6de18620, 0x32ecd: 0x6de18820, 0x32ece: 0x6df97020, 0x32ecf: 0x6df97220, + 0x32ed0: 0x6df97420, 0x32ed1: 0x6df97620, 0x32ed2: 0x6df97820, 0x32ed3: 0x6df97a20, + 0x32ed4: 0x6df97c20, 0x32ed5: 0x6df97e20, 0x32ed6: 0x6df98020, 0x32ed7: 0x6df98220, + 0x32ed8: 0x6e0d3020, 0x32ed9: 0x6e0d3220, 0x32eda: 0x6e0d3420, 0x32edb: 0x6e0d3620, + 0x32edc: 0x6e0d3820, 0x32edd: 0x6e0d3a20, 0x32ede: 0x6de18a20, 0x32edf: 0x6e0d3c20, + 0x32ee0: 0x6e0d3e20, 0x32ee1: 0x6e1ca020, 0x32ee2: 0x6e1ca220, 0x32ee3: 0x6e1ca420, + 0x32ee4: 0x6e1ca620, 0x32ee5: 0x6e1ca820, 0x32ee6: 0x6e1caa20, 0x32ee7: 0x6e1cac20, + 0x32ee8: 0x6e1cae20, 0x32ee9: 0x6e1cb020, 0x32eea: 0x6e1cb220, 0x32eeb: 0x6e28a820, + 0x32eec: 0x6e28aa20, 0x32eed: 0x6e28ac20, 0x32eee: 0x6e31dc20, 0x32eef: 0x6e31de20, + 0x32ef0: 0x6e31e020, 0x32ef1: 0x6e31e220, 0x32ef2: 0x6e31e420, 0x32ef3: 0x6e31e620, + 0x32ef4: 0x6e386220, 0x32ef5: 0x6e386420, 0x32ef6: 0x6e386620, 0x32ef7: 0x6e401420, + 0x32ef8: 0x6e401620, 0x32ef9: 0x6e401820, 0x32efa: 0x6e401a20, 0x32efb: 0x6e467e20, + 0x32efc: 0x6c019e20, 0x32efd: 0x6c03f420, 0x32efe: 0x6c081420, 0x32eff: 0x6c081620, + // Block 0xcbc, offset 0x32f00 + 0x32f00: 0x6c081820, 0x32f01: 0x6c081a20, 0x32f02: 0x6c081c20, 0x32f03: 0x6c0fb220, + 0x32f04: 0x6c0fb420, 0x32f05: 0x6c0fb620, 0x32f06: 0x6c1c7020, 0x32f07: 0x6c1c7220, + 0x32f08: 0x6c1c7420, 0x32f09: 0x6c1c7620, 0x32f0a: 0x6c1c7820, 0x32f0b: 0x6c18cc20, + 0x32f0c: 0x6c1c7a20, 0x32f0d: 0x6c1c7c20, 0x32f0e: 0x6c2fde20, 0x32f0f: 0x6c2fe020, + 0x32f10: 0x6c2fe220, 0x32f11: 0x6c2fe420, 0x32f12: 0x6c2fe620, 0x32f13: 0x6c2fe820, + 0x32f14: 0x6c2fea20, 0x32f15: 0x6c2fec20, 0x32f16: 0x6c2fee20, 0x32f17: 0x6c2ff020, + 0x32f18: 0x6c2ff220, 0x32f19: 0x6c2ff420, 0x32f1a: 0x6c2ff620, 0x32f1b: 0x6c4a2420, + 0x32f1c: 0x6c4a2620, 0x32f1d: 0x6c4a2820, 0x32f1e: 0x6c4a2a20, 0x32f1f: 0x6c4a2c20, + 0x32f20: 0x6c4a2e20, 0x32f21: 0x6c4a3020, 0x32f22: 0x6c4a3220, 0x32f23: 0x6c4a3420, + 0x32f24: 0x6c4a3620, 0x32f25: 0x6c4a3820, 0x32f26: 0x6c4a3a20, 0x32f27: 0x6c4a3c20, + 0x32f28: 0x6c6be620, 0x32f29: 0x6c6be820, 0x32f2a: 0x6c6bea20, 0x32f2b: 0x6c6bec20, + 0x32f2c: 0x6c6bee20, 0x32f2d: 0x6c6bf020, 0x32f2e: 0x6c930c20, 0x32f2f: 0x6c930e20, + 0x32f30: 0x6c931020, 0x32f31: 0x6c931220, 0x32f32: 0x6c931420, 0x32f33: 0x6c931620, + 0x32f34: 0x6c931820, 0x32f35: 0x6c931a20, 0x32f36: 0x6cbf4620, 0x32f37: 0x6cbf4820, + 0x32f38: 0x6cbf4a20, 0x32f39: 0x6cbf4c20, 0x32f3a: 0x6cbf4e20, 0x32f3b: 0x6cbf5020, + 0x32f3c: 0x6cbf5220, 0x32f3d: 0x6cbf5420, 0x32f3e: 0x6cbf5620, 0x32f3f: 0x6cbf5820, + // Block 0xcbd, offset 0x32f40 + 0x32f40: 0x6cbf5a20, 0x32f41: 0x6cbf5c20, 0x32f42: 0x6cbf5e20, 0x32f43: 0x6cef7c20, + 0x32f44: 0x6cef7e20, 0x32f45: 0x6cef8020, 0x32f46: 0x6cef8220, 0x32f47: 0x6cef8420, + 0x32f48: 0x6cef8620, 0x32f49: 0x6cef8820, 0x32f4a: 0x6cef8a20, 0x32f4b: 0x6cef8c20, + 0x32f4c: 0x6cef8e20, 0x32f4d: 0x6cef9020, 0x32f4e: 0x6cef9220, 0x32f4f: 0x6cef9420, + 0x32f50: 0x6cef9620, 0x32f51: 0x6d1f2e20, 0x32f52: 0x6d1f3020, 0x32f53: 0x6d1f3220, + 0x32f54: 0x6d1f3420, 0x32f55: 0x6d1f3620, 0x32f56: 0x6d1f3820, 0x32f57: 0x6d4cb820, + 0x32f58: 0x6d4cba20, 0x32f59: 0x6d4cbc20, 0x32f5a: 0x6d4cbe20, 0x32f5b: 0x6d4cc020, + 0x32f5c: 0x6d4cc220, 0x32f5d: 0x6d4cc420, 0x32f5e: 0x6d79e620, 0x32f5f: 0x6d79e820, + 0x32f60: 0x6d79ea20, 0x32f61: 0x6d79ec20, 0x32f62: 0x6d79ee20, 0x32f63: 0x6d79f020, + 0x32f64: 0x6d79f220, 0x32f65: 0x6d79f420, 0x32f66: 0x6d79f620, 0x32f67: 0x6d79f820, + 0x32f68: 0x6d79fa20, 0x32f69: 0x6da29a20, 0x32f6a: 0x6dc48e20, 0x32f6b: 0x6dc49020, + 0x32f6c: 0x6dc49220, 0x32f6d: 0x6de19220, 0x32f6e: 0x6de19420, 0x32f6f: 0x6de19620, + 0x32f70: 0x6de19820, 0x32f71: 0x6df98a20, 0x32f72: 0x6df98c20, 0x32f73: 0x6df98e20, + 0x32f74: 0x6df99020, 0x32f75: 0x6df99220, 0x32f76: 0x6df99420, 0x32f77: 0x6e1cb620, + 0x32f78: 0x6e401c20, 0x32f79: 0x6c03f820, 0x32f7a: 0x6c082a20, 0x32f7b: 0x6c082c20, + 0x32f7c: 0x6c082e20, 0x32f7d: 0x6c0fc620, 0x32f7e: 0x6c0fc820, 0x32f7f: 0x6c0fca20, + // Block 0xcbe, offset 0x32f80 + 0x32f80: 0x6c0fcc20, 0x32f81: 0x6c0fce20, 0x32f82: 0x6c0fd020, 0x32f83: 0x6c0fd220, + 0x32f84: 0x6c0fd420, 0x32f85: 0x6c0fd620, 0x32f86: 0x6c0fd820, 0x32f87: 0x6c0fda20, + 0x32f88: 0x6c0fdc20, 0x32f89: 0x6c0fde20, 0x32f8a: 0x6c0fe020, 0x32f8b: 0x6c1ca020, + 0x32f8c: 0x6c1ca220, 0x32f8d: 0x6c1ca420, 0x32f8e: 0x6c1ca620, 0x32f8f: 0x6c1ca820, + 0x32f90: 0x6c1caa20, 0x32f91: 0x6c1cac20, 0x32f92: 0x6c1cae20, 0x32f93: 0x6c1cb020, + 0x32f94: 0x6c1cb220, 0x32f95: 0x6c1cb420, 0x32f96: 0x6c301a20, 0x32f97: 0x6c301c20, + 0x32f98: 0x6c301e20, 0x32f99: 0x6c302020, 0x32f9a: 0x6c302220, 0x32f9b: 0x6c302420, + 0x32f9c: 0x6c302620, 0x32f9d: 0x6c302820, 0x32f9e: 0x6c302a20, 0x32f9f: 0x6c302c20, + 0x32fa0: 0x6c302e20, 0x32fa1: 0x6c303020, 0x32fa2: 0x6c303220, 0x32fa3: 0x6c303420, + 0x32fa4: 0x6c303620, 0x32fa5: 0x6c303820, 0x32fa6: 0x6c303a20, 0x32fa7: 0x6c303c20, + 0x32fa8: 0x6c303e20, 0x32fa9: 0x6c4a5a20, 0x32faa: 0x6c4a5c20, 0x32fab: 0x6c4a5e20, + 0x32fac: 0x6c4a6020, 0x32fad: 0x6c4a6220, 0x32fae: 0x6c4a6420, 0x32faf: 0x6c4a6620, + 0x32fb0: 0x6c4a6820, 0x32fb1: 0x6c4a6a20, 0x32fb2: 0x6c4a6c20, 0x32fb3: 0x6c4a6e20, + 0x32fb4: 0x6c4a7020, 0x32fb5: 0x6c4a7220, 0x32fb6: 0x6c4a7420, 0x32fb7: 0x6c4a7620, + 0x32fb8: 0x6c4a7820, 0x32fb9: 0x6c4a7a20, 0x32fba: 0x6c4a7c20, 0x32fbb: 0x6c4a7e20, + 0x32fbc: 0x6c4a8020, 0x32fbd: 0x6c4a8220, 0x32fbe: 0x6c4a8420, 0x32fbf: 0x6c4a8620, + // Block 0xcbf, offset 0x32fc0 + 0x32fc0: 0x6c6c2620, 0x32fc1: 0x6c6c2820, 0x32fc2: 0x6c6c2a20, 0x32fc3: 0x6c6c2c20, + 0x32fc4: 0x6c6c2e20, 0x32fc5: 0x6c6c3020, 0x32fc6: 0x6c6c3220, 0x32fc7: 0x6c6c3420, + 0x32fc8: 0x6c6c3620, 0x32fc9: 0x6c6c3820, 0x32fca: 0x6c6c3a20, 0x32fcb: 0x6c6c3c20, + 0x32fcc: 0x6c6c3e20, 0x32fcd: 0x6c6c4020, 0x32fce: 0x6c6c4220, 0x32fcf: 0x6c6c4420, + 0x32fd0: 0x6c6c4620, 0x32fd1: 0x6c6c4820, 0x32fd2: 0x6c6c4a20, 0x32fd3: 0x6c6c4c20, + 0x32fd4: 0x6c6c4e20, 0x32fd5: 0x6c6c5020, 0x32fd6: 0x6c6c5220, 0x32fd7: 0x6c6c5420, + 0x32fd8: 0x6c6c5620, 0x32fd9: 0x6c6c5820, 0x32fda: 0x6c6c5a20, 0x32fdb: 0x6c6c5c20, + 0x32fdc: 0x6c6c5e20, 0x32fdd: 0x6c6c6020, 0x32fde: 0x6c6c6220, 0x32fdf: 0x6c6c6420, + 0x32fe0: 0x6c6c6620, 0x32fe1: 0x6c6c6820, 0x32fe2: 0x6c934620, 0x32fe3: 0x6c934820, + 0x32fe4: 0x6c934a20, 0x32fe5: 0x6c934c20, 0x32fe6: 0x6c934e20, 0x32fe7: 0x6c935020, + 0x32fe8: 0x6c935220, 0x32fe9: 0x6c935420, 0x32fea: 0x6c935620, 0x32feb: 0x6c935820, + 0x32fec: 0x6c935a20, 0x32fed: 0x6c935c20, 0x32fee: 0x6c935e20, 0x32fef: 0x6c936020, + 0x32ff0: 0x6c936220, 0x32ff1: 0x6c936420, 0x32ff2: 0x6c936620, 0x32ff3: 0x6c936820, + 0x32ff4: 0x6c936a20, 0x32ff5: 0x6c936c20, 0x32ff6: 0x6c936e20, 0x32ff7: 0x6c937020, + 0x32ff8: 0x6c937220, 0x32ff9: 0x6c937420, 0x32ffa: 0x6c937620, 0x32ffb: 0x6c937820, + 0x32ffc: 0x6c937a20, 0x32ffd: 0x6cbf8220, 0x32ffe: 0x6cbf8420, 0x32fff: 0x6cbf8620, + // Block 0xcc0, offset 0x33000 + 0x33000: 0x6cbf8820, 0x33001: 0x6cbf8a20, 0x33002: 0x6cbf8c20, 0x33003: 0x6cbf8e20, + 0x33004: 0x6cbf9020, 0x33005: 0x6cbf9220, 0x33006: 0x6cbf9420, 0x33007: 0x6cbf9620, + 0x33008: 0x6cbf9820, 0x33009: 0x6cbf9a20, 0x3300a: 0x6cbf9c20, 0x3300b: 0x6cbf9e20, + 0x3300c: 0x6cbfa020, 0x3300d: 0x6cbfa220, 0x3300e: 0x6cbfa420, 0x3300f: 0x6cbfa620, + 0x33010: 0x6cbfa820, 0x33011: 0x6cbfaa20, 0x33012: 0x6cbfac20, 0x33013: 0x6cbfae20, + 0x33014: 0x6cbfb020, 0x33015: 0x6cbfb220, 0x33016: 0x6cbfb420, 0x33017: 0x6cbfb620, + 0x33018: 0x6cbfb820, 0x33019: 0x6cbfba20, 0x3301a: 0x6cbfbc20, 0x3301b: 0x6cbfbe20, + 0x3301c: 0x6cbfc020, 0x3301d: 0x6cbfc220, 0x3301e: 0x6cbfc420, 0x3301f: 0x6cefb420, + 0x33020: 0x6cefb620, 0x33021: 0x6cefb820, 0x33022: 0x6cefba20, 0x33023: 0x6cefbc20, + 0x33024: 0x6cefbe20, 0x33025: 0x6cefc020, 0x33026: 0x6cefc220, 0x33027: 0x6cefc420, + 0x33028: 0x6cefc620, 0x33029: 0x6cefc820, 0x3302a: 0x6cefca20, 0x3302b: 0x6cefcc20, + 0x3302c: 0x6cefce20, 0x3302d: 0x6cefd020, 0x3302e: 0x6cefd220, 0x3302f: 0x6cefd420, + 0x33030: 0x6cefd620, 0x33031: 0x6cefd820, 0x33032: 0x6cefda20, 0x33033: 0x6cefdc20, + 0x33034: 0x6cefde20, 0x33035: 0x6cefe020, 0x33036: 0x6cefe220, 0x33037: 0x6cefe420, + 0x33038: 0x6cefe620, 0x33039: 0x6cefe820, 0x3303a: 0x6cefea20, 0x3303b: 0x6d1f5a20, + 0x3303c: 0x6d1f5c20, 0x3303d: 0x6d1f5e20, 0x3303e: 0x6d1f6020, 0x3303f: 0x6d1f6220, + // Block 0xcc1, offset 0x33040 + 0x33040: 0x6d1f6420, 0x33041: 0x6d1f6620, 0x33042: 0x6d1f6820, 0x33043: 0x6d1f6a20, + 0x33044: 0x6d1f6c20, 0x33045: 0x6d1f6e20, 0x33046: 0x6d1f7020, 0x33047: 0x6d1f7220, + 0x33048: 0x6d1f7420, 0x33049: 0x6d1f7620, 0x3304a: 0x6d1f7820, 0x3304b: 0x6d1f7a20, + 0x3304c: 0x6d1f7c20, 0x3304d: 0x6d1f7e20, 0x3304e: 0x6d1f8020, 0x3304f: 0x6d1f8220, + 0x33050: 0x6d1f8420, 0x33051: 0x6d1f8620, 0x33052: 0x6d1f8820, 0x33053: 0x6d1f8a20, + 0x33054: 0x6d1f8c20, 0x33055: 0x6d1f8e20, 0x33056: 0x6d1f9020, 0x33057: 0x6d1f9220, + 0x33058: 0x6d1f9420, 0x33059: 0x6d1f9620, 0x3305a: 0x6d1f9820, 0x3305b: 0x6d1f9a20, + 0x3305c: 0x6d1f9c20, 0x3305d: 0x6d1f9e20, 0x3305e: 0x6d1b3020, 0x3305f: 0x6d4cd820, + 0x33060: 0x6d4cda20, 0x33061: 0x6d4cdc20, 0x33062: 0x6d4cde20, 0x33063: 0x6d4ce020, + 0x33064: 0x6d4ce220, 0x33065: 0x6d4ce420, 0x33066: 0x6d4ce620, 0x33067: 0x6d4ce820, + 0x33068: 0x6d4cea20, 0x33069: 0x6d4cec20, 0x3306a: 0x6d4cee20, 0x3306b: 0x6d4cf020, + 0x3306c: 0x6d4cf220, 0x3306d: 0x6d4cf420, 0x3306e: 0x6d4cf620, 0x3306f: 0x6d4cf820, + 0x33070: 0x6d4cfa20, 0x33071: 0x6d4cfc20, 0x33072: 0x6d4cfe20, 0x33073: 0x6d4d0020, + 0x33074: 0x6d4d0220, 0x33075: 0x6d4d0420, 0x33076: 0x6d4d0620, 0x33077: 0x6d4d0820, + 0x33078: 0x6d4d0a20, 0x33079: 0x6d4d0c20, 0x3307a: 0x6d4d0e20, 0x3307b: 0x6d4d1020, + 0x3307c: 0x6d4d1220, 0x3307d: 0x6d4d1420, 0x3307e: 0x6d7a0220, 0x3307f: 0x6d7a0420, + // Block 0xcc2, offset 0x33080 + 0x33080: 0x6d7a0620, 0x33081: 0x6d7a0820, 0x33082: 0x6d7a0a20, 0x33083: 0x6d7a0c20, + 0x33084: 0x6d7a0e20, 0x33085: 0x6d7a1020, 0x33086: 0x6d7a1220, 0x33087: 0x6d7a1420, + 0x33088: 0x6d7a1620, 0x33089: 0x6d7a1820, 0x3308a: 0x6d7a1a20, 0x3308b: 0x6d7a1c20, + 0x3308c: 0x6d7a1e20, 0x3308d: 0x6d7a2020, 0x3308e: 0x6d7a2220, 0x3308f: 0x6d7a2420, + 0x33090: 0x6d7a2620, 0x33091: 0x6da2a420, 0x33092: 0x6da2a620, 0x33093: 0x6da2a820, + 0x33094: 0x6da2aa20, 0x33095: 0x6da2ac20, 0x33096: 0x6da2ae20, 0x33097: 0x6da2b020, + 0x33098: 0x6da2b220, 0x33099: 0x6da2b420, 0x3309a: 0x6da2b620, 0x3309b: 0x6da2b820, + 0x3309c: 0x6da2ba20, 0x3309d: 0x6da2bc20, 0x3309e: 0x6dc49620, 0x3309f: 0x6dc49820, + 0x330a0: 0x6dc49a20, 0x330a1: 0x6dc49c20, 0x330a2: 0x6dc49e20, 0x330a3: 0x6dc4a020, + 0x330a4: 0x6dc4a220, 0x330a5: 0x6dc4a420, 0x330a6: 0x6dc4a620, 0x330a7: 0x6dc4a820, + 0x330a8: 0x6dc4aa20, 0x330a9: 0x6dc4ac20, 0x330aa: 0x6dc4ae20, 0x330ab: 0x6dc4b020, + 0x330ac: 0x6de1a020, 0x330ad: 0x6de1a220, 0x330ae: 0x6de1a420, 0x330af: 0x6de1a620, + 0x330b0: 0x6de1a820, 0x330b1: 0x6de1aa20, 0x330b2: 0x6de1ac20, 0x330b3: 0x6de1ae20, + 0x330b4: 0x6de1b020, 0x330b5: 0x6de1b220, 0x330b6: 0x6de1b420, 0x330b7: 0x6df99820, + 0x330b8: 0x6df99a20, 0x330b9: 0x6df99c20, 0x330ba: 0x6df99e20, 0x330bb: 0x6df9a020, + 0x330bc: 0x6e0d4a20, 0x330bd: 0x6e0d4c20, 0x330be: 0x6e0d4e20, 0x330bf: 0x6e0d5020, + // Block 0xcc3, offset 0x330c0 + 0x330c0: 0x6e0d5220, 0x330c1: 0x6e0d5420, 0x330c2: 0x6e0d5620, 0x330c3: 0x6e0d5820, + 0x330c4: 0x6e1cb820, 0x330c5: 0x6e1cba20, 0x330c6: 0x6e1cbc20, 0x330c7: 0x6e1cbe20, + 0x330c8: 0x6e1cc020, 0x330c9: 0x6e1cc220, 0x330ca: 0x6e1cc420, 0x330cb: 0x6e1cc620, + 0x330cc: 0x6e28b020, 0x330cd: 0x6e31e820, 0x330ce: 0x6e401e20, 0x330cf: 0x6e31ea20, + 0x330d0: 0x6e31ec20, 0x330d1: 0x6e386a20, 0x330d2: 0x6e428e20, 0x330d3: 0x6e386c20, + 0x330d4: 0x6e386e20, 0x330d5: 0x6e387020, 0x330d6: 0x6e3d1c20, 0x330d7: 0x6e3d1e20, + 0x330d8: 0x6e3d2020, 0x330d9: 0x6e402020, 0x330da: 0x6e402220, 0x330db: 0x6e442820, + 0x330dc: 0x6e46e420, 0x330dd: 0x6c03fa20, 0x330de: 0x6c0fe820, 0x330df: 0x6c304820, + 0x330e0: 0x6c304a20, 0x330e1: 0x6c304c20, 0x330e2: 0x6c304e20, 0x330e3: 0x6c305020, + 0x330e4: 0x6c305220, 0x330e5: 0x6c305420, 0x330e6: 0x6c305620, 0x330e7: 0x6c4a9420, + 0x330e8: 0x6c4a9620, 0x330e9: 0x6c4a9820, 0x330ea: 0x6c4a9a20, 0x330eb: 0x6c4a9c20, + 0x330ec: 0x6c4a9e20, 0x330ed: 0x6c6c7a20, 0x330ee: 0x6c938820, 0x330ef: 0x6c938a20, + 0x330f0: 0x6c938c20, 0x330f1: 0x6c938e20, 0x330f2: 0x6c939020, 0x330f3: 0x6cbfdc20, + 0x330f4: 0x6cbfde20, 0x330f5: 0x6cbfe020, 0x330f6: 0x6cbfe220, 0x330f7: 0x6cbfe420, + 0x330f8: 0x6cbfe620, 0x330f9: 0x6ceff820, 0x330fa: 0x6ceffa20, 0x330fb: 0x6ceffc20, + 0x330fc: 0x6ceffe20, 0x330fd: 0x6d1fae20, 0x330fe: 0x6d1fb020, 0x330ff: 0x6d1fb220, + // Block 0xcc4, offset 0x33100 + 0x33100: 0x6d1fb420, 0x33101: 0x6d1fb620, 0x33102: 0x6d1fb820, 0x33103: 0x6d4d2420, + 0x33104: 0x6d4d2620, 0x33105: 0x6d4d2820, 0x33106: 0x6d4d2a20, 0x33107: 0x6d4d2c20, + 0x33108: 0x6d4d2e20, 0x33109: 0x6d4d3020, 0x3310a: 0x6d7a3020, 0x3310b: 0x6d7a3220, + 0x3310c: 0x6d7a3420, 0x3310d: 0x6da2c020, 0x3310e: 0x6da2c220, 0x3310f: 0x6da2c420, + 0x33110: 0x6dc4b820, 0x33111: 0x6de1b620, 0x33112: 0x6df9a620, 0x33113: 0x6e0d5c20, + 0x33114: 0x6c01aa20, 0x33115: 0x6c040020, 0x33116: 0x6c040220, 0x33117: 0x6c083e20, + 0x33118: 0x6c084020, 0x33119: 0x6c0ff220, 0x3311a: 0x6c0ff420, 0x3311b: 0x6c0ff620, + 0x3311c: 0x6c0ff820, 0x3311d: 0x6c1cc420, 0x3311e: 0x6c1cc620, 0x3311f: 0x6c1cc820, + 0x33120: 0x6c1cca20, 0x33121: 0x6c1ccc20, 0x33122: 0x6c1cce20, 0x33123: 0x6c1cd020, + 0x33124: 0x6c1cd220, 0x33125: 0x6c305e20, 0x33126: 0x6c306020, 0x33127: 0x6c306220, + 0x33128: 0x6c306420, 0x33129: 0x6c306620, 0x3312a: 0x6c4aa620, 0x3312b: 0x6c4aa820, + 0x3312c: 0x6c4aaa20, 0x3312d: 0x6c4aac20, 0x3312e: 0x6c4aae20, 0x3312f: 0x6c4ab020, + 0x33130: 0x6c4ab220, 0x33131: 0x6c4ab420, 0x33132: 0x6c4ab620, 0x33133: 0x6c4ab820, + 0x33134: 0x6c6c7e20, 0x33135: 0x6c6c8020, 0x33136: 0x6c6c8220, 0x33137: 0x6c6c8420, + 0x33138: 0x6c6c8620, 0x33139: 0x6c6c8820, 0x3313a: 0x6c6c8a20, 0x3313b: 0x6c6c8c20, + 0x3313c: 0x6c6c8e20, 0x3313d: 0x6c939620, 0x3313e: 0x6c939820, 0x3313f: 0x6c939a20, + // Block 0xcc5, offset 0x33140 + 0x33140: 0x6c939c20, 0x33141: 0x6c939e20, 0x33142: 0x6c93a020, 0x33143: 0x6c93a220, + 0x33144: 0x6c93a420, 0x33145: 0x6c93a620, 0x33146: 0x6c93a820, 0x33147: 0x6c93aa20, + 0x33148: 0x6c93ac20, 0x33149: 0x6c93ae20, 0x3314a: 0x6c93b020, 0x3314b: 0x6c93b220, + 0x3314c: 0x6c93b420, 0x3314d: 0x6c93b620, 0x3314e: 0x6cbfee20, 0x3314f: 0x6cbff020, + 0x33150: 0x6cbff220, 0x33151: 0x6cbff420, 0x33152: 0x6cbff620, 0x33153: 0x6cbff820, + 0x33154: 0x6cbffa20, 0x33155: 0x6cbffc20, 0x33156: 0x6cbffe20, 0x33157: 0x6cc00020, + 0x33158: 0x6cf00620, 0x33159: 0x6cf00820, 0x3315a: 0x6cf00a20, 0x3315b: 0x6cf00c20, + 0x3315c: 0x6cf00e20, 0x3315d: 0x6cf01020, 0x3315e: 0x6d1fbe20, 0x3315f: 0x6d1fc020, + 0x33160: 0x6d1fc220, 0x33161: 0x6d1fc420, 0x33162: 0x6d1fc620, 0x33163: 0x6d1fc820, + 0x33164: 0x6d1fca20, 0x33165: 0x6d1fcc20, 0x33166: 0x6d4d3a20, 0x33167: 0x6d4d3c20, + 0x33168: 0x6d4d3e20, 0x33169: 0x6d4d4020, 0x3316a: 0x6d4d4220, 0x3316b: 0x6d4d4420, + 0x3316c: 0x6d4d4620, 0x3316d: 0x6d4d4820, 0x3316e: 0x6d4d4a20, 0x3316f: 0x6d4d4c20, + 0x33170: 0x6d7a3820, 0x33171: 0x6d7a3a20, 0x33172: 0x6d7a3c20, 0x33173: 0x6d7a3e20, + 0x33174: 0x6da2c820, 0x33175: 0x6da2ca20, 0x33176: 0x6da2cc20, 0x33177: 0x6dc4ba20, + 0x33178: 0x6dc4bc20, 0x33179: 0x6dc4be20, 0x3317a: 0x6dc4c020, 0x3317b: 0x6dc4c220, + 0x3317c: 0x6de1b820, 0x3317d: 0x6de1ba20, 0x3317e: 0x6de1bc20, 0x3317f: 0x6e0d5e20, + // Block 0xcc6, offset 0x33180 + 0x33180: 0x6e462420, 0x33181: 0x6c01ae20, 0x33182: 0x6c01b020, 0x33183: 0x6c040820, + 0x33184: 0x6c084220, 0x33185: 0x6c084420, 0x33186: 0x6c084620, 0x33187: 0x6c084820, + 0x33188: 0x6c084a20, 0x33189: 0x6c084c20, 0x3318a: 0x6c084e20, 0x3318b: 0x6c100220, + 0x3318c: 0x6c100420, 0x3318d: 0x6c100620, 0x3318e: 0x6c100820, 0x3318f: 0x6c1ce220, + 0x33190: 0x6c1ce420, 0x33191: 0x6c1ce620, 0x33192: 0x6c1ce820, 0x33193: 0x6c1cea20, + 0x33194: 0x6c1cec20, 0x33195: 0x6c1cee20, 0x33196: 0x6c1cf020, 0x33197: 0x6c1cf220, + 0x33198: 0x6c1cf420, 0x33199: 0x6c1cf620, 0x3319a: 0x6c307020, 0x3319b: 0x6c307220, + 0x3319c: 0x6c307420, 0x3319d: 0x6c307620, 0x3319e: 0x6c307820, 0x3319f: 0x6c307a20, + 0x331a0: 0x6c307c20, 0x331a1: 0x6c307e20, 0x331a2: 0x6c4ac220, 0x331a3: 0x6c4ac420, + 0x331a4: 0x6c4ac620, 0x331a5: 0x6c5fca20, 0x331a6: 0x6c4ac820, 0x331a7: 0x6c4aca20, + 0x331a8: 0x6c6c9620, 0x331a9: 0x6c6c9820, 0x331aa: 0x6c6c9a20, 0x331ab: 0x6c6c9c20, + 0x331ac: 0x6c6c9e20, 0x331ad: 0x6c6ca020, 0x331ae: 0x6c6ca220, 0x331af: 0x6c6ca420, + 0x331b0: 0x6c6ca620, 0x331b1: 0x6c6ca820, 0x331b2: 0x6c6caa20, 0x331b3: 0x6c93c020, + 0x331b4: 0x6c93c220, 0x331b5: 0x6c93c420, 0x331b6: 0x6c93c620, 0x331b7: 0x6c93c820, + 0x331b8: 0x6c93ca20, 0x331b9: 0x6cc00a20, 0x331ba: 0x6cc00c20, 0x331bb: 0x6cc00e20, + 0x331bc: 0x6cc01020, 0x331bd: 0x6cc01220, 0x331be: 0x6cc01420, 0x331bf: 0x6cc01620, + // Block 0xcc7, offset 0x331c0 + 0x331c0: 0x6cc01820, 0x331c1: 0x6cc01a20, 0x331c2: 0x6cc01c20, 0x331c3: 0x6cf01c20, + 0x331c4: 0x6cf01e20, 0x331c5: 0x6cf02020, 0x331c6: 0x6cf02220, 0x331c7: 0x6cf02420, + 0x331c8: 0x6cf02620, 0x331c9: 0x6cf02820, 0x331ca: 0x6cf02a20, 0x331cb: 0x6d1fd020, + 0x331cc: 0x6d1fd220, 0x331cd: 0x6d1fd420, 0x331ce: 0x6d1fd620, 0x331cf: 0x6d1fd820, + 0x331d0: 0x6d4d5220, 0x331d1: 0x6d4d5420, 0x331d2: 0x6d4d5620, 0x331d3: 0x6d4d5820, + 0x331d4: 0x6d4d5a20, 0x331d5: 0x6d4d5c20, 0x331d6: 0x6d7a4220, 0x331d7: 0x6d7a4420, + 0x331d8: 0x6d7a4620, 0x331d9: 0x6d7a4820, 0x331da: 0x6d7a4a20, 0x331db: 0x6da2d620, + 0x331dc: 0x6da2d820, 0x331dd: 0x6e0d6020, 0x331de: 0x6e0d6220, 0x331df: 0x6e1cc820, + 0x331e0: 0x6e1cca20, 0x331e1: 0x6e387220, 0x331e2: 0x6e387420, 0x331e3: 0x6c01b420, + 0x331e4: 0x6c085620, 0x331e5: 0x6c085820, 0x331e6: 0x6c085a20, 0x331e7: 0x6c085c20, + 0x331e8: 0x6c085e20, 0x331e9: 0x6c101020, 0x331ea: 0x6c101220, 0x331eb: 0x6c101420, + 0x331ec: 0x6c101620, 0x331ed: 0x6c101820, 0x331ee: 0x6c101a20, 0x331ef: 0x6c101c20, + 0x331f0: 0x6c101e20, 0x331f1: 0x6c102020, 0x331f2: 0x6c102220, 0x331f3: 0x6c102420, + 0x331f4: 0x6c086020, 0x331f5: 0x6c1d0620, 0x331f6: 0x6c1d0820, 0x331f7: 0x6c1d0a20, + 0x331f8: 0x6c1d0c20, 0x331f9: 0x6c1d0e20, 0x331fa: 0x6c1d1020, 0x331fb: 0x6c1d1220, + 0x331fc: 0x6c1d1420, 0x331fd: 0x6c1d1620, 0x331fe: 0x6c309420, 0x331ff: 0x6c309620, + // Block 0xcc8, offset 0x33200 + 0x33200: 0x6c309820, 0x33201: 0x6c309a20, 0x33202: 0x6c309c20, 0x33203: 0x6c309e20, + 0x33204: 0x6c30a020, 0x33205: 0x6c30a220, 0x33206: 0x6c30a420, 0x33207: 0x6c30a620, + 0x33208: 0x6c30a820, 0x33209: 0x6c30aa20, 0x3320a: 0x6c30ac20, 0x3320b: 0x6c30ae20, + 0x3320c: 0x6c4ae020, 0x3320d: 0x6c4ae220, 0x3320e: 0x6c4ae420, 0x3320f: 0x6c4ae620, + 0x33210: 0x6c4ae820, 0x33211: 0x6c4aea20, 0x33212: 0x6c4aec20, 0x33213: 0x6c4aee20, + 0x33214: 0x6c4af020, 0x33215: 0x6c4af220, 0x33216: 0x6c4af420, 0x33217: 0x6c4af620, + 0x33218: 0x6c4af820, 0x33219: 0x6c4afa20, 0x3321a: 0x6c4afc20, 0x3321b: 0x6c4afe20, + 0x3321c: 0x6c4b0020, 0x3321d: 0x6c4b0220, 0x3321e: 0x6c4b0420, 0x3321f: 0x6c4b0620, + 0x33220: 0x6c4b0820, 0x33221: 0x6c4b0a20, 0x33222: 0x6c6cc020, 0x33223: 0x6c6cc220, + 0x33224: 0x6c6cc420, 0x33225: 0x6c6cc620, 0x33226: 0x6c6cc820, 0x33227: 0x6c6cca20, + 0x33228: 0x6c6ccc20, 0x33229: 0x6c6cce20, 0x3322a: 0x6c6cd020, 0x3322b: 0x6c6cd220, + 0x3322c: 0x6c6cd420, 0x3322d: 0x6c6cd620, 0x3322e: 0x6c6cd820, 0x3322f: 0x6c6cda20, + 0x33230: 0x6c6cdc20, 0x33231: 0x6c6cde20, 0x33232: 0x6c6ce020, 0x33233: 0x6c6ce220, + 0x33234: 0x6c6ce420, 0x33235: 0x6c6ce620, 0x33236: 0x6c6ce820, 0x33237: 0x6c6cea20, + 0x33238: 0x6c6cec20, 0x33239: 0x6c6cee20, 0x3323a: 0x6c93da20, 0x3323b: 0x6c93dc20, + 0x3323c: 0x6c93de20, 0x3323d: 0x6c93e020, 0x3323e: 0x6c93e220, 0x3323f: 0x6c93e420, + // Block 0xcc9, offset 0x33240 + 0x33240: 0x6c93e620, 0x33241: 0x6c93e820, 0x33242: 0x6c93ea20, 0x33243: 0x6c93ec20, + 0x33244: 0x6c93ee20, 0x33245: 0x6c93f020, 0x33246: 0x6c93f220, 0x33247: 0x6c93f420, + 0x33248: 0x6c93f620, 0x33249: 0x6c93f820, 0x3324a: 0x6c93fa20, 0x3324b: 0x6c93fc20, + 0x3324c: 0x6c93fe20, 0x3324d: 0x6c940020, 0x3324e: 0x6c940220, 0x3324f: 0x6c940420, + 0x33250: 0x6c940620, 0x33251: 0x6c940820, 0x33252: 0x6c940a20, 0x33253: 0x6c940c20, + 0x33254: 0x6cc02a20, 0x33255: 0x6cc02c20, 0x33256: 0x6cc02e20, 0x33257: 0x6cc03020, + 0x33258: 0x6cc03220, 0x33259: 0x6cc03420, 0x3325a: 0x6cc03620, 0x3325b: 0x6cc03820, + 0x3325c: 0x6cc03a20, 0x3325d: 0x6cc03c20, 0x3325e: 0x6cc03e20, 0x3325f: 0x6cc04020, + 0x33260: 0x6cc04220, 0x33261: 0x6cc04420, 0x33262: 0x6cc04620, 0x33263: 0x6cc04820, + 0x33264: 0x6cc04a20, 0x33265: 0x6cc04c20, 0x33266: 0x6cc04e20, 0x33267: 0x6cc05020, + 0x33268: 0x6cc05220, 0x33269: 0x6cc05420, 0x3326a: 0x6cc05620, 0x3326b: 0x6cc05820, + 0x3326c: 0x6cf02e20, 0x3326d: 0x6cf03020, 0x3326e: 0x6cf03220, 0x3326f: 0x6cf03420, + 0x33270: 0x6cf03620, 0x33271: 0x6cf03820, 0x33272: 0x6cf03a20, 0x33273: 0x6cf03c20, + 0x33274: 0x6cf03e20, 0x33275: 0x6cf04020, 0x33276: 0x6cf04220, 0x33277: 0x6cf04420, + 0x33278: 0x6cf04620, 0x33279: 0x6cf04820, 0x3327a: 0x6cf04a20, 0x3327b: 0x6cf04c20, + 0x3327c: 0x6cf04e20, 0x3327d: 0x6cf05020, 0x3327e: 0x6cf05220, 0x3327f: 0x6cf05420, + // Block 0xcca, offset 0x33280 + 0x33280: 0x6cf05620, 0x33281: 0x6cf05820, 0x33282: 0x6cf05a20, 0x33283: 0x6cf05c20, + 0x33284: 0x6d1fe420, 0x33285: 0x6d1fe620, 0x33286: 0x6d1fe820, 0x33287: 0x6d1fea20, + 0x33288: 0x6d1fec20, 0x33289: 0x6d1fee20, 0x3328a: 0x6d1ff020, 0x3328b: 0x6d1ff220, + 0x3328c: 0x6d1ff420, 0x3328d: 0x6d1ff620, 0x3328e: 0x6d1ff820, 0x3328f: 0x6d1ffa20, + 0x33290: 0x6d4d6a20, 0x33291: 0x6d4d6c20, 0x33292: 0x6d4d6e20, 0x33293: 0x6d4d7020, + 0x33294: 0x6d4d7220, 0x33295: 0x6d4d7420, 0x33296: 0x6d4d7620, 0x33297: 0x6d4d7820, + 0x33298: 0x6d4d7a20, 0x33299: 0x6d4d7c20, 0x3329a: 0x6d4d7e20, 0x3329b: 0x6d4d8020, + 0x3329c: 0x6d4d8220, 0x3329d: 0x6d4d8420, 0x3329e: 0x6d4d8620, 0x3329f: 0x6d7a4c20, + 0x332a0: 0x6d7a4e20, 0x332a1: 0x6d7a5020, 0x332a2: 0x6d7a5220, 0x332a3: 0x6d7a5420, + 0x332a4: 0x6d7a5620, 0x332a5: 0x6d7a5820, 0x332a6: 0x6d7a5a20, 0x332a7: 0x6d7a5c20, + 0x332a8: 0x6da2dc20, 0x332a9: 0x6da2de20, 0x332aa: 0x6dc4ca20, 0x332ab: 0x6dc4cc20, + 0x332ac: 0x6de1c220, 0x332ad: 0x6de1c420, 0x332ae: 0x6de1c620, 0x332af: 0x6de1c820, + 0x332b0: 0x6de1ca20, 0x332b1: 0x6df9a820, 0x332b2: 0x6df9aa20, 0x332b3: 0x6df9ac20, + 0x332b4: 0x6df9ae20, 0x332b5: 0x6e0d6620, 0x332b6: 0x6e0d6820, 0x332b7: 0x6e0d6a20, + 0x332b8: 0x6e1ccc20, 0x332b9: 0x6e1cce20, 0x332ba: 0x6e1cd020, 0x332bb: 0x6e31f220, + 0x332bc: 0x6e387620, 0x332bd: 0x6e387820, 0x332be: 0x6c01b820, 0x332bf: 0x6c086220, + // Block 0xccb, offset 0x332c0 + 0x332c0: 0x6c102a20, 0x332c1: 0x6c102c20, 0x332c2: 0x6c102e20, 0x332c3: 0x6c103020, + 0x332c4: 0x6c103220, 0x332c5: 0x6c103420, 0x332c6: 0x6c1d2220, 0x332c7: 0x6c1d2420, + 0x332c8: 0x6c1d2620, 0x332c9: 0x6c1d2820, 0x332ca: 0x6c1d2a20, 0x332cb: 0x6c30b220, + 0x332cc: 0x6c30b420, 0x332cd: 0x6c30b620, 0x332ce: 0x6c4b1220, 0x332cf: 0x6c4b1420, + 0x332d0: 0x6c4b1620, 0x332d1: 0x6c4b1820, 0x332d2: 0x6c4b1a20, 0x332d3: 0x6c4b1c20, + 0x332d4: 0x6c4b1e20, 0x332d5: 0x6c6cf420, 0x332d6: 0x6c6cf620, 0x332d7: 0x6c6cf820, + 0x332d8: 0x6c6cfa20, 0x332d9: 0x6c6cfc20, 0x332da: 0x6c6cfe20, 0x332db: 0x6c941220, + 0x332dc: 0x6c941420, 0x332dd: 0x6cc06220, 0x332de: 0x6cc06420, 0x332df: 0x6cc06620, + 0x332e0: 0x6cc06820, 0x332e1: 0x6cc06a20, 0x332e2: 0x6cc06c20, 0x332e3: 0x6cc06e20, + 0x332e4: 0x6cf06420, 0x332e5: 0x6cf06620, 0x332e6: 0x6d4d8c20, 0x332e7: 0x6d4d8e20, + 0x332e8: 0x6d4d9020, 0x332e9: 0x6d4d9220, 0x332ea: 0x6dc4ce20, 0x332eb: 0x6e0d6c20, + 0x332ec: 0x6e1cd420, 0x332ed: 0x6c041420, 0x332ee: 0x6c041620, 0x332ef: 0x6c041820, + 0x332f0: 0x6c087620, 0x332f1: 0x6c087820, 0x332f2: 0x6c087a20, 0x332f3: 0x6c087c20, + 0x332f4: 0x6c087e20, 0x332f5: 0x6c088020, 0x332f6: 0x6c088220, 0x332f7: 0x6c088420, + 0x332f8: 0x6c088620, 0x332f9: 0x6c088820, 0x332fa: 0x6c088a20, 0x332fb: 0x6c088c20, + 0x332fc: 0x6c088e20, 0x332fd: 0x6c089020, 0x332fe: 0x6c105e20, 0x332ff: 0x6c106020, + // Block 0xccc, offset 0x33300 + 0x33300: 0x6c106220, 0x33301: 0x6c106420, 0x33302: 0x6c106620, 0x33303: 0x6c106820, + 0x33304: 0x6c106a20, 0x33305: 0x6c106c20, 0x33306: 0x6c106e20, 0x33307: 0x6c107020, + 0x33308: 0x6c107220, 0x33309: 0x6c107420, 0x3330a: 0x6c107620, 0x3330b: 0x6c107820, + 0x3330c: 0x6c107a20, 0x3330d: 0x6c107c20, 0x3330e: 0x6c107e20, 0x3330f: 0x6c108020, + 0x33310: 0x6c108220, 0x33311: 0x6c108420, 0x33312: 0x6c108620, 0x33313: 0x6c1d6c20, + 0x33314: 0x6c1d6e20, 0x33315: 0x6c1d7020, 0x33316: 0x6c1d7220, 0x33317: 0x6c1d7420, + 0x33318: 0x6c1d7620, 0x33319: 0x6c1d7820, 0x3331a: 0x6c1d7a20, 0x3331b: 0x6c1d7c20, + 0x3331c: 0x6c1d7e20, 0x3331d: 0x6c1d8020, 0x3331e: 0x6c1d8220, 0x3331f: 0x6c1d8420, + 0x33320: 0x6c1d8620, 0x33321: 0x6c1d8820, 0x33322: 0x6c1d8a20, 0x33323: 0x6c1d8c20, + 0x33324: 0x6c1d8e20, 0x33325: 0x6c1d9020, 0x33326: 0x6c1d9220, 0x33327: 0x6c1d9420, + 0x33328: 0x6c1d9620, 0x33329: 0x6c1d9820, 0x3332a: 0x6c1d9a20, 0x3332b: 0x6c1d9c20, + 0x3332c: 0x6c1d9e20, 0x3332d: 0x6c1da020, 0x3332e: 0x6c1da220, 0x3332f: 0x6c1da420, + 0x33330: 0x6c1da620, 0x33331: 0x6c1da820, 0x33332: 0x6c1daa20, 0x33333: 0x6c1dac20, + 0x33334: 0x6c1dae20, 0x33335: 0x6c1db020, 0x33336: 0x6c1db220, 0x33337: 0x6c1db420, + 0x33338: 0x6c1db620, 0x33339: 0x6c1db820, 0x3333a: 0x6c1dba20, 0x3333b: 0x6c1dbc20, + 0x3333c: 0x6c1dbe20, 0x3333d: 0x6c1dc020, 0x3333e: 0x6c1dc220, 0x3333f: 0x6c1dc420, + // Block 0xccd, offset 0x33340 + 0x33340: 0x6c1dc620, 0x33341: 0x6c1dc820, 0x33342: 0x6c1dca20, 0x33343: 0x6c312020, + 0x33344: 0x6c312220, 0x33345: 0x6c312420, 0x33346: 0x6c312620, 0x33347: 0x6c312820, + 0x33348: 0x6c312a20, 0x33349: 0x6c312c20, 0x3334a: 0x6c312e20, 0x3334b: 0x6c313020, + 0x3334c: 0x6c313220, 0x3334d: 0x6c313420, 0x3334e: 0x6c313620, 0x3334f: 0x6c313820, + 0x33350: 0x6c313a20, 0x33351: 0x6c313c20, 0x33352: 0x6c313e20, 0x33353: 0x6c314020, + 0x33354: 0x6c314220, 0x33355: 0x6c314420, 0x33356: 0x6c314620, 0x33357: 0x6c314820, + 0x33358: 0x6c314a20, 0x33359: 0x6c314c20, 0x3335a: 0x6c314e20, 0x3335b: 0x6c315020, + 0x3335c: 0x6c315220, 0x3335d: 0x6c315420, 0x3335e: 0x6c315620, 0x3335f: 0x6c315820, + 0x33360: 0x6c315a20, 0x33361: 0x6c315c20, 0x33362: 0x6c315e20, 0x33363: 0x6c316020, + 0x33364: 0x6c3bdc20, 0x33365: 0x6c316220, 0x33366: 0x6c316420, 0x33367: 0x6c316620, + 0x33368: 0x6c316820, 0x33369: 0x6c316a20, 0x3336a: 0x6c316c20, 0x3336b: 0x6c4b6a20, + 0x3336c: 0x6c4b6c20, 0x3336d: 0x6c4b6e20, 0x3336e: 0x6c4b7020, 0x3336f: 0x6c4b7220, + 0x33370: 0x6c4b7420, 0x33371: 0x6c4b7620, 0x33372: 0x6c4b7820, 0x33373: 0x6c4b7a20, + 0x33374: 0x6c4b7c20, 0x33375: 0x6c4b7e20, 0x33376: 0x6c4b8020, 0x33377: 0x6c4b8220, + 0x33378: 0x6c4b8420, 0x33379: 0x6c4b8620, 0x3337a: 0x6c4b8820, 0x3337b: 0x6c4b8a20, + 0x3337c: 0x6c4b8c20, 0x3337d: 0x6c4b8e20, 0x3337e: 0x6c4b9020, 0x3337f: 0x6c4b9220, + // Block 0xcce, offset 0x33380 + 0x33380: 0x6c4b9420, 0x33381: 0x6c4b9620, 0x33382: 0x6c4b9820, 0x33383: 0x6c4b9a20, + 0x33384: 0x6c4b9c20, 0x33385: 0x6c4b9e20, 0x33386: 0x6c4ba020, 0x33387: 0x6c4ba220, + 0x33388: 0x6c4ba420, 0x33389: 0x6c4ba620, 0x3338a: 0x6c4ba820, 0x3338b: 0x6c4baa20, + 0x3338c: 0x6c4bac20, 0x3338d: 0x6c4bae20, 0x3338e: 0x6c4bb020, 0x3338f: 0x6c4bb220, + 0x33390: 0x6c4bb420, 0x33391: 0x6c4bb620, 0x33392: 0x6c4bb820, 0x33393: 0x6c4bba20, + 0x33394: 0x6c4bbc20, 0x33395: 0x6c6d5a20, 0x33396: 0x6c6d5c20, 0x33397: 0x6c6d5e20, + 0x33398: 0x6c6d6020, 0x33399: 0x6c6d6220, 0x3339a: 0x6c6d6420, 0x3339b: 0x6c6d6620, + 0x3339c: 0x6c6d6820, 0x3339d: 0x6c6d6a20, 0x3339e: 0x6c6d6c20, 0x3339f: 0x6c6d6e20, + 0x333a0: 0x6c6d7020, 0x333a1: 0x6c6d7220, 0x333a2: 0x6c6d7420, 0x333a3: 0x6c6d7620, + 0x333a4: 0x6c6d7820, 0x333a5: 0x6c6d7a20, 0x333a6: 0x6c6d7c20, 0x333a7: 0x6c6d7e20, + 0x333a8: 0x6c6d8020, 0x333a9: 0x6c6d8220, 0x333aa: 0x6c6d8420, 0x333ab: 0x6c6d8620, + 0x333ac: 0x6c6d8820, 0x333ad: 0x6c6d8a20, 0x333ae: 0x6c6d8c20, 0x333af: 0x6c6d8e20, + 0x333b0: 0x6c6d9020, 0x333b1: 0x6c6d9220, 0x333b2: 0x6c6d9420, 0x333b3: 0x6c6d9620, + 0x333b4: 0x6c6d9820, 0x333b5: 0x6c6d9a20, 0x333b6: 0x6c6d9c20, 0x333b7: 0x6c6d9e20, + 0x333b8: 0x6c6da020, 0x333b9: 0x6c6da220, 0x333ba: 0x6c6da420, 0x333bb: 0x6c6da620, + 0x333bc: 0x6c6da820, 0x333bd: 0x6c6daa20, 0x333be: 0x6c6dac20, 0x333bf: 0x6c6dae20, + // Block 0xccf, offset 0x333c0 + 0x333c0: 0x6c6db020, 0x333c1: 0x6c6db220, 0x333c2: 0x6c6db420, 0x333c3: 0x6c6db620, + 0x333c4: 0x6c6db820, 0x333c5: 0x6c6dba20, 0x333c6: 0x6c6dbc20, 0x333c7: 0x6c6dbe20, + 0x333c8: 0x6c6dc020, 0x333c9: 0x6c6dc220, 0x333ca: 0x6c6dc420, 0x333cb: 0x6c6dc620, + 0x333cc: 0x6c6dc820, 0x333cd: 0x6c6dca20, 0x333ce: 0x6c6dcc20, 0x333cf: 0x6c6dce20, + 0x333d0: 0x6c6dd020, 0x333d1: 0x6c948a20, 0x333d2: 0x6c948c20, 0x333d3: 0x6c948e20, + 0x333d4: 0x6c949020, 0x333d5: 0x6c949220, 0x333d6: 0x6c949420, 0x333d7: 0x6c949620, + 0x333d8: 0x6c949820, 0x333d9: 0x6c949a20, 0x333da: 0x6c949c20, 0x333db: 0x6c949e20, + 0x333dc: 0x6c94a020, 0x333dd: 0x6c94a220, 0x333de: 0x6c94a420, 0x333df: 0x6c94a620, + 0x333e0: 0x6c94a820, 0x333e1: 0x6c94aa20, 0x333e2: 0x6c94ac20, 0x333e3: 0x6c94ae20, + 0x333e4: 0x6c94b020, 0x333e5: 0x6c94b220, 0x333e6: 0x6c94b420, 0x333e7: 0x6c94b620, + 0x333e8: 0x6c94b820, 0x333e9: 0x6c94ba20, 0x333ea: 0x6c94bc20, 0x333eb: 0x6c94be20, + 0x333ec: 0x6c94c020, 0x333ed: 0x6c94c220, 0x333ee: 0x6c94c420, 0x333ef: 0x6c94c620, + 0x333f0: 0x6c94c820, 0x333f1: 0x6c94ca20, 0x333f2: 0x6c94cc20, 0x333f3: 0x6c94ce20, + 0x333f4: 0x6c94d020, 0x333f5: 0x6c94d220, 0x333f6: 0x6c94d420, 0x333f7: 0x6c94d620, + 0x333f8: 0x6c94d820, 0x333f9: 0x6c94da20, 0x333fa: 0x6c94dc20, 0x333fb: 0x6c94de20, + 0x333fc: 0x6c94e020, 0x333fd: 0x6c94e220, 0x333fe: 0x6c94e420, 0x333ff: 0x6c94e620, + // Block 0xcd0, offset 0x33400 + 0x33400: 0x6c94e820, 0x33401: 0x6c94ea20, 0x33402: 0x6c94ec20, 0x33403: 0x6c94ee20, + 0x33404: 0x6c94f020, 0x33405: 0x6c94f220, 0x33406: 0x6c94f420, 0x33407: 0x6c94f620, + 0x33408: 0x6c94f820, 0x33409: 0x6c94fa20, 0x3340a: 0x6c94fc20, 0x3340b: 0x6c94fe20, + 0x3340c: 0x6c950020, 0x3340d: 0x6c950220, 0x3340e: 0x6c950420, 0x3340f: 0x6c950620, + 0x33410: 0x6c950820, 0x33411: 0x6c950a20, 0x33412: 0x6c950c20, 0x33413: 0x6c950e20, + 0x33414: 0x6c951020, 0x33415: 0x6c951220, 0x33416: 0x6c951420, 0x33417: 0x6c951620, + 0x33418: 0x6c951820, 0x33419: 0x6c951a20, 0x3341a: 0x6c951c20, 0x3341b: 0x6c951e20, + 0x3341c: 0x6c952020, 0x3341d: 0x6c952220, 0x3341e: 0x6c952420, 0x3341f: 0x6c952620, + 0x33420: 0x6c952820, 0x33421: 0x6c952a20, 0x33422: 0x6c952c20, 0x33423: 0x6c952e20, + 0x33424: 0x6c953020, 0x33425: 0x6c953220, 0x33426: 0x6c953420, 0x33427: 0x6c953620, + 0x33428: 0x6c953820, 0x33429: 0x6c953a20, 0x3342a: 0x6cc0de20, 0x3342b: 0x6cc0e020, + 0x3342c: 0x6cc0e220, 0x3342d: 0x6cc0e420, 0x3342e: 0x6cc0e620, 0x3342f: 0x6cc0e820, + 0x33430: 0x6cc0ea20, 0x33431: 0x6cc0ec20, 0x33432: 0x6cc0ee20, 0x33433: 0x6cc0f020, + 0x33434: 0x6cc0f220, 0x33435: 0x6cc0f420, 0x33436: 0x6cc0f620, 0x33437: 0x6cc0f820, + 0x33438: 0x6cc0fa20, 0x33439: 0x6cc0fc20, 0x3343a: 0x6cc0fe20, 0x3343b: 0x6cc10020, + 0x3343c: 0x6cc10220, 0x3343d: 0x6cc10420, 0x3343e: 0x6cc10620, 0x3343f: 0x6cc10820, + // Block 0xcd1, offset 0x33440 + 0x33440: 0x6cc10a20, 0x33441: 0x6cc10c20, 0x33442: 0x6cc10e20, 0x33443: 0x6cc11020, + 0x33444: 0x6cc11220, 0x33445: 0x6cc11420, 0x33446: 0x6cc11620, 0x33447: 0x6cc11820, + 0x33448: 0x6cc11a20, 0x33449: 0x6cc11c20, 0x3344a: 0x6cc11e20, 0x3344b: 0x6cc12020, + 0x3344c: 0x6cc12220, 0x3344d: 0x6cc12420, 0x3344e: 0x6cc12620, 0x3344f: 0x6cc12820, + 0x33450: 0x6cc12a20, 0x33451: 0x6cc12c20, 0x33452: 0x6cc12e20, 0x33453: 0x6cc13020, + 0x33454: 0x6cc13220, 0x33455: 0x6cc13420, 0x33456: 0x6cc13620, 0x33457: 0x6cc13820, + 0x33458: 0x6cc13a20, 0x33459: 0x6cc13c20, 0x3345a: 0x6cc13e20, 0x3345b: 0x6cc14020, + 0x3345c: 0x6cc14220, 0x3345d: 0x6cc14420, 0x3345e: 0x6cc14620, 0x3345f: 0x6cc14820, + 0x33460: 0x6cc14a20, 0x33461: 0x6cc14c20, 0x33462: 0x6cc14e20, 0x33463: 0x6cc15020, + 0x33464: 0x6cc15220, 0x33465: 0x6cc15420, 0x33466: 0x6cc15620, 0x33467: 0x6cc15820, + 0x33468: 0x6cc15a20, 0x33469: 0x6cc15c20, 0x3346a: 0x6cf0ac20, 0x3346b: 0x6cf0ae20, + 0x3346c: 0x6cf0b020, 0x3346d: 0x6cf0b220, 0x3346e: 0x6cf0b420, 0x3346f: 0x6cf0b620, + 0x33470: 0x6cf0b820, 0x33471: 0x6cf0ba20, 0x33472: 0x6cf0bc20, 0x33473: 0x6cf0be20, + 0x33474: 0x6cf0c020, 0x33475: 0x6cf0c220, 0x33476: 0x6cf0c420, 0x33477: 0x6cf0c620, + 0x33478: 0x6cf0c820, 0x33479: 0x6cf0ca20, 0x3347a: 0x6cf0cc20, 0x3347b: 0x6cf0ce20, + 0x3347c: 0x6cf0d020, 0x3347d: 0x6cf0d220, 0x3347e: 0x6cf0d420, 0x3347f: 0x6cf0d620, + // Block 0xcd2, offset 0x33480 + 0x33480: 0x6cf0d820, 0x33481: 0x6cf0da20, 0x33482: 0x6cf0dc20, 0x33483: 0x6cf0de20, + 0x33484: 0x6cf0e020, 0x33485: 0x6cf0e220, 0x33486: 0x6cf0e420, 0x33487: 0x6cf0e620, + 0x33488: 0x6cf0e820, 0x33489: 0x6cf0ea20, 0x3348a: 0x6cf0ec20, 0x3348b: 0x6cf0ee20, + 0x3348c: 0x6cf0f020, 0x3348d: 0x6cf0f220, 0x3348e: 0x6cf0f420, 0x3348f: 0x6cf0f620, + 0x33490: 0x6cf0f820, 0x33491: 0x6cf0fa20, 0x33492: 0x6cf0fc20, 0x33493: 0x6cf0fe20, + 0x33494: 0x6cf10020, 0x33495: 0x6cf10220, 0x33496: 0x6cf10420, 0x33497: 0x6cf10620, + 0x33498: 0x6d204820, 0x33499: 0x6d204a20, 0x3349a: 0x6d204c20, 0x3349b: 0x6d204e20, + 0x3349c: 0x6d205020, 0x3349d: 0x6d205220, 0x3349e: 0x6d205420, 0x3349f: 0x6d205620, + 0x334a0: 0x6d205820, 0x334a1: 0x6d205a20, 0x334a2: 0x6d205c20, 0x334a3: 0x6d205e20, + 0x334a4: 0x6d206020, 0x334a5: 0x6d206220, 0x334a6: 0x6d206420, 0x334a7: 0x6d206620, + 0x334a8: 0x6d206820, 0x334a9: 0x6d206a20, 0x334aa: 0x6d206c20, 0x334ab: 0x6d206e20, + 0x334ac: 0x6d207020, 0x334ad: 0x6d207220, 0x334ae: 0x6d207420, 0x334af: 0x6d207620, + 0x334b0: 0x6d207820, 0x334b1: 0x6d207a20, 0x334b2: 0x6d207c20, 0x334b3: 0x6d207e20, + 0x334b4: 0x6d208020, 0x334b5: 0x6d208220, 0x334b6: 0x6d208420, 0x334b7: 0x6d208620, + 0x334b8: 0x6d208820, 0x334b9: 0x6d208a20, 0x334ba: 0x6d208c20, 0x334bb: 0x6d208e20, + 0x334bc: 0x6d209020, 0x334bd: 0x6d209220, 0x334be: 0x6d209420, 0x334bf: 0x6d209620, + // Block 0xcd3, offset 0x334c0 + 0x334c0: 0x6d209820, 0x334c1: 0x6d209a20, 0x334c2: 0x6d209c20, 0x334c3: 0x6d209e20, + 0x334c4: 0x6d20a020, 0x334c5: 0x6d20a220, 0x334c6: 0x6d20a420, 0x334c7: 0x6d20a620, + 0x334c8: 0x6d20a820, 0x334c9: 0x6d20aa20, 0x334ca: 0x6d4dda20, 0x334cb: 0x6d4ddc20, + 0x334cc: 0x6d4dde20, 0x334cd: 0x6d4de020, 0x334ce: 0x6d4de220, 0x334cf: 0x6d4de420, + 0x334d0: 0x6d4de620, 0x334d1: 0x6d4de820, 0x334d2: 0x6d4dea20, 0x334d3: 0x6d4dec20, + 0x334d4: 0x6d4dee20, 0x334d5: 0x6d4df020, 0x334d6: 0x6d4df220, 0x334d7: 0x6d4df420, + 0x334d8: 0x6d4df620, 0x334d9: 0x6d4df820, 0x334da: 0x6d4dfa20, 0x334db: 0x6d4dfc20, + 0x334dc: 0x6d4dfe20, 0x334dd: 0x6d4e0020, 0x334de: 0x6d4e0220, 0x334df: 0x6d4e0420, + 0x334e0: 0x6d4e0620, 0x334e1: 0x6d4e0820, 0x334e2: 0x6d4e0a20, 0x334e3: 0x6d4e0c20, + 0x334e4: 0x6d4e0e20, 0x334e5: 0x6d4e1020, 0x334e6: 0x6d4e1220, 0x334e7: 0x6d4e1420, + 0x334e8: 0x6d4e1620, 0x334e9: 0x6d4e1820, 0x334ea: 0x6d4e1a20, 0x334eb: 0x6d4e1c20, + 0x334ec: 0x6d4e1e20, 0x334ed: 0x6d4e2020, 0x334ee: 0x6d4e2220, 0x334ef: 0x6d4e2420, + 0x334f0: 0x6d4e2620, 0x334f1: 0x6d4e2820, 0x334f2: 0x6d4e2a20, 0x334f3: 0x6d4e2c20, + 0x334f4: 0x6d4e2e20, 0x334f5: 0x6d4e3020, 0x334f6: 0x6d4e3220, 0x334f7: 0x6d4e3420, + 0x334f8: 0x6d4e3620, 0x334f9: 0x6d4e3820, 0x334fa: 0x6d4e3a20, 0x334fb: 0x6d4e3c20, + 0x334fc: 0x6d4e3e20, 0x334fd: 0x6d7a9020, 0x334fe: 0x6d7a9220, 0x334ff: 0x6d7a9420, + // Block 0xcd4, offset 0x33500 + 0x33500: 0x6d7a9620, 0x33501: 0x6d7a9820, 0x33502: 0x6d7a9a20, 0x33503: 0x6d7a9c20, + 0x33504: 0x6d7a9e20, 0x33505: 0x6d7aa020, 0x33506: 0x6d7aa220, 0x33507: 0x6d7aa420, + 0x33508: 0x6d7aa620, 0x33509: 0x6da2fc20, 0x3350a: 0x6d7aa820, 0x3350b: 0x6d7aaa20, + 0x3350c: 0x6d7aac20, 0x3350d: 0x6d7aae20, 0x3350e: 0x6d7ab020, 0x3350f: 0x6d7ab220, + 0x33510: 0x6d7ab420, 0x33511: 0x6d7ab620, 0x33512: 0x6d7ab820, 0x33513: 0x6d7aba20, + 0x33514: 0x6d7abc20, 0x33515: 0x6d7abe20, 0x33516: 0x6d7ac020, 0x33517: 0x6d7ac220, + 0x33518: 0x6d7ac420, 0x33519: 0x6d7ac620, 0x3351a: 0x6d7ac820, 0x3351b: 0x6d7aca20, + 0x3351c: 0x6da2fe20, 0x3351d: 0x6da30020, 0x3351e: 0x6da30220, 0x3351f: 0x6da30420, + 0x33520: 0x6da30620, 0x33521: 0x6da30820, 0x33522: 0x6da30a20, 0x33523: 0x6da30c20, + 0x33524: 0x6da30e20, 0x33525: 0x6da31020, 0x33526: 0x6da31220, 0x33527: 0x6da31420, + 0x33528: 0x6da31620, 0x33529: 0x6da31820, 0x3352a: 0x6da31a20, 0x3352b: 0x6da31c20, + 0x3352c: 0x6da31e20, 0x3352d: 0x6da32020, 0x3352e: 0x6da32220, 0x3352f: 0x6da32420, + 0x33530: 0x6da32620, 0x33531: 0x6da32820, 0x33532: 0x6da32a20, 0x33533: 0x6da32c20, + 0x33534: 0x6da32e20, 0x33535: 0x6da33020, 0x33536: 0x6da33220, 0x33537: 0x6da33420, + 0x33538: 0x6da33620, 0x33539: 0x6da33820, 0x3353a: 0x6da33a20, 0x3353b: 0x6da33c20, + 0x3353c: 0x6da33e20, 0x3353d: 0x6da34020, 0x3353e: 0x6da34220, 0x3353f: 0x6da34420, + // Block 0xcd5, offset 0x33540 + 0x33540: 0x6da34620, 0x33541: 0x6da34820, 0x33542: 0x6dc4dc20, 0x33543: 0x6dc4de20, + 0x33544: 0x6dc4e020, 0x33545: 0x6dc4e220, 0x33546: 0x6dc4e420, 0x33547: 0x6dc4e620, + 0x33548: 0x6dc4e820, 0x33549: 0x6dc4ea20, 0x3354a: 0x6dc4ec20, 0x3354b: 0x6dc4ee20, + 0x3354c: 0x6dc4f020, 0x3354d: 0x6dc4f220, 0x3354e: 0x6dc4f420, 0x3354f: 0x6dc4f620, + 0x33550: 0x6dc4f820, 0x33551: 0x6dc4fa20, 0x33552: 0x6dc4fc20, 0x33553: 0x6dc4fe20, + 0x33554: 0x6dc50020, 0x33555: 0x6dc50220, 0x33556: 0x6dc50420, 0x33557: 0x6dc45020, + 0x33558: 0x6de1de20, 0x33559: 0x6de1e020, 0x3355a: 0x6de1e220, 0x3355b: 0x6de1e420, + 0x3355c: 0x6de1e620, 0x3355d: 0x6de1e820, 0x3355e: 0x6de1ea20, 0x3355f: 0x6de1ec20, + 0x33560: 0x6dc50620, 0x33561: 0x6de1ee20, 0x33562: 0x6de1f020, 0x33563: 0x6de1f220, + 0x33564: 0x6de1f420, 0x33565: 0x6de1f620, 0x33566: 0x6de1f820, 0x33567: 0x6de1fa20, + 0x33568: 0x6de1fc20, 0x33569: 0x6de1fe20, 0x3356a: 0x6de20020, 0x3356b: 0x6de20220, + 0x3356c: 0x6de20420, 0x3356d: 0x6de20620, 0x3356e: 0x6df9be20, 0x3356f: 0x6df9c020, + 0x33570: 0x6df9c220, 0x33571: 0x6df9c420, 0x33572: 0x6df9c620, 0x33573: 0x6df9c820, + 0x33574: 0x6df9ca20, 0x33575: 0x6df9cc20, 0x33576: 0x6df9ce20, 0x33577: 0x6df9d020, + 0x33578: 0x6df9d220, 0x33579: 0x6df9d420, 0x3357a: 0x6df9d620, 0x3357b: 0x6da34a20, + 0x3357c: 0x6e0d7a20, 0x3357d: 0x6e0d7c20, 0x3357e: 0x6e0d7e20, 0x3357f: 0x6e0d8020, + // Block 0xcd6, offset 0x33580 + 0x33580: 0x6e0d8220, 0x33581: 0x6e0d8420, 0x33582: 0x6e0d8620, 0x33583: 0x6e0d8820, + 0x33584: 0x6e0d8a20, 0x33585: 0x6e0d8c20, 0x33586: 0x6e0d8e20, 0x33587: 0x6e1ce620, + 0x33588: 0x6e1ce820, 0x33589: 0x6e1cea20, 0x3358a: 0x6e1cec20, 0x3358b: 0x6e1cee20, + 0x3358c: 0x6e1cf020, 0x3358d: 0x6e1cf220, 0x3358e: 0x6e1cf420, 0x3358f: 0x6e1cf620, + 0x33590: 0x6e1cf820, 0x33591: 0x6e1cfa20, 0x33592: 0x6e28b820, 0x33593: 0x6e28ba20, + 0x33594: 0x6e31f620, 0x33595: 0x6e31f820, 0x33596: 0x6e31fa20, 0x33597: 0x6e31fc20, + 0x33598: 0x6e31fe20, 0x33599: 0x6e320020, 0x3359a: 0x6e320220, 0x3359b: 0x6e320420, + 0x3359c: 0x6e320620, 0x3359d: 0x6e387a20, 0x3359e: 0x6e387c20, 0x3359f: 0x6e387e20, + 0x335a0: 0x6e402420, 0x335a1: 0x6e402620, 0x335a2: 0x6e429220, 0x335a3: 0x6e402820, + 0x335a4: 0x6e402a20, 0x335a5: 0x6e462620, 0x335a6: 0x6c01c020, 0x335a7: 0x6c041a20, + 0x335a8: 0x6c01c220, 0x335a9: 0x6c109820, 0x335aa: 0x6c109a20, 0x335ab: 0x6c109c20, + 0x335ac: 0x6c109e20, 0x335ad: 0x6c10a020, 0x335ae: 0x6c1dd620, 0x335af: 0x6c1dd820, + 0x335b0: 0x6c1dda20, 0x335b1: 0x6c317a20, 0x335b2: 0x6c317c20, 0x335b3: 0x6c317e20, + 0x335b4: 0x6c318020, 0x335b5: 0x6c318220, 0x335b6: 0x6c318420, 0x335b7: 0x6c4bce20, + 0x335b8: 0x6c4bd020, 0x335b9: 0x6c4bd220, 0x335ba: 0x6c4bd420, 0x335bb: 0x6c4bd620, + 0x335bc: 0x6c6de420, 0x335bd: 0x6c6de620, 0x335be: 0x6c954e20, 0x335bf: 0x6c955020, + // Block 0xcd7, offset 0x335c0 + 0x335c0: 0x6c955220, 0x335c1: 0x6cc16c20, 0x335c2: 0x6d20ba20, 0x335c3: 0x6d4e4a20, + 0x335c4: 0x6d7ad420, 0x335c5: 0x6d7ad620, 0x335c6: 0x6d7ad820, 0x335c7: 0x6da35420, + 0x335c8: 0x6dc50820, 0x335c9: 0x6de20c20, 0x335ca: 0x6de20e20, 0x335cb: 0x6df9d820, + 0x335cc: 0x6e1cfe20, 0x335cd: 0x6e1d0020, 0x335ce: 0x6e320820, 0x335cf: 0x6e402c20, + 0x335d0: 0x6e442a20, 0x335d1: 0x6c041e20, 0x335d2: 0x6c042020, 0x335d3: 0x6c042220, + 0x335d4: 0x6c042420, 0x335d5: 0x6c042620, 0x335d6: 0x6c089820, 0x335d7: 0x6c089a20, + 0x335d8: 0x6c089c20, 0x335d9: 0x6c089e20, 0x335da: 0x6c10a620, 0x335db: 0x6c10a820, + 0x335dc: 0x6c1de020, 0x335dd: 0x6c1de220, 0x335de: 0x6c1de420, 0x335df: 0x6c318620, + 0x335e0: 0x6c4bde20, 0x335e1: 0x6c6dee20, 0x335e2: 0x6c6df020, 0x335e3: 0x6c955420, + 0x335e4: 0x6cc17220, 0x335e5: 0x6cc17420, 0x335e6: 0x6cf11220, 0x335e7: 0x6cf11420, + 0x335e8: 0x6d4e4e20, 0x335e9: 0x6d4e5020, 0x335ea: 0x6d4e5220, 0x335eb: 0x6d4e5420, + 0x335ec: 0x6d7ada20, 0x335ed: 0x6da35620, 0x335ee: 0x6dc50a20, 0x335ef: 0x6de21020, + 0x335f0: 0x6e0d9220, 0x335f1: 0x6e0d9420, 0x335f2: 0x6e0d9620, 0x335f3: 0x6c042a20, + 0x335f4: 0x6c08a220, 0x335f5: 0x6c08a420, 0x335f6: 0x6c10ac20, 0x335f7: 0x6c318c20, + 0x335f8: 0x6c318e20, 0x335f9: 0x6c4bea20, 0x335fa: 0x6c4bec20, 0x335fb: 0x6c4bee20, + 0x335fc: 0x6c6df420, 0x335fd: 0x6c6df620, 0x335fe: 0x6c6df820, 0x335ff: 0x6c6dfa20, + // Block 0xcd8, offset 0x33600 + 0x33600: 0x6c955a20, 0x33601: 0x6c955c20, 0x33602: 0x6c955e20, 0x33603: 0x6c956020, + 0x33604: 0x6c956220, 0x33605: 0x6cc17a20, 0x33606: 0x6cc17c20, 0x33607: 0x6cc17e20, + 0x33608: 0x6cc18020, 0x33609: 0x6cc18220, 0x3360a: 0x6cf11820, 0x3360b: 0x6d4e5620, + 0x3360c: 0x6d4e5820, 0x3360d: 0x6d7ae020, 0x3360e: 0x6da35a20, 0x3360f: 0x6d7ae220, + 0x33610: 0x6dc50e20, 0x33611: 0x6df9da20, 0x33612: 0x6c08b220, 0x33613: 0x6c08b420, + 0x33614: 0x6c08b620, 0x33615: 0x6c10ba20, 0x33616: 0x6c10bc20, 0x33617: 0x6c10be20, + 0x33618: 0x6c10c020, 0x33619: 0x6c10c220, 0x3361a: 0x6c10c420, 0x3361b: 0x6c10c620, + 0x3361c: 0x6c10c820, 0x3361d: 0x6c10ca20, 0x3361e: 0x6c10cc20, 0x3361f: 0x6c10ce20, + 0x33620: 0x6c10d020, 0x33621: 0x6c10d220, 0x33622: 0x6c10d420, 0x33623: 0x6c10d620, + 0x33624: 0x6c10d820, 0x33625: 0x6c1e0620, 0x33626: 0x6c1e0820, 0x33627: 0x6c1e0a20, + 0x33628: 0x6c1e0c20, 0x33629: 0x6c1e0e20, 0x3362a: 0x6c1e1020, 0x3362b: 0x6c1e1220, + 0x3362c: 0x6c1e1420, 0x3362d: 0x6c1e1620, 0x3362e: 0x6c1e1820, 0x3362f: 0x6c1e1a20, + 0x33630: 0x6c1e1c20, 0x33631: 0x6c1e1e20, 0x33632: 0x6c1e2020, 0x33633: 0x6c1e2220, + 0x33634: 0x6c1e2420, 0x33635: 0x6c1e2620, 0x33636: 0x6c1e2820, 0x33637: 0x6c1e2a20, + 0x33638: 0x6c1e2c20, 0x33639: 0x6c1e2e20, 0x3363a: 0x6c1e3020, 0x3363b: 0x6c31b220, + 0x3363c: 0x6c31b420, 0x3363d: 0x6c31b620, 0x3363e: 0x6c31b820, 0x3363f: 0x6c31ba20, + // Block 0xcd9, offset 0x33640 + 0x33640: 0x6c31bc20, 0x33641: 0x6c31be20, 0x33642: 0x6c31c020, 0x33643: 0x6c31c220, + 0x33644: 0x6c31c420, 0x33645: 0x6c31c620, 0x33646: 0x6c31c820, 0x33647: 0x6c31ca20, + 0x33648: 0x6c31cc20, 0x33649: 0x6c31ce20, 0x3364a: 0x6c31d020, 0x3364b: 0x6c31d220, + 0x3364c: 0x6c31d420, 0x3364d: 0x6c31d620, 0x3364e: 0x6c31d820, 0x3364f: 0x6c31da20, + 0x33650: 0x6c4c1220, 0x33651: 0x6c4c1420, 0x33652: 0x6c4c1620, 0x33653: 0x6c4c1820, + 0x33654: 0x6c4c1a20, 0x33655: 0x6c4c1c20, 0x33656: 0x6c4c1e20, 0x33657: 0x6c4c2020, + 0x33658: 0x6c4c2220, 0x33659: 0x6c4c2420, 0x3365a: 0x6c4c2620, 0x3365b: 0x6c4c2820, + 0x3365c: 0x6c4c2a20, 0x3365d: 0x6c4c2c20, 0x3365e: 0x6c4c2e20, 0x3365f: 0x6c4c3020, + 0x33660: 0x6c4c3220, 0x33661: 0x6c4c3420, 0x33662: 0x6c4c3620, 0x33663: 0x6c4c3820, + 0x33664: 0x6c4c3a20, 0x33665: 0x6c4c3c20, 0x33666: 0x6c4c3e20, 0x33667: 0x6c4c4020, + 0x33668: 0x6c4c4220, 0x33669: 0x6c4c4420, 0x3366a: 0x6c4c4620, 0x3366b: 0x6c4c4820, + 0x3366c: 0x6c4c4a20, 0x3366d: 0x6c4c4c20, 0x3366e: 0x6c4c4e20, 0x3366f: 0x6c4c5020, + 0x33670: 0x6c4c5220, 0x33671: 0x6c6e1420, 0x33672: 0x6c6e1620, 0x33673: 0x6c6e1820, + 0x33674: 0x6c6e1a20, 0x33675: 0x6c6e1c20, 0x33676: 0x6c6e1e20, 0x33677: 0x6c6e2020, + 0x33678: 0x6c6e2220, 0x33679: 0x6c6e2420, 0x3367a: 0x6c6e2620, 0x3367b: 0x6c6e2820, + 0x3367c: 0x6c6e2a20, 0x3367d: 0x6c6e2c20, 0x3367e: 0x6c6e2e20, 0x3367f: 0x6c6e3020, + // Block 0xcda, offset 0x33680 + 0x33680: 0x6c6e3220, 0x33681: 0x6c6e3420, 0x33682: 0x6c6e3620, 0x33683: 0x6c6e3820, + 0x33684: 0x6c6e3a20, 0x33685: 0x6c6e3c20, 0x33686: 0x6c6e3e20, 0x33687: 0x6c6e4020, + 0x33688: 0x6c6e4220, 0x33689: 0x6c6e4420, 0x3368a: 0x6c6e4620, 0x3368b: 0x6c6e4820, + 0x3368c: 0x6c6e4a20, 0x3368d: 0x6c958620, 0x3368e: 0x6c958820, 0x3368f: 0x6c958a20, + 0x33690: 0x6c958c20, 0x33691: 0x6c958e20, 0x33692: 0x6c959020, 0x33693: 0x6c959220, + 0x33694: 0x6c959420, 0x33695: 0x6c959620, 0x33696: 0x6c959820, 0x33697: 0x6c959a20, + 0x33698: 0x6c959c20, 0x33699: 0x6c959e20, 0x3369a: 0x6c95a020, 0x3369b: 0x6c95a220, + 0x3369c: 0x6c95a420, 0x3369d: 0x6c95a620, 0x3369e: 0x6c95a820, 0x3369f: 0x6c95aa20, + 0x336a0: 0x6c95ac20, 0x336a1: 0x6c95ae20, 0x336a2: 0x6c95b020, 0x336a3: 0x6c95b220, + 0x336a4: 0x6c95b420, 0x336a5: 0x6c95b620, 0x336a6: 0x6c95b820, 0x336a7: 0x6c95ba20, + 0x336a8: 0x6c95bc20, 0x336a9: 0x6c95be20, 0x336aa: 0x6c95c020, 0x336ab: 0x6cc1ae20, + 0x336ac: 0x6cc1b020, 0x336ad: 0x6cc1b220, 0x336ae: 0x6cc1b420, 0x336af: 0x6cc1b620, + 0x336b0: 0x6cc1b820, 0x336b1: 0x6cc1ba20, 0x336b2: 0x6cc1bc20, 0x336b3: 0x6cc1be20, + 0x336b4: 0x6cc1c020, 0x336b5: 0x6cc1c220, 0x336b6: 0x6cc1c420, 0x336b7: 0x6cc1c620, + 0x336b8: 0x6cc1c820, 0x336b9: 0x6cc1ca20, 0x336ba: 0x6cc1cc20, 0x336bb: 0x6cc1ce20, + 0x336bc: 0x6cc1d020, 0x336bd: 0x6cc1d220, 0x336be: 0x6cc1d420, 0x336bf: 0x6cc1d620, + // Block 0xcdb, offset 0x336c0 + 0x336c0: 0x6cc1d820, 0x336c1: 0x6cc1da20, 0x336c2: 0x6cc1dc20, 0x336c3: 0x6cc1de20, + 0x336c4: 0x6cc1e020, 0x336c5: 0x6cc1e220, 0x336c6: 0x6cc1e420, 0x336c7: 0x6cc1e620, + 0x336c8: 0x6cc1e820, 0x336c9: 0x6cc1ea20, 0x336ca: 0x6cf13020, 0x336cb: 0x6cf13220, + 0x336cc: 0x6cf13420, 0x336cd: 0x6cf13620, 0x336ce: 0x6cf13820, 0x336cf: 0x6cf13a20, + 0x336d0: 0x6cf13c20, 0x336d1: 0x6cf13e20, 0x336d2: 0x6cf14020, 0x336d3: 0x6cf14220, + 0x336d4: 0x6cf14420, 0x336d5: 0x6cf14620, 0x336d6: 0x6cf14820, 0x336d7: 0x6cf14a20, + 0x336d8: 0x6cf14c20, 0x336d9: 0x6cf14e20, 0x336da: 0x6cf15020, 0x336db: 0x6cf15220, + 0x336dc: 0x6cf15420, 0x336dd: 0x6cf15620, 0x336de: 0x6cf15820, 0x336df: 0x6d20dc20, + 0x336e0: 0x6d20de20, 0x336e1: 0x6d20e020, 0x336e2: 0x6d20e220, 0x336e3: 0x6d20e420, + 0x336e4: 0x6d20e620, 0x336e5: 0x6d20e820, 0x336e6: 0x6d20ea20, 0x336e7: 0x6d20ec20, + 0x336e8: 0x6d20ee20, 0x336e9: 0x6d20f020, 0x336ea: 0x6d20f220, 0x336eb: 0x6d20f420, + 0x336ec: 0x6d20f620, 0x336ed: 0x6d20f820, 0x336ee: 0x6d20fa20, 0x336ef: 0x6d20fc20, + 0x336f0: 0x6d20fe20, 0x336f1: 0x6d210020, 0x336f2: 0x6d210220, 0x336f3: 0x6d4e7220, + 0x336f4: 0x6d4e7420, 0x336f5: 0x6d4e7620, 0x336f6: 0x6d4e7820, 0x336f7: 0x6d4e7a20, + 0x336f8: 0x6d4e7c20, 0x336f9: 0x6d4e7e20, 0x336fa: 0x6d4e8020, 0x336fb: 0x6d4e8220, + 0x336fc: 0x6d4e8420, 0x336fd: 0x6d4e8620, 0x336fe: 0x6d4e8820, 0x336ff: 0x6d4e8a20, + // Block 0xcdc, offset 0x33700 + 0x33700: 0x6d4e8c20, 0x33701: 0x6d4e8e20, 0x33702: 0x6d4e9020, 0x33703: 0x6d4e9220, + 0x33704: 0x6d4e9420, 0x33705: 0x6d4e9620, 0x33706: 0x6d4e9820, 0x33707: 0x6d4e9a20, + 0x33708: 0x6d4e9c20, 0x33709: 0x6d4e9e20, 0x3370a: 0x6d4ea020, 0x3370b: 0x6d4ea220, + 0x3370c: 0x6d4ea420, 0x3370d: 0x6d7af420, 0x3370e: 0x6d7af620, 0x3370f: 0x6d7af820, + 0x33710: 0x6d7afa20, 0x33711: 0x6d7afc20, 0x33712: 0x6d7afe20, 0x33713: 0x6d7b0020, + 0x33714: 0x6d7b0220, 0x33715: 0x6d7b0420, 0x33716: 0x6d7b0620, 0x33717: 0x6d7b0820, + 0x33718: 0x6d7b0a20, 0x33719: 0x6d7b0c20, 0x3371a: 0x6d7b0e20, 0x3371b: 0x6d7b1020, + 0x3371c: 0x6d7b1220, 0x3371d: 0x6d7b1420, 0x3371e: 0x6d7b1620, 0x3371f: 0x6da36620, + 0x33720: 0x6da36820, 0x33721: 0x6da36a20, 0x33722: 0x6da36c20, 0x33723: 0x6da36e20, + 0x33724: 0x6da37020, 0x33725: 0x6da37220, 0x33726: 0x6da37420, 0x33727: 0x6da37620, + 0x33728: 0x6da37820, 0x33729: 0x6dc51420, 0x3372a: 0x6dc51620, 0x3372b: 0x6dc51820, + 0x3372c: 0x6dc51a20, 0x3372d: 0x6de21420, 0x3372e: 0x6de21620, 0x3372f: 0x6de21820, + 0x33730: 0x6de21a20, 0x33731: 0x6de21c20, 0x33732: 0x6de21e20, 0x33733: 0x6de22020, + 0x33734: 0x6de22220, 0x33735: 0x6de22420, 0x33736: 0x6de22620, 0x33737: 0x6de22820, + 0x33738: 0x6df9e220, 0x33739: 0x6df9e420, 0x3373a: 0x6df9e620, 0x3373b: 0x6e0d9820, + 0x3373c: 0x6e0d9a20, 0x3373d: 0x6e0d9c20, 0x3373e: 0x6e1d0820, 0x3373f: 0x6e1d0a20, + // Block 0xcdd, offset 0x33740 + 0x33740: 0x6e1d0c20, 0x33741: 0x6e1d0e20, 0x33742: 0x6e28bc20, 0x33743: 0x6e320a20, + 0x33744: 0x6e320c20, 0x33745: 0x6e320e20, 0x33746: 0x6e321020, 0x33747: 0x6e402e20, + 0x33748: 0x6e403020, 0x33749: 0x6c08bc20, 0x3374a: 0x6c1e3220, 0x3374b: 0x6c1e3420, + 0x3374c: 0x6c1e3620, 0x3374d: 0x6c31e020, 0x3374e: 0x6c31e220, 0x3374f: 0x6c31e420, + 0x33750: 0x6c31e620, 0x33751: 0x6c4c5420, 0x33752: 0x6c4c5620, 0x33753: 0x6c4c5820, + 0x33754: 0x6c4c5a20, 0x33755: 0x6c4c5c20, 0x33756: 0x6c6e4e20, 0x33757: 0x6c6e5020, + 0x33758: 0x6c6e5220, 0x33759: 0x6c6e5420, 0x3375a: 0x6c95cc20, 0x3375b: 0x6cc1f420, + 0x3375c: 0x6cc1f620, 0x3375d: 0x6cc1f820, 0x3375e: 0x6cf15c20, 0x3375f: 0x6cf15e20, + 0x33760: 0x6cf16020, 0x33761: 0x6d18a420, 0x33762: 0x6d210820, 0x33763: 0x6d1e2a20, + 0x33764: 0x6d210a20, 0x33765: 0x6d4eaa20, 0x33766: 0x6d7b1c20, 0x33767: 0x6d7b1e20, + 0x33768: 0x6d7b2020, 0x33769: 0x6d7b2220, 0x3376a: 0x6dc51c20, 0x3376b: 0x6de22c20, + 0x3376c: 0x6df9ea20, 0x3376d: 0x6e0d9e20, 0x3376e: 0x6e28be20, 0x3376f: 0x6c043420, + 0x33770: 0x6c043620, 0x33771: 0x6c043820, 0x33772: 0x6c08c020, 0x33773: 0x6c08c220, + 0x33774: 0x6c08c420, 0x33775: 0x6c08c620, 0x33776: 0x6c10e020, 0x33777: 0x6c1e3a20, + 0x33778: 0x6c1e3c20, 0x33779: 0x6c1e3e20, 0x3377a: 0x6c1e4020, 0x3377b: 0x6c31e820, + 0x3377c: 0x6c31ea20, 0x3377d: 0x6c31ec20, 0x3377e: 0x6c31ee20, 0x3377f: 0x6c4c6020, + // Block 0xcde, offset 0x33780 + 0x33780: 0x6c4b0c20, 0x33781: 0x6c6e5620, 0x33782: 0x6c4c6220, 0x33783: 0x6c6e5820, + 0x33784: 0x6c6e5a20, 0x33785: 0x6c6e5c20, 0x33786: 0x6c6e5e20, 0x33787: 0x6c95d220, + 0x33788: 0x6c95d420, 0x33789: 0x6c95d620, 0x3378a: 0x6cc20220, 0x3378b: 0x6cf16820, + 0x3378c: 0x6d210e20, 0x3378d: 0x6d211020, 0x3378e: 0x6d211220, 0x3378f: 0x6d211420, + 0x33790: 0x6d4eae20, 0x33791: 0x6d4eb020, 0x33792: 0x6d4eb220, 0x33793: 0x6d4eb420, + 0x33794: 0x6da2ce20, 0x33795: 0x6dc2b220, 0x33796: 0x6e1d1020, 0x33797: 0x6c10f020, + 0x33798: 0x6c10f220, 0x33799: 0x6c10f420, 0x3379a: 0x6c10f620, 0x3379b: 0x6c10f820, + 0x3379c: 0x6c10fa20, 0x3379d: 0x6c10fc20, 0x3379e: 0x6c10fe20, 0x3379f: 0x6c110020, + 0x337a0: 0x6c110220, 0x337a1: 0x6c110420, 0x337a2: 0x6c110620, 0x337a3: 0x6c1e6220, + 0x337a4: 0x6c1e6420, 0x337a5: 0x6c1e6620, 0x337a6: 0x6c1e6820, 0x337a7: 0x6c1e6a20, + 0x337a8: 0x6c1e6c20, 0x337a9: 0x6c1e6e20, 0x337aa: 0x6c1e7020, 0x337ab: 0x6c1e7220, + 0x337ac: 0x6c1e7420, 0x337ad: 0x6c1e7620, 0x337ae: 0x6c1e7820, 0x337af: 0x6c1e7a20, + 0x337b0: 0x6c1e7c20, 0x337b1: 0x6c1e7e20, 0x337b2: 0x6c321420, 0x337b3: 0x6c321620, + 0x337b4: 0x6c321820, 0x337b5: 0x6c321a20, 0x337b6: 0x6c321c20, 0x337b7: 0x6c321e20, + 0x337b8: 0x6c322020, 0x337b9: 0x6c322220, 0x337ba: 0x6c322420, 0x337bb: 0x6c322620, + 0x337bc: 0x6c322820, 0x337bd: 0x6c322a20, 0x337be: 0x6c322c20, 0x337bf: 0x6c322e20, + // Block 0xcdf, offset 0x337c0 + 0x337c0: 0x6c323020, 0x337c1: 0x6c323220, 0x337c2: 0x6c323420, 0x337c3: 0x6c323620, + 0x337c4: 0x6c323820, 0x337c5: 0x6c323a20, 0x337c6: 0x6c323c20, 0x337c7: 0x6c4c8420, + 0x337c8: 0x6c4c8620, 0x337c9: 0x6c4c8820, 0x337ca: 0x6c4c8a20, 0x337cb: 0x6c4c8c20, + 0x337cc: 0x6c4c8e20, 0x337cd: 0x6c4c9020, 0x337ce: 0x6c4c9220, 0x337cf: 0x6c4c9420, + 0x337d0: 0x6c4c9620, 0x337d1: 0x6c4c9820, 0x337d2: 0x6c4c9a20, 0x337d3: 0x6c4c9c20, + 0x337d4: 0x6c4c9e20, 0x337d5: 0x6c4ca020, 0x337d6: 0x6c4ca220, 0x337d7: 0x6c4ca420, + 0x337d8: 0x6c4ca620, 0x337d9: 0x6c6e7c20, 0x337da: 0x6c6e7e20, 0x337db: 0x6c6e8020, + 0x337dc: 0x6c6e8220, 0x337dd: 0x6c6e8420, 0x337de: 0x6c6e8620, 0x337df: 0x6c6e8820, + 0x337e0: 0x6c6e8a20, 0x337e1: 0x6c6e8c20, 0x337e2: 0x6c6e8e20, 0x337e3: 0x6c6e9020, + 0x337e4: 0x6c6e9220, 0x337e5: 0x6c6e9420, 0x337e6: 0x6c6e9620, 0x337e7: 0x6c6e9820, + 0x337e8: 0x6c6e9a20, 0x337e9: 0x6c6e9c20, 0x337ea: 0x6c6e9e20, 0x337eb: 0x6c6ea020, + 0x337ec: 0x6c6ea220, 0x337ed: 0x6c6ea420, 0x337ee: 0x6c6ea620, 0x337ef: 0x6c6ea820, + 0x337f0: 0x6c6eaa20, 0x337f1: 0x6c6eac20, 0x337f2: 0x6c6bf220, 0x337f3: 0x6c95fa20, + 0x337f4: 0x6c95fc20, 0x337f5: 0x6c95fe20, 0x337f6: 0x6c960020, 0x337f7: 0x6c960220, + 0x337f8: 0x6c960420, 0x337f9: 0x6c960620, 0x337fa: 0x6c960820, 0x337fb: 0x6c960a20, + 0x337fc: 0x6c960c20, 0x337fd: 0x6c960e20, 0x337fe: 0x6c961020, 0x337ff: 0x6c961220, + // Block 0xce0, offset 0x33800 + 0x33800: 0x6c961420, 0x33801: 0x6c961620, 0x33802: 0x6c961820, 0x33803: 0x6c961a20, + 0x33804: 0x6c961c20, 0x33805: 0x6c961e20, 0x33806: 0x6c962020, 0x33807: 0x6c962220, + 0x33808: 0x6c962420, 0x33809: 0x6c962620, 0x3380a: 0x6c962820, 0x3380b: 0x6c962a20, + 0x3380c: 0x6c962c20, 0x3380d: 0x6c962e20, 0x3380e: 0x6c963020, 0x3380f: 0x6c963220, + 0x33810: 0x6c963420, 0x33811: 0x6c963620, 0x33812: 0x6c963820, 0x33813: 0x6c963a20, + 0x33814: 0x6c963c20, 0x33815: 0x6c963e20, 0x33816: 0x6cb78820, 0x33817: 0x6c964020, + 0x33818: 0x6c964220, 0x33819: 0x6c964420, 0x3381a: 0x6c964620, 0x3381b: 0x6cc21a20, + 0x3381c: 0x6cc21c20, 0x3381d: 0x6cc21e20, 0x3381e: 0x6cc22020, 0x3381f: 0x6cc22220, + 0x33820: 0x6cc22420, 0x33821: 0x6cc22620, 0x33822: 0x6cc22820, 0x33823: 0x6cc22a20, + 0x33824: 0x6cc22c20, 0x33825: 0x6cc22e20, 0x33826: 0x6cc23020, 0x33827: 0x6cc23220, + 0x33828: 0x6cc23420, 0x33829: 0x6cc23620, 0x3382a: 0x6cc23820, 0x3382b: 0x6cc23a20, + 0x3382c: 0x6cc23c20, 0x3382d: 0x6cc23e20, 0x3382e: 0x6cc24020, 0x3382f: 0x6cc24220, + 0x33830: 0x6cc24420, 0x33831: 0x6cc24620, 0x33832: 0x6cc24820, 0x33833: 0x6cc24a20, + 0x33834: 0x6cc24c20, 0x33835: 0x6cc24e20, 0x33836: 0x6cc25020, 0x33837: 0x6cc25220, + 0x33838: 0x6cc25420, 0x33839: 0x6cc25620, 0x3383a: 0x6cc25820, 0x3383b: 0x6cc25a20, + 0x3383c: 0x6cf17a20, 0x3383d: 0x6cc25c20, 0x3383e: 0x6cc25e20, 0x3383f: 0x6cf17c20, + // Block 0xce1, offset 0x33840 + 0x33840: 0x6cf17e20, 0x33841: 0x6cf18020, 0x33842: 0x6cf18220, 0x33843: 0x6cf18420, + 0x33844: 0x6cf18620, 0x33845: 0x6cf18820, 0x33846: 0x6cf18a20, 0x33847: 0x6cf18c20, + 0x33848: 0x6cf18e20, 0x33849: 0x6cf19020, 0x3384a: 0x6cf19220, 0x3384b: 0x6cf19420, + 0x3384c: 0x6cf19620, 0x3384d: 0x6cf19820, 0x3384e: 0x6cf19a20, 0x3384f: 0x6cf19c20, + 0x33850: 0x6cf19e20, 0x33851: 0x6cf1a020, 0x33852: 0x6cf1a220, 0x33853: 0x6cf1a420, + 0x33854: 0x6cf1a620, 0x33855: 0x6d213620, 0x33856: 0x6d213820, 0x33857: 0x6d213a20, + 0x33858: 0x6d213c20, 0x33859: 0x6d213e20, 0x3385a: 0x6d214020, 0x3385b: 0x6d214220, + 0x3385c: 0x6d214420, 0x3385d: 0x6d214620, 0x3385e: 0x6d214820, 0x3385f: 0x6d214a20, + 0x33860: 0x6d214c20, 0x33861: 0x6d214e20, 0x33862: 0x6d215020, 0x33863: 0x6d215220, + 0x33864: 0x6d215420, 0x33865: 0x6d215620, 0x33866: 0x6d215820, 0x33867: 0x6d215a20, + 0x33868: 0x6d215c20, 0x33869: 0x6d215e20, 0x3386a: 0x6d216020, 0x3386b: 0x6d216220, + 0x3386c: 0x6d216420, 0x3386d: 0x6d4ed020, 0x3386e: 0x6d4ed220, 0x3386f: 0x6d4ed420, + 0x33870: 0x6d4ed620, 0x33871: 0x6d4ed820, 0x33872: 0x6d4eda20, 0x33873: 0x6d4edc20, + 0x33874: 0x6d4ede20, 0x33875: 0x6d4ee020, 0x33876: 0x6d4ee220, 0x33877: 0x6d4ee420, + 0x33878: 0x6d4ee620, 0x33879: 0x6d4ee820, 0x3387a: 0x6d4eea20, 0x3387b: 0x6d4eec20, + 0x3387c: 0x6d4eee20, 0x3387d: 0x6d4ef020, 0x3387e: 0x6d4ef220, 0x3387f: 0x6d4ef420, + // Block 0xce2, offset 0x33880 + 0x33880: 0x6d4ef620, 0x33881: 0x6d4ef820, 0x33882: 0x6d7b3a20, 0x33883: 0x6d7b3c20, + 0x33884: 0x6d7b3e20, 0x33885: 0x6d7b4020, 0x33886: 0x6d7b4220, 0x33887: 0x6d7b4420, + 0x33888: 0x6d7b4620, 0x33889: 0x6d7b4820, 0x3388a: 0x6d7b4a20, 0x3388b: 0x6d7b4c20, + 0x3388c: 0x6d7b4e20, 0x3388d: 0x6d7b5020, 0x3388e: 0x6d7b5220, 0x3388f: 0x6d7b5420, + 0x33890: 0x6d7b5620, 0x33891: 0x6da37c20, 0x33892: 0x6da37e20, 0x33893: 0x6da38020, + 0x33894: 0x6da38220, 0x33895: 0x6da38420, 0x33896: 0x6da38620, 0x33897: 0x6da38820, + 0x33898: 0x6da38a20, 0x33899: 0x6da38c20, 0x3389a: 0x6da38e20, 0x3389b: 0x6da39020, + 0x3389c: 0x6db42620, 0x3389d: 0x6da39220, 0x3389e: 0x6da39420, 0x3389f: 0x6da39620, + 0x338a0: 0x6da39820, 0x338a1: 0x6dc52220, 0x338a2: 0x6dc52420, 0x338a3: 0x6dc52620, + 0x338a4: 0x6dc52820, 0x338a5: 0x6dc52a20, 0x338a6: 0x6dc52c20, 0x338a7: 0x6dc52e20, + 0x338a8: 0x6dc53020, 0x338a9: 0x6dc53220, 0x338aa: 0x6dc53420, 0x338ab: 0x6dc53620, + 0x338ac: 0x6dc53820, 0x338ad: 0x6dc53a20, 0x338ae: 0x6de23a20, 0x338af: 0x6de23c20, + 0x338b0: 0x6de23e20, 0x338b1: 0x6de24020, 0x338b2: 0x6de24220, 0x338b3: 0x6de24420, + 0x338b4: 0x6de24620, 0x338b5: 0x6de24820, 0x338b6: 0x6de24a20, 0x338b7: 0x6de24c20, + 0x338b8: 0x6de24e20, 0x338b9: 0x6de25020, 0x338ba: 0x6de25220, 0x338bb: 0x6df9f420, + 0x338bc: 0x6df9f620, 0x338bd: 0x6df9f820, 0x338be: 0x6df9fa20, 0x338bf: 0x6df9fc20, + // Block 0xce3, offset 0x338c0 + 0x338c0: 0x6df9fe20, 0x338c1: 0x6dfa0020, 0x338c2: 0x6dfa0220, 0x338c3: 0x6dfa0420, + 0x338c4: 0x6e0da220, 0x338c5: 0x6e0da420, 0x338c6: 0x6e0da620, 0x338c7: 0x6e0f2020, + 0x338c8: 0x6e1d1420, 0x338c9: 0x6e1d1620, 0x338ca: 0x6e1d1820, 0x338cb: 0x6e1d1a20, + 0x338cc: 0x6e1d1c20, 0x338cd: 0x6e28c020, 0x338ce: 0x6e28c220, 0x338cf: 0x6e28c420, + 0x338d0: 0x6e28c620, 0x338d1: 0x6e28c820, 0x338d2: 0x6e321220, 0x338d3: 0x6e3d2220, + 0x338d4: 0x6e403220, 0x338d5: 0x6e403420, 0x338d6: 0x6e429420, 0x338d7: 0x6c043a20, + 0x338d8: 0x6c08d220, 0x338d9: 0x6c08d420, 0x338da: 0x6c08d620, 0x338db: 0x6c1e8620, + 0x338dc: 0x6c110c20, 0x338dd: 0x6c1e8820, 0x338de: 0x6c1e8a20, 0x338df: 0x6c324a20, + 0x338e0: 0x6c4cb420, 0x338e1: 0x6c4cb620, 0x338e2: 0x6c4cb820, 0x338e3: 0x6c4cba20, + 0x338e4: 0x6c4cbc20, 0x338e5: 0x6c4cbe20, 0x338e6: 0x6c6ebc20, 0x338e7: 0x6c6ebe20, + 0x338e8: 0x6c965220, 0x338e9: 0x6c965420, 0x338ea: 0x6c965620, 0x338eb: 0x6cc26620, + 0x338ec: 0x6c01da20, 0x338ed: 0x6c044020, 0x338ee: 0x6c08dc20, 0x338ef: 0x6c08de20, + 0x338f0: 0x6c111020, 0x338f1: 0x6c111220, 0x338f2: 0x6c111420, 0x338f3: 0x6c1e9620, + 0x338f4: 0x6c4cc620, 0x338f5: 0x6c1e9820, 0x338f6: 0x6c1e9a20, 0x338f7: 0x6c1e9c20, + 0x338f8: 0x6c1e9e20, 0x338f9: 0x6c1ea020, 0x338fa: 0x6c1ea220, 0x338fb: 0x6c324e20, + 0x338fc: 0x6c4cc820, 0x338fd: 0x6c325020, 0x338fe: 0x6c325220, 0x338ff: 0x6c325420, + // Block 0xce4, offset 0x33900 + 0x33900: 0x6c325620, 0x33901: 0x6c325820, 0x33902: 0x6c4cca20, 0x33903: 0x6c4ccc20, + 0x33904: 0x6c4cce20, 0x33905: 0x6c4cd020, 0x33906: 0x6c4cd220, 0x33907: 0x6c4cd420, + 0x33908: 0x6c4cd620, 0x33909: 0x6c4cd820, 0x3390a: 0x6c4cda20, 0x3390b: 0x6c4cdc20, + 0x3390c: 0x6c4cde20, 0x3390d: 0x6c6ec420, 0x3390e: 0x6c6ec620, 0x3390f: 0x6c6ec820, + 0x33910: 0x6c6eca20, 0x33911: 0x6c6ecc20, 0x33912: 0x6c6ece20, 0x33913: 0x6c6ed020, + 0x33914: 0x6c965a20, 0x33915: 0x6c965c20, 0x33916: 0x6c965e20, 0x33917: 0x6c966020, + 0x33918: 0x6c966220, 0x33919: 0x6c966420, 0x3391a: 0x6cc26820, 0x3391b: 0x6cc26a20, + 0x3391c: 0x6cc26c20, 0x3391d: 0x6cc26e20, 0x3391e: 0x6cc27020, 0x3391f: 0x6cc27220, + 0x33920: 0x6cc27420, 0x33921: 0x6cc27620, 0x33922: 0x6cf1ae20, 0x33923: 0x6cf1b020, + 0x33924: 0x6cf1b220, 0x33925: 0x6cf1b420, 0x33926: 0x6d217620, 0x33927: 0x6d217820, + 0x33928: 0x6d217a20, 0x33929: 0x6d217c20, 0x3392a: 0x6d217e20, 0x3392b: 0x6d218020, + 0x3392c: 0x6d4f0220, 0x3392d: 0x6d1a0c20, 0x3392e: 0x6d7b5e20, 0x3392f: 0x6d7b6020, + 0x33930: 0x6d7b6220, 0x33931: 0x6d7b6420, 0x33932: 0x6da3a020, 0x33933: 0x6da3a220, + 0x33934: 0x6da3a420, 0x33935: 0x6de25620, 0x33936: 0x6e1d1e20, 0x33937: 0x6e403620, + 0x33938: 0x6e403820, 0x33939: 0x6e442c20, 0x3393a: 0x6c01de20, 0x3393b: 0x6c044420, + 0x3393c: 0x6c044620, 0x3393d: 0x6c111c20, 0x3393e: 0x6c111e20, 0x3393f: 0x6c1ea820, + // Block 0xce5, offset 0x33940 + 0x33940: 0x6c1eaa20, 0x33941: 0x6c1eac20, 0x33942: 0x6c1eae20, 0x33943: 0x6c1eb020, + 0x33944: 0x6c325c20, 0x33945: 0x6c325e20, 0x33946: 0x6c4ce220, 0x33947: 0x6c4ce420, + 0x33948: 0x6c4ce620, 0x33949: 0x6c4ce820, 0x3394a: 0x6c4cea20, 0x3394b: 0x6c6ed420, + 0x3394c: 0x6c6ed620, 0x3394d: 0x6c966620, 0x3394e: 0x6cc27c20, 0x3394f: 0x6cf1bc20, + 0x33950: 0x6cf1be20, 0x33951: 0x6d4f0420, 0x33952: 0x6d4f0620, 0x33953: 0x6d7b6620, + 0x33954: 0x6da3a820, 0x33955: 0x6dc53e20, 0x33956: 0x6e0daa20, 0x33957: 0x6c01e220, + 0x33958: 0x6c01e420, 0x33959: 0x6c045020, 0x3395a: 0x6c045220, 0x3395b: 0x6c045420, + 0x3395c: 0x6c045620, 0x3395d: 0x6c045820, 0x3395e: 0x6c045a20, 0x3395f: 0x6c045c20, + 0x33960: 0x6c045e20, 0x33961: 0x6c046020, 0x33962: 0x6c08e620, 0x33963: 0x6c08e820, + 0x33964: 0x6c08ea20, 0x33965: 0x6c08ec20, 0x33966: 0x6c08ee20, 0x33967: 0x6c08f020, + 0x33968: 0x6c08f220, 0x33969: 0x6c08f420, 0x3396a: 0x6c08f620, 0x3396b: 0x6c113020, + 0x3396c: 0x6c113220, 0x3396d: 0x6c113420, 0x3396e: 0x6c113620, 0x3396f: 0x6c113820, + 0x33970: 0x6c113a20, 0x33971: 0x6c113c20, 0x33972: 0x6c113e20, 0x33973: 0x6c114020, + 0x33974: 0x6c114220, 0x33975: 0x6c114420, 0x33976: 0x6c114620, 0x33977: 0x6c1ebe20, + 0x33978: 0x6c1ec020, 0x33979: 0x6c1ec220, 0x3397a: 0x6c1ec420, 0x3397b: 0x6c1ec620, + 0x3397c: 0x6c1ec820, 0x3397d: 0x6c1eca20, 0x3397e: 0x6c1ecc20, 0x3397f: 0x6c1ece20, + // Block 0xce6, offset 0x33980 + 0x33980: 0x6c1ed020, 0x33981: 0x6c1ed220, 0x33982: 0x6c1ed420, 0x33983: 0x6c1ed620, + 0x33984: 0x6c1ed820, 0x33985: 0x6c1eda20, 0x33986: 0x6c327c20, 0x33987: 0x6c327e20, + 0x33988: 0x6c328020, 0x33989: 0x6c328220, 0x3398a: 0x6c328420, 0x3398b: 0x6c328620, + 0x3398c: 0x6c328820, 0x3398d: 0x6c328a20, 0x3398e: 0x6c328c20, 0x3398f: 0x6c328e20, + 0x33990: 0x6c329020, 0x33991: 0x6c329220, 0x33992: 0x6c329420, 0x33993: 0x6c329620, + 0x33994: 0x6c4d0620, 0x33995: 0x6c4d0820, 0x33996: 0x6c4d0a20, 0x33997: 0x6c4d0c20, + 0x33998: 0x6c4d0e20, 0x33999: 0x6c4d1020, 0x3399a: 0x6c4d1220, 0x3399b: 0x6c4d1420, + 0x3399c: 0x6c4d1620, 0x3399d: 0x6c4d1820, 0x3399e: 0x6c4d1a20, 0x3399f: 0x6c4d1c20, + 0x339a0: 0x6c4d1e20, 0x339a1: 0x6c4d2020, 0x339a2: 0x6c4d2220, 0x339a3: 0x6c4d2420, + 0x339a4: 0x6c6ee420, 0x339a5: 0x6c6ee620, 0x339a6: 0x6c6ee820, 0x339a7: 0x6c6eea20, + 0x339a8: 0x6c6eec20, 0x339a9: 0x6c6eee20, 0x339aa: 0x6c6ef020, 0x339ab: 0x6c6ef220, + 0x339ac: 0x6c6ef420, 0x339ad: 0x6c6ef620, 0x339ae: 0x6c967a20, 0x339af: 0x6c967c20, + 0x339b0: 0x6c967e20, 0x339b1: 0x6c968020, 0x339b2: 0x6c968220, 0x339b3: 0x6c968420, + 0x339b4: 0x6c968620, 0x339b5: 0x6c968820, 0x339b6: 0x6c968a20, 0x339b7: 0x6c968c20, + 0x339b8: 0x6c968e20, 0x339b9: 0x6c969020, 0x339ba: 0x6c969220, 0x339bb: 0x6c969420, + 0x339bc: 0x6c969620, 0x339bd: 0x6c969820, 0x339be: 0x6c969a20, 0x339bf: 0x6c969c20, + // Block 0xce7, offset 0x339c0 + 0x339c0: 0x6cc28e20, 0x339c1: 0x6cc29020, 0x339c2: 0x6cc29220, 0x339c3: 0x6cc29420, + 0x339c4: 0x6cc29620, 0x339c5: 0x6cc29820, 0x339c6: 0x6cc29a20, 0x339c7: 0x6cc29c20, + 0x339c8: 0x6cc29e20, 0x339c9: 0x6cc2a020, 0x339ca: 0x6cf1d020, 0x339cb: 0x6cf1d220, + 0x339cc: 0x6cf1d420, 0x339cd: 0x6cf1d620, 0x339ce: 0x6cf1d820, 0x339cf: 0x6cf1da20, + 0x339d0: 0x6cf1dc20, 0x339d1: 0x6cf1de20, 0x339d2: 0x6d218c20, 0x339d3: 0x6d218e20, + 0x339d4: 0x6d219020, 0x339d5: 0x6d219220, 0x339d6: 0x6d219420, 0x339d7: 0x6d219620, + 0x339d8: 0x6d219820, 0x339d9: 0x6d219a20, 0x339da: 0x6d219c20, 0x339db: 0x6d219e20, + 0x339dc: 0x6d21a020, 0x339dd: 0x6d21a220, 0x339de: 0x6d4f1220, 0x339df: 0x6d4f1420, + 0x339e0: 0x6d4f1620, 0x339e1: 0x6d4f1820, 0x339e2: 0x6d4f1a20, 0x339e3: 0x6d4f1c20, + 0x339e4: 0x6d4f1e20, 0x339e5: 0x6d7b6c20, 0x339e6: 0x6d7b6e20, 0x339e7: 0x6d7b7020, + 0x339e8: 0x6d7b7220, 0x339e9: 0x6d7b7420, 0x339ea: 0x6d7b7620, 0x339eb: 0x6d8a6c20, + 0x339ec: 0x6da3ac20, 0x339ed: 0x6da3ae20, 0x339ee: 0x6da3b020, 0x339ef: 0x6da3b220, + 0x339f0: 0x6da3b420, 0x339f1: 0x6da3b620, 0x339f2: 0x6dc54220, 0x339f3: 0x6dc54420, + 0x339f4: 0x6dc54620, 0x339f5: 0x6dc54820, 0x339f6: 0x6dc54a20, 0x339f7: 0x6dc54c20, + 0x339f8: 0x6de25820, 0x339f9: 0x6de25a20, 0x339fa: 0x6de25c20, 0x339fb: 0x6de25e20, + 0x339fc: 0x6de26020, 0x339fd: 0x6de26220, 0x339fe: 0x6de26420, 0x339ff: 0x6dfa0620, + // Block 0xce8, offset 0x33a00 + 0x33a00: 0x6dfa0820, 0x33a01: 0x6dfa0a20, 0x33a02: 0x6dfa0c20, 0x33a03: 0x6dfa0e20, + 0x33a04: 0x6dfa1020, 0x33a05: 0x6dfa1220, 0x33a06: 0x6e0dae20, 0x33a07: 0x6e0db020, + 0x33a08: 0x6e0db220, 0x33a09: 0x6e0db420, 0x33a0a: 0x6e1d2420, 0x33a0b: 0x6e321420, + 0x33a0c: 0x6e388220, 0x33a0d: 0x6e429620, 0x33a0e: 0x6e462820, 0x33a0f: 0x6c114c20, + 0x33a10: 0x6c114e20, 0x33a11: 0x6c115020, 0x33a12: 0x6c115220, 0x33a13: 0x6c1edc20, + 0x33a14: 0x6c32a020, 0x33a15: 0x6c32a220, 0x33a16: 0x6c3bf820, 0x33a17: 0x6c4d2c20, + 0x33a18: 0x6c4d2e20, 0x33a19: 0x6c4d3020, 0x33a1a: 0x6c4d3220, 0x33a1b: 0x6c6efa20, + 0x33a1c: 0x6c6efc20, 0x33a1d: 0x6c6efe20, 0x33a1e: 0x6c96a220, 0x33a1f: 0x6c96a420, + 0x33a20: 0x6c96a620, 0x33a21: 0x6c96a820, 0x33a22: 0x6cc2a820, 0x33a23: 0x6cc2aa20, + 0x33a24: 0x6cc2ac20, 0x33a25: 0x6cf1e420, 0x33a26: 0x6cf1e620, 0x33a27: 0x6cf1e820, + 0x33a28: 0x6d21a820, 0x33a29: 0x6d21aa20, 0x33a2a: 0x6d21ac20, 0x33a2b: 0x6d21ae20, + 0x33a2c: 0x6d21b020, 0x33a2d: 0x6d4f2020, 0x33a2e: 0x6d4f2220, 0x33a2f: 0x6d7b7e20, + 0x33a30: 0x6d7adc20, 0x33a31: 0x6d7b8020, 0x33a32: 0x6da3ba20, 0x33a33: 0x6dc55220, + 0x33a34: 0x6dc55420, 0x33a35: 0x6dc55620, 0x33a36: 0x6dc55820, 0x33a37: 0x6de26a20, + 0x33a38: 0x6de26c20, 0x33a39: 0x6de26e20, 0x33a3a: 0x6de27020, 0x33a3b: 0x6dfa1420, + 0x33a3c: 0x6dfa1620, 0x33a3d: 0x6e1d2620, 0x33a3e: 0x6e28cc20, 0x33a3f: 0x6e3d2620, + // Block 0xce9, offset 0x33a40 + 0x33a40: 0x6c08fa20, 0x33a41: 0x6c08fc20, 0x33a42: 0x6c08fe20, 0x33a43: 0x6c115820, + 0x33a44: 0x6c115a20, 0x33a45: 0x6c115c20, 0x33a46: 0x6c115e20, 0x33a47: 0x6c1ee620, + 0x33a48: 0x6c1ee820, 0x33a49: 0x6c32aa20, 0x33a4a: 0x6c32ac20, 0x33a4b: 0x6c32ae20, + 0x33a4c: 0x6c32b020, 0x33a4d: 0x6c32b220, 0x33a4e: 0x6c4d3820, 0x33a4f: 0x6c6f0420, + 0x33a50: 0x6c6f0620, 0x33a51: 0x6c6f0820, 0x33a52: 0x6c6f0a20, 0x33a53: 0x6c6f0c20, + 0x33a54: 0x6c96b220, 0x33a55: 0x6c96b420, 0x33a56: 0x6c96b620, 0x33a57: 0x6c96b820, + 0x33a58: 0x6c96ba20, 0x33a59: 0x6c96bc20, 0x33a5a: 0x6c96be20, 0x33a5b: 0x6c96c020, + 0x33a5c: 0x6c96c220, 0x33a5d: 0x6c96c420, 0x33a5e: 0x6cc2b420, 0x33a5f: 0x6cc2b620, + 0x33a60: 0x6cc2b820, 0x33a61: 0x6cc2ba20, 0x33a62: 0x6cc2bc20, 0x33a63: 0x6cc2be20, + 0x33a64: 0x6cf1ec20, 0x33a65: 0x6cf1ee20, 0x33a66: 0x6cf1f020, 0x33a67: 0x6cf1f220, + 0x33a68: 0x6cf1f420, 0x33a69: 0x6d21b820, 0x33a6a: 0x6d21ba20, 0x33a6b: 0x6d4f2a20, + 0x33a6c: 0x6d4f2c20, 0x33a6d: 0x6d4f2e20, 0x33a6e: 0x6d4f3020, 0x33a6f: 0x6d4f3220, + 0x33a70: 0x6d7b8420, 0x33a71: 0x6d7b8620, 0x33a72: 0x6d7b8820, 0x33a73: 0x6d7b8a20, + 0x33a74: 0x6da3bc20, 0x33a75: 0x6dc55c20, 0x33a76: 0x6e0db820, 0x33a77: 0x6dfa1820, + 0x33a78: 0x6e1d2a20, 0x33a79: 0x6e1d2c20, 0x33a7a: 0x6e1d2e20, 0x33a7b: 0x6e388620, + 0x33a7c: 0x6c046220, 0x33a7d: 0x6c046420, 0x33a7e: 0x6c090220, 0x33a7f: 0x6c090420, + // Block 0xcea, offset 0x33a80 + 0x33a80: 0x6c116620, 0x33a81: 0x6c116820, 0x33a82: 0x6c116a20, 0x33a83: 0x6c116c20, + 0x33a84: 0x6c1efe20, 0x33a85: 0x6c1f0020, 0x33a86: 0x6c1f0220, 0x33a87: 0x6c1f0420, + 0x33a88: 0x6c1f0620, 0x33a89: 0x6c1f0820, 0x33a8a: 0x6c1f0a20, 0x33a8b: 0x6c1f0c20, + 0x33a8c: 0x6c1f0e20, 0x33a8d: 0x6c1f1020, 0x33a8e: 0x6c1f1220, 0x33a8f: 0x6c1f1420, + 0x33a90: 0x6c1f1620, 0x33a91: 0x6c1f1820, 0x33a92: 0x6c32ca20, 0x33a93: 0x6c32cc20, + 0x33a94: 0x6c32ce20, 0x33a95: 0x6c32d020, 0x33a96: 0x6c32d220, 0x33a97: 0x6c32d420, + 0x33a98: 0x6c32d620, 0x33a99: 0x6c32d820, 0x33a9a: 0x6c32da20, 0x33a9b: 0x6c32dc20, + 0x33a9c: 0x6c4d6020, 0x33a9d: 0x6c4d6220, 0x33a9e: 0x6c4d6420, 0x33a9f: 0x6c4d6620, + 0x33aa0: 0x6c4d6820, 0x33aa1: 0x6c4d6a20, 0x33aa2: 0x6c4d6c20, 0x33aa3: 0x6c4d6e20, + 0x33aa4: 0x6c4d7020, 0x33aa5: 0x6c4d7220, 0x33aa6: 0x6c4d7420, 0x33aa7: 0x6c4d7620, + 0x33aa8: 0x6c4d7820, 0x33aa9: 0x6c4d7a20, 0x33aaa: 0x6c6f2420, 0x33aab: 0x6c6f2620, + 0x33aac: 0x6c6f2820, 0x33aad: 0x6c6f2a20, 0x33aae: 0x6c6f2c20, 0x33aaf: 0x6c6f2e20, + 0x33ab0: 0x6c6f3020, 0x33ab1: 0x6c6f3220, 0x33ab2: 0x6c6f3420, 0x33ab3: 0x6c6f3620, + 0x33ab4: 0x6c6f3820, 0x33ab5: 0x6c6f3a20, 0x33ab6: 0x6c6f3c20, 0x33ab7: 0x6c6f3e20, + 0x33ab8: 0x6c6f4020, 0x33ab9: 0x6c6f4220, 0x33aba: 0x6c6f4420, 0x33abb: 0x6c6f4620, + 0x33abc: 0x6c6f4820, 0x33abd: 0x6c6f4a20, 0x33abe: 0x6c6f4c20, 0x33abf: 0x6c6f4e20, + // Block 0xceb, offset 0x33ac0 + 0x33ac0: 0x6c6f5020, 0x33ac1: 0x6c96ee20, 0x33ac2: 0x6c96f020, 0x33ac3: 0x6c96f220, + 0x33ac4: 0x6c96f420, 0x33ac5: 0x6c96f620, 0x33ac6: 0x6c96f820, 0x33ac7: 0x6c96fa20, + 0x33ac8: 0x6c96fc20, 0x33ac9: 0x6c96fe20, 0x33aca: 0x6c970020, 0x33acb: 0x6c970220, + 0x33acc: 0x6c970420, 0x33acd: 0x6c970620, 0x33ace: 0x6c970820, 0x33acf: 0x6c970a20, + 0x33ad0: 0x6c970c20, 0x33ad1: 0x6c970e20, 0x33ad2: 0x6c971020, 0x33ad3: 0x6c971220, + 0x33ad4: 0x6c971420, 0x33ad5: 0x6c971620, 0x33ad6: 0x6c971820, 0x33ad7: 0x6c971a20, + 0x33ad8: 0x6c971c20, 0x33ad9: 0x6c971e20, 0x33ada: 0x6c972020, 0x33adb: 0x6c972220, + 0x33adc: 0x6c972420, 0x33add: 0x6c972620, 0x33ade: 0x6c972820, 0x33adf: 0x6cc2da20, + 0x33ae0: 0x6cc2dc20, 0x33ae1: 0x6cc2de20, 0x33ae2: 0x6cc2e020, 0x33ae3: 0x6cc2e220, + 0x33ae4: 0x6cc2e420, 0x33ae5: 0x6cc2e620, 0x33ae6: 0x6cc2e820, 0x33ae7: 0x6cc2ea20, + 0x33ae8: 0x6cc2ec20, 0x33ae9: 0x6cc2ee20, 0x33aea: 0x6cc2f020, 0x33aeb: 0x6cc2f220, + 0x33aec: 0x6cde5820, 0x33aed: 0x6cc2f420, 0x33aee: 0x6cc2f620, 0x33aef: 0x6cc2f820, + 0x33af0: 0x6cc2fa20, 0x33af1: 0x6cc2fc20, 0x33af2: 0x6cf20220, 0x33af3: 0x6cf20420, + 0x33af4: 0x6cf20620, 0x33af5: 0x6cf20820, 0x33af6: 0x6cf20a20, 0x33af7: 0x6cf20c20, + 0x33af8: 0x6cf20e20, 0x33af9: 0x6cf21020, 0x33afa: 0x6cf21220, 0x33afb: 0x6cf21420, + 0x33afc: 0x6cf21620, 0x33afd: 0x6cf21820, 0x33afe: 0x6cf21a20, 0x33aff: 0x6cf21c20, + // Block 0xcec, offset 0x33b00 + 0x33b00: 0x6cf21e20, 0x33b01: 0x6cf22020, 0x33b02: 0x6cf22220, 0x33b03: 0x6cf22420, + 0x33b04: 0x6cf22620, 0x33b05: 0x6cf22820, 0x33b06: 0x6cf22a20, 0x33b07: 0x6cf22c20, + 0x33b08: 0x6cf22e20, 0x33b09: 0x6cf23020, 0x33b0a: 0x6cf23220, 0x33b0b: 0x6cf23420, + 0x33b0c: 0x6cf23620, 0x33b0d: 0x6cf23820, 0x33b0e: 0x6cf23a20, 0x33b0f: 0x6d21c820, + 0x33b10: 0x6d21ca20, 0x33b11: 0x6d21cc20, 0x33b12: 0x6d21ce20, 0x33b13: 0x6d21d020, + 0x33b14: 0x6d21d220, 0x33b15: 0x6d21d420, 0x33b16: 0x6d21d620, 0x33b17: 0x6d21d820, + 0x33b18: 0x6d21da20, 0x33b19: 0x6d21dc20, 0x33b1a: 0x6d21de20, 0x33b1b: 0x6d21e020, + 0x33b1c: 0x6d21e220, 0x33b1d: 0x6d21e420, 0x33b1e: 0x6d21e620, 0x33b1f: 0x6d21e820, + 0x33b20: 0x6d21ea20, 0x33b21: 0x6d21ec20, 0x33b22: 0x6d21ee20, 0x33b23: 0x6d21f020, + 0x33b24: 0x6d21f220, 0x33b25: 0x6d21f420, 0x33b26: 0x6d21f620, 0x33b27: 0x6cf23c20, + 0x33b28: 0x6d21f820, 0x33b29: 0x6d21fa20, 0x33b2a: 0x6d4f4620, 0x33b2b: 0x6d4f4820, + 0x33b2c: 0x6d4f4a20, 0x33b2d: 0x6d4f4c20, 0x33b2e: 0x6d4f4e20, 0x33b2f: 0x6d4f5020, + 0x33b30: 0x6d4f5220, 0x33b31: 0x6d4f5420, 0x33b32: 0x6d4f5620, 0x33b33: 0x6d4f5820, + 0x33b34: 0x6d4f5a20, 0x33b35: 0x6d4f5c20, 0x33b36: 0x6d4f5e20, 0x33b37: 0x6d4f6020, + 0x33b38: 0x6d4f6220, 0x33b39: 0x6d7b9420, 0x33b3a: 0x6d7b9620, 0x33b3b: 0x6d7b9820, + 0x33b3c: 0x6d7b9a20, 0x33b3d: 0x6d7b9c20, 0x33b3e: 0x6d7b9e20, 0x33b3f: 0x6d7ba020, + // Block 0xced, offset 0x33b40 + 0x33b40: 0x6d7ba220, 0x33b41: 0x6d7ba420, 0x33b42: 0x6d7ba620, 0x33b43: 0x6d7ba820, + 0x33b44: 0x6d7baa20, 0x33b45: 0x6d912c20, 0x33b46: 0x6d7bac20, 0x33b47: 0x6d7bae20, + 0x33b48: 0x6da3c620, 0x33b49: 0x6da3c820, 0x33b4a: 0x6da3ca20, 0x33b4b: 0x6db4d020, + 0x33b4c: 0x6da3cc20, 0x33b4d: 0x6da3ce20, 0x33b4e: 0x6da3d020, 0x33b4f: 0x6dc55e20, + 0x33b50: 0x6dc56020, 0x33b51: 0x6dc56220, 0x33b52: 0x6dc56420, 0x33b53: 0x6dc56620, + 0x33b54: 0x6dc56820, 0x33b55: 0x6dc56a20, 0x33b56: 0x6dc56c20, 0x33b57: 0x6dc56e20, + 0x33b58: 0x6de27620, 0x33b59: 0x6de27820, 0x33b5a: 0x6de27a20, 0x33b5b: 0x6df7ca20, + 0x33b5c: 0x6de27c20, 0x33b5d: 0x6dfa2020, 0x33b5e: 0x6dfa2220, 0x33b5f: 0x6dfa2420, + 0x33b60: 0x6dfa2620, 0x33b61: 0x6e01e220, 0x33b62: 0x6dfa2820, 0x33b63: 0x6e0dbc20, + 0x33b64: 0x6e0dbe20, 0x33b65: 0x6e1d3020, 0x33b66: 0x6e28ce20, 0x33b67: 0x6e388820, + 0x33b68: 0x6e403a20, 0x33b69: 0x6c01f220, 0x33b6a: 0x6c046a20, 0x33b6b: 0x6c091020, + 0x33b6c: 0x6c091220, 0x33b6d: 0x6c091420, 0x33b6e: 0x6c091620, 0x33b6f: 0x6c091820, + 0x33b70: 0x6c091a20, 0x33b71: 0x6c091c20, 0x33b72: 0x6c118a20, 0x33b73: 0x6c118c20, + 0x33b74: 0x6c118e20, 0x33b75: 0x6c119020, 0x33b76: 0x6c119220, 0x33b77: 0x6c119420, + 0x33b78: 0x6c119620, 0x33b79: 0x6c119820, 0x33b7a: 0x6c119a20, 0x33b7b: 0x6c119c20, + 0x33b7c: 0x6c119e20, 0x33b7d: 0x6c11a020, 0x33b7e: 0x6c11a220, 0x33b7f: 0x6c11a420, + // Block 0xcee, offset 0x33b80 + 0x33b80: 0x6c11a620, 0x33b81: 0x6c11a820, 0x33b82: 0x6c11aa20, 0x33b83: 0x6c11ac20, + 0x33b84: 0x6c11ae20, 0x33b85: 0x6c11b020, 0x33b86: 0x6c11b220, 0x33b87: 0x6c11b420, + 0x33b88: 0x6c11b620, 0x33b89: 0x6c1f8020, 0x33b8a: 0x6c1f8220, 0x33b8b: 0x6c1f8420, + 0x33b8c: 0x6c1f8620, 0x33b8d: 0x6c1f8820, 0x33b8e: 0x6c1f8a20, 0x33b8f: 0x6c1f8c20, + 0x33b90: 0x6c1f8e20, 0x33b91: 0x6c1f9020, 0x33b92: 0x6c1f9220, 0x33b93: 0x6c1f9420, + 0x33b94: 0x6c1f9620, 0x33b95: 0x6c1f9820, 0x33b96: 0x6c1f9a20, 0x33b97: 0x6c1f9c20, + 0x33b98: 0x6c1f9e20, 0x33b99: 0x6c1fa020, 0x33b9a: 0x6c1fa220, 0x33b9b: 0x6c1fa420, + 0x33b9c: 0x6c1fa620, 0x33b9d: 0x6c1fa820, 0x33b9e: 0x6c1faa20, 0x33b9f: 0x6c1fac20, + 0x33ba0: 0x6c1fae20, 0x33ba1: 0x6c1fb020, 0x33ba2: 0x6c1fb220, 0x33ba3: 0x6c1fb420, + 0x33ba4: 0x6c1fb620, 0x33ba5: 0x6c1fb820, 0x33ba6: 0x6c1fba20, 0x33ba7: 0x6c1fbc20, + 0x33ba8: 0x6c1fbe20, 0x33ba9: 0x6c1fc020, 0x33baa: 0x6c1fc220, 0x33bab: 0x6c1fc420, + 0x33bac: 0x6c1fc620, 0x33bad: 0x6c1fc820, 0x33bae: 0x6c1fca20, 0x33baf: 0x6c1fcc20, + 0x33bb0: 0x6c1fce20, 0x33bb1: 0x6c1fd020, 0x33bb2: 0x6c1fd220, 0x33bb3: 0x6c1fd420, + 0x33bb4: 0x6c1fd620, 0x33bb5: 0x6c1fd820, 0x33bb6: 0x6c1fda20, 0x33bb7: 0x6c1fdc20, + 0x33bb8: 0x6c1fde20, 0x33bb9: 0x6c1fe020, 0x33bba: 0x6c1fe220, 0x33bbb: 0x6c1fe420, + 0x33bbc: 0x6c1fe620, 0x33bbd: 0x6c1fe820, 0x33bbe: 0x6c1fea20, 0x33bbf: 0x6c336420, + // Block 0xcef, offset 0x33bc0 + 0x33bc0: 0x6c336620, 0x33bc1: 0x6c336820, 0x33bc2: 0x6c336a20, 0x33bc3: 0x6c336c20, + 0x33bc4: 0x6c336e20, 0x33bc5: 0x6c337020, 0x33bc6: 0x6c337220, 0x33bc7: 0x6c337420, + 0x33bc8: 0x6c337620, 0x33bc9: 0x6c337820, 0x33bca: 0x6c337a20, 0x33bcb: 0x6c337c20, + 0x33bcc: 0x6c337e20, 0x33bcd: 0x6c338020, 0x33bce: 0x6c338220, 0x33bcf: 0x6c338420, + 0x33bd0: 0x6c338620, 0x33bd1: 0x6c338820, 0x33bd2: 0x6c338a20, 0x33bd3: 0x6c338c20, + 0x33bd4: 0x6c338e20, 0x33bd5: 0x6c339020, 0x33bd6: 0x6c339220, 0x33bd7: 0x6c339420, + 0x33bd8: 0x6c339620, 0x33bd9: 0x6c339820, 0x33bda: 0x6c339a20, 0x33bdb: 0x6c339c20, + 0x33bdc: 0x6c339e20, 0x33bdd: 0x6c33a020, 0x33bde: 0x6c33a220, 0x33bdf: 0x6c33a420, + 0x33be0: 0x6c33a620, 0x33be1: 0x6c33a820, 0x33be2: 0x6c33aa20, 0x33be3: 0x6c33ac20, + 0x33be4: 0x6c33ae20, 0x33be5: 0x6c33b020, 0x33be6: 0x6c33b220, 0x33be7: 0x6c33b420, + 0x33be8: 0x6c33b620, 0x33be9: 0x6c33b820, 0x33bea: 0x6c33ba20, 0x33beb: 0x6c33bc20, + 0x33bec: 0x6c33be20, 0x33bed: 0x6c33c020, 0x33bee: 0x6c33c220, 0x33bef: 0x6c33c420, + 0x33bf0: 0x6c33c620, 0x33bf1: 0x6c33c820, 0x33bf2: 0x6c33ca20, 0x33bf3: 0x6c33cc20, + 0x33bf4: 0x6c4e1420, 0x33bf5: 0x6c4e1620, 0x33bf6: 0x6c4e1820, 0x33bf7: 0x6c4e1a20, + 0x33bf8: 0x6c4e1c20, 0x33bf9: 0x6c4e1e20, 0x33bfa: 0x6c4e2020, 0x33bfb: 0x6c4e2220, + 0x33bfc: 0x6c4e2420, 0x33bfd: 0x6c4e2620, 0x33bfe: 0x6c4e2820, 0x33bff: 0x6c4e2a20, + // Block 0xcf0, offset 0x33c00 + 0x33c00: 0x6c4e2c20, 0x33c01: 0x6c4e2e20, 0x33c02: 0x6c4e3020, 0x33c03: 0x6c4e3220, + 0x33c04: 0x6c4e3420, 0x33c05: 0x6c4e3620, 0x33c06: 0x6c4e3820, 0x33c07: 0x6c4e3a20, + 0x33c08: 0x6c4e3c20, 0x33c09: 0x6c4e3e20, 0x33c0a: 0x6c4e4020, 0x33c0b: 0x6c4e4220, + 0x33c0c: 0x6c4e4420, 0x33c0d: 0x6c4e4620, 0x33c0e: 0x6c4e4820, 0x33c0f: 0x6c4e4a20, + 0x33c10: 0x6c4e4c20, 0x33c11: 0x6c4e4e20, 0x33c12: 0x6c4e5020, 0x33c13: 0x6c4e5220, + 0x33c14: 0x6c4e5420, 0x33c15: 0x6c4e5620, 0x33c16: 0x6c4e5820, 0x33c17: 0x6c4e5a20, + 0x33c18: 0x6c4e5c20, 0x33c19: 0x6c4e5e20, 0x33c1a: 0x6c4e6020, 0x33c1b: 0x6c4e6220, + 0x33c1c: 0x6c4e6420, 0x33c1d: 0x6c4e6620, 0x33c1e: 0x6c4e6820, 0x33c1f: 0x6c4e6a20, + 0x33c20: 0x6c4e6c20, 0x33c21: 0x6c4e6e20, 0x33c22: 0x6c4e7020, 0x33c23: 0x6c4e7220, + 0x33c24: 0x6c4e7420, 0x33c25: 0x6c4e7620, 0x33c26: 0x6c4e7820, 0x33c27: 0x6c4e7a20, + 0x33c28: 0x6c4e7c20, 0x33c29: 0x6c4e7e20, 0x33c2a: 0x6c4e8020, 0x33c2b: 0x6c4e8220, + 0x33c2c: 0x6c4e8420, 0x33c2d: 0x6c4e8620, 0x33c2e: 0x6c4e8820, 0x33c2f: 0x6c4e8a20, + 0x33c30: 0x6c4e8c20, 0x33c31: 0x6c6fe420, 0x33c32: 0x6c6fe620, 0x33c33: 0x6c6fe820, + 0x33c34: 0x6c6fea20, 0x33c35: 0x6c6fec20, 0x33c36: 0x6c6fee20, 0x33c37: 0x6c6ff020, + 0x33c38: 0x6c6ff220, 0x33c39: 0x6c6ff420, 0x33c3a: 0x6c6ff620, 0x33c3b: 0x6c6ff820, + 0x33c3c: 0x6c6ffa20, 0x33c3d: 0x6c6ffc20, 0x33c3e: 0x6c6ffe20, 0x33c3f: 0x6c700020, + // Block 0xcf1, offset 0x33c40 + 0x33c40: 0x6c700220, 0x33c41: 0x6c700420, 0x33c42: 0x6c700620, 0x33c43: 0x6c700820, + 0x33c44: 0x6c700a20, 0x33c45: 0x6c700c20, 0x33c46: 0x6c700e20, 0x33c47: 0x6c701020, + 0x33c48: 0x6c701220, 0x33c49: 0x6c701420, 0x33c4a: 0x6c701620, 0x33c4b: 0x6c701820, + 0x33c4c: 0x6c701a20, 0x33c4d: 0x6c701c20, 0x33c4e: 0x6c701e20, 0x33c4f: 0x6c702020, + 0x33c50: 0x6c702220, 0x33c51: 0x6c702420, 0x33c52: 0x6c702620, 0x33c53: 0x6c702820, + 0x33c54: 0x6c702a20, 0x33c55: 0x6c702c20, 0x33c56: 0x6c702e20, 0x33c57: 0x6c703020, + 0x33c58: 0x6c703220, 0x33c59: 0x6c703420, 0x33c5a: 0x6c703620, 0x33c5b: 0x6c703820, + 0x33c5c: 0x6c703a20, 0x33c5d: 0x6c703c20, 0x33c5e: 0x6c703e20, 0x33c5f: 0x6c704020, + 0x33c60: 0x6c704220, 0x33c61: 0x6c704420, 0x33c62: 0x6c704620, 0x33c63: 0x6c704820, + 0x33c64: 0x6c704a20, 0x33c65: 0x6c704c20, 0x33c66: 0x6c704e20, 0x33c67: 0x6c705020, + 0x33c68: 0x6c705220, 0x33c69: 0x6c705420, 0x33c6a: 0x6c705620, 0x33c6b: 0x6c705820, + 0x33c6c: 0x6c705a20, 0x33c6d: 0x6c705c20, 0x33c6e: 0x6c705e20, 0x33c6f: 0x6c706020, + 0x33c70: 0x6c706220, 0x33c71: 0x6c706420, 0x33c72: 0x6c706620, 0x33c73: 0x6c706820, + 0x33c74: 0x6c706a20, 0x33c75: 0x6c706c20, 0x33c76: 0x6c706e20, 0x33c77: 0x6c707020, + 0x33c78: 0x6c707220, 0x33c79: 0x6c707420, 0x33c7a: 0x6c707620, 0x33c7b: 0x6c707820, + 0x33c7c: 0x6c707a20, 0x33c7d: 0x6c707c20, 0x33c7e: 0x6c707e20, 0x33c7f: 0x6c708020, + // Block 0xcf2, offset 0x33c80 + 0x33c80: 0x6c97d620, 0x33c81: 0x6c97d820, 0x33c82: 0x6c97da20, 0x33c83: 0x6c97dc20, + 0x33c84: 0x6c97de20, 0x33c85: 0x6c97e020, 0x33c86: 0x6c97e220, 0x33c87: 0x6c97e420, + 0x33c88: 0x6c97e620, 0x33c89: 0x6c97e820, 0x33c8a: 0x6c97ea20, 0x33c8b: 0x6c97ec20, + 0x33c8c: 0x6c97ee20, 0x33c8d: 0x6c97f020, 0x33c8e: 0x6c97f220, 0x33c8f: 0x6c97f420, + 0x33c90: 0x6c97f620, 0x33c91: 0x6c97f820, 0x33c92: 0x6c97fa20, 0x33c93: 0x6c97fc20, + 0x33c94: 0x6c97fe20, 0x33c95: 0x6c980020, 0x33c96: 0x6c980220, 0x33c97: 0x6c980420, + 0x33c98: 0x6c980620, 0x33c99: 0x6c980820, 0x33c9a: 0x6c980a20, 0x33c9b: 0x6c980c20, + 0x33c9c: 0x6c980e20, 0x33c9d: 0x6c981020, 0x33c9e: 0x6c981220, 0x33c9f: 0x6c981420, + 0x33ca0: 0x6c981620, 0x33ca1: 0x6c981820, 0x33ca2: 0x6c981a20, 0x33ca3: 0x6c981c20, + 0x33ca4: 0x6c981e20, 0x33ca5: 0x6c982020, 0x33ca6: 0x6c982220, 0x33ca7: 0x6c982420, + 0x33ca8: 0x6c982620, 0x33ca9: 0x6c982820, 0x33caa: 0x6c982a20, 0x33cab: 0x6c982c20, + 0x33cac: 0x6c982e20, 0x33cad: 0x6c983020, 0x33cae: 0x6c983220, 0x33caf: 0x6c983420, + 0x33cb0: 0x6c983620, 0x33cb1: 0x6c983820, 0x33cb2: 0x6c983a20, 0x33cb3: 0x6c983c20, + 0x33cb4: 0x6c983e20, 0x33cb5: 0x6c984020, 0x33cb6: 0x6c984220, 0x33cb7: 0x6c984420, + 0x33cb8: 0x6c984620, 0x33cb9: 0x6c984820, 0x33cba: 0x6c984a20, 0x33cbb: 0x6c984c20, + 0x33cbc: 0x6c984e20, 0x33cbd: 0x6c985020, 0x33cbe: 0x6c985220, 0x33cbf: 0x6c985420, + // Block 0xcf3, offset 0x33cc0 + 0x33cc0: 0x6c985620, 0x33cc1: 0x6c985820, 0x33cc2: 0x6c985a20, 0x33cc3: 0x6c985c20, + 0x33cc4: 0x6c985e20, 0x33cc5: 0x6c986020, 0x33cc6: 0x6c986220, 0x33cc7: 0x6c986420, + 0x33cc8: 0x6c986620, 0x33cc9: 0x6c986820, 0x33cca: 0x6c986a20, 0x33ccb: 0x6c986c20, + 0x33ccc: 0x6c986e20, 0x33ccd: 0x6c987020, 0x33cce: 0x6c987220, 0x33ccf: 0x6c987420, + 0x33cd0: 0x6c987620, 0x33cd1: 0x6c987820, 0x33cd2: 0x6c987a20, 0x33cd3: 0x6c987c20, + 0x33cd4: 0x6c987e20, 0x33cd5: 0x6c988020, 0x33cd6: 0x6c988220, 0x33cd7: 0x6c988420, + 0x33cd8: 0x6c988620, 0x33cd9: 0x6c988820, 0x33cda: 0x6c988a20, 0x33cdb: 0x6c988c20, + 0x33cdc: 0x6c988e20, 0x33cdd: 0x6c989020, 0x33cde: 0x6c989220, 0x33cdf: 0x6c989420, + 0x33ce0: 0x6c989620, 0x33ce1: 0x6c989820, 0x33ce2: 0x6c989a20, 0x33ce3: 0x6c989c20, + 0x33ce4: 0x6c989e20, 0x33ce5: 0x6c98a020, 0x33ce6: 0x6c98a220, 0x33ce7: 0x6c98a420, + 0x33ce8: 0x6cc3ac20, 0x33ce9: 0x6cc3ae20, 0x33cea: 0x6cc3b020, 0x33ceb: 0x6cc3b220, + 0x33cec: 0x6cc3b420, 0x33ced: 0x6cc3b620, 0x33cee: 0x6cc3b820, 0x33cef: 0x6cc3ba20, + 0x33cf0: 0x6cc3bc20, 0x33cf1: 0x6cc3be20, 0x33cf2: 0x6cc3c020, 0x33cf3: 0x6cc3c220, + 0x33cf4: 0x6cc3c420, 0x33cf5: 0x6cc3c620, 0x33cf6: 0x6cc3c820, 0x33cf7: 0x6cc3ca20, + 0x33cf8: 0x6cc3cc20, 0x33cf9: 0x6cc3ce20, 0x33cfa: 0x6cc3d020, 0x33cfb: 0x6cc3d220, + 0x33cfc: 0x6cc3d420, 0x33cfd: 0x6cc3d620, 0x33cfe: 0x6cc3d820, 0x33cff: 0x6cc3da20, + // Block 0xcf4, offset 0x33d00 + 0x33d00: 0x6cc3dc20, 0x33d01: 0x6cc3de20, 0x33d02: 0x6cc3e020, 0x33d03: 0x6cc3e220, + 0x33d04: 0x6cc3e420, 0x33d05: 0x6cc3e620, 0x33d06: 0x6cc3e820, 0x33d07: 0x6cc3ea20, + 0x33d08: 0x6cc3ec20, 0x33d09: 0x6cc3ee20, 0x33d0a: 0x6cc3f020, 0x33d0b: 0x6cc3f220, + 0x33d0c: 0x6cc3f420, 0x33d0d: 0x6cc3f620, 0x33d0e: 0x6cc3f820, 0x33d0f: 0x6cc3fa20, + 0x33d10: 0x6cc3fc20, 0x33d11: 0x6cc3fe20, 0x33d12: 0x6cc40020, 0x33d13: 0x6cc40220, + 0x33d14: 0x6cc40420, 0x33d15: 0x6cc40620, 0x33d16: 0x6cc40820, 0x33d17: 0x6cc40a20, + 0x33d18: 0x6cc40c20, 0x33d19: 0x6cc40e20, 0x33d1a: 0x6cc41020, 0x33d1b: 0x6cc41220, + 0x33d1c: 0x6cc41420, 0x33d1d: 0x6cc41620, 0x33d1e: 0x6cc41820, 0x33d1f: 0x6cc41a20, + 0x33d20: 0x6cc41c20, 0x33d21: 0x6cc41e20, 0x33d22: 0x6cc42020, 0x33d23: 0x6cc42220, + 0x33d24: 0x6cc42420, 0x33d25: 0x6cc42620, 0x33d26: 0x6cc42820, 0x33d27: 0x6cc42a20, + 0x33d28: 0x6cc42c20, 0x33d29: 0x6cc42e20, 0x33d2a: 0x6cc43020, 0x33d2b: 0x6cc43220, + 0x33d2c: 0x6cc43420, 0x33d2d: 0x6cc43620, 0x33d2e: 0x6cc43820, 0x33d2f: 0x6cc43a20, + 0x33d30: 0x6cc43c20, 0x33d31: 0x6cc43e20, 0x33d32: 0x6cc44020, 0x33d33: 0x6cc44220, + 0x33d34: 0x6cc44420, 0x33d35: 0x6cc44620, 0x33d36: 0x6cc44820, 0x33d37: 0x6cc44a20, + 0x33d38: 0x6cc44c20, 0x33d39: 0x6cc44e20, 0x33d3a: 0x6cc45020, 0x33d3b: 0x6cc45220, + 0x33d3c: 0x6cc45420, 0x33d3d: 0x6cc45620, 0x33d3e: 0x6cc45820, 0x33d3f: 0x6cc45a20, + // Block 0xcf5, offset 0x33d40 + 0x33d40: 0x6cc45c20, 0x33d41: 0x6cc45e20, 0x33d42: 0x6cc46020, 0x33d43: 0x6cc46220, + 0x33d44: 0x6cc46420, 0x33d45: 0x6cc46620, 0x33d46: 0x6cc46820, 0x33d47: 0x6cc46a20, + 0x33d48: 0x6cc46c20, 0x33d49: 0x6cc46e20, 0x33d4a: 0x6cc47020, 0x33d4b: 0x6cc47220, + 0x33d4c: 0x6cc47420, 0x33d4d: 0x6cf2b620, 0x33d4e: 0x6cf2b820, 0x33d4f: 0x6cf2ba20, + 0x33d50: 0x6cf2bc20, 0x33d51: 0x6cf2be20, 0x33d52: 0x6cf2c020, 0x33d53: 0x6cf2c220, + 0x33d54: 0x6cf2c420, 0x33d55: 0x6cf2c620, 0x33d56: 0x6cf2c820, 0x33d57: 0x6cf2ca20, + 0x33d58: 0x6cf2cc20, 0x33d59: 0x6cf2ce20, 0x33d5a: 0x6cf2d020, 0x33d5b: 0x6cf2d220, + 0x33d5c: 0x6cf2d420, 0x33d5d: 0x6cf2d620, 0x33d5e: 0x6cf2d820, 0x33d5f: 0x6cf2da20, + 0x33d60: 0x6cf2dc20, 0x33d61: 0x6cf2de20, 0x33d62: 0x6cf2e020, 0x33d63: 0x6cf2e220, + 0x33d64: 0x6cf2e420, 0x33d65: 0x6cf2e620, 0x33d66: 0x6cf2e820, 0x33d67: 0x6cf2ea20, + 0x33d68: 0x6cf2ec20, 0x33d69: 0x6cf2ee20, 0x33d6a: 0x6cf2f020, 0x33d6b: 0x6cf2f220, + 0x33d6c: 0x6cf2f420, 0x33d6d: 0x6cf2f620, 0x33d6e: 0x6cf2f820, 0x33d6f: 0x6cf2fa20, + 0x33d70: 0x6cf2fc20, 0x33d71: 0x6cf2fe20, 0x33d72: 0x6cf30020, 0x33d73: 0x6cf30220, + 0x33d74: 0x6cf30420, 0x33d75: 0x6cf30620, 0x33d76: 0x6cf30820, 0x33d77: 0x6cf30a20, + 0x33d78: 0x6cf30c20, 0x33d79: 0x6cf30e20, 0x33d7a: 0x6cf31020, 0x33d7b: 0x6cf31220, + 0x33d7c: 0x6cf31420, 0x33d7d: 0x6cf31620, 0x33d7e: 0x6cf31820, 0x33d7f: 0x6cf31a20, + // Block 0xcf6, offset 0x33d80 + 0x33d80: 0x6cf31c20, 0x33d81: 0x6cf31e20, 0x33d82: 0x6cf32020, 0x33d83: 0x6cf32220, + 0x33d84: 0x6cf32420, 0x33d85: 0x6cf32620, 0x33d86: 0x6cf32820, 0x33d87: 0x6cf32a20, + 0x33d88: 0x6cf32c20, 0x33d89: 0x6cf32e20, 0x33d8a: 0x6cf33020, 0x33d8b: 0x6cf33220, + 0x33d8c: 0x6cf33420, 0x33d8d: 0x6cf33620, 0x33d8e: 0x6cf33820, 0x33d8f: 0x6cf33a20, + 0x33d90: 0x6cf33c20, 0x33d91: 0x6cf33e20, 0x33d92: 0x6cf34020, 0x33d93: 0x6cf34220, + 0x33d94: 0x6cf34420, 0x33d95: 0x6cf34620, 0x33d96: 0x6cf34820, 0x33d97: 0x6cf34a20, + 0x33d98: 0x6cf34c20, 0x33d99: 0x6cf34e20, 0x33d9a: 0x6cf35020, 0x33d9b: 0x6cf35220, + 0x33d9c: 0x6cf35420, 0x33d9d: 0x6cf35620, 0x33d9e: 0x6cf35820, 0x33d9f: 0x6cf35a20, + 0x33da0: 0x6d227c20, 0x33da1: 0x6d227e20, 0x33da2: 0x6d228020, 0x33da3: 0x6d228220, + 0x33da4: 0x6d228420, 0x33da5: 0x6d228620, 0x33da6: 0x6d228820, 0x33da7: 0x6d228a20, + 0x33da8: 0x6d228c20, 0x33da9: 0x6d228e20, 0x33daa: 0x6d229020, 0x33dab: 0x6d229220, + 0x33dac: 0x6d229420, 0x33dad: 0x6d229620, 0x33dae: 0x6d229820, 0x33daf: 0x6d229a20, + 0x33db0: 0x6d229c20, 0x33db1: 0x6d229e20, 0x33db2: 0x6d22a020, 0x33db3: 0x6d22a220, + 0x33db4: 0x6d22a420, 0x33db5: 0x6d22a620, 0x33db6: 0x6d22a820, 0x33db7: 0x6d22aa20, + 0x33db8: 0x6d22ac20, 0x33db9: 0x6d22ae20, 0x33dba: 0x6d22b020, 0x33dbb: 0x6d22b220, + 0x33dbc: 0x6d22b420, 0x33dbd: 0x6d22b620, 0x33dbe: 0x6d22b820, 0x33dbf: 0x6d22ba20, + // Block 0xcf7, offset 0x33dc0 + 0x33dc0: 0x6d22bc20, 0x33dc1: 0x6d22be20, 0x33dc2: 0x6d22c020, 0x33dc3: 0x6d22c220, + 0x33dc4: 0x6d22c420, 0x33dc5: 0x6d22c620, 0x33dc6: 0x6d22c820, 0x33dc7: 0x6d22ca20, + 0x33dc8: 0x6d22cc20, 0x33dc9: 0x6d22ce20, 0x33dca: 0x6d22d020, 0x33dcb: 0x6d22d220, + 0x33dcc: 0x6d22d420, 0x33dcd: 0x6d22d620, 0x33dce: 0x6d22d820, 0x33dcf: 0x6d22da20, + 0x33dd0: 0x6d22dc20, 0x33dd1: 0x6d22de20, 0x33dd2: 0x6d22e020, 0x33dd3: 0x6d22e220, + 0x33dd4: 0x6d22e420, 0x33dd5: 0x6d22e620, 0x33dd6: 0x6d22e820, 0x33dd7: 0x6d22ea20, + 0x33dd8: 0x6d22ec20, 0x33dd9: 0x6d22ee20, 0x33dda: 0x6d22f020, 0x33ddb: 0x6d22f220, + 0x33ddc: 0x6d22f420, 0x33ddd: 0x6d22f620, 0x33dde: 0x6d22f820, 0x33ddf: 0x6d22fa20, + 0x33de0: 0x6d22fc20, 0x33de1: 0x6d22fe20, 0x33de2: 0x6d230020, 0x33de3: 0x6d230220, + 0x33de4: 0x6d230420, 0x33de5: 0x6d230620, 0x33de6: 0x6d230820, 0x33de7: 0x6d230a20, + 0x33de8: 0x6d230c20, 0x33de9: 0x6d230e20, 0x33dea: 0x6d231020, 0x33deb: 0x6d231220, + 0x33dec: 0x6d231420, 0x33ded: 0x6d231620, 0x33dee: 0x6d231820, 0x33def: 0x6d231a20, + 0x33df0: 0x6d231c20, 0x33df1: 0x6d4ff020, 0x33df2: 0x6d4ff220, 0x33df3: 0x6d4ff420, + 0x33df4: 0x6d4ff620, 0x33df5: 0x6d4ff820, 0x33df6: 0x6d4ffa20, 0x33df7: 0x6d4ffc20, + 0x33df8: 0x6d4ffe20, 0x33df9: 0x6d500020, 0x33dfa: 0x6d500220, 0x33dfb: 0x6d500420, + 0x33dfc: 0x6d500620, 0x33dfd: 0x6d500820, 0x33dfe: 0x6d500a20, 0x33dff: 0x6d500c20, + // Block 0xcf8, offset 0x33e00 + 0x33e00: 0x6d500e20, 0x33e01: 0x6d501020, 0x33e02: 0x6d501220, 0x33e03: 0x6d501420, + 0x33e04: 0x6d501620, 0x33e05: 0x6d501820, 0x33e06: 0x6d501a20, 0x33e07: 0x6d501c20, + 0x33e08: 0x6d501e20, 0x33e09: 0x6d502020, 0x33e0a: 0x6d502220, 0x33e0b: 0x6d502420, + 0x33e0c: 0x6d502620, 0x33e0d: 0x6d502820, 0x33e0e: 0x6d502a20, 0x33e0f: 0x6d502c20, + 0x33e10: 0x6d502e20, 0x33e11: 0x6d503020, 0x33e12: 0x6d503220, 0x33e13: 0x6d503420, + 0x33e14: 0x6d503620, 0x33e15: 0x6d503820, 0x33e16: 0x6d503a20, 0x33e17: 0x6d503c20, + 0x33e18: 0x6d503e20, 0x33e19: 0x6d504020, 0x33e1a: 0x6d504220, 0x33e1b: 0x6d504420, + 0x33e1c: 0x6d504620, 0x33e1d: 0x6d504820, 0x33e1e: 0x6d504a20, 0x33e1f: 0x6d504c20, + 0x33e20: 0x6d504e20, 0x33e21: 0x6d505020, 0x33e22: 0x6d505220, 0x33e23: 0x6d505420, + 0x33e24: 0x6d505620, 0x33e25: 0x6d505820, 0x33e26: 0x6d505a20, 0x33e27: 0x6d505c20, + 0x33e28: 0x6d505e20, 0x33e29: 0x6d506020, 0x33e2a: 0x6d506220, 0x33e2b: 0x6d506420, + 0x33e2c: 0x6d506620, 0x33e2d: 0x6d506820, 0x33e2e: 0x6d506a20, 0x33e2f: 0x6d506c20, + 0x33e30: 0x6d506e20, 0x33e31: 0x6d507020, 0x33e32: 0x6d507220, 0x33e33: 0x6d507420, + 0x33e34: 0x6d507620, 0x33e35: 0x6d507820, 0x33e36: 0x6d507a20, 0x33e37: 0x6d507c20, + 0x33e38: 0x6d507e20, 0x33e39: 0x6d508020, 0x33e3a: 0x6d508220, 0x33e3b: 0x6d508420, + 0x33e3c: 0x6d508620, 0x33e3d: 0x6d508820, 0x33e3e: 0x6d508a20, 0x33e3f: 0x6d508c20, + // Block 0xcf9, offset 0x33e40 + 0x33e40: 0x6d508e20, 0x33e41: 0x6d509020, 0x33e42: 0x6d509220, 0x33e43: 0x6d509420, + 0x33e44: 0x6d509620, 0x33e45: 0x6d509820, 0x33e46: 0x6d509a20, 0x33e47: 0x6d509c20, + 0x33e48: 0x6d509e20, 0x33e49: 0x6d50a020, 0x33e4a: 0x6d50a220, 0x33e4b: 0x6d50a420, + 0x33e4c: 0x6d50a620, 0x33e4d: 0x6d50a820, 0x33e4e: 0x6d50aa20, 0x33e4f: 0x6d50ac20, + 0x33e50: 0x6d50ae20, 0x33e51: 0x6d50b020, 0x33e52: 0x6d7c0220, 0x33e53: 0x6d7c0420, + 0x33e54: 0x6d7c0620, 0x33e55: 0x6d7c0820, 0x33e56: 0x6d7c0a20, 0x33e57: 0x6d7c0c20, + 0x33e58: 0x6d7c0e20, 0x33e59: 0x6d7c1020, 0x33e5a: 0x6d7c1220, 0x33e5b: 0x6d7c1420, + 0x33e5c: 0x6d7c1620, 0x33e5d: 0x6d7c1820, 0x33e5e: 0x6d7c1a20, 0x33e5f: 0x6d7c1c20, + 0x33e60: 0x6d7c1e20, 0x33e61: 0x6d7c2020, 0x33e62: 0x6d7c2220, 0x33e63: 0x6d7c2420, + 0x33e64: 0x6d7c2620, 0x33e65: 0x6d7c2820, 0x33e66: 0x6d7c2a20, 0x33e67: 0x6d7c2c20, + 0x33e68: 0x6d7c2e20, 0x33e69: 0x6d7c3020, 0x33e6a: 0x6d7c3220, 0x33e6b: 0x6d7c3420, + 0x33e6c: 0x6d7c3620, 0x33e6d: 0x6d7c3820, 0x33e6e: 0x6d7c3a20, 0x33e6f: 0x6d7c3c20, + 0x33e70: 0x6d7c3e20, 0x33e71: 0x6d7c4020, 0x33e72: 0x6d7c4220, 0x33e73: 0x6d7c4420, + 0x33e74: 0x6d7c4620, 0x33e75: 0x6d7c4820, 0x33e76: 0x6d7c4a20, 0x33e77: 0x6d7c4c20, + 0x33e78: 0x6d7c4e20, 0x33e79: 0x6d7c5020, 0x33e7a: 0x6d7c5220, 0x33e7b: 0x6d7c5420, + 0x33e7c: 0x6d7c5620, 0x33e7d: 0x6d7c5820, 0x33e7e: 0x6d7c5a20, 0x33e7f: 0x6d7c5c20, + // Block 0xcfa, offset 0x33e80 + 0x33e80: 0x6d7c5e20, 0x33e81: 0x6d7c6020, 0x33e82: 0x6d7c6220, 0x33e83: 0x6d7c6420, + 0x33e84: 0x6d7c6620, 0x33e85: 0x6d7c6820, 0x33e86: 0x6d7c6a20, 0x33e87: 0x6d7c6c20, + 0x33e88: 0x6d7c6e20, 0x33e89: 0x6d7c7020, 0x33e8a: 0x6d7c7220, 0x33e8b: 0x6d7c7420, + 0x33e8c: 0x6d7c7620, 0x33e8d: 0x6d7c7820, 0x33e8e: 0x6da40820, 0x33e8f: 0x6da40a20, + 0x33e90: 0x6da40c20, 0x33e91: 0x6da40e20, 0x33e92: 0x6da41020, 0x33e93: 0x6da41220, + 0x33e94: 0x6da41420, 0x33e95: 0x6da41620, 0x33e96: 0x6da41820, 0x33e97: 0x6da41a20, + 0x33e98: 0x6da41c20, 0x33e99: 0x6da41e20, 0x33e9a: 0x6da42020, 0x33e9b: 0x6da42220, + 0x33e9c: 0x6da42420, 0x33e9d: 0x6da42620, 0x33e9e: 0x6da42820, 0x33e9f: 0x6da42a20, + 0x33ea0: 0x6da42c20, 0x33ea1: 0x6da42e20, 0x33ea2: 0x6da43020, 0x33ea3: 0x6da43220, + 0x33ea4: 0x6da43420, 0x33ea5: 0x6da43620, 0x33ea6: 0x6da43820, 0x33ea7: 0x6da43a20, + 0x33ea8: 0x6da43c20, 0x33ea9: 0x6da43e20, 0x33eaa: 0x6da44020, 0x33eab: 0x6da44220, + 0x33eac: 0x6da44420, 0x33ead: 0x6da44620, 0x33eae: 0x6da44820, 0x33eaf: 0x6da44a20, + 0x33eb0: 0x6da44c20, 0x33eb1: 0x6da44e20, 0x33eb2: 0x6da45020, 0x33eb3: 0x6da45220, + 0x33eb4: 0x6da45420, 0x33eb5: 0x6da45620, 0x33eb6: 0x6da45820, 0x33eb7: 0x6da45a20, + 0x33eb8: 0x6da45c20, 0x33eb9: 0x6da45e20, 0x33eba: 0x6da46020, 0x33ebb: 0x6dc59e20, + 0x33ebc: 0x6dc5a020, 0x33ebd: 0x6dc5a220, 0x33ebe: 0x6dc5a420, 0x33ebf: 0x6dc5a620, + // Block 0xcfb, offset 0x33ec0 + 0x33ec0: 0x6dc5a820, 0x33ec1: 0x6dc5aa20, 0x33ec2: 0x6dc5ac20, 0x33ec3: 0x6dc5ae20, + 0x33ec4: 0x6dc5b020, 0x33ec5: 0x6dc5b220, 0x33ec6: 0x6dc5b420, 0x33ec7: 0x6dc5b620, + 0x33ec8: 0x6dc5b820, 0x33ec9: 0x6dc5ba20, 0x33eca: 0x6dc5bc20, 0x33ecb: 0x6dc5be20, + 0x33ecc: 0x6dc5c020, 0x33ecd: 0x6dc5c220, 0x33ece: 0x6dc5c420, 0x33ecf: 0x6dc5c620, + 0x33ed0: 0x6dc5c820, 0x33ed1: 0x6dc5ca20, 0x33ed2: 0x6dc5cc20, 0x33ed3: 0x6dc5ce20, + 0x33ed4: 0x6dc5d020, 0x33ed5: 0x6dc5d220, 0x33ed6: 0x6dc5d420, 0x33ed7: 0x6dc5d620, + 0x33ed8: 0x6dc5d820, 0x33ed9: 0x6dc5da20, 0x33eda: 0x6dc5dc20, 0x33edb: 0x6dc5de20, + 0x33edc: 0x6dc5e020, 0x33edd: 0x6dc5e220, 0x33ede: 0x6dc5e420, 0x33edf: 0x6dc5e620, + 0x33ee0: 0x6dc5e820, 0x33ee1: 0x6dc5ea20, 0x33ee2: 0x6dc5ec20, 0x33ee3: 0x6dc5ee20, + 0x33ee4: 0x6dc5f020, 0x33ee5: 0x6dc5f220, 0x33ee6: 0x6de29020, 0x33ee7: 0x6de29220, + 0x33ee8: 0x6de29420, 0x33ee9: 0x6de29620, 0x33eea: 0x6de29820, 0x33eeb: 0x6de29a20, + 0x33eec: 0x6de29c20, 0x33eed: 0x6de29e20, 0x33eee: 0x6de2a020, 0x33eef: 0x6de2a220, + 0x33ef0: 0x6de2a420, 0x33ef1: 0x6de2a620, 0x33ef2: 0x6de2a820, 0x33ef3: 0x6de2aa20, + 0x33ef4: 0x6de2ac20, 0x33ef5: 0x6de2ae20, 0x33ef6: 0x6de2b020, 0x33ef7: 0x6de2b220, + 0x33ef8: 0x6de2b420, 0x33ef9: 0x6de2b620, 0x33efa: 0x6de2b820, 0x33efb: 0x6de2ba20, + 0x33efc: 0x6de2bc20, 0x33efd: 0x6de2be20, 0x33efe: 0x6de2c020, 0x33eff: 0x6de2c220, + // Block 0xcfc, offset 0x33f00 + 0x33f00: 0x6de2c420, 0x33f01: 0x6de2c620, 0x33f02: 0x6de2c820, 0x33f03: 0x6de2ca20, + 0x33f04: 0x6de2cc20, 0x33f05: 0x6de2ce20, 0x33f06: 0x6de2d020, 0x33f07: 0x6de2d220, + 0x33f08: 0x6de2d420, 0x33f09: 0x6de2d620, 0x33f0a: 0x6de2d820, 0x33f0b: 0x6dfa3a20, + 0x33f0c: 0x6dfa3c20, 0x33f0d: 0x6dfa3e20, 0x33f0e: 0x6dfa4020, 0x33f0f: 0x6dfa4220, + 0x33f10: 0x6dfa4420, 0x33f11: 0x6dfa4620, 0x33f12: 0x6dfa4820, 0x33f13: 0x6dfa4a20, + 0x33f14: 0x6dfa4c20, 0x33f15: 0x6dfa4e20, 0x33f16: 0x6dfa5020, 0x33f17: 0x6e0dc620, + 0x33f18: 0x6e0dc820, 0x33f19: 0x6e0dca20, 0x33f1a: 0x6e0dcc20, 0x33f1b: 0x6e0dce20, + 0x33f1c: 0x6e0dd020, 0x33f1d: 0x6e0dd220, 0x33f1e: 0x6e0dd420, 0x33f1f: 0x6e0dd620, + 0x33f20: 0x6e0dd820, 0x33f21: 0x6e0dda20, 0x33f22: 0x6e0ddc20, 0x33f23: 0x6e0dde20, + 0x33f24: 0x6e0de020, 0x33f25: 0x6e1d3a20, 0x33f26: 0x6e1d3c20, 0x33f27: 0x6e1d3e20, + 0x33f28: 0x6e1d4020, 0x33f29: 0x6e1d4220, 0x33f2a: 0x6e1d4420, 0x33f2b: 0x6e1d4620, + 0x33f2c: 0x6e1d4820, 0x33f2d: 0x6e1d4a20, 0x33f2e: 0x6e1d4c20, 0x33f2f: 0x6e28d820, + 0x33f30: 0x6e28da20, 0x33f31: 0x6e28dc20, 0x33f32: 0x6e28de20, 0x33f33: 0x6e28e020, + 0x33f34: 0x6e28e220, 0x33f35: 0x6e28e420, 0x33f36: 0x6e28e620, 0x33f37: 0x6e28e820, + 0x33f38: 0x6e28ea20, 0x33f39: 0x6e28ec20, 0x33f3a: 0x6e28ee20, 0x33f3b: 0x6e321620, + 0x33f3c: 0x6e321820, 0x33f3d: 0x6e321a20, 0x33f3e: 0x6e321c20, 0x33f3f: 0x6e321e20, + // Block 0xcfd, offset 0x33f40 + 0x33f40: 0x6e322020, 0x33f41: 0x6e322220, 0x33f42: 0x6e322420, 0x33f43: 0x6e3d2820, + 0x33f44: 0x6e3d2a20, 0x33f45: 0x6e403e20, 0x33f46: 0x6e404020, 0x33f47: 0x6e404220, + 0x33f48: 0x6e429a20, 0x33f49: 0x6e429c20, 0x33f4a: 0x6e451c20, 0x33f4b: 0x6e45c020, + 0x33f4c: 0x6c092620, 0x33f4d: 0x6c092820, 0x33f4e: 0x6c11c420, 0x33f4f: 0x6c11c620, + 0x33f50: 0x6c11c820, 0x33f51: 0x6c11ca20, 0x33f52: 0x6c200620, 0x33f53: 0x6c200820, + 0x33f54: 0x6c200a20, 0x33f55: 0x6c200c20, 0x33f56: 0x6c200e20, 0x33f57: 0x6c201020, + 0x33f58: 0x6c201220, 0x33f59: 0x6c201420, 0x33f5a: 0x6c33ea20, 0x33f5b: 0x6c33ec20, + 0x33f5c: 0x6c33ee20, 0x33f5d: 0x6c33f020, 0x33f5e: 0x6c33f220, 0x33f5f: 0x6c33f420, + 0x33f60: 0x6c33f620, 0x33f61: 0x6c33f820, 0x33f62: 0x6c33fa20, 0x33f63: 0x6c33fc20, + 0x33f64: 0x6c33fe20, 0x33f65: 0x6c340020, 0x33f66: 0x6c4ea220, 0x33f67: 0x6c4ea420, + 0x33f68: 0x6c4ea620, 0x33f69: 0x6c4ea820, 0x33f6a: 0x6c4eaa20, 0x33f6b: 0x6c4eac20, + 0x33f6c: 0x6c4eae20, 0x33f6d: 0x6c4eb020, 0x33f6e: 0x6c4eb220, 0x33f6f: 0x6c4eb420, + 0x33f70: 0x6c4eb620, 0x33f71: 0x6c4eb820, 0x33f72: 0x6c4eba20, 0x33f73: 0x6c4ebc20, + 0x33f74: 0x6c4ebe20, 0x33f75: 0x6c4ec020, 0x33f76: 0x6c4ec220, 0x33f77: 0x6c709e20, + 0x33f78: 0x6c70a020, 0x33f79: 0x6c70a220, 0x33f7a: 0x6c70a420, 0x33f7b: 0x6c70a620, + 0x33f7c: 0x6c70a820, 0x33f7d: 0x6c70aa20, 0x33f7e: 0x6c70ac20, 0x33f7f: 0x6c98c020, + // Block 0xcfe, offset 0x33f80 + 0x33f80: 0x6c98c220, 0x33f81: 0x6c98c420, 0x33f82: 0x6c98c620, 0x33f83: 0x6c98c820, + 0x33f84: 0x6c98ca20, 0x33f85: 0x6c98cc20, 0x33f86: 0x6c98ce20, 0x33f87: 0x6c98d020, + 0x33f88: 0x6cc49420, 0x33f89: 0x6cc49620, 0x33f8a: 0x6cc49820, 0x33f8b: 0x6cc49a20, + 0x33f8c: 0x6cc49c20, 0x33f8d: 0x6cc49e20, 0x33f8e: 0x6cc4a020, 0x33f8f: 0x6cc4a220, + 0x33f90: 0x6cc4a420, 0x33f91: 0x6cc4a620, 0x33f92: 0x6cc4a820, 0x33f93: 0x6cc4aa20, + 0x33f94: 0x6cf38420, 0x33f95: 0x6cf38620, 0x33f96: 0x6cf38820, 0x33f97: 0x6cf38a20, + 0x33f98: 0x6cf38c20, 0x33f99: 0x6cf38e20, 0x33f9a: 0x6cf39020, 0x33f9b: 0x6cf39220, + 0x33f9c: 0x6cf39420, 0x33f9d: 0x6cf39620, 0x33f9e: 0x6cf39820, 0x33f9f: 0x6cf39a20, + 0x33fa0: 0x6cf39c20, 0x33fa1: 0x6cf39e20, 0x33fa2: 0x6d234220, 0x33fa3: 0x6d234420, + 0x33fa4: 0x6d234620, 0x33fa5: 0x6d234820, 0x33fa6: 0x6d234a20, 0x33fa7: 0x6d234c20, + 0x33fa8: 0x6d50c820, 0x33fa9: 0x6d234e20, 0x33faa: 0x6d235020, 0x33fab: 0x6d235220, + 0x33fac: 0x6d235420, 0x33fad: 0x6d235620, 0x33fae: 0x6d235820, 0x33faf: 0x6d235a20, + 0x33fb0: 0x6d235c20, 0x33fb1: 0x6d235e20, 0x33fb2: 0x6d50ca20, 0x33fb3: 0x6d50cc20, + 0x33fb4: 0x6d50ce20, 0x33fb5: 0x6d50d020, 0x33fb6: 0x6d50d220, 0x33fb7: 0x6d50d420, + 0x33fb8: 0x6d50d620, 0x33fb9: 0x6d50d820, 0x33fba: 0x6d50da20, 0x33fbb: 0x6d50dc20, + 0x33fbc: 0x6d50de20, 0x33fbd: 0x6d50e020, 0x33fbe: 0x6d50e220, 0x33fbf: 0x6d50e420, + // Block 0xcff, offset 0x33fc0 + 0x33fc0: 0x6d50e620, 0x33fc1: 0x6d50e820, 0x33fc2: 0x6d50ea20, 0x33fc3: 0x6d50ec20, + 0x33fc4: 0x6d50ee20, 0x33fc5: 0x6d50f020, 0x33fc6: 0x6d50f220, 0x33fc7: 0x6d7c9420, + 0x33fc8: 0x6d7c9620, 0x33fc9: 0x6d7c9820, 0x33fca: 0x6d7c9a20, 0x33fcb: 0x6d7c9c20, + 0x33fcc: 0x6d7c9e20, 0x33fcd: 0x6d7ca020, 0x33fce: 0x6d7ca220, 0x33fcf: 0x6d7ca420, + 0x33fd0: 0x6d784620, 0x33fd1: 0x6d7ca620, 0x33fd2: 0x6d7ca820, 0x33fd3: 0x6da46e20, + 0x33fd4: 0x6da47020, 0x33fd5: 0x6da47220, 0x33fd6: 0x6da47420, 0x33fd7: 0x6da47620, + 0x33fd8: 0x6dc60220, 0x33fd9: 0x6dc60420, 0x33fda: 0x6de2e020, 0x33fdb: 0x6de2e220, + 0x33fdc: 0x6de2e420, 0x33fdd: 0x6de2e620, 0x33fde: 0x6dfa5620, 0x33fdf: 0x6dfa5820, + 0x33fe0: 0x6dfa5a20, 0x33fe1: 0x6e0de620, 0x33fe2: 0x6e0de820, 0x33fe3: 0x6e0dea20, + 0x33fe4: 0x6c092e20, 0x33fe5: 0x6c093020, 0x33fe6: 0x6c11ce20, 0x33fe7: 0x6c11d020, + 0x33fe8: 0x6c11d220, 0x33fe9: 0x6c11d420, 0x33fea: 0x6c201e20, 0x33feb: 0x6c202020, + 0x33fec: 0x6c202220, 0x33fed: 0x6c202420, 0x33fee: 0x6c202620, 0x33fef: 0x6c340e20, + 0x33ff0: 0x6c341020, 0x33ff1: 0x6c341220, 0x33ff2: 0x6c341420, 0x33ff3: 0x6c341620, + 0x33ff4: 0x6c341820, 0x33ff5: 0x6c341a20, 0x33ff6: 0x6c4ed220, 0x33ff7: 0x6c4ed420, + 0x33ff8: 0x6c4ed620, 0x33ff9: 0x6c4ed820, 0x33ffa: 0x6c4eda20, 0x33ffb: 0x6c4edc20, + 0x33ffc: 0x6c4ede20, 0x33ffd: 0x6c4ee020, 0x33ffe: 0x6c4ee220, 0x33fff: 0x6c4ee420, + // Block 0xd00, offset 0x34000 + 0x34000: 0x6c4ee620, 0x34001: 0x6c4ee820, 0x34002: 0x6c4eea20, 0x34003: 0x6c4eec20, + 0x34004: 0x6c4eee20, 0x34005: 0x6c70ba20, 0x34006: 0x6c70bc20, 0x34007: 0x6c70be20, + 0x34008: 0x6c70c020, 0x34009: 0x6c70c220, 0x3400a: 0x6c70c420, 0x3400b: 0x6c70c620, + 0x3400c: 0x6c70c820, 0x3400d: 0x6c98d820, 0x3400e: 0x6c98da20, 0x3400f: 0x6c98dc20, + 0x34010: 0x6c98de20, 0x34011: 0x6cc4b220, 0x34012: 0x6cc4b420, 0x34013: 0x6cc4b620, + 0x34014: 0x6cc4b820, 0x34015: 0x6cc4ba20, 0x34016: 0x6cf3a220, 0x34017: 0x6cf3a420, + 0x34018: 0x6d236220, 0x34019: 0x6d236420, 0x3401a: 0x6d236620, 0x3401b: 0x6d236820, + 0x3401c: 0x6d50f420, 0x3401d: 0x6d50f620, 0x3401e: 0x6d50f820, 0x3401f: 0x6d7cb020, + 0x34020: 0x6da47820, 0x34021: 0x6dc60620, 0x34022: 0x6e0dec20, 0x34023: 0x6e28f220, + 0x34024: 0x6e28f420, 0x34025: 0x6c047820, 0x34026: 0x6c047a20, 0x34027: 0x6c047c20, + 0x34028: 0x6c094620, 0x34029: 0x6c094820, 0x3402a: 0x6c094a20, 0x3402b: 0x6c094c20, + 0x3402c: 0x6c094e20, 0x3402d: 0x6c120620, 0x3402e: 0x6c120820, 0x3402f: 0x6c120a20, + 0x34030: 0x6c120c20, 0x34031: 0x6c120e20, 0x34032: 0x6c121020, 0x34033: 0x6c121220, + 0x34034: 0x6c121420, 0x34035: 0x6c121620, 0x34036: 0x6c121820, 0x34037: 0x6c121a20, + 0x34038: 0x6c121c20, 0x34039: 0x6c121e20, 0x3403a: 0x6c122020, 0x3403b: 0x6c122220, + 0x3403c: 0x6c122420, 0x3403d: 0x6c122620, 0x3403e: 0x6c122820, 0x3403f: 0x6c122a20, + // Block 0xd01, offset 0x34040 + 0x34040: 0x6c122c20, 0x34041: 0x6c122e20, 0x34042: 0x6c123020, 0x34043: 0x6c20a820, + 0x34044: 0x6c20aa20, 0x34045: 0x6c20ac20, 0x34046: 0x6c20ae20, 0x34047: 0x6c20b020, + 0x34048: 0x6c20b220, 0x34049: 0x6c20b420, 0x3404a: 0x6c20b620, 0x3404b: 0x6c20b820, + 0x3404c: 0x6c20ba20, 0x3404d: 0x6c20bc20, 0x3404e: 0x6c20be20, 0x3404f: 0x6c20c020, + 0x34050: 0x6c20c220, 0x34051: 0x6c20c420, 0x34052: 0x6c20c620, 0x34053: 0x6c20c820, + 0x34054: 0x6c20ca20, 0x34055: 0x6c20cc20, 0x34056: 0x6c20ce20, 0x34057: 0x6c20d020, + 0x34058: 0x6c20d220, 0x34059: 0x6c20d420, 0x3405a: 0x6c20d620, 0x3405b: 0x6c20d820, + 0x3405c: 0x6c20da20, 0x3405d: 0x6c20dc20, 0x3405e: 0x6c20de20, 0x3405f: 0x6c20e020, + 0x34060: 0x6c20e220, 0x34061: 0x6c20e420, 0x34062: 0x6c20e620, 0x34063: 0x6c20e820, + 0x34064: 0x6c20ea20, 0x34065: 0x6c20ec20, 0x34066: 0x6c20ee20, 0x34067: 0x6c20f020, + 0x34068: 0x6c20f220, 0x34069: 0x6c20f420, 0x3406a: 0x6c20f620, 0x3406b: 0x6c20f820, + 0x3406c: 0x6c20fa20, 0x3406d: 0x6c20fc20, 0x3406e: 0x6c20fe20, 0x3406f: 0x6c210020, + 0x34070: 0x6c210220, 0x34071: 0x6c210420, 0x34072: 0x6c210620, 0x34073: 0x6c210820, + 0x34074: 0x6c34be20, 0x34075: 0x6c34c020, 0x34076: 0x6c34c220, 0x34077: 0x6c34c420, + 0x34078: 0x6c34c620, 0x34079: 0x6c34c820, 0x3407a: 0x6c34ca20, 0x3407b: 0x6c34cc20, + 0x3407c: 0x6c34ce20, 0x3407d: 0x6c34d020, 0x3407e: 0x6c34d220, 0x3407f: 0x6c34d420, + // Block 0xd02, offset 0x34080 + 0x34080: 0x6c34d620, 0x34081: 0x6c34d820, 0x34082: 0x6c34da20, 0x34083: 0x6c34dc20, + 0x34084: 0x6c34de20, 0x34085: 0x6c34e020, 0x34086: 0x6c34e220, 0x34087: 0x6c34e420, + 0x34088: 0x6c34e620, 0x34089: 0x6c34e820, 0x3408a: 0x6c34ea20, 0x3408b: 0x6c34ec20, + 0x3408c: 0x6c34ee20, 0x3408d: 0x6c34f020, 0x3408e: 0x6c34f220, 0x3408f: 0x6c34f420, + 0x34090: 0x6c34f620, 0x34091: 0x6c34f820, 0x34092: 0x6c34fa20, 0x34093: 0x6c34fc20, + 0x34094: 0x6c34fe20, 0x34095: 0x6c350020, 0x34096: 0x6c350220, 0x34097: 0x6c350420, + 0x34098: 0x6c350620, 0x34099: 0x6c350820, 0x3409a: 0x6c350a20, 0x3409b: 0x6c350c20, + 0x3409c: 0x6c350e20, 0x3409d: 0x6c351020, 0x3409e: 0x6c351220, 0x3409f: 0x6c351420, + 0x340a0: 0x6c351620, 0x340a1: 0x6c351820, 0x340a2: 0x6c351a20, 0x340a3: 0x6c351c20, + 0x340a4: 0x6c4f8020, 0x340a5: 0x6c4f8220, 0x340a6: 0x6c4f8420, 0x340a7: 0x6c4f8620, + 0x340a8: 0x6c4f8820, 0x340a9: 0x6c4f8a20, 0x340aa: 0x6c4f8c20, 0x340ab: 0x6c4f8e20, + 0x340ac: 0x6c4f9020, 0x340ad: 0x6c4f9220, 0x340ae: 0x6c4f9420, 0x340af: 0x6c4f9620, + 0x340b0: 0x6c4f9820, 0x340b1: 0x6c4f9a20, 0x340b2: 0x6c4f9c20, 0x340b3: 0x6c4f9e20, + 0x340b4: 0x6c4fa020, 0x340b5: 0x6c4fa220, 0x340b6: 0x6c4fa420, 0x340b7: 0x6c4fa620, + 0x340b8: 0x6c4fa820, 0x340b9: 0x6c4faa20, 0x340ba: 0x6c4fac20, 0x340bb: 0x6c4fae20, + 0x340bc: 0x6c4fb020, 0x340bd: 0x6c4fb220, 0x340be: 0x6c4fb420, 0x340bf: 0x6c4fb620, + // Block 0xd03, offset 0x340c0 + 0x340c0: 0x6c4fb820, 0x340c1: 0x6c4fba20, 0x340c2: 0x6c4fbc20, 0x340c3: 0x6c4fbe20, + 0x340c4: 0x6c4fc020, 0x340c5: 0x6c4fc220, 0x340c6: 0x6c4fc420, 0x340c7: 0x6c4fc620, + 0x340c8: 0x6c4fc820, 0x340c9: 0x6c4fca20, 0x340ca: 0x6c4fcc20, 0x340cb: 0x6c4fce20, + 0x340cc: 0x6c4fd020, 0x340cd: 0x6c4fd220, 0x340ce: 0x6c4fd420, 0x340cf: 0x6c4fd620, + 0x340d0: 0x6c4fd820, 0x340d1: 0x6c4fda20, 0x340d2: 0x6c4fdc20, 0x340d3: 0x6c4fde20, + 0x340d4: 0x6c4fe020, 0x340d5: 0x6c4fe220, 0x340d6: 0x6c4fe420, 0x340d7: 0x6c4fe620, + 0x340d8: 0x6c4fe820, 0x340d9: 0x6c4fea20, 0x340da: 0x6c4fec20, 0x340db: 0x6c4fee20, + 0x340dc: 0x6c4ff020, 0x340dd: 0x6c4ff220, 0x340de: 0x6c4ff420, 0x340df: 0x6c4ff620, + 0x340e0: 0x6c4ff820, 0x340e1: 0x6c4ffa20, 0x340e2: 0x6c4ffc20, 0x340e3: 0x6c4ffe20, + 0x340e4: 0x6c500020, 0x340e5: 0x6c500220, 0x340e6: 0x6c500420, 0x340e7: 0x6c500620, + 0x340e8: 0x6c500820, 0x340e9: 0x6c500a20, 0x340ea: 0x6c500c20, 0x340eb: 0x6c500e20, + 0x340ec: 0x6c501020, 0x340ed: 0x6c501220, 0x340ee: 0x6c501420, 0x340ef: 0x6c716220, + 0x340f0: 0x6c716420, 0x340f1: 0x6c716620, 0x340f2: 0x6c716820, 0x340f3: 0x6c716a20, + 0x340f4: 0x6c716c20, 0x340f5: 0x6c716e20, 0x340f6: 0x6c717020, 0x340f7: 0x6c717220, + 0x340f8: 0x6c717420, 0x340f9: 0x6c717620, 0x340fa: 0x6c717820, 0x340fb: 0x6c717a20, + 0x340fc: 0x6c717c20, 0x340fd: 0x6c717e20, 0x340fe: 0x6c718020, 0x340ff: 0x6c718220, + // Block 0xd04, offset 0x34100 + 0x34100: 0x6c718420, 0x34101: 0x6c718620, 0x34102: 0x6c718820, 0x34103: 0x6c718a20, + 0x34104: 0x6c718c20, 0x34105: 0x6c718e20, 0x34106: 0x6c719020, 0x34107: 0x6c719220, + 0x34108: 0x6c719420, 0x34109: 0x6c719620, 0x3410a: 0x6c719820, 0x3410b: 0x6c719a20, + 0x3410c: 0x6c719c20, 0x3410d: 0x6c719e20, 0x3410e: 0x6c71a020, 0x3410f: 0x6c71a220, + 0x34110: 0x6c71a420, 0x34111: 0x6c71a620, 0x34112: 0x6c71a820, 0x34113: 0x6c71aa20, + 0x34114: 0x6c71ac20, 0x34115: 0x6c71ae20, 0x34116: 0x6c71b020, 0x34117: 0x6c71b220, + 0x34118: 0x6c71b420, 0x34119: 0x6c71b620, 0x3411a: 0x6c71b820, 0x3411b: 0x6c71ba20, + 0x3411c: 0x6c71bc20, 0x3411d: 0x6c71be20, 0x3411e: 0x6c71c020, 0x3411f: 0x6c71c220, + 0x34120: 0x6c71c420, 0x34121: 0x6c71c620, 0x34122: 0x6c71c820, 0x34123: 0x6c71ca20, + 0x34124: 0x6c71cc20, 0x34125: 0x6c71ce20, 0x34126: 0x6c71d020, 0x34127: 0x6c71d220, + 0x34128: 0x6c71d420, 0x34129: 0x6c71d620, 0x3412a: 0x6c71d820, 0x3412b: 0x6c71da20, + 0x3412c: 0x6c71dc20, 0x3412d: 0x6c71de20, 0x3412e: 0x6c71e020, 0x3412f: 0x6c71e220, + 0x34130: 0x6c71e420, 0x34131: 0x6c71e620, 0x34132: 0x6c71e820, 0x34133: 0x6c71ea20, + 0x34134: 0x6c71ec20, 0x34135: 0x6c71ee20, 0x34136: 0x6c71f020, 0x34137: 0x6c71f220, + 0x34138: 0x6c71f420, 0x34139: 0x6c71f620, 0x3413a: 0x6c71f820, 0x3413b: 0x6c71fa20, + 0x3413c: 0x6c71fc20, 0x3413d: 0x6c71fe20, 0x3413e: 0x6c720020, 0x3413f: 0x6c720220, + // Block 0xd05, offset 0x34140 + 0x34140: 0x6c720420, 0x34141: 0x6c99ac20, 0x34142: 0x6c99ae20, 0x34143: 0x6c99b020, + 0x34144: 0x6c99b220, 0x34145: 0x6c99b420, 0x34146: 0x6c99b620, 0x34147: 0x6c99b820, + 0x34148: 0x6c99ba20, 0x34149: 0x6c99bc20, 0x3414a: 0x6c99be20, 0x3414b: 0x6c99c020, + 0x3414c: 0x6c99c220, 0x3414d: 0x6c99c420, 0x3414e: 0x6c99c620, 0x3414f: 0x6c99c820, + 0x34150: 0x6c99ca20, 0x34151: 0x6c99cc20, 0x34152: 0x6c99ce20, 0x34153: 0x6c99d020, + 0x34154: 0x6c99d220, 0x34155: 0x6c99d420, 0x34156: 0x6c99d620, 0x34157: 0x6c99d820, + 0x34158: 0x6c99da20, 0x34159: 0x6c99dc20, 0x3415a: 0x6c99de20, 0x3415b: 0x6c99e020, + 0x3415c: 0x6c99e220, 0x3415d: 0x6c99e420, 0x3415e: 0x6c99e620, 0x3415f: 0x6c99e820, + 0x34160: 0x6c99ea20, 0x34161: 0x6c99ec20, 0x34162: 0x6c99ee20, 0x34163: 0x6c99f020, + 0x34164: 0x6c99f220, 0x34165: 0x6c99f420, 0x34166: 0x6c99f620, 0x34167: 0x6c99f820, + 0x34168: 0x6c99fa20, 0x34169: 0x6c99fc20, 0x3416a: 0x6c99fe20, 0x3416b: 0x6c9a0020, + 0x3416c: 0x6c9a0220, 0x3416d: 0x6c9a0420, 0x3416e: 0x6c9a0620, 0x3416f: 0x6c9a0820, + 0x34170: 0x6c9a0a20, 0x34171: 0x6c9a0c20, 0x34172: 0x6c9a0e20, 0x34173: 0x6c9a1020, + 0x34174: 0x6c9a1220, 0x34175: 0x6c9a1420, 0x34176: 0x6c9a1620, 0x34177: 0x6c9a1820, + 0x34178: 0x6c9a1a20, 0x34179: 0x6c9a1c20, 0x3417a: 0x6c9a1e20, 0x3417b: 0x6c9a2020, + 0x3417c: 0x6c9a2220, 0x3417d: 0x6c9a2420, 0x3417e: 0x6c9a2620, 0x3417f: 0x6c9a2820, + // Block 0xd06, offset 0x34180 + 0x34180: 0x6c9a2a20, 0x34181: 0x6c9a2c20, 0x34182: 0x6c9a2e20, 0x34183: 0x6c9a3020, + 0x34184: 0x6c9a3220, 0x34185: 0x6c9a3420, 0x34186: 0x6c9a3620, 0x34187: 0x6c9a3820, + 0x34188: 0x6c9a3a20, 0x34189: 0x6c9a3c20, 0x3418a: 0x6c9a3e20, 0x3418b: 0x6c9a4020, + 0x3418c: 0x6c9a4220, 0x3418d: 0x6c9a4420, 0x3418e: 0x6c9a4620, 0x3418f: 0x6c9a4820, + 0x34190: 0x6c9a4a20, 0x34191: 0x6c9a4c20, 0x34192: 0x6c9a4e20, 0x34193: 0x6c9a5020, + 0x34194: 0x6c9a5220, 0x34195: 0x6c9a5420, 0x34196: 0x6c9a5620, 0x34197: 0x6c9a5820, + 0x34198: 0x6c9a5a20, 0x34199: 0x6c9a5c20, 0x3419a: 0x6c9a5e20, 0x3419b: 0x6c9a6020, + 0x3419c: 0x6c9a6220, 0x3419d: 0x6c9a6420, 0x3419e: 0x6c9a6620, 0x3419f: 0x6c9a6820, + 0x341a0: 0x6c9a6a20, 0x341a1: 0x6c9a6c20, 0x341a2: 0x6c9a6e20, 0x341a3: 0x6c9a7020, + 0x341a4: 0x6c9a7220, 0x341a5: 0x6c9a7420, 0x341a6: 0x6c9a7620, 0x341a7: 0x6c9a7820, + 0x341a8: 0x6c9a7a20, 0x341a9: 0x6cc56a20, 0x341aa: 0x6cc56c20, 0x341ab: 0x6cc56e20, + 0x341ac: 0x6cc57020, 0x341ad: 0x6cc57220, 0x341ae: 0x6cc57420, 0x341af: 0x6cc57620, + 0x341b0: 0x6cc57820, 0x341b1: 0x6cc57a20, 0x341b2: 0x6cc57c20, 0x341b3: 0x6cc57e20, + 0x341b4: 0x6cc58020, 0x341b5: 0x6cc58220, 0x341b6: 0x6cc58420, 0x341b7: 0x6cc58620, + 0x341b8: 0x6cc58820, 0x341b9: 0x6cc58a20, 0x341ba: 0x6cc58c20, 0x341bb: 0x6cc58e20, + 0x341bc: 0x6cc59020, 0x341bd: 0x6cc59220, 0x341be: 0x6cc59420, 0x341bf: 0x6cc59620, + // Block 0xd07, offset 0x341c0 + 0x341c0: 0x6cc59820, 0x341c1: 0x6cc59a20, 0x341c2: 0x6cc59c20, 0x341c3: 0x6cc59e20, + 0x341c4: 0x6cc5a020, 0x341c5: 0x6cc5a220, 0x341c6: 0x6cc5a420, 0x341c7: 0x6cc5a620, + 0x341c8: 0x6cc5a820, 0x341c9: 0x6cc5aa20, 0x341ca: 0x6cc5ac20, 0x341cb: 0x6cc5ae20, + 0x341cc: 0x6cc5b020, 0x341cd: 0x6cc5b220, 0x341ce: 0x6cc5b420, 0x341cf: 0x6cc5b620, + 0x341d0: 0x6cc5b820, 0x341d1: 0x6cc5ba20, 0x341d2: 0x6cc5bc20, 0x341d3: 0x6cc5be20, + 0x341d4: 0x6cc5c020, 0x341d5: 0x6cc5c220, 0x341d6: 0x6cc5c420, 0x341d7: 0x6cc5c620, + 0x341d8: 0x6cc5c820, 0x341d9: 0x6cc5ca20, 0x341da: 0x6cc5cc20, 0x341db: 0x6cc5ce20, + 0x341dc: 0x6cc5d020, 0x341dd: 0x6cc5d220, 0x341de: 0x6cc5d420, 0x341df: 0x6cc5d620, + 0x341e0: 0x6cc5d820, 0x341e1: 0x6cc5da20, 0x341e2: 0x6cc5dc20, 0x341e3: 0x6cc5de20, + 0x341e4: 0x6cc5e020, 0x341e5: 0x6cc5e220, 0x341e6: 0x6cc5e420, 0x341e7: 0x6cc5e620, + 0x341e8: 0x6cc5e820, 0x341e9: 0x6cc5ea20, 0x341ea: 0x6cc5ec20, 0x341eb: 0x6cc5ee20, + 0x341ec: 0x6cc5f020, 0x341ed: 0x6cc5f220, 0x341ee: 0x6cc5f420, 0x341ef: 0x6cc5f620, + 0x341f0: 0x6cc5f820, 0x341f1: 0x6cc5fa20, 0x341f2: 0x6cc5fc20, 0x341f3: 0x6cc5fe20, + 0x341f4: 0x6cc60020, 0x341f5: 0x6cc60220, 0x341f6: 0x6cc60420, 0x341f7: 0x6cc60620, + 0x341f8: 0x6cc60820, 0x341f9: 0x6cc60a20, 0x341fa: 0x6cc60c20, 0x341fb: 0x6cc60e20, + 0x341fc: 0x6cc61020, 0x341fd: 0x6cc61220, 0x341fe: 0x6cc61420, 0x341ff: 0x6d017820, + // Block 0xd08, offset 0x34200 + 0x34200: 0x6cc61620, 0x34201: 0x6cc61820, 0x34202: 0x6cc61a20, 0x34203: 0x6cc61c20, + 0x34204: 0x6cc61e20, 0x34205: 0x6cc62020, 0x34206: 0x6cc62220, 0x34207: 0x6cc62420, + 0x34208: 0x6cc62620, 0x34209: 0x6cc62820, 0x3420a: 0x6cc62a20, 0x3420b: 0x6cc62c20, + 0x3420c: 0x6cc62e20, 0x3420d: 0x6cc63020, 0x3420e: 0x6cc63220, 0x3420f: 0x6cc63420, + 0x34210: 0x6cc63620, 0x34211: 0x6cc63820, 0x34212: 0x6cc63a20, 0x34213: 0x6cc63c20, + 0x34214: 0x6cc63e20, 0x34215: 0x6cc64020, 0x34216: 0x6cc64220, 0x34217: 0x6cc64420, + 0x34218: 0x6cc64620, 0x34219: 0x6cc64820, 0x3421a: 0x6cc64a20, 0x3421b: 0x6cc64c20, + 0x3421c: 0x6cc64e20, 0x3421d: 0x6cc65020, 0x3421e: 0x6cc65220, 0x3421f: 0x6cf45a20, + 0x34220: 0x6cf45c20, 0x34221: 0x6cf45e20, 0x34222: 0x6cf46020, 0x34223: 0x6cf46220, + 0x34224: 0x6cf46420, 0x34225: 0x6cf46620, 0x34226: 0x6cf46820, 0x34227: 0x6cf46a20, + 0x34228: 0x6cf46c20, 0x34229: 0x6cf46e20, 0x3422a: 0x6cf47020, 0x3422b: 0x6cf47220, + 0x3422c: 0x6cf47420, 0x3422d: 0x6cf47620, 0x3422e: 0x6cf47820, 0x3422f: 0x6cf47a20, + 0x34230: 0x6cf47c20, 0x34231: 0x6cf47e20, 0x34232: 0x6cf48020, 0x34233: 0x6cf48220, + 0x34234: 0x6cf48420, 0x34235: 0x6cf48620, 0x34236: 0x6cf48820, 0x34237: 0x6cf48a20, + 0x34238: 0x6cf48c20, 0x34239: 0x6cf48e20, 0x3423a: 0x6cf49020, 0x3423b: 0x6cf49220, + 0x3423c: 0x6cf49420, 0x3423d: 0x6cf49620, 0x3423e: 0x6cf49820, 0x3423f: 0x6cf49a20, + // Block 0xd09, offset 0x34240 + 0x34240: 0x6cf49c20, 0x34241: 0x6cf49e20, 0x34242: 0x6cf4a020, 0x34243: 0x6cf4a220, + 0x34244: 0x6cf4a420, 0x34245: 0x6cf4a620, 0x34246: 0x6cf4a820, 0x34247: 0x6cf4aa20, + 0x34248: 0x6cf4ac20, 0x34249: 0x6cf4ae20, 0x3424a: 0x6cf4b020, 0x3424b: 0x6cf4b220, + 0x3424c: 0x6cf4b420, 0x3424d: 0x6cf4b620, 0x3424e: 0x6cf4b820, 0x3424f: 0x6cf4ba20, + 0x34250: 0x6cf4bc20, 0x34251: 0x6cf4be20, 0x34252: 0x6cf4c020, 0x34253: 0x6cf4c220, + 0x34254: 0x6cf4c420, 0x34255: 0x6cf4c620, 0x34256: 0x6cf4c820, 0x34257: 0x6cf4ca20, + 0x34258: 0x6cf4cc20, 0x34259: 0x6cf4ce20, 0x3425a: 0x6cf4d020, 0x3425b: 0x6cf4d220, + 0x3425c: 0x6cf4d420, 0x3425d: 0x6cf4d620, 0x3425e: 0x6cf4d820, 0x3425f: 0x6cf4da20, + 0x34260: 0x6cf4dc20, 0x34261: 0x6cf4de20, 0x34262: 0x6cf4e020, 0x34263: 0x6cf4e220, + 0x34264: 0x6cf4e420, 0x34265: 0x6cf4e620, 0x34266: 0x6cf4e820, 0x34267: 0x6cf4ea20, + 0x34268: 0x6cf4ec20, 0x34269: 0x6cf4ee20, 0x3426a: 0x6cf4f020, 0x3426b: 0x6cf4f220, + 0x3426c: 0x6cf4f420, 0x3426d: 0x6cf4f620, 0x3426e: 0x6cf4f820, 0x3426f: 0x6cf4fa20, + 0x34270: 0x6cf4fc20, 0x34271: 0x6cf4fe20, 0x34272: 0x6cf50020, 0x34273: 0x6d23fa20, + 0x34274: 0x6d23fc20, 0x34275: 0x6d23fe20, 0x34276: 0x6d240020, 0x34277: 0x6d240220, + 0x34278: 0x6d240420, 0x34279: 0x6d240620, 0x3427a: 0x6d240820, 0x3427b: 0x6d240a20, + 0x3427c: 0x6d240c20, 0x3427d: 0x6d240e20, 0x3427e: 0x6d241020, 0x3427f: 0x6d241220, + // Block 0xd0a, offset 0x34280 + 0x34280: 0x6d241420, 0x34281: 0x6d241620, 0x34282: 0x6d241820, 0x34283: 0x6d241a20, + 0x34284: 0x6d241c20, 0x34285: 0x6d241e20, 0x34286: 0x6d242020, 0x34287: 0x6d242220, + 0x34288: 0x6d242420, 0x34289: 0x6d242620, 0x3428a: 0x6d242820, 0x3428b: 0x6d242a20, + 0x3428c: 0x6d242c20, 0x3428d: 0x6d242e20, 0x3428e: 0x6d243020, 0x3428f: 0x6d243220, + 0x34290: 0x6d243420, 0x34291: 0x6d243620, 0x34292: 0x6d243820, 0x34293: 0x6d243a20, + 0x34294: 0x6d243c20, 0x34295: 0x6d243e20, 0x34296: 0x6d244020, 0x34297: 0x6d244220, + 0x34298: 0x6d244420, 0x34299: 0x6d244620, 0x3429a: 0x6d244820, 0x3429b: 0x6d244a20, + 0x3429c: 0x6d244c20, 0x3429d: 0x6d244e20, 0x3429e: 0x6d245020, 0x3429f: 0x6d245220, + 0x342a0: 0x6d245420, 0x342a1: 0x6d245620, 0x342a2: 0x6d245820, 0x342a3: 0x6d245a20, + 0x342a4: 0x6d245c20, 0x342a5: 0x6d245e20, 0x342a6: 0x6d246020, 0x342a7: 0x6d246220, + 0x342a8: 0x6d246420, 0x342a9: 0x6d246620, 0x342aa: 0x6d246820, 0x342ab: 0x6d246a20, + 0x342ac: 0x6d246c20, 0x342ad: 0x6d246e20, 0x342ae: 0x6d247020, 0x342af: 0x6d247220, + 0x342b0: 0x6d247420, 0x342b1: 0x6d247620, 0x342b2: 0x6d247820, 0x342b3: 0x6d247a20, + 0x342b4: 0x6d247c20, 0x342b5: 0x6d247e20, 0x342b6: 0x6d248020, 0x342b7: 0x6d248220, + 0x342b8: 0x6d248420, 0x342b9: 0x6d248620, 0x342ba: 0x6d248820, 0x342bb: 0x6d248a20, + 0x342bc: 0x6d248c20, 0x342bd: 0x6d248e20, 0x342be: 0x6d249020, 0x342bf: 0x6d249220, + // Block 0xd0b, offset 0x342c0 + 0x342c0: 0x6d249420, 0x342c1: 0x6d249620, 0x342c2: 0x6d249820, 0x342c3: 0x6d249a20, + 0x342c4: 0x6d249c20, 0x342c5: 0x6d249e20, 0x342c6: 0x6d24a020, 0x342c7: 0x6d24a220, + 0x342c8: 0x6d24a420, 0x342c9: 0x6d24a620, 0x342ca: 0x6d24a820, 0x342cb: 0x6d24aa20, + 0x342cc: 0x6d24ac20, 0x342cd: 0x6d24ae20, 0x342ce: 0x6d24b020, 0x342cf: 0x6d24b220, + 0x342d0: 0x6d24b420, 0x342d1: 0x6d24b620, 0x342d2: 0x6d24b820, 0x342d3: 0x6d24ba20, + 0x342d4: 0x6d24bc20, 0x342d5: 0x6d24be20, 0x342d6: 0x6d24c020, 0x342d7: 0x6d24c220, + 0x342d8: 0x6d24c420, 0x342d9: 0x6d24c620, 0x342da: 0x6d24c820, 0x342db: 0x6d24ca20, + 0x342dc: 0x6d24cc20, 0x342dd: 0x6d24ce20, 0x342de: 0x6d24d020, 0x342df: 0x6d24d220, + 0x342e0: 0x6d519620, 0x342e1: 0x6d519820, 0x342e2: 0x6d519a20, 0x342e3: 0x6d519c20, + 0x342e4: 0x6d519e20, 0x342e5: 0x6d51a020, 0x342e6: 0x6d51a220, 0x342e7: 0x6d51a420, + 0x342e8: 0x6d51a620, 0x342e9: 0x6d51a820, 0x342ea: 0x6d51aa20, 0x342eb: 0x6d51ac20, + 0x342ec: 0x6d51ae20, 0x342ed: 0x6d51b020, 0x342ee: 0x6d51b220, 0x342ef: 0x6d51b420, + 0x342f0: 0x6d51b620, 0x342f1: 0x6d51b820, 0x342f2: 0x6d51ba20, 0x342f3: 0x6d51bc20, + 0x342f4: 0x6d51be20, 0x342f5: 0x6d51c020, 0x342f6: 0x6d51c220, 0x342f7: 0x6d51c420, + 0x342f8: 0x6d51c620, 0x342f9: 0x6d51c820, 0x342fa: 0x6d51ca20, 0x342fb: 0x6d51cc20, + 0x342fc: 0x6d51ce20, 0x342fd: 0x6d51d020, 0x342fe: 0x6d51d220, 0x342ff: 0x6d51d420, + // Block 0xd0c, offset 0x34300 + 0x34300: 0x6d51d620, 0x34301: 0x6d51d820, 0x34302: 0x6d51da20, 0x34303: 0x6d51dc20, + 0x34304: 0x6d51de20, 0x34305: 0x6d51e020, 0x34306: 0x6d51e220, 0x34307: 0x6d51e420, + 0x34308: 0x6d51e620, 0x34309: 0x6d51e820, 0x3430a: 0x6d51ea20, 0x3430b: 0x6d51ec20, + 0x3430c: 0x6d51ee20, 0x3430d: 0x6d51f020, 0x3430e: 0x6d51f220, 0x3430f: 0x6d51f420, + 0x34310: 0x6d51f620, 0x34311: 0x6d51f820, 0x34312: 0x6d51fa20, 0x34313: 0x6d51fc20, + 0x34314: 0x6d51fe20, 0x34315: 0x6d520020, 0x34316: 0x6d520220, 0x34317: 0x6d520420, + 0x34318: 0x6d520620, 0x34319: 0x6d520820, 0x3431a: 0x6d520a20, 0x3431b: 0x6d520c20, + 0x3431c: 0x6d520e20, 0x3431d: 0x6d521020, 0x3431e: 0x6d521220, 0x3431f: 0x6d521420, + 0x34320: 0x6d521620, 0x34321: 0x6d521820, 0x34322: 0x6d521a20, 0x34323: 0x6d521c20, + 0x34324: 0x6d521e20, 0x34325: 0x6d522020, 0x34326: 0x6d522220, 0x34327: 0x6d522420, + 0x34328: 0x6d522620, 0x34329: 0x6d522820, 0x3432a: 0x6d522a20, 0x3432b: 0x6d522c20, + 0x3432c: 0x6d522e20, 0x3432d: 0x6d523020, 0x3432e: 0x6d523220, 0x3432f: 0x6d523420, + 0x34330: 0x6d523620, 0x34331: 0x6d523820, 0x34332: 0x6d523a20, 0x34333: 0x6d523c20, + 0x34334: 0x6d523e20, 0x34335: 0x6d524020, 0x34336: 0x6d524220, 0x34337: 0x6d524420, + 0x34338: 0x6d524620, 0x34339: 0x6d524820, 0x3433a: 0x6d524a20, 0x3433b: 0x6d524c20, + 0x3433c: 0x6d524e20, 0x3433d: 0x6d525020, 0x3433e: 0x6d525220, 0x3433f: 0x6d7d0220, + // Block 0xd0d, offset 0x34340 + 0x34340: 0x6d7d0420, 0x34341: 0x6d7d0620, 0x34342: 0x6d7d0820, 0x34343: 0x6d7d0a20, + 0x34344: 0x6d7d0c20, 0x34345: 0x6d7d0e20, 0x34346: 0x6d7d1020, 0x34347: 0x6d7d1220, + 0x34348: 0x6d7d1420, 0x34349: 0x6d7d1620, 0x3434a: 0x6d7d1820, 0x3434b: 0x6d7d1a20, + 0x3434c: 0x6d7d1c20, 0x3434d: 0x6d7d1e20, 0x3434e: 0x6d7d2020, 0x3434f: 0x6d7d2220, + 0x34350: 0x6d7d2420, 0x34351: 0x6d7d2620, 0x34352: 0x6d7d2820, 0x34353: 0x6d7d2a20, + 0x34354: 0x6d7d2c20, 0x34355: 0x6d7d2e20, 0x34356: 0x6d7d3020, 0x34357: 0x6d7d3220, + 0x34358: 0x6d7d3420, 0x34359: 0x6d7d3620, 0x3435a: 0x6d7d3820, 0x3435b: 0x6d7d3a20, + 0x3435c: 0x6d7d3c20, 0x3435d: 0x6d7d3e20, 0x3435e: 0x6d7d4020, 0x3435f: 0x6d7d4220, + 0x34360: 0x6d7d4420, 0x34361: 0x6d7d4620, 0x34362: 0x6d7d4820, 0x34363: 0x6d7d4a20, + 0x34364: 0x6d7d4c20, 0x34365: 0x6d7d4e20, 0x34366: 0x6d7d5020, 0x34367: 0x6d7d5220, + 0x34368: 0x6d7d5420, 0x34369: 0x6d7d5620, 0x3436a: 0x6d7d5820, 0x3436b: 0x6d7d5a20, + 0x3436c: 0x6d7d5c20, 0x3436d: 0x6d7d5e20, 0x3436e: 0x6d7d6020, 0x3436f: 0x6d7d6220, + 0x34370: 0x6d7d6420, 0x34371: 0x6d7d6620, 0x34372: 0x6d7d6820, 0x34373: 0x6d7d6a20, + 0x34374: 0x6d7d6c20, 0x34375: 0x6d7d6e20, 0x34376: 0x6d7d7020, 0x34377: 0x6d7d7220, + 0x34378: 0x6d7d7420, 0x34379: 0x6d7d7620, 0x3437a: 0x6d7d7820, 0x3437b: 0x6d7d7a20, + 0x3437c: 0x6d7d7c20, 0x3437d: 0x6d7d7e20, 0x3437e: 0x6d7d8020, 0x3437f: 0x6d7d8220, + // Block 0xd0e, offset 0x34380 + 0x34380: 0x6d7d8420, 0x34381: 0x6d7d8620, 0x34382: 0x6d7d8820, 0x34383: 0x6d7d8a20, + 0x34384: 0x6d7d8c20, 0x34385: 0x6d525420, 0x34386: 0x6d7d8e20, 0x34387: 0x6d7d9020, + 0x34388: 0x6d7d9220, 0x34389: 0x6d7d9420, 0x3438a: 0x6d7d9620, 0x3438b: 0x6da4ae20, + 0x3438c: 0x6da4b020, 0x3438d: 0x6da4b220, 0x3438e: 0x6da4b420, 0x3438f: 0x6da4b620, + 0x34390: 0x6da4b820, 0x34391: 0x6da4ba20, 0x34392: 0x6da4bc20, 0x34393: 0x6da4be20, + 0x34394: 0x6da4c020, 0x34395: 0x6da4c220, 0x34396: 0x6da4c420, 0x34397: 0x6da4c620, + 0x34398: 0x6da4c820, 0x34399: 0x6da4ca20, 0x3439a: 0x6da4cc20, 0x3439b: 0x6da4ce20, + 0x3439c: 0x6da4d020, 0x3439d: 0x6da4d220, 0x3439e: 0x6da4d420, 0x3439f: 0x6da4d620, + 0x343a0: 0x6da4d820, 0x343a1: 0x6da4da20, 0x343a2: 0x6da4dc20, 0x343a3: 0x6da4de20, + 0x343a4: 0x6da4e020, 0x343a5: 0x6da4e220, 0x343a6: 0x6da4e420, 0x343a7: 0x6da4e620, + 0x343a8: 0x6da4e820, 0x343a9: 0x6da4ea20, 0x343aa: 0x6da4ec20, 0x343ab: 0x6da4ee20, + 0x343ac: 0x6da4f020, 0x343ad: 0x6da4f220, 0x343ae: 0x6da4f420, 0x343af: 0x6da4f620, + 0x343b0: 0x6da4f820, 0x343b1: 0x6da4fa20, 0x343b2: 0x6da4fc20, 0x343b3: 0x6da4fe20, + 0x343b4: 0x6da50020, 0x343b5: 0x6da50220, 0x343b6: 0x6dc64e20, 0x343b7: 0x6dc65020, + 0x343b8: 0x6dc65220, 0x343b9: 0x6dc65420, 0x343ba: 0x6dc65620, 0x343bb: 0x6dc65820, + 0x343bc: 0x6dc65a20, 0x343bd: 0x6dc65c20, 0x343be: 0x6dc65e20, 0x343bf: 0x6dc66020, + // Block 0xd0f, offset 0x343c0 + 0x343c0: 0x6dc66220, 0x343c1: 0x6dc66420, 0x343c2: 0x6dc66620, 0x343c3: 0x6dc66820, + 0x343c4: 0x6dc66a20, 0x343c5: 0x6dc66c20, 0x343c6: 0x6dc66e20, 0x343c7: 0x6dc67020, + 0x343c8: 0x6dc67220, 0x343c9: 0x6dc67420, 0x343ca: 0x6dc67620, 0x343cb: 0x6dc67820, + 0x343cc: 0x6dc67a20, 0x343cd: 0x6dc67c20, 0x343ce: 0x6dc67e20, 0x343cf: 0x6dc68020, + 0x343d0: 0x6dc68220, 0x343d1: 0x6dc68420, 0x343d2: 0x6dc68620, 0x343d3: 0x6dc68820, + 0x343d4: 0x6dc68a20, 0x343d5: 0x6dc68c20, 0x343d6: 0x6dc68e20, 0x343d7: 0x6dc69020, + 0x343d8: 0x6dc69220, 0x343d9: 0x6dc69420, 0x343da: 0x6dc69620, 0x343db: 0x6dc69820, + 0x343dc: 0x6dc69a20, 0x343dd: 0x6dc69c20, 0x343de: 0x6dc69e20, 0x343df: 0x6dc6a020, + 0x343e0: 0x6dc6a220, 0x343e1: 0x6dc6a420, 0x343e2: 0x6dc6a620, 0x343e3: 0x6de30420, + 0x343e4: 0x6de30620, 0x343e5: 0x6de30820, 0x343e6: 0x6de30a20, 0x343e7: 0x6de30c20, + 0x343e8: 0x6de30e20, 0x343e9: 0x6de31020, 0x343ea: 0x6de31220, 0x343eb: 0x6de31420, + 0x343ec: 0x6de31620, 0x343ed: 0x6de31820, 0x343ee: 0x6de31a20, 0x343ef: 0x6de31c20, + 0x343f0: 0x6de31e20, 0x343f1: 0x6de32020, 0x343f2: 0x6de32220, 0x343f3: 0x6de32420, + 0x343f4: 0x6de32620, 0x343f5: 0x6de32820, 0x343f6: 0x6de32a20, 0x343f7: 0x6de32c20, + 0x343f8: 0x6de32e20, 0x343f9: 0x6de33020, 0x343fa: 0x6de33220, 0x343fb: 0x6de33420, + 0x343fc: 0x6de33620, 0x343fd: 0x6de33820, 0x343fe: 0x6de33a20, 0x343ff: 0x6de33c20, + // Block 0xd10, offset 0x34400 + 0x34400: 0x6de33e20, 0x34401: 0x6de34020, 0x34402: 0x6de34220, 0x34403: 0x6de34420, + 0x34404: 0x6de34620, 0x34405: 0x6de34820, 0x34406: 0x6de34a20, 0x34407: 0x6de34c20, + 0x34408: 0x6de34e20, 0x34409: 0x6de35020, 0x3440a: 0x6de35220, 0x3440b: 0x6de35420, + 0x3440c: 0x6de35620, 0x3440d: 0x6dfa7220, 0x3440e: 0x6dfa7420, 0x3440f: 0x6dfa7620, + 0x34410: 0x6dfa7820, 0x34411: 0x6dfa7a20, 0x34412: 0x6dfa7c20, 0x34413: 0x6dfa7e20, + 0x34414: 0x6dfa8020, 0x34415: 0x6dfa8220, 0x34416: 0x6dfa8420, 0x34417: 0x6dfa8620, + 0x34418: 0x6dfa8820, 0x34419: 0x6dfa8a20, 0x3441a: 0x6dfa8c20, 0x3441b: 0x6dfa8e20, + 0x3441c: 0x6dfa9020, 0x3441d: 0x6dfa9220, 0x3441e: 0x6dfa9420, 0x3441f: 0x6dfa9620, + 0x34420: 0x6dfa9820, 0x34421: 0x6dfa9a20, 0x34422: 0x6e0dfe20, 0x34423: 0x6dfa9c20, + 0x34424: 0x6dfa9e20, 0x34425: 0x6dfaa020, 0x34426: 0x6dfaa220, 0x34427: 0x6dfaa420, + 0x34428: 0x6dfaa620, 0x34429: 0x6dfaa820, 0x3442a: 0x6dfaaa20, 0x3442b: 0x6dfaac20, + 0x3442c: 0x6e0e0020, 0x3442d: 0x6e0e0220, 0x3442e: 0x6e0e0420, 0x3442f: 0x6e0e0620, + 0x34430: 0x6e0e0820, 0x34431: 0x6e0e0a20, 0x34432: 0x6e0e0c20, 0x34433: 0x6e0e0e20, + 0x34434: 0x6e0e1020, 0x34435: 0x6e0e1220, 0x34436: 0x6e0e1420, 0x34437: 0x6e0e1620, + 0x34438: 0x6e0e1820, 0x34439: 0x6e0e1a20, 0x3443a: 0x6e0e1c20, 0x3443b: 0x6e0e1e20, + 0x3443c: 0x6e0e2020, 0x3443d: 0x6e0e2220, 0x3443e: 0x6e0e2420, 0x3443f: 0x6e0e2620, + // Block 0xd11, offset 0x34440 + 0x34440: 0x6e0e2820, 0x34441: 0x6e0e2a20, 0x34442: 0x6e1d6620, 0x34443: 0x6e1d6820, + 0x34444: 0x6e1d6a20, 0x34445: 0x6e1d6c20, 0x34446: 0x6e1d6e20, 0x34447: 0x6e1d7020, + 0x34448: 0x6e1d7220, 0x34449: 0x6e1d7420, 0x3444a: 0x6e1d7620, 0x3444b: 0x6e1d7820, + 0x3444c: 0x6e1d7a20, 0x3444d: 0x6e1d7c20, 0x3444e: 0x6e1d7e20, 0x3444f: 0x6e1d8020, + 0x34450: 0x6e1d8220, 0x34451: 0x6e1d8420, 0x34452: 0x6e1d8620, 0x34453: 0x6e1d8820, + 0x34454: 0x6e1d8a20, 0x34455: 0x6e1d8c20, 0x34456: 0x6e290820, 0x34457: 0x6e290a20, + 0x34458: 0x6e290c20, 0x34459: 0x6e290e20, 0x3445a: 0x6e291020, 0x3445b: 0x6e291220, + 0x3445c: 0x6e291420, 0x3445d: 0x6e291620, 0x3445e: 0x6e322a20, 0x3445f: 0x6e322c20, + 0x34460: 0x6e322e20, 0x34461: 0x6e323020, 0x34462: 0x6e323220, 0x34463: 0x6e323420, + 0x34464: 0x6e323620, 0x34465: 0x6e323820, 0x34466: 0x6e323a20, 0x34467: 0x6e323c20, + 0x34468: 0x6e323e20, 0x34469: 0x6e324020, 0x3446a: 0x6e324220, 0x3446b: 0x6e324420, + 0x3446c: 0x6e389620, 0x3446d: 0x6e389820, 0x3446e: 0x6e389a20, 0x3446f: 0x6e389c20, + 0x34470: 0x6e404420, 0x34471: 0x6e404620, 0x34472: 0x6e404820, 0x34473: 0x6e429e20, + 0x34474: 0x6e462a20, 0x34475: 0x6c123820, 0x34476: 0x6c211a20, 0x34477: 0x6c353020, + 0x34478: 0x6c353220, 0x34479: 0x6c353420, 0x3447a: 0x6c353620, 0x3447b: 0x6c353820, + 0x3447c: 0x6c353a20, 0x3447d: 0x6c353c20, 0x3447e: 0x6c502c20, 0x3447f: 0x6c502e20, + // Block 0xd12, offset 0x34480 + 0x34480: 0x6c503020, 0x34481: 0x6c722620, 0x34482: 0x6c722820, 0x34483: 0x6c722a20, + 0x34484: 0x6c722c20, 0x34485: 0x6c722e20, 0x34486: 0x6c723020, 0x34487: 0x6c723220, + 0x34488: 0x6c6aa620, 0x34489: 0x6c723420, 0x3448a: 0x6c9a9620, 0x3448b: 0x6c9a9820, + 0x3448c: 0x6c9a9a20, 0x3448d: 0x6c9a9c20, 0x3448e: 0x6cc67420, 0x3448f: 0x6cc67620, + 0x34490: 0x6cc67820, 0x34491: 0x6cc67a20, 0x34492: 0x6cc67c20, 0x34493: 0x6cc67e20, + 0x34494: 0x6cc68020, 0x34495: 0x6cf52020, 0x34496: 0x6cf52220, 0x34497: 0x6cf52420, + 0x34498: 0x6cf52620, 0x34499: 0x6cf52820, 0x3449a: 0x6d24ea20, 0x3449b: 0x6d24ec20, + 0x3449c: 0x6d24ee20, 0x3449d: 0x6d526a20, 0x3449e: 0x6d526c20, 0x3449f: 0x6d526e20, + 0x344a0: 0x6d7da220, 0x344a1: 0x6d7da420, 0x344a2: 0x6d7da620, 0x344a3: 0x6d7da820, + 0x344a4: 0x6d7daa20, 0x344a5: 0x6da50a20, 0x344a6: 0x6da50c20, 0x344a7: 0x6da50e20, + 0x344a8: 0x6da51020, 0x344a9: 0x6da51220, 0x344aa: 0x6dfab020, 0x344ab: 0x6c212a20, + 0x344ac: 0x6c212c20, 0x344ad: 0x6c212e20, 0x344ae: 0x6c213020, 0x344af: 0x6c213220, + 0x344b0: 0x6c213420, 0x344b1: 0x6c213620, 0x344b2: 0x6c213820, 0x344b3: 0x6c354820, + 0x344b4: 0x6c354a20, 0x344b5: 0x6c354c20, 0x344b6: 0x6c354e20, 0x344b7: 0x6c355020, + 0x344b8: 0x6c355220, 0x344b9: 0x6c355420, 0x344ba: 0x6c355620, 0x344bb: 0x6c355820, + 0x344bc: 0x6c355a20, 0x344bd: 0x6c355c20, 0x344be: 0x6c355e20, 0x344bf: 0x6c356020, + // Block 0xd13, offset 0x344c0 + 0x344c0: 0x6c356220, 0x344c1: 0x6c356420, 0x344c2: 0x6c356620, 0x344c3: 0x6c356820, + 0x344c4: 0x6c356a20, 0x344c5: 0x6c356c20, 0x344c6: 0x6c356e20, 0x344c7: 0x6c357020, + 0x344c8: 0x6c357220, 0x344c9: 0x6c504820, 0x344ca: 0x6c504a20, 0x344cb: 0x6c504c20, + 0x344cc: 0x6c504e20, 0x344cd: 0x6c505020, 0x344ce: 0x6c505220, 0x344cf: 0x6c505420, + 0x344d0: 0x6c505620, 0x344d1: 0x6c505820, 0x344d2: 0x6c505a20, 0x344d3: 0x6c505c20, + 0x344d4: 0x6c505e20, 0x344d5: 0x6c506020, 0x344d6: 0x6c506220, 0x344d7: 0x6c506420, + 0x344d8: 0x6c506620, 0x344d9: 0x6c506820, 0x344da: 0x6c506a20, 0x344db: 0x6c724a20, + 0x344dc: 0x6c724c20, 0x344dd: 0x6c724e20, 0x344de: 0x6c725020, 0x344df: 0x6c725220, + 0x344e0: 0x6c725420, 0x344e1: 0x6c725620, 0x344e2: 0x6c725820, 0x344e3: 0x6c725a20, + 0x344e4: 0x6c725c20, 0x344e5: 0x6c725e20, 0x344e6: 0x6c726020, 0x344e7: 0x6c726220, + 0x344e8: 0x6c726420, 0x344e9: 0x6c726620, 0x344ea: 0x6c726820, 0x344eb: 0x6c726a20, + 0x344ec: 0x6c726c20, 0x344ed: 0x6c726e20, 0x344ee: 0x6c727020, 0x344ef: 0x6c727220, + 0x344f0: 0x6c727420, 0x344f1: 0x6c727620, 0x344f2: 0x6c727820, 0x344f3: 0x6c727a20, + 0x344f4: 0x6c727c20, 0x344f5: 0x6c727e20, 0x344f6: 0x6c728020, 0x344f7: 0x6c728220, + 0x344f8: 0x6c728420, 0x344f9: 0x6c9aca20, 0x344fa: 0x6c9acc20, 0x344fb: 0x6c9ace20, + 0x344fc: 0x6c9ad020, 0x344fd: 0x6c9ad220, 0x344fe: 0x6c9ad420, 0x344ff: 0x6c9ad620, + // Block 0xd14, offset 0x34500 + 0x34500: 0x6c9ad820, 0x34501: 0x6c9ada20, 0x34502: 0x6c9adc20, 0x34503: 0x6c9ade20, + 0x34504: 0x6c9ae020, 0x34505: 0x6c9ae220, 0x34506: 0x6c9ae420, 0x34507: 0x6c9ae620, + 0x34508: 0x6c9ae820, 0x34509: 0x6c9aea20, 0x3450a: 0x6c9aec20, 0x3450b: 0x6c9aee20, + 0x3450c: 0x6c9af020, 0x3450d: 0x6c9af220, 0x3450e: 0x6c9af420, 0x3450f: 0x6c9af620, + 0x34510: 0x6c9af820, 0x34511: 0x6c9afa20, 0x34512: 0x6c9afc20, 0x34513: 0x6c9afe20, + 0x34514: 0x6c9b0020, 0x34515: 0x6c9b0220, 0x34516: 0x6c9b0420, 0x34517: 0x6c9b0620, + 0x34518: 0x6c9b0820, 0x34519: 0x6c9b0a20, 0x3451a: 0x6cc6b620, 0x3451b: 0x6cc6b820, + 0x3451c: 0x6c9b0c20, 0x3451d: 0x6cc6ba20, 0x3451e: 0x6cc6bc20, 0x3451f: 0x6cc6be20, + 0x34520: 0x6cc6c020, 0x34521: 0x6cc6c220, 0x34522: 0x6cc6c420, 0x34523: 0x6cc6c620, + 0x34524: 0x6cc6c820, 0x34525: 0x6cc6ca20, 0x34526: 0x6cc6cc20, 0x34527: 0x6cc6ce20, + 0x34528: 0x6cc6d020, 0x34529: 0x6cc6d220, 0x3452a: 0x6cc6d420, 0x3452b: 0x6cc6d620, + 0x3452c: 0x6cc6d820, 0x3452d: 0x6cc6da20, 0x3452e: 0x6cc6dc20, 0x3452f: 0x6cc6de20, + 0x34530: 0x6cc6e020, 0x34531: 0x6cc6e220, 0x34532: 0x6cc6e420, 0x34533: 0x6cc6e620, + 0x34534: 0x6cc6e820, 0x34535: 0x6cc6ea20, 0x34536: 0x6cc6ec20, 0x34537: 0x6c9b0e20, + 0x34538: 0x6cc6ee20, 0x34539: 0x6cc6f020, 0x3453a: 0x6cc6f220, 0x3453b: 0x6cc6f420, + 0x3453c: 0x6cc6f620, 0x3453d: 0x6cc6f820, 0x3453e: 0x6cc6fa20, 0x3453f: 0x6cf54020, + // Block 0xd15, offset 0x34540 + 0x34540: 0x6cf54220, 0x34541: 0x6cf54420, 0x34542: 0x6cf54620, 0x34543: 0x6cf54820, + 0x34544: 0x6cf54a20, 0x34545: 0x6cf54c20, 0x34546: 0x6cf54e20, 0x34547: 0x6cf55020, + 0x34548: 0x6cf55220, 0x34549: 0x6cf55420, 0x3454a: 0x6cf55620, 0x3454b: 0x6cf55820, + 0x3454c: 0x6cf55a20, 0x3454d: 0x6cf55c20, 0x3454e: 0x6cf55e20, 0x3454f: 0x6cf56020, + 0x34550: 0x6cf56220, 0x34551: 0x6cf56420, 0x34552: 0x6cf56620, 0x34553: 0x6cf56820, + 0x34554: 0x6cf56a20, 0x34555: 0x6cf56c20, 0x34556: 0x6cf56e20, 0x34557: 0x6cf57020, + 0x34558: 0x6cf57220, 0x34559: 0x6cf57420, 0x3455a: 0x6cf57620, 0x3455b: 0x6cf57820, + 0x3455c: 0x6cf57a20, 0x3455d: 0x6cf57c20, 0x3455e: 0x6cf57e20, 0x3455f: 0x6cf58020, + 0x34560: 0x6cf58220, 0x34561: 0x6cf58420, 0x34562: 0x6cf58620, 0x34563: 0x6cc6fc20, + 0x34564: 0x6cf58820, 0x34565: 0x6d017a20, 0x34566: 0x6d24fe20, 0x34567: 0x6d250020, + 0x34568: 0x6d250220, 0x34569: 0x6d250420, 0x3456a: 0x6d250620, 0x3456b: 0x6d250820, + 0x3456c: 0x6d250a20, 0x3456d: 0x6d250c20, 0x3456e: 0x6d250e20, 0x3456f: 0x6d251020, + 0x34570: 0x6d251220, 0x34571: 0x6d251420, 0x34572: 0x6d251620, 0x34573: 0x6d251820, + 0x34574: 0x6d251a20, 0x34575: 0x6d251c20, 0x34576: 0x6d251e20, 0x34577: 0x6d252020, + 0x34578: 0x6d252220, 0x34579: 0x6d252420, 0x3457a: 0x6d252620, 0x3457b: 0x6d252820, + 0x3457c: 0x6d252a20, 0x3457d: 0x6d252c20, 0x3457e: 0x6d252e20, 0x3457f: 0x6d253020, + // Block 0xd16, offset 0x34580 + 0x34580: 0x6d253220, 0x34581: 0x6d253420, 0x34582: 0x6d253620, 0x34583: 0x6d253820, + 0x34584: 0x6d253a20, 0x34585: 0x6d253c20, 0x34586: 0x6d033220, 0x34587: 0x6d528620, + 0x34588: 0x6d528820, 0x34589: 0x6d528a20, 0x3458a: 0x6d528c20, 0x3458b: 0x6d528e20, + 0x3458c: 0x6d529020, 0x3458d: 0x6d529220, 0x3458e: 0x6d529420, 0x3458f: 0x6d529620, + 0x34590: 0x6d529820, 0x34591: 0x6d529a20, 0x34592: 0x6d529c20, 0x34593: 0x6d529e20, + 0x34594: 0x6d52a020, 0x34595: 0x6d52a220, 0x34596: 0x6d52a420, 0x34597: 0x6d52a620, + 0x34598: 0x6d52a820, 0x34599: 0x6d52aa20, 0x3459a: 0x6d52ac20, 0x3459b: 0x6d52ae20, + 0x3459c: 0x6d52b020, 0x3459d: 0x6d52b220, 0x3459e: 0x6d7dbe20, 0x3459f: 0x6d7dc020, + 0x345a0: 0x6d7dc220, 0x345a1: 0x6d7dc420, 0x345a2: 0x6d7dc620, 0x345a3: 0x6d7dc820, + 0x345a4: 0x6d7dca20, 0x345a5: 0x6d7dcc20, 0x345a6: 0x6d7dce20, 0x345a7: 0x6d7dd020, + 0x345a8: 0x6d7dd220, 0x345a9: 0x6d7dd420, 0x345aa: 0x6d7dd620, 0x345ab: 0x6d7dd820, + 0x345ac: 0x6d7dda20, 0x345ad: 0x6d7ddc20, 0x345ae: 0x6d7dde20, 0x345af: 0x6d7de020, + 0x345b0: 0x6d7de220, 0x345b1: 0x6d7de420, 0x345b2: 0x6d7de620, 0x345b3: 0x6d7de820, + 0x345b4: 0x6d7dea20, 0x345b5: 0x6d7dec20, 0x345b6: 0x6d7dee20, 0x345b7: 0x6d7df020, + 0x345b8: 0x6d7df220, 0x345b9: 0x6d7df420, 0x345ba: 0x6d7df620, 0x345bb: 0x6d7df820, + 0x345bc: 0x6d7dfa20, 0x345bd: 0x6d7dfc20, 0x345be: 0x6da51a20, 0x345bf: 0x6da51c20, + // Block 0xd17, offset 0x345c0 + 0x345c0: 0x6da51e20, 0x345c1: 0x6da52020, 0x345c2: 0x6da52220, 0x345c3: 0x6da52420, + 0x345c4: 0x6dc6bc20, 0x345c5: 0x6da52620, 0x345c6: 0x6da52820, 0x345c7: 0x6da52a20, + 0x345c8: 0x6da52c20, 0x345c9: 0x6da52e20, 0x345ca: 0x6da53020, 0x345cb: 0x6da53220, + 0x345cc: 0x6da53420, 0x345cd: 0x6da53620, 0x345ce: 0x6da53820, 0x345cf: 0x6da53a20, + 0x345d0: 0x6dc6be20, 0x345d1: 0x6dc6c020, 0x345d2: 0x6dc6c220, 0x345d3: 0x6dc6c420, + 0x345d4: 0x6dc6c620, 0x345d5: 0x6dc6c820, 0x345d6: 0x6dc6ca20, 0x345d7: 0x6dc6cc20, + 0x345d8: 0x6dc6ce20, 0x345d9: 0x6dc6d020, 0x345da: 0x6dc6d220, 0x345db: 0x6de35c20, + 0x345dc: 0x6de35e20, 0x345dd: 0x6de36020, 0x345de: 0x6de36220, 0x345df: 0x6de36420, + 0x345e0: 0x6de36620, 0x345e1: 0x6de36820, 0x345e2: 0x6de36a20, 0x345e3: 0x6dfab820, + 0x345e4: 0x6dfaba20, 0x345e5: 0x6dfabc20, 0x345e6: 0x6dfabe20, 0x345e7: 0x6dfac020, + 0x345e8: 0x6dfac220, 0x345e9: 0x6dfac420, 0x345ea: 0x6dfac620, 0x345eb: 0x6dfac820, + 0x345ec: 0x6dfaca20, 0x345ed: 0x6dfacc20, 0x345ee: 0x6e0e2e20, 0x345ef: 0x6e0e3020, + 0x345f0: 0x6e0e3220, 0x345f1: 0x6e0e3420, 0x345f2: 0x6e0e3620, 0x345f3: 0x6e1d9020, + 0x345f4: 0x6e1d9220, 0x345f5: 0x6e291a20, 0x345f6: 0x6e291c20, 0x345f7: 0x6e291e20, + 0x345f8: 0x6e292020, 0x345f9: 0x6e292220, 0x345fa: 0x6e292420, 0x345fb: 0x6e389e20, + 0x345fc: 0x6e38a020, 0x345fd: 0x6e404a20, 0x345fe: 0x6e404c20, 0x345ff: 0x6e42a020, + // Block 0xd18, offset 0x34600 + 0x34600: 0x6e442e20, 0x34601: 0x6c123e20, 0x34602: 0x6c213e20, 0x34603: 0x6c357820, + 0x34604: 0x6c357a20, 0x34605: 0x6c357c20, 0x34606: 0x6c507020, 0x34607: 0x6c507220, + 0x34608: 0x6c507420, 0x34609: 0x6c507620, 0x3460a: 0x6c729220, 0x3460b: 0x6c728620, + 0x3460c: 0x6c729420, 0x3460d: 0x6c729620, 0x3460e: 0x6c9b1c20, 0x3460f: 0x6c9b1e20, + 0x34610: 0x6c9b2020, 0x34611: 0x6c9b2220, 0x34612: 0x6c9b2420, 0x34613: 0x6c9b2620, + 0x34614: 0x6cc70820, 0x34615: 0x6cc70a20, 0x34616: 0x6cc70c20, 0x34617: 0x6cf59020, + 0x34618: 0x6cf59220, 0x34619: 0x6cf59420, 0x3461a: 0x6d52b420, 0x3461b: 0x6d52be20, + 0x3461c: 0x6d52c020, 0x3461d: 0x6d52c220, 0x3461e: 0x6d52c420, 0x3461f: 0x6d52c620, + 0x34620: 0x6d52c820, 0x34621: 0x6d52ca20, 0x34622: 0x6d7e0620, 0x34623: 0x6d7e0820, + 0x34624: 0x6da54020, 0x34625: 0x6dc6d820, 0x34626: 0x6dc6da20, 0x34627: 0x6de36e20, + 0x34628: 0x6dfad020, 0x34629: 0x6e0e3e20, 0x3462a: 0x6e0e4020, 0x3462b: 0x6e292820, + 0x3462c: 0x6c048820, 0x3462d: 0x6c214420, 0x3462e: 0x6c358420, 0x3462f: 0x6c358620, + 0x34630: 0x6c358820, 0x34631: 0x6c507c20, 0x34632: 0x6c507e20, 0x34633: 0x6c72a020, + 0x34634: 0x6c72a220, 0x34635: 0x6c72a420, 0x34636: 0x6c72a620, 0x34637: 0x6c9b2e20, + 0x34638: 0x6c9b3020, 0x34639: 0x6c9b3220, 0x3463a: 0x6c9b3420, 0x3463b: 0x6c9b3620, + 0x3463c: 0x6cc71820, 0x3463d: 0x6cc71a20, 0x3463e: 0x6cc71c20, 0x3463f: 0x6cc71e20, + // Block 0xd19, offset 0x34640 + 0x34640: 0x6cc72020, 0x34641: 0x6cf59a20, 0x34642: 0x6d254c20, 0x34643: 0x6cf59c20, + 0x34644: 0x6cf59e20, 0x34645: 0x6cf5a020, 0x34646: 0x6d254e20, 0x34647: 0x6d255020, + 0x34648: 0x6d255220, 0x34649: 0x6d52ce20, 0x3464a: 0x6d52d020, 0x3464b: 0x6d52d220, + 0x3464c: 0x6da54620, 0x3464d: 0x6da54820, 0x3464e: 0x6dc6de20, 0x3464f: 0x6de37020, + 0x34650: 0x6dfad220, 0x34651: 0x6c048c20, 0x34652: 0x6c124420, 0x34653: 0x6c214620, + 0x34654: 0x6c359220, 0x34655: 0x6c359420, 0x34656: 0x6c359620, 0x34657: 0x6c359820, + 0x34658: 0x6c359a20, 0x34659: 0x6c508a20, 0x3465a: 0x6c508c20, 0x3465b: 0x6c72ae20, + 0x3465c: 0x6c72b020, 0x3465d: 0x6c72b220, 0x3465e: 0x6c9b3c20, 0x3465f: 0x6c9b3e20, + 0x34660: 0x6c9b4020, 0x34661: 0x6cc72a20, 0x34662: 0x6cc72c20, 0x34663: 0x6cc72e20, + 0x34664: 0x6cc73020, 0x34665: 0x6cc73220, 0x34666: 0x6cc73420, 0x34667: 0x6cc73620, + 0x34668: 0x6cc73820, 0x34669: 0x6cc73a20, 0x3466a: 0x6cc73c20, 0x3466b: 0x6ca6ac20, + 0x3466c: 0x6cc73e20, 0x3466d: 0x6cc74020, 0x3466e: 0x6cf5a420, 0x3466f: 0x6cf5a620, + 0x34670: 0x6cf5a820, 0x34671: 0x6cf5aa20, 0x34672: 0x6cf5ac20, 0x34673: 0x6cf5ae20, + 0x34674: 0x6cf5b020, 0x34675: 0x6cf5b220, 0x34676: 0x6d255a20, 0x34677: 0x6d255c20, + 0x34678: 0x6d255e20, 0x34679: 0x6d256020, 0x3467a: 0x6d256220, 0x3467b: 0x6d52da20, + 0x3467c: 0x6d52dc20, 0x3467d: 0x6d52de20, 0x3467e: 0x6d52e020, 0x3467f: 0x6d52e220, + // Block 0xd1a, offset 0x34680 + 0x34680: 0x6d7e0e20, 0x34681: 0x6d7e1020, 0x34682: 0x6d7e1220, 0x34683: 0x6d7e1420, + 0x34684: 0x6d7e1620, 0x34685: 0x6d7e1820, 0x34686: 0x6d7e1a20, 0x34687: 0x6da55020, + 0x34688: 0x6da55220, 0x34689: 0x6da55420, 0x3468a: 0x6da55620, 0x3468b: 0x6da55820, + 0x3468c: 0x6dc6e220, 0x3468d: 0x6dc6e420, 0x3468e: 0x6dc6e620, 0x3468f: 0x6dc6e820, + 0x34690: 0x6dc6ea20, 0x34691: 0x6de37220, 0x34692: 0x6de37420, 0x34693: 0x6de37620, + 0x34694: 0x6dfad420, 0x34695: 0x6dfad620, 0x34696: 0x6e1d9420, 0x34697: 0x6c124820, + 0x34698: 0x6c214820, 0x34699: 0x6c214a20, 0x3469a: 0x6c35a620, 0x3469b: 0x6c35a820, + 0x3469c: 0x6c35aa20, 0x3469d: 0x6c509820, 0x3469e: 0x6c509a20, 0x3469f: 0x6c509c20, + 0x346a0: 0x6c509e20, 0x346a1: 0x6c50a020, 0x346a2: 0x6c50a220, 0x346a3: 0x6c50a420, + 0x346a4: 0x6c50a620, 0x346a5: 0x6c50a820, 0x346a6: 0x6c72ca20, 0x346a7: 0x6c72cc20, + 0x346a8: 0x6c72ce20, 0x346a9: 0x6c72d020, 0x346aa: 0x6c72d220, 0x346ab: 0x6c72d420, + 0x346ac: 0x6c72d620, 0x346ad: 0x6c72d820, 0x346ae: 0x6c72da20, 0x346af: 0x6c72dc20, + 0x346b0: 0x6c72de20, 0x346b1: 0x6c72e020, 0x346b2: 0x6c72e220, 0x346b3: 0x6c9b5820, + 0x346b4: 0x6c9b5a20, 0x346b5: 0x6c9b5c20, 0x346b6: 0x6c9b5e20, 0x346b7: 0x6c9b6020, + 0x346b8: 0x6c9b6220, 0x346b9: 0x6c9b6420, 0x346ba: 0x6c9b6620, 0x346bb: 0x6c9b6820, + 0x346bc: 0x6cc74a20, 0x346bd: 0x6cc74c20, 0x346be: 0x6cc74e20, 0x346bf: 0x6cc75020, + // Block 0xd1b, offset 0x346c0 + 0x346c0: 0x6cc75220, 0x346c1: 0x6cc75420, 0x346c2: 0x6cc75620, 0x346c3: 0x6cc75820, + 0x346c4: 0x6cc75a20, 0x346c5: 0x6cc75c20, 0x346c6: 0x6cc75e20, 0x346c7: 0x6cc76020, + 0x346c8: 0x6cf5be20, 0x346c9: 0x6cf5c020, 0x346ca: 0x6cf5c220, 0x346cb: 0x6cf5c420, + 0x346cc: 0x6cf5c620, 0x346cd: 0x6cf5c820, 0x346ce: 0x6d256820, 0x346cf: 0x6d256a20, + 0x346d0: 0x6d256c20, 0x346d1: 0x6d256e20, 0x346d2: 0x6d257020, 0x346d3: 0x6d257220, + 0x346d4: 0x6d52e820, 0x346d5: 0x6d52ea20, 0x346d6: 0x6d52ec20, 0x346d7: 0x6d7e2020, + 0x346d8: 0x6d7e2220, 0x346d9: 0x6d7e2420, 0x346da: 0x6d7e2620, 0x346db: 0x6d7e2820, + 0x346dc: 0x6d7e2a20, 0x346dd: 0x6da55c20, 0x346de: 0x6dc6ee20, 0x346df: 0x6dc6f020, + 0x346e0: 0x6dc6f220, 0x346e1: 0x6dc6f420, 0x346e2: 0x6dc6f620, 0x346e3: 0x6dc6f820, + 0x346e4: 0x6de37e20, 0x346e5: 0x6dfada20, 0x346e6: 0x6e0e4420, 0x346e7: 0x6e1d9620, + 0x346e8: 0x6e1d9820, 0x346e9: 0x6e292c20, 0x346ea: 0x6e324820, 0x346eb: 0x6e38a420, + 0x346ec: 0x6e3d2e20, 0x346ed: 0x6c124a20, 0x346ee: 0x6c214c20, 0x346ef: 0x6c214e20, + 0x346f0: 0x6c50ae20, 0x346f1: 0x6c72ea20, 0x346f2: 0x6c72ec20, 0x346f3: 0x6c72ee20, + 0x346f4: 0x6cc76a20, 0x346f5: 0x6cc76c20, 0x346f6: 0x6cf5d020, 0x346f7: 0x6cf5d220, + 0x346f8: 0x6cf5d420, 0x346f9: 0x6d52f220, 0x346fa: 0x6d7e3020, 0x346fb: 0x6c095820, + 0x346fc: 0x6c095a20, 0x346fd: 0x6c095c20, 0x346fe: 0x6c126020, 0x346ff: 0x6c126220, + // Block 0xd1c, offset 0x34700 + 0x34700: 0x6c126420, 0x34701: 0x6c126620, 0x34702: 0x6c126820, 0x34703: 0x6c126a20, + 0x34704: 0x6c216e20, 0x34705: 0x6c126c20, 0x34706: 0x6c217020, 0x34707: 0x6c217220, + 0x34708: 0x6c217420, 0x34709: 0x6c217620, 0x3470a: 0x6c217820, 0x3470b: 0x6c217a20, + 0x3470c: 0x6c217c20, 0x3470d: 0x6c217e20, 0x3470e: 0x6c218020, 0x3470f: 0x6c218220, + 0x34710: 0x6c218420, 0x34711: 0x6c218620, 0x34712: 0x6c218820, 0x34713: 0x6c218a20, + 0x34714: 0x6c218c20, 0x34715: 0x6c218e20, 0x34716: 0x6c219020, 0x34717: 0x6c219220, + 0x34718: 0x6c219420, 0x34719: 0x6c219620, 0x3471a: 0x6c35f820, 0x3471b: 0x6c35fa20, + 0x3471c: 0x6c35fc20, 0x3471d: 0x6c35fe20, 0x3471e: 0x6c360020, 0x3471f: 0x6c360220, + 0x34720: 0x6c360420, 0x34721: 0x6c360620, 0x34722: 0x6c360820, 0x34723: 0x6c360a20, + 0x34724: 0x6c360c20, 0x34725: 0x6c360e20, 0x34726: 0x6c361020, 0x34727: 0x6c361220, + 0x34728: 0x6c361420, 0x34729: 0x6c361620, 0x3472a: 0x6c361820, 0x3472b: 0x6c361a20, + 0x3472c: 0x6c361c20, 0x3472d: 0x6c361e20, 0x3472e: 0x6c362020, 0x3472f: 0x6c362220, + 0x34730: 0x6c362420, 0x34731: 0x6c362620, 0x34732: 0x6c362820, 0x34733: 0x6c362a20, + 0x34734: 0x6c362c20, 0x34735: 0x6c362e20, 0x34736: 0x6c363020, 0x34737: 0x6c511020, + 0x34738: 0x6c511220, 0x34739: 0x6c511420, 0x3473a: 0x6c511620, 0x3473b: 0x6c511820, + 0x3473c: 0x6c511a20, 0x3473d: 0x6c511c20, 0x3473e: 0x6c511e20, 0x3473f: 0x6c512020, + // Block 0xd1d, offset 0x34740 + 0x34740: 0x6c512220, 0x34741: 0x6c512420, 0x34742: 0x6c512620, 0x34743: 0x6c512820, + 0x34744: 0x6c512a20, 0x34745: 0x6c512c20, 0x34746: 0x6c512e20, 0x34747: 0x6c513020, + 0x34748: 0x6c513220, 0x34749: 0x6c515e20, 0x3474a: 0x6c513420, 0x3474b: 0x6c513620, + 0x3474c: 0x6c513820, 0x3474d: 0x6c513a20, 0x3474e: 0x6c513c20, 0x3474f: 0x6c513e20, + 0x34750: 0x6c514020, 0x34751: 0x6c514220, 0x34752: 0x6c733220, 0x34753: 0x6c733420, + 0x34754: 0x6c733620, 0x34755: 0x6c733820, 0x34756: 0x6c733a20, 0x34757: 0x6c733c20, + 0x34758: 0x6c733e20, 0x34759: 0x6c734020, 0x3475a: 0x6c734220, 0x3475b: 0x6c734420, + 0x3475c: 0x6c734620, 0x3475d: 0x6c734820, 0x3475e: 0x6c734a20, 0x3475f: 0x6c734c20, + 0x34760: 0x6c734e20, 0x34761: 0x6c735020, 0x34762: 0x6c735220, 0x34763: 0x6c735420, + 0x34764: 0x6c735620, 0x34765: 0x6c735820, 0x34766: 0x6c735a20, 0x34767: 0x6c735c20, + 0x34768: 0x6c735e20, 0x34769: 0x6c736020, 0x3476a: 0x6c736220, 0x3476b: 0x6c736420, + 0x3476c: 0x6c736620, 0x3476d: 0x6c736820, 0x3476e: 0x6c736a20, 0x3476f: 0x6c736c20, + 0x34770: 0x6c736e20, 0x34771: 0x6c737020, 0x34772: 0x6c9ba220, 0x34773: 0x6c9ba420, + 0x34774: 0x6c9ba620, 0x34775: 0x6c9ba820, 0x34776: 0x6c9baa20, 0x34777: 0x6c9bac20, + 0x34778: 0x6c9bae20, 0x34779: 0x6c9bb020, 0x3477a: 0x6c9bb220, 0x3477b: 0x6c9bb420, + 0x3477c: 0x6c9bb620, 0x3477d: 0x6c9bb820, 0x3477e: 0x6c9bba20, 0x3477f: 0x6c9bbc20, + // Block 0xd1e, offset 0x34780 + 0x34780: 0x6c9bbe20, 0x34781: 0x6c9bc020, 0x34782: 0x6c9bc220, 0x34783: 0x6c9bc420, + 0x34784: 0x6c9bc620, 0x34785: 0x6c9bc820, 0x34786: 0x6c9bca20, 0x34787: 0x6c9bcc20, + 0x34788: 0x6c9bce20, 0x34789: 0x6c9bd020, 0x3478a: 0x6c9bd220, 0x3478b: 0x6c9bd420, + 0x3478c: 0x6c9bd620, 0x3478d: 0x6c9bd820, 0x3478e: 0x6c9bda20, 0x3478f: 0x6c9bdc20, + 0x34790: 0x6c9bde20, 0x34791: 0x6c9be020, 0x34792: 0x6c9be220, 0x34793: 0x6c9be420, + 0x34794: 0x6c9be620, 0x34795: 0x6c9be820, 0x34796: 0x6c9bea20, 0x34797: 0x6c9bec20, + 0x34798: 0x6c9bee20, 0x34799: 0x6c9bf020, 0x3479a: 0x6c9bf220, 0x3479b: 0x6c9bf420, + 0x3479c: 0x6c9bf620, 0x3479d: 0x6c9bf820, 0x3479e: 0x6c9bfa20, 0x3479f: 0x6c9bfc20, + 0x347a0: 0x6c9bfe20, 0x347a1: 0x6c9c0020, 0x347a2: 0x6cc7ba20, 0x347a3: 0x6cc7bc20, + 0x347a4: 0x6cc7be20, 0x347a5: 0x6cc7c020, 0x347a6: 0x6cc7c220, 0x347a7: 0x6cc7c420, + 0x347a8: 0x6cc7c620, 0x347a9: 0x6cc7c820, 0x347aa: 0x6cc7ca20, 0x347ab: 0x6cc7cc20, + 0x347ac: 0x6cc7ce20, 0x347ad: 0x6cc7d020, 0x347ae: 0x6cc7d220, 0x347af: 0x6cc7d420, + 0x347b0: 0x6cc7d620, 0x347b1: 0x6cc7d820, 0x347b2: 0x6cc7da20, 0x347b3: 0x6cc7dc20, + 0x347b4: 0x6cc7de20, 0x347b5: 0x6cc7e020, 0x347b6: 0x6cc7e220, 0x347b7: 0x6cc7e420, + 0x347b8: 0x6cc7e620, 0x347b9: 0x6cc7e820, 0x347ba: 0x6cc7ea20, 0x347bb: 0x6cc7ec20, + 0x347bc: 0x6cc7ee20, 0x347bd: 0x6cc7f020, 0x347be: 0x6cc7f220, 0x347bf: 0x6cc7f420, + // Block 0xd1f, offset 0x347c0 + 0x347c0: 0x6cc7f620, 0x347c1: 0x6cc7f820, 0x347c2: 0x6cc7fa20, 0x347c3: 0x6cc7fc20, + 0x347c4: 0x6cc7fe20, 0x347c5: 0x6cc80020, 0x347c6: 0x6cc80220, 0x347c7: 0x6cc80420, + 0x347c8: 0x6cc80620, 0x347c9: 0x6cc80820, 0x347ca: 0x6cc80a20, 0x347cb: 0x6cc80c20, + 0x347cc: 0x6cc80e20, 0x347cd: 0x6cc81020, 0x347ce: 0x6cc81220, 0x347cf: 0x6cc81420, + 0x347d0: 0x6cc81620, 0x347d1: 0x6cc81820, 0x347d2: 0x6cc81a20, 0x347d3: 0x6cc81c20, + 0x347d4: 0x6cc81e20, 0x347d5: 0x6cc82020, 0x347d6: 0x6cc82220, 0x347d7: 0x6cc82420, + 0x347d8: 0x6cc82620, 0x347d9: 0x6cc82820, 0x347da: 0x6cc82a20, 0x347db: 0x6cc82c20, + 0x347dc: 0x6cc82e20, 0x347dd: 0x6cc83020, 0x347de: 0x6cc83220, 0x347df: 0x6cc83420, + 0x347e0: 0x6cc83620, 0x347e1: 0x6cc83820, 0x347e2: 0x6cc83a20, 0x347e3: 0x6cc83c20, + 0x347e4: 0x6cf61a20, 0x347e5: 0x6cf61c20, 0x347e6: 0x6cf61e20, 0x347e7: 0x6cf62020, + 0x347e8: 0x6cf62220, 0x347e9: 0x6cf62420, 0x347ea: 0x6cf62620, 0x347eb: 0x6cf62820, + 0x347ec: 0x6cf62a20, 0x347ed: 0x6cf62c20, 0x347ee: 0x6cf62e20, 0x347ef: 0x6cf63020, + 0x347f0: 0x6cf63220, 0x347f1: 0x6cf63420, 0x347f2: 0x6cf63620, 0x347f3: 0x6cf63820, + 0x347f4: 0x6cf63a20, 0x347f5: 0x6cf63c20, 0x347f6: 0x6cf63e20, 0x347f7: 0x6cf64020, + 0x347f8: 0x6cf64220, 0x347f9: 0x6cf64420, 0x347fa: 0x6cf64620, 0x347fb: 0x6cf64820, + 0x347fc: 0x6cf64a20, 0x347fd: 0x6cf64c20, 0x347fe: 0x6cf64e20, 0x347ff: 0x6cf65020, + // Block 0xd20, offset 0x34800 + 0x34800: 0x6cf65220, 0x34801: 0x6cf65420, 0x34802: 0x6cf65620, 0x34803: 0x6cf65820, + 0x34804: 0x6cf65a20, 0x34805: 0x6cf65c20, 0x34806: 0x6cf65e20, 0x34807: 0x6cf66020, + 0x34808: 0x6cf66220, 0x34809: 0x6cf66420, 0x3480a: 0x6cf66620, 0x3480b: 0x6cf66820, + 0x3480c: 0x6cf66a20, 0x3480d: 0x6cf66c20, 0x3480e: 0x6cf66e20, 0x3480f: 0x6cf67020, + 0x34810: 0x6cf67220, 0x34811: 0x6cf67420, 0x34812: 0x6d259c20, 0x34813: 0x6d259e20, + 0x34814: 0x6d25a020, 0x34815: 0x6d25a220, 0x34816: 0x6d25a420, 0x34817: 0x6d25a620, + 0x34818: 0x6d25a820, 0x34819: 0x6d25aa20, 0x3481a: 0x6d25ac20, 0x3481b: 0x6d25ae20, + 0x3481c: 0x6d25b020, 0x3481d: 0x6d25b220, 0x3481e: 0x6d25b420, 0x3481f: 0x6d25b620, + 0x34820: 0x6d25b820, 0x34821: 0x6cf1ac20, 0x34822: 0x6d25ba20, 0x34823: 0x6d25bc20, + 0x34824: 0x6d25be20, 0x34825: 0x6d25c020, 0x34826: 0x6d25c220, 0x34827: 0x6d25c420, + 0x34828: 0x6d25c620, 0x34829: 0x6d25c820, 0x3482a: 0x6d25ca20, 0x3482b: 0x6d25cc20, + 0x3482c: 0x6d25ce20, 0x3482d: 0x6d25d020, 0x3482e: 0x6d25d220, 0x3482f: 0x6d25d420, + 0x34830: 0x6d25d620, 0x34831: 0x6d25d820, 0x34832: 0x6d25da20, 0x34833: 0x6d25dc20, + 0x34834: 0x6d25de20, 0x34835: 0x6d25e020, 0x34836: 0x6d25e220, 0x34837: 0x6d25e420, + 0x34838: 0x6d25e620, 0x34839: 0x6d25e820, 0x3483a: 0x6d25ea20, 0x3483b: 0x6d531e20, + 0x3483c: 0x6d532020, 0x3483d: 0x6d532220, 0x3483e: 0x6d532420, 0x3483f: 0x6d532620, + // Block 0xd21, offset 0x34840 + 0x34840: 0x6d532820, 0x34841: 0x6d532a20, 0x34842: 0x6d532c20, 0x34843: 0x6d532e20, + 0x34844: 0x6d533020, 0x34845: 0x6d533220, 0x34846: 0x6d533420, 0x34847: 0x6d533620, + 0x34848: 0x6d533820, 0x34849: 0x6d7e7020, 0x3484a: 0x6d533a20, 0x3484b: 0x6d533c20, + 0x3484c: 0x6d533e20, 0x3484d: 0x6d534020, 0x3484e: 0x6d534220, 0x3484f: 0x6d534420, + 0x34850: 0x6d534620, 0x34851: 0x6d534820, 0x34852: 0x6d4d3220, 0x34853: 0x6d534a20, + 0x34854: 0x6d534c20, 0x34855: 0x6d534e20, 0x34856: 0x6d535020, 0x34857: 0x6d535220, + 0x34858: 0x6d535420, 0x34859: 0x6d535620, 0x3485a: 0x6d535820, 0x3485b: 0x6d535a20, + 0x3485c: 0x6d535c20, 0x3485d: 0x6d535e20, 0x3485e: 0x6d7e7220, 0x3485f: 0x6d7e7420, + 0x34860: 0x6d7e7620, 0x34861: 0x6d7e7820, 0x34862: 0x6d7e7a20, 0x34863: 0x6d7e7c20, + 0x34864: 0x6d7e7e20, 0x34865: 0x6d7e8020, 0x34866: 0x6d7e8220, 0x34867: 0x6d7e8420, + 0x34868: 0x6d7e8620, 0x34869: 0x6d7e8820, 0x3486a: 0x6d7e8a20, 0x3486b: 0x6d7e8c20, + 0x3486c: 0x6d7e8e20, 0x3486d: 0x6d7e9020, 0x3486e: 0x6d7e9220, 0x3486f: 0x6d7e9420, + 0x34870: 0x6d7e9620, 0x34871: 0x6d7e9820, 0x34872: 0x6d7e9a20, 0x34873: 0x6d7e9c20, + 0x34874: 0x6d7e9e20, 0x34875: 0x6d7ea020, 0x34876: 0x6d7ea220, 0x34877: 0x6d7ea420, + 0x34878: 0x6d7ea620, 0x34879: 0x6d7ea820, 0x3487a: 0x6d7eaa20, 0x3487b: 0x6d7eac20, + 0x3487c: 0x6d7eae20, 0x3487d: 0x6d7eb020, 0x3487e: 0x6d7eb220, 0x3487f: 0x6d7eb420, + // Block 0xd22, offset 0x34880 + 0x34880: 0x6d7eb620, 0x34881: 0x6d7eb820, 0x34882: 0x6d7eba20, 0x34883: 0x6d7ebc20, + 0x34884: 0x6d7ebe20, 0x34885: 0x6d7ec020, 0x34886: 0x6d7ec220, 0x34887: 0x6d536020, + 0x34888: 0x6d7ec420, 0x34889: 0x6da57a20, 0x3488a: 0x6da57c20, 0x3488b: 0x6da57e20, + 0x3488c: 0x6da58020, 0x3488d: 0x6da58220, 0x3488e: 0x6da58420, 0x3488f: 0x6da58620, + 0x34890: 0x6da58820, 0x34891: 0x6da58a20, 0x34892: 0x6da58c20, 0x34893: 0x6da58e20, + 0x34894: 0x6da59020, 0x34895: 0x6da59220, 0x34896: 0x6da59420, 0x34897: 0x6da59620, + 0x34898: 0x6da59820, 0x34899: 0x6da59a20, 0x3489a: 0x6da59c20, 0x3489b: 0x6da59e20, + 0x3489c: 0x6da5a020, 0x3489d: 0x6da5a220, 0x3489e: 0x6dc70e20, 0x3489f: 0x6dc71020, + 0x348a0: 0x6dc71220, 0x348a1: 0x6dc71420, 0x348a2: 0x6dc71620, 0x348a3: 0x6dc71820, + 0x348a4: 0x6dc71a20, 0x348a5: 0x6dc71c20, 0x348a6: 0x6dc71e20, 0x348a7: 0x6dc72020, + 0x348a8: 0x6dc72220, 0x348a9: 0x6dc72420, 0x348aa: 0x6dc72620, 0x348ab: 0x6dc72820, + 0x348ac: 0x6dc72a20, 0x348ad: 0x6dc72c20, 0x348ae: 0x6dc72e20, 0x348af: 0x6dc73020, + 0x348b0: 0x6dc73220, 0x348b1: 0x6dc73420, 0x348b2: 0x6de39420, 0x348b3: 0x6de39620, + 0x348b4: 0x6de39820, 0x348b5: 0x6de39a20, 0x348b6: 0x6de39c20, 0x348b7: 0x6de39e20, + 0x348b8: 0x6de3a020, 0x348b9: 0x6de3a220, 0x348ba: 0x6de3a420, 0x348bb: 0x6de3a620, + 0x348bc: 0x6de3a820, 0x348bd: 0x6de3aa20, 0x348be: 0x6de3ac20, 0x348bf: 0x6dfaec20, + // Block 0xd23, offset 0x348c0 + 0x348c0: 0x6dfaee20, 0x348c1: 0x6dfaf020, 0x348c2: 0x6dfaf220, 0x348c3: 0x6dfaf420, + 0x348c4: 0x6dfaf620, 0x348c5: 0x6dfaf820, 0x348c6: 0x6dfafa20, 0x348c7: 0x6dfafc20, + 0x348c8: 0x6e0e4820, 0x348c9: 0x6e0e4a20, 0x348ca: 0x6e0e4c20, 0x348cb: 0x6e0e4e20, + 0x348cc: 0x6e0e5020, 0x348cd: 0x6e1d9e20, 0x348ce: 0x6e1da020, 0x348cf: 0x6e1da220, + 0x348d0: 0x6e1da420, 0x348d1: 0x6e1da620, 0x348d2: 0x6e1da820, 0x348d3: 0x6e1daa20, + 0x348d4: 0x6e1dac20, 0x348d5: 0x6e1dae20, 0x348d6: 0x6e293620, 0x348d7: 0x6e324e20, + 0x348d8: 0x6e325020, 0x348d9: 0x6e325220, 0x348da: 0x6e348820, 0x348db: 0x6e325420, + 0x348dc: 0x6e38aa20, 0x348dd: 0x6e38ac20, 0x348de: 0x6e40ba20, 0x348df: 0x6e42a220, + 0x348e0: 0x6e46e620, 0x348e1: 0x6c21a020, 0x348e2: 0x6c21a220, 0x348e3: 0x6c364220, + 0x348e4: 0x6c364420, 0x348e5: 0x6c364620, 0x348e6: 0x6c364820, 0x348e7: 0x6c516020, + 0x348e8: 0x6c516220, 0x348e9: 0x6c516420, 0x348ea: 0x6c516620, 0x348eb: 0x6c516820, + 0x348ec: 0x6c516a20, 0x348ed: 0x6c739420, 0x348ee: 0x6c739620, 0x348ef: 0x6c739820, + 0x348f0: 0x6c739a20, 0x348f1: 0x6c739c20, 0x348f2: 0x6c739e20, 0x348f3: 0x6c73a020, + 0x348f4: 0x6c73a220, 0x348f5: 0x6c73a420, 0x348f6: 0x6c73a620, 0x348f7: 0x6c9c0e20, + 0x348f8: 0x6c9c1020, 0x348f9: 0x6c9c1220, 0x348fa: 0x6c9c1420, 0x348fb: 0x6cc85220, + 0x348fc: 0x6cc85420, 0x348fd: 0x6cc85620, 0x348fe: 0x6cf68a20, 0x348ff: 0x6cf68c20, + // Block 0xd24, offset 0x34900 + 0x34900: 0x6cf68e20, 0x34901: 0x6cf69020, 0x34902: 0x6cf69220, 0x34903: 0x6d25fc20, + 0x34904: 0x6d25fe20, 0x34905: 0x6d260020, 0x34906: 0x6d537420, 0x34907: 0x6d537620, + 0x34908: 0x6d537820, 0x34909: 0x6d537a20, 0x3490a: 0x6d537c20, 0x3490b: 0x6d7ed820, + 0x3490c: 0x6d7eda20, 0x3490d: 0x6d7edc20, 0x3490e: 0x6d7ede20, 0x3490f: 0x6da5ac20, + 0x34910: 0x6da5ae20, 0x34911: 0x6dc73e20, 0x34912: 0x6dc74020, 0x34913: 0x6dc74220, + 0x34914: 0x6dc74420, 0x34915: 0x6dc74620, 0x34916: 0x6de3ae20, 0x34917: 0x6de3b020, + 0x34918: 0x6dfafe20, 0x34919: 0x6dfb0020, 0x3491a: 0x6e325820, 0x3491b: 0x6e42a420, + 0x3491c: 0x6e46c620, 0x3491d: 0x6c096020, 0x3491e: 0x6c127620, 0x3491f: 0x6c21a420, + 0x34920: 0x6c21a620, 0x34921: 0x6c21a820, 0x34922: 0x6c21aa20, 0x34923: 0x6c21ac20, + 0x34924: 0x6c365420, 0x34925: 0x6c517420, 0x34926: 0x6c517620, 0x34927: 0x6c517820, + 0x34928: 0x6c5dc820, 0x34929: 0x6c517a20, 0x3492a: 0x6c517c20, 0x3492b: 0x6c517e20, + 0x3492c: 0x6c518020, 0x3492d: 0x6c73b620, 0x3492e: 0x6c73b820, 0x3492f: 0x6c825c20, + 0x34930: 0x6c825e20, 0x34931: 0x6c9c2420, 0x34932: 0x6c9c2620, 0x34933: 0x6c9c2820, + 0x34934: 0x6c9c2a20, 0x34935: 0x6c9c2c20, 0x34936: 0x6c9c2e20, 0x34937: 0x6cc86220, + 0x34938: 0x6cc86420, 0x34939: 0x6cc86620, 0x3493a: 0x6cc86820, 0x3493b: 0x6cc86a20, + 0x3493c: 0x6cc86c20, 0x3493d: 0x6cc86e20, 0x3493e: 0x6cc87020, 0x3493f: 0x6cc87220, + // Block 0xd25, offset 0x34940 + 0x34940: 0x6cc87420, 0x34941: 0x6cc87620, 0x34942: 0x6cc87820, 0x34943: 0x6cc87a20, + 0x34944: 0x6cf69820, 0x34945: 0x6cf69a20, 0x34946: 0x6cf69c20, 0x34947: 0x6cf69e20, + 0x34948: 0x6cf6a020, 0x34949: 0x6cf6a220, 0x3494a: 0x6cf6a420, 0x3494b: 0x6cf6a620, + 0x3494c: 0x6cf6a820, 0x3494d: 0x6d260820, 0x3494e: 0x6d260a20, 0x3494f: 0x6d260c20, + 0x34950: 0x6d260e20, 0x34951: 0x6d261020, 0x34952: 0x6d538820, 0x34953: 0x6d538a20, + 0x34954: 0x6d538c20, 0x34955: 0x6d538e20, 0x34956: 0x6d539020, 0x34957: 0x6d539220, + 0x34958: 0x6d539420, 0x34959: 0x6d539620, 0x3495a: 0x6d7eec20, 0x3495b: 0x6d7eee20, + 0x3495c: 0x6da5b220, 0x3495d: 0x6d7ef020, 0x3495e: 0x6d7ef220, 0x3495f: 0x6d7ef420, + 0x34960: 0x6d7ef620, 0x34961: 0x6d7ef820, 0x34962: 0x6d7efa20, 0x34963: 0x6da5b420, + 0x34964: 0x6da5b620, 0x34965: 0x6da5b820, 0x34966: 0x6da5ba20, 0x34967: 0x6da5bc20, + 0x34968: 0x6da5be20, 0x34969: 0x6dc74a20, 0x3496a: 0x6dc74c20, 0x3496b: 0x6dc74e20, + 0x3496c: 0x6dc75020, 0x3496d: 0x6dc75220, 0x3496e: 0x6dfb0420, 0x3496f: 0x6dfb0620, + 0x34970: 0x6e1db020, 0x34971: 0x6e293820, 0x34972: 0x6e325a20, 0x34973: 0x6c04a220, + 0x34974: 0x6c04a420, 0x34975: 0x6c097020, 0x34976: 0x6c097220, 0x34977: 0x6c097420, + 0x34978: 0x6c12a220, 0x34979: 0x6c12a420, 0x3497a: 0x6c12a620, 0x3497b: 0x6c12a820, + 0x3497c: 0x6c12aa20, 0x3497d: 0x6c12ac20, 0x3497e: 0x6c12ae20, 0x3497f: 0x6c12b020, + // Block 0xd26, offset 0x34980 + 0x34980: 0x6c12b220, 0x34981: 0x6c220820, 0x34982: 0x6c220a20, 0x34983: 0x6c220c20, + 0x34984: 0x6c220e20, 0x34985: 0x6c221020, 0x34986: 0x6c221220, 0x34987: 0x6c221420, + 0x34988: 0x6c221620, 0x34989: 0x6c221820, 0x3498a: 0x6c221a20, 0x3498b: 0x6c221c20, + 0x3498c: 0x6c221e20, 0x3498d: 0x6c222020, 0x3498e: 0x6c222220, 0x3498f: 0x6c222420, + 0x34990: 0x6c222620, 0x34991: 0x6c222820, 0x34992: 0x6c222a20, 0x34993: 0x6c222c20, + 0x34994: 0x6c36f220, 0x34995: 0x6c36f420, 0x34996: 0x6c36f620, 0x34997: 0x6c36f820, + 0x34998: 0x6c36fa20, 0x34999: 0x6c36fc20, 0x3499a: 0x6c36fe20, 0x3499b: 0x6c370020, + 0x3499c: 0x6c370220, 0x3499d: 0x6c370420, 0x3499e: 0x6c370620, 0x3499f: 0x6c370820, + 0x349a0: 0x6c370a20, 0x349a1: 0x6c370c20, 0x349a2: 0x6c370e20, 0x349a3: 0x6c371020, + 0x349a4: 0x6c371220, 0x349a5: 0x6c371420, 0x349a6: 0x6c371620, 0x349a7: 0x6c371820, + 0x349a8: 0x6c371a20, 0x349a9: 0x6c371c20, 0x349aa: 0x6c371e20, 0x349ab: 0x6c372020, + 0x349ac: 0x6c372220, 0x349ad: 0x6c372420, 0x349ae: 0x6c372620, 0x349af: 0x6c372820, + 0x349b0: 0x6c372a20, 0x349b1: 0x6c372c20, 0x349b2: 0x6c372e20, 0x349b3: 0x6c373020, + 0x349b4: 0x6c373220, 0x349b5: 0x6c373420, 0x349b6: 0x6c373620, 0x349b7: 0x6c373820, + 0x349b8: 0x6c373a20, 0x349b9: 0x6c373c20, 0x349ba: 0x6c373e20, 0x349bb: 0x6c374020, + 0x349bc: 0x6c374220, 0x349bd: 0x6c374420, 0x349be: 0x6c374620, 0x349bf: 0x6c374820, + // Block 0xd27, offset 0x349c0 + 0x349c0: 0x6c374a20, 0x349c1: 0x6c374c20, 0x349c2: 0x6c374e20, 0x349c3: 0x6c375020, + 0x349c4: 0x6c375220, 0x349c5: 0x6c375420, 0x349c6: 0x6c375620, 0x349c7: 0x6c375820, + 0x349c8: 0x6c525420, 0x349c9: 0x6c525620, 0x349ca: 0x6c525820, 0x349cb: 0x6c525a20, + 0x349cc: 0x6c525c20, 0x349cd: 0x6c525e20, 0x349ce: 0x6c526020, 0x349cf: 0x6c526220, + 0x349d0: 0x6c526420, 0x349d1: 0x6c526620, 0x349d2: 0x6c526820, 0x349d3: 0x6c526a20, + 0x349d4: 0x6c526c20, 0x349d5: 0x6c526e20, 0x349d6: 0x6c527020, 0x349d7: 0x6c527220, + 0x349d8: 0x6c527420, 0x349d9: 0x6c527620, 0x349da: 0x6c527820, 0x349db: 0x6c527a20, + 0x349dc: 0x6c527c20, 0x349dd: 0x6c527e20, 0x349de: 0x6c528020, 0x349df: 0x6c528220, + 0x349e0: 0x6c528420, 0x349e1: 0x6c528620, 0x349e2: 0x6c528820, 0x349e3: 0x6c528a20, + 0x349e4: 0x6c528c20, 0x349e5: 0x6c528e20, 0x349e6: 0x6c529020, 0x349e7: 0x6c529220, + 0x349e8: 0x6c529420, 0x349e9: 0x6c529620, 0x349ea: 0x6c529820, 0x349eb: 0x6c529a20, + 0x349ec: 0x6c529c20, 0x349ed: 0x6c529e20, 0x349ee: 0x6c52a020, 0x349ef: 0x6c52a220, + 0x349f0: 0x6c52a420, 0x349f1: 0x6c52a620, 0x349f2: 0x6c52a820, 0x349f3: 0x6c52aa20, + 0x349f4: 0x6c52ac20, 0x349f5: 0x6c749820, 0x349f6: 0x6c749a20, 0x349f7: 0x6c749c20, + 0x349f8: 0x6c749e20, 0x349f9: 0x6c74a020, 0x349fa: 0x6c74a220, 0x349fb: 0x6c74a420, + 0x349fc: 0x6c74a620, 0x349fd: 0x6c74a820, 0x349fe: 0x6c74aa20, 0x349ff: 0x6c74ac20, + // Block 0xd28, offset 0x34a00 + 0x34a00: 0x6c74ae20, 0x34a01: 0x6c74b020, 0x34a02: 0x6c74b220, 0x34a03: 0x6c74b420, + 0x34a04: 0x6c74b620, 0x34a05: 0x6c74b820, 0x34a06: 0x6c74ba20, 0x34a07: 0x6c74bc20, + 0x34a08: 0x6c74be20, 0x34a09: 0x6c74c020, 0x34a0a: 0x6c74c220, 0x34a0b: 0x6c74c420, + 0x34a0c: 0x6c74c620, 0x34a0d: 0x6c74c820, 0x34a0e: 0x6c74ca20, 0x34a0f: 0x6c74cc20, + 0x34a10: 0x6c74ce20, 0x34a11: 0x6c74d020, 0x34a12: 0x6c74d220, 0x34a13: 0x6c74d420, + 0x34a14: 0x6c74d620, 0x34a15: 0x6c74d820, 0x34a16: 0x6c74da20, 0x34a17: 0x6c74dc20, + 0x34a18: 0x6c74de20, 0x34a19: 0x6c74e020, 0x34a1a: 0x6c74e220, 0x34a1b: 0x6c74e420, + 0x34a1c: 0x6c74e620, 0x34a1d: 0x6c74e820, 0x34a1e: 0x6c74ea20, 0x34a1f: 0x6c74ec20, + 0x34a20: 0x6c74ee20, 0x34a21: 0x6c74f020, 0x34a22: 0x6c74f220, 0x34a23: 0x6c74f420, + 0x34a24: 0x6c74f620, 0x34a25: 0x6c74f820, 0x34a26: 0x6c74fa20, 0x34a27: 0x6c6a4c20, + 0x34a28: 0x6c74fc20, 0x34a29: 0x6c74fe20, 0x34a2a: 0x6c750020, 0x34a2b: 0x6c750220, + 0x34a2c: 0x6c750420, 0x34a2d: 0x6c750620, 0x34a2e: 0x6c750820, 0x34a2f: 0x6c750a20, + 0x34a30: 0x6c750c20, 0x34a31: 0x6c750e20, 0x34a32: 0x6c751020, 0x34a33: 0x6c751220, + 0x34a34: 0x6c751420, 0x34a35: 0x6c751620, 0x34a36: 0x6c751820, 0x34a37: 0x6c751a20, + 0x34a38: 0x6c751c20, 0x34a39: 0x6c751e20, 0x34a3a: 0x6c752020, 0x34a3b: 0x6c752220, + 0x34a3c: 0x6c752420, 0x34a3d: 0x6c752620, 0x34a3e: 0x6c752820, 0x34a3f: 0x6c9d0220, + // Block 0xd29, offset 0x34a40 + 0x34a40: 0x6c9d0420, 0x34a41: 0x6c9d0620, 0x34a42: 0x6c9d0820, 0x34a43: 0x6c9d0a20, + 0x34a44: 0x6c9d0c20, 0x34a45: 0x6c9d0e20, 0x34a46: 0x6c9d1020, 0x34a47: 0x6c9d1220, + 0x34a48: 0x6c9d1420, 0x34a49: 0x6c9d1620, 0x34a4a: 0x6c9d1820, 0x34a4b: 0x6c9d1a20, + 0x34a4c: 0x6c9d1c20, 0x34a4d: 0x6c9d1e20, 0x34a4e: 0x6c9d2020, 0x34a4f: 0x6c9d2220, + 0x34a50: 0x6c9d2420, 0x34a51: 0x6c9d2620, 0x34a52: 0x6c9d2820, 0x34a53: 0x6c9d2a20, + 0x34a54: 0x6c9d2c20, 0x34a55: 0x6c9d2e20, 0x34a56: 0x6c9d3020, 0x34a57: 0x6c9d3220, + 0x34a58: 0x6c9d3420, 0x34a59: 0x6c9d3620, 0x34a5a: 0x6c9d3820, 0x34a5b: 0x6c9d3a20, + 0x34a5c: 0x6c9d3c20, 0x34a5d: 0x6c9d3e20, 0x34a5e: 0x6c9d4020, 0x34a5f: 0x6c9d4220, + 0x34a60: 0x6c9d4420, 0x34a61: 0x6c9d4620, 0x34a62: 0x6c9d4820, 0x34a63: 0x6c9d4a20, + 0x34a64: 0x6c9d4c20, 0x34a65: 0x6c9d4e20, 0x34a66: 0x6c9d5020, 0x34a67: 0x6c9d5220, + 0x34a68: 0x6c9d5420, 0x34a69: 0x6c9d5620, 0x34a6a: 0x6c9d5820, 0x34a6b: 0x6c9d5a20, + 0x34a6c: 0x6c9d5c20, 0x34a6d: 0x6c9d5e20, 0x34a6e: 0x6c9d6020, 0x34a6f: 0x6c9d6220, + 0x34a70: 0x6c9d6420, 0x34a71: 0x6c9d6620, 0x34a72: 0x6c9d6820, 0x34a73: 0x6c9d6a20, + 0x34a74: 0x6c9d6c20, 0x34a75: 0x6c9d6e20, 0x34a76: 0x6c9d7020, 0x34a77: 0x6c9d7220, + 0x34a78: 0x6c9d7420, 0x34a79: 0x6c9d7620, 0x34a7a: 0x6c9d7820, 0x34a7b: 0x6c9d7a20, + 0x34a7c: 0x6c9d7c20, 0x34a7d: 0x6c9d7e20, 0x34a7e: 0x6c9d8020, 0x34a7f: 0x6c9d8220, + // Block 0xd2a, offset 0x34a80 + 0x34a80: 0x6c9d8420, 0x34a81: 0x6cc98620, 0x34a82: 0x6cc98820, 0x34a83: 0x6cc98a20, + 0x34a84: 0x6cc98c20, 0x34a85: 0x6cc98e20, 0x34a86: 0x6cc99020, 0x34a87: 0x6cc99220, + 0x34a88: 0x6cc99420, 0x34a89: 0x6cc99620, 0x34a8a: 0x6cc99820, 0x34a8b: 0x6cc99a20, + 0x34a8c: 0x6cc99c20, 0x34a8d: 0x6cc99e20, 0x34a8e: 0x6cc9a020, 0x34a8f: 0x6cc9a220, + 0x34a90: 0x6cc9a420, 0x34a91: 0x6cc9a620, 0x34a92: 0x6cc9a820, 0x34a93: 0x6cc9aa20, + 0x34a94: 0x6cc9ac20, 0x34a95: 0x6cc9ae20, 0x34a96: 0x6cc9b020, 0x34a97: 0x6cc9b220, + 0x34a98: 0x6cc9b420, 0x34a99: 0x6cc9b620, 0x34a9a: 0x6cc9b820, 0x34a9b: 0x6cc9ba20, + 0x34a9c: 0x6cc9bc20, 0x34a9d: 0x6cc9be20, 0x34a9e: 0x6cc9c020, 0x34a9f: 0x6cc9c220, + 0x34aa0: 0x6cc9c420, 0x34aa1: 0x6cc9c620, 0x34aa2: 0x6cc9c820, 0x34aa3: 0x6cc9ca20, + 0x34aa4: 0x6cc9cc20, 0x34aa5: 0x6cc9ce20, 0x34aa6: 0x6cc9d020, 0x34aa7: 0x6cc9d220, + 0x34aa8: 0x6cc9d420, 0x34aa9: 0x6cc9d620, 0x34aaa: 0x6cc9d820, 0x34aab: 0x6cc9da20, + 0x34aac: 0x6cc9dc20, 0x34aad: 0x6cc9de20, 0x34aae: 0x6cc9e020, 0x34aaf: 0x6cc9e220, + 0x34ab0: 0x6cc9e420, 0x34ab1: 0x6cc9e620, 0x34ab2: 0x6cc9e820, 0x34ab3: 0x6cc9ea20, + 0x34ab4: 0x6cc9ec20, 0x34ab5: 0x6cc9ee20, 0x34ab6: 0x6cc9f020, 0x34ab7: 0x6cc9f220, + 0x34ab8: 0x6cc9f420, 0x34ab9: 0x6cc9f620, 0x34aba: 0x6cc9f820, 0x34abb: 0x6cc9fa20, + 0x34abc: 0x6cc9fc20, 0x34abd: 0x6cc9fe20, 0x34abe: 0x6cca0020, 0x34abf: 0x6cca0220, + // Block 0xd2b, offset 0x34ac0 + 0x34ac0: 0x6cca0420, 0x34ac1: 0x6cca0620, 0x34ac2: 0x6cca0820, 0x34ac3: 0x6cca0a20, + 0x34ac4: 0x6cca0c20, 0x34ac5: 0x6cca0e20, 0x34ac6: 0x6cca1020, 0x34ac7: 0x6cca1220, + 0x34ac8: 0x6cca1420, 0x34ac9: 0x6cca1620, 0x34aca: 0x6cca1820, 0x34acb: 0x6cca1a20, + 0x34acc: 0x6cca1c20, 0x34acd: 0x6cca1e20, 0x34ace: 0x6cca2020, 0x34acf: 0x6cca2220, + 0x34ad0: 0x6cca2420, 0x34ad1: 0x6cca2620, 0x34ad2: 0x6cca2820, 0x34ad3: 0x6cca2a20, + 0x34ad4: 0x6cca2c20, 0x34ad5: 0x6cca2e20, 0x34ad6: 0x6cca3020, 0x34ad7: 0x6cca3220, + 0x34ad8: 0x6cca3420, 0x34ad9: 0x6cca3620, 0x34ada: 0x6cca3820, 0x34adb: 0x6cca3a20, + 0x34adc: 0x6cca3c20, 0x34add: 0x6cca3e20, 0x34ade: 0x6cca4020, 0x34adf: 0x6cca4220, + 0x34ae0: 0x6cca4420, 0x34ae1: 0x6cca4620, 0x34ae2: 0x6cca4820, 0x34ae3: 0x6cca4a20, + 0x34ae4: 0x6cca4c20, 0x34ae5: 0x6cca4e20, 0x34ae6: 0x6cca5020, 0x34ae7: 0x6cca5220, + 0x34ae8: 0x6cca5420, 0x34ae9: 0x6cca5620, 0x34aea: 0x6cca5820, 0x34aeb: 0x6cca5a20, + 0x34aec: 0x6cca5c20, 0x34aed: 0x6cca5e20, 0x34aee: 0x6cca6020, 0x34aef: 0x6cca6220, + 0x34af0: 0x6cca6420, 0x34af1: 0x6cf79c20, 0x34af2: 0x6cf79e20, 0x34af3: 0x6cf7a020, + 0x34af4: 0x6cf7a220, 0x34af5: 0x6cf7a420, 0x34af6: 0x6cf7a620, 0x34af7: 0x6cf7a820, + 0x34af8: 0x6cf7aa20, 0x34af9: 0x6cf7ac20, 0x34afa: 0x6cf7ae20, 0x34afb: 0x6cf7b020, + 0x34afc: 0x6cf7b220, 0x34afd: 0x6cf7b420, 0x34afe: 0x6cf7b620, 0x34aff: 0x6cf7b820, + // Block 0xd2c, offset 0x34b00 + 0x34b00: 0x6cf7ba20, 0x34b01: 0x6cf7bc20, 0x34b02: 0x6cf7be20, 0x34b03: 0x6cf7c020, + 0x34b04: 0x6cf7c220, 0x34b05: 0x6cf7c420, 0x34b06: 0x6cf7c620, 0x34b07: 0x6cf7c820, + 0x34b08: 0x6cf7ca20, 0x34b09: 0x6cf7cc20, 0x34b0a: 0x6cf7ce20, 0x34b0b: 0x6cf7d020, + 0x34b0c: 0x6cf7d220, 0x34b0d: 0x6cf7d420, 0x34b0e: 0x6cf7d620, 0x34b0f: 0x6cf7d820, + 0x34b10: 0x6cf7da20, 0x34b11: 0x6cf7dc20, 0x34b12: 0x6cf7de20, 0x34b13: 0x6cf7e020, + 0x34b14: 0x6cf7e220, 0x34b15: 0x6cf7e420, 0x34b16: 0x6cf7e620, 0x34b17: 0x6cf7e820, + 0x34b18: 0x6cf7ea20, 0x34b19: 0x6cf7ec20, 0x34b1a: 0x6cf7ee20, 0x34b1b: 0x6cf7f020, + 0x34b1c: 0x6cf7f220, 0x34b1d: 0x6cf7f420, 0x34b1e: 0x6cf7f620, 0x34b1f: 0x6cf7f820, + 0x34b20: 0x6cf7fa20, 0x34b21: 0x6cf7fc20, 0x34b22: 0x6cf7fe20, 0x34b23: 0x6cf80020, + 0x34b24: 0x6d26fa20, 0x34b25: 0x6cf80220, 0x34b26: 0x6cf80420, 0x34b27: 0x6cf80620, + 0x34b28: 0x6cf80820, 0x34b29: 0x6cf80a20, 0x34b2a: 0x6cf80c20, 0x34b2b: 0x6cf80e20, + 0x34b2c: 0x6cf81020, 0x34b2d: 0x6cf81220, 0x34b2e: 0x6cf81420, 0x34b2f: 0x6cf81620, + 0x34b30: 0x6cf81820, 0x34b31: 0x6cf81a20, 0x34b32: 0x6cf81c20, 0x34b33: 0x6cf81e20, + 0x34b34: 0x6cf82020, 0x34b35: 0x6cf82220, 0x34b36: 0x6cf82420, 0x34b37: 0x6cf82620, + 0x34b38: 0x6cf82820, 0x34b39: 0x6cf82a20, 0x34b3a: 0x6cf82c20, 0x34b3b: 0x6cf82e20, + 0x34b3c: 0x6cf83020, 0x34b3d: 0x6cf83220, 0x34b3e: 0x6cf83420, 0x34b3f: 0x6cf83620, + // Block 0xd2d, offset 0x34b40 + 0x34b40: 0x6cf83820, 0x34b41: 0x6cf83a20, 0x34b42: 0x6cf83c20, 0x34b43: 0x6cf83e20, + 0x34b44: 0x6cf84020, 0x34b45: 0x6cf84220, 0x34b46: 0x6cf84420, 0x34b47: 0x6cf84620, + 0x34b48: 0x6cf84820, 0x34b49: 0x6cf84a20, 0x34b4a: 0x6cf84c20, 0x34b4b: 0x6cf84e20, + 0x34b4c: 0x6cf85020, 0x34b4d: 0x6cf85220, 0x34b4e: 0x6cf85420, 0x34b4f: 0x6cf85620, + 0x34b50: 0x6cf85820, 0x34b51: 0x6cf85a20, 0x34b52: 0x6cf85c20, 0x34b53: 0x6cf85e20, + 0x34b54: 0x6cf86020, 0x34b55: 0x6cf86220, 0x34b56: 0x6cf86420, 0x34b57: 0x6cf86620, + 0x34b58: 0x6cf86820, 0x34b59: 0x6cf86a20, 0x34b5a: 0x6cf86c20, 0x34b5b: 0x6cf86e20, + 0x34b5c: 0x6cf87020, 0x34b5d: 0x6cf87220, 0x34b5e: 0x6cf87420, 0x34b5f: 0x6cf87620, + 0x34b60: 0x6cf87820, 0x34b61: 0x6cf87a20, 0x34b62: 0x6cf87c20, 0x34b63: 0x6cf87e20, + 0x34b64: 0x6cf88020, 0x34b65: 0x6cf88220, 0x34b66: 0x6cf88420, 0x34b67: 0x6cf88620, + 0x34b68: 0x6cf88820, 0x34b69: 0x6cf88a20, 0x34b6a: 0x6d26fc20, 0x34b6b: 0x6d26fe20, + 0x34b6c: 0x6d270020, 0x34b6d: 0x6d270220, 0x34b6e: 0x6d270420, 0x34b6f: 0x6d270620, + 0x34b70: 0x6d270820, 0x34b71: 0x6d270a20, 0x34b72: 0x6d270c20, 0x34b73: 0x6d270e20, + 0x34b74: 0x6d271020, 0x34b75: 0x6d271220, 0x34b76: 0x6d271420, 0x34b77: 0x6d271620, + 0x34b78: 0x6d271820, 0x34b79: 0x6d271a20, 0x34b7a: 0x6d271c20, 0x34b7b: 0x6d271e20, + 0x34b7c: 0x6d272020, 0x34b7d: 0x6d272220, 0x34b7e: 0x6d272420, 0x34b7f: 0x6d272620, + // Block 0xd2e, offset 0x34b80 + 0x34b80: 0x6d272820, 0x34b81: 0x6d272a20, 0x34b82: 0x6d272c20, 0x34b83: 0x6d272e20, + 0x34b84: 0x6d273020, 0x34b85: 0x6d273220, 0x34b86: 0x6d273420, 0x34b87: 0x6d273620, + 0x34b88: 0x6d273820, 0x34b89: 0x6d273a20, 0x34b8a: 0x6d273c20, 0x34b8b: 0x6d273e20, + 0x34b8c: 0x6d274020, 0x34b8d: 0x6d274220, 0x34b8e: 0x6d274420, 0x34b8f: 0x6d274620, + 0x34b90: 0x6d274820, 0x34b91: 0x6d274a20, 0x34b92: 0x6d274c20, 0x34b93: 0x6d274e20, + 0x34b94: 0x6d275020, 0x34b95: 0x6d275220, 0x34b96: 0x6d275420, 0x34b97: 0x6d275620, + 0x34b98: 0x6d275820, 0x34b99: 0x6d275a20, 0x34b9a: 0x6d275c20, 0x34b9b: 0x6d275e20, + 0x34b9c: 0x6d276020, 0x34b9d: 0x6d276220, 0x34b9e: 0x6d276420, 0x34b9f: 0x6d276620, + 0x34ba0: 0x6d276820, 0x34ba1: 0x6d276a20, 0x34ba2: 0x6d276c20, 0x34ba3: 0x6d276e20, + 0x34ba4: 0x6d277020, 0x34ba5: 0x6d277220, 0x34ba6: 0x6d277420, 0x34ba7: 0x6d277620, + 0x34ba8: 0x6d277820, 0x34ba9: 0x6d277a20, 0x34baa: 0x6d277c20, 0x34bab: 0x6d277e20, + 0x34bac: 0x6d278020, 0x34bad: 0x6d278220, 0x34bae: 0x6d278420, 0x34baf: 0x6d278620, + 0x34bb0: 0x6d278820, 0x34bb1: 0x6d278a20, 0x34bb2: 0x6d278c20, 0x34bb3: 0x6d278e20, + 0x34bb4: 0x6d279020, 0x34bb5: 0x6d279220, 0x34bb6: 0x6d279420, 0x34bb7: 0x6d279620, + 0x34bb8: 0x6d279820, 0x34bb9: 0x6d279a20, 0x34bba: 0x6d279c20, 0x34bbb: 0x6d279e20, + 0x34bbc: 0x6d27a020, 0x34bbd: 0x6d27a220, 0x34bbe: 0x6d27a420, 0x34bbf: 0x6d27a620, + // Block 0xd2f, offset 0x34bc0 + 0x34bc0: 0x6d27a820, 0x34bc1: 0x6d27aa20, 0x34bc2: 0x6d27ac20, 0x34bc3: 0x6d27ae20, + 0x34bc4: 0x6d27b020, 0x34bc5: 0x6d27b220, 0x34bc6: 0x6d27b420, 0x34bc7: 0x6d27b620, + 0x34bc8: 0x6d27b820, 0x34bc9: 0x6d27ba20, 0x34bca: 0x6d27bc20, 0x34bcb: 0x6d27be20, + 0x34bcc: 0x6d27c020, 0x34bcd: 0x6d27c220, 0x34bce: 0x6d27c420, 0x34bcf: 0x6d27c620, + 0x34bd0: 0x6d27c820, 0x34bd1: 0x6d27ca20, 0x34bd2: 0x6d27cc20, 0x34bd3: 0x6d27ce20, + 0x34bd4: 0x6d27d020, 0x34bd5: 0x6d546220, 0x34bd6: 0x6d546420, 0x34bd7: 0x6d546620, + 0x34bd8: 0x6d546820, 0x34bd9: 0x6d546a20, 0x34bda: 0x6d546c20, 0x34bdb: 0x6d546e20, + 0x34bdc: 0x6d547020, 0x34bdd: 0x6d547220, 0x34bde: 0x6d547420, 0x34bdf: 0x6d547620, + 0x34be0: 0x6d547820, 0x34be1: 0x6d547a20, 0x34be2: 0x6d547c20, 0x34be3: 0x6d547e20, + 0x34be4: 0x6d548020, 0x34be5: 0x6d548220, 0x34be6: 0x6d548420, 0x34be7: 0x6d548620, + 0x34be8: 0x6d548820, 0x34be9: 0x6d548a20, 0x34bea: 0x6d548c20, 0x34beb: 0x6d548e20, + 0x34bec: 0x6d549020, 0x34bed: 0x6d549220, 0x34bee: 0x6d549420, 0x34bef: 0x6d549620, + 0x34bf0: 0x6d549820, 0x34bf1: 0x6d549a20, 0x34bf2: 0x6d549c20, 0x34bf3: 0x6d549e20, + 0x34bf4: 0x6d54a020, 0x34bf5: 0x6d54a220, 0x34bf6: 0x6d54a420, 0x34bf7: 0x6d54a620, + 0x34bf8: 0x6d54a820, 0x34bf9: 0x6d54aa20, 0x34bfa: 0x6d54ac20, 0x34bfb: 0x6d54ae20, + 0x34bfc: 0x6d54b020, 0x34bfd: 0x6d54b220, 0x34bfe: 0x6d54b420, 0x34bff: 0x6d54b620, + // Block 0xd30, offset 0x34c00 + 0x34c00: 0x6d54b820, 0x34c01: 0x6d54ba20, 0x34c02: 0x6d54bc20, 0x34c03: 0x6d54be20, + 0x34c04: 0x6d54c020, 0x34c05: 0x6d54c220, 0x34c06: 0x6d54c420, 0x34c07: 0x6d54c620, + 0x34c08: 0x6d54c820, 0x34c09: 0x6d54ca20, 0x34c0a: 0x6d54cc20, 0x34c0b: 0x6d54ce20, + 0x34c0c: 0x6d54d020, 0x34c0d: 0x6d54d220, 0x34c0e: 0x6d54d420, 0x34c0f: 0x6d54d620, + 0x34c10: 0x6d54d820, 0x34c11: 0x6d54da20, 0x34c12: 0x6d7fc220, 0x34c13: 0x6d54dc20, + 0x34c14: 0x6d54de20, 0x34c15: 0x6d54e020, 0x34c16: 0x6d54e220, 0x34c17: 0x6d54e420, + 0x34c18: 0x6d54e620, 0x34c19: 0x6d54e820, 0x34c1a: 0x6d54ea20, 0x34c1b: 0x6d54ec20, + 0x34c1c: 0x6d54ee20, 0x34c1d: 0x6d54f020, 0x34c1e: 0x6d54f220, 0x34c1f: 0x6d54f420, + 0x34c20: 0x6d54f620, 0x34c21: 0x6d54f820, 0x34c22: 0x6d54fa20, 0x34c23: 0x6d54fc20, + 0x34c24: 0x6d54fe20, 0x34c25: 0x6d550020, 0x34c26: 0x6d550220, 0x34c27: 0x6d550420, + 0x34c28: 0x6d550620, 0x34c29: 0x6d550820, 0x34c2a: 0x6d550a20, 0x34c2b: 0x6d550c20, + 0x34c2c: 0x6d550e20, 0x34c2d: 0x6d551020, 0x34c2e: 0x6d551220, 0x34c2f: 0x6d551420, + 0x34c30: 0x6d551620, 0x34c31: 0x6d551820, 0x34c32: 0x6d551a20, 0x34c33: 0x6d551c20, + 0x34c34: 0x6d551e20, 0x34c35: 0x6d552020, 0x34c36: 0x6d552220, 0x34c37: 0x6d552420, + 0x34c38: 0x6d552620, 0x34c39: 0x6d552820, 0x34c3a: 0x6d552a20, 0x34c3b: 0x6d7fc420, + 0x34c3c: 0x6d7fc620, 0x34c3d: 0x6d7fc820, 0x34c3e: 0x6d7fca20, 0x34c3f: 0x6d7fcc20, + // Block 0xd31, offset 0x34c40 + 0x34c40: 0x6d7fce20, 0x34c41: 0x6d7fd020, 0x34c42: 0x6d7fd220, 0x34c43: 0x6d7fd420, + 0x34c44: 0x6d7fd620, 0x34c45: 0x6d7fd820, 0x34c46: 0x6d7fda20, 0x34c47: 0x6d7fdc20, + 0x34c48: 0x6d7fde20, 0x34c49: 0x6d7fe020, 0x34c4a: 0x6d7fe220, 0x34c4b: 0x6d7fe420, + 0x34c4c: 0x6d7fe620, 0x34c4d: 0x6d7fe820, 0x34c4e: 0x6d7fea20, 0x34c4f: 0x6d7fec20, + 0x34c50: 0x6d7fee20, 0x34c51: 0x6d7ff020, 0x34c52: 0x6d7ff220, 0x34c53: 0x6d7ff420, + 0x34c54: 0x6d7ff620, 0x34c55: 0x6d7ff820, 0x34c56: 0x6d7ffa20, 0x34c57: 0x6d7ffc20, + 0x34c58: 0x6d7ffe20, 0x34c59: 0x6d800020, 0x34c5a: 0x6d800220, 0x34c5b: 0x6d800420, + 0x34c5c: 0x6d800620, 0x34c5d: 0x6d800820, 0x34c5e: 0x6d800a20, 0x34c5f: 0x6d800c20, + 0x34c60: 0x6d800e20, 0x34c61: 0x6d801020, 0x34c62: 0x6d801220, 0x34c63: 0x6d801420, + 0x34c64: 0x6d801620, 0x34c65: 0x6d801820, 0x34c66: 0x6d801a20, 0x34c67: 0x6d801c20, + 0x34c68: 0x6d801e20, 0x34c69: 0x6d802020, 0x34c6a: 0x6d802220, 0x34c6b: 0x6d802420, + 0x34c6c: 0x6d802620, 0x34c6d: 0x6d802820, 0x34c6e: 0x6d802a20, 0x34c6f: 0x6d802c20, + 0x34c70: 0x6d802e20, 0x34c71: 0x6d803020, 0x34c72: 0x6d803220, 0x34c73: 0x6d803420, + 0x34c74: 0x6d803620, 0x34c75: 0x6d803820, 0x34c76: 0x6d803a20, 0x34c77: 0x6d803c20, + 0x34c78: 0x6d803e20, 0x34c79: 0x6d804020, 0x34c7a: 0x6d804220, 0x34c7b: 0x6d804420, + 0x34c7c: 0x6d804620, 0x34c7d: 0x6d804820, 0x34c7e: 0x6d804a20, 0x34c7f: 0x6d804c20, + // Block 0xd32, offset 0x34c80 + 0x34c80: 0x6d804e20, 0x34c81: 0x6d805020, 0x34c82: 0x6d805220, 0x34c83: 0x6d805420, + 0x34c84: 0x6d805620, 0x34c85: 0x6d805820, 0x34c86: 0x6d805a20, 0x34c87: 0x6d805c20, + 0x34c88: 0x6d805e20, 0x34c89: 0x6d806020, 0x34c8a: 0x6d806220, 0x34c8b: 0x6d806420, + 0x34c8c: 0x6d806620, 0x34c8d: 0x6d806820, 0x34c8e: 0x6d806a20, 0x34c8f: 0x6d806c20, + 0x34c90: 0x6d806e20, 0x34c91: 0x6d807020, 0x34c92: 0x6d807220, 0x34c93: 0x6d807420, + 0x34c94: 0x6d807620, 0x34c95: 0x6d807820, 0x34c96: 0x6d807a20, 0x34c97: 0x6d807c20, + 0x34c98: 0x6d807e20, 0x34c99: 0x6d808020, 0x34c9a: 0x6d808220, 0x34c9b: 0x6d808420, + 0x34c9c: 0x6d808620, 0x34c9d: 0x6d808820, 0x34c9e: 0x6d808a20, 0x34c9f: 0x6d808c20, + 0x34ca0: 0x6d808e20, 0x34ca1: 0x6d809020, 0x34ca2: 0x6d809220, 0x34ca3: 0x6d809420, + 0x34ca4: 0x6d809620, 0x34ca5: 0x6d809820, 0x34ca6: 0x6d809a20, 0x34ca7: 0x6d809c20, + 0x34ca8: 0x6d809e20, 0x34ca9: 0x6d80a020, 0x34caa: 0x6d80a220, 0x34cab: 0x6d80a420, + 0x34cac: 0x6d80a620, 0x34cad: 0x6d80a820, 0x34cae: 0x6d80aa20, 0x34caf: 0x6d80ac20, + 0x34cb0: 0x6da63820, 0x34cb1: 0x6da63a20, 0x34cb2: 0x6da63c20, 0x34cb3: 0x6da63e20, + 0x34cb4: 0x6da64020, 0x34cb5: 0x6da64220, 0x34cb6: 0x6da64420, 0x34cb7: 0x6da64620, + 0x34cb8: 0x6da64820, 0x34cb9: 0x6da64a20, 0x34cba: 0x6da64c20, 0x34cbb: 0x6da64e20, + 0x34cbc: 0x6da65020, 0x34cbd: 0x6da65220, 0x34cbe: 0x6da65420, 0x34cbf: 0x6da65620, + // Block 0xd33, offset 0x34cc0 + 0x34cc0: 0x6da65820, 0x34cc1: 0x6da65a20, 0x34cc2: 0x6da65c20, 0x34cc3: 0x6da65e20, + 0x34cc4: 0x6da66020, 0x34cc5: 0x6da66220, 0x34cc6: 0x6da66420, 0x34cc7: 0x6da66620, + 0x34cc8: 0x6da66820, 0x34cc9: 0x6da66a20, 0x34cca: 0x6da66c20, 0x34ccb: 0x6da66e20, + 0x34ccc: 0x6da67020, 0x34ccd: 0x6da67220, 0x34cce: 0x6da67420, 0x34ccf: 0x6da67620, + 0x34cd0: 0x6da67820, 0x34cd1: 0x6da67a20, 0x34cd2: 0x6da67c20, 0x34cd3: 0x6da67e20, + 0x34cd4: 0x6da68020, 0x34cd5: 0x6da68220, 0x34cd6: 0x6da68420, 0x34cd7: 0x6da68620, + 0x34cd8: 0x6da68820, 0x34cd9: 0x6da68a20, 0x34cda: 0x6da68c20, 0x34cdb: 0x6da68e20, + 0x34cdc: 0x6da69020, 0x34cdd: 0x6da69220, 0x34cde: 0x6da69420, 0x34cdf: 0x6da69620, + 0x34ce0: 0x6da69820, 0x34ce1: 0x6da69a20, 0x34ce2: 0x6d883220, 0x34ce3: 0x6da69c20, + 0x34ce4: 0x6da69e20, 0x34ce5: 0x6da6a020, 0x34ce6: 0x6da6a220, 0x34ce7: 0x6da6a420, + 0x34ce8: 0x6da6a620, 0x34ce9: 0x6da6a820, 0x34cea: 0x6da6aa20, 0x34ceb: 0x6da6ac20, + 0x34cec: 0x6da6ae20, 0x34ced: 0x6da6b020, 0x34cee: 0x6da6b220, 0x34cef: 0x6da6b420, + 0x34cf0: 0x6da6b620, 0x34cf1: 0x6da6b820, 0x34cf2: 0x6da6ba20, 0x34cf3: 0x6da6bc20, + 0x34cf4: 0x6da6be20, 0x34cf5: 0x6da6c020, 0x34cf6: 0x6da6c220, 0x34cf7: 0x6da6c420, + 0x34cf8: 0x6da6c620, 0x34cf9: 0x6da6c820, 0x34cfa: 0x6da6ca20, 0x34cfb: 0x6da6cc20, + 0x34cfc: 0x6da6ce20, 0x34cfd: 0x6da6d020, 0x34cfe: 0x6da6d220, 0x34cff: 0x6da6d420, + // Block 0xd34, offset 0x34d00 + 0x34d00: 0x6da6d620, 0x34d01: 0x6dc7a220, 0x34d02: 0x6dc7a420, 0x34d03: 0x6dc7a620, + 0x34d04: 0x6dc7a820, 0x34d05: 0x6dc7aa20, 0x34d06: 0x6dc7ac20, 0x34d07: 0x6dc7ae20, + 0x34d08: 0x6dc7b020, 0x34d09: 0x6dc7b220, 0x34d0a: 0x6dc7b420, 0x34d0b: 0x6dc7b620, + 0x34d0c: 0x6dc7b820, 0x34d0d: 0x6dc7ba20, 0x34d0e: 0x6dc7bc20, 0x34d0f: 0x6dc7be20, + 0x34d10: 0x6dc7c020, 0x34d11: 0x6dc7c220, 0x34d12: 0x6dc7c420, 0x34d13: 0x6dc7c620, + 0x34d14: 0x6dc7c820, 0x34d15: 0x6dc7ca20, 0x34d16: 0x6dc7cc20, 0x34d17: 0x6dc7ce20, + 0x34d18: 0x6dc7d020, 0x34d19: 0x6de40020, 0x34d1a: 0x6dc7d220, 0x34d1b: 0x6dc7d420, + 0x34d1c: 0x6dc7d620, 0x34d1d: 0x6dc7d820, 0x34d1e: 0x6dc7da20, 0x34d1f: 0x6dc7dc20, + 0x34d20: 0x6dc7de20, 0x34d21: 0x6dc7e020, 0x34d22: 0x6dc7e220, 0x34d23: 0x6dc7e420, + 0x34d24: 0x6dc7e620, 0x34d25: 0x6dc7e820, 0x34d26: 0x6dc7ea20, 0x34d27: 0x6dc7ec20, + 0x34d28: 0x6dc7ee20, 0x34d29: 0x6dc7f020, 0x34d2a: 0x6dc7f220, 0x34d2b: 0x6dc7f420, + 0x34d2c: 0x6dc7f620, 0x34d2d: 0x6dc7f820, 0x34d2e: 0x6dc7fa20, 0x34d2f: 0x6dc7fc20, + 0x34d30: 0x6dc7fe20, 0x34d31: 0x6dc80020, 0x34d32: 0x6dc80220, 0x34d33: 0x6dc80420, + 0x34d34: 0x6dc80620, 0x34d35: 0x6dc80820, 0x34d36: 0x6dc80a20, 0x34d37: 0x6dc80c20, + 0x34d38: 0x6dc80e20, 0x34d39: 0x6dc81020, 0x34d3a: 0x6dc81220, 0x34d3b: 0x6dc81420, + 0x34d3c: 0x6dc81620, 0x34d3d: 0x6dc81820, 0x34d3e: 0x6dc81a20, 0x34d3f: 0x6dc81c20, + // Block 0xd35, offset 0x34d40 + 0x34d40: 0x6dc81e20, 0x34d41: 0x6dc82020, 0x34d42: 0x6dc82220, 0x34d43: 0x6dc82420, + 0x34d44: 0x6dc82620, 0x34d45: 0x6dc82820, 0x34d46: 0x6dc82a20, 0x34d47: 0x6dc82c20, + 0x34d48: 0x6dc82e20, 0x34d49: 0x6dc83020, 0x34d4a: 0x6dc83220, 0x34d4b: 0x6dc83420, + 0x34d4c: 0x6dc83620, 0x34d4d: 0x6dc83820, 0x34d4e: 0x6dc83a20, 0x34d4f: 0x6dcc7220, + 0x34d50: 0x6de40220, 0x34d51: 0x6de40420, 0x34d52: 0x6de40620, 0x34d53: 0x6de40820, + 0x34d54: 0x6de40a20, 0x34d55: 0x6de40c20, 0x34d56: 0x6de40e20, 0x34d57: 0x6de41020, + 0x34d58: 0x6de41220, 0x34d59: 0x6de41420, 0x34d5a: 0x6de41620, 0x34d5b: 0x6de41820, + 0x34d5c: 0x6de41a20, 0x34d5d: 0x6de41c20, 0x34d5e: 0x6de41e20, 0x34d5f: 0x6de42020, + 0x34d60: 0x6de42220, 0x34d61: 0x6de42420, 0x34d62: 0x6de42620, 0x34d63: 0x6de42820, + 0x34d64: 0x6de42a20, 0x34d65: 0x6de42c20, 0x34d66: 0x6de42e20, 0x34d67: 0x6de43020, + 0x34d68: 0x6de43220, 0x34d69: 0x6de43420, 0x34d6a: 0x6de43620, 0x34d6b: 0x6de43820, + 0x34d6c: 0x6de43a20, 0x34d6d: 0x6de43c20, 0x34d6e: 0x6de43e20, 0x34d6f: 0x6de44020, + 0x34d70: 0x6de44220, 0x34d71: 0x6de44420, 0x34d72: 0x6de44620, 0x34d73: 0x6de44820, + 0x34d74: 0x6de44a20, 0x34d75: 0x6de44c20, 0x34d76: 0x6de44e20, 0x34d77: 0x6de45020, + 0x34d78: 0x6de45220, 0x34d79: 0x6de45420, 0x34d7a: 0x6de45620, 0x34d7b: 0x6de45820, + 0x34d7c: 0x6de45a20, 0x34d7d: 0x6de45c20, 0x34d7e: 0x6de45e20, 0x34d7f: 0x6de46020, + // Block 0xd36, offset 0x34d80 + 0x34d80: 0x6de46220, 0x34d81: 0x6de46420, 0x34d82: 0x6de46620, 0x34d83: 0x6de46820, + 0x34d84: 0x6dfb3a20, 0x34d85: 0x6dfb3c20, 0x34d86: 0x6dfb3e20, 0x34d87: 0x6dfb4020, + 0x34d88: 0x6dfb4220, 0x34d89: 0x6dfb4420, 0x34d8a: 0x6dfb4620, 0x34d8b: 0x6dfb4820, + 0x34d8c: 0x6dfb4a20, 0x34d8d: 0x6dfb4c20, 0x34d8e: 0x6dfb4e20, 0x34d8f: 0x6dfb5020, + 0x34d90: 0x6dfb5220, 0x34d91: 0x6de46a20, 0x34d92: 0x6dfb5420, 0x34d93: 0x6dfb5620, + 0x34d94: 0x6dfb5820, 0x34d95: 0x6dfb5a20, 0x34d96: 0x6dfb5c20, 0x34d97: 0x6dfb5e20, + 0x34d98: 0x6dfb6020, 0x34d99: 0x6dfb6220, 0x34d9a: 0x6dfb6420, 0x34d9b: 0x6dfb6620, + 0x34d9c: 0x6dfb6820, 0x34d9d: 0x6dfb6a20, 0x34d9e: 0x6dfb6c20, 0x34d9f: 0x6dfb6e20, + 0x34da0: 0x6dfb7020, 0x34da1: 0x6dfb7220, 0x34da2: 0x6dfb7420, 0x34da3: 0x6dfb7620, + 0x34da4: 0x6dfb7820, 0x34da5: 0x6dfb7a20, 0x34da6: 0x6dfb7c20, 0x34da7: 0x6dfb7e20, + 0x34da8: 0x6dfb8020, 0x34da9: 0x6dfb8220, 0x34daa: 0x6dfb8420, 0x34dab: 0x6dfb8620, + 0x34dac: 0x6dfb8820, 0x34dad: 0x6dfb8a20, 0x34dae: 0x6dfb8c20, 0x34daf: 0x6e0e7e20, + 0x34db0: 0x6e0e8020, 0x34db1: 0x6e0e8220, 0x34db2: 0x6e0e8420, 0x34db3: 0x6e0e8620, + 0x34db4: 0x6e0e8820, 0x34db5: 0x6e0e8a20, 0x34db6: 0x6e0e8c20, 0x34db7: 0x6e0e8e20, + 0x34db8: 0x6e0e9020, 0x34db9: 0x6e0e9220, 0x34dba: 0x6e0e9420, 0x34dbb: 0x6e0e9620, + 0x34dbc: 0x6e0e9820, 0x34dbd: 0x6e0e9a20, 0x34dbe: 0x6e0e9c20, 0x34dbf: 0x6e0e9e20, + // Block 0xd37, offset 0x34dc0 + 0x34dc0: 0x6e0ea020, 0x34dc1: 0x6e0ea220, 0x34dc2: 0x6e1dc820, 0x34dc3: 0x6e0ea420, + 0x34dc4: 0x6e0ea620, 0x34dc5: 0x6e0ea820, 0x34dc6: 0x6e0eaa20, 0x34dc7: 0x6e0eac20, + 0x34dc8: 0x6e0eae20, 0x34dc9: 0x6e0eb020, 0x34dca: 0x6e0eb220, 0x34dcb: 0x6e0eb420, + 0x34dcc: 0x6e0eb620, 0x34dcd: 0x6e0eb820, 0x34dce: 0x6e0eba20, 0x34dcf: 0x6e0ebc20, + 0x34dd0: 0x6e0ebe20, 0x34dd1: 0x6e0ec020, 0x34dd2: 0x6e0ec220, 0x34dd3: 0x6e0ec420, + 0x34dd4: 0x6e0ec620, 0x34dd5: 0x6e0ec820, 0x34dd6: 0x6e0eca20, 0x34dd7: 0x6e0ecc20, + 0x34dd8: 0x6e0ece20, 0x34dd9: 0x6e1dca20, 0x34dda: 0x6e1dcc20, 0x34ddb: 0x6e1dce20, + 0x34ddc: 0x6e1dd020, 0x34ddd: 0x6e1dd220, 0x34dde: 0x6e1dd420, 0x34ddf: 0x6e1dd620, + 0x34de0: 0x6e1dd820, 0x34de1: 0x6e1dda20, 0x34de2: 0x6e1ddc20, 0x34de3: 0x6e1dde20, + 0x34de4: 0x6e1de020, 0x34de5: 0x6e1de220, 0x34de6: 0x6e1de420, 0x34de7: 0x6e1de620, + 0x34de8: 0x6e1de820, 0x34de9: 0x6e1dea20, 0x34dea: 0x6e1dec20, 0x34deb: 0x6e1dee20, + 0x34dec: 0x6e1df020, 0x34ded: 0x6e1df220, 0x34dee: 0x6e1df420, 0x34def: 0x6e1df620, + 0x34df0: 0x6e1df820, 0x34df1: 0x6e1dfa20, 0x34df2: 0x6e1dfc20, 0x34df3: 0x6e1dfe20, + 0x34df4: 0x6e1e0020, 0x34df5: 0x6e1e0220, 0x34df6: 0x6e1e0420, 0x34df7: 0x6e294a20, + 0x34df8: 0x6e294c20, 0x34df9: 0x6e294e20, 0x34dfa: 0x6e295020, 0x34dfb: 0x6e295220, + 0x34dfc: 0x6e295420, 0x34dfd: 0x6e295620, 0x34dfe: 0x6e295820, 0x34dff: 0x6e295a20, + // Block 0xd38, offset 0x34e00 + 0x34e00: 0x6e295c20, 0x34e01: 0x6e295e20, 0x34e02: 0x6e296020, 0x34e03: 0x6e296220, + 0x34e04: 0x6e296420, 0x34e05: 0x6e296620, 0x34e06: 0x6e296820, 0x34e07: 0x6e296a20, + 0x34e08: 0x6e296c20, 0x34e09: 0x6e296e20, 0x34e0a: 0x6e297020, 0x34e0b: 0x6e326420, + 0x34e0c: 0x6e326620, 0x34e0d: 0x6e326820, 0x34e0e: 0x6e326a20, 0x34e0f: 0x6e326c20, + 0x34e10: 0x6e326e20, 0x34e11: 0x6e327020, 0x34e12: 0x6e327220, 0x34e13: 0x6e327420, + 0x34e14: 0x6e327620, 0x34e15: 0x6e327820, 0x34e16: 0x6e327a20, 0x34e17: 0x6e327c20, + 0x34e18: 0x6e327e20, 0x34e19: 0x6e328020, 0x34e1a: 0x6e328220, 0x34e1b: 0x6e328420, + 0x34e1c: 0x6e328620, 0x34e1d: 0x6e328820, 0x34e1e: 0x6e38bc20, 0x34e1f: 0x6e38be20, + 0x34e20: 0x6e38c020, 0x34e21: 0x6e38c220, 0x34e22: 0x6e38c420, 0x34e23: 0x6e38c620, + 0x34e24: 0x6e38c820, 0x34e25: 0x6e38ca20, 0x34e26: 0x6e38cc20, 0x34e27: 0x6e38ce20, + 0x34e28: 0x6e38d020, 0x34e29: 0x6e3d3220, 0x34e2a: 0x6e3d3420, 0x34e2b: 0x6e3d3620, + 0x34e2c: 0x6e3d3820, 0x34e2d: 0x6e3d3a20, 0x34e2e: 0x6e3d3c20, 0x34e2f: 0x6e3d3e20, + 0x34e30: 0x6e3d4020, 0x34e31: 0x6e3d4220, 0x34e32: 0x6e404e20, 0x34e33: 0x6e401020, + 0x34e34: 0x6e405020, 0x34e35: 0x6e405220, 0x34e36: 0x6e42aa20, 0x34e37: 0x6e42ac20, + 0x34e38: 0x6e42ae20, 0x34e39: 0x6e443020, 0x34e3a: 0x6e451e20, 0x34e3b: 0x6e452020, + 0x34e3c: 0x6e45c220, 0x34e3d: 0x6e462c20, 0x34e3e: 0x6e462e20, 0x34e3f: 0x6e46b020, + // Block 0xd39, offset 0x34e40 + 0x34e40: 0x6c12b820, 0x34e41: 0x6c223e20, 0x34e42: 0x6c224020, 0x34e43: 0x6c224220, + 0x34e44: 0x6c224420, 0x34e45: 0x6c224620, 0x34e46: 0x6c224820, 0x34e47: 0x6c224a20, + 0x34e48: 0x6c224c20, 0x34e49: 0x6c377620, 0x34e4a: 0x6c377820, 0x34e4b: 0x6c377a20, + 0x34e4c: 0x6c377c20, 0x34e4d: 0x6c377e20, 0x34e4e: 0x6c378020, 0x34e4f: 0x6c378220, + 0x34e50: 0x6c378420, 0x34e51: 0x6c378620, 0x34e52: 0x6c378820, 0x34e53: 0x6c378a20, + 0x34e54: 0x6c378c20, 0x34e55: 0x6c378e20, 0x34e56: 0x6c379020, 0x34e57: 0x6c52d420, + 0x34e58: 0x6c52d620, 0x34e59: 0x6c52d820, 0x34e5a: 0x6c52da20, 0x34e5b: 0x6c52dc20, + 0x34e5c: 0x6c52de20, 0x34e5d: 0x6c52e020, 0x34e5e: 0x6c52e220, 0x34e5f: 0x6c52e420, + 0x34e60: 0x6c52e620, 0x34e61: 0x6c52e820, 0x34e62: 0x6c52ea20, 0x34e63: 0x6c52ec20, + 0x34e64: 0x6c52ee20, 0x34e65: 0x6c52f020, 0x34e66: 0x6c52f220, 0x34e67: 0x6c756020, + 0x34e68: 0x6c756220, 0x34e69: 0x6c756420, 0x34e6a: 0x6c756620, 0x34e6b: 0x6c756820, + 0x34e6c: 0x6c756a20, 0x34e6d: 0x6c756c20, 0x34e6e: 0x6c756e20, 0x34e6f: 0x6c757020, + 0x34e70: 0x6c757220, 0x34e71: 0x6c757420, 0x34e72: 0x6c757620, 0x34e73: 0x6c757820, + 0x34e74: 0x6c757a20, 0x34e75: 0x6c757c20, 0x34e76: 0x6c757e20, 0x34e77: 0x6c758020, + 0x34e78: 0x6c758220, 0x34e79: 0x6c758420, 0x34e7a: 0x6c9dba20, 0x34e7b: 0x6c9dbc20, + 0x34e7c: 0x6c9dbe20, 0x34e7d: 0x6c9dc020, 0x34e7e: 0x6c9dc220, 0x34e7f: 0x6c9dc420, + // Block 0xd3a, offset 0x34e80 + 0x34e80: 0x6c9dc620, 0x34e81: 0x6c9dc820, 0x34e82: 0x6c9dca20, 0x34e83: 0x6c9dcc20, + 0x34e84: 0x6c9dce20, 0x34e85: 0x6c9dd020, 0x34e86: 0x6c9dd220, 0x34e87: 0x6c9dd420, + 0x34e88: 0x6ccaa620, 0x34e89: 0x6ccaa820, 0x34e8a: 0x6ccaaa20, 0x34e8b: 0x6ccaac20, + 0x34e8c: 0x6ccaae20, 0x34e8d: 0x6ccab020, 0x34e8e: 0x6ccab220, 0x34e8f: 0x6ccab420, + 0x34e90: 0x6ccab620, 0x34e91: 0x6ccab820, 0x34e92: 0x6ccaba20, 0x34e93: 0x6ccabc20, + 0x34e94: 0x6ccabe20, 0x34e95: 0x6ccac020, 0x34e96: 0x6ccac220, 0x34e97: 0x6ccac420, + 0x34e98: 0x6ccac620, 0x34e99: 0x6ccac820, 0x34e9a: 0x6ccaca20, 0x34e9b: 0x6ccacc20, + 0x34e9c: 0x6ccace20, 0x34e9d: 0x6cf8da20, 0x34e9e: 0x6cf8dc20, 0x34e9f: 0x6cf8de20, + 0x34ea0: 0x6cf8e020, 0x34ea1: 0x6cf8e220, 0x34ea2: 0x6cf8e420, 0x34ea3: 0x6cf8e620, + 0x34ea4: 0x6cf8e820, 0x34ea5: 0x6cf8ea20, 0x34ea6: 0x6cf8ec20, 0x34ea7: 0x6cf8ee20, + 0x34ea8: 0x6cf8f020, 0x34ea9: 0x6cf8f220, 0x34eaa: 0x6cf8f420, 0x34eab: 0x6cf8f620, + 0x34eac: 0x6d0f4820, 0x34ead: 0x6cf8f820, 0x34eae: 0x6cf8fa20, 0x34eaf: 0x6cf8fc20, + 0x34eb0: 0x6cf8fe20, 0x34eb1: 0x6cf90020, 0x34eb2: 0x6d281220, 0x34eb3: 0x6d281420, + 0x34eb4: 0x6d281620, 0x34eb5: 0x6d281820, 0x34eb6: 0x6d281a20, 0x34eb7: 0x6d281c20, + 0x34eb8: 0x6d281e20, 0x34eb9: 0x6d282020, 0x34eba: 0x6d282220, 0x34ebb: 0x6d282420, + 0x34ebc: 0x6d282620, 0x34ebd: 0x6d282820, 0x34ebe: 0x6d282a20, 0x34ebf: 0x6d282c20, + // Block 0xd3b, offset 0x34ec0 + 0x34ec0: 0x6d282e20, 0x34ec1: 0x6d283020, 0x34ec2: 0x6d283220, 0x34ec3: 0x6d283420, + 0x34ec4: 0x6d283620, 0x34ec5: 0x6d283820, 0x34ec6: 0x6d283a20, 0x34ec7: 0x6d283c20, + 0x34ec8: 0x6d556220, 0x34ec9: 0x6d556420, 0x34eca: 0x6d556620, 0x34ecb: 0x6d556820, + 0x34ecc: 0x6d556a20, 0x34ecd: 0x6d556c20, 0x34ece: 0x6d556e20, 0x34ecf: 0x6d557020, + 0x34ed0: 0x6d557220, 0x34ed1: 0x6d557420, 0x34ed2: 0x6d557620, 0x34ed3: 0x6d557820, + 0x34ed4: 0x6d557a20, 0x34ed5: 0x6d557c20, 0x34ed6: 0x6d557e20, 0x34ed7: 0x6d558020, + 0x34ed8: 0x6d80e220, 0x34ed9: 0x6d80e420, 0x34eda: 0x6d80e620, 0x34edb: 0x6d80e820, + 0x34edc: 0x6d80ea20, 0x34edd: 0x6d80ec20, 0x34ede: 0x6d80ee20, 0x34edf: 0x6d80f020, + 0x34ee0: 0x6da70220, 0x34ee1: 0x6da70420, 0x34ee2: 0x6da70620, 0x34ee3: 0x6da70820, + 0x34ee4: 0x6da70a20, 0x34ee5: 0x6da70c20, 0x34ee6: 0x6da70e20, 0x34ee7: 0x6da71020, + 0x34ee8: 0x6dc85420, 0x34ee9: 0x6dc85620, 0x34eea: 0x6dc85820, 0x34eeb: 0x6dc85a20, + 0x34eec: 0x6de47e20, 0x34eed: 0x6de48020, 0x34eee: 0x6de48220, 0x34eef: 0x6de48420, + 0x34ef0: 0x6de48620, 0x34ef1: 0x6dfb9c20, 0x34ef2: 0x6dfb9e20, 0x34ef3: 0x6dfba020, + 0x34ef4: 0x6e0ed820, 0x34ef5: 0x6e0eda20, 0x34ef6: 0x6e1e1020, 0x34ef7: 0x6e0edc20, + 0x34ef8: 0x6e0ede20, 0x34ef9: 0x6e1e1220, 0x34efa: 0x6e1e1420, 0x34efb: 0x6e1e1620, + 0x34efc: 0x6e1e1820, 0x34efd: 0x6e297820, 0x34efe: 0x6e329020, 0x34eff: 0x6e38d820, + // Block 0xd3c, offset 0x34f00 + 0x34f00: 0x6e38da20, 0x34f01: 0x6e3d4620, 0x34f02: 0x6c04ac20, 0x34f03: 0x6c097820, + 0x34f04: 0x6c097a20, 0x34f05: 0x6c12be20, 0x34f06: 0x6c12c020, 0x34f07: 0x6c225420, + 0x34f08: 0x6c225620, 0x34f09: 0x6c379c20, 0x34f0a: 0x6c225820, 0x34f0b: 0x6c225a20, + 0x34f0c: 0x6c225c20, 0x34f0d: 0x6c379e20, 0x34f0e: 0x6c37a020, 0x34f0f: 0x6c37a220, + 0x34f10: 0x6c37a420, 0x34f11: 0x6c37a620, 0x34f12: 0x6c37a820, 0x34f13: 0x6c37aa20, + 0x34f14: 0x6c37ac20, 0x34f15: 0x6c37ae20, 0x34f16: 0x6c37b020, 0x34f17: 0x6c37b220, + 0x34f18: 0x6c37b420, 0x34f19: 0x6c37b620, 0x34f1a: 0x6c37b820, 0x34f1b: 0x6c37ba20, + 0x34f1c: 0x6c37bc20, 0x34f1d: 0x6c37be20, 0x34f1e: 0x6c37c020, 0x34f1f: 0x6c37c220, + 0x34f20: 0x6c37c420, 0x34f21: 0x6c37c620, 0x34f22: 0x6c530220, 0x34f23: 0x6c530420, + 0x34f24: 0x6c530620, 0x34f25: 0x6c2bd020, 0x34f26: 0x6c758c20, 0x34f27: 0x6c758e20, + 0x34f28: 0x6c759020, 0x34f29: 0x6c759220, 0x34f2a: 0x6c759420, 0x34f2b: 0x6c759620, + 0x34f2c: 0x6c759820, 0x34f2d: 0x6c759a20, 0x34f2e: 0x6c759c20, 0x34f2f: 0x6c759e20, + 0x34f30: 0x6c75a020, 0x34f31: 0x6c75a220, 0x34f32: 0x6c6f0e20, 0x34f33: 0x6c9dda20, + 0x34f34: 0x6c9ddc20, 0x34f35: 0x6c9dde20, 0x34f36: 0x6c9de020, 0x34f37: 0x6c9de220, + 0x34f38: 0x6c9de420, 0x34f39: 0x6ccada20, 0x34f3a: 0x6ccadc20, 0x34f3b: 0x6ccade20, + 0x34f3c: 0x6ccae020, 0x34f3d: 0x6ccae220, 0x34f3e: 0x6ccae420, 0x34f3f: 0x6ccae620, + // Block 0xd3d, offset 0x34f40 + 0x34f40: 0x6ccae820, 0x34f41: 0x6ccaea20, 0x34f42: 0x6ccaec20, 0x34f43: 0x6ccaee20, + 0x34f44: 0x6ccaf020, 0x34f45: 0x6ccaf220, 0x34f46: 0x6ccaf420, 0x34f47: 0x6cf90c20, + 0x34f48: 0x6cf90e20, 0x34f49: 0x6cf91020, 0x34f4a: 0x6cf91220, 0x34f4b: 0x6d75b820, + 0x34f4c: 0x6cf91420, 0x34f4d: 0x6cf91620, 0x34f4e: 0x6cf91820, 0x34f4f: 0x6cf1c020, + 0x34f50: 0x6d284620, 0x34f51: 0x6d284820, 0x34f52: 0x6d284a20, 0x34f53: 0x6d284c20, + 0x34f54: 0x6d558820, 0x34f55: 0x6d558a20, 0x34f56: 0x6d558c20, 0x34f57: 0x6d558e20, + 0x34f58: 0x6d559020, 0x34f59: 0x6d559220, 0x34f5a: 0x6d559420, 0x34f5b: 0x6d559620, + 0x34f5c: 0x6d80f420, 0x34f5d: 0x6d80f620, 0x34f5e: 0x6d80f820, 0x34f5f: 0x6d80fa20, + 0x34f60: 0x6d80fc20, 0x34f61: 0x6da71220, 0x34f62: 0x6da71420, 0x34f63: 0x6da71620, + 0x34f64: 0x6da71820, 0x34f65: 0x6da71a20, 0x34f66: 0x6dc86020, 0x34f67: 0x6dc86220, + 0x34f68: 0x6dc86420, 0x34f69: 0x6dc86620, 0x34f6a: 0x6dc86820, 0x34f6b: 0x6dc86a20, + 0x34f6c: 0x6de48820, 0x34f6d: 0x6de20820, 0x34f6e: 0x6e0ee020, 0x34f6f: 0x6e1e1a20, + 0x34f70: 0x6e1e1c20, 0x34f71: 0x6e297a20, 0x34f72: 0x6e297c20, 0x34f73: 0x6e329420, + 0x34f74: 0x6e329620, 0x34f75: 0x6c04b020, 0x34f76: 0x6c04b220, 0x34f77: 0x6c097e20, + 0x34f78: 0x6c12c620, 0x34f79: 0x6c12c820, 0x34f7a: 0x6c12ca20, 0x34f7b: 0x6c12cc20, + 0x34f7c: 0x6c12ce20, 0x34f7d: 0x6c12d020, 0x34f7e: 0x6c12d220, 0x34f7f: 0x6c226020, + // Block 0xd3e, offset 0x34f80 + 0x34f80: 0x6c226220, 0x34f81: 0x6c226420, 0x34f82: 0x6c226620, 0x34f83: 0x6c226820, + 0x34f84: 0x6c226a20, 0x34f85: 0x6c226c20, 0x34f86: 0x6c226e20, 0x34f87: 0x6c227020, + 0x34f88: 0x6c227220, 0x34f89: 0x6c37dc20, 0x34f8a: 0x6c37de20, 0x34f8b: 0x6c37e020, + 0x34f8c: 0x6c37e220, 0x34f8d: 0x6c37e420, 0x34f8e: 0x6c37e620, 0x34f8f: 0x6c37e820, + 0x34f90: 0x6c37ea20, 0x34f91: 0x6c37ec20, 0x34f92: 0x6c37ee20, 0x34f93: 0x6c37f020, + 0x34f94: 0x6c37f220, 0x34f95: 0x6c37f420, 0x34f96: 0x6c37f620, 0x34f97: 0x6c37f820, + 0x34f98: 0x6c37fa20, 0x34f99: 0x6c37fc20, 0x34f9a: 0x6c37fe20, 0x34f9b: 0x6c380020, + 0x34f9c: 0x6c380220, 0x34f9d: 0x6c531a20, 0x34f9e: 0x6c531c20, 0x34f9f: 0x6c531e20, + 0x34fa0: 0x6c532020, 0x34fa1: 0x6c532220, 0x34fa2: 0x6c532420, 0x34fa3: 0x6c532620, + 0x34fa4: 0x6c532820, 0x34fa5: 0x6c532a20, 0x34fa6: 0x6c532c20, 0x34fa7: 0x6c532e20, + 0x34fa8: 0x6c533020, 0x34fa9: 0x6c533220, 0x34faa: 0x6c533420, 0x34fab: 0x6c533620, + 0x34fac: 0x6c533820, 0x34fad: 0x6c533a20, 0x34fae: 0x6c533c20, 0x34faf: 0x6c533e20, + 0x34fb0: 0x6c534020, 0x34fb1: 0x6c534220, 0x34fb2: 0x6c75b220, 0x34fb3: 0x6c75b420, + 0x34fb4: 0x6c75b620, 0x34fb5: 0x6c75b820, 0x34fb6: 0x6c75ba20, 0x34fb7: 0x6c75bc20, + 0x34fb8: 0x6c75be20, 0x34fb9: 0x6c75c020, 0x34fba: 0x6c75c220, 0x34fbb: 0x6c75c420, + 0x34fbc: 0x6c75c620, 0x34fbd: 0x6c75c820, 0x34fbe: 0x6c75ca20, 0x34fbf: 0x6c75cc20, + // Block 0xd3f, offset 0x34fc0 + 0x34fc0: 0x6c75ce20, 0x34fc1: 0x6c75d020, 0x34fc2: 0x6c75d220, 0x34fc3: 0x6c75d420, + 0x34fc4: 0x6c75d620, 0x34fc5: 0x6c9dfc20, 0x34fc6: 0x6c9dfe20, 0x34fc7: 0x6c9e0020, + 0x34fc8: 0x6c9e0220, 0x34fc9: 0x6c9e0420, 0x34fca: 0x6c9e0620, 0x34fcb: 0x6c9e0820, + 0x34fcc: 0x6c9e0a20, 0x34fcd: 0x6c9e0c20, 0x34fce: 0x6c9e0e20, 0x34fcf: 0x6c9e1020, + 0x34fd0: 0x6c9e1220, 0x34fd1: 0x6c9e1420, 0x34fd2: 0x6c9e1620, 0x34fd3: 0x6c9e1820, + 0x34fd4: 0x6c9e1a20, 0x34fd5: 0x6c9e1c20, 0x34fd6: 0x6ccb1220, 0x34fd7: 0x6ccb1420, + 0x34fd8: 0x6ccb1620, 0x34fd9: 0x6ccb1820, 0x34fda: 0x6ccb1a20, 0x34fdb: 0x6ccb1c20, + 0x34fdc: 0x6ccb1e20, 0x34fdd: 0x6ccb2020, 0x34fde: 0x6ccb2220, 0x34fdf: 0x6ccb2420, + 0x34fe0: 0x6ccb2620, 0x34fe1: 0x6ccb2820, 0x34fe2: 0x6ccb2a20, 0x34fe3: 0x6ccb2c20, + 0x34fe4: 0x6ccb2e20, 0x34fe5: 0x6ccb3020, 0x34fe6: 0x6ccb3220, 0x34fe7: 0x6ccb3420, + 0x34fe8: 0x6ccb3620, 0x34fe9: 0x6ccb3820, 0x34fea: 0x6ccb3a20, 0x34feb: 0x6ccb3c20, + 0x34fec: 0x6ccb3e20, 0x34fed: 0x6ccb4020, 0x34fee: 0x6ccb4220, 0x34fef: 0x6ccb4420, + 0x34ff0: 0x6ccb4620, 0x34ff1: 0x6cf93020, 0x34ff2: 0x6cf93220, 0x34ff3: 0x6cf93420, + 0x34ff4: 0x6cf93620, 0x34ff5: 0x6cf93820, 0x34ff6: 0x6cf93a20, 0x34ff7: 0x6cf93c20, + 0x34ff8: 0x6cf93e20, 0x34ff9: 0x6cf94020, 0x34ffa: 0x6cf94220, 0x34ffb: 0x6cf94420, + 0x34ffc: 0x6cf94620, 0x34ffd: 0x6cf94820, 0x34ffe: 0x6cf94a20, 0x34fff: 0x6cf94c20, + // Block 0xd40, offset 0x35000 + 0x35000: 0x6cf94e20, 0x35001: 0x6cf95020, 0x35002: 0x6cf95220, 0x35003: 0x6cf95420, + 0x35004: 0x6d286220, 0x35005: 0x6d286420, 0x35006: 0x6d286620, 0x35007: 0x6d286820, + 0x35008: 0x6d286a20, 0x35009: 0x6d286c20, 0x3500a: 0x6d286e20, 0x3500b: 0x6d287020, + 0x3500c: 0x6d287220, 0x3500d: 0x6d55a820, 0x3500e: 0x6d55aa20, 0x3500f: 0x6d55ac20, + 0x35010: 0x6d55ae20, 0x35011: 0x6d55b020, 0x35012: 0x6d55b220, 0x35013: 0x6d55b420, + 0x35014: 0x6d55b620, 0x35015: 0x6d55b820, 0x35016: 0x6d55ba20, 0x35017: 0x6d55bc20, + 0x35018: 0x6d55be20, 0x35019: 0x6d55c020, 0x3501a: 0x6d55c220, 0x3501b: 0x6d55c420, + 0x3501c: 0x6d55c620, 0x3501d: 0x6d811220, 0x3501e: 0x6d811420, 0x3501f: 0x6d811620, + 0x35020: 0x6d811820, 0x35021: 0x6d811a20, 0x35022: 0x6d811c20, 0x35023: 0x6d811e20, + 0x35024: 0x6d812020, 0x35025: 0x6d812220, 0x35026: 0x6d812420, 0x35027: 0x6d812620, + 0x35028: 0x6da72620, 0x35029: 0x6da72820, 0x3502a: 0x6da72a20, 0x3502b: 0x6da72c20, + 0x3502c: 0x6da72e20, 0x3502d: 0x6da73020, 0x3502e: 0x6da73220, 0x3502f: 0x6dc86e20, + 0x35030: 0x6dc87020, 0x35031: 0x6dc87220, 0x35032: 0x6dc87420, 0x35033: 0x6dc87620, + 0x35034: 0x6dc87820, 0x35035: 0x6dc87a20, 0x35036: 0x6dc87c20, 0x35037: 0x6de48e20, + 0x35038: 0x6de49020, 0x35039: 0x6dfba820, 0x3503a: 0x6dfbaa20, 0x3503b: 0x6dfbac20, + 0x3503c: 0x6e0ee420, 0x3503d: 0x6e0ee620, 0x3503e: 0x6e1e1e20, 0x3503f: 0x6e298020, + // Block 0xd41, offset 0x35040 + 0x35040: 0x6e298220, 0x35041: 0x6e298420, 0x35042: 0x6c380820, 0x35043: 0x6c380a20, + 0x35044: 0x6c380c20, 0x35045: 0x6c534c20, 0x35046: 0x6c534e20, 0x35047: 0x6c535020, + 0x35048: 0x6c75e220, 0x35049: 0x6c75e420, 0x3504a: 0x6c75e620, 0x3504b: 0x6c9e2a20, + 0x3504c: 0x6c9e2c20, 0x3504d: 0x6c9e2e20, 0x3504e: 0x6c9e3020, 0x3504f: 0x6c9e3220, + 0x35050: 0x6c9e3420, 0x35051: 0x6c9e3620, 0x35052: 0x6c9e3820, 0x35053: 0x6c9e3a20, + 0x35054: 0x6c9e3c20, 0x35055: 0x6c9e3e20, 0x35056: 0x6c9e4020, 0x35057: 0x6c9e4220, + 0x35058: 0x6c9e4420, 0x35059: 0x6ccb5420, 0x3505a: 0x6ccb5620, 0x3505b: 0x6ccb5820, + 0x3505c: 0x6ccb5a20, 0x3505d: 0x6ccb5c20, 0x3505e: 0x6ccb5e20, 0x3505f: 0x6ccb6020, + 0x35060: 0x6cf96020, 0x35061: 0x6cf96220, 0x35062: 0x6cf96420, 0x35063: 0x6cf96620, + 0x35064: 0x6cf96820, 0x35065: 0x6cf96a20, 0x35066: 0x6cf96c20, 0x35067: 0x6cf96e20, + 0x35068: 0x6cf97020, 0x35069: 0x6cf97220, 0x3506a: 0x6cf97420, 0x3506b: 0x6cf97620, + 0x3506c: 0x6cf97820, 0x3506d: 0x6d017c20, 0x3506e: 0x6d287c20, 0x3506f: 0x6d287e20, + 0x35070: 0x6d288020, 0x35071: 0x6d288220, 0x35072: 0x6d288420, 0x35073: 0x6d288620, + 0x35074: 0x6d288820, 0x35075: 0x6d288a20, 0x35076: 0x6d55ce20, 0x35077: 0x6d55d020, + 0x35078: 0x6d55d220, 0x35079: 0x6d55d420, 0x3507a: 0x6d55d620, 0x3507b: 0x6d813220, + 0x3507c: 0x6d813420, 0x3507d: 0x6d813620, 0x3507e: 0x6d813820, 0x3507f: 0x6d813a20, + // Block 0xd42, offset 0x35080 + 0x35080: 0x6d813c20, 0x35081: 0x6d813e20, 0x35082: 0x6d814020, 0x35083: 0x6d814220, + 0x35084: 0x6d814420, 0x35085: 0x6d814620, 0x35086: 0x6d814820, 0x35087: 0x6d814a20, + 0x35088: 0x6d814c20, 0x35089: 0x6d814e20, 0x3508a: 0x6d815020, 0x3508b: 0x6d815220, + 0x3508c: 0x6da73820, 0x3508d: 0x6da73a20, 0x3508e: 0x6da73c20, 0x3508f: 0x6da73e20, + 0x35090: 0x6dc88020, 0x35091: 0x6dc88220, 0x35092: 0x6dc88420, 0x35093: 0x6dc88620, + 0x35094: 0x6dc88820, 0x35095: 0x6dc88a20, 0x35096: 0x6dc88c20, 0x35097: 0x6dc88e20, + 0x35098: 0x6de49220, 0x35099: 0x6de49420, 0x3509a: 0x6de49620, 0x3509b: 0x6de49820, + 0x3509c: 0x6de49a20, 0x3509d: 0x6de49c20, 0x3509e: 0x6dfbae20, 0x3509f: 0x6dfbb020, + 0x350a0: 0x6e0ee820, 0x350a1: 0x6e0eea20, 0x350a2: 0x6e298820, 0x350a3: 0x6e298a20, + 0x350a4: 0x6e298c20, 0x350a5: 0x6e298e20, 0x350a6: 0x6e329820, 0x350a7: 0x6e329a20, + 0x350a8: 0x6e329c20, 0x350a9: 0x6e38dc20, 0x350aa: 0x6e405620, 0x350ab: 0x6e405820, + 0x350ac: 0x6c04ba20, 0x350ad: 0x6c12d620, 0x350ae: 0x6c227a20, 0x350af: 0x6c381020, + 0x350b0: 0x6c381220, 0x350b1: 0x6c381420, 0x350b2: 0x6c381620, 0x350b3: 0x6c535420, + 0x350b4: 0x6c75ec20, 0x350b5: 0x6c9e4820, 0x350b6: 0x6c9e4a20, 0x350b7: 0x6c9e4c20, + 0x350b8: 0x6c9e4e20, 0x350b9: 0x6cf97e20, 0x350ba: 0x6d288c20, 0x350bb: 0x6d288e20, + 0x350bc: 0x6d289020, 0x350bd: 0x6d815420, 0x350be: 0x6d815620, 0x350bf: 0x6da74420, + // Block 0xd43, offset 0x350c0 + 0x350c0: 0x6de49e20, 0x350c1: 0x6e1e2020, 0x350c2: 0x6c227e20, 0x350c3: 0x6c228020, + 0x350c4: 0x6c381820, 0x350c5: 0x6c381a20, 0x350c6: 0x6c381c20, 0x350c7: 0x6c381e20, + 0x350c8: 0x6c75f020, 0x350c9: 0x6c75f220, 0x350ca: 0x6c75f420, 0x350cb: 0x6c9e5020, + 0x350cc: 0x6c9e5220, 0x350cd: 0x6cf98020, 0x350ce: 0x6d289420, 0x350cf: 0x6d289620, + 0x350d0: 0x6d289820, 0x350d1: 0x6d289a20, 0x350d2: 0x6d55dc20, 0x350d3: 0x6d815820, + 0x350d4: 0x6d815a20, 0x350d5: 0x6da74820, 0x350d6: 0x6de4a020, 0x350d7: 0x6dfbb220, + 0x350d8: 0x6dfbb420, 0x350d9: 0x6e1e2220, 0x350da: 0x6e405a20, 0x350db: 0x6c04c020, + 0x350dc: 0x6c12dc20, 0x350dd: 0x6c12de20, 0x350de: 0x6c12e020, 0x350df: 0x6c12e220, + 0x350e0: 0x6c12e420, 0x350e1: 0x6c228620, 0x350e2: 0x6c228820, 0x350e3: 0x6c228a20, + 0x350e4: 0x6c228c20, 0x350e5: 0x6c228e20, 0x350e6: 0x6c229020, 0x350e7: 0x6c229220, + 0x350e8: 0x6c229420, 0x350e9: 0x6c382e20, 0x350ea: 0x6c383020, 0x350eb: 0x6c383220, + 0x350ec: 0x6c383420, 0x350ed: 0x6c383620, 0x350ee: 0x6c383820, 0x350ef: 0x6c383a20, + 0x350f0: 0x6c383c20, 0x350f1: 0x6c383e20, 0x350f2: 0x6c384020, 0x350f3: 0x6c384220, + 0x350f4: 0x6c384420, 0x350f5: 0x6c384620, 0x350f6: 0x6c384820, 0x350f7: 0x6c384a20, + 0x350f8: 0x6c536420, 0x350f9: 0x6c536620, 0x350fa: 0x6c536820, 0x350fb: 0x6c536a20, + 0x350fc: 0x6c536c20, 0x350fd: 0x6c536e20, 0x350fe: 0x6c537020, 0x350ff: 0x6c537220, + // Block 0xd44, offset 0x35100 + 0x35100: 0x6c537420, 0x35101: 0x6c537620, 0x35102: 0x6c537820, 0x35103: 0x6c537a20, + 0x35104: 0x6c537c20, 0x35105: 0x6c537e20, 0x35106: 0x6c538020, 0x35107: 0x6c538220, + 0x35108: 0x6c538420, 0x35109: 0x6c538620, 0x3510a: 0x6c538820, 0x3510b: 0x6c538a20, + 0x3510c: 0x6c538c20, 0x3510d: 0x6c538e20, 0x3510e: 0x6c539020, 0x3510f: 0x6c539220, + 0x35110: 0x6c539420, 0x35111: 0x6c539620, 0x35112: 0x6c539820, 0x35113: 0x6c539a20, + 0x35114: 0x6c539c20, 0x35115: 0x6c539e20, 0x35116: 0x6c53a020, 0x35117: 0x6c53a220, + 0x35118: 0x6c53a420, 0x35119: 0x6c53a620, 0x3511a: 0x6c53a820, 0x3511b: 0x6c53aa20, + 0x3511c: 0x6c760a20, 0x3511d: 0x6c760c20, 0x3511e: 0x6c760e20, 0x3511f: 0x6c761020, + 0x35120: 0x6c761220, 0x35121: 0x6c761420, 0x35122: 0x6c761620, 0x35123: 0x6c761820, + 0x35124: 0x6c761a20, 0x35125: 0x6c761c20, 0x35126: 0x6c761e20, 0x35127: 0x6c762020, + 0x35128: 0x6c762220, 0x35129: 0x6c762420, 0x3512a: 0x6c762620, 0x3512b: 0x6c762820, + 0x3512c: 0x6c762a20, 0x3512d: 0x6c762c20, 0x3512e: 0x6c762e20, 0x3512f: 0x6c763020, + 0x35130: 0x6c763220, 0x35131: 0x6c9e6a20, 0x35132: 0x6c9e6c20, 0x35133: 0x6c9e6e20, + 0x35134: 0x6c9e7020, 0x35135: 0x6c9e7220, 0x35136: 0x6c9e7420, 0x35137: 0x6c9e7620, + 0x35138: 0x6c9e7820, 0x35139: 0x6c9e7a20, 0x3513a: 0x6c9e7c20, 0x3513b: 0x6c9e7e20, + 0x3513c: 0x6c9e8020, 0x3513d: 0x6c9e8220, 0x3513e: 0x6c9e8420, 0x3513f: 0x6c9e8620, + // Block 0xd45, offset 0x35140 + 0x35140: 0x6c9e8820, 0x35141: 0x6c9e8a20, 0x35142: 0x6c9e8c20, 0x35143: 0x6c9e8e20, + 0x35144: 0x6c9e9020, 0x35145: 0x6c9e9220, 0x35146: 0x6c9e9420, 0x35147: 0x6c9e9620, + 0x35148: 0x6ccb8220, 0x35149: 0x6ccb8420, 0x3514a: 0x6ccb8620, 0x3514b: 0x6ccb8820, + 0x3514c: 0x6ccb8a20, 0x3514d: 0x6ccb8c20, 0x3514e: 0x6ccb8e20, 0x3514f: 0x6ccb9020, + 0x35150: 0x6ccb9220, 0x35151: 0x6ccb9420, 0x35152: 0x6ccb9620, 0x35153: 0x6ccb9820, + 0x35154: 0x6ccb9a20, 0x35155: 0x6ccb9c20, 0x35156: 0x6ccb9e20, 0x35157: 0x6ccba020, + 0x35158: 0x6ccba220, 0x35159: 0x6ccba420, 0x3515a: 0x6ccba620, 0x3515b: 0x6ccba820, + 0x3515c: 0x6ccbaa20, 0x3515d: 0x6ccbac20, 0x3515e: 0x6ccbae20, 0x3515f: 0x6ccbb020, + 0x35160: 0x6ccbb220, 0x35161: 0x6ccbb420, 0x35162: 0x6ccbb620, 0x35163: 0x6ccbb820, + 0x35164: 0x6ccbba20, 0x35165: 0x6ccbbc20, 0x35166: 0x6ccbbe20, 0x35167: 0x6ccbc020, + 0x35168: 0x6cf99a20, 0x35169: 0x6cf99c20, 0x3516a: 0x6cf99e20, 0x3516b: 0x6cf9a020, + 0x3516c: 0x6cf9a220, 0x3516d: 0x6cf9a420, 0x3516e: 0x6cf9a620, 0x3516f: 0x6cf9a820, + 0x35170: 0x6cf9aa20, 0x35171: 0x6cf9ac20, 0x35172: 0x6cf9ae20, 0x35173: 0x6cf9b020, + 0x35174: 0x6cf9b220, 0x35175: 0x6cf9b420, 0x35176: 0x6cf9b620, 0x35177: 0x6cf9b820, + 0x35178: 0x6cf9ba20, 0x35179: 0x6cf9bc20, 0x3517a: 0x6cf9be20, 0x3517b: 0x6cf9c020, + 0x3517c: 0x6cf9c220, 0x3517d: 0x6cf9c420, 0x3517e: 0x6cf9c620, 0x3517f: 0x6cf9c820, + // Block 0xd46, offset 0x35180 + 0x35180: 0x6cf9ca20, 0x35181: 0x6cf9cc20, 0x35182: 0x6cf9ce20, 0x35183: 0x6cf9d020, + 0x35184: 0x6cf9d220, 0x35185: 0x6d28ac20, 0x35186: 0x6d28ae20, 0x35187: 0x6d28b020, + 0x35188: 0x6d28b220, 0x35189: 0x6d28b420, 0x3518a: 0x6d28b620, 0x3518b: 0x6d28b820, + 0x3518c: 0x6d28ba20, 0x3518d: 0x6d28bc20, 0x3518e: 0x6d28be20, 0x3518f: 0x6d28c020, + 0x35190: 0x6d28c220, 0x35191: 0x6d28c420, 0x35192: 0x6d28c620, 0x35193: 0x6d28c820, + 0x35194: 0x6d28ca20, 0x35195: 0x6d28cc20, 0x35196: 0x6d28ce20, 0x35197: 0x6d28d020, + 0x35198: 0x6d28d220, 0x35199: 0x6d28d420, 0x3519a: 0x6d28d620, 0x3519b: 0x6d28d820, + 0x3519c: 0x6d28da20, 0x3519d: 0x6d28dc20, 0x3519e: 0x6d28de20, 0x3519f: 0x6d28e020, + 0x351a0: 0x6d28e220, 0x351a1: 0x6d28e420, 0x351a2: 0x6d28e620, 0x351a3: 0x6d55e620, + 0x351a4: 0x6d55e820, 0x351a5: 0x6d55ea20, 0x351a6: 0x6d55ec20, 0x351a7: 0x6d55ee20, + 0x351a8: 0x6d55f020, 0x351a9: 0x6d55f220, 0x351aa: 0x6d55f420, 0x351ab: 0x6d55f620, + 0x351ac: 0x6d55f820, 0x351ad: 0x6d55fa20, 0x351ae: 0x6d55fc20, 0x351af: 0x6d55fe20, + 0x351b0: 0x6d560020, 0x351b1: 0x6d560220, 0x351b2: 0x6d560420, 0x351b3: 0x6d560620, + 0x351b4: 0x6d560820, 0x351b5: 0x6d560a20, 0x351b6: 0x6d560c20, 0x351b7: 0x6d560e20, + 0x351b8: 0x6d817020, 0x351b9: 0x6d817220, 0x351ba: 0x6d817420, 0x351bb: 0x6d817620, + 0x351bc: 0x6d817820, 0x351bd: 0x6d817a20, 0x351be: 0x6d817c20, 0x351bf: 0x6d817e20, + // Block 0xd47, offset 0x351c0 + 0x351c0: 0x6d818020, 0x351c1: 0x6d818220, 0x351c2: 0x6d818420, 0x351c3: 0x6d818620, + 0x351c4: 0x6d818820, 0x351c5: 0x6d818a20, 0x351c6: 0x6d818c20, 0x351c7: 0x6d818e20, + 0x351c8: 0x6d819020, 0x351c9: 0x6d819220, 0x351ca: 0x6da75020, 0x351cb: 0x6da75220, + 0x351cc: 0x6da75420, 0x351cd: 0x6da75620, 0x351ce: 0x6da75820, 0x351cf: 0x6da75a20, + 0x351d0: 0x6da75c20, 0x351d1: 0x6da75e20, 0x351d2: 0x6da76020, 0x351d3: 0x6da76220, + 0x351d4: 0x6da76420, 0x351d5: 0x6da76620, 0x351d6: 0x6da76820, 0x351d7: 0x6da76a20, + 0x351d8: 0x6da76c20, 0x351d9: 0x6da76e20, 0x351da: 0x6dc89820, 0x351db: 0x6dc89a20, + 0x351dc: 0x6dc89c20, 0x351dd: 0x6dc89e20, 0x351de: 0x6dc8a020, 0x351df: 0x6dc8a220, + 0x351e0: 0x6dc8a420, 0x351e1: 0x6dc8a620, 0x351e2: 0x6dc8a820, 0x351e3: 0x6dc8aa20, + 0x351e4: 0x6dc8ac20, 0x351e5: 0x6dc8ae20, 0x351e6: 0x6dc8b020, 0x351e7: 0x6dc8b220, + 0x351e8: 0x6dc8b420, 0x351e9: 0x6dc8b620, 0x351ea: 0x6dc8b820, 0x351eb: 0x6de4a620, + 0x351ec: 0x6de4a820, 0x351ed: 0x6de4aa20, 0x351ee: 0x6de4ac20, 0x351ef: 0x6de4ae20, + 0x351f0: 0x6de4b020, 0x351f1: 0x6dfbb820, 0x351f2: 0x6dfbba20, 0x351f3: 0x6dfbbc20, + 0x351f4: 0x6dfbbe20, 0x351f5: 0x6dfbc020, 0x351f6: 0x6e0eec20, 0x351f7: 0x6e0eee20, + 0x351f8: 0x6e0ef020, 0x351f9: 0x6e0ef220, 0x351fa: 0x6e0ef420, 0x351fb: 0x6e1e2620, + 0x351fc: 0x6e1e2820, 0x351fd: 0x6e1e2a20, 0x351fe: 0x6e1e2c20, 0x351ff: 0x6e299020, + // Block 0xd48, offset 0x35200 + 0x35200: 0x6e299220, 0x35201: 0x6e299420, 0x35202: 0x6e3d4c20, 0x35203: 0x6e3d4e20, + 0x35204: 0x6e42b020, 0x35205: 0x6c385220, 0x35206: 0x6c385420, 0x35207: 0x6c53b020, + 0x35208: 0x6c53b220, 0x35209: 0x6c53b420, 0x3520a: 0x6c53b620, 0x3520b: 0x6c9e9820, + 0x3520c: 0x6c9e9a20, 0x3520d: 0x6c9e9c20, 0x3520e: 0x6c9e9e20, 0x3520f: 0x6cf9d620, + 0x35210: 0x6d28ea20, 0x35211: 0x6d819420, 0x35212: 0x6da77020, 0x35213: 0x6dc8bc20, + 0x35214: 0x6dc8be20, 0x35215: 0x6c12f020, 0x35216: 0x6c12f220, 0x35217: 0x6c229a20, + 0x35218: 0x6c229c20, 0x35219: 0x6c385e20, 0x3521a: 0x6c386020, 0x3521b: 0x6c386220, + 0x3521c: 0x6c53c220, 0x3521d: 0x6c53c420, 0x3521e: 0x6c53c620, 0x3521f: 0x6c53c820, + 0x35220: 0x6c53ca20, 0x35221: 0x6c764820, 0x35222: 0x6ccbd020, 0x35223: 0x6c9ea620, + 0x35224: 0x6ccbd220, 0x35225: 0x6ccbd420, 0x35226: 0x6cf9da20, 0x35227: 0x6cf9dc20, + 0x35228: 0x6cf9de20, 0x35229: 0x6d28f020, 0x3522a: 0x6d561420, 0x3522b: 0x6d561620, + 0x3522c: 0x6da77220, 0x3522d: 0x6da77420, 0x3522e: 0x6dc8c020, 0x3522f: 0x6e0ef620, + 0x35230: 0x6e0ef820, 0x35231: 0x6c01fc20, 0x35232: 0x6c04ca20, 0x35233: 0x6c04cc20, + 0x35234: 0x6c04ce20, 0x35235: 0x6c09b220, 0x35236: 0x6c09b420, 0x35237: 0x6c09b620, + 0x35238: 0x6c09b820, 0x35239: 0x6c09ba20, 0x3523a: 0x6c09bc20, 0x3523b: 0x6c09be20, + 0x3523c: 0x6c09c020, 0x3523d: 0x6c09c220, 0x3523e: 0x6c09c420, 0x3523f: 0x6c09c620, + // Block 0xd49, offset 0x35240 + 0x35240: 0x6c133020, 0x35241: 0x6c133220, 0x35242: 0x6c133420, 0x35243: 0x6c133620, + 0x35244: 0x6c133820, 0x35245: 0x6c133a20, 0x35246: 0x6c133c20, 0x35247: 0x6c133e20, + 0x35248: 0x6c134020, 0x35249: 0x6c134220, 0x3524a: 0x6c134420, 0x3524b: 0x6c134620, + 0x3524c: 0x6c134820, 0x3524d: 0x6c134a20, 0x3524e: 0x6c233a20, 0x3524f: 0x6c233c20, + 0x35250: 0x6c233e20, 0x35251: 0x6c234020, 0x35252: 0x6c234220, 0x35253: 0x6c234420, + 0x35254: 0x6c234620, 0x35255: 0x6c234820, 0x35256: 0x6c234a20, 0x35257: 0x6c234c20, + 0x35258: 0x6c234e20, 0x35259: 0x6c235020, 0x3525a: 0x6c235220, 0x3525b: 0x6c235420, + 0x3525c: 0x6c235620, 0x3525d: 0x6c235820, 0x3525e: 0x6c235a20, 0x3525f: 0x6c235c20, + 0x35260: 0x6c235e20, 0x35261: 0x6c236020, 0x35262: 0x6c236220, 0x35263: 0x6c236420, + 0x35264: 0x6c236620, 0x35265: 0x6c236820, 0x35266: 0x6c236a20, 0x35267: 0x6c236c20, + 0x35268: 0x6c236e20, 0x35269: 0x6c237020, 0x3526a: 0x6c237220, 0x3526b: 0x6c237420, + 0x3526c: 0x6c237620, 0x3526d: 0x6c237820, 0x3526e: 0x6c237a20, 0x3526f: 0x6c237c20, + 0x35270: 0x6c237e20, 0x35271: 0x6c238020, 0x35272: 0x6c392020, 0x35273: 0x6c392220, + 0x35274: 0x6c392420, 0x35275: 0x6c392620, 0x35276: 0x6c392820, 0x35277: 0x6c392a20, + 0x35278: 0x6c392c20, 0x35279: 0x6c392e20, 0x3527a: 0x6c393020, 0x3527b: 0x6c393220, + 0x3527c: 0x6c393420, 0x3527d: 0x6c393620, 0x3527e: 0x6c393820, 0x3527f: 0x6c393a20, + // Block 0xd4a, offset 0x35280 + 0x35280: 0x6c393c20, 0x35281: 0x6c393e20, 0x35282: 0x6c394020, 0x35283: 0x6c394220, + 0x35284: 0x6c394420, 0x35285: 0x6c394620, 0x35286: 0x6c394820, 0x35287: 0x6c394a20, + 0x35288: 0x6c394c20, 0x35289: 0x6c394e20, 0x3528a: 0x6c395020, 0x3528b: 0x6c395220, + 0x3528c: 0x6c395420, 0x3528d: 0x6c395620, 0x3528e: 0x6c395820, 0x3528f: 0x6c395a20, + 0x35290: 0x6c395c20, 0x35291: 0x6c395e20, 0x35292: 0x6c396020, 0x35293: 0x6c396220, + 0x35294: 0x6c396420, 0x35295: 0x6c396620, 0x35296: 0x6c396820, 0x35297: 0x6c396a20, + 0x35298: 0x6c396c20, 0x35299: 0x6c396e20, 0x3529a: 0x6c397020, 0x3529b: 0x6c397220, + 0x3529c: 0x6c397420, 0x3529d: 0x6c397620, 0x3529e: 0x6c397820, 0x3529f: 0x6c397a20, + 0x352a0: 0x6c397c20, 0x352a1: 0x6c397e20, 0x352a2: 0x6c398020, 0x352a3: 0x6c398220, + 0x352a4: 0x6c549620, 0x352a5: 0x6c549820, 0x352a6: 0x6c549a20, 0x352a7: 0x6c549c20, + 0x352a8: 0x6c549e20, 0x352a9: 0x6c54a020, 0x352aa: 0x6c54a220, 0x352ab: 0x6c54a420, + 0x352ac: 0x6c54a620, 0x352ad: 0x6c54a820, 0x352ae: 0x6c54aa20, 0x352af: 0x6c54ac20, + 0x352b0: 0x6c54ae20, 0x352b1: 0x6c54b020, 0x352b2: 0x6c54b220, 0x352b3: 0x6c54b420, + 0x352b4: 0x6c54b620, 0x352b5: 0x6c54b820, 0x352b6: 0x6c54ba20, 0x352b7: 0x6c54bc20, + 0x352b8: 0x6c54be20, 0x352b9: 0x6c54c020, 0x352ba: 0x6c54c220, 0x352bb: 0x6c54c420, + 0x352bc: 0x6c54c620, 0x352bd: 0x6c54c820, 0x352be: 0x6c54ca20, 0x352bf: 0x6c54cc20, + // Block 0xd4b, offset 0x352c0 + 0x352c0: 0x6c54ce20, 0x352c1: 0x6c54d020, 0x352c2: 0x6c54d220, 0x352c3: 0x6c54d420, + 0x352c4: 0x6c54d620, 0x352c5: 0x6c54d820, 0x352c6: 0x6c54da20, 0x352c7: 0x6c54dc20, + 0x352c8: 0x6c54de20, 0x352c9: 0x6c54e020, 0x352ca: 0x6c54e220, 0x352cb: 0x6c54e420, + 0x352cc: 0x6c54e620, 0x352cd: 0x6c54e820, 0x352ce: 0x6c54ea20, 0x352cf: 0x6c54ec20, + 0x352d0: 0x6c54ee20, 0x352d1: 0x6c54f020, 0x352d2: 0x6c54f220, 0x352d3: 0x6c54f420, + 0x352d4: 0x6c54f620, 0x352d5: 0x6c54f820, 0x352d6: 0x6c54fa20, 0x352d7: 0x6c54fc20, + 0x352d8: 0x6c54fe20, 0x352d9: 0x6c550020, 0x352da: 0x6c550220, 0x352db: 0x6c550420, + 0x352dc: 0x6c550620, 0x352dd: 0x6c550820, 0x352de: 0x6c771820, 0x352df: 0x6c771a20, + 0x352e0: 0x6c771c20, 0x352e1: 0x6c771e20, 0x352e2: 0x6c772020, 0x352e3: 0x6c772220, + 0x352e4: 0x6c772420, 0x352e5: 0x6c772620, 0x352e6: 0x6c772820, 0x352e7: 0x6c772a20, + 0x352e8: 0x6c772c20, 0x352e9: 0x6c772e20, 0x352ea: 0x6c773020, 0x352eb: 0x6c773220, + 0x352ec: 0x6c773420, 0x352ed: 0x6c773620, 0x352ee: 0x6c773820, 0x352ef: 0x6c773a20, + 0x352f0: 0x6c773c20, 0x352f1: 0x6c773e20, 0x352f2: 0x6c774020, 0x352f3: 0x6c774220, + 0x352f4: 0x6c774420, 0x352f5: 0x6c774620, 0x352f6: 0x6c774820, 0x352f7: 0x6c774a20, + 0x352f8: 0x6c774c20, 0x352f9: 0x6c774e20, 0x352fa: 0x6c775020, 0x352fb: 0x6c775220, + 0x352fc: 0x6c775420, 0x352fd: 0x6c775620, 0x352fe: 0x6c775820, 0x352ff: 0x6c775a20, + // Block 0xd4c, offset 0x35300 + 0x35300: 0x6c775c20, 0x35301: 0x6c775e20, 0x35302: 0x6c776020, 0x35303: 0x6c776220, + 0x35304: 0x6c776420, 0x35305: 0x6c776620, 0x35306: 0x6c776820, 0x35307: 0x6c776a20, + 0x35308: 0x6c776c20, 0x35309: 0x6c776e20, 0x3530a: 0x6c777020, 0x3530b: 0x6c777220, + 0x3530c: 0x6c777420, 0x3530d: 0x6c777620, 0x3530e: 0x6c777820, 0x3530f: 0x6c777a20, + 0x35310: 0x6c777c20, 0x35311: 0x6c777e20, 0x35312: 0x6c778020, 0x35313: 0x6c778220, + 0x35314: 0x6c778420, 0x35315: 0x6c778620, 0x35316: 0x6c778820, 0x35317: 0x6c778a20, + 0x35318: 0x6c778c20, 0x35319: 0x6c778e20, 0x3531a: 0x6c779020, 0x3531b: 0x6c779220, + 0x3531c: 0x6c779420, 0x3531d: 0x6c779620, 0x3531e: 0x6c779820, 0x3531f: 0x6c779a20, + 0x35320: 0x6c779c20, 0x35321: 0x6c779e20, 0x35322: 0x6c77a020, 0x35323: 0x6c77a220, + 0x35324: 0x6c77a420, 0x35325: 0x6c77a620, 0x35326: 0x6c77a820, 0x35327: 0x6c77aa20, + 0x35328: 0x6c77ac20, 0x35329: 0x6c77ae20, 0x3532a: 0x6c77b020, 0x3532b: 0x6c77b220, + 0x3532c: 0x6c77b420, 0x3532d: 0x6c77b620, 0x3532e: 0x6c77b820, 0x3532f: 0x6c77ba20, + 0x35330: 0x6c77bc20, 0x35331: 0x6c77be20, 0x35332: 0x6c77c020, 0x35333: 0x6c77c220, + 0x35334: 0x6c77c420, 0x35335: 0x6c77c620, 0x35336: 0x6c77c820, 0x35337: 0x6c9fbc20, + 0x35338: 0x6c9fbe20, 0x35339: 0x6c9fc020, 0x3533a: 0x6c9fc220, 0x3533b: 0x6c9fc420, + 0x3533c: 0x6c9fc620, 0x3533d: 0x6c9fc820, 0x3533e: 0x6c9fca20, 0x3533f: 0x6c9fcc20, + // Block 0xd4d, offset 0x35340 + 0x35340: 0x6c9fce20, 0x35341: 0x6c9fd020, 0x35342: 0x6c9fd220, 0x35343: 0x6c9fd420, + 0x35344: 0x6c9fd620, 0x35345: 0x6c9fd820, 0x35346: 0x6c9fda20, 0x35347: 0x6c9fdc20, + 0x35348: 0x6c9fde20, 0x35349: 0x6c9fe020, 0x3534a: 0x6c9fe220, 0x3534b: 0x6c9fe420, + 0x3534c: 0x6c9fe620, 0x3534d: 0x6c9fe820, 0x3534e: 0x6c9fea20, 0x3534f: 0x6c9fec20, + 0x35350: 0x6c9fee20, 0x35351: 0x6c9ff020, 0x35352: 0x6c9ff220, 0x35353: 0x6c9ff420, + 0x35354: 0x6c9ff620, 0x35355: 0x6c9ff820, 0x35356: 0x6c9ffa20, 0x35357: 0x6c9ffc20, + 0x35358: 0x6c9ffe20, 0x35359: 0x6ca00020, 0x3535a: 0x6ca00220, 0x3535b: 0x6ca00420, + 0x3535c: 0x6ca00620, 0x3535d: 0x6ca00820, 0x3535e: 0x6ca00a20, 0x3535f: 0x6ca00c20, + 0x35360: 0x6ca00e20, 0x35361: 0x6ca01020, 0x35362: 0x6ca01220, 0x35363: 0x6ca01420, + 0x35364: 0x6ca01620, 0x35365: 0x6ca01820, 0x35366: 0x6ca01a20, 0x35367: 0x6ca01c20, + 0x35368: 0x6ca01e20, 0x35369: 0x6ca02020, 0x3536a: 0x6ca02220, 0x3536b: 0x6ca02420, + 0x3536c: 0x6ca02620, 0x3536d: 0x6ca02820, 0x3536e: 0x6ca02a20, 0x3536f: 0x6ca02c20, + 0x35370: 0x6ca02e20, 0x35371: 0x6ca03020, 0x35372: 0x6ca03220, 0x35373: 0x6ca03420, + 0x35374: 0x6ca03620, 0x35375: 0x6ca03820, 0x35376: 0x6ca03a20, 0x35377: 0x6ca03c20, + 0x35378: 0x6ca03e20, 0x35379: 0x6ca04020, 0x3537a: 0x6ca04220, 0x3537b: 0x6ca04420, + 0x3537c: 0x6ca04620, 0x3537d: 0x6ca04820, 0x3537e: 0x6ca04a20, 0x3537f: 0x6ca04c20, + // Block 0xd4e, offset 0x35380 + 0x35380: 0x6ca04e20, 0x35381: 0x6ca05020, 0x35382: 0x6ca05220, 0x35383: 0x6ca05420, + 0x35384: 0x6ca05620, 0x35385: 0x6ca05820, 0x35386: 0x6ca05a20, 0x35387: 0x6ca05c20, + 0x35388: 0x6ca05e20, 0x35389: 0x6ca06020, 0x3538a: 0x6ca06220, 0x3538b: 0x6ca06420, + 0x3538c: 0x6ca06620, 0x3538d: 0x6ca06820, 0x3538e: 0x6ca06a20, 0x3538f: 0x6ca06c20, + 0x35390: 0x6ca06e20, 0x35391: 0x6ca07020, 0x35392: 0x6ca07220, 0x35393: 0x6ca07420, + 0x35394: 0x6ca07620, 0x35395: 0x6ca07820, 0x35396: 0x6ca07a20, 0x35397: 0x6ca07c20, + 0x35398: 0x6ca07e20, 0x35399: 0x6ca08020, 0x3539a: 0x6c77ca20, 0x3539b: 0x6ca08220, + 0x3539c: 0x6ca08420, 0x3539d: 0x6ca08620, 0x3539e: 0x6ca08820, 0x3539f: 0x6ca08a20, + 0x353a0: 0x6ca08c20, 0x353a1: 0x6ca08e20, 0x353a2: 0x6ca09020, 0x353a3: 0x6ca09220, + 0x353a4: 0x6ca09420, 0x353a5: 0x6ca09620, 0x353a6: 0x6ca09820, 0x353a7: 0x6ca09a20, + 0x353a8: 0x6ca09c20, 0x353a9: 0x6ca09e20, 0x353aa: 0x6ca0a020, 0x353ab: 0x6ca0a220, + 0x353ac: 0x6ca0a420, 0x353ad: 0x6ca0a620, 0x353ae: 0x6ca0a820, 0x353af: 0x6ca0aa20, + 0x353b0: 0x6ca0ac20, 0x353b1: 0x6ca0ae20, 0x353b2: 0x6ca0b020, 0x353b3: 0x6ca0b220, + 0x353b4: 0x6ca0b420, 0x353b5: 0x6ca0b620, 0x353b6: 0x6ca0b820, 0x353b7: 0x6ca0ba20, + 0x353b8: 0x6ca0bc20, 0x353b9: 0x6ca0be20, 0x353ba: 0x6ca0c020, 0x353bb: 0x6ca0c220, + 0x353bc: 0x6cccf620, 0x353bd: 0x6cccf820, 0x353be: 0x6cccfa20, 0x353bf: 0x6cccfc20, + // Block 0xd4f, offset 0x353c0 + 0x353c0: 0x6cccfe20, 0x353c1: 0x6ccd0020, 0x353c2: 0x6ccd0220, 0x353c3: 0x6ccd0420, + 0x353c4: 0x6ccd0620, 0x353c5: 0x6ccd0820, 0x353c6: 0x6ccd0a20, 0x353c7: 0x6ccd0c20, + 0x353c8: 0x6ccd0e20, 0x353c9: 0x6ccd1020, 0x353ca: 0x6ca0c420, 0x353cb: 0x6ccd1220, + 0x353cc: 0x6ccd1420, 0x353cd: 0x6ccd1620, 0x353ce: 0x6ccd1820, 0x353cf: 0x6ccd1a20, + 0x353d0: 0x6ccd1c20, 0x353d1: 0x6ccd1e20, 0x353d2: 0x6ccd2020, 0x353d3: 0x6ccd2220, + 0x353d4: 0x6ccd2420, 0x353d5: 0x6ccd2620, 0x353d6: 0x6ccd2820, 0x353d7: 0x6ccd2a20, + 0x353d8: 0x6ccd2c20, 0x353d9: 0x6ccd2e20, 0x353da: 0x6ccd3020, 0x353db: 0x6ccd3220, + 0x353dc: 0x6ccd3420, 0x353dd: 0x6ccd3620, 0x353de: 0x6ccd3820, 0x353df: 0x6ccd3a20, + 0x353e0: 0x6ccd3c20, 0x353e1: 0x6ccd3e20, 0x353e2: 0x6ccd4020, 0x353e3: 0x6ccd4220, + 0x353e4: 0x6ccd4420, 0x353e5: 0x6ccd4620, 0x353e6: 0x6ccd4820, 0x353e7: 0x6ccd4a20, + 0x353e8: 0x6ccd4c20, 0x353e9: 0x6ccd4e20, 0x353ea: 0x6ccd5020, 0x353eb: 0x6ccd5220, + 0x353ec: 0x6ccd5420, 0x353ed: 0x6ccd5620, 0x353ee: 0x6ccd5820, 0x353ef: 0x6ccd5a20, + 0x353f0: 0x6ccd5c20, 0x353f1: 0x6ccd5e20, 0x353f2: 0x6ccd6020, 0x353f3: 0x6ccd6220, + 0x353f4: 0x6ccd6420, 0x353f5: 0x6ccd6620, 0x353f6: 0x6ccd6820, 0x353f7: 0x6ccd6a20, + 0x353f8: 0x6ccd6c20, 0x353f9: 0x6ccd6e20, 0x353fa: 0x6ccd7020, 0x353fb: 0x6ccd7220, + 0x353fc: 0x6ccd7420, 0x353fd: 0x6ccd7620, 0x353fe: 0x6ccd7820, 0x353ff: 0x6ccd7a20, + // Block 0xd50, offset 0x35400 + 0x35400: 0x6ccd7c20, 0x35401: 0x6ccd7e20, 0x35402: 0x6ccd8020, 0x35403: 0x6ccd8220, + 0x35404: 0x6ccd8420, 0x35405: 0x6ccd8620, 0x35406: 0x6ccd8820, 0x35407: 0x6ccd8a20, + 0x35408: 0x6ccd8c20, 0x35409: 0x6ccd8e20, 0x3540a: 0x6ccd9020, 0x3540b: 0x6ccd9220, + 0x3540c: 0x6ccd9420, 0x3540d: 0x6ccd9620, 0x3540e: 0x6ccd9820, 0x3540f: 0x6ccd9a20, + 0x35410: 0x6ccd9c20, 0x35411: 0x6ccd9e20, 0x35412: 0x6ccda020, 0x35413: 0x6ccda220, + 0x35414: 0x6ccda420, 0x35415: 0x6ccda620, 0x35416: 0x6ccda820, 0x35417: 0x6ccdaa20, + 0x35418: 0x6ccdac20, 0x35419: 0x6ccdae20, 0x3541a: 0x6ccdb020, 0x3541b: 0x6ccdb220, + 0x3541c: 0x6ccdb420, 0x3541d: 0x6cfac420, 0x3541e: 0x6cfac620, 0x3541f: 0x6cfac820, + 0x35420: 0x6cfaca20, 0x35421: 0x6cfacc20, 0x35422: 0x6cface20, 0x35423: 0x6cfad020, + 0x35424: 0x6cfad220, 0x35425: 0x6cfad420, 0x35426: 0x6cfad620, 0x35427: 0x6cfad820, + 0x35428: 0x6cfada20, 0x35429: 0x6cfadc20, 0x3542a: 0x6cfade20, 0x3542b: 0x6cfae020, + 0x3542c: 0x6cfae220, 0x3542d: 0x6cfae420, 0x3542e: 0x6cfae620, 0x3542f: 0x6cfae820, + 0x35430: 0x6cfaea20, 0x35431: 0x6cfaec20, 0x35432: 0x6cfaee20, 0x35433: 0x6cfaf020, + 0x35434: 0x6cfaf220, 0x35435: 0x6cfaf420, 0x35436: 0x6cfaf620, 0x35437: 0x6cfaf820, + 0x35438: 0x6cfafa20, 0x35439: 0x6cfafc20, 0x3543a: 0x6cfafe20, 0x3543b: 0x6cfb0020, + 0x3543c: 0x6cfb0220, 0x3543d: 0x6cfb0420, 0x3543e: 0x6cfb0620, 0x3543f: 0x6cfb0820, + // Block 0xd51, offset 0x35440 + 0x35440: 0x6cfb0a20, 0x35441: 0x6cfb0c20, 0x35442: 0x6cfb0e20, 0x35443: 0x6cfb1020, + 0x35444: 0x6cfb1220, 0x35445: 0x6cfb1420, 0x35446: 0x6cfb1620, 0x35447: 0x6cfb1820, + 0x35448: 0x6cfb1a20, 0x35449: 0x6cfb1c20, 0x3544a: 0x6cfb1e20, 0x3544b: 0x6cfb2020, + 0x3544c: 0x6cfb2220, 0x3544d: 0x6cfb2420, 0x3544e: 0x6cfb2620, 0x3544f: 0x6cfb2820, + 0x35450: 0x6cfb2a20, 0x35451: 0x6cfb2c20, 0x35452: 0x6cfb2e20, 0x35453: 0x6cfb3020, + 0x35454: 0x6cfb3220, 0x35455: 0x6cfb3420, 0x35456: 0x6cfb3620, 0x35457: 0x6cfb3820, + 0x35458: 0x6cfb3a20, 0x35459: 0x6cfb3c20, 0x3545a: 0x6cfb3e20, 0x3545b: 0x6cfb4020, + 0x3545c: 0x6cfb4220, 0x3545d: 0x6cfb4420, 0x3545e: 0x6cfb4620, 0x3545f: 0x6cfb4820, + 0x35460: 0x6cfb4a20, 0x35461: 0x6cfb4c20, 0x35462: 0x6cfb4e20, 0x35463: 0x6cfb5020, + 0x35464: 0x6cfb5220, 0x35465: 0x6cfb5420, 0x35466: 0x6cfb5620, 0x35467: 0x6cfb5820, + 0x35468: 0x6cfb5a20, 0x35469: 0x6cfb5c20, 0x3546a: 0x6cfb5e20, 0x3546b: 0x6cfb6020, + 0x3546c: 0x6cfb6220, 0x3546d: 0x6cfb6420, 0x3546e: 0x6cfb6620, 0x3546f: 0x6cfb6820, + 0x35470: 0x6cfb6a20, 0x35471: 0x6cfb6c20, 0x35472: 0x6cfb6e20, 0x35473: 0x6cfb7020, + 0x35474: 0x6cfb7220, 0x35475: 0x6cfb7420, 0x35476: 0x6cfb7620, 0x35477: 0x6cfb7820, + 0x35478: 0x6cfb7a20, 0x35479: 0x6cfb7c20, 0x3547a: 0x6cfb7e20, 0x3547b: 0x6cfb8020, + 0x3547c: 0x6cfb8220, 0x3547d: 0x6cfb8420, 0x3547e: 0x6cfb8620, 0x3547f: 0x6cfb8820, + // Block 0xd52, offset 0x35480 + 0x35480: 0x6cfb8a20, 0x35481: 0x6cfb8c20, 0x35482: 0x6cfb8e20, 0x35483: 0x6cfb9020, + 0x35484: 0x6cfb9220, 0x35485: 0x6cfb9420, 0x35486: 0x6cfb9620, 0x35487: 0x6cfb9820, + 0x35488: 0x6cfb9a20, 0x35489: 0x6cfb9c20, 0x3548a: 0x6cfb9e20, 0x3548b: 0x6cfba020, + 0x3548c: 0x6cfba220, 0x3548d: 0x6d29ca20, 0x3548e: 0x6d29cc20, 0x3548f: 0x6d29ce20, + 0x35490: 0x6d29d020, 0x35491: 0x6d29d220, 0x35492: 0x6d29d420, 0x35493: 0x6d29d620, + 0x35494: 0x6d29d820, 0x35495: 0x6d29da20, 0x35496: 0x6d29dc20, 0x35497: 0x6d29de20, + 0x35498: 0x6d29e020, 0x35499: 0x6d29e220, 0x3549a: 0x6d29e420, 0x3549b: 0x6d29e620, + 0x3549c: 0x6d29e820, 0x3549d: 0x6d29ea20, 0x3549e: 0x6d29ec20, 0x3549f: 0x6d29ee20, + 0x354a0: 0x6d29f020, 0x354a1: 0x6d29f220, 0x354a2: 0x6d29f420, 0x354a3: 0x6d29f620, + 0x354a4: 0x6d29f820, 0x354a5: 0x6d29fa20, 0x354a6: 0x6d29fc20, 0x354a7: 0x6d29fe20, + 0x354a8: 0x6d2a0020, 0x354a9: 0x6d2a0220, 0x354aa: 0x6d2a0420, 0x354ab: 0x6d2a0620, + 0x354ac: 0x6d2a0820, 0x354ad: 0x6d2a0a20, 0x354ae: 0x6d2a0c20, 0x354af: 0x6d2a0e20, + 0x354b0: 0x6d2a1020, 0x354b1: 0x6d2a1220, 0x354b2: 0x6d2a1420, 0x354b3: 0x6d2a1620, + 0x354b4: 0x6d56e220, 0x354b5: 0x6d2a1820, 0x354b6: 0x6d2a1a20, 0x354b7: 0x6d2a1c20, + 0x354b8: 0x6d2a1e20, 0x354b9: 0x6d2a2020, 0x354ba: 0x6d2a2220, 0x354bb: 0x6d2a2420, + 0x354bc: 0x6d2a2620, 0x354bd: 0x6d2a2820, 0x354be: 0x6d2a2a20, 0x354bf: 0x6d2a2c20, + // Block 0xd53, offset 0x354c0 + 0x354c0: 0x6d2a2e20, 0x354c1: 0x6d2a3020, 0x354c2: 0x6d2a3220, 0x354c3: 0x6d2a3420, + 0x354c4: 0x6d2a3620, 0x354c5: 0x6d2a3820, 0x354c6: 0x6d2a3a20, 0x354c7: 0x6d2a3c20, + 0x354c8: 0x6d2a3e20, 0x354c9: 0x6d2a4020, 0x354ca: 0x6d2a4220, 0x354cb: 0x6d2a4420, + 0x354cc: 0x6d2a4620, 0x354cd: 0x6d2a4820, 0x354ce: 0x6d2a4a20, 0x354cf: 0x6d2a4c20, + 0x354d0: 0x6d2a4e20, 0x354d1: 0x6d2a5020, 0x354d2: 0x6d2a5220, 0x354d3: 0x6d2a5420, + 0x354d4: 0x6d2a5620, 0x354d5: 0x6d2a5820, 0x354d6: 0x6d2a5a20, 0x354d7: 0x6d2a5c20, + 0x354d8: 0x6d2a5e20, 0x354d9: 0x6d4f2420, 0x354da: 0x6d2a6020, 0x354db: 0x6d2a6220, + 0x354dc: 0x6d2a6420, 0x354dd: 0x6d2a6620, 0x354de: 0x6d2a6820, 0x354df: 0x6d2a6a20, + 0x354e0: 0x6d2a6c20, 0x354e1: 0x6d2a6e20, 0x354e2: 0x6d2a7020, 0x354e3: 0x6d2a7220, + 0x354e4: 0x6d2a7420, 0x354e5: 0x6d2a7620, 0x354e6: 0x6d2a7820, 0x354e7: 0x6d2a7a20, + 0x354e8: 0x6d2a7c20, 0x354e9: 0x6d2a7e20, 0x354ea: 0x6d2a8020, 0x354eb: 0x6d2a8220, + 0x354ec: 0x6d2a8420, 0x354ed: 0x6d2a8620, 0x354ee: 0x6d2a8820, 0x354ef: 0x6d2a8a20, + 0x354f0: 0x6d2a8c20, 0x354f1: 0x6d2a8e20, 0x354f2: 0x6d2a9020, 0x354f3: 0x6d2a9220, + 0x354f4: 0x6d2a9420, 0x354f5: 0x6d2a9620, 0x354f6: 0x6d2a9820, 0x354f7: 0x6d2a9a20, + 0x354f8: 0x6d2a9c20, 0x354f9: 0x6d2a9e20, 0x354fa: 0x6d2aa020, 0x354fb: 0x6d2aa220, + 0x354fc: 0x6d2aa420, 0x354fd: 0x6d2aa620, 0x354fe: 0x6d2aa820, 0x354ff: 0x6d2aaa20, + // Block 0xd54, offset 0x35500 + 0x35500: 0x6d2aac20, 0x35501: 0x6d2aae20, 0x35502: 0x6d2ab020, 0x35503: 0x6d56e420, + 0x35504: 0x6d56e620, 0x35505: 0x6d56e820, 0x35506: 0x6d56ea20, 0x35507: 0x6d56ec20, + 0x35508: 0x6d56ee20, 0x35509: 0x6d56f020, 0x3550a: 0x6d56f220, 0x3550b: 0x6d56f420, + 0x3550c: 0x6d56f620, 0x3550d: 0x6d56f820, 0x3550e: 0x6d56fa20, 0x3550f: 0x6d56fc20, + 0x35510: 0x6d56fe20, 0x35511: 0x6d570020, 0x35512: 0x6d570220, 0x35513: 0x6d570420, + 0x35514: 0x6d570620, 0x35515: 0x6d570820, 0x35516: 0x6d570a20, 0x35517: 0x6d570c20, + 0x35518: 0x6d570e20, 0x35519: 0x6d571020, 0x3551a: 0x6d571220, 0x3551b: 0x6d571420, + 0x3551c: 0x6d571620, 0x3551d: 0x6d571820, 0x3551e: 0x6d571a20, 0x3551f: 0x6d571c20, + 0x35520: 0x6d571e20, 0x35521: 0x6d572020, 0x35522: 0x6d572220, 0x35523: 0x6d572420, + 0x35524: 0x6d572620, 0x35525: 0x6d572820, 0x35526: 0x6d572a20, 0x35527: 0x6d572c20, + 0x35528: 0x6d572e20, 0x35529: 0x6d573020, 0x3552a: 0x6d573220, 0x3552b: 0x6d573420, + 0x3552c: 0x6d573620, 0x3552d: 0x6d573820, 0x3552e: 0x6d573a20, 0x3552f: 0x6d573c20, + 0x35530: 0x6d573e20, 0x35531: 0x6d574020, 0x35532: 0x6d574220, 0x35533: 0x6d574420, + 0x35534: 0x6d574620, 0x35535: 0x6d574820, 0x35536: 0x6d574a20, 0x35537: 0x6d574c20, + 0x35538: 0x6d574e20, 0x35539: 0x6d575020, 0x3553a: 0x6d575220, 0x3553b: 0x6d575420, + 0x3553c: 0x6d575620, 0x3553d: 0x6d575820, 0x3553e: 0x6d575a20, 0x3553f: 0x6d575c20, + // Block 0xd55, offset 0x35540 + 0x35540: 0x6d575e20, 0x35541: 0x6d576020, 0x35542: 0x6d576220, 0x35543: 0x6d576420, + 0x35544: 0x6d576620, 0x35545: 0x6d576820, 0x35546: 0x6d576a20, 0x35547: 0x6d576c20, + 0x35548: 0x6d576e20, 0x35549: 0x6d577020, 0x3554a: 0x6d577220, 0x3554b: 0x6d577420, + 0x3554c: 0x6d577620, 0x3554d: 0x6d577820, 0x3554e: 0x6d577a20, 0x3554f: 0x6d577c20, + 0x35550: 0x6d577e20, 0x35551: 0x6d578020, 0x35552: 0x6d578220, 0x35553: 0x6d578420, + 0x35554: 0x6d578620, 0x35555: 0x6d578820, 0x35556: 0x6d578a20, 0x35557: 0x6d578c20, + 0x35558: 0x6d578e20, 0x35559: 0x6d579020, 0x3555a: 0x6d579220, 0x3555b: 0x6d579420, + 0x3555c: 0x6d579620, 0x3555d: 0x6d579820, 0x3555e: 0x6d579a20, 0x3555f: 0x6d579c20, + 0x35560: 0x6d579e20, 0x35561: 0x6d57a020, 0x35562: 0x6d57a220, 0x35563: 0x6d57a420, + 0x35564: 0x6d57a620, 0x35565: 0x6d57a820, 0x35566: 0x6d57aa20, 0x35567: 0x6d57ac20, + 0x35568: 0x6d57ae20, 0x35569: 0x6d822820, 0x3556a: 0x6d57b020, 0x3556b: 0x6d57b220, + 0x3556c: 0x6d57b420, 0x3556d: 0x6d57b620, 0x3556e: 0x6d57b820, 0x3556f: 0x6d57ba20, + 0x35570: 0x6d57bc20, 0x35571: 0x6d57be20, 0x35572: 0x6d57c020, 0x35573: 0x6d57c220, + 0x35574: 0x6d57c420, 0x35575: 0x6d57c620, 0x35576: 0x6d57c820, 0x35577: 0x6d57ca20, + 0x35578: 0x6d57cc20, 0x35579: 0x6d57ce20, 0x3557a: 0x6d57d020, 0x3557b: 0x6d57d220, + 0x3557c: 0x6d57d420, 0x3557d: 0x6d57d620, 0x3557e: 0x6d57d820, 0x3557f: 0x6d57da20, + // Block 0xd56, offset 0x35580 + 0x35580: 0x6da7de20, 0x35581: 0x6d57dc20, 0x35582: 0x6d57de20, 0x35583: 0x6d57e020, + 0x35584: 0x6d57e220, 0x35585: 0x6d822a20, 0x35586: 0x6d822c20, 0x35587: 0x6d822e20, + 0x35588: 0x6d823020, 0x35589: 0x6d823220, 0x3558a: 0x6d823420, 0x3558b: 0x6d823620, + 0x3558c: 0x6d823820, 0x3558d: 0x6d823a20, 0x3558e: 0x6d823c20, 0x3558f: 0x6d823e20, + 0x35590: 0x6d824020, 0x35591: 0x6d824220, 0x35592: 0x6d824420, 0x35593: 0x6d824620, + 0x35594: 0x6d824820, 0x35595: 0x6d824a20, 0x35596: 0x6d824c20, 0x35597: 0x6d824e20, + 0x35598: 0x6d825020, 0x35599: 0x6d825220, 0x3559a: 0x6d825420, 0x3559b: 0x6d825620, + 0x3559c: 0x6d825820, 0x3559d: 0x6d825a20, 0x3559e: 0x6d825c20, 0x3559f: 0x6d825e20, + 0x355a0: 0x6d826020, 0x355a1: 0x6d826220, 0x355a2: 0x6d826420, 0x355a3: 0x6d826620, + 0x355a4: 0x6d826820, 0x355a5: 0x6d826a20, 0x355a6: 0x6d826c20, 0x355a7: 0x6d826e20, + 0x355a8: 0x6d827020, 0x355a9: 0x6d827220, 0x355aa: 0x6d827420, 0x355ab: 0x6d827620, + 0x355ac: 0x6d827820, 0x355ad: 0x6d827a20, 0x355ae: 0x6d827c20, 0x355af: 0x6d827e20, + 0x355b0: 0x6d828020, 0x355b1: 0x6d828220, 0x355b2: 0x6d828420, 0x355b3: 0x6d828620, + 0x355b4: 0x6d828820, 0x355b5: 0x6d828a20, 0x355b6: 0x6d828c20, 0x355b7: 0x6d828e20, + 0x355b8: 0x6d829020, 0x355b9: 0x6d829220, 0x355ba: 0x6d829420, 0x355bb: 0x6d829620, + 0x355bc: 0x6d829820, 0x355bd: 0x6d829a20, 0x355be: 0x6d829c20, 0x355bf: 0x6d829e20, + // Block 0xd57, offset 0x355c0 + 0x355c0: 0x6d82a020, 0x355c1: 0x6d82a220, 0x355c2: 0x6d82a420, 0x355c3: 0x6d82a620, + 0x355c4: 0x6d82a820, 0x355c5: 0x6d82aa20, 0x355c6: 0x6d82ac20, 0x355c7: 0x6d82ae20, + 0x355c8: 0x6d82b020, 0x355c9: 0x6d82b220, 0x355ca: 0x6d82b420, 0x355cb: 0x6d82b620, + 0x355cc: 0x6d82b820, 0x355cd: 0x6d82ba20, 0x355ce: 0x6d82bc20, 0x355cf: 0x6d82be20, + 0x355d0: 0x6d82c020, 0x355d1: 0x6d82c220, 0x355d2: 0x6d82c420, 0x355d3: 0x6d82c620, + 0x355d4: 0x6d82c820, 0x355d5: 0x6d82ca20, 0x355d6: 0x6d82cc20, 0x355d7: 0x6d82ce20, + 0x355d8: 0x6d82d020, 0x355d9: 0x6d82d220, 0x355da: 0x6d82d420, 0x355db: 0x6d82d620, + 0x355dc: 0x6d82d820, 0x355dd: 0x6d82da20, 0x355de: 0x6d82dc20, 0x355df: 0x6d82de20, + 0x355e0: 0x6d82e020, 0x355e1: 0x6d82e220, 0x355e2: 0x6d7ade20, 0x355e3: 0x6da7e020, + 0x355e4: 0x6da7e220, 0x355e5: 0x6da7e420, 0x355e6: 0x6da7e620, 0x355e7: 0x6da7e820, + 0x355e8: 0x6da7ea20, 0x355e9: 0x6da7ec20, 0x355ea: 0x6da7ee20, 0x355eb: 0x6da7f020, + 0x355ec: 0x6da7f220, 0x355ed: 0x6da7f420, 0x355ee: 0x6da7f620, 0x355ef: 0x6da7f820, + 0x355f0: 0x6da7fa20, 0x355f1: 0x6da7fc20, 0x355f2: 0x6da7fe20, 0x355f3: 0x6da80020, + 0x355f4: 0x6da80220, 0x355f5: 0x6da80420, 0x355f6: 0x6da80620, 0x355f7: 0x6da80820, + 0x355f8: 0x6da80a20, 0x355f9: 0x6da80c20, 0x355fa: 0x6da80e20, 0x355fb: 0x6da81020, + 0x355fc: 0x6da81220, 0x355fd: 0x6da81420, 0x355fe: 0x6da81620, 0x355ff: 0x6da81820, + // Block 0xd58, offset 0x35600 + 0x35600: 0x6da81a20, 0x35601: 0x6da81c20, 0x35602: 0x6da81e20, 0x35603: 0x6da82020, + 0x35604: 0x6da82220, 0x35605: 0x6da82420, 0x35606: 0x6da82620, 0x35607: 0x6da82820, + 0x35608: 0x6da82a20, 0x35609: 0x6da82c20, 0x3560a: 0x6da82e20, 0x3560b: 0x6da83020, + 0x3560c: 0x6da83220, 0x3560d: 0x6da83420, 0x3560e: 0x6da83620, 0x3560f: 0x6da83820, + 0x35610: 0x6da83a20, 0x35611: 0x6da83c20, 0x35612: 0x6da83e20, 0x35613: 0x6da84020, + 0x35614: 0x6da84220, 0x35615: 0x6da84420, 0x35616: 0x6da84620, 0x35617: 0x6da84820, + 0x35618: 0x6da84a20, 0x35619: 0x6da84c20, 0x3561a: 0x6da84e20, 0x3561b: 0x6da85020, + 0x3561c: 0x6da85220, 0x3561d: 0x6da85420, 0x3561e: 0x6dc90820, 0x3561f: 0x6da85620, + 0x35620: 0x6da85820, 0x35621: 0x6dc90a20, 0x35622: 0x6dc90c20, 0x35623: 0x6dc90e20, + 0x35624: 0x6dc91020, 0x35625: 0x6dc91220, 0x35626: 0x6dc91420, 0x35627: 0x6dc91620, + 0x35628: 0x6dc91820, 0x35629: 0x6dc91a20, 0x3562a: 0x6dc91c20, 0x3562b: 0x6dc91e20, + 0x3562c: 0x6dc92020, 0x3562d: 0x6dc92220, 0x3562e: 0x6dc92420, 0x3562f: 0x6dc92620, + 0x35630: 0x6dc92820, 0x35631: 0x6dc92a20, 0x35632: 0x6dc92c20, 0x35633: 0x6dc92e20, + 0x35634: 0x6dc93020, 0x35635: 0x6dc93220, 0x35636: 0x6dc93420, 0x35637: 0x6dc93620, + 0x35638: 0x6dc93820, 0x35639: 0x6dc93a20, 0x3563a: 0x6dc93c20, 0x3563b: 0x6dc93e20, + 0x3563c: 0x6dc94020, 0x3563d: 0x6dc94220, 0x3563e: 0x6dc94420, 0x3563f: 0x6dc94620, + // Block 0xd59, offset 0x35640 + 0x35640: 0x6dc94820, 0x35641: 0x6dc94a20, 0x35642: 0x6dc94c20, 0x35643: 0x6dc94e20, + 0x35644: 0x6dc95020, 0x35645: 0x6dc95220, 0x35646: 0x6dc95420, 0x35647: 0x6dc95620, + 0x35648: 0x6dc95820, 0x35649: 0x6dc95a20, 0x3564a: 0x6dc95c20, 0x3564b: 0x6dc95e20, + 0x3564c: 0x6dc96020, 0x3564d: 0x6dc96220, 0x3564e: 0x6dc96420, 0x3564f: 0x6dc96620, + 0x35650: 0x6dc96820, 0x35651: 0x6dc96a20, 0x35652: 0x6dc96c20, 0x35653: 0x6dc96e20, + 0x35654: 0x6dc97020, 0x35655: 0x6dc97220, 0x35656: 0x6dc97420, 0x35657: 0x6dc97620, + 0x35658: 0x6dc97820, 0x35659: 0x6dc97a20, 0x3565a: 0x6dc97c20, 0x3565b: 0x6dc97e20, + 0x3565c: 0x6dc98020, 0x3565d: 0x6de4f420, 0x3565e: 0x6dc98220, 0x3565f: 0x6dc98420, + 0x35660: 0x6dc98620, 0x35661: 0x6de4f620, 0x35662: 0x6dc98820, 0x35663: 0x6dc98a20, + 0x35664: 0x6dc98c20, 0x35665: 0x6dc98e20, 0x35666: 0x6dc99020, 0x35667: 0x6dc99220, + 0x35668: 0x6dc99420, 0x35669: 0x6dc99620, 0x3566a: 0x6dc99820, 0x3566b: 0x6dc99a20, + 0x3566c: 0x6dc99c20, 0x3566d: 0x6dc99e20, 0x3566e: 0x6dc9a020, 0x3566f: 0x6dc9a220, + 0x35670: 0x6dc9a420, 0x35671: 0x6dc9a620, 0x35672: 0x6dc9a820, 0x35673: 0x6de4f820, + 0x35674: 0x6de4fa20, 0x35675: 0x6de4fc20, 0x35676: 0x6de4fe20, 0x35677: 0x6de50020, + 0x35678: 0x6de50220, 0x35679: 0x6de50420, 0x3567a: 0x6de50620, 0x3567b: 0x6de50820, + 0x3567c: 0x6de50a20, 0x3567d: 0x6de50c20, 0x3567e: 0x6de50e20, 0x3567f: 0x6de51020, + // Block 0xd5a, offset 0x35680 + 0x35680: 0x6de51220, 0x35681: 0x6de51420, 0x35682: 0x6de51620, 0x35683: 0x6de51820, + 0x35684: 0x6de51a20, 0x35685: 0x6de51c20, 0x35686: 0x6de51e20, 0x35687: 0x6de52020, + 0x35688: 0x6de52220, 0x35689: 0x6de52420, 0x3568a: 0x6de52620, 0x3568b: 0x6de52820, + 0x3568c: 0x6de52a20, 0x3568d: 0x6de52c20, 0x3568e: 0x6de52e20, 0x3568f: 0x6de53020, + 0x35690: 0x6de53220, 0x35691: 0x6de53420, 0x35692: 0x6de53620, 0x35693: 0x6de53820, + 0x35694: 0x6de53a20, 0x35695: 0x6de53c20, 0x35696: 0x6de53e20, 0x35697: 0x6de54020, + 0x35698: 0x6de54220, 0x35699: 0x6de54420, 0x3569a: 0x6de54620, 0x3569b: 0x6de54820, + 0x3569c: 0x6de54a20, 0x3569d: 0x6de54c20, 0x3569e: 0x6de54e20, 0x3569f: 0x6de55020, + 0x356a0: 0x6de55220, 0x356a1: 0x6de55420, 0x356a2: 0x6de55620, 0x356a3: 0x6de55820, + 0x356a4: 0x6de55a20, 0x356a5: 0x6de55c20, 0x356a6: 0x6de55e20, 0x356a7: 0x6de56020, + 0x356a8: 0x6dfbf620, 0x356a9: 0x6dfbf820, 0x356aa: 0x6dfbfa20, 0x356ab: 0x6dfbfc20, + 0x356ac: 0x6dfbfe20, 0x356ad: 0x6dfc0020, 0x356ae: 0x6dfc0220, 0x356af: 0x6dfc0420, + 0x356b0: 0x6dfc0620, 0x356b1: 0x6dfc0820, 0x356b2: 0x6dfc0a20, 0x356b3: 0x6dfc0c20, + 0x356b4: 0x6dfc0e20, 0x356b5: 0x6dfc1020, 0x356b6: 0x6dfc1220, 0x356b7: 0x6dfc1420, + 0x356b8: 0x6dfc1620, 0x356b9: 0x6dfc1820, 0x356ba: 0x6dfc1a20, 0x356bb: 0x6dfc1c20, + 0x356bc: 0x6dfc1e20, 0x356bd: 0x6dfc2020, 0x356be: 0x6dfc2220, 0x356bf: 0x6dfc2420, + // Block 0xd5b, offset 0x356c0 + 0x356c0: 0x6dfc2620, 0x356c1: 0x6dfc2820, 0x356c2: 0x6dfc2a20, 0x356c3: 0x6dfc2c20, + 0x356c4: 0x6dfc2e20, 0x356c5: 0x6dfc3020, 0x356c6: 0x6dfc3220, 0x356c7: 0x6dfc3420, + 0x356c8: 0x6dfc3620, 0x356c9: 0x6dfc3820, 0x356ca: 0x6dfc3a20, 0x356cb: 0x6dfc3c20, + 0x356cc: 0x6dfc3e20, 0x356cd: 0x6dfc4020, 0x356ce: 0x6e0f2220, 0x356cf: 0x6e0f2420, + 0x356d0: 0x6e0f2620, 0x356d1: 0x6e0f2820, 0x356d2: 0x6e0f2a20, 0x356d3: 0x6e0f2c20, + 0x356d4: 0x6e0f2e20, 0x356d5: 0x6e0f3020, 0x356d6: 0x6e0f3220, 0x356d7: 0x6e0f3420, + 0x356d8: 0x6e0f3620, 0x356d9: 0x6e0f3820, 0x356da: 0x6e0f3a20, 0x356db: 0x6e0f3c20, + 0x356dc: 0x6e0f3e20, 0x356dd: 0x6e0f4020, 0x356de: 0x6e0f4220, 0x356df: 0x6e0f4420, + 0x356e0: 0x6e0f4620, 0x356e1: 0x6e0f4820, 0x356e2: 0x6e0f4a20, 0x356e3: 0x6e0f4c20, + 0x356e4: 0x6e0f4e20, 0x356e5: 0x6e0f5020, 0x356e6: 0x6e0f5220, 0x356e7: 0x6e0f5420, + 0x356e8: 0x6e0f5620, 0x356e9: 0x6e0f5820, 0x356ea: 0x6e0f5a20, 0x356eb: 0x6e0f5c20, + 0x356ec: 0x6e0f5e20, 0x356ed: 0x6e0f6020, 0x356ee: 0x6e0f6220, 0x356ef: 0x6e0f6420, + 0x356f0: 0x6e0f6620, 0x356f1: 0x6e0f6820, 0x356f2: 0x6e0f6a20, 0x356f3: 0x6e0f6c20, + 0x356f4: 0x6e0f6e20, 0x356f5: 0x6e0f7020, 0x356f6: 0x6e1e4220, 0x356f7: 0x6e1e4420, + 0x356f8: 0x6e1e4620, 0x356f9: 0x6e1e4820, 0x356fa: 0x6e1e4a20, 0x356fb: 0x6e1e4c20, + 0x356fc: 0x6e1e4e20, 0x356fd: 0x6e1e5020, 0x356fe: 0x6e1e5220, 0x356ff: 0x6e1e5420, + // Block 0xd5c, offset 0x35700 + 0x35700: 0x6e1e5620, 0x35701: 0x6e1e5820, 0x35702: 0x6e1e5a20, 0x35703: 0x6e1e5c20, + 0x35704: 0x6e1e5e20, 0x35705: 0x6e1e6020, 0x35706: 0x6e1e6220, 0x35707: 0x6e1e6420, + 0x35708: 0x6e1e6620, 0x35709: 0x6e1e6820, 0x3570a: 0x6e29a620, 0x3570b: 0x6e29a820, + 0x3570c: 0x6e29aa20, 0x3570d: 0x6e29ac20, 0x3570e: 0x6e29ae20, 0x3570f: 0x6e29b020, + 0x35710: 0x6e29b220, 0x35711: 0x6e29b420, 0x35712: 0x6e29b620, 0x35713: 0x6e29b820, + 0x35714: 0x6e29ba20, 0x35715: 0x6e29bc20, 0x35716: 0x6e29be20, 0x35717: 0x6e29c020, + 0x35718: 0x6e29c220, 0x35719: 0x6e29c420, 0x3571a: 0x6e29c620, 0x3571b: 0x6e29c820, + 0x3571c: 0x6e29ca20, 0x3571d: 0x6e29cc20, 0x3571e: 0x6e29ce20, 0x3571f: 0x6e29d020, + 0x35720: 0x6e32ac20, 0x35721: 0x6e32ae20, 0x35722: 0x6e32b020, 0x35723: 0x6e32b220, + 0x35724: 0x6e32b420, 0x35725: 0x6e32b620, 0x35726: 0x6e32b820, 0x35727: 0x6e32ba20, + 0x35728: 0x6e32bc20, 0x35729: 0x6e38e420, 0x3572a: 0x6e38e620, 0x3572b: 0x6e38e820, + 0x3572c: 0x6e38ea20, 0x3572d: 0x6e38ec20, 0x3572e: 0x6e38ee20, 0x3572f: 0x6e38f020, + 0x35730: 0x6e3d5820, 0x35731: 0x6e3d5a20, 0x35732: 0x6e3d5c20, 0x35733: 0x6e3d5e20, + 0x35734: 0x6e3d6020, 0x35735: 0x6e3d6220, 0x35736: 0x6e3d6420, 0x35737: 0x6e406220, + 0x35738: 0x6e406420, 0x35739: 0x6e406620, 0x3573a: 0x6e406820, 0x3573b: 0x6e406a20, + 0x3573c: 0x6e42b220, 0x3573d: 0x6e42b420, 0x3573e: 0x6e443220, 0x3573f: 0x6e452220, + // Block 0xd5d, offset 0x35740 + 0x35740: 0x6e468020, 0x35741: 0x6e46c820, 0x35742: 0x6c09cc20, 0x35743: 0x6c136620, + 0x35744: 0x6c136820, 0x35745: 0x6c136a20, 0x35746: 0x6c136c20, 0x35747: 0x6c136e20, + 0x35748: 0x6c137020, 0x35749: 0x6c137220, 0x3574a: 0x6c137420, 0x3574b: 0x6c137620, + 0x3574c: 0x6c137820, 0x3574d: 0x6c23aa20, 0x3574e: 0x6c23ac20, 0x3574f: 0x6c23ae20, + 0x35750: 0x6c23b020, 0x35751: 0x6c23b220, 0x35752: 0x6c23b420, 0x35753: 0x6c23b620, + 0x35754: 0x6c23b820, 0x35755: 0x6c23ba20, 0x35756: 0x6c23bc20, 0x35757: 0x6c23be20, + 0x35758: 0x6c23c020, 0x35759: 0x6c23c220, 0x3575a: 0x6c23c420, 0x3575b: 0x6c23c620, + 0x3575c: 0x6c23c820, 0x3575d: 0x6c39d820, 0x3575e: 0x6c39da20, 0x3575f: 0x6c39dc20, + 0x35760: 0x6c39de20, 0x35761: 0x6c39e020, 0x35762: 0x6c39e220, 0x35763: 0x6c39e420, + 0x35764: 0x6c39e620, 0x35765: 0x6c39e820, 0x35766: 0x6c39ea20, 0x35767: 0x6c39ec20, + 0x35768: 0x6c39ee20, 0x35769: 0x6c39f020, 0x3576a: 0x6c39f220, 0x3576b: 0x6c39f420, + 0x3576c: 0x6c39f620, 0x3576d: 0x6c39f820, 0x3576e: 0x6c39fa20, 0x3576f: 0x6c39fc20, + 0x35770: 0x6c39fe20, 0x35771: 0x6c3a0020, 0x35772: 0x6c3a0220, 0x35773: 0x6c3a0420, + 0x35774: 0x6c3a0620, 0x35775: 0x6c3a0820, 0x35776: 0x6c3a0a20, 0x35777: 0x6c3a0c20, + 0x35778: 0x6c3a0e20, 0x35779: 0x6c3a1020, 0x3577a: 0x6c3a1220, 0x3577b: 0x6c3a1420, + 0x3577c: 0x6c557220, 0x3577d: 0x6c557420, 0x3577e: 0x6c557620, 0x3577f: 0x6c557820, + // Block 0xd5e, offset 0x35780 + 0x35780: 0x6c557a20, 0x35781: 0x6c557c20, 0x35782: 0x6c557e20, 0x35783: 0x6c558020, + 0x35784: 0x6c558220, 0x35785: 0x6c558420, 0x35786: 0x6c558620, 0x35787: 0x6c558820, + 0x35788: 0x6c558a20, 0x35789: 0x6c558c20, 0x3578a: 0x6c558e20, 0x3578b: 0x6c559020, + 0x3578c: 0x6c559220, 0x3578d: 0x6c559420, 0x3578e: 0x6c559620, 0x3578f: 0x6c559820, + 0x35790: 0x6c559a20, 0x35791: 0x6c559c20, 0x35792: 0x6c559e20, 0x35793: 0x6c55a020, + 0x35794: 0x6c55a220, 0x35795: 0x6c55a420, 0x35796: 0x6c55a620, 0x35797: 0x6c55a820, + 0x35798: 0x6c55aa20, 0x35799: 0x6c55ac20, 0x3579a: 0x6c55ae20, 0x3579b: 0x6c55b020, + 0x3579c: 0x6c55b220, 0x3579d: 0x6c55b420, 0x3579e: 0x6c55b620, 0x3579f: 0x6c55b820, + 0x357a0: 0x6c55ba20, 0x357a1: 0x6c55bc20, 0x357a2: 0x6c55be20, 0x357a3: 0x6c55c020, + 0x357a4: 0x6c55c220, 0x357a5: 0x6c55c420, 0x357a6: 0x6c55c620, 0x357a7: 0x6c55c820, + 0x357a8: 0x6c55ca20, 0x357a9: 0x6c55cc20, 0x357aa: 0x6c55ce20, 0x357ab: 0x6c55d020, + 0x357ac: 0x6c55d220, 0x357ad: 0x6c55d420, 0x357ae: 0x6c55d620, 0x357af: 0x6c784c20, + 0x357b0: 0x6c784e20, 0x357b1: 0x6c785020, 0x357b2: 0x6c785220, 0x357b3: 0x6c785420, + 0x357b4: 0x6c785620, 0x357b5: 0x6c785820, 0x357b6: 0x6c785a20, 0x357b7: 0x6c785c20, + 0x357b8: 0x6c785e20, 0x357b9: 0x6c786020, 0x357ba: 0x6c786220, 0x357bb: 0x6c786420, + 0x357bc: 0x6c786620, 0x357bd: 0x6c786820, 0x357be: 0x6c786a20, 0x357bf: 0x6c786c20, + // Block 0xd5f, offset 0x357c0 + 0x357c0: 0x6c786e20, 0x357c1: 0x6c787020, 0x357c2: 0x6c787220, 0x357c3: 0x6c787420, + 0x357c4: 0x6c787620, 0x357c5: 0x6c787820, 0x357c6: 0x6c787a20, 0x357c7: 0x6c787c20, + 0x357c8: 0x6c787e20, 0x357c9: 0x6c788020, 0x357ca: 0x6c788220, 0x357cb: 0x6c788420, + 0x357cc: 0x6c788620, 0x357cd: 0x6c788820, 0x357ce: 0x6c788a20, 0x357cf: 0x6c788c20, + 0x357d0: 0x6c788e20, 0x357d1: 0x6c789020, 0x357d2: 0x6c789220, 0x357d3: 0x6c789420, + 0x357d4: 0x6c789620, 0x357d5: 0x6c789820, 0x357d6: 0x6c789a20, 0x357d7: 0x6c789c20, + 0x357d8: 0x6c789e20, 0x357d9: 0x6c78a020, 0x357da: 0x6c78a220, 0x357db: 0x6c78a420, + 0x357dc: 0x6c78a620, 0x357dd: 0x6c78a820, 0x357de: 0x6c78aa20, 0x357df: 0x6c78ac20, + 0x357e0: 0x6c78ae20, 0x357e1: 0x6c78b020, 0x357e2: 0x6c78b220, 0x357e3: 0x6c78b420, + 0x357e4: 0x6c78b620, 0x357e5: 0x6ca14020, 0x357e6: 0x6ca14220, 0x357e7: 0x6ca14420, + 0x357e8: 0x6ca14620, 0x357e9: 0x6ca14820, 0x357ea: 0x6ca14a20, 0x357eb: 0x6ca14c20, + 0x357ec: 0x6ca14e20, 0x357ed: 0x6ca15020, 0x357ee: 0x6ca15220, 0x357ef: 0x6ca15420, + 0x357f0: 0x6ca15620, 0x357f1: 0x6ca15820, 0x357f2: 0x6ca15a20, 0x357f3: 0x6ca15c20, + 0x357f4: 0x6ca15e20, 0x357f5: 0x6ca16020, 0x357f6: 0x6ca16220, 0x357f7: 0x6ca16420, + 0x357f8: 0x6ca16620, 0x357f9: 0x6ca16820, 0x357fa: 0x6ca16a20, 0x357fb: 0x6ca16c20, + 0x357fc: 0x6ca16e20, 0x357fd: 0x6ca17020, 0x357fe: 0x6ca17220, 0x357ff: 0x6ca17420, + // Block 0xd60, offset 0x35800 + 0x35800: 0x6ca17620, 0x35801: 0x6ca17820, 0x35802: 0x6ca17a20, 0x35803: 0x6ca17c20, + 0x35804: 0x6ca17e20, 0x35805: 0x6ca18020, 0x35806: 0x6ca18220, 0x35807: 0x6ca18420, + 0x35808: 0x6ca18620, 0x35809: 0x6ca18820, 0x3580a: 0x6ca18a20, 0x3580b: 0x6ca18c20, + 0x3580c: 0x6ca18e20, 0x3580d: 0x6ca19020, 0x3580e: 0x6ca19220, 0x3580f: 0x6ca19420, + 0x35810: 0x6ca19620, 0x35811: 0x6ca19820, 0x35812: 0x6ca19a20, 0x35813: 0x6ca19c20, + 0x35814: 0x6ca19e20, 0x35815: 0x6ca1a020, 0x35816: 0x6ca1a220, 0x35817: 0x6ca1a420, + 0x35818: 0x6ca1a620, 0x35819: 0x6ca1a820, 0x3581a: 0x6ca1aa20, 0x3581b: 0x6ca1ac20, + 0x3581c: 0x6ca1ae20, 0x3581d: 0x6ca1b020, 0x3581e: 0x6ca1b220, 0x3581f: 0x6ca1b420, + 0x35820: 0x6ca1b620, 0x35821: 0x6ca1b820, 0x35822: 0x6cce4820, 0x35823: 0x6cce4a20, + 0x35824: 0x6cce4c20, 0x35825: 0x6cce4e20, 0x35826: 0x6cce5020, 0x35827: 0x6cce5220, + 0x35828: 0x6cce5420, 0x35829: 0x6cce5620, 0x3582a: 0x6cce5820, 0x3582b: 0x6cce5a20, + 0x3582c: 0x6cce5c20, 0x3582d: 0x6cce5e20, 0x3582e: 0x6cce6020, 0x3582f: 0x6cce6220, + 0x35830: 0x6cce6420, 0x35831: 0x6cce6620, 0x35832: 0x6cce6820, 0x35833: 0x6cce6a20, + 0x35834: 0x6cce6c20, 0x35835: 0x6cce6e20, 0x35836: 0x6cce7020, 0x35837: 0x6cce7220, + 0x35838: 0x6cce7420, 0x35839: 0x6cce7620, 0x3583a: 0x6cce7820, 0x3583b: 0x6cce7a20, + 0x3583c: 0x6cce7c20, 0x3583d: 0x6cce7e20, 0x3583e: 0x6cce8020, 0x3583f: 0x6cce8220, + // Block 0xd61, offset 0x35840 + 0x35840: 0x6cce8420, 0x35841: 0x6cce8620, 0x35842: 0x6cce8820, 0x35843: 0x6cce8a20, + 0x35844: 0x6cce8c20, 0x35845: 0x6cce8e20, 0x35846: 0x6cce9020, 0x35847: 0x6cce9220, + 0x35848: 0x6cce9420, 0x35849: 0x6cce9620, 0x3584a: 0x6cce9820, 0x3584b: 0x6cce9a20, + 0x3584c: 0x6cce9c20, 0x3584d: 0x6cce9e20, 0x3584e: 0x6ccea020, 0x3584f: 0x6ccea220, + 0x35850: 0x6ccea420, 0x35851: 0x6ccea620, 0x35852: 0x6ccea820, 0x35853: 0x6cceaa20, + 0x35854: 0x6cceac20, 0x35855: 0x6cceae20, 0x35856: 0x6cceb020, 0x35857: 0x6cceb220, + 0x35858: 0x6cceb420, 0x35859: 0x6cceb620, 0x3585a: 0x6cceb820, 0x3585b: 0x6cceba20, + 0x3585c: 0x6ccebc20, 0x3585d: 0x6ccebe20, 0x3585e: 0x6ccec020, 0x3585f: 0x6ccec220, + 0x35860: 0x6ccec420, 0x35861: 0x6ccec620, 0x35862: 0x6ccec820, 0x35863: 0x6cceca20, + 0x35864: 0x6ccecc20, 0x35865: 0x6ccece20, 0x35866: 0x6cced020, 0x35867: 0x6cced220, + 0x35868: 0x6cced420, 0x35869: 0x6cced620, 0x3586a: 0x6cced820, 0x3586b: 0x6cceda20, + 0x3586c: 0x6ccedc20, 0x3586d: 0x6ccede20, 0x3586e: 0x6ccee020, 0x3586f: 0x6ccee220, + 0x35870: 0x6ccee420, 0x35871: 0x6ccee620, 0x35872: 0x6cfc6820, 0x35873: 0x6cfc6a20, + 0x35874: 0x6cfc6c20, 0x35875: 0x6cfc6e20, 0x35876: 0x6cfc7020, 0x35877: 0x6cfc7220, + 0x35878: 0x6cfc7420, 0x35879: 0x6cfc7620, 0x3587a: 0x6cfc7820, 0x3587b: 0x6cfc7a20, + 0x3587c: 0x6cfc7c20, 0x3587d: 0x6cfc7e20, 0x3587e: 0x6cfc8020, 0x3587f: 0x6cfc8220, + // Block 0xd62, offset 0x35880 + 0x35880: 0x6cfc8420, 0x35881: 0x6cfc8620, 0x35882: 0x6cfc8820, 0x35883: 0x6cfc8a20, + 0x35884: 0x6cfc8c20, 0x35885: 0x6cfc8e20, 0x35886: 0x6cfc9020, 0x35887: 0x6cfc9220, + 0x35888: 0x6cfc9420, 0x35889: 0x6cfc9620, 0x3588a: 0x6cfc9820, 0x3588b: 0x6cfc9a20, + 0x3588c: 0x6cfc9c20, 0x3588d: 0x6cfc9e20, 0x3588e: 0x6cfca020, 0x3588f: 0x6cfca220, + 0x35890: 0x6cfca420, 0x35891: 0x6cfca620, 0x35892: 0x6cfca820, 0x35893: 0x6cfcaa20, + 0x35894: 0x6cfcac20, 0x35895: 0x6cfcae20, 0x35896: 0x6cfcb020, 0x35897: 0x6cfcb220, + 0x35898: 0x6cfcb420, 0x35899: 0x6cfcb620, 0x3589a: 0x6cfcb820, 0x3589b: 0x6cfcba20, + 0x3589c: 0x6cfcbc20, 0x3589d: 0x6cfcbe20, 0x3589e: 0x6cfcc020, 0x3589f: 0x6cfcc220, + 0x358a0: 0x6cfcc420, 0x358a1: 0x6cfcc620, 0x358a2: 0x6cfcc820, 0x358a3: 0x6cfcca20, + 0x358a4: 0x6cfccc20, 0x358a5: 0x6cfcce20, 0x358a6: 0x6cfcd020, 0x358a7: 0x6cfcd220, + 0x358a8: 0x6cfcd420, 0x358a9: 0x6cfcd620, 0x358aa: 0x6cfcd820, 0x358ab: 0x6cfcda20, + 0x358ac: 0x6cfcdc20, 0x358ad: 0x6cfcde20, 0x358ae: 0x6cfce020, 0x358af: 0x6cfce220, + 0x358b0: 0x6cfce420, 0x358b1: 0x6cfce620, 0x358b2: 0x6cfce820, 0x358b3: 0x6cb74620, + 0x358b4: 0x6cfcea20, 0x358b5: 0x6cfcec20, 0x358b6: 0x6cfcee20, 0x358b7: 0x6cfcf020, + 0x358b8: 0x6cfcf220, 0x358b9: 0x6cfcf420, 0x358ba: 0x6cfcf620, 0x358bb: 0x6cfcf820, + 0x358bc: 0x6cfcfa20, 0x358bd: 0x6cfcfc20, 0x358be: 0x6cfcfe20, 0x358bf: 0x6cfd0020, + // Block 0xd63, offset 0x358c0 + 0x358c0: 0x6cfd0220, 0x358c1: 0x6cfd0420, 0x358c2: 0x6cfd0620, 0x358c3: 0x6cfd0820, + 0x358c4: 0x6cfd0a20, 0x358c5: 0x6cfd0c20, 0x358c6: 0x6cfd0e20, 0x358c7: 0x6d2b2c20, + 0x358c8: 0x6d2b2e20, 0x358c9: 0x6d2b3020, 0x358ca: 0x6d2b3220, 0x358cb: 0x6d2b3420, + 0x358cc: 0x6d2b3620, 0x358cd: 0x6d2b3820, 0x358ce: 0x6d2b3a20, 0x358cf: 0x6d2b3c20, + 0x358d0: 0x6d2b3e20, 0x358d1: 0x6d2b4020, 0x358d2: 0x6d2b4220, 0x358d3: 0x6d2b4420, + 0x358d4: 0x6d2b4620, 0x358d5: 0x6d2b4820, 0x358d6: 0x6d2b4a20, 0x358d7: 0x6d2b4c20, + 0x358d8: 0x6d2b4e20, 0x358d9: 0x6d2b5020, 0x358da: 0x6d2b5220, 0x358db: 0x6d2b5420, + 0x358dc: 0x6d2b5620, 0x358dd: 0x6d2b5820, 0x358de: 0x6d2b5a20, 0x358df: 0x6d2b5c20, + 0x358e0: 0x6d2b5e20, 0x358e1: 0x6d2b6020, 0x358e2: 0x6d2b6220, 0x358e3: 0x6d2b6420, + 0x358e4: 0x6d2b6620, 0x358e5: 0x6d2b6820, 0x358e6: 0x6d2b6a20, 0x358e7: 0x6d2b6c20, + 0x358e8: 0x6d2b6e20, 0x358e9: 0x6d2b7020, 0x358ea: 0x6d2b7220, 0x358eb: 0x6d2b7420, + 0x358ec: 0x6d2b7620, 0x358ed: 0x6d2b7820, 0x358ee: 0x6d2b7a20, 0x358ef: 0x6d2b7c20, + 0x358f0: 0x6d2b7e20, 0x358f1: 0x6d2b8020, 0x358f2: 0x6d585a20, 0x358f3: 0x6d2b8220, + 0x358f4: 0x6d2b8420, 0x358f5: 0x6d2b8620, 0x358f6: 0x6d2b8820, 0x358f7: 0x6d2b8a20, + 0x358f8: 0x6d2b8c20, 0x358f9: 0x6d2b8e20, 0x358fa: 0x6d2b9020, 0x358fb: 0x6d2b9220, + 0x358fc: 0x6d2b9420, 0x358fd: 0x6d2b9620, 0x358fe: 0x6d2b9820, 0x358ff: 0x6d2b9a20, + // Block 0xd64, offset 0x35900 + 0x35900: 0x6d2b9c20, 0x35901: 0x6d2b9e20, 0x35902: 0x6d2ba020, 0x35903: 0x6d2ba220, + 0x35904: 0x6d2ba420, 0x35905: 0x6d2ba620, 0x35906: 0x6d2ba820, 0x35907: 0x6d2baa20, + 0x35908: 0x6d2bac20, 0x35909: 0x6d2bae20, 0x3590a: 0x6d2bb020, 0x3590b: 0x6d2bb220, + 0x3590c: 0x6d2bb420, 0x3590d: 0x6d2bb620, 0x3590e: 0x6d2bb820, 0x3590f: 0x6cfd1020, + 0x35910: 0x6d585c20, 0x35911: 0x6d585e20, 0x35912: 0x6d586020, 0x35913: 0x6d586220, + 0x35914: 0x6d586420, 0x35915: 0x6d586620, 0x35916: 0x6d586820, 0x35917: 0x6d586a20, + 0x35918: 0x6d586c20, 0x35919: 0x6d586e20, 0x3591a: 0x6d587020, 0x3591b: 0x6d587220, + 0x3591c: 0x6d587420, 0x3591d: 0x6d587620, 0x3591e: 0x6d587820, 0x3591f: 0x6d587a20, + 0x35920: 0x6d587c20, 0x35921: 0x6d587e20, 0x35922: 0x6d588020, 0x35923: 0x6d588220, + 0x35924: 0x6d588420, 0x35925: 0x6d588620, 0x35926: 0x6d588820, 0x35927: 0x6d588a20, + 0x35928: 0x6d588c20, 0x35929: 0x6d836620, 0x3592a: 0x6d588e20, 0x3592b: 0x6d589020, + 0x3592c: 0x6d589220, 0x3592d: 0x6d589420, 0x3592e: 0x6d589620, 0x3592f: 0x6d589820, + 0x35930: 0x6d589a20, 0x35931: 0x6d589c20, 0x35932: 0x6d589e20, 0x35933: 0x6d58a020, + 0x35934: 0x6d58a220, 0x35935: 0x6d58a420, 0x35936: 0x6d58a620, 0x35937: 0x6d58a820, + 0x35938: 0x6d58aa20, 0x35939: 0x6d58ac20, 0x3593a: 0x6d58ae20, 0x3593b: 0x6d58b020, + 0x3593c: 0x6d58b220, 0x3593d: 0x6d58b420, 0x3593e: 0x6d58b620, 0x3593f: 0x6d58b820, + // Block 0xd65, offset 0x35940 + 0x35940: 0x6d385220, 0x35941: 0x6d58ba20, 0x35942: 0x6d705e20, 0x35943: 0x6d58bc20, + 0x35944: 0x6d58be20, 0x35945: 0x6d58c020, 0x35946: 0x6d58c220, 0x35947: 0x6d58c420, + 0x35948: 0x6d58c620, 0x35949: 0x6d58c820, 0x3594a: 0x6d58ca20, 0x3594b: 0x6d58cc20, + 0x3594c: 0x6d58ce20, 0x3594d: 0x6d58d020, 0x3594e: 0x6d58d220, 0x3594f: 0x6d58d420, + 0x35950: 0x6d58d620, 0x35951: 0x6d58d820, 0x35952: 0x6d58da20, 0x35953: 0x6d58dc20, + 0x35954: 0x6d58de20, 0x35955: 0x6d58e020, 0x35956: 0x6d58e220, 0x35957: 0x6d58e420, + 0x35958: 0x6d58e620, 0x35959: 0x6d58e820, 0x3595a: 0x6d58ea20, 0x3595b: 0x6d58ec20, + 0x3595c: 0x6d58ee20, 0x3595d: 0x6d836820, 0x3595e: 0x6d836a20, 0x3595f: 0x6d836c20, + 0x35960: 0x6d836e20, 0x35961: 0x6d837020, 0x35962: 0x6d837220, 0x35963: 0x6d837420, + 0x35964: 0x6d837620, 0x35965: 0x6d837820, 0x35966: 0x6d837a20, 0x35967: 0x6d837c20, + 0x35968: 0x6d837e20, 0x35969: 0x6d838020, 0x3596a: 0x6d838220, 0x3596b: 0x6d838420, + 0x3596c: 0x6d838620, 0x3596d: 0x6d838820, 0x3596e: 0x6d838a20, 0x3596f: 0x6d838c20, + 0x35970: 0x6d838e20, 0x35971: 0x6d839020, 0x35972: 0x6d839220, 0x35973: 0x6d839420, + 0x35974: 0x6d839620, 0x35975: 0x6d839820, 0x35976: 0x6d839a20, 0x35977: 0x6d839c20, + 0x35978: 0x6d839e20, 0x35979: 0x6d83a020, 0x3597a: 0x6d83a220, 0x3597b: 0x6d83a420, + 0x3597c: 0x6d83a620, 0x3597d: 0x6d83a820, 0x3597e: 0x6d83aa20, 0x3597f: 0x6d83ac20, + // Block 0xd66, offset 0x35980 + 0x35980: 0x6d83ae20, 0x35981: 0x6d83b020, 0x35982: 0x6d83b220, 0x35983: 0x6d83b420, + 0x35984: 0x6d83b620, 0x35985: 0x6d83b820, 0x35986: 0x6d83ba20, 0x35987: 0x6d83bc20, + 0x35988: 0x6d83be20, 0x35989: 0x6d83c020, 0x3598a: 0x6d83c220, 0x3598b: 0x6d83c420, + 0x3598c: 0x6d83c620, 0x3598d: 0x6d83c820, 0x3598e: 0x6d83ca20, 0x3598f: 0x6d83cc20, + 0x35990: 0x6d83ce20, 0x35991: 0x6d83d020, 0x35992: 0x6d83d220, 0x35993: 0x6d83d420, + 0x35994: 0x6d83d620, 0x35995: 0x6d83d820, 0x35996: 0x6d83da20, 0x35997: 0x6d83dc20, + 0x35998: 0x6d83de20, 0x35999: 0x6d83e020, 0x3599a: 0x6d83e220, 0x3599b: 0x6d83e420, + 0x3599c: 0x6d83e620, 0x3599d: 0x6d83e820, 0x3599e: 0x6d83ea20, 0x3599f: 0x6d83ec20, + 0x359a0: 0x6d793420, 0x359a1: 0x6d83ee20, 0x359a2: 0x6d83f020, 0x359a3: 0x6d83f220, + 0x359a4: 0x6d83f420, 0x359a5: 0x6d83f620, 0x359a6: 0x6d83f820, 0x359a7: 0x6d83fa20, + 0x359a8: 0x6d83fc20, 0x359a9: 0x6d83fe20, 0x359aa: 0x6d840020, 0x359ab: 0x6d840220, + 0x359ac: 0x6d840420, 0x359ad: 0x6d840620, 0x359ae: 0x6d840820, 0x359af: 0x6d840a20, + 0x359b0: 0x6d840c20, 0x359b1: 0x6d840e20, 0x359b2: 0x6d841020, 0x359b3: 0x6d841220, + 0x359b4: 0x6d841420, 0x359b5: 0x6da8ae20, 0x359b6: 0x6da8b020, 0x359b7: 0x6da8b220, + 0x359b8: 0x6da8b420, 0x359b9: 0x6da8b620, 0x359ba: 0x6da8b820, 0x359bb: 0x6da8ba20, + 0x359bc: 0x6da8bc20, 0x359bd: 0x6da8be20, 0x359be: 0x6da8c020, 0x359bf: 0x6da8c220, + // Block 0xd67, offset 0x359c0 + 0x359c0: 0x6da8c420, 0x359c1: 0x6da8c620, 0x359c2: 0x6da8c820, 0x359c3: 0x6da8ca20, + 0x359c4: 0x6da8cc20, 0x359c5: 0x6da8ce20, 0x359c6: 0x6da8d020, 0x359c7: 0x6da8d220, + 0x359c8: 0x6da8d420, 0x359c9: 0x6da8d620, 0x359ca: 0x6da8d820, 0x359cb: 0x6da8da20, + 0x359cc: 0x6da8dc20, 0x359cd: 0x6da8de20, 0x359ce: 0x6da8e020, 0x359cf: 0x6da8e220, + 0x359d0: 0x6da8e420, 0x359d1: 0x6da8e620, 0x359d2: 0x6da8e820, 0x359d3: 0x6da8ea20, + 0x359d4: 0x6da8ec20, 0x359d5: 0x6da8ee20, 0x359d6: 0x6da8f020, 0x359d7: 0x6da8f220, + 0x359d8: 0x6da8f420, 0x359d9: 0x6da8f620, 0x359da: 0x6da8f820, 0x359db: 0x6da8fa20, + 0x359dc: 0x6da8fc20, 0x359dd: 0x6da8fe20, 0x359de: 0x6da90020, 0x359df: 0x6da90220, + 0x359e0: 0x6da90420, 0x359e1: 0x6da90620, 0x359e2: 0x6da90820, 0x359e3: 0x6da90a20, + 0x359e4: 0x6dc9d420, 0x359e5: 0x6dc9d620, 0x359e6: 0x6dc9d820, 0x359e7: 0x6dc9da20, + 0x359e8: 0x6dc9dc20, 0x359e9: 0x6dc9de20, 0x359ea: 0x6dc9e020, 0x359eb: 0x6dc9e220, + 0x359ec: 0x6dc9e420, 0x359ed: 0x6dc9e620, 0x359ee: 0x6dc9e820, 0x359ef: 0x6dc9ea20, + 0x359f0: 0x6dc9ec20, 0x359f1: 0x6dc9ee20, 0x359f2: 0x6dc9f020, 0x359f3: 0x6dc9f220, + 0x359f4: 0x6dc9f420, 0x359f5: 0x6dc9f620, 0x359f6: 0x6dc9f820, 0x359f7: 0x6dc9fa20, + 0x359f8: 0x6dc9fc20, 0x359f9: 0x6dc9fe20, 0x359fa: 0x6dca0020, 0x359fb: 0x6dca0220, + 0x359fc: 0x6dca0420, 0x359fd: 0x6dca0620, 0x359fe: 0x6dca0820, 0x359ff: 0x6dca0a20, + // Block 0xd68, offset 0x35a00 + 0x35a00: 0x6dca0c20, 0x35a01: 0x6dca0e20, 0x35a02: 0x6dca1020, 0x35a03: 0x6dd07420, + 0x35a04: 0x6dca1220, 0x35a05: 0x6dca1420, 0x35a06: 0x6dca1620, 0x35a07: 0x6dca1820, + 0x35a08: 0x6dca1a20, 0x35a09: 0x6dca1c20, 0x35a0a: 0x6dca1e20, 0x35a0b: 0x6dca2020, + 0x35a0c: 0x6dca2220, 0x35a0d: 0x6dca2420, 0x35a0e: 0x6dca2620, 0x35a0f: 0x6dca2820, + 0x35a10: 0x6dca2a20, 0x35a11: 0x6dca2c20, 0x35a12: 0x6de58e20, 0x35a13: 0x6de59020, + 0x35a14: 0x6de59220, 0x35a15: 0x6de59420, 0x35a16: 0x6de59620, 0x35a17: 0x6de59820, + 0x35a18: 0x6de59a20, 0x35a19: 0x6de59c20, 0x35a1a: 0x6de59e20, 0x35a1b: 0x6de5a020, + 0x35a1c: 0x6de5a220, 0x35a1d: 0x6de5a420, 0x35a1e: 0x6de5a620, 0x35a1f: 0x6de5a820, + 0x35a20: 0x6de5aa20, 0x35a21: 0x6de5ac20, 0x35a22: 0x6de5ae20, 0x35a23: 0x6de5b020, + 0x35a24: 0x6de5b220, 0x35a25: 0x6de5b420, 0x35a26: 0x6de5b620, 0x35a27: 0x6de5b820, + 0x35a28: 0x6de5ba20, 0x35a29: 0x6de5bc20, 0x35a2a: 0x6de5be20, 0x35a2b: 0x6de5c020, + 0x35a2c: 0x6de5c220, 0x35a2d: 0x6de5c420, 0x35a2e: 0x6de5c620, 0x35a2f: 0x6de5c820, + 0x35a30: 0x6de5ca20, 0x35a31: 0x6de5cc20, 0x35a32: 0x6de5ce20, 0x35a33: 0x6dfc6620, + 0x35a34: 0x6dfc6820, 0x35a35: 0x6dfc6a20, 0x35a36: 0x6dfc6c20, 0x35a37: 0x6dfc6e20, + 0x35a38: 0x6dfc7020, 0x35a39: 0x6dfc7220, 0x35a3a: 0x6dfc7420, 0x35a3b: 0x6dfc7620, + 0x35a3c: 0x6dfc7820, 0x35a3d: 0x6dfc7a20, 0x35a3e: 0x6dfc7c20, 0x35a3f: 0x6dfc7e20, + // Block 0xd69, offset 0x35a40 + 0x35a40: 0x6dfc8020, 0x35a41: 0x6dfc8220, 0x35a42: 0x6dfc8420, 0x35a43: 0x6dfc8620, + 0x35a44: 0x6dfc8820, 0x35a45: 0x6dfc8a20, 0x35a46: 0x6dfc8c20, 0x35a47: 0x6dfc8e20, + 0x35a48: 0x6dfc9020, 0x35a49: 0x6dfc9220, 0x35a4a: 0x6dfc9420, 0x35a4b: 0x6dfc9620, + 0x35a4c: 0x6dfc9820, 0x35a4d: 0x6dfc9a20, 0x35a4e: 0x6dfc9c20, 0x35a4f: 0x6dfc9e20, + 0x35a50: 0x6dfca020, 0x35a51: 0x6dfca220, 0x35a52: 0x6dfca420, 0x35a53: 0x6dfca620, + 0x35a54: 0x6dfca820, 0x35a55: 0x6dfcaa20, 0x35a56: 0x6dfcac20, 0x35a57: 0x6dfcae20, + 0x35a58: 0x6dfcb020, 0x35a59: 0x6dfcb220, 0x35a5a: 0x6dfcb420, 0x35a5b: 0x6dfcb620, + 0x35a5c: 0x6dfcb820, 0x35a5d: 0x6dfcba20, 0x35a5e: 0x6dfcbc20, 0x35a5f: 0x6dfcbe20, + 0x35a60: 0x6dfcc020, 0x35a61: 0x6e0f8420, 0x35a62: 0x6e0f8620, 0x35a63: 0x6e0f8820, + 0x35a64: 0x6e0f8a20, 0x35a65: 0x6e0f8c20, 0x35a66: 0x6e0f8e20, 0x35a67: 0x6e0f9020, + 0x35a68: 0x6dfcc220, 0x35a69: 0x6e1e7820, 0x35a6a: 0x6e0f9220, 0x35a6b: 0x6e0f9420, + 0x35a6c: 0x6e0f9620, 0x35a6d: 0x6e0f9820, 0x35a6e: 0x6e0f9a20, 0x35a6f: 0x6e0f9c20, + 0x35a70: 0x6e0f9e20, 0x35a71: 0x6e0fa020, 0x35a72: 0x6e0fa220, 0x35a73: 0x6e0fa420, + 0x35a74: 0x6e0fa620, 0x35a75: 0x6e0fa820, 0x35a76: 0x6e0faa20, 0x35a77: 0x6e0fac20, + 0x35a78: 0x6e0fae20, 0x35a79: 0x6e0fb020, 0x35a7a: 0x6e1e7a20, 0x35a7b: 0x6e1e7c20, + 0x35a7c: 0x6e29de20, 0x35a7d: 0x6e1e7e20, 0x35a7e: 0x6e1e8020, 0x35a7f: 0x6e1e8220, + // Block 0xd6a, offset 0x35a80 + 0x35a80: 0x6e1e8420, 0x35a81: 0x6e1e8620, 0x35a82: 0x6e1e8820, 0x35a83: 0x6e1e8a20, + 0x35a84: 0x6e1e8c20, 0x35a85: 0x6e1e8e20, 0x35a86: 0x6e1e9020, 0x35a87: 0x6e1e9220, + 0x35a88: 0x6e29e020, 0x35a89: 0x6e29e220, 0x35a8a: 0x6e29e420, 0x35a8b: 0x6e29e620, + 0x35a8c: 0x6e29e820, 0x35a8d: 0x6e29ea20, 0x35a8e: 0x6e29ec20, 0x35a8f: 0x6e2b4a20, + 0x35a90: 0x6e29ee20, 0x35a91: 0x6e29f020, 0x35a92: 0x6e29f220, 0x35a93: 0x6e29f420, + 0x35a94: 0x6e29f620, 0x35a95: 0x6e29f820, 0x35a96: 0x6e29fa20, 0x35a97: 0x6e32c220, + 0x35a98: 0x6e32c420, 0x35a99: 0x6e32c620, 0x35a9a: 0x6e32c820, 0x35a9b: 0x6e32ca20, + 0x35a9c: 0x6e38f820, 0x35a9d: 0x6e38fa20, 0x35a9e: 0x6e38fc20, 0x35a9f: 0x6e33dc20, + 0x35aa0: 0x6e38fe20, 0x35aa1: 0x6e390020, 0x35aa2: 0x6e390220, 0x35aa3: 0x6e390420, + 0x35aa4: 0x6e3d6820, 0x35aa5: 0x6e3d6a20, 0x35aa6: 0x6e406c20, 0x35aa7: 0x6e406e20, + 0x35aa8: 0x6e407020, 0x35aa9: 0x6e407220, 0x35aaa: 0x6e42b820, 0x35aab: 0x6e443620, + 0x35aac: 0x6e42ba20, 0x35aad: 0x6e452420, 0x35aae: 0x6e468420, 0x35aaf: 0x6c04da20, + 0x35ab0: 0x6c04dc20, 0x35ab1: 0x6c09d020, 0x35ab2: 0x6c23d020, 0x35ab3: 0x6c23d220, + 0x35ab4: 0x6c23d420, 0x35ab5: 0x6c23d620, 0x35ab6: 0x6c3a2c20, 0x35ab7: 0x6c3a2e20, + 0x35ab8: 0x6c3a3020, 0x35ab9: 0x6c3a3220, 0x35aba: 0x6c3a3420, 0x35abb: 0x6c3a3620, + 0x35abc: 0x6c3a3820, 0x35abd: 0x6c55f420, 0x35abe: 0x6c55f620, 0x35abf: 0x6c55f820, + // Block 0xd6b, offset 0x35ac0 + 0x35ac0: 0x6c55fa20, 0x35ac1: 0x6c55fc20, 0x35ac2: 0x6c55fe20, 0x35ac3: 0x6c560020, + 0x35ac4: 0x6c560220, 0x35ac5: 0x6c560420, 0x35ac6: 0x6c560620, 0x35ac7: 0x6c560820, + 0x35ac8: 0x6c560a20, 0x35ac9: 0x6c560c20, 0x35aca: 0x6c560e20, 0x35acb: 0x6c561020, + 0x35acc: 0x6c78cc20, 0x35acd: 0x6c78ce20, 0x35ace: 0x6c78d020, 0x35acf: 0x6c78d220, + 0x35ad0: 0x6ca1d020, 0x35ad1: 0x6ca1d220, 0x35ad2: 0x6ca1d420, 0x35ad3: 0x6ca1d620, + 0x35ad4: 0x6ccf0c20, 0x35ad5: 0x6ccf0e20, 0x35ad6: 0x6ccf1020, 0x35ad7: 0x6cbc6220, + 0x35ad8: 0x6ccf1220, 0x35ad9: 0x6ccf1420, 0x35ada: 0x6ccf1620, 0x35adb: 0x6ccf1820, + 0x35adc: 0x6cfd2e20, 0x35add: 0x6cfd3020, 0x35ade: 0x6cfd3220, 0x35adf: 0x6cfd3420, + 0x35ae0: 0x6cfd3620, 0x35ae1: 0x6cfd3820, 0x35ae2: 0x6d2bde20, 0x35ae3: 0x6d2be020, + 0x35ae4: 0x6d2be220, 0x35ae5: 0x6d2be420, 0x35ae6: 0x6d2be620, 0x35ae7: 0x6d590620, + 0x35ae8: 0x6d590820, 0x35ae9: 0x6d590a20, 0x35aea: 0x6d590c20, 0x35aeb: 0x6d590e20, + 0x35aec: 0x6d591020, 0x35aed: 0x6d591220, 0x35aee: 0x6d842a20, 0x35aef: 0x6d842c20, + 0x35af0: 0x6d842e20, 0x35af1: 0x6d843020, 0x35af2: 0x6da91c20, 0x35af3: 0x6da91e20, + 0x35af4: 0x6da92020, 0x35af5: 0x6da92220, 0x35af6: 0x6da92420, 0x35af7: 0x6da92620, + 0x35af8: 0x6da92820, 0x35af9: 0x6dca3a20, 0x35afa: 0x6de5d420, 0x35afb: 0x6dca3c20, + 0x35afc: 0x6da92a20, 0x35afd: 0x6dca3e20, 0x35afe: 0x6dca4020, 0x35aff: 0x6de5d620, + // Block 0xd6c, offset 0x35b00 + 0x35b00: 0x6de5d820, 0x35b01: 0x6de9a820, 0x35b02: 0x6dfcca20, 0x35b03: 0x6dfccc20, + 0x35b04: 0x6dfcce20, 0x35b05: 0x6dfcd020, 0x35b06: 0x6dfcd220, 0x35b07: 0x6e0fb420, + 0x35b08: 0x6e29fe20, 0x35b09: 0x6e2a0020, 0x35b0a: 0x6e2a0220, 0x35b0b: 0x6e32ce20, + 0x35b0c: 0x6e390a20, 0x35b0d: 0x6e390c20, 0x35b0e: 0x6c23da20, 0x35b0f: 0x6c23dc20, + 0x35b10: 0x6c3a3c20, 0x35b11: 0x6c3a3e20, 0x35b12: 0x6c561620, 0x35b13: 0x6c78d820, + 0x35b14: 0x6c78da20, 0x35b15: 0x6ca1dc20, 0x35b16: 0x6ccf2220, 0x35b17: 0x6ccf2420, + 0x35b18: 0x6cfd4220, 0x35b19: 0x6d2be820, 0x35b1a: 0x6d2bea20, 0x35b1b: 0x6d843220, + 0x35b1c: 0x6c09d220, 0x35b1d: 0x6c3a4220, 0x35b1e: 0x6c561a20, 0x35b1f: 0x6c561c20, + 0x35b20: 0x6c78de20, 0x35b21: 0x6c78e020, 0x35b22: 0x6ca1e220, 0x35b23: 0x6ccf2620, + 0x35b24: 0x6cfd4420, 0x35b25: 0x6cfd4620, 0x35b26: 0x6d591820, 0x35b27: 0x6d591a20, + 0x35b28: 0x6d591c20, 0x35b29: 0x6d843420, 0x35b2a: 0x6c04e620, 0x35b2b: 0x6c09d420, + 0x35b2c: 0x6c09d620, 0x35b2d: 0x6c137c20, 0x35b2e: 0x6c23de20, 0x35b2f: 0x6c3a4820, + 0x35b30: 0x6c3a4a20, 0x35b31: 0x6c3a4c20, 0x35b32: 0x6c562220, 0x35b33: 0x6c562420, + 0x35b34: 0x6c562620, 0x35b35: 0x6c562820, 0x35b36: 0x6c78e420, 0x35b37: 0x6c78e620, + 0x35b38: 0x6c78e820, 0x35b39: 0x6c78ea20, 0x35b3a: 0x6c78ec20, 0x35b3b: 0x6ca1e420, + 0x35b3c: 0x6ca1e620, 0x35b3d: 0x6ca1e820, 0x35b3e: 0x6ca1ea20, 0x35b3f: 0x6ca1ec20, + // Block 0xd6d, offset 0x35b40 + 0x35b40: 0x6ca1ee20, 0x35b41: 0x6ca1f020, 0x35b42: 0x6ca1f220, 0x35b43: 0x6ca1f420, + 0x35b44: 0x6ccf2a20, 0x35b45: 0x6ccf2c20, 0x35b46: 0x6ccf2e20, 0x35b47: 0x6ccf3020, + 0x35b48: 0x6ccf3220, 0x35b49: 0x6ccf3420, 0x35b4a: 0x6ccf3620, 0x35b4b: 0x6ccf3820, + 0x35b4c: 0x6cfd4a20, 0x35b4d: 0x6cfd4c20, 0x35b4e: 0x6cfd4e20, 0x35b4f: 0x6d2bf220, + 0x35b50: 0x6d2bf420, 0x35b51: 0x6d2bf620, 0x35b52: 0x6d2bf820, 0x35b53: 0x6d592020, + 0x35b54: 0x6d592220, 0x35b55: 0x6d592420, 0x35b56: 0x6d843620, 0x35b57: 0x6d843820, + 0x35b58: 0x6d843a20, 0x35b59: 0x6d843c20, 0x35b5a: 0x6d843e20, 0x35b5b: 0x6d844020, + 0x35b5c: 0x6da93420, 0x35b5d: 0x6da93620, 0x35b5e: 0x6da93820, 0x35b5f: 0x6da93a20, + 0x35b60: 0x6de5de20, 0x35b61: 0x6de5e020, 0x35b62: 0x6dfcd420, 0x35b63: 0x6e1e9820, + 0x35b64: 0x6e2a0420, 0x35b65: 0x6e407620, 0x35b66: 0x6e42bc20, 0x35b67: 0x6e42be20, + 0x35b68: 0x6c09d820, 0x35b69: 0x6c23e020, 0x35b6a: 0x6c23e220, 0x35b6b: 0x6c23e420, + 0x35b6c: 0x6c3a5420, 0x35b6d: 0x6c3a5620, 0x35b6e: 0x6c3a5820, 0x35b6f: 0x6c3a5a20, + 0x35b70: 0x6c3a5c20, 0x35b71: 0x6c562e20, 0x35b72: 0x6c563020, 0x35b73: 0x6c563220, + 0x35b74: 0x6c563420, 0x35b75: 0x6c563620, 0x35b76: 0x6c563820, 0x35b77: 0x6c563a20, + 0x35b78: 0x6c563c20, 0x35b79: 0x6c563e20, 0x35b7a: 0x6c78f420, 0x35b7b: 0x6c78f620, + 0x35b7c: 0x6c78f820, 0x35b7d: 0x6c78fa20, 0x35b7e: 0x6c78fc20, 0x35b7f: 0x6c78fe20, + // Block 0xd6e, offset 0x35b80 + 0x35b80: 0x6ca1f820, 0x35b81: 0x6ca1fa20, 0x35b82: 0x6ca1fc20, 0x35b83: 0x6ca1fe20, + 0x35b84: 0x6ca20020, 0x35b85: 0x6ca20220, 0x35b86: 0x6ca20420, 0x35b87: 0x6ccf4220, + 0x35b88: 0x6ccf4420, 0x35b89: 0x6ccf4620, 0x35b8a: 0x6ccf4820, 0x35b8b: 0x6ccf4a20, + 0x35b8c: 0x6ccf4c20, 0x35b8d: 0x6ccf4e20, 0x35b8e: 0x6ccf5020, 0x35b8f: 0x6ccf5220, + 0x35b90: 0x6ccf5420, 0x35b91: 0x6ccf5620, 0x35b92: 0x6ccf5820, 0x35b93: 0x6ccf5a20, + 0x35b94: 0x6ccf5c20, 0x35b95: 0x6ccf5e20, 0x35b96: 0x6ccf6020, 0x35b97: 0x6ccf6220, + 0x35b98: 0x6cfd5a20, 0x35b99: 0x6cfd5c20, 0x35b9a: 0x6cfd5e20, 0x35b9b: 0x6cfd6020, + 0x35b9c: 0x6cfd6220, 0x35b9d: 0x6cfd6420, 0x35b9e: 0x6cfd6620, 0x35b9f: 0x6cfd6820, + 0x35ba0: 0x6cfd6a20, 0x35ba1: 0x6cfd6c20, 0x35ba2: 0x6d2c0020, 0x35ba3: 0x6d2c0220, + 0x35ba4: 0x6d2c0420, 0x35ba5: 0x6d2c0620, 0x35ba6: 0x6d2c0820, 0x35ba7: 0x6d2c0a20, + 0x35ba8: 0x6d592e20, 0x35ba9: 0x6d593020, 0x35baa: 0x6d593220, 0x35bab: 0x6d593420, + 0x35bac: 0x6d593620, 0x35bad: 0x6d593820, 0x35bae: 0x6d593a20, 0x35baf: 0x6d593c20, + 0x35bb0: 0x6d593e20, 0x35bb1: 0x6d594020, 0x35bb2: 0x6d594220, 0x35bb3: 0x6d844220, + 0x35bb4: 0x6d844420, 0x35bb5: 0x6d844620, 0x35bb6: 0x6d844820, 0x35bb7: 0x6d844a20, + 0x35bb8: 0x6d844c20, 0x35bb9: 0x6d844e20, 0x35bba: 0x6da93e20, 0x35bbb: 0x6da94020, + 0x35bbc: 0x6da94220, 0x35bbd: 0x6da94420, 0x35bbe: 0x6da94620, 0x35bbf: 0x6dca4620, + // Block 0xd6f, offset 0x35bc0 + 0x35bc0: 0x6dca4820, 0x35bc1: 0x6dca4a20, 0x35bc2: 0x6dca4c20, 0x35bc3: 0x6dfcd620, + 0x35bc4: 0x6e0fb820, 0x35bc5: 0x6c23e620, 0x35bc6: 0x6c3a5e20, 0x35bc7: 0x6c564020, + 0x35bc8: 0x6c790420, 0x35bc9: 0x6c790620, 0x35bca: 0x6ca20a20, 0x35bcb: 0x6ca20c20, + 0x35bcc: 0x6ccf6820, 0x35bcd: 0x6ccf6a20, 0x35bce: 0x6ccf6c20, 0x35bcf: 0x6ccf6e20, + 0x35bd0: 0x6cfd6e20, 0x35bd1: 0x6d2c0c20, 0x35bd2: 0x6d594420, 0x35bd3: 0x6dca4e20, + 0x35bd4: 0x6c09da20, 0x35bd5: 0x6c138620, 0x35bd6: 0x6c138820, 0x35bd7: 0x6c138a20, + 0x35bd8: 0x6c23f620, 0x35bd9: 0x6c23f820, 0x35bda: 0x6c23fa20, 0x35bdb: 0x6c23fc20, + 0x35bdc: 0x6c3a7c20, 0x35bdd: 0x6c3a7e20, 0x35bde: 0x6c3a8020, 0x35bdf: 0x6c3a8220, + 0x35be0: 0x6c3a8420, 0x35be1: 0x6c3a8620, 0x35be2: 0x6c3a8820, 0x35be3: 0x6c3a8a20, + 0x35be4: 0x6c3a8c20, 0x35be5: 0x6c3a8e20, 0x35be6: 0x6c3a9020, 0x35be7: 0x6c3a9220, + 0x35be8: 0x6c3a9420, 0x35be9: 0x6c3a9620, 0x35bea: 0x6c3a9820, 0x35beb: 0x6c3a9a20, + 0x35bec: 0x6c3a9c20, 0x35bed: 0x6c3a9e20, 0x35bee: 0x6c3aa020, 0x35bef: 0x6c3aa220, + 0x35bf0: 0x6c3aa420, 0x35bf1: 0x6c3aa620, 0x35bf2: 0x6c3aa820, 0x35bf3: 0x6c3aaa20, + 0x35bf4: 0x6c3aac20, 0x35bf5: 0x6c3aae20, 0x35bf6: 0x6c3ab020, 0x35bf7: 0x6c3ab220, + 0x35bf8: 0x6c565e20, 0x35bf9: 0x6c566020, 0x35bfa: 0x6c566220, 0x35bfb: 0x6c566420, + 0x35bfc: 0x6c566620, 0x35bfd: 0x6c566820, 0x35bfe: 0x6c566a20, 0x35bff: 0x6c566c20, + // Block 0xd70, offset 0x35c00 + 0x35c00: 0x6c566e20, 0x35c01: 0x6c567020, 0x35c02: 0x6c567220, 0x35c03: 0x6c567420, + 0x35c04: 0x6c567620, 0x35c05: 0x6c567820, 0x35c06: 0x6c567a20, 0x35c07: 0x6c567c20, + 0x35c08: 0x6c567e20, 0x35c09: 0x6c568020, 0x35c0a: 0x6c568220, 0x35c0b: 0x6c568420, + 0x35c0c: 0x6c568620, 0x35c0d: 0x6c568820, 0x35c0e: 0x6c568a20, 0x35c0f: 0x6c568c20, + 0x35c10: 0x6c568e20, 0x35c11: 0x6c791a20, 0x35c12: 0x6c791c20, 0x35c13: 0x6c791e20, + 0x35c14: 0x6c792020, 0x35c15: 0x6c792220, 0x35c16: 0x6c792420, 0x35c17: 0x6c792620, + 0x35c18: 0x6c792820, 0x35c19: 0x6c792a20, 0x35c1a: 0x6c792c20, 0x35c1b: 0x6ca22a20, + 0x35c1c: 0x6ca22c20, 0x35c1d: 0x6ca22e20, 0x35c1e: 0x6ca23020, 0x35c1f: 0x6ca23220, + 0x35c20: 0x6ca23420, 0x35c21: 0x6ca23620, 0x35c22: 0x6ca23820, 0x35c23: 0x6ca23a20, + 0x35c24: 0x6ca23c20, 0x35c25: 0x6ca23e20, 0x35c26: 0x6ca24020, 0x35c27: 0x6ca24220, + 0x35c28: 0x6ca24420, 0x35c29: 0x6ca24620, 0x35c2a: 0x6ca24820, 0x35c2b: 0x6ca24a20, + 0x35c2c: 0x6ca24c20, 0x35c2d: 0x6ca24e20, 0x35c2e: 0x6ca25020, 0x35c2f: 0x6ccf8e20, + 0x35c30: 0x6ccf9020, 0x35c31: 0x6ccf9220, 0x35c32: 0x6ccf9420, 0x35c33: 0x6ccf9620, + 0x35c34: 0x6ccf9820, 0x35c35: 0x6ccf9a20, 0x35c36: 0x6ccf9c20, 0x35c37: 0x6ccf9e20, + 0x35c38: 0x6ccfa020, 0x35c39: 0x6ccfa220, 0x35c3a: 0x6ccfa420, 0x35c3b: 0x6ccfa620, + 0x35c3c: 0x6ccfa820, 0x35c3d: 0x6ccfaa20, 0x35c3e: 0x6ccfac20, 0x35c3f: 0x6ccfae20, + // Block 0xd71, offset 0x35c40 + 0x35c40: 0x6ccfb020, 0x35c41: 0x6ccfb220, 0x35c42: 0x6ccfb420, 0x35c43: 0x6ccfb620, + 0x35c44: 0x6ccfb820, 0x35c45: 0x6ccfba20, 0x35c46: 0x6ccfbc20, 0x35c47: 0x6ccfbe20, + 0x35c48: 0x6ccfc020, 0x35c49: 0x6ccfc220, 0x35c4a: 0x6ccfc420, 0x35c4b: 0x6ccfc620, + 0x35c4c: 0x6ccfc820, 0x35c4d: 0x6cfd8420, 0x35c4e: 0x6cfd8620, 0x35c4f: 0x6cfd8820, + 0x35c50: 0x6cfd8a20, 0x35c51: 0x6cfd8c20, 0x35c52: 0x6cfd8e20, 0x35c53: 0x6cfd9020, + 0x35c54: 0x6cfd9220, 0x35c55: 0x6cfd9420, 0x35c56: 0x6cfd9620, 0x35c57: 0x6cfd9820, + 0x35c58: 0x6cfd9a20, 0x35c59: 0x6cfd9c20, 0x35c5a: 0x6cfd9e20, 0x35c5b: 0x6cfda020, + 0x35c5c: 0x6cf91a20, 0x35c5d: 0x6cfda220, 0x35c5e: 0x6cfda420, 0x35c5f: 0x6cfda620, + 0x35c60: 0x6cfda820, 0x35c61: 0x6cfdaa20, 0x35c62: 0x6cfdac20, 0x35c63: 0x6cfdae20, + 0x35c64: 0x6cfdb020, 0x35c65: 0x6cfdb220, 0x35c66: 0x6cfdb420, 0x35c67: 0x6cfdb620, + 0x35c68: 0x6cfdb820, 0x35c69: 0x6d2c2220, 0x35c6a: 0x6d2c2420, 0x35c6b: 0x6d2c2620, + 0x35c6c: 0x6d2c2820, 0x35c6d: 0x6d2c2a20, 0x35c6e: 0x6d2c2c20, 0x35c6f: 0x6d2c2e20, + 0x35c70: 0x6d2c3020, 0x35c71: 0x6d2c3220, 0x35c72: 0x6d2c3420, 0x35c73: 0x6d2c3620, + 0x35c74: 0x6d2c3820, 0x35c75: 0x6d2c3a20, 0x35c76: 0x6d2c3c20, 0x35c77: 0x6d2c3e20, + 0x35c78: 0x6d2c4020, 0x35c79: 0x6d2c4220, 0x35c7a: 0x6d2c4420, 0x35c7b: 0x6d2c4620, + 0x35c7c: 0x6d2c4820, 0x35c7d: 0x6d2c4a20, 0x35c7e: 0x6d2c4c20, 0x35c7f: 0x6cfdba20, + // Block 0xd72, offset 0x35c80 + 0x35c80: 0x6d2c4e20, 0x35c81: 0x6d2c5020, 0x35c82: 0x6d2c5220, 0x35c83: 0x6d2c5420, + 0x35c84: 0x6d2c5620, 0x35c85: 0x6d2c5820, 0x35c86: 0x6d2c5a20, 0x35c87: 0x6d2c5c20, + 0x35c88: 0x6d2c5e20, 0x35c89: 0x6d2c6020, 0x35c8a: 0x6d595820, 0x35c8b: 0x6d595a20, + 0x35c8c: 0x6d595c20, 0x35c8d: 0x6d595e20, 0x35c8e: 0x6d596020, 0x35c8f: 0x6d596220, + 0x35c90: 0x6d596420, 0x35c91: 0x6d596620, 0x35c92: 0x6d596820, 0x35c93: 0x6d596a20, + 0x35c94: 0x6d596c20, 0x35c95: 0x6d596e20, 0x35c96: 0x6d597020, 0x35c97: 0x6d55d820, + 0x35c98: 0x6d597220, 0x35c99: 0x6d597420, 0x35c9a: 0x6d597620, 0x35c9b: 0x6d597820, + 0x35c9c: 0x6d597a20, 0x35c9d: 0x6d597c20, 0x35c9e: 0x6d597e20, 0x35c9f: 0x6d598020, + 0x35ca0: 0x6d598220, 0x35ca1: 0x6d846020, 0x35ca2: 0x6d846220, 0x35ca3: 0x6d846420, + 0x35ca4: 0x6d846620, 0x35ca5: 0x6d846820, 0x35ca6: 0x6d846a20, 0x35ca7: 0x6d846c20, + 0x35ca8: 0x6d846e20, 0x35ca9: 0x6d847020, 0x35caa: 0x6d847220, 0x35cab: 0x6d847420, + 0x35cac: 0x6d847620, 0x35cad: 0x6d847820, 0x35cae: 0x6d847a20, 0x35caf: 0x6da95020, + 0x35cb0: 0x6da95220, 0x35cb1: 0x6da95420, 0x35cb2: 0x6da95620, 0x35cb3: 0x6da95820, + 0x35cb4: 0x6da95a20, 0x35cb5: 0x6da95c20, 0x35cb6: 0x6da95e20, 0x35cb7: 0x6da96020, + 0x35cb8: 0x6da96220, 0x35cb9: 0x6dca5420, 0x35cba: 0x6dca5620, 0x35cbb: 0x6de5f220, + 0x35cbc: 0x6de5f420, 0x35cbd: 0x6de5f620, 0x35cbe: 0x6de5f820, 0x35cbf: 0x6de5fa20, + // Block 0xd73, offset 0x35cc0 + 0x35cc0: 0x6de5fc20, 0x35cc1: 0x6de5fe20, 0x35cc2: 0x6dfcdc20, 0x35cc3: 0x6dfcde20, + 0x35cc4: 0x6dfce020, 0x35cc5: 0x6dfce220, 0x35cc6: 0x6dfce420, 0x35cc7: 0x6e0fbc20, + 0x35cc8: 0x6e0fbe20, 0x35cc9: 0x6e0fc020, 0x35cca: 0x6e0fc220, 0x35ccb: 0x6e0fc420, + 0x35ccc: 0x6e1e9e20, 0x35ccd: 0x6e1ea020, 0x35cce: 0x6e1ea220, 0x35ccf: 0x6e1ea420, + 0x35cd0: 0x6e1ea620, 0x35cd1: 0x6e2a0620, 0x35cd2: 0x6e2a0820, 0x35cd3: 0x6e2a0a20, + 0x35cd4: 0x6e32d020, 0x35cd5: 0x6e32d220, 0x35cd6: 0x6e391020, 0x35cd7: 0x6e391220, + 0x35cd8: 0x6e391420, 0x35cd9: 0x6e42c020, 0x35cda: 0x6c04f820, 0x35cdb: 0x6c09e220, + 0x35cdc: 0x6c09e420, 0x35cdd: 0x6c09e620, 0x35cde: 0x6c09e820, 0x35cdf: 0x6c09ea20, + 0x35ce0: 0x6c09ec20, 0x35ce1: 0x6c139a20, 0x35ce2: 0x6c139c20, 0x35ce3: 0x6c139e20, + 0x35ce4: 0x6c13a020, 0x35ce5: 0x6c13a220, 0x35ce6: 0x6c13a420, 0x35ce7: 0x6c13a620, + 0x35ce8: 0x6c13a820, 0x35ce9: 0x6c13aa20, 0x35cea: 0x6c13ac20, 0x35ceb: 0x6c13ae20, + 0x35cec: 0x6c13b020, 0x35ced: 0x6c13b220, 0x35cee: 0x6c13b420, 0x35cef: 0x6c242820, + 0x35cf0: 0x6c242a20, 0x35cf1: 0x6c242c20, 0x35cf2: 0x6c242e20, 0x35cf3: 0x6c243020, + 0x35cf4: 0x6c243220, 0x35cf5: 0x6c243420, 0x35cf6: 0x6c243620, 0x35cf7: 0x6c243820, + 0x35cf8: 0x6c243a20, 0x35cf9: 0x6c243c20, 0x35cfa: 0x6c243e20, 0x35cfb: 0x6c244020, + 0x35cfc: 0x6c244220, 0x35cfd: 0x6c244420, 0x35cfe: 0x6c244620, 0x35cff: 0x6c244820, + // Block 0xd74, offset 0x35d00 + 0x35d00: 0x6c244a20, 0x35d01: 0x6c244c20, 0x35d02: 0x6c244e20, 0x35d03: 0x6c245020, + 0x35d04: 0x6c245220, 0x35d05: 0x6c245420, 0x35d06: 0x6c245620, 0x35d07: 0x6c245820, + 0x35d08: 0x6c245a20, 0x35d09: 0x6c245c20, 0x35d0a: 0x6c245e20, 0x35d0b: 0x6c246020, + 0x35d0c: 0x6c246220, 0x35d0d: 0x6c246420, 0x35d0e: 0x6c246620, 0x35d0f: 0x6c3af620, + 0x35d10: 0x6c3af820, 0x35d11: 0x6c3afa20, 0x35d12: 0x6c3afc20, 0x35d13: 0x6c3afe20, + 0x35d14: 0x6c3b0020, 0x35d15: 0x6c3b0220, 0x35d16: 0x6c3b0420, 0x35d17: 0x6c3b0620, + 0x35d18: 0x6c3b0820, 0x35d19: 0x6c3b0a20, 0x35d1a: 0x6c3b0c20, 0x35d1b: 0x6c3b0e20, + 0x35d1c: 0x6c3b1020, 0x35d1d: 0x6c3b1220, 0x35d1e: 0x6c3b1420, 0x35d1f: 0x6c3b1620, + 0x35d20: 0x6c3b1820, 0x35d21: 0x6c3b1a20, 0x35d22: 0x6c3b1c20, 0x35d23: 0x6c3b1e20, + 0x35d24: 0x6c3b2020, 0x35d25: 0x6c3b2220, 0x35d26: 0x6c3b2420, 0x35d27: 0x6c3b2620, + 0x35d28: 0x6c3b2820, 0x35d29: 0x6c3b2a20, 0x35d2a: 0x6c3b2c20, 0x35d2b: 0x6c3b2e20, + 0x35d2c: 0x6c3b3020, 0x35d2d: 0x6c3b3220, 0x35d2e: 0x6c246820, 0x35d2f: 0x6c56cc20, + 0x35d30: 0x6c56ce20, 0x35d31: 0x6c56d020, 0x35d32: 0x6c56d220, 0x35d33: 0x6c56d420, + 0x35d34: 0x6c56d620, 0x35d35: 0x6c56d820, 0x35d36: 0x6c56da20, 0x35d37: 0x6c56dc20, + 0x35d38: 0x6c56de20, 0x35d39: 0x6c56e020, 0x35d3a: 0x6c56e220, 0x35d3b: 0x6c56e420, + 0x35d3c: 0x6c56e620, 0x35d3d: 0x6c56e820, 0x35d3e: 0x6c56ea20, 0x35d3f: 0x6c56ec20, + // Block 0xd75, offset 0x35d40 + 0x35d40: 0x6c56ee20, 0x35d41: 0x6c56f020, 0x35d42: 0x6c56f220, 0x35d43: 0x6c56f420, + 0x35d44: 0x6c56f620, 0x35d45: 0x6c56f820, 0x35d46: 0x6c56fa20, 0x35d47: 0x6c56fc20, + 0x35d48: 0x6c56fe20, 0x35d49: 0x6c570020, 0x35d4a: 0x6c570220, 0x35d4b: 0x6c570420, + 0x35d4c: 0x6c570620, 0x35d4d: 0x6c570820, 0x35d4e: 0x6c570a20, 0x35d4f: 0x6c570c20, + 0x35d50: 0x6c570e20, 0x35d51: 0x6c571020, 0x35d52: 0x6c571220, 0x35d53: 0x6c571420, + 0x35d54: 0x6c571620, 0x35d55: 0x6c571820, 0x35d56: 0x6c571a20, 0x35d57: 0x6c571c20, + 0x35d58: 0x6c571e20, 0x35d59: 0x6c796420, 0x35d5a: 0x6c796620, 0x35d5b: 0x6c796820, + 0x35d5c: 0x6c796a20, 0x35d5d: 0x6c796c20, 0x35d5e: 0x6c796e20, 0x35d5f: 0x6c797020, + 0x35d60: 0x6c797220, 0x35d61: 0x6c797420, 0x35d62: 0x6c797620, 0x35d63: 0x6c572020, + 0x35d64: 0x6c797820, 0x35d65: 0x6c797a20, 0x35d66: 0x6c797c20, 0x35d67: 0x6c797e20, + 0x35d68: 0x6c798020, 0x35d69: 0x6c798220, 0x35d6a: 0x6c798420, 0x35d6b: 0x6c798620, + 0x35d6c: 0x6c798820, 0x35d6d: 0x6c798a20, 0x35d6e: 0x6c798c20, 0x35d6f: 0x6c798e20, + 0x35d70: 0x6c799020, 0x35d71: 0x6c799220, 0x35d72: 0x6c799420, 0x35d73: 0x6c799620, + 0x35d74: 0x6c799820, 0x35d75: 0x6c799a20, 0x35d76: 0x6c799c20, 0x35d77: 0x6c799e20, + 0x35d78: 0x6c79a020, 0x35d79: 0x6c79a220, 0x35d7a: 0x6c79a420, 0x35d7b: 0x6c79a620, + 0x35d7c: 0x6c79a820, 0x35d7d: 0x6c79aa20, 0x35d7e: 0x6c79ac20, 0x35d7f: 0x6c79ae20, + // Block 0xd76, offset 0x35d80 + 0x35d80: 0x6c79b020, 0x35d81: 0x6c79b220, 0x35d82: 0x6c79b420, 0x35d83: 0x6ca29a20, + 0x35d84: 0x6ca29c20, 0x35d85: 0x6ca29e20, 0x35d86: 0x6ca2a020, 0x35d87: 0x6ca2a220, + 0x35d88: 0x6ca2a420, 0x35d89: 0x6ca2a620, 0x35d8a: 0x6ca2a820, 0x35d8b: 0x6ca2aa20, + 0x35d8c: 0x6ca2ac20, 0x35d8d: 0x6ca2ae20, 0x35d8e: 0x6ca2b020, 0x35d8f: 0x6ca2b220, + 0x35d90: 0x6ca2b420, 0x35d91: 0x6ca2b620, 0x35d92: 0x6ca2b820, 0x35d93: 0x6ca2ba20, + 0x35d94: 0x6ca2bc20, 0x35d95: 0x6ca2be20, 0x35d96: 0x6ca2c020, 0x35d97: 0x6ca2c220, + 0x35d98: 0x6ca2c420, 0x35d99: 0x6ca2c620, 0x35d9a: 0x6ca2c820, 0x35d9b: 0x6ca2ca20, + 0x35d9c: 0x6cd00c20, 0x35d9d: 0x6cd00e20, 0x35d9e: 0x6cd01020, 0x35d9f: 0x6cd01220, + 0x35da0: 0x6cd01420, 0x35da1: 0x6cd01620, 0x35da2: 0x6cd01820, 0x35da3: 0x6cd01a20, + 0x35da4: 0x6cd01c20, 0x35da5: 0x6cd01e20, 0x35da6: 0x6cd02020, 0x35da7: 0x6cd02220, + 0x35da8: 0x6cd02420, 0x35da9: 0x6cd02620, 0x35daa: 0x6cd02820, 0x35dab: 0x6cd02a20, + 0x35dac: 0x6cd02c20, 0x35dad: 0x6cd02e20, 0x35dae: 0x6cd03020, 0x35daf: 0x6cd03220, + 0x35db0: 0x6cd03420, 0x35db1: 0x6cd03620, 0x35db2: 0x6cd03820, 0x35db3: 0x6cd03a20, + 0x35db4: 0x6cd03c20, 0x35db5: 0x6cf3a620, 0x35db6: 0x6cd03e20, 0x35db7: 0x6cd04020, + 0x35db8: 0x6cd04220, 0x35db9: 0x6cd04420, 0x35dba: 0x6cd04620, 0x35dbb: 0x6cd04820, + 0x35dbc: 0x6cd04a20, 0x35dbd: 0x6cd04c20, 0x35dbe: 0x6cd04e20, 0x35dbf: 0x6cd05020, + // Block 0xd77, offset 0x35dc0 + 0x35dc0: 0x6cd05220, 0x35dc1: 0x6cd05420, 0x35dc2: 0x6cd05620, 0x35dc3: 0x6cd05820, + 0x35dc4: 0x6cd05a20, 0x35dc5: 0x6cd05c20, 0x35dc6: 0x6cd05e20, 0x35dc7: 0x6cd06020, + 0x35dc8: 0x6cd06220, 0x35dc9: 0x6cd06420, 0x35dca: 0x6cd06620, 0x35dcb: 0x6cd06820, + 0x35dcc: 0x6cd06a20, 0x35dcd: 0x6cfdee20, 0x35dce: 0x6cfdf020, 0x35dcf: 0x6cfdf220, + 0x35dd0: 0x6cfdf420, 0x35dd1: 0x6cfdf620, 0x35dd2: 0x6cfdf820, 0x35dd3: 0x6cfdfa20, + 0x35dd4: 0x6cfdfc20, 0x35dd5: 0x6cfdfe20, 0x35dd6: 0x6cfe0020, 0x35dd7: 0x6cfe0220, + 0x35dd8: 0x6cfe0420, 0x35dd9: 0x6cfe0620, 0x35dda: 0x6cfe0820, 0x35ddb: 0x6cfe0a20, + 0x35ddc: 0x6cfe0c20, 0x35ddd: 0x6cfe0e20, 0x35dde: 0x6cfe1020, 0x35ddf: 0x6cfe1220, + 0x35de0: 0x6cfe1420, 0x35de1: 0x6cfe1620, 0x35de2: 0x6cfe1820, 0x35de3: 0x6cfe1a20, + 0x35de4: 0x6cfe1c20, 0x35de5: 0x6cfe1e20, 0x35de6: 0x6cfe2020, 0x35de7: 0x6cfe2220, + 0x35de8: 0x6cfe2420, 0x35de9: 0x6cfe2620, 0x35dea: 0x6cfe2820, 0x35deb: 0x6cfe2a20, + 0x35dec: 0x6cfe2c20, 0x35ded: 0x6cfe2e20, 0x35dee: 0x6cfe3020, 0x35def: 0x6cfe3220, + 0x35df0: 0x6cfe3420, 0x35df1: 0x6cfe3620, 0x35df2: 0x6cfe3820, 0x35df3: 0x6cfe3a20, + 0x35df4: 0x6cfe3c20, 0x35df5: 0x6cfe3e20, 0x35df6: 0x6cfe4020, 0x35df7: 0x6cfe4220, + 0x35df8: 0x6cfe4420, 0x35df9: 0x6d2c8a20, 0x35dfa: 0x6d2c8c20, 0x35dfb: 0x6d2c8e20, + 0x35dfc: 0x6d2c9020, 0x35dfd: 0x6d2c9220, 0x35dfe: 0x6d2c9420, 0x35dff: 0x6d2c9620, + // Block 0xd78, offset 0x35e00 + 0x35e00: 0x6d2c9820, 0x35e01: 0x6d2c9a20, 0x35e02: 0x6d2c9c20, 0x35e03: 0x6d2c9e20, + 0x35e04: 0x6d2ca020, 0x35e05: 0x6d2ca220, 0x35e06: 0x6d2ca420, 0x35e07: 0x6d2ca620, + 0x35e08: 0x6d2ca820, 0x35e09: 0x6d2caa20, 0x35e0a: 0x6d2cac20, 0x35e0b: 0x6d2cae20, + 0x35e0c: 0x6d2cb020, 0x35e0d: 0x6d2cb220, 0x35e0e: 0x6d2cb420, 0x35e0f: 0x6d2cb620, + 0x35e10: 0x6d2cb820, 0x35e11: 0x6d2cba20, 0x35e12: 0x6d2cbc20, 0x35e13: 0x6d2cbe20, + 0x35e14: 0x6d2cc020, 0x35e15: 0x6d2cc220, 0x35e16: 0x6d2cc420, 0x35e17: 0x6d2cc620, + 0x35e18: 0x6d2cc820, 0x35e19: 0x6d2cca20, 0x35e1a: 0x6d2ccc20, 0x35e1b: 0x6d2cce20, + 0x35e1c: 0x6d2cd020, 0x35e1d: 0x6d2cd220, 0x35e1e: 0x6d2cd420, 0x35e1f: 0x6d2cd620, + 0x35e20: 0x6d2cd820, 0x35e21: 0x6d2cda20, 0x35e22: 0x6d2cdc20, 0x35e23: 0x6d59b220, + 0x35e24: 0x6d59b420, 0x35e25: 0x6d59b620, 0x35e26: 0x6d59b820, 0x35e27: 0x6d59ba20, + 0x35e28: 0x6d59bc20, 0x35e29: 0x6d59be20, 0x35e2a: 0x6d59c020, 0x35e2b: 0x6d59c220, + 0x35e2c: 0x6d59c420, 0x35e2d: 0x6d59c620, 0x35e2e: 0x6d59c820, 0x35e2f: 0x6d59ca20, + 0x35e30: 0x6d59cc20, 0x35e31: 0x6d59ce20, 0x35e32: 0x6d59d020, 0x35e33: 0x6d59d220, + 0x35e34: 0x6d59d420, 0x35e35: 0x6d59d620, 0x35e36: 0x6d59d820, 0x35e37: 0x6d59da20, + 0x35e38: 0x6d59dc20, 0x35e39: 0x6d59de20, 0x35e3a: 0x6d59e020, 0x35e3b: 0x6d59e220, + 0x35e3c: 0x6d59e420, 0x35e3d: 0x6d59e620, 0x35e3e: 0x6d59e820, 0x35e3f: 0x6d59ea20, + // Block 0xd79, offset 0x35e40 + 0x35e40: 0x6d59ec20, 0x35e41: 0x6d59ee20, 0x35e42: 0x6d59f020, 0x35e43: 0x6d59f220, + 0x35e44: 0x6d59f420, 0x35e45: 0x6d59f620, 0x35e46: 0x6d59f820, 0x35e47: 0x6d59fa20, + 0x35e48: 0x6d59fc20, 0x35e49: 0x6d59fe20, 0x35e4a: 0x6d5a0020, 0x35e4b: 0x6d5a0220, + 0x35e4c: 0x6d849820, 0x35e4d: 0x6d849a20, 0x35e4e: 0x6d849c20, 0x35e4f: 0x6d849e20, + 0x35e50: 0x6d84a020, 0x35e51: 0x6d84a220, 0x35e52: 0x6d84a420, 0x35e53: 0x6d84a620, + 0x35e54: 0x6d84a820, 0x35e55: 0x6d84aa20, 0x35e56: 0x6d84ac20, 0x35e57: 0x6d84ae20, + 0x35e58: 0x6d84b020, 0x35e59: 0x6d84b220, 0x35e5a: 0x6d84b420, 0x35e5b: 0x6d84b620, + 0x35e5c: 0x6d84b820, 0x35e5d: 0x6d84ba20, 0x35e5e: 0x6d84bc20, 0x35e5f: 0x6d84be20, + 0x35e60: 0x6d84c020, 0x35e61: 0x6d84c220, 0x35e62: 0x6d84c420, 0x35e63: 0x6d84c620, + 0x35e64: 0x6d84c820, 0x35e65: 0x6d84ca20, 0x35e66: 0x6da97820, 0x35e67: 0x6da97a20, + 0x35e68: 0x6da97c20, 0x35e69: 0x6da97e20, 0x35e6a: 0x6da98020, 0x35e6b: 0x6da98220, + 0x35e6c: 0x6da98420, 0x35e6d: 0x6da98620, 0x35e6e: 0x6da98820, 0x35e6f: 0x6da98a20, + 0x35e70: 0x6da98c20, 0x35e71: 0x6da98e20, 0x35e72: 0x6da99020, 0x35e73: 0x6da99220, + 0x35e74: 0x6dca6020, 0x35e75: 0x6dca6220, 0x35e76: 0x6dca6420, 0x35e77: 0x6dca6620, + 0x35e78: 0x6dca6820, 0x35e79: 0x6dca6a20, 0x35e7a: 0x6dca6c20, 0x35e7b: 0x6dca6e20, + 0x35e7c: 0x6dca7020, 0x35e7d: 0x6dca7220, 0x35e7e: 0x6dca7420, 0x35e7f: 0x6dca7620, + // Block 0xd7a, offset 0x35e80 + 0x35e80: 0x6dca7820, 0x35e81: 0x6dca7a20, 0x35e82: 0x6dca7c20, 0x35e83: 0x6dca7e20, + 0x35e84: 0x6dca8020, 0x35e85: 0x6de60a20, 0x35e86: 0x6de60c20, 0x35e87: 0x6de60e20, + 0x35e88: 0x6de61020, 0x35e89: 0x6de61220, 0x35e8a: 0x6de61420, 0x35e8b: 0x6de61620, + 0x35e8c: 0x6de61820, 0x35e8d: 0x6dfcf420, 0x35e8e: 0x6dfcf620, 0x35e8f: 0x6dfcf820, + 0x35e90: 0x6dfcfa20, 0x35e91: 0x6e0fca20, 0x35e92: 0x6e0fcc20, 0x35e93: 0x6e0fce20, + 0x35e94: 0x6e0fd020, 0x35e95: 0x6e0fd220, 0x35e96: 0x6e0fd420, 0x35e97: 0x6e1eac20, + 0x35e98: 0x6e1eae20, 0x35e99: 0x6e1eb020, 0x35e9a: 0x6e1eb220, 0x35e9b: 0x6e2a1220, + 0x35e9c: 0x6e2a1420, 0x35e9d: 0x6e2a1620, 0x35e9e: 0x6e2a1820, 0x35e9f: 0x6e32d620, + 0x35ea0: 0x6e32d820, 0x35ea1: 0x6e32da20, 0x35ea2: 0x6e32dc20, 0x35ea3: 0x6e391620, + 0x35ea4: 0x6e407a20, 0x35ea5: 0x6c09f020, 0x35ea6: 0x6c572820, 0x35ea7: 0x6cd07420, + 0x35ea8: 0x6d2ce020, 0x35ea9: 0x6c04fc20, 0x35eaa: 0x6c13c620, 0x35eab: 0x6c13c820, + 0x35eac: 0x6c13ca20, 0x35ead: 0x6c248820, 0x35eae: 0x6c248a20, 0x35eaf: 0x6c248c20, + 0x35eb0: 0x6c248e20, 0x35eb1: 0x6c249020, 0x35eb2: 0x6c249220, 0x35eb3: 0x6c249420, + 0x35eb4: 0x6c249620, 0x35eb5: 0x6c249820, 0x35eb6: 0x6c249a20, 0x35eb7: 0x6c249c20, + 0x35eb8: 0x6c249e20, 0x35eb9: 0x6c3b7020, 0x35eba: 0x6c3b7220, 0x35ebb: 0x6c3b7420, + 0x35ebc: 0x6c3b7620, 0x35ebd: 0x6c3b7820, 0x35ebe: 0x6c3b7a20, 0x35ebf: 0x6c3b7c20, + // Block 0xd7b, offset 0x35ec0 + 0x35ec0: 0x6c3b7e20, 0x35ec1: 0x6c3b8020, 0x35ec2: 0x6c3b8220, 0x35ec3: 0x6c3b8420, + 0x35ec4: 0x6c3b8620, 0x35ec5: 0x6c3b8820, 0x35ec6: 0x6c3b8a20, 0x35ec7: 0x6c3b8c20, + 0x35ec8: 0x6c3b8e20, 0x35ec9: 0x6c3b9020, 0x35eca: 0x6c3b9220, 0x35ecb: 0x6c3b9420, + 0x35ecc: 0x6c3b9620, 0x35ecd: 0x6c3b9820, 0x35ece: 0x6c3b9a20, 0x35ecf: 0x6c577620, + 0x35ed0: 0x6c577820, 0x35ed1: 0x6c577a20, 0x35ed2: 0x6c577c20, 0x35ed3: 0x6c577e20, + 0x35ed4: 0x6c578020, 0x35ed5: 0x6c578220, 0x35ed6: 0x6c578420, 0x35ed7: 0x6c578620, + 0x35ed8: 0x6c578820, 0x35ed9: 0x6c578a20, 0x35eda: 0x6c578c20, 0x35edb: 0x6c578e20, + 0x35edc: 0x6c579020, 0x35edd: 0x6c579220, 0x35ede: 0x6c579420, 0x35edf: 0x6c579620, + 0x35ee0: 0x6c579820, 0x35ee1: 0x6c579a20, 0x35ee2: 0x6c579c20, 0x35ee3: 0x6c579e20, + 0x35ee4: 0x6c57a020, 0x35ee5: 0x6c57a220, 0x35ee6: 0x6c57a420, 0x35ee7: 0x6c57a620, + 0x35ee8: 0x6c57a820, 0x35ee9: 0x6c57aa20, 0x35eea: 0x6c57ac20, 0x35eeb: 0x6c57ae20, + 0x35eec: 0x6c57b020, 0x35eed: 0x6c57b220, 0x35eee: 0x6c57b420, 0x35eef: 0x6c57b620, + 0x35ef0: 0x6c57b820, 0x35ef1: 0x6c57ba20, 0x35ef2: 0x6c57bc20, 0x35ef3: 0x6c57be20, + 0x35ef4: 0x6c57c020, 0x35ef5: 0x6c7a1c20, 0x35ef6: 0x6c7a1e20, 0x35ef7: 0x6c7a2020, + 0x35ef8: 0x6c7a2220, 0x35ef9: 0x6c7a2420, 0x35efa: 0x6c7a2620, 0x35efb: 0x6c7a2820, + 0x35efc: 0x6c7a2a20, 0x35efd: 0x6c7a2c20, 0x35efe: 0x6c7a2e20, 0x35eff: 0x6c7a3020, + // Block 0xd7c, offset 0x35f00 + 0x35f00: 0x6c7a3220, 0x35f01: 0x6c7a3420, 0x35f02: 0x6c7a3620, 0x35f03: 0x6c7a3820, + 0x35f04: 0x6c7a3a20, 0x35f05: 0x6c7a3c20, 0x35f06: 0x6c7a3e20, 0x35f07: 0x6c7a4020, + 0x35f08: 0x6c7a4220, 0x35f09: 0x6c7a4420, 0x35f0a: 0x6c7a4620, 0x35f0b: 0x6c7a4820, + 0x35f0c: 0x6c7a4a20, 0x35f0d: 0x6c7a4c20, 0x35f0e: 0x6c7a4e20, 0x35f0f: 0x6c7a5020, + 0x35f10: 0x6c7a5220, 0x35f11: 0x6c7a5420, 0x35f12: 0x6c7a5620, 0x35f13: 0x6c7a5820, + 0x35f14: 0x6c7a5a20, 0x35f15: 0x6c7a5c20, 0x35f16: 0x6ca32620, 0x35f17: 0x6ca32820, + 0x35f18: 0x6ca32a20, 0x35f19: 0x6ca32c20, 0x35f1a: 0x6ca32e20, 0x35f1b: 0x6ca33020, + 0x35f1c: 0x6ca33220, 0x35f1d: 0x6ca33420, 0x35f1e: 0x6ca33620, 0x35f1f: 0x6ca33820, + 0x35f20: 0x6ca33a20, 0x35f21: 0x6ca33c20, 0x35f22: 0x6ca33e20, 0x35f23: 0x6ca34020, + 0x35f24: 0x6ca34220, 0x35f25: 0x6ca34420, 0x35f26: 0x6ca34620, 0x35f27: 0x6ca34820, + 0x35f28: 0x6ca34a20, 0x35f29: 0x6ca34c20, 0x35f2a: 0x6ca34e20, 0x35f2b: 0x6ca35020, + 0x35f2c: 0x6ca35220, 0x35f2d: 0x6ca35420, 0x35f2e: 0x6ca35620, 0x35f2f: 0x6ca35820, + 0x35f30: 0x6ca35a20, 0x35f31: 0x6ca35c20, 0x35f32: 0x6ca35e20, 0x35f33: 0x6ca36020, + 0x35f34: 0x6ca36220, 0x35f35: 0x6ca36420, 0x35f36: 0x6ca36620, 0x35f37: 0x6ca36820, + 0x35f38: 0x6ca36a20, 0x35f39: 0x6ca36c20, 0x35f3a: 0x6ca36e20, 0x35f3b: 0x6cd0dc20, + 0x35f3c: 0x6cd0de20, 0x35f3d: 0x6cd0e020, 0x35f3e: 0x6cd0e220, 0x35f3f: 0x6cd0e420, + // Block 0xd7d, offset 0x35f40 + 0x35f40: 0x6cd0e620, 0x35f41: 0x6cd0e820, 0x35f42: 0x6cd0ea20, 0x35f43: 0x6cd0ec20, + 0x35f44: 0x6cd0ee20, 0x35f45: 0x6cd0f020, 0x35f46: 0x6cd0f220, 0x35f47: 0x6cd0f420, + 0x35f48: 0x6cd0f620, 0x35f49: 0x6cd0f820, 0x35f4a: 0x6cd0fa20, 0x35f4b: 0x6cd0fc20, + 0x35f4c: 0x6cd0fe20, 0x35f4d: 0x6cd10020, 0x35f4e: 0x6cd10220, 0x35f4f: 0x6cd10420, + 0x35f50: 0x6cd10620, 0x35f51: 0x6cd10820, 0x35f52: 0x6cd10a20, 0x35f53: 0x6cd10c20, + 0x35f54: 0x6cd10e20, 0x35f55: 0x6cd11020, 0x35f56: 0x6cd11220, 0x35f57: 0x6cd11420, + 0x35f58: 0x6cd11620, 0x35f59: 0x6cd11820, 0x35f5a: 0x6cd11a20, 0x35f5b: 0x6cd11c20, + 0x35f5c: 0x6cd11e20, 0x35f5d: 0x6cd12020, 0x35f5e: 0x6cd12220, 0x35f5f: 0x6cd12420, + 0x35f60: 0x6cd12620, 0x35f61: 0x6cd12820, 0x35f62: 0x6cd12a20, 0x35f63: 0x6cd12c20, + 0x35f64: 0x6cd12e20, 0x35f65: 0x6cd13020, 0x35f66: 0x6cd13220, 0x35f67: 0x6cd13420, + 0x35f68: 0x6cd13620, 0x35f69: 0x6cd13820, 0x35f6a: 0x6cd13a20, 0x35f6b: 0x6cd13c20, + 0x35f6c: 0x6cd13e20, 0x35f6d: 0x6cd14020, 0x35f6e: 0x6cd14220, 0x35f6f: 0x6cfeaa20, + 0x35f70: 0x6cfeac20, 0x35f71: 0x6cfeae20, 0x35f72: 0x6cfeb020, 0x35f73: 0x6cfeb220, + 0x35f74: 0x6cfeb420, 0x35f75: 0x6cfeb620, 0x35f76: 0x6cfeb820, 0x35f77: 0x6cfeba20, + 0x35f78: 0x6cfebc20, 0x35f79: 0x6cfebe20, 0x35f7a: 0x6cfec020, 0x35f7b: 0x6cfec220, + 0x35f7c: 0x6cfec420, 0x35f7d: 0x6cfec620, 0x35f7e: 0x6cfec820, 0x35f7f: 0x6cfeca20, + // Block 0xd7e, offset 0x35f80 + 0x35f80: 0x6cfecc20, 0x35f81: 0x6cfece20, 0x35f82: 0x6cfed020, 0x35f83: 0x6cfed220, + 0x35f84: 0x6cfed420, 0x35f85: 0x6cfed620, 0x35f86: 0x6cfed820, 0x35f87: 0x6cfeda20, + 0x35f88: 0x6cfedc20, 0x35f89: 0x6cfede20, 0x35f8a: 0x6cfee020, 0x35f8b: 0x6cfee220, + 0x35f8c: 0x6cfee420, 0x35f8d: 0x6cfee620, 0x35f8e: 0x6cfee820, 0x35f8f: 0x6cfeea20, + 0x35f90: 0x6cfeec20, 0x35f91: 0x6cfeee20, 0x35f92: 0x6cfef020, 0x35f93: 0x6cfef220, + 0x35f94: 0x6cfef420, 0x35f95: 0x6cfef620, 0x35f96: 0x6cfef820, 0x35f97: 0x6cfefa20, + 0x35f98: 0x6cfefc20, 0x35f99: 0x6cfefe20, 0x35f9a: 0x6cff0020, 0x35f9b: 0x6cff0220, + 0x35f9c: 0x6cff0420, 0x35f9d: 0x6cff0620, 0x35f9e: 0x6cff0820, 0x35f9f: 0x6cff0a20, + 0x35fa0: 0x6cff0c20, 0x35fa1: 0x6cff0e20, 0x35fa2: 0x6cff1020, 0x35fa3: 0x6cff1220, + 0x35fa4: 0x6cff1420, 0x35fa5: 0x6cff1620, 0x35fa6: 0x6cff1820, 0x35fa7: 0x6cff1a20, + 0x35fa8: 0x6cff1c20, 0x35fa9: 0x6cff1e20, 0x35faa: 0x6d2d1620, 0x35fab: 0x6d2d1820, + 0x35fac: 0x6d2d1a20, 0x35fad: 0x6d2d1c20, 0x35fae: 0x6d2d1e20, 0x35faf: 0x6d2d2020, + 0x35fb0: 0x6d2d2220, 0x35fb1: 0x6d2d2420, 0x35fb2: 0x6d2d2620, 0x35fb3: 0x6d2d2820, + 0x35fb4: 0x6d2d2a20, 0x35fb5: 0x6d2d2c20, 0x35fb6: 0x6d2d2e20, 0x35fb7: 0x6d2d3020, + 0x35fb8: 0x6d2d3220, 0x35fb9: 0x6d2d3420, 0x35fba: 0x6d2d3620, 0x35fbb: 0x6d2d3820, + 0x35fbc: 0x6d2d3a20, 0x35fbd: 0x6d2d3c20, 0x35fbe: 0x6d2d3e20, 0x35fbf: 0x6d2d4020, + // Block 0xd7f, offset 0x35fc0 + 0x35fc0: 0x6d2d4220, 0x35fc1: 0x6d2d4420, 0x35fc2: 0x6d2d4620, 0x35fc3: 0x6d2d4820, + 0x35fc4: 0x6d2d4a20, 0x35fc5: 0x6d2d4c20, 0x35fc6: 0x6d2d4e20, 0x35fc7: 0x6d2d5020, + 0x35fc8: 0x6d2d5220, 0x35fc9: 0x6d2d5420, 0x35fca: 0x6d2d5620, 0x35fcb: 0x6d2d5820, + 0x35fcc: 0x6d2d5a20, 0x35fcd: 0x6d2d5c20, 0x35fce: 0x6d2d5e20, 0x35fcf: 0x6d2d6020, + 0x35fd0: 0x6d2d6220, 0x35fd1: 0x6d2d6420, 0x35fd2: 0x6d2d6620, 0x35fd3: 0x6d2d6820, + 0x35fd4: 0x6d5a4820, 0x35fd5: 0x6d5a4a20, 0x35fd6: 0x6d5a4c20, 0x35fd7: 0x6d5a4e20, + 0x35fd8: 0x6d5a5020, 0x35fd9: 0x6d5a5220, 0x35fda: 0x6d5a5420, 0x35fdb: 0x6d5a5620, + 0x35fdc: 0x6d5a5820, 0x35fdd: 0x6d5a5a20, 0x35fde: 0x6d5a5c20, 0x35fdf: 0x6d5a5e20, + 0x35fe0: 0x6d5a6020, 0x35fe1: 0x6d5a6220, 0x35fe2: 0x6d5a6420, 0x35fe3: 0x6d5a6620, + 0x35fe4: 0x6d5a6820, 0x35fe5: 0x6d5a6a20, 0x35fe6: 0x6d5a6c20, 0x35fe7: 0x6d5a6e20, + 0x35fe8: 0x6d5a7020, 0x35fe9: 0x6d5a7220, 0x35fea: 0x6d5a7420, 0x35feb: 0x6d5a7620, + 0x35fec: 0x6d5a7820, 0x35fed: 0x6d5a7a20, 0x35fee: 0x6d5a7c20, 0x35fef: 0x6d5a7e20, + 0x35ff0: 0x6d5a8020, 0x35ff1: 0x6d5a8220, 0x35ff2: 0x6d5a8420, 0x35ff3: 0x6d5a8620, + 0x35ff4: 0x6d5a8820, 0x35ff5: 0x6d5a8a20, 0x35ff6: 0x6d5a8c20, 0x35ff7: 0x6d5a8e20, + 0x35ff8: 0x6d5a9020, 0x35ff9: 0x6d5a9220, 0x35ffa: 0x6d5a9420, 0x35ffb: 0x6d5a9620, + 0x35ffc: 0x6d5a9820, 0x35ffd: 0x6d5a9a20, 0x35ffe: 0x6d5a9c20, 0x35fff: 0x6d5a9e20, + // Block 0xd80, offset 0x36000 + 0x36000: 0x6d850020, 0x36001: 0x6d5aa020, 0x36002: 0x6d850220, 0x36003: 0x6d850420, + 0x36004: 0x6d850620, 0x36005: 0x6d850820, 0x36006: 0x6d850a20, 0x36007: 0x6d850c20, + 0x36008: 0x6d850e20, 0x36009: 0x6d851020, 0x3600a: 0x6d851220, 0x3600b: 0x6d851420, + 0x3600c: 0x6d851620, 0x3600d: 0x6d851820, 0x3600e: 0x6d851a20, 0x3600f: 0x6d851c20, + 0x36010: 0x6d851e20, 0x36011: 0x6d852020, 0x36012: 0x6d852220, 0x36013: 0x6d852420, + 0x36014: 0x6d852620, 0x36015: 0x6d852820, 0x36016: 0x6d852a20, 0x36017: 0x6d852c20, + 0x36018: 0x6d852e20, 0x36019: 0x6d853020, 0x3601a: 0x6d853220, 0x3601b: 0x6d853420, + 0x3601c: 0x6d853620, 0x3601d: 0x6d853820, 0x3601e: 0x6d853a20, 0x3601f: 0x6d853c20, + 0x36020: 0x6d853e20, 0x36021: 0x6d854020, 0x36022: 0x6d854220, 0x36023: 0x6d854420, + 0x36024: 0x6d854620, 0x36025: 0x6d854820, 0x36026: 0x6d854a20, 0x36027: 0x6d854c20, + 0x36028: 0x6d854e20, 0x36029: 0x6d855020, 0x3602a: 0x6d855220, 0x3602b: 0x6da9c420, + 0x3602c: 0x6da9c620, 0x3602d: 0x6da9c820, 0x3602e: 0x6da9ca20, 0x3602f: 0x6da9cc20, + 0x36030: 0x6da9ce20, 0x36031: 0x6da9d020, 0x36032: 0x6da9d220, 0x36033: 0x6da9d420, + 0x36034: 0x6da9d620, 0x36035: 0x6da9d820, 0x36036: 0x6da9da20, 0x36037: 0x6da9dc20, + 0x36038: 0x6da9de20, 0x36039: 0x6da9e020, 0x3603a: 0x6da9e220, 0x3603b: 0x6da9e420, + 0x3603c: 0x6da9e620, 0x3603d: 0x6da9e820, 0x3603e: 0x6da9ea20, 0x3603f: 0x6da9ec20, + // Block 0xd81, offset 0x36040 + 0x36040: 0x6da9ee20, 0x36041: 0x6da9f020, 0x36042: 0x6da9f220, 0x36043: 0x6da9f420, + 0x36044: 0x6da9f620, 0x36045: 0x6da9f820, 0x36046: 0x6da9fa20, 0x36047: 0x6da9fc20, + 0x36048: 0x6da9fe20, 0x36049: 0x6daa0020, 0x3604a: 0x6daa0220, 0x3604b: 0x6dcaa020, + 0x3604c: 0x6dcaa220, 0x3604d: 0x6dcaa420, 0x3604e: 0x6dcaa620, 0x3604f: 0x6dcaa820, + 0x36050: 0x6dcaaa20, 0x36051: 0x6dcaac20, 0x36052: 0x6dcaae20, 0x36053: 0x6dcab020, + 0x36054: 0x6dcab220, 0x36055: 0x6dcab420, 0x36056: 0x6dcab620, 0x36057: 0x6dcab820, + 0x36058: 0x6dcaba20, 0x36059: 0x6dcabc20, 0x3605a: 0x6dcabe20, 0x3605b: 0x6dcac020, + 0x3605c: 0x6dcac220, 0x3605d: 0x6dcac420, 0x3605e: 0x6dcac620, 0x3605f: 0x6dcac820, + 0x36060: 0x6dcaca20, 0x36061: 0x6dcacc20, 0x36062: 0x6dcace20, 0x36063: 0x6dcad020, + 0x36064: 0x6dcad220, 0x36065: 0x6dcad420, 0x36066: 0x6dcad620, 0x36067: 0x6dcad820, + 0x36068: 0x6dcada20, 0x36069: 0x6de63a20, 0x3606a: 0x6de63c20, 0x3606b: 0x6de63e20, + 0x3606c: 0x6de64020, 0x3606d: 0x6de64220, 0x3606e: 0x6de64420, 0x3606f: 0x6de64620, + 0x36070: 0x6de64820, 0x36071: 0x6de64a20, 0x36072: 0x6de64c20, 0x36073: 0x6de64e20, + 0x36074: 0x6dcadc20, 0x36075: 0x6de65020, 0x36076: 0x6de65220, 0x36077: 0x6de65420, + 0x36078: 0x6de65620, 0x36079: 0x6de65820, 0x3607a: 0x6de65a20, 0x3607b: 0x6de65c20, + 0x3607c: 0x6de65e20, 0x3607d: 0x6de66020, 0x3607e: 0x6dfd0e20, 0x3607f: 0x6dfd1020, + // Block 0xd82, offset 0x36080 + 0x36080: 0x6dfd1220, 0x36081: 0x6dfd1420, 0x36082: 0x6dfd1620, 0x36083: 0x6dfd1820, + 0x36084: 0x6dfd1a20, 0x36085: 0x6dfd1c20, 0x36086: 0x6dfd1e20, 0x36087: 0x6dfd2020, + 0x36088: 0x6dfd2220, 0x36089: 0x6e0fdc20, 0x3608a: 0x6e0fde20, 0x3608b: 0x6e0fe020, + 0x3608c: 0x6e0fe220, 0x3608d: 0x6e0fe420, 0x3608e: 0x6e0fe620, 0x3608f: 0x6e0fe820, + 0x36090: 0x6e0fea20, 0x36091: 0x6e0fec20, 0x36092: 0x6e0fee20, 0x36093: 0x6e0ff020, + 0x36094: 0x6e1ebc20, 0x36095: 0x6e1ebe20, 0x36096: 0x6e1ec020, 0x36097: 0x6e1ec220, + 0x36098: 0x6e1ec420, 0x36099: 0x6e2a1e20, 0x3609a: 0x6e2a2020, 0x3609b: 0x6e2a2220, + 0x3609c: 0x6e2a2420, 0x3609d: 0x6e2a2620, 0x3609e: 0x6e2a2820, 0x3609f: 0x6e2a2a20, + 0x360a0: 0x6e32e020, 0x360a1: 0x6e33a820, 0x360a2: 0x6e3d6c20, 0x360a3: 0x6e391820, + 0x360a4: 0x6e391a20, 0x360a5: 0x6e391c20, 0x360a6: 0x6e391e20, 0x360a7: 0x6e392020, + 0x360a8: 0x6e3d6e20, 0x360a9: 0x6e42c220, 0x360aa: 0x6c3bae20, 0x360ab: 0x6c57ca20, + 0x360ac: 0x6c57cc20, 0x360ad: 0x6c57ce20, 0x360ae: 0x6c57d020, 0x360af: 0x6c57d220, + 0x360b0: 0x6c7a7c20, 0x360b1: 0x6c7a7e20, 0x360b2: 0x6c7a8020, 0x360b3: 0x6c7a8220, + 0x360b4: 0x6c7a8420, 0x360b5: 0x6ca38220, 0x360b6: 0x6ca38420, 0x360b7: 0x6ca38620, + 0x360b8: 0x6ca38820, 0x360b9: 0x6ca38a20, 0x360ba: 0x6cd16220, 0x360bb: 0x6cd16420, + 0x360bc: 0x6cd16620, 0x360bd: 0x6cd16820, 0x360be: 0x6cd16a20, 0x360bf: 0x6cd16c20, + // Block 0xd83, offset 0x360c0 + 0x360c0: 0x6cd16e20, 0x360c1: 0x6cff4420, 0x360c2: 0x6cff4620, 0x360c3: 0x6cff4820, + 0x360c4: 0x6cff4a20, 0x360c5: 0x6cff4c20, 0x360c6: 0x6cff4e20, 0x360c7: 0x6d5ab620, + 0x360c8: 0x6d2d8c20, 0x360c9: 0x6d2d8e20, 0x360ca: 0x6d2d9020, 0x360cb: 0x6d2d9220, + 0x360cc: 0x6d2d9420, 0x360cd: 0x6d5ab820, 0x360ce: 0x6d856c20, 0x360cf: 0x6d856e20, + 0x360d0: 0x6d5aba20, 0x360d1: 0x6d5abc20, 0x360d2: 0x6d5abe20, 0x360d3: 0x6d5ac020, + 0x360d4: 0x6d5ac220, 0x360d5: 0x6d5ac420, 0x360d6: 0x6d857020, 0x360d7: 0x6daa1020, + 0x360d8: 0x6dcae420, 0x360d9: 0x6dcae620, 0x360da: 0x6dcae820, 0x360db: 0x6e0ff420, + 0x360dc: 0x6e0ff620, 0x360dd: 0x6e0ff820, 0x360de: 0x6e1ec820, 0x360df: 0x6e1eca20, + 0x360e0: 0x6e2a2e20, 0x360e1: 0x6e2a3020, 0x360e2: 0x6e32e620, 0x360e3: 0x6e3d7220, + 0x360e4: 0x6e3d7420, 0x360e5: 0x6e452620, 0x360e6: 0x6c24a420, 0x360e7: 0x6c24a620, + 0x360e8: 0x6c3bba20, 0x360e9: 0x6c3bbc20, 0x360ea: 0x6c3bbe20, 0x360eb: 0x6c3bc020, + 0x360ec: 0x6c57ec20, 0x360ed: 0x6c57ee20, 0x360ee: 0x6c57f020, 0x360ef: 0x6c57f220, + 0x360f0: 0x6c57f420, 0x360f1: 0x6c57f620, 0x360f2: 0x6c57f820, 0x360f3: 0x6c7a9620, + 0x360f4: 0x6c7a9820, 0x360f5: 0x6c7a9a20, 0x360f6: 0x6c7a9c20, 0x360f7: 0x6c7a9e20, + 0x360f8: 0x6c7aa020, 0x360f9: 0x6c7aa220, 0x360fa: 0x6c7aa420, 0x360fb: 0x6c7aa620, + 0x360fc: 0x6c7aa820, 0x360fd: 0x6c7aaa20, 0x360fe: 0x6ca39e20, 0x360ff: 0x6ca3a020, + // Block 0xd84, offset 0x36100 + 0x36100: 0x6ca3a220, 0x36101: 0x6ca3a420, 0x36102: 0x6ca3a620, 0x36103: 0x6ca3a820, + 0x36104: 0x6ca3aa20, 0x36105: 0x6ca3ac20, 0x36106: 0x6ca3ae20, 0x36107: 0x6ca3b020, + 0x36108: 0x6ca3b220, 0x36109: 0x6ca3b420, 0x3610a: 0x6ca3b620, 0x3610b: 0x6ca3b820, + 0x3610c: 0x6cd18020, 0x3610d: 0x6cd18220, 0x3610e: 0x6cd18420, 0x3610f: 0x6cd18620, + 0x36110: 0x6cd18820, 0x36111: 0x6cd18a20, 0x36112: 0x6cd18c20, 0x36113: 0x6cd18e20, + 0x36114: 0x6cd19020, 0x36115: 0x6cd19220, 0x36116: 0x6cd19420, 0x36117: 0x6cd19620, + 0x36118: 0x6cd19820, 0x36119: 0x6cd19a20, 0x3611a: 0x6cd19c20, 0x3611b: 0x6cff6820, + 0x3611c: 0x6cff6a20, 0x3611d: 0x6cff6c20, 0x3611e: 0x6cff6e20, 0x3611f: 0x6cff7020, + 0x36120: 0x6cff7220, 0x36121: 0x6cff7420, 0x36122: 0x6cff7620, 0x36123: 0x6cff7820, + 0x36124: 0x6cff7a20, 0x36125: 0x6cff7c20, 0x36126: 0x6cff7e20, 0x36127: 0x6d2dae20, + 0x36128: 0x6d2db020, 0x36129: 0x6d2db220, 0x3612a: 0x6d2db420, 0x3612b: 0x6d2db620, + 0x3612c: 0x6d2db820, 0x3612d: 0x6d2dba20, 0x3612e: 0x6d2dbc20, 0x3612f: 0x6d2dbe20, + 0x36130: 0x6d2dc020, 0x36131: 0x6d2dc220, 0x36132: 0x6cff8020, 0x36133: 0x6d2dc420, + 0x36134: 0x6d2dc620, 0x36135: 0x6d2dc820, 0x36136: 0x6d2dca20, 0x36137: 0x6d2dcc20, + 0x36138: 0x6d2dce20, 0x36139: 0x6d5ad420, 0x3613a: 0x6d5ad620, 0x3613b: 0x6d5ad820, + 0x3613c: 0x6d5ada20, 0x3613d: 0x6d5adc20, 0x3613e: 0x6d5ade20, 0x3613f: 0x6d5ae020, + // Block 0xd85, offset 0x36140 + 0x36140: 0x6d5ae220, 0x36141: 0x6d5ae420, 0x36142: 0x6d5ae620, 0x36143: 0x6d5ae820, + 0x36144: 0x6d5aea20, 0x36145: 0x6d858420, 0x36146: 0x6d858620, 0x36147: 0x6d858820, + 0x36148: 0x6d858a20, 0x36149: 0x6d858c20, 0x3614a: 0x6d858e20, 0x3614b: 0x6d859020, + 0x3614c: 0x6d859220, 0x3614d: 0x6d859420, 0x3614e: 0x6daa2820, 0x3614f: 0x6daa2a20, + 0x36150: 0x6daa2c20, 0x36151: 0x6daa2e20, 0x36152: 0x6daa3020, 0x36153: 0x6daa3220, + 0x36154: 0x6daa3420, 0x36155: 0x6daa3620, 0x36156: 0x6cff8220, 0x36157: 0x6daa3820, + 0x36158: 0x6dcaf420, 0x36159: 0x6dcaf620, 0x3615a: 0x6dcaf820, 0x3615b: 0x6dcafa20, + 0x3615c: 0x6dcafc20, 0x3615d: 0x6dcafe20, 0x3615e: 0x6dcb0020, 0x3615f: 0x6dcb0220, + 0x36160: 0x6de67020, 0x36161: 0x6de67220, 0x36162: 0x6dfd2c20, 0x36163: 0x6dfd2e20, + 0x36164: 0x6dfd3020, 0x36165: 0x6dfd3220, 0x36166: 0x6e0ffc20, 0x36167: 0x6e0ffe20, + 0x36168: 0x6e100020, 0x36169: 0x6e100220, 0x3616a: 0x6e100420, 0x3616b: 0x6e100620, + 0x3616c: 0x6e100820, 0x3616d: 0x6e1ece20, 0x3616e: 0x6e1ed020, 0x3616f: 0x6e1ed220, + 0x36170: 0x6e2a3220, 0x36171: 0x6e2a3420, 0x36172: 0x6e2a3620, 0x36173: 0x6e2a3820, + 0x36174: 0x6e2a3a20, 0x36175: 0x6e2a3c20, 0x36176: 0x6e32ea20, 0x36177: 0x6e392420, + 0x36178: 0x6e407c20, 0x36179: 0x6e443820, 0x3617a: 0x6c0a0020, 0x3617b: 0x6c3bc620, + 0x3617c: 0x6c3bc820, 0x3617d: 0x6c3bca20, 0x3617e: 0x6c3bcc20, 0x3617f: 0x6c3bce20, + // Block 0xd86, offset 0x36180 + 0x36180: 0x6c3bd020, 0x36181: 0x6c580020, 0x36182: 0x6c580220, 0x36183: 0x6c580420, + 0x36184: 0x6c580620, 0x36185: 0x6c7ab020, 0x36186: 0x6cd19e20, 0x36187: 0x6cff8e20, + 0x36188: 0x6d2dd420, 0x36189: 0x6d5af220, 0x3618a: 0x6d5af420, 0x3618b: 0x6d859620, + 0x3618c: 0x6d859820, 0x3618d: 0x6daa3c20, 0x3618e: 0x6dcb0420, 0x3618f: 0x6dc4c420, + 0x36190: 0x6e100a20, 0x36191: 0x6e1ed620, 0x36192: 0x6e42c420, 0x36193: 0x6c0a0420, + 0x36194: 0x6c13ce20, 0x36195: 0x6c3bd220, 0x36196: 0x6c3bd420, 0x36197: 0x6c3bd620, + 0x36198: 0x6c580c20, 0x36199: 0x6c580e20, 0x3619a: 0x6c581020, 0x3619b: 0x6c581220, + 0x3619c: 0x6c581420, 0x3619d: 0x6c581620, 0x3619e: 0x6c581820, 0x3619f: 0x6c7ab420, + 0x361a0: 0x6ca3c220, 0x361a1: 0x6ca3c420, 0x361a2: 0x6ca3c620, 0x361a3: 0x6ca3c820, + 0x361a4: 0x6ca3ca20, 0x361a5: 0x6ca3cc20, 0x361a6: 0x6cd1aa20, 0x361a7: 0x6cd1ac20, + 0x361a8: 0x6cd1ae20, 0x361a9: 0x6cd1b020, 0x361aa: 0x6cd1b220, 0x361ab: 0x6cd1b420, + 0x361ac: 0x6cff9020, 0x361ad: 0x6cff9220, 0x361ae: 0x6cff9420, 0x361af: 0x6cff9620, + 0x361b0: 0x6cff9820, 0x361b1: 0x6cff9a20, 0x361b2: 0x6d2dd820, 0x361b3: 0x6d2dda20, + 0x361b4: 0x6d2ddc20, 0x361b5: 0x6d5af820, 0x361b6: 0x6d859c20, 0x361b7: 0x6daa3e20, + 0x361b8: 0x6daa4020, 0x361b9: 0x6daa4220, 0x361ba: 0x6dcb0620, 0x361bb: 0x6de67420, + 0x361bc: 0x6de67620, 0x361bd: 0x6de26620, 0x361be: 0x6de67820, 0x361bf: 0x6de67a20, + // Block 0xd87, offset 0x361c0 + 0x361c0: 0x6e100c20, 0x361c1: 0x6e1ed820, 0x361c2: 0x6e1eda20, 0x361c3: 0x6c13d220, + 0x361c4: 0x6c24ae20, 0x361c5: 0x6c3bde20, 0x361c6: 0x6c3be020, 0x361c7: 0x6c7ab820, + 0x361c8: 0x6ca3d020, 0x361c9: 0x6cd1b820, 0x361ca: 0x6d2dde20, 0x361cb: 0x6d5afa20, + 0x361cc: 0x6d5afc20, 0x361cd: 0x6dcb0820, 0x361ce: 0x6de67c20, 0x361cf: 0x6e1edc20, + 0x361d0: 0x6e392620, 0x361d1: 0x6e2a3e20, 0x361d2: 0x6c0a1620, 0x361d3: 0x6c13d820, + 0x361d4: 0x6c13da20, 0x361d5: 0x6c24c220, 0x361d6: 0x6c24c420, 0x361d7: 0x6c24c620, + 0x361d8: 0x6c24c820, 0x361d9: 0x6c24ca20, 0x361da: 0x6c24cc20, 0x361db: 0x6c24ce20, + 0x361dc: 0x6c24d020, 0x361dd: 0x6c3bfa20, 0x361de: 0x6c3bfc20, 0x361df: 0x6c3bfe20, + 0x361e0: 0x6c3c0020, 0x361e1: 0x6c3c0220, 0x361e2: 0x6c3c0420, 0x361e3: 0x6c3c0620, + 0x361e4: 0x6c3c0820, 0x361e5: 0x6c3c0a20, 0x361e6: 0x6c3c0c20, 0x361e7: 0x6c3c0e20, + 0x361e8: 0x6c3c1020, 0x361e9: 0x6c584020, 0x361ea: 0x6c584220, 0x361eb: 0x6c584420, + 0x361ec: 0x6c584620, 0x361ed: 0x6c584820, 0x361ee: 0x6c584a20, 0x361ef: 0x6c584c20, + 0x361f0: 0x6c584e20, 0x361f1: 0x6c585020, 0x361f2: 0x6c585220, 0x361f3: 0x6c585420, + 0x361f4: 0x6c585620, 0x361f5: 0x6c585820, 0x361f6: 0x6c585a20, 0x361f7: 0x6c585c20, + 0x361f8: 0x6c585e20, 0x361f9: 0x6c586020, 0x361fa: 0x6c586220, 0x361fb: 0x6c586420, + 0x361fc: 0x6c586620, 0x361fd: 0x6c586820, 0x361fe: 0x6c586a20, 0x361ff: 0x6c586c20, + // Block 0xd88, offset 0x36200 + 0x36200: 0x6c586e20, 0x36201: 0x6c587020, 0x36202: 0x6c587220, 0x36203: 0x6c587420, + 0x36204: 0x6c587620, 0x36205: 0x6c587820, 0x36206: 0x6c587a20, 0x36207: 0x6c587c20, + 0x36208: 0x6c587e20, 0x36209: 0x6c588020, 0x3620a: 0x6c588220, 0x3620b: 0x6c588420, + 0x3620c: 0x6c7ad620, 0x3620d: 0x6c7ad820, 0x3620e: 0x6c7ada20, 0x3620f: 0x6c7adc20, + 0x36210: 0x6c7ade20, 0x36211: 0x6c7ae020, 0x36212: 0x6c7ae220, 0x36213: 0x6c7ae420, + 0x36214: 0x6c7ae620, 0x36215: 0x6c7ae820, 0x36216: 0x6c7aea20, 0x36217: 0x6c7aec20, + 0x36218: 0x6c7aee20, 0x36219: 0x6c7af020, 0x3621a: 0x6c7af220, 0x3621b: 0x6c7af420, + 0x3621c: 0x6c7af620, 0x3621d: 0x6c7af820, 0x3621e: 0x6c7afa20, 0x3621f: 0x6c7afc20, + 0x36220: 0x6c7afe20, 0x36221: 0x6c63fc20, 0x36222: 0x6c7b0020, 0x36223: 0x6c7b0220, + 0x36224: 0x6c7b0420, 0x36225: 0x6ca3e820, 0x36226: 0x6ca3ea20, 0x36227: 0x6ca3ec20, + 0x36228: 0x6ca3ee20, 0x36229: 0x6ca3f020, 0x3622a: 0x6ca3f220, 0x3622b: 0x6ca3f420, + 0x3622c: 0x6ca3f620, 0x3622d: 0x6ca3f820, 0x3622e: 0x6ca3fa20, 0x3622f: 0x6ca3fc20, + 0x36230: 0x6ca3fe20, 0x36231: 0x6ca40020, 0x36232: 0x6ca40220, 0x36233: 0x6ca40420, + 0x36234: 0x6ca40620, 0x36235: 0x6ca40820, 0x36236: 0x6ca40a20, 0x36237: 0x6ca40c20, + 0x36238: 0x6ca40e20, 0x36239: 0x6ca41020, 0x3623a: 0x6ca41220, 0x3623b: 0x6cd1d020, + 0x3623c: 0x6cd1d220, 0x3623d: 0x6cd1d420, 0x3623e: 0x6cd1d620, 0x3623f: 0x6cd1d820, + // Block 0xd89, offset 0x36240 + 0x36240: 0x6cd1da20, 0x36241: 0x6cd1dc20, 0x36242: 0x6cd1de20, 0x36243: 0x6cd1e020, + 0x36244: 0x6cd1e220, 0x36245: 0x6cd1e420, 0x36246: 0x6cd1e620, 0x36247: 0x6cd1e820, + 0x36248: 0x6cd1ea20, 0x36249: 0x6cd1ec20, 0x3624a: 0x6cd1ee20, 0x3624b: 0x6cd1f020, + 0x3624c: 0x6cd1f220, 0x3624d: 0x6cd1f420, 0x3624e: 0x6cd1f620, 0x3624f: 0x6cd1f820, + 0x36250: 0x6cd1fa20, 0x36251: 0x6cffb620, 0x36252: 0x6cffb820, 0x36253: 0x6cffba20, + 0x36254: 0x6cffbc20, 0x36255: 0x6cffbe20, 0x36256: 0x6cffc020, 0x36257: 0x6cffc220, + 0x36258: 0x6cffc420, 0x36259: 0x6cffc620, 0x3625a: 0x6cffc820, 0x3625b: 0x6cffca20, + 0x3625c: 0x6cffcc20, 0x3625d: 0x6cffce20, 0x3625e: 0x6cffd020, 0x3625f: 0x6cffd220, + 0x36260: 0x6cffd420, 0x36261: 0x6cffd620, 0x36262: 0x6cffd820, 0x36263: 0x6cffda20, + 0x36264: 0x6cffdc20, 0x36265: 0x6cffde20, 0x36266: 0x6cffe020, 0x36267: 0x6cffe220, + 0x36268: 0x6cffe420, 0x36269: 0x6cffe620, 0x3626a: 0x6cffe820, 0x3626b: 0x6d2de820, + 0x3626c: 0x6d2dea20, 0x3626d: 0x6d2dec20, 0x3626e: 0x6d2dee20, 0x3626f: 0x6d2df020, + 0x36270: 0x6d2df220, 0x36271: 0x6d2df420, 0x36272: 0x6d2df620, 0x36273: 0x6d2df820, + 0x36274: 0x6d2dfa20, 0x36275: 0x6d2dfc20, 0x36276: 0x6d2dfe20, 0x36277: 0x6d5b0820, + 0x36278: 0x6d5b0a20, 0x36279: 0x6d5b0c20, 0x3627a: 0x6d5b0e20, 0x3627b: 0x6d5b1020, + 0x3627c: 0x6d5b1220, 0x3627d: 0x6d5b1420, 0x3627e: 0x6d5b1620, 0x3627f: 0x6d5b1820, + // Block 0xd8a, offset 0x36280 + 0x36280: 0x6d5b1a20, 0x36281: 0x6d5b1c20, 0x36282: 0x6d5b1e20, 0x36283: 0x6d5b2020, + 0x36284: 0x6d5b2220, 0x36285: 0x6d5b2420, 0x36286: 0x6d5b2620, 0x36287: 0x6d5b2820, + 0x36288: 0x6d85a620, 0x36289: 0x6d85a820, 0x3628a: 0x6d85aa20, 0x3628b: 0x6d85ac20, + 0x3628c: 0x6d85ae20, 0x3628d: 0x6d85b020, 0x3628e: 0x6d85b220, 0x3628f: 0x6d75d020, + 0x36290: 0x6d85b420, 0x36291: 0x6d85b620, 0x36292: 0x6daa4a20, 0x36293: 0x6daa4c20, + 0x36294: 0x6daa4e20, 0x36295: 0x6daa5020, 0x36296: 0x6daa5220, 0x36297: 0x6daa5420, + 0x36298: 0x6daa5620, 0x36299: 0x6daa5820, 0x3629a: 0x6daa5a20, 0x3629b: 0x6db99020, + 0x3629c: 0x6daa5c20, 0x3629d: 0x6daa5e20, 0x3629e: 0x6daa6020, 0x3629f: 0x6daa6220, + 0x362a0: 0x6daa6420, 0x362a1: 0x6daa6620, 0x362a2: 0x6daa6820, 0x362a3: 0x6daa6a20, + 0x362a4: 0x6dcb1020, 0x362a5: 0x6dcb1220, 0x362a6: 0x6dcb1420, 0x362a7: 0x6dcb1620, + 0x362a8: 0x6dcb1820, 0x362a9: 0x6de68420, 0x362aa: 0x6de68620, 0x362ab: 0x6de68820, + 0x362ac: 0x6de68a20, 0x362ad: 0x6de68c20, 0x362ae: 0x6de68e20, 0x362af: 0x6de69020, + 0x362b0: 0x6de69220, 0x362b1: 0x6dfd3820, 0x362b2: 0x6de69420, 0x362b3: 0x6dfd3a20, + 0x362b4: 0x6dfd3c20, 0x362b5: 0x6dfd3e20, 0x362b6: 0x6dfd4020, 0x362b7: 0x6dfd4220, + 0x362b8: 0x6dfd4420, 0x362b9: 0x6e100e20, 0x362ba: 0x6e101020, 0x362bb: 0x6e101220, + 0x362bc: 0x6e101420, 0x362bd: 0x6e101620, 0x362be: 0x6e101820, 0x362bf: 0x6e1ee020, + // Block 0xd8b, offset 0x362c0 + 0x362c0: 0x6e1ee220, 0x362c1: 0x6e1ee420, 0x362c2: 0x6e2a4220, 0x362c3: 0x6e2a4420, + 0x362c4: 0x6e2a4620, 0x362c5: 0x6e32ec20, 0x362c6: 0x6e392820, 0x362c7: 0x6e3d7620, + 0x362c8: 0x6e3d7820, 0x362c9: 0x6e3d7a20, 0x362ca: 0x6e3d7c20, 0x362cb: 0x6e3d7e20, + 0x362cc: 0x6e407e20, 0x362cd: 0x6e408020, 0x362ce: 0x6e42c620, 0x362cf: 0x6e452820, + 0x362d0: 0x6e463220, 0x362d1: 0x6e468620, 0x362d2: 0x6e46e820, 0x362d3: 0x6c0a1c20, + 0x362d4: 0x6c0a1e20, 0x362d5: 0x6c13dc20, 0x362d6: 0x6c3c1620, 0x362d7: 0x6c7b1020, + 0x362d8: 0x6c588e20, 0x362d9: 0x6cd20c20, 0x362da: 0x6cd20e20, 0x362db: 0x6cd21020, + 0x362dc: 0x6cfff220, 0x362dd: 0x6cfff420, 0x362de: 0x6d5b2e20, 0x362df: 0x6d85be20, + 0x362e0: 0x6d85c020, 0x362e1: 0x6d85c220, 0x362e2: 0x6d85c420, 0x362e3: 0x6dcb1e20, + 0x362e4: 0x6e1ee620, 0x362e5: 0x6c13de20, 0x362e6: 0x6c24e220, 0x362e7: 0x6c24e420, + 0x362e8: 0x6c24e620, 0x362e9: 0x6c24e820, 0x362ea: 0x6c24ea20, 0x362eb: 0x6c24ec20, + 0x362ec: 0x6c24ee20, 0x362ed: 0x6c24f020, 0x362ee: 0x6c24f220, 0x362ef: 0x6c3c3220, + 0x362f0: 0x6c3c3420, 0x362f1: 0x6c3c3620, 0x362f2: 0x6c3c3820, 0x362f3: 0x6c3c3a20, + 0x362f4: 0x6c3c3c20, 0x362f5: 0x6c3c3e20, 0x362f6: 0x6c3c4020, 0x362f7: 0x6c58ba20, + 0x362f8: 0x6c58bc20, 0x362f9: 0x6c58be20, 0x362fa: 0x6c58c020, 0x362fb: 0x6c58c220, + 0x362fc: 0x6c58c420, 0x362fd: 0x6c58c620, 0x362fe: 0x6c58c820, 0x362ff: 0x6c58ca20, + // Block 0xd8c, offset 0x36300 + 0x36300: 0x6c58cc20, 0x36301: 0x6c58ce20, 0x36302: 0x6c58d020, 0x36303: 0x6c58d220, + 0x36304: 0x6c58d420, 0x36305: 0x6c58d620, 0x36306: 0x6c58d820, 0x36307: 0x6c58da20, + 0x36308: 0x6c58dc20, 0x36309: 0x6c58de20, 0x3630a: 0x6c58e020, 0x3630b: 0x6c58e220, + 0x3630c: 0x6c58e420, 0x3630d: 0x6c58e620, 0x3630e: 0x6c58e820, 0x3630f: 0x6c58ea20, + 0x36310: 0x6c58ec20, 0x36311: 0x6c58ee20, 0x36312: 0x6c58f020, 0x36313: 0x6c58f220, + 0x36314: 0x6c58f420, 0x36315: 0x6c58f620, 0x36316: 0x6c58f820, 0x36317: 0x6c7b5c20, + 0x36318: 0x6c7b5e20, 0x36319: 0x6c7b6020, 0x3631a: 0x6c7b6220, 0x3631b: 0x6c7b6420, + 0x3631c: 0x6c7b6620, 0x3631d: 0x6c7b6820, 0x3631e: 0x6c7b6a20, 0x3631f: 0x6c7b6c20, + 0x36320: 0x6c7b6e20, 0x36321: 0x6c7b7020, 0x36322: 0x6c7b7220, 0x36323: 0x6c7b7420, + 0x36324: 0x6c7b7620, 0x36325: 0x6c7b7820, 0x36326: 0x6c7b7a20, 0x36327: 0x6c7b7c20, + 0x36328: 0x6c7b7e20, 0x36329: 0x6c7b8020, 0x3632a: 0x6c7b8220, 0x3632b: 0x6c7b8420, + 0x3632c: 0x6c7b8620, 0x3632d: 0x6c7b8820, 0x3632e: 0x6c7b8a20, 0x3632f: 0x6c7b8c20, + 0x36330: 0x6c7b8e20, 0x36331: 0x6c7b9020, 0x36332: 0x6c7b9220, 0x36333: 0x6c7b9420, + 0x36334: 0x6c7b9620, 0x36335: 0x6c7b9820, 0x36336: 0x6c7b9a20, 0x36337: 0x6ca44820, + 0x36338: 0x6ca44a20, 0x36339: 0x6ca44c20, 0x3633a: 0x6ca44e20, 0x3633b: 0x6ca45020, + 0x3633c: 0x6ca45220, 0x3633d: 0x6ca45420, 0x3633e: 0x6ca45620, 0x3633f: 0x6ca45820, + // Block 0xd8d, offset 0x36340 + 0x36340: 0x6ca45a20, 0x36341: 0x6ca45c20, 0x36342: 0x6ca45e20, 0x36343: 0x6ca46020, + 0x36344: 0x6ca46220, 0x36345: 0x6ca46420, 0x36346: 0x6ca46620, 0x36347: 0x6ca46820, + 0x36348: 0x6ca46a20, 0x36349: 0x6ca46c20, 0x3634a: 0x6ca46e20, 0x3634b: 0x6ca47020, + 0x3634c: 0x6ca47220, 0x3634d: 0x6ca47420, 0x3634e: 0x6ca47620, 0x3634f: 0x6ca47820, + 0x36350: 0x6ca47a20, 0x36351: 0x6ca47c20, 0x36352: 0x6ca47e20, 0x36353: 0x6ca48020, + 0x36354: 0x6ca48220, 0x36355: 0x6cd25a20, 0x36356: 0x6cd25c20, 0x36357: 0x6cd25e20, + 0x36358: 0x6cd26020, 0x36359: 0x6cd26220, 0x3635a: 0x6cd26420, 0x3635b: 0x6cd26620, + 0x3635c: 0x6cd26820, 0x3635d: 0x6cd26a20, 0x3635e: 0x6cd26c20, 0x3635f: 0x6cd26e20, + 0x36360: 0x6cd27020, 0x36361: 0x6cd27220, 0x36362: 0x6cd27420, 0x36363: 0x6cd27620, + 0x36364: 0x6cd27820, 0x36365: 0x6cd27a20, 0x36366: 0x6cd27c20, 0x36367: 0x6cd27e20, + 0x36368: 0x6cd28020, 0x36369: 0x6cd28220, 0x3636a: 0x6cd28420, 0x3636b: 0x6cd28620, + 0x3636c: 0x6cd28820, 0x3636d: 0x6cd28a20, 0x3636e: 0x6cd28c20, 0x3636f: 0x6cd28e20, + 0x36370: 0x6cd29020, 0x36371: 0x6cd29220, 0x36372: 0x6cd29420, 0x36373: 0x6cd29620, + 0x36374: 0x6cd29820, 0x36375: 0x6cd29a20, 0x36376: 0x6cd29c20, 0x36377: 0x6cd29e20, + 0x36378: 0x6cd2a020, 0x36379: 0x6cd2a220, 0x3637a: 0x6cd2a420, 0x3637b: 0x6cd2a620, + 0x3637c: 0x6cd2a820, 0x3637d: 0x6cd2aa20, 0x3637e: 0x6cd2ac20, 0x3637f: 0x6cd2ae20, + // Block 0xd8e, offset 0x36380 + 0x36380: 0x6cd2b020, 0x36381: 0x6cd2b220, 0x36382: 0x6d003c20, 0x36383: 0x6d003e20, + 0x36384: 0x6d004020, 0x36385: 0x6d004220, 0x36386: 0x6d004420, 0x36387: 0x6d004620, + 0x36388: 0x6d004820, 0x36389: 0x6d004a20, 0x3638a: 0x6d004c20, 0x3638b: 0x6d004e20, + 0x3638c: 0x6d005020, 0x3638d: 0x6d005220, 0x3638e: 0x6d005420, 0x3638f: 0x6d005620, + 0x36390: 0x6d005820, 0x36391: 0x6d005a20, 0x36392: 0x6d005c20, 0x36393: 0x6d005e20, + 0x36394: 0x6d006020, 0x36395: 0x6d006220, 0x36396: 0x6d006420, 0x36397: 0x6d006620, + 0x36398: 0x6d006820, 0x36399: 0x6d006a20, 0x3639a: 0x6d006c20, 0x3639b: 0x6d006e20, + 0x3639c: 0x6d007020, 0x3639d: 0x6d007220, 0x3639e: 0x6d007420, 0x3639f: 0x6d007620, + 0x363a0: 0x6d007820, 0x363a1: 0x6d007a20, 0x363a2: 0x6d007c20, 0x363a3: 0x6d007e20, + 0x363a4: 0x6d008020, 0x363a5: 0x6d008220, 0x363a6: 0x6d008420, 0x363a7: 0x6d008620, + 0x363a8: 0x6d008820, 0x363a9: 0x6d008a20, 0x363aa: 0x6d008c20, 0x363ab: 0x6d008e20, + 0x363ac: 0x6d009020, 0x363ad: 0x6d009220, 0x363ae: 0x6d009420, 0x363af: 0x6d009620, + 0x363b0: 0x6d009820, 0x363b1: 0x6d009a20, 0x363b2: 0x6d009c20, 0x363b3: 0x6d009e20, + 0x363b4: 0x6d00a020, 0x363b5: 0x6d00a220, 0x363b6: 0x6d00a420, 0x363b7: 0x6d00a620, + 0x363b8: 0x6d00a820, 0x363b9: 0x6d00aa20, 0x363ba: 0x6d00ac20, 0x363bb: 0x6d2e4220, + 0x363bc: 0x6d2e4420, 0x363bd: 0x6d2e4620, 0x363be: 0x6d2e4820, 0x363bf: 0x6d2e4a20, + // Block 0xd8f, offset 0x363c0 + 0x363c0: 0x6d2e4c20, 0x363c1: 0x6d2e4e20, 0x363c2: 0x6d2e5020, 0x363c3: 0x6d2e5220, + 0x363c4: 0x6d2e5420, 0x363c5: 0x6d2e5620, 0x363c6: 0x6d2e5820, 0x363c7: 0x6d2e5a20, + 0x363c8: 0x6d2e5c20, 0x363c9: 0x6d2e5e20, 0x363ca: 0x6d2e6020, 0x363cb: 0x6d2e6220, + 0x363cc: 0x6d2e6420, 0x363cd: 0x6d2e6620, 0x363ce: 0x6d2e6820, 0x363cf: 0x6d2e6a20, + 0x363d0: 0x6d2e6c20, 0x363d1: 0x6d2e6e20, 0x363d2: 0x6d2e7020, 0x363d3: 0x6d2e7220, + 0x363d4: 0x6d2e7420, 0x363d5: 0x6d2e7620, 0x363d6: 0x6d2e7820, 0x363d7: 0x6d2e7a20, + 0x363d8: 0x6d2e7c20, 0x363d9: 0x6d2e7e20, 0x363da: 0x6d2e8020, 0x363db: 0x6d2e8220, + 0x363dc: 0x6d2e8420, 0x363dd: 0x6d2e8620, 0x363de: 0x6d2e8820, 0x363df: 0x6d2e8a20, + 0x363e0: 0x6d2e8c20, 0x363e1: 0x6d2e8e20, 0x363e2: 0x6d2e9020, 0x363e3: 0x6d2e9220, + 0x363e4: 0x6d2e9420, 0x363e5: 0x6d2e9620, 0x363e6: 0x6d2e9820, 0x363e7: 0x6d2e9a20, + 0x363e8: 0x6d2e9c20, 0x363e9: 0x6d2e9e20, 0x363ea: 0x6d5b6c20, 0x363eb: 0x6d5b6e20, + 0x363ec: 0x6d5b7020, 0x363ed: 0x6d5b7220, 0x363ee: 0x6d5b7420, 0x363ef: 0x6d5b7620, + 0x363f0: 0x6d5b7820, 0x363f1: 0x6d5b7a20, 0x363f2: 0x6d5b7c20, 0x363f3: 0x6d5b7e20, + 0x363f4: 0x6d5b8020, 0x363f5: 0x6d5b8220, 0x363f6: 0x6d5b8420, 0x363f7: 0x6d5b8620, + 0x363f8: 0x6d5b8820, 0x363f9: 0x6d5b8a20, 0x363fa: 0x6d5b8c20, 0x363fb: 0x6d5b8e20, + 0x363fc: 0x6d5b9020, 0x363fd: 0x6d5b9220, 0x363fe: 0x6d5b9420, 0x363ff: 0x6d5b9620, + // Block 0xd90, offset 0x36400 + 0x36400: 0x6d5b9820, 0x36401: 0x6d5b9a20, 0x36402: 0x6d5b9c20, 0x36403: 0x6d5b9e20, + 0x36404: 0x6d5ba020, 0x36405: 0x6d5ba220, 0x36406: 0x6d5ba420, 0x36407: 0x6d5ba620, + 0x36408: 0x6d5ba820, 0x36409: 0x6d5baa20, 0x3640a: 0x6d5bac20, 0x3640b: 0x6d5bae20, + 0x3640c: 0x6d5bb020, 0x3640d: 0x6d5bb220, 0x3640e: 0x6d5bb420, 0x3640f: 0x6d5bb620, + 0x36410: 0x6d5bb820, 0x36411: 0x6d5bba20, 0x36412: 0x6d5bbc20, 0x36413: 0x6d5bbe20, + 0x36414: 0x6d5bc020, 0x36415: 0x6d5bc220, 0x36416: 0x6d5bc420, 0x36417: 0x6d5bc620, + 0x36418: 0x6d5bc820, 0x36419: 0x6d5bca20, 0x3641a: 0x6d5bcc20, 0x3641b: 0x6d5bce20, + 0x3641c: 0x6d5bd020, 0x3641d: 0x6d85fe20, 0x3641e: 0x6d860020, 0x3641f: 0x6d860220, + 0x36420: 0x6d860420, 0x36421: 0x6d860620, 0x36422: 0x6d860820, 0x36423: 0x6d860a20, + 0x36424: 0x6d860c20, 0x36425: 0x6d860e20, 0x36426: 0x6d861020, 0x36427: 0x6d861220, + 0x36428: 0x6d861420, 0x36429: 0x6d861620, 0x3642a: 0x6d861820, 0x3642b: 0x6d861a20, + 0x3642c: 0x6d861c20, 0x3642d: 0x6d861e20, 0x3642e: 0x6d862020, 0x3642f: 0x6d862220, + 0x36430: 0x6d862420, 0x36431: 0x6d862620, 0x36432: 0x6d862820, 0x36433: 0x6d862a20, + 0x36434: 0x6d862c20, 0x36435: 0x6d862e20, 0x36436: 0x6d863020, 0x36437: 0x6d863220, + 0x36438: 0x6d863420, 0x36439: 0x6d863620, 0x3643a: 0x6d863820, 0x3643b: 0x6d863a20, + 0x3643c: 0x6d863c20, 0x3643d: 0x6d863e20, 0x3643e: 0x6d864020, 0x3643f: 0x6d864220, + // Block 0xd91, offset 0x36440 + 0x36440: 0x6d864420, 0x36441: 0x6d864620, 0x36442: 0x6d864820, 0x36443: 0x6daa9020, + 0x36444: 0x6daa9220, 0x36445: 0x6daa9420, 0x36446: 0x6daa9620, 0x36447: 0x6daa9820, + 0x36448: 0x6daa9a20, 0x36449: 0x6daa9c20, 0x3644a: 0x6daa9e20, 0x3644b: 0x6daaa020, + 0x3644c: 0x6daaa220, 0x3644d: 0x6daaa420, 0x3644e: 0x6daaa620, 0x3644f: 0x6daaa820, + 0x36450: 0x6daaaa20, 0x36451: 0x6daaac20, 0x36452: 0x6daaae20, 0x36453: 0x6daab020, + 0x36454: 0x6daab220, 0x36455: 0x6daab420, 0x36456: 0x6daab620, 0x36457: 0x6daab820, + 0x36458: 0x6daaba20, 0x36459: 0x6daabc20, 0x3645a: 0x6daabe20, 0x3645b: 0x6daac020, + 0x3645c: 0x6daac220, 0x3645d: 0x6daac420, 0x3645e: 0x6d864a20, 0x3645f: 0x6daac620, + 0x36460: 0x6daac820, 0x36461: 0x6daaca20, 0x36462: 0x6daacc20, 0x36463: 0x6daace20, + 0x36464: 0x6daad020, 0x36465: 0x6daad220, 0x36466: 0x6daad420, 0x36467: 0x6daad620, + 0x36468: 0x6daad820, 0x36469: 0x6daada20, 0x3646a: 0x6daadc20, 0x3646b: 0x6daade20, + 0x3646c: 0x6daae020, 0x3646d: 0x6daae220, 0x3646e: 0x6daae420, 0x3646f: 0x6daae620, + 0x36470: 0x6daae820, 0x36471: 0x6daaea20, 0x36472: 0x6daaec20, 0x36473: 0x6daaee20, + 0x36474: 0x6daaf020, 0x36475: 0x6daaf220, 0x36476: 0x6daaf420, 0x36477: 0x6daaf620, + 0x36478: 0x6daaf820, 0x36479: 0x6daafa20, 0x3647a: 0x6dcb4c20, 0x3647b: 0x6dcb4e20, + 0x3647c: 0x6dcb5020, 0x3647d: 0x6dcb5220, 0x3647e: 0x6dcb5420, 0x3647f: 0x6dcb5620, + // Block 0xd92, offset 0x36480 + 0x36480: 0x6dcb5820, 0x36481: 0x6dcb5a20, 0x36482: 0x6dcb5c20, 0x36483: 0x6dcb5e20, + 0x36484: 0x6dcb6020, 0x36485: 0x6dcb6220, 0x36486: 0x6dcb6420, 0x36487: 0x6dcb6620, + 0x36488: 0x6dcb6820, 0x36489: 0x6dcb6a20, 0x3648a: 0x6dcb6c20, 0x3648b: 0x6dcb6e20, + 0x3648c: 0x6dcb7020, 0x3648d: 0x6dcb7220, 0x3648e: 0x6dcb7420, 0x3648f: 0x6dcb7620, + 0x36490: 0x6dcb7820, 0x36491: 0x6dcb7a20, 0x36492: 0x6dcb7c20, 0x36493: 0x6dcb7e20, + 0x36494: 0x6dcb8020, 0x36495: 0x6de6a420, 0x36496: 0x6de6a620, 0x36497: 0x6de6a820, + 0x36498: 0x6de6aa20, 0x36499: 0x6de6ac20, 0x3649a: 0x6de6ae20, 0x3649b: 0x6de6b020, + 0x3649c: 0x6de6b220, 0x3649d: 0x6de6b420, 0x3649e: 0x6de6b620, 0x3649f: 0x6de6b820, + 0x364a0: 0x6de6ba20, 0x364a1: 0x6de6bc20, 0x364a2: 0x6de6be20, 0x364a3: 0x6de6c020, + 0x364a4: 0x6de6c220, 0x364a5: 0x6de6c420, 0x364a6: 0x6de6c620, 0x364a7: 0x6de6c820, + 0x364a8: 0x6de6ca20, 0x364a9: 0x6de6cc20, 0x364aa: 0x6de6ce20, 0x364ab: 0x6de6d020, + 0x364ac: 0x6de6d220, 0x364ad: 0x6de6d420, 0x364ae: 0x6de6d620, 0x364af: 0x6de6d820, + 0x364b0: 0x6dfd5220, 0x364b1: 0x6dfd5420, 0x364b2: 0x6dfd5620, 0x364b3: 0x6dfd5820, + 0x364b4: 0x6dfd5a20, 0x364b5: 0x6dfd5c20, 0x364b6: 0x6dfd5e20, 0x364b7: 0x6dfd6020, + 0x364b8: 0x6dfd6220, 0x364b9: 0x6dfd6420, 0x364ba: 0x6dfd6620, 0x364bb: 0x6dfd6820, + 0x364bc: 0x6dfd6a20, 0x364bd: 0x6dfd6c20, 0x364be: 0x6dfd6e20, 0x364bf: 0x6dfd7020, + // Block 0xd93, offset 0x364c0 + 0x364c0: 0x6e102e20, 0x364c1: 0x6e103020, 0x364c2: 0x6e103220, 0x364c3: 0x6e103420, + 0x364c4: 0x6e103620, 0x364c5: 0x6e103820, 0x364c6: 0x6e103a20, 0x364c7: 0x6e103c20, + 0x364c8: 0x6e103e20, 0x364c9: 0x6e104020, 0x364ca: 0x6e104220, 0x364cb: 0x6e1ef020, + 0x364cc: 0x6e1ef220, 0x364cd: 0x6e1ef420, 0x364ce: 0x6e1ef620, 0x364cf: 0x6e1ef820, + 0x364d0: 0x6e2a4e20, 0x364d1: 0x6e2a5020, 0x364d2: 0x6e2a5220, 0x364d3: 0x6e2a5420, + 0x364d4: 0x6e2a5620, 0x364d5: 0x6e2a5820, 0x364d6: 0x6e2a5a20, 0x364d7: 0x6e2a5c20, + 0x364d8: 0x6e32f620, 0x364d9: 0x6e32f820, 0x364da: 0x6e32fa20, 0x364db: 0x6e32fc20, + 0x364dc: 0x6e392a20, 0x364dd: 0x6e392c20, 0x364de: 0x6e392e20, 0x364df: 0x6e3d8220, + 0x364e0: 0x6e3d8420, 0x364e1: 0x6e3d8620, 0x364e2: 0x6e408220, 0x364e3: 0x6e42cc20, + 0x364e4: 0x6e443a20, 0x364e5: 0x6c24f420, 0x364e6: 0x6c24f620, 0x364e7: 0x6c590820, + 0x364e8: 0x6c590a20, 0x364e9: 0x6c7ba420, 0x364ea: 0x6c7ba620, 0x364eb: 0x6c7ba820, + 0x364ec: 0x6ca48620, 0x364ed: 0x6ca48820, 0x364ee: 0x6ca48a20, 0x364ef: 0x6cd2bc20, + 0x364f0: 0x6cd2be20, 0x364f1: 0x6cd2c020, 0x364f2: 0x6cd2c220, 0x364f3: 0x6d00b420, + 0x364f4: 0x6d00b620, 0x364f5: 0x6d00b820, 0x364f6: 0x6d2ea620, 0x364f7: 0x6d5bd820, + 0x364f8: 0x6d5bda20, 0x364f9: 0x6d864c20, 0x364fa: 0x6d864e20, 0x364fb: 0x6dfd7220, + 0x364fc: 0x6d865020, 0x364fd: 0x6c13e420, 0x364fe: 0x6c13e620, 0x364ff: 0x6c250220, + // Block 0xd94, offset 0x36500 + 0x36500: 0x6c250420, 0x36501: 0x6c250620, 0x36502: 0x6c3c4820, 0x36503: 0x6c3c4a20, + 0x36504: 0x6c3c4c20, 0x36505: 0x6c3c4e20, 0x36506: 0x6c3c5020, 0x36507: 0x6c3c5220, + 0x36508: 0x6c591620, 0x36509: 0x6c591820, 0x3650a: 0x6c591a20, 0x3650b: 0x6c591c20, + 0x3650c: 0x6c591e20, 0x3650d: 0x6c592020, 0x3650e: 0x6c592220, 0x3650f: 0x6c592420, + 0x36510: 0x6c592620, 0x36511: 0x6c592820, 0x36512: 0x6c592a20, 0x36513: 0x6c592c20, + 0x36514: 0x6c592e20, 0x36515: 0x6c593020, 0x36516: 0x6c593220, 0x36517: 0x6c593420, + 0x36518: 0x6c7bb620, 0x36519: 0x6c7bb820, 0x3651a: 0x6c7bba20, 0x3651b: 0x6c7bbc20, + 0x3651c: 0x6c7bbe20, 0x3651d: 0x6c7bc020, 0x3651e: 0x6c7bc220, 0x3651f: 0x6c7bc420, + 0x36520: 0x6c7bc620, 0x36521: 0x6c7bc820, 0x36522: 0x6c7bca20, 0x36523: 0x6c7bcc20, + 0x36524: 0x6c7bce20, 0x36525: 0x6ca49a20, 0x36526: 0x6ca49c20, 0x36527: 0x6ca49e20, + 0x36528: 0x6ca4a020, 0x36529: 0x6ca4a220, 0x3652a: 0x6ca4a420, 0x3652b: 0x6ca4a620, + 0x3652c: 0x6cd2d020, 0x3652d: 0x6cd2d220, 0x3652e: 0x6cd2d420, 0x3652f: 0x6cd2d620, + 0x36530: 0x6cd2d820, 0x36531: 0x6cd2da20, 0x36532: 0x6cd2dc20, 0x36533: 0x6cd2de20, + 0x36534: 0x6cd2e020, 0x36535: 0x6cd2e220, 0x36536: 0x6cd2e420, 0x36537: 0x6cd2e620, + 0x36538: 0x6cd2e820, 0x36539: 0x6d00c220, 0x3653a: 0x6d00c420, 0x3653b: 0x6d00c620, + 0x3653c: 0x6d00c820, 0x3653d: 0x6d00ca20, 0x3653e: 0x6d00cc20, 0x3653f: 0x6d00ce20, + // Block 0xd95, offset 0x36540 + 0x36540: 0x6d00d020, 0x36541: 0x6d00d220, 0x36542: 0x6d00d420, 0x36543: 0x6d00d620, + 0x36544: 0x6d00d820, 0x36545: 0x6d00da20, 0x36546: 0x6d00dc20, 0x36547: 0x6d00de20, + 0x36548: 0x6d2eac20, 0x36549: 0x6d2eae20, 0x3654a: 0x6d2eb020, 0x3654b: 0x6d2eb220, + 0x3654c: 0x6d2eb420, 0x3654d: 0x6d2eb620, 0x3654e: 0x6d2eb820, 0x3654f: 0x6d2eba20, + 0x36550: 0x6d2ebc20, 0x36551: 0x6d2ebe20, 0x36552: 0x6d2ec020, 0x36553: 0x6d2ec220, + 0x36554: 0x6d5be820, 0x36555: 0x6d5bea20, 0x36556: 0x6d5bec20, 0x36557: 0x6d5bee20, + 0x36558: 0x6d5bf020, 0x36559: 0x6d5bf220, 0x3655a: 0x6d5bf420, 0x3655b: 0x6d865a20, + 0x3655c: 0x6d865c20, 0x3655d: 0x6d865e20, 0x3655e: 0x6d866020, 0x3655f: 0x6d866220, + 0x36560: 0x6dab0820, 0x36561: 0x6dab0a20, 0x36562: 0x6dab0c20, 0x36563: 0x6dab0e20, + 0x36564: 0x6dab1020, 0x36565: 0x6dab1220, 0x36566: 0x6dab1420, 0x36567: 0x6dcb8a20, + 0x36568: 0x6dcb8c20, 0x36569: 0x6dcb8e20, 0x3656a: 0x6dcb9020, 0x3656b: 0x6de6e020, + 0x3656c: 0x6de6e220, 0x3656d: 0x6de6e420, 0x3656e: 0x6de6e620, 0x3656f: 0x6de6e820, + 0x36570: 0x6de6ea20, 0x36571: 0x6de6ec20, 0x36572: 0x6de6ee20, 0x36573: 0x6de6f020, + 0x36574: 0x6dfd7820, 0x36575: 0x6dfd7a20, 0x36576: 0x6dfd7c20, 0x36577: 0x6dfd7e20, + 0x36578: 0x6e104820, 0x36579: 0x6e104a20, 0x3657a: 0x6e104c20, 0x3657b: 0x6e1efa20, + 0x3657c: 0x6e1efc20, 0x3657d: 0x6e1efe20, 0x3657e: 0x6e2a5e20, 0x3657f: 0x6e2a6020, + // Block 0xd96, offset 0x36580 + 0x36580: 0x6e32fe20, 0x36581: 0x6e330020, 0x36582: 0x6e330220, 0x36583: 0x6e330420, + 0x36584: 0x6e393220, 0x36585: 0x6e443c20, 0x36586: 0x6c250820, 0x36587: 0x6c250a20, + 0x36588: 0x6c3c5820, 0x36589: 0x6c3c5a20, 0x3658a: 0x6c3c5c20, 0x3658b: 0x6c3c5e20, + 0x3658c: 0x6c3c6020, 0x3658d: 0x6c3c6220, 0x3658e: 0x6c593e20, 0x3658f: 0x6c594020, + 0x36590: 0x6c594220, 0x36591: 0x6c594420, 0x36592: 0x6c594620, 0x36593: 0x6c594820, + 0x36594: 0x6c594a20, 0x36595: 0x6c7bdc20, 0x36596: 0x6c7bde20, 0x36597: 0x6c7be020, + 0x36598: 0x6c7be220, 0x36599: 0x6c7be420, 0x3659a: 0x6c7be620, 0x3659b: 0x6c7be820, + 0x3659c: 0x6c7bea20, 0x3659d: 0x6c7bec20, 0x3659e: 0x6c7bee20, 0x3659f: 0x6ca4ae20, + 0x365a0: 0x6ca4b020, 0x365a1: 0x6ca4b220, 0x365a2: 0x6ca4b420, 0x365a3: 0x6ca4b620, + 0x365a4: 0x6ca4b820, 0x365a5: 0x6ca4ba20, 0x365a6: 0x6ca4bc20, 0x365a7: 0x6cd2f420, + 0x365a8: 0x6cd2f620, 0x365a9: 0x6cd2f820, 0x365aa: 0x6cd2fa20, 0x365ab: 0x6cd2fc20, + 0x365ac: 0x6cd2fe20, 0x365ad: 0x6cd30020, 0x365ae: 0x6cd30220, 0x365af: 0x6d00ec20, + 0x365b0: 0x6cd30420, 0x365b1: 0x6cd30620, 0x365b2: 0x6cd30820, 0x365b3: 0x6d00ee20, + 0x365b4: 0x6d00f020, 0x365b5: 0x6d00f220, 0x365b6: 0x6d00f420, 0x365b7: 0x6d00f620, + 0x365b8: 0x6d00f820, 0x365b9: 0x6d00fa20, 0x365ba: 0x6d00fc20, 0x365bb: 0x6d00fe20, + 0x365bc: 0x6d010020, 0x365bd: 0x6d010220, 0x365be: 0x6d010420, 0x365bf: 0x6d010620, + // Block 0xd97, offset 0x365c0 + 0x365c0: 0x6d2ed420, 0x365c1: 0x6d2ed620, 0x365c2: 0x6d2ed820, 0x365c3: 0x6d2eda20, + 0x365c4: 0x6d2edc20, 0x365c5: 0x6d2ede20, 0x365c6: 0x6d2ee020, 0x365c7: 0x6d2ee220, + 0x365c8: 0x6d2ee420, 0x365c9: 0x6d2ee620, 0x365ca: 0x6d2ee820, 0x365cb: 0x6d2eea20, + 0x365cc: 0x6d2eec20, 0x365cd: 0x6d5bfe20, 0x365ce: 0x6d5c0020, 0x365cf: 0x6d5c0220, + 0x365d0: 0x6d5c0420, 0x365d1: 0x6d5c0620, 0x365d2: 0x6d5c0820, 0x365d3: 0x6d5c0a20, + 0x365d4: 0x6d866820, 0x365d5: 0x6d866a20, 0x365d6: 0x6d866c20, 0x365d7: 0x6d866e20, + 0x365d8: 0x6d867020, 0x365d9: 0x6d867220, 0x365da: 0x6d867420, 0x365db: 0x6d867620, + 0x365dc: 0x6d867820, 0x365dd: 0x6d867a20, 0x365de: 0x6d867c20, 0x365df: 0x6dab1820, + 0x365e0: 0x6dab1a20, 0x365e1: 0x6dab1c20, 0x365e2: 0x6dcb9620, 0x365e3: 0x6dcb9820, + 0x365e4: 0x6dcb9a20, 0x365e5: 0x6dcb9c20, 0x365e6: 0x6dcb9e20, 0x365e7: 0x6dcba020, + 0x365e8: 0x6dcba220, 0x365e9: 0x6dcba420, 0x365ea: 0x6dcba620, 0x365eb: 0x6de6f220, + 0x365ec: 0x6de6f420, 0x365ed: 0x6de6f620, 0x365ee: 0x6de6f820, 0x365ef: 0x6dfd8420, + 0x365f0: 0x6dfd8620, 0x365f1: 0x6dfd8820, 0x365f2: 0x6dfd8a20, 0x365f3: 0x6dfd8c20, + 0x365f4: 0x6e105020, 0x365f5: 0x6e105220, 0x365f6: 0x6e1f0220, 0x365f7: 0x6e1f0420, + 0x365f8: 0x6e1f0620, 0x365f9: 0x6e330620, 0x365fa: 0x6e330820, 0x365fb: 0x6e3c7e20, + 0x365fc: 0x6e3fda20, 0x365fd: 0x6e450420, 0x365fe: 0x6e46a420, 0x365ff: 0x6c251020, + // Block 0xd98, offset 0x36600 + 0x36600: 0x6c251220, 0x36601: 0x6c3c6a20, 0x36602: 0x6c3c6c20, 0x36603: 0x6c3c6e20, + 0x36604: 0x6c3c7020, 0x36605: 0x6c3c7220, 0x36606: 0x6c595e20, 0x36607: 0x6c596020, + 0x36608: 0x6c596220, 0x36609: 0x6c596420, 0x3660a: 0x6c596620, 0x3660b: 0x6c596820, + 0x3660c: 0x6c596a20, 0x3660d: 0x6c596c20, 0x3660e: 0x6c7c0820, 0x3660f: 0x6c7c0a20, + 0x36610: 0x6c7c0c20, 0x36611: 0x6c7c0e20, 0x36612: 0x6c7c1020, 0x36613: 0x6c7c1220, + 0x36614: 0x6c7c1420, 0x36615: 0x6c7c1620, 0x36616: 0x6c7c1820, 0x36617: 0x6c7c1a20, + 0x36618: 0x6c7c1c20, 0x36619: 0x6c7c1e20, 0x3661a: 0x6c7c2020, 0x3661b: 0x6c7c2220, + 0x3661c: 0x6c7c2420, 0x3661d: 0x6c7c2620, 0x3661e: 0x6ca4d220, 0x3661f: 0x6ca4d420, + 0x36620: 0x6ca4d620, 0x36621: 0x6ca4d820, 0x36622: 0x6ca4da20, 0x36623: 0x6ca4dc20, + 0x36624: 0x6ca4de20, 0x36625: 0x6ca4e020, 0x36626: 0x6ca4e220, 0x36627: 0x6ca4e420, + 0x36628: 0x6ca4e620, 0x36629: 0x6ca4e820, 0x3662a: 0x6ca4ea20, 0x3662b: 0x6c7c2820, + 0x3662c: 0x6cd31220, 0x3662d: 0x6cd31420, 0x3662e: 0x6cd31620, 0x3662f: 0x6cd31820, + 0x36630: 0x6cd31a20, 0x36631: 0x6cd31c20, 0x36632: 0x6cd31e20, 0x36633: 0x6cd32020, + 0x36634: 0x6cd32220, 0x36635: 0x6cd32420, 0x36636: 0x6cd32620, 0x36637: 0x6d011220, + 0x36638: 0x6d011420, 0x36639: 0x6d011620, 0x3663a: 0x6d011820, 0x3663b: 0x6d011a20, + 0x3663c: 0x6d011c20, 0x3663d: 0x6d011e20, 0x3663e: 0x6d012020, 0x3663f: 0x6d012220, + // Block 0xd99, offset 0x36640 + 0x36640: 0x6d012420, 0x36641: 0x6d012620, 0x36642: 0x6d012820, 0x36643: 0x6d2efc20, + 0x36644: 0x6d2efe20, 0x36645: 0x6d2f0020, 0x36646: 0x6d2f0220, 0x36647: 0x6d5c0e20, + 0x36648: 0x6d5c1020, 0x36649: 0x6d5c1220, 0x3664a: 0x6d5c1420, 0x3664b: 0x6d5c1620, + 0x3664c: 0x6d5c1820, 0x3664d: 0x6d5c1a20, 0x3664e: 0x6d5c1c20, 0x3664f: 0x6d5c1e20, + 0x36650: 0x6d5c2020, 0x36651: 0x6d5c2220, 0x36652: 0x6d5c2420, 0x36653: 0x6d868820, + 0x36654: 0x6d868a20, 0x36655: 0x6d868c20, 0x36656: 0x6d868e20, 0x36657: 0x6d869020, + 0x36658: 0x6d869220, 0x36659: 0x6d869420, 0x3665a: 0x6d869620, 0x3665b: 0x6d869820, + 0x3665c: 0x6d869a20, 0x3665d: 0x6d869c20, 0x3665e: 0x6d869e20, 0x3665f: 0x6d86a020, + 0x36660: 0x6d86a220, 0x36661: 0x6d86a420, 0x36662: 0x6d86a620, 0x36663: 0x6d86a820, + 0x36664: 0x6d86aa20, 0x36665: 0x6dab2620, 0x36666: 0x6dab2820, 0x36667: 0x6dab2a20, + 0x36668: 0x6dab2c20, 0x36669: 0x6dab2e20, 0x3666a: 0x6dab3020, 0x3666b: 0x6dab3220, + 0x3666c: 0x6dab3420, 0x3666d: 0x6dab3620, 0x3666e: 0x6dab3820, 0x3666f: 0x6dab3a20, + 0x36670: 0x6dab3c20, 0x36671: 0x6dab3e20, 0x36672: 0x6dab4020, 0x36673: 0x6da02a20, + 0x36674: 0x6dab4220, 0x36675: 0x6dab4420, 0x36676: 0x6dab4620, 0x36677: 0x6dab4820, + 0x36678: 0x6dcbac20, 0x36679: 0x6dcbae20, 0x3667a: 0x6dcbb020, 0x3667b: 0x6de6fc20, + 0x3667c: 0x6dcbb220, 0x3667d: 0x6dcbb420, 0x3667e: 0x6dcbb620, 0x3667f: 0x6dcbb820, + // Block 0xd9a, offset 0x36680 + 0x36680: 0x6dcbba20, 0x36681: 0x6de6fe20, 0x36682: 0x6de70020, 0x36683: 0x6de70220, + 0x36684: 0x6de70420, 0x36685: 0x6de70620, 0x36686: 0x6de70820, 0x36687: 0x6dfd9020, + 0x36688: 0x6dfd9220, 0x36689: 0x6dfd9420, 0x3668a: 0x6dfd9620, 0x3668b: 0x6dfd9820, + 0x3668c: 0x6dfd9a20, 0x3668d: 0x6dfd9c20, 0x3668e: 0x6dfd9e20, 0x3668f: 0x6dfda020, + 0x36690: 0x6dfda220, 0x36691: 0x6dfda420, 0x36692: 0x6e105620, 0x36693: 0x6e1f0a20, + 0x36694: 0x6e1f0c20, 0x36695: 0x6e1f0e20, 0x36696: 0x6e1f1020, 0x36697: 0x6e1f1220, + 0x36698: 0x6e2a6220, 0x36699: 0x6e2a6420, 0x3669a: 0x6e330a20, 0x3669b: 0x6e330c20, + 0x3669c: 0x6e330e20, 0x3669d: 0x6e331020, 0x3669e: 0x6e2a6620, 0x3669f: 0x6e393420, + 0x366a0: 0x6e393620, 0x366a1: 0x6e3d8820, 0x366a2: 0x6e452c20, 0x366a3: 0x6e468820, + 0x366a4: 0x6c13e820, 0x366a5: 0x6c13ea20, 0x366a6: 0x6c251a20, 0x366a7: 0x6c251c20, + 0x366a8: 0x6c251e20, 0x366a9: 0x6c252020, 0x366aa: 0x6c252220, 0x366ab: 0x6c252420, + 0x366ac: 0x6c252620, 0x366ad: 0x6c252820, 0x366ae: 0x6c252a20, 0x366af: 0x6c252c20, + 0x366b0: 0x6c252e20, 0x366b1: 0x6c253020, 0x366b2: 0x6c3c8c20, 0x366b3: 0x6c3c8e20, + 0x366b4: 0x6c3c9020, 0x366b5: 0x6c3c9220, 0x366b6: 0x6c3c9420, 0x366b7: 0x6c3c9620, + 0x366b8: 0x6c3c9820, 0x366b9: 0x6c3c9a20, 0x366ba: 0x6c3c9c20, 0x366bb: 0x6c3c9e20, + 0x366bc: 0x6c3ca020, 0x366bd: 0x6c3ca220, 0x366be: 0x6c3ca420, 0x366bf: 0x6c3ca620, + // Block 0xd9b, offset 0x366c0 + 0x366c0: 0x6c3ca820, 0x366c1: 0x6c3caa20, 0x366c2: 0x6c3cac20, 0x366c3: 0x6c59b820, + 0x366c4: 0x6c59ba20, 0x366c5: 0x6c59bc20, 0x366c6: 0x6c59be20, 0x366c7: 0x6c59c020, + 0x366c8: 0x6c59c220, 0x366c9: 0x6c59c420, 0x366ca: 0x6c59c620, 0x366cb: 0x6c59c820, + 0x366cc: 0x6c59ca20, 0x366cd: 0x6c59cc20, 0x366ce: 0x6c59ce20, 0x366cf: 0x6c59d020, + 0x366d0: 0x6c59d220, 0x366d1: 0x6c59d420, 0x366d2: 0x6c59d620, 0x366d3: 0x6c59d820, + 0x366d4: 0x6c59da20, 0x366d5: 0x6c59dc20, 0x366d6: 0x6c59de20, 0x366d7: 0x6c59e020, + 0x366d8: 0x6c59e220, 0x366d9: 0x6c59e420, 0x366da: 0x6c59e620, 0x366db: 0x6c59e820, + 0x366dc: 0x6c59ea20, 0x366dd: 0x6c59ec20, 0x366de: 0x6c59ee20, 0x366df: 0x6c59f020, + 0x366e0: 0x6c59f220, 0x366e1: 0x6c59f420, 0x366e2: 0x6c59f620, 0x366e3: 0x6c59f820, + 0x366e4: 0x6c59fa20, 0x366e5: 0x6c59fc20, 0x366e6: 0x6c59fe20, 0x366e7: 0x6c5a0020, + 0x366e8: 0x6c5a0220, 0x366e9: 0x6c5a0420, 0x366ea: 0x6c5a0620, 0x366eb: 0x6c5a0820, + 0x366ec: 0x6c5a0a20, 0x366ed: 0x6c5a0c20, 0x366ee: 0x6c5a0e20, 0x366ef: 0x6c5a1020, + 0x366f0: 0x6c5a1220, 0x366f1: 0x6c7c7a20, 0x366f2: 0x6c7c7c20, 0x366f3: 0x6c7c7e20, + 0x366f4: 0x6c7c8020, 0x366f5: 0x6c7c8220, 0x366f6: 0x6c7c8420, 0x366f7: 0x6c7c8620, + 0x366f8: 0x6c7c8820, 0x366f9: 0x6c7c8a20, 0x366fa: 0x6c7c8c20, 0x366fb: 0x6c7c8e20, + 0x366fc: 0x6c7c9020, 0x366fd: 0x6c7c9220, 0x366fe: 0x6c7c9420, 0x366ff: 0x6c7c9620, + // Block 0xd9c, offset 0x36700 + 0x36700: 0x6c7c9820, 0x36701: 0x6c7c9a20, 0x36702: 0x6c7c9c20, 0x36703: 0x6c7c9e20, + 0x36704: 0x6c7ca020, 0x36705: 0x6c7ca220, 0x36706: 0x6c7ca420, 0x36707: 0x6c7ca620, + 0x36708: 0x6c7ca820, 0x36709: 0x6c7caa20, 0x3670a: 0x6c7cac20, 0x3670b: 0x6c7cae20, + 0x3670c: 0x6c7cb020, 0x3670d: 0x6c7cb220, 0x3670e: 0x6c7cb420, 0x3670f: 0x6c7cb620, + 0x36710: 0x6c7cb820, 0x36711: 0x6c7cba20, 0x36712: 0x6c7cbc20, 0x36713: 0x6c7cbe20, + 0x36714: 0x6c7cc020, 0x36715: 0x6c7cc220, 0x36716: 0x6c7cc420, 0x36717: 0x6c7cc620, + 0x36718: 0x6c7cc820, 0x36719: 0x6c7cca20, 0x3671a: 0x6ca52a20, 0x3671b: 0x6ca52c20, + 0x3671c: 0x6ca52e20, 0x3671d: 0x6ca53020, 0x3671e: 0x6ca53220, 0x3671f: 0x6ca53420, + 0x36720: 0x6ca53620, 0x36721: 0x6ca53820, 0x36722: 0x6ca53a20, 0x36723: 0x6ca53c20, + 0x36724: 0x6ca53e20, 0x36725: 0x6ca54020, 0x36726: 0x6ca54220, 0x36727: 0x6ca54420, + 0x36728: 0x6ca54620, 0x36729: 0x6ca54820, 0x3672a: 0x6ca54a20, 0x3672b: 0x6ca54c20, + 0x3672c: 0x6ca54e20, 0x3672d: 0x6ca55020, 0x3672e: 0x6ca55220, 0x3672f: 0x6ca55420, + 0x36730: 0x6ca55620, 0x36731: 0x6ca55820, 0x36732: 0x6ca55a20, 0x36733: 0x6ca55c20, + 0x36734: 0x6ca55e20, 0x36735: 0x6ca56020, 0x36736: 0x6ca56220, 0x36737: 0x6ca56420, + 0x36738: 0x6ca56620, 0x36739: 0x6ca56820, 0x3673a: 0x6ca56a20, 0x3673b: 0x6ca56c20, + 0x3673c: 0x6ca56e20, 0x3673d: 0x6ca57020, 0x3673e: 0x6ca57220, 0x3673f: 0x6ca57420, + // Block 0xd9d, offset 0x36740 + 0x36740: 0x6ca57620, 0x36741: 0x6ca57820, 0x36742: 0x6ca57a20, 0x36743: 0x6ca57c20, + 0x36744: 0x6ca57e20, 0x36745: 0x6ca58020, 0x36746: 0x6ca58220, 0x36747: 0x6ca58420, + 0x36748: 0x6ca58620, 0x36749: 0x6ca58820, 0x3674a: 0x6cd37220, 0x3674b: 0x6cd37420, + 0x3674c: 0x6cd37620, 0x3674d: 0x6cd37820, 0x3674e: 0x6cd37a20, 0x3674f: 0x6cd37c20, + 0x36750: 0x6cd37e20, 0x36751: 0x6cd38020, 0x36752: 0x6cd38220, 0x36753: 0x6cd38420, + 0x36754: 0x6cd38620, 0x36755: 0x6cd38820, 0x36756: 0x6cd38a20, 0x36757: 0x6cd38c20, + 0x36758: 0x6cd38e20, 0x36759: 0x6cd39020, 0x3675a: 0x6cd39220, 0x3675b: 0x6cd39420, + 0x3675c: 0x6cd39620, 0x3675d: 0x6cd39820, 0x3675e: 0x6cd39a20, 0x3675f: 0x6cd39c20, + 0x36760: 0x6cd39e20, 0x36761: 0x6cd3a020, 0x36762: 0x6cd3a220, 0x36763: 0x6cd3a420, + 0x36764: 0x6cd3a620, 0x36765: 0x6cd3a820, 0x36766: 0x6cd3aa20, 0x36767: 0x6cd3ac20, + 0x36768: 0x6cd3ae20, 0x36769: 0x6cd3b020, 0x3676a: 0x6cd3b220, 0x3676b: 0x6cd3b420, + 0x3676c: 0x6cd3b620, 0x3676d: 0x6cd3b820, 0x3676e: 0x6cd3ba20, 0x3676f: 0x6cd3bc20, + 0x36770: 0x6cd3be20, 0x36771: 0x6cd3c020, 0x36772: 0x6cd3c220, 0x36773: 0x6cd3c420, + 0x36774: 0x6cd3c620, 0x36775: 0x6cd3c820, 0x36776: 0x6cd3ca20, 0x36777: 0x6cd3cc20, + 0x36778: 0x6cd3ce20, 0x36779: 0x6cd3d020, 0x3677a: 0x6cd3d220, 0x3677b: 0x6cd3d420, + 0x3677c: 0x6cd3d620, 0x3677d: 0x6cd3d820, 0x3677e: 0x6cd3da20, 0x3677f: 0x6cd3dc20, + // Block 0xd9e, offset 0x36780 + 0x36780: 0x6cd3de20, 0x36781: 0x6cd3e020, 0x36782: 0x6cd3e220, 0x36783: 0x6cd3e420, + 0x36784: 0x6cd3e620, 0x36785: 0x6d017e20, 0x36786: 0x6cd3e820, 0x36787: 0x6cd3ea20, + 0x36788: 0x6cd3ec20, 0x36789: 0x6d018020, 0x3678a: 0x6d018220, 0x3678b: 0x6d018420, + 0x3678c: 0x6d018620, 0x3678d: 0x6d018820, 0x3678e: 0x6d018a20, 0x3678f: 0x6d018c20, + 0x36790: 0x6d018e20, 0x36791: 0x6d019020, 0x36792: 0x6d019220, 0x36793: 0x6d019420, + 0x36794: 0x6d019620, 0x36795: 0x6d019820, 0x36796: 0x6d019a20, 0x36797: 0x6d019c20, + 0x36798: 0x6d019e20, 0x36799: 0x6d01a020, 0x3679a: 0x6d01a220, 0x3679b: 0x6d01a420, + 0x3679c: 0x6d01a620, 0x3679d: 0x6d01a820, 0x3679e: 0x6d01aa20, 0x3679f: 0x6d01ac20, + 0x367a0: 0x6d01ae20, 0x367a1: 0x6d01b020, 0x367a2: 0x6d01b220, 0x367a3: 0x6d01b420, + 0x367a4: 0x6d01b620, 0x367a5: 0x6d01b820, 0x367a6: 0x6d01ba20, 0x367a7: 0x6d01bc20, + 0x367a8: 0x6d01be20, 0x367a9: 0x6d01c020, 0x367aa: 0x6d01c220, 0x367ab: 0x6cd3ee20, + 0x367ac: 0x6d01c420, 0x367ad: 0x6d01c620, 0x367ae: 0x6d01c820, 0x367af: 0x6d01ca20, + 0x367b0: 0x6d01cc20, 0x367b1: 0x6d01ce20, 0x367b2: 0x6d01d020, 0x367b3: 0x6d01d220, + 0x367b4: 0x6cf5b420, 0x367b5: 0x6d01d420, 0x367b6: 0x6d01d620, 0x367b7: 0x6d01d820, + 0x367b8: 0x6d01da20, 0x367b9: 0x6d01dc20, 0x367ba: 0x6d01de20, 0x367bb: 0x6d01e020, + 0x367bc: 0x6d01e220, 0x367bd: 0x6d01e420, 0x367be: 0x6d01e620, 0x367bf: 0x6d01e820, + // Block 0xd9f, offset 0x367c0 + 0x367c0: 0x6d01ea20, 0x367c1: 0x6d01ec20, 0x367c2: 0x6d2f5220, 0x367c3: 0x6d2f5420, + 0x367c4: 0x6d2f5620, 0x367c5: 0x6d2f5820, 0x367c6: 0x6d2f5a20, 0x367c7: 0x6d2f5c20, + 0x367c8: 0x6d2f5e20, 0x367c9: 0x6d2f6020, 0x367ca: 0x6d2f6220, 0x367cb: 0x6d2f6420, + 0x367cc: 0x6d2f6620, 0x367cd: 0x6d2f6820, 0x367ce: 0x6d2f6a20, 0x367cf: 0x6d2f6c20, + 0x367d0: 0x6d2f6e20, 0x367d1: 0x6d2f7020, 0x367d2: 0x6d2f7220, 0x367d3: 0x6d2f7420, + 0x367d4: 0x6d2f7620, 0x367d5: 0x6d2f7820, 0x367d6: 0x6d2f7a20, 0x367d7: 0x6d2f7c20, + 0x367d8: 0x6d2f7e20, 0x367d9: 0x6d2f8020, 0x367da: 0x6d2f8220, 0x367db: 0x6d2f8420, + 0x367dc: 0x6d2f8620, 0x367dd: 0x6d2f8820, 0x367de: 0x6d2f8a20, 0x367df: 0x6d2f8c20, + 0x367e0: 0x6d2f8e20, 0x367e1: 0x6d2f9020, 0x367e2: 0x6d2f9220, 0x367e3: 0x6d2f9420, + 0x367e4: 0x6d2f9620, 0x367e5: 0x6d2f9820, 0x367e6: 0x6d2f9a20, 0x367e7: 0x6d2f9c20, + 0x367e8: 0x6d2f9e20, 0x367e9: 0x6d2fa020, 0x367ea: 0x6d2fa220, 0x367eb: 0x6d2fa420, + 0x367ec: 0x6d2fa620, 0x367ed: 0x6d2fa820, 0x367ee: 0x6d2faa20, 0x367ef: 0x6d2fac20, + 0x367f0: 0x6d2fae20, 0x367f1: 0x6d2fb020, 0x367f2: 0x6d2fb220, 0x367f3: 0x6d2fb420, + 0x367f4: 0x6d2fb620, 0x367f5: 0x6d2fb820, 0x367f6: 0x6d2fba20, 0x367f7: 0x6d2fbc20, + 0x367f8: 0x6d2fbe20, 0x367f9: 0x6d2fc020, 0x367fa: 0x6d2fc220, 0x367fb: 0x6d2fc420, + 0x367fc: 0x6d5c5820, 0x367fd: 0x6d5c5a20, 0x367fe: 0x6d5c5c20, 0x367ff: 0x6d5c5e20, + // Block 0xda0, offset 0x36800 + 0x36800: 0x6d5c6020, 0x36801: 0x6d5c6220, 0x36802: 0x6d5c6420, 0x36803: 0x6d5c6620, + 0x36804: 0x6d5c6820, 0x36805: 0x6d5c6a20, 0x36806: 0x6d5c6c20, 0x36807: 0x6d5c6e20, + 0x36808: 0x6d5c7020, 0x36809: 0x6d5c7220, 0x3680a: 0x6d5c7420, 0x3680b: 0x6d5c7620, + 0x3680c: 0x6d5c7820, 0x3680d: 0x6d5c7a20, 0x3680e: 0x6d5c7c20, 0x3680f: 0x6d5c7e20, + 0x36810: 0x6d5c8020, 0x36811: 0x6d5c8220, 0x36812: 0x6d5c8420, 0x36813: 0x6d5c8620, + 0x36814: 0x6d5c8820, 0x36815: 0x6d5c8a20, 0x36816: 0x6d5c8c20, 0x36817: 0x6d5c8e20, + 0x36818: 0x6d5c9020, 0x36819: 0x6d5c9220, 0x3681a: 0x6d5c9420, 0x3681b: 0x6d5c9620, + 0x3681c: 0x6d5c9820, 0x3681d: 0x6d5c9a20, 0x3681e: 0x6d5c9c20, 0x3681f: 0x6d5c9e20, + 0x36820: 0x6d5ca020, 0x36821: 0x6d5ca220, 0x36822: 0x6d5ca420, 0x36823: 0x6d5ca620, + 0x36824: 0x6d5ca820, 0x36825: 0x6d5caa20, 0x36826: 0x6d5cac20, 0x36827: 0x6d5cae20, + 0x36828: 0x6d5cb020, 0x36829: 0x6d5cb220, 0x3682a: 0x6d5cb420, 0x3682b: 0x6d5cb620, + 0x3682c: 0x6d5cb820, 0x3682d: 0x6d5cba20, 0x3682e: 0x6d5cbc20, 0x3682f: 0x6d5cbe20, + 0x36830: 0x6d5cc020, 0x36831: 0x6d5cc220, 0x36832: 0x6d5cc420, 0x36833: 0x6d5cc620, + 0x36834: 0x6d86e020, 0x36835: 0x6d86e220, 0x36836: 0x6d86e420, 0x36837: 0x6d86e620, + 0x36838: 0x6d86e820, 0x36839: 0x6d86ea20, 0x3683a: 0x6d86ec20, 0x3683b: 0x6d86ee20, + 0x3683c: 0x6d86f020, 0x3683d: 0x6d86f220, 0x3683e: 0x6d86f420, 0x3683f: 0x6d86f620, + // Block 0xda1, offset 0x36840 + 0x36840: 0x6d86f820, 0x36841: 0x6d86fa20, 0x36842: 0x6d86fc20, 0x36843: 0x6d86fe20, + 0x36844: 0x6d870020, 0x36845: 0x6d870220, 0x36846: 0x6d870420, 0x36847: 0x6d5cc820, + 0x36848: 0x6d870620, 0x36849: 0x6d870820, 0x3684a: 0x6d870a20, 0x3684b: 0x6d870c20, + 0x3684c: 0x6d870e20, 0x3684d: 0x6d871020, 0x3684e: 0x6d871220, 0x3684f: 0x6d871420, + 0x36850: 0x6d871620, 0x36851: 0x6d871820, 0x36852: 0x6d871a20, 0x36853: 0x6d871c20, + 0x36854: 0x6d871e20, 0x36855: 0x6d872020, 0x36856: 0x6d872220, 0x36857: 0x6d872420, + 0x36858: 0x6d872620, 0x36859: 0x6d872820, 0x3685a: 0x6d872a20, 0x3685b: 0x6d872c20, + 0x3685c: 0x6d872e20, 0x3685d: 0x6d873020, 0x3685e: 0x6d873220, 0x3685f: 0x6d873420, + 0x36860: 0x6d873620, 0x36861: 0x6d873820, 0x36862: 0x6d873a20, 0x36863: 0x6d873c20, + 0x36864: 0x6d873e20, 0x36865: 0x6d874020, 0x36866: 0x6d874220, 0x36867: 0x6d874420, + 0x36868: 0x6d874620, 0x36869: 0x6d874820, 0x3686a: 0x6dab8620, 0x3686b: 0x6dab8820, + 0x3686c: 0x6dab8a20, 0x3686d: 0x6dab8c20, 0x3686e: 0x6dab8e20, 0x3686f: 0x6dab9020, + 0x36870: 0x6dab9220, 0x36871: 0x6dab9420, 0x36872: 0x6dab9620, 0x36873: 0x6dab9820, + 0x36874: 0x6dab9a20, 0x36875: 0x6dab9c20, 0x36876: 0x6dab9e20, 0x36877: 0x6daba020, + 0x36878: 0x6daba220, 0x36879: 0x6daba420, 0x3687a: 0x6daba620, 0x3687b: 0x6daba820, + 0x3687c: 0x6dabaa20, 0x3687d: 0x6dabac20, 0x3687e: 0x6dabae20, 0x3687f: 0x6dabb020, + // Block 0xda2, offset 0x36880 + 0x36880: 0x6dabb220, 0x36881: 0x6dabb420, 0x36882: 0x6dabb620, 0x36883: 0x6dabb820, + 0x36884: 0x6dabba20, 0x36885: 0x6dabbc20, 0x36886: 0x6dabbe20, 0x36887: 0x6dabc020, + 0x36888: 0x6dabc220, 0x36889: 0x6dabc420, 0x3688a: 0x6dabc620, 0x3688b: 0x6dabc820, + 0x3688c: 0x6dabca20, 0x3688d: 0x6dabcc20, 0x3688e: 0x6dabce20, 0x3688f: 0x6dabd020, + 0x36890: 0x6dabd220, 0x36891: 0x6dabd420, 0x36892: 0x6dabd620, 0x36893: 0x6dabd820, + 0x36894: 0x6dabda20, 0x36895: 0x6dabdc20, 0x36896: 0x6d874a20, 0x36897: 0x6dabde20, + 0x36898: 0x6dcbe220, 0x36899: 0x6dcbe420, 0x3689a: 0x6dcbe620, 0x3689b: 0x6dcbe820, + 0x3689c: 0x6dcbea20, 0x3689d: 0x6dcbec20, 0x3689e: 0x6dcbee20, 0x3689f: 0x6dcbf020, + 0x368a0: 0x6dcbf220, 0x368a1: 0x6dcbf420, 0x368a2: 0x6dcbf620, 0x368a3: 0x6dcbf820, + 0x368a4: 0x6dcbfa20, 0x368a5: 0x6dcbfc20, 0x368a6: 0x6dcbfe20, 0x368a7: 0x6dcc0020, + 0x368a8: 0x6dcc0220, 0x368a9: 0x6dcc0420, 0x368aa: 0x6dcc0620, 0x368ab: 0x6dcc0820, + 0x368ac: 0x6dcc0a20, 0x368ad: 0x6dcc0c20, 0x368ae: 0x6dcc0e20, 0x368af: 0x6dcc1020, + 0x368b0: 0x6dcc1220, 0x368b1: 0x6dcc1420, 0x368b2: 0x6dcc1620, 0x368b3: 0x6dcc1820, + 0x368b4: 0x6dcc1a20, 0x368b5: 0x6dcc1c20, 0x368b6: 0x6dcc1e20, 0x368b7: 0x6dcc2020, + 0x368b8: 0x6dcc2220, 0x368b9: 0x6dcc2420, 0x368ba: 0x6dcc2620, 0x368bb: 0x6dcc2820, + 0x368bc: 0x6dcc2a20, 0x368bd: 0x6dcc2c20, 0x368be: 0x6dcc2e20, 0x368bf: 0x6de71c20, + // Block 0xda3, offset 0x368c0 + 0x368c0: 0x6de71e20, 0x368c1: 0x6de72020, 0x368c2: 0x6de72220, 0x368c3: 0x6de72420, + 0x368c4: 0x6de72620, 0x368c5: 0x6de72820, 0x368c6: 0x6de72a20, 0x368c7: 0x6de72c20, + 0x368c8: 0x6de72e20, 0x368c9: 0x6de73020, 0x368ca: 0x6de73220, 0x368cb: 0x6de73420, + 0x368cc: 0x6de73620, 0x368cd: 0x6de73820, 0x368ce: 0x6de73a20, 0x368cf: 0x6de73c20, + 0x368d0: 0x6de73e20, 0x368d1: 0x6de74020, 0x368d2: 0x6de74220, 0x368d3: 0x6de74420, + 0x368d4: 0x6de74620, 0x368d5: 0x6df25c20, 0x368d6: 0x6de74820, 0x368d7: 0x6de74a20, + 0x368d8: 0x6de74c20, 0x368d9: 0x6de74e20, 0x368da: 0x6dfdb820, 0x368db: 0x6dfdba20, + 0x368dc: 0x6dfdbc20, 0x368dd: 0x6dfdbe20, 0x368de: 0x6dfdc020, 0x368df: 0x6dfdc220, + 0x368e0: 0x6dfdc420, 0x368e1: 0x6dfdc620, 0x368e2: 0x6dfdc820, 0x368e3: 0x6dfdca20, + 0x368e4: 0x6dfdcc20, 0x368e5: 0x6dfdce20, 0x368e6: 0x6dfdd020, 0x368e7: 0x6dfdd220, + 0x368e8: 0x6dfdd420, 0x368e9: 0x6dfdd620, 0x368ea: 0x6dfdd820, 0x368eb: 0x6dfdda20, + 0x368ec: 0x6dfddc20, 0x368ed: 0x6e106820, 0x368ee: 0x6e106a20, 0x368ef: 0x6e106c20, + 0x368f0: 0x6e106e20, 0x368f1: 0x6e107020, 0x368f2: 0x6e107220, 0x368f3: 0x6e107420, + 0x368f4: 0x6e107620, 0x368f5: 0x6e107820, 0x368f6: 0x6e107a20, 0x368f7: 0x6e107c20, + 0x368f8: 0x6e107e20, 0x368f9: 0x6e108020, 0x368fa: 0x6e1f1820, 0x368fb: 0x6e1f1a20, + 0x368fc: 0x6e1f1c20, 0x368fd: 0x6e1f1e20, 0x368fe: 0x6e1f2020, 0x368ff: 0x6e1f2220, + // Block 0xda4, offset 0x36900 + 0x36900: 0x6e1f2420, 0x36901: 0x6e1f2620, 0x36902: 0x6e108220, 0x36903: 0x6e1f2820, + 0x36904: 0x6e21a620, 0x36905: 0x6e1f2a20, 0x36906: 0x6e1f2c20, 0x36907: 0x6e1f2e20, + 0x36908: 0x6e2a6e20, 0x36909: 0x6e2a7020, 0x3690a: 0x6e2a7220, 0x3690b: 0x6e2a7420, + 0x3690c: 0x6e2a7620, 0x3690d: 0x6e2a7820, 0x3690e: 0x6e2a7a20, 0x3690f: 0x6e331820, + 0x36910: 0x6e331a20, 0x36911: 0x6e331c20, 0x36912: 0x6e331e20, 0x36913: 0x6e393e20, + 0x36914: 0x6e3d8c20, 0x36915: 0x6e3d8e20, 0x36916: 0x6e3d9020, 0x36917: 0x6e3d9220, + 0x36918: 0x6e3d9420, 0x36919: 0x6e408420, 0x3691a: 0x6e408620, 0x3691b: 0x6e42ce20, + 0x3691c: 0x6e444220, 0x3691d: 0x6c13ec20, 0x3691e: 0x6c3cb420, 0x3691f: 0x6c5a1e20, + 0x36920: 0x6c5a2020, 0x36921: 0x6c7cd820, 0x36922: 0x6c7cda20, 0x36923: 0x6c7cdc20, + 0x36924: 0x6c7cde20, 0x36925: 0x6c7ce020, 0x36926: 0x6c7ce220, 0x36927: 0x6ca59620, + 0x36928: 0x6ca59820, 0x36929: 0x6ca59a20, 0x3692a: 0x6cd3f820, 0x3692b: 0x6cd3fa20, + 0x3692c: 0x6cd3fc20, 0x3692d: 0x6cd3fe20, 0x3692e: 0x6cd40020, 0x3692f: 0x6cd40220, + 0x36930: 0x6cd40420, 0x36931: 0x6cd40620, 0x36932: 0x6d01fe20, 0x36933: 0x6d020020, + 0x36934: 0x6d020220, 0x36935: 0x6d020420, 0x36936: 0x6d2fd020, 0x36937: 0x6d2fd220, + 0x36938: 0x6d2fd420, 0x36939: 0x6d2fd620, 0x3693a: 0x6d2fd820, 0x3693b: 0x6d2fda20, + 0x3693c: 0x6d2fdc20, 0x3693d: 0x6d2fde20, 0x3693e: 0x6d2fe020, 0x3693f: 0x6d2fe220, + // Block 0xda5, offset 0x36940 + 0x36940: 0x6d2fe420, 0x36941: 0x6d2fe620, 0x36942: 0x6d5cd220, 0x36943: 0x6d5cd420, + 0x36944: 0x6d5cd620, 0x36945: 0x6d5cd820, 0x36946: 0x6d5cda20, 0x36947: 0x6d5cdc20, + 0x36948: 0x6d5cde20, 0x36949: 0x6d5ce020, 0x3694a: 0x6d875420, 0x3694b: 0x6d875620, + 0x3694c: 0x6d875820, 0x3694d: 0x6d875a20, 0x3694e: 0x6dcc3020, 0x3694f: 0x6dabf020, + 0x36950: 0x6dabf220, 0x36951: 0x6dabf420, 0x36952: 0x6dabf620, 0x36953: 0x6dcc3220, + 0x36954: 0x6dcc3420, 0x36955: 0x6dcc3620, 0x36956: 0x6de75220, 0x36957: 0x6de75420, + 0x36958: 0x6de75620, 0x36959: 0x6de75820, 0x3695a: 0x6de75a20, 0x3695b: 0x6de75c20, + 0x3695c: 0x6de75e20, 0x3695d: 0x6e108820, 0x3695e: 0x6dfde220, 0x3695f: 0x6dfde420, + 0x36960: 0x6dfde620, 0x36961: 0x6e2a7c20, 0x36962: 0x6e2a7e20, 0x36963: 0x6e2a8020, + 0x36964: 0x6e46ca20, 0x36965: 0x6e46ea20, 0x36966: 0x6c253420, 0x36967: 0x6c253620, + 0x36968: 0x6c3cba20, 0x36969: 0x6c5a2a20, 0x3696a: 0x6c5a2c20, 0x3696b: 0x6c5a2e20, + 0x3696c: 0x6c5a3020, 0x3696d: 0x6c5a3220, 0x3696e: 0x6c5a3420, 0x3696f: 0x6c5a3620, + 0x36970: 0x6c7cea20, 0x36971: 0x6c7cec20, 0x36972: 0x6c7cee20, 0x36973: 0x6c7cf020, + 0x36974: 0x6c7cf220, 0x36975: 0x6c7cf420, 0x36976: 0x6c7cf620, 0x36977: 0x6c7cf820, + 0x36978: 0x6c7cfa20, 0x36979: 0x6ca5a220, 0x3697a: 0x6ca5a420, 0x3697b: 0x6ca5a620, + 0x3697c: 0x6ca5a820, 0x3697d: 0x6ca5aa20, 0x3697e: 0x6ca5ac20, 0x3697f: 0x6ca5ae20, + // Block 0xda6, offset 0x36980 + 0x36980: 0x6ca5b020, 0x36981: 0x6ca5b220, 0x36982: 0x6ca5b420, 0x36983: 0x6ca5b620, + 0x36984: 0x6ca5b820, 0x36985: 0x6ca5ba20, 0x36986: 0x6ca5bc20, 0x36987: 0x6ca5be20, + 0x36988: 0x6ca5c020, 0x36989: 0x6ca5c220, 0x3698a: 0x6ca5c420, 0x3698b: 0x6ca5c620, + 0x3698c: 0x6ca5c820, 0x3698d: 0x6ca5ca20, 0x3698e: 0x6cd41220, 0x3698f: 0x6cd41420, + 0x36990: 0x6cd41620, 0x36991: 0x6cd41820, 0x36992: 0x6cd41a20, 0x36993: 0x6cd41c20, + 0x36994: 0x6cd41e20, 0x36995: 0x6cd42020, 0x36996: 0x6cd42220, 0x36997: 0x6cd42420, + 0x36998: 0x6d020a20, 0x36999: 0x6d020c20, 0x3699a: 0x6d020e20, 0x3699b: 0x6d021020, + 0x3699c: 0x6d021220, 0x3699d: 0x6d021420, 0x3699e: 0x6d021620, 0x3699f: 0x6d021820, + 0x369a0: 0x6d021a20, 0x369a1: 0x6d021c20, 0x369a2: 0x6d021e20, 0x369a3: 0x6d022020, + 0x369a4: 0x6d022220, 0x369a5: 0x6d022420, 0x369a6: 0x6d022620, 0x369a7: 0x6d022820, + 0x369a8: 0x6d022a20, 0x369a9: 0x6d022c20, 0x369aa: 0x6d2fea20, 0x369ab: 0x6d2fec20, + 0x369ac: 0x6d2fee20, 0x369ad: 0x6d2ff020, 0x369ae: 0x6d2ff220, 0x369af: 0x6d2ff420, + 0x369b0: 0x6d2ff620, 0x369b1: 0x6d2ff820, 0x369b2: 0x6d5ce220, 0x369b3: 0x6d5ce420, + 0x369b4: 0x6d5ce620, 0x369b5: 0x6d5ce820, 0x369b6: 0x6d5cea20, 0x369b7: 0x6d5cec20, + 0x369b8: 0x6d5cee20, 0x369b9: 0x6d5cf020, 0x369ba: 0x6d5cf220, 0x369bb: 0x6d875c20, + 0x369bc: 0x6d875e20, 0x369bd: 0x6d876020, 0x369be: 0x6d876220, 0x369bf: 0x6d876420, + // Block 0xda7, offset 0x369c0 + 0x369c0: 0x6dabfc20, 0x369c1: 0x6dabfe20, 0x369c2: 0x6dac0020, 0x369c3: 0x6dac0220, + 0x369c4: 0x6dac0420, 0x369c5: 0x6dac0620, 0x369c6: 0x6dac0820, 0x369c7: 0x6dcc3820, + 0x369c8: 0x6dcc3a20, 0x369c9: 0x6dcc3c20, 0x369ca: 0x6dcc3e20, 0x369cb: 0x6dcc4020, + 0x369cc: 0x6de76220, 0x369cd: 0x6de76420, 0x369ce: 0x6de76620, 0x369cf: 0x6de76820, + 0x369d0: 0x6e2a8220, 0x369d1: 0x6e1f3020, 0x369d2: 0x6e1f3220, 0x369d3: 0x6e2a8420, + 0x369d4: 0x6e2a8620, 0x369d5: 0x6c13f020, 0x369d6: 0x6c13f220, 0x369d7: 0x6c254020, + 0x369d8: 0x6c254220, 0x369d9: 0x6c254420, 0x369da: 0x6c254620, 0x369db: 0x6c254820, + 0x369dc: 0x6c254a20, 0x369dd: 0x6c3cd620, 0x369de: 0x6c3cd820, 0x369df: 0x6c3cda20, + 0x369e0: 0x6c3cdc20, 0x369e1: 0x6c3cde20, 0x369e2: 0x6c3ce020, 0x369e3: 0x6c3ce220, + 0x369e4: 0x6c3ce420, 0x369e5: 0x6c3ce620, 0x369e6: 0x6c3ce820, 0x369e7: 0x6c3cea20, + 0x369e8: 0x6c3cec20, 0x369e9: 0x6c5a7e20, 0x369ea: 0x6c5a8020, 0x369eb: 0x6c5a8220, + 0x369ec: 0x6c5a8420, 0x369ed: 0x6c5a8620, 0x369ee: 0x6c5a8820, 0x369ef: 0x6c5a8a20, + 0x369f0: 0x6c5a8c20, 0x369f1: 0x6c5a8e20, 0x369f2: 0x6c5a9020, 0x369f3: 0x6c5a9220, + 0x369f4: 0x6c5a9420, 0x369f5: 0x6c5a9620, 0x369f6: 0x6c5a9820, 0x369f7: 0x6c5a9a20, + 0x369f8: 0x6c5a9c20, 0x369f9: 0x6c5a9e20, 0x369fa: 0x6c5aa020, 0x369fb: 0x6c5aa220, + 0x369fc: 0x6c5aa420, 0x369fd: 0x6c5aa620, 0x369fe: 0x6c5aa820, 0x369ff: 0x6c5aaa20, + // Block 0xda8, offset 0x36a00 + 0x36a00: 0x6c5aac20, 0x36a01: 0x6c5aae20, 0x36a02: 0x6c5ab020, 0x36a03: 0x6c5ab220, + 0x36a04: 0x6c5ab420, 0x36a05: 0x6c5ab620, 0x36a06: 0x6c7d5a20, 0x36a07: 0x6c7d5c20, + 0x36a08: 0x6c7d5e20, 0x36a09: 0x6c7d6020, 0x36a0a: 0x6c7d6220, 0x36a0b: 0x6c7d6420, + 0x36a0c: 0x6c7d6620, 0x36a0d: 0x6c7d6820, 0x36a0e: 0x6c7d6a20, 0x36a0f: 0x6c7d6c20, + 0x36a10: 0x6c7d6e20, 0x36a11: 0x6c7d7020, 0x36a12: 0x6c7d7220, 0x36a13: 0x6c7d7420, + 0x36a14: 0x6c7d7620, 0x36a15: 0x6c7d7820, 0x36a16: 0x6c7d7a20, 0x36a17: 0x6c7d7c20, + 0x36a18: 0x6c7d7e20, 0x36a19: 0x6c7d8020, 0x36a1a: 0x6c7d8220, 0x36a1b: 0x6c7d8420, + 0x36a1c: 0x6c7d8620, 0x36a1d: 0x6c7d8820, 0x36a1e: 0x6c7d8a20, 0x36a1f: 0x6c7d8c20, + 0x36a20: 0x6c7d8e20, 0x36a21: 0x6c7d9020, 0x36a22: 0x6c7d9220, 0x36a23: 0x6c7d9420, + 0x36a24: 0x6c7d9620, 0x36a25: 0x6c7d9820, 0x36a26: 0x6c7d9a20, 0x36a27: 0x6c7d9c20, + 0x36a28: 0x6c7d9e20, 0x36a29: 0x6c7da020, 0x36a2a: 0x6c7da220, 0x36a2b: 0x6c7da420, + 0x36a2c: 0x6c7da620, 0x36a2d: 0x6c7da820, 0x36a2e: 0x6c7daa20, 0x36a2f: 0x6c7dac20, + 0x36a30: 0x6c7dae20, 0x36a31: 0x6c7db020, 0x36a32: 0x6c7db220, 0x36a33: 0x6ca61220, + 0x36a34: 0x6ca61420, 0x36a35: 0x6ca61620, 0x36a36: 0x6ca61820, 0x36a37: 0x6ca61a20, + 0x36a38: 0x6ca61c20, 0x36a39: 0x6ca61e20, 0x36a3a: 0x6ca62020, 0x36a3b: 0x6ca62220, + 0x36a3c: 0x6ca62420, 0x36a3d: 0x6ca62620, 0x36a3e: 0x6ca62820, 0x36a3f: 0x6ca62a20, + // Block 0xda9, offset 0x36a40 + 0x36a40: 0x6ca62c20, 0x36a41: 0x6ca62e20, 0x36a42: 0x6ca63020, 0x36a43: 0x6ca63220, + 0x36a44: 0x6ca63420, 0x36a45: 0x6ca63620, 0x36a46: 0x6ca63820, 0x36a47: 0x6ca63a20, + 0x36a48: 0x6ca63c20, 0x36a49: 0x6ca63e20, 0x36a4a: 0x6ca64020, 0x36a4b: 0x6ca64220, + 0x36a4c: 0x6ca64420, 0x36a4d: 0x6ca64620, 0x36a4e: 0x6ca64820, 0x36a4f: 0x6ca64a20, + 0x36a50: 0x6ca64c20, 0x36a51: 0x6ca64e20, 0x36a52: 0x6ca65020, 0x36a53: 0x6ca65220, + 0x36a54: 0x6ca65420, 0x36a55: 0x6ca65620, 0x36a56: 0x6ca65820, 0x36a57: 0x6ca65a20, + 0x36a58: 0x6ca65c20, 0x36a59: 0x6ca65e20, 0x36a5a: 0x6ca66020, 0x36a5b: 0x6ca66220, + 0x36a5c: 0x6ca66420, 0x36a5d: 0x6ca66620, 0x36a5e: 0x6ca66820, 0x36a5f: 0x6ca66a20, + 0x36a60: 0x6ca66c20, 0x36a61: 0x6ca66e20, 0x36a62: 0x6ca67020, 0x36a63: 0x6ca67220, + 0x36a64: 0x6ca67420, 0x36a65: 0x6ca67620, 0x36a66: 0x6ca67820, 0x36a67: 0x6ca67a20, + 0x36a68: 0x6ca67c20, 0x36a69: 0x6ca67e20, 0x36a6a: 0x6cd46c20, 0x36a6b: 0x6cd46e20, + 0x36a6c: 0x6cd47020, 0x36a6d: 0x6cd47220, 0x36a6e: 0x6cd47420, 0x36a6f: 0x6cd47620, + 0x36a70: 0x6cd47820, 0x36a71: 0x6cd47a20, 0x36a72: 0x6cd47c20, 0x36a73: 0x6cd47e20, + 0x36a74: 0x6cd48020, 0x36a75: 0x6cd48220, 0x36a76: 0x6cd48420, 0x36a77: 0x6cd48620, + 0x36a78: 0x6cd48820, 0x36a79: 0x6cd48a20, 0x36a7a: 0x6cd48c20, 0x36a7b: 0x6cd48e20, + 0x36a7c: 0x6cd49020, 0x36a7d: 0x6cd49220, 0x36a7e: 0x6cd49420, 0x36a7f: 0x6cd49620, + // Block 0xdaa, offset 0x36a80 + 0x36a80: 0x6cd49820, 0x36a81: 0x6cd49a20, 0x36a82: 0x6cd49c20, 0x36a83: 0x6cd49e20, + 0x36a84: 0x6cd4a020, 0x36a85: 0x6cd4a220, 0x36a86: 0x6cd4a420, 0x36a87: 0x6cd4a620, + 0x36a88: 0x6cd4a820, 0x36a89: 0x6cd4aa20, 0x36a8a: 0x6d029c20, 0x36a8b: 0x6d029e20, + 0x36a8c: 0x6d02a020, 0x36a8d: 0x6d02a220, 0x36a8e: 0x6d02a420, 0x36a8f: 0x6d02a620, + 0x36a90: 0x6d02a820, 0x36a91: 0x6d02aa20, 0x36a92: 0x6d02ac20, 0x36a93: 0x6d02ae20, + 0x36a94: 0x6d02b020, 0x36a95: 0x6d02b220, 0x36a96: 0x6d02b420, 0x36a97: 0x6d02b620, + 0x36a98: 0x6d02b820, 0x36a99: 0x6d02ba20, 0x36a9a: 0x6d02bc20, 0x36a9b: 0x6d02be20, + 0x36a9c: 0x6d02c020, 0x36a9d: 0x6d02c220, 0x36a9e: 0x6d02c420, 0x36a9f: 0x6d02c620, + 0x36aa0: 0x6d02c820, 0x36aa1: 0x6d02ca20, 0x36aa2: 0x6d02cc20, 0x36aa3: 0x6d02ce20, + 0x36aa4: 0x6d02d020, 0x36aa5: 0x6d02d220, 0x36aa6: 0x6d02d420, 0x36aa7: 0x6d02d620, + 0x36aa8: 0x6d02d820, 0x36aa9: 0x6d02da20, 0x36aaa: 0x6d02dc20, 0x36aab: 0x6d02de20, + 0x36aac: 0x6d02e020, 0x36aad: 0x6d02e220, 0x36aae: 0x6d02e420, 0x36aaf: 0x6d02e620, + 0x36ab0: 0x6d02e820, 0x36ab1: 0x6d02ea20, 0x36ab2: 0x6d02ec20, 0x36ab3: 0x6d02ee20, + 0x36ab4: 0x6d02f020, 0x36ab5: 0x6d02f220, 0x36ab6: 0x6d02f420, 0x36ab7: 0x6d02f620, + 0x36ab8: 0x6d02f820, 0x36ab9: 0x6d02fa20, 0x36aba: 0x6d304a20, 0x36abb: 0x6d304c20, + 0x36abc: 0x6d304e20, 0x36abd: 0x6d305020, 0x36abe: 0x6d305220, 0x36abf: 0x6d305420, + // Block 0xdab, offset 0x36ac0 + 0x36ac0: 0x6d305620, 0x36ac1: 0x6d305820, 0x36ac2: 0x6d305a20, 0x36ac3: 0x6d305c20, + 0x36ac4: 0x6d305e20, 0x36ac5: 0x6d306020, 0x36ac6: 0x6d306220, 0x36ac7: 0x6d306420, + 0x36ac8: 0x6d306620, 0x36ac9: 0x6d306820, 0x36aca: 0x6d306a20, 0x36acb: 0x6d306c20, + 0x36acc: 0x6d306e20, 0x36acd: 0x6d307020, 0x36ace: 0x6d307220, 0x36acf: 0x6d307420, + 0x36ad0: 0x6d307620, 0x36ad1: 0x6d307820, 0x36ad2: 0x6d307a20, 0x36ad3: 0x6d307c20, + 0x36ad4: 0x6d307e20, 0x36ad5: 0x6d308020, 0x36ad6: 0x6d308220, 0x36ad7: 0x6d308420, + 0x36ad8: 0x6d308620, 0x36ad9: 0x6d308820, 0x36ada: 0x6d308a20, 0x36adb: 0x6d308c20, + 0x36adc: 0x6d308e20, 0x36add: 0x6d309020, 0x36ade: 0x6d309220, 0x36adf: 0x6d309420, + 0x36ae0: 0x6d309620, 0x36ae1: 0x6d309820, 0x36ae2: 0x6d309a20, 0x36ae3: 0x6d309c20, + 0x36ae4: 0x6d309e20, 0x36ae5: 0x6d30a020, 0x36ae6: 0x6d30a220, 0x36ae7: 0x6d30a420, + 0x36ae8: 0x6d30a620, 0x36ae9: 0x6d30a820, 0x36aea: 0x6d30aa20, 0x36aeb: 0x6d30ac20, + 0x36aec: 0x6d30ae20, 0x36aed: 0x6d5d4420, 0x36aee: 0x6d5d4620, 0x36aef: 0x6d5d4820, + 0x36af0: 0x6d5d4a20, 0x36af1: 0x6d5d4c20, 0x36af2: 0x6d5d4e20, 0x36af3: 0x6d5d5020, + 0x36af4: 0x6d5d5220, 0x36af5: 0x6d5d5420, 0x36af6: 0x6d5d5620, 0x36af7: 0x6d5d5820, + 0x36af8: 0x6d5d5a20, 0x36af9: 0x6d5d5c20, 0x36afa: 0x6d5d5e20, 0x36afb: 0x6d5d6020, + 0x36afc: 0x6d5d6220, 0x36afd: 0x6d5d6420, 0x36afe: 0x6d5d6620, 0x36aff: 0x6d5d6820, + // Block 0xdac, offset 0x36b00 + 0x36b00: 0x6d5d6a20, 0x36b01: 0x6d5d6c20, 0x36b02: 0x6d5d6e20, 0x36b03: 0x6d5d7020, + 0x36b04: 0x6d5d7220, 0x36b05: 0x6d5d7420, 0x36b06: 0x6d5d7620, 0x36b07: 0x6d5d7820, + 0x36b08: 0x6d5d7a20, 0x36b09: 0x6d5d7c20, 0x36b0a: 0x6d5d7e20, 0x36b0b: 0x6d5d8020, + 0x36b0c: 0x6d87a020, 0x36b0d: 0x6d87a220, 0x36b0e: 0x6d87a420, 0x36b0f: 0x6d87a620, + 0x36b10: 0x6d87a820, 0x36b11: 0x6d87aa20, 0x36b12: 0x6d87ac20, 0x36b13: 0x6d87ae20, + 0x36b14: 0x6d87b020, 0x36b15: 0x6d87b220, 0x36b16: 0x6d87b420, 0x36b17: 0x6d87b620, + 0x36b18: 0x6d87b820, 0x36b19: 0x6d87ba20, 0x36b1a: 0x6d87bc20, 0x36b1b: 0x6d87be20, + 0x36b1c: 0x6d87c020, 0x36b1d: 0x6d87c220, 0x36b1e: 0x6d87c420, 0x36b1f: 0x6d87c620, + 0x36b20: 0x6d87c820, 0x36b21: 0x6d87ca20, 0x36b22: 0x6d87cc20, 0x36b23: 0x6d87ce20, + 0x36b24: 0x6d87d020, 0x36b25: 0x6d87d220, 0x36b26: 0x6d87d420, 0x36b27: 0x6d87d620, + 0x36b28: 0x6d87d820, 0x36b29: 0x6d87da20, 0x36b2a: 0x6d87dc20, 0x36b2b: 0x6d87de20, + 0x36b2c: 0x6d87e020, 0x36b2d: 0x6d87e220, 0x36b2e: 0x6d87e420, 0x36b2f: 0x6d87e620, + 0x36b30: 0x6dac4a20, 0x36b31: 0x6dac4c20, 0x36b32: 0x6dac4e20, 0x36b33: 0x6dac5020, + 0x36b34: 0x6dac5220, 0x36b35: 0x6dac5420, 0x36b36: 0x6dac5620, 0x36b37: 0x6dac5820, + 0x36b38: 0x6dac5a20, 0x36b39: 0x6dac5c20, 0x36b3a: 0x6dac5e20, 0x36b3b: 0x6dac6020, + 0x36b3c: 0x6dac6220, 0x36b3d: 0x6dac6420, 0x36b3e: 0x6dac6620, 0x36b3f: 0x6dac6820, + // Block 0xdad, offset 0x36b40 + 0x36b40: 0x6dac6a20, 0x36b41: 0x6dac6c20, 0x36b42: 0x6dac6e20, 0x36b43: 0x6dac7020, + 0x36b44: 0x6dac7220, 0x36b45: 0x6dac7420, 0x36b46: 0x6dac7620, 0x36b47: 0x6dac7820, + 0x36b48: 0x6dac7a20, 0x36b49: 0x6dac7c20, 0x36b4a: 0x6dac7e20, 0x36b4b: 0x6dac8020, + 0x36b4c: 0x6dac8220, 0x36b4d: 0x6dac8420, 0x36b4e: 0x6dac8620, 0x36b4f: 0x6dac8820, + 0x36b50: 0x6dac8a20, 0x36b51: 0x6dac8c20, 0x36b52: 0x6dac8e20, 0x36b53: 0x6dac9020, + 0x36b54: 0x6dac9220, 0x36b55: 0x6dac9420, 0x36b56: 0x6dac9620, 0x36b57: 0x6dcc7420, + 0x36b58: 0x6dcc7620, 0x36b59: 0x6dcc7820, 0x36b5a: 0x6dcc7a20, 0x36b5b: 0x6dcc7c20, + 0x36b5c: 0x6dcc7e20, 0x36b5d: 0x6dcc8020, 0x36b5e: 0x6dcc8220, 0x36b5f: 0x6dcc8420, + 0x36b60: 0x6dcc8620, 0x36b61: 0x6dcc8820, 0x36b62: 0x6dcc8a20, 0x36b63: 0x6dcc8c20, + 0x36b64: 0x6dcc8e20, 0x36b65: 0x6dcc9020, 0x36b66: 0x6dcc9220, 0x36b67: 0x6dcc9420, + 0x36b68: 0x6dcc9620, 0x36b69: 0x6dcc9820, 0x36b6a: 0x6de78220, 0x36b6b: 0x6de78420, + 0x36b6c: 0x6de78620, 0x36b6d: 0x6de78820, 0x36b6e: 0x6de78a20, 0x36b6f: 0x6de78c20, + 0x36b70: 0x6de78e20, 0x36b71: 0x6de79020, 0x36b72: 0x6de79220, 0x36b73: 0x6de79420, + 0x36b74: 0x6de79620, 0x36b75: 0x6de79820, 0x36b76: 0x6de79a20, 0x36b77: 0x6de79c20, + 0x36b78: 0x6de79e20, 0x36b79: 0x6de7a020, 0x36b7a: 0x6de7a220, 0x36b7b: 0x6dfe0a20, + 0x36b7c: 0x6dfe0c20, 0x36b7d: 0x6dfe0e20, 0x36b7e: 0x6dfe1020, 0x36b7f: 0x6dfe1220, + // Block 0xdae, offset 0x36b80 + 0x36b80: 0x6dfe1420, 0x36b81: 0x6dfe1620, 0x36b82: 0x6dfe1820, 0x36b83: 0x6dfe1a20, + 0x36b84: 0x6dfe1c20, 0x36b85: 0x6dfe1e20, 0x36b86: 0x6dfe2020, 0x36b87: 0x6dfe2220, + 0x36b88: 0x6dfe2420, 0x36b89: 0x6dfe2620, 0x36b8a: 0x6dfe2820, 0x36b8b: 0x6dfe2a20, + 0x36b8c: 0x6dfe2c20, 0x36b8d: 0x6dfe2e20, 0x36b8e: 0x6dfe3020, 0x36b8f: 0x6dfe3220, + 0x36b90: 0x6dfe3420, 0x36b91: 0x6dfe3620, 0x36b92: 0x6e10a420, 0x36b93: 0x6e10a620, + 0x36b94: 0x6e10a820, 0x36b95: 0x6e10aa20, 0x36b96: 0x6e10ac20, 0x36b97: 0x6e10ae20, + 0x36b98: 0x6e10b020, 0x36b99: 0x6e10b220, 0x36b9a: 0x6e10b420, 0x36b9b: 0x6e10b620, + 0x36b9c: 0x6e10b820, 0x36b9d: 0x6e1f3a20, 0x36b9e: 0x6e1f3c20, 0x36b9f: 0x6e1f3e20, + 0x36ba0: 0x6e1f4020, 0x36ba1: 0x6e1f4220, 0x36ba2: 0x6e1f4420, 0x36ba3: 0x6e1f4620, + 0x36ba4: 0x6e1f4820, 0x36ba5: 0x6e1f4a20, 0x36ba6: 0x6e1f4c20, 0x36ba7: 0x6e1f4e20, + 0x36ba8: 0x6e1f5020, 0x36ba9: 0x6e1f5220, 0x36baa: 0x6e1f5420, 0x36bab: 0x6e2a8c20, + 0x36bac: 0x6e2a8e20, 0x36bad: 0x6e2a9020, 0x36bae: 0x6e2a9220, 0x36baf: 0x6e2a9420, + 0x36bb0: 0x6e2a9620, 0x36bb1: 0x6e2a9820, 0x36bb2: 0x6e2a9a20, 0x36bb3: 0x6e2a9c20, + 0x36bb4: 0x6e332820, 0x36bb5: 0x6e332a20, 0x36bb6: 0x6e361a20, 0x36bb7: 0x6e332c20, + 0x36bb8: 0x6e332e20, 0x36bb9: 0x6e394420, 0x36bba: 0x6e3d9820, 0x36bbb: 0x6e3d9a20, + 0x36bbc: 0x6e3d9c20, 0x36bbd: 0x6e3d9e20, 0x36bbe: 0x6e408820, 0x36bbf: 0x6e408a20, + // Block 0xdaf, offset 0x36bc0 + 0x36bc0: 0x6e408c20, 0x36bc1: 0x6e42d020, 0x36bc2: 0x6e42d220, 0x36bc3: 0x6e444620, + 0x36bc4: 0x6e46b220, 0x36bc5: 0x6c050020, 0x36bc6: 0x6c0a3620, 0x36bc7: 0x6c13f820, + 0x36bc8: 0x6c13fa20, 0x36bc9: 0x6c13fc20, 0x36bca: 0x6c13fe20, 0x36bcb: 0x6c140020, + 0x36bcc: 0x6c140220, 0x36bcd: 0x6c255020, 0x36bce: 0x6c255220, 0x36bcf: 0x6c255420, + 0x36bd0: 0x6c255620, 0x36bd1: 0x6c255820, 0x36bd2: 0x6c255a20, 0x36bd3: 0x6c255c20, + 0x36bd4: 0x6c255e20, 0x36bd5: 0x6c3cfc20, 0x36bd6: 0x6c3cfe20, 0x36bd7: 0x6c3d0020, + 0x36bd8: 0x6c3d0220, 0x36bd9: 0x6c3d0420, 0x36bda: 0x6c3d0620, 0x36bdb: 0x6c3d0820, + 0x36bdc: 0x6c3d0a20, 0x36bdd: 0x6c3d0c20, 0x36bde: 0x6c3d0e20, 0x36bdf: 0x6c3d1020, + 0x36be0: 0x6c3d1220, 0x36be1: 0x6c3d1420, 0x36be2: 0x6c3d1620, 0x36be3: 0x6c3d1820, + 0x36be4: 0x6c3d1a20, 0x36be5: 0x6c3d1c20, 0x36be6: 0x6c3d1e20, 0x36be7: 0x6c3d2020, + 0x36be8: 0x6c3d2220, 0x36be9: 0x6c3d2420, 0x36bea: 0x6c3d2620, 0x36beb: 0x6c5ade20, + 0x36bec: 0x6c5ae020, 0x36bed: 0x6c5ae220, 0x36bee: 0x6c5ae420, 0x36bef: 0x6c5ae620, + 0x36bf0: 0x6c5ae820, 0x36bf1: 0x6c5aea20, 0x36bf2: 0x6c5aec20, 0x36bf3: 0x6c5aee20, + 0x36bf4: 0x6c5af020, 0x36bf5: 0x6c5af220, 0x36bf6: 0x6c5af420, 0x36bf7: 0x6c5af620, + 0x36bf8: 0x6c5af820, 0x36bf9: 0x6c5afa20, 0x36bfa: 0x6c5afc20, 0x36bfb: 0x6c5afe20, + 0x36bfc: 0x6c5b0020, 0x36bfd: 0x6c5b0220, 0x36bfe: 0x6c5b0420, 0x36bff: 0x6c5b0620, + // Block 0xdb0, offset 0x36c00 + 0x36c00: 0x6c5b0820, 0x36c01: 0x6c5b0a20, 0x36c02: 0x6c5b0c20, 0x36c03: 0x6c5b0e20, + 0x36c04: 0x6c5b1020, 0x36c05: 0x6c5b1220, 0x36c06: 0x6c5b1420, 0x36c07: 0x6c5b1620, + 0x36c08: 0x6c5b1820, 0x36c09: 0x6c5b1a20, 0x36c0a: 0x6c5b1c20, 0x36c0b: 0x6c5b1e20, + 0x36c0c: 0x6c5b2020, 0x36c0d: 0x6c5b2220, 0x36c0e: 0x6c7dea20, 0x36c0f: 0x6c7dec20, + 0x36c10: 0x6c7dee20, 0x36c11: 0x6c7df020, 0x36c12: 0x6c7df220, 0x36c13: 0x6c7df420, + 0x36c14: 0x6c7df620, 0x36c15: 0x6c7df820, 0x36c16: 0x6c7dfa20, 0x36c17: 0x6c7dfc20, + 0x36c18: 0x6c7dfe20, 0x36c19: 0x6c7e0020, 0x36c1a: 0x6c7e0220, 0x36c1b: 0x6c7e0420, + 0x36c1c: 0x6c7e0620, 0x36c1d: 0x6c7e0820, 0x36c1e: 0x6c7e0a20, 0x36c1f: 0x6c7e0c20, + 0x36c20: 0x6c7e0e20, 0x36c21: 0x6c7e1020, 0x36c22: 0x6c7e1220, 0x36c23: 0x6c7e1420, + 0x36c24: 0x6c7e1620, 0x36c25: 0x6c7e1820, 0x36c26: 0x6c7e1a20, 0x36c27: 0x6c7e1c20, + 0x36c28: 0x6c7e1e20, 0x36c29: 0x6c7e2020, 0x36c2a: 0x6c7e2220, 0x36c2b: 0x6ca6ae20, + 0x36c2c: 0x6ca6b020, 0x36c2d: 0x6ca6b220, 0x36c2e: 0x6ca6b420, 0x36c2f: 0x6ca6b620, + 0x36c30: 0x6ca6b820, 0x36c31: 0x6ca6ba20, 0x36c32: 0x6ca6bc20, 0x36c33: 0x6ca6be20, + 0x36c34: 0x6ca6c020, 0x36c35: 0x6ca6c220, 0x36c36: 0x6ca6c420, 0x36c37: 0x6ca6c620, + 0x36c38: 0x6ca6c820, 0x36c39: 0x6ca6ca20, 0x36c3a: 0x6ca6cc20, 0x36c3b: 0x6ca6ce20, + 0x36c3c: 0x6ca6d020, 0x36c3d: 0x6ca6d220, 0x36c3e: 0x6ca6d420, 0x36c3f: 0x6ca6d620, + // Block 0xdb1, offset 0x36c40 + 0x36c40: 0x6ca6d820, 0x36c41: 0x6ca6da20, 0x36c42: 0x6ca6dc20, 0x36c43: 0x6ca6de20, + 0x36c44: 0x6ca6e020, 0x36c45: 0x6ca6e220, 0x36c46: 0x6ca6e420, 0x36c47: 0x6ca6e620, + 0x36c48: 0x6cd4d620, 0x36c49: 0x6cd4d820, 0x36c4a: 0x6cd4da20, 0x36c4b: 0x6cd4dc20, + 0x36c4c: 0x6cd4de20, 0x36c4d: 0x6cd4e020, 0x36c4e: 0x6cd4e220, 0x36c4f: 0x6cd4e420, + 0x36c50: 0x6cd4e620, 0x36c51: 0x6cd4e820, 0x36c52: 0x6cd4ea20, 0x36c53: 0x6cd4ec20, + 0x36c54: 0x6cd4ee20, 0x36c55: 0x6cd4f020, 0x36c56: 0x6cd4f220, 0x36c57: 0x6cd4f420, + 0x36c58: 0x6cd4f620, 0x36c59: 0x6cd4f820, 0x36c5a: 0x6cd4fa20, 0x36c5b: 0x6cd4fc20, + 0x36c5c: 0x6cd4fe20, 0x36c5d: 0x6cd50020, 0x36c5e: 0x6cd50220, 0x36c5f: 0x6cd50420, + 0x36c60: 0x6cd50620, 0x36c61: 0x6cd50820, 0x36c62: 0x6cd50a20, 0x36c63: 0x6cd50c20, + 0x36c64: 0x6cd50e20, 0x36c65: 0x6cd51020, 0x36c66: 0x6d033420, 0x36c67: 0x6d033620, + 0x36c68: 0x6d033820, 0x36c69: 0x6d033a20, 0x36c6a: 0x6d033c20, 0x36c6b: 0x6d033e20, + 0x36c6c: 0x6d034020, 0x36c6d: 0x6d034220, 0x36c6e: 0x6d034420, 0x36c6f: 0x6d034620, + 0x36c70: 0x6d034820, 0x36c71: 0x6d034a20, 0x36c72: 0x6d034c20, 0x36c73: 0x6d034e20, + 0x36c74: 0x6d035020, 0x36c75: 0x6d035220, 0x36c76: 0x6d035420, 0x36c77: 0x6d035620, + 0x36c78: 0x6d035820, 0x36c79: 0x6d035a20, 0x36c7a: 0x6d035c20, 0x36c7b: 0x6d035e20, + 0x36c7c: 0x6d036020, 0x36c7d: 0x6d036220, 0x36c7e: 0x6d036420, 0x36c7f: 0x6d036620, + // Block 0xdb2, offset 0x36c80 + 0x36c80: 0x6d036820, 0x36c81: 0x6d036a20, 0x36c82: 0x6d036c20, 0x36c83: 0x6d036e20, + 0x36c84: 0x6d037020, 0x36c85: 0x6d30e620, 0x36c86: 0x6d30e820, 0x36c87: 0x6d30ea20, + 0x36c88: 0x6d30ec20, 0x36c89: 0x6d30ee20, 0x36c8a: 0x6d30f020, 0x36c8b: 0x6d30f220, + 0x36c8c: 0x6d30f420, 0x36c8d: 0x6d30f620, 0x36c8e: 0x6d30f820, 0x36c8f: 0x6d30fa20, + 0x36c90: 0x6d30fc20, 0x36c91: 0x6d30fe20, 0x36c92: 0x6d310020, 0x36c93: 0x6d310220, + 0x36c94: 0x6d310420, 0x36c95: 0x6d310620, 0x36c96: 0x6d310820, 0x36c97: 0x6d310a20, + 0x36c98: 0x6d5da020, 0x36c99: 0x6d5da220, 0x36c9a: 0x6d5da420, 0x36c9b: 0x6d5da620, + 0x36c9c: 0x6d5da820, 0x36c9d: 0x6d5daa20, 0x36c9e: 0x6d5dac20, 0x36c9f: 0x6d5dae20, + 0x36ca0: 0x6d5db020, 0x36ca1: 0x6d5db220, 0x36ca2: 0x6d5db420, 0x36ca3: 0x6d5db620, + 0x36ca4: 0x6d5db820, 0x36ca5: 0x6d5dba20, 0x36ca6: 0x6d5dbc20, 0x36ca7: 0x6d5dbe20, + 0x36ca8: 0x6d5dc020, 0x36ca9: 0x6d5dc220, 0x36caa: 0x6d5dc420, 0x36cab: 0x6d5dc620, + 0x36cac: 0x6d5dc820, 0x36cad: 0x6d5dca20, 0x36cae: 0x6d880620, 0x36caf: 0x6d880820, + 0x36cb0: 0x6d880a20, 0x36cb1: 0x6d880c20, 0x36cb2: 0x6d880e20, 0x36cb3: 0x6d881020, + 0x36cb4: 0x6d881220, 0x36cb5: 0x6d881420, 0x36cb6: 0x6d881620, 0x36cb7: 0x6d881820, + 0x36cb8: 0x6d881a20, 0x36cb9: 0x6d881c20, 0x36cba: 0x6d881e20, 0x36cbb: 0x6d882020, + 0x36cbc: 0x6d882220, 0x36cbd: 0x6d882420, 0x36cbe: 0x6d882620, 0x36cbf: 0x6d882820, + // Block 0xdb3, offset 0x36cc0 + 0x36cc0: 0x6d882a20, 0x36cc1: 0x6d882c20, 0x36cc2: 0x6d882e20, 0x36cc3: 0x6dacaa20, + 0x36cc4: 0x6dacac20, 0x36cc5: 0x6dacae20, 0x36cc6: 0x6dacb020, 0x36cc7: 0x6dacb220, + 0x36cc8: 0x6dacb420, 0x36cc9: 0x6dacb620, 0x36cca: 0x6dacb820, 0x36ccb: 0x6dacba20, + 0x36ccc: 0x6dacbc20, 0x36ccd: 0x6dacbe20, 0x36cce: 0x6dacc020, 0x36ccf: 0x6dacc220, + 0x36cd0: 0x6dacc420, 0x36cd1: 0x6dacc620, 0x36cd2: 0x6dccac20, 0x36cd3: 0x6dccae20, + 0x36cd4: 0x6dccb020, 0x36cd5: 0x6dccb220, 0x36cd6: 0x6dccb420, 0x36cd7: 0x6dccb620, + 0x36cd8: 0x6dccb820, 0x36cd9: 0x6dccba20, 0x36cda: 0x6de7b020, 0x36cdb: 0x6de7b220, + 0x36cdc: 0x6de7b420, 0x36cdd: 0x6de7b620, 0x36cde: 0x6de7b820, 0x36cdf: 0x6de7ba20, + 0x36ce0: 0x6dfe3c20, 0x36ce1: 0x6dfe3e20, 0x36ce2: 0x6dfe4020, 0x36ce3: 0x6dfe4220, + 0x36ce4: 0x6dfe4420, 0x36ce5: 0x6e10be20, 0x36ce6: 0x6e10c020, 0x36ce7: 0x6e10c220, + 0x36ce8: 0x6e10c420, 0x36ce9: 0x6e10c620, 0x36cea: 0x6e1f5a20, 0x36ceb: 0x6e1f5c20, + 0x36cec: 0x6e1f5e20, 0x36ced: 0x6e1f6020, 0x36cee: 0x6e1f6220, 0x36cef: 0x6e1f6420, + 0x36cf0: 0x6e2aa220, 0x36cf1: 0x6e2aa420, 0x36cf2: 0x6e2aa620, 0x36cf3: 0x6e2aa820, + 0x36cf4: 0x6e333420, 0x36cf5: 0x6e333620, 0x36cf6: 0x6e394620, 0x36cf7: 0x6e394820, + 0x36cf8: 0x6e394a20, 0x36cf9: 0x6e3da020, 0x36cfa: 0x6e3da220, 0x36cfb: 0x6c0a3a20, + 0x36cfc: 0x6c3d2c20, 0x36cfd: 0x6c7e2e20, 0x36cfe: 0x6ca6f620, 0x36cff: 0x6cd52820, + // Block 0xdb4, offset 0x36d00 + 0x36d00: 0x6cb7b420, 0x36d01: 0x6cd52a20, 0x36d02: 0x6cd52c20, 0x36d03: 0x6d037a20, + 0x36d04: 0x6d311820, 0x36d05: 0x6d5dd020, 0x36d06: 0x6d5dd220, 0x36d07: 0x6d5dd420, + 0x36d08: 0x6dacca20, 0x36d09: 0x6daccc20, 0x36d0a: 0x6e10c820, 0x36d0b: 0x6e333a20, + 0x36d0c: 0x6c0a3e20, 0x36d0d: 0x6c140420, 0x36d0e: 0x6c140620, 0x36d0f: 0x6c140820, + 0x36d10: 0x6c257220, 0x36d11: 0x6c257420, 0x36d12: 0x6c257620, 0x36d13: 0x6c257820, + 0x36d14: 0x6c3d4820, 0x36d15: 0x6c3d4a20, 0x36d16: 0x6c3d4c20, 0x36d17: 0x6c3d4e20, + 0x36d18: 0x6c3d5020, 0x36d19: 0x6c3d5220, 0x36d1a: 0x6c3d5420, 0x36d1b: 0x6c3d5620, + 0x36d1c: 0x6c3d5820, 0x36d1d: 0x6c3d5a20, 0x36d1e: 0x6c3d5c20, 0x36d1f: 0x6c3d5e20, + 0x36d20: 0x6c3d6020, 0x36d21: 0x6c3d6220, 0x36d22: 0x6c3d6420, 0x36d23: 0x6c5b5820, + 0x36d24: 0x6c5b5a20, 0x36d25: 0x6c5b5c20, 0x36d26: 0x6c5b5e20, 0x36d27: 0x6c5b6020, + 0x36d28: 0x6c5b6220, 0x36d29: 0x6c5b6420, 0x36d2a: 0x6c5b6620, 0x36d2b: 0x6c5b6820, + 0x36d2c: 0x6c5b6a20, 0x36d2d: 0x6c5b6c20, 0x36d2e: 0x6c5b6e20, 0x36d2f: 0x6c5b7020, + 0x36d30: 0x6c5b7220, 0x36d31: 0x6c5b7420, 0x36d32: 0x6c5b7620, 0x36d33: 0x6c5b7820, + 0x36d34: 0x6c5b7a20, 0x36d35: 0x6c5b7c20, 0x36d36: 0x6c5b7e20, 0x36d37: 0x6c5b8020, + 0x36d38: 0x6c5b8220, 0x36d39: 0x6c5b8420, 0x36d3a: 0x6c5b8620, 0x36d3b: 0x6c5b8820, + 0x36d3c: 0x6c5b8a20, 0x36d3d: 0x6c5b8c20, 0x36d3e: 0x6c7e6a20, 0x36d3f: 0x6c7e6c20, + // Block 0xdb5, offset 0x36d40 + 0x36d40: 0x6c7e6e20, 0x36d41: 0x6c7e7020, 0x36d42: 0x6c7e7220, 0x36d43: 0x6c7e7420, + 0x36d44: 0x6c7e7620, 0x36d45: 0x6c7e7820, 0x36d46: 0x6c7e7a20, 0x36d47: 0x6c7e7c20, + 0x36d48: 0x6c7e7e20, 0x36d49: 0x6c7e8020, 0x36d4a: 0x6c7e8220, 0x36d4b: 0x6c7e8420, + 0x36d4c: 0x6c7e8620, 0x36d4d: 0x6c7e8820, 0x36d4e: 0x6c7e8a20, 0x36d4f: 0x6c7e8c20, + 0x36d50: 0x6c7e8e20, 0x36d51: 0x6c7e9020, 0x36d52: 0x6c7e9220, 0x36d53: 0x6c7e9420, + 0x36d54: 0x6c7e9620, 0x36d55: 0x6c7e9820, 0x36d56: 0x6c7e9a20, 0x36d57: 0x6c7e9c20, + 0x36d58: 0x6ca73820, 0x36d59: 0x6ca73a20, 0x36d5a: 0x6ca73c20, 0x36d5b: 0x6ca73e20, + 0x36d5c: 0x6ca74020, 0x36d5d: 0x6ca74220, 0x36d5e: 0x6ca74420, 0x36d5f: 0x6ca74620, + 0x36d60: 0x6ca74820, 0x36d61: 0x6ca74a20, 0x36d62: 0x6ca74c20, 0x36d63: 0x6ca74e20, + 0x36d64: 0x6ca75020, 0x36d65: 0x6ca75220, 0x36d66: 0x6ca75420, 0x36d67: 0x6ca75620, + 0x36d68: 0x6ca75820, 0x36d69: 0x6ca75a20, 0x36d6a: 0x6ca75c20, 0x36d6b: 0x6ca75e20, + 0x36d6c: 0x6ca76020, 0x36d6d: 0x6ca76220, 0x36d6e: 0x6ca76420, 0x36d6f: 0x6ca76620, + 0x36d70: 0x6ca76820, 0x36d71: 0x6ca76a20, 0x36d72: 0x6cd56020, 0x36d73: 0x6cd56220, + 0x36d74: 0x6cd56420, 0x36d75: 0x6cd56620, 0x36d76: 0x6cd56820, 0x36d77: 0x6cd56a20, + 0x36d78: 0x6cd56c20, 0x36d79: 0x6cd56e20, 0x36d7a: 0x6cd57020, 0x36d7b: 0x6cd57220, + 0x36d7c: 0x6cd57420, 0x36d7d: 0x6cd57620, 0x36d7e: 0x6cd57820, 0x36d7f: 0x6cd57a20, + // Block 0xdb6, offset 0x36d80 + 0x36d80: 0x6cd57c20, 0x36d81: 0x6cd57e20, 0x36d82: 0x6cd58020, 0x36d83: 0x6cd58220, + 0x36d84: 0x6cd58420, 0x36d85: 0x6ca76c20, 0x36d86: 0x6cd58620, 0x36d87: 0x6cd58820, + 0x36d88: 0x6cd58a20, 0x36d89: 0x6cd58c20, 0x36d8a: 0x6cd58e20, 0x36d8b: 0x6cd59020, + 0x36d8c: 0x6cd59220, 0x36d8d: 0x6d03c220, 0x36d8e: 0x6d03c420, 0x36d8f: 0x6d03c620, + 0x36d90: 0x6d03c820, 0x36d91: 0x6d03ca20, 0x36d92: 0x6d03cc20, 0x36d93: 0x6d03ce20, + 0x36d94: 0x6d03d020, 0x36d95: 0x6d03d220, 0x36d96: 0x6d03d420, 0x36d97: 0x6d03d620, + 0x36d98: 0x6d03d820, 0x36d99: 0x6d03da20, 0x36d9a: 0x6d03dc20, 0x36d9b: 0x6d03de20, + 0x36d9c: 0x6d03e020, 0x36d9d: 0x6d03e220, 0x36d9e: 0x6d03e420, 0x36d9f: 0x6d03e620, + 0x36da0: 0x6d03e820, 0x36da1: 0x6d03ea20, 0x36da2: 0x6d03ec20, 0x36da3: 0x6d03ee20, + 0x36da4: 0x6d03f020, 0x36da5: 0x6d03f220, 0x36da6: 0x6d03f420, 0x36da7: 0x6d03f620, + 0x36da8: 0x6d03f820, 0x36da9: 0x6d03fa20, 0x36daa: 0x6d03fc20, 0x36dab: 0x6d03fe20, + 0x36dac: 0x6d040020, 0x36dad: 0x6d040220, 0x36dae: 0x6d040420, 0x36daf: 0x6d040620, + 0x36db0: 0x6d040820, 0x36db1: 0x6d040a20, 0x36db2: 0x6d040c20, 0x36db3: 0x6d040e20, + 0x36db4: 0x6d041020, 0x36db5: 0x6d041220, 0x36db6: 0x6d041420, 0x36db7: 0x6d041620, + 0x36db8: 0x6d041820, 0x36db9: 0x6d041a20, 0x36dba: 0x6d041c20, 0x36dbb: 0x6d041e20, + 0x36dbc: 0x6d042020, 0x36dbd: 0x6d315020, 0x36dbe: 0x6d315220, 0x36dbf: 0x6d315420, + // Block 0xdb7, offset 0x36dc0 + 0x36dc0: 0x6d315620, 0x36dc1: 0x6d315820, 0x36dc2: 0x6d315a20, 0x36dc3: 0x6d315c20, + 0x36dc4: 0x6d315e20, 0x36dc5: 0x6d316020, 0x36dc6: 0x6d316220, 0x36dc7: 0x6d316420, + 0x36dc8: 0x6d316620, 0x36dc9: 0x6d316820, 0x36dca: 0x6d316a20, 0x36dcb: 0x6d316c20, + 0x36dcc: 0x6d316e20, 0x36dcd: 0x6d317020, 0x36dce: 0x6d317220, 0x36dcf: 0x6d317420, + 0x36dd0: 0x6d317620, 0x36dd1: 0x6d317820, 0x36dd2: 0x6d317a20, 0x36dd3: 0x6d317c20, + 0x36dd4: 0x6d317e20, 0x36dd5: 0x6d318020, 0x36dd6: 0x6d318220, 0x36dd7: 0x6d318420, + 0x36dd8: 0x6d318620, 0x36dd9: 0x6d318820, 0x36dda: 0x6d318a20, 0x36ddb: 0x6d318c20, + 0x36ddc: 0x6d318e20, 0x36ddd: 0x6d319020, 0x36dde: 0x6d319220, 0x36ddf: 0x6d319420, + 0x36de0: 0x6d319620, 0x36de1: 0x6d319820, 0x36de2: 0x6d319a20, 0x36de3: 0x6d319c20, + 0x36de4: 0x6d319e20, 0x36de5: 0x6d31a020, 0x36de6: 0x6d31a220, 0x36de7: 0x6d31a420, + 0x36de8: 0x6d31a620, 0x36de9: 0x6d31a820, 0x36dea: 0x6d31aa20, 0x36deb: 0x6d31ac20, + 0x36dec: 0x6d31ae20, 0x36ded: 0x6d31b020, 0x36dee: 0x6d31b220, 0x36def: 0x6d31b420, + 0x36df0: 0x6d31b620, 0x36df1: 0x6d5e0c20, 0x36df2: 0x6d5e0e20, 0x36df3: 0x6d5e1020, + 0x36df4: 0x6d5e1220, 0x36df5: 0x6d5e1420, 0x36df6: 0x6d5e1620, 0x36df7: 0x6d5e1820, + 0x36df8: 0x6d5e1a20, 0x36df9: 0x6d5e1c20, 0x36dfa: 0x6d5e1e20, 0x36dfb: 0x6d5e2020, + 0x36dfc: 0x6d5e2220, 0x36dfd: 0x6d5e2420, 0x36dfe: 0x6d5e2620, 0x36dff: 0x6d5e2820, + // Block 0xdb8, offset 0x36e00 + 0x36e00: 0x6d5e2a20, 0x36e01: 0x6d5e2c20, 0x36e02: 0x6d5e2e20, 0x36e03: 0x6d5e3020, + 0x36e04: 0x6d5e3220, 0x36e05: 0x6d5e3420, 0x36e06: 0x6d5e3620, 0x36e07: 0x6d5e3820, + 0x36e08: 0x6d5e3a20, 0x36e09: 0x6d5e3c20, 0x36e0a: 0x6d5e3e20, 0x36e0b: 0x6d5e4020, + 0x36e0c: 0x6d5e4220, 0x36e0d: 0x6d5e4420, 0x36e0e: 0x6d5e4620, 0x36e0f: 0x6d5e4820, + 0x36e10: 0x6d5e4a20, 0x36e11: 0x6d5e4c20, 0x36e12: 0x6d5e4e20, 0x36e13: 0x6d5e5020, + 0x36e14: 0x6d5e5220, 0x36e15: 0x6d5e5420, 0x36e16: 0x6d5e5620, 0x36e17: 0x6d5e5820, + 0x36e18: 0x6d5e5a20, 0x36e19: 0x6d5e5c20, 0x36e1a: 0x6d5e5e20, 0x36e1b: 0x6d5e6020, + 0x36e1c: 0x6d885c20, 0x36e1d: 0x6d885e20, 0x36e1e: 0x6d886020, 0x36e1f: 0x6d886220, + 0x36e20: 0x6d886420, 0x36e21: 0x6d886620, 0x36e22: 0x6d886820, 0x36e23: 0x6d886a20, + 0x36e24: 0x6d886c20, 0x36e25: 0x6d886e20, 0x36e26: 0x6d887020, 0x36e27: 0x6d887220, + 0x36e28: 0x6d887420, 0x36e29: 0x6d887620, 0x36e2a: 0x6d887820, 0x36e2b: 0x6d887a20, + 0x36e2c: 0x6d887c20, 0x36e2d: 0x6d887e20, 0x36e2e: 0x6d888020, 0x36e2f: 0x6d888220, + 0x36e30: 0x6d888420, 0x36e31: 0x6d888620, 0x36e32: 0x6d888820, 0x36e33: 0x6d888a20, + 0x36e34: 0x6d888c20, 0x36e35: 0x6d888e20, 0x36e36: 0x6d889020, 0x36e37: 0x6d889220, + 0x36e38: 0x6d889420, 0x36e39: 0x6d889620, 0x36e3a: 0x6d889820, 0x36e3b: 0x6d889a20, + 0x36e3c: 0x6d889c20, 0x36e3d: 0x6d889e20, 0x36e3e: 0x6d88a020, 0x36e3f: 0x6d88a220, + // Block 0xdb9, offset 0x36e40 + 0x36e40: 0x6d88a420, 0x36e41: 0x6d88a620, 0x36e42: 0x6d88a820, 0x36e43: 0x6d88aa20, + 0x36e44: 0x6d88ac20, 0x36e45: 0x6d88ae20, 0x36e46: 0x6d88b020, 0x36e47: 0x6d88b220, + 0x36e48: 0x6d88b420, 0x36e49: 0x6d88b620, 0x36e4a: 0x6dacec20, 0x36e4b: 0x6dacee20, + 0x36e4c: 0x6dacf020, 0x36e4d: 0x6dacf220, 0x36e4e: 0x6dacf420, 0x36e4f: 0x6dacf620, + 0x36e50: 0x6dacf820, 0x36e51: 0x6dacfa20, 0x36e52: 0x6dacfc20, 0x36e53: 0x6dacfe20, + 0x36e54: 0x6dad0020, 0x36e55: 0x6dad0220, 0x36e56: 0x6dad0420, 0x36e57: 0x6dad0620, + 0x36e58: 0x6dad0820, 0x36e59: 0x6dad0a20, 0x36e5a: 0x6dad0c20, 0x36e5b: 0x6dad0e20, + 0x36e5c: 0x6dad1020, 0x36e5d: 0x6dad1220, 0x36e5e: 0x6dad1420, 0x36e5f: 0x6dad1620, + 0x36e60: 0x6dad1820, 0x36e61: 0x6dad1a20, 0x36e62: 0x6dad1c20, 0x36e63: 0x6dad1e20, + 0x36e64: 0x6dad2020, 0x36e65: 0x6dad2220, 0x36e66: 0x6dad2420, 0x36e67: 0x6dad2620, + 0x36e68: 0x6dad2820, 0x36e69: 0x6dad2a20, 0x36e6a: 0x6dad2c20, 0x36e6b: 0x6dad2e20, + 0x36e6c: 0x6dad3020, 0x36e6d: 0x6dad3220, 0x36e6e: 0x6dad3420, 0x36e6f: 0x6dad3620, + 0x36e70: 0x6dad3820, 0x36e71: 0x6dad3a20, 0x36e72: 0x6dad3c20, 0x36e73: 0x6dad3e20, + 0x36e74: 0x6dccd820, 0x36e75: 0x6dccda20, 0x36e76: 0x6dccdc20, 0x36e77: 0x6dccde20, + 0x36e78: 0x6dcce020, 0x36e79: 0x6dcce220, 0x36e7a: 0x6dcce420, 0x36e7b: 0x6dcce620, + 0x36e7c: 0x6dcce820, 0x36e7d: 0x6dccea20, 0x36e7e: 0x6dccec20, 0x36e7f: 0x6dccee20, + // Block 0xdba, offset 0x36e80 + 0x36e80: 0x6dccf020, 0x36e81: 0x6dccf220, 0x36e82: 0x6dccf420, 0x36e83: 0x6dccf620, + 0x36e84: 0x6dccf820, 0x36e85: 0x6dccfa20, 0x36e86: 0x6dccfc20, 0x36e87: 0x6dccfe20, + 0x36e88: 0x6dcd0020, 0x36e89: 0x6dcd0220, 0x36e8a: 0x6de7cc20, 0x36e8b: 0x6dcd0420, + 0x36e8c: 0x6dcd0620, 0x36e8d: 0x6dcd0820, 0x36e8e: 0x6dcd0a20, 0x36e8f: 0x6dcd0c20, + 0x36e90: 0x6dcd0e20, 0x36e91: 0x6dcd1020, 0x36e92: 0x6dcd1220, 0x36e93: 0x6dcd1420, + 0x36e94: 0x6dcd1620, 0x36e95: 0x6de7ce20, 0x36e96: 0x6de7d020, 0x36e97: 0x6de7d220, + 0x36e98: 0x6de7d420, 0x36e99: 0x6de7d620, 0x36e9a: 0x6de7d820, 0x36e9b: 0x6de7da20, + 0x36e9c: 0x6de7dc20, 0x36e9d: 0x6de7de20, 0x36e9e: 0x6de7e020, 0x36e9f: 0x6de7e220, + 0x36ea0: 0x6de7e420, 0x36ea1: 0x6de7e620, 0x36ea2: 0x6dfe5220, 0x36ea3: 0x6de7e820, + 0x36ea4: 0x6de7ea20, 0x36ea5: 0x6de7ec20, 0x36ea6: 0x6de7ee20, 0x36ea7: 0x6de7f020, + 0x36ea8: 0x6dfe5420, 0x36ea9: 0x6dfe5620, 0x36eaa: 0x6dfe5820, 0x36eab: 0x6dfe5a20, + 0x36eac: 0x6dfe5c20, 0x36ead: 0x6dfe5e20, 0x36eae: 0x6dfe6020, 0x36eaf: 0x6dfe6220, + 0x36eb0: 0x6dfe6420, 0x36eb1: 0x6dfe6620, 0x36eb2: 0x6dfe6820, 0x36eb3: 0x6dfe6a20, + 0x36eb4: 0x6dfe6c20, 0x36eb5: 0x6dfe6e20, 0x36eb6: 0x6dfe7020, 0x36eb7: 0x6e046620, + 0x36eb8: 0x6dfe7220, 0x36eb9: 0x6dfe7420, 0x36eba: 0x6dfe7620, 0x36ebb: 0x6dfe7820, + 0x36ebc: 0x6dfe7a20, 0x36ebd: 0x6dfe7c20, 0x36ebe: 0x6dfe7e20, 0x36ebf: 0x6dfe8020, + // Block 0xdbb, offset 0x36ec0 + 0x36ec0: 0x6e10d220, 0x36ec1: 0x6e10d420, 0x36ec2: 0x6e10d620, 0x36ec3: 0x6e10d820, + 0x36ec4: 0x6e10da20, 0x36ec5: 0x6e10dc20, 0x36ec6: 0x6e1f6c20, 0x36ec7: 0x6e1f6e20, + 0x36ec8: 0x6e1f7020, 0x36ec9: 0x6e1f7220, 0x36eca: 0x6e2aaa20, 0x36ecb: 0x6e2aac20, + 0x36ecc: 0x6e2aae20, 0x36ecd: 0x6e2ab020, 0x36ece: 0x6e2ab220, 0x36ecf: 0x6e2ab420, + 0x36ed0: 0x6e2ab620, 0x36ed1: 0x6e2ab820, 0x36ed2: 0x6e2aba20, 0x36ed3: 0x6e334020, + 0x36ed4: 0x6e328a20, 0x36ed5: 0x6e334220, 0x36ed6: 0x6e334420, 0x36ed7: 0x6e394e20, + 0x36ed8: 0x6e395020, 0x36ed9: 0x6e395220, 0x36eda: 0x6e395420, 0x36edb: 0x6e3da420, + 0x36edc: 0x6e3da620, 0x36edd: 0x6e3da820, 0x36ede: 0x6e444a20, 0x36edf: 0x6e444c20, + 0x36ee0: 0x6e463420, 0x36ee1: 0x6e46cc20, 0x36ee2: 0x6c0a4220, 0x36ee3: 0x6c258020, + 0x36ee4: 0x6c258220, 0x36ee5: 0x6c258420, 0x36ee6: 0x6c258620, 0x36ee7: 0x6c3d7220, + 0x36ee8: 0x6c3d7420, 0x36ee9: 0x6c3d7620, 0x36eea: 0x6c3d7820, 0x36eeb: 0x6c3d7a20, + 0x36eec: 0x6c3d7c20, 0x36eed: 0x6c3d7e20, 0x36eee: 0x6c3d8020, 0x36eef: 0x6c3d8220, + 0x36ef0: 0x6c3d8420, 0x36ef1: 0x6c3d8620, 0x36ef2: 0x6c3d8820, 0x36ef3: 0x6c3d8a20, + 0x36ef4: 0x6c5baa20, 0x36ef5: 0x6c5bac20, 0x36ef6: 0x6c5bae20, 0x36ef7: 0x6c5bb020, + 0x36ef8: 0x6c5bb220, 0x36ef9: 0x6c5bb420, 0x36efa: 0x6c5bb620, 0x36efb: 0x6c5bb820, + 0x36efc: 0x6c5bba20, 0x36efd: 0x6c5bbc20, 0x36efe: 0x6c5bbe20, 0x36eff: 0x6c5bc020, + // Block 0xdbc, offset 0x36f00 + 0x36f00: 0x6c5bc220, 0x36f01: 0x6c5bc420, 0x36f02: 0x6c5bc620, 0x36f03: 0x6c5bc820, + 0x36f04: 0x6c5bca20, 0x36f05: 0x6c5bcc20, 0x36f06: 0x6c5bce20, 0x36f07: 0x6c7ec220, + 0x36f08: 0x6c7ec420, 0x36f09: 0x6c7ec620, 0x36f0a: 0x6c7ec820, 0x36f0b: 0x6c7eca20, + 0x36f0c: 0x6c7ecc20, 0x36f0d: 0x6c7ece20, 0x36f0e: 0x6c7ed020, 0x36f0f: 0x6c7ed220, + 0x36f10: 0x6c7ed420, 0x36f11: 0x6c7ed620, 0x36f12: 0x6c7ed820, 0x36f13: 0x6c7eda20, + 0x36f14: 0x6c7edc20, 0x36f15: 0x6c7ede20, 0x36f16: 0x6c7ee020, 0x36f17: 0x6c7ee220, + 0x36f18: 0x6c7ee420, 0x36f19: 0x6c7ee620, 0x36f1a: 0x6c7ee820, 0x36f1b: 0x6c7eea20, + 0x36f1c: 0x6c7eec20, 0x36f1d: 0x6c7eee20, 0x36f1e: 0x6c7ef020, 0x36f1f: 0x6c7ef220, + 0x36f20: 0x6ca79420, 0x36f21: 0x6ca79620, 0x36f22: 0x6ca79820, 0x36f23: 0x6ca79a20, + 0x36f24: 0x6ca79c20, 0x36f25: 0x6ca79e20, 0x36f26: 0x6ca7a020, 0x36f27: 0x6ca7a220, + 0x36f28: 0x6ca7a420, 0x36f29: 0x6ca7a620, 0x36f2a: 0x6ca7a820, 0x36f2b: 0x6ca7aa20, + 0x36f2c: 0x6ca7ac20, 0x36f2d: 0x6ca7ae20, 0x36f2e: 0x6ca7b020, 0x36f2f: 0x6ca7b220, + 0x36f30: 0x6ca7b420, 0x36f31: 0x6ca7b620, 0x36f32: 0x6ca7b820, 0x36f33: 0x6ca7ba20, + 0x36f34: 0x6ca7bc20, 0x36f35: 0x6ca7be20, 0x36f36: 0x6cd5ba20, 0x36f37: 0x6cd5bc20, + 0x36f38: 0x6cd5be20, 0x36f39: 0x6cd5c020, 0x36f3a: 0x6cd5c220, 0x36f3b: 0x6cd5c420, + 0x36f3c: 0x6cd5c620, 0x36f3d: 0x6cd5c820, 0x36f3e: 0x6cd5ca20, 0x36f3f: 0x6cd5cc20, + // Block 0xdbd, offset 0x36f40 + 0x36f40: 0x6cd5ce20, 0x36f41: 0x6cd5d020, 0x36f42: 0x6cd5d220, 0x36f43: 0x6cd5d420, + 0x36f44: 0x6cd5d620, 0x36f45: 0x6cd5d820, 0x36f46: 0x6cd5da20, 0x36f47: 0x6cd5dc20, + 0x36f48: 0x6cd5de20, 0x36f49: 0x6cd5e020, 0x36f4a: 0x6cd5e220, 0x36f4b: 0x6cd5e420, + 0x36f4c: 0x6cd5e620, 0x36f4d: 0x6cd5e820, 0x36f4e: 0x6cd5ea20, 0x36f4f: 0x6cd5ec20, + 0x36f50: 0x6cd5ee20, 0x36f51: 0x6cd5f020, 0x36f52: 0x6cd5f220, 0x36f53: 0x6cd5f420, + 0x36f54: 0x6cd5f620, 0x36f55: 0x6cd5f820, 0x36f56: 0x6cd5fa20, 0x36f57: 0x6cd5fc20, + 0x36f58: 0x6cd5fe20, 0x36f59: 0x6cd60020, 0x36f5a: 0x6cd60220, 0x36f5b: 0x6d044620, + 0x36f5c: 0x6d044820, 0x36f5d: 0x6d044a20, 0x36f5e: 0x6d044c20, 0x36f5f: 0x6d044e20, + 0x36f60: 0x6d045020, 0x36f61: 0x6d045220, 0x36f62: 0x6d045420, 0x36f63: 0x6d045620, + 0x36f64: 0x6d045820, 0x36f65: 0x6d045a20, 0x36f66: 0x6d045c20, 0x36f67: 0x6d045e20, + 0x36f68: 0x6d046020, 0x36f69: 0x6d046220, 0x36f6a: 0x6d046420, 0x36f6b: 0x6d046620, + 0x36f6c: 0x6d046820, 0x36f6d: 0x6d046a20, 0x36f6e: 0x6d046c20, 0x36f6f: 0x6d046e20, + 0x36f70: 0x6d047020, 0x36f71: 0x6d047220, 0x36f72: 0x6d047420, 0x36f73: 0x6d047620, + 0x36f74: 0x6d047820, 0x36f75: 0x6d047a20, 0x36f76: 0x6d047c20, 0x36f77: 0x6d047e20, + 0x36f78: 0x6d31d420, 0x36f79: 0x6d31d620, 0x36f7a: 0x6d31d820, 0x36f7b: 0x6d31da20, + 0x36f7c: 0x6d31dc20, 0x36f7d: 0x6d31de20, 0x36f7e: 0x6d31e020, 0x36f7f: 0x6d31e220, + // Block 0xdbe, offset 0x36f80 + 0x36f80: 0x6d31e420, 0x36f81: 0x6d31e620, 0x36f82: 0x6d31e820, 0x36f83: 0x6d31ea20, + 0x36f84: 0x6d31ec20, 0x36f85: 0x6d31ee20, 0x36f86: 0x6d31f020, 0x36f87: 0x6d31f220, + 0x36f88: 0x6d31f420, 0x36f89: 0x6d31f620, 0x36f8a: 0x6d31f820, 0x36f8b: 0x6d31fa20, + 0x36f8c: 0x6d31fc20, 0x36f8d: 0x6d31fe20, 0x36f8e: 0x6d320020, 0x36f8f: 0x6d320220, + 0x36f90: 0x6d5e7e20, 0x36f91: 0x6d5e8020, 0x36f92: 0x6d5e8220, 0x36f93: 0x6d5e8420, + 0x36f94: 0x6d5e8620, 0x36f95: 0x6d5e8820, 0x36f96: 0x6d5e8a20, 0x36f97: 0x6d5e8c20, + 0x36f98: 0x6d5e8e20, 0x36f99: 0x6d5e9020, 0x36f9a: 0x6d5e9220, 0x36f9b: 0x6d5e9420, + 0x36f9c: 0x6d5e9620, 0x36f9d: 0x6d5e9820, 0x36f9e: 0x6d5e9a20, 0x36f9f: 0x6d5e9c20, + 0x36fa0: 0x6d5e9e20, 0x36fa1: 0x6d5ea020, 0x36fa2: 0x6d627c20, 0x36fa3: 0x6d5ea220, + 0x36fa4: 0x6d5ea420, 0x36fa5: 0x6d5ea620, 0x36fa6: 0x6d5ea820, 0x36fa7: 0x6d5eaa20, + 0x36fa8: 0x6d5eac20, 0x36fa9: 0x6d5eae20, 0x36faa: 0x6d5eb020, 0x36fab: 0x6d5eb220, + 0x36fac: 0x6d88da20, 0x36fad: 0x6d88dc20, 0x36fae: 0x6d88de20, 0x36faf: 0x6d88e020, + 0x36fb0: 0x6d88e220, 0x36fb1: 0x6d88e420, 0x36fb2: 0x6d88e620, 0x36fb3: 0x6d88e820, + 0x36fb4: 0x6d88ea20, 0x36fb5: 0x6d88ec20, 0x36fb6: 0x6d88ee20, 0x36fb7: 0x6d88f020, + 0x36fb8: 0x6d88f220, 0x36fb9: 0x6d88f420, 0x36fba: 0x6d88f620, 0x36fbb: 0x6d88f820, + 0x36fbc: 0x6dad5a20, 0x36fbd: 0x6d88fa20, 0x36fbe: 0x6d88fc20, 0x36fbf: 0x6d88fe20, + // Block 0xdbf, offset 0x36fc0 + 0x36fc0: 0x6d890020, 0x36fc1: 0x6d890220, 0x36fc2: 0x6d890420, 0x36fc3: 0x6d890620, + 0x36fc4: 0x6d890820, 0x36fc5: 0x6d890a20, 0x36fc6: 0x6d890c20, 0x36fc7: 0x6d890e20, + 0x36fc8: 0x6d891020, 0x36fc9: 0x6d891220, 0x36fca: 0x6d891420, 0x36fcb: 0x6d891620, + 0x36fcc: 0x6dad5c20, 0x36fcd: 0x6dad5e20, 0x36fce: 0x6dad6020, 0x36fcf: 0x6dad6220, + 0x36fd0: 0x6dad6420, 0x36fd1: 0x6dad6620, 0x36fd2: 0x6dad6820, 0x36fd3: 0x6dad6a20, + 0x36fd4: 0x6dad6c20, 0x36fd5: 0x6dad6e20, 0x36fd6: 0x6dad7020, 0x36fd7: 0x6dad7220, + 0x36fd8: 0x6dad7420, 0x36fd9: 0x6dad7620, 0x36fda: 0x6dad7820, 0x36fdb: 0x6dad7a20, + 0x36fdc: 0x6dad7c20, 0x36fdd: 0x6dad7e20, 0x36fde: 0x6dad8020, 0x36fdf: 0x6dad8220, + 0x36fe0: 0x6dcd2420, 0x36fe1: 0x6dcd2620, 0x36fe2: 0x6dcd2820, 0x36fe3: 0x6dcd2a20, + 0x36fe4: 0x6dcd2c20, 0x36fe5: 0x6dcd2e20, 0x36fe6: 0x6dcd3020, 0x36fe7: 0x6dcd3220, + 0x36fe8: 0x6dcd3420, 0x36fe9: 0x6dad8420, 0x36fea: 0x6de7f820, 0x36feb: 0x6de7fa20, + 0x36fec: 0x6de7fc20, 0x36fed: 0x6de7fe20, 0x36fee: 0x6de80020, 0x36fef: 0x6de80220, + 0x36ff0: 0x6dfe8820, 0x36ff1: 0x6dfe8a20, 0x36ff2: 0x6de80420, 0x36ff3: 0x6dfe8c20, + 0x36ff4: 0x6dfe8e20, 0x36ff5: 0x6e10e420, 0x36ff6: 0x6dfe9020, 0x36ff7: 0x6dfe9220, + 0x36ff8: 0x6dfe9420, 0x36ff9: 0x6dfe9620, 0x36ffa: 0x6dfe9820, 0x36ffb: 0x6e10e620, + 0x36ffc: 0x6e10e820, 0x36ffd: 0x6e10ea20, 0x36ffe: 0x6e10ec20, 0x36fff: 0x6e10ee20, + // Block 0xdc0, offset 0x37000 + 0x37000: 0x6e10f020, 0x37001: 0x6e10f220, 0x37002: 0x6e10f420, 0x37003: 0x6e10f620, + 0x37004: 0x6e10f820, 0x37005: 0x6e10fa20, 0x37006: 0x6e10fc20, 0x37007: 0x6e10fe20, + 0x37008: 0x6e110020, 0x37009: 0x6e1f7a20, 0x3700a: 0x6e2abc20, 0x3700b: 0x6e2abe20, + 0x3700c: 0x6e334620, 0x3700d: 0x6e334820, 0x3700e: 0x6e395620, 0x3700f: 0x6e334a20, + 0x37010: 0x6e334c20, 0x37011: 0x6e334e20, 0x37012: 0x6e395820, 0x37013: 0x6e3daa20, + 0x37014: 0x6e444e20, 0x37015: 0x6c258e20, 0x37016: 0x6c259020, 0x37017: 0x6c3d9420, + 0x37018: 0x6c3d9620, 0x37019: 0x6c5be620, 0x3701a: 0x6c5be820, 0x3701b: 0x6c5bea20, + 0x3701c: 0x6c5bec20, 0x3701d: 0x6c5bee20, 0x3701e: 0x6c5bf020, 0x3701f: 0x6c5bf220, + 0x37020: 0x6c7f0c20, 0x37021: 0x6c7f0e20, 0x37022: 0x6c7f1020, 0x37023: 0x6c7f1220, + 0x37024: 0x6c7f1420, 0x37025: 0x6c7f1620, 0x37026: 0x6c7f1820, 0x37027: 0x6c7f1a20, + 0x37028: 0x6c7f1c20, 0x37029: 0x6c7f1e20, 0x3702a: 0x6c7f2020, 0x3702b: 0x6c7f2220, + 0x3702c: 0x6c7f2420, 0x3702d: 0x6c7f2620, 0x3702e: 0x6c7f2820, 0x3702f: 0x6c7f2a20, + 0x37030: 0x6c7f2c20, 0x37031: 0x6ca7ca20, 0x37032: 0x6ca7cc20, 0x37033: 0x6ca7ce20, + 0x37034: 0x6ca7d020, 0x37035: 0x6ca7d220, 0x37036: 0x6ca7d420, 0x37037: 0x6ca7d620, + 0x37038: 0x6ca7d820, 0x37039: 0x6ca7da20, 0x3703a: 0x6ca7dc20, 0x3703b: 0x6ca7de20, + 0x3703c: 0x6ca7e020, 0x3703d: 0x6ca7e220, 0x3703e: 0x6cd61a20, 0x3703f: 0x6cd61c20, + // Block 0xdc1, offset 0x37040 + 0x37040: 0x6cd61e20, 0x37041: 0x6cd62020, 0x37042: 0x6cd62220, 0x37043: 0x6cd62420, + 0x37044: 0x6cd62620, 0x37045: 0x6cd62820, 0x37046: 0x6cd62a20, 0x37047: 0x6cd62c20, + 0x37048: 0x6cd62e20, 0x37049: 0x6cd63020, 0x3704a: 0x6d049620, 0x3704b: 0x6d049820, + 0x3704c: 0x6d049a20, 0x3704d: 0x6d049c20, 0x3704e: 0x6d049e20, 0x3704f: 0x6d04a020, + 0x37050: 0x6d04a220, 0x37051: 0x6d04a420, 0x37052: 0x6d04a620, 0x37053: 0x6d04a820, + 0x37054: 0x6d04aa20, 0x37055: 0x6d04ac20, 0x37056: 0x6d04ae20, 0x37057: 0x6d04b020, + 0x37058: 0x6d321020, 0x37059: 0x6d321220, 0x3705a: 0x6d321420, 0x3705b: 0x6d321620, + 0x3705c: 0x6d321820, 0x3705d: 0x6d321a20, 0x3705e: 0x6d321c20, 0x3705f: 0x6d321e20, + 0x37060: 0x6d322020, 0x37061: 0x6d322220, 0x37062: 0x6d322420, 0x37063: 0x6d322620, + 0x37064: 0x6d322820, 0x37065: 0x6d5eb620, 0x37066: 0x6d5eb820, 0x37067: 0x6d5eba20, + 0x37068: 0x6d5ebc20, 0x37069: 0x6d5ebe20, 0x3706a: 0x6d5ec020, 0x3706b: 0x6d5ec220, + 0x3706c: 0x6d5ec420, 0x3706d: 0x6d892420, 0x3706e: 0x6d892620, 0x3706f: 0x6dad9020, + 0x37070: 0x6d892820, 0x37071: 0x6d892a20, 0x37072: 0x6dad9220, 0x37073: 0x6dad9420, + 0x37074: 0x6dad9620, 0x37075: 0x6dad9820, 0x37076: 0x6dad9a20, 0x37077: 0x6dad9c20, + 0x37078: 0x6dad9e20, 0x37079: 0x6dada020, 0x3707a: 0x6de80820, 0x3707b: 0x6dada220, + 0x3707c: 0x6dcd3c20, 0x3707d: 0x6dcd3e20, 0x3707e: 0x6dcd4020, 0x3707f: 0x6dcd4220, + // Block 0xdc2, offset 0x37080 + 0x37080: 0x6dcd4420, 0x37081: 0x6dcd4620, 0x37082: 0x6dc73620, 0x37083: 0x6dcd4820, + 0x37084: 0x6dcd4a20, 0x37085: 0x6de80a20, 0x37086: 0x6de80c20, 0x37087: 0x6de80e20, + 0x37088: 0x6dfe9e20, 0x37089: 0x6dfea020, 0x3708a: 0x6dfea220, 0x3708b: 0x6dfea420, + 0x3708c: 0x6dfea620, 0x3708d: 0x6dfea820, 0x3708e: 0x6e110220, 0x3708f: 0x6e110420, + 0x37090: 0x6e1f8020, 0x37091: 0x6e1f8220, 0x37092: 0x6e395a20, 0x37093: 0x6e2ac220, + 0x37094: 0x6e335020, 0x37095: 0x6e395c20, 0x37096: 0x6e395e20, 0x37097: 0x6c141220, + 0x37098: 0x6c259420, 0x37099: 0x6c3d9e20, 0x3709a: 0x6c3da020, 0x3709b: 0x6c3da220, + 0x3709c: 0x6c3da420, 0x3709d: 0x6c5c0820, 0x3709e: 0x6c5c0a20, 0x3709f: 0x6c5c0c20, + 0x370a0: 0x6c5c0e20, 0x370a1: 0x6c5c1020, 0x370a2: 0x6c5c1220, 0x370a3: 0x6c5c1420, + 0x370a4: 0x6c5c1620, 0x370a5: 0x6c5c1820, 0x370a6: 0x6c5c1a20, 0x370a7: 0x6c5c1c20, + 0x370a8: 0x6c5c1e20, 0x370a9: 0x6c5c2020, 0x370aa: 0x6c5c2220, 0x370ab: 0x6c5c2420, + 0x370ac: 0x6c5c2620, 0x370ad: 0x6c5c2820, 0x370ae: 0x6c5c2a20, 0x370af: 0x6c7f6220, + 0x370b0: 0x6c7f6420, 0x370b1: 0x6c7f6620, 0x370b2: 0x6c7f6820, 0x370b3: 0x6c7f6a20, + 0x370b4: 0x6c7f6c20, 0x370b5: 0x6c7f6e20, 0x370b6: 0x6c7f7020, 0x370b7: 0x6c7f7220, + 0x370b8: 0x6c7f7420, 0x370b9: 0x6c7f7620, 0x370ba: 0x6c7f7820, 0x370bb: 0x6c7f7a20, + 0x370bc: 0x6c7f7c20, 0x370bd: 0x6c7f7e20, 0x370be: 0x6c7f8020, 0x370bf: 0x6c7f8220, + // Block 0xdc3, offset 0x370c0 + 0x370c0: 0x6c7f8420, 0x370c1: 0x6c7f8620, 0x370c2: 0x6c7f8820, 0x370c3: 0x6c7f8a20, + 0x370c4: 0x6c7f8c20, 0x370c5: 0x6c7f8e20, 0x370c6: 0x6c7f9020, 0x370c7: 0x6c7f9220, + 0x370c8: 0x6c7f9420, 0x370c9: 0x6c7f9620, 0x370ca: 0x6c7f9820, 0x370cb: 0x6c7f9a20, + 0x370cc: 0x6ca84c20, 0x370cd: 0x6ca84e20, 0x370ce: 0x6ca85020, 0x370cf: 0x6ca85220, + 0x370d0: 0x6ca85420, 0x370d1: 0x6ca85620, 0x370d2: 0x6ca85820, 0x370d3: 0x6ca85a20, + 0x370d4: 0x6ca85c20, 0x370d5: 0x6ca85e20, 0x370d6: 0x6ca86020, 0x370d7: 0x6ca86220, + 0x370d8: 0x6ca86420, 0x370d9: 0x6ca86620, 0x370da: 0x6ca86820, 0x370db: 0x6ca86a20, + 0x370dc: 0x6ca86c20, 0x370dd: 0x6ca86e20, 0x370de: 0x6ca87020, 0x370df: 0x6ca87220, + 0x370e0: 0x6ca87420, 0x370e1: 0x6ca87620, 0x370e2: 0x6ca87820, 0x370e3: 0x6ca87a20, + 0x370e4: 0x6ca87c20, 0x370e5: 0x6ca87e20, 0x370e6: 0x6ca88020, 0x370e7: 0x6ca88220, + 0x370e8: 0x6ca88420, 0x370e9: 0x6ca88620, 0x370ea: 0x6cd69020, 0x370eb: 0x6cd69220, + 0x370ec: 0x6cd69420, 0x370ed: 0x6cd69620, 0x370ee: 0x6cd69820, 0x370ef: 0x6cd69a20, + 0x370f0: 0x6cd69c20, 0x370f1: 0x6cd69e20, 0x370f2: 0x6cd6a020, 0x370f3: 0x6cd6a220, + 0x370f4: 0x6cd6a420, 0x370f5: 0x6cd6a620, 0x370f6: 0x6cd6a820, 0x370f7: 0x6cd6aa20, + 0x370f8: 0x6cd6ac20, 0x370f9: 0x6cd6ae20, 0x370fa: 0x6cd6b020, 0x370fb: 0x6cd6b220, + 0x370fc: 0x6cd6b420, 0x370fd: 0x6cd6b620, 0x370fe: 0x6cd6b820, 0x370ff: 0x6ca88820, + // Block 0xdc4, offset 0x37100 + 0x37100: 0x6cd6ba20, 0x37101: 0x6cd6bc20, 0x37102: 0x6cd6be20, 0x37103: 0x6cd6c020, + 0x37104: 0x6cd6c220, 0x37105: 0x6cd6c420, 0x37106: 0x6cd6c620, 0x37107: 0x6cd6c820, + 0x37108: 0x6cd6ca20, 0x37109: 0x6cd6cc20, 0x3710a: 0x6cd6ce20, 0x3710b: 0x6cd6d020, + 0x3710c: 0x6cd6d220, 0x3710d: 0x6cd6d420, 0x3710e: 0x6cd6d620, 0x3710f: 0x6cd6d820, + 0x37110: 0x6d051220, 0x37111: 0x6d051420, 0x37112: 0x6d051620, 0x37113: 0x6d051820, + 0x37114: 0x6d051a20, 0x37115: 0x6d051c20, 0x37116: 0x6d051e20, 0x37117: 0x6d052020, + 0x37118: 0x6d052220, 0x37119: 0x6d052420, 0x3711a: 0x6d052620, 0x3711b: 0x6d052820, + 0x3711c: 0x6d052a20, 0x3711d: 0x6d052c20, 0x3711e: 0x6d052e20, 0x3711f: 0x6d053020, + 0x37120: 0x6d053220, 0x37121: 0x6d053420, 0x37122: 0x6d053620, 0x37123: 0x6d053820, + 0x37124: 0x6d053a20, 0x37125: 0x6d053c20, 0x37126: 0x6d053e20, 0x37127: 0x6d054020, + 0x37128: 0x6d054220, 0x37129: 0x6d054420, 0x3712a: 0x6d054620, 0x3712b: 0x6d054820, + 0x3712c: 0x6d054a20, 0x3712d: 0x6d054c20, 0x3712e: 0x6d054e20, 0x3712f: 0x6d055020, + 0x37130: 0x6d055220, 0x37131: 0x6d055420, 0x37132: 0x6d055620, 0x37133: 0x6d055820, + 0x37134: 0x6d055a20, 0x37135: 0x6d055c20, 0x37136: 0x6d055e20, 0x37137: 0x6d056020, + 0x37138: 0x6d056220, 0x37139: 0x6d056420, 0x3713a: 0x6d056620, 0x3713b: 0x6d056820, + 0x3713c: 0x6d056a20, 0x3713d: 0x6d056c20, 0x3713e: 0x6d056e20, 0x3713f: 0x6d057020, + // Block 0xdc5, offset 0x37140 + 0x37140: 0x6d057220, 0x37141: 0x6d057420, 0x37142: 0x6d057620, 0x37143: 0x6d057820, + 0x37144: 0x6d057a20, 0x37145: 0x6d057c20, 0x37146: 0x6d057e20, 0x37147: 0x6d058020, + 0x37148: 0x6d058220, 0x37149: 0x6d058420, 0x3714a: 0x6d058620, 0x3714b: 0x6d058820, + 0x3714c: 0x6d058a20, 0x3714d: 0x6d32a220, 0x3714e: 0x6d32a420, 0x3714f: 0x6d32a620, + 0x37150: 0x6d32a820, 0x37151: 0x6d32aa20, 0x37152: 0x6d32ac20, 0x37153: 0x6d32ae20, + 0x37154: 0x6d32b020, 0x37155: 0x6d32b220, 0x37156: 0x6d32b420, 0x37157: 0x6d32b620, + 0x37158: 0x6d32b820, 0x37159: 0x6d32ba20, 0x3715a: 0x6d32bc20, 0x3715b: 0x6d32be20, + 0x3715c: 0x6d32c020, 0x3715d: 0x6d32c220, 0x3715e: 0x6d32c420, 0x3715f: 0x6d32c620, + 0x37160: 0x6d32c820, 0x37161: 0x6d32ca20, 0x37162: 0x6d32cc20, 0x37163: 0x6d32ce20, + 0x37164: 0x6d32d020, 0x37165: 0x6d32d220, 0x37166: 0x6d32d420, 0x37167: 0x6d32d620, + 0x37168: 0x6d32d820, 0x37169: 0x6d32da20, 0x3716a: 0x6d32dc20, 0x3716b: 0x6d32de20, + 0x3716c: 0x6d32e020, 0x3716d: 0x6d32e220, 0x3716e: 0x6d32e420, 0x3716f: 0x6d32e620, + 0x37170: 0x6d32e820, 0x37171: 0x6d32ea20, 0x37172: 0x6d32ec20, 0x37173: 0x6d32ee20, + 0x37174: 0x6d32f020, 0x37175: 0x6d32f220, 0x37176: 0x6d32f420, 0x37177: 0x6d32f620, + 0x37178: 0x6d32f820, 0x37179: 0x6d32fa20, 0x3717a: 0x6d32fc20, 0x3717b: 0x6d32fe20, + 0x3717c: 0x6d330020, 0x3717d: 0x6d330220, 0x3717e: 0x6d330420, 0x3717f: 0x6d330620, + // Block 0xdc6, offset 0x37180 + 0x37180: 0x6d330820, 0x37181: 0x6d330a20, 0x37182: 0x6d330c20, 0x37183: 0x6d330e20, + 0x37184: 0x6d331020, 0x37185: 0x6d331220, 0x37186: 0x6d331420, 0x37187: 0x6d331620, + 0x37188: 0x6d331820, 0x37189: 0x6d331a20, 0x3718a: 0x6d331c20, 0x3718b: 0x6d331e20, + 0x3718c: 0x6d332020, 0x3718d: 0x6d332220, 0x3718e: 0x6d332420, 0x3718f: 0x6d332620, + 0x37190: 0x6d332820, 0x37191: 0x6d5f4e20, 0x37192: 0x6d5f5020, 0x37193: 0x6d5f5220, + 0x37194: 0x6d5f5420, 0x37195: 0x6d5f5620, 0x37196: 0x6d5f5820, 0x37197: 0x6d5f5a20, + 0x37198: 0x6d5f5c20, 0x37199: 0x6d5f5e20, 0x3719a: 0x6d5f6020, 0x3719b: 0x6d5f6220, + 0x3719c: 0x6d5f6420, 0x3719d: 0x6d5f6620, 0x3719e: 0x6d5f6820, 0x3719f: 0x6d5f6a20, + 0x371a0: 0x6d5f6c20, 0x371a1: 0x6d5f6e20, 0x371a2: 0x6d5f7020, 0x371a3: 0x6d5f7220, + 0x371a4: 0x6d5f7420, 0x371a5: 0x6d5f7620, 0x371a6: 0x6d5f7820, 0x371a7: 0x6d5f7a20, + 0x371a8: 0x6d5f7c20, 0x371a9: 0x6d5f7e20, 0x371aa: 0x6d5f8020, 0x371ab: 0x6d5f8220, + 0x371ac: 0x6d5f8420, 0x371ad: 0x6d5f8620, 0x371ae: 0x6d5f8820, 0x371af: 0x6d5f8a20, + 0x371b0: 0x6d5f8c20, 0x371b1: 0x6d5f8e20, 0x371b2: 0x6d5f9020, 0x371b3: 0x6d5f9220, + 0x371b4: 0x6d5f9420, 0x371b5: 0x6d5f9620, 0x371b6: 0x6d5f9820, 0x371b7: 0x6d5f9a20, + 0x371b8: 0x6d5f9c20, 0x371b9: 0x6d5f9e20, 0x371ba: 0x6d5fa020, 0x371bb: 0x6d5fa220, + 0x371bc: 0x6d5fa420, 0x371bd: 0x6d5fa620, 0x371be: 0x6d5fa820, 0x371bf: 0x6d5faa20, + // Block 0xdc7, offset 0x371c0 + 0x371c0: 0x6d5fac20, 0x371c1: 0x6d5fae20, 0x371c2: 0x6d5fb020, 0x371c3: 0x6d5fb220, + 0x371c4: 0x6d5fb420, 0x371c5: 0x6d5fb620, 0x371c6: 0x6d5fb820, 0x371c7: 0x6d5fba20, + 0x371c8: 0x6d5fbc20, 0x371c9: 0x6d5fbe20, 0x371ca: 0x6d5fc020, 0x371cb: 0x6d5fc220, + 0x371cc: 0x6d5fc420, 0x371cd: 0x6d5fc620, 0x371ce: 0x6d5fc820, 0x371cf: 0x6d5fca20, + 0x371d0: 0x6d5fcc20, 0x371d1: 0x6d5fce20, 0x371d2: 0x6d5fd020, 0x371d3: 0x6d5fd220, + 0x371d4: 0x6d5fd420, 0x371d5: 0x6d5fd620, 0x371d6: 0x6d5fd820, 0x371d7: 0x6d5fda20, + 0x371d8: 0x6d898620, 0x371d9: 0x6d898820, 0x371da: 0x6d898a20, 0x371db: 0x6d898c20, + 0x371dc: 0x6d898e20, 0x371dd: 0x6d899020, 0x371de: 0x6d899220, 0x371df: 0x6d899420, + 0x371e0: 0x6d899620, 0x371e1: 0x6d899820, 0x371e2: 0x6d899a20, 0x371e3: 0x6d899c20, + 0x371e4: 0x6d899e20, 0x371e5: 0x6d89a020, 0x371e6: 0x6d89a220, 0x371e7: 0x6d89a420, + 0x371e8: 0x6d89a620, 0x371e9: 0x6d89a820, 0x371ea: 0x6d89aa20, 0x371eb: 0x6d89ac20, + 0x371ec: 0x6d89ae20, 0x371ed: 0x6d89b020, 0x371ee: 0x6d89b220, 0x371ef: 0x6d89b420, + 0x371f0: 0x6d89b620, 0x371f1: 0x6d89b820, 0x371f2: 0x6d89ba20, 0x371f3: 0x6d89bc20, + 0x371f4: 0x6d89be20, 0x371f5: 0x6d89c020, 0x371f6: 0x6d89c220, 0x371f7: 0x6d89c420, + 0x371f8: 0x6d89c620, 0x371f9: 0x6d89c820, 0x371fa: 0x6d89ca20, 0x371fb: 0x6d89cc20, + 0x371fc: 0x6d89ce20, 0x371fd: 0x6d89d020, 0x371fe: 0x6d89d220, 0x371ff: 0x6d89d420, + // Block 0xdc8, offset 0x37200 + 0x37200: 0x6d89d620, 0x37201: 0x6d89d820, 0x37202: 0x6d89da20, 0x37203: 0x6d89dc20, + 0x37204: 0x6d89de20, 0x37205: 0x6d89e020, 0x37206: 0x6d89e220, 0x37207: 0x6d89e420, + 0x37208: 0x6d89e620, 0x37209: 0x6d89e820, 0x3720a: 0x6d89ea20, 0x3720b: 0x6d89ec20, + 0x3720c: 0x6d89ee20, 0x3720d: 0x6d89f020, 0x3720e: 0x6d89f220, 0x3720f: 0x6d89f420, + 0x37210: 0x6d89f620, 0x37211: 0x6d89f820, 0x37212: 0x6d89fa20, 0x37213: 0x6d89fc20, + 0x37214: 0x6d89fe20, 0x37215: 0x6d8a0020, 0x37216: 0x6d8a0220, 0x37217: 0x6d8a0420, + 0x37218: 0x6d8a0620, 0x37219: 0x6d8a0820, 0x3721a: 0x6d8a0a20, 0x3721b: 0x6d8a0c20, + 0x3721c: 0x6d8a0e20, 0x3721d: 0x6d8a1020, 0x3721e: 0x6d8a1220, 0x3721f: 0x6d8a1420, + 0x37220: 0x6d8a1620, 0x37221: 0x6d8a1820, 0x37222: 0x6d8a1a20, 0x37223: 0x6d8a1c20, + 0x37224: 0x6d8a1e20, 0x37225: 0x6d8a2020, 0x37226: 0x6d8a2220, 0x37227: 0x6d8a2420, + 0x37228: 0x6d8a2620, 0x37229: 0x6d8a2820, 0x3722a: 0x6d8a2a20, 0x3722b: 0x6d8a2c20, + 0x3722c: 0x6d8a2e20, 0x3722d: 0x6d8a3020, 0x3722e: 0x6d8a3220, 0x3722f: 0x6d8a3420, + 0x37230: 0x6d8a3620, 0x37231: 0x6d8a3820, 0x37232: 0x6d8a3a20, 0x37233: 0x6d8a3c20, + 0x37234: 0x6d8a3e20, 0x37235: 0x6dae1220, 0x37236: 0x6dae1420, 0x37237: 0x6dae1620, + 0x37238: 0x6dae1820, 0x37239: 0x6dae1a20, 0x3723a: 0x6dae1c20, 0x3723b: 0x6dae1e20, + 0x3723c: 0x6dae2020, 0x3723d: 0x6dae2220, 0x3723e: 0x6dae2420, 0x3723f: 0x6dae2620, + // Block 0xdc9, offset 0x37240 + 0x37240: 0x6dae2820, 0x37241: 0x6dae2a20, 0x37242: 0x6dae2c20, 0x37243: 0x6dae2e20, + 0x37244: 0x6dae3020, 0x37245: 0x6dae3220, 0x37246: 0x6dae3420, 0x37247: 0x6dae3620, + 0x37248: 0x6dae3820, 0x37249: 0x6dae3a20, 0x3724a: 0x6dae3c20, 0x3724b: 0x6dae3e20, + 0x3724c: 0x6dae4020, 0x3724d: 0x6dae4220, 0x3724e: 0x6dae4420, 0x3724f: 0x6dae4620, + 0x37250: 0x6dae4820, 0x37251: 0x6dae4a20, 0x37252: 0x6dae4c20, 0x37253: 0x6dae4e20, + 0x37254: 0x6dae5020, 0x37255: 0x6dae5220, 0x37256: 0x6dae5420, 0x37257: 0x6dae5620, + 0x37258: 0x6dae5820, 0x37259: 0x6dae5a20, 0x3725a: 0x6dae5c20, 0x3725b: 0x6dae5e20, + 0x3725c: 0x6dae6020, 0x3725d: 0x6dae6220, 0x3725e: 0x6dae6420, 0x3725f: 0x6dae6620, + 0x37260: 0x6dae6820, 0x37261: 0x6dae6a20, 0x37262: 0x6dae6c20, 0x37263: 0x6dae6e20, + 0x37264: 0x6dae7020, 0x37265: 0x6dae7220, 0x37266: 0x6dae7420, 0x37267: 0x6dae7620, + 0x37268: 0x6dae7820, 0x37269: 0x6dae7a20, 0x3726a: 0x6dae7c20, 0x3726b: 0x6dae7e20, + 0x3726c: 0x6dae8020, 0x3726d: 0x6dae8220, 0x3726e: 0x6dae8420, 0x3726f: 0x6dae8620, + 0x37270: 0x6dae8820, 0x37271: 0x6dae8a20, 0x37272: 0x6dae8c20, 0x37273: 0x6dae8e20, + 0x37274: 0x6dae9020, 0x37275: 0x6dae9220, 0x37276: 0x6dae9420, 0x37277: 0x6dae9620, + 0x37278: 0x6dae9820, 0x37279: 0x6dae9a20, 0x3727a: 0x6dae9c20, 0x3727b: 0x6dae9e20, + 0x3727c: 0x6daea020, 0x3727d: 0x6daea220, 0x3727e: 0x6daea420, 0x3727f: 0x6daea620, + // Block 0xdca, offset 0x37280 + 0x37280: 0x6daea820, 0x37281: 0x6dcda420, 0x37282: 0x6daeaa20, 0x37283: 0x6daeac20, + 0x37284: 0x6daeae20, 0x37285: 0x6daeb020, 0x37286: 0x6dcda620, 0x37287: 0x6dcda820, + 0x37288: 0x6dcdaa20, 0x37289: 0x6dcdac20, 0x3728a: 0x6dcdae20, 0x3728b: 0x6dcdb020, + 0x3728c: 0x6dcdb220, 0x3728d: 0x6dcdb420, 0x3728e: 0x6dcdb620, 0x3728f: 0x6dcdb820, + 0x37290: 0x6dcdba20, 0x37291: 0x6dcdbc20, 0x37292: 0x6dcdbe20, 0x37293: 0x6dcdc020, + 0x37294: 0x6dcdc220, 0x37295: 0x6dcdc420, 0x37296: 0x6dcdc620, 0x37297: 0x6dcdc820, + 0x37298: 0x6dcdca20, 0x37299: 0x6dcdcc20, 0x3729a: 0x6dcdce20, 0x3729b: 0x6dcdd020, + 0x3729c: 0x6dcdd220, 0x3729d: 0x6dcdd420, 0x3729e: 0x6dcdd620, 0x3729f: 0x6dcdd820, + 0x372a0: 0x6dcdda20, 0x372a1: 0x6dcddc20, 0x372a2: 0x6dcdde20, 0x372a3: 0x6dcde020, + 0x372a4: 0x6dcde220, 0x372a5: 0x6dcde420, 0x372a6: 0x6dcde620, 0x372a7: 0x6dcde820, + 0x372a8: 0x6dcdea20, 0x372a9: 0x6dcdec20, 0x372aa: 0x6dcdee20, 0x372ab: 0x6dcdf020, + 0x372ac: 0x6dcdf220, 0x372ad: 0x6dcdf420, 0x372ae: 0x6dcdf620, 0x372af: 0x6dcdf820, + 0x372b0: 0x6dcdfa20, 0x372b1: 0x6dcdfc20, 0x372b2: 0x6dcdfe20, 0x372b3: 0x6dce0020, + 0x372b4: 0x6dce0220, 0x372b5: 0x6dce0420, 0x372b6: 0x6dce0620, 0x372b7: 0x6dce0820, + 0x372b8: 0x6dce0a20, 0x372b9: 0x6dce0c20, 0x372ba: 0x6dce0e20, 0x372bb: 0x6dce1020, + 0x372bc: 0x6dce1220, 0x372bd: 0x6dce1420, 0x372be: 0x6dce1620, 0x372bf: 0x6dce1820, + // Block 0xdcb, offset 0x372c0 + 0x372c0: 0x6dce1a20, 0x372c1: 0x6dce1c20, 0x372c2: 0x6dce1e20, 0x372c3: 0x6dce2020, + 0x372c4: 0x6dce2220, 0x372c5: 0x6dce2420, 0x372c6: 0x6dce2620, 0x372c7: 0x6dce2820, + 0x372c8: 0x6dce2a20, 0x372c9: 0x6dce2c20, 0x372ca: 0x6dce2e20, 0x372cb: 0x6dce3020, + 0x372cc: 0x6dce3220, 0x372cd: 0x6dce3420, 0x372ce: 0x6daeb220, 0x372cf: 0x6dce3620, + 0x372d0: 0x6dce3820, 0x372d1: 0x6dce3a20, 0x372d2: 0x6dce3c20, 0x372d3: 0x6dce3e20, + 0x372d4: 0x6dce4020, 0x372d5: 0x6dce4220, 0x372d6: 0x6dce4420, 0x372d7: 0x6dce4620, + 0x372d8: 0x6dce4820, 0x372d9: 0x6dce4a20, 0x372da: 0x6dce4c20, 0x372db: 0x6dce4e20, + 0x372dc: 0x6dce5020, 0x372dd: 0x6dce5220, 0x372de: 0x6dce5420, 0x372df: 0x6dce5620, + 0x372e0: 0x6dce5820, 0x372e1: 0x6de84820, 0x372e2: 0x6de84a20, 0x372e3: 0x6de84c20, + 0x372e4: 0x6de84e20, 0x372e5: 0x6de85020, 0x372e6: 0x6de85220, 0x372e7: 0x6de85420, + 0x372e8: 0x6de85620, 0x372e9: 0x6de85820, 0x372ea: 0x6de85a20, 0x372eb: 0x6de85c20, + 0x372ec: 0x6de85e20, 0x372ed: 0x6de86020, 0x372ee: 0x6de86220, 0x372ef: 0x6de86420, + 0x372f0: 0x6de86620, 0x372f1: 0x6de86820, 0x372f2: 0x6de86a20, 0x372f3: 0x6de86c20, + 0x372f4: 0x6de86e20, 0x372f5: 0x6de87020, 0x372f6: 0x6de87220, 0x372f7: 0x6de87420, + 0x372f8: 0x6de87620, 0x372f9: 0x6de87820, 0x372fa: 0x6de87a20, 0x372fb: 0x6de87c20, + 0x372fc: 0x6de87e20, 0x372fd: 0x6de88020, 0x372fe: 0x6de88220, 0x372ff: 0x6de88420, + // Block 0xdcc, offset 0x37300 + 0x37300: 0x6de88620, 0x37301: 0x6de88820, 0x37302: 0x6de88a20, 0x37303: 0x6de88c20, + 0x37304: 0x6de88e20, 0x37305: 0x6de89020, 0x37306: 0x6de89220, 0x37307: 0x6de89420, + 0x37308: 0x6de89620, 0x37309: 0x6de89820, 0x3730a: 0x6de89a20, 0x3730b: 0x6de89c20, + 0x3730c: 0x6de89e20, 0x3730d: 0x6de8a020, 0x3730e: 0x6de8a220, 0x3730f: 0x6de8a420, + 0x37310: 0x6de8a620, 0x37311: 0x6de8a820, 0x37312: 0x6de8aa20, 0x37313: 0x6de8ac20, + 0x37314: 0x6de8ae20, 0x37315: 0x6de8b020, 0x37316: 0x6de8b220, 0x37317: 0x6de8b420, + 0x37318: 0x6de8b620, 0x37319: 0x6de8b820, 0x3731a: 0x6de8ba20, 0x3731b: 0x6de8bc20, + 0x3731c: 0x6dfec820, 0x3731d: 0x6dfeca20, 0x3731e: 0x6dfecc20, 0x3731f: 0x6dfece20, + 0x37320: 0x6dfed020, 0x37321: 0x6dfed220, 0x37322: 0x6dfed420, 0x37323: 0x6dfed620, + 0x37324: 0x6dfed820, 0x37325: 0x6dfeda20, 0x37326: 0x6dfedc20, 0x37327: 0x6dfede20, + 0x37328: 0x6dfee020, 0x37329: 0x6dfee220, 0x3732a: 0x6dfee420, 0x3732b: 0x6dfee620, + 0x3732c: 0x6dfee820, 0x3732d: 0x6dfeea20, 0x3732e: 0x6dfeec20, 0x3732f: 0x6dfeee20, + 0x37330: 0x6dfef020, 0x37331: 0x6dfef220, 0x37332: 0x6dfef420, 0x37333: 0x6dfef620, + 0x37334: 0x6dfef820, 0x37335: 0x6dfefa20, 0x37336: 0x6dfefc20, 0x37337: 0x6dfefe20, + 0x37338: 0x6dff0020, 0x37339: 0x6dff0220, 0x3733a: 0x6dff0420, 0x3733b: 0x6dff0620, + 0x3733c: 0x6dff0820, 0x3733d: 0x6dff0a20, 0x3733e: 0x6dff0c20, 0x3733f: 0x6dff0e20, + // Block 0xdcd, offset 0x37340 + 0x37340: 0x6dff1020, 0x37341: 0x6dff1220, 0x37342: 0x6dff1420, 0x37343: 0x6dff1620, + 0x37344: 0x6dff1820, 0x37345: 0x6e112220, 0x37346: 0x6e112420, 0x37347: 0x6e112620, + 0x37348: 0x6e112820, 0x37349: 0x6e112a20, 0x3734a: 0x6e112c20, 0x3734b: 0x6e112e20, + 0x3734c: 0x6e113020, 0x3734d: 0x6e113220, 0x3734e: 0x6e113420, 0x3734f: 0x6e113620, + 0x37350: 0x6e113820, 0x37351: 0x6e113a20, 0x37352: 0x6e113c20, 0x37353: 0x6e113e20, + 0x37354: 0x6e114020, 0x37355: 0x6e114220, 0x37356: 0x6e114420, 0x37357: 0x6e114620, + 0x37358: 0x6e114820, 0x37359: 0x6e114a20, 0x3735a: 0x6e114c20, 0x3735b: 0x6e114e20, + 0x3735c: 0x6e115020, 0x3735d: 0x6e115220, 0x3735e: 0x6e115420, 0x3735f: 0x6e115620, + 0x37360: 0x6e115820, 0x37361: 0x6e115a20, 0x37362: 0x6e115c20, 0x37363: 0x6e115e20, + 0x37364: 0x6e116020, 0x37365: 0x6e116220, 0x37366: 0x6e116420, 0x37367: 0x6e116620, + 0x37368: 0x6e116820, 0x37369: 0x6e116a20, 0x3736a: 0x6e116c20, 0x3736b: 0x6e116e20, + 0x3736c: 0x6e117020, 0x3736d: 0x6e117220, 0x3736e: 0x6e117420, 0x3736f: 0x6e117620, + 0x37370: 0x6e117820, 0x37371: 0x6e117a20, 0x37372: 0x6e117c20, 0x37373: 0x6e117e20, + 0x37374: 0x6e118020, 0x37375: 0x6e1fa220, 0x37376: 0x6e1fa420, 0x37377: 0x6e1fa620, + 0x37378: 0x6e1fa820, 0x37379: 0x6e1faa20, 0x3737a: 0x6e1fac20, 0x3737b: 0x6e1fae20, + 0x3737c: 0x6e1fb020, 0x3737d: 0x6e1fb220, 0x3737e: 0x6e1fb420, 0x3737f: 0x6e1fb620, + // Block 0xdce, offset 0x37380 + 0x37380: 0x6e1fb820, 0x37381: 0x6e1fba20, 0x37382: 0x6e1fbc20, 0x37383: 0x6e1fbe20, + 0x37384: 0x6e1fc020, 0x37385: 0x6e1fc220, 0x37386: 0x6e1fc420, 0x37387: 0x6e1fc620, + 0x37388: 0x6e1fc820, 0x37389: 0x6e1fca20, 0x3738a: 0x6e1fcc20, 0x3738b: 0x6e1fce20, + 0x3738c: 0x6e1fd020, 0x3738d: 0x6e1fd220, 0x3738e: 0x6e1fd420, 0x3738f: 0x6e1fd620, + 0x37390: 0x6e1fd820, 0x37391: 0x6e1fda20, 0x37392: 0x6e1fdc20, 0x37393: 0x6e1fde20, + 0x37394: 0x6e2ada20, 0x37395: 0x6e2adc20, 0x37396: 0x6e2ade20, 0x37397: 0x6e2ae020, + 0x37398: 0x6e2ae220, 0x37399: 0x6e2ae420, 0x3739a: 0x6e2ae620, 0x3739b: 0x6e2ae820, + 0x3739c: 0x6e2aea20, 0x3739d: 0x6e2aec20, 0x3739e: 0x6e2aee20, 0x3739f: 0x6e2af020, + 0x373a0: 0x6e2af220, 0x373a1: 0x6e2af420, 0x373a2: 0x6e2af620, 0x373a3: 0x6e2af820, + 0x373a4: 0x6e2afa20, 0x373a5: 0x6e2afc20, 0x373a6: 0x6e2afe20, 0x373a7: 0x6e2b0020, + 0x373a8: 0x6e335620, 0x373a9: 0x6e335820, 0x373aa: 0x6e335a20, 0x373ab: 0x6e335c20, + 0x373ac: 0x6e335e20, 0x373ad: 0x6e336020, 0x373ae: 0x6e336220, 0x373af: 0x6e336420, + 0x373b0: 0x6e336620, 0x373b1: 0x6e336820, 0x373b2: 0x6e336a20, 0x373b3: 0x6e336c20, + 0x373b4: 0x6e336e20, 0x373b5: 0x6e337020, 0x373b6: 0x6e337220, 0x373b7: 0x6e337420, + 0x373b8: 0x6e337620, 0x373b9: 0x6e337820, 0x373ba: 0x6e337a20, 0x373bb: 0x6e337c20, + 0x373bc: 0x6e396a20, 0x373bd: 0x6e396c20, 0x373be: 0x6e396e20, 0x373bf: 0x6e397020, + // Block 0xdcf, offset 0x373c0 + 0x373c0: 0x6e397220, 0x373c1: 0x6e397420, 0x373c2: 0x6e397620, 0x373c3: 0x6e397820, + 0x373c4: 0x6e397a20, 0x373c5: 0x6e397c20, 0x373c6: 0x6e397e20, 0x373c7: 0x6e398020, + 0x373c8: 0x6e3db220, 0x373c9: 0x6e3db420, 0x373ca: 0x6e3db620, 0x373cb: 0x6e3db820, + 0x373cc: 0x6e3dba20, 0x373cd: 0x6e3dbc20, 0x373ce: 0x6e3dbe20, 0x373cf: 0x6e3dc020, + 0x373d0: 0x6e409020, 0x373d1: 0x6e409220, 0x373d2: 0x6e409420, 0x373d3: 0x6e409620, + 0x373d4: 0x6e409820, 0x373d5: 0x6e409a20, 0x373d6: 0x6e409c20, 0x373d7: 0x6e42d420, + 0x373d8: 0x6e445020, 0x373d9: 0x6e445220, 0x373da: 0x6e42d620, 0x373db: 0x6e42d820, + 0x373dc: 0x6e42da20, 0x373dd: 0x6e42dc20, 0x373de: 0x6e445420, 0x373df: 0x6e445620, + 0x373e0: 0x6e445820, 0x373e1: 0x6e453620, 0x373e2: 0x6e453820, 0x373e3: 0x6e45c620, + 0x373e4: 0x6e463820, 0x373e5: 0x6c259620, 0x373e6: 0x6c259820, 0x373e7: 0x6c3dae20, + 0x373e8: 0x6c3db020, 0x373e9: 0x6c3db220, 0x373ea: 0x6c3db420, 0x373eb: 0x6c5c4a20, + 0x373ec: 0x6c5c4c20, 0x373ed: 0x6c5c4e20, 0x373ee: 0x6c5c5020, 0x373ef: 0x6c5c5220, + 0x373f0: 0x6c5c5420, 0x373f1: 0x6c5c5620, 0x373f2: 0x6c5c5820, 0x373f3: 0x6c7fcc20, + 0x373f4: 0x6c7fce20, 0x373f5: 0x6c7fd020, 0x373f6: 0x6c7fd220, 0x373f7: 0x6c7fd420, + 0x373f8: 0x6c7fd620, 0x373f9: 0x6c7fd820, 0x373fa: 0x6c7fda20, 0x373fb: 0x6c7fdc20, + 0x373fc: 0x6c7fde20, 0x373fd: 0x6c7fe020, 0x373fe: 0x6c7fe220, 0x373ff: 0x6c7fe420, + // Block 0xdd0, offset 0x37400 + 0x37400: 0x6c7fe620, 0x37401: 0x6ca8b620, 0x37402: 0x6ca8b820, 0x37403: 0x6ca8ba20, + 0x37404: 0x6ca8bc20, 0x37405: 0x6ca8be20, 0x37406: 0x6ca8c020, 0x37407: 0x6ca8c220, + 0x37408: 0x6ca8c420, 0x37409: 0x6ca8c620, 0x3740a: 0x6ca8c820, 0x3740b: 0x6ca8ca20, + 0x3740c: 0x6ca8cc20, 0x3740d: 0x6ca8ce20, 0x3740e: 0x6ca8d020, 0x3740f: 0x6ca8d220, + 0x37410: 0x6ca8d420, 0x37411: 0x6ca8d620, 0x37412: 0x6ca8d820, 0x37413: 0x6ca8da20, + 0x37414: 0x6ca8dc20, 0x37415: 0x6ca8de20, 0x37416: 0x6ca8e020, 0x37417: 0x6cd70a20, + 0x37418: 0x6ca8e220, 0x37419: 0x6ca8e420, 0x3741a: 0x6cd70c20, 0x3741b: 0x6cd70e20, + 0x3741c: 0x6cd71020, 0x3741d: 0x6cd71220, 0x3741e: 0x6cd71420, 0x3741f: 0x6cd71620, + 0x37420: 0x6cd71820, 0x37421: 0x6cd71a20, 0x37422: 0x6cd71c20, 0x37423: 0x6cd71e20, + 0x37424: 0x6cd72020, 0x37425: 0x6cd72220, 0x37426: 0x6cd72420, 0x37427: 0x6cd72620, + 0x37428: 0x6cd72820, 0x37429: 0x6cd72a20, 0x3742a: 0x6cd72c20, 0x3742b: 0x6cd72e20, + 0x3742c: 0x6cd73020, 0x3742d: 0x6cd73220, 0x3742e: 0x6cd73420, 0x3742f: 0x6cd73620, + 0x37430: 0x6cd73820, 0x37431: 0x6ca8e620, 0x37432: 0x6d05b620, 0x37433: 0x6d05b820, + 0x37434: 0x6d05ba20, 0x37435: 0x6d05bc20, 0x37436: 0x6d05be20, 0x37437: 0x6d05c020, + 0x37438: 0x6d05c220, 0x37439: 0x6d05c420, 0x3743a: 0x6d05c620, 0x3743b: 0x6d05c820, + 0x3743c: 0x6d05ca20, 0x3743d: 0x6d05cc20, 0x3743e: 0x6d05ce20, 0x3743f: 0x6d05d020, + // Block 0xdd1, offset 0x37440 + 0x37440: 0x6d05d220, 0x37441: 0x6d05d420, 0x37442: 0x6d05d620, 0x37443: 0x6d05d820, + 0x37444: 0x6d05da20, 0x37445: 0x6d05dc20, 0x37446: 0x6d05de20, 0x37447: 0x6d05e020, + 0x37448: 0x6d05e220, 0x37449: 0x6d05e420, 0x3744a: 0x6d05e620, 0x3744b: 0x6d05e820, + 0x3744c: 0x6d05ea20, 0x3744d: 0x6d05ec20, 0x3744e: 0x6d05ee20, 0x3744f: 0x6d05f020, + 0x37450: 0x6d05f220, 0x37451: 0x6d05f420, 0x37452: 0x6d05f620, 0x37453: 0x6d05f820, + 0x37454: 0x6d05fa20, 0x37455: 0x6d05fc20, 0x37456: 0x6d05fe20, 0x37457: 0x6d060020, + 0x37458: 0x6d335a20, 0x37459: 0x6d335c20, 0x3745a: 0x6d335e20, 0x3745b: 0x6d336020, + 0x3745c: 0x6d336220, 0x3745d: 0x6d336420, 0x3745e: 0x6d336620, 0x3745f: 0x6d336820, + 0x37460: 0x6d336a20, 0x37461: 0x6d336c20, 0x37462: 0x6d336e20, 0x37463: 0x6d337020, + 0x37464: 0x6d337220, 0x37465: 0x6d337420, 0x37466: 0x6d337620, 0x37467: 0x6d337820, + 0x37468: 0x6d337a20, 0x37469: 0x6d337c20, 0x3746a: 0x6d337e20, 0x3746b: 0x6d338020, + 0x3746c: 0x6d338220, 0x3746d: 0x6d338420, 0x3746e: 0x6d338620, 0x3746f: 0x6d338820, + 0x37470: 0x6d338a20, 0x37471: 0x6d338c20, 0x37472: 0x6d338e20, 0x37473: 0x6d339020, + 0x37474: 0x6d339220, 0x37475: 0x6d339420, 0x37476: 0x6d339620, 0x37477: 0x6d339820, + 0x37478: 0x6d339a20, 0x37479: 0x6d339c20, 0x3747a: 0x6d339e20, 0x3747b: 0x6d33a020, + 0x3747c: 0x6d33a220, 0x3747d: 0x6d33a420, 0x3747e: 0x6d33a620, 0x3747f: 0x6d33a820, + // Block 0xdd2, offset 0x37480 + 0x37480: 0x6d33aa20, 0x37481: 0x6d601820, 0x37482: 0x6d601a20, 0x37483: 0x6d601c20, + 0x37484: 0x6d601e20, 0x37485: 0x6d602020, 0x37486: 0x6d602220, 0x37487: 0x6d602420, + 0x37488: 0x6d602620, 0x37489: 0x6d602820, 0x3748a: 0x6d602a20, 0x3748b: 0x6d602c20, + 0x3748c: 0x6d602e20, 0x3748d: 0x6d603020, 0x3748e: 0x6d603220, 0x3748f: 0x6d603420, + 0x37490: 0x6d603620, 0x37491: 0x6d603820, 0x37492: 0x6d603a20, 0x37493: 0x6d603c20, + 0x37494: 0x6d603e20, 0x37495: 0x6d604020, 0x37496: 0x6d604220, 0x37497: 0x6d604420, + 0x37498: 0x6d604620, 0x37499: 0x6d604820, 0x3749a: 0x6d604a20, 0x3749b: 0x6d604c20, + 0x3749c: 0x6d604e20, 0x3749d: 0x6d605020, 0x3749e: 0x6d605220, 0x3749f: 0x6d605420, + 0x374a0: 0x6d605620, 0x374a1: 0x6d605820, 0x374a2: 0x6d605a20, 0x374a3: 0x6d605c20, + 0x374a4: 0x6d8a6e20, 0x374a5: 0x6d8a7020, 0x374a6: 0x6d8a7220, 0x374a7: 0x6d8a7420, + 0x374a8: 0x6d8a7620, 0x374a9: 0x6d8a7820, 0x374aa: 0x6d8a7a20, 0x374ab: 0x6d8a7c20, + 0x374ac: 0x6d8a7e20, 0x374ad: 0x6d8a8020, 0x374ae: 0x6d8a8220, 0x374af: 0x6d8a8420, + 0x374b0: 0x6d8a8620, 0x374b1: 0x6d8a8820, 0x374b2: 0x6d8a8a20, 0x374b3: 0x6d8a8c20, + 0x374b4: 0x6d8a8e20, 0x374b5: 0x6d8a9020, 0x374b6: 0x6d8a9220, 0x374b7: 0x6d8a9420, + 0x374b8: 0x6d8a9620, 0x374b9: 0x6d8a9820, 0x374ba: 0x6d8a9a20, 0x374bb: 0x6d8a9c20, + 0x374bc: 0x6d8a9e20, 0x374bd: 0x6d8aa020, 0x374be: 0x6d8aa220, 0x374bf: 0x6daeea20, + // Block 0xdd3, offset 0x374c0 + 0x374c0: 0x6daeec20, 0x374c1: 0x6daeee20, 0x374c2: 0x6daef020, 0x374c3: 0x6daef220, + 0x374c4: 0x6daef420, 0x374c5: 0x6daef620, 0x374c6: 0x6daef820, 0x374c7: 0x6daefa20, + 0x374c8: 0x6daefc20, 0x374c9: 0x6daefe20, 0x374ca: 0x6daf0020, 0x374cb: 0x6daf0220, + 0x374cc: 0x6daf0420, 0x374cd: 0x6daf0620, 0x374ce: 0x6daf0820, 0x374cf: 0x6daf0a20, + 0x374d0: 0x6daf0c20, 0x374d1: 0x6daf0e20, 0x374d2: 0x6daf1020, 0x374d3: 0x6daf1220, + 0x374d4: 0x6daf1420, 0x374d5: 0x6daf1620, 0x374d6: 0x6daf1820, 0x374d7: 0x6dce7c20, + 0x374d8: 0x6dce7e20, 0x374d9: 0x6dce8020, 0x374da: 0x6dce8220, 0x374db: 0x6dce8420, + 0x374dc: 0x6dce8620, 0x374dd: 0x6dce8820, 0x374de: 0x6dce8a20, 0x374df: 0x6dce8c20, + 0x374e0: 0x6dce8e20, 0x374e1: 0x6dce9020, 0x374e2: 0x6dce9220, 0x374e3: 0x6dce9420, + 0x374e4: 0x6dce9620, 0x374e5: 0x6dce9820, 0x374e6: 0x6dce9a20, 0x374e7: 0x6dce9c20, + 0x374e8: 0x6dce9e20, 0x374e9: 0x6dcea020, 0x374ea: 0x6dcea220, 0x374eb: 0x6dcea420, + 0x374ec: 0x6dcea620, 0x374ed: 0x6dcea820, 0x374ee: 0x6dceaa20, 0x374ef: 0x6dceac20, + 0x374f0: 0x6dceae20, 0x374f1: 0x6dceb020, 0x374f2: 0x6dceb220, 0x374f3: 0x6dceb420, + 0x374f4: 0x6dceb620, 0x374f5: 0x6dceb820, 0x374f6: 0x6de8d220, 0x374f7: 0x6de8d420, + 0x374f8: 0x6de8d620, 0x374f9: 0x6de8d820, 0x374fa: 0x6de8da20, 0x374fb: 0x6de8dc20, + 0x374fc: 0x6de8de20, 0x374fd: 0x6de8e020, 0x374fe: 0x6de8e220, 0x374ff: 0x6de8e420, + // Block 0xdd4, offset 0x37500 + 0x37500: 0x6de8e620, 0x37501: 0x6de8e820, 0x37502: 0x6de8ea20, 0x37503: 0x6de8ec20, + 0x37504: 0x6de8ee20, 0x37505: 0x6de8f020, 0x37506: 0x6de8f220, 0x37507: 0x6de8f420, + 0x37508: 0x6de8f620, 0x37509: 0x6de8f820, 0x3750a: 0x6de8fa20, 0x3750b: 0x6de8fc20, + 0x3750c: 0x6de8fe20, 0x3750d: 0x6de90020, 0x3750e: 0x6de90220, 0x3750f: 0x6dff2620, + 0x37510: 0x6dff2820, 0x37511: 0x6dff2a20, 0x37512: 0x6dff2c20, 0x37513: 0x6dff2e20, + 0x37514: 0x6dff3020, 0x37515: 0x6dff3220, 0x37516: 0x6dff3420, 0x37517: 0x6e118e20, + 0x37518: 0x6e119020, 0x37519: 0x6e119220, 0x3751a: 0x6e119420, 0x3751b: 0x6e119620, + 0x3751c: 0x6e119820, 0x3751d: 0x6e119a20, 0x3751e: 0x6e119c20, 0x3751f: 0x6e119e20, + 0x37520: 0x6e11a020, 0x37521: 0x6e1fe820, 0x37522: 0x6e11a220, 0x37523: 0x6e11a420, + 0x37524: 0x6e1fea20, 0x37525: 0x6e1fec20, 0x37526: 0x6e1fee20, 0x37527: 0x6e1ff020, + 0x37528: 0x6e1ff220, 0x37529: 0x6e1ff420, 0x3752a: 0x6e1ff620, 0x3752b: 0x6e1ff820, + 0x3752c: 0x6e2b0a20, 0x3752d: 0x6e2b0c20, 0x3752e: 0x6e2b0e20, 0x3752f: 0x6e2b1020, + 0x37530: 0x6e2b1220, 0x37531: 0x6e338020, 0x37532: 0x6e338220, 0x37533: 0x6e338420, + 0x37534: 0x6e338620, 0x37535: 0x6e338820, 0x37536: 0x6e398a20, 0x37537: 0x6e398c20, + 0x37538: 0x6e398e20, 0x37539: 0x6e399020, 0x3753a: 0x6e399220, 0x3753b: 0x6e3dc420, + 0x3753c: 0x6e3dc620, 0x3753d: 0x6e3dc820, 0x3753e: 0x6e3dca20, 0x3753f: 0x6e3dcc20, + // Block 0xdd5, offset 0x37540 + 0x37540: 0x6e40a020, 0x37541: 0x6e40a220, 0x37542: 0x6e453a20, 0x37543: 0x6e45c820, + 0x37544: 0x6e468a20, 0x37545: 0x6c3dc420, 0x37546: 0x6c3dc620, 0x37547: 0x6c3dc820, + 0x37548: 0x6c3dca20, 0x37549: 0x6c3dcc20, 0x3754a: 0x6c3dce20, 0x3754b: 0x6c3dd020, + 0x3754c: 0x6c5c7a20, 0x3754d: 0x6c5c7c20, 0x3754e: 0x6c5c7e20, 0x3754f: 0x6c5c8020, + 0x37550: 0x6c5c8220, 0x37551: 0x6c5c8420, 0x37552: 0x6c5c8620, 0x37553: 0x6c5c8820, + 0x37554: 0x6c5c8a20, 0x37555: 0x6c5c8c20, 0x37556: 0x6c5c8e20, 0x37557: 0x6c5c9020, + 0x37558: 0x6c5c9220, 0x37559: 0x6c804620, 0x3755a: 0x6c804820, 0x3755b: 0x6c804a20, + 0x3755c: 0x6c804c20, 0x3755d: 0x6c804e20, 0x3755e: 0x6c805020, 0x3755f: 0x6c805220, + 0x37560: 0x6c805420, 0x37561: 0x6c805620, 0x37562: 0x6c805820, 0x37563: 0x6c805a20, + 0x37564: 0x6c805c20, 0x37565: 0x6c805e20, 0x37566: 0x6c806020, 0x37567: 0x6c806220, + 0x37568: 0x6c806420, 0x37569: 0x6c806620, 0x3756a: 0x6c806820, 0x3756b: 0x6c806a20, + 0x3756c: 0x6c806c20, 0x3756d: 0x6c806e20, 0x3756e: 0x6c807020, 0x3756f: 0x6c807220, + 0x37570: 0x6c807420, 0x37571: 0x6c807620, 0x37572: 0x6c807820, 0x37573: 0x6c807a20, + 0x37574: 0x6c807c20, 0x37575: 0x6c807e20, 0x37576: 0x6c808020, 0x37577: 0x6c808220, + 0x37578: 0x6c808420, 0x37579: 0x6c808620, 0x3757a: 0x6c808820, 0x3757b: 0x6c808a20, + 0x3757c: 0x6c808c20, 0x3757d: 0x6c808e20, 0x3757e: 0x6c809020, 0x3757f: 0x6c809220, + // Block 0xdd6, offset 0x37580 + 0x37580: 0x6c809420, 0x37581: 0x6c809620, 0x37582: 0x6c809820, 0x37583: 0x6ca95220, + 0x37584: 0x6ca95420, 0x37585: 0x6ca95620, 0x37586: 0x6ca95820, 0x37587: 0x6ca95a20, + 0x37588: 0x6ca95c20, 0x37589: 0x6ca95e20, 0x3758a: 0x6ca96020, 0x3758b: 0x6ca96220, + 0x3758c: 0x6ca96420, 0x3758d: 0x6ca96620, 0x3758e: 0x6ca96820, 0x3758f: 0x6ca96a20, + 0x37590: 0x6ca96c20, 0x37591: 0x6ca96e20, 0x37592: 0x6ca97020, 0x37593: 0x6ca97220, + 0x37594: 0x6ca97420, 0x37595: 0x6ca97620, 0x37596: 0x6ca97820, 0x37597: 0x6ca97a20, + 0x37598: 0x6ca97c20, 0x37599: 0x6ca97e20, 0x3759a: 0x6ca98020, 0x3759b: 0x6ca98220, + 0x3759c: 0x6ca98420, 0x3759d: 0x6ca98620, 0x3759e: 0x6ca98820, 0x3759f: 0x6ca98a20, + 0x375a0: 0x6ca98c20, 0x375a1: 0x6ca98e20, 0x375a2: 0x6ca99020, 0x375a3: 0x6ca99220, + 0x375a4: 0x6ca99420, 0x375a5: 0x6ca99620, 0x375a6: 0x6cd7ae20, 0x375a7: 0x6cd7b020, + 0x375a8: 0x6cd7b220, 0x375a9: 0x6cd7b420, 0x375aa: 0x6cd7b620, 0x375ab: 0x6cd7b820, + 0x375ac: 0x6cd7ba20, 0x375ad: 0x6cd7bc20, 0x375ae: 0x6cd7be20, 0x375af: 0x6cd7c020, + 0x375b0: 0x6cd7c220, 0x375b1: 0x6cd7c420, 0x375b2: 0x6cd7c620, 0x375b3: 0x6cd7c820, + 0x375b4: 0x6cd7ca20, 0x375b5: 0x6cd7cc20, 0x375b6: 0x6cd7ce20, 0x375b7: 0x6cd7d020, + 0x375b8: 0x6cd7d220, 0x375b9: 0x6cd7d420, 0x375ba: 0x6cd7d620, 0x375bb: 0x6cd7d820, + 0x375bc: 0x6cd7da20, 0x375bd: 0x6cd7dc20, 0x375be: 0x6cd7de20, 0x375bf: 0x6cd7e020, + // Block 0xdd7, offset 0x375c0 + 0x375c0: 0x6cd7e220, 0x375c1: 0x6cd7e420, 0x375c2: 0x6cd7e620, 0x375c3: 0x6cd7e820, + 0x375c4: 0x6cd7ea20, 0x375c5: 0x6cd7ec20, 0x375c6: 0x6cd7ee20, 0x375c7: 0x6cd7f020, + 0x375c8: 0x6cd7f220, 0x375c9: 0x6cd7f420, 0x375ca: 0x6cd7f620, 0x375cb: 0x6cd7f820, + 0x375cc: 0x6cd7fa20, 0x375cd: 0x6cd7fc20, 0x375ce: 0x6cd7fe20, 0x375cf: 0x6cd80020, + 0x375d0: 0x6cd80220, 0x375d1: 0x6cd80420, 0x375d2: 0x6d065a20, 0x375d3: 0x6d065c20, + 0x375d4: 0x6d065e20, 0x375d5: 0x6d066020, 0x375d6: 0x6d066220, 0x375d7: 0x6d066420, + 0x375d8: 0x6d066620, 0x375d9: 0x6d066820, 0x375da: 0x6d066a20, 0x375db: 0x6d066c20, + 0x375dc: 0x6d066e20, 0x375dd: 0x6d067020, 0x375de: 0x6d067220, 0x375df: 0x6d067420, + 0x375e0: 0x6d067620, 0x375e1: 0x6d067820, 0x375e2: 0x6d067a20, 0x375e3: 0x6d067c20, + 0x375e4: 0x6d067e20, 0x375e5: 0x6d068020, 0x375e6: 0x6d068220, 0x375e7: 0x6d068420, + 0x375e8: 0x6d068620, 0x375e9: 0x6d068820, 0x375ea: 0x6d068a20, 0x375eb: 0x6d068c20, + 0x375ec: 0x6d068e20, 0x375ed: 0x6d069020, 0x375ee: 0x6d069220, 0x375ef: 0x6d069420, + 0x375f0: 0x6d069620, 0x375f1: 0x6d069820, 0x375f2: 0x6d069a20, 0x375f3: 0x6d069c20, + 0x375f4: 0x6d069e20, 0x375f5: 0x6d06a020, 0x375f6: 0x6d06a220, 0x375f7: 0x6d06a420, + 0x375f8: 0x6d06a620, 0x375f9: 0x6d06a820, 0x375fa: 0x6d06aa20, 0x375fb: 0x6d06ac20, + 0x375fc: 0x6d06ae20, 0x375fd: 0x6d06b020, 0x375fe: 0x6d06b220, 0x375ff: 0x6d06b420, + // Block 0xdd8, offset 0x37600 + 0x37600: 0x6d06b620, 0x37601: 0x6d06b820, 0x37602: 0x6d06ba20, 0x37603: 0x6d06bc20, + 0x37604: 0x6d06be20, 0x37605: 0x6d06c020, 0x37606: 0x6d344020, 0x37607: 0x6d344220, + 0x37608: 0x6d344420, 0x37609: 0x6d344620, 0x3760a: 0x6d344820, 0x3760b: 0x6d344a20, + 0x3760c: 0x6d344c20, 0x3760d: 0x6d344e20, 0x3760e: 0x6d345020, 0x3760f: 0x6d345220, + 0x37610: 0x6d345420, 0x37611: 0x6d345620, 0x37612: 0x6d345820, 0x37613: 0x6d345a20, + 0x37614: 0x6d345c20, 0x37615: 0x6d345e20, 0x37616: 0x6d346020, 0x37617: 0x6d346220, + 0x37618: 0x6d346420, 0x37619: 0x6d346620, 0x3761a: 0x6d346820, 0x3761b: 0x6d346a20, + 0x3761c: 0x6d346c20, 0x3761d: 0x6d346e20, 0x3761e: 0x6d347020, 0x3761f: 0x6d347220, + 0x37620: 0x6d347420, 0x37621: 0x6d347620, 0x37622: 0x6d347820, 0x37623: 0x6d347a20, + 0x37624: 0x6d347c20, 0x37625: 0x6d347e20, 0x37626: 0x6d348020, 0x37627: 0x6d348220, + 0x37628: 0x6d348420, 0x37629: 0x6d348620, 0x3762a: 0x6d348820, 0x3762b: 0x6d348a20, + 0x3762c: 0x6d348c20, 0x3762d: 0x6d348e20, 0x3762e: 0x6d349020, 0x3762f: 0x6d349220, + 0x37630: 0x6d349420, 0x37631: 0x6d349620, 0x37632: 0x6d349820, 0x37633: 0x6d349a20, + 0x37634: 0x6d349c20, 0x37635: 0x6d349e20, 0x37636: 0x6d34a020, 0x37637: 0x6d34a220, + 0x37638: 0x6d34a420, 0x37639: 0x6d34a620, 0x3763a: 0x6d34a820, 0x3763b: 0x6d34aa20, + 0x3763c: 0x6d34ac20, 0x3763d: 0x6d34ae20, 0x3763e: 0x6d34b020, 0x3763f: 0x6d34b220, + // Block 0xdd9, offset 0x37640 + 0x37640: 0x6d60ee20, 0x37641: 0x6d60f020, 0x37642: 0x6d60f220, 0x37643: 0x6d60f420, + 0x37644: 0x6d60f620, 0x37645: 0x6d60f820, 0x37646: 0x6d60fa20, 0x37647: 0x6d60fc20, + 0x37648: 0x6d60fe20, 0x37649: 0x6d610020, 0x3764a: 0x6d610220, 0x3764b: 0x6d610420, + 0x3764c: 0x6d610620, 0x3764d: 0x6d610820, 0x3764e: 0x6d610a20, 0x3764f: 0x6d610c20, + 0x37650: 0x6d610e20, 0x37651: 0x6d611020, 0x37652: 0x6d611220, 0x37653: 0x6d611420, + 0x37654: 0x6d611620, 0x37655: 0x6d611820, 0x37656: 0x6d611a20, 0x37657: 0x6d611c20, + 0x37658: 0x6d611e20, 0x37659: 0x6d612020, 0x3765a: 0x6d612220, 0x3765b: 0x6d612420, + 0x3765c: 0x6d612620, 0x3765d: 0x6d612820, 0x3765e: 0x6d612a20, 0x3765f: 0x6d612c20, + 0x37660: 0x6d612e20, 0x37661: 0x6d613020, 0x37662: 0x6d613220, 0x37663: 0x6d613420, + 0x37664: 0x6d613620, 0x37665: 0x6d613820, 0x37666: 0x6d613a20, 0x37667: 0x6d8afc20, + 0x37668: 0x6d613c20, 0x37669: 0x6d613e20, 0x3766a: 0x6d614020, 0x3766b: 0x6d614220, + 0x3766c: 0x6d614420, 0x3766d: 0x6d614620, 0x3766e: 0x6d614820, 0x3766f: 0x6d614a20, + 0x37670: 0x6d614c20, 0x37671: 0x6d614e20, 0x37672: 0x6d615020, 0x37673: 0x6d615220, + 0x37674: 0x6d615420, 0x37675: 0x6d615620, 0x37676: 0x6d615820, 0x37677: 0x6d615a20, + 0x37678: 0x6d615c20, 0x37679: 0x6d615e20, 0x3767a: 0x6d616020, 0x3767b: 0x6d616220, + 0x3767c: 0x6d616420, 0x3767d: 0x6d616620, 0x3767e: 0x6d616820, 0x3767f: 0x6d616a20, + // Block 0xdda, offset 0x37680 + 0x37680: 0x6d616c20, 0x37681: 0x6d616e20, 0x37682: 0x6d8afe20, 0x37683: 0x6d8b0020, + 0x37684: 0x6d8b0220, 0x37685: 0x6d8b0420, 0x37686: 0x6d8b0620, 0x37687: 0x6d8b0820, + 0x37688: 0x6d8b0a20, 0x37689: 0x6d8b0c20, 0x3768a: 0x6d8b0e20, 0x3768b: 0x6d8b1020, + 0x3768c: 0x6d8b1220, 0x3768d: 0x6d8b1420, 0x3768e: 0x6d8b1620, 0x3768f: 0x6d8b1820, + 0x37690: 0x6d8b1a20, 0x37691: 0x6d8b1c20, 0x37692: 0x6d8b1e20, 0x37693: 0x6d8b2020, + 0x37694: 0x6d8b2220, 0x37695: 0x6d8b2420, 0x37696: 0x6d8b2620, 0x37697: 0x6d8b2820, + 0x37698: 0x6d8b2a20, 0x37699: 0x6d8b2c20, 0x3769a: 0x6d8b2e20, 0x3769b: 0x6d8b3020, + 0x3769c: 0x6d8b3220, 0x3769d: 0x6d8b3420, 0x3769e: 0x6d8b3620, 0x3769f: 0x6d8b3820, + 0x376a0: 0x6d8b3a20, 0x376a1: 0x6d8b3c20, 0x376a2: 0x6d8b3e20, 0x376a3: 0x6d8b4020, + 0x376a4: 0x6d8b4220, 0x376a5: 0x6d8b4420, 0x376a6: 0x6d8b4620, 0x376a7: 0x6d8b4820, + 0x376a8: 0x6d8b4a20, 0x376a9: 0x6d8b4c20, 0x376aa: 0x6d8b4e20, 0x376ab: 0x6d8b5020, + 0x376ac: 0x6d8b5220, 0x376ad: 0x6d8b5420, 0x376ae: 0x6d8b5620, 0x376af: 0x6d8b5820, + 0x376b0: 0x6d8b5a20, 0x376b1: 0x6d8b5c20, 0x376b2: 0x6d8b5e20, 0x376b3: 0x6d8b6020, + 0x376b4: 0x6d8b6220, 0x376b5: 0x6d8b6420, 0x376b6: 0x6d8b6620, 0x376b7: 0x6d8b6820, + 0x376b8: 0x6d8b6a20, 0x376b9: 0x6d8b6c20, 0x376ba: 0x6d8b6e20, 0x376bb: 0x6d8b7020, + 0x376bc: 0x6d8b7220, 0x376bd: 0x6d8b7420, 0x376be: 0x6d8b7620, 0x376bf: 0x6d8b7820, + // Block 0xddb, offset 0x376c0 + 0x376c0: 0x6d8b7a20, 0x376c1: 0x6d8b7c20, 0x376c2: 0x6daf7a20, 0x376c3: 0x6d8b7e20, + 0x376c4: 0x6d8b8020, 0x376c5: 0x6d8b8220, 0x376c6: 0x6d8b8420, 0x376c7: 0x6d8b8620, + 0x376c8: 0x6d8b8820, 0x376c9: 0x6daf7c20, 0x376ca: 0x6daf7e20, 0x376cb: 0x6daf8020, + 0x376cc: 0x6daf8220, 0x376cd: 0x6daf8420, 0x376ce: 0x6daf8620, 0x376cf: 0x6daf8820, + 0x376d0: 0x6daf8a20, 0x376d1: 0x6daf8c20, 0x376d2: 0x6daf8e20, 0x376d3: 0x6daf9020, + 0x376d4: 0x6daf9220, 0x376d5: 0x6daf9420, 0x376d6: 0x6daf9620, 0x376d7: 0x6daf9820, + 0x376d8: 0x6daf9a20, 0x376d9: 0x6daf9c20, 0x376da: 0x6daf9e20, 0x376db: 0x6dafa020, + 0x376dc: 0x6dafa220, 0x376dd: 0x6dafa420, 0x376de: 0x6dafa620, 0x376df: 0x6dafa820, + 0x376e0: 0x6dafaa20, 0x376e1: 0x6dafac20, 0x376e2: 0x6dafae20, 0x376e3: 0x6dafb020, + 0x376e4: 0x6dafb220, 0x376e5: 0x6dafb420, 0x376e6: 0x6dafb620, 0x376e7: 0x6dafb820, + 0x376e8: 0x6dafba20, 0x376e9: 0x6dafbc20, 0x376ea: 0x6dafbe20, 0x376eb: 0x6dafc020, + 0x376ec: 0x6dafc220, 0x376ed: 0x6dafc420, 0x376ee: 0x6dafc620, 0x376ef: 0x6dafc820, + 0x376f0: 0x6dafca20, 0x376f1: 0x6dafcc20, 0x376f2: 0x6dafce20, 0x376f3: 0x6dafd020, + 0x376f4: 0x6dafd220, 0x376f5: 0x6dafd420, 0x376f6: 0x6dafd620, 0x376f7: 0x6dafd820, + 0x376f8: 0x6dafda20, 0x376f9: 0x6dafdc20, 0x376fa: 0x6dafde20, 0x376fb: 0x6dafe020, + 0x376fc: 0x6dcf0020, 0x376fd: 0x6dcf0220, 0x376fe: 0x6dcf0420, 0x376ff: 0x6dcf0620, + // Block 0xddc, offset 0x37700 + 0x37700: 0x6dcf0820, 0x37701: 0x6dcf0a20, 0x37702: 0x6dcf0c20, 0x37703: 0x6dcf0e20, + 0x37704: 0x6dcf1020, 0x37705: 0x6dcf1220, 0x37706: 0x6dcf1420, 0x37707: 0x6dcf1620, + 0x37708: 0x6dcf1820, 0x37709: 0x6dcf1a20, 0x3770a: 0x6dcf1c20, 0x3770b: 0x6dcf1e20, + 0x3770c: 0x6dcf2020, 0x3770d: 0x6dcf2220, 0x3770e: 0x6dcf2420, 0x3770f: 0x6dcf2620, + 0x37710: 0x6dcf2820, 0x37711: 0x6dcf2a20, 0x37712: 0x6dcf2c20, 0x37713: 0x6dcf2e20, + 0x37714: 0x6dcf3020, 0x37715: 0x6dcf3220, 0x37716: 0x6dcf3420, 0x37717: 0x6dcf3620, + 0x37718: 0x6dcf3820, 0x37719: 0x6dcf3a20, 0x3771a: 0x6dcf3c20, 0x3771b: 0x6dcf3e20, + 0x3771c: 0x6dcf4020, 0x3771d: 0x6dcf4220, 0x3771e: 0x6dcf4420, 0x3771f: 0x6dcf4620, + 0x37720: 0x6dcf4820, 0x37721: 0x6dcf4a20, 0x37722: 0x6dcf4c20, 0x37723: 0x6dcf4e20, + 0x37724: 0x6dcf5020, 0x37725: 0x6dcf5220, 0x37726: 0x6dcf5420, 0x37727: 0x6dcf5620, + 0x37728: 0x6dcf5820, 0x37729: 0x6dcf5a20, 0x3772a: 0x6dcf5c20, 0x3772b: 0x6dcf5e20, + 0x3772c: 0x6dcf6020, 0x3772d: 0x6dcf6220, 0x3772e: 0x6dcf6420, 0x3772f: 0x6dcf6620, + 0x37730: 0x6dcf6820, 0x37731: 0x6dcf6a20, 0x37732: 0x6dcf6c20, 0x37733: 0x6dcf6e20, + 0x37734: 0x6dcf7020, 0x37735: 0x6de94220, 0x37736: 0x6de94420, 0x37737: 0x6de94620, + 0x37738: 0x6de94820, 0x37739: 0x6de94a20, 0x3773a: 0x6de94c20, 0x3773b: 0x6de94e20, + 0x3773c: 0x6de95020, 0x3773d: 0x6de95220, 0x3773e: 0x6de95420, 0x3773f: 0x6de95620, + // Block 0xddd, offset 0x37740 + 0x37740: 0x6de95820, 0x37741: 0x6de95a20, 0x37742: 0x6de95c20, 0x37743: 0x6de95e20, + 0x37744: 0x6de96020, 0x37745: 0x6de96220, 0x37746: 0x6de96420, 0x37747: 0x6de96620, + 0x37748: 0x6de96820, 0x37749: 0x6de96a20, 0x3774a: 0x6de96c20, 0x3774b: 0x6de96e20, + 0x3774c: 0x6de97020, 0x3774d: 0x6de97220, 0x3774e: 0x6de97420, 0x3774f: 0x6de97620, + 0x37750: 0x6de97820, 0x37751: 0x6de97a20, 0x37752: 0x6de97c20, 0x37753: 0x6de97e20, + 0x37754: 0x6de98020, 0x37755: 0x6de98220, 0x37756: 0x6de98420, 0x37757: 0x6de98620, + 0x37758: 0x6de98820, 0x37759: 0x6de98a20, 0x3775a: 0x6de98c20, 0x3775b: 0x6de98e20, + 0x3775c: 0x6dff5420, 0x3775d: 0x6dff5620, 0x3775e: 0x6dff5820, 0x3775f: 0x6dff5a20, + 0x37760: 0x6dff5c20, 0x37761: 0x6dff5e20, 0x37762: 0x6dff6020, 0x37763: 0x6dff6220, + 0x37764: 0x6e11c420, 0x37765: 0x6de99020, 0x37766: 0x6dff6420, 0x37767: 0x6dff6620, + 0x37768: 0x6e11c620, 0x37769: 0x6dff6820, 0x3776a: 0x6dff6a20, 0x3776b: 0x6e11c820, + 0x3776c: 0x6dff6c20, 0x3776d: 0x6dff6e20, 0x3776e: 0x6dff7020, 0x3776f: 0x6dff7220, + 0x37770: 0x6dff7420, 0x37771: 0x6dff7620, 0x37772: 0x6dff7820, 0x37773: 0x6dff7a20, + 0x37774: 0x6dff7c20, 0x37775: 0x6dff7e20, 0x37776: 0x6dff8020, 0x37777: 0x6dff8220, + 0x37778: 0x6dff8420, 0x37779: 0x6dff8620, 0x3777a: 0x6dff8820, 0x3777b: 0x6e11ca20, + 0x3777c: 0x6e11cc20, 0x3777d: 0x6e11ce20, 0x3777e: 0x6e11d020, 0x3777f: 0x6e11d220, + // Block 0xdde, offset 0x37780 + 0x37780: 0x6e11d420, 0x37781: 0x6e11d620, 0x37782: 0x6e200c20, 0x37783: 0x6e11d820, + 0x37784: 0x6e11da20, 0x37785: 0x6e11dc20, 0x37786: 0x6e11de20, 0x37787: 0x6e11e020, + 0x37788: 0x6e11e220, 0x37789: 0x6e11e420, 0x3778a: 0x6e11e620, 0x3778b: 0x6e11e820, + 0x3778c: 0x6e11ea20, 0x3778d: 0x6e11ec20, 0x3778e: 0x6e11ee20, 0x3778f: 0x6e11f020, + 0x37790: 0x6e11f220, 0x37791: 0x6e11f420, 0x37792: 0x6e11f620, 0x37793: 0x6e11f820, + 0x37794: 0x6e200e20, 0x37795: 0x6e201020, 0x37796: 0x6e201220, 0x37797: 0x6e201420, + 0x37798: 0x6e201620, 0x37799: 0x6e201820, 0x3779a: 0x6e201a20, 0x3779b: 0x6e201c20, + 0x3779c: 0x6e201e20, 0x3779d: 0x6e202020, 0x3779e: 0x6e202220, 0x3779f: 0x6e202420, + 0x377a0: 0x6e202620, 0x377a1: 0x6e202820, 0x377a2: 0x6e202a20, 0x377a3: 0x6e202c20, + 0x377a4: 0x6e202e20, 0x377a5: 0x6e203020, 0x377a6: 0x6e203220, 0x377a7: 0x6e2b1e20, + 0x377a8: 0x6e2b2020, 0x377a9: 0x6e2b2220, 0x377aa: 0x6e2b2420, 0x377ab: 0x6e2b2620, + 0x377ac: 0x6e2b2820, 0x377ad: 0x6e2b2a20, 0x377ae: 0x6e2b2c20, 0x377af: 0x6e2b2e20, + 0x377b0: 0x6e339420, 0x377b1: 0x6e339620, 0x377b2: 0x6e339820, 0x377b3: 0x6e339a20, + 0x377b4: 0x6e339c20, 0x377b5: 0x6e339e20, 0x377b6: 0x6e33a020, 0x377b7: 0x6e33a220, + 0x377b8: 0x6e39a020, 0x377b9: 0x6e33a420, 0x377ba: 0x6e39a220, 0x377bb: 0x6e39a420, + 0x377bc: 0x6e3dce20, 0x377bd: 0x6e3dd020, 0x377be: 0x6e40aa20, 0x377bf: 0x6e40ac20, + // Block 0xddf, offset 0x377c0 + 0x377c0: 0x6e40ae20, 0x377c1: 0x6e40b020, 0x377c2: 0x6e40b220, 0x377c3: 0x6e42e020, + 0x377c4: 0x6e42e220, 0x377c5: 0x6e445c20, 0x377c6: 0x6e453c20, 0x377c7: 0x6e45ca20, + 0x377c8: 0x6c3dfa20, 0x377c9: 0x6c5cb820, 0x377ca: 0x6c80b020, 0x377cb: 0x6c80b220, + 0x377cc: 0x6c80b420, 0x377cd: 0x6ca9d420, 0x377ce: 0x6ca9d620, 0x377cf: 0x6ca9d820, + 0x377d0: 0x6ca9da20, 0x377d1: 0x6cd84020, 0x377d2: 0x6cd84220, 0x377d3: 0x6cd84420, + 0x377d4: 0x6cd84620, 0x377d5: 0x6cd84820, 0x377d6: 0x6d06e620, 0x377d7: 0x6d06e820, + 0x377d8: 0x6d06ea20, 0x377d9: 0x6d06ec20, 0x377da: 0x6d34d620, 0x377db: 0x6d618820, + 0x377dc: 0x6d618a20, 0x377dd: 0x6d618c20, 0x377de: 0x6d8ba020, 0x377df: 0x6d8ba220, + 0x377e0: 0x6dafec20, 0x377e1: 0x6dafee20, 0x377e2: 0x6c143220, 0x377e3: 0x6c5cc820, + 0x377e4: 0x6c5cca20, 0x377e5: 0x6c5ccc20, 0x377e6: 0x6c80cc20, 0x377e7: 0x6c80ce20, + 0x377e8: 0x6c80d020, 0x377e9: 0x6ca9f220, 0x377ea: 0x6ca9f420, 0x377eb: 0x6ca9f620, + 0x377ec: 0x6ca9f820, 0x377ed: 0x6ca9fa20, 0x377ee: 0x6ca9fc20, 0x377ef: 0x6cd85a20, + 0x377f0: 0x6cd85c20, 0x377f1: 0x6cd85e20, 0x377f2: 0x6cd86020, 0x377f3: 0x6cd86220, + 0x377f4: 0x6d06f220, 0x377f5: 0x6d06f420, 0x377f6: 0x6d06f620, 0x377f7: 0x6d06f820, + 0x377f8: 0x6d34e820, 0x377f9: 0x6d34ea20, 0x377fa: 0x6d34ec20, 0x377fb: 0x6d34ee20, + 0x377fc: 0x6d34f020, 0x377fd: 0x6d34f220, 0x377fe: 0x6d34f420, 0x377ff: 0x6d34f620, + // Block 0xde0, offset 0x37800 + 0x37800: 0x6d34f820, 0x37801: 0x6d619220, 0x37802: 0x6d619420, 0x37803: 0x6d619620, + 0x37804: 0x6d619820, 0x37805: 0x6d619a20, 0x37806: 0x6d619c20, 0x37807: 0x6d619e20, + 0x37808: 0x6d8baa20, 0x37809: 0x6d8bac20, 0x3780a: 0x6d8bae20, 0x3780b: 0x6d8bb020, + 0x3780c: 0x6d8bb220, 0x3780d: 0x6d8bb420, 0x3780e: 0x6d8bb620, 0x3780f: 0x6daffa20, + 0x37810: 0x6daffc20, 0x37811: 0x6daffe20, 0x37812: 0x6db00020, 0x37813: 0x6db00220, + 0x37814: 0x6db00420, 0x37815: 0x6dcf8220, 0x37816: 0x6dcf8420, 0x37817: 0x6dcf8620, + 0x37818: 0x6dcf8820, 0x37819: 0x6de9aa20, 0x3781a: 0x6de9ac20, 0x3781b: 0x6de9ae20, + 0x3781c: 0x6de9b020, 0x3781d: 0x6dff9220, 0x3781e: 0x6dff9420, 0x3781f: 0x6e120420, + 0x37820: 0x6e120620, 0x37821: 0x6e203e20, 0x37822: 0x6e2b3420, 0x37823: 0x6e2b3620, + 0x37824: 0x6e2b3820, 0x37825: 0x6e33aa20, 0x37826: 0x6e33ac20, 0x37827: 0x6e3dd420, + 0x37828: 0x6e40b620, 0x37829: 0x6e45cc20, 0x3782a: 0x6c0a4c20, 0x3782b: 0x6c0a4e20, + 0x3782c: 0x6c25cc20, 0x3782d: 0x6c0a5020, 0x3782e: 0x6c25ce20, 0x3782f: 0x6c143620, + 0x37830: 0x6c0a5220, 0x37831: 0x6c25d020, 0x37832: 0x6c25d220, 0x37833: 0x6c25d420, + 0x37834: 0x6c25d620, 0x37835: 0x6c25d820, 0x37836: 0x6c25da20, 0x37837: 0x6c3e0a20, + 0x37838: 0x6c3e0c20, 0x37839: 0x6c3e0e20, 0x3783a: 0x6c3e1020, 0x3783b: 0x6c3e1220, + 0x3783c: 0x6c3e1420, 0x3783d: 0x6c3e1620, 0x3783e: 0x6c3e1820, 0x3783f: 0x6c3e1a20, + // Block 0xde1, offset 0x37840 + 0x37840: 0x6c3e1c20, 0x37841: 0x6c5cda20, 0x37842: 0x6c5cdc20, 0x37843: 0x6c5cde20, + 0x37844: 0x6c5ce020, 0x37845: 0x6c5ce220, 0x37846: 0x6c5ce420, 0x37847: 0x6c5ce620, + 0x37848: 0x6c5ce820, 0x37849: 0x6c5cea20, 0x3784a: 0x6c5cec20, 0x3784b: 0x6c5cee20, + 0x3784c: 0x6c5cf020, 0x3784d: 0x6c5cf220, 0x3784e: 0x6c80e820, 0x3784f: 0x6c80ea20, + 0x37850: 0x6c80ec20, 0x37851: 0x6c80ee20, 0x37852: 0x6c80f020, 0x37853: 0x6c80f220, + 0x37854: 0x6c80f420, 0x37855: 0x6c80f620, 0x37856: 0x6c80f820, 0x37857: 0x6c80fa20, + 0x37858: 0x6c80fc20, 0x37859: 0x6c80fe20, 0x3785a: 0x6c810020, 0x3785b: 0x6c810220, + 0x3785c: 0x6c810420, 0x3785d: 0x6c810620, 0x3785e: 0x6c810820, 0x3785f: 0x6c810a20, + 0x37860: 0x6c810c20, 0x37861: 0x6c810e20, 0x37862: 0x6c811020, 0x37863: 0x6c811220, + 0x37864: 0x6c6dd220, 0x37865: 0x6c811420, 0x37866: 0x6c811620, 0x37867: 0x6c811820, + 0x37868: 0x6c811a20, 0x37869: 0x6c811c20, 0x3786a: 0x6caa0220, 0x3786b: 0x6caa0420, + 0x3786c: 0x6caa0620, 0x3786d: 0x6caa0820, 0x3786e: 0x6caa0a20, 0x3786f: 0x6caa0c20, + 0x37870: 0x6caa0e20, 0x37871: 0x6caa1020, 0x37872: 0x6caa1220, 0x37873: 0x6c811e20, + 0x37874: 0x6caa1420, 0x37875: 0x6caa1620, 0x37876: 0x6caa1820, 0x37877: 0x6caa1a20, + 0x37878: 0x6caa1c20, 0x37879: 0x6caa1e20, 0x3787a: 0x6caa2020, 0x3787b: 0x6caa2220, + 0x3787c: 0x6cd86e20, 0x3787d: 0x6cd87020, 0x3787e: 0x6cd87220, 0x3787f: 0x6cd87420, + // Block 0xde2, offset 0x37880 + 0x37880: 0x6cd87620, 0x37881: 0x6cd87820, 0x37882: 0x6cd87a20, 0x37883: 0x6cd87c20, + 0x37884: 0x6cd87e20, 0x37885: 0x6d071420, 0x37886: 0x6d071620, 0x37887: 0x6d071820, + 0x37888: 0x6d071a20, 0x37889: 0x6d071c20, 0x3788a: 0x6d071e20, 0x3788b: 0x6d072020, + 0x3788c: 0x6d072220, 0x3788d: 0x6d072420, 0x3788e: 0x6d072620, 0x3788f: 0x6d072820, + 0x37890: 0x6d072a20, 0x37891: 0x6cd88020, 0x37892: 0x6d072c20, 0x37893: 0x6d072e20, + 0x37894: 0x6d073020, 0x37895: 0x6d073220, 0x37896: 0x6d073420, 0x37897: 0x6d073620, + 0x37898: 0x6d073820, 0x37899: 0x6d073a20, 0x3789a: 0x6d073c20, 0x3789b: 0x6d073e20, + 0x3789c: 0x6d074020, 0x3789d: 0x6d350a20, 0x3789e: 0x6d350c20, 0x3789f: 0x6d350e20, + 0x378a0: 0x6d351020, 0x378a1: 0x6d351220, 0x378a2: 0x6d351420, 0x378a3: 0x6d351620, + 0x378a4: 0x6d351820, 0x378a5: 0x6d351a20, 0x378a6: 0x6d351c20, 0x378a7: 0x6d351e20, + 0x378a8: 0x6d352020, 0x378a9: 0x6d352220, 0x378aa: 0x6d217020, 0x378ab: 0x6d352420, + 0x378ac: 0x6d352620, 0x378ad: 0x6d352820, 0x378ae: 0x6d352a20, 0x378af: 0x6d61ac20, + 0x378b0: 0x6d61ae20, 0x378b1: 0x6d61b020, 0x378b2: 0x6d61b220, 0x378b3: 0x6d61b420, + 0x378b4: 0x6d61b620, 0x378b5: 0x6d61b820, 0x378b6: 0x6d61ba20, 0x378b7: 0x6d61bc20, + 0x378b8: 0x6d61be20, 0x378b9: 0x6d61c020, 0x378ba: 0x6d61c220, 0x378bb: 0x6d61c420, + 0x378bc: 0x6d61c620, 0x378bd: 0x6d8bc620, 0x378be: 0x6d8bc820, 0x378bf: 0x6d8bca20, + // Block 0xde3, offset 0x378c0 + 0x378c0: 0x6d8bcc20, 0x378c1: 0x6d8bce20, 0x378c2: 0x6d8bd020, 0x378c3: 0x6d8bd220, + 0x378c4: 0x6d8bd420, 0x378c5: 0x6d8bd620, 0x378c6: 0x6d8bd820, 0x378c7: 0x6d8bda20, + 0x378c8: 0x6d8bdc20, 0x378c9: 0x6d8bde20, 0x378ca: 0x6d8be020, 0x378cb: 0x6d8be220, + 0x378cc: 0x6d8be420, 0x378cd: 0x6d8be620, 0x378ce: 0x6d8be820, 0x378cf: 0x6d8bea20, + 0x378d0: 0x6d8bec20, 0x378d1: 0x6d8bee20, 0x378d2: 0x6db01020, 0x378d3: 0x6db01220, + 0x378d4: 0x6db01420, 0x378d5: 0x6db01620, 0x378d6: 0x6db01820, 0x378d7: 0x6db01a20, + 0x378d8: 0x6db01c20, 0x378d9: 0x6db01e20, 0x378da: 0x6db02020, 0x378db: 0x6db02220, + 0x378dc: 0x6db02420, 0x378dd: 0x6db02620, 0x378de: 0x6db02820, 0x378df: 0x6dcf9020, + 0x378e0: 0x6dcf9220, 0x378e1: 0x6dcf9420, 0x378e2: 0x6dcf9620, 0x378e3: 0x6dcf9820, + 0x378e4: 0x6dcf9a20, 0x378e5: 0x6dcf9c20, 0x378e6: 0x6dcf9e20, 0x378e7: 0x6dcfa020, + 0x378e8: 0x6dcfa220, 0x378e9: 0x6dcfb220, 0x378ea: 0x6de9be20, 0x378eb: 0x6de9c020, + 0x378ec: 0x6de9c220, 0x378ed: 0x6de9c420, 0x378ee: 0x6de9c620, 0x378ef: 0x6de9c820, + 0x378f0: 0x6de9ca20, 0x378f1: 0x6de9cc20, 0x378f2: 0x6de9ce20, 0x378f3: 0x6de9d020, + 0x378f4: 0x6de9d220, 0x378f5: 0x6dff9620, 0x378f6: 0x6dff9820, 0x378f7: 0x6dff9a20, + 0x378f8: 0x6dff9c20, 0x378f9: 0x6dff9e20, 0x378fa: 0x6dffa020, 0x378fb: 0x6e120a20, + 0x378fc: 0x6e120c20, 0x378fd: 0x6e2b3a20, 0x378fe: 0x6e33b420, 0x378ff: 0x6e33b620, + // Block 0xde4, offset 0x37900 + 0x37900: 0x6e33b820, 0x37901: 0x6e33ba20, 0x37902: 0x6e33bc20, 0x37903: 0x6e33be20, + 0x37904: 0x6e33c020, 0x37905: 0x6e33c220, 0x37906: 0x6e3dd620, 0x37907: 0x6e40b820, + 0x37908: 0x6e42e420, 0x37909: 0x6e42e620, 0x3790a: 0x6e42e820, 0x3790b: 0x6c143c20, + 0x3790c: 0x6c143e20, 0x3790d: 0x6c144020, 0x3790e: 0x6c3e2620, 0x3790f: 0x6c3e2820, + 0x37910: 0x6c3e2a20, 0x37911: 0x6c5cfe20, 0x37912: 0x6c5d0020, 0x37913: 0x6c5d0220, + 0x37914: 0x6c5d0420, 0x37915: 0x6c5d0620, 0x37916: 0x6c5d0820, 0x37917: 0x6c813820, + 0x37918: 0x6c813a20, 0x37919: 0x6c813c20, 0x3791a: 0x6c813e20, 0x3791b: 0x6c814020, + 0x3791c: 0x6c814220, 0x3791d: 0x6c814420, 0x3791e: 0x6c814620, 0x3791f: 0x6c814820, + 0x37920: 0x6c814a20, 0x37921: 0x6c814c20, 0x37922: 0x6c814e20, 0x37923: 0x6c815020, + 0x37924: 0x6c815220, 0x37925: 0x6caa4020, 0x37926: 0x6caa4220, 0x37927: 0x6caa4420, + 0x37928: 0x6caa4620, 0x37929: 0x6caa4820, 0x3792a: 0x6caa4a20, 0x3792b: 0x6caa4c20, + 0x3792c: 0x6caa4e20, 0x3792d: 0x6caa5020, 0x3792e: 0x6c815420, 0x3792f: 0x6caa5220, + 0x37930: 0x6caa5420, 0x37931: 0x6caa5620, 0x37932: 0x6caa5820, 0x37933: 0x6caa5a20, + 0x37934: 0x6caa5c20, 0x37935: 0x6caa5e20, 0x37936: 0x6caa6020, 0x37937: 0x6caa6220, + 0x37938: 0x6caa6420, 0x37939: 0x6cd88e20, 0x3793a: 0x6cd89020, 0x3793b: 0x6cd89220, + 0x3793c: 0x6cd89420, 0x3793d: 0x6cd89620, 0x3793e: 0x6cd89820, 0x3793f: 0x6cd89a20, + // Block 0xde5, offset 0x37940 + 0x37940: 0x6cd89c20, 0x37941: 0x6cd89e20, 0x37942: 0x6cd8a020, 0x37943: 0x6cd8a220, + 0x37944: 0x6cd8a420, 0x37945: 0x6cba3e20, 0x37946: 0x6d075820, 0x37947: 0x6d075a20, + 0x37948: 0x6d075c20, 0x37949: 0x6d075e20, 0x3794a: 0x6d076020, 0x3794b: 0x6d076220, + 0x3794c: 0x6d076420, 0x3794d: 0x6d076620, 0x3794e: 0x6d076820, 0x3794f: 0x6d076a20, + 0x37950: 0x6d076c20, 0x37951: 0x6d076e20, 0x37952: 0x6d077020, 0x37953: 0x6d077220, + 0x37954: 0x6d077420, 0x37955: 0x6d077620, 0x37956: 0x6d077820, 0x37957: 0x6d353a20, + 0x37958: 0x6d353c20, 0x37959: 0x6d353e20, 0x3795a: 0x6d354020, 0x3795b: 0x6d354220, + 0x3795c: 0x6d354420, 0x3795d: 0x6d354620, 0x3795e: 0x6d354820, 0x3795f: 0x6d354a20, + 0x37960: 0x6d354c20, 0x37961: 0x6d354e20, 0x37962: 0x6d61d620, 0x37963: 0x6d61d820, + 0x37964: 0x6d61da20, 0x37965: 0x6d61dc20, 0x37966: 0x6d61de20, 0x37967: 0x6d61e020, + 0x37968: 0x6d61e220, 0x37969: 0x6d61e420, 0x3796a: 0x6d61e620, 0x3796b: 0x6d61e820, + 0x3796c: 0x6d61ea20, 0x3796d: 0x6d61ec20, 0x3796e: 0x6d61ee20, 0x3796f: 0x6d8bfa20, + 0x37970: 0x6d8bfc20, 0x37971: 0x6d8bfe20, 0x37972: 0x6d8c0020, 0x37973: 0x6d8c0220, + 0x37974: 0x6d8c0420, 0x37975: 0x6d8c0620, 0x37976: 0x6d8c0820, 0x37977: 0x6db02e20, + 0x37978: 0x6db03020, 0x37979: 0x6db03220, 0x3797a: 0x6db03420, 0x3797b: 0x6db03620, + 0x3797c: 0x6db03820, 0x3797d: 0x6db03a20, 0x3797e: 0x6db03c20, 0x3797f: 0x6db03e20, + // Block 0xde6, offset 0x37980 + 0x37980: 0x6db04020, 0x37981: 0x6db04220, 0x37982: 0x6db04420, 0x37983: 0x6db04620, + 0x37984: 0x6db04820, 0x37985: 0x6dcfb420, 0x37986: 0x6dcfb620, 0x37987: 0x6dcfb820, + 0x37988: 0x6dcfba20, 0x37989: 0x6dcfbc20, 0x3798a: 0x6dcfbe20, 0x3798b: 0x6dcfc020, + 0x3798c: 0x6dcfc220, 0x3798d: 0x6dcfc420, 0x3798e: 0x6dcfc620, 0x3798f: 0x6dcfc820, + 0x37990: 0x6dcfca20, 0x37991: 0x6dcfcc20, 0x37992: 0x6dcfce20, 0x37993: 0x6dcfd020, + 0x37994: 0x6dcfd220, 0x37995: 0x6de9de20, 0x37996: 0x6de9e020, 0x37997: 0x6de9e220, + 0x37998: 0x6de9e420, 0x37999: 0x6de9e620, 0x3799a: 0x6de9e820, 0x3799b: 0x6de9ea20, + 0x3799c: 0x6dffa420, 0x3799d: 0x6dffa620, 0x3799e: 0x6dffa820, 0x3799f: 0x6dffaa20, + 0x379a0: 0x6dffac20, 0x379a1: 0x6dffae20, 0x379a2: 0x6e121620, 0x379a3: 0x6e121820, + 0x379a4: 0x6e121a20, 0x379a5: 0x6e121c20, 0x379a6: 0x6e121e20, 0x379a7: 0x6e122020, + 0x379a8: 0x6e204420, 0x379a9: 0x6e204620, 0x379aa: 0x6e2b3c20, 0x379ab: 0x6e2b3e20, + 0x379ac: 0x6e33c420, 0x379ad: 0x6e39a820, 0x379ae: 0x6e3dd820, 0x379af: 0x6e40bc20, + 0x379b0: 0x6e453e20, 0x379b1: 0x6e454020, 0x379b2: 0x6c3e2e20, 0x379b3: 0x6c25de20, + 0x379b4: 0x6c5d1020, 0x379b5: 0x6c5d1220, 0x379b6: 0x6c5d1420, 0x379b7: 0x6c5d1620, + 0x379b8: 0x6c5d1820, 0x379b9: 0x6c5d1a20, 0x379ba: 0x6c5d1c20, 0x379bb: 0x6c5d1e20, + 0x379bc: 0x6c5d2020, 0x379bd: 0x6c5d2220, 0x379be: 0x6c5d2420, 0x379bf: 0x6c5d2620, + // Block 0xde7, offset 0x379c0 + 0x379c0: 0x6c5d2820, 0x379c1: 0x6c5d2a20, 0x379c2: 0x6c816820, 0x379c3: 0x6c816a20, + 0x379c4: 0x6c816c20, 0x379c5: 0x6c816e20, 0x379c6: 0x6c817020, 0x379c7: 0x6c817220, + 0x379c8: 0x6c817420, 0x379c9: 0x6c817620, 0x379ca: 0x6c817820, 0x379cb: 0x6c817a20, + 0x379cc: 0x6c817c20, 0x379cd: 0x6c817e20, 0x379ce: 0x6c818020, 0x379cf: 0x6c818220, + 0x379d0: 0x6c818420, 0x379d1: 0x6c818620, 0x379d2: 0x6c818820, 0x379d3: 0x6c818a20, + 0x379d4: 0x6c818c20, 0x379d5: 0x6caa9420, 0x379d6: 0x6caa9620, 0x379d7: 0x6caa9820, + 0x379d8: 0x6caa9a20, 0x379d9: 0x6caa9c20, 0x379da: 0x6caa9e20, 0x379db: 0x6caaa020, + 0x379dc: 0x6caaa220, 0x379dd: 0x6caaa420, 0x379de: 0x6caaa620, 0x379df: 0x6caaa820, + 0x379e0: 0x6caaaa20, 0x379e1: 0x6caaac20, 0x379e2: 0x6caaae20, 0x379e3: 0x6cd8c220, + 0x379e4: 0x6cd8c420, 0x379e5: 0x6cd8c620, 0x379e6: 0x6cd8c820, 0x379e7: 0x6cd8ca20, + 0x379e8: 0x6cd8cc20, 0x379e9: 0x6cd8ce20, 0x379ea: 0x6cd8d020, 0x379eb: 0x6cd8d220, + 0x379ec: 0x6cd8d420, 0x379ed: 0x6cd8d620, 0x379ee: 0x6cd8d820, 0x379ef: 0x6cd8da20, + 0x379f0: 0x6cd8dc20, 0x379f1: 0x6cd8de20, 0x379f2: 0x6cd8e020, 0x379f3: 0x6cd8e220, + 0x379f4: 0x6cd8e420, 0x379f5: 0x6cd8e620, 0x379f6: 0x6cd8e820, 0x379f7: 0x6cd8ea20, + 0x379f8: 0x6d078a20, 0x379f9: 0x6d078c20, 0x379fa: 0x6d078e20, 0x379fb: 0x6d079020, + 0x379fc: 0x6d079220, 0x379fd: 0x6d079420, 0x379fe: 0x6d079620, 0x379ff: 0x6d079820, + // Block 0xde8, offset 0x37a00 + 0x37a00: 0x6d079a20, 0x37a01: 0x6d079c20, 0x37a02: 0x6d079e20, 0x37a03: 0x6d07a020, + 0x37a04: 0x6d07a220, 0x37a05: 0x6d356820, 0x37a06: 0x6d07a420, 0x37a07: 0x6d356a20, + 0x37a08: 0x6d356c20, 0x37a09: 0x6d356e20, 0x37a0a: 0x6d357020, 0x37a0b: 0x6d357220, + 0x37a0c: 0x6d357420, 0x37a0d: 0x6d357620, 0x37a0e: 0x6d357820, 0x37a0f: 0x6d357a20, + 0x37a10: 0x6d357c20, 0x37a11: 0x6d231e20, 0x37a12: 0x6d357e20, 0x37a13: 0x6d358020, + 0x37a14: 0x6d358220, 0x37a15: 0x6d358420, 0x37a16: 0x6d358620, 0x37a17: 0x6d358820, + 0x37a18: 0x6d620620, 0x37a19: 0x6d620820, 0x37a1a: 0x6d620a20, 0x37a1b: 0x6d620c20, + 0x37a1c: 0x6d620e20, 0x37a1d: 0x6d621020, 0x37a1e: 0x6d621220, 0x37a1f: 0x6d621420, + 0x37a20: 0x6d621620, 0x37a21: 0x6d621820, 0x37a22: 0x6d621a20, 0x37a23: 0x6d621c20, + 0x37a24: 0x6d621e20, 0x37a25: 0x6d622020, 0x37a26: 0x6d622220, 0x37a27: 0x6d622420, + 0x37a28: 0x6d622620, 0x37a29: 0x6d622820, 0x37a2a: 0x6d622a20, 0x37a2b: 0x6d622c20, + 0x37a2c: 0x6d622e20, 0x37a2d: 0x6d623020, 0x37a2e: 0x6d623220, 0x37a2f: 0x6d623420, + 0x37a30: 0x6d8c1820, 0x37a31: 0x6d8c1a20, 0x37a32: 0x6d8c1c20, 0x37a33: 0x6d8c1e20, + 0x37a34: 0x6d8c2020, 0x37a35: 0x6d8c2220, 0x37a36: 0x6d8c2420, 0x37a37: 0x6d8c2620, + 0x37a38: 0x6d8c2820, 0x37a39: 0x6d8c2a20, 0x37a3a: 0x6d8c2c20, 0x37a3b: 0x6d623620, + 0x37a3c: 0x6d8c2e20, 0x37a3d: 0x6d8c3020, 0x37a3e: 0x6d8c3220, 0x37a3f: 0x6d8c3420, + // Block 0xde9, offset 0x37a40 + 0x37a40: 0x6d8c3620, 0x37a41: 0x6d8c3820, 0x37a42: 0x6d8c3a20, 0x37a43: 0x6db05c20, + 0x37a44: 0x6db05e20, 0x37a45: 0x6db06020, 0x37a46: 0x6db06220, 0x37a47: 0x6db06420, + 0x37a48: 0x6db06620, 0x37a49: 0x6db06820, 0x37a4a: 0x6db06a20, 0x37a4b: 0x6db06c20, + 0x37a4c: 0x6db06e20, 0x37a4d: 0x6dcfe820, 0x37a4e: 0x6dcfea20, 0x37a4f: 0x6dcfec20, + 0x37a50: 0x6dcfee20, 0x37a51: 0x6dcff020, 0x37a52: 0x6dcff220, 0x37a53: 0x6dcff420, + 0x37a54: 0x6dcff620, 0x37a55: 0x6dcff820, 0x37a56: 0x6dcffa20, 0x37a57: 0x6dcffc20, + 0x37a58: 0x6dcffe20, 0x37a59: 0x6dd00020, 0x37a5a: 0x6dd00220, 0x37a5b: 0x6dd00420, + 0x37a5c: 0x6de9f020, 0x37a5d: 0x6de9f220, 0x37a5e: 0x6d8c3c20, 0x37a5f: 0x6dd00620, + 0x37a60: 0x6de9f420, 0x37a61: 0x6de9f620, 0x37a62: 0x6dffb820, 0x37a63: 0x6dffba20, + 0x37a64: 0x6dffbc20, 0x37a65: 0x6dffbe20, 0x37a66: 0x6e122420, 0x37a67: 0x6e204c20, + 0x37a68: 0x6e122620, 0x37a69: 0x6e122820, 0x37a6a: 0x6dffc020, 0x37a6b: 0x6dffc220, + 0x37a6c: 0x6e122a20, 0x37a6d: 0x6e204e20, 0x37a6e: 0x6e205020, 0x37a6f: 0x6e205220, + 0x37a70: 0x6e33c620, 0x37a71: 0x6c25e020, 0x37a72: 0x6c25e220, 0x37a73: 0x6c3e3020, + 0x37a74: 0x6c3e3220, 0x37a75: 0x6c3e3420, 0x37a76: 0x6c5d3020, 0x37a77: 0x6c5d3220, + 0x37a78: 0x6c5d3420, 0x37a79: 0x6c5d3620, 0x37a7a: 0x6c819420, 0x37a7b: 0x6c819620, + 0x37a7c: 0x6c819820, 0x37a7d: 0x6c819a20, 0x37a7e: 0x6c819c20, 0x37a7f: 0x6c819e20, + // Block 0xdea, offset 0x37a80 + 0x37a80: 0x6caab620, 0x37a81: 0x6d07aa20, 0x37a82: 0x6d358e20, 0x37a83: 0x6db07220, + 0x37a84: 0x6d623c20, 0x37a85: 0x6d623e20, 0x37a86: 0x6d8c4220, 0x37a87: 0x6d8c4420, + 0x37a88: 0x6db07420, 0x37a89: 0x6db07620, 0x37a8a: 0x6dd00c20, 0x37a8b: 0x6e2b4020, + 0x37a8c: 0x6e2b4220, 0x37a8d: 0x6e3dda20, 0x37a8e: 0x6c3e3820, 0x37a8f: 0x6c3e3a20, + 0x37a90: 0x6c144a20, 0x37a91: 0x6c3e3c20, 0x37a92: 0x6c81a820, 0x37a93: 0x6caab820, + 0x37a94: 0x6cd8fa20, 0x37a95: 0x6cd8fc20, 0x37a96: 0x6d07ae20, 0x37a97: 0x6d359220, + 0x37a98: 0x6d624220, 0x37a99: 0x6d624420, 0x37a9a: 0x6d624620, 0x37a9b: 0x6d624820, + 0x37a9c: 0x6d624a20, 0x37a9d: 0x6d8c4620, 0x37a9e: 0x6d8c4820, 0x37a9f: 0x6db07820, + 0x37aa0: 0x6db07a20, 0x37aa1: 0x6db07c20, 0x37aa2: 0x6e205620, 0x37aa3: 0x6e33c820, + 0x37aa4: 0x6c144e20, 0x37aa5: 0x6c3e4020, 0x37aa6: 0x6c3e4220, 0x37aa7: 0x6c3e4420, + 0x37aa8: 0x6c5d4c20, 0x37aa9: 0x6c5d4e20, 0x37aaa: 0x6c5d5020, 0x37aab: 0x6c81b420, + 0x37aac: 0x6caac820, 0x37aad: 0x6caaca20, 0x37aae: 0x6caacc20, 0x37aaf: 0x6cd90020, + 0x37ab0: 0x6cd90220, 0x37ab1: 0x6cd90420, 0x37ab2: 0x6cd90620, 0x37ab3: 0x6cd90820, + 0x37ab4: 0x6d07b820, 0x37ab5: 0x6d07ba20, 0x37ab6: 0x6d07bc20, 0x37ab7: 0x6d35a420, + 0x37ab8: 0x6d35a620, 0x37ab9: 0x6d35a820, 0x37aba: 0x6d35aa20, 0x37abb: 0x6d35ac20, + 0x37abc: 0x6d35ae20, 0x37abd: 0x6d35b020, 0x37abe: 0x6d35b220, 0x37abf: 0x6d35b420, + // Block 0xdeb, offset 0x37ac0 + 0x37ac0: 0x6d35b620, 0x37ac1: 0x6d35b820, 0x37ac2: 0x6d625420, 0x37ac3: 0x6d625620, + 0x37ac4: 0x6d625820, 0x37ac5: 0x6d625a20, 0x37ac6: 0x6d625c20, 0x37ac7: 0x6d625e20, + 0x37ac8: 0x6d626020, 0x37ac9: 0x6d626220, 0x37aca: 0x6d626420, 0x37acb: 0x6d8c5020, + 0x37acc: 0x6d8c5220, 0x37acd: 0x6d8c5420, 0x37ace: 0x6d8c5620, 0x37acf: 0x6d8c5820, + 0x37ad0: 0x6d8c5a20, 0x37ad1: 0x6d8c5c20, 0x37ad2: 0x6d8c5e20, 0x37ad3: 0x6db08820, + 0x37ad4: 0x6db08a20, 0x37ad5: 0x6db08c20, 0x37ad6: 0x6db08e20, 0x37ad7: 0x6db09020, + 0x37ad8: 0x6db09220, 0x37ad9: 0x6db09420, 0x37ada: 0x6db09620, 0x37adb: 0x6dd01620, + 0x37adc: 0x6dd01820, 0x37add: 0x6dd01a20, 0x37ade: 0x6dd01c20, 0x37adf: 0x6de9f820, + 0x37ae0: 0x6dd01e20, 0x37ae1: 0x6dd02020, 0x37ae2: 0x6dd02220, 0x37ae3: 0x6dd02420, + 0x37ae4: 0x6dd02620, 0x37ae5: 0x6de9fa20, 0x37ae6: 0x6de9fc20, 0x37ae7: 0x6de9fe20, + 0x37ae8: 0x6dea0020, 0x37ae9: 0x6e123020, 0x37aea: 0x6e123220, 0x37aeb: 0x6e33ca20, + 0x37aec: 0x6e33cc20, 0x37aed: 0x6e39aa20, 0x37aee: 0x6c25e820, 0x37aef: 0x6c3e4820, + 0x37af0: 0x6c3e4a20, 0x37af1: 0x6c3e4c20, 0x37af2: 0x6c3e4e20, 0x37af3: 0x6c3e5020, + 0x37af4: 0x6c3e5220, 0x37af5: 0x6c3e5420, 0x37af6: 0x6c3e5620, 0x37af7: 0x6c5d5620, + 0x37af8: 0x6c5d5820, 0x37af9: 0x6c5d5a20, 0x37afa: 0x6c5d5c20, 0x37afb: 0x6c5d5e20, + 0x37afc: 0x6c81d020, 0x37afd: 0x6c81d220, 0x37afe: 0x6c81d420, 0x37aff: 0x6c81d620, + // Block 0xdec, offset 0x37b00 + 0x37b00: 0x6c81d820, 0x37b01: 0x6c81da20, 0x37b02: 0x6c81dc20, 0x37b03: 0x6c81de20, + 0x37b04: 0x6c81e020, 0x37b05: 0x6c81e220, 0x37b06: 0x6c81e420, 0x37b07: 0x6c81e620, + 0x37b08: 0x6c81e820, 0x37b09: 0x6c81ea20, 0x37b0a: 0x6c81ec20, 0x37b0b: 0x6c81ee20, + 0x37b0c: 0x6c81f020, 0x37b0d: 0x6c81f220, 0x37b0e: 0x6c81f420, 0x37b0f: 0x6c81f620, + 0x37b10: 0x6caaea20, 0x37b11: 0x6caaec20, 0x37b12: 0x6caaee20, 0x37b13: 0x6caaf020, + 0x37b14: 0x6caaf220, 0x37b15: 0x6caaf420, 0x37b16: 0x6caaf620, 0x37b17: 0x6caaf820, + 0x37b18: 0x6caafa20, 0x37b19: 0x6caafc20, 0x37b1a: 0x6caafe20, 0x37b1b: 0x6cab0020, + 0x37b1c: 0x6cab0220, 0x37b1d: 0x6cab0420, 0x37b1e: 0x6cab0620, 0x37b1f: 0x6cab0820, + 0x37b20: 0x6cd92020, 0x37b21: 0x6cd92220, 0x37b22: 0x6cd92420, 0x37b23: 0x6d07cc20, + 0x37b24: 0x6cd92620, 0x37b25: 0x6cd92820, 0x37b26: 0x6cd92a20, 0x37b27: 0x6cd92c20, + 0x37b28: 0x6cd92e20, 0x37b29: 0x6cd93020, 0x37b2a: 0x6cd93220, 0x37b2b: 0x6cd93420, + 0x37b2c: 0x6cd93620, 0x37b2d: 0x6cd93820, 0x37b2e: 0x6cd93a20, 0x37b2f: 0x6cd93c20, + 0x37b30: 0x6cd93e20, 0x37b31: 0x6cd94020, 0x37b32: 0x6cd94220, 0x37b33: 0x6cd94420, + 0x37b34: 0x6cd94620, 0x37b35: 0x6d07ce20, 0x37b36: 0x6d07d020, 0x37b37: 0x6d07d220, + 0x37b38: 0x6d07d420, 0x37b39: 0x6d07d620, 0x37b3a: 0x6d07d820, 0x37b3b: 0x6d07da20, + 0x37b3c: 0x6d07dc20, 0x37b3d: 0x6d07de20, 0x37b3e: 0x6d07e020, 0x37b3f: 0x6d07e220, + // Block 0xded, offset 0x37b40 + 0x37b40: 0x6d07e420, 0x37b41: 0x6d07e620, 0x37b42: 0x6d07e820, 0x37b43: 0x6d07ea20, + 0x37b44: 0x6d07ec20, 0x37b45: 0x6d07ee20, 0x37b46: 0x6d07f020, 0x37b47: 0x6d07f220, + 0x37b48: 0x6d35d820, 0x37b49: 0x6d35da20, 0x37b4a: 0x6d35dc20, 0x37b4b: 0x6d35de20, + 0x37b4c: 0x6d35e020, 0x37b4d: 0x6d35e220, 0x37b4e: 0x6d35e420, 0x37b4f: 0x6d35e620, + 0x37b50: 0x6d35e820, 0x37b51: 0x6d35ea20, 0x37b52: 0x6d35ec20, 0x37b53: 0x6d35ee20, + 0x37b54: 0x6d35f020, 0x37b55: 0x6d35f220, 0x37b56: 0x6d35f420, 0x37b57: 0x6d07f420, + 0x37b58: 0x6d35f620, 0x37b59: 0x6d35f820, 0x37b5a: 0x6d35fa20, 0x37b5b: 0x6d35fc20, + 0x37b5c: 0x6d35fe20, 0x37b5d: 0x6d360020, 0x37b5e: 0x6d360220, 0x37b5f: 0x6d360420, + 0x37b60: 0x6d360620, 0x37b61: 0x6d360820, 0x37b62: 0x6d627e20, 0x37b63: 0x6d628020, + 0x37b64: 0x6d628220, 0x37b65: 0x6d628420, 0x37b66: 0x6d628620, 0x37b67: 0x6d628820, + 0x37b68: 0x6d628a20, 0x37b69: 0x6d628c20, 0x37b6a: 0x6d628e20, 0x37b6b: 0x6d629020, + 0x37b6c: 0x6d629220, 0x37b6d: 0x6d629420, 0x37b6e: 0x6d629620, 0x37b6f: 0x6d629820, + 0x37b70: 0x6d629a20, 0x37b71: 0x6d629c20, 0x37b72: 0x6d629e20, 0x37b73: 0x6d62a020, + 0x37b74: 0x6d62a220, 0x37b75: 0x6d62a420, 0x37b76: 0x6d62a620, 0x37b77: 0x6d62a820, + 0x37b78: 0x6d62aa20, 0x37b79: 0x6d62ac20, 0x37b7a: 0x6d62ae20, 0x37b7b: 0x6d62b020, + 0x37b7c: 0x6d8c6c20, 0x37b7d: 0x6d8c6e20, 0x37b7e: 0x6d8c7020, 0x37b7f: 0x6d8c7220, + // Block 0xdee, offset 0x37b80 + 0x37b80: 0x6d8c7420, 0x37b81: 0x6d8c7620, 0x37b82: 0x6d8c7820, 0x37b83: 0x6d8c7a20, + 0x37b84: 0x6d8c7c20, 0x37b85: 0x6d8c7e20, 0x37b86: 0x6d8c8020, 0x37b87: 0x6d62b220, + 0x37b88: 0x6d8c8220, 0x37b89: 0x6d8c8420, 0x37b8a: 0x6d8c8620, 0x37b8b: 0x6d8c8820, + 0x37b8c: 0x6d8c8a20, 0x37b8d: 0x6d8c8c20, 0x37b8e: 0x6d8c8e20, 0x37b8f: 0x6d8c9020, + 0x37b90: 0x6db0aa20, 0x37b91: 0x6db0ac20, 0x37b92: 0x6db0ae20, 0x37b93: 0x6db0b020, + 0x37b94: 0x6db0b220, 0x37b95: 0x6db0b420, 0x37b96: 0x6db0b620, 0x37b97: 0x6db0b820, + 0x37b98: 0x6db0ba20, 0x37b99: 0x6db0bc20, 0x37b9a: 0x6db0be20, 0x37b9b: 0x6db0c020, + 0x37b9c: 0x6db0c220, 0x37b9d: 0x6db0c420, 0x37b9e: 0x6db0c620, 0x37b9f: 0x6dd03220, + 0x37ba0: 0x6dd03420, 0x37ba1: 0x6dd03620, 0x37ba2: 0x6dd03820, 0x37ba3: 0x6dd03a20, + 0x37ba4: 0x6dd03c20, 0x37ba5: 0x6dd03e20, 0x37ba6: 0x6dd04020, 0x37ba7: 0x6dd04220, + 0x37ba8: 0x6dd04420, 0x37ba9: 0x6dd04620, 0x37baa: 0x6dd04820, 0x37bab: 0x6dd04a20, + 0x37bac: 0x6dd04c20, 0x37bad: 0x6dd04e20, 0x37bae: 0x6dd05020, 0x37baf: 0x6dd05220, + 0x37bb0: 0x6dd05420, 0x37bb1: 0x6dd05620, 0x37bb2: 0x6dd05820, 0x37bb3: 0x6dea0420, + 0x37bb4: 0x6dea0620, 0x37bb5: 0x6dea0820, 0x37bb6: 0x6dea0a20, 0x37bb7: 0x6dea0c20, + 0x37bb8: 0x6dea0e20, 0x37bb9: 0x6dea1020, 0x37bba: 0x6dea1220, 0x37bbb: 0x6dea1420, + 0x37bbc: 0x6dea1620, 0x37bbd: 0x6dea1820, 0x37bbe: 0x6dffd020, 0x37bbf: 0x6dffd220, + // Block 0xdef, offset 0x37bc0 + 0x37bc0: 0x6dffd420, 0x37bc1: 0x6dffd620, 0x37bc2: 0x6dffd820, 0x37bc3: 0x6dffda20, + 0x37bc4: 0x6dffdc20, 0x37bc5: 0x6e123420, 0x37bc6: 0x6e123620, 0x37bc7: 0x6e123820, + 0x37bc8: 0x6e123a20, 0x37bc9: 0x6e123c20, 0x37bca: 0x6e206220, 0x37bcb: 0x6e206420, + 0x37bcc: 0x6e206620, 0x37bcd: 0x6e2b4420, 0x37bce: 0x6e2b4620, 0x37bcf: 0x6e33ce20, + 0x37bd0: 0x6e39ac20, 0x37bd1: 0x6e3ddc20, 0x37bd2: 0x6c145420, 0x37bd3: 0x6c3e5c20, + 0x37bd4: 0x6c5d6020, 0x37bd5: 0x6cab0a20, 0x37bd6: 0x6cab0c20, 0x37bd7: 0x6cab0e20, + 0x37bd8: 0x6cd94c20, 0x37bd9: 0x6cd94e20, 0x37bda: 0x6cd95020, 0x37bdb: 0x6d080420, + 0x37bdc: 0x6d080620, 0x37bdd: 0x6d361220, 0x37bde: 0x6d361420, 0x37bdf: 0x6d361620, + 0x37be0: 0x6d62b620, 0x37be1: 0x6d62b820, 0x37be2: 0x6d62ba20, 0x37be3: 0x6d8c9c20, + 0x37be4: 0x6db0ce20, 0x37be5: 0x6db0d020, 0x37be6: 0x6db0d220, 0x37be7: 0x6dea1c20, + 0x37be8: 0x6dffde20, 0x37be9: 0x6c146420, 0x37bea: 0x6c146620, 0x37beb: 0x6c146820, + 0x37bec: 0x6c146a20, 0x37bed: 0x6c146c20, 0x37bee: 0x6c146e20, 0x37bef: 0x6c147020, + 0x37bf0: 0x6c147220, 0x37bf1: 0x6c147420, 0x37bf2: 0x6c147620, 0x37bf3: 0x6c147820, + 0x37bf4: 0x6c261020, 0x37bf5: 0x6c261220, 0x37bf6: 0x6c261420, 0x37bf7: 0x6c261620, + 0x37bf8: 0x6c261820, 0x37bf9: 0x6c261a20, 0x37bfa: 0x6c261c20, 0x37bfb: 0x6c261e20, + 0x37bfc: 0x6c262020, 0x37bfd: 0x6c262220, 0x37bfe: 0x6c262420, 0x37bff: 0x6c3ebe20, + // Block 0xdf0, offset 0x37c00 + 0x37c00: 0x6c3ec020, 0x37c01: 0x6c3ec220, 0x37c02: 0x6c3ec420, 0x37c03: 0x6c3ec620, + 0x37c04: 0x6c3ec820, 0x37c05: 0x6c3eca20, 0x37c06: 0x6c3ecc20, 0x37c07: 0x6c3ece20, + 0x37c08: 0x6c3ed020, 0x37c09: 0x6c3ed220, 0x37c0a: 0x6c3ed420, 0x37c0b: 0x6c3ed620, + 0x37c0c: 0x6c3ed820, 0x37c0d: 0x6c3eda20, 0x37c0e: 0x6c3edc20, 0x37c0f: 0x6c3ede20, + 0x37c10: 0x6c3ee020, 0x37c11: 0x6c3ee220, 0x37c12: 0x6c3ee420, 0x37c13: 0x6c3ee620, + 0x37c14: 0x6c3ee820, 0x37c15: 0x6c3eea20, 0x37c16: 0x6c3eec20, 0x37c17: 0x6c3eee20, + 0x37c18: 0x6c3ef020, 0x37c19: 0x6c3ef220, 0x37c1a: 0x6c3ef420, 0x37c1b: 0x6c3ef620, + 0x37c1c: 0x6c3ef820, 0x37c1d: 0x6c3efa20, 0x37c1e: 0x6c3efc20, 0x37c1f: 0x6c3efe20, + 0x37c20: 0x6c3f0020, 0x37c21: 0x6c3f0220, 0x37c22: 0x6c3f0420, 0x37c23: 0x6c3f0620, + 0x37c24: 0x6c3f0820, 0x37c25: 0x6c3f0a20, 0x37c26: 0x6c3f0c20, 0x37c27: 0x6c3f0e20, + 0x37c28: 0x6c3f1020, 0x37c29: 0x6c3f1220, 0x37c2a: 0x6c5dca20, 0x37c2b: 0x6c5dcc20, + 0x37c2c: 0x6c5dce20, 0x37c2d: 0x6c5dd020, 0x37c2e: 0x6c5dd220, 0x37c2f: 0x6c5dd420, + 0x37c30: 0x6c5dd620, 0x37c31: 0x6c5dd820, 0x37c32: 0x6c5dda20, 0x37c33: 0x6c5ddc20, + 0x37c34: 0x6c5dde20, 0x37c35: 0x6c5de020, 0x37c36: 0x6c5de220, 0x37c37: 0x6c5de420, + 0x37c38: 0x6c5de620, 0x37c39: 0x6c5de820, 0x37c3a: 0x6c5dea20, 0x37c3b: 0x6c5dec20, + 0x37c3c: 0x6c5dee20, 0x37c3d: 0x6c5df020, 0x37c3e: 0x6c5df220, 0x37c3f: 0x6c5df420, + // Block 0xdf1, offset 0x37c40 + 0x37c40: 0x6c5df620, 0x37c41: 0x6c5df820, 0x37c42: 0x6c5dfa20, 0x37c43: 0x6c5dfc20, + 0x37c44: 0x6c5dfe20, 0x37c45: 0x6c5e0020, 0x37c46: 0x6c5e0220, 0x37c47: 0x6c5e0420, + 0x37c48: 0x6c5e0620, 0x37c49: 0x6c5e0820, 0x37c4a: 0x6c5e0a20, 0x37c4b: 0x6c5e0c20, + 0x37c4c: 0x6c5e0e20, 0x37c4d: 0x6c5e1020, 0x37c4e: 0x6c5e1220, 0x37c4f: 0x6c5e1420, + 0x37c50: 0x6c5e1620, 0x37c51: 0x6c5e1820, 0x37c52: 0x6c5e1a20, 0x37c53: 0x6c5e1c20, + 0x37c54: 0x6c5e1e20, 0x37c55: 0x6c5e2020, 0x37c56: 0x6c5e2220, 0x37c57: 0x6c5e2420, + 0x37c58: 0x6c5e2620, 0x37c59: 0x6c5e2820, 0x37c5a: 0x6c5e2a20, 0x37c5b: 0x6c5e2c20, + 0x37c5c: 0x6c5e2e20, 0x37c5d: 0x6c826020, 0x37c5e: 0x6c826220, 0x37c5f: 0x6c826420, + 0x37c60: 0x6c826620, 0x37c61: 0x6c826820, 0x37c62: 0x6c826a20, 0x37c63: 0x6c826c20, + 0x37c64: 0x6c826e20, 0x37c65: 0x6c827020, 0x37c66: 0x6c827220, 0x37c67: 0x6c827420, + 0x37c68: 0x6c827620, 0x37c69: 0x6c827820, 0x37c6a: 0x6c827a20, 0x37c6b: 0x6c827c20, + 0x37c6c: 0x6c827e20, 0x37c6d: 0x6c828020, 0x37c6e: 0x6c828220, 0x37c6f: 0x6c828420, + 0x37c70: 0x6c828620, 0x37c71: 0x6c828820, 0x37c72: 0x6c828a20, 0x37c73: 0x6c828c20, + 0x37c74: 0x6c828e20, 0x37c75: 0x6c829020, 0x37c76: 0x6c829220, 0x37c77: 0x6c829420, + 0x37c78: 0x6c829620, 0x37c79: 0x6c829820, 0x37c7a: 0x6c829a20, 0x37c7b: 0x6c829c20, + 0x37c7c: 0x6c829e20, 0x37c7d: 0x6c82a020, 0x37c7e: 0x6c82a220, 0x37c7f: 0x6c82a420, + // Block 0xdf2, offset 0x37c80 + 0x37c80: 0x6c82a620, 0x37c81: 0x6c82a820, 0x37c82: 0x6c82aa20, 0x37c83: 0x6c82ac20, + 0x37c84: 0x6c82ae20, 0x37c85: 0x6c82b020, 0x37c86: 0x6c82b220, 0x37c87: 0x6c82b420, + 0x37c88: 0x6c82b620, 0x37c89: 0x6c82b820, 0x37c8a: 0x6c82ba20, 0x37c8b: 0x6c82bc20, + 0x37c8c: 0x6c82be20, 0x37c8d: 0x6c82c020, 0x37c8e: 0x6c82c220, 0x37c8f: 0x6c82c420, + 0x37c90: 0x6c82c620, 0x37c91: 0x6c82c820, 0x37c92: 0x6c82ca20, 0x37c93: 0x6c82cc20, + 0x37c94: 0x6cab7220, 0x37c95: 0x6cab7420, 0x37c96: 0x6cab7620, 0x37c97: 0x6cab7820, + 0x37c98: 0x6cab7a20, 0x37c99: 0x6cab7c20, 0x37c9a: 0x6cab7e20, 0x37c9b: 0x6cab8020, + 0x37c9c: 0x6cab8220, 0x37c9d: 0x6cab8420, 0x37c9e: 0x6cab8620, 0x37c9f: 0x6cab8820, + 0x37ca0: 0x6cab8a20, 0x37ca1: 0x6cab8c20, 0x37ca2: 0x6cab8e20, 0x37ca3: 0x6cab9020, + 0x37ca4: 0x6cab9220, 0x37ca5: 0x6cab9420, 0x37ca6: 0x6cab9620, 0x37ca7: 0x6cab9820, + 0x37ca8: 0x6cab9a20, 0x37ca9: 0x6cab9c20, 0x37caa: 0x6cab9e20, 0x37cab: 0x6caba020, + 0x37cac: 0x6caba220, 0x37cad: 0x6caba420, 0x37cae: 0x6caba620, 0x37caf: 0x6caba820, + 0x37cb0: 0x6cabaa20, 0x37cb1: 0x6cabac20, 0x37cb2: 0x6cabae20, 0x37cb3: 0x6cabb020, + 0x37cb4: 0x6cabb220, 0x37cb5: 0x6cabb420, 0x37cb6: 0x6cabb620, 0x37cb7: 0x6cabb820, + 0x37cb8: 0x6cabba20, 0x37cb9: 0x6cabbc20, 0x37cba: 0x6cabbe20, 0x37cbb: 0x6cabc020, + 0x37cbc: 0x6cabc220, 0x37cbd: 0x6cabc420, 0x37cbe: 0x6cabc620, 0x37cbf: 0x6cabc820, + // Block 0xdf3, offset 0x37cc0 + 0x37cc0: 0x6cabca20, 0x37cc1: 0x6cabcc20, 0x37cc2: 0x6cabce20, 0x37cc3: 0x6cabd020, + 0x37cc4: 0x6cabd220, 0x37cc5: 0x6cabd420, 0x37cc6: 0x6cd9c020, 0x37cc7: 0x6cd9c220, + 0x37cc8: 0x6cd9c420, 0x37cc9: 0x6cd9c620, 0x37cca: 0x6cd9c820, 0x37ccb: 0x6cd9ca20, + 0x37ccc: 0x6cd9cc20, 0x37ccd: 0x6cd9ce20, 0x37cce: 0x6cd9d020, 0x37ccf: 0x6cd9d220, + 0x37cd0: 0x6cd9d420, 0x37cd1: 0x6cd9d620, 0x37cd2: 0x6cd9d820, 0x37cd3: 0x6cd9da20, + 0x37cd4: 0x6cd9dc20, 0x37cd5: 0x6cd9de20, 0x37cd6: 0x6cd9e020, 0x37cd7: 0x6cd9e220, + 0x37cd8: 0x6cd9e420, 0x37cd9: 0x6cd9e620, 0x37cda: 0x6cd9e820, 0x37cdb: 0x6cd9ea20, + 0x37cdc: 0x6cd9ec20, 0x37cdd: 0x6cd9ee20, 0x37cde: 0x6cd9f020, 0x37cdf: 0x6cd9f220, + 0x37ce0: 0x6cd9f420, 0x37ce1: 0x6cd9f620, 0x37ce2: 0x6cd9f820, 0x37ce3: 0x6cd9fa20, + 0x37ce4: 0x6cd9fc20, 0x37ce5: 0x6cd9fe20, 0x37ce6: 0x6cda0020, 0x37ce7: 0x6cda0220, + 0x37ce8: 0x6cda0420, 0x37ce9: 0x6cda0620, 0x37cea: 0x6cda0820, 0x37ceb: 0x6cda0a20, + 0x37cec: 0x6cda0c20, 0x37ced: 0x6cda0e20, 0x37cee: 0x6cda1020, 0x37cef: 0x6cda1220, + 0x37cf0: 0x6cda1420, 0x37cf1: 0x6cda1620, 0x37cf2: 0x6cda1820, 0x37cf3: 0x6cc87c20, + 0x37cf4: 0x6cda1a20, 0x37cf5: 0x6cda1c20, 0x37cf6: 0x6cda1e20, 0x37cf7: 0x6cda2020, + 0x37cf8: 0x6cda2220, 0x37cf9: 0x6cda2420, 0x37cfa: 0x6cda2620, 0x37cfb: 0x6cda2820, + 0x37cfc: 0x6cda2a20, 0x37cfd: 0x6cda2c20, 0x37cfe: 0x6cda2e20, 0x37cff: 0x6cda3020, + // Block 0xdf4, offset 0x37d00 + 0x37d00: 0x6cda3220, 0x37d01: 0x6cda3420, 0x37d02: 0x6cda3620, 0x37d03: 0x6cda3820, + 0x37d04: 0x6cda3a20, 0x37d05: 0x6cda3c20, 0x37d06: 0x6cda3e20, 0x37d07: 0x6cda4020, + 0x37d08: 0x6cda4220, 0x37d09: 0x6cda4420, 0x37d0a: 0x6cda4620, 0x37d0b: 0x6cda4820, + 0x37d0c: 0x6cda4a20, 0x37d0d: 0x6cda4c20, 0x37d0e: 0x6cda4e20, 0x37d0f: 0x6cda5020, + 0x37d10: 0x6cda5220, 0x37d11: 0x6cda5420, 0x37d12: 0x6cda5620, 0x37d13: 0x6cda5820, + 0x37d14: 0x6cda5a20, 0x37d15: 0x6cda5c20, 0x37d16: 0x6cda5e20, 0x37d17: 0x6cda6020, + 0x37d18: 0x6cda6220, 0x37d19: 0x6cda6420, 0x37d1a: 0x6d087020, 0x37d1b: 0x6d087220, + 0x37d1c: 0x6d087420, 0x37d1d: 0x6d087620, 0x37d1e: 0x6d087820, 0x37d1f: 0x6d087a20, + 0x37d20: 0x6d087c20, 0x37d21: 0x6d087e20, 0x37d22: 0x6d088020, 0x37d23: 0x6d088220, + 0x37d24: 0x6d088420, 0x37d25: 0x6d088620, 0x37d26: 0x6d088820, 0x37d27: 0x6d088a20, + 0x37d28: 0x6d088c20, 0x37d29: 0x6d088e20, 0x37d2a: 0x6d089020, 0x37d2b: 0x6d089220, + 0x37d2c: 0x6d089420, 0x37d2d: 0x6d089620, 0x37d2e: 0x6d089820, 0x37d2f: 0x6d089a20, + 0x37d30: 0x6d089c20, 0x37d31: 0x6d089e20, 0x37d32: 0x6d08a020, 0x37d33: 0x6d08a220, + 0x37d34: 0x6d08a420, 0x37d35: 0x6d08a620, 0x37d36: 0x6d08a820, 0x37d37: 0x6d08aa20, + 0x37d38: 0x6d08ac20, 0x37d39: 0x6d08ae20, 0x37d3a: 0x6d08b020, 0x37d3b: 0x6d08b220, + 0x37d3c: 0x6d08b420, 0x37d3d: 0x6d08b620, 0x37d3e: 0x6d08b820, 0x37d3f: 0x6d08ba20, + // Block 0xdf5, offset 0x37d40 + 0x37d40: 0x6d08bc20, 0x37d41: 0x6d08be20, 0x37d42: 0x6d08c020, 0x37d43: 0x6d08c220, + 0x37d44: 0x6d08c420, 0x37d45: 0x6d08c620, 0x37d46: 0x6d08c820, 0x37d47: 0x6d08ca20, + 0x37d48: 0x6d08cc20, 0x37d49: 0x6d08ce20, 0x37d4a: 0x6d08d020, 0x37d4b: 0x6d08d220, + 0x37d4c: 0x6d08d420, 0x37d4d: 0x6d08d620, 0x37d4e: 0x6d08d820, 0x37d4f: 0x6d08da20, + 0x37d50: 0x6d08dc20, 0x37d51: 0x6d08de20, 0x37d52: 0x6d08e020, 0x37d53: 0x6d08e220, + 0x37d54: 0x6d08e420, 0x37d55: 0x6d08e620, 0x37d56: 0x6d08e820, 0x37d57: 0x6d08ea20, + 0x37d58: 0x6d08ec20, 0x37d59: 0x6d365c20, 0x37d5a: 0x6d365e20, 0x37d5b: 0x6d366020, + 0x37d5c: 0x6d366220, 0x37d5d: 0x6d366420, 0x37d5e: 0x6d366620, 0x37d5f: 0x6d366820, + 0x37d60: 0x6d366a20, 0x37d61: 0x6d366c20, 0x37d62: 0x6d366e20, 0x37d63: 0x6d367020, + 0x37d64: 0x6d367220, 0x37d65: 0x6d367420, 0x37d66: 0x6d367620, 0x37d67: 0x6d367820, + 0x37d68: 0x6d367a20, 0x37d69: 0x6d367c20, 0x37d6a: 0x6d367e20, 0x37d6b: 0x6d368020, + 0x37d6c: 0x6d368220, 0x37d6d: 0x6d368420, 0x37d6e: 0x6d368620, 0x37d6f: 0x6d368820, + 0x37d70: 0x6d368a20, 0x37d71: 0x6d368c20, 0x37d72: 0x6d368e20, 0x37d73: 0x6d369020, + 0x37d74: 0x6d369220, 0x37d75: 0x6d369420, 0x37d76: 0x6d369620, 0x37d77: 0x6d369820, + 0x37d78: 0x6d369a20, 0x37d79: 0x6d369c20, 0x37d7a: 0x6d369e20, 0x37d7b: 0x6d36a020, + 0x37d7c: 0x6d36a220, 0x37d7d: 0x6d36a420, 0x37d7e: 0x6d36a620, 0x37d7f: 0x6d36a820, + // Block 0xdf6, offset 0x37d80 + 0x37d80: 0x6d36aa20, 0x37d81: 0x6d36ac20, 0x37d82: 0x6d36ae20, 0x37d83: 0x6d36b020, + 0x37d84: 0x6d36b220, 0x37d85: 0x6d36b420, 0x37d86: 0x6d36b620, 0x37d87: 0x6d36b820, + 0x37d88: 0x6d36ba20, 0x37d89: 0x6d36bc20, 0x37d8a: 0x6d36be20, 0x37d8b: 0x6d36c020, + 0x37d8c: 0x6d36c220, 0x37d8d: 0x6d36c420, 0x37d8e: 0x6d36c620, 0x37d8f: 0x6d36c820, + 0x37d90: 0x6d36ca20, 0x37d91: 0x6d36cc20, 0x37d92: 0x6d36ce20, 0x37d93: 0x6d08ee20, + 0x37d94: 0x6d08f020, 0x37d95: 0x6d36d020, 0x37d96: 0x6d36d220, 0x37d97: 0x6d36d420, + 0x37d98: 0x6d62f420, 0x37d99: 0x6d62f620, 0x37d9a: 0x6d62f820, 0x37d9b: 0x6d62fa20, + 0x37d9c: 0x6d62fc20, 0x37d9d: 0x6d62fe20, 0x37d9e: 0x6d630020, 0x37d9f: 0x6d630220, + 0x37da0: 0x6d630420, 0x37da1: 0x6d630620, 0x37da2: 0x6d630820, 0x37da3: 0x6d630a20, + 0x37da4: 0x6d630c20, 0x37da5: 0x6d630e20, 0x37da6: 0x6d631020, 0x37da7: 0x6d631220, + 0x37da8: 0x6d631420, 0x37da9: 0x6d631620, 0x37daa: 0x6d631820, 0x37dab: 0x6d631a20, + 0x37dac: 0x6d631c20, 0x37dad: 0x6d631e20, 0x37dae: 0x6d632020, 0x37daf: 0x6d632220, + 0x37db0: 0x6d632420, 0x37db1: 0x6d632620, 0x37db2: 0x6d632820, 0x37db3: 0x6d632a20, + 0x37db4: 0x6d632c20, 0x37db5: 0x6d632e20, 0x37db6: 0x6d633020, 0x37db7: 0x6d633220, + 0x37db8: 0x6d633420, 0x37db9: 0x6d633620, 0x37dba: 0x6d633820, 0x37dbb: 0x6d633a20, + 0x37dbc: 0x6d633c20, 0x37dbd: 0x6d633e20, 0x37dbe: 0x6d634020, 0x37dbf: 0x6d634220, + // Block 0xdf7, offset 0x37dc0 + 0x37dc0: 0x6d634420, 0x37dc1: 0x6d634620, 0x37dc2: 0x6d634820, 0x37dc3: 0x6d8cd620, + 0x37dc4: 0x6d8cd820, 0x37dc5: 0x6d8cda20, 0x37dc6: 0x6d8cdc20, 0x37dc7: 0x6d8cde20, + 0x37dc8: 0x6d8ce020, 0x37dc9: 0x6d8ce220, 0x37dca: 0x6d8ce420, 0x37dcb: 0x6d8ce620, + 0x37dcc: 0x6d8ce820, 0x37dcd: 0x6d8cea20, 0x37dce: 0x6d8cec20, 0x37dcf: 0x6d8cee20, + 0x37dd0: 0x6d8cf020, 0x37dd1: 0x6d8cf220, 0x37dd2: 0x6d8cf420, 0x37dd3: 0x6d8cf620, + 0x37dd4: 0x6d8cf820, 0x37dd5: 0x6d8cfa20, 0x37dd6: 0x6d8cfc20, 0x37dd7: 0x6d8cfe20, + 0x37dd8: 0x6d8d0020, 0x37dd9: 0x6d8d0220, 0x37dda: 0x6d8d0420, 0x37ddb: 0x6d8d0620, + 0x37ddc: 0x6d8d0820, 0x37ddd: 0x6d8d0a20, 0x37dde: 0x6d8d0c20, 0x37ddf: 0x6d8d0e20, + 0x37de0: 0x6d8d1020, 0x37de1: 0x6d8d1220, 0x37de2: 0x6d8d1420, 0x37de3: 0x6d8d1620, + 0x37de4: 0x6d8d1820, 0x37de5: 0x6d8d1a20, 0x37de6: 0x6d8d1c20, 0x37de7: 0x6d8d1e20, + 0x37de8: 0x6d8d2020, 0x37de9: 0x6d8d2220, 0x37dea: 0x6d8d2420, 0x37deb: 0x6d8d2620, + 0x37dec: 0x6d8d2820, 0x37ded: 0x6d8d2a20, 0x37dee: 0x6d8d2c20, 0x37def: 0x6d8d2e20, + 0x37df0: 0x6d8d3020, 0x37df1: 0x6d8d3220, 0x37df2: 0x6d8d3420, 0x37df3: 0x6d8d3620, + 0x37df4: 0x6d8d3820, 0x37df5: 0x6d8d3a20, 0x37df6: 0x6d8d3c20, 0x37df7: 0x6d8d3e20, + 0x37df8: 0x6d8d4020, 0x37df9: 0x6d8d4220, 0x37dfa: 0x6d8d4420, 0x37dfb: 0x6d8d4620, + 0x37dfc: 0x6d8d4820, 0x37dfd: 0x6d8d4a20, 0x37dfe: 0x6db10420, 0x37dff: 0x6db10620, + // Block 0xdf8, offset 0x37e00 + 0x37e00: 0x6db10820, 0x37e01: 0x6db10a20, 0x37e02: 0x6db10c20, 0x37e03: 0x6db10e20, + 0x37e04: 0x6d8d4c20, 0x37e05: 0x6db11020, 0x37e06: 0x6db11220, 0x37e07: 0x6db11420, + 0x37e08: 0x6db11620, 0x37e09: 0x6db11820, 0x37e0a: 0x6db11a20, 0x37e0b: 0x6db11c20, + 0x37e0c: 0x6db11e20, 0x37e0d: 0x6db12020, 0x37e0e: 0x6dd07620, 0x37e0f: 0x6db12220, + 0x37e10: 0x6db12420, 0x37e11: 0x6db12620, 0x37e12: 0x6db12820, 0x37e13: 0x6db12a20, + 0x37e14: 0x6db12c20, 0x37e15: 0x6db12e20, 0x37e16: 0x6da5c020, 0x37e17: 0x6d7c7a20, + 0x37e18: 0x6db13020, 0x37e19: 0x6db13220, 0x37e1a: 0x6db13420, 0x37e1b: 0x6db13620, + 0x37e1c: 0x6db13820, 0x37e1d: 0x6db13a20, 0x37e1e: 0x6db13c20, 0x37e1f: 0x6db13e20, + 0x37e20: 0x6db14020, 0x37e21: 0x6db14220, 0x37e22: 0x6db14420, 0x37e23: 0x6db14620, + 0x37e24: 0x6db14820, 0x37e25: 0x6db14a20, 0x37e26: 0x6db14c20, 0x37e27: 0x6db14e20, + 0x37e28: 0x6db15020, 0x37e29: 0x6db15220, 0x37e2a: 0x6db15420, 0x37e2b: 0x6db15620, + 0x37e2c: 0x6db15820, 0x37e2d: 0x6db15a20, 0x37e2e: 0x6d8d4e20, 0x37e2f: 0x6db15c20, + 0x37e30: 0x6dd07820, 0x37e31: 0x6dd07a20, 0x37e32: 0x6dd07c20, 0x37e33: 0x6dd07e20, + 0x37e34: 0x6dd08020, 0x37e35: 0x6dd08220, 0x37e36: 0x6dd08420, 0x37e37: 0x6dd08620, + 0x37e38: 0x6dd08820, 0x37e39: 0x6dd08a20, 0x37e3a: 0x6dd08c20, 0x37e3b: 0x6dd08e20, + 0x37e3c: 0x6dd09020, 0x37e3d: 0x6dd09220, 0x37e3e: 0x6dd09420, 0x37e3f: 0x6dd09620, + // Block 0xdf9, offset 0x37e40 + 0x37e40: 0x6dd09820, 0x37e41: 0x6dd09a20, 0x37e42: 0x6dd09c20, 0x37e43: 0x6dd09e20, + 0x37e44: 0x6dd0a020, 0x37e45: 0x6dd0a220, 0x37e46: 0x6dd0a420, 0x37e47: 0x6dd0a620, + 0x37e48: 0x6dd0a820, 0x37e49: 0x6dd0aa20, 0x37e4a: 0x6dea2e20, 0x37e4b: 0x6dea3020, + 0x37e4c: 0x6dea3220, 0x37e4d: 0x6dea3420, 0x37e4e: 0x6dea3620, 0x37e4f: 0x6dea3820, + 0x37e50: 0x6dea3a20, 0x37e51: 0x6dea3c20, 0x37e52: 0x6dea3e20, 0x37e53: 0x6dea4020, + 0x37e54: 0x6dea4220, 0x37e55: 0x6dea4420, 0x37e56: 0x6dea4620, 0x37e57: 0x6dea4820, + 0x37e58: 0x6dea4a20, 0x37e59: 0x6dea4c20, 0x37e5a: 0x6dea4e20, 0x37e5b: 0x6dea5020, + 0x37e5c: 0x6dea5220, 0x37e5d: 0x6dea5420, 0x37e5e: 0x6dea5620, 0x37e5f: 0x6dea5820, + 0x37e60: 0x6dea5a20, 0x37e61: 0x6dea5c20, 0x37e62: 0x6dea5e20, 0x37e63: 0x6dea6020, + 0x37e64: 0x6dea6220, 0x37e65: 0x6dffee20, 0x37e66: 0x6dfff020, 0x37e67: 0x6dfff220, + 0x37e68: 0x6dfff420, 0x37e69: 0x6dfff620, 0x37e6a: 0x6dfff820, 0x37e6b: 0x6dfffa20, + 0x37e6c: 0x6dfffc20, 0x37e6d: 0x6dfffe20, 0x37e6e: 0x6e000020, 0x37e6f: 0x6e000220, + 0x37e70: 0x6e000420, 0x37e71: 0x6e000620, 0x37e72: 0x6e000820, 0x37e73: 0x6e000a20, + 0x37e74: 0x6e000c20, 0x37e75: 0x6e000e20, 0x37e76: 0x6e001020, 0x37e77: 0x6e001220, + 0x37e78: 0x6e124a20, 0x37e79: 0x6e124c20, 0x37e7a: 0x6e124e20, 0x37e7b: 0x6e125020, + 0x37e7c: 0x6e125220, 0x37e7d: 0x6e125420, 0x37e7e: 0x6e125620, 0x37e7f: 0x6e206e20, + // Block 0xdfa, offset 0x37e80 + 0x37e80: 0x6e207020, 0x37e81: 0x6e207220, 0x37e82: 0x6e207420, 0x37e83: 0x6e207620, + 0x37e84: 0x6e207820, 0x37e85: 0x6e207a20, 0x37e86: 0x6e2b4c20, 0x37e87: 0x6e2b4e20, + 0x37e88: 0x6e2b5020, 0x37e89: 0x6e2b5220, 0x37e8a: 0x6e2b5420, 0x37e8b: 0x6e2b5620, + 0x37e8c: 0x6e2b5820, 0x37e8d: 0x6e2b5a20, 0x37e8e: 0x6e2b5c20, 0x37e8f: 0x6e2b5e20, + 0x37e90: 0x6e2b6020, 0x37e91: 0x6e33d020, 0x37e92: 0x6e33d220, 0x37e93: 0x6e33d420, + 0x37e94: 0x6e33d620, 0x37e95: 0x6e33d820, 0x37e96: 0x6e39b220, 0x37e97: 0x6e39b420, + 0x37e98: 0x6e3dde20, 0x37e99: 0x6e3de020, 0x37e9a: 0x6e3de220, 0x37e9b: 0x6e40be20, + 0x37e9c: 0x6e42ec20, 0x37e9d: 0x6c262620, 0x37e9e: 0x6c147c20, 0x37e9f: 0x6c5e3820, + 0x37ea0: 0x6c82d220, 0x37ea1: 0x6c82d420, 0x37ea2: 0x6c82d620, 0x37ea3: 0x6c82d820, + 0x37ea4: 0x6cabde20, 0x37ea5: 0x6cabe020, 0x37ea6: 0x6cda7220, 0x37ea7: 0x6cda7420, + 0x37ea8: 0x6cda7620, 0x37ea9: 0x6cda7820, 0x37eaa: 0x6d8d5c20, 0x37eab: 0x6d36e620, + 0x37eac: 0x6d36e820, 0x37ead: 0x6d635620, 0x37eae: 0x6d36ea20, 0x37eaf: 0x6d635820, + 0x37eb0: 0x6db16820, 0x37eb1: 0x6db16a20, 0x37eb2: 0x6dd0b220, 0x37eb3: 0x6dd0b420, + 0x37eb4: 0x6e125a20, 0x37eb5: 0x6e125c20, 0x37eb6: 0x6e207e20, 0x37eb7: 0x6e445e20, + 0x37eb8: 0x6e45ce20, 0x37eb9: 0x6c148020, 0x37eba: 0x6c262a20, 0x37ebb: 0x6c262c20, + 0x37ebc: 0x6c262e20, 0x37ebd: 0x6c3f1e20, 0x37ebe: 0x6c5e3a20, 0x37ebf: 0x6c5e3c20, + // Block 0xdfb, offset 0x37ec0 + 0x37ec0: 0x6c5e3e20, 0x37ec1: 0x6c82e020, 0x37ec2: 0x6c82e220, 0x37ec3: 0x6c82e420, + 0x37ec4: 0x6c82e620, 0x37ec5: 0x6c82e820, 0x37ec6: 0x6c82ea20, 0x37ec7: 0x6c82ec20, + 0x37ec8: 0x6c82ee20, 0x37ec9: 0x6c82f020, 0x37eca: 0x6c82f220, 0x37ecb: 0x6c82f420, + 0x37ecc: 0x6cabe220, 0x37ecd: 0x6cabe420, 0x37ece: 0x6cabe620, 0x37ecf: 0x6cabe820, + 0x37ed0: 0x6cda8220, 0x37ed1: 0x6cda8420, 0x37ed2: 0x6cda8620, 0x37ed3: 0x6cda8820, + 0x37ed4: 0x6d08fa20, 0x37ed5: 0x6d36ee20, 0x37ed6: 0x6d36f020, 0x37ed7: 0x6d36f220, + 0x37ed8: 0x6d635c20, 0x37ed9: 0x6d635e20, 0x37eda: 0x6d636020, 0x37edb: 0x6d636220, + 0x37edc: 0x6d636420, 0x37edd: 0x6d636620, 0x37ede: 0x6d8d6020, 0x37edf: 0x6d8d6220, + 0x37ee0: 0x6d8d6420, 0x37ee1: 0x6db16c20, 0x37ee2: 0x6db16e20, 0x37ee3: 0x6db17020, + 0x37ee4: 0x6db17220, 0x37ee5: 0x6dd0b820, 0x37ee6: 0x6dea6820, 0x37ee7: 0x6dea6a20, + 0x37ee8: 0x6dea6c20, 0x37ee9: 0x6dea6e20, 0x37eea: 0x6dea7020, 0x37eeb: 0x6e001620, + 0x37eec: 0x6e001820, 0x37eed: 0x6e001a20, 0x37eee: 0x6e001c20, 0x37eef: 0x6e125e20, + 0x37ef0: 0x6e126020, 0x37ef1: 0x6e33da20, 0x37ef2: 0x6e3de420, 0x37ef3: 0x6c148420, + 0x37ef4: 0x6c148620, 0x37ef5: 0x6c3f2020, 0x37ef6: 0x6c5e4420, 0x37ef7: 0x6c5e4620, + 0x37ef8: 0x6c5e4820, 0x37ef9: 0x6c82f620, 0x37efa: 0x6c82f820, 0x37efb: 0x6cabea20, + 0x37efc: 0x6cabec20, 0x37efd: 0x6cabee20, 0x37efe: 0x6cabf020, 0x37eff: 0x6cda9420, + // Block 0xdfc, offset 0x37f00 + 0x37f00: 0x6cda9620, 0x37f01: 0x6d08fe20, 0x37f02: 0x6d36f620, 0x37f03: 0x6d36f820, + 0x37f04: 0x6d36fa20, 0x37f05: 0x6d636a20, 0x37f06: 0x6d636c20, 0x37f07: 0x6d636e20, + 0x37f08: 0x6d1dd820, 0x37f09: 0x6d8d6820, 0x37f0a: 0x6d8d6a20, 0x37f0b: 0x6d8d6c20, + 0x37f0c: 0x6d8d6e20, 0x37f0d: 0x6d8d7020, 0x37f0e: 0x6db17420, 0x37f0f: 0x6dd0bc20, + 0x37f10: 0x6dd0be20, 0x37f11: 0x6c148a20, 0x37f12: 0x6c148c20, 0x37f13: 0x6c148e20, + 0x37f14: 0x6c263020, 0x37f15: 0x6c3f2620, 0x37f16: 0x6c3f2820, 0x37f17: 0x6c5e4c20, + 0x37f18: 0x6c5e4e20, 0x37f19: 0x6c3f2a20, 0x37f1a: 0x6c5e5020, 0x37f1b: 0x6c5e5220, + 0x37f1c: 0x6c5e5420, 0x37f1d: 0x6c830020, 0x37f1e: 0x6c830220, 0x37f1f: 0x6c830420, + 0x37f20: 0x6c830620, 0x37f21: 0x6c830820, 0x37f22: 0x6c830a20, 0x37f23: 0x6c830c20, + 0x37f24: 0x6c830e20, 0x37f25: 0x6cabf620, 0x37f26: 0x6cabf820, 0x37f27: 0x6c5e5620, + 0x37f28: 0x6cabfa20, 0x37f29: 0x6cabfc20, 0x37f2a: 0x6cabfe20, 0x37f2b: 0x6cac0020, + 0x37f2c: 0x6cac0220, 0x37f2d: 0x6cda9e20, 0x37f2e: 0x6cdaa020, 0x37f2f: 0x6cdaa220, + 0x37f30: 0x6cdaa420, 0x37f31: 0x6cdaa620, 0x37f32: 0x6cdaa820, 0x37f33: 0x6d090420, + 0x37f34: 0x6d090620, 0x37f35: 0x6d090820, 0x37f36: 0x6d090a20, 0x37f37: 0x6d090c20, + 0x37f38: 0x6d090e20, 0x37f39: 0x6d091020, 0x37f3a: 0x6d091220, 0x37f3b: 0x6d370420, + 0x37f3c: 0x6d370620, 0x37f3d: 0x6d370820, 0x37f3e: 0x6d370a20, 0x37f3f: 0x6d370c20, + // Block 0xdfd, offset 0x37f40 + 0x37f40: 0x6d370e20, 0x37f41: 0x6d371020, 0x37f42: 0x6d371220, 0x37f43: 0x6d371420, + 0x37f44: 0x6d371620, 0x37f45: 0x6d637220, 0x37f46: 0x6d637420, 0x37f47: 0x6d637620, + 0x37f48: 0x6d637820, 0x37f49: 0x6d637a20, 0x37f4a: 0x6d637c20, 0x37f4b: 0x6d637e20, + 0x37f4c: 0x6d638020, 0x37f4d: 0x6d638220, 0x37f4e: 0x6d638420, 0x37f4f: 0x6d8d7a20, + 0x37f50: 0x6d8d7c20, 0x37f51: 0x6d8d7e20, 0x37f52: 0x6d8d8020, 0x37f53: 0x6d8d8220, + 0x37f54: 0x6d5dd620, 0x37f55: 0x6d8d8420, 0x37f56: 0x6d8d8620, 0x37f57: 0x6d8d8820, + 0x37f58: 0x6db17620, 0x37f59: 0x6db17820, 0x37f5a: 0x6db17a20, 0x37f5b: 0x6db17c20, + 0x37f5c: 0x6db17e20, 0x37f5d: 0x6db18020, 0x37f5e: 0x6db18220, 0x37f5f: 0x6db18420, + 0x37f60: 0x6db18620, 0x37f61: 0x6dd0c220, 0x37f62: 0x6dd0c420, 0x37f63: 0x6dd0c620, + 0x37f64: 0x6dd0c820, 0x37f65: 0x6dd0ca20, 0x37f66: 0x6dd0cc20, 0x37f67: 0x6dd0ce20, + 0x37f68: 0x6dca2e20, 0x37f69: 0x6dea7620, 0x37f6a: 0x6dea7820, 0x37f6b: 0x6dea7a20, + 0x37f6c: 0x6dea7c20, 0x37f6d: 0x6e002020, 0x37f6e: 0x6e002220, 0x37f6f: 0x6dea7e20, + 0x37f70: 0x6e002420, 0x37f71: 0x6e002620, 0x37f72: 0x6e002820, 0x37f73: 0x6e002a20, + 0x37f74: 0x6e002c20, 0x37f75: 0x6e002e20, 0x37f76: 0x6e126220, 0x37f77: 0x6e126420, + 0x37f78: 0x6e126620, 0x37f79: 0x6e208020, 0x37f7a: 0x6e2b6420, 0x37f7b: 0x6e2b6620, + 0x37f7c: 0x6e33de20, 0x37f7d: 0x6e39b620, 0x37f7e: 0x6e39b820, 0x37f7f: 0x6e39ba20, + // Block 0xdfe, offset 0x37f80 + 0x37f80: 0x6e3de820, 0x37f81: 0x6e40c020, 0x37f82: 0x6e40c220, 0x37f83: 0x6e454420, + 0x37f84: 0x6e472c20, 0x37f85: 0x6e473620, 0x37f86: 0x6c263220, 0x37f87: 0x6c5e5820, + 0x37f88: 0x6c831620, 0x37f89: 0x6c831820, 0x37f8a: 0x6c831a20, 0x37f8b: 0x6c831c20, + 0x37f8c: 0x6c831e20, 0x37f8d: 0x6c832020, 0x37f8e: 0x6c832220, 0x37f8f: 0x6c832420, + 0x37f90: 0x6c832620, 0x37f91: 0x6cac0820, 0x37f92: 0x6cac0a20, 0x37f93: 0x6cac0c20, + 0x37f94: 0x6cac0e20, 0x37f95: 0x6cdaae20, 0x37f96: 0x6cdab020, 0x37f97: 0x6cdab220, + 0x37f98: 0x6cdab420, 0x37f99: 0x6cdab620, 0x37f9a: 0x6cdab820, 0x37f9b: 0x6cdaba20, + 0x37f9c: 0x6cdabc20, 0x37f9d: 0x6d091420, 0x37f9e: 0x6d091620, 0x37f9f: 0x6d371e20, + 0x37fa0: 0x6d372020, 0x37fa1: 0x6d372220, 0x37fa2: 0x6d372420, 0x37fa3: 0x6d372620, + 0x37fa4: 0x6d372820, 0x37fa5: 0x6d372a20, 0x37fa6: 0x6d372c20, 0x37fa7: 0x6d638c20, + 0x37fa8: 0x6d638e20, 0x37fa9: 0x6d639020, 0x37faa: 0x6d639220, 0x37fab: 0x6d639420, + 0x37fac: 0x6d639620, 0x37fad: 0x6d8d8c20, 0x37fae: 0x6d8d8e20, 0x37faf: 0x6d8d9020, + 0x37fb0: 0x6d8d9220, 0x37fb1: 0x6db18820, 0x37fb2: 0x6db18a20, 0x37fb3: 0x6db18c20, + 0x37fb4: 0x6dd0d420, 0x37fb5: 0x6dd0d620, 0x37fb6: 0x6dd0d820, 0x37fb7: 0x6dea8220, + 0x37fb8: 0x6e003020, 0x37fb9: 0x6e126820, 0x37fba: 0x6e208220, 0x37fbb: 0x6e2b6820, + 0x37fbc: 0x6e2b6a20, 0x37fbd: 0x6e3dec20, 0x37fbe: 0x6d639820, 0x37fbf: 0x6d639a20, + // Block 0xdff, offset 0x37fc0 + 0x37fc0: 0x6dd0da20, 0x37fc1: 0x6e003220, 0x37fc2: 0x6e2b6c20, 0x37fc3: 0x6e208620, + 0x37fc4: 0x6e33e020, 0x37fc5: 0x6e39bc20, 0x37fc6: 0x6e40c420, 0x37fc7: 0x6c263420, + 0x37fc8: 0x6c3f3820, 0x37fc9: 0x6c3f3a20, 0x37fca: 0x6c3f3c20, 0x37fcb: 0x6c3f3e20, + 0x37fcc: 0x6c3f4020, 0x37fcd: 0x6c3f4220, 0x37fce: 0x6c5e6820, 0x37fcf: 0x6c5e6a20, + 0x37fd0: 0x6c5e6c20, 0x37fd1: 0x6c5e6e20, 0x37fd2: 0x6c5e7020, 0x37fd3: 0x6c5e7220, + 0x37fd4: 0x6c5e7420, 0x37fd5: 0x6c834620, 0x37fd6: 0x6c834820, 0x37fd7: 0x6c834a20, + 0x37fd8: 0x6c834c20, 0x37fd9: 0x6c834e20, 0x37fda: 0x6c835020, 0x37fdb: 0x6c835220, + 0x37fdc: 0x6c835420, 0x37fdd: 0x6c835620, 0x37fde: 0x6c835820, 0x37fdf: 0x6c835a20, + 0x37fe0: 0x6c835c20, 0x37fe1: 0x6cac2c20, 0x37fe2: 0x6cac2e20, 0x37fe3: 0x6cac3020, + 0x37fe4: 0x6cac3220, 0x37fe5: 0x6cac3420, 0x37fe6: 0x6cac3620, 0x37fe7: 0x6cac3820, + 0x37fe8: 0x6cac3a20, 0x37fe9: 0x6cac3c20, 0x37fea: 0x6cac3e20, 0x37feb: 0x6cac4020, + 0x37fec: 0x6cac4220, 0x37fed: 0x6cac4420, 0x37fee: 0x6cac4620, 0x37fef: 0x6cdad220, + 0x37ff0: 0x6cdad420, 0x37ff1: 0x6cdad620, 0x37ff2: 0x6cdad820, 0x37ff3: 0x6d093620, + 0x37ff4: 0x6cdada20, 0x37ff5: 0x6cdadc20, 0x37ff6: 0x6cdade20, 0x37ff7: 0x6cdae020, + 0x37ff8: 0x6cdae220, 0x37ff9: 0x6cdae420, 0x37ffa: 0x6cdae620, 0x37ffb: 0x6cdae820, + 0x37ffc: 0x6cdaea20, 0x37ffd: 0x6d093820, 0x37ffe: 0x6d093a20, 0x37fff: 0x6d093c20, + // Block 0xe00, offset 0x38000 + 0x38000: 0x6d093e20, 0x38001: 0x6d094020, 0x38002: 0x6d094220, 0x38003: 0x6d094420, + 0x38004: 0x6d094620, 0x38005: 0x6d094820, 0x38006: 0x6d094a20, 0x38007: 0x6d094c20, + 0x38008: 0x6d094e20, 0x38009: 0x6d095020, 0x3800a: 0x6d374a20, 0x3800b: 0x6d374c20, + 0x3800c: 0x6d374e20, 0x3800d: 0x6d375020, 0x3800e: 0x6d375220, 0x3800f: 0x6d375420, + 0x38010: 0x6d375620, 0x38011: 0x6d375820, 0x38012: 0x6d375a20, 0x38013: 0x6d375c20, + 0x38014: 0x6d375e20, 0x38015: 0x6d376020, 0x38016: 0x6d376220, 0x38017: 0x6d376420, + 0x38018: 0x6d376620, 0x38019: 0x6d376820, 0x3801a: 0x6d376a20, 0x3801b: 0x6d376c20, + 0x3801c: 0x6d376e20, 0x3801d: 0x6d63b020, 0x3801e: 0x6d63b220, 0x3801f: 0x6d63b420, + 0x38020: 0x6d63b620, 0x38021: 0x6d63b820, 0x38022: 0x6d63ba20, 0x38023: 0x6d63bc20, + 0x38024: 0x6d63be20, 0x38025: 0x6d63c020, 0x38026: 0x6d63c220, 0x38027: 0x6d63c420, + 0x38028: 0x6d63c620, 0x38029: 0x6d63c820, 0x3802a: 0x6d63ca20, 0x3802b: 0x6d63cc20, + 0x3802c: 0x6d63ce20, 0x3802d: 0x6d63d020, 0x3802e: 0x6d63d220, 0x3802f: 0x6d63d420, + 0x38030: 0x6d63d620, 0x38031: 0x6d63d820, 0x38032: 0x6d63da20, 0x38033: 0x6d63dc20, + 0x38034: 0x6d8da820, 0x38035: 0x6d8daa20, 0x38036: 0x6d8dac20, 0x38037: 0x6d8dae20, + 0x38038: 0x6d8db020, 0x38039: 0x6d8db220, 0x3803a: 0x6d8db420, 0x3803b: 0x6d8db620, + 0x3803c: 0x6d8db820, 0x3803d: 0x6d8dba20, 0x3803e: 0x6d8dbc20, 0x3803f: 0x6d63de20, + // Block 0xe01, offset 0x38040 + 0x38040: 0x6d8dbe20, 0x38041: 0x6d8dc020, 0x38042: 0x6d8dc220, 0x38043: 0x6d8dc420, + 0x38044: 0x6d8dc620, 0x38045: 0x6d8dc820, 0x38046: 0x6db1a420, 0x38047: 0x6db1a620, + 0x38048: 0x6db1a820, 0x38049: 0x6db1aa20, 0x3804a: 0x6db1ac20, 0x3804b: 0x6db1ae20, + 0x3804c: 0x6db1b020, 0x3804d: 0x6db1b220, 0x3804e: 0x6db1b420, 0x3804f: 0x6db1b620, + 0x38050: 0x6db1b820, 0x38051: 0x6dd0e820, 0x38052: 0x6dd0ea20, 0x38053: 0x6dd0ec20, + 0x38054: 0x6dd0ee20, 0x38055: 0x6dd0f020, 0x38056: 0x6dd0f220, 0x38057: 0x6dd0f420, + 0x38058: 0x6dd0f620, 0x38059: 0x6dd0f820, 0x3805a: 0x6dd0fa20, 0x3805b: 0x6dd0fc20, + 0x3805c: 0x6dd0fe20, 0x3805d: 0x6dd10020, 0x3805e: 0x6dd10220, 0x3805f: 0x6dd10420, + 0x38060: 0x6dd10620, 0x38061: 0x6dd10820, 0x38062: 0x6dd10a20, 0x38063: 0x6dd10c20, + 0x38064: 0x6dd10e20, 0x38065: 0x6dd11020, 0x38066: 0x6dd11220, 0x38067: 0x6dd11420, + 0x38068: 0x6dea9020, 0x38069: 0x6dea9220, 0x3806a: 0x6dea9420, 0x3806b: 0x6dea9620, + 0x3806c: 0x6dea9820, 0x3806d: 0x6dea9a20, 0x3806e: 0x6dea9c20, 0x3806f: 0x6dea9e20, + 0x38070: 0x6deaa020, 0x38071: 0x6e003e20, 0x38072: 0x6e004020, 0x38073: 0x6e004220, + 0x38074: 0x6e004420, 0x38075: 0x6e004620, 0x38076: 0x6e126e20, 0x38077: 0x6e127020, + 0x38078: 0x6e127220, 0x38079: 0x6e105820, 0x3807a: 0x6e127420, 0x3807b: 0x6e127620, + 0x3807c: 0x6e127820, 0x3807d: 0x6e208a20, 0x3807e: 0x6e208c20, 0x3807f: 0x6e208e20, + // Block 0xe02, offset 0x38080 + 0x38080: 0x6e209020, 0x38081: 0x6e209220, 0x38082: 0x6e209420, 0x38083: 0x6e2b7020, + 0x38084: 0x6e2b7220, 0x38085: 0x6e39be20, 0x38086: 0x6e39c020, 0x38087: 0x6e3dee20, + 0x38088: 0x6e40c620, 0x38089: 0x6e3df020, 0x3808a: 0x6e454620, 0x3808b: 0x6c5e7820, + 0x3808c: 0x6cac4820, 0x3808d: 0x6cac4a20, 0x3808e: 0x6cdaec20, 0x3808f: 0x6d095220, + 0x38090: 0x6d63e420, 0x38091: 0x6db1be20, 0x38092: 0x6e004a20, 0x38093: 0x6c5e7c20, + 0x38094: 0x6cac5020, 0x38095: 0x6cac5220, 0x38096: 0x6cac5420, 0x38097: 0x6cac5620, + 0x38098: 0x6cac5820, 0x38099: 0x6cac5a20, 0x3809a: 0x6cdaee20, 0x3809b: 0x6d095420, + 0x3809c: 0x6d095620, 0x3809d: 0x6d095820, 0x3809e: 0x6d377420, 0x3809f: 0x6d377620, + 0x380a0: 0x6d377820, 0x380a1: 0x6d377a20, 0x380a2: 0x6d377c20, 0x380a3: 0x6d377e20, + 0x380a4: 0x6d63e620, 0x380a5: 0x6d63e820, 0x380a6: 0x6d63ea20, 0x380a7: 0x6d63ec20, + 0x380a8: 0x6d63ee20, 0x380a9: 0x6d63f020, 0x380aa: 0x6d8dce20, 0x380ab: 0x6d8dd020, + 0x380ac: 0x6d8dd220, 0x380ad: 0x6d8dd420, 0x380ae: 0x6d8dd620, 0x380af: 0x6e004c20, + 0x380b0: 0x6e004e20, 0x380b1: 0x6e005020, 0x380b2: 0x6e39c220, 0x380b3: 0x6c0a5a20, + 0x380b4: 0x6c0a5c20, 0x380b5: 0x6c0a5e20, 0x380b6: 0x6c14b020, 0x380b7: 0x6c14b220, + 0x380b8: 0x6c14b420, 0x380b9: 0x6c14b620, 0x380ba: 0x6c14b820, 0x380bb: 0x6c14ba20, + 0x380bc: 0x6c14bc20, 0x380bd: 0x6c14be20, 0x380be: 0x6c14c020, 0x380bf: 0x6c14c220, + // Block 0xe03, offset 0x380c0 + 0x380c0: 0x6c14c420, 0x380c1: 0x6c266020, 0x380c2: 0x6c266220, 0x380c3: 0x6c266420, + 0x380c4: 0x6c266620, 0x380c5: 0x6c266820, 0x380c6: 0x6c266a20, 0x380c7: 0x6c266c20, + 0x380c8: 0x6c266e20, 0x380c9: 0x6c267020, 0x380ca: 0x6c267220, 0x380cb: 0x6c267420, + 0x380cc: 0x6c267620, 0x380cd: 0x6c267820, 0x380ce: 0x6c267a20, 0x380cf: 0x6c267c20, + 0x380d0: 0x6c267e20, 0x380d1: 0x6c268020, 0x380d2: 0x6c268220, 0x380d3: 0x6c3fba20, + 0x380d4: 0x6c3fbc20, 0x380d5: 0x6c3fbe20, 0x380d6: 0x6c3fc020, 0x380d7: 0x6c3fc220, + 0x380d8: 0x6c3fc420, 0x380d9: 0x6c3fc620, 0x380da: 0x6c3fc820, 0x380db: 0x6c3fca20, + 0x380dc: 0x6c3fcc20, 0x380dd: 0x6c3fce20, 0x380de: 0x6c3fd020, 0x380df: 0x6c3fd220, + 0x380e0: 0x6c3fd420, 0x380e1: 0x6c3fd620, 0x380e2: 0x6c3fd820, 0x380e3: 0x6c3fda20, + 0x380e4: 0x6c3fdc20, 0x380e5: 0x6c3fde20, 0x380e6: 0x6c3fe020, 0x380e7: 0x6c3fe220, + 0x380e8: 0x6c3fe420, 0x380e9: 0x6c3fe620, 0x380ea: 0x6c3fe820, 0x380eb: 0x6c3fea20, + 0x380ec: 0x6c3fec20, 0x380ed: 0x6c3fee20, 0x380ee: 0x6c3ff020, 0x380ef: 0x6c3ff220, + 0x380f0: 0x6c3ff420, 0x380f1: 0x6c3ff620, 0x380f2: 0x6c3ff820, 0x380f3: 0x6c3ffa20, + 0x380f4: 0x6c3ffc20, 0x380f5: 0x6c3ffe20, 0x380f6: 0x6c400020, 0x380f7: 0x6c5f1220, + 0x380f8: 0x6c5f1420, 0x380f9: 0x6c5f1620, 0x380fa: 0x6c5f1820, 0x380fb: 0x6c5f1a20, + 0x380fc: 0x6c5f1c20, 0x380fd: 0x6c5f1e20, 0x380fe: 0x6c5f2020, 0x380ff: 0x6c5f2220, + // Block 0xe04, offset 0x38100 + 0x38100: 0x6c5f2420, 0x38101: 0x6c5f2620, 0x38102: 0x6c5f2820, 0x38103: 0x6c5f2a20, + 0x38104: 0x6c5f2c20, 0x38105: 0x6c5f2e20, 0x38106: 0x6c5f3020, 0x38107: 0x6c5f3220, + 0x38108: 0x6c5f3420, 0x38109: 0x6c5f3620, 0x3810a: 0x6c5f3820, 0x3810b: 0x6c5f3a20, + 0x3810c: 0x6c5f3c20, 0x3810d: 0x6c5f3e20, 0x3810e: 0x6c5f4020, 0x3810f: 0x6c5f4220, + 0x38110: 0x6c5f4420, 0x38111: 0x6c5f4620, 0x38112: 0x6c5f4820, 0x38113: 0x6c5f4a20, + 0x38114: 0x6c5f4c20, 0x38115: 0x6c5f4e20, 0x38116: 0x6c5f5020, 0x38117: 0x6c5f5220, + 0x38118: 0x6c5f5420, 0x38119: 0x6c5f5620, 0x3811a: 0x6c5f5820, 0x3811b: 0x6c5f5a20, + 0x3811c: 0x6c5f5c20, 0x3811d: 0x6c5f5e20, 0x3811e: 0x6c5f6020, 0x3811f: 0x6c5f6220, + 0x38120: 0x6c5f6420, 0x38121: 0x6c5f6620, 0x38122: 0x6c5f6820, 0x38123: 0x6c5f6a20, + 0x38124: 0x6c5f6c20, 0x38125: 0x6c5f6e20, 0x38126: 0x6c5f7020, 0x38127: 0x6c5f7220, + 0x38128: 0x6c5f7420, 0x38129: 0x6c5f7620, 0x3812a: 0x6c5f7820, 0x3812b: 0x6c5f7a20, + 0x3812c: 0x6c5f7c20, 0x3812d: 0x6c841e20, 0x3812e: 0x6c842020, 0x3812f: 0x6c842220, + 0x38130: 0x6c842420, 0x38131: 0x6c842620, 0x38132: 0x6c842820, 0x38133: 0x6c842a20, + 0x38134: 0x6c842c20, 0x38135: 0x6c842e20, 0x38136: 0x6c843020, 0x38137: 0x6c843220, + 0x38138: 0x6c843420, 0x38139: 0x6c843620, 0x3813a: 0x6c843820, 0x3813b: 0x6c843a20, + 0x3813c: 0x6c843c20, 0x3813d: 0x6c843e20, 0x3813e: 0x6c844020, 0x3813f: 0x6c844220, + // Block 0xe05, offset 0x38140 + 0x38140: 0x6c844420, 0x38141: 0x6c844620, 0x38142: 0x6c844820, 0x38143: 0x6c844a20, + 0x38144: 0x6c844c20, 0x38145: 0x6c844e20, 0x38146: 0x6c845020, 0x38147: 0x6c845220, + 0x38148: 0x6c845420, 0x38149: 0x6c845620, 0x3814a: 0x6c845820, 0x3814b: 0x6c845a20, + 0x3814c: 0x6c845c20, 0x3814d: 0x6c845e20, 0x3814e: 0x6c846020, 0x3814f: 0x6c846220, + 0x38150: 0x6c846420, 0x38151: 0x6c846620, 0x38152: 0x6c846820, 0x38153: 0x6c846a20, + 0x38154: 0x6c846c20, 0x38155: 0x6c846e20, 0x38156: 0x6c847020, 0x38157: 0x6c847220, + 0x38158: 0x6c847420, 0x38159: 0x6c847620, 0x3815a: 0x6c847820, 0x3815b: 0x6c847a20, + 0x3815c: 0x6c847c20, 0x3815d: 0x6c847e20, 0x3815e: 0x6c848020, 0x3815f: 0x6c848220, + 0x38160: 0x6c848420, 0x38161: 0x6c848620, 0x38162: 0x6c848820, 0x38163: 0x6c848a20, + 0x38164: 0x6c848c20, 0x38165: 0x6c848e20, 0x38166: 0x6c849020, 0x38167: 0x6c849220, + 0x38168: 0x6c849420, 0x38169: 0x6c849620, 0x3816a: 0x6c849820, 0x3816b: 0x6c849a20, + 0x3816c: 0x6c849c20, 0x3816d: 0x6c849e20, 0x3816e: 0x6c84a020, 0x3816f: 0x6c84a220, + 0x38170: 0x6c84a420, 0x38171: 0x6c84a620, 0x38172: 0x6c84a820, 0x38173: 0x6c84aa20, + 0x38174: 0x6c84ac20, 0x38175: 0x6c84ae20, 0x38176: 0x6cad1020, 0x38177: 0x6cad1220, + 0x38178: 0x6cad1420, 0x38179: 0x6cad1620, 0x3817a: 0x6cad1820, 0x3817b: 0x6cad1a20, + 0x3817c: 0x6cad1c20, 0x3817d: 0x6cad1e20, 0x3817e: 0x6cad2020, 0x3817f: 0x6cad2220, + // Block 0xe06, offset 0x38180 + 0x38180: 0x6cad2420, 0x38181: 0x6cad2620, 0x38182: 0x6cad2820, 0x38183: 0x6cad2a20, + 0x38184: 0x6cad2c20, 0x38185: 0x6cad2e20, 0x38186: 0x6cad3020, 0x38187: 0x6cad3220, + 0x38188: 0x6cad3420, 0x38189: 0x6cad3620, 0x3818a: 0x6cad3820, 0x3818b: 0x6cad3a20, + 0x3818c: 0x6cad3c20, 0x3818d: 0x6cad3e20, 0x3818e: 0x6cad4020, 0x3818f: 0x6cad4220, + 0x38190: 0x6cad4420, 0x38191: 0x6cad4620, 0x38192: 0x6cad4820, 0x38193: 0x6cad4a20, + 0x38194: 0x6cad4c20, 0x38195: 0x6cad4e20, 0x38196: 0x6cad5020, 0x38197: 0x6cad5220, + 0x38198: 0x6cad5420, 0x38199: 0x6cad5620, 0x3819a: 0x6cad5820, 0x3819b: 0x6cad5a20, + 0x3819c: 0x6cad5c20, 0x3819d: 0x6cad5e20, 0x3819e: 0x6cad6020, 0x3819f: 0x6cad6220, + 0x381a0: 0x6cad6420, 0x381a1: 0x6cad6620, 0x381a2: 0x6cad6820, 0x381a3: 0x6cad6a20, + 0x381a4: 0x6cad6c20, 0x381a5: 0x6cad6e20, 0x381a6: 0x6cad7020, 0x381a7: 0x6cad7220, + 0x381a8: 0x6cad7420, 0x381a9: 0x6cad7620, 0x381aa: 0x6cad7820, 0x381ab: 0x6cad7a20, + 0x381ac: 0x6cad7c20, 0x381ad: 0x6cad7e20, 0x381ae: 0x6cad8020, 0x381af: 0x6cad8220, + 0x381b0: 0x6cad8420, 0x381b1: 0x6cdbf020, 0x381b2: 0x6cad8620, 0x381b3: 0x6cad8820, + 0x381b4: 0x6cad8a20, 0x381b5: 0x6cad8c20, 0x381b6: 0x6cad8e20, 0x381b7: 0x6cad9020, + 0x381b8: 0x6cad9220, 0x381b9: 0x6cad9420, 0x381ba: 0x6cad9620, 0x381bb: 0x6cad9820, + 0x381bc: 0x6cad9a20, 0x381bd: 0x6cad9c20, 0x381be: 0x6cad9e20, 0x381bf: 0x6cada020, + // Block 0xe07, offset 0x381c0 + 0x381c0: 0x6cada220, 0x381c1: 0x6cada420, 0x381c2: 0x6cada620, 0x381c3: 0x6cada820, + 0x381c4: 0x6cadaa20, 0x381c5: 0x6cadac20, 0x381c6: 0x6cadae20, 0x381c7: 0x6cadb020, + 0x381c8: 0x6cadb220, 0x381c9: 0x6cadb420, 0x381ca: 0x6cadb620, 0x381cb: 0x6cadb820, + 0x381cc: 0x6cadba20, 0x381cd: 0x6cadbc20, 0x381ce: 0x6cadbe20, 0x381cf: 0x6cadc020, + 0x381d0: 0x6cadc220, 0x381d1: 0x6cadc420, 0x381d2: 0x6cadc620, 0x381d3: 0x6cadc820, + 0x381d4: 0x6cadca20, 0x381d5: 0x6cadcc20, 0x381d6: 0x6cdbf220, 0x381d7: 0x6cadce20, + 0x381d8: 0x6cadd020, 0x381d9: 0x6cadd220, 0x381da: 0x6cadd420, 0x381db: 0x6cadd620, + 0x381dc: 0x6cadd820, 0x381dd: 0x6cadda20, 0x381de: 0x6caddc20, 0x381df: 0x6cadde20, + 0x381e0: 0x6cade020, 0x381e1: 0x6cade220, 0x381e2: 0x6cade420, 0x381e3: 0x6cade620, + 0x381e4: 0x6cade820, 0x381e5: 0x6cadea20, 0x381e6: 0x6cadec20, 0x381e7: 0x6cadee20, + 0x381e8: 0x6cadf020, 0x381e9: 0x6cadf220, 0x381ea: 0x6cdbf420, 0x381eb: 0x6cdbf620, + 0x381ec: 0x6cdbf820, 0x381ed: 0x6cdbfa20, 0x381ee: 0x6cdbfc20, 0x381ef: 0x6cdbfe20, + 0x381f0: 0x6cdc0020, 0x381f1: 0x6cdc0220, 0x381f2: 0x6cdc0420, 0x381f3: 0x6cdc0620, + 0x381f4: 0x6cdc0820, 0x381f5: 0x6cdc0a20, 0x381f6: 0x6cdc0c20, 0x381f7: 0x6cdc0e20, + 0x381f8: 0x6cdc1020, 0x381f9: 0x6cdc1220, 0x381fa: 0x6cdc1420, 0x381fb: 0x6cdc1620, + 0x381fc: 0x6cdc1820, 0x381fd: 0x6cdc1a20, 0x381fe: 0x6cdc1c20, 0x381ff: 0x6cdc1e20, + // Block 0xe08, offset 0x38200 + 0x38200: 0x6cdc2020, 0x38201: 0x6cdc2220, 0x38202: 0x6cdc2420, 0x38203: 0x6cdc2620, + 0x38204: 0x6cdc2820, 0x38205: 0x6cdc2a20, 0x38206: 0x6cdc2c20, 0x38207: 0x6cdc2e20, + 0x38208: 0x6cdc3020, 0x38209: 0x6cdc3220, 0x3820a: 0x6cdc3420, 0x3820b: 0x6cdc3620, + 0x3820c: 0x6cdc3820, 0x3820d: 0x6cdc3a20, 0x3820e: 0x6cdc3c20, 0x3820f: 0x6cdc3e20, + 0x38210: 0x6cdc4020, 0x38211: 0x6cdc4220, 0x38212: 0x6cdc4420, 0x38213: 0x6cdc4620, + 0x38214: 0x6cdc4820, 0x38215: 0x6cdc4a20, 0x38216: 0x6cdc4c20, 0x38217: 0x6cdc4e20, + 0x38218: 0x6cdc5020, 0x38219: 0x6cdc5220, 0x3821a: 0x6cdc5420, 0x3821b: 0x6cdc5620, + 0x3821c: 0x6cdc5820, 0x3821d: 0x6cdc5a20, 0x3821e: 0x6cdc5c20, 0x3821f: 0x6cdc5e20, + 0x38220: 0x6cdc6020, 0x38221: 0x6cdc6220, 0x38222: 0x6cdc6420, 0x38223: 0x6cdc6620, + 0x38224: 0x6cdc6820, 0x38225: 0x6cdc6a20, 0x38226: 0x6cdc6c20, 0x38227: 0x6cdc6e20, + 0x38228: 0x6cdc7020, 0x38229: 0x6cdc7220, 0x3822a: 0x6cdc7420, 0x3822b: 0x6cdc7620, + 0x3822c: 0x6cdc7820, 0x3822d: 0x6cdc7a20, 0x3822e: 0x6cdc7c20, 0x3822f: 0x6cdc7e20, + 0x38230: 0x6cdc8020, 0x38231: 0x6cdc8220, 0x38232: 0x6cdc8420, 0x38233: 0x6cdc8620, + 0x38234: 0x6cdc8820, 0x38235: 0x6cdc8a20, 0x38236: 0x6cdc8c20, 0x38237: 0x6cdc8e20, + 0x38238: 0x6cdc9020, 0x38239: 0x6cdc9220, 0x3823a: 0x6cdc9420, 0x3823b: 0x6cdc9620, + 0x3823c: 0x6cdc9820, 0x3823d: 0x6cdc9a20, 0x3823e: 0x6cdc9c20, 0x3823f: 0x6cdc9e20, + // Block 0xe09, offset 0x38240 + 0x38240: 0x6cdca020, 0x38241: 0x6cdca220, 0x38242: 0x6cdca420, 0x38243: 0x6cdca620, + 0x38244: 0x6cdca820, 0x38245: 0x6cdcaa20, 0x38246: 0x6cdcac20, 0x38247: 0x6cdcae20, + 0x38248: 0x6cdcb020, 0x38249: 0x6cdcb220, 0x3824a: 0x6cdcb420, 0x3824b: 0x6cdcb620, + 0x3824c: 0x6cdcb820, 0x3824d: 0x6cdcba20, 0x3824e: 0x6cdcbc20, 0x3824f: 0x6cdcbe20, + 0x38250: 0x6cdcc020, 0x38251: 0x6cdcc220, 0x38252: 0x6cdcc420, 0x38253: 0x6cdcc620, + 0x38254: 0x6cdcc820, 0x38255: 0x6cdcca20, 0x38256: 0x6cdccc20, 0x38257: 0x6cdcce20, + 0x38258: 0x6cdcd020, 0x38259: 0x6cdcd220, 0x3825a: 0x6cdcd420, 0x3825b: 0x6cdcd620, + 0x3825c: 0x6cdcd820, 0x3825d: 0x6cdcda20, 0x3825e: 0x6cdcdc20, 0x3825f: 0x6cdcde20, + 0x38260: 0x6cdce020, 0x38261: 0x6cdce220, 0x38262: 0x6cdce420, 0x38263: 0x6cdce620, + 0x38264: 0x6cdce820, 0x38265: 0x6cdcea20, 0x38266: 0x6cdcec20, 0x38267: 0x6cdcee20, + 0x38268: 0x6cdcf020, 0x38269: 0x6cdcf220, 0x3826a: 0x6cdcf420, 0x3826b: 0x6cdcf620, + 0x3826c: 0x6cdcf820, 0x3826d: 0x6cdcfa20, 0x3826e: 0x6cdcfc20, 0x3826f: 0x6cdcfe20, + 0x38270: 0x6cdd0020, 0x38271: 0x6cdd0220, 0x38272: 0x6cdd0420, 0x38273: 0x6cdd0620, + 0x38274: 0x6cdd0820, 0x38275: 0x6cdd0a20, 0x38276: 0x6cdd0c20, 0x38277: 0x6cdd0e20, + 0x38278: 0x6cdd1020, 0x38279: 0x6cdd1220, 0x3827a: 0x6cdd1420, 0x3827b: 0x6cdd1620, + 0x3827c: 0x6cdd1820, 0x3827d: 0x6cdd1a20, 0x3827e: 0x6cdd1c20, 0x3827f: 0x6cdd1e20, + // Block 0xe0a, offset 0x38280 + 0x38280: 0x6cdd2020, 0x38281: 0x6d0a5020, 0x38282: 0x6d0a5220, 0x38283: 0x6d0a5420, + 0x38284: 0x6d0a5620, 0x38285: 0x6d0a5820, 0x38286: 0x6d0a5a20, 0x38287: 0x6d0a5c20, + 0x38288: 0x6d0a5e20, 0x38289: 0x6d0a6020, 0x3828a: 0x6d0a6220, 0x3828b: 0x6d0a6420, + 0x3828c: 0x6d0a6620, 0x3828d: 0x6d0a6820, 0x3828e: 0x6d0a6a20, 0x3828f: 0x6d0a6c20, + 0x38290: 0x6d0a6e20, 0x38291: 0x6d0a7020, 0x38292: 0x6d0a7220, 0x38293: 0x6d0a7420, + 0x38294: 0x6d0a7620, 0x38295: 0x6d0a7820, 0x38296: 0x6d0a7a20, 0x38297: 0x6d0a7c20, + 0x38298: 0x6d0a7e20, 0x38299: 0x6d0a8020, 0x3829a: 0x6d0a8220, 0x3829b: 0x6d0a8420, + 0x3829c: 0x6d0a8620, 0x3829d: 0x6d0a8820, 0x3829e: 0x6d0a8a20, 0x3829f: 0x6d0a8c20, + 0x382a0: 0x6d0a8e20, 0x382a1: 0x6d0a9020, 0x382a2: 0x6d0a9220, 0x382a3: 0x6d0a9420, + 0x382a4: 0x6d0a9620, 0x382a5: 0x6d0a9820, 0x382a6: 0x6d0a9a20, 0x382a7: 0x6d0a9c20, + 0x382a8: 0x6d0a9e20, 0x382a9: 0x6d0aa020, 0x382aa: 0x6d0aa220, 0x382ab: 0x6d0aa420, + 0x382ac: 0x6d0aa620, 0x382ad: 0x6d0aa820, 0x382ae: 0x6d0aaa20, 0x382af: 0x6d0aac20, + 0x382b0: 0x6d0aae20, 0x382b1: 0x6d0ab020, 0x382b2: 0x6d0ab220, 0x382b3: 0x6d0ab420, + 0x382b4: 0x6d0ab620, 0x382b5: 0x6d0ab820, 0x382b6: 0x6d0aba20, 0x382b7: 0x6d0abc20, + 0x382b8: 0x6d0abe20, 0x382b9: 0x6d0ac020, 0x382ba: 0x6d0ac220, 0x382bb: 0x6d0ac420, + 0x382bc: 0x6d0ac620, 0x382bd: 0x6d0ac820, 0x382be: 0x6d0aca20, 0x382bf: 0x6d0acc20, + // Block 0xe0b, offset 0x382c0 + 0x382c0: 0x6d0ace20, 0x382c1: 0x6d0ad020, 0x382c2: 0x6d0ad220, 0x382c3: 0x6d0ad420, + 0x382c4: 0x6d0ad620, 0x382c5: 0x6d0ad820, 0x382c6: 0x6d0ada20, 0x382c7: 0x6d0adc20, + 0x382c8: 0x6d0ade20, 0x382c9: 0x6d0ae020, 0x382ca: 0x6d0ae220, 0x382cb: 0x6d0ae420, + 0x382cc: 0x6d0ae620, 0x382cd: 0x6d0ae820, 0x382ce: 0x6d0aea20, 0x382cf: 0x6d0aec20, + 0x382d0: 0x6d0aee20, 0x382d1: 0x6d0af020, 0x382d2: 0x6d0af220, 0x382d3: 0x6d0af420, + 0x382d4: 0x6d0af620, 0x382d5: 0x6d0af820, 0x382d6: 0x6d0afa20, 0x382d7: 0x6d0afc20, + 0x382d8: 0x6d0afe20, 0x382d9: 0x6d0b0020, 0x382da: 0x6d0b0220, 0x382db: 0x6d0b0420, + 0x382dc: 0x6d0b0620, 0x382dd: 0x6d0b0820, 0x382de: 0x6d0b0a20, 0x382df: 0x6d0b0c20, + 0x382e0: 0x6d0b0e20, 0x382e1: 0x6d0b1020, 0x382e2: 0x6d0b1220, 0x382e3: 0x6d0b1420, + 0x382e4: 0x6d0b1620, 0x382e5: 0x6d0b1820, 0x382e6: 0x6d0b1a20, 0x382e7: 0x6d0b1c20, + 0x382e8: 0x6d0b1e20, 0x382e9: 0x6d0b2020, 0x382ea: 0x6d0b2220, 0x382eb: 0x6d0b2420, + 0x382ec: 0x6d0b2620, 0x382ed: 0x6d0b2820, 0x382ee: 0x6d0b2a20, 0x382ef: 0x6d0b2c20, + 0x382f0: 0x6d0b2e20, 0x382f1: 0x6d0b3020, 0x382f2: 0x6d0b3220, 0x382f3: 0x6d0b3420, + 0x382f4: 0x6d0b3620, 0x382f5: 0x6d0b3820, 0x382f6: 0x6cfba420, 0x382f7: 0x6d0b3a20, + 0x382f8: 0x6d0b3c20, 0x382f9: 0x6d0b3e20, 0x382fa: 0x6d0b4020, 0x382fb: 0x6d0b4220, + 0x382fc: 0x6d0b4420, 0x382fd: 0x6d0b4620, 0x382fe: 0x6d0b4820, 0x382ff: 0x6d0b4a20, + // Block 0xe0c, offset 0x38300 + 0x38300: 0x6d0b4c20, 0x38301: 0x6d0b4e20, 0x38302: 0x6d0b5020, 0x38303: 0x6d0b5220, + 0x38304: 0x6d0b5420, 0x38305: 0x6d0b5620, 0x38306: 0x6d0b5820, 0x38307: 0x6d385420, + 0x38308: 0x6d0b5a20, 0x38309: 0x6d0b5c20, 0x3830a: 0x6d0b5e20, 0x3830b: 0x6d0b6020, + 0x3830c: 0x6d0b6220, 0x3830d: 0x6d0b6420, 0x3830e: 0x6d0b6620, 0x3830f: 0x6d0b6820, + 0x38310: 0x6d0b6a20, 0x38311: 0x6d0b6c20, 0x38312: 0x6d0b6e20, 0x38313: 0x6d0b7020, + 0x38314: 0x6d0b7220, 0x38315: 0x6d0b7420, 0x38316: 0x6d0b7620, 0x38317: 0x6d0b7820, + 0x38318: 0x6d0b7a20, 0x38319: 0x6d0b7c20, 0x3831a: 0x6d0b7e20, 0x3831b: 0x6d0b8020, + 0x3831c: 0x6d0b8220, 0x3831d: 0x6d0b8420, 0x3831e: 0x6d0b8620, 0x3831f: 0x6d0b8820, + 0x38320: 0x6d0b8a20, 0x38321: 0x6d385620, 0x38322: 0x6d385820, 0x38323: 0x6d385a20, + 0x38324: 0x6d385c20, 0x38325: 0x6d385e20, 0x38326: 0x6d386020, 0x38327: 0x6d386220, + 0x38328: 0x6d386420, 0x38329: 0x6d386620, 0x3832a: 0x6d386820, 0x3832b: 0x6d386a20, + 0x3832c: 0x6d386c20, 0x3832d: 0x6d386e20, 0x3832e: 0x6d387020, 0x3832f: 0x6d387220, + 0x38330: 0x6d387420, 0x38331: 0x6d387620, 0x38332: 0x6d387820, 0x38333: 0x6d387a20, + 0x38334: 0x6d387c20, 0x38335: 0x6d387e20, 0x38336: 0x6d388020, 0x38337: 0x6d388220, + 0x38338: 0x6d388420, 0x38339: 0x6d388620, 0x3833a: 0x6d388820, 0x3833b: 0x6d388a20, + 0x3833c: 0x6d388c20, 0x3833d: 0x6d388e20, 0x3833e: 0x6d389020, 0x3833f: 0x6d389220, + // Block 0xe0d, offset 0x38340 + 0x38340: 0x6d389420, 0x38341: 0x6d389620, 0x38342: 0x6d389820, 0x38343: 0x6d389a20, + 0x38344: 0x6d389c20, 0x38345: 0x6d389e20, 0x38346: 0x6d38a020, 0x38347: 0x6d38a220, + 0x38348: 0x6d38a420, 0x38349: 0x6d38a620, 0x3834a: 0x6d38a820, 0x3834b: 0x6d38aa20, + 0x3834c: 0x6d38ac20, 0x3834d: 0x6d38ae20, 0x3834e: 0x6d38b020, 0x3834f: 0x6d38b220, + 0x38350: 0x6d38b420, 0x38351: 0x6d38b620, 0x38352: 0x6d38b820, 0x38353: 0x6d38ba20, + 0x38354: 0x6d38bc20, 0x38355: 0x6d38be20, 0x38356: 0x6d38c020, 0x38357: 0x6d38c220, + 0x38358: 0x6d38c420, 0x38359: 0x6d38c620, 0x3835a: 0x6d38c820, 0x3835b: 0x6d38ca20, + 0x3835c: 0x6d38cc20, 0x3835d: 0x6d38ce20, 0x3835e: 0x6d38d020, 0x3835f: 0x6d38d220, + 0x38360: 0x6d38d420, 0x38361: 0x6d38d620, 0x38362: 0x6d38d820, 0x38363: 0x6d38da20, + 0x38364: 0x6d38dc20, 0x38365: 0x6d38de20, 0x38366: 0x6d38e020, 0x38367: 0x6d38e220, + 0x38368: 0x6d38e420, 0x38369: 0x6d38e620, 0x3836a: 0x6d38e820, 0x3836b: 0x6d38ea20, + 0x3836c: 0x6d38ec20, 0x3836d: 0x6d38ee20, 0x3836e: 0x6d38f020, 0x3836f: 0x6d38f220, + 0x38370: 0x6d38f420, 0x38371: 0x6d38f620, 0x38372: 0x6d38f820, 0x38373: 0x6d38fa20, + 0x38374: 0x6d38fc20, 0x38375: 0x6d38fe20, 0x38376: 0x6d390020, 0x38377: 0x6d390220, + 0x38378: 0x6d390420, 0x38379: 0x6d390620, 0x3837a: 0x6d390820, 0x3837b: 0x6d390a20, + 0x3837c: 0x6d390c20, 0x3837d: 0x6d390e20, 0x3837e: 0x6d391020, 0x3837f: 0x6d391220, + // Block 0xe0e, offset 0x38380 + 0x38380: 0x6d391420, 0x38381: 0x6d391620, 0x38382: 0x6d391820, 0x38383: 0x6d391a20, + 0x38384: 0x6d391c20, 0x38385: 0x6d391e20, 0x38386: 0x6d392020, 0x38387: 0x6d392220, + 0x38388: 0x6d392420, 0x38389: 0x6d392620, 0x3838a: 0x6d392820, 0x3838b: 0x6d392a20, + 0x3838c: 0x6d392c20, 0x3838d: 0x6d392e20, 0x3838e: 0x6d393020, 0x3838f: 0x6d393220, + 0x38390: 0x6d393420, 0x38391: 0x6d393620, 0x38392: 0x6d393820, 0x38393: 0x6d393a20, + 0x38394: 0x6d393c20, 0x38395: 0x6d393e20, 0x38396: 0x6d394020, 0x38397: 0x6d394220, + 0x38398: 0x6d394420, 0x38399: 0x6d394620, 0x3839a: 0x6d394820, 0x3839b: 0x6d394a20, + 0x3839c: 0x6d394c20, 0x3839d: 0x6d394e20, 0x3839e: 0x6d395020, 0x3839f: 0x6d395220, + 0x383a0: 0x6d395420, 0x383a1: 0x6d395620, 0x383a2: 0x6d395820, 0x383a3: 0x6d395a20, + 0x383a4: 0x6d395c20, 0x383a5: 0x6d395e20, 0x383a6: 0x6d396020, 0x383a7: 0x6d396220, + 0x383a8: 0x6d396420, 0x383a9: 0x6d396620, 0x383aa: 0x6d396820, 0x383ab: 0x6d396a20, + 0x383ac: 0x6d396c20, 0x383ad: 0x6d396e20, 0x383ae: 0x6d397020, 0x383af: 0x6d397220, + 0x383b0: 0x6d397420, 0x383b1: 0x6d397620, 0x383b2: 0x6d397820, 0x383b3: 0x6d397a20, + 0x383b4: 0x6d397c20, 0x383b5: 0x6d397e20, 0x383b6: 0x6d398020, 0x383b7: 0x6d398220, + 0x383b8: 0x6d398420, 0x383b9: 0x6d398620, 0x383ba: 0x6d398820, 0x383bb: 0x6d398a20, + 0x383bc: 0x6d398c20, 0x383bd: 0x6d398e20, 0x383be: 0x6d399020, 0x383bf: 0x6d64ba20, + // Block 0xe0f, offset 0x383c0 + 0x383c0: 0x6d64bc20, 0x383c1: 0x6d64be20, 0x383c2: 0x6d64c020, 0x383c3: 0x6d64c220, + 0x383c4: 0x6d64c420, 0x383c5: 0x6d64c620, 0x383c6: 0x6d64c820, 0x383c7: 0x6d64ca20, + 0x383c8: 0x6d64cc20, 0x383c9: 0x6d64ce20, 0x383ca: 0x6d64d020, 0x383cb: 0x6d64d220, + 0x383cc: 0x6d64d420, 0x383cd: 0x6d64d620, 0x383ce: 0x6d64d820, 0x383cf: 0x6d64da20, + 0x383d0: 0x6d64dc20, 0x383d1: 0x6d64de20, 0x383d2: 0x6d64e020, 0x383d3: 0x6d64e220, + 0x383d4: 0x6d64e420, 0x383d5: 0x6d64e620, 0x383d6: 0x6d64e820, 0x383d7: 0x6d64ea20, + 0x383d8: 0x6d64ec20, 0x383d9: 0x6d64ee20, 0x383da: 0x6d64f020, 0x383db: 0x6d64f220, + 0x383dc: 0x6d64f420, 0x383dd: 0x6d64f620, 0x383de: 0x6d64f820, 0x383df: 0x6d64fa20, + 0x383e0: 0x6d64fc20, 0x383e1: 0x6d64fe20, 0x383e2: 0x6d650020, 0x383e3: 0x6d650220, + 0x383e4: 0x6d650420, 0x383e5: 0x6d650620, 0x383e6: 0x6d650820, 0x383e7: 0x6d650a20, + 0x383e8: 0x6d650c20, 0x383e9: 0x6d650e20, 0x383ea: 0x6d651020, 0x383eb: 0x6d651220, + 0x383ec: 0x6d651420, 0x383ed: 0x6d651620, 0x383ee: 0x6d651820, 0x383ef: 0x6d651a20, + 0x383f0: 0x6d651c20, 0x383f1: 0x6d651e20, 0x383f2: 0x6d652020, 0x383f3: 0x6d652220, + 0x383f4: 0x6d652420, 0x383f5: 0x6d652620, 0x383f6: 0x6d652820, 0x383f7: 0x6d652a20, + 0x383f8: 0x6d652c20, 0x383f9: 0x6d652e20, 0x383fa: 0x6d653020, 0x383fb: 0x6d653220, + 0x383fc: 0x6d653420, 0x383fd: 0x6d8e6c20, 0x383fe: 0x6d653620, 0x383ff: 0x6d653820, + // Block 0xe10, offset 0x38400 + 0x38400: 0x6d653a20, 0x38401: 0x6d653c20, 0x38402: 0x6d653e20, 0x38403: 0x6d654020, + 0x38404: 0x6d654220, 0x38405: 0x6d654420, 0x38406: 0x6d654620, 0x38407: 0x6d654820, + 0x38408: 0x6d654a20, 0x38409: 0x6d654c20, 0x3840a: 0x6d654e20, 0x3840b: 0x6d655020, + 0x3840c: 0x6d655220, 0x3840d: 0x6d655420, 0x3840e: 0x6d655620, 0x3840f: 0x6d655820, + 0x38410: 0x6d655a20, 0x38411: 0x6d655c20, 0x38412: 0x6d655e20, 0x38413: 0x6d656020, + 0x38414: 0x6d656220, 0x38415: 0x6d656420, 0x38416: 0x6d656620, 0x38417: 0x6d656820, + 0x38418: 0x6d656a20, 0x38419: 0x6d656c20, 0x3841a: 0x6d656e20, 0x3841b: 0x6d657020, + 0x3841c: 0x6d657220, 0x3841d: 0x6d657420, 0x3841e: 0x6d657620, 0x3841f: 0x6d657820, + 0x38420: 0x6d657a20, 0x38421: 0x6d657c20, 0x38422: 0x6d657e20, 0x38423: 0x6d658020, + 0x38424: 0x6d658220, 0x38425: 0x6d658420, 0x38426: 0x6d658620, 0x38427: 0x6d658820, + 0x38428: 0x6d658a20, 0x38429: 0x6d658c20, 0x3842a: 0x6d658e20, 0x3842b: 0x6d659020, + 0x3842c: 0x6d659220, 0x3842d: 0x6d659420, 0x3842e: 0x6d659620, 0x3842f: 0x6d659820, + 0x38430: 0x6d659a20, 0x38431: 0x6d659c20, 0x38432: 0x6d659e20, 0x38433: 0x6d65a020, + 0x38434: 0x6d65a220, 0x38435: 0x6d65a420, 0x38436: 0x6d65a620, 0x38437: 0x6d65a820, + 0x38438: 0x6d65aa20, 0x38439: 0x6d65ac20, 0x3843a: 0x6d65ae20, 0x3843b: 0x6d65b020, + 0x3843c: 0x6d65b220, 0x3843d: 0x6d65b420, 0x3843e: 0x6d65b620, 0x3843f: 0x6d65b820, + // Block 0xe11, offset 0x38440 + 0x38440: 0x6d65ba20, 0x38441: 0x6d65bc20, 0x38442: 0x6d65be20, 0x38443: 0x6d65c020, + 0x38444: 0x6d65c220, 0x38445: 0x6e454c20, 0x38446: 0x6d8e6e20, 0x38447: 0x6d8e7020, + 0x38448: 0x6d8e7220, 0x38449: 0x6d8e7420, 0x3844a: 0x6d8e7620, 0x3844b: 0x6d8e7820, + 0x3844c: 0x6d8e7a20, 0x3844d: 0x6d8e7c20, 0x3844e: 0x6d8e7e20, 0x3844f: 0x6d8e8020, + 0x38450: 0x6d8e8220, 0x38451: 0x6d8e8420, 0x38452: 0x6d8e8620, 0x38453: 0x6d8e8820, + 0x38454: 0x6d8e8a20, 0x38455: 0x6d8e8c20, 0x38456: 0x6d8e8e20, 0x38457: 0x6d8e9020, + 0x38458: 0x6d8e9220, 0x38459: 0x6d8e9420, 0x3845a: 0x6d8e9620, 0x3845b: 0x6d8e9820, + 0x3845c: 0x6d8e9a20, 0x3845d: 0x6d8e9c20, 0x3845e: 0x6d8e9e20, 0x3845f: 0x6d8ea020, + 0x38460: 0x6d8ea220, 0x38461: 0x6d8ea420, 0x38462: 0x6d8ea620, 0x38463: 0x6d8ea820, + 0x38464: 0x6d8eaa20, 0x38465: 0x6d8eac20, 0x38466: 0x6d8eae20, 0x38467: 0x6d8eb020, + 0x38468: 0x6d8eb220, 0x38469: 0x6d8eb420, 0x3846a: 0x6d8eb620, 0x3846b: 0x6d8eb820, + 0x3846c: 0x6d8eba20, 0x3846d: 0x6d8ebc20, 0x3846e: 0x6d8ebe20, 0x3846f: 0x6d8ec020, + 0x38470: 0x6d8ec220, 0x38471: 0x6d8ec420, 0x38472: 0x6d8ec620, 0x38473: 0x6d8ec820, + 0x38474: 0x6d8eca20, 0x38475: 0x6d8ecc20, 0x38476: 0x6d8ece20, 0x38477: 0x6d8ed020, + 0x38478: 0x6d8ed220, 0x38479: 0x6d8ed420, 0x3847a: 0x6d8ed620, 0x3847b: 0x6d8ed820, + 0x3847c: 0x6d8eda20, 0x3847d: 0x6d8edc20, 0x3847e: 0x6d8ede20, 0x3847f: 0x6d8ee020, + // Block 0xe12, offset 0x38480 + 0x38480: 0x6d8ee220, 0x38481: 0x6d8ee420, 0x38482: 0x6d8ee620, 0x38483: 0x6d8ee820, + 0x38484: 0x6d8eea20, 0x38485: 0x6d8eec20, 0x38486: 0x6d8eee20, 0x38487: 0x6dc5f420, + 0x38488: 0x6d8ef020, 0x38489: 0x6d8ef220, 0x3848a: 0x6d8ef420, 0x3848b: 0x6d8ef620, + 0x3848c: 0x6d8ef820, 0x3848d: 0x6d8efa20, 0x3848e: 0x6d8efc20, 0x3848f: 0x6d8efe20, + 0x38490: 0x6d8f0020, 0x38491: 0x6d8f0220, 0x38492: 0x6d8f0420, 0x38493: 0x6d8f0620, + 0x38494: 0x6d8f0820, 0x38495: 0x6d8f0a20, 0x38496: 0x6d8f0c20, 0x38497: 0x6d8f0e20, + 0x38498: 0x6d8f1020, 0x38499: 0x6d8f1220, 0x3849a: 0x6d8f1420, 0x3849b: 0x6d8f1620, + 0x3849c: 0x6d8f1820, 0x3849d: 0x6d8f1a20, 0x3849e: 0x6d8f1c20, 0x3849f: 0x6d8f1e20, + 0x384a0: 0x6d8f2020, 0x384a1: 0x6d8f2220, 0x384a2: 0x6d8f2420, 0x384a3: 0x6d8f2620, + 0x384a4: 0x6d8f2820, 0x384a5: 0x6d8f2a20, 0x384a6: 0x6d8f2c20, 0x384a7: 0x6d8f2e20, + 0x384a8: 0x6d8f3020, 0x384a9: 0x6d8f3220, 0x384aa: 0x6d8f3420, 0x384ab: 0x6d8f3620, + 0x384ac: 0x6d8f3820, 0x384ad: 0x6d8f3a20, 0x384ae: 0x6d8f3c20, 0x384af: 0x6d8f3e20, + 0x384b0: 0x6d8f4020, 0x384b1: 0x6d8f4220, 0x384b2: 0x6d8f4420, 0x384b3: 0x6d8f4620, + 0x384b4: 0x6d8f4820, 0x384b5: 0x6d8f4a20, 0x384b6: 0x6d8f4c20, 0x384b7: 0x6d8f4e20, + 0x384b8: 0x6d8f5020, 0x384b9: 0x6d8f5220, 0x384ba: 0x6d8f5420, 0x384bb: 0x6d8f5620, + 0x384bc: 0x6d8f5820, 0x384bd: 0x6d8f5a20, 0x384be: 0x6db26e20, 0x384bf: 0x6d8f5c20, + // Block 0xe13, offset 0x384c0 + 0x384c0: 0x6d8f5e20, 0x384c1: 0x6d8f6020, 0x384c2: 0x6d8f6220, 0x384c3: 0x6d8f6420, + 0x384c4: 0x6d8f6620, 0x384c5: 0x6d8f6820, 0x384c6: 0x6d8f6a20, 0x384c7: 0x6d8f6c20, + 0x384c8: 0x6d8f6e20, 0x384c9: 0x6d8f7020, 0x384ca: 0x6d8f7220, 0x384cb: 0x6d8f7420, + 0x384cc: 0x6d8f7620, 0x384cd: 0x6d8f7820, 0x384ce: 0x6d8f7a20, 0x384cf: 0x6d8f7c20, + 0x384d0: 0x6d8f7e20, 0x384d1: 0x6d8f8020, 0x384d2: 0x6d8f8220, 0x384d3: 0x6d8f8420, + 0x384d4: 0x6d8f8620, 0x384d5: 0x6d8f8820, 0x384d6: 0x6d8f8a20, 0x384d7: 0x6d8f8c20, + 0x384d8: 0x6d8f8e20, 0x384d9: 0x6d8f9020, 0x384da: 0x6d8f9220, 0x384db: 0x6d8f9420, + 0x384dc: 0x6d8f9620, 0x384dd: 0x6d8f9820, 0x384de: 0x6d8f9a20, 0x384df: 0x6d8f9c20, + 0x384e0: 0x6d8f9e20, 0x384e1: 0x6d8fa020, 0x384e2: 0x6d8fa220, 0x384e3: 0x6d8fa420, + 0x384e4: 0x6d8fa620, 0x384e5: 0x6d8fa820, 0x384e6: 0x6d8faa20, 0x384e7: 0x6d8fac20, + 0x384e8: 0x6d8fae20, 0x384e9: 0x6db27020, 0x384ea: 0x6db27220, 0x384eb: 0x6db27420, + 0x384ec: 0x6db27620, 0x384ed: 0x6db27820, 0x384ee: 0x6db27a20, 0x384ef: 0x6db27c20, + 0x384f0: 0x6db27e20, 0x384f1: 0x6db28020, 0x384f2: 0x6db28220, 0x384f3: 0x6db28420, + 0x384f4: 0x6db28620, 0x384f5: 0x6db28820, 0x384f6: 0x6db28a20, 0x384f7: 0x6db28c20, + 0x384f8: 0x6db28e20, 0x384f9: 0x6db29020, 0x384fa: 0x6db29220, 0x384fb: 0x6db29420, + 0x384fc: 0x6db29620, 0x384fd: 0x6db29820, 0x384fe: 0x6db29a20, 0x384ff: 0x6db29c20, + // Block 0xe14, offset 0x38500 + 0x38500: 0x6db29e20, 0x38501: 0x6db2a020, 0x38502: 0x6db2a220, 0x38503: 0x6db2a420, + 0x38504: 0x6db2a620, 0x38505: 0x6db2a820, 0x38506: 0x6db2aa20, 0x38507: 0x6db2ac20, + 0x38508: 0x6db2ae20, 0x38509: 0x6db2b020, 0x3850a: 0x6db2b220, 0x3850b: 0x6db2b420, + 0x3850c: 0x6db2b620, 0x3850d: 0x6db2b820, 0x3850e: 0x6db2ba20, 0x3850f: 0x6db2bc20, + 0x38510: 0x6db2be20, 0x38511: 0x6db2c020, 0x38512: 0x6db2c220, 0x38513: 0x6db2c420, + 0x38514: 0x6db2c620, 0x38515: 0x6db2c820, 0x38516: 0x6db2ca20, 0x38517: 0x6db2cc20, + 0x38518: 0x6db2ce20, 0x38519: 0x6db2d020, 0x3851a: 0x6db2d220, 0x3851b: 0x6db2d420, + 0x3851c: 0x6db2d620, 0x3851d: 0x6db2d820, 0x3851e: 0x6db2da20, 0x3851f: 0x6db2dc20, + 0x38520: 0x6db2de20, 0x38521: 0x6db2e020, 0x38522: 0x6db2e220, 0x38523: 0x6db2e420, + 0x38524: 0x6db2e620, 0x38525: 0x6db2e820, 0x38526: 0x6db2ea20, 0x38527: 0x6db2ec20, + 0x38528: 0x6db2ee20, 0x38529: 0x6db2f020, 0x3852a: 0x6db2f220, 0x3852b: 0x6db2f420, + 0x3852c: 0x6db2f620, 0x3852d: 0x6d8fb020, 0x3852e: 0x6db2f820, 0x3852f: 0x6db2fa20, + 0x38530: 0x6db2fc20, 0x38531: 0x6db2fe20, 0x38532: 0x6db30020, 0x38533: 0x6db30220, + 0x38534: 0x6db30420, 0x38535: 0x6db30620, 0x38536: 0x6db30820, 0x38537: 0x6db30a20, + 0x38538: 0x6db30c20, 0x38539: 0x6db30e20, 0x3853a: 0x6db31020, 0x3853b: 0x6db31220, + 0x3853c: 0x6db31420, 0x3853d: 0x6db31620, 0x3853e: 0x6db31820, 0x3853f: 0x6db31a20, + // Block 0xe15, offset 0x38540 + 0x38540: 0x6db31c20, 0x38541: 0x6db31e20, 0x38542: 0x6db32020, 0x38543: 0x6db32220, + 0x38544: 0x6db32420, 0x38545: 0x6db32620, 0x38546: 0x6db32820, 0x38547: 0x6db32a20, + 0x38548: 0x6db32c20, 0x38549: 0x6db32e20, 0x3854a: 0x6db33020, 0x3854b: 0x6db33220, + 0x3854c: 0x6db33420, 0x3854d: 0x6db33620, 0x3854e: 0x6db33820, 0x3854f: 0x6db33a20, + 0x38550: 0x6db33c20, 0x38551: 0x6db33e20, 0x38552: 0x6db34020, 0x38553: 0x6db34220, + 0x38554: 0x6db34420, 0x38555: 0x6db34620, 0x38556: 0x6db34820, 0x38557: 0x6db34a20, + 0x38558: 0x6db34c20, 0x38559: 0x6db34e20, 0x3855a: 0x6db35020, 0x3855b: 0x6db35220, + 0x3855c: 0x6db35420, 0x3855d: 0x6db35620, 0x3855e: 0x6db35820, 0x3855f: 0x6db35a20, + 0x38560: 0x6db35c20, 0x38561: 0x6db35e20, 0x38562: 0x6db36020, 0x38563: 0x6db36220, + 0x38564: 0x6db36420, 0x38565: 0x6db36620, 0x38566: 0x6db36820, 0x38567: 0x6db36a20, + 0x38568: 0x6db36c20, 0x38569: 0x6db36e20, 0x3856a: 0x6dd19420, 0x3856b: 0x6dd19620, + 0x3856c: 0x6dd19820, 0x3856d: 0x6dd19a20, 0x3856e: 0x6dd19c20, 0x3856f: 0x6dd19e20, + 0x38570: 0x6dd1a020, 0x38571: 0x6dd1a220, 0x38572: 0x6dd1a420, 0x38573: 0x6dd1a620, + 0x38574: 0x6dd1a820, 0x38575: 0x6dd1aa20, 0x38576: 0x6dd1ac20, 0x38577: 0x6dd1ae20, + 0x38578: 0x6dd1b020, 0x38579: 0x6dd1b220, 0x3857a: 0x6dd1b420, 0x3857b: 0x6dd1b620, + 0x3857c: 0x6dd1b820, 0x3857d: 0x6dd1ba20, 0x3857e: 0x6dd1bc20, 0x3857f: 0x6dd1be20, + // Block 0xe16, offset 0x38580 + 0x38580: 0x6dd1c020, 0x38581: 0x6dd1c220, 0x38582: 0x6dd1c420, 0x38583: 0x6dd1c620, + 0x38584: 0x6dd1c820, 0x38585: 0x6dd1ca20, 0x38586: 0x6dd1cc20, 0x38587: 0x6dd1ce20, + 0x38588: 0x6dd1d020, 0x38589: 0x6dd1d220, 0x3858a: 0x6dd1d420, 0x3858b: 0x6dd1d620, + 0x3858c: 0x6dd1d820, 0x3858d: 0x6dd1da20, 0x3858e: 0x6dd1dc20, 0x3858f: 0x6dd1de20, + 0x38590: 0x6dd1e020, 0x38591: 0x6dd1e220, 0x38592: 0x6dd1e420, 0x38593: 0x6dd1e620, + 0x38594: 0x6deb0220, 0x38595: 0x6deb0420, 0x38596: 0x6dd1e820, 0x38597: 0x6dd1ea20, + 0x38598: 0x6dd1ec20, 0x38599: 0x6dd1ee20, 0x3859a: 0x6dd1f020, 0x3859b: 0x6dd1f220, + 0x3859c: 0x6dd1f420, 0x3859d: 0x6deb0620, 0x3859e: 0x6dd1f620, 0x3859f: 0x6dd1f820, + 0x385a0: 0x6dd1fa20, 0x385a1: 0x6db37020, 0x385a2: 0x6dd1fc20, 0x385a3: 0x6dd1fe20, + 0x385a4: 0x6dd20020, 0x385a5: 0x6dd20220, 0x385a6: 0x6dd20420, 0x385a7: 0x6dd20620, + 0x385a8: 0x6dd20820, 0x385a9: 0x6dd20a20, 0x385aa: 0x6dd20c20, 0x385ab: 0x6dd20e20, + 0x385ac: 0x6dd21020, 0x385ad: 0x6dd21220, 0x385ae: 0x6dd21420, 0x385af: 0x6dd21620, + 0x385b0: 0x6dd21820, 0x385b1: 0x6dd21a20, 0x385b2: 0x6dd21c20, 0x385b3: 0x6dd21e20, + 0x385b4: 0x6dd22020, 0x385b5: 0x6dd22220, 0x385b6: 0x6dd22420, 0x385b7: 0x6dd22620, + 0x385b8: 0x6db37220, 0x385b9: 0x6dd22820, 0x385ba: 0x6dd22a20, 0x385bb: 0x6dd22c20, + 0x385bc: 0x6dd22e20, 0x385bd: 0x6dd23020, 0x385be: 0x6dd23220, 0x385bf: 0x6dd23420, + // Block 0xe17, offset 0x385c0 + 0x385c0: 0x6dd23620, 0x385c1: 0x6dd23820, 0x385c2: 0x6dd23a20, 0x385c3: 0x6dd23c20, + 0x385c4: 0x6dd23e20, 0x385c5: 0x6dd24020, 0x385c6: 0x6dd24220, 0x385c7: 0x6dd24420, + 0x385c8: 0x6dd24620, 0x385c9: 0x6dd24820, 0x385ca: 0x6dd24a20, 0x385cb: 0x6dd24c20, + 0x385cc: 0x6dd24e20, 0x385cd: 0x6dd25020, 0x385ce: 0x6dd25220, 0x385cf: 0x6dd25420, + 0x385d0: 0x6dd25620, 0x385d1: 0x6dd25820, 0x385d2: 0x6dd25a20, 0x385d3: 0x6dd25c20, + 0x385d4: 0x6dd25e20, 0x385d5: 0x6dd26020, 0x385d6: 0x6dd26220, 0x385d7: 0x6dd26420, + 0x385d8: 0x6dd26620, 0x385d9: 0x6dd26820, 0x385da: 0x6dd26a20, 0x385db: 0x6dd26c20, + 0x385dc: 0x6dd26e20, 0x385dd: 0x6dd27020, 0x385de: 0x6dd27220, 0x385df: 0x6dd27420, + 0x385e0: 0x6deb0820, 0x385e1: 0x6deb0a20, 0x385e2: 0x6deb0c20, 0x385e3: 0x6deb0e20, + 0x385e4: 0x6deb1020, 0x385e5: 0x6deb1220, 0x385e6: 0x6deb1420, 0x385e7: 0x6deb1620, + 0x385e8: 0x6deb1820, 0x385e9: 0x6deb1a20, 0x385ea: 0x6deb1c20, 0x385eb: 0x6deb1e20, + 0x385ec: 0x6deb2020, 0x385ed: 0x6deb2220, 0x385ee: 0x6deb2420, 0x385ef: 0x6deb2620, + 0x385f0: 0x6deb2820, 0x385f1: 0x6deb2a20, 0x385f2: 0x6deb2c20, 0x385f3: 0x6deb2e20, + 0x385f4: 0x6deb3020, 0x385f5: 0x6deb3220, 0x385f6: 0x6deb3420, 0x385f7: 0x6deb3620, + 0x385f8: 0x6deb3820, 0x385f9: 0x6deb3a20, 0x385fa: 0x6deb3c20, 0x385fb: 0x6deb3e20, + 0x385fc: 0x6deb4020, 0x385fd: 0x6deb4220, 0x385fe: 0x6deb4420, 0x385ff: 0x6deb4620, + // Block 0xe18, offset 0x38600 + 0x38600: 0x6deb4820, 0x38601: 0x6deb4a20, 0x38602: 0x6deb4c20, 0x38603: 0x6deb4e20, + 0x38604: 0x6deb5020, 0x38605: 0x6deb5220, 0x38606: 0x6deb5420, 0x38607: 0x6deb5620, + 0x38608: 0x6deb5820, 0x38609: 0x6deb5a20, 0x3860a: 0x6deb5c20, 0x3860b: 0x6deb5e20, + 0x3860c: 0x6deb6020, 0x3860d: 0x6deb6220, 0x3860e: 0x6deb6420, 0x3860f: 0x6deb6620, + 0x38610: 0x6deb6820, 0x38611: 0x6deb6a20, 0x38612: 0x6deb6c20, 0x38613: 0x6deb6e20, + 0x38614: 0x6deb7020, 0x38615: 0x6deb7220, 0x38616: 0x6deb7420, 0x38617: 0x6deb7620, + 0x38618: 0x6deb7820, 0x38619: 0x6deb7a20, 0x3861a: 0x6deb7c20, 0x3861b: 0x6deb7e20, + 0x3861c: 0x6deb8020, 0x3861d: 0x6deb8220, 0x3861e: 0x6deb8420, 0x3861f: 0x6deb8620, + 0x38620: 0x6deb8820, 0x38621: 0x6deb8a20, 0x38622: 0x6deb8c20, 0x38623: 0x6deb8e20, + 0x38624: 0x6deb9020, 0x38625: 0x6deb9220, 0x38626: 0x6deb9420, 0x38627: 0x6deb9620, + 0x38628: 0x6deb9820, 0x38629: 0x6deb9a20, 0x3862a: 0x6deb9c20, 0x3862b: 0x6deb9e20, + 0x3862c: 0x6deba020, 0x3862d: 0x6deba220, 0x3862e: 0x6deba420, 0x3862f: 0x6deba620, + 0x38630: 0x6deba820, 0x38631: 0x6debaa20, 0x38632: 0x6debac20, 0x38633: 0x6debae20, + 0x38634: 0x6debb020, 0x38635: 0x6debb220, 0x38636: 0x6debb420, 0x38637: 0x6debb620, + 0x38638: 0x6debb820, 0x38639: 0x6debba20, 0x3863a: 0x6debbc20, 0x3863b: 0x6e00a820, + 0x3863c: 0x6e00aa20, 0x3863d: 0x6e00ac20, 0x3863e: 0x6e00ae20, 0x3863f: 0x6e00b020, + // Block 0xe19, offset 0x38640 + 0x38640: 0x6e00b220, 0x38641: 0x6e00b420, 0x38642: 0x6e00b620, 0x38643: 0x6e00b820, + 0x38644: 0x6e00ba20, 0x38645: 0x6e00bc20, 0x38646: 0x6e00be20, 0x38647: 0x6e00c020, + 0x38648: 0x6e00c220, 0x38649: 0x6e00c420, 0x3864a: 0x6e00c620, 0x3864b: 0x6e00c820, + 0x3864c: 0x6e00ca20, 0x3864d: 0x6e00cc20, 0x3864e: 0x6e00ce20, 0x3864f: 0x6e00d020, + 0x38650: 0x6e00d220, 0x38651: 0x6e00d420, 0x38652: 0x6e00d620, 0x38653: 0x6e00d820, + 0x38654: 0x6e00da20, 0x38655: 0x6e00dc20, 0x38656: 0x6e00de20, 0x38657: 0x6e00e020, + 0x38658: 0x6e00e220, 0x38659: 0x6e00e420, 0x3865a: 0x6e00e620, 0x3865b: 0x6e00e820, + 0x3865c: 0x6e00ea20, 0x3865d: 0x6e00ec20, 0x3865e: 0x6e00ee20, 0x3865f: 0x6e00f020, + 0x38660: 0x6e00f220, 0x38661: 0x6e00f420, 0x38662: 0x6e00f620, 0x38663: 0x6e00f820, + 0x38664: 0x6e00fa20, 0x38665: 0x6e00fc20, 0x38666: 0x6e00fe20, 0x38667: 0x6e010020, + 0x38668: 0x6e010220, 0x38669: 0x6e010420, 0x3866a: 0x6e010620, 0x3866b: 0x6e010820, + 0x3866c: 0x6e010a20, 0x3866d: 0x6e010c20, 0x3866e: 0x6e010e20, 0x3866f: 0x6e011020, + 0x38670: 0x6e011220, 0x38671: 0x6e011420, 0x38672: 0x6e011620, 0x38673: 0x6e011820, + 0x38674: 0x6e011a20, 0x38675: 0x6e011c20, 0x38676: 0x6e011e20, 0x38677: 0x6e012020, + 0x38678: 0x6e012220, 0x38679: 0x6e012420, 0x3867a: 0x6e012620, 0x3867b: 0x6e012820, + 0x3867c: 0x6e012a20, 0x3867d: 0x6e012c20, 0x3867e: 0x6e012e20, 0x3867f: 0x6e013020, + // Block 0xe1a, offset 0x38680 + 0x38680: 0x6e013220, 0x38681: 0x6e013420, 0x38682: 0x6e013620, 0x38683: 0x6e013820, + 0x38684: 0x6e013a20, 0x38685: 0x6e013c20, 0x38686: 0x6e013e20, 0x38687: 0x6e014020, + 0x38688: 0x6e014220, 0x38689: 0x6e014420, 0x3868a: 0x6e014620, 0x3868b: 0x6e014820, + 0x3868c: 0x6debbe20, 0x3868d: 0x6e12ba20, 0x3868e: 0x6e014a20, 0x3868f: 0x6e12bc20, + 0x38690: 0x6e12be20, 0x38691: 0x6e12c020, 0x38692: 0x6e12c220, 0x38693: 0x6e12c420, + 0x38694: 0x6e12c620, 0x38695: 0x6e12c820, 0x38696: 0x6e12ca20, 0x38697: 0x6e12cc20, + 0x38698: 0x6e12ce20, 0x38699: 0x6e12d020, 0x3869a: 0x6e12d220, 0x3869b: 0x6e12d420, + 0x3869c: 0x6e12d620, 0x3869d: 0x6e12d820, 0x3869e: 0x6e12da20, 0x3869f: 0x6e12dc20, + 0x386a0: 0x6e12de20, 0x386a1: 0x6e12e020, 0x386a2: 0x6e12e220, 0x386a3: 0x6e12e420, + 0x386a4: 0x6e12e620, 0x386a5: 0x6e12e820, 0x386a6: 0x6e12ea20, 0x386a7: 0x6e12ec20, + 0x386a8: 0x6e12ee20, 0x386a9: 0x6e12f020, 0x386aa: 0x6e12f220, 0x386ab: 0x6e12f420, + 0x386ac: 0x6e12f620, 0x386ad: 0x6e12f820, 0x386ae: 0x6e12fa20, 0x386af: 0x6e12fc20, + 0x386b0: 0x6e12fe20, 0x386b1: 0x6e130020, 0x386b2: 0x6e130220, 0x386b3: 0x6e130420, + 0x386b4: 0x6e130620, 0x386b5: 0x6e130820, 0x386b6: 0x6e130a20, 0x386b7: 0x6e130c20, + 0x386b8: 0x6e130e20, 0x386b9: 0x6e131020, 0x386ba: 0x6e131220, 0x386bb: 0x6e131420, + 0x386bc: 0x6e131620, 0x386bd: 0x6e131820, 0x386be: 0x6e131a20, 0x386bf: 0x6e131c20, + // Block 0xe1b, offset 0x386c0 + 0x386c0: 0x6e131e20, 0x386c1: 0x6e132020, 0x386c2: 0x6e132220, 0x386c3: 0x6e132420, + 0x386c4: 0x6e132620, 0x386c5: 0x6e132820, 0x386c6: 0x6e132a20, 0x386c7: 0x6e132c20, + 0x386c8: 0x6e132e20, 0x386c9: 0x6e133020, 0x386ca: 0x6e133220, 0x386cb: 0x6e133420, + 0x386cc: 0x6e133620, 0x386cd: 0x6e20c620, 0x386ce: 0x6e20c820, 0x386cf: 0x6e20ca20, + 0x386d0: 0x6e20cc20, 0x386d1: 0x6e20ce20, 0x386d2: 0x6e20d020, 0x386d3: 0x6e20d220, + 0x386d4: 0x6e20d420, 0x386d5: 0x6e20d620, 0x386d6: 0x6e20d820, 0x386d7: 0x6e20da20, + 0x386d8: 0x6e20dc20, 0x386d9: 0x6e20de20, 0x386da: 0x6e20e020, 0x386db: 0x6e20e220, + 0x386dc: 0x6e20e420, 0x386dd: 0x6e20e620, 0x386de: 0x6e20e820, 0x386df: 0x6e20ea20, + 0x386e0: 0x6e20ec20, 0x386e1: 0x6e20ee20, 0x386e2: 0x6e20f020, 0x386e3: 0x6e20f220, + 0x386e4: 0x6e20f420, 0x386e5: 0x6e20f620, 0x386e6: 0x6e20f820, 0x386e7: 0x6e20fa20, + 0x386e8: 0x6e20fc20, 0x386e9: 0x6e20fe20, 0x386ea: 0x6e210020, 0x386eb: 0x6e210220, + 0x386ec: 0x6e210420, 0x386ed: 0x6e210620, 0x386ee: 0x6e210820, 0x386ef: 0x6e210a20, + 0x386f0: 0x6e210c20, 0x386f1: 0x6e210e20, 0x386f2: 0x6e211020, 0x386f3: 0x6e211220, + 0x386f4: 0x6e211420, 0x386f5: 0x6e211620, 0x386f6: 0x6e2b9420, 0x386f7: 0x6e2b9620, + 0x386f8: 0x6e2b9820, 0x386f9: 0x6e2b9a20, 0x386fa: 0x6e2b9c20, 0x386fb: 0x6e2b9e20, + 0x386fc: 0x6e2ba020, 0x386fd: 0x6e2ba220, 0x386fe: 0x6e2ba420, 0x386ff: 0x6e2ba620, + // Block 0xe1c, offset 0x38700 + 0x38700: 0x6e2ba820, 0x38701: 0x6e2baa20, 0x38702: 0x6e2bac20, 0x38703: 0x6e2bae20, + 0x38704: 0x6e2bb020, 0x38705: 0x6e2bb220, 0x38706: 0x6e2bb420, 0x38707: 0x6e2bb620, + 0x38708: 0x6e2bb820, 0x38709: 0x6e2bba20, 0x3870a: 0x6e2bbc20, 0x3870b: 0x6e2bbe20, + 0x3870c: 0x6e2bc020, 0x3870d: 0x6e2bc220, 0x3870e: 0x6e2bc420, 0x3870f: 0x6e2bc620, + 0x38710: 0x6e2bc820, 0x38711: 0x6e2bca20, 0x38712: 0x6e2bcc20, 0x38713: 0x6e2bce20, + 0x38714: 0x6e2bd020, 0x38715: 0x6e2bd220, 0x38716: 0x6e33f020, 0x38717: 0x6e33f220, + 0x38718: 0x6e33f420, 0x38719: 0x6e33f620, 0x3871a: 0x6e33f820, 0x3871b: 0x6e33fa20, + 0x3871c: 0x6e33fc20, 0x3871d: 0x6e33fe20, 0x3871e: 0x6e340020, 0x3871f: 0x6e340220, + 0x38720: 0x6e340420, 0x38721: 0x6e340620, 0x38722: 0x6e340820, 0x38723: 0x6e340a20, + 0x38724: 0x6e340c20, 0x38725: 0x6e340e20, 0x38726: 0x6e341020, 0x38727: 0x6e341220, + 0x38728: 0x6e341420, 0x38729: 0x6e341620, 0x3872a: 0x6e341820, 0x3872b: 0x6e341a20, + 0x3872c: 0x6e341c20, 0x3872d: 0x6e341e20, 0x3872e: 0x6e39d420, 0x3872f: 0x6e39d620, + 0x38730: 0x6e39d820, 0x38731: 0x6e39da20, 0x38732: 0x6e39dc20, 0x38733: 0x6e39de20, + 0x38734: 0x6e39e020, 0x38735: 0x6e42f020, 0x38736: 0x6e39e220, 0x38737: 0x6e39e420, + 0x38738: 0x6e39e620, 0x38739: 0x6e39e820, 0x3873a: 0x6e3df620, 0x3873b: 0x6e3df820, + 0x3873c: 0x6e3dfa20, 0x3873d: 0x6e3dfc20, 0x3873e: 0x6e3dfe20, 0x3873f: 0x6e3e0020, + // Block 0xe1d, offset 0x38740 + 0x38740: 0x6e3e0220, 0x38741: 0x6e3e0420, 0x38742: 0x6e3e0620, 0x38743: 0x6e3e0820, + 0x38744: 0x6e3e0a20, 0x38745: 0x6e3e0c20, 0x38746: 0x6e394c20, 0x38747: 0x6e40ce20, + 0x38748: 0x6e40d020, 0x38749: 0x6e40d220, 0x3874a: 0x6e40d420, 0x3874b: 0x6e40d620, + 0x3874c: 0x6e40d820, 0x3874d: 0x6e40da20, 0x3874e: 0x6e40dc20, 0x3874f: 0x6e42f220, + 0x38750: 0x6e42f420, 0x38751: 0x6e42f620, 0x38752: 0x6e42f820, 0x38753: 0x6e470220, + 0x38754: 0x6e446820, 0x38755: 0x6e446a20, 0x38756: 0x6e454e20, 0x38757: 0x6e45d020, + 0x38758: 0x6e472e20, 0x38759: 0x6e468c20, 0x3875a: 0x6e455020, 0x3875b: 0x6c401420, + 0x3875c: 0x6c5f9820, 0x3875d: 0x6c5f9a20, 0x3875e: 0x6c5f9c20, 0x3875f: 0x6c84d420, + 0x38760: 0x6c84d620, 0x38761: 0x6c84d820, 0x38762: 0x6c84da20, 0x38763: 0x6cae3220, + 0x38764: 0x6cae3420, 0x38765: 0x6cae3620, 0x38766: 0x6cae3820, 0x38767: 0x6cae3a20, + 0x38768: 0x6cae3c20, 0x38769: 0x6cae3e20, 0x3876a: 0x6cae4020, 0x3876b: 0x6cae4220, + 0x3876c: 0x6cae4420, 0x3876d: 0x6cae4620, 0x3876e: 0x6cae4820, 0x3876f: 0x6cae4a20, + 0x38770: 0x6cae4c20, 0x38771: 0x6cdd5020, 0x38772: 0x6cdd5220, 0x38773: 0x6cdd5420, + 0x38774: 0x6cdd5620, 0x38775: 0x6cdd5820, 0x38776: 0x6cdd5a20, 0x38777: 0x6cdd5c20, + 0x38778: 0x6cdd5e20, 0x38779: 0x6cdd6020, 0x3877a: 0x6d0bd020, 0x3877b: 0x6d0bd220, + 0x3877c: 0x6d0bd420, 0x3877d: 0x6d0bd620, 0x3877e: 0x6d0bd820, 0x3877f: 0x6d0bda20, + // Block 0xe1e, offset 0x38780 + 0x38780: 0x6d0bdc20, 0x38781: 0x6d39be20, 0x38782: 0x6d39c020, 0x38783: 0x6d39c220, + 0x38784: 0x6d39c420, 0x38785: 0x6d39c620, 0x38786: 0x6d39c820, 0x38787: 0x6d39ca20, + 0x38788: 0x6d39cc20, 0x38789: 0x6d39ce20, 0x3878a: 0x6d39d020, 0x3878b: 0x6d39d220, + 0x3878c: 0x6d39d420, 0x3878d: 0x6d39d620, 0x3878e: 0x6d39d820, 0x3878f: 0x6d65f820, + 0x38790: 0x6d65fa20, 0x38791: 0x6d65fc20, 0x38792: 0x6d65fe20, 0x38793: 0x6d660020, + 0x38794: 0x6d660220, 0x38795: 0x6d660420, 0x38796: 0x6d660620, 0x38797: 0x6d660820, + 0x38798: 0x6d660a20, 0x38799: 0x6d660c20, 0x3879a: 0x6d660e20, 0x3879b: 0x6d661020, + 0x3879c: 0x6d8fd020, 0x3879d: 0x6d8fd220, 0x3879e: 0x6d8fd420, 0x3879f: 0x6d8fd620, + 0x387a0: 0x6d8fd820, 0x387a1: 0x6d8fda20, 0x387a2: 0x6d8fdc20, 0x387a3: 0x6d8fde20, + 0x387a4: 0x6d8fe020, 0x387a5: 0x6d8fe220, 0x387a6: 0x6d8fe420, 0x387a7: 0x6d8fe620, + 0x387a8: 0x6d8fe820, 0x387a9: 0x6d8fea20, 0x387aa: 0x6d8fec20, 0x387ab: 0x6d8fee20, + 0x387ac: 0x6d8ff020, 0x387ad: 0x6d8ff220, 0x387ae: 0x6d8ff420, 0x387af: 0x6d8ff620, + 0x387b0: 0x6d8ff820, 0x387b1: 0x6db39e20, 0x387b2: 0x6db3a020, 0x387b3: 0x6db3a220, + 0x387b4: 0x6db3a420, 0x387b5: 0x6db3a620, 0x387b6: 0x6db3a820, 0x387b7: 0x6db3aa20, + 0x387b8: 0x6db3ac20, 0x387b9: 0x6db3ae20, 0x387ba: 0x6db3b020, 0x387bb: 0x6dd29c20, + 0x387bc: 0x6dd29e20, 0x387bd: 0x6dd2a020, 0x387be: 0x6dd2a220, 0x387bf: 0x6dd2a420, + // Block 0xe1f, offset 0x387c0 + 0x387c0: 0x6dd2a620, 0x387c1: 0x6dd2a820, 0x387c2: 0x6debd420, 0x387c3: 0x6dd2aa20, + 0x387c4: 0x6dd2ac20, 0x387c5: 0x6debd620, 0x387c6: 0x6debd820, 0x387c7: 0x6debda20, + 0x387c8: 0x6debdc20, 0x387c9: 0x6debde20, 0x387ca: 0x6debe020, 0x387cb: 0x6e015a20, + 0x387cc: 0x6e015c20, 0x387cd: 0x6e015e20, 0x387ce: 0x6e016020, 0x387cf: 0x6e016220, + 0x387d0: 0x6df39420, 0x387d1: 0x6e134220, 0x387d2: 0x6e134420, 0x387d3: 0x6e134620, + 0x387d4: 0x6e134820, 0x387d5: 0x6e134a20, 0x387d6: 0x6e134c20, 0x387d7: 0x6e134e20, + 0x387d8: 0x6e211e20, 0x387d9: 0x6e212020, 0x387da: 0x6e2bd620, 0x387db: 0x6e2bd820, + 0x387dc: 0x6e3e1420, 0x387dd: 0x6c268c20, 0x387de: 0x6c268e20, 0x387df: 0x6c402220, + 0x387e0: 0x6c402420, 0x387e1: 0x6c402620, 0x387e2: 0x6c402820, 0x387e3: 0x6c402a20, + 0x387e4: 0x6c402c20, 0x387e5: 0x6c402e20, 0x387e6: 0x6c403020, 0x387e7: 0x6c403220, + 0x387e8: 0x6c5fcc20, 0x387e9: 0x6c5fce20, 0x387ea: 0x6c5fd020, 0x387eb: 0x6c5fd220, + 0x387ec: 0x6c5fd420, 0x387ed: 0x6c5fd620, 0x387ee: 0x6c5fd820, 0x387ef: 0x6c5fda20, + 0x387f0: 0x6c5fdc20, 0x387f1: 0x6c5fde20, 0x387f2: 0x6c5fe020, 0x387f3: 0x6c5fe220, + 0x387f4: 0x6c5fe420, 0x387f5: 0x6c5fe620, 0x387f6: 0x6c5fe820, 0x387f7: 0x6c5fea20, + 0x387f8: 0x6c5fec20, 0x387f9: 0x6c5fee20, 0x387fa: 0x6c5ff020, 0x387fb: 0x6c853220, + 0x387fc: 0x6c853420, 0x387fd: 0x6c853620, 0x387fe: 0x6c853820, 0x387ff: 0x6c853a20, + // Block 0xe20, offset 0x38800 + 0x38800: 0x6c853c20, 0x38801: 0x6c853e20, 0x38802: 0x6c854020, 0x38803: 0x6c854220, + 0x38804: 0x6c854420, 0x38805: 0x6c854620, 0x38806: 0x6c854820, 0x38807: 0x6c854a20, + 0x38808: 0x6c854c20, 0x38809: 0x6c854e20, 0x3880a: 0x6c855020, 0x3880b: 0x6c855220, + 0x3880c: 0x6c855420, 0x3880d: 0x6c855620, 0x3880e: 0x6c855820, 0x3880f: 0x6c855a20, + 0x38810: 0x6c855c20, 0x38811: 0x6c855e20, 0x38812: 0x6c856020, 0x38813: 0x6c856220, + 0x38814: 0x6c856420, 0x38815: 0x6c856620, 0x38816: 0x6c856820, 0x38817: 0x6c856a20, + 0x38818: 0x6c856c20, 0x38819: 0x6c856e20, 0x3881a: 0x6c857020, 0x3881b: 0x6c857220, + 0x3881c: 0x6c857420, 0x3881d: 0x6c857620, 0x3881e: 0x6caeaa20, 0x3881f: 0x6caeac20, + 0x38820: 0x6caeae20, 0x38821: 0x6caeb020, 0x38822: 0x6caeb220, 0x38823: 0x6caeb420, + 0x38824: 0x6caeb620, 0x38825: 0x6caeb820, 0x38826: 0x6caeba20, 0x38827: 0x6caebc20, + 0x38828: 0x6caebe20, 0x38829: 0x6caec020, 0x3882a: 0x6caec220, 0x3882b: 0x6caec420, + 0x3882c: 0x6caec620, 0x3882d: 0x6caec820, 0x3882e: 0x6caeca20, 0x3882f: 0x6caecc20, + 0x38830: 0x6caece20, 0x38831: 0x6caed020, 0x38832: 0x6caed220, 0x38833: 0x6caed420, + 0x38834: 0x6caed620, 0x38835: 0x6caed820, 0x38836: 0x6caeda20, 0x38837: 0x6caedc20, + 0x38838: 0x6caede20, 0x38839: 0x6caee020, 0x3883a: 0x6caee220, 0x3883b: 0x6caee420, + 0x3883c: 0x6caee620, 0x3883d: 0x6caee820, 0x3883e: 0x6caeea20, 0x3883f: 0x6caeec20, + // Block 0xe21, offset 0x38840 + 0x38840: 0x6caeee20, 0x38841: 0x6caef020, 0x38842: 0x6caef220, 0x38843: 0x6caef420, + 0x38844: 0x6caef620, 0x38845: 0x6caef820, 0x38846: 0x6caefa20, 0x38847: 0x6caefc20, + 0x38848: 0x6caefe20, 0x38849: 0x6caf0020, 0x3884a: 0x6caf0220, 0x3884b: 0x6caf0420, + 0x3884c: 0x6caf0620, 0x3884d: 0x6caf0820, 0x3884e: 0x6caf0a20, 0x3884f: 0x6cddc220, + 0x38850: 0x6cddc420, 0x38851: 0x6cddc620, 0x38852: 0x6cddc820, 0x38853: 0x6cddca20, + 0x38854: 0x6cddcc20, 0x38855: 0x6cddce20, 0x38856: 0x6cddd020, 0x38857: 0x6cddd220, + 0x38858: 0x6cddd420, 0x38859: 0x6cddd620, 0x3885a: 0x6cddd820, 0x3885b: 0x6cddda20, + 0x3885c: 0x6cdddc20, 0x3885d: 0x6cddde20, 0x3885e: 0x6cdde020, 0x3885f: 0x6cdde220, + 0x38860: 0x6cdde420, 0x38861: 0x6cdde620, 0x38862: 0x6cdde820, 0x38863: 0x6cddea20, + 0x38864: 0x6cddec20, 0x38865: 0x6cddee20, 0x38866: 0x6cddf020, 0x38867: 0x6cddf220, + 0x38868: 0x6cddf420, 0x38869: 0x6cddf620, 0x3886a: 0x6cddf820, 0x3886b: 0x6d0c3620, + 0x3886c: 0x6cddfa20, 0x3886d: 0x6cddfc20, 0x3886e: 0x6d0c3820, 0x3886f: 0x6cddfe20, + 0x38870: 0x6cde0020, 0x38871: 0x6cde0220, 0x38872: 0x6cde0420, 0x38873: 0x6cde0620, + 0x38874: 0x6cde0820, 0x38875: 0x6cde0a20, 0x38876: 0x6cde0c20, 0x38877: 0x6cde0e20, + 0x38878: 0x6cde1020, 0x38879: 0x6cde1220, 0x3887a: 0x6cde1420, 0x3887b: 0x6cde1620, + 0x3887c: 0x6cde1820, 0x3887d: 0x6cde1a20, 0x3887e: 0x6cde1c20, 0x3887f: 0x6cde1e20, + // Block 0xe22, offset 0x38880 + 0x38880: 0x6cde2020, 0x38881: 0x6cde2220, 0x38882: 0x6cde2420, 0x38883: 0x6cde2620, + 0x38884: 0x6cde2820, 0x38885: 0x6cde2a20, 0x38886: 0x6cde2c20, 0x38887: 0x6cde2e20, + 0x38888: 0x6d0c3a20, 0x38889: 0x6d0c3c20, 0x3888a: 0x6d0c3e20, 0x3888b: 0x6d0c4020, + 0x3888c: 0x6d0c4220, 0x3888d: 0x6d0c4420, 0x3888e: 0x6d0c4620, 0x3888f: 0x6d0c4820, + 0x38890: 0x6d0c4a20, 0x38891: 0x6d0c4c20, 0x38892: 0x6d0c4e20, 0x38893: 0x6d0c5020, + 0x38894: 0x6d0c5220, 0x38895: 0x6d0c5420, 0x38896: 0x6d0c5620, 0x38897: 0x6d0c5820, + 0x38898: 0x6d0c5a20, 0x38899: 0x6d0c5c20, 0x3889a: 0x6d0c5e20, 0x3889b: 0x6d0c6020, + 0x3889c: 0x6d0c6220, 0x3889d: 0x6d0c6420, 0x3889e: 0x6d3a6020, 0x3889f: 0x6d0c6620, + 0x388a0: 0x6d0c6820, 0x388a1: 0x6d0c6a20, 0x388a2: 0x6d0c6c20, 0x388a3: 0x6d0c6e20, + 0x388a4: 0x6d0c7020, 0x388a5: 0x6d0c7220, 0x388a6: 0x6d0c7420, 0x388a7: 0x6d0c7620, + 0x388a8: 0x6d0c7820, 0x388a9: 0x6d0c7a20, 0x388aa: 0x6d0c7c20, 0x388ab: 0x6d0c7e20, + 0x388ac: 0x6d0c8020, 0x388ad: 0x6d0c8220, 0x388ae: 0x6d0c8420, 0x388af: 0x6d0c8620, + 0x388b0: 0x6d0c8820, 0x388b1: 0x6d0c8a20, 0x388b2: 0x6d0c8c20, 0x388b3: 0x6d0c8e20, + 0x388b4: 0x6d0c9020, 0x388b5: 0x6d0c9220, 0x388b6: 0x6d0c9420, 0x388b7: 0x6d0c9620, + 0x388b8: 0x6d0c9820, 0x388b9: 0x6d0c9a20, 0x388ba: 0x6d0c9c20, 0x388bb: 0x6d0c9e20, + 0x388bc: 0x6d0ca020, 0x388bd: 0x6d0ca220, 0x388be: 0x6d0ca420, 0x388bf: 0x6d0ca620, + // Block 0xe23, offset 0x388c0 + 0x388c0: 0x6d0ca820, 0x388c1: 0x6d0caa20, 0x388c2: 0x6d0cac20, 0x388c3: 0x6d3a6220, + 0x388c4: 0x6d3a6420, 0x388c5: 0x6d3a6620, 0x388c6: 0x6d3a6820, 0x388c7: 0x6d3a6a20, + 0x388c8: 0x6d3a6c20, 0x388c9: 0x6d3a6e20, 0x388ca: 0x6d3a7020, 0x388cb: 0x6d3a7220, + 0x388cc: 0x6d3a7420, 0x388cd: 0x6d3a7620, 0x388ce: 0x6d3a7820, 0x388cf: 0x6d3a7a20, + 0x388d0: 0x6d3a7c20, 0x388d1: 0x6d3a7e20, 0x388d2: 0x6d3a8020, 0x388d3: 0x6d3a8220, + 0x388d4: 0x6d3a8420, 0x388d5: 0x6d3a8620, 0x388d6: 0x6d3a8820, 0x388d7: 0x6d3a8a20, + 0x388d8: 0x6d3a8c20, 0x388d9: 0x6d3a8e20, 0x388da: 0x6d3a9020, 0x388db: 0x6d3a9220, + 0x388dc: 0x6d3a9420, 0x388dd: 0x6d3a9620, 0x388de: 0x6d0cae20, 0x388df: 0x6d3a9820, + 0x388e0: 0x6d3a9a20, 0x388e1: 0x6d3a9c20, 0x388e2: 0x6d3a9e20, 0x388e3: 0x6d3aa020, + 0x388e4: 0x6d3aa220, 0x388e5: 0x6d3aa420, 0x388e6: 0x6d3aa620, 0x388e7: 0x6d3aa820, + 0x388e8: 0x6d3aaa20, 0x388e9: 0x6d3aac20, 0x388ea: 0x6d3aae20, 0x388eb: 0x6d3ab020, + 0x388ec: 0x6d3ab220, 0x388ed: 0x6d3ab420, 0x388ee: 0x6d3ab620, 0x388ef: 0x6d3ab820, + 0x388f0: 0x6d668c20, 0x388f1: 0x6d3aba20, 0x388f2: 0x6d3abc20, 0x388f3: 0x6d3abe20, + 0x388f4: 0x6d3ac020, 0x388f5: 0x6d3ac220, 0x388f6: 0x6d3ac420, 0x388f7: 0x6d3ac620, + 0x388f8: 0x6d3ac820, 0x388f9: 0x6d3aca20, 0x388fa: 0x6d3acc20, 0x388fb: 0x6d3ace20, + 0x388fc: 0x6d3ad020, 0x388fd: 0x6d3ad220, 0x388fe: 0x6d3ad420, 0x388ff: 0x6d3ad620, + // Block 0xe24, offset 0x38900 + 0x38900: 0x6d3ad820, 0x38901: 0x6d3ada20, 0x38902: 0x6d3adc20, 0x38903: 0x6d3ade20, + 0x38904: 0x6d3ae020, 0x38905: 0x6d3ae220, 0x38906: 0x6d3ae420, 0x38907: 0x6d3ae620, + 0x38908: 0x6d3ae820, 0x38909: 0x6d3aea20, 0x3890a: 0x6d3aec20, 0x3890b: 0x6d3aee20, + 0x3890c: 0x6d3af020, 0x3890d: 0x6d3af220, 0x3890e: 0x6d3af420, 0x3890f: 0x6d3af620, + 0x38910: 0x6d3af820, 0x38911: 0x6d3afa20, 0x38912: 0x6d668e20, 0x38913: 0x6d669020, + 0x38914: 0x6d669220, 0x38915: 0x6d669420, 0x38916: 0x6d669620, 0x38917: 0x6d669820, + 0x38918: 0x6d669a20, 0x38919: 0x6d669c20, 0x3891a: 0x6d669e20, 0x3891b: 0x6d66a020, + 0x3891c: 0x6d66a220, 0x3891d: 0x6d66a420, 0x3891e: 0x6d66a620, 0x3891f: 0x6d66a820, + 0x38920: 0x6d66aa20, 0x38921: 0x6d66ac20, 0x38922: 0x6d66ae20, 0x38923: 0x6d66b020, + 0x38924: 0x6d66b220, 0x38925: 0x6d66b420, 0x38926: 0x6d66b620, 0x38927: 0x6d66b820, + 0x38928: 0x6d66ba20, 0x38929: 0x6d66bc20, 0x3892a: 0x6d66be20, 0x3892b: 0x6d66c020, + 0x3892c: 0x6d66c220, 0x3892d: 0x6d66c420, 0x3892e: 0x6d66c620, 0x3892f: 0x6d66c820, + 0x38930: 0x6d66ca20, 0x38931: 0x6d66cc20, 0x38932: 0x6d66ce20, 0x38933: 0x6d66d020, + 0x38934: 0x6d66d220, 0x38935: 0x6d66d420, 0x38936: 0x6d66d620, 0x38937: 0x6d66d820, + 0x38938: 0x6d66da20, 0x38939: 0x6d66dc20, 0x3893a: 0x6d66de20, 0x3893b: 0x6d66e020, + 0x3893c: 0x6d66e220, 0x3893d: 0x6d66e420, 0x3893e: 0x6d66e620, 0x3893f: 0x6d66e820, + // Block 0xe25, offset 0x38940 + 0x38940: 0x6d66ea20, 0x38941: 0x6d66ec20, 0x38942: 0x6d66ee20, 0x38943: 0x6d66f020, + 0x38944: 0x6d66f220, 0x38945: 0x6d66f420, 0x38946: 0x6d66f620, 0x38947: 0x6d66f820, + 0x38948: 0x6d66fa20, 0x38949: 0x6d66fc20, 0x3894a: 0x6d66fe20, 0x3894b: 0x6d670020, + 0x3894c: 0x6d670220, 0x3894d: 0x6d670420, 0x3894e: 0x6d670620, 0x3894f: 0x6d670820, + 0x38950: 0x6d670a20, 0x38951: 0x6d670c20, 0x38952: 0x6d670e20, 0x38953: 0x6d671020, + 0x38954: 0x6d671220, 0x38955: 0x6d671420, 0x38956: 0x6d671620, 0x38957: 0x6d671820, + 0x38958: 0x6d671a20, 0x38959: 0x6d671c20, 0x3895a: 0x6d671e20, 0x3895b: 0x6d672020, + 0x3895c: 0x6d672220, 0x3895d: 0x6d672420, 0x3895e: 0x6d672620, 0x3895f: 0x6d672820, + 0x38960: 0x6d672a20, 0x38961: 0x6d905c20, 0x38962: 0x6d905e20, 0x38963: 0x6d906020, + 0x38964: 0x6d906220, 0x38965: 0x6d906420, 0x38966: 0x6d906620, 0x38967: 0x6d906820, + 0x38968: 0x6d906a20, 0x38969: 0x6d906c20, 0x3896a: 0x6d906e20, 0x3896b: 0x6d907020, + 0x3896c: 0x6d907220, 0x3896d: 0x6d907420, 0x3896e: 0x6d907620, 0x3896f: 0x6d907820, + 0x38970: 0x6d907a20, 0x38971: 0x6d907c20, 0x38972: 0x6d907e20, 0x38973: 0x6d908020, + 0x38974: 0x6d908220, 0x38975: 0x6d908420, 0x38976: 0x6d908620, 0x38977: 0x6d908820, + 0x38978: 0x6d908a20, 0x38979: 0x6d908c20, 0x3897a: 0x6d908e20, 0x3897b: 0x6d909020, + 0x3897c: 0x6d909220, 0x3897d: 0x6d909420, 0x3897e: 0x6d909620, 0x3897f: 0x6d909820, + // Block 0xe26, offset 0x38980 + 0x38980: 0x6d909a20, 0x38981: 0x6d909c20, 0x38982: 0x6d909e20, 0x38983: 0x6d90a020, + 0x38984: 0x6d90a220, 0x38985: 0x6d90a420, 0x38986: 0x6d90a620, 0x38987: 0x6d672c20, + 0x38988: 0x6d90a820, 0x38989: 0x6d90aa20, 0x3898a: 0x6d90ac20, 0x3898b: 0x6d90ae20, + 0x3898c: 0x6d90b020, 0x3898d: 0x6d90b220, 0x3898e: 0x6d90b420, 0x3898f: 0x6d90b620, + 0x38990: 0x6d90b820, 0x38991: 0x6d90ba20, 0x38992: 0x6d90bc20, 0x38993: 0x6d90be20, + 0x38994: 0x6d90c020, 0x38995: 0x6d90c220, 0x38996: 0x6d90c420, 0x38997: 0x6d90c620, + 0x38998: 0x6d90c820, 0x38999: 0x6d90ca20, 0x3899a: 0x6d90cc20, 0x3899b: 0x6d90ce20, + 0x3899c: 0x6d90d020, 0x3899d: 0x6d90d220, 0x3899e: 0x6d90d420, 0x3899f: 0x6d90d620, + 0x389a0: 0x6d90d820, 0x389a1: 0x6d90da20, 0x389a2: 0x6d90dc20, 0x389a3: 0x6d90de20, + 0x389a4: 0x6d90e020, 0x389a5: 0x6d90e220, 0x389a6: 0x6d90e420, 0x389a7: 0x6d90e620, + 0x389a8: 0x6d90e820, 0x389a9: 0x6d90ea20, 0x389aa: 0x6d90ec20, 0x389ab: 0x6d90ee20, + 0x389ac: 0x6d90f020, 0x389ad: 0x6d90f220, 0x389ae: 0x6d90f420, 0x389af: 0x6d90f620, + 0x389b0: 0x6d90f820, 0x389b1: 0x6d90fa20, 0x389b2: 0x6d90fc20, 0x389b3: 0x6d90fe20, + 0x389b4: 0x6d910020, 0x389b5: 0x6d910220, 0x389b6: 0x6d910420, 0x389b7: 0x6d910620, + 0x389b8: 0x6db42820, 0x389b9: 0x6db42a20, 0x389ba: 0x6db42c20, 0x389bb: 0x6db42e20, + 0x389bc: 0x6db43020, 0x389bd: 0x6db43220, 0x389be: 0x6db43420, 0x389bf: 0x6db43620, + // Block 0xe27, offset 0x389c0 + 0x389c0: 0x6db43820, 0x389c1: 0x6db43a20, 0x389c2: 0x6db43c20, 0x389c3: 0x6db43e20, + 0x389c4: 0x6db44020, 0x389c5: 0x6db44220, 0x389c6: 0x6db44420, 0x389c7: 0x6db44620, + 0x389c8: 0x6db44820, 0x389c9: 0x6db44a20, 0x389ca: 0x6db44c20, 0x389cb: 0x6db44e20, + 0x389cc: 0x6db45020, 0x389cd: 0x6db45220, 0x389ce: 0x6db45420, 0x389cf: 0x6db45620, + 0x389d0: 0x6db45820, 0x389d1: 0x6db45a20, 0x389d2: 0x6db45c20, 0x389d3: 0x6db45e20, + 0x389d4: 0x6db46020, 0x389d5: 0x6db46220, 0x389d6: 0x6db46420, 0x389d7: 0x6db46620, + 0x389d8: 0x6db46820, 0x389d9: 0x6db46a20, 0x389da: 0x6db46c20, 0x389db: 0x6db46e20, + 0x389dc: 0x6db47020, 0x389dd: 0x6db47220, 0x389de: 0x6db47420, 0x389df: 0x6db47620, + 0x389e0: 0x6db47820, 0x389e1: 0x6db47a20, 0x389e2: 0x6db47c20, 0x389e3: 0x6db47e20, + 0x389e4: 0x6db48020, 0x389e5: 0x6db48220, 0x389e6: 0x6db48420, 0x389e7: 0x6db48620, + 0x389e8: 0x6db48820, 0x389e9: 0x6db48a20, 0x389ea: 0x6db48c20, 0x389eb: 0x6db48e20, + 0x389ec: 0x6db49020, 0x389ed: 0x6db49220, 0x389ee: 0x6db49420, 0x389ef: 0x6db49620, + 0x389f0: 0x6dcfa420, 0x389f1: 0x6db49820, 0x389f2: 0x6db49a20, 0x389f3: 0x6db49c20, + 0x389f4: 0x6db49e20, 0x389f5: 0x6db4a020, 0x389f6: 0x6db4a220, 0x389f7: 0x6db4a420, + 0x389f8: 0x6db4a620, 0x389f9: 0x6db4a820, 0x389fa: 0x6db4aa20, 0x389fb: 0x6db4ac20, + 0x389fc: 0x6db4ae20, 0x389fd: 0x6db4b020, 0x389fe: 0x6db4b220, 0x389ff: 0x6db4b420, + // Block 0xe28, offset 0x38a00 + 0x38a00: 0x6db4b620, 0x38a01: 0x6db4b820, 0x38a02: 0x6db4ba20, 0x38a03: 0x6db4bc20, + 0x38a04: 0x6dd2fa20, 0x38a05: 0x6dd2fc20, 0x38a06: 0x6dd2fe20, 0x38a07: 0x6dd30020, + 0x38a08: 0x6dd30220, 0x38a09: 0x6dd30420, 0x38a0a: 0x6dd30620, 0x38a0b: 0x6dd30820, + 0x38a0c: 0x6dd30a20, 0x38a0d: 0x6dd30c20, 0x38a0e: 0x6dd30e20, 0x38a0f: 0x6dd31020, + 0x38a10: 0x6dd31220, 0x38a11: 0x6dd31420, 0x38a12: 0x6dd31620, 0x38a13: 0x6dd31820, + 0x38a14: 0x6dd31a20, 0x38a15: 0x6dd31c20, 0x38a16: 0x6dd31e20, 0x38a17: 0x6dd32020, + 0x38a18: 0x6dd32220, 0x38a19: 0x6dd32420, 0x38a1a: 0x6dd32620, 0x38a1b: 0x6dd32820, + 0x38a1c: 0x6dd32a20, 0x38a1d: 0x6dd32c20, 0x38a1e: 0x6dd32e20, 0x38a1f: 0x6dd33020, + 0x38a20: 0x6dd33220, 0x38a21: 0x6dd33420, 0x38a22: 0x6dd33620, 0x38a23: 0x6dd33820, + 0x38a24: 0x6dd33a20, 0x38a25: 0x6dd33c20, 0x38a26: 0x6dd33e20, 0x38a27: 0x6dd34020, + 0x38a28: 0x6dd34220, 0x38a29: 0x6dd34420, 0x38a2a: 0x6dd34620, 0x38a2b: 0x6dd34820, + 0x38a2c: 0x6dd34a20, 0x38a2d: 0x6dd34c20, 0x38a2e: 0x6dd34e20, 0x38a2f: 0x6dd35020, + 0x38a30: 0x6dd35220, 0x38a31: 0x6dd35420, 0x38a32: 0x6dd35620, 0x38a33: 0x6dd35820, + 0x38a34: 0x6dd35a20, 0x38a35: 0x6dd35c20, 0x38a36: 0x6dd35e20, 0x38a37: 0x6dd36020, + 0x38a38: 0x6dd36220, 0x38a39: 0x6dd36420, 0x38a3a: 0x6dd36620, 0x38a3b: 0x6dd36820, + 0x38a3c: 0x6dd36a20, 0x38a3d: 0x6dd36c20, 0x38a3e: 0x6dd36e20, 0x38a3f: 0x6dd37020, + // Block 0xe29, offset 0x38a40 + 0x38a40: 0x6dd37220, 0x38a41: 0x6dd37420, 0x38a42: 0x6dd37620, 0x38a43: 0x6dd37820, + 0x38a44: 0x6dd37a20, 0x38a45: 0x6dd37c20, 0x38a46: 0x6dd37e20, 0x38a47: 0x6dd38020, + 0x38a48: 0x6dd38220, 0x38a49: 0x6dd38420, 0x38a4a: 0x6dd38620, 0x38a4b: 0x6dd38820, + 0x38a4c: 0x6dd38a20, 0x38a4d: 0x6dd38c20, 0x38a4e: 0x6dec2620, 0x38a4f: 0x6dec2820, + 0x38a50: 0x6dec2a20, 0x38a51: 0x6dec2c20, 0x38a52: 0x6dec2e20, 0x38a53: 0x6dec3020, + 0x38a54: 0x6dec3220, 0x38a55: 0x6dec3420, 0x38a56: 0x6dec3620, 0x38a57: 0x6dec3820, + 0x38a58: 0x6dec3a20, 0x38a59: 0x6dec3c20, 0x38a5a: 0x6dec3e20, 0x38a5b: 0x6dec4020, + 0x38a5c: 0x6dec4220, 0x38a5d: 0x6dec4420, 0x38a5e: 0x6dec4620, 0x38a5f: 0x6dec4820, + 0x38a60: 0x6dec4a20, 0x38a61: 0x6dec4c20, 0x38a62: 0x6dec4e20, 0x38a63: 0x6dec5020, + 0x38a64: 0x6dec5220, 0x38a65: 0x6dec5420, 0x38a66: 0x6dec5620, 0x38a67: 0x6dec5820, + 0x38a68: 0x6dec5a20, 0x38a69: 0x6dec5c20, 0x38a6a: 0x6dec5e20, 0x38a6b: 0x6dec6020, + 0x38a6c: 0x6dec6220, 0x38a6d: 0x6dec6420, 0x38a6e: 0x6dec6620, 0x38a6f: 0x6dec6820, + 0x38a70: 0x6dec6a20, 0x38a71: 0x6dec6c20, 0x38a72: 0x6dec6e20, 0x38a73: 0x6dec7020, + 0x38a74: 0x6dec7220, 0x38a75: 0x6dec7420, 0x38a76: 0x6dec7620, 0x38a77: 0x6dec7820, + 0x38a78: 0x6dec7a20, 0x38a79: 0x6dec7c20, 0x38a7a: 0x6dec7e20, 0x38a7b: 0x6dec8020, + 0x38a7c: 0x6dec8220, 0x38a7d: 0x6dec8420, 0x38a7e: 0x6dec8620, 0x38a7f: 0x6dec8820, + // Block 0xe2a, offset 0x38a80 + 0x38a80: 0x6dec8a20, 0x38a81: 0x6dec8c20, 0x38a82: 0x6dec8e20, 0x38a83: 0x6dec9020, + 0x38a84: 0x6dec9220, 0x38a85: 0x6dec9420, 0x38a86: 0x6dec9620, 0x38a87: 0x6dec9820, + 0x38a88: 0x6dec9a20, 0x38a89: 0x6e018420, 0x38a8a: 0x6e018620, 0x38a8b: 0x6e018820, + 0x38a8c: 0x6e018a20, 0x38a8d: 0x6e018c20, 0x38a8e: 0x6e018e20, 0x38a8f: 0x6e019020, + 0x38a90: 0x6e019220, 0x38a91: 0x6e019420, 0x38a92: 0x6e019620, 0x38a93: 0x6e019820, + 0x38a94: 0x6e019a20, 0x38a95: 0x6e019c20, 0x38a96: 0x6e019e20, 0x38a97: 0x6e01a020, + 0x38a98: 0x6e01a220, 0x38a99: 0x6e01a420, 0x38a9a: 0x6e01a620, 0x38a9b: 0x6e01a820, + 0x38a9c: 0x6e01aa20, 0x38a9d: 0x6e01ac20, 0x38a9e: 0x6e01ae20, 0x38a9f: 0x6e01b020, + 0x38aa0: 0x6e01b220, 0x38aa1: 0x6e01b420, 0x38aa2: 0x6e01b620, 0x38aa3: 0x6e01b820, + 0x38aa4: 0x6e01ba20, 0x38aa5: 0x6e01bc20, 0x38aa6: 0x6e01be20, 0x38aa7: 0x6e01c020, + 0x38aa8: 0x6e01c220, 0x38aa9: 0x6e01c420, 0x38aaa: 0x6e01c620, 0x38aab: 0x6e01c820, + 0x38aac: 0x6e01ca20, 0x38aad: 0x6e01cc20, 0x38aae: 0x6e01ce20, 0x38aaf: 0x6e01d020, + 0x38ab0: 0x6e01d220, 0x38ab1: 0x6e136a20, 0x38ab2: 0x6e136c20, 0x38ab3: 0x6e136e20, + 0x38ab4: 0x6e137020, 0x38ab5: 0x6e137220, 0x38ab6: 0x6e137420, 0x38ab7: 0x6e137620, + 0x38ab8: 0x6e137820, 0x38ab9: 0x6e137a20, 0x38aba: 0x6e137c20, 0x38abb: 0x6e137e20, + 0x38abc: 0x6e138020, 0x38abd: 0x6e138220, 0x38abe: 0x6e138420, 0x38abf: 0x6e138620, + // Block 0xe2b, offset 0x38ac0 + 0x38ac0: 0x6e138820, 0x38ac1: 0x6e138a20, 0x38ac2: 0x6e138c20, 0x38ac3: 0x6e138e20, + 0x38ac4: 0x6e139020, 0x38ac5: 0x6e139220, 0x38ac6: 0x6e139420, 0x38ac7: 0x6e139620, + 0x38ac8: 0x6e139820, 0x38ac9: 0x6e139a20, 0x38aca: 0x6e139c20, 0x38acb: 0x6e139e20, + 0x38acc: 0x6e13a020, 0x38acd: 0x6e13a220, 0x38ace: 0x6e13a420, 0x38acf: 0x6e13a620, + 0x38ad0: 0x6e13a820, 0x38ad1: 0x6e13aa20, 0x38ad2: 0x6e13ac20, 0x38ad3: 0x6e13ae20, + 0x38ad4: 0x6e13b020, 0x38ad5: 0x6e13b220, 0x38ad6: 0x6e13b420, 0x38ad7: 0x6e13b620, + 0x38ad8: 0x6e13b820, 0x38ad9: 0x6e13ba20, 0x38ada: 0x6e13bc20, 0x38adb: 0x6e13be20, + 0x38adc: 0x6e13c020, 0x38add: 0x6e213820, 0x38ade: 0x6e213a20, 0x38adf: 0x6e213c20, + 0x38ae0: 0x6e213e20, 0x38ae1: 0x6e214020, 0x38ae2: 0x6e214220, 0x38ae3: 0x6e214420, + 0x38ae4: 0x6e214620, 0x38ae5: 0x6e214820, 0x38ae6: 0x6e214a20, 0x38ae7: 0x6e214c20, + 0x38ae8: 0x6e214e20, 0x38ae9: 0x6e215020, 0x38aea: 0x6e215220, 0x38aeb: 0x6e215420, + 0x38aec: 0x6e215620, 0x38aed: 0x6e215820, 0x38aee: 0x6e215a20, 0x38aef: 0x6e215c20, + 0x38af0: 0x6e215e20, 0x38af1: 0x6e216020, 0x38af2: 0x6e216220, 0x38af3: 0x6e216420, + 0x38af4: 0x6e216620, 0x38af5: 0x6e216820, 0x38af6: 0x6e216a20, 0x38af7: 0x6e216c20, + 0x38af8: 0x6e216e20, 0x38af9: 0x6e217020, 0x38afa: 0x6e217220, 0x38afb: 0x6e217420, + 0x38afc: 0x6e217620, 0x38afd: 0x6e217820, 0x38afe: 0x6e217a20, 0x38aff: 0x6e217c20, + // Block 0xe2c, offset 0x38b00 + 0x38b00: 0x6e217e20, 0x38b01: 0x6e218020, 0x38b02: 0x6e218220, 0x38b03: 0x6e2bf020, + 0x38b04: 0x6e2bf220, 0x38b05: 0x6e2bf420, 0x38b06: 0x6e2bf620, 0x38b07: 0x6e2bf820, + 0x38b08: 0x6e2bfa20, 0x38b09: 0x6e2bfc20, 0x38b0a: 0x6e2bfe20, 0x38b0b: 0x6e2c0020, + 0x38b0c: 0x6e2c0220, 0x38b0d: 0x6e2c0420, 0x38b0e: 0x6e2c0620, 0x38b0f: 0x6e2c0820, + 0x38b10: 0x6e2c0a20, 0x38b11: 0x6e2c0c20, 0x38b12: 0x6e2c0e20, 0x38b13: 0x6e343220, + 0x38b14: 0x6e2c1020, 0x38b15: 0x6e2c1220, 0x38b16: 0x6e2c1420, 0x38b17: 0x6e2c1620, + 0x38b18: 0x6e2c1820, 0x38b19: 0x6e2c1a20, 0x38b1a: 0x6e2c1c20, 0x38b1b: 0x6e343420, + 0x38b1c: 0x6e343620, 0x38b1d: 0x6e343820, 0x38b1e: 0x6e343a20, 0x38b1f: 0x6e343c20, + 0x38b20: 0x6e343e20, 0x38b21: 0x6e344020, 0x38b22: 0x6e344220, 0x38b23: 0x6e344420, + 0x38b24: 0x6e344620, 0x38b25: 0x6e344820, 0x38b26: 0x6e344a20, 0x38b27: 0x6e344c20, + 0x38b28: 0x6e344e20, 0x38b29: 0x6e345020, 0x38b2a: 0x6e345220, 0x38b2b: 0x6e345420, + 0x38b2c: 0x6e345620, 0x38b2d: 0x6e345820, 0x38b2e: 0x6e345a20, 0x38b2f: 0x6e39ee20, + 0x38b30: 0x6e39f020, 0x38b31: 0x6e39f220, 0x38b32: 0x6e39f420, 0x38b33: 0x6e39f620, + 0x38b34: 0x6e39f820, 0x38b35: 0x6e39fa20, 0x38b36: 0x6e39fc20, 0x38b37: 0x6e39fe20, + 0x38b38: 0x6e3a0020, 0x38b39: 0x6e3a0220, 0x38b3a: 0x6e3a0420, 0x38b3b: 0x6e3a0620, + 0x38b3c: 0x6e3a0820, 0x38b3d: 0x6e3e1820, 0x38b3e: 0x6e3e1a20, 0x38b3f: 0x6e3e1c20, + // Block 0xe2d, offset 0x38b40 + 0x38b40: 0x6e3e1e20, 0x38b41: 0x6e3e2020, 0x38b42: 0x6e3e2220, 0x38b43: 0x6e3e2420, + 0x38b44: 0x6e40e220, 0x38b45: 0x6e40e420, 0x38b46: 0x6e40e620, 0x38b47: 0x6e40e820, + 0x38b48: 0x6e40ea20, 0x38b49: 0x6e40ec20, 0x38b4a: 0x6e3e2620, 0x38b4b: 0x6e40ee20, + 0x38b4c: 0x6e40f020, 0x38b4d: 0x6e40f220, 0x38b4e: 0x6e40f420, 0x38b4f: 0x6e40f620, + 0x38b50: 0x6e40f820, 0x38b51: 0x6e42fe20, 0x38b52: 0x6e430020, 0x38b53: 0x6e430220, + 0x38b54: 0x6e430420, 0x38b55: 0x6e430620, 0x38b56: 0x6e430820, 0x38b57: 0x6e430a20, + 0x38b58: 0x6e446e20, 0x38b59: 0x6e447020, 0x38b5a: 0x6e447220, 0x38b5b: 0x6e447420, + 0x38b5c: 0x6e455220, 0x38b5d: 0x6e455420, 0x38b5e: 0x6e455620, 0x38b5f: 0x6e455820, + 0x38b60: 0x6e459020, 0x38b61: 0x6e455a20, 0x38b62: 0x6e45d220, 0x38b63: 0x6e45d420, + 0x38b64: 0x6e463a20, 0x38b65: 0x6e463c20, 0x38b66: 0x6e463e20, 0x38b67: 0x6c403620, + 0x38b68: 0x6c403820, 0x38b69: 0x6c403a20, 0x38b6a: 0x6c5ffc20, 0x38b6b: 0x6c858820, + 0x38b6c: 0x6c858a20, 0x38b6d: 0x6c858c20, 0x38b6e: 0x6c858e20, 0x38b6f: 0x6c859020, + 0x38b70: 0x6caf1e20, 0x38b71: 0x6caf2020, 0x38b72: 0x6caf2220, 0x38b73: 0x6cde4c20, + 0x38b74: 0x6cde4e20, 0x38b75: 0x6d0cbe20, 0x38b76: 0x6d0cc020, 0x38b77: 0x6d0cc220, + 0x38b78: 0x6d0cc420, 0x38b79: 0x6d0cc620, 0x38b7a: 0x6d3b1220, 0x38b7b: 0x6d3b1420, + 0x38b7c: 0x6d3b1620, 0x38b7d: 0x6d3b1820, 0x38b7e: 0x6d3b1a20, 0x38b7f: 0x6d3b1c20, + // Block 0xe2e, offset 0x38b80 + 0x38b80: 0x6d673c20, 0x38b81: 0x6d673e20, 0x38b82: 0x6d674020, 0x38b83: 0x6d674220, + 0x38b84: 0x6d3b1e20, 0x38b85: 0x6d674420, 0x38b86: 0x6d911620, 0x38b87: 0x6d911820, + 0x38b88: 0x6d911a20, 0x38b89: 0x6d911c20, 0x38b8a: 0x6d911e20, 0x38b8b: 0x6db4c820, + 0x38b8c: 0x6db4ca20, 0x38b8d: 0x6db4cc20, 0x38b8e: 0x6dd39820, 0x38b8f: 0x6dd39a20, + 0x38b90: 0x6dd39c20, 0x38b91: 0x6dd39e20, 0x38b92: 0x6dd3a020, 0x38b93: 0x6dd3a220, + 0x38b94: 0x6deca620, 0x38b95: 0x6deca820, 0x38b96: 0x6e01dc20, 0x38b97: 0x6e01de20, + 0x38b98: 0x6e13cc20, 0x38b99: 0x6e218620, 0x38b9a: 0x6e218820, 0x38b9b: 0x6e2c1e20, + 0x38b9c: 0x6e455c20, 0x38b9d: 0x6c403c20, 0x38b9e: 0x6c403e20, 0x38b9f: 0x6c404020, + 0x38ba0: 0x6c404220, 0x38ba1: 0x6c600220, 0x38ba2: 0x6c600420, 0x38ba3: 0x6c600620, + 0x38ba4: 0x6c600820, 0x38ba5: 0x6c600a20, 0x38ba6: 0x6c859820, 0x38ba7: 0x6c859a20, + 0x38ba8: 0x6c859c20, 0x38ba9: 0x6c859e20, 0x38baa: 0x6caf3020, 0x38bab: 0x6cde5a20, + 0x38bac: 0x6cde5c20, 0x38bad: 0x6cde5e20, 0x38bae: 0x6cde6020, 0x38baf: 0x6cde6220, + 0x38bb0: 0x6cde6420, 0x38bb1: 0x6cde6620, 0x38bb2: 0x6d0ccc20, 0x38bb3: 0x6d0cce20, + 0x38bb4: 0x6d0cd020, 0x38bb5: 0x6d0cd220, 0x38bb6: 0x6d0cd420, 0x38bb7: 0x6d0cd620, + 0x38bb8: 0x6d3b2020, 0x38bb9: 0x6d674e20, 0x38bba: 0x6d3b2220, 0x38bbb: 0x6d3b2420, + 0x38bbc: 0x6d675020, 0x38bbd: 0x6d675220, 0x38bbe: 0x6d912e20, 0x38bbf: 0x6db4d220, + // Block 0xe2f, offset 0x38bc0 + 0x38bc0: 0x6db4d420, 0x38bc1: 0x6db4d620, 0x38bc2: 0x6dd3a420, 0x38bc3: 0x6dd3a620, + 0x38bc4: 0x6decaa20, 0x38bc5: 0x6e13ce20, 0x38bc6: 0x6e218a20, 0x38bc7: 0x6c0a6220, + 0x38bc8: 0x6c269020, 0x38bc9: 0x6c269220, 0x38bca: 0x6c269420, 0x38bcb: 0x6c269620, + 0x38bcc: 0x6c269820, 0x38bcd: 0x6c404c20, 0x38bce: 0x6c404e20, 0x38bcf: 0x6c405020, + 0x38bd0: 0x6c405220, 0x38bd1: 0x6c405420, 0x38bd2: 0x6c405620, 0x38bd3: 0x6c405820, + 0x38bd4: 0x6c405a20, 0x38bd5: 0x6c405c20, 0x38bd6: 0x6c405e20, 0x38bd7: 0x6c406020, + 0x38bd8: 0x6c406220, 0x38bd9: 0x6c406420, 0x38bda: 0x6c406620, 0x38bdb: 0x6c406820, + 0x38bdc: 0x6c406a20, 0x38bdd: 0x6c601e20, 0x38bde: 0x6c602020, 0x38bdf: 0x6c602220, + 0x38be0: 0x6c602420, 0x38be1: 0x6c602620, 0x38be2: 0x6c602820, 0x38be3: 0x6c602a20, + 0x38be4: 0x6c602c20, 0x38be5: 0x6c602e20, 0x38be6: 0x6c603020, 0x38be7: 0x6c603220, + 0x38be8: 0x6c603420, 0x38be9: 0x6c603620, 0x38bea: 0x6c603820, 0x38beb: 0x6c603a20, + 0x38bec: 0x6c603c20, 0x38bed: 0x6c603e20, 0x38bee: 0x6c604020, 0x38bef: 0x6c604220, + 0x38bf0: 0x6c604420, 0x38bf1: 0x6c604620, 0x38bf2: 0x6c604820, 0x38bf3: 0x6c604a20, + 0x38bf4: 0x6c604c20, 0x38bf5: 0x6c604e20, 0x38bf6: 0x6c605020, 0x38bf7: 0x6c605220, + 0x38bf8: 0x6c605420, 0x38bf9: 0x6c605620, 0x38bfa: 0x6c605820, 0x38bfb: 0x6c605a20, + 0x38bfc: 0x6c605c20, 0x38bfd: 0x6c85dc20, 0x38bfe: 0x6caf9220, 0x38bff: 0x6c85de20, + // Block 0xe30, offset 0x38c00 + 0x38c00: 0x6c85e020, 0x38c01: 0x6c85e220, 0x38c02: 0x6c85e420, 0x38c03: 0x6c85e620, + 0x38c04: 0x6c85e820, 0x38c05: 0x6c85ea20, 0x38c06: 0x6c85ec20, 0x38c07: 0x6c85ee20, + 0x38c08: 0x6c85f020, 0x38c09: 0x6c85f220, 0x38c0a: 0x6c85f420, 0x38c0b: 0x6c85f620, + 0x38c0c: 0x6c85f820, 0x38c0d: 0x6c85fa20, 0x38c0e: 0x6c85fc20, 0x38c0f: 0x6c85fe20, + 0x38c10: 0x6c860020, 0x38c11: 0x6c860220, 0x38c12: 0x6c860420, 0x38c13: 0x6c860620, + 0x38c14: 0x6c860820, 0x38c15: 0x6c860a20, 0x38c16: 0x6c860c20, 0x38c17: 0x6c860e20, + 0x38c18: 0x6c861020, 0x38c19: 0x6c861220, 0x38c1a: 0x6c861420, 0x38c1b: 0x6c861620, + 0x38c1c: 0x6c861820, 0x38c1d: 0x6c861a20, 0x38c1e: 0x6caf9420, 0x38c1f: 0x6caf9620, + 0x38c20: 0x6caf9820, 0x38c21: 0x6caf9a20, 0x38c22: 0x6caf9c20, 0x38c23: 0x6caf9e20, + 0x38c24: 0x6cafa020, 0x38c25: 0x6cafa220, 0x38c26: 0x6cafa420, 0x38c27: 0x6cafa620, + 0x38c28: 0x6cafa820, 0x38c29: 0x6cafaa20, 0x38c2a: 0x6cafac20, 0x38c2b: 0x6cafae20, + 0x38c2c: 0x6cafb020, 0x38c2d: 0x6cafb220, 0x38c2e: 0x6cafb420, 0x38c2f: 0x6cafb620, + 0x38c30: 0x6cafb820, 0x38c31: 0x6cafba20, 0x38c32: 0x6cafbc20, 0x38c33: 0x6cafbe20, + 0x38c34: 0x6cafc020, 0x38c35: 0x6cafc220, 0x38c36: 0x6cafc420, 0x38c37: 0x6cafc620, + 0x38c38: 0x6cafc820, 0x38c39: 0x6cafca20, 0x38c3a: 0x6cafcc20, 0x38c3b: 0x6cafce20, + 0x38c3c: 0x6cafd020, 0x38c3d: 0x6cafd220, 0x38c3e: 0x6cafd420, 0x38c3f: 0x6cafd620, + // Block 0xe31, offset 0x38c40 + 0x38c40: 0x6cdeac20, 0x38c41: 0x6cdeae20, 0x38c42: 0x6cdeb020, 0x38c43: 0x6cdeb220, + 0x38c44: 0x6cdeb420, 0x38c45: 0x6cdeb620, 0x38c46: 0x6cdeb820, 0x38c47: 0x6cdeba20, + 0x38c48: 0x6cdebc20, 0x38c49: 0x6cdebe20, 0x38c4a: 0x6cdec020, 0x38c4b: 0x6cdec220, + 0x38c4c: 0x6cdec420, 0x38c4d: 0x6cdec620, 0x38c4e: 0x6cdec820, 0x38c4f: 0x6cdeca20, + 0x38c50: 0x6cdecc20, 0x38c51: 0x6cdece20, 0x38c52: 0x6cded020, 0x38c53: 0x6cded220, + 0x38c54: 0x6cded420, 0x38c55: 0x6cded620, 0x38c56: 0x6cded820, 0x38c57: 0x6cdeda20, + 0x38c58: 0x6cdedc20, 0x38c59: 0x6cdede20, 0x38c5a: 0x6cdee020, 0x38c5b: 0x6cdee220, + 0x38c5c: 0x6cdee420, 0x38c5d: 0x6cdee620, 0x38c5e: 0x6cdee820, 0x38c5f: 0x6cdeea20, + 0x38c60: 0x6cdeec20, 0x38c61: 0x6cdeee20, 0x38c62: 0x6cdef020, 0x38c63: 0x6cdef220, + 0x38c64: 0x6d0d1420, 0x38c65: 0x6d0d1620, 0x38c66: 0x6d0d1820, 0x38c67: 0x6d0d1a20, + 0x38c68: 0x6d0d1c20, 0x38c69: 0x6d0d1e20, 0x38c6a: 0x6d0d2020, 0x38c6b: 0x6d0d2220, + 0x38c6c: 0x6d0d2420, 0x38c6d: 0x6d0d2620, 0x38c6e: 0x6d0d2820, 0x38c6f: 0x6d0d2a20, + 0x38c70: 0x6d0d2c20, 0x38c71: 0x6d0d2e20, 0x38c72: 0x6d0d3020, 0x38c73: 0x6d0d3220, + 0x38c74: 0x6d0d3420, 0x38c75: 0x6d0d3620, 0x38c76: 0x6d0d3820, 0x38c77: 0x6d0d3a20, + 0x38c78: 0x6d0d3c20, 0x38c79: 0x6d0d3e20, 0x38c7a: 0x6d0d4020, 0x38c7b: 0x6d3b8420, + 0x38c7c: 0x6d0d4220, 0x38c7d: 0x6d0d4420, 0x38c7e: 0x6d0d4620, 0x38c7f: 0x6d0d4820, + // Block 0xe32, offset 0x38c80 + 0x38c80: 0x6d0d4a20, 0x38c81: 0x6d0d4c20, 0x38c82: 0x6d0d4e20, 0x38c83: 0x6d0d5020, + 0x38c84: 0x6d0d5220, 0x38c85: 0x6d0d5420, 0x38c86: 0x6d0d5620, 0x38c87: 0x6d0d5820, + 0x38c88: 0x6d0d5a20, 0x38c89: 0x6d0d5c20, 0x38c8a: 0x6d0d5e20, 0x38c8b: 0x6d0d6020, + 0x38c8c: 0x6d0d6220, 0x38c8d: 0x6d0d6420, 0x38c8e: 0x6d0d6620, 0x38c8f: 0x6d3b8620, + 0x38c90: 0x6d3b8820, 0x38c91: 0x6d3b8a20, 0x38c92: 0x6d3b8c20, 0x38c93: 0x6d3b8e20, + 0x38c94: 0x6d3b9020, 0x38c95: 0x6d3b9220, 0x38c96: 0x6d3b9420, 0x38c97: 0x6d3b9620, + 0x38c98: 0x6d3b9820, 0x38c99: 0x6d3b9a20, 0x38c9a: 0x6d3b9c20, 0x38c9b: 0x6d3b9e20, + 0x38c9c: 0x6d3ba020, 0x38c9d: 0x6d3ba220, 0x38c9e: 0x6d3ba420, 0x38c9f: 0x6d3ba620, + 0x38ca0: 0x6d3ba820, 0x38ca1: 0x6d3baa20, 0x38ca2: 0x6d3bac20, 0x38ca3: 0x6d3bae20, + 0x38ca4: 0x6d3bb020, 0x38ca5: 0x6d3bb220, 0x38ca6: 0x6d3bb420, 0x38ca7: 0x6d3bb620, + 0x38ca8: 0x6d3bb820, 0x38ca9: 0x6d3bba20, 0x38caa: 0x6d3bbc20, 0x38cab: 0x6d3bbe20, + 0x38cac: 0x6d3bc020, 0x38cad: 0x6d3bc220, 0x38cae: 0x6d3bc420, 0x38caf: 0x6d3bc620, + 0x38cb0: 0x6d3bc820, 0x38cb1: 0x6d3bca20, 0x38cb2: 0x6d3bcc20, 0x38cb3: 0x6d3bce20, + 0x38cb4: 0x6d3bd020, 0x38cb5: 0x6d3bd220, 0x38cb6: 0x6d3bd420, 0x38cb7: 0x6d3bd620, + 0x38cb8: 0x6d67a020, 0x38cb9: 0x6d67a220, 0x38cba: 0x6d67a420, 0x38cbb: 0x6d67a620, + 0x38cbc: 0x6d67a820, 0x38cbd: 0x6d67aa20, 0x38cbe: 0x6d67ac20, 0x38cbf: 0x6d67ae20, + // Block 0xe33, offset 0x38cc0 + 0x38cc0: 0x6d67b020, 0x38cc1: 0x6d67b220, 0x38cc2: 0x6d67b420, 0x38cc3: 0x6d67b620, + 0x38cc4: 0x6d67b820, 0x38cc5: 0x6d67ba20, 0x38cc6: 0x6d67bc20, 0x38cc7: 0x6d67be20, + 0x38cc8: 0x6d67c020, 0x38cc9: 0x6d67c220, 0x38cca: 0x6d67c420, 0x38ccb: 0x6d67c620, + 0x38ccc: 0x6d67c820, 0x38ccd: 0x6d67ca20, 0x38cce: 0x6d67cc20, 0x38ccf: 0x6d67ce20, + 0x38cd0: 0x6d67d020, 0x38cd1: 0x6d67d220, 0x38cd2: 0x6d67d420, 0x38cd3: 0x6d67d620, + 0x38cd4: 0x6d67d820, 0x38cd5: 0x6d67da20, 0x38cd6: 0x6d67dc20, 0x38cd7: 0x6d67de20, + 0x38cd8: 0x6d67e020, 0x38cd9: 0x6d67e220, 0x38cda: 0x6d67e420, 0x38cdb: 0x6d67e620, + 0x38cdc: 0x6d67e820, 0x38cdd: 0x6d916820, 0x38cde: 0x6d916a20, 0x38cdf: 0x6d916c20, + 0x38ce0: 0x6d916e20, 0x38ce1: 0x6d917020, 0x38ce2: 0x6d917220, 0x38ce3: 0x6d917420, + 0x38ce4: 0x6d917620, 0x38ce5: 0x6d917820, 0x38ce6: 0x6d917a20, 0x38ce7: 0x6d917c20, + 0x38ce8: 0x6d67ea20, 0x38ce9: 0x6d917e20, 0x38cea: 0x6d918020, 0x38ceb: 0x6d918220, + 0x38cec: 0x6d918420, 0x38ced: 0x6db51820, 0x38cee: 0x6d918620, 0x38cef: 0x6d918820, + 0x38cf0: 0x6d918a20, 0x38cf1: 0x6d918c20, 0x38cf2: 0x6d918e20, 0x38cf3: 0x6d919020, + 0x38cf4: 0x6d919220, 0x38cf5: 0x6d919420, 0x38cf6: 0x6d919620, 0x38cf7: 0x6d919820, + 0x38cf8: 0x6d919a20, 0x38cf9: 0x6d919c20, 0x38cfa: 0x6d919e20, 0x38cfb: 0x6d91a020, + 0x38cfc: 0x6d91a220, 0x38cfd: 0x6d91a420, 0x38cfe: 0x6d91a620, 0x38cff: 0x6d91a820, + // Block 0xe34, offset 0x38d00 + 0x38d00: 0x6d91aa20, 0x38d01: 0x6d91ac20, 0x38d02: 0x6db51a20, 0x38d03: 0x6db51c20, + 0x38d04: 0x6db51e20, 0x38d05: 0x6db52020, 0x38d06: 0x6db52220, 0x38d07: 0x6db52420, + 0x38d08: 0x6db52620, 0x38d09: 0x6db52820, 0x38d0a: 0x6db52a20, 0x38d0b: 0x6db52c20, + 0x38d0c: 0x6db52e20, 0x38d0d: 0x6db53020, 0x38d0e: 0x6db53220, 0x38d0f: 0x6db53420, + 0x38d10: 0x6db53620, 0x38d11: 0x6db53820, 0x38d12: 0x6db53a20, 0x38d13: 0x6db53c20, + 0x38d14: 0x6db53e20, 0x38d15: 0x6db54020, 0x38d16: 0x6db54220, 0x38d17: 0x6db54420, + 0x38d18: 0x6db54620, 0x38d19: 0x6db54820, 0x38d1a: 0x6db54a20, 0x38d1b: 0x6db54c20, + 0x38d1c: 0x6db54e20, 0x38d1d: 0x6db55020, 0x38d1e: 0x6db55220, 0x38d1f: 0x6db55420, + 0x38d20: 0x6db55620, 0x38d21: 0x6db55820, 0x38d22: 0x6db55a20, 0x38d23: 0x6db55c20, + 0x38d24: 0x6db55e20, 0x38d25: 0x6db56020, 0x38d26: 0x6db56220, 0x38d27: 0x6db56420, + 0x38d28: 0x6db56620, 0x38d29: 0x6db56820, 0x38d2a: 0x6db56a20, 0x38d2b: 0x6db56c20, + 0x38d2c: 0x6db56e20, 0x38d2d: 0x6db57020, 0x38d2e: 0x6db57220, 0x38d2f: 0x6db57420, + 0x38d30: 0x6db57620, 0x38d31: 0x6dd3d220, 0x38d32: 0x6dd3d420, 0x38d33: 0x6dd3d620, + 0x38d34: 0x6dd3d820, 0x38d35: 0x6dd3da20, 0x38d36: 0x6dd3dc20, 0x38d37: 0x6dd3de20, + 0x38d38: 0x6dd3e020, 0x38d39: 0x6dd3e220, 0x38d3a: 0x6dd3e420, 0x38d3b: 0x6dd3e620, + 0x38d3c: 0x6dd3e820, 0x38d3d: 0x6dd3ea20, 0x38d3e: 0x6dd3ec20, 0x38d3f: 0x6dd3ee20, + // Block 0xe35, offset 0x38d40 + 0x38d40: 0x6dd3f020, 0x38d41: 0x6dd3f220, 0x38d42: 0x6dd3f420, 0x38d43: 0x6dd3f620, + 0x38d44: 0x6dd3f820, 0x38d45: 0x6dd3fa20, 0x38d46: 0x6dd3fc20, 0x38d47: 0x6dd3fe20, + 0x38d48: 0x6dd40020, 0x38d49: 0x6dd40220, 0x38d4a: 0x6dd40420, 0x38d4b: 0x6dd40620, + 0x38d4c: 0x6dd40820, 0x38d4d: 0x6decca20, 0x38d4e: 0x6deccc20, 0x38d4f: 0x6decce20, + 0x38d50: 0x6decd020, 0x38d51: 0x6decd220, 0x38d52: 0x6decd420, 0x38d53: 0x6decd620, + 0x38d54: 0x6decd820, 0x38d55: 0x6decda20, 0x38d56: 0x6decdc20, 0x38d57: 0x6e01f820, + 0x38d58: 0x6decde20, 0x38d59: 0x6dece020, 0x38d5a: 0x6dece220, 0x38d5b: 0x6dece420, + 0x38d5c: 0x6dece620, 0x38d5d: 0x6dece820, 0x38d5e: 0x6decea20, 0x38d5f: 0x6decec20, + 0x38d60: 0x6decee20, 0x38d61: 0x6decf020, 0x38d62: 0x6decf220, 0x38d63: 0x6decf420, + 0x38d64: 0x6decf620, 0x38d65: 0x6decf820, 0x38d66: 0x6decfa20, 0x38d67: 0x6e01fa20, + 0x38d68: 0x6e01fc20, 0x38d69: 0x6e01fe20, 0x38d6a: 0x6e020020, 0x38d6b: 0x6e020220, + 0x38d6c: 0x6e020420, 0x38d6d: 0x6e020620, 0x38d6e: 0x6e020820, 0x38d6f: 0x6e020a20, + 0x38d70: 0x6e020c20, 0x38d71: 0x6e020e20, 0x38d72: 0x6e13de20, 0x38d73: 0x6e021020, + 0x38d74: 0x6e021220, 0x38d75: 0x6e021420, 0x38d76: 0x6e13e020, 0x38d77: 0x6e13e220, + 0x38d78: 0x6e13e420, 0x38d79: 0x6e13e620, 0x38d7a: 0x6e13e820, 0x38d7b: 0x6e13ea20, + 0x38d7c: 0x6e13ec20, 0x38d7d: 0x6e13ee20, 0x38d7e: 0x6e13f020, 0x38d7f: 0x6e13f220, + // Block 0xe36, offset 0x38d80 + 0x38d80: 0x6e13f420, 0x38d81: 0x6e13f620, 0x38d82: 0x6e13f820, 0x38d83: 0x6e219620, + 0x38d84: 0x6e219820, 0x38d85: 0x6e219a20, 0x38d86: 0x6e219c20, 0x38d87: 0x6e219e20, + 0x38d88: 0x6e2c2c20, 0x38d89: 0x6e2c2e20, 0x38d8a: 0x6e2c3020, 0x38d8b: 0x6e2c3220, + 0x38d8c: 0x6e346820, 0x38d8d: 0x6e346a20, 0x38d8e: 0x6e346c20, 0x38d8f: 0x6e346e20, + 0x38d90: 0x6e3a1620, 0x38d91: 0x6e3a1820, 0x38d92: 0x6e3a1a20, 0x38d93: 0x6e3a1c20, + 0x38d94: 0x6e3a1e20, 0x38d95: 0x6e3e2820, 0x38d96: 0x6e3e2a20, 0x38d97: 0x6e3e2c20, + 0x38d98: 0x6e410020, 0x38d99: 0x6e447820, 0x38d9a: 0x6e447a20, 0x38d9b: 0x6e45d620, + 0x38d9c: 0x6e468e20, 0x38d9d: 0x6e469020, 0x38d9e: 0x6e470420, 0x38d9f: 0x6e470620, + 0x38da0: 0x6c269a20, 0x38da1: 0x6c269c20, 0x38da2: 0x6c269e20, 0x38da3: 0x6c406c20, + 0x38da4: 0x6c606820, 0x38da5: 0x6c606a20, 0x38da6: 0x6c606c20, 0x38da7: 0x6c862420, + 0x38da8: 0x6c862620, 0x38da9: 0x6c862820, 0x38daa: 0x6cafe620, 0x38dab: 0x6cafe820, + 0x38dac: 0x6cafea20, 0x38dad: 0x6cdf0220, 0x38dae: 0x6cdf0420, 0x38daf: 0x6d0d7820, + 0x38db0: 0x6d0d7a20, 0x38db1: 0x6d3bdc20, 0x38db2: 0x6d3bde20, 0x38db3: 0x6d3be020, + 0x38db4: 0x6d3be220, 0x38db5: 0x6d3be420, 0x38db6: 0x6d3be620, 0x38db7: 0x6d3be820, + 0x38db8: 0x6d3bea20, 0x38db9: 0x6d67f220, 0x38dba: 0x6d67f420, 0x38dbb: 0x6d67f620, + 0x38dbc: 0x6d91ba20, 0x38dbd: 0x6d91bc20, 0x38dbe: 0x6d91be20, 0x38dbf: 0x6db57e20, + // Block 0xe37, offset 0x38dc0 + 0x38dc0: 0x6dd41020, 0x38dc1: 0x6dd41220, 0x38dc2: 0x6ded0220, 0x38dc3: 0x6e021820, + 0x38dc4: 0x6e13fa20, 0x38dc5: 0x6e3a2220, 0x38dc6: 0x6c406e20, 0x38dc7: 0x6c407020, + 0x38dc8: 0x6c607020, 0x38dc9: 0x6c863220, 0x38dca: 0x6c863420, 0x38dcb: 0x6c863620, + 0x38dcc: 0x6c863820, 0x38dcd: 0x6c863a20, 0x38dce: 0x6cb00020, 0x38dcf: 0x6cb00220, + 0x38dd0: 0x6cb00420, 0x38dd1: 0x6cb00620, 0x38dd2: 0x6cb00820, 0x38dd3: 0x6cb00a20, + 0x38dd4: 0x6cb00c20, 0x38dd5: 0x6cb00e20, 0x38dd6: 0x6cb01020, 0x38dd7: 0x6cb01220, + 0x38dd8: 0x6cb01420, 0x38dd9: 0x6cb01620, 0x38dda: 0x6cb01820, 0x38ddb: 0x6cb01a20, + 0x38ddc: 0x6cdf1a20, 0x38ddd: 0x6cdf1c20, 0x38dde: 0x6cdf1e20, 0x38ddf: 0x6cdf2020, + 0x38de0: 0x6cdf2220, 0x38de1: 0x6cdf2420, 0x38de2: 0x6cdf2620, 0x38de3: 0x6cdf2820, + 0x38de4: 0x6cdf2a20, 0x38de5: 0x6cdf2c20, 0x38de6: 0x6cdf2e20, 0x38de7: 0x6cdf3020, + 0x38de8: 0x6d0d8420, 0x38de9: 0x6d0d8620, 0x38dea: 0x6d0d8820, 0x38deb: 0x6d0d8a20, + 0x38dec: 0x6d0d8c20, 0x38ded: 0x6d0d8e20, 0x38dee: 0x6d0d9020, 0x38def: 0x6d0d9220, + 0x38df0: 0x6d0d9420, 0x38df1: 0x6d0d9620, 0x38df2: 0x6d0d9820, 0x38df3: 0x6d0d9a20, + 0x38df4: 0x6d0d9c20, 0x38df5: 0x6d0d9e20, 0x38df6: 0x6d0da020, 0x38df7: 0x6d0da220, + 0x38df8: 0x6d0da420, 0x38df9: 0x6d0da620, 0x38dfa: 0x6d0da820, 0x38dfb: 0x6d3bfa20, + 0x38dfc: 0x6d3bfc20, 0x38dfd: 0x6d3bfe20, 0x38dfe: 0x6d3c0020, 0x38dff: 0x6d3c0220, + // Block 0xe38, offset 0x38e00 + 0x38e00: 0x6d3c0420, 0x38e01: 0x6d3c0620, 0x38e02: 0x6d3c0820, 0x38e03: 0x6d3c0a20, + 0x38e04: 0x6d3c0c20, 0x38e05: 0x6d3c0e20, 0x38e06: 0x6d3c1020, 0x38e07: 0x6d3c1220, + 0x38e08: 0x6d3c1420, 0x38e09: 0x6d3c1620, 0x38e0a: 0x6d3c1820, 0x38e0b: 0x6d680420, + 0x38e0c: 0x6d680620, 0x38e0d: 0x6d680820, 0x38e0e: 0x6d680a20, 0x38e0f: 0x6d680c20, + 0x38e10: 0x6d680e20, 0x38e11: 0x6d681020, 0x38e12: 0x6d681220, 0x38e13: 0x6d681420, + 0x38e14: 0x6d681620, 0x38e15: 0x6d681820, 0x38e16: 0x6d681a20, 0x38e17: 0x6d681c20, + 0x38e18: 0x6d681e20, 0x38e19: 0x6d682020, 0x38e1a: 0x6d682220, 0x38e1b: 0x6d682420, + 0x38e1c: 0x6d682620, 0x38e1d: 0x6d682820, 0x38e1e: 0x6d682a20, 0x38e1f: 0x6d682c20, + 0x38e20: 0x6d682e20, 0x38e21: 0x6d91d220, 0x38e22: 0x6d91d420, 0x38e23: 0x6d91d620, + 0x38e24: 0x6d91d820, 0x38e25: 0x6d91da20, 0x38e26: 0x6d91dc20, 0x38e27: 0x6d91de20, + 0x38e28: 0x6d91e020, 0x38e29: 0x6d91e220, 0x38e2a: 0x6d91e420, 0x38e2b: 0x6d91e620, + 0x38e2c: 0x6d91e820, 0x38e2d: 0x6d91ea20, 0x38e2e: 0x6d91ec20, 0x38e2f: 0x6d91ee20, + 0x38e30: 0x6d91f020, 0x38e31: 0x6d91f220, 0x38e32: 0x6d91f420, 0x38e33: 0x6d91f620, + 0x38e34: 0x6d91f820, 0x38e35: 0x6d91fa20, 0x38e36: 0x6d91fc20, 0x38e37: 0x6db59020, + 0x38e38: 0x6db59220, 0x38e39: 0x6db59420, 0x38e3a: 0x6db59620, 0x38e3b: 0x6db59820, + 0x38e3c: 0x6db59a20, 0x38e3d: 0x6db59c20, 0x38e3e: 0x6db59e20, 0x38e3f: 0x6db5a020, + // Block 0xe39, offset 0x38e40 + 0x38e40: 0x6db5a220, 0x38e41: 0x6db5a420, 0x38e42: 0x6dd42020, 0x38e43: 0x6dd42220, + 0x38e44: 0x6dd42420, 0x38e45: 0x6dd42620, 0x38e46: 0x6dd42820, 0x38e47: 0x6dd42a20, + 0x38e48: 0x6dd42c20, 0x38e49: 0x6dd42e20, 0x38e4a: 0x6dd43020, 0x38e4b: 0x6dd43220, + 0x38e4c: 0x6ded1820, 0x38e4d: 0x6ded1a20, 0x38e4e: 0x6ded1c20, 0x38e4f: 0x6ded1e20, + 0x38e50: 0x6ded2020, 0x38e51: 0x6ded2220, 0x38e52: 0x6e022020, 0x38e53: 0x6e022220, + 0x38e54: 0x6e022420, 0x38e55: 0x6e022620, 0x38e56: 0x6e022820, 0x38e57: 0x6e022a20, + 0x38e58: 0x6e140220, 0x38e59: 0x6e140420, 0x38e5a: 0x6e140620, 0x38e5b: 0x6e140820, + 0x38e5c: 0x6e21a820, 0x38e5d: 0x6e21aa20, 0x38e5e: 0x6e21ac20, 0x38e5f: 0x6e21ae20, + 0x38e60: 0x6e21b020, 0x38e61: 0x6e21b220, 0x38e62: 0x6e347020, 0x38e63: 0x6e347220, + 0x38e64: 0x6e347420, 0x38e65: 0x6e347620, 0x38e66: 0x6e3a2620, 0x38e67: 0x6e3a2820, + 0x38e68: 0x6e3a2a20, 0x38e69: 0x6e3a2c20, 0x38e6a: 0x6e3a2e20, 0x38e6b: 0x6e3a3020, + 0x38e6c: 0x6e3e3020, 0x38e6d: 0x6e410220, 0x38e6e: 0x6e430c20, 0x38e6f: 0x6e46b420, + 0x38e70: 0x6e470820, 0x38e71: 0x6e473020, 0x38e72: 0x6c26a820, 0x38e73: 0x6c407620, + 0x38e74: 0x6c608020, 0x38e75: 0x6c608220, 0x38e76: 0x6c608420, 0x38e77: 0x6c864220, + 0x38e78: 0x6c864420, 0x38e79: 0x6c864620, 0x38e7a: 0x6c864820, 0x38e7b: 0x6cb02a20, + 0x38e7c: 0x6cb02c20, 0x38e7d: 0x6cb02e20, 0x38e7e: 0x6cb03020, 0x38e7f: 0x6cb03220, + // Block 0xe3a, offset 0x38e80 + 0x38e80: 0x6cb03420, 0x38e81: 0x6cb03620, 0x38e82: 0x6cb03820, 0x38e83: 0x6cb03a20, + 0x38e84: 0x6cb03c20, 0x38e85: 0x6cb03e20, 0x38e86: 0x6cb04020, 0x38e87: 0x6cb04220, + 0x38e88: 0x6cb04420, 0x38e89: 0x6cb04620, 0x38e8a: 0x6cb04820, 0x38e8b: 0x6cb04a20, + 0x38e8c: 0x6cb04c20, 0x38e8d: 0x6cb04e20, 0x38e8e: 0x6cb05020, 0x38e8f: 0x6cb05220, + 0x38e90: 0x6cb05420, 0x38e91: 0x6cdf4020, 0x38e92: 0x6cdf4220, 0x38e93: 0x6cdf4420, + 0x38e94: 0x6cdf4620, 0x38e95: 0x6cdf4820, 0x38e96: 0x6cdf4a20, 0x38e97: 0x6cdf4c20, + 0x38e98: 0x6cdf4e20, 0x38e99: 0x6cdf5020, 0x38e9a: 0x6cdf5220, 0x38e9b: 0x6cdf5420, + 0x38e9c: 0x6cdf5620, 0x38e9d: 0x6cdf5820, 0x38e9e: 0x6cdf5a20, 0x38e9f: 0x6cdf5c20, + 0x38ea0: 0x6cdf5e20, 0x38ea1: 0x6d0dca20, 0x38ea2: 0x6d0dcc20, 0x38ea3: 0x6d0dce20, + 0x38ea4: 0x6d0dd020, 0x38ea5: 0x6d0dd220, 0x38ea6: 0x6d0dd420, 0x38ea7: 0x6d0dd620, + 0x38ea8: 0x6d3c2a20, 0x38ea9: 0x6d3c2c20, 0x38eaa: 0x6d3c2e20, 0x38eab: 0x6d3c3020, + 0x38eac: 0x6d3c3220, 0x38ead: 0x6d3c3420, 0x38eae: 0x6d3c3620, 0x38eaf: 0x6d3c3820, + 0x38eb0: 0x6d3c3a20, 0x38eb1: 0x6d3c3c20, 0x38eb2: 0x6d3c3e20, 0x38eb3: 0x6d3c4020, + 0x38eb4: 0x6d684c20, 0x38eb5: 0x6d684e20, 0x38eb6: 0x6d685020, 0x38eb7: 0x6d685220, + 0x38eb8: 0x6d685420, 0x38eb9: 0x6d685620, 0x38eba: 0x6d685820, 0x38ebb: 0x6d685a20, + 0x38ebc: 0x6d685c20, 0x38ebd: 0x6d685e20, 0x38ebe: 0x6d686020, 0x38ebf: 0x6d686220, + // Block 0xe3b, offset 0x38ec0 + 0x38ec0: 0x6d686420, 0x38ec1: 0x6d686620, 0x38ec2: 0x6d686820, 0x38ec3: 0x6d686a20, + 0x38ec4: 0x6d686c20, 0x38ec5: 0x6d686e20, 0x38ec6: 0x6d687020, 0x38ec7: 0x6d687220, + 0x38ec8: 0x6d687420, 0x38ec9: 0x6d687620, 0x38eca: 0x6d687820, 0x38ecb: 0x6d920c20, + 0x38ecc: 0x6d920e20, 0x38ecd: 0x6d921020, 0x38ece: 0x6d921220, 0x38ecf: 0x6d921420, + 0x38ed0: 0x6d921620, 0x38ed1: 0x6d921820, 0x38ed2: 0x6d921a20, 0x38ed3: 0x6d921c20, + 0x38ed4: 0x6d921e20, 0x38ed5: 0x6d922020, 0x38ed6: 0x6d922220, 0x38ed7: 0x6d922420, + 0x38ed8: 0x6d922620, 0x38ed9: 0x6d922820, 0x38eda: 0x6d922a20, 0x38edb: 0x6db5b020, + 0x38edc: 0x6db5b220, 0x38edd: 0x6db5b420, 0x38ede: 0x6db5b620, 0x38edf: 0x6db5b820, + 0x38ee0: 0x6db5ba20, 0x38ee1: 0x6db5bc20, 0x38ee2: 0x6d922c20, 0x38ee3: 0x6db5be20, + 0x38ee4: 0x6db5c020, 0x38ee5: 0x6db5c220, 0x38ee6: 0x6db5c420, 0x38ee7: 0x6db5c620, + 0x38ee8: 0x6db5c820, 0x38ee9: 0x6db5ca20, 0x38eea: 0x6db5cc20, 0x38eeb: 0x6db5ce20, + 0x38eec: 0x6db5d020, 0x38eed: 0x6db5d220, 0x38eee: 0x6db5d420, 0x38eef: 0x6dd43c20, + 0x38ef0: 0x6dd43e20, 0x38ef1: 0x6dd44020, 0x38ef2: 0x6dd44220, 0x38ef3: 0x6dd44420, + 0x38ef4: 0x6dd44620, 0x38ef5: 0x6dd44820, 0x38ef6: 0x6dd44a20, 0x38ef7: 0x6dd44c20, + 0x38ef8: 0x6dd44e20, 0x38ef9: 0x6dd45020, 0x38efa: 0x6ded2e20, 0x38efb: 0x6ded3020, + 0x38efc: 0x6ded3220, 0x38efd: 0x6ded3420, 0x38efe: 0x6ded3620, 0x38eff: 0x6ded3820, + // Block 0xe3c, offset 0x38f00 + 0x38f00: 0x6ded3a20, 0x38f01: 0x6ded3c20, 0x38f02: 0x6ded3e20, 0x38f03: 0x6ded4020, + 0x38f04: 0x6e023820, 0x38f05: 0x6e023a20, 0x38f06: 0x6e023c20, 0x38f07: 0x6e023e20, + 0x38f08: 0x6e140c20, 0x38f09: 0x6e140e20, 0x38f0a: 0x6e141020, 0x38f0b: 0x6e141220, + 0x38f0c: 0x6e21b820, 0x38f0d: 0x6e21ba20, 0x38f0e: 0x6e21bc20, 0x38f0f: 0x6e21be20, + 0x38f10: 0x6e21c020, 0x38f11: 0x6e2c4020, 0x38f12: 0x6e2c4220, 0x38f13: 0x6e347820, + 0x38f14: 0x6e347a20, 0x38f15: 0x6e3a3a20, 0x38f16: 0x6e3e3220, 0x38f17: 0x6e430e20, + 0x38f18: 0x6e431020, 0x38f19: 0x6e447c20, 0x38f1a: 0x6e447e20, 0x38f1b: 0x6c26ae20, + 0x38f1c: 0x6c26b020, 0x38f1d: 0x6c407820, 0x38f1e: 0x6c407a20, 0x38f1f: 0x6c407c20, + 0x38f20: 0x6c609a20, 0x38f21: 0x6c867220, 0x38f22: 0x6c867420, 0x38f23: 0x6c867620, + 0x38f24: 0x6c867820, 0x38f25: 0x6c867a20, 0x38f26: 0x6c867c20, 0x38f27: 0x6c867e20, + 0x38f28: 0x6c868020, 0x38f29: 0x6c868220, 0x38f2a: 0x6c868420, 0x38f2b: 0x6c868620, + 0x38f2c: 0x6c868820, 0x38f2d: 0x6c868a20, 0x38f2e: 0x6cb0aa20, 0x38f2f: 0x6cb0ac20, + 0x38f30: 0x6cb0ae20, 0x38f31: 0x6cb0b020, 0x38f32: 0x6cb0b220, 0x38f33: 0x6cb0b420, + 0x38f34: 0x6cb0b620, 0x38f35: 0x6cb0b820, 0x38f36: 0x6cb0ba20, 0x38f37: 0x6cb0bc20, + 0x38f38: 0x6cb0be20, 0x38f39: 0x6cb0c020, 0x38f3a: 0x6cb0c220, 0x38f3b: 0x6cb0c420, + 0x38f3c: 0x6cb0c620, 0x38f3d: 0x6cb0c820, 0x38f3e: 0x6cb0ca20, 0x38f3f: 0x6cb0cc20, + // Block 0xe3d, offset 0x38f40 + 0x38f40: 0x6cb0ce20, 0x38f41: 0x6cb0d020, 0x38f42: 0x6cb0d220, 0x38f43: 0x6cb0d420, + 0x38f44: 0x6cb0d620, 0x38f45: 0x6cb0d820, 0x38f46: 0x6cb0da20, 0x38f47: 0x6cb0dc20, + 0x38f48: 0x6cb0de20, 0x38f49: 0x6cb0e020, 0x38f4a: 0x6cb0e220, 0x38f4b: 0x6cb0e420, + 0x38f4c: 0x6cb0e620, 0x38f4d: 0x6cb0e820, 0x38f4e: 0x6cb0ea20, 0x38f4f: 0x6cb0ec20, + 0x38f50: 0x6cb0ee20, 0x38f51: 0x6cb0f020, 0x38f52: 0x6cb0f220, 0x38f53: 0x6cb0f420, + 0x38f54: 0x6cb0f620, 0x38f55: 0x6cb0f820, 0x38f56: 0x6cb0fa20, 0x38f57: 0x6cb0fc20, + 0x38f58: 0x6cb0fe20, 0x38f59: 0x6cb10020, 0x38f5a: 0x6cb10220, 0x38f5b: 0x6cb10420, + 0x38f5c: 0x6cdfd620, 0x38f5d: 0x6cdfd820, 0x38f5e: 0x6cdfda20, 0x38f5f: 0x6cdfdc20, + 0x38f60: 0x6cdfde20, 0x38f61: 0x6cdfe020, 0x38f62: 0x6cdfe220, 0x38f63: 0x6cdfe420, + 0x38f64: 0x6cdfe620, 0x38f65: 0x6cdfe820, 0x38f66: 0x6cdfea20, 0x38f67: 0x6cdfec20, + 0x38f68: 0x6cdfee20, 0x38f69: 0x6cdff020, 0x38f6a: 0x6cdff220, 0x38f6b: 0x6cdff420, + 0x38f6c: 0x6cdff620, 0x38f6d: 0x6cdff820, 0x38f6e: 0x6cdffa20, 0x38f6f: 0x6cdffc20, + 0x38f70: 0x6cdffe20, 0x38f71: 0x6ce00020, 0x38f72: 0x6ce00220, 0x38f73: 0x6ce00420, + 0x38f74: 0x6ce00620, 0x38f75: 0x6ce00820, 0x38f76: 0x6ce00a20, 0x38f77: 0x6ce00c20, + 0x38f78: 0x6ce00e20, 0x38f79: 0x6ce01020, 0x38f7a: 0x6ce01220, 0x38f7b: 0x6ce01420, + 0x38f7c: 0x6ce01620, 0x38f7d: 0x6ce01820, 0x38f7e: 0x6ce01a20, 0x38f7f: 0x6ce01c20, + // Block 0xe3e, offset 0x38f80 + 0x38f80: 0x6ce01e20, 0x38f81: 0x6ce02020, 0x38f82: 0x6ce02220, 0x38f83: 0x6d0e4a20, + 0x38f84: 0x6d0e4c20, 0x38f85: 0x6d0e4e20, 0x38f86: 0x6d0e5020, 0x38f87: 0x6d0e5220, + 0x38f88: 0x6d0e5420, 0x38f89: 0x6d0e5620, 0x38f8a: 0x6d0e5820, 0x38f8b: 0x6d0e5a20, + 0x38f8c: 0x6d0e5c20, 0x38f8d: 0x6d0e5e20, 0x38f8e: 0x6d0e6020, 0x38f8f: 0x6d0e6220, + 0x38f90: 0x6d0e6420, 0x38f91: 0x6d0e6620, 0x38f92: 0x6d0e6820, 0x38f93: 0x6d0e6a20, + 0x38f94: 0x6d0e6c20, 0x38f95: 0x6d0e6e20, 0x38f96: 0x6d0e7020, 0x38f97: 0x6d0e7220, + 0x38f98: 0x6d0e7420, 0x38f99: 0x6d0e7620, 0x38f9a: 0x6d0e7820, 0x38f9b: 0x6d0e7a20, + 0x38f9c: 0x6d0e7c20, 0x38f9d: 0x6d0e7e20, 0x38f9e: 0x6d0e8020, 0x38f9f: 0x6d0e8220, + 0x38fa0: 0x6d0e8420, 0x38fa1: 0x6d0e8620, 0x38fa2: 0x6d0e8820, 0x38fa3: 0x6d0e8a20, + 0x38fa4: 0x6d0e8c20, 0x38fa5: 0x6d0e8e20, 0x38fa6: 0x6d0e9020, 0x38fa7: 0x6d0e9220, + 0x38fa8: 0x6d0e9420, 0x38fa9: 0x6d0e9620, 0x38faa: 0x6d0e9820, 0x38fab: 0x6d0e9a20, + 0x38fac: 0x6d0e9c20, 0x38fad: 0x6d0e9e20, 0x38fae: 0x6d0ea020, 0x38faf: 0x6d0ea220, + 0x38fb0: 0x6d0ea420, 0x38fb1: 0x6d0ea620, 0x38fb2: 0x6d0ea820, 0x38fb3: 0x6d0eaa20, + 0x38fb4: 0x6d3c9e20, 0x38fb5: 0x6d3ca020, 0x38fb6: 0x6d3ca220, 0x38fb7: 0x6d3ca420, + 0x38fb8: 0x6d3ca620, 0x38fb9: 0x6d3ca820, 0x38fba: 0x6d3caa20, 0x38fbb: 0x6d3cac20, + 0x38fbc: 0x6d3cae20, 0x38fbd: 0x6d3cb020, 0x38fbe: 0x6d3cb220, 0x38fbf: 0x6d3cb420, + // Block 0xe3f, offset 0x38fc0 + 0x38fc0: 0x6d3cb620, 0x38fc1: 0x6d3cb820, 0x38fc2: 0x6d3cba20, 0x38fc3: 0x6d3cbc20, + 0x38fc4: 0x6d3cbe20, 0x38fc5: 0x6d3cc020, 0x38fc6: 0x6d3cc220, 0x38fc7: 0x6d3cc420, + 0x38fc8: 0x6d3cc620, 0x38fc9: 0x6d3cc820, 0x38fca: 0x6d3cca20, 0x38fcb: 0x6d3ccc20, + 0x38fcc: 0x6d3cce20, 0x38fcd: 0x6d3cd020, 0x38fce: 0x6d3cd220, 0x38fcf: 0x6d3cd420, + 0x38fd0: 0x6d3cd620, 0x38fd1: 0x6d3cd820, 0x38fd2: 0x6d3cda20, 0x38fd3: 0x6d3cdc20, + 0x38fd4: 0x6d3cde20, 0x38fd5: 0x6d3ce020, 0x38fd6: 0x6d3ce220, 0x38fd7: 0x6d3ce420, + 0x38fd8: 0x6d3ce620, 0x38fd9: 0x6d3ce820, 0x38fda: 0x6d3cea20, 0x38fdb: 0x6d3cec20, + 0x38fdc: 0x6d0eac20, 0x38fdd: 0x6d3cee20, 0x38fde: 0x6d3cf020, 0x38fdf: 0x6d3cf220, + 0x38fe0: 0x6d3cf420, 0x38fe1: 0x6d3cf620, 0x38fe2: 0x6d3cf820, 0x38fe3: 0x6d3cfa20, + 0x38fe4: 0x6d3cfc20, 0x38fe5: 0x6d3cfe20, 0x38fe6: 0x6d68f820, 0x38fe7: 0x6d68fa20, + 0x38fe8: 0x6d68fc20, 0x38fe9: 0x6d68fe20, 0x38fea: 0x6d690020, 0x38feb: 0x6d690220, + 0x38fec: 0x6d690420, 0x38fed: 0x6d690620, 0x38fee: 0x6d690820, 0x38fef: 0x6d690a20, + 0x38ff0: 0x6d690c20, 0x38ff1: 0x6d690e20, 0x38ff2: 0x6d691020, 0x38ff3: 0x6d691220, + 0x38ff4: 0x6d691420, 0x38ff5: 0x6d691620, 0x38ff6: 0x6d691820, 0x38ff7: 0x6d691a20, + 0x38ff8: 0x6d691c20, 0x38ff9: 0x6d691e20, 0x38ffa: 0x6d692020, 0x38ffb: 0x6d692220, + 0x38ffc: 0x6d692420, 0x38ffd: 0x6d692620, 0x38ffe: 0x6d692820, 0x38fff: 0x6d692a20, + // Block 0xe40, offset 0x39000 + 0x39000: 0x6d692c20, 0x39001: 0x6d692e20, 0x39002: 0x6d693020, 0x39003: 0x6d693220, + 0x39004: 0x6d693420, 0x39005: 0x6d693620, 0x39006: 0x6d693820, 0x39007: 0x6d693a20, + 0x39008: 0x6d693c20, 0x39009: 0x6d693e20, 0x3900a: 0x6d694020, 0x3900b: 0x6d694220, + 0x3900c: 0x6d694420, 0x3900d: 0x6d694620, 0x3900e: 0x6d694820, 0x3900f: 0x6d694a20, + 0x39010: 0x6d694c20, 0x39011: 0x6d694e20, 0x39012: 0x6d695020, 0x39013: 0x6d695220, + 0x39014: 0x6d695420, 0x39015: 0x6d695620, 0x39016: 0x6d695820, 0x39017: 0x6d695a20, + 0x39018: 0x6d695c20, 0x39019: 0x6d695e20, 0x3901a: 0x6d696020, 0x3901b: 0x6d696220, + 0x3901c: 0x6d696420, 0x3901d: 0x6d696620, 0x3901e: 0x6d696820, 0x3901f: 0x6d696a20, + 0x39020: 0x6d696c20, 0x39021: 0x6d696e20, 0x39022: 0x6d697020, 0x39023: 0x6d928820, + 0x39024: 0x6d928a20, 0x39025: 0x6d928c20, 0x39026: 0x6d928e20, 0x39027: 0x6d929020, + 0x39028: 0x6d929220, 0x39029: 0x6d929420, 0x3902a: 0x6d929620, 0x3902b: 0x6d929820, + 0x3902c: 0x6d929a20, 0x3902d: 0x6d929c20, 0x3902e: 0x6d929e20, 0x3902f: 0x6d92a020, + 0x39030: 0x6d92a220, 0x39031: 0x6d92a420, 0x39032: 0x6d92a620, 0x39033: 0x6d92a820, + 0x39034: 0x6d92aa20, 0x39035: 0x6d92ac20, 0x39036: 0x6d92ae20, 0x39037: 0x6d92b020, + 0x39038: 0x6d92b220, 0x39039: 0x6d92b420, 0x3903a: 0x6d92b620, 0x3903b: 0x6d92b820, + 0x3903c: 0x6d92ba20, 0x3903d: 0x6d92bc20, 0x3903e: 0x6d92be20, 0x3903f: 0x6d92c020, + // Block 0xe41, offset 0x39040 + 0x39040: 0x6d92c220, 0x39041: 0x6d92c420, 0x39042: 0x6d92c620, 0x39043: 0x6d92c820, + 0x39044: 0x6d92ca20, 0x39045: 0x6d92cc20, 0x39046: 0x6d92ce20, 0x39047: 0x6d92d020, + 0x39048: 0x6d92d220, 0x39049: 0x6d92d420, 0x3904a: 0x6d92d620, 0x3904b: 0x6d92d820, + 0x3904c: 0x6d92da20, 0x3904d: 0x6d92dc20, 0x3904e: 0x6d92de20, 0x3904f: 0x6d92e020, + 0x39050: 0x6d92e220, 0x39051: 0x6d92e420, 0x39052: 0x6d92e620, 0x39053: 0x6d92e820, + 0x39054: 0x6d92ea20, 0x39055: 0x6d92ec20, 0x39056: 0x6d92ee20, 0x39057: 0x6d92f020, + 0x39058: 0x6db61e20, 0x39059: 0x6db62020, 0x3905a: 0x6db62220, 0x3905b: 0x6db62420, + 0x3905c: 0x6db62620, 0x3905d: 0x6db62820, 0x3905e: 0x6db62a20, 0x3905f: 0x6db62c20, + 0x39060: 0x6db62e20, 0x39061: 0x6db63020, 0x39062: 0x6db63220, 0x39063: 0x6db63420, + 0x39064: 0x6db63620, 0x39065: 0x6db63820, 0x39066: 0x6db63a20, 0x39067: 0x6db63c20, + 0x39068: 0x6db63e20, 0x39069: 0x6db64020, 0x3906a: 0x6db64220, 0x3906b: 0x6db64420, + 0x3906c: 0x6db64620, 0x3906d: 0x6db64820, 0x3906e: 0x6db64a20, 0x3906f: 0x6db64c20, + 0x39070: 0x6db64e20, 0x39071: 0x6db65020, 0x39072: 0x6db65220, 0x39073: 0x6db65420, + 0x39074: 0x6db65620, 0x39075: 0x6db65820, 0x39076: 0x6db65a20, 0x39077: 0x6db65c20, + 0x39078: 0x6db65e20, 0x39079: 0x6db66020, 0x3907a: 0x6db66220, 0x3907b: 0x6db66420, + 0x3907c: 0x6db66620, 0x3907d: 0x6db66820, 0x3907e: 0x6db66a20, 0x3907f: 0x6db66c20, + // Block 0xe42, offset 0x39080 + 0x39080: 0x6db66e20, 0x39081: 0x6db67020, 0x39082: 0x6db67220, 0x39083: 0x6db67420, + 0x39084: 0x6db67620, 0x39085: 0x6db67820, 0x39086: 0x6db67a20, 0x39087: 0x6db67c20, + 0x39088: 0x6db67e20, 0x39089: 0x6db68020, 0x3908a: 0x6db68220, 0x3908b: 0x6db68420, + 0x3908c: 0x6db68620, 0x3908d: 0x6db68820, 0x3908e: 0x6db68a20, 0x3908f: 0x6db68c20, + 0x39090: 0x6db68e20, 0x39091: 0x6db69020, 0x39092: 0x6dd49a20, 0x39093: 0x6dd49c20, + 0x39094: 0x6dd49e20, 0x39095: 0x6dd4a020, 0x39096: 0x6dd4a220, 0x39097: 0x6dd4a420, + 0x39098: 0x6dd4a620, 0x39099: 0x6dd4a820, 0x3909a: 0x6dd4aa20, 0x3909b: 0x6dd4ac20, + 0x3909c: 0x6dd4ae20, 0x3909d: 0x6dd4b020, 0x3909e: 0x6dd4b220, 0x3909f: 0x6dd4b420, + 0x390a0: 0x6dd4b620, 0x390a1: 0x6dd4b820, 0x390a2: 0x6dd4ba20, 0x390a3: 0x6dd4bc20, + 0x390a4: 0x6dd4be20, 0x390a5: 0x6dd4c020, 0x390a6: 0x6dd4c220, 0x390a7: 0x6dd4c420, + 0x390a8: 0x6dd4c620, 0x390a9: 0x6dd4c820, 0x390aa: 0x6dd4ca20, 0x390ab: 0x6dd4cc20, + 0x390ac: 0x6dd4ce20, 0x390ad: 0x6dd4d020, 0x390ae: 0x6dd4d220, 0x390af: 0x6dd4d420, + 0x390b0: 0x6dd4d620, 0x390b1: 0x6dd4d820, 0x390b2: 0x6dd4da20, 0x390b3: 0x6dd4dc20, + 0x390b4: 0x6dd4de20, 0x390b5: 0x6dd4e020, 0x390b6: 0x6dd4e220, 0x390b7: 0x6dd4e420, + 0x390b8: 0x6dd4e620, 0x390b9: 0x6dd4e820, 0x390ba: 0x6dd4ea20, 0x390bb: 0x6dd4ec20, + 0x390bc: 0x6dd4ee20, 0x390bd: 0x6dd4f020, 0x390be: 0x6ded8820, 0x390bf: 0x6ded8a20, + // Block 0xe43, offset 0x390c0 + 0x390c0: 0x6ded8c20, 0x390c1: 0x6ded8e20, 0x390c2: 0x6ded9020, 0x390c3: 0x6ded9220, + 0x390c4: 0x6ded9420, 0x390c5: 0x6ded9620, 0x390c6: 0x6ded9820, 0x390c7: 0x6ded9a20, + 0x390c8: 0x6ded9c20, 0x390c9: 0x6ded9e20, 0x390ca: 0x6deda020, 0x390cb: 0x6deda220, + 0x390cc: 0x6deda420, 0x390cd: 0x6deda620, 0x390ce: 0x6deda820, 0x390cf: 0x6dedaa20, + 0x390d0: 0x6dedac20, 0x390d1: 0x6dedae20, 0x390d2: 0x6dedb020, 0x390d3: 0x6dedb220, + 0x390d4: 0x6dedb420, 0x390d5: 0x6dedb620, 0x390d6: 0x6dedb820, 0x390d7: 0x6dedba20, + 0x390d8: 0x6dedbc20, 0x390d9: 0x6dedbe20, 0x390da: 0x6dedc020, 0x390db: 0x6dedc220, + 0x390dc: 0x6dedc420, 0x390dd: 0x6dedc620, 0x390de: 0x6dedc820, 0x390df: 0x6dedca20, + 0x390e0: 0x6dedcc20, 0x390e1: 0x6dedce20, 0x390e2: 0x6dedd020, 0x390e3: 0x6dedd220, + 0x390e4: 0x6dedd420, 0x390e5: 0x6dedd620, 0x390e6: 0x6dedd820, 0x390e7: 0x6e027c20, + 0x390e8: 0x6e027e20, 0x390e9: 0x6e028020, 0x390ea: 0x6e028220, 0x390eb: 0x6e028420, + 0x390ec: 0x6e028620, 0x390ed: 0x6e028820, 0x390ee: 0x6e028a20, 0x390ef: 0x6e028c20, + 0x390f0: 0x6e028e20, 0x390f1: 0x6e029020, 0x390f2: 0x6e029220, 0x390f3: 0x6e029420, + 0x390f4: 0x6e029620, 0x390f5: 0x6e029820, 0x390f6: 0x6e029a20, 0x390f7: 0x6e029c20, + 0x390f8: 0x6e029e20, 0x390f9: 0x6e02a020, 0x390fa: 0x6e02a220, 0x390fb: 0x6e02a420, + 0x390fc: 0x6e02a620, 0x390fd: 0x6e02a820, 0x390fe: 0x6e02aa20, 0x390ff: 0x6e02ac20, + // Block 0xe44, offset 0x39100 + 0x39100: 0x6e02ae20, 0x39101: 0x6e02b020, 0x39102: 0x6e143820, 0x39103: 0x6e143a20, + 0x39104: 0x6e143c20, 0x39105: 0x6e143e20, 0x39106: 0x6e144020, 0x39107: 0x6e144220, + 0x39108: 0x6e144420, 0x39109: 0x6e144620, 0x3910a: 0x6e144820, 0x3910b: 0x6e144a20, + 0x3910c: 0x6e144c20, 0x3910d: 0x6e144e20, 0x3910e: 0x6e145020, 0x3910f: 0x6e145220, + 0x39110: 0x6e145420, 0x39111: 0x6e21d820, 0x39112: 0x6e145620, 0x39113: 0x6e145820, + 0x39114: 0x6e145a20, 0x39115: 0x6e145c20, 0x39116: 0x6e145e20, 0x39117: 0x6e146020, + 0x39118: 0x6e146220, 0x39119: 0x6e146420, 0x3911a: 0x6e146620, 0x3911b: 0x6e146820, + 0x3911c: 0x6e21da20, 0x3911d: 0x6e21dc20, 0x3911e: 0x6e21de20, 0x3911f: 0x6e21e020, + 0x39120: 0x6e21e220, 0x39121: 0x6e21e420, 0x39122: 0x6e21e620, 0x39123: 0x6e21e820, + 0x39124: 0x6e21ea20, 0x39125: 0x6e21ec20, 0x39126: 0x6e21ee20, 0x39127: 0x6e21f020, + 0x39128: 0x6e21f220, 0x39129: 0x6e21f420, 0x3912a: 0x6e21f620, 0x3912b: 0x6e21f820, + 0x3912c: 0x6e21fa20, 0x3912d: 0x6e21fc20, 0x3912e: 0x6e21fe20, 0x3912f: 0x6e220020, + 0x39130: 0x6e220220, 0x39131: 0x6e220420, 0x39132: 0x6e220620, 0x39133: 0x6e220820, + 0x39134: 0x6e220a20, 0x39135: 0x6e220c20, 0x39136: 0x6e220e20, 0x39137: 0x6e221020, + 0x39138: 0x6e2c5a20, 0x39139: 0x6e2c5c20, 0x3913a: 0x6e2c5e20, 0x3913b: 0x6e2c6020, + 0x3913c: 0x6e2c6220, 0x3913d: 0x6e2c6420, 0x3913e: 0x6e2c6620, 0x3913f: 0x6e2c6820, + // Block 0xe45, offset 0x39140 + 0x39140: 0x6e2c6a20, 0x39141: 0x6e2c6c20, 0x39142: 0x6e2c6e20, 0x39143: 0x6e2c7020, + 0x39144: 0x6e2c7220, 0x39145: 0x6e348a20, 0x39146: 0x6e348c20, 0x39147: 0x6e348e20, + 0x39148: 0x6e349020, 0x39149: 0x6e349220, 0x3914a: 0x6e349420, 0x3914b: 0x6e349620, + 0x3914c: 0x6e349820, 0x3914d: 0x6e349a20, 0x3914e: 0x6e349c20, 0x3914f: 0x6e349e20, + 0x39150: 0x6e34a020, 0x39151: 0x6e3a4220, 0x39152: 0x6e3a4420, 0x39153: 0x6e3a4620, + 0x39154: 0x6e3a4820, 0x39155: 0x6e3a4a20, 0x39156: 0x6e3a4c20, 0x39157: 0x6e3a4e20, + 0x39158: 0x6e3a5020, 0x39159: 0x6e3e3820, 0x3915a: 0x6e3e3a20, 0x3915b: 0x6e3e3c20, + 0x3915c: 0x6e3e3e20, 0x3915d: 0x6e3e4020, 0x3915e: 0x6e410a20, 0x3915f: 0x6e410c20, + 0x39160: 0x6e410e20, 0x39161: 0x6e411020, 0x39162: 0x6e431220, 0x39163: 0x6e431420, + 0x39164: 0x6e431620, 0x39165: 0x6e428c20, 0x39166: 0x6e431820, 0x39167: 0x6e431a20, + 0x39168: 0x6e448220, 0x39169: 0x6e472020, 0x3916a: 0x6c26d620, 0x3916b: 0x6c26e820, + 0x3916c: 0x6c86c820, 0x3916d: 0x6c86ca20, 0x3916e: 0x6c86cc20, 0x3916f: 0x6cb14620, + 0x39170: 0x6cb14820, 0x39171: 0x6cb14a20, 0x39172: 0x6cb14c20, 0x39173: 0x6ce04c20, + 0x39174: 0x6ce04e20, 0x39175: 0x6d0ec420, 0x39176: 0x6d0ec620, 0x39177: 0x6d0ec820, + 0x39178: 0x6d3d1a20, 0x39179: 0x6d3d1c20, 0x3917a: 0x6d698820, 0x3917b: 0x6d698a20, + 0x3917c: 0x6d698c20, 0x3917d: 0x6d698e20, 0x3917e: 0x6d699020, 0x3917f: 0x6d699220, + // Block 0xe46, offset 0x39180 + 0x39180: 0x6d930020, 0x39181: 0x6d930220, 0x39182: 0x6d930420, 0x39183: 0x6d930620, + 0x39184: 0x6d930820, 0x39185: 0x6d930a20, 0x39186: 0x6db6a620, 0x39187: 0x6db6a820, + 0x39188: 0x6db6aa20, 0x39189: 0x6db6ac20, 0x3918a: 0x6dd50220, 0x3918b: 0x6dede620, + 0x3918c: 0x6dede820, 0x3918d: 0x6dedea20, 0x3918e: 0x6dedec20, 0x3918f: 0x6dedee20, + 0x39190: 0x6dedf020, 0x39191: 0x6dedf220, 0x39192: 0x6dedf420, 0x39193: 0x6e02b620, + 0x39194: 0x6e02b820, 0x39195: 0x6e146c20, 0x39196: 0x6e146e20, 0x39197: 0x6e3a5220, + 0x39198: 0x6e411220, 0x39199: 0x6e45da20, 0x3919a: 0x6c60c220, 0x3919b: 0x6c86d220, + 0x3919c: 0x6c86d420, 0x3919d: 0x6c86d620, 0x3919e: 0x6cb15420, 0x3919f: 0x6cb15620, + 0x391a0: 0x6ce05220, 0x391a1: 0x6ce05420, 0x391a2: 0x6ce05620, 0x391a3: 0x6ce05820, + 0x391a4: 0x6ce05a20, 0x391a5: 0x6d0ed020, 0x391a6: 0x6d0ed220, 0x391a7: 0x6cee2c20, + 0x391a8: 0x6d0ed420, 0x391a9: 0x6d3d2420, 0x391aa: 0x6d3d2620, 0x391ab: 0x6d3d2820, + 0x391ac: 0x6d3d2a20, 0x391ad: 0x6d699e20, 0x391ae: 0x6d69a020, 0x391af: 0x6d69a220, + 0x391b0: 0x6d69a420, 0x391b1: 0x6d69a620, 0x391b2: 0x6d69a820, 0x391b3: 0x6d69aa20, + 0x391b4: 0x6d69ac20, 0x391b5: 0x6d69ae20, 0x391b6: 0x6d69b020, 0x391b7: 0x6d931620, + 0x391b8: 0x6d931820, 0x391b9: 0x6d931a20, 0x391ba: 0x6d931c20, 0x391bb: 0x6d931e20, + 0x391bc: 0x6db6b620, 0x391bd: 0x6db6b820, 0x391be: 0x6db6ba20, 0x391bf: 0x6db6bc20, + // Block 0xe47, offset 0x391c0 + 0x391c0: 0x6db6be20, 0x391c1: 0x6db6c020, 0x391c2: 0x6db6c220, 0x391c3: 0x6dd50820, + 0x391c4: 0x6dd50a20, 0x391c5: 0x6dd50c20, 0x391c6: 0x6dd50e20, 0x391c7: 0x6dd51020, + 0x391c8: 0x6db6c420, 0x391c9: 0x6dedf620, 0x391ca: 0x6dedf820, 0x391cb: 0x6dedfa20, + 0x391cc: 0x6dedfc20, 0x391cd: 0x6dedfe20, 0x391ce: 0x6dee0020, 0x391cf: 0x6dee0220, + 0x391d0: 0x6dee0420, 0x391d1: 0x6e02bc20, 0x391d2: 0x6e02be20, 0x391d3: 0x6e02c020, + 0x391d4: 0x6e02c220, 0x391d5: 0x6e02c420, 0x391d6: 0x6e02c620, 0x391d7: 0x6e147220, + 0x391d8: 0x6e147420, 0x391d9: 0x6e221a20, 0x391da: 0x6e221c20, 0x391db: 0x6e221e20, + 0x391dc: 0x6e222020, 0x391dd: 0x6e2c7a20, 0x391de: 0x6e2c7c20, 0x391df: 0x6e2c7e20, + 0x391e0: 0x6e34a820, 0x391e1: 0x6e3a5820, 0x391e2: 0x6e3a5a20, 0x391e3: 0x6e411620, + 0x391e4: 0x6e411820, 0x391e5: 0x6e448420, 0x391e6: 0x6c40ba20, 0x391e7: 0x6c26ee20, + 0x391e8: 0x6c26f020, 0x391e9: 0x6c60c420, 0x391ea: 0x6c86dc20, 0x391eb: 0x6c86de20, + 0x391ec: 0x6c86e020, 0x391ed: 0x6c86e220, 0x391ee: 0x6cb16820, 0x391ef: 0x6cb16a20, + 0x391f0: 0x6cb16c20, 0x391f1: 0x6cb16e20, 0x391f2: 0x6cb17020, 0x391f3: 0x6cb17220, + 0x391f4: 0x6cb17420, 0x391f5: 0x6ce06620, 0x391f6: 0x6ce06820, 0x391f7: 0x6ce06a20, + 0x391f8: 0x6ce06c20, 0x391f9: 0x6ce06e20, 0x391fa: 0x6ce07020, 0x391fb: 0x6ce07220, + 0x391fc: 0x6ce07420, 0x391fd: 0x6ce07620, 0x391fe: 0x6ce07820, 0x391ff: 0x6d0ee220, + // Block 0xe48, offset 0x39200 + 0x39200: 0x6d0ee420, 0x39201: 0x6d0ee620, 0x39202: 0x6d0ee820, 0x39203: 0x6d0eea20, + 0x39204: 0x6d0eec20, 0x39205: 0x6d0eee20, 0x39206: 0x6d0ef020, 0x39207: 0x6d0ef220, + 0x39208: 0x6d0ef420, 0x39209: 0x6d0ef620, 0x3920a: 0x6d0ef820, 0x3920b: 0x6d0efa20, + 0x3920c: 0x6d0efc20, 0x3920d: 0x6d3d3420, 0x3920e: 0x6d3d3620, 0x3920f: 0x6d3d3820, + 0x39210: 0x6d3d3a20, 0x39211: 0x6d3d3c20, 0x39212: 0x6d3d3e20, 0x39213: 0x6d3d4020, + 0x39214: 0x6d3d4220, 0x39215: 0x6d3d4420, 0x39216: 0x6d3d4620, 0x39217: 0x6d3d4820, + 0x39218: 0x6d69ba20, 0x39219: 0x6d69bc20, 0x3921a: 0x6d69be20, 0x3921b: 0x6d69c020, + 0x3921c: 0x6d69c220, 0x3921d: 0x6d69c420, 0x3921e: 0x6d69c620, 0x3921f: 0x6d69c820, + 0x39220: 0x6d69ca20, 0x39221: 0x6d69cc20, 0x39222: 0x6d69ce20, 0x39223: 0x6d69d020, + 0x39224: 0x6d69d220, 0x39225: 0x6d69d420, 0x39226: 0x6d69d620, 0x39227: 0x6d69d820, + 0x39228: 0x6d932a20, 0x39229: 0x6d932c20, 0x3922a: 0x6d932e20, 0x3922b: 0x6d933020, + 0x3922c: 0x6d933220, 0x3922d: 0x6d933420, 0x3922e: 0x6d933620, 0x3922f: 0x6d933820, + 0x39230: 0x6d933a20, 0x39231: 0x6d933c20, 0x39232: 0x6db6d020, 0x39233: 0x6db6d220, + 0x39234: 0x6db6d420, 0x39235: 0x6db6d620, 0x39236: 0x6db6d820, 0x39237: 0x6db6da20, + 0x39238: 0x6db6dc20, 0x39239: 0x6db6de20, 0x3923a: 0x6db6e020, 0x3923b: 0x6dd51a20, + 0x3923c: 0x6dd51c20, 0x3923d: 0x6dd51e20, 0x3923e: 0x6dd52020, 0x3923f: 0x6dd52220, + // Block 0xe49, offset 0x39240 + 0x39240: 0x6dd52420, 0x39241: 0x6dd52620, 0x39242: 0x6dee0c20, 0x39243: 0x6dee0e20, + 0x39244: 0x6dee1020, 0x39245: 0x6dee1220, 0x39246: 0x6dee1420, 0x39247: 0x6e02c820, + 0x39248: 0x6e02ca20, 0x39249: 0x6e02cc20, 0x3924a: 0x6e02ce20, 0x3924b: 0x6e02d020, + 0x3924c: 0x6e147820, 0x3924d: 0x6e147a20, 0x3924e: 0x6e147c20, 0x3924f: 0x6e147e20, + 0x39250: 0x6e222420, 0x39251: 0x6e222620, 0x39252: 0x6e222820, 0x39253: 0x6e222a20, + 0x39254: 0x6e2c8020, 0x39255: 0x6e2c8220, 0x39256: 0x6e2c8420, 0x39257: 0x6e222c20, + 0x39258: 0x6e34aa20, 0x39259: 0x6e34ac20, 0x3925a: 0x6e3a6020, 0x3925b: 0x6e3a6220, + 0x3925c: 0x6e3a6420, 0x3925d: 0x6e411a20, 0x3925e: 0x6e448620, 0x3925f: 0x6e46ec20, + 0x39260: 0x6c40be20, 0x39261: 0x6c60c620, 0x39262: 0x6c86ea20, 0x39263: 0x6c86ec20, + 0x39264: 0x6cb18420, 0x39265: 0x6cb18620, 0x39266: 0x6cb18820, 0x39267: 0x6cb18a20, + 0x39268: 0x6cb18c20, 0x39269: 0x6cb18e20, 0x3926a: 0x6cb19020, 0x3926b: 0x6cb19220, + 0x3926c: 0x6ce08a20, 0x3926d: 0x6ce08c20, 0x3926e: 0x6ce08e20, 0x3926f: 0x6ce09020, + 0x39270: 0x6ce09220, 0x39271: 0x6ce09420, 0x39272: 0x6ce09620, 0x39273: 0x6ce09820, + 0x39274: 0x6ce09a20, 0x39275: 0x6ce09c20, 0x39276: 0x6ce09e20, 0x39277: 0x6ce0a020, + 0x39278: 0x6ce0a220, 0x39279: 0x6ce0a420, 0x3927a: 0x6ce0a620, 0x3927b: 0x6ce0a820, + 0x3927c: 0x6ce0aa20, 0x3927d: 0x6ce0ac20, 0x3927e: 0x6d0f0c20, 0x3927f: 0x6d0f0e20, + // Block 0xe4a, offset 0x39280 + 0x39280: 0x6d0f1020, 0x39281: 0x6d0f1220, 0x39282: 0x6d0f1420, 0x39283: 0x6d0f1620, + 0x39284: 0x6d0f1820, 0x39285: 0x6d0f1a20, 0x39286: 0x6d0f1c20, 0x39287: 0x6d0f1e20, + 0x39288: 0x6d0f2020, 0x39289: 0x6d0f2220, 0x3928a: 0x6d3d5620, 0x3928b: 0x6d3d5820, + 0x3928c: 0x6d3d5a20, 0x3928d: 0x6d3d5c20, 0x3928e: 0x6d3d5e20, 0x3928f: 0x6d3d6020, + 0x39290: 0x6d3d6220, 0x39291: 0x6d3d6420, 0x39292: 0x6d3d6620, 0x39293: 0x6d3d6820, + 0x39294: 0x6d3d6a20, 0x39295: 0x6d3d6c20, 0x39296: 0x6d3d6e20, 0x39297: 0x6d3d7020, + 0x39298: 0x6d3d7220, 0x39299: 0x6d69e420, 0x3929a: 0x6d69e620, 0x3929b: 0x6d69e820, + 0x3929c: 0x6d69ea20, 0x3929d: 0x6d69ec20, 0x3929e: 0x6d69ee20, 0x3929f: 0x6d69f020, + 0x392a0: 0x6d69f220, 0x392a1: 0x6d69f420, 0x392a2: 0x6d69f620, 0x392a3: 0x6d69f820, + 0x392a4: 0x6d69fa20, 0x392a5: 0x6d69fc20, 0x392a6: 0x6d934a20, 0x392a7: 0x6d934c20, + 0x392a8: 0x6d934e20, 0x392a9: 0x6d935020, 0x392aa: 0x6d935220, 0x392ab: 0x6d935420, + 0x392ac: 0x6d935620, 0x392ad: 0x6d935820, 0x392ae: 0x6d935a20, 0x392af: 0x6d935c20, + 0x392b0: 0x6d935e20, 0x392b1: 0x6d69fe20, 0x392b2: 0x6d936020, 0x392b3: 0x6d936220, + 0x392b4: 0x6d936420, 0x392b5: 0x6db6ea20, 0x392b6: 0x6db6ec20, 0x392b7: 0x6db6ee20, + 0x392b8: 0x6db6f020, 0x392b9: 0x6db6f220, 0x392ba: 0x6db6f420, 0x392bb: 0x6db6f620, + 0x392bc: 0x6db6f820, 0x392bd: 0x6db6fa20, 0x392be: 0x6db6fc20, 0x392bf: 0x6db6fe20, + // Block 0xe4b, offset 0x392c0 + 0x392c0: 0x6db70020, 0x392c1: 0x6dd53220, 0x392c2: 0x6dd53420, 0x392c3: 0x6dd53620, + 0x392c4: 0x6dd53820, 0x392c5: 0x6dd53a20, 0x392c6: 0x6dee2220, 0x392c7: 0x6dd53c20, + 0x392c8: 0x6dd53e20, 0x392c9: 0x6dd54020, 0x392ca: 0x6dd54220, 0x392cb: 0x6dd54420, + 0x392cc: 0x6dee2420, 0x392cd: 0x6dee2620, 0x392ce: 0x6dee2820, 0x392cf: 0x6dee2a20, + 0x392d0: 0x6e02d220, 0x392d1: 0x6dee2c20, 0x392d2: 0x6dee2e20, 0x392d3: 0x6dee3020, + 0x392d4: 0x6dee3220, 0x392d5: 0x6dee3420, 0x392d6: 0x6e02d420, 0x392d7: 0x6e02d620, + 0x392d8: 0x6e02d820, 0x392d9: 0x6e02da20, 0x392da: 0x6e02dc20, 0x392db: 0x6e02de20, + 0x392dc: 0x6e02e020, 0x392dd: 0x6e148020, 0x392de: 0x6e148220, 0x392df: 0x6e222e20, + 0x392e0: 0x6e2c8620, 0x392e1: 0x6e2c8820, 0x392e2: 0x6e34ae20, 0x392e3: 0x6e411e20, + 0x392e4: 0x6c60ce20, 0x392e5: 0x6c60d020, 0x392e6: 0x6c60d220, 0x392e7: 0x6c60d420, + 0x392e8: 0x6c60d620, 0x392e9: 0x6c60d820, 0x392ea: 0x6c86f820, 0x392eb: 0x6c86fa20, + 0x392ec: 0x6c86fc20, 0x392ed: 0x6c86fe20, 0x392ee: 0x6c870020, 0x392ef: 0x6c870220, + 0x392f0: 0x6c870420, 0x392f1: 0x6c870620, 0x392f2: 0x6c870820, 0x392f3: 0x6cb1ac20, + 0x392f4: 0x6cb1ae20, 0x392f5: 0x6cb1b020, 0x392f6: 0x6cb1b220, 0x392f7: 0x6cb1b420, + 0x392f8: 0x6cb1b620, 0x392f9: 0x6cb1b820, 0x392fa: 0x6cb1ba20, 0x392fb: 0x6cb1bc20, + 0x392fc: 0x6cb1be20, 0x392fd: 0x6cb1c020, 0x392fe: 0x6cb1c220, 0x392ff: 0x6cb1c420, + // Block 0xe4c, offset 0x39300 + 0x39300: 0x6cb1c620, 0x39301: 0x6cb1c820, 0x39302: 0x6cb1ca20, 0x39303: 0x6cb1cc20, + 0x39304: 0x6cb1ce20, 0x39305: 0x6cb1d020, 0x39306: 0x6cb1d220, 0x39307: 0x6cb1d420, + 0x39308: 0x6cb1d620, 0x39309: 0x6ce0e020, 0x3930a: 0x6ce0e220, 0x3930b: 0x6ce0e420, + 0x3930c: 0x6ce0e620, 0x3930d: 0x6ce0e820, 0x3930e: 0x6ce0ea20, 0x3930f: 0x6ce0ec20, + 0x39310: 0x6ce0ee20, 0x39311: 0x6ce0f020, 0x39312: 0x6ce0f220, 0x39313: 0x6ce0f420, + 0x39314: 0x6ce0f620, 0x39315: 0x6ce0f820, 0x39316: 0x6ce0fa20, 0x39317: 0x6ce0fc20, + 0x39318: 0x6ce0fe20, 0x39319: 0x6ce10020, 0x3931a: 0x6ce10220, 0x3931b: 0x6ce10420, + 0x3931c: 0x6ce10620, 0x3931d: 0x6ce10820, 0x3931e: 0x6ce10a20, 0x3931f: 0x6ce10c20, + 0x39320: 0x6ce10e20, 0x39321: 0x6ce11020, 0x39322: 0x6ce11220, 0x39323: 0x6d0f4a20, + 0x39324: 0x6d0f4c20, 0x39325: 0x6d0f4e20, 0x39326: 0x6d0f5020, 0x39327: 0x6d0f5220, + 0x39328: 0x6d0f5420, 0x39329: 0x6d0f5620, 0x3932a: 0x6d0f5820, 0x3932b: 0x6d0f5a20, + 0x3932c: 0x6d0f5c20, 0x3932d: 0x6d0f5e20, 0x3932e: 0x6d0f6020, 0x3932f: 0x6d0f6220, + 0x39330: 0x6d0f6420, 0x39331: 0x6d0f6620, 0x39332: 0x6d0f6820, 0x39333: 0x6d0f6a20, + 0x39334: 0x6d0f6c20, 0x39335: 0x6d0f6e20, 0x39336: 0x6d0f7020, 0x39337: 0x6d0f7220, + 0x39338: 0x6d0f7420, 0x39339: 0x6d0f7620, 0x3933a: 0x6d0f7820, 0x3933b: 0x6d0f7a20, + 0x3933c: 0x6d0f7c20, 0x3933d: 0x6d0f7e20, 0x3933e: 0x6d0f8020, 0x3933f: 0x6d0f8220, + // Block 0xe4d, offset 0x39340 + 0x39340: 0x6d0f8420, 0x39341: 0x6d0f8620, 0x39342: 0x6d0f8820, 0x39343: 0x6d0f8a20, + 0x39344: 0x6d0f8c20, 0x39345: 0x6d3d9020, 0x39346: 0x6d3d9220, 0x39347: 0x6d3d9420, + 0x39348: 0x6d3d9620, 0x39349: 0x6d3d9820, 0x3934a: 0x6d3d9a20, 0x3934b: 0x6d3d9c20, + 0x3934c: 0x6d3d9e20, 0x3934d: 0x6d3da020, 0x3934e: 0x6d3da220, 0x3934f: 0x6d3da420, + 0x39350: 0x6d3da620, 0x39351: 0x6d3da820, 0x39352: 0x6d3daa20, 0x39353: 0x6d3dac20, + 0x39354: 0x6d3dae20, 0x39355: 0x6d3db020, 0x39356: 0x6d3db220, 0x39357: 0x6d3db420, + 0x39358: 0x6d3db620, 0x39359: 0x6d3db820, 0x3935a: 0x6d3dba20, 0x3935b: 0x6d6a3c20, + 0x3935c: 0x6d6a3e20, 0x3935d: 0x6d6a4020, 0x3935e: 0x6d6a4220, 0x3935f: 0x6d6a4420, + 0x39360: 0x6d6a4620, 0x39361: 0x6d6a4820, 0x39362: 0x6d6a4a20, 0x39363: 0x6d6a4c20, + 0x39364: 0x6d6a4e20, 0x39365: 0x6d6a5020, 0x39366: 0x6d6a5220, 0x39367: 0x6d6a5420, + 0x39368: 0x6d6a5620, 0x39369: 0x6d6a5820, 0x3936a: 0x6d6a5a20, 0x3936b: 0x6d6a5c20, + 0x3936c: 0x6d6a5e20, 0x3936d: 0x6d6a6020, 0x3936e: 0x6d6a6220, 0x3936f: 0x6d6a6420, + 0x39370: 0x6d6a6620, 0x39371: 0x6d938420, 0x39372: 0x6d938620, 0x39373: 0x6d938820, + 0x39374: 0x6d938a20, 0x39375: 0x6d938c20, 0x39376: 0x6d938e20, 0x39377: 0x6d939020, + 0x39378: 0x6d939220, 0x39379: 0x6d939420, 0x3937a: 0x6d939620, 0x3937b: 0x6d939820, + 0x3937c: 0x6d939a20, 0x3937d: 0x6d939c20, 0x3937e: 0x6d939e20, 0x3937f: 0x6d93a020, + // Block 0xe4e, offset 0x39380 + 0x39380: 0x6d93a220, 0x39381: 0x6d93a420, 0x39382: 0x6d93a620, 0x39383: 0x6d93a820, + 0x39384: 0x6d93aa20, 0x39385: 0x6db02a20, 0x39386: 0x6d93ac20, 0x39387: 0x6d93ae20, + 0x39388: 0x6d93b020, 0x39389: 0x6d93b220, 0x3938a: 0x6d93b420, 0x3938b: 0x6d93b620, + 0x3938c: 0x6db71820, 0x3938d: 0x6db71a20, 0x3938e: 0x6db71c20, 0x3938f: 0x6db71e20, + 0x39390: 0x6db72020, 0x39391: 0x6db72220, 0x39392: 0x6db72420, 0x39393: 0x6db72620, + 0x39394: 0x6db72820, 0x39395: 0x6db72a20, 0x39396: 0x6db72c20, 0x39397: 0x6db72e20, + 0x39398: 0x6db73020, 0x39399: 0x6db73220, 0x3939a: 0x6db73420, 0x3939b: 0x6db73620, + 0x3939c: 0x6db73820, 0x3939d: 0x6db73a20, 0x3939e: 0x6dd55620, 0x3939f: 0x6dd55820, + 0x393a0: 0x6dd55a20, 0x393a1: 0x6dd55c20, 0x393a2: 0x6dd55e20, 0x393a3: 0x6dd56020, + 0x393a4: 0x6dd56220, 0x393a5: 0x6dd56420, 0x393a6: 0x6dd56620, 0x393a7: 0x6dd56820, + 0x393a8: 0x6dd56a20, 0x393a9: 0x6dd56c20, 0x393aa: 0x6dd56e20, 0x393ab: 0x6dd57020, + 0x393ac: 0x6dd57220, 0x393ad: 0x6dd57420, 0x393ae: 0x6dd57620, 0x393af: 0x6dd57820, + 0x393b0: 0x6dd57a20, 0x393b1: 0x6dd57c20, 0x393b2: 0x6dd57e20, 0x393b3: 0x6dd58020, + 0x393b4: 0x6dd58220, 0x393b5: 0x6dd58420, 0x393b6: 0x6dd58620, 0x393b7: 0x6dd58820, + 0x393b8: 0x6dd58a20, 0x393b9: 0x6dd58c20, 0x393ba: 0x6dd58e20, 0x393bb: 0x6dd59020, + 0x393bc: 0x6dee4620, 0x393bd: 0x6dee4820, 0x393be: 0x6dee4a20, 0x393bf: 0x6dee4c20, + // Block 0xe4f, offset 0x393c0 + 0x393c0: 0x6dee4e20, 0x393c1: 0x6dee5020, 0x393c2: 0x6dee5220, 0x393c3: 0x6dee5420, + 0x393c4: 0x6dee5620, 0x393c5: 0x6dee5820, 0x393c6: 0x6dee5a20, 0x393c7: 0x6dee5c20, + 0x393c8: 0x6dee5e20, 0x393c9: 0x6dee6020, 0x393ca: 0x6dee6220, 0x393cb: 0x6dee6420, + 0x393cc: 0x6dee6620, 0x393cd: 0x6dee6820, 0x393ce: 0x6dee6a20, 0x393cf: 0x6dee6c20, + 0x393d0: 0x6dee6e20, 0x393d1: 0x6dee7020, 0x393d2: 0x6dee7220, 0x393d3: 0x6dee7420, + 0x393d4: 0x6dee7620, 0x393d5: 0x6dee7820, 0x393d6: 0x6e02ea20, 0x393d7: 0x6e02ec20, + 0x393d8: 0x6e02ee20, 0x393d9: 0x6e02f020, 0x393da: 0x6e02f220, 0x393db: 0x6e02f420, + 0x393dc: 0x6e02f620, 0x393dd: 0x6e02f820, 0x393de: 0x6e02fa20, 0x393df: 0x6e02fc20, + 0x393e0: 0x6e02fe20, 0x393e1: 0x6e030020, 0x393e2: 0x6e030220, 0x393e3: 0x6e030420, + 0x393e4: 0x6e030620, 0x393e5: 0x6e030820, 0x393e6: 0x6e148e20, 0x393e7: 0x6e149020, + 0x393e8: 0x6e149220, 0x393e9: 0x6e149420, 0x393ea: 0x6e149620, 0x393eb: 0x6e149820, + 0x393ec: 0x6e149a20, 0x393ed: 0x6e149c20, 0x393ee: 0x6e149e20, 0x393ef: 0x6e14a020, + 0x393f0: 0x6e14a220, 0x393f1: 0x6e223a20, 0x393f2: 0x6e223c20, 0x393f3: 0x6e223e20, + 0x393f4: 0x6e224020, 0x393f5: 0x6e224220, 0x393f6: 0x6e224420, 0x393f7: 0x6e224620, + 0x393f8: 0x6e224820, 0x393f9: 0x6e224a20, 0x393fa: 0x6e224c20, 0x393fb: 0x6e224e20, + 0x393fc: 0x6e225020, 0x393fd: 0x6e2c9020, 0x393fe: 0x6e2c9220, 0x393ff: 0x6e225220, + // Block 0xe50, offset 0x39400 + 0x39400: 0x6e2c9420, 0x39401: 0x6e2c9620, 0x39402: 0x6e2c9820, 0x39403: 0x6e2c9a20, + 0x39404: 0x6e2c9c20, 0x39405: 0x6e2c9e20, 0x39406: 0x6e2ca020, 0x39407: 0x6e2ca220, + 0x39408: 0x6e34b220, 0x39409: 0x6e34b420, 0x3940a: 0x6e34b620, 0x3940b: 0x6e34b820, + 0x3940c: 0x6e3a6a20, 0x3940d: 0x6e3a6c20, 0x3940e: 0x6e3e4420, 0x3940f: 0x6e3e4620, + 0x39410: 0x6e3e4820, 0x39411: 0x6c40da20, 0x39412: 0x6c60f420, 0x39413: 0x6cb1e420, + 0x39414: 0x6ce12e20, 0x39415: 0x6ce13020, 0x39416: 0x6ce13220, 0x39417: 0x6d6a7420, + 0x39418: 0x6c40dc20, 0x39419: 0x6c60fa20, 0x3941a: 0x6c60fc20, 0x3941b: 0x6cb1ee20, + 0x3941c: 0x6cb1f020, 0x3941d: 0x6ce13620, 0x3941e: 0x6ce13820, 0x3941f: 0x6ce13a20, + 0x39420: 0x6d0fa020, 0x39421: 0x6d0fa220, 0x39422: 0x6d0fa420, 0x39423: 0x6d3dd020, + 0x39424: 0x6d3dd220, 0x39425: 0x6d3dd420, 0x39426: 0x6d3dd620, 0x39427: 0x6d6a7620, + 0x39428: 0x6d6a7820, 0x39429: 0x6d6a7a20, 0x3942a: 0x6d6a7c20, 0x3942b: 0x6d6a7e20, + 0x3942c: 0x6d93d020, 0x3942d: 0x6d93d220, 0x3942e: 0x6d93d420, 0x3942f: 0x6d93d620, + 0x39430: 0x6d93d820, 0x39431: 0x6d93da20, 0x39432: 0x6db74620, 0x39433: 0x6db74820, + 0x39434: 0x6db74a20, 0x39435: 0x6db74c20, 0x39436: 0x6dd59620, 0x39437: 0x6dd59820, + 0x39438: 0x6dee7c20, 0x39439: 0x6dee7e20, 0x3943a: 0x6dee8020, 0x3943b: 0x6dee8220, + 0x3943c: 0x6dee8420, 0x3943d: 0x6e14a820, 0x3943e: 0x6e14aa20, 0x3943f: 0x6e14ac20, + // Block 0xe51, offset 0x39440 + 0x39440: 0x6e225820, 0x39441: 0x6e225a20, 0x39442: 0x6e2ca620, 0x39443: 0x6e2ca820, + 0x39444: 0x6e2caa20, 0x39445: 0x6e2cac20, 0x39446: 0x6c26fe20, 0x39447: 0x6c40de20, + 0x39448: 0x6c610820, 0x39449: 0x6c610a20, 0x3944a: 0x6c610c20, 0x3944b: 0x6c610e20, + 0x3944c: 0x6c611020, 0x3944d: 0x6c611220, 0x3944e: 0x6c611420, 0x3944f: 0x6c873420, + 0x39450: 0x6c873620, 0x39451: 0x6c873820, 0x39452: 0x6c873a20, 0x39453: 0x6c873c20, + 0x39454: 0x6c873e20, 0x39455: 0x6c874020, 0x39456: 0x6c874220, 0x39457: 0x6c874420, + 0x39458: 0x6c874620, 0x39459: 0x6c874820, 0x3945a: 0x6c874a20, 0x3945b: 0x6c874c20, + 0x3945c: 0x6c874e20, 0x3945d: 0x6cb20a20, 0x3945e: 0x6cb20c20, 0x3945f: 0x6cb20e20, + 0x39460: 0x6cb21020, 0x39461: 0x6cb21220, 0x39462: 0x6cb21420, 0x39463: 0x6cb21620, + 0x39464: 0x6cb21820, 0x39465: 0x6cb21a20, 0x39466: 0x6cb21c20, 0x39467: 0x6cb21e20, + 0x39468: 0x6cb22020, 0x39469: 0x6cb22220, 0x3946a: 0x6cb22420, 0x3946b: 0x6cb22620, + 0x3946c: 0x6cb22820, 0x3946d: 0x6cb22a20, 0x3946e: 0x6cb22c20, 0x3946f: 0x6cb22e20, + 0x39470: 0x6cb23020, 0x39471: 0x6cb23220, 0x39472: 0x6cb23420, 0x39473: 0x6cb23620, + 0x39474: 0x6cb23820, 0x39475: 0x6cb23a20, 0x39476: 0x6ce16620, 0x39477: 0x6ce16820, + 0x39478: 0x6ce16a20, 0x39479: 0x6ce16c20, 0x3947a: 0x6ce16e20, 0x3947b: 0x6ce17020, + 0x3947c: 0x6ce17220, 0x3947d: 0x6ce17420, 0x3947e: 0x6ce17620, 0x3947f: 0x6ce17820, + // Block 0xe52, offset 0x39480 + 0x39480: 0x6ce17a20, 0x39481: 0x6ce17c20, 0x39482: 0x6ce17e20, 0x39483: 0x6ce18020, + 0x39484: 0x6ce18220, 0x39485: 0x6ce18420, 0x39486: 0x6ce18620, 0x39487: 0x6ce18820, + 0x39488: 0x6ce18a20, 0x39489: 0x6ce18c20, 0x3948a: 0x6ce18e20, 0x3948b: 0x6ce19020, + 0x3948c: 0x6ce19220, 0x3948d: 0x6ce19420, 0x3948e: 0x6ce19620, 0x3948f: 0x6ce19820, + 0x39490: 0x6d0fc620, 0x39491: 0x6d0fc820, 0x39492: 0x6d0fca20, 0x39493: 0x6d0fcc20, + 0x39494: 0x6d0fce20, 0x39495: 0x6d0fd020, 0x39496: 0x6d0fd220, 0x39497: 0x6d0fd420, + 0x39498: 0x6d0fd620, 0x39499: 0x6d0fd820, 0x3949a: 0x6d0fda20, 0x3949b: 0x6d0fdc20, + 0x3949c: 0x6d0fde20, 0x3949d: 0x6d0fe020, 0x3949e: 0x6d0fe220, 0x3949f: 0x6d0fe420, + 0x394a0: 0x6d0fe620, 0x394a1: 0x6d0fe820, 0x394a2: 0x6d0fea20, 0x394a3: 0x6d0fec20, + 0x394a4: 0x6d0fee20, 0x394a5: 0x6d0ff020, 0x394a6: 0x6d0ff220, 0x394a7: 0x6d0ff420, + 0x394a8: 0x6d0ff620, 0x394a9: 0x6d0ff820, 0x394aa: 0x6d0ffa20, 0x394ab: 0x6d0ffc20, + 0x394ac: 0x6d0ffe20, 0x394ad: 0x6d100020, 0x394ae: 0x6d100220, 0x394af: 0x6d3df420, + 0x394b0: 0x6d3df620, 0x394b1: 0x6d3df820, 0x394b2: 0x6d3dfa20, 0x394b3: 0x6d3dfc20, + 0x394b4: 0x6d3dfe20, 0x394b5: 0x6d3e0020, 0x394b6: 0x6d3e0220, 0x394b7: 0x6d3e0420, + 0x394b8: 0x6d3e0620, 0x394b9: 0x6d3e0820, 0x394ba: 0x6d3e0a20, 0x394bb: 0x6d3e0c20, + 0x394bc: 0x6d3e0e20, 0x394bd: 0x6d3e1020, 0x394be: 0x6d3e1220, 0x394bf: 0x6d3e1420, + // Block 0xe53, offset 0x394c0 + 0x394c0: 0x6d3e1620, 0x394c1: 0x6d3e1820, 0x394c2: 0x6d3e1a20, 0x394c3: 0x6d3e1c20, + 0x394c4: 0x6d3e1e20, 0x394c5: 0x6d3e2020, 0x394c6: 0x6d3e2220, 0x394c7: 0x6d3e2420, + 0x394c8: 0x6d3e2620, 0x394c9: 0x6d3e2820, 0x394ca: 0x6d3e2a20, 0x394cb: 0x6d3e2c20, + 0x394cc: 0x6d3e2e20, 0x394cd: 0x6d3e3020, 0x394ce: 0x6d6aa420, 0x394cf: 0x6d6aa620, + 0x394d0: 0x6d6aa820, 0x394d1: 0x6d6aaa20, 0x394d2: 0x6d6aac20, 0x394d3: 0x6d6aae20, + 0x394d4: 0x6d6ab020, 0x394d5: 0x6d6ab220, 0x394d6: 0x6d6ab420, 0x394d7: 0x6d6ab620, + 0x394d8: 0x6d6ab820, 0x394d9: 0x6d6aba20, 0x394da: 0x6d6abc20, 0x394db: 0x6d6abe20, + 0x394dc: 0x6d6ac020, 0x394dd: 0x6d3e3220, 0x394de: 0x6d6ac220, 0x394df: 0x6d93ea20, + 0x394e0: 0x6d6ac420, 0x394e1: 0x6d6ac620, 0x394e2: 0x6d6ac820, 0x394e3: 0x6d6aca20, + 0x394e4: 0x6d6acc20, 0x394e5: 0x6d6ace20, 0x394e6: 0x6d6ad020, 0x394e7: 0x6d6ad220, + 0x394e8: 0x6d93ec20, 0x394e9: 0x6d93ee20, 0x394ea: 0x6d93f020, 0x394eb: 0x6d93f220, + 0x394ec: 0x6d93f420, 0x394ed: 0x6d93f620, 0x394ee: 0x6d93f820, 0x394ef: 0x6d93fa20, + 0x394f0: 0x6d93fc20, 0x394f1: 0x6d93fe20, 0x394f2: 0x6d940020, 0x394f3: 0x6d940220, + 0x394f4: 0x6d940420, 0x394f5: 0x6d940620, 0x394f6: 0x6d940820, 0x394f7: 0x6d940a20, + 0x394f8: 0x6d940c20, 0x394f9: 0x6d940e20, 0x394fa: 0x6d941020, 0x394fb: 0x6d941220, + 0x394fc: 0x6d941420, 0x394fd: 0x6d941620, 0x394fe: 0x6d941820, 0x394ff: 0x6d941a20, + // Block 0xe54, offset 0x39500 + 0x39500: 0x6d941c20, 0x39501: 0x6d941e20, 0x39502: 0x6d942020, 0x39503: 0x6d942220, + 0x39504: 0x6d942420, 0x39505: 0x6d942620, 0x39506: 0x6d942820, 0x39507: 0x6d942a20, + 0x39508: 0x6d942c20, 0x39509: 0x6db75820, 0x3950a: 0x6db75a20, 0x3950b: 0x6db75c20, + 0x3950c: 0x6db75e20, 0x3950d: 0x6db76020, 0x3950e: 0x6db76220, 0x3950f: 0x6db76420, + 0x39510: 0x6db76620, 0x39511: 0x6db76820, 0x39512: 0x6db76a20, 0x39513: 0x6db76c20, + 0x39514: 0x6db76e20, 0x39515: 0x6db77020, 0x39516: 0x6db77220, 0x39517: 0x6db77420, + 0x39518: 0x6db77620, 0x39519: 0x6db77820, 0x3951a: 0x6db77a20, 0x3951b: 0x6db77c20, + 0x3951c: 0x6db77e20, 0x3951d: 0x6db78020, 0x3951e: 0x6dd5a820, 0x3951f: 0x6dd5aa20, + 0x39520: 0x6dd5ac20, 0x39521: 0x6dd5ae20, 0x39522: 0x6dd5b020, 0x39523: 0x6dd5b220, + 0x39524: 0x6dd5b420, 0x39525: 0x6dd5b620, 0x39526: 0x6dd5b820, 0x39527: 0x6dd5ba20, + 0x39528: 0x6dd5bc20, 0x39529: 0x6dd5be20, 0x3952a: 0x6dd5c020, 0x3952b: 0x6dd5c220, + 0x3952c: 0x6dd5c420, 0x3952d: 0x6dd5c620, 0x3952e: 0x6dd5c820, 0x3952f: 0x6dd5ca20, + 0x39530: 0x6dd5cc20, 0x39531: 0x6dd5ce20, 0x39532: 0x6dd5d020, 0x39533: 0x6dd5d220, + 0x39534: 0x6dd5d420, 0x39535: 0x6dd5d620, 0x39536: 0x6dee9020, 0x39537: 0x6dee9220, + 0x39538: 0x6dee9420, 0x39539: 0x6dee9620, 0x3953a: 0x6dee9820, 0x3953b: 0x6dee9a20, + 0x3953c: 0x6dee9c20, 0x3953d: 0x6dee9e20, 0x3953e: 0x6deea020, 0x3953f: 0x6deea220, + // Block 0xe55, offset 0x39540 + 0x39540: 0x6deea420, 0x39541: 0x6deea620, 0x39542: 0x6deea820, 0x39543: 0x6deeaa20, + 0x39544: 0x6deeac20, 0x39545: 0x6deeae20, 0x39546: 0x6deeb020, 0x39547: 0x6deeb220, + 0x39548: 0x6deeb420, 0x39549: 0x6deeb620, 0x3954a: 0x6deeb820, 0x3954b: 0x6deeba20, + 0x3954c: 0x6deebc20, 0x3954d: 0x6e031420, 0x3954e: 0x6e031620, 0x3954f: 0x6e031820, + 0x39550: 0x6e031a20, 0x39551: 0x6e031c20, 0x39552: 0x6e031e20, 0x39553: 0x6e032020, + 0x39554: 0x6e032220, 0x39555: 0x6e032420, 0x39556: 0x6e032620, 0x39557: 0x6e032820, + 0x39558: 0x6e032a20, 0x39559: 0x6e14b420, 0x3955a: 0x6e14b620, 0x3955b: 0x6e14b820, + 0x3955c: 0x6e14ba20, 0x3955d: 0x6e14bc20, 0x3955e: 0x6e14be20, 0x3955f: 0x6e14c020, + 0x39560: 0x6e14c220, 0x39561: 0x6e226220, 0x39562: 0x6e226420, 0x39563: 0x6e226620, + 0x39564: 0x6e226820, 0x39565: 0x6e226a20, 0x39566: 0x6e226c20, 0x39567: 0x6e226e20, + 0x39568: 0x6e2cb220, 0x39569: 0x6e2cb420, 0x3956a: 0x6e2cb620, 0x3956b: 0x6e2cb820, + 0x3956c: 0x6e2cba20, 0x3956d: 0x6e2cbc20, 0x3956e: 0x6e34bc20, 0x3956f: 0x6e34be20, + 0x39570: 0x6e3a7020, 0x39571: 0x6e3a7220, 0x39572: 0x6e3a7420, 0x39573: 0x6e3a7620, + 0x39574: 0x6e3a7820, 0x39575: 0x6e412020, 0x39576: 0x6e432020, 0x39577: 0x6c270420, + 0x39578: 0x6c40e020, 0x39579: 0x6c40e220, 0x3957a: 0x6c611c20, 0x3957b: 0x6c611e20, + 0x3957c: 0x6c612020, 0x3957d: 0x6c612220, 0x3957e: 0x6c612420, 0x3957f: 0x6c612620, + // Block 0xe56, offset 0x39580 + 0x39580: 0x6c612820, 0x39581: 0x6c875c20, 0x39582: 0x6c875e20, 0x39583: 0x6c876020, + 0x39584: 0x6c876220, 0x39585: 0x6c876420, 0x39586: 0x6c876620, 0x39587: 0x6c876820, + 0x39588: 0x6c876a20, 0x39589: 0x6c876c20, 0x3958a: 0x6c876e20, 0x3958b: 0x6c877020, + 0x3958c: 0x6c877220, 0x3958d: 0x6c877420, 0x3958e: 0x6c877620, 0x3958f: 0x6c877820, + 0x39590: 0x6c877a20, 0x39591: 0x6c877c20, 0x39592: 0x6cb26420, 0x39593: 0x6cb26620, + 0x39594: 0x6cb26820, 0x39595: 0x6cb26a20, 0x39596: 0x6cb26c20, 0x39597: 0x6cb26e20, + 0x39598: 0x6cb27020, 0x39599: 0x6cb27220, 0x3959a: 0x6cb27420, 0x3959b: 0x6cb27620, + 0x3959c: 0x6cb27820, 0x3959d: 0x6cb27a20, 0x3959e: 0x6cb27c20, 0x3959f: 0x6cb27e20, + 0x395a0: 0x6cb28020, 0x395a1: 0x6cb28220, 0x395a2: 0x6cb28420, 0x395a3: 0x6cb28620, + 0x395a4: 0x6cb28820, 0x395a5: 0x6cb28a20, 0x395a6: 0x6cb28c20, 0x395a7: 0x6cb28e20, + 0x395a8: 0x6cb29020, 0x395a9: 0x6cb29220, 0x395aa: 0x6cb29420, 0x395ab: 0x6cb29620, + 0x395ac: 0x6cb29820, 0x395ad: 0x6cb29a20, 0x395ae: 0x6cb29c20, 0x395af: 0x6cb29e20, + 0x395b0: 0x6cb2a020, 0x395b1: 0x6cb2a220, 0x395b2: 0x6ce1ee20, 0x395b3: 0x6ce1f020, + 0x395b4: 0x6ce1f220, 0x395b5: 0x6ce1f420, 0x395b6: 0x6ce1f620, 0x395b7: 0x6ce1f820, + 0x395b8: 0x6ce1fa20, 0x395b9: 0x6ce1fc20, 0x395ba: 0x6ce1fe20, 0x395bb: 0x6ce20020, + 0x395bc: 0x6ce20220, 0x395bd: 0x6ce20420, 0x395be: 0x6ce20620, 0x395bf: 0x6ce20820, + // Block 0xe57, offset 0x395c0 + 0x395c0: 0x6ce20a20, 0x395c1: 0x6ce20c20, 0x395c2: 0x6ce20e20, 0x395c3: 0x6ce21020, + 0x395c4: 0x6ce21220, 0x395c5: 0x6ce21420, 0x395c6: 0x6ce21620, 0x395c7: 0x6ce21820, + 0x395c8: 0x6ce21a20, 0x395c9: 0x6ce21c20, 0x395ca: 0x6ce21e20, 0x395cb: 0x6ce22020, + 0x395cc: 0x6ce22220, 0x395cd: 0x6ce22420, 0x395ce: 0x6ce22620, 0x395cf: 0x6ce22820, + 0x395d0: 0x6ce22a20, 0x395d1: 0x6ce22c20, 0x395d2: 0x6ce22e20, 0x395d3: 0x6ce23020, + 0x395d4: 0x6ce23220, 0x395d5: 0x6d105020, 0x395d6: 0x6d105220, 0x395d7: 0x6d105420, + 0x395d8: 0x6d105620, 0x395d9: 0x6d105820, 0x395da: 0x6d105a20, 0x395db: 0x6d105c20, + 0x395dc: 0x6d105e20, 0x395dd: 0x6d106020, 0x395de: 0x6d106220, 0x395df: 0x6d106420, + 0x395e0: 0x6d106620, 0x395e1: 0x6d106820, 0x395e2: 0x6d106a20, 0x395e3: 0x6d106c20, + 0x395e4: 0x6d106e20, 0x395e5: 0x6d107020, 0x395e6: 0x6d107220, 0x395e7: 0x6d107420, + 0x395e8: 0x6d107620, 0x395e9: 0x6d107820, 0x395ea: 0x6d107a20, 0x395eb: 0x6d107c20, + 0x395ec: 0x6d107e20, 0x395ed: 0x6d108020, 0x395ee: 0x6d108220, 0x395ef: 0x6d108420, + 0x395f0: 0x6d108620, 0x395f1: 0x6d108820, 0x395f2: 0x6d108a20, 0x395f3: 0x6d108c20, + 0x395f4: 0x6d108e20, 0x395f5: 0x6d109020, 0x395f6: 0x6d109220, 0x395f7: 0x6d109420, + 0x395f8: 0x6d109620, 0x395f9: 0x6d109820, 0x395fa: 0x6d109a20, 0x395fb: 0x6d109c20, + 0x395fc: 0x6d109e20, 0x395fd: 0x6d10a020, 0x395fe: 0x6d10a220, 0x395ff: 0x6d10a420, + // Block 0xe58, offset 0x39600 + 0x39600: 0x6d3e7220, 0x39601: 0x6d3e7420, 0x39602: 0x6d3e7620, 0x39603: 0x6d3e7820, + 0x39604: 0x6d3e7a20, 0x39605: 0x6d3e7c20, 0x39606: 0x6d3e7e20, 0x39607: 0x6d3e8020, + 0x39608: 0x6d3e8220, 0x39609: 0x6d3e8420, 0x3960a: 0x6d3e8620, 0x3960b: 0x6d3e8820, + 0x3960c: 0x6d3e8a20, 0x3960d: 0x6d3e8c20, 0x3960e: 0x6d3e8e20, 0x3960f: 0x6d3e9020, + 0x39610: 0x6d3e9220, 0x39611: 0x6d3e9420, 0x39612: 0x6d3e9620, 0x39613: 0x6d3e9820, + 0x39614: 0x6d3e9a20, 0x39615: 0x6d3e9c20, 0x39616: 0x6d3e9e20, 0x39617: 0x6d3ea020, + 0x39618: 0x6d3ea220, 0x39619: 0x6d3ea420, 0x3961a: 0x6d3ea620, 0x3961b: 0x6d3ea820, + 0x3961c: 0x6d3eaa20, 0x3961d: 0x6d3eac20, 0x3961e: 0x6d3eae20, 0x3961f: 0x6d3eb020, + 0x39620: 0x6d3eb220, 0x39621: 0x6d3eb420, 0x39622: 0x6d3eb620, 0x39623: 0x6d3eb820, + 0x39624: 0x6d3eba20, 0x39625: 0x6d3ebc20, 0x39626: 0x6d3ebe20, 0x39627: 0x6d3ec020, + 0x39628: 0x6d3ec220, 0x39629: 0x6d3ec420, 0x3962a: 0x6d3ec620, 0x3962b: 0x6d3ec820, + 0x3962c: 0x6d3eca20, 0x3962d: 0x6d3ecc20, 0x3962e: 0x6d3ece20, 0x3962f: 0x6d3ed020, + 0x39630: 0x6d3ed220, 0x39631: 0x6d3ed420, 0x39632: 0x6d3ed620, 0x39633: 0x6d3ed820, + 0x39634: 0x6d3eda20, 0x39635: 0x6d6b3c20, 0x39636: 0x6d6b3e20, 0x39637: 0x6d6b4020, + 0x39638: 0x6d6b4220, 0x39639: 0x6d6b4420, 0x3963a: 0x6d6b4620, 0x3963b: 0x6d6b4820, + 0x3963c: 0x6d6b4a20, 0x3963d: 0x6d6b4c20, 0x3963e: 0x6d6b4e20, 0x3963f: 0x6d6b5020, + // Block 0xe59, offset 0x39640 + 0x39640: 0x6d6b5220, 0x39641: 0x6d6b5420, 0x39642: 0x6d6b5620, 0x39643: 0x6d6b5820, + 0x39644: 0x6d6b5a20, 0x39645: 0x6d6b5c20, 0x39646: 0x6d6b5e20, 0x39647: 0x6d6b6020, + 0x39648: 0x6d6b6220, 0x39649: 0x6d6b6420, 0x3964a: 0x6d6b6620, 0x3964b: 0x6d6b6820, + 0x3964c: 0x6d6b6a20, 0x3964d: 0x6d6b6c20, 0x3964e: 0x6d6b6e20, 0x3964f: 0x6d6b7020, + 0x39650: 0x6d6b7220, 0x39651: 0x6d6b7420, 0x39652: 0x6d6b7620, 0x39653: 0x6d6b7820, + 0x39654: 0x6d6b7a20, 0x39655: 0x6d6b7c20, 0x39656: 0x6d6b7e20, 0x39657: 0x6d6b8020, + 0x39658: 0x6d6b8220, 0x39659: 0x6d6b8420, 0x3965a: 0x6d6b8620, 0x3965b: 0x6d6b8820, + 0x3965c: 0x6d6b8a20, 0x3965d: 0x6d946e20, 0x3965e: 0x6d947020, 0x3965f: 0x6d6b8c20, + 0x39660: 0x6d947220, 0x39661: 0x6d947420, 0x39662: 0x6d947620, 0x39663: 0x6d947820, + 0x39664: 0x6d947a20, 0x39665: 0x6d947c20, 0x39666: 0x6d947e20, 0x39667: 0x6d948020, + 0x39668: 0x6d948220, 0x39669: 0x6d948420, 0x3966a: 0x6d948620, 0x3966b: 0x6d948820, + 0x3966c: 0x6d948a20, 0x3966d: 0x6d948c20, 0x3966e: 0x6d948e20, 0x3966f: 0x6d949020, + 0x39670: 0x6d949220, 0x39671: 0x6d949420, 0x39672: 0x6d949620, 0x39673: 0x6d949820, + 0x39674: 0x6d949a20, 0x39675: 0x6d949c20, 0x39676: 0x6d949e20, 0x39677: 0x6d94a020, + 0x39678: 0x6d94a220, 0x39679: 0x6d94a420, 0x3967a: 0x6d94a620, 0x3967b: 0x6d94a820, + 0x3967c: 0x6d94aa20, 0x3967d: 0x6d94ac20, 0x3967e: 0x6d94ae20, 0x3967f: 0x6d94b020, + // Block 0xe5a, offset 0x39680 + 0x39680: 0x6d94b220, 0x39681: 0x6d94b420, 0x39682: 0x6d94b620, 0x39683: 0x6d94b820, + 0x39684: 0x6d94ba20, 0x39685: 0x6d94bc20, 0x39686: 0x6d94be20, 0x39687: 0x6d94c020, + 0x39688: 0x6d94c220, 0x39689: 0x6d94c420, 0x3968a: 0x6d94c620, 0x3968b: 0x6d94c820, + 0x3968c: 0x6d94ca20, 0x3968d: 0x6d94cc20, 0x3968e: 0x6d94ce20, 0x3968f: 0x6d94d020, + 0x39690: 0x6d94d220, 0x39691: 0x6d94d420, 0x39692: 0x6d94d620, 0x39693: 0x6db7ae20, + 0x39694: 0x6db7b020, 0x39695: 0x6db7b220, 0x39696: 0x6db7b420, 0x39697: 0x6db7b620, + 0x39698: 0x6db7b820, 0x39699: 0x6db7ba20, 0x3969a: 0x6db7bc20, 0x3969b: 0x6db7be20, + 0x3969c: 0x6db7c020, 0x3969d: 0x6db7c220, 0x3969e: 0x6db7c420, 0x3969f: 0x6db7c620, + 0x396a0: 0x6db7c820, 0x396a1: 0x6db7ca20, 0x396a2: 0x6db7cc20, 0x396a3: 0x6db7ce20, + 0x396a4: 0x6db7d020, 0x396a5: 0x6db7d220, 0x396a6: 0x6db7d420, 0x396a7: 0x6db7d620, + 0x396a8: 0x6db7d820, 0x396a9: 0x6db7da20, 0x396aa: 0x6db7dc20, 0x396ab: 0x6db7de20, + 0x396ac: 0x6db7e020, 0x396ad: 0x6db7e220, 0x396ae: 0x6db7e420, 0x396af: 0x6db7e620, + 0x396b0: 0x6db7e820, 0x396b1: 0x6db7ea20, 0x396b2: 0x6db7ec20, 0x396b3: 0x6db7ee20, + 0x396b4: 0x6db7f020, 0x396b5: 0x6db7f220, 0x396b6: 0x6db7f420, 0x396b7: 0x6db7f620, + 0x396b8: 0x6db7f820, 0x396b9: 0x6db7fa20, 0x396ba: 0x6db7fc20, 0x396bb: 0x6db7fe20, + 0x396bc: 0x6db80020, 0x396bd: 0x6db80220, 0x396be: 0x6db80420, 0x396bf: 0x6db80620, + // Block 0xe5b, offset 0x396c0 + 0x396c0: 0x6db80820, 0x396c1: 0x6db80a20, 0x396c2: 0x6db80c20, 0x396c3: 0x6dd61420, + 0x396c4: 0x6db80e20, 0x396c5: 0x6dd61620, 0x396c6: 0x6dd61820, 0x396c7: 0x6dd61a20, + 0x396c8: 0x6dd61c20, 0x396c9: 0x6dd61e20, 0x396ca: 0x6dd62020, 0x396cb: 0x6dd62220, + 0x396cc: 0x6dd62420, 0x396cd: 0x6dd62620, 0x396ce: 0x6dd62820, 0x396cf: 0x6dd62a20, + 0x396d0: 0x6dd62c20, 0x396d1: 0x6dd62e20, 0x396d2: 0x6dd63020, 0x396d3: 0x6dd63220, + 0x396d4: 0x6dd63420, 0x396d5: 0x6dd63620, 0x396d6: 0x6dd63820, 0x396d7: 0x6dd63a20, + 0x396d8: 0x6dd63c20, 0x396d9: 0x6dd63e20, 0x396da: 0x6dd64020, 0x396db: 0x6dd64220, + 0x396dc: 0x6dd64420, 0x396dd: 0x6dd64620, 0x396de: 0x6dd64820, 0x396df: 0x6dd64a20, + 0x396e0: 0x6dd64c20, 0x396e1: 0x6dd64e20, 0x396e2: 0x6dd65020, 0x396e3: 0x6dd65220, + 0x396e4: 0x6dd65420, 0x396e5: 0x6dd65620, 0x396e6: 0x6dd65820, 0x396e7: 0x6dd65a20, + 0x396e8: 0x6dd65c20, 0x396e9: 0x6dd65e20, 0x396ea: 0x6dd66020, 0x396eb: 0x6dd66220, + 0x396ec: 0x6dd66420, 0x396ed: 0x6dd66620, 0x396ee: 0x6dd66820, 0x396ef: 0x6dd66a20, + 0x396f0: 0x6dd66c20, 0x396f1: 0x6dd66e20, 0x396f2: 0x6dd67020, 0x396f3: 0x6dd67220, + 0x396f4: 0x6dd67420, 0x396f5: 0x6dd67620, 0x396f6: 0x6dd67820, 0x396f7: 0x6dd67a20, + 0x396f8: 0x6dd67c20, 0x396f9: 0x6dd67e20, 0x396fa: 0x6dd68020, 0x396fb: 0x6dd68220, + 0x396fc: 0x6dd68420, 0x396fd: 0x6dd68620, 0x396fe: 0x6dd68820, 0x396ff: 0x6dd68a20, + // Block 0xe5c, offset 0x39700 + 0x39700: 0x6dd68c20, 0x39701: 0x6dd68e20, 0x39702: 0x6dd69020, 0x39703: 0x6dd69220, + 0x39704: 0x6dd69420, 0x39705: 0x6dd69620, 0x39706: 0x6dd69820, 0x39707: 0x6dd69a20, + 0x39708: 0x6dd69c20, 0x39709: 0x6dd69e20, 0x3970a: 0x6deef420, 0x3970b: 0x6deef620, + 0x3970c: 0x6deef820, 0x3970d: 0x6deefa20, 0x3970e: 0x6deefc20, 0x3970f: 0x6deefe20, + 0x39710: 0x6def0020, 0x39711: 0x6def0220, 0x39712: 0x6def0420, 0x39713: 0x6def0620, + 0x39714: 0x6def0820, 0x39715: 0x6def0a20, 0x39716: 0x6def0c20, 0x39717: 0x6def0e20, + 0x39718: 0x6def1020, 0x39719: 0x6def1220, 0x3971a: 0x6dd6a020, 0x3971b: 0x6def1420, + 0x3971c: 0x6def1620, 0x3971d: 0x6def1820, 0x3971e: 0x6def1a20, 0x3971f: 0x6def1c20, + 0x39720: 0x6def1e20, 0x39721: 0x6def2020, 0x39722: 0x6def2220, 0x39723: 0x6def2420, + 0x39724: 0x6def2620, 0x39725: 0x6def2820, 0x39726: 0x6def2a20, 0x39727: 0x6def2c20, + 0x39728: 0x6def2e20, 0x39729: 0x6def3020, 0x3972a: 0x6def3220, 0x3972b: 0x6def3420, + 0x3972c: 0x6def3620, 0x3972d: 0x6def3820, 0x3972e: 0x6def3a20, 0x3972f: 0x6def3c20, + 0x39730: 0x6def3e20, 0x39731: 0x6def4020, 0x39732: 0x6def4220, 0x39733: 0x6def4420, + 0x39734: 0x6def4620, 0x39735: 0x6def4820, 0x39736: 0x6def4a20, 0x39737: 0x6def4c20, + 0x39738: 0x6def4e20, 0x39739: 0x6def5020, 0x3973a: 0x6def5220, 0x3973b: 0x6def5420, + 0x3973c: 0x6def5620, 0x3973d: 0x6def5820, 0x3973e: 0x6def5a20, 0x3973f: 0x6def5c20, + // Block 0xe5d, offset 0x39740 + 0x39740: 0x6def5e20, 0x39741: 0x6e034020, 0x39742: 0x6e034220, 0x39743: 0x6e034420, + 0x39744: 0x6e034620, 0x39745: 0x6e034820, 0x39746: 0x6e034a20, 0x39747: 0x6e034c20, + 0x39748: 0x6e034e20, 0x39749: 0x6e035020, 0x3974a: 0x6e035220, 0x3974b: 0x6e035420, + 0x3974c: 0x6e035620, 0x3974d: 0x6e035820, 0x3974e: 0x6e035a20, 0x3974f: 0x6e035c20, + 0x39750: 0x6e035e20, 0x39751: 0x6e036020, 0x39752: 0x6e036220, 0x39753: 0x6e036420, + 0x39754: 0x6e036620, 0x39755: 0x6e036820, 0x39756: 0x6e036a20, 0x39757: 0x6e036c20, + 0x39758: 0x6e036e20, 0x39759: 0x6e037020, 0x3975a: 0x6e037220, 0x3975b: 0x6e037420, + 0x3975c: 0x6e037620, 0x3975d: 0x6e037820, 0x3975e: 0x6e037a20, 0x3975f: 0x6e037c20, + 0x39760: 0x6e037e20, 0x39761: 0x6e038020, 0x39762: 0x6e038220, 0x39763: 0x6e038420, + 0x39764: 0x6e038620, 0x39765: 0x6e038820, 0x39766: 0x6e038a20, 0x39767: 0x6e038c20, + 0x39768: 0x6e038e20, 0x39769: 0x6e039020, 0x3976a: 0x6e14d420, 0x3976b: 0x6e14d620, + 0x3976c: 0x6e14d820, 0x3976d: 0x6e14da20, 0x3976e: 0x6e14dc20, 0x3976f: 0x6e14de20, + 0x39770: 0x6e14e020, 0x39771: 0x6e14e220, 0x39772: 0x6e14e420, 0x39773: 0x6e14e620, + 0x39774: 0x6e14e820, 0x39775: 0x6e14ea20, 0x39776: 0x6e14ec20, 0x39777: 0x6e14ee20, + 0x39778: 0x6e14f020, 0x39779: 0x6e14f220, 0x3977a: 0x6e14f420, 0x3977b: 0x6e14f620, + 0x3977c: 0x6e14f820, 0x3977d: 0x6e14fa20, 0x3977e: 0x6e14fc20, 0x3977f: 0x6e14fe20, + // Block 0xe5e, offset 0x39780 + 0x39780: 0x6e150020, 0x39781: 0x6e228020, 0x39782: 0x6e228220, 0x39783: 0x6e228420, + 0x39784: 0x6e228620, 0x39785: 0x6e228820, 0x39786: 0x6e228a20, 0x39787: 0x6e228c20, + 0x39788: 0x6e228e20, 0x39789: 0x6e229020, 0x3978a: 0x6e229220, 0x3978b: 0x6e229420, + 0x3978c: 0x6e229620, 0x3978d: 0x6e229820, 0x3978e: 0x6e229a20, 0x3978f: 0x6e229c20, + 0x39790: 0x6e229e20, 0x39791: 0x6e22a020, 0x39792: 0x6e22a220, 0x39793: 0x6e22a420, + 0x39794: 0x6e22a620, 0x39795: 0x6e22a820, 0x39796: 0x6e2cca20, 0x39797: 0x6e2ccc20, + 0x39798: 0x6e2cce20, 0x39799: 0x6e2cd020, 0x3979a: 0x6e2cd220, 0x3979b: 0x6e2cd420, + 0x3979c: 0x6e2cd620, 0x3979d: 0x6e2cd820, 0x3979e: 0x6e2cda20, 0x3979f: 0x6e2cdc20, + 0x397a0: 0x6e2cde20, 0x397a1: 0x6e2ce020, 0x397a2: 0x6e2ce220, 0x397a3: 0x6e2ce420, + 0x397a4: 0x6e34ca20, 0x397a5: 0x6e34cc20, 0x397a6: 0x6e34ce20, 0x397a7: 0x6e34d020, + 0x397a8: 0x6e34d220, 0x397a9: 0x6e34d420, 0x397aa: 0x6e34d620, 0x397ab: 0x6e34d820, + 0x397ac: 0x6e34da20, 0x397ad: 0x6e34dc20, 0x397ae: 0x6e3a8620, 0x397af: 0x6e3a8820, + 0x397b0: 0x6e3a8a20, 0x397b1: 0x6e3a8c20, 0x397b2: 0x6e3a8e20, 0x397b3: 0x6e3a9020, + 0x397b4: 0x6e3a9220, 0x397b5: 0x6e3a9420, 0x397b6: 0x6e3a9620, 0x397b7: 0x6e3a9820, + 0x397b8: 0x6e3a9a20, 0x397b9: 0x6e3a9c20, 0x397ba: 0x6e3a9e20, 0x397bb: 0x6e3e5020, + 0x397bc: 0x6e3e5220, 0x397bd: 0x6e3e5420, 0x397be: 0x6e3e5620, 0x397bf: 0x6e3e5820, + // Block 0xe5f, offset 0x397c0 + 0x397c0: 0x6e3e5a20, 0x397c1: 0x6e412620, 0x397c2: 0x6e412820, 0x397c3: 0x6e412a20, + 0x397c4: 0x6e432620, 0x397c5: 0x6e432820, 0x397c6: 0x6e432a20, 0x397c7: 0x6e432c20, + 0x397c8: 0x6e448820, 0x397c9: 0x6e448a20, 0x397ca: 0x6e448c20, 0x397cb: 0x6e455e20, + 0x397cc: 0x6e456020, 0x397cd: 0x6e45dc20, 0x397ce: 0x6e470a20, 0x397cf: 0x6c270820, + 0x397d0: 0x6c270a20, 0x397d1: 0x6c270c20, 0x397d2: 0x6c612a20, 0x397d3: 0x6c878220, + 0x397d4: 0x6c878420, 0x397d5: 0x6c878620, 0x397d6: 0x6c878820, 0x397d7: 0x6c878a20, + 0x397d8: 0x6cb2b020, 0x397d9: 0x6cb2b220, 0x397da: 0x6cb2b420, 0x397db: 0x6cb2b620, + 0x397dc: 0x6cb2b820, 0x397dd: 0x6cb2ba20, 0x397de: 0x6cb2bc20, 0x397df: 0x6cb2be20, + 0x397e0: 0x6cb2c020, 0x397e1: 0x6cb2c220, 0x397e2: 0x6cb2c420, 0x397e3: 0x6cb2c620, + 0x397e4: 0x6cb2c820, 0x397e5: 0x6cb2ca20, 0x397e6: 0x6cb2cc20, 0x397e7: 0x6cb2ce20, + 0x397e8: 0x6cb2d020, 0x397e9: 0x6ce24620, 0x397ea: 0x6ce24820, 0x397eb: 0x6ce24a20, + 0x397ec: 0x6ce24c20, 0x397ed: 0x6ce24e20, 0x397ee: 0x6ce25020, 0x397ef: 0x6ce25220, + 0x397f0: 0x6ce25420, 0x397f1: 0x6ce25620, 0x397f2: 0x6ce25820, 0x397f3: 0x6ce25a20, + 0x397f4: 0x6ce25c20, 0x397f5: 0x6ce25e20, 0x397f6: 0x6ce26020, 0x397f7: 0x6ce26220, + 0x397f8: 0x6d10bc20, 0x397f9: 0x6d10be20, 0x397fa: 0x6d10c020, 0x397fb: 0x6d10c220, + 0x397fc: 0x6d10c420, 0x397fd: 0x6d10c620, 0x397fe: 0x6d10c820, 0x397ff: 0x6d10ca20, + // Block 0xe60, offset 0x39800 + 0x39800: 0x6d10cc20, 0x39801: 0x6d10ce20, 0x39802: 0x6d10d020, 0x39803: 0x6d10d220, + 0x39804: 0x6d10d420, 0x39805: 0x6d10d620, 0x39806: 0x6d10d820, 0x39807: 0x6d10da20, + 0x39808: 0x6d3ee820, 0x39809: 0x6d3eea20, 0x3980a: 0x6d3eec20, 0x3980b: 0x6d3eee20, + 0x3980c: 0x6d3ef020, 0x3980d: 0x6d3ef220, 0x3980e: 0x6d3ef420, 0x3980f: 0x6d3ef620, + 0x39810: 0x6d3ef820, 0x39811: 0x6d3efa20, 0x39812: 0x6d3efc20, 0x39813: 0x6d3efe20, + 0x39814: 0x6d6bac20, 0x39815: 0x6d6bae20, 0x39816: 0x6d6bb020, 0x39817: 0x6d6bb220, + 0x39818: 0x6d6bb420, 0x39819: 0x6d6bb620, 0x3981a: 0x6d6bb820, 0x3981b: 0x6d6bba20, + 0x3981c: 0x6d6bbc20, 0x3981d: 0x6d6bbe20, 0x3981e: 0x6d6bc020, 0x3981f: 0x6d6bc220, + 0x39820: 0x6d6bc420, 0x39821: 0x6d6bc620, 0x39822: 0x6d94e820, 0x39823: 0x6d94ea20, + 0x39824: 0x6d94ec20, 0x39825: 0x6d94ee20, 0x39826: 0x6db81a20, 0x39827: 0x6d94f020, + 0x39828: 0x6d94f220, 0x39829: 0x6d94f420, 0x3982a: 0x6d94f620, 0x3982b: 0x6d94f820, + 0x3982c: 0x6d94fa20, 0x3982d: 0x6d94fc20, 0x3982e: 0x6db81c20, 0x3982f: 0x6db81e20, + 0x39830: 0x6db82020, 0x39831: 0x6db82220, 0x39832: 0x6db82420, 0x39833: 0x6db82620, + 0x39834: 0x6db82820, 0x39835: 0x6db82a20, 0x39836: 0x6db82c20, 0x39837: 0x6db82e20, + 0x39838: 0x6db83020, 0x39839: 0x6dd6b220, 0x3983a: 0x6dd6b420, 0x3983b: 0x6dd6b620, + 0x3983c: 0x6dd6b820, 0x3983d: 0x6dd6ba20, 0x3983e: 0x6dd6bc20, 0x3983f: 0x6def7420, + // Block 0xe61, offset 0x39840 + 0x39840: 0x6def7620, 0x39841: 0x6def7820, 0x39842: 0x6def7a20, 0x39843: 0x6def7c20, + 0x39844: 0x6def7e20, 0x39845: 0x6def8020, 0x39846: 0x6def8220, 0x39847: 0x6def8420, + 0x39848: 0x6def8620, 0x39849: 0x6def8820, 0x3984a: 0x6def8a20, 0x3984b: 0x6def8c20, + 0x3984c: 0x6def8e20, 0x3984d: 0x6e039e20, 0x3984e: 0x6e03a020, 0x3984f: 0x6e03a220, + 0x39850: 0x6e03a420, 0x39851: 0x6e03a620, 0x39852: 0x6e03a820, 0x39853: 0x6e150820, + 0x39854: 0x6e150a20, 0x39855: 0x6e150c20, 0x39856: 0x6e150e20, 0x39857: 0x6e151020, + 0x39858: 0x6e22ae20, 0x39859: 0x6e22b020, 0x3985a: 0x6e22b220, 0x3985b: 0x6e2cea20, + 0x3985c: 0x6e2cec20, 0x3985d: 0x6e3aa020, 0x3985e: 0x6e3aa220, 0x3985f: 0x6e3e5c20, + 0x39860: 0x6c613620, 0x39861: 0x6c613820, 0x39862: 0x6c613a20, 0x39863: 0x6c613c20, + 0x39864: 0x6c613e20, 0x39865: 0x6c614020, 0x39866: 0x6c614220, 0x39867: 0x6c879e20, + 0x39868: 0x6c87a020, 0x39869: 0x6c87a220, 0x3986a: 0x6c87a420, 0x3986b: 0x6c87a620, + 0x3986c: 0x6c87a820, 0x3986d: 0x6c87aa20, 0x3986e: 0x6c87ac20, 0x3986f: 0x6c87ae20, + 0x39870: 0x6c87b020, 0x39871: 0x6c87b220, 0x39872: 0x6c87b420, 0x39873: 0x6cb30020, + 0x39874: 0x6cb30220, 0x39875: 0x6cb30420, 0x39876: 0x6cb30620, 0x39877: 0x6cb30820, + 0x39878: 0x6cb30a20, 0x39879: 0x6cb30c20, 0x3987a: 0x6cb30e20, 0x3987b: 0x6cb31020, + 0x3987c: 0x6cb31220, 0x3987d: 0x6cb31420, 0x3987e: 0x6cb31620, 0x3987f: 0x6cb31820, + // Block 0xe62, offset 0x39880 + 0x39880: 0x6cb31a20, 0x39881: 0x6cb31c20, 0x39882: 0x6cb31e20, 0x39883: 0x6cb32020, + 0x39884: 0x6cb32220, 0x39885: 0x6cb32420, 0x39886: 0x6cb32620, 0x39887: 0x6cb32820, + 0x39888: 0x6cb32a20, 0x39889: 0x6cb32c20, 0x3988a: 0x6cb32e20, 0x3988b: 0x6cb33020, + 0x3988c: 0x6cb33220, 0x3988d: 0x6cb33420, 0x3988e: 0x6ce2a020, 0x3988f: 0x6ce2a220, + 0x39890: 0x6ce2a420, 0x39891: 0x6ce2a620, 0x39892: 0x6ce2a820, 0x39893: 0x6ce2aa20, + 0x39894: 0x6ce2ac20, 0x39895: 0x6ce2ae20, 0x39896: 0x6ce2b020, 0x39897: 0x6ce2b220, + 0x39898: 0x6ce2b420, 0x39899: 0x6ce2b620, 0x3989a: 0x6ce2b820, 0x3989b: 0x6ce2ba20, + 0x3989c: 0x6ce2bc20, 0x3989d: 0x6ce2be20, 0x3989e: 0x6ce2c020, 0x3989f: 0x6ce2c220, + 0x398a0: 0x6ce2c420, 0x398a1: 0x6ce2c620, 0x398a2: 0x6ce2c820, 0x398a3: 0x6ce2ca20, + 0x398a4: 0x6ce2cc20, 0x398a5: 0x6ce2ce20, 0x398a6: 0x6ce2d020, 0x398a7: 0x6ce2d220, + 0x398a8: 0x6d110a20, 0x398a9: 0x6d110c20, 0x398aa: 0x6d110e20, 0x398ab: 0x6d111020, + 0x398ac: 0x6d111220, 0x398ad: 0x6d111420, 0x398ae: 0x6d111620, 0x398af: 0x6d111820, + 0x398b0: 0x6d111a20, 0x398b1: 0x6d111c20, 0x398b2: 0x6d111e20, 0x398b3: 0x6d112020, + 0x398b4: 0x6d112220, 0x398b5: 0x6d112420, 0x398b6: 0x6d112620, 0x398b7: 0x6d112820, + 0x398b8: 0x6d112a20, 0x398b9: 0x6d112c20, 0x398ba: 0x6d112e20, 0x398bb: 0x6d113020, + 0x398bc: 0x6d113220, 0x398bd: 0x6d113420, 0x398be: 0x6d113620, 0x398bf: 0x6d113820, + // Block 0xe63, offset 0x398c0 + 0x398c0: 0x6d113a20, 0x398c1: 0x6d113c20, 0x398c2: 0x6d3f1c20, 0x398c3: 0x6d3f1e20, + 0x398c4: 0x6d3f2020, 0x398c5: 0x6d3f2220, 0x398c6: 0x6d3f2420, 0x398c7: 0x6d3f2620, + 0x398c8: 0x6d3f2820, 0x398c9: 0x6d3f2a20, 0x398ca: 0x6d3f2c20, 0x398cb: 0x6d3f2e20, + 0x398cc: 0x6d3f3020, 0x398cd: 0x6d3f3220, 0x398ce: 0x6d3f3420, 0x398cf: 0x6d3f3620, + 0x398d0: 0x6d3f3820, 0x398d1: 0x6d3f3a20, 0x398d2: 0x6d3f3c20, 0x398d3: 0x6d3f3e20, + 0x398d4: 0x6d3f4020, 0x398d5: 0x6d3f4220, 0x398d6: 0x6d3f4420, 0x398d7: 0x6d3f4620, + 0x398d8: 0x6d3f4820, 0x398d9: 0x6d3f4a20, 0x398da: 0x6d3f4c20, 0x398db: 0x6d3f4e20, + 0x398dc: 0x6d3f5020, 0x398dd: 0x6d3f5220, 0x398de: 0x6d3f5420, 0x398df: 0x6d3f5620, + 0x398e0: 0x6d6bfe20, 0x398e1: 0x6d6c0020, 0x398e2: 0x6d6c0220, 0x398e3: 0x6d6c0420, + 0x398e4: 0x6d6c0620, 0x398e5: 0x6d6c0820, 0x398e6: 0x6d6c0a20, 0x398e7: 0x6d6c0c20, + 0x398e8: 0x6d6c0e20, 0x398e9: 0x6d6c1020, 0x398ea: 0x6d6c1220, 0x398eb: 0x6d6c1420, + 0x398ec: 0x6d6c1620, 0x398ed: 0x6d6c1820, 0x398ee: 0x6d6c1a20, 0x398ef: 0x6d6c1c20, + 0x398f0: 0x6d6c1e20, 0x398f1: 0x6d6c2020, 0x398f2: 0x6d6c2220, 0x398f3: 0x6d6c2420, + 0x398f4: 0x6d6c2620, 0x398f5: 0x6d6c2820, 0x398f6: 0x6d6c2a20, 0x398f7: 0x6d6c2c20, + 0x398f8: 0x6d6c2e20, 0x398f9: 0x6d6c3020, 0x398fa: 0x6d6c3220, 0x398fb: 0x6d6c3420, + 0x398fc: 0x6d6c3620, 0x398fd: 0x6d6c3820, 0x398fe: 0x6d6c3a20, 0x398ff: 0x6d6c3c20, + // Block 0xe64, offset 0x39900 + 0x39900: 0x6d6c3e20, 0x39901: 0x6d6c4020, 0x39902: 0x6d6c4220, 0x39903: 0x6d6c4420, + 0x39904: 0x6d6c4620, 0x39905: 0x6d6c4820, 0x39906: 0x6d6c4a20, 0x39907: 0x6d952820, + 0x39908: 0x6d952a20, 0x39909: 0x6d952c20, 0x3990a: 0x6d952e20, 0x3990b: 0x6d953020, + 0x3990c: 0x6d953220, 0x3990d: 0x6d953420, 0x3990e: 0x6d953620, 0x3990f: 0x6d953820, + 0x39910: 0x6d953a20, 0x39911: 0x6d953c20, 0x39912: 0x6d953e20, 0x39913: 0x6d954020, + 0x39914: 0x6d954220, 0x39915: 0x6d954420, 0x39916: 0x6d954620, 0x39917: 0x6d954820, + 0x39918: 0x6d954a20, 0x39919: 0x6d954c20, 0x3991a: 0x6d954e20, 0x3991b: 0x6d955020, + 0x3991c: 0x6d955220, 0x3991d: 0x6d955420, 0x3991e: 0x6d955620, 0x3991f: 0x6d955820, + 0x39920: 0x6d955a20, 0x39921: 0x6d955c20, 0x39922: 0x6d955e20, 0x39923: 0x6d956020, + 0x39924: 0x6d956220, 0x39925: 0x6d956420, 0x39926: 0x6d956620, 0x39927: 0x6d956820, + 0x39928: 0x6d956a20, 0x39929: 0x6db85420, 0x3992a: 0x6db85620, 0x3992b: 0x6db85820, + 0x3992c: 0x6db85a20, 0x3992d: 0x6db85c20, 0x3992e: 0x6db85e20, 0x3992f: 0x6db86020, + 0x39930: 0x6db86220, 0x39931: 0x6db86420, 0x39932: 0x6db86620, 0x39933: 0x6db86820, + 0x39934: 0x6db86a20, 0x39935: 0x6db86c20, 0x39936: 0x6db86e20, 0x39937: 0x6db87020, + 0x39938: 0x6db87220, 0x39939: 0x6db87420, 0x3993a: 0x6db87620, 0x3993b: 0x6db87820, + 0x3993c: 0x6db87a20, 0x3993d: 0x6db87c20, 0x3993e: 0x6db87e20, 0x3993f: 0x6db88020, + // Block 0xe65, offset 0x39940 + 0x39940: 0x6db88220, 0x39941: 0x6db88420, 0x39942: 0x6db88620, 0x39943: 0x6db88820, + 0x39944: 0x6db88a20, 0x39945: 0x6db88c20, 0x39946: 0x6db88e20, 0x39947: 0x6db89020, + 0x39948: 0x6db89220, 0x39949: 0x6db89420, 0x3994a: 0x6dd6de20, 0x3994b: 0x6dd6e020, + 0x3994c: 0x6dd6e220, 0x3994d: 0x6dd6e420, 0x3994e: 0x6dd6e620, 0x3994f: 0x6dd6e820, + 0x39950: 0x6dd6ea20, 0x39951: 0x6dd6ec20, 0x39952: 0x6dd6ee20, 0x39953: 0x6dd6f020, + 0x39954: 0x6dd6f220, 0x39955: 0x6dd6f420, 0x39956: 0x6dd6f620, 0x39957: 0x6dd6f820, + 0x39958: 0x6dd6fa20, 0x39959: 0x6dd6fc20, 0x3995a: 0x6dd6fe20, 0x3995b: 0x6dd70020, + 0x3995c: 0x6dd70220, 0x3995d: 0x6dd70420, 0x3995e: 0x6dd70620, 0x3995f: 0x6dd70820, + 0x39960: 0x6dd70a20, 0x39961: 0x6dd70c20, 0x39962: 0x6dd70e20, 0x39963: 0x6dd71020, + 0x39964: 0x6defaa20, 0x39965: 0x6defac20, 0x39966: 0x6defae20, 0x39967: 0x6defb020, + 0x39968: 0x6defb220, 0x39969: 0x6defb420, 0x3996a: 0x6defb620, 0x3996b: 0x6defb820, + 0x3996c: 0x6defba20, 0x3996d: 0x6defbc20, 0x3996e: 0x6defbe20, 0x3996f: 0x6defc020, + 0x39970: 0x6defc220, 0x39971: 0x6defc420, 0x39972: 0x6e03ba20, 0x39973: 0x6e03bc20, + 0x39974: 0x6e03be20, 0x39975: 0x6e03c020, 0x39976: 0x6e03c220, 0x39977: 0x6e03c420, + 0x39978: 0x6e03c620, 0x39979: 0x6e03c820, 0x3997a: 0x6e03ca20, 0x3997b: 0x6e03cc20, + 0x3997c: 0x6e03ce20, 0x3997d: 0x6e03d020, 0x3997e: 0x6e03d220, 0x3997f: 0x6e03d420, + // Block 0xe66, offset 0x39980 + 0x39980: 0x6e03d620, 0x39981: 0x6e03d820, 0x39982: 0x6e03da20, 0x39983: 0x6e03dc20, + 0x39984: 0x6e03de20, 0x39985: 0x6e03e020, 0x39986: 0x6e03e220, 0x39987: 0x6e03e420, + 0x39988: 0x6e152220, 0x39989: 0x6e152420, 0x3998a: 0x6e152620, 0x3998b: 0x6e152820, + 0x3998c: 0x6e152a20, 0x3998d: 0x6e152c20, 0x3998e: 0x6e152e20, 0x3998f: 0x6e153020, + 0x39990: 0x6e153220, 0x39991: 0x6e22be20, 0x39992: 0x6e22c020, 0x39993: 0x6e22c220, + 0x39994: 0x6e22c420, 0x39995: 0x6e22c620, 0x39996: 0x6e22c820, 0x39997: 0x6e22ca20, + 0x39998: 0x6e22cc20, 0x39999: 0x6e22ce20, 0x3999a: 0x6e22d020, 0x3999b: 0x6e22d220, + 0x3999c: 0x6e22d420, 0x3999d: 0x6e22d620, 0x3999e: 0x6e2cf220, 0x3999f: 0x6e2cf420, + 0x399a0: 0x6e2cf620, 0x399a1: 0x6e2cf820, 0x399a2: 0x6e2cfa20, 0x399a3: 0x6e2cfc20, + 0x399a4: 0x6e2cfe20, 0x399a5: 0x6e2d0020, 0x399a6: 0x6e2d0220, 0x399a7: 0x6e2d0420, + 0x399a8: 0x6e2d0620, 0x399a9: 0x6e34e220, 0x399aa: 0x6e34e420, 0x399ab: 0x6e34e620, + 0x399ac: 0x6e34e820, 0x399ad: 0x6e34ea20, 0x399ae: 0x6e34ec20, 0x399af: 0x6e34ee20, + 0x399b0: 0x6e34f020, 0x399b1: 0x6e34f220, 0x399b2: 0x6e34f420, 0x399b3: 0x6e3aa420, + 0x399b4: 0x6e3aa620, 0x399b5: 0x6e3e6020, 0x399b6: 0x6e3e6220, 0x399b7: 0x6e3e6420, + 0x399b8: 0x6e3e6620, 0x399b9: 0x6e413220, 0x399ba: 0x6e432e20, 0x399bb: 0x6e413420, + 0x399bc: 0x6e433020, 0x399bd: 0x6e3e6820, 0x399be: 0x6e413620, 0x399bf: 0x6e433220, + // Block 0xe67, offset 0x399c0 + 0x399c0: 0x6e433420, 0x399c1: 0x6e448e20, 0x399c2: 0x6e456220, 0x399c3: 0x6e45e020, + 0x399c4: 0x6e471420, 0x399c5: 0x6c40f020, 0x399c6: 0x6c40f220, 0x399c7: 0x6c615c20, + 0x399c8: 0x6c87ca20, 0x399c9: 0x6d957420, 0x399ca: 0x6e03ea20, 0x399cb: 0x6c271e20, + 0x399cc: 0x6c40f620, 0x399cd: 0x6c87d220, 0x399ce: 0x6c87d420, 0x399cf: 0x6cb34220, + 0x399d0: 0x6cb34420, 0x399d1: 0x6cb34620, 0x399d2: 0x6ce2f420, 0x399d3: 0x6ce2f620, + 0x399d4: 0x6d115220, 0x399d5: 0x6d115420, 0x399d6: 0x6d115620, 0x399d7: 0x6d115820, + 0x399d8: 0x6d3f6e20, 0x399d9: 0x6d3f7020, 0x399da: 0x6d3f7220, 0x399db: 0x6d3f7420, + 0x399dc: 0x6d6c5820, 0x399dd: 0x6d6c5a20, 0x399de: 0x6d6c5c20, 0x399df: 0x6d6c5e20, + 0x399e0: 0x6d958420, 0x399e1: 0x6d958620, 0x399e2: 0x6d958820, 0x399e3: 0x6d958a20, + 0x399e4: 0x6d958c20, 0x399e5: 0x6d958e20, 0x399e6: 0x6d959020, 0x399e7: 0x6d959220, + 0x399e8: 0x6db8a020, 0x399e9: 0x6db8a220, 0x399ea: 0x6db8a420, 0x399eb: 0x6db8a620, + 0x399ec: 0x6db8a820, 0x399ed: 0x6db8aa20, 0x399ee: 0x6db8ac20, 0x399ef: 0x6db8ae20, + 0x399f0: 0x6dd71820, 0x399f1: 0x6dd71a20, 0x399f2: 0x6dd71c20, 0x399f3: 0x6dc60820, + 0x399f4: 0x6dcb1a20, 0x399f5: 0x6defcc20, 0x399f6: 0x6defce20, 0x399f7: 0x6defd020, + 0x399f8: 0x6defd220, 0x399f9: 0x6defd420, 0x399fa: 0x6e03f020, 0x399fb: 0x6e03f220, + 0x399fc: 0x6e03f420, 0x399fd: 0x6e153820, 0x399fe: 0x6e22d820, 0x399ff: 0x6e22da20, + // Block 0xe68, offset 0x39a00 + 0x39a00: 0x6e34f620, 0x39a01: 0x6e449020, 0x39a02: 0x6e456420, 0x39a03: 0x6c272220, + 0x39a04: 0x6c272420, 0x39a05: 0x6d116220, 0x39a06: 0x6d116420, 0x39a07: 0x6d116620, + 0x39a08: 0x6d6c6420, 0x39a09: 0x6d959420, 0x39a0a: 0x6defd820, 0x39a0b: 0x6e153a20, + 0x39a0c: 0x6e22dc20, 0x39a0d: 0x6c0a8220, 0x39a0e: 0x6c0a8420, 0x39a0f: 0x6c0a8620, + 0x39a10: 0x6c0a8820, 0x39a11: 0x6c151620, 0x39a12: 0x6c151820, 0x39a13: 0x6c151a20, + 0x39a14: 0x6c151c20, 0x39a15: 0x6c151e20, 0x39a16: 0x6c152020, 0x39a17: 0x6c152220, + 0x39a18: 0x6c152420, 0x39a19: 0x6c152620, 0x39a1a: 0x6c152820, 0x39a1b: 0x6c152a20, + 0x39a1c: 0x6c152c20, 0x39a1d: 0x6c152e20, 0x39a1e: 0x6c153020, 0x39a1f: 0x6c153220, + 0x39a20: 0x6c153420, 0x39a21: 0x6c153620, 0x39a22: 0x6c274620, 0x39a23: 0x6c274820, + 0x39a24: 0x6c274a20, 0x39a25: 0x6c274c20, 0x39a26: 0x6c274e20, 0x39a27: 0x6c275020, + 0x39a28: 0x6c275220, 0x39a29: 0x6c275420, 0x39a2a: 0x6c275620, 0x39a2b: 0x6c275820, + 0x39a2c: 0x6c275a20, 0x39a2d: 0x6c275c20, 0x39a2e: 0x6c275e20, 0x39a2f: 0x6c276020, + 0x39a30: 0x6c276220, 0x39a31: 0x6c276420, 0x39a32: 0x6c276620, 0x39a33: 0x6c276820, + 0x39a34: 0x6c276a20, 0x39a35: 0x6c276c20, 0x39a36: 0x6c276e20, 0x39a37: 0x6c277020, + 0x39a38: 0x6c277220, 0x39a39: 0x6c277420, 0x39a3a: 0x6c277620, 0x39a3b: 0x6c277820, + 0x39a3c: 0x6c277a20, 0x39a3d: 0x6c277c20, 0x39a3e: 0x6c277e20, 0x39a3f: 0x6c278020, + // Block 0xe69, offset 0x39a40 + 0x39a40: 0x6c278220, 0x39a41: 0x6c278420, 0x39a42: 0x6c413020, 0x39a43: 0x6c413220, + 0x39a44: 0x6c413420, 0x39a45: 0x6c413620, 0x39a46: 0x6c413820, 0x39a47: 0x6c413a20, + 0x39a48: 0x6c413c20, 0x39a49: 0x6c413e20, 0x39a4a: 0x6c414020, 0x39a4b: 0x6c414220, + 0x39a4c: 0x6c414420, 0x39a4d: 0x6c414620, 0x39a4e: 0x6c414820, 0x39a4f: 0x6c414a20, + 0x39a50: 0x6c414c20, 0x39a51: 0x6c414e20, 0x39a52: 0x6c415020, 0x39a53: 0x6c415220, + 0x39a54: 0x6c415420, 0x39a55: 0x6c415620, 0x39a56: 0x6c415820, 0x39a57: 0x6c415a20, + 0x39a58: 0x6c415c20, 0x39a59: 0x6c415e20, 0x39a5a: 0x6c416020, 0x39a5b: 0x6c416220, + 0x39a5c: 0x6c416420, 0x39a5d: 0x6c416620, 0x39a5e: 0x6c416820, 0x39a5f: 0x6c416a20, + 0x39a60: 0x6c416c20, 0x39a61: 0x6c416e20, 0x39a62: 0x6c417020, 0x39a63: 0x6c417220, + 0x39a64: 0x6c417420, 0x39a65: 0x6c619020, 0x39a66: 0x6c619220, 0x39a67: 0x6c619420, + 0x39a68: 0x6c619620, 0x39a69: 0x6c619820, 0x39a6a: 0x6c619a20, 0x39a6b: 0x6c619c20, + 0x39a6c: 0x6c619e20, 0x39a6d: 0x6c61a020, 0x39a6e: 0x6c61a220, 0x39a6f: 0x6c61a420, + 0x39a70: 0x6c61a620, 0x39a71: 0x6c61a820, 0x39a72: 0x6c61aa20, 0x39a73: 0x6c61ac20, + 0x39a74: 0x6c61ae20, 0x39a75: 0x6c61b020, 0x39a76: 0x6c61b220, 0x39a77: 0x6c61b420, + 0x39a78: 0x6c61b620, 0x39a79: 0x6c61b820, 0x39a7a: 0x6c61ba20, 0x39a7b: 0x6c61bc20, + 0x39a7c: 0x6c61be20, 0x39a7d: 0x6c61c020, 0x39a7e: 0x6c61c220, 0x39a7f: 0x6c61c420, + // Block 0xe6a, offset 0x39a80 + 0x39a80: 0x6c61c620, 0x39a81: 0x6c61c820, 0x39a82: 0x6c61ca20, 0x39a83: 0x6c61cc20, + 0x39a84: 0x6c61ce20, 0x39a85: 0x6c881420, 0x39a86: 0x6c881620, 0x39a87: 0x6c881820, + 0x39a88: 0x6c881a20, 0x39a89: 0x6c881c20, 0x39a8a: 0x6c881e20, 0x39a8b: 0x6c882020, + 0x39a8c: 0x6c882220, 0x39a8d: 0x6c882420, 0x39a8e: 0x6c882620, 0x39a8f: 0x6c882820, + 0x39a90: 0x6c882a20, 0x39a91: 0x6c882c20, 0x39a92: 0x6c882e20, 0x39a93: 0x6c883020, + 0x39a94: 0x6c883220, 0x39a95: 0x6c883420, 0x39a96: 0x6c883620, 0x39a97: 0x6c883820, + 0x39a98: 0x6c883a20, 0x39a99: 0x6c883c20, 0x39a9a: 0x6c883e20, 0x39a9b: 0x6c884020, + 0x39a9c: 0x6c884220, 0x39a9d: 0x6c884420, 0x39a9e: 0x6c884620, 0x39a9f: 0x6c884820, + 0x39aa0: 0x6c884a20, 0x39aa1: 0x6c884c20, 0x39aa2: 0x6c884e20, 0x39aa3: 0x6c885020, + 0x39aa4: 0x6c885220, 0x39aa5: 0x6c885420, 0x39aa6: 0x6c885620, 0x39aa7: 0x6c885820, + 0x39aa8: 0x6c885a20, 0x39aa9: 0x6c885c20, 0x39aaa: 0x6c885e20, 0x39aab: 0x6cb38820, + 0x39aac: 0x6cb38a20, 0x39aad: 0x6cb38c20, 0x39aae: 0x6cb38e20, 0x39aaf: 0x6cb39020, + 0x39ab0: 0x6cb39220, 0x39ab1: 0x6cb39420, 0x39ab2: 0x6cb39620, 0x39ab3: 0x6cb39820, + 0x39ab4: 0x6cb39a20, 0x39ab5: 0x6cb39c20, 0x39ab6: 0x6cb39e20, 0x39ab7: 0x6cb3a020, + 0x39ab8: 0x6cb3a220, 0x39ab9: 0x6cb3a420, 0x39aba: 0x6cb3a620, 0x39abb: 0x6cb3a820, + 0x39abc: 0x6cb3aa20, 0x39abd: 0x6cb3ac20, 0x39abe: 0x6cb3ae20, 0x39abf: 0x6cb3b020, + // Block 0xe6b, offset 0x39ac0 + 0x39ac0: 0x6cb3b220, 0x39ac1: 0x6cb3b420, 0x39ac2: 0x6cb3b620, 0x39ac3: 0x6cb3b820, + 0x39ac4: 0x6cb3ba20, 0x39ac5: 0x6cb3bc20, 0x39ac6: 0x6cb3be20, 0x39ac7: 0x6cb3c020, + 0x39ac8: 0x6cb3c220, 0x39ac9: 0x6cb3c420, 0x39aca: 0x6cb3c620, 0x39acb: 0x6cb3c820, + 0x39acc: 0x6cb3ca20, 0x39acd: 0x6cb3cc20, 0x39ace: 0x6ce32c20, 0x39acf: 0x6cb3ce20, + 0x39ad0: 0x6cb3d020, 0x39ad1: 0x6cb3d220, 0x39ad2: 0x6cb3d420, 0x39ad3: 0x6cb3d620, + 0x39ad4: 0x6cb3d820, 0x39ad5: 0x6cb3da20, 0x39ad6: 0x6cb3dc20, 0x39ad7: 0x6cb3de20, + 0x39ad8: 0x6cb3e020, 0x39ad9: 0x6cb3e220, 0x39ada: 0x6cb3e420, 0x39adb: 0x6cb3e620, + 0x39adc: 0x6cb3e820, 0x39add: 0x6ce32e20, 0x39ade: 0x6ce33020, 0x39adf: 0x6ce33220, + 0x39ae0: 0x6cb3ea20, 0x39ae1: 0x6ce33420, 0x39ae2: 0x6ce33620, 0x39ae3: 0x6ce33820, + 0x39ae4: 0x6ce33a20, 0x39ae5: 0x6ce33c20, 0x39ae6: 0x6ce33e20, 0x39ae7: 0x6ce34020, + 0x39ae8: 0x6ce34220, 0x39ae9: 0x6ce34420, 0x39aea: 0x6ce34620, 0x39aeb: 0x6ce34820, + 0x39aec: 0x6ce34a20, 0x39aed: 0x6ce34c20, 0x39aee: 0x6ce34e20, 0x39aef: 0x6ce35020, + 0x39af0: 0x6ce35220, 0x39af1: 0x6ce35420, 0x39af2: 0x6ce35620, 0x39af3: 0x6ce35820, + 0x39af4: 0x6ce35a20, 0x39af5: 0x6ce35c20, 0x39af6: 0x6ce35e20, 0x39af7: 0x6ce36020, + 0x39af8: 0x6ce36220, 0x39af9: 0x6ce36420, 0x39afa: 0x6ce36620, 0x39afb: 0x6ce36820, + 0x39afc: 0x6ce36a20, 0x39afd: 0x6ce36c20, 0x39afe: 0x6ce36e20, 0x39aff: 0x6ce37020, + // Block 0xe6c, offset 0x39b00 + 0x39b00: 0x6ce37220, 0x39b01: 0x6ce37420, 0x39b02: 0x6ce37620, 0x39b03: 0x6ce37820, + 0x39b04: 0x6ce37a20, 0x39b05: 0x6ce37c20, 0x39b06: 0x6ce37e20, 0x39b07: 0x6ce38020, + 0x39b08: 0x6ce38220, 0x39b09: 0x6ce38420, 0x39b0a: 0x6ce38620, 0x39b0b: 0x6ce38820, + 0x39b0c: 0x6ce38a20, 0x39b0d: 0x6ce38c20, 0x39b0e: 0x6ce38e20, 0x39b0f: 0x6ce39020, + 0x39b10: 0x6ce39220, 0x39b11: 0x6ce39420, 0x39b12: 0x6ce39620, 0x39b13: 0x6ce39820, + 0x39b14: 0x6ce39a20, 0x39b15: 0x6ce39c20, 0x39b16: 0x6ce39e20, 0x39b17: 0x6ce3a020, + 0x39b18: 0x6ce3a220, 0x39b19: 0x6ce3a420, 0x39b1a: 0x6ce3a620, 0x39b1b: 0x6ce3a820, + 0x39b1c: 0x6ce3aa20, 0x39b1d: 0x6d11a220, 0x39b1e: 0x6d11a420, 0x39b1f: 0x6d11a620, + 0x39b20: 0x6d11a820, 0x39b21: 0x6d11aa20, 0x39b22: 0x6d11ac20, 0x39b23: 0x6d11ae20, + 0x39b24: 0x6d11b020, 0x39b25: 0x6d11b220, 0x39b26: 0x6d11b420, 0x39b27: 0x6d11b620, + 0x39b28: 0x6d11b820, 0x39b29: 0x6d11ba20, 0x39b2a: 0x6d11bc20, 0x39b2b: 0x6d11be20, + 0x39b2c: 0x6d11c020, 0x39b2d: 0x6d11c220, 0x39b2e: 0x6d11c420, 0x39b2f: 0x6d11c620, + 0x39b30: 0x6d11c820, 0x39b31: 0x6d11ca20, 0x39b32: 0x6d11cc20, 0x39b33: 0x6d11ce20, + 0x39b34: 0x6d11d020, 0x39b35: 0x6d11d220, 0x39b36: 0x6d11d420, 0x39b37: 0x6d11d620, + 0x39b38: 0x6d11d820, 0x39b39: 0x6d11da20, 0x39b3a: 0x6d11dc20, 0x39b3b: 0x6d11de20, + 0x39b3c: 0x6d11e020, 0x39b3d: 0x6d11e220, 0x39b3e: 0x6d11e420, 0x39b3f: 0x6d11e620, + // Block 0xe6d, offset 0x39b40 + 0x39b40: 0x6d11e820, 0x39b41: 0x6d11ea20, 0x39b42: 0x6d11ec20, 0x39b43: 0x6d11ee20, + 0x39b44: 0x6d11f020, 0x39b45: 0x6d11f220, 0x39b46: 0x6d3f9c20, 0x39b47: 0x6d3f9e20, + 0x39b48: 0x6d3fa020, 0x39b49: 0x6d3fa220, 0x39b4a: 0x6d3fa420, 0x39b4b: 0x6d3fa620, + 0x39b4c: 0x6d3fa820, 0x39b4d: 0x6d3faa20, 0x39b4e: 0x6d3fac20, 0x39b4f: 0x6d3fae20, + 0x39b50: 0x6d3fb020, 0x39b51: 0x6d3fb220, 0x39b52: 0x6d3fb420, 0x39b53: 0x6d3fb620, + 0x39b54: 0x6d3fb820, 0x39b55: 0x6d3fba20, 0x39b56: 0x6d3fbc20, 0x39b57: 0x6d3fbe20, + 0x39b58: 0x6d3fc020, 0x39b59: 0x6d3fc220, 0x39b5a: 0x6d3fc420, 0x39b5b: 0x6d3fc620, + 0x39b5c: 0x6d3fc820, 0x39b5d: 0x6d3fca20, 0x39b5e: 0x6d3fcc20, 0x39b5f: 0x6d3fce20, + 0x39b60: 0x6d3fd020, 0x39b61: 0x6d3fd220, 0x39b62: 0x6d3fd420, 0x39b63: 0x6d3fd620, + 0x39b64: 0x6d3fd820, 0x39b65: 0x6d3fda20, 0x39b66: 0x6d3fdc20, 0x39b67: 0x6d3fde20, + 0x39b68: 0x6d3fe020, 0x39b69: 0x6d3fe220, 0x39b6a: 0x6d3fe420, 0x39b6b: 0x6d3fe620, + 0x39b6c: 0x6d3fe820, 0x39b6d: 0x6d3fea20, 0x39b6e: 0x6d3fec20, 0x39b6f: 0x6d3fee20, + 0x39b70: 0x6d3ff020, 0x39b71: 0x6d3ff220, 0x39b72: 0x6d3ff420, 0x39b73: 0x6d3ff620, + 0x39b74: 0x6d6c8a20, 0x39b75: 0x6d6c8c20, 0x39b76: 0x6d6c8e20, 0x39b77: 0x6d6c9020, + 0x39b78: 0x6d6c9220, 0x39b79: 0x6d6c9420, 0x39b7a: 0x6d6c9620, 0x39b7b: 0x6d6c9820, + 0x39b7c: 0x6d6c9a20, 0x39b7d: 0x6d6c9c20, 0x39b7e: 0x6d6c9e20, 0x39b7f: 0x6d6ca020, + // Block 0xe6e, offset 0x39b80 + 0x39b80: 0x6d6ca220, 0x39b81: 0x6d6ca420, 0x39b82: 0x6d6ca620, 0x39b83: 0x6d6ca820, + 0x39b84: 0x6d6caa20, 0x39b85: 0x6d6cac20, 0x39b86: 0x6d6cae20, 0x39b87: 0x6d6cb020, + 0x39b88: 0x6d6cb220, 0x39b89: 0x6d6cb420, 0x39b8a: 0x6d6cb620, 0x39b8b: 0x6d6cb820, + 0x39b8c: 0x6d6cba20, 0x39b8d: 0x6d6cbc20, 0x39b8e: 0x6d6cbe20, 0x39b8f: 0x6d6cc020, + 0x39b90: 0x6d6cc220, 0x39b91: 0x6d6cc420, 0x39b92: 0x6d6cc620, 0x39b93: 0x6d784820, + 0x39b94: 0x6d6cc820, 0x39b95: 0x6d6cca20, 0x39b96: 0x6d6ccc20, 0x39b97: 0x6d6cce20, + 0x39b98: 0x6d6cd020, 0x39b99: 0x6d6cd220, 0x39b9a: 0x6d6cd420, 0x39b9b: 0x6d6cd620, + 0x39b9c: 0x6d6cd820, 0x39b9d: 0x6d6cda20, 0x39b9e: 0x6d6cdc20, 0x39b9f: 0x6d6cde20, + 0x39ba0: 0x6d6ce020, 0x39ba1: 0x6d6ce220, 0x39ba2: 0x6d6ce420, 0x39ba3: 0x6d6ce620, + 0x39ba4: 0x6d6ce820, 0x39ba5: 0x6d95b220, 0x39ba6: 0x6d95b420, 0x39ba7: 0x6d95b620, + 0x39ba8: 0x6d95b820, 0x39ba9: 0x6d95ba20, 0x39baa: 0x6d95bc20, 0x39bab: 0x6d95be20, + 0x39bac: 0x6d95c020, 0x39bad: 0x6d95c220, 0x39bae: 0x6d95c420, 0x39baf: 0x6d95c620, + 0x39bb0: 0x6d95c820, 0x39bb1: 0x6d95ca20, 0x39bb2: 0x6d95cc20, 0x39bb3: 0x6d95ce20, + 0x39bb4: 0x6d95d020, 0x39bb5: 0x6d95d220, 0x39bb6: 0x6d95d420, 0x39bb7: 0x6d95d620, + 0x39bb8: 0x6d95d820, 0x39bb9: 0x6d95da20, 0x39bba: 0x6d95dc20, 0x39bbb: 0x6d95de20, + 0x39bbc: 0x6d95e020, 0x39bbd: 0x6d95e220, 0x39bbe: 0x6d95e420, 0x39bbf: 0x6d95e620, + // Block 0xe6f, offset 0x39bc0 + 0x39bc0: 0x6d95e820, 0x39bc1: 0x6d95ea20, 0x39bc2: 0x6d95ec20, 0x39bc3: 0x6d95ee20, + 0x39bc4: 0x6d95f020, 0x39bc5: 0x6d95f220, 0x39bc6: 0x6d95f420, 0x39bc7: 0x6db8c620, + 0x39bc8: 0x6db8c820, 0x39bc9: 0x6db8ca20, 0x39bca: 0x6db8cc20, 0x39bcb: 0x6db8ce20, + 0x39bcc: 0x6db8d020, 0x39bcd: 0x6db8d220, 0x39bce: 0x6db8d420, 0x39bcf: 0x6db8d620, + 0x39bd0: 0x6db8d820, 0x39bd1: 0x6db8da20, 0x39bd2: 0x6db8dc20, 0x39bd3: 0x6db8de20, + 0x39bd4: 0x6db8e020, 0x39bd5: 0x6db8e220, 0x39bd6: 0x6db8e420, 0x39bd7: 0x6db8e620, + 0x39bd8: 0x6db8e820, 0x39bd9: 0x6db8ea20, 0x39bda: 0x6db8ec20, 0x39bdb: 0x6db8ee20, + 0x39bdc: 0x6db8f020, 0x39bdd: 0x6db8f220, 0x39bde: 0x6db8f420, 0x39bdf: 0x6db8f620, + 0x39be0: 0x6db8f820, 0x39be1: 0x6dd72620, 0x39be2: 0x6dd72820, 0x39be3: 0x6dd72a20, + 0x39be4: 0x6dd72c20, 0x39be5: 0x6dd72e20, 0x39be6: 0x6dd73020, 0x39be7: 0x6dd73220, + 0x39be8: 0x6dd73420, 0x39be9: 0x6dd73620, 0x39bea: 0x6dd73820, 0x39beb: 0x6dd73a20, + 0x39bec: 0x6dd73c20, 0x39bed: 0x6dd73e20, 0x39bee: 0x6dd74020, 0x39bef: 0x6dd74220, + 0x39bf0: 0x6dd74420, 0x39bf1: 0x6dd74620, 0x39bf2: 0x6dd74820, 0x39bf3: 0x6dd74a20, + 0x39bf4: 0x6dd74c20, 0x39bf5: 0x6dd74e20, 0x39bf6: 0x6dd75020, 0x39bf7: 0x6defe220, + 0x39bf8: 0x6defe420, 0x39bf9: 0x6defe620, 0x39bfa: 0x6defe820, 0x39bfb: 0x6defea20, + 0x39bfc: 0x6e03e620, 0x39bfd: 0x6defec20, 0x39bfe: 0x6defee20, 0x39bff: 0x6deff020, + // Block 0xe70, offset 0x39c00 + 0x39c00: 0x6deff220, 0x39c01: 0x6deff420, 0x39c02: 0x6e03fe20, 0x39c03: 0x6e040020, + 0x39c04: 0x6e040220, 0x39c05: 0x6e040420, 0x39c06: 0x6e040620, 0x39c07: 0x6e040820, + 0x39c08: 0x6e040a20, 0x39c09: 0x6e040c20, 0x39c0a: 0x6e040e20, 0x39c0b: 0x6e041020, + 0x39c0c: 0x6e041220, 0x39c0d: 0x6e041420, 0x39c0e: 0x6e041620, 0x39c0f: 0x6e041820, + 0x39c10: 0x6e041a20, 0x39c11: 0x6e041c20, 0x39c12: 0x6e153e20, 0x39c13: 0x6e154020, + 0x39c14: 0x6e154220, 0x39c15: 0x6e154420, 0x39c16: 0x6e154620, 0x39c17: 0x6e154820, + 0x39c18: 0x6e154a20, 0x39c19: 0x6e22de20, 0x39c1a: 0x6e22e020, 0x39c1b: 0x6e22e220, + 0x39c1c: 0x6e22e420, 0x39c1d: 0x6e22e620, 0x39c1e: 0x6e22e820, 0x39c1f: 0x6e2d0c20, + 0x39c20: 0x6e2d0e20, 0x39c21: 0x6e2d1020, 0x39c22: 0x6e2d1220, 0x39c23: 0x6e2d1420, + 0x39c24: 0x6e34fa20, 0x39c25: 0x6e34fc20, 0x39c26: 0x6e3aa820, 0x39c27: 0x6e3e6a20, + 0x39c28: 0x6c00ca20, 0x39c29: 0x6c052220, 0x39c2a: 0x6c052420, 0x39c2b: 0x6c0a9220, + 0x39c2c: 0x6c0a9420, 0x39c2d: 0x6c0a9620, 0x39c2e: 0x6c0a9820, 0x39c2f: 0x6c0a9a20, + 0x39c30: 0x6c0a9c20, 0x39c31: 0x6c0a9e20, 0x39c32: 0x6c0aa020, 0x39c33: 0x6c0aa220, + 0x39c34: 0x6c0aa420, 0x39c35: 0x6c0aa620, 0x39c36: 0x6c154e20, 0x39c37: 0x6c155020, + 0x39c38: 0x6c155220, 0x39c39: 0x6c155420, 0x39c3a: 0x6c155620, 0x39c3b: 0x6c155820, + 0x39c3c: 0x6c155a20, 0x39c3d: 0x6c155c20, 0x39c3e: 0x6c155e20, 0x39c3f: 0x6c156020, + // Block 0xe71, offset 0x39c40 + 0x39c40: 0x6c156220, 0x39c41: 0x6c156420, 0x39c42: 0x6c156620, 0x39c43: 0x6c156820, + 0x39c44: 0x6c156a20, 0x39c45: 0x6c156c20, 0x39c46: 0x6c156e20, 0x39c47: 0x6c157020, + 0x39c48: 0x6c157220, 0x39c49: 0x6c157420, 0x39c4a: 0x6c157620, 0x39c4b: 0x6c157820, + 0x39c4c: 0x6c157a20, 0x39c4d: 0x6c157c20, 0x39c4e: 0x6c157e20, 0x39c4f: 0x6c158020, + 0x39c50: 0x6c158220, 0x39c51: 0x6c158420, 0x39c52: 0x6c158620, 0x39c53: 0x6c27ae20, + 0x39c54: 0x6c27b020, 0x39c55: 0x6c27b220, 0x39c56: 0x6c27b420, 0x39c57: 0x6c27b620, + 0x39c58: 0x6c27b820, 0x39c59: 0x6c27ba20, 0x39c5a: 0x6c27bc20, 0x39c5b: 0x6c27be20, + 0x39c5c: 0x6c27c020, 0x39c5d: 0x6c27c220, 0x39c5e: 0x6c27c420, 0x39c5f: 0x6c27c620, + 0x39c60: 0x6c27c820, 0x39c61: 0x6c27ca20, 0x39c62: 0x6c27cc20, 0x39c63: 0x6c27ce20, + 0x39c64: 0x6c27d020, 0x39c65: 0x6c27d220, 0x39c66: 0x6c27d420, 0x39c67: 0x6c27d620, + 0x39c68: 0x6c27d820, 0x39c69: 0x6c27da20, 0x39c6a: 0x6c27dc20, 0x39c6b: 0x6c27de20, + 0x39c6c: 0x6c27e020, 0x39c6d: 0x6c27e220, 0x39c6e: 0x6c27e420, 0x39c6f: 0x6c41a020, + 0x39c70: 0x6c41a220, 0x39c71: 0x6c41a420, 0x39c72: 0x6c41a620, 0x39c73: 0x6c41a820, + 0x39c74: 0x6c41aa20, 0x39c75: 0x6c41ac20, 0x39c76: 0x6c41ae20, 0x39c77: 0x6c41b020, + 0x39c78: 0x6c41b220, 0x39c79: 0x6c41b420, 0x39c7a: 0x6c41b620, 0x39c7b: 0x6c41b820, + 0x39c7c: 0x6c41ba20, 0x39c7d: 0x6c41bc20, 0x39c7e: 0x6c41be20, 0x39c7f: 0x6c41c020, + // Block 0xe72, offset 0x39c80 + 0x39c80: 0x6c41c220, 0x39c81: 0x6c41c420, 0x39c82: 0x6c41c620, 0x39c83: 0x6c41c820, + 0x39c84: 0x6c41ca20, 0x39c85: 0x6c41cc20, 0x39c86: 0x6c41ce20, 0x39c87: 0x6c41d020, + 0x39c88: 0x6c41d220, 0x39c89: 0x6c41d420, 0x39c8a: 0x6c41d620, 0x39c8b: 0x6c620e20, + 0x39c8c: 0x6c621020, 0x39c8d: 0x6c621220, 0x39c8e: 0x6c621420, 0x39c8f: 0x6c621620, + 0x39c90: 0x6c621820, 0x39c91: 0x6c621a20, 0x39c92: 0x6c621c20, 0x39c93: 0x6c621e20, + 0x39c94: 0x6c622020, 0x39c95: 0x6c622220, 0x39c96: 0x6c622420, 0x39c97: 0x6c622620, + 0x39c98: 0x6c622820, 0x39c99: 0x6c622a20, 0x39c9a: 0x6c622c20, 0x39c9b: 0x6c622e20, + 0x39c9c: 0x6c623020, 0x39c9d: 0x6c623220, 0x39c9e: 0x6c623420, 0x39c9f: 0x6c623620, + 0x39ca0: 0x6c623820, 0x39ca1: 0x6c623a20, 0x39ca2: 0x6c623c20, 0x39ca3: 0x6c623e20, + 0x39ca4: 0x6c624020, 0x39ca5: 0x6c624220, 0x39ca6: 0x6c624420, 0x39ca7: 0x6c624620, + 0x39ca8: 0x6c624820, 0x39ca9: 0x6c624a20, 0x39caa: 0x6c624c20, 0x39cab: 0x6c889a20, + 0x39cac: 0x6c889c20, 0x39cad: 0x6c889e20, 0x39cae: 0x6c88a020, 0x39caf: 0x6c88a220, + 0x39cb0: 0x6c88a420, 0x39cb1: 0x6c88a620, 0x39cb2: 0x6c88a820, 0x39cb3: 0x6c88aa20, + 0x39cb4: 0x6c88ac20, 0x39cb5: 0x6c88ae20, 0x39cb6: 0x6c88b020, 0x39cb7: 0x6c88b220, + 0x39cb8: 0x6c88b420, 0x39cb9: 0x6c88b620, 0x39cba: 0x6c88b820, 0x39cbb: 0x6c88ba20, + 0x39cbc: 0x6c88bc20, 0x39cbd: 0x6c88be20, 0x39cbe: 0x6c88c020, 0x39cbf: 0x6c88c220, + // Block 0xe73, offset 0x39cc0 + 0x39cc0: 0x6c88c420, 0x39cc1: 0x6c88c620, 0x39cc2: 0x6c88c820, 0x39cc3: 0x6c88ca20, + 0x39cc4: 0x6c88cc20, 0x39cc5: 0x6c88ce20, 0x39cc6: 0x6c88d020, 0x39cc7: 0x6c88d220, + 0x39cc8: 0x6c88d420, 0x39cc9: 0x6c88d620, 0x39cca: 0x6c88d820, 0x39ccb: 0x6c88da20, + 0x39ccc: 0x6c88dc20, 0x39ccd: 0x6c88de20, 0x39cce: 0x6c88e020, 0x39ccf: 0x6cb42a20, + 0x39cd0: 0x6cb42c20, 0x39cd1: 0x6cb42e20, 0x39cd2: 0x6cb43020, 0x39cd3: 0x6cb43220, + 0x39cd4: 0x6cb43420, 0x39cd5: 0x6cb43620, 0x39cd6: 0x6cb43820, 0x39cd7: 0x6ce3e620, + 0x39cd8: 0x6cb43a20, 0x39cd9: 0x6cb43c20, 0x39cda: 0x6cb43e20, 0x39cdb: 0x6cb44020, + 0x39cdc: 0x6cb44220, 0x39cdd: 0x6cb44420, 0x39cde: 0x6cb44620, 0x39cdf: 0x6cb44820, + 0x39ce0: 0x6cb44a20, 0x39ce1: 0x6cb44c20, 0x39ce2: 0x6cb44e20, 0x39ce3: 0x6cb45020, + 0x39ce4: 0x6cb45220, 0x39ce5: 0x6cb45420, 0x39ce6: 0x6cb45620, 0x39ce7: 0x6cb45820, + 0x39ce8: 0x6cb45a20, 0x39ce9: 0x6cb45c20, 0x39cea: 0x6cb45e20, 0x39ceb: 0x6cb46020, + 0x39cec: 0x6cb46220, 0x39ced: 0x6cb46420, 0x39cee: 0x6cb46620, 0x39cef: 0x6cb46820, + 0x39cf0: 0x6cb46a20, 0x39cf1: 0x6cb46c20, 0x39cf2: 0x6ce3e820, 0x39cf3: 0x6ce3ea20, + 0x39cf4: 0x6ce3ec20, 0x39cf5: 0x6ce3ee20, 0x39cf6: 0x6ce3f020, 0x39cf7: 0x6ce3f220, + 0x39cf8: 0x6ce3f420, 0x39cf9: 0x6ce3f620, 0x39cfa: 0x6ce3f820, 0x39cfb: 0x6ce3fa20, + 0x39cfc: 0x6ce3fc20, 0x39cfd: 0x6ce3fe20, 0x39cfe: 0x6ce40020, 0x39cff: 0x6ce40220, + // Block 0xe74, offset 0x39d00 + 0x39d00: 0x6ce40420, 0x39d01: 0x6ce40620, 0x39d02: 0x6ce40820, 0x39d03: 0x6ce40a20, + 0x39d04: 0x6ce40c20, 0x39d05: 0x6ce40e20, 0x39d06: 0x6ce41020, 0x39d07: 0x6ce41220, + 0x39d08: 0x6ce41420, 0x39d09: 0x6ce41620, 0x39d0a: 0x6ce41820, 0x39d0b: 0x6d122220, + 0x39d0c: 0x6d122420, 0x39d0d: 0x6d122620, 0x39d0e: 0x6d122820, 0x39d0f: 0x6d122a20, + 0x39d10: 0x6d122c20, 0x39d11: 0x6d122e20, 0x39d12: 0x6d123020, 0x39d13: 0x6d123220, + 0x39d14: 0x6d123420, 0x39d15: 0x6d123620, 0x39d16: 0x6d123820, 0x39d17: 0x6d123a20, + 0x39d18: 0x6d123c20, 0x39d19: 0x6d123e20, 0x39d1a: 0x6d124020, 0x39d1b: 0x6d124220, + 0x39d1c: 0x6d124420, 0x39d1d: 0x6d124620, 0x39d1e: 0x6d124820, 0x39d1f: 0x6d124a20, + 0x39d20: 0x6d124c20, 0x39d21: 0x6d124e20, 0x39d22: 0x6d125020, 0x39d23: 0x6d125220, + 0x39d24: 0x6d125420, 0x39d25: 0x6d125620, 0x39d26: 0x6d125820, 0x39d27: 0x6d125a20, + 0x39d28: 0x6d125c20, 0x39d29: 0x6d125e20, 0x39d2a: 0x6d126020, 0x39d2b: 0x6d403020, + 0x39d2c: 0x6d403220, 0x39d2d: 0x6d403420, 0x39d2e: 0x6d403620, 0x39d2f: 0x6d403820, + 0x39d30: 0x6d403a20, 0x39d31: 0x6d403c20, 0x39d32: 0x6d403e20, 0x39d33: 0x6d404020, + 0x39d34: 0x6d404220, 0x39d35: 0x6d404420, 0x39d36: 0x6d404620, 0x39d37: 0x6d404820, + 0x39d38: 0x6d404a20, 0x39d39: 0x6d126220, 0x39d3a: 0x6d404c20, 0x39d3b: 0x6d404e20, + 0x39d3c: 0x6d405020, 0x39d3d: 0x6d405220, 0x39d3e: 0x6d405420, 0x39d3f: 0x6d405620, + // Block 0xe75, offset 0x39d40 + 0x39d40: 0x6d405820, 0x39d41: 0x6d405a20, 0x39d42: 0x6d405c20, 0x39d43: 0x6d405e20, + 0x39d44: 0x6d406020, 0x39d45: 0x6d406220, 0x39d46: 0x6d406420, 0x39d47: 0x6d406620, + 0x39d48: 0x6d406820, 0x39d49: 0x6d406a20, 0x39d4a: 0x6d406c20, 0x39d4b: 0x6d406e20, + 0x39d4c: 0x6d407020, 0x39d4d: 0x6d407220, 0x39d4e: 0x6d407420, 0x39d4f: 0x6d407620, + 0x39d50: 0x6d407820, 0x39d51: 0x6d6d1820, 0x39d52: 0x6d6d1a20, 0x39d53: 0x6d6d1c20, + 0x39d54: 0x6d6d1e20, 0x39d55: 0x6d6d2020, 0x39d56: 0x6d6d2220, 0x39d57: 0x6d6d2420, + 0x39d58: 0x6d6d2620, 0x39d59: 0x6d6d2820, 0x39d5a: 0x6d6d2a20, 0x39d5b: 0x6d6d2c20, + 0x39d5c: 0x6d6d2e20, 0x39d5d: 0x6d6d3020, 0x39d5e: 0x6d6d3220, 0x39d5f: 0x6d6d3420, + 0x39d60: 0x6d6d3620, 0x39d61: 0x6d6d3820, 0x39d62: 0x6d6d3a20, 0x39d63: 0x6d6d3c20, + 0x39d64: 0x6d6d3e20, 0x39d65: 0x6d6d4020, 0x39d66: 0x6d6d4220, 0x39d67: 0x6d960820, + 0x39d68: 0x6d960a20, 0x39d69: 0x6d960c20, 0x39d6a: 0x6d960e20, 0x39d6b: 0x6d961020, + 0x39d6c: 0x6d961220, 0x39d6d: 0x6d961420, 0x39d6e: 0x6d961620, 0x39d6f: 0x6d961820, + 0x39d70: 0x6d961a20, 0x39d71: 0x6d961c20, 0x39d72: 0x6d961e20, 0x39d73: 0x6d962020, + 0x39d74: 0x6d962220, 0x39d75: 0x6d962420, 0x39d76: 0x6d962620, 0x39d77: 0x6d962820, + 0x39d78: 0x6d962a20, 0x39d79: 0x6d962c20, 0x39d7a: 0x6db90c20, 0x39d7b: 0x6db90e20, + 0x39d7c: 0x6db91020, 0x39d7d: 0x6db91220, 0x39d7e: 0x6db91420, 0x39d7f: 0x6db91620, + // Block 0xe76, offset 0x39d80 + 0x39d80: 0x6db91820, 0x39d81: 0x6db91a20, 0x39d82: 0x6db91c20, 0x39d83: 0x6db91e20, + 0x39d84: 0x6db92020, 0x39d85: 0x6db92220, 0x39d86: 0x6db92420, 0x39d87: 0x6db92620, + 0x39d88: 0x6db92820, 0x39d89: 0x6db92a20, 0x39d8a: 0x6db92c20, 0x39d8b: 0x6db92e20, + 0x39d8c: 0x6db93020, 0x39d8d: 0x6dd76220, 0x39d8e: 0x6dd76420, 0x39d8f: 0x6dd76620, + 0x39d90: 0x6dd76820, 0x39d91: 0x6dd76a20, 0x39d92: 0x6dd76c20, 0x39d93: 0x6dd76e20, + 0x39d94: 0x6dd77020, 0x39d95: 0x6dd77220, 0x39d96: 0x6dd77420, 0x39d97: 0x6dd77620, + 0x39d98: 0x6dd77820, 0x39d99: 0x6deffc20, 0x39d9a: 0x6deffe20, 0x39d9b: 0x6df00020, + 0x39d9c: 0x6df00220, 0x39d9d: 0x6df00420, 0x39d9e: 0x6df00620, 0x39d9f: 0x6df00820, + 0x39da0: 0x6e042a20, 0x39da1: 0x6e042c20, 0x39da2: 0x6e042e20, 0x39da3: 0x6e043020, + 0x39da4: 0x6e155420, 0x39da5: 0x6e155620, 0x39da6: 0x6e155820, 0x39da7: 0x6e155a20, + 0x39da8: 0x6e22ee20, 0x39da9: 0x6e2d1a20, 0x39daa: 0x6e2d1c20, 0x39dab: 0x6e2d1e20, + 0x39dac: 0x6e2d2020, 0x39dad: 0x6e2d2220, 0x39dae: 0x6e2d2420, 0x39daf: 0x6e3e6c20, + 0x39db0: 0x6c88fc20, 0x39db1: 0x6c88fe20, 0x39db2: 0x6c890020, 0x39db3: 0x6c890220, + 0x39db4: 0x6cb49620, 0x39db5: 0x6cb49820, 0x39db6: 0x6cb49a20, 0x39db7: 0x6cb49c20, + 0x39db8: 0x6cb49e20, 0x39db9: 0x6cb4a020, 0x39dba: 0x6cb4a220, 0x39dbb: 0x6cb4a420, + 0x39dbc: 0x6cb4a620, 0x39dbd: 0x6cb4a820, 0x39dbe: 0x6cb4aa20, 0x39dbf: 0x6cb4ac20, + // Block 0xe77, offset 0x39dc0 + 0x39dc0: 0x6cb4ae20, 0x39dc1: 0x6cb4b020, 0x39dc2: 0x6cb4b220, 0x39dc3: 0x6cb4b420, + 0x39dc4: 0x6cb4b620, 0x39dc5: 0x6cb4b820, 0x39dc6: 0x6cb4ba20, 0x39dc7: 0x6cb4bc20, + 0x39dc8: 0x6cb4be20, 0x39dc9: 0x6cb4c020, 0x39dca: 0x6cb4c220, 0x39dcb: 0x6ce43820, + 0x39dcc: 0x6ce43a20, 0x39dcd: 0x6ce43c20, 0x39dce: 0x6ce43e20, 0x39dcf: 0x6ce44020, + 0x39dd0: 0x6ce44220, 0x39dd1: 0x6ce44420, 0x39dd2: 0x6ce44620, 0x39dd3: 0x6ce44820, + 0x39dd4: 0x6ce44a20, 0x39dd5: 0x6ce44c20, 0x39dd6: 0x6ce44e20, 0x39dd7: 0x6ce45020, + 0x39dd8: 0x6ce45220, 0x39dd9: 0x6ce45420, 0x39dda: 0x6ce45620, 0x39ddb: 0x6ce45820, + 0x39ddc: 0x6ce45a20, 0x39ddd: 0x6ce45c20, 0x39dde: 0x6ce45e20, 0x39ddf: 0x6ce46020, + 0x39de0: 0x6ce46220, 0x39de1: 0x6ce46420, 0x39de2: 0x6ce46620, 0x39de3: 0x6ce46820, + 0x39de4: 0x6d129020, 0x39de5: 0x6d129220, 0x39de6: 0x6d129420, 0x39de7: 0x6d129620, + 0x39de8: 0x6d129820, 0x39de9: 0x6d129a20, 0x39dea: 0x6d129c20, 0x39deb: 0x6d129e20, + 0x39dec: 0x6d12a020, 0x39ded: 0x6d12a220, 0x39dee: 0x6d12a420, 0x39def: 0x6d12a620, + 0x39df0: 0x6d12a820, 0x39df1: 0x6d12aa20, 0x39df2: 0x6d12ac20, 0x39df3: 0x6d12ae20, + 0x39df4: 0x6d12b020, 0x39df5: 0x6d12b220, 0x39df6: 0x6d12b420, 0x39df7: 0x6d409a20, + 0x39df8: 0x6d409c20, 0x39df9: 0x6d409e20, 0x39dfa: 0x6d40a020, 0x39dfb: 0x6d40a220, + 0x39dfc: 0x6d40a420, 0x39dfd: 0x6d40a620, 0x39dfe: 0x6d40a820, 0x39dff: 0x6d40aa20, + // Block 0xe78, offset 0x39e00 + 0x39e00: 0x6d40ac20, 0x39e01: 0x6d40ae20, 0x39e02: 0x6d40b020, 0x39e03: 0x6d40b220, + 0x39e04: 0x6d40b420, 0x39e05: 0x6d40b620, 0x39e06: 0x6d40b820, 0x39e07: 0x6d40ba20, + 0x39e08: 0x6d40bc20, 0x39e09: 0x6d40be20, 0x39e0a: 0x6d40c020, 0x39e0b: 0x6d40c220, + 0x39e0c: 0x6d6d6a20, 0x39e0d: 0x6d6d6c20, 0x39e0e: 0x6d6d6e20, 0x39e0f: 0x6d6d7020, + 0x39e10: 0x6d6d7220, 0x39e11: 0x6d6d7420, 0x39e12: 0x6d6d7620, 0x39e13: 0x6d6d7820, + 0x39e14: 0x6d6d7a20, 0x39e15: 0x6d6d7c20, 0x39e16: 0x6d6d7e20, 0x39e17: 0x6d6d8020, + 0x39e18: 0x6d6d8220, 0x39e19: 0x6d6d8420, 0x39e1a: 0x6d6d8620, 0x39e1b: 0x6d6d8820, + 0x39e1c: 0x6d6d8a20, 0x39e1d: 0x6d6d8c20, 0x39e1e: 0x6d6d8e20, 0x39e1f: 0x6d6d9020, + 0x39e20: 0x6d6d9220, 0x39e21: 0x6d6d9420, 0x39e22: 0x6d6d9620, 0x39e23: 0x6d6d9820, + 0x39e24: 0x6d6d9a20, 0x39e25: 0x6d6d9c20, 0x39e26: 0x6d6d9e20, 0x39e27: 0x6d6da020, + 0x39e28: 0x6d6da220, 0x39e29: 0x6d965820, 0x39e2a: 0x6d965a20, 0x39e2b: 0x6d965c20, + 0x39e2c: 0x6d965e20, 0x39e2d: 0x6d966020, 0x39e2e: 0x6d966220, 0x39e2f: 0x6d966420, + 0x39e30: 0x6d966620, 0x39e31: 0x6d966820, 0x39e32: 0x6d966a20, 0x39e33: 0x6d966c20, + 0x39e34: 0x6d966e20, 0x39e35: 0x6d967020, 0x39e36: 0x6d967220, 0x39e37: 0x6d967420, + 0x39e38: 0x6d967620, 0x39e39: 0x6d967820, 0x39e3a: 0x6d967a20, 0x39e3b: 0x6d967c20, + 0x39e3c: 0x6d967e20, 0x39e3d: 0x6d968020, 0x39e3e: 0x6d968220, 0x39e3f: 0x6d968420, + // Block 0xe79, offset 0x39e40 + 0x39e40: 0x6d968620, 0x39e41: 0x6d968820, 0x39e42: 0x6d968a20, 0x39e43: 0x6d968c20, + 0x39e44: 0x6d968e20, 0x39e45: 0x6db95620, 0x39e46: 0x6db95820, 0x39e47: 0x6db95a20, + 0x39e48: 0x6db95c20, 0x39e49: 0x6db95e20, 0x39e4a: 0x6db96020, 0x39e4b: 0x6db96220, + 0x39e4c: 0x6db96420, 0x39e4d: 0x6db96620, 0x39e4e: 0x6db96820, 0x39e4f: 0x6db96a20, + 0x39e50: 0x6db96c20, 0x39e51: 0x6db96e20, 0x39e52: 0x6db97020, 0x39e53: 0x6db97220, + 0x39e54: 0x6db97420, 0x39e55: 0x6db97620, 0x39e56: 0x6db97820, 0x39e57: 0x6db97a20, + 0x39e58: 0x6db97c20, 0x39e59: 0x6db97e20, 0x39e5a: 0x6db98020, 0x39e5b: 0x6db98220, + 0x39e5c: 0x6db98420, 0x39e5d: 0x6db98620, 0x39e5e: 0x6db98820, 0x39e5f: 0x6db98a20, + 0x39e60: 0x6db98c20, 0x39e61: 0x6dd79220, 0x39e62: 0x6dd79420, 0x39e63: 0x6dd79620, + 0x39e64: 0x6dd79820, 0x39e65: 0x6dd79a20, 0x39e66: 0x6dd79c20, 0x39e67: 0x6dd79e20, + 0x39e68: 0x6dd7a020, 0x39e69: 0x6dd7a220, 0x39e6a: 0x6dd7a420, 0x39e6b: 0x6dd7a620, + 0x39e6c: 0x6dd7a820, 0x39e6d: 0x6dd7aa20, 0x39e6e: 0x6dd7ac20, 0x39e6f: 0x6dd7ae20, + 0x39e70: 0x6dd7b020, 0x39e71: 0x6dd7b220, 0x39e72: 0x6dd7b420, 0x39e73: 0x6dd7b620, + 0x39e74: 0x6dd7b820, 0x39e75: 0x6dd7ba20, 0x39e76: 0x6dd7bc20, 0x39e77: 0x6dd7be20, + 0x39e78: 0x6dd7c020, 0x39e79: 0x6dd7c220, 0x39e7a: 0x6dd7c420, 0x39e7b: 0x6dd7c620, + 0x39e7c: 0x6dd7c820, 0x39e7d: 0x6df01e20, 0x39e7e: 0x6df02020, 0x39e7f: 0x6df02220, + // Block 0xe7a, offset 0x39e80 + 0x39e80: 0x6df02420, 0x39e81: 0x6df02620, 0x39e82: 0x6df02820, 0x39e83: 0x6df02a20, + 0x39e84: 0x6df02c20, 0x39e85: 0x6df02e20, 0x39e86: 0x6df03020, 0x39e87: 0x6df03220, + 0x39e88: 0x6df03420, 0x39e89: 0x6df03620, 0x39e8a: 0x6df03820, 0x39e8b: 0x6df03a20, + 0x39e8c: 0x6df03c20, 0x39e8d: 0x6df03e20, 0x39e8e: 0x6df04020, 0x39e8f: 0x6df04220, + 0x39e90: 0x6df04420, 0x39e91: 0x6df04620, 0x39e92: 0x6df04820, 0x39e93: 0x6df04a20, + 0x39e94: 0x6df04c20, 0x39e95: 0x6df04e20, 0x39e96: 0x6e044220, 0x39e97: 0x6e044420, + 0x39e98: 0x6e044620, 0x39e99: 0x6e044820, 0x39e9a: 0x6e044a20, 0x39e9b: 0x6e044c20, + 0x39e9c: 0x6e044e20, 0x39e9d: 0x6e045020, 0x39e9e: 0x6e045220, 0x39e9f: 0x6e045420, + 0x39ea0: 0x6e045620, 0x39ea1: 0x6e045820, 0x39ea2: 0x6e045a20, 0x39ea3: 0x6e045c20, + 0x39ea4: 0x6e045e20, 0x39ea5: 0x6e046020, 0x39ea6: 0x6e156620, 0x39ea7: 0x6e156820, + 0x39ea8: 0x6e156a20, 0x39ea9: 0x6e156c20, 0x39eaa: 0x6e156e20, 0x39eab: 0x6e157020, + 0x39eac: 0x6e157220, 0x39ead: 0x6e157420, 0x39eae: 0x6e22f420, 0x39eaf: 0x6e22f620, + 0x39eb0: 0x6e22f820, 0x39eb1: 0x6e22fa20, 0x39eb2: 0x6e22fc20, 0x39eb3: 0x6e22fe20, + 0x39eb4: 0x6e230020, 0x39eb5: 0x6e230220, 0x39eb6: 0x6e2d2820, 0x39eb7: 0x6e2d2a20, + 0x39eb8: 0x6e2d2c20, 0x39eb9: 0x6e2d2e20, 0x39eba: 0x6e2d3020, 0x39ebb: 0x6e2d3220, + 0x39ebc: 0x6e2d3420, 0x39ebd: 0x6e2d3620, 0x39ebe: 0x6e350a20, 0x39ebf: 0x6e350c20, + // Block 0xe7b, offset 0x39ec0 + 0x39ec0: 0x6e350e20, 0x39ec1: 0x6e351020, 0x39ec2: 0x6e351220, 0x39ec3: 0x6e3aac20, + 0x39ec4: 0x6e3aae20, 0x39ec5: 0x6e3e7220, 0x39ec6: 0x6e3e7420, 0x39ec7: 0x6e413a20, + 0x39ec8: 0x6e413c20, 0x39ec9: 0x6e413e20, 0x39eca: 0x6e433a20, 0x39ecb: 0x6e433c20, + 0x39ecc: 0x6e433e20, 0x39ecd: 0x6e45e220, 0x39ece: 0x6e45e420, 0x39ecf: 0x6c890620, + 0x39ed0: 0x6cb4c620, 0x39ed1: 0x6cb4c820, 0x39ed2: 0x6d40ca20, 0x39ed3: 0x6d40cc20, + 0x39ed4: 0x6d40ce20, 0x39ed5: 0x6d6da620, 0x39ed6: 0x6d6da820, 0x39ed7: 0x6d6daa20, + 0x39ed8: 0x6d969020, 0x39ed9: 0x6d969220, 0x39eda: 0x6db99220, 0x39edb: 0x6db99420, + 0x39edc: 0x6db99620, 0x39edd: 0x6dd7cc20, 0x39ede: 0x6e046420, 0x39edf: 0x6e157820, + 0x39ee0: 0x6e157a20, 0x39ee1: 0x6e230420, 0x39ee2: 0x6cb4ce20, 0x39ee3: 0x6c890820, + 0x39ee4: 0x6c890a20, 0x39ee5: 0x6cb4d020, 0x39ee6: 0x6ce47220, 0x39ee7: 0x6ce47420, + 0x39ee8: 0x6ce47620, 0x39ee9: 0x6ce47820, 0x39eea: 0x6d12bc20, 0x39eeb: 0x6d12be20, + 0x39eec: 0x6d40d020, 0x39eed: 0x6d6dac20, 0x39eee: 0x6d6dae20, 0x39eef: 0x6d6db020, + 0x39ef0: 0x6d969420, 0x39ef1: 0x6d969620, 0x39ef2: 0x6db99a20, 0x39ef3: 0x6db99c20, + 0x39ef4: 0x6dd7d020, 0x39ef5: 0x6dd7d220, 0x39ef6: 0x6dd7d420, 0x39ef7: 0x6dd7d620, + 0x39ef8: 0x6e046820, 0x39ef9: 0x6e157c20, 0x39efa: 0x6e157e20, 0x39efb: 0x6e3ab020, + 0x39efc: 0x6e456620, 0x39efd: 0x6c892a20, 0x39efe: 0x6c892c20, 0x39eff: 0x6c892e20, + // Block 0xe7c, offset 0x39f00 + 0x39f00: 0x6c893020, 0x39f01: 0x6c893220, 0x39f02: 0x6cb50a20, 0x39f03: 0x6cb50c20, + 0x39f04: 0x6cb50e20, 0x39f05: 0x6cb51020, 0x39f06: 0x6cb51220, 0x39f07: 0x6cb51420, + 0x39f08: 0x6cb51620, 0x39f09: 0x6cb51820, 0x39f0a: 0x6ce4e420, 0x39f0b: 0x6ce4e620, + 0x39f0c: 0x6ce4e820, 0x39f0d: 0x6ce4ea20, 0x39f0e: 0x6ce4ec20, 0x39f0f: 0x6ce4ee20, + 0x39f10: 0x6ce4f020, 0x39f11: 0x6ce4f220, 0x39f12: 0x6ce4f420, 0x39f13: 0x6ce4f620, + 0x39f14: 0x6ce4f820, 0x39f15: 0x6ce4fa20, 0x39f16: 0x6ce4fc20, 0x39f17: 0x6ce4fe20, + 0x39f18: 0x6ce50020, 0x39f19: 0x6ce50220, 0x39f1a: 0x6ce50420, 0x39f1b: 0x6ce50620, + 0x39f1c: 0x6ce50820, 0x39f1d: 0x6ce50a20, 0x39f1e: 0x6ce50c20, 0x39f1f: 0x6ce50e20, + 0x39f20: 0x6ce51020, 0x39f21: 0x6ce51220, 0x39f22: 0x6ce51420, 0x39f23: 0x6ce51620, + 0x39f24: 0x6ce51820, 0x39f25: 0x6d135820, 0x39f26: 0x6d135a20, 0x39f27: 0x6d135c20, + 0x39f28: 0x6d135e20, 0x39f29: 0x6d136020, 0x39f2a: 0x6d136220, 0x39f2b: 0x6d136420, + 0x39f2c: 0x6d136620, 0x39f2d: 0x6d136820, 0x39f2e: 0x6d136a20, 0x39f2f: 0x6d136c20, + 0x39f30: 0x6d136e20, 0x39f31: 0x6d137020, 0x39f32: 0x6d137220, 0x39f33: 0x6d137420, + 0x39f34: 0x6d137620, 0x39f35: 0x6d137820, 0x39f36: 0x6d137a20, 0x39f37: 0x6d137c20, + 0x39f38: 0x6d137e20, 0x39f39: 0x6d138020, 0x39f3a: 0x6d138220, 0x39f3b: 0x6d138420, + 0x39f3c: 0x6d138620, 0x39f3d: 0x6d138820, 0x39f3e: 0x6d138a20, 0x39f3f: 0x6d138c20, + // Block 0xe7d, offset 0x39f40 + 0x39f40: 0x6d138e20, 0x39f41: 0x6d139020, 0x39f42: 0x6d415a20, 0x39f43: 0x6d415c20, + 0x39f44: 0x6d415e20, 0x39f45: 0x6d416020, 0x39f46: 0x6d416220, 0x39f47: 0x6d416420, + 0x39f48: 0x6d416620, 0x39f49: 0x6d416820, 0x39f4a: 0x6d416a20, 0x39f4b: 0x6d416c20, + 0x39f4c: 0x6d416e20, 0x39f4d: 0x6d417020, 0x39f4e: 0x6d417220, 0x39f4f: 0x6d417420, + 0x39f50: 0x6d417620, 0x39f51: 0x6d417820, 0x39f52: 0x6d417a20, 0x39f53: 0x6d417c20, + 0x39f54: 0x6d417e20, 0x39f55: 0x6d418020, 0x39f56: 0x6d418220, 0x39f57: 0x6d418420, + 0x39f58: 0x6d418620, 0x39f59: 0x6d418820, 0x39f5a: 0x6d418a20, 0x39f5b: 0x6d418c20, + 0x39f5c: 0x6d418e20, 0x39f5d: 0x6d419020, 0x39f5e: 0x6d377020, 0x39f5f: 0x6d419220, + 0x39f60: 0x6d419420, 0x39f61: 0x6d419620, 0x39f62: 0x6d419820, 0x39f63: 0x6d419a20, + 0x39f64: 0x6d419c20, 0x39f65: 0x6d419e20, 0x39f66: 0x6d41a020, 0x39f67: 0x6d41a220, + 0x39f68: 0x6d41a420, 0x39f69: 0x6d41a620, 0x39f6a: 0x6d41a820, 0x39f6b: 0x6d41aa20, + 0x39f6c: 0x6d6e4a20, 0x39f6d: 0x6d6e4c20, 0x39f6e: 0x6d6e4e20, 0x39f6f: 0x6d6e5020, + 0x39f70: 0x6d6e5220, 0x39f71: 0x6d6e5420, 0x39f72: 0x6d6e5620, 0x39f73: 0x6d6e5820, + 0x39f74: 0x6d6e5a20, 0x39f75: 0x6d6e5c20, 0x39f76: 0x6d6e5e20, 0x39f77: 0x6d6e6020, + 0x39f78: 0x6d6e6220, 0x39f79: 0x6d6e6420, 0x39f7a: 0x6d6e6620, 0x39f7b: 0x6d6e6820, + 0x39f7c: 0x6d6e6a20, 0x39f7d: 0x6d6e6c20, 0x39f7e: 0x6d6e6e20, 0x39f7f: 0x6d6e7020, + // Block 0xe7e, offset 0x39f80 + 0x39f80: 0x6d6e7220, 0x39f81: 0x6d6e7420, 0x39f82: 0x6d6e7620, 0x39f83: 0x6d6e7820, + 0x39f84: 0x6d6e7a20, 0x39f85: 0x6d6e7c20, 0x39f86: 0x6d6e7e20, 0x39f87: 0x6d6e8020, + 0x39f88: 0x6d6e8220, 0x39f89: 0x6d6e8420, 0x39f8a: 0x6d6e8620, 0x39f8b: 0x6d6e8820, + 0x39f8c: 0x6d6e8a20, 0x39f8d: 0x6d6e8c20, 0x39f8e: 0x6d6e8e20, 0x39f8f: 0x6d6e9020, + 0x39f90: 0x6d6e9220, 0x39f91: 0x6d6e9420, 0x39f92: 0x6d6e9620, 0x39f93: 0x6d6e9820, + 0x39f94: 0x6d6e9a20, 0x39f95: 0x6d6e9c20, 0x39f96: 0x6d6e9e20, 0x39f97: 0x6d6ea020, + 0x39f98: 0x6d6ea220, 0x39f99: 0x6d6ea420, 0x39f9a: 0x6d6ea620, 0x39f9b: 0x6d6ea820, + 0x39f9c: 0x6d6eaa20, 0x39f9d: 0x6d6eac20, 0x39f9e: 0x6d6eae20, 0x39f9f: 0x6d6eb020, + 0x39fa0: 0x6d6eb220, 0x39fa1: 0x6d6eb420, 0x39fa2: 0x6d6eb620, 0x39fa3: 0x6d6eb820, + 0x39fa4: 0x6d6eba20, 0x39fa5: 0x6d6ebc20, 0x39fa6: 0x6d974620, 0x39fa7: 0x6d974820, + 0x39fa8: 0x6d974a20, 0x39fa9: 0x6d974c20, 0x39faa: 0x6d974e20, 0x39fab: 0x6d975020, + 0x39fac: 0x6d975220, 0x39fad: 0x6d975420, 0x39fae: 0x6d975620, 0x39faf: 0x6d975820, + 0x39fb0: 0x6d975a20, 0x39fb1: 0x6d975c20, 0x39fb2: 0x6d975e20, 0x39fb3: 0x6d976020, + 0x39fb4: 0x6d976220, 0x39fb5: 0x6d976420, 0x39fb6: 0x6d976620, 0x39fb7: 0x6d976820, + 0x39fb8: 0x6d976a20, 0x39fb9: 0x6d976c20, 0x39fba: 0x6d976e20, 0x39fbb: 0x6d977020, + 0x39fbc: 0x6d977220, 0x39fbd: 0x6d977420, 0x39fbe: 0x6d977620, 0x39fbf: 0x6d977820, + // Block 0xe7f, offset 0x39fc0 + 0x39fc0: 0x6d977a20, 0x39fc1: 0x6d977c20, 0x39fc2: 0x6d977e20, 0x39fc3: 0x6d978020, + 0x39fc4: 0x6d978220, 0x39fc5: 0x6d978420, 0x39fc6: 0x6d978620, 0x39fc7: 0x6d978820, + 0x39fc8: 0x6d978a20, 0x39fc9: 0x6d978c20, 0x39fca: 0x6d978e20, 0x39fcb: 0x6d979020, + 0x39fcc: 0x6d979220, 0x39fcd: 0x6d979420, 0x39fce: 0x6d979620, 0x39fcf: 0x6d979820, + 0x39fd0: 0x6d979a20, 0x39fd1: 0x6d979c20, 0x39fd2: 0x6d979e20, 0x39fd3: 0x6d97a020, + 0x39fd4: 0x6d97a220, 0x39fd5: 0x6d97a420, 0x39fd6: 0x6d97a620, 0x39fd7: 0x6d97a820, + 0x39fd8: 0x6d97aa20, 0x39fd9: 0x6d97ac20, 0x39fda: 0x6d97ae20, 0x39fdb: 0x6d97b020, + 0x39fdc: 0x6d97b220, 0x39fdd: 0x6d97b420, 0x39fde: 0x6d97b620, 0x39fdf: 0x6d97b820, + 0x39fe0: 0x6d97ba20, 0x39fe1: 0x6d97bc20, 0x39fe2: 0x6d97be20, 0x39fe3: 0x6d97c020, + 0x39fe4: 0x6d97c220, 0x39fe5: 0x6d97c420, 0x39fe6: 0x6d97c620, 0x39fe7: 0x6d97c820, + 0x39fe8: 0x6d97ca20, 0x39fe9: 0x6d97cc20, 0x39fea: 0x6d97ce20, 0x39feb: 0x6d97d020, + 0x39fec: 0x6d97d220, 0x39fed: 0x6d97d420, 0x39fee: 0x6d97d620, 0x39fef: 0x6dba2c20, + 0x39ff0: 0x6dba2e20, 0x39ff1: 0x6dba3020, 0x39ff2: 0x6dba3220, 0x39ff3: 0x6dba3420, + 0x39ff4: 0x6dba3620, 0x39ff5: 0x6dba3820, 0x39ff6: 0x6dba3a20, 0x39ff7: 0x6dba3c20, + 0x39ff8: 0x6dba3e20, 0x39ff9: 0x6dba4020, 0x39ffa: 0x6dba4220, 0x39ffb: 0x6dba4420, + 0x39ffc: 0x6dba4620, 0x39ffd: 0x6dba4820, 0x39ffe: 0x6dba4a20, 0x39fff: 0x6dba4c20, + // Block 0xe80, offset 0x3a000 + 0x3a000: 0x6dba4e20, 0x3a001: 0x6dba5020, 0x3a002: 0x6dba5220, 0x3a003: 0x6dba5420, + 0x3a004: 0x6dba5620, 0x3a005: 0x6dba5820, 0x3a006: 0x6dba5a20, 0x3a007: 0x6dba5c20, + 0x3a008: 0x6dba5e20, 0x3a009: 0x6dba6020, 0x3a00a: 0x6dba6220, 0x3a00b: 0x6dba6420, + 0x3a00c: 0x6dba6620, 0x3a00d: 0x6dba6820, 0x3a00e: 0x6dba6a20, 0x3a00f: 0x6dba6c20, + 0x3a010: 0x6dba6e20, 0x3a011: 0x6dba7020, 0x3a012: 0x6dba7220, 0x3a013: 0x6dba7420, + 0x3a014: 0x6dba7620, 0x3a015: 0x6dba7820, 0x3a016: 0x6dba7a20, 0x3a017: 0x6dba7c20, + 0x3a018: 0x6dba7e20, 0x3a019: 0x6dba8020, 0x3a01a: 0x6dba8220, 0x3a01b: 0x6dba8420, + 0x3a01c: 0x6dba8620, 0x3a01d: 0x6dba8820, 0x3a01e: 0x6dba8a20, 0x3a01f: 0x6dba8c20, + 0x3a020: 0x6dba8e20, 0x3a021: 0x6dba9020, 0x3a022: 0x6dba9220, 0x3a023: 0x6dba9420, + 0x3a024: 0x6dba9620, 0x3a025: 0x6dba9820, 0x3a026: 0x6dba9a20, 0x3a027: 0x6dba9c20, + 0x3a028: 0x6dba9e20, 0x3a029: 0x6dbaa020, 0x3a02a: 0x6dbaa220, 0x3a02b: 0x6dbaa420, + 0x3a02c: 0x6dbaa620, 0x3a02d: 0x6dbaa820, 0x3a02e: 0x6dbaaa20, 0x3a02f: 0x6dbaac20, + 0x3a030: 0x6dbaae20, 0x3a031: 0x6dbab020, 0x3a032: 0x6dbab220, 0x3a033: 0x6dbab420, + 0x3a034: 0x6dbab620, 0x3a035: 0x6dbab820, 0x3a036: 0x6dbaba20, 0x3a037: 0x6dbabc20, + 0x3a038: 0x6dbabe20, 0x3a039: 0x6dbac020, 0x3a03a: 0x6dbac220, 0x3a03b: 0x6dbac420, + 0x3a03c: 0x6dbac620, 0x3a03d: 0x6dbac820, 0x3a03e: 0x6dbaca20, 0x3a03f: 0x6dbacc20, + // Block 0xe81, offset 0x3a040 + 0x3a040: 0x6dbace20, 0x3a041: 0x6dbad020, 0x3a042: 0x6dbad220, 0x3a043: 0x6dbad420, + 0x3a044: 0x6dbad620, 0x3a045: 0x6dbad820, 0x3a046: 0x6dbada20, 0x3a047: 0x6dd85a20, + 0x3a048: 0x6dd85c20, 0x3a049: 0x6dd85e20, 0x3a04a: 0x6dd86020, 0x3a04b: 0x6dd86220, + 0x3a04c: 0x6dd86420, 0x3a04d: 0x6dd86620, 0x3a04e: 0x6dd86820, 0x3a04f: 0x6dd86a20, + 0x3a050: 0x6dd86c20, 0x3a051: 0x6dd86e20, 0x3a052: 0x6dd87020, 0x3a053: 0x6dd87220, + 0x3a054: 0x6dd87420, 0x3a055: 0x6dd87620, 0x3a056: 0x6dd87820, 0x3a057: 0x6dd87a20, + 0x3a058: 0x6dd87c20, 0x3a059: 0x6dd87e20, 0x3a05a: 0x6dd88020, 0x3a05b: 0x6dd88220, + 0x3a05c: 0x6dd88420, 0x3a05d: 0x6dd88620, 0x3a05e: 0x6dd88820, 0x3a05f: 0x6dd88a20, + 0x3a060: 0x6dd88c20, 0x3a061: 0x6dd88e20, 0x3a062: 0x6dd89020, 0x3a063: 0x6dd89220, + 0x3a064: 0x6dd89420, 0x3a065: 0x6dd89620, 0x3a066: 0x6dd89820, 0x3a067: 0x6dd89a20, + 0x3a068: 0x6dd89c20, 0x3a069: 0x6dd89e20, 0x3a06a: 0x6dd8a020, 0x3a06b: 0x6dd8a220, + 0x3a06c: 0x6dd8a420, 0x3a06d: 0x6dd8a620, 0x3a06e: 0x6dd8a820, 0x3a06f: 0x6dd8aa20, + 0x3a070: 0x6dd8ac20, 0x3a071: 0x6dd8ae20, 0x3a072: 0x6dd8b020, 0x3a073: 0x6dd8b220, + 0x3a074: 0x6dd8b420, 0x3a075: 0x6dd8b620, 0x3a076: 0x6dd8b820, 0x3a077: 0x6dd8ba20, + 0x3a078: 0x6dd8bc20, 0x3a079: 0x6dd8be20, 0x3a07a: 0x6dd8c020, 0x3a07b: 0x6dd8c220, + 0x3a07c: 0x6dd8c420, 0x3a07d: 0x6dd8c620, 0x3a07e: 0x6dd8c820, 0x3a07f: 0x6dd8ca20, + // Block 0xe82, offset 0x3a080 + 0x3a080: 0x6dd8cc20, 0x3a081: 0x6dd8ce20, 0x3a082: 0x6dd8d020, 0x3a083: 0x6dd8d220, + 0x3a084: 0x6dd8d420, 0x3a085: 0x6dd8d620, 0x3a086: 0x6dd8d820, 0x3a087: 0x6dd8da20, + 0x3a088: 0x6dd8dc20, 0x3a089: 0x6dd8de20, 0x3a08a: 0x6dd8e020, 0x3a08b: 0x6dd8e220, + 0x3a08c: 0x6dd8e420, 0x3a08d: 0x6dd8e620, 0x3a08e: 0x6dd8e820, 0x3a08f: 0x6df0d820, + 0x3a090: 0x6df0da20, 0x3a091: 0x6df0dc20, 0x3a092: 0x6df0de20, 0x3a093: 0x6df0e020, + 0x3a094: 0x6df0e220, 0x3a095: 0x6df0e420, 0x3a096: 0x6df0e620, 0x3a097: 0x6df0e820, + 0x3a098: 0x6df0ea20, 0x3a099: 0x6df0ec20, 0x3a09a: 0x6df0ee20, 0x3a09b: 0x6df0f020, + 0x3a09c: 0x6df0f220, 0x3a09d: 0x6df0f420, 0x3a09e: 0x6df0f620, 0x3a09f: 0x6df0f820, + 0x3a0a0: 0x6df0fa20, 0x3a0a1: 0x6df0fc20, 0x3a0a2: 0x6df0fe20, 0x3a0a3: 0x6df10020, + 0x3a0a4: 0x6df10220, 0x3a0a5: 0x6df10420, 0x3a0a6: 0x6df10620, 0x3a0a7: 0x6df10820, + 0x3a0a8: 0x6df10a20, 0x3a0a9: 0x6df10c20, 0x3a0aa: 0x6df10e20, 0x3a0ab: 0x6df11020, + 0x3a0ac: 0x6df11220, 0x3a0ad: 0x6df11420, 0x3a0ae: 0x6df11620, 0x3a0af: 0x6df11820, + 0x3a0b0: 0x6df11a20, 0x3a0b1: 0x6df11c20, 0x3a0b2: 0x6df11e20, 0x3a0b3: 0x6df12020, + 0x3a0b4: 0x6df12220, 0x3a0b5: 0x6df12420, 0x3a0b6: 0x6df12620, 0x3a0b7: 0x6df12820, + 0x3a0b8: 0x6df12a20, 0x3a0b9: 0x6df12c20, 0x3a0ba: 0x6df12e20, 0x3a0bb: 0x6df13020, + 0x3a0bc: 0x6df13220, 0x3a0bd: 0x6df13420, 0x3a0be: 0x6df13620, 0x3a0bf: 0x6df13820, + // Block 0xe83, offset 0x3a0c0 + 0x3a0c0: 0x6df13a20, 0x3a0c1: 0x6df13c20, 0x3a0c2: 0x6df13e20, 0x3a0c3: 0x6df14020, + 0x3a0c4: 0x6df14220, 0x3a0c5: 0x6df14420, 0x3a0c6: 0x6df14620, 0x3a0c7: 0x6df14820, + 0x3a0c8: 0x6df14a20, 0x3a0c9: 0x6df14c20, 0x3a0ca: 0x6df14e20, 0x3a0cb: 0x6df15020, + 0x3a0cc: 0x6df15220, 0x3a0cd: 0x6e04e420, 0x3a0ce: 0x6e04e620, 0x3a0cf: 0x6e04e820, + 0x3a0d0: 0x6e04ea20, 0x3a0d1: 0x6e04ec20, 0x3a0d2: 0x6e04ee20, 0x3a0d3: 0x6e04f020, + 0x3a0d4: 0x6e04f220, 0x3a0d5: 0x6e15c420, 0x3a0d6: 0x6e04f420, 0x3a0d7: 0x6e04f620, + 0x3a0d8: 0x6e04f820, 0x3a0d9: 0x6e04fa20, 0x3a0da: 0x6e04fc20, 0x3a0db: 0x6e04fe20, + 0x3a0dc: 0x6e050020, 0x3a0dd: 0x6e050220, 0x3a0de: 0x6e050420, 0x3a0df: 0x6e050620, + 0x3a0e0: 0x6e050820, 0x3a0e1: 0x6e050a20, 0x3a0e2: 0x6e050c20, 0x3a0e3: 0x6e050e20, + 0x3a0e4: 0x6e051020, 0x3a0e5: 0x6e051220, 0x3a0e6: 0x6e051420, 0x3a0e7: 0x6e051620, + 0x3a0e8: 0x6e051820, 0x3a0e9: 0x6e051a20, 0x3a0ea: 0x6e051c20, 0x3a0eb: 0x6e051e20, + 0x3a0ec: 0x6e052020, 0x3a0ed: 0x6e052220, 0x3a0ee: 0x6e052420, 0x3a0ef: 0x6e052620, + 0x3a0f0: 0x6e052820, 0x3a0f1: 0x6e052a20, 0x3a0f2: 0x6e052c20, 0x3a0f3: 0x6e052e20, + 0x3a0f4: 0x6e053020, 0x3a0f5: 0x6e053220, 0x3a0f6: 0x6e053420, 0x3a0f7: 0x6e053620, + 0x3a0f8: 0x6e053820, 0x3a0f9: 0x6e053a20, 0x3a0fa: 0x6e053c20, 0x3a0fb: 0x6e053e20, + 0x3a0fc: 0x6e054020, 0x3a0fd: 0x6e054220, 0x3a0fe: 0x6e054420, 0x3a0ff: 0x6e054620, + // Block 0xe84, offset 0x3a100 + 0x3a100: 0x6e054820, 0x3a101: 0x6e054a20, 0x3a102: 0x6e054c20, 0x3a103: 0x6e054e20, + 0x3a104: 0x6e055020, 0x3a105: 0x6e055220, 0x3a106: 0x6e055420, 0x3a107: 0x6e055620, + 0x3a108: 0x6e055820, 0x3a109: 0x6e055a20, 0x3a10a: 0x6e055c20, 0x3a10b: 0x6e055e20, + 0x3a10c: 0x6e056020, 0x3a10d: 0x6e056220, 0x3a10e: 0x6e056420, 0x3a10f: 0x6e056620, + 0x3a110: 0x6e056820, 0x3a111: 0x6e056a20, 0x3a112: 0x6e056c20, 0x3a113: 0x6e056e20, + 0x3a114: 0x6e057020, 0x3a115: 0x6e15c620, 0x3a116: 0x6e15c820, 0x3a117: 0x6e15ca20, + 0x3a118: 0x6e15cc20, 0x3a119: 0x6e15ce20, 0x3a11a: 0x6e15d020, 0x3a11b: 0x6e15d220, + 0x3a11c: 0x6e15d420, 0x3a11d: 0x6e15d620, 0x3a11e: 0x6e15d820, 0x3a11f: 0x6e15da20, + 0x3a120: 0x6e15dc20, 0x3a121: 0x6e15de20, 0x3a122: 0x6e15e020, 0x3a123: 0x6e15e220, + 0x3a124: 0x6e15e420, 0x3a125: 0x6e15e620, 0x3a126: 0x6e15e820, 0x3a127: 0x6e15ea20, + 0x3a128: 0x6e15ec20, 0x3a129: 0x6e15ee20, 0x3a12a: 0x6e15f020, 0x3a12b: 0x6e15f220, + 0x3a12c: 0x6e15f420, 0x3a12d: 0x6e15f620, 0x3a12e: 0x6e15f820, 0x3a12f: 0x6e15fa20, + 0x3a130: 0x6e15fc20, 0x3a131: 0x6e15fe20, 0x3a132: 0x6e160020, 0x3a133: 0x6e160220, + 0x3a134: 0x6e160420, 0x3a135: 0x6e160620, 0x3a136: 0x6e160820, 0x3a137: 0x6e160a20, + 0x3a138: 0x6e160c20, 0x3a139: 0x6e160e20, 0x3a13a: 0x6e161020, 0x3a13b: 0x6e161220, + 0x3a13c: 0x6e161420, 0x3a13d: 0x6e161620, 0x3a13e: 0x6e161820, 0x3a13f: 0x6e161a20, + // Block 0xe85, offset 0x3a140 + 0x3a140: 0x6e161c20, 0x3a141: 0x6e161e20, 0x3a142: 0x6e162020, 0x3a143: 0x6e162220, + 0x3a144: 0x6e162420, 0x3a145: 0x6e162620, 0x3a146: 0x6e162820, 0x3a147: 0x6e162a20, + 0x3a148: 0x6e162c20, 0x3a149: 0x6e162e20, 0x3a14a: 0x6e163020, 0x3a14b: 0x6e163220, + 0x3a14c: 0x6e163420, 0x3a14d: 0x6e163620, 0x3a14e: 0x6e163820, 0x3a14f: 0x6e163a20, + 0x3a150: 0x6e163c20, 0x3a151: 0x6e163e20, 0x3a152: 0x6e233e20, 0x3a153: 0x6e234020, + 0x3a154: 0x6e234220, 0x3a155: 0x6e234420, 0x3a156: 0x6e234620, 0x3a157: 0x6e234820, + 0x3a158: 0x6e234a20, 0x3a159: 0x6e234c20, 0x3a15a: 0x6e234e20, 0x3a15b: 0x6e235020, + 0x3a15c: 0x6e235220, 0x3a15d: 0x6e235420, 0x3a15e: 0x6e235620, 0x3a15f: 0x6e235820, + 0x3a160: 0x6e235a20, 0x3a161: 0x6e235c20, 0x3a162: 0x6e235e20, 0x3a163: 0x6e236020, + 0x3a164: 0x6e236220, 0x3a165: 0x6e236420, 0x3a166: 0x6e236620, 0x3a167: 0x6e236820, + 0x3a168: 0x6e236a20, 0x3a169: 0x6e236c20, 0x3a16a: 0x6e236e20, 0x3a16b: 0x6e237020, + 0x3a16c: 0x6e237220, 0x3a16d: 0x6e237420, 0x3a16e: 0x6e237620, 0x3a16f: 0x6e237820, + 0x3a170: 0x6e237a20, 0x3a171: 0x6e237c20, 0x3a172: 0x6e237e20, 0x3a173: 0x6e238020, + 0x3a174: 0x6e238220, 0x3a175: 0x6e238420, 0x3a176: 0x6e238620, 0x3a177: 0x6e238820, + 0x3a178: 0x6e2d6a20, 0x3a179: 0x6e2d6c20, 0x3a17a: 0x6e2d6e20, 0x3a17b: 0x6e2d7020, + 0x3a17c: 0x6e2d7220, 0x3a17d: 0x6e2d7420, 0x3a17e: 0x6e2d7620, 0x3a17f: 0x6e2d7820, + // Block 0xe86, offset 0x3a180 + 0x3a180: 0x6e2d7a20, 0x3a181: 0x6e2d7c20, 0x3a182: 0x6e2d7e20, 0x3a183: 0x6e2d8020, + 0x3a184: 0x6e2d8220, 0x3a185: 0x6e2d8420, 0x3a186: 0x6e2d8620, 0x3a187: 0x6e2d8820, + 0x3a188: 0x6e2d8a20, 0x3a189: 0x6e2d8c20, 0x3a18a: 0x6e2d8e20, 0x3a18b: 0x6e2d9020, + 0x3a18c: 0x6e2d9220, 0x3a18d: 0x6e2d9420, 0x3a18e: 0x6e2d9620, 0x3a18f: 0x6e2d9820, + 0x3a190: 0x6e2d9a20, 0x3a191: 0x6e2d9c20, 0x3a192: 0x6e2d9e20, 0x3a193: 0x6e2da020, + 0x3a194: 0x6e2da220, 0x3a195: 0x6e2da420, 0x3a196: 0x6e2da620, 0x3a197: 0x6e2da820, + 0x3a198: 0x6e2daa20, 0x3a199: 0x6e2dac20, 0x3a19a: 0x6e2dae20, 0x3a19b: 0x6e2db020, + 0x3a19c: 0x6e2db220, 0x3a19d: 0x6e352620, 0x3a19e: 0x6e352820, 0x3a19f: 0x6e352a20, + 0x3a1a0: 0x6e352c20, 0x3a1a1: 0x6e352e20, 0x3a1a2: 0x6e353020, 0x3a1a3: 0x6e353220, + 0x3a1a4: 0x6e353420, 0x3a1a5: 0x6e353620, 0x3a1a6: 0x6e353820, 0x3a1a7: 0x6e353a20, + 0x3a1a8: 0x6e353c20, 0x3a1a9: 0x6e353e20, 0x3a1aa: 0x6e354020, 0x3a1ab: 0x6e354220, + 0x3a1ac: 0x6e354420, 0x3a1ad: 0x6e354620, 0x3a1ae: 0x6e354820, 0x3a1af: 0x6e354a20, + 0x3a1b0: 0x6e354c20, 0x3a1b1: 0x6e354e20, 0x3a1b2: 0x6e355020, 0x3a1b3: 0x6e355220, + 0x3a1b4: 0x6e355420, 0x3a1b5: 0x6e355620, 0x3a1b6: 0x6e355820, 0x3a1b7: 0x6e355a20, + 0x3a1b8: 0x6e355c20, 0x3a1b9: 0x6e355e20, 0x3a1ba: 0x6e3ac220, 0x3a1bb: 0x6e3ac420, + 0x3a1bc: 0x6e3ac620, 0x3a1bd: 0x6e3ac820, 0x3a1be: 0x6e3aca20, 0x3a1bf: 0x6e3acc20, + // Block 0xe87, offset 0x3a1c0 + 0x3a1c0: 0x6e3ace20, 0x3a1c1: 0x6e3ad020, 0x3a1c2: 0x6e3ad220, 0x3a1c3: 0x6e3ad420, + 0x3a1c4: 0x6e3ad620, 0x3a1c5: 0x6e3ad820, 0x3a1c6: 0x6e3ada20, 0x3a1c7: 0x6e3adc20, + 0x3a1c8: 0x6e3ade20, 0x3a1c9: 0x6e3e8420, 0x3a1ca: 0x6e3e8620, 0x3a1cb: 0x6e3e8820, + 0x3a1cc: 0x6e3e8a20, 0x3a1cd: 0x6e3e8c20, 0x3a1ce: 0x6e3e8e20, 0x3a1cf: 0x6e3e9020, + 0x3a1d0: 0x6e3e9220, 0x3a1d1: 0x6e3e9420, 0x3a1d2: 0x6e3e9620, 0x3a1d3: 0x6e3e9820, + 0x3a1d4: 0x6e3e9a20, 0x3a1d5: 0x6e3e9c20, 0x3a1d6: 0x6e3e9e20, 0x3a1d7: 0x6e3ea020, + 0x3a1d8: 0x6e3ea220, 0x3a1d9: 0x6e3ea420, 0x3a1da: 0x6e3ea620, 0x3a1db: 0x6e3ea820, + 0x3a1dc: 0x6e3eaa20, 0x3a1dd: 0x6e3eac20, 0x3a1de: 0x6e414820, 0x3a1df: 0x6e414a20, + 0x3a1e0: 0x6e414c20, 0x3a1e1: 0x6e414e20, 0x3a1e2: 0x6e415020, 0x3a1e3: 0x6e415220, + 0x3a1e4: 0x6e415420, 0x3a1e5: 0x6e415620, 0x3a1e6: 0x6e415820, 0x3a1e7: 0x6e415a20, + 0x3a1e8: 0x6e415c20, 0x3a1e9: 0x6e434820, 0x3a1ea: 0x6e434a20, 0x3a1eb: 0x6e434c20, + 0x3a1ec: 0x6e434e20, 0x3a1ed: 0x6e435020, 0x3a1ee: 0x6e435220, 0x3a1ef: 0x6e435420, + 0x3a1f0: 0x6e435620, 0x3a1f1: 0x6e3ae020, 0x3a1f2: 0x6e449820, 0x3a1f3: 0x6e449a20, + 0x3a1f4: 0x6e449c20, 0x3a1f5: 0x6e449e20, 0x3a1f6: 0x6e44a020, 0x3a1f7: 0x6e456820, + 0x3a1f8: 0x6e456a20, 0x3a1f9: 0x6e456c20, 0x3a1fa: 0x6e45e620, 0x3a1fb: 0x6e464020, + 0x3a1fc: 0x6e46d020, 0x3a1fd: 0x6e471620, 0x3a1fe: 0x6c41f620, 0x3a1ff: 0x6c41f820, + // Block 0xe88, offset 0x3a200 + 0x3a200: 0x6c629620, 0x3a201: 0x6c629820, 0x3a202: 0x6c629a20, 0x3a203: 0x6c897220, + 0x3a204: 0x6c897420, 0x3a205: 0x6c897620, 0x3a206: 0x6c897820, 0x3a207: 0x6ce56620, + 0x3a208: 0x6ce56820, 0x3a209: 0x6d13dc20, 0x3a20a: 0x6d13de20, 0x3a20b: 0x6d13e020, + 0x3a20c: 0x6d13e220, 0x3a20d: 0x6d6ef220, 0x3a20e: 0x6d41ec20, 0x3a20f: 0x6d6ef420, + 0x3a210: 0x6d980420, 0x3a211: 0x6dbb0620, 0x3a212: 0x6d980620, 0x3a213: 0x6dbb0820, + 0x3a214: 0x6dbb0a20, 0x3a215: 0x6dd90820, 0x3a216: 0x6dd90a20, 0x3a217: 0x6c280020, + 0x3a218: 0x6c280220, 0x3a219: 0x6c62aa20, 0x3a21a: 0x6cb58e20, 0x3a21b: 0x6cb59020, + 0x3a21c: 0x6cb59220, 0x3a21d: 0x6cb59420, 0x3a21e: 0x6cb59620, 0x3a21f: 0x6cb59820, + 0x3a220: 0x6cb59a20, 0x3a221: 0x6cb59c20, 0x3a222: 0x6cb59e20, 0x3a223: 0x6cb5a020, + 0x3a224: 0x6cb5a220, 0x3a225: 0x6cb5a420, 0x3a226: 0x6ce57420, 0x3a227: 0x6ce57620, + 0x3a228: 0x6ce57820, 0x3a229: 0x6ce57a20, 0x3a22a: 0x6ce57c20, 0x3a22b: 0x6ce57e20, + 0x3a22c: 0x6ce58020, 0x3a22d: 0x6ce58220, 0x3a22e: 0x6ce58420, 0x3a22f: 0x6ce58620, + 0x3a230: 0x6ce58820, 0x3a231: 0x6ce58a20, 0x3a232: 0x6d13fa20, 0x3a233: 0x6d13fc20, + 0x3a234: 0x6d13fe20, 0x3a235: 0x6d140020, 0x3a236: 0x6d140220, 0x3a237: 0x6d140420, + 0x3a238: 0x6d140620, 0x3a239: 0x6d140820, 0x3a23a: 0x6d140a20, 0x3a23b: 0x6d140c20, + 0x3a23c: 0x6d140e20, 0x3a23d: 0x6d141020, 0x3a23e: 0x6d141220, 0x3a23f: 0x6d141420, + // Block 0xe89, offset 0x3a240 + 0x3a240: 0x6d41fe20, 0x3a241: 0x6d420020, 0x3a242: 0x6d420220, 0x3a243: 0x6d420420, + 0x3a244: 0x6d420620, 0x3a245: 0x6d420820, 0x3a246: 0x6d420a20, 0x3a247: 0x6d6f0220, + 0x3a248: 0x6d6f0420, 0x3a249: 0x6d6f0620, 0x3a24a: 0x6d6f0820, 0x3a24b: 0x6d6f0a20, + 0x3a24c: 0x6d6f0c20, 0x3a24d: 0x6d6f0e20, 0x3a24e: 0x6d6f1020, 0x3a24f: 0x6d6f1220, + 0x3a250: 0x6d6f1420, 0x3a251: 0x6d6f1620, 0x3a252: 0x6d6f1820, 0x3a253: 0x6d980e20, + 0x3a254: 0x6d981020, 0x3a255: 0x6d981220, 0x3a256: 0x6d981420, 0x3a257: 0x6d981620, + 0x3a258: 0x6d981820, 0x3a259: 0x6d981a20, 0x3a25a: 0x6d981c20, 0x3a25b: 0x6d981e20, + 0x3a25c: 0x6d982020, 0x3a25d: 0x6d982220, 0x3a25e: 0x6dbb1620, 0x3a25f: 0x6dbb1820, + 0x3a260: 0x6dbb1a20, 0x3a261: 0x6dbb1c20, 0x3a262: 0x6dbb1e20, 0x3a263: 0x6dbb2020, + 0x3a264: 0x6dbb2220, 0x3a265: 0x6dd91020, 0x3a266: 0x6dd91220, 0x3a267: 0x6dd91420, + 0x3a268: 0x6dd91620, 0x3a269: 0x6dd91820, 0x3a26a: 0x6dd91a20, 0x3a26b: 0x6dd91c20, + 0x3a26c: 0x6dd91e20, 0x3a26d: 0x6df16820, 0x3a26e: 0x6df16a20, 0x3a26f: 0x6df16c20, + 0x3a270: 0x6df16e20, 0x3a271: 0x6df17020, 0x3a272: 0x6df17220, 0x3a273: 0x6e059620, + 0x3a274: 0x6e059820, 0x3a275: 0x6e059a20, 0x3a276: 0x6e059c20, 0x3a277: 0x6e059e20, + 0x3a278: 0x6e165020, 0x3a279: 0x6e165220, 0x3a27a: 0x6e165420, 0x3a27b: 0x6e239a20, + 0x3a27c: 0x6e239c20, 0x3a27d: 0x6e239e20, 0x3a27e: 0x6e23a020, 0x3a27f: 0x6e23a220, + // Block 0xe8a, offset 0x3a280 + 0x3a280: 0x6e2dba20, 0x3a281: 0x6e2dbc20, 0x3a282: 0x6e356820, 0x3a283: 0x6e356a20, + 0x3a284: 0x6e3eb020, 0x3a285: 0x6e435a20, 0x3a286: 0x6e44a220, 0x3a287: 0x6c420420, + 0x3a288: 0x6c420620, 0x3a289: 0x6c62b020, 0x3a28a: 0x6c898a20, 0x3a28b: 0x6c898c20, + 0x3a28c: 0x6c898e20, 0x3a28d: 0x6c899020, 0x3a28e: 0x6c899220, 0x3a28f: 0x6c899420, + 0x3a290: 0x6cb5b420, 0x3a291: 0x6cb5b620, 0x3a292: 0x6cb5b820, 0x3a293: 0x6cb5ba20, + 0x3a294: 0x6cb5bc20, 0x3a295: 0x6cb5be20, 0x3a296: 0x6cb5c020, 0x3a297: 0x6ce5ae20, + 0x3a298: 0x6ce5b020, 0x3a299: 0x6ce5b220, 0x3a29a: 0x6ce5b420, 0x3a29b: 0x6ce5b620, + 0x3a29c: 0x6ce5b820, 0x3a29d: 0x6ce5ba20, 0x3a29e: 0x6ce5bc20, 0x3a29f: 0x6ce5be20, + 0x3a2a0: 0x6ce5c020, 0x3a2a1: 0x6ce5c220, 0x3a2a2: 0x6ce5c420, 0x3a2a3: 0x6ce5c620, + 0x3a2a4: 0x6ce5c820, 0x3a2a5: 0x6ce5ca20, 0x3a2a6: 0x6ce5cc20, 0x3a2a7: 0x6ce5ce20, + 0x3a2a8: 0x6ce5d020, 0x3a2a9: 0x6ce5d220, 0x3a2aa: 0x6ce5d420, 0x3a2ab: 0x6ce5d620, + 0x3a2ac: 0x6ce5d820, 0x3a2ad: 0x6ce5da20, 0x3a2ae: 0x6ce5dc20, 0x3a2af: 0x6ce5de20, + 0x3a2b0: 0x6ce5e020, 0x3a2b1: 0x6ce5e220, 0x3a2b2: 0x6ce5e420, 0x3a2b3: 0x6d143020, + 0x3a2b4: 0x6d143220, 0x3a2b5: 0x6d143420, 0x3a2b6: 0x6d143620, 0x3a2b7: 0x6d143820, + 0x3a2b8: 0x6d143a20, 0x3a2b9: 0x6d143c20, 0x3a2ba: 0x6d143e20, 0x3a2bb: 0x6d144020, + 0x3a2bc: 0x6d144220, 0x3a2bd: 0x6d144420, 0x3a2be: 0x6d144620, 0x3a2bf: 0x6d144820, + // Block 0xe8b, offset 0x3a2c0 + 0x3a2c0: 0x6d144a20, 0x3a2c1: 0x6d144c20, 0x3a2c2: 0x6d144e20, 0x3a2c3: 0x6d145020, + 0x3a2c4: 0x6d145220, 0x3a2c5: 0x6d145420, 0x3a2c6: 0x6d145620, 0x3a2c7: 0x6d145820, + 0x3a2c8: 0x6d145a20, 0x3a2c9: 0x6d145c20, 0x3a2ca: 0x6d145e20, 0x3a2cb: 0x6d146020, + 0x3a2cc: 0x6d146220, 0x3a2cd: 0x6d422e20, 0x3a2ce: 0x6d423020, 0x3a2cf: 0x6d423220, + 0x3a2d0: 0x6d423420, 0x3a2d1: 0x6d423620, 0x3a2d2: 0x6d423820, 0x3a2d3: 0x6d423a20, + 0x3a2d4: 0x6d423c20, 0x3a2d5: 0x6d423e20, 0x3a2d6: 0x6d424020, 0x3a2d7: 0x6d424220, + 0x3a2d8: 0x6d424420, 0x3a2d9: 0x6d424620, 0x3a2da: 0x6d424820, 0x3a2db: 0x6d424a20, + 0x3a2dc: 0x6d424c20, 0x3a2dd: 0x6d424e20, 0x3a2de: 0x6d425020, 0x3a2df: 0x6d425220, + 0x3a2e0: 0x6d425420, 0x3a2e1: 0x6d425620, 0x3a2e2: 0x6d425820, 0x3a2e3: 0x6d425a20, + 0x3a2e4: 0x6d425c20, 0x3a2e5: 0x6d425e20, 0x3a2e6: 0x6d426020, 0x3a2e7: 0x6d6f3820, + 0x3a2e8: 0x6d6f3a20, 0x3a2e9: 0x6d6f3c20, 0x3a2ea: 0x6d6f3e20, 0x3a2eb: 0x6d6f4020, + 0x3a2ec: 0x6d6f4220, 0x3a2ed: 0x6d6f4420, 0x3a2ee: 0x6d6f4620, 0x3a2ef: 0x6d6f4820, + 0x3a2f0: 0x6d6f4a20, 0x3a2f1: 0x6d6f4c20, 0x3a2f2: 0x6d6f4e20, 0x3a2f3: 0x6d6f5020, + 0x3a2f4: 0x6d6f5220, 0x3a2f5: 0x6d6f5420, 0x3a2f6: 0x6d6f5620, 0x3a2f7: 0x6d6f5820, + 0x3a2f8: 0x6d6f5a20, 0x3a2f9: 0x6d6f5c20, 0x3a2fa: 0x6d6f5e20, 0x3a2fb: 0x6d6f6020, + 0x3a2fc: 0x6d6f6220, 0x3a2fd: 0x6d6f6420, 0x3a2fe: 0x6d6f6620, 0x3a2ff: 0x6d6f6820, + // Block 0xe8c, offset 0x3a300 + 0x3a300: 0x6d6f6a20, 0x3a301: 0x6d6f6c20, 0x3a302: 0x6d6f6e20, 0x3a303: 0x6d6f7020, + 0x3a304: 0x6d6f7220, 0x3a305: 0x6d6f7420, 0x3a306: 0x6d6f7620, 0x3a307: 0x6d6f7820, + 0x3a308: 0x6d984e20, 0x3a309: 0x6d985020, 0x3a30a: 0x6d985220, 0x3a30b: 0x6d985420, + 0x3a30c: 0x6d985620, 0x3a30d: 0x6d985820, 0x3a30e: 0x6d985a20, 0x3a30f: 0x6d985c20, + 0x3a310: 0x6d985e20, 0x3a311: 0x6d986020, 0x3a312: 0x6d986220, 0x3a313: 0x6d986420, + 0x3a314: 0x6d986620, 0x3a315: 0x6d986820, 0x3a316: 0x6d986a20, 0x3a317: 0x6d986c20, + 0x3a318: 0x6d986e20, 0x3a319: 0x6d987020, 0x3a31a: 0x6d987220, 0x3a31b: 0x6d987420, + 0x3a31c: 0x6d987620, 0x3a31d: 0x6d987820, 0x3a31e: 0x6d987a20, 0x3a31f: 0x6d987c20, + 0x3a320: 0x6d987e20, 0x3a321: 0x6d988020, 0x3a322: 0x6d988220, 0x3a323: 0x6d988420, + 0x3a324: 0x6d988620, 0x3a325: 0x6dbb4e20, 0x3a326: 0x6dbb5020, 0x3a327: 0x6dbb5220, + 0x3a328: 0x6dbb5420, 0x3a329: 0x6dbb5620, 0x3a32a: 0x6dbb5820, 0x3a32b: 0x6dbb5a20, + 0x3a32c: 0x6dbb5c20, 0x3a32d: 0x6dbb5e20, 0x3a32e: 0x6dbb6020, 0x3a32f: 0x6dbb6220, + 0x3a330: 0x6dbb6420, 0x3a331: 0x6dbb6620, 0x3a332: 0x6dbb6820, 0x3a333: 0x6dbb6a20, + 0x3a334: 0x6dbb6c20, 0x3a335: 0x6dbb6e20, 0x3a336: 0x6dbb7020, 0x3a337: 0x6dbb7220, + 0x3a338: 0x6dbb7420, 0x3a339: 0x6dbb7620, 0x3a33a: 0x6dbb7820, 0x3a33b: 0x6dbb7a20, + 0x3a33c: 0x6dbb7c20, 0x3a33d: 0x6dbb7e20, 0x3a33e: 0x6dbb8020, 0x3a33f: 0x6dbb8220, + // Block 0xe8d, offset 0x3a340 + 0x3a340: 0x6dd93220, 0x3a341: 0x6dd93420, 0x3a342: 0x6dd93620, 0x3a343: 0x6dd93820, + 0x3a344: 0x6dd93a20, 0x3a345: 0x6dd93c20, 0x3a346: 0x6dd93e20, 0x3a347: 0x6dd94020, + 0x3a348: 0x6dd94220, 0x3a349: 0x6dd94420, 0x3a34a: 0x6dd94620, 0x3a34b: 0x6dd94820, + 0x3a34c: 0x6dd94a20, 0x3a34d: 0x6dd94c20, 0x3a34e: 0x6dd94e20, 0x3a34f: 0x6dd95020, + 0x3a350: 0x6dd95220, 0x3a351: 0x6dd95420, 0x3a352: 0x6dd95620, 0x3a353: 0x6dd95820, + 0x3a354: 0x6dd95a20, 0x3a355: 0x6dd95c20, 0x3a356: 0x6dd95e20, 0x3a357: 0x6dd96020, + 0x3a358: 0x6dd96220, 0x3a359: 0x6dd96420, 0x3a35a: 0x6dd96620, 0x3a35b: 0x6dd96820, + 0x3a35c: 0x6df18020, 0x3a35d: 0x6df18220, 0x3a35e: 0x6df18420, 0x3a35f: 0x6df18620, + 0x3a360: 0x6df18820, 0x3a361: 0x6df18a20, 0x3a362: 0x6df18c20, 0x3a363: 0x6df18e20, + 0x3a364: 0x6df19020, 0x3a365: 0x6df19220, 0x3a366: 0x6df19420, 0x3a367: 0x6df19620, + 0x3a368: 0x6df19820, 0x3a369: 0x6df19a20, 0x3a36a: 0x6df19c20, 0x3a36b: 0x6df19e20, + 0x3a36c: 0x6e05aa20, 0x3a36d: 0x6e05ac20, 0x3a36e: 0x6e05ae20, 0x3a36f: 0x6e05b020, + 0x3a370: 0x6e05b220, 0x3a371: 0x6e05b420, 0x3a372: 0x6e05b620, 0x3a373: 0x6e05b820, + 0x3a374: 0x6e05ba20, 0x3a375: 0x6e05bc20, 0x3a376: 0x6e05be20, 0x3a377: 0x6e05c020, + 0x3a378: 0x6e05c220, 0x3a379: 0x6e05c420, 0x3a37a: 0x6e05c620, 0x3a37b: 0x6e05c820, + 0x3a37c: 0x6e05ca20, 0x3a37d: 0x6e05cc20, 0x3a37e: 0x6e05ce20, 0x3a37f: 0x6e05d020, + // Block 0xe8e, offset 0x3a380 + 0x3a380: 0x6e05d220, 0x3a381: 0x6e05d420, 0x3a382: 0x6e05d620, 0x3a383: 0x6e166620, + 0x3a384: 0x6e166820, 0x3a385: 0x6e166a20, 0x3a386: 0x6e166c20, 0x3a387: 0x6e166e20, + 0x3a388: 0x6e167020, 0x3a389: 0x6e167220, 0x3a38a: 0x6e167420, 0x3a38b: 0x6e167620, + 0x3a38c: 0x6e167820, 0x3a38d: 0x6e167a20, 0x3a38e: 0x6e167c20, 0x3a38f: 0x6e167e20, + 0x3a390: 0x6e168020, 0x3a391: 0x6e168220, 0x3a392: 0x6e168420, 0x3a393: 0x6e168620, + 0x3a394: 0x6e23a820, 0x3a395: 0x6e168820, 0x3a396: 0x6e168a20, 0x3a397: 0x6e168c20, + 0x3a398: 0x6e23aa20, 0x3a399: 0x6e23ac20, 0x3a39a: 0x6e23ae20, 0x3a39b: 0x6e23b020, + 0x3a39c: 0x6e23b220, 0x3a39d: 0x6e23b420, 0x3a39e: 0x6e23b620, 0x3a39f: 0x6e2dbe20, + 0x3a3a0: 0x6e2dc020, 0x3a3a1: 0x6e2dc220, 0x3a3a2: 0x6e2dc420, 0x3a3a3: 0x6e2dc620, + 0x3a3a4: 0x6e2dc820, 0x3a3a5: 0x6e2dca20, 0x3a3a6: 0x6e356c20, 0x3a3a7: 0x6e356e20, + 0x3a3a8: 0x6e357020, 0x3a3a9: 0x6e357220, 0x3a3aa: 0x6e357420, 0x3a3ab: 0x6e357620, + 0x3a3ac: 0x6e357820, 0x3a3ad: 0x6e357a20, 0x3a3ae: 0x6e357c20, 0x3a3af: 0x6e3ae820, + 0x3a3b0: 0x6e3aea20, 0x3a3b1: 0x6e3aec20, 0x3a3b2: 0x6e3aee20, 0x3a3b3: 0x6e3af020, + 0x3a3b4: 0x6e3af220, 0x3a3b5: 0x6e3af420, 0x3a3b6: 0x6e357e20, 0x3a3b7: 0x6e3eb220, + 0x3a3b8: 0x6e3af620, 0x3a3b9: 0x6e3eb420, 0x3a3ba: 0x6e3eb620, 0x3a3bb: 0x6e416020, + 0x3a3bc: 0x6e44a420, 0x3a3bd: 0x6e464220, 0x3a3be: 0x6e464420, 0x3a3bf: 0x6c159a20, + // Block 0xe8f, offset 0x3a3c0 + 0x3a3c0: 0x6c159c20, 0x3a3c1: 0x6c159e20, 0x3a3c2: 0x6c281420, 0x3a3c3: 0x6c281620, + 0x3a3c4: 0x6c62c620, 0x3a3c5: 0x6c62c820, 0x3a3c6: 0x6ce5f420, 0x3a3c7: 0x6ce5f620, + 0x3a3c8: 0x6ce5f820, 0x3a3c9: 0x6d147620, 0x3a3ca: 0x6d147820, 0x3a3cb: 0x6d6f8420, + 0x3a3cc: 0x6d6f8620, 0x3a3cd: 0x6dbb8820, 0x3a3ce: 0x6e05d820, 0x3a3cf: 0x6c00d020, + 0x3a3d0: 0x6c052820, 0x3a3d1: 0x6c052a20, 0x3a3d2: 0x6c052c20, 0x3a3d3: 0x6c052e20, + 0x3a3d4: 0x6c053020, 0x3a3d5: 0x6c053220, 0x3a3d6: 0x6c0ab820, 0x3a3d7: 0x6c0aba20, + 0x3a3d8: 0x6c0abc20, 0x3a3d9: 0x6c0abe20, 0x3a3da: 0x6c15b020, 0x3a3db: 0x6c15b220, + 0x3a3dc: 0x6c15b420, 0x3a3dd: 0x6c15b620, 0x3a3de: 0x6c15b820, 0x3a3df: 0x6c15ba20, + 0x3a3e0: 0x6c15bc20, 0x3a3e1: 0x6c15be20, 0x3a3e2: 0x6c15c020, 0x3a3e3: 0x6c15c220, + 0x3a3e4: 0x6c15c420, 0x3a3e5: 0x6c15c620, 0x3a3e6: 0x6c15c820, 0x3a3e7: 0x6c15ca20, + 0x3a3e8: 0x6c15cc20, 0x3a3e9: 0x6c15ce20, 0x3a3ea: 0x6c284a20, 0x3a3eb: 0x6c284c20, + 0x3a3ec: 0x6c284e20, 0x3a3ed: 0x6c285020, 0x3a3ee: 0x6c285220, 0x3a3ef: 0x6c285420, + 0x3a3f0: 0x6c285620, 0x3a3f1: 0x6c285820, 0x3a3f2: 0x6c285a20, 0x3a3f3: 0x6c285c20, + 0x3a3f4: 0x6c285e20, 0x3a3f5: 0x6c286020, 0x3a3f6: 0x6c286220, 0x3a3f7: 0x6c286420, + 0x3a3f8: 0x6c286620, 0x3a3f9: 0x6c286820, 0x3a3fa: 0x6c286a20, 0x3a3fb: 0x6c286c20, + 0x3a3fc: 0x6c286e20, 0x3a3fd: 0x6c287020, 0x3a3fe: 0x6c287220, 0x3a3ff: 0x6c287420, + // Block 0xe90, offset 0x3a400 + 0x3a400: 0x6c287620, 0x3a401: 0x6c423e20, 0x3a402: 0x6c424020, 0x3a403: 0x6c424220, + 0x3a404: 0x6c424420, 0x3a405: 0x6c424620, 0x3a406: 0x6c424820, 0x3a407: 0x6c424a20, + 0x3a408: 0x6c424c20, 0x3a409: 0x6c424e20, 0x3a40a: 0x6c425020, 0x3a40b: 0x6c425220, + 0x3a40c: 0x6c425420, 0x3a40d: 0x6c425620, 0x3a40e: 0x6c425820, 0x3a40f: 0x6c425a20, + 0x3a410: 0x6c425c20, 0x3a411: 0x6c425e20, 0x3a412: 0x6c426020, 0x3a413: 0x6c426220, + 0x3a414: 0x6c426420, 0x3a415: 0x6c426620, 0x3a416: 0x6c426820, 0x3a417: 0x6c426a20, + 0x3a418: 0x6c62ee20, 0x3a419: 0x6c62f020, 0x3a41a: 0x6c62f220, 0x3a41b: 0x6c62f420, + 0x3a41c: 0x6c62f620, 0x3a41d: 0x6c62f820, 0x3a41e: 0x6c62fa20, 0x3a41f: 0x6c62fc20, + 0x3a420: 0x6c62fe20, 0x3a421: 0x6c630020, 0x3a422: 0x6c630220, 0x3a423: 0x6c630420, + 0x3a424: 0x6c630620, 0x3a425: 0x6c630820, 0x3a426: 0x6c630a20, 0x3a427: 0x6c630c20, + 0x3a428: 0x6c630e20, 0x3a429: 0x6c631020, 0x3a42a: 0x6c631220, 0x3a42b: 0x6c631420, + 0x3a42c: 0x6c631620, 0x3a42d: 0x6c631820, 0x3a42e: 0x6c631a20, 0x3a42f: 0x6c631c20, + 0x3a430: 0x6c631e20, 0x3a431: 0x6c632020, 0x3a432: 0x6c632220, 0x3a433: 0x6c632420, + 0x3a434: 0x6c6bf420, 0x3a435: 0x6c89da20, 0x3a436: 0x6c89dc20, 0x3a437: 0x6c89de20, + 0x3a438: 0x6c89e020, 0x3a439: 0x6c89e220, 0x3a43a: 0x6c89e420, 0x3a43b: 0x6c89e620, + 0x3a43c: 0x6c89e820, 0x3a43d: 0x6c89ea20, 0x3a43e: 0x6c89ec20, 0x3a43f: 0x6c89ee20, + // Block 0xe91, offset 0x3a440 + 0x3a440: 0x6c89f020, 0x3a441: 0x6c89f220, 0x3a442: 0x6c89f420, 0x3a443: 0x6c89f620, + 0x3a444: 0x6c89f820, 0x3a445: 0x6c89fa20, 0x3a446: 0x6c89fc20, 0x3a447: 0x6c89fe20, + 0x3a448: 0x6c8a0020, 0x3a449: 0x6c8a0220, 0x3a44a: 0x6c8a0420, 0x3a44b: 0x6c8a0620, + 0x3a44c: 0x6c8a0820, 0x3a44d: 0x6c8a0a20, 0x3a44e: 0x6c8a0c20, 0x3a44f: 0x6c8a0e20, + 0x3a450: 0x6c8a1020, 0x3a451: 0x6c8a1220, 0x3a452: 0x6c8a1420, 0x3a453: 0x6c8a1620, + 0x3a454: 0x6c8a1820, 0x3a455: 0x6c8a1a20, 0x3a456: 0x6c8a1c20, 0x3a457: 0x6c8a1e20, + 0x3a458: 0x6c8a2020, 0x3a459: 0x6c8a2220, 0x3a45a: 0x6c8a2420, 0x3a45b: 0x6c8a2620, + 0x3a45c: 0x6c8a2820, 0x3a45d: 0x6c8a2a20, 0x3a45e: 0x6cb60a20, 0x3a45f: 0x6cb60c20, + 0x3a460: 0x6cb60e20, 0x3a461: 0x6cb61020, 0x3a462: 0x6cb61220, 0x3a463: 0x6cb61420, + 0x3a464: 0x6cb61620, 0x3a465: 0x6cb61820, 0x3a466: 0x6cb61a20, 0x3a467: 0x6cb61c20, + 0x3a468: 0x6cb61e20, 0x3a469: 0x6cb62020, 0x3a46a: 0x6cb62220, 0x3a46b: 0x6cb62420, + 0x3a46c: 0x6cb62620, 0x3a46d: 0x6cb62820, 0x3a46e: 0x6cb62a20, 0x3a46f: 0x6cb62c20, + 0x3a470: 0x6cb62e20, 0x3a471: 0x6cb63020, 0x3a472: 0x6cb63220, 0x3a473: 0x6cb63420, + 0x3a474: 0x6cb63620, 0x3a475: 0x6cb63820, 0x3a476: 0x6cb63a20, 0x3a477: 0x6cb63c20, + 0x3a478: 0x6cb63e20, 0x3a479: 0x6cb64020, 0x3a47a: 0x6cb64220, 0x3a47b: 0x6cb64420, + 0x3a47c: 0x6cb64620, 0x3a47d: 0x6cb64820, 0x3a47e: 0x6cb64a20, 0x3a47f: 0x6cb64c20, + // Block 0xe92, offset 0x3a480 + 0x3a480: 0x6ce62a20, 0x3a481: 0x6ce62c20, 0x3a482: 0x6ce62e20, 0x3a483: 0x6ce63020, + 0x3a484: 0x6ce63220, 0x3a485: 0x6ce63420, 0x3a486: 0x6ce63620, 0x3a487: 0x6ce63820, + 0x3a488: 0x6ce63a20, 0x3a489: 0x6ce63c20, 0x3a48a: 0x6ce63e20, 0x3a48b: 0x6ce64020, + 0x3a48c: 0x6ce64220, 0x3a48d: 0x6ce64420, 0x3a48e: 0x6ce64620, 0x3a48f: 0x6ce64820, + 0x3a490: 0x6ce64a20, 0x3a491: 0x6ce64c20, 0x3a492: 0x6ce64e20, 0x3a493: 0x6ce65020, + 0x3a494: 0x6ce65220, 0x3a495: 0x6ce65420, 0x3a496: 0x6ce65620, 0x3a497: 0x6ce65820, + 0x3a498: 0x6ce65a20, 0x3a499: 0x6ce65c20, 0x3a49a: 0x6ce65e20, 0x3a49b: 0x6ce66020, + 0x3a49c: 0x6ce66220, 0x3a49d: 0x6ce66420, 0x3a49e: 0x6ce66620, 0x3a49f: 0x6ce66820, + 0x3a4a0: 0x6ce66a20, 0x3a4a1: 0x6ce66c20, 0x3a4a2: 0x6ce66e20, 0x3a4a3: 0x6ce67020, + 0x3a4a4: 0x6ce67220, 0x3a4a5: 0x6ce67420, 0x3a4a6: 0x6ce67620, 0x3a4a7: 0x6ce67820, + 0x3a4a8: 0x6ce67a20, 0x3a4a9: 0x6ce67c20, 0x3a4aa: 0x6ce67e20, 0x3a4ab: 0x6ce68020, + 0x3a4ac: 0x6ce68220, 0x3a4ad: 0x6ce68420, 0x3a4ae: 0x6d149e20, 0x3a4af: 0x6d14a020, + 0x3a4b0: 0x6d14a220, 0x3a4b1: 0x6d14a420, 0x3a4b2: 0x6d14a620, 0x3a4b3: 0x6d14a820, + 0x3a4b4: 0x6d14aa20, 0x3a4b5: 0x6d14ac20, 0x3a4b6: 0x6d14ae20, 0x3a4b7: 0x6d14b020, + 0x3a4b8: 0x6d14b220, 0x3a4b9: 0x6d14b420, 0x3a4ba: 0x6d14b620, 0x3a4bb: 0x6d14b820, + 0x3a4bc: 0x6d14ba20, 0x3a4bd: 0x6d14bc20, 0x3a4be: 0x6d14be20, 0x3a4bf: 0x6d14c020, + // Block 0xe93, offset 0x3a4c0 + 0x3a4c0: 0x6d14c220, 0x3a4c1: 0x6d14c420, 0x3a4c2: 0x6d14c620, 0x3a4c3: 0x6d14c820, + 0x3a4c4: 0x6d14ca20, 0x3a4c5: 0x6d14cc20, 0x3a4c6: 0x6d14ce20, 0x3a4c7: 0x6d14d020, + 0x3a4c8: 0x6d14d220, 0x3a4c9: 0x6d14d420, 0x3a4ca: 0x6d428420, 0x3a4cb: 0x6d428620, + 0x3a4cc: 0x6d428820, 0x3a4cd: 0x6d428a20, 0x3a4ce: 0x6d428c20, 0x3a4cf: 0x6d428e20, + 0x3a4d0: 0x6d429020, 0x3a4d1: 0x6d429220, 0x3a4d2: 0x6d429420, 0x3a4d3: 0x6d429620, + 0x3a4d4: 0x6d429820, 0x3a4d5: 0x6d429a20, 0x3a4d6: 0x6d429c20, 0x3a4d7: 0x6d429e20, + 0x3a4d8: 0x6d42a020, 0x3a4d9: 0x6d42a220, 0x3a4da: 0x6d42a420, 0x3a4db: 0x6d42a620, + 0x3a4dc: 0x6d42a820, 0x3a4dd: 0x6d42aa20, 0x3a4de: 0x6d42ac20, 0x3a4df: 0x6d42ae20, + 0x3a4e0: 0x6d42b020, 0x3a4e1: 0x6d42b220, 0x3a4e2: 0x6d42b420, 0x3a4e3: 0x6d42b620, + 0x3a4e4: 0x6d42b820, 0x3a4e5: 0x6d42ba20, 0x3a4e6: 0x6d42bc20, 0x3a4e7: 0x6d42be20, + 0x3a4e8: 0x6d42c020, 0x3a4e9: 0x6d42c220, 0x3a4ea: 0x6d6f9820, 0x3a4eb: 0x6d6f9a20, + 0x3a4ec: 0x6d6f9c20, 0x3a4ed: 0x6d6f9e20, 0x3a4ee: 0x6d6fa020, 0x3a4ef: 0x6d6fa220, + 0x3a4f0: 0x6d6fa420, 0x3a4f1: 0x6d6fa620, 0x3a4f2: 0x6d6fa820, 0x3a4f3: 0x6d6faa20, + 0x3a4f4: 0x6d6fac20, 0x3a4f5: 0x6d6fae20, 0x3a4f6: 0x6d6fb020, 0x3a4f7: 0x6d6fb220, + 0x3a4f8: 0x6d6fb420, 0x3a4f9: 0x6d6fb620, 0x3a4fa: 0x6d6fb820, 0x3a4fb: 0x6d6fba20, + 0x3a4fc: 0x6d6fbc20, 0x3a4fd: 0x6d6fbe20, 0x3a4fe: 0x6d6fc020, 0x3a4ff: 0x6d98a420, + // Block 0xe94, offset 0x3a500 + 0x3a500: 0x6d98a620, 0x3a501: 0x6d98a820, 0x3a502: 0x6d98aa20, 0x3a503: 0x6d98ac20, + 0x3a504: 0x6d98ae20, 0x3a505: 0x6d98b020, 0x3a506: 0x6d98b220, 0x3a507: 0x6d98b420, + 0x3a508: 0x6d98b620, 0x3a509: 0x6d98b820, 0x3a50a: 0x6d98ba20, 0x3a50b: 0x6d98bc20, + 0x3a50c: 0x6d98be20, 0x3a50d: 0x6dbba020, 0x3a50e: 0x6dbba220, 0x3a50f: 0x6dbba420, + 0x3a510: 0x6dbba620, 0x3a511: 0x6dbba820, 0x3a512: 0x6dbbaa20, 0x3a513: 0x6dbbac20, + 0x3a514: 0x6dbbae20, 0x3a515: 0x6dbbb020, 0x3a516: 0x6dd96c20, 0x3a517: 0x6dd96e20, + 0x3a518: 0x6dd97020, 0x3a519: 0x6dd97220, 0x3a51a: 0x6dd97420, 0x3a51b: 0x6dd97620, + 0x3a51c: 0x6dd97820, 0x3a51d: 0x6dd97a20, 0x3a51e: 0x6dd97c20, 0x3a51f: 0x6dd97e20, + 0x3a520: 0x6dd98020, 0x3a521: 0x6dd98220, 0x3a522: 0x6df1a620, 0x3a523: 0x6df1a820, + 0x3a524: 0x6df1aa20, 0x3a525: 0x6df1ac20, 0x3a526: 0x6e05de20, 0x3a527: 0x6e05e020, + 0x3a528: 0x6e05e220, 0x3a529: 0x6e05e420, 0x3a52a: 0x6e05e620, 0x3a52b: 0x6e05e820, + 0x3a52c: 0x6e169220, 0x3a52d: 0x6e169420, 0x3a52e: 0x6e23b820, 0x3a52f: 0x6e23ba20, + 0x3a530: 0x6e2dcc20, 0x3a531: 0x6e2dce20, 0x3a532: 0x6e3eb820, 0x3a533: 0x6e3eba20, + 0x3a534: 0x6e416220, 0x3a535: 0x6e416420, 0x3a536: 0x6d14de20, 0x3a537: 0x6d42cc20, + 0x3a538: 0x6d6fc220, 0x3a539: 0x6d6fc420, 0x3a53a: 0x6d6fc620, 0x3a53b: 0x6d6fc820, + 0x3a53c: 0x6d98c220, 0x3a53d: 0x6d98c420, 0x3a53e: 0x6d98c620, 0x3a53f: 0x6dbbb420, + // Block 0xe95, offset 0x3a540 + 0x3a540: 0x6dd98620, 0x3a541: 0x6dd98820, 0x3a542: 0x6e05ea20, 0x3a543: 0x6e05ec20, + 0x3a544: 0x6e23bc20, 0x3a545: 0x6c8a3c20, 0x3a546: 0x6c8a3e20, 0x3a547: 0x6c8a4020, + 0x3a548: 0x6cb66820, 0x3a549: 0x6cb66a20, 0x3a54a: 0x6cb66c20, 0x3a54b: 0x6cb66e20, + 0x3a54c: 0x6cb67020, 0x3a54d: 0x6cb67220, 0x3a54e: 0x6cb67420, 0x3a54f: 0x6cb67620, + 0x3a550: 0x6cb67820, 0x3a551: 0x6cb67a20, 0x3a552: 0x6ce6a020, 0x3a553: 0x6ce6a220, + 0x3a554: 0x6ce6a420, 0x3a555: 0x6ce6a620, 0x3a556: 0x6ce6a820, 0x3a557: 0x6ce6aa20, + 0x3a558: 0x6ce6ac20, 0x3a559: 0x6ce6ae20, 0x3a55a: 0x6ce6b020, 0x3a55b: 0x6ce6b220, + 0x3a55c: 0x6ce6b420, 0x3a55d: 0x6ce6b620, 0x3a55e: 0x6ce6b820, 0x3a55f: 0x6ce6ba20, + 0x3a560: 0x6d14f420, 0x3a561: 0x6d14f620, 0x3a562: 0x6d14f820, 0x3a563: 0x6d14fa20, + 0x3a564: 0x6d14fc20, 0x3a565: 0x6d14fe20, 0x3a566: 0x6d150020, 0x3a567: 0x6d150220, + 0x3a568: 0x6d150420, 0x3a569: 0x6d150620, 0x3a56a: 0x6d150820, 0x3a56b: 0x6d150a20, + 0x3a56c: 0x6d150c20, 0x3a56d: 0x6d150e20, 0x3a56e: 0x6d151020, 0x3a56f: 0x6d151220, + 0x3a570: 0x6d151420, 0x3a571: 0x6d151620, 0x3a572: 0x6d42d820, 0x3a573: 0x6d42da20, + 0x3a574: 0x6d42dc20, 0x3a575: 0x6d42de20, 0x3a576: 0x6d42e020, 0x3a577: 0x6d42e220, + 0x3a578: 0x6d42e420, 0x3a579: 0x6d42e620, 0x3a57a: 0x6d42e820, 0x3a57b: 0x6d42ea20, + 0x3a57c: 0x6d42ec20, 0x3a57d: 0x6d42ee20, 0x3a57e: 0x6d42f020, 0x3a57f: 0x6d42f220, + // Block 0xe96, offset 0x3a580 + 0x3a580: 0x6d42f420, 0x3a581: 0x6d42f620, 0x3a582: 0x6d42f820, 0x3a583: 0x6d42fa20, + 0x3a584: 0x6d42fc20, 0x3a585: 0x6d42fe20, 0x3a586: 0x6d430020, 0x3a587: 0x6d430220, + 0x3a588: 0x6d430420, 0x3a589: 0x6d430620, 0x3a58a: 0x6d430820, 0x3a58b: 0x6d6fd220, + 0x3a58c: 0x6d6fd420, 0x3a58d: 0x6d6fd620, 0x3a58e: 0x6d6fd820, 0x3a58f: 0x6d6fda20, + 0x3a590: 0x6d6fdc20, 0x3a591: 0x6d6fde20, 0x3a592: 0x6d6fe020, 0x3a593: 0x6d6fe220, + 0x3a594: 0x6d6fe420, 0x3a595: 0x6d6fe620, 0x3a596: 0x6d6fe820, 0x3a597: 0x6d6fea20, + 0x3a598: 0x6d6fec20, 0x3a599: 0x6d6fee20, 0x3a59a: 0x6d6ff020, 0x3a59b: 0x6d6ff220, + 0x3a59c: 0x6d6ff420, 0x3a59d: 0x6d6ff620, 0x3a59e: 0x6d6ff820, 0x3a59f: 0x6d6ffa20, + 0x3a5a0: 0x6d98d020, 0x3a5a1: 0x6d98d220, 0x3a5a2: 0x6d98d420, 0x3a5a3: 0x6d98d620, + 0x3a5a4: 0x6d98d820, 0x3a5a5: 0x6d98da20, 0x3a5a6: 0x6d98dc20, 0x3a5a7: 0x6d98de20, + 0x3a5a8: 0x6d98e020, 0x3a5a9: 0x6d98e220, 0x3a5aa: 0x6d98e420, 0x3a5ab: 0x6d98e620, + 0x3a5ac: 0x6d98e820, 0x3a5ad: 0x6d98ea20, 0x3a5ae: 0x6d98ec20, 0x3a5af: 0x6d98ee20, + 0x3a5b0: 0x6d98f020, 0x3a5b1: 0x6d98f220, 0x3a5b2: 0x6d98f420, 0x3a5b3: 0x6d98f620, + 0x3a5b4: 0x6d98f820, 0x3a5b5: 0x6d98fa20, 0x3a5b6: 0x6d98fc20, 0x3a5b7: 0x6d98fe20, + 0x3a5b8: 0x6d990020, 0x3a5b9: 0x6d990220, 0x3a5ba: 0x6d990420, 0x3a5bb: 0x6d990620, + 0x3a5bc: 0x6d990820, 0x3a5bd: 0x6d990a20, 0x3a5be: 0x6d990c20, 0x3a5bf: 0x6dbbbc20, + // Block 0xe97, offset 0x3a5c0 + 0x3a5c0: 0x6dbbbe20, 0x3a5c1: 0x6dbbc020, 0x3a5c2: 0x6dbbc220, 0x3a5c3: 0x6dbbc420, + 0x3a5c4: 0x6dbbc620, 0x3a5c5: 0x6dbbc820, 0x3a5c6: 0x6dbbca20, 0x3a5c7: 0x6dbbcc20, + 0x3a5c8: 0x6dbbce20, 0x3a5c9: 0x6dbbd020, 0x3a5ca: 0x6dbbd220, 0x3a5cb: 0x6dbbd420, + 0x3a5cc: 0x6dbbd620, 0x3a5cd: 0x6dbbd820, 0x3a5ce: 0x6dbbda20, 0x3a5cf: 0x6dbbdc20, + 0x3a5d0: 0x6dbbde20, 0x3a5d1: 0x6dbbe020, 0x3a5d2: 0x6dbbe220, 0x3a5d3: 0x6dbbe420, + 0x3a5d4: 0x6dbbe620, 0x3a5d5: 0x6dbbe820, 0x3a5d6: 0x6dbbea20, 0x3a5d7: 0x6dd9a020, + 0x3a5d8: 0x6dd9a220, 0x3a5d9: 0x6dd9a420, 0x3a5da: 0x6dd9a620, 0x3a5db: 0x6dd9a820, + 0x3a5dc: 0x6dd9aa20, 0x3a5dd: 0x6dd9ac20, 0x3a5de: 0x6dd9ae20, 0x3a5df: 0x6dd9b020, + 0x3a5e0: 0x6dd9b220, 0x3a5e1: 0x6dd9b420, 0x3a5e2: 0x6dd9b620, 0x3a5e3: 0x6dd9b820, + 0x3a5e4: 0x6df1b420, 0x3a5e5: 0x6df1b620, 0x3a5e6: 0x6df1b820, 0x3a5e7: 0x6df1ba20, + 0x3a5e8: 0x6df1bc20, 0x3a5e9: 0x6df1be20, 0x3a5ea: 0x6df1c020, 0x3a5eb: 0x6df1c220, + 0x3a5ec: 0x6df1c420, 0x3a5ed: 0x6df1c620, 0x3a5ee: 0x6df1c820, 0x3a5ef: 0x6df1ca20, + 0x3a5f0: 0x6df1cc20, 0x3a5f1: 0x6df1ce20, 0x3a5f2: 0x6df1d020, 0x3a5f3: 0x6df1d220, + 0x3a5f4: 0x6e05f420, 0x3a5f5: 0x6e05f620, 0x3a5f6: 0x6e05f820, 0x3a5f7: 0x6e05fa20, + 0x3a5f8: 0x6e05fc20, 0x3a5f9: 0x6e05fe20, 0x3a5fa: 0x6e060020, 0x3a5fb: 0x6e060220, + 0x3a5fc: 0x6e060420, 0x3a5fd: 0x6e060620, 0x3a5fe: 0x6e060820, 0x3a5ff: 0x6e060a20, + // Block 0xe98, offset 0x3a600 + 0x3a600: 0x6e060c20, 0x3a601: 0x6e060e20, 0x3a602: 0x6e061020, 0x3a603: 0x6e061220, + 0x3a604: 0x6e061420, 0x3a605: 0x6e061620, 0x3a606: 0x6e061820, 0x3a607: 0x6e169820, + 0x3a608: 0x6e169a20, 0x3a609: 0x6e169c20, 0x3a60a: 0x6e169e20, 0x3a60b: 0x6e16a020, + 0x3a60c: 0x6e16a220, 0x3a60d: 0x6e16a420, 0x3a60e: 0x6e16a620, 0x3a60f: 0x6e16a820, + 0x3a610: 0x6e16aa20, 0x3a611: 0x6e16ac20, 0x3a612: 0x6e16ae20, 0x3a613: 0x6e23c020, + 0x3a614: 0x6e23c220, 0x3a615: 0x6e23c420, 0x3a616: 0x6e23c620, 0x3a617: 0x6e23c820, + 0x3a618: 0x6e23ca20, 0x3a619: 0x6e23cc20, 0x3a61a: 0x6e23ce20, 0x3a61b: 0x6e23d020, + 0x3a61c: 0x6e2dd020, 0x3a61d: 0x6e2dd220, 0x3a61e: 0x6e2dd420, 0x3a61f: 0x6e2dd620, + 0x3a620: 0x6e2dd820, 0x3a621: 0x6e2dda20, 0x3a622: 0x6e2ddc20, 0x3a623: 0x6e2dde20, + 0x3a624: 0x6e2de020, 0x3a625: 0x6e2de220, 0x3a626: 0x6e2de420, 0x3a627: 0x6e358420, + 0x3a628: 0x6e358620, 0x3a629: 0x6e358820, 0x3a62a: 0x6e358a20, 0x3a62b: 0x6e358c20, + 0x3a62c: 0x6e3afc20, 0x3a62d: 0x6e3afe20, 0x3a62e: 0x6e3b0020, 0x3a62f: 0x6e3ebc20, + 0x3a630: 0x6e3ebe20, 0x3a631: 0x6e3ec020, 0x3a632: 0x6e435e20, 0x3a633: 0x6e436020, + 0x3a634: 0x6e464820, 0x3a635: 0x6e46ee20, 0x3a636: 0x6c632c20, 0x3a637: 0x6c8a4220, + 0x3a638: 0x6c8a4420, 0x3a639: 0x6cb68420, 0x3a63a: 0x6cb68620, 0x3a63b: 0x6cb68820, + 0x3a63c: 0x6cb68a20, 0x3a63d: 0x6cb68c20, 0x3a63e: 0x6cb68e20, 0x3a63f: 0x6cb69020, + // Block 0xe99, offset 0x3a640 + 0x3a640: 0x6cb69220, 0x3a641: 0x6cb69420, 0x3a642: 0x6ce6d220, 0x3a643: 0x6ce6d420, + 0x3a644: 0x6ce6d620, 0x3a645: 0x6ce6d820, 0x3a646: 0x6ce6da20, 0x3a647: 0x6ce6dc20, + 0x3a648: 0x6ce6de20, 0x3a649: 0x6ce6e020, 0x3a64a: 0x6ce6e220, 0x3a64b: 0x6ce6e420, + 0x3a64c: 0x6ce6e620, 0x3a64d: 0x6ce6e820, 0x3a64e: 0x6ce6ea20, 0x3a64f: 0x6ce6ec20, + 0x3a650: 0x6ce6ee20, 0x3a651: 0x6ce6f020, 0x3a652: 0x6d153020, 0x3a653: 0x6d153220, + 0x3a654: 0x6d153420, 0x3a655: 0x6d153620, 0x3a656: 0x6d153820, 0x3a657: 0x6d153a20, + 0x3a658: 0x6d153c20, 0x3a659: 0x6d153e20, 0x3a65a: 0x6d154020, 0x3a65b: 0x6d154220, + 0x3a65c: 0x6d154420, 0x3a65d: 0x6d154620, 0x3a65e: 0x6d154820, 0x3a65f: 0x6d154a20, + 0x3a660: 0x6d154c20, 0x3a661: 0x6d154e20, 0x3a662: 0x6d432220, 0x3a663: 0x6d432420, + 0x3a664: 0x6d432620, 0x3a665: 0x6d432820, 0x3a666: 0x6d432a20, 0x3a667: 0x6d432c20, + 0x3a668: 0x6d432e20, 0x3a669: 0x6d433020, 0x3a66a: 0x6d433220, 0x3a66b: 0x6d433420, + 0x3a66c: 0x6d433620, 0x3a66d: 0x6d433820, 0x3a66e: 0x6d433a20, 0x3a66f: 0x6d433c20, + 0x3a670: 0x6d433e20, 0x3a671: 0x6d434020, 0x3a672: 0x6d434220, 0x3a673: 0x6d434420, + 0x3a674: 0x6d434620, 0x3a675: 0x6d434820, 0x3a676: 0x6d434a20, 0x3a677: 0x6d701420, + 0x3a678: 0x6d701620, 0x3a679: 0x6d701820, 0x3a67a: 0x6d701a20, 0x3a67b: 0x6d701c20, + 0x3a67c: 0x6d701e20, 0x3a67d: 0x6d702020, 0x3a67e: 0x6d702220, 0x3a67f: 0x6d702420, + // Block 0xe9a, offset 0x3a680 + 0x3a680: 0x6d702620, 0x3a681: 0x6d702820, 0x3a682: 0x6d702a20, 0x3a683: 0x6d702c20, + 0x3a684: 0x6d702e20, 0x3a685: 0x6d703020, 0x3a686: 0x6d703220, 0x3a687: 0x6d703420, + 0x3a688: 0x6d703620, 0x3a689: 0x6d703820, 0x3a68a: 0x6d703a20, 0x3a68b: 0x6d703c20, + 0x3a68c: 0x6d703e20, 0x3a68d: 0x6d704020, 0x3a68e: 0x6d704220, 0x3a68f: 0x6d704420, + 0x3a690: 0x6d704620, 0x3a691: 0x6d704820, 0x3a692: 0x6d993020, 0x3a693: 0x6d993220, + 0x3a694: 0x6d993420, 0x3a695: 0x6d993620, 0x3a696: 0x6d993820, 0x3a697: 0x6d993a20, + 0x3a698: 0x6d993c20, 0x3a699: 0x6d993e20, 0x3a69a: 0x6d994020, 0x3a69b: 0x6d994220, + 0x3a69c: 0x6d994420, 0x3a69d: 0x6d994620, 0x3a69e: 0x6d994820, 0x3a69f: 0x6d994a20, + 0x3a6a0: 0x6d994c20, 0x3a6a1: 0x6d994e20, 0x3a6a2: 0x6d995020, 0x3a6a3: 0x6d995220, + 0x3a6a4: 0x6d995420, 0x3a6a5: 0x6d995620, 0x3a6a6: 0x6d995820, 0x3a6a7: 0x6d995a20, + 0x3a6a8: 0x6d995c20, 0x3a6a9: 0x6d995e20, 0x3a6aa: 0x6d996020, 0x3a6ab: 0x6d996220, + 0x3a6ac: 0x6d996420, 0x3a6ad: 0x6d996620, 0x3a6ae: 0x6d996820, 0x3a6af: 0x6d996a20, + 0x3a6b0: 0x6d996c20, 0x3a6b1: 0x6d996e20, 0x3a6b2: 0x6d997020, 0x3a6b3: 0x6d997220, + 0x3a6b4: 0x6d997420, 0x3a6b5: 0x6dbc0c20, 0x3a6b6: 0x6dbc0e20, 0x3a6b7: 0x6dbc1020, + 0x3a6b8: 0x6dbc1220, 0x3a6b9: 0x6dbc1420, 0x3a6ba: 0x6dbc1620, 0x3a6bb: 0x6dbc1820, + 0x3a6bc: 0x6dbc1a20, 0x3a6bd: 0x6dbc1c20, 0x3a6be: 0x6dd9d220, 0x3a6bf: 0x6dbc1e20, + // Block 0xe9b, offset 0x3a6c0 + 0x3a6c0: 0x6dbc2020, 0x3a6c1: 0x6dbc2220, 0x3a6c2: 0x6dbc2420, 0x3a6c3: 0x6dbc2620, + 0x3a6c4: 0x6dbc2820, 0x3a6c5: 0x6dbc2a20, 0x3a6c6: 0x6dbc2c20, 0x3a6c7: 0x6dbc2e20, + 0x3a6c8: 0x6dbc3020, 0x3a6c9: 0x6dbc3220, 0x3a6ca: 0x6dbc3420, 0x3a6cb: 0x6dbc3620, + 0x3a6cc: 0x6dbc3820, 0x3a6cd: 0x6dbc3a20, 0x3a6ce: 0x6dbc3c20, 0x3a6cf: 0x6dbc3e20, + 0x3a6d0: 0x6dbc4020, 0x3a6d1: 0x6dbc4220, 0x3a6d2: 0x6dbc4420, 0x3a6d3: 0x6dbc4620, + 0x3a6d4: 0x6dbc4820, 0x3a6d5: 0x6dbc4a20, 0x3a6d6: 0x6dbc4c20, 0x3a6d7: 0x6dd9d420, + 0x3a6d8: 0x6dd9d620, 0x3a6d9: 0x6dd9d820, 0x3a6da: 0x6dd9da20, 0x3a6db: 0x6dd9dc20, + 0x3a6dc: 0x6dd9de20, 0x3a6dd: 0x6dd9e020, 0x3a6de: 0x6dd9e220, 0x3a6df: 0x6dd9e420, + 0x3a6e0: 0x6dd9e620, 0x3a6e1: 0x6dd9e820, 0x3a6e2: 0x6dd9ea20, 0x3a6e3: 0x6dd9ec20, + 0x3a6e4: 0x6dd9ee20, 0x3a6e5: 0x6dd9f020, 0x3a6e6: 0x6dd9f220, 0x3a6e7: 0x6dd9f420, + 0x3a6e8: 0x6dd9f620, 0x3a6e9: 0x6dd9f820, 0x3a6ea: 0x6dd9fa20, 0x3a6eb: 0x6dd9fc20, + 0x3a6ec: 0x6dd9fe20, 0x3a6ed: 0x6dda0020, 0x3a6ee: 0x6db8fa20, 0x3a6ef: 0x6dda0220, + 0x3a6f0: 0x6dda0420, 0x3a6f1: 0x6dda0620, 0x3a6f2: 0x6dda0820, 0x3a6f3: 0x6dda0a20, + 0x3a6f4: 0x6dda0c20, 0x3a6f5: 0x6dda0e20, 0x3a6f6: 0x6dda1020, 0x3a6f7: 0x6dda1220, + 0x3a6f8: 0x6dda1420, 0x3a6f9: 0x6dda1620, 0x3a6fa: 0x6dda1820, 0x3a6fb: 0x6df1ee20, + 0x3a6fc: 0x6df1f020, 0x3a6fd: 0x6df1f220, 0x3a6fe: 0x6df1f420, 0x3a6ff: 0x6df1f620, + // Block 0xe9c, offset 0x3a700 + 0x3a700: 0x6df1f820, 0x3a701: 0x6df1fa20, 0x3a702: 0x6df1fc20, 0x3a703: 0x6df1fe20, + 0x3a704: 0x6df20020, 0x3a705: 0x6df20220, 0x3a706: 0x6df20420, 0x3a707: 0x6df20620, + 0x3a708: 0x6df20820, 0x3a709: 0x6df20a20, 0x3a70a: 0x6df20c20, 0x3a70b: 0x6df20e20, + 0x3a70c: 0x6df21020, 0x3a70d: 0x6df21220, 0x3a70e: 0x6df21420, 0x3a70f: 0x6df21620, + 0x3a710: 0x6df21820, 0x3a711: 0x6df21a20, 0x3a712: 0x6df21c20, 0x3a713: 0x6df21e20, + 0x3a714: 0x6df22020, 0x3a715: 0x6df22220, 0x3a716: 0x6df22420, 0x3a717: 0x6df22620, + 0x3a718: 0x6df22820, 0x3a719: 0x6df22a20, 0x3a71a: 0x6df22c20, 0x3a71b: 0x6df22e20, + 0x3a71c: 0x6df23020, 0x3a71d: 0x6e062a20, 0x3a71e: 0x6e062c20, 0x3a71f: 0x6e062e20, + 0x3a720: 0x6e063020, 0x3a721: 0x6e063220, 0x3a722: 0x6e063420, 0x3a723: 0x6e063620, + 0x3a724: 0x6e063820, 0x3a725: 0x6e063a20, 0x3a726: 0x6e063c20, 0x3a727: 0x6e063e20, + 0x3a728: 0x6e064020, 0x3a729: 0x6e064220, 0x3a72a: 0x6e064420, 0x3a72b: 0x6e064620, + 0x3a72c: 0x6e064820, 0x3a72d: 0x6e064a20, 0x3a72e: 0x6e064c20, 0x3a72f: 0x6e064e20, + 0x3a730: 0x6e065020, 0x3a731: 0x6e065220, 0x3a732: 0x6e065420, 0x3a733: 0x6e065620, + 0x3a734: 0x6e065820, 0x3a735: 0x6e065a20, 0x3a736: 0x6e065c20, 0x3a737: 0x6e065e20, + 0x3a738: 0x6e066020, 0x3a739: 0x6e066220, 0x3a73a: 0x6e066420, 0x3a73b: 0x6e066620, + 0x3a73c: 0x6e16c020, 0x3a73d: 0x6e16c220, 0x3a73e: 0x6e16c420, 0x3a73f: 0x6e16c620, + // Block 0xe9d, offset 0x3a740 + 0x3a740: 0x6e16c820, 0x3a741: 0x6e16ca20, 0x3a742: 0x6e16cc20, 0x3a743: 0x6e16ce20, + 0x3a744: 0x6e16d020, 0x3a745: 0x6e16d220, 0x3a746: 0x6e16d420, 0x3a747: 0x6e16d620, + 0x3a748: 0x6e16d820, 0x3a749: 0x6e16da20, 0x3a74a: 0x6e16dc20, 0x3a74b: 0x6e16de20, + 0x3a74c: 0x6e16e020, 0x3a74d: 0x6e16e220, 0x3a74e: 0x6e16e420, 0x3a74f: 0x6e16e620, + 0x3a750: 0x6e16e820, 0x3a751: 0x6e23e220, 0x3a752: 0x6e23e420, 0x3a753: 0x6e23e620, + 0x3a754: 0x6e23e820, 0x3a755: 0x6e23ea20, 0x3a756: 0x6e23ec20, 0x3a757: 0x6e23ee20, + 0x3a758: 0x6e23f020, 0x3a759: 0x6e23f220, 0x3a75a: 0x6e23f420, 0x3a75b: 0x6e23f620, + 0x3a75c: 0x6e23f820, 0x3a75d: 0x6e23fa20, 0x3a75e: 0x6e23fc20, 0x3a75f: 0x6e23fe20, + 0x3a760: 0x6e240020, 0x3a761: 0x6e240220, 0x3a762: 0x6e240420, 0x3a763: 0x6e240620, + 0x3a764: 0x6e2dec20, 0x3a765: 0x6e2dee20, 0x3a766: 0x6e2df020, 0x3a767: 0x6e2df220, + 0x3a768: 0x6e2df420, 0x3a769: 0x6e2df620, 0x3a76a: 0x6e2df820, 0x3a76b: 0x6e2dfa20, + 0x3a76c: 0x6e2dfc20, 0x3a76d: 0x6e359e20, 0x3a76e: 0x6e35a020, 0x3a76f: 0x6e35a220, + 0x3a770: 0x6e35a420, 0x3a771: 0x6e35a620, 0x3a772: 0x6e35a820, 0x3a773: 0x6e35aa20, + 0x3a774: 0x6e35ac20, 0x3a775: 0x6e3b0620, 0x3a776: 0x6e3b0820, 0x3a777: 0x6e3b0a20, + 0x3a778: 0x6e3b0c20, 0x3a779: 0x6e3b0e20, 0x3a77a: 0x6e3b1020, 0x3a77b: 0x6e3b1220, + 0x3a77c: 0x6e3b1420, 0x3a77d: 0x6e3b1620, 0x3a77e: 0x6e3b1820, 0x3a77f: 0x6e3ec420, + // Block 0xe9e, offset 0x3a780 + 0x3a780: 0x6e3ec620, 0x3a781: 0x6e3ec820, 0x3a782: 0x6e3eca20, 0x3a783: 0x6e3ecc20, + 0x3a784: 0x6e3ece20, 0x3a785: 0x6e3ed020, 0x3a786: 0x6e3ed220, 0x3a787: 0x6e3ed420, + 0x3a788: 0x6e436220, 0x3a789: 0x6e436420, 0x3a78a: 0x6e44a820, 0x3a78b: 0x6e44aa20, + 0x3a78c: 0x6e44ac20, 0x3a78d: 0x6e44ae20, 0x3a78e: 0x6e44b020, 0x3a78f: 0x6e45e820, + 0x3a790: 0x6e464a20, 0x3a791: 0x6e464c20, 0x3a792: 0x6e471820, 0x3a793: 0x6e472420, + 0x3a794: 0x6e473820, 0x3a795: 0x6cb69820, 0x3a796: 0x6ce6fa20, 0x3a797: 0x6ce6fc20, + 0x3a798: 0x6d155820, 0x3a799: 0x6d155a20, 0x3a79a: 0x6d155c20, 0x3a79b: 0x6d155e20, + 0x3a79c: 0x6d435620, 0x3a79d: 0x6d997e20, 0x3a79e: 0x6d998020, 0x3a79f: 0x6dbc5420, + 0x3a7a0: 0x6dda1e20, 0x3a7a1: 0x6df23620, 0x3a7a2: 0x6e067020, 0x3a7a3: 0x6e16ec20, + 0x3a7a4: 0x6e35b220, 0x3a7a5: 0x6e3b1a20, 0x3a7a6: 0x6c8a4820, 0x3a7a7: 0x6c8a4a20, + 0x3a7a8: 0x6c8a4c20, 0x3a7a9: 0x6cb6a020, 0x3a7aa: 0x6cb6a220, 0x3a7ab: 0x6cb6a420, + 0x3a7ac: 0x6cb6a620, 0x3a7ad: 0x6ce70220, 0x3a7ae: 0x6ce70420, 0x3a7af: 0x6ce70620, + 0x3a7b0: 0x6ce70820, 0x3a7b1: 0x6ce70a20, 0x3a7b2: 0x6ce70c20, 0x3a7b3: 0x6ce70e20, + 0x3a7b4: 0x6ce71020, 0x3a7b5: 0x6d156420, 0x3a7b6: 0x6d156620, 0x3a7b7: 0x6d435820, + 0x3a7b8: 0x6d705420, 0x3a7b9: 0x6d705620, 0x3a7ba: 0x6d705820, 0x3a7bb: 0x6d705a20, + 0x3a7bc: 0x6d998420, 0x3a7bd: 0x6dda2020, 0x3a7be: 0x6e067420, 0x3a7bf: 0x6e067620, + // Block 0xe9f, offset 0x3a7c0 + 0x3a7c0: 0x6e067820, 0x3a7c1: 0x6e067a20, 0x3a7c2: 0x6e3ed620, 0x3a7c3: 0x6ce71220, + 0x3a7c4: 0x6ce71420, 0x3a7c5: 0x6ce71620, 0x3a7c6: 0x6d156e20, 0x3a7c7: 0x6d157020, + 0x3a7c8: 0x6d157220, 0x3a7c9: 0x6d157420, 0x3a7ca: 0x6d157620, 0x3a7cb: 0x6d157820, + 0x3a7cc: 0x6d157a20, 0x3a7cd: 0x6d436420, 0x3a7ce: 0x6d436620, 0x3a7cf: 0x6d436820, + 0x3a7d0: 0x6d436a20, 0x3a7d1: 0x6d436c20, 0x3a7d2: 0x6d436e20, 0x3a7d3: 0x6d437020, + 0x3a7d4: 0x6d437220, 0x3a7d5: 0x6d437420, 0x3a7d6: 0x6d437620, 0x3a7d7: 0x6d437820, + 0x3a7d8: 0x6d437a20, 0x3a7d9: 0x6d706020, 0x3a7da: 0x6d706220, 0x3a7db: 0x6d706420, + 0x3a7dc: 0x6d706620, 0x3a7dd: 0x6d706820, 0x3a7de: 0x6d706a20, 0x3a7df: 0x6d706c20, + 0x3a7e0: 0x6d706e20, 0x3a7e1: 0x6d998c20, 0x3a7e2: 0x6d998e20, 0x3a7e3: 0x6d999020, + 0x3a7e4: 0x6d999220, 0x3a7e5: 0x6d999420, 0x3a7e6: 0x6d999620, 0x3a7e7: 0x6d999820, + 0x3a7e8: 0x6d999a20, 0x3a7e9: 0x6d999c20, 0x3a7ea: 0x6d999e20, 0x3a7eb: 0x6dbc5820, + 0x3a7ec: 0x6dbc5a20, 0x3a7ed: 0x6dbc5c20, 0x3a7ee: 0x6dbc5e20, 0x3a7ef: 0x6dbc6020, + 0x3a7f0: 0x6dbc6220, 0x3a7f1: 0x6dbc6420, 0x3a7f2: 0x6dda2220, 0x3a7f3: 0x6dda2420, + 0x3a7f4: 0x6dda2620, 0x3a7f5: 0x6dda2820, 0x3a7f6: 0x6dda2a20, 0x3a7f7: 0x6dda2c20, + 0x3a7f8: 0x6df23c20, 0x3a7f9: 0x6df23e20, 0x3a7fa: 0x6df24020, 0x3a7fb: 0x6e067e20, + 0x3a7fc: 0x6e068020, 0x3a7fd: 0x6e068220, 0x3a7fe: 0x6e068420, 0x3a7ff: 0x6e068620, + // Block 0xea0, offset 0x3a800 + 0x3a800: 0x6e068820, 0x3a801: 0x6e16f620, 0x3a802: 0x6e16f820, 0x3a803: 0x6e16fa20, + 0x3a804: 0x6e16fc20, 0x3a805: 0x6e16fe20, 0x3a806: 0x6e170020, 0x3a807: 0x6e170220, + 0x3a808: 0x6e170420, 0x3a809: 0x6e170620, 0x3a80a: 0x6e241020, 0x3a80b: 0x6e241220, + 0x3a80c: 0x6e2e0020, 0x3a80d: 0x6e2e0220, 0x3a80e: 0x6e2e0420, 0x3a80f: 0x6e2e0620, + 0x3a810: 0x6e2e0820, 0x3a811: 0x6e35b620, 0x3a812: 0x6e35b820, 0x3a813: 0x6e3b1e20, + 0x3a814: 0x6e3ed820, 0x3a815: 0x6e3eda20, 0x3a816: 0x6e417020, 0x3a817: 0x6e417220, + 0x3a818: 0x6e417420, 0x3a819: 0x6e436620, 0x3a81a: 0x6e436820, 0x3a81b: 0x6cb6aa20, + 0x3a81c: 0x6cb6ac20, 0x3a81d: 0x6ce72c20, 0x3a81e: 0x6ce72e20, 0x3a81f: 0x6ce73020, + 0x3a820: 0x6ce73220, 0x3a821: 0x6d159820, 0x3a822: 0x6d159a20, 0x3a823: 0x6d159c20, + 0x3a824: 0x6d159e20, 0x3a825: 0x6d15a020, 0x3a826: 0x6d15a220, 0x3a827: 0x6d15a420, + 0x3a828: 0x6d15a620, 0x3a829: 0x6d15a820, 0x3a82a: 0x6d15aa20, 0x3a82b: 0x6d15ac20, + 0x3a82c: 0x6d15ae20, 0x3a82d: 0x6d15b020, 0x3a82e: 0x6d15b220, 0x3a82f: 0x6d15b420, + 0x3a830: 0x6d15b620, 0x3a831: 0x6d15b820, 0x3a832: 0x6d15ba20, 0x3a833: 0x6d15bc20, + 0x3a834: 0x6d15be20, 0x3a835: 0x6d15c020, 0x3a836: 0x6d15c220, 0x3a837: 0x6d15c420, + 0x3a838: 0x6d43a420, 0x3a839: 0x6d43a620, 0x3a83a: 0x6d43a820, 0x3a83b: 0x6d43aa20, + 0x3a83c: 0x6d43ac20, 0x3a83d: 0x6d43ae20, 0x3a83e: 0x6d43b020, 0x3a83f: 0x6d43b220, + // Block 0xea1, offset 0x3a840 + 0x3a840: 0x6d43b420, 0x3a841: 0x6d43b620, 0x3a842: 0x6d43b820, 0x3a843: 0x6d43ba20, + 0x3a844: 0x6d43bc20, 0x3a845: 0x6d43be20, 0x3a846: 0x6d43c020, 0x3a847: 0x6d43c220, + 0x3a848: 0x6d43c420, 0x3a849: 0x6d43c620, 0x3a84a: 0x6d43c820, 0x3a84b: 0x6d43ca20, + 0x3a84c: 0x6d43cc20, 0x3a84d: 0x6d43ce20, 0x3a84e: 0x6d43d020, 0x3a84f: 0x6d43d220, + 0x3a850: 0x6d708c20, 0x3a851: 0x6d708e20, 0x3a852: 0x6d709020, 0x3a853: 0x6d709220, + 0x3a854: 0x6d709420, 0x3a855: 0x6d709620, 0x3a856: 0x6d709820, 0x3a857: 0x6d709a20, + 0x3a858: 0x6d709c20, 0x3a859: 0x6d709e20, 0x3a85a: 0x6d70a020, 0x3a85b: 0x6d70a220, + 0x3a85c: 0x6d70a420, 0x3a85d: 0x6d70a620, 0x3a85e: 0x6d70a820, 0x3a85f: 0x6d70aa20, + 0x3a860: 0x6d70ac20, 0x3a861: 0x6d70ae20, 0x3a862: 0x6d70b020, 0x3a863: 0x6d70b220, + 0x3a864: 0x6d70b420, 0x3a865: 0x6d70b620, 0x3a866: 0x6d70b820, 0x3a867: 0x6d70ba20, + 0x3a868: 0x6d70bc20, 0x3a869: 0x6d99c020, 0x3a86a: 0x6d99c220, 0x3a86b: 0x6d99c420, + 0x3a86c: 0x6d99c620, 0x3a86d: 0x6d99c820, 0x3a86e: 0x6d99ca20, 0x3a86f: 0x6d99cc20, + 0x3a870: 0x6d99ce20, 0x3a871: 0x6d99d020, 0x3a872: 0x6d99d220, 0x3a873: 0x6d99d420, + 0x3a874: 0x6d99d620, 0x3a875: 0x6d99d820, 0x3a876: 0x6d99da20, 0x3a877: 0x6d99dc20, + 0x3a878: 0x6d99de20, 0x3a879: 0x6d99e020, 0x3a87a: 0x6d99e220, 0x3a87b: 0x6d99e420, + 0x3a87c: 0x6d99e620, 0x3a87d: 0x6d99e820, 0x3a87e: 0x6d99ea20, 0x3a87f: 0x6dbc8420, + // Block 0xea2, offset 0x3a880 + 0x3a880: 0x6dbc8620, 0x3a881: 0x6dbc8820, 0x3a882: 0x6dbc8a20, 0x3a883: 0x6dbc8c20, + 0x3a884: 0x6dbc8e20, 0x3a885: 0x6dbc9020, 0x3a886: 0x6dbc9220, 0x3a887: 0x6dbc9420, + 0x3a888: 0x6dbc9620, 0x3a889: 0x6dbc9820, 0x3a88a: 0x6dbc9a20, 0x3a88b: 0x6dbc9c20, + 0x3a88c: 0x6dbc9e20, 0x3a88d: 0x6dbca020, 0x3a88e: 0x6dbca220, 0x3a88f: 0x6dbca420, + 0x3a890: 0x6dbca620, 0x3a891: 0x6dbca820, 0x3a892: 0x6dbcaa20, 0x3a893: 0x6dbcac20, + 0x3a894: 0x6dbcae20, 0x3a895: 0x6dbcb020, 0x3a896: 0x6dbcb220, 0x3a897: 0x6dbcb420, + 0x3a898: 0x6dbcb620, 0x3a899: 0x6dbcb820, 0x3a89a: 0x6dbcba20, 0x3a89b: 0x6dbcbc20, + 0x3a89c: 0x6dbcbe20, 0x3a89d: 0x6dbcc020, 0x3a89e: 0x6dbcc220, 0x3a89f: 0x6dda5c20, + 0x3a8a0: 0x6dda5e20, 0x3a8a1: 0x6dda6020, 0x3a8a2: 0x6dda6220, 0x3a8a3: 0x6dda6420, + 0x3a8a4: 0x6dda6620, 0x3a8a5: 0x6dda6820, 0x3a8a6: 0x6dda6a20, 0x3a8a7: 0x6dda6c20, + 0x3a8a8: 0x6dda6e20, 0x3a8a9: 0x6dda7020, 0x3a8aa: 0x6dda7220, 0x3a8ab: 0x6dda7420, + 0x3a8ac: 0x6dda7620, 0x3a8ad: 0x6dda7820, 0x3a8ae: 0x6dda7a20, 0x3a8af: 0x6dda7c20, + 0x3a8b0: 0x6dda7e20, 0x3a8b1: 0x6dda8020, 0x3a8b2: 0x6dda8220, 0x3a8b3: 0x6dda8420, + 0x3a8b4: 0x6dda8620, 0x3a8b5: 0x6dda8820, 0x3a8b6: 0x6dda8a20, 0x3a8b7: 0x6dda8c20, + 0x3a8b8: 0x6dda8e20, 0x3a8b9: 0x6dda9020, 0x3a8ba: 0x6dda9220, 0x3a8bb: 0x6dda9420, + 0x3a8bc: 0x6dda9620, 0x3a8bd: 0x6dda9820, 0x3a8be: 0x6dda9a20, 0x3a8bf: 0x6dda9c20, + // Block 0xea3, offset 0x3a8c0 + 0x3a8c0: 0x6dda9e20, 0x3a8c1: 0x6ddaa020, 0x3a8c2: 0x6ddaa220, 0x3a8c3: 0x6df25e20, + 0x3a8c4: 0x6df26020, 0x3a8c5: 0x6df26220, 0x3a8c6: 0x6df26420, 0x3a8c7: 0x6df26620, + 0x3a8c8: 0x6df26820, 0x3a8c9: 0x6df26a20, 0x3a8ca: 0x6df26c20, 0x3a8cb: 0x6df26e20, + 0x3a8cc: 0x6df27020, 0x3a8cd: 0x6df27220, 0x3a8ce: 0x6df27420, 0x3a8cf: 0x6df27620, + 0x3a8d0: 0x6df27820, 0x3a8d1: 0x6df27a20, 0x3a8d2: 0x6df27c20, 0x3a8d3: 0x6df27e20, + 0x3a8d4: 0x6df28020, 0x3a8d5: 0x6df28220, 0x3a8d6: 0x6df28420, 0x3a8d7: 0x6df28620, + 0x3a8d8: 0x6df28820, 0x3a8d9: 0x6df28a20, 0x3a8da: 0x6df28c20, 0x3a8db: 0x6df28e20, + 0x3a8dc: 0x6df29020, 0x3a8dd: 0x6df29220, 0x3a8de: 0x6df29420, 0x3a8df: 0x6df29620, + 0x3a8e0: 0x6df29820, 0x3a8e1: 0x6df29a20, 0x3a8e2: 0x6df29c20, 0x3a8e3: 0x6df29e20, + 0x3a8e4: 0x6df2a020, 0x3a8e5: 0x6df2a220, 0x3a8e6: 0x6e069820, 0x3a8e7: 0x6e069a20, + 0x3a8e8: 0x6e069c20, 0x3a8e9: 0x6e069e20, 0x3a8ea: 0x6e06a020, 0x3a8eb: 0x6e06a220, + 0x3a8ec: 0x6e06a420, 0x3a8ed: 0x6e06a620, 0x3a8ee: 0x6e06a820, 0x3a8ef: 0x6e06aa20, + 0x3a8f0: 0x6e06ac20, 0x3a8f1: 0x6e06ae20, 0x3a8f2: 0x6e06b020, 0x3a8f3: 0x6e06b220, + 0x3a8f4: 0x6e06b420, 0x3a8f5: 0x6e06b620, 0x3a8f6: 0x6e06b820, 0x3a8f7: 0x6e06ba20, + 0x3a8f8: 0x6e06bc20, 0x3a8f9: 0x6e06be20, 0x3a8fa: 0x6e06c020, 0x3a8fb: 0x6e06c220, + 0x3a8fc: 0x6e06c420, 0x3a8fd: 0x6e06c620, 0x3a8fe: 0x6e06c820, 0x3a8ff: 0x6e06ca20, + // Block 0xea4, offset 0x3a900 + 0x3a900: 0x6e06cc20, 0x3a901: 0x6e06ce20, 0x3a902: 0x6e06d020, 0x3a903: 0x6e171e20, + 0x3a904: 0x6e172020, 0x3a905: 0x6e172220, 0x3a906: 0x6e172420, 0x3a907: 0x6e172620, + 0x3a908: 0x6e172820, 0x3a909: 0x6e172a20, 0x3a90a: 0x6e172c20, 0x3a90b: 0x6e172e20, + 0x3a90c: 0x6e173020, 0x3a90d: 0x6e173220, 0x3a90e: 0x6e173420, 0x3a90f: 0x6e173620, + 0x3a910: 0x6e173820, 0x3a911: 0x6e173a20, 0x3a912: 0x6e173c20, 0x3a913: 0x6e242020, + 0x3a914: 0x6e242220, 0x3a915: 0x6e242420, 0x3a916: 0x6e242620, 0x3a917: 0x6e242820, + 0x3a918: 0x6e242a20, 0x3a919: 0x6e242c20, 0x3a91a: 0x6e242e20, 0x3a91b: 0x6e243020, + 0x3a91c: 0x6e243220, 0x3a91d: 0x6e243420, 0x3a91e: 0x6e243620, 0x3a91f: 0x6e243820, + 0x3a920: 0x6e243a20, 0x3a921: 0x6e243c20, 0x3a922: 0x6e243e20, 0x3a923: 0x6e244020, + 0x3a924: 0x6e244220, 0x3a925: 0x6e2e1220, 0x3a926: 0x6e2e1420, 0x3a927: 0x6e2e1620, + 0x3a928: 0x6e2e1820, 0x3a929: 0x6e2e1a20, 0x3a92a: 0x6e2e1c20, 0x3a92b: 0x6e2e1e20, + 0x3a92c: 0x6e2e2020, 0x3a92d: 0x6e2e2220, 0x3a92e: 0x6e2e2420, 0x3a92f: 0x6e2e2620, + 0x3a930: 0x6e2e2820, 0x3a931: 0x6e2e2a20, 0x3a932: 0x6e35c220, 0x3a933: 0x6e35c420, + 0x3a934: 0x6e35c620, 0x3a935: 0x6e35c820, 0x3a936: 0x6e35ca20, 0x3a937: 0x6e35cc20, + 0x3a938: 0x6e3b2420, 0x3a939: 0x6e3b2620, 0x3a93a: 0x6e3b2820, 0x3a93b: 0x6e3b9e20, + 0x3a93c: 0x6e3b2a20, 0x3a93d: 0x6e3b2c20, 0x3a93e: 0x6e3b2e20, 0x3a93f: 0x6e3ee220, + // Block 0xea5, offset 0x3a940 + 0x3a940: 0x6e3ee420, 0x3a941: 0x6e3ee620, 0x3a942: 0x6e3ee820, 0x3a943: 0x6e3eea20, + 0x3a944: 0x6e3eec20, 0x3a945: 0x6e3eee20, 0x3a946: 0x6e3ef020, 0x3a947: 0x6e417820, + 0x3a948: 0x6e436a20, 0x3a949: 0x6e436c20, 0x3a94a: 0x6e436e20, 0x3a94b: 0x6e457020, + 0x3a94c: 0x6e464e20, 0x3a94d: 0x6e465020, 0x3a94e: 0x6e469420, 0x3a94f: 0x6e469620, + 0x3a950: 0x6e46b620, 0x3a951: 0x6e471a20, 0x3a952: 0x6ce73620, 0x3a953: 0x6d15c820, + 0x3a954: 0x6d15ca20, 0x3a955: 0x6d15cc20, 0x3a956: 0x6d15ce20, 0x3a957: 0x6d15d020, + 0x3a958: 0x6d43e420, 0x3a959: 0x6d43e620, 0x3a95a: 0x6d43e820, 0x3a95b: 0x6d43ea20, + 0x3a95c: 0x6d43ec20, 0x3a95d: 0x6d43ee20, 0x3a95e: 0x6d43f020, 0x3a95f: 0x6d43f220, + 0x3a960: 0x6d43f420, 0x3a961: 0x6d43f620, 0x3a962: 0x6d43f820, 0x3a963: 0x6d43fa20, + 0x3a964: 0x6d70c820, 0x3a965: 0x6d70ca20, 0x3a966: 0x6d70cc20, 0x3a967: 0x6d70ce20, + 0x3a968: 0x6d70d020, 0x3a969: 0x6d70d220, 0x3a96a: 0x6d70d420, 0x3a96b: 0x6d70d620, + 0x3a96c: 0x6d70d820, 0x3a96d: 0x6d70da20, 0x3a96e: 0x6d70dc20, 0x3a96f: 0x6d99f020, + 0x3a970: 0x6d99f220, 0x3a971: 0x6d99f420, 0x3a972: 0x6d99f620, 0x3a973: 0x6d99f820, + 0x3a974: 0x6d99fa20, 0x3a975: 0x6d99fc20, 0x3a976: 0x6d99fe20, 0x3a977: 0x6d9a0020, + 0x3a978: 0x6dbccc20, 0x3a979: 0x6dbcce20, 0x3a97a: 0x6dbcd020, 0x3a97b: 0x6dbcd220, + 0x3a97c: 0x6dbcd420, 0x3a97d: 0x6dbcd620, 0x3a97e: 0x6dbcd820, 0x3a97f: 0x6dbcda20, + // Block 0xea6, offset 0x3a980 + 0x3a980: 0x6dbcdc20, 0x3a981: 0x6dbcde20, 0x3a982: 0x6dbce020, 0x3a983: 0x6dbce220, + 0x3a984: 0x6dbce420, 0x3a985: 0x6ddab420, 0x3a986: 0x6ddab620, 0x3a987: 0x6ddab820, + 0x3a988: 0x6ddaba20, 0x3a989: 0x6ddabc20, 0x3a98a: 0x6ddabe20, 0x3a98b: 0x6ddac020, + 0x3a98c: 0x6ddac220, 0x3a98d: 0x6ddac420, 0x3a98e: 0x6ddac620, 0x3a98f: 0x6df2b020, + 0x3a990: 0x6df2b220, 0x3a991: 0x6df2b420, 0x3a992: 0x6df2b620, 0x3a993: 0x6df2b820, + 0x3a994: 0x6df2ba20, 0x3a995: 0x6df2bc20, 0x3a996: 0x6df2be20, 0x3a997: 0x6df2c020, + 0x3a998: 0x6e06d820, 0x3a999: 0x6e06da20, 0x3a99a: 0x6e06dc20, 0x3a99b: 0x6e06de20, + 0x3a99c: 0x6e06e020, 0x3a99d: 0x6e06e220, 0x3a99e: 0x6e06e420, 0x3a99f: 0x6e06e620, + 0x3a9a0: 0x6e174620, 0x3a9a1: 0x6e174820, 0x3a9a2: 0x6e174a20, 0x3a9a3: 0x6e174c20, + 0x3a9a4: 0x6e174e20, 0x3a9a5: 0x6e175020, 0x3a9a6: 0x6e175220, 0x3a9a7: 0x6e175420, + 0x3a9a8: 0x6e244a20, 0x3a9a9: 0x6e244c20, 0x3a9aa: 0x6e244e20, 0x3a9ab: 0x6e245020, + 0x3a9ac: 0x6e245220, 0x3a9ad: 0x6e245420, 0x3a9ae: 0x6e2e2e20, 0x3a9af: 0x6e2e3020, + 0x3a9b0: 0x6e2e3220, 0x3a9b1: 0x6e2e3420, 0x3a9b2: 0x6e35d220, 0x3a9b3: 0x6e35d420, + 0x3a9b4: 0x6e3b3020, 0x3a9b5: 0x6e3ef220, 0x3a9b6: 0x6e417a20, 0x3a9b7: 0x6e417c20, + 0x3a9b8: 0x6e417e20, 0x3a9b9: 0x6e437020, 0x3a9ba: 0x6e44b420, 0x3a9bb: 0x6e44b620, + 0x3a9bc: 0x6c428220, 0x3a9bd: 0x6c633820, 0x3a9be: 0x6c633a20, 0x3a9bf: 0x6d15d820, + // Block 0xea7, offset 0x3a9c0 + 0x3a9c0: 0x6d15da20, 0x3a9c1: 0x6d15e220, 0x3a9c2: 0x6d15e420, 0x3a9c3: 0x6d70e420, + 0x3a9c4: 0x6d9a0620, 0x3a9c5: 0x6dbcec20, 0x3a9c6: 0x6dbcee20, 0x3a9c7: 0x6dbcf020, + 0x3a9c8: 0x6ddac820, 0x3a9c9: 0x6df2c820, 0x3a9ca: 0x6df2ca20, 0x3a9cb: 0x6e06ec20, + 0x3a9cc: 0x6e175820, 0x3a9cd: 0x6e06ee20, 0x3a9ce: 0x6e06f020, 0x3a9cf: 0x6e175a20, + 0x3a9d0: 0x6e175c20, 0x3a9d1: 0x6e245620, 0x3a9d2: 0x6e245820, 0x3a9d3: 0x6e245a20, + 0x3a9d4: 0x6e2e3820, 0x3a9d5: 0x6e2e3a20, 0x3a9d6: 0x6e3b3220, 0x3a9d7: 0x6ce74220, + 0x3a9d8: 0x6d15ec20, 0x3a9d9: 0x6d15ee20, 0x3a9da: 0x6d440820, 0x3a9db: 0x6d440a20, + 0x3a9dc: 0x6d440c20, 0x3a9dd: 0x6d440e20, 0x3a9de: 0x6d70e620, 0x3a9df: 0x6d70e820, + 0x3a9e0: 0x6d70ea20, 0x3a9e1: 0x6d70ec20, 0x3a9e2: 0x6d70ee20, 0x3a9e3: 0x6d70f020, + 0x3a9e4: 0x6d70f220, 0x3a9e5: 0x6d70f420, 0x3a9e6: 0x6d70f620, 0x3a9e7: 0x6d9a0e20, + 0x3a9e8: 0x6d9a1020, 0x3a9e9: 0x6d9a1220, 0x3a9ea: 0x6d9a1420, 0x3a9eb: 0x6d9a1620, + 0x3a9ec: 0x6d9a1820, 0x3a9ed: 0x6dbcf220, 0x3a9ee: 0x6dbcf420, 0x3a9ef: 0x6dbcf620, + 0x3a9f0: 0x6dbcf820, 0x3a9f1: 0x6ddad020, 0x3a9f2: 0x6ddad220, 0x3a9f3: 0x6ddad420, + 0x3a9f4: 0x6ddad620, 0x3a9f5: 0x6df2d420, 0x3a9f6: 0x6df2d620, 0x3a9f7: 0x6df2d820, + 0x3a9f8: 0x6df2da20, 0x3a9f9: 0x6e06f820, 0x3a9fa: 0x6e06fa20, 0x3a9fb: 0x6e06fc20, + 0x3a9fc: 0x6e06fe20, 0x3a9fd: 0x6e070020, 0x3a9fe: 0x6e070220, 0x3a9ff: 0x6e175e20, + // Block 0xea8, offset 0x3aa00 + 0x3aa00: 0x6e176020, 0x3aa01: 0x6e176220, 0x3aa02: 0x6e245e20, 0x3aa03: 0x6e246020, + 0x3aa04: 0x6e246220, 0x3aa05: 0x6e246420, 0x3aa06: 0x6e246620, 0x3aa07: 0x6e2e3e20, + 0x3aa08: 0x6e35d820, 0x3aa09: 0x6e418020, 0x3aa0a: 0x6e469820, 0x3aa0b: 0x6c634220, + 0x3aa0c: 0x6cb6b820, 0x3aa0d: 0x6cb6ba20, 0x3aa0e: 0x6cb6bc20, 0x3aa0f: 0x6cb6be20, + 0x3aa10: 0x6ce75020, 0x3aa11: 0x6ce75220, 0x3aa12: 0x6ce75420, 0x3aa13: 0x6ce75620, + 0x3aa14: 0x6ce75820, 0x3aa15: 0x6ce75a20, 0x3aa16: 0x6ce75c20, 0x3aa17: 0x6ce75e20, + 0x3aa18: 0x6ce76020, 0x3aa19: 0x6d160e20, 0x3aa1a: 0x6d161020, 0x3aa1b: 0x6d161220, + 0x3aa1c: 0x6d161420, 0x3aa1d: 0x6d161620, 0x3aa1e: 0x6d161820, 0x3aa1f: 0x6d161a20, + 0x3aa20: 0x6d161c20, 0x3aa21: 0x6d161e20, 0x3aa22: 0x6d162020, 0x3aa23: 0x6d162220, + 0x3aa24: 0x6d162420, 0x3aa25: 0x6d162620, 0x3aa26: 0x6d162820, 0x3aa27: 0x6d162a20, + 0x3aa28: 0x6d162c20, 0x3aa29: 0x6d162e20, 0x3aa2a: 0x6d163020, 0x3aa2b: 0x6d163220, + 0x3aa2c: 0x6d163420, 0x3aa2d: 0x6d163620, 0x3aa2e: 0x6d163820, 0x3aa2f: 0x6d163a20, + 0x3aa30: 0x6d443220, 0x3aa31: 0x6d443420, 0x3aa32: 0x6d443620, 0x3aa33: 0x6d443820, + 0x3aa34: 0x6d443a20, 0x3aa35: 0x6d443c20, 0x3aa36: 0x6d443e20, 0x3aa37: 0x6d444020, + 0x3aa38: 0x6d444220, 0x3aa39: 0x6d444420, 0x3aa3a: 0x6d444620, 0x3aa3b: 0x6d444820, + 0x3aa3c: 0x6d444a20, 0x3aa3d: 0x6d444c20, 0x3aa3e: 0x6d444e20, 0x3aa3f: 0x6d445020, + // Block 0xea9, offset 0x3aa40 + 0x3aa40: 0x6d445220, 0x3aa41: 0x6d445420, 0x3aa42: 0x6d445620, 0x3aa43: 0x6d445820, + 0x3aa44: 0x6d445a20, 0x3aa45: 0x6d445c20, 0x3aa46: 0x6d445e20, 0x3aa47: 0x6d446020, + 0x3aa48: 0x6d446220, 0x3aa49: 0x6d446420, 0x3aa4a: 0x6d446620, 0x3aa4b: 0x6d446820, + 0x3aa4c: 0x6d446a20, 0x3aa4d: 0x6d446c20, 0x3aa4e: 0x6d446e20, 0x3aa4f: 0x6d712020, + 0x3aa50: 0x6d712220, 0x3aa51: 0x6d712420, 0x3aa52: 0x6d712620, 0x3aa53: 0x6d712820, + 0x3aa54: 0x6d712a20, 0x3aa55: 0x6d712c20, 0x3aa56: 0x6d712e20, 0x3aa57: 0x6d713020, + 0x3aa58: 0x6d713220, 0x3aa59: 0x6d713420, 0x3aa5a: 0x6d713620, 0x3aa5b: 0x6d713820, + 0x3aa5c: 0x6d713a20, 0x3aa5d: 0x6d713c20, 0x3aa5e: 0x6d713e20, 0x3aa5f: 0x6d714020, + 0x3aa60: 0x6d714220, 0x3aa61: 0x6d714420, 0x3aa62: 0x6d714620, 0x3aa63: 0x6d714820, + 0x3aa64: 0x6d714a20, 0x3aa65: 0x6d714c20, 0x3aa66: 0x6d714e20, 0x3aa67: 0x6d715020, + 0x3aa68: 0x6d715220, 0x3aa69: 0x6d715420, 0x3aa6a: 0x6d715620, 0x3aa6b: 0x6d715820, + 0x3aa6c: 0x6d715a20, 0x3aa6d: 0x6d715c20, 0x3aa6e: 0x6d9a5020, 0x3aa6f: 0x6d9a5220, + 0x3aa70: 0x6d9a5420, 0x3aa71: 0x6d9a5620, 0x3aa72: 0x6d9a5820, 0x3aa73: 0x6d9a5a20, + 0x3aa74: 0x6d9a5c20, 0x3aa75: 0x6d9a5e20, 0x3aa76: 0x6d9a6020, 0x3aa77: 0x6d9a6220, + 0x3aa78: 0x6d9a6420, 0x3aa79: 0x6d9a6620, 0x3aa7a: 0x6d9a6820, 0x3aa7b: 0x6d9a6a20, + 0x3aa7c: 0x6d9a6c20, 0x3aa7d: 0x6d9a6e20, 0x3aa7e: 0x6d9a7020, 0x3aa7f: 0x6d9a7220, + // Block 0xeaa, offset 0x3aa80 + 0x3aa80: 0x6d9a7420, 0x3aa81: 0x6d9a7620, 0x3aa82: 0x6d9a7820, 0x3aa83: 0x6d9a7a20, + 0x3aa84: 0x6d9a7c20, 0x3aa85: 0x6d9a7e20, 0x3aa86: 0x6d9a8020, 0x3aa87: 0x6d9a8220, + 0x3aa88: 0x6d9a8420, 0x3aa89: 0x6d9a8620, 0x3aa8a: 0x6d9a8820, 0x3aa8b: 0x6d9a8a20, + 0x3aa8c: 0x6d9a8c20, 0x3aa8d: 0x6d9a8e20, 0x3aa8e: 0x6d9a9020, 0x3aa8f: 0x6d9a9220, + 0x3aa90: 0x6d9a9420, 0x3aa91: 0x6d9a9620, 0x3aa92: 0x6d9a9820, 0x3aa93: 0x6d9a9a20, + 0x3aa94: 0x6d9a9c20, 0x3aa95: 0x6d9a9e20, 0x3aa96: 0x6d9aa020, 0x3aa97: 0x6d9aa220, + 0x3aa98: 0x6d9aa420, 0x3aa99: 0x6d9aa620, 0x3aa9a: 0x6d9aa820, 0x3aa9b: 0x6d9aaa20, + 0x3aa9c: 0x6d9aac20, 0x3aa9d: 0x6dbd2220, 0x3aa9e: 0x6dbd2420, 0x3aa9f: 0x6dbd2620, + 0x3aaa0: 0x6dbd2820, 0x3aaa1: 0x6dbd2a20, 0x3aaa2: 0x6dbd2c20, 0x3aaa3: 0x6dbd2e20, + 0x3aaa4: 0x6dbd3020, 0x3aaa5: 0x6dbd3220, 0x3aaa6: 0x6dbd3420, 0x3aaa7: 0x6dbd3620, + 0x3aaa8: 0x6dbd3820, 0x3aaa9: 0x6dbd3a20, 0x3aaaa: 0x6dbd3c20, 0x3aaab: 0x6dbd3e20, + 0x3aaac: 0x6dbd4020, 0x3aaad: 0x6dbd4220, 0x3aaae: 0x6dbd4420, 0x3aaaf: 0x6dbd4620, + 0x3aab0: 0x6dbd4820, 0x3aab1: 0x6dbd4a20, 0x3aab2: 0x6dbd4c20, 0x3aab3: 0x6dbd4e20, + 0x3aab4: 0x6dbd5020, 0x3aab5: 0x6dbd5220, 0x3aab6: 0x6dbd5420, 0x3aab7: 0x6dbd5620, + 0x3aab8: 0x6dbd5820, 0x3aab9: 0x6dbd5a20, 0x3aaba: 0x6dbd5c20, 0x3aabb: 0x6dbd5e20, + 0x3aabc: 0x6dbd6020, 0x3aabd: 0x6dbd6220, 0x3aabe: 0x6dbd6420, 0x3aabf: 0x6dbd6620, + // Block 0xeab, offset 0x3aac0 + 0x3aac0: 0x6ddb0820, 0x3aac1: 0x6ddb0a20, 0x3aac2: 0x6ddb0c20, 0x3aac3: 0x6ddb0e20, + 0x3aac4: 0x6ddb1020, 0x3aac5: 0x6ddb1220, 0x3aac6: 0x6ddb1420, 0x3aac7: 0x6ddb1620, + 0x3aac8: 0x6ddb1820, 0x3aac9: 0x6ddb1a20, 0x3aaca: 0x6ddb1c20, 0x3aacb: 0x6ddb1e20, + 0x3aacc: 0x6ddb2020, 0x3aacd: 0x6ddb2220, 0x3aace: 0x6ddb2420, 0x3aacf: 0x6ddb2620, + 0x3aad0: 0x6ddb2820, 0x3aad1: 0x6ddb2a20, 0x3aad2: 0x6ddb2c20, 0x3aad3: 0x6ddb2e20, + 0x3aad4: 0x6ddb3020, 0x3aad5: 0x6ddb3220, 0x3aad6: 0x6ddb3420, 0x3aad7: 0x6ddb3620, + 0x3aad8: 0x6ddb3820, 0x3aad9: 0x6df30220, 0x3aada: 0x6df30420, 0x3aadb: 0x6df30620, + 0x3aadc: 0x6df30820, 0x3aadd: 0x6df30a20, 0x3aade: 0x6df30c20, 0x3aadf: 0x6df30e20, + 0x3aae0: 0x6df31020, 0x3aae1: 0x6df31220, 0x3aae2: 0x6df31420, 0x3aae3: 0x6df31620, + 0x3aae4: 0x6df31820, 0x3aae5: 0x6df31a20, 0x3aae6: 0x6df31c20, 0x3aae7: 0x6df31e20, + 0x3aae8: 0x6df32020, 0x3aae9: 0x6df32220, 0x3aaea: 0x6df32420, 0x3aaeb: 0x6df32620, + 0x3aaec: 0x6df32820, 0x3aaed: 0x6df32a20, 0x3aaee: 0x6df32c20, 0x3aaef: 0x6df32e20, + 0x3aaf0: 0x6df33020, 0x3aaf1: 0x6df33220, 0x3aaf2: 0x6df33420, 0x3aaf3: 0x6e071820, + 0x3aaf4: 0x6e071a20, 0x3aaf5: 0x6e071c20, 0x3aaf6: 0x6e071e20, 0x3aaf7: 0x6e072020, + 0x3aaf8: 0x6e072220, 0x3aaf9: 0x6e072420, 0x3aafa: 0x6e072620, 0x3aafb: 0x6e072820, + 0x3aafc: 0x6e072a20, 0x3aafd: 0x6e072c20, 0x3aafe: 0x6e072e20, 0x3aaff: 0x6e073020, + // Block 0xeac, offset 0x3ab00 + 0x3ab00: 0x6e073220, 0x3ab01: 0x6e073420, 0x3ab02: 0x6e073620, 0x3ab03: 0x6e073820, + 0x3ab04: 0x6e073a20, 0x3ab05: 0x6e073c20, 0x3ab06: 0x6e073e20, 0x3ab07: 0x6e074020, + 0x3ab08: 0x6e074220, 0x3ab09: 0x6e177c20, 0x3ab0a: 0x6e177e20, 0x3ab0b: 0x6e178020, + 0x3ab0c: 0x6e178220, 0x3ab0d: 0x6e178420, 0x3ab0e: 0x6e178620, 0x3ab0f: 0x6e178820, + 0x3ab10: 0x6e178a20, 0x3ab11: 0x6e178c20, 0x3ab12: 0x6e178e20, 0x3ab13: 0x6e179020, + 0x3ab14: 0x6e179220, 0x3ab15: 0x6e179420, 0x3ab16: 0x6e179620, 0x3ab17: 0x6e179820, + 0x3ab18: 0x6e179a20, 0x3ab19: 0x6e179c20, 0x3ab1a: 0x6e179e20, 0x3ab1b: 0x6e17a020, + 0x3ab1c: 0x6e17a220, 0x3ab1d: 0x6e17a420, 0x3ab1e: 0x6e17a620, 0x3ab1f: 0x6e247420, + 0x3ab20: 0x6e247620, 0x3ab21: 0x6e247820, 0x3ab22: 0x6e247a20, 0x3ab23: 0x6e247c20, + 0x3ab24: 0x6e247e20, 0x3ab25: 0x6e248020, 0x3ab26: 0x6e248220, 0x3ab27: 0x6e248420, + 0x3ab28: 0x6e248620, 0x3ab29: 0x6e248820, 0x3ab2a: 0x6e248a20, 0x3ab2b: 0x6e248c20, + 0x3ab2c: 0x6e2e4820, 0x3ab2d: 0x6e2e4a20, 0x3ab2e: 0x6e2e4c20, 0x3ab2f: 0x6e2e4e20, + 0x3ab30: 0x6e2e5020, 0x3ab31: 0x6e2e5220, 0x3ab32: 0x6e2e5420, 0x3ab33: 0x6e2e5620, + 0x3ab34: 0x6e2e5820, 0x3ab35: 0x6e2e5a20, 0x3ab36: 0x6e2e5c20, 0x3ab37: 0x6e2e5e20, + 0x3ab38: 0x6e2e6020, 0x3ab39: 0x6e2e6220, 0x3ab3a: 0x6e2e6420, 0x3ab3b: 0x6e2e6620, + 0x3ab3c: 0x6e2e6820, 0x3ab3d: 0x6e2e6a20, 0x3ab3e: 0x6e35e020, 0x3ab3f: 0x6e35e220, + // Block 0xead, offset 0x3ab40 + 0x3ab40: 0x6e35e420, 0x3ab41: 0x6e35e620, 0x3ab42: 0x6e35e820, 0x3ab43: 0x6e35ea20, + 0x3ab44: 0x6e35ec20, 0x3ab45: 0x6e35ee20, 0x3ab46: 0x6e3b3c20, 0x3ab47: 0x6e3b3e20, + 0x3ab48: 0x6e3b4020, 0x3ab49: 0x6e3ef420, 0x3ab4a: 0x6e3ef620, 0x3ab4b: 0x6e3ef820, + 0x3ab4c: 0x6e3efa20, 0x3ab4d: 0x6e3efc20, 0x3ab4e: 0x6e3efe20, 0x3ab4f: 0x6e418620, + 0x3ab50: 0x6e418820, 0x3ab51: 0x6e418a20, 0x3ab52: 0x6e44b820, 0x3ab53: 0x6e44ba20, + 0x3ab54: 0x6e460020, 0x3ab55: 0x6d447420, 0x3ab56: 0x6d447620, 0x3ab57: 0x6df33a20, + 0x3ab58: 0x6cb6ce20, 0x3ab59: 0x6cb6d020, 0x3ab5a: 0x6ce77e20, 0x3ab5b: 0x6ce78020, + 0x3ab5c: 0x6ce78220, 0x3ab5d: 0x6ce78420, 0x3ab5e: 0x6ce78620, 0x3ab5f: 0x6ce78820, + 0x3ab60: 0x6ce78a20, 0x3ab61: 0x6ce78c20, 0x3ab62: 0x6d165c20, 0x3ab63: 0x6d165e20, + 0x3ab64: 0x6d166020, 0x3ab65: 0x6d166220, 0x3ab66: 0x6d166420, 0x3ab67: 0x6d166620, + 0x3ab68: 0x6d166820, 0x3ab69: 0x6d166a20, 0x3ab6a: 0x6d166c20, 0x3ab6b: 0x6d166e20, + 0x3ab6c: 0x6d167020, 0x3ab6d: 0x6d167220, 0x3ab6e: 0x6d167420, 0x3ab6f: 0x6d167620, + 0x3ab70: 0x6cf59620, 0x3ab71: 0x6d167820, 0x3ab72: 0x6d167a20, 0x3ab73: 0x6d167c20, + 0x3ab74: 0x6d449420, 0x3ab75: 0x6d449620, 0x3ab76: 0x6d449820, 0x3ab77: 0x6d449a20, + 0x3ab78: 0x6d449c20, 0x3ab79: 0x6d449e20, 0x3ab7a: 0x6d44a020, 0x3ab7b: 0x6d44a220, + 0x3ab7c: 0x6d44a420, 0x3ab7d: 0x6d44a620, 0x3ab7e: 0x6d44a820, 0x3ab7f: 0x6d44aa20, + // Block 0xeae, offset 0x3ab80 + 0x3ab80: 0x6d44ac20, 0x3ab81: 0x6d44ae20, 0x3ab82: 0x6d44b020, 0x3ab83: 0x6d44b220, + 0x3ab84: 0x6d717620, 0x3ab85: 0x6d717820, 0x3ab86: 0x6d717a20, 0x3ab87: 0x6d717c20, + 0x3ab88: 0x6d717e20, 0x3ab89: 0x6d718020, 0x3ab8a: 0x6d718220, 0x3ab8b: 0x6d718420, + 0x3ab8c: 0x6d718620, 0x3ab8d: 0x6d718820, 0x3ab8e: 0x6d718a20, 0x3ab8f: 0x6d718c20, + 0x3ab90: 0x6d718e20, 0x3ab91: 0x6d719020, 0x3ab92: 0x6d719220, 0x3ab93: 0x6d9aca20, + 0x3ab94: 0x6d9acc20, 0x3ab95: 0x6d9ace20, 0x3ab96: 0x6d9ad020, 0x3ab97: 0x6d9ad220, + 0x3ab98: 0x6d9ad420, 0x3ab99: 0x6d9ad620, 0x3ab9a: 0x6d9ad820, 0x3ab9b: 0x6d9ada20, + 0x3ab9c: 0x6d9adc20, 0x3ab9d: 0x6d9ade20, 0x3ab9e: 0x6d9ae020, 0x3ab9f: 0x6d9ae220, + 0x3aba0: 0x6d9ae420, 0x3aba1: 0x6d9ae620, 0x3aba2: 0x6d9ae820, 0x3aba3: 0x6d9aea20, + 0x3aba4: 0x6d9aec20, 0x3aba5: 0x6d9aee20, 0x3aba6: 0x6d9af020, 0x3aba7: 0x6d9af220, + 0x3aba8: 0x6dbd7c20, 0x3aba9: 0x6dbd7e20, 0x3abaa: 0x6dbd8020, 0x3abab: 0x6dbd8220, + 0x3abac: 0x6dbd8420, 0x3abad: 0x6dbd8620, 0x3abae: 0x6dbd8820, 0x3abaf: 0x6dbd8a20, + 0x3abb0: 0x6dbd8c20, 0x3abb1: 0x6dbd8e20, 0x3abb2: 0x6dbd9020, 0x3abb3: 0x6dbd9220, + 0x3abb4: 0x6dbd9420, 0x3abb5: 0x6dbd9620, 0x3abb6: 0x6dbd9820, 0x3abb7: 0x6dbd9a20, + 0x3abb8: 0x6dbd9c20, 0x3abb9: 0x6dbd9e20, 0x3abba: 0x6dbda020, 0x3abbb: 0x6dbda220, + 0x3abbc: 0x6dbda420, 0x3abbd: 0x6dbda620, 0x3abbe: 0x6dbda820, 0x3abbf: 0x6dbdaa20, + // Block 0xeaf, offset 0x3abc0 + 0x3abc0: 0x6dbdac20, 0x3abc1: 0x6dbdae20, 0x3abc2: 0x6dbdb020, 0x3abc3: 0x6dbdb220, + 0x3abc4: 0x6dbdb420, 0x3abc5: 0x6ddb5620, 0x3abc6: 0x6ddb5820, 0x3abc7: 0x6ddb5a20, + 0x3abc8: 0x6ddb5c20, 0x3abc9: 0x6ddb5e20, 0x3abca: 0x6ddb6020, 0x3abcb: 0x6ddb6220, + 0x3abcc: 0x6ddb6420, 0x3abcd: 0x6ddb6620, 0x3abce: 0x6df34e20, 0x3abcf: 0x6ddb6820, + 0x3abd0: 0x6ddb6a20, 0x3abd1: 0x6ddb6c20, 0x3abd2: 0x6ddb6e20, 0x3abd3: 0x6ddb7020, + 0x3abd4: 0x6ddb7220, 0x3abd5: 0x6ddb7420, 0x3abd6: 0x6ddb7620, 0x3abd7: 0x6ddb7820, + 0x3abd8: 0x6ddb7a20, 0x3abd9: 0x6ddb7c20, 0x3abda: 0x6ddb7e20, 0x3abdb: 0x6ddb8020, + 0x3abdc: 0x6df35020, 0x3abdd: 0x6df35220, 0x3abde: 0x6df35420, 0x3abdf: 0x6df35620, + 0x3abe0: 0x6df35820, 0x3abe1: 0x6df35a20, 0x3abe2: 0x6df35c20, 0x3abe3: 0x6df35e20, + 0x3abe4: 0x6df36020, 0x3abe5: 0x6df36220, 0x3abe6: 0x6df36420, 0x3abe7: 0x6df36620, + 0x3abe8: 0x6df36820, 0x3abe9: 0x6df36a20, 0x3abea: 0x6df36c20, 0x3abeb: 0x6df36e20, + 0x3abec: 0x6df37020, 0x3abed: 0x6e075620, 0x3abee: 0x6e075820, 0x3abef: 0x6e075a20, + 0x3abf0: 0x6e075c20, 0x3abf1: 0x6e075e20, 0x3abf2: 0x6e076020, 0x3abf3: 0x6e076220, + 0x3abf4: 0x6e076420, 0x3abf5: 0x6e076620, 0x3abf6: 0x6e076820, 0x3abf7: 0x6e076a20, + 0x3abf8: 0x6e17bc20, 0x3abf9: 0x6e17be20, 0x3abfa: 0x6e17c020, 0x3abfb: 0x6e17c220, + 0x3abfc: 0x6e17c420, 0x3abfd: 0x6e17c620, 0x3abfe: 0x6e17c820, 0x3abff: 0x6e17ca20, + // Block 0xeb0, offset 0x3ac00 + 0x3ac00: 0x6e17cc20, 0x3ac01: 0x6e17ce20, 0x3ac02: 0x6e17d020, 0x3ac03: 0x6e17d220, + 0x3ac04: 0x6e17d420, 0x3ac05: 0x6e17d620, 0x3ac06: 0x6e17d820, 0x3ac07: 0x6e17da20, + 0x3ac08: 0x6e249220, 0x3ac09: 0x6e249420, 0x3ac0a: 0x6e249620, 0x3ac0b: 0x6e249820, + 0x3ac0c: 0x6e249a20, 0x3ac0d: 0x6e249c20, 0x3ac0e: 0x6e2e7020, 0x3ac0f: 0x6e2e7220, + 0x3ac10: 0x6e2e7420, 0x3ac11: 0x6e35f420, 0x3ac12: 0x6e35f620, 0x3ac13: 0x6e35f820, + 0x3ac14: 0x6e35fa20, 0x3ac15: 0x6e35fc20, 0x3ac16: 0x6e3b4220, 0x3ac17: 0x6e3b4420, + 0x3ac18: 0x6e3b4620, 0x3ac19: 0x6e3b4820, 0x3ac1a: 0x6e3b4a20, 0x3ac1b: 0x6e3f0020, + 0x3ac1c: 0x6e3f0220, 0x3ac1d: 0x6e419020, 0x3ac1e: 0x6e419220, 0x3ac1f: 0x6e437220, + 0x3ac20: 0x6e46d220, 0x3ac21: 0x6e46f220, 0x3ac22: 0x6e470c20, 0x3ac23: 0x6e473420, + 0x3ac24: 0x6e473a20, 0x3ac25: 0x6c635620, 0x3ac26: 0x6c635820, 0x3ac27: 0x6cb6d220, + 0x3ac28: 0x6ce79020, 0x3ac29: 0x6ce79220, 0x3ac2a: 0x6ce79420, 0x3ac2b: 0x6d168220, + 0x3ac2c: 0x6d168420, 0x3ac2d: 0x6d44bc20, 0x3ac2e: 0x6d44be20, 0x3ac2f: 0x6d9af820, + 0x3ac30: 0x6dbdb820, 0x3ac31: 0x6c635e20, 0x3ac32: 0x6d168820, 0x3ac33: 0x6d44c020, + 0x3ac34: 0x6d719620, 0x3ac35: 0x6ddb8820, 0x3ac36: 0x6df37820, 0x3ac37: 0x6df37a20, + 0x3ac38: 0x6df37c20, 0x3ac39: 0x6e076c20, 0x3ac3a: 0x6e17de20, 0x3ac3b: 0x6e17e020, + 0x3ac3c: 0x6e24a220, 0x3ac3d: 0x6e24a420, 0x3ac3e: 0x6e45ea20, 0x3ac3f: 0x6c429020, + // Block 0xeb1, offset 0x3ac40 + 0x3ac40: 0x6c429220, 0x3ac41: 0x6c429420, 0x3ac42: 0x6c636620, 0x3ac43: 0x6c429620, + 0x3ac44: 0x6c8a6e20, 0x3ac45: 0x6c8a7020, 0x3ac46: 0x6c8a7220, 0x3ac47: 0x6cb6de20, + 0x3ac48: 0x6cb6e020, 0x3ac49: 0x6cb6e220, 0x3ac4a: 0x6cb6e420, 0x3ac4b: 0x6cb6e620, + 0x3ac4c: 0x6cb6e820, 0x3ac4d: 0x6cb6ea20, 0x3ac4e: 0x6cb6ec20, 0x3ac4f: 0x6cb6ee20, + 0x3ac50: 0x6cb6f020, 0x3ac51: 0x6cb6f220, 0x3ac52: 0x6cb6f420, 0x3ac53: 0x6cb6f620, + 0x3ac54: 0x6cb6f820, 0x3ac55: 0x6ce7b020, 0x3ac56: 0x6ce7b220, 0x3ac57: 0x6ce7b420, + 0x3ac58: 0x6ce7b620, 0x3ac59: 0x6ce7b820, 0x3ac5a: 0x6ce7ba20, 0x3ac5b: 0x6ce7bc20, + 0x3ac5c: 0x6ce7be20, 0x3ac5d: 0x6ce7c020, 0x3ac5e: 0x6ce7c220, 0x3ac5f: 0x6ce7c420, + 0x3ac60: 0x6ce7c620, 0x3ac61: 0x6ce7c820, 0x3ac62: 0x6ce7ca20, 0x3ac63: 0x6ce7cc20, + 0x3ac64: 0x6ce7ce20, 0x3ac65: 0x6ce7d020, 0x3ac66: 0x6ce7d220, 0x3ac67: 0x6ce7d420, + 0x3ac68: 0x6d16b020, 0x3ac69: 0x6d16b220, 0x3ac6a: 0x6d16b420, 0x3ac6b: 0x6d16b620, + 0x3ac6c: 0x6d16b820, 0x3ac6d: 0x6d16ba20, 0x3ac6e: 0x6d16bc20, 0x3ac6f: 0x6d16be20, + 0x3ac70: 0x6d16c020, 0x3ac71: 0x6d16c220, 0x3ac72: 0x6d16c420, 0x3ac73: 0x6d16c620, + 0x3ac74: 0x6d16c820, 0x3ac75: 0x6d16ca20, 0x3ac76: 0x6d16cc20, 0x3ac77: 0x6d16ce20, + 0x3ac78: 0x6d16d020, 0x3ac79: 0x6d16d220, 0x3ac7a: 0x6d16d420, 0x3ac7b: 0x6d16d620, + 0x3ac7c: 0x6d16d820, 0x3ac7d: 0x6d16da20, 0x3ac7e: 0x6d16dc20, 0x3ac7f: 0x6d16de20, + // Block 0xeb2, offset 0x3ac80 + 0x3ac80: 0x6d16e020, 0x3ac81: 0x6d16e220, 0x3ac82: 0x6d16e420, 0x3ac83: 0x6d16e620, + 0x3ac84: 0x6d16e820, 0x3ac85: 0x6d16ea20, 0x3ac86: 0x6d16ec20, 0x3ac87: 0x6d16ee20, + 0x3ac88: 0x6d16f020, 0x3ac89: 0x6d44f020, 0x3ac8a: 0x6d44f220, 0x3ac8b: 0x6d44f420, + 0x3ac8c: 0x6d44f620, 0x3ac8d: 0x6d44f820, 0x3ac8e: 0x6d44fa20, 0x3ac8f: 0x6d44fc20, + 0x3ac90: 0x6d44fe20, 0x3ac91: 0x6d450020, 0x3ac92: 0x6d450220, 0x3ac93: 0x6d450420, + 0x3ac94: 0x6d450620, 0x3ac95: 0x6d450820, 0x3ac96: 0x6d450a20, 0x3ac97: 0x6d450c20, + 0x3ac98: 0x6d450e20, 0x3ac99: 0x6d451020, 0x3ac9a: 0x6d451220, 0x3ac9b: 0x6d451420, + 0x3ac9c: 0x6d451620, 0x3ac9d: 0x6d71c220, 0x3ac9e: 0x6d71c420, 0x3ac9f: 0x6d71c620, + 0x3aca0: 0x6d71c820, 0x3aca1: 0x6d71ca20, 0x3aca2: 0x6d71cc20, 0x3aca3: 0x6d71ce20, + 0x3aca4: 0x6d71d020, 0x3aca5: 0x6d71d220, 0x3aca6: 0x6d71d420, 0x3aca7: 0x6d71d620, + 0x3aca8: 0x6d71d820, 0x3aca9: 0x6d71da20, 0x3acaa: 0x6d71dc20, 0x3acab: 0x6d71de20, + 0x3acac: 0x6d71e020, 0x3acad: 0x6d71e220, 0x3acae: 0x6d71e420, 0x3acaf: 0x6d71e620, + 0x3acb0: 0x6d71e820, 0x3acb1: 0x6d71ea20, 0x3acb2: 0x6d71ec20, 0x3acb3: 0x6d71ee20, + 0x3acb4: 0x6d71f020, 0x3acb5: 0x6d71f220, 0x3acb6: 0x6d71f420, 0x3acb7: 0x6d71f620, + 0x3acb8: 0x6d71f820, 0x3acb9: 0x6d71fa20, 0x3acba: 0x6d9b2820, 0x3acbb: 0x6d9b2a20, + 0x3acbc: 0x6d9b2c20, 0x3acbd: 0x6d9b2e20, 0x3acbe: 0x6d9b3020, 0x3acbf: 0x6d9b3220, + // Block 0xeb3, offset 0x3acc0 + 0x3acc0: 0x6d9b3420, 0x3acc1: 0x6d9b3620, 0x3acc2: 0x6d9b3820, 0x3acc3: 0x6d9b3a20, + 0x3acc4: 0x6d9b3c20, 0x3acc5: 0x6d9b3e20, 0x3acc6: 0x6d9b4020, 0x3acc7: 0x6d9b4220, + 0x3acc8: 0x6d9b4420, 0x3acc9: 0x6d9b4620, 0x3acca: 0x6d9b4820, 0x3accb: 0x6d9b4a20, + 0x3accc: 0x6d9b4c20, 0x3accd: 0x6d9b4e20, 0x3acce: 0x6d9b5020, 0x3accf: 0x6d9b5220, + 0x3acd0: 0x6d9b5420, 0x3acd1: 0x6d9b5620, 0x3acd2: 0x6d9b5820, 0x3acd3: 0x6d9b5a20, + 0x3acd4: 0x6d9b5c20, 0x3acd5: 0x6d9b5e20, 0x3acd6: 0x6d9b6020, 0x3acd7: 0x6d9b6220, + 0x3acd8: 0x6d9b6420, 0x3acd9: 0x6d9b6620, 0x3acda: 0x6d9b6820, 0x3acdb: 0x6d9b6a20, + 0x3acdc: 0x6d9b6c20, 0x3acdd: 0x6d9b6e20, 0x3acde: 0x6d9b7020, 0x3acdf: 0x6d9b7220, + 0x3ace0: 0x6d9b7420, 0x3ace1: 0x6d9b7620, 0x3ace2: 0x6d9b7820, 0x3ace3: 0x6dbde220, + 0x3ace4: 0x6d9b7a20, 0x3ace5: 0x6d9b7c20, 0x3ace6: 0x6d9b7e20, 0x3ace7: 0x6d9b8020, + 0x3ace8: 0x6d9b8220, 0x3ace9: 0x6d9b8420, 0x3acea: 0x6d9b8620, 0x3aceb: 0x6d9b8820, + 0x3acec: 0x6d9b8a20, 0x3aced: 0x6dbde420, 0x3acee: 0x6dbde620, 0x3acef: 0x6dbde820, + 0x3acf0: 0x6dbdea20, 0x3acf1: 0x6dbdec20, 0x3acf2: 0x6dbdee20, 0x3acf3: 0x6dbdf020, + 0x3acf4: 0x6dbdf220, 0x3acf5: 0x6dbdf420, 0x3acf6: 0x6dbdf620, 0x3acf7: 0x6dbdf820, + 0x3acf8: 0x6dbdfa20, 0x3acf9: 0x6dbdfc20, 0x3acfa: 0x6dbdfe20, 0x3acfb: 0x6dbe0020, + 0x3acfc: 0x6dbe0220, 0x3acfd: 0x6dbe0420, 0x3acfe: 0x6dbe0620, 0x3acff: 0x6dbe0820, + // Block 0xeb4, offset 0x3ad00 + 0x3ad00: 0x6dbe0a20, 0x3ad01: 0x6dbe0c20, 0x3ad02: 0x6dbe0e20, 0x3ad03: 0x6dbe1020, + 0x3ad04: 0x6dbe1220, 0x3ad05: 0x6dbe1420, 0x3ad06: 0x6dbe1620, 0x3ad07: 0x6dbe1820, + 0x3ad08: 0x6dbe1a20, 0x3ad09: 0x6dbe1c20, 0x3ad0a: 0x6dbe1e20, 0x3ad0b: 0x6dbe2020, + 0x3ad0c: 0x6dbe2220, 0x3ad0d: 0x6dbe2420, 0x3ad0e: 0x6dbe2620, 0x3ad0f: 0x6dbe2820, + 0x3ad10: 0x6dbe2a20, 0x3ad11: 0x6dbe2c20, 0x3ad12: 0x6dbe2e20, 0x3ad13: 0x6dbe3020, + 0x3ad14: 0x6dbe3220, 0x3ad15: 0x6dbe3420, 0x3ad16: 0x6dbe3620, 0x3ad17: 0x6dbe3820, + 0x3ad18: 0x6dbe3a20, 0x3ad19: 0x6ddbb220, 0x3ad1a: 0x6ddbb420, 0x3ad1b: 0x6ddbb620, + 0x3ad1c: 0x6ddbb820, 0x3ad1d: 0x6ddbba20, 0x3ad1e: 0x6ddbbc20, 0x3ad1f: 0x6ddbbe20, + 0x3ad20: 0x6ddbc020, 0x3ad21: 0x6ddbc220, 0x3ad22: 0x6ddbc420, 0x3ad23: 0x6ddbc620, + 0x3ad24: 0x6ddbc820, 0x3ad25: 0x6ddbca20, 0x3ad26: 0x6ddbcc20, 0x3ad27: 0x6ddbce20, + 0x3ad28: 0x6ddbd020, 0x3ad29: 0x6ddbd220, 0x3ad2a: 0x6ddbd420, 0x3ad2b: 0x6ddbd620, + 0x3ad2c: 0x6ddbd820, 0x3ad2d: 0x6ddbda20, 0x3ad2e: 0x6ddbdc20, 0x3ad2f: 0x6ddbde20, + 0x3ad30: 0x6ddbe020, 0x3ad31: 0x6ddbe220, 0x3ad32: 0x6ddbe420, 0x3ad33: 0x6ddbe620, + 0x3ad34: 0x6df39620, 0x3ad35: 0x6ddbe820, 0x3ad36: 0x6ddbea20, 0x3ad37: 0x6ddbec20, + 0x3ad38: 0x6ddbee20, 0x3ad39: 0x6ddbf020, 0x3ad3a: 0x6ddbf220, 0x3ad3b: 0x6ddbf420, + 0x3ad3c: 0x6ddbf620, 0x3ad3d: 0x6df39820, 0x3ad3e: 0x6df39a20, 0x3ad3f: 0x6df39c20, + // Block 0xeb5, offset 0x3ad40 + 0x3ad40: 0x6df39e20, 0x3ad41: 0x6df3a020, 0x3ad42: 0x6df3a220, 0x3ad43: 0x6df3a420, + 0x3ad44: 0x6df3a620, 0x3ad45: 0x6df3a820, 0x3ad46: 0x6df3aa20, 0x3ad47: 0x6df3ac20, + 0x3ad48: 0x6df3ae20, 0x3ad49: 0x6df3b020, 0x3ad4a: 0x6df3b220, 0x3ad4b: 0x6df3b420, + 0x3ad4c: 0x6df3b620, 0x3ad4d: 0x6df3b820, 0x3ad4e: 0x6df3ba20, 0x3ad4f: 0x6df3bc20, + 0x3ad50: 0x6df3be20, 0x3ad51: 0x6df3c020, 0x3ad52: 0x6df3c220, 0x3ad53: 0x6df3c420, + 0x3ad54: 0x6df3c620, 0x3ad55: 0x6df3c820, 0x3ad56: 0x6df3ca20, 0x3ad57: 0x6df3cc20, + 0x3ad58: 0x6df3ce20, 0x3ad59: 0x6df3d020, 0x3ad5a: 0x6df3d220, 0x3ad5b: 0x6df3d420, + 0x3ad5c: 0x6df3d620, 0x3ad5d: 0x6df3d820, 0x3ad5e: 0x6df3da20, 0x3ad5f: 0x6df3dc20, + 0x3ad60: 0x6df3de20, 0x3ad61: 0x6e078820, 0x3ad62: 0x6e078a20, 0x3ad63: 0x6e078c20, + 0x3ad64: 0x6e078e20, 0x3ad65: 0x6e079020, 0x3ad66: 0x6e079220, 0x3ad67: 0x6e079420, + 0x3ad68: 0x6e079620, 0x3ad69: 0x6e079820, 0x3ad6a: 0x6e079a20, 0x3ad6b: 0x6e079c20, + 0x3ad6c: 0x6e079e20, 0x3ad6d: 0x6e07a020, 0x3ad6e: 0x6e07a220, 0x3ad6f: 0x6e07a420, + 0x3ad70: 0x6e07a620, 0x3ad71: 0x6e07a820, 0x3ad72: 0x6e07aa20, 0x3ad73: 0x6e07ac20, + 0x3ad74: 0x6e07ae20, 0x3ad75: 0x6e07b020, 0x3ad76: 0x6e17f420, 0x3ad77: 0x6e07b220, + 0x3ad78: 0x6e07b420, 0x3ad79: 0x6e07b620, 0x3ad7a: 0x6e07b820, 0x3ad7b: 0x6e07ba20, + 0x3ad7c: 0x6e07bc20, 0x3ad7d: 0x6e07be20, 0x3ad7e: 0x6e17f620, 0x3ad7f: 0x6e17f820, + // Block 0xeb6, offset 0x3ad80 + 0x3ad80: 0x6e17fa20, 0x3ad81: 0x6e17fc20, 0x3ad82: 0x6e17fe20, 0x3ad83: 0x6e180020, + 0x3ad84: 0x6e180220, 0x3ad85: 0x6e180420, 0x3ad86: 0x6e180620, 0x3ad87: 0x6e180820, + 0x3ad88: 0x6e180a20, 0x3ad89: 0x6e180c20, 0x3ad8a: 0x6e180e20, 0x3ad8b: 0x6e181020, + 0x3ad8c: 0x6e181220, 0x3ad8d: 0x6e181420, 0x3ad8e: 0x6e181620, 0x3ad8f: 0x6e181820, + 0x3ad90: 0x6e181a20, 0x3ad91: 0x6e181c20, 0x3ad92: 0x6e181e20, 0x3ad93: 0x6e24b620, + 0x3ad94: 0x6e24b820, 0x3ad95: 0x6e24ba20, 0x3ad96: 0x6e24bc20, 0x3ad97: 0x6e24be20, + 0x3ad98: 0x6e24c020, 0x3ad99: 0x6e24c220, 0x3ad9a: 0x6e24c420, 0x3ad9b: 0x6e24c620, + 0x3ad9c: 0x6e24c820, 0x3ad9d: 0x6e24ca20, 0x3ad9e: 0x6e24cc20, 0x3ad9f: 0x6e24ce20, + 0x3ada0: 0x6e24d020, 0x3ada1: 0x6e24d220, 0x3ada2: 0x6e24d420, 0x3ada3: 0x6e24d620, + 0x3ada4: 0x6e2e8420, 0x3ada5: 0x6e2e8620, 0x3ada6: 0x6e2e8820, 0x3ada7: 0x6e2e8a20, + 0x3ada8: 0x6e2e8c20, 0x3ada9: 0x6e2e8e20, 0x3adaa: 0x6e2e9020, 0x3adab: 0x6e2e9220, + 0x3adac: 0x6e2e9420, 0x3adad: 0x6e360420, 0x3adae: 0x6e360620, 0x3adaf: 0x6e360820, + 0x3adb0: 0x6e360a20, 0x3adb1: 0x6e360c20, 0x3adb2: 0x6e360e20, 0x3adb3: 0x6e361020, + 0x3adb4: 0x6e361220, 0x3adb5: 0x6e361420, 0x3adb6: 0x6e3b5020, 0x3adb7: 0x6e3f0820, + 0x3adb8: 0x6e3f0a20, 0x3adb9: 0x6e3f0c20, 0x3adba: 0x6e3f0e20, 0x3adbb: 0x6e44bc20, + 0x3adbc: 0x6e457420, 0x3adbd: 0x6e465220, 0x3adbe: 0x6c288e20, 0x3adbf: 0x6c289020, + // Block 0xeb7, offset 0x3adc0 + 0x3adc0: 0x6c289220, 0x3adc1: 0x6c42a420, 0x3adc2: 0x6c42a620, 0x3adc3: 0x6c637820, + 0x3adc4: 0x6c8a8020, 0x3adc5: 0x6c8a8220, 0x3adc6: 0x6cb70220, 0x3adc7: 0x6c8a8420, + 0x3adc8: 0x6cb70420, 0x3adc9: 0x6cb70620, 0x3adca: 0x6ce7e020, 0x3adcb: 0x6ce7e220, + 0x3adcc: 0x6d170020, 0x3adcd: 0x6d452420, 0x3adce: 0x6d452620, 0x3adcf: 0x6d720220, + 0x3add0: 0x6c638020, 0x3add1: 0x6cb70e20, 0x3add2: 0x6cb71020, 0x3add3: 0x6ce7ee20, + 0x3add4: 0x6d170620, 0x3add5: 0x6d452820, 0x3add6: 0x6d452a20, 0x3add7: 0x6d452c20, + 0x3add8: 0x6d452e20, 0x3add9: 0x6d453020, 0x3adda: 0x6d720c20, 0x3addb: 0x6d720e20, + 0x3addc: 0x6d721020, 0x3addd: 0x6d721220, 0x3adde: 0x6d721420, 0x3addf: 0x6d721620, + 0x3ade0: 0x6d721820, 0x3ade1: 0x6d9b9020, 0x3ade2: 0x6d9b9220, 0x3ade3: 0x6d9b9420, + 0x3ade4: 0x6d9b9620, 0x3ade5: 0x6d9b9820, 0x3ade6: 0x6d9b9a20, 0x3ade7: 0x6d9b9c20, + 0x3ade8: 0x6dbe4a20, 0x3ade9: 0x6dbe4c20, 0x3adea: 0x6ddbfc20, 0x3adeb: 0x6ddbfe20, + 0x3adec: 0x6ddc0020, 0x3aded: 0x6ddc0220, 0x3adee: 0x6de36c20, 0x3adef: 0x6df3e620, + 0x3adf0: 0x6dface20, 0x3adf1: 0x6df3e820, 0x3adf2: 0x6e07c620, 0x3adf3: 0x6e182220, + 0x3adf4: 0x6e24dc20, 0x3adf5: 0x6e2e9620, 0x3adf6: 0x6e2e9820, 0x3adf7: 0x6e361620, + 0x3adf8: 0x6e3b5420, 0x3adf9: 0x6e419c20, 0x3adfa: 0x6c8a8c20, 0x3adfb: 0x6d170a20, + 0x3adfc: 0x6d170c20, 0x3adfd: 0x6d170e20, 0x3adfe: 0x6d453c20, 0x3adff: 0x6d453e20, + // Block 0xeb8, offset 0x3ae00 + 0x3ae00: 0x6d454020, 0x3ae01: 0x6d454220, 0x3ae02: 0x6d721a20, 0x3ae03: 0x6d454420, + 0x3ae04: 0x6d454620, 0x3ae05: 0x6d721c20, 0x3ae06: 0x6d721e20, 0x3ae07: 0x6d9ba620, + 0x3ae08: 0x6d9ba820, 0x3ae09: 0x6dbe5c20, 0x3ae0a: 0x6dbe5e20, 0x3ae0b: 0x6dbe6020, + 0x3ae0c: 0x6ddc0820, 0x3ae0d: 0x6ddc0a20, 0x3ae0e: 0x6ddc0c20, 0x3ae0f: 0x6dbe6220, + 0x3ae10: 0x6ddc0e20, 0x3ae11: 0x6ddc1020, 0x3ae12: 0x6ddc1220, 0x3ae13: 0x6df3f020, + 0x3ae14: 0x6df3f220, 0x3ae15: 0x6df3f420, 0x3ae16: 0x6df3f620, 0x3ae17: 0x6df3f820, + 0x3ae18: 0x6df3fa20, 0x3ae19: 0x6e07cc20, 0x3ae1a: 0x6e07ce20, 0x3ae1b: 0x6e07d020, + 0x3ae1c: 0x6e07d220, 0x3ae1d: 0x6e182620, 0x3ae1e: 0x6e182820, 0x3ae1f: 0x6e182a20, + 0x3ae20: 0x6e182c20, 0x3ae21: 0x6e182e20, 0x3ae22: 0x6e24de20, 0x3ae23: 0x6e24e020, + 0x3ae24: 0x6e2e9c20, 0x3ae25: 0x6e3f1020, 0x3ae26: 0x6e437620, 0x3ae27: 0x6c8a9020, + 0x3ae28: 0x6cb71220, 0x3ae29: 0x6ce7f620, 0x3ae2a: 0x6ce7f820, 0x3ae2b: 0x6ce7fa20, + 0x3ae2c: 0x6ce7fc20, 0x3ae2d: 0x6ce7fe20, 0x3ae2e: 0x6ce80020, 0x3ae2f: 0x6ce80220, + 0x3ae30: 0x6d172220, 0x3ae31: 0x6d172420, 0x3ae32: 0x6d172620, 0x3ae33: 0x6d172820, + 0x3ae34: 0x6d172a20, 0x3ae35: 0x6d172c20, 0x3ae36: 0x6d172e20, 0x3ae37: 0x6d457c20, + 0x3ae38: 0x6d457e20, 0x3ae39: 0x6d458020, 0x3ae3a: 0x6d458220, 0x3ae3b: 0x6d458420, + 0x3ae3c: 0x6d458620, 0x3ae3d: 0x6d458820, 0x3ae3e: 0x6d458a20, 0x3ae3f: 0x6d726420, + // Block 0xeb9, offset 0x3ae40 + 0x3ae40: 0x6d458c20, 0x3ae41: 0x6d458e20, 0x3ae42: 0x6d459020, 0x3ae43: 0x6d459220, + 0x3ae44: 0x6d459420, 0x3ae45: 0x6d459620, 0x3ae46: 0x6d726620, 0x3ae47: 0x6d459820, + 0x3ae48: 0x6d459a20, 0x3ae49: 0x6d459c20, 0x3ae4a: 0x6d459e20, 0x3ae4b: 0x6d45a020, + 0x3ae4c: 0x6d45a220, 0x3ae4d: 0x6d726820, 0x3ae4e: 0x6d726a20, 0x3ae4f: 0x6d726c20, + 0x3ae50: 0x6d726e20, 0x3ae51: 0x6d727020, 0x3ae52: 0x6d727220, 0x3ae53: 0x6d727420, + 0x3ae54: 0x6d727620, 0x3ae55: 0x6d727820, 0x3ae56: 0x6d727a20, 0x3ae57: 0x6d727c20, + 0x3ae58: 0x6d727e20, 0x3ae59: 0x6d728020, 0x3ae5a: 0x6d728220, 0x3ae5b: 0x6d728420, + 0x3ae5c: 0x6d728620, 0x3ae5d: 0x6d728820, 0x3ae5e: 0x6d728a20, 0x3ae5f: 0x6d728c20, + 0x3ae60: 0x6d728e20, 0x3ae61: 0x6d729020, 0x3ae62: 0x6d729220, 0x3ae63: 0x6d729420, + 0x3ae64: 0x6d729620, 0x3ae65: 0x6d729820, 0x3ae66: 0x6d729a20, 0x3ae67: 0x6d729c20, + 0x3ae68: 0x6d729e20, 0x3ae69: 0x6d72a020, 0x3ae6a: 0x6d72a220, 0x3ae6b: 0x6d72a420, + 0x3ae6c: 0x6d72a620, 0x3ae6d: 0x6d72a820, 0x3ae6e: 0x6d9bde20, 0x3ae6f: 0x6d9be020, + 0x3ae70: 0x6d9be220, 0x3ae71: 0x6d9be420, 0x3ae72: 0x6d9be620, 0x3ae73: 0x6d9be820, + 0x3ae74: 0x6d9bea20, 0x3ae75: 0x6d9bec20, 0x3ae76: 0x6d9bee20, 0x3ae77: 0x6d9bf020, + 0x3ae78: 0x6d9bf220, 0x3ae79: 0x6d9bf420, 0x3ae7a: 0x6d9bf620, 0x3ae7b: 0x6d9bf820, + 0x3ae7c: 0x6d9bfa20, 0x3ae7d: 0x6d9bfc20, 0x3ae7e: 0x6d9bfe20, 0x3ae7f: 0x6d9c0020, + // Block 0xeba, offset 0x3ae80 + 0x3ae80: 0x6d9c0220, 0x3ae81: 0x6d9c0420, 0x3ae82: 0x6d9c0620, 0x3ae83: 0x6d9c0820, + 0x3ae84: 0x6d9c0a20, 0x3ae85: 0x6d9c0c20, 0x3ae86: 0x6d9c0e20, 0x3ae87: 0x6d9c1020, + 0x3ae88: 0x6d9c1220, 0x3ae89: 0x6d9c1420, 0x3ae8a: 0x6d9c1620, 0x3ae8b: 0x6d9c1820, + 0x3ae8c: 0x6d9c1a20, 0x3ae8d: 0x6d9c1c20, 0x3ae8e: 0x6d9c1e20, 0x3ae8f: 0x6d9c2020, + 0x3ae90: 0x6d9c2220, 0x3ae91: 0x6d9c2420, 0x3ae92: 0x6d9c2620, 0x3ae93: 0x6d9c2820, + 0x3ae94: 0x6d9c2a20, 0x3ae95: 0x6d9c2c20, 0x3ae96: 0x6dbe9020, 0x3ae97: 0x6dbe9220, + 0x3ae98: 0x6dbe9420, 0x3ae99: 0x6dbe9620, 0x3ae9a: 0x6dbe9820, 0x3ae9b: 0x6dbe9a20, + 0x3ae9c: 0x6dbe9c20, 0x3ae9d: 0x6dbe9e20, 0x3ae9e: 0x6dbea020, 0x3ae9f: 0x6dbea220, + 0x3aea0: 0x6dbea420, 0x3aea1: 0x6dbea620, 0x3aea2: 0x6dbea820, 0x3aea3: 0x6dbeaa20, + 0x3aea4: 0x6dbeac20, 0x3aea5: 0x6dbeae20, 0x3aea6: 0x6dbeb020, 0x3aea7: 0x6dbeb220, + 0x3aea8: 0x6dbeb420, 0x3aea9: 0x6dbeb620, 0x3aeaa: 0x6dbeb820, 0x3aeab: 0x6dbeba20, + 0x3aeac: 0x6dbebc20, 0x3aead: 0x6ddc4820, 0x3aeae: 0x6ddc4a20, 0x3aeaf: 0x6ddc4c20, + 0x3aeb0: 0x6ddc4e20, 0x3aeb1: 0x6ddc5020, 0x3aeb2: 0x6ddc5220, 0x3aeb3: 0x6ddc5420, + 0x3aeb4: 0x6ddc5620, 0x3aeb5: 0x6ddc5820, 0x3aeb6: 0x6ddc5a20, 0x3aeb7: 0x6ddc5c20, + 0x3aeb8: 0x6ddc5e20, 0x3aeb9: 0x6ddc6020, 0x3aeba: 0x6ddc6220, 0x3aebb: 0x6ddc6420, + 0x3aebc: 0x6ddc6620, 0x3aebd: 0x6ddc6820, 0x3aebe: 0x6ddc6a20, 0x3aebf: 0x6ddc6c20, + // Block 0xebb, offset 0x3aec0 + 0x3aec0: 0x6ddc6e20, 0x3aec1: 0x6ddc7020, 0x3aec2: 0x6ddc7220, 0x3aec3: 0x6ddc7420, + 0x3aec4: 0x6ddc7620, 0x3aec5: 0x6ddc7820, 0x3aec6: 0x6ddc7a20, 0x3aec7: 0x6ddc7c20, + 0x3aec8: 0x6ddc7e20, 0x3aec9: 0x6ddc8020, 0x3aeca: 0x6ddc8220, 0x3aecb: 0x6ddc8420, + 0x3aecc: 0x6ddc8620, 0x3aecd: 0x6ddc8820, 0x3aece: 0x6ddc8a20, 0x3aecf: 0x6ddc8c20, + 0x3aed0: 0x6ddc8e20, 0x3aed1: 0x6ddc9020, 0x3aed2: 0x6ddc9220, 0x3aed3: 0x6ddc9420, + 0x3aed4: 0x6ddc9620, 0x3aed5: 0x6ddc9820, 0x3aed6: 0x6ddc9a20, 0x3aed7: 0x6df43420, + 0x3aed8: 0x6df43620, 0x3aed9: 0x6df43820, 0x3aeda: 0x6df43a20, 0x3aedb: 0x6df43c20, + 0x3aedc: 0x6df43e20, 0x3aedd: 0x6df44020, 0x3aede: 0x6ddc9c20, 0x3aedf: 0x6df44220, + 0x3aee0: 0x6df44420, 0x3aee1: 0x6df44620, 0x3aee2: 0x6df44820, 0x3aee3: 0x6df44a20, + 0x3aee4: 0x6df44c20, 0x3aee5: 0x6df44e20, 0x3aee6: 0x6df45020, 0x3aee7: 0x6df45220, + 0x3aee8: 0x6df45420, 0x3aee9: 0x6df45620, 0x3aeea: 0x6df45820, 0x3aeeb: 0x6df45a20, + 0x3aeec: 0x6df45c20, 0x3aeed: 0x6df45e20, 0x3aeee: 0x6df46020, 0x3aeef: 0x6df46220, + 0x3aef0: 0x6df46420, 0x3aef1: 0x6df46620, 0x3aef2: 0x6df46820, 0x3aef3: 0x6df46a20, + 0x3aef4: 0x6df46c20, 0x3aef5: 0x6df46e20, 0x3aef6: 0x6df47020, 0x3aef7: 0x6dbebe20, + 0x3aef8: 0x6df47220, 0x3aef9: 0x6df47420, 0x3aefa: 0x6df47620, 0x3aefb: 0x6df47820, + 0x3aefc: 0x6df47a20, 0x3aefd: 0x6e080620, 0x3aefe: 0x6e080820, 0x3aeff: 0x6e080a20, + // Block 0xebc, offset 0x3af00 + 0x3af00: 0x6e080c20, 0x3af01: 0x6e080e20, 0x3af02: 0x6e081020, 0x3af03: 0x6e081220, + 0x3af04: 0x6e081420, 0x3af05: 0x6e081620, 0x3af06: 0x6e081820, 0x3af07: 0x6e081a20, + 0x3af08: 0x6e081c20, 0x3af09: 0x6e081e20, 0x3af0a: 0x6e082020, 0x3af0b: 0x6e082220, + 0x3af0c: 0x6e082420, 0x3af0d: 0x6e082620, 0x3af0e: 0x6e082820, 0x3af0f: 0x6e082a20, + 0x3af10: 0x6e082c20, 0x3af11: 0x6e082e20, 0x3af12: 0x6e083020, 0x3af13: 0x6e083220, + 0x3af14: 0x6e083420, 0x3af15: 0x6e083620, 0x3af16: 0x6e083820, 0x3af17: 0x6e083a20, + 0x3af18: 0x6e083c20, 0x3af19: 0x6e083e20, 0x3af1a: 0x6e084020, 0x3af1b: 0x6e084220, + 0x3af1c: 0x6e084420, 0x3af1d: 0x6e084620, 0x3af1e: 0x6e084820, 0x3af1f: 0x6e084a20, + 0x3af20: 0x6e084c20, 0x3af21: 0x6e084e20, 0x3af22: 0x6e085020, 0x3af23: 0x6e085220, + 0x3af24: 0x6e085420, 0x3af25: 0x6e085620, 0x3af26: 0x6e085820, 0x3af27: 0x6e085a20, + 0x3af28: 0x6e085c20, 0x3af29: 0x6e085e20, 0x3af2a: 0x6e086020, 0x3af2b: 0x6e186220, + 0x3af2c: 0x6e186420, 0x3af2d: 0x6e186620, 0x3af2e: 0x6e186820, 0x3af2f: 0x6e186a20, + 0x3af30: 0x6e186c20, 0x3af31: 0x6e186e20, 0x3af32: 0x6e187020, 0x3af33: 0x6e187220, + 0x3af34: 0x6e187420, 0x3af35: 0x6e187620, 0x3af36: 0x6e187820, 0x3af37: 0x6e187a20, + 0x3af38: 0x6e187c20, 0x3af39: 0x6e187e20, 0x3af3a: 0x6e188020, 0x3af3b: 0x6e188220, + 0x3af3c: 0x6e188420, 0x3af3d: 0x6e188620, 0x3af3e: 0x6e188820, 0x3af3f: 0x6e188a20, + // Block 0xebd, offset 0x3af40 + 0x3af40: 0x6e188c20, 0x3af41: 0x6e188e20, 0x3af42: 0x6e250a20, 0x3af43: 0x6e250c20, + 0x3af44: 0x6e250e20, 0x3af45: 0x6e251020, 0x3af46: 0x6e251220, 0x3af47: 0x6e251420, + 0x3af48: 0x6e251620, 0x3af49: 0x6e251820, 0x3af4a: 0x6e251a20, 0x3af4b: 0x6e251c20, + 0x3af4c: 0x6e251e20, 0x3af4d: 0x6e252020, 0x3af4e: 0x6e252220, 0x3af4f: 0x6e252420, + 0x3af50: 0x6e252620, 0x3af51: 0x6e252820, 0x3af52: 0x6e252a20, 0x3af53: 0x6e252c20, + 0x3af54: 0x6e252e20, 0x3af55: 0x6e253020, 0x3af56: 0x6e253220, 0x3af57: 0x6e253420, + 0x3af58: 0x6e253620, 0x3af59: 0x6e253820, 0x3af5a: 0x6e253a20, 0x3af5b: 0x6e253c20, + 0x3af5c: 0x6e253e20, 0x3af5d: 0x6e254020, 0x3af5e: 0x6e2eb220, 0x3af5f: 0x6e2eb420, + 0x3af60: 0x6e2eb620, 0x3af61: 0x6e2eb820, 0x3af62: 0x6e2eba20, 0x3af63: 0x6e2ebc20, + 0x3af64: 0x6e2ebe20, 0x3af65: 0x6e2ec020, 0x3af66: 0x6e2ec220, 0x3af67: 0x6e2ec420, + 0x3af68: 0x6e2ec620, 0x3af69: 0x6e2ec820, 0x3af6a: 0x6e2eca20, 0x3af6b: 0x6e2ecc20, + 0x3af6c: 0x6e2ece20, 0x3af6d: 0x6e2ed020, 0x3af6e: 0x6e2ed220, 0x3af6f: 0x6e2ed420, + 0x3af70: 0x6e2ed620, 0x3af71: 0x6e2ed820, 0x3af72: 0x6e2eda20, 0x3af73: 0x6e2edc20, + 0x3af74: 0x6e2ede20, 0x3af75: 0x6e2ee020, 0x3af76: 0x6e362820, 0x3af77: 0x6e362a20, + 0x3af78: 0x6e362c20, 0x3af79: 0x6e362e20, 0x3af7a: 0x6e363020, 0x3af7b: 0x6e363220, + 0x3af7c: 0x6e363420, 0x3af7d: 0x6e363620, 0x3af7e: 0x6e363820, 0x3af7f: 0x6e363a20, + // Block 0xebe, offset 0x3af80 + 0x3af80: 0x6e363c20, 0x3af81: 0x6e363e20, 0x3af82: 0x6e3b5820, 0x3af83: 0x6e3b5a20, + 0x3af84: 0x6e3b5c20, 0x3af85: 0x6e3b5e20, 0x3af86: 0x6e3b6020, 0x3af87: 0x6e3b6220, + 0x3af88: 0x6e3b6420, 0x3af89: 0x6e3b6620, 0x3af8a: 0x6e3b6820, 0x3af8b: 0x6e3b6a20, + 0x3af8c: 0x6e3b6c20, 0x3af8d: 0x6e3b6e20, 0x3af8e: 0x6e3b7020, 0x3af8f: 0x6e3f1c20, + 0x3af90: 0x6e3f1e20, 0x3af91: 0x6e3f2020, 0x3af92: 0x6e3f2220, 0x3af93: 0x6e3f2420, + 0x3af94: 0x6e41ac20, 0x3af95: 0x6e41ae20, 0x3af96: 0x6e41b020, 0x3af97: 0x6e41b220, + 0x3af98: 0x6e437e20, 0x3af99: 0x6e438020, 0x3af9a: 0x6e438220, 0x3af9b: 0x6e438420, + 0x3af9c: 0x6e438620, 0x3af9d: 0x6e438820, 0x3af9e: 0x6e438a20, 0x3af9f: 0x6e44c420, + 0x3afa0: 0x6e44c620, 0x3afa1: 0x6e457820, 0x3afa2: 0x6e457a20, 0x3afa3: 0x6e45ec20, + 0x3afa4: 0x6e45ee20, 0x3afa5: 0x6e46f420, 0x3afa6: 0x6c28a020, 0x3afa7: 0x6c42c620, + 0x3afa8: 0x6c42c820, 0x3afa9: 0x6c42ca20, 0x3afaa: 0x6c42cc20, 0x3afab: 0x6c42ce20, + 0x3afac: 0x6c42d020, 0x3afad: 0x6c42d220, 0x3afae: 0x6c639620, 0x3afaf: 0x6c42d420, + 0x3afb0: 0x6c639820, 0x3afb1: 0x6c639a20, 0x3afb2: 0x6c639c20, 0x3afb3: 0x6c639e20, + 0x3afb4: 0x6c63a020, 0x3afb5: 0x6c63a220, 0x3afb6: 0x6c63a420, 0x3afb7: 0x6c8aa020, + 0x3afb8: 0x6c8aa220, 0x3afb9: 0x6c8aa420, 0x3afba: 0x6c8aa620, 0x3afbb: 0x6cb72220, + 0x3afbc: 0x6cb72420, 0x3afbd: 0x6cb72620, 0x3afbe: 0x6ce80e20, 0x3afbf: 0x6ce81020, + // Block 0xebf, offset 0x3afc0 + 0x3afc0: 0x6ce81220, 0x3afc1: 0x6ce81420, 0x3afc2: 0x6ce81620, 0x3afc3: 0x6ce81820, + 0x3afc4: 0x6d173a20, 0x3afc5: 0x6ce81a20, 0x3afc6: 0x6ce81c20, 0x3afc7: 0x6ce81e20, + 0x3afc8: 0x6ce82020, 0x3afc9: 0x6ce82220, 0x3afca: 0x6ce82420, 0x3afcb: 0x6d173c20, + 0x3afcc: 0x6d173e20, 0x3afcd: 0x6d174020, 0x3afce: 0x6d72ac20, 0x3afcf: 0x6d72ae20, + 0x3afd0: 0x6ddca620, 0x3afd1: 0x6cb73020, 0x3afd2: 0x6cb73220, 0x3afd3: 0x6cb73420, + 0x3afd4: 0x6ce82e20, 0x3afd5: 0x6ce83020, 0x3afd6: 0x6ce83220, 0x3afd7: 0x6ce83420, + 0x3afd8: 0x6ce83620, 0x3afd9: 0x6ce83820, 0x3afda: 0x6ce83a20, 0x3afdb: 0x6ce83c20, + 0x3afdc: 0x6d175220, 0x3afdd: 0x6d175420, 0x3afde: 0x6d175620, 0x3afdf: 0x6d175820, + 0x3afe0: 0x6d175a20, 0x3afe1: 0x6d175c20, 0x3afe2: 0x6d175e20, 0x3afe3: 0x6d176020, + 0x3afe4: 0x6d176220, 0x3afe5: 0x6d176420, 0x3afe6: 0x6d176620, 0x3afe7: 0x6d176820, + 0x3afe8: 0x6d176a20, 0x3afe9: 0x6d176c20, 0x3afea: 0x6d176e20, 0x3afeb: 0x6d177020, + 0x3afec: 0x6d45c220, 0x3afed: 0x6d45c420, 0x3afee: 0x6d45c620, 0x3afef: 0x6d45c820, + 0x3aff0: 0x6d45ca20, 0x3aff1: 0x6d45cc20, 0x3aff2: 0x6d45ce20, 0x3aff3: 0x6d45d020, + 0x3aff4: 0x6d45d220, 0x3aff5: 0x6d45d420, 0x3aff6: 0x6d45d620, 0x3aff7: 0x6d45d820, + 0x3aff8: 0x6d45da20, 0x3aff9: 0x6d45dc20, 0x3affa: 0x6d45de20, 0x3affb: 0x6d45e020, + 0x3affc: 0x6d45e220, 0x3affd: 0x6d72c820, 0x3affe: 0x6d72ca20, 0x3afff: 0x6d72cc20, + // Block 0xec0, offset 0x3b000 + 0x3b000: 0x6d72ce20, 0x3b001: 0x6d72d020, 0x3b002: 0x6d72d220, 0x3b003: 0x6d72d420, + 0x3b004: 0x6d72d620, 0x3b005: 0x6d72d820, 0x3b006: 0x6d72da20, 0x3b007: 0x6d72dc20, + 0x3b008: 0x6d72de20, 0x3b009: 0x6d9c4c20, 0x3b00a: 0x6d9c4e20, 0x3b00b: 0x6d9c5020, + 0x3b00c: 0x6d9c5220, 0x3b00d: 0x6d9c5420, 0x3b00e: 0x6d9c5620, 0x3b00f: 0x6d9c5820, + 0x3b010: 0x6d9c5a20, 0x3b011: 0x6d9c5c20, 0x3b012: 0x6d9c5e20, 0x3b013: 0x6d9c6020, + 0x3b014: 0x6d9c6220, 0x3b015: 0x6d9c6420, 0x3b016: 0x6d9c6620, 0x3b017: 0x6dbed620, + 0x3b018: 0x6dbed820, 0x3b019: 0x6dbeda20, 0x3b01a: 0x6dbedc20, 0x3b01b: 0x6dbede20, + 0x3b01c: 0x6dbee020, 0x3b01d: 0x6dbee220, 0x3b01e: 0x6dbee420, 0x3b01f: 0x6dbee620, + 0x3b020: 0x6dbee820, 0x3b021: 0x6dbeea20, 0x3b022: 0x6dbeec20, 0x3b023: 0x6dbeee20, + 0x3b024: 0x6dbef020, 0x3b025: 0x6dbef220, 0x3b026: 0x6dbef420, 0x3b027: 0x6dbef620, + 0x3b028: 0x6dbef820, 0x3b029: 0x6dbefa20, 0x3b02a: 0x6dbefc20, 0x3b02b: 0x6dbefe20, + 0x3b02c: 0x6dbf0020, 0x3b02d: 0x6ddcb020, 0x3b02e: 0x6ddcb220, 0x3b02f: 0x6ddcb420, + 0x3b030: 0x6ddcb620, 0x3b031: 0x6ddcb820, 0x3b032: 0x6ddcba20, 0x3b033: 0x6ddcbc20, + 0x3b034: 0x6ddcbe20, 0x3b035: 0x6ddcc020, 0x3b036: 0x6ddcc220, 0x3b037: 0x6ddcc420, + 0x3b038: 0x6ddcc620, 0x3b039: 0x6ddcc820, 0x3b03a: 0x6ddcca20, 0x3b03b: 0x6ddccc20, + 0x3b03c: 0x6ddcce20, 0x3b03d: 0x6ddcd020, 0x3b03e: 0x6ddcd220, 0x3b03f: 0x6ddcd420, + // Block 0xec1, offset 0x3b040 + 0x3b040: 0x6df49220, 0x3b041: 0x6df49420, 0x3b042: 0x6df49620, 0x3b043: 0x6df49820, + 0x3b044: 0x6df49a20, 0x3b045: 0x6df49c20, 0x3b046: 0x6df49e20, 0x3b047: 0x6df4a020, + 0x3b048: 0x6df4a220, 0x3b049: 0x6e088420, 0x3b04a: 0x6e088620, 0x3b04b: 0x6e088820, + 0x3b04c: 0x6e088a20, 0x3b04d: 0x6e088c20, 0x3b04e: 0x6e088e20, 0x3b04f: 0x6e089020, + 0x3b050: 0x6e089220, 0x3b051: 0x6e089420, 0x3b052: 0x6e089620, 0x3b053: 0x6e089820, + 0x3b054: 0x6e089a20, 0x3b055: 0x6e089c20, 0x3b056: 0x6e089e20, 0x3b057: 0x6e189a20, + 0x3b058: 0x6e189c20, 0x3b059: 0x6e189e20, 0x3b05a: 0x6e18a020, 0x3b05b: 0x6e18a220, + 0x3b05c: 0x6e18a420, 0x3b05d: 0x6e18a620, 0x3b05e: 0x6e18a820, 0x3b05f: 0x6e18aa20, + 0x3b060: 0x6e254a20, 0x3b061: 0x6e254c20, 0x3b062: 0x6e254e20, 0x3b063: 0x6e255020, + 0x3b064: 0x6e255220, 0x3b065: 0x6e255420, 0x3b066: 0x6e255620, 0x3b067: 0x6e255820, + 0x3b068: 0x6e255a20, 0x3b069: 0x6e255c20, 0x3b06a: 0x6e255e20, 0x3b06b: 0x6e256020, + 0x3b06c: 0x6e2eec20, 0x3b06d: 0x6e2eee20, 0x3b06e: 0x6e2ef020, 0x3b06f: 0x6e2ef220, + 0x3b070: 0x6e2ef420, 0x3b071: 0x6e2ef620, 0x3b072: 0x6e364620, 0x3b073: 0x6e364820, + 0x3b074: 0x6e364a20, 0x3b075: 0x6e364c20, 0x3b076: 0x6e364e20, 0x3b077: 0x6e3b7620, + 0x3b078: 0x6e3b7820, 0x3b079: 0x6e3b7a20, 0x3b07a: 0x6e3b7c20, 0x3b07b: 0x6e3f2a20, + 0x3b07c: 0x6e41b620, 0x3b07d: 0x6e41b820, 0x3b07e: 0x6e438c20, 0x3b07f: 0x6d177420, + // Block 0xec2, offset 0x3b080 + 0x3b080: 0x6d177620, 0x3b081: 0x6d45e820, 0x3b082: 0x6d45ea20, 0x3b083: 0x6d45ec20, + 0x3b084: 0x6d45ee20, 0x3b085: 0x6d45f020, 0x3b086: 0x6d45f220, 0x3b087: 0x6d45f420, + 0x3b088: 0x6d45f620, 0x3b089: 0x6d45f820, 0x3b08a: 0x6d72e420, 0x3b08b: 0x6d72e620, + 0x3b08c: 0x6d72e820, 0x3b08d: 0x6d72ea20, 0x3b08e: 0x6d9c6a20, 0x3b08f: 0x6d9c6c20, + 0x3b090: 0x6d9c6e20, 0x3b091: 0x6d9c7020, 0x3b092: 0x6d9c7220, 0x3b093: 0x6d9c7420, + 0x3b094: 0x6d9c7620, 0x3b095: 0x6dbf0220, 0x3b096: 0x6dbf0420, 0x3b097: 0x6dbf0620, + 0x3b098: 0x6dbf0820, 0x3b099: 0x6dbf0a20, 0x3b09a: 0x6ddcdc20, 0x3b09b: 0x6ddcde20, + 0x3b09c: 0x6ddce020, 0x3b09d: 0x6ddce220, 0x3b09e: 0x6df4a620, 0x3b09f: 0x6df4a820, + 0x3b0a0: 0x6e08a020, 0x3b0a1: 0x6e08a220, 0x3b0a2: 0x6e08a420, 0x3b0a3: 0x6e08a620, + 0x3b0a4: 0x6e08a820, 0x3b0a5: 0x6e18ac20, 0x3b0a6: 0x6e18ae20, 0x3b0a7: 0x6e256620, + 0x3b0a8: 0x6e2efa20, 0x3b0a9: 0x6e2efc20, 0x3b0aa: 0x6e2efe20, 0x3b0ab: 0x6e365020, + 0x3b0ac: 0x6e365220, 0x3b0ad: 0x6e3b8020, 0x3b0ae: 0x6e3f2c20, 0x3b0af: 0x6e3f2e20, + 0x3b0b0: 0x6e41ba20, 0x3b0b1: 0x6e41bc20, 0x3b0b2: 0x6e438e20, 0x3b0b3: 0x6e45f020, + 0x3b0b4: 0x6ce84820, 0x3b0b5: 0x6ce84a20, 0x3b0b6: 0x6ce84c20, 0x3b0b7: 0x6ce84e20, + 0x3b0b8: 0x6ce85020, 0x3b0b9: 0x6d177c20, 0x3b0ba: 0x6d177e20, 0x3b0bb: 0x6d178020, + 0x3b0bc: 0x6d178220, 0x3b0bd: 0x6d178420, 0x3b0be: 0x6d178620, 0x3b0bf: 0x6d461620, + // Block 0xec3, offset 0x3b0c0 + 0x3b0c0: 0x6d461820, 0x3b0c1: 0x6d461a20, 0x3b0c2: 0x6d461c20, 0x3b0c3: 0x6d461e20, + 0x3b0c4: 0x6d462020, 0x3b0c5: 0x6d462220, 0x3b0c6: 0x6d462420, 0x3b0c7: 0x6d462620, + 0x3b0c8: 0x6d462820, 0x3b0c9: 0x6d462a20, 0x3b0ca: 0x6d462c20, 0x3b0cb: 0x6d462e20, + 0x3b0cc: 0x6d463020, 0x3b0cd: 0x6d463220, 0x3b0ce: 0x6d463420, 0x3b0cf: 0x6d463620, + 0x3b0d0: 0x6d463820, 0x3b0d1: 0x6d730420, 0x3b0d2: 0x6d730620, 0x3b0d3: 0x6d730820, + 0x3b0d4: 0x6d730a20, 0x3b0d5: 0x6d730c20, 0x3b0d6: 0x6d730e20, 0x3b0d7: 0x6d731020, + 0x3b0d8: 0x6d731220, 0x3b0d9: 0x6d731420, 0x3b0da: 0x6d731620, 0x3b0db: 0x6d731820, + 0x3b0dc: 0x6d731a20, 0x3b0dd: 0x6d731c20, 0x3b0de: 0x6d731e20, 0x3b0df: 0x6d732020, + 0x3b0e0: 0x6d732220, 0x3b0e1: 0x6d732420, 0x3b0e2: 0x6d732620, 0x3b0e3: 0x6d732820, + 0x3b0e4: 0x6d732a20, 0x3b0e5: 0x6d732c20, 0x3b0e6: 0x6d732e20, 0x3b0e7: 0x6d733020, + 0x3b0e8: 0x6d733220, 0x3b0e9: 0x6d733420, 0x3b0ea: 0x6d733620, 0x3b0eb: 0x6d733820, + 0x3b0ec: 0x6d733a20, 0x3b0ed: 0x6d733c20, 0x3b0ee: 0x6d733e20, 0x3b0ef: 0x6d734020, + 0x3b0f0: 0x6d9c9020, 0x3b0f1: 0x6d9c9220, 0x3b0f2: 0x6d9c9420, 0x3b0f3: 0x6d9c9620, + 0x3b0f4: 0x6d9c9820, 0x3b0f5: 0x6d9c9a20, 0x3b0f6: 0x6d9c9c20, 0x3b0f7: 0x6d9c9e20, + 0x3b0f8: 0x6d9ca020, 0x3b0f9: 0x6d9ca220, 0x3b0fa: 0x6d9ca420, 0x3b0fb: 0x6d9ca620, + 0x3b0fc: 0x6d9ca820, 0x3b0fd: 0x6d9caa20, 0x3b0fe: 0x6d9cac20, 0x3b0ff: 0x6d9cae20, + // Block 0xec4, offset 0x3b100 + 0x3b100: 0x6d9cb020, 0x3b101: 0x6d9cb220, 0x3b102: 0x6d9cb420, 0x3b103: 0x6d9cb620, + 0x3b104: 0x6d9cb820, 0x3b105: 0x6d9cba20, 0x3b106: 0x6d9cbc20, 0x3b107: 0x6dbf2220, + 0x3b108: 0x6dbf2420, 0x3b109: 0x6dbf2620, 0x3b10a: 0x6dbf2820, 0x3b10b: 0x6dbf2a20, + 0x3b10c: 0x6dbf2c20, 0x3b10d: 0x6dbf2e20, 0x3b10e: 0x6dbf3020, 0x3b10f: 0x6dbf3220, + 0x3b110: 0x6dbf3420, 0x3b111: 0x6dbf3620, 0x3b112: 0x6dbf3820, 0x3b113: 0x6dbf3a20, + 0x3b114: 0x6dbf3c20, 0x3b115: 0x6dbf3e20, 0x3b116: 0x6dbf4020, 0x3b117: 0x6dbf4220, + 0x3b118: 0x6dbf4420, 0x3b119: 0x6dbf4620, 0x3b11a: 0x6dbf4820, 0x3b11b: 0x6dbf4a20, + 0x3b11c: 0x6dbf4c20, 0x3b11d: 0x6dbf4e20, 0x3b11e: 0x6ddcfc20, 0x3b11f: 0x6ddcfe20, + 0x3b120: 0x6ddd0020, 0x3b121: 0x6ddd0220, 0x3b122: 0x6ddd0420, 0x3b123: 0x6ddd0620, + 0x3b124: 0x6ddd0820, 0x3b125: 0x6ddd0a20, 0x3b126: 0x6ddd0c20, 0x3b127: 0x6ddd0e20, + 0x3b128: 0x6ddd1020, 0x3b129: 0x6ddd1220, 0x3b12a: 0x6ddd1420, 0x3b12b: 0x6ddd1620, + 0x3b12c: 0x6ddd1820, 0x3b12d: 0x6ddd1a20, 0x3b12e: 0x6ddd1c20, 0x3b12f: 0x6ddd1e20, + 0x3b130: 0x6ddd2020, 0x3b131: 0x6ddd2220, 0x3b132: 0x6ddd2420, 0x3b133: 0x6ddd2620, + 0x3b134: 0x6ddd2820, 0x3b135: 0x6ddd2a20, 0x3b136: 0x6ddd2c20, 0x3b137: 0x6ddd2e20, + 0x3b138: 0x6ddd3020, 0x3b139: 0x6ddd3220, 0x3b13a: 0x6df4c020, 0x3b13b: 0x6df4c220, + 0x3b13c: 0x6df4c420, 0x3b13d: 0x6df4c620, 0x3b13e: 0x6df4c820, 0x3b13f: 0x6df4ca20, + // Block 0xec5, offset 0x3b140 + 0x3b140: 0x6df4cc20, 0x3b141: 0x6df4ce20, 0x3b142: 0x6df4d020, 0x3b143: 0x6df4d220, + 0x3b144: 0x6df4d420, 0x3b145: 0x6df4d620, 0x3b146: 0x6df4d820, 0x3b147: 0x6df4da20, + 0x3b148: 0x6df4dc20, 0x3b149: 0x6df4de20, 0x3b14a: 0x6df4e020, 0x3b14b: 0x6df4e220, + 0x3b14c: 0x6df4e420, 0x3b14d: 0x6df4e620, 0x3b14e: 0x6df4e820, 0x3b14f: 0x6df4ea20, + 0x3b150: 0x6df4ec20, 0x3b151: 0x6df4ee20, 0x3b152: 0x6df4f020, 0x3b153: 0x6df4f220, + 0x3b154: 0x6df4f420, 0x3b155: 0x6df4f620, 0x3b156: 0x6e08ba20, 0x3b157: 0x6e08bc20, + 0x3b158: 0x6e08be20, 0x3b159: 0x6e08c020, 0x3b15a: 0x6e08c220, 0x3b15b: 0x6e08c420, + 0x3b15c: 0x6e08c620, 0x3b15d: 0x6e08c820, 0x3b15e: 0x6e08ca20, 0x3b15f: 0x6e08cc20, + 0x3b160: 0x6e08ce20, 0x3b161: 0x6e08d020, 0x3b162: 0x6e08d220, 0x3b163: 0x6e08d420, + 0x3b164: 0x6e08d620, 0x3b165: 0x6e08d820, 0x3b166: 0x6e08da20, 0x3b167: 0x6e08dc20, + 0x3b168: 0x6e08de20, 0x3b169: 0x6e08e020, 0x3b16a: 0x6e08e220, 0x3b16b: 0x6e08e420, + 0x3b16c: 0x6e08e620, 0x3b16d: 0x6e08e820, 0x3b16e: 0x6e08ea20, 0x3b16f: 0x6e18be20, + 0x3b170: 0x6e18c020, 0x3b171: 0x6e18c220, 0x3b172: 0x6e18c420, 0x3b173: 0x6e18c620, + 0x3b174: 0x6e18c820, 0x3b175: 0x6e18ca20, 0x3b176: 0x6e18cc20, 0x3b177: 0x6e18ce20, + 0x3b178: 0x6e18d020, 0x3b179: 0x6e18d220, 0x3b17a: 0x6e18d420, 0x3b17b: 0x6e18d620, + 0x3b17c: 0x6e18d820, 0x3b17d: 0x6e18da20, 0x3b17e: 0x6e18dc20, 0x3b17f: 0x6e18de20, + // Block 0xec6, offset 0x3b180 + 0x3b180: 0x6e18e020, 0x3b181: 0x6e18e220, 0x3b182: 0x6e18e420, 0x3b183: 0x6e257420, + 0x3b184: 0x6e257620, 0x3b185: 0x6e257820, 0x3b186: 0x6e257a20, 0x3b187: 0x6e257c20, + 0x3b188: 0x6e257e20, 0x3b189: 0x6e258020, 0x3b18a: 0x6e258220, 0x3b18b: 0x6e258420, + 0x3b18c: 0x6e258620, 0x3b18d: 0x6e258820, 0x3b18e: 0x6e258a20, 0x3b18f: 0x6e258c20, + 0x3b190: 0x6e258e20, 0x3b191: 0x6e259020, 0x3b192: 0x6e259220, 0x3b193: 0x6e259420, + 0x3b194: 0x6e259620, 0x3b195: 0x6e259820, 0x3b196: 0x6e259a20, 0x3b197: 0x6e259c20, + 0x3b198: 0x6e259e20, 0x3b199: 0x6e25a020, 0x3b19a: 0x6e25a220, 0x3b19b: 0x6e2f0620, + 0x3b19c: 0x6e2f0820, 0x3b19d: 0x6e2f0a20, 0x3b19e: 0x6e2f0c20, 0x3b19f: 0x6e2f0e20, + 0x3b1a0: 0x6e2f1020, 0x3b1a1: 0x6e2f1220, 0x3b1a2: 0x6e2f1420, 0x3b1a3: 0x6e2f1620, + 0x3b1a4: 0x6e2f1820, 0x3b1a5: 0x6e2f1a20, 0x3b1a6: 0x6e366020, 0x3b1a7: 0x6e366220, + 0x3b1a8: 0x6e366420, 0x3b1a9: 0x6e366620, 0x3b1aa: 0x6e366820, 0x3b1ab: 0x6e366a20, + 0x3b1ac: 0x6e366c20, 0x3b1ad: 0x6e366e20, 0x3b1ae: 0x6e367020, 0x3b1af: 0x6e367220, + 0x3b1b0: 0x6e3b8820, 0x3b1b1: 0x6e3b8a20, 0x3b1b2: 0x6e3b8c20, 0x3b1b3: 0x6e3b8e20, + 0x3b1b4: 0x6e3b9020, 0x3b1b5: 0x6e3b9220, 0x3b1b6: 0x6e3b9420, 0x3b1b7: 0x6e3b9620, + 0x3b1b8: 0x6e3b9820, 0x3b1b9: 0x6e3b9a20, 0x3b1ba: 0x6e3f3220, 0x3b1bb: 0x6e3f3420, + 0x3b1bc: 0x6e3f3620, 0x3b1bd: 0x6e3f3820, 0x3b1be: 0x6e3f3a20, 0x3b1bf: 0x6e3f3c20, + // Block 0xec7, offset 0x3b1c0 + 0x3b1c0: 0x6e3f3e20, 0x3b1c1: 0x6e41c020, 0x3b1c2: 0x6e41c220, 0x3b1c3: 0x6e41c420, + 0x3b1c4: 0x6e41c620, 0x3b1c5: 0x6e439020, 0x3b1c6: 0x6e439220, 0x3b1c7: 0x6e439420, + 0x3b1c8: 0x6e45f220, 0x3b1c9: 0x6e465420, 0x3b1ca: 0x6c8ab620, 0x3b1cb: 0x6c8ab820, + 0x3b1cc: 0x6d178c20, 0x3b1cd: 0x6d463e20, 0x3b1ce: 0x6d464020, 0x3b1cf: 0x6d464220, + 0x3b1d0: 0x6d734620, 0x3b1d1: 0x6d9cc220, 0x3b1d2: 0x6dbf5420, 0x3b1d3: 0x6ddd3a20, + 0x3b1d4: 0x6ddd3c20, 0x3b1d5: 0x6e08f020, 0x3b1d6: 0x6e18ea20, 0x3b1d7: 0x6e18ec20, + 0x3b1d8: 0x6e18ee20, 0x3b1d9: 0x6e25a620, 0x3b1da: 0x6e25a820, 0x3b1db: 0x6e2f1c20, + 0x3b1dc: 0x6e367820, 0x3b1dd: 0x6e367a20, 0x3b1de: 0x6e367c20, 0x3b1df: 0x6e439620, + 0x3b1e0: 0x6d734820, 0x3b1e1: 0x6d734a20, 0x3b1e2: 0x6d9cc420, 0x3b1e3: 0x6ddd3e20, + 0x3b1e4: 0x6e08f220, 0x3b1e5: 0x6e18f020, 0x3b1e6: 0x6e18f220, 0x3b1e7: 0x6e25aa20, + 0x3b1e8: 0x6e2f1e20, 0x3b1e9: 0x6e41cc20, 0x3b1ea: 0x6e439820, 0x3b1eb: 0x6d178e20, + 0x3b1ec: 0x6d179020, 0x3b1ed: 0x6d464820, 0x3b1ee: 0x6d464a20, 0x3b1ef: 0x6d734e20, + 0x3b1f0: 0x6d735020, 0x3b1f1: 0x6d9cca20, 0x3b1f2: 0x6d9ccc20, 0x3b1f3: 0x6d9cce20, + 0x3b1f4: 0x6d9cd020, 0x3b1f5: 0x6d9cd220, 0x3b1f6: 0x6d9cd420, 0x3b1f7: 0x6d9cd620, + 0x3b1f8: 0x6d9cd820, 0x3b1f9: 0x6dbf5820, 0x3b1fa: 0x6dbf5a20, 0x3b1fb: 0x6dbf5c20, + 0x3b1fc: 0x6dbf5e20, 0x3b1fd: 0x6dbf6020, 0x3b1fe: 0x6ddd4420, 0x3b1ff: 0x6ddd4620, + // Block 0xec8, offset 0x3b200 + 0x3b200: 0x6ddd4820, 0x3b201: 0x6ddd4a20, 0x3b202: 0x6ddd4c20, 0x3b203: 0x6df4fc20, + 0x3b204: 0x6df4fe20, 0x3b205: 0x6df50020, 0x3b206: 0x6df50220, 0x3b207: 0x6e08f620, + 0x3b208: 0x6e08f820, 0x3b209: 0x6e08fa20, 0x3b20a: 0x6e08fc20, 0x3b20b: 0x6e08fe20, + 0x3b20c: 0x6e18f820, 0x3b20d: 0x6e18fa20, 0x3b20e: 0x6e18fc20, 0x3b20f: 0x6e18fe20, + 0x3b210: 0x6e190020, 0x3b211: 0x6e190220, 0x3b212: 0x6e25b020, 0x3b213: 0x6e25b220, + 0x3b214: 0x6e25b420, 0x3b215: 0x6e25b620, 0x3b216: 0x6e2f2020, 0x3b217: 0x6e2f2220, + 0x3b218: 0x6e2f2420, 0x3b219: 0x6e2f2620, 0x3b21a: 0x6e2f2820, 0x3b21b: 0x6e2f2a20, + 0x3b21c: 0x6e2f2c20, 0x3b21d: 0x6e2f2e20, 0x3b21e: 0x6e2f3020, 0x3b21f: 0x6e2f3220, + 0x3b220: 0x6e367e20, 0x3b221: 0x6e368020, 0x3b222: 0x6e368220, 0x3b223: 0x6e368420, + 0x3b224: 0x6e3ba020, 0x3b225: 0x6e3ba220, 0x3b226: 0x6e3f4020, 0x3b227: 0x6e3f4220, + 0x3b228: 0x6e3f4420, 0x3b229: 0x6e3f4620, 0x3b22a: 0x6e3f4820, 0x3b22b: 0x6e41ce20, + 0x3b22c: 0x6e41d020, 0x3b22d: 0x6e439a20, 0x3b22e: 0x6e439c20, 0x3b22f: 0x6e44cc20, + 0x3b230: 0x6e44ce20, 0x3b231: 0x6e457c20, 0x3b232: 0x6e457e20, 0x3b233: 0x6e458020, + 0x3b234: 0x6e45f420, 0x3b235: 0x6e45f620, 0x3b236: 0x6e465620, 0x3b237: 0x6e470e20, + 0x3b238: 0x6e471020, 0x3b239: 0x6cb73a20, 0x3b23a: 0x6cb73c20, 0x3b23b: 0x6cb73e20, + 0x3b23c: 0x6cb74020, 0x3b23d: 0x6ce85220, 0x3b23e: 0x6ce85420, 0x3b23f: 0x6ce85620, + // Block 0xec9, offset 0x3b240 + 0x3b240: 0x6ce85820, 0x3b241: 0x6ce85a20, 0x3b242: 0x6ce85c20, 0x3b243: 0x6ce85e20, + 0x3b244: 0x6ce86020, 0x3b245: 0x6ce86220, 0x3b246: 0x6ce86420, 0x3b247: 0x6ce86620, + 0x3b248: 0x6ce86820, 0x3b249: 0x6ce86a20, 0x3b24a: 0x6d179420, 0x3b24b: 0x6d179620, + 0x3b24c: 0x6d179820, 0x3b24d: 0x6d179a20, 0x3b24e: 0x6d179c20, 0x3b24f: 0x6d179e20, + 0x3b250: 0x6d17a020, 0x3b251: 0x6d17a220, 0x3b252: 0x6d17a420, 0x3b253: 0x6d17a620, + 0x3b254: 0x6d17a820, 0x3b255: 0x6d17aa20, 0x3b256: 0x6d17ac20, 0x3b257: 0x6d17ae20, + 0x3b258: 0x6d17b020, 0x3b259: 0x6d17b220, 0x3b25a: 0x6d17b420, 0x3b25b: 0x6d17b620, + 0x3b25c: 0x6d17b820, 0x3b25d: 0x6d17ba20, 0x3b25e: 0x6d17bc20, 0x3b25f: 0x6d17be20, + 0x3b260: 0x6d17c020, 0x3b261: 0x6d465a20, 0x3b262: 0x6d465c20, 0x3b263: 0x6d465e20, + 0x3b264: 0x6d466020, 0x3b265: 0x6d466220, 0x3b266: 0x6d466420, 0x3b267: 0x6d466620, + 0x3b268: 0x6d466820, 0x3b269: 0x6d466a20, 0x3b26a: 0x6d466c20, 0x3b26b: 0x6d466e20, + 0x3b26c: 0x6d467020, 0x3b26d: 0x6d467220, 0x3b26e: 0x6d467420, 0x3b26f: 0x6d467620, + 0x3b270: 0x6d467820, 0x3b271: 0x6d467a20, 0x3b272: 0x6d467c20, 0x3b273: 0x6d467e20, + 0x3b274: 0x6d468020, 0x3b275: 0x6d468220, 0x3b276: 0x6d468420, 0x3b277: 0x6d468620, + 0x3b278: 0x6d468820, 0x3b279: 0x6d468a20, 0x3b27a: 0x6d736020, 0x3b27b: 0x6d736220, + 0x3b27c: 0x6d736420, 0x3b27d: 0x6d736620, 0x3b27e: 0x6d736820, 0x3b27f: 0x6d736a20, + // Block 0xeca, offset 0x3b280 + 0x3b280: 0x6d736c20, 0x3b281: 0x6d736e20, 0x3b282: 0x6d737020, 0x3b283: 0x6d737220, + 0x3b284: 0x6d737420, 0x3b285: 0x6d737620, 0x3b286: 0x6d737820, 0x3b287: 0x6d737a20, + 0x3b288: 0x6d737c20, 0x3b289: 0x6d737e20, 0x3b28a: 0x6d738020, 0x3b28b: 0x6d738220, + 0x3b28c: 0x6d9ce020, 0x3b28d: 0x6d9ce220, 0x3b28e: 0x6d9ce420, 0x3b28f: 0x6d9ce620, + 0x3b290: 0x6d9ce820, 0x3b291: 0x6d9cea20, 0x3b292: 0x6d9cec20, 0x3b293: 0x6d9cee20, + 0x3b294: 0x6d9cf020, 0x3b295: 0x6d9cf220, 0x3b296: 0x6d9cf420, 0x3b297: 0x6d9cf620, + 0x3b298: 0x6d9cf820, 0x3b299: 0x6d9cfa20, 0x3b29a: 0x6d9cfc20, 0x3b29b: 0x6d9cfe20, + 0x3b29c: 0x6d9d0020, 0x3b29d: 0x6d9d0220, 0x3b29e: 0x6d9d0420, 0x3b29f: 0x6d9d0620, + 0x3b2a0: 0x6d9d0820, 0x3b2a1: 0x6d9d0a20, 0x3b2a2: 0x6dbf6620, 0x3b2a3: 0x6dbf6820, + 0x3b2a4: 0x6dbf6a20, 0x3b2a5: 0x6dbf6c20, 0x3b2a6: 0x6dbf6e20, 0x3b2a7: 0x6dbf7020, + 0x3b2a8: 0x6dbf7220, 0x3b2a9: 0x6dbf7420, 0x3b2aa: 0x6dbf7620, 0x3b2ab: 0x6dbf7820, + 0x3b2ac: 0x6dbf7a20, 0x3b2ad: 0x6dbf7c20, 0x3b2ae: 0x6dbf7e20, 0x3b2af: 0x6dbf8020, + 0x3b2b0: 0x6dbf8220, 0x3b2b1: 0x6dbf8420, 0x3b2b2: 0x6dbf8620, 0x3b2b3: 0x6dbf8820, + 0x3b2b4: 0x6dbf8a20, 0x3b2b5: 0x6ddd6220, 0x3b2b6: 0x6ddd6420, 0x3b2b7: 0x6ddd6620, + 0x3b2b8: 0x6ddd6820, 0x3b2b9: 0x6ddd6a20, 0x3b2ba: 0x6ddd6c20, 0x3b2bb: 0x6ddd6e20, + 0x3b2bc: 0x6ddd7020, 0x3b2bd: 0x6ddd7220, 0x3b2be: 0x6ddd7420, 0x3b2bf: 0x6ddd7620, + // Block 0xecb, offset 0x3b2c0 + 0x3b2c0: 0x6ddd7820, 0x3b2c1: 0x6ddd7a20, 0x3b2c2: 0x6ddd7c20, 0x3b2c3: 0x6ddd7e20, + 0x3b2c4: 0x6ddd8020, 0x3b2c5: 0x6ddd8220, 0x3b2c6: 0x6df50820, 0x3b2c7: 0x6df50a20, + 0x3b2c8: 0x6df50c20, 0x3b2c9: 0x6df50e20, 0x3b2ca: 0x6df51020, 0x3b2cb: 0x6df51220, + 0x3b2cc: 0x6df51420, 0x3b2cd: 0x6df51620, 0x3b2ce: 0x6df51820, 0x3b2cf: 0x6df51a20, + 0x3b2d0: 0x6e090420, 0x3b2d1: 0x6e090620, 0x3b2d2: 0x6e090820, 0x3b2d3: 0x6e090a20, + 0x3b2d4: 0x6e090c20, 0x3b2d5: 0x6e090e20, 0x3b2d6: 0x6e091020, 0x3b2d7: 0x6e091220, + 0x3b2d8: 0x6e091420, 0x3b2d9: 0x6e091620, 0x3b2da: 0x6e091820, 0x3b2db: 0x6e091a20, + 0x3b2dc: 0x6e190e20, 0x3b2dd: 0x6e191020, 0x3b2de: 0x6e191220, 0x3b2df: 0x6e191420, + 0x3b2e0: 0x6e191620, 0x3b2e1: 0x6e191820, 0x3b2e2: 0x6e191a20, 0x3b2e3: 0x6e191c20, + 0x3b2e4: 0x6e191e20, 0x3b2e5: 0x6e192020, 0x3b2e6: 0x6e192220, 0x3b2e7: 0x6e192420, + 0x3b2e8: 0x6e192620, 0x3b2e9: 0x6e192820, 0x3b2ea: 0x6e192a20, 0x3b2eb: 0x6e192c20, + 0x3b2ec: 0x6e192e20, 0x3b2ed: 0x6e193020, 0x3b2ee: 0x6e25c220, 0x3b2ef: 0x6e25c420, + 0x3b2f0: 0x6e25c620, 0x3b2f1: 0x6e2f3620, 0x3b2f2: 0x6e2f3820, 0x3b2f3: 0x6e2f3a20, + 0x3b2f4: 0x6e2f3c20, 0x3b2f5: 0x6e2f3e20, 0x3b2f6: 0x6e2f4020, 0x3b2f7: 0x6e2f4220, + 0x3b2f8: 0x6e2f4420, 0x3b2f9: 0x6e2f4620, 0x3b2fa: 0x6e369020, 0x3b2fb: 0x6e369220, + 0x3b2fc: 0x6e369420, 0x3b2fd: 0x6e369620, 0x3b2fe: 0x6e369820, 0x3b2ff: 0x6e3ba420, + // Block 0xecc, offset 0x3b300 + 0x3b300: 0x6e3f4a20, 0x3b301: 0x6e3f4c20, 0x3b302: 0x6e3f4e20, 0x3b303: 0x6e3f5020, + 0x3b304: 0x6e41d220, 0x3b305: 0x6e41d420, 0x3b306: 0x6e43a020, 0x3b307: 0x6e43a220, + 0x3b308: 0x6e44d020, 0x3b309: 0x6e45f820, 0x3b30a: 0x6e465820, 0x3b30b: 0x6cb74820, + 0x3b30c: 0x6d17ce20, 0x3b30d: 0x6d17d020, 0x3b30e: 0x6d17d220, 0x3b30f: 0x6d17d420, + 0x3b310: 0x6d17d620, 0x3b311: 0x6d17d820, 0x3b312: 0x6d17da20, 0x3b313: 0x6d17dc20, + 0x3b314: 0x6d469a20, 0x3b315: 0x6d469c20, 0x3b316: 0x6d469e20, 0x3b317: 0x6d46a020, + 0x3b318: 0x6d46a220, 0x3b319: 0x6d46a420, 0x3b31a: 0x6d46a620, 0x3b31b: 0x6d46a820, + 0x3b31c: 0x6d46aa20, 0x3b31d: 0x6d46ac20, 0x3b31e: 0x6d46ae20, 0x3b31f: 0x6d46b020, + 0x3b320: 0x6d73c420, 0x3b321: 0x6d73c620, 0x3b322: 0x6d73c820, 0x3b323: 0x6d73ca20, + 0x3b324: 0x6d73cc20, 0x3b325: 0x6d73ce20, 0x3b326: 0x6d73d020, 0x3b327: 0x6d73d220, + 0x3b328: 0x6d73d420, 0x3b329: 0x6d73d620, 0x3b32a: 0x6d73d820, 0x3b32b: 0x6d73da20, + 0x3b32c: 0x6d73dc20, 0x3b32d: 0x6d73de20, 0x3b32e: 0x6d73e020, 0x3b32f: 0x6d73e220, + 0x3b330: 0x6d73e420, 0x3b331: 0x6d73e620, 0x3b332: 0x6d73e820, 0x3b333: 0x6d73ea20, + 0x3b334: 0x6d73ec20, 0x3b335: 0x6d73ee20, 0x3b336: 0x6d73f020, 0x3b337: 0x6d73f220, + 0x3b338: 0x6d73f420, 0x3b339: 0x6d73f620, 0x3b33a: 0x6d73f820, 0x3b33b: 0x6d73fa20, + 0x3b33c: 0x6d73fc20, 0x3b33d: 0x6d73fe20, 0x3b33e: 0x6d740020, 0x3b33f: 0x6d740220, + // Block 0xecd, offset 0x3b340 + 0x3b340: 0x6d740420, 0x3b341: 0x6d9d6220, 0x3b342: 0x6d9d6420, 0x3b343: 0x6d9d6620, + 0x3b344: 0x6d9d6820, 0x3b345: 0x6d9d6a20, 0x3b346: 0x6d9d6c20, 0x3b347: 0x6d9d6e20, + 0x3b348: 0x6d9d7020, 0x3b349: 0x6d9d7220, 0x3b34a: 0x6d9d7420, 0x3b34b: 0x6d9d7620, + 0x3b34c: 0x6d9d7820, 0x3b34d: 0x6d9d7a20, 0x3b34e: 0x6d9d7c20, 0x3b34f: 0x6d9d7e20, + 0x3b350: 0x6d9d8020, 0x3b351: 0x6d9d8220, 0x3b352: 0x6d9d8420, 0x3b353: 0x6d9d8620, + 0x3b354: 0x6d9d8820, 0x3b355: 0x6d9d8a20, 0x3b356: 0x6d9d8c20, 0x3b357: 0x6d9d8e20, + 0x3b358: 0x6d9d9020, 0x3b359: 0x6d9d9220, 0x3b35a: 0x6d9d9420, 0x3b35b: 0x6d9d9620, + 0x3b35c: 0x6d9d9820, 0x3b35d: 0x6d9d9a20, 0x3b35e: 0x6d9d9c20, 0x3b35f: 0x6d9d9e20, + 0x3b360: 0x6d9da020, 0x3b361: 0x6dbfd420, 0x3b362: 0x6dbfd620, 0x3b363: 0x6dbfd820, + 0x3b364: 0x6dbfda20, 0x3b365: 0x6dbfdc20, 0x3b366: 0x6dbfde20, 0x3b367: 0x6dbfe020, + 0x3b368: 0x6dbfe220, 0x3b369: 0x6dbfe420, 0x3b36a: 0x6dbfe620, 0x3b36b: 0x6dbfe820, + 0x3b36c: 0x6dbfea20, 0x3b36d: 0x6dbfec20, 0x3b36e: 0x6dbfee20, 0x3b36f: 0x6dbff020, + 0x3b370: 0x6dbff220, 0x3b371: 0x6dbff420, 0x3b372: 0x6dbff620, 0x3b373: 0x6dbff820, + 0x3b374: 0x6dbffa20, 0x3b375: 0x6dbffc20, 0x3b376: 0x6dbffe20, 0x3b377: 0x6d46b220, + 0x3b378: 0x6dc00020, 0x3b379: 0x6dc00220, 0x3b37a: 0x6dc00420, 0x3b37b: 0x6dc00620, + 0x3b37c: 0x6dc00820, 0x3b37d: 0x6dc00a20, 0x3b37e: 0x6dc00c20, 0x3b37f: 0x6dc00e20, + // Block 0xece, offset 0x3b380 + 0x3b380: 0x6dc01020, 0x3b381: 0x6dc01220, 0x3b382: 0x6dc01420, 0x3b383: 0x6dc01620, + 0x3b384: 0x6dc01820, 0x3b385: 0x6dc01a20, 0x3b386: 0x6dc01c20, 0x3b387: 0x6dc01e20, + 0x3b388: 0x6dc02020, 0x3b389: 0x6dc02220, 0x3b38a: 0x6dc02420, 0x3b38b: 0x6dc02620, + 0x3b38c: 0x6dc02820, 0x3b38d: 0x6dddd220, 0x3b38e: 0x6dddd420, 0x3b38f: 0x6dddd620, + 0x3b390: 0x6dddd820, 0x3b391: 0x6dddda20, 0x3b392: 0x6ddddc20, 0x3b393: 0x6dddde20, + 0x3b394: 0x6ddde020, 0x3b395: 0x6ddde220, 0x3b396: 0x6ddde420, 0x3b397: 0x6ddde620, + 0x3b398: 0x6ddde820, 0x3b399: 0x6dddea20, 0x3b39a: 0x6dddec20, 0x3b39b: 0x6dddee20, + 0x3b39c: 0x6dddf020, 0x3b39d: 0x6dddf220, 0x3b39e: 0x6dddf420, 0x3b39f: 0x6dddf620, + 0x3b3a0: 0x6dddf820, 0x3b3a1: 0x6dddfa20, 0x3b3a2: 0x6dddfc20, 0x3b3a3: 0x6dddfe20, + 0x3b3a4: 0x6dde0020, 0x3b3a5: 0x6dde0220, 0x3b3a6: 0x6dde0420, 0x3b3a7: 0x6dde0620, + 0x3b3a8: 0x6dde0820, 0x3b3a9: 0x6dde0a20, 0x3b3aa: 0x6dde0c20, 0x3b3ab: 0x6dde0e20, + 0x3b3ac: 0x6dde1020, 0x3b3ad: 0x6dde1220, 0x3b3ae: 0x6dde1420, 0x3b3af: 0x6dde1620, + 0x3b3b0: 0x6dde1820, 0x3b3b1: 0x6dde1a20, 0x3b3b2: 0x6dde1c20, 0x3b3b3: 0x6dde1e20, + 0x3b3b4: 0x6dde2020, 0x3b3b5: 0x6dde2220, 0x3b3b6: 0x6dde2420, 0x3b3b7: 0x6df58620, + 0x3b3b8: 0x6df58820, 0x3b3b9: 0x6df58a20, 0x3b3ba: 0x6df58c20, 0x3b3bb: 0x6df58e20, + 0x3b3bc: 0x6df59020, 0x3b3bd: 0x6df59220, 0x3b3be: 0x6df59420, 0x3b3bf: 0x6df59620, + // Block 0xecf, offset 0x3b3c0 + 0x3b3c0: 0x6df59820, 0x3b3c1: 0x6df59a20, 0x3b3c2: 0x6df59c20, 0x3b3c3: 0x6df59e20, + 0x3b3c4: 0x6df5a020, 0x3b3c5: 0x6df5a220, 0x3b3c6: 0x6df5a420, 0x3b3c7: 0x6df5a620, + 0x3b3c8: 0x6df5a820, 0x3b3c9: 0x6df5aa20, 0x3b3ca: 0x6df5ac20, 0x3b3cb: 0x6df5ae20, + 0x3b3cc: 0x6df5b020, 0x3b3cd: 0x6df5b220, 0x3b3ce: 0x6df5b420, 0x3b3cf: 0x6df5b620, + 0x3b3d0: 0x6df5b820, 0x3b3d1: 0x6df5ba20, 0x3b3d2: 0x6df5bc20, 0x3b3d3: 0x6df5be20, + 0x3b3d4: 0x6df5c020, 0x3b3d5: 0x6df5c220, 0x3b3d6: 0x6df5c420, 0x3b3d7: 0x6df5c620, + 0x3b3d8: 0x6df5c820, 0x3b3d9: 0x6df5ca20, 0x3b3da: 0x6df5cc20, 0x3b3db: 0x6df5ce20, + 0x3b3dc: 0x6df5d020, 0x3b3dd: 0x6df5d220, 0x3b3de: 0x6df5d420, 0x3b3df: 0x6df5d620, + 0x3b3e0: 0x6df5d820, 0x3b3e1: 0x6df5da20, 0x3b3e2: 0x6df5dc20, 0x3b3e3: 0x6df5de20, + 0x3b3e4: 0x6df5e020, 0x3b3e5: 0x6df5e220, 0x3b3e6: 0x6df5e420, 0x3b3e7: 0x6df5e620, + 0x3b3e8: 0x6df5e820, 0x3b3e9: 0x6df5ea20, 0x3b3ea: 0x6df5ec20, 0x3b3eb: 0x6df5ee20, + 0x3b3ec: 0x6df5f020, 0x3b3ed: 0x6df5f220, 0x3b3ee: 0x6df5f420, 0x3b3ef: 0x6df5f620, + 0x3b3f0: 0x6df5f820, 0x3b3f1: 0x6df5fa20, 0x3b3f2: 0x6df5fc20, 0x3b3f3: 0x6df5fe20, + 0x3b3f4: 0x6df60020, 0x3b3f5: 0x6df60220, 0x3b3f6: 0x6df60420, 0x3b3f7: 0x6df60620, + 0x3b3f8: 0x6df60820, 0x3b3f9: 0x6df60a20, 0x3b3fa: 0x6df60c20, 0x3b3fb: 0x6df60e20, + 0x3b3fc: 0x6df61020, 0x3b3fd: 0x6df61220, 0x3b3fe: 0x6e097a20, 0x3b3ff: 0x6e097c20, + // Block 0xed0, offset 0x3b400 + 0x3b400: 0x6e097e20, 0x3b401: 0x6e098020, 0x3b402: 0x6e098220, 0x3b403: 0x6e098420, + 0x3b404: 0x6e098620, 0x3b405: 0x6e098820, 0x3b406: 0x6e098a20, 0x3b407: 0x6e098c20, + 0x3b408: 0x6e098e20, 0x3b409: 0x6e099020, 0x3b40a: 0x6e099220, 0x3b40b: 0x6e099420, + 0x3b40c: 0x6e099620, 0x3b40d: 0x6e099820, 0x3b40e: 0x6e099a20, 0x3b40f: 0x6e099c20, + 0x3b410: 0x6e099e20, 0x3b411: 0x6e09a020, 0x3b412: 0x6e09a220, 0x3b413: 0x6e09a420, + 0x3b414: 0x6e09a620, 0x3b415: 0x6e09a820, 0x3b416: 0x6e09aa20, 0x3b417: 0x6e09ac20, + 0x3b418: 0x6e09ae20, 0x3b419: 0x6e09b020, 0x3b41a: 0x6e09b220, 0x3b41b: 0x6e09b420, + 0x3b41c: 0x6e09b620, 0x3b41d: 0x6e09b820, 0x3b41e: 0x6e09ba20, 0x3b41f: 0x6e09bc20, + 0x3b420: 0x6e09be20, 0x3b421: 0x6e09c020, 0x3b422: 0x6e09c220, 0x3b423: 0x6e09c420, + 0x3b424: 0x6e09c620, 0x3b425: 0x6e09c820, 0x3b426: 0x6e09ca20, 0x3b427: 0x6e09cc20, + 0x3b428: 0x6e09ce20, 0x3b429: 0x6e09d020, 0x3b42a: 0x6e09d220, 0x3b42b: 0x6e09d420, + 0x3b42c: 0x6e09d620, 0x3b42d: 0x6e09d820, 0x3b42e: 0x6e09da20, 0x3b42f: 0x6e09dc20, + 0x3b430: 0x6e09de20, 0x3b431: 0x6e196e20, 0x3b432: 0x6e197020, 0x3b433: 0x6e197220, + 0x3b434: 0x6e197420, 0x3b435: 0x6e197620, 0x3b436: 0x6e197820, 0x3b437: 0x6e197a20, + 0x3b438: 0x6e197c20, 0x3b439: 0x6e197e20, 0x3b43a: 0x6e198020, 0x3b43b: 0x6e198220, + 0x3b43c: 0x6e198420, 0x3b43d: 0x6e198620, 0x3b43e: 0x6e198820, 0x3b43f: 0x6e198a20, + // Block 0xed1, offset 0x3b440 + 0x3b440: 0x6e198c20, 0x3b441: 0x6e198e20, 0x3b442: 0x6e199020, 0x3b443: 0x6e199220, + 0x3b444: 0x6e199420, 0x3b445: 0x6e199620, 0x3b446: 0x6e199820, 0x3b447: 0x6e199a20, + 0x3b448: 0x6e199c20, 0x3b449: 0x6e199e20, 0x3b44a: 0x6e19a020, 0x3b44b: 0x6e19a220, + 0x3b44c: 0x6e19a420, 0x3b44d: 0x6e19a620, 0x3b44e: 0x6e19a820, 0x3b44f: 0x6e19aa20, + 0x3b450: 0x6e19ac20, 0x3b451: 0x6e19ae20, 0x3b452: 0x6e19b020, 0x3b453: 0x6e19b220, + 0x3b454: 0x6e19b420, 0x3b455: 0x6e19b620, 0x3b456: 0x6e19b820, 0x3b457: 0x6e19ba20, + 0x3b458: 0x6e19bc20, 0x3b459: 0x6e19be20, 0x3b45a: 0x6e19c020, 0x3b45b: 0x6e19c220, + 0x3b45c: 0x6e19c420, 0x3b45d: 0x6e19c620, 0x3b45e: 0x6e19c820, 0x3b45f: 0x6e19ca20, + 0x3b460: 0x6e19cc20, 0x3b461: 0x6e19ce20, 0x3b462: 0x6e19d020, 0x3b463: 0x6e19d220, + 0x3b464: 0x6e19d420, 0x3b465: 0x6e19d620, 0x3b466: 0x6e19d820, 0x3b467: 0x6e19da20, + 0x3b468: 0x6e19dc20, 0x3b469: 0x6e19de20, 0x3b46a: 0x6e19e020, 0x3b46b: 0x6e19e220, + 0x3b46c: 0x6e19e420, 0x3b46d: 0x6e260e20, 0x3b46e: 0x6e261020, 0x3b46f: 0x6e261220, + 0x3b470: 0x6e261420, 0x3b471: 0x6e261620, 0x3b472: 0x6e261820, 0x3b473: 0x6e261a20, + 0x3b474: 0x6e261c20, 0x3b475: 0x6e261e20, 0x3b476: 0x6e262020, 0x3b477: 0x6e262220, + 0x3b478: 0x6e262420, 0x3b479: 0x6e262620, 0x3b47a: 0x6e262820, 0x3b47b: 0x6e262a20, + 0x3b47c: 0x6e262c20, 0x3b47d: 0x6e262e20, 0x3b47e: 0x6e263020, 0x3b47f: 0x6e263220, + // Block 0xed2, offset 0x3b480 + 0x3b480: 0x6e263420, 0x3b481: 0x6e263620, 0x3b482: 0x6e263820, 0x3b483: 0x6e263a20, + 0x3b484: 0x6e263c20, 0x3b485: 0x6e263e20, 0x3b486: 0x6e264020, 0x3b487: 0x6e264220, + 0x3b488: 0x6e264420, 0x3b489: 0x6e264620, 0x3b48a: 0x6e264820, 0x3b48b: 0x6e264a20, + 0x3b48c: 0x6e264c20, 0x3b48d: 0x6e264e20, 0x3b48e: 0x6e265020, 0x3b48f: 0x6e265220, + 0x3b490: 0x6e265420, 0x3b491: 0x6e265620, 0x3b492: 0x6e265820, 0x3b493: 0x6e265a20, + 0x3b494: 0x6e265c20, 0x3b495: 0x6e265e20, 0x3b496: 0x6e266020, 0x3b497: 0x6e266220, + 0x3b498: 0x6e2f7a20, 0x3b499: 0x6e2f7c20, 0x3b49a: 0x6e2f7e20, 0x3b49b: 0x6e2f8020, + 0x3b49c: 0x6e2f8220, 0x3b49d: 0x6e2f8420, 0x3b49e: 0x6e2f8620, 0x3b49f: 0x6e2f8820, + 0x3b4a0: 0x6e2f8a20, 0x3b4a1: 0x6e2f8c20, 0x3b4a2: 0x6e2f8e20, 0x3b4a3: 0x6e2f9020, + 0x3b4a4: 0x6e2f9220, 0x3b4a5: 0x6e2f9420, 0x3b4a6: 0x6e2f9620, 0x3b4a7: 0x6e2f9820, + 0x3b4a8: 0x6e2f9a20, 0x3b4a9: 0x6e2f9c20, 0x3b4aa: 0x6e2f9e20, 0x3b4ab: 0x6e2fa020, + 0x3b4ac: 0x6e2fa220, 0x3b4ad: 0x6e2fa420, 0x3b4ae: 0x6e2fa620, 0x3b4af: 0x6e2fa820, + 0x3b4b0: 0x6e2faa20, 0x3b4b1: 0x6e2fac20, 0x3b4b2: 0x6e2fae20, 0x3b4b3: 0x6e2fb020, + 0x3b4b4: 0x6e2fb220, 0x3b4b5: 0x6e2fb420, 0x3b4b6: 0x6e2fb620, 0x3b4b7: 0x6e2fb820, + 0x3b4b8: 0x6e2fba20, 0x3b4b9: 0x6e2fbc20, 0x3b4ba: 0x6e2fbe20, 0x3b4bb: 0x6e2fc020, + 0x3b4bc: 0x6e2fc220, 0x3b4bd: 0x6e2fc420, 0x3b4be: 0x6e2fc620, 0x3b4bf: 0x6e2fc820, + // Block 0xed3, offset 0x3b4c0 + 0x3b4c0: 0x6e2fca20, 0x3b4c1: 0x6e2fcc20, 0x3b4c2: 0x6e36c220, 0x3b4c3: 0x6e36c420, + 0x3b4c4: 0x6e36c620, 0x3b4c5: 0x6e36c820, 0x3b4c6: 0x6e36ca20, 0x3b4c7: 0x6e36cc20, + 0x3b4c8: 0x6e36ce20, 0x3b4c9: 0x6e36d020, 0x3b4ca: 0x6e36d220, 0x3b4cb: 0x6e36d420, + 0x3b4cc: 0x6e36d620, 0x3b4cd: 0x6e36d820, 0x3b4ce: 0x6e36da20, 0x3b4cf: 0x6e36dc20, + 0x3b4d0: 0x6e36de20, 0x3b4d1: 0x6e36e020, 0x3b4d2: 0x6e36e220, 0x3b4d3: 0x6e36e420, + 0x3b4d4: 0x6e36e620, 0x3b4d5: 0x6e36e820, 0x3b4d6: 0x6e36ea20, 0x3b4d7: 0x6e36ec20, + 0x3b4d8: 0x6e36ee20, 0x3b4d9: 0x6e36f020, 0x3b4da: 0x6e36f220, 0x3b4db: 0x6e36f420, + 0x3b4dc: 0x6e36f620, 0x3b4dd: 0x6e36f820, 0x3b4de: 0x6e36fa20, 0x3b4df: 0x6e36fc20, + 0x3b4e0: 0x6e36fe20, 0x3b4e1: 0x6e370020, 0x3b4e2: 0x6e370220, 0x3b4e3: 0x6e370420, + 0x3b4e4: 0x6e370620, 0x3b4e5: 0x6e3bb620, 0x3b4e6: 0x6e3bb820, 0x3b4e7: 0x6e3bba20, + 0x3b4e8: 0x6e3bbc20, 0x3b4e9: 0x6e3bbe20, 0x3b4ea: 0x6e3bc020, 0x3b4eb: 0x6e3bc220, + 0x3b4ec: 0x6e3bc420, 0x3b4ed: 0x6e3bc620, 0x3b4ee: 0x6e3bc820, 0x3b4ef: 0x6e3bca20, + 0x3b4f0: 0x6e3bcc20, 0x3b4f1: 0x6e3bce20, 0x3b4f2: 0x6e3bd020, 0x3b4f3: 0x6e3bd220, + 0x3b4f4: 0x6e3bd420, 0x3b4f5: 0x6e3bd620, 0x3b4f6: 0x6e3bd820, 0x3b4f7: 0x6e3bda20, + 0x3b4f8: 0x6e3bdc20, 0x3b4f9: 0x6e3bde20, 0x3b4fa: 0x6e3be020, 0x3b4fb: 0x6e3f6020, + 0x3b4fc: 0x6e3f6220, 0x3b4fd: 0x6e3f6420, 0x3b4fe: 0x6e3f6620, 0x3b4ff: 0x6e3f6820, + // Block 0xed4, offset 0x3b500 + 0x3b500: 0x6e3f6a20, 0x3b501: 0x6e3f6c20, 0x3b502: 0x6e3f6e20, 0x3b503: 0x6e3f7020, + 0x3b504: 0x6e3f7220, 0x3b505: 0x6e3f7420, 0x3b506: 0x6e3f7620, 0x3b507: 0x6e3f7820, + 0x3b508: 0x6e3f7a20, 0x3b509: 0x6e3f7c20, 0x3b50a: 0x6e3f7e20, 0x3b50b: 0x6e3f8020, + 0x3b50c: 0x6e3f8220, 0x3b50d: 0x6e41de20, 0x3b50e: 0x6e41e020, 0x3b50f: 0x6e41e220, + 0x3b510: 0x6e41e420, 0x3b511: 0x6e41e620, 0x3b512: 0x6e41e820, 0x3b513: 0x6e41ea20, + 0x3b514: 0x6e41ec20, 0x3b515: 0x6e41ee20, 0x3b516: 0x6e41f020, 0x3b517: 0x6e41f220, + 0x3b518: 0x6e41f420, 0x3b519: 0x6e41f620, 0x3b51a: 0x6e43a420, 0x3b51b: 0x6e43a620, + 0x3b51c: 0x6e43a820, 0x3b51d: 0x6e43aa20, 0x3b51e: 0x6e43ac20, 0x3b51f: 0x6e43ae20, + 0x3b520: 0x6e43b020, 0x3b521: 0x6e43b220, 0x3b522: 0x6e43b420, 0x3b523: 0x6e43b620, + 0x3b524: 0x6e43b820, 0x3b525: 0x6e43ba20, 0x3b526: 0x6e43bc20, 0x3b527: 0x6e44d420, + 0x3b528: 0x6e44d620, 0x3b529: 0x6e44d820, 0x3b52a: 0x6e44da20, 0x3b52b: 0x6e44dc20, + 0x3b52c: 0x6e44de20, 0x3b52d: 0x6e44e020, 0x3b52e: 0x6e44e220, 0x3b52f: 0x6e44e420, + 0x3b530: 0x6e458420, 0x3b531: 0x6e458620, 0x3b532: 0x6e458820, 0x3b533: 0x6e45fa20, + 0x3b534: 0x6e45fc20, 0x3b535: 0x6e465a20, 0x3b536: 0x6e465c20, 0x3b537: 0x6e465e20, + 0x3b538: 0x6e466020, 0x3b539: 0x6ce87820, 0x3b53a: 0x6ce87a20, 0x3b53b: 0x6ce87c20, + 0x3b53c: 0x6d46d420, 0x3b53d: 0x6d46d620, 0x3b53e: 0x6d46d820, 0x3b53f: 0x6d46da20, + // Block 0xed5, offset 0x3b540 + 0x3b540: 0x6d17fa20, 0x3b541: 0x6d742620, 0x3b542: 0x6d742820, 0x3b543: 0x6d742a20, + 0x3b544: 0x6d742c20, 0x3b545: 0x6d9dce20, 0x3b546: 0x6d9dd020, 0x3b547: 0x6d9dd220, + 0x3b548: 0x6d9dd420, 0x3b549: 0x6d742e20, 0x3b54a: 0x6dc05a20, 0x3b54b: 0x6dc05c20, + 0x3b54c: 0x6df63020, 0x3b54d: 0x6e1a0020, 0x3b54e: 0x6e2fdc20, 0x3b54f: 0x6ce88820, + 0x3b550: 0x6ce88a20, 0x3b551: 0x6ce88c20, 0x3b552: 0x6d181a20, 0x3b553: 0x6d181c20, + 0x3b554: 0x6d181e20, 0x3b555: 0x6d182020, 0x3b556: 0x6d182220, 0x3b557: 0x6d182420, + 0x3b558: 0x6d182620, 0x3b559: 0x6d182820, 0x3b55a: 0x6d182a20, 0x3b55b: 0x6d182c20, + 0x3b55c: 0x6d182e20, 0x3b55d: 0x6d470020, 0x3b55e: 0x6d470220, 0x3b55f: 0x6d470420, + 0x3b560: 0x6d470620, 0x3b561: 0x6d470820, 0x3b562: 0x6d470a20, 0x3b563: 0x6d470c20, + 0x3b564: 0x6d470e20, 0x3b565: 0x6d471020, 0x3b566: 0x6d471220, 0x3b567: 0x6d471420, + 0x3b568: 0x6d471620, 0x3b569: 0x6d471820, 0x3b56a: 0x6d471a20, 0x3b56b: 0x6d471c20, + 0x3b56c: 0x6d471e20, 0x3b56d: 0x6d472020, 0x3b56e: 0x6d472220, 0x3b56f: 0x6d472420, + 0x3b570: 0x6d747e20, 0x3b571: 0x6d748020, 0x3b572: 0x6d748220, 0x3b573: 0x6d748420, + 0x3b574: 0x6d748620, 0x3b575: 0x6d748820, 0x3b576: 0x6d748a20, 0x3b577: 0x6d748c20, + 0x3b578: 0x6d748e20, 0x3b579: 0x6d749020, 0x3b57a: 0x6d749220, 0x3b57b: 0x6d749420, + 0x3b57c: 0x6d749620, 0x3b57d: 0x6d749820, 0x3b57e: 0x6d749a20, 0x3b57f: 0x6d749c20, + // Block 0xed6, offset 0x3b580 + 0x3b580: 0x6d749e20, 0x3b581: 0x6d74a020, 0x3b582: 0x6d74a220, 0x3b583: 0x6d74a420, + 0x3b584: 0x6d74a620, 0x3b585: 0x6d74a820, 0x3b586: 0x6d74aa20, 0x3b587: 0x6d74ac20, + 0x3b588: 0x6d74ae20, 0x3b589: 0x6d74b020, 0x3b58a: 0x6d74b220, 0x3b58b: 0x6d74b420, + 0x3b58c: 0x6d74b620, 0x3b58d: 0x6d74b820, 0x3b58e: 0x6d74ba20, 0x3b58f: 0x6d74bc20, + 0x3b590: 0x6d74be20, 0x3b591: 0x6d74c020, 0x3b592: 0x6d74c220, 0x3b593: 0x6d74c420, + 0x3b594: 0x6d74c620, 0x3b595: 0x6d74c820, 0x3b596: 0x6d74ca20, 0x3b597: 0x6d74cc20, + 0x3b598: 0x6d74ce20, 0x3b599: 0x6d74d020, 0x3b59a: 0x6d74d220, 0x3b59b: 0x6d74d420, + 0x3b59c: 0x6d9e4220, 0x3b59d: 0x6d9e4420, 0x3b59e: 0x6d9e4620, 0x3b59f: 0x6d9e4820, + 0x3b5a0: 0x6d9e4a20, 0x3b5a1: 0x6d9e4c20, 0x3b5a2: 0x6d9e4e20, 0x3b5a3: 0x6d9e5020, + 0x3b5a4: 0x6d9e5220, 0x3b5a5: 0x6d9e5420, 0x3b5a6: 0x6d9e5620, 0x3b5a7: 0x6d9e5820, + 0x3b5a8: 0x6d9e5a20, 0x3b5a9: 0x6d9e5c20, 0x3b5aa: 0x6d9e5e20, 0x3b5ab: 0x6d9e6020, + 0x3b5ac: 0x6d9e6220, 0x3b5ad: 0x6d9e6420, 0x3b5ae: 0x6d9e6620, 0x3b5af: 0x6d9e6820, + 0x3b5b0: 0x6d9e6a20, 0x3b5b1: 0x6d9e6c20, 0x3b5b2: 0x6d9e6e20, 0x3b5b3: 0x6d9e7020, + 0x3b5b4: 0x6d9e7220, 0x3b5b5: 0x6d9e7420, 0x3b5b6: 0x6d9e7620, 0x3b5b7: 0x6d9e7820, + 0x3b5b8: 0x6d9e7a20, 0x3b5b9: 0x6d9e7c20, 0x3b5ba: 0x6d9e7e20, 0x3b5bb: 0x6d9e8020, + 0x3b5bc: 0x6d9e8220, 0x3b5bd: 0x6d9e8420, 0x3b5be: 0x6d9e8620, 0x3b5bf: 0x6d9e8820, + // Block 0xed7, offset 0x3b5c0 + 0x3b5c0: 0x6d9e8a20, 0x3b5c1: 0x6d9e8c20, 0x3b5c2: 0x6d9e8e20, 0x3b5c3: 0x6d9e9020, + 0x3b5c4: 0x6d9e9220, 0x3b5c5: 0x6d9e9420, 0x3b5c6: 0x6d9e9620, 0x3b5c7: 0x6d9e9820, + 0x3b5c8: 0x6d9e9a20, 0x3b5c9: 0x6d9e9c20, 0x3b5ca: 0x6d9e9e20, 0x3b5cb: 0x6d9ea020, + 0x3b5cc: 0x6d9ea220, 0x3b5cd: 0x6d9ea420, 0x3b5ce: 0x6d9ea620, 0x3b5cf: 0x6d9ea820, + 0x3b5d0: 0x6d9eaa20, 0x3b5d1: 0x6d9eac20, 0x3b5d2: 0x6dc0ba20, 0x3b5d3: 0x6dc0bc20, + 0x3b5d4: 0x6dc0be20, 0x3b5d5: 0x6dc0c020, 0x3b5d6: 0x6dc0c220, 0x3b5d7: 0x6dc0c420, + 0x3b5d8: 0x6dc0c620, 0x3b5d9: 0x6dc0c820, 0x3b5da: 0x6dc0ca20, 0x3b5db: 0x6dc0cc20, + 0x3b5dc: 0x6dc0ce20, 0x3b5dd: 0x6dc0d020, 0x3b5de: 0x6dc0d220, 0x3b5df: 0x6dc0d420, + 0x3b5e0: 0x6dc0d620, 0x3b5e1: 0x6dc0d820, 0x3b5e2: 0x6dc0da20, 0x3b5e3: 0x6dc0dc20, + 0x3b5e4: 0x6dc0de20, 0x3b5e5: 0x6dc0e020, 0x3b5e6: 0x6dc0e220, 0x3b5e7: 0x6dc0e420, + 0x3b5e8: 0x6dc0e620, 0x3b5e9: 0x6dc0e820, 0x3b5ea: 0x6dc0ea20, 0x3b5eb: 0x6dc0ec20, + 0x3b5ec: 0x6dc0ee20, 0x3b5ed: 0x6dc0f020, 0x3b5ee: 0x6dc0f220, 0x3b5ef: 0x6dc0f420, + 0x3b5f0: 0x6dc0f620, 0x3b5f1: 0x6dc0f820, 0x3b5f2: 0x6dc0fa20, 0x3b5f3: 0x6dc0fc20, + 0x3b5f4: 0x6dc0fe20, 0x3b5f5: 0x6dc10020, 0x3b5f6: 0x6dc10220, 0x3b5f7: 0x6dc10420, + 0x3b5f8: 0x6dc10620, 0x3b5f9: 0x6dc10820, 0x3b5fa: 0x6dc10a20, 0x3b5fb: 0x6dc10c20, + 0x3b5fc: 0x6dc10e20, 0x3b5fd: 0x6dc11020, 0x3b5fe: 0x6dc11220, 0x3b5ff: 0x6dc11420, + // Block 0xed8, offset 0x3b600 + 0x3b600: 0x6dc11620, 0x3b601: 0x6dc11820, 0x3b602: 0x6dc11a20, 0x3b603: 0x6dc11c20, + 0x3b604: 0x6dc11e20, 0x3b605: 0x6dc12020, 0x3b606: 0x6dc12220, 0x3b607: 0x6dc12420, + 0x3b608: 0x6dc12620, 0x3b609: 0x6dc12820, 0x3b60a: 0x6dde8220, 0x3b60b: 0x6dde8420, + 0x3b60c: 0x6dde8620, 0x3b60d: 0x6dde8820, 0x3b60e: 0x6dde8a20, 0x3b60f: 0x6dde8c20, + 0x3b610: 0x6dde8e20, 0x3b611: 0x6dde9020, 0x3b612: 0x6dde9220, 0x3b613: 0x6dde9420, + 0x3b614: 0x6dde9620, 0x3b615: 0x6dde9820, 0x3b616: 0x6dde9a20, 0x3b617: 0x6dde9c20, + 0x3b618: 0x6dde9e20, 0x3b619: 0x6ddea020, 0x3b61a: 0x6ddea220, 0x3b61b: 0x6ddea420, + 0x3b61c: 0x6ddea620, 0x3b61d: 0x6ddea820, 0x3b61e: 0x6ddeaa20, 0x3b61f: 0x6ddeac20, + 0x3b620: 0x6ddeae20, 0x3b621: 0x6ddeb020, 0x3b622: 0x6ddeb220, 0x3b623: 0x6ddeb420, + 0x3b624: 0x6ddeb620, 0x3b625: 0x6ddeb820, 0x3b626: 0x6ddeba20, 0x3b627: 0x6ddebc20, + 0x3b628: 0x6ddebe20, 0x3b629: 0x6ddec020, 0x3b62a: 0x6ddec220, 0x3b62b: 0x6ddec420, + 0x3b62c: 0x6ddec620, 0x3b62d: 0x6ddec820, 0x3b62e: 0x6ddeca20, 0x3b62f: 0x6ddecc20, + 0x3b630: 0x6ddece20, 0x3b631: 0x6dded020, 0x3b632: 0x6dded220, 0x3b633: 0x6dded420, + 0x3b634: 0x6dded620, 0x3b635: 0x6dded820, 0x3b636: 0x6ddeda20, 0x3b637: 0x6df6a020, + 0x3b638: 0x6df6a220, 0x3b639: 0x6df6a420, 0x3b63a: 0x6df6a620, 0x3b63b: 0x6df6a820, + 0x3b63c: 0x6df6aa20, 0x3b63d: 0x6df6ac20, 0x3b63e: 0x6df6ae20, 0x3b63f: 0x6df6b020, + // Block 0xed9, offset 0x3b640 + 0x3b640: 0x6df6b220, 0x3b641: 0x6df6b420, 0x3b642: 0x6df6b620, 0x3b643: 0x6df6b820, + 0x3b644: 0x6df6ba20, 0x3b645: 0x6df6bc20, 0x3b646: 0x6df6be20, 0x3b647: 0x6df6c020, + 0x3b648: 0x6df6c220, 0x3b649: 0x6df6c420, 0x3b64a: 0x6df6c620, 0x3b64b: 0x6df6c820, + 0x3b64c: 0x6df6ca20, 0x3b64d: 0x6df6cc20, 0x3b64e: 0x6df6ce20, 0x3b64f: 0x6df6d020, + 0x3b650: 0x6df6d220, 0x3b651: 0x6df6d420, 0x3b652: 0x6df6d620, 0x3b653: 0x6df6d820, + 0x3b654: 0x6df6da20, 0x3b655: 0x6df6dc20, 0x3b656: 0x6df6de20, 0x3b657: 0x6df6e020, + 0x3b658: 0x6df6e220, 0x3b659: 0x6df6e420, 0x3b65a: 0x6df6e620, 0x3b65b: 0x6df6e820, + 0x3b65c: 0x6df6ea20, 0x3b65d: 0x6df6ec20, 0x3b65e: 0x6df6ee20, 0x3b65f: 0x6df6f020, + 0x3b660: 0x6df6f220, 0x3b661: 0x6df6f420, 0x3b662: 0x6df6f620, 0x3b663: 0x6df6f820, + 0x3b664: 0x6df6fa20, 0x3b665: 0x6df6fc20, 0x3b666: 0x6df6fe20, 0x3b667: 0x6df70020, + 0x3b668: 0x6df70220, 0x3b669: 0x6df70420, 0x3b66a: 0x6df70620, 0x3b66b: 0x6df70820, + 0x3b66c: 0x6df70a20, 0x3b66d: 0x6df70c20, 0x3b66e: 0x6df70e20, 0x3b66f: 0x6df71020, + 0x3b670: 0x6df71220, 0x3b671: 0x6df71420, 0x3b672: 0x6df71620, 0x3b673: 0x6df71820, + 0x3b674: 0x6df71a20, 0x3b675: 0x6df71c20, 0x3b676: 0x6e0a4420, 0x3b677: 0x6e0a4620, + 0x3b678: 0x6e0a4820, 0x3b679: 0x6e0a4a20, 0x3b67a: 0x6e0a4c20, 0x3b67b: 0x6e0a4e20, + 0x3b67c: 0x6e0a5020, 0x3b67d: 0x6e0a5220, 0x3b67e: 0x6e0a5420, 0x3b67f: 0x6e0a5620, + // Block 0xeda, offset 0x3b680 + 0x3b680: 0x6e0a5820, 0x3b681: 0x6e0a5a20, 0x3b682: 0x6e0a5c20, 0x3b683: 0x6e0a5e20, + 0x3b684: 0x6e0a6020, 0x3b685: 0x6e0a6220, 0x3b686: 0x6e0a6420, 0x3b687: 0x6e0a6620, + 0x3b688: 0x6e0a6820, 0x3b689: 0x6e0a6a20, 0x3b68a: 0x6e0a6c20, 0x3b68b: 0x6e0a6e20, + 0x3b68c: 0x6e0a7020, 0x3b68d: 0x6e0a7220, 0x3b68e: 0x6e0a7420, 0x3b68f: 0x6e0a7620, + 0x3b690: 0x6e0a7820, 0x3b691: 0x6e0a7a20, 0x3b692: 0x6e0a7c20, 0x3b693: 0x6e0a7e20, + 0x3b694: 0x6e0a8020, 0x3b695: 0x6e0a8220, 0x3b696: 0x6e0a8420, 0x3b697: 0x6e0a8620, + 0x3b698: 0x6e0a8820, 0x3b699: 0x6e0a8a20, 0x3b69a: 0x6e0a8c20, 0x3b69b: 0x6e0a8e20, + 0x3b69c: 0x6e0a9020, 0x3b69d: 0x6e0a9220, 0x3b69e: 0x6e0a9420, 0x3b69f: 0x6e0a9620, + 0x3b6a0: 0x6e0a9820, 0x3b6a1: 0x6e0a9a20, 0x3b6a2: 0x6e0a9c20, 0x3b6a3: 0x6e0a9e20, + 0x3b6a4: 0x6e0aa020, 0x3b6a5: 0x6e0aa220, 0x3b6a6: 0x6e0aa420, 0x3b6a7: 0x6e0aa620, + 0x3b6a8: 0x6e0aa820, 0x3b6a9: 0x6e0aaa20, 0x3b6aa: 0x6e0aac20, 0x3b6ab: 0x6e0aae20, + 0x3b6ac: 0x6e0ab020, 0x3b6ad: 0x6e0ab220, 0x3b6ae: 0x6e0ab420, 0x3b6af: 0x6e0ab620, + 0x3b6b0: 0x6e0ab820, 0x3b6b1: 0x6e0aba20, 0x3b6b2: 0x6e0abc20, 0x3b6b3: 0x6e0abe20, + 0x3b6b4: 0x6e0ac020, 0x3b6b5: 0x6e0ac220, 0x3b6b6: 0x6e0ac420, 0x3b6b7: 0x6e0ac620, + 0x3b6b8: 0x6e0ac820, 0x3b6b9: 0x6e0aca20, 0x3b6ba: 0x6e1a5420, 0x3b6bb: 0x6e1a5620, + 0x3b6bc: 0x6e1a5820, 0x3b6bd: 0x6e1a5a20, 0x3b6be: 0x6e1a5c20, 0x3b6bf: 0x6e1a5e20, + // Block 0xedb, offset 0x3b6c0 + 0x3b6c0: 0x6e1a6020, 0x3b6c1: 0x6e1a6220, 0x3b6c2: 0x6e1a6420, 0x3b6c3: 0x6e1a6620, + 0x3b6c4: 0x6e1a6820, 0x3b6c5: 0x6e1a6a20, 0x3b6c6: 0x6e1a6c20, 0x3b6c7: 0x6e1a6e20, + 0x3b6c8: 0x6e1a7020, 0x3b6c9: 0x6e1a7220, 0x3b6ca: 0x6e1a7420, 0x3b6cb: 0x6e1a7620, + 0x3b6cc: 0x6e1a7820, 0x3b6cd: 0x6e1a7a20, 0x3b6ce: 0x6e1a7c20, 0x3b6cf: 0x6e1a7e20, + 0x3b6d0: 0x6e1a8020, 0x3b6d1: 0x6e1a8220, 0x3b6d2: 0x6e1a8420, 0x3b6d3: 0x6e1a8620, + 0x3b6d4: 0x6e1a8820, 0x3b6d5: 0x6e1a8a20, 0x3b6d6: 0x6e1a8c20, 0x3b6d7: 0x6e1a8e20, + 0x3b6d8: 0x6e1a9020, 0x3b6d9: 0x6e1a9220, 0x3b6da: 0x6e1a9420, 0x3b6db: 0x6e1a9620, + 0x3b6dc: 0x6e1a9820, 0x3b6dd: 0x6e1a9a20, 0x3b6de: 0x6e1a9c20, 0x3b6df: 0x6e1a9e20, + 0x3b6e0: 0x6e1aa020, 0x3b6e1: 0x6e1aa220, 0x3b6e2: 0x6e1aa420, 0x3b6e3: 0x6e1aa620, + 0x3b6e4: 0x6e1aa820, 0x3b6e5: 0x6e1aaa20, 0x3b6e6: 0x6e1aac20, 0x3b6e7: 0x6e1aae20, + 0x3b6e8: 0x6e1ab020, 0x3b6e9: 0x6e1ab220, 0x3b6ea: 0x6e1ab420, 0x3b6eb: 0x6e1ab620, + 0x3b6ec: 0x6e1ab820, 0x3b6ed: 0x6e26a820, 0x3b6ee: 0x6e26aa20, 0x3b6ef: 0x6e26ac20, + 0x3b6f0: 0x6e26ae20, 0x3b6f1: 0x6e26b020, 0x3b6f2: 0x6e26b220, 0x3b6f3: 0x6e26b420, + 0x3b6f4: 0x6e26b620, 0x3b6f5: 0x6e26b820, 0x3b6f6: 0x6e26ba20, 0x3b6f7: 0x6e26bc20, + 0x3b6f8: 0x6e26be20, 0x3b6f9: 0x6e26c020, 0x3b6fa: 0x6e26c220, 0x3b6fb: 0x6e26c420, + 0x3b6fc: 0x6e26c620, 0x3b6fd: 0x6e26c820, 0x3b6fe: 0x6e26ca20, 0x3b6ff: 0x6e26cc20, + // Block 0xedc, offset 0x3b700 + 0x3b700: 0x6e26ce20, 0x3b701: 0x6e26d020, 0x3b702: 0x6e26d220, 0x3b703: 0x6e26d420, + 0x3b704: 0x6e26d620, 0x3b705: 0x6e26d820, 0x3b706: 0x6e26da20, 0x3b707: 0x6e26dc20, + 0x3b708: 0x6e26de20, 0x3b709: 0x6e26e020, 0x3b70a: 0x6e26e220, 0x3b70b: 0x6e26e420, + 0x3b70c: 0x6e26e620, 0x3b70d: 0x6e26e820, 0x3b70e: 0x6e26ea20, 0x3b70f: 0x6e26ec20, + 0x3b710: 0x6e26ee20, 0x3b711: 0x6e26f020, 0x3b712: 0x6e26f220, 0x3b713: 0x6e26f420, + 0x3b714: 0x6e26f620, 0x3b715: 0x6e26f820, 0x3b716: 0x6e26fa20, 0x3b717: 0x6e26fc20, + 0x3b718: 0x6e26fe20, 0x3b719: 0x6e270020, 0x3b71a: 0x6e270220, 0x3b71b: 0x6e270420, + 0x3b71c: 0x6e270620, 0x3b71d: 0x6e270820, 0x3b71e: 0x6e270a20, 0x3b71f: 0x6e270c20, + 0x3b720: 0x6e270e20, 0x3b721: 0x6e271020, 0x3b722: 0x6e271220, 0x3b723: 0x6e271420, + 0x3b724: 0x6e271620, 0x3b725: 0x6e271820, 0x3b726: 0x6e271a20, 0x3b727: 0x6e271c20, + 0x3b728: 0x6e271e20, 0x3b729: 0x6e272020, 0x3b72a: 0x6e272220, 0x3b72b: 0x6e272420, + 0x3b72c: 0x6e272620, 0x3b72d: 0x6e272820, 0x3b72e: 0x6e272a20, 0x3b72f: 0x6e302220, + 0x3b730: 0x6e302420, 0x3b731: 0x6e302620, 0x3b732: 0x6e302820, 0x3b733: 0x6e302a20, + 0x3b734: 0x6e302c20, 0x3b735: 0x6e302e20, 0x3b736: 0x6e303020, 0x3b737: 0x6e303220, + 0x3b738: 0x6e303420, 0x3b739: 0x6e303620, 0x3b73a: 0x6e303820, 0x3b73b: 0x6e303a20, + 0x3b73c: 0x6e303c20, 0x3b73d: 0x6e303e20, 0x3b73e: 0x6e304020, 0x3b73f: 0x6e304220, + // Block 0xedd, offset 0x3b740 + 0x3b740: 0x6e304420, 0x3b741: 0x6e304620, 0x3b742: 0x6e304820, 0x3b743: 0x6e304a20, + 0x3b744: 0x6e304c20, 0x3b745: 0x6e304e20, 0x3b746: 0x6e305020, 0x3b747: 0x6e305220, + 0x3b748: 0x6e305420, 0x3b749: 0x6e305620, 0x3b74a: 0x6e305820, 0x3b74b: 0x6e305a20, + 0x3b74c: 0x6e305c20, 0x3b74d: 0x6e305e20, 0x3b74e: 0x6e306020, 0x3b74f: 0x6e306220, + 0x3b750: 0x6e306420, 0x3b751: 0x6e306620, 0x3b752: 0x6e306820, 0x3b753: 0x6e306a20, + 0x3b754: 0x6e306c20, 0x3b755: 0x6e306e20, 0x3b756: 0x6e307020, 0x3b757: 0x6e307220, + 0x3b758: 0x6e307420, 0x3b759: 0x6e307620, 0x3b75a: 0x6e307820, 0x3b75b: 0x6e307a20, + 0x3b75c: 0x6e307c20, 0x3b75d: 0x6e307e20, 0x3b75e: 0x6e308020, 0x3b75f: 0x6e308220, + 0x3b760: 0x6e308420, 0x3b761: 0x6e308620, 0x3b762: 0x6e308820, 0x3b763: 0x6e308a20, + 0x3b764: 0x6e308c20, 0x3b765: 0x6e308e20, 0x3b766: 0x6e309020, 0x3b767: 0x6e309220, + 0x3b768: 0x6e309420, 0x3b769: 0x6e309620, 0x3b76a: 0x6e309820, 0x3b76b: 0x6e309a20, + 0x3b76c: 0x6e374020, 0x3b76d: 0x6e309c20, 0x3b76e: 0x6e374220, 0x3b76f: 0x6e374420, + 0x3b770: 0x6e374620, 0x3b771: 0x6e374820, 0x3b772: 0x6e374a20, 0x3b773: 0x6e374c20, + 0x3b774: 0x6e374e20, 0x3b775: 0x6e375020, 0x3b776: 0x6e375220, 0x3b777: 0x6e375420, + 0x3b778: 0x6e375620, 0x3b779: 0x6e375820, 0x3b77a: 0x6e375a20, 0x3b77b: 0x6e375c20, + 0x3b77c: 0x6e375e20, 0x3b77d: 0x6e376020, 0x3b77e: 0x6e376220, 0x3b77f: 0x6e376420, + // Block 0xede, offset 0x3b780 + 0x3b780: 0x6e376620, 0x3b781: 0x6e376820, 0x3b782: 0x6e376a20, 0x3b783: 0x6e376c20, + 0x3b784: 0x6e376e20, 0x3b785: 0x6e377020, 0x3b786: 0x6e377220, 0x3b787: 0x6e377420, + 0x3b788: 0x6e377620, 0x3b789: 0x6e377820, 0x3b78a: 0x6e377a20, 0x3b78b: 0x6e377c20, + 0x3b78c: 0x6e377e20, 0x3b78d: 0x6e378020, 0x3b78e: 0x6e378220, 0x3b78f: 0x6e378420, + 0x3b790: 0x6e378620, 0x3b791: 0x6e3bfa20, 0x3b792: 0x6e3bfc20, 0x3b793: 0x6e3bfe20, + 0x3b794: 0x6e3c0020, 0x3b795: 0x6e3c0220, 0x3b796: 0x6e3c0420, 0x3b797: 0x6e3c0620, + 0x3b798: 0x6e3c0820, 0x3b799: 0x6e3c0a20, 0x3b79a: 0x6e3c0c20, 0x3b79b: 0x6e3c0e20, + 0x3b79c: 0x6e3c1020, 0x3b79d: 0x6e3c1220, 0x3b79e: 0x6e3c8020, 0x3b79f: 0x6e3c1420, + 0x3b7a0: 0x6e3c1620, 0x3b7a1: 0x6e3c1820, 0x3b7a2: 0x6e3c1a20, 0x3b7a3: 0x6e3c1c20, + 0x3b7a4: 0x6e3c1e20, 0x3b7a5: 0x6e3c2020, 0x3b7a6: 0x6e3c2220, 0x3b7a7: 0x6e3c2420, + 0x3b7a8: 0x6e3c2620, 0x3b7a9: 0x6e3c2820, 0x3b7aa: 0x6e3c2a20, 0x3b7ab: 0x6e3c2c20, + 0x3b7ac: 0x6e3c2e20, 0x3b7ad: 0x6e3f8c20, 0x3b7ae: 0x6e3f8e20, 0x3b7af: 0x6e3f9020, + 0x3b7b0: 0x6e3f9220, 0x3b7b1: 0x6e3f9420, 0x3b7b2: 0x6e3f9620, 0x3b7b3: 0x6e3f9820, + 0x3b7b4: 0x6e3f9a20, 0x3b7b5: 0x6e3f9c20, 0x3b7b6: 0x6e3f9e20, 0x3b7b7: 0x6e3fa020, + 0x3b7b8: 0x6e3fa220, 0x3b7b9: 0x6e3fa420, 0x3b7ba: 0x6e3fa620, 0x3b7bb: 0x6e3fa820, + 0x3b7bc: 0x6e3faa20, 0x3b7bd: 0x6e3fac20, 0x3b7be: 0x6e3fae20, 0x3b7bf: 0x6e3fb020, + // Block 0xedf, offset 0x3b7c0 + 0x3b7c0: 0x6e3fb220, 0x3b7c1: 0x6e3fb420, 0x3b7c2: 0x6e3fb620, 0x3b7c3: 0x6e420020, + 0x3b7c4: 0x6e420220, 0x3b7c5: 0x6e420420, 0x3b7c6: 0x6e420620, 0x3b7c7: 0x6e420820, + 0x3b7c8: 0x6e420a20, 0x3b7c9: 0x6e420c20, 0x3b7ca: 0x6e420e20, 0x3b7cb: 0x6e421020, + 0x3b7cc: 0x6e421220, 0x3b7cd: 0x6e421420, 0x3b7ce: 0x6e421620, 0x3b7cf: 0x6e421820, + 0x3b7d0: 0x6e421a20, 0x3b7d1: 0x6e421c20, 0x3b7d2: 0x6e421e20, 0x3b7d3: 0x6e422020, + 0x3b7d4: 0x6e422220, 0x3b7d5: 0x6e422420, 0x3b7d6: 0x6e422620, 0x3b7d7: 0x6e422820, + 0x3b7d8: 0x6e43c620, 0x3b7d9: 0x6e43c820, 0x3b7da: 0x6e43ca20, 0x3b7db: 0x6e43cc20, + 0x3b7dc: 0x6e43ce20, 0x3b7dd: 0x6e43d020, 0x3b7de: 0x6e43d220, 0x3b7df: 0x6e43d420, + 0x3b7e0: 0x6e43d620, 0x3b7e1: 0x6e43d820, 0x3b7e2: 0x6e43da20, 0x3b7e3: 0x6e43dc20, + 0x3b7e4: 0x6e43de20, 0x3b7e5: 0x6e44ea20, 0x3b7e6: 0x6e44ec20, 0x3b7e7: 0x6e44ee20, + 0x3b7e8: 0x6e44f020, 0x3b7e9: 0x6e44f220, 0x3b7ea: 0x6e44f420, 0x3b7eb: 0x6e44f620, + 0x3b7ec: 0x6e44f820, 0x3b7ed: 0x6e44fa20, 0x3b7ee: 0x6e459220, 0x3b7ef: 0x6e459420, + 0x3b7f0: 0x6e459620, 0x3b7f1: 0x6e459820, 0x3b7f2: 0x6e459a20, 0x3b7f3: 0x6e459c20, + 0x3b7f4: 0x6e460220, 0x3b7f5: 0x6e460420, 0x3b7f6: 0x6e460620, 0x3b7f7: 0x6e460820, + 0x3b7f8: 0x6e466420, 0x3b7f9: 0x6e466620, 0x3b7fa: 0x6e466820, 0x3b7fb: 0x6e469c20, + 0x3b7fc: 0x6e469e20, 0x3b7fd: 0x6e46a020, 0x3b7fe: 0x6e46d620, 0x3b7ff: 0x6e46f620, + // Block 0xee0, offset 0x3b800 + 0x3b800: 0x6e46f820, 0x3b801: 0x6c63b820, 0x3b802: 0x6c63ba20, 0x3b803: 0x6c63bc20, + 0x3b804: 0x6c8ade20, 0x3b805: 0x6cb76820, 0x3b806: 0x6cb76a20, 0x3b807: 0x6cb76c20, + 0x3b808: 0x6cb76e20, 0x3b809: 0x6cb77020, 0x3b80a: 0x6cb77220, 0x3b80b: 0x6cb77420, + 0x3b80c: 0x6ce8a220, 0x3b80d: 0x6ce8a420, 0x3b80e: 0x6d184820, 0x3b80f: 0x6d473420, + 0x3b810: 0x6d473620, 0x3b811: 0x6d74f220, 0x3b812: 0x6d74f420, 0x3b813: 0x6d74f620, + 0x3b814: 0x6d74f820, 0x3b815: 0x6e0ad620, 0x3b816: 0x6d474620, 0x3b817: 0x6d474820, + 0x3b818: 0x6d750220, 0x3b819: 0x6d750420, 0x3b81a: 0x6d750620, 0x3b81b: 0x6d750820, + 0x3b81c: 0x6d9ecc20, 0x3b81d: 0x6d9ece20, 0x3b81e: 0x6d9ed020, 0x3b81f: 0x6d9ed220, + 0x3b820: 0x6d9ed420, 0x3b821: 0x6d9ed620, 0x3b822: 0x6dc14420, 0x3b823: 0x6ddef220, + 0x3b824: 0x6ddef420, 0x3b825: 0x6ddef620, 0x3b826: 0x6df73820, 0x3b827: 0x6df73a20, + 0x3b828: 0x6df73c20, 0x3b829: 0x6df73e20, 0x3b82a: 0x6df74020, 0x3b82b: 0x6df74220, + 0x3b82c: 0x6df74420, 0x3b82d: 0x6e0ada20, 0x3b82e: 0x6e0adc20, 0x3b82f: 0x6e0ade20, + 0x3b830: 0x6e0ae020, 0x3b831: 0x6e0ae220, 0x3b832: 0x6e0ae420, 0x3b833: 0x6e0ae620, + 0x3b834: 0x6e0ae820, 0x3b835: 0x6e1aca20, 0x3b836: 0x6e1acc20, 0x3b837: 0x6e1ace20, + 0x3b838: 0x6e1ad020, 0x3b839: 0x6e1ad220, 0x3b83a: 0x6e273820, 0x3b83b: 0x6e273a20, + 0x3b83c: 0x6e273c20, 0x3b83d: 0x6e273e20, 0x3b83e: 0x6e274020, 0x3b83f: 0x6e30aa20, + // Block 0xee1, offset 0x3b840 + 0x3b840: 0x6e30ac20, 0x3b841: 0x6e30ae20, 0x3b842: 0x6e30b020, 0x3b843: 0x6e379020, + 0x3b844: 0x6e379220, 0x3b845: 0x6e379420, 0x3b846: 0x6e3c3420, 0x3b847: 0x6e3c3620, + 0x3b848: 0x6e3fba20, 0x3b849: 0x6e422a20, 0x3b84a: 0x6e43e020, 0x3b84b: 0x6d185c20, + 0x3b84c: 0x6d185e20, 0x3b84d: 0x6d474c20, 0x3b84e: 0x6d474e20, 0x3b84f: 0x6d751620, + 0x3b850: 0x6d751820, 0x3b851: 0x6d751a20, 0x3b852: 0x6d751c20, 0x3b853: 0x6d751e20, + 0x3b854: 0x6d752020, 0x3b855: 0x6d752220, 0x3b856: 0x6d752420, 0x3b857: 0x6d752620, + 0x3b858: 0x6d752820, 0x3b859: 0x6d752a20, 0x3b85a: 0x6d752c20, 0x3b85b: 0x6d9eea20, + 0x3b85c: 0x6d9eec20, 0x3b85d: 0x6d9eee20, 0x3b85e: 0x6d9ef020, 0x3b85f: 0x6d9ef220, + 0x3b860: 0x6d9ef420, 0x3b861: 0x6d9ef620, 0x3b862: 0x6d9ef820, 0x3b863: 0x6d9efa20, + 0x3b864: 0x6d9efc20, 0x3b865: 0x6dc14e20, 0x3b866: 0x6dc15020, 0x3b867: 0x6dc15220, + 0x3b868: 0x6dc15420, 0x3b869: 0x6dc15620, 0x3b86a: 0x6dc15820, 0x3b86b: 0x6dc15a20, + 0x3b86c: 0x6dc15c20, 0x3b86d: 0x6dc15e20, 0x3b86e: 0x6dc16020, 0x3b86f: 0x6dc16220, + 0x3b870: 0x6dc16420, 0x3b871: 0x6dc16620, 0x3b872: 0x6dc16820, 0x3b873: 0x6dc16a20, + 0x3b874: 0x6ddf0620, 0x3b875: 0x6ddf0820, 0x3b876: 0x6ddf0a20, 0x3b877: 0x6ddf0c20, + 0x3b878: 0x6ddf0e20, 0x3b879: 0x6ddf1020, 0x3b87a: 0x6ddf1220, 0x3b87b: 0x6ddf1420, + 0x3b87c: 0x6ddf1620, 0x3b87d: 0x6ddf1820, 0x3b87e: 0x6ddf1a20, 0x3b87f: 0x6ddf1c20, + // Block 0xee2, offset 0x3b880 + 0x3b880: 0x6ddf1e20, 0x3b881: 0x6ddf2020, 0x3b882: 0x6ddf2220, 0x3b883: 0x6ddf2420, + 0x3b884: 0x6df75620, 0x3b885: 0x6df75820, 0x3b886: 0x6df75a20, 0x3b887: 0x6df75c20, + 0x3b888: 0x6df75e20, 0x3b889: 0x6df76020, 0x3b88a: 0x6df76220, 0x3b88b: 0x6df76420, + 0x3b88c: 0x6df76620, 0x3b88d: 0x6df76820, 0x3b88e: 0x6e0af420, 0x3b88f: 0x6e0af620, + 0x3b890: 0x6e0af820, 0x3b891: 0x6e0afa20, 0x3b892: 0x6e0afc20, 0x3b893: 0x6e0afe20, + 0x3b894: 0x6e0b0020, 0x3b895: 0x6e0b0220, 0x3b896: 0x6e0b0420, 0x3b897: 0x6e1ada20, + 0x3b898: 0x6e1adc20, 0x3b899: 0x6e1ade20, 0x3b89a: 0x6e1ae020, 0x3b89b: 0x6e1ae220, + 0x3b89c: 0x6e274620, 0x3b89d: 0x6e274820, 0x3b89e: 0x6e274a20, 0x3b89f: 0x6e274c20, + 0x3b8a0: 0x6e274e20, 0x3b8a1: 0x6e30b420, 0x3b8a2: 0x6e30b620, 0x3b8a3: 0x6e30b820, + 0x3b8a4: 0x6e30ba20, 0x3b8a5: 0x6e30bc20, 0x3b8a6: 0x6e30be20, 0x3b8a7: 0x6e30c020, + 0x3b8a8: 0x6e30c220, 0x3b8a9: 0x6e30c420, 0x3b8aa: 0x6e379c20, 0x3b8ab: 0x6e379e20, + 0x3b8ac: 0x6e37a020, 0x3b8ad: 0x6e37a220, 0x3b8ae: 0x6e3c3a20, 0x3b8af: 0x6e3c3c20, + 0x3b8b0: 0x6e3c3e20, 0x3b8b1: 0x6e3c4020, 0x3b8b2: 0x6e3c4220, 0x3b8b3: 0x6e3c4420, + 0x3b8b4: 0x6e3c4620, 0x3b8b5: 0x6e422c20, 0x3b8b6: 0x6e43e420, 0x3b8b7: 0x6e43e620, + 0x3b8b8: 0x6e44fc20, 0x3b8b9: 0x6e460c20, 0x3b8ba: 0x6e46d820, 0x3b8bb: 0x6e46fa20, + 0x3b8bc: 0x6d186220, 0x3b8bd: 0x6d186420, 0x3b8be: 0x6d186620, 0x3b8bf: 0x6d186820, + // Block 0xee3, offset 0x3b8c0 + 0x3b8c0: 0x6d186a20, 0x3b8c1: 0x6d475820, 0x3b8c2: 0x6d475a20, 0x3b8c3: 0x6d475c20, + 0x3b8c4: 0x6d475e20, 0x3b8c5: 0x6d753c20, 0x3b8c6: 0x6d753e20, 0x3b8c7: 0x6d754020, + 0x3b8c8: 0x6d754220, 0x3b8c9: 0x6d754420, 0x3b8ca: 0x6d754620, 0x3b8cb: 0x6d754820, + 0x3b8cc: 0x6d754a20, 0x3b8cd: 0x6d754c20, 0x3b8ce: 0x6d754e20, 0x3b8cf: 0x6d755020, + 0x3b8d0: 0x6d755220, 0x3b8d1: 0x6d755420, 0x3b8d2: 0x6d755620, 0x3b8d3: 0x6d755820, + 0x3b8d4: 0x6d9f0c20, 0x3b8d5: 0x6d9f0e20, 0x3b8d6: 0x6d9f1020, 0x3b8d7: 0x6d9f1220, + 0x3b8d8: 0x6d9f1420, 0x3b8d9: 0x6d9f1620, 0x3b8da: 0x6d9f1820, 0x3b8db: 0x6cbd9220, + 0x3b8dc: 0x6d9f1a20, 0x3b8dd: 0x6d9f1c20, 0x3b8de: 0x6d9f1e20, 0x3b8df: 0x6d9f2020, + 0x3b8e0: 0x6d9f2220, 0x3b8e1: 0x6d9f2420, 0x3b8e2: 0x6dc17420, 0x3b8e3: 0x6dc17620, + 0x3b8e4: 0x6dc17820, 0x3b8e5: 0x6dc17a20, 0x3b8e6: 0x6dc17c20, 0x3b8e7: 0x6dc17e20, + 0x3b8e8: 0x6dc18020, 0x3b8e9: 0x6dc18220, 0x3b8ea: 0x6dc18420, 0x3b8eb: 0x6dc18620, + 0x3b8ec: 0x6dc18820, 0x3b8ed: 0x6ddf3220, 0x3b8ee: 0x6ddf3420, 0x3b8ef: 0x6ddf3620, + 0x3b8f0: 0x6ddf3820, 0x3b8f1: 0x6ddf3a20, 0x3b8f2: 0x6ddf3c20, 0x3b8f3: 0x6ddf3e20, + 0x3b8f4: 0x6ddf4020, 0x3b8f5: 0x6ddf4220, 0x3b8f6: 0x6ddf4420, 0x3b8f7: 0x6ddf4620, + 0x3b8f8: 0x6ddf4820, 0x3b8f9: 0x6ddf4a20, 0x3b8fa: 0x6ddf4c20, 0x3b8fb: 0x6ddf4e20, + 0x3b8fc: 0x6df77820, 0x3b8fd: 0x6df77a20, 0x3b8fe: 0x6df77c20, 0x3b8ff: 0x6df77e20, + // Block 0xee4, offset 0x3b900 + 0x3b900: 0x6df78020, 0x3b901: 0x6df78220, 0x3b902: 0x6df78420, 0x3b903: 0x6df78620, + 0x3b904: 0x6df78820, 0x3b905: 0x6df78a20, 0x3b906: 0x6df78c20, 0x3b907: 0x6df78e20, + 0x3b908: 0x6df79020, 0x3b909: 0x6df79220, 0x3b90a: 0x6df79420, 0x3b90b: 0x6df79620, + 0x3b90c: 0x6e0b0820, 0x3b90d: 0x6e0b0a20, 0x3b90e: 0x6e0b0c20, 0x3b90f: 0x6e0b0e20, + 0x3b910: 0x6e0b1020, 0x3b911: 0x6e0b1220, 0x3b912: 0x6e0b1420, 0x3b913: 0x6e0b1620, + 0x3b914: 0x6e0b1820, 0x3b915: 0x6e0b1a20, 0x3b916: 0x6e0b1c20, 0x3b917: 0x6e0b1e20, + 0x3b918: 0x6e0b2020, 0x3b919: 0x6e0b2220, 0x3b91a: 0x6e0b2420, 0x3b91b: 0x6e1aea20, + 0x3b91c: 0x6e1aec20, 0x3b91d: 0x6e1aee20, 0x3b91e: 0x6e1af020, 0x3b91f: 0x6e1af220, + 0x3b920: 0x6e1af420, 0x3b921: 0x6e1af620, 0x3b922: 0x6e1af820, 0x3b923: 0x6e275820, + 0x3b924: 0x6e275a20, 0x3b925: 0x6e275c20, 0x3b926: 0x6e275e20, 0x3b927: 0x6e276020, + 0x3b928: 0x6e276220, 0x3b929: 0x6e276420, 0x3b92a: 0x6e276620, 0x3b92b: 0x6e276820, + 0x3b92c: 0x6e276a20, 0x3b92d: 0x6e276c20, 0x3b92e: 0x6e276e20, 0x3b92f: 0x6e277020, + 0x3b930: 0x6e277220, 0x3b931: 0x6e277420, 0x3b932: 0x6e30ca20, 0x3b933: 0x6e30cc20, + 0x3b934: 0x6e30ce20, 0x3b935: 0x6e30d020, 0x3b936: 0x6e30d220, 0x3b937: 0x6e30d420, + 0x3b938: 0x6e37a620, 0x3b939: 0x6e37a820, 0x3b93a: 0x6e37aa20, 0x3b93b: 0x6e37ac20, + 0x3b93c: 0x6e37ae20, 0x3b93d: 0x6e37b020, 0x3b93e: 0x6e37b220, 0x3b93f: 0x6e3fbc20, + // Block 0xee5, offset 0x3b940 + 0x3b940: 0x6e3fbe20, 0x3b941: 0x6e422e20, 0x3b942: 0x6e423020, 0x3b943: 0x6e43e820, + 0x3b944: 0x6e43ea20, 0x3b945: 0x6e43ec20, 0x3b946: 0x6e45a020, 0x3b947: 0x6e460e20, + 0x3b948: 0x6c8aec20, 0x3b949: 0x6cb78e20, 0x3b94a: 0x6cb79020, 0x3b94b: 0x6ce8b020, + 0x3b94c: 0x6d476020, 0x3b94d: 0x6c63ca20, 0x3b94e: 0x6d755c20, 0x3b94f: 0x6d755e20, + 0x3b950: 0x6ddf5020, 0x3b951: 0x6d186c20, 0x3b952: 0x6d476820, 0x3b953: 0x6d476a20, + 0x3b954: 0x6d476c20, 0x3b955: 0x6d756620, 0x3b956: 0x6d756820, 0x3b957: 0x6d756a20, + 0x3b958: 0x6d756c20, 0x3b959: 0x6d756e20, 0x3b95a: 0x6d757020, 0x3b95b: 0x6d9f2820, + 0x3b95c: 0x6d9f2a20, 0x3b95d: 0x6d9f2c20, 0x3b95e: 0x6d9f2e20, 0x3b95f: 0x6d9f3020, + 0x3b960: 0x6dc18c20, 0x3b961: 0x6dc18e20, 0x3b962: 0x6dc19020, 0x3b963: 0x6ddf5420, + 0x3b964: 0x6ddf5620, 0x3b965: 0x6df79c20, 0x3b966: 0x6df79e20, 0x3b967: 0x6df7a020, + 0x3b968: 0x6e0b2c20, 0x3b969: 0x6e0b2e20, 0x3b96a: 0x6e1afa20, 0x3b96b: 0x6e1afc20, + 0x3b96c: 0x6e277620, 0x3b96d: 0x6e30d620, 0x3b96e: 0x6e30d820, 0x3b96f: 0x6e30da20, + 0x3b970: 0x6e37b420, 0x3b971: 0x6e3c4a20, 0x3b972: 0x6e461020, 0x3b973: 0x6d186e20, + 0x3b974: 0x6d476e20, 0x3b975: 0x6d757220, 0x3b976: 0x6d757420, 0x3b977: 0x6d757620, + 0x3b978: 0x6d757820, 0x3b979: 0x6d757a20, 0x3b97a: 0x6d9f3820, 0x3b97b: 0x6dc19a20, + 0x3b97c: 0x6dc19c20, 0x3b97d: 0x6dc19e20, 0x3b97e: 0x6dc1a020, 0x3b97f: 0x6dc1a220, + // Block 0xee6, offset 0x3b980 + 0x3b980: 0x6dc1a420, 0x3b981: 0x6dc1a620, 0x3b982: 0x6ddf5e20, 0x3b983: 0x6ddf6020, + 0x3b984: 0x6ddf6220, 0x3b985: 0x6ddf6420, 0x3b986: 0x6df7a620, 0x3b987: 0x6df7a820, + 0x3b988: 0x6df7aa20, 0x3b989: 0x6df7ac20, 0x3b98a: 0x6df7ae20, 0x3b98b: 0x6df7b020, + 0x3b98c: 0x6df7b220, 0x3b98d: 0x6df7b420, 0x3b98e: 0x6df7b620, 0x3b98f: 0x6df7b820, + 0x3b990: 0x6df7ba20, 0x3b991: 0x6df7bc20, 0x3b992: 0x6df7be20, 0x3b993: 0x6e0b3220, + 0x3b994: 0x6e0b3420, 0x3b995: 0x6e0b3620, 0x3b996: 0x6e0b3820, 0x3b997: 0x6e0b3a20, + 0x3b998: 0x6e0b3c20, 0x3b999: 0x6e1b0020, 0x3b99a: 0x6e1b0220, 0x3b99b: 0x6e1b0420, + 0x3b99c: 0x6e1b0620, 0x3b99d: 0x6e1b0820, 0x3b99e: 0x6e1b0a20, 0x3b99f: 0x6e277820, + 0x3b9a0: 0x6e277a20, 0x3b9a1: 0x6e277c20, 0x3b9a2: 0x6e277e20, 0x3b9a3: 0x6e278020, + 0x3b9a4: 0x6e30e020, 0x3b9a5: 0x6e30e220, 0x3b9a6: 0x6e30e420, 0x3b9a7: 0x6e37b820, + 0x3b9a8: 0x6e37ba20, 0x3b9a9: 0x6e37bc20, 0x3b9aa: 0x6e3fc020, 0x3b9ab: 0x6e423220, + 0x3b9ac: 0x6e461220, 0x3b9ad: 0x6d477020, 0x3b9ae: 0x6d758220, 0x3b9af: 0x6d758420, + 0x3b9b0: 0x6d9f3e20, 0x3b9b1: 0x6d9f4020, 0x3b9b2: 0x6d9f4220, 0x3b9b3: 0x6d9f4420, + 0x3b9b4: 0x6d9f4620, 0x3b9b5: 0x6d9f4820, 0x3b9b6: 0x6dc1aa20, 0x3b9b7: 0x6dc1ac20, + 0x3b9b8: 0x6dc1ae20, 0x3b9b9: 0x6dc1b020, 0x3b9ba: 0x6dc1b220, 0x3b9bb: 0x6dc1b420, + 0x3b9bc: 0x6dc1b620, 0x3b9bd: 0x6dc1b820, 0x3b9be: 0x6dc1ba20, 0x3b9bf: 0x6ddf6620, + // Block 0xee7, offset 0x3b9c0 + 0x3b9c0: 0x6ddf6820, 0x3b9c1: 0x6df7c020, 0x3b9c2: 0x6e0b4420, 0x3b9c3: 0x6e0b4620, + 0x3b9c4: 0x6e0b4820, 0x3b9c5: 0x6e0b4a20, 0x3b9c6: 0x6e0b4c20, 0x3b9c7: 0x6e1b1220, + 0x3b9c8: 0x6e1b1420, 0x3b9c9: 0x6e1b1620, 0x3b9ca: 0x6e1b1820, 0x3b9cb: 0x6e278620, + 0x3b9cc: 0x6e30e820, 0x3b9cd: 0x6e30ea20, 0x3b9ce: 0x6e30ec20, 0x3b9cf: 0x6e30ee20, + 0x3b9d0: 0x6e37be20, 0x3b9d1: 0x6e3fc220, 0x3b9d2: 0x6e3c5020, 0x3b9d3: 0x6e3fc420, + 0x3b9d4: 0x6e43ee20, 0x3b9d5: 0x6e43f020, 0x3b9d6: 0x6e43f220, 0x3b9d7: 0x6ce8bc20, + 0x3b9d8: 0x6d187220, 0x3b9d9: 0x6d477420, 0x3b9da: 0x6d477620, 0x3b9db: 0x6d477820, + 0x3b9dc: 0x6d758c20, 0x3b9dd: 0x6d758e20, 0x3b9de: 0x6d759020, 0x3b9df: 0x6d759220, + 0x3b9e0: 0x6d759420, 0x3b9e1: 0x6d759620, 0x3b9e2: 0x6d759820, 0x3b9e3: 0x6d759a20, + 0x3b9e4: 0x6d9f5620, 0x3b9e5: 0x6d9f5820, 0x3b9e6: 0x6d9f5a20, 0x3b9e7: 0x6d9f5c20, + 0x3b9e8: 0x6d9f5e20, 0x3b9e9: 0x6d9f6020, 0x3b9ea: 0x6d9f6220, 0x3b9eb: 0x6d9f6420, + 0x3b9ec: 0x6d9f6620, 0x3b9ed: 0x6d9f6820, 0x3b9ee: 0x6d9f6a20, 0x3b9ef: 0x6d9f6c20, + 0x3b9f0: 0x6d9f6e20, 0x3b9f1: 0x6d9f7020, 0x3b9f2: 0x6dc1cc20, 0x3b9f3: 0x6dc1ce20, + 0x3b9f4: 0x6dc1d020, 0x3b9f5: 0x6dc1d220, 0x3b9f6: 0x6dc1d420, 0x3b9f7: 0x6dc1d620, + 0x3b9f8: 0x6dc1d820, 0x3b9f9: 0x6dc1da20, 0x3b9fa: 0x6dc1dc20, 0x3b9fb: 0x6dc1de20, + 0x3b9fc: 0x6dc1e020, 0x3b9fd: 0x6dc1e220, 0x3b9fe: 0x6dc1e420, 0x3b9ff: 0x6ddf7820, + // Block 0xee8, offset 0x3ba00 + 0x3ba00: 0x6ddf7a20, 0x3ba01: 0x6ddf7c20, 0x3ba02: 0x6ddf7e20, 0x3ba03: 0x6ddf8020, + 0x3ba04: 0x6ddf8220, 0x3ba05: 0x6ddf8420, 0x3ba06: 0x6ddf8620, 0x3ba07: 0x6ddf8820, + 0x3ba08: 0x6df7cc20, 0x3ba09: 0x6df7ce20, 0x3ba0a: 0x6df7d020, 0x3ba0b: 0x6df7d220, + 0x3ba0c: 0x6df7d420, 0x3ba0d: 0x6df7d620, 0x3ba0e: 0x6df7d820, 0x3ba0f: 0x6df7da20, + 0x3ba10: 0x6df7dc20, 0x3ba11: 0x6df7de20, 0x3ba12: 0x6e0b6220, 0x3ba13: 0x6e0b6420, + 0x3ba14: 0x6e0b6620, 0x3ba15: 0x6e0b6820, 0x3ba16: 0x6e0b6a20, 0x3ba17: 0x6e0b6c20, + 0x3ba18: 0x6e0b6e20, 0x3ba19: 0x6e0b7020, 0x3ba1a: 0x6e0b7220, 0x3ba1b: 0x6e0b7420, + 0x3ba1c: 0x6e0b7620, 0x3ba1d: 0x6e0b7820, 0x3ba1e: 0x6e0b7a20, 0x3ba1f: 0x6e0b7c20, + 0x3ba20: 0x6e0b7e20, 0x3ba21: 0x6e0b8020, 0x3ba22: 0x6e0b8220, 0x3ba23: 0x6e1b2a20, + 0x3ba24: 0x6e0b8420, 0x3ba25: 0x6e1b2c20, 0x3ba26: 0x6e1b2e20, 0x3ba27: 0x6e1b3020, + 0x3ba28: 0x6e1b3220, 0x3ba29: 0x6e1b3420, 0x3ba2a: 0x6e1b3620, 0x3ba2b: 0x6e1b3820, + 0x3ba2c: 0x6e1b3a20, 0x3ba2d: 0x6e1b3c20, 0x3ba2e: 0x6e1b3e20, 0x3ba2f: 0x6e1b4020, + 0x3ba30: 0x6e1b4220, 0x3ba31: 0x6e1b4420, 0x3ba32: 0x6e1b4620, 0x3ba33: 0x6e1b4820, + 0x3ba34: 0x6e1b4a20, 0x3ba35: 0x6e1b4c20, 0x3ba36: 0x6e1b4e20, 0x3ba37: 0x6e1b5020, + 0x3ba38: 0x6e1b5220, 0x3ba39: 0x6e1b5420, 0x3ba3a: 0x6e1b5620, 0x3ba3b: 0x6e1b5820, + 0x3ba3c: 0x6e1b5a20, 0x3ba3d: 0x6e1b5c20, 0x3ba3e: 0x6e278c20, 0x3ba3f: 0x6e278e20, + // Block 0xee9, offset 0x3ba40 + 0x3ba40: 0x6e279020, 0x3ba41: 0x6e279220, 0x3ba42: 0x6e279420, 0x3ba43: 0x6e279620, + 0x3ba44: 0x6e279820, 0x3ba45: 0x6e279a20, 0x3ba46: 0x6e279c20, 0x3ba47: 0x6e279e20, + 0x3ba48: 0x6e27a020, 0x3ba49: 0x6e27a220, 0x3ba4a: 0x6e27a420, 0x3ba4b: 0x6e27a620, + 0x3ba4c: 0x6e27a820, 0x3ba4d: 0x6e27aa20, 0x3ba4e: 0x6e27ac20, 0x3ba4f: 0x6e30f820, + 0x3ba50: 0x6e30fa20, 0x3ba51: 0x6e30fc20, 0x3ba52: 0x6e30fe20, 0x3ba53: 0x6e310020, + 0x3ba54: 0x6e310220, 0x3ba55: 0x6e310420, 0x3ba56: 0x6e310620, 0x3ba57: 0x6e310820, + 0x3ba58: 0x6e37c220, 0x3ba59: 0x6e37c420, 0x3ba5a: 0x6e37c620, 0x3ba5b: 0x6e37c820, + 0x3ba5c: 0x6e37ca20, 0x3ba5d: 0x6e37cc20, 0x3ba5e: 0x6e37ce20, 0x3ba5f: 0x6e37d020, + 0x3ba60: 0x6e37d220, 0x3ba61: 0x6e37d420, 0x3ba62: 0x6e37d620, 0x3ba63: 0x6e37d820, + 0x3ba64: 0x6e37da20, 0x3ba65: 0x6e37dc20, 0x3ba66: 0x6e37de20, 0x3ba67: 0x6e37e020, + 0x3ba68: 0x6e37e220, 0x3ba69: 0x6e3c5a20, 0x3ba6a: 0x6e3c5c20, 0x3ba6b: 0x6e3c5e20, + 0x3ba6c: 0x6e3c6020, 0x3ba6d: 0x6e3c6220, 0x3ba6e: 0x6e3c6420, 0x3ba6f: 0x6e3c6620, + 0x3ba70: 0x6e3c6820, 0x3ba71: 0x6e3c6a20, 0x3ba72: 0x6e3c6c20, 0x3ba73: 0x6e3c6e20, + 0x3ba74: 0x6e3fca20, 0x3ba75: 0x6e3fcc20, 0x3ba76: 0x6e3fce20, 0x3ba77: 0x6e3fd020, + 0x3ba78: 0x6e3fd220, 0x3ba79: 0x6e423620, 0x3ba7a: 0x6e423820, 0x3ba7b: 0x6e423a20, + 0x3ba7c: 0x6e423c20, 0x3ba7d: 0x6e423e20, 0x3ba7e: 0x6e424020, 0x3ba7f: 0x6e43f620, + // Block 0xeea, offset 0x3ba80 + 0x3ba80: 0x6e43f820, 0x3ba81: 0x6e43fa20, 0x3ba82: 0x6e43fc20, 0x3ba83: 0x6e450020, + 0x3ba84: 0x6e450220, 0x3ba85: 0x6e45a220, 0x3ba86: 0x6e45a420, 0x3ba87: 0x6e466a20, + 0x3ba88: 0x6e466c20, 0x3ba89: 0x6e471c20, 0x3ba8a: 0x6e472a20, 0x3ba8b: 0x6ddf8a20, + 0x3ba8c: 0x6e0b8a20, 0x3ba8d: 0x6e1b6020, 0x3ba8e: 0x6e1b6220, 0x3ba8f: 0x6e1b6420, + 0x3ba90: 0x6e310a20, 0x3ba91: 0x6d477a20, 0x3ba92: 0x6d759c20, 0x3ba93: 0x6d759e20, + 0x3ba94: 0x6dc1ea20, 0x3ba95: 0x6dc1ec20, 0x3ba96: 0x6dc1ee20, 0x3ba97: 0x6dc1f020, + 0x3ba98: 0x6dc1f220, 0x3ba99: 0x6dc1f420, 0x3ba9a: 0x6ddf9420, 0x3ba9b: 0x6ddf9620, + 0x3ba9c: 0x6ddf9820, 0x3ba9d: 0x6ddf9a20, 0x3ba9e: 0x6ddf9c20, 0x3ba9f: 0x6ddf9e20, + 0x3baa0: 0x6ddfa020, 0x3baa1: 0x6df7e820, 0x3baa2: 0x6df7ea20, 0x3baa3: 0x6df7ec20, + 0x3baa4: 0x6df7ee20, 0x3baa5: 0x6df7f020, 0x3baa6: 0x6df7f220, 0x3baa7: 0x6e0b8c20, + 0x3baa8: 0x6e0b8e20, 0x3baa9: 0x6e0b9020, 0x3baaa: 0x6e0b9220, 0x3baab: 0x6e0b9420, + 0x3baac: 0x6e1b6820, 0x3baad: 0x6e1b6a20, 0x3baae: 0x6e27b020, 0x3baaf: 0x6e27b220, + 0x3bab0: 0x6e27b420, 0x3bab1: 0x6e27b620, 0x3bab2: 0x6e27b820, 0x3bab3: 0x6e27ba20, + 0x3bab4: 0x6e27bc20, 0x3bab5: 0x6e27be20, 0x3bab6: 0x6e27c020, 0x3bab7: 0x6e311020, + 0x3bab8: 0x6e311220, 0x3bab9: 0x6e37e620, 0x3baba: 0x6e3c7420, 0x3babb: 0x6e3cd420, + 0x3babc: 0x6e3fd620, 0x3babd: 0x6e3c7620, 0x3babe: 0x6e3fd820, 0x3babf: 0x6e424220, + // Block 0xeeb, offset 0x3bac0 + 0x3bac0: 0x6e424420, 0x3bac1: 0x6e43fe20, 0x3bac2: 0x6ce8c220, 0x3bac3: 0x6d477c20, + 0x3bac4: 0x6d75a620, 0x3bac5: 0x6d75a820, 0x3bac6: 0x6d75aa20, 0x3bac7: 0x6d9f7a20, + 0x3bac8: 0x6ddfa220, 0x3bac9: 0x6e27c220, 0x3baca: 0x6e424620, 0x3bacb: 0x6d9f7c20, + 0x3bacc: 0x6d9f7e20, 0x3bacd: 0x6dc1fa20, 0x3bace: 0x6dc1fc20, 0x3bacf: 0x6dc1fe20, + 0x3bad0: 0x6ddfae20, 0x3bad1: 0x6ddfb020, 0x3bad2: 0x6ddfb220, 0x3bad3: 0x6ddfb420, + 0x3bad4: 0x6df7fa20, 0x3bad5: 0x6df7fc20, 0x3bad6: 0x6df7fe20, 0x3bad7: 0x6df80020, + 0x3bad8: 0x6df80220, 0x3bad9: 0x6df80420, 0x3bada: 0x6df80620, 0x3badb: 0x6df80820, + 0x3badc: 0x6e0b9820, 0x3badd: 0x6e0b9a20, 0x3bade: 0x6e0b9c20, 0x3badf: 0x6e0b9e20, + 0x3bae0: 0x6e0ba020, 0x3bae1: 0x6e0ba220, 0x3bae2: 0x6e1b7620, 0x3bae3: 0x6e1b7820, + 0x3bae4: 0x6e1b7a20, 0x3bae5: 0x6e1b7c20, 0x3bae6: 0x6e27c620, 0x3bae7: 0x6e27c820, + 0x3bae8: 0x6e27ca20, 0x3bae9: 0x6e27cc20, 0x3baea: 0x6e27ce20, 0x3baeb: 0x6e27d020, + 0x3baec: 0x6e27d220, 0x3baed: 0x6e27d420, 0x3baee: 0x6e311620, 0x3baef: 0x6e37ee20, + 0x3baf0: 0x6e37f020, 0x3baf1: 0x6e37f220, 0x3baf2: 0x6e37f420, 0x3baf3: 0x6e3c8220, + 0x3baf4: 0x6e3c8420, 0x3baf5: 0x6e3fdc20, 0x3baf6: 0x6e424820, 0x3baf7: 0x6e450620, + 0x3baf8: 0x6d75ae20, 0x3baf9: 0x6d75b020, 0x3bafa: 0x6d9f8220, 0x3bafb: 0x6d9f8420, + 0x3bafc: 0x6d9f8620, 0x3bafd: 0x6dc20820, 0x3bafe: 0x6dc20a20, 0x3baff: 0x6dc20c20, + // Block 0xeec, offset 0x3bb00 + 0x3bb00: 0x6dc20e20, 0x3bb01: 0x6dc21020, 0x3bb02: 0x6dc21220, 0x3bb03: 0x6dc21420, + 0x3bb04: 0x6dc21620, 0x3bb05: 0x6dc21820, 0x3bb06: 0x6dc21a20, 0x3bb07: 0x6dc21c20, + 0x3bb08: 0x6dc21e20, 0x3bb09: 0x6ddfc820, 0x3bb0a: 0x6ddfca20, 0x3bb0b: 0x6ddfcc20, + 0x3bb0c: 0x6ddfce20, 0x3bb0d: 0x6ddfd020, 0x3bb0e: 0x6ddfd220, 0x3bb0f: 0x6ddfd420, + 0x3bb10: 0x6ddfd620, 0x3bb11: 0x6ddfd820, 0x3bb12: 0x6df80e20, 0x3bb13: 0x6df81020, + 0x3bb14: 0x6df81220, 0x3bb15: 0x6df81420, 0x3bb16: 0x6df81620, 0x3bb17: 0x6df81820, + 0x3bb18: 0x6df81a20, 0x3bb19: 0x6df81c20, 0x3bb1a: 0x6e0baa20, 0x3bb1b: 0x6e0bac20, + 0x3bb1c: 0x6e0bae20, 0x3bb1d: 0x6e0bb020, 0x3bb1e: 0x6e0bb220, 0x3bb1f: 0x6df81e20, + 0x3bb20: 0x6e0bb420, 0x3bb21: 0x6e0bb620, 0x3bb22: 0x6e0bb820, 0x3bb23: 0x6e0bba20, + 0x3bb24: 0x6e0bbc20, 0x3bb25: 0x6e0bbe20, 0x3bb26: 0x6e0bc020, 0x3bb27: 0x6e0bc220, + 0x3bb28: 0x6e1b8220, 0x3bb29: 0x6e1b8420, 0x3bb2a: 0x6e1b8620, 0x3bb2b: 0x6e27e020, + 0x3bb2c: 0x6e27e220, 0x3bb2d: 0x6e27e420, 0x3bb2e: 0x6e27e620, 0x3bb2f: 0x6e27e820, + 0x3bb30: 0x6e27ea20, 0x3bb31: 0x6e27ec20, 0x3bb32: 0x6e27ee20, 0x3bb33: 0x6e27f020, + 0x3bb34: 0x6e27f220, 0x3bb35: 0x6e312420, 0x3bb36: 0x6e312620, 0x3bb37: 0x6e312820, + 0x3bb38: 0x6e312a20, 0x3bb39: 0x6e312c20, 0x3bb3a: 0x6e312e20, 0x3bb3b: 0x6e313020, + 0x3bb3c: 0x6e313220, 0x3bb3d: 0x6e313420, 0x3bb3e: 0x6e313620, 0x3bb3f: 0x6e380420, + // Block 0xeed, offset 0x3bb40 + 0x3bb40: 0x6e37f620, 0x3bb41: 0x6e37f820, 0x3bb42: 0x6e37fa20, 0x3bb43: 0x6e37fc20, + 0x3bb44: 0x6e37fe20, 0x3bb45: 0x6e3c8620, 0x3bb46: 0x6e3c8820, 0x3bb47: 0x6e3c8a20, + 0x3bb48: 0x6e3c8c20, 0x3bb49: 0x6e3c8e20, 0x3bb4a: 0x6e3fde20, 0x3bb4b: 0x6e424a20, + 0x3bb4c: 0x6e450820, 0x3bb4d: 0x6e450a20, 0x3bb4e: 0x6e45a620, 0x3bb4f: 0x6e461420, + 0x3bb50: 0x6d75b220, 0x3bb51: 0x6d9f8c20, 0x3bb52: 0x6d9f8e20, 0x3bb53: 0x6dc22420, + 0x3bb54: 0x6dc22620, 0x3bb55: 0x6ddfe020, 0x3bb56: 0x6ddfe220, 0x3bb57: 0x6ddfe420, + 0x3bb58: 0x6ddfe620, 0x3bb59: 0x6ddfe820, 0x3bb5a: 0x6df82620, 0x3bb5b: 0x6df82820, + 0x3bb5c: 0x6df82a20, 0x3bb5d: 0x6df82c20, 0x3bb5e: 0x6df82e20, 0x3bb5f: 0x6df83020, + 0x3bb60: 0x6df83220, 0x3bb61: 0x6e0bc820, 0x3bb62: 0x6e0bca20, 0x3bb63: 0x6e0bcc20, + 0x3bb64: 0x6e0bce20, 0x3bb65: 0x6e1b8a20, 0x3bb66: 0x6e1b8c20, 0x3bb67: 0x6e1b8e20, + 0x3bb68: 0x6e1b9020, 0x3bb69: 0x6e1b9220, 0x3bb6a: 0x6e1b9420, 0x3bb6b: 0x6e1b9620, + 0x3bb6c: 0x6e1b9820, 0x3bb6d: 0x6e27f620, 0x3bb6e: 0x6e27f820, 0x3bb6f: 0x6e313c20, + 0x3bb70: 0x6e313e20, 0x3bb71: 0x6e314020, 0x3bb72: 0x6e314220, 0x3bb73: 0x6e380620, + 0x3bb74: 0x6e380820, 0x3bb75: 0x6e380a20, 0x3bb76: 0x6e3c9420, 0x3bb77: 0x6e3c9620, + 0x3bb78: 0x6e3c9820, 0x3bb79: 0x6e3c9a20, 0x3bb7a: 0x6e3c9c20, 0x3bb7b: 0x6e3fe020, + 0x3bb7c: 0x6e3fe220, 0x3bb7d: 0x6e3fe420, 0x3bb7e: 0x6e425020, 0x3bb7f: 0x6e425220, + // Block 0xeee, offset 0x3bb80 + 0x3bb80: 0x6e425420, 0x3bb81: 0x6e45aa20, 0x3bb82: 0x6e461620, 0x3bb83: 0x6e466e20, + 0x3bb84: 0x6d478420, 0x3bb85: 0x6d9f9020, 0x3bb86: 0x6dc22e20, 0x3bb87: 0x6ddff020, + 0x3bb88: 0x6ddff220, 0x3bb89: 0x6df83620, 0x3bb8a: 0x6df83820, 0x3bb8b: 0x6e0bd020, + 0x3bb8c: 0x6e0bd220, 0x3bb8d: 0x6e27fa20, 0x3bb8e: 0x6e1b9c20, 0x3bb8f: 0x6e3c9e20, + 0x3bb90: 0x6e3ca020, 0x3bb91: 0x6e3ca220, 0x3bb92: 0x6e440220, 0x3bb93: 0x6e45ac20, + 0x3bb94: 0x6dc23220, 0x3bb95: 0x6dc23420, 0x3bb96: 0x6dc23620, 0x3bb97: 0x6dc23820, + 0x3bb98: 0x6ddff820, 0x3bb99: 0x6ddffa20, 0x3bb9a: 0x6ddffc20, 0x3bb9b: 0x6df84420, + 0x3bb9c: 0x6df84620, 0x3bb9d: 0x6df84820, 0x3bb9e: 0x6df84a20, 0x3bb9f: 0x6df84c20, + 0x3bba0: 0x6df84e20, 0x3bba1: 0x6df85020, 0x3bba2: 0x6df85220, 0x3bba3: 0x6df85420, + 0x3bba4: 0x6df85620, 0x3bba5: 0x6e0bee20, 0x3bba6: 0x6e0bf020, 0x3bba7: 0x6e0bf220, + 0x3bba8: 0x6e0bf420, 0x3bba9: 0x6e0bf620, 0x3bbaa: 0x6e0bf820, 0x3bbab: 0x6e0bfa20, + 0x3bbac: 0x6e0bfc20, 0x3bbad: 0x6e0bfe20, 0x3bbae: 0x6e0c0020, 0x3bbaf: 0x6e0c0220, + 0x3bbb0: 0x6e0c0420, 0x3bbb1: 0x6e0c0620, 0x3bbb2: 0x6e0c0820, 0x3bbb3: 0x6e0c0a20, + 0x3bbb4: 0x6e0c0c20, 0x3bbb5: 0x6e0c0e20, 0x3bbb6: 0x6e0c1020, 0x3bbb7: 0x6e1bb020, + 0x3bbb8: 0x6e1bb220, 0x3bbb9: 0x6e1bb420, 0x3bbba: 0x6e1bb620, 0x3bbbb: 0x6e1bb820, + 0x3bbbc: 0x6e1bba20, 0x3bbbd: 0x6e1bbc20, 0x3bbbe: 0x6e1bbe20, 0x3bbbf: 0x6e1bc020, + // Block 0xeef, offset 0x3bbc0 + 0x3bbc0: 0x6e1bc220, 0x3bbc1: 0x6e1bc420, 0x3bbc2: 0x6e1bc620, 0x3bbc3: 0x6e1bc820, + 0x3bbc4: 0x6e1bca20, 0x3bbc5: 0x6e1bcc20, 0x3bbc6: 0x6e1bce20, 0x3bbc7: 0x6e1bd020, + 0x3bbc8: 0x6e1bd220, 0x3bbc9: 0x6e1bd420, 0x3bbca: 0x6e1bd620, 0x3bbcb: 0x6e1bd820, + 0x3bbcc: 0x6e1bda20, 0x3bbcd: 0x6e1bdc20, 0x3bbce: 0x6e280620, 0x3bbcf: 0x6e280820, + 0x3bbd0: 0x6e280a20, 0x3bbd1: 0x6e280c20, 0x3bbd2: 0x6e280e20, 0x3bbd3: 0x6e281020, + 0x3bbd4: 0x6e281220, 0x3bbd5: 0x6e281420, 0x3bbd6: 0x6e281620, 0x3bbd7: 0x6e281820, + 0x3bbd8: 0x6e281a20, 0x3bbd9: 0x6e281c20, 0x3bbda: 0x6e281e20, 0x3bbdb: 0x6e282020, + 0x3bbdc: 0x6e282220, 0x3bbdd: 0x6e282420, 0x3bbde: 0x6e282620, 0x3bbdf: 0x6e282820, + 0x3bbe0: 0x6e282a20, 0x3bbe1: 0x6e282c20, 0x3bbe2: 0x6e282e20, 0x3bbe3: 0x6e283020, + 0x3bbe4: 0x6e283220, 0x3bbe5: 0x6e315420, 0x3bbe6: 0x6e315620, 0x3bbe7: 0x6e315820, + 0x3bbe8: 0x6e315a20, 0x3bbe9: 0x6e315c20, 0x3bbea: 0x6e315e20, 0x3bbeb: 0x6e316020, + 0x3bbec: 0x6e316220, 0x3bbed: 0x6e316420, 0x3bbee: 0x6e316620, 0x3bbef: 0x6e316820, + 0x3bbf0: 0x6e316a20, 0x3bbf1: 0x6e316c20, 0x3bbf2: 0x6e316e20, 0x3bbf3: 0x6e317020, + 0x3bbf4: 0x6e317220, 0x3bbf5: 0x6e317420, 0x3bbf6: 0x6e317620, 0x3bbf7: 0x6e317820, + 0x3bbf8: 0x6e317a20, 0x3bbf9: 0x6e381e20, 0x3bbfa: 0x6e382020, 0x3bbfb: 0x6e382220, + 0x3bbfc: 0x6e382420, 0x3bbfd: 0x6e382620, 0x3bbfe: 0x6e382820, 0x3bbff: 0x6e382a20, + // Block 0xef0, offset 0x3bc00 + 0x3bc00: 0x6e382c20, 0x3bc01: 0x6e382e20, 0x3bc02: 0x6e383020, 0x3bc03: 0x6e383220, + 0x3bc04: 0x6e383420, 0x3bc05: 0x6e383620, 0x3bc06: 0x6e383820, 0x3bc07: 0x6e383a20, + 0x3bc08: 0x6e383c20, 0x3bc09: 0x6e3cb020, 0x3bc0a: 0x6e3cb220, 0x3bc0b: 0x6e3cb420, + 0x3bc0c: 0x6e3cb620, 0x3bc0d: 0x6e3cb820, 0x3bc0e: 0x6e3cba20, 0x3bc0f: 0x6e3cbc20, + 0x3bc10: 0x6e3cbe20, 0x3bc11: 0x6e3cc020, 0x3bc12: 0x6e3cc220, 0x3bc13: 0x6e3cc420, + 0x3bc14: 0x6e3cc620, 0x3bc15: 0x6e3cc820, 0x3bc16: 0x6e3cca20, 0x3bc17: 0x6e3ccc20, + 0x3bc18: 0x6e3cce20, 0x3bc19: 0x6e3cd020, 0x3bc1a: 0x6e3fea20, 0x3bc1b: 0x6e3fec20, + 0x3bc1c: 0x6e3fee20, 0x3bc1d: 0x6e3ff020, 0x3bc1e: 0x6e3ff220, 0x3bc1f: 0x6e3ff420, + 0x3bc20: 0x6e3ff620, 0x3bc21: 0x6e3ff820, 0x3bc22: 0x6e3ffa20, 0x3bc23: 0x6e425820, + 0x3bc24: 0x6e425a20, 0x3bc25: 0x6e425c20, 0x3bc26: 0x6e425e20, 0x3bc27: 0x6e426020, + 0x3bc28: 0x6e426220, 0x3bc29: 0x6e426420, 0x3bc2a: 0x6e426620, 0x3bc2b: 0x6e426820, + 0x3bc2c: 0x6e426a20, 0x3bc2d: 0x6e426c20, 0x3bc2e: 0x6e426e20, 0x3bc2f: 0x6e427020, + 0x3bc30: 0x6e440a20, 0x3bc31: 0x6e440c20, 0x3bc32: 0x6e440e20, 0x3bc33: 0x6e441020, + 0x3bc34: 0x6e441220, 0x3bc35: 0x6e441420, 0x3bc36: 0x6e451020, 0x3bc37: 0x6e45ae20, + 0x3bc38: 0x6e45b020, 0x3bc39: 0x6e45b220, 0x3bc3a: 0x6e45b420, 0x3bc3b: 0x6e45b620, + 0x3bc3c: 0x6e45b820, 0x3bc3d: 0x6e461820, 0x3bc3e: 0x6e461a20, 0x3bc3f: 0x6e461c20, + // Block 0xef1, offset 0x3bc40 + 0x3bc40: 0x6e461e20, 0x3bc41: 0x6e467020, 0x3bc42: 0x6e467220, 0x3bc43: 0x6e467420, + 0x3bc44: 0x6e467620, 0x3bc45: 0x6e46a620, 0x3bc46: 0x6e46be20, 0x3bc47: 0x6e46c020, + 0x3bc48: 0x6e46c220, 0x3bc49: 0x6e46c420, 0x3bc4a: 0x6e46de20, 0x3bc4b: 0x6e46e020, + 0x3bc4c: 0x6e46fe20, 0x3bc4d: 0x6e472620, 0x3bc4e: 0x6e472820, 0x3bc4f: 0x6d478a20, + 0x3bc50: 0x6d9f9420, 0x3bc51: 0x6df85c20, 0x3bc52: 0x6df85e20, 0x3bc53: 0x6df86020, + 0x3bc54: 0x6df86220, 0x3bc55: 0x6e0c1420, 0x3bc56: 0x6e0c1620, 0x3bc57: 0x6e0c1820, + 0x3bc58: 0x6e0c1a20, 0x3bc59: 0x6e1be420, 0x3bc5a: 0x6e0c1c20, 0x3bc5b: 0x6e0c1e20, + 0x3bc5c: 0x6e283e20, 0x3bc5d: 0x6e284020, 0x3bc5e: 0x6e284220, 0x3bc5f: 0x6e284420, + 0x3bc60: 0x6e317c20, 0x3bc61: 0x6e317e20, 0x3bc62: 0x6e3cd220, 0x3bc63: 0x6e427420, + 0x3bc64: 0x6e427620, 0x3bc65: 0x6e474220, 0x3bc66: 0x6d9fa020, 0x3bc67: 0x6e1bec20, + 0x3bc68: 0x6de00220, 0x3bc69: 0x6df86620, 0x3bc6a: 0x6df86820, 0x3bc6b: 0x6e0c2620, + 0x3bc6c: 0x6e0c2820, 0x3bc6d: 0x6e0c2a20, 0x3bc6e: 0x6e0c2c20, 0x3bc6f: 0x6e0c2e20, + 0x3bc70: 0x6e0c3020, 0x3bc71: 0x6e0c3220, 0x3bc72: 0x6e0c3420, 0x3bc73: 0x6e0c3620, + 0x3bc74: 0x6e0c3820, 0x3bc75: 0x6e0c3a20, 0x3bc76: 0x6e1bee20, 0x3bc77: 0x6e1bf020, + 0x3bc78: 0x6e1bf220, 0x3bc79: 0x6e1bf420, 0x3bc7a: 0x6e1bf620, 0x3bc7b: 0x6e1bf820, + 0x3bc7c: 0x6e1bfa20, 0x3bc7d: 0x6e1bfc20, 0x3bc7e: 0x6e318220, 0x3bc7f: 0x6e318420, + // Block 0xef2, offset 0x3bc80 + 0x3bc80: 0x6e384020, 0x3bc81: 0x6e3cd620, 0x3bc82: 0x6e427820, 0x3bc83: 0x6e427a20, + 0x3bc84: 0x6e427c20, 0x3bc85: 0x6e441820, 0x3bc86: 0x6e441a20, 0x3bc87: 0x6e45ba20, + 0x3bc88: 0x6e46aa20, 0x3bc89: 0x6d9fa220, 0x3bc8a: 0x6e1c0220, 0x3bc8b: 0x6e3cdc20, + 0x3bc8c: 0x6e3cde20, 0x3bc8d: 0x6e3ce020, 0x3bc8e: 0x6e400020, 0x3bc8f: 0x6e400220, + 0x3bc90: 0x6e400420, 0x3bc91: 0x6e400620, 0x3bc92: 0x6e428020, 0x3bc93: 0x6e441e20, + 0x3bc94: 0x6e462020, 0x3bc95: 0x6e46ac20, 0x3bc96: 0x6e471220, + // Block 0xef3, offset 0x3bcc0 + 0x3bcc0: 0x6c00f020, 0x3bcc1: 0x6c00f220, 0x3bcc2: 0x6c023420, 0x3bcc3: 0x6c28c220, + 0x3bcc4: 0x6c42f420, 0x3bcc5: 0x6c63d620, 0x3bcc6: 0x6c8afa20, 0x3bcc7: 0x6d75d220, + 0x3bcc8: 0x6c024020, 0x3bcc9: 0x6c42fe20, 0x3bcca: 0x6c004c20, 0x3bccb: 0x6c28ce20, + 0x3bccc: 0x6c0b0c20, 0x3bccd: 0x6c430820, 0x3bcce: 0x6c63ee20, 0x3bccf: 0x6c63f020, + 0x3bcd0: 0x6c05ae20, 0x3bcd1: 0x6c0b3620, 0x3bcd2: 0x6c161c20, 0x3bcd3: 0x6c161e20, + 0x3bcd4: 0x6c28f020, 0x3bcd5: 0x6c432a20, 0x3bcd6: 0x6c63fe20, 0x3bcd7: 0x6c640020, + 0x3bcd8: 0x6c8b2020, 0x3bcd9: 0x6cb7b620, 0x3bcda: 0x6cb7b820, 0x3bcdb: 0x6ce8dc20, + 0x3bcdc: 0x6c162820, 0x3bcdd: 0x6cb7bc20, 0x3bcde: 0x6d18a820, 0x3bcdf: 0x6d479c20, + 0x3bce0: 0x6c05b420, 0x3bce1: 0x6c05b620, 0x3bce2: 0x6c164420, 0x3bce3: 0x6c8b3c20, + 0x3bce4: 0x6cb7d620, 0x3bce5: 0x6d47b020, 0x3bce6: 0x6de00c20, 0x3bce7: 0x6c02c420, + 0x3bce8: 0x6c0c3c20, 0x3bce9: 0x6c0c3e20, 0x3bcea: 0x6c0c4020, 0x3bceb: 0x6c0c4220, + 0x3bcec: 0x6c172220, 0x3bced: 0x6c172420, 0x3bcee: 0x6c172620, 0x3bcef: 0x6c172820, + 0x3bcf0: 0x6c172a20, 0x3bcf1: 0x6c172c20, 0x3bcf2: 0x6c172e20, 0x3bcf3: 0x6c173020, + 0x3bcf4: 0x6c173220, 0x3bcf5: 0x6c2a1c20, 0x3bcf6: 0x6c2a1e20, 0x3bcf7: 0x6c2a2020, + 0x3bcf8: 0x6c2a2220, 0x3bcf9: 0x6c2a2420, 0x3bcfa: 0x6c2a2620, 0x3bcfb: 0x6c444a20, + 0x3bcfc: 0x6c444c20, 0x3bcfd: 0x6c444e20, 0x3bcfe: 0x6c445020, 0x3bcff: 0x6c445220, + // Block 0xef4, offset 0x3bd00 + 0x3bd00: 0x6c445420, 0x3bd01: 0x6c445620, 0x3bd02: 0x6c445820, 0x3bd03: 0x6c655c20, + 0x3bd04: 0x6c655e20, 0x3bd05: 0x6c656020, 0x3bd06: 0x6c656220, 0x3bd07: 0x6c656420, + 0x3bd08: 0x6c656620, 0x3bd09: 0x6c656820, 0x3bd0a: 0x6c656a20, 0x3bd0b: 0x6c8c4e20, + 0x3bd0c: 0x6c8c5020, 0x3bd0d: 0x6c8c5220, 0x3bd0e: 0x6c8c5420, 0x3bd0f: 0x6c8c5620, + 0x3bd10: 0x6c8c5820, 0x3bd11: 0x6c8c5a20, 0x3bd12: 0x6c8c5c20, 0x3bd13: 0x6c8c5e20, + 0x3bd14: 0x6c8c6020, 0x3bd15: 0x6c8c6220, 0x3bd16: 0x6cb8b220, 0x3bd17: 0x6cb8b420, + 0x3bd18: 0x6cb8b620, 0x3bd19: 0x6cb8b820, 0x3bd1a: 0x6cb8ba20, 0x3bd1b: 0x6cb8bc20, + 0x3bd1c: 0x6cb8be20, 0x3bd1d: 0x6cb8c020, 0x3bd1e: 0x6cb8c220, 0x3bd1f: 0x6cb8c420, + 0x3bd20: 0x6ce9d620, 0x3bd21: 0x6ce9d820, 0x3bd22: 0x6ce9da20, 0x3bd23: 0x6ce9dc20, + 0x3bd24: 0x6ce9de20, 0x3bd25: 0x6d19a820, 0x3bd26: 0x6d19aa20, 0x3bd27: 0x6d19ac20, + 0x3bd28: 0x6d19ae20, 0x3bd29: 0x6d19b020, 0x3bd2a: 0x6d19b220, 0x3bd2b: 0x6d485020, + 0x3bd2c: 0x6d485220, 0x3bd2d: 0x6d485420, 0x3bd2e: 0x6d485620, 0x3bd2f: 0x6d485820, + 0x3bd30: 0x6d765e20, 0x3bd31: 0x6d766020, 0x3bd32: 0x6d766220, 0x3bd33: 0x6d766420, + 0x3bd34: 0x6d9ffc20, 0x3bd35: 0x6d9ffe20, 0x3bd36: 0x6da00020, 0x3bd37: 0x6dc28620, + 0x3bd38: 0x6dc28820, 0x3bd39: 0x6dc28a20, 0x3bd3a: 0x6de03c20, 0x3bd3b: 0x6de03e20, + 0x3bd3c: 0x6de04020, 0x3bd3d: 0x6df88c20, 0x3bd3e: 0x6e0c6220, 0x3bd3f: 0x6c2a4a20, + // Block 0xef5, offset 0x3bd40 + 0x3bd40: 0x6c446820, 0x3bd41: 0x6c658420, 0x3bd42: 0x6ce9ea20, 0x3bd43: 0x6d486a20, + 0x3bd44: 0x6d486c20, 0x3bd45: 0x6d486e20, 0x3bd46: 0x6de04620, 0x3bd47: 0x6c658e20, + 0x3bd48: 0x6c0c7620, 0x3bd49: 0x6cb8f020, 0x3bd4a: 0x6cea0620, 0x3bd4b: 0x6d19da20, + 0x3bd4c: 0x6d487020, 0x3bd4d: 0x6d768220, 0x3bd4e: 0x6c177e20, 0x3bd4f: 0x6c178a20, + 0x3bd50: 0x6c178c20, 0x3bd51: 0x6c2a7220, 0x3bd52: 0x6c65c020, 0x3bd53: 0x6c8c9420, + 0x3bd54: 0x6cb90a20, 0x3bd55: 0x6d19e820, 0x3bd56: 0x6c065820, 0x3bd57: 0x6c0cb220, + 0x3bd58: 0x6c0cb420, 0x3bd59: 0x6c0cb620, 0x3bd5a: 0x6c0cb820, 0x3bd5b: 0x6c17b220, + 0x3bd5c: 0x6c17b420, 0x3bd5d: 0x6c17b620, 0x3bd5e: 0x6c2a9620, 0x3bd5f: 0x6c44ca20, + 0x3bd60: 0x6c44cc20, 0x3bd61: 0x6c44ce20, 0x3bd62: 0x6c65f820, 0x3bd63: 0x6c65fa20, + 0x3bd64: 0x6c65fc20, 0x3bd65: 0x6c65fe20, 0x3bd66: 0x6c8cb620, 0x3bd67: 0x6c8cb820, + 0x3bd68: 0x6c8cba20, 0x3bd69: 0x6cb92c20, 0x3bd6a: 0x6cb92e20, 0x3bd6b: 0x6cea2a20, + 0x3bd6c: 0x6cea2c20, 0x3bd6d: 0x6d19fc20, 0x3bd6e: 0x6d489020, 0x3bd6f: 0x6d769820, + 0x3bd70: 0x6df8a020, 0x3bd71: 0x6c0cd020, 0x3bd72: 0x6c17ce20, 0x3bd73: 0x6c660a20, + 0x3bd74: 0x6c8cce20, 0x3bd75: 0x6cea3620, 0x3bd76: 0x6c067a20, 0x3bd77: 0x6c2aba20, + 0x3bd78: 0x6c661020, 0x3bd79: 0x6cb94420, 0x3bd7a: 0x6cea3820, 0x3bd7b: 0x6cea3a20, + 0x3bd7c: 0x6dc2b420, 0x3bd7d: 0x6de05420, 0x3bd7e: 0x6c0d3420, 0x3bd7f: 0x6c0d3620, + // Block 0xef6, offset 0x3bd80 + 0x3bd80: 0x6c0d3820, 0x3bd81: 0x6c183420, 0x3bd82: 0x6c183620, 0x3bd83: 0x6c2b4420, + 0x3bd84: 0x6c2b4620, 0x3bd85: 0x6c2b4820, 0x3bd86: 0x6c454820, 0x3bd87: 0x6c454a20, + 0x3bd88: 0x6c66a220, 0x3bd89: 0x6c66a420, 0x3bd8a: 0x6c8d3a20, 0x3bd8b: 0x6c8d3c20, + 0x3bd8c: 0x6c8d3e20, 0x3bd8d: 0x6c8d4020, 0x3bd8e: 0x6cb9a420, 0x3bd8f: 0x6cb9a620, + 0x3bd90: 0x6cb9a820, 0x3bd91: 0x6cea8c20, 0x3bd92: 0x6cea8e20, 0x3bd93: 0x6cea9020, + 0x3bd94: 0x6d48d820, 0x3bd95: 0x6d76d620, 0x3bd96: 0x6d76d820, 0x3bd97: 0x6c187220, + 0x3bd98: 0x6c187420, 0x3bd99: 0x6c187620, 0x3bd9a: 0x6c2b8220, 0x3bd9b: 0x6c2b8420, + 0x3bd9c: 0x6c458020, 0x3bd9d: 0x6c66d820, 0x3bd9e: 0x6c66da20, 0x3bd9f: 0x6c66dc20, + 0x3bda0: 0x6c8d6820, 0x3bda1: 0x6cb9d020, 0x3bda2: 0x6cb9d220, 0x3bda3: 0x6ceabe20, + 0x3bda4: 0x6d1aa420, 0x3bda5: 0x6d1aa620, 0x3bda6: 0x6d48f020, 0x3bda7: 0x6e0c8220, + 0x3bda8: 0x6c016620, 0x3bda9: 0x6c0d6620, 0x3bdaa: 0x6c459e20, 0x3bdab: 0x6cead020, + 0x3bdac: 0x6c0d7820, 0x3bdad: 0x6c18a020, 0x3bdae: 0x6c18a220, 0x3bdaf: 0x6c45be20, + 0x3bdb0: 0x6c670c20, 0x3bdb1: 0x6d1ac820, 0x3bdb2: 0x6df8c020, 0x3bdb3: 0x6c18bc20, + 0x3bdb4: 0x6c671e20, 0x3bdb5: 0x6c8da620, 0x3bdb6: 0x6ceaf420, 0x3bdb7: 0x6d1ad220, + 0x3bdb8: 0x6d490e20, 0x3bdb9: 0x6d491020, 0x3bdba: 0x6da08220, 0x3bdbb: 0x6dc2de20, + 0x3bdbc: 0x6df8c420, 0x3bdbd: 0x6c037a20, 0x3bdbe: 0x6c18ce20, 0x3bdbf: 0x6c672c20, + // Block 0xef7, offset 0x3bdc0 + 0x3bdc0: 0x6d1ad820, 0x3bdc1: 0x6c2bfe20, 0x3bdc2: 0x6c45f420, 0x3bdc3: 0x6c070820, + 0x3bdc4: 0x6c190020, 0x3bdc5: 0x6c2c2420, 0x3bdc6: 0x6c2c2620, 0x3bdc7: 0x6c462420, + 0x3bdc8: 0x6c462620, 0x3bdc9: 0x6c462820, 0x3bdca: 0x6c462a20, 0x3bdcb: 0x6c676420, + 0x3bdcc: 0x6c676620, 0x3bdcd: 0x6c676820, 0x3bdce: 0x6c676a20, 0x3bdcf: 0x6c8dde20, + 0x3bdd0: 0x6c8de020, 0x3bdd1: 0x6cba2a20, 0x3bdd2: 0x6cba2c20, 0x3bdd3: 0x6ceb1a20, + 0x3bdd4: 0x6ceb1c20, 0x3bdd5: 0x6ceb1e20, 0x3bdd6: 0x6d1b1020, 0x3bdd7: 0x6d1b1220, + 0x3bdd8: 0x6d493620, 0x3bdd9: 0x6d493820, 0x3bdda: 0x6da08c20, 0x3bddb: 0x6df8c820, + 0x3bddc: 0x6c463c20, 0x3bddd: 0x6c677a20, 0x3bdde: 0x6c8dee20, 0x3bddf: 0x6cba4020, + 0x3bde0: 0x6ceb3020, 0x3bde1: 0x6d494220, 0x3bde2: 0x6df8ca20, 0x3bde3: 0x6c03b820, + 0x3bde4: 0x6c03ba20, 0x3bde5: 0x6c0e1a20, 0x3bde6: 0x6c192020, 0x3bde7: 0x6c2c5220, + 0x3bde8: 0x6c2c5420, 0x3bde9: 0x6c466020, 0x3bdea: 0x6c466220, 0x3bdeb: 0x6c679620, + 0x3bdec: 0x6c679820, 0x3bded: 0x6cba5820, 0x3bdee: 0x6cba5a20, 0x3bdef: 0x6ceb4c20, + 0x3bdf0: 0x6d1b3220, 0x3bdf1: 0x6d770a20, 0x3bdf2: 0x6c078620, 0x3bdf3: 0x6c1a4420, + 0x3bdf4: 0x6c1a4620, 0x3bdf5: 0x6c1a4820, 0x3bdf6: 0x6c2d7620, 0x3bdf7: 0x6c2d7820, + 0x3bdf8: 0x6c2d7a20, 0x3bdf9: 0x6c2d7c20, 0x3bdfa: 0x6c47c620, 0x3bdfb: 0x6c47c820, + 0x3bdfc: 0x6c47ca20, 0x3bdfd: 0x6c47cc20, 0x3bdfe: 0x6c47ce20, 0x3bdff: 0x6c47d020, + // Block 0xef8, offset 0x3be00 + 0x3be00: 0x6c47d220, 0x3be01: 0x6c47d420, 0x3be02: 0x6c47d620, 0x3be03: 0x6c47d820, + 0x3be04: 0x6c693820, 0x3be05: 0x6c693a20, 0x3be06: 0x6c693c20, 0x3be07: 0x6c693e20, + 0x3be08: 0x6c694020, 0x3be09: 0x6c694220, 0x3be0a: 0x6c694420, 0x3be0b: 0x6c694620, + 0x3be0c: 0x6c694820, 0x3be0d: 0x6c694a20, 0x3be0e: 0x6c694c20, 0x3be0f: 0x6d770c20, + 0x3be10: 0x6c900020, 0x3be11: 0x6c900220, 0x3be12: 0x6c900420, 0x3be13: 0x6c900620, + 0x3be14: 0x6c900820, 0x3be15: 0x6c900a20, 0x3be16: 0x6c900c20, 0x3be17: 0x6c900e20, + 0x3be18: 0x6c901020, 0x3be19: 0x6c901220, 0x3be1a: 0x6c901420, 0x3be1b: 0x6c901620, + 0x3be1c: 0x6cbc2220, 0x3be1d: 0x6cbc2420, 0x3be1e: 0x6cbc2620, 0x3be1f: 0x6cbc2820, + 0x3be20: 0x6cbc2a20, 0x3be21: 0x6cbc2c20, 0x3be22: 0x6cbc2e20, 0x3be23: 0x6cbc3020, + 0x3be24: 0x6cbc3220, 0x3be25: 0x6cbc3420, 0x3be26: 0x6cbc3620, 0x3be27: 0x6cbc3820, + 0x3be28: 0x6cbc3a20, 0x3be29: 0x6cbc3c20, 0x3be2a: 0x6ced0c20, 0x3be2b: 0x6ced0e20, + 0x3be2c: 0x6ced1020, 0x3be2d: 0x6ced1220, 0x3be2e: 0x6ced1420, 0x3be2f: 0x6ced1620, + 0x3be30: 0x6ced1820, 0x3be31: 0x6ced1a20, 0x3be32: 0x6ced1c20, 0x3be33: 0x6ced1e20, + 0x3be34: 0x6ced2020, 0x3be35: 0x6ced2220, 0x3be36: 0x6ced2420, 0x3be37: 0x6ced2620, + 0x3be38: 0x6d1cd020, 0x3be39: 0x6d1cd220, 0x3be3a: 0x6d1cd420, 0x3be3b: 0x6d1cd620, + 0x3be3c: 0x6d1cd820, 0x3be3d: 0x6d1cda20, 0x3be3e: 0x6d1cdc20, 0x3be3f: 0x6d1cde20, + // Block 0xef9, offset 0x3be40 + 0x3be40: 0x6d1ce020, 0x3be41: 0x6d1ce220, 0x3be42: 0x6d1ce420, 0x3be43: 0x6d1ce620, + 0x3be44: 0x6d1ce820, 0x3be45: 0x6d4aa220, 0x3be46: 0x6d4aa420, 0x3be47: 0x6d4aa620, + 0x3be48: 0x6d4aa820, 0x3be49: 0x6d4aaa20, 0x3be4a: 0x6d4aac20, 0x3be4b: 0x6d4aae20, + 0x3be4c: 0x6d4ab020, 0x3be4d: 0x6d4ab220, 0x3be4e: 0x6d784a20, 0x3be4f: 0x6d784c20, + 0x3be50: 0x6d784e20, 0x3be51: 0x6d785020, 0x3be52: 0x6d785220, 0x3be53: 0x6d785420, + 0x3be54: 0x6d785620, 0x3be55: 0x6da17420, 0x3be56: 0x6da17620, 0x3be57: 0x6da17820, + 0x3be58: 0x6da17a20, 0x3be59: 0x6dc3ce20, 0x3be5a: 0x6dc3d020, 0x3be5b: 0x6dc3d220, + 0x3be5c: 0x6dc3d420, 0x3be5d: 0x6dc3d620, 0x3be5e: 0x6dc3d820, 0x3be5f: 0x6de0f820, + 0x3be60: 0x6de0fa20, 0x3be61: 0x6de0fc20, 0x3be62: 0x6df92220, 0x3be63: 0x6df92420, + 0x3be64: 0x6df92620, 0x3be65: 0x6e1c7020, 0x3be66: 0x6e31be20, 0x3be67: 0x6e31c020, + 0x3be68: 0x6c1a9620, 0x3be69: 0x6c2da820, 0x3be6a: 0x6c47fe20, 0x3be6b: 0x6c697c20, + 0x3be6c: 0x6c904220, 0x3be6d: 0x6c904420, 0x3be6e: 0x6ced4820, 0x3be6f: 0x6d1d1420, + 0x3be70: 0x6d786420, 0x3be71: 0x6c07c020, 0x3be72: 0x6c07c220, 0x3be73: 0x6c0f0420, + 0x3be74: 0x6c0f0620, 0x3be75: 0x6c0f0820, 0x3be76: 0x6c0f0a20, 0x3be77: 0x6c0f0c20, + 0x3be78: 0x6c1b5020, 0x3be79: 0x6c1b5220, 0x3be7a: 0x6c1b5420, 0x3be7b: 0x6c1b5620, + 0x3be7c: 0x6c1b5820, 0x3be7d: 0x6c1b5a20, 0x3be7e: 0x6c1b5c20, 0x3be7f: 0x6c1b5e20, + // Block 0xefa, offset 0x3be80 + 0x3be80: 0x6c1b6020, 0x3be81: 0x6c1b6220, 0x3be82: 0x6c1b6420, 0x3be83: 0x6c2e6e20, + 0x3be84: 0x6c2e7020, 0x3be85: 0x6c2e7220, 0x3be86: 0x6c2e7420, 0x3be87: 0x6c2e7620, + 0x3be88: 0x6c2e7820, 0x3be89: 0x6c2e7a20, 0x3be8a: 0x6c2e7c20, 0x3be8b: 0x6c48d420, + 0x3be8c: 0x6c48d620, 0x3be8d: 0x6c48d820, 0x3be8e: 0x6c48da20, 0x3be8f: 0x6c48dc20, + 0x3be90: 0x6c48de20, 0x3be91: 0x6c48e020, 0x3be92: 0x6c48e220, 0x3be93: 0x6c48e420, + 0x3be94: 0x6c6a4e20, 0x3be95: 0x6c6a5020, 0x3be96: 0x6c6a5220, 0x3be97: 0x6c6a5420, + 0x3be98: 0x6c6a5620, 0x3be99: 0x6c6a5820, 0x3be9a: 0x6c6a5a20, 0x3be9b: 0x6c6a5c20, + 0x3be9c: 0x6c6a5e20, 0x3be9d: 0x6c6a6020, 0x3be9e: 0x6c6a6220, 0x3be9f: 0x6c6a6420, + 0x3bea0: 0x6c6a6620, 0x3bea1: 0x6c6a6820, 0x3bea2: 0x6c6a6a20, 0x3bea3: 0x6c6a6c20, + 0x3bea4: 0x6c914220, 0x3bea5: 0x6c914420, 0x3bea6: 0x6c914620, 0x3bea7: 0x6c914820, + 0x3bea8: 0x6c914a20, 0x3bea9: 0x6c914c20, 0x3beaa: 0x6c914e20, 0x3beab: 0x6c915020, + 0x3beac: 0x6c915220, 0x3bead: 0x6c915420, 0x3beae: 0x6c915620, 0x3beaf: 0x6c915820, + 0x3beb0: 0x6c915a20, 0x3beb1: 0x6c915c20, 0x3beb2: 0x6cbd6c20, 0x3beb3: 0x6cbd6e20, + 0x3beb4: 0x6cbd7020, 0x3beb5: 0x6cbd7220, 0x3beb6: 0x6cbd7420, 0x3beb7: 0x6cbd7620, + 0x3beb8: 0x6cbd7820, 0x3beb9: 0x6cbd7a20, 0x3beba: 0x6cbd7c20, 0x3bebb: 0x6cbd7e20, + 0x3bebc: 0x6cbd8020, 0x3bebd: 0x6cbd8220, 0x3bebe: 0x6cee2e20, 0x3bebf: 0x6cee3020, + // Block 0xefb, offset 0x3bec0 + 0x3bec0: 0x6cee3220, 0x3bec1: 0x6cee3420, 0x3bec2: 0x6cee3620, 0x3bec3: 0x6cee3820, + 0x3bec4: 0x6cee3a20, 0x3bec5: 0x6cee3c20, 0x3bec6: 0x6cee3e20, 0x3bec7: 0x6cee4020, + 0x3bec8: 0x6cee4220, 0x3bec9: 0x6cee4420, 0x3beca: 0x6cee4620, 0x3becb: 0x6cee4820, + 0x3becc: 0x6cee4a20, 0x3becd: 0x6cee4c20, 0x3bece: 0x6d1dda20, 0x3becf: 0x6d1ddc20, + 0x3bed0: 0x6d1dde20, 0x3bed1: 0x6d1de020, 0x3bed2: 0x6d1de220, 0x3bed3: 0x6d1de420, + 0x3bed4: 0x6d1de620, 0x3bed5: 0x6d1de820, 0x3bed6: 0x6d1dea20, 0x3bed7: 0x6d1dec20, + 0x3bed8: 0x6d1dee20, 0x3bed9: 0x6d4b9420, 0x3beda: 0x6d4b9620, 0x3bedb: 0x6d4b9820, + 0x3bedc: 0x6d4b9a20, 0x3bedd: 0x6d4b9c20, 0x3bede: 0x6d4b9e20, 0x3bedf: 0x6d78f020, + 0x3bee0: 0x6d78f220, 0x3bee1: 0x6d78f420, 0x3bee2: 0x6d78f620, 0x3bee3: 0x6d78f820, + 0x3bee4: 0x6d78fa20, 0x3bee5: 0x6d78fc20, 0x3bee6: 0x6da1f420, 0x3bee7: 0x6da1f620, + 0x3bee8: 0x6da1f820, 0x3bee9: 0x6da1fa20, 0x3beea: 0x6da1fc20, 0x3beeb: 0x6da1fe20, + 0x3beec: 0x6dc42820, 0x3beed: 0x6dc42a20, 0x3beee: 0x6dc42c20, 0x3beef: 0x6dc42e20, + 0x3bef0: 0x6de14220, 0x3bef1: 0x6df95020, 0x3bef2: 0x6c6a8020, 0x3bef3: 0x6cee5a20, + 0x3bef4: 0x6e1c8e20, 0x3bef5: 0x6df95420, 0x3bef6: 0x6cee6820, 0x3bef7: 0x6c0f2820, + 0x3bef8: 0x6c2e9820, 0x3bef9: 0x6c490020, 0x3befa: 0x6c6aa820, 0x3befb: 0x6c919620, + 0x3befc: 0x6cbdb420, 0x3befd: 0x6d1e2c20, 0x3befe: 0x6d4bb620, 0x3beff: 0x6d791a20, + // Block 0xefc, offset 0x3bf00 + 0x3bf00: 0x6e1c9020, 0x3bf01: 0x6c03ee20, 0x3bf02: 0x6c07fa20, 0x3bf03: 0x6c0f5420, + 0x3bf04: 0x6c1bbe20, 0x3bf05: 0x6c1bc020, 0x3bf06: 0x6c1bc220, 0x3bf07: 0x6c2ee620, + 0x3bf08: 0x6c2ee820, 0x3bf09: 0x6c2eea20, 0x3bf0a: 0x6c2eec20, 0x3bf0b: 0x6c2eee20, + 0x3bf0c: 0x6c2ef020, 0x3bf0d: 0x6c493620, 0x3bf0e: 0x6c493820, 0x3bf0f: 0x6c493a20, + 0x3bf10: 0x6c6ae220, 0x3bf11: 0x6c6ae420, 0x3bf12: 0x6c6ae620, 0x3bf13: 0x6c91cc20, + 0x3bf14: 0x6c91ce20, 0x3bf15: 0x6c91d020, 0x3bf16: 0x6cbdec20, 0x3bf17: 0x6cbdee20, + 0x3bf18: 0x6cbdf020, 0x3bf19: 0x6ceea020, 0x3bf1a: 0x6ceea220, 0x3bf1b: 0x6ceea420, + 0x3bf1c: 0x6d1e4c20, 0x3bf1d: 0x6d1e4e20, 0x3bf1e: 0x6d1e5020, 0x3bf1f: 0x6d4bd820, + 0x3bf20: 0x6d4bda20, 0x3bf21: 0x6d4bdc20, 0x3bf22: 0x6dc45220, 0x3bf23: 0x6df95a20, + 0x3bf24: 0x6c0fa220, 0x3bf25: 0x6c0fa420, 0x3bf26: 0x6c1c5220, 0x3bf27: 0x6c1c5420, + 0x3bf28: 0x6c1c5620, 0x3bf29: 0x6c1c5820, 0x3bf2a: 0x6c1c5a20, 0x3bf2b: 0x6c1c5c20, + 0x3bf2c: 0x6c1c5e20, 0x3bf2d: 0x6c2fc020, 0x3bf2e: 0x6c2fc220, 0x3bf2f: 0x6c2fc420, + 0x3bf30: 0x6c2fc620, 0x3bf31: 0x6c4a0c20, 0x3bf32: 0x6c4a0e20, 0x3bf33: 0x6c4a1020, + 0x3bf34: 0x6c4a1220, 0x3bf35: 0x6c4a1420, 0x3bf36: 0x6c6bcc20, 0x3bf37: 0x6c6bce20, + 0x3bf38: 0x6c6bd020, 0x3bf39: 0x6c6bd220, 0x3bf3a: 0x6c6bd420, 0x3bf3b: 0x6c92ec20, + 0x3bf3c: 0x6c92ee20, 0x3bf3d: 0x6c92f020, 0x3bf3e: 0x6c92f220, 0x3bf3f: 0x6c92f420, + // Block 0xefd, offset 0x3bf40 + 0x3bf40: 0x6c92f620, 0x3bf41: 0x6c92f820, 0x3bf42: 0x6c92fa20, 0x3bf43: 0x6c92fc20, + 0x3bf44: 0x6c92fe20, 0x3bf45: 0x6c930020, 0x3bf46: 0x6cbf2a20, 0x3bf47: 0x6cbf2c20, + 0x3bf48: 0x6cbf2e20, 0x3bf49: 0x6cbf3020, 0x3bf4a: 0x6cbf3220, 0x3bf4b: 0x6cbf3420, + 0x3bf4c: 0x6cbf3620, 0x3bf4d: 0x6cbf3820, 0x3bf4e: 0x6cbf3a20, 0x3bf4f: 0x6cbf3c20, + 0x3bf50: 0x6cbf3e20, 0x3bf51: 0x6cef6c20, 0x3bf52: 0x6cef6e20, 0x3bf53: 0x6cef7020, + 0x3bf54: 0x6cef7220, 0x3bf55: 0x6cef7420, 0x3bf56: 0x6cef7620, 0x3bf57: 0x6d1f1420, + 0x3bf58: 0x6d1f1620, 0x3bf59: 0x6d1f1820, 0x3bf5a: 0x6d1f1a20, 0x3bf5b: 0x6d1f1c20, + 0x3bf5c: 0x6d1f1e20, 0x3bf5d: 0x6d1f2020, 0x3bf5e: 0x6d1f2220, 0x3bf5f: 0x6d1f2420, + 0x3bf60: 0x6d4ca820, 0x3bf61: 0x6d4caa20, 0x3bf62: 0x6d4cac20, 0x3bf63: 0x6d4cae20, + 0x3bf64: 0x6d4cb020, 0x3bf65: 0x6d4cb220, 0x3bf66: 0x6d79d420, 0x3bf67: 0x6d79d620, + 0x3bf68: 0x6d79d820, 0x3bf69: 0x6d79da20, 0x3bf6a: 0x6d79dc20, 0x3bf6b: 0x6da29420, + 0x3bf6c: 0x6dc48620, 0x3bf6d: 0x6dc48820, 0x3bf6e: 0x6dc48a20, 0x3bf6f: 0x6dc48c20, + 0x3bf70: 0x6de18c20, 0x3bf71: 0x6de18e20, 0x3bf72: 0x6df98420, 0x3bf73: 0x6e0d4020, + 0x3bf74: 0x6e0d4220, 0x3bf75: 0x6e28ae20, 0x3bf76: 0x6c1c7e20, 0x3bf77: 0x6c1c8020, + 0x3bf78: 0x6c1c8220, 0x3bf79: 0x6c1c8420, 0x3bf7a: 0x6c2ff820, 0x3bf7b: 0x6c4a3e20, + 0x3bf7c: 0x6c931c20, 0x3bf7d: 0x6c931e20, 0x3bf7e: 0x6c932020, 0x3bf7f: 0x6cbf6020, + // Block 0xefe, offset 0x3bf80 + 0x3bf80: 0x6d1f3a20, 0x3bf81: 0x6d79fc20, 0x3bf82: 0x6da29c20, 0x3bf83: 0x6da29e20, + 0x3bf84: 0x6e0d4420, 0x3bf85: 0x6c1cb620, 0x3bf86: 0x6c1cb820, 0x3bf87: 0x6c1cba20, + 0x3bf88: 0x6c304020, 0x3bf89: 0x6c304220, 0x3bf8a: 0x6c4a8820, 0x3bf8b: 0x6c4a8a20, + 0x3bf8c: 0x6c4a8c20, 0x3bf8d: 0x6c6c6a20, 0x3bf8e: 0x6c6c6c20, 0x3bf8f: 0x6c6c6e20, + 0x3bf90: 0x6c6c7020, 0x3bf91: 0x6c937c20, 0x3bf92: 0x6c937e20, 0x3bf93: 0x6c938020, + 0x3bf94: 0x6cbfc620, 0x3bf95: 0x6cbfc820, 0x3bf96: 0x6cbfca20, 0x3bf97: 0x6cbfcc20, + 0x3bf98: 0x6cbfce20, 0x3bf99: 0x6cbfd020, 0x3bf9a: 0x6cbfd220, 0x3bf9b: 0x6cefec20, + 0x3bf9c: 0x6cefee20, 0x3bf9d: 0x6ceff020, 0x3bf9e: 0x6ceff220, 0x3bf9f: 0x6ceff420, + 0x3bfa0: 0x6ceff620, 0x3bfa1: 0x6d1fa020, 0x3bfa2: 0x6d1fa220, 0x3bfa3: 0x6d1fa420, + 0x3bfa4: 0x6d1fa620, 0x3bfa5: 0x6d1fa820, 0x3bfa6: 0x6d4d1620, 0x3bfa7: 0x6d4d1820, + 0x3bfa8: 0x6d4d1a20, 0x3bfa9: 0x6d4d1c20, 0x3bfaa: 0x6d4d1e20, 0x3bfab: 0x6d7a2820, + 0x3bfac: 0x6d7a2a20, 0x3bfad: 0x6d7a2c20, 0x3bfae: 0x6d7a2e20, 0x3bfaf: 0x6da2be20, + 0x3bfb0: 0x6dc4b220, 0x3bfb1: 0x6dc4b420, 0x3bfb2: 0x6dc4b620, 0x3bfb3: 0x6df9a220, + 0x3bfb4: 0x6df9a420, 0x3bfb5: 0x6e0d5a20, 0x3bfb6: 0x6e31ee20, 0x3bfb7: 0x6c0fea20, + 0x3bfb8: 0x6c939220, 0x3bfb9: 0x6c939420, 0x3bfba: 0x6cbfe820, 0x3bfbb: 0x6d4d3420, + 0x3bfbc: 0x6d4d3620, 0x3bfbd: 0x6d7a3620, 0x3bfbe: 0x6da2c620, 0x3bfbf: 0x6c1cd420, + // Block 0xeff, offset 0x3bfc0 + 0x3bfc0: 0x6c306820, 0x3bfc1: 0x6c6c9020, 0x3bfc2: 0x6c6c9220, 0x3bfc3: 0x6d1fce20, + 0x3bfc4: 0x6d4d4e20, 0x3bfc5: 0x6d7a4020, 0x3bfc6: 0x6da2d020, 0x3bfc7: 0x6cc01e20, + 0x3bfc8: 0x6cf02c20, 0x3bfc9: 0x6c1d1820, 0x3bfca: 0x6c1d1a20, 0x3bfcb: 0x6c1d1c20, + 0x3bfcc: 0x6c30b020, 0x3bfcd: 0x6c4b0e20, 0x3bfce: 0x6c4b1020, 0x3bfcf: 0x6c6cf020, + 0x3bfd0: 0x6c6cf220, 0x3bfd1: 0x6c940e20, 0x3bfd2: 0x6cf05e20, 0x3bfd3: 0x6cf06020, + 0x3bfd4: 0x6cf06220, 0x3bfd5: 0x6cc05a20, 0x3bfd6: 0x6cc05c20, 0x3bfd7: 0x6cc05e20, + 0x3bfd8: 0x6cc06020, 0x3bfd9: 0x6d1ffc20, 0x3bfda: 0x6d1ffe20, 0x3bfdb: 0x6d4d8820, + 0x3bfdc: 0x6d4d8a20, 0x3bfdd: 0x6d7a5e20, 0x3bfde: 0x6da2e020, 0x3bfdf: 0x6de1cc20, + 0x3bfe0: 0x6de1ce20, 0x3bfe1: 0x6e1cd220, 0x3bfe2: 0x6c108820, 0x3bfe3: 0x6c108a20, + 0x3bfe4: 0x6c108c20, 0x3bfe5: 0x6c108e20, 0x3bfe6: 0x6c1dcc20, 0x3bfe7: 0x6c1dce20, + 0x3bfe8: 0x6c1dd020, 0x3bfe9: 0x6c316e20, 0x3bfea: 0x6c317020, 0x3bfeb: 0x6c317220, + 0x3bfec: 0x6c317420, 0x3bfed: 0x6c317620, 0x3bfee: 0x6c317820, 0x3bfef: 0x6c4bbe20, + 0x3bff0: 0x6c4bc020, 0x3bff1: 0x6c4bc220, 0x3bff2: 0x6c4bc420, 0x3bff3: 0x6c4bc620, + 0x3bff4: 0x6c4bc820, 0x3bff5: 0x6c6dd420, 0x3bff6: 0x6c6dd620, 0x3bff7: 0x6c6dd820, + 0x3bff8: 0x6c6dda20, 0x3bff9: 0x6c6ddc20, 0x3bffa: 0x6c6dde20, 0x3bffb: 0x6c953c20, + 0x3bffc: 0x6c953e20, 0x3bffd: 0x6c954020, 0x3bffe: 0x6c954220, 0x3bfff: 0x6c954420, + // Block 0xf00, offset 0x3c000 + 0x3c000: 0x6c954620, 0x3c001: 0x6c954820, 0x3c002: 0x6cc15e20, 0x3c003: 0x6cc16020, + 0x3c004: 0x6cc16220, 0x3c005: 0x6cc16420, 0x3c006: 0x6cc16620, 0x3c007: 0x6cc16820, + 0x3c008: 0x6cf10820, 0x3c009: 0x6cf10a20, 0x3c00a: 0x6cf10c20, 0x3c00b: 0x6cf10e20, + 0x3c00c: 0x6d20ac20, 0x3c00d: 0x6d20ae20, 0x3c00e: 0x6d20b020, 0x3c00f: 0x6d20b220, + 0x3c010: 0x6d20b420, 0x3c011: 0x6d20b620, 0x3c012: 0x6d20b820, 0x3c013: 0x6d4e4020, + 0x3c014: 0x6d4e4220, 0x3c015: 0x6d4e4420, 0x3c016: 0x6d4e4620, 0x3c017: 0x6d7acc20, + 0x3c018: 0x6d7ace20, 0x3c019: 0x6d7ad020, 0x3c01a: 0x6d7ad220, 0x3c01b: 0x6da34c20, + 0x3c01c: 0x6da34e20, 0x3c01d: 0x6da35020, 0x3c01e: 0x6de20a20, 0x3c01f: 0x6e0d9020, + 0x3c020: 0x6e1cfc20, 0x3c021: 0x6c1ddc20, 0x3c022: 0x6c4bd820, 0x3c023: 0x6c10aa20, + 0x3c024: 0x6c955620, 0x3c025: 0x6cc17620, 0x3c026: 0x6cf11620, 0x3c027: 0x6d20bc20, + 0x3c028: 0x6da35820, 0x3c029: 0x6dc50c20, 0x3c02a: 0x6e1d0220, 0x3c02b: 0x6c319020, + 0x3c02c: 0x6c1de820, 0x3c02d: 0x6cc18420, 0x3c02e: 0x6cc18620, 0x3c02f: 0x6d20be20, + 0x3c030: 0x6d7ae420, 0x3c031: 0x6d7ae620, 0x3c032: 0x6c08b820, 0x3c033: 0x6c6e4c20, + 0x3c034: 0x6c95c220, 0x3c035: 0x6c95c420, 0x3c036: 0x6c95c620, 0x3c037: 0x6c95c820, + 0x3c038: 0x6cc1ec20, 0x3c039: 0x6cc1ee20, 0x3c03a: 0x6cc1f020, 0x3c03b: 0x6d210420, + 0x3c03c: 0x6d4ea620, 0x3c03d: 0x6d7b1820, 0x3c03e: 0x6da37a20, 0x3c03f: 0x6de22a20, + // Block 0xf01, offset 0x3c040 + 0x3c040: 0x6df9e820, 0x3c041: 0x6c1e3820, 0x3c042: 0x6c95ce20, 0x3c043: 0x6c95d020, + 0x3c044: 0x6cc1fa20, 0x3c045: 0x6cf16220, 0x3c046: 0x6cf16420, 0x3c047: 0x6d4eac20, + 0x3c048: 0x6dc51e20, 0x3c049: 0x6de22e20, 0x3c04a: 0x6c10e220, 0x3c04b: 0x6c4c6420, + 0x3c04c: 0x6c1e8020, 0x3c04d: 0x6c1e8220, 0x3c04e: 0x6c323e20, 0x3c04f: 0x6c324020, + 0x3c050: 0x6c4ca820, 0x3c051: 0x6c4caa20, 0x3c052: 0x6c6eae20, 0x3c053: 0x6c6eb020, + 0x3c054: 0x6c6eb220, 0x3c055: 0x6c6eb420, 0x3c056: 0x6c6eb620, 0x3c057: 0x6c6eb820, + 0x3c058: 0x6c964820, 0x3c059: 0x6c964a20, 0x3c05a: 0x6cc26020, 0x3c05b: 0x6cc26220, + 0x3c05c: 0x6cf1a820, 0x3c05d: 0x6cf1aa20, 0x3c05e: 0x6d216620, 0x3c05f: 0x6d216820, + 0x3c060: 0x6d216a20, 0x3c061: 0x6d4efa20, 0x3c062: 0x6d4efc20, 0x3c063: 0x6d4efe20, + 0x3c064: 0x6d7b5820, 0x3c065: 0x6d7b5a20, 0x3c066: 0x6da39a20, 0x3c067: 0x6da39c20, + 0x3c068: 0x6da39e20, 0x3c069: 0x6dc53c20, 0x3c06a: 0x6de25420, 0x3c06b: 0x6e0da820, + 0x3c06c: 0x6c08d820, 0x3c06d: 0x6c1e8c20, 0x3c06e: 0x6c1e8e20, 0x3c06f: 0x6c4cc020, + 0x3c070: 0x6c6ec020, 0x3c071: 0x6c965820, 0x3c072: 0x6d217220, 0x3c073: 0x6c1ea420, + 0x3c074: 0x6c325a20, 0x3c075: 0x6c6ed220, 0x3c076: 0x6cc27820, 0x3c077: 0x6cf1b620, + 0x3c078: 0x6da3a620, 0x3c079: 0x6e1d2020, 0x3c07a: 0x6c114820, 0x3c07b: 0x6c329820, + 0x3c07c: 0x6c4d2620, 0x3c07d: 0x6c4d2820, 0x3c07e: 0x6c6ef820, 0x3c07f: 0x6c969e20, + // Block 0xf02, offset 0x3c080 + 0x3c080: 0x6cc2a220, 0x3c081: 0x6cc2a420, 0x3c082: 0x6d21a420, 0x3c083: 0x6da3b820, + 0x3c084: 0x6e0db620, 0x3c085: 0x6e388420, 0x3c086: 0x6c115420, 0x3c087: 0x6dc55a20, + 0x3c088: 0x6c6f1020, 0x3c089: 0x6d4f3420, 0x3c08a: 0x6da3be20, 0x3c08b: 0x6c1f1a20, + 0x3c08c: 0x6c32de20, 0x3c08d: 0x6c6f5220, 0x3c08e: 0x6c6f5420, 0x3c08f: 0x6c972a20, + 0x3c090: 0x6c972c20, 0x3c091: 0x6cc2fe20, 0x3c092: 0x6cc30020, 0x3c093: 0x6cc30220, + 0x3c094: 0x6cf23e20, 0x3c095: 0x6cf24020, 0x3c096: 0x6d21fc20, 0x3c097: 0x6d21fe20, + 0x3c098: 0x6d220020, 0x3c099: 0x6d7bb020, 0x3c09a: 0x6da3d220, 0x3c09b: 0x6dc57020, + 0x3c09c: 0x6dc57220, 0x3c09d: 0x6c091e20, 0x3c09e: 0x6c11b820, 0x3c09f: 0x6c1fec20, + 0x3c0a0: 0x6c1fee20, 0x3c0a1: 0x6c1ff020, 0x3c0a2: 0x6c1ff220, 0x3c0a3: 0x6c1ff420, + 0x3c0a4: 0x6c1ff620, 0x3c0a5: 0x6c1ff820, 0x3c0a6: 0x6c33ce20, 0x3c0a7: 0x6c33d020, + 0x3c0a8: 0x6c33d220, 0x3c0a9: 0x6c33d420, 0x3c0aa: 0x6c33d620, 0x3c0ab: 0x6c33d820, + 0x3c0ac: 0x6c33da20, 0x3c0ad: 0x6c4e8e20, 0x3c0ae: 0x6c4e9020, 0x3c0af: 0x6c4e9220, + 0x3c0b0: 0x6c4e9420, 0x3c0b1: 0x6c4e9620, 0x3c0b2: 0x6c4e9820, 0x3c0b3: 0x6c4e9a20, + 0x3c0b4: 0x6c4e9c20, 0x3c0b5: 0x6c708220, 0x3c0b6: 0x6c708420, 0x3c0b7: 0x6c708620, + 0x3c0b8: 0x6c708820, 0x3c0b9: 0x6c708a20, 0x3c0ba: 0x6c708c20, 0x3c0bb: 0x6c708e20, + 0x3c0bc: 0x6c709020, 0x3c0bd: 0x6c709220, 0x3c0be: 0x6c709420, 0x3c0bf: 0x6c98a620, + // Block 0xf03, offset 0x3c0c0 + 0x3c0c0: 0x6c98a820, 0x3c0c1: 0x6c98aa20, 0x3c0c2: 0x6c98ac20, 0x3c0c3: 0x6c98ae20, + 0x3c0c4: 0x6c98b020, 0x3c0c5: 0x6c98b220, 0x3c0c6: 0x6c98b420, 0x3c0c7: 0x6cc47620, + 0x3c0c8: 0x6cc47820, 0x3c0c9: 0x6cc47a20, 0x3c0ca: 0x6cc47c20, 0x3c0cb: 0x6cc47e20, + 0x3c0cc: 0x6cc48020, 0x3c0cd: 0x6cc48220, 0x3c0ce: 0x6cc48420, 0x3c0cf: 0x6cc48620, + 0x3c0d0: 0x6cc48820, 0x3c0d1: 0x6cc48a20, 0x3c0d2: 0x6cc48c20, 0x3c0d3: 0x6cf35c20, + 0x3c0d4: 0x6cf35e20, 0x3c0d5: 0x6cf36020, 0x3c0d6: 0x6cf36220, 0x3c0d7: 0x6cf36420, + 0x3c0d8: 0x6cf36620, 0x3c0d9: 0x6cf36820, 0x3c0da: 0x6cf36a20, 0x3c0db: 0x6cf36c20, + 0x3c0dc: 0x6cf36e20, 0x3c0dd: 0x6cf37020, 0x3c0de: 0x6cf37220, 0x3c0df: 0x6d232020, + 0x3c0e0: 0x6d232220, 0x3c0e1: 0x6d232420, 0x3c0e2: 0x6d232620, 0x3c0e3: 0x6d232820, + 0x3c0e4: 0x6d232a20, 0x3c0e5: 0x6d232c20, 0x3c0e6: 0x6d232e20, 0x3c0e7: 0x6d233020, + 0x3c0e8: 0x6d50b220, 0x3c0e9: 0x6d50b420, 0x3c0ea: 0x6d50b620, 0x3c0eb: 0x6d50b820, + 0x3c0ec: 0x6d50ba20, 0x3c0ed: 0x6d50bc20, 0x3c0ee: 0x6d7c7c20, 0x3c0ef: 0x6d7c7e20, + 0x3c0f0: 0x6d7c8020, 0x3c0f1: 0x6d7c8220, 0x3c0f2: 0x6d7c8420, 0x3c0f3: 0x6d7c8620, + 0x3c0f4: 0x6d7c8820, 0x3c0f5: 0x6d7c8a20, 0x3c0f6: 0x6d7c8c20, 0x3c0f7: 0x6da46220, + 0x3c0f8: 0x6da46420, 0x3c0f9: 0x6da46620, 0x3c0fa: 0x6dc5f620, 0x3c0fb: 0x6dc5f820, + 0x3c0fc: 0x6dc5fa20, 0x3c0fd: 0x6dc5fc20, 0x3c0fe: 0x6dc5fe20, 0x3c0ff: 0x6de2da20, + // Block 0xf04, offset 0x3c100 + 0x3c100: 0x6de2dc20, 0x3c101: 0x6dfa5220, 0x3c102: 0x6dfa5420, 0x3c103: 0x6e0de220, + 0x3c104: 0x6e0de420, 0x3c105: 0x6e1d4e20, 0x3c106: 0x6e1d5020, 0x3c107: 0x6e28f020, + 0x3c108: 0x6e388e20, 0x3c109: 0x6c092a20, 0x3c10a: 0x6c11cc20, 0x3c10b: 0x6c4ec420, + 0x3c10c: 0x6c4ec620, 0x3c10d: 0x6c70ae20, 0x3c10e: 0x6c70b020, 0x3c10f: 0x6c98d220, + 0x3c110: 0x6c98d420, 0x3c111: 0x6cc4ac20, 0x3c112: 0x6cf3a020, 0x3c113: 0x6d236020, + 0x3c114: 0x6d7caa20, 0x3c115: 0x6d7cac20, 0x3c116: 0x6d7cae20, 0x3c117: 0x6e3d2c20, + 0x3c118: 0x6c4ef020, 0x3c119: 0x6c98e020, 0x3c11a: 0x6d50fa20, 0x3c11b: 0x6e1d5420, + 0x3c11c: 0x6c123220, 0x3c11d: 0x6c210a20, 0x3c11e: 0x6c210c20, 0x3c11f: 0x6c210e20, + 0x3c120: 0x6c211020, 0x3c121: 0x6c211220, 0x3c122: 0x6c211420, 0x3c123: 0x6c211620, + 0x3c124: 0x6c351e20, 0x3c125: 0x6c352020, 0x3c126: 0x6c352220, 0x3c127: 0x6c352420, + 0x3c128: 0x6c352620, 0x3c129: 0x6c352820, 0x3c12a: 0x6c352a20, 0x3c12b: 0x6c501620, + 0x3c12c: 0x6c501820, 0x3c12d: 0x6c501a20, 0x3c12e: 0x6c501c20, 0x3c12f: 0x6c501e20, + 0x3c130: 0x6c502020, 0x3c131: 0x6c502220, 0x3c132: 0x6c502420, 0x3c133: 0x6c502620, + 0x3c134: 0x6c720620, 0x3c135: 0x6c720820, 0x3c136: 0x6c720a20, 0x3c137: 0x6c720c20, + 0x3c138: 0x6c720e20, 0x3c139: 0x6c721020, 0x3c13a: 0x6c721220, 0x3c13b: 0x6c721420, + 0x3c13c: 0x6c721620, 0x3c13d: 0x6c721820, 0x3c13e: 0x6c721a20, 0x3c13f: 0x6c721c20, + // Block 0xf05, offset 0x3c140 + 0x3c140: 0x6c721e20, 0x3c141: 0x6c9a7c20, 0x3c142: 0x6c9a7e20, 0x3c143: 0x6c9a8020, + 0x3c144: 0x6c9a8220, 0x3c145: 0x6c9a8420, 0x3c146: 0x6c9a8620, 0x3c147: 0x6c9a8820, + 0x3c148: 0x6c9a8a20, 0x3c149: 0x6c9a8c20, 0x3c14a: 0x6c9a8e20, 0x3c14b: 0x6c9a9020, + 0x3c14c: 0x6cc65420, 0x3c14d: 0x6cc65620, 0x3c14e: 0x6cc65820, 0x3c14f: 0x6cc65a20, + 0x3c150: 0x6cc65c20, 0x3c151: 0x6cc65e20, 0x3c152: 0x6cc66020, 0x3c153: 0x6cc66220, + 0x3c154: 0x6cc66420, 0x3c155: 0x6cc66620, 0x3c156: 0x6cc66820, 0x3c157: 0x6cf50220, + 0x3c158: 0x6cf50420, 0x3c159: 0x6cf50620, 0x3c15a: 0x6cf50820, 0x3c15b: 0x6cf50a20, + 0x3c15c: 0x6cf50c20, 0x3c15d: 0x6cf50e20, 0x3c15e: 0x6cf51020, 0x3c15f: 0x6cf51220, + 0x3c160: 0x6cf51420, 0x3c161: 0x6cf51620, 0x3c162: 0x6cf51820, 0x3c163: 0x6d24d420, + 0x3c164: 0x6d24d620, 0x3c165: 0x6d24d820, 0x3c166: 0x6d24da20, 0x3c167: 0x6d24dc20, + 0x3c168: 0x6d24de20, 0x3c169: 0x6d24e020, 0x3c16a: 0x6d24e220, 0x3c16b: 0x6d525620, + 0x3c16c: 0x6d525820, 0x3c16d: 0x6d525a20, 0x3c16e: 0x6d525c20, 0x3c16f: 0x6d525e20, + 0x3c170: 0x6d526020, 0x3c171: 0x6d526220, 0x3c172: 0x6d526420, 0x3c173: 0x6d526620, + 0x3c174: 0x6d526820, 0x3c175: 0x6d7d9820, 0x3c176: 0x6d7d9a20, 0x3c177: 0x6d7d9c20, + 0x3c178: 0x6da50420, 0x3c179: 0x6da50620, 0x3c17a: 0x6da50820, 0x3c17b: 0x6dc6a820, + 0x3c17c: 0x6dc6aa20, 0x3c17d: 0x6dc6ac20, 0x3c17e: 0x6dc6ae20, 0x3c17f: 0x6dc6b020, + // Block 0xf06, offset 0x3c180 + 0x3c180: 0x6dc6b220, 0x3c181: 0x6de35820, 0x3c182: 0x6dfaae20, 0x3c183: 0x6e1d8e20, + 0x3c184: 0x6e291820, 0x3c185: 0x6c9a9e20, 0x3c186: 0x6c353e20, 0x3c187: 0x6d527020, + 0x3c188: 0x6c357420, 0x3c189: 0x6c506c20, 0x3c18a: 0x6c506e20, 0x3c18b: 0x6c728820, + 0x3c18c: 0x6c728a20, 0x3c18d: 0x6c9b1020, 0x3c18e: 0x6cc6fe20, 0x3c18f: 0x6cc70020, + 0x3c190: 0x6cf58a20, 0x3c191: 0x6d253e20, 0x3c192: 0x6d254020, 0x3c193: 0x6d52b620, + 0x3c194: 0x6d52b820, 0x3c195: 0x6d52ba20, 0x3c196: 0x6d52bc20, 0x3c197: 0x6d7dfe20, + 0x3c198: 0x6d7e0020, 0x3c199: 0x6d7e0220, 0x3c19a: 0x6da53c20, 0x3c19b: 0x6dc6d420, + 0x3c19c: 0x6dc6d620, 0x3c19d: 0x6e0e3820, 0x3c19e: 0x6e0e3a20, 0x3c19f: 0x6e324620, + 0x3c1a0: 0x6c214020, 0x3c1a1: 0x6c357e20, 0x3c1a2: 0x6c358020, 0x3c1a3: 0x6c507820, + 0x3c1a4: 0x6c729820, 0x3c1a5: 0x6cc70e20, 0x3c1a6: 0x6cc71020, 0x3c1a7: 0x6cc71220, + 0x3c1a8: 0x6d254220, 0x3c1a9: 0x6d254420, 0x3c1aa: 0x6d254620, 0x3c1ab: 0x6c508020, + 0x3c1ac: 0x6c72a820, 0x3c1ad: 0x6d255420, 0x3c1ae: 0x6d52d420, 0x3c1af: 0x6da54a20, + 0x3c1b0: 0x6e0e4220, 0x3c1b1: 0x6c359c20, 0x3c1b2: 0x6c35ac20, 0x3c1b3: 0x6c35ae20, + 0x3c1b4: 0x6c50aa20, 0x3c1b5: 0x6c72e420, 0x3c1b6: 0x6c72e620, 0x3c1b7: 0x6c72e820, + 0x3c1b8: 0x6c9b6a20, 0x3c1b9: 0x6cc76220, 0x3c1ba: 0x6cc76420, 0x3c1bb: 0x6cc76620, + 0x3c1bc: 0x6cc76820, 0x3c1bd: 0x6cf5ca20, 0x3c1be: 0x6d257420, 0x3c1bf: 0x6d52ee20, + // Block 0xf07, offset 0x3c1c0 + 0x3c1c0: 0x6d52f020, 0x3c1c1: 0x6d7e2c20, 0x3c1c2: 0x6d7e2e20, 0x3c1c3: 0x6de38020, + 0x3c1c4: 0x6de38220, 0x3c1c5: 0x6dfadc20, 0x3c1c6: 0x6c219820, 0x3c1c7: 0x6c219a20, + 0x3c1c8: 0x6c363220, 0x3c1c9: 0x6c363420, 0x3c1ca: 0x6c363620, 0x3c1cb: 0x6c363820, + 0x3c1cc: 0x6c363a20, 0x3c1cd: 0x6c363c20, 0x3c1ce: 0x6c363e20, 0x3c1cf: 0x6c514420, + 0x3c1d0: 0x6c514620, 0x3c1d1: 0x6c514820, 0x3c1d2: 0x6c514a20, 0x3c1d3: 0x6c514c20, + 0x3c1d4: 0x6c514e20, 0x3c1d5: 0x6c515020, 0x3c1d6: 0x6c515220, 0x3c1d7: 0x6c515420, + 0x3c1d8: 0x6c515620, 0x3c1d9: 0x6c737220, 0x3c1da: 0x6c737420, 0x3c1db: 0x6c737620, + 0x3c1dc: 0x6c737820, 0x3c1dd: 0x6c737a20, 0x3c1de: 0x6c737c20, 0x3c1df: 0x6c737e20, + 0x3c1e0: 0x6c738020, 0x3c1e1: 0x6c738220, 0x3c1e2: 0x6c738420, 0x3c1e3: 0x6c738620, + 0x3c1e4: 0x6c738820, 0x3c1e5: 0x6c9c0220, 0x3c1e6: 0x6c9c0420, 0x3c1e7: 0x6c9c0620, + 0x3c1e8: 0x6c9c0820, 0x3c1e9: 0x6cc83e20, 0x3c1ea: 0x6cc84020, 0x3c1eb: 0x6cc84220, + 0x3c1ec: 0x6cc84420, 0x3c1ed: 0x6cc84620, 0x3c1ee: 0x6cc84820, 0x3c1ef: 0x6cf67620, + 0x3c1f0: 0x6cf67820, 0x3c1f1: 0x6cf67a20, 0x3c1f2: 0x6cf67c20, 0x3c1f3: 0x6cf67e20, + 0x3c1f4: 0x6cf68020, 0x3c1f5: 0x6cf68220, 0x3c1f6: 0x6cf68420, 0x3c1f7: 0x6cf68620, + 0x3c1f8: 0x6d25ec20, 0x3c1f9: 0x6d25ee20, 0x3c1fa: 0x6d25f020, 0x3c1fb: 0x6d25f220, + 0x3c1fc: 0x6d25f420, 0x3c1fd: 0x6d25f620, 0x3c1fe: 0x6d536220, 0x3c1ff: 0x6d536420, + // Block 0xf08, offset 0x3c200 + 0x3c200: 0x6d536620, 0x3c201: 0x6d536820, 0x3c202: 0x6d536a20, 0x3c203: 0x6d536c20, + 0x3c204: 0x6d536e20, 0x3c205: 0x6d537020, 0x3c206: 0x6da5a420, 0x3c207: 0x6d7ec620, + 0x3c208: 0x6d7ec820, 0x3c209: 0x6d7eca20, 0x3c20a: 0x6d7ecc20, 0x3c20b: 0x6d7ece20, + 0x3c20c: 0x6d7ed020, 0x3c20d: 0x6da5a620, 0x3c20e: 0x6dc73820, 0x3c20f: 0x6dc73a20, + 0x3c210: 0x6dc73c20, 0x3c211: 0x6e0e5220, 0x3c212: 0x6e0e5420, 0x3c213: 0x6e0e5620, + 0x3c214: 0x6e325620, 0x3c215: 0x6d537e20, 0x3c216: 0x6d7ee020, 0x3c217: 0x6d7ee220, + 0x3c218: 0x6de3b220, 0x3c219: 0x6c127820, 0x3c21a: 0x6c21ae20, 0x3c21b: 0x6c365620, + 0x3c21c: 0x6c518220, 0x3c21d: 0x6c518420, 0x3c21e: 0x6c73ba20, 0x3c21f: 0x6d261220, + 0x3c220: 0x6c9c3020, 0x3c221: 0x6c9c3220, 0x3c222: 0x6c9c3420, 0x3c223: 0x6cc87e20, + 0x3c224: 0x6cf6aa20, 0x3c225: 0x6cf6ac20, 0x3c226: 0x6cf6ae20, 0x3c227: 0x6cf6b020, + 0x3c228: 0x6d261420, 0x3c229: 0x6d261620, 0x3c22a: 0x6d261820, 0x3c22b: 0x6d539820, + 0x3c22c: 0x6d539a20, 0x3c22d: 0x6d7efc20, 0x3c22e: 0x6e0e5a20, 0x3c22f: 0x6e0e5c20, + 0x3c230: 0x6e325c20, 0x3c231: 0x6c222e20, 0x3c232: 0x6c223020, 0x3c233: 0x6c223220, + 0x3c234: 0x6c223420, 0x3c235: 0x6c223620, 0x3c236: 0x6c375a20, 0x3c237: 0x6c375c20, + 0x3c238: 0x6c375e20, 0x3c239: 0x6c376020, 0x3c23a: 0x6c52ae20, 0x3c23b: 0x6c52b020, + 0x3c23c: 0x6c52b220, 0x3c23d: 0x6c52b420, 0x3c23e: 0x6c52b620, 0x3c23f: 0x6c52b820, + // Block 0xf09, offset 0x3c240 + 0x3c240: 0x6c52ba20, 0x3c241: 0x6c52bc20, 0x3c242: 0x6c52be20, 0x3c243: 0x6c752a20, + 0x3c244: 0x6c752c20, 0x3c245: 0x6c752e20, 0x3c246: 0x6c753020, 0x3c247: 0x6c753220, + 0x3c248: 0x6c753420, 0x3c249: 0x6c753620, 0x3c24a: 0x6c753820, 0x3c24b: 0x6c753a20, + 0x3c24c: 0x6c753c20, 0x3c24d: 0x6c753e20, 0x3c24e: 0x6c754020, 0x3c24f: 0x6c754220, + 0x3c250: 0x6c9d8620, 0x3c251: 0x6c9d8820, 0x3c252: 0x6c9d8a20, 0x3c253: 0x6c9d8c20, + 0x3c254: 0x6c9d8e20, 0x3c255: 0x6c9d9020, 0x3c256: 0x6c9d9220, 0x3c257: 0x6c9d9420, + 0x3c258: 0x6c9d9620, 0x3c259: 0x6c9d9820, 0x3c25a: 0x6c9d9a20, 0x3c25b: 0x6c9d9c20, + 0x3c25c: 0x6c9d9e20, 0x3c25d: 0x6c9da020, 0x3c25e: 0x6c9da220, 0x3c25f: 0x6cca6620, + 0x3c260: 0x6cca6820, 0x3c261: 0x6cca6a20, 0x3c262: 0x6cca6c20, 0x3c263: 0x6cca6e20, + 0x3c264: 0x6cca7020, 0x3c265: 0x6cca7220, 0x3c266: 0x6cca7420, 0x3c267: 0x6cca7620, + 0x3c268: 0x6cca7820, 0x3c269: 0x6cca7a20, 0x3c26a: 0x6cca7c20, 0x3c26b: 0x6cca7e20, + 0x3c26c: 0x6cca8020, 0x3c26d: 0x6cca8220, 0x3c26e: 0x6cca8420, 0x3c26f: 0x6cca8620, + 0x3c270: 0x6cf88c20, 0x3c271: 0x6cf88e20, 0x3c272: 0x6cf89020, 0x3c273: 0x6cf89220, + 0x3c274: 0x6cf89420, 0x3c275: 0x6cf89620, 0x3c276: 0x6cf89820, 0x3c277: 0x6cf89a20, + 0x3c278: 0x6cf89c20, 0x3c279: 0x6cf89e20, 0x3c27a: 0x6cf8a020, 0x3c27b: 0x6cf8a220, + 0x3c27c: 0x6cf8a420, 0x3c27d: 0x6cf8a620, 0x3c27e: 0x6cf8a820, 0x3c27f: 0x6cf8aa20, + // Block 0xf0a, offset 0x3c280 + 0x3c280: 0x6cf8ac20, 0x3c281: 0x6cf8ae20, 0x3c282: 0x6cf8b020, 0x3c283: 0x6cf8b220, + 0x3c284: 0x6cf8b420, 0x3c285: 0x6cf8b620, 0x3c286: 0x6cf8b820, 0x3c287: 0x6cf8ba20, + 0x3c288: 0x6d27d220, 0x3c289: 0x6d27d420, 0x3c28a: 0x6d27d620, 0x3c28b: 0x6d27d820, + 0x3c28c: 0x6d27da20, 0x3c28d: 0x6d27dc20, 0x3c28e: 0x6d27de20, 0x3c28f: 0x6d27e020, + 0x3c290: 0x6d27e220, 0x3c291: 0x6d27e420, 0x3c292: 0x6d27e620, 0x3c293: 0x6d27e820, + 0x3c294: 0x6d27ea20, 0x3c295: 0x6d27ec20, 0x3c296: 0x6d27ee20, 0x3c297: 0x6d27f020, + 0x3c298: 0x6d27f220, 0x3c299: 0x6d27f420, 0x3c29a: 0x6d27f620, 0x3c29b: 0x6d27f820, + 0x3c29c: 0x6d27fa20, 0x3c29d: 0x6d552c20, 0x3c29e: 0x6d552e20, 0x3c29f: 0x6d553020, + 0x3c2a0: 0x6d553220, 0x3c2a1: 0x6d553420, 0x3c2a2: 0x6d553620, 0x3c2a3: 0x6d553820, + 0x3c2a4: 0x6d553a20, 0x3c2a5: 0x6d553c20, 0x3c2a6: 0x6d553e20, 0x3c2a7: 0x6d554020, + 0x3c2a8: 0x6d554220, 0x3c2a9: 0x6d554420, 0x3c2aa: 0x6d554620, 0x3c2ab: 0x6d554820, + 0x3c2ac: 0x6d554a20, 0x3c2ad: 0x6d80ae20, 0x3c2ae: 0x6d80b020, 0x3c2af: 0x6d80b220, + 0x3c2b0: 0x6d80b420, 0x3c2b1: 0x6d80b620, 0x3c2b2: 0x6d80b820, 0x3c2b3: 0x6d80ba20, + 0x3c2b4: 0x6d80bc20, 0x3c2b5: 0x6d80be20, 0x3c2b6: 0x6d80c020, 0x3c2b7: 0x6d80c220, + 0x3c2b8: 0x6d80c420, 0x3c2b9: 0x6d80c620, 0x3c2ba: 0x6d80c820, 0x3c2bb: 0x6d80ca20, + 0x3c2bc: 0x6d80cc20, 0x3c2bd: 0x6da6d820, 0x3c2be: 0x6da6da20, 0x3c2bf: 0x6da6dc20, + // Block 0xf0b, offset 0x3c2c0 + 0x3c2c0: 0x6da6de20, 0x3c2c1: 0x6da6e020, 0x3c2c2: 0x6da6e220, 0x3c2c3: 0x6da6e420, + 0x3c2c4: 0x6da6e620, 0x3c2c5: 0x6da6e820, 0x3c2c6: 0x6da6ea20, 0x3c2c7: 0x6da6ec20, + 0x3c2c8: 0x6da6ee20, 0x3c2c9: 0x6dc83c20, 0x3c2ca: 0x6dc83e20, 0x3c2cb: 0x6dc84020, + 0x3c2cc: 0x6dc84220, 0x3c2cd: 0x6dc84420, 0x3c2ce: 0x6dc84620, 0x3c2cf: 0x6dc84820, + 0x3c2d0: 0x6de46c20, 0x3c2d1: 0x6de46e20, 0x3c2d2: 0x6de47020, 0x3c2d3: 0x6de47220, + 0x3c2d4: 0x6de47420, 0x3c2d5: 0x6de47620, 0x3c2d6: 0x6dfb8e20, 0x3c2d7: 0x6dfb9020, + 0x3c2d8: 0x6dfb9220, 0x3c2d9: 0x6dfb9420, 0x3c2da: 0x6dfb9620, 0x3c2db: 0x6e0ed020, + 0x3c2dc: 0x6e0ed220, 0x3c2dd: 0x6e0ed420, 0x3c2de: 0x6e0ed620, 0x3c2df: 0x6e1e0620, + 0x3c2e0: 0x6e1e0820, 0x3c2e1: 0x6e1e0a20, 0x3c2e2: 0x6e297220, 0x3c2e3: 0x6e297420, + 0x3c2e4: 0x6e328c20, 0x3c2e5: 0x6e328e20, 0x3c2e6: 0x6e38d220, 0x3c2e7: 0x6e405420, + 0x3c2e8: 0x6e3d4420, 0x3c2e9: 0x6c379220, 0x3c2ea: 0x6c52f420, 0x3c2eb: 0x6c52f620, + 0x3c2ec: 0x6c9dd620, 0x3c2ed: 0x6c9dd820, 0x3c2ee: 0x6ccad020, 0x3c2ef: 0x6cf90220, + 0x3c2f0: 0x6cf90420, 0x3c2f1: 0x6d283e20, 0x3c2f2: 0x6d558220, 0x3c2f3: 0x6dfba220, + 0x3c2f4: 0x6e329220, 0x3c2f5: 0x6c37c820, 0x3c2f6: 0x6c75a420, 0x3c2f7: 0x6c9de620, + 0x3c2f8: 0x6ccaf620, 0x3c2f9: 0x6cf91c20, 0x3c2fa: 0x6cf91e20, 0x3c2fb: 0x6d284e20, + 0x3c2fc: 0x6d559820, 0x3c2fd: 0x6d80fe20, 0x3c2fe: 0x6d810020, 0x3c2ff: 0x6da71c20, + // Block 0xf0c, offset 0x3c300 + 0x3c300: 0x6c534420, 0x3c301: 0x6c534620, 0x3c302: 0x6c75d820, 0x3c303: 0x6c75da20, + 0x3c304: 0x6c9e1e20, 0x3c305: 0x6ccb4820, 0x3c306: 0x6d287420, 0x3c307: 0x6da73420, + 0x3c308: 0x6c75e820, 0x3c309: 0x6c75ea20, 0x3c30a: 0x6c9b1220, 0x3c30b: 0x6c9e4620, + 0x3c30c: 0x6ccb6220, 0x3c30d: 0x6ccb6420, 0x3c30e: 0x6ccb6620, 0x3c30f: 0x6cf97a20, + 0x3c310: 0x6d55da20, 0x3c311: 0x6da74020, 0x3c312: 0x6da74220, 0x3c313: 0x6e38de20, + 0x3c314: 0x6d289220, 0x3c315: 0x6d289c20, 0x3c316: 0x6c098220, 0x3c317: 0x6c384c20, + 0x3c318: 0x6c384e20, 0x3c319: 0x6c53ac20, 0x3c31a: 0x6c53ae20, 0x3c31b: 0x6c763420, + 0x3c31c: 0x6c763620, 0x3c31d: 0x6ccbc220, 0x3c31e: 0x6ccbc420, 0x3c31f: 0x6cf9d420, + 0x3c320: 0x6d28e820, 0x3c321: 0x6d561020, 0x3c322: 0x6dc8ba20, 0x3c323: 0x6c386420, + 0x3c324: 0x6c53cc20, 0x3c325: 0x6c9ea820, 0x3c326: 0x6cf9e020, 0x3c327: 0x6d28f220, + 0x3c328: 0x6c09c820, 0x3c329: 0x6c134c20, 0x3c32a: 0x6c134e20, 0x3c32b: 0x6c135020, + 0x3c32c: 0x6c135220, 0x3c32d: 0x6c238220, 0x3c32e: 0x6c238420, 0x3c32f: 0x6c238620, + 0x3c330: 0x6c238820, 0x3c331: 0x6c398420, 0x3c332: 0x6c398620, 0x3c333: 0x6c398820, + 0x3c334: 0x6c398a20, 0x3c335: 0x6c398c20, 0x3c336: 0x6c398e20, 0x3c337: 0x6c550a20, + 0x3c338: 0x6c550c20, 0x3c339: 0x6c550e20, 0x3c33a: 0x6c551020, 0x3c33b: 0x6c551220, + 0x3c33c: 0x6c551420, 0x3c33d: 0x6c551620, 0x3c33e: 0x6c77cc20, 0x3c33f: 0x6c77ce20, + // Block 0xf0d, offset 0x3c340 + 0x3c340: 0x6c77d020, 0x3c341: 0x6c77d220, 0x3c342: 0x6c77d420, 0x3c343: 0x6c77d620, + 0x3c344: 0x6c77d820, 0x3c345: 0x6c77da20, 0x3c346: 0x6c77dc20, 0x3c347: 0x6c77de20, + 0x3c348: 0x6c77e020, 0x3c349: 0x6c77e220, 0x3c34a: 0x6c77e420, 0x3c34b: 0x6c77e620, + 0x3c34c: 0x6ca0c620, 0x3c34d: 0x6ca0c820, 0x3c34e: 0x6ca0ca20, 0x3c34f: 0x6ca0cc20, + 0x3c350: 0x6ca0ce20, 0x3c351: 0x6ca0d020, 0x3c352: 0x6ca0d220, 0x3c353: 0x6ca0d420, + 0x3c354: 0x6ca0d620, 0x3c355: 0x6ca0d820, 0x3c356: 0x6ca0da20, 0x3c357: 0x6ccdb620, + 0x3c358: 0x6ccdb820, 0x3c359: 0x6ccdba20, 0x3c35a: 0x6ccdbc20, 0x3c35b: 0x6ccdbe20, + 0x3c35c: 0x6ccdc020, 0x3c35d: 0x6ccdc220, 0x3c35e: 0x6ccdc420, 0x3c35f: 0x6ccdc620, + 0x3c360: 0x6ccdc820, 0x3c361: 0x6ccdca20, 0x3c362: 0x6ccdcc20, 0x3c363: 0x6ccdce20, + 0x3c364: 0x6ccdd020, 0x3c365: 0x6ccdd220, 0x3c366: 0x6ccdd420, 0x3c367: 0x6ccdd620, + 0x3c368: 0x6ccdd820, 0x3c369: 0x6ccdda20, 0x3c36a: 0x6cfba620, 0x3c36b: 0x6cfba820, + 0x3c36c: 0x6cfbaa20, 0x3c36d: 0x6cfbac20, 0x3c36e: 0x6cfbae20, 0x3c36f: 0x6cfbb020, + 0x3c370: 0x6cfbb220, 0x3c371: 0x6cfbb420, 0x3c372: 0x6cfbb620, 0x3c373: 0x6cfbb820, + 0x3c374: 0x6cfbba20, 0x3c375: 0x6cfbbc20, 0x3c376: 0x6cfbbe20, 0x3c377: 0x6cfbc020, + 0x3c378: 0x6cfbc220, 0x3c379: 0x6cfbc420, 0x3c37a: 0x6cfbc620, 0x3c37b: 0x6cfbc820, + 0x3c37c: 0x6cfbca20, 0x3c37d: 0x6cfbcc20, 0x3c37e: 0x6cfbce20, 0x3c37f: 0x6d2ab220, + // Block 0xf0e, offset 0x3c380 + 0x3c380: 0x6d2ab420, 0x3c381: 0x6d2ab620, 0x3c382: 0x6d2ab820, 0x3c383: 0x6d2aba20, + 0x3c384: 0x6d2abc20, 0x3c385: 0x6d2abe20, 0x3c386: 0x6d2ac020, 0x3c387: 0x6d2ac220, + 0x3c388: 0x6d2ac420, 0x3c389: 0x6d2ac620, 0x3c38a: 0x6d2ac820, 0x3c38b: 0x6d57e420, + 0x3c38c: 0x6d57e620, 0x3c38d: 0x6d57e820, 0x3c38e: 0x6d57ea20, 0x3c38f: 0x6d57ec20, + 0x3c390: 0x6d57ee20, 0x3c391: 0x6d57f020, 0x3c392: 0x6d57f220, 0x3c393: 0x6d57f420, + 0x3c394: 0x6d57f620, 0x3c395: 0x6d57f820, 0x3c396: 0x6d57fa20, 0x3c397: 0x6d57fc20, + 0x3c398: 0x6d57fe20, 0x3c399: 0x6d580020, 0x3c39a: 0x6d580220, 0x3c39b: 0x6d580420, + 0x3c39c: 0x6d580620, 0x3c39d: 0x6d82e420, 0x3c39e: 0x6d82e620, 0x3c39f: 0x6d82e820, + 0x3c3a0: 0x6d82ea20, 0x3c3a1: 0x6d82ec20, 0x3c3a2: 0x6d82ee20, 0x3c3a3: 0x6d82f020, + 0x3c3a4: 0x6d82f220, 0x3c3a5: 0x6d82f420, 0x3c3a6: 0x6d82f620, 0x3c3a7: 0x6d82f820, + 0x3c3a8: 0x6da85a20, 0x3c3a9: 0x6da85c20, 0x3c3aa: 0x6da85e20, 0x3c3ab: 0x6da86020, + 0x3c3ac: 0x6da86220, 0x3c3ad: 0x6da86420, 0x3c3ae: 0x6da86620, 0x3c3af: 0x6da86820, + 0x3c3b0: 0x6da86a20, 0x3c3b1: 0x6da86c20, 0x3c3b2: 0x6da86e20, 0x3c3b3: 0x6dc9aa20, + 0x3c3b4: 0x6dc9ac20, 0x3c3b5: 0x6dc9ae20, 0x3c3b6: 0x6dc9b020, 0x3c3b7: 0x6dc9b220, + 0x3c3b8: 0x6dc9b420, 0x3c3b9: 0x6dc9b620, 0x3c3ba: 0x6de56220, 0x3c3bb: 0x6de56420, + 0x3c3bc: 0x6de56620, 0x3c3bd: 0x6de56820, 0x3c3be: 0x6de56a20, 0x3c3bf: 0x6de56c20, + // Block 0xf0f, offset 0x3c3c0 + 0x3c3c0: 0x6dfc4220, 0x3c3c1: 0x6dfc4420, 0x3c3c2: 0x6dfc4620, 0x3c3c3: 0x6e0f7220, + 0x3c3c4: 0x6e0f7420, 0x3c3c5: 0x6e0f7620, 0x3c3c6: 0x6e0f7820, 0x3c3c7: 0x6e0f7a20, + 0x3c3c8: 0x6e1e6a20, 0x3c3c9: 0x6e1e6c20, 0x3c3ca: 0x6e29d220, 0x3c3cb: 0x6e29d420, + 0x3c3cc: 0x6e32be20, 0x3c3cd: 0x6c09ce20, 0x3c3ce: 0x6c23ca20, 0x3c3cf: 0x6c23cc20, + 0x3c3d0: 0x6c23ce20, 0x3c3d1: 0x6c3a1620, 0x3c3d2: 0x6c3a1820, 0x3c3d3: 0x6c3a1a20, + 0x3c3d4: 0x6c3a1c20, 0x3c3d5: 0x6c3a1e20, 0x3c3d6: 0x6c3a2020, 0x3c3d7: 0x6c3a2220, + 0x3c3d8: 0x6c55d820, 0x3c3d9: 0x6c55da20, 0x3c3da: 0x6c55dc20, 0x3c3db: 0x6c55de20, + 0x3c3dc: 0x6c55e020, 0x3c3dd: 0x6c55e220, 0x3c3de: 0x6c55e420, 0x3c3df: 0x6c55e620, + 0x3c3e0: 0x6c55e820, 0x3c3e1: 0x6c55ea20, 0x3c3e2: 0x6c55ec20, 0x3c3e3: 0x6c78b820, + 0x3c3e4: 0x6c78ba20, 0x3c3e5: 0x6c78bc20, 0x3c3e6: 0x6c78be20, 0x3c3e7: 0x6c78c020, + 0x3c3e8: 0x6c78c220, 0x3c3e9: 0x6c78c420, 0x3c3ea: 0x6c78c620, 0x3c3eb: 0x6ca1ba20, + 0x3c3ec: 0x6ca1bc20, 0x3c3ed: 0x6ca1be20, 0x3c3ee: 0x6ca1c020, 0x3c3ef: 0x6ca1c220, + 0x3c3f0: 0x6ca1c420, 0x3c3f1: 0x6ca1c620, 0x3c3f2: 0x6ca1c820, 0x3c3f3: 0x6ccee820, + 0x3c3f4: 0x6cceea20, 0x3c3f5: 0x6cceec20, 0x3c3f6: 0x6cceee20, 0x3c3f7: 0x6ccef020, + 0x3c3f8: 0x6ccef220, 0x3c3f9: 0x6ccef420, 0x3c3fa: 0x6ccef620, 0x3c3fb: 0x6ccef820, + 0x3c3fc: 0x6ccefa20, 0x3c3fd: 0x6ccefc20, 0x3c3fe: 0x6ccefe20, 0x3c3ff: 0x6ccf0020, + // Block 0xf10, offset 0x3c400 + 0x3c400: 0x6ccf0220, 0x3c401: 0x6ccf0420, 0x3c402: 0x6ccf0620, 0x3c403: 0x6ccf0820, + 0x3c404: 0x6cfd1220, 0x3c405: 0x6cfd1420, 0x3c406: 0x6cfd1620, 0x3c407: 0x6cfd1820, + 0x3c408: 0x6cfd1a20, 0x3c409: 0x6cfd1c20, 0x3c40a: 0x6cfd1e20, 0x3c40b: 0x6cfd2020, + 0x3c40c: 0x6cfd2220, 0x3c40d: 0x6cfd2420, 0x3c40e: 0x6cfd2620, 0x3c40f: 0x6cfd2820, + 0x3c410: 0x6cfd2a20, 0x3c411: 0x6cfd2c20, 0x3c412: 0x6d2bba20, 0x3c413: 0x6d2bbc20, + 0x3c414: 0x6d2bbe20, 0x3c415: 0x6d2bc020, 0x3c416: 0x6d2bc220, 0x3c417: 0x6d2bc420, + 0x3c418: 0x6d2bc620, 0x3c419: 0x6d2bc820, 0x3c41a: 0x6d2bca20, 0x3c41b: 0x6d2bcc20, + 0x3c41c: 0x6d2bce20, 0x3c41d: 0x6d2bd020, 0x3c41e: 0x6d2bd220, 0x3c41f: 0x6d2bd420, + 0x3c420: 0x6d2bd620, 0x3c421: 0x6d58f020, 0x3c422: 0x6d58f220, 0x3c423: 0x6d58f420, + 0x3c424: 0x6d58f620, 0x3c425: 0x6d58f820, 0x3c426: 0x6d58fa20, 0x3c427: 0x6d58fc20, + 0x3c428: 0x6d58fe20, 0x3c429: 0x6d590020, 0x3c42a: 0x6d841620, 0x3c42b: 0x6d841820, + 0x3c42c: 0x6d841a20, 0x3c42d: 0x6d841c20, 0x3c42e: 0x6d841e20, 0x3c42f: 0x6d842020, + 0x3c430: 0x6d842220, 0x3c431: 0x6d842420, 0x3c432: 0x6d842620, 0x3c433: 0x6d842820, + 0x3c434: 0x6da90c20, 0x3c435: 0x6da90e20, 0x3c436: 0x6da91020, 0x3c437: 0x6da91220, + 0x3c438: 0x6da91420, 0x3c439: 0x6da91620, 0x3c43a: 0x6da91820, 0x3c43b: 0x6da91a20, + 0x3c43c: 0x6dca3020, 0x3c43d: 0x6dca3220, 0x3c43e: 0x6dca3420, 0x3c43f: 0x6dca3620, + // Block 0xf11, offset 0x3c440 + 0x3c440: 0x6dca3820, 0x3c441: 0x6de5d020, 0x3c442: 0x6de5d220, 0x3c443: 0x6dfcc420, + 0x3c444: 0x6dfcc620, 0x3c445: 0x6dfcc820, 0x3c446: 0x6e1e9420, 0x3c447: 0x6e1e9620, + 0x3c448: 0x6e29fc20, 0x3c449: 0x6e32cc20, 0x3c44a: 0x6e390620, 0x3c44b: 0x6e390820, + 0x3c44c: 0x6e407420, 0x3c44d: 0x6c23d820, 0x3c44e: 0x6c561220, 0x3c44f: 0x6ca1d820, + 0x3c450: 0x6ccf1a20, 0x3c451: 0x6ccf1c20, 0x3c452: 0x6ccf1e20, 0x3c453: 0x6ccf2020, + 0x3c454: 0x6cfd3a20, 0x3c455: 0x6cfd3c20, 0x3c456: 0x6d591420, 0x3c457: 0x6d591620, + 0x3c458: 0x6da92c20, 0x3c459: 0x6da92e20, 0x3c45a: 0x6e470020, 0x3c45b: 0x6c78dc20, + 0x3c45c: 0x6ca1de20, 0x3c45d: 0x6c3a4420, 0x3c45e: 0x6ca1f620, 0x3c45f: 0x6ccf3a20, + 0x3c460: 0x6d592620, 0x3c461: 0x6dca4220, 0x3c462: 0x6c790020, 0x3c463: 0x6ca20620, + 0x3c464: 0x6ca20820, 0x3c465: 0x6ccf6420, 0x3c466: 0x6d845020, 0x3c467: 0x6c3a6020, + 0x3c468: 0x6ccf7020, 0x3c469: 0x6c23fe20, 0x3c46a: 0x6c569020, 0x3c46b: 0x6c569220, + 0x3c46c: 0x6c792e20, 0x3c46d: 0x6c793020, 0x3c46e: 0x6c793220, 0x3c46f: 0x6ccfca20, + 0x3c470: 0x6cfdbc20, 0x3c471: 0x6d2c6220, 0x3c472: 0x6d2c6420, 0x3c473: 0x6d2c6620, + 0x3c474: 0x6d598420, 0x3c475: 0x6d847c20, 0x3c476: 0x6e0fc620, 0x3c477: 0x6c246a20, + 0x3c478: 0x6c3b3420, 0x3c479: 0x6ccfcc20, 0x3c47a: 0x6c572220, 0x3c47b: 0x6c572420, + 0x3c47c: 0x6c79b620, 0x3c47d: 0x6c79b820, 0x3c47e: 0x6ca2cc20, 0x3c47f: 0x6ca2ce20, + // Block 0xf12, offset 0x3c480 + 0x3c480: 0x6ca2d020, 0x3c481: 0x6ca2d220, 0x3c482: 0x6cd06c20, 0x3c483: 0x6cd06e20, + 0x3c484: 0x6cd07020, 0x3c485: 0x6cd07220, 0x3c486: 0x6cfe4620, 0x3c487: 0x6cfe4820, + 0x3c488: 0x6d2cde20, 0x3c489: 0x6d5a0420, 0x3c48a: 0x6da99420, 0x3c48b: 0x6dca8220, + 0x3c48c: 0x6de61a20, 0x3c48d: 0x6c13cc20, 0x3c48e: 0x6c3b9c20, 0x3c48f: 0x6c3b9e20, + 0x3c490: 0x6c3ba020, 0x3c491: 0x6c3ba220, 0x3c492: 0x6c3ba420, 0x3c493: 0x6c3ba620, + 0x3c494: 0x6c3ba820, 0x3c495: 0x6c57c220, 0x3c496: 0x6c57c420, 0x3c497: 0x6c7a5e20, + 0x3c498: 0x6c7a6020, 0x3c499: 0x6c7a6220, 0x3c49a: 0x6c7a6420, 0x3c49b: 0x6c7a6620, + 0x3c49c: 0x6c7a6820, 0x3c49d: 0x6c7a6a20, 0x3c49e: 0x6c7a6c20, 0x3c49f: 0x6c7a6e20, + 0x3c4a0: 0x6ca37020, 0x3c4a1: 0x6ca37220, 0x3c4a2: 0x6ca37420, 0x3c4a3: 0x6ca37620, + 0x3c4a4: 0x6ca37820, 0x3c4a5: 0x6ca37a20, 0x3c4a6: 0x6cd14420, 0x3c4a7: 0x6cd14620, + 0x3c4a8: 0x6cd14820, 0x3c4a9: 0x6cd14a20, 0x3c4aa: 0x6cd14c20, 0x3c4ab: 0x6cd14e20, + 0x3c4ac: 0x6cd15020, 0x3c4ad: 0x6cd15220, 0x3c4ae: 0x6cd15420, 0x3c4af: 0x6cd15620, + 0x3c4b0: 0x6cd15820, 0x3c4b1: 0x6cd15a20, 0x3c4b2: 0x6cd15c20, 0x3c4b3: 0x6cff2020, + 0x3c4b4: 0x6cff2220, 0x3c4b5: 0x6cff2420, 0x3c4b6: 0x6cff2620, 0x3c4b7: 0x6cff2820, + 0x3c4b8: 0x6cff2a20, 0x3c4b9: 0x6cff2c20, 0x3c4ba: 0x6cff2e20, 0x3c4bb: 0x6cff3020, + 0x3c4bc: 0x6cff3220, 0x3c4bd: 0x6cff3420, 0x3c4be: 0x6cff3620, 0x3c4bf: 0x6cff3820, + // Block 0xf13, offset 0x3c4c0 + 0x3c4c0: 0x6cff3a20, 0x3c4c1: 0x6cff3c20, 0x3c4c2: 0x6cff3e20, 0x3c4c3: 0x6d2d6a20, + 0x3c4c4: 0x6d2d6c20, 0x3c4c5: 0x6d2d6e20, 0x3c4c6: 0x6d2d7020, 0x3c4c7: 0x6d2d7220, + 0x3c4c8: 0x6d2d7420, 0x3c4c9: 0x6d2d7620, 0x3c4ca: 0x6d2d7820, 0x3c4cb: 0x6d2d7a20, + 0x3c4cc: 0x6d2d7c20, 0x3c4cd: 0x6d2d7e20, 0x3c4ce: 0x6d2d8020, 0x3c4cf: 0x6d2d8220, + 0x3c4d0: 0x6d5aa220, 0x3c4d1: 0x6d5aa420, 0x3c4d2: 0x6d5aa620, 0x3c4d3: 0x6d5aa820, + 0x3c4d4: 0x6d5aaa20, 0x3c4d5: 0x6d5aac20, 0x3c4d6: 0x6d5aae20, 0x3c4d7: 0x6d855420, + 0x3c4d8: 0x6d855620, 0x3c4d9: 0x6d855820, 0x3c4da: 0x6d855a20, 0x3c4db: 0x6d855c20, + 0x3c4dc: 0x6d855e20, 0x3c4dd: 0x6d856020, 0x3c4de: 0x6d856220, 0x3c4df: 0x6d856420, + 0x3c4e0: 0x6d856620, 0x3c4e1: 0x6daa0420, 0x3c4e2: 0x6daa0620, 0x3c4e3: 0x6daa0820, + 0x3c4e4: 0x6daa0a20, 0x3c4e5: 0x6daa0c20, 0x3c4e6: 0x6daa0e20, 0x3c4e7: 0x6dcade20, + 0x3c4e8: 0x6dcae020, 0x3c4e9: 0x6de66220, 0x3c4ea: 0x6de66420, 0x3c4eb: 0x6de66620, + 0x3c4ec: 0x6dfd2420, 0x3c4ed: 0x6dfd2620, 0x3c4ee: 0x6dfd2820, 0x3c4ef: 0x6dfd2a20, + 0x3c4f0: 0x6e0ff220, 0x3c4f1: 0x6e2a2c20, 0x3c4f2: 0x6e32e220, 0x3c4f3: 0x6c3bb020, + 0x3c4f4: 0x6c57d420, 0x3c4f5: 0x6cff5020, 0x3c4f6: 0x6c3bc220, 0x3c4f7: 0x6c57fa20, + 0x3c4f8: 0x6c57fc20, 0x3c4f9: 0x6c7aac20, 0x3c4fa: 0x6cff8420, 0x3c4fb: 0x6cff8620, + 0x3c4fc: 0x6d2dd020, 0x3c4fd: 0x6d5aec20, 0x3c4fe: 0x6d5aee20, 0x3c4ff: 0x6e1ed420, + // Block 0xf14, offset 0x3c500 + 0x3c500: 0x6cd1a020, 0x3c501: 0x6c24a820, 0x3c502: 0x6ca3ce20, 0x3c503: 0x6cff9c20, + 0x3c504: 0x6cff9e20, 0x3c505: 0x6cffa020, 0x3c506: 0x6c13d420, 0x3c507: 0x6c24d220, + 0x3c508: 0x6c3c1220, 0x3c509: 0x6c588620, 0x3c50a: 0x6c588820, 0x3c50b: 0x6c588a20, + 0x3c50c: 0x6c588c20, 0x3c50d: 0x6c7b0620, 0x3c50e: 0x6c7b0820, 0x3c50f: 0x6c7b0a20, + 0x3c510: 0x6c7b0c20, 0x3c511: 0x6ca41420, 0x3c512: 0x6ca41620, 0x3c513: 0x6cd1fc20, + 0x3c514: 0x6cd1fe20, 0x3c515: 0x6cd20020, 0x3c516: 0x6cd20220, 0x3c517: 0x6cd20420, + 0x3c518: 0x6cffea20, 0x3c519: 0x6cffec20, 0x3c51a: 0x6cffee20, 0x3c51b: 0x6d2e0020, + 0x3c51c: 0x6d2e0220, 0x3c51d: 0x6d5b2a20, 0x3c51e: 0x6d5b2c20, 0x3c51f: 0x6d85b820, + 0x3c520: 0x6d85ba20, 0x3c521: 0x6d85bc20, 0x3c522: 0x6daa6c20, 0x3c523: 0x6dcb1c20, + 0x3c524: 0x6dfd4620, 0x3c525: 0x6e101a20, 0x3c526: 0x6e101c20, 0x3c527: 0x6daa6e20, + 0x3c528: 0x6c58fa20, 0x3c529: 0x6c58fc20, 0x3c52a: 0x6c58fe20, 0x3c52b: 0x6c590020, + 0x3c52c: 0x6c7b9c20, 0x3c52d: 0x6c7b9e20, 0x3c52e: 0x6c7ba020, 0x3c52f: 0x6ca48420, + 0x3c530: 0x6cd2b420, 0x3c531: 0x6cd2b620, 0x3c532: 0x6d00ae20, 0x3c533: 0x6d2ea020, + 0x3c534: 0x6d2ea220, 0x3c535: 0x6d2ea420, 0x3c536: 0x6d5bd220, 0x3c537: 0x6d5bd420, + 0x3c538: 0x6daafc20, 0x3c539: 0x6daafe20, 0x3c53a: 0x6de6da20, 0x3c53b: 0x6c593620, + 0x3c53c: 0x6c593820, 0x3c53d: 0x6c7bd020, 0x3c53e: 0x6cd2ea20, 0x3c53f: 0x6cd2ec20, + // Block 0xf15, offset 0x3c540 + 0x3c540: 0x6d00e020, 0x3c541: 0x6d00e220, 0x3c542: 0x6d2ec420, 0x3c543: 0x6d2ec620, + 0x3c544: 0x6d5bf620, 0x3c545: 0x6e104e20, 0x3c546: 0x6c3c6420, 0x3c547: 0x6c594c20, + 0x3c548: 0x6d2eee20, 0x3c549: 0x6d2ef020, 0x3c54a: 0x6c596e20, 0x3c54b: 0x6c597020, + 0x3c54c: 0x6c7c2a20, 0x3c54d: 0x6c7c2c20, 0x3c54e: 0x6ca4ec20, 0x3c54f: 0x6cd32820, + 0x3c550: 0x6cd32a20, 0x3c551: 0x6d012a20, 0x3c552: 0x6d012c20, 0x3c553: 0x6d2f0420, + 0x3c554: 0x6d2f0620, 0x3c555: 0x6d5c2620, 0x3c556: 0x6d86ac20, 0x3c557: 0x6dab4a20, + 0x3c558: 0x6dab4c20, 0x3c559: 0x6dcbbc20, 0x3c55a: 0x6de70a20, 0x3c55b: 0x6e105a20, + 0x3c55c: 0x6e1f1420, 0x3c55d: 0x6e331220, 0x3c55e: 0x6e444020, 0x3c55f: 0x6c3cae20, + 0x3c560: 0x6c3cb020, 0x3c561: 0x6c5a1420, 0x3c562: 0x6c5a1620, 0x3c563: 0x6c5a1820, + 0x3c564: 0x6c7ccc20, 0x3c565: 0x6c7cce20, 0x3c566: 0x6c7cd020, 0x3c567: 0x6c7cd220, + 0x3c568: 0x6ca58a20, 0x3c569: 0x6ca58c20, 0x3c56a: 0x6ca58e20, 0x3c56b: 0x6cd3f020, + 0x3c56c: 0x6cd3f220, 0x3c56d: 0x6d01ee20, 0x3c56e: 0x6d01f020, 0x3c56f: 0x6d01f220, + 0x3c570: 0x6d01f420, 0x3c571: 0x6d2fc620, 0x3c572: 0x6d2fc820, 0x3c573: 0x6d2fca20, + 0x3c574: 0x6d2fcc20, 0x3c575: 0x6d5cca20, 0x3c576: 0x6d5ccc20, 0x3c577: 0x6d5cce20, + 0x3c578: 0x6d5cd020, 0x3c579: 0x6d874c20, 0x3c57a: 0x6d874e20, 0x3c57b: 0x6d875020, + 0x3c57c: 0x6dabe020, 0x3c57d: 0x6dabe220, 0x3c57e: 0x6dabe420, 0x3c57f: 0x6dabe620, + // Block 0xf16, offset 0x3c580 + 0x3c580: 0x6dabe820, 0x3c581: 0x6de75020, 0x3c582: 0x6dfdde20, 0x3c583: 0x6e108420, + 0x3c584: 0x6e108620, 0x3c585: 0x6e444420, 0x3c586: 0x6c5a2220, 0x3c587: 0x6cd40820, + 0x3c588: 0x6c5a3820, 0x3c589: 0x6c5a3a20, 0x3c58a: 0x6ca5cc20, 0x3c58b: 0x6d022e20, + 0x3c58c: 0x6d2ffa20, 0x3c58d: 0x6d5cf420, 0x3c58e: 0x6d5cf620, 0x3c58f: 0x6dfdea20, + 0x3c590: 0x6e108a20, 0x3c591: 0x6c5ab820, 0x3c592: 0x6c5aba20, 0x3c593: 0x6c5abc20, + 0x3c594: 0x6c7db420, 0x3c595: 0x6c7db620, 0x3c596: 0x6c7db820, 0x3c597: 0x6c7dba20, + 0x3c598: 0x6c7dbc20, 0x3c599: 0x6ca68020, 0x3c59a: 0x6ca68220, 0x3c59b: 0x6ca68420, + 0x3c59c: 0x6ca68620, 0x3c59d: 0x6ca68820, 0x3c59e: 0x6cd4ac20, 0x3c59f: 0x6cd4ae20, + 0x3c5a0: 0x6cd4b020, 0x3c5a1: 0x6cd4b220, 0x3c5a2: 0x6cd4b420, 0x3c5a3: 0x6cd4b620, + 0x3c5a4: 0x6d02fc20, 0x3c5a5: 0x6d02fe20, 0x3c5a6: 0x6d030020, 0x3c5a7: 0x6d030220, + 0x3c5a8: 0x6d030420, 0x3c5a9: 0x6d030620, 0x3c5aa: 0x6d30b020, 0x3c5ab: 0x6d30b220, + 0x3c5ac: 0x6d5d8220, 0x3c5ad: 0x6d5d8420, 0x3c5ae: 0x6d5d8620, 0x3c5af: 0x6d87e820, + 0x3c5b0: 0x6d87ea20, 0x3c5b1: 0x6d87ec20, 0x3c5b2: 0x6d87ee20, 0x3c5b3: 0x6d87f020, + 0x3c5b4: 0x6d87f220, 0x3c5b5: 0x6dac9820, 0x3c5b6: 0x6dac9a20, 0x3c5b7: 0x6dac9c20, + 0x3c5b8: 0x6dcc9a20, 0x3c5b9: 0x6dcc9c20, 0x3c5ba: 0x6dcc9e20, 0x3c5bb: 0x6de7a420, + 0x3c5bc: 0x6de7a620, 0x3c5bd: 0x6de7a820, 0x3c5be: 0x6e10ba20, 0x3c5bf: 0x6e2a9e20, + // Block 0xf17, offset 0x3c5c0 + 0x3c5c0: 0x6c256020, 0x3c5c1: 0x6c256220, 0x3c5c2: 0x6c3d2820, 0x3c5c3: 0x6c3d2a20, + 0x3c5c4: 0x6c5b2420, 0x3c5c5: 0x6c5b2620, 0x3c5c6: 0x6c5b2820, 0x3c5c7: 0x6c7e2420, + 0x3c5c8: 0x6c7e2620, 0x3c5c9: 0x6c7e2820, 0x3c5ca: 0x6c7e2a20, 0x3c5cb: 0x6ca6e820, + 0x3c5cc: 0x6ca6ea20, 0x3c5cd: 0x6ca6ec20, 0x3c5ce: 0x6ca6ee20, 0x3c5cf: 0x6ca6f020, + 0x3c5d0: 0x6cd51220, 0x3c5d1: 0x6cd51420, 0x3c5d2: 0x6cd51620, 0x3c5d3: 0x6cd51820, + 0x3c5d4: 0x6cd51a20, 0x3c5d5: 0x6cd51c20, 0x3c5d6: 0x6cd51e20, 0x3c5d7: 0x6cd52020, + 0x3c5d8: 0x6cd52220, 0x3c5d9: 0x6cd52420, 0x3c5da: 0x6d037220, 0x3c5db: 0x6d037420, + 0x3c5dc: 0x6d310c20, 0x3c5dd: 0x6d310e20, 0x3c5de: 0x6d311020, 0x3c5df: 0x6d311220, + 0x3c5e0: 0x6d5dcc20, 0x3c5e1: 0x6d5dce20, 0x3c5e2: 0x6dacc820, 0x3c5e3: 0x6dccbc20, + 0x3c5e4: 0x6e333820, 0x3c5e5: 0x6dccbe20, 0x3c5e6: 0x6c140a20, 0x3c5e7: 0x6c3d6620, + 0x3c5e8: 0x6c5b8e20, 0x3c5e9: 0x6c5b9020, 0x3c5ea: 0x6c7e9e20, 0x3c5eb: 0x6c7ea020, + 0x3c5ec: 0x6c7ea220, 0x3c5ed: 0x6c7ea420, 0x3c5ee: 0x6ca76e20, 0x3c5ef: 0x6ca77020, + 0x3c5f0: 0x6ca77220, 0x3c5f1: 0x6ca77420, 0x3c5f2: 0x6cd59420, 0x3c5f3: 0x6cd59620, + 0x3c5f4: 0x6cd59820, 0x3c5f5: 0x6cd59a20, 0x3c5f6: 0x6cd59c20, 0x3c5f7: 0x6cd59e20, + 0x3c5f8: 0x6cd5a020, 0x3c5f9: 0x6d042220, 0x3c5fa: 0x6d042420, 0x3c5fb: 0x6d042620, + 0x3c5fc: 0x6d31b820, 0x3c5fd: 0x6d31ba20, 0x3c5fe: 0x6d31bc20, 0x3c5ff: 0x6d31be20, + // Block 0xf18, offset 0x3c600 + 0x3c600: 0x6d31c020, 0x3c601: 0x6d5e6220, 0x3c602: 0x6d5e6420, 0x3c603: 0x6d5e6620, + 0x3c604: 0x6d5e6820, 0x3c605: 0x6d88b820, 0x3c606: 0x6dad4020, 0x3c607: 0x6dcd1820, + 0x3c608: 0x6dcd1a20, 0x3c609: 0x6dfe8220, 0x3c60a: 0x6c5bd020, 0x3c60b: 0x6c7ef420, + 0x3c60c: 0x6ca7c020, 0x3c60d: 0x6ca7c220, 0x3c60e: 0x6cd60420, 0x3c60f: 0x6cd60620, + 0x3c610: 0x6cd60820, 0x3c611: 0x6d048020, 0x3c612: 0x6d048220, 0x3c613: 0x6d048420, + 0x3c614: 0x6d320420, 0x3c615: 0x6d320620, 0x3c616: 0x6d5eb420, 0x3c617: 0x6d891820, + 0x3c618: 0x6d891a20, 0x3c619: 0x6d891c20, 0x3c61a: 0x6d891e20, 0x3c61b: 0x6dad8620, + 0x3c61c: 0x6dcd3620, 0x3c61d: 0x6e2ac020, 0x3c61e: 0x6c3d9820, 0x3c61f: 0x6c5bf420, + 0x3c620: 0x6c7f2e20, 0x3c621: 0x6c7f3020, 0x3c622: 0x6ca7e420, 0x3c623: 0x6cd63220, + 0x3c624: 0x6cd63420, 0x3c625: 0x6d04b220, 0x3c626: 0x6d04b420, 0x3c627: 0x6d322a20, + 0x3c628: 0x6d322c20, 0x3c629: 0x6d5ec620, 0x3c62a: 0x6d5ec820, 0x3c62b: 0x6d5eca20, + 0x3c62c: 0x6d892c20, 0x3c62d: 0x6dada420, 0x3c62e: 0x6de81020, 0x3c62f: 0x6e1f8420, + 0x3c630: 0x6c3da620, 0x3c631: 0x6c5c2c20, 0x3c632: 0x6c7f9c20, 0x3c633: 0x6c7f9e20, + 0x3c634: 0x6c7fa020, 0x3c635: 0x6c7fa220, 0x3c636: 0x6c7fa420, 0x3c637: 0x6c7fa620, + 0x3c638: 0x6ca88a20, 0x3c639: 0x6ca88c20, 0x3c63a: 0x6ca88e20, 0x3c63b: 0x6ca89020, + 0x3c63c: 0x6cd6da20, 0x3c63d: 0x6cd6dc20, 0x3c63e: 0x6d058c20, 0x3c63f: 0x6d058e20, + // Block 0xf19, offset 0x3c640 + 0x3c640: 0x6d059020, 0x3c641: 0x6d059220, 0x3c642: 0x6d059420, 0x3c643: 0x6d059620, + 0x3c644: 0x6d332a20, 0x3c645: 0x6d332c20, 0x3c646: 0x6d332e20, 0x3c647: 0x6d333020, + 0x3c648: 0x6d333220, 0x3c649: 0x6d333420, 0x3c64a: 0x6d5fdc20, 0x3c64b: 0x6d5fde20, + 0x3c64c: 0x6d5fe020, 0x3c64d: 0x6d5fe220, 0x3c64e: 0x6d5fe420, 0x3c64f: 0x6d5fe620, + 0x3c650: 0x6d8a4020, 0x3c651: 0x6d8a4220, 0x3c652: 0x6d8a4420, 0x3c653: 0x6d8a4620, + 0x3c654: 0x6d8a4820, 0x3c655: 0x6d8a4a20, 0x3c656: 0x6d8a4c20, 0x3c657: 0x6d8a4e20, + 0x3c658: 0x6daeb420, 0x3c659: 0x6daeb620, 0x3c65a: 0x6daeb820, 0x3c65b: 0x6daeba20, + 0x3c65c: 0x6daebc20, 0x3c65d: 0x6daebe20, 0x3c65e: 0x6daec020, 0x3c65f: 0x6daec220, + 0x3c660: 0x6dce5a20, 0x3c661: 0x6dce5c20, 0x3c662: 0x6dce5e20, 0x3c663: 0x6dce6020, + 0x3c664: 0x6dce6220, 0x3c665: 0x6de8be20, 0x3c666: 0x6de8c020, 0x3c667: 0x6dff1a20, + 0x3c668: 0x6e118220, 0x3c669: 0x6e118420, 0x3c66a: 0x6e118620, 0x3c66b: 0x6e118820, + 0x3c66c: 0x6e1fe020, 0x3c66d: 0x6e2b0220, 0x3c66e: 0x6e337e20, 0x3c66f: 0x6e398220, + 0x3c670: 0x6e42de20, 0x3c671: 0x6c3db620, 0x3c672: 0x6c3db820, 0x3c673: 0x6c5c5a20, + 0x3c674: 0x6c5c5c20, 0x3c675: 0x6c7fe820, 0x3c676: 0x6c7fea20, 0x3c677: 0x6c7fec20, + 0x3c678: 0x6ca8e820, 0x3c679: 0x6ca8ea20, 0x3c67a: 0x6ca8ec20, 0x3c67b: 0x6ca8ee20, + 0x3c67c: 0x6ca8f020, 0x3c67d: 0x6cd73a20, 0x3c67e: 0x6cd73c20, 0x3c67f: 0x6cd73e20, + // Block 0xf1a, offset 0x3c680 + 0x3c680: 0x6cd74020, 0x3c681: 0x6d060220, 0x3c682: 0x6d33ac20, 0x3c683: 0x6d33ae20, + 0x3c684: 0x6d33b020, 0x3c685: 0x6d33b220, 0x3c686: 0x6d605e20, 0x3c687: 0x6d606020, + 0x3c688: 0x6d606220, 0x3c689: 0x6d8aa420, 0x3c68a: 0x6d8aa620, 0x3c68b: 0x6d8aa820, + 0x3c68c: 0x6d8aaa20, 0x3c68d: 0x6daf1a20, 0x3c68e: 0x6daf1c20, 0x3c68f: 0x6dceba20, + 0x3c690: 0x6dcebc20, 0x3c691: 0x6dcebe20, 0x3c692: 0x6de90420, 0x3c693: 0x6de90620, + 0x3c694: 0x6de90820, 0x3c695: 0x6de90a20, 0x3c696: 0x6dff3620, 0x3c697: 0x6e1ffa20, + 0x3c698: 0x6e1ffc20, 0x3c699: 0x6e1ffe20, 0x3c69a: 0x6c3dd220, 0x3c69b: 0x6c3dd420, + 0x3c69c: 0x6c5c9420, 0x3c69d: 0x6c5c9620, 0x3c69e: 0x6c809a20, 0x3c69f: 0x6ca99820, + 0x3c6a0: 0x6ca99a20, 0x3c6a1: 0x6ca99c20, 0x3c6a2: 0x6cd80620, 0x3c6a3: 0x6cd80820, + 0x3c6a4: 0x6cd80a20, 0x3c6a5: 0x6d06c220, 0x3c6a6: 0x6d06c420, 0x3c6a7: 0x6d06c620, + 0x3c6a8: 0x6d06c820, 0x3c6a9: 0x6d06ca20, 0x3c6aa: 0x6d34b420, 0x3c6ab: 0x6d34b620, + 0x3c6ac: 0x6d34b820, 0x3c6ad: 0x6d34ba20, 0x3c6ae: 0x6d34bc20, 0x3c6af: 0x6d34be20, + 0x3c6b0: 0x6d34c020, 0x3c6b1: 0x6d34c220, 0x3c6b2: 0x6d34c420, 0x3c6b3: 0x6d617020, + 0x3c6b4: 0x6d617220, 0x3c6b5: 0x6d617420, 0x3c6b6: 0x6d617620, 0x3c6b7: 0x6d617820, + 0x3c6b8: 0x6d8b8a20, 0x3c6b9: 0x6d8b8c20, 0x3c6ba: 0x6d8b8e20, 0x3c6bb: 0x6d8b9020, + 0x3c6bc: 0x6d8b9220, 0x3c6bd: 0x6dafe220, 0x3c6be: 0x6dafe420, 0x3c6bf: 0x6dafe620, + // Block 0xf1b, offset 0x3c6c0 + 0x3c6c0: 0x6dafe820, 0x3c6c1: 0x6dcf7220, 0x3c6c2: 0x6dcf7420, 0x3c6c3: 0x6dcf7620, + 0x3c6c4: 0x6dcf7820, 0x3c6c5: 0x6de99220, 0x3c6c6: 0x6de99420, 0x3c6c7: 0x6de99620, + 0x3c6c8: 0x6de99820, 0x3c6c9: 0x6de99a20, 0x3c6ca: 0x6de99c20, 0x3c6cb: 0x6de99e20, + 0x3c6cc: 0x6dff8a20, 0x3c6cd: 0x6dff8c20, 0x3c6ce: 0x6dff8e20, 0x3c6cf: 0x6e11fa20, + 0x3c6d0: 0x6e11fc20, 0x3c6d1: 0x6e11fe20, 0x3c6d2: 0x6e203420, 0x3c6d3: 0x6e203620, + 0x3c6d4: 0x6e203820, 0x3c6d5: 0x6e2b3020, 0x3c6d6: 0x6e39a620, 0x3c6d7: 0x6e3dd220, + 0x3c6d8: 0x6e40b420, 0x3c6d9: 0x6c050220, 0x3c6da: 0x6c25c420, 0x3c6db: 0x6c25c620, + 0x3c6dc: 0x6c25c820, 0x3c6dd: 0x6c25ca20, 0x3c6de: 0x6c3dfc20, 0x3c6df: 0x6c3dfe20, + 0x3c6e0: 0x6c5cba20, 0x3c6e1: 0x6c5cbc20, 0x3c6e2: 0x6c5cbe20, 0x3c6e3: 0x6c5cc020, + 0x3c6e4: 0x6c80b620, 0x3c6e5: 0x6c80b820, 0x3c6e6: 0x6c80ba20, 0x3c6e7: 0x6c80bc20, + 0x3c6e8: 0x6c80be20, 0x3c6e9: 0x6c80c020, 0x3c6ea: 0x6ca9dc20, 0x3c6eb: 0x6ca9de20, + 0x3c6ec: 0x6cd84a20, 0x3c6ed: 0x6cd84c20, 0x3c6ee: 0x6cd84e20, 0x3c6ef: 0x6d06ee20, + 0x3c6f0: 0x6d06f020, 0x3c6f1: 0x6d34d820, 0x3c6f2: 0x6d34da20, 0x3c6f3: 0x6d34dc20, + 0x3c6f4: 0x6d34de20, 0x3c6f5: 0x6d618e20, 0x3c6f6: 0x6d619020, 0x3c6f7: 0x6d8ba420, + 0x3c6f8: 0x6daff020, 0x3c6f9: 0x6e120020, 0x3c6fa: 0x6d06fa20, 0x3c6fb: 0x6d34fa20, + 0x3c6fc: 0x6d61a020, 0x3c6fd: 0x6d61a220, 0x3c6fe: 0x6d8bb820, 0x3c6ff: 0x6de9b220, + // Block 0xf1c, offset 0x3c700 + 0x3c700: 0x6c3e1e20, 0x3c701: 0x6c5cf420, 0x3c702: 0x6c812020, 0x3c703: 0x6caa2420, + 0x3c704: 0x6caa2620, 0x3c705: 0x6caa2820, 0x3c706: 0x6d074220, 0x3c707: 0x6d074420, + 0x3c708: 0x6d352c20, 0x3c709: 0x6d61c820, 0x3c70a: 0x6d8bf020, 0x3c70b: 0x6dcfa620, + 0x3c70c: 0x6de9d420, 0x3c70d: 0x6e120e20, 0x3c70e: 0x6c3e2c20, 0x3c70f: 0x6caa6620, + 0x3c710: 0x6caa6820, 0x3c711: 0x6caa6a20, 0x3c712: 0x6caa6c20, 0x3c713: 0x6cd8a620, + 0x3c714: 0x6cd8a820, 0x3c715: 0x6d077a20, 0x3c716: 0x6d61f020, 0x3c717: 0x6d61f220, + 0x3c718: 0x6d61f420, 0x3c719: 0x6d8c0a20, 0x3c71a: 0x6db04a20, 0x3c71b: 0x6db04c20, + 0x3c71c: 0x6db04e20, 0x3c71d: 0x6dcfd420, 0x3c71e: 0x6dcfd620, 0x3c71f: 0x6dffb020, + 0x3c720: 0x6e204820, 0x3c721: 0x6e204a20, 0x3c722: 0x6c5d2c20, 0x3c723: 0x6c818e20, + 0x3c724: 0x6caab020, 0x3c725: 0x6cd8ec20, 0x3c726: 0x6cd8ee20, 0x3c727: 0x6cd8f020, + 0x3c728: 0x6d07a620, 0x3c729: 0x6d07a820, 0x3c72a: 0x6d358a20, 0x3c72b: 0x6d623820, + 0x3c72c: 0x6d623a20, 0x3c72d: 0x6d8c3e20, 0x3c72e: 0x6d8c4020, 0x3c72f: 0x6db07020, + 0x3c730: 0x6dd00820, 0x3c731: 0x6dd00a20, 0x3c732: 0x6e205420, 0x3c733: 0x6c81a020, + 0x3c734: 0x6c81a220, 0x3c735: 0x6d07ac20, 0x3c736: 0x6d359020, 0x3c737: 0x6d624020, + 0x3c738: 0x6dd00e20, 0x3c739: 0x6caace20, 0x3c73a: 0x6cd90a20, 0x3c73b: 0x6cd90c20, + 0x3c73c: 0x6d07be20, 0x3c73d: 0x6d626620, 0x3c73e: 0x6d8c6020, 0x3c73f: 0x6dd02820, + // Block 0xf1d, offset 0x3c740 + 0x3c740: 0x6c3e5820, 0x3c741: 0x6c81f820, 0x3c742: 0x6cd94820, 0x3c743: 0x6cd94a20, + 0x3c744: 0x6d07f620, 0x3c745: 0x6d07f820, 0x3c746: 0x6d07fa20, 0x3c747: 0x6d360a20, + 0x3c748: 0x6d360c20, 0x3c749: 0x6d62b420, 0x3c74a: 0x6d8c9220, 0x3c74b: 0x6d8c9420, + 0x3c74c: 0x6d8c9620, 0x3c74d: 0x6d8c9820, 0x3c74e: 0x6db0c820, 0x3c74f: 0x6db0ca20, + 0x3c750: 0x6dd05a20, 0x3c751: 0x6dd05c20, 0x3c752: 0x6dea1a20, 0x3c753: 0x6e42ea20, + 0x3c754: 0x6d080820, 0x3c755: 0x6d361820, 0x3c756: 0x6c3f1420, 0x3c757: 0x6c3f1620, + 0x3c758: 0x6c3f1820, 0x3c759: 0x6c5e3020, 0x3c75a: 0x6c5e3220, 0x3c75b: 0x6c5e3420, + 0x3c75c: 0x6c5e3620, 0x3c75d: 0x6c82ce20, 0x3c75e: 0x6c82d020, 0x3c75f: 0x6cabd620, + 0x3c760: 0x6cabd820, 0x3c761: 0x6cabda20, 0x3c762: 0x6cda6620, 0x3c763: 0x6cda6820, + 0x3c764: 0x6cda6a20, 0x3c765: 0x6cda6c20, 0x3c766: 0x6d08f220, 0x3c767: 0x6d08f420, + 0x3c768: 0x6d08f620, 0x3c769: 0x6d36d620, 0x3c76a: 0x6d36d820, 0x3c76b: 0x6d36da20, + 0x3c76c: 0x6d36dc20, 0x3c76d: 0x6d36de20, 0x3c76e: 0x6d36e020, 0x3c76f: 0x6d634a20, + 0x3c770: 0x6d634c20, 0x3c771: 0x6d634e20, 0x3c772: 0x6d635020, 0x3c773: 0x6d635220, + 0x3c774: 0x6d635420, 0x3c775: 0x6d8d5020, 0x3c776: 0x6d8d5220, 0x3c777: 0x6d8d5420, + 0x3c778: 0x6d8d5620, 0x3c779: 0x6db15e20, 0x3c77a: 0x6db16020, 0x3c77b: 0x6db16220, + 0x3c77c: 0x6dd0ac20, 0x3c77d: 0x6dd0ae20, 0x3c77e: 0x6dea6420, 0x3c77f: 0x6dea6620, + // Block 0xf1e, offset 0x3c780 + 0x3c780: 0x6e001420, 0x3c781: 0x6e125820, 0x3c782: 0x6e207c20, 0x3c783: 0x6e2b6220, + 0x3c784: 0x6e454220, 0x3c785: 0x6c82da20, 0x3c786: 0x6cda7a20, 0x3c787: 0x6d08f820, + 0x3c788: 0x6d36ec20, 0x3c789: 0x6dd0b620, 0x3c78a: 0x6cda8a20, 0x3c78b: 0x6d636820, + 0x3c78c: 0x6dd0ba20, 0x3c78d: 0x6e3de620, 0x3c78e: 0x6d090020, 0x3c78f: 0x6d36fc20, + 0x3c790: 0x6d36fe20, 0x3c791: 0x6e001e20, 0x3c792: 0x6dd0d020, 0x3c793: 0x6e3dea20, + 0x3c794: 0x6c3f3220, 0x3c795: 0x6d091820, 0x3c796: 0x6d091a20, 0x3c797: 0x6d8d9420, + 0x3c798: 0x6dea8420, 0x3c799: 0x6e208420, 0x3c79a: 0x6c5e7620, 0x3c79b: 0x6d377220, + 0x3c79c: 0x6d63e020, 0x3c79d: 0x6d63e220, 0x3c79e: 0x6db1ba20, 0x3c79f: 0x6dd11620, + 0x3c7a0: 0x6e004820, 0x3c7a1: 0x6e209620, 0x3c7a2: 0x6e209820, 0x3c7a3: 0x6e209a20, + 0x3c7a4: 0x6d8dd820, 0x3c7a5: 0x6c14c620, 0x3c7a6: 0x6c14c820, 0x3c7a7: 0x6c268420, + 0x3c7a8: 0x6c268620, 0x3c7a9: 0x6c400220, 0x3c7aa: 0x6c400420, 0x3c7ab: 0x6c400620, + 0x3c7ac: 0x6c400820, 0x3c7ad: 0x6c400a20, 0x3c7ae: 0x6c5f7e20, 0x3c7af: 0x6c5f8020, + 0x3c7b0: 0x6c5f8220, 0x3c7b1: 0x6c5f8420, 0x3c7b2: 0x6c5f8620, 0x3c7b3: 0x6c5f8820, + 0x3c7b4: 0x6c5f8a20, 0x3c7b5: 0x6c5f8c20, 0x3c7b6: 0x6c84b020, 0x3c7b7: 0x6c84b220, + 0x3c7b8: 0x6c84b420, 0x3c7b9: 0x6c84b620, 0x3c7ba: 0x6c84b820, 0x3c7bb: 0x6c84ba20, + 0x3c7bc: 0x6c84bc20, 0x3c7bd: 0x6c84be20, 0x3c7be: 0x6c84c020, 0x3c7bf: 0x6cadf420, + // Block 0xf1f, offset 0x3c7c0 + 0x3c7c0: 0x6cadf620, 0x3c7c1: 0x6cadf820, 0x3c7c2: 0x6cadfa20, 0x3c7c3: 0x6cadfc20, + 0x3c7c4: 0x6cadfe20, 0x3c7c5: 0x6cae0020, 0x3c7c6: 0x6cae0220, 0x3c7c7: 0x6cae0420, + 0x3c7c8: 0x6cae0620, 0x3c7c9: 0x6cae0820, 0x3c7ca: 0x6cae0a20, 0x3c7cb: 0x6cae0c20, + 0x3c7cc: 0x6cae0e20, 0x3c7cd: 0x6cae1020, 0x3c7ce: 0x6cae1220, 0x3c7cf: 0x6cae1420, + 0x3c7d0: 0x6cdd2220, 0x3c7d1: 0x6cdd2420, 0x3c7d2: 0x6cdd2620, 0x3c7d3: 0x6cdd2820, + 0x3c7d4: 0x6cdd2a20, 0x3c7d5: 0x6cdd2c20, 0x3c7d6: 0x6cdd2e20, 0x3c7d7: 0x6cdd3020, + 0x3c7d8: 0x6cdd3220, 0x3c7d9: 0x6cdd3420, 0x3c7da: 0x6cdd3620, 0x3c7db: 0x6cdd3820, + 0x3c7dc: 0x6cdd3a20, 0x3c7dd: 0x6cdd3c20, 0x3c7de: 0x6cdd3e20, 0x3c7df: 0x6cdd4020, + 0x3c7e0: 0x6cdd4220, 0x3c7e1: 0x6d0b8c20, 0x3c7e2: 0x6d0b8e20, 0x3c7e3: 0x6d0b9020, + 0x3c7e4: 0x6d0b9220, 0x3c7e5: 0x6d0b9420, 0x3c7e6: 0x6d0b9620, 0x3c7e7: 0x6d0b9820, + 0x3c7e8: 0x6d0b9a20, 0x3c7e9: 0x6d0b9c20, 0x3c7ea: 0x6d0b9e20, 0x3c7eb: 0x6d0ba020, + 0x3c7ec: 0x6d0ba220, 0x3c7ed: 0x6d0ba420, 0x3c7ee: 0x6d0ba620, 0x3c7ef: 0x6d0ba820, + 0x3c7f0: 0x6cdd4620, 0x3c7f1: 0x6d0baa20, 0x3c7f2: 0x6d0bac20, 0x3c7f3: 0x6d0bae20, + 0x3c7f4: 0x6d0bb020, 0x3c7f5: 0x6d0bb220, 0x3c7f6: 0x6d399220, 0x3c7f7: 0x6d399420, + 0x3c7f8: 0x6d399620, 0x3c7f9: 0x6d399820, 0x3c7fa: 0x6d399a20, 0x3c7fb: 0x6d399c20, + 0x3c7fc: 0x6d399e20, 0x3c7fd: 0x6d39a020, 0x3c7fe: 0x6d39a220, 0x3c7ff: 0x6d39a420, + // Block 0xf20, offset 0x3c800 + 0x3c800: 0x6d39a620, 0x3c801: 0x6d39a820, 0x3c802: 0x6d39aa20, 0x3c803: 0x6d39ac20, + 0x3c804: 0x6d39ae20, 0x3c805: 0x6d39b020, 0x3c806: 0x6d39b220, 0x3c807: 0x6d39b420, + 0x3c808: 0x6d65c420, 0x3c809: 0x6d65c620, 0x3c80a: 0x6d65c820, 0x3c80b: 0x6d65ca20, + 0x3c80c: 0x6d65cc20, 0x3c80d: 0x6d65ce20, 0x3c80e: 0x6d65d020, 0x3c80f: 0x6d65d220, + 0x3c810: 0x6d65d420, 0x3c811: 0x6d65d620, 0x3c812: 0x6d65d820, 0x3c813: 0x6d65da20, + 0x3c814: 0x6d65dc20, 0x3c815: 0x6d65de20, 0x3c816: 0x6d65e020, 0x3c817: 0x6d65e220, + 0x3c818: 0x6d65e420, 0x3c819: 0x6d65e620, 0x3c81a: 0x6d65e820, 0x3c81b: 0x6d65ea20, + 0x3c81c: 0x6d65ec20, 0x3c81d: 0x6d8fb220, 0x3c81e: 0x6d8fb420, 0x3c81f: 0x6d8fb620, + 0x3c820: 0x6d8fb820, 0x3c821: 0x6d8fba20, 0x3c822: 0x6d8fbc20, 0x3c823: 0x6d8fbe20, + 0x3c824: 0x6d8fc020, 0x3c825: 0x6db37420, 0x3c826: 0x6db37620, 0x3c827: 0x6db37820, + 0x3c828: 0x6db37a20, 0x3c829: 0x6db37c20, 0x3c82a: 0x6db37e20, 0x3c82b: 0x6db38020, + 0x3c82c: 0x6db38220, 0x3c82d: 0x6db38420, 0x3c82e: 0x6db38620, 0x3c82f: 0x6db38820, + 0x3c830: 0x6db38a20, 0x3c831: 0x6db38c20, 0x3c832: 0x6db38e20, 0x3c833: 0x6db39020, + 0x3c834: 0x6db39220, 0x3c835: 0x6dd27620, 0x3c836: 0x6dd27820, 0x3c837: 0x6dd27a20, + 0x3c838: 0x6dd27c20, 0x3c839: 0x6dd27e20, 0x3c83a: 0x6dd28020, 0x3c83b: 0x6dd28220, + 0x3c83c: 0x6dd28420, 0x3c83d: 0x6dd28620, 0x3c83e: 0x6dd28820, 0x3c83f: 0x6dd28a20, + // Block 0xf21, offset 0x3c840 + 0x3c840: 0x6dd28c20, 0x3c841: 0x6dd28e20, 0x3c842: 0x6dd29020, 0x3c843: 0x6dd29220, + 0x3c844: 0x6dd29420, 0x3c845: 0x6debc020, 0x3c846: 0x6debc220, 0x3c847: 0x6debc420, + 0x3c848: 0x6debc620, 0x3c849: 0x6debc820, 0x3c84a: 0x6debca20, 0x3c84b: 0x6debcc20, + 0x3c84c: 0x6e014c20, 0x3c84d: 0x6e014e20, 0x3c84e: 0x6e015020, 0x3c84f: 0x6e015220, + 0x3c850: 0x6e133820, 0x3c851: 0x6e133a20, 0x3c852: 0x6e133c20, 0x3c853: 0x6e133e20, + 0x3c854: 0x6e211820, 0x3c855: 0x6e211a20, 0x3c856: 0x6e211c20, 0x3c857: 0x6e2bd420, + 0x3c858: 0x6e342020, 0x3c859: 0x6e342220, 0x3c85a: 0x6e342420, 0x3c85b: 0x6e3e0e20, + 0x3c85c: 0x6e3e1020, 0x3c85d: 0x6c5f9e20, 0x3c85e: 0x6c5fa020, 0x3c85f: 0x6c84dc20, + 0x3c860: 0x6cdd6220, 0x3c861: 0x6cdd6420, 0x3c862: 0x6d39da20, 0x3c863: 0x6db3b220, + 0x3c864: 0x6c403420, 0x3c865: 0x6c5ff220, 0x3c866: 0x6c5ff420, 0x3c867: 0x6c857820, + 0x3c868: 0x6c857a20, 0x3c869: 0x6c857c20, 0x3c86a: 0x6c857e20, 0x3c86b: 0x6c858020, + 0x3c86c: 0x6caf0c20, 0x3c86d: 0x6caf0e20, 0x3c86e: 0x6caf1020, 0x3c86f: 0x6caf1220, + 0x3c870: 0x6caf1420, 0x3c871: 0x6caf1620, 0x3c872: 0x6caf1820, 0x3c873: 0x6cde3020, + 0x3c874: 0x6cde3220, 0x3c875: 0x6cde3420, 0x3c876: 0x6cde3620, 0x3c877: 0x6cde3820, + 0x3c878: 0x6cde3a20, 0x3c879: 0x6cde3c20, 0x3c87a: 0x6cde3e20, 0x3c87b: 0x6cde4020, + 0x3c87c: 0x6cde4220, 0x3c87d: 0x6d0cb020, 0x3c87e: 0x6d0cb220, 0x3c87f: 0x6d0cb420, + // Block 0xf22, offset 0x3c880 + 0x3c880: 0x6d0cb620, 0x3c881: 0x6d0cb820, 0x3c882: 0x6d3afc20, 0x3c883: 0x6d3afe20, + 0x3c884: 0x6d3b0020, 0x3c885: 0x6d3b0220, 0x3c886: 0x6d3b0420, 0x3c887: 0x6d3b0620, + 0x3c888: 0x6d3b0820, 0x3c889: 0x6d3b0a20, 0x3c88a: 0x6d672e20, 0x3c88b: 0x6d673020, + 0x3c88c: 0x6d673220, 0x3c88d: 0x6d673420, 0x3c88e: 0x6d673620, 0x3c88f: 0x6d910820, + 0x3c890: 0x6d910a20, 0x3c891: 0x6d910c20, 0x3c892: 0x6d910e20, 0x3c893: 0x6d911020, + 0x3c894: 0x6d911220, 0x3c895: 0x6d911420, 0x3c896: 0x6db4be20, 0x3c897: 0x6db4c020, + 0x3c898: 0x6db4c220, 0x3c899: 0x6db4c420, 0x3c89a: 0x6dd38e20, 0x3c89b: 0x6dd39020, + 0x3c89c: 0x6dd39220, 0x3c89d: 0x6dd39420, 0x3c89e: 0x6dd39620, 0x3c89f: 0x6dec9c20, + 0x3c8a0: 0x6dec9e20, 0x3c8a1: 0x6deca020, 0x3c8a2: 0x6deca220, 0x3c8a3: 0x6e01d420, + 0x3c8a4: 0x6e01d620, 0x3c8a5: 0x6e01d820, 0x3c8a6: 0x6e13c220, 0x3c8a7: 0x6e13c420, + 0x3c8a8: 0x6e218420, 0x3c8a9: 0x6e447620, 0x3c8aa: 0x6c859220, 0x3c8ab: 0x6caf2420, + 0x3c8ac: 0x6db4ce20, 0x3c8ad: 0x6caf3220, 0x3c8ae: 0x6cde6820, 0x3c8af: 0x6d675420, + 0x3c8b0: 0x6dd3a820, 0x3c8b1: 0x6e2c2020, 0x3c8b2: 0x6c605e20, 0x3c8b3: 0x6c606020, + 0x3c8b4: 0x6c606220, 0x3c8b5: 0x6c861c20, 0x3c8b6: 0x6c861e20, 0x3c8b7: 0x6c862020, + 0x3c8b8: 0x6cafd820, 0x3c8b9: 0x6cafda20, 0x3c8ba: 0x6cafdc20, 0x3c8bb: 0x6cafde20, + 0x3c8bc: 0x6cafe020, 0x3c8bd: 0x6cdef420, 0x3c8be: 0x6d0d6820, 0x3c8bf: 0x6d0d6a20, + // Block 0xf23, offset 0x3c8c0 + 0x3c8c0: 0x6d0d6c20, 0x3c8c1: 0x6d0d6e20, 0x3c8c2: 0x6d0d7020, 0x3c8c3: 0x6d0d7220, + 0x3c8c4: 0x6d0d7420, 0x3c8c5: 0x6d3bd820, 0x3c8c6: 0x6d3bda20, 0x3c8c7: 0x6d67ec20, + 0x3c8c8: 0x6d67ee20, 0x3c8c9: 0x6d67f020, 0x3c8ca: 0x6d91ae20, 0x3c8cb: 0x6d91b020, + 0x3c8cc: 0x6d91b220, 0x3c8cd: 0x6d91b420, 0x3c8ce: 0x6d91b620, 0x3c8cf: 0x6d91b820, + 0x3c8d0: 0x6db57820, 0x3c8d1: 0x6db57a20, 0x3c8d2: 0x6db57c20, 0x3c8d3: 0x6dd40a20, + 0x3c8d4: 0x6dd40c20, 0x3c8d5: 0x6decfc20, 0x3c8d6: 0x6e021620, 0x3c8d7: 0x6e21a020, + 0x3c8d8: 0x6e2c3420, 0x3c8d9: 0x6e2c3620, 0x3c8da: 0x6cafec20, 0x3c8db: 0x6d91c020, + 0x3c8dc: 0x6c863c20, 0x3c8dd: 0x6cdf3220, 0x3c8de: 0x6d0daa20, 0x3c8df: 0x6d3c1a20, + 0x3c8e0: 0x6d3c1c20, 0x3c8e1: 0x6d683020, 0x3c8e2: 0x6d91fe20, 0x3c8e3: 0x6d920020, + 0x3c8e4: 0x6dd43420, 0x3c8e5: 0x6e022c20, 0x3c8e6: 0x6e3a3220, 0x3c8e7: 0x6e3a3420, + 0x3c8e8: 0x6c607820, 0x3c8e9: 0x6c607a20, 0x3c8ea: 0x6c864020, 0x3c8eb: 0x6d0dae20, + 0x3c8ec: 0x6d683820, 0x3c8ed: 0x6db5a620, 0x3c8ee: 0x6d0dd820, 0x3c8ef: 0x6d0dda20, + 0x3c8f0: 0x6d922e20, 0x3c8f1: 0x6d923020, 0x3c8f2: 0x6c868c20, 0x3c8f3: 0x6c868e20, + 0x3c8f4: 0x6cb10620, 0x3c8f5: 0x6cb10820, 0x3c8f6: 0x6ce02420, 0x3c8f7: 0x6ce02620, + 0x3c8f8: 0x6ce02820, 0x3c8f9: 0x6ce02a20, 0x3c8fa: 0x6d0eae20, 0x3c8fb: 0x6d0eb020, + 0x3c8fc: 0x6d3d0020, 0x3c8fd: 0x6d3d0220, 0x3c8fe: 0x6d3d0420, 0x3c8ff: 0x6d697220, + // Block 0xf24, offset 0x3c900 + 0x3c900: 0x6d697420, 0x3c901: 0x6d92f220, 0x3c902: 0x6d92f420, 0x3c903: 0x6d92f620, + 0x3c904: 0x6d92f820, 0x3c905: 0x6d92fa20, 0x3c906: 0x6db69220, 0x3c907: 0x6db69420, + 0x3c908: 0x6db69620, 0x3c909: 0x6dd4f220, 0x3c90a: 0x6dd4f420, 0x3c90b: 0x6dd4f620, + 0x3c90c: 0x6dd4f820, 0x3c90d: 0x6dedda20, 0x3c90e: 0x6deddc20, 0x3c90f: 0x6dedde20, + 0x3c910: 0x6e02b220, 0x3c911: 0x6e02b420, 0x3c912: 0x6e146a20, 0x3c913: 0x6e2c7420, + 0x3c914: 0x6e34a220, 0x3c915: 0x6e34a420, 0x3c916: 0x6e34a620, 0x3c917: 0x6e3e4220, + 0x3c918: 0x6e431c20, 0x3c919: 0x6c0a7c20, 0x3c91a: 0x6c14fa20, 0x3c91b: 0x6c14fc20, + 0x3c91c: 0x6c26d820, 0x3c91d: 0x6c26da20, 0x3c91e: 0x6c26dc20, 0x3c91f: 0x6c26de20, + 0x3c920: 0x6c26e020, 0x3c921: 0x6c26e220, 0x3c922: 0x6c40ac20, 0x3c923: 0x6c40ae20, + 0x3c924: 0x6c40b020, 0x3c925: 0x6c40b220, 0x3c926: 0x6c40b420, 0x3c927: 0x6c60b620, + 0x3c928: 0x6c60b820, 0x3c929: 0x6c60ba20, 0x3c92a: 0x6c60bc20, 0x3c92b: 0x6c86b820, + 0x3c92c: 0x6c86ba20, 0x3c92d: 0x6c86bc20, 0x3c92e: 0x6c86be20, 0x3c92f: 0x6cb13420, + 0x3c930: 0x6cb13620, 0x3c931: 0x6cb13820, 0x3c932: 0x6cb13a20, 0x3c933: 0x6cb13c20, + 0x3c934: 0x6cb13e20, 0x3c935: 0x6ce03e20, 0x3c936: 0x6ce04020, 0x3c937: 0x6ce04220, + 0x3c938: 0x6ce04420, 0x3c939: 0x6d0ebe20, 0x3c93a: 0x6d0ec020, 0x3c93b: 0x6d3d1220, + 0x3c93c: 0x6d3d1420, 0x3c93d: 0x6d698220, 0x3c93e: 0x6d92fe20, 0x3c93f: 0x6db69c20, + // Block 0xf25, offset 0x3c940 + 0x3c940: 0x6c60c020, 0x3c941: 0x6cb14e20, 0x3c942: 0x6d699420, 0x3c943: 0x6d69b220, + 0x3c944: 0x6dd51220, 0x3c945: 0x6c40bc20, 0x3c946: 0x6cb17620, 0x3c947: 0x6d3d4a20, + 0x3c948: 0x6d3d4c20, 0x3c949: 0x6d933e20, 0x3c94a: 0x6c86ee20, 0x3c94b: 0x6d0f2420, + 0x3c94c: 0x6d936620, 0x3c94d: 0x6db70220, 0x3c94e: 0x6c60da20, 0x3c94f: 0x6c870a20, + 0x3c950: 0x6c870c20, 0x3c951: 0x6c870e20, 0x3c952: 0x6cb1d820, 0x3c953: 0x6cb1da20, + 0x3c954: 0x6ce11420, 0x3c955: 0x6ce11620, 0x3c956: 0x6d0f8e20, 0x3c957: 0x6d3dbc20, + 0x3c958: 0x6d3dbe20, 0x3c959: 0x6d3dc020, 0x3c95a: 0x6d6a6820, 0x3c95b: 0x6d6a6a20, + 0x3c95c: 0x6d93b820, 0x3c95d: 0x6d93ba20, 0x3c95e: 0x6d93bc20, 0x3c95f: 0x6db73c20, + 0x3c960: 0x6db73e20, 0x3c961: 0x6dd59220, 0x3c962: 0x6dee7a20, 0x3c963: 0x6e225420, + 0x3c964: 0x6e225620, 0x3c965: 0x6e2ca420, 0x3c966: 0x6c60f620, 0x3c967: 0x6c60f820, + 0x3c968: 0x6cb1e620, 0x3c969: 0x6ce13420, 0x3c96a: 0x6d0f9620, 0x3c96b: 0x6d93ca20, + 0x3c96c: 0x6dd59420, 0x3c96d: 0x6ce13c20, 0x3c96e: 0x6d0fa620, 0x3c96f: 0x6d6a8020, + 0x3c970: 0x6dd59a20, 0x3c971: 0x6cb23c20, 0x3c972: 0x6ce19a20, 0x3c973: 0x6d100420, + 0x3c974: 0x6d100620, 0x3c975: 0x6d3e3420, 0x3c976: 0x6d3e3620, 0x3c977: 0x6d3e3820, + 0x3c978: 0x6d6ad420, 0x3c979: 0x6d6ad620, 0x3c97a: 0x6d6ad820, 0x3c97b: 0x6d942e20, + 0x3c97c: 0x6d943020, 0x3c97d: 0x6db78220, 0x3c97e: 0x6dd5d820, 0x3c97f: 0x6dd5da20, + // Block 0xf26, offset 0x3c980 + 0x3c980: 0x6c877e20, 0x3c981: 0x6cb2a420, 0x3c982: 0x6cb2a620, 0x3c983: 0x6cb2a820, + 0x3c984: 0x6ce23420, 0x3c985: 0x6ce23620, 0x3c986: 0x6ce23820, 0x3c987: 0x6d10a620, + 0x3c988: 0x6d10a820, 0x3c989: 0x6d10aa20, 0x3c98a: 0x6d10ac20, 0x3c98b: 0x6d10ae20, + 0x3c98c: 0x6d3edc20, 0x3c98d: 0x6d3ede20, 0x3c98e: 0x6d3ee020, 0x3c98f: 0x6d6b8e20, + 0x3c990: 0x6d6b9020, 0x3c991: 0x6d6b9220, 0x3c992: 0x6d6b9420, 0x3c993: 0x6d6b9620, + 0x3c994: 0x6d94d820, 0x3c995: 0x6d94da20, 0x3c996: 0x6d94dc20, 0x3c997: 0x6d94de20, + 0x3c998: 0x6d94e020, 0x3c999: 0x6db81020, 0x3c99a: 0x6db81220, 0x3c99b: 0x6db81420, + 0x3c99c: 0x6dd6a220, 0x3c99d: 0x6dd6a420, 0x3c99e: 0x6dd6a620, 0x3c99f: 0x6dd6a820, + 0x3c9a0: 0x6def6020, 0x3c9a1: 0x6def6220, 0x3c9a2: 0x6def6420, 0x3c9a3: 0x6e039220, + 0x3c9a4: 0x6e039420, 0x3c9a5: 0x6e039620, 0x3c9a6: 0x6e039820, 0x3c9a7: 0x6e150220, + 0x3c9a8: 0x6e150420, 0x3c9a9: 0x6e2ce620, 0x3c9aa: 0x6d10dc20, 0x3c9ab: 0x6d10de20, + 0x3c9ac: 0x6d3f0020, 0x3c9ad: 0x6db83220, 0x3c9ae: 0x6db83420, 0x3c9af: 0x6dd6be20, + 0x3c9b0: 0x6def9020, 0x3c9b1: 0x6e03aa20, 0x3c9b2: 0x6c87b620, 0x3c9b3: 0x6cb33620, + 0x3c9b4: 0x6ce2d420, 0x3c9b5: 0x6ce2d620, 0x3c9b6: 0x6d3f5820, 0x3c9b7: 0x6d3f5a20, + 0x3c9b8: 0x6d3f5c20, 0x3c9b9: 0x6d6c4c20, 0x3c9ba: 0x6d956c20, 0x3c9bb: 0x6d956e20, + 0x3c9bc: 0x6db89620, 0x3c9bd: 0x6db89820, 0x3c9be: 0x6dd71220, 0x3c9bf: 0x6dd71420, + // Block 0xf27, offset 0x3c9c0 + 0x3c9c0: 0x6defc620, 0x3c9c1: 0x6e03e820, 0x3c9c2: 0x6e153420, 0x3c9c3: 0x6e469220, + 0x3c9c4: 0x6c271620, 0x3c9c5: 0x6c271820, 0x3c9c6: 0x6c271a20, 0x3c9c7: 0x6c40f420, + 0x3c9c8: 0x6c615e20, 0x3c9c9: 0x6c616020, 0x3c9ca: 0x6c616220, 0x3c9cb: 0x6c87cc20, + 0x3c9cc: 0x6c87ce20, 0x3c9cd: 0x6cb34020, 0x3c9ce: 0x6ce2e820, 0x3c9cf: 0x6ce2ea20, + 0x3c9d0: 0x6ce2ec20, 0x3c9d1: 0x6ce2ee20, 0x3c9d2: 0x6d114a20, 0x3c9d3: 0x6c87d020, + 0x3c9d4: 0x6d3f6420, 0x3c9d5: 0x6d6c5020, 0x3c9d6: 0x6d6c5220, 0x3c9d7: 0x6d957620, + 0x3c9d8: 0x6db89a20, 0x3c9d9: 0x6defc820, 0x3c9da: 0x6ce2f820, 0x3c9db: 0x6d115a20, + 0x3c9dc: 0x6d115c20, 0x3c9dd: 0x6e03f620, 0x3c9de: 0x6c052020, 0x3c9df: 0x6c153820, + 0x3c9e0: 0x6c278620, 0x3c9e1: 0x6c278820, 0x3c9e2: 0x6c417620, 0x3c9e3: 0x6c417820, + 0x3c9e4: 0x6c417a20, 0x3c9e5: 0x6c61d020, 0x3c9e6: 0x6c886020, 0x3c9e7: 0x6c886220, + 0x3c9e8: 0x6c886420, 0x3c9e9: 0x6c886620, 0x3c9ea: 0x6c886820, 0x3c9eb: 0x6cb3ec20, + 0x3c9ec: 0x6cb3ee20, 0x3c9ed: 0x6cb3f020, 0x3c9ee: 0x6cb3f220, 0x3c9ef: 0x6cb3f420, + 0x3c9f0: 0x6cb3f620, 0x3c9f1: 0x6cb3f820, 0x3c9f2: 0x6cb3fa20, 0x3c9f3: 0x6ce3ac20, + 0x3c9f4: 0x6ce3ae20, 0x3c9f5: 0x6ce3b020, 0x3c9f6: 0x6ce3b220, 0x3c9f7: 0x6ce3b420, + 0x3c9f8: 0x6ce3b620, 0x3c9f9: 0x6ce3b820, 0x3c9fa: 0x6d11f420, 0x3c9fb: 0x6d11f620, + 0x3c9fc: 0x6d11f820, 0x3c9fd: 0x6d11fa20, 0x3c9fe: 0x6d3ff820, 0x3c9ff: 0x6d3ffa20, + // Block 0xf28, offset 0x3ca00 + 0x3ca00: 0x6d3ffc20, 0x3ca01: 0x6d3ffe20, 0x3ca02: 0x6d400020, 0x3ca03: 0x6d400220, + 0x3ca04: 0x6d6cea20, 0x3ca05: 0x6d6cec20, 0x3ca06: 0x6d6cee20, 0x3ca07: 0x6d6cf020, + 0x3ca08: 0x6d6cf220, 0x3ca09: 0x6d6cf420, 0x3ca0a: 0x6d6cf620, 0x3ca0b: 0x6d95f620, + 0x3ca0c: 0x6db8fc20, 0x3ca0d: 0x6db8fe20, 0x3ca0e: 0x6db90020, 0x3ca0f: 0x6db90220, + 0x3ca10: 0x6dd75220, 0x3ca11: 0x6dd75420, 0x3ca12: 0x6e041e20, 0x3ca13: 0x6e042020, + 0x3ca14: 0x6e042220, 0x3ca15: 0x6e042420, 0x3ca16: 0x6e154c20, 0x3ca17: 0x6c0aa820, + 0x3ca18: 0x6c158820, 0x3ca19: 0x6c158a20, 0x3ca1a: 0x6c27e620, 0x3ca1b: 0x6c27e820, + 0x3ca1c: 0x6c41d820, 0x3ca1d: 0x6c624e20, 0x3ca1e: 0x6c625020, 0x3ca1f: 0x6c625220, + 0x3ca20: 0x6c88e220, 0x3ca21: 0x6c88e420, 0x3ca22: 0x6c88e620, 0x3ca23: 0x6cb46e20, + 0x3ca24: 0x6cb47020, 0x3ca25: 0x6ce41a20, 0x3ca26: 0x6ce41c20, 0x3ca27: 0x6d126420, + 0x3ca28: 0x6d126620, 0x3ca29: 0x6d126820, 0x3ca2a: 0x6d6d4420, 0x3ca2b: 0x6d6d4620, + 0x3ca2c: 0x6d962e20, 0x3ca2d: 0x6db93220, 0x3ca2e: 0x6dd77a20, 0x3ca2f: 0x6dd77c20, + 0x3ca30: 0x6dd77e20, 0x3ca31: 0x6e043220, 0x3ca32: 0x6e433620, 0x3ca33: 0x6c890420, + 0x3ca34: 0x6d12b620, 0x3ca35: 0x6d12b820, 0x3ca36: 0x6d40c420, 0x3ca37: 0x6d40c620, + 0x3ca38: 0x6d40c820, 0x3ca39: 0x6d6da420, 0x3ca3a: 0x6db98e20, 0x3ca3b: 0x6dd7ca20, + 0x3ca3c: 0x6df05020, 0x3ca3d: 0x6df05220, 0x3ca3e: 0x6e157620, 0x3ca3f: 0x6e2d3820, + // Block 0xf29, offset 0x3ca40 + 0x3ca40: 0x6ce46e20, 0x3ca41: 0x6cb4d220, 0x3ca42: 0x6ce47a20, 0x3ca43: 0x6d40d220, + 0x3ca44: 0x6db99e20, 0x3ca45: 0x6df05420, 0x3ca46: 0x6cb51a20, 0x3ca47: 0x6cb51c20, + 0x3ca48: 0x6cb51e20, 0x3ca49: 0x6cb52020, 0x3ca4a: 0x6ce51a20, 0x3ca4b: 0x6ce51c20, + 0x3ca4c: 0x6ce51e20, 0x3ca4d: 0x6ce52020, 0x3ca4e: 0x6ce52220, 0x3ca4f: 0x6d139220, + 0x3ca50: 0x6d139420, 0x3ca51: 0x6d139620, 0x3ca52: 0x6d139820, 0x3ca53: 0x6d139a20, + 0x3ca54: 0x6d139c20, 0x3ca55: 0x6d41ac20, 0x3ca56: 0x6d41ae20, 0x3ca57: 0x6d41b020, + 0x3ca58: 0x6d41b220, 0x3ca59: 0x6d41b420, 0x3ca5a: 0x6d41b620, 0x3ca5b: 0x6d41b820, + 0x3ca5c: 0x6d41ba20, 0x3ca5d: 0x6d6ebe20, 0x3ca5e: 0x6d6ec020, 0x3ca5f: 0x6d6ec220, + 0x3ca60: 0x6d6ec420, 0x3ca61: 0x6d6ec620, 0x3ca62: 0x6d6ec820, 0x3ca63: 0x6d6eca20, + 0x3ca64: 0x6d6ecc20, 0x3ca65: 0x6d6ece20, 0x3ca66: 0x6d97d820, 0x3ca67: 0x6d97da20, + 0x3ca68: 0x6d97dc20, 0x3ca69: 0x6d97de20, 0x3ca6a: 0x6d97e020, 0x3ca6b: 0x6d97e220, + 0x3ca6c: 0x6d97e420, 0x3ca6d: 0x6d97e620, 0x3ca6e: 0x6d97e820, 0x3ca6f: 0x6d97ea20, + 0x3ca70: 0x6dbadc20, 0x3ca71: 0x6dbade20, 0x3ca72: 0x6dbae020, 0x3ca73: 0x6dbae220, + 0x3ca74: 0x6dbae420, 0x3ca75: 0x6dbae620, 0x3ca76: 0x6dbae820, 0x3ca77: 0x6dbaea20, + 0x3ca78: 0x6dd8ea20, 0x3ca79: 0x6dd8ec20, 0x3ca7a: 0x6dd8ee20, 0x3ca7b: 0x6dd8f020, + 0x3ca7c: 0x6dd8f220, 0x3ca7d: 0x6dd8f420, 0x3ca7e: 0x6dd8f620, 0x3ca7f: 0x6df15420, + // Block 0xf2a, offset 0x3ca80 + 0x3ca80: 0x6df15620, 0x3ca81: 0x6df15820, 0x3ca82: 0x6df15a20, 0x3ca83: 0x6df15c20, + 0x3ca84: 0x6e057220, 0x3ca85: 0x6e057420, 0x3ca86: 0x6e057620, 0x3ca87: 0x6e057820, + 0x3ca88: 0x6e057a20, 0x3ca89: 0x6e057c20, 0x3ca8a: 0x6e057e20, 0x3ca8b: 0x6e058020, + 0x3ca8c: 0x6e058220, 0x3ca8d: 0x6e058420, 0x3ca8e: 0x6e058620, 0x3ca8f: 0x6e164020, + 0x3ca90: 0x6e164220, 0x3ca91: 0x6e164420, 0x3ca92: 0x6e164620, 0x3ca93: 0x6e164820, + 0x3ca94: 0x6e164a20, 0x3ca95: 0x6e164c20, 0x3ca96: 0x6e238a20, 0x3ca97: 0x6e238c20, + 0x3ca98: 0x6e238e20, 0x3ca99: 0x6e239020, 0x3ca9a: 0x6e239220, 0x3ca9b: 0x6e2db420, + 0x3ca9c: 0x6e2db620, 0x3ca9d: 0x6e356020, 0x3ca9e: 0x6e356220, 0x3ca9f: 0x6e356420, + 0x3caa0: 0x6e3ae220, 0x3caa1: 0x6e3ae420, 0x3caa2: 0x6e3ae620, 0x3caa3: 0x6e3eae20, + 0x3caa4: 0x6e415e20, 0x3caa5: 0x6c27fc20, 0x3caa6: 0x6c41fa20, 0x3caa7: 0x6c629c20, + 0x3caa8: 0x6c629e20, 0x3caa9: 0x6c62a020, 0x3caaa: 0x6c62a220, 0x3caab: 0x6c62a420, + 0x3caac: 0x6c897a20, 0x3caad: 0x6c897c20, 0x3caae: 0x6c897e20, 0x3caaf: 0x6cb57420, + 0x3cab0: 0x6cb57620, 0x3cab1: 0x6cb57820, 0x3cab2: 0x6cb57a20, 0x3cab3: 0x6cb57c20, + 0x3cab4: 0x6cb57e20, 0x3cab5: 0x6ce56a20, 0x3cab6: 0x6ce56c20, 0x3cab7: 0x6ce56e20, + 0x3cab8: 0x6d13e420, 0x3cab9: 0x6d13e620, 0x3caba: 0x6d13e820, 0x3cabb: 0x6d13ea20, + 0x3cabc: 0x6d13ec20, 0x3cabd: 0x6d13ee20, 0x3cabe: 0x6d13f020, 0x3cabf: 0x6d13f220, + // Block 0xf2b, offset 0x3cac0 + 0x3cac0: 0x6d41ee20, 0x3cac1: 0x6d41f020, 0x3cac2: 0x6d41f220, 0x3cac3: 0x6d41f420, + 0x3cac4: 0x6d41f620, 0x3cac5: 0x6d6ef620, 0x3cac6: 0x6d6ef820, 0x3cac7: 0x6d6efa20, + 0x3cac8: 0x6d6efc20, 0x3cac9: 0x6d980820, 0x3caca: 0x6d980a20, 0x3cacb: 0x6dbb0c20, + 0x3cacc: 0x6dbb0e20, 0x3cacd: 0x6dbb1020, 0x3cace: 0x6dbb1220, 0x3cacf: 0x6dbb1420, + 0x3cad0: 0x6dd90c20, 0x3cad1: 0x6dd90e20, 0x3cad2: 0x6df16020, 0x3cad3: 0x6e164e20, + 0x3cad4: 0x6e2db820, 0x3cad5: 0x6e356620, 0x3cad6: 0x6d141620, 0x3cad7: 0x6d6f1a20, + 0x3cad8: 0x6c62b220, 0x3cad9: 0x6cb5c220, 0x3cada: 0x6ce5e620, 0x3cadb: 0x6ce5e820, + 0x3cadc: 0x6d146420, 0x3cadd: 0x6d146620, 0x3cade: 0x6d146820, 0x3cadf: 0x6d146a20, + 0x3cae0: 0x6d146c20, 0x3cae1: 0x6d6f7a20, 0x3cae2: 0x6d6f7c20, 0x3cae3: 0x6d6f7e20, + 0x3cae4: 0x6d6f8020, 0x3cae5: 0x6d988820, 0x3cae6: 0x6d988a20, 0x3cae7: 0x6d988c20, + 0x3cae8: 0x6dbb8420, 0x3cae9: 0x6df1a020, 0x3caea: 0x6e168e20, 0x3caeb: 0x6e3af820, + 0x3caec: 0x6c15a020, 0x3caed: 0x6c281820, 0x3caee: 0x6c281a20, 0x3caef: 0x6c281c20, + 0x3caf0: 0x6c420c20, 0x3caf1: 0x6c62ca20, 0x3caf2: 0x6c899e20, 0x3caf3: 0x6c89a020, + 0x3caf4: 0x6cb5d820, 0x3caf5: 0x6d147a20, 0x3caf6: 0x6d147c20, 0x3caf7: 0x6d426620, + 0x3caf8: 0x6d426820, 0x3caf9: 0x6dbb8a20, 0x3cafa: 0x6c0ac020, 0x3cafb: 0x6c15d020, + 0x3cafc: 0x6c287820, 0x3cafd: 0x6c287a20, 0x3cafe: 0x6c426c20, 0x3caff: 0x6c426e20, + // Block 0xf2c, offset 0x3cb00 + 0x3cb00: 0x6c427020, 0x3cb01: 0x6c632620, 0x3cb02: 0x6c632820, 0x3cb03: 0x6c632a20, + 0x3cb04: 0x6c8a2c20, 0x3cb05: 0x6c8a2e20, 0x3cb06: 0x6cb64e20, 0x3cb07: 0x6cb65020, + 0x3cb08: 0x6cb65220, 0x3cb09: 0x6cb65420, 0x3cb0a: 0x6cb65620, 0x3cb0b: 0x6cb65820, + 0x3cb0c: 0x6cb65a20, 0x3cb0d: 0x6cb65c20, 0x3cb0e: 0x6ce68620, 0x3cb0f: 0x6ce68820, + 0x3cb10: 0x6d14d620, 0x3cb11: 0x6d14d820, 0x3cb12: 0x6d14da20, 0x3cb13: 0x6d14dc20, + 0x3cb14: 0x6d42c420, 0x3cb15: 0x6d42c620, 0x3cb16: 0x6d42c820, 0x3cb17: 0x6d42ca20, + 0x3cb18: 0x6dd98420, 0x3cb19: 0x6d6fca20, 0x3cb1a: 0x6ce6bc20, 0x3cb1b: 0x6d430a20, + 0x3cb1c: 0x6dd9ba20, 0x3cb1d: 0x6c8a4620, 0x3cb1e: 0x6cb69620, 0x3cb1f: 0x6ce6f220, + 0x3cb20: 0x6ce6f420, 0x3cb21: 0x6d155020, 0x3cb22: 0x6d155220, 0x3cb23: 0x6d434c20, + 0x3cb24: 0x6d434e20, 0x3cb25: 0x6d704a20, 0x3cb26: 0x6d704c20, 0x3cb27: 0x6d997620, + 0x3cb28: 0x6d997820, 0x3cb29: 0x6dbc4e20, 0x3cb2a: 0x6dbc5020, 0x3cb2b: 0x6dda1a20, + 0x3cb2c: 0x6df23220, 0x3cb2d: 0x6df23420, 0x3cb2e: 0x6e066820, 0x3cb2f: 0x6e066a20, + 0x3cb30: 0x6e066c20, 0x3cb31: 0x6e066e20, 0x3cb32: 0x6e16ea20, 0x3cb33: 0x6e240820, + 0x3cb34: 0x6e240a20, 0x3cb35: 0x6e35ae20, 0x3cb36: 0x6e35b020, 0x3cb37: 0x6e44b220, + 0x3cb38: 0x6cb69a20, 0x3cb39: 0x6d156020, 0x3cb3a: 0x6d156220, 0x3cb3b: 0x6d998220, + 0x3cb3c: 0x6df23820, 0x3cb3d: 0x6d435a20, 0x3cb3e: 0x6e16ee20, 0x3cb3f: 0x6e3b1c20, + // Block 0xf2d, offset 0x3cb40 + 0x3cb40: 0x6d437c20, 0x3cb41: 0x6d707020, 0x3cb42: 0x6d99a020, 0x3cb43: 0x6dda2e20, + 0x3cb44: 0x6e170820, 0x3cb45: 0x6d43d420, 0x3cb46: 0x6d43d620, 0x3cb47: 0x6d70be20, + 0x3cb48: 0x6d70c020, 0x3cb49: 0x6e06d220, 0x3cb4a: 0x6e173e20, 0x3cb4b: 0x6e244420, + 0x3cb4c: 0x6c8a4e20, 0x3cb4d: 0x6d15d220, 0x3cb4e: 0x6dbce620, 0x3cb4f: 0x6e06e820, + 0x3cb50: 0x6e35d620, 0x3cb51: 0x6c428420, 0x3cb52: 0x6c8a5020, 0x3cb53: 0x6ce73a20, + 0x3cb54: 0x6d43fe20, 0x3cb55: 0x6d440020, 0x3cb56: 0x6d9a0220, 0x3cb57: 0x6d15f020, + 0x3cb58: 0x6d441020, 0x3cb59: 0x6ddad820, 0x3cb5a: 0x6e070420, 0x3cb5b: 0x6e176420, + 0x3cb5c: 0x6e3b3420, 0x3cb5d: 0x6d163c20, 0x3cb5e: 0x6d447020, 0x3cb5f: 0x6d9aae20, + 0x3cb60: 0x6d9ab020, 0x3cb61: 0x6dbd6820, 0x3cb62: 0x6ddb3a20, 0x3cb63: 0x6ddb3c20, + 0x3cb64: 0x6df33620, 0x3cb65: 0x6e074420, 0x3cb66: 0x6e074620, 0x3cb67: 0x6e17a820, + 0x3cb68: 0x6e248e20, 0x3cb69: 0x6e35f020, 0x3cb6a: 0x6c634c20, 0x3cb6b: 0x6c8a6420, + 0x3cb6c: 0x6cb6c820, 0x3cb6d: 0x6cb6ca20, 0x3cb6e: 0x6ce77020, 0x3cb6f: 0x6ce77220, + 0x3cb70: 0x6ce77420, 0x3cb71: 0x6ce77620, 0x3cb72: 0x6d164c20, 0x3cb73: 0x6d164e20, + 0x3cb74: 0x6d447820, 0x3cb75: 0x6d447a20, 0x3cb76: 0x6d447c20, 0x3cb77: 0x6d716a20, + 0x3cb78: 0x6d9aba20, 0x3cb79: 0x6dbd6a20, 0x3cb7a: 0x6e17ac20, 0x3cb7b: 0x6d167e20, + 0x3cb7c: 0x6d44b420, 0x3cb7d: 0x6dbdb620, 0x3cb7e: 0x6ddb8220, 0x3cb7f: 0x6ddb8420, + // Block 0xf2e, offset 0x3cb80 + 0x3cb80: 0x6df37220, 0x3cb81: 0x6df37420, 0x3cb82: 0x6df37620, 0x3cb83: 0x6e249e20, + 0x3cb84: 0x6e24a020, 0x3cb85: 0x6e2e7620, 0x3cb86: 0x6e35fe20, 0x3cb87: 0x6c428a20, + 0x3cb88: 0x6cb6d420, 0x3cb89: 0x6ce79620, 0x3cb8a: 0x6d168620, 0x3cb8b: 0x6dbdba20, + 0x3cb8c: 0x6dbdbe20, 0x3cb8d: 0x6ce7d620, 0x3cb8e: 0x6d16f220, 0x3cb8f: 0x6d451820, + 0x3cb90: 0x6d451a20, 0x3cb91: 0x6d451c20, 0x3cb92: 0x6d451e20, 0x3cb93: 0x6d71fc20, + 0x3cb94: 0x6dbe3c20, 0x3cb95: 0x6dbe3e20, 0x3cb96: 0x6dbe4020, 0x3cb97: 0x6dbe4220, + 0x3cb98: 0x6ddbf820, 0x3cb99: 0x6df3e020, 0x3cb9a: 0x6df3e220, 0x3cb9b: 0x6e07c020, + 0x3cb9c: 0x6e24d820, 0x3cb9d: 0x6e24da20, 0x3cb9e: 0x6c15d820, 0x3cb9f: 0x6c289420, + 0x3cba0: 0x6c289620, 0x3cba1: 0x6c42a820, 0x3cba2: 0x6c42aa20, 0x3cba3: 0x6c42ac20, + 0x3cba4: 0x6c637a20, 0x3cba5: 0x6c637c20, 0x3cba6: 0x6c8a8620, 0x3cba7: 0x6c8a8820, + 0x3cba8: 0x6c8a8a20, 0x3cba9: 0x6cb70820, 0x3cbaa: 0x6cb70a20, 0x3cbab: 0x6ce7e420, + 0x3cbac: 0x6ce7e620, 0x3cbad: 0x6ce7e820, 0x3cbae: 0x6ce7ea20, 0x3cbaf: 0x6ce7ec20, + 0x3cbb0: 0x6d170220, 0x3cbb1: 0x6d170420, 0x3cbb2: 0x6d720420, 0x3cbb3: 0x6d720620, + 0x3cbb4: 0x6d9b8e20, 0x3cbb5: 0x6e07c420, 0x3cbb6: 0x6d453220, 0x3cbb7: 0x6d9b9e20, + 0x3cbb8: 0x6dbe4e20, 0x3cbb9: 0x6df3ea20, 0x3cbba: 0x6e07c820, 0x3cbbb: 0x6e361820, + 0x3cbbc: 0x6d722020, 0x3cbbd: 0x6d722220, 0x3cbbe: 0x6dbe6420, 0x3cbbf: 0x6ddc1420, + // Block 0xf2f, offset 0x3cbc0 + 0x3cbc0: 0x6e07d420, 0x3cbc1: 0x6e07d620, 0x3cbc2: 0x6e183020, 0x3cbc3: 0x6e24e220, + 0x3cbc4: 0x6e44be20, 0x3cbc5: 0x6d173020, 0x3cbc6: 0x6d45a420, 0x3cbc7: 0x6d45a620, + 0x3cbc8: 0x6d45a820, 0x3cbc9: 0x6d45aa20, 0x3cbca: 0x6d9c2e20, 0x3cbcb: 0x6ddc9e20, + 0x3cbcc: 0x6ddca020, 0x3cbcd: 0x6ddca220, 0x3cbce: 0x6ddca420, 0x3cbcf: 0x6df47c20, + 0x3cbd0: 0x6df47e20, 0x3cbd1: 0x6df48020, 0x3cbd2: 0x6e086220, 0x3cbd3: 0x6e086420, + 0x3cbd4: 0x6e086620, 0x3cbd5: 0x6e086820, 0x3cbd6: 0x6e086a20, 0x3cbd7: 0x6e254220, + 0x3cbd8: 0x6e2ee220, 0x3cbd9: 0x6e364020, 0x3cbda: 0x6e41b420, 0x3cbdb: 0x6c15e020, + 0x3cbdc: 0x6c28a220, 0x3cbdd: 0x6c28a420, 0x3cbde: 0x6c42d620, 0x3cbdf: 0x6c42d820, + 0x3cbe0: 0x6c63a620, 0x3cbe1: 0x6c63a820, 0x3cbe2: 0x6c8aa820, 0x3cbe3: 0x6c8aaa20, + 0x3cbe4: 0x6c8aac20, 0x3cbe5: 0x6cb72820, 0x3cbe6: 0x6cb72a20, 0x3cbe7: 0x6cb72c20, + 0x3cbe8: 0x6ce82620, 0x3cbe9: 0x6ce82820, 0x3cbea: 0x6d174220, 0x3cbeb: 0x6d174420, + 0x3cbec: 0x6d174620, 0x3cbed: 0x6d45b220, 0x3cbee: 0x6d45b420, 0x3cbef: 0x6d72b020, + 0x3cbf0: 0x6d9c3220, 0x3cbf1: 0x6e189020, 0x3cbf2: 0x6d72e020, 0x3cbf3: 0x6ddcd620, + 0x3cbf4: 0x6ddcd820, 0x3cbf5: 0x6ce84020, 0x3cbf6: 0x6d72ec20, 0x3cbf7: 0x6d9c7820, + 0x3cbf8: 0x6cb73820, 0x3cbf9: 0x6d178820, 0x3cbfa: 0x6d178a20, 0x3cbfb: 0x6d463a20, + 0x3cbfc: 0x6d734220, 0x3cbfd: 0x6d9cbe20, 0x3cbfe: 0x6dbf5020, 0x3cbff: 0x6dbf5220, + // Block 0xf30, offset 0x3cc00 + 0x3cc00: 0x6ddd3420, 0x3cc01: 0x6ddd3620, 0x3cc02: 0x6df4f820, 0x3cc03: 0x6e18e620, + 0x3cc04: 0x6d464c20, 0x3cc05: 0x6d735220, 0x3cc06: 0x6e190420, 0x3cc07: 0x6e439e20, + 0x3cc08: 0x6cb74220, 0x3cc09: 0x6d17c220, 0x3cc0a: 0x6d738420, 0x3cc0b: 0x6d9d0c20, + 0x3cc0c: 0x6dbf8c20, 0x3cc0d: 0x6dbf8e20, 0x3cc0e: 0x6e193220, 0x3cc0f: 0x6d17de20, + 0x3cc10: 0x6d46b420, 0x3cc11: 0x6d740620, 0x3cc12: 0x6d740820, 0x3cc13: 0x6d9da220, + 0x3cc14: 0x6d9da420, 0x3cc15: 0x6d9da620, 0x3cc16: 0x6d9da820, 0x3cc17: 0x6d9daa20, + 0x3cc18: 0x6dc02a20, 0x3cc19: 0x6dc02c20, 0x3cc1a: 0x6dc02e20, 0x3cc1b: 0x6dc03020, + 0x3cc1c: 0x6dc03220, 0x3cc1d: 0x6dc03420, 0x3cc1e: 0x6dc03620, 0x3cc1f: 0x6dc03820, + 0x3cc20: 0x6dde2620, 0x3cc21: 0x6dde2820, 0x3cc22: 0x6dde2a20, 0x3cc23: 0x6dde2c20, + 0x3cc24: 0x6df61420, 0x3cc25: 0x6df61620, 0x3cc26: 0x6df61820, 0x3cc27: 0x6df61a20, + 0x3cc28: 0x6e09e020, 0x3cc29: 0x6e09e220, 0x3cc2a: 0x6e09e420, 0x3cc2b: 0x6e19e620, + 0x3cc2c: 0x6e19e820, 0x3cc2d: 0x6e19ea20, 0x3cc2e: 0x6e19ec20, 0x3cc2f: 0x6e19ee20, + 0x3cc30: 0x6e266420, 0x3cc31: 0x6e266620, 0x3cc32: 0x6e266820, 0x3cc33: 0x6e266a20, + 0x3cc34: 0x6e266c20, 0x3cc35: 0x6e266e20, 0x3cc36: 0x6e267020, 0x3cc37: 0x6e2fce20, + 0x3cc38: 0x6e2fd020, 0x3cc39: 0x6e2fd220, 0x3cc3a: 0x6e2fd420, 0x3cc3b: 0x6e2fd620, + 0x3cc3c: 0x6e2fd820, 0x3cc3d: 0x6e370820, 0x3cc3e: 0x6e370a20, 0x3cc3f: 0x6e370c20, + // Block 0xf31, offset 0x3cc40 + 0x3cc40: 0x6e370e20, 0x3cc41: 0x6e371020, 0x3cc42: 0x6e3be220, 0x3cc43: 0x6e3be420, + 0x3cc44: 0x6e3f8420, 0x3cc45: 0x6e43be20, 0x3cc46: 0x6e458a20, 0x3cc47: 0x6e466220, + 0x3cc48: 0x6cb74c20, 0x3cc49: 0x6cb74e20, 0x3cc4a: 0x6cb75020, 0x3cc4b: 0x6ce87e20, + 0x3cc4c: 0x6ce88020, 0x3cc4d: 0x6ce88220, 0x3cc4e: 0x6d17fc20, 0x3cc4f: 0x6d17fe20, + 0x3cc50: 0x6d180020, 0x3cc51: 0x6d180220, 0x3cc52: 0x6c8ac220, 0x3cc53: 0x6d46dc20, + 0x3cc54: 0x6d46de20, 0x3cc55: 0x6d46e020, 0x3cc56: 0x6d46e220, 0x3cc57: 0x6d46e420, + 0x3cc58: 0x6d46e620, 0x3cc59: 0x6d743020, 0x3cc5a: 0x6d743220, 0x3cc5b: 0x6d743420, + 0x3cc5c: 0x6d9dd620, 0x3cc5d: 0x6d9dd820, 0x3cc5e: 0x6d9dda20, 0x3cc5f: 0x6d9ddc20, + 0x3cc60: 0x6d9dde20, 0x3cc61: 0x6d9de020, 0x3cc62: 0x6dc05e20, 0x3cc63: 0x6dc06020, + 0x3cc64: 0x6dc06220, 0x3cc65: 0x6dc06420, 0x3cc66: 0x6dde3c20, 0x3cc67: 0x6df63220, + 0x3cc68: 0x6df63420, 0x3cc69: 0x6e09f420, 0x3cc6a: 0x6e09f620, 0x3cc6b: 0x6e1a0220, + 0x3cc6c: 0x6e267620, 0x3cc6d: 0x6e2fde20, 0x3cc6e: 0x6ce88e20, 0x3cc6f: 0x6d74d620, + 0x3cc70: 0x6d74d820, 0x3cc71: 0x6d74da20, 0x3cc72: 0x6d74dc20, 0x3cc73: 0x6d9eae20, + 0x3cc74: 0x6d9eb020, 0x3cc75: 0x6d9eb220, 0x3cc76: 0x6d9eb420, 0x3cc77: 0x6d9eb620, + 0x3cc78: 0x6dc12a20, 0x3cc79: 0x6dc12c20, 0x3cc7a: 0x6dc12e20, 0x3cc7b: 0x6dc13020, + 0x3cc7c: 0x6ddedc20, 0x3cc7d: 0x6ddede20, 0x3cc7e: 0x6ddee020, 0x3cc7f: 0x6ddee220, + // Block 0xf32, offset 0x3cc80 + 0x3cc80: 0x6ddee420, 0x3cc81: 0x6df71e20, 0x3cc82: 0x6df72020, 0x3cc83: 0x6df72220, + 0x3cc84: 0x6df72420, 0x3cc85: 0x6df72620, 0x3cc86: 0x6df72820, 0x3cc87: 0x6df72a20, + 0x3cc88: 0x6df72c20, 0x3cc89: 0x6e0acc20, 0x3cc8a: 0x6e0ace20, 0x3cc8b: 0x6e0ad020, + 0x3cc8c: 0x6e1aba20, 0x3cc8d: 0x6e1abc20, 0x3cc8e: 0x6e1abe20, 0x3cc8f: 0x6e1ac020, + 0x3cc90: 0x6e272c20, 0x3cc91: 0x6e309e20, 0x3cc92: 0x6e30a020, 0x3cc93: 0x6e30a220, + 0x3cc94: 0x6e30a420, 0x3cc95: 0x6e30a620, 0x3cc96: 0x6e378820, 0x3cc97: 0x6e3c3020, + 0x3cc98: 0x6e3fb820, 0x3cc99: 0x6e459e20, 0x3cc9a: 0x6c63be20, 0x3cc9b: 0x6c63c020, + 0x3cc9c: 0x6c63c220, 0x3cc9d: 0x6c63c420, 0x3cc9e: 0x6c63c620, 0x3cc9f: 0x6c8ae020, + 0x3cca0: 0x6c8ae220, 0x3cca1: 0x6c8ae420, 0x3cca2: 0x6c8ae620, 0x3cca3: 0x6c8ae820, + 0x3cca4: 0x6c8aea20, 0x3cca5: 0x6cb77620, 0x3cca6: 0x6cb77820, 0x3cca7: 0x6cb77a20, + 0x3cca8: 0x6cb77c20, 0x3cca9: 0x6cb77e20, 0x3ccaa: 0x6cb78020, 0x3ccab: 0x6ce8a620, + 0x3ccac: 0x6ce8a820, 0x3ccad: 0x6ce8aa20, 0x3ccae: 0x6ce8ac20, 0x3ccaf: 0x6ce8ae20, + 0x3ccb0: 0x6d184a20, 0x3ccb1: 0x6d184c20, 0x3ccb2: 0x6d184e20, 0x3ccb3: 0x6d185020, + 0x3ccb4: 0x6d185220, 0x3ccb5: 0x6d185420, 0x3ccb6: 0x6d473820, 0x3ccb7: 0x6d473a20, + 0x3ccb8: 0x6d473c20, 0x3ccb9: 0x6d473e20, 0x3ccba: 0x6d474020, 0x3ccbb: 0x6d474220, + 0x3ccbc: 0x6d474420, 0x3ccbd: 0x6d74fa20, 0x3ccbe: 0x6d74fc20, 0x3ccbf: 0x6d9ec220, + // Block 0xf33, offset 0x3ccc0 + 0x3ccc0: 0x6d9ec420, 0x3ccc1: 0x6d9ec620, 0x3ccc2: 0x6d9ec820, 0x3ccc3: 0x6dc14020, + 0x3ccc4: 0x6dc14220, 0x3ccc5: 0x6ddeee20, 0x3ccc6: 0x6df73420, 0x3ccc7: 0x6dc14620, + 0x3ccc8: 0x6ddef820, 0x3ccc9: 0x6e0aea20, 0x3ccca: 0x6d9eda20, 0x3cccb: 0x6d186020, + 0x3cccc: 0x6d752e20, 0x3cccd: 0x6dc16c20, 0x3ccce: 0x6ddf2620, 0x3cccf: 0x6e30c620, + 0x3ccd0: 0x6df79820, 0x3ccd1: 0x6cb79220, 0x3ccd2: 0x6ce8b220, 0x3ccd3: 0x6d476220, + 0x3ccd4: 0x6d756020, 0x3ccd5: 0x6dc18a20, 0x3ccd6: 0x6dc19220, 0x3ccd7: 0x6df7a220, + 0x3ccd8: 0x6d757c20, 0x3ccd9: 0x6e0b8620, 0x3ccda: 0x6e0b8820, 0x3ccdb: 0x6e1b5e20, + 0x3ccdc: 0x6d9f7420, 0x3ccdd: 0x6df7f420, 0x3ccde: 0x6e3c7820, 0x3ccdf: 0x6dc1f620, + 0x3cce0: 0x6d75ac20, 0x3cce1: 0x6e27c420, 0x3cce2: 0x6d477e20, 0x3cce3: 0x6e3c9020, + 0x3cce4: 0x6ddfea20, 0x3cce5: 0x6e1bde20, 0x3cce6: 0x6e283420, 0x3cce7: 0x6e427220, + 0x3cce8: 0x6ce8c620, 0x3cce9: 0x6d478c20, 0x3ccea: 0x6d478e20, 0x3cceb: 0x6d75be20, + 0x3ccec: 0x6d9f9620, 0x3cced: 0x6d9f9820, 0x3ccee: 0x6dc24020, 0x3ccef: 0x6ddffe20, + 0x3ccf0: 0x6e1be020, 0x3ccf1: 0x6e318020, 0x3ccf2: 0x6d75c020, 0x3ccf3: 0x6ce8c820, + 0x3ccf4: 0x6e451220, + // Block 0xf34, offset 0x3cd00 + 0x3cd00: 0x6c00f420, 0x3cd01: 0x6c0ae820, 0x3cd02: 0x6c15fe20, 0x3cd03: 0x6d189620, + 0x3cd04: 0x6c011820, 0x3cd05: 0x6c0b6620, 0x3cd06: 0x6c060c20, 0x3cd07: 0x6c2a2820, + 0x3cd08: 0x6c2a2a20, 0x3cd09: 0x6c656c20, 0x3cd0a: 0x6c8c6420, 0x3cd0b: 0x6ce9e020, + 0x3cd0c: 0x6c446a20, 0x3cd0d: 0x6c448e20, 0x3cd0e: 0x6c44d020, 0x3cd0f: 0x6c8cbc20, + 0x3cd10: 0x6c454c20, 0x3cd11: 0x6ceac020, 0x3cd12: 0x6c18be20, 0x3cd13: 0x6c2bd220, + 0x3cd14: 0x6c45cc20, 0x3cd15: 0x6c190220, 0x3cd16: 0x6c676c20, 0x3cd17: 0x6c676e20, + 0x3cd18: 0x6c0e9420, 0x3cd19: 0x6c47da20, 0x3cd1a: 0x6d1cea20, 0x3cd1b: 0x6d4ab420, + 0x3cd1c: 0x6da17c20, 0x3cd1d: 0x6dc3da20, 0x3cd1e: 0x6e1c7220, 0x3cd1f: 0x6cbd8420, + 0x3cd20: 0x6d1df020, 0x3cd21: 0x6d78fe20, 0x3cd22: 0x6c0f2a20, 0x3cd23: 0x6c1b8820, + 0x3cd24: 0x6c6ae820, 0x3cd25: 0x6d793620, 0x3cd26: 0x6c1c6020, 0x3cd27: 0x6c4a1620, + 0x3cd28: 0x6c4a1820, 0x3cd29: 0x6c6bd620, 0x3cd2a: 0x6c6bd820, 0x3cd2b: 0x6c6bda20, + 0x3cd2c: 0x6cbf4020, 0x3cd2d: 0x6d1f2620, 0x3cd2e: 0x6d4cb420, 0x3cd2f: 0x6d4cc620, + 0x3cd30: 0x6d1faa20, 0x3cd31: 0x6d4d2020, 0x3cd32: 0x6c102620, 0x3cd33: 0x6c109020, + 0x3cd34: 0x6c4bca20, 0x3cd35: 0x6c6de020, 0x3cd36: 0x6c964c20, 0x3cd37: 0x6c964e20, + 0x3cd38: 0x6c4d3a20, 0x3cd39: 0x6c1ffa20, 0x3cd3a: 0x6c352c20, 0x3cd3b: 0x6c502820, + 0x3cd3c: 0x6cc66a20, 0x3cd3d: 0x6cf51a20, 0x3cd3e: 0x6d24e420, 0x3cd3f: 0x6dc6b420, + // Block 0xf35, offset 0x3cd40 + 0x3cd40: 0x6c9b6c20, 0x3cd41: 0x6cf5cc20, 0x3cd42: 0x6c515820, 0x3cd43: 0x6c515a20, + 0x3cd44: 0x6c738a20, 0x3cd45: 0x6c73bc20, 0x3cd46: 0x6cc88020, 0x3cd47: 0x6cc88220, + 0x3cd48: 0x6c376220, 0x3cd49: 0x6c754420, 0x3cd4a: 0x6c754620, 0x3cd4b: 0x6d27fc20, + 0x3cd4c: 0x6d27fe20, 0x3cd4d: 0x6d554c20, 0x3cd4e: 0x6d554e20, 0x3cd4f: 0x6d555020, + 0x3cd50: 0x6d80ce20, 0x3cd51: 0x6da6f020, 0x3cd52: 0x6dc84a20, 0x3cd53: 0x6cf92020, + 0x3cd54: 0x6d55c820, 0x3cd55: 0x6c098820, 0x3cd56: 0x6c12e820, 0x3cd57: 0x6c77e820, + 0x3cd58: 0x6ca0dc20, 0x3cd59: 0x6cfbd020, 0x3cd5a: 0x6cfbd220, 0x3cd5b: 0x6cfbd420, + 0x3cd5c: 0x6d580820, 0x3cd5d: 0x6d82fa20, 0x3cd5e: 0x6de56e20, 0x3cd5f: 0x6c78c820, + 0x3cd60: 0x6ca1ca20, 0x3cd61: 0x6d2bd820, 0x3cd62: 0x6c569420, 0x3cd63: 0x6c3b3620, + 0x3cd64: 0x6ca2d420, 0x3cd65: 0x6c3baa20, 0x3cd66: 0x6c7a7020, 0x3cd67: 0x6cd15e20, + 0x3cd68: 0x6d2d8420, 0x3cd69: 0x6d5ab020, 0x3cd6a: 0x6c580820, 0x3cd6b: 0x6ca41820, + 0x3cd6c: 0x6c7ba220, 0x3cd6d: 0x6d5bd620, 0x3cd6e: 0x6c7bd220, 0x3cd6f: 0x6c3c7420, + 0x3cd70: 0x6c597220, 0x3cd71: 0x6d012e20, 0x3cd72: 0x6c7cd420, 0x3cd73: 0x6ca59020, + 0x3cd74: 0x6c7e2c20, 0x3cd75: 0x6ca6f220, 0x3cd76: 0x6d883020, 0x3cd77: 0x6ca77620, + 0x3cd78: 0x6d042820, 0x3cd79: 0x6c258820, 0x3cd7a: 0x6e1f7c20, 0x3cd7b: 0x6c259220, + 0x3cd7c: 0x6ca7e620, 0x3cd7d: 0x6d5fe820, 0x3cd7e: 0x6d5fea20, 0x3cd7f: 0x6d5fec20, + // Block 0xf36, offset 0x3cd80 + 0x3cd80: 0x6daf1e20, 0x3cd81: 0x6d617a20, 0x3cd82: 0x6dcf7a20, 0x3cd83: 0x6c5cc220, + 0x3cd84: 0x6c80c220, 0x3cd85: 0x6ca9e020, 0x3cd86: 0x6cd85020, 0x3cd87: 0x6daff220, + 0x3cd88: 0x6c5d0a20, 0x3cd89: 0x6c3e5a20, 0x3cd8a: 0x6d36e220, 0x3cd8b: 0x6cdaaa20, + 0x3cd8c: 0x6c5f8e20, 0x3cd8d: 0x6c5f9020, 0x3cd8e: 0x6c84c220, 0x3cd8f: 0x6cae1620, + 0x3cd90: 0x6cae1820, 0x3cd91: 0x6cae1a20, 0x3cd92: 0x6d0bb420, 0x3cd93: 0x6d0bb620, + 0x3cd94: 0x6d39b620, 0x3cd95: 0x6d65ee20, 0x3cd96: 0x6d8fc220, 0x3cd97: 0x6e01da20, + 0x3cd98: 0x6d675620, 0x3cd99: 0x6db4d820, 0x3cd9a: 0x6cdef620, 0x3cd9b: 0x6cdf0620, + 0x3cd9c: 0x6e2c3a20, 0x3cd9d: 0x6e221220, 0x3cd9e: 0x6c14fe20, 0x3cd9f: 0x6c26e420, + 0x3cda0: 0x6c86c020, 0x3cda1: 0x6c86c220, 0x3cda2: 0x6ce04620, 0x3cda3: 0x6def6620, + 0x3cda4: 0x6c616420, 0x3cda5: 0x6d3f6620, 0x3cda6: 0x6db89c20, 0x3cda7: 0x6c0a8a20, + 0x3cda8: 0x6ce3ba20, 0x3cda9: 0x6ce3bc20, 0x3cdaa: 0x6d95f820, 0x3cdab: 0x6c27ea20, + 0x3cdac: 0x6c88e820, 0x3cdad: 0x6cb47220, 0x3cdae: 0x6d12ba20, 0x3cdaf: 0x6c626020, + 0x3cdb0: 0x6d41bc20, 0x3cdb1: 0x6dd8f820, 0x3cdb2: 0x6c27fe20, 0x3cdb3: 0x6c41fc20, + 0x3cdb4: 0x6c62a620, 0x3cdb5: 0x6c62a820, 0x3cdb6: 0x6c898020, 0x3cdb7: 0x6c898220, + 0x3cdb8: 0x6cb58020, 0x3cdb9: 0x6cb58220, 0x3cdba: 0x6cb58420, 0x3cdbb: 0x6cb58620, + 0x3cdbc: 0x6ce57020, 0x3cdbd: 0x6d13f420, 0x3cdbe: 0x6d41f820, 0x3cdbf: 0x6d41fa20, + // Block 0xf37, offset 0x3cdc0 + 0x3cdc0: 0x6d6efe20, 0x3cdc1: 0x6df16220, 0x3cdc2: 0x6c420e20, 0x3cdc3: 0x6cb65e20, + 0x3cdc4: 0x6d70de20, 0x3cdc5: 0x6d15dc20, 0x3cdc6: 0x6c8a6620, 0x3cdc7: 0x6c428c20, + 0x3cdc8: 0x6c635a20, 0x3cdc9: 0x6c8a9220, 0x3cdca: 0x6c42da20, 0x3cdcb: 0x6d45b620, + 0x3cdcc: 0x6d9c3420, 0x3cdcd: 0x6e19f020, 0x3cdce: 0x6e371220, 0x3cdcf: 0x6ce88420, + 0x3cdd0: 0x6d180420, 0x3cdd1: 0x6dc06620, 0x3cdd2: 0x6df63620, 0x3cdd3: 0x6cb75420, + 0x3cdd4: 0x6d9eb820, 0x3cdd5: 0x6e272e20, 0x3cdd6: 0x6c63c820, 0x3cdd7: 0x6d750a20, + 0x3cdd8: 0x6ddfda20, 0x3cdd9: 0x6df85820, 0x3cdda: 0x6d188a20, 0x3cddb: 0x6e383e20, + 0x3cddc: 0x6d9f9a20, 0x3cddd: 0x6e441c20, + // Block 0xf38, offset 0x3ce00 + 0x3ce00: 0x6c15ea20, 0x3ce01: 0x6c00fe20, 0x3ce02: 0x6c000c20, 0x3ce03: 0x6c0b4420, + 0x3ce04: 0x6c16ba20, 0x3ce05: 0x6c435e20, 0x3ce06: 0x6c437820, 0x3ce07: 0x6c645620, + 0x3ce08: 0x6c8bba20, 0x3ce09: 0x6cb81c20, 0x3ce0a: 0x6d18fe20, 0x3ce0b: 0x6d18ce20, + 0x3ce0c: 0x6d9fac20, 0x3ce0d: 0x6c0ccc20, 0x3ce0e: 0x6c173820, 0x3ce0f: 0x6c2a3220, + 0x3ce10: 0x6e0c6420, 0x3ce11: 0x6c2a5220, 0x3ce12: 0x6c8c8020, 0x3ce13: 0x6df89620, + 0x3ce14: 0x6c02ce20, 0x3ce15: 0x6c0c7820, 0x3ce16: 0x6c0c7c20, 0x3ce17: 0x6c02fe20, + 0x3ce18: 0x6c65aa20, 0x3ce19: 0x6c02ae20, 0x3ce1a: 0x6c064a20, 0x3ce1b: 0x6c179020, + 0x3ce1c: 0x6dbc5420, 0x3ce1d: 0x6c009a20, 0x3ce1e: 0x6c015a20, 0x3ce1f: 0x6c17da20, + 0x3ce20: 0x6c2ae220, 0x3ce21: 0x6c2b4a20, 0x3ce22: 0x6cb95220, 0x3ce23: 0x6cea4020, + 0x3ce24: 0x6c0d3c20, 0x3ce25: 0x6c455c20, 0x3ce26: 0x6c456020, 0x3ce27: 0x6cea9c20, + 0x3ce28: 0x6c016420, 0x3ce29: 0x6c06b820, 0x3ce2a: 0x6c06ba20, 0x3ce2b: 0x6c06c620, + 0x3ce2c: 0x6c06d220, 0x3ce2d: 0x6c2bac20, 0x3ce2e: 0x6cb9f220, 0x3ce2f: 0x6c18d420, + 0x3ce30: 0x6c45e820, 0x3ce31: 0x6c673020, 0x3ce32: 0x6c673020, 0x3ce33: 0x6c673020, + 0x3ce34: 0x6c038e20, 0x3ce35: 0x6c135e20, 0x3ce36: 0x6c03a020, 0x3ce37: 0x6c677e20, + 0x3ce38: 0x6c8e0c20, 0x3ce39: 0x6c074420, 0x3ce3a: 0x6c075020, 0x3ce3b: 0x6c0e3020, + 0x3ce3c: 0x6c468620, 0x3ce3d: 0x6c197e20, 0x3ce3e: 0x6c199e20, 0x3ce3f: 0x6c2c7e20, + // Block 0xf39, offset 0x3ce40 + 0x3ce40: 0x6c468e20, 0x3ce41: 0x6c67e620, 0x3ce42: 0x6c681820, 0x3ce43: 0x6c8e9620, + 0x3ce44: 0x6c8eb220, 0x3ce45: 0x6cbaaa20, 0x3ce46: 0x6cbaaa20, 0x3ce47: 0x6cbad220, + 0x3ce48: 0x6cbaf620, 0x3ce49: 0x6cbb0620, 0x3ce4a: 0x6ceb7620, 0x3ce4b: 0x6d1cf220, + 0x3ce4c: 0x6d1b7220, 0x3ce4d: 0x6d1cf420, 0x3ce4e: 0x6d1bb220, 0x3ce4f: 0x6d49c620, + 0x3ce50: 0x6c032820, 0x3ce51: 0x6c0f0e20, 0x3ce52: 0x6c486820, 0x3ce53: 0x6c908220, + 0x3ce54: 0x6c90b420, 0x3ce55: 0x6c481220, 0x3ce56: 0x6c6a6e20, 0x3ce57: 0x6cbcb020, + 0x3ce58: 0x6d4af820, 0x3ce59: 0x6de13e20, 0x3ce5a: 0x6c1b6c20, 0x3ce5b: 0x6c916220, + 0x3ce5c: 0x6c1b7420, 0x3ce5d: 0x6c0f1e20, 0x3ce5e: 0x6d1e1020, 0x3ce5f: 0x6c91d420, + 0x3ce60: 0x6c080620, 0x3ce61: 0x6c2f9020, 0x3ce62: 0x6c6b1820, 0x3ce63: 0x6c6b3c20, + 0x3ce64: 0x6c6b5420, 0x3ce65: 0x6c495620, 0x3ce66: 0x6c924e20, 0x3ce67: 0x6cbdf220, + 0x3ce68: 0x6cbe0e20, 0x3ce69: 0x6d4c1220, 0x3ce6a: 0x6de16420, 0x3ce6b: 0x6de16420, + 0x3ce6c: 0x6c0fdc20, 0x3ce6d: 0x6c933820, 0x3ce6e: 0x6cefa820, 0x3ce6f: 0x6d1f5620, + 0x3ce70: 0x6de19a20, 0x3ce71: 0x6e3d2020, 0x3ce72: 0x6c1cc220, 0x3ce73: 0x6c4a9220, + 0x3ce74: 0x6c114a20, 0x3ce75: 0x6c01ac20, 0x3ce76: 0x6c4abc20, 0x3ce77: 0x6c941020, + 0x3ce78: 0x6c01b620, 0x3ce79: 0x6c311420, 0x3ce7a: 0x6c1dd220, 0x3ce7b: 0x6c6d7820, + 0x3ce7c: 0x6cc0a820, 0x3ce7d: 0x6c6d7c20, 0x3ce7e: 0x6cf09a20, 0x3ce7f: 0x6cc16a20, + // Block 0xf3a, offset 0x3ce80 + 0x3ce80: 0x6d202220, 0x3ce81: 0x6c272c20, 0x3ce82: 0x6c954a20, 0x3ce83: 0x6c08a020, + 0x3ce84: 0x6cc17820, 0x3ce85: 0x6c6e0020, 0x3ce86: 0x6cc19820, 0x3ce87: 0x6d4ea820, + 0x3ce88: 0x6d7ae820, 0x3ce89: 0x6e320a20, 0x3ce8a: 0x6c4c6820, 0x3ce8b: 0x6c4cac20, + 0x3ce8c: 0x6c95e620, 0x3ce8d: 0x6c95ec20, 0x3ce8e: 0x6cc21820, 0x3ce8f: 0x6d476820, + 0x3ce90: 0x6c01d820, 0x3ce91: 0x6c111220, 0x3ce92: 0x6c111220, 0x3ce93: 0x6c82fe20, + 0x3ce94: 0x6c326a20, 0x3ce95: 0x6c326a20, 0x3ce96: 0x6c329a20, 0x3ce97: 0x6d7ea620, + 0x3ce98: 0x6e201a20, 0x3ce99: 0x6c1ee020, 0x3ce9a: 0x6c96ae20, 0x3ce9b: 0x6c6f1420, + 0x3ce9c: 0x6cc2ca20, 0x3ce9d: 0x6c1f2220, 0x3ce9e: 0x6c1f2c20, 0x3ce9f: 0x6c1f6c20, + 0x3cea0: 0x6c6fa220, 0x3cea1: 0x6c4dbe20, 0x3cea2: 0x6c4da620, 0x3cea3: 0x6c6fc020, + 0x3cea4: 0x6c97fe20, 0x3cea5: 0x6c97a020, 0x3cea6: 0x6d222420, 0x3cea7: 0x6cf2ac20, + 0x3cea8: 0x6cf2b020, 0x3cea9: 0x6cf2ac20, 0x3ceaa: 0x6d226c20, 0x3ceab: 0x6d4fb820, + 0x3ceac: 0x6d7bcc20, 0x3cead: 0x6d4fd820, 0x3ceae: 0x6d4fe820, 0x3ceaf: 0x6da3f620, + 0x3ceb0: 0x6de28220, 0x3ceb1: 0x6de28c20, 0x3ceb2: 0x6c11c220, 0x3ceb3: 0x6c98ba20, + 0x3ceb4: 0x6c11e820, 0x3ceb5: 0x6c345020, 0x3ceb6: 0x6c349420, 0x3ceb7: 0x6c713820, + 0x3ceb8: 0x6c4fd020, 0x3ceb9: 0x6c711220, 0x3ceba: 0x6c4f3420, 0x3cebb: 0x6c990c20, + 0x3cebc: 0x6c994220, 0x3cebd: 0x6c722020, 0x3cebe: 0x6cc57a20, 0x3cebf: 0x6cf41220, + // Block 0xf3b, offset 0x3cec0 + 0x3cec0: 0x6cf51c20, 0x3cec1: 0x6c998820, 0x3cec2: 0x6d237420, 0x3cec3: 0x6d510220, + 0x3cec4: 0x6d23ee20, 0x3cec5: 0x6d515a20, 0x3cec6: 0x6d23e220, 0x3cec7: 0x6de2ea20, + 0x3cec8: 0x6c9ab020, 0x3cec9: 0x6cf53820, 0x3ceca: 0x6da53020, 0x3cecb: 0x6c9b6e20, + 0x3cecc: 0x6c739020, 0x3cecd: 0x6c731620, 0x3cece: 0x6d7e3620, 0x3cecf: 0x6cc7b820, + 0x3ced0: 0x6cf5e620, 0x3ced1: 0x6c50c220, 0x3ced2: 0x6c448820, 0x3ced3: 0x6c8c8820, + 0x3ced4: 0x6cb8f420, 0x3ced5: 0x6d258220, 0x3ced6: 0x6c3e9420, 0x3ced7: 0x6c3e7220, + 0x3ced8: 0x6c73be20, 0x3ced9: 0x6c9c2220, 0x3ceda: 0x6cf69620, 0x3cedb: 0x6c21ee20, + 0x3cedc: 0x6c21d820, 0x3cedd: 0x6c220c20, 0x3cede: 0x6c365c20, 0x3cedf: 0x6c522420, + 0x3cee0: 0x6c36a020, 0x3cee1: 0x6c52c020, 0x3cee2: 0x6c9c8820, 0x3cee3: 0x6c750620, + 0x3cee4: 0x6c9c9a20, 0x3cee5: 0x6c740020, 0x3cee6: 0x6cc95020, 0x3cee7: 0x6cf6d620, + 0x3cee8: 0x6cf70820, 0x3cee9: 0x6d267820, 0x3ceea: 0x6d53d620, 0x3ceeb: 0x6da63220, + 0x3ceec: 0x6d801420, 0x3ceed: 0x6da6f220, 0x3ceee: 0x6e1db420, 0x3ceef: 0x6c12b420, + 0x3cef0: 0x6c756020, 0x3cef1: 0x6d80d420, 0x3cef2: 0x6e38d620, 0x3cef3: 0x6cf90820, + 0x3cef4: 0x6d285c20, 0x3cef5: 0x6c9e2620, 0x3cef6: 0x6c9e2820, 0x3cef7: 0x6c9e2e20, + 0x3cef8: 0x6c30b220, 0x3cef9: 0x6d288c20, 0x3cefa: 0x6c130620, 0x3cefb: 0x6c393420, + 0x3cefc: 0x6c38ac20, 0x3cefd: 0x6c38c620, 0x3cefe: 0x6c22c020, 0x3ceff: 0x6c767220, + // Block 0xf3c, offset 0x3cf00 + 0x3cf00: 0x6c546820, 0x3cf01: 0x6c76b620, 0x3cf02: 0x6c546e20, 0x3cf03: 0x6c769a20, + 0x3cf04: 0x6c76b820, 0x3cf05: 0x6c76d220, 0x3cf06: 0x6c771820, 0x3cf07: 0x6c545420, + 0x3cf08: 0x6ccc3a20, 0x3cf09: 0x6cccb620, 0x3cf0a: 0x6cfa0020, 0x3cf0b: 0x6cccf220, + 0x3cf0c: 0x6cfa8620, 0x3cf0d: 0x6d29d220, 0x3cf0e: 0x6c9f8020, 0x3cf0f: 0x6d568820, + 0x3cf10: 0x6d571a20, 0x3cf11: 0x6d577a20, 0x3cf12: 0x6d580a20, 0x3cf13: 0x6dfbe420, + 0x3cf14: 0x6de4d620, 0x3cf15: 0x6de4d020, 0x3cf16: 0x6e0f0220, 0x3cf17: 0x6e0f1420, + 0x3cf18: 0x6c23a220, 0x3cf19: 0x6c239620, 0x3cf1a: 0x6c554420, 0x3cf1b: 0x6cb8ea20, + 0x3cf1c: 0x6cfc0420, 0x3cf1d: 0x6cce4a20, 0x3cf1e: 0x6d582220, 0x3cf1f: 0x6d838420, + 0x3cf20: 0x6e443420, 0x3cf21: 0x6da93020, 0x3cf22: 0x6cfd5420, 0x3cf23: 0x6c790420, + 0x3cf24: 0x6ccf7820, 0x3cf25: 0x6d2c1c20, 0x3cf26: 0x6c243420, 0x3cf27: 0x6cfdfc20, + 0x3cf28: 0x6de60820, 0x3cf29: 0x6c04fa20, 0x3cf2a: 0x6c246c20, 0x3cf2b: 0x6c3b5620, + 0x3cf2c: 0x6c79bc20, 0x3cf2d: 0x6c79bc20, 0x3cf2e: 0x6cfe7820, 0x3cf2f: 0x6cfea220, + 0x3cf30: 0x6d2d0620, 0x3cf31: 0x6d5a3420, 0x3cf32: 0x6de63620, 0x3cf33: 0x6c57d820, + 0x3cf34: 0x6cd1a420, 0x3cf35: 0x6c585a20, 0x3cf36: 0x6c3be620, 0x3cf37: 0x6cffb820, + 0x3cf38: 0x6ca3e620, 0x3cf39: 0x6cf15e20, 0x3cf3a: 0x6d00b220, 0x3cf3b: 0x6dab0a20, + 0x3cf3c: 0x6e104820, 0x3cf3d: 0x6c3c7020, 0x3cf3e: 0x6c594e20, 0x3cf3f: 0x6d868020, + // Block 0xf3d, offset 0x3cf40 + 0x3cf40: 0x6c3c8820, 0x3cf41: 0x6c3c8e20, 0x3cf42: 0x6c3c8c20, 0x3cf43: 0x6c59e420, + 0x3cf44: 0x6c7c7e20, 0x3cf45: 0x6c7c5e20, 0x3cf46: 0x6c7c6020, 0x3cf47: 0x6c7c6020, + 0x3cf48: 0x6cd36020, 0x3cf49: 0x6cd34020, 0x3cf4a: 0x6d5c4620, 0x3cf4b: 0x6d013a20, + 0x3cf4c: 0x6c13ee20, 0x3cf4d: 0x6c3cd620, 0x3cf4e: 0x6ca5f620, 0x3cf4f: 0x6d027820, + 0x3cf50: 0x6d5d2820, 0x3cf51: 0x6dac1020, 0x3cf52: 0x6c3d1e20, 0x3cf53: 0x6c7dd220, + 0x3cf54: 0x6cd4fa20, 0x3cf55: 0x6d30e620, 0x3cf56: 0x6d30ce20, 0x3cf57: 0x6c7e5e20, + 0x3cf58: 0x6c5b3020, 0x3cf59: 0x6d5e0420, 0x3cf5a: 0x6d314e20, 0x3cf5b: 0x6d885420, + 0x3cf5c: 0x6cd5c620, 0x3cf5d: 0x6d5eba20, 0x3cf5e: 0x6d5eba20, 0x3cf5f: 0x6d322e20, + 0x3cf60: 0x6d323420, 0x3cf61: 0x6d32de20, 0x3cf62: 0x6d5f3420, 0x3cf63: 0x6d894a20, + 0x3cf64: 0x6d5efe20, 0x3cf65: 0x6dae2820, 0x3cf66: 0x6d8a5e20, 0x3cf67: 0x6daece20, + 0x3cf68: 0x6daee820, 0x3cf69: 0x6dce7220, 0x3cf6a: 0x6c5c6620, 0x3cf6b: 0x6c3dc620, + 0x3cf6c: 0x6cd78420, 0x3cf6d: 0x6d608020, 0x3cf6e: 0x6d342620, 0x3cf6f: 0x6d60e220, + 0x3cf70: 0x6daf6c20, 0x3cf71: 0x6e399620, 0x3cf72: 0x6c80d020, 0x3cf73: 0x6d619e20, + 0x3cf74: 0x6cd86420, 0x3cf75: 0x6d073a20, 0x3cf76: 0x6d8bc020, 0x3cf77: 0x6e33b420, + 0x3cf78: 0x6caa3220, 0x3cf79: 0x6dcfe420, 0x3cf7a: 0x6c3e3620, 0x3cf7b: 0x6d624620, + 0x3cf7c: 0x6dd02420, 0x3cf7d: 0x6cd91e20, 0x3cf7e: 0x6d628a20, 0x3cf7f: 0x6db0a220, + // Block 0xf3e, offset 0x3cf80 + 0x3cf80: 0x6c21a420, 0x3cf81: 0x6c3e6a20, 0x3cf82: 0x6c3e9e20, 0x3cf83: 0x6c823c20, + 0x3cf84: 0x6cd97a20, 0x3cf85: 0x6cd98820, 0x3cf86: 0x6ceed220, 0x3cf87: 0x6d367820, + 0x3cf88: 0x6d369420, 0x3cf89: 0x6d538a20, 0x3cf8a: 0x6da5b220, 0x3cf8b: 0x6c82fe20, + 0x3cf8c: 0x6cda9c20, 0x3cf8d: 0x6d114c20, 0x3cf8e: 0x6cdac220, 0x3cf8f: 0x6c265420, + 0x3cf90: 0x6c264820, 0x3cf91: 0x6c3f5620, 0x3cf92: 0x6c185020, 0x3cf93: 0x6c3f7e20, + 0x3cf94: 0x6c3f8220, 0x3cf95: 0x6c3f9420, 0x3cf96: 0x6c5eb620, 0x3cf97: 0x6c5f1c20, + 0x3cf98: 0x6c5eb420, 0x3cf99: 0x6cac7420, 0x3cf9a: 0x6c840620, 0x3cf9b: 0x6cae1e20, + 0x3cf9c: 0x6cac7620, 0x3cf9d: 0x6cad0c20, 0x3cf9e: 0x6cdb6e20, 0x3cf9f: 0x6cdbee20, + 0x3cfa0: 0x6c84c420, 0x3cfa1: 0x6cdb3620, 0x3cfa2: 0x6cdb3a20, 0x3cfa3: 0x6cdb5820, + 0x3cfa4: 0x6cdc0c20, 0x3cfa5: 0x6d386a20, 0x3cfa6: 0x6d0a7820, 0x3cfa7: 0x6db1fa20, + 0x3cfa8: 0x6d0bbc20, 0x3cfa9: 0x6d642820, 0x3cfaa: 0x6d646c20, 0x3cfab: 0x6d90ac20, + 0x3cfac: 0x6d8e4820, 0x3cfad: 0x6db27620, 0x3cfae: 0x6e006820, 0x3cfaf: 0x6e128020, + 0x3cfb0: 0x6dd1a220, 0x3cfb1: 0x6e12c220, 0x3cfb2: 0x6e20a820, 0x3cfb3: 0x6c5f9620, + 0x3cfb4: 0x6d0bc020, 0x3cfb5: 0x6db39a20, 0x3cfb6: 0x6dd29a20, 0x3cfb7: 0x6c852c20, + 0x3cfb8: 0x6cdd7820, 0x3cfb9: 0x6d0c2420, 0x3cfba: 0x6cdd9c20, 0x3cfbb: 0x6d900a20, + 0x3cfbc: 0x6d3a1c20, 0x3cfbd: 0x6d3b0e20, 0x3cfbe: 0x6d901420, 0x3cfbf: 0x6d8ffa20, + // Block 0xf3f, offset 0x3cfc0 + 0x3cfc0: 0x6d668a20, 0x3cfc1: 0x6debe220, 0x3cfc2: 0x6debf020, 0x3cfc3: 0x6d912820, + 0x3cfc4: 0x6c14d220, 0x3cfc5: 0x6cafa620, 0x3cfc6: 0x6cdeaa20, 0x3cfc7: 0x6d0d0620, + 0x3cfc8: 0x6d3b2c20, 0x3cfc9: 0x6d3b6e20, 0x3cfca: 0x6c8c8420, 0x3cfcb: 0x6e430c20, + 0x3cfcc: 0x6c867c20, 0x3cfcd: 0x6cb06c20, 0x3cfce: 0x6cdf6620, 0x3cfcf: 0x6d0e4620, + 0x3cfd0: 0x6d925c20, 0x3cfd1: 0x6e2c4c20, 0x3cfd2: 0x6c26ec20, 0x3cfd3: 0x6cb18c20, + 0x3cfd4: 0x6cb1a420, 0x3cfd5: 0x6ce0de20, 0x3cfd6: 0x6e34b020, 0x3cfd7: 0x6c873020, + 0x3cfd8: 0x6d93fa20, 0x3cfd9: 0x6d76c820, 0x3cfda: 0x6ce1c620, 0x3cfdb: 0x6d101620, + 0x3cfdc: 0x6d103a20, 0x3cfdd: 0x6c458420, 0x3cfde: 0x6c879a20, 0x3cfdf: 0x6d951e20, + 0x3cfe0: 0x6d6cc620, 0x3cfe1: 0x6d95c220, 0x3cfe2: 0x6c153c20, 0x3cfe3: 0x6c625420, + 0x3cfe4: 0x6d121420, 0x3cfe5: 0x6cb46620, 0x3cfe6: 0x6d401a20, 0x3cfe7: 0x6d12da20, + 0x3cfe8: 0x6d6e0a20, 0x3cfe9: 0x6d6e0c20, 0x3cfea: 0x6d41c020, 0x3cfeb: 0x6df0d620, + 0x3cfec: 0x6e04bc20, 0x3cfed: 0x6e3ac220, 0x3cfee: 0x6ce59420, 0x3cfef: 0x6d420c20, + 0x3cff0: 0x6dbb3420, 0x3cff1: 0x6dbb7220, 0x3cff2: 0x6d6f8c20, 0x3cff3: 0x6ce69420, + 0x3cff4: 0x6d7a8620, 0x3cff5: 0x6dd9cc20, 0x3cff6: 0x6df20220, 0x3cff7: 0x6d706220, + 0x3cff8: 0x6dbc7220, 0x3cff9: 0x6df24220, 0x3cffa: 0x6e06d620, 0x3cffb: 0x6df2ca20, + 0x3cffc: 0x6ce74620, 0x3cffd: 0x6d712e20, 0x3cffe: 0x6d15fc20, 0x3cfff: 0x6d15fc20, + // Block 0xf40, offset 0x3d000 + 0x3d000: 0x6d711820, 0x3d001: 0x6d449820, 0x3d002: 0x6c8a6820, 0x3d003: 0x6d44d220, + 0x3d004: 0x6d9b2620, 0x3d005: 0x6df3ee20, 0x3d006: 0x6d457020, 0x3d007: 0x6dbe8420, + 0x3d008: 0x6d72ba20, 0x3d009: 0x6d9c9020, 0x3d00a: 0x6e08b620, 0x3d00b: 0x6e09e620, + 0x3d00c: 0x6d745c20, 0x3d00d: 0x6dc07220, 0x3d00e: 0x6e0a0620, 0x3d00f: 0x6dc13220, + 0x3d010: 0x6e0a7420, 0x3d011: 0x6e267a20, 0x3d012: 0x6e1a6a20, 0x3d013: 0x6e421620, + 0x3d014: 0x6d751a20, 0x3d015: 0x6cb79420, 0x3d016: 0x6e0b4220, 0x3d017: 0x6ce8be20, + 0x3d018: 0x6c42e420, 0x3d019: 0x6e1b6620, 0x3d01a: 0x6d75a020, 0x3d01b: 0x6ddfac20, + 0x3d01c: 0x6d478020, 0x3d01d: 0x6e1bc220, +} + +// mainLookup: 15936 entries, 31872 bytes +// Block 0 is the null block. +var mainLookup = [15936]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0x0e0: 0x1f, 0x0e1: 0x20, 0x0e2: 0x21, 0x0e3: 0x22, 0x0e4: 0x23, 0x0e5: 0x24, 0x0e6: 0x25, 0x0e7: 0x26, + 0x0e8: 0x27, 0x0e9: 0x28, 0x0ea: 0x29, 0x0eb: 0x2a, 0x0ec: 0x2b, 0x0ed: 0x2c, 0x0ee: 0x2d, 0x0ef: 0x2e, + 0x0f0: 0x2f, 0x0f1: 0x30, 0x0f2: 0x31, 0x0f3: 0x32, 0x0f4: 0x33, 0x0f5: 0x34, 0x0f6: 0x35, 0x0f7: 0x36, + 0x0f8: 0x37, 0x0f9: 0x38, 0x0fa: 0x39, 0x0fb: 0x3a, 0x0fc: 0x3b, 0x0fd: 0x3c, 0x0fe: 0x3d, 0x0ff: 0x3e, + // Block 0x4, offset 0x100 + 0x100: 0x3f, 0x101: 0x40, 0x102: 0x41, 0x103: 0x42, 0x104: 0x43, 0x105: 0x44, 0x106: 0x45, 0x107: 0x46, + 0x108: 0x47, 0x109: 0x48, 0x10a: 0x49, 0x10b: 0x4a, 0x10c: 0x4b, 0x10d: 0x4c, 0x10e: 0x4d, 0x10f: 0x4e, + 0x110: 0x4f, 0x111: 0x50, 0x112: 0x51, 0x113: 0x52, 0x114: 0x53, 0x115: 0x54, 0x116: 0x55, 0x117: 0x56, + 0x118: 0x57, 0x119: 0x58, 0x11a: 0x59, 0x11b: 0x5a, 0x11c: 0x5b, 0x11d: 0x5c, 0x11e: 0x5d, 0x11f: 0x5e, + 0x120: 0x5f, 0x121: 0x60, 0x122: 0x61, 0x123: 0x62, 0x124: 0x63, 0x125: 0x64, 0x126: 0x65, 0x127: 0x66, + 0x128: 0x67, 0x129: 0x68, 0x12a: 0x69, 0x12c: 0x6a, 0x12d: 0x6b, 0x12e: 0x6c, 0x12f: 0x6d, + 0x130: 0x6e, 0x131: 0x6f, 0x133: 0x70, 0x134: 0x71, 0x135: 0x72, 0x136: 0x73, 0x137: 0x74, + 0x138: 0x75, 0x139: 0x76, 0x13a: 0x77, 0x13b: 0x78, 0x13c: 0x79, 0x13d: 0x7a, 0x13e: 0x7b, 0x13f: 0x7c, + // Block 0x5, offset 0x140 + 0x140: 0x7d, 0x141: 0x7e, 0x142: 0x7f, 0x143: 0x80, 0x144: 0x81, 0x145: 0x82, 0x146: 0x83, 0x147: 0x84, + 0x148: 0x85, 0x149: 0x86, 0x14a: 0x87, 0x14b: 0x88, 0x14c: 0x89, 0x14d: 0x8a, 0x14e: 0x8b, 0x14f: 0x8c, + 0x150: 0x8d, 0x151: 0x8e, 0x152: 0x8f, 0x153: 0x90, 0x154: 0x91, 0x155: 0x92, 0x156: 0x93, 0x157: 0x94, + 0x158: 0x95, 0x159: 0x96, 0x15a: 0x97, 0x15b: 0x98, 0x15c: 0x99, 0x15d: 0x9a, 0x15e: 0x9b, 0x15f: 0x9c, + 0x160: 0x9d, 0x161: 0x9e, 0x162: 0x9f, 0x163: 0xa0, 0x164: 0xa1, 0x165: 0xa2, 0x166: 0xa3, 0x167: 0xa4, + 0x168: 0xa5, 0x169: 0xa6, 0x16a: 0xa7, 0x16b: 0xa8, 0x16c: 0xa9, 0x16d: 0xaa, + 0x170: 0xab, 0x171: 0xac, 0x172: 0xad, 0x173: 0xae, 0x174: 0xaf, 0x175: 0xb0, 0x176: 0xb1, 0x177: 0xb2, + 0x178: 0xb3, 0x17a: 0xb4, 0x17b: 0xb5, 0x17c: 0xb6, 0x17d: 0xb7, 0x17e: 0xb8, 0x17f: 0xb9, + // Block 0x6, offset 0x180 + 0x180: 0xba, 0x181: 0xbb, 0x182: 0xbc, 0x183: 0xbd, 0x184: 0xbe, 0x185: 0xbf, 0x186: 0xc0, 0x187: 0xc1, + 0x188: 0xc2, 0x189: 0xc3, 0x18a: 0xc4, 0x18b: 0xc5, 0x18c: 0xc6, 0x18d: 0xc7, 0x18e: 0xc8, 0x18f: 0xc9, + // Block 0x7, offset 0x1c0 + 0x1f7: 0xca, + // Block 0x8, offset 0x200 + 0x200: 0xcb, 0x201: 0xcc, 0x202: 0xcd, 0x203: 0xce, 0x204: 0xcf, 0x205: 0xd0, 0x206: 0xd1, 0x207: 0xd2, + 0x208: 0xd3, 0x209: 0xd4, 0x20a: 0xd5, 0x20b: 0xd6, 0x20c: 0xd7, 0x20d: 0xd8, 0x20e: 0xd9, 0x20f: 0xda, + 0x210: 0xdb, 0x211: 0xdc, 0x212: 0xdd, 0x213: 0xde, 0x214: 0xdf, 0x215: 0xe0, 0x216: 0xe1, 0x217: 0xe2, + 0x218: 0xe3, 0x219: 0xe4, 0x21a: 0xe5, 0x21b: 0xe6, 0x21c: 0xe7, 0x21d: 0xe8, 0x21e: 0xe9, 0x21f: 0xea, + 0x220: 0xeb, 0x221: 0xec, 0x222: 0xed, 0x223: 0xee, 0x224: 0xef, 0x225: 0xf0, 0x226: 0xf1, 0x227: 0xf2, + 0x228: 0xf3, 0x229: 0xf4, 0x22a: 0xf5, 0x22b: 0xf6, 0x22c: 0xf7, 0x22f: 0xf8, + // Block 0x9, offset 0x240 + 0x25e: 0xf9, 0x25f: 0xfa, + // Block 0xa, offset 0x280 + 0x2a4: 0xfb, 0x2a5: 0xfc, 0x2a6: 0xfd, 0x2a7: 0xfe, + 0x2a8: 0xff, 0x2a9: 0x100, 0x2aa: 0x101, 0x2ab: 0x102, 0x2ac: 0x103, 0x2ad: 0x104, 0x2ae: 0x105, 0x2af: 0x106, + 0x2b0: 0x107, 0x2b1: 0x108, 0x2b2: 0x109, 0x2b3: 0x10a, 0x2b4: 0x10b, 0x2b5: 0x10c, 0x2b6: 0x10d, 0x2b7: 0x10e, + 0x2b8: 0x10f, 0x2b9: 0x110, 0x2ba: 0x111, 0x2bb: 0x112, 0x2bc: 0x113, 0x2bd: 0x114, 0x2be: 0x115, 0x2bf: 0x116, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x117, 0x2c1: 0x118, 0x2c2: 0x119, 0x2c3: 0x11a, 0x2c4: 0x11b, 0x2c5: 0x11c, 0x2c6: 0x11d, 0x2c7: 0x11e, + 0x2ca: 0x11f, 0x2cb: 0x120, 0x2cc: 0x121, 0x2cd: 0x122, 0x2ce: 0x123, 0x2cf: 0x124, + 0x2d0: 0x125, 0x2d1: 0x126, 0x2d2: 0x127, + 0x2e0: 0x128, 0x2e1: 0x129, 0x2e4: 0x12a, 0x2e6: 0x12b, + 0x2e8: 0x12c, 0x2e9: 0x12d, 0x2ec: 0x12e, 0x2ed: 0x12f, + 0x2f0: 0x130, 0x2f1: 0x131, + 0x2f9: 0x132, + // Block 0xc, offset 0x300 + 0x300: 0x133, 0x301: 0x134, 0x302: 0x135, 0x303: 0x136, 0x304: 0x137, 0x305: 0x138, 0x306: 0x139, 0x307: 0x13a, + 0x31a: 0x13b, 0x31b: 0x13c, + // Block 0xd, offset 0x340 + 0x340: 0x13d, 0x341: 0x13e, 0x342: 0x13f, 0x343: 0x140, 0x344: 0x141, 0x345: 0x142, 0x346: 0x143, 0x347: 0x144, + 0x348: 0x145, 0x349: 0x146, 0x34a: 0x147, 0x34b: 0x148, 0x34c: 0x149, 0x34d: 0x14a, + 0x350: 0x14b, 0x351: 0x14c, + // Block 0xe, offset 0x380 + 0x380: 0x14d, 0x381: 0x14e, 0x382: 0x14f, 0x383: 0x150, 0x384: 0x151, 0x385: 0x152, 0x386: 0x153, 0x387: 0x154, + 0x388: 0x155, 0x389: 0x156, 0x38a: 0x157, 0x38b: 0x158, 0x38c: 0x159, 0x38d: 0x15a, 0x38e: 0x15b, 0x38f: 0x15c, + 0x390: 0x15d, + // Block 0xf, offset 0x3c0 + 0x3e0: 0x15e, 0x3e1: 0x15f, 0x3e2: 0x160, 0x3e3: 0x161, 0x3e4: 0x162, 0x3e5: 0x163, 0x3e6: 0x164, 0x3e7: 0x165, + 0x3e8: 0x166, + 0x3fc: 0x167, 0x3fd: 0x168, 0x3fe: 0x169, + // Block 0x10, offset 0x400 + 0x400: 0x16a, + // Block 0x11, offset 0x440 + 0x440: 0x16b, 0x441: 0x16c, 0x442: 0x16d, 0x443: 0x16e, 0x444: 0x16f, 0x445: 0x170, 0x446: 0x171, 0x447: 0x172, + 0x448: 0x173, 0x449: 0x174, 0x44c: 0x175, 0x44d: 0x176, + 0x450: 0x177, 0x451: 0x178, 0x452: 0x179, 0x453: 0x17a, 0x454: 0x17b, 0x455: 0x17c, 0x456: 0x17d, 0x457: 0x17e, + 0x458: 0x17f, 0x459: 0x180, 0x45a: 0x181, 0x45b: 0x182, 0x45c: 0x183, 0x45d: 0x184, 0x45e: 0x185, 0x45f: 0x186, + // Block 0x12, offset 0x480 + 0x4b8: 0x187, 0x4b9: 0x188, 0x4ba: 0x189, 0x4bb: 0x18a, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x18b, 0x4c1: 0x18c, 0x4c2: 0x18d, 0x4c3: 0x18e, 0x4c4: 0x18f, 0x4c5: 0x190, 0x4c6: 0x191, 0x4c7: 0x192, + 0x4c8: 0x193, 0x4c9: 0x194, 0x4cc: 0x195, 0x4cd: 0x196, 0x4ce: 0x197, 0x4cf: 0x198, + 0x4d0: 0x199, 0x4d1: 0x19a, 0x4d2: 0x19b, 0x4d3: 0x19c, 0x4d4: 0x19d, 0x4d5: 0x19e, 0x4d7: 0x19f, + 0x4d8: 0x1a0, 0x4d9: 0x1a1, 0x4da: 0x1a2, 0x4db: 0x1a3, 0x4dc: 0x1a4, 0x4dd: 0x1a5, + // Block 0x14, offset 0x500 + 0x520: 0x1a6, 0x521: 0x1a7, 0x522: 0x1a8, 0x523: 0x1a9, 0x524: 0x1aa, 0x525: 0x1ab, 0x526: 0x1ac, 0x527: 0x1ad, + 0x528: 0x1ae, + // Block 0x15, offset 0x540 + 0x550: 0x09, 0x551: 0x0a, 0x552: 0x0b, 0x553: 0x0c, 0x556: 0x0d, + 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, + // Block 0x16, offset 0x580 + 0x580: 0x1af, 0x581: 0x1b0, 0x584: 0x1b0, 0x585: 0x1b0, 0x586: 0x1b0, 0x587: 0x1b1, + // Block 0x17, offset 0x5c0 + 0x5e0: 0x14, + // Block 0x18, offset 0x600 + 0x602: 0x01, 0x603: 0x02, 0x604: 0x03, 0x605: 0x04, 0x606: 0x05, 0x607: 0x06, + 0x608: 0x07, 0x609: 0x08, 0x60a: 0x09, 0x60b: 0x0a, 0x60c: 0x0b, 0x60d: 0x0c, 0x60e: 0x0d, 0x60f: 0x0e, + 0x610: 0x0f, 0x611: 0x10, 0x612: 0x11, 0x613: 0x12, 0x614: 0x13, 0x615: 0x14, 0x616: 0x15, 0x617: 0x16, + 0x618: 0x17, 0x619: 0x18, 0x61a: 0x19, 0x61b: 0x1a, 0x61c: 0x1b, 0x61d: 0x1c, 0x61e: 0x1d, 0x61f: 0x1e, + 0x620: 0x01, 0x621: 0x02, 0x622: 0x03, 0x623: 0x04, 0x624: 0x05, + 0x62a: 0x06, 0x62d: 0x07, 0x62f: 0x08, + 0x630: 0x13, 0x633: 0x15, + // Block 0x19, offset 0x640 + 0x640: 0x3f, 0x641: 0x40, 0x642: 0x41, 0x643: 0x42, 0x644: 0x43, 0x645: 0x44, 0x646: 0x45, 0x647: 0x46, + 0x648: 0x47, 0x649: 0x48, 0x64a: 0x49, 0x64b: 0x4a, 0x64c: 0x4b, 0x64d: 0x4c, 0x64e: 0x4d, 0x64f: 0x4e, + 0x650: 0x4f, 0x651: 0x50, 0x652: 0x51, 0x653: 0x52, 0x654: 0x53, 0x655: 0x54, 0x656: 0x55, 0x657: 0x56, + 0x658: 0x57, 0x659: 0x58, 0x65a: 0x59, 0x65b: 0x5a, 0x65c: 0x5b, 0x65d: 0x5c, 0x65e: 0x5d, 0x65f: 0x5e, + 0x660: 0x5f, 0x661: 0x60, 0x662: 0x61, 0x663: 0x62, 0x664: 0x63, 0x665: 0x64, 0x666: 0x65, 0x667: 0x66, + 0x668: 0x67, 0x669: 0x68, 0x66a: 0x69, 0x66c: 0x6a, 0x66d: 0x6b, 0x66e: 0x6c, 0x66f: 0x6d, + 0x670: 0x6e, 0x671: 0x6f, 0x673: 0x70, 0x674: 0x71, 0x675: 0x72, 0x676: 0x73, 0x677: 0x74, + 0x678: 0x1ba, 0x679: 0x1bb, 0x67a: 0x1bc, 0x67b: 0x1bd, 0x67c: 0x79, 0x67d: 0x7a, 0x67e: 0x7b, 0x67f: 0x7c, + // Block 0x1a, offset 0x680 + 0x680: 0x7d, 0x681: 0x7e, 0x682: 0x7f, 0x683: 0x80, 0x684: 0x1be, 0x685: 0x1bf, 0x686: 0x83, 0x687: 0x84, + 0x688: 0x85, 0x689: 0x86, 0x68a: 0x87, 0x68b: 0x88, 0x68c: 0x89, 0x68d: 0x8a, 0x68e: 0x8b, 0x68f: 0x8c, + 0x690: 0x8d, 0x691: 0x8e, 0x692: 0x1c0, 0x693: 0x90, 0x694: 0x91, 0x695: 0x92, 0x696: 0x93, 0x697: 0x94, + 0x698: 0x95, 0x699: 0x96, 0x69a: 0x97, 0x69b: 0x98, 0x69c: 0x99, 0x69d: 0x9a, 0x69e: 0x9b, 0x69f: 0x9c, + 0x6a0: 0x9d, 0x6a1: 0x9e, 0x6a2: 0x9f, 0x6a3: 0xa0, 0x6a4: 0xa1, 0x6a5: 0xa2, 0x6a6: 0xa3, 0x6a7: 0xa4, + 0x6a8: 0xa5, 0x6a9: 0xa6, 0x6aa: 0xa7, 0x6ab: 0xa8, 0x6ac: 0xa9, 0x6ad: 0xaa, + 0x6b0: 0xab, 0x6b1: 0xac, 0x6b2: 0xad, 0x6b3: 0xae, 0x6b4: 0xaf, 0x6b5: 0xb0, 0x6b6: 0xb1, 0x6b7: 0xb2, + 0x6b8: 0xb3, 0x6ba: 0xb4, 0x6bb: 0xb5, 0x6bc: 0xb6, 0x6bd: 0xb7, 0x6be: 0xb8, 0x6bf: 0xb9, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0xba, 0x6c1: 0xbb, 0x6c2: 0xbc, 0x6c3: 0xbd, 0x6c4: 0xbe, 0x6c5: 0xbf, 0x6c6: 0xc0, 0x6c7: 0xc1, + 0x6c8: 0xc2, 0x6c9: 0xc3, 0x6ca: 0xc4, 0x6cb: 0x1c1, 0x6cc: 0xc6, 0x6cd: 0x1c2, 0x6ce: 0x1c3, 0x6cf: 0x1c4, + // Block 0x1c, offset 0x700 + 0x724: 0xfb, 0x725: 0xfc, 0x726: 0xfd, 0x727: 0xfe, + 0x728: 0xff, 0x729: 0x100, 0x72a: 0x101, 0x72b: 0x102, 0x72c: 0x1c5, 0x72d: 0x104, 0x72e: 0x105, 0x72f: 0x106, + 0x730: 0x107, 0x731: 0x108, 0x732: 0x109, 0x733: 0x10a, 0x734: 0x10b, 0x735: 0x10c, 0x736: 0x10d, 0x737: 0x10e, + 0x738: 0x10f, 0x739: 0x110, 0x73a: 0x111, 0x73b: 0x112, 0x73c: 0x113, 0x73d: 0x114, 0x73e: 0x115, 0x73f: 0x116, + // Block 0x1d, offset 0x740 + 0x740: 0x18b, 0x741: 0x18c, 0x742: 0x18d, 0x743: 0x18e, 0x744: 0x1c6, 0x745: 0x1c7, 0x746: 0x191, 0x747: 0x192, + 0x748: 0x193, 0x749: 0x194, 0x74c: 0x195, 0x74d: 0x196, 0x74e: 0x197, 0x74f: 0x198, + 0x750: 0x199, 0x751: 0x19a, 0x752: 0x19b, 0x753: 0x19c, 0x754: 0x19d, 0x755: 0x19e, 0x757: 0x19f, + 0x758: 0x1a0, 0x759: 0x1a1, 0x75a: 0x1a2, 0x75b: 0x1a3, 0x75c: 0x1a4, 0x75d: 0x1a5, + // Block 0x1e, offset 0x780 + 0x790: 0x09, 0x791: 0x0a, 0x792: 0x0b, 0x793: 0x0c, 0x796: 0x0d, + 0x79b: 0x0e, 0x79d: 0x0f, 0x79e: 0x10, 0x79f: 0x1b, + 0x7af: 0x12, + // Block 0x1f, offset 0x7c0 + 0x7c2: 0x01, 0x7c3: 0x1b4, 0x7c4: 0x1b5, 0x7c5: 0x1b6, 0x7c6: 0x1b7, 0x7c7: 0x1b8, + 0x7c8: 0x1b9, 0x7c9: 0x08, 0x7ca: 0x09, 0x7cb: 0x0a, 0x7cc: 0x0b, 0x7cd: 0x0c, 0x7ce: 0x0d, 0x7cf: 0x0e, + 0x7d0: 0x0f, 0x7d1: 0x10, 0x7d2: 0x11, 0x7d3: 0x12, 0x7d4: 0x13, 0x7d5: 0x14, 0x7d6: 0x15, 0x7d7: 0x16, + 0x7d8: 0x17, 0x7d9: 0x18, 0x7da: 0x19, 0x7db: 0x1a, 0x7dc: 0x1b, 0x7dd: 0x1c, 0x7de: 0x1d, 0x7df: 0x1e, + 0x7e0: 0x01, 0x7e1: 0x17, 0x7e2: 0x18, 0x7e3: 0x19, 0x7e4: 0x05, + 0x7ea: 0x06, 0x7ed: 0x07, 0x7ef: 0x1a, + 0x7f0: 0x1c, 0x7f3: 0x15, + // Block 0x20, offset 0x800 + 0x802: 0x01, 0x803: 0x02, 0x804: 0x03, 0x805: 0x1c8, 0x806: 0x05, 0x807: 0x06, + 0x808: 0x07, 0x809: 0x08, 0x80a: 0x09, 0x80b: 0x0a, 0x80c: 0x0b, 0x80d: 0x0c, 0x80e: 0x0d, 0x80f: 0x0e, + 0x810: 0x0f, 0x811: 0x10, 0x812: 0x11, 0x813: 0x12, 0x814: 0x13, 0x815: 0x14, 0x816: 0x15, 0x817: 0x16, + 0x818: 0x17, 0x819: 0x18, 0x81a: 0x19, 0x81b: 0x1a, 0x81c: 0x1b, 0x81d: 0x1c, 0x81e: 0x1d, 0x81f: 0x1e, + 0x820: 0x01, 0x821: 0x02, 0x822: 0x03, 0x823: 0x04, 0x824: 0x05, + 0x82a: 0x06, 0x82d: 0x07, 0x82f: 0x08, + 0x830: 0x13, 0x833: 0x15, + // Block 0x21, offset 0x840 + 0x864: 0xfb, 0x865: 0xfc, 0x866: 0xfd, 0x867: 0xfe, + 0x868: 0xff, 0x869: 0x100, 0x86a: 0x101, 0x86b: 0x102, 0x86c: 0x103, 0x86d: 0x104, 0x86e: 0x105, 0x86f: 0x1cb, + 0x870: 0x1cc, 0x871: 0x1cd, 0x872: 0x1ce, 0x873: 0x1cf, 0x874: 0x1d0, 0x875: 0x10c, 0x876: 0x10d, 0x877: 0x10e, + 0x878: 0x10f, 0x879: 0x110, 0x87a: 0x1d1, 0x87b: 0x1d2, 0x87c: 0x113, 0x87d: 0x114, 0x87e: 0x115, 0x87f: 0x116, + // Block 0x22, offset 0x880 + 0x882: 0x01, 0x883: 0x02, 0x884: 0x03, 0x885: 0x04, 0x886: 0x05, 0x887: 0x06, + 0x888: 0x07, 0x889: 0x08, 0x88a: 0x09, 0x88b: 0x0a, 0x88c: 0x0b, 0x88d: 0x0c, 0x88e: 0x0d, 0x88f: 0x0e, + 0x890: 0x0f, 0x891: 0x10, 0x892: 0x11, 0x893: 0x12, 0x894: 0x13, 0x895: 0x14, 0x896: 0x15, 0x897: 0x16, + 0x898: 0x1c9, 0x899: 0x1ca, 0x89a: 0x19, 0x89b: 0x1a, 0x89c: 0x1b, 0x89d: 0x1c, 0x89e: 0x1d, 0x89f: 0x1e, + 0x8a0: 0x01, 0x8a1: 0x02, 0x8a2: 0x03, 0x8a3: 0x04, 0x8a4: 0x05, + 0x8aa: 0x06, 0x8ad: 0x07, 0x8af: 0x1f, + 0x8b0: 0x13, 0x8b3: 0x15, + // Block 0x23, offset 0x8c0 + 0x8e0: 0x1f, 0x8e1: 0x20, 0x8e2: 0x21, 0x8e3: 0x22, 0x8e4: 0x23, 0x8e5: 0x24, 0x8e6: 0x1d3, 0x8e7: 0x1d4, + 0x8e8: 0x27, 0x8e9: 0x28, 0x8ea: 0x29, 0x8eb: 0x2a, 0x8ec: 0x2b, 0x8ed: 0x2c, 0x8ee: 0x2d, 0x8ef: 0x2e, + 0x8f0: 0x2f, 0x8f1: 0x30, 0x8f2: 0x31, 0x8f3: 0x32, 0x8f4: 0x33, 0x8f5: 0x34, 0x8f6: 0x35, 0x8f7: 0x36, + 0x8f8: 0x37, 0x8f9: 0x38, 0x8fa: 0x39, 0x8fb: 0x3a, 0x8fc: 0x3b, 0x8fd: 0x3c, 0x8fe: 0x3d, 0x8ff: 0x3e, + // Block 0x24, offset 0x900 + 0x902: 0x01, 0x903: 0x02, 0x904: 0x03, 0x905: 0x04, 0x906: 0x05, 0x907: 0x06, + 0x908: 0x07, 0x909: 0x08, 0x90a: 0x09, 0x90b: 0x0a, 0x90c: 0x0b, 0x90d: 0x0c, 0x90e: 0x0d, 0x90f: 0x0e, + 0x910: 0x0f, 0x911: 0x10, 0x912: 0x11, 0x913: 0x12, 0x914: 0x13, 0x915: 0x14, 0x916: 0x15, 0x917: 0x16, + 0x918: 0x17, 0x919: 0x18, 0x91a: 0x19, 0x91b: 0x1a, 0x91c: 0x1b, 0x91d: 0x1c, 0x91e: 0x1d, 0x91f: 0x1e, + 0x920: 0x21, 0x921: 0x02, 0x922: 0x03, 0x923: 0x04, 0x924: 0x05, + 0x92a: 0x06, 0x92d: 0x07, 0x92f: 0x08, + 0x930: 0x13, 0x933: 0x15, + // Block 0x25, offset 0x940 + 0x940: 0x3f, 0x941: 0x40, 0x942: 0x41, 0x943: 0x42, 0x944: 0x43, 0x945: 0x44, 0x946: 0x45, 0x947: 0x46, + 0x948: 0x47, 0x949: 0x48, 0x94a: 0x49, 0x94b: 0x4a, 0x94c: 0x4b, 0x94d: 0x4c, 0x94e: 0x4d, 0x94f: 0x4e, + 0x950: 0x4f, 0x951: 0x50, 0x952: 0x51, 0x953: 0x52, 0x954: 0x53, 0x955: 0x54, 0x956: 0x55, 0x957: 0x56, + 0x958: 0x57, 0x959: 0x58, 0x95a: 0x59, 0x95b: 0x5a, 0x95c: 0x5b, 0x95d: 0x5c, 0x95e: 0x5d, 0x95f: 0x5e, + 0x960: 0x5f, 0x961: 0x60, 0x962: 0x61, 0x963: 0x62, 0x964: 0x63, 0x965: 0x64, 0x966: 0x65, 0x967: 0x66, + 0x968: 0x67, 0x969: 0x68, 0x96a: 0x69, 0x96c: 0x6a, 0x96d: 0x6b, 0x96e: 0x6c, 0x96f: 0x6d, + 0x970: 0x6e, 0x971: 0x6f, 0x973: 0x70, 0x974: 0x71, 0x975: 0x72, 0x976: 0x73, 0x977: 0x74, + 0x978: 0x1de, 0x979: 0x1df, 0x97a: 0x1e0, 0x97b: 0x1e1, 0x97c: 0x79, 0x97d: 0x7a, 0x97e: 0x7b, 0x97f: 0x7c, + // Block 0x26, offset 0x980 + 0x980: 0x7d, 0x981: 0x7e, 0x982: 0x7f, 0x983: 0x80, 0x984: 0x81, 0x985: 0x1e2, 0x986: 0x83, 0x987: 0x84, + 0x988: 0x85, 0x989: 0x86, 0x98a: 0x87, 0x98b: 0x88, 0x98c: 0x89, 0x98d: 0x8a, 0x98e: 0x8b, 0x98f: 0x8c, + 0x990: 0x8d, 0x991: 0x8e, 0x992: 0x1e3, 0x993: 0x90, 0x994: 0x91, 0x995: 0x92, 0x996: 0x93, 0x997: 0x94, + 0x998: 0x95, 0x999: 0x96, 0x99a: 0x97, 0x99b: 0x98, 0x99c: 0x99, 0x99d: 0x9a, 0x99e: 0x9b, 0x99f: 0x9c, + 0x9a0: 0x9d, 0x9a1: 0x9e, 0x9a2: 0x9f, 0x9a3: 0xa0, 0x9a4: 0xa1, 0x9a5: 0xa2, 0x9a6: 0xa3, 0x9a7: 0xa4, + 0x9a8: 0xa5, 0x9a9: 0xa6, 0x9aa: 0xa7, 0x9ab: 0xa8, 0x9ac: 0xa9, 0x9ad: 0xaa, + 0x9b0: 0xab, 0x9b1: 0xac, 0x9b2: 0xad, 0x9b3: 0xae, 0x9b4: 0xaf, 0x9b5: 0xb0, 0x9b6: 0xb1, 0x9b7: 0xb2, + 0x9b8: 0xb3, 0x9ba: 0xb4, 0x9bb: 0xb5, 0x9bc: 0xb6, 0x9bd: 0xb7, 0x9be: 0xb8, 0x9bf: 0xb9, + // Block 0x27, offset 0x9c0 + 0x9c0: 0xba, 0x9c1: 0xbb, 0x9c2: 0xbc, 0x9c3: 0xbd, 0x9c4: 0xbe, 0x9c5: 0xbf, 0x9c6: 0xc0, 0x9c7: 0xc1, + 0x9c8: 0xc2, 0x9c9: 0xc3, 0x9ca: 0xc4, 0x9cb: 0xc5, 0x9cc: 0xc6, 0x9cd: 0x1e4, 0x9ce: 0xc8, 0x9cf: 0x1e5, + // Block 0x28, offset 0xa00 + 0xa00: 0x18b, 0xa01: 0x18c, 0xa02: 0x18d, 0xa03: 0x18e, 0xa04: 0x1e6, 0xa05: 0x190, 0xa06: 0x191, 0xa07: 0x192, + 0xa08: 0x193, 0xa09: 0x194, 0xa0c: 0x195, 0xa0d: 0x196, 0xa0e: 0x197, 0xa0f: 0x198, + 0xa10: 0x199, 0xa11: 0x19a, 0xa12: 0x19b, 0xa13: 0x19c, 0xa14: 0x19d, 0xa15: 0x19e, 0xa17: 0x19f, + 0xa18: 0x1a0, 0xa19: 0x1a1, 0xa1a: 0x1a2, 0xa1b: 0x1a3, 0xa1c: 0x1a4, 0xa1d: 0x1a5, + // Block 0x29, offset 0xa40 + 0xa50: 0x09, 0xa51: 0x0a, 0xa52: 0x0b, 0xa53: 0x0c, 0xa56: 0x0d, + 0xa5b: 0x0e, 0xa5d: 0x0f, 0xa5e: 0x10, 0xa5f: 0x26, + 0xa6f: 0x12, + // Block 0x2a, offset 0xa80 + 0xa82: 0x01, 0xa83: 0x1d7, 0xa84: 0x1d8, 0xa85: 0x1d9, 0xa86: 0x1da, 0xa87: 0x1db, + 0xa88: 0x1dc, 0xa89: 0x1dd, 0xa8a: 0x09, 0xa8b: 0x0a, 0xa8c: 0x0b, 0xa8d: 0x0c, 0xa8e: 0x0d, 0xa8f: 0x0e, + 0xa90: 0x0f, 0xa91: 0x10, 0xa92: 0x11, 0xa93: 0x12, 0xa94: 0x13, 0xa95: 0x14, 0xa96: 0x15, 0xa97: 0x16, + 0xa98: 0x17, 0xa99: 0x18, 0xa9a: 0x19, 0xa9b: 0x1a, 0xa9c: 0x1b, 0xa9d: 0x1c, 0xa9e: 0x1d, 0xa9f: 0x1e, + 0xaa0: 0x01, 0xaa1: 0x23, 0xaa2: 0x24, 0xaa3: 0x25, 0xaa4: 0x05, + 0xaaa: 0x06, 0xaad: 0x07, 0xaaf: 0x08, + 0xab0: 0x27, 0xab3: 0x15, + // Block 0x2b, offset 0xac0 + 0xac2: 0x01, 0xac3: 0x02, 0xac4: 0x03, 0xac5: 0x04, 0xac6: 0x05, 0xac7: 0x06, + 0xac8: 0x07, 0xac9: 0x08, 0xaca: 0x09, 0xacb: 0x0a, 0xacc: 0x0b, 0xacd: 0x0c, 0xace: 0x0d, 0xacf: 0x0e, + 0xad0: 0x1e7, 0xad1: 0x1e8, 0xad2: 0x11, 0xad3: 0x12, 0xad4: 0x13, 0xad5: 0x14, 0xad6: 0x15, 0xad7: 0x16, + 0xad8: 0x17, 0xad9: 0x18, 0xada: 0x19, 0xadb: 0x1a, 0xadc: 0x1b, 0xadd: 0x1c, 0xade: 0x1d, 0xadf: 0x1e, + 0xae0: 0x01, 0xae1: 0x02, 0xae2: 0x03, 0xae3: 0x04, 0xae4: 0x05, + 0xaea: 0x06, 0xaed: 0x07, 0xaef: 0x08, + 0xaf0: 0x13, 0xaf3: 0x15, + // Block 0x2c, offset 0xb00 + 0xb20: 0x1f, 0xb21: 0x20, 0xb22: 0x21, 0xb23: 0x22, 0xb24: 0x23, 0xb25: 0x24, 0xb26: 0x1e9, 0xb27: 0x26, + 0xb28: 0x27, 0xb29: 0x28, 0xb2a: 0x29, 0xb2b: 0x2a, 0xb2c: 0x2b, 0xb2d: 0x2c, 0xb2e: 0x2d, 0xb2f: 0x2e, + 0xb30: 0x2f, 0xb31: 0x30, 0xb32: 0x31, 0xb33: 0x32, 0xb34: 0x33, 0xb35: 0x34, 0xb36: 0x35, 0xb37: 0x36, + 0xb38: 0x37, 0xb39: 0x38, 0xb3a: 0x39, 0xb3b: 0x3a, 0xb3c: 0x3b, 0xb3d: 0x3c, 0xb3e: 0x3d, 0xb3f: 0x3e, + // Block 0x2d, offset 0xb40 + 0xb42: 0x01, 0xb43: 0x02, 0xb44: 0x03, 0xb45: 0x04, 0xb46: 0x05, 0xb47: 0x06, + 0xb48: 0x07, 0xb49: 0x08, 0xb4a: 0x09, 0xb4b: 0x0a, 0xb4c: 0x0b, 0xb4d: 0x0c, 0xb4e: 0x0d, 0xb4f: 0x0e, + 0xb50: 0x0f, 0xb51: 0x10, 0xb52: 0x11, 0xb53: 0x12, 0xb54: 0x13, 0xb55: 0x14, 0xb56: 0x15, 0xb57: 0x16, + 0xb58: 0x17, 0xb59: 0x18, 0xb5a: 0x19, 0xb5b: 0x1a, 0xb5c: 0x1b, 0xb5d: 0x1c, 0xb5e: 0x1d, 0xb5f: 0x1e, + 0xb60: 0x2a, 0xb61: 0x02, 0xb62: 0x03, 0xb63: 0x04, 0xb64: 0x05, + 0xb6a: 0x06, 0xb6d: 0x07, 0xb6f: 0x08, + 0xb70: 0x13, 0xb73: 0x15, + // Block 0x2e, offset 0xb80 + 0xb82: 0x01, 0xb83: 0x02, 0xb84: 0x1ec, 0xb85: 0x1ed, 0xb86: 0x05, 0xb87: 0x06, + 0xb88: 0x07, 0xb89: 0x08, 0xb8a: 0x09, 0xb8b: 0x0a, 0xb8c: 0x0b, 0xb8d: 0x0c, 0xb8e: 0x0d, 0xb8f: 0x0e, + 0xb90: 0x0f, 0xb91: 0x10, 0xb92: 0x11, 0xb93: 0x12, 0xb94: 0x13, 0xb95: 0x14, 0xb96: 0x15, 0xb97: 0x16, + 0xb98: 0x17, 0xb99: 0x18, 0xb9a: 0x19, 0xb9b: 0x1a, 0xb9c: 0x1b, 0xb9d: 0x1c, 0xb9e: 0x1d, 0xb9f: 0x1e, + 0xba0: 0x01, 0xba1: 0x02, 0xba2: 0x03, 0xba3: 0x04, 0xba4: 0x05, + 0xbaa: 0x06, 0xbad: 0x07, 0xbaf: 0x08, + 0xbb0: 0x13, 0xbb3: 0x15, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x3f, 0xbc1: 0x40, 0xbc2: 0x41, 0xbc3: 0x42, 0xbc4: 0x43, 0xbc5: 0x44, 0xbc6: 0x45, 0xbc7: 0x46, + 0xbc8: 0x47, 0xbc9: 0x48, 0xbca: 0x49, 0xbcb: 0x4a, 0xbcc: 0x4b, 0xbcd: 0x4c, 0xbce: 0x4d, 0xbcf: 0x4e, + 0xbd0: 0x4f, 0xbd1: 0x50, 0xbd2: 0x51, 0xbd3: 0x52, 0xbd4: 0x53, 0xbd5: 0x54, 0xbd6: 0x55, 0xbd7: 0x56, + 0xbd8: 0x57, 0xbd9: 0x58, 0xbda: 0x59, 0xbdb: 0x5a, 0xbdc: 0x5b, 0xbdd: 0x5c, 0xbde: 0x5d, 0xbdf: 0x5e, + 0xbe0: 0x5f, 0xbe1: 0x60, 0xbe2: 0x61, 0xbe3: 0x62, 0xbe4: 0x63, 0xbe5: 0x64, 0xbe6: 0x65, 0xbe7: 0x66, + 0xbe8: 0x67, 0xbe9: 0x68, 0xbea: 0x69, 0xbec: 0x6a, 0xbed: 0x6b, 0xbee: 0x6c, 0xbef: 0x6d, + 0xbf0: 0x6e, 0xbf1: 0x6f, 0xbf3: 0x70, 0xbf4: 0x71, 0xbf5: 0x72, 0xbf6: 0x73, 0xbf7: 0x74, + 0xbf8: 0x75, 0xbf9: 0x1f2, 0xbfa: 0x77, 0xbfb: 0x78, 0xbfc: 0x79, 0xbfd: 0x7a, 0xbfe: 0x7b, 0xbff: 0x7c, + // Block 0x30, offset 0xc00 + 0xc02: 0x01, 0xc03: 0x02, 0xc04: 0x1f0, 0xc05: 0x1f1, 0xc06: 0x05, 0xc07: 0x06, + 0xc08: 0x07, 0xc09: 0x08, 0xc0a: 0x09, 0xc0b: 0x0a, 0xc0c: 0x0b, 0xc0d: 0x0c, 0xc0e: 0x0d, 0xc0f: 0x0e, + 0xc10: 0x0f, 0xc11: 0x10, 0xc12: 0x11, 0xc13: 0x12, 0xc14: 0x13, 0xc15: 0x14, 0xc16: 0x15, 0xc17: 0x16, + 0xc18: 0x17, 0xc19: 0x18, 0xc1a: 0x19, 0xc1b: 0x1a, 0xc1c: 0x1b, 0xc1d: 0x1c, 0xc1e: 0x1d, 0xc1f: 0x1e, + 0xc20: 0x01, 0xc21: 0x2d, 0xc22: 0x03, 0xc23: 0x04, 0xc24: 0x05, + 0xc2a: 0x06, 0xc2d: 0x07, 0xc2f: 0x08, + 0xc30: 0x13, 0xc33: 0x15, + // Block 0x31, offset 0xc40 + 0xc40: 0x3f, 0xc41: 0x40, 0xc42: 0x41, 0xc43: 0x42, 0xc44: 0x43, 0xc45: 0x44, 0xc46: 0x45, 0xc47: 0x46, + 0xc48: 0x47, 0xc49: 0x48, 0xc4a: 0x49, 0xc4b: 0x4a, 0xc4c: 0x4b, 0xc4d: 0x4c, 0xc4e: 0x4d, 0xc4f: 0x4e, + 0xc50: 0x4f, 0xc51: 0x50, 0xc52: 0x51, 0xc53: 0x52, 0xc54: 0x53, 0xc55: 0x54, 0xc56: 0x55, 0xc57: 0x56, + 0xc58: 0x57, 0xc59: 0x58, 0xc5a: 0x59, 0xc5b: 0x5a, 0xc5c: 0x5b, 0xc5d: 0x5c, 0xc5e: 0x5d, 0xc5f: 0x5e, + 0xc60: 0x5f, 0xc61: 0x60, 0xc62: 0x61, 0xc63: 0x62, 0xc64: 0x63, 0xc65: 0x64, 0xc66: 0x65, 0xc67: 0x66, + 0xc68: 0x67, 0xc69: 0x68, 0xc6a: 0x69, 0xc6c: 0x6a, 0xc6d: 0x6b, 0xc6e: 0x6c, 0xc6f: 0x6d, + 0xc70: 0x6e, 0xc71: 0x6f, 0xc73: 0x70, 0xc74: 0x71, 0xc75: 0x72, 0xc76: 0x1fc, 0xc77: 0x74, + 0xc78: 0x75, 0xc79: 0x1fd, 0xc7a: 0x77, 0xc7b: 0x78, 0xc7c: 0x79, 0xc7d: 0x7a, 0xc7e: 0x7b, 0xc7f: 0x7c, + // Block 0x32, offset 0xc80 + 0xc80: 0x7d, 0xc81: 0x7e, 0xc82: 0x7f, 0xc83: 0x80, 0xc84: 0x1fe, 0xc85: 0x82, 0xc86: 0x83, 0xc87: 0x84, + 0xc88: 0x85, 0xc89: 0x86, 0xc8a: 0x87, 0xc8b: 0x88, 0xc8c: 0x89, 0xc8d: 0x8a, 0xc8e: 0x8b, 0xc8f: 0x8c, + 0xc90: 0x8d, 0xc91: 0x8e, 0xc92: 0x8f, 0xc93: 0x90, 0xc94: 0x91, 0xc95: 0x92, 0xc96: 0x93, 0xc97: 0x94, + 0xc98: 0x95, 0xc99: 0x96, 0xc9a: 0x97, 0xc9b: 0x98, 0xc9c: 0x99, 0xc9d: 0x9a, 0xc9e: 0x9b, 0xc9f: 0x9c, + 0xca0: 0x9d, 0xca1: 0x9e, 0xca2: 0x9f, 0xca3: 0xa0, 0xca4: 0xa1, 0xca5: 0xa2, 0xca6: 0xa3, 0xca7: 0xa4, + 0xca8: 0xa5, 0xca9: 0xa6, 0xcaa: 0xa7, 0xcab: 0xa8, 0xcac: 0xa9, 0xcad: 0xaa, + 0xcb0: 0xab, 0xcb1: 0xac, 0xcb2: 0xad, 0xcb3: 0xae, 0xcb4: 0xaf, 0xcb5: 0xb0, 0xcb6: 0xb1, 0xcb7: 0xb2, + 0xcb8: 0xb3, 0xcba: 0xb4, 0xcbb: 0xb5, 0xcbc: 0xb6, 0xcbd: 0xb7, 0xcbe: 0xb8, 0xcbf: 0xb9, + // Block 0x33, offset 0xcc0 + 0xcc2: 0x01, 0xcc3: 0x1f7, 0xcc4: 0x1f8, 0xcc5: 0x1f9, 0xcc6: 0x05, 0xcc7: 0x1fa, + 0xcc8: 0x1fb, 0xcc9: 0x08, 0xcca: 0x09, 0xccb: 0x0a, 0xccc: 0x0b, 0xccd: 0x0c, 0xcce: 0x0d, 0xccf: 0x0e, + 0xcd0: 0x0f, 0xcd1: 0x10, 0xcd2: 0x11, 0xcd3: 0x12, 0xcd4: 0x13, 0xcd5: 0x14, 0xcd6: 0x15, 0xcd7: 0x16, + 0xcd8: 0x17, 0xcd9: 0x18, 0xcda: 0x19, 0xcdb: 0x1a, 0xcdc: 0x1b, 0xcdd: 0x1c, 0xcde: 0x1d, 0xcdf: 0x1e, + 0xce0: 0x01, 0xce1: 0x2f, 0xce2: 0x30, 0xce3: 0x04, 0xce4: 0x05, + 0xcea: 0x06, 0xced: 0x07, 0xcef: 0x08, + 0xcf0: 0x13, 0xcf3: 0x15, + // Block 0x34, offset 0xd00 + 0xd20: 0x1f, 0xd21: 0x20, 0xd22: 0x21, 0xd23: 0x22, 0xd24: 0x23, 0xd25: 0x24, 0xd26: 0x25, 0xd27: 0x26, + 0xd28: 0x27, 0xd29: 0x28, 0xd2a: 0x29, 0xd2b: 0x2a, 0xd2c: 0x2b, 0xd2d: 0x2c, 0xd2e: 0x2d, 0xd2f: 0x2e, + 0xd30: 0x2f, 0xd31: 0x30, 0xd32: 0x31, 0xd33: 0x32, 0xd34: 0x33, 0xd35: 0x34, 0xd36: 0x35, 0xd37: 0x36, + 0xd38: 0x37, 0xd39: 0x38, 0xd3a: 0x39, 0xd3b: 0x3a, 0xd3c: 0x1ff, 0xd3d: 0x200, 0xd3e: 0x201, 0xd3f: 0x3e, + // Block 0x35, offset 0xd40 + 0xd42: 0x01, 0xd43: 0x02, 0xd44: 0x03, 0xd45: 0x04, 0xd46: 0x05, 0xd47: 0x06, + 0xd48: 0x07, 0xd49: 0x08, 0xd4a: 0x09, 0xd4b: 0x0a, 0xd4c: 0x0b, 0xd4d: 0x0c, 0xd4e: 0x0d, 0xd4f: 0x0e, + 0xd50: 0x0f, 0xd51: 0x10, 0xd52: 0x11, 0xd53: 0x12, 0xd54: 0x13, 0xd55: 0x14, 0xd56: 0x15, 0xd57: 0x16, + 0xd58: 0x17, 0xd59: 0x18, 0xd5a: 0x19, 0xd5b: 0x1a, 0xd5c: 0x1b, 0xd5d: 0x1c, 0xd5e: 0x1d, 0xd5f: 0x1e, + 0xd60: 0x32, 0xd61: 0x02, 0xd62: 0x03, 0xd63: 0x04, 0xd64: 0x05, + 0xd6a: 0x06, 0xd6d: 0x07, 0xd6f: 0x08, + 0xd70: 0x13, 0xd73: 0x15, + // Block 0x36, offset 0xd80 + 0xd80: 0x3f, 0xd81: 0x40, 0xd82: 0x41, 0xd83: 0x42, 0xd84: 0x43, 0xd85: 0x44, 0xd86: 0x45, 0xd87: 0x46, + 0xd88: 0x47, 0xd89: 0x48, 0xd8a: 0x49, 0xd8b: 0x4a, 0xd8c: 0x4b, 0xd8d: 0x4c, 0xd8e: 0x4d, 0xd8f: 0x4e, + 0xd90: 0x4f, 0xd91: 0x50, 0xd92: 0x51, 0xd93: 0x52, 0xd94: 0x53, 0xd95: 0x54, 0xd96: 0x55, 0xd97: 0x56, + 0xd98: 0x57, 0xd99: 0x58, 0xd9a: 0x59, 0xd9b: 0x5a, 0xd9c: 0x5b, 0xd9d: 0x5c, 0xd9e: 0x5d, 0xd9f: 0x5e, + 0xda0: 0x5f, 0xda1: 0x60, 0xda2: 0x61, 0xda3: 0x62, 0xda4: 0x63, 0xda5: 0x64, 0xda6: 0x65, 0xda7: 0x66, + 0xda8: 0x67, 0xda9: 0x68, 0xdaa: 0x69, 0xdac: 0x6a, 0xdad: 0x6b, 0xdae: 0x6c, 0xdaf: 0x6d, + 0xdb0: 0x6e, 0xdb1: 0x6f, 0xdb3: 0x70, 0xdb4: 0x71, 0xdb5: 0x72, 0xdb6: 0x73, 0xdb7: 0x74, + 0xdb8: 0x75, 0xdb9: 0x76, 0xdba: 0x20b, 0xdbb: 0x20c, 0xdbc: 0x79, 0xdbd: 0x7a, 0xdbe: 0x7b, 0xdbf: 0x7c, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x7d, 0xdc1: 0x7e, 0xdc2: 0x7f, 0xdc3: 0x80, 0xdc4: 0x81, 0xdc5: 0x20d, 0xdc6: 0x83, 0xdc7: 0x84, + 0xdc8: 0x85, 0xdc9: 0x86, 0xdca: 0x87, 0xdcb: 0x88, 0xdcc: 0x89, 0xdcd: 0x8a, 0xdce: 0x8b, 0xdcf: 0x8c, + 0xdd0: 0x8d, 0xdd1: 0x8e, 0xdd2: 0x20e, 0xdd3: 0x90, 0xdd4: 0x91, 0xdd5: 0x92, 0xdd6: 0x93, 0xdd7: 0x94, + 0xdd8: 0x95, 0xdd9: 0x96, 0xdda: 0x97, 0xddb: 0x98, 0xddc: 0x99, 0xddd: 0x9a, 0xdde: 0x9b, 0xddf: 0x9c, + 0xde0: 0x9d, 0xde1: 0x9e, 0xde2: 0x9f, 0xde3: 0xa0, 0xde4: 0xa1, 0xde5: 0xa2, 0xde6: 0xa3, 0xde7: 0xa4, + 0xde8: 0xa5, 0xde9: 0xa6, 0xdea: 0xa7, 0xdeb: 0xa8, 0xdec: 0xa9, 0xded: 0xaa, + 0xdf0: 0xab, 0xdf1: 0xac, 0xdf2: 0xad, 0xdf3: 0xae, 0xdf4: 0xaf, 0xdf5: 0xb0, 0xdf6: 0xb1, 0xdf7: 0xb2, + 0xdf8: 0xb3, 0xdfa: 0xb4, 0xdfb: 0xb5, 0xdfc: 0xb6, 0xdfd: 0xb7, 0xdfe: 0xb8, 0xdff: 0xb9, + // Block 0x38, offset 0xe00 + 0xe00: 0xba, 0xe01: 0xbb, 0xe02: 0xbc, 0xe03: 0xbd, 0xe04: 0xbe, 0xe05: 0xbf, 0xe06: 0xc0, 0xe07: 0xc1, + 0xe08: 0xc2, 0xe09: 0xc3, 0xe0a: 0xc4, 0xe0b: 0xc5, 0xe0c: 0xc6, 0xe0d: 0xc7, 0xe0e: 0xc8, 0xe0f: 0x20f, + // Block 0x39, offset 0xe40 + 0xe40: 0x18b, 0xe41: 0x18c, 0xe42: 0x18d, 0xe43: 0x18e, 0xe44: 0x210, 0xe45: 0x190, 0xe46: 0x191, 0xe47: 0x192, + 0xe48: 0x193, 0xe49: 0x194, 0xe4c: 0x195, 0xe4d: 0x196, 0xe4e: 0x197, 0xe4f: 0x198, + 0xe50: 0x199, 0xe51: 0x19a, 0xe52: 0x19b, 0xe53: 0x19c, 0xe54: 0x19d, 0xe55: 0x19e, 0xe57: 0x19f, + 0xe58: 0x1a0, 0xe59: 0x1a1, 0xe5a: 0x1a2, 0xe5b: 0x1a3, 0xe5c: 0x1a4, 0xe5d: 0x1a5, + // Block 0x3a, offset 0xe80 + 0xe90: 0x09, 0xe91: 0x0a, 0xe92: 0x0b, 0xe93: 0x0c, 0xe96: 0x0d, + 0xe9b: 0x0e, 0xe9d: 0x0f, 0xe9e: 0x10, 0xe9f: 0x37, + 0xeaf: 0x12, + // Block 0x3b, offset 0xec0 + 0xec2: 0x01, 0xec3: 0x204, 0xec4: 0x205, 0xec5: 0x206, 0xec6: 0x207, 0xec7: 0x06, + 0xec8: 0x07, 0xec9: 0x208, 0xeca: 0x209, 0xecb: 0x0a, 0xecc: 0x20a, 0xecd: 0x0c, 0xece: 0x0d, 0xecf: 0x0e, + 0xed0: 0x0f, 0xed1: 0x10, 0xed2: 0x11, 0xed3: 0x12, 0xed4: 0x13, 0xed5: 0x14, 0xed6: 0x15, 0xed7: 0x16, + 0xed8: 0x17, 0xed9: 0x18, 0xeda: 0x19, 0xedb: 0x1a, 0xedc: 0x1b, 0xedd: 0x1c, 0xede: 0x1d, 0xedf: 0x1e, + 0xee0: 0x01, 0xee1: 0x34, 0xee2: 0x35, 0xee3: 0x36, 0xee4: 0x05, + 0xeea: 0x06, 0xeed: 0x07, 0xeef: 0x08, + 0xef0: 0x38, 0xef3: 0x15, + // Block 0x3c, offset 0xf00 + 0xf00: 0x3f, 0xf01: 0x40, 0xf02: 0x41, 0xf03: 0x42, 0xf04: 0x43, 0xf05: 0x44, 0xf06: 0x45, 0xf07: 0x46, + 0xf08: 0x47, 0xf09: 0x48, 0xf0a: 0x49, 0xf0b: 0x4a, 0xf0c: 0x4b, 0xf0d: 0x4c, 0xf0e: 0x4d, 0xf0f: 0x4e, + 0xf10: 0x4f, 0xf11: 0x50, 0xf12: 0x51, 0xf13: 0x52, 0xf14: 0x53, 0xf15: 0x54, 0xf16: 0x55, 0xf17: 0x56, + 0xf18: 0x57, 0xf19: 0x58, 0xf1a: 0x59, 0xf1b: 0x5a, 0xf1c: 0x5b, 0xf1d: 0x5c, 0xf1e: 0x5d, 0xf1f: 0x5e, + 0xf20: 0x5f, 0xf21: 0x60, 0xf22: 0x61, 0xf23: 0x62, 0xf24: 0x63, 0xf25: 0x64, 0xf26: 0x65, 0xf27: 0x66, + 0xf28: 0x67, 0xf29: 0x68, 0xf2a: 0x69, 0xf2c: 0x6a, 0xf2d: 0x6b, 0xf2e: 0x6c, 0xf2f: 0x6d, + 0xf30: 0x6e, 0xf31: 0x6f, 0xf33: 0x70, 0xf34: 0x71, 0xf35: 0x72, 0xf36: 0x73, 0xf37: 0x74, + 0xf38: 0x21a, 0xf39: 0x21b, 0xf3a: 0x21c, 0xf3b: 0x21d, 0xf3c: 0x79, 0xf3d: 0x7a, 0xf3e: 0x7b, 0xf3f: 0x21e, + // Block 0x3d, offset 0xf40 + 0xf40: 0x21f, 0xf41: 0x220, 0xf42: 0x7f, 0xf43: 0x80, 0xf44: 0x221, 0xf45: 0x222, 0xf46: 0x83, 0xf47: 0x84, + 0xf48: 0x85, 0xf49: 0x223, 0xf4a: 0x87, 0xf4b: 0x88, 0xf4c: 0x89, 0xf4d: 0x8a, 0xf4e: 0x8b, 0xf4f: 0x8c, + 0xf50: 0x8d, 0xf51: 0x224, 0xf52: 0x225, 0xf53: 0x90, 0xf54: 0x91, 0xf55: 0x92, 0xf56: 0x93, 0xf57: 0x94, + 0xf58: 0x95, 0xf59: 0x96, 0xf5a: 0x97, 0xf5b: 0x98, 0xf5c: 0x99, 0xf5d: 0x9a, 0xf5e: 0x9b, 0xf5f: 0x9c, + 0xf60: 0x9d, 0xf61: 0x9e, 0xf62: 0x9f, 0xf63: 0xa0, 0xf64: 0xa1, 0xf65: 0xa2, 0xf66: 0xa3, 0xf67: 0xa4, + 0xf68: 0xa5, 0xf69: 0x226, 0xf6a: 0xa7, 0xf6b: 0xa8, 0xf6c: 0xa9, 0xf6d: 0xaa, + 0xf70: 0xab, 0xf71: 0xac, 0xf72: 0xad, 0xf73: 0xae, 0xf74: 0xaf, 0xf75: 0xb0, 0xf76: 0xb1, 0xf77: 0xb2, + 0xf78: 0xb3, 0xf7a: 0xb4, 0xf7b: 0xb5, 0xf7c: 0xb6, 0xf7d: 0xb7, 0xf7e: 0xb8, 0xf7f: 0xb9, + // Block 0x3e, offset 0xf80 + 0xf80: 0xba, 0xf81: 0xbb, 0xf82: 0xbc, 0xf83: 0xbd, 0xf84: 0xbe, 0xf85: 0xbf, 0xf86: 0xc0, 0xf87: 0xc1, + 0xf88: 0x227, 0xf89: 0x228, 0xf8a: 0x229, 0xf8b: 0x22a, 0xf8c: 0xc6, 0xf8d: 0x22b, 0xf8e: 0x22c, 0xf8f: 0x22d, + // Block 0x3f, offset 0xfc0 + 0xfe4: 0xfb, 0xfe5: 0xfc, 0xfe6: 0xfd, 0xfe7: 0xfe, + 0xfe8: 0xff, 0xfe9: 0x100, 0xfea: 0x101, 0xfeb: 0x102, 0xfec: 0x22e, 0xfed: 0x104, 0xfee: 0x105, 0xfef: 0x106, + 0xff0: 0x107, 0xff1: 0x108, 0xff2: 0x109, 0xff3: 0x10a, 0xff4: 0x10b, 0xff5: 0x10c, 0xff6: 0x10d, 0xff7: 0x10e, + 0xff8: 0x22f, 0xff9: 0x110, 0xffa: 0x111, 0xffb: 0x112, 0xffc: 0x113, 0xffd: 0x114, 0xffe: 0x115, 0xfff: 0x116, + // Block 0x40, offset 0x1000 + 0x1000: 0x18b, 0x1001: 0x18c, 0x1002: 0x18d, 0x1003: 0x18e, 0x1004: 0x230, 0x1005: 0x231, 0x1006: 0x232, 0x1007: 0x192, + 0x1008: 0x193, 0x1009: 0x194, 0x100c: 0x195, 0x100d: 0x196, 0x100e: 0x197, 0x100f: 0x198, + 0x1010: 0x199, 0x1011: 0x19a, 0x1012: 0x19b, 0x1013: 0x19c, 0x1014: 0x19d, 0x1015: 0x19e, 0x1017: 0x19f, + 0x1018: 0x1a0, 0x1019: 0x1a1, 0x101a: 0x1a2, 0x101b: 0x1a3, 0x101c: 0x1a4, 0x101d: 0x1a5, + // Block 0x41, offset 0x1040 + 0x1050: 0x09, 0x1051: 0x0a, 0x1052: 0x0b, 0x1053: 0x0c, 0x1056: 0x0d, + 0x105b: 0x0e, 0x105d: 0x0f, 0x105e: 0x10, 0x105f: 0x3e, + 0x106f: 0x12, + // Block 0x42, offset 0x1080 + 0x1082: 0x01, 0x1083: 0x213, 0x1084: 0x214, 0x1085: 0x215, 0x1086: 0x216, 0x1087: 0x217, + 0x1088: 0x218, 0x1089: 0x08, 0x108a: 0x09, 0x108b: 0x0a, 0x108c: 0x0b, 0x108d: 0x219, 0x108e: 0x0d, 0x108f: 0x0e, + 0x1090: 0x0f, 0x1091: 0x10, 0x1092: 0x11, 0x1093: 0x12, 0x1094: 0x13, 0x1095: 0x14, 0x1096: 0x15, 0x1097: 0x16, + 0x1098: 0x17, 0x1099: 0x18, 0x109a: 0x19, 0x109b: 0x1a, 0x109c: 0x1b, 0x109d: 0x1c, 0x109e: 0x1d, 0x109f: 0x1e, + 0x10a0: 0x01, 0x10a1: 0x3a, 0x10a2: 0x3b, 0x10a3: 0x3c, 0x10a4: 0x05, + 0x10aa: 0x06, 0x10ad: 0x07, 0x10af: 0x3d, + 0x10b0: 0x3f, 0x10b3: 0x15, + // Block 0x43, offset 0x10c0 + 0x10c2: 0x01, 0x10c3: 0x02, 0x10c4: 0x235, 0x10c5: 0x236, 0x10c6: 0x05, 0x10c7: 0x06, + 0x10c8: 0x07, 0x10c9: 0x08, 0x10ca: 0x09, 0x10cb: 0x0a, 0x10cc: 0x0b, 0x10cd: 0x0c, 0x10ce: 0x0d, 0x10cf: 0x0e, + 0x10d0: 0x0f, 0x10d1: 0x10, 0x10d2: 0x11, 0x10d3: 0x12, 0x10d4: 0x13, 0x10d5: 0x14, 0x10d6: 0x15, 0x10d7: 0x16, + 0x10d8: 0x17, 0x10d9: 0x18, 0x10da: 0x19, 0x10db: 0x1a, 0x10dc: 0x1b, 0x10dd: 0x1c, 0x10de: 0x1d, 0x10df: 0x1e, + 0x10e0: 0x01, 0x10e1: 0x02, 0x10e2: 0x03, 0x10e3: 0x04, 0x10e4: 0x05, + 0x10ea: 0x06, 0x10ed: 0x07, 0x10ef: 0x08, + 0x10f0: 0x13, 0x10f3: 0x15, + // Block 0x44, offset 0x1100 + 0x1102: 0x01, 0x1103: 0x239, 0x1104: 0x03, 0x1105: 0x04, 0x1106: 0x05, 0x1107: 0x06, + 0x1108: 0x07, 0x1109: 0x08, 0x110a: 0x09, 0x110b: 0x0a, 0x110c: 0x0b, 0x110d: 0x0c, 0x110e: 0x0d, 0x110f: 0x0e, + 0x1110: 0x0f, 0x1111: 0x10, 0x1112: 0x11, 0x1113: 0x12, 0x1114: 0x13, 0x1115: 0x14, 0x1116: 0x15, 0x1117: 0x16, + 0x1118: 0x17, 0x1119: 0x18, 0x111a: 0x19, 0x111b: 0x1a, 0x111c: 0x1b, 0x111d: 0x1c, 0x111e: 0x1d, 0x111f: 0x1e, + 0x1120: 0x01, 0x1121: 0x02, 0x1122: 0x03, 0x1123: 0x04, 0x1124: 0x05, + 0x112a: 0x06, 0x112d: 0x07, 0x112f: 0x08, + 0x1130: 0x13, 0x1133: 0x15, + // Block 0x45, offset 0x1140 + 0x1140: 0x3f, 0x1141: 0x40, 0x1142: 0x41, 0x1143: 0x42, 0x1144: 0x43, 0x1145: 0x44, 0x1146: 0x45, 0x1147: 0x46, + 0x1148: 0x47, 0x1149: 0x48, 0x114a: 0x49, 0x114b: 0x4a, 0x114c: 0x4b, 0x114d: 0x4c, 0x114e: 0x4d, 0x114f: 0x4e, + 0x1150: 0x4f, 0x1151: 0x50, 0x1152: 0x51, 0x1153: 0x52, 0x1154: 0x53, 0x1155: 0x54, 0x1156: 0x55, 0x1157: 0x56, + 0x1158: 0x57, 0x1159: 0x58, 0x115a: 0x59, 0x115b: 0x5a, 0x115c: 0x5b, 0x115d: 0x5c, 0x115e: 0x5d, 0x115f: 0x5e, + 0x1160: 0x5f, 0x1161: 0x60, 0x1162: 0x61, 0x1163: 0x62, 0x1164: 0x63, 0x1165: 0x64, 0x1166: 0x65, 0x1167: 0x66, + 0x1168: 0x67, 0x1169: 0x68, 0x116a: 0x69, 0x116c: 0x6a, 0x116d: 0x6b, 0x116e: 0x6c, 0x116f: 0x6d, + 0x1170: 0x6e, 0x1171: 0x6f, 0x1173: 0x70, 0x1174: 0x71, 0x1175: 0x72, 0x1176: 0x73, 0x1177: 0x74, + 0x1178: 0x75, 0x1179: 0x240, 0x117a: 0x241, 0x117b: 0x242, 0x117c: 0x79, 0x117d: 0x7a, 0x117e: 0x7b, 0x117f: 0x7c, + // Block 0x46, offset 0x1180 + 0x1180: 0x7d, 0x1181: 0x7e, 0x1182: 0x7f, 0x1183: 0x80, 0x1184: 0x81, 0x1185: 0x82, 0x1186: 0x83, 0x1187: 0x84, + 0x1188: 0x85, 0x1189: 0x86, 0x118a: 0x87, 0x118b: 0x88, 0x118c: 0x89, 0x118d: 0x8a, 0x118e: 0x8b, 0x118f: 0x8c, + 0x1190: 0x8d, 0x1191: 0x8e, 0x1192: 0x243, 0x1193: 0x90, 0x1194: 0x91, 0x1195: 0x92, 0x1196: 0x93, 0x1197: 0x94, + 0x1198: 0x95, 0x1199: 0x96, 0x119a: 0x97, 0x119b: 0x98, 0x119c: 0x99, 0x119d: 0x9a, 0x119e: 0x9b, 0x119f: 0x9c, + 0x11a0: 0x9d, 0x11a1: 0x9e, 0x11a2: 0x9f, 0x11a3: 0xa0, 0x11a4: 0xa1, 0x11a5: 0xa2, 0x11a6: 0xa3, 0x11a7: 0xa4, + 0x11a8: 0xa5, 0x11a9: 0xa6, 0x11aa: 0xa7, 0x11ab: 0xa8, 0x11ac: 0xa9, 0x11ad: 0xaa, + 0x11b0: 0xab, 0x11b1: 0xac, 0x11b2: 0xad, 0x11b3: 0xae, 0x11b4: 0xaf, 0x11b5: 0xb0, 0x11b6: 0xb1, 0x11b7: 0xb2, + 0x11b8: 0xb3, 0x11ba: 0xb4, 0x11bb: 0xb5, 0x11bc: 0xb6, 0x11bd: 0xb7, 0x11be: 0xb8, 0x11bf: 0xb9, + // Block 0x47, offset 0x11c0 + 0x11c0: 0xba, 0x11c1: 0xbb, 0x11c2: 0xbc, 0x11c3: 0xbd, 0x11c4: 0xbe, 0x11c5: 0xbf, 0x11c6: 0xc0, 0x11c7: 0xc1, + 0x11c8: 0xc2, 0x11c9: 0xc3, 0x11ca: 0xc4, 0x11cb: 0xc5, 0x11cc: 0xc6, 0x11cd: 0xc7, 0x11ce: 0x244, 0x11cf: 0x245, + // Block 0x48, offset 0x1200 + 0x1200: 0x18b, 0x1201: 0x18c, 0x1202: 0x18d, 0x1203: 0x18e, 0x1204: 0x246, 0x1205: 0x247, 0x1206: 0x191, 0x1207: 0x192, + 0x1208: 0x193, 0x1209: 0x194, 0x120c: 0x195, 0x120d: 0x196, 0x120e: 0x197, 0x120f: 0x198, + 0x1210: 0x199, 0x1211: 0x19a, 0x1212: 0x19b, 0x1213: 0x19c, 0x1214: 0x19d, 0x1215: 0x19e, 0x1217: 0x19f, + 0x1218: 0x1a0, 0x1219: 0x1a1, 0x121a: 0x1a2, 0x121b: 0x1a3, 0x121c: 0x1a4, 0x121d: 0x1a5, + // Block 0x49, offset 0x1240 + 0x1250: 0x09, 0x1251: 0x0a, 0x1252: 0x0b, 0x1253: 0x0c, 0x1256: 0x0d, + 0x125b: 0x0e, 0x125d: 0x0f, 0x125e: 0x10, 0x125f: 0x46, + 0x126f: 0x12, + // Block 0x4a, offset 0x1280 + 0x1282: 0x01, 0x1283: 0x23c, 0x1284: 0x03, 0x1285: 0x23d, 0x1286: 0x05, 0x1287: 0x23e, + 0x1288: 0x23f, 0x1289: 0x08, 0x128a: 0x09, 0x128b: 0x0a, 0x128c: 0x0b, 0x128d: 0x0c, 0x128e: 0x0d, 0x128f: 0x0e, + 0x1290: 0x0f, 0x1291: 0x10, 0x1292: 0x11, 0x1293: 0x12, 0x1294: 0x13, 0x1295: 0x14, 0x1296: 0x15, 0x1297: 0x16, + 0x1298: 0x17, 0x1299: 0x18, 0x129a: 0x19, 0x129b: 0x1a, 0x129c: 0x1b, 0x129d: 0x1c, 0x129e: 0x1d, 0x129f: 0x1e, + 0x12a0: 0x01, 0x12a1: 0x43, 0x12a2: 0x44, 0x12a3: 0x45, 0x12a4: 0x05, + 0x12aa: 0x06, 0x12ad: 0x07, 0x12af: 0x08, + 0x12b0: 0x47, 0x12b3: 0x15, + // Block 0x4b, offset 0x12c0 + 0x12e4: 0xfb, 0x12e5: 0xfc, 0x12e6: 0xfd, 0x12e7: 0xfe, + 0x12e8: 0xff, 0x12e9: 0x100, 0x12ea: 0x101, 0x12eb: 0x102, 0x12ec: 0x103, 0x12ed: 0x104, 0x12ee: 0x24c, 0x12ef: 0x106, + 0x12f0: 0x24d, 0x12f1: 0x24e, 0x12f2: 0x24f, 0x12f3: 0x250, 0x12f4: 0x251, 0x12f5: 0x10c, 0x12f6: 0x10d, 0x12f7: 0x10e, + 0x12f8: 0x10f, 0x12f9: 0x110, 0x12fa: 0x111, 0x12fb: 0x112, 0x12fc: 0x113, 0x12fd: 0x114, 0x12fe: 0x115, 0x12ff: 0x116, + // Block 0x4c, offset 0x1300 + 0x1302: 0x01, 0x1303: 0x02, 0x1304: 0x03, 0x1305: 0x04, 0x1306: 0x05, 0x1307: 0x06, + 0x1308: 0x07, 0x1309: 0x08, 0x130a: 0x09, 0x130b: 0x0a, 0x130c: 0x0b, 0x130d: 0x0c, 0x130e: 0x0d, 0x130f: 0x0e, + 0x1310: 0x0f, 0x1311: 0x10, 0x1312: 0x11, 0x1313: 0x12, 0x1314: 0x13, 0x1315: 0x14, 0x1316: 0x15, 0x1317: 0x16, + 0x1318: 0x248, 0x1319: 0x249, 0x131a: 0x24a, 0x131b: 0x24b, 0x131c: 0x1b, 0x131d: 0x1c, 0x131e: 0x1d, 0x131f: 0x1e, + 0x1320: 0x01, 0x1321: 0x02, 0x1322: 0x03, 0x1323: 0x04, 0x1324: 0x05, + 0x132a: 0x06, 0x132d: 0x07, 0x132f: 0x49, + 0x1330: 0x13, 0x1333: 0x15, + // Block 0x4d, offset 0x1340 + 0x1340: 0x3f, 0x1341: 0x40, 0x1342: 0x41, 0x1343: 0x42, 0x1344: 0x43, 0x1345: 0x44, 0x1346: 0x45, 0x1347: 0x46, + 0x1348: 0x47, 0x1349: 0x48, 0x134a: 0x49, 0x134b: 0x4a, 0x134c: 0x4b, 0x134d: 0x4c, 0x134e: 0x4d, 0x134f: 0x4e, + 0x1350: 0x4f, 0x1351: 0x50, 0x1352: 0x51, 0x1353: 0x52, 0x1354: 0x53, 0x1355: 0x54, 0x1356: 0x55, 0x1357: 0x56, + 0x1358: 0x57, 0x1359: 0x58, 0x135a: 0x59, 0x135b: 0x5a, 0x135c: 0x5b, 0x135d: 0x5c, 0x135e: 0x5d, 0x135f: 0x5e, + 0x1360: 0x5f, 0x1361: 0x60, 0x1362: 0x61, 0x1363: 0x62, 0x1364: 0x63, 0x1365: 0x64, 0x1366: 0x65, 0x1367: 0x66, + 0x1368: 0x67, 0x1369: 0x68, 0x136a: 0x69, 0x136c: 0x6a, 0x136d: 0x6b, 0x136e: 0x6c, 0x136f: 0x6d, + 0x1370: 0x6e, 0x1371: 0x6f, 0x1373: 0x70, 0x1374: 0x71, 0x1375: 0x72, 0x1376: 0x73, 0x1377: 0x74, + 0x1378: 0x75, 0x1379: 0x25b, 0x137a: 0x77, 0x137b: 0x78, 0x137c: 0x79, 0x137d: 0x7a, 0x137e: 0x7b, 0x137f: 0x7c, + // Block 0x4e, offset 0x1380 + 0x1380: 0x7d, 0x1381: 0x7e, 0x1382: 0x7f, 0x1383: 0x80, 0x1384: 0x25c, 0x1385: 0x82, 0x1386: 0x83, 0x1387: 0x84, + 0x1388: 0x85, 0x1389: 0x86, 0x138a: 0x87, 0x138b: 0x88, 0x138c: 0x89, 0x138d: 0x8a, 0x138e: 0x8b, 0x138f: 0x8c, + 0x1390: 0x8d, 0x1391: 0x8e, 0x1392: 0x8f, 0x1393: 0x90, 0x1394: 0x91, 0x1395: 0x92, 0x1396: 0x93, 0x1397: 0x94, + 0x1398: 0x95, 0x1399: 0x96, 0x139a: 0x97, 0x139b: 0x98, 0x139c: 0x99, 0x139d: 0x9a, 0x139e: 0x9b, 0x139f: 0x9c, + 0x13a0: 0x9d, 0x13a1: 0x9e, 0x13a2: 0x9f, 0x13a3: 0xa0, 0x13a4: 0xa1, 0x13a5: 0xa2, 0x13a6: 0xa3, 0x13a7: 0xa4, + 0x13a8: 0xa5, 0x13a9: 0xa6, 0x13aa: 0xa7, 0x13ab: 0xa8, 0x13ac: 0xa9, 0x13ad: 0xaa, + 0x13b0: 0xab, 0x13b1: 0xac, 0x13b2: 0xad, 0x13b3: 0xae, 0x13b4: 0xaf, 0x13b5: 0xb0, 0x13b6: 0xb1, 0x13b7: 0xb2, + 0x13b8: 0xb3, 0x13ba: 0xb4, 0x13bb: 0xb5, 0x13bc: 0xb6, 0x13bd: 0xb7, 0x13be: 0xb8, 0x13bf: 0xb9, + // Block 0x4f, offset 0x13c0 + 0x13c2: 0x01, 0x13c3: 0x254, 0x13c4: 0x255, 0x13c5: 0x256, 0x13c6: 0x257, 0x13c7: 0x258, + 0x13c8: 0x259, 0x13c9: 0x08, 0x13ca: 0x25a, 0x13cb: 0x0a, 0x13cc: 0x0b, 0x13cd: 0x0c, 0x13ce: 0x0d, 0x13cf: 0x0e, + 0x13d0: 0x0f, 0x13d1: 0x10, 0x13d2: 0x11, 0x13d3: 0x12, 0x13d4: 0x13, 0x13d5: 0x14, 0x13d6: 0x15, 0x13d7: 0x16, + 0x13d8: 0x17, 0x13d9: 0x18, 0x13da: 0x19, 0x13db: 0x1a, 0x13dc: 0x1b, 0x13dd: 0x1c, 0x13de: 0x1d, 0x13df: 0x1e, + 0x13e0: 0x01, 0x13e1: 0x4b, 0x13e2: 0x4c, 0x13e3: 0x04, 0x13e4: 0x05, + 0x13ea: 0x06, 0x13ed: 0x07, 0x13ef: 0x08, + 0x13f0: 0x13, 0x13f3: 0x15, + // Block 0x50, offset 0x1400 + 0x1420: 0x1f, 0x1421: 0x20, 0x1422: 0x21, 0x1423: 0x22, 0x1424: 0x23, 0x1425: 0x24, 0x1426: 0x25, 0x1427: 0x26, + 0x1428: 0x27, 0x1429: 0x28, 0x142a: 0x25f, 0x142b: 0x2a, 0x142c: 0x2b, 0x142d: 0x2c, 0x142e: 0x2d, 0x142f: 0x2e, + 0x1430: 0x2f, 0x1431: 0x30, 0x1432: 0x31, 0x1433: 0x32, 0x1434: 0x33, 0x1435: 0x34, 0x1436: 0x35, 0x1437: 0x36, + 0x1438: 0x37, 0x1439: 0x38, 0x143a: 0x39, 0x143b: 0x3a, 0x143c: 0x3b, 0x143d: 0x3c, 0x143e: 0x3d, 0x143f: 0x3e, + // Block 0x51, offset 0x1440 + 0x1442: 0x01, 0x1443: 0x02, 0x1444: 0x03, 0x1445: 0x04, 0x1446: 0x05, 0x1447: 0x06, + 0x1448: 0x07, 0x1449: 0x08, 0x144a: 0x09, 0x144b: 0x0a, 0x144c: 0x0b, 0x144d: 0x0c, 0x144e: 0x0d, 0x144f: 0x0e, + 0x1450: 0x0f, 0x1451: 0x10, 0x1452: 0x11, 0x1453: 0x12, 0x1454: 0x13, 0x1455: 0x14, 0x1456: 0x15, 0x1457: 0x16, + 0x1458: 0x17, 0x1459: 0x18, 0x145a: 0x19, 0x145b: 0x1a, 0x145c: 0x1b, 0x145d: 0x1c, 0x145e: 0x1d, 0x145f: 0x1e, + 0x1460: 0x4e, 0x1461: 0x02, 0x1462: 0x03, 0x1463: 0x04, 0x1464: 0x05, + 0x146a: 0x06, 0x146d: 0x07, 0x146f: 0x08, + 0x1470: 0x13, 0x1473: 0x15, + // Block 0x52, offset 0x1480 + 0x1482: 0x01, 0x1483: 0x02, 0x1484: 0x03, 0x1485: 0x04, 0x1486: 0x262, 0x1487: 0x06, + 0x1488: 0x07, 0x1489: 0x263, 0x148a: 0x264, 0x148b: 0x0a, 0x148c: 0x0b, 0x148d: 0x0c, 0x148e: 0x0d, 0x148f: 0x0e, + 0x1490: 0x0f, 0x1491: 0x10, 0x1492: 0x11, 0x1493: 0x12, 0x1494: 0x13, 0x1495: 0x14, 0x1496: 0x15, 0x1497: 0x16, + 0x1498: 0x17, 0x1499: 0x18, 0x149a: 0x19, 0x149b: 0x1a, 0x149c: 0x1b, 0x149d: 0x1c, 0x149e: 0x1d, 0x149f: 0x1e, + 0x14a0: 0x01, 0x14a1: 0x02, 0x14a2: 0x03, 0x14a3: 0x04, 0x14a4: 0x05, + 0x14aa: 0x06, 0x14ad: 0x07, 0x14af: 0x08, + 0x14b0: 0x13, 0x14b3: 0x15, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x3f, 0x14c1: 0x40, 0x14c2: 0x41, 0x14c3: 0x42, 0x14c4: 0x43, 0x14c5: 0x44, 0x14c6: 0x45, 0x14c7: 0x46, + 0x14c8: 0x47, 0x14c9: 0x48, 0x14ca: 0x49, 0x14cb: 0x4a, 0x14cc: 0x4b, 0x14cd: 0x4c, 0x14ce: 0x4d, 0x14cf: 0x4e, + 0x14d0: 0x4f, 0x14d1: 0x50, 0x14d2: 0x51, 0x14d3: 0x52, 0x14d4: 0x53, 0x14d5: 0x54, 0x14d6: 0x55, 0x14d7: 0x56, + 0x14d8: 0x57, 0x14d9: 0x58, 0x14da: 0x59, 0x14db: 0x5a, 0x14dc: 0x5b, 0x14dd: 0x5c, 0x14de: 0x5d, 0x14df: 0x5e, + 0x14e0: 0x5f, 0x14e1: 0x60, 0x14e2: 0x61, 0x14e3: 0x62, 0x14e4: 0x63, 0x14e5: 0x64, 0x14e6: 0x65, 0x14e7: 0x66, + 0x14e8: 0x67, 0x14e9: 0x68, 0x14ea: 0x69, 0x14ec: 0x6a, 0x14ed: 0x6b, 0x14ee: 0x6c, 0x14ef: 0x6d, + 0x14f0: 0x6e, 0x14f1: 0x6f, 0x14f3: 0x70, 0x14f4: 0x71, 0x14f5: 0x72, 0x14f6: 0x73, 0x14f7: 0x74, + 0x14f8: 0x26e, 0x14f9: 0x26f, 0x14fa: 0x270, 0x14fb: 0x271, 0x14fc: 0x79, 0x14fd: 0x7a, 0x14fe: 0x7b, 0x14ff: 0x7c, + // Block 0x54, offset 0x1500 + 0x1500: 0x7d, 0x1501: 0x7e, 0x1502: 0x7f, 0x1503: 0x80, 0x1504: 0x272, 0x1505: 0x1bf, 0x1506: 0x83, 0x1507: 0x84, + 0x1508: 0x85, 0x1509: 0x86, 0x150a: 0x87, 0x150b: 0x88, 0x150c: 0x89, 0x150d: 0x8a, 0x150e: 0x8b, 0x150f: 0x8c, + 0x1510: 0x8d, 0x1511: 0x8e, 0x1512: 0x273, 0x1513: 0x90, 0x1514: 0x91, 0x1515: 0x92, 0x1516: 0x93, 0x1517: 0x94, + 0x1518: 0x95, 0x1519: 0x96, 0x151a: 0x97, 0x151b: 0x98, 0x151c: 0x99, 0x151d: 0x9a, 0x151e: 0x9b, 0x151f: 0x9c, + 0x1520: 0x9d, 0x1521: 0x9e, 0x1522: 0x9f, 0x1523: 0xa0, 0x1524: 0xa1, 0x1525: 0xa2, 0x1526: 0xa3, 0x1527: 0xa4, + 0x1528: 0xa5, 0x1529: 0xa6, 0x152a: 0xa7, 0x152b: 0xa8, 0x152c: 0xa9, 0x152d: 0xaa, + 0x1530: 0xab, 0x1531: 0xac, 0x1532: 0xad, 0x1533: 0xae, 0x1534: 0xaf, 0x1535: 0xb0, 0x1536: 0xb1, 0x1537: 0xb2, + 0x1538: 0xb3, 0x153a: 0xb4, 0x153b: 0xb5, 0x153c: 0xb6, 0x153d: 0xb7, 0x153e: 0xb8, 0x153f: 0xb9, + // Block 0x55, offset 0x1540 + 0x1540: 0xba, 0x1541: 0xbb, 0x1542: 0xbc, 0x1543: 0xbd, 0x1544: 0xbe, 0x1545: 0xbf, 0x1546: 0xc0, 0x1547: 0xc1, + 0x1548: 0xc2, 0x1549: 0xc3, 0x154a: 0xc4, 0x154b: 0x1c1, 0x154c: 0xc6, 0x154d: 0x274, 0x154e: 0x275, 0x154f: 0x276, + // Block 0x56, offset 0x1580 + 0x15a4: 0xfb, 0x15a5: 0xfc, 0x15a6: 0xfd, 0x15a7: 0xfe, + 0x15a8: 0xff, 0x15a9: 0x100, 0x15aa: 0x101, 0x15ab: 0x102, 0x15ac: 0x277, 0x15ad: 0x104, 0x15ae: 0x105, 0x15af: 0x106, + 0x15b0: 0x107, 0x15b1: 0x108, 0x15b2: 0x109, 0x15b3: 0x10a, 0x15b4: 0x10b, 0x15b5: 0x10c, 0x15b6: 0x10d, 0x15b7: 0x10e, + 0x15b8: 0x10f, 0x15b9: 0x110, 0x15ba: 0x111, 0x15bb: 0x112, 0x15bc: 0x113, 0x15bd: 0x114, 0x15be: 0x115, 0x15bf: 0x116, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x18b, 0x15c1: 0x18c, 0x15c2: 0x18d, 0x15c3: 0x18e, 0x15c4: 0x278, 0x15c5: 0x279, 0x15c6: 0x191, 0x15c7: 0x192, + 0x15c8: 0x193, 0x15c9: 0x194, 0x15cc: 0x195, 0x15cd: 0x196, 0x15ce: 0x197, 0x15cf: 0x198, + 0x15d0: 0x199, 0x15d1: 0x19a, 0x15d2: 0x19b, 0x15d3: 0x19c, 0x15d4: 0x19d, 0x15d5: 0x19e, 0x15d7: 0x19f, + 0x15d8: 0x1a0, 0x15d9: 0x1a1, 0x15da: 0x1a2, 0x15db: 0x1a3, 0x15dc: 0x1a4, 0x15dd: 0x1a5, + // Block 0x58, offset 0x1600 + 0x1610: 0x09, 0x1611: 0x0a, 0x1612: 0x0b, 0x1613: 0x0c, 0x1616: 0x0d, + 0x161b: 0x0e, 0x161d: 0x0f, 0x161e: 0x10, 0x161f: 0x55, + 0x162f: 0x12, + // Block 0x59, offset 0x1640 + 0x1642: 0x01, 0x1643: 0x267, 0x1644: 0x268, 0x1645: 0x269, 0x1646: 0x26a, 0x1647: 0x26b, + 0x1648: 0x26c, 0x1649: 0x08, 0x164a: 0x26d, 0x164b: 0x0a, 0x164c: 0x0b, 0x164d: 0x0c, 0x164e: 0x0d, 0x164f: 0x0e, + 0x1650: 0x0f, 0x1651: 0x10, 0x1652: 0x11, 0x1653: 0x12, 0x1654: 0x13, 0x1655: 0x14, 0x1656: 0x15, 0x1657: 0x16, + 0x1658: 0x17, 0x1659: 0x18, 0x165a: 0x19, 0x165b: 0x1a, 0x165c: 0x1b, 0x165d: 0x1c, 0x165e: 0x1d, 0x165f: 0x1e, + 0x1660: 0x01, 0x1661: 0x51, 0x1662: 0x52, 0x1663: 0x53, 0x1664: 0x05, + 0x166a: 0x06, 0x166d: 0x07, 0x166f: 0x54, + 0x1670: 0x56, 0x1673: 0x15, + // Block 0x5a, offset 0x1680 + 0x1682: 0x01, 0x1683: 0x02, 0x1684: 0x03, 0x1685: 0x04, 0x1686: 0x05, 0x1687: 0x06, + 0x1688: 0x07, 0x1689: 0x08, 0x168a: 0x09, 0x168b: 0x0a, 0x168c: 0x0b, 0x168d: 0x0c, 0x168e: 0x0d, 0x168f: 0x0e, + 0x1690: 0x0f, 0x1691: 0x10, 0x1692: 0x11, 0x1693: 0x12, 0x1694: 0x13, 0x1695: 0x14, 0x1696: 0x15, 0x1697: 0x27a, + 0x1698: 0x17, 0x1699: 0x18, 0x169a: 0x19, 0x169b: 0x1a, 0x169c: 0x1b, 0x169d: 0x1c, 0x169e: 0x1d, 0x169f: 0x1e, + 0x16a0: 0x01, 0x16a1: 0x02, 0x16a2: 0x03, 0x16a3: 0x04, 0x16a4: 0x05, + 0x16aa: 0x06, 0x16ad: 0x07, 0x16af: 0x08, + 0x16b0: 0x13, 0x16b3: 0x15, + // Block 0x5b, offset 0x16c0 + 0x16e0: 0x1f, 0x16e1: 0x20, 0x16e2: 0x21, 0x16e3: 0x22, 0x16e4: 0x27b, 0x16e5: 0x24, 0x16e6: 0x25, 0x16e7: 0x26, + 0x16e8: 0x27, 0x16e9: 0x28, 0x16ea: 0x29, 0x16eb: 0x2a, 0x16ec: 0x2b, 0x16ed: 0x2c, 0x16ee: 0x2d, 0x16ef: 0x2e, + 0x16f0: 0x2f, 0x16f1: 0x30, 0x16f2: 0x31, 0x16f3: 0x32, 0x16f4: 0x33, 0x16f5: 0x34, 0x16f6: 0x35, 0x16f7: 0x36, + 0x16f8: 0x37, 0x16f9: 0x38, 0x16fa: 0x39, 0x16fb: 0x3a, 0x16fc: 0x3b, 0x16fd: 0x3c, 0x16fe: 0x3d, 0x16ff: 0x3e, + // Block 0x5c, offset 0x1700 + 0x1702: 0x01, 0x1703: 0x02, 0x1704: 0x03, 0x1705: 0x04, 0x1706: 0x05, 0x1707: 0x06, + 0x1708: 0x07, 0x1709: 0x08, 0x170a: 0x09, 0x170b: 0x0a, 0x170c: 0x0b, 0x170d: 0x0c, 0x170e: 0x0d, 0x170f: 0x0e, + 0x1710: 0x0f, 0x1711: 0x10, 0x1712: 0x11, 0x1713: 0x12, 0x1714: 0x13, 0x1715: 0x14, 0x1716: 0x15, 0x1717: 0x16, + 0x1718: 0x17, 0x1719: 0x18, 0x171a: 0x19, 0x171b: 0x1a, 0x171c: 0x1b, 0x171d: 0x1c, 0x171e: 0x1d, 0x171f: 0x1e, + 0x1720: 0x59, 0x1721: 0x02, 0x1722: 0x03, 0x1723: 0x04, 0x1724: 0x05, + 0x172a: 0x06, 0x172d: 0x07, 0x172f: 0x08, + 0x1730: 0x13, 0x1733: 0x15, + // Block 0x5d, offset 0x1740 + 0x1740: 0x3f, 0x1741: 0x40, 0x1742: 0x41, 0x1743: 0x42, 0x1744: 0x43, 0x1745: 0x44, 0x1746: 0x45, 0x1747: 0x46, + 0x1748: 0x47, 0x1749: 0x48, 0x174a: 0x49, 0x174b: 0x4a, 0x174c: 0x4b, 0x174d: 0x4c, 0x174e: 0x4d, 0x174f: 0x4e, + 0x1750: 0x4f, 0x1751: 0x50, 0x1752: 0x51, 0x1753: 0x52, 0x1754: 0x53, 0x1755: 0x54, 0x1756: 0x55, 0x1757: 0x56, + 0x1758: 0x57, 0x1759: 0x58, 0x175a: 0x59, 0x175b: 0x5a, 0x175c: 0x5b, 0x175d: 0x5c, 0x175e: 0x5d, 0x175f: 0x5e, + 0x1760: 0x5f, 0x1761: 0x60, 0x1762: 0x61, 0x1763: 0x62, 0x1764: 0x63, 0x1765: 0x64, 0x1766: 0x65, 0x1767: 0x66, + 0x1768: 0x67, 0x1769: 0x68, 0x176a: 0x69, 0x176c: 0x6a, 0x176d: 0x6b, 0x176e: 0x6c, 0x176f: 0x6d, + 0x1770: 0x6e, 0x1771: 0x6f, 0x1773: 0x70, 0x1774: 0x71, 0x1775: 0x72, 0x1776: 0x73, 0x1777: 0x74, + 0x1778: 0x281, 0x1779: 0x1f2, 0x177a: 0x77, 0x177b: 0x78, 0x177c: 0x79, 0x177d: 0x7a, 0x177e: 0x7b, 0x177f: 0x7c, + // Block 0x5e, offset 0x1780 + 0x1782: 0x01, 0x1783: 0x02, 0x1784: 0x27e, 0x1785: 0x27f, 0x1786: 0x05, 0x1787: 0x280, + 0x1788: 0x07, 0x1789: 0x08, 0x178a: 0x09, 0x178b: 0x0a, 0x178c: 0x0b, 0x178d: 0x0c, 0x178e: 0x0d, 0x178f: 0x0e, + 0x1790: 0x0f, 0x1791: 0x10, 0x1792: 0x11, 0x1793: 0x12, 0x1794: 0x13, 0x1795: 0x14, 0x1796: 0x15, 0x1797: 0x16, + 0x1798: 0x17, 0x1799: 0x18, 0x179a: 0x19, 0x179b: 0x1a, 0x179c: 0x1b, 0x179d: 0x1c, 0x179e: 0x1d, 0x179f: 0x1e, + 0x17a0: 0x01, 0x17a1: 0x5b, 0x17a2: 0x03, 0x17a3: 0x04, 0x17a4: 0x05, + 0x17aa: 0x06, 0x17ad: 0x07, 0x17af: 0x08, + 0x17b0: 0x13, 0x17b3: 0x15, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x3f, 0x17c1: 0x40, 0x17c2: 0x41, 0x17c3: 0x42, 0x17c4: 0x43, 0x17c5: 0x44, 0x17c6: 0x45, 0x17c7: 0x46, + 0x17c8: 0x47, 0x17c9: 0x48, 0x17ca: 0x49, 0x17cb: 0x4a, 0x17cc: 0x4b, 0x17cd: 0x4c, 0x17ce: 0x4d, 0x17cf: 0x4e, + 0x17d0: 0x4f, 0x17d1: 0x50, 0x17d2: 0x51, 0x17d3: 0x52, 0x17d4: 0x53, 0x17d5: 0x54, 0x17d6: 0x55, 0x17d7: 0x56, + 0x17d8: 0x57, 0x17d9: 0x58, 0x17da: 0x59, 0x17db: 0x5a, 0x17dc: 0x5b, 0x17dd: 0x5c, 0x17de: 0x5d, 0x17df: 0x5e, + 0x17e0: 0x5f, 0x17e1: 0x60, 0x17e2: 0x61, 0x17e3: 0x62, 0x17e4: 0x63, 0x17e5: 0x64, 0x17e6: 0x65, 0x17e7: 0x66, + 0x17e8: 0x67, 0x17e9: 0x68, 0x17ea: 0x69, 0x17ec: 0x6a, 0x17ed: 0x6b, 0x17ee: 0x6c, 0x17ef: 0x6d, + 0x17f0: 0x6e, 0x17f1: 0x6f, 0x17f3: 0x70, 0x17f4: 0x71, 0x17f5: 0x72, 0x17f6: 0x73, 0x17f7: 0x74, + 0x17f8: 0x75, 0x17f9: 0x1df, 0x17fa: 0x77, 0x17fb: 0x78, 0x17fc: 0x79, 0x17fd: 0x7a, 0x17fe: 0x7b, 0x17ff: 0x7c, + // Block 0x60, offset 0x1800 + 0x1802: 0x01, 0x1803: 0x284, 0x1804: 0x03, 0x1805: 0x285, 0x1806: 0x05, 0x1807: 0x286, + 0x1808: 0x287, 0x1809: 0x08, 0x180a: 0x09, 0x180b: 0x0a, 0x180c: 0x0b, 0x180d: 0x0c, 0x180e: 0x0d, 0x180f: 0x0e, + 0x1810: 0x0f, 0x1811: 0x10, 0x1812: 0x11, 0x1813: 0x12, 0x1814: 0x13, 0x1815: 0x14, 0x1816: 0x15, 0x1817: 0x16, + 0x1818: 0x17, 0x1819: 0x18, 0x181a: 0x19, 0x181b: 0x1a, 0x181c: 0x1b, 0x181d: 0x1c, 0x181e: 0x1d, 0x181f: 0x1e, + 0x1820: 0x01, 0x1821: 0x5d, 0x1822: 0x03, 0x1823: 0x04, 0x1824: 0x05, + 0x182a: 0x06, 0x182d: 0x07, 0x182f: 0x08, + 0x1830: 0x13, 0x1833: 0x15, + // Block 0x61, offset 0x1840 + 0x1842: 0x01, 0x1843: 0x02, 0x1844: 0x03, 0x1845: 0x04, 0x1846: 0x05, 0x1847: 0x06, + 0x1848: 0x07, 0x1849: 0x08, 0x184a: 0x09, 0x184b: 0x0a, 0x184c: 0x0b, 0x184d: 0x0c, 0x184e: 0x0d, 0x184f: 0x0e, + 0x1850: 0x0f, 0x1851: 0x10, 0x1852: 0x11, 0x1853: 0x12, 0x1854: 0x288, 0x1855: 0x14, 0x1856: 0x289, 0x1857: 0x16, + 0x1858: 0x17, 0x1859: 0x18, 0x185a: 0x19, 0x185b: 0x1a, 0x185c: 0x1b, 0x185d: 0x1c, 0x185e: 0x1d, 0x185f: 0x1e, + 0x1860: 0x01, 0x1861: 0x02, 0x1862: 0x03, 0x1863: 0x04, 0x1864: 0x05, + 0x186a: 0x06, 0x186d: 0x07, 0x186f: 0x08, + 0x1870: 0x13, 0x1873: 0x15, + // Block 0x62, offset 0x1880 + 0x1880: 0x3f, 0x1881: 0x40, 0x1882: 0x41, 0x1883: 0x42, 0x1884: 0x43, 0x1885: 0x44, 0x1886: 0x45, 0x1887: 0x46, + 0x1888: 0x47, 0x1889: 0x48, 0x188a: 0x49, 0x188b: 0x4a, 0x188c: 0x4b, 0x188d: 0x4c, 0x188e: 0x4d, 0x188f: 0x4e, + 0x1890: 0x4f, 0x1891: 0x50, 0x1892: 0x51, 0x1893: 0x52, 0x1894: 0x53, 0x1895: 0x54, 0x1896: 0x55, 0x1897: 0x56, + 0x1898: 0x57, 0x1899: 0x58, 0x189a: 0x59, 0x189b: 0x5a, 0x189c: 0x5b, 0x189d: 0x5c, 0x189e: 0x5d, 0x189f: 0x5e, + 0x18a0: 0x5f, 0x18a1: 0x60, 0x18a2: 0x61, 0x18a3: 0x62, 0x18a4: 0x63, 0x18a5: 0x64, 0x18a6: 0x65, 0x18a7: 0x66, + 0x18a8: 0x67, 0x18a9: 0x68, 0x18aa: 0x69, 0x18ac: 0x6a, 0x18ad: 0x6b, 0x18ae: 0x6c, 0x18af: 0x6d, + 0x18b0: 0x6e, 0x18b1: 0x6f, 0x18b3: 0x70, 0x18b4: 0x71, 0x18b5: 0x72, 0x18b6: 0x73, 0x18b7: 0x74, + 0x18b8: 0x75, 0x18b9: 0x28c, 0x18ba: 0x77, 0x18bb: 0x28d, 0x18bc: 0x79, 0x18bd: 0x7a, 0x18be: 0x7b, 0x18bf: 0x7c, + // Block 0x63, offset 0x18c0 + 0x18c2: 0x01, 0x18c3: 0x02, 0x18c4: 0x03, 0x18c5: 0x04, 0x18c6: 0x05, 0x18c7: 0x06, + 0x18c8: 0x07, 0x18c9: 0x08, 0x18ca: 0x09, 0x18cb: 0x0a, 0x18cc: 0x0b, 0x18cd: 0x0c, 0x18ce: 0x0d, 0x18cf: 0x0e, + 0x18d0: 0x0f, 0x18d1: 0x10, 0x18d2: 0x11, 0x18d3: 0x12, 0x18d4: 0x13, 0x18d5: 0x14, 0x18d6: 0x15, 0x18d7: 0x16, + 0x18d8: 0x17, 0x18d9: 0x18, 0x18da: 0x19, 0x18db: 0x1a, 0x18dc: 0x1b, 0x18dd: 0x1c, 0x18de: 0x1d, 0x18df: 0x1e, + 0x18e0: 0x01, 0x18e1: 0x60, 0x18e2: 0x03, 0x18e3: 0x04, 0x18e4: 0x05, + 0x18ea: 0x06, 0x18ed: 0x07, 0x18ef: 0x08, + 0x18f0: 0x13, 0x18f3: 0x15, + // Block 0x64, offset 0x1900 + 0x1900: 0x3f, 0x1901: 0x40, 0x1902: 0x41, 0x1903: 0x42, 0x1904: 0x43, 0x1905: 0x44, 0x1906: 0x45, 0x1907: 0x46, + 0x1908: 0x47, 0x1909: 0x48, 0x190a: 0x49, 0x190b: 0x4a, 0x190c: 0x4b, 0x190d: 0x4c, 0x190e: 0x4d, 0x190f: 0x4e, + 0x1910: 0x4f, 0x1911: 0x50, 0x1912: 0x51, 0x1913: 0x52, 0x1914: 0x53, 0x1915: 0x54, 0x1916: 0x55, 0x1917: 0x56, + 0x1918: 0x57, 0x1919: 0x58, 0x191a: 0x59, 0x191b: 0x5a, 0x191c: 0x5b, 0x191d: 0x5c, 0x191e: 0x5d, 0x191f: 0x5e, + 0x1920: 0x5f, 0x1921: 0x60, 0x1922: 0x61, 0x1923: 0x62, 0x1924: 0x63, 0x1925: 0x64, 0x1926: 0x65, 0x1927: 0x66, + 0x1928: 0x67, 0x1929: 0x68, 0x192a: 0x69, 0x192c: 0x6a, 0x192d: 0x6b, 0x192e: 0x6c, 0x192f: 0x6d, + 0x1930: 0x6e, 0x1931: 0x6f, 0x1933: 0x70, 0x1934: 0x71, 0x1935: 0x72, 0x1936: 0x1fc, 0x1937: 0x74, + 0x1938: 0x294, 0x1939: 0x295, 0x193a: 0x296, 0x193b: 0x297, 0x193c: 0x79, 0x193d: 0x7a, 0x193e: 0x7b, 0x193f: 0x7c, + // Block 0x65, offset 0x1940 + 0x1942: 0x01, 0x1943: 0x290, 0x1944: 0x291, 0x1945: 0x04, 0x1946: 0x05, 0x1947: 0x292, + 0x1948: 0x293, 0x1949: 0x08, 0x194a: 0x09, 0x194b: 0x0a, 0x194c: 0x0b, 0x194d: 0x0c, 0x194e: 0x0d, 0x194f: 0x0e, + 0x1950: 0x0f, 0x1951: 0x10, 0x1952: 0x11, 0x1953: 0x12, 0x1954: 0x13, 0x1955: 0x14, 0x1956: 0x15, 0x1957: 0x16, + 0x1958: 0x17, 0x1959: 0x18, 0x195a: 0x19, 0x195b: 0x1a, 0x195c: 0x1b, 0x195d: 0x1c, 0x195e: 0x1d, 0x195f: 0x1e, + 0x1960: 0x01, 0x1961: 0x62, 0x1962: 0x30, 0x1963: 0x04, 0x1964: 0x05, + 0x196a: 0x06, 0x196d: 0x07, 0x196f: 0x08, + 0x1970: 0x13, 0x1973: 0x15, + // Block 0x66, offset 0x1980 + 0x1980: 0x298, 0x1981: 0x299, 0x1982: 0x29a, 0x1983: 0x29b, 0x1984: 0x29c, 0x1985: 0x29d, 0x1986: 0xc0, 0x1987: 0x29e, + 0x1988: 0x29f, 0x1989: 0x2a0, 0x198a: 0xc4, 0x198b: 0x2a1, 0x198c: 0xc6, 0x198d: 0x2a2, 0x198e: 0xc8, 0x198f: 0x2a3, + // Block 0x67, offset 0x19c0 + 0x19f7: 0xca, + 0x19f8: 0x2a4, 0x19f9: 0x2a5, 0x19fa: 0x2a6, 0x19fb: 0x2a7, 0x19fc: 0x2a8, 0x19fd: 0x2a9, 0x19fe: 0x2aa, 0x19ff: 0x2ab, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x2ac, 0x1a01: 0x2ad, 0x1a02: 0x2ae, 0x1a03: 0x2af, 0x1a04: 0x2b0, 0x1a05: 0x2b1, 0x1a06: 0x2b2, 0x1a07: 0x2b3, + 0x1a08: 0x2b4, 0x1a09: 0x2b5, 0x1a0a: 0x2b6, 0x1a0b: 0x2b7, 0x1a0c: 0x2b8, 0x1a0d: 0x2b9, 0x1a0e: 0x2ba, 0x1a0f: 0x2bb, + 0x1a10: 0x2bc, 0x1a11: 0x2bd, 0x1a12: 0x2be, 0x1a13: 0x2bf, 0x1a14: 0x2c0, 0x1a15: 0x2c1, 0x1a16: 0x2c2, 0x1a17: 0x2c3, + 0x1a18: 0x2c4, 0x1a19: 0x2c5, 0x1a1a: 0x2c6, 0x1a1b: 0x2c7, 0x1a1c: 0x2c8, 0x1a1d: 0x2c9, 0x1a1e: 0x2ca, 0x1a1f: 0x2cb, + 0x1a20: 0x2cc, 0x1a21: 0x2cd, 0x1a22: 0x2ce, 0x1a23: 0x2cf, 0x1a24: 0x2d0, 0x1a25: 0x2d1, 0x1a26: 0x2d2, 0x1a27: 0x2d3, + 0x1a28: 0x2d4, 0x1a29: 0x2d5, 0x1a2a: 0x2d6, 0x1a2b: 0x2d7, 0x1a2c: 0x2d8, 0x1a2d: 0x2d9, 0x1a2e: 0x2da, 0x1a2f: 0x2db, + 0x1a30: 0x2dc, 0x1a31: 0x2dd, 0x1a32: 0x2de, 0x1a33: 0x2df, 0x1a34: 0x2e0, 0x1a35: 0x2e1, 0x1a36: 0x2e2, 0x1a37: 0x2e3, + 0x1a38: 0x2e4, 0x1a39: 0x2e5, 0x1a3a: 0x2e6, 0x1a3b: 0x2e7, 0x1a3c: 0x2e8, 0x1a3d: 0x2e9, 0x1a3e: 0x2ea, 0x1a3f: 0x2eb, + // Block 0x69, offset 0x1a40 + 0x1a40: 0x2ec, 0x1a41: 0x2ed, 0x1a42: 0x2ee, 0x1a43: 0x2ef, 0x1a44: 0x2f0, 0x1a45: 0x2f1, 0x1a46: 0x2f2, 0x1a47: 0x2f3, + 0x1a48: 0x2f4, 0x1a49: 0x2f5, 0x1a4a: 0x2f6, 0x1a4b: 0x2f7, 0x1a4c: 0x2f8, 0x1a4d: 0x2f9, 0x1a4e: 0x2fa, 0x1a4f: 0x2fb, + 0x1a50: 0x2fc, 0x1a51: 0x2fd, 0x1a52: 0x2fe, 0x1a53: 0x2ff, 0x1a54: 0x300, 0x1a55: 0x301, 0x1a56: 0x302, 0x1a57: 0x303, + 0x1a58: 0x304, 0x1a59: 0x305, 0x1a5a: 0x306, 0x1a5b: 0x307, 0x1a5c: 0x308, 0x1a5d: 0x309, 0x1a5e: 0x30a, 0x1a5f: 0x30b, + 0x1a60: 0x30c, 0x1a61: 0x30d, 0x1a62: 0x30e, 0x1a63: 0x30f, 0x1a64: 0x310, 0x1a65: 0x311, 0x1a66: 0x312, 0x1a67: 0x313, + 0x1a68: 0x314, 0x1a69: 0x315, 0x1a6a: 0x316, 0x1a6b: 0x317, 0x1a6c: 0x318, 0x1a6d: 0x319, 0x1a6e: 0x31a, 0x1a6f: 0x31b, + 0x1a70: 0x31c, 0x1a71: 0x31d, 0x1a72: 0x31e, 0x1a73: 0x31f, 0x1a74: 0x320, 0x1a75: 0x321, 0x1a76: 0x322, 0x1a77: 0x323, + 0x1a78: 0x324, 0x1a79: 0x325, 0x1a7a: 0x326, 0x1a7b: 0x327, 0x1a7c: 0x328, 0x1a7d: 0x329, 0x1a7e: 0x32a, 0x1a7f: 0x32b, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x32c, 0x1a81: 0x32d, 0x1a82: 0x32e, 0x1a83: 0x32f, 0x1a84: 0x330, 0x1a85: 0x331, 0x1a86: 0x332, 0x1a87: 0x333, + 0x1a88: 0x334, 0x1a89: 0x335, 0x1a8a: 0x336, 0x1a8b: 0x337, 0x1a8c: 0x338, 0x1a8d: 0x339, 0x1a8e: 0x33a, 0x1a8f: 0x33b, + 0x1a90: 0x33c, 0x1a91: 0x33d, 0x1a92: 0x33e, 0x1a93: 0x33f, 0x1a94: 0x340, 0x1a95: 0x341, 0x1a96: 0x342, 0x1a97: 0x343, + 0x1a98: 0x344, 0x1a99: 0x345, 0x1a9a: 0x346, 0x1a9b: 0x347, 0x1a9c: 0x348, 0x1a9d: 0x349, 0x1a9e: 0x34a, 0x1a9f: 0x34b, + 0x1aa0: 0x34c, 0x1aa1: 0x34d, 0x1aa2: 0x34e, 0x1aa3: 0x34f, 0x1aa4: 0x350, 0x1aa5: 0x351, 0x1aa6: 0x352, 0x1aa7: 0x353, + 0x1aa8: 0x354, 0x1aa9: 0x355, 0x1aaa: 0x356, 0x1aab: 0x357, 0x1aac: 0x358, 0x1aad: 0x359, 0x1aae: 0x35a, 0x1aaf: 0x35b, + 0x1ab0: 0x35c, 0x1ab1: 0x35d, 0x1ab2: 0x35e, 0x1ab3: 0x35f, 0x1ab4: 0x360, 0x1ab5: 0x361, 0x1ab6: 0x362, 0x1ab7: 0x363, + 0x1ab8: 0x364, 0x1ab9: 0x365, 0x1aba: 0x366, 0x1abc: 0x367, 0x1abd: 0x368, 0x1abe: 0x369, 0x1abf: 0x36a, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x36b, 0x1ac1: 0x36c, 0x1ac2: 0x36d, 0x1ac3: 0x36e, 0x1ac4: 0x36f, 0x1ac5: 0x370, 0x1ac6: 0x371, 0x1ac7: 0x372, + 0x1ac8: 0x373, 0x1ac9: 0x374, 0x1aca: 0x375, 0x1acb: 0x376, 0x1acc: 0x377, 0x1acd: 0x378, 0x1ace: 0x379, 0x1acf: 0x37a, + 0x1ad0: 0x37b, 0x1ad1: 0x37c, 0x1ad2: 0x37d, 0x1ad3: 0x37e, 0x1ad4: 0x37f, 0x1ad5: 0x380, 0x1ad6: 0x381, 0x1ad7: 0x382, + 0x1ad8: 0x383, 0x1ad9: 0x384, 0x1ada: 0x385, 0x1adb: 0x386, 0x1adc: 0x387, 0x1add: 0x388, 0x1ade: 0x389, 0x1adf: 0x38a, + 0x1ae0: 0x38b, 0x1ae1: 0x38c, 0x1ae2: 0x38d, 0x1ae3: 0x38e, 0x1ae4: 0x38f, 0x1ae5: 0x390, 0x1ae6: 0x391, 0x1ae7: 0x392, + 0x1ae8: 0x393, 0x1ae9: 0x394, 0x1aea: 0x395, 0x1aeb: 0x396, 0x1aec: 0x397, 0x1aed: 0x398, 0x1aee: 0x399, + 0x1af0: 0x39a, 0x1af1: 0x39b, 0x1af2: 0x39c, 0x1af3: 0x39d, 0x1af4: 0x39e, 0x1af5: 0x39f, 0x1af6: 0x3a0, 0x1af7: 0x3a1, + 0x1af8: 0x3a2, 0x1af9: 0x3a3, 0x1afa: 0x3a4, 0x1afb: 0x3a5, 0x1afc: 0x3a6, 0x1afd: 0x3a7, 0x1afe: 0x3a8, 0x1aff: 0x3a9, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x3aa, 0x1b01: 0x3ab, 0x1b02: 0x3ac, 0x1b03: 0x3ad, 0x1b04: 0x3ae, 0x1b05: 0x3af, 0x1b06: 0x3b0, 0x1b07: 0x3b1, + 0x1b08: 0x3b2, 0x1b09: 0x3b3, 0x1b0a: 0x3b4, 0x1b0b: 0x3b5, 0x1b0c: 0x3b6, 0x1b0d: 0x3b7, 0x1b0e: 0x3b8, 0x1b0f: 0x3b9, + 0x1b10: 0x3ba, 0x1b11: 0x3bb, 0x1b12: 0x3bc, 0x1b15: 0x3bd, 0x1b16: 0x3be, 0x1b17: 0x3bf, + 0x1b18: 0x3c0, 0x1b19: 0x3c1, 0x1b1a: 0x3c2, 0x1b1b: 0x3c3, 0x1b1c: 0x3c4, 0x1b1d: 0x3c5, 0x1b1e: 0x3c6, 0x1b1f: 0x3c7, + 0x1b20: 0x3c8, 0x1b21: 0x3c9, 0x1b22: 0x3ca, 0x1b23: 0x3cb, 0x1b24: 0x3cc, 0x1b25: 0x3cd, 0x1b26: 0x3ce, 0x1b27: 0x3cf, + 0x1b28: 0x3d0, 0x1b29: 0x3d1, 0x1b2a: 0x3d2, 0x1b2b: 0x3d3, 0x1b2c: 0x3d4, 0x1b2d: 0x3d5, 0x1b2e: 0x3d6, 0x1b2f: 0x3d7, + 0x1b30: 0x3d8, 0x1b31: 0x3d9, 0x1b33: 0x3da, 0x1b34: 0x3db, 0x1b35: 0x3dc, 0x1b36: 0x3dd, 0x1b37: 0x3de, + 0x1b38: 0x3df, 0x1b39: 0x3e0, 0x1b3a: 0x3e1, 0x1b3b: 0x3e2, 0x1b3c: 0x3e3, 0x1b3d: 0x3e4, 0x1b3e: 0x3e5, + // Block 0x6d, offset 0x1b40 + 0x1b64: 0x3e6, 0x1b65: 0x3e7, 0x1b66: 0x3e8, 0x1b67: 0x3e9, + 0x1b68: 0x3ea, 0x1b69: 0x3eb, 0x1b6a: 0x3ec, 0x1b6b: 0x3ed, 0x1b6c: 0x103, 0x1b6d: 0x104, 0x1b6e: 0x105, 0x1b6f: 0x106, + 0x1b70: 0x107, 0x1b71: 0x108, 0x1b72: 0x109, 0x1b73: 0x10a, 0x1b74: 0x10b, 0x1b75: 0x10c, 0x1b76: 0x10d, 0x1b77: 0x10e, + 0x1b78: 0x10f, 0x1b79: 0x110, 0x1b7a: 0x111, 0x1b7b: 0x112, 0x1b7c: 0x3ee, 0x1b7d: 0x3ef, 0x1b7e: 0x3f0, 0x1b7f: 0x3f1, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0x18b, 0x1b81: 0x18c, 0x1b82: 0x18d, 0x1b83: 0x18e, 0x1b84: 0x18f, 0x1b85: 0x190, 0x1b86: 0x191, 0x1b87: 0x192, + 0x1b88: 0x193, 0x1b89: 0x3f2, 0x1b8c: 0x195, 0x1b8d: 0x196, 0x1b8e: 0x197, 0x1b8f: 0x198, + 0x1b90: 0x199, 0x1b91: 0x19a, 0x1b92: 0x19b, 0x1b93: 0x19c, 0x1b94: 0x19d, 0x1b95: 0x19e, 0x1b97: 0x19f, + 0x1b98: 0x1a0, 0x1b99: 0x1a1, 0x1b9a: 0x1a2, 0x1b9b: 0x1a3, 0x1b9c: 0x1a4, 0x1b9d: 0x1a5, + // Block 0x6f, offset 0x1bc0 + 0x1be0: 0x3f3, 0x1be1: 0x3f4, 0x1be2: 0x3f5, 0x1be3: 0x3f6, 0x1be4: 0x3f7, 0x1be5: 0x3f8, 0x1be6: 0x3f9, 0x1be7: 0x3fa, + 0x1be8: 0x3fb, + // Block 0x70, offset 0x1c00 + 0x1c10: 0x09, 0x1c11: 0x0a, 0x1c12: 0x0b, 0x1c13: 0x0c, 0x1c16: 0x0d, + 0x1c1b: 0x0e, 0x1c1d: 0x0f, 0x1c1e: 0x10, 0x1c1f: 0x6c, + 0x1c2f: 0x6d, + // Block 0x71, offset 0x1c40 + 0x1c42: 0x01, 0x1c43: 0x02, 0x1c44: 0x03, 0x1c45: 0x04, 0x1c46: 0x05, 0x1c47: 0x06, + 0x1c48: 0x07, 0x1c49: 0x08, 0x1c4a: 0x09, 0x1c4b: 0x0a, 0x1c4c: 0x0b, 0x1c4d: 0x0c, 0x1c4e: 0x0d, 0x1c4f: 0x0e, + 0x1c50: 0x0f, 0x1c51: 0x10, 0x1c52: 0x11, 0x1c53: 0x12, 0x1c54: 0x13, 0x1c55: 0x14, 0x1c56: 0x15, 0x1c57: 0x16, + 0x1c58: 0x17, 0x1c59: 0x18, 0x1c5a: 0x19, 0x1c5b: 0x1a, 0x1c5c: 0x1b, 0x1c5d: 0x1c, 0x1c5e: 0x1d, 0x1c5f: 0x1e, + 0x1c60: 0x01, 0x1c61: 0x02, 0x1c62: 0x03, 0x1c63: 0x64, 0x1c64: 0x65, 0x1c65: 0x66, 0x1c66: 0x67, 0x1c67: 0x68, + 0x1c68: 0x69, 0x1c69: 0x6a, 0x1c6a: 0x06, 0x1c6d: 0x07, 0x1c6f: 0x6b, + 0x1c70: 0x6e, 0x1c73: 0x15, + // Block 0x72, offset 0x1c80 + 0x1c82: 0x01, 0x1c83: 0x02, 0x1c84: 0x03, 0x1c85: 0x04, 0x1c86: 0x05, 0x1c87: 0x06, + 0x1c88: 0x07, 0x1c89: 0x08, 0x1c8a: 0x09, 0x1c8b: 0x0a, 0x1c8c: 0x0b, 0x1c8d: 0x0c, 0x1c8e: 0x0d, 0x1c8f: 0x0e, + 0x1c90: 0x3fc, 0x1c91: 0x3fd, 0x1c92: 0x3fe, 0x1c93: 0x12, 0x1c94: 0x13, 0x1c95: 0x14, 0x1c96: 0x15, 0x1c97: 0x16, + 0x1c98: 0x17, 0x1c99: 0x18, 0x1c9a: 0x19, 0x1c9b: 0x1a, 0x1c9c: 0x1b, 0x1c9d: 0x1c, 0x1c9e: 0x1d, 0x1c9f: 0x1e, + 0x1ca0: 0x01, 0x1ca1: 0x02, 0x1ca2: 0x03, 0x1ca3: 0x04, 0x1ca4: 0x05, + 0x1caa: 0x06, 0x1cad: 0x07, 0x1caf: 0x08, + 0x1cb0: 0x13, 0x1cb3: 0x15, + // Block 0x73, offset 0x1cc0 + 0x1cc2: 0x01, 0x1cc3: 0x1f7, 0x1cc4: 0x401, 0x1cc5: 0x1f9, 0x1cc6: 0x05, 0x1cc7: 0x1fa, + 0x1cc8: 0x1fb, 0x1cc9: 0x08, 0x1cca: 0x09, 0x1ccb: 0x0a, 0x1ccc: 0x0b, 0x1ccd: 0x0c, 0x1cce: 0x0d, 0x1ccf: 0x0e, + 0x1cd0: 0x0f, 0x1cd1: 0x10, 0x1cd2: 0x11, 0x1cd3: 0x12, 0x1cd4: 0x13, 0x1cd5: 0x14, 0x1cd6: 0x15, 0x1cd7: 0x16, + 0x1cd8: 0x17, 0x1cd9: 0x18, 0x1cda: 0x19, 0x1cdb: 0x1a, 0x1cdc: 0x1b, 0x1cdd: 0x1c, 0x1cde: 0x1d, 0x1cdf: 0x1e, + 0x1ce0: 0x01, 0x1ce1: 0x2f, 0x1ce2: 0x30, 0x1ce3: 0x04, 0x1ce4: 0x05, + 0x1cea: 0x06, 0x1ced: 0x07, 0x1cef: 0x08, + 0x1cf0: 0x13, 0x1cf3: 0x15, + // Block 0x74, offset 0x1d00 + 0x1d00: 0x3f, 0x1d01: 0x40, 0x1d02: 0x41, 0x1d03: 0x42, 0x1d04: 0x43, 0x1d05: 0x44, 0x1d06: 0x45, 0x1d07: 0x46, + 0x1d08: 0x47, 0x1d09: 0x48, 0x1d0a: 0x49, 0x1d0b: 0x4a, 0x1d0c: 0x4b, 0x1d0d: 0x4c, 0x1d0e: 0x4d, 0x1d0f: 0x4e, + 0x1d10: 0x4f, 0x1d11: 0x50, 0x1d12: 0x51, 0x1d13: 0x52, 0x1d14: 0x53, 0x1d15: 0x54, 0x1d16: 0x55, 0x1d17: 0x56, + 0x1d18: 0x57, 0x1d19: 0x58, 0x1d1a: 0x59, 0x1d1b: 0x5a, 0x1d1c: 0x5b, 0x1d1d: 0x5c, 0x1d1e: 0x402, 0x1d1f: 0x403, + 0x1d20: 0x5f, 0x1d21: 0x60, 0x1d22: 0x61, 0x1d23: 0x62, 0x1d24: 0x63, 0x1d25: 0x64, 0x1d26: 0x65, 0x1d27: 0x66, + 0x1d28: 0x67, 0x1d29: 0x68, 0x1d2a: 0x69, 0x1d2c: 0x6a, 0x1d2d: 0x6b, 0x1d2e: 0x6c, 0x1d2f: 0x6d, + 0x1d30: 0x6e, 0x1d31: 0x6f, 0x1d33: 0x70, 0x1d34: 0x71, 0x1d35: 0x72, 0x1d36: 0x73, 0x1d37: 0x74, + 0x1d38: 0x75, 0x1d39: 0x76, 0x1d3a: 0x77, 0x1d3b: 0x78, 0x1d3c: 0x79, 0x1d3d: 0x7a, 0x1d3e: 0x7b, 0x1d3f: 0x7c, + // Block 0x75, offset 0x1d40 + 0x1d42: 0x01, 0x1d43: 0x02, 0x1d44: 0x03, 0x1d45: 0x04, 0x1d46: 0x05, 0x1d47: 0x06, + 0x1d48: 0x07, 0x1d49: 0x08, 0x1d4a: 0x09, 0x1d4b: 0x0a, 0x1d4c: 0x0b, 0x1d4d: 0x0c, 0x1d4e: 0x0d, 0x1d4f: 0x0e, + 0x1d50: 0x0f, 0x1d51: 0x10, 0x1d52: 0x11, 0x1d53: 0x12, 0x1d54: 0x13, 0x1d55: 0x14, 0x1d56: 0x15, 0x1d57: 0x16, + 0x1d58: 0x17, 0x1d59: 0x18, 0x1d5a: 0x19, 0x1d5b: 0x1a, 0x1d5c: 0x1b, 0x1d5d: 0x1c, 0x1d5e: 0x1d, 0x1d5f: 0x1e, + 0x1d60: 0x01, 0x1d61: 0x72, 0x1d62: 0x03, 0x1d63: 0x04, 0x1d64: 0x05, + 0x1d6a: 0x06, 0x1d6d: 0x07, 0x1d6f: 0x08, + 0x1d70: 0x13, 0x1d73: 0x15, + // Block 0x76, offset 0x1d80 + 0x1da0: 0x1f, 0x1da1: 0x20, 0x1da2: 0x21, 0x1da3: 0x22, 0x1da4: 0x23, 0x1da5: 0x24, 0x1da6: 0x25, 0x1da7: 0x26, + 0x1da8: 0x27, 0x1da9: 0x28, 0x1daa: 0x29, 0x1dab: 0x2a, 0x1dac: 0x2b, 0x1dad: 0x2c, 0x1dae: 0x2d, 0x1daf: 0x2e, + 0x1db0: 0x2f, 0x1db1: 0x30, 0x1db2: 0x404, 0x1db3: 0x405, 0x1db4: 0x33, 0x1db5: 0x34, 0x1db6: 0x35, 0x1db7: 0x36, + 0x1db8: 0x37, 0x1db9: 0x38, 0x1dba: 0x39, 0x1dbb: 0x3a, 0x1dbc: 0x3b, 0x1dbd: 0x3c, 0x1dbe: 0x3d, 0x1dbf: 0x3e, + // Block 0x77, offset 0x1dc0 + 0x1dc2: 0x01, 0x1dc3: 0x02, 0x1dc4: 0x03, 0x1dc5: 0x04, 0x1dc6: 0x05, 0x1dc7: 0x06, + 0x1dc8: 0x07, 0x1dc9: 0x08, 0x1dca: 0x09, 0x1dcb: 0x0a, 0x1dcc: 0x0b, 0x1dcd: 0x0c, 0x1dce: 0x0d, 0x1dcf: 0x0e, + 0x1dd0: 0x0f, 0x1dd1: 0x10, 0x1dd2: 0x11, 0x1dd3: 0x12, 0x1dd4: 0x13, 0x1dd5: 0x14, 0x1dd6: 0x15, 0x1dd7: 0x16, + 0x1dd8: 0x17, 0x1dd9: 0x18, 0x1dda: 0x19, 0x1ddb: 0x1a, 0x1ddc: 0x1b, 0x1ddd: 0x1c, 0x1dde: 0x1d, 0x1ddf: 0x1e, + 0x1de0: 0x74, 0x1de1: 0x02, 0x1de2: 0x03, 0x1de3: 0x04, 0x1de4: 0x05, + 0x1dea: 0x06, 0x1ded: 0x07, 0x1def: 0x08, + 0x1df0: 0x13, 0x1df3: 0x15, + // Block 0x78, offset 0x1e00 + 0x1e00: 0xba, 0x1e01: 0xbb, 0x1e02: 0xbc, 0x1e03: 0xbd, 0x1e04: 0xbe, 0x1e05: 0xbf, 0x1e06: 0xc0, 0x1e07: 0xc1, + 0x1e08: 0x406, 0x1e09: 0x2a0, 0x1e0a: 0xc4, 0x1e0b: 0x2a1, 0x1e0c: 0xc6, 0x1e0d: 0x2a2, 0x1e0e: 0xc8, 0x1e0f: 0x2a3, + // Block 0x79, offset 0x1e40 + 0x1e77: 0xca, + 0x1e78: 0x407, 0x1e79: 0x408, 0x1e7a: 0x409, 0x1e7b: 0x40a, 0x1e7c: 0x40b, 0x1e7d: 0x40c, 0x1e7e: 0x40d, 0x1e7f: 0x40e, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0x40f, 0x1e81: 0x410, 0x1e82: 0x411, 0x1e83: 0x412, 0x1e84: 0x413, 0x1e85: 0x414, 0x1e86: 0x415, 0x1e87: 0x416, + 0x1e88: 0x417, 0x1e89: 0x418, 0x1e8a: 0x419, 0x1e8b: 0x41a, 0x1e8c: 0x41b, 0x1e8d: 0x41c, 0x1e8e: 0x41d, 0x1e8f: 0x41e, + 0x1e90: 0x41f, 0x1e91: 0x420, 0x1e92: 0x421, 0x1e93: 0x422, 0x1e94: 0x423, 0x1e95: 0x424, 0x1e96: 0x425, 0x1e97: 0x426, + 0x1e98: 0x427, 0x1e99: 0x428, 0x1e9a: 0x429, 0x1e9b: 0x42a, 0x1e9c: 0x42b, 0x1e9d: 0x42c, 0x1e9e: 0x42d, 0x1e9f: 0x42e, + 0x1ea0: 0x42f, 0x1ea1: 0x430, 0x1ea2: 0x431, 0x1ea3: 0x432, 0x1ea4: 0x433, 0x1ea5: 0x434, 0x1ea6: 0x435, 0x1ea7: 0x436, + 0x1ea8: 0x437, 0x1ea9: 0x438, 0x1eaa: 0x439, 0x1eab: 0x43a, 0x1eac: 0x43b, 0x1ead: 0x43c, 0x1eae: 0x43d, 0x1eaf: 0x43e, + 0x1eb0: 0x43f, 0x1eb1: 0x440, 0x1eb2: 0x441, 0x1eb3: 0x442, 0x1eb4: 0x443, 0x1eb5: 0x444, 0x1eb6: 0x445, 0x1eb7: 0x446, + 0x1eb8: 0x447, 0x1eb9: 0x448, 0x1eba: 0x449, 0x1ebb: 0x44a, 0x1ebc: 0x44b, 0x1ebd: 0x44c, 0x1ebe: 0x44d, 0x1ebf: 0x44e, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0x44f, 0x1ec1: 0x450, 0x1ec2: 0x451, 0x1ec3: 0x452, 0x1ec4: 0x453, 0x1ec5: 0x454, 0x1ec6: 0x455, 0x1ec7: 0x456, + 0x1ec8: 0x457, 0x1ec9: 0x458, 0x1eca: 0x459, 0x1ecb: 0x45a, 0x1ecc: 0x45b, 0x1ecd: 0x45c, 0x1ece: 0x45d, 0x1ecf: 0x45e, + 0x1ed0: 0x45f, 0x1ed1: 0x460, 0x1ed2: 0x461, 0x1ed3: 0x462, 0x1ed4: 0x463, 0x1ed5: 0x464, 0x1ed6: 0x465, 0x1ed7: 0x466, + 0x1ed8: 0x467, 0x1ed9: 0x468, 0x1eda: 0x469, 0x1edb: 0x46a, 0x1edc: 0x46b, 0x1edd: 0x46c, 0x1ede: 0x46d, 0x1edf: 0x46e, + 0x1ee0: 0x46f, 0x1ee1: 0x470, 0x1ee2: 0x471, 0x1ee3: 0x472, 0x1ee4: 0x473, 0x1ee5: 0x474, 0x1ee6: 0x475, 0x1ee7: 0x476, + 0x1ee8: 0x477, 0x1ee9: 0x478, 0x1eea: 0x479, 0x1eeb: 0x47a, 0x1eec: 0x47b, 0x1eed: 0x47c, 0x1eee: 0x47d, 0x1eef: 0x47e, + 0x1ef0: 0x47f, 0x1ef1: 0x480, 0x1ef2: 0x481, 0x1ef3: 0x482, 0x1ef4: 0x483, 0x1ef5: 0x484, 0x1ef6: 0x485, 0x1ef7: 0x486, + 0x1ef8: 0x487, 0x1ef9: 0x488, 0x1efa: 0x489, 0x1efb: 0x48a, 0x1efc: 0x48b, 0x1efd: 0x48c, 0x1efe: 0x48d, 0x1eff: 0x48e, + // Block 0x7c, offset 0x1f00 + 0x1f00: 0x48f, 0x1f01: 0x490, 0x1f02: 0x491, 0x1f03: 0x492, 0x1f04: 0x493, 0x1f05: 0x494, 0x1f06: 0x495, 0x1f07: 0x496, + 0x1f08: 0x497, 0x1f09: 0x498, 0x1f0a: 0x499, 0x1f0b: 0x49a, 0x1f0c: 0x49b, 0x1f0d: 0x49c, 0x1f0e: 0x49d, 0x1f0f: 0x49e, + 0x1f10: 0x49f, 0x1f11: 0x4a0, 0x1f12: 0x4a1, 0x1f13: 0x4a2, 0x1f14: 0x4a3, 0x1f15: 0x4a4, 0x1f16: 0x4a5, 0x1f17: 0x4a6, + 0x1f18: 0x4a7, 0x1f19: 0x4a8, 0x1f1a: 0x4a9, 0x1f1b: 0x4aa, 0x1f1c: 0x4ab, 0x1f1d: 0x4ac, 0x1f1e: 0x4ad, 0x1f1f: 0x4ae, + 0x1f20: 0x4af, 0x1f21: 0x4b0, 0x1f22: 0x4b1, 0x1f23: 0x4b2, 0x1f24: 0x4b3, 0x1f25: 0x4b4, 0x1f26: 0x4b5, 0x1f27: 0x4b6, + 0x1f28: 0x4b7, 0x1f29: 0x4b8, 0x1f2a: 0x4b9, 0x1f2b: 0x4ba, 0x1f2c: 0x4bb, 0x1f2d: 0x4bc, 0x1f2e: 0x4bd, 0x1f2f: 0x4be, + 0x1f30: 0x4bf, 0x1f31: 0x4c0, 0x1f32: 0x4c1, 0x1f33: 0x4c2, 0x1f34: 0x4c3, 0x1f35: 0x4c4, 0x1f36: 0x4c5, 0x1f37: 0x4c6, + 0x1f38: 0x4c7, 0x1f39: 0x4c8, 0x1f3a: 0x4c9, 0x1f3c: 0x4ca, 0x1f3d: 0x4cb, 0x1f3e: 0x4cc, 0x1f3f: 0x4cd, + // Block 0x7d, offset 0x1f40 + 0x1f40: 0x4ce, 0x1f41: 0x4cf, 0x1f42: 0x4d0, 0x1f43: 0x4d1, 0x1f44: 0x4d2, 0x1f45: 0x4d3, 0x1f46: 0x4d4, 0x1f47: 0x4d5, + 0x1f48: 0x4d6, 0x1f49: 0x4d7, 0x1f4a: 0x4d8, 0x1f4b: 0x4d9, 0x1f4c: 0x4da, 0x1f4d: 0x4db, 0x1f4e: 0x4dc, 0x1f4f: 0x4dd, + 0x1f50: 0x4de, 0x1f51: 0x4df, 0x1f52: 0x4e0, 0x1f53: 0x4e1, 0x1f54: 0x4e2, 0x1f55: 0x4e3, 0x1f56: 0x4e4, 0x1f57: 0x4e5, + 0x1f58: 0x4e6, 0x1f59: 0x4e7, 0x1f5a: 0x4e8, 0x1f5b: 0x4e9, 0x1f5c: 0x4ea, 0x1f5d: 0x4eb, 0x1f5e: 0x4ec, 0x1f5f: 0x4ed, + 0x1f60: 0x4ee, 0x1f61: 0x4ef, 0x1f62: 0x4f0, 0x1f63: 0x4f1, 0x1f64: 0x4f2, 0x1f65: 0x4f3, 0x1f66: 0x4f4, 0x1f67: 0x4f5, + 0x1f68: 0x4f6, 0x1f69: 0x4f7, 0x1f6a: 0x4f8, 0x1f6b: 0x4f9, 0x1f6c: 0x4fa, 0x1f6d: 0x4fb, 0x1f6e: 0x4fc, + 0x1f70: 0x4fd, 0x1f71: 0x4fe, 0x1f72: 0x4ff, 0x1f73: 0x500, 0x1f74: 0x501, 0x1f75: 0x502, 0x1f76: 0x503, 0x1f77: 0x504, + 0x1f78: 0x505, 0x1f79: 0x506, 0x1f7a: 0x507, 0x1f7b: 0x508, 0x1f7c: 0x509, 0x1f7d: 0x50a, 0x1f7e: 0x50b, 0x1f7f: 0x50c, + // Block 0x7e, offset 0x1f80 + 0x1f80: 0x50d, 0x1f81: 0x50e, 0x1f82: 0x50f, 0x1f83: 0x510, 0x1f84: 0x511, 0x1f85: 0x512, 0x1f86: 0x513, 0x1f87: 0x514, + 0x1f88: 0x515, 0x1f89: 0x516, 0x1f8a: 0x517, 0x1f8b: 0x518, 0x1f8c: 0x519, 0x1f8d: 0x51a, 0x1f8e: 0x51b, 0x1f8f: 0x51c, + 0x1f90: 0x51d, 0x1f91: 0x51e, 0x1f95: 0x51f, 0x1f96: 0x520, 0x1f97: 0x521, + 0x1f98: 0x522, 0x1f99: 0x523, 0x1f9a: 0x524, 0x1f9b: 0x525, 0x1f9c: 0x526, 0x1f9d: 0x527, 0x1f9e: 0x528, 0x1f9f: 0x529, + 0x1fa0: 0x52a, 0x1fa1: 0x52b, 0x1fa2: 0x52c, 0x1fa3: 0x52d, 0x1fa4: 0x52e, 0x1fa5: 0x52f, 0x1fa6: 0x530, 0x1fa7: 0x531, + 0x1fa8: 0x532, 0x1fa9: 0x533, 0x1faa: 0x534, 0x1fab: 0x535, 0x1fac: 0x536, 0x1fad: 0x537, 0x1fae: 0x538, 0x1faf: 0x539, + 0x1fb0: 0x53a, 0x1fb1: 0x53b, 0x1fb3: 0x53c, 0x1fb4: 0x53d, 0x1fb5: 0x53e, 0x1fb6: 0x53f, 0x1fb7: 0x540, + 0x1fb8: 0x541, 0x1fb9: 0x542, 0x1fba: 0x543, 0x1fbb: 0x544, 0x1fbc: 0x545, 0x1fbd: 0x546, 0x1fbe: 0x547, + // Block 0x7f, offset 0x1fc0 + 0x1fe4: 0x548, 0x1fe5: 0x549, 0x1fe6: 0x54a, 0x1fe7: 0x54b, + 0x1fe8: 0x54c, 0x1fe9: 0x54d, 0x1fea: 0x54e, 0x1feb: 0x54f, 0x1fec: 0x103, 0x1fed: 0x104, 0x1fee: 0x105, 0x1fef: 0x106, + 0x1ff0: 0x107, 0x1ff1: 0x108, 0x1ff2: 0x109, 0x1ff3: 0x10a, 0x1ff4: 0x10b, 0x1ff5: 0x10c, 0x1ff6: 0x10d, 0x1ff7: 0x10e, + 0x1ff8: 0x10f, 0x1ff9: 0x110, 0x1ffa: 0x111, 0x1ffb: 0x112, 0x1ffc: 0x113, 0x1ffd: 0x114, 0x1ffe: 0x115, 0x1fff: 0x116, + // Block 0x80, offset 0x2000 + 0x2000: 0x18b, 0x2001: 0x18c, 0x2002: 0x18d, 0x2003: 0x18e, 0x2004: 0x18f, 0x2005: 0x190, 0x2006: 0x191, 0x2007: 0x192, + 0x2008: 0x193, 0x2009: 0x550, 0x200c: 0x195, 0x200d: 0x196, 0x200e: 0x197, 0x200f: 0x198, + 0x2010: 0x199, 0x2011: 0x19a, 0x2012: 0x19b, 0x2013: 0x19c, 0x2014: 0x19d, 0x2015: 0x19e, 0x2017: 0x19f, + 0x2018: 0x1a0, 0x2019: 0x1a1, 0x201a: 0x1a2, 0x201b: 0x1a3, 0x201c: 0x1a4, 0x201d: 0x1a5, + // Block 0x81, offset 0x2040 + 0x2060: 0x551, 0x2061: 0x552, 0x2062: 0x553, 0x2063: 0x554, 0x2064: 0x555, 0x2065: 0x556, 0x2066: 0x557, 0x2067: 0x558, + 0x2068: 0x559, + // Block 0x82, offset 0x2080 + 0x2090: 0x09, 0x2091: 0x0a, 0x2092: 0x0b, 0x2093: 0x0c, 0x2096: 0x0d, + 0x209b: 0x0e, 0x209d: 0x0f, 0x209e: 0x10, 0x209f: 0x7e, + 0x20af: 0x7f, + // Block 0x83, offset 0x20c0 + 0x20c2: 0x01, 0x20c3: 0x02, 0x20c4: 0x03, 0x20c5: 0x04, 0x20c6: 0x05, 0x20c7: 0x06, + 0x20c8: 0x07, 0x20c9: 0x08, 0x20ca: 0x09, 0x20cb: 0x0a, 0x20cc: 0x0b, 0x20cd: 0x0c, 0x20ce: 0x0d, 0x20cf: 0x0e, + 0x20d0: 0x0f, 0x20d1: 0x10, 0x20d2: 0x11, 0x20d3: 0x12, 0x20d4: 0x13, 0x20d5: 0x14, 0x20d6: 0x15, 0x20d7: 0x16, + 0x20d8: 0x17, 0x20d9: 0x18, 0x20da: 0x19, 0x20db: 0x1a, 0x20dc: 0x1b, 0x20dd: 0x1c, 0x20de: 0x1d, 0x20df: 0x1e, + 0x20e0: 0x01, 0x20e1: 0x02, 0x20e2: 0x03, 0x20e3: 0x76, 0x20e4: 0x77, 0x20e5: 0x78, 0x20e6: 0x79, 0x20e7: 0x7a, + 0x20e8: 0x7b, 0x20e9: 0x7c, 0x20ea: 0x06, 0x20ed: 0x07, 0x20ef: 0x7d, + 0x20f0: 0x80, 0x20f3: 0x15, + // Block 0x84, offset 0x2100 + 0x2120: 0x1f, 0x2121: 0x20, 0x2122: 0x21, 0x2123: 0x22, 0x2124: 0x55a, 0x2125: 0x24, 0x2126: 0x25, 0x2127: 0x26, + 0x2128: 0x27, 0x2129: 0x28, 0x212a: 0x29, 0x212b: 0x2a, 0x212c: 0x2b, 0x212d: 0x2c, 0x212e: 0x2d, 0x212f: 0x2e, + 0x2130: 0x2f, 0x2131: 0x30, 0x2132: 0x31, 0x2133: 0x32, 0x2134: 0x33, 0x2135: 0x34, 0x2136: 0x35, 0x2137: 0x36, + 0x2138: 0x37, 0x2139: 0x38, 0x213a: 0x39, 0x213b: 0x3a, 0x213c: 0x3b, 0x213d: 0x3c, 0x213e: 0x3d, 0x213f: 0x3e, + // Block 0x85, offset 0x2140 + 0x2142: 0x01, 0x2143: 0x02, 0x2144: 0x03, 0x2145: 0x04, 0x2146: 0x05, 0x2147: 0x06, + 0x2148: 0x07, 0x2149: 0x08, 0x214a: 0x09, 0x214b: 0x0a, 0x214c: 0x0b, 0x214d: 0x0c, 0x214e: 0x0d, 0x214f: 0x0e, + 0x2150: 0x0f, 0x2151: 0x10, 0x2152: 0x11, 0x2153: 0x12, 0x2154: 0x13, 0x2155: 0x14, 0x2156: 0x15, 0x2157: 0x16, + 0x2158: 0x17, 0x2159: 0x18, 0x215a: 0x19, 0x215b: 0x1a, 0x215c: 0x1b, 0x215d: 0x1c, 0x215e: 0x1d, 0x215f: 0x1e, + 0x2160: 0x82, 0x2161: 0x02, 0x2162: 0x03, 0x2163: 0x04, 0x2164: 0x05, + 0x216a: 0x06, 0x216d: 0x07, 0x216f: 0x08, + 0x2170: 0x13, 0x2173: 0x15, + // Block 0x86, offset 0x2180 + 0x2182: 0x01, 0x2183: 0x02, 0x2184: 0x03, 0x2185: 0x04, 0x2186: 0x55b, 0x2187: 0x06, + 0x2188: 0x07, 0x2189: 0x55c, 0x218a: 0x09, 0x218b: 0x0a, 0x218c: 0x0b, 0x218d: 0x0c, 0x218e: 0x0d, 0x218f: 0x0e, + 0x2190: 0x0f, 0x2191: 0x10, 0x2192: 0x11, 0x2193: 0x12, 0x2194: 0x13, 0x2195: 0x14, 0x2196: 0x15, 0x2197: 0x16, + 0x2198: 0x17, 0x2199: 0x18, 0x219a: 0x19, 0x219b: 0x1a, 0x219c: 0x1b, 0x219d: 0x1c, 0x219e: 0x1d, 0x219f: 0x1e, + 0x21a0: 0x01, 0x21a1: 0x02, 0x21a2: 0x03, 0x21a3: 0x04, 0x21a4: 0x05, + 0x21aa: 0x06, 0x21ad: 0x07, 0x21af: 0x08, + 0x21b0: 0x13, 0x21b3: 0x15, + // Block 0x87, offset 0x21c0 + 0x21c0: 0x3f, 0x21c1: 0x40, 0x21c2: 0x41, 0x21c3: 0x42, 0x21c4: 0x43, 0x21c5: 0x44, 0x21c6: 0x45, 0x21c7: 0x46, + 0x21c8: 0x47, 0x21c9: 0x48, 0x21ca: 0x49, 0x21cb: 0x4a, 0x21cc: 0x4b, 0x21cd: 0x4c, 0x21ce: 0x4d, 0x21cf: 0x4e, + 0x21d0: 0x4f, 0x21d1: 0x50, 0x21d2: 0x51, 0x21d3: 0x52, 0x21d4: 0x53, 0x21d5: 0x54, 0x21d6: 0x55, 0x21d7: 0x56, + 0x21d8: 0x57, 0x21d9: 0x58, 0x21da: 0x59, 0x21db: 0x5a, 0x21dc: 0x5b, 0x21dd: 0x5c, 0x21de: 0x5d, 0x21df: 0x5e, + 0x21e0: 0x5f, 0x21e1: 0x60, 0x21e2: 0x61, 0x21e3: 0x62, 0x21e4: 0x63, 0x21e5: 0x64, 0x21e6: 0x65, 0x21e7: 0x66, + 0x21e8: 0x67, 0x21e9: 0x68, 0x21ea: 0x69, 0x21ec: 0x6a, 0x21ed: 0x6b, 0x21ee: 0x6c, 0x21ef: 0x6d, + 0x21f0: 0x6e, 0x21f1: 0x6f, 0x21f3: 0x70, 0x21f4: 0x71, 0x21f5: 0x72, 0x21f6: 0x73, 0x21f7: 0x74, + 0x21f8: 0x75, 0x21f9: 0x565, 0x21fa: 0x566, 0x21fb: 0x567, 0x21fc: 0x79, 0x21fd: 0x7a, 0x21fe: 0x7b, 0x21ff: 0x7c, + // Block 0x88, offset 0x2200 + 0x2200: 0x7d, 0x2201: 0x7e, 0x2202: 0x7f, 0x2203: 0x80, 0x2204: 0x81, 0x2205: 0x82, 0x2206: 0x83, 0x2207: 0x84, + 0x2208: 0x85, 0x2209: 0x86, 0x220a: 0x87, 0x220b: 0x88, 0x220c: 0x89, 0x220d: 0x8a, 0x220e: 0x8b, 0x220f: 0x8c, + 0x2210: 0x8d, 0x2211: 0x8e, 0x2212: 0x568, 0x2213: 0x90, 0x2214: 0x91, 0x2215: 0x92, 0x2216: 0x93, 0x2217: 0x94, + 0x2218: 0x95, 0x2219: 0x96, 0x221a: 0x97, 0x221b: 0x98, 0x221c: 0x99, 0x221d: 0x9a, 0x221e: 0x9b, 0x221f: 0x9c, + 0x2220: 0x9d, 0x2221: 0x9e, 0x2222: 0x9f, 0x2223: 0xa0, 0x2224: 0xa1, 0x2225: 0xa2, 0x2226: 0xa3, 0x2227: 0xa4, + 0x2228: 0xa5, 0x2229: 0xa6, 0x222a: 0xa7, 0x222b: 0xa8, 0x222c: 0xa9, 0x222d: 0xaa, + 0x2230: 0xab, 0x2231: 0xac, 0x2232: 0xad, 0x2233: 0xae, 0x2234: 0xaf, 0x2235: 0xb0, 0x2236: 0xb1, 0x2237: 0xb2, + 0x2238: 0xb3, 0x223a: 0xb4, 0x223b: 0xb5, 0x223c: 0xb6, 0x223d: 0xb7, 0x223e: 0xb8, 0x223f: 0xb9, + // Block 0x89, offset 0x2240 + 0x2240: 0xba, 0x2241: 0xbb, 0x2242: 0xbc, 0x2243: 0xbd, 0x2244: 0xbe, 0x2245: 0xbf, 0x2246: 0xc0, 0x2247: 0xc1, + 0x2248: 0xc2, 0x2249: 0xc3, 0x224a: 0xc4, 0x224b: 0xc5, 0x224c: 0xc6, 0x224d: 0xc7, 0x224e: 0xc8, 0x224f: 0x569, + // Block 0x8a, offset 0x2280 + 0x2280: 0x18b, 0x2281: 0x18c, 0x2282: 0x18d, 0x2283: 0x18e, 0x2284: 0x56a, 0x2285: 0x190, 0x2286: 0x191, 0x2287: 0x192, + 0x2288: 0x193, 0x2289: 0x194, 0x228c: 0x195, 0x228d: 0x196, 0x228e: 0x197, 0x228f: 0x198, + 0x2290: 0x199, 0x2291: 0x19a, 0x2292: 0x19b, 0x2293: 0x19c, 0x2294: 0x19d, 0x2295: 0x19e, 0x2297: 0x19f, + 0x2298: 0x1a0, 0x2299: 0x1a1, 0x229a: 0x1a2, 0x229b: 0x1a3, 0x229c: 0x1a4, 0x229d: 0x1a5, + // Block 0x8b, offset 0x22c0 + 0x22d0: 0x09, 0x22d1: 0x0a, 0x22d2: 0x0b, 0x22d3: 0x0c, 0x22d6: 0x0d, + 0x22db: 0x0e, 0x22dd: 0x0f, 0x22de: 0x10, 0x22df: 0x88, + 0x22ef: 0x12, + // Block 0x8c, offset 0x2300 + 0x2302: 0x01, 0x2303: 0x55f, 0x2304: 0x560, 0x2305: 0x561, 0x2306: 0x05, 0x2307: 0x562, + 0x2308: 0x563, 0x2309: 0x08, 0x230a: 0x09, 0x230b: 0x0a, 0x230c: 0x564, 0x230d: 0x0c, 0x230e: 0x0d, 0x230f: 0x0e, + 0x2310: 0x0f, 0x2311: 0x10, 0x2312: 0x11, 0x2313: 0x12, 0x2314: 0x13, 0x2315: 0x14, 0x2316: 0x15, 0x2317: 0x16, + 0x2318: 0x17, 0x2319: 0x18, 0x231a: 0x19, 0x231b: 0x1a, 0x231c: 0x1b, 0x231d: 0x1c, 0x231e: 0x1d, 0x231f: 0x1e, + 0x2320: 0x01, 0x2321: 0x85, 0x2322: 0x86, 0x2323: 0x87, 0x2324: 0x05, + 0x232a: 0x06, 0x232d: 0x07, 0x232f: 0x08, + 0x2330: 0x89, 0x2333: 0x15, + // Block 0x8d, offset 0x2340 + 0x2340: 0x3f, 0x2341: 0x40, 0x2342: 0x41, 0x2343: 0x42, 0x2344: 0x43, 0x2345: 0x44, 0x2346: 0x45, 0x2347: 0x46, + 0x2348: 0x47, 0x2349: 0x48, 0x234a: 0x49, 0x234b: 0x4a, 0x234c: 0x4b, 0x234d: 0x4c, 0x234e: 0x4d, 0x234f: 0x4e, + 0x2350: 0x4f, 0x2351: 0x50, 0x2352: 0x51, 0x2353: 0x52, 0x2354: 0x53, 0x2355: 0x54, 0x2356: 0x55, 0x2357: 0x56, + 0x2358: 0x57, 0x2359: 0x58, 0x235a: 0x59, 0x235b: 0x5a, 0x235c: 0x5b, 0x235d: 0x5c, 0x235e: 0x5d, 0x235f: 0x5e, + 0x2360: 0x5f, 0x2361: 0x60, 0x2362: 0x61, 0x2363: 0x62, 0x2364: 0x63, 0x2365: 0x64, 0x2366: 0x65, 0x2367: 0x66, + 0x2368: 0x67, 0x2369: 0x68, 0x236a: 0x69, 0x236c: 0x6a, 0x236d: 0x6b, 0x236e: 0x6c, 0x236f: 0x6d, + 0x2370: 0x6e, 0x2371: 0x6f, 0x2373: 0x70, 0x2374: 0x71, 0x2375: 0x72, 0x2376: 0x73, 0x2377: 0x74, + 0x2378: 0x75, 0x2379: 0x56f, 0x237a: 0x77, 0x237b: 0x78, 0x237c: 0x79, 0x237d: 0x7a, 0x237e: 0x7b, 0x237f: 0x7c, + // Block 0x8e, offset 0x2380 + 0x2382: 0x01, 0x2383: 0x02, 0x2384: 0x56d, 0x2385: 0x56e, 0x2386: 0x05, 0x2387: 0x06, + 0x2388: 0x07, 0x2389: 0x08, 0x238a: 0x09, 0x238b: 0x0a, 0x238c: 0x0b, 0x238d: 0x0c, 0x238e: 0x0d, 0x238f: 0x0e, + 0x2390: 0x0f, 0x2391: 0x10, 0x2392: 0x11, 0x2393: 0x12, 0x2394: 0x13, 0x2395: 0x14, 0x2396: 0x15, 0x2397: 0x16, + 0x2398: 0x17, 0x2399: 0x18, 0x239a: 0x19, 0x239b: 0x1a, 0x239c: 0x1b, 0x239d: 0x1c, 0x239e: 0x1d, 0x239f: 0x1e, + 0x23a0: 0x01, 0x23a1: 0x8b, 0x23a2: 0x03, 0x23a3: 0x04, 0x23a4: 0x05, + 0x23aa: 0x06, 0x23ad: 0x07, 0x23af: 0x08, + 0x23b0: 0x13, 0x23b3: 0x15, + // Block 0x8f, offset 0x23c0 + 0x23e0: 0x1f, 0x23e1: 0x20, 0x23e2: 0x21, 0x23e3: 0x22, 0x23e4: 0x23, 0x23e5: 0x24, 0x23e6: 0x25, 0x23e7: 0x26, + 0x23e8: 0x27, 0x23e9: 0x28, 0x23ea: 0x29, 0x23eb: 0x2a, 0x23ec: 0x2b, 0x23ed: 0x2c, 0x23ee: 0x2d, 0x23ef: 0x2e, + 0x23f0: 0x2f, 0x23f1: 0x30, 0x23f2: 0x31, 0x23f3: 0x32, 0x23f4: 0x570, 0x23f5: 0x571, 0x23f6: 0x35, 0x23f7: 0x36, + 0x23f8: 0x37, 0x23f9: 0x38, 0x23fa: 0x39, 0x23fb: 0x3a, 0x23fc: 0x3b, 0x23fd: 0x3c, 0x23fe: 0x3d, 0x23ff: 0x3e, + // Block 0x90, offset 0x2400 + 0x2402: 0x01, 0x2403: 0x02, 0x2404: 0x03, 0x2405: 0x04, 0x2406: 0x05, 0x2407: 0x06, + 0x2408: 0x07, 0x2409: 0x08, 0x240a: 0x09, 0x240b: 0x0a, 0x240c: 0x0b, 0x240d: 0x0c, 0x240e: 0x0d, 0x240f: 0x0e, + 0x2410: 0x0f, 0x2411: 0x10, 0x2412: 0x11, 0x2413: 0x12, 0x2414: 0x13, 0x2415: 0x14, 0x2416: 0x15, 0x2417: 0x16, + 0x2418: 0x17, 0x2419: 0x18, 0x241a: 0x19, 0x241b: 0x1a, 0x241c: 0x1b, 0x241d: 0x1c, 0x241e: 0x1d, 0x241f: 0x1e, + 0x2420: 0x8d, 0x2421: 0x02, 0x2422: 0x03, 0x2423: 0x04, 0x2424: 0x05, + 0x242a: 0x06, 0x242d: 0x07, 0x242f: 0x08, + 0x2430: 0x13, 0x2433: 0x15, + // Block 0x91, offset 0x2440 + 0x2460: 0x1f, 0x2461: 0x20, 0x2462: 0x21, 0x2463: 0x22, 0x2464: 0x572, 0x2465: 0x24, 0x2466: 0x25, 0x2467: 0x26, + 0x2468: 0x27, 0x2469: 0x28, 0x246a: 0x29, 0x246b: 0x2a, 0x246c: 0x2b, 0x246d: 0x2c, 0x246e: 0x2d, 0x246f: 0x2e, + 0x2470: 0x2f, 0x2471: 0x30, 0x2472: 0x31, 0x2473: 0x32, 0x2474: 0x33, 0x2475: 0x34, 0x2476: 0x35, 0x2477: 0x36, + 0x2478: 0x37, 0x2479: 0x38, 0x247a: 0x39, 0x247b: 0x3a, 0x247c: 0x3b, 0x247d: 0x3c, 0x247e: 0x3d, 0x247f: 0x3e, + // Block 0x92, offset 0x2480 + 0x2482: 0x01, 0x2483: 0x02, 0x2484: 0x03, 0x2485: 0x04, 0x2486: 0x05, 0x2487: 0x06, + 0x2488: 0x07, 0x2489: 0x08, 0x248a: 0x09, 0x248b: 0x0a, 0x248c: 0x0b, 0x248d: 0x0c, 0x248e: 0x0d, 0x248f: 0x0e, + 0x2490: 0x0f, 0x2491: 0x10, 0x2492: 0x11, 0x2493: 0x12, 0x2494: 0x13, 0x2495: 0x14, 0x2496: 0x15, 0x2497: 0x16, + 0x2498: 0x17, 0x2499: 0x18, 0x249a: 0x19, 0x249b: 0x1a, 0x249c: 0x1b, 0x249d: 0x1c, 0x249e: 0x1d, 0x249f: 0x1e, + 0x24a0: 0x8f, 0x24a1: 0x02, 0x24a2: 0x03, 0x24a3: 0x04, 0x24a4: 0x05, + 0x24aa: 0x06, 0x24ad: 0x07, 0x24af: 0x08, + 0x24b0: 0x13, 0x24b3: 0x15, + // Block 0x93, offset 0x24c0 + 0x24c0: 0x7d, 0x24c1: 0x7e, 0x24c2: 0x7f, 0x24c3: 0x80, 0x24c4: 0x577, 0x24c5: 0x82, 0x24c6: 0x83, 0x24c7: 0x84, + 0x24c8: 0x85, 0x24c9: 0x86, 0x24ca: 0x87, 0x24cb: 0x88, 0x24cc: 0x89, 0x24cd: 0x8a, 0x24ce: 0x8b, 0x24cf: 0x8c, + 0x24d0: 0x8d, 0x24d1: 0x8e, 0x24d2: 0x8f, 0x24d3: 0x90, 0x24d4: 0x91, 0x24d5: 0x92, 0x24d6: 0x93, 0x24d7: 0x94, + 0x24d8: 0x95, 0x24d9: 0x96, 0x24da: 0x97, 0x24db: 0x98, 0x24dc: 0x99, 0x24dd: 0x9a, 0x24de: 0x9b, 0x24df: 0x9c, + 0x24e0: 0x9d, 0x24e1: 0x9e, 0x24e2: 0x9f, 0x24e3: 0xa0, 0x24e4: 0xa1, 0x24e5: 0xa2, 0x24e6: 0xa3, 0x24e7: 0xa4, + 0x24e8: 0xa5, 0x24e9: 0xa6, 0x24ea: 0xa7, 0x24eb: 0xa8, 0x24ec: 0xa9, 0x24ed: 0xaa, + 0x24f0: 0xab, 0x24f1: 0xac, 0x24f2: 0xad, 0x24f3: 0xae, 0x24f4: 0xaf, 0x24f5: 0xb0, 0x24f6: 0xb1, 0x24f7: 0xb2, + 0x24f8: 0xb3, 0x24fa: 0xb4, 0x24fb: 0xb5, 0x24fc: 0xb6, 0x24fd: 0xb7, 0x24fe: 0xb8, 0x24ff: 0xb9, + // Block 0x94, offset 0x2500 + 0x2500: 0xcb, 0x2501: 0xcc, 0x2502: 0xcd, 0x2503: 0xce, 0x2504: 0xcf, 0x2505: 0xd0, 0x2506: 0xd1, 0x2507: 0xd2, + 0x2508: 0xd3, 0x2509: 0xd4, 0x250a: 0xd5, 0x250b: 0xd6, 0x250c: 0xd7, 0x250d: 0xd8, 0x250e: 0xd9, 0x250f: 0xda, + 0x2510: 0xdb, 0x2511: 0xdc, 0x2512: 0xdd, 0x2513: 0xde, 0x2514: 0xdf, 0x2515: 0xe0, 0x2516: 0xe1, 0x2517: 0xe2, + 0x2518: 0xe3, 0x2519: 0xe4, 0x251a: 0xe5, 0x251b: 0xe6, 0x251c: 0xe7, 0x251d: 0xe8, 0x251e: 0xe9, 0x251f: 0x578, + 0x2520: 0xeb, 0x2521: 0xec, 0x2522: 0xed, 0x2523: 0xee, 0x2524: 0xef, 0x2525: 0xf0, 0x2526: 0xf1, 0x2527: 0xf2, + 0x2528: 0xf3, 0x2529: 0xf4, 0x252a: 0xf5, 0x252b: 0xf6, 0x252c: 0xf7, 0x252f: 0xf8, + // Block 0x95, offset 0x2540 + 0x2542: 0x01, 0x2543: 0x02, 0x2544: 0x575, 0x2545: 0x576, 0x2546: 0x05, 0x2547: 0x06, + 0x2548: 0x07, 0x2549: 0x08, 0x254a: 0x09, 0x254b: 0x0a, 0x254c: 0x0b, 0x254d: 0x0c, 0x254e: 0x0d, 0x254f: 0x0e, + 0x2550: 0x0f, 0x2551: 0x10, 0x2552: 0x11, 0x2553: 0x12, 0x2554: 0x13, 0x2555: 0x14, 0x2556: 0x15, 0x2557: 0x16, + 0x2558: 0x17, 0x2559: 0x18, 0x255a: 0x19, 0x255b: 0x1a, 0x255c: 0x1b, 0x255d: 0x1c, 0x255e: 0x1d, 0x255f: 0x1e, + 0x2560: 0x01, 0x2561: 0x02, 0x2562: 0x91, 0x2563: 0x04, 0x2564: 0x05, + 0x256a: 0x92, 0x256d: 0x07, 0x256f: 0x08, + 0x2570: 0x13, 0x2573: 0x15, + // Block 0x96, offset 0x2580 + 0x2580: 0x579, 0x2581: 0x57a, 0x2582: 0x57b, 0x2583: 0x42, 0x2584: 0x43, 0x2585: 0x44, 0x2586: 0x45, 0x2587: 0x46, + 0x2588: 0x47, 0x2589: 0x48, 0x258a: 0x49, 0x258b: 0x4a, 0x258c: 0x4b, 0x258d: 0x4c, 0x258e: 0x4d, 0x258f: 0x4e, + 0x2590: 0x4f, 0x2591: 0x50, 0x2592: 0x51, 0x2593: 0x52, 0x2594: 0x53, 0x2595: 0x54, 0x2596: 0x55, 0x2597: 0x56, + 0x2598: 0x57, 0x2599: 0x58, 0x259a: 0x59, 0x259b: 0x5a, 0x259c: 0x5b, 0x259d: 0x5c, 0x259e: 0x5d, 0x259f: 0x5e, + 0x25a0: 0x5f, 0x25a1: 0x60, 0x25a2: 0x61, 0x25a3: 0x62, 0x25a4: 0x63, 0x25a5: 0x64, 0x25a6: 0x65, 0x25a7: 0x66, + 0x25a8: 0x67, 0x25a9: 0x68, 0x25aa: 0x69, 0x25ac: 0x6a, 0x25ad: 0x6b, 0x25ae: 0x6c, 0x25af: 0x6d, + 0x25b0: 0x6e, 0x25b1: 0x6f, 0x25b3: 0x70, 0x25b4: 0x71, 0x25b5: 0x72, 0x25b6: 0x73, 0x25b7: 0x74, + 0x25b8: 0x75, 0x25b9: 0x76, 0x25ba: 0x77, 0x25bb: 0x78, 0x25bc: 0x79, 0x25bd: 0x7a, 0x25be: 0x7b, 0x25bf: 0x7c, + // Block 0x97, offset 0x25c0 + 0x25c2: 0x01, 0x25c3: 0x02, 0x25c4: 0x03, 0x25c5: 0x04, 0x25c6: 0x05, 0x25c7: 0x06, + 0x25c8: 0x07, 0x25c9: 0x08, 0x25ca: 0x09, 0x25cb: 0x0a, 0x25cc: 0x0b, 0x25cd: 0x0c, 0x25ce: 0x0d, 0x25cf: 0x0e, + 0x25d0: 0x0f, 0x25d1: 0x10, 0x25d2: 0x11, 0x25d3: 0x12, 0x25d4: 0x13, 0x25d5: 0x14, 0x25d6: 0x15, 0x25d7: 0x16, + 0x25d8: 0x17, 0x25d9: 0x18, 0x25da: 0x19, 0x25db: 0x1a, 0x25dc: 0x1b, 0x25dd: 0x1c, 0x25de: 0x1d, 0x25df: 0x1e, + 0x25e0: 0x01, 0x25e1: 0x94, 0x25e2: 0x03, 0x25e3: 0x04, 0x25e4: 0x05, + 0x25ea: 0x06, 0x25ed: 0x07, 0x25ef: 0x08, + 0x25f0: 0x13, 0x25f3: 0x15, + // Block 0x98, offset 0x2600 + 0x2600: 0x3f, 0x2601: 0x40, 0x2602: 0x41, 0x2603: 0x42, 0x2604: 0x43, 0x2605: 0x44, 0x2606: 0x45, 0x2607: 0x46, + 0x2608: 0x47, 0x2609: 0x48, 0x260a: 0x49, 0x260b: 0x4a, 0x260c: 0x4b, 0x260d: 0x4c, 0x260e: 0x4d, 0x260f: 0x4e, + 0x2610: 0x4f, 0x2611: 0x50, 0x2612: 0x51, 0x2613: 0x52, 0x2614: 0x53, 0x2615: 0x54, 0x2616: 0x55, 0x2617: 0x56, + 0x2618: 0x57, 0x2619: 0x58, 0x261a: 0x59, 0x261b: 0x5a, 0x261c: 0x5b, 0x261d: 0x5c, 0x261e: 0x5d, 0x261f: 0x5e, + 0x2620: 0x5f, 0x2621: 0x60, 0x2622: 0x61, 0x2623: 0x62, 0x2624: 0x63, 0x2625: 0x64, 0x2626: 0x65, 0x2627: 0x66, + 0x2628: 0x67, 0x2629: 0x68, 0x262a: 0x69, 0x262c: 0x6a, 0x262d: 0x6b, 0x262e: 0x6c, 0x262f: 0x6d, + 0x2630: 0x6e, 0x2631: 0x6f, 0x2633: 0x70, 0x2634: 0x71, 0x2635: 0x72, 0x2636: 0x73, 0x2637: 0x74, + 0x2638: 0x75, 0x2639: 0x1f2, 0x263a: 0x582, 0x263b: 0x583, 0x263c: 0x79, 0x263d: 0x7a, 0x263e: 0x7b, 0x263f: 0x7c, + // Block 0x99, offset 0x2640 + 0x2642: 0x01, 0x2643: 0x580, 0x2644: 0x03, 0x2645: 0x581, 0x2646: 0x05, 0x2647: 0x06, + 0x2648: 0x07, 0x2649: 0x08, 0x264a: 0x09, 0x264b: 0x0a, 0x264c: 0x0b, 0x264d: 0x0c, 0x264e: 0x0d, 0x264f: 0x0e, + 0x2650: 0x0f, 0x2651: 0x10, 0x2652: 0x11, 0x2653: 0x12, 0x2654: 0x13, 0x2655: 0x14, 0x2656: 0x15, 0x2657: 0x16, + 0x2658: 0x17, 0x2659: 0x18, 0x265a: 0x19, 0x265b: 0x1a, 0x265c: 0x1b, 0x265d: 0x1c, 0x265e: 0x1d, 0x265f: 0x1e, + 0x2660: 0x01, 0x2661: 0x96, 0x2662: 0x03, 0x2663: 0x04, 0x2664: 0x05, + 0x266a: 0x06, 0x266d: 0x07, 0x266f: 0x08, + 0x2670: 0x13, 0x2673: 0x15, + // Block 0x9a, offset 0x2680 + 0x26a0: 0x1f, 0x26a1: 0x20, 0x26a2: 0x21, 0x26a3: 0x22, 0x26a4: 0x23, 0x26a5: 0x24, 0x26a6: 0x25, 0x26a7: 0x26, + 0x26a8: 0x27, 0x26a9: 0x28, 0x26aa: 0x29, 0x26ab: 0x2a, 0x26ac: 0x586, 0x26ad: 0x587, 0x26ae: 0x2d, 0x26af: 0x2e, + 0x26b0: 0x2f, 0x26b1: 0x30, 0x26b2: 0x31, 0x26b3: 0x32, 0x26b4: 0x33, 0x26b5: 0x34, 0x26b6: 0x35, 0x26b7: 0x36, + 0x26b8: 0x37, 0x26b9: 0x38, 0x26ba: 0x39, 0x26bb: 0x3a, 0x26bc: 0x3b, 0x26bd: 0x3c, 0x26be: 0x3d, 0x26bf: 0x3e, + // Block 0x9b, offset 0x26c0 + 0x26c2: 0x01, 0x26c3: 0x02, 0x26c4: 0x03, 0x26c5: 0x04, 0x26c6: 0x05, 0x26c7: 0x06, + 0x26c8: 0x07, 0x26c9: 0x08, 0x26ca: 0x09, 0x26cb: 0x0a, 0x26cc: 0x0b, 0x26cd: 0x0c, 0x26ce: 0x0d, 0x26cf: 0x0e, + 0x26d0: 0x0f, 0x26d1: 0x10, 0x26d2: 0x11, 0x26d3: 0x12, 0x26d4: 0x13, 0x26d5: 0x14, 0x26d6: 0x15, 0x26d7: 0x16, + 0x26d8: 0x17, 0x26d9: 0x18, 0x26da: 0x19, 0x26db: 0x1a, 0x26dc: 0x1b, 0x26dd: 0x1c, 0x26de: 0x1d, 0x26df: 0x1e, + 0x26e0: 0x98, 0x26e1: 0x02, 0x26e2: 0x03, 0x26e3: 0x04, 0x26e4: 0x05, + 0x26ea: 0x06, 0x26ed: 0x07, 0x26ef: 0x08, + 0x26f0: 0x13, 0x26f3: 0x15, + // Block 0x9c, offset 0x2700 + 0x2720: 0x1f, 0x2721: 0x20, 0x2722: 0x21, 0x2723: 0x22, 0x2724: 0x23, 0x2725: 0x24, 0x2726: 0x25, 0x2727: 0x26, + 0x2728: 0x588, 0x2729: 0x589, 0x272a: 0x29, 0x272b: 0x2a, 0x272c: 0x2b, 0x272d: 0x2c, 0x272e: 0x2d, 0x272f: 0x2e, + 0x2730: 0x2f, 0x2731: 0x30, 0x2732: 0x31, 0x2733: 0x32, 0x2734: 0x33, 0x2735: 0x34, 0x2736: 0x35, 0x2737: 0x36, + 0x2738: 0x37, 0x2739: 0x38, 0x273a: 0x39, 0x273b: 0x3a, 0x273c: 0x3b, 0x273d: 0x3c, 0x273e: 0x3d, 0x273f: 0x3e, + // Block 0x9d, offset 0x2740 + 0x2742: 0x01, 0x2743: 0x02, 0x2744: 0x03, 0x2745: 0x04, 0x2746: 0x05, 0x2747: 0x06, + 0x2748: 0x07, 0x2749: 0x08, 0x274a: 0x09, 0x274b: 0x0a, 0x274c: 0x0b, 0x274d: 0x0c, 0x274e: 0x0d, 0x274f: 0x0e, + 0x2750: 0x0f, 0x2751: 0x10, 0x2752: 0x11, 0x2753: 0x12, 0x2754: 0x13, 0x2755: 0x14, 0x2756: 0x15, 0x2757: 0x16, + 0x2758: 0x17, 0x2759: 0x18, 0x275a: 0x19, 0x275b: 0x1a, 0x275c: 0x1b, 0x275d: 0x1c, 0x275e: 0x1d, 0x275f: 0x1e, + 0x2760: 0x9a, 0x2761: 0x02, 0x2762: 0x03, 0x2763: 0x04, 0x2764: 0x05, + 0x276a: 0x06, 0x276d: 0x07, 0x276f: 0x08, + 0x2770: 0x13, 0x2773: 0x15, + // Block 0x9e, offset 0x2780 + 0x2780: 0x3f, 0x2781: 0x40, 0x2782: 0x41, 0x2783: 0x42, 0x2784: 0x43, 0x2785: 0x44, 0x2786: 0x45, 0x2787: 0x46, + 0x2788: 0x47, 0x2789: 0x48, 0x278a: 0x49, 0x278b: 0x4a, 0x278c: 0x4b, 0x278d: 0x4c, 0x278e: 0x4d, 0x278f: 0x4e, + 0x2790: 0x4f, 0x2791: 0x50, 0x2792: 0x51, 0x2793: 0x52, 0x2794: 0x53, 0x2795: 0x54, 0x2796: 0x55, 0x2797: 0x56, + 0x2798: 0x57, 0x2799: 0x58, 0x279a: 0x59, 0x279b: 0x5a, 0x279c: 0x5b, 0x279d: 0x5c, 0x279e: 0x5d, 0x279f: 0x5e, + 0x27a0: 0x5f, 0x27a1: 0x60, 0x27a2: 0x61, 0x27a3: 0x62, 0x27a4: 0x63, 0x27a5: 0x64, 0x27a6: 0x65, 0x27a7: 0x66, + 0x27a8: 0x67, 0x27a9: 0x68, 0x27aa: 0x69, 0x27ac: 0x6a, 0x27ad: 0x6b, 0x27ae: 0x6c, 0x27af: 0x6d, + 0x27b0: 0x6e, 0x27b1: 0x6f, 0x27b3: 0x70, 0x27b4: 0x71, 0x27b5: 0x72, 0x27b6: 0x73, 0x27b7: 0x74, + 0x27b8: 0x58f, 0x27b9: 0x590, 0x27ba: 0x77, 0x27bb: 0x591, 0x27bc: 0x79, 0x27bd: 0x7a, 0x27be: 0x7b, 0x27bf: 0x7c, + // Block 0x9f, offset 0x27c0 + 0x27c2: 0x01, 0x27c3: 0x58c, 0x27c4: 0x58d, 0x27c5: 0x58e, 0x27c6: 0x05, 0x27c7: 0x06, + 0x27c8: 0x07, 0x27c9: 0x08, 0x27ca: 0x09, 0x27cb: 0x0a, 0x27cc: 0x0b, 0x27cd: 0x0c, 0x27ce: 0x0d, 0x27cf: 0x0e, + 0x27d0: 0x0f, 0x27d1: 0x10, 0x27d2: 0x11, 0x27d3: 0x12, 0x27d4: 0x13, 0x27d5: 0x14, 0x27d6: 0x15, 0x27d7: 0x16, + 0x27d8: 0x17, 0x27d9: 0x18, 0x27da: 0x19, 0x27db: 0x1a, 0x27dc: 0x1b, 0x27dd: 0x1c, 0x27de: 0x1d, 0x27df: 0x1e, + 0x27e0: 0x01, 0x27e1: 0x9c, 0x27e2: 0x03, 0x27e3: 0x04, 0x27e4: 0x05, + 0x27ea: 0x06, 0x27ed: 0x07, 0x27ef: 0x08, + 0x27f0: 0x13, 0x27f3: 0x15, + // Block 0xa0, offset 0x2800 + 0x2800: 0x596, 0x2801: 0x7e, 0x2802: 0x7f, 0x2803: 0x80, 0x2804: 0x81, 0x2805: 0x82, 0x2806: 0x83, 0x2807: 0x84, + 0x2808: 0x85, 0x2809: 0x86, 0x280a: 0x87, 0x280b: 0x88, 0x280c: 0x89, 0x280d: 0x8a, 0x280e: 0x8b, 0x280f: 0x8c, + 0x2810: 0x8d, 0x2811: 0x8e, 0x2812: 0x8f, 0x2813: 0x90, 0x2814: 0x91, 0x2815: 0x92, 0x2816: 0x93, 0x2817: 0x94, + 0x2818: 0x95, 0x2819: 0x96, 0x281a: 0x97, 0x281b: 0x98, 0x281c: 0x99, 0x281d: 0x9a, 0x281e: 0x9b, 0x281f: 0x9c, + 0x2820: 0x9d, 0x2821: 0x9e, 0x2822: 0x9f, 0x2823: 0xa0, 0x2824: 0xa1, 0x2825: 0xa2, 0x2826: 0xa3, 0x2827: 0xa4, + 0x2828: 0xa5, 0x2829: 0xa6, 0x282a: 0xa7, 0x282b: 0xa8, 0x282c: 0xa9, 0x282d: 0xaa, + 0x2830: 0xab, 0x2831: 0xac, 0x2832: 0xad, 0x2833: 0xae, 0x2834: 0xaf, 0x2835: 0xb0, 0x2836: 0xb1, 0x2837: 0xb2, + 0x2838: 0xb3, 0x283a: 0xb4, 0x283b: 0xb5, 0x283c: 0xb6, 0x283d: 0xb7, 0x283e: 0xb8, 0x283f: 0xb9, + // Block 0xa1, offset 0x2840 + 0x2864: 0xfb, 0x2865: 0xfc, 0x2866: 0xfd, 0x2867: 0xfe, + 0x2868: 0xff, 0x2869: 0x100, 0x286a: 0x101, 0x286b: 0x102, 0x286c: 0x103, 0x286d: 0x104, 0x286e: 0x24c, 0x286f: 0x597, + 0x2870: 0x24d, 0x2871: 0x598, 0x2872: 0x599, 0x2873: 0x59a, 0x2874: 0x59b, 0x2875: 0x10c, 0x2876: 0x10d, 0x2877: 0x10e, + 0x2878: 0x10f, 0x2879: 0x110, 0x287a: 0x111, 0x287b: 0x112, 0x287c: 0x113, 0x287d: 0x114, 0x287e: 0x115, 0x287f: 0x116, + // Block 0xa2, offset 0x2880 + 0x2882: 0x01, 0x2883: 0x02, 0x2884: 0x03, 0x2885: 0x04, 0x2886: 0x05, 0x2887: 0x06, + 0x2888: 0x07, 0x2889: 0x08, 0x288a: 0x09, 0x288b: 0x0a, 0x288c: 0x0b, 0x288d: 0x0c, 0x288e: 0x0d, 0x288f: 0x0e, + 0x2890: 0x0f, 0x2891: 0x10, 0x2892: 0x11, 0x2893: 0x12, 0x2894: 0x13, 0x2895: 0x14, 0x2896: 0x15, 0x2897: 0x16, + 0x2898: 0x592, 0x2899: 0x593, 0x289a: 0x594, 0x289b: 0x595, 0x289c: 0x1b, 0x289d: 0x1c, 0x289e: 0x1d, 0x289f: 0x1e, + 0x28a0: 0x01, 0x28a1: 0x02, 0x28a2: 0x9e, 0x28a3: 0x04, 0x28a4: 0x05, + 0x28aa: 0x06, 0x28ad: 0x07, 0x28af: 0x9f, + 0x28b0: 0x13, 0x28b3: 0x15, + // Block 0xa3, offset 0x28c0 + 0x28c0: 0x3f, 0x28c1: 0x40, 0x28c2: 0x41, 0x28c3: 0x42, 0x28c4: 0x43, 0x28c5: 0x44, 0x28c6: 0x45, 0x28c7: 0x46, + 0x28c8: 0x47, 0x28c9: 0x48, 0x28ca: 0x49, 0x28cb: 0x4a, 0x28cc: 0x4b, 0x28cd: 0x4c, 0x28ce: 0x4d, 0x28cf: 0x4e, + 0x28d0: 0x4f, 0x28d1: 0x50, 0x28d2: 0x51, 0x28d3: 0x52, 0x28d4: 0x53, 0x28d5: 0x54, 0x28d6: 0x55, 0x28d7: 0x56, + 0x28d8: 0x57, 0x28d9: 0x58, 0x28da: 0x59, 0x28db: 0x5a, 0x28dc: 0x5b, 0x28dd: 0x5c, 0x28de: 0x5d, 0x28df: 0x5e, + 0x28e0: 0x5f, 0x28e1: 0x60, 0x28e2: 0x61, 0x28e3: 0x62, 0x28e4: 0x63, 0x28e5: 0x64, 0x28e6: 0x65, 0x28e7: 0x66, + 0x28e8: 0x67, 0x28e9: 0x68, 0x28ea: 0x69, 0x28ec: 0x6a, 0x28ed: 0x6b, 0x28ee: 0x6c, 0x28ef: 0x6d, + 0x28f0: 0x6e, 0x28f1: 0x6f, 0x28f3: 0x70, 0x28f4: 0x71, 0x28f5: 0x72, 0x28f6: 0x73, 0x28f7: 0x74, + 0x28f8: 0x75, 0x28f9: 0x76, 0x28fa: 0x5a2, 0x28fb: 0x78, 0x28fc: 0x79, 0x28fd: 0x7a, 0x28fe: 0x7b, 0x28ff: 0x7c, + // Block 0xa4, offset 0x2900 + 0x2902: 0x01, 0x2903: 0x59e, 0x2904: 0x59f, 0x2905: 0x5a0, 0x2906: 0x05, 0x2907: 0x06, + 0x2908: 0x5a1, 0x2909: 0x08, 0x290a: 0x09, 0x290b: 0x0a, 0x290c: 0x0b, 0x290d: 0x0c, 0x290e: 0x0d, 0x290f: 0x0e, + 0x2910: 0x0f, 0x2911: 0x10, 0x2912: 0x11, 0x2913: 0x12, 0x2914: 0x13, 0x2915: 0x14, 0x2916: 0x15, 0x2917: 0x16, + 0x2918: 0x17, 0x2919: 0x18, 0x291a: 0x19, 0x291b: 0x1a, 0x291c: 0x1b, 0x291d: 0x1c, 0x291e: 0x1d, 0x291f: 0x1e, + 0x2920: 0x01, 0x2921: 0xa1, 0x2922: 0x03, 0x2923: 0x04, 0x2924: 0x05, + 0x292a: 0x06, 0x292d: 0x07, 0x292f: 0x08, + 0x2930: 0x13, 0x2933: 0x15, + // Block 0xa5, offset 0x2940 + 0x2940: 0x3f, 0x2941: 0x40, 0x2942: 0x41, 0x2943: 0x42, 0x2944: 0x43, 0x2945: 0x44, 0x2946: 0x45, 0x2947: 0x46, + 0x2948: 0x47, 0x2949: 0x48, 0x294a: 0x49, 0x294b: 0x4a, 0x294c: 0x4b, 0x294d: 0x4c, 0x294e: 0x4d, 0x294f: 0x4e, + 0x2950: 0x4f, 0x2951: 0x50, 0x2952: 0x51, 0x2953: 0x52, 0x2954: 0x53, 0x2955: 0x54, 0x2956: 0x55, 0x2957: 0x56, + 0x2958: 0x57, 0x2959: 0x58, 0x295a: 0x59, 0x295b: 0x5a, 0x295c: 0x5b, 0x295d: 0x5c, 0x295e: 0x5d, 0x295f: 0x5e, + 0x2960: 0x5f, 0x2961: 0x60, 0x2962: 0x61, 0x2963: 0x62, 0x2964: 0x63, 0x2965: 0x64, 0x2966: 0x65, 0x2967: 0x66, + 0x2968: 0x67, 0x2969: 0x68, 0x296a: 0x69, 0x296c: 0x6a, 0x296d: 0x6b, 0x296e: 0x6c, 0x296f: 0x6d, + 0x2970: 0x6e, 0x2971: 0x6f, 0x2973: 0x70, 0x2974: 0x71, 0x2975: 0x72, 0x2976: 0x1fc, 0x2977: 0x74, + 0x2978: 0x75, 0x2979: 0x5ac, 0x297a: 0x5ad, 0x297b: 0x5ae, 0x297c: 0x79, 0x297d: 0x7a, 0x297e: 0x7b, 0x297f: 0x7c, + // Block 0xa6, offset 0x2980 + 0x2982: 0x01, 0x2983: 0x5a5, 0x2984: 0x5a6, 0x2985: 0x5a7, 0x2986: 0x5a8, 0x2987: 0x5a9, + 0x2988: 0x5aa, 0x2989: 0x08, 0x298a: 0x5ab, 0x298b: 0x0a, 0x298c: 0x0b, 0x298d: 0x0c, 0x298e: 0x0d, 0x298f: 0x0e, + 0x2990: 0x0f, 0x2991: 0x10, 0x2992: 0x11, 0x2993: 0x12, 0x2994: 0x13, 0x2995: 0x14, 0x2996: 0x15, 0x2997: 0x16, + 0x2998: 0x17, 0x2999: 0x18, 0x299a: 0x19, 0x299b: 0x1a, 0x299c: 0x1b, 0x299d: 0x1c, 0x299e: 0x1d, 0x299f: 0x1e, + 0x29a0: 0x01, 0x29a1: 0xa3, 0x29a2: 0x4c, 0x29a3: 0x04, 0x29a4: 0x05, + 0x29aa: 0x06, 0x29ad: 0x07, 0x29af: 0x08, + 0x29b0: 0x13, 0x29b3: 0x15, + // Block 0xa7, offset 0x29c0 + 0x29e0: 0x1f, 0x29e1: 0x20, 0x29e2: 0x21, 0x29e3: 0x22, 0x29e4: 0x23, 0x29e5: 0x24, 0x29e6: 0x25, 0x29e7: 0x26, + 0x29e8: 0x27, 0x29e9: 0x28, 0x29ea: 0x29, 0x29eb: 0x2a, 0x29ec: 0x2b, 0x29ed: 0x2c, 0x29ee: 0x2d, 0x29ef: 0x2e, + 0x29f0: 0x2f, 0x29f1: 0x30, 0x29f2: 0x31, 0x29f3: 0x32, 0x29f4: 0x33, 0x29f5: 0x34, 0x29f6: 0x5af, 0x29f7: 0x36, + 0x29f8: 0x37, 0x29f9: 0x38, 0x29fa: 0x39, 0x29fb: 0x3a, 0x29fc: 0x3b, 0x29fd: 0x3c, 0x29fe: 0x3d, 0x29ff: 0x3e, + // Block 0xa8, offset 0x2a00 + 0x2a02: 0x01, 0x2a03: 0x02, 0x2a04: 0x03, 0x2a05: 0x04, 0x2a06: 0x05, 0x2a07: 0x06, + 0x2a08: 0x07, 0x2a09: 0x08, 0x2a0a: 0x09, 0x2a0b: 0x0a, 0x2a0c: 0x0b, 0x2a0d: 0x0c, 0x2a0e: 0x0d, 0x2a0f: 0x0e, + 0x2a10: 0x0f, 0x2a11: 0x10, 0x2a12: 0x11, 0x2a13: 0x12, 0x2a14: 0x13, 0x2a15: 0x14, 0x2a16: 0x15, 0x2a17: 0x16, + 0x2a18: 0x17, 0x2a19: 0x18, 0x2a1a: 0x19, 0x2a1b: 0x1a, 0x2a1c: 0x1b, 0x2a1d: 0x1c, 0x2a1e: 0x1d, 0x2a1f: 0x1e, + 0x2a20: 0xa5, 0x2a21: 0x02, 0x2a22: 0x03, 0x2a23: 0x04, 0x2a24: 0x05, + 0x2a2a: 0x06, 0x2a2d: 0x07, 0x2a2f: 0x08, + 0x2a30: 0x13, 0x2a33: 0x15, + // Block 0xa9, offset 0x2a40 + 0x2a40: 0x3f, 0x2a41: 0x40, 0x2a42: 0x41, 0x2a43: 0x42, 0x2a44: 0x43, 0x2a45: 0x44, 0x2a46: 0x45, 0x2a47: 0x46, + 0x2a48: 0x47, 0x2a49: 0x48, 0x2a4a: 0x49, 0x2a4b: 0x4a, 0x2a4c: 0x4b, 0x2a4d: 0x4c, 0x2a4e: 0x4d, 0x2a4f: 0x4e, + 0x2a50: 0x4f, 0x2a51: 0x50, 0x2a52: 0x51, 0x2a53: 0x52, 0x2a54: 0x53, 0x2a55: 0x54, 0x2a56: 0x55, 0x2a57: 0x56, + 0x2a58: 0x57, 0x2a59: 0x58, 0x2a5a: 0x59, 0x2a5b: 0x5a, 0x2a5c: 0x5b, 0x2a5d: 0x5c, 0x2a5e: 0x5d, 0x2a5f: 0x5e, + 0x2a60: 0x5f, 0x2a61: 0x60, 0x2a62: 0x61, 0x2a63: 0x62, 0x2a64: 0x63, 0x2a65: 0x64, 0x2a66: 0x65, 0x2a67: 0x66, + 0x2a68: 0x67, 0x2a69: 0x68, 0x2a6a: 0x69, 0x2a6c: 0x6a, 0x2a6d: 0x6b, 0x2a6e: 0x6c, 0x2a6f: 0x6d, + 0x2a70: 0x6e, 0x2a71: 0x6f, 0x2a73: 0x70, 0x2a74: 0x71, 0x2a75: 0x72, 0x2a76: 0x73, 0x2a77: 0x74, + 0x2a78: 0x75, 0x2a79: 0x1f2, 0x2a7a: 0x77, 0x2a7b: 0x5b4, 0x2a7c: 0x79, 0x2a7d: 0x7a, 0x2a7e: 0x7b, 0x2a7f: 0x7c, + // Block 0xaa, offset 0x2a80 + 0x2a82: 0x01, 0x2a83: 0x5b2, 0x2a84: 0x1f0, 0x2a85: 0x1f1, 0x2a86: 0x05, 0x2a87: 0x5b3, + 0x2a88: 0x07, 0x2a89: 0x08, 0x2a8a: 0x09, 0x2a8b: 0x0a, 0x2a8c: 0x0b, 0x2a8d: 0x0c, 0x2a8e: 0x0d, 0x2a8f: 0x0e, + 0x2a90: 0x0f, 0x2a91: 0x10, 0x2a92: 0x11, 0x2a93: 0x12, 0x2a94: 0x13, 0x2a95: 0x14, 0x2a96: 0x15, 0x2a97: 0x16, + 0x2a98: 0x17, 0x2a99: 0x18, 0x2a9a: 0x19, 0x2a9b: 0x1a, 0x2a9c: 0x1b, 0x2a9d: 0x1c, 0x2a9e: 0x1d, 0x2a9f: 0x1e, + 0x2aa0: 0x01, 0x2aa1: 0xa7, 0x2aa2: 0x03, 0x2aa3: 0x04, 0x2aa4: 0x05, + 0x2aaa: 0x06, 0x2aad: 0x07, 0x2aaf: 0x08, + 0x2ab0: 0x13, 0x2ab3: 0x15, + // Block 0xab, offset 0x2ac0 + 0x2ac2: 0x01, 0x2ac3: 0x02, 0x2ac4: 0x5b7, 0x2ac5: 0x27f, 0x2ac6: 0x05, 0x2ac7: 0x06, + 0x2ac8: 0x07, 0x2ac9: 0x08, 0x2aca: 0x09, 0x2acb: 0x0a, 0x2acc: 0x0b, 0x2acd: 0x0c, 0x2ace: 0x0d, 0x2acf: 0x0e, + 0x2ad0: 0x0f, 0x2ad1: 0x10, 0x2ad2: 0x11, 0x2ad3: 0x12, 0x2ad4: 0x13, 0x2ad5: 0x14, 0x2ad6: 0x15, 0x2ad7: 0x16, + 0x2ad8: 0x17, 0x2ad9: 0x18, 0x2ada: 0x19, 0x2adb: 0x1a, 0x2adc: 0x1b, 0x2add: 0x1c, 0x2ade: 0x1d, 0x2adf: 0x1e, + 0x2ae0: 0x01, 0x2ae1: 0x5b, 0x2ae2: 0x03, 0x2ae3: 0x04, 0x2ae4: 0x05, + 0x2aea: 0x06, 0x2aed: 0x07, 0x2aef: 0x08, + 0x2af0: 0x13, 0x2af3: 0x15, + // Block 0xac, offset 0x2b00 + 0x2b00: 0x3f, 0x2b01: 0x40, 0x2b02: 0x41, 0x2b03: 0x42, 0x2b04: 0x43, 0x2b05: 0x44, 0x2b06: 0x45, 0x2b07: 0x46, + 0x2b08: 0x47, 0x2b09: 0x48, 0x2b0a: 0x49, 0x2b0b: 0x4a, 0x2b0c: 0x4b, 0x2b0d: 0x4c, 0x2b0e: 0x4d, 0x2b0f: 0x4e, + 0x2b10: 0x4f, 0x2b11: 0x50, 0x2b12: 0x51, 0x2b13: 0x52, 0x2b14: 0x53, 0x2b15: 0x54, 0x2b16: 0x55, 0x2b17: 0x56, + 0x2b18: 0x57, 0x2b19: 0x58, 0x2b1a: 0x59, 0x2b1b: 0x5a, 0x2b1c: 0x5b, 0x2b1d: 0x5c, 0x2b1e: 0x5d, 0x2b1f: 0x5e, + 0x2b20: 0x5f, 0x2b21: 0x60, 0x2b22: 0x61, 0x2b23: 0x62, 0x2b24: 0x63, 0x2b25: 0x64, 0x2b26: 0x65, 0x2b27: 0x66, + 0x2b28: 0x67, 0x2b29: 0x68, 0x2b2a: 0x69, 0x2b2c: 0x6a, 0x2b2d: 0x6b, 0x2b2e: 0x6c, 0x2b2f: 0x6d, + 0x2b30: 0x6e, 0x2b31: 0x6f, 0x2b33: 0x70, 0x2b34: 0x71, 0x2b35: 0x72, 0x2b36: 0x73, 0x2b37: 0x74, + 0x2b38: 0x5bb, 0x2b39: 0x76, 0x2b3a: 0x77, 0x2b3b: 0x78, 0x2b3c: 0x79, 0x2b3d: 0x7a, 0x2b3e: 0x7b, 0x2b3f: 0x7c, + // Block 0xad, offset 0x2b40 + 0x2b42: 0x01, 0x2b43: 0x5ba, 0x2b44: 0x03, 0x2b45: 0x04, 0x2b46: 0x05, 0x2b47: 0x06, + 0x2b48: 0x07, 0x2b49: 0x08, 0x2b4a: 0x09, 0x2b4b: 0x0a, 0x2b4c: 0x0b, 0x2b4d: 0x0c, 0x2b4e: 0x0d, 0x2b4f: 0x0e, + 0x2b50: 0x0f, 0x2b51: 0x10, 0x2b52: 0x11, 0x2b53: 0x12, 0x2b54: 0x13, 0x2b55: 0x14, 0x2b56: 0x15, 0x2b57: 0x16, + 0x2b58: 0x17, 0x2b59: 0x18, 0x2b5a: 0x19, 0x2b5b: 0x1a, 0x2b5c: 0x1b, 0x2b5d: 0x1c, 0x2b5e: 0x1d, 0x2b5f: 0x1e, + 0x2b60: 0x01, 0x2b61: 0xaa, 0x2b62: 0x03, 0x2b63: 0x04, 0x2b64: 0x05, + 0x2b6a: 0x06, 0x2b6d: 0x07, 0x2b6f: 0x08, + 0x2b70: 0x13, 0x2b73: 0x15, + // Block 0xae, offset 0x2b80 + 0x2b80: 0x3f, 0x2b81: 0x40, 0x2b82: 0x41, 0x2b83: 0x42, 0x2b84: 0x43, 0x2b85: 0x44, 0x2b86: 0x45, 0x2b87: 0x46, + 0x2b88: 0x47, 0x2b89: 0x48, 0x2b8a: 0x49, 0x2b8b: 0x4a, 0x2b8c: 0x4b, 0x2b8d: 0x4c, 0x2b8e: 0x4d, 0x2b8f: 0x4e, + 0x2b90: 0x4f, 0x2b91: 0x50, 0x2b92: 0x51, 0x2b93: 0x52, 0x2b94: 0x53, 0x2b95: 0x54, 0x2b96: 0x55, 0x2b97: 0x56, + 0x2b98: 0x57, 0x2b99: 0x58, 0x2b9a: 0x59, 0x2b9b: 0x5a, 0x2b9c: 0x5b, 0x2b9d: 0x5c, 0x2b9e: 0x5d, 0x2b9f: 0x5e, + 0x2ba0: 0x5f, 0x2ba1: 0x60, 0x2ba2: 0x61, 0x2ba3: 0x62, 0x2ba4: 0x63, 0x2ba5: 0x64, 0x2ba6: 0x65, 0x2ba7: 0x66, + 0x2ba8: 0x67, 0x2ba9: 0x68, 0x2baa: 0x69, 0x2bac: 0x6a, 0x2bad: 0x6b, 0x2bae: 0x6c, 0x2baf: 0x6d, + 0x2bb0: 0x6e, 0x2bb1: 0x6f, 0x2bb3: 0x70, 0x2bb4: 0x71, 0x2bb5: 0x72, 0x2bb6: 0x1fc, 0x2bb7: 0x74, + 0x2bb8: 0x75, 0x2bb9: 0x25b, 0x2bba: 0x77, 0x2bbb: 0x5c2, 0x2bbc: 0x79, 0x2bbd: 0x7a, 0x2bbe: 0x7b, 0x2bbf: 0x7c, + // Block 0xaf, offset 0x2bc0 + 0x2bc2: 0x01, 0x2bc3: 0x5be, 0x2bc4: 0x5bf, 0x2bc5: 0x5c0, 0x2bc6: 0x05, 0x2bc7: 0x5c1, + 0x2bc8: 0x259, 0x2bc9: 0x08, 0x2bca: 0x09, 0x2bcb: 0x0a, 0x2bcc: 0x0b, 0x2bcd: 0x0c, 0x2bce: 0x0d, 0x2bcf: 0x0e, + 0x2bd0: 0x0f, 0x2bd1: 0x10, 0x2bd2: 0x11, 0x2bd3: 0x12, 0x2bd4: 0x13, 0x2bd5: 0x14, 0x2bd6: 0x15, 0x2bd7: 0x16, + 0x2bd8: 0x17, 0x2bd9: 0x18, 0x2bda: 0x19, 0x2bdb: 0x1a, 0x2bdc: 0x1b, 0x2bdd: 0x1c, 0x2bde: 0x1d, 0x2bdf: 0x1e, + 0x2be0: 0x01, 0x2be1: 0xac, 0x2be2: 0x4c, 0x2be3: 0x04, 0x2be4: 0x05, + 0x2bea: 0x06, 0x2bed: 0x07, 0x2bef: 0x08, + 0x2bf0: 0x13, 0x2bf3: 0x15, + // Block 0xb0, offset 0x2c00 + 0x2c20: 0x1f, 0x2c21: 0x20, 0x2c22: 0x21, 0x2c23: 0x22, 0x2c24: 0x23, 0x2c25: 0x24, 0x2c26: 0x25, 0x2c27: 0x26, + 0x2c28: 0x27, 0x2c29: 0x28, 0x2c2a: 0x29, 0x2c2b: 0x2a, 0x2c2c: 0x2b, 0x2c2d: 0x2c, 0x2c2e: 0x5c3, 0x2c2f: 0x2e, + 0x2c30: 0x2f, 0x2c31: 0x30, 0x2c32: 0x31, 0x2c33: 0x32, 0x2c34: 0x33, 0x2c35: 0x34, 0x2c36: 0x35, 0x2c37: 0x36, + 0x2c38: 0x37, 0x2c39: 0x38, 0x2c3a: 0x39, 0x2c3b: 0x3a, 0x2c3c: 0x3b, 0x2c3d: 0x3c, 0x2c3e: 0x3d, 0x2c3f: 0x3e, + // Block 0xb1, offset 0x2c40 + 0x2c42: 0x01, 0x2c43: 0x02, 0x2c44: 0x03, 0x2c45: 0x04, 0x2c46: 0x05, 0x2c47: 0x06, + 0x2c48: 0x07, 0x2c49: 0x08, 0x2c4a: 0x09, 0x2c4b: 0x0a, 0x2c4c: 0x0b, 0x2c4d: 0x0c, 0x2c4e: 0x0d, 0x2c4f: 0x0e, + 0x2c50: 0x0f, 0x2c51: 0x10, 0x2c52: 0x11, 0x2c53: 0x12, 0x2c54: 0x13, 0x2c55: 0x14, 0x2c56: 0x15, 0x2c57: 0x16, + 0x2c58: 0x17, 0x2c59: 0x18, 0x2c5a: 0x19, 0x2c5b: 0x1a, 0x2c5c: 0x1b, 0x2c5d: 0x1c, 0x2c5e: 0x1d, 0x2c5f: 0x1e, + 0x2c60: 0xae, 0x2c61: 0x02, 0x2c62: 0x03, 0x2c63: 0x04, 0x2c64: 0x05, + 0x2c6a: 0x06, 0x2c6d: 0x07, 0x2c6f: 0x08, + 0x2c70: 0x13, 0x2c73: 0x15, + // Block 0xb2, offset 0x2c80 + 0x2ca0: 0x1f, 0x2ca1: 0x20, 0x2ca2: 0x21, 0x2ca3: 0x22, 0x2ca4: 0x23, 0x2ca5: 0x24, 0x2ca6: 0x25, 0x2ca7: 0x26, + 0x2ca8: 0x27, 0x2ca9: 0x28, 0x2caa: 0x29, 0x2cab: 0x2a, 0x2cac: 0x2b, 0x2cad: 0x2c, 0x2cae: 0x2d, 0x2caf: 0x2e, + 0x2cb0: 0x5c4, 0x2cb1: 0x30, 0x2cb2: 0x31, 0x2cb3: 0x32, 0x2cb4: 0x33, 0x2cb5: 0x34, 0x2cb6: 0x35, 0x2cb7: 0x36, + 0x2cb8: 0x37, 0x2cb9: 0x38, 0x2cba: 0x39, 0x2cbb: 0x3a, 0x2cbc: 0x3b, 0x2cbd: 0x3c, 0x2cbe: 0x3d, 0x2cbf: 0x3e, + // Block 0xb3, offset 0x2cc0 + 0x2cc2: 0x01, 0x2cc3: 0x02, 0x2cc4: 0x03, 0x2cc5: 0x04, 0x2cc6: 0x05, 0x2cc7: 0x06, + 0x2cc8: 0x07, 0x2cc9: 0x08, 0x2cca: 0x09, 0x2ccb: 0x0a, 0x2ccc: 0x0b, 0x2ccd: 0x0c, 0x2cce: 0x0d, 0x2ccf: 0x0e, + 0x2cd0: 0x0f, 0x2cd1: 0x10, 0x2cd2: 0x11, 0x2cd3: 0x12, 0x2cd4: 0x13, 0x2cd5: 0x14, 0x2cd6: 0x15, 0x2cd7: 0x16, + 0x2cd8: 0x17, 0x2cd9: 0x18, 0x2cda: 0x19, 0x2cdb: 0x1a, 0x2cdc: 0x1b, 0x2cdd: 0x1c, 0x2cde: 0x1d, 0x2cdf: 0x1e, + 0x2ce0: 0xb0, 0x2ce1: 0x02, 0x2ce2: 0x03, 0x2ce3: 0x04, 0x2ce4: 0x05, + 0x2cea: 0x06, 0x2ced: 0x07, 0x2cef: 0x08, + 0x2cf0: 0x13, 0x2cf3: 0x15, + // Block 0xb4, offset 0x2d00 + 0x2d20: 0x1f, 0x2d21: 0x20, 0x2d22: 0x21, 0x2d23: 0x22, 0x2d24: 0x23, 0x2d25: 0x24, 0x2d26: 0x25, 0x2d27: 0x26, + 0x2d28: 0x27, 0x2d29: 0x28, 0x2d2a: 0x29, 0x2d2b: 0x2a, 0x2d2c: 0x2b, 0x2d2d: 0x2c, 0x2d2e: 0x2d, 0x2d2f: 0x2e, + 0x2d30: 0x2f, 0x2d31: 0x30, 0x2d32: 0x31, 0x2d33: 0x32, 0x2d34: 0x33, 0x2d35: 0x34, 0x2d36: 0x35, 0x2d37: 0x36, + 0x2d38: 0x5c5, 0x2d39: 0x5c6, 0x2d3a: 0x39, 0x2d3b: 0x3a, 0x2d3c: 0x3b, 0x2d3d: 0x3c, 0x2d3e: 0x3d, 0x2d3f: 0x3e, + // Block 0xb5, offset 0x2d40 + 0x2d42: 0x01, 0x2d43: 0x02, 0x2d44: 0x03, 0x2d45: 0x04, 0x2d46: 0x05, 0x2d47: 0x06, + 0x2d48: 0x07, 0x2d49: 0x08, 0x2d4a: 0x09, 0x2d4b: 0x0a, 0x2d4c: 0x0b, 0x2d4d: 0x0c, 0x2d4e: 0x0d, 0x2d4f: 0x0e, + 0x2d50: 0x0f, 0x2d51: 0x10, 0x2d52: 0x11, 0x2d53: 0x12, 0x2d54: 0x13, 0x2d55: 0x14, 0x2d56: 0x15, 0x2d57: 0x16, + 0x2d58: 0x17, 0x2d59: 0x18, 0x2d5a: 0x19, 0x2d5b: 0x1a, 0x2d5c: 0x1b, 0x2d5d: 0x1c, 0x2d5e: 0x1d, 0x2d5f: 0x1e, + 0x2d60: 0xb2, 0x2d61: 0x02, 0x2d62: 0x03, 0x2d63: 0x04, 0x2d64: 0x05, + 0x2d6a: 0x06, 0x2d6d: 0x07, 0x2d6f: 0x08, + 0x2d70: 0x13, 0x2d73: 0x15, + // Block 0xb6, offset 0x2d80 + 0x2d80: 0x3f, 0x2d81: 0x40, 0x2d82: 0x41, 0x2d83: 0x42, 0x2d84: 0x43, 0x2d85: 0x44, 0x2d86: 0x45, 0x2d87: 0x46, + 0x2d88: 0x47, 0x2d89: 0x48, 0x2d8a: 0x49, 0x2d8b: 0x4a, 0x2d8c: 0x4b, 0x2d8d: 0x4c, 0x2d8e: 0x4d, 0x2d8f: 0x4e, + 0x2d90: 0x4f, 0x2d91: 0x50, 0x2d92: 0x51, 0x2d93: 0x52, 0x2d94: 0x53, 0x2d95: 0x54, 0x2d96: 0x55, 0x2d97: 0x56, + 0x2d98: 0x57, 0x2d99: 0x58, 0x2d9a: 0x59, 0x2d9b: 0x5a, 0x2d9c: 0x5b, 0x2d9d: 0x5c, 0x2d9e: 0x5d, 0x2d9f: 0x5e, + 0x2da0: 0x5f, 0x2da1: 0x60, 0x2da2: 0x61, 0x2da3: 0x62, 0x2da4: 0x63, 0x2da5: 0x64, 0x2da6: 0x65, 0x2da7: 0x66, + 0x2da8: 0x67, 0x2da9: 0x68, 0x2daa: 0x69, 0x2dac: 0x6a, 0x2dad: 0x6b, 0x2dae: 0x6c, 0x2daf: 0x6d, + 0x2db0: 0x6e, 0x2db1: 0x6f, 0x2db3: 0x70, 0x2db4: 0x71, 0x2db5: 0x72, 0x2db6: 0x73, 0x2db7: 0x74, + 0x2db8: 0x5cf, 0x2db9: 0x5d0, 0x2dba: 0x5d1, 0x2dbb: 0x5d2, 0x2dbc: 0x79, 0x2dbd: 0x7a, 0x2dbe: 0x7b, 0x2dbf: 0x7c, + // Block 0xb7, offset 0x2dc0 + 0x2dc2: 0x01, 0x2dc3: 0x5c9, 0x2dc4: 0x5ca, 0x2dc5: 0x5cb, 0x2dc6: 0x05, 0x2dc7: 0x5cc, + 0x2dc8: 0x5cd, 0x2dc9: 0x08, 0x2dca: 0x5ce, 0x2dcb: 0x0a, 0x2dcc: 0x0b, 0x2dcd: 0x0c, 0x2dce: 0x0d, 0x2dcf: 0x0e, + 0x2dd0: 0x0f, 0x2dd1: 0x10, 0x2dd2: 0x11, 0x2dd3: 0x12, 0x2dd4: 0x13, 0x2dd5: 0x14, 0x2dd6: 0x15, 0x2dd7: 0x16, + 0x2dd8: 0x17, 0x2dd9: 0x18, 0x2dda: 0x19, 0x2ddb: 0x1a, 0x2ddc: 0x1b, 0x2ddd: 0x1c, 0x2dde: 0x1d, 0x2ddf: 0x1e, + 0x2de0: 0x01, 0x2de1: 0xb4, 0x2de2: 0x03, 0x2de3: 0x04, 0x2de4: 0x05, + 0x2dea: 0x06, 0x2ded: 0x07, 0x2def: 0x08, + 0x2df0: 0x13, 0x2df3: 0x15, + // Block 0xb8, offset 0x2e00 + 0x2e00: 0x3f, 0x2e01: 0x40, 0x2e02: 0x41, 0x2e03: 0x42, 0x2e04: 0x43, 0x2e05: 0x44, 0x2e06: 0x45, 0x2e07: 0x46, + 0x2e08: 0x47, 0x2e09: 0x48, 0x2e0a: 0x49, 0x2e0b: 0x4a, 0x2e0c: 0x4b, 0x2e0d: 0x4c, 0x2e0e: 0x4d, 0x2e0f: 0x4e, + 0x2e10: 0x4f, 0x2e11: 0x50, 0x2e12: 0x51, 0x2e13: 0x52, 0x2e14: 0x53, 0x2e15: 0x54, 0x2e16: 0x55, 0x2e17: 0x56, + 0x2e18: 0x57, 0x2e19: 0x58, 0x2e1a: 0x59, 0x2e1b: 0x5a, 0x2e1c: 0x5b, 0x2e1d: 0x5c, 0x2e1e: 0x5d, 0x2e1f: 0x5e, + 0x2e20: 0x5f, 0x2e21: 0x60, 0x2e22: 0x61, 0x2e23: 0x62, 0x2e24: 0x63, 0x2e25: 0x64, 0x2e26: 0x65, 0x2e27: 0x66, + 0x2e28: 0x67, 0x2e29: 0x68, 0x2e2a: 0x69, 0x2e2c: 0x6a, 0x2e2d: 0x6b, 0x2e2e: 0x6c, 0x2e2f: 0x6d, + 0x2e30: 0x6e, 0x2e31: 0x6f, 0x2e33: 0x70, 0x2e34: 0x71, 0x2e35: 0x72, 0x2e36: 0x73, 0x2e37: 0x74, + 0x2e38: 0x1de, 0x2e39: 0x1df, 0x2e3a: 0x77, 0x2e3b: 0x1e1, 0x2e3c: 0x79, 0x2e3d: 0x7a, 0x2e3e: 0x7b, 0x2e3f: 0x7c, + // Block 0xb9, offset 0x2e40 + 0x2e40: 0x7d, 0x2e41: 0x7e, 0x2e42: 0x7f, 0x2e43: 0x80, 0x2e44: 0x81, 0x2e45: 0x5d5, 0x2e46: 0x83, 0x2e47: 0x84, + 0x2e48: 0x85, 0x2e49: 0x86, 0x2e4a: 0x87, 0x2e4b: 0x88, 0x2e4c: 0x89, 0x2e4d: 0x8a, 0x2e4e: 0x8b, 0x2e4f: 0x8c, + 0x2e50: 0x8d, 0x2e51: 0x8e, 0x2e52: 0x8f, 0x2e53: 0x90, 0x2e54: 0x91, 0x2e55: 0x92, 0x2e56: 0x93, 0x2e57: 0x94, + 0x2e58: 0x95, 0x2e59: 0x96, 0x2e5a: 0x97, 0x2e5b: 0x98, 0x2e5c: 0x99, 0x2e5d: 0x9a, 0x2e5e: 0x9b, 0x2e5f: 0x9c, + 0x2e60: 0x9d, 0x2e61: 0x9e, 0x2e62: 0x9f, 0x2e63: 0xa0, 0x2e64: 0xa1, 0x2e65: 0xa2, 0x2e66: 0xa3, 0x2e67: 0xa4, + 0x2e68: 0xa5, 0x2e69: 0xa6, 0x2e6a: 0xa7, 0x2e6b: 0xa8, 0x2e6c: 0xa9, 0x2e6d: 0xaa, + 0x2e70: 0xab, 0x2e71: 0xac, 0x2e72: 0xad, 0x2e73: 0xae, 0x2e74: 0xaf, 0x2e75: 0xb0, 0x2e76: 0xb1, 0x2e77: 0xb2, + 0x2e78: 0xb3, 0x2e7a: 0xb4, 0x2e7b: 0xb5, 0x2e7c: 0xb6, 0x2e7d: 0xb7, 0x2e7e: 0xb8, 0x2e7f: 0xb9, + // Block 0xba, offset 0x2e80 + 0x2e80: 0xba, 0x2e81: 0xbb, 0x2e82: 0xbc, 0x2e83: 0xbd, 0x2e84: 0xbe, 0x2e85: 0xbf, 0x2e86: 0xc0, 0x2e87: 0xc1, + 0x2e88: 0xc2, 0x2e89: 0xc3, 0x2e8a: 0xc4, 0x2e8b: 0xc5, 0x2e8c: 0xc6, 0x2e8d: 0x1e4, 0x2e8e: 0xc8, 0x2e8f: 0xc9, + // Block 0xbb, offset 0x2ec0 + 0x2ec0: 0x18b, 0x2ec1: 0x18c, 0x2ec2: 0x18d, 0x2ec3: 0x18e, 0x2ec4: 0x5d6, 0x2ec5: 0x190, 0x2ec6: 0x191, 0x2ec7: 0x192, + 0x2ec8: 0x193, 0x2ec9: 0x194, 0x2ecc: 0x195, 0x2ecd: 0x196, 0x2ece: 0x197, 0x2ecf: 0x198, + 0x2ed0: 0x199, 0x2ed1: 0x19a, 0x2ed2: 0x19b, 0x2ed3: 0x19c, 0x2ed4: 0x19d, 0x2ed5: 0x19e, 0x2ed7: 0x19f, + 0x2ed8: 0x1a0, 0x2ed9: 0x1a1, 0x2eda: 0x1a2, 0x2edb: 0x1a3, 0x2edc: 0x1a4, 0x2edd: 0x1a5, + // Block 0xbc, offset 0x2f00 + 0x2f10: 0x09, 0x2f11: 0x0a, 0x2f12: 0x0b, 0x2f13: 0x0c, 0x2f16: 0x0d, + 0x2f1b: 0x0e, 0x2f1d: 0x0f, 0x2f1e: 0x10, 0x2f1f: 0xb9, + 0x2f2f: 0x12, + // Block 0xbd, offset 0x2f40 + 0x2f42: 0x01, 0x2f43: 0x1d7, 0x2f44: 0x1d8, 0x2f45: 0x1d9, 0x2f46: 0x05, 0x2f47: 0x1db, + 0x2f48: 0x1dc, 0x2f49: 0x08, 0x2f4a: 0x09, 0x2f4b: 0x0a, 0x2f4c: 0x0b, 0x2f4d: 0x0c, 0x2f4e: 0x0d, 0x2f4f: 0x0e, + 0x2f50: 0x0f, 0x2f51: 0x10, 0x2f52: 0x11, 0x2f53: 0x12, 0x2f54: 0x13, 0x2f55: 0x14, 0x2f56: 0x15, 0x2f57: 0x16, + 0x2f58: 0x17, 0x2f59: 0x18, 0x2f5a: 0x19, 0x2f5b: 0x1a, 0x2f5c: 0x1b, 0x2f5d: 0x1c, 0x2f5e: 0x1d, 0x2f5f: 0x1e, + 0x2f60: 0x01, 0x2f61: 0xb6, 0x2f62: 0xb7, 0x2f63: 0xb8, 0x2f64: 0x05, + 0x2f6a: 0x06, 0x2f6d: 0x07, 0x2f6f: 0x08, + 0x2f70: 0xba, 0x2f73: 0x15, + // Block 0xbe, offset 0x2f80 + 0x2f82: 0x01, 0x2f83: 0x02, 0x2f84: 0x03, 0x2f85: 0x04, 0x2f86: 0x05, 0x2f87: 0x06, + 0x2f88: 0x07, 0x2f89: 0x08, 0x2f8a: 0x09, 0x2f8b: 0x0a, 0x2f8c: 0x0b, 0x2f8d: 0x0c, 0x2f8e: 0x0d, 0x2f8f: 0x0e, + 0x2f90: 0x0f, 0x2f91: 0x10, 0x2f92: 0x5d7, 0x2f93: 0x12, 0x2f94: 0x13, 0x2f95: 0x14, 0x2f96: 0x15, 0x2f97: 0x16, + 0x2f98: 0x17, 0x2f99: 0x18, 0x2f9a: 0x19, 0x2f9b: 0x1a, 0x2f9c: 0x1b, 0x2f9d: 0x1c, 0x2f9e: 0x1d, 0x2f9f: 0x1e, + 0x2fa0: 0x01, 0x2fa1: 0x02, 0x2fa2: 0x03, 0x2fa3: 0x04, 0x2fa4: 0x05, + 0x2faa: 0x06, 0x2fad: 0x07, 0x2faf: 0x08, + 0x2fb0: 0x13, 0x2fb3: 0x15, + // Block 0xbf, offset 0x2fc0 + 0x2fe4: 0xfb, 0x2fe5: 0xfc, 0x2fe6: 0xfd, 0x2fe7: 0xfe, + 0x2fe8: 0xff, 0x2fe9: 0x100, 0x2fea: 0x101, 0x2feb: 0x102, 0x2fec: 0x103, 0x2fed: 0x104, 0x2fee: 0x24c, 0x2fef: 0x106, + 0x2ff0: 0x5dc, 0x2ff1: 0x5dd, 0x2ff2: 0x5de, 0x2ff3: 0x5df, 0x2ff4: 0x5e0, 0x2ff5: 0x10c, 0x2ff6: 0x10d, 0x2ff7: 0x10e, + 0x2ff8: 0x10f, 0x2ff9: 0x110, 0x2ffa: 0x111, 0x2ffb: 0x5e1, 0x2ffc: 0x113, 0x2ffd: 0x114, 0x2ffe: 0x115, 0x2fff: 0x116, + // Block 0xc0, offset 0x3000 + 0x3002: 0x01, 0x3003: 0x02, 0x3004: 0x03, 0x3005: 0x04, 0x3006: 0x05, 0x3007: 0x06, + 0x3008: 0x07, 0x3009: 0x08, 0x300a: 0x09, 0x300b: 0x0a, 0x300c: 0x0b, 0x300d: 0x0c, 0x300e: 0x0d, 0x300f: 0x0e, + 0x3010: 0x0f, 0x3011: 0x10, 0x3012: 0x11, 0x3013: 0x12, 0x3014: 0x13, 0x3015: 0x14, 0x3016: 0x15, 0x3017: 0x16, + 0x3018: 0x5d8, 0x3019: 0x5d9, 0x301a: 0x5da, 0x301b: 0x5db, 0x301c: 0x1b, 0x301d: 0x1c, 0x301e: 0x1d, 0x301f: 0x1e, + 0x3020: 0x01, 0x3021: 0x02, 0x3022: 0x03, 0x3023: 0x04, 0x3024: 0x05, + 0x302a: 0x06, 0x302d: 0x07, 0x302f: 0xbd, + 0x3030: 0x13, 0x3033: 0x15, + // Block 0xc1, offset 0x3040 + 0x3040: 0x3f, 0x3041: 0x40, 0x3042: 0x41, 0x3043: 0x42, 0x3044: 0x43, 0x3045: 0x44, 0x3046: 0x45, 0x3047: 0x46, + 0x3048: 0x47, 0x3049: 0x48, 0x304a: 0x49, 0x304b: 0x4a, 0x304c: 0x4b, 0x304d: 0x4c, 0x304e: 0x4d, 0x304f: 0x4e, + 0x3050: 0x4f, 0x3051: 0x50, 0x3052: 0x51, 0x3053: 0x52, 0x3054: 0x53, 0x3055: 0x54, 0x3056: 0x55, 0x3057: 0x56, + 0x3058: 0x57, 0x3059: 0x58, 0x305a: 0x59, 0x305b: 0x5a, 0x305c: 0x5b, 0x305d: 0x5c, 0x305e: 0x5d, 0x305f: 0x5e, + 0x3060: 0x5f, 0x3061: 0x60, 0x3062: 0x61, 0x3063: 0x62, 0x3064: 0x63, 0x3065: 0x64, 0x3066: 0x65, 0x3067: 0x66, + 0x3068: 0x67, 0x3069: 0x68, 0x306a: 0x69, 0x306c: 0x6a, 0x306d: 0x6b, 0x306e: 0x6c, 0x306f: 0x6d, + 0x3070: 0x6e, 0x3071: 0x6f, 0x3073: 0x70, 0x3074: 0x71, 0x3075: 0x72, 0x3076: 0x73, 0x3077: 0x74, + 0x3078: 0x5ee, 0x3079: 0x5ef, 0x307a: 0x5f0, 0x307b: 0x5f1, 0x307c: 0x5f2, 0x307d: 0x5f3, 0x307e: 0x5f4, 0x307f: 0x5f5, + // Block 0xc2, offset 0x3080 + 0x3082: 0x01, 0x3083: 0x5e4, 0x3084: 0x5e5, 0x3085: 0x5e6, 0x3086: 0x5e7, 0x3087: 0x5e8, + 0x3088: 0x5e9, 0x3089: 0x08, 0x308a: 0x09, 0x308b: 0x0a, 0x308c: 0x5ea, 0x308d: 0x5eb, 0x308e: 0x5ec, 0x308f: 0x5ed, + 0x3090: 0x0f, 0x3091: 0x10, 0x3092: 0x11, 0x3093: 0x12, 0x3094: 0x13, 0x3095: 0x14, 0x3096: 0x15, 0x3097: 0x16, + 0x3098: 0x17, 0x3099: 0x18, 0x309a: 0x19, 0x309b: 0x1a, 0x309c: 0x1b, 0x309d: 0x1c, 0x309e: 0x1d, 0x309f: 0x1e, + 0x30a0: 0x01, 0x30a1: 0xbf, 0x30a2: 0x03, 0x30a3: 0x04, 0x30a4: 0x05, + 0x30aa: 0x06, 0x30ad: 0x07, 0x30af: 0x08, + 0x30b0: 0x13, 0x30b3: 0x15, + // Block 0xc3, offset 0x30c0 + 0x30c2: 0x01, 0x30c3: 0x5f8, 0x30c4: 0x03, 0x30c5: 0x04, 0x30c6: 0x05, 0x30c7: 0x06, + 0x30c8: 0x07, 0x30c9: 0x08, 0x30ca: 0x09, 0x30cb: 0x0a, 0x30cc: 0x0b, 0x30cd: 0x0c, 0x30ce: 0x0d, 0x30cf: 0x0e, + 0x30d0: 0x0f, 0x30d1: 0x10, 0x30d2: 0x11, 0x30d3: 0x12, 0x30d4: 0x13, 0x30d5: 0x14, 0x30d6: 0x15, 0x30d7: 0x16, + 0x30d8: 0x17, 0x30d9: 0x18, 0x30da: 0x19, 0x30db: 0x1a, 0x30dc: 0x1b, 0x30dd: 0x1c, 0x30de: 0x1d, 0x30df: 0x1e, + 0x30e0: 0x01, 0x30e1: 0x02, 0x30e2: 0x03, 0x30e3: 0x04, 0x30e4: 0x05, + 0x30ea: 0x06, 0x30ed: 0x07, 0x30ef: 0x08, + 0x30f0: 0x13, 0x30f3: 0x15, + // Block 0xc4, offset 0x3100 + 0x3100: 0x3f, 0x3101: 0x40, 0x3102: 0x41, 0x3103: 0x42, 0x3104: 0x43, 0x3105: 0x44, 0x3106: 0x45, 0x3107: 0x46, + 0x3108: 0x47, 0x3109: 0x48, 0x310a: 0x49, 0x310b: 0x4a, 0x310c: 0x4b, 0x310d: 0x4c, 0x310e: 0x4d, 0x310f: 0x4e, + 0x3110: 0x4f, 0x3111: 0x50, 0x3112: 0x51, 0x3113: 0x52, 0x3114: 0x53, 0x3115: 0x54, 0x3116: 0x55, 0x3117: 0x56, + 0x3118: 0x57, 0x3119: 0x58, 0x311a: 0x59, 0x311b: 0x5a, 0x311c: 0x5b, 0x311d: 0x5c, 0x311e: 0x5d, 0x311f: 0x5e, + 0x3120: 0x5f, 0x3121: 0x60, 0x3122: 0x61, 0x3123: 0x62, 0x3124: 0x63, 0x3125: 0x64, 0x3126: 0x65, 0x3127: 0x66, + 0x3128: 0x67, 0x3129: 0x68, 0x312a: 0x69, 0x312c: 0x6a, 0x312d: 0x6b, 0x312e: 0x6c, 0x312f: 0x6d, + 0x3130: 0x6e, 0x3131: 0x6f, 0x3133: 0x70, 0x3134: 0x71, 0x3135: 0x72, 0x3136: 0x73, 0x3137: 0x74, + 0x3138: 0x75, 0x3139: 0x5fb, 0x313a: 0x5fc, 0x313b: 0x5fd, 0x313c: 0x79, 0x313d: 0x7a, 0x313e: 0x7b, 0x313f: 0x7c, + // Block 0xc5, offset 0x3140 + 0x3142: 0x01, 0x3143: 0x02, 0x3144: 0x03, 0x3145: 0x04, 0x3146: 0x05, 0x3147: 0x06, + 0x3148: 0x07, 0x3149: 0x08, 0x314a: 0x09, 0x314b: 0x0a, 0x314c: 0x0b, 0x314d: 0x0c, 0x314e: 0x0d, 0x314f: 0x0e, + 0x3150: 0x0f, 0x3151: 0x10, 0x3152: 0x11, 0x3153: 0x12, 0x3154: 0x13, 0x3155: 0x14, 0x3156: 0x15, 0x3157: 0x16, + 0x3158: 0x17, 0x3159: 0x18, 0x315a: 0x19, 0x315b: 0x1a, 0x315c: 0x1b, 0x315d: 0x1c, 0x315e: 0x1d, 0x315f: 0x1e, + 0x3160: 0x01, 0x3161: 0xc2, 0x3162: 0x03, 0x3163: 0x04, 0x3164: 0x05, + 0x316a: 0x06, 0x316d: 0x07, 0x316f: 0x08, + 0x3170: 0x13, 0x3173: 0x15, + // Block 0xc6, offset 0x3180 + 0x3180: 0x3f, 0x3181: 0x40, 0x3182: 0x41, 0x3183: 0x42, 0x3184: 0x43, 0x3185: 0x44, 0x3186: 0x45, 0x3187: 0x46, + 0x3188: 0x47, 0x3189: 0x48, 0x318a: 0x49, 0x318b: 0x4a, 0x318c: 0x4b, 0x318d: 0x4c, 0x318e: 0x4d, 0x318f: 0x4e, + 0x3190: 0x4f, 0x3191: 0x50, 0x3192: 0x51, 0x3193: 0x52, 0x3194: 0x53, 0x3195: 0x54, 0x3196: 0x55, 0x3197: 0x56, + 0x3198: 0x57, 0x3199: 0x58, 0x319a: 0x59, 0x319b: 0x5a, 0x319c: 0x5b, 0x319d: 0x5c, 0x319e: 0x5d, 0x319f: 0x5e, + 0x31a0: 0x5f, 0x31a1: 0x60, 0x31a2: 0x61, 0x31a3: 0x62, 0x31a4: 0x63, 0x31a5: 0x64, 0x31a6: 0x65, 0x31a7: 0x66, + 0x31a8: 0x67, 0x31a9: 0x68, 0x31aa: 0x69, 0x31ac: 0x6a, 0x31ad: 0x6b, 0x31ae: 0x6c, 0x31af: 0x6d, + 0x31b0: 0x6e, 0x31b1: 0x6f, 0x31b3: 0x70, 0x31b4: 0x71, 0x31b5: 0x72, 0x31b6: 0x73, 0x31b7: 0x74, + 0x31b8: 0x605, 0x31b9: 0x606, 0x31ba: 0x607, 0x31bb: 0x608, 0x31bc: 0x79, 0x31bd: 0x7a, 0x31be: 0x7b, 0x31bf: 0x7c, + // Block 0xc7, offset 0x31c0 + 0x31c0: 0x7d, 0x31c1: 0x7e, 0x31c2: 0x7f, 0x31c3: 0x80, 0x31c4: 0x81, 0x31c5: 0x82, 0x31c6: 0x83, 0x31c7: 0x84, + 0x31c8: 0x85, 0x31c9: 0x86, 0x31ca: 0x87, 0x31cb: 0x88, 0x31cc: 0x89, 0x31cd: 0x8a, 0x31ce: 0x8b, 0x31cf: 0x8c, + 0x31d0: 0x8d, 0x31d1: 0x8e, 0x31d2: 0x8f, 0x31d3: 0x90, 0x31d4: 0x91, 0x31d5: 0x92, 0x31d6: 0x93, 0x31d7: 0x94, + 0x31d8: 0x95, 0x31d9: 0x96, 0x31da: 0x97, 0x31db: 0x98, 0x31dc: 0x99, 0x31dd: 0x9a, 0x31de: 0x9b, 0x31df: 0x9c, + 0x31e0: 0x9d, 0x31e1: 0x9e, 0x31e2: 0x9f, 0x31e3: 0xa0, 0x31e4: 0xa1, 0x31e5: 0xa2, 0x31e6: 0xa3, 0x31e7: 0xa4, + 0x31e8: 0xa5, 0x31e9: 0xa6, 0x31ea: 0xa7, 0x31eb: 0xa8, 0x31ec: 0xa9, 0x31ed: 0xaa, + 0x31f0: 0xab, 0x31f1: 0xac, 0x31f2: 0xad, 0x31f3: 0xae, 0x31f4: 0xaf, 0x31f5: 0xb0, 0x31f6: 0xb1, 0x31f7: 0xb2, + 0x31f8: 0xb3, 0x31fa: 0x609, 0x31fb: 0x60a, 0x31fc: 0x60b, 0x31fd: 0x60c, 0x31fe: 0x60d, 0x31ff: 0x60e, + // Block 0xc8, offset 0x3200 + 0x3200: 0x60f, 0x3201: 0xbb, 0x3202: 0xbc, 0x3203: 0xbd, 0x3204: 0xbe, 0x3205: 0xbf, 0x3206: 0x610, 0x3207: 0xc1, + 0x3208: 0x611, 0x3209: 0x612, 0x320a: 0x613, 0x320b: 0x614, 0x320c: 0xc6, 0x320d: 0x615, 0x320e: 0xc8, 0x320f: 0x616, + 0x3210: 0x617, 0x3211: 0x618, 0x3212: 0x619, 0x3213: 0x61a, 0x3214: 0x61b, 0x3215: 0x61c, 0x3216: 0x61d, 0x3217: 0x61e, + 0x3218: 0x61f, 0x3219: 0x620, 0x321a: 0x621, 0x321b: 0x622, 0x321c: 0x623, 0x321d: 0x624, 0x321e: 0x625, 0x321f: 0x626, + 0x3220: 0x627, 0x3221: 0x628, 0x3222: 0x629, 0x3223: 0x62a, 0x3224: 0x62b, 0x3225: 0x62c, 0x3226: 0x62d, 0x3227: 0x62e, + 0x3228: 0x62f, 0x3229: 0x630, 0x322a: 0x631, 0x322b: 0x632, 0x322c: 0x633, 0x322d: 0x634, 0x322e: 0x635, 0x322f: 0x636, + 0x3230: 0x637, 0x3231: 0x638, 0x3232: 0x639, 0x3233: 0x63a, 0x3234: 0x63b, 0x3235: 0x63c, 0x3236: 0x63d, 0x3237: 0x63e, + 0x3238: 0x63f, 0x3239: 0x640, 0x323a: 0x641, 0x323b: 0x642, 0x323c: 0x643, 0x323d: 0x644, 0x323e: 0x645, 0x323f: 0x646, + // Block 0xc9, offset 0x3240 + 0x3240: 0x647, 0x3241: 0x648, 0x3242: 0x649, 0x3243: 0x64a, 0x3244: 0x64b, 0x3245: 0x64c, 0x3246: 0x64d, 0x3247: 0x64e, + 0x3248: 0x64f, 0x3249: 0x650, 0x324a: 0x651, 0x324b: 0x652, 0x324c: 0x653, 0x324d: 0x654, 0x324e: 0x655, 0x324f: 0x656, + 0x3250: 0x657, 0x3251: 0x658, 0x3252: 0x659, 0x3253: 0x65a, 0x3254: 0x65b, 0x3255: 0x65c, 0x3256: 0x65d, 0x3257: 0x65e, + 0x3258: 0x65f, 0x3259: 0x660, 0x325a: 0x661, 0x325b: 0x662, 0x325c: 0x663, 0x325d: 0x664, 0x325e: 0x665, 0x325f: 0x666, + 0x3260: 0x667, 0x3261: 0x668, 0x3262: 0x669, 0x3263: 0x66a, 0x3264: 0x66b, 0x3265: 0x66c, 0x3266: 0x66d, 0x3267: 0x66e, + 0x3268: 0x66f, 0x3269: 0x670, 0x326a: 0x671, 0x326b: 0x672, 0x326c: 0x673, 0x326d: 0x674, 0x326e: 0x675, 0x326f: 0x676, + 0x3270: 0x677, 0x3271: 0x678, 0x3272: 0x679, 0x3273: 0x67a, 0x3274: 0x67b, 0x3275: 0x67c, 0x3276: 0x67d, 0x3277: 0xca, + 0x3278: 0x67e, 0x3279: 0x67f, 0x327a: 0x680, 0x327b: 0x681, 0x327c: 0x682, 0x327d: 0x683, 0x327e: 0x684, 0x327f: 0x685, + // Block 0xca, offset 0x3280 + 0x3280: 0x686, 0x3281: 0x687, 0x3282: 0x688, 0x3283: 0x689, 0x3284: 0x68a, 0x3285: 0x68b, 0x3286: 0x68c, 0x3287: 0x68d, + 0x3288: 0x68e, 0x3289: 0x68f, 0x328a: 0x690, 0x328b: 0x691, 0x328c: 0x692, 0x328d: 0x693, 0x328e: 0x694, 0x328f: 0x695, + 0x3290: 0x696, 0x3291: 0x697, 0x3292: 0x698, 0x3293: 0x699, 0x3294: 0x69a, 0x3295: 0x69b, 0x3296: 0x69c, 0x3297: 0x69d, + 0x3298: 0x69e, 0x3299: 0x69f, 0x329a: 0x6a0, 0x329b: 0x6a1, 0x329c: 0x6a2, 0x329d: 0x6a3, 0x329e: 0x6a4, 0x329f: 0x6a5, + 0x32a0: 0x6a6, 0x32a1: 0x6a7, 0x32a2: 0x6a8, 0x32a3: 0x6a9, 0x32a4: 0x6aa, 0x32a5: 0x6ab, 0x32a6: 0x6ac, 0x32a7: 0x6ad, + 0x32a8: 0x6ae, 0x32a9: 0x6af, 0x32aa: 0x6b0, 0x32ab: 0x6b1, 0x32ac: 0x6b2, 0x32ad: 0x6b3, 0x32ae: 0x6b4, 0x32af: 0x6b5, + 0x32b0: 0x6b6, 0x32b1: 0x6b7, 0x32b2: 0x6b8, 0x32b3: 0x6b9, 0x32b4: 0x6ba, 0x32b5: 0x6bb, 0x32b6: 0x6bc, 0x32b7: 0x6bd, + 0x32b8: 0x6be, 0x32b9: 0x6bf, 0x32ba: 0x6c0, 0x32bb: 0x6c1, 0x32bc: 0x6c2, 0x32bd: 0x6c3, 0x32be: 0x6c4, 0x32bf: 0x6c5, + // Block 0xcb, offset 0x32c0 + 0x32c0: 0x6c6, 0x32c1: 0x6c7, 0x32c2: 0x6c8, 0x32c3: 0x6c9, 0x32c4: 0x6ca, 0x32c5: 0x6cb, 0x32c6: 0x6cc, 0x32c7: 0x6cd, + 0x32c8: 0x6ce, 0x32c9: 0x6cf, 0x32ca: 0x6d0, 0x32cb: 0x6d1, 0x32cc: 0x6d2, 0x32cd: 0x6d3, 0x32ce: 0x6d4, 0x32cf: 0x6d5, + 0x32d0: 0x6d6, 0x32d1: 0x6d7, 0x32d2: 0x6d8, 0x32d3: 0x6d9, 0x32d4: 0x6da, 0x32d5: 0x6db, 0x32d6: 0x6dc, 0x32d7: 0x6dd, + 0x32d8: 0x6de, 0x32d9: 0x6df, 0x32da: 0x6e0, 0x32db: 0x6e1, 0x32dc: 0x6e2, 0x32dd: 0x6e3, 0x32de: 0x6e4, 0x32df: 0x6e5, + 0x32e0: 0x6e6, 0x32e1: 0x6e7, 0x32e2: 0x6e8, 0x32e3: 0x6e9, 0x32e4: 0x6ea, 0x32e5: 0x6eb, 0x32e6: 0x6ec, 0x32e7: 0x6ed, + 0x32e8: 0x6ee, 0x32e9: 0x6ef, 0x32ea: 0x6f0, 0x32eb: 0x6f1, 0x32ec: 0x6f2, 0x32ed: 0x6f3, 0x32ee: 0x6f4, 0x32ef: 0x6f5, + 0x32f0: 0x6f6, 0x32f1: 0x6f7, 0x32f2: 0x6f8, 0x32f3: 0x6f9, 0x32f4: 0x6fa, 0x32f5: 0x6fb, 0x32f6: 0x6fc, 0x32f7: 0x6fd, + 0x32f8: 0x6fe, 0x32f9: 0x6ff, 0x32fa: 0x700, 0x32fb: 0x701, 0x32fc: 0x702, 0x32fd: 0x703, 0x32fe: 0x704, 0x32ff: 0x705, + // Block 0xcc, offset 0x3300 + 0x3300: 0x706, 0x3301: 0x707, 0x3302: 0x708, 0x3303: 0x709, 0x3304: 0x70a, 0x3305: 0x70b, 0x3306: 0x70c, 0x3307: 0x70d, + 0x3308: 0x70e, 0x3309: 0x70f, 0x330a: 0x710, 0x330b: 0x711, 0x330c: 0x712, 0x330d: 0x713, 0x330e: 0x714, 0x330f: 0x715, + 0x3310: 0x716, 0x3311: 0x717, 0x3312: 0x718, 0x3313: 0x719, 0x3314: 0x71a, 0x3315: 0x71b, 0x3316: 0x71c, 0x3317: 0x71d, + 0x3318: 0x71e, 0x3319: 0x71f, 0x331a: 0x720, 0x331b: 0x721, 0x331c: 0x722, 0x331d: 0x723, 0x331e: 0x724, 0x331f: 0x725, + 0x3320: 0x726, 0x3321: 0x727, 0x3322: 0x728, 0x3323: 0x729, 0x3324: 0x72a, 0x3325: 0x72b, 0x3326: 0x72c, 0x3327: 0x72d, + 0x3328: 0x72e, 0x3329: 0x72f, 0x332a: 0x730, 0x332b: 0x731, 0x332c: 0x732, 0x332d: 0x733, 0x332e: 0x734, 0x332f: 0x735, + 0x3330: 0x736, 0x3331: 0x737, 0x3332: 0x738, 0x3333: 0x739, 0x3334: 0x73a, 0x3335: 0x73b, 0x3336: 0x73c, 0x3337: 0x73d, + 0x3338: 0x73e, 0x3339: 0x73f, 0x333a: 0x740, 0x333b: 0x741, 0x333c: 0x742, 0x333d: 0x743, 0x333e: 0x744, 0x333f: 0x745, + // Block 0xcd, offset 0x3340 + 0x3340: 0x746, 0x3341: 0x747, 0x3342: 0x748, 0x3343: 0x749, 0x3344: 0x74a, 0x3345: 0x74b, 0x3346: 0x74c, 0x3347: 0x74d, + 0x3348: 0x74e, 0x3349: 0x74f, 0x334a: 0x750, 0x334b: 0x751, 0x334c: 0x752, 0x334d: 0x753, 0x334e: 0x754, 0x334f: 0x755, + 0x3350: 0x756, 0x3351: 0x757, 0x3352: 0x758, 0x3353: 0x759, 0x3354: 0x75a, 0x3355: 0x75b, 0x3356: 0x75c, 0x3357: 0x75d, + 0x3358: 0x75e, 0x3359: 0x75f, 0x335a: 0x760, 0x335b: 0x761, 0x335c: 0x762, 0x335d: 0x763, 0x335e: 0x764, 0x335f: 0x765, + 0x3360: 0x766, 0x3361: 0x767, 0x3362: 0x768, 0x3363: 0x769, 0x3364: 0x76a, 0x3365: 0x76b, 0x3366: 0x76c, 0x3367: 0x76d, + 0x3368: 0x76e, 0x3369: 0x76f, 0x336a: 0x770, 0x336b: 0x771, 0x336c: 0x772, 0x336d: 0x773, 0x336e: 0x774, 0x336f: 0x775, + 0x3370: 0x776, 0x3371: 0x777, 0x3372: 0x778, 0x3373: 0x779, 0x3374: 0x77a, 0x3375: 0x77b, 0x3376: 0x77c, 0x3377: 0x77d, + 0x3378: 0x77e, 0x3379: 0x77f, 0x337a: 0x780, 0x337b: 0x781, 0x337c: 0x782, 0x337d: 0x783, 0x337e: 0x784, 0x337f: 0x785, + // Block 0xce, offset 0x3380 + 0x3380: 0x786, 0x3381: 0x787, 0x3382: 0x788, 0x3383: 0x789, 0x3384: 0x78a, 0x3385: 0x78b, 0x3386: 0x78c, 0x3387: 0x78d, + 0x3388: 0x78e, 0x3389: 0x78f, 0x338a: 0x790, 0x338b: 0x791, 0x338c: 0x792, 0x338d: 0x793, 0x338e: 0x794, 0x338f: 0x795, + 0x3390: 0x796, 0x3391: 0x797, 0x3392: 0x798, 0x3393: 0x799, 0x3394: 0x79a, 0x3395: 0x79b, 0x3396: 0x79c, 0x3397: 0x79d, + 0x3398: 0x79e, 0x3399: 0x79f, 0x339a: 0x7a0, 0x339b: 0x7a1, 0x339c: 0x7a2, 0x339d: 0x7a3, 0x339e: 0x7a4, 0x339f: 0x7a5, + 0x33a0: 0x7a6, 0x33a1: 0x7a7, 0x33a2: 0x7a8, 0x33a3: 0x7a9, 0x33a4: 0x7aa, 0x33a5: 0x7ab, 0x33a6: 0x7ac, 0x33a7: 0x7ad, + 0x33a8: 0x7ae, 0x33a9: 0x7af, 0x33aa: 0x7b0, 0x33ab: 0x7b1, 0x33ac: 0x7b2, 0x33ad: 0x7b3, 0x33ae: 0x7b4, 0x33af: 0x7b5, + 0x33b0: 0x7b6, 0x33b1: 0x7b7, 0x33b2: 0x7b8, 0x33b3: 0x7b9, 0x33b4: 0x7ba, 0x33b5: 0x7bb, 0x33b6: 0x7bc, 0x33b7: 0x7bd, + 0x33b8: 0x7be, 0x33b9: 0x7bf, 0x33ba: 0x7c0, 0x33bb: 0x7c1, 0x33bc: 0x7c2, 0x33bd: 0x7c3, 0x33be: 0x7c4, 0x33bf: 0x7c5, + // Block 0xcf, offset 0x33c0 + 0x33e4: 0x7c6, 0x33e5: 0x7c7, 0x33e6: 0x7c8, 0x33e7: 0x7c9, + 0x33e8: 0x7ca, 0x33e9: 0x7cb, 0x33ea: 0x7cc, 0x33eb: 0x7cd, 0x33ec: 0x103, 0x33ed: 0x104, 0x33ee: 0x105, 0x33ef: 0x106, + 0x33f0: 0x107, 0x33f1: 0x108, 0x33f2: 0x109, 0x33f3: 0x10a, 0x33f4: 0x10b, 0x33f5: 0x10c, 0x33f6: 0x10d, 0x33f7: 0x10e, + 0x33f8: 0x10f, 0x33f9: 0x110, 0x33fa: 0x111, 0x33fb: 0x112, 0x33fc: 0x113, 0x33fd: 0x114, 0x33fe: 0x115, 0x33ff: 0x116, + // Block 0xd0, offset 0x3400 + 0x3400: 0x18b, 0x3401: 0x18c, 0x3402: 0x18d, 0x3403: 0x18e, 0x3404: 0x18f, 0x3405: 0x190, 0x3406: 0x191, 0x3407: 0x192, + 0x3408: 0x7ce, 0x3409: 0x7cf, 0x340c: 0x195, 0x340d: 0x196, 0x340e: 0x197, 0x340f: 0x198, + 0x3410: 0x199, 0x3411: 0x19a, 0x3412: 0x19b, 0x3413: 0x19c, 0x3414: 0x19d, 0x3415: 0x19e, 0x3417: 0x19f, + 0x3418: 0x1a0, 0x3419: 0x1a1, 0x341a: 0x1a2, 0x341b: 0x1a3, 0x341c: 0x1a4, 0x341d: 0x1a5, + // Block 0xd1, offset 0x3440 + 0x3440: 0x7d0, 0x3441: 0x7d1, 0x3442: 0x7d2, 0x3443: 0x7d3, 0x3444: 0x7d4, 0x3445: 0x7d5, 0x3446: 0x7d6, 0x3447: 0x7d7, + 0x3448: 0x7d8, 0x3449: 0x7d9, 0x344a: 0x7da, 0x344b: 0x7db, 0x344c: 0x7dc, 0x344d: 0x7dd, 0x344e: 0x7de, 0x344f: 0x7df, + 0x3450: 0x7e0, 0x3451: 0x7e1, 0x3452: 0x7e2, 0x3453: 0x7e3, 0x3454: 0x7e4, 0x3455: 0x7e5, 0x3456: 0x7e6, 0x3457: 0x7e7, + 0x3458: 0x7e8, 0x3459: 0x7e9, 0x345a: 0x7ea, 0x345b: 0x7eb, 0x345c: 0x7ec, 0x345d: 0x7ed, 0x345e: 0x7ee, 0x345f: 0x7ef, + 0x3460: 0x7f0, 0x3461: 0x7f1, 0x3462: 0x7f2, 0x3463: 0x7f3, 0x3464: 0x7f4, 0x3465: 0x7f5, 0x3466: 0x7f6, 0x3467: 0x7f7, + 0x3468: 0x7f8, 0x3469: 0x7f9, 0x346a: 0x7fa, 0x346b: 0x7fb, 0x346c: 0x7fc, 0x346d: 0x7fd, 0x346e: 0x7fe, 0x346f: 0x7ff, + 0x3470: 0x800, 0x3471: 0x801, 0x3472: 0x802, 0x3473: 0x803, 0x3474: 0x804, 0x3475: 0x805, 0x3476: 0x806, 0x3477: 0x807, + 0x3478: 0x808, 0x3479: 0x809, 0x347a: 0x80a, 0x347b: 0x80b, 0x347c: 0x80c, 0x347d: 0x80d, 0x347e: 0x80e, 0x347f: 0x80f, + // Block 0xd2, offset 0x3480 + 0x3480: 0x810, 0x3481: 0x811, 0x3482: 0x812, 0x3483: 0x813, 0x3484: 0x814, 0x3485: 0x815, 0x3486: 0x816, 0x3487: 0x817, + 0x3488: 0x818, 0x3489: 0x819, 0x348a: 0x81a, 0x348b: 0x81b, 0x348c: 0x81c, 0x348d: 0x81d, 0x348e: 0x81e, 0x348f: 0x81f, + 0x3490: 0x820, 0x3491: 0x821, 0x3492: 0x822, 0x3493: 0x823, 0x3494: 0x824, 0x3495: 0x825, 0x3496: 0x826, 0x3497: 0x827, + 0x3498: 0x828, 0x3499: 0x829, 0x349a: 0x82a, 0x349b: 0x82b, 0x349c: 0x82c, 0x349d: 0x82d, 0x349e: 0x82e, 0x349f: 0x82f, + 0x34a0: 0x830, 0x34a1: 0x831, 0x34a2: 0x832, 0x34a3: 0x833, 0x34a4: 0x834, 0x34a5: 0x835, 0x34a6: 0x836, 0x34a7: 0x837, + 0x34a8: 0x838, 0x34a9: 0x839, 0x34aa: 0x83a, 0x34ab: 0x83b, 0x34ac: 0x83c, 0x34ad: 0x83d, 0x34ae: 0x83e, 0x34af: 0x83f, + 0x34b0: 0x840, 0x34b1: 0x841, 0x34b2: 0x842, 0x34b3: 0x843, 0x34b4: 0x844, 0x34b5: 0x845, 0x34b6: 0x846, 0x34b7: 0x847, + 0x34b8: 0x848, 0x34b9: 0x849, 0x34ba: 0x84a, 0x34bb: 0x84b, 0x34bc: 0x84c, 0x34bd: 0x84d, 0x34be: 0x84e, 0x34bf: 0x84f, + // Block 0xd3, offset 0x34c0 + 0x34c0: 0x850, 0x34c1: 0x851, 0x34c2: 0x852, 0x34c3: 0x853, 0x34c4: 0x854, 0x34c5: 0x855, 0x34c6: 0x856, 0x34c7: 0x857, + 0x34c8: 0x858, 0x34c9: 0x859, 0x34ca: 0x85a, 0x34cb: 0x85b, 0x34cc: 0x85c, 0x34cd: 0x85d, 0x34ce: 0x85e, 0x34cf: 0x85f, + 0x34d0: 0x860, 0x34d1: 0x861, 0x34d2: 0x862, 0x34d3: 0x863, 0x34d4: 0x864, 0x34d5: 0x865, 0x34d6: 0x866, 0x34d7: 0x867, + 0x34d8: 0x868, 0x34d9: 0x869, 0x34da: 0x86a, 0x34db: 0x86b, 0x34dc: 0x86c, 0x34dd: 0x86d, 0x34de: 0x86e, 0x34df: 0x86f, + 0x34e0: 0x870, 0x34e1: 0x871, 0x34e2: 0x872, 0x34e3: 0x873, 0x34e4: 0x874, 0x34e5: 0x875, 0x34e6: 0x876, 0x34e7: 0x877, + 0x34e8: 0x878, 0x34e9: 0x879, 0x34ea: 0x87a, 0x34eb: 0x87b, 0x34ec: 0x87c, 0x34ed: 0x87d, 0x34ee: 0x87e, 0x34ef: 0x87f, + 0x34f0: 0x880, 0x34f1: 0x881, 0x34f2: 0x882, 0x34f3: 0x883, 0x34f4: 0x884, 0x34f5: 0x885, 0x34f6: 0x886, 0x34f7: 0x887, + 0x34f8: 0x888, 0x34f9: 0x889, 0x34fa: 0x88a, 0x34fb: 0x88b, 0x34fc: 0x88c, 0x34fd: 0x88d, 0x34fe: 0x88e, 0x34ff: 0x88f, + // Block 0xd4, offset 0x3500 + 0x3500: 0x890, 0x3501: 0x891, 0x3502: 0x892, 0x3503: 0x893, 0x3504: 0x894, 0x3505: 0x895, 0x3506: 0x896, 0x3507: 0x897, + 0x3508: 0x898, 0x3509: 0x899, 0x350a: 0x89a, 0x350b: 0x89b, 0x350c: 0x89c, 0x350d: 0x89d, 0x350e: 0x89e, 0x350f: 0x89f, + 0x3510: 0x8a0, 0x3511: 0x8a1, 0x3512: 0x8a2, 0x3513: 0x8a3, 0x3514: 0x8a4, 0x3515: 0x8a5, 0x3516: 0x8a6, 0x3517: 0x8a7, + 0x3518: 0x8a8, 0x3519: 0x8a9, 0x351a: 0x8aa, 0x351b: 0x8ab, 0x351c: 0x8ac, 0x351d: 0x8ad, 0x351e: 0x8ae, 0x351f: 0x8af, + 0x3520: 0x8b0, 0x3521: 0x8b1, 0x3522: 0x8b2, 0x3523: 0x8b3, 0x3524: 0x8b4, 0x3525: 0x8b5, 0x3526: 0x8b6, 0x3527: 0x8b7, + 0x3528: 0x8b8, 0x3529: 0x8b9, 0x352a: 0x8ba, 0x352b: 0x8bb, 0x352c: 0x8bc, 0x352d: 0x8bd, 0x352e: 0x8be, 0x352f: 0x8bf, + 0x3530: 0x8c0, 0x3531: 0x8c1, 0x3532: 0x8c2, 0x3533: 0x8c3, 0x3534: 0x8c4, 0x3535: 0x8c5, 0x3536: 0x8c6, 0x3537: 0x8c7, + 0x3538: 0x8c8, 0x3539: 0x8c9, 0x353a: 0x8ca, 0x353b: 0x8cb, 0x353c: 0x8cc, 0x353d: 0x8cd, 0x353e: 0x8ce, 0x353f: 0x8cf, + // Block 0xd5, offset 0x3540 + 0x3540: 0x8d0, 0x3541: 0x8d1, 0x3542: 0x8d2, 0x3543: 0x8d3, 0x3544: 0x8d4, 0x3545: 0x8d5, 0x3546: 0x8d6, 0x3547: 0x8d7, + 0x3548: 0x8d8, 0x3549: 0x8d9, 0x354a: 0x8da, 0x354b: 0x8db, 0x354c: 0x8dc, 0x354d: 0x8dd, 0x354e: 0x8de, 0x354f: 0x8df, + 0x3550: 0x8e0, 0x3551: 0x8e1, 0x3552: 0x8e2, 0x3553: 0x8e3, 0x3554: 0x8e4, 0x3555: 0x8e5, 0x3556: 0x8e6, 0x3557: 0x8e7, + 0x3558: 0x8e8, 0x3559: 0x8e9, 0x355a: 0x8ea, 0x355b: 0x8eb, 0x355c: 0x8ec, 0x355d: 0x8ed, 0x355e: 0x8ee, 0x355f: 0x8ef, + 0x3560: 0x8f0, 0x3561: 0x8f1, 0x3562: 0x8f2, 0x3563: 0x8f3, 0x3564: 0x8f4, 0x3565: 0x8f5, 0x3566: 0x8f6, 0x3567: 0x8f7, + 0x3568: 0x8f8, 0x3569: 0x8f9, 0x356a: 0x8fa, 0x356b: 0x8fb, 0x356c: 0x8fc, 0x356d: 0x8fd, 0x356e: 0x8fe, 0x356f: 0x8ff, + 0x3570: 0x900, 0x3571: 0x901, 0x3572: 0x902, 0x3573: 0x903, 0x3574: 0x904, 0x3575: 0x905, 0x3576: 0x906, 0x3577: 0x907, + 0x3578: 0x908, 0x3579: 0x909, 0x357a: 0x90a, 0x357b: 0x90b, 0x357c: 0x90c, 0x357d: 0x90d, 0x357e: 0x90e, 0x357f: 0x90f, + // Block 0xd6, offset 0x3580 + 0x3580: 0x910, 0x3581: 0x911, 0x3582: 0x912, 0x3583: 0x913, 0x3584: 0x914, 0x3585: 0x915, 0x3586: 0x916, 0x3587: 0x917, + 0x3588: 0x918, 0x3589: 0x919, 0x358a: 0x91a, 0x358b: 0x91b, 0x358c: 0x91c, 0x358d: 0x91d, 0x358e: 0x91e, 0x358f: 0x91f, + 0x3590: 0x920, 0x3591: 0x921, 0x3592: 0x922, 0x3593: 0x923, 0x3594: 0x924, 0x3595: 0x925, 0x3596: 0x926, 0x3597: 0x927, + 0x3598: 0x928, 0x3599: 0x929, 0x359a: 0x92a, 0x359b: 0x92b, 0x359c: 0x92c, 0x359d: 0x92d, 0x359e: 0x92e, 0x359f: 0x92f, + 0x35a0: 0x930, 0x35a1: 0x931, 0x35a2: 0x932, 0x35a3: 0x933, 0x35a4: 0x934, 0x35a5: 0x935, 0x35a6: 0x936, 0x35a7: 0x937, + 0x35a8: 0x938, 0x35a9: 0x939, 0x35aa: 0x93a, 0x35ab: 0x93b, 0x35ac: 0x93c, 0x35ad: 0x93d, 0x35ae: 0x93e, 0x35af: 0x93f, + 0x35b0: 0x940, 0x35b1: 0x941, 0x35b2: 0x942, 0x35b3: 0x943, 0x35b4: 0x944, 0x35b5: 0x945, 0x35b6: 0x946, 0x35b7: 0x947, + 0x35b8: 0x948, 0x35b9: 0x949, 0x35ba: 0x94a, 0x35bb: 0x94b, 0x35bc: 0x94c, 0x35bd: 0x94d, 0x35be: 0x94e, 0x35bf: 0x94f, + // Block 0xd7, offset 0x35c0 + 0x35c0: 0x950, 0x35c1: 0x951, 0x35c2: 0x952, 0x35c3: 0x953, 0x35c4: 0x954, 0x35c5: 0x955, 0x35c6: 0x956, 0x35c7: 0x957, + 0x35c8: 0x958, 0x35c9: 0x959, 0x35ca: 0x95a, 0x35cb: 0x95b, 0x35cc: 0x95c, 0x35cd: 0x95d, 0x35ce: 0x95e, 0x35cf: 0x95f, + 0x35d0: 0x960, 0x35d1: 0x961, 0x35d2: 0x962, 0x35d3: 0x963, 0x35d4: 0x964, 0x35d5: 0x965, 0x35d6: 0x966, 0x35d7: 0x967, + 0x35d8: 0x968, 0x35d9: 0x969, 0x35da: 0x96a, 0x35db: 0x96b, 0x35dc: 0x96c, 0x35dd: 0x96d, 0x35de: 0x96e, 0x35df: 0x96f, + 0x35e0: 0x970, 0x35e1: 0x971, 0x35e2: 0x972, 0x35e3: 0x973, 0x35e4: 0x974, 0x35e5: 0x975, 0x35e6: 0x976, 0x35e7: 0x977, + 0x35e8: 0x978, 0x35e9: 0x979, 0x35ea: 0x97a, 0x35eb: 0x97b, 0x35ec: 0x97c, 0x35ed: 0x97d, 0x35ee: 0x97e, 0x35ef: 0x97f, + 0x35f0: 0x980, 0x35f1: 0x981, 0x35f2: 0x982, 0x35f3: 0x983, 0x35f4: 0x984, 0x35f5: 0x985, 0x35f6: 0x986, 0x35f7: 0x987, + 0x35f8: 0x988, 0x35f9: 0x989, 0x35fa: 0x98a, 0x35fb: 0x98b, 0x35fc: 0x98c, 0x35fd: 0x98d, 0x35fe: 0x98e, 0x35ff: 0x98f, + // Block 0xd8, offset 0x3600 + 0x3600: 0x990, 0x3601: 0x991, 0x3602: 0x992, 0x3603: 0x993, 0x3604: 0x994, 0x3605: 0x995, 0x3606: 0x996, 0x3607: 0x997, + 0x3608: 0x998, 0x3609: 0x999, 0x360a: 0x99a, 0x360b: 0x99b, 0x360c: 0x99c, 0x360d: 0x99d, 0x360e: 0x99e, 0x360f: 0x99f, + 0x3610: 0x9a0, 0x3611: 0x9a1, 0x3612: 0x9a2, 0x3613: 0x9a3, 0x3614: 0x9a4, 0x3615: 0x9a5, 0x3616: 0x9a6, 0x3617: 0x9a7, + 0x3618: 0x9a8, 0x3619: 0x9a9, 0x361a: 0x9aa, 0x361b: 0x9ab, 0x361c: 0x9ac, 0x361d: 0x9ad, 0x361e: 0x9ae, 0x361f: 0x9af, + 0x3620: 0x9b0, 0x3621: 0x9b1, 0x3622: 0x9b2, 0x3623: 0x9b3, 0x3624: 0x9b4, 0x3625: 0x9b5, 0x3626: 0x9b6, 0x3627: 0x9b7, + 0x3628: 0x9b8, 0x3629: 0x9b9, 0x362a: 0x9ba, 0x362b: 0x9bb, 0x362c: 0x9bc, 0x362d: 0x9bd, 0x362e: 0x9be, 0x362f: 0x9bf, + 0x3630: 0x9c0, 0x3631: 0x9c1, 0x3632: 0x9c2, 0x3633: 0x9c3, 0x3634: 0x9c4, 0x3635: 0x9c5, 0x3636: 0x9c6, 0x3637: 0x9c7, + 0x3638: 0x9c8, 0x3639: 0x9c9, 0x363a: 0x9ca, 0x363b: 0x9cb, 0x363c: 0x9cc, 0x363d: 0x9cd, 0x363e: 0x9ce, 0x363f: 0x9cf, + // Block 0xd9, offset 0x3640 + 0x3640: 0x9d0, 0x3641: 0x9d1, 0x3642: 0x9d2, 0x3643: 0x9d3, 0x3644: 0x9d4, 0x3645: 0x9d5, 0x3646: 0x9d6, 0x3647: 0x9d7, + 0x3648: 0x9d8, 0x3649: 0x9d9, 0x364a: 0x9da, 0x364b: 0x9db, 0x364c: 0x9dc, 0x364d: 0x9dd, 0x364e: 0x9de, 0x364f: 0x9df, + 0x3650: 0x9e0, 0x3651: 0x9e1, 0x3652: 0x9e2, 0x3653: 0x9e3, 0x3654: 0x9e4, 0x3655: 0x9e5, 0x3656: 0x9e6, 0x3657: 0x9e7, + 0x3658: 0x9e8, 0x3659: 0x9e9, 0x365a: 0x9ea, 0x365b: 0x9eb, 0x365c: 0x9ec, 0x365d: 0x9ed, 0x365e: 0x9ee, 0x365f: 0x9ef, + 0x3660: 0x9f0, 0x3661: 0x9f1, 0x3662: 0x9f2, 0x3663: 0x9f3, 0x3664: 0x9f4, 0x3665: 0x9f5, 0x3666: 0x9f6, 0x3667: 0x9f7, + 0x3668: 0x9f8, 0x3669: 0x9f9, 0x366a: 0x9fa, 0x366b: 0x9fb, 0x366c: 0x9fc, 0x366d: 0x9fd, 0x366e: 0x9fe, 0x366f: 0x9ff, + 0x3670: 0xa00, 0x3671: 0xa01, 0x3672: 0xa02, 0x3673: 0xa03, 0x3674: 0xa04, 0x3675: 0xa05, 0x3676: 0xa06, 0x3677: 0xa07, + 0x3678: 0xa08, 0x3679: 0xa09, 0x367a: 0xa0a, 0x367b: 0xa0b, 0x367c: 0xa0c, 0x367d: 0xa0d, 0x367e: 0xa0e, 0x367f: 0xa0f, + // Block 0xda, offset 0x3680 + 0x3680: 0xa10, 0x3681: 0xa11, 0x3682: 0xa12, 0x3683: 0xa13, 0x3684: 0xa14, 0x3685: 0xa15, 0x3686: 0xa16, 0x3687: 0xa17, + 0x3688: 0xa18, 0x3689: 0xa19, 0x368a: 0xa1a, 0x368b: 0xa1b, 0x368c: 0xa1c, 0x368d: 0xa1d, 0x368e: 0xa1e, 0x368f: 0xa1f, + 0x3690: 0xa20, 0x3691: 0xa21, 0x3692: 0xa22, 0x3693: 0xa23, 0x3694: 0xa24, 0x3695: 0xa25, 0x3696: 0xa26, 0x3697: 0xa27, + 0x3698: 0xa28, 0x3699: 0xa29, 0x369a: 0xa2a, 0x369b: 0xa2b, 0x369c: 0xa2c, 0x369d: 0xa2d, 0x369e: 0xa2e, 0x369f: 0xa2f, + 0x36a0: 0xa30, 0x36a1: 0xa31, 0x36a2: 0xa32, 0x36a3: 0xa33, 0x36a4: 0xa34, 0x36a5: 0xa35, 0x36a6: 0xa36, 0x36a7: 0xa37, + 0x36a8: 0xa38, 0x36a9: 0xa39, 0x36aa: 0xa3a, 0x36ab: 0xa3b, 0x36ac: 0xa3c, 0x36ad: 0xa3d, 0x36ae: 0xa3e, 0x36af: 0xa3f, + 0x36b0: 0xa40, 0x36b1: 0xa41, 0x36b2: 0xa42, 0x36b3: 0xa43, 0x36b4: 0xa44, 0x36b5: 0xa45, 0x36b6: 0xa46, 0x36b7: 0xa47, + 0x36b8: 0xa48, 0x36b9: 0xa49, 0x36ba: 0xa4a, 0x36bb: 0xa4b, 0x36bc: 0xa4c, 0x36bd: 0xa4d, 0x36be: 0xa4e, 0x36bf: 0xa4f, + // Block 0xdb, offset 0x36c0 + 0x36c0: 0xa50, 0x36c1: 0xa51, 0x36c2: 0xa52, 0x36c3: 0xa53, 0x36c4: 0xa54, 0x36c5: 0xa55, 0x36c6: 0xa56, 0x36c7: 0xa57, + 0x36c8: 0xa58, 0x36c9: 0xa59, 0x36ca: 0xa5a, 0x36cb: 0xa5b, 0x36cc: 0xa5c, 0x36cd: 0xa5d, 0x36ce: 0xa5e, 0x36cf: 0xa5f, + 0x36d0: 0xa60, 0x36d1: 0xa61, 0x36d2: 0xa62, 0x36d3: 0xa63, 0x36d4: 0xa64, 0x36d5: 0xa65, 0x36d6: 0xa66, 0x36d7: 0xa67, + 0x36d8: 0xa68, 0x36d9: 0xa69, 0x36da: 0xa6a, 0x36db: 0xa6b, 0x36de: 0xa6c, + 0x36e1: 0xa6d, 0x36e2: 0xa6e, + 0x36e8: 0xa6f, 0x36ea: 0xa70, + 0x36fa: 0xa71, 0x36fb: 0xa72, 0x36fe: 0xa73, + // Block 0xdc, offset 0x3700 + 0x3701: 0xa74, 0x3702: 0xa75, 0x3703: 0xa76, 0x3704: 0xa77, + 0x3708: 0xa78, 0x370b: 0xa79, 0x370c: 0xa7a, 0x370d: 0xa7b, 0x370f: 0xa7c, + 0x3710: 0xa7d, 0x3712: 0xa7e, 0x3713: 0xa7f, 0x3714: 0xa80, 0x3717: 0xa81, + 0x3718: 0xa82, 0x371a: 0xa83, 0x371b: 0xa84, + // Block 0xdd, offset 0x3740 + 0x3760: 0xa85, 0x3761: 0xa86, 0x3762: 0xa87, 0x3763: 0xa88, 0x3764: 0xa89, 0x3765: 0xa8a, 0x3766: 0xa8b, 0x3767: 0xa8c, + 0x3768: 0xa8d, + // Block 0xde, offset 0x3780 + 0x3790: 0x09, 0x3791: 0x0a, 0x3792: 0x0b, 0x3793: 0x0c, 0x3796: 0x0d, + 0x379b: 0x0e, 0x379d: 0x0f, 0x379e: 0x10, 0x379f: 0xce, + 0x37a0: 0xcf, 0x37a1: 0xd0, 0x37a2: 0xd1, 0x37a3: 0xd2, 0x37a4: 0xd3, 0x37a5: 0xd4, 0x37a6: 0xd5, 0x37a7: 0xd6, + 0x37a8: 0xd7, 0x37a9: 0xd8, 0x37aa: 0xd9, 0x37ab: 0xda, 0x37af: 0xdb, + // Block 0xdf, offset 0x37c0 + 0x37c2: 0x01, 0x37c3: 0x600, 0x37c4: 0x601, 0x37c5: 0x602, 0x37c6: 0x05, 0x37c7: 0x603, + 0x37c8: 0x604, 0x37c9: 0x08, 0x37ca: 0x09, 0x37cb: 0x0a, 0x37cc: 0x0b, 0x37cd: 0x0c, 0x37ce: 0x0d, 0x37cf: 0x0e, + 0x37d0: 0x0f, 0x37d1: 0x10, 0x37d2: 0x11, 0x37d3: 0x12, 0x37d4: 0x13, 0x37d5: 0x14, 0x37d6: 0x15, 0x37d7: 0x16, + 0x37d8: 0x17, 0x37d9: 0x18, 0x37da: 0x19, 0x37db: 0x1a, 0x37dc: 0x1b, 0x37dd: 0x1c, 0x37de: 0x1d, 0x37df: 0x1e, + 0x37e0: 0x01, 0x37e1: 0xc4, 0x37e2: 0xc5, 0x37e3: 0xc6, 0x37e4: 0xc7, 0x37e5: 0xc8, 0x37e6: 0xc9, 0x37e7: 0xca, + 0x37e8: 0xcb, 0x37e9: 0xcc, 0x37ea: 0x06, 0x37ed: 0x07, 0x37ef: 0xcd, + 0x37f0: 0xdc, 0x37f3: 0x15, + // Block 0xe0, offset 0x3800 + 0x3800: 0x7d, 0x3801: 0x7e, 0x3802: 0x7f, 0x3803: 0x80, 0x3804: 0x81, 0x3805: 0x82, 0x3806: 0x83, 0x3807: 0x84, + 0x3808: 0x85, 0x3809: 0x86, 0x380a: 0x87, 0x380b: 0x88, 0x380c: 0x89, 0x380d: 0x8a, 0x380e: 0x8b, 0x380f: 0x8c, + 0x3810: 0x8d, 0x3811: 0x8e, 0x3812: 0x8f, 0x3813: 0x90, 0x3814: 0x91, 0x3815: 0x92, 0x3816: 0x93, 0x3817: 0x94, + 0x3818: 0x95, 0x3819: 0x96, 0x381a: 0x97, 0x381b: 0x98, 0x381c: 0x99, 0x381d: 0x9a, 0x381e: 0x9b, 0x381f: 0x9c, + 0x3820: 0x9d, 0x3821: 0x9e, 0x3822: 0x9f, 0x3823: 0xa0, 0x3824: 0xa1, 0x3825: 0xa2, 0x3826: 0xa3, 0x3827: 0xa4, + 0x3828: 0xa5, 0x3829: 0xa6, 0x382a: 0xa7, 0x382b: 0xa8, 0x382c: 0xa9, 0x382d: 0xaa, + 0x3830: 0xab, 0x3831: 0xac, 0x3832: 0xad, 0x3833: 0xae, 0x3834: 0xaf, 0x3835: 0xb0, 0x3836: 0xb1, 0x3837: 0xb2, + 0x3838: 0xb3, 0x383a: 0xa8e, 0x383b: 0xa8f, 0x383c: 0xa90, 0x383d: 0xa91, 0x383e: 0xa92, 0x383f: 0xa93, + // Block 0xe1, offset 0x3840 + 0x3840: 0xa94, 0x3841: 0xbb, 0x3842: 0xbc, 0x3843: 0xbd, 0x3844: 0xbe, 0x3845: 0xbf, 0x3846: 0xa95, 0x3847: 0xc1, + 0x3848: 0xa96, 0x3849: 0xa97, 0x384a: 0xa98, 0x384b: 0xa99, 0x384c: 0xc6, 0x384d: 0xa9a, 0x384e: 0xc8, 0x384f: 0xa9b, + 0x3850: 0xa9c, 0x3851: 0xa9d, 0x3852: 0xa9e, 0x3853: 0xa9f, 0x3854: 0xaa0, 0x3855: 0xaa1, 0x3856: 0xaa2, 0x3857: 0xaa3, + 0x3858: 0xaa4, 0x3859: 0xaa5, 0x385a: 0xaa6, 0x385b: 0xaa7, 0x385c: 0xaa8, 0x385d: 0xaa9, 0x385e: 0xaaa, 0x385f: 0xaab, + 0x3860: 0xaac, 0x3861: 0xaad, 0x3862: 0xaae, 0x3863: 0xaaf, 0x3864: 0xab0, 0x3865: 0xab1, 0x3866: 0xab2, 0x3867: 0xab3, + 0x3868: 0xab4, 0x3869: 0xab5, 0x386a: 0xab6, 0x386b: 0xab7, 0x386c: 0xab8, 0x386d: 0xab9, 0x386e: 0xaba, 0x386f: 0xabb, + 0x3870: 0xabc, 0x3871: 0xabd, 0x3872: 0xabe, 0x3873: 0xabf, 0x3874: 0xac0, 0x3875: 0xac1, 0x3876: 0xac2, 0x3877: 0xac3, + 0x3878: 0xac4, 0x3879: 0xac5, 0x387a: 0xac6, 0x387b: 0xac7, 0x387c: 0xac8, 0x387d: 0xac9, 0x387e: 0xaca, 0x387f: 0xacb, + // Block 0xe2, offset 0x3880 + 0x3880: 0xacc, 0x3881: 0xacd, 0x3882: 0xace, 0x3883: 0xacf, 0x3884: 0xad0, 0x3885: 0xad1, 0x3886: 0xad2, 0x3887: 0xad3, + 0x3888: 0xad4, 0x3889: 0xad5, 0x388a: 0xad6, 0x388b: 0xad7, 0x388c: 0xad8, 0x388d: 0xad9, 0x388e: 0xada, 0x388f: 0xadb, + 0x3890: 0xadc, 0x3891: 0xadd, 0x3892: 0xade, 0x3893: 0xadf, 0x3894: 0xae0, 0x3895: 0xae1, 0x3896: 0xae2, 0x3897: 0xae3, + 0x3898: 0xae4, 0x3899: 0xae5, 0x389a: 0xae6, 0x389b: 0xae7, 0x389c: 0xae8, 0x389d: 0xae9, 0x389e: 0xaea, 0x389f: 0xaeb, + 0x38a0: 0xaec, 0x38a1: 0xaed, 0x38a2: 0xaee, 0x38a3: 0xaef, 0x38a4: 0xaf0, 0x38a5: 0xaf1, 0x38a6: 0xaf2, 0x38a7: 0xaf3, + 0x38a8: 0xaf4, 0x38a9: 0xaf5, 0x38aa: 0xaf6, 0x38ab: 0xaf7, 0x38ac: 0xaf8, 0x38ad: 0xaf9, 0x38ae: 0xafa, 0x38af: 0xafb, + 0x38b0: 0xafc, 0x38b1: 0xafd, 0x38b2: 0xafe, 0x38b3: 0xaff, 0x38b4: 0xb00, 0x38b5: 0xb01, 0x38b6: 0xb02, 0x38b7: 0xca, + 0x38b8: 0xb03, 0x38b9: 0xb04, 0x38ba: 0xb05, 0x38bb: 0xb06, 0x38bc: 0xb07, 0x38bd: 0xb08, 0x38be: 0xb09, 0x38bf: 0xb0a, + // Block 0xe3, offset 0x38c0 + 0x38c0: 0xb0b, 0x38c1: 0xb0c, 0x38c2: 0xb0d, 0x38c3: 0xb0e, 0x38c4: 0xb0f, 0x38c5: 0xb10, 0x38c6: 0xb11, 0x38c7: 0xb12, + 0x38c8: 0xb13, 0x38c9: 0xb14, 0x38ca: 0xb15, 0x38cb: 0xb16, 0x38cc: 0xb17, 0x38cd: 0xb18, 0x38ce: 0xb19, 0x38cf: 0xb1a, + 0x38d0: 0xb1b, 0x38d1: 0xb1c, 0x38d2: 0xb1d, 0x38d3: 0xb1e, 0x38d4: 0xb1f, 0x38d5: 0xb20, 0x38d6: 0xb21, 0x38d7: 0xb22, + 0x38d8: 0xb23, 0x38d9: 0xb24, 0x38da: 0xb25, 0x38db: 0xb26, 0x38dc: 0xb27, 0x38dd: 0xb28, 0x38de: 0xb29, 0x38df: 0xb2a, + 0x38e0: 0xb2b, 0x38e1: 0xb2c, 0x38e2: 0xb2d, 0x38e3: 0xb2e, 0x38e4: 0xb2f, 0x38e5: 0xb30, 0x38e6: 0xb31, 0x38e7: 0xb32, + 0x38e8: 0xb33, 0x38e9: 0xb34, 0x38ea: 0xb35, 0x38eb: 0xb36, 0x38ec: 0xb37, 0x38ed: 0xb38, 0x38ee: 0xb39, 0x38ef: 0xb3a, + 0x38f0: 0xb3b, 0x38f1: 0xb3c, 0x38f2: 0xb3d, 0x38f3: 0xb3e, 0x38f4: 0xb3f, 0x38f5: 0xb40, 0x38f6: 0xb41, 0x38f7: 0xb42, + 0x38f8: 0xb43, 0x38f9: 0xb44, 0x38fa: 0xb45, 0x38fb: 0xb46, 0x38fc: 0xb47, 0x38fd: 0xb48, 0x38fe: 0xb49, 0x38ff: 0xb4a, + // Block 0xe4, offset 0x3900 + 0x3900: 0xb4b, 0x3901: 0xb4c, 0x3902: 0xb4d, 0x3903: 0xb4e, 0x3904: 0xb4f, 0x3905: 0xb50, 0x3906: 0xb51, 0x3907: 0xb52, + 0x3908: 0xb53, 0x3909: 0xb54, 0x390a: 0xb55, 0x390b: 0xb56, 0x390c: 0xb57, 0x390d: 0xb58, 0x390e: 0xb59, 0x390f: 0xb5a, + 0x3910: 0xb5b, 0x3911: 0xb5c, 0x3912: 0xb5d, 0x3913: 0xb5e, 0x3914: 0xb5f, 0x3915: 0xb60, 0x3916: 0xb61, 0x3917: 0xb62, + 0x3918: 0xb63, 0x3919: 0xb64, 0x391a: 0xb65, 0x391b: 0xb66, 0x391c: 0xb67, 0x391d: 0xb68, 0x391e: 0xb69, 0x391f: 0xb6a, + 0x3920: 0xb6b, 0x3921: 0xb6c, 0x3922: 0xb6d, 0x3923: 0xb6e, 0x3924: 0xb6f, 0x3925: 0xb70, 0x3926: 0xb71, 0x3927: 0xb72, + 0x3928: 0xb73, 0x3929: 0xb74, 0x392a: 0xb75, 0x392b: 0xb76, 0x392c: 0xb77, 0x392d: 0xb78, 0x392e: 0xb79, 0x392f: 0xb7a, + 0x3930: 0xb7b, 0x3931: 0xb7c, 0x3932: 0xb7d, 0x3933: 0xb7e, 0x3934: 0xb7f, 0x3935: 0xb80, 0x3936: 0xb81, 0x3937: 0xb82, + 0x3938: 0xb83, 0x3939: 0xb84, 0x393a: 0xb85, 0x393b: 0xb86, 0x393c: 0xb87, 0x393d: 0xb88, 0x393e: 0xb89, 0x393f: 0xb8a, + // Block 0xe5, offset 0x3940 + 0x3940: 0xb8b, 0x3941: 0xb8c, 0x3942: 0xb8d, 0x3943: 0xb8e, 0x3944: 0xb8f, 0x3945: 0xb90, 0x3946: 0xb91, 0x3947: 0xb92, + 0x3948: 0xb93, 0x3949: 0xb94, 0x394a: 0xb95, 0x394b: 0xb96, 0x394c: 0xb97, 0x394d: 0xb98, 0x394e: 0xb99, 0x394f: 0xb9a, + 0x3950: 0xb9b, 0x3951: 0xb9c, 0x3952: 0xb9d, 0x3953: 0xb9e, 0x3954: 0xb9f, 0x3955: 0xba0, 0x3956: 0xba1, 0x3957: 0xba2, + 0x3958: 0xba3, 0x3959: 0xba4, 0x395a: 0xba5, 0x395b: 0xba6, 0x395c: 0xba7, 0x395d: 0xba8, 0x395e: 0xba9, 0x395f: 0xbaa, + 0x3960: 0xbab, 0x3961: 0xbac, 0x3962: 0xbad, 0x3963: 0xbae, 0x3964: 0xbaf, 0x3965: 0xbb0, 0x3966: 0xbb1, 0x3967: 0xbb2, + 0x3968: 0xbb3, 0x3969: 0xbb4, 0x396a: 0xbb5, 0x396b: 0xbb6, 0x396c: 0xbb7, 0x396d: 0xbb8, 0x396e: 0xbb9, 0x396f: 0xbba, + 0x3970: 0xbbb, 0x3971: 0xbbc, 0x3972: 0xbbd, 0x3973: 0xbbe, 0x3974: 0xbbf, 0x3975: 0xbc0, 0x3976: 0xbc1, 0x3977: 0xbc2, + 0x3978: 0xbc3, 0x3979: 0xbc4, 0x397a: 0xbc5, 0x397b: 0xbc6, 0x397c: 0xbc7, 0x397d: 0xbc8, 0x397e: 0xbc9, 0x397f: 0xbca, + // Block 0xe6, offset 0x3980 + 0x3980: 0xbcb, 0x3981: 0xbcc, 0x3982: 0xbcd, 0x3983: 0xbce, 0x3984: 0xbcf, 0x3985: 0xbd0, 0x3986: 0xbd1, 0x3987: 0xbd2, + 0x3988: 0xbd3, 0x3989: 0xbd4, 0x398a: 0xbd5, 0x398b: 0xbd6, 0x398c: 0xbd7, 0x398d: 0xbd8, 0x398e: 0xbd9, 0x398f: 0xbda, + 0x3990: 0xbdb, 0x3991: 0xbdc, 0x3992: 0xbdd, 0x3993: 0xbde, 0x3994: 0xbdf, 0x3995: 0xbe0, 0x3996: 0xbe1, 0x3997: 0xbe2, + 0x3998: 0xbe3, 0x3999: 0xbe4, 0x399a: 0xbe5, 0x399b: 0xbe6, 0x399c: 0xbe7, 0x399d: 0xbe8, 0x399e: 0xbe9, 0x399f: 0xbea, + 0x39a0: 0xbeb, 0x39a1: 0xbec, 0x39a2: 0xbed, 0x39a3: 0xbee, 0x39a4: 0xbef, 0x39a5: 0xbf0, 0x39a6: 0xbf1, 0x39a7: 0xbf2, + 0x39a8: 0xbf3, 0x39a9: 0xbf4, 0x39aa: 0xbf5, 0x39ab: 0xbf6, 0x39ac: 0xbf7, 0x39ad: 0xbf8, 0x39ae: 0xbf9, 0x39af: 0xbfa, + 0x39b0: 0xbfb, 0x39b1: 0xbfc, 0x39b2: 0xbfd, 0x39b3: 0xbfe, 0x39b4: 0xbff, 0x39b5: 0xc00, 0x39b6: 0xc01, 0x39b7: 0xc02, + 0x39b8: 0xc03, 0x39b9: 0xc04, 0x39ba: 0xc05, 0x39bb: 0xc06, 0x39bc: 0xc07, 0x39bd: 0xc08, 0x39be: 0xc09, 0x39bf: 0xc0a, + // Block 0xe7, offset 0x39c0 + 0x39c0: 0xc0b, 0x39c1: 0xc0c, 0x39c2: 0xc0d, 0x39c3: 0xc0e, 0x39c4: 0xc0f, 0x39c5: 0xc10, 0x39c6: 0xc11, 0x39c7: 0xc12, + 0x39c8: 0xc13, 0x39c9: 0xc14, 0x39ca: 0xc15, 0x39cb: 0xc16, 0x39cc: 0xc17, 0x39cd: 0xc18, 0x39ce: 0xc19, 0x39cf: 0xc1a, + 0x39d0: 0xc1b, 0x39d1: 0xc1c, 0x39d2: 0xc1d, 0x39d3: 0xc1e, 0x39d4: 0xc1f, 0x39d5: 0xc20, 0x39d6: 0xc21, 0x39d7: 0xc22, + 0x39d8: 0xc23, 0x39d9: 0xc24, 0x39da: 0xc25, 0x39db: 0xc26, 0x39dc: 0xc27, 0x39dd: 0xc28, 0x39de: 0xc29, 0x39df: 0xc2a, + 0x39e0: 0xc2b, 0x39e1: 0xc2c, 0x39e2: 0xc2d, 0x39e3: 0xc2e, 0x39e4: 0xc2f, 0x39e5: 0xc30, 0x39e6: 0xc31, 0x39e7: 0xc32, + 0x39e8: 0xc33, 0x39e9: 0xc34, 0x39ea: 0xc35, 0x39eb: 0xc36, 0x39ec: 0xc37, 0x39ed: 0xc38, 0x39ee: 0xc39, 0x39ef: 0xc3a, + 0x39f0: 0xc3b, 0x39f1: 0xc3c, 0x39f2: 0xc3d, 0x39f3: 0xc3e, 0x39f4: 0xc3f, 0x39f5: 0xc40, 0x39f6: 0xc41, 0x39f7: 0xc42, + 0x39f8: 0xc43, 0x39f9: 0xc44, 0x39fa: 0xc45, 0x39fb: 0xc46, 0x39fc: 0xc47, 0x39fd: 0xc48, 0x39fe: 0xc49, 0x39ff: 0xc4a, + // Block 0xe8, offset 0x3a00 + 0x3a24: 0xc4b, 0x3a25: 0xc4c, 0x3a26: 0xc4d, 0x3a27: 0xc4e, + 0x3a28: 0xc4f, 0x3a29: 0xc50, 0x3a2a: 0xc51, 0x3a2b: 0xc52, 0x3a2c: 0x103, 0x3a2d: 0x104, 0x3a2e: 0x105, 0x3a2f: 0x106, + 0x3a30: 0x107, 0x3a31: 0x108, 0x3a32: 0x109, 0x3a33: 0x10a, 0x3a34: 0x10b, 0x3a35: 0x10c, 0x3a36: 0x10d, 0x3a37: 0x10e, + 0x3a38: 0x10f, 0x3a39: 0x110, 0x3a3a: 0x111, 0x3a3b: 0x112, 0x3a3c: 0x113, 0x3a3d: 0x114, 0x3a3e: 0x115, 0x3a3f: 0x116, + // Block 0xe9, offset 0x3a40 + 0x3a40: 0x18b, 0x3a41: 0x18c, 0x3a42: 0x18d, 0x3a43: 0x18e, 0x3a44: 0x18f, 0x3a45: 0x190, 0x3a46: 0x191, 0x3a47: 0x192, + 0x3a48: 0xc53, 0x3a49: 0xc54, 0x3a4c: 0x195, 0x3a4d: 0x196, 0x3a4e: 0x197, 0x3a4f: 0x198, + 0x3a50: 0x199, 0x3a51: 0x19a, 0x3a52: 0x19b, 0x3a53: 0x19c, 0x3a54: 0x19d, 0x3a55: 0x19e, 0x3a57: 0x19f, + 0x3a58: 0x1a0, 0x3a59: 0x1a1, 0x3a5a: 0x1a2, 0x3a5b: 0x1a3, 0x3a5c: 0x1a4, 0x3a5d: 0x1a5, + // Block 0xea, offset 0x3a80 + 0x3a80: 0xc55, 0x3a81: 0xc56, 0x3a82: 0xc57, 0x3a83: 0xc58, 0x3a84: 0xc59, 0x3a85: 0xc5a, 0x3a86: 0xc5b, 0x3a87: 0xc5c, + 0x3a88: 0xc5d, 0x3a89: 0xc5e, 0x3a8a: 0xc5f, 0x3a8b: 0xc60, 0x3a8c: 0xc61, 0x3a8d: 0xc62, 0x3a8e: 0xc63, 0x3a8f: 0xc64, + 0x3a90: 0xc65, 0x3a91: 0xc66, 0x3a92: 0xc67, 0x3a93: 0xc68, 0x3a94: 0xc69, 0x3a95: 0xc6a, 0x3a96: 0xc6b, 0x3a97: 0xc6c, + 0x3a98: 0xc6d, 0x3a99: 0xc6e, 0x3a9a: 0xc6f, 0x3a9b: 0xc70, 0x3a9c: 0xc71, 0x3a9d: 0xc72, 0x3a9e: 0xc73, 0x3a9f: 0xc74, + 0x3aa0: 0xc75, 0x3aa1: 0xc76, 0x3aa2: 0xc77, 0x3aa3: 0xc78, 0x3aa4: 0xc79, 0x3aa5: 0xc7a, 0x3aa6: 0xc7b, 0x3aa7: 0xc7c, + 0x3aa8: 0xc7d, 0x3aa9: 0xc7e, 0x3aaa: 0xc7f, 0x3aab: 0xc80, 0x3aac: 0xc81, 0x3aad: 0xc82, 0x3aae: 0xc83, 0x3aaf: 0xc84, + 0x3ab0: 0xc85, 0x3ab1: 0xc86, 0x3ab2: 0xc87, 0x3ab3: 0xc88, 0x3ab4: 0xc89, 0x3ab5: 0xc8a, 0x3ab6: 0xc8b, 0x3ab7: 0xc8c, + 0x3ab8: 0xc8d, 0x3ab9: 0xc8e, 0x3aba: 0xc8f, 0x3abb: 0xc90, 0x3abc: 0xc91, 0x3abd: 0xc92, 0x3abe: 0xc93, 0x3abf: 0xc94, + // Block 0xeb, offset 0x3ac0 + 0x3ac0: 0xc95, 0x3ac1: 0xc96, 0x3ac2: 0xc97, 0x3ac3: 0xc98, 0x3ac4: 0xc99, 0x3ac5: 0xc9a, 0x3ac6: 0xc9b, 0x3ac7: 0xc9c, + 0x3ac8: 0xc9d, 0x3ac9: 0xc9e, 0x3aca: 0xc9f, 0x3acb: 0xca0, 0x3acc: 0xca1, 0x3acd: 0xca2, 0x3ace: 0xca3, 0x3acf: 0xca4, + 0x3ad0: 0xca5, 0x3ad1: 0xca6, 0x3ad2: 0xca7, 0x3ad3: 0xca8, 0x3ad4: 0xca9, 0x3ad5: 0xcaa, 0x3ad6: 0xcab, 0x3ad7: 0xcac, + 0x3ad8: 0xcad, 0x3ad9: 0xcae, 0x3ada: 0xcaf, 0x3adb: 0xcb0, 0x3adc: 0xcb1, 0x3add: 0xcb2, 0x3ade: 0xcb3, 0x3adf: 0xcb4, + 0x3ae0: 0xcb5, 0x3ae1: 0xcb6, 0x3ae2: 0xcb7, 0x3ae3: 0xcb8, 0x3ae4: 0xcb9, 0x3ae5: 0xcba, 0x3ae6: 0xcbb, 0x3ae7: 0xcbc, + 0x3ae8: 0xcbd, 0x3ae9: 0xcbe, 0x3aea: 0xcbf, 0x3aeb: 0xcc0, 0x3aec: 0xcc1, 0x3aed: 0xcc2, 0x3aee: 0xcc3, 0x3aef: 0xcc4, + 0x3af0: 0xcc5, 0x3af1: 0xcc6, 0x3af2: 0xcc7, 0x3af3: 0xcc8, 0x3af4: 0xcc9, 0x3af5: 0xcca, 0x3af6: 0xccb, 0x3af7: 0xccc, + 0x3af8: 0xccd, 0x3af9: 0xcce, 0x3afa: 0xccf, 0x3afb: 0xcd0, 0x3afc: 0xcd1, 0x3afd: 0xcd2, 0x3afe: 0xcd3, 0x3aff: 0xcd4, + // Block 0xec, offset 0x3b00 + 0x3b00: 0xcd5, 0x3b01: 0xcd6, 0x3b02: 0xcd7, 0x3b03: 0xcd8, 0x3b04: 0xcd9, 0x3b05: 0xcda, 0x3b06: 0xcdb, 0x3b07: 0xcdc, + 0x3b08: 0xcdd, 0x3b09: 0xcde, 0x3b0a: 0xcdf, 0x3b0b: 0xce0, 0x3b0c: 0xce1, 0x3b0d: 0xce2, 0x3b0e: 0xce3, 0x3b0f: 0xce4, + 0x3b10: 0xce5, 0x3b11: 0xce6, 0x3b12: 0xce7, 0x3b13: 0xce8, 0x3b14: 0xce9, 0x3b15: 0xcea, 0x3b16: 0xceb, 0x3b17: 0xcec, + 0x3b18: 0xced, 0x3b19: 0xcee, 0x3b1a: 0xcef, 0x3b1b: 0xcf0, 0x3b1c: 0xcf1, 0x3b1d: 0xcf2, 0x3b1e: 0xcf3, 0x3b1f: 0xcf4, + 0x3b20: 0xcf5, 0x3b21: 0xcf6, 0x3b22: 0xcf7, 0x3b23: 0xcf8, 0x3b24: 0xcf9, 0x3b25: 0xcfa, 0x3b26: 0xcfb, 0x3b27: 0xcfc, + 0x3b28: 0xcfd, 0x3b29: 0xcfe, 0x3b2a: 0xcff, 0x3b2b: 0xd00, 0x3b2c: 0xd01, 0x3b2d: 0xd02, 0x3b2e: 0xd03, 0x3b2f: 0xd04, + 0x3b30: 0xd05, 0x3b31: 0xd06, 0x3b32: 0xd07, 0x3b33: 0xd08, 0x3b34: 0xd09, 0x3b35: 0xd0a, 0x3b36: 0xd0b, 0x3b37: 0xd0c, + 0x3b38: 0xd0d, 0x3b39: 0xd0e, 0x3b3a: 0xd0f, 0x3b3b: 0xd10, 0x3b3c: 0xd11, 0x3b3d: 0xd12, 0x3b3e: 0xd13, 0x3b3f: 0xd14, + // Block 0xed, offset 0x3b40 + 0x3b40: 0xd15, 0x3b41: 0xd16, 0x3b42: 0xd17, 0x3b43: 0xd18, 0x3b44: 0xd19, 0x3b45: 0xd1a, 0x3b46: 0xd1b, 0x3b47: 0xd1c, + 0x3b48: 0xd1d, 0x3b49: 0xd1e, 0x3b4a: 0xd1f, 0x3b4b: 0xd20, 0x3b4c: 0xd21, 0x3b4d: 0xd22, 0x3b4e: 0xd23, 0x3b4f: 0xd24, + 0x3b50: 0xd25, 0x3b51: 0xd26, 0x3b52: 0xd27, 0x3b53: 0xd28, 0x3b54: 0xd29, 0x3b55: 0xd2a, 0x3b56: 0xd2b, 0x3b57: 0xd2c, + 0x3b58: 0xd2d, 0x3b59: 0xd2e, 0x3b5a: 0xd2f, 0x3b5b: 0xd30, 0x3b5c: 0xd31, 0x3b5d: 0xd32, 0x3b5e: 0xd33, 0x3b5f: 0xd34, + 0x3b60: 0xd35, 0x3b61: 0xd36, 0x3b62: 0xd37, 0x3b63: 0xd38, 0x3b64: 0xd39, 0x3b65: 0xd3a, 0x3b66: 0xd3b, 0x3b67: 0xd3c, + 0x3b68: 0xd3d, 0x3b69: 0xd3e, 0x3b6a: 0xd3f, 0x3b6b: 0xd40, 0x3b6c: 0xd41, 0x3b6d: 0xd42, 0x3b6e: 0xd43, 0x3b6f: 0xd44, + 0x3b70: 0xd45, 0x3b71: 0xd46, 0x3b72: 0xd47, 0x3b73: 0xd48, 0x3b74: 0xd49, 0x3b75: 0xd4a, 0x3b76: 0xd4b, 0x3b77: 0xd4c, + 0x3b78: 0xd4d, 0x3b79: 0xd4e, 0x3b7a: 0xd4f, 0x3b7b: 0xd50, 0x3b7c: 0xd51, 0x3b7d: 0xd52, 0x3b7e: 0xd53, 0x3b7f: 0xd54, + // Block 0xee, offset 0x3b80 + 0x3b80: 0xd55, 0x3b81: 0xd56, 0x3b82: 0xd57, 0x3b83: 0xd58, 0x3b84: 0xd59, 0x3b85: 0xd5a, 0x3b86: 0xd5b, 0x3b87: 0xd5c, + 0x3b88: 0xd5d, 0x3b89: 0xd5e, 0x3b8a: 0xd5f, 0x3b8b: 0xd60, 0x3b8c: 0xd61, 0x3b8d: 0xd62, 0x3b8e: 0xd63, 0x3b8f: 0xd64, + 0x3b90: 0xd65, 0x3b91: 0xd66, 0x3b92: 0xd67, 0x3b93: 0xd68, 0x3b94: 0xd69, 0x3b95: 0xd6a, 0x3b96: 0xd6b, 0x3b97: 0xd6c, + 0x3b98: 0xd6d, 0x3b99: 0xd6e, 0x3b9a: 0xd6f, 0x3b9b: 0xd70, 0x3b9c: 0xd71, 0x3b9d: 0xd72, 0x3b9e: 0xd73, 0x3b9f: 0xd74, + 0x3ba0: 0xd75, 0x3ba1: 0xd76, 0x3ba2: 0xd77, 0x3ba3: 0xd78, 0x3ba4: 0xd79, 0x3ba5: 0xd7a, 0x3ba6: 0xd7b, 0x3ba7: 0xd7c, + 0x3ba8: 0xd7d, 0x3ba9: 0xd7e, 0x3baa: 0xd7f, 0x3bab: 0xd80, 0x3bac: 0xd81, 0x3bad: 0xd82, 0x3bae: 0xd83, 0x3baf: 0xd84, + 0x3bb0: 0xd85, 0x3bb1: 0xd86, 0x3bb2: 0xd87, 0x3bb3: 0xd88, 0x3bb4: 0xd89, 0x3bb5: 0xd8a, 0x3bb6: 0xd8b, 0x3bb7: 0xd8c, + 0x3bb8: 0xd8d, 0x3bb9: 0xd8e, 0x3bba: 0xd8f, 0x3bbb: 0xd90, 0x3bbc: 0xd91, 0x3bbd: 0xd92, 0x3bbe: 0xd93, 0x3bbf: 0xd94, + // Block 0xef, offset 0x3bc0 + 0x3bc0: 0xd95, 0x3bc1: 0xd96, 0x3bc2: 0xd97, 0x3bc3: 0xd98, 0x3bc4: 0xd99, 0x3bc5: 0xd9a, 0x3bc6: 0xd9b, 0x3bc7: 0xd9c, + 0x3bc8: 0xd9d, 0x3bc9: 0xd9e, 0x3bca: 0xd9f, 0x3bcb: 0xda0, 0x3bcc: 0xda1, 0x3bcd: 0xda2, 0x3bce: 0xda3, 0x3bcf: 0xda4, + 0x3bd0: 0xda5, 0x3bd1: 0xda6, 0x3bd2: 0xda7, 0x3bd3: 0xda8, 0x3bd4: 0xda9, 0x3bd5: 0xdaa, 0x3bd6: 0xdab, 0x3bd7: 0xdac, + 0x3bd8: 0xdad, 0x3bd9: 0xdae, 0x3bda: 0xdaf, 0x3bdb: 0xdb0, 0x3bdc: 0xdb1, 0x3bdd: 0xdb2, 0x3bde: 0xdb3, 0x3bdf: 0xdb4, + 0x3be0: 0xdb5, 0x3be1: 0xdb6, 0x3be2: 0xdb7, 0x3be3: 0xdb8, 0x3be4: 0xdb9, 0x3be5: 0xdba, 0x3be6: 0xdbb, 0x3be7: 0xdbc, + 0x3be8: 0xdbd, 0x3be9: 0xdbe, 0x3bea: 0xdbf, 0x3beb: 0xdc0, 0x3bec: 0xdc1, 0x3bed: 0xdc2, 0x3bee: 0xdc3, 0x3bef: 0xdc4, + 0x3bf0: 0xdc5, 0x3bf1: 0xdc6, 0x3bf2: 0xdc7, 0x3bf3: 0xdc8, 0x3bf4: 0xdc9, 0x3bf5: 0xdca, 0x3bf6: 0xdcb, 0x3bf7: 0xdcc, + 0x3bf8: 0xdcd, 0x3bf9: 0xdce, 0x3bfa: 0xdcf, 0x3bfb: 0xdd0, 0x3bfc: 0xdd1, 0x3bfd: 0xdd2, 0x3bfe: 0xdd3, 0x3bff: 0xdd4, + // Block 0xf0, offset 0x3c00 + 0x3c00: 0xdd5, 0x3c01: 0xdd6, 0x3c02: 0xdd7, 0x3c03: 0xdd8, 0x3c04: 0xdd9, 0x3c05: 0xdda, 0x3c06: 0xddb, 0x3c07: 0xddc, + 0x3c08: 0xddd, 0x3c09: 0xdde, 0x3c0a: 0xddf, 0x3c0b: 0xde0, 0x3c0c: 0xde1, 0x3c0d: 0xde2, 0x3c0e: 0xde3, 0x3c0f: 0xde4, + 0x3c10: 0xde5, 0x3c11: 0xde6, 0x3c12: 0xde7, 0x3c13: 0xde8, 0x3c14: 0xde9, 0x3c15: 0xdea, 0x3c16: 0xdeb, 0x3c17: 0xdec, + 0x3c18: 0xded, 0x3c19: 0xdee, 0x3c1a: 0xdef, 0x3c1b: 0xdf0, 0x3c1c: 0xdf1, 0x3c1d: 0xdf2, 0x3c1e: 0xdf3, 0x3c1f: 0xdf4, + 0x3c20: 0xdf5, 0x3c21: 0xdf6, 0x3c22: 0xdf7, 0x3c23: 0xdf8, 0x3c24: 0xdf9, 0x3c25: 0xdfa, 0x3c26: 0xdfb, 0x3c27: 0xdfc, + 0x3c28: 0xdfd, 0x3c29: 0xdfe, 0x3c2a: 0xdff, 0x3c2b: 0xe00, 0x3c2c: 0xe01, 0x3c2d: 0xe02, 0x3c2e: 0xe03, 0x3c2f: 0xe04, + 0x3c30: 0xe05, 0x3c31: 0xe06, 0x3c32: 0xe07, 0x3c33: 0xe08, 0x3c34: 0xe09, 0x3c35: 0xe0a, 0x3c36: 0xe0b, 0x3c37: 0xe0c, + 0x3c38: 0xe0d, 0x3c39: 0xe0e, 0x3c3a: 0xe0f, 0x3c3b: 0xe10, 0x3c3c: 0xe11, 0x3c3d: 0xe12, 0x3c3e: 0xe13, 0x3c3f: 0xe14, + // Block 0xf1, offset 0x3c40 + 0x3c40: 0xe15, 0x3c41: 0xe16, 0x3c42: 0xe17, 0x3c43: 0xe18, 0x3c44: 0xe19, 0x3c45: 0xe1a, 0x3c46: 0xe1b, 0x3c47: 0xe1c, + 0x3c48: 0xe1d, 0x3c49: 0xe1e, 0x3c4a: 0xe1f, 0x3c4b: 0xe20, 0x3c4c: 0xe21, 0x3c4d: 0xe22, 0x3c4e: 0xe23, 0x3c4f: 0xe24, + 0x3c50: 0xe25, 0x3c51: 0xe26, 0x3c52: 0xe27, 0x3c53: 0xe28, 0x3c54: 0xe29, 0x3c55: 0xe2a, 0x3c56: 0xe2b, 0x3c57: 0xe2c, + 0x3c58: 0xe2d, 0x3c59: 0xe2e, 0x3c5a: 0xe2f, 0x3c5b: 0xe30, 0x3c5c: 0xe31, 0x3c5d: 0xe32, 0x3c5e: 0xe33, 0x3c5f: 0xe34, + 0x3c60: 0xe35, 0x3c61: 0xe36, 0x3c62: 0xe37, 0x3c63: 0xe38, 0x3c64: 0xe39, 0x3c65: 0xe3a, 0x3c66: 0xe3b, 0x3c67: 0xe3c, + 0x3c68: 0xe3d, 0x3c69: 0xe3e, 0x3c6a: 0xe3f, 0x3c6b: 0xe40, 0x3c6c: 0xe41, 0x3c6d: 0xe42, 0x3c6e: 0xe43, 0x3c6f: 0xe44, + 0x3c70: 0xe45, 0x3c71: 0xe46, 0x3c72: 0xe47, 0x3c73: 0xe48, 0x3c74: 0xe49, 0x3c75: 0xe4a, 0x3c76: 0xe4b, 0x3c77: 0xe4c, + 0x3c78: 0xe4d, 0x3c79: 0xe4e, 0x3c7a: 0xe4f, 0x3c7b: 0xe50, 0x3c7c: 0xe51, 0x3c7d: 0xe52, 0x3c7e: 0xe53, 0x3c7f: 0xe54, + // Block 0xf2, offset 0x3c80 + 0x3c80: 0xe55, 0x3c81: 0xe56, 0x3c82: 0xe57, 0x3c83: 0xe58, 0x3c84: 0xe59, 0x3c85: 0xe5a, 0x3c86: 0xe5b, 0x3c87: 0xe5c, + 0x3c88: 0xe5d, 0x3c89: 0xe5e, 0x3c8a: 0xe5f, 0x3c8b: 0xe60, 0x3c8c: 0xe61, 0x3c8d: 0xe62, 0x3c8e: 0xe63, 0x3c8f: 0xe64, + 0x3c90: 0xe65, 0x3c91: 0xe66, 0x3c92: 0xe67, 0x3c93: 0xe68, 0x3c94: 0xe69, 0x3c95: 0xe6a, 0x3c96: 0xe6b, 0x3c97: 0xe6c, + 0x3c98: 0xe6d, 0x3c99: 0xe6e, 0x3c9a: 0xe6f, 0x3c9b: 0xe70, 0x3c9c: 0xe71, 0x3c9d: 0xe72, 0x3c9e: 0xe73, 0x3c9f: 0xe74, + 0x3ca0: 0xe75, 0x3ca1: 0xe76, 0x3ca2: 0xe77, 0x3ca3: 0xe78, 0x3ca4: 0xe79, 0x3ca5: 0xe7a, 0x3ca6: 0xe7b, 0x3ca7: 0xe7c, + 0x3ca8: 0xe7d, 0x3ca9: 0xe7e, 0x3caa: 0xe7f, 0x3cab: 0xe80, 0x3cac: 0xe81, 0x3cad: 0xe82, 0x3cae: 0xe83, 0x3caf: 0xe84, + 0x3cb0: 0xe85, 0x3cb1: 0xe86, 0x3cb2: 0xe87, 0x3cb3: 0xe88, 0x3cb4: 0xe89, 0x3cb5: 0xe8a, 0x3cb6: 0xe8b, 0x3cb7: 0xe8c, + 0x3cb8: 0xe8d, 0x3cb9: 0xe8e, 0x3cba: 0xe8f, 0x3cbb: 0xe90, 0x3cbc: 0xe91, 0x3cbd: 0xe92, 0x3cbe: 0xe93, 0x3cbf: 0xe94, + // Block 0xf3, offset 0x3cc0 + 0x3cc0: 0xe95, 0x3cc1: 0xe96, 0x3cc2: 0xe97, 0x3cc3: 0xe98, 0x3cc4: 0xe99, 0x3cc5: 0xe9a, 0x3cc6: 0xe9b, 0x3cc7: 0xe9c, + 0x3cc8: 0xe9d, 0x3cc9: 0xe9e, 0x3cca: 0xe9f, 0x3ccb: 0xea0, 0x3ccc: 0xea1, 0x3ccd: 0xea2, 0x3cce: 0xea3, 0x3ccf: 0xea4, + 0x3cd0: 0xea5, 0x3cd1: 0xea6, 0x3cd2: 0xea7, 0x3cd3: 0xea8, 0x3cd4: 0xea9, 0x3cd5: 0xeaa, 0x3cd6: 0xeab, 0x3cd7: 0xeac, + 0x3cd8: 0xead, 0x3cd9: 0xeae, 0x3cda: 0xeaf, 0x3cdb: 0xeb0, 0x3cdc: 0xeb1, 0x3cdd: 0xeb2, 0x3cde: 0xeb3, 0x3cdf: 0xeb4, + 0x3ce0: 0xeb5, 0x3ce1: 0xeb6, 0x3ce2: 0xeb7, 0x3ce3: 0xeb8, 0x3ce4: 0xeb9, 0x3ce5: 0xeba, 0x3ce6: 0xebb, 0x3ce7: 0xebc, + 0x3ce8: 0xebd, 0x3ce9: 0xebe, 0x3cea: 0xebf, 0x3ceb: 0xec0, 0x3cec: 0xec1, 0x3ced: 0xec2, 0x3cee: 0xec3, 0x3cef: 0xec4, + 0x3cf0: 0xec5, 0x3cf1: 0xec6, 0x3cf2: 0xec7, 0x3cf3: 0xec8, 0x3cf4: 0xec9, 0x3cf5: 0xeca, 0x3cf6: 0xecb, 0x3cf7: 0xecc, + 0x3cf8: 0xecd, 0x3cf9: 0xece, 0x3cfa: 0xecf, 0x3cfb: 0xed0, 0x3cfc: 0xed1, 0x3cfd: 0xed2, 0x3cfe: 0xed3, 0x3cff: 0xed4, + // Block 0xf4, offset 0x3d00 + 0x3d00: 0xed5, 0x3d01: 0xed6, 0x3d02: 0xed7, 0x3d03: 0xed8, 0x3d04: 0xed9, 0x3d05: 0xeda, 0x3d06: 0xedb, 0x3d07: 0xedc, + 0x3d08: 0xedd, 0x3d09: 0xede, 0x3d0a: 0xedf, 0x3d0b: 0xee0, 0x3d0c: 0xee1, 0x3d0d: 0xee2, 0x3d0e: 0xee3, 0x3d0f: 0xee4, + 0x3d10: 0xee5, 0x3d11: 0xee6, 0x3d12: 0xee7, 0x3d13: 0xee8, 0x3d14: 0xee9, 0x3d15: 0xeea, 0x3d16: 0xeeb, 0x3d17: 0xeec, + 0x3d18: 0xeed, 0x3d19: 0xeee, 0x3d1a: 0xeef, 0x3d1b: 0xef0, 0x3d1c: 0xef1, 0x3d1d: 0xef2, 0x3d1e: 0xef3, 0x3d1f: 0xef4, + 0x3d20: 0xef5, 0x3d21: 0xef6, 0x3d22: 0xef7, 0x3d23: 0xef8, 0x3d24: 0xef9, 0x3d25: 0xefa, 0x3d26: 0xefb, 0x3d27: 0xefc, + 0x3d28: 0xefd, 0x3d29: 0xefe, 0x3d2a: 0xeff, 0x3d2b: 0xf00, 0x3d2c: 0xf01, 0x3d2d: 0xf02, 0x3d2e: 0xf03, 0x3d2f: 0xf04, + 0x3d30: 0xf05, 0x3d31: 0xf06, 0x3d32: 0xf07, 0x3d33: 0xf08, 0x3d34: 0xf09, 0x3d35: 0xf0a, 0x3d36: 0xf0b, 0x3d37: 0xf0c, + 0x3d38: 0xf0d, 0x3d39: 0xf0e, 0x3d3a: 0xf0f, 0x3d3b: 0xf10, 0x3d3c: 0xf11, 0x3d3d: 0xf12, 0x3d3e: 0xf13, 0x3d3f: 0xf14, + // Block 0xf5, offset 0x3d40 + 0x3d40: 0xf15, 0x3d41: 0xf16, 0x3d42: 0xf17, 0x3d43: 0xf18, 0x3d44: 0xf19, 0x3d45: 0xf1a, 0x3d46: 0xf1b, 0x3d47: 0xf1c, + 0x3d48: 0xf1d, 0x3d49: 0xf1e, 0x3d4a: 0xf1f, 0x3d4b: 0xf20, 0x3d4c: 0xf21, 0x3d4d: 0xf22, 0x3d4e: 0xf23, 0x3d4f: 0xf24, + 0x3d50: 0xf25, 0x3d51: 0xf26, 0x3d52: 0xf27, 0x3d53: 0xf28, 0x3d54: 0xf29, 0x3d55: 0xf2a, 0x3d56: 0xf2b, 0x3d57: 0xf2c, + 0x3d58: 0xf2d, 0x3d59: 0xf2e, 0x3d5a: 0xf2f, 0x3d5b: 0xf30, 0x3d5c: 0xf31, 0x3d5d: 0xf32, 0x3d5e: 0xf33, 0x3d5f: 0xf34, + 0x3d60: 0xf35, + // Block 0xf6, offset 0x3d80 + 0x3da0: 0xf36, 0x3da1: 0xf37, 0x3da2: 0xf38, 0x3da3: 0xf39, 0x3da4: 0xf3a, 0x3da5: 0xf3b, 0x3da6: 0xf3c, 0x3da7: 0xf3d, + 0x3da8: 0xf3e, + // Block 0xf7, offset 0x3dc0 + 0x3dd0: 0x09, 0x3dd1: 0x0a, 0x3dd2: 0x0b, 0x3dd3: 0x0c, 0x3dd6: 0x0d, + 0x3ddb: 0x0e, 0x3ddd: 0x0f, 0x3dde: 0x10, 0x3ddf: 0xe7, + 0x3de0: 0xe8, 0x3de1: 0xe9, 0x3de2: 0xea, 0x3de3: 0xeb, 0x3de4: 0xec, 0x3de5: 0xed, 0x3de6: 0xee, 0x3de7: 0xef, + 0x3de8: 0xf0, 0x3de9: 0xf1, 0x3dea: 0xf2, 0x3deb: 0xf3, 0x3def: 0xf4, + // Block 0xf8, offset 0x3e00 + 0x3e02: 0x01, 0x3e03: 0x600, 0x3e04: 0x601, 0x3e05: 0x602, 0x3e06: 0x05, 0x3e07: 0x603, + 0x3e08: 0x604, 0x3e09: 0x08, 0x3e0a: 0x09, 0x3e0b: 0x0a, 0x3e0c: 0x0b, 0x3e0d: 0x0c, 0x3e0e: 0x0d, 0x3e0f: 0x0e, + 0x3e10: 0x0f, 0x3e11: 0x10, 0x3e12: 0x11, 0x3e13: 0x12, 0x3e14: 0x13, 0x3e15: 0x14, 0x3e16: 0x15, 0x3e17: 0x16, + 0x3e18: 0x17, 0x3e19: 0x18, 0x3e1a: 0x19, 0x3e1b: 0x1a, 0x3e1c: 0x1b, 0x3e1d: 0x1c, 0x3e1e: 0x1d, 0x3e1f: 0x1e, + 0x3e20: 0x01, 0x3e21: 0xc4, 0x3e22: 0xde, 0x3e23: 0xdf, 0x3e24: 0xe0, 0x3e25: 0xe1, 0x3e26: 0xe2, 0x3e27: 0xe3, + 0x3e28: 0xe4, 0x3e29: 0xe5, 0x3e2a: 0x06, 0x3e2d: 0x07, 0x3e2f: 0xe6, + 0x3e30: 0xf5, 0x3e33: 0x15, +} + +// mainCTEntries: 2490 entries, 9960 bytes +var mainCTEntries = [2490]struct{ l, h, n, i uint8 }{ + {0xCE, 0x1, 1, 255}, + {0xC2, 0x0, 1, 255}, + {0xB7, 0xB7, 0, 1}, + {0x87, 0x87, 0, 2}, + {0xCC, 0x0, 2, 255}, + {0x88, 0x88, 0, 2}, + {0x86, 0x86, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x88, 0x88, 0, 1}, + {0xCD, 0x1, 1, 255}, + {0xCC, 0x0, 1, 255}, + {0x81, 0x81, 0, 1}, + {0x81, 0x81, 0, 2}, + {0xCC, 0x0, 1, 255}, + {0x86, 0x86, 0, 1}, + {0xCC, 0x0, 3, 255}, + {0x8B, 0x8B, 0, 3}, + {0x88, 0x88, 0, 2}, + {0x86, 0x86, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x8F, 0x8F, 0, 1}, + {0xD9, 0x0, 1, 255}, + {0x93, 0x95, 0, 1}, + {0xD9, 0x0, 1, 255}, + {0x94, 0x94, 0, 1}, + {0xE0, 0x0, 2, 255}, + {0xA7, 0x1, 1, 255}, + {0xA6, 0x0, 1, 255}, + {0xBE, 0xBE, 0, 1}, + {0x97, 0x97, 0, 2}, + {0xE0, 0x0, 2, 255}, + {0xAD, 0x1, 1, 255}, + {0xAC, 0x0, 1, 255}, + {0xBE, 0xBE, 0, 1}, + {0x96, 0x97, 0, 2}, + {0xE0, 0x0, 1, 255}, + {0xAF, 0x0, 1, 255}, + {0x97, 0x97, 0, 1}, + {0xE0, 0x0, 2, 255}, + {0xAF, 0x1, 1, 255}, + {0xAE, 0x0, 1, 255}, + {0xBE, 0xBE, 0, 1}, + {0x97, 0x97, 0, 2}, + {0xE0, 0x0, 1, 255}, + {0xAE, 0x0, 1, 255}, + {0xBE, 0xBE, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xB1, 0x0, 1, 255}, + {0x96, 0x96, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xB3, 0x0, 1, 255}, + {0x95, 0x95, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xB3, 0x0, 2, 255}, + {0x95, 0x96, 0, 3}, + {0x82, 0x0, 1, 2}, + {0xE0, 0x0, 1, 255}, + {0xB3, 0x0, 1, 255}, + {0x95, 0x95, 0, 1}, + {0xE0, 0x0, 2, 255}, + {0xB5, 0x1, 1, 255}, + {0xB4, 0x0, 1, 255}, + {0xBE, 0xBE, 0, 1}, + {0x97, 0x97, 0, 2}, + {0xE0, 0x0, 1, 255}, + {0xB4, 0x0, 1, 255}, + {0xBE, 0xBE, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xB7, 0x0, 3, 255}, + {0x9F, 0x9F, 0, 4}, + {0x8F, 0x0, 1, 3}, + {0x8A, 0x8A, 0, 2}, + {0xE0, 0x0, 1, 255}, + {0xB7, 0x0, 1, 255}, + {0x8A, 0x8A, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xB7, 0x0, 1, 255}, + {0x8A, 0x8A, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xB8, 0x0, 1, 255}, + {0x81, 0xAE, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xB8, 0x0, 1, 255}, + {0xB2, 0xB2, 0, 1}, + {0xE0, 0x0, 2, 255}, + {0xBB, 0xC, 1, 255}, + {0xBA, 0x0, 12, 255}, + {0xAD, 0xAE, 0, 26}, + {0xAA, 0xAB, 0, 24}, + {0xA7, 0xA7, 0, 23}, + {0xA5, 0xA5, 0, 22}, + {0xA1, 0xA3, 0, 19}, + {0x99, 0x9F, 0, 12}, + {0x94, 0x97, 0, 8}, + {0x8D, 0x8D, 0, 7}, + {0x8A, 0x8A, 0, 6}, + {0x87, 0x88, 0, 4}, + {0x84, 0x84, 0, 3}, + {0x81, 0x82, 0, 1}, + {0x9C, 0x9F, 0, 28}, + {0xE0, 0x0, 1, 255}, + {0xBA, 0x0, 1, 255}, + {0xB2, 0xB2, 0, 1}, + {0xEA, 0x0, 1, 255}, + {0xAA, 0x0, 1, 255}, + {0x80, 0xAF, 0, 1}, + {0xE0, 0x0, 2, 255}, + {0xBE, 0x7, 1, 255}, + {0xBD, 0x0, 1, 255}, + {0xB1, 0x0, 1, 255}, + {0xE0, 0x0, 2, 255}, + {0xBE, 0x2, 1, 255}, + {0xBD, 0x0, 2, 255}, + {0xB4, 0xB4, 0, 2}, + {0xB2, 0xB2, 0, 1}, + {0x80, 0x80, 0, 3}, + {0x80, 0x81, 0, 4}, + {0xE0, 0x0, 2, 255}, + {0xBE, 0x2, 1, 255}, + {0xBD, 0x0, 2, 255}, + {0xB4, 0xB4, 0, 2}, + {0xB2, 0xB2, 0, 1}, + {0x80, 0x80, 0, 3}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xAE, 0xAE, 0, 1}, + {0xF0, 0x0, 1, 255}, + {0x91, 0x0, 1, 255}, + {0x84, 0x0, 1, 255}, + {0xA7, 0xA7, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0xAC, 0x0, 1, 255}, + {0xB5, 0xB5, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xA7, 0x0, 1, 255}, + {0x8D, 0x0, 1, 255}, + {0xE2, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0x8D, 0x8D, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xA7, 0x0, 1, 255}, + {0x8D, 0x0, 1, 255}, + {0xE0, 0x0, 1, 255}, + {0xA6, 0x0, 1, 255}, + {0xB7, 0xB7, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0xA7, 0xA7, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x87, 0x87, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x68, 0x68, 0, 3}, + {0x48, 0x48, 0, 2}, + {0x8C, 0x8C, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x8C, 0x8C, 0, 1}, + {0x68, 0x68, 0, 1}, + {0x68, 0x68, 0, 2}, + {0x48, 0x48, 0, 1}, + {0x64, 0x64, 0, 1}, + {0x64, 0x64, 0, 2}, + {0x44, 0x44, 0, 1}, + {0x66, 0x66, 0, 1}, + {0x66, 0x66, 0, 2}, + {0x46, 0x46, 0, 1}, + {0x67, 0x67, 0, 1}, + {0x67, 0x67, 0, 2}, + {0x47, 0x47, 0, 1}, + {0xCE, 0x1, 1, 255}, + {0xC2, 0x0, 1, 255}, + {0x6C, 0x6C, 0, 3}, + {0xB7, 0xB7, 0, 1}, + {0x87, 0x87, 0, 2}, + {0xCE, 0x1, 1, 255}, + {0xC2, 0x0, 1, 255}, + {0x6C, 0x6C, 0, 4}, + {0x4C, 0x4C, 0, 3}, + {0xB7, 0xB7, 0, 1}, + {0x87, 0x87, 0, 2}, + {0xCC, 0x0, 2, 255}, + {0x8B, 0x8B, 0, 2}, + {0x88, 0x88, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x61, 0x61, 0, 3}, + {0x8A, 0x8A, 0, 2}, + {0x88, 0x88, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x61, 0x61, 0, 4}, + {0x41, 0x41, 0, 3}, + {0x8A, 0x8A, 0, 2}, + {0x88, 0x88, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0xA8, 0xA8, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xBE, 0x0, 1, 255}, + {0x90, 0x91, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xBD, 0x0, 6, 255}, + {0x98, 0x42, 1, 255}, + {0x96, 0x31, 1, 255}, + {0x94, 0x1B, 1, 255}, + {0x84, 0x11, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x80, 0x80, 0, 73}, + {0xE0, 0x0, 2, 255}, + {0xBE, 0xD, 1, 255}, + {0xBD, 0x0, 13, 255}, + {0xBC, 0xBC, 0, 20}, + {0xBA, 0xBA, 0, 19}, + {0xB4, 0xB4, 0, 18}, + {0xA6, 0xA6, 0, 17}, + {0xA2, 0xA3, 0, 15}, + {0xA0, 0xA0, 0, 14}, + {0x9D, 0x9D, 0, 13}, + {0x96, 0x96, 0, 12}, + {0x91, 0x91, 0, 11}, + {0x8C, 0x8C, 0, 10}, + {0x8A, 0x8A, 0, 9}, + {0x84, 0x84, 0, 8}, + {0x82, 0x82, 0, 7}, + {0xB1, 0xB2, 0, 21}, + {0xE0, 0x0, 1, 255}, + {0xBD, 0x0, 8, 255}, + {0xBC, 0xBC, 0, 30}, + {0xB4, 0xB4, 0, 29}, + {0xA2, 0xA2, 0, 28}, + {0x93, 0x93, 0, 27}, + {0x8C, 0x8C, 0, 26}, + {0x8A, 0x8A, 0, 25}, + {0x84, 0x84, 0, 24}, + {0x82, 0x82, 0, 23}, + {0xE0, 0x0, 2, 255}, + {0xBE, 0x12, 1, 255}, + {0xBD, 0x0, 11, 255}, + {0xBC, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 41}, + {0xB4, 0xB4, 0, 40}, + {0xA6, 0xA6, 0, 39}, + {0xA2, 0xA3, 0, 37}, + {0xA0, 0xA0, 0, 36}, + {0x91, 0x91, 0, 35}, + {0x8C, 0x8C, 0, 34}, + {0x8A, 0x8A, 0, 33}, + {0x84, 0x84, 0, 32}, + {0x82, 0x82, 0, 31}, + {0xE0, 0x0, 1, 255}, + {0xBD, 0x0, 5, 255}, + {0xA2, 0xA2, 0, 5}, + {0x93, 0x93, 0, 4}, + {0x91, 0x91, 0, 3}, + {0x84, 0x84, 0, 2}, + {0x82, 0x82, 0, 1}, + {0xB1, 0xB2, 0, 42}, + {0xE0, 0x0, 2, 255}, + {0xBE, 0xD, 1, 255}, + {0xBD, 0x0, 13, 255}, + {0xBC, 0xBC, 0, 57}, + {0xBA, 0xBA, 0, 56}, + {0xB4, 0xB4, 0, 55}, + {0xA6, 0xA6, 0, 54}, + {0xA2, 0xA3, 0, 52}, + {0xA0, 0xA0, 0, 51}, + {0x96, 0x96, 0, 50}, + {0x93, 0x93, 0, 49}, + {0x91, 0x91, 0, 48}, + {0x8C, 0x8C, 0, 47}, + {0x8A, 0x8A, 0, 46}, + {0x84, 0x84, 0, 45}, + {0x82, 0x82, 0, 44}, + {0xB1, 0xB2, 0, 58}, + {0xE0, 0x0, 2, 255}, + {0xBE, 0x10, 1, 255}, + {0xBD, 0x0, 13, 255}, + {0xBC, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 71}, + {0xB4, 0xB4, 0, 70}, + {0xB2, 0xB2, 0, 69}, + {0xA6, 0xA6, 0, 68}, + {0xA2, 0xA2, 0, 67}, + {0xA0, 0xA0, 0, 66}, + {0x9D, 0x9D, 0, 65}, + {0x93, 0x93, 0, 64}, + {0x8C, 0x8C, 0, 63}, + {0x8A, 0x8A, 0, 62}, + {0x84, 0x84, 0, 61}, + {0x82, 0x82, 0, 60}, + {0xE0, 0x0, 1, 255}, + {0xBD, 0x0, 1, 255}, + {0x91, 0x91, 0, 6}, + {0xB1, 0xB1, 0, 72}, + {0xE0, 0x0, 1, 255}, + {0xBD, 0x0, 11, 255}, + {0xA6, 0x2E, 1, 255}, + {0xA4, 0xA4, 0, 72}, + {0xA3, 0x29, 1, 255}, + {0xA2, 0x1C, 1, 255}, + {0x9E, 0x9F, 0, 70}, + {0x99, 0x99, 0, 69}, + {0x91, 0xF, 1, 255}, + {0x8F, 0x8F, 0, 68}, + {0x85, 0x85, 0, 67}, + {0x82, 0x0, 1, 255}, + {0x80, 0x80, 0, 66}, + {0xE0, 0x0, 2, 255}, + {0xBE, 0xB, 1, 255}, + {0xBD, 0x0, 11, 255}, + {0xBE, 0xBE, 0, 11}, + {0xBC, 0xBC, 0, 10}, + {0xBA, 0xBA, 0, 9}, + {0xA2, 0xA2, 0, 8}, + {0xA0, 0xA0, 0, 7}, + {0x9D, 0x9D, 0, 6}, + {0x98, 0x98, 0, 5}, + {0x91, 0x91, 0, 4}, + {0x8C, 0x8C, 0, 3}, + {0x8A, 0x8A, 0, 2}, + {0x82, 0x82, 0, 1}, + {0xB1, 0xB3, 0, 12}, + {0xE0, 0x0, 1, 255}, + {0xBD, 0x0, 11, 255}, + {0xBE, 0xBE, 0, 26}, + {0xBC, 0xBC, 0, 25}, + {0xBA, 0xBA, 0, 24}, + {0xB4, 0xB4, 0, 23}, + {0xA6, 0xA6, 0, 22}, + {0xA2, 0xA3, 0, 20}, + {0xA0, 0xA0, 0, 19}, + {0x98, 0x98, 0, 18}, + {0x8C, 0x8C, 0, 17}, + {0x8A, 0x8A, 0, 16}, + {0x82, 0x82, 0, 15}, + {0xE0, 0x0, 1, 255}, + {0xBE, 0x0, 11, 255}, + {0xB3, 0xB3, 0, 37}, + {0xAB, 0xAB, 0, 36}, + {0xA9, 0xA9, 0, 35}, + {0xA3, 0xA3, 0, 34}, + {0xA1, 0xA1, 0, 33}, + {0x9F, 0x9F, 0, 32}, + {0x99, 0x99, 0, 31}, + {0x97, 0x97, 0, 30}, + {0x94, 0x94, 0, 29}, + {0x92, 0x92, 0, 28}, + {0x90, 0x90, 0, 27}, + {0xE0, 0x0, 1, 255}, + {0xBE, 0x0, 3, 255}, + {0xA1, 0xA1, 0, 40}, + {0x9F, 0x9F, 0, 39}, + {0x95, 0x95, 0, 38}, + {0xE0, 0x0, 2, 255}, + {0xBE, 0xD, 10, 255}, + {0xBD, 0x0, 13, 255}, + {0xBE, 0xBE, 0, 54}, + {0xBC, 0xBC, 0, 53}, + {0xBA, 0xBA, 0, 52}, + {0xB4, 0xB4, 0, 51}, + {0xB2, 0xB2, 0, 50}, + {0xA2, 0xA3, 0, 48}, + {0x98, 0x98, 0, 47}, + {0x96, 0x96, 0, 46}, + {0x91, 0x91, 0, 45}, + {0x8C, 0x8C, 0, 44}, + {0x8A, 0x8A, 0, 43}, + {0x84, 0x84, 0, 42}, + {0x82, 0x82, 0, 41}, + {0xB2, 0xB3, 0, 64}, + {0xAD, 0xAD, 0, 63}, + {0xA9, 0xA9, 0, 62}, + {0xA3, 0xA3, 0, 61}, + {0xA1, 0xA1, 0, 60}, + {0x9F, 0x9F, 0, 59}, + {0x99, 0x99, 0, 58}, + {0x94, 0x94, 0, 57}, + {0x92, 0x92, 0, 56}, + {0x90, 0x90, 0, 55}, + {0xE0, 0x0, 1, 255}, + {0xBE, 0x0, 11, 255}, + {0xAB, 0xAB, 0, 12}, + {0xA8, 0xA9, 0, 10}, + {0xA6, 0xA6, 0, 9}, + {0xA3, 0xA3, 0, 8}, + {0xA1, 0xA1, 0, 7}, + {0x9F, 0x9F, 0, 6}, + {0x99, 0x99, 0, 5}, + {0x97, 0x97, 0, 4}, + {0x94, 0x94, 0, 3}, + {0x92, 0x92, 0, 2}, + {0x90, 0x90, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xBE, 0x0, 9, 255}, + {0xB7, 0xB7, 0, 10}, + {0xA6, 0xA6, 0, 9}, + {0xA4, 0xA4, 0, 8}, + {0xA1, 0xA1, 0, 7}, + {0x9F, 0x9F, 0, 6}, + {0x97, 0x97, 0, 5}, + {0x94, 0x95, 0, 3}, + {0x92, 0x92, 0, 2}, + {0x90, 0x90, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xBD, 0x0, 9, 255}, + {0x9A, 0x9B, 0, 45}, + {0x93, 0x1D, 1, 255}, + {0x91, 0x11, 1, 255}, + {0x90, 0x90, 0, 44}, + {0x89, 0x89, 0, 43}, + {0x86, 0x87, 0, 41}, + {0x84, 0x8, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x81, 0x81, 0, 40}, + {0xE0, 0x0, 2, 255}, + {0xBE, 0x4, 1, 255}, + {0xBD, 0x0, 4, 255}, + {0xBC, 0xBC, 0, 5}, + {0xBA, 0xBA, 0, 4}, + {0xB4, 0xB4, 0, 3}, + {0xA2, 0xA3, 0, 1}, + {0xB1, 0xB2, 0, 6}, + {0xE0, 0x0, 1, 255}, + {0xBD, 0x0, 7, 255}, + {0xBC, 0xBC, 0, 15}, + {0xA2, 0xA3, 0, 13}, + {0xA0, 0xA0, 0, 12}, + {0x93, 0x93, 0, 11}, + {0x8C, 0x8C, 0, 10}, + {0x8A, 0x8A, 0, 9}, + {0x82, 0x82, 0, 8}, + {0xE0, 0x0, 1, 255}, + {0xBD, 0x0, 10, 255}, + {0xBC, 0xBC, 0, 25}, + {0xBA, 0xBA, 0, 24}, + {0xB4, 0xB4, 0, 23}, + {0xA2, 0xA2, 0, 22}, + {0xA0, 0xA0, 0, 21}, + {0x93, 0x93, 0, 20}, + {0x8C, 0x8C, 0, 19}, + {0x8A, 0x8A, 0, 18}, + {0x84, 0x84, 0, 17}, + {0x82, 0x82, 0, 16}, + {0xE0, 0x0, 1, 255}, + {0xBD, 0x0, 13, 255}, + {0xBE, 0xBE, 0, 39}, + {0xBC, 0xBC, 0, 38}, + {0xBA, 0xBA, 0, 37}, + {0xB4, 0xB4, 0, 36}, + {0xA2, 0xA3, 0, 34}, + {0xA0, 0xA0, 0, 33}, + {0x98, 0x98, 0, 32}, + {0x96, 0x96, 0, 31}, + {0x93, 0x93, 0, 30}, + {0x8C, 0x8C, 0, 29}, + {0x8A, 0x8A, 0, 28}, + {0x84, 0x84, 0, 27}, + {0x82, 0x82, 0, 26}, + {0xE0, 0x0, 1, 255}, + {0xBE, 0x0, 9, 255}, + {0xA8, 0xA9, 0, 10}, + {0xA6, 0xA6, 0, 9}, + {0xA3, 0xA4, 0, 7}, + {0xA1, 0xA1, 0, 6}, + {0x9F, 0x9F, 0, 5}, + {0x99, 0x99, 0, 4}, + {0x94, 0x94, 0, 3}, + {0x92, 0x92, 0, 2}, + {0x90, 0x90, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xBD, 0x0, 8, 255}, + {0x9A, 0x9B, 0, 62}, + {0x96, 0x29, 1, 255}, + {0x95, 0x95, 0, 61}, + {0x91, 0x14, 1, 255}, + {0x90, 0x90, 0, 60}, + {0x86, 0x87, 0, 58}, + {0x82, 0x0, 1, 255}, + {0x81, 0x81, 0, 57}, + {0xE0, 0x0, 2, 255}, + {0xBE, 0x10, 1, 255}, + {0xBD, 0x0, 16, 255}, + {0xBE, 0xBE, 0, 17}, + {0xBC, 0xBC, 0, 16}, + {0xBA, 0xBA, 0, 15}, + {0xB4, 0xB4, 0, 14}, + {0xB2, 0xB2, 0, 13}, + {0xA6, 0xA6, 0, 12}, + {0xA2, 0xA3, 0, 10}, + {0xA0, 0xA0, 0, 9}, + {0x98, 0x98, 0, 8}, + {0x96, 0x96, 0, 7}, + {0x93, 0x93, 0, 6}, + {0x91, 0x91, 0, 5}, + {0x8C, 0x8C, 0, 4}, + {0x8A, 0x8A, 0, 3}, + {0x84, 0x84, 0, 2}, + {0x82, 0x82, 0, 1}, + {0xB1, 0xB2, 0, 18}, + {0xE0, 0x0, 2, 255}, + {0xBE, 0x11, 1, 255}, + {0xBD, 0x0, 17, 255}, + {0xBE, 0xBE, 0, 37}, + {0xBC, 0xBC, 0, 36}, + {0xBA, 0xBA, 0, 35}, + {0xB4, 0xB4, 0, 34}, + {0xB2, 0xB2, 0, 33}, + {0xA6, 0xA6, 0, 32}, + {0xA2, 0xA3, 0, 30}, + {0xA0, 0xA0, 0, 29}, + {0x9D, 0x9D, 0, 28}, + {0x98, 0x98, 0, 27}, + {0x96, 0x96, 0, 26}, + {0x93, 0x93, 0, 25}, + {0x91, 0x91, 0, 24}, + {0x8C, 0x8C, 0, 23}, + {0x8A, 0x8A, 0, 22}, + {0x84, 0x84, 0, 21}, + {0x82, 0x82, 0, 20}, + {0xB2, 0xB2, 0, 38}, + {0xE0, 0x0, 2, 255}, + {0xBE, 0xF, 1, 255}, + {0xBD, 0x0, 15, 255}, + {0xBE, 0xBE, 0, 54}, + {0xBC, 0xBC, 0, 53}, + {0xBA, 0xBA, 0, 52}, + {0xB4, 0xB4, 0, 51}, + {0xB2, 0xB2, 0, 50}, + {0xA2, 0xA3, 0, 48}, + {0xA0, 0xA0, 0, 47}, + {0x98, 0x98, 0, 46}, + {0x96, 0x96, 0, 45}, + {0x93, 0x93, 0, 44}, + {0x91, 0x91, 0, 43}, + {0x8C, 0x8C, 0, 42}, + {0x8A, 0x8A, 0, 41}, + {0x84, 0x84, 0, 40}, + {0x82, 0x82, 0, 39}, + {0xB1, 0xB2, 0, 55}, + {0xE0, 0x0, 1, 255}, + {0xBD, 0x0, 10, 255}, + {0xA6, 0x20, 1, 255}, + {0xA4, 0xA4, 0, 52}, + {0xA1, 0xA1, 0, 51}, + {0x9E, 0x9F, 0, 49}, + {0x99, 0x99, 0, 48}, + {0x93, 0x11, 1, 255}, + {0x91, 0x0, 1, 255}, + {0x8F, 0x8F, 0, 47}, + {0x89, 0x89, 0, 46}, + {0x85, 0x85, 0, 45}, + {0xE0, 0x0, 1, 255}, + {0xBD, 0x0, 15, 255}, + {0xBE, 0xBE, 0, 16}, + {0xBC, 0xBC, 0, 15}, + {0xBA, 0xBA, 0, 14}, + {0xB4, 0xB4, 0, 13}, + {0xB2, 0xB2, 0, 12}, + {0xA6, 0xA6, 0, 11}, + {0xA2, 0xA3, 0, 9}, + {0xA0, 0xA0, 0, 8}, + {0x98, 0x98, 0, 7}, + {0x96, 0x96, 0, 6}, + {0x93, 0x93, 0, 5}, + {0x8C, 0x8C, 0, 4}, + {0x8A, 0x8A, 0, 3}, + {0x84, 0x84, 0, 2}, + {0x82, 0x82, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xBD, 0x0, 13, 255}, + {0xBE, 0xBE, 0, 29}, + {0xBC, 0xBC, 0, 28}, + {0xB4, 0xB4, 0, 27}, + {0xA6, 0xA6, 0, 26}, + {0xA0, 0xA0, 0, 25}, + {0x9D, 0x9D, 0, 24}, + {0x98, 0x98, 0, 23}, + {0x93, 0x93, 0, 22}, + {0x91, 0x91, 0, 21}, + {0x8C, 0x8C, 0, 20}, + {0x8A, 0x8A, 0, 19}, + {0x84, 0x84, 0, 18}, + {0x82, 0x82, 0, 17}, + {0xE0, 0x0, 1, 255}, + {0xBD, 0x0, 14, 255}, + {0xBC, 0xBC, 0, 44}, + {0xBA, 0xBA, 0, 43}, + {0xB4, 0xB4, 0, 42}, + {0xB2, 0xB2, 0, 41}, + {0xA6, 0xA6, 0, 40}, + {0xA2, 0xA3, 0, 38}, + {0xA0, 0xA0, 0, 37}, + {0x96, 0x96, 0, 36}, + {0x93, 0x93, 0, 35}, + {0x91, 0x91, 0, 34}, + {0x8C, 0x8C, 0, 33}, + {0x8A, 0x8A, 0, 32}, + {0x84, 0x84, 0, 31}, + {0x82, 0x82, 0, 30}, + {0xE0, 0x0, 1, 255}, + {0xBE, 0x0, 1, 255}, + {0x99, 0x99, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xBE, 0x0, 1, 255}, + {0xA4, 0xA5, 0, 1}, + {0xE0, 0x0, 2, 255}, + {0xBE, 0x9, 1, 255}, + {0xBD, 0x0, 3, 255}, + {0xB5, 0xB5, 0, 6}, + {0xB3, 0xB3, 0, 5}, + {0xB1, 0x0, 1, 4}, + {0xE0, 0x0, 2, 255}, + {0xBE, 0x2, 1, 255}, + {0xBD, 0x0, 2, 255}, + {0xB4, 0xB4, 0, 2}, + {0xB2, 0xB2, 0, 1}, + {0x80, 0x80, 0, 3}, + {0x80, 0x81, 0, 7}, + {0x7A, 0x7A, 0, 1}, + {0x7A, 0x7A, 0, 2}, + {0x5A, 0x5A, 0, 1}, + {0x62, 0x62, 0, 1}, + {0x62, 0x62, 0, 2}, + {0x42, 0x42, 0, 1}, + {0x70, 0x70, 0, 1}, + {0x70, 0x70, 0, 2}, + {0x50, 0x50, 0, 1}, + {0x79, 0x79, 0, 1}, + {0x79, 0x79, 0, 2}, + {0x59, 0x59, 0, 1}, + {0x73, 0x73, 0, 1}, + {0x73, 0x73, 0, 2}, + {0x53, 0x53, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x82, 0x82, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x83, 0x83, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x88, 0x88, 0, 2}, + {0x83, 0x83, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x8A, 0x8A, 0, 2}, + {0x88, 0x88, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x67, 0x67, 0, 2}, + {0x83, 0x83, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x67, 0x67, 0, 3}, + {0x47, 0x47, 0, 2}, + {0x83, 0x83, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x8C, 0x8C, 0, 2}, + {0x81, 0x81, 0, 1}, + {0xC5, 0x2, 1, 255}, + {0x7A, 0x0, 1, 255}, + {0xCC, 0x0, 1, 255}, + {0x8C, 0x8C, 0, 1}, + {0xBE, 0xBE, 0, 2}, + {0xC5, 0x4, 1, 255}, + {0x7A, 0x2, 1, 255}, + {0x5A, 0x0, 1, 255}, + {0xCC, 0x0, 1, 255}, + {0x8C, 0x8C, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x8C, 0x8C, 0, 2}, + {0xBD, 0xBE, 0, 3}, + {0xCE, 0x1, 1, 255}, + {0xC2, 0x0, 1, 255}, + {0x6A, 0x6A, 0, 3}, + {0xB7, 0xB7, 0, 1}, + {0x87, 0x87, 0, 2}, + {0xCE, 0x1, 1, 255}, + {0xC2, 0x0, 1, 255}, + {0x6A, 0x6A, 0, 4}, + {0x4A, 0x4A, 0, 3}, + {0xB7, 0xB7, 0, 1}, + {0x87, 0x87, 0, 2}, + {0x6A, 0x6A, 0, 1}, + {0x6A, 0x6A, 0, 2}, + {0x4A, 0x4A, 0, 1}, + {0x73, 0x73, 0, 2}, + {0x63, 0x0, 1, 255}, + {0x73, 0x73, 0, 1}, + {0x73, 0x73, 0, 4}, + {0x63, 0x1, 1, 255}, + {0x53, 0x53, 0, 3}, + {0x43, 0x0, 1, 255}, + {0x53, 0x53, 0, 1}, + {0x73, 0x73, 0, 2}, + {0x7A, 0x2, 1, 4}, + {0x64, 0x0, 1, 255}, + {0x7A, 0x0, 1, 2}, + {0x73, 0x73, 0, 1}, + {0x73, 0x73, 0, 3}, + {0x7A, 0x5, 1, 8}, + {0x64, 0x3, 1, 255}, + {0x5A, 0x2, 1, 7}, + {0x44, 0x0, 1, 255}, + {0x5A, 0x0, 1, 3}, + {0x53, 0x53, 0, 1}, + {0x53, 0x53, 0, 4}, + {0x7A, 0x0, 1, 5}, + {0x73, 0x73, 0, 2}, + {0x73, 0x73, 0, 6}, + {0x79, 0x79, 0, 2}, + {0x67, 0x0, 1, 255}, + {0x79, 0x79, 0, 1}, + {0x79, 0x79, 0, 4}, + {0x67, 0x1, 1, 255}, + {0x59, 0x59, 0, 3}, + {0x47, 0x0, 1, 255}, + {0x59, 0x59, 0, 1}, + {0x79, 0x79, 0, 2}, + {0xCE, 0x2, 1, 255}, + {0xC2, 0x1, 1, 255}, + {0x79, 0x79, 0, 4}, + {0x6C, 0x0, 1, 255}, + {0x79, 0x79, 0, 1}, + {0xB7, 0xB7, 0, 2}, + {0x87, 0x87, 0, 3}, + {0xCE, 0x3, 1, 255}, + {0xC2, 0x2, 1, 255}, + {0x79, 0x79, 0, 6}, + {0x6C, 0x1, 1, 255}, + {0x59, 0x59, 0, 5}, + {0x4C, 0x0, 1, 255}, + {0x59, 0x59, 0, 1}, + {0x79, 0x79, 0, 2}, + {0xB7, 0xB7, 0, 3}, + {0x87, 0x87, 0, 4}, + {0x79, 0x79, 0, 2}, + {0x6E, 0x0, 1, 255}, + {0x79, 0x79, 0, 1}, + {0x79, 0x79, 0, 4}, + {0x6E, 0x1, 1, 255}, + {0x59, 0x59, 0, 3}, + {0x4E, 0x0, 1, 255}, + {0x59, 0x59, 0, 1}, + {0x79, 0x79, 0, 2}, + {0x7A, 0x7A, 0, 2}, + {0x73, 0x0, 1, 255}, + {0x7A, 0x7A, 0, 1}, + {0x7A, 0x7A, 0, 4}, + {0x73, 0x1, 1, 255}, + {0x5A, 0x5A, 0, 3}, + {0x53, 0x0, 1, 255}, + {0x5A, 0x5A, 0, 1}, + {0x7A, 0x7A, 0, 2}, + {0x79, 0x79, 0, 2}, + {0x74, 0x0, 1, 255}, + {0x79, 0x79, 0, 1}, + {0x79, 0x79, 0, 4}, + {0x74, 0x1, 1, 255}, + {0x59, 0x59, 0, 3}, + {0x54, 0x0, 1, 255}, + {0x59, 0x59, 0, 1}, + {0x79, 0x79, 0, 2}, + {0x7A, 0x0, 1, 255}, + {0x73, 0x73, 0, 2}, + {0x73, 0x73, 0, 1}, + {0x7A, 0x1, 1, 255}, + {0x73, 0x73, 0, 4}, + {0x5A, 0x0, 1, 255}, + {0x53, 0x53, 0, 3}, + {0x53, 0x53, 0, 1}, + {0x73, 0x73, 0, 2}, + {0xD6, 0x0, 1, 255}, + {0x82, 0x82, 0, 1}, + {0x77, 0x77, 0, 3}, + {0x68, 0x68, 0, 2}, + {0x62, 0x62, 0, 1}, + {0x77, 0x77, 0, 6}, + {0x68, 0x68, 0, 5}, + {0x62, 0x62, 0, 4}, + {0x57, 0x57, 0, 3}, + {0x48, 0x48, 0, 2}, + {0x42, 0x42, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0xA3, 0xA3, 0, 1}, + {0x77, 0x77, 0, 2}, + {0x70, 0x70, 0, 1}, + {0x77, 0x77, 0, 4}, + {0x70, 0x70, 0, 3}, + {0x57, 0x57, 0, 2}, + {0x50, 0x50, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x79, 0x79, 0, 3}, + {0x77, 0x77, 0, 2}, + {0x87, 0x87, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x79, 0x79, 0, 5}, + {0x77, 0x77, 0, 4}, + {0x59, 0x59, 0, 3}, + {0x57, 0x57, 0, 2}, + {0x87, 0x87, 0, 1}, + {0xCC, 0x0, 3, 255}, + {0x8A, 0x8A, 0, 3}, + {0x88, 0x88, 0, 2}, + {0x81, 0x81, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x81, 0x81, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x88, 0x88, 0, 2}, + {0x81, 0x81, 0, 1}, + {0xE3, 0x0, 2, 255}, + {0x83, 0x1, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x9D, 0x9D, 0, 1}, + {0xBC, 0xBC, 0, 2}, + {0xE3, 0x0, 1, 255}, + {0x83, 0x0, 1, 255}, + {0xBC, 0xBD, 0, 1}, + {0xE3, 0x0, 2, 255}, + {0x83, 0x7, 1, 255}, + {0x82, 0x0, 2, 255}, + {0x9D, 0x9D, 0, 3}, + {0x99, 0x0, 1, 255}, + {0xE3, 0x0, 2, 255}, + {0x83, 0x1, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x9D, 0x9D, 0, 1}, + {0xBC, 0xBC, 0, 2}, + {0xBC, 0xBC, 0, 4}, + {0xE3, 0x0, 2, 255}, + {0x83, 0x4, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x99, 0x0, 1, 255}, + {0xE3, 0x0, 1, 255}, + {0x83, 0x0, 1, 255}, + {0xBC, 0xBD, 0, 1}, + {0xBC, 0xBD, 0, 3}, + {0xE3, 0x0, 2, 255}, + {0x83, 0xE, 1, 255}, + {0x82, 0x0, 3, 255}, + {0x9E, 0x9E, 0, 6}, + {0x9D, 0x8, 1, 5}, + {0x99, 0x0, 1, 255}, + {0xE3, 0x0, 2, 255}, + {0x83, 0x4, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x9D, 0x0, 1, 2}, + {0xE3, 0x0, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x99, 0x99, 0, 1}, + {0xBC, 0xBC, 0, 3}, + {0xE3, 0x0, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x99, 0x99, 0, 4}, + {0xBC, 0xBC, 0, 7}, + {0xE3, 0x0, 2, 255}, + {0x83, 0x8, 2, 255}, + {0x82, 0x0, 1, 255}, + {0x99, 0x0, 1, 255}, + {0xE3, 0x0, 1, 255}, + {0x83, 0x0, 2, 255}, + {0xBD, 0x0, 1, 3}, + {0xBC, 0xBD, 0, 2}, + {0xE3, 0x0, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x99, 0x99, 0, 1}, + {0xBD, 0x0, 1, 6}, + {0xBC, 0xBE, 0, 5}, + {0xE3, 0x0, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x99, 0x99, 0, 4}, + {0xE3, 0x0, 1, 255}, + {0x83, 0x0, 2, 255}, + {0xBD, 0x0, 1, 3}, + {0xBC, 0xBE, 0, 2}, + {0xE3, 0x0, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x99, 0x99, 0, 1}, + {0xE3, 0x0, 2, 255}, + {0x83, 0x1, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x9D, 0x9E, 0, 1}, + {0xBC, 0xBC, 0, 3}, + {0xE3, 0x0, 1, 255}, + {0x83, 0x0, 1, 255}, + {0xBC, 0xBE, 0, 1}, + {0xE3, 0x0, 2, 255}, + {0x83, 0x17, 1, 255}, + {0x82, 0x0, 4, 255}, + {0x9E, 0x9E, 0, 9}, + {0x9D, 0x10, 1, 8}, + {0x9A, 0x8, 1, 255}, + {0x99, 0x0, 1, 255}, + {0xE3, 0x0, 2, 255}, + {0x83, 0x4, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x9D, 0x0, 1, 3}, + {0xE3, 0x0, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x99, 0x99, 0, 1}, + {0xBC, 0xBC, 0, 4}, + {0xE3, 0x0, 2, 255}, + {0x83, 0x4, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x9D, 0x0, 1, 5}, + {0xE3, 0x0, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x99, 0x99, 0, 2}, + {0xBC, 0xBC, 0, 6}, + {0xE3, 0x0, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x99, 0x99, 0, 7}, + {0xBC, 0xBC, 0, 10}, + {0xE3, 0x0, 2, 255}, + {0x83, 0x10, 2, 255}, + {0x82, 0x0, 2, 255}, + {0x9A, 0x7, 1, 255}, + {0x99, 0x0, 1, 255}, + {0xE3, 0x0, 1, 255}, + {0x83, 0x0, 2, 255}, + {0xBD, 0x0, 1, 4}, + {0xBC, 0xBD, 0, 3}, + {0xE3, 0x0, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x99, 0x99, 0, 1}, + {0xE3, 0x0, 1, 255}, + {0x83, 0x0, 2, 255}, + {0xBD, 0x0, 1, 6}, + {0xBC, 0xBD, 0, 5}, + {0xE3, 0x0, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x99, 0x99, 0, 2}, + {0xBD, 0x0, 1, 9}, + {0xBC, 0xBE, 0, 8}, + {0xE3, 0x0, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x99, 0x99, 0, 7}, + {0xE3, 0x0, 2, 255}, + {0x83, 0x5, 1, 255}, + {0x82, 0x0, 2, 255}, + {0x9E, 0x9E, 0, 3}, + {0x9D, 0x0, 1, 2}, + {0xE3, 0x0, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x99, 0x99, 0, 1}, + {0xBC, 0xBC, 0, 4}, + {0xE3, 0x0, 1, 255}, + {0x82, 0x0, 1, 255}, + {0x9D, 0x9D, 0, 1}, + {0xE3, 0x0, 1, 255}, + {0x83, 0x0, 1, 255}, + {0xBD, 0xBD, 0, 1}, + {0x27, 0x27, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x9F, 0x0, 1, 255}, + {0x8C, 0x8C, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x9F, 0x0, 1, 255}, + {0x86, 0x87, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x9F, 0x0, 1, 255}, + {0x86, 0x86, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x9F, 0x0, 1, 255}, + {0x87, 0x87, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xA5, 0x0, 1, 255}, + {0x8D, 0x0, 1, 255}, + {0xE0, 0x0, 1, 255}, + {0xA4, 0x0, 1, 255}, + {0xB7, 0xB7, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x83, 0x83, 0, 3}, + {0x80, 0x81, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0xA8, 0xA8, 0, 2}, + {0x87, 0x87, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0xA8, 0xA8, 0, 2}, + {0x84, 0x84, 0, 1}, + {0xCE, 0x2, 1, 255}, + {0xCC, 0x1, 1, 255}, + {0xC2, 0x0, 1, 255}, + {0xB7, 0xB7, 0, 1}, + {0xA7, 0xA7, 0, 2}, + {0x87, 0x87, 0, 3}, + {0xE0, 0x0, 1, 255}, + {0xB5, 0x0, 1, 255}, + {0x8D, 0x0, 1, 255}, + {0xE2, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0x8D, 0x8D, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xB5, 0x0, 1, 255}, + {0x8D, 0x0, 1, 255}, + {0xE2, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0x8D, 0x0, 1, 255}, + {0x20, 0x20, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xB5, 0x0, 1, 255}, + {0x8D, 0x8D, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xA5, 0x0, 1, 255}, + {0x8D, 0x0, 1, 255}, + {0xE0, 0x0, 1, 255}, + {0xA4, 0x0, 1, 255}, + {0x9E, 0x9E, 0, 1}, + {0xCC, 0x1, 1, 255}, + {0xC4, 0x0, 1, 255}, + {0xA6, 0xA7, 0, 1}, + {0x87, 0x87, 0, 3}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 2, 255}, + {0xBA, 0xBA, 0, 3}, + {0xB9, 0x0, 1, 2}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0x99, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0x84, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB8, 0xB8, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 2, 255}, + {0xBA, 0x0, 1, 3}, + {0xB9, 0xBA, 0, 2}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xAF, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0x95, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 3, 255}, + {0xBA, 0xBA, 0, 4}, + {0xB9, 0x9, 1, 3}, + {0x80, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBB, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xAC, 0xAC, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0x98, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 2}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0x84, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB8, 0xB8, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 2, 255}, + {0xBA, 0xBA, 0, 3}, + {0xB9, 0x0, 1, 2}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0x99, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xAE, 0xAE, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 2, 255}, + {0xAF, 0x0, 1, 255}, + {0xAE, 0xAE, 0, 2}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB6, 0xB6, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 31, 255}, + {0xB1, 0x5A, 1, 255}, + {0x9F, 0x57, 1, 255}, + {0x9E, 0x54, 1, 255}, + {0x9C, 0x51, 1, 255}, + {0x9B, 0x4E, 1, 255}, + {0x9A, 0x4B, 1, 255}, + {0x99, 0x48, 1, 255}, + {0x98, 0x45, 1, 255}, + {0x97, 0x42, 1, 255}, + {0x96, 0x3F, 1, 255}, + {0x95, 0x3C, 1, 255}, + {0x94, 0x39, 1, 255}, + {0x93, 0x36, 1, 255}, + {0x92, 0x33, 1, 255}, + {0x91, 0x30, 1, 255}, + {0x90, 0x2D, 1, 255}, + {0x8F, 0x2A, 1, 255}, + {0x8E, 0x27, 1, 255}, + {0x8D, 0x24, 1, 255}, + {0x8C, 0x21, 1, 255}, + {0x8B, 0x1E, 1, 255}, + {0x8A, 0x1B, 1, 255}, + {0x89, 0x18, 1, 255}, + {0x87, 0x15, 1, 255}, + {0x86, 0x12, 1, 255}, + {0x85, 0xF, 1, 255}, + {0x84, 0xC, 1, 255}, + {0x83, 0x9, 1, 255}, + {0x82, 0x6, 1, 255}, + {0x81, 0x3, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 61}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 63}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 65}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 67}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 69}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 71}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 73}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 75}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 77}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 79}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 81}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 83}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 85}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 87}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 89}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 91}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 93}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 95}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 97}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 99}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 101}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 103}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 105}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 107}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 109}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 111}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 113}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 115}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 117}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 119}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xAC, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 30, 255}, + {0x9F, 0x57, 1, 255}, + {0x9E, 0x54, 1, 255}, + {0x9C, 0x51, 1, 255}, + {0x9B, 0x4E, 1, 255}, + {0x9A, 0x4B, 1, 255}, + {0x99, 0x48, 1, 255}, + {0x98, 0x45, 1, 255}, + {0x97, 0x42, 1, 255}, + {0x96, 0x3F, 1, 255}, + {0x95, 0x3C, 1, 255}, + {0x94, 0x39, 1, 255}, + {0x93, 0x36, 1, 255}, + {0x92, 0x33, 1, 255}, + {0x91, 0x30, 1, 255}, + {0x90, 0x2D, 1, 255}, + {0x8F, 0x2A, 1, 255}, + {0x8E, 0x27, 1, 255}, + {0x8D, 0x24, 1, 255}, + {0x8C, 0x21, 1, 255}, + {0x8B, 0x1E, 1, 255}, + {0x8A, 0x1B, 1, 255}, + {0x89, 0x18, 1, 255}, + {0x87, 0x15, 1, 255}, + {0x86, 0x12, 1, 255}, + {0x85, 0xF, 1, 255}, + {0x84, 0xC, 1, 255}, + {0x83, 0x9, 1, 255}, + {0x82, 0x6, 1, 255}, + {0x81, 0x3, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 3}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 5}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 7}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 9}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 11}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 13}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 15}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 17}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 19}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 21}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 23}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 25}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 27}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 29}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 31}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 33}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 35}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 37}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 39}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 41}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 43}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 45}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 47}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 49}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 51}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 53}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 55}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 57}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 59}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 36, 255}, + {0xAC, 0xF7, 1, 197}, + {0xAB, 0x69, 1, 196}, + {0xA1, 0x66, 1, 255}, + {0xA0, 0x63, 1, 255}, + {0x9F, 0x60, 1, 255}, + {0x9E, 0x5D, 1, 255}, + {0x9D, 0x5A, 1, 255}, + {0x9C, 0x57, 1, 255}, + {0x9B, 0x54, 1, 255}, + {0x9A, 0x51, 1, 255}, + {0x99, 0x4E, 1, 255}, + {0x98, 0x4B, 1, 255}, + {0x97, 0x48, 1, 255}, + {0x96, 0x45, 1, 255}, + {0x95, 0x42, 1, 255}, + {0x94, 0x3F, 1, 255}, + {0x93, 0x3C, 1, 255}, + {0x92, 0x39, 1, 255}, + {0x91, 0x36, 1, 255}, + {0x90, 0x33, 1, 255}, + {0x8F, 0x30, 1, 255}, + {0x8E, 0x2D, 1, 255}, + {0x8D, 0x2A, 1, 255}, + {0x8C, 0x27, 1, 255}, + {0x8B, 0x24, 1, 255}, + {0x8A, 0x21, 1, 255}, + {0x89, 0x1E, 1, 255}, + {0x88, 0x1B, 1, 255}, + {0x87, 0x18, 1, 255}, + {0x86, 0x15, 1, 255}, + {0x85, 0x12, 1, 255}, + {0x84, 0xC, 1, 255}, + {0x83, 0x9, 1, 255}, + {0x82, 0x6, 1, 255}, + {0x81, 0x3, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 131}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 133}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 135}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 137}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0x0, 1, 139}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xB9, 0, 4}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 140}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 142}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 144}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 146}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 147}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 149}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 151}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 153}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 155}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 157}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 159}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 161}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 163}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 165}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 167}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 169}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 171}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 173}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 175}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 177}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 179}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 181}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 183}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 185}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 187}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 188}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 190}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 192}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 193}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 35, 255}, + {0xBA, 0xBA, 0, 194}, + {0xA1, 0x66, 1, 255}, + {0xA0, 0x63, 1, 255}, + {0x9F, 0x60, 1, 255}, + {0x9E, 0x5D, 1, 255}, + {0x9D, 0x5A, 1, 255}, + {0x9C, 0x57, 1, 255}, + {0x9B, 0x54, 1, 255}, + {0x9A, 0x51, 1, 255}, + {0x99, 0x4E, 1, 255}, + {0x98, 0x4B, 1, 255}, + {0x97, 0x48, 1, 255}, + {0x96, 0x45, 1, 255}, + {0x95, 0x42, 1, 255}, + {0x94, 0x3F, 1, 255}, + {0x93, 0x3C, 1, 255}, + {0x92, 0x39, 1, 255}, + {0x91, 0x36, 1, 255}, + {0x90, 0x33, 1, 255}, + {0x8F, 0x30, 1, 255}, + {0x8E, 0x2D, 1, 255}, + {0x8D, 0x2A, 1, 255}, + {0x8C, 0x27, 1, 255}, + {0x8B, 0x24, 1, 255}, + {0x8A, 0x21, 1, 255}, + {0x89, 0x1E, 1, 255}, + {0x88, 0x1B, 1, 255}, + {0x87, 0x18, 1, 255}, + {0x86, 0x15, 1, 255}, + {0x85, 0x12, 1, 255}, + {0x84, 0xC, 1, 255}, + {0x83, 0x9, 1, 255}, + {0x82, 0x6, 1, 255}, + {0x81, 0x3, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 5}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 7}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 9}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 11}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0x0, 1, 13}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xB9, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 14}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 16}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 18}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 20}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 21}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 23}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 25}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 27}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 29}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 31}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 33}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 35}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 37}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 39}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 41}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 43}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 45}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 47}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 49}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 51}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 53}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 55}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 57}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 59}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 61}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 62}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 64}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 66}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 67}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 35, 255}, + {0xBA, 0xBA, 0, 195}, + {0xA1, 0x6A, 1, 255}, + {0xA0, 0x67, 1, 255}, + {0x9F, 0x64, 1, 255}, + {0x9E, 0x61, 1, 255}, + {0x9D, 0x5E, 1, 255}, + {0x9C, 0x5B, 1, 255}, + {0x9B, 0x58, 1, 255}, + {0x9A, 0x55, 1, 255}, + {0x99, 0x52, 1, 255}, + {0x98, 0x4F, 1, 255}, + {0x97, 0x4C, 1, 255}, + {0x96, 0x49, 1, 255}, + {0x95, 0x46, 1, 255}, + {0x94, 0x43, 1, 255}, + {0x93, 0x40, 1, 255}, + {0x92, 0x3D, 1, 255}, + {0x91, 0x3A, 1, 255}, + {0x90, 0x37, 1, 255}, + {0x8F, 0x34, 1, 255}, + {0x8E, 0x31, 1, 255}, + {0x8D, 0x2E, 1, 255}, + {0x8C, 0x2B, 1, 255}, + {0x8B, 0x28, 1, 255}, + {0x8A, 0x25, 1, 255}, + {0x89, 0x22, 1, 255}, + {0x88, 0x1F, 1, 255}, + {0x87, 0x1C, 1, 255}, + {0x86, 0x19, 1, 255}, + {0x85, 0x16, 1, 255}, + {0x84, 0x10, 1, 255}, + {0x83, 0xD, 1, 255}, + {0x82, 0xA, 1, 255}, + {0x81, 0x7, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 2, 255}, + {0xBA, 0x0, 1, 69}, + {0xB9, 0xBA, 0, 68}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBB, 0xBB, 0, 2}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 70}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 72}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 74}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0x0, 1, 76}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xB9, 0, 3}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 77}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 79}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 81}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 83}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 84}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 86}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 88}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 90}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 92}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 94}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 96}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 98}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 100}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 102}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 104}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 106}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 108}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 110}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 112}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 114}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 116}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 118}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 120}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 122}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 124}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 125}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 127}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 129}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 130}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 36, 255}, + {0xB6, 0xFE, 1, 134}, + {0xAF, 0x71, 1, 133}, + {0xA1, 0x6E, 1, 255}, + {0xA0, 0x6B, 1, 255}, + {0x9F, 0x68, 1, 255}, + {0x9E, 0x65, 1, 255}, + {0x9D, 0x62, 1, 255}, + {0x9C, 0x5F, 1, 255}, + {0x9B, 0x5C, 1, 255}, + {0x9A, 0x59, 1, 255}, + {0x99, 0x4E, 1, 255}, + {0x98, 0x4B, 1, 255}, + {0x97, 0x48, 1, 255}, + {0x96, 0x45, 1, 255}, + {0x95, 0x42, 1, 255}, + {0x94, 0x3F, 1, 255}, + {0x93, 0x3C, 1, 255}, + {0x92, 0x39, 1, 255}, + {0x91, 0x36, 1, 255}, + {0x90, 0x33, 1, 255}, + {0x8F, 0x30, 1, 255}, + {0x8E, 0x2D, 1, 255}, + {0x8D, 0x2A, 1, 255}, + {0x8C, 0x27, 1, 255}, + {0x8B, 0x24, 1, 255}, + {0x8A, 0x21, 1, 255}, + {0x89, 0x1E, 1, 255}, + {0x88, 0x1B, 1, 255}, + {0x87, 0x18, 1, 255}, + {0x86, 0x15, 1, 255}, + {0x85, 0x12, 1, 255}, + {0x84, 0xC, 1, 255}, + {0x83, 0x9, 1, 255}, + {0x82, 0x6, 1, 255}, + {0x81, 0x3, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 68}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 70}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 72}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 74}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0x0, 1, 76}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xB9, 0, 2}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 77}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 79}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 81}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 83}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 84}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 86}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 88}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 90}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 92}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 94}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 96}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 98}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 100}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 102}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 104}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 106}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 108}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 110}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 112}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 114}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 3, 255}, + {0xBA, 0x3, 1, 117}, + {0xB9, 0xBA, 0, 116}, + {0xB7, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 3}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB8, 0xB8, 0, 4}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 118}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 120}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 122}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 124}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 125}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 127}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 129}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 130}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 34, 255}, + {0xA1, 0x66, 1, 255}, + {0xA0, 0x63, 1, 255}, + {0x9F, 0x60, 1, 255}, + {0x9E, 0x5D, 1, 255}, + {0x9D, 0x5A, 1, 255}, + {0x9C, 0x57, 1, 255}, + {0x9B, 0x54, 1, 255}, + {0x9A, 0x51, 1, 255}, + {0x99, 0x4E, 1, 255}, + {0x98, 0x4B, 1, 255}, + {0x97, 0x48, 1, 255}, + {0x96, 0x45, 1, 255}, + {0x95, 0x42, 1, 255}, + {0x94, 0x3F, 1, 255}, + {0x93, 0x3C, 1, 255}, + {0x92, 0x39, 1, 255}, + {0x91, 0x36, 1, 255}, + {0x90, 0x33, 1, 255}, + {0x8F, 0x30, 1, 255}, + {0x8E, 0x2D, 1, 255}, + {0x8D, 0x2A, 1, 255}, + {0x8C, 0x27, 1, 255}, + {0x8B, 0x24, 1, 255}, + {0x8A, 0x21, 1, 255}, + {0x89, 0x1E, 1, 255}, + {0x88, 0x1B, 1, 255}, + {0x87, 0x18, 1, 255}, + {0x86, 0x15, 1, 255}, + {0x85, 0x12, 1, 255}, + {0x84, 0xC, 1, 255}, + {0x83, 0x9, 1, 255}, + {0x82, 0x6, 1, 255}, + {0x81, 0x3, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 5}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 7}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 9}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 11}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0x0, 1, 13}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xB9, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 14}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 16}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 18}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 20}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 21}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 23}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 25}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 27}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 29}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 31}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 33}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 35}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 37}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 39}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 41}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 43}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 45}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 47}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 49}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 51}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 53}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 55}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 57}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 59}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 61}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 62}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 64}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 66}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 67}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB7, 0xB8, 0, 131}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 34, 255}, + {0xA1, 0x66, 1, 255}, + {0xA0, 0x63, 1, 255}, + {0x9F, 0x60, 1, 255}, + {0x9E, 0x5D, 1, 255}, + {0x9D, 0x5A, 1, 255}, + {0x9C, 0x57, 1, 255}, + {0x9B, 0x54, 1, 255}, + {0x9A, 0x51, 1, 255}, + {0x99, 0x4E, 1, 255}, + {0x98, 0x4B, 1, 255}, + {0x97, 0x48, 1, 255}, + {0x96, 0x45, 1, 255}, + {0x95, 0x42, 1, 255}, + {0x94, 0x3F, 1, 255}, + {0x93, 0x3C, 1, 255}, + {0x92, 0x39, 1, 255}, + {0x91, 0x36, 1, 255}, + {0x90, 0x33, 1, 255}, + {0x8F, 0x30, 1, 255}, + {0x8E, 0x2D, 1, 255}, + {0x8D, 0x2A, 1, 255}, + {0x8C, 0x27, 1, 255}, + {0x8B, 0x24, 1, 255}, + {0x8A, 0x21, 1, 255}, + {0x89, 0x1E, 1, 255}, + {0x88, 0x1B, 1, 255}, + {0x87, 0x18, 1, 255}, + {0x86, 0x15, 1, 255}, + {0x85, 0x12, 1, 255}, + {0x84, 0xC, 1, 255}, + {0x83, 0x9, 1, 255}, + {0x82, 0x6, 1, 255}, + {0x81, 0x3, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 2}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 4}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 6}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 8}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0x0, 1, 10}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xB9, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 11}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 13}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 15}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 17}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 18}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 20}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 22}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 24}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 26}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 28}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 30}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 32}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 34}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 36}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 38}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 40}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 42}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 44}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 46}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 48}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 50}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 52}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 54}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 56}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 58}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 59}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 61}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 63}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 64}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 35, 255}, + {0xB6, 0x71, 1, 69}, + {0xA1, 0x6E, 1, 255}, + {0xA0, 0x6B, 1, 255}, + {0x9F, 0x68, 1, 255}, + {0x9E, 0x65, 1, 255}, + {0x9D, 0x62, 1, 255}, + {0x9C, 0x5F, 1, 255}, + {0x9B, 0x5C, 1, 255}, + {0x9A, 0x59, 1, 255}, + {0x99, 0x4E, 1, 255}, + {0x98, 0x4B, 1, 255}, + {0x97, 0x48, 1, 255}, + {0x96, 0x45, 1, 255}, + {0x95, 0x42, 1, 255}, + {0x94, 0x3F, 1, 255}, + {0x93, 0x3C, 1, 255}, + {0x92, 0x39, 1, 255}, + {0x91, 0x36, 1, 255}, + {0x90, 0x33, 1, 255}, + {0x8F, 0x30, 1, 255}, + {0x8E, 0x2D, 1, 255}, + {0x8D, 0x2A, 1, 255}, + {0x8C, 0x27, 1, 255}, + {0x8B, 0x24, 1, 255}, + {0x8A, 0x21, 1, 255}, + {0x89, 0x1E, 1, 255}, + {0x88, 0x1B, 1, 255}, + {0x87, 0x18, 1, 255}, + {0x86, 0x15, 1, 255}, + {0x85, 0x12, 1, 255}, + {0x84, 0xC, 1, 255}, + {0x83, 0x9, 1, 255}, + {0x82, 0x6, 1, 255}, + {0x81, 0x3, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 4}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 6}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 8}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 10}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0x0, 1, 12}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xB9, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 13}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 15}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 17}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 19}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 20}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 22}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 24}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 26}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 28}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 30}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 32}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 34}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 36}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 38}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 40}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 42}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 44}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 46}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 48}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 50}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 3, 255}, + {0xBA, 0x3, 1, 53}, + {0xB9, 0xBA, 0, 52}, + {0xB7, 0x0, 1, 255}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 2}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB8, 0xB8, 0, 3}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 54}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 56}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 58}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 60}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 61}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xBA, 0, 63}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 65}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 66}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB7, 0xB8, 0, 67}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB8, 0xB8, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0x0, 1, 2}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xB9, 0xB9, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBA, 0xBA, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 2, 255}, + {0xBE, 0xBE, 0, 3}, + {0xBD, 0x0, 1, 2}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBE, 0xBE, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xBE, 0xBE, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xAD, 0x0, 1, 255}, + {0x8D, 0x0, 1, 255}, + {0xE0, 0x0, 1, 255}, + {0xAC, 0x0, 1, 255}, + {0xB7, 0xB7, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x87, 0x87, 0, 2}, + {0x81, 0x81, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x86, 0x86, 0, 2}, + {0x82, 0x82, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0xA6, 0xA7, 0, 1}, + {0xCC, 0x0, 4, 255}, + {0x8A, 0x8A, 0, 5}, + {0x87, 0x88, 0, 3}, + {0x83, 0x83, 0, 2}, + {0x81, 0x81, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x83, 0x83, 0, 2}, + {0x81, 0x81, 0, 1}, + {0xCC, 0x0, 4, 255}, + {0xA8, 0xA8, 0, 5}, + {0x8B, 0x8B, 0, 4}, + {0x88, 0x88, 0, 3}, + {0x82, 0x83, 0, 1}, + {0x72, 0x72, 0, 1}, + {0x72, 0x72, 0, 2}, + {0x52, 0x52, 0, 1}, + {0xCC, 0x0, 3, 255}, + {0x8B, 0x8B, 0, 3}, + {0x88, 0x88, 0, 2}, + {0x82, 0x82, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xAF, 0x0, 1, 255}, + {0x8D, 0x0, 1, 3}, + {0xE0, 0x0, 1, 255}, + {0xAE, 0x0, 1, 255}, + {0xB7, 0x0, 1, 2}, + {0xE0, 0x0, 1, 255}, + {0xAF, 0x0, 1, 255}, + {0x8D, 0x8D, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xAF, 0x0, 1, 255}, + {0x8D, 0x8D, 0, 1}, + {0xE0, 0x0, 2, 255}, + {0xB9, 0x1, 1, 255}, + {0xB8, 0x0, 1, 255}, + {0xB2, 0xB2, 0, 1}, + {0x85, 0x85, 0, 2}, + {0xCC, 0x0, 2, 255}, + {0x84, 0x84, 0, 2}, + {0x81, 0x81, 0, 1}, + {0xDA, 0x0, 1, 255}, + {0xBE, 0xBE, 0, 1}, + {0xDA, 0x1, 1, 255}, + {0xD9, 0x0, 1, 255}, + {0x94, 0x94, 0, 1}, + {0xBE, 0xBE, 0, 2}, + {0xCC, 0x0, 2, 255}, + {0x9B, 0x9B, 0, 2}, + {0x82, 0x82, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x9B, 0x9B, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x61, 0x61, 0, 2}, + {0x88, 0x0, 1, 255}, + {0x61, 0x0, 1, 255}, + {0xCC, 0x0, 1, 255}, + {0x88, 0x88, 0, 1}, + {0xC3, 0x0, 1, 255}, + {0xA4, 0xA4, 0, 1}, + {0x65, 0x65, 0, 1}, + {0x69, 0x69, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x6F, 0x6F, 0, 2}, + {0x88, 0x0, 1, 255}, + {0x6F, 0x0, 1, 255}, + {0xCC, 0x0, 1, 255}, + {0x88, 0x88, 0, 1}, + {0xC3, 0x0, 1, 255}, + {0xB6, 0xB6, 0, 1}, + {0x63, 0x0, 1, 255}, + {0x68, 0x68, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x75, 0x75, 0, 2}, + {0x88, 0x0, 1, 255}, + {0x75, 0x0, 1, 255}, + {0xCC, 0x0, 1, 255}, + {0x88, 0x88, 0, 1}, + {0xC3, 0x0, 1, 255}, + {0xBC, 0xBC, 0, 1}, + {0xCC, 0x0, 3, 255}, + {0x8C, 0x8C, 0, 4}, + {0x84, 0x84, 0, 3}, + {0x80, 0x81, 0, 1}, + {0xCC, 0x0, 4, 255}, + {0x8C, 0x8C, 0, 8}, + {0x84, 0x84, 0, 7}, + {0x82, 0x0, 1, 255}, + {0x80, 0x81, 0, 5}, + {0xCC, 0x0, 3, 255}, + {0x8C, 0x8C, 0, 4}, + {0x84, 0x84, 0, 3}, + {0x80, 0x81, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x8C, 0x8C, 0, 2}, + {0x84, 0x84, 0, 1}, + {0xCC, 0x0, 4, 255}, + {0x8C, 0x8C, 0, 9}, + {0x88, 0x0, 1, 8}, + {0x84, 0x84, 0, 7}, + {0x80, 0x81, 0, 5}, + {0xCC, 0x0, 3, 255}, + {0x8C, 0x8C, 0, 4}, + {0x84, 0x84, 0, 3}, + {0x80, 0x81, 0, 1}, +} + +// Total size of mainTable is 1244612 bytes diff --git a/vendor/golang.org/x/text/collate/tools/colcmp/Makefile b/vendor/golang.org/x/text/collate/tools/colcmp/Makefile new file mode 100644 index 0000000000..1cf7822633 --- /dev/null +++ b/vendor/golang.org/x/text/collate/tools/colcmp/Makefile @@ -0,0 +1,7 @@ +# Copyright 2012 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +chars: + go run ../../maketables.go -tables=chars -package=main > chars.go + gofmt -w -s chars.go diff --git a/vendor/golang.org/x/text/collate/tools/colcmp/chars.go b/vendor/golang.org/x/text/collate/tools/colcmp/chars.go new file mode 100644 index 0000000000..9f3b9d77ff --- /dev/null +++ b/vendor/golang.org/x/text/collate/tools/colcmp/chars.go @@ -0,0 +1,1156 @@ +// Generated by running +// maketables -root=http://unicode.org/Public/UCA/6.2.0/CollationAuxiliary.zip -cldr=http://www.unicode.org/Public/cldr/23/core.zip +// DO NOT EDIT +// TODO: implement more compact representation for sparse blocks. + +package main + +type exemplarType int + +const ( + exCharacters exemplarType = iota + exContractions + exPunctuation + exAuxiliary + exCurrency + exIndex + exN +) + +var exemplarCharacters = map[string][exN]string{ + "aa": { + 0: "a b t s e c k x i d q r f g o l m n u w h y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "j p v z", + 5: "A B T S E C K X I D Q R F G O L M N U W H Y", + }, + "af": { + 0: "a á â b c d e é è ê ë f g h i î ï j k l m n o ô ö p q r s t u û v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "á à â ä ã æ ç é è ê ë í ì î ï ó ò ô ö ú ù û ü ý", + }, + "agq": { + 0: "a à â ǎ ā b c d e è ê ě ē ɛ ɛ̀ ɛ̂ ɛ̌ ɛ̄ f g h i ì î ǐ ī ɨ ɨ̀ ɨ̂ ɨ̌ ɨ̄ k l m n ŋ o ò ô ǒ ō ɔ ɔ̀ ɔ̂ ɔ̌ ɔ̄ p s t u ù û ǔ ū ʉ ʉ̀ ʉ̂ ʉ̌ ʉ̄ v w y z ʔ", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q r x", + 5: "A B C D E Ɛ F G H I Ɨ K L M N Ŋ O Ɔ P S T U Ʉ V W Y Z ʔ", + }, + "ak": { + 0: "a b d e ɛ f g h i k l m n o ɔ p r s t u w y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "c j q v z", + 5: "A B C D E Ɛ F G H I J K L M N O Ɔ P Q R S T U V W X Y Z", + }, + "am": { + 0: "፟ ሀ ሀ ሁ ሂ ሃ ሄ ህ ሆ ለ ለ ሉ ሊ ላ ሌ ል ሎ ሏ ሐ ሑ ሒ ሓ ሔ ሕ ሖ ሗ መ ሙ ሚ ማ ሜ ም ሞ ሟ ሠ ሡ ሢ ሣ ሤ ሥ ሦ ሧ ረ ሩ ሪ ራ ሬ ር ሮ ሯ ሰ ሱ ሲ ሳ ሴ ስ ሶ ሷ ሸ ሹ ሺ ሻ ሼ ሽ ሾ ሿ ቀ ቁ ቂ ቃ ቄ ቅ ቆ ቈ ቊ ቊ ቋ ቌ ቍ በ በ ቡ ቢ ባ ቤ ብ ቦ ቧ ቨ ቩ ቪ ቫ ቬ ቭ ቮ ቯ ተ ቱ ቲ ታ ቴ ት ቶ ቷ ቸ ቹ ቺ ቻ ቼ ች ቾ ቿ ኀ ኁ ኂ ኃ ኄ ኅ ኆ ኈ ኊ ኊ ኋ ኌ ኍ ነ ነ ኑ ኒ ና ኔ ን ኖ ኗ ኘ ኙ ኚ ኛ ኜ ኝ ኞ ኟ አ ኡ ኢ ኣ ኤ እ ኦ ኧ ከ ኩ ኪ ካ ኬ ክ ኮ ኰ ኲ ኲ ኳ ኴ ኵ ኸ ኸ ኹ ኺ ኻ ኼ ኽ ኾ ወ ወ ዉ ዊ ዋ ዌ ው ዎ ዐ ዐ ዑ ዒ ዓ ዔ ዕ ዖ ዘ ዘ ዙ ዚ ዛ ዜ ዝ ዞ ዟ ዠ ዡ ዢ ዣ ዤ ዥ ዦ ዧ የ ዩ ዪ ያ ዬ ይ ዮ ዯ ደ ዱ ዲ ዳ ዴ ድ ዶ ዷ ጀ ጀ ጁ ጂ ጃ ጄ ጅ ጆ ጇ ገ ጉ ጊ ጋ ጌ ግ ጎ ጐ ጒ ጒ ጓ ጔ ጕ ጠ ጠ ጡ ጢ ጣ ጤ ጥ ጦ ጧ ጨ ጩ ጪ ጫ ጬ ጭ ጮ ጯ ጰ ጱ ጲ ጳ ጴ ጵ ጶ ጷ ጸ ጹ ጺ ጻ ጼ ጽ ጾ ጿ ፀ ፁ ፂ ፃ ፄ ፅ ፆ ፇ ፈ ፉ ፊ ፋ ፌ ፍ ፎ ፏ ፐ ፑ ፒ ፓ ፔ ፕ ፖ ፗ ፘ ፙ ፚ", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "ar": { + 0: "ً ٌ ٍ َ ُ ِ ّ ْ ٰ ء آ أ ؤ إ ئ ا ب ت ة ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي ى", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200c \u200d \u200e \u200f ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ پ چ ژ ڜ ڢ ڤ ڥ ٯ ڧ ڨ ک گ ی", + 5: "ا ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي", + }, + "as": { + 0: "অ আ ই ঈ উ ঊ ঋ এ ঐ ও ঔ ং ঁ ঃ ক ক্ষ খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড ড় ড় ঢ ঢ় ঢ় ণ ত থ দ ধ ন প ফ ব ভ ম য য় ৰ ল ৱ শ ষ স হ া ি ী ু ূ ৃ ে ৈ ো ৌ ্", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200c \u200d ৲", + }, + "asa": { + 0: "a b c d e f g h i j k l m n o p r s t u v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q x", + 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", + }, + "ast": { + 0: "a á b c d e é f g h ḥ i í l ḷ m n ñ o ó p q r s t u ú ü v x y z", + 2: "- ‐ – — , ; : ! ¡ ? ¿ . … ' ‘ ’ \" “ ” « » ( ) [ ] § @ * / \\ & # † ‡ ′ ″", + 3: "ª à ă â å ä ã ā æ ç è ĕ ê ë ē ì ĭ î ï ī j k º ò ŏ ô ö ø ō œ ù ŭ û ū w ÿ", + 5: "A B C D E F G H I L M N Ñ O P Q R S T U V X Y Z", + }, + "az": { + 0: "a b c ç d e ə f g ğ h x ı i İ j k q l m n o ö p r s ş t u ü v y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "w", + }, + "az-Cyrl": { + 0: "а ә б в г ғ д е ж з и й ј к ҝ л м н о ө п р с т у ү ф х һ ч ҹ ш ы", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "ц щ ъ ь э ю я", + }, + "bas": { + 0: "a á à â ǎ ā a᷆ a᷇ b ɓ c d e é è ê ě ē e᷆ e᷇ ɛ ɛ́ ɛ̀ ɛ̂ ɛ̌ ɛ̄ ɛ᷆ ɛ᷇ f g h i í ì î ǐ ī i᷆ i᷇ j k l m n ń ǹ ŋ o ó ò ô ǒ ō o᷆ o᷇ ɔ ɔ́ ɔ̀ ɔ̂ ɔ̌ ɔ̄ ɔ᷆ ɔ᷇ p r s t u ú ù û ǔ ū u᷆ u᷇ v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q x", + 5: "A B Ɓ C D E Ɛ F G H I J K L M N Ŋ O Ɔ P R S T U V W Y Z", + }, + "be": { + 0: "а б в г д дж дз е ё ж з і й к л м н о п р с т у ў ф х ц ч ш ы ь э ю я", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "bem": { + 0: "a b c e f g i j k l m n o p s sh t u w y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "d h q r v x z", + 5: "A B C E F G I J K L M N O P S SH T U W Y", + }, + "bez": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "x", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W Y Z", + }, + "bg": { + 0: "а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ь ю я", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "а̀ ѐ ё ѝ о̀ у̀ ъ̀ ы ѣ э ю̀ я̀ ѫ", + }, + "bm": { + 0: "a b c d e ɛ f g h i j k l m n ɲ ŋ o ɔ p r s t u w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q v x", + 5: "A B C D E Ɛ F G H I J K L M N Ɲ Ŋ O Ɔ P R S T U W Y Z", + }, + "bn": { + 0: "় ৺ অ আ ই ঈ উ ঊ ঋ ৠ ঌ ৡ এ ঐ ও ঔ ং ঃ ঁ ক ক্ষ খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড ড় ঢ ঢ় ণ ত ৎ থ দ ধ ন প ফ ব ভ ম য য় র ল শ ষ স হ ঽ া ি ী ু ূ ৃ ৄ ৢ ৣ ে ৈ ো ৌ ্ ৗ", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200c \u200d ৲ ৳ ৴ ৵ ৶ ৷ ৸ ৹ ৰ ৱ", + }, + "bn-IN": { + 0: "় ৺ অ আ ই ঈ উ ঊ ঋ ৠ ঌ ৡ এ ঐ ও ঔ ং ঃ ঁ ক ক্ষ খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড ড় ঢ ঢ় ণ ত ৎ থ দ ধ ন প ফ ব ভ ম য য় র ল শ ষ স হ ঽ া ি ী ু ূ ৃ ৄ ৢ ৣ ে ৈ ো ৌ ্ ৗ", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200c \u200d ৲ ৳ ৴ ৵ ৶ ৷ ৸ ৹ ৰ ৱ", + }, + "bo": { + 0: "ཾ ཿ ཀ ཀྵ ྐ ྐྵ ཁ ྑ ག གྷ ྒ ྒྷ ང ྔ ཅ ྕ ཆ ྖ ཇ ྗ ཉ ྙ ཊ ྚ ཋ ྛ ཌ ཌྷ ྜ ྜྷ ཎ ྞ ཏ ྟ ཐ ྠ ད དྷ ྡ ྡྷ ན ྣ པ ྤ ཕ ྥ བ བྷ ྦ ྦྷ མ ྨ ཙ ྩ ཚ ྪ ཛ ཛྷ ྫ ྫྷ ཝ ྭ ྺ ཞ ྮ ཟ ྯ འ ྰ ཡ ྱ ྻ ར ཪ ྲ ྼ ལ ླ ཤ ྴ ཥ ྵ ས ྶ ཧ ྷ ཨ ྸ ི ཱི ྀ ཱྀ ུ ཱུ ྲྀ ཷ ླྀ ཹ ཹ ེ ཻ ོ ཽ ྄", + 3: "ༀ", + }, + "br": { + 0: "a b ch cʼh d e ê f g h i j k l m n ñ o p r s t u ù v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "á à ă â å ä ã ā æ c ç é è ĕ ë ē í ì ĭ î ï ī ó ò ŏ ô ö ø ō œ q ú ŭ û ü ū ÿ", + 5: "A B C D E F G H I J K L M N O P R S T U V W X Y Z", + }, + "brx": { + 0: "़ ँ ं अ आ इ ई उ ऊ ऍ ए ऐ ऑ ओ औ क ख ग घ च छ ज झ ञ ट ठ ड ड़ ढ ण त थ द ध न प फ ब भ म य र ल ळ व श ष स ह ा ि ी ु ू ृ ॅ े ै ॉ ो ौ ्", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200c \u200d", + 5: "अ आ इ ई उ ऊ ऍ ए ऐ ऑ ओ औ क ख ग घ च छ ज झ ञ ट ठ ड ड़ ढ ण त थ द ध न प फ ब भ म य र ल ळ व श ष स ह", + }, + "bs": { + 0: "a b c č ć d dž đ e f g h i j k l lj m n nj o p r s š t u v z ž", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q w x y", + }, + "bs-Cyrl": { + 0: "а б в г д ђ е ж з и ј к л љ м н њ о п р с т ћ у ф х ц ч џ ш", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "byn": { + 0: "፟ ሀ ሀ ሁ ሂ ሃ ሄ ህ ሆ ለ ለ ሉ ሊ ላ ሌ ል ሎ ሏ ሐ ሑ ሒ ሓ ሔ ሕ ሖ ሗ መ ሙ ሚ ማ ሜ ም ሞ ሟ ረ ረ ሩ ሪ ራ ሬ ር ሮ ሯ ሰ ሱ ሲ ሳ ሴ ስ ሶ ሷ ሸ ሹ ሺ ሻ ሼ ሽ ሾ ሿ ቀ ቁ ቂ ቃ ቄ ቅ ቆ ቈ ቊ ቊ ቋ ቌ ቍ ቐ ቐ ቑ ቒ ቓ ቔ ቕ ቖ ቘ ቚ ቚ ቛ ቜ ቝ በ በ ቡ ቢ ባ ቤ ብ ቦ ቧ ቨ ቩ ቪ ቫ ቬ ቭ ቮ ቯ ተ ቱ ቲ ታ ቴ ት ቶ ቷ ቸ ቹ ቺ ቻ ቼ ች ቾ ቿ ኀ ኁ ኂ ኃ ኄ ኅ ኆ ኈ ኊ ኊ ኋ ኌ ኍ ነ ነ ኑ ኒ ና ኔ ን ኖ ኗ ኘ ኙ ኚ ኛ ኜ ኝ ኞ ኟ አ ኡ ኢ ኣ ኤ እ ኦ ኧ ከ ኩ ኪ ካ ኬ ክ ኮ ኰ ኲ ኲ ኳ ኴ ኵ ኸ ኸ ኹ ኺ ኻ ኼ ኽ ኾ ዀ ዂ ዂ ዃ ዄ ዅ ወ ወ ዉ ዊ ዋ ዌ ው ዎ ዐ ዐ ዑ ዒ ዓ ዔ ዕ ዖ ዘ ዘ ዙ ዚ ዛ ዜ ዝ ዞ ዟ ዠ ዡ ዢ ዣ ዤ ዥ ዦ ዧ የ ዩ ዪ ያ ዬ ይ ዮ ደ ደ ዱ ዲ ዳ ዴ ድ ዶ ዷ ጀ ጀ ጁ ጂ ጃ ጄ ጅ ጆ ጇ ገ ጉ ጊ ጋ ጌ ግ ጎ ጐ ጒ ጒ ጓ ጔ ጕ ጘ ጘ ጙ ጚ ጛ ጜ ጝ ጞ ጟ ⶓ ⶓ ⶔ ⶕ ⶖ ጠ ጠ ጡ ጢ ጣ ጤ ጥ ጦ ጧ ጨ ጩ ጪ ጫ ጬ ጭ ጮ ጯ ጸ ጸ ጹ ጺ ጻ ጼ ጽ ጾ ጿ ፈ ፈ ፉ ፊ ፋ ፌ ፍ ፎ ፏ ፐ ፑ ፒ ፓ ፔ ፕ ፖ ፗ", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "ca": { + 0: "a à b c ç d e é è f g h i í ï j k l ŀ m n o ó ò p q r s t u ú ü v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "á ă â å ä ã ā æ ĕ ê ë ē ì ĭ î ī ñ º ŏ ô ö ø ō œ ù ŭ û ū ÿ", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "cgg": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "chr": { + 0: "Ꭰ Ꭱ Ꭲ Ꭳ Ꭴ Ꭵ Ꭶ Ꭷ Ꭸ Ꭹ Ꭺ Ꭻ Ꭼ Ꭽ Ꭾ Ꭿ Ꮀ Ꮁ Ꮂ Ꮃ Ꮄ Ꮅ Ꮆ Ꮇ Ꮈ Ꮉ Ꮊ Ꮋ Ꮌ Ꮍ Ꮎ Ꮏ Ꮐ Ꮑ Ꮒ Ꮓ Ꮔ Ꮕ Ꮖ Ꮗ Ꮘ Ꮙ Ꮚ Ꮛ Ꮜ Ꮝ Ꮞ Ꮟ Ꮠ Ꮡ Ꮢ Ꮣ Ꮤ Ꮥ Ꮦ Ꮧ Ꮨ Ꮩ Ꮪ Ꮫ Ꮬ Ꮭ Ꮮ Ꮯ Ꮰ Ꮱ Ꮲ Ꮳ Ꮴ Ꮵ Ꮶ Ꮷ Ꮸ Ꮹ Ꮺ Ꮻ Ꮼ Ꮽ Ꮾ Ꮿ Ᏸ Ᏹ Ᏺ Ᏻ Ᏼ", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "Ꭰ Ꭶ Ꭽ Ꮃ Ꮉ Ꮎ Ꮖ Ꮜ Ꮣ Ꮬ Ꮳ Ꮹ Ꮿ", + }, + "cs": { + 0: "a á b c č d ď e é ě f g h ch i í j k l m n ň o ó p q r ř s š t ť u ú ů v w x y ý z ž", + 2: "- ‐ – , ; : ! ? . … ‘ ‚ “ „ ( ) [ ] § @ * / &", + 3: "á à ă â å ä ã ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ľ ł ñ ó ò ŏ ô ö ø ō œ ŕ ú ù ŭ û ü ū ÿ", + }, + "cy": { + 0: "a á à â ä b c ch d dd e é è ê ë f ff g ng h i í ì î ï j l ll m n o ó ò ô ö p ph r rh s t th u ú ù û ü w ẃ ẁ ŵ ẅ y ý ỳ ŷ ÿ", + 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", + 3: "k q v x z", + 5: "A B C CH D DD E F FF G NG H I J L LL M N O P PH R RH S T TH U W Y", + }, + "da": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z æ ø å", + 2: "- ‐ – , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ′ ″", + 3: "á à â ç é è ê ë í î ï ñ ó ô ú ù û ÿ ü æ ä ø ö œ å", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Æ Ø Å", + }, + "dav": { + 0: "a b c d e f g h i j k l m n o p r s t u v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q x", + 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", + }, + "de": { + 0: "a ä b c d e f g h i j k l m n o ö p q r s ß t u ü v w x y z", + 2: "- ‐ – — , ; : ! ? . … ' ‘ ‚ \" “ „ « » ( ) [ ] { } § @ * / & #", + 3: "á à ă â å ã ā æ ç é è ĕ ê ë ē ğ í ì ĭ î ï İ ī ı ñ ó ò ŏ ô ø ō œ ş ú ù ŭ û ū ÿ", + 5: "A B C D E F G H I J K L M N O P Q R S Sch* St* T U V W X Y Z", + }, + "dje": { + 0: "a ã b c d e ẽ f g h i j k l m n ɲ ŋ o õ p q r s š t u w x y z ž", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "v", + 5: "A B C D E F G H I J K L M N Ɲ Ŋ O P Q R S T U W X Y Z", + }, + "dua": { + 0: "a á b ɓ c d ɗ e é ɛ ɛ́ f g i í j k l m n ny ŋ o ó ɔ ɔ́ p r s t u ú ū w y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "h q v x z", + 5: "A B Ɓ C D Ɗ E Ɛ F G I J K L M N Ŋ O Ɔ P S T U W Y", + }, + "dyo": { + 0: "a á b c d e é f g h i í j k l m n ñ ŋ o ó p q r s t u ú v w x y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "z", + 5: "A B C D E F G H I J K L M N Ñ Ŋ O P Q R S T U V W X Y", + }, + "dz": { + 0: "ཀ ྐ ཁ ྑ ག ྒ ང ྔ ཅ ཆ ཇ ྗ ཉ ྙ ཏ ྟ ཐ ྠ ད ྡ ན ྣ པ ྤ ཕ ྥ བ ྦ མ ྨ ཙ ྩ ཚ ྪ ཛ ྫ ཝ ྭ ཞ ཟ འ ཡ ྱ ར ྲ ལ ླ ཤ ྵ ས ྶ ཧ ྷ ཨ ི ུ ེ ོ", + 2: "- ‐ – — , ; : ༔ ! ? . … ' ‘ ’ \" “ ” ( ) [ ] ༼ ༽ § @ * / & # † ‡ ༄ ༅ ༆ ༈ ༉ ༊ ࿐ ࿑ ༌ ། ༎ ༏ ༐ ༑ ༒ ࿒ ࿓ ࿔ ༴ ༶ ྾ ྿", + 3: "ཾ ཊ ྚ ཋ ྛ ཌ ྜ ཎ ྞ ྺ ྻ ྼ ཥ ྀ ཻ ཽ ྄", + }, + "ebu": { + 0: "a b c d e f g h i ĩ j k l m n o p q r s t u ũ v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B C D E F G H I Ĩ J K L M N O P Q R S T U Ũ V W X Y Z", + }, + "ee": { + 0: "a á à ã b d ɖ e é è ẽ ɛ ɛ́ ɛ̀ ɛ̃ f ƒ g ɣ h x i í ì ĩ k l m n ŋ o ó ò õ ɔ ɔ́ ɔ̀ ɔ̃ p r s t u ú ù ũ v ʋ w y z", + 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] { } § @ * / & # † ‡ ′ ″", + 3: "ă â å ä ā æ c ç ĕ ê ë ĭ î ï j ñ ŏ ô ö ø œ q ŭ û ü ÿ", + 5: "A B D Ɖ E Ɛ F Ƒ G Ɣ H X I K L M N Ŋ O Ɔ P R S T U V Ʋ W Y Z", + }, + "el": { + 0: "α ά β γ δ ε έ ζ η ή θ ι ί ϊ ΐ κ λ μ ν ξ ο ό π ρ σ ς τ υ ύ ϋ ΰ φ χ ψ ω ώ", + 2: "- ‐ – — , ; : ! . … \" ( ) [ ] § @ * / \\ &", + 3: "ἀ ἄ ἂ ἆ ἁ ἅ ἃ ἇ ὰ ᾶ ἐ ἔ ἒ ἑ ἕ ἓ ὲ ἠ ἤ ἢ ἦ ἡ ἥ ἣ ἧ ὴ ῆ ἰ ἴ ἲ ἶ ἱ ἵ ἳ ἷ ὶ ῖ ῒ ῗ ὄ ὂ ὃ ὸ ὐ ὔ ὒ ὖ ὑ ὕ ὓ ὗ ὺ ῦ ῢ ῧ ὤ ὢ ὦ ὥ ὣ ὧ ὼ ῶ", + 5: "Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω", + }, + "en": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", + 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", + 3: "á à ă â å ä ã ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ö ø ō œ ú ù ŭ û ü ū ÿ", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "en-Dsrt": { + 0: "𐐨 𐐩 𐐪 𐐫 𐐬 𐐭 𐐮 𐐯 𐐰 𐐱 𐐲 𐐳 𐐴 𐐵 𐐶 𐐷 𐐸 𐐹 𐐺 𐐻 𐐼 𐐽 𐐾 𐐿 𐑀 𐑁 𐑂 𐑃 𐑄 𐑅 𐑆 𐑇 𐑈 𐑉 𐑊 𐑋 𐑌 𐑍 𐑎 𐑏", + 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", + }, + "en-GB": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", + 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", + 3: "á à ă â å ä ã ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ö ø ō œ ú ù ŭ û ü ū ÿ", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "en-ZA": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", + 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "eo": { + 0: "a b c ĉ d e f g ĝ h ĥ i j ĵ k l m n o p r s ŝ t u ŭ v z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q w x y", + 5: "A B C Ĉ D E F G Ĝ H Ĥ I J Ĵ K L M N O P R S Ŝ T U Ŭ V Z", + }, + "es": { + 0: "a á b c d e é f g h i í j k l m n ñ o ó p q r s t u ú ü v w x y z", + 2: "- ‐ – — , ; : ! ¡ ? ¿ . … ' ‘ ’ \" “ ” « » ( ) [ ] § @ * / \\ & # † ‡ ′ ″", + 3: "ª à ă â å ä ã ā æ ç è ĕ ê ë ē ì ĭ î ï ī º ò ŏ ô ö ø ō œ ù ŭ û ū ÿ", + 5: "A B C D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z", + }, + "et": { + 0: "a b c d e f g h i j k l m n o p q r s š z ž t u v w õ ä ö ü x y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "á à â å ā æ ç é è ê ë ē í ì î ï ī ñ ó ò ŏ ô ø ō œ ú ù û ū", + 5: "A B C D E F G H I J K L M N O P Q R S Š Z Ž T U V Õ Ä Ö Ü X Y", + }, + "eu": { + 0: "a b c ç d e f g h i j k l m n ñ o p q r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "á à ă â å ä ã ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ö ø ō œ ú ù ŭ û ü ū ÿ", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "ewo": { + 0: "a á à â ǎ b d dz e é è ê ě ə ə́ ə̀ ə̂ ə̌ ɛ ɛ́ ɛ̀ ɛ̂ ɛ̌ f g h i í ì î ǐ k kp l m n ń ǹ ng nk ŋ o ó ò ô ǒ ɔ ɔ́ ɔ̀ ɔ̂ ɔ̌ p r s t ts u ú ù û ǔ v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "c j q x", + 5: "A B D E Ə Ɛ F G H I K L M N Ŋ O Ɔ P R S T U V W Y Z", + }, + "fa": { + 0: "ً ٍ ٌ ّ ٔ آ ا ء أ ؤ ئ ب پ ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ه ة ی", + 2: "- ‐ ، ٫ ٬ ؛ : ! ؟ . … « » ( ) [ ] * / \\", + 3: "\u200c \u200d \u200e \u200f َ ِ ُ ْ ٖ ٰ ۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ إ ك ى ي", + 5: "آ ا ب پ ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ه ی", + }, + "fa-AF": { + 0: "ً ٍ ٌ ّ ٔ آ ا ء أ ؤ ئ ب پ ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ه ة ی", + 2: "- ‐ ، ٫ ٬ ؛ : ! ؟ . … « » ( ) [ ] * / \\", + 3: "ٖ ٰ \u200c \u200d ټ ځ څ ډ ړ ږ ښ ګ ڼ ي", + 5: "آ ا ب پ ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ه ی", + }, + "ff": { + 0: "a b ɓ c d ɗ e f g h i j k l m n ñ ŋ o p r s t u w y ƴ", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q v x z", + 5: "A B Ɓ C D Ɗ E F G H I J K L M N Ñ Ŋ O P R S T U W Y Ƴ", + }, + "fi": { + 0: "a b c d e f g h i j k l m n o p q r s š t u v w x y z ž å ä ö", + 3: "á à â ã č ç đ é è ê ë ǧ ǥ ȟ í î ï ǩ ń ñ ŋ ô õ œ ř ß ŧ ú ù û ÿ ü ʒ ǯ æ ø", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Å Ä Ö", + }, + "fil": { + 0: "a b c d e f g h i j k l m n ñ ng o p q r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "á à â é è ê í ì î ó ò ô ú ù û", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "fo": { + 0: "a á b d ð e f g h i í j k l m n o ó p r s t u ú v x y ý æ ø", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "c q w z", + }, + "fr": { + 0: "a à â æ b c ç d e é è ê ë f g h i î ï j k l m n o ô œ p q r s t u ù û ü v w x y ÿ z", + 2: "- ‐ – — , ; : ! ? . … ’ \" “ ” « » ( ) [ ] § @ * / & # † ‡", + 3: "á å ä ã ā ē í ì ī ñ ó ò ö ø ú ǔ", + }, + "fur": { + 0: "a à â b c ç d e è ê f g h i ì î j k l m n o ò ô p q r s t u ù û v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "å č é ë ğ ï ñ ó š ü", + }, + "ga": { + 0: "a á b c d e é f g h i í l m n o ó p r s t u ú", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "å ḃ ċ ḋ ḟ ġ j k ṁ ṗ q ṡ ṫ v w x y z", + }, + "gd": { + 0: "a à b c d e è f g h i ì l m n o ò p r s t u ù", + 3: "á ċ ḋ é ḟ ġ j k ṁ ó ṗ q ṡ ṫ v w x y z", + 5: "A B C D E F G H I L M N O P R S T U", + }, + "gl": { + 0: "a á b c d e é f g h i í j k l m n ñ o ó p q r s t u ú ü v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B C D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z", + }, + "gsw": { + 0: "a ä b c d e f g h i j k l m n o ö p q r s t u ü v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "á à ă â å ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ø ō œ ú ù ŭ û ū ÿ", + }, + "gu": { + 0: "઼ ૐ ં ઁ ઃ અ આ ઇ ઈ ઉ ઊ ઋ ૠ ઍ એ ઐ ઑ ઓ ઔ ક ખ ગ ઘ ઙ ચ છ જ ઝ ઞ ટ ઠ ડ ઢ ણ ત થ દ ધ ન પ ફ બ ભ મ ય ર લ વ શ ષ સ હ ળ ઽ ા િ ી ુ ૂ ૃ ૄ ૅ ે ૈ ૉ ો ૌ ્", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200c \u200d ૰", + 5: "અ આ ઇ ઈ ઉ ઊ ઋ એ ઐ ઓ ઔ ક ખ ગ ઘ ઙ ચ છ જ ઝ ઞ ટ ઠ ડ ઢ ણ ત થ દ ધ ન પ ફ બ ભ મ ય ર લ વ શ ષ સ હ ળ", + }, + "guz": { + 0: "a b c d e f g h i j k l m n o p r s t u v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q x", + 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", + }, + "gv": { + 0: "a b c ç d e f g h i j k l m n o p q r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "ha": { + 0: "a b ɓ c d ɗ e f g h i j k ƙ l m n o r s sh t ts u w y ʼy z ʼ", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "á à â é è ê í ì î ó ò ô p q r̃ ú ù û v x ƴ", + }, + "haw": { + 0: "a ā e ē i ī o ō u ū h k l m n p w ʻ", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "b c d f g j q r s t v x y z", + }, + "he": { + 0: "א ב ג ד ה ו ז ח ט י כ ך ל מ ם נ ן ס ע פ ף צ ץ ק ר ש ת", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "ֽ ׄ \u200e \u200f ְ ֱ ֲ ֳ ִ ֵ ֶ ַ ָ ֹ ֻ ׂ ׁ ּ ֿ ־ ׳ ״", + 5: "א ב ג ד ה ו ז ח ט י כ ל מ נ ס ע פ צ ק ר ש ת", + }, + "hi": { + 0: "़ ॐ ं ँ ः अ आ इ ई उ ऊ ऋ ऌ ऍ ए ऐ ऑ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न प फ ब भ म य र ल ळ व श ष स ह ऽ ा ि ी ु ू ृ ॄ ॅ े ै ॉ ो ौ ्", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200c \u200d", + }, + "hr": { + 0: "a b c č ć d dž đ e f g h i j k l lj m n nj o p r s š t u v z ž", + 2: "‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] @ * / ′ ″", + 3: "q w x y", + 5: "A B C Č Ć D DŽ Đ E F G H I J K L LJ M N NJ O P Q R S Š T U V W X Y Z Ž", + }, + "hu": { + 0: "a á b c cs ccs d dz ddz dzs ddzs e é f g gy ggy h i í j k l ly lly m n ny nny o ó ö ő p r s sz ssz t ty tty u ú ü ű v z zs zzs", + 2: "- – , ; : ! ? . … ' ’ \" ” „ « » ( ) [ ] { } 〈 〉 § @ * / & # ⸓ ~", + 3: "à ă â å ä ã ā æ ç è ĕ ê ë ē ì ĭ î ï ī ñ ò ŏ ô ø ō œ q ù ŭ û ū w x y ÿ", + 5: "A Á B C CS D DZ DZS E É F G GY H I Í J K L LY M N NY O Ó Ö Ő P Q R S SZ T TY U Ú Ü Ű V W X Y Z ZS", + }, + "hy": { + 0: "ա բ գ դ ե զ է ը թ ժ ի լ խ ծ կ հ ձ ղ ճ մ յ ն շ ո չ պ ջ ռ ս վ տ ր ց ւ փ ք և օ ֆ", + 2: "֊ ՝ ՜ ՞ « » ՚ ՛ ՟", + }, + "ia": { + 0: "a b c ch d e f g h i j k l m n o p ph q r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "id": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", + 2: "‐ – — , ; : ! ? . … ' ‘ ’ “ ” ( ) [ ] /", + 3: "å q x z", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "ig": { + 0: "a b ch d e ẹ f g gb gh gw h i ị j k kp kw l m n ṅ nw ny o ọ p r s sh t u ụ v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "ii": { + 0: "ꀀ ꀀ ꀁ ꀂ ꀃ ꀄ ꀅ ꀆ ꀇ ꀈ ꀉ ꀊ ꀋ ꀌ ꀍ ꀎ ꀏ ꀐ ꀑ ꀒ ꀓ ꀔ ꀕ ꀖ ꀗ ꀘ ꀙ ꀚ ꀛ ꀜ ꀝ ꀞ ꀟ ꀠ ꀡ ꀢ ꀣ ꀤ ꀥ ꀦ ꀧ ꀨ ꀩ ꀪ ꀫ ꀬ ꀭ ꀮ ꀯ ꀰ ꀱ ꀲ ꀳ ꀴ ꀵ ꀶ ꀷ ꀸ ꀹ ꀺ ꀻ ꀼ ꀽ ꀾ ꀿ ꁀ ꁁ ꁂ ꁃ ꁄ ꁅ ꁆ ꁇ ꁈ ꁉ ꁊ ꁋ ꁌ ꁍ ꁎ ꁏ ꁐ ꁑ ꁒ ꁓ ꁔ ꁕ ꁖ ꁗ ꁘ ꁙ ꁚ ꁛ ꁜ ꁝ ꁞ ꁟ ꁠ ꁡ ꁢ ꁣ ꁤ ꁥ ꁦ ꁧ ꁨ ꁩ ꁪ ꁫ ꁬ ꁭ ꁮ ꁯ ꁰ ꁱ ꁲ ꁳ ꁴ ꁵ ꁶ ꁷ ꁸ ꁹ ꁺ ꁻ ꁼ ꁽ ꁾ ꁿ ꂀ ꂁ ꂂ ꂃ ꂄ ꂅ ꂆ ꂇ ꂈ ꂉ ꂊ ꂋ ꂌ ꂍ ꂎ ꂏ ꂐ ꂑ ꂒ ꂓ ꂔ ꂕ ꂖ ꂗ ꂘ ꂙ ꂚ ꂛ ꂜ ꂝ ꂞ ꂟ ꂠ ꂡ ꂢ ꂣ ꂤ ꂥ ꂦ ꂧ ꂨ ꂩ ꂪ ꂫ ꂬ ꂭ ꂮ ꂯ ꂰ ꂱ ꂲ ꂳ ꂴ ꂵ ꂶ ꂷ ꂸ ꂹ ꂺ ꂻ ꂼ ꂽ ꂾ ꂿ ꃀ ꃁ ꃂ ꃃ ꃄ ꃅ ꃆ ꃇ ꃈ ꃉ ꃊ ꃋ ꃌ ꃍ ꃎ ꃏ ꃐ ꃑ ꃒ ꃓ ꃔ ꃕ ꃖ ꃗ ꃘ ꃙ ꃚ ꃛ ꃜ ꃝ ꃞ ꃟ ꃠ ꃡ ꃢ ꃣ ꃤ ꃥ ꃦ ꃧ ꃨ ꃩ ꃪ ꃫ ꃬ ꃭ ꃮ ꃯ ꃰ ꃱ ꃲ ꃳ ꃴ ꃵ ꃶ ꃷ ꃸ ꃹ ꃺ ꃻ ꃼ ꃽ ꃾ ꃿ ꄀ ꄁ ꄂ ꄃ ꄄ ꄅ ꄆ ꄇ ꄈ ꄉ ꄊ ꄋ ꄌ ꄍ ꄎ ꄏ ꄐ ꄑ ꄒ ꄓ ꄔ ꄕ ꄖ ꄗ ꄘ ꄙ ꄚ ꄛ ꄜ ꄝ ꄞ ꄟ ꄠ ꄡ ꄢ ꄣ ꄤ ꄥ ꄦ ꄧ ꄨ ꄩ ꄪ ꄫ ꄬ ꄭ ꄮ ꄯ ꄰ ꄱ ꄲ ꄳ ꄴ ꄵ ꄶ ꄷ ꄸ ꄹ ꄺ ꄻ ꄼ ꄽ ꄾ ꄿ ꅀ ꅁ ꅂ ꅃ ꅄ ꅅ ꅆ ꅇ ꅈ ꅉ ꅊ ꅋ ꅌ ꅍ ꅎ ꅏ ꅐ ꅑ ꅒ ꅓ ꅔ ꅕ ꅖ ꅗ ꅘ ꅙ ꅚ ꅛ ꅜ ꅝ ꅞ ꅟ ꅠ ꅡ ꅢ ꅣ ꅤ ꅥ ꅦ ꅧ ꅨ ꅩ ꅪ ꅫ ꅬ ꅭ ꅮ ꅯ ꅰ ꅱ ꅲ ꅳ ꅴ ꅵ ꅶ ꅷ ꅸ ꅹ ꅺ ꅻ ꅼ ꅽ ꅾ ꅿ ꆀ ꆁ ꆂ ꆃ ꆄ ꆅ ꆆ ꆇ ꆈ ꆉ ꆊ ꆋ ꆌ ꆍ ꆎ ꆏ ꆐ ꆑ ꆒ ꆓ ꆔ ꆕ ꆖ ꆗ ꆘ ꆙ ꆚ ꆛ ꆜ ꆝ ꆞ ꆟ ꆠ ꆡ ꆢ ꆣ ꆤ ꆥ ꆦ ꆧ ꆨ ꆩ ꆪ ꆫ ꆬ ꆭ ꆮ ꆯ ꆰ ꆱ ꆲ ꆳ ꆴ ꆵ ꆶ ꆷ ꆸ ꆹ ꆺ ꆻ ꆼ ꆽ ꆾ ꆿ ꇀ ꇁ ꇂ ꇃ ꇄ ꇅ ꇆ ꇇ ꇈ ꇉ ꇊ ꇋ ꇌ ꇍ ꇎ ꇏ ꇐ ꇑ ꇒ ꇓ ꇔ ꇕ ꇖ ꇗ ꇘ ꇙ ꇚ ꇛ ꇜ ꇝ ꇞ ꇟ ꇠ ꇡ ꇢ ꇣ ꇤ ꇥ ꇦ ꇧ ꇨ ꇩ ꇪ ꇫ ꇬ ꇭ ꇮ ꇯ ꇰ ꇱ ꇲ ꇳ ꇴ ꇵ ꇶ ꇷ ꇸ ꇹ ꇺ ꇻ ꇼ ꇽ ꇾ ꇿ ꈀ ꈁ ꈂ ꈃ ꈄ ꈅ ꈆ ꈇ ꈈ ꈉ ꈊ ꈋ ꈌ ꈍ ꈎ ꈏ ꈐ ꈑ ꈒ ꈓ ꈔ ꈕ ꈖ ꈗ ꈘ ꈙ ꈚ ꈛ ꈜ ꈝ ꈞ ꈟ ꈠ ꈡ ꈢ ꈣ ꈤ ꈥ ꈦ ꈧ ꈨ ꈩ ꈪ ꈫ ꈬ ꈭ ꈮ ꈯ ꈰ ꈱ ꈲ ꈳ ꈴ ꈵ ꈶ ꈷ ꈸ ꈹ ꈺ ꈻ ꈼ ꈽ ꈾ ꈿ ꉀ ꉁ ꉂ ꉃ ꉄ ꉅ ꉆ ꉇ ꉈ ꉉ ꉊ ꉋ ꉌ ꉍ ꉎ ꉏ ꉐ ꉑ ꉒ ꉓ ꉔ ꉕ ꉖ ꉗ ꉘ ꉙ ꉚ ꉛ ꉜ ꉝ ꉞ ꉟ ꉠ ꉡ ꉢ ꉣ ꉤ ꉥ ꉦ ꉧ ꉨ ꉩ ꉪ ꉫ ꉬ ꉭ ꉮ ꉯ ꉰ ꉱ ꉲ ꉳ ꉴ ꉵ ꉶ ꉷ ꉸ ꉹ ꉺ ꉻ ꉼ ꉽ ꉾ ꉿ ꊀ ꊁ ꊂ ꊃ ꊄ ꊅ ꊆ ꊇ ꊈ ꊉ ꊊ ꊋ ꊌ ꊍ ꊎ ꊏ ꊐ ꊑ ꊒ ꊓ ꊔ ꊕ ꊖ ꊗ ꊘ ꊙ ꊚ ꊛ ꊜ ꊝ ꊞ ꊟ ꊠ ꊡ ꊢ ꊣ ꊤ ꊥ ꊦ ꊧ ꊨ ꊩ ꊪ ꊫ ꊬ ꊭ ꊮ ꊯ ꊰ ꊱ ꊲ ꊳ ꊴ ꊵ ꊶ ꊷ ꊸ ꊹ ꊺ ꊻ ꊼ ꊽ ꊾ ꊿ ꋀ ꋁ ꋂ ꋃ ꋄ ꋅ ꋆ ꋇ ꋈ ꋉ ꋊ ꋋ ꋌ ꋍ ꋎ ꋏ ꋐ ꋑ ꋒ ꋓ ꋔ ꋕ ꋖ ꋗ ꋘ ꋙ ꋚ ꋛ ꋜ ꋝ ꋞ ꋟ ꋠ ꋡ ꋢ ꋣ ꋤ ꋥ ꋦ ꋧ ꋨ ꋩ ꋪ ꋫ ꋬ ꋭ ꋮ ꋯ ꋰ ꋱ ꋲ ꋳ ꋴ ꋵ ꋶ ꋷ ꋸ ꋹ ꋺ ꋻ ꋼ ꋽ ꋾ ꋿ ꌀ ꌁ ꌂ ꌃ ꌄ ꌅ ꌆ ꌇ ꌈ ꌉ ꌊ ꌋ ꌌ ꌍ ꌎ ꌏ ꌐ ꌑ ꌒ ꌓ ꌔ ꌕ ꌖ ꌗ ꌘ ꌙ ꌚ ꌛ ꌜ ꌝ ꌞ ꌟ ꌠ ꌡ ꌢ ꌣ ꌤ ꌥ ꌦ ꌧ ꌨ ꌩ ꌪ ꌫ ꌬ ꌭ ꌮ ꌯ ꌰ ꌱ ꌲ ꌳ ꌴ ꌵ ꌶ ꌷ ꌸ ꌹ ꌺ ꌻ ꌼ ꌽ ꌾ ꌿ ꍀ ꍁ ꍂ ꍃ ꍄ ꍅ ꍆ ꍇ ꍈ ꍉ ꍊ ꍋ ꍌ ꍍ ꍎ ꍏ ꍐ ꍑ ꍒ ꍓ ꍔ ꍕ ꍖ ꍗ ꍘ ꍙ ꍚ ꍛ ꍜ ꍝ ꍞ ꍟ ꍠ ꍡ ꍢ ꍣ ꍤ ꍥ ꍦ ꍧ ꍨ ꍩ ꍪ ꍫ ꍬ ꍭ ꍮ ꍯ ꍰ ꍱ ꍲ ꍳ ꍴ ꍵ ꍶ ꍷ ꍸ ꍹ ꍺ ꍻ ꍼ ꍽ ꍾ ꍿ ꎀ ꎁ ꎂ ꎃ ꎄ ꎅ ꎆ ꎇ ꎈ ꎉ ꎊ ꎋ ꎌ ꎍ ꎎ ꎏ ꎐ ꎑ ꎒ ꎓ ꎔ ꎕ ꎖ ꎗ ꎘ ꎙ ꎚ ꎛ ꎜ ꎝ ꎞ ꎟ ꎠ ꎡ ꎢ ꎣ ꎤ ꎥ ꎦ ꎧ ꎨ ꎩ ꎪ ꎫ ꎬ ꎭ ꎮ ꎯ ꎰ ꎱ ꎲ ꎳ ꎴ ꎵ ꎶ ꎷ ꎸ ꎹ ꎺ ꎻ ꎼ ꎽ ꎾ ꎿ ꏀ ꏁ ꏂ ꏃ ꏄ ꏅ ꏆ ꏇ ꏈ ꏉ ꏊ ꏋ ꏌ ꏍ ꏎ ꏏ ꏐ ꏑ ꏒ ꏓ ꏔ ꏕ ꏖ ꏗ ꏘ ꏙ ꏚ ꏛ ꏜ ꏝ ꏞ ꏟ ꏠ ꏡ ꏢ ꏣ ꏤ ꏥ ꏦ ꏧ ꏨ ꏩ ꏪ ꏫ ꏬ ꏭ ꏮ ꏯ ꏰ ꏱ ꏲ ꏳ ꏴ ꏵ ꏶ ꏷ ꏸ ꏹ ꏺ ꏻ ꏼ ꏽ ꏾ ꏿ ꐀ ꐁ ꐂ ꐃ ꐄ ꐅ ꐆ ꐇ ꐈ ꐉ ꐊ ꐋ ꐌ ꐍ ꐎ ꐏ ꐐ ꐑ ꐒ ꐓ ꐔ ꐕ ꐖ ꐗ ꐘ ꐙ ꐚ ꐛ ꐜ ꐝ ꐞ ꐟ ꐠ ꐡ ꐢ ꐣ ꐤ ꐥ ꐦ ꐧ ꐨ ꐩ ꐪ ꐫ ꐬ ꐭ ꐮ ꐯ ꐰ ꐱ ꐲ ꐳ ꐴ ꐵ ꐶ ꐷ ꐸ ꐹ ꐺ ꐻ ꐼ ꐽ ꐾ ꐿ ꑀ ꑁ ꑂ ꑃ ꑄ ꑅ ꑆ ꑇ ꑈ ꑉ ꑊ ꑋ ꑌ ꑍ ꑎ ꑏ ꑐ ꑑ ꑒ ꑓ ꑔ ꑕ ꑖ ꑗ ꑘ ꑙ ꑚ ꑛ ꑜ ꑝ ꑞ ꑟ ꑠ ꑡ ꑢ ꑣ ꑤ ꑥ ꑦ ꑧ ꑨ ꑩ ꑪ ꑫ ꑬ ꑭ ꑮ ꑯ ꑰ ꑱ ꑲ ꑳ ꑴ ꑵ ꑶ ꑷ ꑸ ꑹ ꑺ ꑻ ꑼ ꑽ ꑾ ꑿ ꒀ ꒁ ꒂ ꒃ ꒄ ꒅ ꒆ ꒇ ꒈ ꒉ ꒊ ꒋ ꒌ", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "is": { + 0: "a á b d ð e é f g h i í j k l m n o ó p r s t u ú v y ý þ æ ö", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "c q w x z", + }, + "it": { + 0: "a à b c d e é è f g h i ì j k l m n o ó ò p q r s t u ù v w x y z", + 2: "- — , ; : ! ? . … “ ” ( ) [ ] { } @ /", + 3: "á â å ä ã æ ç ê ë í î ï ñ ô ö õ ø œ ß ú û ü ÿ", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "ja": { + 0: "々 ゞ ー ゝ ヽ ヾ ぁ ァ あ ア ぃ ィ い イ ぅ ゥ う ウ ヴ ぇ ェ え エ ぉ ォ お オ ヵ か カ が ガ き キ ぎ ギ く ク ぐ グ ヶ け ケ げ ゲ こ コ ご ゴ さ サ ざ ザ し シ じ ジ す ス ず ズ せ セ ぜ ゼ そ ソ ぞ ゾ た タ だ ダ ち チ ぢ ヂ っ ッ つ ツ づ ヅ て テ で デ と ト ど ド な ナ に ニ ぬ ヌ ね ネ の ノ は ハ ば バ ぱ パ ひ ヒ び ビ ぴ ピ ふ フ ぶ ブ ぷ プ へ ヘ べ ベ ぺ ペ ほ ホ ぼ ボ ぽ ポ ま マ み ミ む ム め メ も モ ゃ ャ や ヤ ゅ ュ ゆ ユ ょ ョ よ ヨ ら ラ り リ る ル れ レ ろ ロ ゎ ヮ わ ワ ゐ ヰ ゑ ヱ を ヲ ん ン 一 丁 七 万 万 丈 三 上 下 不 与 丑 且 世 丘 丙 両 並 中 丸 丹 主 久 乏 乗 乙 九 乱 乳 乾 亀 了 予 争 事 二 互 五 井 亜 亡 交 亥 亨 享 享 京 亭 人 仁 今 介 仏 仕 他 付 仙 代 代 令 以 仮 仰 仲 件 任 企 伊 伏 伏 伐 休 会 伝 伯 伴 伸 伺 似 但 位 位 低 住 佐 体 何 余 作 佳 併 使 例 侍 供 依 価 侮 侯 侵 便 係 促 俊 俗 保 信 修 俳 俵 俸 俺 倉 個 倍 倒 候 借 倣 値 倫 倹 偉 偏 停 健 側 側 偵 偶 偽 傍 傑 傘 備 催 債 傷 傾 働 像 僕 僚 僧 儀 億 儒 償 優 元 元 兄 充 兆 先 光 克 免 兎 児 党 入 全 八 八 公 六 共 兵 具 典 兼 内 円 冊 再 冒 冗 写 冠 冬 冷 准 凍 凝 凡 処 凶 凸 凸 凹 出 刀 刃 分 分 切 刈 刊 刑 列 初 判 別 利 到 制 制 刷 券 刺 刻 則 削 前 剖 剛 剣 剤 副 剰 割 創 劇 力 功 加 劣 助 努 励 労 効 劾 勅 勇 勉 動 勘 務 勝 募 勢 勤 勧 勲 勺 匁 包 化 北 匠 匹 匹 区 医 匿 十 千 升 午 半 卑 卑 卒 卓 協 南 単 博 占 卯 卯 印 危 即 即 却 卵 卸 厄 厘 厚 原 厳 去 参 又 及 及 友 双 反 収 叔 取 受 叙 口 口 古 句 叫 召 可 台 史 右 号 司 各 合 吉 同 同 名 后 吏 吐 向 君 吟 否 含 吸 吹 呈 呈 呉 告 周 味 呼 命 和 咲 哀 品 員 哲 唆 唇 唐 唯 唱 商 問 啓 善 喚 喜 喝 喪 喫 営 嗣 嘆 嘉 嘱 器 噴 嚇 囚 四 回 因 団 困 囲 図 固 国 圏 園 土 圧 在 地 坂 均 坊 坑 坪 垂 型 垣 埋 城 域 執 培 基 埼 堀 堂 堅 堕 堤 堪 報 場 塀 塁 塊 塑 塔 塗 塚 塩 塾 境 墓 増 墜 墨 墳 墾 壁 壇 壊 壌 士 壬 壮 声 声 壱 売 変 夏 夕 外 多 夜 夢 大 天 天 太 夫 央 失 奇 奇 奈 奉 奏 契 奔 奥 奨 奪 奮 女 奴 好 如 如 妃 妄 妊 妙 妥 妨 妹 妻 姉 始 姓 委 姫 姻 姿 威 娘 娠 娯 婆 婚 婦 婿 媒 嫁 嫌 嫡 嬢 子 孔 字 存 孝 季 孤 学 孫 宅 宇 宇 守 安 完 宗 宗 官 宙 定 宜 宝 実 客 客 宣 室 宮 宰 害 害 宴 宵 家 容 宿 寂 寄 寄 寅 密 富 寒 寛 寝 察 寡 寧 審 寮 寸 寺 対 寿 封 専 射 将 尉 尉 尊 尋 導 小 少 尚 就 尺 尼 尼 尽 尾 尿 局 居 屈 届 屋 展 属 層 履 屯 山 岐 岡 岩 岬 岳 岸 峠 峡 峰 島 崇 崎 崩 川 州 巡 巣 工 工 左 巧 巨 差 己 巳 巻 市 布 帆 希 帝 帥 師 席 帯 帰 帳 常 帽 幅 幕 幣 干 干 平 年 幸 幹 幻 幻 幼 幽 幾 庁 広 床 序 底 店 庚 府 度 座 庫 庭 庶 庶 康 庸 廃 廉 廊 延 廷 建 弁 弊 式 弐 弓 弓 弔 引 弘 弟 弦 弧 弱 張 強 弾 当 形 彩 彫 彰 影 役 彼 往 征 径 待 律 後 徐 徒 従 得 御 復 循 微 徳 徴 徹 心 必 忌 忍 志 志 忘 忙 応 忠 快 念 怒 怖 思 怠 急 性 怪 恋 恐 恒 恥 恨 恩 恭 息 恵 悔 悟 悠 患 悦 悩 悪 悲 悼 情 惑 惜 惨 惰 想 愁 愉 意 愚 愛 感 慈 態 慌 慎 慕 慢 慣 慨 慮 慰 慶 憂 憎 憤 憩 憲 憶 憾 懇 懐 懲 懸 戊 戌 成 成 我 戒 戦 戯 戸 戻 房 所 扇 扉 手 才 打 払 扱 扶 批 承 技 抄 把 抑 投 抗 折 抜 択 披 抱 抵 抹 押 抽 担 拍 拐 拒 拓 拘 拙 招 拝 拠 拡 括 拷 拾 持 指 挑 挙 挟 振 挿 捕 捜 捨 据 掃 授 掌 排 掘 掛 採 探 接 控 推 措 掲 描 提 揚 換 握 揮 援 揺 損 搬 搭 携 搾 摂 摘 摩 撃 撤 撮 撲 擁 操 擦 擬 支 改 攻 放 政 故 敏 救 敗 教 敢 散 敬 数 整 敵 敷 文 斉 斎 斗 料 斜 斤 斥 断 新 方 施 旅 旋 族 旗 既 日 旧 旧 旨 早 旬 昆 昇 昌 明 易 昔 星 映 春 昨 昭 是 昼 時 晩 普 景 晴 晶 暁 暇 暑 暖 暗 暦 暫 暮 暴 曇 曜 曲 更 書 曹 替 最 月 有 服 朕 朗 望 朝 期 木 未 未 末 本 札 朱 朴 机 朽 杉 材 村 束 条 来 杯 東 松 板 析 林 枚 果 枝 枠 枢 枯 架 柄 某 染 柔 柱 柳 査 栄 栓 校 株 核 根 格 栽 桃 案 桑 桜 桟 梅 械 棄 棋 棒 棚 棟 森 棺 植 検 業 極 楼 楽 概 構 様 槽 標 模 権 横 樹 橋 機 欄 欠 次 欧 欲 欺 款 歌 歓 止 正 武 歩 歯 歳 歴 死 殉 殉 殊 残 殖 殴 段 殺 殻 殿 母 毎 毒 比 毛 氏 民 気 水 氷 永 汁 求 汎 汗 汚 江 池 決 汽 沈 沖 没 沢 河 沸 油 治 沼 沿 況 泉 泊 泌 法 泡 泡 波 泣 泥 注 泰 泳 洋 洗 洞 津 洪 活 派 流 浄 浅 浜 浦 浪 浮 浴 海 浸 消 涙 涯 液 涼 淑 淡 深 混 添 清 渇 渇 済 渉 渋 渓 減 渡 渦 温 測 港 湖 湯 湾 湾 湿 満 源 準 溝 溶 滅 滋 滑 滝 滞 滴 漁 漂 漆 漏 演 漠 漢 漫 漬 漸 潔 潜 潟 潤 潮 澄 激 濁 濃 濫 濯 瀬 火 灯 灰 災 炉 炊 炎 炭 点 為 烈 無 焦 然 焼 煙 照 煩 煮 熟 熱 燃 燥 爆 爵 父 片 版 牙 牛 牧 物 牲 特 犠 犬 犯 状 狂 狩 独 狭 猛 猟 猪 猫 献 猶 猿 獄 獣 獲 玄 率 玉 王 珍 珠 班 現 球 理 琴 環 璽 瓶 甘 甚 生 産 用 田 田 由 甲 申 男 町 画 界 畑 畔 留 畜 畝 略 番 異 畳 疎 疑 疫 疲 疾 病 症 痘 痛 痢 痴 療 癒 癖 癸 発 登 白 百 的 皆 皇 皮 皿 盆 益 盗 盛 盟 監 盤 目 盲 直 相 盾 省 看 県 真 眠 眺 眼 着 睡 督 瞬 矛 矢 知 短 矯 石 砂 研 砕 砲 破 硝 硫 硬 碁 碑 確 磁 磨 礁 礎 示 礼 社 祈 祉 祖 祚 祝 神 祥 票 祭 禁 禄 禅 禍 禍 禎 福 秀 私 秋 科 秒 秘 租 秩 称 移 程 税 稚 種 稲 稼 稿 穀 穂 積 穏 穫 穴 究 空 突 窃 窒 窓 窮 窯 立 竜 章 童 端 競 竹 笑 笛 符 第 筆 等 筋 筒 答 策 箇 算 管 箱 節 範 築 篤 簡 簿 籍 米 粉 粋 粒 粗 粘 粛 粧 精 糖 糧 糸 系 糾 紀 約 紅 紋 納 純 紙 紙 級 紛 素 素 紡 索 紫 累 細 紳 紹 紺 終 組 経 結 絞 絡 給 統 絵 絶 絹 継 続 維 綱 網 綿 緊 総 緑 緒 線 締 編 緩 緯 練 縁 縄 縛 縦 縫 縮 績 繁 繊 織 繕 繭 繰 缶 罪 置 罰 署 罷 羅 羊 美 群 義 羽 翁 翌 習 翻 翼 老 考 者 耐 耕 耗 耳 聖 聞 聴 職 肉 肌 肖 肝 肢 肥 肩 肪 肯 育 肺 胃 胆 背 胎 胞 胴 胸 能 脂 脅 脈 脚 脱 脳 脹 腐 腕 腰 腸 腹 膚 膜 膨 臓 臣 臨 自 臭 至 致 興 舌 舎 舗 舞 舟 航 般 舶 船 艇 艦 良 色 芋 芝 花 芳 芸 芽 苗 若 苦 英 茂 茎 茶 草 荒 荘 荷 菊 菌 菓 菜 華 落 葉 著 葬 蒸 蓄 蔵 薄 薦 薪 薪 薫 薬 藤 藩 藻 虎 虐 虚 虜 虞 虫 蚊 蚕 蛇 蛍 蛮 融 血 衆 行 術 街 衛 衝 衡 衣 表 衰 衷 袋 被 裁 裂 装 裏 裕 補 裸 製 複 褐 褒 襟 襲 西 要 覆 覇 見 規 視 覚 覧 親 観 角 解 触 言 訂 計 討 訓 託 記 訟 訪 設 許 訳 訴 診 証 詐 詔 評 詞 詠 試 詩 詰 詰 話 該 詳 誇 誉 誌 認 誓 誕 誘 語 誠 誤 説 読 誰 課 調 談 請 論 諭 諮 諸 諾 謀 謁 謄 謙 講 謝 謡 謹 識 譜 警 議 譲 護 谷 豆 豊 豚 象 豪 貝 貞 負 負 財 貢 貧 貧 貨 販 貫 責 貯 貴 買 貸 費 貿 賀 賃 賄 資 賊 賓 賛 賜 賞 賠 賢 賦 質 購 贈 赤 赦 走 赴 起 超 越 趣 足 距 跡 路 跳 践 踊 踏 躍 身 車 軌 軍 軒 軟 転 軸 軽 較 載 輝 輩 輪 輸 轄 辛 辞 辰 辰 辱 農 辺 込 迅 迎 近 返 迫 迭 述 迷 追 退 送 逃 逆 透 逐 逓 途 通 逝 速 造 連 逮 週 進 逸 遂 遅 遇 遊 運 遍 過 道 道 達 違 遠 遣 適 遭 遮 遵 遷 選 遺 避 還 邦 邪 邸 郊 郎 郡 部 郭 郵 郷 都 酉 酌 配 酒 酔 酢 酪 酬 酵 酷 酸 醜 醸 釈 里 里 重 野 量 金 針 釣 鈍 鈴 鉄 鉛 鉢 鉱 銀 銃 銅 銑 銘 銭 鋭 鋳 鋼 錘 錠 錬 錯 録 鍛 鎖 鎮 鏡 鐘 鑑 長 門 閉 開 閏 閑 間 関 閣 閥 閲 闘 阪 防 阻 附 降 限 陛 院 院 陣 除 陥 陪 陰 陳 陵 陶 陸 険 陽 隅 隆 隊 階 随 隔 際 障 隠 隣 隷 隻 雄 雄 雅 集 雇 雉 雌 雑 離 難 雨 雪 雰 雲 零 雷 電 需 震 霊 霜 霧 露 青 静 非 面 革 靴 韓 音 韻 響 頂 頃 項 順 預 預 頑 頒 領 頭 頻 頼 題 額 顔 顕 願 類 顧 風 飛 食 飢 飯 飲 飼 飼 飽 飾 養 餓 館 首 香 馬 駄 駄 駅 駆 駐 騎 騒 験 騰 驚 骨 髄 高 髪 鬼 魂 魅 魔 魚 鮮 鯨 鳥 鳴 鶏 鹿 麗 麦 麻 黄 黒 黙 鼓 鼠 鼻 齢", + 2: "‾ _ _ - - ‐ — ― 〜 ・ ・ , , 、 、 ; ; : : ! ! ? ? . . ‥ … 。 。 ' \ ‘ ’ \" " “ ” ( ( ) ) [ [ ] ] { { } } 〈 〉 《 》 「 「 」 」 『 』 【 】 〔 〕 ‖ § ¶ @ @ * * / / \\ & & # # % % ‰ † ‡ ′ ″ 〃 ※", + 3: "兌 拼 楔 錄 鳯", + }, + "jgo": { + 0: "a á â ǎ b c d ɛ ɛ́ ɛ̀ ɛ̂ ɛ̌ ɛ̄ f g h i í î ǐ j k l m ḿ m̀ m̄ n ń ǹ n̄ ŋ ŋ́ ŋ̀ ŋ̄ ɔ ɔ́ ɔ̂ ɔ̌ p pf s sh t ts u ú û ǔ ʉ ʉ́ ʉ̂ ʉ̌ ʉ̈ v w ẅ y z ꞌ", + 2: "- , ; : ! ? . ‹ › « »", + 3: "e o q r x", + 5: "A B C D Ɛ F G H I J K L M N Ŋ Ɔ P Pf S Sh T Ts U Ʉ Ʉ̈ V W Ẅ Y Z Ꞌ", + }, + "jmc": { + 0: "a b c d e f g h i j k l m n o p r s t u v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q x", + 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", + }, + "ka": { + 0: "ა ბ გ დ ე ვ ზ თ ი კ ლ მ ნ ო პ ჟ რ ს ტ უ ფ ქ ღ ყ შ ჩ ც ძ წ ჭ ხ ჯ ჰ", + 2: "- ‐ – — , ; : ! ? . … ჻ ' ‘ ‚ “ „ « » ( ) [ ] { } § @ * / & # † ‡ ′ ″ №", + 3: "ჱ ჲ ჳ ჴ ჵ ჶ ჷ ჸ ჹ ჺ ⴀ ⴁ ⴂ ⴃ ⴄ ⴅ ⴆ ⴡ ⴇ ⴈ ⴉ ⴊ ⴋ ⴌ ⴢ ⴍ ⴎ ⴏ ⴐ ⴑ ⴒ ⴣ ⴓ ⴔ ⴕ ⴖ ⴗ ⴘ ⴙ ⴚ ⴛ ⴜ ⴝ ⴞ ⴤ ⴟ ⴠ ⴥ", + 5: "ა ბ გ დ ე ვ ზ თ ი კ ლ მ ნ ო პ ჟ რ ს ტ უ ფ ქ ღ ყ შ ჩ ც ძ წ ჭ ხ ჯ ჰ", + }, + "kab": { + 0: "a b c č d ḍ e ɛ f g ǧ ɣ h ḥ i j k l m n p q r ṛ s ṣ t ṭ u w x y z ẓ", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "o v", + 5: "A B C Č D Ḍ E Ɛ F G Ǧ Ɣ H Ḥ I J K L M N P Q R Ṛ S Ṣ T Ṭ U W X Y Z Ẓ", + }, + "kam": { + 0: "a b c d e f g h i ĩ j k l m n o p q r s t u ũ v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "kde": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "kea": { + 0: "a b d dj e f g i j k l lh m n nh o p r s t tx u v x z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "á à ă â å ä ã ā æ c ç é è ĕ ê ë ē h í ì ĭ î ï ī ñ ó ò ŏ ô ö õ ø ō œ q ú ù ŭ û ü ū w y ÿ", + 5: "A B D E F G H I J K L M N O P R S T U V X Z", + }, + "khq": { + 0: "a ã b c d e ẽ f g h i j k l m n ɲ ŋ o õ p q r s š t u w x y z ž", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "v", + 5: "A à B C D E Ẽ F G H I J K L M N Ɲ Ŋ O Õ P Q R S Š T U W X Y Z Ž", + }, + "ki": { + 0: "a b c d e g h i ĩ j k m n o r t u ũ w y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "f l p q s v x z", + 5: "A B C D E G H I J K M N O R T U W Y", + }, + "kk": { + 0: "а ә б в г ғ д е ё ж з и й к қ л м н ң о ө п р с т у ұ ү ф х һ ц ч ш щ ъ ы і ь э ю я", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "А Ә Б В Г Ғ Д Е Ё Ж З И Й К Қ Л М Н Ң О Ө П Р С Т У Ұ Ү Ф Х Һ Ц Ч Ш Щ Ъ Ы І Ь Э Ю Я", + }, + "kkj": { + 0: "a á à â a̧ b ɓ c d ɗ ɗy e é è ê ɛ ɛ́ ɛ̀ ɛ̂ ɛ̧ f g gb gw h i í ì î i̧ j k kp kw l m mb n nd nj ny ŋ ŋg ŋgb ŋgw o ó ò ô ɔ ɔ́ ɔ̀ ɔ̂ ɔ̧ p r s t u ú ù û u̧ v w y", + 2: ", : ! ? . … ‘ ‹ › “ ” « » ( ) *", + 3: "q x z", + 5: "A B Ɓ C D Ɗ Ɗy E Ɛ F G Gb Gw H I I̧ J K Kp Kw L M Mb N Nd Nj Ny Ŋ Ŋg Ŋgb Ŋgw O Ɔ Ɔ̧ P R S T U U̧ V W Y", + }, + "kl": { + 0: "a á â ã b c d e é ê f g h i í î ĩ j k l m n o ô p q ĸ r s t u ú û ũ v w x y z æ ø å", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "kln": { + 0: "a b c d e g h i j k l m n o p r s t u w y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "f q v x z", + 5: "A B C D E G H I J K L M N O P R S T U W Y", + }, + "km": { + 0: "៌ ៎ ៏ ៑ ័ ៈ ់ ៉ ៊ ៍ ក ខ គ ឃ ង ច ឆ ជ ឈ ញ ដ ឋ ឌ ឍ ណ ត ថ ទ ធ ន ប ផ ព ភ ម យ រ ឫ ឬ ល ឭ ឮ វ ស ហ ឡ អ ឲ ឪ អា ឥ ឦ ឧ ឧក ឩ ឯ ឰ ឱ ឳ ា ិ ី ឹ ឺ ុ ូ ួ ើ ឿ ៀ េ ែ ៃ ោ ៅ ំ ះ ្", + 2: "- , ៖ ! ? . ។ ៕ ‘ ’ \" “ ” ( ) [ ] { } ៙ ៚", + 3: "឴ ឵ \u200b ឝ ឞ", + }, + "kn": { + 0: "಼ ೦ ೧ ೨ ೩ ೪ ೫ ೬ ೭ ೮ ೯ ಅ ಆ ಇ ಈ ಉ ಊ ಋ ೠ ಌ ೡ ಎ ಏ ಐ ಒ ಓ ಔ ಂ ಃ ಕ ಖ ಗ ಘ ಙ ಚ ಛ ಜ ಝ ಞ ಟ ಠ ಡ ಢ ಣ ತ ಥ ದ ಧ ನ ಪ ಫ ಬ ಭ ಮ ಯ ರ ಱ ಲ ವ ಶ ಷ ಸ ಹ ಳ ೞ ಽ ಾ ಿ ೀ ು ೂ ೃ ೄ ೆ ೇ ೈ ೊ ೋ ೌ ್ ೕ ೖ", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200c \u200d", + }, + "ko": { + 0: "가 가 각 갂 갃 간 갅 갆 갇 갈 갉 갊 갋 갌 갍 갎 갏 감 갑 값 갓 갔 강 갖 갗 갘 같 갚 갛 개 객 갞 갟 갠 갡 갢 갣 갤 갥 갦 갧 갨 갩 갪 갫 갬 갭 갮 갯 갰 갱 갲 갳 갴 갵 갶 갷 갸 갹 갺 갻 갼 갽 갾 갿 걀 걁 걂 걃 걄 걅 걆 걇 걈 걉 걊 걋 걌 걍 걎 걏 걐 걑 걒 걓 걔 걕 걖 걗 걘 걙 걚 걛 걜 걝 걞 걟 걠 걡 걢 걣 걤 걥 걦 걧 걨 걩 걪 걫 걬 걭 걮 걯 거 걱 걲 걳 건 걵 걶 걷 걸 걹 걺 걻 걼 걽 걾 걿 검 겁 겂 것 겄 겅 겆 겇 겈 겉 겊 겋 게 겍 겎 겏 겐 겑 겒 겓 겔 겕 겖 겗 겘 겙 겚 겛 겜 겝 겞 겟 겠 겡 겢 겣 겤 겥 겦 겧 겨 격 겪 겫 견 겭 겮 겯 결 겱 겲 겳 겴 겵 겶 겷 겸 겹 겺 겻 겼 경 겾 겿 곀 곁 곂 곃 계 곅 곆 곇 곈 곉 곊 곋 곌 곍 곎 곏 곐 곑 곒 곓 곔 곕 곖 곗 곘 곙 곚 곛 곜 곝 곞 곟 고 곡 곢 곣 곤 곥 곦 곧 골 곩 곪 곫 곬 곭 곮 곯 곰 곱 곲 곳 곴 공 곶 곷 곸 곹 곺 곻 과 곽 곾 곿 관 괁 괂 괃 괄 괅 괆 괇 괈 괉 괊 괋 괌 괍 괎 괏 괐 광 괒 괓 괔 괕 괖 괗 괘 괙 괚 괛 괜 괝 괞 괟 괠 괡 괢 괣 괤 괥 괦 괧 괨 괩 괪 괫 괬 괭 괮 괯 괰 괱 괲 괳 괴 괵 괶 괷 괸 괹 괺 괻 괼 괽 괾 괿 굀 굁 굂 굃 굄 굅 굆 굇 굈 굉 굊 굋 굌 굍 굎 굏 교 굑 굒 굓 굔 굕 굖 굗 굘 굙 굚 굛 굜 굝 굞 굟 굠 굡 굢 굣 굤 굥 굦 굧 굨 굩 굪 굫 구 국 굮 굯 군 굱 굲 굳 굴 굵 굶 굷 굸 굹 굺 굻 굼 굽 굾 굿 궀 궁 궂 궃 궄 궅 궆 궇 궈 궉 궊 궋 권 궍 궎 궏 궐 궑 궒 궓 궔 궕 궖 궗 궘 궙 궚 궛 궜 궝 궞 궟 궠 궡 궢 궣 궤 궥 궦 궧 궨 궩 궪 궫 궬 궭 궮 궯 궰 궱 궲 궳 궴 궵 궶 궷 궸 궹 궺 궻 궼 궽 궾 궿 귀 귁 귂 귃 귄 귅 귆 귇 귈 귉 귊 귋 귌 귍 귎 귏 귐 귑 귒 귓 귔 귕 귖 귗 귘 귙 귚 귛 규 귝 귞 귟 균 귡 귢 귣 귤 귥 귦 귧 귨 귩 귪 귫 귬 귭 귮 귯 귰 귱 귲 귳 귴 귵 귶 귷 그 극 귺 귻 근 귽 귾 귿 글 긁 긂 긃 긄 긅 긆 긇 금 급 긊 긋 긌 긍 긎 긏 긐 긑 긒 긓 긔 긕 긖 긗 긘 긙 긚 긛 긜 긝 긞 긟 긠 긡 긢 긣 긤 긥 긦 긧 긨 긩 긪 긫 긬 긭 긮 긯 기 긱 긲 긳 긴 긵 긶 긷 길 긹 긺 긻 긼 긽 긾 긿 김 깁 깂 깃 깄 깅 깆 깇 깈 깉 깊 깋 까 깍 깎 깏 깐 깑 깒 깓 깔 깕 깖 깗 깘 깙 깚 깛 깜 깝 깞 깟 깠 깡 깢 깣 깤 깥 깦 깧 깨 깩 깪 깫 깬 깭 깮 깯 깰 깱 깲 깳 깴 깵 깶 깷 깸 깹 깺 깻 깼 깽 깾 깿 꺀 꺁 꺂 꺃 꺄 꺅 꺆 꺇 꺈 꺉 꺊 꺋 꺌 꺍 꺎 꺏 꺐 꺑 꺒 꺓 꺔 꺕 꺖 꺗 꺘 꺙 꺚 꺛 꺜 꺝 꺞 꺟 꺠 꺡 꺢 꺣 꺤 꺥 꺦 꺧 꺨 꺩 꺪 꺫 꺬 꺭 꺮 꺯 꺰 꺱 꺲 꺳 꺴 꺵 꺶 꺷 꺸 꺹 꺺 꺻 꺼 꺽 꺾 꺿 껀 껁 껂 껃 껄 껅 껆 껇 껈 껉 껊 껋 껌 껍 껎 껏 껐 껑 껒 껓 껔 껕 껖 껗 께 껙 껚 껛 껜 껝 껞 껟 껠 껡 껢 껣 껤 껥 껦 껧 껨 껩 껪 껫 껬 껭 껮 껯 껰 껱 껲 껳 껴 껵 껶 껷 껸 껹 껺 껻 껼 껽 껾 껿 꼀 꼁 꼂 꼃 꼄 꼅 꼆 꼇 꼈 꼉 꼊 꼋 꼌 꼍 꼎 꼏 꼐 꼑 꼒 꼓 꼔 꼕 꼖 꼗 꼘 꼙 꼚 꼛 꼜 꼝 꼞 꼟 꼠 꼡 꼢 꼣 꼤 꼥 꼦 꼧 꼨 꼩 꼪 꼫 꼬 꼭 꼮 꼯 꼰 꼱 꼲 꼳 꼴 꼵 꼶 꼷 꼸 꼹 꼺 꼻 꼼 꼽 꼾 꼿 꽀 꽁 꽂 꽃 꽄 꽅 꽆 꽇 꽈 꽉 꽊 꽋 꽌 꽍 꽎 꽏 꽐 꽑 꽒 꽓 꽔 꽕 꽖 꽗 꽘 꽙 꽚 꽛 꽜 꽝 꽞 꽟 꽠 꽡 꽢 꽣 꽤 꽥 꽦 꽧 꽨 꽩 꽪 꽫 꽬 꽭 꽮 꽯 꽰 꽱 꽲 꽳 꽴 꽵 꽶 꽷 꽸 꽹 꽺 꽻 꽼 꽽 꽾 꽿 꾀 꾁 꾂 꾃 꾄 꾅 꾆 꾇 꾈 꾉 꾊 꾋 꾌 꾍 꾎 꾏 꾐 꾑 꾒 꾓 꾔 꾕 꾖 꾗 꾘 꾙 꾚 꾛 꾜 꾝 꾞 꾟 꾠 꾡 꾢 꾣 꾤 꾥 꾦 꾧 꾨 꾩 꾪 꾫 꾬 꾭 꾮 꾯 꾰 꾱 꾲 꾳 꾴 꾵 꾶 꾷 꾸 꾹 꾺 꾻 꾼 꾽 꾾 꾿 꿀 꿁 꿂 꿃 꿄 꿅 꿆 꿇 꿈 꿉 꿊 꿋 꿌 꿍 꿎 꿏 꿐 꿑 꿒 꿓 꿔 꿕 꿖 꿗 꿘 꿙 꿚 꿛 꿜 꿝 꿞 꿟 꿠 꿡 꿢 꿣 꿤 꿥 꿦 꿧 꿨 꿩 꿪 꿫 꿬 꿭 꿮 꿯 꿰 꿱 꿲 꿳 꿴 꿵 꿶 꿷 꿸 꿹 꿺 꿻 꿼 꿽 꿾 꿿 뀀 뀁 뀂 뀃 뀄 뀅 뀆 뀇 뀈 뀉 뀊 뀋 뀌 뀍 뀎 뀏 뀐 뀑 뀒 뀓 뀔 뀕 뀖 뀗 뀘 뀙 뀚 뀛 뀜 뀝 뀞 뀟 뀠 뀡 뀢 뀣 뀤 뀥 뀦 뀧 뀨 뀩 뀪 뀫 뀬 뀭 뀮 뀯 뀰 뀱 뀲 뀳 뀴 뀵 뀶 뀷 뀸 뀹 뀺 뀻 뀼 뀽 뀾 뀿 끀 끁 끂 끃 끄 끅 끆 끇 끈 끉 끊 끋 끌 끍 끎 끏 끐 끑 끒 끓 끔 끕 끖 끗 끘 끙 끚 끛 끜 끝 끞 끟 끠 끡 끢 끣 끤 끥 끦 끧 끨 끩 끪 끫 끬 끭 끮 끯 끰 끱 끲 끳 끴 끵 끶 끷 끸 끹 끺 끻 끼 끽 끾 끿 낀 낁 낂 낃 낄 낅 낆 낇 낈 낉 낊 낋 낌 낍 낎 낏 낐 낑 낒 낓 낔 낕 낖 낗 나 낙 낚 낛 난 낝 낞 낟 날 낡 낢 낣 낤 낥 낦 낧 남 납 낪 낫 났 낭 낮 낯 낰 낱 낲 낳 내 낵 낶 낷 낸 낹 낺 낻 낼 낽 낾 낿 냀 냁 냂 냃 냄 냅 냆 냇 냈 냉 냊 냋 냌 냍 냎 냏 냐 냑 냒 냓 냔 냕 냖 냗 냘 냙 냚 냛 냜 냝 냞 냟 냠 냡 냢 냣 냤 냥 냦 냧 냨 냩 냪 냫 냬 냭 냮 냯 냰 냱 냲 냳 냴 냵 냶 냷 냸 냹 냺 냻 냼 냽 냾 냿 넀 넁 넂 넃 넄 넅 넆 넇 너 넉 넊 넋 넌 넍 넎 넏 널 넑 넒 넓 넔 넕 넖 넗 넘 넙 넚 넛 넜 넝 넞 넟 넠 넡 넢 넣 네 넥 넦 넧 넨 넩 넪 넫 넬 넭 넮 넯 넰 넱 넲 넳 넴 넵 넶 넷 넸 넹 넺 넻 넼 넽 넾 넿 녀 녁 녂 녃 년 녅 녆 녇 녈 녉 녊 녋 녌 녍 녎 녏 념 녑 녒 녓 녔 녕 녖 녗 녘 녙 녚 녛 녜 녝 녞 녟 녠 녡 녢 녣 녤 녥 녦 녧 녨 녩 녪 녫 녬 녭 녮 녯 녰 녱 녲 녳 녴 녵 녶 녷 노 녹 녺 녻 논 녽 녾 녿 놀 놁 놂 놃 놄 놅 놆 놇 놈 놉 놊 놋 놌 농 놎 놏 놐 놑 높 놓 놔 놕 놖 놗 놘 놙 놚 놛 놜 놝 놞 놟 놠 놡 놢 놣 놤 놥 놦 놧 놨 놩 놪 놫 놬 놭 놮 놯 놰 놱 놲 놳 놴 놵 놶 놷 놸 놹 놺 놻 놼 놽 놾 놿 뇀 뇁 뇂 뇃 뇄 뇅 뇆 뇇 뇈 뇉 뇊 뇋 뇌 뇍 뇎 뇏 뇐 뇑 뇒 뇓 뇔 뇕 뇖 뇗 뇘 뇙 뇚 뇛 뇜 뇝 뇞 뇟 뇠 뇡 뇢 뇣 뇤 뇥 뇦 뇧 뇨 뇩 뇪 뇫 뇬 뇭 뇮 뇯 뇰 뇱 뇲 뇳 뇴 뇵 뇶 뇷 뇸 뇹 뇺 뇻 뇼 뇽 뇾 뇿 눀 눁 눂 눃 누 눅 눆 눇 눈 눉 눊 눋 눌 눍 눎 눏 눐 눑 눒 눓 눔 눕 눖 눗 눘 눙 눚 눛 눜 눝 눞 눟 눠 눡 눢 눣 눤 눥 눦 눧 눨 눩 눪 눫 눬 눭 눮 눯 눰 눱 눲 눳 눴 눵 눶 눷 눸 눹 눺 눻 눼 눽 눾 눿 뉀 뉁 뉂 뉃 뉄 뉅 뉆 뉇 뉈 뉉 뉊 뉋 뉌 뉍 뉎 뉏 뉐 뉑 뉒 뉓 뉔 뉕 뉖 뉗 뉘 뉙 뉚 뉛 뉜 뉝 뉞 뉟 뉠 뉡 뉢 뉣 뉤 뉥 뉦 뉧 뉨 뉩 뉪 뉫 뉬 뉭 뉮 뉯 뉰 뉱 뉲 뉳 뉴 뉵 뉶 뉷 뉸 뉹 뉺 뉻 뉼 뉽 뉾 뉿 늀 늁 늂 늃 늄 늅 늆 늇 늈 늉 늊 늋 늌 늍 늎 늏 느 늑 늒 늓 는 늕 늖 늗 늘 늙 늚 늛 늜 늝 늞 늟 늠 늡 늢 늣 늤 능 늦 늧 늨 늩 늪 늫 늬 늭 늮 늯 늰 늱 늲 늳 늴 늵 늶 늷 늸 늹 늺 늻 늼 늽 늾 늿 닀 닁 닂 닃 닄 닅 닆 닇 니 닉 닊 닋 닌 닍 닎 닏 닐 닑 닒 닓 닔 닕 닖 닗 님 닙 닚 닛 닜 닝 닞 닟 닠 닡 닢 닣 다 닥 닦 닧 단 닩 닪 닫 달 닭 닮 닯 닰 닱 닲 닳 담 답 닶 닷 닸 당 닺 닻 닼 닽 닾 닿 대 댁 댂 댃 댄 댅 댆 댇 댈 댉 댊 댋 댌 댍 댎 댏 댐 댑 댒 댓 댔 댕 댖 댗 댘 댙 댚 댛 댜 댝 댞 댟 댠 댡 댢 댣 댤 댥 댦 댧 댨 댩 댪 댫 댬 댭 댮 댯 댰 댱 댲 댳 댴 댵 댶 댷 댸 댹 댺 댻 댼 댽 댾 댿 덀 덁 덂 덃 덄 덅 덆 덇 덈 덉 덊 덋 덌 덍 덎 덏 덐 덑 덒 덓 더 덕 덖 덗 던 덙 덚 덛 덜 덝 덞 덟 덠 덡 덢 덣 덤 덥 덦 덧 덨 덩 덪 덫 덬 덭 덮 덯 데 덱 덲 덳 덴 덵 덶 덷 델 덹 덺 덻 덼 덽 덾 덿 뎀 뎁 뎂 뎃 뎄 뎅 뎆 뎇 뎈 뎉 뎊 뎋 뎌 뎍 뎎 뎏 뎐 뎑 뎒 뎓 뎔 뎕 뎖 뎗 뎘 뎙 뎚 뎛 뎜 뎝 뎞 뎟 뎠 뎡 뎢 뎣 뎤 뎥 뎦 뎧 뎨 뎩 뎪 뎫 뎬 뎭 뎮 뎯 뎰 뎱 뎲 뎳 뎴 뎵 뎶 뎷 뎸 뎹 뎺 뎻 뎼 뎽 뎾 뎿 돀 돁 돂 돃 도 독 돆 돇 돈 돉 돊 돋 돌 돍 돎 돏 돐 돑 돒 돓 돔 돕 돖 돗 돘 동 돚 돛 돜 돝 돞 돟 돠 돡 돢 돣 돤 돥 돦 돧 돨 돩 돪 돫 돬 돭 돮 돯 돰 돱 돲 돳 돴 돵 돶 돷 돸 돹 돺 돻 돼 돽 돾 돿 됀 됁 됂 됃 됄 됅 됆 됇 됈 됉 됊 됋 됌 됍 됎 됏 됐 됑 됒 됓 됔 됕 됖 됗 되 됙 됚 됛 된 됝 됞 됟 될 됡 됢 됣 됤 됥 됦 됧 됨 됩 됪 됫 됬 됭 됮 됯 됰 됱 됲 됳 됴 됵 됶 됷 됸 됹 됺 됻 됼 됽 됾 됿 둀 둁 둂 둃 둄 둅 둆 둇 둈 둉 둊 둋 둌 둍 둎 둏 두 둑 둒 둓 둔 둕 둖 둗 둘 둙 둚 둛 둜 둝 둞 둟 둠 둡 둢 둣 둤 둥 둦 둧 둨 둩 둪 둫 둬 둭 둮 둯 둰 둱 둲 둳 둴 둵 둶 둷 둸 둹 둺 둻 둼 둽 둾 둿 뒀 뒁 뒂 뒃 뒄 뒅 뒆 뒇 뒈 뒉 뒊 뒋 뒌 뒍 뒎 뒏 뒐 뒑 뒒 뒓 뒔 뒕 뒖 뒗 뒘 뒙 뒚 뒛 뒜 뒝 뒞 뒟 뒠 뒡 뒢 뒣 뒤 뒥 뒦 뒧 뒨 뒩 뒪 뒫 뒬 뒭 뒮 뒯 뒰 뒱 뒲 뒳 뒴 뒵 뒶 뒷 뒸 뒹 뒺 뒻 뒼 뒽 뒾 뒿 듀 듁 듂 듃 듄 듅 듆 듇 듈 듉 듊 듋 듌 듍 듎 듏 듐 듑 듒 듓 듔 듕 듖 듗 듘 듙 듚 듛 드 득 듞 듟 든 듡 듢 듣 들 듥 듦 듧 듨 듩 듪 듫 듬 듭 듮 듯 듰 등 듲 듳 듴 듵 듶 듷 듸 듹 듺 듻 듼 듽 듾 듿 딀 딁 딂 딃 딄 딅 딆 딇 딈 딉 딊 딋 딌 딍 딎 딏 딐 딑 딒 딓 디 딕 딖 딗 딘 딙 딚 딛 딜 딝 딞 딟 딠 딡 딢 딣 딤 딥 딦 딧 딨 딩 딪 딫 딬 딭 딮 딯 따 딱 딲 딳 딴 딵 딶 딷 딸 딹 딺 딻 딼 딽 딾 딿 땀 땁 땂 땃 땄 땅 땆 땇 땈 땉 땊 땋 때 땍 땎 땏 땐 땑 땒 땓 땔 땕 땖 땗 땘 땙 땚 땛 땜 땝 땞 땟 땠 땡 땢 땣 땤 땥 땦 땧 땨 땩 땪 땫 땬 땭 땮 땯 땰 땱 땲 땳 땴 땵 땶 땷 땸 땹 땺 땻 땼 땽 땾 땿 떀 떁 떂 떃 떄 떅 떆 떇 떈 떉 떊 떋 떌 떍 떎 떏 떐 떑 떒 떓 떔 떕 떖 떗 떘 떙 떚 떛 떜 떝 떞 떟 떠 떡 떢 떣 떤 떥 떦 떧 떨 떩 떪 떫 떬 떭 떮 떯 떰 떱 떲 떳 떴 떵 떶 떷 떸 떹 떺 떻 떼 떽 떾 떿 뗀 뗁 뗂 뗃 뗄 뗅 뗆 뗇 뗈 뗉 뗊 뗋 뗌 뗍 뗎 뗏 뗐 뗑 뗒 뗓 뗔 뗕 뗖 뗗 뗘 뗙 뗚 뗛 뗜 뗝 뗞 뗟 뗠 뗡 뗢 뗣 뗤 뗥 뗦 뗧 뗨 뗩 뗪 뗫 뗬 뗭 뗮 뗯 뗰 뗱 뗲 뗳 뗴 뗵 뗶 뗷 뗸 뗹 뗺 뗻 뗼 뗽 뗾 뗿 똀 똁 똂 똃 똄 똅 똆 똇 똈 똉 똊 똋 똌 똍 똎 똏 또 똑 똒 똓 똔 똕 똖 똗 똘 똙 똚 똛 똜 똝 똞 똟 똠 똡 똢 똣 똤 똥 똦 똧 똨 똩 똪 똫 똬 똭 똮 똯 똰 똱 똲 똳 똴 똵 똶 똷 똸 똹 똺 똻 똼 똽 똾 똿 뙀 뙁 뙂 뙃 뙄 뙅 뙆 뙇 뙈 뙉 뙊 뙋 뙌 뙍 뙎 뙏 뙐 뙑 뙒 뙓 뙔 뙕 뙖 뙗 뙘 뙙 뙚 뙛 뙜 뙝 뙞 뙟 뙠 뙡 뙢 뙣 뙤 뙥 뙦 뙧 뙨 뙩 뙪 뙫 뙬 뙭 뙮 뙯 뙰 뙱 뙲 뙳 뙴 뙵 뙶 뙷 뙸 뙹 뙺 뙻 뙼 뙽 뙾 뙿 뚀 뚁 뚂 뚃 뚄 뚅 뚆 뚇 뚈 뚉 뚊 뚋 뚌 뚍 뚎 뚏 뚐 뚑 뚒 뚓 뚔 뚕 뚖 뚗 뚘 뚙 뚚 뚛 뚜 뚝 뚞 뚟 뚠 뚡 뚢 뚣 뚤 뚥 뚦 뚧 뚨 뚩 뚪 뚫 뚬 뚭 뚮 뚯 뚰 뚱 뚲 뚳 뚴 뚵 뚶 뚷 뚸 뚹 뚺 뚻 뚼 뚽 뚾 뚿 뛀 뛁 뛂 뛃 뛄 뛅 뛆 뛇 뛈 뛉 뛊 뛋 뛌 뛍 뛎 뛏 뛐 뛑 뛒 뛓 뛔 뛕 뛖 뛗 뛘 뛙 뛚 뛛 뛜 뛝 뛞 뛟 뛠 뛡 뛢 뛣 뛤 뛥 뛦 뛧 뛨 뛩 뛪 뛫 뛬 뛭 뛮 뛯 뛰 뛱 뛲 뛳 뛴 뛵 뛶 뛷 뛸 뛹 뛺 뛻 뛼 뛽 뛾 뛿 뜀 뜁 뜂 뜃 뜄 뜅 뜆 뜇 뜈 뜉 뜊 뜋 뜌 뜍 뜎 뜏 뜐 뜑 뜒 뜓 뜔 뜕 뜖 뜗 뜘 뜙 뜚 뜛 뜜 뜝 뜞 뜟 뜠 뜡 뜢 뜣 뜤 뜥 뜦 뜧 뜨 뜩 뜪 뜫 뜬 뜭 뜮 뜯 뜰 뜱 뜲 뜳 뜴 뜵 뜶 뜷 뜸 뜹 뜺 뜻 뜼 뜽 뜾 뜿 띀 띁 띂 띃 띄 띅 띆 띇 띈 띉 띊 띋 띌 띍 띎 띏 띐 띑 띒 띓 띔 띕 띖 띗 띘 띙 띚 띛 띜 띝 띞 띟 띠 띡 띢 띣 띤 띥 띦 띧 띨 띩 띪 띫 띬 띭 띮 띯 띰 띱 띲 띳 띴 띵 띶 띷 띸 띹 띺 띻 라 락 띾 띿 란 랁 랂 랃 랄 랅 랆 랇 랈 랉 랊 랋 람 랍 랎 랏 랐 랑 랒 랓 랔 랕 랖 랗 래 랙 랚 랛 랜 랝 랞 랟 랠 랡 랢 랣 랤 랥 랦 랧 램 랩 랪 랫 랬 랭 랮 랯 랰 랱 랲 랳 랴 략 랶 랷 랸 랹 랺 랻 랼 랽 랾 랿 럀 럁 럂 럃 럄 럅 럆 럇 럈 량 럊 럋 럌 럍 럎 럏 럐 럑 럒 럓 럔 럕 럖 럗 럘 럙 럚 럛 럜 럝 럞 럟 럠 럡 럢 럣 럤 럥 럦 럧 럨 럩 럪 럫 러 럭 럮 럯 런 럱 럲 럳 럴 럵 럶 럷 럸 럹 럺 럻 럼 럽 럾 럿 렀 렁 렂 렃 렄 렅 렆 렇 레 렉 렊 렋 렌 렍 렎 렏 렐 렑 렒 렓 렔 렕 렖 렗 렘 렙 렚 렛 렜 렝 렞 렟 렠 렡 렢 렣 려 력 렦 렧 련 렩 렪 렫 렬 렭 렮 렯 렰 렱 렲 렳 렴 렵 렶 렷 렸 령 렺 렻 렼 렽 렾 렿 례 롁 롂 롃 롄 롅 롆 롇 롈 롉 롊 롋 롌 롍 롎 롏 롐 롑 롒 롓 롔 롕 롖 롗 롘 롙 롚 롛 로 록 롞 롟 론 롡 롢 롣 롤 롥 롦 롧 롨 롩 롪 롫 롬 롭 롮 롯 롰 롱 롲 롳 롴 롵 롶 롷 롸 롹 롺 롻 롼 롽 롾 롿 뢀 뢁 뢂 뢃 뢄 뢅 뢆 뢇 뢈 뢉 뢊 뢋 뢌 뢍 뢎 뢏 뢐 뢑 뢒 뢓 뢔 뢕 뢖 뢗 뢘 뢙 뢚 뢛 뢜 뢝 뢞 뢟 뢠 뢡 뢢 뢣 뢤 뢥 뢦 뢧 뢨 뢩 뢪 뢫 뢬 뢭 뢮 뢯 뢰 뢱 뢲 뢳 뢴 뢵 뢶 뢷 뢸 뢹 뢺 뢻 뢼 뢽 뢾 뢿 룀 룁 룂 룃 룄 룅 룆 룇 룈 룉 룊 룋 료 룍 룎 룏 룐 룑 룒 룓 룔 룕 룖 룗 룘 룙 룚 룛 룜 룝 룞 룟 룠 룡 룢 룣 룤 룥 룦 룧 루 룩 룪 룫 룬 룭 룮 룯 룰 룱 룲 룳 룴 룵 룶 룷 룸 룹 룺 룻 룼 룽 룾 룿 뤀 뤁 뤂 뤃 뤄 뤅 뤆 뤇 뤈 뤉 뤊 뤋 뤌 뤍 뤎 뤏 뤐 뤑 뤒 뤓 뤔 뤕 뤖 뤗 뤘 뤙 뤚 뤛 뤜 뤝 뤞 뤟 뤠 뤡 뤢 뤣 뤤 뤥 뤦 뤧 뤨 뤩 뤪 뤫 뤬 뤭 뤮 뤯 뤰 뤱 뤲 뤳 뤴 뤵 뤶 뤷 뤸 뤹 뤺 뤻 뤼 뤽 뤾 뤿 륀 륁 륂 륃 륄 륅 륆 륇 륈 륉 륊 륋 륌 륍 륎 륏 륐 륑 륒 륓 륔 륕 륖 륗 류 륙 륚 륛 륜 륝 륞 륟 률 륡 륢 륣 륤 륥 륦 륧 륨 륩 륪 륫 륬 륭 륮 륯 륰 륱 륲 륳 르 륵 륶 륷 른 륹 륺 륻 를 륽 륾 륿 릀 릁 릂 릃 름 릅 릆 릇 릈 릉 릊 릋 릌 릍 릎 릏 릐 릑 릒 릓 릔 릕 릖 릗 릘 릙 릚 릛 릜 릝 릞 릟 릠 릡 릢 릣 릤 릥 릦 릧 릨 릩 릪 릫 리 릭 릮 릯 린 릱 릲 릳 릴 릵 릶 릷 릸 릹 릺 릻 림 립 릾 릿 맀 링 맂 맃 맄 맅 맆 맇 마 막 맊 맋 만 맍 많 맏 말 맑 맒 맓 맔 맕 맖 맗 맘 맙 맚 맛 맜 망 맞 맟 맠 맡 맢 맣 매 맥 맦 맧 맨 맩 맪 맫 맬 맭 맮 맯 맰 맱 맲 맳 맴 맵 맶 맷 맸 맹 맺 맻 맼 맽 맾 맿 먀 먁 먂 먃 먄 먅 먆 먇 먈 먉 먊 먋 먌 먍 먎 먏 먐 먑 먒 먓 먔 먕 먖 먗 먘 먙 먚 먛 먜 먝 먞 먟 먠 먡 먢 먣 먤 먥 먦 먧 먨 먩 먪 먫 먬 먭 먮 먯 먰 먱 먲 먳 먴 먵 먶 먷 머 먹 먺 먻 먼 먽 먾 먿 멀 멁 멂 멃 멄 멅 멆 멇 멈 멉 멊 멋 멌 멍 멎 멏 멐 멑 멒 멓 메 멕 멖 멗 멘 멙 멚 멛 멜 멝 멞 멟 멠 멡 멢 멣 멤 멥 멦 멧 멨 멩 멪 멫 멬 멭 멮 멯 며 멱 멲 멳 면 멵 멶 멷 멸 멹 멺 멻 멼 멽 멾 멿 몀 몁 몂 몃 몄 명 몆 몇 몈 몉 몊 몋 몌 몍 몎 몏 몐 몑 몒 몓 몔 몕 몖 몗 몘 몙 몚 몛 몜 몝 몞 몟 몠 몡 몢 몣 몤 몥 몦 몧 모 목 몪 몫 몬 몭 몮 몯 몰 몱 몲 몳 몴 몵 몶 몷 몸 몹 몺 못 몼 몽 몾 몿 뫀 뫁 뫂 뫃 뫄 뫅 뫆 뫇 뫈 뫉 뫊 뫋 뫌 뫍 뫎 뫏 뫐 뫑 뫒 뫓 뫔 뫕 뫖 뫗 뫘 뫙 뫚 뫛 뫜 뫝 뫞 뫟 뫠 뫡 뫢 뫣 뫤 뫥 뫦 뫧 뫨 뫩 뫪 뫫 뫬 뫭 뫮 뫯 뫰 뫱 뫲 뫳 뫴 뫵 뫶 뫷 뫸 뫹 뫺 뫻 뫼 뫽 뫾 뫿 묀 묁 묂 묃 묄 묅 묆 묇 묈 묉 묊 묋 묌 묍 묎 묏 묐 묑 묒 묓 묔 묕 묖 묗 묘 묙 묚 묛 묜 묝 묞 묟 묠 묡 묢 묣 묤 묥 묦 묧 묨 묩 묪 묫 묬 묭 묮 묯 묰 묱 묲 묳 무 묵 묶 묷 문 묹 묺 묻 물 묽 묾 묿 뭀 뭁 뭂 뭃 뭄 뭅 뭆 뭇 뭈 뭉 뭊 뭋 뭌 뭍 뭎 뭏 뭐 뭑 뭒 뭓 뭔 뭕 뭖 뭗 뭘 뭙 뭚 뭛 뭜 뭝 뭞 뭟 뭠 뭡 뭢 뭣 뭤 뭥 뭦 뭧 뭨 뭩 뭪 뭫 뭬 뭭 뭮 뭯 뭰 뭱 뭲 뭳 뭴 뭵 뭶 뭷 뭸 뭹 뭺 뭻 뭼 뭽 뭾 뭿 뮀 뮁 뮂 뮃 뮄 뮅 뮆 뮇 뮈 뮉 뮊 뮋 뮌 뮍 뮎 뮏 뮐 뮑 뮒 뮓 뮔 뮕 뮖 뮗 뮘 뮙 뮚 뮛 뮜 뮝 뮞 뮟 뮠 뮡 뮢 뮣 뮤 뮥 뮦 뮧 뮨 뮩 뮪 뮫 뮬 뮭 뮮 뮯 뮰 뮱 뮲 뮳 뮴 뮵 뮶 뮷 뮸 뮹 뮺 뮻 뮼 뮽 뮾 뮿 므 믁 믂 믃 믄 믅 믆 믇 믈 믉 믊 믋 믌 믍 믎 믏 믐 믑 믒 믓 믔 믕 믖 믗 믘 믙 믚 믛 믜 믝 믞 믟 믠 믡 믢 믣 믤 믥 믦 믧 믨 믩 믪 믫 믬 믭 믮 믯 믰 믱 믲 믳 믴 믵 믶 믷 미 믹 믺 믻 민 믽 믾 믿 밀 밁 밂 밃 밄 밅 밆 밇 밈 밉 밊 밋 밌 밍 밎 및 밐 밑 밒 밓 바 박 밖 밗 반 밙 밚 받 발 밝 밞 밟 밠 밡 밢 밣 밤 밥 밦 밧 밨 방 밪 밫 밬 밭 밮 밯 배 백 밲 밳 밴 밵 밶 밷 밸 밹 밺 밻 밼 밽 밾 밿 뱀 뱁 뱂 뱃 뱄 뱅 뱆 뱇 뱈 뱉 뱊 뱋 뱌 뱍 뱎 뱏 뱐 뱑 뱒 뱓 뱔 뱕 뱖 뱗 뱘 뱙 뱚 뱛 뱜 뱝 뱞 뱟 뱠 뱡 뱢 뱣 뱤 뱥 뱦 뱧 뱨 뱩 뱪 뱫 뱬 뱭 뱮 뱯 뱰 뱱 뱲 뱳 뱴 뱵 뱶 뱷 뱸 뱹 뱺 뱻 뱼 뱽 뱾 뱿 벀 벁 벂 벃 버 벅 벆 벇 번 벉 벊 벋 벌 벍 벎 벏 벐 벑 벒 벓 범 법 벖 벗 벘 벙 벚 벛 벜 벝 벞 벟 베 벡 벢 벣 벤 벥 벦 벧 벨 벩 벪 벫 벬 벭 벮 벯 벰 벱 벲 벳 벴 벵 벶 벷 벸 벹 벺 벻 벼 벽 벾 벿 변 볁 볂 볃 별 볅 볆 볇 볈 볉 볊 볋 볌 볍 볎 볏 볐 병 볒 볓 볔 볕 볖 볗 볘 볙 볚 볛 볜 볝 볞 볟 볠 볡 볢 볣 볤 볥 볦 볧 볨 볩 볪 볫 볬 볭 볮 볯 볰 볱 볲 볳 보 복 볶 볷 본 볹 볺 볻 볼 볽 볾 볿 봀 봁 봂 봃 봄 봅 봆 봇 봈 봉 봊 봋 봌 봍 봎 봏 봐 봑 봒 봓 봔 봕 봖 봗 봘 봙 봚 봛 봜 봝 봞 봟 봠 봡 봢 봣 봤 봥 봦 봧 봨 봩 봪 봫 봬 봭 봮 봯 봰 봱 봲 봳 봴 봵 봶 봷 봸 봹 봺 봻 봼 봽 봾 봿 뵀 뵁 뵂 뵃 뵄 뵅 뵆 뵇 뵈 뵉 뵊 뵋 뵌 뵍 뵎 뵏 뵐 뵑 뵒 뵓 뵔 뵕 뵖 뵗 뵘 뵙 뵚 뵛 뵜 뵝 뵞 뵟 뵠 뵡 뵢 뵣 뵤 뵥 뵦 뵧 뵨 뵩 뵪 뵫 뵬 뵭 뵮 뵯 뵰 뵱 뵲 뵳 뵴 뵵 뵶 뵷 뵸 뵹 뵺 뵻 뵼 뵽 뵾 뵿 부 북 붂 붃 분 붅 붆 붇 불 붉 붊 붋 붌 붍 붎 붏 붐 붑 붒 붓 붔 붕 붖 붗 붘 붙 붚 붛 붜 붝 붞 붟 붠 붡 붢 붣 붤 붥 붦 붧 붨 붩 붪 붫 붬 붭 붮 붯 붰 붱 붲 붳 붴 붵 붶 붷 붸 붹 붺 붻 붼 붽 붾 붿 뷀 뷁 뷂 뷃 뷄 뷅 뷆 뷇 뷈 뷉 뷊 뷋 뷌 뷍 뷎 뷏 뷐 뷑 뷒 뷓 뷔 뷕 뷖 뷗 뷘 뷙 뷚 뷛 뷜 뷝 뷞 뷟 뷠 뷡 뷢 뷣 뷤 뷥 뷦 뷧 뷨 뷩 뷪 뷫 뷬 뷭 뷮 뷯 뷰 뷱 뷲 뷳 뷴 뷵 뷶 뷷 뷸 뷹 뷺 뷻 뷼 뷽 뷾 뷿 븀 븁 븂 븃 븄 븅 븆 븇 븈 븉 븊 븋 브 븍 븎 븏 븐 븑 븒 븓 블 븕 븖 븗 븘 븙 븚 븛 븜 븝 븞 븟 븠 븡 븢 븣 븤 븥 븦 븧 븨 븩 븪 븫 븬 븭 븮 븯 븰 븱 븲 븳 븴 븵 븶 븷 븸 븹 븺 븻 븼 븽 븾 븿 빀 빁 빂 빃 비 빅 빆 빇 빈 빉 빊 빋 빌 빍 빎 빏 빐 빑 빒 빓 빔 빕 빖 빗 빘 빙 빚 빛 빜 빝 빞 빟 빠 빡 빢 빣 빤 빥 빦 빧 빨 빩 빪 빫 빬 빭 빮 빯 빰 빱 빲 빳 빴 빵 빶 빷 빸 빹 빺 빻 빼 빽 빾 빿 뺀 뺁 뺂 뺃 뺄 뺅 뺆 뺇 뺈 뺉 뺊 뺋 뺌 뺍 뺎 뺏 뺐 뺑 뺒 뺓 뺔 뺕 뺖 뺗 뺘 뺙 뺚 뺛 뺜 뺝 뺞 뺟 뺠 뺡 뺢 뺣 뺤 뺥 뺦 뺧 뺨 뺩 뺪 뺫 뺬 뺭 뺮 뺯 뺰 뺱 뺲 뺳 뺴 뺵 뺶 뺷 뺸 뺹 뺺 뺻 뺼 뺽 뺾 뺿 뻀 뻁 뻂 뻃 뻄 뻅 뻆 뻇 뻈 뻉 뻊 뻋 뻌 뻍 뻎 뻏 뻐 뻑 뻒 뻓 뻔 뻕 뻖 뻗 뻘 뻙 뻚 뻛 뻜 뻝 뻞 뻟 뻠 뻡 뻢 뻣 뻤 뻥 뻦 뻧 뻨 뻩 뻪 뻫 뻬 뻭 뻮 뻯 뻰 뻱 뻲 뻳 뻴 뻵 뻶 뻷 뻸 뻹 뻺 뻻 뻼 뻽 뻾 뻿 뼀 뼁 뼂 뼃 뼄 뼅 뼆 뼇 뼈 뼉 뼊 뼋 뼌 뼍 뼎 뼏 뼐 뼑 뼒 뼓 뼔 뼕 뼖 뼗 뼘 뼙 뼚 뼛 뼜 뼝 뼞 뼟 뼠 뼡 뼢 뼣 뼤 뼥 뼦 뼧 뼨 뼩 뼪 뼫 뼬 뼭 뼮 뼯 뼰 뼱 뼲 뼳 뼴 뼵 뼶 뼷 뼸 뼹 뼺 뼻 뼼 뼽 뼾 뼿 뽀 뽁 뽂 뽃 뽄 뽅 뽆 뽇 뽈 뽉 뽊 뽋 뽌 뽍 뽎 뽏 뽐 뽑 뽒 뽓 뽔 뽕 뽖 뽗 뽘 뽙 뽚 뽛 뽜 뽝 뽞 뽟 뽠 뽡 뽢 뽣 뽤 뽥 뽦 뽧 뽨 뽩 뽪 뽫 뽬 뽭 뽮 뽯 뽰 뽱 뽲 뽳 뽴 뽵 뽶 뽷 뽸 뽹 뽺 뽻 뽼 뽽 뽾 뽿 뾀 뾁 뾂 뾃 뾄 뾅 뾆 뾇 뾈 뾉 뾊 뾋 뾌 뾍 뾎 뾏 뾐 뾑 뾒 뾓 뾔 뾕 뾖 뾗 뾘 뾙 뾚 뾛 뾜 뾝 뾞 뾟 뾠 뾡 뾢 뾣 뾤 뾥 뾦 뾧 뾨 뾩 뾪 뾫 뾬 뾭 뾮 뾯 뾰 뾱 뾲 뾳 뾴 뾵 뾶 뾷 뾸 뾹 뾺 뾻 뾼 뾽 뾾 뾿 뿀 뿁 뿂 뿃 뿄 뿅 뿆 뿇 뿈 뿉 뿊 뿋 뿌 뿍 뿎 뿏 뿐 뿑 뿒 뿓 뿔 뿕 뿖 뿗 뿘 뿙 뿚 뿛 뿜 뿝 뿞 뿟 뿠 뿡 뿢 뿣 뿤 뿥 뿦 뿧 뿨 뿩 뿪 뿫 뿬 뿭 뿮 뿯 뿰 뿱 뿲 뿳 뿴 뿵 뿶 뿷 뿸 뿹 뿺 뿻 뿼 뿽 뿾 뿿 쀀 쀁 쀂 쀃 쀄 쀅 쀆 쀇 쀈 쀉 쀊 쀋 쀌 쀍 쀎 쀏 쀐 쀑 쀒 쀓 쀔 쀕 쀖 쀗 쀘 쀙 쀚 쀛 쀜 쀝 쀞 쀟 쀠 쀡 쀢 쀣 쀤 쀥 쀦 쀧 쀨 쀩 쀪 쀫 쀬 쀭 쀮 쀯 쀰 쀱 쀲 쀳 쀴 쀵 쀶 쀷 쀸 쀹 쀺 쀻 쀼 쀽 쀾 쀿 쁀 쁁 쁂 쁃 쁄 쁅 쁆 쁇 쁈 쁉 쁊 쁋 쁌 쁍 쁎 쁏 쁐 쁑 쁒 쁓 쁔 쁕 쁖 쁗 쁘 쁙 쁚 쁛 쁜 쁝 쁞 쁟 쁠 쁡 쁢 쁣 쁤 쁥 쁦 쁧 쁨 쁩 쁪 쁫 쁬 쁭 쁮 쁯 쁰 쁱 쁲 쁳 쁴 쁵 쁶 쁷 쁸 쁹 쁺 쁻 쁼 쁽 쁾 쁿 삀 삁 삂 삃 삄 삅 삆 삇 삈 삉 삊 삋 삌 삍 삎 삏 삐 삑 삒 삓 삔 삕 삖 삗 삘 삙 삚 삛 삜 삝 삞 삟 삠 삡 삢 삣 삤 삥 삦 삧 삨 삩 삪 삫 사 삭 삮 삯 산 삱 삲 삳 살 삵 삶 삷 삸 삹 삺 삻 삼 삽 삾 삿 샀 상 샂 샃 샄 샅 샆 샇 새 색 샊 샋 샌 샍 샎 샏 샐 샑 샒 샓 샔 샕 샖 샗 샘 샙 샚 샛 샜 생 샞 샟 샠 샡 샢 샣 샤 샥 샦 샧 샨 샩 샪 샫 샬 샭 샮 샯 샰 샱 샲 샳 샴 샵 샶 샷 샸 샹 샺 샻 샼 샽 샾 샿 섀 섁 섂 섃 섄 섅 섆 섇 섈 섉 섊 섋 섌 섍 섎 섏 섐 섑 섒 섓 섔 섕 섖 섗 섘 섙 섚 섛 서 석 섞 섟 선 섡 섢 섣 설 섥 섦 섧 섨 섩 섪 섫 섬 섭 섮 섯 섰 성 섲 섳 섴 섵 섶 섷 세 섹 섺 섻 센 섽 섾 섿 셀 셁 셂 셃 셄 셅 셆 셇 셈 셉 셊 셋 셌 셍 셎 셏 셐 셑 셒 셓 셔 셕 셖 셗 션 셙 셚 셛 셜 셝 셞 셟 셠 셡 셢 셣 셤 셥 셦 셧 셨 셩 셪 셫 셬 셭 셮 셯 셰 셱 셲 셳 셴 셵 셶 셷 셸 셹 셺 셻 셼 셽 셾 셿 솀 솁 솂 솃 솄 솅 솆 솇 솈 솉 솊 솋 소 속 솎 솏 손 솑 솒 솓 솔 솕 솖 솗 솘 솙 솚 솛 솜 솝 솞 솟 솠 송 솢 솣 솤 솥 솦 솧 솨 솩 솪 솫 솬 솭 솮 솯 솰 솱 솲 솳 솴 솵 솶 솷 솸 솹 솺 솻 솼 솽 솾 솿 쇀 쇁 쇂 쇃 쇄 쇅 쇆 쇇 쇈 쇉 쇊 쇋 쇌 쇍 쇎 쇏 쇐 쇑 쇒 쇓 쇔 쇕 쇖 쇗 쇘 쇙 쇚 쇛 쇜 쇝 쇞 쇟 쇠 쇡 쇢 쇣 쇤 쇥 쇦 쇧 쇨 쇩 쇪 쇫 쇬 쇭 쇮 쇯 쇰 쇱 쇲 쇳 쇴 쇵 쇶 쇷 쇸 쇹 쇺 쇻 쇼 쇽 쇾 쇿 숀 숁 숂 숃 숄 숅 숆 숇 숈 숉 숊 숋 숌 숍 숎 숏 숐 숑 숒 숓 숔 숕 숖 숗 수 숙 숚 숛 순 숝 숞 숟 술 숡 숢 숣 숤 숥 숦 숧 숨 숩 숪 숫 숬 숭 숮 숯 숰 숱 숲 숳 숴 숵 숶 숷 숸 숹 숺 숻 숼 숽 숾 숿 쉀 쉁 쉂 쉃 쉄 쉅 쉆 쉇 쉈 쉉 쉊 쉋 쉌 쉍 쉎 쉏 쉐 쉑 쉒 쉓 쉔 쉕 쉖 쉗 쉘 쉙 쉚 쉛 쉜 쉝 쉞 쉟 쉠 쉡 쉢 쉣 쉤 쉥 쉦 쉧 쉨 쉩 쉪 쉫 쉬 쉭 쉮 쉯 쉰 쉱 쉲 쉳 쉴 쉵 쉶 쉷 쉸 쉹 쉺 쉻 쉼 쉽 쉾 쉿 슀 슁 슂 슃 슄 슅 슆 슇 슈 슉 슊 슋 슌 슍 슎 슏 슐 슑 슒 슓 슔 슕 슖 슗 슘 슙 슚 슛 슜 슝 슞 슟 슠 슡 슢 슣 스 슥 슦 슧 슨 슩 슪 슫 슬 슭 슮 슯 슰 슱 슲 슳 슴 습 슶 슷 슸 승 슺 슻 슼 슽 슾 슿 싀 싁 싂 싃 싄 싅 싆 싇 싈 싉 싊 싋 싌 싍 싎 싏 싐 싑 싒 싓 싔 싕 싖 싗 싘 싙 싚 싛 시 식 싞 싟 신 싡 싢 싣 실 싥 싦 싧 싨 싩 싪 싫 심 십 싮 싯 싰 싱 싲 싳 싴 싵 싶 싷 싸 싹 싺 싻 싼 싽 싾 싿 쌀 쌁 쌂 쌃 쌄 쌅 쌆 쌇 쌈 쌉 쌊 쌋 쌌 쌍 쌎 쌏 쌐 쌑 쌒 쌓 쌔 쌕 쌖 쌗 쌘 쌙 쌚 쌛 쌜 쌝 쌞 쌟 쌠 쌡 쌢 쌣 쌤 쌥 쌦 쌧 쌨 쌩 쌪 쌫 쌬 쌭 쌮 쌯 쌰 쌱 쌲 쌳 쌴 쌵 쌶 쌷 쌸 쌹 쌺 쌻 쌼 쌽 쌾 쌿 썀 썁 썂 썃 썄 썅 썆 썇 썈 썉 썊 썋 썌 썍 썎 썏 썐 썑 썒 썓 썔 썕 썖 썗 썘 썙 썚 썛 썜 썝 썞 썟 썠 썡 썢 썣 썤 썥 썦 썧 써 썩 썪 썫 썬 썭 썮 썯 썰 썱 썲 썳 썴 썵 썶 썷 썸 썹 썺 썻 썼 썽 썾 썿 쎀 쎁 쎂 쎃 쎄 쎅 쎆 쎇 쎈 쎉 쎊 쎋 쎌 쎍 쎎 쎏 쎐 쎑 쎒 쎓 쎔 쎕 쎖 쎗 쎘 쎙 쎚 쎛 쎜 쎝 쎞 쎟 쎠 쎡 쎢 쎣 쎤 쎥 쎦 쎧 쎨 쎩 쎪 쎫 쎬 쎭 쎮 쎯 쎰 쎱 쎲 쎳 쎴 쎵 쎶 쎷 쎸 쎹 쎺 쎻 쎼 쎽 쎾 쎿 쏀 쏁 쏂 쏃 쏄 쏅 쏆 쏇 쏈 쏉 쏊 쏋 쏌 쏍 쏎 쏏 쏐 쏑 쏒 쏓 쏔 쏕 쏖 쏗 쏘 쏙 쏚 쏛 쏜 쏝 쏞 쏟 쏠 쏡 쏢 쏣 쏤 쏥 쏦 쏧 쏨 쏩 쏪 쏫 쏬 쏭 쏮 쏯 쏰 쏱 쏲 쏳 쏴 쏵 쏶 쏷 쏸 쏹 쏺 쏻 쏼 쏽 쏾 쏿 쐀 쐁 쐂 쐃 쐄 쐅 쐆 쐇 쐈 쐉 쐊 쐋 쐌 쐍 쐎 쐏 쐐 쐑 쐒 쐓 쐔 쐕 쐖 쐗 쐘 쐙 쐚 쐛 쐜 쐝 쐞 쐟 쐠 쐡 쐢 쐣 쐤 쐥 쐦 쐧 쐨 쐩 쐪 쐫 쐬 쐭 쐮 쐯 쐰 쐱 쐲 쐳 쐴 쐵 쐶 쐷 쐸 쐹 쐺 쐻 쐼 쐽 쐾 쐿 쑀 쑁 쑂 쑃 쑄 쑅 쑆 쑇 쑈 쑉 쑊 쑋 쑌 쑍 쑎 쑏 쑐 쑑 쑒 쑓 쑔 쑕 쑖 쑗 쑘 쑙 쑚 쑛 쑜 쑝 쑞 쑟 쑠 쑡 쑢 쑣 쑤 쑥 쑦 쑧 쑨 쑩 쑪 쑫 쑬 쑭 쑮 쑯 쑰 쑱 쑲 쑳 쑴 쑵 쑶 쑷 쑸 쑹 쑺 쑻 쑼 쑽 쑾 쑿 쒀 쒁 쒂 쒃 쒄 쒅 쒆 쒇 쒈 쒉 쒊 쒋 쒌 쒍 쒎 쒏 쒐 쒑 쒒 쒓 쒔 쒕 쒖 쒗 쒘 쒙 쒚 쒛 쒜 쒝 쒞 쒟 쒠 쒡 쒢 쒣 쒤 쒥 쒦 쒧 쒨 쒩 쒪 쒫 쒬 쒭 쒮 쒯 쒰 쒱 쒲 쒳 쒴 쒵 쒶 쒷 쒸 쒹 쒺 쒻 쒼 쒽 쒾 쒿 쓀 쓁 쓂 쓃 쓄 쓅 쓆 쓇 쓈 쓉 쓊 쓋 쓌 쓍 쓎 쓏 쓐 쓑 쓒 쓓 쓔 쓕 쓖 쓗 쓘 쓙 쓚 쓛 쓜 쓝 쓞 쓟 쓠 쓡 쓢 쓣 쓤 쓥 쓦 쓧 쓨 쓩 쓪 쓫 쓬 쓭 쓮 쓯 쓰 쓱 쓲 쓳 쓴 쓵 쓶 쓷 쓸 쓹 쓺 쓻 쓼 쓽 쓾 쓿 씀 씁 씂 씃 씄 씅 씆 씇 씈 씉 씊 씋 씌 씍 씎 씏 씐 씑 씒 씓 씔 씕 씖 씗 씘 씙 씚 씛 씜 씝 씞 씟 씠 씡 씢 씣 씤 씥 씦 씧 씨 씩 씪 씫 씬 씭 씮 씯 씰 씱 씲 씳 씴 씵 씶 씷 씸 씹 씺 씻 씼 씽 씾 씿 앀 앁 앂 앃 아 악 앆 앇 안 앉 않 앋 알 앍 앎 앏 앐 앑 앒 앓 암 압 앖 앗 았 앙 앚 앛 앜 앝 앞 앟 애 액 앢 앣 앤 앥 앦 앧 앨 앩 앪 앫 앬 앭 앮 앯 앰 앱 앲 앳 앴 앵 앶 앷 앸 앹 앺 앻 야 약 앾 앿 얀 얁 얂 얃 얄 얅 얆 얇 얈 얉 얊 얋 얌 얍 얎 얏 얐 양 얒 얓 얔 얕 얖 얗 얘 얙 얚 얛 얜 얝 얞 얟 얠 얡 얢 얣 얤 얥 얦 얧 얨 얩 얪 얫 얬 얭 얮 얯 얰 얱 얲 얳 어 억 얶 얷 언 얹 얺 얻 얼 얽 얾 얿 엀 엁 엂 엃 엄 업 없 엇 었 엉 엊 엋 엌 엍 엎 엏 에 엑 엒 엓 엔 엕 엖 엗 엘 엙 엚 엛 엜 엝 엞 엟 엠 엡 엢 엣 엤 엥 엦 엧 엨 엩 엪 엫 여 역 엮 엯 연 엱 엲 엳 열 엵 엶 엷 엸 엹 엺 엻 염 엽 엾 엿 였 영 옂 옃 옄 옅 옆 옇 예 옉 옊 옋 옌 옍 옎 옏 옐 옑 옒 옓 옔 옕 옖 옗 옘 옙 옚 옛 옜 옝 옞 옟 옠 옡 옢 옣 오 옥 옦 옧 온 옩 옪 옫 올 옭 옮 옯 옰 옱 옲 옳 옴 옵 옶 옷 옸 옹 옺 옻 옼 옽 옾 옿 와 왁 왂 왃 완 왅 왆 왇 왈 왉 왊 왋 왌 왍 왎 왏 왐 왑 왒 왓 왔 왕 왖 왗 왘 왙 왚 왛 왜 왝 왞 왟 왠 왡 왢 왣 왤 왥 왦 왧 왨 왩 왪 왫 왬 왭 왮 왯 왰 왱 왲 왳 왴 왵 왶 왷 외 왹 왺 왻 왼 왽 왾 왿 욀 욁 욂 욃 욄 욅 욆 욇 욈 욉 욊 욋 욌 욍 욎 욏 욐 욑 욒 욓 요 욕 욖 욗 욘 욙 욚 욛 욜 욝 욞 욟 욠 욡 욢 욣 욤 욥 욦 욧 욨 용 욪 욫 욬 욭 욮 욯 우 욱 욲 욳 운 욵 욶 욷 울 욹 욺 욻 욼 욽 욾 욿 움 웁 웂 웃 웄 웅 웆 웇 웈 웉 웊 웋 워 웍 웎 웏 원 웑 웒 웓 월 웕 웖 웗 웘 웙 웚 웛 웜 웝 웞 웟 웠 웡 웢 웣 웤 웥 웦 웧 웨 웩 웪 웫 웬 웭 웮 웯 웰 웱 웲 웳 웴 웵 웶 웷 웸 웹 웺 웻 웼 웽 웾 웿 윀 윁 윂 윃 위 윅 윆 윇 윈 윉 윊 윋 윌 윍 윎 윏 윐 윑 윒 윓 윔 윕 윖 윗 윘 윙 윚 윛 윜 윝 윞 윟 유 육 윢 윣 윤 윥 윦 윧 율 윩 윪 윫 윬 윭 윮 윯 윰 윱 윲 윳 윴 융 윶 윷 윸 윹 윺 윻 으 윽 윾 윿 은 읁 읂 읃 을 읅 읆 읇 읈 읉 읊 읋 음 읍 읎 읏 읐 응 읒 읓 읔 읕 읖 읗 의 읙 읚 읛 읜 읝 읞 읟 읠 읡 읢 읣 읤 읥 읦 읧 읨 읩 읪 읫 읬 읭 읮 읯 읰 읱 읲 읳 이 익 읶 읷 인 읹 읺 읻 일 읽 읾 읿 잀 잁 잂 잃 임 입 잆 잇 있 잉 잊 잋 잌 잍 잎 잏 자 작 잒 잓 잔 잕 잖 잗 잘 잙 잚 잛 잜 잝 잞 잟 잠 잡 잢 잣 잤 장 잦 잧 잨 잩 잪 잫 재 잭 잮 잯 잰 잱 잲 잳 잴 잵 잶 잷 잸 잹 잺 잻 잼 잽 잾 잿 쟀 쟁 쟂 쟃 쟄 쟅 쟆 쟇 쟈 쟉 쟊 쟋 쟌 쟍 쟎 쟏 쟐 쟑 쟒 쟓 쟔 쟕 쟖 쟗 쟘 쟙 쟚 쟛 쟜 쟝 쟞 쟟 쟠 쟡 쟢 쟣 쟤 쟥 쟦 쟧 쟨 쟩 쟪 쟫 쟬 쟭 쟮 쟯 쟰 쟱 쟲 쟳 쟴 쟵 쟶 쟷 쟸 쟹 쟺 쟻 쟼 쟽 쟾 쟿 저 적 젂 젃 전 젅 젆 젇 절 젉 젊 젋 젌 젍 젎 젏 점 접 젒 젓 젔 정 젖 젗 젘 젙 젚 젛 제 젝 젞 젟 젠 젡 젢 젣 젤 젥 젦 젧 젨 젩 젪 젫 젬 젭 젮 젯 젰 젱 젲 젳 젴 젵 젶 젷 져 젹 젺 젻 젼 젽 젾 젿 졀 졁 졂 졃 졄 졅 졆 졇 졈 졉 졊 졋 졌 졍 졎 졏 졐 졑 졒 졓 졔 졕 졖 졗 졘 졙 졚 졛 졜 졝 졞 졟 졠 졡 졢 졣 졤 졥 졦 졧 졨 졩 졪 졫 졬 졭 졮 졯 조 족 졲 졳 존 졵 졶 졷 졸 졹 졺 졻 졼 졽 졾 졿 좀 좁 좂 좃 좄 종 좆 좇 좈 좉 좊 좋 좌 좍 좎 좏 좐 좑 좒 좓 좔 좕 좖 좗 좘 좙 좚 좛 좜 좝 좞 좟 좠 좡 좢 좣 좤 좥 좦 좧 좨 좩 좪 좫 좬 좭 좮 좯 좰 좱 좲 좳 좴 좵 좶 좷 좸 좹 좺 좻 좼 좽 좾 좿 죀 죁 죂 죃 죄 죅 죆 죇 죈 죉 죊 죋 죌 죍 죎 죏 죐 죑 죒 죓 죔 죕 죖 죗 죘 죙 죚 죛 죜 죝 죞 죟 죠 죡 죢 죣 죤 죥 죦 죧 죨 죩 죪 죫 죬 죭 죮 죯 죰 죱 죲 죳 죴 죵 죶 죷 죸 죹 죺 죻 주 죽 죾 죿 준 줁 줂 줃 줄 줅 줆 줇 줈 줉 줊 줋 줌 줍 줎 줏 줐 중 줒 줓 줔 줕 줖 줗 줘 줙 줚 줛 줜 줝 줞 줟 줠 줡 줢 줣 줤 줥 줦 줧 줨 줩 줪 줫 줬 줭 줮 줯 줰 줱 줲 줳 줴 줵 줶 줷 줸 줹 줺 줻 줼 줽 줾 줿 쥀 쥁 쥂 쥃 쥄 쥅 쥆 쥇 쥈 쥉 쥊 쥋 쥌 쥍 쥎 쥏 쥐 쥑 쥒 쥓 쥔 쥕 쥖 쥗 쥘 쥙 쥚 쥛 쥜 쥝 쥞 쥟 쥠 쥡 쥢 쥣 쥤 쥥 쥦 쥧 쥨 쥩 쥪 쥫 쥬 쥭 쥮 쥯 쥰 쥱 쥲 쥳 쥴 쥵 쥶 쥷 쥸 쥹 쥺 쥻 쥼 쥽 쥾 쥿 즀 즁 즂 즃 즄 즅 즆 즇 즈 즉 즊 즋 즌 즍 즎 즏 즐 즑 즒 즓 즔 즕 즖 즗 즘 즙 즚 즛 즜 증 즞 즟 즠 즡 즢 즣 즤 즥 즦 즧 즨 즩 즪 즫 즬 즭 즮 즯 즰 즱 즲 즳 즴 즵 즶 즷 즸 즹 즺 즻 즼 즽 즾 즿 지 직 짂 짃 진 짅 짆 짇 질 짉 짊 짋 짌 짍 짎 짏 짐 집 짒 짓 짔 징 짖 짗 짘 짙 짚 짛 짜 짝 짞 짟 짠 짡 짢 짣 짤 짥 짦 짧 짨 짩 짪 짫 짬 짭 짮 짯 짰 짱 짲 짳 짴 짵 짶 짷 째 짹 짺 짻 짼 짽 짾 짿 쨀 쨁 쨂 쨃 쨄 쨅 쨆 쨇 쨈 쨉 쨊 쨋 쨌 쨍 쨎 쨏 쨐 쨑 쨒 쨓 쨔 쨕 쨖 쨗 쨘 쨙 쨚 쨛 쨜 쨝 쨞 쨟 쨠 쨡 쨢 쨣 쨤 쨥 쨦 쨧 쨨 쨩 쨪 쨫 쨬 쨭 쨮 쨯 쨰 쨱 쨲 쨳 쨴 쨵 쨶 쨷 쨸 쨹 쨺 쨻 쨼 쨽 쨾 쨿 쩀 쩁 쩂 쩃 쩄 쩅 쩆 쩇 쩈 쩉 쩊 쩋 쩌 쩍 쩎 쩏 쩐 쩑 쩒 쩓 쩔 쩕 쩖 쩗 쩘 쩙 쩚 쩛 쩜 쩝 쩞 쩟 쩠 쩡 쩢 쩣 쩤 쩥 쩦 쩧 쩨 쩩 쩪 쩫 쩬 쩭 쩮 쩯 쩰 쩱 쩲 쩳 쩴 쩵 쩶 쩷 쩸 쩹 쩺 쩻 쩼 쩽 쩾 쩿 쪀 쪁 쪂 쪃 쪄 쪅 쪆 쪇 쪈 쪉 쪊 쪋 쪌 쪍 쪎 쪏 쪐 쪑 쪒 쪓 쪔 쪕 쪖 쪗 쪘 쪙 쪚 쪛 쪜 쪝 쪞 쪟 쪠 쪡 쪢 쪣 쪤 쪥 쪦 쪧 쪨 쪩 쪪 쪫 쪬 쪭 쪮 쪯 쪰 쪱 쪲 쪳 쪴 쪵 쪶 쪷 쪸 쪹 쪺 쪻 쪼 쪽 쪾 쪿 쫀 쫁 쫂 쫃 쫄 쫅 쫆 쫇 쫈 쫉 쫊 쫋 쫌 쫍 쫎 쫏 쫐 쫑 쫒 쫓 쫔 쫕 쫖 쫗 쫘 쫙 쫚 쫛 쫜 쫝 쫞 쫟 쫠 쫡 쫢 쫣 쫤 쫥 쫦 쫧 쫨 쫩 쫪 쫫 쫬 쫭 쫮 쫯 쫰 쫱 쫲 쫳 쫴 쫵 쫶 쫷 쫸 쫹 쫺 쫻 쫼 쫽 쫾 쫿 쬀 쬁 쬂 쬃 쬄 쬅 쬆 쬇 쬈 쬉 쬊 쬋 쬌 쬍 쬎 쬏 쬐 쬑 쬒 쬓 쬔 쬕 쬖 쬗 쬘 쬙 쬚 쬛 쬜 쬝 쬞 쬟 쬠 쬡 쬢 쬣 쬤 쬥 쬦 쬧 쬨 쬩 쬪 쬫 쬬 쬭 쬮 쬯 쬰 쬱 쬲 쬳 쬴 쬵 쬶 쬷 쬸 쬹 쬺 쬻 쬼 쬽 쬾 쬿 쭀 쭁 쭂 쭃 쭄 쭅 쭆 쭇 쭈 쭉 쭊 쭋 쭌 쭍 쭎 쭏 쭐 쭑 쭒 쭓 쭔 쭕 쭖 쭗 쭘 쭙 쭚 쭛 쭜 쭝 쭞 쭟 쭠 쭡 쭢 쭣 쭤 쭥 쭦 쭧 쭨 쭩 쭪 쭫 쭬 쭭 쭮 쭯 쭰 쭱 쭲 쭳 쭴 쭵 쭶 쭷 쭸 쭹 쭺 쭻 쭼 쭽 쭾 쭿 쮀 쮁 쮂 쮃 쮄 쮅 쮆 쮇 쮈 쮉 쮊 쮋 쮌 쮍 쮎 쮏 쮐 쮑 쮒 쮓 쮔 쮕 쮖 쮗 쮘 쮙 쮚 쮛 쮜 쮝 쮞 쮟 쮠 쮡 쮢 쮣 쮤 쮥 쮦 쮧 쮨 쮩 쮪 쮫 쮬 쮭 쮮 쮯 쮰 쮱 쮲 쮳 쮴 쮵 쮶 쮷 쮸 쮹 쮺 쮻 쮼 쮽 쮾 쮿 쯀 쯁 쯂 쯃 쯄 쯅 쯆 쯇 쯈 쯉 쯊 쯋 쯌 쯍 쯎 쯏 쯐 쯑 쯒 쯓 쯔 쯕 쯖 쯗 쯘 쯙 쯚 쯛 쯜 쯝 쯞 쯟 쯠 쯡 쯢 쯣 쯤 쯥 쯦 쯧 쯨 쯩 쯪 쯫 쯬 쯭 쯮 쯯 쯰 쯱 쯲 쯳 쯴 쯵 쯶 쯷 쯸 쯹 쯺 쯻 쯼 쯽 쯾 쯿 찀 찁 찂 찃 찄 찅 찆 찇 찈 찉 찊 찋 찌 찍 찎 찏 찐 찑 찒 찓 찔 찕 찖 찗 찘 찙 찚 찛 찜 찝 찞 찟 찠 찡 찢 찣 찤 찥 찦 찧 차 착 찪 찫 찬 찭 찮 찯 찰 찱 찲 찳 찴 찵 찶 찷 참 찹 찺 찻 찼 창 찾 찿 챀 챁 챂 챃 채 책 챆 챇 챈 챉 챊 챋 챌 챍 챎 챏 챐 챑 챒 챓 챔 챕 챖 챗 챘 챙 챚 챛 챜 챝 챞 챟 챠 챡 챢 챣 챤 챥 챦 챧 챨 챩 챪 챫 챬 챭 챮 챯 챰 챱 챲 챳 챴 챵 챶 챷 챸 챹 챺 챻 챼 챽 챾 챿 첀 첁 첂 첃 첄 첅 첆 첇 첈 첉 첊 첋 첌 첍 첎 첏 첐 첑 첒 첓 첔 첕 첖 첗 처 척 첚 첛 천 첝 첞 첟 철 첡 첢 첣 첤 첥 첦 첧 첨 첩 첪 첫 첬 청 첮 첯 첰 첱 첲 첳 체 첵 첶 첷 첸 첹 첺 첻 첼 첽 첾 첿 쳀 쳁 쳂 쳃 쳄 쳅 쳆 쳇 쳈 쳉 쳊 쳋 쳌 쳍 쳎 쳏 쳐 쳑 쳒 쳓 쳔 쳕 쳖 쳗 쳘 쳙 쳚 쳛 쳜 쳝 쳞 쳟 쳠 쳡 쳢 쳣 쳤 쳥 쳦 쳧 쳨 쳩 쳪 쳫 쳬 쳭 쳮 쳯 쳰 쳱 쳲 쳳 쳴 쳵 쳶 쳷 쳸 쳹 쳺 쳻 쳼 쳽 쳾 쳿 촀 촁 촂 촃 촄 촅 촆 촇 초 촉 촊 촋 촌 촍 촎 촏 촐 촑 촒 촓 촔 촕 촖 촗 촘 촙 촚 촛 촜 총 촞 촟 촠 촡 촢 촣 촤 촥 촦 촧 촨 촩 촪 촫 촬 촭 촮 촯 촰 촱 촲 촳 촴 촵 촶 촷 촸 촹 촺 촻 촼 촽 촾 촿 쵀 쵁 쵂 쵃 쵄 쵅 쵆 쵇 쵈 쵉 쵊 쵋 쵌 쵍 쵎 쵏 쵐 쵑 쵒 쵓 쵔 쵕 쵖 쵗 쵘 쵙 쵚 쵛 최 쵝 쵞 쵟 쵠 쵡 쵢 쵣 쵤 쵥 쵦 쵧 쵨 쵩 쵪 쵫 쵬 쵭 쵮 쵯 쵰 쵱 쵲 쵳 쵴 쵵 쵶 쵷 쵸 쵹 쵺 쵻 쵼 쵽 쵾 쵿 춀 춁 춂 춃 춄 춅 춆 춇 춈 춉 춊 춋 춌 춍 춎 춏 춐 춑 춒 춓 추 축 춖 춗 춘 춙 춚 춛 출 춝 춞 춟 춠 춡 춢 춣 춤 춥 춦 춧 춨 충 춪 춫 춬 춭 춮 춯 춰 춱 춲 춳 춴 춵 춶 춷 춸 춹 춺 춻 춼 춽 춾 춿 췀 췁 췂 췃 췄 췅 췆 췇 췈 췉 췊 췋 췌 췍 췎 췏 췐 췑 췒 췓 췔 췕 췖 췗 췘 췙 췚 췛 췜 췝 췞 췟 췠 췡 췢 췣 췤 췥 췦 췧 취 췩 췪 췫 췬 췭 췮 췯 췰 췱 췲 췳 췴 췵 췶 췷 췸 췹 췺 췻 췼 췽 췾 췿 츀 츁 츂 츃 츄 츅 츆 츇 츈 츉 츊 츋 츌 츍 츎 츏 츐 츑 츒 츓 츔 츕 츖 츗 츘 츙 츚 츛 츜 츝 츞 츟 츠 측 츢 츣 츤 츥 츦 츧 츨 츩 츪 츫 츬 츭 츮 츯 츰 츱 츲 츳 츴 층 츶 츷 츸 츹 츺 츻 츼 츽 츾 츿 칀 칁 칂 칃 칄 칅 칆 칇 칈 칉 칊 칋 칌 칍 칎 칏 칐 칑 칒 칓 칔 칕 칖 칗 치 칙 칚 칛 친 칝 칞 칟 칠 칡 칢 칣 칤 칥 칦 칧 침 칩 칪 칫 칬 칭 칮 칯 칰 칱 칲 칳 카 칵 칶 칷 칸 칹 칺 칻 칼 칽 칾 칿 캀 캁 캂 캃 캄 캅 캆 캇 캈 캉 캊 캋 캌 캍 캎 캏 캐 캑 캒 캓 캔 캕 캖 캗 캘 캙 캚 캛 캜 캝 캞 캟 캠 캡 캢 캣 캤 캥 캦 캧 캨 캩 캪 캫 캬 캭 캮 캯 캰 캱 캲 캳 캴 캵 캶 캷 캸 캹 캺 캻 캼 캽 캾 캿 컀 컁 컂 컃 컄 컅 컆 컇 컈 컉 컊 컋 컌 컍 컎 컏 컐 컑 컒 컓 컔 컕 컖 컗 컘 컙 컚 컛 컜 컝 컞 컟 컠 컡 컢 컣 커 컥 컦 컧 컨 컩 컪 컫 컬 컭 컮 컯 컰 컱 컲 컳 컴 컵 컶 컷 컸 컹 컺 컻 컼 컽 컾 컿 케 켁 켂 켃 켄 켅 켆 켇 켈 켉 켊 켋 켌 켍 켎 켏 켐 켑 켒 켓 켔 켕 켖 켗 켘 켙 켚 켛 켜 켝 켞 켟 켠 켡 켢 켣 켤 켥 켦 켧 켨 켩 켪 켫 켬 켭 켮 켯 켰 켱 켲 켳 켴 켵 켶 켷 켸 켹 켺 켻 켼 켽 켾 켿 콀 콁 콂 콃 콄 콅 콆 콇 콈 콉 콊 콋 콌 콍 콎 콏 콐 콑 콒 콓 코 콕 콖 콗 콘 콙 콚 콛 콜 콝 콞 콟 콠 콡 콢 콣 콤 콥 콦 콧 콨 콩 콪 콫 콬 콭 콮 콯 콰 콱 콲 콳 콴 콵 콶 콷 콸 콹 콺 콻 콼 콽 콾 콿 쾀 쾁 쾂 쾃 쾄 쾅 쾆 쾇 쾈 쾉 쾊 쾋 쾌 쾍 쾎 쾏 쾐 쾑 쾒 쾓 쾔 쾕 쾖 쾗 쾘 쾙 쾚 쾛 쾜 쾝 쾞 쾟 쾠 쾡 쾢 쾣 쾤 쾥 쾦 쾧 쾨 쾩 쾪 쾫 쾬 쾭 쾮 쾯 쾰 쾱 쾲 쾳 쾴 쾵 쾶 쾷 쾸 쾹 쾺 쾻 쾼 쾽 쾾 쾿 쿀 쿁 쿂 쿃 쿄 쿅 쿆 쿇 쿈 쿉 쿊 쿋 쿌 쿍 쿎 쿏 쿐 쿑 쿒 쿓 쿔 쿕 쿖 쿗 쿘 쿙 쿚 쿛 쿜 쿝 쿞 쿟 쿠 쿡 쿢 쿣 쿤 쿥 쿦 쿧 쿨 쿩 쿪 쿫 쿬 쿭 쿮 쿯 쿰 쿱 쿲 쿳 쿴 쿵 쿶 쿷 쿸 쿹 쿺 쿻 쿼 쿽 쿾 쿿 퀀 퀁 퀂 퀃 퀄 퀅 퀆 퀇 퀈 퀉 퀊 퀋 퀌 퀍 퀎 퀏 퀐 퀑 퀒 퀓 퀔 퀕 퀖 퀗 퀘 퀙 퀚 퀛 퀜 퀝 퀞 퀟 퀠 퀡 퀢 퀣 퀤 퀥 퀦 퀧 퀨 퀩 퀪 퀫 퀬 퀭 퀮 퀯 퀰 퀱 퀲 퀳 퀴 퀵 퀶 퀷 퀸 퀹 퀺 퀻 퀼 퀽 퀾 퀿 큀 큁 큂 큃 큄 큅 큆 큇 큈 큉 큊 큋 큌 큍 큎 큏 큐 큑 큒 큓 큔 큕 큖 큗 큘 큙 큚 큛 큜 큝 큞 큟 큠 큡 큢 큣 큤 큥 큦 큧 큨 큩 큪 큫 크 큭 큮 큯 큰 큱 큲 큳 클 큵 큶 큷 큸 큹 큺 큻 큼 큽 큾 큿 킀 킁 킂 킃 킄 킅 킆 킇 킈 킉 킊 킋 킌 킍 킎 킏 킐 킑 킒 킓 킔 킕 킖 킗 킘 킙 킚 킛 킜 킝 킞 킟 킠 킡 킢 킣 키 킥 킦 킧 킨 킩 킪 킫 킬 킭 킮 킯 킰 킱 킲 킳 킴 킵 킶 킷 킸 킹 킺 킻 킼 킽 킾 킿 타 탁 탂 탃 탄 탅 탆 탇 탈 탉 탊 탋 탌 탍 탎 탏 탐 탑 탒 탓 탔 탕 탖 탗 탘 탙 탚 탛 태 택 탞 탟 탠 탡 탢 탣 탤 탥 탦 탧 탨 탩 탪 탫 탬 탭 탮 탯 탰 탱 탲 탳 탴 탵 탶 탷 탸 탹 탺 탻 탼 탽 탾 탿 턀 턁 턂 턃 턄 턅 턆 턇 턈 턉 턊 턋 턌 턍 턎 턏 턐 턑 턒 턓 턔 턕 턖 턗 턘 턙 턚 턛 턜 턝 턞 턟 턠 턡 턢 턣 턤 턥 턦 턧 턨 턩 턪 턫 턬 턭 턮 턯 터 턱 턲 턳 턴 턵 턶 턷 털 턹 턺 턻 턼 턽 턾 턿 텀 텁 텂 텃 텄 텅 텆 텇 텈 텉 텊 텋 테 텍 텎 텏 텐 텑 텒 텓 텔 텕 텖 텗 텘 텙 텚 텛 템 텝 텞 텟 텠 텡 텢 텣 텤 텥 텦 텧 텨 텩 텪 텫 텬 텭 텮 텯 텰 텱 텲 텳 텴 텵 텶 텷 텸 텹 텺 텻 텼 텽 텾 텿 톀 톁 톂 톃 톄 톅 톆 톇 톈 톉 톊 톋 톌 톍 톎 톏 톐 톑 톒 톓 톔 톕 톖 톗 톘 톙 톚 톛 톜 톝 톞 톟 토 톡 톢 톣 톤 톥 톦 톧 톨 톩 톪 톫 톬 톭 톮 톯 톰 톱 톲 톳 톴 통 톶 톷 톸 톹 톺 톻 톼 톽 톾 톿 퇀 퇁 퇂 퇃 퇄 퇅 퇆 퇇 퇈 퇉 퇊 퇋 퇌 퇍 퇎 퇏 퇐 퇑 퇒 퇓 퇔 퇕 퇖 퇗 퇘 퇙 퇚 퇛 퇜 퇝 퇞 퇟 퇠 퇡 퇢 퇣 퇤 퇥 퇦 퇧 퇨 퇩 퇪 퇫 퇬 퇭 퇮 퇯 퇰 퇱 퇲 퇳 퇴 퇵 퇶 퇷 퇸 퇹 퇺 퇻 퇼 퇽 퇾 퇿 툀 툁 툂 툃 툄 툅 툆 툇 툈 툉 툊 툋 툌 툍 툎 툏 툐 툑 툒 툓 툔 툕 툖 툗 툘 툙 툚 툛 툜 툝 툞 툟 툠 툡 툢 툣 툤 툥 툦 툧 툨 툩 툪 툫 투 툭 툮 툯 툰 툱 툲 툳 툴 툵 툶 툷 툸 툹 툺 툻 툼 툽 툾 툿 퉀 퉁 퉂 퉃 퉄 퉅 퉆 퉇 퉈 퉉 퉊 퉋 퉌 퉍 퉎 퉏 퉐 퉑 퉒 퉓 퉔 퉕 퉖 퉗 퉘 퉙 퉚 퉛 퉜 퉝 퉞 퉟 퉠 퉡 퉢 퉣 퉤 퉥 퉦 퉧 퉨 퉩 퉪 퉫 퉬 퉭 퉮 퉯 퉰 퉱 퉲 퉳 퉴 퉵 퉶 퉷 퉸 퉹 퉺 퉻 퉼 퉽 퉾 퉿 튀 튁 튂 튃 튄 튅 튆 튇 튈 튉 튊 튋 튌 튍 튎 튏 튐 튑 튒 튓 튔 튕 튖 튗 튘 튙 튚 튛 튜 튝 튞 튟 튠 튡 튢 튣 튤 튥 튦 튧 튨 튩 튪 튫 튬 튭 튮 튯 튰 튱 튲 튳 튴 튵 튶 튷 트 특 튺 튻 튼 튽 튾 튿 틀 틁 틂 틃 틄 틅 틆 틇 틈 틉 틊 틋 틌 틍 틎 틏 틐 틑 틒 틓 틔 틕 틖 틗 틘 틙 틚 틛 틜 틝 틞 틟 틠 틡 틢 틣 틤 틥 틦 틧 틨 틩 틪 틫 틬 틭 틮 틯 티 틱 틲 틳 틴 틵 틶 틷 틸 틹 틺 틻 틼 틽 틾 틿 팀 팁 팂 팃 팄 팅 팆 팇 팈 팉 팊 팋 파 팍 팎 팏 판 팑 팒 팓 팔 팕 팖 팗 팘 팙 팚 팛 팜 팝 팞 팟 팠 팡 팢 팣 팤 팥 팦 팧 패 팩 팪 팫 팬 팭 팮 팯 팰 팱 팲 팳 팴 팵 팶 팷 팸 팹 팺 팻 팼 팽 팾 팿 퍀 퍁 퍂 퍃 퍄 퍅 퍆 퍇 퍈 퍉 퍊 퍋 퍌 퍍 퍎 퍏 퍐 퍑 퍒 퍓 퍔 퍕 퍖 퍗 퍘 퍙 퍚 퍛 퍜 퍝 퍞 퍟 퍠 퍡 퍢 퍣 퍤 퍥 퍦 퍧 퍨 퍩 퍪 퍫 퍬 퍭 퍮 퍯 퍰 퍱 퍲 퍳 퍴 퍵 퍶 퍷 퍸 퍹 퍺 퍻 퍼 퍽 퍾 퍿 펀 펁 펂 펃 펄 펅 펆 펇 펈 펉 펊 펋 펌 펍 펎 펏 펐 펑 펒 펓 펔 펕 펖 펗 페 펙 펚 펛 펜 펝 펞 펟 펠 펡 펢 펣 펤 펥 펦 펧 펨 펩 펪 펫 펬 펭 펮 펯 펰 펱 펲 펳 펴 펵 펶 펷 편 펹 펺 펻 펼 펽 펾 펿 폀 폁 폂 폃 폄 폅 폆 폇 폈 평 폊 폋 폌 폍 폎 폏 폐 폑 폒 폓 폔 폕 폖 폗 폘 폙 폚 폛 폜 폝 폞 폟 폠 폡 폢 폣 폤 폥 폦 폧 폨 폩 폪 폫 포 폭 폮 폯 폰 폱 폲 폳 폴 폵 폶 폷 폸 폹 폺 폻 폼 폽 폾 폿 퐀 퐁 퐂 퐃 퐄 퐅 퐆 퐇 퐈 퐉 퐊 퐋 퐌 퐍 퐎 퐏 퐐 퐑 퐒 퐓 퐔 퐕 퐖 퐗 퐘 퐙 퐚 퐛 퐜 퐝 퐞 퐟 퐠 퐡 퐢 퐣 퐤 퐥 퐦 퐧 퐨 퐩 퐪 퐫 퐬 퐭 퐮 퐯 퐰 퐱 퐲 퐳 퐴 퐵 퐶 퐷 퐸 퐹 퐺 퐻 퐼 퐽 퐾 퐿 푀 푁 푂 푃 푄 푅 푆 푇 푈 푉 푊 푋 푌 푍 푎 푏 푐 푑 푒 푓 푔 푕 푖 푗 푘 푙 푚 푛 표 푝 푞 푟 푠 푡 푢 푣 푤 푥 푦 푧 푨 푩 푪 푫 푬 푭 푮 푯 푰 푱 푲 푳 푴 푵 푶 푷 푸 푹 푺 푻 푼 푽 푾 푿 풀 풁 풂 풃 풄 풅 풆 풇 품 풉 풊 풋 풌 풍 풎 풏 풐 풑 풒 풓 풔 풕 풖 풗 풘 풙 풚 풛 풜 풝 풞 풟 풠 풡 풢 풣 풤 풥 풦 풧 풨 풩 풪 풫 풬 풭 풮 풯 풰 풱 풲 풳 풴 풵 풶 풷 풸 풹 풺 풻 풼 풽 풾 풿 퓀 퓁 퓂 퓃 퓄 퓅 퓆 퓇 퓈 퓉 퓊 퓋 퓌 퓍 퓎 퓏 퓐 퓑 퓒 퓓 퓔 퓕 퓖 퓗 퓘 퓙 퓚 퓛 퓜 퓝 퓞 퓟 퓠 퓡 퓢 퓣 퓤 퓥 퓦 퓧 퓨 퓩 퓪 퓫 퓬 퓭 퓮 퓯 퓰 퓱 퓲 퓳 퓴 퓵 퓶 퓷 퓸 퓹 퓺 퓻 퓼 퓽 퓾 퓿 픀 픁 픂 픃 프 픅 픆 픇 픈 픉 픊 픋 플 픍 픎 픏 픐 픑 픒 픓 픔 픕 픖 픗 픘 픙 픚 픛 픜 픝 픞 픟 픠 픡 픢 픣 픤 픥 픦 픧 픨 픩 픪 픫 픬 픭 픮 픯 픰 픱 픲 픳 픴 픵 픶 픷 픸 픹 픺 픻 피 픽 픾 픿 핀 핁 핂 핃 필 핅 핆 핇 핈 핉 핊 핋 핌 핍 핎 핏 핐 핑 핒 핓 핔 핕 핖 핗 하 학 핚 핛 한 핝 핞 핟 할 핡 핢 핣 핤 핥 핦 핧 함 합 핪 핫 핬 항 핮 핯 핰 핱 핲 핳 해 핵 핶 핷 핸 핹 핺 핻 핼 핽 핾 핿 햀 햁 햂 햃 햄 햅 햆 햇 했 행 햊 햋 햌 햍 햎 햏 햐 햑 햒 햓 햔 햕 햖 햗 햘 햙 햚 햛 햜 햝 햞 햟 햠 햡 햢 햣 햤 향 햦 햧 햨 햩 햪 햫 햬 햭 햮 햯 햰 햱 햲 햳 햴 햵 햶 햷 햸 햹 햺 햻 햼 햽 햾 햿 헀 헁 헂 헃 헄 헅 헆 헇 허 헉 헊 헋 헌 헍 헎 헏 헐 헑 헒 헓 헔 헕 헖 헗 험 헙 헚 헛 헜 헝 헞 헟 헠 헡 헢 헣 헤 헥 헦 헧 헨 헩 헪 헫 헬 헭 헮 헯 헰 헱 헲 헳 헴 헵 헶 헷 헸 헹 헺 헻 헼 헽 헾 헿 혀 혁 혂 혃 현 혅 혆 혇 혈 혉 혊 혋 혌 혍 혎 혏 혐 협 혒 혓 혔 형 혖 혗 혘 혙 혚 혛 혜 혝 혞 혟 혠 혡 혢 혣 혤 혥 혦 혧 혨 혩 혪 혫 혬 혭 혮 혯 혰 혱 혲 혳 혴 혵 혶 혷 호 혹 혺 혻 혼 혽 혾 혿 홀 홁 홂 홃 홄 홅 홆 홇 홈 홉 홊 홋 홌 홍 홎 홏 홐 홑 홒 홓 화 확 홖 홗 환 홙 홚 홛 활 홝 홞 홟 홠 홡 홢 홣 홤 홥 홦 홧 홨 황 홪 홫 홬 홭 홮 홯 홰 홱 홲 홳 홴 홵 홶 홷 홸 홹 홺 홻 홼 홽 홾 홿 횀 횁 횂 횃 횄 횅 횆 횇 횈 횉 횊 횋 회 획 횎 횏 횐 횑 횒 횓 횔 횕 횖 횗 횘 횙 횚 횛 횜 횝 횞 횟 횠 횡 횢 횣 횤 횥 횦 횧 효 횩 횪 횫 횬 횭 횮 횯 횰 횱 횲 횳 횴 횵 횶 횷 횸 횹 횺 횻 횼 횽 횾 횿 훀 훁 훂 훃 후 훅 훆 훇 훈 훉 훊 훋 훌 훍 훎 훏 훐 훑 훒 훓 훔 훕 훖 훗 훘 훙 훚 훛 훜 훝 훞 훟 훠 훡 훢 훣 훤 훥 훦 훧 훨 훩 훪 훫 훬 훭 훮 훯 훰 훱 훲 훳 훴 훵 훶 훷 훸 훹 훺 훻 훼 훽 훾 훿 휀 휁 휂 휃 휄 휅 휆 휇 휈 휉 휊 휋 휌 휍 휎 휏 휐 휑 휒 휓 휔 휕 휖 휗 휘 휙 휚 휛 휜 휝 휞 휟 휠 휡 휢 휣 휤 휥 휦 휧 휨 휩 휪 휫 휬 휭 휮 휯 휰 휱 휲 휳 휴 휵 휶 휷 휸 휹 휺 휻 휼 휽 휾 휿 흀 흁 흂 흃 흄 흅 흆 흇 흈 흉 흊 흋 흌 흍 흎 흏 흐 흑 흒 흓 흔 흕 흖 흗 흘 흙 흚 흛 흜 흝 흞 흟 흠 흡 흢 흣 흤 흥 흦 흧 흨 흩 흪 흫 희 흭 흮 흯 흰 흱 흲 흳 흴 흵 흶 흷 흸 흹 흺 흻 흼 흽 흾 흿 힀 힁 힂 힃 힄 힅 힆 힇 히 힉 힊 힋 힌 힍 힎 힏 힐 힑 힒 힓 힔 힕 힖 힗 힘 힙 힚 힛 힜 힝 힞 힟 힠 힡 힢 힣", + 2: "‾ _ _ - - ‐ — ― 〜 ・ , , 、 ; ; : : ! ! ¡ ? ? ¿ . . ‥ … 。 · ' ‘ ’ \" " “ ” ( ( ) ) [ [ ] ] { { } } 〈 〉 《 》 「 」 『 』 【 】 〔 〕 § ¶ @ @ * * / / \\ \ & & # # % % ‰ † ‡ ′ ″ 〃 ※", + 3: "ᄀ ᄀ ᄁ ᄂ ᄃ ᄄ ᄅ ᄆ ᄇ ᄈ ᄉ ᄊ ᄋ ᄌ ᄍ ᄎ ᄏ ᄐ ᄑ ᄒ ᅡ ᅡ ᅢ ᅣ ᅤ ᅥ ᅦ ᅧ ᅨ ᅩ ᅪ ᅫ ᅬ ᅭ ᅮ ᅯ ᅰ ᅱ ᅲ ᅳ ᅴ ᅵ ᆨ ᆨ ᆩ ᆪ ᆫ ᆬ ᆭ ᆮ ᆯ ᆰ ᆱ ᆲ ᆳ ᆴ ᆵ ᆶ ᆷ ᆸ ᆹ ᆺ ᆻ ᆼ ᆽ ᆾ ᆿ ᇀ ᇁ ᇂ 丘 串 乃 久 乖 九 乞 乫 乾 亂 亘 交 京 仇 今 介 件 价 企 伋 伎 伽 佳 佶 侃 來 侊 供 係 俓 俱 個 倞 倦 倨 假 偈 健 傀 傑 傾 僅 僑 價 儆 儉 儺 光 克 兢 內 公 共 其 具 兼 冀 冠 凱 刊 刮 券 刻 剋 剛 劇 劍 劒 功 加 劤 劫 勁 勍 勘 勤 勸 勻 勾 匡 匣 區 南 卦 却 卵 卷 卿 厥 去 及 口 句 叩 叫 可 各 吉 君 告 呱 呵 咎 咬 哥 哭 啓 喀 喇 喝 喫 喬 嗜 嘉 嘔 器 囊 困 固 圈 國 圭 圻 均 坎 坑 坤 坰 坵 垢 基 埼 堀 堅 堈 堪 堺 塊 塏 境 墾 壙 壞 夔 奇 奈 奎 契 奸 妓 妗 姑 姜 姦 娘 娜 嫁 嬌 孔 季 孤 宏 官 客 宮 家 寄 寇 寡 寬 尻 局 居 屆 屈 岐 岡 岬 崎 崑 崗 嵌 嵐 嶇 嶠 工 巧 巨 己 巾 干 幹 幾 庚 庫 康 廊 廐 廓 廣 建 弓 强 彊 徑 忌 急 怪 怯 恐 恝 恪 恭 悸 愆 感 愧 愷 愾 慊 慣 慤 慨 慶 慷 憩 憬 憾 懃 懇 懦 懶 懼 戈 戒 戟 戡 扱 技 抉 拉 拏 拐 拒 拘 括 拮 拱 拳 拷 拿 捏 据 捲 捺 掘 掛 控 揀 揆 揭 擊 擎 擒 據 擧 攪 攷 改 攻 故 敎 救 敢 敬 敲 斛 斤 旗 旣 昆 昑 景 晷 暇 暖 暠 暻 曠 曲 更 曷 朗 朞 期 机 杆 杞 杰 枏 果 枯 架 枸 柑 柩 柬 柯 校 根 格 桀 桂 桔 桿 梏 梗 械 梱 棄 棋 棍 棘 棨 棺 楗 楠 極 槁 構 槐 槨 槪 槻 槿 樂 橄 橋 橘 機 檄 檎 檢 櫃 欄 權 欺 款 歌 歐 歸 殼 毆 毬 氣 求 江 汨 汲 決 汽 沂 沽 洛 洸 浪 涇 淃 淇 減 渠 渴 湳 溝 溪 滑 滾 漑 潔 潰 澗 激 濫 灌 灸 炅 炚 炬 烙 烱 煖 爛 牽 犬 狂 狗 狡 狼 獗 玖 玘 珂 珏 珖 珙 珞 珪 球 琦 琨 琪 琯 琴 瑾 璂 璟 璣 璥 瓊 瓘 瓜 甄 甘 甲 男 畇 界 畸 畺 畿 疆 疥 疳 痂 痙 痼 癎 癩 癸 皆 皎 皐 盖 監 看 眷 睾 瞰 瞼 瞿 矜 矩 矯 硅 硬 碁 碣 磎 磬 磯 磵 祁 祇 祈 祛 祺 禁 禽 科 稈 稼 稽 稿 穀 究 穹 空 窘 窟 窮 窺 竅 竟 竭 競 竿 筋 筐 筠 箇 箕 箝 管 簡 粳 糠 系 糾 紀 納 紘 級 紺 絅 結 絞 給 絳 絹 絿 經 綱 綺 緊 繫 繭 繼 缺 罐 罫 羅 羈 羌 羔 群 羹 翹 考 耆 耉 耕 耭 耿 肌 肝 股 肩 肯 肱 胛 胱 脚 脛 腔 腱 膈 膏 膠 臘 臼 舅 舊 舡 艮 艱 芎 芥 芩 芹 苛 苟 苦 苽 茄 莖 菅 菊 菌 菓 菫 菰 落 葛 葵 蓋 蕎 蕨 薑 藁 藍 藿 蘭 蘿 虔 蚣 蛟 蝎 螺 蠟 蠱 街 衢 衲 衾 衿 袈 袞 袴 裙 裸 褐 襁 襟 襤 見 規 覡 覲 覺 觀 角 計 記 訣 訶 詭 誇 誡 誥 課 諫 諾 謙 講 謳 謹 譏 警 譴 谷 谿 豈 貢 貫 貴 賈 購 赳 起 跏 距 跨 踞 蹇 蹶 躬 軀 車 軌 軍 軻 較 輕 轎 轟 辜 近 迦 迲 适 逑 逕 逵 過 遣 遽 邏 那 邯 邱 郊 郎 郡 郭 酪 醵 金 鈐 鈞 鉀 鉅 鉗 鉤 銶 鋸 鋼 錡 錤 錦 錮 鍋 鍵 鎌 鎧 鏡 鑑 鑒 鑛 開 間 閘 閣 閨 闕 關 降 階 隔 隙 雇 難 鞏 鞠 鞨 鞫 頃 頸 顆 顧 飢 餃 館 饉 饋 饑 駒 駕 駱 騎 騏 騫 驅 驕 驚 驥 骨 高 鬼 魁 鮫 鯤 鯨 鱇 鳩 鵑 鵠 鷄 鷗 鸞 麒 麴 黔 鼓 龕 龜", + 5: "ㄱ ㄴ ㄷ ㄹ ㅁ ㅂ ㅅ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ", + }, + "kok": { + 0: "़ ० १ २ ३ ४ ५ ६ ७ ८ ९ ॐ ं ँ ः अ आ इ ई उ ऊ ऋ ऌ ऍ ए ऐ ऑ ओ औ क क़ ख ख़ ग ग़ घ ङ च छ ज ज़ झ ञ ट ठ ड ड़ ढ ढ़ ण त थ द ध न प फ फ़ ब भ म य य़ र ल व श ष स ह ळ ऽ ा ि ी ु ू ृ ॄ ॅ े ै ॉ ो ौ ्", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200c \u200d", + }, + "ks": { + 0: "۪ ۭ َ ُ ِ ٔ ٕ ٖ ٗ ٚ ٛ ء آ أ ٲ ؤ ا ٮ ب پ ت ث ٹ ج چ ح خ د ذ ڈ ر ز ڑ ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن ں ھ ہ و ۄ ی ۍ ے", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "ksb": { + 0: "a b c d e f g h i j k l m n o p s t u v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q r x", + 5: "A B C D E F G H I J K L M N O P S T U V W Y Z", + }, + "ksf": { + 0: "a á b c d e é ǝ ǝ́ ɛ ɛ́ f g h i í j k l m n ŋ o ó ɔ ɔ́ p r s t u ú v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q x", + 5: "A B C D E Ǝ Ɛ F G H I J K L M N Ŋ O Ɔ P R S T U V W Y Z", + }, + "ksh": { + 0: "a å ä æ b c d e ë ė f g h i j k l m n o ö œ p q r s ß t u ů ü v w x y z", + 2: "_ ‐ – — ⸗ , ; : ! ? . … ' ‘ ‚ \" “ „ ( ) [ ] { } § @ * / & # % † ‡ ° < = > ~ $", + 3: "á à ă â å ä ã ā æ ç é è ĕ ê ë ē ğ í ì ĭ î ï ī ij ı ł ñ ó ò ŏ ô ö ø ō œ ú ù ŭ û ü ū ÿ", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "kw": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "ky": { + 0: "а б г д е ё ж з и й к л м н ӊ о ө п р с т у ү х ч ш ъ ы э ю я", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "в ф ц щ ь", + }, + "lag": { + 0: "a á b c d e é f g h i í ɨ j k l m n o ó p q r s t u ú ʉ v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B C D E F G H I Ɨ J K L M N O P Q R S T U Ʉ V W X Y Z", + }, + "lg": { + 0: "a b c d e f g i j k l m n ny ŋ o p r s t u v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "h q x", + 5: "A B C D E F G I J K L M N Ŋ O P R S T U V W Y Z", + }, + "ln": { + 0: "a á â ǎ b c d e é ê ě ɛ ɛ́ ɛ̂ ɛ̌ f g gb h i í î ǐ k l m mb mp n nd ng nk ns nt ny nz o ó ô ǒ ɔ ɔ́ ɔ̂ ɔ̌ p r s t u ú v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "j q x", + 5: "A B C D E Ɛ F G Gb H I K L M Mb Mp N Nd Ng Nk Ns Nt Ny Nz O Ɔ P R S T U V W Y Z", + }, + "lo": { + 0: "່ ້ ໊ ໋ ໌ ໍ ໆ ກ ຂ ຄ ງ ຈ ສ ຊ ຍ ດ ຕ ຖ ທ ນ ບ ປ ຜ ຝ ພ ຟ ມ ຢ ຣ ລ ວ ຫ ໜ ໝ ອ ຮ ຯ ະ ັ າ ຳ ິ ີ ຶ ື ຸ ູ ົ ຼ ຽ ເ ແ ໂ ໃ ໄ", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200b ໐ ໑ ໒ ໓ ໔ ໕ ໖ ໗ ໘ ໙", + }, + "lt": { + 0: "a ą b c č d e ę ė f g h i į y j k l m n o p r s š t u ų ū v z ž", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "á à ã ą́ ą̃ é è ẽ ę́ ę̃ ė́ ė̃ i̇́ í i̇̀ ì i̇̃ ĩ į́ į̇́ į̃ į̇̃ j̃ j̇̃ l̃ m̃ ñ ó ò õ q r̃ ú ù ũ ų́ ų̃ ū́ ū̃ w x", + 5: "A Ą B C Č D E Ę Ė F G H I Į Y J K L M N O P R S Š T U Ų Ū V Z Ž", + }, + "lu": { + 0: "a á à b c d e é è ɛ ɛ́ ɛ̀ f h i í ì j k l m n ng ny o ó ò ɔ ɔ́ ɔ̀ p ph q s shi t u ú ù v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "g r x", + 5: "A B C D E F H I J K L M N O P Q S T U V W Y Z", + }, + "luo": { + 0: "a b c d e f g h i j k l m n o p r s t u v w y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q x z", + 5: "A B C D E F G H I J K L M N O P R S T U V W Y", + }, + "luy": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "lv": { + 0: "a ā b c č d e ē f g ģ h i ī j k ķ l ļ m n ņ o p r s š t u ū v z ž", + 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ ‚ \" “ ” „ ( ) [ ] § @ * / & # † ‡ ′ ″", + 3: "q w x y", + 5: "A B C Č D E F G Ģ H I J K Ķ L Ļ M N Ņ O P Q R S Š T U V W X Y Z Ž", + }, + "mas": { + 0: "a á à â ā b c d e é è ê ē ɛ g h i í ì î ī ɨ j k l m n ny ŋ o ó ò ô ō ɔ p r rr s sh t u ú ù û ū ʉ ʉ́ w wu y yi", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "f q v x z", + 5: "A B C D E Ɛ G H I Ɨ J K L M N Ŋ O Ɔ P R S T U Ʉ W Y", + }, + "mer": { + 0: "a b c d e f g h i ĩ j k l m n o p q r s t u ũ v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "mfe": { + 0: "a b c d e f g h i j k l m n o p r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B C D E F G H I J K L M N O P R S T U V W X Y Z", + }, + "mg": { + 0: "a à â b d e é è ê ë f g h i ì î ï j k l m n ñ o ô p r s t v y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "c q u w x", + 5: "A B D E F G H I J K L M N O P R S T V Y Z", + }, + "mgh": { + 0: "a b c d e f g h i j k l m n o p r s t u v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q x", + 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", + }, + "mgo": { + 0: "a à b ch d e è ə ə̀ f g gh i ì j k m n ŋ o ò ɔ ɔ̀ p r s t u ù w y z ʼ", + 2: ", ; : ! ? . ' ‘ ’ \" “ ”", + 3: "c h l q v x", + 5: "A B CH D E Ə F G GH I J K M N Ŋ O Ɔ P R S T U W Y Z ʼ", + }, + "mk": { + 0: "а б в г д ѓ е ж з ѕ и ј к л љ м н њ о п р с т ќ у ф х ц ч џ ш", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "ѐ ѝ", + 5: "А Б В Г Д Ѓ Е Ж З Ѕ И Ј К Л Љ М Н Њ О П Р С Т Ќ У Ф Х Ц Ч Џ Ш", + }, + "ml": { + 0: "\u200c \u200d ഃ അ ആ ഇ ഈ ഉ ഊ ഋ ൠ ഌ ൡ എ ഏ ഐ ഒ ഓ ഔ ക ൿ ഖ ഗ ഘ ങ ച ഛ ജ ഝ ഞ ട ഠ ഡ ഢ ണ ൺ ത ഥ ദ ധ ന ൻ പ ഫ ബ ഭ മ ം യ ര ർ ല ൽ വ ശ ഷ സ ഹ ള ൾ ഴ റ ാ ി ീ ു ൂ ൃ െ േ ൈ ൊ ോ ൗ ൌ ്", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200c \u200d", + }, + "mn": { + 0: "а б в г д е ё ж з и й к л м н о ө п р с т у ү ф х ц ч ш щ ъ ы ь э ю я", + 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", + 3: "ә җ ӊ һ", + }, + "mr": { + 0: "़ ० १ २ ३ ४ ५ ६ ७ ८ ९ ॐ ं ँ ः अ आ इ ई उ ऊ ऋ ऌ ऍ ए ऐ ऑ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न प फ ब भ म य र ल व श ष स ह ळ ऽ ा ि ी ु ू ृ ॄ ॅ े ै ॉ ो ौ ्", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200c \u200d", + 5: "\u200d ॐ ं ः अ आ इ ई उ ऊ ऋ ऌ ए ऐ ऑ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न प फ ब भ म य र ल व श ष स ह ळ ऽ ॅ ्", + }, + "ms": { + 0: "a ai au b c d dz e f g h i j k kh l m n ng ngg ny o p q r s sy t ts u ua v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "mt": { + 0: "a à b ċ d e è f ġ g għ h ħ i ì j k l m n o ò p q r s t u ù v w x ż z", + 2: "- , ; : ! ? . ' ‘ ’ \" “ ” ( ) [ ] { }", + 3: "c y", + }, + "mua": { + 0: "a ã b ɓ c d ɗ e ë ǝ f g h i ĩ j k l m n ŋ o õ p r s t u v ṽ w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q x", + 5: "A B Ɓ C D Ɗ E Ǝ F G H I J K L M N Ŋ O P R S T U V W Y Z", + }, + "my": { + 0: "က ခ ဂ ဃ င စ ဆ ဇ ဈ ဉ ည ဋ ဌ ဍ ဎ ဏ တ ထ ဒ ဓ န ပ ဖ ဗ ဘ မ ယ ရ လ ဝ သ ဟ ဠ အ ဣ ဤ ဥ ဦ ဧ ဩ ဪ ာ ါ ိ ီ ု ူ ေ ဲ ံ ဿ ျ ြ ွ ှ ္ ် ့ း", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "ၐ ၑ ဨ ဢ ၒ ၓ ၔ ၕ ၖ ၗ ၘ ၙ", + }, + "naq": { + 0: "a â b c d e f g h i î k m n o ô p q r s t u û w x y z ǀ ǁ ǂ ǃ", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "j l v", + 5: "A B C D E F G H I K M N O P Q R S T U W X Y Z", + }, + "nb": { + 0: "a à b c d e é f g h i j k l m n o ó ò ô p q r s t u v w x y z æ ø å", + 2: "- – , ; : ! ? . ' \" « » ( ) [ ] { } § @ * / \\", + 3: "á ǎ ã č ç đ è ê í ń ñ ŋ š ŧ ü ž ä ö", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Æ Ø Å", + }, + "nd": { + 0: "a b c d e f g h i j k l m n o p q s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "r", + 5: "A B C D E F G H I J K L M N O P Q S T U V W X Y Z", + }, + "ne": { + 0: "़ ँ ं ः ॐ अ आ इ ई उ ऊ ऋ ऌ ऍ ए ऐ ऑ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न प फ ब भ म य र ल ळ व श ष स ह ऽ ा ि ी ु ू ृ ॄ ॅ े ै ॉ ो ौ ्", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200c \u200d", + }, + "nl": { + 0: "a á ä b c d e é ë f g h i í ï ij j k l m n o ó ö p q r s t u ú ü v w x y z", + 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", + 3: "à â å ã æ ç è ê î ñ ô ø œ ù û ÿ", + }, + "nmg": { + 0: "a á ă â ä ā b ɓ c d e é ĕ ê ē ǝ ǝ́ ǝ̆ ǝ̂ ǝ̄ ɛ ɛ́ ɛ̆ ɛ̂ ɛ̄ f g h i í ĭ î ï ī j k l m n ń ŋ o ó ŏ ô ö ō ɔ ɔ́ ɔ̆ ɔ̂ ɔ̄ p r ŕ s t u ú ŭ û ū v w y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q x z", + 5: "A B Ɓ C D E Ǝ Ɛ F G H I J K L M N Ŋ O Ɔ P R S T U V W Y", + }, + "nn": { + 0: "a à b c d e é f g h i j k l m n o ó ò ô p q r s t u v w x y z æ ø å", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "á ǎ č ç đ è ê ń ñ ŋ š ŧ ü ž ä ö", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Æ Ø Å", + }, + "nnh": { + 0: "a á à â ǎ b c d e é è ê ě ɛ ɛ́ ɛ̀ ɛ̂ ɛ̌ f g h i í ì j k l m n ŋ o ó ò ô ǒ ɔ ɔ́ ɔ̀ ɔ̂ ɔ̌ p pf s sh t ts u ú ù û ǔ ʉ ʉ́ ʉ̀ ʉ̂ ʉ̌ v w ẅ y ÿ z ʼ", + 2: ", ; : ! ? . ' ‘ ’ « »", + 3: "q r x", + 5: "A B C D E Ɛ F G H I J K L M N Ŋ O Ɔ P Pf R S Sh T Ts U Ʉ V W Ẅ Y Ÿ Z ʼ", + }, + "nr": { + 0: "a b c d e f g h i j k l m n o p q s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "r", + }, + "nso": { + 0: "a b d e ê f g h i j k l m n o ô p r s š t u w x y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "c q v z", + }, + "nus": { + 0: "a ä a̱ b c d e ë e̱ ɛ ɛ̈ ɛ̱ ɛ̱̈ f g ɣ h i ï i̱ j k l m n ŋ o ö o̱ ɔ ɔ̈ ɔ̱ p q r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B C D E Ɛ F G Ɣ H I J K L M N Ŋ O Ɔ P Q R S T U V W X Y Z", + }, + "nyn": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "om": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "or": { + 0: "଼ ଅ ଆ ଇ ଈ ଉ ଊ ଋ ଏ ଐ ଓ ଔ ଁ ଂ ଃ କ ଖ ଗ ଘ ଙ ଚ ଛ ଜ ଝ ଞ ଟ ଠ ଡ ଡ଼ ଢ ଢ଼ ଣ ତ ଥ ଦ ଧ ନ ପ ଫ ବ ଭ ମ ଯ ୟ ର ଲ ଳ ଵ ୱ ଶ ଷ ସ ହ ା ି ୀ ୁ ୂ ୃ େ ୈ ୋ ୌ ୍", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200c \u200d", + }, + "os": { + 0: "а ӕ б в г гъ д дж дз е ё ж з и й к къ л м н о п пъ р с т тъ у ф х хъ ц цъ ч чъ ш щ ъ ы ь э ю я", + 2: "- ‐ – — , ; : ! ? . … ' ‘ ‚ \" “ „ « » ( ) [ ] { } § @ * / & #", + 5: "А Ӕ Б В Г Гъ Д Дж Дз Е Ё Ж З И Й К Къ Л М Н О П Пъ Р С Т Тъ У Ф Х Хъ Ц Цъ Ч Чъ Ш Щ Ы Э Ю Я", + }, + "pa": { + 0: "ੱ ੰ ਼ ੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯ ੴ ੳ ਉ ਊ ਓ ਅ ਆ ਐ ਔ ੲ ਇ ਈ ਏ ਸ ਸ਼ ਹ ਕ ਖ ਖ਼ ਗ ਗ਼ ਘ ਙ ਚ ਛ ਜ ਜ਼ ਝ ਞ ਟ ਠ ਡ ਢ ਣ ਤ ਥ ਦ ਧ ਨ ਪ ਫ ਫ਼ ਬ ਭ ਮ ਯ ਰ ਲ ਵ ੜ ੍ ਾ ਿ ੀ ੁ ੂ ੇ ੈ ੋ ੌ", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200c \u200d ਃ ਂ ਁ ਲ਼", + }, + "pa-Arab": { + 0: "ُ ء آ ؤ ئ ا ب پ ت ث ٹ ج چ ح خ د ذ ڈ ر ز ڑ ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن ں ه ھ ہ و ی ے", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "أ ٻ ة ٺ ټ ٽ", + }, + "pl": { + 0: "a ą b c ć d e ę f g h i j k l ł m n ń o ó p r s ś t u w y z ź ż", + 2: "- ‐ – — , ; : ! ? . … ' \" ” „ « » ( ) [ ] { } § @ * / & # % † ‡ ′ ″ ° ~", + 3: "à â å ä æ ç é è ê ë î ï ô ö œ q ß ù û ü v x ÿ", + }, + "ps": { + 0: "َ ِ ُ ً ٍ ٌ ّ ْ ٔ ٰ آ ا أ ء ب پ ت ټ ث ج ځ چ څ ح خ د ډ ذ ر ړ ز ژ ږ س ش ښ ص ض ط ظ ع غ ف ق ک ګ ل م ن ڼ ه ة و ؤ ی ي ې ۍ ئ", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200c \u200d", + }, + "pt": { + 0: "a á à â ã b c ç d e é ê f g h i í j k l m n o ó ò ô õ p q r s t u ú v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "ª ă å ä ā æ è ĕ ë ē ì ĭ î ï ī ñ º ŏ ö ø ō œ ù ŭ û ü ū ÿ", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "rm": { + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "rn": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "ro": { + 0: "a ă â b c d e f g h i î j k l m n o p r s ș t ț u v x z", + 2: "- ‐ – — , ; : ! ? . … ' ‘ \" “ ” „ « » ( ) [ ] @ * /", + 3: "á à å ä ç é è ê ë ñ ö q ş ţ ü w y", + 5: "A Ă Â B C D E F G H I Î J K L M N O P Q R S Ș T Ț U V W X Y Z", + }, + "rof": { + 0: "a b c d e f g h i j k l m n o p r s t u v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q x", + 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", + }, + "und": { + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "ru": { + 0: "а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я", + 2: "- ‐ – — , ; : ! ? . … ' ‘ ‚ \" “ „ « » ( ) [ ] { } § @ * / & #", + 3: "а́ е́ и́ о́ у́ ы́ э́ ю́ я́", + 5: "А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ы Э Ю Я", + }, + "rw": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "rwk": { + 0: "a b c d e f g h i j k l m n o p r s t u v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q x", + 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", + }, + "sah": { + 0: "а б г ҕ д дь и й к л м н нь ҥ о ө п р с т у ү х һ ч ы э", + 3: "в е ё ж з ф ц ш щ ъ ь ю я", + 5: "А Б Г Ҕ Д Дь И Й К Л М Н Нь Ҥ О Ө П Р С Т У Ү Х Һ Ч Ы Э", + }, + "saq": { + 0: "a b c d e g h i j k l m n o p r s t u v w y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "f q x z", + 5: "A B C D E G H I J K L M N O P R S T U V W Y", + }, + "sbp": { + 0: "a b c d e f g h i j k l m n o p s t u v w y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q r x z", + 5: "A B C D E F G H I J K L M N O P S T U V W Y", + }, + "se": { + 0: "a á b c č d đ e f g h i j k l m n ŋ o p r s š t ŧ u v z ž", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "à å ä ã æ ç é è í ń ñ ó ò ö ø q ú ü w x y", + }, + "seh": { + 0: "a á à â ã b c ç d e é ê f g h i í j k l m n o ó ò ô õ p q r s t u ú v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "ses": { + 0: "a ã b c d e ẽ f g h i j k l m n ɲ ŋ o õ p q r s š t u w x y z ž", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "v", + 5: "A à B C D E Ẽ F G H I J K L M N Ɲ Ŋ O Õ P Q R S Š T U W X Y Z Ž", + }, + "sg": { + 0: "a â ä b d e ê ë f g h i î ï j k l m n o ô ö p r s t u ù û ü v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "c q x", + 5: "A B D E F G H I J K L M N O P R S T U V W Y Z", + }, + "shi": { + 0: "ⴰ ⴱ ⴳ ⴳⵯ ⴷ ⴹ ⴻ ⴼ ⴽ ⴽⵯ ⵀ ⵃ ⵄ ⵅ ⵇ ⵉ ⵊ ⵍ ⵎ ⵏ ⵓ ⵔ ⵕ ⵖ ⵙ ⵚ ⵛ ⵜ ⵟ ⵡ ⵢ ⵣ ⵥ", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "ⴰ ⴱ ⴳ ⴷ ⴹ ⴻ ⴼ ⴽ ⵀ ⵃ ⵄ ⵅ ⵇ ⵉ ⵊ ⵍ ⵎ ⵏ ⵓ ⵔ ⵕ ⵖ ⵙ ⵚ ⵛ ⵜ ⵟ ⵡ ⵢ ⵣ ⵥ", + }, + "shi-Latn": { + 0: "a b c d ḍ e ɛ f g gʷ ɣ h ḥ i j k kʷ l m n q r ṛ s ṣ t ṭ u w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "o p v", + 5: "A B C D Ḍ E Ɛ F G Gʷ Ɣ H Ḥ I J K Kʷ L M N Q R Ṛ S Ṣ T Ṭ U W X Y Z", + }, + "si": { + 0: "අ ආ ඇ ඈ ඉ ඊ උ ඌ ඍ එ ඒ ඓ ඔ ඕ ඖ ං ඃ ක ඛ ග ඝ ඞ ඟ ච ඡ ජ ඣ ඥ ඤ ට ඨ ඩ ඪ ණ ඬ ත ථ ද ධ න ඳ ප ඵ බ භ ම ඹ ය ර ල ව ශ ෂ ස හ ළ ෆ ා ැ ෑ ි ී ු ූ ෘ ෲ ෟ ෙ ේ ෛ ො ෝ ෞ ්", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200b \u200c \u200d ඎ ඏ ඐ ඦ ෳ", + 5: "අ ආ ඇ ඈ ඉ ඊ උ ඌ ඍ එ ඒ ඓ ඔ ඕ ඖ ක ඛ ග ඝ ඞ ඟ ච ඡ ජ ඣ ඥ ඤ ට ඨ ඩ ඪ ණ ඬ ත ථ ද ධ න ඳ ප ඵ බ භ ම ඹ ය ර ල ව ශ ෂ ස හ ළ ෆ", + }, + "sk": { + 0: "a á ä b c č d ď e é f g h ch i í j k l ĺ ľ m n ň o ó ô p q r ŕ s š t ť u ú v w x y ý z ž", + 2: "- ‐ – , ; : ! ? . … ‘ ‚ “ „ ( ) [ ] § @ * / &", + }, + "sl": { + 0: "a b c č d e f g h i j k l m n o p r s š t u v z ž", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "á à ă â å ä ā æ ç ć đ é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ö ø ō œ q ú ù ŭ û ü ū w x y ÿ", + 5: "A B C Č Ć D Đ E F G H I J K L M N O P Q R S Š T U V W X Y Z Ž", + }, + "sn": { + 0: "a b c d e f g h i j k l m n o p r s t u v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q x", + 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", + }, + "so": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "sq": { + 0: "a b c ç d dh e ë f g gj h i j k l ll m n nj o p q r rr s sh t th u v x xh y z zh", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "w", + }, + "sr": { + 0: "а б в г д ђ е ж з и ј к л љ м н њ о п р с т ћ у ф х ц ч џ ш", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "ё й щ ъ ы ь э ю я", + }, + "sr-Latn": { + 0: "a b c č ć d dž đ e f g h i j k l lj m n nj o p r s š t u v z ž", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "å q w x y", + }, + "ss": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "ssy": { + 0: "a b t s e c k x i d q r f g o l m n u w h y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "j p v z", + 5: "A B T S E C K X I D Q R F G O L M N U W H Y", + }, + "st": { + 0: "a b d e f g h i j k l m n o p q r s t u w y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "c v x z", + }, + "sv": { + 0: "a à b c d e é f g h i j k l m n o p q r s t u v w x y z å ä ö", + 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", + 3: "á â ã ā ç ë í î ï ī ñ ó ú ÿ ü æ ø", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Å Ä Ö", + }, + "sv-FI": { + 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", + 3: "ã ç ë í ñ ó š ÿ ü ž", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Å Ä Ö", + }, + "sw": { + 0: "a b ch d e f g h i j k l m n o p r s t u v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "c q x", + }, + "swc": { + 0: "a b c d e f g h i j k l m n o p r s t u v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q x", + 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", + }, + "ta": { + 0: "அ ஆ இ ஈ உ ஊ எ ஏ ஐ ஒ ஓ ஔ ஃ க ங ச ஞ ட ண த ந ப ம ய ர ல வ ழ ள ற ன ஜ ஷ ஸ ஹ ா ி ீ ு ூ ெ ே ை ொ ோ ௌ ்", + 3: "\u200c \u200d", + }, + "te": { + 0: "అ ఆ ఇ ఈ ఉ ఊ ఋ ౠ ఌ ౡ ఎ ఏ ఐ ఒ ఓ ఔ ఁ ం ః క ఖ గ ఘ ఙ చ ఛ జ ఝ ఞ ట ఠ డ ఢ ణ త థ ద ధ న ప ఫ బ భ మ య ర ఱ ల వ శ ష స హ ళ ా ి ీ ు ూ ృ ౄ ె ే ై ొ ో ౌ ్ ౕ ౖ", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200c \u200d ౦ ౧ ౨ ౩ ౪ ౫ ౬ ౭ ౮ ౯", + 5: "అ ఆ ఇ ఈ ఉ ఊ ఋ ౠ ఎ ఏ ఐ ఒ ఓ ఔ క ఖ గ ఘ ఙ చ ఛ జ ఝ ఞ ట ఠ డ ఢ ణ త థ ద ధ న ప ఫ బ భ మ య ర ఱ ల వ శ ష స హ ళ", + }, + "teo": { + 0: "a b c d e g h i j k l m n o p r s t u v w x y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "f q z", + 5: "A B C D E G H I J K L M N O P R S T U V W X Y", + }, + "tg": { + 0: "а б в г ғ д е ё ж з и ӣ й к қ л м н о п р с т у ӯ ф х ҳ ч ҷ ш ъ э ю я", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "ц щ ы ь", + }, + "th": { + 0: "ฯ ๆ ๎ ์ ็ ่ ้ ๊ ๋ ก ข ฃ ค ฅ ฆ ง จ ฉ ช ซ ฌ ญ ฎ ฏ ฐ ฑ ฒ ณ ด ต ถ ท ธ น บ ป ผ ฝ พ ฟ ภ ม ย ร ฤ ล ฦ ว ศ ษ ส ห ฬ อ ฮ ํ ะ ั า ๅ ำ ิ ี ึ ื ุ ู เ แ โ ใ ไ ฺ", + 2: "! \" # ' ( ) * , - . / : @ [ \\ ] ‐ – — ‘ ’ “ ” … ′ ″", + 3: "\u200b", + }, + "ti": { + 0: "፟ ሀ ሀ ሁ ሂ ሃ ሄ ህ ሆ ለ ለ ሉ ሊ ላ ሌ ል ሎ ሏ ሐ ሑ ሒ ሓ ሔ ሕ ሖ ሗ መ ሙ ሚ ማ ሜ ም ሞ ሟ ሠ ሡ ሢ ሣ ሤ ሥ ሦ ሧ ረ ሩ ሪ ራ ሬ ር ሮ ሯ ሰ ሱ ሲ ሳ ሴ ስ ሶ ሷ ሸ ሹ ሺ ሻ ሼ ሽ ሾ ሿ ቀ ቁ ቂ ቃ ቄ ቅ ቆ ቈ ቊ ቊ ቋ ቌ ቍ ቐ ቐ ቑ ቒ ቓ ቔ ቕ ቖ ቘ ቚ ቚ ቛ ቜ ቝ በ በ ቡ ቢ ባ ቤ ብ ቦ ቧ ቨ ቩ ቪ ቫ ቬ ቭ ቮ ቯ ተ ቱ ቲ ታ ቴ ት ቶ ቷ ቸ ቹ ቺ ቻ ቼ ች ቾ ቿ ኀ ኁ ኂ ኃ ኄ ኅ ኆ ኈ ኊ ኊ ኋ ኌ ኍ ነ ነ ኑ ኒ ና ኔ ን ኖ ኗ ኘ ኙ ኚ ኛ ኜ ኝ ኞ ኟ አ ኡ ኢ ኣ ኤ እ ኦ ኧ ከ ኩ ኪ ካ ኬ ክ ኮ ኰ ኲ ኲ ኳ ኴ ኵ ኸ ኸ ኹ ኺ ኻ ኼ ኽ ኾ ዀ ዂ ዂ ዃ ዄ ዅ ወ ወ ዉ ዊ ዋ ዌ ው ዎ ዐ ዐ ዑ ዒ ዓ ዔ ዕ ዖ ዘ ዘ ዙ ዚ ዛ ዜ ዝ ዞ ዟ ዠ ዡ ዢ ዣ ዤ ዥ ዦ ዧ የ ዩ ዪ ያ ዬ ይ ዮ ደ ደ ዱ ዲ ዳ ዴ ድ ዶ ዷ ጀ ጀ ጁ ጂ ጃ ጄ ጅ ጆ ጇ ገ ጉ ጊ ጋ ጌ ግ ጎ ጐ ጒ ጒ ጓ ጔ ጕ ጠ ጠ ጡ ጢ ጣ ጤ ጥ ጦ ጧ ጨ ጩ ጪ ጫ ጬ ጭ ጮ ጯ ጰ ጱ ጲ ጳ ጴ ጵ ጶ ጷ ጸ ጹ ጺ ጻ ጼ ጽ ጾ ጿ ፀ ፁ ፂ ፃ ፄ ፅ ፆ ፇ ፈ ፉ ፊ ፋ ፌ ፍ ፎ ፏ ፐ ፑ ፒ ፓ ፔ ፕ ፖ ፗ", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "᎐ ᎐ ᎑ ᎒ ᎓ ᎔ ᎕ ᎖ ᎗ ᎘ ᎙ ሇ ⶀ ᎀ ᎀ ᎁ ᎂ ᎃ ⶁ ⶁ ⶂ ⶃ ⶄ ቇ ᎄ ᎄ ᎅ ᎆ ᎇ ⶅ ⶅ ⶆ ⶇ ኇ ⶈ ⶈ ⶉ ⶊ ኯ ዏ ⶋ ዯ ⶌ ዸ ዸ ዹ ዺ ዻ ዼ ዽ ዾ ዿ ⶍ ⶎ ጏ ጘ ጘ ጙ ጚ ጛ ጜ ጝ ጞ ጟ ⶓ ⶓ ⶔ ⶕ ⶖ ⶏ ⶏ ⶐ ⶑ ፇ ᎈ ᎈ ᎉ ᎊ ᎋ ᎌ ᎍ ᎎ ᎏ ⶒ ፘ ፘ ፙ ፚ ⶠ ⶠ ⶡ ⶢ ⶣ ⶤ ⶥ ⶦ ⶨ ⶨ ⶩ ⶪ ⶫ ⶬ ⶭ ⶮ ⶰ ⶰ ⶱ ⶲ ⶳ ⶴ ⶵ ⶶ ⶸ ⶸ ⶹ ⶺ ⶻ ⶼ ⶽ ⶾ ⷀ ⷀ ⷁ ⷂ ⷃ ⷄ ⷅ ⷆ ⷈ ⷈ ⷉ ⷊ ⷋ ⷌ ⷍ ⷎ ⷐ ⷐ ⷑ ⷒ ⷓ ⷔ ⷕ ⷖ ⷘ ⷘ ⷙ ⷚ ⷛ ⷜ ⷝ ⷞ", + 5: "ሀ ለ ሐ መ ሠ ረ ሰ ሸ ቀ ቈ ቐ ቘ በ ቨ ተ ቸ ኀ ኈ ነ ኘ አ ከ ኰ ኸ ዀ ወ ዐ ዘ ዠ የ ደ ጀ ገ ጐ ጠ ጨ ጰ ጸ ፀ ፈ ፐ", + }, + "ti-ER": { + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "tig": { + 0: "፟ ፡ ፣ ፣ ፤ ፥ ፦ ፧ ። ፠ ፨ ᎐ ᎐ ᎑ ᎒ ᎓ ᎔ ᎕ ᎖ ᎗ ᎘ ᎙ ፲ ፲ ፳ ፴ ፵ ፶ ፷ ፸ ፹ ፺ ፻ ፼ ፩ ፩ ፪ ፫ ፬ ፭ ፮ ፯ ፰ ፱ ሀ ሀ ሁ ሂ ሃ ሄ ህ ሆ ሇ ለ ሉ ሊ ላ ሌ ል ሎ ሏ ⶀ ሐ ሐ ሑ ሒ ሓ ሔ ሕ ሖ ሗ መ ሙ ሚ ማ ሜ ም ሞ ሟ ᎀ ᎀ ᎁ ᎂ ᎃ ⶁ ሠ ሠ ሡ ሢ ሣ ሤ ሥ ሦ ሧ ረ ሩ ሪ ራ ሬ ር ሮ ሯ ⶂ ሰ ሰ ሱ ሲ ሳ ሴ ስ ሶ ሷ ⶃ ሸ ሸ ሹ ሺ ሻ ሼ ሽ ሾ ሿ ⶄ ቀ ቀ ቁ ቂ ቃ ቄ ቅ ቆ ቇ ቈ ቊ ቊ ቋ ቌ ቍ ቐ ቐ ቑ ቒ ቓ ቔ ቕ ቖ ቘ ቚ ቚ ቛ ቜ ቝ በ በ ቡ ቢ ባ ቤ ብ ቦ ቧ ᎄ ᎄ ᎅ ᎆ ᎇ ⶅ ቨ ቨ ቩ ቪ ቫ ቬ ቭ ቮ ቯ ተ ቱ ቲ ታ ቴ ት ቶ ቷ ⶆ ቸ ቸ ቹ ቺ ቻ ቼ ች ቾ ቿ ⶇ ኀ ኀ ኁ ኂ ኃ ኄ ኅ ኆ ኇ ኈ ኊ ኊ ኋ ኌ ኍ ነ ነ ኑ ኒ ና ኔ ን ኖ ኗ ⶈ ኘ ኘ ኙ ኚ ኛ ኜ ኝ ኞ ኟ ⶉ አ አ ኡ ኢ ኣ ኤ እ ኦ ኧ ⶊ ከ ከ ኩ ኪ ካ ኬ ክ ኮ ኯ ኰ ኲ ኲ ኳ ኴ ኵ ኸ ኸ ኹ ኺ ኻ ኼ ኽ ኾ ዀ ዂ ዂ ዃ ዄ ዅ ወ ወ ዉ ዊ ዋ ዌ ው ዎ ዏ ዐ ዑ ዒ ዓ ዔ ዕ ዖ ዘ ዘ ዙ ዚ ዛ ዜ ዝ ዞ ዟ ⶋ ዠ ዠ ዡ ዢ ዣ ዤ ዥ ዦ ዧ የ ዩ ዪ ያ ዬ ይ ዮ ዯ ደ ዱ ዲ ዳ ዴ ድ ዶ ዷ ⶌ ዸ ዸ ዹ ዺ ዻ ዼ ዽ ዾ ዿ ⶍ ጀ ጀ ጁ ጂ ጃ ጄ ጅ ጆ ጇ ⶎ ገ ገ ጉ ጊ ጋ ጌ ግ ጎ ጏ ጐ ጒ ጒ ጓ ጔ ጕ ጘ ጘ ጙ ጚ ጛ ጜ ጝ ጞ ጟ ⶓ ⶓ ⶔ ⶕ ⶖ ጠ ጠ ጡ ጢ ጣ ጤ ጥ ጦ ጧ ⶏ ጨ ጨ ጩ ጪ ጫ ጬ ጭ ጮ ጯ ⶐ ጰ ጰ ጱ ጲ ጳ ጴ ጵ ጶ ጷ ⶑ ጸ ጸ ጹ ጺ ጻ ጼ ጽ ጾ ጿ ፀ ፁ ፂ ፃ ፄ ፅ ፆ ፇ ፈ ፉ ፊ ፋ ፌ ፍ ፎ ፏ ᎈ ᎈ ᎉ ᎊ ᎋ ፐ ፐ ፑ ፒ ፓ ፔ ፕ ፖ ፗ ᎌ ᎌ ᎍ ᎎ ᎏ ⶒ ፘ ፘ ፙ ፚ ⶠ ⶠ ⶡ ⶢ ⶣ ⶤ ⶥ ⶦ ⶨ ⶨ ⶩ ⶪ ⶫ ⶬ ⶭ ⶮ ⶰ ⶰ ⶱ ⶲ ⶳ ⶴ ⶵ ⶶ ⶸ ⶸ ⶹ ⶺ ⶻ ⶼ ⶽ ⶾ ⷀ ⷀ ⷁ ⷂ ⷃ ⷄ ⷅ ⷆ ⷈ ⷈ ⷉ ⷊ ⷋ ⷌ ⷍ ⷎ ⷐ ⷐ ⷑ ⷒ ⷓ ⷔ ⷕ ⷖ ⷘ ⷘ ⷙ ⷚ ⷛ ⷜ ⷝ ⷞ", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "tn": { + 0: "a b d e ê f g h i j k l m n o ô p r s t u w y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "c q v x z", + }, + "to": { + 0: "a á ā e é ē f h i í ī k l m n ng o ó ō p s t u ú ū v ʻ", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "à ă â å ä æ b c ç d è ĕ ê ë g ì ĭ î ï j ñ ò ŏ ô ö ø œ q r ù ŭ û ü w x y ÿ z", + 5: "A E F H I K L M N NG O P S T U V ʻ", + }, + "tr": { + 0: "a b c ç d e f g ğ h ı i İ j k l m n o ö p r s ş t u ü v y z", + 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” ( ) [ ] § @ * / & # † ‡ ′ ″", + 3: "á à ă â å ä ã ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ø ō œ ö q ß ú ù ŭ û ū ü w x ÿ", + 5: "A B C Ç D E F G H I İ J K L M N O Ö P Q R S Ş T U Ü V W X Y Z", + }, + "ts": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "twq": { + 0: "a ã b c d e ẽ f g h i j k l m n ɲ ŋ o õ p q r s š t u w x y z ž", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "v", + }, + "tzm": { + 0: "a b c d ḍ e ɛ f g gʷ ɣ h ḥ i j k kʷ l m n q r ṛ s ṣ t ṭ u w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "o p v", + 5: "A B C D Ḍ E Ɛ F G Ɣ H Ḥ I J K L M N Q R Ṛ S Ṣ T Ṭ U W X Y Z", + }, + "uk": { + 0: "ʼ а б в г ґ д е є ж з и і ї й к л м н о п р с т у ф х ц ч ш щ ь ю я", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "ё ъ ы э", + 5: "А Б В Г Ґ Д Е Є Ж З И І Ї Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ю Я", + }, + "ur": { + 0: "ا أ آ ب پ ت ٹ ث ج چ ح خ د ڈ ذ ر ڑ ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن ں و ؤ ہ ۂ ھ ء ی ئ ے ة ه", + 2: "، ؍ ٫ ٬ ؛ : ؟ . ۔ ( ) [ ]", + 3: "\u0600 \u0601 \u0602 \u0603 \u200c \u200d \u200e \u200f ْ َ ِ ُ ٰ ٖ ٗ ً ٍ ٌ ٔ ّ ٘ ۃ ٻ ٺ ټ ٽ ي", + 5: "ا ب پ ت ٹ ث ج چ ح خ د ڈ ذ ر ڑ ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ہ ھ ء ی ے", + }, + "uz": { + 0: "а б в г ғ д е ё ж з и й к қ л м н о п р с т у ў ф х ҳ ч ш ъ э ю я", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "ц щ ы ь", + }, + "uz-Arab": { + 0: "ً ٌ ٍ َ ُ ِ ّ ْ ٔ ٰ ء آ أ ؤ ئ ا ب پ ة ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن ه و ۇ ۉ ی", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "\u200c \u200d ټ ځ څ ډ ړ ږ ښ ګ ڼ ي ۍ ې", + }, + "uz-Latn": { + 0: "a aʼ b ch d e eʼ f g gʻ h i iʼ j k l m n o oʻ p q r s sh t u uʼ v x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "c w", + 5: "A B CH D E F G Gʻ H I J K L M N O Oʻ P Q R S SH T U V X Y Z", + }, + "vai": { + 0: "꘠ ꘠ ꘡ ꘢ ꘣ ꘤ ꘥ ꘦ ꘧ ꘨ ꘩ ꔀ ꔀ ꔁ ꔂ ꔃ ꔄ ꔅ ꔆ ꔇ ꔈ ꔉ ꔊ ꔋ ꔌ ꘓ ꔍ ꔍ ꔎ ꔏ ꔐ ꔑ ꔒ ꔓ ꔔ ꔕ ꔖ ꔗ ꔘ ꔙ ꔚ ꔛ ꔜ ꔝ ꔞ ꘔ ꔟ ꔟ ꔠ ꔡ ꔢ ꔣ ꔤ ꔥ ꔦ ꔧ ꔨ ꔩ ꔪ ꔫ ꔬ ꔭ ꔮ ꔯ ꔰ ꔱ ꔲ ꔳ ꘕ ꔴ ꔴ ꔵ ꔶ ꔷ ꔸ ꔹ ꔺ ꔻ ꔼ ꔽ ꔾ ꔿ ꕀ ꕁ ꕂ ꕃ ꕄ ꕅ ꕆ ꕇ ꘖ ꕈ ꕈ ꕉ ꕊ ꕋ ꕌ ꕍ ꕎ ꕏ ꕐ ꕑ ꕒ ꘗ ꕓ ꕓ ꕔ ꕕ ꕖ ꕗ ꕘ ꘐ ꘘ ꕙ ꕚ ꘙ ꕛ ꕛ ꕜ ꕝ ꕞ ꕟ ꕠ ꘚ ꕡ ꕡ ꕢ ꕣ ꕤ ꕥ ꕦ ꕧ ꕨ ꕩ ꕪ ꘑ ꕫ ꕫ ꕬ ꕭ ꕮ ꘪ ꕯ ꕯ ꕰ ꕱ ꕲ ꕳ ꕴ ꕵ ꕶ ꕷ ꕸ ꕹ ꕺ ꕻ ꕼ ꕽ ꕾ ꕿ ꖀ ꖁ ꖂ ꖃ ꖄ ꖅ ꘛ ꖆ ꖇ ꘒ ꖈ ꖈ ꖉ ꖊ ꖋ ꖌ ꖍ ꖎ ꖏ ꖐ ꖑ ꖒ ꖓ ꖔ ꖕ ꖖ ꖗ ꖘ ꖙ ꖚ ꖛ ꖜ ꖝ ꖞ ꖟ ꖠ ꖡ ꖢ ꖣ ꖤ ꖥ ꖦ ꖧ ꖨ ꖩ ꖪ ꖫ ꖬ ꖭ ꖮ ꖯ ꖰ ꖱ ꖲ ꖳ ꖴ ꘜ ꖵ ꖵ ꖶ ꖷ ꖸ ꖹ ꖺ ꖻ ꖼ ꖽ ꖾ ꖿ ꗀ ꗁ ꗂ ꗃ ꗄ ꗅ ꗆ ꗇ ꗈ ꗉ ꗊ ꗋ ꘝ ꗌ ꗌ ꗍ ꗎ ꗏ ꗐ ꗑ ꘫ ꘞ ꗒ ꗒ ꗓ ꗔ ꗕ ꗖ ꗗ ꗘ ꘟ ꗙ ꗙ ꗚ ꗛ ꗜ ꗝ ꗞ ꗟ ꗠ ꗡ ꗢ ꗣ ꗤ ꗥ ꗦ ꗧ ꗨ ꗩ ꗪ ꗫ ꗬ ꗭ ꗮ ꗯ ꗰ ꗱ ꗲ ꗳ ꗴ ꗵ ꗶ ꗷ ꗸ ꗹ ꗺ ꗻ ꗼ ꗽ ꗾ ꗿ ꘀ ꘁ ꘂ ꘃ ꘄ ꘅ ꘆ ꘇ ꘈ ꘉ ꘊ ꘋ ꘌ", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "vai-Latn": { + 0: "a á ã b ɓ c d ɗ e é ẽ ɛ ɛ́ ɛ̃ f g h i í ĩ j k l m n ŋ o ó õ ɔ ɔ́ ɔ̃ p q r s t u ú ũ v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B Ɓ C D Ɗ E Ɛ F G H I J K L M N Ŋ O Ɔ P Q R S T U V W X Y Z", + }, + "ve": { + 0: "a b d ḓ e f g h i k l ḽ m n ṅ ṋ o p r s t ṱ u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "vi": { + 0: "a à ả ã á ạ ă ằ ẳ ẵ ắ ặ â ầ ẩ ẫ ấ ậ b c d đ e è ẻ ẽ é ẹ ê ề ể ễ ế ệ f g h i ì ỉ ĩ í ị j k l m n o ò ỏ õ ó ọ ô ồ ổ ỗ ố ộ ơ ờ ở ỡ ớ ợ p q r s t u ù ủ ũ ú ụ ư ừ ử ữ ứ ự v w x y ỳ ỷ ỹ ý ỵ z", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "vo": { + 0: "a ä b c d e f g h i j k l m n o ö p q r s š t u ü v x y z", + 2: "- ‐ – — , ; : ! ? . … ' ‘ ’ \" “ ” « » ( ) [ ] { } § @ * / & #", + 3: "q w", + 5: "A Ä B C D E F G H I J K L M N O Ö P R S T U Ü V X Y Z", + }, + "vun": { + 0: "a b c d e f g h i j k l m n o p r s t u v w y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "q x", + 5: "A B C D E F G H I J K L M N O P R S T U V W Y Z", + }, + "wae": { + 0: "a á ä ã b c č d e é f g h i í j k l m n o ó ö õ p q r s š t u ú ü ũ v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "à ă â å ā æ ç è ĕ ê ë ē ì ĭ î ï ī ñ ò ŏ ô ø ō œ ß ù ŭ û ū ÿ", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "wal": { + 0: "፟ ᎐ ᎐ ᎑ ᎒ ᎓ ᎔ ᎕ ᎖ ᎗ ᎘ ᎙ ሀ ሀ ሁ ሂ ሃ ሄ ህ ሆ ሇ ለ ሉ ሊ ላ ሌ ል ሎ ሏ ⶀ ሐ ሐ ሑ ሒ ሓ ሔ ሕ ሖ ሗ መ ሙ ሚ ማ ሜ ም ሞ ሟ ᎀ ᎀ ᎁ ᎂ ᎃ ⶁ ሠ ሠ ሡ ሢ ሣ ሤ ሥ ሦ ሧ ረ ሩ ሪ ራ ሬ ር ሮ ሯ ⶂ ሰ ሰ ሱ ሲ ሳ ሴ ስ ሶ ሷ ⶃ ሸ ሸ ሹ ሺ ሻ ሼ ሽ ሾ ሿ ⶄ ቀ ቀ ቁ ቂ ቃ ቄ ቅ ቆ ቇ ቈ ቊ ቊ ቋ ቌ ቍ ቐ ቐ ቑ ቒ ቓ ቔ ቕ ቖ ቘ ቚ ቚ ቛ ቜ ቝ በ በ ቡ ቢ ባ ቤ ብ ቦ ቧ ᎄ ᎄ ᎅ ᎆ ᎇ ⶅ ቨ ቨ ቩ ቪ ቫ ቬ ቭ ቮ ቯ ተ ቱ ቲ ታ ቴ ት ቶ ቷ ⶆ ቸ ቸ ቹ ቺ ቻ ቼ ች ቾ ቿ ⶇ ኀ ኀ ኁ ኂ ኃ ኄ ኅ ኆ ኇ ኈ ኊ ኊ ኋ ኌ ኍ ነ ነ ኑ ኒ ና ኔ ን ኖ ኗ ⶈ ኘ ኘ ኙ ኚ ኛ ኜ ኝ ኞ ኟ ⶉ አ አ ኡ ኢ ኣ ኤ እ ኦ ኧ ⶊ ከ ከ ኩ ኪ ካ ኬ ክ ኮ ኯ ኰ ኲ ኲ ኳ ኴ ኵ ኸ ኸ ኹ ኺ ኻ ኼ ኽ ኾ ዀ ዂ ዂ ዃ ዄ ዅ ወ ወ ዉ ዊ ዋ ዌ ው ዎ ዏ ዐ ዑ ዒ ዓ ዔ ዕ ዖ ዘ ዘ ዙ ዚ ዛ ዜ ዝ ዞ ዟ ⶋ ዠ ዠ ዡ ዢ ዣ ዤ ዥ ዦ ዧ የ ዩ ዪ ያ ዬ ይ ዮ ዯ ደ ዱ ዲ ዳ ዴ ድ ዶ ዷ ⶌ ዸ ዸ ዹ ዺ ዻ ዼ ዽ ዾ ዿ ⶍ ጀ ጀ ጁ ጂ ጃ ጄ ጅ ጆ ጇ ⶎ ገ ገ ጉ ጊ ጋ ጌ ግ ጎ ጏ ጐ ጒ ጒ ጓ ጔ ጕ ጘ ጘ ጙ ጚ ጛ ጜ ጝ ጞ ጟ ⶓ ⶓ ⶔ ⶕ ⶖ ጠ ጠ ጡ ጢ ጣ ጤ ጥ ጦ ጧ ⶏ ጨ ጨ ጩ ጪ ጫ ጬ ጭ ጮ ጯ ⶐ ጰ ጰ ጱ ጲ ጳ ጴ ጵ ጶ ጷ ⶑ ጸ ጸ ጹ ጺ ጻ ጼ ጽ ጾ ጿ ፀ ፁ ፂ ፃ ፄ ፅ ፆ ፇ ፈ ፉ ፊ ፋ ፌ ፍ ፎ ፏ ᎈ ᎈ ᎉ ᎊ ᎋ ፐ ፐ ፑ ፒ ፓ ፔ ፕ ፖ ፗ ᎌ ᎌ ᎍ ᎎ ᎏ ⶒ ፘ ፘ ፙ ፚ ⶠ ⶠ ⶡ ⶢ ⶣ ⶤ ⶥ ⶦ ⶨ ⶨ ⶩ ⶪ ⶫ ⶬ ⶭ ⶮ ⶰ ⶰ ⶱ ⶲ ⶳ ⶴ ⶵ ⶶ ⶸ ⶸ ⶹ ⶺ ⶻ ⶼ ⶽ ⶾ ⷀ ⷀ ⷁ ⷂ ⷃ ⷄ ⷅ ⷆ ⷈ ⷈ ⷉ ⷊ ⷋ ⷌ ⷍ ⷎ ⷐ ⷐ ⷑ ⷒ ⷓ ⷔ ⷕ ⷖ ⷘ ⷘ ⷙ ⷚ ⷛ ⷜ ⷝ ⷞ", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "xh": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + }, + "xog": { + 0: "a b c d e f g h i j k l m n o p q r s t u v w x y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "yav": { + 0: "a á à â ǎ ā b c d e é è ɛ ɛ́ ɛ̀ f h i í ì î ī k l m mb n ny ŋ ŋg o ó ò ô ǒ ō ɔ ɔ́ ɔ̀ p s t u ú ù û ǔ ū v w y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "g j q r x z", + 5: "A B C D E Ɛ F H I K L M N Ŋ O Ɔ P S T U V W Y", + }, + "yo": { + 0: "a á à b d e é è ẹ ẹ́ ẹ̀ f g gb h i í ì j k l m n o ó ò ọ ọ́ ọ̀ p r s ṣ t u ú ù w y", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "c q v x z", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "zh": { + 0: "一 丁 七 万 万 丈 三 上 下 丌 不 与 丑 专 且 世 丘 丘 丙 业 东 丝 丢 两 严 丧 个 中 丰 串 临 丸 丸 丹 为 主 丽 举 乃 久 么 义 之 之 乌 乍 乎 乏 乐 乔 乖 乘 乙 九 也 也 习 乡 书 买 乱 乾 了 予 争 事 二 于 亏 云 互 五 井 亚 些 亡 交 交 亥 亦 产 亨 享 京 亮 亲 人 亿 亿 什 仁 仅 仇 今 介 仍 从 仔 他 付 仙 代 代 令 以 仪 们 仰 仲 件 价 任 份 仿 企 伊 伍 伏 伏 伐 休 众 众 优 伙 会 伟 传 伤 伦 伯 估 伴 伸 似 伽 但 位 位 低 住 佐 佑 体 何 余 佛 作 你 佤 佩 佳 使 例 供 依 侠 侦 侦 侧 侨 侬 侯 侵 便 促 俄 俊 俗 保 信 俩 修 俱 俾 倍 倒 候 倚 借 倦 值 倾 假 偌 偏 做 停 健 偶 偷 储 催 傲 傻 像 僧 儒 儿 允 元 元 兄 充 先 光 克 免 兑 兔 党 入 全 八 八 公 六 兮 兰 共 关 关 兴 兵 其 具 典 兹 养 养 兼 兽 内 冈 册 再 冒 写 军 农 冠 冬 冰 冲 决 况 冷 准 凌 减 凝 几 凡 凤 凭 凯 凰 出 击 函 刀 分 切 刊 刑 划 列 列 刘 则 刚 创 初 判 利 别 到 制 制 刷 券 刺 刻 剂 前 剑 剧 剩 剪 副 割 力 劝 劝 办 功 加 务 劣 动 动 助 努 劫 励 励 劲 劳 势 勇 勉 勋 勒 勤 勾 勿 包 匆 匈 化 北 匙 匹 匹 区 医 十 千 升 午 半 华 协 卒 卓 单 单 卖 南 博 占 占 卡 卢 卫 卯 卯 印 危 即 却 卷 厂 厄 厄 厅 历 厉 压 压 厌 厍 厚 原 去 县 参 又 又 叉 及 友 双 反 发 叔 取 取 受 变 叙 口 口 古 句 另 只 只 叫 召 叭 可 台 史 右 叶 叶 号 司 叹 吃 各 合 合 吉 吊 同 同 名 后 吐 向 吓 吗 君 吝 吟 否 吧 含 听 启 吵 吸 吹 吻 吾 呀 呆 呈 告 呐 员 呜 呢 呦 周 味 呵 呼 命 和 咖 咦 咦 咧 咨 咪 咬 咯 咱 哀 品 哇 哇 哈 哉 响 哎 哟 哥 哦 哩 哪 哭 哲 唉 唐 唤 唬 售 唯 唱 唷 商 啊 啡 啥 啦 啪 喀 喂 善 喇 喊 喏 喔 喜 喝 喵 喷 喻 嗒 嗨 嗯 嘉 嘛 嘴 嘻 嘿 器 四 回 因 团 园 困 围 固 国 图 圆 圈 土 圣 在 圭 地 圳 场 圾 址 均 坎 坐 坑 块 坚 坚 坛 坜 坡 坤 坦 坪 垂 垃 型 垒 埃 埋 城 埔 域 培 基 堂 堆 堕 堡 堪 塑 塔 塞 填 境 增 墨 壁 壤 士 壬 壮 声 处 备 复 夏 夕 外 多 夜 够 夥 大 天 天 太 夫 央 失 头 夷 夷 夸 夹 夺 奇 奇 奈 奉 奋 奏 契 奔 奖 套 奥 女 奴 奶 她 好 如 妇 妈 妖 妙 妥 妨 妮 妹 妻 姆 姊 始 姐 姑 姓 委 姿 威 娃 娄 娘 娜 娟 娱 婆 婚 媒 嫁 嫌 嫩 子 孔 孕 字 字 存 孙 孜 孝 孟 季 孤 学 孩 宁 它 宇 宇 守 安 宋 完 宏 宗 宗 官 宙 定 宛 宜 宝 实 审 审 客 宣 室 宪 害 宴 家 容 宽 宽 宾 宿 寂 寄 寄 寅 密 寇 富 寒 寝 寝 寞 察 寡 寨 寸 对 寻 导 寿 封 射 将 尊 小 少 尔 尖 尘 尚 尝 尤 就 尺 尼 尼 尽 尾 局 局 屁 层 居 屋 屏 展 属 屠 山 岁 岂 岗 岘 岚 岛 岳 岸 峡 峰 崇 崩 崴 川 州 巡 工 工 左 巧 巨 巫 差 己 己 已 巳 巴 巷 币 币 市 布 帅 师 希 帐 帕 帖 帝 带 席 帮 常 帽 幅 幕 干 干 平 年 并 幸 幻 幻 幼 幽 广 庆 床 序 库 库 应 底 店 庙 庚 府 庞 废 度 座 庭 康 庸 廉 廖 延 廷 建 开 异 异 弃 弄 弊 式 引 弗 弘 弟 张 弥 弦 弯 弱 弹 强 归 当 录 彝 形 彩 彬 彭 彰 影 彷 役 彻 彼 往 征 径 待 很 律 後 徐 徒 得 循 微 徵 德 心 必 忆 忌 忍 志 志 忘 忙 忠 忧 快 念 忽 怀 态 怎 怒 怕 怖 思 怡 急 性 怨 怪 总 恋 恐 恢 恨 恩 恭 息 恰 恶 恼 悄 悉 悔 悟 悠 患 您 悲 情 惑 惜 惠 惧 惨 惯 想 惹 愁 愈 愉 意 愚 感 愧 慈 慎 慕 慢 慧 慰 憾 懂 懒 戈 戊 戌 戏 戏 成 我 戒 或 战 截 戴 户 房 房 所 扁 扇 手 才 扎 扑 打 托 扣 执 扩 扫 扫 扬 扭 扮 扯 批 找 找 承 技 抄 把 抑 抓 投 抗 折 抢 护 报 披 抬 抱 抵 抹 抽 担 拆 拉 拍 拒 拔 拖 拘 招 拜 拟 拥 拦 拨 择 括 拳 拷 拼 拾 拿 持 指 按 挑 挖 挝 挡 挤 挥 挪 振 挺 捉 捐 捕 损 捡 换 据 捷 授 掉 掌 排 探 接 控 控 推 掩 措 掸 描 提 插 握 援 搜 搞 搬 搭 摄 摆 摊 摔 摘 摩 摸 撒 撞 播 操 擎 擦 支 收 改 攻 放 政 故 效 敌 敏 救 教 敝 敢 散 敦 敬 数 敲 整 文 斋 斐 斗 料 斜 斥 断 斯 新 方 於 施 旁 旅 旋 族 旗 无 既 日 日 旦 旧 旨 早 旭 时 旺 昂 昆 昌 明 昏 易 星 映 春 昨 昭 是 显 晃 晋 晒 晓 晚 晨 普 景 晴 晶 智 暂 暑 暖 暗 暮 暴 曰 曲 更 曹 曼 曾 曾 替 最 月 有 朋 服 朗 望 朝 期 木 未 未 末 本 札 术 朱 朵 机 杀 杂 权 杉 李 材 村 杜 束 条 来 杨 杯 杰 松 板 极 构 析 林 果 枝 枢 枪 枫 架 柏 某 染 柔 查 柬 柯 柳 柴 标 栋 栏 树 校 样 样 核 根 格 桃 框 案 桌 桑 档 桥 梁 梅 梦 梯 械 梵 检 棉 棋 棒 棚 森 椅 植 椰 楚 楼 概 榜 模 樱 檀 欠 欠 次 欢 欣 欧 欲 欺 款 歉 歌 止 止 正 此 步 武 歪 死 殊 残 段 毅 母 每 毒 比 毕 毛 毫 氏 民 气 氛 水 永 求 汇 汉 汗 汝 江 江 池 污 汤 汪 汶 汽 沃 沈 沉 沙 沟 没 沧 河 油 治 沿 泉 泊 法 泛 泡 泡 波 泣 泥 注 泰 泳 泽 洋 洗 洛 洞 津 洪 洲 活 洽 派 流 浅 测 济 浏 浑 浓 浙 浦 浩 浪 浮 浴 海 涅 消 涉 涛 涨 涯 液 涵 淋 淑 淘 淡 深 混 添 清 渐 渡 渣 温 港 渴 游 湖 湾 源 溜 溪 滋 滑 满 滥 滨 滴 漂 漏 演 漠 漫 潘 潜 潮 澎 澳 激 灌 火 灭 灯 灰 灵 灿 炉 炎 炮 炸 点 烂 烈 烤 烦 烧 热 焦 然 煌 煞 照 煮 熊 熟 燃 燕 爆 爪 爬 爱 爵 爵 父 爷 爸 爽 片 版 牌 牙 牛 牡 牢 牧 物 牲 牵 特 牺 犯 状 犹 狂 狐 狗 狠 独 狮 狱 狼 猛 猜 猪 献 猴 玄 率 玉 王 玛 玩 玫 环 现 玲 玻 珀 珊 珍 珠 班 球 理 琊 琪 琳 琴 琼 瑙 瑜 瑞 瑟 瑰 瑶 璃 瓜 瓦 瓶 甘 甚 甜 生 用 田 田 由 甲 申 电 男 甸 画 畅 界 留 略 番 疆 疏 疑 疗 疯 疲 疼 疾 病 痕 痛 痴 癸 登 白 百 的 皆 皇 皮 盈 益 监 盒 盖 盘 盛 盟 目 直 相 盼 盾 省 眉 看 真 眠 眼 着 睛 睡 督 瞧 矛 矣 知 短 石 矶 码 砂 砍 研 破 础 硕 硬 确 碍 碎 碗 碟 碧 碰 磁 磅 磨 示 礼 社 祖 祚 祝 神 祥 票 祯 祸 禁 禅 福 离 秀 私 秋 种 科 秒 秘 租 秤 秦 秩 积 称 移 稀 程 稍 税 稣 稳 稿 穆 究 穷 穹 空 穿 突 窗 窝 立 站 竞 竞 竟 章 童 端 竹 笑 笔 笛 符 笨 第 等 筋 筑 答 策 筹 签 简 算 管 箭 箱 篇 篮 簿 籍 米 类 粉 粒 粗 粤 粹 精 糊 糕 糖 糟 系 素 索 紧 紫 累 繁 红 约 级 纪 纯 纲 纳 纵 纷 纸 纽 线 练 组 细 细 织 终 绍 经 结 绕 绘 给 络 绝 统 继 绩 绪 续 维 绵 综 绿 缅 缓 编 缘 缠 缩 缴 缶 缸 缺 罐 网 罕 罗 罚 罢 罪 置 署 羊 美 羞 群 羯 羽 翁 翅 翔 翘 翠 翰 翻 翼 耀 老 考 者 而 耍 耐 耗 耳 耶 聊 职 联 聘 聚 聪 肉 肖 肚 股 肤 肥 肩 肯 育 胁 胆 背 胎 胖 胜 胞 胡 胶 胸 能 脆 脑 脱 脸 腊 腐 腓 腰 腹 腾 腿 臂 臣 自 臭 至 致 舌 舍 舒 舞 舟 航 般 舰 船 良 色 艺 艾 节 芒 芝 芦 芬 芭 花 芳 苍 苏 苗 若 苦 英 茂 范 茨 茫 茶 草 荐 荒 荣 药 荷 莉 莎 莪 莫 莱 莲 获 菜 菩 菲 萄 萍 萤 营 萧 萨 落 著 葛 葡 蒂 蒋 蒙 蓉 蓝 蓬 蔑 蔡 薄 薪 藉 藏 藤 虎 虑 虫 虹 虽 虾 蚁 蛇 蛋 蛙 蛮 蜂 蜜 蝶 融 蟹 蠢 血 行 街 衡 衣 补 表 袋 被 袭 裁 裂 装 裕 裤 西 要 覆 见 观 规 视 览 觉 角 解 言 誉 誓 警 计 订 认 讨 让 训 训 议 讯 记 讲 讷 许 论 设 访 证 评 识 诉 词 译 试 诗 诚 话 诞 询 该 详 语 误 说 请 诸 诺 读 课 谁 调 谅 谈 谊 谋 谓 谜 谢 谨 谱 谷 豆 象 豪 貌 贝 贝 贞 负 贡 贡 财 责 贤 败 货 货 质 贩 贪 购 贯 贱 贴 贵 贸 贸 费 贺 贼 贾 资 赋 赌 赏 赐 赔 赖 赚 赛 赞 赠 赢 赤 赫 走 赵 起 趁 超 越 趋 趣 足 跃 跌 跑 距 跟 路 跳 踏 踢 踩 身 躲 车 轨 轩 转 轮 轮 软 轰 轻 载 较 辅 辆 辈 辉 辑 输 辛 辞 辨 辩 辰 辱 边 达 迁 迅 过 迈 迎 运 近 返 还 这 进 进 远 违 连 迟 迦 迪 迫 述 迷 追 退 退 送 适 逃 逆 选 逊 透 逐 递 途 通 逛 逝 速 造 逢 逸 逻 逼 遇 遍 道 遗 遭 遮 遵 避 邀 邓 那 邦 邪 邮 邱 邻 郎 郑 部 郭 都 鄂 酉 酋 配 酒 酷 酸 醉 醒 采 释 里 里 重 野 量 金 针 钓 钟 钢 钦 钱 钻 铁 铃 铜 铢 铭 银 铺 链 销 锁 锅 锋 错 锡 锦 键 锺 镇 镜 镭 长 门 闪 闭 问 闰 闲 间 闷 闹 闻 阁 阅 阐 阔 队 阮 防 防 阳 阴 阵 阶 阻 阿 陀 附 附 际 陆 陈 降 限 院 除 险 陪 陵 陵 陶 陷 隆 随 隐 隔 障 难 雄 雄 雅 集 雉 雨 雪 雯 雳 零 雷 雾 需 震 霍 霖 露 霸 霹 青 靖 静 非 靠 面 革 靼 鞋 鞑 韦 韩 音 页 顶 项 项 顺 须 顽 顽 顾 顿 预 领 颇 频 颗 题 额 风 飘 飙 飞 食 餐 饭 饮 饰 饱 饼 馆 首 香 馨 马 驱 驶 驻 驾 验 骑 骗 骚 骤 骨 高 鬼 魂 魅 魔 鱼 鲁 鲜 鸟 鸡 鸣 鸭 鸿 鹅 鹤 鹰 鹿 麦 麻 黄 黎 黑 默 鼓 鼠 鼻 齐 齿 龄 龙 龟", + 2: "﹉ ﹉ ﹊ ﹋ ﹌ _ _ ﹍ ﹍ ﹎ ﹏ ︳ ︴ - - ﹣ ‐ – — ︱ ― , , ﹐ 、 ﹑ ; ; ﹔ : : ﹕ ! ! ﹗ ? ? ﹖ . . ﹒ ‥ ︰ … 。 · ' ‘ ’ \" " “ ” 〝 〞 ( ( ﹙ ︵ ) ) ﹚ ︶ [ [ ] ] { { ﹛ ︷ } } ﹜ ︸ 〈 ︿ 〉 ﹀ 《 ︽ 》 ︾ 「 ﹁ 」 ﹂ 『 ﹃ 』 ﹄ 【 ︻ 】 ︼ 〔 ﹝ ︹ 〕 ﹞ ︺ 〖 〗 ‖ § @ @ ﹫ * * ﹡ / / \\ \ ﹨ & & ﹠ # # ﹟ % % ﹪ ‰ ′ ″ ‵ 〃 ※", + 3: "侣 傣 卑 厘 吕 堤 奎 巽 撤 楔 楠 滕 瑚 甫 盲 禄 粟 脚 钯 铂 锑 镑 魁", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "zh-Hans-MO": { + 0: "一 丁 七 万 万 丈 三 上 下 丌 不 与 丑 专 且 世 丘 丘 丙 业 东 丝 丢 两 严 丧 个 中 丰 串 临 丸 丸 丹 为 主 丽 举 乃 久 么 义 之 之 乌 乍 乎 乏 乐 乔 乖 乘 乙 九 也 也 习 乡 书 买 乱 乾 了 予 争 事 二 于 亏 云 互 五 井 亚 些 亡 交 交 亥 亦 产 亨 享 京 亮 亲 人 亿 亿 什 仁 仅 仇 今 介 仍 从 仔 他 付 仙 代 代 令 以 仪 们 仰 仲 件 价 任 份 仿 企 伊 伍 伏 伏 伐 休 众 众 优 伙 会 伟 传 伤 伦 伯 估 伴 伸 似 伽 但 位 位 低 住 佐 佑 体 何 余 佛 作 你 佤 佩 佳 使 例 供 依 侠 侦 侦 侧 侨 侬 侯 侵 便 促 俄 俊 俗 保 信 俩 修 俱 俾 倍 倒 候 倚 借 倦 值 倾 假 偌 偏 做 停 健 偶 偷 储 催 傲 傻 像 僧 儒 儿 允 元 元 兄 充 先 光 克 免 兑 兔 党 入 全 八 八 公 六 兮 兰 共 关 关 兴 兵 其 具 典 兹 养 养 兼 兽 内 冈 册 再 冒 写 军 农 冠 冬 冰 冲 决 况 冷 准 凌 减 凝 几 凡 凤 凭 凯 凰 出 击 函 刀 分 切 刊 刑 划 列 列 刘 则 刚 创 初 判 利 别 到 制 制 刷 券 刺 刻 剂 前 剑 剧 剩 剪 副 割 力 劝 劝 办 功 加 务 劣 动 动 助 努 劫 励 励 劲 劳 势 勇 勉 勋 勒 勤 勾 勿 包 匆 匈 化 北 匙 匹 匹 区 医 十 千 升 午 半 华 协 卒 卓 单 单 卖 南 博 占 占 卡 卢 卫 卯 卯 印 危 即 却 卷 厂 厄 厄 厅 历 厉 压 压 厌 厍 厚 原 去 县 参 又 又 叉 及 友 双 反 发 叔 取 取 受 变 叙 口 口 古 句 另 只 只 叫 召 叭 可 台 史 右 叶 叶 号 司 叹 吃 各 合 合 吉 吊 同 同 名 后 吐 向 吓 吗 君 吝 吟 否 吧 含 听 启 吵 吸 吹 吻 吾 呀 呆 呈 告 呐 员 呜 呢 呦 周 味 呵 呼 命 和 咖 咦 咦 咧 咨 咪 咬 咯 咱 哀 品 哇 哇 哈 哉 响 哎 哟 哥 哦 哩 哪 哭 哲 唉 唐 唤 唬 售 唯 唱 唷 商 啊 啡 啥 啦 啪 喀 喂 善 喇 喊 喏 喔 喜 喝 喵 喷 喻 嗒 嗨 嗯 嘉 嘛 嘴 嘻 嘿 器 四 回 因 团 园 困 围 固 国 图 圆 圈 土 圣 在 圭 地 圳 场 圾 址 均 坎 坐 坑 块 坚 坚 坛 坜 坡 坤 坦 坪 垂 垃 型 垒 埃 埋 城 埔 域 培 基 堂 堆 堕 堡 堪 塑 塔 塞 填 境 增 墨 壁 壤 士 壬 壮 声 处 备 复 夏 夕 外 多 夜 够 夥 大 天 天 太 夫 央 失 头 夷 夷 夸 夹 夺 奇 奇 奈 奉 奋 奏 契 奔 奖 套 奥 女 奴 奶 她 好 如 妇 妈 妖 妙 妥 妨 妮 妹 妻 姆 姊 始 姐 姑 姓 委 姿 威 娃 娄 娘 娜 娟 娱 婆 婚 媒 嫁 嫌 嫩 子 孔 孕 字 字 存 孙 孜 孝 孟 季 孤 学 孩 宁 它 宇 宇 守 安 宋 完 宏 宗 宗 官 宙 定 宛 宜 宝 实 审 审 客 宣 室 宪 害 宴 家 容 宽 宽 宾 宿 寂 寄 寄 寅 密 寇 富 寒 寝 寝 寞 察 寡 寨 寸 对 寻 导 寿 封 射 将 尊 小 少 尔 尖 尘 尚 尝 尤 就 尺 尼 尼 尽 尾 局 局 屁 层 居 屋 屏 展 属 屠 山 岁 岂 岗 岘 岚 岛 岳 岸 峡 峰 崇 崩 崴 川 州 巡 工 工 左 巧 巨 巫 差 己 己 已 巳 巴 巷 币 币 市 布 帅 师 希 帐 帕 帖 帝 带 席 帮 常 帽 幅 幕 干 干 平 年 并 幸 幻 幻 幼 幽 广 庆 床 序 库 库 应 底 店 庙 庚 府 庞 废 度 座 庭 康 庸 廉 廖 延 廷 建 开 异 异 弃 弄 弊 式 引 弗 弘 弟 张 弥 弦 弯 弱 弹 强 归 当 录 彝 形 彩 彬 彭 彰 影 彷 役 彻 彼 往 征 径 待 很 律 後 徐 徒 得 循 微 徵 德 心 必 忆 忌 忍 志 志 忘 忙 忠 忧 快 念 忽 怀 态 怎 怒 怕 怖 思 怡 急 性 怨 怪 总 恋 恐 恢 恨 恩 恭 息 恰 恶 恼 悄 悉 悔 悟 悠 患 您 悲 情 惑 惜 惠 惧 惨 惯 想 惹 愁 愈 愉 意 愚 感 愧 慈 慎 慕 慢 慧 慰 憾 懂 懒 戈 戊 戌 戏 戏 成 我 戒 或 战 截 戴 户 房 房 所 扁 扇 手 才 扎 扑 打 托 扣 执 扩 扫 扫 扬 扭 扮 扯 批 找 找 承 技 抄 把 抑 抓 投 抗 折 抢 护 报 披 抬 抱 抵 抹 抽 担 拆 拉 拍 拒 拔 拖 拘 招 拜 拟 拥 拦 拨 择 括 拳 拷 拼 拾 拿 持 指 按 挑 挖 挝 挡 挤 挥 挪 振 挺 捉 捐 捕 损 捡 换 据 捷 授 掉 掌 排 探 接 控 控 推 掩 措 掸 描 提 插 握 援 搜 搞 搬 搭 摄 摆 摊 摔 摘 摩 摸 撒 撞 播 操 擎 擦 支 收 改 攻 放 政 故 效 敌 敏 救 教 敝 敢 散 敦 敬 数 敲 整 文 斋 斐 斗 料 斜 斥 断 斯 新 方 於 施 旁 旅 旋 族 旗 无 既 日 日 旦 旧 旨 早 旭 时 旺 昂 昆 昌 明 昏 易 星 映 春 昨 昭 是 显 晃 晋 晒 晓 晚 晨 普 景 晴 晶 智 暂 暑 暖 暗 暮 暴 曰 曲 更 曹 曼 曾 曾 替 最 月 有 朋 服 朗 望 朝 期 木 未 未 末 本 札 术 朱 朵 机 杀 杂 权 杉 李 材 村 杜 束 条 来 杨 杯 杰 松 板 极 构 析 林 果 枝 枢 枪 枫 架 柏 某 染 柔 查 柬 柯 柳 柴 标 栋 栏 树 校 样 样 核 根 格 桃 框 案 桌 桑 档 桥 梁 梅 梦 梯 械 梵 检 棉 棋 棒 棚 森 椅 植 椰 楚 楼 概 榜 模 樱 檀 欠 欠 次 欢 欣 欧 欲 欺 款 歉 歌 止 止 正 此 步 武 歪 死 殊 残 段 毅 母 每 毒 比 毕 毛 毫 氏 民 气 氛 水 永 求 汇 汉 汗 汝 江 江 池 污 汤 汪 汶 汽 沃 沈 沉 沙 沟 没 沧 河 油 治 沿 泉 泊 法 泛 泡 泡 波 泣 泥 注 泰 泳 泽 洋 洗 洛 洞 津 洪 洲 活 洽 派 流 浅 测 济 浏 浑 浓 浙 浦 浩 浪 浮 浴 海 涅 消 涉 涛 涨 涯 液 涵 淋 淑 淘 淡 深 混 添 清 渐 渡 渣 温 港 渴 游 湖 湾 源 溜 溪 滋 滑 满 滥 滨 滴 漂 漏 演 漠 漫 潘 潜 潮 澎 澳 激 灌 火 灭 灯 灰 灵 灿 炉 炎 炮 炸 点 烂 烈 烤 烦 烧 热 焦 然 煌 煞 照 煮 熊 熟 燃 燕 爆 爪 爬 爱 爵 爵 父 爷 爸 爽 片 版 牌 牙 牛 牡 牢 牧 物 牲 牵 特 牺 犯 状 犹 狂 狐 狗 狠 独 狮 狱 狼 猛 猜 猪 献 猴 玄 率 玉 王 玛 玩 玫 环 现 玲 玻 珀 珊 珍 珠 班 球 理 琊 琪 琳 琴 琼 瑙 瑜 瑞 瑟 瑰 瑶 璃 瓜 瓦 瓶 甘 甚 甜 生 用 田 田 由 甲 申 电 男 甸 画 畅 界 留 略 番 疆 疏 疑 疗 疯 疲 疼 疾 病 痕 痛 痴 癸 登 白 百 的 皆 皇 皮 盈 益 监 盒 盖 盘 盛 盟 目 直 相 盼 盾 省 眉 看 真 眠 眼 着 睛 睡 督 瞧 矛 矣 知 短 石 矶 码 砂 砍 研 破 础 硕 硬 确 碍 碎 碗 碟 碧 碰 磁 磅 磨 示 礼 社 祖 祚 祝 神 祥 票 祯 祸 禁 禅 福 离 秀 私 秋 种 科 秒 秘 租 秤 秦 秩 积 称 移 稀 程 稍 税 稣 稳 稿 穆 究 穷 穹 空 穿 突 窗 窝 立 站 竞 竞 竟 章 童 端 竹 笑 笔 笛 符 笨 第 等 筋 筑 答 策 筹 签 简 算 管 箭 箱 篇 篮 簿 籍 米 类 粉 粒 粗 粤 粹 精 糊 糕 糖 糟 系 素 索 紧 紫 累 繁 红 约 级 纪 纯 纲 纳 纵 纷 纸 纽 线 练 组 细 细 织 终 绍 经 结 绕 绘 给 络 绝 统 继 绩 绪 续 维 绵 综 绿 缅 缓 编 缘 缠 缩 缴 缶 缸 缺 罐 网 罕 罗 罚 罢 罪 置 署 羊 美 羞 群 羯 羽 翁 翅 翔 翘 翠 翰 翻 翼 耀 老 考 者 而 耍 耐 耗 耳 耶 聊 职 联 聘 聚 聪 肉 肖 肚 股 肤 肥 肩 肯 育 胁 胆 背 胎 胖 胜 胞 胡 胶 胸 能 脆 脑 脱 脸 腊 腐 腓 腰 腹 腾 腿 臂 臣 自 臭 至 致 舌 舍 舒 舞 舟 航 般 舰 船 良 色 艺 艾 节 芒 芝 芦 芬 芭 花 芳 苍 苏 苗 若 苦 英 茂 范 茨 茫 茶 草 荐 荒 荣 药 荷 莉 莎 莪 莫 莱 莲 获 菜 菩 菲 萄 萍 萤 营 萧 萨 落 著 葛 葡 蒂 蒋 蒙 蓉 蓝 蓬 蔑 蔡 薄 薪 藉 藏 藤 虎 虑 虫 虹 虽 虾 蚁 蛇 蛋 蛙 蛮 蜂 蜜 蝶 融 蟹 蠢 血 行 街 衡 衣 补 表 袋 被 袭 裁 裂 装 裕 裤 西 要 覆 见 观 规 视 览 觉 角 解 言 誉 誓 警 计 订 认 讨 让 训 训 议 讯 记 讲 讷 许 论 设 访 证 评 识 诉 词 译 试 诗 诚 话 诞 询 该 详 语 误 说 请 诸 诺 读 课 谁 调 谅 谈 谊 谋 谓 谜 谢 谨 谱 谷 豆 象 豪 貌 贝 贝 贞 负 贡 贡 财 责 贤 败 货 货 质 贩 贪 购 贯 贱 贴 贵 贸 贸 费 贺 贼 贾 资 赋 赌 赏 赐 赔 赖 赚 赛 赞 赠 赢 赤 赫 走 赵 起 趁 超 越 趋 趣 足 跃 跌 跑 距 跟 路 跳 踏 踢 踩 身 躲 车 轨 轩 转 轮 轮 软 轰 轻 载 较 辅 辆 辈 辉 辑 输 辛 辞 辨 辩 辰 辱 边 达 迁 迅 过 迈 迎 运 近 返 还 这 进 进 远 违 连 迟 迦 迪 迫 述 迷 追 退 退 送 适 逃 逆 选 逊 透 逐 递 途 通 逛 逝 速 造 逢 逸 逻 逼 遇 遍 道 遗 遭 遮 遵 避 邀 邓 那 邦 邪 邮 邱 邻 郎 郑 部 郭 都 鄂 酉 酋 配 酒 酷 酸 醉 醒 采 释 里 里 重 野 量 金 针 钓 钟 钢 钦 钱 钻 铁 铃 铜 铢 铭 银 铺 链 销 锁 锅 锋 错 锡 锦 键 锺 镇 镜 镭 长 门 闪 闭 问 闰 闲 间 闷 闹 闻 阁 阅 阐 阔 队 阮 防 防 阳 阴 阵 阶 阻 阿 陀 附 附 际 陆 陈 降 限 院 除 险 陪 陵 陵 陶 陷 隆 随 隐 隔 障 难 雄 雄 雅 集 雉 雨 雪 雯 雳 零 雷 雾 需 震 霍 霖 露 霸 霹 青 靖 静 非 靠 面 革 靼 鞋 鞑 韦 韩 音 页 顶 项 项 顺 须 顽 顽 顾 顿 预 领 颇 频 颗 题 额 风 飘 飙 飞 食 餐 饭 饮 饰 饱 饼 馆 首 香 馨 马 驱 驶 驻 驾 验 骑 骗 骚 骤 骨 高 鬼 魂 魅 魔 鱼 鲁 鲜 鸟 鸡 鸣 鸭 鸿 鹅 鹤 鹰 鹿 麦 麻 黄 黎 黑 默 鼓 鼠 鼻 齐 齿 龄 龙 龟", + 3: "侣 傣 卑 厘 吕 堤 奎 巽 撤 楔 楠 滕 瑚 甫 盲 禄 粟 脚 钯 铂 锑 镑 魁", + 5: "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", + }, + "zh-Hant": { + 0: "一 丁 七 丈 丈 三 上 下 丌 不 丑 且 世 丘 丙 丟 並 中 串 丸 丹 主 乃 久 么 之 乎 乏 乖 乘 乙 九 也 乾 亂 了 予 事 二 于 云 互 五 井 些 亞 亡 交 交 亥 亦 亨 享 京 亮 人 什 仁 仇 今 介 仍 仔 他 付 仙 代 代 令 以 仰 仲 件 任 份 企 伊 伍 伐 休 伙 伯 估 伴 伸 似 伽 但 佈 佉 位 位 低 住 佔 何 余 佛 作 你 佩 佳 使 來 例 供 依 侯 侵 便 係 係 促 俄 俊 俗 保 俠 信 修 俱 俾 個 倍 們 倒 候 倚 借 倫 值 假 偉 偏 做 停 健 側 側 偵 偶 偷 傑 備 傢 傣 傲 傳 傷 傻 傾 僅 像 僑 僧 價 儀 億 儒 儘 優 允 元 元 兄 充 兇 兇 先 光 克 免 兒 兔 入 內 內 全 兩 八 八 公 六 兮 共 兵 兵 其 具 典 兼 冊 再 冒 冠 冬 冰 冷 准 凌 凝 凡 凰 凱 出 函 刀 分 切 刊 列 初 判 別 利 刪 到 制 刷 刺 刻 則 剌 前 剛 剩 剪 副 割 創 劃 劇 劉 劍 力 功 加 助 助 努 劫 勁 勇 勉 勒 動 務 勝 勞 勢 勤 勵 勸 勿 包 匈 化 北 匹 區 十 千 升 午 半 卒 卒 卓 協 南 博 卜 卡 卯 卯 印 危 即 卷 卻 厄 厘 厚 原 厭 厲 去 參 又 及 友 反 叔 取 受 口 口 古 句 另 只 只 叫 召 叭 可 台 史 右 司 吃 各 合 合 吉 吊 同 同 名 后 吐 吐 向 吒 君 吝 吝 吞 吟 吠 否 吧 含 吳 吵 吸 吹 吾 呀 呂 呆 告 呢 周 味 呵 呼 命 和 咖 咦 咧 咪 咬 咱 哀 品 哇 哇 哈 哉 哎 員 哥 哦 哩 哪 哭 哲 唉 唐 唔 唬 售 唯 唱 唷 唸 商 啊 問 啟 啡 啥 啦 啪 喀 喂 善 喇 喊 喔 喜 喝 喬 單 喵 嗎 嗚 嗨 嗯 嘆 嘉 嘗 嘛 嘴 嘻 嘿 器 噴 嚇 嚴 囉 四 回 因 困 固 圈 國 圍 園 圓 圖 團 圜 土 在 圭 地 圾 址 均 坎 坐 坡 坤 坦 坪 垂 垃 型 埃 城 埔 域 執 培 基 堂 堅 堆 堡 堪 報 場 塊 塔 塗 塞 填 塵 境 增 墨 墮 壁 壇 壓 壘 壞 壢 士 壬 壯 壽 夏 夕 外 多 夜 夠 夢 夥 大 天 天 太 夫 央 失 夷 夸 夾 奇 奇 奈 奉 奎 奏 契 奔 套 奧 奪 奮 女 奴 奶 她 好 如 妙 妝 妥 妨 妮 妳 妹 妻 姆 姊 始 姐 姑 姓 委 姿 威 娃 娘 娛 婁 婆 婚 婦 媒 媽 嫌 嫩 子 孔 字 存 孝 孟 季 孤 孩 孫 學 它 宅 宇 宇 守 安 宋 完 宏 宗 宗 官 宙 定 宛 宜 客 客 宣 室 宮 害 家 容 宿 寂 寄 寄 寅 密 富 寒 寞 察 寢 實 實 寧 寨 審 寫 寬 寮 寵 寶 封 射 將 專 尊 尋 對 對 導 小 少 尖 尚 尤 就 尺 尼 尾 局 屁 居 屆 屋 屏 展 屠 層 屬 山 岡 岩 岸 峰 島 峽 崇 崙 崴 嵐 嶺 川 州 巡 工 工 左 巧 巨 巫 差 己 己 已 巳 巴 巷 市 布 希 帕 帖 帛 帝 帥 師 席 帳 帶 常 帽 幅 幕 幣 幫 干 干 平 年 幸 幹 幻 幻 幼 幽 幾 庇 床 序 底 店 庚 府 度 座 庫 庭 康 庸 廉 廖 廠 廢 廣 廳 延 廷 建 弄 式 引 弗 弘 弟 弦 弱 張 強 彈 彊 彌 彎 彝 彞 形 彥 彩 彬 彭 彰 影 役 彼 往 征 待 很 律 後 徐 徐 徑 徒 得 從 復 微 徵 德 徹 心 必 忌 忍 志 志 忘 忙 忠 快 念 忽 怎 怒 怕 怖 思 怡 急 性 怨 怪 恆 恐 恢 恥 恨 恩 恭 息 恰 悅 悉 悔 悟 悠 您 悲 悶 情 惑 惜 惠 惡 惱 想 惹 愁 愈 愉 意 愚 愛 感 慈 態 慕 慘 慢 慣 慧 慮 慰 慶 慾 憂 憐 憑 憲 憶 憾 懂 應 懶 懷 懼 戀 戈 戊 戌 成 成 我 戒 或 截 戰 戲 戴 戶 房 房 所 扁 扇 手 才 扎 打 托 扣 扥 扭 扯 批 找 找 承 技 抄 把 抓 投 抗 折 披 抬 抱 抵 抹 抽 拆 拉 拋 拍 拏 拒 拔 拖 招 拜 括 拳 拼 拾 拿 持 指 按 挑 挖 挪 振 挺 捐 捕 捨 捲 捷 掃 授 掉 掌 排 掛 採 探 接 控 推 措 描 提 插 揚 換 握 揮 援 損 搖 搜 搞 搬 搭 搶 摘 摩 摸 撐 撒 撞 撣 撥 播 撾 撿 擁 擇 擊 擋 操 擎 擔 據 擠 擦 擬 擴 擺 擾 攝 支 收 改 攻 放 政 故 效 敍 敏 救 敗 敗 敘 教 敝 敢 散 敦 敬 整 敵 數 文 斐 斗 料 斯 新 斷 方 於 施 旁 旅 旋 族 旗 既 日 旦 早 旭 旺 昂 昆 昇 昌 明 昏 易 星 映 春 昨 昭 是 時 晉 晒 晚 晨 普 景 晴 晶 智 暑 暖 暗 暫 暴 曆 曉 曰 曲 更 書 曼 曾 曾 替 最 會 月 有 朋 服 朗 望 朝 期 木 未 未 末 本 札 朱 朵 杉 李 材 村 杜 束 杯 杯 杰 東 松 板 析 林 果 枝 架 柏 某 染 柔 查 柬 柯 柳 柴 校 核 根 格 桃 案 桌 桑 梁 梅 條 梨 梯 械 梵 棄 棉 棋 棒 棚 森 椅 植 椰 楊 楓 楚 業 極 概 榜 榮 構 槍 樂 樓 標 樞 模 樣 樹 橋 機 橫 檀 檔 檢 欄 權 次 欣 欲 欺 欽 款 歉 歌 歐 歡 歡 止 正 此 步 武 歲 歷 歸 死 殊 殘 段 殺 殼 毀 毅 母 每 毒 比 毛 毫 氏 民 氣 水 永 求 汗 汝 江 江 池 污 汪 汶 決 汽 沃 沈 沉 沒 沖 沙 河 油 治 沿 況 泉 泊 法 泡 波 泥 注 泰 泳 洋 洗 洛 洞 洩 洪 洲 活 洽 派 流 浦 浩 浪 浮 海 涇 涇 消 涉 涯 液 涵 涼 淑 淚 淡 淨 深 混 淺 清 減 渡 測 港 游 湖 湯 源 準 溝 溪 溫 滄 滅 滋 滑 滴 滾 滿 漂 漏 演 漠 漢 漫 漲 漸 潔 潘 潛 潮 澤 澳 激 濃 濟 濤 濫 濱 瀏 灌 灣 火 灰 災 炎 炮 炸 為 烈 烏 烤 無 焦 然 煙 煞 照 煩 熊 熟 熱 燃 燈 燒 營 爆 爐 爛 爪 爬 爭 爵 父 爸 爺 爽 爾 牆 牆 片 版 牌 牙 牛 牠 牧 物 牲 特 牽 犧 犯 狀 狂 狐 狗 狠 狼 猛 猜 猴 猶 獄 獅 獎 獨 獲 獸 獻 玄 率 玉 王 玩 玫 玲 玻 珊 珍 珠 珥 班 現 球 理 琉 琪 琴 瑙 瑜 瑞 瑟 瑤 瑪 瑰 環 瓜 瓦 瓶 甘 甚 甜 生 產 用 田 田 由 甲 申 男 甸 界 留 畢 略 番 畫 異 當 疆 疏 疑 疼 病 痕 痛 痴 瘋 療 癡 癸 登 登 發 白 百 的 皆 皇 皮 盃 益 盛 盜 盟 盡 監 盤 盧 目 盲 直 相 盼 盾 省 眉 看 真 眠 眼 眾 睛 睡 督 瞧 瞭 矛 矣 知 短 石 砂 砍 研 砲 破 硬 碎 碗 碟 碧 碩 碰 確 碼 磁 磨 磯 礎 礙 示 社 祕 祖 祚 祛 祝 神 祥 票 祿 禁 禍 禍 禎 福 禪 禮 秀 私 秋 科 秒 秘 租 秤 秦 移 稅 程 稍 種 稱 稿 穆 穌 積 穩 究 穹 空 穿 突 窗 窩 窮 窶 立 站 竟 章 童 端 競 竹 笑 笛 符 笨 第 筆 等 筋 答 策 简 算 管 箭 箱 節 範 篇 築 簡 簫 簽 簿 籃 籌 籍 籤 米 粉 粗 粵 精 糊 糕 糟 系 糾 紀 約 紅 納 紐 純 紙 紙 級 紛 素 索 紫 累 細 紹 終 組 結 絕 絡 給 統 絲 經 綜 綠 維 綱 網 緊 緒 線 緣 編 緩 緬 緯 練 縛 縣 縮 縱 總 績 繁 繆 織 繞 繪 繳 繼 續 缸 缺 罕 罪 置 罰 署 罵 罷 羅 羊 美 羞 群 義 羽 翁 習 翔 翰 翹 翻 翼 耀 老 考 者 而 耍 耐 耗 耳 耶 聊 聖 聚 聞 聯 聰 聲 職 聽 肉 肚 股 肥 肩 肯 育 背 胎 胖 胞 胡 胸 能 脆 脫 腓 腔 腦 腰 腳 腿 膽 臉 臘 臣 臥 臨 自 臭 至 致 臺 與 與 興 舉 舊 舌 舍 舒 舞 舟 航 般 船 艦 良 色 艾 芝 芬 花 芳 若 苦 英 茅 茫 茲 茶 草 荒 荷 荼 莉 莊 莎 莫 菜 菩 華 菲 萄 萊 萬 落 葉 著 葛 葡 蒂 蒙 蒲 蒼 蓋 蓮 蔕 蔡 蔣 蕭 薄 薦 薩 薪 藉 藍 藏 藝 藤 藥 蘆 蘇 蘭 虎 處 虛 號 虧 蛇 蛋 蛙 蜂 蜜 蝶 融 螢 蟲 蟹 蠍 蠻 血 行 術 街 衛 衝 衡 衣 表 袋 被 裁 裂 裕 補 裝 裡 製 複 褲 西 要 覆 見 規 視 親 覺 覽 觀 角 解 觸 言 訂 計 訊 討 訓 託 記 訥 訪 設 許 訴 註 証 評 詞 詢 試 詩 話 話 該 詳 誇 誌 認 誓 誕 語 誠 誤 說 誰 課 誼 調 談 請 諒 論 諸 諺 諾 謀 謂 講 謝 證 識 譜 警 譯 議 護 譽 讀 變 讓 讚 谷 豆 豈 豐 象 豪 豬 貌 貓 貝 貞 負 負 財 貢 貨 貪 貪 貫 責 貴 買 費 貼 賀 資 賈 賓 賜 賞 賢 賢 賣 賤 賦 質 賭 賴 賺 購 賽 贈 贊 贏 赤 赫 走 起 超 越 趕 趙 趣 趨 足 跌 跎 跑 距 跟 跡 路 跳 踏 踢 蹟 蹤 躍 身 躲 車 軌 軍 軒 軟 較 載 輔 輕 輛 輝 輩 輪 輯 輸 轉 轟 辛 辦 辨 辭 辯 辯 辰 辱 農 迅 迎 近 返 迦 迪 迫 述 迴 迷 追 退 送 逃 逆 透 逐 途 這 這 通 逛 逝 速 造 逢 連 週 進 逸 逼 遇 遊 運 遍 過 道 道 達 違 遙 遜 遠 適 遭 遮 遲 遷 選 遺 避 避 邀 邁 還 邊 邏 那 邦 邪 邱 郎 部 郭 郵 都 鄂 鄉 鄭 鄰 酉 配 酒 酷 酸 醉 醒 醜 醫 采 釋 釋 里 重 野 量 金 針 釣 鈴 鉢 銀 銅 銖 銘 銳 銷 鋒 鋼 錄 錢 錦 錫 錯 鍋 鍵 鍾 鎊 鎖 鎮 鏡 鐘 鐵 鑑 長 門 閃 閉 開 閏 閒 間 閣 閱 闆 闊 闍 闐 關 闡 防 阻 阿 陀 附 降 限 院 院 陣 除 陪 陰 陳 陵 陵 陶 陷 陸 陽 隆 隊 階 隔 際 障 隨 險 隱 隻 雄 雄 雅 集 雉 雖 雙 雜 雞 離 難 雨 雪 雲 零 雷 電 需 震 霍 霧 露 霸 霹 靂 靈 青 靖 靜 非 靠 面 革 靼 鞋 韃 韋 韓 音 韻 響 頁 頂 項 順 須 預 頑 頓 頗 領 頞 頭 頻 顆 題 額 顏 願 類 顧 顯 風 飄 飛 食 飯 飲 飽 飾 餅 養 餐 餘 館 首 香 馬 駐 駕 駛 騎 騙 騷 驅 驗 驚 骨 體 高 髮 鬆 鬥 鬧 鬱 鬼 魁 魂 魅 魔 魚 魯 鮮 鳥 鳳 鳴 鴻 鵝 鷹 鹿 麗 麥 麵 麻 麼 黃 黎 黑 默 點 黨 鼓 鼠 鼻 齊 齋 齒 齡 龍 龜", + 2: "‾ ﹉ ﹉ ﹊ ﹋ ﹌ _ _ ﹍ ﹍ ﹎ ﹏ ︳ ︴ - - ﹣ ‐ – ︲ — ﹘ ︱ , , ﹐ 、 ﹑ ; ; ﹔ : : ﹕ ! ! ﹗ ? ? ﹖ . . ﹒ ‥ ︰ … 。 · ' ‘ ’ \" " “ ” 〝 〞 ( ( ﹙ ︵ ) ) ﹚ ︶ [ [ ] ] { { ﹛ ︷ } } ﹜ ︸ 〈 ︿ 〉 ﹀ 《 ︽ 》 ︾ 「 ﹁ 」 ﹂ 『 ﹃ 』 ﹄ 【 ︻ 】 ︼ 〔 ﹝ ︹ 〕 ﹞ ︺ § @ @ ﹫ * * ﹡ / / \\ \ ﹨ & & ﹠ # # ﹟ % % ﹪ ‰ † ‡ ‧ ′ ″ ‵ 〃 ※", + 3: "伏 侶 兌 兹 别 勳 卑 占 叶 堤 墎 奥 孜 峇 巽 彝 楔 渾 燦 狄 琳 瑚 甫 礁 芒 苗 茨 蚩 蜀 隴", + 5: "一 丁 丈 不 且 丞 並 串 乘 乾 亂 亭 傀 僎 僵 儐 償 儳 儷 儻 叢 嚴 囌 囑 廳", + }, + "zh-Hant-HK": { + 0: "一 丁 七 丈 丈 三 上 下 丌 不 丑 且 世 丘 丙 丟 並 中 串 丸 丹 主 乃 久 么 之 乎 乏 乖 乘 乙 九 也 乾 亂 了 予 事 二 于 云 互 五 井 些 亞 亡 交 交 亥 亦 亨 享 京 亮 人 什 仁 仇 今 介 仍 仔 他 付 仙 代 代 令 以 仰 仲 件 任 份 企 伊 伍 伐 休 伙 伯 估 伴 伸 似 伽 但 佈 佉 位 位 低 住 佔 何 余 佛 作 你 佩 佳 使 來 例 供 依 侯 侵 便 係 係 促 俄 俊 俗 保 俠 信 修 俱 俾 個 倍 們 倒 候 倚 借 倫 值 假 偉 偏 做 停 健 側 側 偵 偶 偷 傑 備 傢 傣 傲 傳 傷 傻 傾 僅 像 僑 僧 價 儀 億 儒 儘 優 允 元 元 兄 充 兇 兇 先 光 克 免 兒 兔 入 內 內 全 兩 八 八 公 六 兮 共 兵 兵 其 具 典 兼 冊 再 冒 冠 冬 冰 冷 准 凌 凝 凡 凰 凱 出 函 刀 分 切 刊 列 初 判 別 利 刪 到 制 刷 刺 刻 則 剌 前 剛 剩 剪 副 割 創 劃 劇 劉 劍 力 功 加 助 助 努 劫 勁 勇 勉 勒 動 務 勝 勞 勢 勤 勵 勸 勿 包 匈 化 北 匹 區 十 千 升 午 半 卒 卒 卓 協 南 博 卜 卡 卯 卯 印 危 即 卷 卻 厄 厘 厚 原 厭 厲 去 參 又 及 友 反 叔 取 受 口 口 古 句 另 只 只 叫 召 叭 可 台 史 右 司 吃 各 合 合 吉 吊 同 同 名 后 吐 吐 向 吒 君 吝 吝 吞 吟 吠 否 吧 含 吳 吵 吸 吹 吾 呀 呂 呆 告 呢 周 味 呵 呼 命 和 咖 咦 咧 咪 咬 咱 哀 品 哇 哇 哈 哉 哎 員 哥 哦 哩 哪 哭 哲 唉 唐 唔 唬 售 唯 唱 唷 唸 商 啊 問 啟 啡 啥 啦 啪 喀 喂 善 喇 喊 喔 喜 喝 喬 單 喵 嗎 嗚 嗨 嗯 嘆 嘉 嘗 嘛 嘴 嘻 嘿 器 噴 嚇 嚴 囉 四 回 因 困 固 圈 國 圍 園 圓 圖 團 圜 土 在 圭 地 圾 址 均 坎 坐 坡 坤 坦 坪 垂 垃 型 埃 城 埔 域 執 培 基 堂 堅 堆 堡 堪 報 場 塊 塔 塗 塞 填 塵 境 增 墨 墮 壁 壇 壓 壘 壞 壢 士 壬 壯 壽 夏 夕 外 多 夜 夠 夢 夥 大 天 天 太 夫 央 失 夷 夸 夾 奇 奇 奈 奉 奎 奏 契 奔 套 奧 奪 奮 女 奴 奶 她 好 如 妙 妝 妥 妨 妮 妳 妹 妻 姆 姊 始 姐 姑 姓 委 姿 威 娃 娘 娛 婁 婆 婚 婦 媒 媽 嫌 嫩 子 孔 字 存 孝 孟 季 孤 孩 孫 學 它 宅 宇 宇 守 安 宋 完 宏 宗 宗 官 宙 定 宛 宜 客 客 宣 室 宮 害 家 容 宿 寂 寄 寄 寅 密 富 寒 寞 察 寢 實 實 寧 寨 審 寫 寬 寮 寵 寶 封 射 將 專 尊 尋 對 對 導 小 少 尖 尚 尤 就 尺 尼 尾 局 屁 居 屆 屋 屏 展 屠 層 屬 山 岡 岩 岸 峰 島 峽 崇 崙 崴 嵐 嶺 川 州 巡 工 工 左 巧 巨 巫 差 己 己 已 巳 巴 巷 市 布 希 帕 帖 帛 帝 帥 師 席 帳 帶 常 帽 幅 幕 幣 幫 干 干 平 年 幸 幹 幻 幻 幼 幽 幾 庇 床 序 底 店 庚 府 度 座 庫 庭 康 庸 廉 廖 廠 廢 廣 廳 延 廷 建 弄 式 引 弗 弘 弟 弦 弱 張 強 彈 彊 彌 彎 彝 彞 形 彥 彩 彬 彭 彰 影 役 彼 往 征 待 很 律 後 徐 徐 徑 徒 得 從 復 微 徵 德 徹 心 必 忌 忍 志 志 忘 忙 忠 快 念 忽 怎 怒 怕 怖 思 怡 急 性 怨 怪 恆 恐 恢 恥 恨 恩 恭 息 恰 悅 悉 悔 悟 悠 您 悲 悶 情 惑 惜 惠 惡 惱 想 惹 愁 愈 愉 意 愚 愛 感 慈 態 慕 慘 慢 慣 慧 慮 慰 慶 慾 憂 憐 憑 憲 憶 憾 懂 應 懶 懷 懼 戀 戈 戊 戌 成 成 我 戒 或 截 戰 戲 戴 戶 房 房 所 扁 扇 手 才 扎 打 托 扣 扥 扭 扯 批 找 找 承 技 抄 把 抓 投 抗 折 披 抬 抱 抵 抹 抽 拆 拉 拋 拍 拏 拒 拔 拖 招 拜 括 拳 拼 拾 拿 持 指 按 挑 挖 挪 振 挺 捐 捕 捨 捲 捷 掃 授 掉 掌 排 掛 採 探 接 控 推 措 描 提 插 揚 換 握 揮 援 損 搖 搜 搞 搬 搭 搶 摘 摩 摸 撐 撒 撞 撣 撥 播 撾 撿 擁 擇 擊 擋 操 擎 擔 據 擠 擦 擬 擴 擺 擾 攝 支 收 改 攻 放 政 故 效 敍 敏 救 敗 敗 敘 教 敝 敢 散 敦 敬 整 敵 數 文 斐 斗 料 斯 新 斷 方 於 施 旁 旅 旋 族 旗 既 日 旦 早 旭 旺 昂 昆 昇 昌 明 昏 易 星 映 春 昨 昭 是 時 晉 晒 晚 晨 普 景 晴 晶 智 暑 暖 暗 暫 暴 曆 曉 曰 曲 更 書 曼 曾 曾 替 最 會 月 有 朋 服 朗 望 朝 期 木 未 未 末 本 札 朱 朵 杉 李 材 村 杜 束 杯 杯 杰 東 松 板 析 林 果 枝 架 柏 某 染 柔 查 柬 柯 柳 柴 校 核 根 格 桃 案 桌 桑 梁 梅 條 梨 梯 械 梵 棄 棉 棋 棒 棚 森 椅 植 椰 楊 楓 楚 業 極 概 榜 榮 構 槍 樂 樓 標 樞 模 樣 樹 橋 機 橫 檀 檔 檢 欄 權 次 欣 欲 欺 欽 款 歉 歌 歐 歡 歡 止 正 此 步 武 歲 歷 歸 死 殊 殘 段 殺 殼 毀 毅 母 每 毒 比 毛 毫 氏 民 氣 水 永 求 汗 汝 江 江 池 污 汪 汶 決 汽 沃 沈 沉 沒 沖 沙 河 油 治 沿 況 泉 泊 法 泡 波 泥 注 泰 泳 洋 洗 洛 洞 洩 洪 洲 活 洽 派 流 浦 浩 浪 浮 海 涇 涇 消 涉 涯 液 涵 涼 淑 淚 淡 淨 深 混 淺 清 減 渡 測 港 游 湖 湯 源 準 溝 溪 溫 滄 滅 滋 滑 滴 滾 滿 漂 漏 演 漠 漢 漫 漲 漸 潔 潘 潛 潮 澤 澳 激 濃 濟 濤 濫 濱 瀏 灌 灣 火 灰 災 炎 炮 炸 為 烈 烏 烤 無 焦 然 煙 煞 照 煩 熊 熟 熱 燃 燈 燒 營 爆 爐 爛 爪 爬 爭 爵 父 爸 爺 爽 爾 牆 牆 片 版 牌 牙 牛 牠 牧 物 牲 特 牽 犧 犯 狀 狂 狐 狗 狠 狼 猛 猜 猴 猶 獄 獅 獎 獨 獲 獸 獻 玄 率 玉 王 玩 玫 玲 玻 珊 珍 珠 珥 班 現 球 理 琉 琪 琴 瑙 瑜 瑞 瑟 瑤 瑪 瑰 環 瓜 瓦 瓶 甘 甚 甜 生 產 用 田 田 由 甲 申 男 甸 界 留 畢 略 番 畫 異 當 疆 疏 疑 疼 病 痕 痛 痴 瘋 療 癡 癸 登 登 發 白 百 的 皆 皇 皮 盃 益 盛 盜 盟 盡 監 盤 盧 目 盲 直 相 盼 盾 省 眉 看 真 眠 眼 眾 睛 睡 督 瞧 瞭 矛 矣 知 短 石 砂 砍 研 砲 破 硬 碎 碗 碟 碧 碩 碰 確 碼 磁 磨 磯 礎 礙 示 社 祕 祖 祚 祛 祝 神 祥 票 祿 禁 禍 禍 禎 福 禪 禮 秀 私 秋 科 秒 秘 租 秤 秦 移 稅 程 稍 種 稱 稿 穆 穌 積 穩 究 穹 空 穿 突 窗 窩 窮 窶 立 站 竟 章 童 端 競 竹 笑 笛 符 笨 第 筆 等 筋 答 策 简 算 管 箭 箱 節 範 篇 築 簡 簫 簽 簿 籃 籌 籍 籤 米 粉 粗 粵 精 糊 糕 糟 系 糾 紀 約 紅 納 紐 純 紙 紙 級 紛 素 索 紫 累 細 紹 終 組 結 絕 絡 給 統 絲 經 綜 綠 維 綱 網 緊 緒 線 緣 編 緩 緬 緯 練 縛 縣 縮 縱 總 績 繁 繆 織 繞 繪 繳 繼 續 缸 缺 罕 罪 置 罰 署 罵 罷 羅 羊 美 羞 群 義 羽 翁 習 翔 翰 翹 翻 翼 耀 老 考 者 而 耍 耐 耗 耳 耶 聊 聖 聚 聞 聯 聰 聲 職 聽 肉 肚 股 肥 肩 肯 育 背 胎 胖 胞 胡 胸 能 脆 脫 腓 腔 腦 腰 腳 腿 膽 臉 臘 臣 臥 臨 自 臭 至 致 臺 與 與 興 舉 舊 舌 舍 舒 舞 舟 航 般 船 艦 良 色 艾 芝 芬 花 芳 若 苦 英 茅 茫 茲 茶 草 荒 荷 荼 莉 莊 莎 莫 菜 菩 華 菲 萄 萊 萬 落 葉 著 葛 葡 蒂 蒙 蒲 蒼 蓋 蓮 蔕 蔡 蔣 蕭 薄 薦 薩 薪 藉 藍 藏 藝 藤 藥 蘆 蘇 蘭 虎 處 虛 號 虧 蛇 蛋 蛙 蜂 蜜 蝶 融 螢 蟲 蟹 蠍 蠻 血 行 術 街 衛 衝 衡 衣 表 袋 被 裁 裂 裕 補 裝 裡 製 複 褲 西 要 覆 見 規 視 親 覺 覽 觀 角 解 觸 言 訂 計 訊 討 訓 託 記 訥 訪 設 許 訴 註 証 評 詞 詢 試 詩 話 話 該 詳 誇 誌 認 誓 誕 語 誠 誤 說 誰 課 誼 調 談 請 諒 論 諸 諺 諾 謀 謂 講 謝 證 識 譜 警 譯 議 護 譽 讀 變 讓 讚 谷 豆 豈 豐 象 豪 豬 貌 貓 貝 貞 負 負 財 貢 貨 貪 貪 貫 責 貴 買 費 貼 賀 資 賈 賓 賜 賞 賢 賢 賣 賤 賦 質 賭 賴 賺 購 賽 贈 贊 贏 赤 赫 走 起 超 越 趕 趙 趣 趨 足 跌 跎 跑 距 跟 跡 路 跳 踏 踢 蹟 蹤 躍 身 躲 車 軌 軍 軒 軟 較 載 輔 輕 輛 輝 輩 輪 輯 輸 轉 轟 辛 辦 辨 辭 辯 辯 辰 辱 農 迅 迎 近 返 迦 迪 迫 述 迴 迷 追 退 送 逃 逆 透 逐 途 這 這 通 逛 逝 速 造 逢 連 週 進 逸 逼 遇 遊 運 遍 過 道 道 達 違 遙 遜 遠 適 遭 遮 遲 遷 選 遺 避 避 邀 邁 還 邊 邏 那 邦 邪 邱 郎 部 郭 郵 都 鄂 鄉 鄭 鄰 酉 配 酒 酷 酸 醉 醒 醜 醫 采 釋 釋 里 重 野 量 金 針 釣 鈴 鉢 銀 銅 銖 銘 銳 銷 鋒 鋼 錄 錢 錦 錫 錯 鍋 鍵 鍾 鎊 鎖 鎮 鏡 鐘 鐵 鑑 長 門 閃 閉 開 閏 閒 間 閣 閱 闆 闊 闍 闐 關 闡 防 阻 阿 陀 附 降 限 院 院 陣 除 陪 陰 陳 陵 陵 陶 陷 陸 陽 隆 隊 階 隔 際 障 隨 險 隱 隻 雄 雄 雅 集 雉 雖 雙 雜 雞 離 難 雨 雪 雲 零 雷 電 需 震 霍 霧 露 霸 霹 靂 靈 青 靖 靜 非 靠 面 革 靼 鞋 韃 韋 韓 音 韻 響 頁 頂 項 順 須 預 頑 頓 頗 領 頞 頭 頻 顆 題 額 顏 願 類 顧 顯 風 飄 飛 食 飯 飲 飽 飾 餅 養 餐 餘 館 首 香 馬 駐 駕 駛 騎 騙 騷 驅 驗 驚 骨 體 高 髮 鬆 鬥 鬧 鬱 鬼 魁 魂 魅 魔 魚 魯 鮮 鳥 鳳 鳴 鴻 鵝 鷹 鹿 麗 麥 麵 麻 麼 黃 黎 黑 默 點 黨 鼓 鼠 鼻 齊 齋 齒 齡 龍 龜", + 2: "‾ ﹉ ﹉ ﹊ ﹋ ﹌ _ _ ﹍ ﹍ ﹎ ﹏ ︳ ︴ - - ﹣ ‐ – ︲ — ﹘ ︱ , , ﹐ 、 ﹑ ; ; ﹔ : : ﹕ ! ! ﹗ ? ? ﹖ . . ﹒ ‥ ︰ … 。 · ' ‘ ’ \" " “ ” 〝 〞 ( ( ﹙ ︵ ) ) ﹚ ︶ [ [ ] ] { { ﹛ ︷ } } ﹜ ︸ 〈 ︿ 〉 ﹀ 《 ︽ 》 ︾ 「 ﹁ 」 ﹂ 『 ﹃ 』 ﹄ 【 ︻ 】 ︼ 〔 ﹝ ︹ 〕 ﹞ ︺ § @ @ ﹫ * * ﹡ / / \\ \ ﹨ & & ﹠ # # ﹟ % % ﹪ ‰ † ‡ ‧ ′ ″ ‵ 〃 ※", + 3: "伏 侶 兌 兹 别 勳 卑 占 叶 堤 墎 奥 孜 峇 巽 彝 楔 渾 燦 狄 琳 瑚 甫 礁 芒 苗 茨 蚩 蜀 隴", + 5: "一 丁 丈 不 且 丞 並 串 乘 乾 亂 亭 傀 僎 僵 儐 償 儳 儷 儻 叢 嚴 囌 囑 廳", + }, + "zu": { + 0: "a b bh c ch d dl dy e f g gc gq gx h hh hl i j k kh kl kp l m n nc ngc ngq ngx nhl nk nkc nkq nkx nq ntsh nx ny o p ph q qh r rh s sh t th tl ts tsh u v w x xh y z", + 2: "- , ; : ! ? . ( ) [ ] { }", + 3: "á à ă â å ä ã ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ö ø ō œ ú ù ŭ û ü ū ÿ", + }, +} diff --git a/vendor/golang.org/x/text/collate/tools/colcmp/col.go b/vendor/golang.org/x/text/collate/tools/colcmp/col.go new file mode 100644 index 0000000000..dc22d2eef9 --- /dev/null +++ b/vendor/golang.org/x/text/collate/tools/colcmp/col.go @@ -0,0 +1,97 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "log" + "unicode/utf16" + + "golang.org/x/text/collate" + "golang.org/x/text/language" +) + +// Input holds an input string in both UTF-8 and UTF-16 format. +type Input struct { + index int // used for restoring to original random order + UTF8 []byte + UTF16 []uint16 + key []byte // used for sorting +} + +func (i Input) String() string { + return string(i.UTF8) +} + +func makeInput(s8 []byte, s16 []uint16) Input { + return Input{UTF8: s8, UTF16: s16} +} + +func makeInputString(s string) Input { + return Input{ + UTF8: []byte(s), + UTF16: utf16.Encode([]rune(s)), + } +} + +// Collator is an interface for architecture-specific implementations of collation. +type Collator interface { + // Key generates a sort key for the given input. Implemenations + // may return nil if a collator does not support sort keys. + Key(s Input) []byte + + // Compare returns -1 if a < b, 1 if a > b and 0 if a == b. + Compare(a, b Input) int +} + +// CollatorFactory creates a Collator for a given language tag. +type CollatorFactory struct { + name string + makeFn func(tag string) (Collator, error) + description string +} + +var collators = []CollatorFactory{} + +// AddFactory registers f as a factory for an implementation of Collator. +func AddFactory(f CollatorFactory) { + collators = append(collators, f) +} + +func getCollator(name, locale string) Collator { + for _, f := range collators { + if f.name == name { + col, err := f.makeFn(locale) + if err != nil { + log.Fatal(err) + } + return col + } + } + log.Fatalf("collator of type %q not found", name) + return nil +} + +// goCollator is an implemention of Collator using go's own collator. +type goCollator struct { + c *collate.Collator + buf collate.Buffer +} + +func init() { + AddFactory(CollatorFactory{"go", newGoCollator, "Go's native collator implementation."}) +} + +func newGoCollator(loc string) (Collator, error) { + c := &goCollator{c: collate.New(language.Make(loc))} + return c, nil +} + +func (c *goCollator) Key(b Input) []byte { + return c.c.Key(&c.buf, b.UTF8) +} + +func (c *goCollator) Compare(a, b Input) int { + return c.c.Compare(a.UTF8, b.UTF8) +} diff --git a/vendor/golang.org/x/text/collate/tools/colcmp/colcmp.go b/vendor/golang.org/x/text/collate/tools/colcmp/colcmp.go new file mode 100644 index 0000000000..6dda8bc072 --- /dev/null +++ b/vendor/golang.org/x/text/collate/tools/colcmp/colcmp.go @@ -0,0 +1,529 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main // import "golang.org/x/text/collate/tools/colcmp" + +import ( + "bytes" + "flag" + "fmt" + "io" + "log" + "os" + "runtime/pprof" + "sort" + "strconv" + "strings" + "text/template" + "time" + + "golang.org/x/text/unicode/norm" +) + +var ( + doNorm = flag.Bool("norm", false, "normalize input strings") + cases = flag.Bool("case", false, "generate case variants") + verbose = flag.Bool("verbose", false, "print results") + debug = flag.Bool("debug", false, "output debug information") + locales = flag.String("locale", "en_US", "the locale to use. May be a comma-separated list for some commands.") + col = flag.String("col", "go", "collator to test") + gold = flag.String("gold", "go", "collator used as the gold standard") + usecmp = flag.Bool("usecmp", false, + `use comparison instead of sort keys when sorting. Must be "test", "gold" or "both"`) + cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file") + exclude = flag.String("exclude", "", "exclude errors that contain any of the characters") + limit = flag.Int("limit", 5000000, "maximum number of samples to generate for one run") +) + +func failOnError(err error) { + if err != nil { + log.Panic(err) + } +} + +// Test holds test data for testing a locale-collator pair. +// Test also provides functionality that is commonly used by the various commands. +type Test struct { + ctxt *Context + Name string + Locale string + ColName string + + Col Collator + UseCompare bool + + Input []Input + Duration time.Duration + + start time.Time + msg string + count int +} + +func (t *Test) clear() { + t.Col = nil + t.Input = nil +} + +const ( + msgGeneratingInput = "generating input" + msgGeneratingKeys = "generating keys" + msgSorting = "sorting" +) + +var lastLen = 0 + +func (t *Test) SetStatus(msg string) { + if *debug || *verbose { + fmt.Printf("%s: %s...\n", t.Name, msg) + } else if t.ctxt.out != nil { + fmt.Fprint(t.ctxt.out, strings.Repeat(" ", lastLen)) + fmt.Fprint(t.ctxt.out, strings.Repeat("\b", lastLen)) + fmt.Fprint(t.ctxt.out, msg, "...") + lastLen = len(msg) + 3 + fmt.Fprint(t.ctxt.out, strings.Repeat("\b", lastLen)) + } +} + +// Start is used by commands to signal the start of an operation. +func (t *Test) Start(msg string) { + t.SetStatus(msg) + t.count = 0 + t.msg = msg + t.start = time.Now() +} + +// Stop is used by commands to signal the end of an operation. +func (t *Test) Stop() (time.Duration, int) { + d := time.Now().Sub(t.start) + t.Duration += d + if *debug || *verbose { + fmt.Printf("%s: %s done. (%.3fs /%dK ops)\n", t.Name, t.msg, d.Seconds(), t.count/1000) + } + return d, t.count +} + +// generateKeys generates sort keys for all the inputs. +func (t *Test) generateKeys() { + for i, s := range t.Input { + b := t.Col.Key(s) + t.Input[i].key = b + if *debug { + fmt.Printf("%s (%X): %X\n", string(s.UTF8), s.UTF16, b) + } + } +} + +// Sort sorts the inputs. It generates sort keys if this is required by the +// chosen sort method. +func (t *Test) Sort() (tkey, tsort time.Duration, nkey, nsort int) { + if *cpuprofile != "" { + f, err := os.Create(*cpuprofile) + failOnError(err) + pprof.StartCPUProfile(f) + defer pprof.StopCPUProfile() + } + if t.UseCompare || t.Col.Key(t.Input[0]) == nil { + t.Start(msgSorting) + sort.Sort(&testCompare{*t}) + tsort, nsort = t.Stop() + } else { + t.Start(msgGeneratingKeys) + t.generateKeys() + t.count = len(t.Input) + tkey, nkey = t.Stop() + t.Start(msgSorting) + sort.Sort(t) + tsort, nsort = t.Stop() + } + return +} + +func (t *Test) Swap(a, b int) { + t.Input[a], t.Input[b] = t.Input[b], t.Input[a] +} + +func (t *Test) Less(a, b int) bool { + t.count++ + return bytes.Compare(t.Input[a].key, t.Input[b].key) == -1 +} + +func (t Test) Len() int { + return len(t.Input) +} + +type testCompare struct { + Test +} + +func (t *testCompare) Less(a, b int) bool { + t.count++ + return t.Col.Compare(t.Input[a], t.Input[b]) == -1 +} + +type testRestore struct { + Test +} + +func (t *testRestore) Less(a, b int) bool { + return t.Input[a].index < t.Input[b].index +} + +// GenerateInput generates input phrases for the locale tested by t. +func (t *Test) GenerateInput() { + t.Input = nil + if t.ctxt.lastLocale != t.Locale { + gen := phraseGenerator{} + gen.init(t.Locale) + t.SetStatus(msgGeneratingInput) + t.ctxt.lastInput = nil // allow the previous value to be garbage collected. + t.Input = gen.generate(*doNorm) + t.ctxt.lastInput = t.Input + t.ctxt.lastLocale = t.Locale + } else { + t.Input = t.ctxt.lastInput + for i := range t.Input { + t.Input[i].key = nil + } + sort.Sort(&testRestore{*t}) + } +} + +// Context holds all tests and settings translated from command line options. +type Context struct { + test []*Test + last *Test + + lastLocale string + lastInput []Input + + out io.Writer +} + +func (ts *Context) Printf(format string, a ...interface{}) { + ts.assertBuf() + fmt.Fprintf(ts.out, format, a...) +} + +func (ts *Context) Print(a ...interface{}) { + ts.assertBuf() + fmt.Fprint(ts.out, a...) +} + +// assertBuf sets up an io.Writer for ouput, if it doesn't already exist. +// In debug and verbose mode, output is buffered so that the regular output +// will not interfere with the additional output. Otherwise, output is +// written directly to stdout for a more responsive feel. +func (ts *Context) assertBuf() { + if ts.out != nil { + return + } + if *debug || *verbose { + ts.out = &bytes.Buffer{} + } else { + ts.out = os.Stdout + } +} + +// flush flushes the contents of ts.out to stdout, if it is not stdout already. +func (ts *Context) flush() { + if ts.out != nil { + if _, ok := ts.out.(io.ReadCloser); !ok { + io.Copy(os.Stdout, ts.out.(io.Reader)) + } + } +} + +// parseTests creates all tests from command lines and returns +// a Context to hold them. +func parseTests() *Context { + ctxt := &Context{} + colls := strings.Split(*col, ",") + for _, loc := range strings.Split(*locales, ",") { + loc = strings.TrimSpace(loc) + for _, name := range colls { + name = strings.TrimSpace(name) + col := getCollator(name, loc) + ctxt.test = append(ctxt.test, &Test{ + ctxt: ctxt, + Locale: loc, + ColName: name, + UseCompare: *usecmp, + Col: col, + }) + } + } + return ctxt +} + +func (c *Context) Len() int { + return len(c.test) +} + +func (c *Context) Test(i int) *Test { + if c.last != nil { + c.last.clear() + } + c.last = c.test[i] + return c.last +} + +func parseInput(args []string) []Input { + input := []Input{} + for _, s := range args { + rs := []rune{} + for len(s) > 0 { + var r rune + r, _, s, _ = strconv.UnquoteChar(s, '\'') + rs = append(rs, r) + } + s = string(rs) + if *doNorm { + s = norm.NFD.String(s) + } + input = append(input, makeInputString(s)) + } + return input +} + +// A Command is an implementation of a colcmp command. +type Command struct { + Run func(cmd *Context, args []string) + Usage string + Short string + Long string +} + +func (cmd Command) Name() string { + return strings.SplitN(cmd.Usage, " ", 2)[0] +} + +var commands = []*Command{ + cmdSort, + cmdBench, + cmdRegress, +} + +const sortHelp = ` +Sort sorts a given list of strings. Strings are separated by whitespace. +` + +var cmdSort = &Command{ + Run: runSort, + Usage: "sort <string>*", + Short: "sort a given list of strings", + Long: sortHelp, +} + +func runSort(ctxt *Context, args []string) { + input := parseInput(args) + if len(input) == 0 { + log.Fatalf("Nothing to sort.") + } + if ctxt.Len() > 1 { + ctxt.Print("COLL LOCALE RESULT\n") + } + for i := 0; i < ctxt.Len(); i++ { + t := ctxt.Test(i) + t.Input = append(t.Input, input...) + t.Sort() + if ctxt.Len() > 1 { + ctxt.Printf("%-5s %-5s ", t.ColName, t.Locale) + } + for _, s := range t.Input { + ctxt.Print(string(s.UTF8), " ") + } + ctxt.Print("\n") + } +} + +const benchHelp = ` +Bench runs a benchmark for the given list of collator implementations. +If no collator implementations are given, the go collator will be used. +` + +var cmdBench = &Command{ + Run: runBench, + Usage: "bench", + Short: "benchmark a given list of collator implementations", + Long: benchHelp, +} + +func runBench(ctxt *Context, args []string) { + ctxt.Printf("%-7s %-5s %-6s %-24s %-24s %-5s %s\n", "LOCALE", "COLL", "N", "KEYS", "SORT", "AVGLN", "TOTAL") + for i := 0; i < ctxt.Len(); i++ { + t := ctxt.Test(i) + ctxt.Printf("%-7s %-5s ", t.Locale, t.ColName) + t.GenerateInput() + ctxt.Printf("%-6s ", fmt.Sprintf("%dK", t.Len()/1000)) + tkey, tsort, nkey, nsort := t.Sort() + p := func(dur time.Duration, n int) { + s := "" + if dur > 0 { + s = fmt.Sprintf("%6.3fs ", dur.Seconds()) + if n > 0 { + s += fmt.Sprintf("%15s", fmt.Sprintf("(%4.2f ns/op)", float64(dur)/float64(n))) + } + } + ctxt.Printf("%-24s ", s) + } + p(tkey, nkey) + p(tsort, nsort) + + total := 0 + for _, s := range t.Input { + total += len(s.key) + } + ctxt.Printf("%-5d ", total/t.Len()) + ctxt.Printf("%6.3fs\n", t.Duration.Seconds()) + if *debug { + for _, s := range t.Input { + fmt.Print(string(s.UTF8), " ") + } + fmt.Println() + } + } +} + +const regressHelp = ` +Regress runs a monkey test by comparing the results of randomly generated tests +between two implementations of a collator. The user may optionally pass a list +of strings to regress against instead of the default test set. +` + +var cmdRegress = &Command{ + Run: runRegress, + Usage: "regress -gold=<col> -test=<col> [string]*", + Short: "run a monkey test between two collators", + Long: regressHelp, +} + +const failedKeyCompare = ` +%s:%d: incorrect comparison result for input: + a: %q (%.4X) + key: %s + b: %q (%.4X) + key: %s + Compare(a, b) = %d; want %d. + + gold keys: + a: %s + b: %s +` + +const failedCompare = ` +%s:%d: incorrect comparison result for input: + a: %q (%.4X) + b: %q (%.4X) + Compare(a, b) = %d; want %d. +` + +func keyStr(b []byte) string { + buf := &bytes.Buffer{} + for _, v := range b { + fmt.Fprintf(buf, "%.2X ", v) + } + return buf.String() +} + +func runRegress(ctxt *Context, args []string) { + input := parseInput(args) + for i := 0; i < ctxt.Len(); i++ { + t := ctxt.Test(i) + if len(input) > 0 { + t.Input = append(t.Input, input...) + } else { + t.GenerateInput() + } + t.Sort() + count := 0 + gold := getCollator(*gold, t.Locale) + for i := 1; i < len(t.Input); i++ { + ia := t.Input[i-1] + ib := t.Input[i] + if bytes.IndexAny(ib.UTF8, *exclude) != -1 { + i++ + continue + } + if bytes.IndexAny(ia.UTF8, *exclude) != -1 { + continue + } + goldCmp := gold.Compare(ia, ib) + if cmp := bytes.Compare(ia.key, ib.key); cmp != goldCmp { + count++ + a := string(ia.UTF8) + b := string(ib.UTF8) + fmt.Printf(failedKeyCompare, t.Locale, i-1, a, []rune(a), keyStr(ia.key), b, []rune(b), keyStr(ib.key), cmp, goldCmp, keyStr(gold.Key(ia)), keyStr(gold.Key(ib))) + } else if cmp := t.Col.Compare(ia, ib); cmp != goldCmp { + count++ + a := string(ia.UTF8) + b := string(ib.UTF8) + fmt.Printf(failedCompare, t.Locale, i-1, a, []rune(a), b, []rune(b), cmp, goldCmp) + } + } + if count > 0 { + ctxt.Printf("Found %d inconsistencies in %d entries.\n", count, t.Len()-1) + } + } +} + +const helpTemplate = ` +colcmp is a tool for testing and benchmarking collation + +Usage: colcmp command [arguments] + +The commands are: +{{range .}} + {{.Name | printf "%-11s"}} {{.Short}}{{end}} + +Use "col help [topic]" for more information about that topic. +` + +const detailedHelpTemplate = ` +Usage: colcmp {{.Usage}} + +{{.Long | trim}} +` + +func runHelp(args []string) { + t := template.New("help") + t.Funcs(template.FuncMap{"trim": strings.TrimSpace}) + if len(args) < 1 { + template.Must(t.Parse(helpTemplate)) + failOnError(t.Execute(os.Stderr, &commands)) + } else { + for _, cmd := range commands { + if cmd.Name() == args[0] { + template.Must(t.Parse(detailedHelpTemplate)) + failOnError(t.Execute(os.Stderr, cmd)) + os.Exit(0) + } + } + log.Fatalf("Unknown command %q. Run 'colcmp help'.", args[0]) + } + os.Exit(0) +} + +func main() { + flag.Parse() + log.SetFlags(0) + + ctxt := parseTests() + + if flag.NArg() < 1 { + runHelp(nil) + } + args := flag.Args()[1:] + if flag.Arg(0) == "help" { + runHelp(args) + } + for _, cmd := range commands { + if cmd.Name() == flag.Arg(0) { + cmd.Run(ctxt, args) + ctxt.flush() + return + } + } + runHelp(flag.Args()) +} diff --git a/vendor/golang.org/x/text/collate/tools/colcmp/darwin.go b/vendor/golang.org/x/text/collate/tools/colcmp/darwin.go new file mode 100644 index 0000000000..c2c31d5cb4 --- /dev/null +++ b/vendor/golang.org/x/text/collate/tools/colcmp/darwin.go @@ -0,0 +1,111 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin + +package main + +/* +#cgo LDFLAGS: -framework CoreFoundation +#include <CoreFoundation/CFBase.h> +#include <CoreFoundation/CoreFoundation.h> +*/ +import "C" +import ( + "unsafe" +) + +func init() { + AddFactory(CollatorFactory{"osx", newOSX16Collator, + "OS X/Darwin collator, using native strings."}) + AddFactory(CollatorFactory{"osx8", newOSX8Collator, + "OS X/Darwin collator for UTF-8."}) +} + +func osxUInt8P(s []byte) *C.UInt8 { + return (*C.UInt8)(unsafe.Pointer(&s[0])) +} + +func osxCharP(s []uint16) *C.UniChar { + return (*C.UniChar)(unsafe.Pointer(&s[0])) +} + +// osxCollator implements an Collator based on OS X's CoreFoundation. +type osxCollator struct { + loc C.CFLocaleRef + opt C.CFStringCompareFlags +} + +func (c *osxCollator) init(locale string) { + l := C.CFStringCreateWithBytes( + nil, + osxUInt8P([]byte(locale)), + C.CFIndex(len(locale)), + C.kCFStringEncodingUTF8, + C.Boolean(0), + ) + c.loc = C.CFLocaleCreate(nil, l) +} + +func newOSX8Collator(locale string) (Collator, error) { + c := &osx8Collator{} + c.init(locale) + return c, nil +} + +func newOSX16Collator(locale string) (Collator, error) { + c := &osx16Collator{} + c.init(locale) + return c, nil +} + +func (c osxCollator) Key(s Input) []byte { + return nil // sort keys not supported by OS X CoreFoundation +} + +type osx8Collator struct { + osxCollator +} + +type osx16Collator struct { + osxCollator +} + +func (c osx16Collator) Compare(a, b Input) int { + sa := C.CFStringCreateWithCharactersNoCopy( + nil, + osxCharP(a.UTF16), + C.CFIndex(len(a.UTF16)), + nil, + ) + sb := C.CFStringCreateWithCharactersNoCopy( + nil, + osxCharP(b.UTF16), + C.CFIndex(len(b.UTF16)), + nil, + ) + _range := C.CFRangeMake(0, C.CFStringGetLength(sa)) + return int(C.CFStringCompareWithOptionsAndLocale(sa, sb, _range, c.opt, c.loc)) +} + +func (c osx8Collator) Compare(a, b Input) int { + sa := C.CFStringCreateWithBytesNoCopy( + nil, + osxUInt8P(a.UTF8), + C.CFIndex(len(a.UTF8)), + C.kCFStringEncodingUTF8, + C.Boolean(0), + nil, + ) + sb := C.CFStringCreateWithBytesNoCopy( + nil, + osxUInt8P(b.UTF8), + C.CFIndex(len(b.UTF8)), + C.kCFStringEncodingUTF8, + C.Boolean(0), + nil, + ) + _range := C.CFRangeMake(0, C.CFStringGetLength(sa)) + return int(C.CFStringCompareWithOptionsAndLocale(sa, sb, _range, c.opt, c.loc)) +} diff --git a/vendor/golang.org/x/text/collate/tools/colcmp/gen.go b/vendor/golang.org/x/text/collate/tools/colcmp/gen.go new file mode 100644 index 0000000000..795be132eb --- /dev/null +++ b/vendor/golang.org/x/text/collate/tools/colcmp/gen.go @@ -0,0 +1,183 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "math" + "math/rand" + "strings" + "unicode" + "unicode/utf16" + "unicode/utf8" + + "golang.org/x/text/language" + "golang.org/x/text/unicode/norm" +) + +// TODO: replace with functionality in language package. +// parent computes the parent language for the given language. +// It returns false if the parent is already root. +func parent(locale string) (parent string, ok bool) { + if locale == "und" { + return "", false + } + if i := strings.LastIndex(locale, "-"); i != -1 { + return locale[:i], true + } + return "und", true +} + +// rewriter is used to both unique strings and create variants of strings +// to add to the test set. +type rewriter struct { + seen map[string]bool + addCases bool +} + +func newRewriter() *rewriter { + return &rewriter{ + seen: make(map[string]bool), + } +} + +func (r *rewriter) insert(a []string, s string) []string { + if !r.seen[s] { + r.seen[s] = true + a = append(a, s) + } + return a +} + +// rewrite takes a sequence of strings in, adds variants of the these strings +// based on options and removes duplicates. +func (r *rewriter) rewrite(ss []string) []string { + ns := []string{} + for _, s := range ss { + ns = r.insert(ns, s) + if r.addCases { + rs := []rune(s) + rn := rs[0] + for c := unicode.SimpleFold(rn); c != rn; c = unicode.SimpleFold(c) { + rs[0] = c + ns = r.insert(ns, string(rs)) + } + } + } + return ns +} + +// exemplarySet holds a parsed set of characters from the exemplarCharacters table. +type exemplarySet struct { + typ exemplarType + set []string + charIndex int // cumulative total of phrases, including this set +} + +type phraseGenerator struct { + sets [exN]exemplarySet + n int +} + +func (g *phraseGenerator) init(id string) { + ec := exemplarCharacters + loc := language.Make(id).String() + // get sets for locale or parent locale if the set is not defined. + for i := range g.sets { + for p, ok := loc, true; ok; p, ok = parent(p) { + if set, ok := ec[p]; ok && set[i] != "" { + g.sets[i].set = strings.Split(set[i], " ") + break + } + } + } + r := newRewriter() + r.addCases = *cases + for i := range g.sets { + g.sets[i].set = r.rewrite(g.sets[i].set) + } + // compute indexes + for i, set := range g.sets { + g.n += len(set.set) + g.sets[i].charIndex = g.n + } +} + +// phrase returns the ith phrase, where i < g.n. +func (g *phraseGenerator) phrase(i int) string { + for _, set := range g.sets { + if i < set.charIndex { + return set.set[i-(set.charIndex-len(set.set))] + } + } + panic("index out of range") +} + +// generate generates inputs by combining all pairs of examplar strings. +// If doNorm is true, all input strings are normalized to NFC. +// TODO: allow other variations, statistical models, and random +// trailing sequences. +func (g *phraseGenerator) generate(doNorm bool) []Input { + const ( + M = 1024 * 1024 + buf8Size = 30 * M + buf16Size = 10 * M + ) + // TODO: use a better way to limit the input size. + if sq := int(math.Sqrt(float64(*limit))); g.n > sq { + g.n = sq + } + size := g.n * g.n + a := make([]Input, 0, size) + buf8 := make([]byte, 0, buf8Size) + buf16 := make([]uint16, 0, buf16Size) + + addInput := func(str string) { + buf8 = buf8[len(buf8):] + buf16 = buf16[len(buf16):] + if len(str) > cap(buf8) { + buf8 = make([]byte, 0, buf8Size) + } + if len(str) > cap(buf16) { + buf16 = make([]uint16, 0, buf16Size) + } + if doNorm { + buf8 = norm.NFD.AppendString(buf8, str) + } else { + buf8 = append(buf8, str...) + } + buf16 = appendUTF16(buf16, buf8) + a = append(a, makeInput(buf8, buf16)) + } + for i := 0; i < g.n; i++ { + p1 := g.phrase(i) + addInput(p1) + for j := 0; j < g.n; j++ { + p2 := g.phrase(j) + addInput(p1 + p2) + } + } + // permutate + rnd := rand.New(rand.NewSource(int64(rand.Int()))) + for i := range a { + j := i + rnd.Intn(len(a)-i) + a[i], a[j] = a[j], a[i] + a[i].index = i // allow restoring this order if input is used multiple times. + } + return a +} + +func appendUTF16(buf []uint16, s []byte) []uint16 { + for len(s) > 0 { + r, sz := utf8.DecodeRune(s) + s = s[sz:] + r1, r2 := utf16.EncodeRune(r) + if r1 != 0xFFFD { + buf = append(buf, uint16(r1), uint16(r2)) + } else { + buf = append(buf, uint16(r)) + } + } + return buf +} diff --git a/vendor/golang.org/x/text/collate/tools/colcmp/icu.go b/vendor/golang.org/x/text/collate/tools/colcmp/icu.go new file mode 100644 index 0000000000..91980ac98f --- /dev/null +++ b/vendor/golang.org/x/text/collate/tools/colcmp/icu.go @@ -0,0 +1,209 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build icu + +package main + +/* +#cgo LDFLAGS: -licui18n -licuuc +#include <stdlib.h> +#include <unicode/ucol.h> +#include <unicode/uiter.h> +#include <unicode/utypes.h> +*/ +import "C" +import ( + "fmt" + "log" + "unicode/utf16" + "unicode/utf8" + "unsafe" +) + +func init() { + AddFactory(CollatorFactory{"icu", newUTF16, + "Main ICU collator, using native strings."}) + AddFactory(CollatorFactory{"icu8", newUTF8iter, + "ICU collator using ICU iterators to process UTF8."}) + AddFactory(CollatorFactory{"icu16", newUTF8conv, + "ICU collation by first converting UTF8 to UTF16."}) +} + +func icuCharP(s []byte) *C.char { + return (*C.char)(unsafe.Pointer(&s[0])) +} + +func icuUInt8P(s []byte) *C.uint8_t { + return (*C.uint8_t)(unsafe.Pointer(&s[0])) +} + +func icuUCharP(s []uint16) *C.UChar { + return (*C.UChar)(unsafe.Pointer(&s[0])) +} +func icuULen(s []uint16) C.int32_t { + return C.int32_t(len(s)) +} +func icuSLen(s []byte) C.int32_t { + return C.int32_t(len(s)) +} + +// icuCollator implements a Collator based on ICU. +type icuCollator struct { + loc *C.char + col *C.UCollator + keyBuf []byte +} + +const growBufSize = 10 * 1024 * 1024 + +func (c *icuCollator) init(locale string) error { + err := C.UErrorCode(0) + c.loc = C.CString(locale) + c.col = C.ucol_open(c.loc, &err) + if err > 0 { + return fmt.Errorf("failed opening collator for %q", locale) + } else if err < 0 { + loc := C.ucol_getLocaleByType(c.col, 0, &err) + fmt, ok := map[int]string{ + -127: "warning: using default collator: %s", + -128: "warning: using fallback collator: %s", + }[int(err)] + if ok { + log.Printf(fmt, C.GoString(loc)) + } + } + c.keyBuf = make([]byte, 0, growBufSize) + return nil +} + +func (c *icuCollator) buf() (*C.uint8_t, C.int32_t) { + if len(c.keyBuf) == cap(c.keyBuf) { + c.keyBuf = make([]byte, 0, growBufSize) + } + b := c.keyBuf[len(c.keyBuf):cap(c.keyBuf)] + return icuUInt8P(b), icuSLen(b) +} + +func (c *icuCollator) extendBuf(n C.int32_t) []byte { + end := len(c.keyBuf) + int(n) + if end > cap(c.keyBuf) { + if len(c.keyBuf) == 0 { + log.Fatalf("icuCollator: max string size exceeded: %v > %v", n, growBufSize) + } + c.keyBuf = make([]byte, 0, growBufSize) + return nil + } + b := c.keyBuf[len(c.keyBuf):end] + c.keyBuf = c.keyBuf[:end] + return b +} + +func (c *icuCollator) Close() error { + C.ucol_close(c.col) + C.free(unsafe.Pointer(c.loc)) + return nil +} + +// icuUTF16 implements the Collator interface. +type icuUTF16 struct { + icuCollator +} + +func newUTF16(locale string) (Collator, error) { + c := &icuUTF16{} + return c, c.init(locale) +} + +func (c *icuUTF16) Compare(a, b Input) int { + return int(C.ucol_strcoll(c.col, icuUCharP(a.UTF16), icuULen(a.UTF16), icuUCharP(b.UTF16), icuULen(b.UTF16))) +} + +func (c *icuUTF16) Key(s Input) []byte { + bp, bn := c.buf() + n := C.ucol_getSortKey(c.col, icuUCharP(s.UTF16), icuULen(s.UTF16), bp, bn) + if b := c.extendBuf(n); b != nil { + return b + } + return c.Key(s) +} + +// icuUTF8iter implements the Collator interface +// This implementation wraps the UTF8 string in an iterator +// which is passed to the collator. +type icuUTF8iter struct { + icuCollator + a, b C.UCharIterator +} + +func newUTF8iter(locale string) (Collator, error) { + c := &icuUTF8iter{} + return c, c.init(locale) +} + +func (c *icuUTF8iter) Compare(a, b Input) int { + err := C.UErrorCode(0) + C.uiter_setUTF8(&c.a, icuCharP(a.UTF8), icuSLen(a.UTF8)) + C.uiter_setUTF8(&c.b, icuCharP(b.UTF8), icuSLen(b.UTF8)) + return int(C.ucol_strcollIter(c.col, &c.a, &c.b, &err)) +} + +func (c *icuUTF8iter) Key(s Input) []byte { + err := C.UErrorCode(0) + state := [2]C.uint32_t{} + C.uiter_setUTF8(&c.a, icuCharP(s.UTF8), icuSLen(s.UTF8)) + bp, bn := c.buf() + n := C.ucol_nextSortKeyPart(c.col, &c.a, &(state[0]), bp, bn, &err) + if n >= bn { + // Force failure. + if c.extendBuf(n+1) != nil { + log.Fatal("expected extension to fail") + } + return c.Key(s) + } + return c.extendBuf(n) +} + +// icuUTF8conv implementes the Collator interface. +// This implentation first converts the give UTF8 string +// to UTF16 and then calls the main ICU collation function. +type icuUTF8conv struct { + icuCollator +} + +func newUTF8conv(locale string) (Collator, error) { + c := &icuUTF8conv{} + return c, c.init(locale) +} + +func (c *icuUTF8conv) Compare(sa, sb Input) int { + a := encodeUTF16(sa.UTF8) + b := encodeUTF16(sb.UTF8) + return int(C.ucol_strcoll(c.col, icuUCharP(a), icuULen(a), icuUCharP(b), icuULen(b))) +} + +func (c *icuUTF8conv) Key(s Input) []byte { + a := encodeUTF16(s.UTF8) + bp, bn := c.buf() + n := C.ucol_getSortKey(c.col, icuUCharP(a), icuULen(a), bp, bn) + if b := c.extendBuf(n); b != nil { + return b + } + return c.Key(s) +} + +func encodeUTF16(b []byte) []uint16 { + a := []uint16{} + for len(b) > 0 { + r, sz := utf8.DecodeRune(b) + b = b[sz:] + r1, r2 := utf16.EncodeRune(r) + if r1 != 0xFFFD { + a = append(a, uint16(r1), uint16(r2)) + } else { + a = append(a, uint16(r)) + } + } + return a +} diff --git a/vendor/golang.org/x/text/currency/common.go b/vendor/golang.org/x/text/currency/common.go new file mode 100644 index 0000000000..4a7d9a5da2 --- /dev/null +++ b/vendor/golang.org/x/text/currency/common.go @@ -0,0 +1,44 @@ +// This file was generated by go generate; DO NOT EDIT + +package currency + +import "golang.org/x/text/language" + +// This file contains code common to gen.go and the package code. + +const ( + cashShift = 3 + roundMask = 0x7 +) + +// currencyInfo contains information about a currency. +// bits 0..2: index into roundings for standard rounding +// bits 3..5: index into roundings for cash rounding +type currencyInfo byte + +// roundingType defines the scale (number of fractional decimals) and increments +// in terms of units of size 10^-scale. For example, for scale == 2 and +// increment == 1, the currency is rounded to units of 0.01. +type roundingType struct { + scale, increment uint8 +} + +// roundings contains rounding data for currencies. This struct is +// created by hand as it is very unlikely to change much. +var roundings = [...]roundingType{ + {2, 1}, // default + {0, 1}, + {1, 1}, + {3, 1}, + {4, 1}, + {2, 5}, // cash rounding alternative +} + +// regionToCode returns a 16-bit region code. Only two-letter codes are +// supported. (Three-letter codes are not needed.) +func regionToCode(r language.Region) uint16 { + if s := r.String(); len(s) == 2 { + return uint16(s[0])<<8 | uint16(s[1]) + } + return 0 +} diff --git a/vendor/golang.org/x/text/currency/currency.go b/vendor/golang.org/x/text/currency/currency.go new file mode 100644 index 0000000000..598ddeff42 --- /dev/null +++ b/vendor/golang.org/x/text/currency/currency.go @@ -0,0 +1,185 @@ +// 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. + +//go:generate go run gen.go gen_common.go -output tables.go + +// Package currency contains currency-related functionality. +// +// NOTE: the formatting functionality is currently under development and may +// change without notice. +package currency // import "golang.org/x/text/currency" + +import ( + "errors" + "sort" + + "golang.org/x/text/internal/tag" + "golang.org/x/text/language" +) + +// TODO: +// - language-specific currency names. +// - currency formatting. +// - currency information per region +// - register currency code (there are no private use area) + +// TODO: remove Currency type from package language. + +// Kind determines the rounding and rendering properties of a currency value. +type Kind struct { + rounding rounding + // TODO: formatting type: standard, accounting. See CLDR. +} + +type rounding byte + +const ( + standard rounding = iota + cash +) + +var ( + // Standard defines standard rounding and formatting for currencies. + Standard Kind = Kind{rounding: standard} + + // Cash defines rounding and formatting standards for cash transactions. + Cash Kind = Kind{rounding: cash} + + // Accounting defines rounding and formatting standards for accounting. + Accounting Kind = Kind{rounding: standard} +) + +// Rounding reports the rounding characteristics for the given currency, where +// scale is the number of fractional decimals and increment is the number of +// units in terms of 10^(-scale) to which to round to. +func (k Kind) Rounding(cur Unit) (scale, increment int) { + info := currency.Elem(int(cur.index))[3] + switch k.rounding { + case standard: + info &= roundMask + case cash: + info >>= cashShift + } + return int(roundings[info].scale), int(roundings[info].increment) +} + +// Unit is an ISO 4217 currency designator. +type Unit struct { + index uint16 +} + +// String returns the ISO code of u. +func (u Unit) String() string { + if u.index == 0 { + return "XXX" + } + return currency.Elem(int(u.index))[:3] +} + +// Amount creates an Amount for the given currency unit and amount. +func (u Unit) Amount(amount interface{}) Amount { + // TODO: verify amount is a supported number type + return Amount{amount: amount, currency: u} +} + +var ( + errSyntax = errors.New("currency: tag is not well-formed") + errValue = errors.New("currency: tag is not a recognized currency") +) + +// ParseISO parses a 3-letter ISO 4217 currency code. It returns an error if s +// is not well-formed or not a recognized currency code. +func ParseISO(s string) (Unit, error) { + var buf [4]byte // Take one byte more to detect oversize keys. + key := buf[:copy(buf[:], s)] + if !tag.FixCase("XXX", key) { + return Unit{}, errSyntax + } + if i := currency.Index(key); i >= 0 { + if i == xxx { + return Unit{}, nil + } + return Unit{uint16(i)}, nil + } + return Unit{}, errValue +} + +// MustParseISO is like ParseISO, but panics if the given currency unit +// cannot be parsed. It simplifies safe initialization of Unit values. +func MustParseISO(s string) Unit { + c, err := ParseISO(s) + if err != nil { + panic(err) + } + return c +} + +// FromRegion reports the currency unit that is currently legal tender in the +// given region according to CLDR. It will return false if region currently does +// not have a legal tender. +func FromRegion(r language.Region) (currency Unit, ok bool) { + x := regionToCode(r) + i := sort.Search(len(regionToCurrency), func(i int) bool { + return regionToCurrency[i].region >= x + }) + if i < len(regionToCurrency) && regionToCurrency[i].region == x { + return Unit{regionToCurrency[i].code}, true + } + return Unit{}, false +} + +// FromTag reports the most likely currency for the given tag. It considers the +// currency defined in the -u extension and infers the region if necessary. +func FromTag(t language.Tag) (Unit, language.Confidence) { + if cur := t.TypeForKey("cu"); len(cur) == 3 { + c, _ := ParseISO(cur) + return c, language.Exact + } + r, conf := t.Region() + if cur, ok := FromRegion(r); ok { + return cur, conf + } + return Unit{}, language.No +} + +var ( + // Undefined and testing. + XXX Unit = Unit{} + XTS Unit = Unit{xts} + + // G10 currencies https://en.wikipedia.org/wiki/G10_currencies. + USD Unit = Unit{usd} + EUR Unit = Unit{eur} + JPY Unit = Unit{jpy} + GBP Unit = Unit{gbp} + CHF Unit = Unit{chf} + AUD Unit = Unit{aud} + NZD Unit = Unit{nzd} + CAD Unit = Unit{cad} + SEK Unit = Unit{sek} + NOK Unit = Unit{nok} + + // Additional common currencies as defined by CLDR. + BRL Unit = Unit{brl} + CNY Unit = Unit{cny} + DKK Unit = Unit{dkk} + INR Unit = Unit{inr} + RUB Unit = Unit{rub} + HKD Unit = Unit{hkd} + IDR Unit = Unit{idr} + KRW Unit = Unit{krw} + MXN Unit = Unit{mxn} + PLN Unit = Unit{pln} + SAR Unit = Unit{sar} + THB Unit = Unit{thb} + TRY Unit = Unit{try} + TWD Unit = Unit{twd} + ZAR Unit = Unit{zar} + + // Precious metals. + XAG Unit = Unit{xag} + XAU Unit = Unit{xau} + XPT Unit = Unit{xpt} + XPD Unit = Unit{xpd} +) diff --git a/vendor/golang.org/x/text/currency/currency_test.go b/vendor/golang.org/x/text/currency/currency_test.go new file mode 100644 index 0000000000..566a1678a7 --- /dev/null +++ b/vendor/golang.org/x/text/currency/currency_test.go @@ -0,0 +1,171 @@ +// 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 currency + +import ( + "fmt" + "testing" + + "golang.org/x/text/internal/testtext" + "golang.org/x/text/language" +) + +var ( + cup = MustParseISO("CUP") + czk = MustParseISO("CZK") + xcd = MustParseISO("XCD") + zwr = MustParseISO("ZWR") +) + +func TestParseISO(t *testing.T) { + testCases := []struct { + in string + out Unit + ok bool + }{ + {"USD", USD, true}, + {"xxx", XXX, true}, + {"xts", XTS, true}, + {"XX", XXX, false}, + {"XXXX", XXX, false}, + {"", XXX, false}, // not well-formed + {"UUU", XXX, false}, // unknown + {"\u22A9", XXX, false}, // non-ASCII, printable + + {"aaa", XXX, false}, + {"zzz", XXX, false}, + {"000", XXX, false}, + {"999", XXX, false}, + {"---", XXX, false}, + {"\x00\x00\x00", XXX, false}, + {"\xff\xff\xff", XXX, false}, + } + for i, tc := range testCases { + if x, err := ParseISO(tc.in); x != tc.out || err == nil != tc.ok { + t.Errorf("%d:%s: was %s, %v; want %s, %v", i, tc.in, x, err == nil, tc.out, tc.ok) + } + } +} + +func TestFromRegion(t *testing.T) { + testCases := []struct { + region string + currency Unit + ok bool + }{ + {"NL", EUR, true}, + {"BE", EUR, true}, + {"AG", xcd, true}, + {"CH", CHF, true}, + {"CU", cup, true}, // first of multiple + {"DG", USD, true}, // does not have M49 code + {"150", XXX, false}, // implicit false + {"CP", XXX, false}, // explicit false in CLDR + {"CS", XXX, false}, // all expired + {"ZZ", XXX, false}, // none match + } + for _, tc := range testCases { + cur, ok := FromRegion(language.MustParseRegion(tc.region)) + if cur != tc.currency || ok != tc.ok { + t.Errorf("%s: got %v, %v; want %v, %v", tc.region, cur, ok, tc.currency, tc.ok) + } + } +} + +func TestFromTag(t *testing.T) { + testCases := []struct { + tag string + currency Unit + conf language.Confidence + }{ + {"nl", EUR, language.Low}, // nl also spoken outside Euro land. + {"nl-BE", EUR, language.Exact}, // region is known + {"pt", BRL, language.Low}, + {"en", USD, language.Low}, + {"en-u-cu-eur", EUR, language.Exact}, + {"tlh", XXX, language.No}, // Klingon has no country. + {"es-419", XXX, language.No}, + {"und", USD, language.Low}, + } + for _, tc := range testCases { + cur, conf := FromTag(language.MustParse(tc.tag)) + if cur != tc.currency || conf != tc.conf { + t.Errorf("%s: got %v, %v; want %v, %v", tc.tag, cur, conf, tc.currency, tc.conf) + } + } +} + +func TestTable(t *testing.T) { + for i := 4; i < len(currency); i += 4 { + if a, b := currency[i-4:i-1], currency[i:i+3]; a >= b { + t.Errorf("currency unordered at element %d: %s >= %s", i, a, b) + } + } + // First currency has index 1, last is numCurrencies. + if c := currency.Elem(1)[:3]; c != "ADP" { + t.Errorf("first was %c; want ADP", c) + } + if c := currency.Elem(numCurrencies)[:3]; c != "ZWR" { + t.Errorf("last was %c; want ZWR", c) + } +} + +func TestKindRounding(t *testing.T) { + testCases := []struct { + kind Kind + cur Unit + scale int + inc int + }{ + {Standard, USD, 2, 1}, + {Standard, CHF, 2, 1}, + {Cash, CHF, 2, 5}, + {Standard, TWD, 2, 1}, + {Cash, TWD, 0, 1}, + {Standard, czk, 2, 1}, + {Cash, czk, 0, 1}, + {Standard, zwr, 2, 1}, + {Cash, zwr, 0, 1}, + {Standard, KRW, 0, 1}, + {Cash, KRW, 0, 1}, // Cash defaults to standard. + } + for i, tc := range testCases { + if scale, inc := tc.kind.Rounding(tc.cur); scale != tc.scale && inc != tc.inc { + t.Errorf("%d: got %d, %d; want %d, %d", i, scale, inc, tc.scale, tc.inc) + } + } +} + +const body = `package main +import ( + "fmt" + "golang.org/x/text/currency" +) +func main() { + %s +} +` + +func TestLinking(t *testing.T) { + base := getSize(t, `fmt.Print(currency.CLDRVersion)`) + symbols := getSize(t, `fmt.Print(currency.Symbol(currency.USD))`) + if d := symbols - base; d < 2*1024 { + t.Errorf("size(symbols)-size(base) was %d; want > 2K", d) + } +} + +func getSize(t *testing.T, main string) int { + size, err := testtext.CodeSize(fmt.Sprintf(body, main)) + if err != nil { + t.Skipf("skipping link size test; binary size could not be determined: %v", err) + } + return size +} + +func BenchmarkString(b *testing.B) { + for i := 0; i < b.N; i++ { + USD.String() + } +} diff --git a/vendor/golang.org/x/text/currency/format.go b/vendor/golang.org/x/text/currency/format.go new file mode 100644 index 0000000000..97ce2d944b --- /dev/null +++ b/vendor/golang.org/x/text/currency/format.go @@ -0,0 +1,215 @@ +// 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 currency + +import ( + "fmt" + "io" + "sort" + + "golang.org/x/text/internal" + "golang.org/x/text/internal/format" + "golang.org/x/text/language" +) + +// Amount is an amount-currency unit pair. +type Amount struct { + amount interface{} // Change to decimal(64|128). + currency Unit +} + +// Currency reports the currency unit of this amount. +func (a Amount) Currency() Unit { return a.currency } + +// TODO: based on decimal type, but may make sense to customize a bit. +// func (a Amount) Decimal() +// func (a Amount) Int() (int64, error) +// func (a Amount) Fraction() (int64, error) +// func (a Amount) Rat() *big.Rat +// func (a Amount) Float() (float64, error) +// func (a Amount) Scale() uint +// func (a Amount) Precision() uint +// func (a Amount) Sign() int +// +// Add/Sub/Div/Mul/Round. + +var space = []byte(" ") + +// Format implements fmt.Formatter. It accepts format.State for +// language-specific rendering. +func (a Amount) Format(s fmt.State, verb rune) { + v := formattedValue{ + currency: a.currency, + amount: a.amount, + format: defaultFormat, + } + v.Format(s, verb) +} + +// formattedValue is currency amount or unit that implements language-sensitive +// formatting. +type formattedValue struct { + currency Unit + amount interface{} // Amount, Unit, or number. + format *options +} + +// Format implements fmt.Formatter. It accepts format.State for +// language-specific rendering. +func (v formattedValue) Format(s fmt.State, verb rune) { + var lang int + if state, ok := s.(format.State); ok { + lang, _ = language.CompactIndex(state.Language()) + } + + // Get the options. Use DefaultFormat if not present. + opt := v.format + if opt == nil { + opt = defaultFormat + } + cur := v.currency + if cur.index == 0 { + cur = opt.currency + } + + // TODO: use pattern. + io.WriteString(s, opt.symbol(lang, cur)) + if v.amount != nil { + s.Write(space) + + // TODO: apply currency-specific rounding + scale, _ := opt.kind.Rounding(cur) + if _, ok := s.Precision(); !ok { + fmt.Fprintf(s, "%.*f", scale, v.amount) + } else { + fmt.Fprint(s, v.amount) + } + } +} + +// Formatter decorates a given number, Unit or Amount with formatting options. +type Formatter func(amount interface{}) formattedValue + +// func (f Formatter) Options(opts ...Option) Formatter + +// TODO: call this a Formatter or FormatFunc? + +var dummy = USD.Amount(0) + +// adjust creates a new Formatter based on the adjustments of fn on f. +func (f Formatter) adjust(fn func(*options)) Formatter { + var o options = *(f(dummy).format) + fn(&o) + return o.format +} + +// Default creates a new Formatter that defaults to currency unit c if a numeric +// value is passed that is not associated with a currency. +func (f Formatter) Default(currency Unit) Formatter { + return f.adjust(func(o *options) { o.currency = currency }) +} + +// Kind sets the kind of the underlying currency unit. +func (f Formatter) Kind(k Kind) Formatter { + return f.adjust(func(o *options) { o.kind = k }) +} + +var defaultFormat *options = ISO(dummy).format + +var ( + // Uses Narrow symbols. Overrides Symbol, if present. + NarrowSymbol Formatter = Formatter(formNarrow) + + // Use Symbols instead of ISO codes, when available. + Symbol Formatter = Formatter(formSymbol) + + // Use ISO code as symbol. + ISO Formatter = Formatter(formISO) + + // TODO: + // // Use full name as symbol. + // Name Formatter +) + +// options configures rendering and rounding options for an Amount. +type options struct { + currency Unit + kind Kind + + symbol func(compactIndex int, c Unit) string +} + +func (o *options) format(amount interface{}) formattedValue { + v := formattedValue{format: o} + switch x := amount.(type) { + case Amount: + v.amount = x.amount + v.currency = x.currency + case *Amount: + v.amount = x.amount + v.currency = x.currency + case Unit: + v.currency = x + case *Unit: + v.currency = *x + default: + if o.currency.index == 0 { + panic("cannot format number without a currency being set") + } + // TODO: Must be a number. + v.amount = x + v.currency = o.currency + } + return v +} + +var ( + optISO = options{symbol: lookupISO} + optSymbol = options{symbol: lookupSymbol} + optNarrow = options{symbol: lookupNarrow} +) + +// These need to be functions, rather than curried methods, as curried methods +// are evaluated at init time, causing tables to be included unconditionally. +func formISO(x interface{}) formattedValue { return optISO.format(x) } +func formSymbol(x interface{}) formattedValue { return optSymbol.format(x) } +func formNarrow(x interface{}) formattedValue { return optNarrow.format(x) } + +func lookupISO(x int, c Unit) string { return c.String() } +func lookupSymbol(x int, c Unit) string { return normalSymbol.lookup(x, c) } +func lookupNarrow(x int, c Unit) string { return narrowSymbol.lookup(x, c) } + +type symbolIndex struct { + index []uint16 // position corresponds with compact index of language. + data []curToIndex +} + +var ( + normalSymbol = symbolIndex{normalLangIndex, normalSymIndex} + narrowSymbol = symbolIndex{narrowLangIndex, narrowSymIndex} +) + +func (x *symbolIndex) lookup(lang int, c Unit) string { + for { + index := x.data[x.index[lang]:x.index[lang+1]] + i := sort.Search(len(index), func(i int) bool { + return index[i].cur >= c.index + }) + if i < len(index) && index[i].cur == c.index { + x := index[i].idx + start := x + 1 + end := start + uint16(symbols[x]) + if start == end { + return c.String() + } + return symbols[start:end] + } + if lang == 0 { + break + } + lang = int(internal.Parent[lang]) + } + return c.String() +} diff --git a/vendor/golang.org/x/text/currency/format_test.go b/vendor/golang.org/x/text/currency/format_test.go new file mode 100644 index 0000000000..0aa0d58aff --- /dev/null +++ b/vendor/golang.org/x/text/currency/format_test.go @@ -0,0 +1,70 @@ +// 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 currency + +import ( + "testing" + + "golang.org/x/text/language" + "golang.org/x/text/message" +) + +var ( + en = language.English + fr = language.French + en_US = language.AmericanEnglish + en_GB = language.BritishEnglish + en_AU = language.MustParse("en-AU") + und = language.Und +) + +func TestFormatting(t *testing.T) { + testCases := []struct { + tag language.Tag + value interface{} + format Formatter + want string + }{ + 0: {en, USD.Amount(0.1), nil, "USD 0.10"}, + 1: {en, XPT.Amount(1.0), Symbol, "XPT 1.00"}, + + 2: {en, USD.Amount(2.0), ISO, "USD 2.00"}, + 3: {und, USD.Amount(3.0), Symbol, "US$ 3.00"}, + 4: {en, USD.Amount(4.0), Symbol, "$ 4.00"}, + + 5: {en, USD.Amount(5.20), NarrowSymbol, "$ 5.20"}, + 6: {en, AUD.Amount(6.20), Symbol, "A$ 6.20"}, + + 7: {en_AU, AUD.Amount(7.20), Symbol, "$ 7.20"}, + 8: {en_GB, USD.Amount(8.20), Symbol, "US$ 8.20"}, + + 9: {en, 9.0, Symbol.Default(EUR), "€ 9.00"}, + 10: {en, 10.123, Symbol.Default(KRW), "₩ 10"}, + 11: {fr, 11.52, Symbol.Default(TWD), "TWD 11.52"}, + 12: {en, 12.123, Symbol.Default(czk), "CZK 12.12"}, + 13: {en, 13.123, Symbol.Default(czk).Kind(Cash), "CZK 13"}, + 14: {en, 14.12345, ISO.Default(MustParseISO("CLF")), "CLF 14.1235"}, + 15: {en, USD.Amount(15.00), ISO.Default(TWD), "USD 15.00"}, + 16: {en, KRW.Amount(16.00), ISO.Kind(Cash), "KRW 16"}, + + // TODO: support integers as well. + + 17: {en, USD, nil, "USD"}, + 18: {en, USD, ISO, "USD"}, + 19: {en, USD, Symbol, "$"}, + 20: {en_GB, USD, Symbol, "US$"}, + 21: {en_AU, USD, NarrowSymbol, "$"}, + } + for i, tc := range testCases { + p := message.NewPrinter(tc.tag) + v := tc.value + if tc.format != nil { + v = tc.format(v) + } + if got := p.Sprint(v); got != tc.want { + t.Errorf("%d: got %q; want %q", i, got, tc.want) + } + } +} diff --git a/vendor/golang.org/x/text/currency/gen.go b/vendor/golang.org/x/text/currency/gen.go new file mode 100644 index 0000000000..276cfedaa4 --- /dev/null +++ b/vendor/golang.org/x/text/currency/gen.go @@ -0,0 +1,359 @@ +// 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 ignore + +// Generator for currency-related data. + +package main + +import ( + "flag" + "fmt" + "log" + "os" + "sort" + "strconv" + "strings" + + "golang.org/x/text/internal" + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/tag" + "golang.org/x/text/language" + "golang.org/x/text/unicode/cldr" +) + +var ( + test = flag.Bool("test", false, + "test existing tables; can be used to compare web data with package data.") + outputFile = flag.String("output", "tables.go", "output file") + + draft = flag.String("draft", + "contributed", + `Minimal draft requirements (approved, contributed, provisional, unconfirmed).`) +) + +func main() { + gen.Init() + + gen.Repackage("gen_common.go", "common.go", "currency") + + // Read the CLDR zip file. + r := gen.OpenCLDRCoreZip() + defer r.Close() + + d := &cldr.Decoder{} + d.SetDirFilter("supplemental", "main") + d.SetSectionFilter("numbers") + data, err := d.DecodeZip(r) + if err != nil { + log.Fatalf("DecodeZip: %v", err) + } + + w := gen.NewCodeWriter() + defer w.WriteGoFile(*outputFile, "currency") + + fmt.Fprintln(w, `import "golang.org/x/text/internal/tag"`) + + gen.WriteCLDRVersion(w) + b := &builder{} + b.genCurrencies(w, data.Supplemental()) + b.genSymbols(w, data) +} + +var constants = []string{ + // Undefined and testing. + "XXX", "XTS", + // G11 currencies https://en.wikipedia.org/wiki/G10_currencies. + "USD", "EUR", "JPY", "GBP", "CHF", "AUD", "NZD", "CAD", "SEK", "NOK", "DKK", + // Precious metals. + "XAG", "XAU", "XPT", "XPD", + + // Additional common currencies as defined by CLDR. + "BRL", "CNY", "INR", "RUB", "HKD", "IDR", "KRW", "MXN", "PLN", "SAR", + "THB", "TRY", "TWD", "ZAR", +} + +type builder struct { + currencies tag.Index + numCurrencies int +} + +func (b *builder) genCurrencies(w *gen.CodeWriter, data *cldr.SupplementalData) { + // 3-letter ISO currency codes + // Start with dummy to let index start at 1. + currencies := []string{"\x00\x00\x00\x00"} + + // currency codes + for _, reg := range data.CurrencyData.Region { + for _, cur := range reg.Currency { + currencies = append(currencies, cur.Iso4217) + } + } + // Not included in the list for some reasons: + currencies = append(currencies, "MVP") + + sort.Strings(currencies) + // Unique the elements. + k := 0 + for i := 1; i < len(currencies); i++ { + if currencies[k] != currencies[i] { + currencies[k+1] = currencies[i] + k++ + } + } + currencies = currencies[:k+1] + + // Close with dummy for simpler and faster searching. + currencies = append(currencies, "\xff\xff\xff\xff") + + // Write currency values. + fmt.Fprintln(w, "const (") + for _, c := range constants { + index := sort.SearchStrings(currencies, c) + fmt.Fprintf(w, "\t%s = %d\n", strings.ToLower(c), index) + } + fmt.Fprint(w, ")") + + // Compute currency-related data that we merge into the table. + for _, info := range data.CurrencyData.Fractions[0].Info { + if info.Iso4217 == "DEFAULT" { + continue + } + standard := getRoundingIndex(info.Digits, info.Rounding, 0) + cash := getRoundingIndex(info.CashDigits, info.CashRounding, standard) + + index := sort.SearchStrings(currencies, info.Iso4217) + currencies[index] += mkCurrencyInfo(standard, cash) + } + + // Set default values for entries that weren't touched. + for i, c := range currencies { + if len(c) == 3 { + currencies[i] += mkCurrencyInfo(0, 0) + } + } + + b.currencies = tag.Index(strings.Join(currencies, "")) + w.WriteComment(` + currency holds an alphabetically sorted list of canonical 3-letter currency + identifiers. Each identifier is followed by a byte of type currencyInfo, + defined in gen_common.go.`) + w.WriteConst("currency", b.currencies) + + // Hack alert: gofmt indents a trailing comment after an indented string. + // Ensure that the next thing written is not a comment. + b.numCurrencies = (len(b.currencies) / 4) - 2 + w.WriteConst("numCurrencies", b.numCurrencies) + + // Create a table that maps regions to currencies. + regionToCurrency := []toCurrency{} + + for _, reg := range data.CurrencyData.Region { + if len(reg.Iso3166) != 2 { + log.Fatalf("Unexpected group %q in region data", reg.Iso3166) + } + if len(reg.Currency) == 0 { + continue + } + cur := reg.Currency[0] + if cur.To != "" || cur.Tender == "false" { + continue + } + regionToCurrency = append(regionToCurrency, toCurrency{ + region: regionToCode(language.MustParseRegion(reg.Iso3166)), + code: uint16(b.currencies.Index([]byte(cur.Iso4217))), + }) + } + sort.Sort(byRegion(regionToCurrency)) + + w.WriteType(toCurrency{}) + w.WriteVar("regionToCurrency", regionToCurrency) +} + +type toCurrency struct { + region uint16 + code uint16 +} + +type byRegion []toCurrency + +func (a byRegion) Len() int { return len(a) } +func (a byRegion) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byRegion) Less(i, j int) bool { return a[i].region < a[j].region } + +func mkCurrencyInfo(standard, cash int) string { + return string([]byte{byte(cash<<cashShift | standard)}) +} + +func getRoundingIndex(digits, rounding string, defIndex int) int { + round := roundings[defIndex] // default + + if digits != "" { + round.scale = parseUint8(digits) + } + if rounding != "" && rounding != "0" { // 0 means 1 here in CLDR + round.increment = parseUint8(rounding) + } + + // Will panic if the entry doesn't exist: + for i, r := range roundings { + if r == round { + return i + } + } + log.Fatalf("Rounding entry %#v does not exist.", round) + panic("unreachable") +} + +// genSymbols generates the symbols used for currencies. Most symbols are +// defined in root and there is only very small variation per language. +// The following rules apply: +// - A symbol can be requested as normal or narrow. +// - If a symbol is not defined for a currency, it defaults to its ISO code. +func (b *builder) genSymbols(w *gen.CodeWriter, data *cldr.CLDR) { + d, err := cldr.ParseDraft(*draft) + if err != nil { + log.Fatalf("filter: %v", err) + } + + const ( + normal = iota + narrow + numTypes + ) + // language -> currency -> type -> symbol + var symbols [language.NumCompactTags][][numTypes]*string + + // Collect symbol information per language. + for _, lang := range data.Locales() { + ldml := data.RawLDML(lang) + if ldml.Numbers == nil || ldml.Numbers.Currencies == nil { + continue + } + + langIndex, ok := language.CompactIndex(language.MustParse(lang)) + if !ok { + log.Fatalf("No compact index for language %s", lang) + } + + symbols[langIndex] = make([][numTypes]*string, b.numCurrencies+1) + + for _, c := range ldml.Numbers.Currencies.Currency { + syms := cldr.MakeSlice(&c.Symbol) + syms.SelectDraft(d) + + for _, sym := range c.Symbol { + v := sym.Data() + if v == c.Type { + // We define "" to mean the ISO symbol. + v = "" + } + cur := b.currencies.Index([]byte(c.Type)) + // XXX gets reassigned to 0 in the package's code. + if c.Type == "XXX" { + cur = 0 + } + if cur == -1 { + fmt.Println("Unsupported:", c.Type) + continue + } + + switch sym.Alt { + case "": + symbols[langIndex][cur][normal] = &v + case "narrow": + symbols[langIndex][cur][narrow] = &v + } + } + } + } + + // Remove values identical to the parent. + for langIndex, data := range symbols { + for curIndex, curs := range data { + for typ, sym := range curs { + if sym == nil { + continue + } + for p := uint16(langIndex); p != 0; { + p = internal.Parent[p] + x := symbols[p] + if x == nil { + continue + } + if v := x[curIndex][typ]; v != nil || p == 0 { + // Value is equal to the default value root value is undefined. + parentSym := "" + if v != nil { + parentSym = *v + } + if parentSym == *sym { + // Value is the same as parent. + data[curIndex][typ] = nil + } + break + } + } + } + } + } + + // Create symbol index. + symbolData := []byte{0} + symbolLookup := map[string]uint16{"": 0} // 0 means default, so block that value. + for _, data := range symbols { + for _, curs := range data { + for _, sym := range curs { + if sym == nil { + continue + } + if _, ok := symbolLookup[*sym]; !ok { + symbolLookup[*sym] = uint16(len(symbolData)) + symbolData = append(symbolData, byte(len(*sym))) + symbolData = append(symbolData, *sym...) + } + } + } + } + w.WriteComment(` + symbols holds symbol data of the form <n> <str>, where n is the length of + the symbol string str.`) + w.WriteConst("symbols", string(symbolData)) + + // Create index from language to currency lookup to symbol. + type curToIndex struct{ cur, idx uint16 } + w.WriteType(curToIndex{}) + + prefix := []string{"normal", "narrow"} + // Create data for regular and narrow symbol data. + for typ := normal; typ <= narrow; typ++ { + + indexes := []curToIndex{} // maps currency to symbol index + languages := []uint16{} + + for _, data := range symbols { + languages = append(languages, uint16(len(indexes))) + for curIndex, curs := range data { + + if sym := curs[typ]; sym != nil { + indexes = append(indexes, curToIndex{uint16(curIndex), symbolLookup[*sym]}) + } + } + } + languages = append(languages, uint16(len(indexes))) + + w.WriteVar(prefix[typ]+"LangIndex", languages) + w.WriteVar(prefix[typ]+"SymIndex", indexes) + } +} +func parseUint8(str string) uint8 { + x, err := strconv.ParseUint(str, 10, 8) + if err != nil { + // Show line number of where this function was called. + log.New(os.Stderr, "", log.Lshortfile).Output(2, err.Error()) + os.Exit(1) + } + return uint8(x) +} diff --git a/vendor/golang.org/x/text/currency/gen_common.go b/vendor/golang.org/x/text/currency/gen_common.go new file mode 100644 index 0000000000..85889536fe --- /dev/null +++ b/vendor/golang.org/x/text/currency/gen_common.go @@ -0,0 +1,48 @@ +// 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 ignore + +package main + +import "golang.org/x/text/language" + +// This file contains code common to gen.go and the package code. + +const ( + cashShift = 3 + roundMask = 0x7 +) + +// currencyInfo contains information about a currency. +// bits 0..2: index into roundings for standard rounding +// bits 3..5: index into roundings for cash rounding +type currencyInfo byte + +// roundingType defines the scale (number of fractional decimals) and increments +// in terms of units of size 10^-scale. For example, for scale == 2 and +// increment == 1, the currency is rounded to units of 0.01. +type roundingType struct { + scale, increment uint8 +} + +// roundings contains rounding data for currencies. This struct is +// created by hand as it is very unlikely to change much. +var roundings = [...]roundingType{ + {2, 1}, // default + {0, 1}, + {1, 1}, + {3, 1}, + {4, 1}, + {2, 5}, // cash rounding alternative +} + +// regionToCode returns a 16-bit region code. Only two-letter codes are +// supported. (Three-letter codes are not needed.) +func regionToCode(r language.Region) uint16 { + if s := r.String(); len(s) == 2 { + return uint16(s[0])<<8 | uint16(s[1]) + } + return 0 +} diff --git a/vendor/golang.org/x/text/currency/tables.go b/vendor/golang.org/x/text/currency/tables.go new file mode 100644 index 0000000000..b039ac37d3 --- /dev/null +++ b/vendor/golang.org/x/text/currency/tables.go @@ -0,0 +1,1967 @@ +// This file was generated by go generate; DO NOT EDIT + +package currency + +import "golang.org/x/text/internal/tag" + +// CLDRVersion is the CLDR version from which the tables in this package are derived. +const CLDRVersion = "28" + +const ( + xxx = 282 + xts = 280 + usd = 249 + eur = 92 + jpy = 131 + gbp = 97 + chf = 60 + aud = 19 + nzd = 190 + cad = 57 + sek = 217 + nok = 188 + dkk = 80 + xag = 263 + xau = 264 + xpt = 277 + xpd = 275 + brl = 46 + cny = 66 + inr = 123 + rub = 208 + hkd = 112 + idr = 118 + krw = 139 + mxn = 176 + pln = 199 + sar = 211 + thb = 232 + try = 241 + twd = 243 + zar = 290 +) + +// currency holds an alphabetically sorted list of canonical 3-letter currency +// identifiers. Each identifier is followed by a byte of type currencyInfo, +// defined in gen_common.go. +var currency tag.Index = "" + // Size: 1196 bytes + "\x00\x00\x00\x00ADP\x09AED\x00AFA\x00AFN\x09ALK\x00ALL\x09AMD\x09ANG\x00" + + "AOA\x00AOK\x00AON\x00AOR\x00ARA\x00ARL\x00ARM\x00ARP\x00ARS\x00ATS\x00AU" + + "D\x00AWG\x00AZM\x00AZN\x00BAD\x00BAM\x00BAN\x00BBD\x00BDT\x00BEC\x00BEF" + + "\x00BEL\x00BGL\x00BGM\x00BGN\x00BGO\x00BHD\x1bBIF\x09BMD\x00BND\x00BOB" + + "\x00BOL\x00BOP\x00BOV\x00BRB\x00BRC\x00BRE\x00BRL\x00BRN\x00BRR\x00BRZ" + + "\x00BSD\x00BTN\x00BUK\x00BWP\x00BYB\x00BYR\x09BZD\x00CAD(CDF\x00CHE\x00C" + + "HF(CHW\x00CLE\x00CLF$CLP\x09CNX\x00CNY\x00COP\x09COU\x00CRC\x09CSD\x00CS" + + "K\x00CUC\x00CUP\x00CVE\x00CYP\x00CZK\x08DDM\x00DEM\x00DJF\x09DKK\x00DOP" + + "\x00DZD\x00ECS\x00ECV\x00EEK\x00EGP\x00ERN\x00ESA\x00ESB\x00ESP\x09ETB" + + "\x00EUR\x00FIM\x00FJD\x00FKP\x00FRF\x00GBP\x00GEK\x00GEL\x00GHC\x00GHS" + + "\x00GIP\x00GMD\x00GNF\x09GNS\x00GQE\x00GRD\x00GTQ\x00GWE\x00GWP\x00GYD" + + "\x09HKD\x00HNL\x00HRD\x00HRK\x00HTG\x00HUF\x08IDR\x09IEP\x00ILP\x00ILR" + + "\x00ILS\x00INR\x00IQD\x09IRR\x09ISJ\x00ISK\x09ITL\x09JMD\x00JOD\x1bJPY" + + "\x09KES\x00KGS\x00KHR\x00KMF\x09KPW\x09KRH\x00KRO\x00KRW\x09KWD\x1bKYD" + + "\x00KZT\x00LAK\x09LBP\x09LKR\x00LRD\x00LSL\x00LTL\x00LTT\x00LUC\x00LUF" + + "\x09LUL\x00LVL\x00LVR\x00LYD\x1bMAD\x00MAF\x00MCF\x00MDC\x00MDL\x00MGA" + + "\x09MGF\x09MKD\x00MKN\x00MLF\x00MMK\x09MNT\x09MOP\x00MRO\x09MTL\x00MTP" + + "\x00MUR\x09MVP\x00MVR\x00MWK\x00MXN\x00MXP\x00MXV\x00MYR\x00MZE\x00MZM" + + "\x00MZN\x00NAD\x00NGN\x00NIC\x00NIO\x00NLG\x00NOK\x00NPR\x00NZD\x00OMR" + + "\x1bPAB\x00PEI\x00PEN\x00PES\x00PGK\x00PHP\x00PKR\x09PLN\x00PLZ\x00PTE" + + "\x00PYG\x09QAR\x00RHD\x00ROL\x00RON\x00RSD\x09RUB\x00RUR\x00RWF\x09SAR" + + "\x00SBD\x00SCR\x00SDD\x00SDG\x00SDP\x00SEK\x00SGD\x00SHP\x00SIT\x00SKK" + + "\x00SLL\x09SOS\x09SRD\x00SRG\x00SSP\x00STD\x09SUR\x00SVC\x00SYP\x09SZL" + + "\x00THB\x00TJR\x00TJS\x00TMM\x09TMT\x00TND\x1bTOP\x00TPE\x00TRL\x09TRY" + + "\x00TTD\x00TWD\x08TZS\x09UAH\x00UAK\x00UGS\x00UGX\x09USD\x00USN\x00USS" + + "\x00UYI\x09UYP\x00UYU\x00UZS\x09VEB\x00VEF\x00VND\x09VNN\x00VUV\x09WST" + + "\x00XAF\x09XAG\x00XAU\x00XBA\x00XBB\x00XBC\x00XBD\x00XCD\x00XDR\x00XEU" + + "\x00XFO\x00XFU\x00XOF\x09XPD\x00XPF\x09XPT\x00XRE\x00XSU\x00XTS\x00XUA" + + "\x00XXX\x00YDD\x00YER\x09YUD\x00YUM\x00YUN\x00YUR\x00ZAL\x00ZAR\x00ZMK" + + "\x09ZMW\x00ZRN\x00ZRZ\x00ZWD\x09ZWL\x00ZWR\x00\xff\xff\xff\xff" + +const numCurrencies = 297 + +type toCurrency struct { + region uint16 + code uint16 +} + +var regionToCurrency = []toCurrency{ // 255 elements + 0: {region: 0x4143, code: 0xdb}, + 1: {region: 0x4144, code: 0x5c}, + 2: {region: 0x4145, code: 0x2}, + 3: {region: 0x4146, code: 0x4}, + 4: {region: 0x4147, code: 0x10d}, + 5: {region: 0x4149, code: 0x10d}, + 6: {region: 0x414c, code: 0x6}, + 7: {region: 0x414d, code: 0x7}, + 8: {region: 0x414f, code: 0x9}, + 9: {region: 0x4152, code: 0x11}, + 10: {region: 0x4153, code: 0xf9}, + 11: {region: 0x4154, code: 0x5c}, + 12: {region: 0x4155, code: 0x13}, + 13: {region: 0x4157, code: 0x14}, + 14: {region: 0x4158, code: 0x5c}, + 15: {region: 0x415a, code: 0x16}, + 16: {region: 0x4241, code: 0x18}, + 17: {region: 0x4242, code: 0x1a}, + 18: {region: 0x4244, code: 0x1b}, + 19: {region: 0x4245, code: 0x5c}, + 20: {region: 0x4246, code: 0x112}, + 21: {region: 0x4247, code: 0x21}, + 22: {region: 0x4248, code: 0x23}, + 23: {region: 0x4249, code: 0x24}, + 24: {region: 0x424a, code: 0x112}, + 25: {region: 0x424c, code: 0x5c}, + 26: {region: 0x424d, code: 0x25}, + 27: {region: 0x424e, code: 0x26}, + 28: {region: 0x424f, code: 0x27}, + 29: {region: 0x4251, code: 0xf9}, + 30: {region: 0x4252, code: 0x2e}, + 31: {region: 0x4253, code: 0x32}, + 32: {region: 0x4254, code: 0x33}, + 33: {region: 0x4256, code: 0xbc}, + 34: {region: 0x4257, code: 0x35}, + 35: {region: 0x4259, code: 0x37}, + 36: {region: 0x425a, code: 0x38}, + 37: {region: 0x4341, code: 0x39}, + 38: {region: 0x4343, code: 0x13}, + 39: {region: 0x4344, code: 0x3a}, + 40: {region: 0x4346, code: 0x106}, + 41: {region: 0x4347, code: 0x106}, + 42: {region: 0x4348, code: 0x3c}, + 43: {region: 0x4349, code: 0x112}, + 44: {region: 0x434b, code: 0xbe}, + 45: {region: 0x434c, code: 0x40}, + 46: {region: 0x434d, code: 0x106}, + 47: {region: 0x434e, code: 0x42}, + 48: {region: 0x434f, code: 0x43}, + 49: {region: 0x4352, code: 0x45}, + 50: {region: 0x4355, code: 0x49}, + 51: {region: 0x4356, code: 0x4a}, + 52: {region: 0x4357, code: 0x8}, + 53: {region: 0x4358, code: 0x13}, + 54: {region: 0x4359, code: 0x5c}, + 55: {region: 0x435a, code: 0x4c}, + 56: {region: 0x4445, code: 0x5c}, + 57: {region: 0x4447, code: 0xf9}, + 58: {region: 0x444a, code: 0x4f}, + 59: {region: 0x444b, code: 0x50}, + 60: {region: 0x444d, code: 0x10d}, + 61: {region: 0x444f, code: 0x51}, + 62: {region: 0x445a, code: 0x52}, + 63: {region: 0x4541, code: 0x5c}, + 64: {region: 0x4543, code: 0xf9}, + 65: {region: 0x4545, code: 0x5c}, + 66: {region: 0x4547, code: 0x56}, + 67: {region: 0x4548, code: 0x9c}, + 68: {region: 0x4552, code: 0x57}, + 69: {region: 0x4553, code: 0x5c}, + 70: {region: 0x4554, code: 0x5b}, + 71: {region: 0x4555, code: 0x5c}, + 72: {region: 0x4649, code: 0x5c}, + 73: {region: 0x464a, code: 0x5e}, + 74: {region: 0x464b, code: 0x5f}, + 75: {region: 0x464d, code: 0xf9}, + 76: {region: 0x464f, code: 0x50}, + 77: {region: 0x4652, code: 0x5c}, + 78: {region: 0x4741, code: 0x106}, + 79: {region: 0x4742, code: 0x61}, + 80: {region: 0x4744, code: 0x10d}, + 81: {region: 0x4745, code: 0x63}, + 82: {region: 0x4746, code: 0x5c}, + 83: {region: 0x4747, code: 0x61}, + 84: {region: 0x4748, code: 0x65}, + 85: {region: 0x4749, code: 0x66}, + 86: {region: 0x474c, code: 0x50}, + 87: {region: 0x474d, code: 0x67}, + 88: {region: 0x474e, code: 0x68}, + 89: {region: 0x4750, code: 0x5c}, + 90: {region: 0x4751, code: 0x106}, + 91: {region: 0x4752, code: 0x5c}, + 92: {region: 0x4753, code: 0x61}, + 93: {region: 0x4754, code: 0x6c}, + 94: {region: 0x4755, code: 0xf9}, + 95: {region: 0x4757, code: 0x112}, + 96: {region: 0x4759, code: 0x6f}, + 97: {region: 0x484b, code: 0x70}, + 98: {region: 0x484d, code: 0x13}, + 99: {region: 0x484e, code: 0x71}, + 100: {region: 0x4852, code: 0x73}, + 101: {region: 0x4854, code: 0x74}, + 102: {region: 0x4855, code: 0x75}, + 103: {region: 0x4943, code: 0x5c}, + 104: {region: 0x4944, code: 0x76}, + 105: {region: 0x4945, code: 0x5c}, + 106: {region: 0x494c, code: 0x7a}, + 107: {region: 0x494d, code: 0x61}, + 108: {region: 0x494e, code: 0x7b}, + 109: {region: 0x494f, code: 0xf9}, + 110: {region: 0x4951, code: 0x7c}, + 111: {region: 0x4952, code: 0x7d}, + 112: {region: 0x4953, code: 0x7f}, + 113: {region: 0x4954, code: 0x5c}, + 114: {region: 0x4a45, code: 0x61}, + 115: {region: 0x4a4d, code: 0x81}, + 116: {region: 0x4a4f, code: 0x82}, + 117: {region: 0x4a50, code: 0x83}, + 118: {region: 0x4b45, code: 0x84}, + 119: {region: 0x4b47, code: 0x85}, + 120: {region: 0x4b48, code: 0x86}, + 121: {region: 0x4b49, code: 0x13}, + 122: {region: 0x4b4d, code: 0x87}, + 123: {region: 0x4b4e, code: 0x10d}, + 124: {region: 0x4b50, code: 0x88}, + 125: {region: 0x4b52, code: 0x8b}, + 126: {region: 0x4b57, code: 0x8c}, + 127: {region: 0x4b59, code: 0x8d}, + 128: {region: 0x4b5a, code: 0x8e}, + 129: {region: 0x4c41, code: 0x8f}, + 130: {region: 0x4c42, code: 0x90}, + 131: {region: 0x4c43, code: 0x10d}, + 132: {region: 0x4c49, code: 0x3c}, + 133: {region: 0x4c4b, code: 0x91}, + 134: {region: 0x4c52, code: 0x92}, + 135: {region: 0x4c53, code: 0x122}, + 136: {region: 0x4c54, code: 0x5c}, + 137: {region: 0x4c55, code: 0x5c}, + 138: {region: 0x4c56, code: 0x5c}, + 139: {region: 0x4c59, code: 0x9b}, + 140: {region: 0x4d41, code: 0x9c}, + 141: {region: 0x4d43, code: 0x5c}, + 142: {region: 0x4d44, code: 0xa0}, + 143: {region: 0x4d45, code: 0x5c}, + 144: {region: 0x4d46, code: 0x5c}, + 145: {region: 0x4d47, code: 0xa1}, + 146: {region: 0x4d48, code: 0xf9}, + 147: {region: 0x4d4b, code: 0xa3}, + 148: {region: 0x4d4c, code: 0x112}, + 149: {region: 0x4d4d, code: 0xa6}, + 150: {region: 0x4d4e, code: 0xa7}, + 151: {region: 0x4d4f, code: 0xa8}, + 152: {region: 0x4d50, code: 0xf9}, + 153: {region: 0x4d51, code: 0x5c}, + 154: {region: 0x4d52, code: 0xa9}, + 155: {region: 0x4d53, code: 0x10d}, + 156: {region: 0x4d54, code: 0x5c}, + 157: {region: 0x4d55, code: 0xac}, + 158: {region: 0x4d56, code: 0xae}, + 159: {region: 0x4d57, code: 0xaf}, + 160: {region: 0x4d58, code: 0xb0}, + 161: {region: 0x4d59, code: 0xb3}, + 162: {region: 0x4d5a, code: 0xb6}, + 163: {region: 0x4e41, code: 0xb7}, + 164: {region: 0x4e43, code: 0x114}, + 165: {region: 0x4e45, code: 0x112}, + 166: {region: 0x4e46, code: 0x13}, + 167: {region: 0x4e47, code: 0xb8}, + 168: {region: 0x4e49, code: 0xba}, + 169: {region: 0x4e4c, code: 0x5c}, + 170: {region: 0x4e4f, code: 0xbc}, + 171: {region: 0x4e50, code: 0xbd}, + 172: {region: 0x4e52, code: 0x13}, + 173: {region: 0x4e55, code: 0xbe}, + 174: {region: 0x4e5a, code: 0xbe}, + 175: {region: 0x4f4d, code: 0xbf}, + 176: {region: 0x5041, code: 0xc0}, + 177: {region: 0x5045, code: 0xc2}, + 178: {region: 0x5046, code: 0x114}, + 179: {region: 0x5047, code: 0xc4}, + 180: {region: 0x5048, code: 0xc5}, + 181: {region: 0x504b, code: 0xc6}, + 182: {region: 0x504c, code: 0xc7}, + 183: {region: 0x504d, code: 0x5c}, + 184: {region: 0x504e, code: 0xbe}, + 185: {region: 0x5052, code: 0xf9}, + 186: {region: 0x5053, code: 0x7a}, + 187: {region: 0x5054, code: 0x5c}, + 188: {region: 0x5057, code: 0xf9}, + 189: {region: 0x5059, code: 0xca}, + 190: {region: 0x5141, code: 0xcb}, + 191: {region: 0x5245, code: 0x5c}, + 192: {region: 0x524f, code: 0xce}, + 193: {region: 0x5253, code: 0xcf}, + 194: {region: 0x5255, code: 0xd0}, + 195: {region: 0x5257, code: 0xd2}, + 196: {region: 0x5341, code: 0xd3}, + 197: {region: 0x5342, code: 0xd4}, + 198: {region: 0x5343, code: 0xd5}, + 199: {region: 0x5344, code: 0xd7}, + 200: {region: 0x5345, code: 0xd9}, + 201: {region: 0x5347, code: 0xda}, + 202: {region: 0x5348, code: 0xdb}, + 203: {region: 0x5349, code: 0x5c}, + 204: {region: 0x534a, code: 0xbc}, + 205: {region: 0x534b, code: 0x5c}, + 206: {region: 0x534c, code: 0xde}, + 207: {region: 0x534d, code: 0x5c}, + 208: {region: 0x534e, code: 0x112}, + 209: {region: 0x534f, code: 0xdf}, + 210: {region: 0x5352, code: 0xe0}, + 211: {region: 0x5353, code: 0xe2}, + 212: {region: 0x5354, code: 0xe3}, + 213: {region: 0x5356, code: 0xf9}, + 214: {region: 0x5358, code: 0x8}, + 215: {region: 0x5359, code: 0xe6}, + 216: {region: 0x535a, code: 0xe7}, + 217: {region: 0x5441, code: 0x61}, + 218: {region: 0x5443, code: 0xf9}, + 219: {region: 0x5444, code: 0x106}, + 220: {region: 0x5446, code: 0x5c}, + 221: {region: 0x5447, code: 0x112}, + 222: {region: 0x5448, code: 0xe8}, + 223: {region: 0x544a, code: 0xea}, + 224: {region: 0x544b, code: 0xbe}, + 225: {region: 0x544c, code: 0xf9}, + 226: {region: 0x544d, code: 0xec}, + 227: {region: 0x544e, code: 0xed}, + 228: {region: 0x544f, code: 0xee}, + 229: {region: 0x5452, code: 0xf1}, + 230: {region: 0x5454, code: 0xf2}, + 231: {region: 0x5456, code: 0x13}, + 232: {region: 0x5457, code: 0xf3}, + 233: {region: 0x545a, code: 0xf4}, + 234: {region: 0x5541, code: 0xf5}, + 235: {region: 0x5547, code: 0xf8}, + 236: {region: 0x554d, code: 0xf9}, + 237: {region: 0x5553, code: 0xf9}, + 238: {region: 0x5559, code: 0xfe}, + 239: {region: 0x555a, code: 0xff}, + 240: {region: 0x5641, code: 0x5c}, + 241: {region: 0x5643, code: 0x10d}, + 242: {region: 0x5645, code: 0x101}, + 243: {region: 0x5647, code: 0xf9}, + 244: {region: 0x5649, code: 0xf9}, + 245: {region: 0x564e, code: 0x102}, + 246: {region: 0x5655, code: 0x104}, + 247: {region: 0x5746, code: 0x114}, + 248: {region: 0x5753, code: 0x105}, + 249: {region: 0x584b, code: 0x5c}, + 250: {region: 0x5945, code: 0x11c}, + 251: {region: 0x5954, code: 0x5c}, + 252: {region: 0x5a41, code: 0x122}, + 253: {region: 0x5a4d, code: 0x124}, + 254: {region: 0x5a57, code: 0xf9}, +} // Size: 1044 bytes + +// symbols holds symbol data of the form <n> <str>, where n is the length of +// the symbol string str. +var symbols string = "" + // Size: 1462 bytes + "\x00\x02Kz\x01$\x02A$\x02KM\x03৳\x02Bs\x02R$\x01P\x03р.\x03CA$\x04CN¥" + + "\x02¥\x03₡\x03Kč\x02kr\x03E£\x03₧\x03€\x02£\x02FG\x01Q\x03HK$\x01L\x02kn" + + "\x02Ft\x02Rp\x03₪\x03₹\x04JP¥\x03៛\x02CF\x03₩\x03₸\x03₭\x03L£\x02Rs\x02L" + + "t\x02Ls\x02Ar\x01K\x03₮\x03MX$\x02RM\x03₦\x02C$\x03NZ$\x03₱\x03zł\x03₲" + + "\x03₽\x02RF\x02Db\x03฿\x02T$\x03₺\x03NT$\x03₴\x03US$\x03₫\x04FCFA\x03EC$" + + "\x03CFA\x04CFPF\x01R\x02ZK\x05GH₵\x03AU$\x06ብር\x03***\x09د.إ.\u200f\x03A" + + "R$\x03BB$\x09د.ب.\u200f\x03BM$\x03BN$\x03BS$\x03BZ$\x03CL$\x03CO$\x03CU$" + + "\x03DO$\x09د.ج.\u200f\x09ج.م.\u200f\x03FJ$\x04UK£\x03GY$\x08ر.إن.\x09د.ع" + + ".\u200f\x06ر.إ.\x03JM$\x09د.أ.\u200f\x0cف.ج.ق.\u200f\x09د.ك.\u200f\x03KY" + + "$\x09ل.ل.\u200f\x09د.ل.\u200f\x09د.م.\u200f\x09أ.م.\u200f\x09ر.ع.\u200f" + + "\x06ر.ب.\x09ر.ق.\u200f\x09ر.س.\u200f\x03SB$\x09د.س.\u200f\x06ج.س.\x03SR$" + + "\x09ج.ج.س.\x09ل.س.\u200f\x09د.ت.\u200f\x06ل.ت.\x03TT$\x03UY$\x09ر.ي." + + "\u200f\x03Fdj\x03Nfk\x01S\x04GB£\x03TSh\x03₼\x03S£\x04Bds$\x03BD$\x02B$" + + "\x04CUC$\x03$MN\x03RD$\x04FK£\x02G$\x04Íkr\x02J$\x03CI$\x02L$\x02N$\x07р" + + "уб.\x03SI$\x02S$\x02$U\x05лв.\x06щ.д.\x02$A\x03$CA\x04£ E\x05£ RU\x04$ " + + "HK\x03£L\x04$ ZN\x03$ T\x04$ SU\x04din.\x04КМ\x04Кч\x04зл\x07дин.\x04Тл" + + "\x01F\x03USh\x04Kčs\x03ECU\x02TK\x03kr.\x03Ksh\x03öS\x03BGK\x03BGJ\x04Cu" + + "b$\x02DM\x04Fl£\x04F.G.\x02FC\x04F.Rw\x03Nu.\x05KR₩\x05TH฿\x06Δρχ\x02Tk" + + "\x02$b\x02Kr\x05ل.ل\x02Gs\x03CFP\x03FBu\x01D\x04MOP$\x02MK\x02SR\x02Le" + + "\x04NAf.\x01E\x02VT\x03WS$\x03BsF\x02Af\x03Naf\x02$a\x04Afl.\x02Br\x02TL" + + "\x03B/.\x03S/.\x03Gs.\x03Bs.\x02؋\x04¥CN\x03$HK\x08ریال\x03$MX\x03$NZ" + + "\x03$EC\x02UM\x02mk\x03$AR\x03$AU\x02FB\x03$BM\x03$BN\x03$BS\x03$BZ\x03$" + + "CL\x03$CO\x04£CY\x03£E\x03$FJ\x04£FK\x04£GB\x04£GI\x04£IE\x04£IL\x05₤IT" + + "\x04£LB\x04£MT\x03$NA\x02$C\x03$RH\x02FR\x03$SB\x03$SG\x03$SR\x03$TT\x03" + + "$US\x03$UY\x04FCFP\x02Kw\x05$\u00a0AU\x05$\u00a0HK\x05$\u00a0NZ\x05$" + + "\u00a0SG\x05$\u00a0US\x02DA\x01G\x02LS\x02DT\x02$R\x04¥JP\x03$NT\x07રૂ." + + "\x06ל״י\x03₨\x02֏\x03NKr\x03元\x03¥\x03\u200b\x04БД\x05КД$\x02LE\x02Kn" + + "\x06сом\x02zl\x02rb\x03MTn\x06ден\x12ဒေါ်လာ\x12စီအာစီ\x0cनेरू\x02ر\x04Es" + + "c.\x06\u200bPTE\x04XXXX\x06ТМТ\x03Dkr\x03Skr\x03Nkr\x07රු.\x0fසිෆ්එ\x03N" + + "IS\x05Lekë\x03den\x05[BGN]\x05[BYR]\x06руб\x02r.\x03rub\x03BR$\x03Ekr" + + "\x04EG£\x03Ikr\x03Rs.\x04AUD$\x04NZD$\x07крб.\x05soʻm\x06сўм\x03ILS\x03₩" + + "\x02P.\x03Zł" + +type curToIndex struct { + cur uint16 + idx uint16 +} + +var normalLangIndex = []uint16{ // 743 elements + // Entry 0 - 3F + 0x0000, 0x0014, 0x0014, 0x0014, 0x0017, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0019, 0x0019, 0x001c, 0x001c, 0x0038, 0x0038, 0x0038, + 0x0038, 0x0039, 0x0039, 0x0039, 0x0039, 0x003a, 0x003a, 0x003a, + 0x003a, 0x003a, 0x003a, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, + 0x003b, 0x003b, 0x003b, 0x003b, 0x003c, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003f, 0x003f, 0x0042, 0x0042, + 0x0044, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x004c, + 0x004c, 0x004d, 0x004d, 0x004e, 0x004e, 0x005f, 0x005f, 0x005f, + // Entry 40 - 7F + 0x005f, 0x005f, 0x0061, 0x0061, 0x0061, 0x0062, 0x0062, 0x0063, + 0x0071, 0x0071, 0x0071, 0x0071, 0x0082, 0x0088, 0x0088, 0x0088, + 0x0088, 0x0091, 0x0091, 0x0091, 0x0092, 0x0092, 0x0093, 0x0093, + 0x0094, 0x0094, 0x0095, 0x0095, 0x0095, 0x0095, 0x0095, 0x009c, + 0x009c, 0x009d, 0x009d, 0x009f, 0x009f, 0x00a3, 0x00a3, 0x00a3, + 0x00a4, 0x00a4, 0x00ac, 0x00ac, 0x00ac, 0x00ad, 0x00ad, 0x00ae, + 0x00af, 0x00af, 0x00af, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, + 0x00b4, 0x00b4, 0x00ba, 0x00ba, 0x00bb, 0x00bb, 0x00be, 0x00be, + // Entry 80 - BF + 0x00be, 0x00c1, 0x00c1, 0x00c1, 0x00c3, 0x00c5, 0x00c5, 0x00c6, + 0x00c7, 0x00c7, 0x00c7, 0x00dc, 0x00dd, 0x00dd, 0x00de, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e4, 0x00e5, 0x00e5, + 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00e9, + 0x00ea, 0x00ec, 0x00ec, 0x00ec, 0x00ed, 0x00ed, 0x00ee, 0x00f0, + 0x00f1, 0x00f1, 0x00f2, 0x00f2, 0x00f2, 0x00f2, 0x00f2, 0x00f2, + 0x00f2, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, + 0x00f9, 0x00fa, 0x00fb, 0x00fb, 0x00fc, 0x00fc, 0x00fd, 0x00fe, + // Entry C0 - FF + 0x00ff, 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0104, 0x0105, + 0x0106, 0x0107, 0x0108, 0x0109, 0x010a, 0x010b, 0x010b, 0x010b, + 0x010c, 0x010d, 0x010e, 0x010e, 0x010f, 0x0110, 0x0112, 0x0112, + 0x0113, 0x0115, 0x0116, 0x0117, 0x0117, 0x0118, 0x0119, 0x011a, + 0x011b, 0x011c, 0x011d, 0x011d, 0x011d, 0x011e, 0x011e, 0x011e, + 0x011f, 0x0120, 0x0121, 0x0122, 0x0122, 0x0122, 0x0122, 0x0134, + 0x0134, 0x0139, 0x013b, 0x013c, 0x013e, 0x0140, 0x0141, 0x0143, + 0x0145, 0x0145, 0x0146, 0x0146, 0x0147, 0x0148, 0x0149, 0x0149, + // Entry 100 - 13F + 0x0152, 0x0153, 0x0154, 0x0155, 0x0156, 0x0157, 0x0158, 0x0159, + 0x015b, 0x015d, 0x015e, 0x0163, 0x0163, 0x0165, 0x0165, 0x0165, + 0x0165, 0x0170, 0x0170, 0x0170, 0x0170, 0x0170, 0x0171, 0x0172, + 0x0172, 0x0183, 0x0183, 0x0187, 0x0187, 0x0188, 0x0189, 0x0189, + 0x01af, 0x01af, 0x01af, 0x01b0, 0x01b0, 0x01b0, 0x01d0, 0x01d1, + 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d2, 0x01d3, 0x01d3, + 0x01d3, 0x01d3, 0x01d4, 0x01d4, 0x01d4, 0x01d5, 0x01d6, 0x01d8, + 0x01d8, 0x01d8, 0x01d8, 0x01d9, 0x01d9, 0x01d9, 0x01da, 0x01db, + // Entry 140 - 17F + 0x01db, 0x01db, 0x01db, 0x01db, 0x01db, 0x01dc, 0x01dd, 0x01dd, + 0x01de, 0x01de, 0x01de, 0x01df, 0x01e0, 0x01e0, 0x01e0, 0x01e0, + 0x01e0, 0x01e6, 0x01e6, 0x01e9, 0x01e9, 0x01eb, 0x01eb, 0x01f5, + 0x01f5, 0x01f8, 0x01f8, 0x01f8, 0x01f8, 0x01f9, 0x01f9, 0x01f9, + 0x01fa, 0x01fa, 0x01fa, 0x01fa, 0x01fb, 0x01fc, 0x01fc, 0x01fc, + 0x01fd, 0x01fd, 0x0200, 0x0200, 0x0202, 0x0202, 0x0214, 0x0215, + 0x0215, 0x021a, 0x021a, 0x022c, 0x022c, 0x022f, 0x022f, 0x0233, + 0x0233, 0x0234, 0x0234, 0x0235, 0x0235, 0x0241, 0x0241, 0x0248, + // Entry 180 - 1BF + 0x0248, 0x0248, 0x0248, 0x0248, 0x024d, 0x024d, 0x024d, 0x024d, + 0x024d, 0x024e, 0x024e, 0x024e, 0x0257, 0x0257, 0x0258, 0x0258, + 0x0258, 0x0259, 0x0259, 0x0259, 0x025a, 0x025a, 0x025d, 0x025d, + 0x025d, 0x025d, 0x025e, 0x025e, 0x0264, 0x0264, 0x0264, 0x0264, + 0x0265, 0x0265, 0x0266, 0x0266, 0x0269, 0x0269, 0x026b, 0x026b, + 0x026d, 0x026d, 0x026d, 0x026d, 0x026d, 0x026d, 0x026d, 0x026e, + 0x026e, 0x026e, 0x026e, 0x026e, 0x026e, 0x026e, 0x026e, 0x026e, + 0x027d, 0x027d, 0x027e, 0x027e, 0x0283, 0x0283, 0x0284, 0x0284, + // Entry 1C0 - 1FF + 0x0285, 0x0285, 0x0286, 0x0287, 0x0287, 0x0287, 0x0287, 0x0289, + 0x0289, 0x0289, 0x0289, 0x0289, 0x029c, 0x029c, 0x029d, 0x029d, + 0x029e, 0x029e, 0x029f, 0x029f, 0x02a4, 0x02a4, 0x02a5, 0x02a5, + 0x02a6, 0x02a7, 0x02a7, 0x02a8, 0x02a8, 0x02a9, 0x02a9, 0x02aa, + 0x02aa, 0x02aa, 0x02aa, 0x02b6, 0x02b6, 0x02b9, 0x02b9, 0x02bc, + 0x02bc, 0x02be, 0x02be, 0x02c2, 0x02c3, 0x02c3, 0x02c4, 0x02c4, + 0x02c4, 0x02c4, 0x02c4, 0x02c7, 0x02c7, 0x02c8, 0x02c8, 0x02c8, + 0x02c9, 0x02c9, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02dd, + // Entry 200 - 23F + 0x02dd, 0x02dd, 0x02e3, 0x02e4, 0x02e4, 0x02e5, 0x02e6, 0x02e6, + 0x02e7, 0x02e8, 0x02e8, 0x02e8, 0x02e9, 0x02e9, 0x02e9, 0x02e9, + 0x02e9, 0x02e9, 0x02e9, 0x02e9, 0x02eb, 0x02eb, 0x02eb, 0x02ec, + 0x02ec, 0x02ed, 0x02ed, 0x02ee, 0x02ee, 0x02ee, 0x02ef, 0x02ef, + 0x02f0, 0x02f1, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x02f2, 0x0301, + 0x0301, 0x0301, 0x0301, 0x0302, 0x0302, 0x0305, 0x0306, 0x0306, + 0x0308, 0x0308, 0x0309, 0x030a, 0x030b, 0x030c, 0x030c, 0x030d, + 0x030f, 0x0311, 0x0311, 0x0311, 0x0311, 0x0312, 0x0312, 0x0323, + // Entry 240 - 27F + 0x0324, 0x0324, 0x0325, 0x0325, 0x032d, 0x032f, 0x0330, 0x0331, + 0x0332, 0x0332, 0x0332, 0x0333, 0x0333, 0x0334, 0x0334, 0x0335, + 0x0335, 0x0336, 0x0336, 0x0337, 0x0337, 0x0337, 0x033b, 0x033b, + 0x033b, 0x033d, 0x033e, 0x033e, 0x033e, 0x033e, 0x033e, 0x033e, + 0x033e, 0x033e, 0x033e, 0x033e, 0x033e, 0x0341, 0x0341, 0x034f, + 0x034f, 0x0353, 0x0353, 0x0353, 0x0353, 0x0353, 0x0353, 0x0353, + 0x0353, 0x0353, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357, 0x0357, + 0x0359, 0x0359, 0x035a, 0x035a, 0x0362, 0x0362, 0x0362, 0x0362, + // Entry 280 - 2BF + 0x0362, 0x0362, 0x036a, 0x036a, 0x036a, 0x036a, 0x036a, 0x036a, + 0x036a, 0x036a, 0x0381, 0x0381, 0x0381, 0x0381, 0x0384, 0x0385, + 0x0385, 0x0385, 0x0386, 0x0386, 0x0389, 0x0389, 0x038a, 0x038c, + 0x038f, 0x0391, 0x0391, 0x0392, 0x0393, 0x0393, 0x0395, 0x0395, + 0x0396, 0x0397, 0x0397, 0x0397, 0x0399, 0x0399, 0x0399, 0x039c, + 0x039c, 0x03a1, 0x03a1, 0x03a1, 0x03a1, 0x03a1, 0x03a1, 0x03a1, + 0x03a1, 0x03a3, 0x03a3, 0x03b6, 0x03b6, 0x03b9, 0x03ba, 0x03ba, + 0x03bb, 0x03bc, 0x03bc, 0x03be, 0x03be, 0x03be, 0x03be, 0x03bf, + // Entry 2C0 - 2FF + 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c0, 0x03c2, 0x03c2, 0x03c2, + 0x03c2, 0x03c3, 0x03c3, 0x03c3, 0x03c5, 0x03c5, 0x03c5, 0x03c5, + 0x03c6, 0x03c6, 0x03c6, 0x03c6, 0x03c6, 0x03c6, 0x03c7, 0x03c7, + 0x03c7, 0x03c7, 0x03c7, 0x03cb, 0x03cb, 0x03cb, 0x03cc, 0x03ce, + 0x03d0, 0x03d4, 0x03d6, 0x03d7, 0x03d7, 0x03d9, 0x03d9, +} // Size: 1510 bytes + +var normalSymIndex = []curToIndex{ // 985 elements + 0: {cur: 0x13, idx: 0x6}, + 1: {cur: 0x2e, idx: 0x13}, + 2: {cur: 0x39, idx: 0x1c}, + 3: {cur: 0x42, idx: 0x20}, + 4: {cur: 0x5c, idx: 0x3b}, + 5: {cur: 0x61, idx: 0x3f}, + 6: {cur: 0x70, idx: 0x47}, + 7: {cur: 0x7a, idx: 0x56}, + 8: {cur: 0x7b, idx: 0x5a}, + 9: {cur: 0x83, idx: 0x5e}, + 10: {cur: 0x8b, idx: 0x6a}, + 11: {cur: 0xb0, idx: 0x8c}, + 12: {cur: 0xbe, idx: 0x9a}, + 13: {cur: 0xf3, idx: 0xbf}, + 14: {cur: 0xf9, idx: 0xc7}, + 15: {cur: 0x102, idx: 0xcb}, + 16: {cur: 0x106, idx: 0xcf}, + 17: {cur: 0x10d, idx: 0xd4}, + 18: {cur: 0x112, idx: 0xd8}, + 19: {cur: 0x114, idx: 0xdc}, + 20: {cur: 0xb0, idx: 0x0}, + 21: {cur: 0xe8, idx: 0xb4}, + 22: {cur: 0x122, idx: 0xe1}, + 23: {cur: 0xb7, idx: 0x4}, + 24: {cur: 0x65, idx: 0xe6}, + 25: {cur: 0x13, idx: 0xec}, + 26: {cur: 0x5b, idx: 0xf0}, + 27: {cur: 0xe8, idx: 0xb4}, + 28: {cur: 0x0, idx: 0xf7}, + 29: {cur: 0x2, idx: 0xfb}, + 30: {cur: 0x13, idx: 0xec}, + 31: {cur: 0x23, idx: 0x10d}, + 32: {cur: 0x52, idx: 0x137}, + 33: {cur: 0x56, idx: 0x141}, + 34: {cur: 0x76, idx: 0x158}, + 35: {cur: 0x7c, idx: 0x161}, + 36: {cur: 0x7d, idx: 0x16b}, + 37: {cur: 0x82, idx: 0x176}, + 38: {cur: 0x87, idx: 0x180}, + 39: {cur: 0x8c, idx: 0x18d}, + 40: {cur: 0x90, idx: 0x19b}, + 41: {cur: 0x9b, idx: 0x1a5}, + 42: {cur: 0x9c, idx: 0x1af}, + 43: {cur: 0xa9, idx: 0x1b9}, + 44: {cur: 0xbf, idx: 0x1c3}, + 45: {cur: 0xc6, idx: 0x1cd}, + 46: {cur: 0xcb, idx: 0x1d4}, + 47: {cur: 0xd3, idx: 0x1de}, + 48: {cur: 0xd6, idx: 0x1ec}, + 49: {cur: 0xd7, idx: 0x1f6}, + 50: {cur: 0xe2, idx: 0x201}, + 51: {cur: 0xe6, idx: 0x20b}, + 52: {cur: 0xe8, idx: 0xb4}, + 53: {cur: 0xed, idx: 0x215}, + 54: {cur: 0xf1, idx: 0x21f}, + 55: {cur: 0x11c, idx: 0x22e}, + 56: {cur: 0x4f, idx: 0x238}, + 57: {cur: 0x57, idx: 0x23c}, + 58: {cur: 0xd7, idx: 0x0}, + 59: {cur: 0xdf, idx: 0x240}, + 60: {cur: 0x61, idx: 0x242}, + 61: {cur: 0xe2, idx: 0x3f}, + 62: {cur: 0xf4, idx: 0x247}, + 63: {cur: 0x83, idx: 0x25}, + 64: {cur: 0xe8, idx: 0xb4}, + 65: {cur: 0xf9, idx: 0x4}, + 66: {cur: 0x16, idx: 0x24b}, + 67: {cur: 0xe8, idx: 0xb4}, + 68: {cur: 0x16, idx: 0x24b}, + 69: {cur: 0x2e, idx: 0x0}, + 70: {cur: 0x37, idx: 0x18}, + 71: {cur: 0x39, idx: 0x0}, + 72: {cur: 0x83, idx: 0x25}, + 73: {cur: 0xbe, idx: 0x0}, + 74: {cur: 0xd0, idx: 0xaa}, + 75: {cur: 0xf9, idx: 0x4}, + 76: {cur: 0x124, idx: 0x86}, + 77: {cur: 0xf4, idx: 0x247}, + 78: {cur: 0x13, idx: 0x0}, + 79: {cur: 0x21, idx: 0x298}, + 80: {cur: 0x2e, idx: 0x0}, + 81: {cur: 0x39, idx: 0x0}, + 82: {cur: 0x42, idx: 0x0}, + 83: {cur: 0x61, idx: 0x0}, + 84: {cur: 0x70, idx: 0x0}, + 85: {cur: 0x7a, idx: 0x0}, + 86: {cur: 0x7b, idx: 0x0}, + 87: {cur: 0x83, idx: 0x0}, + 88: {cur: 0x8b, idx: 0x0}, + 89: {cur: 0xb0, idx: 0x0}, + 90: {cur: 0xbe, idx: 0x0}, + 91: {cur: 0xf3, idx: 0x0}, + 92: {cur: 0xf9, idx: 0x29e}, + 93: {cur: 0x102, idx: 0x0}, + 94: {cur: 0x10d, idx: 0x0}, + 95: {cur: 0x1b, idx: 0xc}, + 96: {cur: 0xe8, idx: 0xb4}, + 97: {cur: 0x42, idx: 0x25}, + 98: {cur: 0x42, idx: 0x20}, + 99: {cur: 0x13, idx: 0x2a5}, + 100: {cur: 0x2e, idx: 0x0}, + 101: {cur: 0x39, idx: 0x2a8}, + 102: {cur: 0x42, idx: 0x0}, + 103: {cur: 0x61, idx: 0x2b1}, + 104: {cur: 0x70, idx: 0x2b7}, + 105: {cur: 0x7a, idx: 0x0}, + 106: {cur: 0x83, idx: 0x0}, + 107: {cur: 0x8b, idx: 0x0}, + 108: {cur: 0xbe, idx: 0x2c0}, + 109: {cur: 0xf3, idx: 0x0}, + 110: {cur: 0xf9, idx: 0x2c9}, + 111: {cur: 0x102, idx: 0x0}, + 112: {cur: 0x10d, idx: 0x0}, + 113: {cur: 0x13, idx: 0x0}, + 114: {cur: 0x18, idx: 0x9}, + 115: {cur: 0x2e, idx: 0x0}, + 116: {cur: 0x39, idx: 0x0}, + 117: {cur: 0x42, idx: 0x0}, + 118: {cur: 0x61, idx: 0x0}, + 119: {cur: 0x70, idx: 0x0}, + 120: {cur: 0x73, idx: 0x4d}, + 121: {cur: 0x7a, idx: 0x0}, + 122: {cur: 0x83, idx: 0x25}, + 123: {cur: 0xb0, idx: 0x0}, + 124: {cur: 0xbe, idx: 0x0}, + 125: {cur: 0xcf, idx: 0x2ce}, + 126: {cur: 0xe8, idx: 0xb4}, + 127: {cur: 0xf9, idx: 0x0}, + 128: {cur: 0x10d, idx: 0x0}, + 129: {cur: 0x114, idx: 0x0}, + 130: {cur: 0x18, idx: 0x2d3}, + 131: {cur: 0x4c, idx: 0x2d8}, + 132: {cur: 0x83, idx: 0x25}, + 133: {cur: 0xc7, idx: 0x2dd}, + 134: {cur: 0xcf, idx: 0x2e2}, + 135: {cur: 0xf1, idx: 0x2ea}, + 136: {cur: 0x13, idx: 0xec}, + 137: {cur: 0x2e, idx: 0x0}, + 138: {cur: 0x39, idx: 0x0}, + 139: {cur: 0x42, idx: 0x25}, + 140: {cur: 0x5a, idx: 0x37}, + 141: {cur: 0xb0, idx: 0x0}, + 142: {cur: 0xe8, idx: 0xb4}, + 143: {cur: 0xf9, idx: 0x0}, + 144: {cur: 0x10d, idx: 0x0}, + 145: {cur: 0x60, idx: 0x2ef}, + 146: {cur: 0xd0, idx: 0xaa}, + 147: {cur: 0xf8, idx: 0x2f1}, + 148: {cur: 0xf9, idx: 0x4}, + 149: {cur: 0x13, idx: 0xec}, + 150: {cur: 0x47, idx: 0x2f5}, + 151: {cur: 0x4c, idx: 0x2c}, + 152: {cur: 0x7a, idx: 0x0}, + 153: {cur: 0x7b, idx: 0x0}, + 154: {cur: 0x102, idx: 0x0}, + 155: {cur: 0x10f, idx: 0x2fa}, + 156: {cur: 0xd0, idx: 0xaa}, + 157: {cur: 0x8b, idx: 0x0}, + 158: {cur: 0xe8, idx: 0xb4}, + 159: {cur: 0x13, idx: 0xec}, + 160: {cur: 0x50, idx: 0x301}, + 161: {cur: 0xe8, idx: 0xb4}, + 162: {cur: 0xf9, idx: 0x4}, + 163: {cur: 0x84, idx: 0x305}, + 164: {cur: 0x12, idx: 0x309}, + 165: {cur: 0x13, idx: 0xec}, + 166: {cur: 0x20, idx: 0x30d}, + 167: {cur: 0x22, idx: 0x311}, + 168: {cur: 0x4e, idx: 0x31a}, + 169: {cur: 0x83, idx: 0x25}, + 170: {cur: 0xe8, idx: 0xb4}, + 171: {cur: 0xf9, idx: 0x4}, + 172: {cur: 0x5c, idx: 0x0}, + 173: {cur: 0x5c, idx: 0x0}, + 174: {cur: 0x97, idx: 0x2ef}, + 175: {cur: 0x13, idx: 0x0}, + 176: {cur: 0x83, idx: 0x25}, + 177: {cur: 0xc7, idx: 0xa2}, + 178: {cur: 0xe8, idx: 0xb4}, + 179: {cur: 0xf9, idx: 0x4}, + 180: {cur: 0x13, idx: 0xec}, + 181: {cur: 0x33, idx: 0x32f}, + 182: {cur: 0x7a, idx: 0x0}, + 183: {cur: 0x8b, idx: 0x333}, + 184: {cur: 0xe8, idx: 0x339}, + 185: {cur: 0x106, idx: 0x0}, + 186: {cur: 0x84, idx: 0x305}, + 187: {cur: 0x13, idx: 0xec}, + 188: {cur: 0x65, idx: 0xe6}, + 189: {cur: 0xe8, idx: 0xb4}, + 190: {cur: 0x6b, idx: 0x33f}, + 191: {cur: 0xe8, idx: 0xb4}, + 192: {cur: 0xf9, idx: 0x4}, + 193: {cur: 0x83, idx: 0x25}, + 194: {cur: 0xf9, idx: 0x4}, + 195: {cur: 0x83, idx: 0x5e}, + 196: {cur: 0xf9, idx: 0xc7}, + 197: {cur: 0x10d, idx: 0x4}, + 198: {cur: 0x10d, idx: 0x4}, + 199: {cur: 0x13, idx: 0x4}, + 200: {cur: 0x2e, idx: 0x0}, + 201: {cur: 0x39, idx: 0x0}, + 202: {cur: 0x42, idx: 0x0}, + 203: {cur: 0x5c, idx: 0x0}, + 204: {cur: 0x61, idx: 0x0}, + 205: {cur: 0x70, idx: 0x0}, + 206: {cur: 0x7a, idx: 0x0}, + 207: {cur: 0x7b, idx: 0x0}, + 208: {cur: 0x83, idx: 0x0}, + 209: {cur: 0x8b, idx: 0x0}, + 210: {cur: 0xb0, idx: 0x0}, + 211: {cur: 0xbe, idx: 0x0}, + 212: {cur: 0xd5, idx: 0x7a}, + 213: {cur: 0xf3, idx: 0x0}, + 214: {cur: 0xf9, idx: 0x0}, + 215: {cur: 0x102, idx: 0x0}, + 216: {cur: 0x106, idx: 0x0}, + 217: {cur: 0x10d, idx: 0x0}, + 218: {cur: 0x112, idx: 0x0}, + 219: {cur: 0x114, idx: 0x358}, + 220: {cur: 0x1a, idx: 0x4}, + 221: {cur: 0x24, idx: 0x35c}, + 222: {cur: 0x25, idx: 0x4}, + 223: {cur: 0x32, idx: 0x4}, + 224: {cur: 0x35, idx: 0x16}, + 225: {cur: 0x38, idx: 0x4}, + 226: {cur: 0x39, idx: 0x4}, + 227: {cur: 0x13, idx: 0x4}, + 228: {cur: 0xbe, idx: 0x4}, + 229: {cur: 0x13, idx: 0x4}, + 230: {cur: 0x50, idx: 0x301}, + 231: {cur: 0x10d, idx: 0x4}, + 232: {cur: 0x57, idx: 0x23c}, + 233: {cur: 0x5e, idx: 0x4}, + 234: {cur: 0x5f, idx: 0x3f}, + 235: {cur: 0x61, idx: 0x242}, + 236: {cur: 0x10d, idx: 0x4}, + 237: {cur: 0x65, idx: 0xe6}, + 238: {cur: 0x61, idx: 0x242}, + 239: {cur: 0x66, idx: 0x3f}, + 240: {cur: 0x67, idx: 0x360}, + 241: {cur: 0x6f, idx: 0x4}, + 242: {cur: 0x81, idx: 0x4}, + 243: {cur: 0x84, idx: 0x305}, + 244: {cur: 0x13, idx: 0x4}, + 245: {cur: 0x10d, idx: 0x4}, + 246: {cur: 0x8d, idx: 0x4}, + 247: {cur: 0x10d, idx: 0x4}, + 248: {cur: 0x92, idx: 0x4}, + 249: {cur: 0x122, idx: 0xe1}, + 250: {cur: 0xa1, idx: 0x83}, + 251: {cur: 0xa8, idx: 0x362}, + 252: {cur: 0x10d, idx: 0x4}, + 253: {cur: 0x61, idx: 0x242}, + 254: {cur: 0xac, idx: 0x7a}, + 255: {cur: 0xaf, idx: 0x367}, + 256: {cur: 0xb3, idx: 0x90}, + 257: {cur: 0xb7, idx: 0x4}, + 258: {cur: 0x13, idx: 0x4}, + 259: {cur: 0xb8, idx: 0x93}, + 260: {cur: 0x13, idx: 0x4}, + 261: {cur: 0xbe, idx: 0x4}, + 262: {cur: 0xbe, idx: 0x4}, + 263: {cur: 0xc4, idx: 0x86}, + 264: {cur: 0xc5, idx: 0x9e}, + 265: {cur: 0xc6, idx: 0x7a}, + 266: {cur: 0xbe, idx: 0x4}, + 267: {cur: 0xd2, idx: 0xae}, + 268: {cur: 0xd4, idx: 0x4}, + 269: {cur: 0xd5, idx: 0x36a}, + 270: {cur: 0xd9, idx: 0x30}, + 271: {cur: 0xda, idx: 0x4}, + 272: {cur: 0x61, idx: 0x242}, + 273: {cur: 0xdb, idx: 0x3f}, + 274: {cur: 0xde, idx: 0x36d}, + 275: {cur: 0x61, idx: 0x242}, + 276: {cur: 0xe2, idx: 0x3f}, + 277: {cur: 0x8, idx: 0x370}, + 278: {cur: 0xe7, idx: 0x375}, + 279: {cur: 0xbe, idx: 0x4}, + 280: {cur: 0xee, idx: 0xb8}, + 281: {cur: 0xf2, idx: 0x4}, + 282: {cur: 0x13, idx: 0x4}, + 283: {cur: 0xf4, idx: 0x247}, + 284: {cur: 0xf8, idx: 0x2f1}, + 285: {cur: 0x10d, idx: 0x4}, + 286: {cur: 0x104, idx: 0x377}, + 287: {cur: 0x105, idx: 0x37a}, + 288: {cur: 0x122, idx: 0xe1}, + 289: {cur: 0x124, idx: 0x86}, + 290: {cur: 0x13, idx: 0x0}, + 291: {cur: 0x2e, idx: 0x0}, + 292: {cur: 0x42, idx: 0x0}, + 293: {cur: 0x5a, idx: 0x37}, + 294: {cur: 0x61, idx: 0x0}, + 295: {cur: 0x70, idx: 0x0}, + 296: {cur: 0x7a, idx: 0x0}, + 297: {cur: 0x7b, idx: 0x0}, + 298: {cur: 0x83, idx: 0x0}, + 299: {cur: 0x8b, idx: 0x0}, + 300: {cur: 0xb0, idx: 0x0}, + 301: {cur: 0xbe, idx: 0x0}, + 302: {cur: 0xe8, idx: 0xb4}, + 303: {cur: 0xf3, idx: 0x0}, + 304: {cur: 0xf9, idx: 0x4}, + 305: {cur: 0x106, idx: 0x0}, + 306: {cur: 0x10d, idx: 0x0}, + 307: {cur: 0x112, idx: 0x0}, + 308: {cur: 0x39, idx: 0x0}, + 309: {cur: 0x5c, idx: 0x0}, + 310: {cur: 0xe8, idx: 0x0}, + 311: {cur: 0xf9, idx: 0x0}, + 312: {cur: 0x102, idx: 0x0}, + 313: {cur: 0x11, idx: 0x4}, + 314: {cur: 0xf9, idx: 0xc7}, + 315: {cur: 0x27, idx: 0x10}, + 316: {cur: 0x40, idx: 0x4}, + 317: {cur: 0xf9, idx: 0xc7}, + 318: {cur: 0x43, idx: 0x4}, + 319: {cur: 0xf9, idx: 0xc7}, + 320: {cur: 0x45, idx: 0x28}, + 321: {cur: 0x49, idx: 0x4}, + 322: {cur: 0xf9, idx: 0xc7}, + 323: {cur: 0x51, idx: 0x268}, + 324: {cur: 0xf9, idx: 0xc7}, + 325: {cur: 0xf9, idx: 0x4}, + 326: {cur: 0x106, idx: 0xcf}, + 327: {cur: 0x6c, idx: 0x45}, + 328: {cur: 0x71, idx: 0x4b}, + 329: {cur: 0x4, idx: 0x382}, + 330: {cur: 0x8, idx: 0x385}, + 331: {cur: 0x9, idx: 0x1}, + 332: {cur: 0x11, idx: 0x389}, + 333: {cur: 0x13, idx: 0xec}, + 334: {cur: 0x14, idx: 0x38c}, + 335: {cur: 0x42, idx: 0x20}, + 336: {cur: 0xb0, idx: 0x4}, + 337: {cur: 0x114, idx: 0x0}, + 338: {cur: 0xba, idx: 0x97}, + 339: {cur: 0xc0, idx: 0x397}, + 340: {cur: 0xc2, idx: 0x39b}, + 341: {cur: 0xc5, idx: 0x9e}, + 342: {cur: 0xf9, idx: 0x4}, + 343: {cur: 0xca, idx: 0x39f}, + 344: {cur: 0xf9, idx: 0x4}, + 345: {cur: 0x83, idx: 0x25}, + 346: {cur: 0xf9, idx: 0x4}, + 347: {cur: 0xf9, idx: 0xc7}, + 348: {cur: 0xfe, idx: 0x4}, + 349: {cur: 0x101, idx: 0x3a3}, + 350: {cur: 0x13, idx: 0xec}, + 351: {cur: 0x55, idx: 0x30}, + 352: {cur: 0x83, idx: 0x25}, + 353: {cur: 0xe8, idx: 0xb4}, + 354: {cur: 0xf9, idx: 0x4}, + 355: {cur: 0x5a, idx: 0x37}, + 356: {cur: 0xe8, idx: 0xb4}, + 357: {cur: 0x4, idx: 0x3a7}, + 358: {cur: 0x39, idx: 0x2a8}, + 359: {cur: 0x42, idx: 0x3aa}, + 360: {cur: 0x70, idx: 0x3af}, + 361: {cur: 0x7d, idx: 0x3b3}, + 362: {cur: 0x83, idx: 0x25}, + 363: {cur: 0xb0, idx: 0x3bc}, + 364: {cur: 0xbe, idx: 0x3c0}, + 365: {cur: 0xe8, idx: 0xb4}, + 366: {cur: 0xf9, idx: 0x4}, + 367: {cur: 0x10d, idx: 0x3c4}, + 368: {cur: 0x68, idx: 0x42}, + 369: {cur: 0xa9, idx: 0x3c8}, + 370: {cur: 0x13, idx: 0x0}, + 371: {cur: 0x2e, idx: 0x0}, + 372: {cur: 0x39, idx: 0x0}, + 373: {cur: 0x42, idx: 0x0}, + 374: {cur: 0x5d, idx: 0x3cb}, + 375: {cur: 0x70, idx: 0x0}, + 376: {cur: 0x7a, idx: 0x0}, + 377: {cur: 0x7b, idx: 0x0}, + 378: {cur: 0x83, idx: 0x25}, + 379: {cur: 0x8b, idx: 0x0}, + 380: {cur: 0xb0, idx: 0x0}, + 381: {cur: 0xbe, idx: 0x0}, + 382: {cur: 0xf3, idx: 0x0}, + 383: {cur: 0xf9, idx: 0x4}, + 384: {cur: 0x102, idx: 0x0}, + 385: {cur: 0x10d, idx: 0x0}, + 386: {cur: 0x114, idx: 0x0}, + 387: {cur: 0x83, idx: 0x25}, + 388: {cur: 0xc5, idx: 0x9e}, + 389: {cur: 0xe8, idx: 0xb4}, + 390: {cur: 0xf9, idx: 0x4}, + 391: {cur: 0x50, idx: 0x30}, + 392: {cur: 0x50, idx: 0x301}, + 393: {cur: 0x11, idx: 0x3ce}, + 394: {cur: 0x13, idx: 0x3d2}, + 395: {cur: 0x1d, idx: 0x3d6}, + 396: {cur: 0x25, idx: 0x3d9}, + 397: {cur: 0x26, idx: 0x3dd}, + 398: {cur: 0x32, idx: 0x3e1}, + 399: {cur: 0x38, idx: 0x3e5}, + 400: {cur: 0x39, idx: 0x2a8}, + 401: {cur: 0x40, idx: 0x3e9}, + 402: {cur: 0x42, idx: 0x0}, + 403: {cur: 0x43, idx: 0x3ed}, + 404: {cur: 0x4b, idx: 0x3f1}, + 405: {cur: 0x5e, idx: 0x3fa}, + 406: {cur: 0x5f, idx: 0x3fe}, + 407: {cur: 0x60, idx: 0x2ef}, + 408: {cur: 0x61, idx: 0x403}, + 409: {cur: 0x66, idx: 0x408}, + 410: {cur: 0x70, idx: 0x0}, + 411: {cur: 0x77, idx: 0x40d}, + 412: {cur: 0x78, idx: 0x412}, + 413: {cur: 0x80, idx: 0x417}, + 414: {cur: 0x83, idx: 0x0}, + 415: {cur: 0x90, idx: 0x41d}, + 416: {cur: 0xab, idx: 0x422}, + 417: {cur: 0xb0, idx: 0x3bc}, + 418: {cur: 0xb7, idx: 0x427}, + 419: {cur: 0xbe, idx: 0x3c0}, + 420: {cur: 0xcc, idx: 0x42e}, + 421: {cur: 0xd4, idx: 0x435}, + 422: {cur: 0xda, idx: 0x439}, + 423: {cur: 0xe0, idx: 0x43d}, + 424: {cur: 0xf2, idx: 0x441}, + 425: {cur: 0xf3, idx: 0x0}, + 426: {cur: 0xf9, idx: 0x445}, + 427: {cur: 0xfe, idx: 0x449}, + 428: {cur: 0x105, idx: 0x37a}, + 429: {cur: 0x10d, idx: 0x0}, + 430: {cur: 0x114, idx: 0x44d}, + 431: {cur: 0x24, idx: 0x35c}, + 432: {cur: 0x11, idx: 0x0}, + 433: {cur: 0x13, idx: 0x455}, + 434: {cur: 0x25, idx: 0x0}, + 435: {cur: 0x26, idx: 0x0}, + 436: {cur: 0x32, idx: 0x0}, + 437: {cur: 0x38, idx: 0x0}, + 438: {cur: 0x39, idx: 0x4}, + 439: {cur: 0x40, idx: 0x0}, + 440: {cur: 0x42, idx: 0x20}, + 441: {cur: 0x43, idx: 0x0}, + 442: {cur: 0x5e, idx: 0x0}, + 443: {cur: 0x5f, idx: 0x0}, + 444: {cur: 0x61, idx: 0x3f}, + 445: {cur: 0x66, idx: 0x0}, + 446: {cur: 0x70, idx: 0x45b}, + 447: {cur: 0x7a, idx: 0x0}, + 448: {cur: 0x83, idx: 0x25}, + 449: {cur: 0x8b, idx: 0x0}, + 450: {cur: 0x90, idx: 0x0}, + 451: {cur: 0xb0, idx: 0x0}, + 452: {cur: 0xb7, idx: 0x0}, + 453: {cur: 0xbe, idx: 0x461}, + 454: {cur: 0xd4, idx: 0x0}, + 455: {cur: 0xda, idx: 0x467}, + 456: {cur: 0xe0, idx: 0x0}, + 457: {cur: 0xf2, idx: 0x0}, + 458: {cur: 0xf9, idx: 0x46d}, + 459: {cur: 0xfe, idx: 0x0}, + 460: {cur: 0x102, idx: 0x0}, + 461: {cur: 0x106, idx: 0x0}, + 462: {cur: 0x112, idx: 0x0}, + 463: {cur: 0x114, idx: 0x0}, + 464: {cur: 0x3a, idx: 0x327}, + 465: {cur: 0x4f, idx: 0x238}, + 466: {cur: 0x52, idx: 0x473}, + 467: {cur: 0x68, idx: 0x42}, + 468: {cur: 0x74, idx: 0x476}, + 469: {cur: 0x87, idx: 0x67}, + 470: {cur: 0x60, idx: 0x0}, + 471: {cur: 0x97, idx: 0x2ef}, + 472: {cur: 0xa1, idx: 0x83}, + 473: {cur: 0xa9, idx: 0x3c8}, + 474: {cur: 0xac, idx: 0x7a}, + 475: {cur: 0xd2, idx: 0xae}, + 476: {cur: 0xd5, idx: 0x36a}, + 477: {cur: 0xe6, idx: 0x478}, + 478: {cur: 0xed, idx: 0x47b}, + 479: {cur: 0x104, idx: 0x377}, + 480: {cur: 0x13, idx: 0xec}, + 481: {cur: 0x39, idx: 0x97}, + 482: {cur: 0x5e, idx: 0x14b}, + 483: {cur: 0xd4, idx: 0x28e}, + 484: {cur: 0xe8, idx: 0xb4}, + 485: {cur: 0x114, idx: 0x0}, + 486: {cur: 0x83, idx: 0x25}, + 487: {cur: 0xe8, idx: 0xb4}, + 488: {cur: 0xf9, idx: 0x4}, + 489: {cur: 0xe8, idx: 0xb4}, + 490: {cur: 0xf9, idx: 0x4}, + 491: {cur: 0x13, idx: 0x2a5}, + 492: {cur: 0x2e, idx: 0x47e}, + 493: {cur: 0x39, idx: 0x2a8}, + 494: {cur: 0x5a, idx: 0x37}, + 495: {cur: 0x70, idx: 0x3af}, + 496: {cur: 0x83, idx: 0x481}, + 497: {cur: 0xb0, idx: 0x3bc}, + 498: {cur: 0xe8, idx: 0xb4}, + 499: {cur: 0xf3, idx: 0x486}, + 500: {cur: 0xf9, idx: 0x4}, + 501: {cur: 0x12, idx: 0x309}, + 502: {cur: 0x83, idx: 0x25}, + 503: {cur: 0xf9, idx: 0x4}, + 504: {cur: 0xe8, idx: 0xb4}, + 505: {cur: 0x84, idx: 0x305}, + 506: {cur: 0xb8, idx: 0x93}, + 507: {cur: 0x65, idx: 0xe6}, + 508: {cur: 0xf9, idx: 0x4}, + 509: {cur: 0x78, idx: 0x492}, + 510: {cur: 0xe8, idx: 0xb4}, + 511: {cur: 0xf9, idx: 0x4}, + 512: {cur: 0xe8, idx: 0xb4}, + 513: {cur: 0xf9, idx: 0x4}, + 514: {cur: 0x13, idx: 0x0}, + 515: {cur: 0x2e, idx: 0x0}, + 516: {cur: 0x39, idx: 0x0}, + 517: {cur: 0x42, idx: 0x0}, + 518: {cur: 0x5c, idx: 0x0}, + 519: {cur: 0x61, idx: 0x0}, + 520: {cur: 0x70, idx: 0x0}, + 521: {cur: 0x7a, idx: 0x0}, + 522: {cur: 0x7b, idx: 0x0}, + 523: {cur: 0x83, idx: 0x0}, + 524: {cur: 0x8b, idx: 0x0}, + 525: {cur: 0xb0, idx: 0x0}, + 526: {cur: 0xbe, idx: 0x0}, + 527: {cur: 0xf3, idx: 0x0}, + 528: {cur: 0xf9, idx: 0x0}, + 529: {cur: 0x102, idx: 0x0}, + 530: {cur: 0x10d, idx: 0x0}, + 531: {cur: 0x114, idx: 0x0}, + 532: {cur: 0x18, idx: 0x9}, + 533: {cur: 0x13, idx: 0x0}, + 534: {cur: 0x83, idx: 0x25}, + 535: {cur: 0xc7, idx: 0xa2}, + 536: {cur: 0xe8, idx: 0xb4}, + 537: {cur: 0xf9, idx: 0x4}, + 538: {cur: 0x13, idx: 0x0}, + 539: {cur: 0x2e, idx: 0x0}, + 540: {cur: 0x39, idx: 0x0}, + 541: {cur: 0x42, idx: 0x0}, + 542: {cur: 0x5c, idx: 0x0}, + 543: {cur: 0x61, idx: 0x0}, + 544: {cur: 0x70, idx: 0x0}, + 545: {cur: 0x75, idx: 0x50}, + 546: {cur: 0x7a, idx: 0x0}, + 547: {cur: 0x7b, idx: 0x0}, + 548: {cur: 0x83, idx: 0x25}, + 549: {cur: 0x8b, idx: 0x0}, + 550: {cur: 0xb0, idx: 0x0}, + 551: {cur: 0xbe, idx: 0x0}, + 552: {cur: 0xf3, idx: 0x0}, + 553: {cur: 0xf9, idx: 0x0}, + 554: {cur: 0x102, idx: 0x0}, + 555: {cur: 0x10d, idx: 0x0}, + 556: {cur: 0x7, idx: 0x49d}, + 557: {cur: 0xe8, idx: 0xb4}, + 558: {cur: 0xf9, idx: 0x4}, + 559: {cur: 0x13, idx: 0xec}, + 560: {cur: 0x76, idx: 0x53}, + 561: {cur: 0x7b, idx: 0x7a}, + 562: {cur: 0xe8, idx: 0xb4}, + 563: {cur: 0xb8, idx: 0x93}, + 564: {cur: 0x42, idx: 0x25}, + 565: {cur: 0x13, idx: 0x0}, + 566: {cur: 0x2e, idx: 0x0}, + 567: {cur: 0x39, idx: 0x0}, + 568: {cur: 0x5c, idx: 0x0}, + 569: {cur: 0x61, idx: 0x0}, + 570: {cur: 0x7b, idx: 0x0}, + 571: {cur: 0x8b, idx: 0x0}, + 572: {cur: 0xb0, idx: 0x0}, + 573: {cur: 0xbe, idx: 0x0}, + 574: {cur: 0xf3, idx: 0x0}, + 575: {cur: 0xf9, idx: 0x0}, + 576: {cur: 0x102, idx: 0x0}, + 577: {cur: 0x2e, idx: 0x0}, + 578: {cur: 0x70, idx: 0x0}, + 579: {cur: 0x83, idx: 0x0}, + 580: {cur: 0x8b, idx: 0x0}, + 581: {cur: 0xb0, idx: 0x0}, + 582: {cur: 0xe8, idx: 0xb4}, + 583: {cur: 0xf3, idx: 0x0}, + 584: {cur: 0x13, idx: 0xec}, + 585: {cur: 0x42, idx: 0x4a4}, + 586: {cur: 0x83, idx: 0x4a8}, + 587: {cur: 0xe8, idx: 0xb4}, + 588: {cur: 0xf9, idx: 0x4}, + 589: {cur: 0xf4, idx: 0x247}, + 590: {cur: 0x13, idx: 0x0}, + 591: {cur: 0x42, idx: 0x0}, + 592: {cur: 0x70, idx: 0x0}, + 593: {cur: 0x7a, idx: 0x0}, + 594: {cur: 0x7b, idx: 0x0}, + 595: {cur: 0x83, idx: 0x0}, + 596: {cur: 0x8b, idx: 0x0}, + 597: {cur: 0xbe, idx: 0x0}, + 598: {cur: 0x102, idx: 0x0}, + 599: {cur: 0x52, idx: 0x473}, + 600: {cur: 0x84, idx: 0x305}, + 601: {cur: 0xf4, idx: 0x247}, + 602: {cur: 0x13, idx: 0xec}, + 603: {cur: 0x4a, idx: 0x4ac}, + 604: {cur: 0xe8, idx: 0xb4}, + 605: {cur: 0x84, idx: 0x305}, + 606: {cur: 0x25, idx: 0x4b0}, + 607: {cur: 0x39, idx: 0x4b5}, + 608: {cur: 0x8e, idx: 0x6e}, + 609: {cur: 0xd0, idx: 0xaa}, + 610: {cur: 0xe8, idx: 0xb4}, + 611: {cur: 0xf9, idx: 0x4}, + 612: {cur: 0x50, idx: 0x301}, + 613: {cur: 0x84, idx: 0x305}, + 614: {cur: 0x86, idx: 0x63}, + 615: {cur: 0xe8, idx: 0xb4}, + 616: {cur: 0xf9, idx: 0x4}, + 617: {cur: 0xe8, idx: 0xb4}, + 618: {cur: 0xf9, idx: 0x4}, + 619: {cur: 0x13, idx: 0xec}, + 620: {cur: 0xe8, idx: 0xb4}, + 621: {cur: 0xf4, idx: 0x247}, + 622: {cur: 0x13, idx: 0x0}, + 623: {cur: 0x2e, idx: 0x0}, + 624: {cur: 0x39, idx: 0x0}, + 625: {cur: 0x61, idx: 0x0}, + 626: {cur: 0x70, idx: 0x0}, + 627: {cur: 0x7a, idx: 0x0}, + 628: {cur: 0x7b, idx: 0x0}, + 629: {cur: 0x85, idx: 0x4c1}, + 630: {cur: 0x8b, idx: 0x0}, + 631: {cur: 0xb0, idx: 0x0}, + 632: {cur: 0xbe, idx: 0x0}, + 633: {cur: 0xe8, idx: 0xb4}, + 634: {cur: 0xf3, idx: 0x0}, + 635: {cur: 0xf9, idx: 0x0}, + 636: {cur: 0x10d, idx: 0x0}, + 637: {cur: 0xf4, idx: 0x247}, + 638: {cur: 0x12, idx: 0x309}, + 639: {cur: 0x13, idx: 0xec}, + 640: {cur: 0x83, idx: 0x25}, + 641: {cur: 0xe8, idx: 0xb4}, + 642: {cur: 0xf9, idx: 0x4}, + 643: {cur: 0xf8, idx: 0x2f1}, + 644: {cur: 0xf9, idx: 0x4}, + 645: {cur: 0x3a, idx: 0x327}, + 646: {cur: 0x9, idx: 0x1}, + 647: {cur: 0x8f, idx: 0x72}, + 648: {cur: 0xe8, idx: 0xb4}, + 649: {cur: 0x13, idx: 0x0}, + 650: {cur: 0x2e, idx: 0x0}, + 651: {cur: 0x39, idx: 0x0}, + 652: {cur: 0x42, idx: 0x0}, + 653: {cur: 0x61, idx: 0x0}, + 654: {cur: 0x70, idx: 0x0}, + 655: {cur: 0x7a, idx: 0x0}, + 656: {cur: 0x7b, idx: 0x0}, + 657: {cur: 0x83, idx: 0x0}, + 658: {cur: 0x8b, idx: 0x0}, + 659: {cur: 0xb0, idx: 0x0}, + 660: {cur: 0xbe, idx: 0x0}, + 661: {cur: 0xf3, idx: 0x0}, + 662: {cur: 0xf9, idx: 0x0}, + 663: {cur: 0x102, idx: 0x0}, + 664: {cur: 0x106, idx: 0x0}, + 665: {cur: 0x10d, idx: 0x0}, + 666: {cur: 0x112, idx: 0x0}, + 667: {cur: 0x114, idx: 0x0}, + 668: {cur: 0x3a, idx: 0x327}, + 669: {cur: 0x84, idx: 0x305}, + 670: {cur: 0x84, idx: 0x305}, + 671: {cur: 0x13, idx: 0xec}, + 672: {cur: 0x83, idx: 0x25}, + 673: {cur: 0x99, idx: 0x80}, + 674: {cur: 0xe8, idx: 0xb4}, + 675: {cur: 0xf9, idx: 0x4}, + 676: {cur: 0x84, idx: 0x305}, + 677: {cur: 0xf4, idx: 0x247}, + 678: {cur: 0x84, idx: 0x305}, + 679: {cur: 0xac, idx: 0x7a}, + 680: {cur: 0xa1, idx: 0x83}, + 681: {cur: 0xb6, idx: 0x4ce}, + 682: {cur: 0x13, idx: 0x0}, + 683: {cur: 0x42, idx: 0x0}, + 684: {cur: 0x61, idx: 0x0}, + 685: {cur: 0x70, idx: 0x0}, + 686: {cur: 0x7a, idx: 0x0}, + 687: {cur: 0x7b, idx: 0x0}, + 688: {cur: 0x83, idx: 0x0}, + 689: {cur: 0x8b, idx: 0x0}, + 690: {cur: 0xa3, idx: 0x4d2}, + 691: {cur: 0xbe, idx: 0x0}, + 692: {cur: 0xf3, idx: 0x0}, + 693: {cur: 0x102, idx: 0x0}, + 694: {cur: 0x83, idx: 0x25}, + 695: {cur: 0xe8, idx: 0xb4}, + 696: {cur: 0xf9, idx: 0x4}, + 697: {cur: 0xa7, idx: 0x88}, + 698: {cur: 0xe8, idx: 0xb4}, + 699: {cur: 0xf9, idx: 0x4}, + 700: {cur: 0xe8, idx: 0xb4}, + 701: {cur: 0xf9, idx: 0x4}, + 702: {cur: 0x39, idx: 0x0}, + 703: {cur: 0xb0, idx: 0x0}, + 704: {cur: 0xb3, idx: 0x90}, + 705: {cur: 0xf9, idx: 0x0}, + 706: {cur: 0x26, idx: 0x4}, + 707: {cur: 0xda, idx: 0x4}, + 708: {cur: 0x45, idx: 0x4ec}, + 709: {cur: 0xa6, idx: 0x86}, + 710: {cur: 0xe8, idx: 0xb4}, + 711: {cur: 0xf9, idx: 0x4}, + 712: {cur: 0xb7, idx: 0x4}, + 713: {cur: 0x13, idx: 0x0}, + 714: {cur: 0x2e, idx: 0x0}, + 715: {cur: 0x39, idx: 0x0}, + 716: {cur: 0x42, idx: 0x0}, + 717: {cur: 0x70, idx: 0x0}, + 718: {cur: 0x7a, idx: 0x0}, + 719: {cur: 0x7b, idx: 0x0}, + 720: {cur: 0x83, idx: 0x0}, + 721: {cur: 0x8b, idx: 0x0}, + 722: {cur: 0xb0, idx: 0x0}, + 723: {cur: 0xbc, idx: 0x30}, + 724: {cur: 0xbe, idx: 0x0}, + 725: {cur: 0xf3, idx: 0x0}, + 726: {cur: 0xf9, idx: 0x0}, + 727: {cur: 0x102, idx: 0x0}, + 728: {cur: 0x106, idx: 0x0}, + 729: {cur: 0x10d, idx: 0x0}, + 730: {cur: 0x114, idx: 0x0}, + 731: {cur: 0xbd, idx: 0x4ff}, + 732: {cur: 0xe8, idx: 0xb4}, + 733: {cur: 0x13, idx: 0xec}, + 734: {cur: 0x39, idx: 0x97}, + 735: {cur: 0x5e, idx: 0x14b}, + 736: {cur: 0xd4, idx: 0x28e}, + 737: {cur: 0xe8, idx: 0xb4}, + 738: {cur: 0x114, idx: 0x0}, + 739: {cur: 0x14, idx: 0x38c}, + 740: {cur: 0xf9, idx: 0x4}, + 741: {cur: 0x8, idx: 0x370}, + 742: {cur: 0xe0, idx: 0x4}, + 743: {cur: 0x8, idx: 0x370}, + 744: {cur: 0xbc, idx: 0x30}, + 745: {cur: 0x61, idx: 0x242}, + 746: {cur: 0xe2, idx: 0x3f}, + 747: {cur: 0xf8, idx: 0x2f1}, + 748: {cur: 0x5b, idx: 0x391}, + 749: {cur: 0x84, idx: 0x305}, + 750: {cur: 0xf9, idx: 0x4}, + 751: {cur: 0xd0, idx: 0xaa}, + 752: {cur: 0xe8, idx: 0xb4}, + 753: {cur: 0xc6, idx: 0x50c}, + 754: {cur: 0x13, idx: 0x0}, + 755: {cur: 0x39, idx: 0x0}, + 756: {cur: 0x42, idx: 0x0}, + 757: {cur: 0x61, idx: 0x0}, + 758: {cur: 0x70, idx: 0x0}, + 759: {cur: 0x7a, idx: 0x0}, + 760: {cur: 0x7b, idx: 0x0}, + 761: {cur: 0x83, idx: 0x0}, + 762: {cur: 0x8b, idx: 0x0}, + 763: {cur: 0xb0, idx: 0x0}, + 764: {cur: 0xbe, idx: 0x0}, + 765: {cur: 0xc7, idx: 0xa2}, + 766: {cur: 0xf3, idx: 0x0}, + 767: {cur: 0xf9, idx: 0x0}, + 768: {cur: 0x102, idx: 0x0}, + 769: {cur: 0x4, idx: 0x3a7}, + 770: {cur: 0x13, idx: 0xec}, + 771: {cur: 0xc9, idx: 0x50f}, + 772: {cur: 0xe8, idx: 0xb4}, + 773: {cur: 0x9, idx: 0x1}, + 774: {cur: 0x4a, idx: 0x4ac}, + 775: {cur: 0xc9, idx: 0x514}, + 776: {cur: 0xa8, idx: 0x362}, + 777: {cur: 0xb6, idx: 0x4ce}, + 778: {cur: 0xc9, idx: 0x4ac}, + 779: {cur: 0xe3, idx: 0xb1}, + 780: {cur: 0xc2, idx: 0x39b}, + 781: {cur: 0x27, idx: 0x10}, + 782: {cur: 0xc2, idx: 0x0}, + 783: {cur: 0xc2, idx: 0x0}, + 784: {cur: 0xf9, idx: 0x4}, + 785: {cur: 0x24, idx: 0x35c}, + 786: {cur: 0x13, idx: 0x0}, + 787: {cur: 0x2e, idx: 0x0}, + 788: {cur: 0x39, idx: 0x0}, + 789: {cur: 0x42, idx: 0x0}, + 790: {cur: 0x5c, idx: 0x0}, + 791: {cur: 0x61, idx: 0x0}, + 792: {cur: 0x70, idx: 0x0}, + 793: {cur: 0x7a, idx: 0x0}, + 794: {cur: 0x7b, idx: 0x0}, + 795: {cur: 0x83, idx: 0x0}, + 796: {cur: 0x8b, idx: 0x0}, + 797: {cur: 0xb0, idx: 0x0}, + 798: {cur: 0xbe, idx: 0x0}, + 799: {cur: 0xf3, idx: 0x0}, + 800: {cur: 0xf9, idx: 0x0}, + 801: {cur: 0x102, idx: 0x0}, + 802: {cur: 0x10d, idx: 0x0}, + 803: {cur: 0xa0, idx: 0x4b}, + 804: {cur: 0xf4, idx: 0x247}, + 805: {cur: 0x0, idx: 0x51b}, + 806: {cur: 0x83, idx: 0x25}, + 807: {cur: 0xd0, idx: 0xaa}, + 808: {cur: 0xd1, idx: 0x18}, + 809: {cur: 0xe8, idx: 0xb4}, + 810: {cur: 0xec, idx: 0x520}, + 811: {cur: 0xf5, idx: 0xc3}, + 812: {cur: 0xf9, idx: 0x4}, + 813: {cur: 0x37, idx: 0x18}, + 814: {cur: 0xd1, idx: 0x0}, + 815: {cur: 0x85, idx: 0x4c1}, + 816: {cur: 0x8e, idx: 0x6e}, + 817: {cur: 0xa0, idx: 0x4b}, + 818: {cur: 0xd2, idx: 0xae}, + 819: {cur: 0xf4, idx: 0x247}, + 820: {cur: 0xd0, idx: 0xaa}, + 821: {cur: 0x84, idx: 0x305}, + 822: {cur: 0xf4, idx: 0x247}, + 823: {cur: 0x50, idx: 0x527}, + 824: {cur: 0xbc, idx: 0x30}, + 825: {cur: 0xd9, idx: 0x52b}, + 826: {cur: 0xe8, idx: 0xb4}, + 827: {cur: 0xbc, idx: 0x52f}, + 828: {cur: 0xd9, idx: 0x30}, + 829: {cur: 0xb6, idx: 0x4ce}, + 830: {cur: 0x91, idx: 0x533}, + 831: {cur: 0xe8, idx: 0xb4}, + 832: {cur: 0x112, idx: 0x53b}, + 833: {cur: 0x13, idx: 0x0}, + 834: {cur: 0x2e, idx: 0x0}, + 835: {cur: 0x39, idx: 0x0}, + 836: {cur: 0x42, idx: 0x0}, + 837: {cur: 0x61, idx: 0x0}, + 838: {cur: 0x70, idx: 0x0}, + 839: {cur: 0x7a, idx: 0x54b}, + 840: {cur: 0x7b, idx: 0x0}, + 841: {cur: 0x83, idx: 0x0}, + 842: {cur: 0x8b, idx: 0x0}, + 843: {cur: 0xbe, idx: 0x0}, + 844: {cur: 0xf3, idx: 0x0}, + 845: {cur: 0xf9, idx: 0x0}, + 846: {cur: 0x102, idx: 0x0}, + 847: {cur: 0x39, idx: 0x0}, + 848: {cur: 0x83, idx: 0x25}, + 849: {cur: 0xe8, idx: 0xb4}, + 850: {cur: 0xf9, idx: 0x4}, + 851: {cur: 0xdf, idx: 0x240}, + 852: {cur: 0x4f, idx: 0x238}, + 853: {cur: 0x5b, idx: 0x391}, + 854: {cur: 0x84, idx: 0x305}, + 855: {cur: 0x6, idx: 0x54f}, + 856: {cur: 0xe8, idx: 0xb4}, + 857: {cur: 0xa3, idx: 0x555}, + 858: {cur: 0x13, idx: 0x0}, + 859: {cur: 0x18, idx: 0x2d3}, + 860: {cur: 0x21, idx: 0x559}, + 861: {cur: 0x37, idx: 0x55f}, + 862: {cur: 0x83, idx: 0x25}, + 863: {cur: 0x8b, idx: 0x0}, + 864: {cur: 0xbe, idx: 0x0}, + 865: {cur: 0x102, idx: 0x0}, + 866: {cur: 0x13, idx: 0x0}, + 867: {cur: 0x18, idx: 0x9}, + 868: {cur: 0x21, idx: 0x559}, + 869: {cur: 0x37, idx: 0x55f}, + 870: {cur: 0x83, idx: 0x25}, + 871: {cur: 0x8b, idx: 0x0}, + 872: {cur: 0xbe, idx: 0x0}, + 873: {cur: 0x102, idx: 0x0}, + 874: {cur: 0x13, idx: 0x0}, + 875: {cur: 0x1a, idx: 0x253}, + 876: {cur: 0x25, idx: 0x117}, + 877: {cur: 0x2e, idx: 0x573}, + 878: {cur: 0x32, idx: 0x11f}, + 879: {cur: 0x38, idx: 0x123}, + 880: {cur: 0x42, idx: 0x0}, + 881: {cur: 0x50, idx: 0x527}, + 882: {cur: 0x51, idx: 0x268}, + 883: {cur: 0x55, idx: 0x577}, + 884: {cur: 0x56, idx: 0x57b}, + 885: {cur: 0x61, idx: 0x0}, + 886: {cur: 0x70, idx: 0x0}, + 887: {cur: 0x7b, idx: 0x0}, + 888: {cur: 0x7f, idx: 0x580}, + 889: {cur: 0x81, idx: 0x172}, + 890: {cur: 0x83, idx: 0x0}, + 891: {cur: 0x8b, idx: 0x0}, + 892: {cur: 0xbc, idx: 0x52f}, + 893: {cur: 0xbe, idx: 0x0}, + 894: {cur: 0xd9, idx: 0x30}, + 895: {cur: 0xf3, idx: 0x0}, + 896: {cur: 0x102, idx: 0x0}, + 897: {cur: 0x84, idx: 0x305}, + 898: {cur: 0xe8, idx: 0xb4}, + 899: {cur: 0xf4, idx: 0x247}, + 900: {cur: 0x3a, idx: 0x327}, + 901: {cur: 0xf8, idx: 0x2f1}, + 902: {cur: 0x83, idx: 0x25}, + 903: {cur: 0xe8, idx: 0xb4}, + 904: {cur: 0xf9, idx: 0x4}, + 905: {cur: 0x91, idx: 0x584}, + 906: {cur: 0xb3, idx: 0x90}, + 907: {cur: 0xda, idx: 0x292}, + 908: {cur: 0xb3, idx: 0x90}, + 909: {cur: 0xda, idx: 0x4}, + 910: {cur: 0xf9, idx: 0xc7}, + 911: {cur: 0xe8, idx: 0xb4}, + 912: {cur: 0xf9, idx: 0x4}, + 913: {cur: 0xf8, idx: 0x2f1}, + 914: {cur: 0x84, idx: 0x305}, + 915: {cur: 0x13, idx: 0xec}, + 916: {cur: 0x83, idx: 0x25}, + 917: {cur: 0x5b, idx: 0x391}, + 918: {cur: 0x57, idx: 0x23c}, + 919: {cur: 0x5c, idx: 0x0}, + 920: {cur: 0x61, idx: 0x0}, + 921: {cur: 0x13, idx: 0x588}, + 922: {cur: 0xbe, idx: 0x58d}, + 923: {cur: 0xee, idx: 0xb8}, + 924: {cur: 0x13, idx: 0xec}, + 925: {cur: 0x83, idx: 0x25}, + 926: {cur: 0xe8, idx: 0xb4}, + 927: {cur: 0xf1, idx: 0xbb}, + 928: {cur: 0xf9, idx: 0x4}, + 929: {cur: 0x42, idx: 0x4a8}, + 930: {cur: 0xf9, idx: 0x4}, + 931: {cur: 0x13, idx: 0x0}, + 932: {cur: 0x2e, idx: 0x0}, + 933: {cur: 0x39, idx: 0x0}, + 934: {cur: 0x42, idx: 0x0}, + 935: {cur: 0x5c, idx: 0x0}, + 936: {cur: 0x61, idx: 0x0}, + 937: {cur: 0x70, idx: 0x0}, + 938: {cur: 0x7a, idx: 0x0}, + 939: {cur: 0x7b, idx: 0x0}, + 940: {cur: 0x83, idx: 0x25}, + 941: {cur: 0x8b, idx: 0x0}, + 942: {cur: 0xb0, idx: 0x0}, + 943: {cur: 0xbe, idx: 0x0}, + 944: {cur: 0xf3, idx: 0x0}, + 945: {cur: 0xf5, idx: 0xc3}, + 946: {cur: 0xf6, idx: 0x592}, + 947: {cur: 0xf9, idx: 0x0}, + 948: {cur: 0x102, idx: 0x0}, + 949: {cur: 0x10d, idx: 0x0}, + 950: {cur: 0xc6, idx: 0x7a}, + 951: {cur: 0xe8, idx: 0xb4}, + 952: {cur: 0xf9, idx: 0x4}, + 953: {cur: 0xc6, idx: 0x0}, + 954: {cur: 0xff, idx: 0x59a}, + 955: {cur: 0x4, idx: 0x3a7}, + 956: {cur: 0xe8, idx: 0xb4}, + 957: {cur: 0xff, idx: 0x5a0}, + 958: {cur: 0x92, idx: 0x4}, + 959: {cur: 0x92, idx: 0x4}, + 960: {cur: 0x13, idx: 0xec}, + 961: {cur: 0xe8, idx: 0xb4}, + 962: {cur: 0xf4, idx: 0x247}, + 963: {cur: 0x83, idx: 0x25}, + 964: {cur: 0xf9, idx: 0x4}, + 965: {cur: 0xf8, idx: 0x2f1}, + 966: {cur: 0xb8, idx: 0x93}, + 967: {cur: 0x13, idx: 0xec}, + 968: {cur: 0x42, idx: 0x4a8}, + 969: {cur: 0x79, idx: 0x5a7}, + 970: {cur: 0x8b, idx: 0x5ab}, + 971: {cur: 0x42, idx: 0x20}, + 972: {cur: 0x42, idx: 0x20}, + 973: {cur: 0xa8, idx: 0x362}, + 974: {cur: 0x42, idx: 0x20}, + 975: {cur: 0xda, idx: 0x4}, + 976: {cur: 0x13, idx: 0xec}, + 977: {cur: 0x83, idx: 0x25}, + 978: {cur: 0x8b, idx: 0x5ab}, + 979: {cur: 0xf3, idx: 0x4}, + 980: {cur: 0x8b, idx: 0x6a}, + 981: {cur: 0xf3, idx: 0xbf}, + 982: {cur: 0xa8, idx: 0x362}, + 983: {cur: 0xe8, idx: 0xb4}, + 984: {cur: 0x122, idx: 0xe1}, +} // Size: 3964 bytes + +var narrowLangIndex = []uint16{ // 743 elements + // Entry 0 - 3F + 0x0000, 0x0060, 0x0060, 0x0060, 0x0061, 0x0061, 0x0061, 0x0061, + 0x0061, 0x0061, 0x0061, 0x0062, 0x0062, 0x007f, 0x007f, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0089, 0x0089, + 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x00a4, + 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00d3, 0x00d3, 0x00d3, + // Entry 40 - 7F + 0x00d3, 0x00d3, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, + 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d8, 0x00d8, 0x00d8, 0x00d8, + 0x00d8, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, + 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e3, + 0x00e3, 0x00e3, 0x00e3, 0x00e9, 0x00e9, 0x00ee, 0x00ee, 0x00ee, + 0x00ee, 0x00ee, 0x00f6, 0x00f6, 0x00f6, 0x00f7, 0x00f7, 0x00f7, + 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, + 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, + // Entry 80 - BF + 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, + 0x00f7, 0x00f7, 0x00f7, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + // Entry C0 - FF + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0102, + 0x0102, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, + 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, + // Entry 100 - 13F + 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, + 0x0108, 0x0108, 0x0109, 0x010a, 0x010a, 0x010b, 0x010b, 0x010b, + 0x010b, 0x010b, 0x010b, 0x010b, 0x010b, 0x010b, 0x010b, 0x010b, + 0x010b, 0x010d, 0x010d, 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, + 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0118, 0x0118, + 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, + 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, + 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, + // Entry 140 - 17F + 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, + 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, + 0x0118, 0x0118, 0x0118, 0x0119, 0x0119, 0x011a, 0x011a, 0x011c, + 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011e, 0x011e, 0x011e, + 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, + 0x011e, 0x011e, 0x011f, 0x011f, 0x0122, 0x0122, 0x0123, 0x0123, + 0x0123, 0x0123, 0x0123, 0x0124, 0x0124, 0x0125, 0x0125, 0x0126, + 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, 0x0127, 0x0127, 0x012d, + // Entry 180 - 1BF + 0x012d, 0x012d, 0x012d, 0x012d, 0x0130, 0x0130, 0x0130, 0x0130, + 0x0130, 0x0130, 0x0130, 0x0130, 0x0131, 0x0131, 0x0131, 0x0131, + 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, + 0x0131, 0x0131, 0x0131, 0x0131, 0x0132, 0x0132, 0x0132, 0x0132, + 0x0132, 0x0132, 0x0132, 0x0132, 0x0133, 0x0133, 0x0134, 0x0134, + 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, + 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, + 0x0140, 0x0140, 0x0140, 0x0140, 0x0141, 0x0141, 0x0141, 0x0141, + // Entry 1C0 - 1FF + 0x0141, 0x0141, 0x0141, 0x0141, 0x0141, 0x0141, 0x0141, 0x0142, + 0x0142, 0x0142, 0x0142, 0x0142, 0x014d, 0x014d, 0x014d, 0x014d, + 0x014d, 0x014d, 0x014d, 0x014d, 0x014e, 0x014e, 0x014e, 0x014e, + 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, + 0x014e, 0x014e, 0x014e, 0x014f, 0x014f, 0x0150, 0x0150, 0x0151, + 0x0151, 0x0152, 0x0152, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, + 0x0153, 0x0153, 0x0153, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, + 0x0154, 0x0154, 0x0155, 0x0155, 0x0155, 0x0155, 0x0155, 0x0155, + // Entry 200 - 23F + 0x0155, 0x0155, 0x0156, 0x0156, 0x0156, 0x0156, 0x0156, 0x0156, + 0x0156, 0x0156, 0x0156, 0x0156, 0x0156, 0x0156, 0x0156, 0x0156, + 0x0156, 0x0156, 0x0156, 0x0156, 0x0156, 0x0156, 0x0156, 0x0156, + 0x0156, 0x0156, 0x0156, 0x0156, 0x0156, 0x0156, 0x0156, 0x0156, + 0x0156, 0x0157, 0x0157, 0x0157, 0x0157, 0x0157, 0x0157, 0x0158, + 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0159, 0x0159, 0x0159, + 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, + 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, 0x015a, + // Entry 240 - 27F + 0x015a, 0x015a, 0x015a, 0x015a, 0x015b, 0x015b, 0x015b, 0x015b, + 0x015b, 0x015b, 0x015b, 0x015b, 0x015b, 0x015b, 0x015b, 0x015b, + 0x015b, 0x015b, 0x015b, 0x015b, 0x015b, 0x015b, 0x015b, 0x015b, + 0x015b, 0x015b, 0x015b, 0x015b, 0x015b, 0x015b, 0x015b, 0x015b, + 0x015b, 0x015b, 0x015b, 0x015b, 0x015b, 0x015d, 0x015d, 0x015e, + 0x015e, 0x015f, 0x015f, 0x015f, 0x015f, 0x015f, 0x015f, 0x015f, + 0x015f, 0x015f, 0x015f, 0x015f, 0x015f, 0x015f, 0x015f, 0x015f, + 0x015f, 0x015f, 0x015f, 0x015f, 0x0161, 0x0161, 0x0161, 0x0161, + // Entry 280 - 2BF + 0x0161, 0x0161, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0166, 0x0166, 0x0166, 0x0166, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0168, 0x0168, 0x0168, 0x0168, + 0x0168, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x016a, 0x016a, + 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, + 0x016a, 0x016b, 0x016b, 0x016b, 0x016b, 0x016b, 0x016b, 0x016b, + 0x016b, 0x016b, 0x016b, 0x016c, 0x016c, 0x016d, 0x016d, 0x016d, + 0x016d, 0x016d, 0x016d, 0x016d, 0x016d, 0x016d, 0x016d, 0x016d, + // Entry 2C0 - 2FF + 0x016d, 0x016d, 0x016d, 0x016d, 0x016d, 0x016e, 0x016e, 0x016e, + 0x016e, 0x016e, 0x016e, 0x016e, 0x016e, 0x016e, 0x016e, 0x016e, + 0x016e, 0x016e, 0x016e, 0x016e, 0x016e, 0x016e, 0x016e, 0x016e, + 0x016e, 0x016e, 0x016e, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x0177, 0x0177, +} // Size: 1510 bytes + +var narrowSymIndex = []curToIndex{ // 375 elements + 0: {cur: 0x9, idx: 0x1}, + 1: {cur: 0x11, idx: 0x4}, + 2: {cur: 0x13, idx: 0x4}, + 3: {cur: 0x18, idx: 0x9}, + 4: {cur: 0x1a, idx: 0x4}, + 5: {cur: 0x1b, idx: 0xc}, + 6: {cur: 0x25, idx: 0x4}, + 7: {cur: 0x26, idx: 0x4}, + 8: {cur: 0x27, idx: 0x10}, + 9: {cur: 0x2e, idx: 0x13}, + 10: {cur: 0x32, idx: 0x4}, + 11: {cur: 0x35, idx: 0x16}, + 12: {cur: 0x37, idx: 0x18}, + 13: {cur: 0x38, idx: 0x4}, + 14: {cur: 0x39, idx: 0x4}, + 15: {cur: 0x40, idx: 0x4}, + 16: {cur: 0x42, idx: 0x25}, + 17: {cur: 0x43, idx: 0x4}, + 18: {cur: 0x45, idx: 0x28}, + 19: {cur: 0x48, idx: 0x4}, + 20: {cur: 0x49, idx: 0x4}, + 21: {cur: 0x4c, idx: 0x2c}, + 22: {cur: 0x50, idx: 0x30}, + 23: {cur: 0x51, idx: 0x4}, + 24: {cur: 0x56, idx: 0x33}, + 25: {cur: 0x5a, idx: 0x37}, + 26: {cur: 0x5c, idx: 0x3b}, + 27: {cur: 0x5e, idx: 0x4}, + 28: {cur: 0x5f, idx: 0x3f}, + 29: {cur: 0x61, idx: 0x3f}, + 30: {cur: 0x66, idx: 0x3f}, + 31: {cur: 0x68, idx: 0x42}, + 32: {cur: 0x6c, idx: 0x45}, + 33: {cur: 0x6f, idx: 0x4}, + 34: {cur: 0x70, idx: 0x4}, + 35: {cur: 0x71, idx: 0x4b}, + 36: {cur: 0x73, idx: 0x4d}, + 37: {cur: 0x75, idx: 0x50}, + 38: {cur: 0x76, idx: 0x53}, + 39: {cur: 0x7a, idx: 0x56}, + 40: {cur: 0x7b, idx: 0x5a}, + 41: {cur: 0x7f, idx: 0x30}, + 42: {cur: 0x81, idx: 0x4}, + 43: {cur: 0x83, idx: 0x25}, + 44: {cur: 0x86, idx: 0x63}, + 45: {cur: 0x87, idx: 0x67}, + 46: {cur: 0x88, idx: 0x6a}, + 47: {cur: 0x8b, idx: 0x6a}, + 48: {cur: 0x8d, idx: 0x4}, + 49: {cur: 0x8e, idx: 0x6e}, + 50: {cur: 0x8f, idx: 0x72}, + 51: {cur: 0x90, idx: 0x76}, + 52: {cur: 0x91, idx: 0x7a}, + 53: {cur: 0x92, idx: 0x4}, + 54: {cur: 0x94, idx: 0x7d}, + 55: {cur: 0x99, idx: 0x80}, + 56: {cur: 0xa1, idx: 0x83}, + 57: {cur: 0xa6, idx: 0x86}, + 58: {cur: 0xa7, idx: 0x88}, + 59: {cur: 0xac, idx: 0x7a}, + 60: {cur: 0xb0, idx: 0x4}, + 61: {cur: 0xb3, idx: 0x90}, + 62: {cur: 0xb7, idx: 0x4}, + 63: {cur: 0xb8, idx: 0x93}, + 64: {cur: 0xba, idx: 0x97}, + 65: {cur: 0xbc, idx: 0x30}, + 66: {cur: 0xbd, idx: 0x7a}, + 67: {cur: 0xbe, idx: 0x4}, + 68: {cur: 0xc5, idx: 0x9e}, + 69: {cur: 0xc6, idx: 0x7a}, + 70: {cur: 0xc7, idx: 0xa2}, + 71: {cur: 0xca, idx: 0xa6}, + 72: {cur: 0xd0, idx: 0xaa}, + 73: {cur: 0xd1, idx: 0x18}, + 74: {cur: 0xd2, idx: 0xae}, + 75: {cur: 0xd4, idx: 0x4}, + 76: {cur: 0xd9, idx: 0x30}, + 77: {cur: 0xda, idx: 0x4}, + 78: {cur: 0xdb, idx: 0x3f}, + 79: {cur: 0xe0, idx: 0x4}, + 80: {cur: 0xe2, idx: 0x3f}, + 81: {cur: 0xe3, idx: 0xb1}, + 82: {cur: 0xe6, idx: 0x3f}, + 83: {cur: 0xe8, idx: 0xb4}, + 84: {cur: 0xee, idx: 0xb8}, + 85: {cur: 0xf1, idx: 0xbb}, + 86: {cur: 0xf2, idx: 0x4}, + 87: {cur: 0xf3, idx: 0x4}, + 88: {cur: 0xf5, idx: 0xc3}, + 89: {cur: 0xf9, idx: 0x4}, + 90: {cur: 0xfe, idx: 0x4}, + 91: {cur: 0x101, idx: 0x10}, + 92: {cur: 0x102, idx: 0xcb}, + 93: {cur: 0x10d, idx: 0x4}, + 94: {cur: 0x122, idx: 0xe1}, + 95: {cur: 0x124, idx: 0xe3}, + 96: {cur: 0xf3, idx: 0xbf}, + 97: {cur: 0xf3, idx: 0xbf}, + 98: {cur: 0x11, idx: 0x105}, + 99: {cur: 0x13, idx: 0xec}, + 100: {cur: 0x1a, idx: 0x109}, + 101: {cur: 0x25, idx: 0x117}, + 102: {cur: 0x26, idx: 0x11b}, + 103: {cur: 0x32, idx: 0x11f}, + 104: {cur: 0x38, idx: 0x123}, + 105: {cur: 0x39, idx: 0x1c}, + 106: {cur: 0x40, idx: 0x127}, + 107: {cur: 0x42, idx: 0x20}, + 108: {cur: 0x43, idx: 0x12b}, + 109: {cur: 0x49, idx: 0x12f}, + 110: {cur: 0x51, idx: 0x133}, + 111: {cur: 0x5e, idx: 0x14b}, + 112: {cur: 0x61, idx: 0x14f}, + 113: {cur: 0x6f, idx: 0x154}, + 114: {cur: 0x70, idx: 0x47}, + 115: {cur: 0x81, idx: 0x172}, + 116: {cur: 0x83, idx: 0x5e}, + 117: {cur: 0x8d, idx: 0x197}, + 118: {cur: 0xb0, idx: 0x8c}, + 119: {cur: 0xbe, idx: 0x9a}, + 120: {cur: 0xd4, idx: 0x1e8}, + 121: {cur: 0xe0, idx: 0x1fd}, + 122: {cur: 0xe2, idx: 0x201}, + 123: {cur: 0xf2, idx: 0x226}, + 124: {cur: 0xf3, idx: 0xbf}, + 125: {cur: 0xf9, idx: 0xc7}, + 126: {cur: 0xfe, idx: 0x22a}, + 127: {cur: 0x26, idx: 0x4}, + 128: {cur: 0x37, idx: 0x0}, + 129: {cur: 0x50, idx: 0x0}, + 130: {cur: 0x73, idx: 0x0}, + 131: {cur: 0x7f, idx: 0x0}, + 132: {cur: 0xbc, idx: 0x0}, + 133: {cur: 0xc7, idx: 0x0}, + 134: {cur: 0xd1, idx: 0x0}, + 135: {cur: 0xd9, idx: 0x0}, + 136: {cur: 0xf3, idx: 0xbf}, + 137: {cur: 0xe6, idx: 0x24f}, + 138: {cur: 0xf3, idx: 0xbf}, + 139: {cur: 0x13, idx: 0x6}, + 140: {cur: 0x1a, idx: 0x253}, + 141: {cur: 0x25, idx: 0x258}, + 142: {cur: 0x32, idx: 0x25c}, + 143: {cur: 0x38, idx: 0x123}, + 144: {cur: 0x39, idx: 0x1c}, + 145: {cur: 0x48, idx: 0x25f}, + 146: {cur: 0x49, idx: 0x264}, + 147: {cur: 0x51, idx: 0x268}, + 148: {cur: 0x5e, idx: 0x14b}, + 149: {cur: 0x5f, idx: 0x26c}, + 150: {cur: 0x6f, idx: 0x271}, + 151: {cur: 0x7f, idx: 0x274}, + 152: {cur: 0x81, idx: 0x279}, + 153: {cur: 0x8d, idx: 0x27c}, + 154: {cur: 0x92, idx: 0x280}, + 155: {cur: 0xb0, idx: 0x8c}, + 156: {cur: 0xb7, idx: 0x283}, + 157: {cur: 0xbe, idx: 0x9a}, + 158: {cur: 0xd0, idx: 0x286}, + 159: {cur: 0xd4, idx: 0x28e}, + 160: {cur: 0xda, idx: 0x292}, + 161: {cur: 0xf2, idx: 0x226}, + 162: {cur: 0xfe, idx: 0x295}, + 163: {cur: 0x10d, idx: 0xd4}, + 164: {cur: 0x11, idx: 0x0}, + 165: {cur: 0x13, idx: 0x0}, + 166: {cur: 0x1a, idx: 0x0}, + 167: {cur: 0x1b, idx: 0x0}, + 168: {cur: 0x25, idx: 0x0}, + 169: {cur: 0x26, idx: 0x0}, + 170: {cur: 0x2e, idx: 0x0}, + 171: {cur: 0x32, idx: 0x0}, + 172: {cur: 0x37, idx: 0x0}, + 173: {cur: 0x38, idx: 0x0}, + 174: {cur: 0x39, idx: 0x0}, + 175: {cur: 0x40, idx: 0x0}, + 176: {cur: 0x42, idx: 0x0}, + 177: {cur: 0x43, idx: 0x0}, + 178: {cur: 0x45, idx: 0x0}, + 179: {cur: 0x49, idx: 0x0}, + 180: {cur: 0x51, idx: 0x0}, + 181: {cur: 0x5e, idx: 0x0}, + 182: {cur: 0x66, idx: 0x0}, + 183: {cur: 0x6f, idx: 0x0}, + 184: {cur: 0x70, idx: 0x0}, + 185: {cur: 0x7a, idx: 0x0}, + 186: {cur: 0x7b, idx: 0x0}, + 187: {cur: 0x81, idx: 0x0}, + 188: {cur: 0x86, idx: 0x0}, + 189: {cur: 0x8b, idx: 0x0}, + 190: {cur: 0x8d, idx: 0x0}, + 191: {cur: 0x8e, idx: 0x0}, + 192: {cur: 0x8f, idx: 0x0}, + 193: {cur: 0x92, idx: 0x0}, + 194: {cur: 0xa7, idx: 0x0}, + 195: {cur: 0xb0, idx: 0x0}, + 196: {cur: 0xb7, idx: 0x0}, + 197: {cur: 0xb8, idx: 0x0}, + 198: {cur: 0xbe, idx: 0x0}, + 199: {cur: 0xc5, idx: 0x0}, + 200: {cur: 0xca, idx: 0x0}, + 201: {cur: 0xd4, idx: 0x0}, + 202: {cur: 0xda, idx: 0x0}, + 203: {cur: 0xe0, idx: 0x0}, + 204: {cur: 0xe2, idx: 0x0}, + 205: {cur: 0xf1, idx: 0x0}, + 206: {cur: 0xf2, idx: 0x0}, + 207: {cur: 0xf3, idx: 0x0}, + 208: {cur: 0xf5, idx: 0x0}, + 209: {cur: 0xfe, idx: 0x0}, + 210: {cur: 0x102, idx: 0x0}, + 211: {cur: 0xf3, idx: 0xbf}, + 212: {cur: 0x56, idx: 0x2ac}, + 213: {cur: 0x90, idx: 0x2bc}, + 214: {cur: 0xee, idx: 0x2c5}, + 215: {cur: 0xf3, idx: 0xbf}, + 216: {cur: 0x9, idx: 0x0}, + 217: {cur: 0x27, idx: 0x0}, + 218: {cur: 0x50, idx: 0x0}, + 219: {cur: 0x6c, idx: 0x0}, + 220: {cur: 0x71, idx: 0x0}, + 221: {cur: 0x7f, idx: 0x0}, + 222: {cur: 0xbc, idx: 0x0}, + 223: {cur: 0xd9, idx: 0x0}, + 224: {cur: 0xe3, idx: 0x0}, + 225: {cur: 0x101, idx: 0x0}, + 226: {cur: 0xf3, idx: 0xbf}, + 227: {cur: 0x1b, idx: 0x2fe}, + 228: {cur: 0x35, idx: 0x0}, + 229: {cur: 0x70, idx: 0x47}, + 230: {cur: 0xf3, idx: 0xbf}, + 231: {cur: 0x122, idx: 0x0}, + 232: {cur: 0x124, idx: 0x0}, + 233: {cur: 0x50, idx: 0x301}, + 234: {cur: 0x7f, idx: 0x301}, + 235: {cur: 0xbc, idx: 0x301}, + 236: {cur: 0xd9, idx: 0x301}, + 237: {cur: 0xf3, idx: 0xbf}, + 238: {cur: 0x48, idx: 0x315}, + 239: {cur: 0x5f, idx: 0x31d}, + 240: {cur: 0x68, idx: 0x322}, + 241: {cur: 0x87, idx: 0x327}, + 242: {cur: 0xd2, idx: 0x32a}, + 243: {cur: 0xe6, idx: 0x0}, + 244: {cur: 0xf3, idx: 0xbf}, + 245: {cur: 0x124, idx: 0x86}, + 246: {cur: 0x5c, idx: 0x0}, + 247: {cur: 0x1b, idx: 0x346}, + 248: {cur: 0x27, idx: 0x349}, + 249: {cur: 0x49, idx: 0x9e}, + 250: {cur: 0x56, idx: 0x3f}, + 251: {cur: 0x7f, idx: 0x34c}, + 252: {cur: 0x90, idx: 0x34f}, + 253: {cur: 0xca, idx: 0x355}, + 254: {cur: 0xd9, idx: 0x34c}, + 255: {cur: 0xfe, idx: 0x295}, + 256: {cur: 0x56, idx: 0x0}, + 257: {cur: 0xf3, idx: 0xbf}, + 258: {cur: 0x56, idx: 0x33}, + 259: {cur: 0x101, idx: 0x37e}, + 260: {cur: 0x11, idx: 0x389}, + 261: {cur: 0x37, idx: 0x391}, + 262: {cur: 0x51, idx: 0x268}, + 263: {cur: 0xf1, idx: 0x394}, + 264: {cur: 0x101, idx: 0x3a3}, + 265: {cur: 0xf3, idx: 0xbf}, + 266: {cur: 0xf3, idx: 0xbf}, + 267: {cur: 0xf3, idx: 0xbf}, + 268: {cur: 0xfe, idx: 0x295}, + 269: {cur: 0xf3, idx: 0xbf}, + 270: {cur: 0x56, idx: 0x3f6}, + 271: {cur: 0x87, idx: 0x327}, + 272: {cur: 0x90, idx: 0x2bc}, + 273: {cur: 0xba, idx: 0x42b}, + 274: {cur: 0xd2, idx: 0x432}, + 275: {cur: 0xf3, idx: 0xbf}, + 276: {cur: 0x124, idx: 0x452}, + 277: {cur: 0x87, idx: 0x67}, + 278: {cur: 0xba, idx: 0x97}, + 279: {cur: 0x124, idx: 0xe3}, + 280: {cur: 0xf3, idx: 0xbf}, + 281: {cur: 0xf3, idx: 0xbf}, + 282: {cur: 0x2e, idx: 0x47e}, + 283: {cur: 0xf3, idx: 0xbf}, + 284: {cur: 0xac, idx: 0x48a}, + 285: {cur: 0xf3, idx: 0xbf}, + 286: {cur: 0xf3, idx: 0xbf}, + 287: {cur: 0xac, idx: 0x499}, + 288: {cur: 0xc6, idx: 0x499}, + 289: {cur: 0xf3, idx: 0xbf}, + 290: {cur: 0xf3, idx: 0xbf}, + 291: {cur: 0xf3, idx: 0xbf}, + 292: {cur: 0xf3, idx: 0xbf}, + 293: {cur: 0xf3, idx: 0xbf}, + 294: {cur: 0xf3, idx: 0xbf}, + 295: {cur: 0x27, idx: 0x349}, + 296: {cur: 0x37, idx: 0x391}, + 297: {cur: 0x48, idx: 0x25f}, + 298: {cur: 0x56, idx: 0x3f6}, + 299: {cur: 0xbc, idx: 0x4a0}, + 300: {cur: 0xf3, idx: 0xbf}, + 301: {cur: 0x42, idx: 0x4a8}, + 302: {cur: 0x83, idx: 0x4a8}, + 303: {cur: 0xf3, idx: 0xbf}, + 304: {cur: 0xf3, idx: 0xbf}, + 305: {cur: 0xf3, idx: 0xbf}, + 306: {cur: 0xf3, idx: 0xbf}, + 307: {cur: 0xf3, idx: 0xbf}, + 308: {cur: 0xf3, idx: 0xbf}, + 309: {cur: 0x25, idx: 0x258}, + 310: {cur: 0x32, idx: 0x25c}, + 311: {cur: 0x38, idx: 0x123}, + 312: {cur: 0x39, idx: 0x97}, + 313: {cur: 0x51, idx: 0x268}, + 314: {cur: 0x56, idx: 0x4bb}, + 315: {cur: 0x70, idx: 0x47}, + 316: {cur: 0x73, idx: 0x4be}, + 317: {cur: 0x81, idx: 0x279}, + 318: {cur: 0xf2, idx: 0x226}, + 319: {cur: 0xf3, idx: 0xbf}, + 320: {cur: 0xf3, idx: 0xbf}, + 321: {cur: 0xf3, idx: 0xbf}, + 322: {cur: 0x1b, idx: 0x0}, + 323: {cur: 0x37, idx: 0x391}, + 324: {cur: 0x7a, idx: 0x0}, + 325: {cur: 0x7b, idx: 0x0}, + 326: {cur: 0x86, idx: 0x0}, + 327: {cur: 0x8f, idx: 0x0}, + 328: {cur: 0xa7, idx: 0x0}, + 329: {cur: 0xc7, idx: 0x4c8}, + 330: {cur: 0xca, idx: 0x355}, + 331: {cur: 0xd0, idx: 0x4cb}, + 332: {cur: 0x102, idx: 0x0}, + 333: {cur: 0xf3, idx: 0xbf}, + 334: {cur: 0xf3, idx: 0xbf}, + 335: {cur: 0xf3, idx: 0xbf}, + 336: {cur: 0xf3, idx: 0xbf}, + 337: {cur: 0xf3, idx: 0xbf}, + 338: {cur: 0xf3, idx: 0xbf}, + 339: {cur: 0x38, idx: 0x4d9}, + 340: {cur: 0xf3, idx: 0xbf}, + 341: {cur: 0xf3, idx: 0xbf}, + 342: {cur: 0xf3, idx: 0xbf}, + 343: {cur: 0xf3, idx: 0xbf}, + 344: {cur: 0xf3, idx: 0xbf}, + 345: {cur: 0xf3, idx: 0xbf}, + 346: {cur: 0xf3, idx: 0xbf}, + 347: {cur: 0x91, idx: 0x533}, + 348: {cur: 0xf3, idx: 0xbf}, + 349: {cur: 0xf3, idx: 0xbf}, + 350: {cur: 0xf3, idx: 0xbf}, + 351: {cur: 0xd0, idx: 0x565}, + 352: {cur: 0xf3, idx: 0xbf}, + 353: {cur: 0x37, idx: 0x56c}, + 354: {cur: 0xd0, idx: 0x56f}, + 355: {cur: 0xf3, idx: 0xbf}, + 356: {cur: 0x5a, idx: 0x0}, + 357: {cur: 0xf3, idx: 0xbf}, + 358: {cur: 0xf3, idx: 0xbf}, + 359: {cur: 0xf3, idx: 0xbf}, + 360: {cur: 0xf3, idx: 0xbf}, + 361: {cur: 0xf3, idx: 0xbf}, + 362: {cur: 0xf3, idx: 0xbf}, + 363: {cur: 0xf3, idx: 0xbf}, + 364: {cur: 0xf3, idx: 0xbf}, + 365: {cur: 0xf3, idx: 0xbf}, + 366: {cur: 0xf3, idx: 0xbf}, + 367: {cur: 0x37, idx: 0x5af}, + 368: {cur: 0x50, idx: 0x34c}, + 369: {cur: 0x73, idx: 0x4be}, + 370: {cur: 0x7f, idx: 0x34c}, + 371: {cur: 0xbc, idx: 0x34c}, + 372: {cur: 0xc7, idx: 0x5b2}, + 373: {cur: 0xd9, idx: 0x34c}, + 374: {cur: 0xf3, idx: 0xbf}, +} // Size: 1524 bytes + +// Total table size 12210 bytes (11KiB); checksum: 74846C68 diff --git a/vendor/golang.org/x/text/currency/tables_test.go b/vendor/golang.org/x/text/currency/tables_test.go new file mode 100644 index 0000000000..e39738c454 --- /dev/null +++ b/vendor/golang.org/x/text/currency/tables_test.go @@ -0,0 +1,70 @@ +package currency + +import ( + "flag" + "strings" + "testing" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/testtext" + "golang.org/x/text/language" + "golang.org/x/text/message" + "golang.org/x/text/unicode/cldr" +) + +var draft = flag.String("draft", + "contributed", + `Minimal draft requirements (approved, contributed, provisional, unconfirmed).`) + +func TestTables(t *testing.T) { + testtext.SkipIfNotLong(t) + + // Read the CLDR zip file. + r := gen.OpenCLDRCoreZip() + defer r.Close() + + d := &cldr.Decoder{} + d.SetDirFilter("supplemental", "main") + d.SetSectionFilter("numbers") + data, err := d.DecodeZip(r) + if err != nil { + t.Fatalf("DecodeZip: %v", err) + } + + dr, err := cldr.ParseDraft(*draft) + if err != nil { + t.Fatalf("filter: %v", err) + } + + for _, lang := range data.Locales() { + p := message.NewPrinter(language.MustParse(lang)) + + ldml := data.RawLDML(lang) + if ldml.Numbers == nil || ldml.Numbers.Currencies == nil { + continue + } + for _, c := range ldml.Numbers.Currencies.Currency { + syms := cldr.MakeSlice(&c.Symbol) + syms.SelectDraft(dr) + + for _, sym := range c.Symbol { + cur, err := ParseISO(c.Type) + if err != nil { + continue + } + formatter := Symbol + switch sym.Alt { + case "": + case "narrow": + formatter = NarrowSymbol + default: + continue + } + want := sym.Data() + if got := p.Sprint(formatter(cur)); got != want { + t.Errorf("%s:%sSymbol(%s) = %s; want %s", lang, strings.Title(sym.Alt), c.Type, got, want) + } + } + } + } +} diff --git a/vendor/golang.org/x/text/doc.go b/vendor/golang.org/x/text/doc.go new file mode 100644 index 0000000000..9d65bfb527 --- /dev/null +++ b/vendor/golang.org/x/text/doc.go @@ -0,0 +1,12 @@ +// 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. + +//go:generate go run gen.go + +// text is a repository of text-related packages, such as character encodings, +// text transformations, and locale-specific text handling. +package text + +// TODO: more documentation on general concepts, such as Transformers, use +// of normalization, etc. diff --git a/vendor/golang.org/x/text/encoding/charmap/charmap.go b/vendor/golang.org/x/text/encoding/charmap/charmap.go new file mode 100644 index 0000000000..6e62a83747 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/charmap/charmap.go @@ -0,0 +1,209 @@ +// Copyright 2013 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. + +//go:generate go run maketables.go + +// Package charmap provides simple character encodings such as IBM Code Page 437 +// and Windows 1252. +package charmap // import "golang.org/x/text/encoding/charmap" + +import ( + "unicode/utf8" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal" + "golang.org/x/text/encoding/internal/identifier" + "golang.org/x/text/transform" +) + +// These encodings vary only in the way clients should interpret them. Their +// coded character set is identical and a single implementation can be shared. +var ( + // ISO8859_6E is the ISO 8859-6E encoding. + ISO8859_6E encoding.Encoding = &iso8859_6E + + // ISO8859_6I is the ISO 8859-6I encoding. + ISO8859_6I encoding.Encoding = &iso8859_6I + + // ISO8859_8E is the ISO 8859-8E encoding. + ISO8859_8E encoding.Encoding = &iso8859_8E + + // ISO8859_8I is the ISO 8859-8I encoding. + ISO8859_8I encoding.Encoding = &iso8859_8I + + iso8859_6E = internal.Encoding{ + ISO8859_6, + "ISO-8859-6E", + identifier.ISO88596E, + } + + iso8859_6I = internal.Encoding{ + ISO8859_6, + "ISO-8859-6I", + identifier.ISO88596I, + } + + iso8859_8E = internal.Encoding{ + ISO8859_8, + "ISO-8859-8E", + identifier.ISO88598E, + } + + iso8859_8I = internal.Encoding{ + ISO8859_8, + "ISO-8859-8I", + identifier.ISO88598I, + } +) + +// All is a list of all defined encodings in this package. +var All = listAll + +// TODO: implement these encodings, in order of importance. +// ASCII, ISO8859_1: Rather common. Close to Windows 1252. +// ISO8859_9: Close to Windows 1254. + +// utf8Enc holds a rune's UTF-8 encoding in data[:len]. +type utf8Enc struct { + len uint8 + data [3]byte +} + +// charmap describes an 8-bit character set encoding. +type charmap struct { + // name is the encoding's name. + name string + // mib is the encoding type of this encoder. + mib identifier.MIB + // asciiSuperset states whether the encoding is a superset of ASCII. + asciiSuperset bool + // low is the lower bound of the encoded byte for a non-ASCII rune. If + // charmap.asciiSuperset is true then this will be 0x80, otherwise 0x00. + low uint8 + // replacement is the encoded replacement character. + replacement byte + // decode is the map from encoded byte to UTF-8. + decode [256]utf8Enc + // encoding is the map from runes to encoded bytes. Each entry is a + // uint32: the high 8 bits are the encoded byte and the low 24 bits are + // the rune. The table entries are sorted by ascending rune. + encode [256]uint32 +} + +func (m *charmap) NewDecoder() *encoding.Decoder { + return &encoding.Decoder{Transformer: charmapDecoder{charmap: m}} +} + +func (m *charmap) NewEncoder() *encoding.Encoder { + return &encoding.Encoder{Transformer: charmapEncoder{charmap: m}} +} + +func (m *charmap) String() string { + return m.name +} + +func (m *charmap) ID() (mib identifier.MIB, other string) { + return m.mib, "" +} + +// charmapDecoder implements transform.Transformer by decoding to UTF-8. +type charmapDecoder struct { + transform.NopResetter + charmap *charmap +} + +func (m charmapDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + for i, c := range src { + if m.charmap.asciiSuperset && c < utf8.RuneSelf { + if nDst >= len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst] = c + nDst++ + nSrc = i + 1 + continue + } + + decode := &m.charmap.decode[c] + n := int(decode.len) + if nDst+n > len(dst) { + err = transform.ErrShortDst + break + } + // It's 15% faster to avoid calling copy for these tiny slices. + for j := 0; j < n; j++ { + dst[nDst] = decode.data[j] + nDst++ + } + nSrc = i + 1 + } + return nDst, nSrc, err +} + +// charmapEncoder implements transform.Transformer by encoding from UTF-8. +type charmapEncoder struct { + transform.NopResetter + charmap *charmap +} + +func (m charmapEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + r, size := rune(0), 0 +loop: + for nSrc < len(src) { + if nDst >= len(dst) { + err = transform.ErrShortDst + break + } + r = rune(src[nSrc]) + + // Decode a 1-byte rune. + if r < utf8.RuneSelf { + if m.charmap.asciiSuperset { + nSrc++ + dst[nDst] = uint8(r) + nDst++ + continue + } + size = 1 + + } else { + // Decode a multi-byte rune. + r, size = utf8.DecodeRune(src[nSrc:]) + if size == 1 { + // All valid runes of size 1 (those below utf8.RuneSelf) were + // handled above. We have invalid UTF-8 or we haven't seen the + // full character yet. + if !atEOF && !utf8.FullRune(src[nSrc:]) { + err = transform.ErrShortSrc + } else { + err = internal.RepertoireError(m.charmap.replacement) + } + break + } + } + + // Binary search in [low, high) for that rune in the m.charmap.encode table. + for low, high := int(m.charmap.low), 0x100; ; { + if low >= high { + err = internal.RepertoireError(m.charmap.replacement) + break loop + } + mid := (low + high) / 2 + got := m.charmap.encode[mid] + gotRune := rune(got & (1<<24 - 1)) + if gotRune < r { + low = mid + 1 + } else if gotRune > r { + high = mid + } else { + dst[nDst] = byte(got >> 24) + nDst++ + break + } + } + nSrc += size + } + return nDst, nSrc, err +} diff --git a/vendor/golang.org/x/text/encoding/charmap/charmap_test.go b/vendor/golang.org/x/text/encoding/charmap/charmap_test.go new file mode 100644 index 0000000000..aa54fe227e --- /dev/null +++ b/vendor/golang.org/x/text/encoding/charmap/charmap_test.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 charmap + +import ( + "testing" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal" + "golang.org/x/text/transform" +) + +func dec(e encoding.Encoding) (dir string, t transform.Transformer, err error) { + return "Decode", e.NewDecoder(), nil +} +func enc(e encoding.Encoding) (dir string, t transform.Transformer, err error) { + return "Encode", e.NewEncoder(), internal.ErrASCIIReplacement +} + +func TestNonRepertoire(t *testing.T) { + testCases := []struct { + init func(e encoding.Encoding) (string, transform.Transformer, error) + e encoding.Encoding + src, want string + }{ + {dec, Windows1252, "\x81", "\ufffd"}, + + {enc, Windows1252, "갂", ""}, + {enc, Windows1252, "a갂", "a"}, + {enc, Windows1252, "\u00E9갂", "\xE9"}, + } + for _, tc := range testCases { + dir, tr, wantErr := tc.init(tc.e) + + dst, _, err := transform.String(tr, tc.src) + if err != wantErr { + t.Errorf("%s %v(%q): got %v; want %v", dir, tc.e, tc.src, err, wantErr) + } + if got := string(dst); got != tc.want { + t.Errorf("%s %v(%q):\ngot %q\nwant %q", dir, tc.e, tc.src, got, tc.want) + } + } +} diff --git a/vendor/golang.org/x/text/encoding/charmap/maketables.go b/vendor/golang.org/x/text/encoding/charmap/maketables.go new file mode 100644 index 0000000000..099108121c --- /dev/null +++ b/vendor/golang.org/x/text/encoding/charmap/maketables.go @@ -0,0 +1,500 @@ +// Copyright 2013 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" + "fmt" + "log" + "net/http" + "sort" + "strings" + "unicode/utf8" + + "golang.org/x/text/encoding" + "golang.org/x/text/internal/gen" +) + +const ascii = "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" + + "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" + + ` !"#$%&'()*+,-./0123456789:;<=>?` + + `@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_` + + "`abcdefghijklmnopqrstuvwxyz{|}~\u007f" + +var encodings = []struct { + name string + mib string + comment string + varName string + replacement byte + mapping string +}{ + { + "IBM Code Page 437", + "PC8CodePage437", + "", + "CodePage437", + encoding.ASCIISub, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM437-2.1.2.ucm", + }, + { + "IBM Code Page 850", + "PC850Multilingual", + "", + "CodePage850", + encoding.ASCIISub, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM850-2.1.2.ucm", + }, + { + "IBM Code Page 852", + "PCp852", + "", + "CodePage852", + encoding.ASCIISub, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM852-2.1.2.ucm", + }, + { + "IBM Code Page 855", + "IBM855", + "", + "CodePage855", + encoding.ASCIISub, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM855-2.1.2.ucm", + }, + { + "Windows Code Page 858", // PC latin1 with Euro + "IBM00858", + "", + "CodePage858", + encoding.ASCIISub, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/windows-858-2000.ucm", + }, + { + "IBM Code Page 862", + "PC862LatinHebrew", + "", + "CodePage862", + encoding.ASCIISub, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM862-2.1.2.ucm", + }, + { + "IBM Code Page 866", + "IBM866", + "", + "CodePage866", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-ibm866.txt", + }, + { + "ISO 8859-1", + "ISOLatin1", + "", + "ISO8859_1", + encoding.ASCIISub, + "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/iso-8859_1-1998.ucm", + }, + { + "ISO 8859-2", + "ISOLatin2", + "", + "ISO8859_2", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-2.txt", + }, + { + "ISO 8859-3", + "ISOLatin3", + "", + "ISO8859_3", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-3.txt", + }, + { + "ISO 8859-4", + "ISOLatin4", + "", + "ISO8859_4", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-4.txt", + }, + { + "ISO 8859-5", + "ISOLatinCyrillic", + "", + "ISO8859_5", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-5.txt", + }, + { + "ISO 8859-6", + "ISOLatinArabic", + "", + "ISO8859_6,ISO8859_6E,ISO8859_6I", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-6.txt", + }, + { + "ISO 8859-7", + "ISOLatinGreek", + "", + "ISO8859_7", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-7.txt", + }, + { + "ISO 8859-8", + "ISOLatinHebrew", + "", + "ISO8859_8,ISO8859_8E,ISO8859_8I", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-8.txt", + }, + { + "ISO 8859-10", + "ISOLatin6", + "", + "ISO8859_10", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-10.txt", + }, + { + "ISO 8859-13", + "ISO885913", + "", + "ISO8859_13", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-13.txt", + }, + { + "ISO 8859-14", + "ISO885914", + "", + "ISO8859_14", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-14.txt", + }, + { + "ISO 8859-15", + "ISO885915", + "", + "ISO8859_15", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-15.txt", + }, + { + "ISO 8859-16", + "ISO885916", + "", + "ISO8859_16", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-iso-8859-16.txt", + }, + { + "KOI8-R", + "KOI8R", + "", + "KOI8R", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-koi8-r.txt", + }, + { + "KOI8-U", + "KOI8U", + "", + "KOI8U", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-koi8-u.txt", + }, + { + "Macintosh", + "Macintosh", + "", + "Macintosh", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-macintosh.txt", + }, + { + "Macintosh Cyrillic", + "MacintoshCyrillic", + "", + "MacintoshCyrillic", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-x-mac-cyrillic.txt", + }, + { + "Windows 874", + "Windows874", + "", + "Windows874", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-874.txt", + }, + { + "Windows 1250", + "Windows1250", + "", + "Windows1250", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-1250.txt", + }, + { + "Windows 1251", + "Windows1251", + "", + "Windows1251", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-1251.txt", + }, + { + "Windows 1252", + "Windows1252", + "", + "Windows1252", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-1252.txt", + }, + { + "Windows 1253", + "Windows1253", + "", + "Windows1253", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-1253.txt", + }, + { + "Windows 1254", + "Windows1254", + "", + "Windows1254", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-1254.txt", + }, + { + "Windows 1255", + "Windows1255", + "", + "Windows1255", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-1255.txt", + }, + { + "Windows 1256", + "Windows1256", + "", + "Windows1256", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-1256.txt", + }, + { + "Windows 1257", + "Windows1257", + "", + "Windows1257", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-1257.txt", + }, + { + "Windows 1258", + "Windows1258", + "", + "Windows1258", + encoding.ASCIISub, + "http://encoding.spec.whatwg.org/index-windows-1258.txt", + }, + { + "X-User-Defined", + "XUserDefined", + "It is defined at http://encoding.spec.whatwg.org/#x-user-defined", + "XUserDefined", + encoding.ASCIISub, + ascii + + "\uf780\uf781\uf782\uf783\uf784\uf785\uf786\uf787" + + "\uf788\uf789\uf78a\uf78b\uf78c\uf78d\uf78e\uf78f" + + "\uf790\uf791\uf792\uf793\uf794\uf795\uf796\uf797" + + "\uf798\uf799\uf79a\uf79b\uf79c\uf79d\uf79e\uf79f" + + "\uf7a0\uf7a1\uf7a2\uf7a3\uf7a4\uf7a5\uf7a6\uf7a7" + + "\uf7a8\uf7a9\uf7aa\uf7ab\uf7ac\uf7ad\uf7ae\uf7af" + + "\uf7b0\uf7b1\uf7b2\uf7b3\uf7b4\uf7b5\uf7b6\uf7b7" + + "\uf7b8\uf7b9\uf7ba\uf7bb\uf7bc\uf7bd\uf7be\uf7bf" + + "\uf7c0\uf7c1\uf7c2\uf7c3\uf7c4\uf7c5\uf7c6\uf7c7" + + "\uf7c8\uf7c9\uf7ca\uf7cb\uf7cc\uf7cd\uf7ce\uf7cf" + + "\uf7d0\uf7d1\uf7d2\uf7d3\uf7d4\uf7d5\uf7d6\uf7d7" + + "\uf7d8\uf7d9\uf7da\uf7db\uf7dc\uf7dd\uf7de\uf7df" + + "\uf7e0\uf7e1\uf7e2\uf7e3\uf7e4\uf7e5\uf7e6\uf7e7" + + "\uf7e8\uf7e9\uf7ea\uf7eb\uf7ec\uf7ed\uf7ee\uf7ef" + + "\uf7f0\uf7f1\uf7f2\uf7f3\uf7f4\uf7f5\uf7f6\uf7f7" + + "\uf7f8\uf7f9\uf7fa\uf7fb\uf7fc\uf7fd\uf7fe\uf7ff", + }, +} + +func getWHATWG(url string) string { + res, err := http.Get(url) + if err != nil { + log.Fatalf("%q: Get: %v", url, err) + } + defer res.Body.Close() + + mapping := make([]rune, 128) + for i := range mapping { + mapping[i] = '\ufffd' + } + + scanner := bufio.NewScanner(res.Body) + for scanner.Scan() { + s := strings.TrimSpace(scanner.Text()) + if s == "" || s[0] == '#' { + continue + } + x, y := 0, 0 + if _, err := fmt.Sscanf(s, "%d\t0x%x", &x, &y); err != nil { + log.Fatalf("could not parse %q", s) + } + if x < 0 || 128 <= x { + log.Fatalf("code %d is out of range", x) + } + if 0x80 <= y && y < 0xa0 { + // We diverge from the WHATWG spec by mapping control characters + // in the range [0x80, 0xa0) to U+FFFD. + continue + } + mapping[x] = rune(y) + } + return ascii + string(mapping) +} + +func getUCM(url string) string { + res, err := http.Get(url) + if err != nil { + log.Fatalf("%q: Get: %v", url, err) + } + defer res.Body.Close() + + mapping := make([]rune, 256) + for i := range mapping { + mapping[i] = '\ufffd' + } + + charsFound := 0 + scanner := bufio.NewScanner(res.Body) + for scanner.Scan() { + s := strings.TrimSpace(scanner.Text()) + if s == "" || s[0] == '#' { + continue + } + var c byte + var r rune + if _, err := fmt.Sscanf(s, `<U%x> \x%x |0`, &r, &c); err != nil { + continue + } + mapping[c] = r + charsFound++ + } + + if charsFound < 200 { + log.Fatalf("%q: only %d characters found (wrong page format?)", url, charsFound) + } + + return string(mapping) +} + +func main() { + mibs := map[string]bool{} + all := []string{} + + w := gen.NewCodeWriter() + defer w.WriteGoFile("tables.go", "charmap") + + printf := func(s string, a ...interface{}) { fmt.Fprintf(w, s, a...) } + + printf("import (\n") + printf("\t\"golang.org/x/text/encoding\"\n") + printf("\t\"golang.org/x/text/encoding/internal/identifier\"\n") + printf(")\n\n") + for _, e := range encodings { + varNames := strings.Split(e.varName, ",") + all = append(all, varNames...) + varName := varNames[0] + switch { + case strings.HasPrefix(e.mapping, "http://encoding.spec.whatwg.org/"): + e.mapping = getWHATWG(e.mapping) + case strings.HasPrefix(e.mapping, "http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/"): + e.mapping = getUCM(e.mapping) + } + + asciiSuperset, low := strings.HasPrefix(e.mapping, ascii), 0x00 + if asciiSuperset { + low = 0x80 + } + lvn := 1 + if strings.HasPrefix(varName, "ISO") || strings.HasPrefix(varName, "KOI") { + lvn = 3 + } + lowerVarName := strings.ToLower(varName[:lvn]) + varName[lvn:] + printf("// %s is the %s encoding.\n", varName, e.name) + if e.comment != "" { + printf("//\n// %s\n", e.comment) + } + printf("var %s encoding.Encoding = &%s\n\nvar %s = charmap{\nname: %q,\n", + varName, lowerVarName, lowerVarName, e.name) + if mibs[e.mib] { + log.Fatalf("MIB type %q declared multiple times.", e.mib) + } + printf("mib: identifier.%s,\n", e.mib) + printf("asciiSuperset: %t,\n", asciiSuperset) + printf("low: 0x%02x,\n", low) + printf("replacement: 0x%02x,\n", e.replacement) + + printf("decode: [256]utf8Enc{\n") + i, backMapping := 0, map[rune]byte{} + for _, c := range e.mapping { + if _, ok := backMapping[c]; !ok && c != utf8.RuneError { + backMapping[c] = byte(i) + } + var buf [8]byte + n := utf8.EncodeRune(buf[:], c) + if n > 3 { + panic(fmt.Sprintf("rune %q (%U) is too long", c, c)) + } + printf("{%d,[3]byte{0x%02x,0x%02x,0x%02x}},", n, buf[0], buf[1], buf[2]) + if i%2 == 1 { + printf("\n") + } + i++ + } + printf("},\n") + + printf("encode: [256]uint32{\n") + encode := make([]uint32, 0, 256) + for c, i := range backMapping { + encode = append(encode, uint32(i)<<24|uint32(c)) + } + sort.Sort(byRune(encode)) + for len(encode) < cap(encode) { + encode = append(encode, encode[len(encode)-1]) + } + for i, enc := range encode { + printf("0x%08x,", enc) + if i%8 == 7 { + printf("\n") + } + } + printf("},\n}\n") + + // Add an estimate of the size of a single charmap{} struct value, which + // includes two 256 elem arrays of 4 bytes and some extra fields, which + // align to 3 uint64s on 64-bit architectures. + w.Size += 2*4*256 + 3*8 + } + // TODO: add proper line breaking. + printf("var listAll = []encoding.Encoding{\n%s,\n}\n\n", strings.Join(all, ",\n")) +} + +type byRune []uint32 + +func (b byRune) Len() int { return len(b) } +func (b byRune) Less(i, j int) bool { return b[i]&0xffffff < b[j]&0xffffff } +func (b byRune) Swap(i, j int) { b[i], b[j] = b[j], b[i] } diff --git a/vendor/golang.org/x/text/encoding/charmap/tables.go b/vendor/golang.org/x/text/encoding/charmap/tables.go new file mode 100644 index 0000000000..2bcef84d36 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/charmap/tables.go @@ -0,0 +1,6178 @@ +// This file was generated by go generate; DO NOT EDIT + +package charmap + +import ( + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal/identifier" +) + +// CodePage437 is the IBM Code Page 437 encoding. +var CodePage437 encoding.Encoding = &codePage437 + +var codePage437 = charmap{ + name: "IBM Code Page 437", + mib: identifier.PC8CodePage437, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, + {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, + {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, + {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, + {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, + {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, + {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, + {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, + {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, + {2, [3]byte{0xc3, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, + {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, + {3, [3]byte{0xe2, 0x82, 0xa7}}, {2, [3]byte{0xc6, 0x92, 0x00}}, + {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, + {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, + {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, + {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, + {2, [3]byte{0xc2, 0xbf, 0x00}}, {3, [3]byte{0xe2, 0x8c, 0x90}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, + {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, + {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, + {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}}, + {3, [3]byte{0xe2, 0x94, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa1}}, + {3, [3]byte{0xe2, 0x95, 0xa2}}, {3, [3]byte{0xe2, 0x95, 0x96}}, + {3, [3]byte{0xe2, 0x95, 0x95}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, + {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}}, + {3, [3]byte{0xe2, 0x95, 0x9d}}, {3, [3]byte{0xe2, 0x95, 0x9c}}, + {3, [3]byte{0xe2, 0x95, 0x9b}}, {3, [3]byte{0xe2, 0x94, 0x90}}, + {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, + {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, + {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, + {3, [3]byte{0xe2, 0x95, 0x9e}}, {3, [3]byte{0xe2, 0x95, 0x9f}}, + {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}}, + {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, + {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}}, + {3, [3]byte{0xe2, 0x95, 0xac}}, {3, [3]byte{0xe2, 0x95, 0xa7}}, + {3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa4}}, + {3, [3]byte{0xe2, 0x95, 0xa5}}, {3, [3]byte{0xe2, 0x95, 0x99}}, + {3, [3]byte{0xe2, 0x95, 0x98}}, {3, [3]byte{0xe2, 0x95, 0x92}}, + {3, [3]byte{0xe2, 0x95, 0x93}}, {3, [3]byte{0xe2, 0x95, 0xab}}, + {3, [3]byte{0xe2, 0x95, 0xaa}}, {3, [3]byte{0xe2, 0x94, 0x98}}, + {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}}, + {3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x8c}}, + {3, [3]byte{0xe2, 0x96, 0x90}}, {3, [3]byte{0xe2, 0x96, 0x80}}, + {2, [3]byte{0xce, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xce, 0x93, 0x00}}, {2, [3]byte{0xcf, 0x80, 0x00}}, + {2, [3]byte{0xce, 0xa3, 0x00}}, {2, [3]byte{0xcf, 0x83, 0x00}}, + {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xcf, 0x84, 0x00}}, + {2, [3]byte{0xce, 0xa6, 0x00}}, {2, [3]byte{0xce, 0x98, 0x00}}, + {2, [3]byte{0xce, 0xa9, 0x00}}, {2, [3]byte{0xce, 0xb4, 0x00}}, + {3, [3]byte{0xe2, 0x88, 0x9e}}, {2, [3]byte{0xcf, 0x86, 0x00}}, + {2, [3]byte{0xce, 0xb5, 0x00}}, {3, [3]byte{0xe2, 0x88, 0xa9}}, + {3, [3]byte{0xe2, 0x89, 0xa1}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {3, [3]byte{0xe2, 0x89, 0xa5}}, {3, [3]byte{0xe2, 0x89, 0xa4}}, + {3, [3]byte{0xe2, 0x8c, 0xa0}}, {3, [3]byte{0xe2, 0x8c, 0xa1}}, + {2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x89, 0x88}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x99}}, + {2, [3]byte{0xc2, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}}, + {3, [3]byte{0xe2, 0x81, 0xbf}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, + {3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xff0000a0, 0xad0000a1, 0x9b0000a2, 0x9c0000a3, 0x9d0000a5, 0xa60000aa, 0xae0000ab, 0xaa0000ac, + 0xf80000b0, 0xf10000b1, 0xfd0000b2, 0xe60000b5, 0xfa0000b7, 0xa70000ba, 0xaf0000bb, 0xac0000bc, + 0xab0000bd, 0xa80000bf, 0x8e0000c4, 0x8f0000c5, 0x920000c6, 0x800000c7, 0x900000c9, 0xa50000d1, + 0x990000d6, 0x9a0000dc, 0xe10000df, 0x850000e0, 0xa00000e1, 0x830000e2, 0x840000e4, 0x860000e5, + 0x910000e6, 0x870000e7, 0x8a0000e8, 0x820000e9, 0x880000ea, 0x890000eb, 0x8d0000ec, 0xa10000ed, + 0x8c0000ee, 0x8b0000ef, 0xa40000f1, 0x950000f2, 0xa20000f3, 0x930000f4, 0x940000f6, 0xf60000f7, + 0x970000f9, 0xa30000fa, 0x960000fb, 0x810000fc, 0x980000ff, 0x9f000192, 0xe2000393, 0xe9000398, + 0xe40003a3, 0xe80003a6, 0xea0003a9, 0xe00003b1, 0xeb0003b4, 0xee0003b5, 0xe30003c0, 0xe50003c3, + 0xe70003c4, 0xed0003c6, 0xfc00207f, 0x9e0020a7, 0xf9002219, 0xfb00221a, 0xec00221e, 0xef002229, + 0xf7002248, 0xf0002261, 0xf3002264, 0xf2002265, 0xa9002310, 0xf4002320, 0xf5002321, 0xc4002500, + 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, + 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xd5002552, 0xd6002553, 0xc9002554, 0xb8002555, + 0xb7002556, 0xbb002557, 0xd4002558, 0xd3002559, 0xc800255a, 0xbe00255b, 0xbd00255c, 0xbc00255d, + 0xc600255e, 0xc700255f, 0xcc002560, 0xb5002561, 0xb6002562, 0xb9002563, 0xd1002564, 0xd2002565, + 0xcb002566, 0xcf002567, 0xd0002568, 0xca002569, 0xd800256a, 0xd700256b, 0xce00256c, 0xdf002580, + 0xdc002584, 0xdb002588, 0xdd00258c, 0xde002590, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0, + }, +} + +// CodePage850 is the IBM Code Page 850 encoding. +var CodePage850 encoding.Encoding = &codePage850 + +var codePage850 = charmap{ + name: "IBM Code Page 850", + mib: identifier.PC850Multilingual, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, + {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, + {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, + {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, + {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, + {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, + {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, + {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, + {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, + {2, [3]byte{0xc3, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, + {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, + {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc6, 0x92, 0x00}}, + {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, + {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, + {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, + {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, + {2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, + {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, + {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, + {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}}, + {3, [3]byte{0xe2, 0x94, 0xa4}}, {2, [3]byte{0xc3, 0x81, 0x00}}, + {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}}, + {2, [3]byte{0xc2, 0xa9, 0x00}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, + {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}}, + {3, [3]byte{0xe2, 0x95, 0x9d}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, + {2, [3]byte{0xc2, 0xa5, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x90}}, + {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, + {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, + {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, + {2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, + {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}}, + {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, + {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}}, + {3, [3]byte{0xe2, 0x95, 0xac}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, + {2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0x90, 0x00}}, + {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, + {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc4, 0xb1, 0x00}}, + {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, + {2, [3]byte{0xc3, 0x8f, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x98}}, + {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}}, + {3, [3]byte{0xe2, 0x96, 0x84}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, + {2, [3]byte{0xc3, 0x8c, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x80}}, + {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}}, + {2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, + {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xbe, 0x00}}, + {2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, + {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, + {2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, + {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, + {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {3, [3]byte{0xe2, 0x80, 0x97}}, {2, [3]byte{0xc2, 0xbe, 0x00}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, + {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, + {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, + {3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xff0000a0, 0xad0000a1, 0xbd0000a2, 0x9c0000a3, 0xcf0000a4, 0xbe0000a5, 0xdd0000a6, 0xf50000a7, + 0xf90000a8, 0xb80000a9, 0xa60000aa, 0xae0000ab, 0xaa0000ac, 0xf00000ad, 0xa90000ae, 0xee0000af, + 0xf80000b0, 0xf10000b1, 0xfd0000b2, 0xfc0000b3, 0xef0000b4, 0xe60000b5, 0xf40000b6, 0xfa0000b7, + 0xf70000b8, 0xfb0000b9, 0xa70000ba, 0xaf0000bb, 0xac0000bc, 0xab0000bd, 0xf30000be, 0xa80000bf, + 0xb70000c0, 0xb50000c1, 0xb60000c2, 0xc70000c3, 0x8e0000c4, 0x8f0000c5, 0x920000c6, 0x800000c7, + 0xd40000c8, 0x900000c9, 0xd20000ca, 0xd30000cb, 0xde0000cc, 0xd60000cd, 0xd70000ce, 0xd80000cf, + 0xd10000d0, 0xa50000d1, 0xe30000d2, 0xe00000d3, 0xe20000d4, 0xe50000d5, 0x990000d6, 0x9e0000d7, + 0x9d0000d8, 0xeb0000d9, 0xe90000da, 0xea0000db, 0x9a0000dc, 0xed0000dd, 0xe80000de, 0xe10000df, + 0x850000e0, 0xa00000e1, 0x830000e2, 0xc60000e3, 0x840000e4, 0x860000e5, 0x910000e6, 0x870000e7, + 0x8a0000e8, 0x820000e9, 0x880000ea, 0x890000eb, 0x8d0000ec, 0xa10000ed, 0x8c0000ee, 0x8b0000ef, + 0xd00000f0, 0xa40000f1, 0x950000f2, 0xa20000f3, 0x930000f4, 0xe40000f5, 0x940000f6, 0xf60000f7, + 0x9b0000f8, 0x970000f9, 0xa30000fa, 0x960000fb, 0x810000fc, 0xec0000fd, 0xe70000fe, 0x980000ff, + 0xd5000131, 0x9f000192, 0xf2002017, 0xc4002500, 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, + 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, + 0xc9002554, 0xbb002557, 0xc800255a, 0xbc00255d, 0xcc002560, 0xb9002563, 0xcb002566, 0xca002569, + 0xce00256c, 0xdf002580, 0xdc002584, 0xdb002588, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0, + }, +} + +// CodePage852 is the IBM Code Page 852 encoding. +var CodePage852 encoding.Encoding = &codePage852 + +var codePage852 = charmap{ + name: "IBM Code Page 852", + mib: identifier.PCp852, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, + {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc5, 0xaf, 0x00}}, + {2, [3]byte{0xc4, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, + {2, [3]byte{0xc5, 0x82, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, + {2, [3]byte{0xc5, 0x90, 0x00}}, {2, [3]byte{0xc5, 0x91, 0x00}}, + {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc5, 0xb9, 0x00}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc4, 0x86, 0x00}}, + {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc4, 0xb9, 0x00}}, + {2, [3]byte{0xc4, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc4, 0xbd, 0x00}}, + {2, [3]byte{0xc4, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0x9a, 0x00}}, + {2, [3]byte{0xc5, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc5, 0xa4, 0x00}}, + {2, [3]byte{0xc5, 0xa5, 0x00}}, {2, [3]byte{0xc5, 0x81, 0x00}}, + {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc4, 0x8d, 0x00}}, + {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, + {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, + {2, [3]byte{0xc4, 0x84, 0x00}}, {2, [3]byte{0xc4, 0x85, 0x00}}, + {2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc5, 0xbe, 0x00}}, + {2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc4, 0x99, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc5, 0xba, 0x00}}, + {2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc5, 0x9f, 0x00}}, + {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, + {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}}, + {3, [3]byte{0xe2, 0x94, 0xa4}}, {2, [3]byte{0xc3, 0x81, 0x00}}, + {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc4, 0x9a, 0x00}}, + {2, [3]byte{0xc5, 0x9e, 0x00}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, + {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}}, + {3, [3]byte{0xe2, 0x95, 0x9d}}, {2, [3]byte{0xc5, 0xbb, 0x00}}, + {2, [3]byte{0xc5, 0xbc, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x90}}, + {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, + {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, + {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, + {2, [3]byte{0xc4, 0x82, 0x00}}, {2, [3]byte{0xc4, 0x83, 0x00}}, + {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}}, + {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, + {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}}, + {3, [3]byte{0xe2, 0x95, 0xac}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, + {2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc4, 0x90, 0x00}}, + {2, [3]byte{0xc4, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, + {2, [3]byte{0xc4, 0x8f, 0x00}}, {2, [3]byte{0xc5, 0x87, 0x00}}, + {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, + {2, [3]byte{0xc4, 0x9b, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x98}}, + {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}}, + {3, [3]byte{0xe2, 0x96, 0x84}}, {2, [3]byte{0xc5, 0xa2, 0x00}}, + {2, [3]byte{0xc5, 0xae, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x80}}, + {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc5, 0x83, 0x00}}, + {2, [3]byte{0xc5, 0x84, 0x00}}, {2, [3]byte{0xc5, 0x88, 0x00}}, + {2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc5, 0xa1, 0x00}}, + {2, [3]byte{0xc5, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, + {2, [3]byte{0xc5, 0x95, 0x00}}, {2, [3]byte{0xc5, 0xb0, 0x00}}, + {2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, + {2, [3]byte{0xc5, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, + {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xcb, 0x9d, 0x00}}, + {2, [3]byte{0xcb, 0x9b, 0x00}}, {2, [3]byte{0xcb, 0x87, 0x00}}, + {2, [3]byte{0xcb, 0x98, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, + {2, [3]byte{0xcb, 0x99, 0x00}}, {2, [3]byte{0xc5, 0xb1, 0x00}}, + {2, [3]byte{0xc5, 0x98, 0x00}}, {2, [3]byte{0xc5, 0x99, 0x00}}, + {3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xff0000a0, 0xcf0000a4, 0xf50000a7, 0xf90000a8, 0xae0000ab, 0xaa0000ac, 0xf00000ad, 0xf80000b0, + 0xef0000b4, 0xf70000b8, 0xaf0000bb, 0xb50000c1, 0xb60000c2, 0x8e0000c4, 0x800000c7, 0x900000c9, + 0xd30000cb, 0xd60000cd, 0xd70000ce, 0xe00000d3, 0xe20000d4, 0x990000d6, 0x9e0000d7, 0xe90000da, + 0x9a0000dc, 0xed0000dd, 0xe10000df, 0xa00000e1, 0x830000e2, 0x840000e4, 0x870000e7, 0x820000e9, + 0x890000eb, 0xa10000ed, 0x8c0000ee, 0xa20000f3, 0x930000f4, 0x940000f6, 0xf60000f7, 0xa30000fa, + 0x810000fc, 0xec0000fd, 0xc6000102, 0xc7000103, 0xa4000104, 0xa5000105, 0x8f000106, 0x86000107, + 0xac00010c, 0x9f00010d, 0xd200010e, 0xd400010f, 0xd1000110, 0xd0000111, 0xa8000118, 0xa9000119, + 0xb700011a, 0xd800011b, 0x91000139, 0x9200013a, 0x9500013d, 0x9600013e, 0x9d000141, 0x88000142, + 0xe3000143, 0xe4000144, 0xd5000147, 0xe5000148, 0x8a000150, 0x8b000151, 0xe8000154, 0xea000155, + 0xfc000158, 0xfd000159, 0x9700015a, 0x9800015b, 0xb800015e, 0xad00015f, 0xe6000160, 0xe7000161, + 0xdd000162, 0xee000163, 0x9b000164, 0x9c000165, 0xde00016e, 0x8500016f, 0xeb000170, 0xfb000171, + 0x8d000179, 0xab00017a, 0xbd00017b, 0xbe00017c, 0xa600017d, 0xa700017e, 0xf30002c7, 0xf40002d8, + 0xfa0002d9, 0xf20002db, 0xf10002dd, 0xc4002500, 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, + 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, + 0xc9002554, 0xbb002557, 0xc800255a, 0xbc00255d, 0xcc002560, 0xb9002563, 0xcb002566, 0xca002569, + 0xce00256c, 0xdf002580, 0xdc002584, 0xdb002588, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0, + }, +} + +// CodePage855 is the IBM Code Page 855 encoding. +var CodePage855 encoding.Encoding = &codePage855 + +var codePage855 = charmap{ + name: "IBM Code Page 855", + mib: identifier.IBM855, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {2, [3]byte{0xd1, 0x92, 0x00}}, {2, [3]byte{0xd0, 0x82, 0x00}}, + {2, [3]byte{0xd1, 0x93, 0x00}}, {2, [3]byte{0xd0, 0x83, 0x00}}, + {2, [3]byte{0xd1, 0x91, 0x00}}, {2, [3]byte{0xd0, 0x81, 0x00}}, + {2, [3]byte{0xd1, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x84, 0x00}}, + {2, [3]byte{0xd1, 0x95, 0x00}}, {2, [3]byte{0xd0, 0x85, 0x00}}, + {2, [3]byte{0xd1, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x86, 0x00}}, + {2, [3]byte{0xd1, 0x97, 0x00}}, {2, [3]byte{0xd0, 0x87, 0x00}}, + {2, [3]byte{0xd1, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x88, 0x00}}, + {2, [3]byte{0xd1, 0x99, 0x00}}, {2, [3]byte{0xd0, 0x89, 0x00}}, + {2, [3]byte{0xd1, 0x9a, 0x00}}, {2, [3]byte{0xd0, 0x8a, 0x00}}, + {2, [3]byte{0xd1, 0x9b, 0x00}}, {2, [3]byte{0xd0, 0x8b, 0x00}}, + {2, [3]byte{0xd1, 0x9c, 0x00}}, {2, [3]byte{0xd0, 0x8c, 0x00}}, + {2, [3]byte{0xd1, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x8e, 0x00}}, + {2, [3]byte{0xd1, 0x9f, 0x00}}, {2, [3]byte{0xd0, 0x8f, 0x00}}, + {2, [3]byte{0xd1, 0x8e, 0x00}}, {2, [3]byte{0xd0, 0xae, 0x00}}, + {2, [3]byte{0xd1, 0x8a, 0x00}}, {2, [3]byte{0xd0, 0xaa, 0x00}}, + {2, [3]byte{0xd0, 0xb0, 0x00}}, {2, [3]byte{0xd0, 0x90, 0x00}}, + {2, [3]byte{0xd0, 0xb1, 0x00}}, {2, [3]byte{0xd0, 0x91, 0x00}}, + {2, [3]byte{0xd1, 0x86, 0x00}}, {2, [3]byte{0xd0, 0xa6, 0x00}}, + {2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0x94, 0x00}}, + {2, [3]byte{0xd0, 0xb5, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}}, + {2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd0, 0xa4, 0x00}}, + {2, [3]byte{0xd0, 0xb3, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}}, + {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, + {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}}, + {3, [3]byte{0xe2, 0x94, 0xa4}}, {2, [3]byte{0xd1, 0x85, 0x00}}, + {2, [3]byte{0xd0, 0xa5, 0x00}}, {2, [3]byte{0xd0, 0xb8, 0x00}}, + {2, [3]byte{0xd0, 0x98, 0x00}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, + {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}}, + {3, [3]byte{0xe2, 0x95, 0x9d}}, {2, [3]byte{0xd0, 0xb9, 0x00}}, + {2, [3]byte{0xd0, 0x99, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x90}}, + {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, + {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, + {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, + {2, [3]byte{0xd0, 0xba, 0x00}}, {2, [3]byte{0xd0, 0x9a, 0x00}}, + {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}}, + {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, + {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}}, + {3, [3]byte{0xe2, 0x95, 0xac}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, + {2, [3]byte{0xd0, 0xbb, 0x00}}, {2, [3]byte{0xd0, 0x9b, 0x00}}, + {2, [3]byte{0xd0, 0xbc, 0x00}}, {2, [3]byte{0xd0, 0x9c, 0x00}}, + {2, [3]byte{0xd0, 0xbd, 0x00}}, {2, [3]byte{0xd0, 0x9d, 0x00}}, + {2, [3]byte{0xd0, 0xbe, 0x00}}, {2, [3]byte{0xd0, 0x9e, 0x00}}, + {2, [3]byte{0xd0, 0xbf, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x98}}, + {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}}, + {3, [3]byte{0xe2, 0x96, 0x84}}, {2, [3]byte{0xd0, 0x9f, 0x00}}, + {2, [3]byte{0xd1, 0x8f, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x80}}, + {2, [3]byte{0xd0, 0xaf, 0x00}}, {2, [3]byte{0xd1, 0x80, 0x00}}, + {2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}}, + {2, [3]byte{0xd0, 0xa1, 0x00}}, {2, [3]byte{0xd1, 0x82, 0x00}}, + {2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}}, + {2, [3]byte{0xd0, 0xa3, 0x00}}, {2, [3]byte{0xd0, 0xb6, 0x00}}, + {2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0xb2, 0x00}}, + {2, [3]byte{0xd0, 0x92, 0x00}}, {2, [3]byte{0xd1, 0x8c, 0x00}}, + {2, [3]byte{0xd0, 0xac, 0x00}}, {3, [3]byte{0xe2, 0x84, 0x96}}, + {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}}, + {2, [3]byte{0xd0, 0xab, 0x00}}, {2, [3]byte{0xd0, 0xb7, 0x00}}, + {2, [3]byte{0xd0, 0x97, 0x00}}, {2, [3]byte{0xd1, 0x88, 0x00}}, + {2, [3]byte{0xd0, 0xa8, 0x00}}, {2, [3]byte{0xd1, 0x8d, 0x00}}, + {2, [3]byte{0xd0, 0xad, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}}, + {2, [3]byte{0xd0, 0xa9, 0x00}}, {2, [3]byte{0xd1, 0x87, 0x00}}, + {2, [3]byte{0xd0, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xff0000a0, 0xcf0000a4, 0xfd0000a7, 0xae0000ab, 0xf00000ad, 0xaf0000bb, 0x85000401, 0x81000402, + 0x83000403, 0x87000404, 0x89000405, 0x8b000406, 0x8d000407, 0x8f000408, 0x91000409, 0x9300040a, + 0x9500040b, 0x9700040c, 0x9900040e, 0x9b00040f, 0xa1000410, 0xa3000411, 0xec000412, 0xad000413, + 0xa7000414, 0xa9000415, 0xea000416, 0xf4000417, 0xb8000418, 0xbe000419, 0xc700041a, 0xd100041b, + 0xd300041c, 0xd500041d, 0xd700041e, 0xdd00041f, 0xe2000420, 0xe4000421, 0xe6000422, 0xe8000423, + 0xab000424, 0xb6000425, 0xa5000426, 0xfc000427, 0xf6000428, 0xfa000429, 0x9f00042a, 0xf200042b, + 0xee00042c, 0xf800042d, 0x9d00042e, 0xe000042f, 0xa0000430, 0xa2000431, 0xeb000432, 0xac000433, + 0xa6000434, 0xa8000435, 0xe9000436, 0xf3000437, 0xb7000438, 0xbd000439, 0xc600043a, 0xd000043b, + 0xd200043c, 0xd400043d, 0xd600043e, 0xd800043f, 0xe1000440, 0xe3000441, 0xe5000442, 0xe7000443, + 0xaa000444, 0xb5000445, 0xa4000446, 0xfb000447, 0xf5000448, 0xf9000449, 0x9e00044a, 0xf100044b, + 0xed00044c, 0xf700044d, 0x9c00044e, 0xde00044f, 0x84000451, 0x80000452, 0x82000453, 0x86000454, + 0x88000455, 0x8a000456, 0x8c000457, 0x8e000458, 0x90000459, 0x9200045a, 0x9400045b, 0x9600045c, + 0x9800045e, 0x9a00045f, 0xef002116, 0xc4002500, 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, + 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, + 0xc9002554, 0xbb002557, 0xc800255a, 0xbc00255d, 0xcc002560, 0xb9002563, 0xcb002566, 0xca002569, + 0xce00256c, 0xdf002580, 0xdc002584, 0xdb002588, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0, + }, +} + +// CodePage858 is the Windows Code Page 858 encoding. +var CodePage858 encoding.Encoding = &codePage858 + +var codePage858 = charmap{ + name: "Windows Code Page 858", + mib: identifier.IBM00858, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, + {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}}, + {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, + {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, + {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, + {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, + {2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, + {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}}, + {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, + {2, [3]byte{0xc3, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, + {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, + {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc6, 0x92, 0x00}}, + {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, + {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, + {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, + {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, + {2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, + {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, + {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, + {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}}, + {3, [3]byte{0xe2, 0x94, 0xa4}}, {2, [3]byte{0xc3, 0x81, 0x00}}, + {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}}, + {2, [3]byte{0xc2, 0xa9, 0x00}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, + {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}}, + {3, [3]byte{0xe2, 0x95, 0x9d}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, + {2, [3]byte{0xc2, 0xa5, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x90}}, + {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, + {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, + {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, + {2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, + {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}}, + {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, + {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}}, + {3, [3]byte{0xe2, 0x95, 0xac}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, + {2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0x90, 0x00}}, + {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, + {2, [3]byte{0xc3, 0x88, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}}, + {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, + {2, [3]byte{0xc3, 0x8f, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x98}}, + {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}}, + {3, [3]byte{0xe2, 0x96, 0x84}}, {2, [3]byte{0xc2, 0xa6, 0x00}}, + {2, [3]byte{0xc3, 0x8c, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x80}}, + {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}}, + {2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, + {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xbe, 0x00}}, + {2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}}, + {2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, + {2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, + {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, + {2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {3, [3]byte{0xe2, 0x80, 0x97}}, {2, [3]byte{0xc2, 0xbe, 0x00}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, + {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, + {2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, + {3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xff0000a0, 0xad0000a1, 0xbd0000a2, 0x9c0000a3, 0xcf0000a4, 0xbe0000a5, 0xdd0000a6, 0xf50000a7, + 0xf90000a8, 0xb80000a9, 0xa60000aa, 0xae0000ab, 0xaa0000ac, 0xf00000ad, 0xa90000ae, 0xee0000af, + 0xf80000b0, 0xf10000b1, 0xfd0000b2, 0xfc0000b3, 0xef0000b4, 0xe60000b5, 0xf40000b6, 0xfa0000b7, + 0xf70000b8, 0xfb0000b9, 0xa70000ba, 0xaf0000bb, 0xac0000bc, 0xab0000bd, 0xf30000be, 0xa80000bf, + 0xb70000c0, 0xb50000c1, 0xb60000c2, 0xc70000c3, 0x8e0000c4, 0x8f0000c5, 0x920000c6, 0x800000c7, + 0xd40000c8, 0x900000c9, 0xd20000ca, 0xd30000cb, 0xde0000cc, 0xd60000cd, 0xd70000ce, 0xd80000cf, + 0xd10000d0, 0xa50000d1, 0xe30000d2, 0xe00000d3, 0xe20000d4, 0xe50000d5, 0x990000d6, 0x9e0000d7, + 0x9d0000d8, 0xeb0000d9, 0xe90000da, 0xea0000db, 0x9a0000dc, 0xed0000dd, 0xe80000de, 0xe10000df, + 0x850000e0, 0xa00000e1, 0x830000e2, 0xc60000e3, 0x840000e4, 0x860000e5, 0x910000e6, 0x870000e7, + 0x8a0000e8, 0x820000e9, 0x880000ea, 0x890000eb, 0x8d0000ec, 0xa10000ed, 0x8c0000ee, 0x8b0000ef, + 0xd00000f0, 0xa40000f1, 0x950000f2, 0xa20000f3, 0x930000f4, 0xe40000f5, 0x940000f6, 0xf60000f7, + 0x9b0000f8, 0x970000f9, 0xa30000fa, 0x960000fb, 0x810000fc, 0xec0000fd, 0xe70000fe, 0x980000ff, + 0x9f000192, 0xf2002017, 0xd50020ac, 0xc4002500, 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, + 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, + 0xc9002554, 0xbb002557, 0xc800255a, 0xbc00255d, 0xcc002560, 0xb9002563, 0xcb002566, 0xca002569, + 0xce00256c, 0xdf002580, 0xdc002584, 0xdb002588, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0, + }, +} + +// CodePage862 is the IBM Code Page 862 encoding. +var CodePage862 encoding.Encoding = &codePage862 + +var codePage862 = charmap{ + name: "IBM Code Page 862", + mib: identifier.PC862LatinHebrew, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {2, [3]byte{0xd7, 0x90, 0x00}}, {2, [3]byte{0xd7, 0x91, 0x00}}, + {2, [3]byte{0xd7, 0x92, 0x00}}, {2, [3]byte{0xd7, 0x93, 0x00}}, + {2, [3]byte{0xd7, 0x94, 0x00}}, {2, [3]byte{0xd7, 0x95, 0x00}}, + {2, [3]byte{0xd7, 0x96, 0x00}}, {2, [3]byte{0xd7, 0x97, 0x00}}, + {2, [3]byte{0xd7, 0x98, 0x00}}, {2, [3]byte{0xd7, 0x99, 0x00}}, + {2, [3]byte{0xd7, 0x9a, 0x00}}, {2, [3]byte{0xd7, 0x9b, 0x00}}, + {2, [3]byte{0xd7, 0x9c, 0x00}}, {2, [3]byte{0xd7, 0x9d, 0x00}}, + {2, [3]byte{0xd7, 0x9e, 0x00}}, {2, [3]byte{0xd7, 0x9f, 0x00}}, + {2, [3]byte{0xd7, 0xa0, 0x00}}, {2, [3]byte{0xd7, 0xa1, 0x00}}, + {2, [3]byte{0xd7, 0xa2, 0x00}}, {2, [3]byte{0xd7, 0xa3, 0x00}}, + {2, [3]byte{0xd7, 0xa4, 0x00}}, {2, [3]byte{0xd7, 0xa5, 0x00}}, + {2, [3]byte{0xd7, 0xa6, 0x00}}, {2, [3]byte{0xd7, 0xa7, 0x00}}, + {2, [3]byte{0xd7, 0xa8, 0x00}}, {2, [3]byte{0xd7, 0xa9, 0x00}}, + {2, [3]byte{0xd7, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}}, + {2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, + {3, [3]byte{0xe2, 0x82, 0xa7}}, {2, [3]byte{0xc6, 0x92, 0x00}}, + {2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, + {2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}}, + {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, + {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}}, + {2, [3]byte{0xc2, 0xbf, 0x00}}, {3, [3]byte{0xe2, 0x8c, 0x90}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, + {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, + {2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, + {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}}, + {3, [3]byte{0xe2, 0x94, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa1}}, + {3, [3]byte{0xe2, 0x95, 0xa2}}, {3, [3]byte{0xe2, 0x95, 0x96}}, + {3, [3]byte{0xe2, 0x95, 0x95}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, + {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}}, + {3, [3]byte{0xe2, 0x95, 0x9d}}, {3, [3]byte{0xe2, 0x95, 0x9c}}, + {3, [3]byte{0xe2, 0x95, 0x9b}}, {3, [3]byte{0xe2, 0x94, 0x90}}, + {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, + {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, + {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, + {3, [3]byte{0xe2, 0x95, 0x9e}}, {3, [3]byte{0xe2, 0x95, 0x9f}}, + {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}}, + {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, + {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}}, + {3, [3]byte{0xe2, 0x95, 0xac}}, {3, [3]byte{0xe2, 0x95, 0xa7}}, + {3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa4}}, + {3, [3]byte{0xe2, 0x95, 0xa5}}, {3, [3]byte{0xe2, 0x95, 0x99}}, + {3, [3]byte{0xe2, 0x95, 0x98}}, {3, [3]byte{0xe2, 0x95, 0x92}}, + {3, [3]byte{0xe2, 0x95, 0x93}}, {3, [3]byte{0xe2, 0x95, 0xab}}, + {3, [3]byte{0xe2, 0x95, 0xaa}}, {3, [3]byte{0xe2, 0x94, 0x98}}, + {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}}, + {3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x8c}}, + {3, [3]byte{0xe2, 0x96, 0x90}}, {3, [3]byte{0xe2, 0x96, 0x80}}, + {2, [3]byte{0xce, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xce, 0x93, 0x00}}, {2, [3]byte{0xcf, 0x80, 0x00}}, + {2, [3]byte{0xce, 0xa3, 0x00}}, {2, [3]byte{0xcf, 0x83, 0x00}}, + {2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xcf, 0x84, 0x00}}, + {2, [3]byte{0xce, 0xa6, 0x00}}, {2, [3]byte{0xce, 0x98, 0x00}}, + {2, [3]byte{0xce, 0xa9, 0x00}}, {2, [3]byte{0xce, 0xb4, 0x00}}, + {3, [3]byte{0xe2, 0x88, 0x9e}}, {2, [3]byte{0xcf, 0x86, 0x00}}, + {2, [3]byte{0xce, 0xb5, 0x00}}, {3, [3]byte{0xe2, 0x88, 0xa9}}, + {3, [3]byte{0xe2, 0x89, 0xa1}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {3, [3]byte{0xe2, 0x89, 0xa5}}, {3, [3]byte{0xe2, 0x89, 0xa4}}, + {3, [3]byte{0xe2, 0x8c, 0xa0}}, {3, [3]byte{0xe2, 0x8c, 0xa1}}, + {2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x89, 0x88}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x99}}, + {2, [3]byte{0xc2, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}}, + {3, [3]byte{0xe2, 0x81, 0xbf}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, + {3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xff0000a0, 0xad0000a1, 0x9b0000a2, 0x9c0000a3, 0x9d0000a5, 0xa60000aa, 0xae0000ab, 0xaa0000ac, + 0xf80000b0, 0xf10000b1, 0xfd0000b2, 0xe60000b5, 0xfa0000b7, 0xa70000ba, 0xaf0000bb, 0xac0000bc, + 0xab0000bd, 0xa80000bf, 0xa50000d1, 0xe10000df, 0xa00000e1, 0xa10000ed, 0xa40000f1, 0xa20000f3, + 0xf60000f7, 0xa30000fa, 0x9f000192, 0xe2000393, 0xe9000398, 0xe40003a3, 0xe80003a6, 0xea0003a9, + 0xe00003b1, 0xeb0003b4, 0xee0003b5, 0xe30003c0, 0xe50003c3, 0xe70003c4, 0xed0003c6, 0x800005d0, + 0x810005d1, 0x820005d2, 0x830005d3, 0x840005d4, 0x850005d5, 0x860005d6, 0x870005d7, 0x880005d8, + 0x890005d9, 0x8a0005da, 0x8b0005db, 0x8c0005dc, 0x8d0005dd, 0x8e0005de, 0x8f0005df, 0x900005e0, + 0x910005e1, 0x920005e2, 0x930005e3, 0x940005e4, 0x950005e5, 0x960005e6, 0x970005e7, 0x980005e8, + 0x990005e9, 0x9a0005ea, 0xfc00207f, 0x9e0020a7, 0xf9002219, 0xfb00221a, 0xec00221e, 0xef002229, + 0xf7002248, 0xf0002261, 0xf3002264, 0xf2002265, 0xa9002310, 0xf4002320, 0xf5002321, 0xc4002500, + 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, + 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xd5002552, 0xd6002553, 0xc9002554, 0xb8002555, + 0xb7002556, 0xbb002557, 0xd4002558, 0xd3002559, 0xc800255a, 0xbe00255b, 0xbd00255c, 0xbc00255d, + 0xc600255e, 0xc700255f, 0xcc002560, 0xb5002561, 0xb6002562, 0xb9002563, 0xd1002564, 0xd2002565, + 0xcb002566, 0xcf002567, 0xd0002568, 0xca002569, 0xd800256a, 0xd700256b, 0xce00256c, 0xdf002580, + 0xdc002584, 0xdb002588, 0xdd00258c, 0xde002590, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0, + }, +} + +// CodePage866 is the IBM Code Page 866 encoding. +var CodePage866 encoding.Encoding = &codePage866 + +var codePage866 = charmap{ + name: "IBM Code Page 866", + mib: identifier.IBM866, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {2, [3]byte{0xd0, 0x90, 0x00}}, {2, [3]byte{0xd0, 0x91, 0x00}}, + {2, [3]byte{0xd0, 0x92, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}}, + {2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}}, + {2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x97, 0x00}}, + {2, [3]byte{0xd0, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x99, 0x00}}, + {2, [3]byte{0xd0, 0x9a, 0x00}}, {2, [3]byte{0xd0, 0x9b, 0x00}}, + {2, [3]byte{0xd0, 0x9c, 0x00}}, {2, [3]byte{0xd0, 0x9d, 0x00}}, + {2, [3]byte{0xd0, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x9f, 0x00}}, + {2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}}, + {2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}}, + {2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0xa5, 0x00}}, + {2, [3]byte{0xd0, 0xa6, 0x00}}, {2, [3]byte{0xd0, 0xa7, 0x00}}, + {2, [3]byte{0xd0, 0xa8, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}}, + {2, [3]byte{0xd0, 0xaa, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}}, + {2, [3]byte{0xd0, 0xac, 0x00}}, {2, [3]byte{0xd0, 0xad, 0x00}}, + {2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd0, 0xaf, 0x00}}, + {2, [3]byte{0xd0, 0xb0, 0x00}}, {2, [3]byte{0xd0, 0xb1, 0x00}}, + {2, [3]byte{0xd0, 0xb2, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}}, + {2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}}, + {2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0xb7, 0x00}}, + {2, [3]byte{0xd0, 0xb8, 0x00}}, {2, [3]byte{0xd0, 0xb9, 0x00}}, + {2, [3]byte{0xd0, 0xba, 0x00}}, {2, [3]byte{0xd0, 0xbb, 0x00}}, + {2, [3]byte{0xd0, 0xbc, 0x00}}, {2, [3]byte{0xd0, 0xbd, 0x00}}, + {2, [3]byte{0xd0, 0xbe, 0x00}}, {2, [3]byte{0xd0, 0xbf, 0x00}}, + {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, + {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}}, + {3, [3]byte{0xe2, 0x94, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa1}}, + {3, [3]byte{0xe2, 0x95, 0xa2}}, {3, [3]byte{0xe2, 0x95, 0x96}}, + {3, [3]byte{0xe2, 0x95, 0x95}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, + {3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}}, + {3, [3]byte{0xe2, 0x95, 0x9d}}, {3, [3]byte{0xe2, 0x95, 0x9c}}, + {3, [3]byte{0xe2, 0x95, 0x9b}}, {3, [3]byte{0xe2, 0x94, 0x90}}, + {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, + {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}}, + {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}}, + {3, [3]byte{0xe2, 0x95, 0x9e}}, {3, [3]byte{0xe2, 0x95, 0x9f}}, + {3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}}, + {3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}}, + {3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}}, + {3, [3]byte{0xe2, 0x95, 0xac}}, {3, [3]byte{0xe2, 0x95, 0xa7}}, + {3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa4}}, + {3, [3]byte{0xe2, 0x95, 0xa5}}, {3, [3]byte{0xe2, 0x95, 0x99}}, + {3, [3]byte{0xe2, 0x95, 0x98}}, {3, [3]byte{0xe2, 0x95, 0x92}}, + {3, [3]byte{0xe2, 0x95, 0x93}}, {3, [3]byte{0xe2, 0x95, 0xab}}, + {3, [3]byte{0xe2, 0x95, 0xaa}}, {3, [3]byte{0xe2, 0x94, 0x98}}, + {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}}, + {3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x8c}}, + {3, [3]byte{0xe2, 0x96, 0x90}}, {3, [3]byte{0xe2, 0x96, 0x80}}, + {2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}}, + {2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}}, + {2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x85, 0x00}}, + {2, [3]byte{0xd1, 0x86, 0x00}}, {2, [3]byte{0xd1, 0x87, 0x00}}, + {2, [3]byte{0xd1, 0x88, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}}, + {2, [3]byte{0xd1, 0x8a, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}}, + {2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x8d, 0x00}}, + {2, [3]byte{0xd1, 0x8e, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}}, + {2, [3]byte{0xd0, 0x81, 0x00}}, {2, [3]byte{0xd1, 0x91, 0x00}}, + {2, [3]byte{0xd0, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x94, 0x00}}, + {2, [3]byte{0xd0, 0x87, 0x00}}, {2, [3]byte{0xd1, 0x97, 0x00}}, + {2, [3]byte{0xd0, 0x8e, 0x00}}, {2, [3]byte{0xd1, 0x9e, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x99}}, + {2, [3]byte{0xc2, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}}, + {3, [3]byte{0xe2, 0x84, 0x96}}, {2, [3]byte{0xc2, 0xa4, 0x00}}, + {3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xff0000a0, 0xfd0000a4, 0xf80000b0, 0xfa0000b7, 0xf0000401, 0xf2000404, 0xf4000407, 0xf600040e, + 0x80000410, 0x81000411, 0x82000412, 0x83000413, 0x84000414, 0x85000415, 0x86000416, 0x87000417, + 0x88000418, 0x89000419, 0x8a00041a, 0x8b00041b, 0x8c00041c, 0x8d00041d, 0x8e00041e, 0x8f00041f, + 0x90000420, 0x91000421, 0x92000422, 0x93000423, 0x94000424, 0x95000425, 0x96000426, 0x97000427, + 0x98000428, 0x99000429, 0x9a00042a, 0x9b00042b, 0x9c00042c, 0x9d00042d, 0x9e00042e, 0x9f00042f, + 0xa0000430, 0xa1000431, 0xa2000432, 0xa3000433, 0xa4000434, 0xa5000435, 0xa6000436, 0xa7000437, + 0xa8000438, 0xa9000439, 0xaa00043a, 0xab00043b, 0xac00043c, 0xad00043d, 0xae00043e, 0xaf00043f, + 0xe0000440, 0xe1000441, 0xe2000442, 0xe3000443, 0xe4000444, 0xe5000445, 0xe6000446, 0xe7000447, + 0xe8000448, 0xe9000449, 0xea00044a, 0xeb00044b, 0xec00044c, 0xed00044d, 0xee00044e, 0xef00044f, + 0xf1000451, 0xf3000454, 0xf5000457, 0xf700045e, 0xfc002116, 0xf9002219, 0xfb00221a, 0xc4002500, + 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, + 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xd5002552, 0xd6002553, 0xc9002554, 0xb8002555, + 0xb7002556, 0xbb002557, 0xd4002558, 0xd3002559, 0xc800255a, 0xbe00255b, 0xbd00255c, 0xbc00255d, + 0xc600255e, 0xc700255f, 0xcc002560, 0xb5002561, 0xb6002562, 0xb9002563, 0xd1002564, 0xd2002565, + 0xcb002566, 0xcf002567, 0xd0002568, 0xca002569, 0xd800256a, 0xd700256b, 0xce00256c, 0xdf002580, + 0xdc002584, 0xdb002588, 0xdd00258c, 0xde002590, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0, + }, +} + +// ISO8859_1 is the ISO 8859-1 encoding. +var ISO8859_1 encoding.Encoding = &iso8859_1 + +var iso8859_1 = charmap{ + name: "ISO 8859-1", + mib: identifier.ISOLatin1, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {2, [3]byte{0xc2, 0x80, 0x00}}, {2, [3]byte{0xc2, 0x81, 0x00}}, + {2, [3]byte{0xc2, 0x82, 0x00}}, {2, [3]byte{0xc2, 0x83, 0x00}}, + {2, [3]byte{0xc2, 0x84, 0x00}}, {2, [3]byte{0xc2, 0x85, 0x00}}, + {2, [3]byte{0xc2, 0x86, 0x00}}, {2, [3]byte{0xc2, 0x87, 0x00}}, + {2, [3]byte{0xc2, 0x88, 0x00}}, {2, [3]byte{0xc2, 0x89, 0x00}}, + {2, [3]byte{0xc2, 0x8a, 0x00}}, {2, [3]byte{0xc2, 0x8b, 0x00}}, + {2, [3]byte{0xc2, 0x8c, 0x00}}, {2, [3]byte{0xc2, 0x8d, 0x00}}, + {2, [3]byte{0xc2, 0x8e, 0x00}}, {2, [3]byte{0xc2, 0x8f, 0x00}}, + {2, [3]byte{0xc2, 0x90, 0x00}}, {2, [3]byte{0xc2, 0x91, 0x00}}, + {2, [3]byte{0xc2, 0x92, 0x00}}, {2, [3]byte{0xc2, 0x93, 0x00}}, + {2, [3]byte{0xc2, 0x94, 0x00}}, {2, [3]byte{0xc2, 0x95, 0x00}}, + {2, [3]byte{0xc2, 0x96, 0x00}}, {2, [3]byte{0xc2, 0x97, 0x00}}, + {2, [3]byte{0xc2, 0x98, 0x00}}, {2, [3]byte{0xc2, 0x99, 0x00}}, + {2, [3]byte{0xc2, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0x9b, 0x00}}, + {2, [3]byte{0xc2, 0x9c, 0x00}}, {2, [3]byte{0xc2, 0x9d, 0x00}}, + {2, [3]byte{0xc2, 0x9e, 0x00}}, {2, [3]byte{0xc2, 0x9f, 0x00}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, + {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, + {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, + {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, + {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, + {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, + {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, + {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, + {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, + {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, + {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, + {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, + {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, + {2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, + {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, + {2, [3]byte{0xc3, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, + {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, + {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, + {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, + {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, + {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, + {2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, + {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, + {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, + {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, + {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, + {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, + {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, + {2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, + {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, + {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, + {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, + {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, + {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, + {2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0x80000080, 0x81000081, 0x82000082, 0x83000083, 0x84000084, 0x85000085, 0x86000086, 0x87000087, + 0x88000088, 0x89000089, 0x8a00008a, 0x8b00008b, 0x8c00008c, 0x8d00008d, 0x8e00008e, 0x8f00008f, + 0x90000090, 0x91000091, 0x92000092, 0x93000093, 0x94000094, 0x95000095, 0x96000096, 0x97000097, + 0x98000098, 0x99000099, 0x9a00009a, 0x9b00009b, 0x9c00009c, 0x9d00009d, 0x9e00009e, 0x9f00009f, + 0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7, + 0xa80000a8, 0xa90000a9, 0xaa0000aa, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, + 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, + 0xb80000b8, 0xb90000b9, 0xba0000ba, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xbf0000bf, + 0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7, + 0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, + 0xd00000d0, 0xd10000d1, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd70000d7, + 0xd80000d8, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdd0000dd, 0xde0000de, 0xdf0000df, + 0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe30000e3, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7, + 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef, + 0xf00000f0, 0xf10000f1, 0xf20000f2, 0xf30000f3, 0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf70000f7, + 0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xfd0000fd, 0xfe0000fe, 0xff0000ff, + }, +} + +// ISO8859_2 is the ISO 8859-2 encoding. +var ISO8859_2 encoding.Encoding = &iso8859_2 + +var iso8859_2 = charmap{ + name: "ISO 8859-2", + mib: identifier.ISOLatin2, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0x84, 0x00}}, + {2, [3]byte{0xcb, 0x98, 0x00}}, {2, [3]byte{0xc5, 0x81, 0x00}}, + {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0xbd, 0x00}}, + {2, [3]byte{0xc5, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc5, 0xa0, 0x00}}, + {2, [3]byte{0xc5, 0x9e, 0x00}}, {2, [3]byte{0xc5, 0xa4, 0x00}}, + {2, [3]byte{0xc5, 0xb9, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc5, 0xbb, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc4, 0x85, 0x00}}, + {2, [3]byte{0xcb, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0x82, 0x00}}, + {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc4, 0xbe, 0x00}}, + {2, [3]byte{0xc5, 0x9b, 0x00}}, {2, [3]byte{0xcb, 0x87, 0x00}}, + {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc5, 0xa1, 0x00}}, + {2, [3]byte{0xc5, 0x9f, 0x00}}, {2, [3]byte{0xc5, 0xa5, 0x00}}, + {2, [3]byte{0xc5, 0xba, 0x00}}, {2, [3]byte{0xcb, 0x9d, 0x00}}, + {2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0xbc, 0x00}}, + {2, [3]byte{0xc5, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, + {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc4, 0x82, 0x00}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc4, 0xb9, 0x00}}, + {2, [3]byte{0xc4, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, + {2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, + {2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, + {2, [3]byte{0xc4, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, + {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc4, 0x8e, 0x00}}, + {2, [3]byte{0xc4, 0x90, 0x00}}, {2, [3]byte{0xc5, 0x83, 0x00}}, + {2, [3]byte{0xc5, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, + {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc5, 0x90, 0x00}}, + {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, + {2, [3]byte{0xc5, 0x98, 0x00}}, {2, [3]byte{0xc5, 0xae, 0x00}}, + {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0xb0, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, + {2, [3]byte{0xc5, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xc5, 0x95, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, + {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0x83, 0x00}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0xba, 0x00}}, + {2, [3]byte{0xc4, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, + {2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, + {2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, + {2, [3]byte{0xc4, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, + {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc4, 0x8f, 0x00}}, + {2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc5, 0x84, 0x00}}, + {2, [3]byte{0xc5, 0x88, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, + {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc5, 0x91, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, + {2, [3]byte{0xc5, 0x99, 0x00}}, {2, [3]byte{0xc5, 0xaf, 0x00}}, + {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc5, 0xb1, 0x00}}, + {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, + {2, [3]byte{0xc5, 0xa3, 0x00}}, {2, [3]byte{0xcb, 0x99, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa40000a4, 0xa70000a7, 0xa80000a8, 0xad0000ad, 0xb00000b0, 0xb40000b4, 0xb80000b8, + 0xc10000c1, 0xc20000c2, 0xc40000c4, 0xc70000c7, 0xc90000c9, 0xcb0000cb, 0xcd0000cd, 0xce0000ce, + 0xd30000d3, 0xd40000d4, 0xd60000d6, 0xd70000d7, 0xda0000da, 0xdc0000dc, 0xdd0000dd, 0xdf0000df, + 0xe10000e1, 0xe20000e2, 0xe40000e4, 0xe70000e7, 0xe90000e9, 0xeb0000eb, 0xed0000ed, 0xee0000ee, + 0xf30000f3, 0xf40000f4, 0xf60000f6, 0xf70000f7, 0xfa0000fa, 0xfc0000fc, 0xfd0000fd, 0xc3000102, + 0xe3000103, 0xa1000104, 0xb1000105, 0xc6000106, 0xe6000107, 0xc800010c, 0xe800010d, 0xcf00010e, + 0xef00010f, 0xd0000110, 0xf0000111, 0xca000118, 0xea000119, 0xcc00011a, 0xec00011b, 0xc5000139, + 0xe500013a, 0xa500013d, 0xb500013e, 0xa3000141, 0xb3000142, 0xd1000143, 0xf1000144, 0xd2000147, + 0xf2000148, 0xd5000150, 0xf5000151, 0xc0000154, 0xe0000155, 0xd8000158, 0xf8000159, 0xa600015a, + 0xb600015b, 0xaa00015e, 0xba00015f, 0xa9000160, 0xb9000161, 0xde000162, 0xfe000163, 0xab000164, + 0xbb000165, 0xd900016e, 0xf900016f, 0xdb000170, 0xfb000171, 0xac000179, 0xbc00017a, 0xaf00017b, + 0xbf00017c, 0xae00017d, 0xbe00017e, 0xb70002c7, 0xa20002d8, 0xff0002d9, 0xb20002db, 0xbd0002dd, + 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, + 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, + 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, + 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, + }, +} + +// ISO8859_3 is the ISO 8859-3 encoding. +var ISO8859_3 encoding.Encoding = &iso8859_3 + +var iso8859_3 = charmap{ + name: "ISO 8859-3", + mib: identifier.ISOLatin3, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0xa6, 0x00}}, + {2, [3]byte{0xcb, 0x98, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, + {2, [3]byte{0xc2, 0xa4, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc4, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc4, 0xb0, 0x00}}, + {2, [3]byte{0xc5, 0x9e, 0x00}}, {2, [3]byte{0xc4, 0x9e, 0x00}}, + {2, [3]byte{0xc4, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc5, 0xbb, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc4, 0xa7, 0x00}}, + {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, + {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, + {2, [3]byte{0xc4, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, + {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc4, 0xb1, 0x00}}, + {2, [3]byte{0xc5, 0x9f, 0x00}}, {2, [3]byte{0xc4, 0x9f, 0x00}}, + {2, [3]byte{0xc4, 0xb5, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc5, 0xbc, 0x00}}, + {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, + {2, [3]byte{0xc3, 0x82, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc4, 0x8a, 0x00}}, + {2, [3]byte{0xc4, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, + {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, + {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, + {2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, + {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc3, 0x91, 0x00}}, + {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, + {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc4, 0xa0, 0x00}}, + {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, + {2, [3]byte{0xc4, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, + {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc5, 0xac, 0x00}}, + {2, [3]byte{0xc5, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, + {2, [3]byte{0xc3, 0xa2, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0x8b, 0x00}}, + {2, [3]byte{0xc4, 0x89, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, + {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, + {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, + {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, + {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, + {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, + {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc4, 0xa1, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, + {2, [3]byte{0xc4, 0x9d, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, + {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, + {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc5, 0xad, 0x00}}, + {2, [3]byte{0xc5, 0x9d, 0x00}}, {2, [3]byte{0xcb, 0x99, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa30000a3, 0xa40000a4, 0xa70000a7, 0xa80000a8, 0xad0000ad, 0xb00000b0, 0xb20000b2, + 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb70000b7, 0xb80000b8, 0xbd0000bd, 0xc00000c0, 0xc10000c1, + 0xc20000c2, 0xc40000c4, 0xc70000c7, 0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, + 0xcd0000cd, 0xce0000ce, 0xcf0000cf, 0xd10000d1, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd60000d6, + 0xd70000d7, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdf0000df, 0xe00000e0, 0xe10000e1, + 0xe20000e2, 0xe40000e4, 0xe70000e7, 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xec0000ec, + 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf10000f1, 0xf20000f2, 0xf30000f3, 0xf40000f4, 0xf60000f6, + 0xf70000f7, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xc6000108, 0xe6000109, 0xc500010a, + 0xe500010b, 0xd800011c, 0xf800011d, 0xab00011e, 0xbb00011f, 0xd5000120, 0xf5000121, 0xa6000124, + 0xb6000125, 0xa1000126, 0xb1000127, 0xa9000130, 0xb9000131, 0xac000134, 0xbc000135, 0xde00015c, + 0xfe00015d, 0xaa00015e, 0xba00015f, 0xdd00016c, 0xfd00016d, 0xaf00017b, 0xbf00017c, 0xa20002d8, + 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, + 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, + 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, + 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, + 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, + }, +} + +// ISO8859_4 is the ISO 8859-4 encoding. +var ISO8859_4 encoding.Encoding = &iso8859_4 + +var iso8859_4 = charmap{ + name: "ISO 8859-4", + mib: identifier.ISOLatin4, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0x84, 0x00}}, + {2, [3]byte{0xc4, 0xb8, 0x00}}, {2, [3]byte{0xc5, 0x96, 0x00}}, + {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0xa8, 0x00}}, + {2, [3]byte{0xc4, 0xbb, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc5, 0xa0, 0x00}}, + {2, [3]byte{0xc4, 0x92, 0x00}}, {2, [3]byte{0xc4, 0xa2, 0x00}}, + {2, [3]byte{0xc5, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc4, 0x85, 0x00}}, + {2, [3]byte{0xcb, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0x97, 0x00}}, + {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc4, 0xa9, 0x00}}, + {2, [3]byte{0xc4, 0xbc, 0x00}}, {2, [3]byte{0xcb, 0x87, 0x00}}, + {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc5, 0xa1, 0x00}}, + {2, [3]byte{0xc4, 0x93, 0x00}}, {2, [3]byte{0xc4, 0xa3, 0x00}}, + {2, [3]byte{0xc5, 0xa7, 0x00}}, {2, [3]byte{0xc5, 0x8a, 0x00}}, + {2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0x8b, 0x00}}, + {2, [3]byte{0xc4, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, + {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, + {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc4, 0xae, 0x00}}, + {2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, + {2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, + {2, [3]byte{0xc4, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, + {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc4, 0xaa, 0x00}}, + {2, [3]byte{0xc4, 0x90, 0x00}}, {2, [3]byte{0xc5, 0x85, 0x00}}, + {2, [3]byte{0xc5, 0x8c, 0x00}}, {2, [3]byte{0xc4, 0xb6, 0x00}}, + {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, + {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, + {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc5, 0xb2, 0x00}}, + {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc5, 0xa8, 0x00}}, + {2, [3]byte{0xc5, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xc4, 0x81, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, + {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, + {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc4, 0xaf, 0x00}}, + {2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, + {2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, + {2, [3]byte{0xc4, 0x97, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, + {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc4, 0xab, 0x00}}, + {2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc5, 0x86, 0x00}}, + {2, [3]byte{0xc5, 0x8d, 0x00}}, {2, [3]byte{0xc4, 0xb7, 0x00}}, + {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, + {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc5, 0xb3, 0x00}}, + {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, + {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc5, 0xa9, 0x00}}, + {2, [3]byte{0xc5, 0xab, 0x00}}, {2, [3]byte{0xcb, 0x99, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa40000a4, 0xa70000a7, 0xa80000a8, 0xad0000ad, 0xaf0000af, 0xb00000b0, 0xb40000b4, + 0xb80000b8, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc90000c9, + 0xcb0000cb, 0xcd0000cd, 0xce0000ce, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd70000d7, 0xd80000d8, + 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdf0000df, 0xe10000e1, 0xe20000e2, 0xe30000e3, 0xe40000e4, + 0xe50000e5, 0xe60000e6, 0xe90000e9, 0xeb0000eb, 0xed0000ed, 0xee0000ee, 0xf40000f4, 0xf50000f5, + 0xf60000f6, 0xf70000f7, 0xf80000f8, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xc0000100, 0xe0000101, + 0xa1000104, 0xb1000105, 0xc800010c, 0xe800010d, 0xd0000110, 0xf0000111, 0xaa000112, 0xba000113, + 0xcc000116, 0xec000117, 0xca000118, 0xea000119, 0xab000122, 0xbb000123, 0xa5000128, 0xb5000129, + 0xcf00012a, 0xef00012b, 0xc700012e, 0xe700012f, 0xd3000136, 0xf3000137, 0xa2000138, 0xa600013b, + 0xb600013c, 0xd1000145, 0xf1000146, 0xbd00014a, 0xbf00014b, 0xd200014c, 0xf200014d, 0xa3000156, + 0xb3000157, 0xa9000160, 0xb9000161, 0xac000166, 0xbc000167, 0xdd000168, 0xfd000169, 0xde00016a, + 0xfe00016b, 0xd9000172, 0xf9000173, 0xae00017d, 0xbe00017e, 0xb70002c7, 0xff0002d9, 0xb20002db, + 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, + 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, + 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, + 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, + }, +} + +// ISO8859_5 is the ISO 8859-5 encoding. +var ISO8859_5 encoding.Encoding = &iso8859_5 + +var iso8859_5 = charmap{ + name: "ISO 8859-5", + mib: identifier.ISOLatinCyrillic, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0x81, 0x00}}, + {2, [3]byte{0xd0, 0x82, 0x00}}, {2, [3]byte{0xd0, 0x83, 0x00}}, + {2, [3]byte{0xd0, 0x84, 0x00}}, {2, [3]byte{0xd0, 0x85, 0x00}}, + {2, [3]byte{0xd0, 0x86, 0x00}}, {2, [3]byte{0xd0, 0x87, 0x00}}, + {2, [3]byte{0xd0, 0x88, 0x00}}, {2, [3]byte{0xd0, 0x89, 0x00}}, + {2, [3]byte{0xd0, 0x8a, 0x00}}, {2, [3]byte{0xd0, 0x8b, 0x00}}, + {2, [3]byte{0xd0, 0x8c, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xd0, 0x8e, 0x00}}, {2, [3]byte{0xd0, 0x8f, 0x00}}, + {2, [3]byte{0xd0, 0x90, 0x00}}, {2, [3]byte{0xd0, 0x91, 0x00}}, + {2, [3]byte{0xd0, 0x92, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}}, + {2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}}, + {2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x97, 0x00}}, + {2, [3]byte{0xd0, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x99, 0x00}}, + {2, [3]byte{0xd0, 0x9a, 0x00}}, {2, [3]byte{0xd0, 0x9b, 0x00}}, + {2, [3]byte{0xd0, 0x9c, 0x00}}, {2, [3]byte{0xd0, 0x9d, 0x00}}, + {2, [3]byte{0xd0, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x9f, 0x00}}, + {2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}}, + {2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}}, + {2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0xa5, 0x00}}, + {2, [3]byte{0xd0, 0xa6, 0x00}}, {2, [3]byte{0xd0, 0xa7, 0x00}}, + {2, [3]byte{0xd0, 0xa8, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}}, + {2, [3]byte{0xd0, 0xaa, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}}, + {2, [3]byte{0xd0, 0xac, 0x00}}, {2, [3]byte{0xd0, 0xad, 0x00}}, + {2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd0, 0xaf, 0x00}}, + {2, [3]byte{0xd0, 0xb0, 0x00}}, {2, [3]byte{0xd0, 0xb1, 0x00}}, + {2, [3]byte{0xd0, 0xb2, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}}, + {2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}}, + {2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0xb7, 0x00}}, + {2, [3]byte{0xd0, 0xb8, 0x00}}, {2, [3]byte{0xd0, 0xb9, 0x00}}, + {2, [3]byte{0xd0, 0xba, 0x00}}, {2, [3]byte{0xd0, 0xbb, 0x00}}, + {2, [3]byte{0xd0, 0xbc, 0x00}}, {2, [3]byte{0xd0, 0xbd, 0x00}}, + {2, [3]byte{0xd0, 0xbe, 0x00}}, {2, [3]byte{0xd0, 0xbf, 0x00}}, + {2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}}, + {2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}}, + {2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x85, 0x00}}, + {2, [3]byte{0xd1, 0x86, 0x00}}, {2, [3]byte{0xd1, 0x87, 0x00}}, + {2, [3]byte{0xd1, 0x88, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}}, + {2, [3]byte{0xd1, 0x8a, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}}, + {2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x8d, 0x00}}, + {2, [3]byte{0xd1, 0x8e, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}}, + {3, [3]byte{0xe2, 0x84, 0x96}}, {2, [3]byte{0xd1, 0x91, 0x00}}, + {2, [3]byte{0xd1, 0x92, 0x00}}, {2, [3]byte{0xd1, 0x93, 0x00}}, + {2, [3]byte{0xd1, 0x94, 0x00}}, {2, [3]byte{0xd1, 0x95, 0x00}}, + {2, [3]byte{0xd1, 0x96, 0x00}}, {2, [3]byte{0xd1, 0x97, 0x00}}, + {2, [3]byte{0xd1, 0x98, 0x00}}, {2, [3]byte{0xd1, 0x99, 0x00}}, + {2, [3]byte{0xd1, 0x9a, 0x00}}, {2, [3]byte{0xd1, 0x9b, 0x00}}, + {2, [3]byte{0xd1, 0x9c, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xd1, 0x9e, 0x00}}, {2, [3]byte{0xd1, 0x9f, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xfd0000a7, 0xad0000ad, 0xa1000401, 0xa2000402, 0xa3000403, 0xa4000404, 0xa5000405, + 0xa6000406, 0xa7000407, 0xa8000408, 0xa9000409, 0xaa00040a, 0xab00040b, 0xac00040c, 0xae00040e, + 0xaf00040f, 0xb0000410, 0xb1000411, 0xb2000412, 0xb3000413, 0xb4000414, 0xb5000415, 0xb6000416, + 0xb7000417, 0xb8000418, 0xb9000419, 0xba00041a, 0xbb00041b, 0xbc00041c, 0xbd00041d, 0xbe00041e, + 0xbf00041f, 0xc0000420, 0xc1000421, 0xc2000422, 0xc3000423, 0xc4000424, 0xc5000425, 0xc6000426, + 0xc7000427, 0xc8000428, 0xc9000429, 0xca00042a, 0xcb00042b, 0xcc00042c, 0xcd00042d, 0xce00042e, + 0xcf00042f, 0xd0000430, 0xd1000431, 0xd2000432, 0xd3000433, 0xd4000434, 0xd5000435, 0xd6000436, + 0xd7000437, 0xd8000438, 0xd9000439, 0xda00043a, 0xdb00043b, 0xdc00043c, 0xdd00043d, 0xde00043e, + 0xdf00043f, 0xe0000440, 0xe1000441, 0xe2000442, 0xe3000443, 0xe4000444, 0xe5000445, 0xe6000446, + 0xe7000447, 0xe8000448, 0xe9000449, 0xea00044a, 0xeb00044b, 0xec00044c, 0xed00044d, 0xee00044e, + 0xef00044f, 0xf1000451, 0xf2000452, 0xf3000453, 0xf4000454, 0xf5000455, 0xf6000456, 0xf7000457, + 0xf8000458, 0xf9000459, 0xfa00045a, 0xfb00045b, 0xfc00045c, 0xfe00045e, 0xff00045f, 0xf0002116, + 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, + 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, + 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, + 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, + }, +} + +// ISO8859_6 is the ISO 8859-6 encoding. +var ISO8859_6 encoding.Encoding = &iso8859_6 + +var iso8859_6 = charmap{ + name: "ISO 8859-6", + mib: identifier.ISOLatinArabic, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa4, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xd8, 0x8c, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xd8, 0x9b, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xd8, 0x9f, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xd8, 0xa1, 0x00}}, + {2, [3]byte{0xd8, 0xa2, 0x00}}, {2, [3]byte{0xd8, 0xa3, 0x00}}, + {2, [3]byte{0xd8, 0xa4, 0x00}}, {2, [3]byte{0xd8, 0xa5, 0x00}}, + {2, [3]byte{0xd8, 0xa6, 0x00}}, {2, [3]byte{0xd8, 0xa7, 0x00}}, + {2, [3]byte{0xd8, 0xa8, 0x00}}, {2, [3]byte{0xd8, 0xa9, 0x00}}, + {2, [3]byte{0xd8, 0xaa, 0x00}}, {2, [3]byte{0xd8, 0xab, 0x00}}, + {2, [3]byte{0xd8, 0xac, 0x00}}, {2, [3]byte{0xd8, 0xad, 0x00}}, + {2, [3]byte{0xd8, 0xae, 0x00}}, {2, [3]byte{0xd8, 0xaf, 0x00}}, + {2, [3]byte{0xd8, 0xb0, 0x00}}, {2, [3]byte{0xd8, 0xb1, 0x00}}, + {2, [3]byte{0xd8, 0xb2, 0x00}}, {2, [3]byte{0xd8, 0xb3, 0x00}}, + {2, [3]byte{0xd8, 0xb4, 0x00}}, {2, [3]byte{0xd8, 0xb5, 0x00}}, + {2, [3]byte{0xd8, 0xb6, 0x00}}, {2, [3]byte{0xd8, 0xb7, 0x00}}, + {2, [3]byte{0xd8, 0xb8, 0x00}}, {2, [3]byte{0xd8, 0xb9, 0x00}}, + {2, [3]byte{0xd8, 0xba, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xd9, 0x80, 0x00}}, {2, [3]byte{0xd9, 0x81, 0x00}}, + {2, [3]byte{0xd9, 0x82, 0x00}}, {2, [3]byte{0xd9, 0x83, 0x00}}, + {2, [3]byte{0xd9, 0x84, 0x00}}, {2, [3]byte{0xd9, 0x85, 0x00}}, + {2, [3]byte{0xd9, 0x86, 0x00}}, {2, [3]byte{0xd9, 0x87, 0x00}}, + {2, [3]byte{0xd9, 0x88, 0x00}}, {2, [3]byte{0xd9, 0x89, 0x00}}, + {2, [3]byte{0xd9, 0x8a, 0x00}}, {2, [3]byte{0xd9, 0x8b, 0x00}}, + {2, [3]byte{0xd9, 0x8c, 0x00}}, {2, [3]byte{0xd9, 0x8d, 0x00}}, + {2, [3]byte{0xd9, 0x8e, 0x00}}, {2, [3]byte{0xd9, 0x8f, 0x00}}, + {2, [3]byte{0xd9, 0x90, 0x00}}, {2, [3]byte{0xd9, 0x91, 0x00}}, + {2, [3]byte{0xd9, 0x92, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa40000a4, 0xad0000ad, 0xac00060c, 0xbb00061b, 0xbf00061f, 0xc1000621, 0xc2000622, + 0xc3000623, 0xc4000624, 0xc5000625, 0xc6000626, 0xc7000627, 0xc8000628, 0xc9000629, 0xca00062a, + 0xcb00062b, 0xcc00062c, 0xcd00062d, 0xce00062e, 0xcf00062f, 0xd0000630, 0xd1000631, 0xd2000632, + 0xd3000633, 0xd4000634, 0xd5000635, 0xd6000636, 0xd7000637, 0xd8000638, 0xd9000639, 0xda00063a, + 0xe0000640, 0xe1000641, 0xe2000642, 0xe3000643, 0xe4000644, 0xe5000645, 0xe6000646, 0xe7000647, + 0xe8000648, 0xe9000649, 0xea00064a, 0xeb00064b, 0xec00064c, 0xed00064d, 0xee00064e, 0xef00064f, + 0xf0000650, 0xf1000651, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, + 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, + 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, + 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, + 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, + 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, + 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, + 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, + 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, + 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, + }, +} + +// ISO8859_7 is the ISO 8859-7 encoding. +var ISO8859_7 encoding.Encoding = &iso8859_7 + +var iso8859_7 = charmap{ + name: "ISO 8859-7", + mib: identifier.ISOLatinGreek, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x98}}, + {3, [3]byte{0xe2, 0x80, 0x99}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, + {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xe2, 0x82, 0xaf}}, + {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {2, [3]byte{0xcd, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x95}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, + {2, [3]byte{0xce, 0x84, 0x00}}, {2, [3]byte{0xce, 0x85, 0x00}}, + {2, [3]byte{0xce, 0x86, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, + {2, [3]byte{0xce, 0x88, 0x00}}, {2, [3]byte{0xce, 0x89, 0x00}}, + {2, [3]byte{0xce, 0x8a, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {2, [3]byte{0xce, 0x8c, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, + {2, [3]byte{0xce, 0x8e, 0x00}}, {2, [3]byte{0xce, 0x8f, 0x00}}, + {2, [3]byte{0xce, 0x90, 0x00}}, {2, [3]byte{0xce, 0x91, 0x00}}, + {2, [3]byte{0xce, 0x92, 0x00}}, {2, [3]byte{0xce, 0x93, 0x00}}, + {2, [3]byte{0xce, 0x94, 0x00}}, {2, [3]byte{0xce, 0x95, 0x00}}, + {2, [3]byte{0xce, 0x96, 0x00}}, {2, [3]byte{0xce, 0x97, 0x00}}, + {2, [3]byte{0xce, 0x98, 0x00}}, {2, [3]byte{0xce, 0x99, 0x00}}, + {2, [3]byte{0xce, 0x9a, 0x00}}, {2, [3]byte{0xce, 0x9b, 0x00}}, + {2, [3]byte{0xce, 0x9c, 0x00}}, {2, [3]byte{0xce, 0x9d, 0x00}}, + {2, [3]byte{0xce, 0x9e, 0x00}}, {2, [3]byte{0xce, 0x9f, 0x00}}, + {2, [3]byte{0xce, 0xa0, 0x00}}, {2, [3]byte{0xce, 0xa1, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xce, 0xa3, 0x00}}, + {2, [3]byte{0xce, 0xa4, 0x00}}, {2, [3]byte{0xce, 0xa5, 0x00}}, + {2, [3]byte{0xce, 0xa6, 0x00}}, {2, [3]byte{0xce, 0xa7, 0x00}}, + {2, [3]byte{0xce, 0xa8, 0x00}}, {2, [3]byte{0xce, 0xa9, 0x00}}, + {2, [3]byte{0xce, 0xaa, 0x00}}, {2, [3]byte{0xce, 0xab, 0x00}}, + {2, [3]byte{0xce, 0xac, 0x00}}, {2, [3]byte{0xce, 0xad, 0x00}}, + {2, [3]byte{0xce, 0xae, 0x00}}, {2, [3]byte{0xce, 0xaf, 0x00}}, + {2, [3]byte{0xce, 0xb0, 0x00}}, {2, [3]byte{0xce, 0xb1, 0x00}}, + {2, [3]byte{0xce, 0xb2, 0x00}}, {2, [3]byte{0xce, 0xb3, 0x00}}, + {2, [3]byte{0xce, 0xb4, 0x00}}, {2, [3]byte{0xce, 0xb5, 0x00}}, + {2, [3]byte{0xce, 0xb6, 0x00}}, {2, [3]byte{0xce, 0xb7, 0x00}}, + {2, [3]byte{0xce, 0xb8, 0x00}}, {2, [3]byte{0xce, 0xb9, 0x00}}, + {2, [3]byte{0xce, 0xba, 0x00}}, {2, [3]byte{0xce, 0xbb, 0x00}}, + {2, [3]byte{0xce, 0xbc, 0x00}}, {2, [3]byte{0xce, 0xbd, 0x00}}, + {2, [3]byte{0xce, 0xbe, 0x00}}, {2, [3]byte{0xce, 0xbf, 0x00}}, + {2, [3]byte{0xcf, 0x80, 0x00}}, {2, [3]byte{0xcf, 0x81, 0x00}}, + {2, [3]byte{0xcf, 0x82, 0x00}}, {2, [3]byte{0xcf, 0x83, 0x00}}, + {2, [3]byte{0xcf, 0x84, 0x00}}, {2, [3]byte{0xcf, 0x85, 0x00}}, + {2, [3]byte{0xcf, 0x86, 0x00}}, {2, [3]byte{0xcf, 0x87, 0x00}}, + {2, [3]byte{0xcf, 0x88, 0x00}}, {2, [3]byte{0xcf, 0x89, 0x00}}, + {2, [3]byte{0xcf, 0x8a, 0x00}}, {2, [3]byte{0xcf, 0x8b, 0x00}}, + {2, [3]byte{0xcf, 0x8c, 0x00}}, {2, [3]byte{0xcf, 0x8d, 0x00}}, + {2, [3]byte{0xcf, 0x8e, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa30000a3, 0xa60000a6, 0xa70000a7, 0xa80000a8, 0xa90000a9, 0xab0000ab, 0xac0000ac, + 0xad0000ad, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb70000b7, 0xbb0000bb, 0xbd0000bd, + 0xaa00037a, 0xb4000384, 0xb5000385, 0xb6000386, 0xb8000388, 0xb9000389, 0xba00038a, 0xbc00038c, + 0xbe00038e, 0xbf00038f, 0xc0000390, 0xc1000391, 0xc2000392, 0xc3000393, 0xc4000394, 0xc5000395, + 0xc6000396, 0xc7000397, 0xc8000398, 0xc9000399, 0xca00039a, 0xcb00039b, 0xcc00039c, 0xcd00039d, + 0xce00039e, 0xcf00039f, 0xd00003a0, 0xd10003a1, 0xd30003a3, 0xd40003a4, 0xd50003a5, 0xd60003a6, + 0xd70003a7, 0xd80003a8, 0xd90003a9, 0xda0003aa, 0xdb0003ab, 0xdc0003ac, 0xdd0003ad, 0xde0003ae, + 0xdf0003af, 0xe00003b0, 0xe10003b1, 0xe20003b2, 0xe30003b3, 0xe40003b4, 0xe50003b5, 0xe60003b6, + 0xe70003b7, 0xe80003b8, 0xe90003b9, 0xea0003ba, 0xeb0003bb, 0xec0003bc, 0xed0003bd, 0xee0003be, + 0xef0003bf, 0xf00003c0, 0xf10003c1, 0xf20003c2, 0xf30003c3, 0xf40003c4, 0xf50003c5, 0xf60003c6, + 0xf70003c7, 0xf80003c8, 0xf90003c9, 0xfa0003ca, 0xfb0003cb, 0xfc0003cc, 0xfd0003cd, 0xfe0003ce, + 0xaf002015, 0xa1002018, 0xa2002019, 0xa40020ac, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, + 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, + 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, + 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, + 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, + }, +} + +// ISO8859_8 is the ISO 8859-8 encoding. +var ISO8859_8 encoding.Encoding = &iso8859_8 + +var iso8859_8 = charmap{ + name: "ISO 8859-8", + mib: identifier.ISOLatinHebrew, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, + {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, + {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, + {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, + {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, + {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, + {2, [3]byte{0xc2, 0xbe, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x97}}, + {2, [3]byte{0xd7, 0x90, 0x00}}, {2, [3]byte{0xd7, 0x91, 0x00}}, + {2, [3]byte{0xd7, 0x92, 0x00}}, {2, [3]byte{0xd7, 0x93, 0x00}}, + {2, [3]byte{0xd7, 0x94, 0x00}}, {2, [3]byte{0xd7, 0x95, 0x00}}, + {2, [3]byte{0xd7, 0x96, 0x00}}, {2, [3]byte{0xd7, 0x97, 0x00}}, + {2, [3]byte{0xd7, 0x98, 0x00}}, {2, [3]byte{0xd7, 0x99, 0x00}}, + {2, [3]byte{0xd7, 0x9a, 0x00}}, {2, [3]byte{0xd7, 0x9b, 0x00}}, + {2, [3]byte{0xd7, 0x9c, 0x00}}, {2, [3]byte{0xd7, 0x9d, 0x00}}, + {2, [3]byte{0xd7, 0x9e, 0x00}}, {2, [3]byte{0xd7, 0x9f, 0x00}}, + {2, [3]byte{0xd7, 0xa0, 0x00}}, {2, [3]byte{0xd7, 0xa1, 0x00}}, + {2, [3]byte{0xd7, 0xa2, 0x00}}, {2, [3]byte{0xd7, 0xa3, 0x00}}, + {2, [3]byte{0xd7, 0xa4, 0x00}}, {2, [3]byte{0xd7, 0xa5, 0x00}}, + {2, [3]byte{0xd7, 0xa6, 0x00}}, {2, [3]byte{0xd7, 0xa7, 0x00}}, + {2, [3]byte{0xd7, 0xa8, 0x00}}, {2, [3]byte{0xd7, 0xa9, 0x00}}, + {2, [3]byte{0xd7, 0xaa, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x8e}}, + {3, [3]byte{0xe2, 0x80, 0x8f}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7, 0xa80000a8, + 0xa90000a9, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, 0xb00000b0, 0xb10000b1, + 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb80000b8, 0xb90000b9, + 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xaa0000d7, 0xba0000f7, 0xe00005d0, 0xe10005d1, + 0xe20005d2, 0xe30005d3, 0xe40005d4, 0xe50005d5, 0xe60005d6, 0xe70005d7, 0xe80005d8, 0xe90005d9, + 0xea0005da, 0xeb0005db, 0xec0005dc, 0xed0005dd, 0xee0005de, 0xef0005df, 0xf00005e0, 0xf10005e1, + 0xf20005e2, 0xf30005e3, 0xf40005e4, 0xf50005e5, 0xf60005e6, 0xf70005e7, 0xf80005e8, 0xf90005e9, + 0xfa0005ea, 0xfd00200e, 0xfe00200f, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, + 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, + 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, + 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, + 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, + 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, + 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, + 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, + 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, + }, +} + +// ISO8859_10 is the ISO 8859-10 encoding. +var ISO8859_10 encoding.Encoding = &iso8859_10 + +var iso8859_10 = charmap{ + name: "ISO 8859-10", + mib: identifier.ISOLatin6, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0x84, 0x00}}, + {2, [3]byte{0xc4, 0x92, 0x00}}, {2, [3]byte{0xc4, 0xa2, 0x00}}, + {2, [3]byte{0xc4, 0xaa, 0x00}}, {2, [3]byte{0xc4, 0xa8, 0x00}}, + {2, [3]byte{0xc4, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc4, 0xbb, 0x00}}, {2, [3]byte{0xc4, 0x90, 0x00}}, + {2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc5, 0xa6, 0x00}}, + {2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xc5, 0xaa, 0x00}}, {2, [3]byte{0xc5, 0x8a, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc4, 0x85, 0x00}}, + {2, [3]byte{0xc4, 0x93, 0x00}}, {2, [3]byte{0xc4, 0xa3, 0x00}}, + {2, [3]byte{0xc4, 0xab, 0x00}}, {2, [3]byte{0xc4, 0xa9, 0x00}}, + {2, [3]byte{0xc4, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, + {2, [3]byte{0xc4, 0xbc, 0x00}}, {2, [3]byte{0xc4, 0x91, 0x00}}, + {2, [3]byte{0xc5, 0xa1, 0x00}}, {2, [3]byte{0xc5, 0xa7, 0x00}}, + {2, [3]byte{0xc5, 0xbe, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x95}}, + {2, [3]byte{0xc5, 0xab, 0x00}}, {2, [3]byte{0xc5, 0x8b, 0x00}}, + {2, [3]byte{0xc4, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, + {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, + {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc4, 0xae, 0x00}}, + {2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, + {2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, + {2, [3]byte{0xc4, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, + {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, + {2, [3]byte{0xc3, 0x90, 0x00}}, {2, [3]byte{0xc5, 0x85, 0x00}}, + {2, [3]byte{0xc5, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, + {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, + {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc5, 0xa8, 0x00}}, + {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc5, 0xb2, 0x00}}, + {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, + {2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xc4, 0x81, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, + {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, + {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc4, 0xaf, 0x00}}, + {2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, + {2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, + {2, [3]byte{0xc4, 0x97, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, + {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, + {2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc5, 0x86, 0x00}}, + {2, [3]byte{0xc5, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, + {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc5, 0xa9, 0x00}}, + {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc5, 0xb3, 0x00}}, + {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, + {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, + {2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc4, 0xb8, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa70000a7, 0xad0000ad, 0xb00000b0, 0xb70000b7, 0xc10000c1, 0xc20000c2, 0xc30000c3, + 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc90000c9, 0xcb0000cb, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, + 0xd00000d0, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd80000d8, 0xda0000da, 0xdb0000db, + 0xdc0000dc, 0xdd0000dd, 0xde0000de, 0xdf0000df, 0xe10000e1, 0xe20000e2, 0xe30000e3, 0xe40000e4, + 0xe50000e5, 0xe60000e6, 0xe90000e9, 0xeb0000eb, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf00000f0, + 0xf30000f3, 0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf80000f8, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, + 0xfd0000fd, 0xfe0000fe, 0xc0000100, 0xe0000101, 0xa1000104, 0xb1000105, 0xc800010c, 0xe800010d, + 0xa9000110, 0xb9000111, 0xa2000112, 0xb2000113, 0xcc000116, 0xec000117, 0xca000118, 0xea000119, + 0xa3000122, 0xb3000123, 0xa5000128, 0xb5000129, 0xa400012a, 0xb400012b, 0xc700012e, 0xe700012f, + 0xa6000136, 0xb6000137, 0xff000138, 0xa800013b, 0xb800013c, 0xd1000145, 0xf1000146, 0xaf00014a, + 0xbf00014b, 0xd200014c, 0xf200014d, 0xaa000160, 0xba000161, 0xab000166, 0xbb000167, 0xd7000168, + 0xf7000169, 0xae00016a, 0xbe00016b, 0xd9000172, 0xf9000173, 0xac00017d, 0xbc00017e, 0xbd002015, + 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, + 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, + 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, + 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, + }, +} + +// ISO8859_13 is the ISO 8859-13 encoding. +var ISO8859_13 encoding.Encoding = &iso8859_13 + +var iso8859_13 = charmap{ + name: "ISO 8859-13", + mib: identifier.ISO885913, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9d}}, + {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, + {2, [3]byte{0xc2, 0xa4, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9e}}, + {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {2, [3]byte{0xc5, 0x96, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, + {3, [3]byte{0xe2, 0x80, 0x9c}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, + {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, + {2, [3]byte{0xc5, 0x97, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, + {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, + {2, [3]byte{0xc4, 0x84, 0x00}}, {2, [3]byte{0xc4, 0xae, 0x00}}, + {2, [3]byte{0xc4, 0x80, 0x00}}, {2, [3]byte{0xc4, 0x86, 0x00}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, + {2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc4, 0x92, 0x00}}, + {2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, + {2, [3]byte{0xc5, 0xb9, 0x00}}, {2, [3]byte{0xc4, 0x96, 0x00}}, + {2, [3]byte{0xc4, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0xb6, 0x00}}, + {2, [3]byte{0xc4, 0xaa, 0x00}}, {2, [3]byte{0xc4, 0xbb, 0x00}}, + {2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc5, 0x83, 0x00}}, + {2, [3]byte{0xc5, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, + {2, [3]byte{0xc5, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, + {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, + {2, [3]byte{0xc5, 0xb2, 0x00}}, {2, [3]byte{0xc5, 0x81, 0x00}}, + {2, [3]byte{0xc5, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0xaa, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc5, 0xbb, 0x00}}, + {2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xc4, 0x85, 0x00}}, {2, [3]byte{0xc4, 0xaf, 0x00}}, + {2, [3]byte{0xc4, 0x81, 0x00}}, {2, [3]byte{0xc4, 0x87, 0x00}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, + {2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc4, 0x93, 0x00}}, + {2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, + {2, [3]byte{0xc5, 0xba, 0x00}}, {2, [3]byte{0xc4, 0x97, 0x00}}, + {2, [3]byte{0xc4, 0xa3, 0x00}}, {2, [3]byte{0xc4, 0xb7, 0x00}}, + {2, [3]byte{0xc4, 0xab, 0x00}}, {2, [3]byte{0xc4, 0xbc, 0x00}}, + {2, [3]byte{0xc5, 0xa1, 0x00}}, {2, [3]byte{0xc5, 0x84, 0x00}}, + {2, [3]byte{0xc5, 0x86, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, + {2, [3]byte{0xc5, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, + {2, [3]byte{0xc5, 0xb3, 0x00}}, {2, [3]byte{0xc5, 0x82, 0x00}}, + {2, [3]byte{0xc5, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0xab, 0x00}}, + {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc5, 0xbc, 0x00}}, + {2, [3]byte{0xc5, 0xbe, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x99}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa60000a6, 0xa70000a7, 0xa90000a9, 0xab0000ab, + 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb50000b5, + 0xb60000b6, 0xb70000b7, 0xb90000b9, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xc40000c4, + 0xc50000c5, 0xaf0000c6, 0xc90000c9, 0xd30000d3, 0xd50000d5, 0xd60000d6, 0xd70000d7, 0xa80000d8, + 0xdc0000dc, 0xdf0000df, 0xe40000e4, 0xe50000e5, 0xbf0000e6, 0xe90000e9, 0xf30000f3, 0xf50000f5, + 0xf60000f6, 0xf70000f7, 0xb80000f8, 0xfc0000fc, 0xc2000100, 0xe2000101, 0xc0000104, 0xe0000105, + 0xc3000106, 0xe3000107, 0xc800010c, 0xe800010d, 0xc7000112, 0xe7000113, 0xcb000116, 0xeb000117, + 0xc6000118, 0xe6000119, 0xcc000122, 0xec000123, 0xce00012a, 0xee00012b, 0xc100012e, 0xe100012f, + 0xcd000136, 0xed000137, 0xcf00013b, 0xef00013c, 0xd9000141, 0xf9000142, 0xd1000143, 0xf1000144, + 0xd2000145, 0xf2000146, 0xd400014c, 0xf400014d, 0xaa000156, 0xba000157, 0xda00015a, 0xfa00015b, + 0xd0000160, 0xf0000161, 0xdb00016a, 0xfb00016b, 0xd8000172, 0xf8000173, 0xca000179, 0xea00017a, + 0xdd00017b, 0xfd00017c, 0xde00017d, 0xfe00017e, 0xff002019, 0xb400201c, 0xa100201d, 0xa500201e, + 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, + 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, + 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, + 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, + }, +} + +// ISO8859_14 is the ISO 8859-14 encoding. +var ISO8859_14 encoding.Encoding = &iso8859_14 + +var iso8859_14 = charmap{ + name: "ISO 8859-14", + mib: identifier.ISO885914, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xe1, 0xb8, 0x82}}, + {3, [3]byte{0xe1, 0xb8, 0x83}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, + {2, [3]byte{0xc4, 0x8a, 0x00}}, {2, [3]byte{0xc4, 0x8b, 0x00}}, + {3, [3]byte{0xe1, 0xb8, 0x8a}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {3, [3]byte{0xe1, 0xba, 0x80}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {3, [3]byte{0xe1, 0xba, 0x82}}, {3, [3]byte{0xe1, 0xb8, 0x8b}}, + {3, [3]byte{0xe1, 0xbb, 0xb2}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc5, 0xb8, 0x00}}, + {3, [3]byte{0xe1, 0xb8, 0x9e}}, {3, [3]byte{0xe1, 0xb8, 0x9f}}, + {2, [3]byte{0xc4, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0xa1, 0x00}}, + {3, [3]byte{0xe1, 0xb9, 0x80}}, {3, [3]byte{0xe1, 0xb9, 0x81}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {3, [3]byte{0xe1, 0xb9, 0x96}}, + {3, [3]byte{0xe1, 0xba, 0x81}}, {3, [3]byte{0xe1, 0xb9, 0x97}}, + {3, [3]byte{0xe1, 0xba, 0x83}}, {3, [3]byte{0xe1, 0xb9, 0xa0}}, + {3, [3]byte{0xe1, 0xbb, 0xb3}}, {3, [3]byte{0xe1, 0xba, 0x84}}, + {3, [3]byte{0xe1, 0xba, 0x85}}, {3, [3]byte{0xe1, 0xb9, 0xa1}}, + {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, + {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, + {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, + {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, + {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, + {2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, + {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, + {2, [3]byte{0xc5, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, + {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, + {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, + {2, [3]byte{0xc3, 0x96, 0x00}}, {3, [3]byte{0xe1, 0xb9, 0xaa}}, + {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, + {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, + {2, [3]byte{0xc5, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, + {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, + {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, + {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, + {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, + {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, + {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, + {2, [3]byte{0xc5, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, + {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, + {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {3, [3]byte{0xe1, 0xb9, 0xab}}, + {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, + {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, + {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, + {2, [3]byte{0xc5, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa30000a3, 0xa70000a7, 0xa90000a9, 0xad0000ad, 0xae0000ae, 0xb60000b6, 0xc00000c0, + 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7, 0xc80000c8, + 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, 0xd10000d1, + 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd80000d8, 0xd90000d9, 0xda0000da, + 0xdb0000db, 0xdc0000dc, 0xdd0000dd, 0xdf0000df, 0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe30000e3, + 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7, 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, + 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf10000f1, 0xf20000f2, 0xf30000f3, 0xf40000f4, + 0xf50000f5, 0xf60000f6, 0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xfd0000fd, + 0xff0000ff, 0xa400010a, 0xa500010b, 0xb2000120, 0xb3000121, 0xd0000174, 0xf0000175, 0xde000176, + 0xfe000177, 0xaf000178, 0xa1001e02, 0xa2001e03, 0xa6001e0a, 0xab001e0b, 0xb0001e1e, 0xb1001e1f, + 0xb4001e40, 0xb5001e41, 0xb7001e56, 0xb9001e57, 0xbb001e60, 0xbf001e61, 0xd7001e6a, 0xf7001e6b, + 0xa8001e80, 0xb8001e81, 0xaa001e82, 0xba001e83, 0xbd001e84, 0xbe001e85, 0xac001ef2, 0xbc001ef3, + 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, + 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, + 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, + 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, + }, +} + +// ISO8859_15 is the ISO 8859-15 encoding. +var ISO8859_15 encoding.Encoding = &iso8859_15 + +var iso8859_15 = charmap{ + name: "ISO 8859-15", + mib: identifier.ISO885915, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, + {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, + {3, [3]byte{0xe2, 0x82, 0xac}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, + {2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc5, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, + {2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, + {2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, + {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {2, [3]byte{0xc5, 0x92, 0x00}}, {2, [3]byte{0xc5, 0x93, 0x00}}, + {2, [3]byte{0xc5, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, + {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, + {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, + {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, + {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, + {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, + {2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, + {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, + {2, [3]byte{0xc3, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, + {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, + {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, + {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, + {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, + {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, + {2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, + {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, + {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, + {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, + {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, + {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, + {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, + {2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, + {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, + {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, + {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, + {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, + {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, + {2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa50000a5, 0xa70000a7, 0xa90000a9, 0xaa0000aa, + 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, 0xb00000b0, 0xb10000b1, 0xb20000b2, + 0xb30000b3, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb90000b9, 0xba0000ba, 0xbb0000bb, 0xbf0000bf, + 0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7, + 0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, + 0xd00000d0, 0xd10000d1, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd70000d7, + 0xd80000d8, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdd0000dd, 0xde0000de, 0xdf0000df, + 0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe30000e3, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7, + 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef, + 0xf00000f0, 0xf10000f1, 0xf20000f2, 0xf30000f3, 0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf70000f7, + 0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xfd0000fd, 0xfe0000fe, 0xff0000ff, + 0xbc000152, 0xbd000153, 0xa6000160, 0xa8000161, 0xbe000178, 0xb400017d, 0xb800017e, 0xa40020ac, + 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, + 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, + 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, + 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, + }, +} + +// ISO8859_16 is the ISO 8859-16 encoding. +var ISO8859_16 encoding.Encoding = &iso8859_16 + +var iso8859_16 = charmap{ + name: "ISO 8859-16", + mib: identifier.ISO885916, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0x84, 0x00}}, + {2, [3]byte{0xc4, 0x85, 0x00}}, {2, [3]byte{0xc5, 0x81, 0x00}}, + {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xe2, 0x80, 0x9e}}, + {2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc5, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {2, [3]byte{0xc8, 0x98, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, + {2, [3]byte{0xc5, 0xb9, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xc5, 0xba, 0x00}}, {2, [3]byte{0xc5, 0xbb, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc5, 0x82, 0x00}}, + {2, [3]byte{0xc5, 0xbd, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9d}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, + {2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc4, 0x8d, 0x00}}, + {2, [3]byte{0xc8, 0x99, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {2, [3]byte{0xc5, 0x92, 0x00}}, {2, [3]byte{0xc5, 0x93, 0x00}}, + {2, [3]byte{0xc5, 0xb8, 0x00}}, {2, [3]byte{0xc5, 0xbc, 0x00}}, + {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, + {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc4, 0x82, 0x00}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc4, 0x86, 0x00}}, + {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, + {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, + {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, + {2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, + {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, + {2, [3]byte{0xc4, 0x90, 0x00}}, {2, [3]byte{0xc5, 0x83, 0x00}}, + {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, + {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc5, 0x90, 0x00}}, + {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc5, 0x9a, 0x00}}, + {2, [3]byte{0xc5, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, + {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc4, 0x98, 0x00}}, + {2, [3]byte{0xc8, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, + {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0x83, 0x00}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0x87, 0x00}}, + {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, + {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, + {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, + {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, + {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, + {2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc5, 0x84, 0x00}}, + {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, + {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc5, 0x91, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc5, 0x9b, 0x00}}, + {2, [3]byte{0xc5, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, + {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, + {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc4, 0x99, 0x00}}, + {2, [3]byte{0xc8, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa70000a7, 0xa90000a9, 0xab0000ab, 0xad0000ad, 0xb00000b0, 0xb10000b1, 0xb60000b6, + 0xb70000b7, 0xbb0000bb, 0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc40000c4, 0xc60000c6, 0xc70000c7, + 0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, + 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd60000d6, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, + 0xdf0000df, 0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe40000e4, 0xe60000e6, 0xe70000e7, 0xe80000e8, + 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf20000f2, + 0xf30000f3, 0xf40000f4, 0xf60000f6, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xff0000ff, + 0xc3000102, 0xe3000103, 0xa1000104, 0xa2000105, 0xc5000106, 0xe5000107, 0xb200010c, 0xb900010d, + 0xd0000110, 0xf0000111, 0xdd000118, 0xfd000119, 0xa3000141, 0xb3000142, 0xd1000143, 0xf1000144, + 0xd5000150, 0xf5000151, 0xbc000152, 0xbd000153, 0xd700015a, 0xf700015b, 0xa6000160, 0xa8000161, + 0xd8000170, 0xf8000171, 0xbe000178, 0xac000179, 0xae00017a, 0xaf00017b, 0xbf00017c, 0xb400017d, + 0xb800017e, 0xaa000218, 0xba000219, 0xde00021a, 0xfe00021b, 0xb500201d, 0xa500201e, 0xa40020ac, + 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, + 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, + 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, + 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, + }, +} + +// KOI8R is the KOI8-R encoding. +var KOI8R encoding.Encoding = &koi8R + +var koi8R = charmap{ + name: "KOI8-R", + mib: identifier.KOI8R, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0x82}}, + {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x94, 0x90}}, + {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0x98}}, + {3, [3]byte{0xe2, 0x94, 0x9c}}, {3, [3]byte{0xe2, 0x94, 0xa4}}, + {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, + {3, [3]byte{0xe2, 0x94, 0xbc}}, {3, [3]byte{0xe2, 0x96, 0x80}}, + {3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x88}}, + {3, [3]byte{0xe2, 0x96, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x90}}, + {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, + {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x8c, 0xa0}}, + {3, [3]byte{0xe2, 0x96, 0xa0}}, {3, [3]byte{0xe2, 0x88, 0x99}}, + {3, [3]byte{0xe2, 0x88, 0x9a}}, {3, [3]byte{0xe2, 0x89, 0x88}}, + {3, [3]byte{0xe2, 0x89, 0xa4}}, {3, [3]byte{0xe2, 0x89, 0xa5}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x8c, 0xa1}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, + {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, + {3, [3]byte{0xe2, 0x95, 0x90}}, {3, [3]byte{0xe2, 0x95, 0x91}}, + {3, [3]byte{0xe2, 0x95, 0x92}}, {2, [3]byte{0xd1, 0x91, 0x00}}, + {3, [3]byte{0xe2, 0x95, 0x93}}, {3, [3]byte{0xe2, 0x95, 0x94}}, + {3, [3]byte{0xe2, 0x95, 0x95}}, {3, [3]byte{0xe2, 0x95, 0x96}}, + {3, [3]byte{0xe2, 0x95, 0x97}}, {3, [3]byte{0xe2, 0x95, 0x98}}, + {3, [3]byte{0xe2, 0x95, 0x99}}, {3, [3]byte{0xe2, 0x95, 0x9a}}, + {3, [3]byte{0xe2, 0x95, 0x9b}}, {3, [3]byte{0xe2, 0x95, 0x9c}}, + {3, [3]byte{0xe2, 0x95, 0x9d}}, {3, [3]byte{0xe2, 0x95, 0x9e}}, + {3, [3]byte{0xe2, 0x95, 0x9f}}, {3, [3]byte{0xe2, 0x95, 0xa0}}, + {3, [3]byte{0xe2, 0x95, 0xa1}}, {2, [3]byte{0xd0, 0x81, 0x00}}, + {3, [3]byte{0xe2, 0x95, 0xa2}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, + {3, [3]byte{0xe2, 0x95, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa5}}, + {3, [3]byte{0xe2, 0x95, 0xa6}}, {3, [3]byte{0xe2, 0x95, 0xa7}}, + {3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa9}}, + {3, [3]byte{0xe2, 0x95, 0xaa}}, {3, [3]byte{0xe2, 0x95, 0xab}}, + {3, [3]byte{0xe2, 0x95, 0xac}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {2, [3]byte{0xd1, 0x8e, 0x00}}, {2, [3]byte{0xd0, 0xb0, 0x00}}, + {2, [3]byte{0xd0, 0xb1, 0x00}}, {2, [3]byte{0xd1, 0x86, 0x00}}, + {2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}}, + {2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}}, + {2, [3]byte{0xd1, 0x85, 0x00}}, {2, [3]byte{0xd0, 0xb8, 0x00}}, + {2, [3]byte{0xd0, 0xb9, 0x00}}, {2, [3]byte{0xd0, 0xba, 0x00}}, + {2, [3]byte{0xd0, 0xbb, 0x00}}, {2, [3]byte{0xd0, 0xbc, 0x00}}, + {2, [3]byte{0xd0, 0xbd, 0x00}}, {2, [3]byte{0xd0, 0xbe, 0x00}}, + {2, [3]byte{0xd0, 0xbf, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}}, + {2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}}, + {2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}}, + {2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0xb2, 0x00}}, + {2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}}, + {2, [3]byte{0xd0, 0xb7, 0x00}}, {2, [3]byte{0xd1, 0x88, 0x00}}, + {2, [3]byte{0xd1, 0x8d, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}}, + {2, [3]byte{0xd1, 0x87, 0x00}}, {2, [3]byte{0xd1, 0x8a, 0x00}}, + {2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd0, 0x90, 0x00}}, + {2, [3]byte{0xd0, 0x91, 0x00}}, {2, [3]byte{0xd0, 0xa6, 0x00}}, + {2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}}, + {2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}}, + {2, [3]byte{0xd0, 0xa5, 0x00}}, {2, [3]byte{0xd0, 0x98, 0x00}}, + {2, [3]byte{0xd0, 0x99, 0x00}}, {2, [3]byte{0xd0, 0x9a, 0x00}}, + {2, [3]byte{0xd0, 0x9b, 0x00}}, {2, [3]byte{0xd0, 0x9c, 0x00}}, + {2, [3]byte{0xd0, 0x9d, 0x00}}, {2, [3]byte{0xd0, 0x9e, 0x00}}, + {2, [3]byte{0xd0, 0x9f, 0x00}}, {2, [3]byte{0xd0, 0xaf, 0x00}}, + {2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}}, + {2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}}, + {2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x92, 0x00}}, + {2, [3]byte{0xd0, 0xac, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}}, + {2, [3]byte{0xd0, 0x97, 0x00}}, {2, [3]byte{0xd0, 0xa8, 0x00}}, + {2, [3]byte{0xd0, 0xad, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}}, + {2, [3]byte{0xd0, 0xa7, 0x00}}, {2, [3]byte{0xd0, 0xaa, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0x9a0000a0, 0xbf0000a9, 0x9c0000b0, 0x9d0000b2, 0x9e0000b7, 0x9f0000f7, 0xb3000401, 0xe1000410, + 0xe2000411, 0xf7000412, 0xe7000413, 0xe4000414, 0xe5000415, 0xf6000416, 0xfa000417, 0xe9000418, + 0xea000419, 0xeb00041a, 0xec00041b, 0xed00041c, 0xee00041d, 0xef00041e, 0xf000041f, 0xf2000420, + 0xf3000421, 0xf4000422, 0xf5000423, 0xe6000424, 0xe8000425, 0xe3000426, 0xfe000427, 0xfb000428, + 0xfd000429, 0xff00042a, 0xf900042b, 0xf800042c, 0xfc00042d, 0xe000042e, 0xf100042f, 0xc1000430, + 0xc2000431, 0xd7000432, 0xc7000433, 0xc4000434, 0xc5000435, 0xd6000436, 0xda000437, 0xc9000438, + 0xca000439, 0xcb00043a, 0xcc00043b, 0xcd00043c, 0xce00043d, 0xcf00043e, 0xd000043f, 0xd2000440, + 0xd3000441, 0xd4000442, 0xd5000443, 0xc6000444, 0xc8000445, 0xc3000446, 0xde000447, 0xdb000448, + 0xdd000449, 0xdf00044a, 0xd900044b, 0xd800044c, 0xdc00044d, 0xc000044e, 0xd100044f, 0xa3000451, + 0x95002219, 0x9600221a, 0x97002248, 0x98002264, 0x99002265, 0x93002320, 0x9b002321, 0x80002500, + 0x81002502, 0x8200250c, 0x83002510, 0x84002514, 0x85002518, 0x8600251c, 0x87002524, 0x8800252c, + 0x89002534, 0x8a00253c, 0xa0002550, 0xa1002551, 0xa2002552, 0xa4002553, 0xa5002554, 0xa6002555, + 0xa7002556, 0xa8002557, 0xa9002558, 0xaa002559, 0xab00255a, 0xac00255b, 0xad00255c, 0xae00255d, + 0xaf00255e, 0xb000255f, 0xb1002560, 0xb2002561, 0xb4002562, 0xb5002563, 0xb6002564, 0xb7002565, + 0xb8002566, 0xb9002567, 0xba002568, 0xbb002569, 0xbc00256a, 0xbd00256b, 0xbe00256c, 0x8b002580, + 0x8c002584, 0x8d002588, 0x8e00258c, 0x8f002590, 0x90002591, 0x91002592, 0x92002593, 0x940025a0, + }, +} + +// KOI8U is the KOI8-U encoding. +var KOI8U encoding.Encoding = &koi8U + +var koi8U = charmap{ + name: "KOI8-U", + mib: identifier.KOI8U, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0x82}}, + {3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x94, 0x90}}, + {3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0x98}}, + {3, [3]byte{0xe2, 0x94, 0x9c}}, {3, [3]byte{0xe2, 0x94, 0xa4}}, + {3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0xb4}}, + {3, [3]byte{0xe2, 0x94, 0xbc}}, {3, [3]byte{0xe2, 0x96, 0x80}}, + {3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x88}}, + {3, [3]byte{0xe2, 0x96, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x90}}, + {3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}}, + {3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x8c, 0xa0}}, + {3, [3]byte{0xe2, 0x96, 0xa0}}, {3, [3]byte{0xe2, 0x88, 0x99}}, + {3, [3]byte{0xe2, 0x88, 0x9a}}, {3, [3]byte{0xe2, 0x89, 0x88}}, + {3, [3]byte{0xe2, 0x89, 0xa4}}, {3, [3]byte{0xe2, 0x89, 0xa5}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x8c, 0xa1}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}}, + {2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, + {3, [3]byte{0xe2, 0x95, 0x90}}, {3, [3]byte{0xe2, 0x95, 0x91}}, + {3, [3]byte{0xe2, 0x95, 0x92}}, {2, [3]byte{0xd1, 0x91, 0x00}}, + {2, [3]byte{0xd1, 0x94, 0x00}}, {3, [3]byte{0xe2, 0x95, 0x94}}, + {2, [3]byte{0xd1, 0x96, 0x00}}, {2, [3]byte{0xd1, 0x97, 0x00}}, + {3, [3]byte{0xe2, 0x95, 0x97}}, {3, [3]byte{0xe2, 0x95, 0x98}}, + {3, [3]byte{0xe2, 0x95, 0x99}}, {3, [3]byte{0xe2, 0x95, 0x9a}}, + {3, [3]byte{0xe2, 0x95, 0x9b}}, {2, [3]byte{0xd2, 0x91, 0x00}}, + {2, [3]byte{0xd1, 0x9e, 0x00}}, {3, [3]byte{0xe2, 0x95, 0x9e}}, + {3, [3]byte{0xe2, 0x95, 0x9f}}, {3, [3]byte{0xe2, 0x95, 0xa0}}, + {3, [3]byte{0xe2, 0x95, 0xa1}}, {2, [3]byte{0xd0, 0x81, 0x00}}, + {2, [3]byte{0xd0, 0x84, 0x00}}, {3, [3]byte{0xe2, 0x95, 0xa3}}, + {2, [3]byte{0xd0, 0x86, 0x00}}, {2, [3]byte{0xd0, 0x87, 0x00}}, + {3, [3]byte{0xe2, 0x95, 0xa6}}, {3, [3]byte{0xe2, 0x95, 0xa7}}, + {3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa9}}, + {3, [3]byte{0xe2, 0x95, 0xaa}}, {2, [3]byte{0xd2, 0x90, 0x00}}, + {2, [3]byte{0xd0, 0x8e, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {2, [3]byte{0xd1, 0x8e, 0x00}}, {2, [3]byte{0xd0, 0xb0, 0x00}}, + {2, [3]byte{0xd0, 0xb1, 0x00}}, {2, [3]byte{0xd1, 0x86, 0x00}}, + {2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}}, + {2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}}, + {2, [3]byte{0xd1, 0x85, 0x00}}, {2, [3]byte{0xd0, 0xb8, 0x00}}, + {2, [3]byte{0xd0, 0xb9, 0x00}}, {2, [3]byte{0xd0, 0xba, 0x00}}, + {2, [3]byte{0xd0, 0xbb, 0x00}}, {2, [3]byte{0xd0, 0xbc, 0x00}}, + {2, [3]byte{0xd0, 0xbd, 0x00}}, {2, [3]byte{0xd0, 0xbe, 0x00}}, + {2, [3]byte{0xd0, 0xbf, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}}, + {2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}}, + {2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}}, + {2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0xb2, 0x00}}, + {2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}}, + {2, [3]byte{0xd0, 0xb7, 0x00}}, {2, [3]byte{0xd1, 0x88, 0x00}}, + {2, [3]byte{0xd1, 0x8d, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}}, + {2, [3]byte{0xd1, 0x87, 0x00}}, {2, [3]byte{0xd1, 0x8a, 0x00}}, + {2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd0, 0x90, 0x00}}, + {2, [3]byte{0xd0, 0x91, 0x00}}, {2, [3]byte{0xd0, 0xa6, 0x00}}, + {2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}}, + {2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}}, + {2, [3]byte{0xd0, 0xa5, 0x00}}, {2, [3]byte{0xd0, 0x98, 0x00}}, + {2, [3]byte{0xd0, 0x99, 0x00}}, {2, [3]byte{0xd0, 0x9a, 0x00}}, + {2, [3]byte{0xd0, 0x9b, 0x00}}, {2, [3]byte{0xd0, 0x9c, 0x00}}, + {2, [3]byte{0xd0, 0x9d, 0x00}}, {2, [3]byte{0xd0, 0x9e, 0x00}}, + {2, [3]byte{0xd0, 0x9f, 0x00}}, {2, [3]byte{0xd0, 0xaf, 0x00}}, + {2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}}, + {2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}}, + {2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x92, 0x00}}, + {2, [3]byte{0xd0, 0xac, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}}, + {2, [3]byte{0xd0, 0x97, 0x00}}, {2, [3]byte{0xd0, 0xa8, 0x00}}, + {2, [3]byte{0xd0, 0xad, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}}, + {2, [3]byte{0xd0, 0xa7, 0x00}}, {2, [3]byte{0xd0, 0xaa, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0x9a0000a0, 0xbf0000a9, 0x9c0000b0, 0x9d0000b2, 0x9e0000b7, 0x9f0000f7, 0xb3000401, 0xb4000404, + 0xb6000406, 0xb7000407, 0xbe00040e, 0xe1000410, 0xe2000411, 0xf7000412, 0xe7000413, 0xe4000414, + 0xe5000415, 0xf6000416, 0xfa000417, 0xe9000418, 0xea000419, 0xeb00041a, 0xec00041b, 0xed00041c, + 0xee00041d, 0xef00041e, 0xf000041f, 0xf2000420, 0xf3000421, 0xf4000422, 0xf5000423, 0xe6000424, + 0xe8000425, 0xe3000426, 0xfe000427, 0xfb000428, 0xfd000429, 0xff00042a, 0xf900042b, 0xf800042c, + 0xfc00042d, 0xe000042e, 0xf100042f, 0xc1000430, 0xc2000431, 0xd7000432, 0xc7000433, 0xc4000434, + 0xc5000435, 0xd6000436, 0xda000437, 0xc9000438, 0xca000439, 0xcb00043a, 0xcc00043b, 0xcd00043c, + 0xce00043d, 0xcf00043e, 0xd000043f, 0xd2000440, 0xd3000441, 0xd4000442, 0xd5000443, 0xc6000444, + 0xc8000445, 0xc3000446, 0xde000447, 0xdb000448, 0xdd000449, 0xdf00044a, 0xd900044b, 0xd800044c, + 0xdc00044d, 0xc000044e, 0xd100044f, 0xa3000451, 0xa4000454, 0xa6000456, 0xa7000457, 0xae00045e, + 0xbd000490, 0xad000491, 0x95002219, 0x9600221a, 0x97002248, 0x98002264, 0x99002265, 0x93002320, + 0x9b002321, 0x80002500, 0x81002502, 0x8200250c, 0x83002510, 0x84002514, 0x85002518, 0x8600251c, + 0x87002524, 0x8800252c, 0x89002534, 0x8a00253c, 0xa0002550, 0xa1002551, 0xa2002552, 0xa5002554, + 0xa8002557, 0xa9002558, 0xaa002559, 0xab00255a, 0xac00255b, 0xaf00255e, 0xb000255f, 0xb1002560, + 0xb2002561, 0xb5002563, 0xb8002566, 0xb9002567, 0xba002568, 0xbb002569, 0xbc00256a, 0x8b002580, + 0x8c002584, 0x8d002588, 0x8e00258c, 0x8f002590, 0x90002591, 0x91002592, 0x92002593, 0x940025a0, + }, +} + +// Macintosh is the Macintosh encoding. +var Macintosh encoding.Encoding = &macintosh + +var macintosh = charmap{ + name: "Macintosh", + mib: identifier.Macintosh, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, + {2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, + {2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, + {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, + {2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, + {2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}}, + {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, + {2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}}, + {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, + {2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, + {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, + {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, + {2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}}, + {3, [3]byte{0xe2, 0x80, 0xa0}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, + {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, + {2, [3]byte{0xc2, 0xa7, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {3, [3]byte{0xe2, 0x84, 0xa2}}, {2, [3]byte{0xc2, 0xb4, 0x00}}, + {2, [3]byte{0xc2, 0xa8, 0x00}}, {3, [3]byte{0xe2, 0x89, 0xa0}}, + {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}}, + {3, [3]byte{0xe2, 0x88, 0x9e}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {3, [3]byte{0xe2, 0x89, 0xa4}}, {3, [3]byte{0xe2, 0x89, 0xa5}}, + {2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, + {3, [3]byte{0xe2, 0x88, 0x82}}, {3, [3]byte{0xe2, 0x88, 0x91}}, + {3, [3]byte{0xe2, 0x88, 0x8f}}, {2, [3]byte{0xcf, 0x80, 0x00}}, + {3, [3]byte{0xe2, 0x88, 0xab}}, {2, [3]byte{0xc2, 0xaa, 0x00}}, + {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xce, 0xa9, 0x00}}, + {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}}, + {2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}}, + {2, [3]byte{0xc6, 0x92, 0x00}}, {3, [3]byte{0xe2, 0x89, 0x88}}, + {3, [3]byte{0xe2, 0x88, 0x86}}, {2, [3]byte{0xc2, 0xab, 0x00}}, + {2, [3]byte{0xc2, 0xbb, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}}, + {2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, + {2, [3]byte{0xc5, 0x92, 0x00}}, {2, [3]byte{0xc5, 0x93, 0x00}}, + {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, + {3, [3]byte{0xe2, 0x80, 0x9c}}, {3, [3]byte{0xe2, 0x80, 0x9d}}, + {3, [3]byte{0xe2, 0x80, 0x98}}, {3, [3]byte{0xe2, 0x80, 0x99}}, + {2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x97, 0x8a}}, + {2, [3]byte{0xc3, 0xbf, 0x00}}, {2, [3]byte{0xc5, 0xb8, 0x00}}, + {3, [3]byte{0xe2, 0x81, 0x84}}, {3, [3]byte{0xe2, 0x82, 0xac}}, + {3, [3]byte{0xe2, 0x80, 0xb9}}, {3, [3]byte{0xe2, 0x80, 0xba}}, + {3, [3]byte{0xef, 0xac, 0x81}}, {3, [3]byte{0xef, 0xac, 0x82}}, + {3, [3]byte{0xe2, 0x80, 0xa1}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, + {3, [3]byte{0xe2, 0x80, 0x9a}}, {3, [3]byte{0xe2, 0x80, 0x9e}}, + {3, [3]byte{0xe2, 0x80, 0xb0}}, {2, [3]byte{0xc3, 0x82, 0x00}}, + {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, + {2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}}, + {2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}}, + {2, [3]byte{0xc3, 0x8f, 0x00}}, {2, [3]byte{0xc3, 0x8c, 0x00}}, + {2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}}, + {3, [3]byte{0xef, 0xa3, 0xbf}}, {2, [3]byte{0xc3, 0x92, 0x00}}, + {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, + {2, [3]byte{0xc3, 0x99, 0x00}}, {2, [3]byte{0xc4, 0xb1, 0x00}}, + {2, [3]byte{0xcb, 0x86, 0x00}}, {2, [3]byte{0xcb, 0x9c, 0x00}}, + {2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xcb, 0x98, 0x00}}, + {2, [3]byte{0xcb, 0x99, 0x00}}, {2, [3]byte{0xcb, 0x9a, 0x00}}, + {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xcb, 0x9d, 0x00}}, + {2, [3]byte{0xcb, 0x9b, 0x00}}, {2, [3]byte{0xcb, 0x87, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xca0000a0, 0xc10000a1, 0xa20000a2, 0xa30000a3, 0xb40000a5, 0xa40000a7, 0xac0000a8, 0xa90000a9, + 0xbb0000aa, 0xc70000ab, 0xc20000ac, 0xa80000ae, 0xf80000af, 0xa10000b0, 0xb10000b1, 0xab0000b4, + 0xb50000b5, 0xa60000b6, 0xe10000b7, 0xfc0000b8, 0xbc0000ba, 0xc80000bb, 0xc00000bf, 0xcb0000c0, + 0xe70000c1, 0xe50000c2, 0xcc0000c3, 0x800000c4, 0x810000c5, 0xae0000c6, 0x820000c7, 0xe90000c8, + 0x830000c9, 0xe60000ca, 0xe80000cb, 0xed0000cc, 0xea0000cd, 0xeb0000ce, 0xec0000cf, 0x840000d1, + 0xf10000d2, 0xee0000d3, 0xef0000d4, 0xcd0000d5, 0x850000d6, 0xaf0000d8, 0xf40000d9, 0xf20000da, + 0xf30000db, 0x860000dc, 0xa70000df, 0x880000e0, 0x870000e1, 0x890000e2, 0x8b0000e3, 0x8a0000e4, + 0x8c0000e5, 0xbe0000e6, 0x8d0000e7, 0x8f0000e8, 0x8e0000e9, 0x900000ea, 0x910000eb, 0x930000ec, + 0x920000ed, 0x940000ee, 0x950000ef, 0x960000f1, 0x980000f2, 0x970000f3, 0x990000f4, 0x9b0000f5, + 0x9a0000f6, 0xd60000f7, 0xbf0000f8, 0x9d0000f9, 0x9c0000fa, 0x9e0000fb, 0x9f0000fc, 0xd80000ff, + 0xf5000131, 0xce000152, 0xcf000153, 0xd9000178, 0xc4000192, 0xf60002c6, 0xff0002c7, 0xf90002d8, + 0xfa0002d9, 0xfb0002da, 0xfe0002db, 0xf70002dc, 0xfd0002dd, 0xbd0003a9, 0xb90003c0, 0xd0002013, + 0xd1002014, 0xd4002018, 0xd5002019, 0xe200201a, 0xd200201c, 0xd300201d, 0xe300201e, 0xa0002020, + 0xe0002021, 0xa5002022, 0xc9002026, 0xe4002030, 0xdc002039, 0xdd00203a, 0xda002044, 0xdb0020ac, + 0xaa002122, 0xb6002202, 0xc6002206, 0xb800220f, 0xb7002211, 0xc300221a, 0xb000221e, 0xba00222b, + 0xc5002248, 0xad002260, 0xb2002264, 0xb3002265, 0xd70025ca, 0xf000f8ff, 0xde00fb01, 0xdf00fb02, + }, +} + +// MacintoshCyrillic is the Macintosh Cyrillic encoding. +var MacintoshCyrillic encoding.Encoding = &macintoshCyrillic + +var macintoshCyrillic = charmap{ + name: "Macintosh Cyrillic", + mib: identifier.MacintoshCyrillic, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {2, [3]byte{0xd0, 0x90, 0x00}}, {2, [3]byte{0xd0, 0x91, 0x00}}, + {2, [3]byte{0xd0, 0x92, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}}, + {2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}}, + {2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x97, 0x00}}, + {2, [3]byte{0xd0, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x99, 0x00}}, + {2, [3]byte{0xd0, 0x9a, 0x00}}, {2, [3]byte{0xd0, 0x9b, 0x00}}, + {2, [3]byte{0xd0, 0x9c, 0x00}}, {2, [3]byte{0xd0, 0x9d, 0x00}}, + {2, [3]byte{0xd0, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x9f, 0x00}}, + {2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}}, + {2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}}, + {2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0xa5, 0x00}}, + {2, [3]byte{0xd0, 0xa6, 0x00}}, {2, [3]byte{0xd0, 0xa7, 0x00}}, + {2, [3]byte{0xd0, 0xa8, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}}, + {2, [3]byte{0xd0, 0xaa, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}}, + {2, [3]byte{0xd0, 0xac, 0x00}}, {2, [3]byte{0xd0, 0xad, 0x00}}, + {2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd0, 0xaf, 0x00}}, + {3, [3]byte{0xe2, 0x80, 0xa0}}, {2, [3]byte{0xc2, 0xb0, 0x00}}, + {2, [3]byte{0xd2, 0x90, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, + {2, [3]byte{0xc2, 0xa7, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0x86, 0x00}}, + {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {3, [3]byte{0xe2, 0x84, 0xa2}}, {2, [3]byte{0xd0, 0x82, 0x00}}, + {2, [3]byte{0xd1, 0x92, 0x00}}, {3, [3]byte{0xe2, 0x89, 0xa0}}, + {2, [3]byte{0xd0, 0x83, 0x00}}, {2, [3]byte{0xd1, 0x93, 0x00}}, + {3, [3]byte{0xe2, 0x88, 0x9e}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {3, [3]byte{0xe2, 0x89, 0xa4}}, {3, [3]byte{0xe2, 0x89, 0xa5}}, + {2, [3]byte{0xd1, 0x96, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, + {2, [3]byte{0xd2, 0x91, 0x00}}, {2, [3]byte{0xd0, 0x88, 0x00}}, + {2, [3]byte{0xd0, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x94, 0x00}}, + {2, [3]byte{0xd0, 0x87, 0x00}}, {2, [3]byte{0xd1, 0x97, 0x00}}, + {2, [3]byte{0xd0, 0x89, 0x00}}, {2, [3]byte{0xd1, 0x99, 0x00}}, + {2, [3]byte{0xd0, 0x8a, 0x00}}, {2, [3]byte{0xd1, 0x9a, 0x00}}, + {2, [3]byte{0xd1, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x85, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}}, + {2, [3]byte{0xc6, 0x92, 0x00}}, {3, [3]byte{0xe2, 0x89, 0x88}}, + {3, [3]byte{0xe2, 0x88, 0x86}}, {2, [3]byte{0xc2, 0xab, 0x00}}, + {2, [3]byte{0xc2, 0xbb, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0x8b, 0x00}}, + {2, [3]byte{0xd1, 0x9b, 0x00}}, {2, [3]byte{0xd0, 0x8c, 0x00}}, + {2, [3]byte{0xd1, 0x9c, 0x00}}, {2, [3]byte{0xd1, 0x95, 0x00}}, + {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, + {3, [3]byte{0xe2, 0x80, 0x9c}}, {3, [3]byte{0xe2, 0x80, 0x9d}}, + {3, [3]byte{0xe2, 0x80, 0x98}}, {3, [3]byte{0xe2, 0x80, 0x99}}, + {2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9e}}, + {2, [3]byte{0xd0, 0x8e, 0x00}}, {2, [3]byte{0xd1, 0x9e, 0x00}}, + {2, [3]byte{0xd0, 0x8f, 0x00}}, {2, [3]byte{0xd1, 0x9f, 0x00}}, + {3, [3]byte{0xe2, 0x84, 0x96}}, {2, [3]byte{0xd0, 0x81, 0x00}}, + {2, [3]byte{0xd1, 0x91, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}}, + {2, [3]byte{0xd0, 0xb0, 0x00}}, {2, [3]byte{0xd0, 0xb1, 0x00}}, + {2, [3]byte{0xd0, 0xb2, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}}, + {2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}}, + {2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0xb7, 0x00}}, + {2, [3]byte{0xd0, 0xb8, 0x00}}, {2, [3]byte{0xd0, 0xb9, 0x00}}, + {2, [3]byte{0xd0, 0xba, 0x00}}, {2, [3]byte{0xd0, 0xbb, 0x00}}, + {2, [3]byte{0xd0, 0xbc, 0x00}}, {2, [3]byte{0xd0, 0xbd, 0x00}}, + {2, [3]byte{0xd0, 0xbe, 0x00}}, {2, [3]byte{0xd0, 0xbf, 0x00}}, + {2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}}, + {2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}}, + {2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x85, 0x00}}, + {2, [3]byte{0xd1, 0x86, 0x00}}, {2, [3]byte{0xd1, 0x87, 0x00}}, + {2, [3]byte{0xd1, 0x88, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}}, + {2, [3]byte{0xd1, 0x8a, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}}, + {2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x8d, 0x00}}, + {2, [3]byte{0xd1, 0x8e, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xca0000a0, 0xa30000a3, 0xa40000a7, 0xa90000a9, 0xc70000ab, 0xc20000ac, 0xa80000ae, 0xa10000b0, + 0xb10000b1, 0xb50000b5, 0xa60000b6, 0xc80000bb, 0xd60000f7, 0xc4000192, 0xdd000401, 0xab000402, + 0xae000403, 0xb8000404, 0xc1000405, 0xa7000406, 0xba000407, 0xb7000408, 0xbc000409, 0xbe00040a, + 0xcb00040b, 0xcd00040c, 0xd800040e, 0xda00040f, 0x80000410, 0x81000411, 0x82000412, 0x83000413, + 0x84000414, 0x85000415, 0x86000416, 0x87000417, 0x88000418, 0x89000419, 0x8a00041a, 0x8b00041b, + 0x8c00041c, 0x8d00041d, 0x8e00041e, 0x8f00041f, 0x90000420, 0x91000421, 0x92000422, 0x93000423, + 0x94000424, 0x95000425, 0x96000426, 0x97000427, 0x98000428, 0x99000429, 0x9a00042a, 0x9b00042b, + 0x9c00042c, 0x9d00042d, 0x9e00042e, 0x9f00042f, 0xe0000430, 0xe1000431, 0xe2000432, 0xe3000433, + 0xe4000434, 0xe5000435, 0xe6000436, 0xe7000437, 0xe8000438, 0xe9000439, 0xea00043a, 0xeb00043b, + 0xec00043c, 0xed00043d, 0xee00043e, 0xef00043f, 0xf0000440, 0xf1000441, 0xf2000442, 0xf3000443, + 0xf4000444, 0xf5000445, 0xf6000446, 0xf7000447, 0xf8000448, 0xf9000449, 0xfa00044a, 0xfb00044b, + 0xfc00044c, 0xfd00044d, 0xfe00044e, 0xdf00044f, 0xde000451, 0xac000452, 0xaf000453, 0xb9000454, + 0xcf000455, 0xb4000456, 0xbb000457, 0xc0000458, 0xbd000459, 0xbf00045a, 0xcc00045b, 0xce00045c, + 0xd900045e, 0xdb00045f, 0xa2000490, 0xb6000491, 0xd0002013, 0xd1002014, 0xd4002018, 0xd5002019, + 0xd200201c, 0xd300201d, 0xd700201e, 0xa0002020, 0xa5002022, 0xc9002026, 0xff0020ac, 0xdc002116, + 0xaa002122, 0xc6002206, 0xc300221a, 0xb000221e, 0xc5002248, 0xad002260, 0xb2002264, 0xb3002265, + }, +} + +// Windows874 is the Windows 874 encoding. +var Windows874 encoding.Encoding = &windows874 + +var windows874 = charmap{ + name: "Windows 874", + mib: identifier.Windows874, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}}, + {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, + {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, + {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xe0, 0xb8, 0x81}}, + {3, [3]byte{0xe0, 0xb8, 0x82}}, {3, [3]byte{0xe0, 0xb8, 0x83}}, + {3, [3]byte{0xe0, 0xb8, 0x84}}, {3, [3]byte{0xe0, 0xb8, 0x85}}, + {3, [3]byte{0xe0, 0xb8, 0x86}}, {3, [3]byte{0xe0, 0xb8, 0x87}}, + {3, [3]byte{0xe0, 0xb8, 0x88}}, {3, [3]byte{0xe0, 0xb8, 0x89}}, + {3, [3]byte{0xe0, 0xb8, 0x8a}}, {3, [3]byte{0xe0, 0xb8, 0x8b}}, + {3, [3]byte{0xe0, 0xb8, 0x8c}}, {3, [3]byte{0xe0, 0xb8, 0x8d}}, + {3, [3]byte{0xe0, 0xb8, 0x8e}}, {3, [3]byte{0xe0, 0xb8, 0x8f}}, + {3, [3]byte{0xe0, 0xb8, 0x90}}, {3, [3]byte{0xe0, 0xb8, 0x91}}, + {3, [3]byte{0xe0, 0xb8, 0x92}}, {3, [3]byte{0xe0, 0xb8, 0x93}}, + {3, [3]byte{0xe0, 0xb8, 0x94}}, {3, [3]byte{0xe0, 0xb8, 0x95}}, + {3, [3]byte{0xe0, 0xb8, 0x96}}, {3, [3]byte{0xe0, 0xb8, 0x97}}, + {3, [3]byte{0xe0, 0xb8, 0x98}}, {3, [3]byte{0xe0, 0xb8, 0x99}}, + {3, [3]byte{0xe0, 0xb8, 0x9a}}, {3, [3]byte{0xe0, 0xb8, 0x9b}}, + {3, [3]byte{0xe0, 0xb8, 0x9c}}, {3, [3]byte{0xe0, 0xb8, 0x9d}}, + {3, [3]byte{0xe0, 0xb8, 0x9e}}, {3, [3]byte{0xe0, 0xb8, 0x9f}}, + {3, [3]byte{0xe0, 0xb8, 0xa0}}, {3, [3]byte{0xe0, 0xb8, 0xa1}}, + {3, [3]byte{0xe0, 0xb8, 0xa2}}, {3, [3]byte{0xe0, 0xb8, 0xa3}}, + {3, [3]byte{0xe0, 0xb8, 0xa4}}, {3, [3]byte{0xe0, 0xb8, 0xa5}}, + {3, [3]byte{0xe0, 0xb8, 0xa6}}, {3, [3]byte{0xe0, 0xb8, 0xa7}}, + {3, [3]byte{0xe0, 0xb8, 0xa8}}, {3, [3]byte{0xe0, 0xb8, 0xa9}}, + {3, [3]byte{0xe0, 0xb8, 0xaa}}, {3, [3]byte{0xe0, 0xb8, 0xab}}, + {3, [3]byte{0xe0, 0xb8, 0xac}}, {3, [3]byte{0xe0, 0xb8, 0xad}}, + {3, [3]byte{0xe0, 0xb8, 0xae}}, {3, [3]byte{0xe0, 0xb8, 0xaf}}, + {3, [3]byte{0xe0, 0xb8, 0xb0}}, {3, [3]byte{0xe0, 0xb8, 0xb1}}, + {3, [3]byte{0xe0, 0xb8, 0xb2}}, {3, [3]byte{0xe0, 0xb8, 0xb3}}, + {3, [3]byte{0xe0, 0xb8, 0xb4}}, {3, [3]byte{0xe0, 0xb8, 0xb5}}, + {3, [3]byte{0xe0, 0xb8, 0xb6}}, {3, [3]byte{0xe0, 0xb8, 0xb7}}, + {3, [3]byte{0xe0, 0xb8, 0xb8}}, {3, [3]byte{0xe0, 0xb8, 0xb9}}, + {3, [3]byte{0xe0, 0xb8, 0xba}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe0, 0xb8, 0xbf}}, + {3, [3]byte{0xe0, 0xb9, 0x80}}, {3, [3]byte{0xe0, 0xb9, 0x81}}, + {3, [3]byte{0xe0, 0xb9, 0x82}}, {3, [3]byte{0xe0, 0xb9, 0x83}}, + {3, [3]byte{0xe0, 0xb9, 0x84}}, {3, [3]byte{0xe0, 0xb9, 0x85}}, + {3, [3]byte{0xe0, 0xb9, 0x86}}, {3, [3]byte{0xe0, 0xb9, 0x87}}, + {3, [3]byte{0xe0, 0xb9, 0x88}}, {3, [3]byte{0xe0, 0xb9, 0x89}}, + {3, [3]byte{0xe0, 0xb9, 0x8a}}, {3, [3]byte{0xe0, 0xb9, 0x8b}}, + {3, [3]byte{0xe0, 0xb9, 0x8c}}, {3, [3]byte{0xe0, 0xb9, 0x8d}}, + {3, [3]byte{0xe0, 0xb9, 0x8e}}, {3, [3]byte{0xe0, 0xb9, 0x8f}}, + {3, [3]byte{0xe0, 0xb9, 0x90}}, {3, [3]byte{0xe0, 0xb9, 0x91}}, + {3, [3]byte{0xe0, 0xb9, 0x92}}, {3, [3]byte{0xe0, 0xb9, 0x93}}, + {3, [3]byte{0xe0, 0xb9, 0x94}}, {3, [3]byte{0xe0, 0xb9, 0x95}}, + {3, [3]byte{0xe0, 0xb9, 0x96}}, {3, [3]byte{0xe0, 0xb9, 0x97}}, + {3, [3]byte{0xe0, 0xb9, 0x98}}, {3, [3]byte{0xe0, 0xb9, 0x99}}, + {3, [3]byte{0xe0, 0xb9, 0x9a}}, {3, [3]byte{0xe0, 0xb9, 0x9b}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa1000e01, 0xa2000e02, 0xa3000e03, 0xa4000e04, 0xa5000e05, 0xa6000e06, 0xa7000e07, + 0xa8000e08, 0xa9000e09, 0xaa000e0a, 0xab000e0b, 0xac000e0c, 0xad000e0d, 0xae000e0e, 0xaf000e0f, + 0xb0000e10, 0xb1000e11, 0xb2000e12, 0xb3000e13, 0xb4000e14, 0xb5000e15, 0xb6000e16, 0xb7000e17, + 0xb8000e18, 0xb9000e19, 0xba000e1a, 0xbb000e1b, 0xbc000e1c, 0xbd000e1d, 0xbe000e1e, 0xbf000e1f, + 0xc0000e20, 0xc1000e21, 0xc2000e22, 0xc3000e23, 0xc4000e24, 0xc5000e25, 0xc6000e26, 0xc7000e27, + 0xc8000e28, 0xc9000e29, 0xca000e2a, 0xcb000e2b, 0xcc000e2c, 0xcd000e2d, 0xce000e2e, 0xcf000e2f, + 0xd0000e30, 0xd1000e31, 0xd2000e32, 0xd3000e33, 0xd4000e34, 0xd5000e35, 0xd6000e36, 0xd7000e37, + 0xd8000e38, 0xd9000e39, 0xda000e3a, 0xdf000e3f, 0xe0000e40, 0xe1000e41, 0xe2000e42, 0xe3000e43, + 0xe4000e44, 0xe5000e45, 0xe6000e46, 0xe7000e47, 0xe8000e48, 0xe9000e49, 0xea000e4a, 0xeb000e4b, + 0xec000e4c, 0xed000e4d, 0xee000e4e, 0xef000e4f, 0xf0000e50, 0xf1000e51, 0xf2000e52, 0xf3000e53, + 0xf4000e54, 0xf5000e55, 0xf6000e56, 0xf7000e57, 0xf8000e58, 0xf9000e59, 0xfa000e5a, 0xfb000e5b, + 0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x9300201c, 0x9400201d, 0x95002022, 0x85002026, + 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, + 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, + 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, + 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, + }, +} + +// Windows1250 is the Windows 1250 encoding. +var Windows1250 encoding.Encoding = &windows1250 + +var windows1250 = charmap{ + name: "Windows 1250", + mib: identifier.Windows1250, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xe2, 0x80, 0x9a}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, + {3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, + {2, [3]byte{0xc5, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, + {2, [3]byte{0xc5, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0xa4, 0x00}}, + {2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc5, 0xb9, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}}, + {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, + {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, + {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, + {2, [3]byte{0xc5, 0xa1, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xba}}, + {2, [3]byte{0xc5, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0xa5, 0x00}}, + {2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0xba, 0x00}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xcb, 0x87, 0x00}}, + {2, [3]byte{0xcb, 0x98, 0x00}}, {2, [3]byte{0xc5, 0x81, 0x00}}, + {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0x84, 0x00}}, + {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {2, [3]byte{0xc5, 0x9e, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc5, 0xbb, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {2, [3]byte{0xcb, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0x82, 0x00}}, + {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, + {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc4, 0x85, 0x00}}, + {2, [3]byte{0xc5, 0x9f, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {2, [3]byte{0xc4, 0xbd, 0x00}}, {2, [3]byte{0xcb, 0x9d, 0x00}}, + {2, [3]byte{0xc4, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0xbc, 0x00}}, + {2, [3]byte{0xc5, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, + {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc4, 0x82, 0x00}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc4, 0xb9, 0x00}}, + {2, [3]byte{0xc4, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, + {2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, + {2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, + {2, [3]byte{0xc4, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, + {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc4, 0x8e, 0x00}}, + {2, [3]byte{0xc4, 0x90, 0x00}}, {2, [3]byte{0xc5, 0x83, 0x00}}, + {2, [3]byte{0xc5, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, + {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc5, 0x90, 0x00}}, + {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, + {2, [3]byte{0xc5, 0x98, 0x00}}, {2, [3]byte{0xc5, 0xae, 0x00}}, + {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0xb0, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, + {2, [3]byte{0xc5, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xc5, 0x95, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, + {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0x83, 0x00}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0xba, 0x00}}, + {2, [3]byte{0xc4, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, + {2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, + {2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, + {2, [3]byte{0xc4, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, + {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc4, 0x8f, 0x00}}, + {2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc5, 0x84, 0x00}}, + {2, [3]byte{0xc5, 0x88, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, + {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc5, 0x91, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, + {2, [3]byte{0xc5, 0x99, 0x00}}, {2, [3]byte{0xc5, 0xaf, 0x00}}, + {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc5, 0xb1, 0x00}}, + {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, + {2, [3]byte{0xc5, 0xa3, 0x00}}, {2, [3]byte{0xcb, 0x99, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa40000a4, 0xa60000a6, 0xa70000a7, 0xa80000a8, 0xa90000a9, 0xab0000ab, 0xac0000ac, + 0xad0000ad, 0xae0000ae, 0xb00000b0, 0xb10000b1, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, + 0xb80000b8, 0xbb0000bb, 0xc10000c1, 0xc20000c2, 0xc40000c4, 0xc70000c7, 0xc90000c9, 0xcb0000cb, + 0xcd0000cd, 0xce0000ce, 0xd30000d3, 0xd40000d4, 0xd60000d6, 0xd70000d7, 0xda0000da, 0xdc0000dc, + 0xdd0000dd, 0xdf0000df, 0xe10000e1, 0xe20000e2, 0xe40000e4, 0xe70000e7, 0xe90000e9, 0xeb0000eb, + 0xed0000ed, 0xee0000ee, 0xf30000f3, 0xf40000f4, 0xf60000f6, 0xf70000f7, 0xfa0000fa, 0xfc0000fc, + 0xfd0000fd, 0xc3000102, 0xe3000103, 0xa5000104, 0xb9000105, 0xc6000106, 0xe6000107, 0xc800010c, + 0xe800010d, 0xcf00010e, 0xef00010f, 0xd0000110, 0xf0000111, 0xca000118, 0xea000119, 0xcc00011a, + 0xec00011b, 0xc5000139, 0xe500013a, 0xbc00013d, 0xbe00013e, 0xa3000141, 0xb3000142, 0xd1000143, + 0xf1000144, 0xd2000147, 0xf2000148, 0xd5000150, 0xf5000151, 0xc0000154, 0xe0000155, 0xd8000158, + 0xf8000159, 0x8c00015a, 0x9c00015b, 0xaa00015e, 0xba00015f, 0x8a000160, 0x9a000161, 0xde000162, + 0xfe000163, 0x8d000164, 0x9d000165, 0xd900016e, 0xf900016f, 0xdb000170, 0xfb000171, 0x8f000179, + 0x9f00017a, 0xaf00017b, 0xbf00017c, 0x8e00017d, 0x9e00017e, 0xa10002c7, 0xa20002d8, 0xff0002d9, + 0xb20002db, 0xbd0002dd, 0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c, + 0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039, + 0x9b00203a, 0x800020ac, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, + }, +} + +// Windows1251 is the Windows 1251 encoding. +var Windows1251 encoding.Encoding = &windows1251 + +var windows1251 = charmap{ + name: "Windows 1251", + mib: identifier.Windows1251, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {2, [3]byte{0xd0, 0x82, 0x00}}, {2, [3]byte{0xd0, 0x83, 0x00}}, + {3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xd1, 0x93, 0x00}}, + {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, + {3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, + {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, + {2, [3]byte{0xd0, 0x89, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, + {2, [3]byte{0xd0, 0x8a, 0x00}}, {2, [3]byte{0xd0, 0x8c, 0x00}}, + {2, [3]byte{0xd0, 0x8b, 0x00}}, {2, [3]byte{0xd0, 0x8f, 0x00}}, + {2, [3]byte{0xd1, 0x92, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x98}}, + {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, + {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, + {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, + {2, [3]byte{0xd1, 0x99, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xba}}, + {2, [3]byte{0xd1, 0x9a, 0x00}}, {2, [3]byte{0xd1, 0x9c, 0x00}}, + {2, [3]byte{0xd1, 0x9b, 0x00}}, {2, [3]byte{0xd1, 0x9f, 0x00}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0x8e, 0x00}}, + {2, [3]byte{0xd1, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x88, 0x00}}, + {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xd2, 0x90, 0x00}}, + {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xd0, 0x81, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {2, [3]byte{0xd0, 0x84, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xd0, 0x87, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {2, [3]byte{0xd0, 0x86, 0x00}}, {2, [3]byte{0xd1, 0x96, 0x00}}, + {2, [3]byte{0xd2, 0x91, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, + {2, [3]byte{0xd1, 0x91, 0x00}}, {3, [3]byte{0xe2, 0x84, 0x96}}, + {2, [3]byte{0xd1, 0x94, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {2, [3]byte{0xd1, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x85, 0x00}}, + {2, [3]byte{0xd1, 0x95, 0x00}}, {2, [3]byte{0xd1, 0x97, 0x00}}, + {2, [3]byte{0xd0, 0x90, 0x00}}, {2, [3]byte{0xd0, 0x91, 0x00}}, + {2, [3]byte{0xd0, 0x92, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}}, + {2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}}, + {2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x97, 0x00}}, + {2, [3]byte{0xd0, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x99, 0x00}}, + {2, [3]byte{0xd0, 0x9a, 0x00}}, {2, [3]byte{0xd0, 0x9b, 0x00}}, + {2, [3]byte{0xd0, 0x9c, 0x00}}, {2, [3]byte{0xd0, 0x9d, 0x00}}, + {2, [3]byte{0xd0, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x9f, 0x00}}, + {2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}}, + {2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}}, + {2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0xa5, 0x00}}, + {2, [3]byte{0xd0, 0xa6, 0x00}}, {2, [3]byte{0xd0, 0xa7, 0x00}}, + {2, [3]byte{0xd0, 0xa8, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}}, + {2, [3]byte{0xd0, 0xaa, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}}, + {2, [3]byte{0xd0, 0xac, 0x00}}, {2, [3]byte{0xd0, 0xad, 0x00}}, + {2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd0, 0xaf, 0x00}}, + {2, [3]byte{0xd0, 0xb0, 0x00}}, {2, [3]byte{0xd0, 0xb1, 0x00}}, + {2, [3]byte{0xd0, 0xb2, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}}, + {2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}}, + {2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0xb7, 0x00}}, + {2, [3]byte{0xd0, 0xb8, 0x00}}, {2, [3]byte{0xd0, 0xb9, 0x00}}, + {2, [3]byte{0xd0, 0xba, 0x00}}, {2, [3]byte{0xd0, 0xbb, 0x00}}, + {2, [3]byte{0xd0, 0xbc, 0x00}}, {2, [3]byte{0xd0, 0xbd, 0x00}}, + {2, [3]byte{0xd0, 0xbe, 0x00}}, {2, [3]byte{0xd0, 0xbf, 0x00}}, + {2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}}, + {2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}}, + {2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x85, 0x00}}, + {2, [3]byte{0xd1, 0x86, 0x00}}, {2, [3]byte{0xd1, 0x87, 0x00}}, + {2, [3]byte{0xd1, 0x88, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}}, + {2, [3]byte{0xd1, 0x8a, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}}, + {2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x8d, 0x00}}, + {2, [3]byte{0xd1, 0x8e, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa40000a4, 0xa60000a6, 0xa70000a7, 0xa90000a9, 0xab0000ab, 0xac0000ac, 0xad0000ad, + 0xae0000ae, 0xb00000b0, 0xb10000b1, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xbb0000bb, 0xa8000401, + 0x80000402, 0x81000403, 0xaa000404, 0xbd000405, 0xb2000406, 0xaf000407, 0xa3000408, 0x8a000409, + 0x8c00040a, 0x8e00040b, 0x8d00040c, 0xa100040e, 0x8f00040f, 0xc0000410, 0xc1000411, 0xc2000412, + 0xc3000413, 0xc4000414, 0xc5000415, 0xc6000416, 0xc7000417, 0xc8000418, 0xc9000419, 0xca00041a, + 0xcb00041b, 0xcc00041c, 0xcd00041d, 0xce00041e, 0xcf00041f, 0xd0000420, 0xd1000421, 0xd2000422, + 0xd3000423, 0xd4000424, 0xd5000425, 0xd6000426, 0xd7000427, 0xd8000428, 0xd9000429, 0xda00042a, + 0xdb00042b, 0xdc00042c, 0xdd00042d, 0xde00042e, 0xdf00042f, 0xe0000430, 0xe1000431, 0xe2000432, + 0xe3000433, 0xe4000434, 0xe5000435, 0xe6000436, 0xe7000437, 0xe8000438, 0xe9000439, 0xea00043a, + 0xeb00043b, 0xec00043c, 0xed00043d, 0xee00043e, 0xef00043f, 0xf0000440, 0xf1000441, 0xf2000442, + 0xf3000443, 0xf4000444, 0xf5000445, 0xf6000446, 0xf7000447, 0xf8000448, 0xf9000449, 0xfa00044a, + 0xfb00044b, 0xfc00044c, 0xfd00044d, 0xfe00044e, 0xff00044f, 0xb8000451, 0x90000452, 0x83000453, + 0xba000454, 0xbe000455, 0xb3000456, 0xbf000457, 0xbc000458, 0x9a000459, 0x9c00045a, 0x9e00045b, + 0x9d00045c, 0xa200045e, 0x9f00045f, 0xa5000490, 0xb4000491, 0x96002013, 0x97002014, 0x91002018, + 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022, + 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0x880020ac, 0xb9002116, 0x99002122, 0x99002122, + }, +} + +// Windows1252 is the Windows 1252 encoding. +var Windows1252 encoding.Encoding = &windows1252 + +var windows1252 = charmap{ + name: "Windows 1252", + mib: identifier.Windows1252, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}}, + {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, + {3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, + {2, [3]byte{0xcb, 0x86, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, + {2, [3]byte{0xc5, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, + {2, [3]byte{0xc5, 0x92, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc5, 0xbd, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}}, + {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, + {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, + {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, + {2, [3]byte{0xcb, 0x9c, 0x00}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, + {2, [3]byte{0xc5, 0xa1, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xba}}, + {2, [3]byte{0xc5, 0x93, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0xb8, 0x00}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, + {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, + {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, + {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, + {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, + {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, + {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, + {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, + {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, + {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, + {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, + {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, + {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, + {2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, + {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, + {2, [3]byte{0xc3, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, + {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, + {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, + {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, + {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, + {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}}, + {2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, + {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, + {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, + {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, + {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, + {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, + {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, + {2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, + {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, + {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, + {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, + {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, + {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}}, + {2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7, + 0xa80000a8, 0xa90000a9, 0xaa0000aa, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, + 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, + 0xb80000b8, 0xb90000b9, 0xba0000ba, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xbf0000bf, + 0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7, + 0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, + 0xd00000d0, 0xd10000d1, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd70000d7, + 0xd80000d8, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdd0000dd, 0xde0000de, 0xdf0000df, + 0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe30000e3, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7, + 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef, + 0xf00000f0, 0xf10000f1, 0xf20000f2, 0xf30000f3, 0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf70000f7, + 0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xfd0000fd, 0xfe0000fe, 0xff0000ff, + 0x8c000152, 0x9c000153, 0x8a000160, 0x9a000161, 0x9f000178, 0x8e00017d, 0x9e00017e, 0x83000192, + 0x880002c6, 0x980002dc, 0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c, + 0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039, + 0x9b00203a, 0x800020ac, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, + }, +} + +// Windows1253 is the Windows 1253 encoding. +var Windows1253 encoding.Encoding = &windows1253 + +var windows1253 = charmap{ + name: "Windows 1253", + mib: identifier.Windows1253, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}}, + {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, + {3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}}, + {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, + {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, + {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xba}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xce, 0x85, 0x00}}, + {2, [3]byte{0xce, 0x86, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, + {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, + {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xab, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xc2, 0xae, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x95}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, + {2, [3]byte{0xce, 0x84, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, + {2, [3]byte{0xce, 0x88, 0x00}}, {2, [3]byte{0xce, 0x89, 0x00}}, + {2, [3]byte{0xce, 0x8a, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {2, [3]byte{0xce, 0x8c, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, + {2, [3]byte{0xce, 0x8e, 0x00}}, {2, [3]byte{0xce, 0x8f, 0x00}}, + {2, [3]byte{0xce, 0x90, 0x00}}, {2, [3]byte{0xce, 0x91, 0x00}}, + {2, [3]byte{0xce, 0x92, 0x00}}, {2, [3]byte{0xce, 0x93, 0x00}}, + {2, [3]byte{0xce, 0x94, 0x00}}, {2, [3]byte{0xce, 0x95, 0x00}}, + {2, [3]byte{0xce, 0x96, 0x00}}, {2, [3]byte{0xce, 0x97, 0x00}}, + {2, [3]byte{0xce, 0x98, 0x00}}, {2, [3]byte{0xce, 0x99, 0x00}}, + {2, [3]byte{0xce, 0x9a, 0x00}}, {2, [3]byte{0xce, 0x9b, 0x00}}, + {2, [3]byte{0xce, 0x9c, 0x00}}, {2, [3]byte{0xce, 0x9d, 0x00}}, + {2, [3]byte{0xce, 0x9e, 0x00}}, {2, [3]byte{0xce, 0x9f, 0x00}}, + {2, [3]byte{0xce, 0xa0, 0x00}}, {2, [3]byte{0xce, 0xa1, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xce, 0xa3, 0x00}}, + {2, [3]byte{0xce, 0xa4, 0x00}}, {2, [3]byte{0xce, 0xa5, 0x00}}, + {2, [3]byte{0xce, 0xa6, 0x00}}, {2, [3]byte{0xce, 0xa7, 0x00}}, + {2, [3]byte{0xce, 0xa8, 0x00}}, {2, [3]byte{0xce, 0xa9, 0x00}}, + {2, [3]byte{0xce, 0xaa, 0x00}}, {2, [3]byte{0xce, 0xab, 0x00}}, + {2, [3]byte{0xce, 0xac, 0x00}}, {2, [3]byte{0xce, 0xad, 0x00}}, + {2, [3]byte{0xce, 0xae, 0x00}}, {2, [3]byte{0xce, 0xaf, 0x00}}, + {2, [3]byte{0xce, 0xb0, 0x00}}, {2, [3]byte{0xce, 0xb1, 0x00}}, + {2, [3]byte{0xce, 0xb2, 0x00}}, {2, [3]byte{0xce, 0xb3, 0x00}}, + {2, [3]byte{0xce, 0xb4, 0x00}}, {2, [3]byte{0xce, 0xb5, 0x00}}, + {2, [3]byte{0xce, 0xb6, 0x00}}, {2, [3]byte{0xce, 0xb7, 0x00}}, + {2, [3]byte{0xce, 0xb8, 0x00}}, {2, [3]byte{0xce, 0xb9, 0x00}}, + {2, [3]byte{0xce, 0xba, 0x00}}, {2, [3]byte{0xce, 0xbb, 0x00}}, + {2, [3]byte{0xce, 0xbc, 0x00}}, {2, [3]byte{0xce, 0xbd, 0x00}}, + {2, [3]byte{0xce, 0xbe, 0x00}}, {2, [3]byte{0xce, 0xbf, 0x00}}, + {2, [3]byte{0xcf, 0x80, 0x00}}, {2, [3]byte{0xcf, 0x81, 0x00}}, + {2, [3]byte{0xcf, 0x82, 0x00}}, {2, [3]byte{0xcf, 0x83, 0x00}}, + {2, [3]byte{0xcf, 0x84, 0x00}}, {2, [3]byte{0xcf, 0x85, 0x00}}, + {2, [3]byte{0xcf, 0x86, 0x00}}, {2, [3]byte{0xcf, 0x87, 0x00}}, + {2, [3]byte{0xcf, 0x88, 0x00}}, {2, [3]byte{0xcf, 0x89, 0x00}}, + {2, [3]byte{0xcf, 0x8a, 0x00}}, {2, [3]byte{0xcf, 0x8b, 0x00}}, + {2, [3]byte{0xcf, 0x8c, 0x00}}, {2, [3]byte{0xcf, 0x8d, 0x00}}, + {2, [3]byte{0xcf, 0x8e, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7, 0xa80000a8, 0xa90000a9, + 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, + 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xbb0000bb, 0xbd0000bd, 0x83000192, 0xb4000384, 0xa1000385, + 0xa2000386, 0xb8000388, 0xb9000389, 0xba00038a, 0xbc00038c, 0xbe00038e, 0xbf00038f, 0xc0000390, + 0xc1000391, 0xc2000392, 0xc3000393, 0xc4000394, 0xc5000395, 0xc6000396, 0xc7000397, 0xc8000398, + 0xc9000399, 0xca00039a, 0xcb00039b, 0xcc00039c, 0xcd00039d, 0xce00039e, 0xcf00039f, 0xd00003a0, + 0xd10003a1, 0xd30003a3, 0xd40003a4, 0xd50003a5, 0xd60003a6, 0xd70003a7, 0xd80003a8, 0xd90003a9, + 0xda0003aa, 0xdb0003ab, 0xdc0003ac, 0xdd0003ad, 0xde0003ae, 0xdf0003af, 0xe00003b0, 0xe10003b1, + 0xe20003b2, 0xe30003b3, 0xe40003b4, 0xe50003b5, 0xe60003b6, 0xe70003b7, 0xe80003b8, 0xe90003b9, + 0xea0003ba, 0xeb0003bb, 0xec0003bc, 0xed0003bd, 0xee0003be, 0xef0003bf, 0xf00003c0, 0xf10003c1, + 0xf20003c2, 0xf30003c3, 0xf40003c4, 0xf50003c5, 0xf60003c6, 0xf70003c7, 0xf80003c8, 0xf90003c9, + 0xfa0003ca, 0xfb0003cb, 0xfc0003cc, 0xfd0003cd, 0xfe0003ce, 0x96002013, 0x97002014, 0xaf002015, + 0x91002018, 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, 0x87002021, + 0x95002022, 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0x800020ac, 0x99002122, 0x99002122, + 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, + 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, + }, +} + +// Windows1254 is the Windows 1254 encoding. +var Windows1254 encoding.Encoding = &windows1254 + +var windows1254 = charmap{ + name: "Windows 1254", + mib: identifier.Windows1254, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}}, + {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, + {3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, + {2, [3]byte{0xcb, 0x86, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, + {2, [3]byte{0xc5, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, + {2, [3]byte{0xc5, 0x92, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}}, + {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, + {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, + {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, + {2, [3]byte{0xcb, 0x9c, 0x00}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, + {2, [3]byte{0xc5, 0xa1, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xba}}, + {2, [3]byte{0xc5, 0x93, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc5, 0xb8, 0x00}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, + {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, + {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, + {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, + {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, + {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, + {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, + {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, + {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, + {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, + {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, + {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, + {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, + {2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, + {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, + {2, [3]byte{0xc4, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, + {2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, + {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, + {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, + {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, + {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc4, 0xb0, 0x00}}, + {2, [3]byte{0xc5, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, + {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, + {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, + {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, + {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, + {2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, + {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, + {2, [3]byte{0xc4, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, + {2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, + {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, + {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, + {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, + {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc4, 0xb1, 0x00}}, + {2, [3]byte{0xc5, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7, + 0xa80000a8, 0xa90000a9, 0xaa0000aa, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, + 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, + 0xb80000b8, 0xb90000b9, 0xba0000ba, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xbf0000bf, + 0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7, + 0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, + 0xd10000d1, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd70000d7, 0xd80000d8, + 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdf0000df, 0xe00000e0, 0xe10000e1, 0xe20000e2, + 0xe30000e3, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7, 0xe80000e8, 0xe90000e9, 0xea0000ea, + 0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf10000f1, 0xf20000f2, 0xf30000f3, + 0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf70000f7, 0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, + 0xfc0000fc, 0xff0000ff, 0xd000011e, 0xf000011f, 0xdd000130, 0xfd000131, 0x8c000152, 0x9c000153, + 0xde00015e, 0xfe00015f, 0x8a000160, 0x9a000161, 0x9f000178, 0x83000192, 0x880002c6, 0x980002dc, + 0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, + 0x86002020, 0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0x800020ac, + 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, + }, +} + +// Windows1255 is the Windows 1255 encoding. +var Windows1255 encoding.Encoding = &windows1255 + +var windows1255 = charmap{ + name: "Windows 1255", + mib: identifier.Windows1255, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}}, + {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, + {3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, + {2, [3]byte{0xcb, 0x86, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}}, + {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, + {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, + {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, + {2, [3]byte{0xcb, 0x9c, 0x00}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xba}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, + {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, + {3, [3]byte{0xe2, 0x82, 0xaa}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, + {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, + {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, + {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, + {2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, + {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, + {2, [3]byte{0xd6, 0xb0, 0x00}}, {2, [3]byte{0xd6, 0xb1, 0x00}}, + {2, [3]byte{0xd6, 0xb2, 0x00}}, {2, [3]byte{0xd6, 0xb3, 0x00}}, + {2, [3]byte{0xd6, 0xb4, 0x00}}, {2, [3]byte{0xd6, 0xb5, 0x00}}, + {2, [3]byte{0xd6, 0xb6, 0x00}}, {2, [3]byte{0xd6, 0xb7, 0x00}}, + {2, [3]byte{0xd6, 0xb8, 0x00}}, {2, [3]byte{0xd6, 0xb9, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xd6, 0xbb, 0x00}}, + {2, [3]byte{0xd6, 0xbc, 0x00}}, {2, [3]byte{0xd6, 0xbd, 0x00}}, + {2, [3]byte{0xd6, 0xbe, 0x00}}, {2, [3]byte{0xd6, 0xbf, 0x00}}, + {2, [3]byte{0xd7, 0x80, 0x00}}, {2, [3]byte{0xd7, 0x81, 0x00}}, + {2, [3]byte{0xd7, 0x82, 0x00}}, {2, [3]byte{0xd7, 0x83, 0x00}}, + {2, [3]byte{0xd7, 0xb0, 0x00}}, {2, [3]byte{0xd7, 0xb1, 0x00}}, + {2, [3]byte{0xd7, 0xb2, 0x00}}, {2, [3]byte{0xd7, 0xb3, 0x00}}, + {2, [3]byte{0xd7, 0xb4, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xd7, 0x90, 0x00}}, {2, [3]byte{0xd7, 0x91, 0x00}}, + {2, [3]byte{0xd7, 0x92, 0x00}}, {2, [3]byte{0xd7, 0x93, 0x00}}, + {2, [3]byte{0xd7, 0x94, 0x00}}, {2, [3]byte{0xd7, 0x95, 0x00}}, + {2, [3]byte{0xd7, 0x96, 0x00}}, {2, [3]byte{0xd7, 0x97, 0x00}}, + {2, [3]byte{0xd7, 0x98, 0x00}}, {2, [3]byte{0xd7, 0x99, 0x00}}, + {2, [3]byte{0xd7, 0x9a, 0x00}}, {2, [3]byte{0xd7, 0x9b, 0x00}}, + {2, [3]byte{0xd7, 0x9c, 0x00}}, {2, [3]byte{0xd7, 0x9d, 0x00}}, + {2, [3]byte{0xd7, 0x9e, 0x00}}, {2, [3]byte{0xd7, 0x9f, 0x00}}, + {2, [3]byte{0xd7, 0xa0, 0x00}}, {2, [3]byte{0xd7, 0xa1, 0x00}}, + {2, [3]byte{0xd7, 0xa2, 0x00}}, {2, [3]byte{0xd7, 0xa3, 0x00}}, + {2, [3]byte{0xd7, 0xa4, 0x00}}, {2, [3]byte{0xd7, 0xa5, 0x00}}, + {2, [3]byte{0xd7, 0xa6, 0x00}}, {2, [3]byte{0xd7, 0xa7, 0x00}}, + {2, [3]byte{0xd7, 0xa8, 0x00}}, {2, [3]byte{0xd7, 0xa9, 0x00}}, + {2, [3]byte{0xd7, 0xaa, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x8e}}, + {3, [3]byte{0xe2, 0x80, 0x8f}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa50000a5, 0xa60000a6, 0xa70000a7, 0xa80000a8, + 0xa90000a9, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, 0xb00000b0, 0xb10000b1, + 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb80000b8, 0xb90000b9, + 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xbf0000bf, 0xaa0000d7, 0xba0000f7, 0x83000192, + 0x880002c6, 0x980002dc, 0xc00005b0, 0xc10005b1, 0xc20005b2, 0xc30005b3, 0xc40005b4, 0xc50005b5, + 0xc60005b6, 0xc70005b7, 0xc80005b8, 0xc90005b9, 0xcb0005bb, 0xcc0005bc, 0xcd0005bd, 0xce0005be, + 0xcf0005bf, 0xd00005c0, 0xd10005c1, 0xd20005c2, 0xd30005c3, 0xe00005d0, 0xe10005d1, 0xe20005d2, + 0xe30005d3, 0xe40005d4, 0xe50005d5, 0xe60005d6, 0xe70005d7, 0xe80005d8, 0xe90005d9, 0xea0005da, + 0xeb0005db, 0xec0005dc, 0xed0005dd, 0xee0005de, 0xef0005df, 0xf00005e0, 0xf10005e1, 0xf20005e2, + 0xf30005e3, 0xf40005e4, 0xf50005e5, 0xf60005e6, 0xf70005e7, 0xf80005e8, 0xf90005e9, 0xfa0005ea, + 0xd40005f0, 0xd50005f1, 0xd60005f2, 0xd70005f3, 0xd80005f4, 0xfd00200e, 0xfe00200f, 0x96002013, + 0x97002014, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, + 0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0xa40020aa, 0x800020ac, + 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, + 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, + 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, + }, +} + +// Windows1256 is the Windows 1256 encoding. +var Windows1256 encoding.Encoding = &windows1256 + +var windows1256 = charmap{ + name: "Windows 1256", + mib: identifier.Windows1256, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xe2, 0x82, 0xac}}, {2, [3]byte{0xd9, 0xbe, 0x00}}, + {3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}}, + {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, + {3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, + {2, [3]byte{0xcb, 0x86, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, + {2, [3]byte{0xd9, 0xb9, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, + {2, [3]byte{0xc5, 0x92, 0x00}}, {2, [3]byte{0xda, 0x86, 0x00}}, + {2, [3]byte{0xda, 0x98, 0x00}}, {2, [3]byte{0xda, 0x88, 0x00}}, + {2, [3]byte{0xda, 0xaf, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x98}}, + {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, + {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, + {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, + {2, [3]byte{0xda, 0xa9, 0x00}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, + {2, [3]byte{0xda, 0x91, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xba}}, + {2, [3]byte{0xc5, 0x93, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x8c}}, + {3, [3]byte{0xe2, 0x80, 0x8d}}, {2, [3]byte{0xda, 0xba, 0x00}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xd8, 0x8c, 0x00}}, + {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, + {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, + {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {2, [3]byte{0xda, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, + {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, + {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, + {2, [3]byte{0xd8, 0x9b, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, + {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xd8, 0x9f, 0x00}}, + {2, [3]byte{0xdb, 0x81, 0x00}}, {2, [3]byte{0xd8, 0xa1, 0x00}}, + {2, [3]byte{0xd8, 0xa2, 0x00}}, {2, [3]byte{0xd8, 0xa3, 0x00}}, + {2, [3]byte{0xd8, 0xa4, 0x00}}, {2, [3]byte{0xd8, 0xa5, 0x00}}, + {2, [3]byte{0xd8, 0xa6, 0x00}}, {2, [3]byte{0xd8, 0xa7, 0x00}}, + {2, [3]byte{0xd8, 0xa8, 0x00}}, {2, [3]byte{0xd8, 0xa9, 0x00}}, + {2, [3]byte{0xd8, 0xaa, 0x00}}, {2, [3]byte{0xd8, 0xab, 0x00}}, + {2, [3]byte{0xd8, 0xac, 0x00}}, {2, [3]byte{0xd8, 0xad, 0x00}}, + {2, [3]byte{0xd8, 0xae, 0x00}}, {2, [3]byte{0xd8, 0xaf, 0x00}}, + {2, [3]byte{0xd8, 0xb0, 0x00}}, {2, [3]byte{0xd8, 0xb1, 0x00}}, + {2, [3]byte{0xd8, 0xb2, 0x00}}, {2, [3]byte{0xd8, 0xb3, 0x00}}, + {2, [3]byte{0xd8, 0xb4, 0x00}}, {2, [3]byte{0xd8, 0xb5, 0x00}}, + {2, [3]byte{0xd8, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, + {2, [3]byte{0xd8, 0xb7, 0x00}}, {2, [3]byte{0xd8, 0xb8, 0x00}}, + {2, [3]byte{0xd8, 0xb9, 0x00}}, {2, [3]byte{0xd8, 0xba, 0x00}}, + {2, [3]byte{0xd9, 0x80, 0x00}}, {2, [3]byte{0xd9, 0x81, 0x00}}, + {2, [3]byte{0xd9, 0x82, 0x00}}, {2, [3]byte{0xd9, 0x83, 0x00}}, + {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xd9, 0x84, 0x00}}, + {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xd9, 0x85, 0x00}}, + {2, [3]byte{0xd9, 0x86, 0x00}}, {2, [3]byte{0xd9, 0x87, 0x00}}, + {2, [3]byte{0xd9, 0x88, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, + {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, + {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, + {2, [3]byte{0xd9, 0x89, 0x00}}, {2, [3]byte{0xd9, 0x8a, 0x00}}, + {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, + {2, [3]byte{0xd9, 0x8b, 0x00}}, {2, [3]byte{0xd9, 0x8c, 0x00}}, + {2, [3]byte{0xd9, 0x8d, 0x00}}, {2, [3]byte{0xd9, 0x8e, 0x00}}, + {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xd9, 0x8f, 0x00}}, + {2, [3]byte{0xd9, 0x90, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, + {2, [3]byte{0xd9, 0x91, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, + {2, [3]byte{0xd9, 0x92, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, + {2, [3]byte{0xc3, 0xbc, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x8e}}, + {3, [3]byte{0xe2, 0x80, 0x8f}}, {2, [3]byte{0xdb, 0x92, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7, 0xa80000a8, + 0xa90000a9, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, 0xb00000b0, 0xb10000b1, + 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb80000b8, 0xb90000b9, + 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xd70000d7, 0xe00000e0, 0xe20000e2, 0xe70000e7, + 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xee0000ee, 0xef0000ef, 0xf40000f4, 0xf70000f7, + 0xf90000f9, 0xfb0000fb, 0xfc0000fc, 0x8c000152, 0x9c000153, 0x83000192, 0x880002c6, 0xa100060c, + 0xba00061b, 0xbf00061f, 0xc1000621, 0xc2000622, 0xc3000623, 0xc4000624, 0xc5000625, 0xc6000626, + 0xc7000627, 0xc8000628, 0xc9000629, 0xca00062a, 0xcb00062b, 0xcc00062c, 0xcd00062d, 0xce00062e, + 0xcf00062f, 0xd0000630, 0xd1000631, 0xd2000632, 0xd3000633, 0xd4000634, 0xd5000635, 0xd6000636, + 0xd8000637, 0xd9000638, 0xda000639, 0xdb00063a, 0xdc000640, 0xdd000641, 0xde000642, 0xdf000643, + 0xe1000644, 0xe3000645, 0xe4000646, 0xe5000647, 0xe6000648, 0xec000649, 0xed00064a, 0xf000064b, + 0xf100064c, 0xf200064d, 0xf300064e, 0xf500064f, 0xf6000650, 0xf8000651, 0xfa000652, 0x8a000679, + 0x8100067e, 0x8d000686, 0x8f000688, 0x9a000691, 0x8e000698, 0x980006a9, 0x900006af, 0x9f0006ba, + 0xaa0006be, 0xc00006c1, 0xff0006d2, 0x9d00200c, 0x9e00200d, 0xfd00200e, 0xfe00200f, 0x96002013, + 0x97002014, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, + 0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0x800020ac, 0x99002122, + }, +} + +// Windows1257 is the Windows 1257 encoding. +var Windows1257 encoding.Encoding = &windows1257 + +var windows1257 = charmap{ + name: "Windows 1257", + mib: identifier.Windows1257, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xe2, 0x80, 0x9a}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, + {3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa8, 0x00}}, + {2, [3]byte{0xcb, 0x87, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}}, + {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, + {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, + {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xba}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, + {2, [3]byte{0xcb, 0x9b, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, + {2, [3]byte{0xc2, 0xa4, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {2, [3]byte{0xc5, 0x96, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, + {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, + {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, + {2, [3]byte{0xc5, 0x97, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, + {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}}, + {2, [3]byte{0xc4, 0x84, 0x00}}, {2, [3]byte{0xc4, 0xae, 0x00}}, + {2, [3]byte{0xc4, 0x80, 0x00}}, {2, [3]byte{0xc4, 0x86, 0x00}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, + {2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc4, 0x92, 0x00}}, + {2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, + {2, [3]byte{0xc5, 0xb9, 0x00}}, {2, [3]byte{0xc4, 0x96, 0x00}}, + {2, [3]byte{0xc4, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0xb6, 0x00}}, + {2, [3]byte{0xc4, 0xaa, 0x00}}, {2, [3]byte{0xc4, 0xbb, 0x00}}, + {2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc5, 0x83, 0x00}}, + {2, [3]byte{0xc5, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, + {2, [3]byte{0xc5, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}}, + {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, + {2, [3]byte{0xc5, 0xb2, 0x00}}, {2, [3]byte{0xc5, 0x81, 0x00}}, + {2, [3]byte{0xc5, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0xaa, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc5, 0xbb, 0x00}}, + {2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xc4, 0x85, 0x00}}, {2, [3]byte{0xc4, 0xaf, 0x00}}, + {2, [3]byte{0xc4, 0x81, 0x00}}, {2, [3]byte{0xc4, 0x87, 0x00}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, + {2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc4, 0x93, 0x00}}, + {2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, + {2, [3]byte{0xc5, 0xba, 0x00}}, {2, [3]byte{0xc4, 0x97, 0x00}}, + {2, [3]byte{0xc4, 0xa3, 0x00}}, {2, [3]byte{0xc4, 0xb7, 0x00}}, + {2, [3]byte{0xc4, 0xab, 0x00}}, {2, [3]byte{0xc4, 0xbc, 0x00}}, + {2, [3]byte{0xc5, 0xa1, 0x00}}, {2, [3]byte{0xc5, 0x84, 0x00}}, + {2, [3]byte{0xc5, 0x86, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, + {2, [3]byte{0xc5, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, + {2, [3]byte{0xc5, 0xb3, 0x00}}, {2, [3]byte{0xc5, 0x82, 0x00}}, + {2, [3]byte{0xc5, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0xab, 0x00}}, + {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc5, 0xbc, 0x00}}, + {2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xcb, 0x99, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa60000a6, 0xa70000a7, 0x8d0000a8, 0xa90000a9, + 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0x9d0000af, 0xb00000b0, 0xb10000b1, 0xb20000b2, + 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0x8f0000b8, 0xb90000b9, 0xbb0000bb, + 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xc40000c4, 0xc50000c5, 0xaf0000c6, 0xc90000c9, 0xd30000d3, + 0xd50000d5, 0xd60000d6, 0xd70000d7, 0xa80000d8, 0xdc0000dc, 0xdf0000df, 0xe40000e4, 0xe50000e5, + 0xbf0000e6, 0xe90000e9, 0xf30000f3, 0xf50000f5, 0xf60000f6, 0xf70000f7, 0xb80000f8, 0xfc0000fc, + 0xc2000100, 0xe2000101, 0xc0000104, 0xe0000105, 0xc3000106, 0xe3000107, 0xc800010c, 0xe800010d, + 0xc7000112, 0xe7000113, 0xcb000116, 0xeb000117, 0xc6000118, 0xe6000119, 0xcc000122, 0xec000123, + 0xce00012a, 0xee00012b, 0xc100012e, 0xe100012f, 0xcd000136, 0xed000137, 0xcf00013b, 0xef00013c, + 0xd9000141, 0xf9000142, 0xd1000143, 0xf1000144, 0xd2000145, 0xf2000146, 0xd400014c, 0xf400014d, + 0xaa000156, 0xba000157, 0xda00015a, 0xfa00015b, 0xd0000160, 0xf0000161, 0xdb00016a, 0xfb00016b, + 0xd8000172, 0xf8000173, 0xca000179, 0xea00017a, 0xdd00017b, 0xfd00017c, 0xde00017d, 0xfe00017e, + 0x8e0002c7, 0xff0002d9, 0x9e0002db, 0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x8200201a, + 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022, 0x85002026, 0x89002030, + 0x8b002039, 0x9b00203a, 0x800020ac, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, + 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, + }, +} + +// Windows1258 is the Windows 1258 encoding. +var Windows1258 encoding.Encoding = &windows1258 + +var windows1258 = charmap{ + name: "Windows 1258", + mib: identifier.Windows1258, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}}, + {3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}}, + {3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}}, + {2, [3]byte{0xcb, 0x86, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb0}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb9}}, + {2, [3]byte{0xc5, 0x92, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}}, + {3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}}, + {3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}}, + {3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}}, + {2, [3]byte{0xcb, 0x9c, 0x00}}, {3, [3]byte{0xe2, 0x84, 0xa2}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xba}}, + {2, [3]byte{0xc5, 0x93, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}}, + {3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc5, 0xb8, 0x00}}, + {2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}}, + {2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}}, + {2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}}, + {2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}}, + {2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}}, + {2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}}, + {2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}}, + {2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}}, + {2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}}, + {2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}}, + {2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}}, + {2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}}, + {2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}}, + {2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}}, + {2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}}, + {2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}}, + {2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}}, + {2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc4, 0x82, 0x00}}, + {2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}}, + {2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}}, + {2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}}, + {2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}}, + {2, [3]byte{0xcc, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}}, + {2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}}, + {2, [3]byte{0xc4, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}}, + {2, [3]byte{0xcc, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}}, + {2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc6, 0xa0, 0x00}}, + {2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}}, + {2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}}, + {2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}}, + {2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc6, 0xaf, 0x00}}, + {2, [3]byte{0xcc, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}}, + {2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}}, + {2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0x83, 0x00}}, + {2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}}, + {2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}}, + {2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}}, + {2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}}, + {2, [3]byte{0xcc, 0x81, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}}, + {2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}}, + {2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}}, + {2, [3]byte{0xcc, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}}, + {2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc6, 0xa1, 0x00}}, + {2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}}, + {2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}}, + {2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}}, + {2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc6, 0xb0, 0x00}}, + {3, [3]byte{0xe2, 0x82, 0xab}}, {2, [3]byte{0xc3, 0xbf, 0x00}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7, + 0xa80000a8, 0xa90000a9, 0xaa0000aa, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, + 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, + 0xb80000b8, 0xb90000b9, 0xba0000ba, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xbf0000bf, + 0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7, 0xc80000c8, + 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, 0xd10000d1, 0xd30000d3, + 0xd40000d4, 0xd60000d6, 0xd70000d7, 0xd80000d8, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, + 0xdf0000df, 0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7, + 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf10000f1, + 0xf30000f3, 0xf40000f4, 0xf60000f6, 0xf70000f7, 0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, + 0xfc0000fc, 0xff0000ff, 0xc3000102, 0xe3000103, 0xd0000110, 0xf0000111, 0x8c000152, 0x9c000153, + 0x9f000178, 0x83000192, 0xd50001a0, 0xf50001a1, 0xdd0001af, 0xfd0001b0, 0x880002c6, 0x980002dc, + 0xcc000300, 0xec000301, 0xde000303, 0xd2000309, 0xf2000323, 0x96002013, 0x97002014, 0x91002018, + 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022, + 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0xfe0020ab, 0x800020ac, 0x99002122, 0x99002122, + 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, + }, +} + +// XUserDefined is the X-User-Defined encoding. +// +// It is defined at http://encoding.spec.whatwg.org/#x-user-defined +var XUserDefined encoding.Encoding = &xUserDefined + +var xUserDefined = charmap{ + name: "X-User-Defined", + mib: identifier.XUserDefined, + asciiSuperset: true, + low: 0x80, + replacement: 0x1a, + decode: [256]utf8Enc{ + {1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}}, + {1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}}, + {1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}}, + {1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}}, + {1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}}, + {1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}}, + {1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}}, + {1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}}, + {1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}}, + {1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}}, + {1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}}, + {1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}}, + {1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}}, + {1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}}, + {1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}}, + {1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}}, + {1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}}, + {1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}}, + {1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}}, + {1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}}, + {1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}}, + {1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}}, + {1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}}, + {1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}}, + {1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}}, + {1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}}, + {1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}}, + {1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}}, + {1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}}, + {1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}}, + {1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}}, + {1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}}, + {1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}}, + {1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}}, + {1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}}, + {1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}}, + {1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}}, + {1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}}, + {1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}}, + {1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}}, + {1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}}, + {1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}}, + {1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}}, + {1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}}, + {1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}}, + {1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}}, + {1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}}, + {1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}}, + {1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}}, + {1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}}, + {1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}}, + {1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}}, + {1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}}, + {1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}}, + {1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}}, + {1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}}, + {1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}}, + {1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}}, + {1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}}, + {1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}}, + {1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}}, + {1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}}, + {1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}}, + {1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}}, + {3, [3]byte{0xef, 0x9e, 0x80}}, {3, [3]byte{0xef, 0x9e, 0x81}}, + {3, [3]byte{0xef, 0x9e, 0x82}}, {3, [3]byte{0xef, 0x9e, 0x83}}, + {3, [3]byte{0xef, 0x9e, 0x84}}, {3, [3]byte{0xef, 0x9e, 0x85}}, + {3, [3]byte{0xef, 0x9e, 0x86}}, {3, [3]byte{0xef, 0x9e, 0x87}}, + {3, [3]byte{0xef, 0x9e, 0x88}}, {3, [3]byte{0xef, 0x9e, 0x89}}, + {3, [3]byte{0xef, 0x9e, 0x8a}}, {3, [3]byte{0xef, 0x9e, 0x8b}}, + {3, [3]byte{0xef, 0x9e, 0x8c}}, {3, [3]byte{0xef, 0x9e, 0x8d}}, + {3, [3]byte{0xef, 0x9e, 0x8e}}, {3, [3]byte{0xef, 0x9e, 0x8f}}, + {3, [3]byte{0xef, 0x9e, 0x90}}, {3, [3]byte{0xef, 0x9e, 0x91}}, + {3, [3]byte{0xef, 0x9e, 0x92}}, {3, [3]byte{0xef, 0x9e, 0x93}}, + {3, [3]byte{0xef, 0x9e, 0x94}}, {3, [3]byte{0xef, 0x9e, 0x95}}, + {3, [3]byte{0xef, 0x9e, 0x96}}, {3, [3]byte{0xef, 0x9e, 0x97}}, + {3, [3]byte{0xef, 0x9e, 0x98}}, {3, [3]byte{0xef, 0x9e, 0x99}}, + {3, [3]byte{0xef, 0x9e, 0x9a}}, {3, [3]byte{0xef, 0x9e, 0x9b}}, + {3, [3]byte{0xef, 0x9e, 0x9c}}, {3, [3]byte{0xef, 0x9e, 0x9d}}, + {3, [3]byte{0xef, 0x9e, 0x9e}}, {3, [3]byte{0xef, 0x9e, 0x9f}}, + {3, [3]byte{0xef, 0x9e, 0xa0}}, {3, [3]byte{0xef, 0x9e, 0xa1}}, + {3, [3]byte{0xef, 0x9e, 0xa2}}, {3, [3]byte{0xef, 0x9e, 0xa3}}, + {3, [3]byte{0xef, 0x9e, 0xa4}}, {3, [3]byte{0xef, 0x9e, 0xa5}}, + {3, [3]byte{0xef, 0x9e, 0xa6}}, {3, [3]byte{0xef, 0x9e, 0xa7}}, + {3, [3]byte{0xef, 0x9e, 0xa8}}, {3, [3]byte{0xef, 0x9e, 0xa9}}, + {3, [3]byte{0xef, 0x9e, 0xaa}}, {3, [3]byte{0xef, 0x9e, 0xab}}, + {3, [3]byte{0xef, 0x9e, 0xac}}, {3, [3]byte{0xef, 0x9e, 0xad}}, + {3, [3]byte{0xef, 0x9e, 0xae}}, {3, [3]byte{0xef, 0x9e, 0xaf}}, + {3, [3]byte{0xef, 0x9e, 0xb0}}, {3, [3]byte{0xef, 0x9e, 0xb1}}, + {3, [3]byte{0xef, 0x9e, 0xb2}}, {3, [3]byte{0xef, 0x9e, 0xb3}}, + {3, [3]byte{0xef, 0x9e, 0xb4}}, {3, [3]byte{0xef, 0x9e, 0xb5}}, + {3, [3]byte{0xef, 0x9e, 0xb6}}, {3, [3]byte{0xef, 0x9e, 0xb7}}, + {3, [3]byte{0xef, 0x9e, 0xb8}}, {3, [3]byte{0xef, 0x9e, 0xb9}}, + {3, [3]byte{0xef, 0x9e, 0xba}}, {3, [3]byte{0xef, 0x9e, 0xbb}}, + {3, [3]byte{0xef, 0x9e, 0xbc}}, {3, [3]byte{0xef, 0x9e, 0xbd}}, + {3, [3]byte{0xef, 0x9e, 0xbe}}, {3, [3]byte{0xef, 0x9e, 0xbf}}, + {3, [3]byte{0xef, 0x9f, 0x80}}, {3, [3]byte{0xef, 0x9f, 0x81}}, + {3, [3]byte{0xef, 0x9f, 0x82}}, {3, [3]byte{0xef, 0x9f, 0x83}}, + {3, [3]byte{0xef, 0x9f, 0x84}}, {3, [3]byte{0xef, 0x9f, 0x85}}, + {3, [3]byte{0xef, 0x9f, 0x86}}, {3, [3]byte{0xef, 0x9f, 0x87}}, + {3, [3]byte{0xef, 0x9f, 0x88}}, {3, [3]byte{0xef, 0x9f, 0x89}}, + {3, [3]byte{0xef, 0x9f, 0x8a}}, {3, [3]byte{0xef, 0x9f, 0x8b}}, + {3, [3]byte{0xef, 0x9f, 0x8c}}, {3, [3]byte{0xef, 0x9f, 0x8d}}, + {3, [3]byte{0xef, 0x9f, 0x8e}}, {3, [3]byte{0xef, 0x9f, 0x8f}}, + {3, [3]byte{0xef, 0x9f, 0x90}}, {3, [3]byte{0xef, 0x9f, 0x91}}, + {3, [3]byte{0xef, 0x9f, 0x92}}, {3, [3]byte{0xef, 0x9f, 0x93}}, + {3, [3]byte{0xef, 0x9f, 0x94}}, {3, [3]byte{0xef, 0x9f, 0x95}}, + {3, [3]byte{0xef, 0x9f, 0x96}}, {3, [3]byte{0xef, 0x9f, 0x97}}, + {3, [3]byte{0xef, 0x9f, 0x98}}, {3, [3]byte{0xef, 0x9f, 0x99}}, + {3, [3]byte{0xef, 0x9f, 0x9a}}, {3, [3]byte{0xef, 0x9f, 0x9b}}, + {3, [3]byte{0xef, 0x9f, 0x9c}}, {3, [3]byte{0xef, 0x9f, 0x9d}}, + {3, [3]byte{0xef, 0x9f, 0x9e}}, {3, [3]byte{0xef, 0x9f, 0x9f}}, + {3, [3]byte{0xef, 0x9f, 0xa0}}, {3, [3]byte{0xef, 0x9f, 0xa1}}, + {3, [3]byte{0xef, 0x9f, 0xa2}}, {3, [3]byte{0xef, 0x9f, 0xa3}}, + {3, [3]byte{0xef, 0x9f, 0xa4}}, {3, [3]byte{0xef, 0x9f, 0xa5}}, + {3, [3]byte{0xef, 0x9f, 0xa6}}, {3, [3]byte{0xef, 0x9f, 0xa7}}, + {3, [3]byte{0xef, 0x9f, 0xa8}}, {3, [3]byte{0xef, 0x9f, 0xa9}}, + {3, [3]byte{0xef, 0x9f, 0xaa}}, {3, [3]byte{0xef, 0x9f, 0xab}}, + {3, [3]byte{0xef, 0x9f, 0xac}}, {3, [3]byte{0xef, 0x9f, 0xad}}, + {3, [3]byte{0xef, 0x9f, 0xae}}, {3, [3]byte{0xef, 0x9f, 0xaf}}, + {3, [3]byte{0xef, 0x9f, 0xb0}}, {3, [3]byte{0xef, 0x9f, 0xb1}}, + {3, [3]byte{0xef, 0x9f, 0xb2}}, {3, [3]byte{0xef, 0x9f, 0xb3}}, + {3, [3]byte{0xef, 0x9f, 0xb4}}, {3, [3]byte{0xef, 0x9f, 0xb5}}, + {3, [3]byte{0xef, 0x9f, 0xb6}}, {3, [3]byte{0xef, 0x9f, 0xb7}}, + {3, [3]byte{0xef, 0x9f, 0xb8}}, {3, [3]byte{0xef, 0x9f, 0xb9}}, + {3, [3]byte{0xef, 0x9f, 0xba}}, {3, [3]byte{0xef, 0x9f, 0xbb}}, + {3, [3]byte{0xef, 0x9f, 0xbc}}, {3, [3]byte{0xef, 0x9f, 0xbd}}, + {3, [3]byte{0xef, 0x9f, 0xbe}}, {3, [3]byte{0xef, 0x9f, 0xbf}}, + }, + encode: [256]uint32{ + 0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007, + 0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f, + 0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017, + 0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f, + 0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027, + 0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f, + 0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037, + 0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f, + 0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047, + 0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f, + 0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057, + 0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f, + 0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067, + 0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f, + 0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077, + 0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f, + 0x8000f780, 0x8100f781, 0x8200f782, 0x8300f783, 0x8400f784, 0x8500f785, 0x8600f786, 0x8700f787, + 0x8800f788, 0x8900f789, 0x8a00f78a, 0x8b00f78b, 0x8c00f78c, 0x8d00f78d, 0x8e00f78e, 0x8f00f78f, + 0x9000f790, 0x9100f791, 0x9200f792, 0x9300f793, 0x9400f794, 0x9500f795, 0x9600f796, 0x9700f797, + 0x9800f798, 0x9900f799, 0x9a00f79a, 0x9b00f79b, 0x9c00f79c, 0x9d00f79d, 0x9e00f79e, 0x9f00f79f, + 0xa000f7a0, 0xa100f7a1, 0xa200f7a2, 0xa300f7a3, 0xa400f7a4, 0xa500f7a5, 0xa600f7a6, 0xa700f7a7, + 0xa800f7a8, 0xa900f7a9, 0xaa00f7aa, 0xab00f7ab, 0xac00f7ac, 0xad00f7ad, 0xae00f7ae, 0xaf00f7af, + 0xb000f7b0, 0xb100f7b1, 0xb200f7b2, 0xb300f7b3, 0xb400f7b4, 0xb500f7b5, 0xb600f7b6, 0xb700f7b7, + 0xb800f7b8, 0xb900f7b9, 0xba00f7ba, 0xbb00f7bb, 0xbc00f7bc, 0xbd00f7bd, 0xbe00f7be, 0xbf00f7bf, + 0xc000f7c0, 0xc100f7c1, 0xc200f7c2, 0xc300f7c3, 0xc400f7c4, 0xc500f7c5, 0xc600f7c6, 0xc700f7c7, + 0xc800f7c8, 0xc900f7c9, 0xca00f7ca, 0xcb00f7cb, 0xcc00f7cc, 0xcd00f7cd, 0xce00f7ce, 0xcf00f7cf, + 0xd000f7d0, 0xd100f7d1, 0xd200f7d2, 0xd300f7d3, 0xd400f7d4, 0xd500f7d5, 0xd600f7d6, 0xd700f7d7, + 0xd800f7d8, 0xd900f7d9, 0xda00f7da, 0xdb00f7db, 0xdc00f7dc, 0xdd00f7dd, 0xde00f7de, 0xdf00f7df, + 0xe000f7e0, 0xe100f7e1, 0xe200f7e2, 0xe300f7e3, 0xe400f7e4, 0xe500f7e5, 0xe600f7e6, 0xe700f7e7, + 0xe800f7e8, 0xe900f7e9, 0xea00f7ea, 0xeb00f7eb, 0xec00f7ec, 0xed00f7ed, 0xee00f7ee, 0xef00f7ef, + 0xf000f7f0, 0xf100f7f1, 0xf200f7f2, 0xf300f7f3, 0xf400f7f4, 0xf500f7f5, 0xf600f7f6, 0xf700f7f7, + 0xf800f7f8, 0xf900f7f9, 0xfa00f7fa, 0xfb00f7fb, 0xfc00f7fc, 0xfd00f7fd, 0xfe00f7fe, 0xff00f7ff, + }, +} +var listAll = []encoding.Encoding{ + CodePage437, + CodePage850, + CodePage852, + CodePage855, + CodePage858, + CodePage862, + CodePage866, + ISO8859_1, + ISO8859_2, + ISO8859_3, + ISO8859_4, + ISO8859_5, + ISO8859_6, + ISO8859_6E, + ISO8859_6I, + ISO8859_7, + ISO8859_8, + ISO8859_8E, + ISO8859_8I, + ISO8859_10, + ISO8859_13, + ISO8859_14, + ISO8859_15, + ISO8859_16, + KOI8R, + KOI8U, + Macintosh, + MacintoshCyrillic, + Windows874, + Windows1250, + Windows1251, + Windows1252, + Windows1253, + Windows1254, + Windows1255, + Windows1256, + Windows1257, + Windows1258, + XUserDefined, +} + +// Total table size 72520 bytes (70KiB); checksum: 811C9DC5 diff --git a/vendor/golang.org/x/text/encoding/encoding.go b/vendor/golang.org/x/text/encoding/encoding.go new file mode 100644 index 0000000000..2a7d9529ac --- /dev/null +++ b/vendor/golang.org/x/text/encoding/encoding.go @@ -0,0 +1,335 @@ +// Copyright 2013 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 encoding defines an interface for character encodings, such as Shift +// JIS and Windows 1252, that can convert to and from UTF-8. +// +// Encoding implementations are provided in other packages, such as +// golang.org/x/text/encoding/charmap and +// golang.org/x/text/encoding/japanese. +package encoding // import "golang.org/x/text/encoding" + +import ( + "errors" + "io" + "strconv" + "unicode/utf8" + + "golang.org/x/text/encoding/internal/identifier" + "golang.org/x/text/transform" +) + +// TODO: +// - There seems to be some inconsistency in when decoders return errors +// and when not. Also documentation seems to suggest they shouldn't return +// errors at all (except for UTF-16). +// - Encoders seem to rely on or at least benefit from the input being in NFC +// normal form. Perhaps add an example how users could prepare their output. + +// Encoding is a character set encoding that can be transformed to and from +// UTF-8. +type Encoding interface { + // NewDecoder returns a Decoder. + NewDecoder() *Decoder + + // NewEncoder returns an Encoder. + NewEncoder() *Encoder +} + +// A Decoder converts bytes to UTF-8. It implements transform.Transformer. +// +// Transforming source bytes that are not of that encoding will not result in an +// error per se. Each byte that cannot be transcoded will be represented in the +// output by the UTF-8 encoding of '\uFFFD', the replacement rune. +type Decoder struct { + transform.Transformer + + // This forces external creators of Decoders to use names in struct + // initializers, allowing for future extendibility without having to break + // code. + _ struct{} +} + +// Bytes converts the given encoded bytes to UTF-8. It returns the converted +// bytes or 0, err if any error occurred. +func (d *Decoder) Bytes(b []byte) ([]byte, error) { + b, _, err := transform.Bytes(d, b) + if err != nil { + return nil, err + } + return b, nil +} + +// String converts the given encoded string to UTF-8. It returns the converted +// string or 0, err if any error occurred. +func (d *Decoder) String(s string) (string, error) { + s, _, err := transform.String(d, s) + if err != nil { + return "", err + } + return s, nil +} + +// Reader wraps another Reader to decode its bytes. +// +// The Decoder may not be used for any other operation as long as the returned +// Reader is in use. +func (d *Decoder) Reader(r io.Reader) io.Reader { + return transform.NewReader(r, d) +} + +// An Encoder converts bytes from UTF-8. It implements transform.Transformer. +// +// Each rune that cannot be transcoded will result in an error. In this case, +// the transform will consume all source byte up to, not including the offending +// rune. Transforming source bytes that are not valid UTF-8 will be replaced by +// `\uFFFD`. To return early with an error instead, use transform.Chain to +// preprocess the data with a UTF8Validator. +type Encoder struct { + transform.Transformer + + // This forces external creators of Encoders to use names in struct + // initializers, allowing for future extendibility without having to break + // code. + _ struct{} +} + +// Bytes converts bytes from UTF-8. It returns the converted bytes or 0, err if +// any error occurred. +func (e *Encoder) Bytes(b []byte) ([]byte, error) { + b, _, err := transform.Bytes(e, b) + if err != nil { + return nil, err + } + return b, nil +} + +// String converts a string from UTF-8. It returns the converted string or +// 0, err if any error occurred. +func (e *Encoder) String(s string) (string, error) { + s, _, err := transform.String(e, s) + if err != nil { + return "", err + } + return s, nil +} + +// Writer wraps another Writer to encode its UTF-8 output. +// +// The Encoder may not be used for any other operation as long as the returned +// Writer is in use. +func (e *Encoder) Writer(w io.Writer) io.Writer { + return transform.NewWriter(w, e) +} + +// ASCIISub is the ASCII substitute character, as recommended by +// http://unicode.org/reports/tr36/#Text_Comparison +const ASCIISub = '\x1a' + +// Nop is the nop encoding. Its transformed bytes are the same as the source +// bytes; it does not replace invalid UTF-8 sequences. +var Nop Encoding = nop{} + +type nop struct{} + +func (nop) NewDecoder() *Decoder { + return &Decoder{Transformer: transform.Nop} +} +func (nop) NewEncoder() *Encoder { + return &Encoder{Transformer: transform.Nop} +} + +// Replacement is the replacement encoding. Decoding from the replacement +// encoding yields a single '\uFFFD' replacement rune. Encoding from UTF-8 to +// the replacement encoding yields the same as the source bytes except that +// invalid UTF-8 is converted to '\uFFFD'. +// +// It is defined at http://encoding.spec.whatwg.org/#replacement +var Replacement Encoding = replacement{} + +type replacement struct{} + +func (replacement) NewDecoder() *Decoder { + return &Decoder{Transformer: replacementDecoder{}} +} + +func (replacement) NewEncoder() *Encoder { + return &Encoder{Transformer: replacementEncoder{}} +} + +func (replacement) ID() (mib identifier.MIB, other string) { + return identifier.Replacement, "" +} + +type replacementDecoder struct{ transform.NopResetter } + +func (replacementDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + if len(dst) < 3 { + return 0, 0, transform.ErrShortDst + } + if atEOF { + const fffd = "\ufffd" + dst[0] = fffd[0] + dst[1] = fffd[1] + dst[2] = fffd[2] + nDst = 3 + } + return nDst, len(src), nil +} + +type replacementEncoder struct{ transform.NopResetter } + +func (replacementEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + r, size := rune(0), 0 + + for ; nSrc < len(src); nSrc += size { + r = rune(src[nSrc]) + + // Decode a 1-byte rune. + if r < utf8.RuneSelf { + size = 1 + + } else { + // Decode a multi-byte rune. + r, size = utf8.DecodeRune(src[nSrc:]) + if size == 1 { + // All valid runes of size 1 (those below utf8.RuneSelf) were + // handled above. We have invalid UTF-8 or we haven't seen the + // full character yet. + if !atEOF && !utf8.FullRune(src[nSrc:]) { + err = transform.ErrShortSrc + break + } + r = '\ufffd' + } + } + + if nDst+utf8.RuneLen(r) > len(dst) { + err = transform.ErrShortDst + break + } + nDst += utf8.EncodeRune(dst[nDst:], r) + } + return nDst, nSrc, err +} + +// HTMLEscapeUnsupported wraps encoders to replace source runes outside the +// repertoire of the destination encoding with HTML escape sequences. +// +// This wrapper exists to comply to URL and HTML forms requiring a +// non-terminating legacy encoder. The produced sequences may lead to data +// loss as they are indistinguishable from legitimate input. To avoid this +// issue, use UTF-8 encodings whenever possible. +func HTMLEscapeUnsupported(e *Encoder) *Encoder { + return &Encoder{Transformer: &errorHandler{e, errorToHTML}} +} + +// ReplaceUnsupported wraps encoders to replace source runes outside the +// repertoire of the destination encoding with an encoding-specific +// replacement. +// +// This wrapper is only provided for backwards compatibility and legacy +// handling. Its use is strongly discouraged. Use UTF-8 whenever possible. +func ReplaceUnsupported(e *Encoder) *Encoder { + return &Encoder{Transformer: &errorHandler{e, errorToReplacement}} +} + +type errorHandler struct { + *Encoder + handler func(dst []byte, r rune, err repertoireError) (n int, ok bool) +} + +// TODO: consider making this error public in some form. +type repertoireError interface { + Replacement() byte +} + +func (h errorHandler) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + nDst, nSrc, err = h.Transformer.Transform(dst, src, atEOF) + for err != nil { + rerr, ok := err.(repertoireError) + if !ok { + return nDst, nSrc, err + } + r, sz := utf8.DecodeRune(src[nSrc:]) + n, ok := h.handler(dst[nDst:], r, rerr) + if !ok { + return nDst, nSrc, transform.ErrShortDst + } + err = nil + nDst += n + if nSrc += sz; nSrc < len(src) { + var dn, sn int + dn, sn, err = h.Transformer.Transform(dst[nDst:], src[nSrc:], atEOF) + nDst += dn + nSrc += sn + } + } + return nDst, nSrc, err +} + +func errorToHTML(dst []byte, r rune, err repertoireError) (n int, ok bool) { + buf := [8]byte{} + b := strconv.AppendUint(buf[:0], uint64(r), 10) + if n = len(b) + len("&#;"); n >= len(dst) { + return 0, false + } + dst[0] = '&' + dst[1] = '#' + dst[copy(dst[2:], b)+2] = ';' + return n, true +} + +func errorToReplacement(dst []byte, r rune, err repertoireError) (n int, ok bool) { + if len(dst) == 0 { + return 0, false + } + dst[0] = err.Replacement() + return 1, true +} + +// ErrInvalidUTF8 means that a transformer encountered invalid UTF-8. +var ErrInvalidUTF8 = errors.New("encoding: invalid UTF-8") + +// UTF8Validator is a transformer that returns ErrInvalidUTF8 on the first +// input byte that is not valid UTF-8. +var UTF8Validator transform.Transformer = utf8Validator{} + +type utf8Validator struct{ transform.NopResetter } + +func (utf8Validator) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + n := len(src) + if n > len(dst) { + n = len(dst) + } + for i := 0; i < n; { + if c := src[i]; c < utf8.RuneSelf { + dst[i] = c + i++ + continue + } + _, size := utf8.DecodeRune(src[i:]) + if size == 1 { + // All valid runes of size 1 (those below utf8.RuneSelf) were + // handled above. We have invalid UTF-8 or we haven't seen the + // full character yet. + err = ErrInvalidUTF8 + if !atEOF && !utf8.FullRune(src[i:]) { + err = transform.ErrShortSrc + } + return i, i, err + } + if i+size > len(dst) { + return i, i, transform.ErrShortDst + } + for ; size > 0; size-- { + dst[i] = src[i] + i++ + } + } + if len(src) > len(dst) { + err = transform.ErrShortDst + } + return n, n, err +} diff --git a/vendor/golang.org/x/text/encoding/encoding_test.go b/vendor/golang.org/x/text/encoding/encoding_test.go new file mode 100644 index 0000000000..975f5ee50d --- /dev/null +++ b/vendor/golang.org/x/text/encoding/encoding_test.go @@ -0,0 +1,1088 @@ +// Copyright 2013 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 encoding_test + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "strings" + "testing" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/charmap" + "golang.org/x/text/encoding/japanese" + "golang.org/x/text/encoding/korean" + "golang.org/x/text/encoding/simplifiedchinese" + "golang.org/x/text/encoding/traditionalchinese" + "golang.org/x/text/encoding/unicode" + "golang.org/x/text/transform" +) + +func trim(s string) string { + if len(s) < 120 { + return s + } + return s[:50] + "..." + s[len(s)-50:] +} + +var basicTestCases = []struct { + e encoding.Encoding + encPrefix string + encSuffix string + encoded string + utf8 string +}{ + // The encoded forms can be verified by the iconv program: + // $ echo 月日は百代 | iconv -f UTF-8 -t SHIFT-JIS | xxd + + // Charmap tests. + { + e: charmap.CodePage437, + encoded: "H\x82ll\x93 \x9d\xa7\xf4\x9c\xbe", + utf8: "Héllô ¥º⌠£╛", + }, + { + e: charmap.CodePage866, + encoded: "H\xf3\xd3o \x98\xfd\x9f\xdd\xa1", + utf8: "Hє╙o Ш¤Я▌б", + }, + { + e: charmap.ISO8859_2, + encoded: "Hel\xe5\xf5", + utf8: "Helĺő", + }, + { + e: charmap.ISO8859_3, + encoded: "He\xbd\xd4", + utf8: "He½Ô", + }, + { + e: charmap.ISO8859_4, + encoded: "Hel\xb6\xf8", + utf8: "Helļø", + }, + { + e: charmap.ISO8859_5, + encoded: "H\xd7\xc6o", + utf8: "HзЦo", + }, + { + e: charmap.ISO8859_6, + encoded: "Hel\xc2\xc9", + utf8: "Helآة", + }, + { + e: charmap.ISO8859_7, + encoded: "H\xeel\xebo", + utf8: "Hξlλo", + }, + { + e: charmap.ISO8859_8, + encoded: "Hel\xf5\xed", + utf8: "Helץם", + }, + { + e: charmap.ISO8859_10, + encoded: "H\xea\xbfo", + utf8: "Hęŋo", + }, + { + e: charmap.ISO8859_13, + encoded: "H\xe6l\xf9o", + utf8: "Hęlło", + }, + { + e: charmap.ISO8859_14, + encoded: "He\xfe\xd0o", + utf8: "HeŷŴo", + }, + { + e: charmap.ISO8859_15, + encoded: "H\xa4ll\xd8", + utf8: "H€llØ", + }, + { + e: charmap.ISO8859_16, + encoded: "H\xe6ll\xbd", + utf8: "Hællœ", + }, + { + e: charmap.KOI8R, + encoded: "He\x93\xad\x9c", + utf8: "He⌠╜°", + }, + { + e: charmap.KOI8U, + encoded: "He\x93\xad\x9c", + utf8: "He⌠ґ°", + }, + { + e: charmap.Macintosh, + encoded: "He\xdf\xd7", + utf8: "Hefl◊", + }, + { + e: charmap.MacintoshCyrillic, + encoded: "He\xbe\x94", + utf8: "HeЊФ", + }, + { + e: charmap.Windows874, + encoded: "He\xb7\xf0", + utf8: "Heท๐", + }, + { + e: charmap.Windows1250, + encoded: "He\xe5\xe5o", + utf8: "Heĺĺo", + }, + { + e: charmap.Windows1251, + encoded: "H\xball\xfe", + utf8: "Hєllю", + }, + { + e: charmap.Windows1252, + encoded: "H\xe9ll\xf4 \xa5\xbA\xae\xa3\xd0", + utf8: "Héllô ¥º®£Ð", + }, + { + e: charmap.Windows1253, + encoded: "H\xe5ll\xd6", + utf8: "HεllΦ", + }, + { + e: charmap.Windows1254, + encoded: "\xd0ello", + utf8: "Ğello", + }, + { + e: charmap.Windows1255, + encoded: "He\xd4o", + utf8: "Heװo", + }, + { + e: charmap.Windows1256, + encoded: "H\xdbllo", + utf8: "Hغllo", + }, + { + e: charmap.Windows1257, + encoded: "He\xeflo", + utf8: "Heļlo", + }, + { + e: charmap.Windows1258, + encoded: "Hell\xf5", + utf8: "Hellơ", + }, + { + e: charmap.XUserDefined, + encoded: "\x00\x40\x7f\x80\xab\xff", + utf8: "\u0000\u0040\u007f\uf780\uf7ab\uf7ff", + }, + + // UTF-16 tests. + { + e: unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM), + encoded: "\x00\x57\x00\xe4\xd8\x35\xdd\x65", + utf8: "\x57\u00e4\U0001d565", + }, + { + e: utf16BEEB, + encPrefix: "\xfe\xff", + encoded: "\x00\x57\x00\xe4\xd8\x35\xdd\x65", + utf8: "\x57\u00e4\U0001d565", + }, + { + e: unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM), + encoded: "\x57\x00\xe4\x00\x35\xd8\x65\xdd", + utf8: "\x57\u00e4\U0001d565", + }, + { + e: utf16LEEB, + encPrefix: "\xff\xfe", + encoded: "\x57\x00\xe4\x00\x35\xd8\x65\xdd", + utf8: "\x57\u00e4\U0001d565", + }, + + // Chinese tests. + // + // "\u0081\u00de\u00df\u00e0\u00e1\u00e2\u00e3\uffff\U00010000" is a + // nonsense string that contains GB18030 encodable codepoints of which + // only U+00E0 and U+00E1 are GBK encodable. + // + // "A\u3000\u554a\u4e02\u4e90\u72dc\u7349\u02ca\u2588Z€" is a nonsense + // string that contains ASCII and GBK encodable codepoints from Levels + // 1-5 as well as the Euro sign. + // + // "A\u43f0\u4c32\U00027267\u3000\U0002910d\u79d4Z€" is a nonsense string + // that contains ASCII and Big5 encodable codepoints from the Basic + // Multilingual Plane and the Supplementary Ideographic Plane as well as + // the Euro sign. + // + // "花间一壶酒,独酌无相亲。" (simplified) and + // "花間一壺酒,獨酌無相親。" (traditional) + // are from the 8th century poem "Yuè Xià Dú Zhuó". + { + e: simplifiedchinese.GB18030, + encoded: "\x81\x30\x81\x31\x81\x30\x89\x37\x81\x30\x89\x38\xa8\xa4\xa8\xa2" + + "\x81\x30\x89\x39\x81\x30\x8a\x30\x84\x31\xa4\x39\x90\x30\x81\x30", + utf8: "\u0081\u00de\u00df\u00e0\u00e1\u00e2\u00e3\uffff\U00010000", + }, + { + e: simplifiedchinese.GB18030, + encoded: "\xbb\xa8\xbc\xe4\xd2\xbb\xba\xf8\xbe\xc6\xa3\xac\xb6\xc0\xd7\xc3" + + "\xce\xde\xcf\xe0\xc7\xd7\xa1\xa3", + utf8: "花间一壶酒,独酌无相亲。", + }, + { + e: simplifiedchinese.GBK, + encoded: "A\xa1\xa1\xb0\xa1\x81\x40\x81\x80\xaa\x40\xaa\x80\xa8\x40\xa8\x80Z\x80", + utf8: "A\u3000\u554a\u4e02\u4e90\u72dc\u7349\u02ca\u2588Z€", + }, + { + e: simplifiedchinese.GBK, + encoded: "\xbb\xa8\xbc\xe4\xd2\xbb\xba\xf8\xbe\xc6\xa3\xac\xb6\xc0\xd7\xc3" + + "\xce\xde\xcf\xe0\xc7\xd7\xa1\xa3", + utf8: "花间一壶酒,独酌无相亲。", + }, + { + e: simplifiedchinese.HZGB2312, + encoded: "A~{\x21\x21~~\x30\x21~}Z~~", + utf8: "A\u3000~\u554aZ~", + }, + { + e: simplifiedchinese.HZGB2312, + encPrefix: "~{", + encoded: ";(<dR;:x>F#,6@WCN^O`GW!#", + utf8: "花间一壶酒,独酌无相亲。", + }, + { + e: traditionalchinese.Big5, + encoded: "A\x87\x40\x87\x41\x87\x45\xa1\x40\xfe\xfd\xfe\xfeZ\xa3\xe1", + utf8: "A\u43f0\u4c32\U00027267\u3000\U0002910d\u79d4Z€", + }, + { + e: traditionalchinese.Big5, + encoded: "\xaa\xe1\xb6\xa1\xa4\x40\xb3\xfd\xb0\x73\xa1\x41\xbf\x57\xb0\x75" + + "\xb5\x4c\xac\xdb\xbf\xcb\xa1\x43", + utf8: "花間一壺酒,獨酌無相親。", + }, + + // Japanese tests. + // + // "A。カ゚ 0208: etc 0212: etc" is a nonsense string that contains ASCII, half-width + // kana, JIS X 0208 (including two near the kink in the Shift JIS second byte + // encoding) and JIS X 0212 encodable codepoints. + // + // "月日は百代の過客にして、行かふ年も又旅人也。" is from the 17th century poem + // "Oku no Hosomichi" and contains both hiragana and kanji. + { + e: japanese.EUCJP, + encoded: "A\x8e\xa1\x8e\xb6\x8e\xdf " + + "0208: \xa1\xa1\xa1\xa2\xa1\xdf\xa1\xe0\xa1\xfd\xa1\xfe\xa2\xa1\xa2\xa2\xf4\xa6 " + + "0212: \x8f\xa2\xaf\x8f\xed\xe3", + utf8: "A。カ゚ " + + "0208: \u3000\u3001\u00d7\u00f7\u25ce\u25c7\u25c6\u25a1\u7199 " + + "0212: \u02d8\u9fa5", + }, + { + e: japanese.EUCJP, + encoded: "\xb7\xee\xc6\xfc\xa4\xcf\xc9\xb4\xc2\xe5\xa4\xce\xb2\xe1\xb5\xd2" + + "\xa4\xcb\xa4\xb7\xa4\xc6\xa1\xa2\xb9\xd4\xa4\xab\xa4\xd5\xc7\xaf" + + "\xa4\xe2\xcb\xf4\xce\xb9\xbf\xcd\xcc\xe9\xa1\xa3", + utf8: "月日は百代の過客にして、行かふ年も又旅人也。", + }, + { + e: japanese.ISO2022JP, + encSuffix: "\x1b\x28\x42", + encoded: "\x1b\x28\x49\x21\x36\x5f\x1b\x28\x42 " + + "0208: \x1b\x24\x42\x21\x21\x21\x22\x21\x5f\x21\x60\x21\x7d\x21\x7e\x22\x21\x22\x22\x74\x26", + utf8: "。カ゚ " + + "0208: \u3000\u3001\u00d7\u00f7\u25ce\u25c7\u25c6\u25a1\u7199", + }, + { + e: japanese.ISO2022JP, + encPrefix: "\x1b\x24\x42", + encSuffix: "\x1b\x28\x42", + encoded: "\x37\x6e\x46\x7c\x24\x4f\x49\x34\x42\x65\x24\x4e\x32\x61\x35\x52" + + "\x24\x4b\x24\x37\x24\x46\x21\x22\x39\x54\x24\x2b\x24\x55\x47\x2f" + + "\x24\x62\x4b\x74\x4e\x39\x3f\x4d\x4c\x69\x21\x23", + utf8: "月日は百代の過客にして、行かふ年も又旅人也。", + }, + { + e: japanese.ShiftJIS, + encoded: "A\xa1\xb6\xdf " + + "0208: \x81\x40\x81\x41\x81\x7e\x81\x80\x81\x9d\x81\x9e\x81\x9f\x81\xa0\xea\xa4", + utf8: "A。カ゚ " + + "0208: \u3000\u3001\u00d7\u00f7\u25ce\u25c7\u25c6\u25a1\u7199", + }, + { + e: japanese.ShiftJIS, + encoded: "\x8c\x8e\x93\xfa\x82\xcd\x95\x53\x91\xe3\x82\xcc\x89\xdf\x8b\x71" + + "\x82\xc9\x82\xb5\x82\xc4\x81\x41\x8d\x73\x82\xa9\x82\xd3\x94\x4e" + + "\x82\xe0\x96\x94\x97\xb7\x90\x6c\x96\xe7\x81\x42", + utf8: "月日は百代の過客にして、行かふ年も又旅人也。", + }, + + // Korean tests. + // + // "A\uac02\uac35\uac56\ud401B\ud408\ud620\ud624C\u4f3d\u8a70D" is a + // nonsense string that contains ASCII, Hangul and CJK ideographs. + // + // "세계야, 안녕" translates as "Hello, world". + { + e: korean.EUCKR, + encoded: "A\x81\x41\x81\x61\x81\x81\xc6\xfeB\xc7\xa1\xc7\xfe\xc8\xa1C\xca\xa1\xfd\xfeD", + utf8: "A\uac02\uac35\uac56\ud401B\ud408\ud620\ud624C\u4f3d\u8a70D", + }, + { + e: korean.EUCKR, + encoded: "\xbc\xbc\xb0\xe8\xbe\xdf\x2c\x20\xbe\xc8\xb3\xe7", + utf8: "세계야, 안녕", + }, +} + +func TestBasics(t *testing.T) { + for _, tc := range basicTestCases { + for _, direction := range []string{"Decode", "Encode"} { + var coder Transcoder + var want, src, wPrefix, sPrefix, wSuffix, sSuffix string + if direction == "Decode" { + coder, want, src = tc.e.NewDecoder(), tc.utf8, tc.encoded + wPrefix, sPrefix, wSuffix, sSuffix = "", tc.encPrefix, "", tc.encSuffix + } else { + coder, want, src = tc.e.NewEncoder(), tc.encoded, tc.utf8 + wPrefix, sPrefix, wSuffix, sSuffix = tc.encPrefix, "", tc.encSuffix, "" + } + + dst := make([]byte, len(wPrefix)+len(want)+len(wSuffix)) + nDst, nSrc, err := coder.Transform(dst, []byte(sPrefix+src+sSuffix), true) + if err != nil { + t.Errorf("%v: %s: %v", tc.e, direction, err) + continue + } + if nDst != len(wPrefix)+len(want)+len(wSuffix) { + t.Errorf("%v: %s: nDst got %d, want %d", + tc.e, direction, nDst, len(wPrefix)+len(want)+len(wSuffix)) + continue + } + if nSrc != len(sPrefix)+len(src)+len(sSuffix) { + t.Errorf("%v: %s: nSrc got %d, want %d", + tc.e, direction, nSrc, len(sPrefix)+len(src)+len(sSuffix)) + continue + } + if got := string(dst); got != wPrefix+want+wSuffix { + t.Errorf("%v: %s:\ngot %q\nwant %q", + tc.e, direction, got, wPrefix+want+wSuffix) + continue + } + + for _, n := range []int{0, 1, 2, 10, 123, 4567} { + input := sPrefix + strings.Repeat(src, n) + sSuffix + g, err := coder.String(input) + if err != nil { + t.Errorf("%v: %s: Bytes: n=%d: %v", tc.e, direction, n, err) + continue + } + if len(g) == 0 && len(input) == 0 { + // If the input is empty then the output can be empty, + // regardless of whatever wPrefix is. + continue + } + got1, want1 := string(g), wPrefix+strings.Repeat(want, n)+wSuffix + if got1 != want1 { + t.Errorf("%v: %s: ReadAll: n=%d\ngot %q\nwant %q", + tc.e, direction, n, trim(got1), trim(want1)) + continue + } + } + } + } +} + +// TestBig5CircumflexAndMacron tests the special cases listed in +// http://encoding.spec.whatwg.org/#big5 +// Note that these special cases aren't preserved by round-tripping through +// decoding and encoding (since +// http://encoding.spec.whatwg.org/index-big5.txt does not have an entry for +// U+0304 or U+030C), so we can't test this in TestBasics. +func TestBig5CircumflexAndMacron(t *testing.T) { + src := "\x88\x5f\x88\x60\x88\x61\x88\x62\x88\x63\x88\x64\x88\x65\x88\x66 " + + "\x88\xa2\x88\xa3\x88\xa4\x88\xa5\x88\xa6" + want := "ÓǑÒ\u00ca\u0304Ế\u00ca\u030cỀÊ " + + "ü\u00ea\u0304ế\u00ea\u030cề" + dst, err := ioutil.ReadAll(transform.NewReader( + strings.NewReader(src), traditionalchinese.Big5.NewDecoder())) + if err != nil { + t.Fatal(err) + } + if got := string(dst); got != want { + t.Fatalf("\ngot %q\nwant %q", got, want) + } +} + +func TestEncodeInvalidUTF8(t *testing.T) { + inputs := []string{ + "hello.", + "wo\ufffdld.", + "ABC\xff\x80\x80", // Invalid UTF-8. + "\x80\x80\x80\x80\x80", + "\x80\x80D\x80\x80", // Valid rune at "D". + "E\xed\xa0\x80\xed\xbf\xbfF", // Two invalid UTF-8 runes (surrogates). + "G", + "H\xe2\x82", // U+20AC in UTF-8 is "\xe2\x82\xac", which we split over two + "\xacI\xe2\x82", // input lines. It maps to 0x80 in the Windows-1252 encoding. + } + // Each invalid source byte becomes '\x1a'. + want := strings.Replace("hello.wo?ld.ABC??????????D??E??????FGH\x80I??", "?", "\x1a", -1) + + transformer := encoding.ReplaceUnsupported(charmap.Windows1252.NewEncoder()) + gotBuf := make([]byte, 0, 1024) + src := make([]byte, 0, 1024) + for i, input := range inputs { + dst := make([]byte, 1024) + src = append(src, input...) + atEOF := i == len(inputs)-1 + nDst, nSrc, err := transformer.Transform(dst, src, atEOF) + gotBuf = append(gotBuf, dst[:nDst]...) + src = src[nSrc:] + if err != nil && err != transform.ErrShortSrc { + t.Fatalf("i=%d: %v", i, err) + } + if atEOF && err != nil { + t.Fatalf("i=%d: atEOF: %v", i, err) + } + } + if got := string(gotBuf); got != want { + t.Fatalf("\ngot %+q\nwant %+q", got, want) + } +} + +func TestReplacement(t *testing.T) { + for _, direction := range []string{"Decode", "Encode"} { + enc, want := (transform.Transformer)(nil), "" + if direction == "Decode" { + enc = encoding.Replacement.NewDecoder() + want = "\ufffd" + } else { + enc = encoding.Replacement.NewEncoder() + want = "AB\x00CD\ufffdYZ" + } + sr := strings.NewReader("AB\x00CD\x80YZ") + g, err := ioutil.ReadAll(transform.NewReader(sr, enc)) + if err != nil { + t.Errorf("%s: ReadAll: %v", direction, err) + continue + } + if got := string(g); got != want { + t.Errorf("%s:\ngot %q\nwant %q", direction, got, want) + continue + } + } +} + +func TestUTF8Validator(t *testing.T) { + testCases := []struct { + desc string + dstSize int + src string + atEOF bool + want string + wantErr error + }{ + { + "empty input", + 100, + "", + false, + "", + nil, + }, + { + "valid 1-byte 1-rune input", + 100, + "a", + false, + "a", + nil, + }, + { + "valid 3-byte 1-rune input", + 100, + "\u1234", + false, + "\u1234", + nil, + }, + { + "valid 5-byte 3-rune input", + 100, + "a\u0100\u0101", + false, + "a\u0100\u0101", + nil, + }, + { + "perfectly sized dst (non-ASCII)", + 5, + "a\u0100\u0101", + false, + "a\u0100\u0101", + nil, + }, + { + "short dst (non-ASCII)", + 4, + "a\u0100\u0101", + false, + "a\u0100", + transform.ErrShortDst, + }, + { + "perfectly sized dst (ASCII)", + 5, + "abcde", + false, + "abcde", + nil, + }, + { + "short dst (ASCII)", + 4, + "abcde", + false, + "abcd", + transform.ErrShortDst, + }, + { + "partial input (!EOF)", + 100, + "a\u0100\xf1", + false, + "a\u0100", + transform.ErrShortSrc, + }, + { + "invalid input (EOF)", + 100, + "a\u0100\xf1", + true, + "a\u0100", + encoding.ErrInvalidUTF8, + }, + { + "invalid input (!EOF)", + 100, + "a\u0100\x80", + false, + "a\u0100", + encoding.ErrInvalidUTF8, + }, + { + "invalid input (above U+10FFFF)", + 100, + "a\u0100\xf7\xbf\xbf\xbf", + false, + "a\u0100", + encoding.ErrInvalidUTF8, + }, + { + "invalid input (surrogate half)", + 100, + "a\u0100\xed\xa0\x80", + false, + "a\u0100", + encoding.ErrInvalidUTF8, + }, + } + for _, tc := range testCases { + dst := make([]byte, tc.dstSize) + nDst, nSrc, err := encoding.UTF8Validator.Transform(dst, []byte(tc.src), tc.atEOF) + if nDst < 0 || len(dst) < nDst { + t.Errorf("%s: nDst=%d out of range", tc.desc, nDst) + continue + } + got := string(dst[:nDst]) + if got != tc.want || nSrc != len(tc.want) || err != tc.wantErr { + t.Errorf("%s:\ngot %+q, %d, %v\nwant %+q, %d, %v", + tc.desc, got, nSrc, err, tc.want, len(tc.want), tc.wantErr) + continue + } + } +} + +var ( + utf16LEIB = unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM) // UTF-16LE (atypical interpretation) + utf16LEUB = unicode.UTF16(unicode.LittleEndian, unicode.UseBOM) // UTF-16, LE + utf16LEEB = unicode.UTF16(unicode.LittleEndian, unicode.ExpectBOM) // UTF-16, LE, Expect + utf16BEIB = unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM) // UTF-16BE (atypical interpretation) + utf16BEUB = unicode.UTF16(unicode.BigEndian, unicode.UseBOM) // UTF-16 default + utf16BEEB = unicode.UTF16(unicode.BigEndian, unicode.ExpectBOM) // UTF-16 Expect +) + +func TestUTF16(t *testing.T) { + testCases := []struct { + desc string + src string + notEOF bool // the inverse of atEOF + sizeDst int + want string + nSrc int + err error + t transform.Transformer + }{{ + desc: "utf-16 dec: BOM determines encoding BE (RFC 2781:3.3)", + src: "\xFE\xFF\xD8\x08\xDF\x45\x00\x3D\x00\x52\x00\x61", + sizeDst: 100, + want: "\U00012345=Ra", + nSrc: 12, + t: utf16BEUB.NewDecoder(), + }, { + desc: "utf-16 dec: BOM determines encoding LE (RFC 2781:3.3)", + src: "\xFF\xFE\x08\xD8\x45\xDF\x3D\x00\x52\x00\x61\x00", + sizeDst: 100, + want: "\U00012345=Ra", + nSrc: 12, + t: utf16LEUB.NewDecoder(), + }, { + desc: "utf-16 dec: BOM determines encoding LE, change default (RFC 2781:3.3)", + src: "\xFF\xFE\x08\xD8\x45\xDF\x3D\x00\x52\x00\x61\x00", + sizeDst: 100, + want: "\U00012345=Ra", + nSrc: 12, + t: utf16BEUB.NewDecoder(), + }, { + desc: "utf-16 dec: Fail on missing BOM when required", + src: "\x08\xD8\x45\xDF\x3D\x00\xFF\xFE\xFE\xFF\x00\x52\x00\x61", + sizeDst: 100, + want: "", + nSrc: 0, + err: unicode.ErrMissingBOM, + t: utf16BEEB.NewDecoder(), + }, { + desc: "utf-16 dec: SHOULD interpret text as big-endian when BOM not present (RFC 2781:4.3)", + src: "\xD8\x08\xDF\x45\x00\x3D\x00\x52\x00\x61", + sizeDst: 100, + want: "\U00012345=Ra", + nSrc: 10, + t: utf16BEUB.NewDecoder(), + }, { + // This is an error according to RFC 2781. But errors in RFC 2781 are + // open to interpretations, so I guess this is fine. + desc: "utf-16le dec: incorrect BOM is an error (RFC 2781:4.1)", + src: "\xFE\xFF\x08\xD8\x45\xDF\x3D\x00\x52\x00\x61\x00", + sizeDst: 100, + want: "\uFFFE\U00012345=Ra", + nSrc: 12, + t: utf16LEIB.NewDecoder(), + }, { + desc: "utf-16 enc: SHOULD write BOM (RFC 2781:3.3)", + src: "\U00012345=Ra", + sizeDst: 100, + want: "\xFF\xFE\x08\xD8\x45\xDF\x3D\x00\x52\x00\x61\x00", + nSrc: 7, + t: utf16LEUB.NewEncoder(), + }, { + desc: "utf-16 enc: SHOULD write BOM (RFC 2781:3.3)", + src: "\U00012345=Ra", + sizeDst: 100, + want: "\xFE\xFF\xD8\x08\xDF\x45\x00\x3D\x00\x52\x00\x61", + nSrc: 7, + t: utf16BEUB.NewEncoder(), + }, { + desc: "utf-16le enc: MUST NOT write BOM (RFC 2781:3.3)", + src: "\U00012345=Ra", + sizeDst: 100, + want: "\x08\xD8\x45\xDF\x3D\x00\x52\x00\x61\x00", + nSrc: 7, + t: utf16LEIB.NewEncoder(), + }, { + desc: "utf-16be dec: incorrect UTF-16: odd bytes", + src: "\x00", + sizeDst: 100, + want: "\uFFFD", + nSrc: 1, + t: utf16BEIB.NewDecoder(), + }, { + desc: "utf-16be dec: unpaired surrogate, odd bytes", + src: "\xD8\x45\x00", + sizeDst: 100, + want: "\uFFFD\uFFFD", + nSrc: 3, + t: utf16BEIB.NewDecoder(), + }, { + desc: "utf-16be dec: unpaired low surrogate + valid text", + src: "\xD8\x45\x00a", + sizeDst: 100, + want: "\uFFFDa", + nSrc: 4, + t: utf16BEIB.NewDecoder(), + }, { + desc: "utf-16be dec: unpaired low surrogate + valid text + single byte", + src: "\xD8\x45\x00ab", + sizeDst: 100, + want: "\uFFFDa\uFFFD", + nSrc: 5, + t: utf16BEIB.NewDecoder(), + }, { + desc: "utf-16le dec: unpaired high surrogate", + src: "\x00\x00\x00\xDC\x12\xD8", + sizeDst: 100, + want: "\x00\uFFFD\uFFFD", + nSrc: 6, + t: utf16LEIB.NewDecoder(), + }, { + desc: "utf-16be dec: two unpaired low surrogates", + src: "\xD8\x45\xD8\x12", + sizeDst: 100, + want: "\uFFFD\uFFFD", + nSrc: 4, + t: utf16BEIB.NewDecoder(), + }, { + desc: "utf-16be dec: short dst", + src: "\x00a", + sizeDst: 0, + want: "", + nSrc: 0, + t: utf16BEIB.NewDecoder(), + err: transform.ErrShortDst, + }, { + desc: "utf-16be dec: short dst surrogate", + src: "\xD8\xF5\xDC\x12", + sizeDst: 3, + want: "", + nSrc: 0, + t: utf16BEIB.NewDecoder(), + err: transform.ErrShortDst, + }, { + desc: "utf-16be dec: short dst trailing byte", + src: "\x00", + sizeDst: 2, + want: "", + nSrc: 0, + t: utf16BEIB.NewDecoder(), + err: transform.ErrShortDst, + }, { + desc: "utf-16be dec: short src", + src: "\x00", + notEOF: true, + sizeDst: 3, + want: "", + nSrc: 0, + t: utf16BEIB.NewDecoder(), + err: transform.ErrShortSrc, + }, { + desc: "utf-16 enc", + src: "\U00012345=Ra", + sizeDst: 100, + want: "\xFE\xFF\xD8\x08\xDF\x45\x00\x3D\x00\x52\x00\x61", + nSrc: 7, + t: utf16BEUB.NewEncoder(), + }, { + desc: "utf-16 enc: short dst normal", + src: "\U00012345=Ra", + sizeDst: 9, + want: "\xD8\x08\xDF\x45\x00\x3D\x00\x52", + nSrc: 6, + t: utf16BEIB.NewEncoder(), + err: transform.ErrShortDst, + }, { + desc: "utf-16 enc: short dst surrogate", + src: "\U00012345=Ra", + sizeDst: 3, + want: "", + nSrc: 0, + t: utf16BEIB.NewEncoder(), + err: transform.ErrShortDst, + }, { + desc: "utf-16 enc: short src", + src: "\U00012345=Ra\xC2", + notEOF: true, + sizeDst: 100, + want: "\xD8\x08\xDF\x45\x00\x3D\x00\x52\x00\x61", + nSrc: 7, + t: utf16BEIB.NewEncoder(), + err: transform.ErrShortSrc, + }, { + desc: "utf-16be dec: don't change byte order mid-stream", + src: "\xFE\xFF\xD8\x08\xDF\x45\x00\x3D\xFF\xFE\x00\x52\x00\x61", + sizeDst: 100, + want: "\U00012345=\ufffeRa", + nSrc: 14, + t: utf16BEUB.NewDecoder(), + }, { + desc: "utf-16le dec: don't change byte order mid-stream", + src: "\xFF\xFE\x08\xD8\x45\xDF\x3D\x00\xFF\xFE\xFE\xFF\x52\x00\x61\x00", + sizeDst: 100, + want: "\U00012345=\ufeff\ufffeRa", + nSrc: 16, + t: utf16LEUB.NewDecoder(), + }} + for i, tc := range testCases { + b := make([]byte, tc.sizeDst) + nDst, nSrc, err := tc.t.Transform(b, []byte(tc.src), !tc.notEOF) + if err != tc.err { + t.Errorf("%d:%s: error was %v; want %v", i, tc.desc, err, tc.err) + } + if got := string(b[:nDst]); got != tc.want { + t.Errorf("%d:%s: result was %q: want %q", i, tc.desc, got, tc.want) + } + if nSrc != tc.nSrc { + t.Errorf("%d:%s: nSrc was %d; want %d", i, tc.desc, nSrc, tc.nSrc) + } + } +} + +func TestErrorHandler(t *testing.T) { + testCases := []struct { + desc string + handler func(*encoding.Encoder) *encoding.Encoder + sizeDst int + src, want string + nSrc int + err error + }{ + { + desc: "one rune replacement", + handler: encoding.ReplaceUnsupported, + sizeDst: 100, + src: "\uAC00", + want: "\x1a", + nSrc: 3, + }, + { + desc: "mid-stream rune replacement", + handler: encoding.ReplaceUnsupported, + sizeDst: 100, + src: "a\uAC00bcd\u00e9", + want: "a\x1abcd\xe9", + nSrc: 9, + }, + { + desc: "at end rune replacement", + handler: encoding.ReplaceUnsupported, + sizeDst: 10, + src: "\u00e9\uAC00", + want: "\xe9\x1a", + nSrc: 5, + }, + { + desc: "short buffer replacement", + handler: encoding.ReplaceUnsupported, + sizeDst: 1, + src: "\u00e9\uAC00", + want: "\xe9", + nSrc: 2, + err: transform.ErrShortDst, + }, + { + desc: "one rune html escape", + handler: encoding.HTMLEscapeUnsupported, + sizeDst: 100, + src: "\uAC00", + want: "가", + nSrc: 3, + }, + { + desc: "mid-stream html escape", + handler: encoding.HTMLEscapeUnsupported, + sizeDst: 100, + src: "\u00e9\uAC00dcba", + want: "\xe9가dcba", + nSrc: 9, + }, + { + desc: "short buffer html escape", + handler: encoding.HTMLEscapeUnsupported, + sizeDst: 9, + src: "ab\uAC01", + want: "ab", + nSrc: 2, + err: transform.ErrShortDst, + }, + } + for i, tc := range testCases { + tr := tc.handler(charmap.Windows1250.NewEncoder()) + b := make([]byte, tc.sizeDst) + nDst, nSrc, err := tr.Transform(b, []byte(tc.src), true) + if err != tc.err { + t.Errorf("%d:%s: error was %v; want %v", i, tc.desc, err, tc.err) + } + if got := string(b[:nDst]); got != tc.want { + t.Errorf("%d:%s: result was %q: want %q", i, tc.desc, got, tc.want) + } + if nSrc != tc.nSrc { + t.Errorf("%d:%s: nSrc was %d; want %d", i, tc.desc, nSrc, tc.nSrc) + } + + } +} +func TestBOMOverride(t *testing.T) { + dec := unicode.BOMOverride(charmap.CodePage437.NewDecoder()) + dst := make([]byte, 100) + for i, tc := range []struct { + src string + atEOF bool + dst string + nSrc int + err error + }{ + 0: {"H\x82ll\x93", true, "Héllô", 5, nil}, + 1: {"\uFEFFHéllö", true, "Héllö", 10, nil}, + 2: {"\xFE\xFF\x00H\x00e\x00l\x00l\x00o", true, "Hello", 12, nil}, + 3: {"\xFF\xFEH\x00e\x00l\x00l\x00o\x00", true, "Hello", 12, nil}, + 4: {"\uFEFF", true, "", 3, nil}, + 5: {"\xFE\xFF", true, "", 2, nil}, + 6: {"\xFF\xFE", true, "", 2, nil}, + 7: {"\xEF\xBB", true, "\u2229\u2557", 2, nil}, + 8: {"\xEF", true, "\u2229", 1, nil}, + 9: {"", true, "", 0, nil}, + 10: {"\xFE", true, "\u25a0", 1, nil}, + 11: {"\xFF", true, "\u00a0", 1, nil}, + 12: {"\xEF\xBB", false, "", 0, transform.ErrShortSrc}, + 13: {"\xEF", false, "", 0, transform.ErrShortSrc}, + 14: {"", false, "", 0, transform.ErrShortSrc}, + 15: {"\xFE", false, "", 0, transform.ErrShortSrc}, + 16: {"\xFF", false, "", 0, transform.ErrShortSrc}, + 17: {"\xFF\xFE", false, "", 0, transform.ErrShortSrc}, + } { + dec.Reset() + nDst, nSrc, err := dec.Transform(dst, []byte(tc.src), tc.atEOF) + got := string(dst[:nDst]) + if nSrc != tc.nSrc { + t.Errorf("%d: nSrc: got %d; want %d", i, nSrc, tc.nSrc) + } + if got != tc.dst { + t.Errorf("%d: got %+q; want %+q", i, got, tc.dst) + } + if err != tc.err { + t.Errorf("%d: error: got %v; want %v", i, err, tc.err) + } + } +} + +// testdataFiles are files in testdata/*.txt. +var testdataFiles = []struct { + enc encoding.Encoding + basename, ext string +}{ + {charmap.Windows1252, "candide", "windows-1252"}, + {japanese.EUCJP, "rashomon", "euc-jp"}, + {japanese.ISO2022JP, "rashomon", "iso-2022-jp"}, + {japanese.ShiftJIS, "rashomon", "shift-jis"}, + {korean.EUCKR, "unsu-joh-eun-nal", "euc-kr"}, + {simplifiedchinese.GBK, "sunzi-bingfa-simplified", "gbk"}, + {simplifiedchinese.HZGB2312, "sunzi-bingfa-gb-levels-1-and-2", "hz-gb2312"}, + {traditionalchinese.Big5, "sunzi-bingfa-traditional", "big5"}, + {utf16LEIB, "candide", "utf-16le"}, + {unicode.UTF8, "candide", "utf-8"}, + + // GB18030 is a superset of GBK and is nominally a Simplified Chinese + // encoding, but it can also represent the entire Basic Multilingual + // Plane, including codepoints like 'â' that aren't encodable by GBK. + // GB18030 on Simplified Chinese should perform similarly to GBK on + // Simplified Chinese. GB18030 on "candide" is more interesting. + {simplifiedchinese.GB18030, "candide", "gb18030"}, +} + +// Encoder or Decoder +type Transcoder interface { + transform.Transformer + Bytes([]byte) ([]byte, error) + String(string) (string, error) +} + +func load(direction string, enc encoding.Encoding) ([]byte, []byte, Transcoder, error) { + basename, ext, count := "", "", 0 + for _, tf := range testdataFiles { + if tf.enc == enc { + basename, ext = tf.basename, tf.ext + count++ + } + } + if count != 1 { + if count == 0 { + return nil, nil, nil, fmt.Errorf("no testdataFiles for %s", enc) + } + return nil, nil, nil, fmt.Errorf("too many testdataFiles for %s", enc) + } + dstFile := fmt.Sprintf("testdata/%s-%s.txt", basename, ext) + srcFile := fmt.Sprintf("testdata/%s-utf-8.txt", basename) + var coder Transcoder = encoding.ReplaceUnsupported(enc.NewEncoder()) + if direction == "Decode" { + dstFile, srcFile = srcFile, dstFile + coder = enc.NewDecoder() + } + dst, err := ioutil.ReadFile(dstFile) + if err != nil { + return nil, nil, nil, err + } + src, err := ioutil.ReadFile(srcFile) + if err != nil { + return nil, nil, nil, err + } + return dst, src, coder, nil +} + +func TestFiles(t *testing.T) { + for _, dir := range []string{"Decode", "Encode"} { + for _, tf := range testdataFiles { + dst, src, transformer, err := load(dir, tf.enc) + if err != nil { + t.Errorf("%s, %s: load: %v", dir, tf.enc, err) + continue + } + buf, err := transformer.Bytes(src) + if err != nil { + t.Errorf("%s, %s: transform: %v", dir, tf.enc, err) + continue + } + if !bytes.Equal(buf, dst) { + t.Errorf("%s, %s: transformed bytes did not match golden file", dir, tf.enc) + continue + } + } + } +} + +func benchmark(b *testing.B, direction string, enc encoding.Encoding) { + _, src, transformer, err := load(direction, enc) + if err != nil { + b.Fatal(err) + } + b.SetBytes(int64(len(src))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + r := transform.NewReader(bytes.NewReader(src), transformer) + io.Copy(ioutil.Discard, r) + } +} + +func BenchmarkBig5Decoder(b *testing.B) { benchmark(b, "Decode", traditionalchinese.Big5) } +func BenchmarkBig5Encoder(b *testing.B) { benchmark(b, "Encode", traditionalchinese.Big5) } +func BenchmarkCharmapDecoder(b *testing.B) { benchmark(b, "Decode", charmap.Windows1252) } +func BenchmarkCharmapEncoder(b *testing.B) { benchmark(b, "Encode", charmap.Windows1252) } +func BenchmarkEUCJPDecoder(b *testing.B) { benchmark(b, "Decode", japanese.EUCJP) } +func BenchmarkEUCJPEncoder(b *testing.B) { benchmark(b, "Encode", japanese.EUCJP) } +func BenchmarkEUCKRDecoder(b *testing.B) { benchmark(b, "Decode", korean.EUCKR) } +func BenchmarkEUCKREncoder(b *testing.B) { benchmark(b, "Encode", korean.EUCKR) } +func BenchmarkGB18030Decoder(b *testing.B) { benchmark(b, "Decode", simplifiedchinese.GB18030) } +func BenchmarkGB18030Encoder(b *testing.B) { benchmark(b, "Encode", simplifiedchinese.GB18030) } +func BenchmarkGBKDecoder(b *testing.B) { benchmark(b, "Decode", simplifiedchinese.GBK) } +func BenchmarkGBKEncoder(b *testing.B) { benchmark(b, "Encode", simplifiedchinese.GBK) } +func BenchmarkHZGB2312Decoder(b *testing.B) { benchmark(b, "Decode", simplifiedchinese.HZGB2312) } +func BenchmarkHZGB2312Encoder(b *testing.B) { benchmark(b, "Encode", simplifiedchinese.HZGB2312) } +func BenchmarkISO2022JPDecoder(b *testing.B) { benchmark(b, "Decode", japanese.ISO2022JP) } +func BenchmarkISO2022JPEncoder(b *testing.B) { benchmark(b, "Encode", japanese.ISO2022JP) } +func BenchmarkShiftJISDecoder(b *testing.B) { benchmark(b, "Decode", japanese.ShiftJIS) } +func BenchmarkShiftJISEncoder(b *testing.B) { benchmark(b, "Encode", japanese.ShiftJIS) } +func BenchmarkUTF8Decoder(b *testing.B) { benchmark(b, "Decode", unicode.UTF8) } +func BenchmarkUTF8Encoder(b *testing.B) { benchmark(b, "Encode", unicode.UTF8) } +func BenchmarkUTF16Decoder(b *testing.B) { benchmark(b, "Decode", utf16LEIB) } +func BenchmarkUTF16Encoder(b *testing.B) { benchmark(b, "Encode", utf16LEIB) } diff --git a/vendor/golang.org/x/text/encoding/example_test.go b/vendor/golang.org/x/text/encoding/example_test.go new file mode 100644 index 0000000000..4f923530f0 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/example_test.go @@ -0,0 +1,42 @@ +// Copyright 2013 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 encoding_test + +import ( + "fmt" + "io" + "os" + "strings" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/charmap" + "golang.org/x/text/encoding/unicode" + "golang.org/x/text/transform" +) + +func ExampleDecodeWindows1252() { + sr := strings.NewReader("Gar\xe7on !") + tr := charmap.Windows1252.NewDecoder().Reader(sr) + io.Copy(os.Stdout, tr) + // Output: Garçon ! +} + +func ExampleUTF8Validator() { + for i := 0; i < 2; i++ { + var transformer transform.Transformer + transformer = unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM).NewEncoder() + if i == 1 { + transformer = transform.Chain(encoding.UTF8Validator, transformer) + } + dst := make([]byte, 256) + src := []byte("abc\xffxyz") // src is invalid UTF-8. + nDst, nSrc, err := transformer.Transform(dst, src, true) + fmt.Printf("i=%d: produced %q, consumed %q, error %v\n", + i, dst[:nDst], src[:nSrc], err) + } + // Output: + // i=0: produced "\x00a\x00b\x00c\xff\xfd\x00x\x00y\x00z", consumed "abc\xffxyz", error <nil> + // i=1: produced "\x00a\x00b\x00c", consumed "abc", error encoding: invalid UTF-8 +} diff --git a/vendor/golang.org/x/text/encoding/htmlindex/gen.go b/vendor/golang.org/x/text/encoding/htmlindex/gen.go new file mode 100644 index 0000000000..d10e5e09f7 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/htmlindex/gen.go @@ -0,0 +1,167 @@ +// 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 ignore + +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "log" + "strings" + + "golang.org/x/text/internal/gen" +) + +type group struct { + Encodings []struct { + Labels []string + Name string + } +} + +func main() { + gen.Init() + + r := gen.Open("http://www.w3.org/TR", "w3", "encoding/indexes/encodings.json") + var groups []group + if err := json.NewDecoder(r).Decode(&groups); err != nil { + log.Fatalf("Error reading encodings.json: %v", err) + } + + w := &bytes.Buffer{} + fmt.Fprintln(w, "type htmlEncoding byte") + fmt.Fprintln(w, "const (") + for i, g := range groups { + for _, e := range g.Encodings { + name := consts[e.Name] + if name == "" { + log.Fatalf("No const defined for %s.", e.Name) + } + if i == 0 { + fmt.Fprintf(w, "%s htmlEncoding = iota\n", name) + } else { + fmt.Fprintf(w, "%s\n", name) + } + } + } + fmt.Fprintln(w, "numEncodings") + fmt.Fprint(w, ")\n\n") + + fmt.Fprintln(w, "var canonical = [numEncodings]string{") + for _, g := range groups { + for _, e := range g.Encodings { + fmt.Fprintf(w, "%q,\n", e.Name) + } + } + fmt.Fprint(w, "}\n\n") + + fmt.Fprintln(w, "var nameMap = map[string]htmlEncoding{") + for _, g := range groups { + for _, e := range g.Encodings { + for _, l := range e.Labels { + fmt.Fprintf(w, "%q: %s,\n", l, consts[e.Name]) + } + } + } + fmt.Fprint(w, "}\n\n") + + var tags []string + fmt.Fprintln(w, "var localeMap = []htmlEncoding{") + for _, loc := range locales { + tags = append(tags, loc.tag) + fmt.Fprintf(w, "%s, // %s \n", consts[loc.name], loc.tag) + } + fmt.Fprint(w, "}\n\n") + + fmt.Fprintf(w, "const locales = %q\n", strings.Join(tags, " ")) + + gen.WriteGoFile("tables.go", "htmlindex", w.Bytes()) +} + +// consts maps canonical encoding name to internal constant. +var consts = map[string]string{ + "utf-8": "utf8", + "ibm866": "ibm866", + "iso-8859-2": "iso8859_2", + "iso-8859-3": "iso8859_3", + "iso-8859-4": "iso8859_4", + "iso-8859-5": "iso8859_5", + "iso-8859-6": "iso8859_6", + "iso-8859-7": "iso8859_7", + "iso-8859-8": "iso8859_8", + "iso-8859-8-i": "iso8859_8I", + "iso-8859-10": "iso8859_10", + "iso-8859-13": "iso8859_13", + "iso-8859-14": "iso8859_14", + "iso-8859-15": "iso8859_15", + "iso-8859-16": "iso8859_16", + "koi8-r": "koi8r", + "koi8-u": "koi8u", + "macintosh": "macintosh", + "windows-874": "windows874", + "windows-1250": "windows1250", + "windows-1251": "windows1251", + "windows-1252": "windows1252", + "windows-1253": "windows1253", + "windows-1254": "windows1254", + "windows-1255": "windows1255", + "windows-1256": "windows1256", + "windows-1257": "windows1257", + "windows-1258": "windows1258", + "x-mac-cyrillic": "macintoshCyrillic", + "gbk": "gbk", + "gb18030": "gb18030", + // "hz-gb-2312": "hzgb2312", // Was removed from WhatWG + "big5": "big5", + "euc-jp": "eucjp", + "iso-2022-jp": "iso2022jp", + "shift_jis": "shiftJIS", + "euc-kr": "euckr", + "replacement": "replacement", + "utf-16be": "utf16be", + "utf-16le": "utf16le", + "x-user-defined": "xUserDefined", +} + +// locales is taken from +// https://html.spec.whatwg.org/multipage/syntax.html#encoding-sniffing-algorithm. +var locales = []struct{ tag, name string }{ + {"und", "windows-1252"}, // The default value. + {"ar", "windows-1256"}, + {"ba", "windows-1251"}, + {"be", "windows-1251"}, + {"bg", "windows-1251"}, + {"cs", "windows-1250"}, + {"el", "iso-8859-7"}, + {"et", "windows-1257"}, + {"fa", "windows-1256"}, + {"he", "windows-1255"}, + {"hr", "windows-1250"}, + {"hu", "iso-8859-2"}, + {"ja", "shift_jis"}, + {"kk", "windows-1251"}, + {"ko", "euc-kr"}, + {"ku", "windows-1254"}, + {"ky", "windows-1251"}, + {"lt", "windows-1257"}, + {"lv", "windows-1257"}, + {"mk", "windows-1251"}, + {"pl", "iso-8859-2"}, + {"ru", "windows-1251"}, + {"sah", "windows-1251"}, + {"sk", "windows-1250"}, + {"sl", "iso-8859-2"}, + {"sr", "windows-1251"}, + {"tg", "windows-1251"}, + {"th", "windows-874"}, + {"tr", "windows-1254"}, + {"tt", "windows-1251"}, + {"uk", "windows-1251"}, + {"vi", "windows-1258"}, + {"zh-hans", "gb18030"}, + {"zh-hant", "big5"}, +} diff --git a/vendor/golang.org/x/text/encoding/htmlindex/htmlindex.go b/vendor/golang.org/x/text/encoding/htmlindex/htmlindex.go new file mode 100644 index 0000000000..70f2ac4bc7 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/htmlindex/htmlindex.go @@ -0,0 +1,86 @@ +// 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. + +//go:generate go run gen.go + +// Package htmlindex maps character set encoding names to Encodings as +// recommended by the W3C for use in HTML 5. See http://www.w3.org/TR/encoding. +package htmlindex + +// TODO: perhaps have a "bare" version of the index (used by this package) that +// is not pre-loaded with all encodings. Global variables in encodings prevent +// the linker from being able to purge unneeded tables. This means that +// referencing all encodings, as this package does for the default index, links +// in all encodings unconditionally. +// +// This issue can be solved by either solving the linking issue (see +// https://github.com/golang/go/issues/6330) or refactoring the encoding tables +// (e.g. moving the tables to internal packages that do not use global +// variables). + +// TODO: allow canonicalizing names + +import ( + "errors" + "strings" + "sync" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal/identifier" + "golang.org/x/text/language" +) + +var ( + errInvalidName = errors.New("htmlindex: invalid encoding name") + errUnknown = errors.New("htmlindex: unknown Encoding") + errUnsupported = errors.New("htmlindex: this encoding is not supported") +) + +var ( + matcherOnce sync.Once + matcher language.Matcher +) + +// LanguageDefault returns the canonical name of the default encoding for a +// given language. +func LanguageDefault(tag language.Tag) string { + matcherOnce.Do(func() { + tags := []language.Tag{} + for _, t := range strings.Split(locales, " ") { + tags = append(tags, language.MustParse(t)) + } + matcher = language.NewMatcher(tags) + }) + _, i, _ := matcher.Match(tag) + return canonical[localeMap[i]] // Default is Windows-1252. +} + +// Get returns an Encoding for one of the names listed in +// http://www.w3.org/TR/encoding using the Default Index. Matching is case- +// insensitive. +func Get(name string) (encoding.Encoding, error) { + x, ok := nameMap[strings.ToLower(strings.TrimSpace(name))] + if !ok { + return nil, errInvalidName + } + return encodings[x], nil +} + +// Name reports the canonical name of the given Encoding. It will return +// an error if e is not associated with a supported encoding scheme. +func Name(e encoding.Encoding) (string, error) { + id, ok := e.(identifier.Interface) + if !ok { + return "", errUnknown + } + mib, _ := id.ID() + if mib == 0 { + return "", errUnknown + } + v, ok := mibMap[mib] + if !ok { + return "", errUnsupported + } + return canonical[v], nil +} diff --git a/vendor/golang.org/x/text/encoding/htmlindex/htmlindex_test.go b/vendor/golang.org/x/text/encoding/htmlindex/htmlindex_test.go new file mode 100644 index 0000000000..3fdab0f49d --- /dev/null +++ b/vendor/golang.org/x/text/encoding/htmlindex/htmlindex_test.go @@ -0,0 +1,144 @@ +// 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 htmlindex + +import ( + "testing" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/charmap" + "golang.org/x/text/encoding/internal/identifier" + "golang.org/x/text/encoding/unicode" + "golang.org/x/text/language" +) + +func TestGet(t *testing.T) { + for i, tc := range []struct { + name string + canonical string + err error + }{ + {"utf-8", "utf-8", nil}, + {" utf-8 ", "utf-8", nil}, + {" l5 ", "windows-1254", nil}, + {"latin5 ", "windows-1254", nil}, + {"latin 5", "", errInvalidName}, + {"latin-5", "", errInvalidName}, + } { + enc, err := Get(tc.name) + if err != tc.err { + t.Errorf("%d: error was %v; want %v", i, err, tc.err) + } + if err != nil { + continue + } + if got, err := Name(enc); got != tc.canonical { + t.Errorf("%d: Name(Get(%q)) = %q; want %q (%v)", i, tc.name, got, tc.canonical, err) + } + } +} + +func TestTables(t *testing.T) { + for name, index := range nameMap { + got, err := Get(name) + if err != nil { + t.Errorf("%s:err: expected non-nil error", name) + } + if want := encodings[index]; got != want { + t.Errorf("%s:encoding: got %v; want %v", name, got, want) + } + mib, _ := got.(identifier.Interface).ID() + if mibMap[mib] != index { + t.Errorf("%s:mibMab: got %d; want %d", name, mibMap[mib], index) + } + } +} + +func TestName(t *testing.T) { + for i, tc := range []struct { + desc string + enc encoding.Encoding + name string + err error + }{{ + "defined encoding", + charmap.ISO8859_2, + "iso-8859-2", + nil, + }, { + "defined Unicode encoding", + unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM), + "utf-16be", + nil, + }, { + "undefined Unicode encoding in HTML standard", + unicode.UTF16(unicode.BigEndian, unicode.UseBOM), + "", + errUnsupported, + }, { + "undefined other encoding in HTML standard", + charmap.CodePage437, + "", + errUnsupported, + }, { + "unknown encoding", + encoding.Nop, + "", + errUnknown, + }} { + name, err := Name(tc.enc) + if name != tc.name || err != tc.err { + t.Errorf("%d:%s: got %q, %v; want %q, %v", i, tc.desc, name, err, tc.name, tc.err) + } + } +} + +func TestLanguageDefault(t *testing.T) { + for _, tc := range []struct{ tag, want string }{ + {"und", "windows-1252"}, // The default value. + {"ar", "windows-1256"}, + {"ba", "windows-1251"}, + {"be", "windows-1251"}, + {"bg", "windows-1251"}, + {"cs", "windows-1250"}, + {"el", "iso-8859-7"}, + {"et", "windows-1257"}, + {"fa", "windows-1256"}, + {"he", "windows-1255"}, + {"hr", "windows-1250"}, + {"hu", "iso-8859-2"}, + {"ja", "shift_jis"}, + {"kk", "windows-1251"}, + {"ko", "euc-kr"}, + {"ku", "windows-1254"}, + {"ky", "windows-1251"}, + {"lt", "windows-1257"}, + {"lv", "windows-1257"}, + {"mk", "windows-1251"}, + {"pl", "iso-8859-2"}, + {"ru", "windows-1251"}, + {"sah", "windows-1251"}, + {"sk", "windows-1250"}, + {"sl", "iso-8859-2"}, + {"sr", "windows-1251"}, + {"tg", "windows-1251"}, + {"th", "windows-874"}, + {"tr", "windows-1254"}, + {"tt", "windows-1251"}, + {"uk", "windows-1251"}, + {"vi", "windows-1258"}, + {"zh-hans", "gb18030"}, + {"zh-hant", "big5"}, + // Variants and close approximates of the above. + {"ar_EG", "windows-1256"}, + {"bs", "windows-1250"}, // Bosnian Latin maps to Croatian. + // Use default fallback in case of miss. + {"nl", "windows-1252"}, + } { + if got := LanguageDefault(language.MustParse(tc.tag)); got != tc.want { + t.Errorf("LanguageDefault(%s) = %s; want %s", tc.tag, got, tc.want) + } + } +} diff --git a/vendor/golang.org/x/text/encoding/htmlindex/map.go b/vendor/golang.org/x/text/encoding/htmlindex/map.go new file mode 100644 index 0000000000..c61439045d --- /dev/null +++ b/vendor/golang.org/x/text/encoding/htmlindex/map.go @@ -0,0 +1,105 @@ +// 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 htmlindex + +import ( + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/charmap" + "golang.org/x/text/encoding/internal/identifier" + "golang.org/x/text/encoding/japanese" + "golang.org/x/text/encoding/korean" + "golang.org/x/text/encoding/simplifiedchinese" + "golang.org/x/text/encoding/traditionalchinese" + "golang.org/x/text/encoding/unicode" +) + +// mibMap maps a MIB identifier to an htmlEncoding index. +var mibMap = map[identifier.MIB]htmlEncoding{ + identifier.UTF8: utf8, + identifier.UTF16BE: utf16be, + identifier.UTF16LE: utf16le, + identifier.IBM866: ibm866, + identifier.ISOLatin2: iso8859_2, + identifier.ISOLatin3: iso8859_3, + identifier.ISOLatin4: iso8859_4, + identifier.ISOLatinCyrillic: iso8859_5, + identifier.ISOLatinArabic: iso8859_6, + identifier.ISOLatinGreek: iso8859_7, + identifier.ISOLatinHebrew: iso8859_8, + identifier.ISO88598I: iso8859_8I, + identifier.ISOLatin6: iso8859_10, + identifier.ISO885913: iso8859_13, + identifier.ISO885914: iso8859_14, + identifier.ISO885915: iso8859_15, + identifier.ISO885916: iso8859_16, + identifier.KOI8R: koi8r, + identifier.KOI8U: koi8u, + identifier.Macintosh: macintosh, + identifier.MacintoshCyrillic: macintoshCyrillic, + identifier.Windows874: windows874, + identifier.Windows1250: windows1250, + identifier.Windows1251: windows1251, + identifier.Windows1252: windows1252, + identifier.Windows1253: windows1253, + identifier.Windows1254: windows1254, + identifier.Windows1255: windows1255, + identifier.Windows1256: windows1256, + identifier.Windows1257: windows1257, + identifier.Windows1258: windows1258, + identifier.XUserDefined: xUserDefined, + identifier.GBK: gbk, + identifier.GB18030: gb18030, + identifier.Big5: big5, + identifier.EUCPkdFmtJapanese: eucjp, + identifier.ISO2022JP: iso2022jp, + identifier.ShiftJIS: shiftJIS, + identifier.EUCKR: euckr, + identifier.Replacement: replacement, +} + +// encodings maps the internal htmlEncoding to an Encoding. +// TODO: consider using a reusable index in encoding/internal. +var encodings = [numEncodings]encoding.Encoding{ + utf8: unicode.UTF8, + ibm866: charmap.CodePage866, + iso8859_2: charmap.ISO8859_2, + iso8859_3: charmap.ISO8859_3, + iso8859_4: charmap.ISO8859_4, + iso8859_5: charmap.ISO8859_5, + iso8859_6: charmap.ISO8859_6, + iso8859_7: charmap.ISO8859_7, + iso8859_8: charmap.ISO8859_8, + iso8859_8I: charmap.ISO8859_8I, + iso8859_10: charmap.ISO8859_10, + iso8859_13: charmap.ISO8859_13, + iso8859_14: charmap.ISO8859_14, + iso8859_15: charmap.ISO8859_15, + iso8859_16: charmap.ISO8859_16, + koi8r: charmap.KOI8R, + koi8u: charmap.KOI8U, + macintosh: charmap.Macintosh, + windows874: charmap.Windows874, + windows1250: charmap.Windows1250, + windows1251: charmap.Windows1251, + windows1252: charmap.Windows1252, + windows1253: charmap.Windows1253, + windows1254: charmap.Windows1254, + windows1255: charmap.Windows1255, + windows1256: charmap.Windows1256, + windows1257: charmap.Windows1257, + windows1258: charmap.Windows1258, + macintoshCyrillic: charmap.MacintoshCyrillic, + gbk: simplifiedchinese.GBK, + gb18030: simplifiedchinese.GB18030, + big5: traditionalchinese.Big5, + eucjp: japanese.EUCJP, + iso2022jp: japanese.ISO2022JP, + shiftJIS: japanese.ShiftJIS, + euckr: korean.EUCKR, + replacement: encoding.Replacement, + utf16be: unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM), + utf16le: unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM), + xUserDefined: charmap.XUserDefined, +} diff --git a/vendor/golang.org/x/text/encoding/htmlindex/tables.go b/vendor/golang.org/x/text/encoding/htmlindex/tables.go new file mode 100644 index 0000000000..78950d3c3d --- /dev/null +++ b/vendor/golang.org/x/text/encoding/htmlindex/tables.go @@ -0,0 +1,352 @@ +// This file was generated by go generate; DO NOT EDIT + +package htmlindex + +type htmlEncoding byte + +const ( + utf8 htmlEncoding = iota + ibm866 + iso8859_2 + iso8859_3 + iso8859_4 + iso8859_5 + iso8859_6 + iso8859_7 + iso8859_8 + iso8859_8I + iso8859_10 + iso8859_13 + iso8859_14 + iso8859_15 + iso8859_16 + koi8r + koi8u + macintosh + windows874 + windows1250 + windows1251 + windows1252 + windows1253 + windows1254 + windows1255 + windows1256 + windows1257 + windows1258 + macintoshCyrillic + gbk + gb18030 + big5 + eucjp + iso2022jp + shiftJIS + euckr + replacement + utf16be + utf16le + xUserDefined + numEncodings +) + +var canonical = [numEncodings]string{ + "utf-8", + "ibm866", + "iso-8859-2", + "iso-8859-3", + "iso-8859-4", + "iso-8859-5", + "iso-8859-6", + "iso-8859-7", + "iso-8859-8", + "iso-8859-8-i", + "iso-8859-10", + "iso-8859-13", + "iso-8859-14", + "iso-8859-15", + "iso-8859-16", + "koi8-r", + "koi8-u", + "macintosh", + "windows-874", + "windows-1250", + "windows-1251", + "windows-1252", + "windows-1253", + "windows-1254", + "windows-1255", + "windows-1256", + "windows-1257", + "windows-1258", + "x-mac-cyrillic", + "gbk", + "gb18030", + "big5", + "euc-jp", + "iso-2022-jp", + "shift_jis", + "euc-kr", + "replacement", + "utf-16be", + "utf-16le", + "x-user-defined", +} + +var nameMap = map[string]htmlEncoding{ + "unicode-1-1-utf-8": utf8, + "utf-8": utf8, + "utf8": utf8, + "866": ibm866, + "cp866": ibm866, + "csibm866": ibm866, + "ibm866": ibm866, + "csisolatin2": iso8859_2, + "iso-8859-2": iso8859_2, + "iso-ir-101": iso8859_2, + "iso8859-2": iso8859_2, + "iso88592": iso8859_2, + "iso_8859-2": iso8859_2, + "iso_8859-2:1987": iso8859_2, + "l2": iso8859_2, + "latin2": iso8859_2, + "csisolatin3": iso8859_3, + "iso-8859-3": iso8859_3, + "iso-ir-109": iso8859_3, + "iso8859-3": iso8859_3, + "iso88593": iso8859_3, + "iso_8859-3": iso8859_3, + "iso_8859-3:1988": iso8859_3, + "l3": iso8859_3, + "latin3": iso8859_3, + "csisolatin4": iso8859_4, + "iso-8859-4": iso8859_4, + "iso-ir-110": iso8859_4, + "iso8859-4": iso8859_4, + "iso88594": iso8859_4, + "iso_8859-4": iso8859_4, + "iso_8859-4:1988": iso8859_4, + "l4": iso8859_4, + "latin4": iso8859_4, + "csisolatincyrillic": iso8859_5, + "cyrillic": iso8859_5, + "iso-8859-5": iso8859_5, + "iso-ir-144": iso8859_5, + "iso8859-5": iso8859_5, + "iso88595": iso8859_5, + "iso_8859-5": iso8859_5, + "iso_8859-5:1988": iso8859_5, + "arabic": iso8859_6, + "asmo-708": iso8859_6, + "csiso88596e": iso8859_6, + "csiso88596i": iso8859_6, + "csisolatinarabic": iso8859_6, + "ecma-114": iso8859_6, + "iso-8859-6": iso8859_6, + "iso-8859-6-e": iso8859_6, + "iso-8859-6-i": iso8859_6, + "iso-ir-127": iso8859_6, + "iso8859-6": iso8859_6, + "iso88596": iso8859_6, + "iso_8859-6": iso8859_6, + "iso_8859-6:1987": iso8859_6, + "csisolatingreek": iso8859_7, + "ecma-118": iso8859_7, + "elot_928": iso8859_7, + "greek": iso8859_7, + "greek8": iso8859_7, + "iso-8859-7": iso8859_7, + "iso-ir-126": iso8859_7, + "iso8859-7": iso8859_7, + "iso88597": iso8859_7, + "iso_8859-7": iso8859_7, + "iso_8859-7:1987": iso8859_7, + "sun_eu_greek": iso8859_7, + "csiso88598e": iso8859_8, + "csisolatinhebrew": iso8859_8, + "hebrew": iso8859_8, + "iso-8859-8": iso8859_8, + "iso-8859-8-e": iso8859_8, + "iso-ir-138": iso8859_8, + "iso8859-8": iso8859_8, + "iso88598": iso8859_8, + "iso_8859-8": iso8859_8, + "iso_8859-8:1988": iso8859_8, + "visual": iso8859_8, + "csiso88598i": iso8859_8I, + "iso-8859-8-i": iso8859_8I, + "logical": iso8859_8I, + "csisolatin6": iso8859_10, + "iso-8859-10": iso8859_10, + "iso-ir-157": iso8859_10, + "iso8859-10": iso8859_10, + "iso885910": iso8859_10, + "l6": iso8859_10, + "latin6": iso8859_10, + "iso-8859-13": iso8859_13, + "iso8859-13": iso8859_13, + "iso885913": iso8859_13, + "iso-8859-14": iso8859_14, + "iso8859-14": iso8859_14, + "iso885914": iso8859_14, + "csisolatin9": iso8859_15, + "iso-8859-15": iso8859_15, + "iso8859-15": iso8859_15, + "iso885915": iso8859_15, + "iso_8859-15": iso8859_15, + "l9": iso8859_15, + "iso-8859-16": iso8859_16, + "cskoi8r": koi8r, + "koi": koi8r, + "koi8": koi8r, + "koi8-r": koi8r, + "koi8_r": koi8r, + "koi8-ru": koi8u, + "koi8-u": koi8u, + "csmacintosh": macintosh, + "mac": macintosh, + "macintosh": macintosh, + "x-mac-roman": macintosh, + "dos-874": windows874, + "iso-8859-11": windows874, + "iso8859-11": windows874, + "iso885911": windows874, + "tis-620": windows874, + "windows-874": windows874, + "cp1250": windows1250, + "windows-1250": windows1250, + "x-cp1250": windows1250, + "cp1251": windows1251, + "windows-1251": windows1251, + "x-cp1251": windows1251, + "ansi_x3.4-1968": windows1252, + "ascii": windows1252, + "cp1252": windows1252, + "cp819": windows1252, + "csisolatin1": windows1252, + "ibm819": windows1252, + "iso-8859-1": windows1252, + "iso-ir-100": windows1252, + "iso8859-1": windows1252, + "iso88591": windows1252, + "iso_8859-1": windows1252, + "iso_8859-1:1987": windows1252, + "l1": windows1252, + "latin1": windows1252, + "us-ascii": windows1252, + "windows-1252": windows1252, + "x-cp1252": windows1252, + "cp1253": windows1253, + "windows-1253": windows1253, + "x-cp1253": windows1253, + "cp1254": windows1254, + "csisolatin5": windows1254, + "iso-8859-9": windows1254, + "iso-ir-148": windows1254, + "iso8859-9": windows1254, + "iso88599": windows1254, + "iso_8859-9": windows1254, + "iso_8859-9:1989": windows1254, + "l5": windows1254, + "latin5": windows1254, + "windows-1254": windows1254, + "x-cp1254": windows1254, + "cp1255": windows1255, + "windows-1255": windows1255, + "x-cp1255": windows1255, + "cp1256": windows1256, + "windows-1256": windows1256, + "x-cp1256": windows1256, + "cp1257": windows1257, + "windows-1257": windows1257, + "x-cp1257": windows1257, + "cp1258": windows1258, + "windows-1258": windows1258, + "x-cp1258": windows1258, + "x-mac-cyrillic": macintoshCyrillic, + "x-mac-ukrainian": macintoshCyrillic, + "chinese": gbk, + "csgb2312": gbk, + "csiso58gb231280": gbk, + "gb2312": gbk, + "gb_2312": gbk, + "gb_2312-80": gbk, + "gbk": gbk, + "iso-ir-58": gbk, + "x-gbk": gbk, + "gb18030": gb18030, + "big5": big5, + "big5-hkscs": big5, + "cn-big5": big5, + "csbig5": big5, + "x-x-big5": big5, + "cseucpkdfmtjapanese": eucjp, + "euc-jp": eucjp, + "x-euc-jp": eucjp, + "csiso2022jp": iso2022jp, + "iso-2022-jp": iso2022jp, + "csshiftjis": shiftJIS, + "ms932": shiftJIS, + "ms_kanji": shiftJIS, + "shift-jis": shiftJIS, + "shift_jis": shiftJIS, + "sjis": shiftJIS, + "windows-31j": shiftJIS, + "x-sjis": shiftJIS, + "cseuckr": euckr, + "csksc56011987": euckr, + "euc-kr": euckr, + "iso-ir-149": euckr, + "korean": euckr, + "ks_c_5601-1987": euckr, + "ks_c_5601-1989": euckr, + "ksc5601": euckr, + "ksc_5601": euckr, + "windows-949": euckr, + "csiso2022kr": replacement, + "hz-gb-2312": replacement, + "iso-2022-cn": replacement, + "iso-2022-cn-ext": replacement, + "iso-2022-kr": replacement, + "utf-16be": utf16be, + "utf-16": utf16le, + "utf-16le": utf16le, + "x-user-defined": xUserDefined, +} + +var localeMap = []htmlEncoding{ + windows1252, // und + windows1256, // ar + windows1251, // ba + windows1251, // be + windows1251, // bg + windows1250, // cs + iso8859_7, // el + windows1257, // et + windows1256, // fa + windows1255, // he + windows1250, // hr + iso8859_2, // hu + shiftJIS, // ja + windows1251, // kk + euckr, // ko + windows1254, // ku + windows1251, // ky + windows1257, // lt + windows1257, // lv + windows1251, // mk + iso8859_2, // pl + windows1251, // ru + windows1251, // sah + windows1250, // sk + iso8859_2, // sl + windows1251, // sr + windows1251, // tg + windows874, // th + windows1254, // tr + windows1251, // tt + windows1251, // uk + windows1258, // vi + gb18030, // zh-hans + big5, // zh-hant +} + +const locales = "und ar ba be bg cs el et fa he hr hu ja kk ko ku ky lt lv mk pl ru sah sk sl sr tg th tr tt uk vi zh-hans zh-hant" diff --git a/vendor/golang.org/x/text/encoding/ianaindex/example_test.go b/vendor/golang.org/x/text/encoding/ianaindex/example_test.go new file mode 100644 index 0000000000..b305732160 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/ianaindex/example_test.go @@ -0,0 +1,26 @@ +// 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 ianaindex_test + +import ( + "fmt" + + "golang.org/x/text/encoding/charmap" + "golang.org/x/text/encoding/ianaindex" +) + +func ExampleIndex() { + fmt.Println(ianaindex.MIME.Name(charmap.ISO8859_7)) + + fmt.Println(ianaindex.IANA.Name(charmap.ISO8859_7)) + + e, _ := ianaindex.IANA.Get("cp437") + fmt.Println(ianaindex.IANA.Name(e)) + + // TODO: Output: + // ISO-8859-7 + // ISO8859_7:1987 + // IBM437 +} diff --git a/vendor/golang.org/x/text/encoding/ianaindex/ianaindex.go b/vendor/golang.org/x/text/encoding/ianaindex/ianaindex.go new file mode 100644 index 0000000000..da899e09e2 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/ianaindex/ianaindex.go @@ -0,0 +1,64 @@ +// 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 ianaindex maps names to Encodings as specified by the IANA registry. +// This includes both the MIME and IANA names. +// +// See http://www.iana.org/assignments/character-sets/character-sets.xhtml for +// more details. +package ianaindex + +import ( + "golang.org/x/text/encoding" +) + +// TODO: allow users to specify their own aliases? +// TODO: allow users to specify their own indexes? +// TODO: allow canonicalizing names + +// NOTE: only use these top-level variables if we can get the linker to drop +// the indexes when they are not used. Make them a function or perhaps only +// support MIME otherwise. + +var ( + // MIME is an index to map MIME names. It does not support aliases. + MIME *Index + + // IANA is an index that supports all names and aliases using IANA names as + // the canonical identifier. + IANA *Index +) + +// Index maps names registered by IANA to Encodings. +type Index struct { +} + +// Get returns an Encoding for IANA-registered names. Matching is +// case-insensitive. +func (x *Index) Get(name string) (encoding.Encoding, error) { + panic("TODO: implement") +} + +// Name reports the canonical name of the given Encoding. It will return an +// error if the e is not associated with a known encoding scheme. +func (x *Index) Name(e encoding.Encoding) (string, error) { + panic("TODO: implement") +} + +// TODO: the coverage of this index is rather spotty. Allowing users to set +// encodings would allow: +// - users to increase coverage +// - allow a partially loaded set of encodings in case the user doesn't need to +// them all. +// - write an OS-specific wrapper for supported encodings and set them. +// The exact definition of Set depends a bit on if and how we want to let users +// write their own Encoding implementations. Also, it is not possible yet to +// only partially load the encodings without doing some refactoring. Until this +// is solved, we might as well not support Set. +// // Set sets the e to be used for the encoding scheme identified by name. Only +// // canonical names may be used. An empty name assigns e to its internally +// // associated encoding scheme. +// func (x *Index) Set(name string, e encoding.Encoding) error { +// panic("TODO: implement") +// } diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/gen.go b/vendor/golang.org/x/text/encoding/internal/identifier/gen.go new file mode 100644 index 0000000000..0c8eba7e52 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/internal/identifier/gen.go @@ -0,0 +1,137 @@ +// 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 ignore + +package main + +import ( + "bytes" + "encoding/xml" + "fmt" + "io" + "log" + "strings" + + "golang.org/x/text/internal/gen" +) + +type registry struct { + XMLName xml.Name `xml:"registry"` + Updated string `xml:"updated"` + Registry []struct { + ID string `xml:"id,attr"` + Record []struct { + Name string `xml:"name"` + Xref []struct { + Type string `xml:"type,attr"` + Data string `xml:"data,attr"` + } `xml:"xref"` + Desc struct { + Data string `xml:",innerxml"` + // Any []struct { + // Data string `xml:",chardata"` + // } `xml:",any"` + // Data string `xml:",chardata"` + } `xml:"description,"` + MIB string `xml:"value"` + Alias []string `xml:"alias"` + MIME string `xml:"preferred_alias"` + } `xml:"record"` + } `xml:"registry"` +} + +func main() { + r := gen.OpenIANAFile("assignments/character-sets/character-sets.xml") + reg := ®istry{} + if err := xml.NewDecoder(r).Decode(®); err != nil && err != io.EOF { + log.Fatalf("Error decoding charset registry: %v", err) + } + if len(reg.Registry) == 0 || reg.Registry[0].ID != "character-sets-1" { + log.Fatalf("Unexpected ID %s", reg.Registry[0].ID) + } + + w := &bytes.Buffer{} + fmt.Fprintf(w, "const (\n") + for _, rec := range reg.Registry[0].Record { + constName := "" + for _, a := range rec.Alias { + if strings.HasPrefix(a, "cs") && strings.IndexByte(a, '-') == -1 { + // Some of the constant definitions have comments in them. Strip those. + constName = strings.Title(strings.SplitN(a[2:], "\n", 2)[0]) + } + } + if constName == "" { + switch rec.MIB { + case "2085": + constName = "HZGB2312" // Not listed as alias for some reason. + default: + log.Fatalf("No cs alias defined for %s.", rec.MIB) + } + } + if rec.MIME != "" { + rec.MIME = fmt.Sprintf(" (MIME: %s)", rec.MIME) + } + fmt.Fprintf(w, "// %s is the MIB identifier with IANA name %s%s.\n//\n", constName, rec.Name, rec.MIME) + if len(rec.Desc.Data) > 0 { + fmt.Fprint(w, "// ") + d := xml.NewDecoder(strings.NewReader(rec.Desc.Data)) + inElem := true + attr := "" + for { + t, err := d.Token() + if err != nil { + if err != io.EOF { + log.Fatal(err) + } + break + } + switch x := t.(type) { + case xml.CharData: + attr = "" // Don't need attribute info. + a := bytes.Split([]byte(x), []byte("\n")) + for i, b := range a { + if b = bytes.TrimSpace(b); len(b) != 0 { + if !inElem && i > 0 { + fmt.Fprint(w, "\n// ") + } + inElem = false + fmt.Fprintf(w, "%s ", string(b)) + } + } + case xml.StartElement: + if x.Name.Local == "xref" { + inElem = true + use := false + for _, a := range x.Attr { + if a.Name.Local == "type" { + use = use || a.Value != "person" + } + if a.Name.Local == "data" && use { + attr = a.Value + " " + } + } + } + case xml.EndElement: + inElem = false + fmt.Fprint(w, attr) + } + } + fmt.Fprint(w, "\n") + } + for _, x := range rec.Xref { + switch x.Type { + case "rfc": + fmt.Fprintf(w, "// Reference: %s\n", strings.ToUpper(x.Data)) + case "uri": + fmt.Fprintf(w, "// Reference: %s\n", x.Data) + } + } + fmt.Fprintf(w, "%s MIB = %s\n", constName, rec.MIB) + fmt.Fprintln(w) + } + fmt.Fprintln(w, ")") + + gen.WriteGoFile("mib.go", "identifier", w.Bytes()) +} diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go b/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go new file mode 100644 index 0000000000..2a2da0ef25 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/internal/identifier/identifier.go @@ -0,0 +1,81 @@ +// 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. + +//go:generate go run gen.go + +// Package identifier defines the contract between implementations of Encoding +// and Index by defining identifiers that uniquely identify standardized coded +// character sets (CCS) and character encoding schemes (CES), which we will +// together refer to as encodings, for which Encoding implementations provide +// converters to and from UTF-8. This package is typically only of concern to +// implementers of Indexes and Encodings. +// +// One part of the identifier is the MIB code, which is defined by IANA and +// uniquely identifies a CCS or CES. Each code is associated with data that +// references authorities, official documentation as well as aliases and MIME +// names. +// +// Not all CESs are covered by the IANA registry. The "other" string that is +// returned by ID can be used to identify other character sets or versions of +// existing ones. +// +// It is recommended that each package that provides a set of Encodings provide +// the All and Common variables to reference all supported encodings and +// commonly used subset. This allows Index implementations to include all +// available encodings without explicitly referencing or knowing about them. +package identifier + +// Note: this package is internal, but could be made public if there is a need +// for writing third-party Indexes and Encodings. + +// References: +// - http://source.icu-project.org/repos/icu/icu/trunk/source/data/mappings/convrtrs.txt +// - http://www.iana.org/assignments/character-sets/character-sets.xhtml +// - http://www.iana.org/assignments/ianacharset-mib/ianacharset-mib +// - http://www.ietf.org/rfc/rfc2978.txt +// - http://www.unicode.org/reports/tr22/ +// - http://www.w3.org/TR/encoding/ +// - http://www.w3.org/TR/encoding/indexes/encodings.json +// - https://encoding.spec.whatwg.org/ +// - https://tools.ietf.org/html/rfc6657#section-5 + +// Interface can be implemented by Encodings to define the CCS or CES for which +// it implements conversions. +type Interface interface { + // ID returns an encoding identifier. Exactly one of the mib and other + // values should be non-zero. + // + // In the usual case it is only necessary to indicate the MIB code. The + // other string can be used to specify encodings for which there is no MIB, + // such as "x-mac-dingbat". + // + // The other string may only contain the characters a-z, A-Z, 0-9, - and _. + ID() (mib MIB, other string) + + // NOTE: the restrictions on the encoding are to allow extending the syntax + // with additional information such as versions, vendors and other variants. +} + +// A MIB identifies an encoding. It is derived from the IANA MIB codes and adds +// some identifiers for some encodings that are not covered by the IANA +// standard. +// +// See http://www.iana.org/assignments/ianacharset-mib. +type MIB uint16 + +// These additional MIB types are not defined in IANA. They are added because +// they are common and defined within the text repo. +const ( + // Unofficial marks the start of encodings not registered by IANA. + Unofficial MIB = 10000 + iota + + // Replacement is the WhatWG replacement encoding. + Replacement + + // XUserDefined is the code for x-user-defined. + XUserDefined + + // MacintoshCyrillic is the code for x-mac-cyrillic. + MacintoshCyrillic +) diff --git a/vendor/golang.org/x/text/encoding/internal/identifier/mib.go b/vendor/golang.org/x/text/encoding/internal/identifier/mib.go new file mode 100644 index 0000000000..915abfa297 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/internal/identifier/mib.go @@ -0,0 +1,1621 @@ +// This file was generated by go generate; DO NOT EDIT + +package identifier + +const ( + // ASCII is the MIB identifier with IANA name US-ASCII (MIME: US-ASCII). + // + // ANSI X3.4-1986 + // Reference: RFC2046 + ASCII MIB = 3 + + // ISOLatin1 is the MIB identifier with IANA name ISO_8859-1:1987 (MIME: ISO-8859-1). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatin1 MIB = 4 + + // ISOLatin2 is the MIB identifier with IANA name ISO_8859-2:1987 (MIME: ISO-8859-2). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatin2 MIB = 5 + + // ISOLatin3 is the MIB identifier with IANA name ISO_8859-3:1988 (MIME: ISO-8859-3). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatin3 MIB = 6 + + // ISOLatin4 is the MIB identifier with IANA name ISO_8859-4:1988 (MIME: ISO-8859-4). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatin4 MIB = 7 + + // ISOLatinCyrillic is the MIB identifier with IANA name ISO_8859-5:1988 (MIME: ISO-8859-5). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatinCyrillic MIB = 8 + + // ISOLatinArabic is the MIB identifier with IANA name ISO_8859-6:1987 (MIME: ISO-8859-6). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatinArabic MIB = 9 + + // ISOLatinGreek is the MIB identifier with IANA name ISO_8859-7:1987 (MIME: ISO-8859-7). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1947 + // Reference: RFC1345 + ISOLatinGreek MIB = 10 + + // ISOLatinHebrew is the MIB identifier with IANA name ISO_8859-8:1988 (MIME: ISO-8859-8). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatinHebrew MIB = 11 + + // ISOLatin5 is the MIB identifier with IANA name ISO_8859-9:1989 (MIME: ISO-8859-9). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatin5 MIB = 12 + + // ISOLatin6 is the MIB identifier with IANA name ISO-8859-10 (MIME: ISO-8859-10). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOLatin6 MIB = 13 + + // ISOTextComm is the MIB identifier with IANA name ISO_6937-2-add. + // + // ISO-IR: International Register of Escape Sequences and ISO 6937-2:1983 + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISOTextComm MIB = 14 + + // HalfWidthKatakana is the MIB identifier with IANA name JIS_X0201. + // + // JIS X 0201-1976. One byte only, this is equivalent to + // JIS/Roman (similar to ASCII) plus eight-bit half-width + // Katakana + // Reference: RFC1345 + HalfWidthKatakana MIB = 15 + + // JISEncoding is the MIB identifier with IANA name JIS_Encoding. + // + // JIS X 0202-1991. Uses ISO 2022 escape sequences to + // shift code sets as documented in JIS X 0202-1991. + JISEncoding MIB = 16 + + // ShiftJIS is the MIB identifier with IANA name Shift_JIS (MIME: Shift_JIS). + // + // This charset is an extension of csHalfWidthKatakana by + // adding graphic characters in JIS X 0208. The CCS's are + // JIS X0201:1997 and JIS X0208:1997. The + // complete definition is shown in Appendix 1 of JIS + // X0208:1997. + // This charset can be used for the top-level media type "text". + ShiftJIS MIB = 17 + + // EUCPkdFmtJapanese is the MIB identifier with IANA name Extended_UNIX_Code_Packed_Format_for_Japanese (MIME: EUC-JP). + // + // Standardized by OSF, UNIX International, and UNIX Systems + // Laboratories Pacific. Uses ISO 2022 rules to select + // code set 0: US-ASCII (a single 7-bit byte set) + // code set 1: JIS X0208-1990 (a double 8-bit byte set) + // restricted to A0-FF in both bytes + // code set 2: Half Width Katakana (a single 7-bit byte set) + // requiring SS2 as the character prefix + // code set 3: JIS X0212-1990 (a double 7-bit byte set) + // restricted to A0-FF in both bytes + // requiring SS3 as the character prefix + EUCPkdFmtJapanese MIB = 18 + + // EUCFixWidJapanese is the MIB identifier with IANA name Extended_UNIX_Code_Fixed_Width_for_Japanese. + // + // Used in Japan. Each character is 2 octets. + // code set 0: US-ASCII (a single 7-bit byte set) + // 1st byte = 00 + // 2nd byte = 20-7E + // code set 1: JIS X0208-1990 (a double 7-bit byte set) + // restricted to A0-FF in both bytes + // code set 2: Half Width Katakana (a single 7-bit byte set) + // 1st byte = 00 + // 2nd byte = A0-FF + // code set 3: JIS X0212-1990 (a double 7-bit byte set) + // restricted to A0-FF in + // the first byte + // and 21-7E in the second byte + EUCFixWidJapanese MIB = 19 + + // ISO4UnitedKingdom is the MIB identifier with IANA name BS_4730. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO4UnitedKingdom MIB = 20 + + // ISO11SwedishForNames is the MIB identifier with IANA name SEN_850200_C. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO11SwedishForNames MIB = 21 + + // ISO15Italian is the MIB identifier with IANA name IT. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO15Italian MIB = 22 + + // ISO17Spanish is the MIB identifier with IANA name ES. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO17Spanish MIB = 23 + + // ISO21German is the MIB identifier with IANA name DIN_66003. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO21German MIB = 24 + + // ISO60Norwegian1 is the MIB identifier with IANA name NS_4551-1. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO60Norwegian1 MIB = 25 + + // ISO69French is the MIB identifier with IANA name NF_Z_62-010. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO69French MIB = 26 + + // ISO10646UTF1 is the MIB identifier with IANA name ISO-10646-UTF-1. + // + // Universal Transfer Format (1), this is the multibyte + // encoding, that subsets ASCII-7. It does not have byte + // ordering issues. + ISO10646UTF1 MIB = 27 + + // ISO646basic1983 is the MIB identifier with IANA name ISO_646.basic:1983. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO646basic1983 MIB = 28 + + // INVARIANT is the MIB identifier with IANA name INVARIANT. + // + // Reference: RFC1345 + INVARIANT MIB = 29 + + // ISO2IntlRefVersion is the MIB identifier with IANA name ISO_646.irv:1983. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO2IntlRefVersion MIB = 30 + + // NATSSEFI is the MIB identifier with IANA name NATS-SEFI. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + NATSSEFI MIB = 31 + + // NATSSEFIADD is the MIB identifier with IANA name NATS-SEFI-ADD. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + NATSSEFIADD MIB = 32 + + // NATSDANO is the MIB identifier with IANA name NATS-DANO. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + NATSDANO MIB = 33 + + // NATSDANOADD is the MIB identifier with IANA name NATS-DANO-ADD. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + NATSDANOADD MIB = 34 + + // ISO10Swedish is the MIB identifier with IANA name SEN_850200_B. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO10Swedish MIB = 35 + + // KSC56011987 is the MIB identifier with IANA name KS_C_5601-1987. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + KSC56011987 MIB = 36 + + // ISO2022KR is the MIB identifier with IANA name ISO-2022-KR (MIME: ISO-2022-KR). + // + // rfc1557 (see also KS_C_5601-1987) + // Reference: RFC1557 + ISO2022KR MIB = 37 + + // EUCKR is the MIB identifier with IANA name EUC-KR (MIME: EUC-KR). + // + // rfc1557 (see also KS_C_5861-1992) + // Reference: RFC1557 + EUCKR MIB = 38 + + // ISO2022JP is the MIB identifier with IANA name ISO-2022-JP (MIME: ISO-2022-JP). + // + // rfc1468 (see also rfc2237 ) + // Reference: RFC1468 + ISO2022JP MIB = 39 + + // ISO2022JP2 is the MIB identifier with IANA name ISO-2022-JP-2 (MIME: ISO-2022-JP-2). + // + // rfc1554 + // Reference: RFC1554 + ISO2022JP2 MIB = 40 + + // ISO13JISC6220jp is the MIB identifier with IANA name JIS_C6220-1969-jp. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO13JISC6220jp MIB = 41 + + // ISO14JISC6220ro is the MIB identifier with IANA name JIS_C6220-1969-ro. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO14JISC6220ro MIB = 42 + + // ISO16Portuguese is the MIB identifier with IANA name PT. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO16Portuguese MIB = 43 + + // ISO18Greek7Old is the MIB identifier with IANA name greek7-old. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO18Greek7Old MIB = 44 + + // ISO19LatinGreek is the MIB identifier with IANA name latin-greek. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO19LatinGreek MIB = 45 + + // ISO25French is the MIB identifier with IANA name NF_Z_62-010_(1973). + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO25French MIB = 46 + + // ISO27LatinGreek1 is the MIB identifier with IANA name Latin-greek-1. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO27LatinGreek1 MIB = 47 + + // ISO5427Cyrillic is the MIB identifier with IANA name ISO_5427. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO5427Cyrillic MIB = 48 + + // ISO42JISC62261978 is the MIB identifier with IANA name JIS_C6226-1978. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO42JISC62261978 MIB = 49 + + // ISO47BSViewdata is the MIB identifier with IANA name BS_viewdata. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO47BSViewdata MIB = 50 + + // ISO49INIS is the MIB identifier with IANA name INIS. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO49INIS MIB = 51 + + // ISO50INIS8 is the MIB identifier with IANA name INIS-8. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO50INIS8 MIB = 52 + + // ISO51INISCyrillic is the MIB identifier with IANA name INIS-cyrillic. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO51INISCyrillic MIB = 53 + + // ISO54271981 is the MIB identifier with IANA name ISO_5427:1981. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO54271981 MIB = 54 + + // ISO5428Greek is the MIB identifier with IANA name ISO_5428:1980. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO5428Greek MIB = 55 + + // ISO57GB1988 is the MIB identifier with IANA name GB_1988-80. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO57GB1988 MIB = 56 + + // ISO58GB231280 is the MIB identifier with IANA name GB_2312-80. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO58GB231280 MIB = 57 + + // ISO61Norwegian2 is the MIB identifier with IANA name NS_4551-2. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO61Norwegian2 MIB = 58 + + // ISO70VideotexSupp1 is the MIB identifier with IANA name videotex-suppl. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO70VideotexSupp1 MIB = 59 + + // ISO84Portuguese2 is the MIB identifier with IANA name PT2. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO84Portuguese2 MIB = 60 + + // ISO85Spanish2 is the MIB identifier with IANA name ES2. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO85Spanish2 MIB = 61 + + // ISO86Hungarian is the MIB identifier with IANA name MSZ_7795.3. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO86Hungarian MIB = 62 + + // ISO87JISX0208 is the MIB identifier with IANA name JIS_C6226-1983. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO87JISX0208 MIB = 63 + + // ISO88Greek7 is the MIB identifier with IANA name greek7. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO88Greek7 MIB = 64 + + // ISO89ASMO449 is the MIB identifier with IANA name ASMO_449. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO89ASMO449 MIB = 65 + + // ISO90 is the MIB identifier with IANA name iso-ir-90. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO90 MIB = 66 + + // ISO91JISC62291984a is the MIB identifier with IANA name JIS_C6229-1984-a. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO91JISC62291984a MIB = 67 + + // ISO92JISC62991984b is the MIB identifier with IANA name JIS_C6229-1984-b. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO92JISC62991984b MIB = 68 + + // ISO93JIS62291984badd is the MIB identifier with IANA name JIS_C6229-1984-b-add. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO93JIS62291984badd MIB = 69 + + // ISO94JIS62291984hand is the MIB identifier with IANA name JIS_C6229-1984-hand. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO94JIS62291984hand MIB = 70 + + // ISO95JIS62291984handadd is the MIB identifier with IANA name JIS_C6229-1984-hand-add. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO95JIS62291984handadd MIB = 71 + + // ISO96JISC62291984kana is the MIB identifier with IANA name JIS_C6229-1984-kana. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO96JISC62291984kana MIB = 72 + + // ISO2033 is the MIB identifier with IANA name ISO_2033-1983. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO2033 MIB = 73 + + // ISO99NAPLPS is the MIB identifier with IANA name ANSI_X3.110-1983. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO99NAPLPS MIB = 74 + + // ISO102T617bit is the MIB identifier with IANA name T.61-7bit. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO102T617bit MIB = 75 + + // ISO103T618bit is the MIB identifier with IANA name T.61-8bit. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO103T618bit MIB = 76 + + // ISO111ECMACyrillic is the MIB identifier with IANA name ECMA-cyrillic. + // + // ISO registry + // (formerly ECMA + // registry ) + ISO111ECMACyrillic MIB = 77 + + // ISO121Canadian1 is the MIB identifier with IANA name CSA_Z243.4-1985-1. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO121Canadian1 MIB = 78 + + // ISO122Canadian2 is the MIB identifier with IANA name CSA_Z243.4-1985-2. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO122Canadian2 MIB = 79 + + // ISO123CSAZ24341985gr is the MIB identifier with IANA name CSA_Z243.4-1985-gr. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO123CSAZ24341985gr MIB = 80 + + // ISO88596E is the MIB identifier with IANA name ISO_8859-6-E (MIME: ISO-8859-6-E). + // + // rfc1556 + // Reference: RFC1556 + ISO88596E MIB = 81 + + // ISO88596I is the MIB identifier with IANA name ISO_8859-6-I (MIME: ISO-8859-6-I). + // + // rfc1556 + // Reference: RFC1556 + ISO88596I MIB = 82 + + // ISO128T101G2 is the MIB identifier with IANA name T.101-G2. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO128T101G2 MIB = 83 + + // ISO88598E is the MIB identifier with IANA name ISO_8859-8-E (MIME: ISO-8859-8-E). + // + // rfc1556 + // Reference: RFC1556 + ISO88598E MIB = 84 + + // ISO88598I is the MIB identifier with IANA name ISO_8859-8-I (MIME: ISO-8859-8-I). + // + // rfc1556 + // Reference: RFC1556 + ISO88598I MIB = 85 + + // ISO139CSN369103 is the MIB identifier with IANA name CSN_369103. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO139CSN369103 MIB = 86 + + // ISO141JUSIB1002 is the MIB identifier with IANA name JUS_I.B1.002. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO141JUSIB1002 MIB = 87 + + // ISO143IECP271 is the MIB identifier with IANA name IEC_P27-1. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO143IECP271 MIB = 88 + + // ISO146Serbian is the MIB identifier with IANA name JUS_I.B1.003-serb. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO146Serbian MIB = 89 + + // ISO147Macedonian is the MIB identifier with IANA name JUS_I.B1.003-mac. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO147Macedonian MIB = 90 + + // ISO150GreekCCITT is the MIB identifier with IANA name greek-ccitt. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO150GreekCCITT MIB = 91 + + // ISO151Cuba is the MIB identifier with IANA name NC_NC00-10:81. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO151Cuba MIB = 92 + + // ISO6937Add is the MIB identifier with IANA name ISO_6937-2-25. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO6937Add MIB = 93 + + // ISO153GOST1976874 is the MIB identifier with IANA name GOST_19768-74. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO153GOST1976874 MIB = 94 + + // ISO8859Supp is the MIB identifier with IANA name ISO_8859-supp. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO8859Supp MIB = 95 + + // ISO10367Box is the MIB identifier with IANA name ISO_10367-box. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO10367Box MIB = 96 + + // ISO158Lap is the MIB identifier with IANA name latin-lap. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO158Lap MIB = 97 + + // ISO159JISX02121990 is the MIB identifier with IANA name JIS_X0212-1990. + // + // ISO-IR: International Register of Escape Sequences + // Note: The current registration authority is IPSJ/ITSCJ, Japan. + // Reference: RFC1345 + ISO159JISX02121990 MIB = 98 + + // ISO646Danish is the MIB identifier with IANA name DS_2089. + // + // Danish Standard, DS 2089, February 1974 + // Reference: RFC1345 + ISO646Danish MIB = 99 + + // USDK is the MIB identifier with IANA name us-dk. + // + // Reference: RFC1345 + USDK MIB = 100 + + // DKUS is the MIB identifier with IANA name dk-us. + // + // Reference: RFC1345 + DKUS MIB = 101 + + // KSC5636 is the MIB identifier with IANA name KSC5636. + // + // Reference: RFC1345 + KSC5636 MIB = 102 + + // Unicode11UTF7 is the MIB identifier with IANA name UNICODE-1-1-UTF-7. + // + // rfc1642 + // Reference: RFC1642 + Unicode11UTF7 MIB = 103 + + // ISO2022CN is the MIB identifier with IANA name ISO-2022-CN. + // + // rfc1922 + // Reference: RFC1922 + ISO2022CN MIB = 104 + + // ISO2022CNEXT is the MIB identifier with IANA name ISO-2022-CN-EXT. + // + // rfc1922 + // Reference: RFC1922 + ISO2022CNEXT MIB = 105 + + // UTF8 is the MIB identifier with IANA name UTF-8. + // + // rfc3629 + // Reference: RFC3629 + UTF8 MIB = 106 + + // ISO885913 is the MIB identifier with IANA name ISO-8859-13. + // + // ISO See http://www.iana.org/assignments/charset-reg/ISO-8859-13 http://www.iana.org/assignments/charset-reg/ISO-8859-13 + ISO885913 MIB = 109 + + // ISO885914 is the MIB identifier with IANA name ISO-8859-14. + // + // ISO See http://www.iana.org/assignments/charset-reg/ISO-8859-14 + ISO885914 MIB = 110 + + // ISO885915 is the MIB identifier with IANA name ISO-8859-15. + // + // ISO + // Please see: http://www.iana.org/assignments/charset-reg/ISO-8859-15 + ISO885915 MIB = 111 + + // ISO885916 is the MIB identifier with IANA name ISO-8859-16. + // + // ISO + ISO885916 MIB = 112 + + // GBK is the MIB identifier with IANA name GBK. + // + // Chinese IT Standardization Technical Committee + // Please see: http://www.iana.org/assignments/charset-reg/GBK + GBK MIB = 113 + + // GB18030 is the MIB identifier with IANA name GB18030. + // + // Chinese IT Standardization Technical Committee + // Please see: http://www.iana.org/assignments/charset-reg/GB18030 + GB18030 MIB = 114 + + // OSDEBCDICDF0415 is the MIB identifier with IANA name OSD_EBCDIC_DF04_15. + // + // Fujitsu-Siemens standard mainframe EBCDIC encoding + // Please see: http://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-15 + OSDEBCDICDF0415 MIB = 115 + + // OSDEBCDICDF03IRV is the MIB identifier with IANA name OSD_EBCDIC_DF03_IRV. + // + // Fujitsu-Siemens standard mainframe EBCDIC encoding + // Please see: http://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF03-IRV + OSDEBCDICDF03IRV MIB = 116 + + // OSDEBCDICDF041 is the MIB identifier with IANA name OSD_EBCDIC_DF04_1. + // + // Fujitsu-Siemens standard mainframe EBCDIC encoding + // Please see: http://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-1 + OSDEBCDICDF041 MIB = 117 + + // ISO115481 is the MIB identifier with IANA name ISO-11548-1. + // + // See http://www.iana.org/assignments/charset-reg/ISO-11548-1 + ISO115481 MIB = 118 + + // KZ1048 is the MIB identifier with IANA name KZ-1048. + // + // See http://www.iana.org/assignments/charset-reg/KZ-1048 + KZ1048 MIB = 119 + + // Unicode is the MIB identifier with IANA name ISO-10646-UCS-2. + // + // the 2-octet Basic Multilingual Plane, aka Unicode + // this needs to specify network byte order: the standard + // does not specify (it is a 16-bit integer space) + Unicode MIB = 1000 + + // UCS4 is the MIB identifier with IANA name ISO-10646-UCS-4. + // + // the full code space. (same comment about byte order, + // these are 31-bit numbers. + UCS4 MIB = 1001 + + // UnicodeASCII is the MIB identifier with IANA name ISO-10646-UCS-Basic. + // + // ASCII subset of Unicode. Basic Latin = collection 1 + // See ISO 10646, Appendix A + UnicodeASCII MIB = 1002 + + // UnicodeLatin1 is the MIB identifier with IANA name ISO-10646-Unicode-Latin1. + // + // ISO Latin-1 subset of Unicode. Basic Latin and Latin-1 + // Supplement = collections 1 and 2. See ISO 10646, + // Appendix A. See rfc1815 . + UnicodeLatin1 MIB = 1003 + + // UnicodeJapanese is the MIB identifier with IANA name ISO-10646-J-1. + // + // ISO 10646 Japanese, see rfc1815 . + UnicodeJapanese MIB = 1004 + + // UnicodeIBM1261 is the MIB identifier with IANA name ISO-Unicode-IBM-1261. + // + // IBM Latin-2, -3, -5, Extended Presentation Set, GCSGID: 1261 + UnicodeIBM1261 MIB = 1005 + + // UnicodeIBM1268 is the MIB identifier with IANA name ISO-Unicode-IBM-1268. + // + // IBM Latin-4 Extended Presentation Set, GCSGID: 1268 + UnicodeIBM1268 MIB = 1006 + + // UnicodeIBM1276 is the MIB identifier with IANA name ISO-Unicode-IBM-1276. + // + // IBM Cyrillic Greek Extended Presentation Set, GCSGID: 1276 + UnicodeIBM1276 MIB = 1007 + + // UnicodeIBM1264 is the MIB identifier with IANA name ISO-Unicode-IBM-1264. + // + // IBM Arabic Presentation Set, GCSGID: 1264 + UnicodeIBM1264 MIB = 1008 + + // UnicodeIBM1265 is the MIB identifier with IANA name ISO-Unicode-IBM-1265. + // + // IBM Hebrew Presentation Set, GCSGID: 1265 + UnicodeIBM1265 MIB = 1009 + + // Unicode11 is the MIB identifier with IANA name UNICODE-1-1. + // + // rfc1641 + // Reference: RFC1641 + Unicode11 MIB = 1010 + + // SCSU is the MIB identifier with IANA name SCSU. + // + // SCSU See http://www.iana.org/assignments/charset-reg/SCSU + SCSU MIB = 1011 + + // UTF7 is the MIB identifier with IANA name UTF-7. + // + // rfc2152 + // Reference: RFC2152 + UTF7 MIB = 1012 + + // UTF16BE is the MIB identifier with IANA name UTF-16BE. + // + // rfc2781 + // Reference: RFC2781 + UTF16BE MIB = 1013 + + // UTF16LE is the MIB identifier with IANA name UTF-16LE. + // + // rfc2781 + // Reference: RFC2781 + UTF16LE MIB = 1014 + + // UTF16 is the MIB identifier with IANA name UTF-16. + // + // rfc2781 + // Reference: RFC2781 + UTF16 MIB = 1015 + + // CESU8 is the MIB identifier with IANA name CESU-8. + // + // http://www.unicode.org/unicode/reports/tr26 + CESU8 MIB = 1016 + + // UTF32 is the MIB identifier with IANA name UTF-32. + // + // http://www.unicode.org/unicode/reports/tr19/ + UTF32 MIB = 1017 + + // UTF32BE is the MIB identifier with IANA name UTF-32BE. + // + // http://www.unicode.org/unicode/reports/tr19/ + UTF32BE MIB = 1018 + + // UTF32LE is the MIB identifier with IANA name UTF-32LE. + // + // http://www.unicode.org/unicode/reports/tr19/ + UTF32LE MIB = 1019 + + // BOCU1 is the MIB identifier with IANA name BOCU-1. + // + // http://www.unicode.org/notes/tn6/ + BOCU1 MIB = 1020 + + // Windows30Latin1 is the MIB identifier with IANA name ISO-8859-1-Windows-3.0-Latin-1. + // + // Extended ISO 8859-1 Latin-1 for Windows 3.0. + // PCL Symbol Set id: 9U + Windows30Latin1 MIB = 2000 + + // Windows31Latin1 is the MIB identifier with IANA name ISO-8859-1-Windows-3.1-Latin-1. + // + // Extended ISO 8859-1 Latin-1 for Windows 3.1. + // PCL Symbol Set id: 19U + Windows31Latin1 MIB = 2001 + + // Windows31Latin2 is the MIB identifier with IANA name ISO-8859-2-Windows-Latin-2. + // + // Extended ISO 8859-2. Latin-2 for Windows 3.1. + // PCL Symbol Set id: 9E + Windows31Latin2 MIB = 2002 + + // Windows31Latin5 is the MIB identifier with IANA name ISO-8859-9-Windows-Latin-5. + // + // Extended ISO 8859-9. Latin-5 for Windows 3.1 + // PCL Symbol Set id: 5T + Windows31Latin5 MIB = 2003 + + // HPRoman8 is the MIB identifier with IANA name hp-roman8. + // + // LaserJet IIP Printer User's Manual, + // HP part no 33471-90901, Hewlet-Packard, June 1989. + // Reference: RFC1345 + HPRoman8 MIB = 2004 + + // AdobeStandardEncoding is the MIB identifier with IANA name Adobe-Standard-Encoding. + // + // PostScript Language Reference Manual + // PCL Symbol Set id: 10J + AdobeStandardEncoding MIB = 2005 + + // VenturaUS is the MIB identifier with IANA name Ventura-US. + // + // Ventura US. ASCII plus characters typically used in + // publishing, like pilcrow, copyright, registered, trade mark, + // section, dagger, and double dagger in the range A0 (hex) + // to FF (hex). + // PCL Symbol Set id: 14J + VenturaUS MIB = 2006 + + // VenturaInternational is the MIB identifier with IANA name Ventura-International. + // + // Ventura International. ASCII plus coded characters similar + // to Roman8. + // PCL Symbol Set id: 13J + VenturaInternational MIB = 2007 + + // DECMCS is the MIB identifier with IANA name DEC-MCS. + // + // VAX/VMS User's Manual, + // Order Number: AI-Y517A-TE, April 1986. + // Reference: RFC1345 + DECMCS MIB = 2008 + + // PC850Multilingual is the MIB identifier with IANA name IBM850. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + PC850Multilingual MIB = 2009 + + // PC8DanishNorwegian is the MIB identifier with IANA name PC8-Danish-Norwegian. + // + // PC Danish Norwegian + // 8-bit PC set for Danish Norwegian + // PCL Symbol Set id: 11U + PC8DanishNorwegian MIB = 2012 + + // PC862LatinHebrew is the MIB identifier with IANA name IBM862. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + PC862LatinHebrew MIB = 2013 + + // PC8Turkish is the MIB identifier with IANA name PC8-Turkish. + // + // PC Latin Turkish. PCL Symbol Set id: 9T + PC8Turkish MIB = 2014 + + // IBMSymbols is the MIB identifier with IANA name IBM-Symbols. + // + // Presentation Set, CPGID: 259 + IBMSymbols MIB = 2015 + + // IBMThai is the MIB identifier with IANA name IBM-Thai. + // + // Presentation Set, CPGID: 838 + IBMThai MIB = 2016 + + // HPLegal is the MIB identifier with IANA name HP-Legal. + // + // PCL 5 Comparison Guide, Hewlett-Packard, + // HP part number 5961-0510, October 1992 + // PCL Symbol Set id: 1U + HPLegal MIB = 2017 + + // HPPiFont is the MIB identifier with IANA name HP-Pi-font. + // + // PCL 5 Comparison Guide, Hewlett-Packard, + // HP part number 5961-0510, October 1992 + // PCL Symbol Set id: 15U + HPPiFont MIB = 2018 + + // HPMath8 is the MIB identifier with IANA name HP-Math8. + // + // PCL 5 Comparison Guide, Hewlett-Packard, + // HP part number 5961-0510, October 1992 + // PCL Symbol Set id: 8M + HPMath8 MIB = 2019 + + // HPPSMath is the MIB identifier with IANA name Adobe-Symbol-Encoding. + // + // PostScript Language Reference Manual + // PCL Symbol Set id: 5M + HPPSMath MIB = 2020 + + // HPDesktop is the MIB identifier with IANA name HP-DeskTop. + // + // PCL 5 Comparison Guide, Hewlett-Packard, + // HP part number 5961-0510, October 1992 + // PCL Symbol Set id: 7J + HPDesktop MIB = 2021 + + // VenturaMath is the MIB identifier with IANA name Ventura-Math. + // + // PCL 5 Comparison Guide, Hewlett-Packard, + // HP part number 5961-0510, October 1992 + // PCL Symbol Set id: 6M + VenturaMath MIB = 2022 + + // MicrosoftPublishing is the MIB identifier with IANA name Microsoft-Publishing. + // + // PCL 5 Comparison Guide, Hewlett-Packard, + // HP part number 5961-0510, October 1992 + // PCL Symbol Set id: 6J + MicrosoftPublishing MIB = 2023 + + // Windows31J is the MIB identifier with IANA name Windows-31J. + // + // Windows Japanese. A further extension of Shift_JIS + // to include NEC special characters (Row 13), NEC + // selection of IBM extensions (Rows 89 to 92), and IBM + // extensions (Rows 115 to 119). The CCS's are + // JIS X0201:1997, JIS X0208:1997, and these extensions. + // This charset can be used for the top-level media type "text", + // but it is of limited or specialized use (see rfc2278 ). + // PCL Symbol Set id: 19K + Windows31J MIB = 2024 + + // GB2312 is the MIB identifier with IANA name GB2312 (MIME: GB2312). + // + // Chinese for People's Republic of China (PRC) mixed one byte, + // two byte set: + // 20-7E = one byte ASCII + // A1-FE = two byte PRC Kanji + // See GB 2312-80 + // PCL Symbol Set Id: 18C + GB2312 MIB = 2025 + + // Big5 is the MIB identifier with IANA name Big5 (MIME: Big5). + // + // Chinese for Taiwan Multi-byte set. + // PCL Symbol Set Id: 18T + Big5 MIB = 2026 + + // Macintosh is the MIB identifier with IANA name macintosh. + // + // The Unicode Standard ver1.0, ISBN 0-201-56788-1, Oct 1991 + // Reference: RFC1345 + Macintosh MIB = 2027 + + // IBM037 is the MIB identifier with IANA name IBM037. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM037 MIB = 2028 + + // IBM038 is the MIB identifier with IANA name IBM038. + // + // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 + // Reference: RFC1345 + IBM038 MIB = 2029 + + // IBM273 is the MIB identifier with IANA name IBM273. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM273 MIB = 2030 + + // IBM274 is the MIB identifier with IANA name IBM274. + // + // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 + // Reference: RFC1345 + IBM274 MIB = 2031 + + // IBM275 is the MIB identifier with IANA name IBM275. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM275 MIB = 2032 + + // IBM277 is the MIB identifier with IANA name IBM277. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM277 MIB = 2033 + + // IBM278 is the MIB identifier with IANA name IBM278. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM278 MIB = 2034 + + // IBM280 is the MIB identifier with IANA name IBM280. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM280 MIB = 2035 + + // IBM281 is the MIB identifier with IANA name IBM281. + // + // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 + // Reference: RFC1345 + IBM281 MIB = 2036 + + // IBM284 is the MIB identifier with IANA name IBM284. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM284 MIB = 2037 + + // IBM285 is the MIB identifier with IANA name IBM285. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM285 MIB = 2038 + + // IBM290 is the MIB identifier with IANA name IBM290. + // + // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 + // Reference: RFC1345 + IBM290 MIB = 2039 + + // IBM297 is the MIB identifier with IANA name IBM297. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM297 MIB = 2040 + + // IBM420 is the MIB identifier with IANA name IBM420. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990, + // IBM NLS RM p 11-11 + // Reference: RFC1345 + IBM420 MIB = 2041 + + // IBM423 is the MIB identifier with IANA name IBM423. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM423 MIB = 2042 + + // IBM424 is the MIB identifier with IANA name IBM424. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM424 MIB = 2043 + + // PC8CodePage437 is the MIB identifier with IANA name IBM437. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + PC8CodePage437 MIB = 2011 + + // IBM500 is the MIB identifier with IANA name IBM500. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM500 MIB = 2044 + + // IBM851 is the MIB identifier with IANA name IBM851. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM851 MIB = 2045 + + // PCp852 is the MIB identifier with IANA name IBM852. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + PCp852 MIB = 2010 + + // IBM855 is the MIB identifier with IANA name IBM855. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM855 MIB = 2046 + + // IBM857 is the MIB identifier with IANA name IBM857. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM857 MIB = 2047 + + // IBM860 is the MIB identifier with IANA name IBM860. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM860 MIB = 2048 + + // IBM861 is the MIB identifier with IANA name IBM861. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM861 MIB = 2049 + + // IBM863 is the MIB identifier with IANA name IBM863. + // + // IBM Keyboard layouts and code pages, PN 07G4586 June 1991 + // Reference: RFC1345 + IBM863 MIB = 2050 + + // IBM864 is the MIB identifier with IANA name IBM864. + // + // IBM Keyboard layouts and code pages, PN 07G4586 June 1991 + // Reference: RFC1345 + IBM864 MIB = 2051 + + // IBM865 is the MIB identifier with IANA name IBM865. + // + // IBM DOS 3.3 Ref (Abridged), 94X9575 (Feb 1987) + // Reference: RFC1345 + IBM865 MIB = 2052 + + // IBM868 is the MIB identifier with IANA name IBM868. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM868 MIB = 2053 + + // IBM869 is the MIB identifier with IANA name IBM869. + // + // IBM Keyboard layouts and code pages, PN 07G4586 June 1991 + // Reference: RFC1345 + IBM869 MIB = 2054 + + // IBM870 is the MIB identifier with IANA name IBM870. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM870 MIB = 2055 + + // IBM871 is the MIB identifier with IANA name IBM871. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM871 MIB = 2056 + + // IBM880 is the MIB identifier with IANA name IBM880. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM880 MIB = 2057 + + // IBM891 is the MIB identifier with IANA name IBM891. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM891 MIB = 2058 + + // IBM903 is the MIB identifier with IANA name IBM903. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM903 MIB = 2059 + + // IBBM904 is the MIB identifier with IANA name IBM904. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBBM904 MIB = 2060 + + // IBM905 is the MIB identifier with IANA name IBM905. + // + // IBM 3174 Character Set Ref, GA27-3831-02, March 1990 + // Reference: RFC1345 + IBM905 MIB = 2061 + + // IBM918 is the MIB identifier with IANA name IBM918. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM918 MIB = 2062 + + // IBM1026 is the MIB identifier with IANA name IBM1026. + // + // IBM NLS RM Vol2 SE09-8002-01, March 1990 + // Reference: RFC1345 + IBM1026 MIB = 2063 + + // IBMEBCDICATDE is the MIB identifier with IANA name EBCDIC-AT-DE. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + IBMEBCDICATDE MIB = 2064 + + // EBCDICATDEA is the MIB identifier with IANA name EBCDIC-AT-DE-A. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICATDEA MIB = 2065 + + // EBCDICCAFR is the MIB identifier with IANA name EBCDIC-CA-FR. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICCAFR MIB = 2066 + + // EBCDICDKNO is the MIB identifier with IANA name EBCDIC-DK-NO. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICDKNO MIB = 2067 + + // EBCDICDKNOA is the MIB identifier with IANA name EBCDIC-DK-NO-A. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICDKNOA MIB = 2068 + + // EBCDICFISE is the MIB identifier with IANA name EBCDIC-FI-SE. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICFISE MIB = 2069 + + // EBCDICFISEA is the MIB identifier with IANA name EBCDIC-FI-SE-A. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICFISEA MIB = 2070 + + // EBCDICFR is the MIB identifier with IANA name EBCDIC-FR. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICFR MIB = 2071 + + // EBCDICIT is the MIB identifier with IANA name EBCDIC-IT. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICIT MIB = 2072 + + // EBCDICPT is the MIB identifier with IANA name EBCDIC-PT. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICPT MIB = 2073 + + // EBCDICES is the MIB identifier with IANA name EBCDIC-ES. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICES MIB = 2074 + + // EBCDICESA is the MIB identifier with IANA name EBCDIC-ES-A. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICESA MIB = 2075 + + // EBCDICESS is the MIB identifier with IANA name EBCDIC-ES-S. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICESS MIB = 2076 + + // EBCDICUK is the MIB identifier with IANA name EBCDIC-UK. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICUK MIB = 2077 + + // EBCDICUS is the MIB identifier with IANA name EBCDIC-US. + // + // IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 + // Reference: RFC1345 + EBCDICUS MIB = 2078 + + // Unknown8BiT is the MIB identifier with IANA name UNKNOWN-8BIT. + // + // Reference: RFC1428 + Unknown8BiT MIB = 2079 + + // Mnemonic is the MIB identifier with IANA name MNEMONIC. + // + // rfc1345 , also known as "mnemonic+ascii+38" + // Reference: RFC1345 + Mnemonic MIB = 2080 + + // Mnem is the MIB identifier with IANA name MNEM. + // + // rfc1345 , also known as "mnemonic+ascii+8200" + // Reference: RFC1345 + Mnem MIB = 2081 + + // VISCII is the MIB identifier with IANA name VISCII. + // + // rfc1456 + // Reference: RFC1456 + VISCII MIB = 2082 + + // VIQR is the MIB identifier with IANA name VIQR. + // + // rfc1456 + // Reference: RFC1456 + VIQR MIB = 2083 + + // KOI8R is the MIB identifier with IANA name KOI8-R (MIME: KOI8-R). + // + // rfc1489 , based on GOST-19768-74, ISO-6937/8, + // INIS-Cyrillic, ISO-5427. + // Reference: RFC1489 + KOI8R MIB = 2084 + + // HZGB2312 is the MIB identifier with IANA name HZ-GB-2312. + // + // rfc1842 , rfc1843 rfc1843 rfc1842 + HZGB2312 MIB = 2085 + + // IBM866 is the MIB identifier with IANA name IBM866. + // + // IBM NLDG Volume 2 (SE09-8002-03) August 1994 + IBM866 MIB = 2086 + + // PC775Baltic is the MIB identifier with IANA name IBM775. + // + // HP PCL 5 Comparison Guide (P/N 5021-0329) pp B-13, 1996 + PC775Baltic MIB = 2087 + + // KOI8U is the MIB identifier with IANA name KOI8-U. + // + // rfc2319 + // Reference: RFC2319 + KOI8U MIB = 2088 + + // IBM00858 is the MIB identifier with IANA name IBM00858. + // + // IBM See http://www.iana.org/assignments/charset-reg/IBM00858 + IBM00858 MIB = 2089 + + // IBM00924 is the MIB identifier with IANA name IBM00924. + // + // IBM See http://www.iana.org/assignments/charset-reg/IBM00924 + IBM00924 MIB = 2090 + + // IBM01140 is the MIB identifier with IANA name IBM01140. + // + // IBM See http://www.iana.org/assignments/charset-reg/IBM01140 + IBM01140 MIB = 2091 + + // IBM01141 is the MIB identifier with IANA name IBM01141. + // + // IBM See http://www.iana.org/assignments/charset-reg/IBM01141 + IBM01141 MIB = 2092 + + // IBM01142 is the MIB identifier with IANA name IBM01142. + // + // IBM See http://www.iana.org/assignments/charset-reg/IBM01142 + IBM01142 MIB = 2093 + + // IBM01143 is the MIB identifier with IANA name IBM01143. + // + // IBM See http://www.iana.org/assignments/charset-reg/IBM01143 + IBM01143 MIB = 2094 + + // IBM01144 is the MIB identifier with IANA name IBM01144. + // + // IBM See http://www.iana.org/assignments/charset-reg/IBM01144 + IBM01144 MIB = 2095 + + // IBM01145 is the MIB identifier with IANA name IBM01145. + // + // IBM See http://www.iana.org/assignments/charset-reg/IBM01145 + IBM01145 MIB = 2096 + + // IBM01146 is the MIB identifier with IANA name IBM01146. + // + // IBM See http://www.iana.org/assignments/charset-reg/IBM01146 + IBM01146 MIB = 2097 + + // IBM01147 is the MIB identifier with IANA name IBM01147. + // + // IBM See http://www.iana.org/assignments/charset-reg/IBM01147 + IBM01147 MIB = 2098 + + // IBM01148 is the MIB identifier with IANA name IBM01148. + // + // IBM See http://www.iana.org/assignments/charset-reg/IBM01148 + IBM01148 MIB = 2099 + + // IBM01149 is the MIB identifier with IANA name IBM01149. + // + // IBM See http://www.iana.org/assignments/charset-reg/IBM01149 + IBM01149 MIB = 2100 + + // Big5HKSCS is the MIB identifier with IANA name Big5-HKSCS. + // + // See http://www.iana.org/assignments/charset-reg/Big5-HKSCS + Big5HKSCS MIB = 2101 + + // IBM1047 is the MIB identifier with IANA name IBM1047. + // + // IBM1047 (EBCDIC Latin 1/Open Systems) http://www-1.ibm.com/servers/eserver/iseries/software/globalization/pdf/cp01047z.pdf + IBM1047 MIB = 2102 + + // PTCP154 is the MIB identifier with IANA name PTCP154. + // + // See http://www.iana.org/assignments/charset-reg/PTCP154 + PTCP154 MIB = 2103 + + // Amiga1251 is the MIB identifier with IANA name Amiga-1251. + // + // See http://www.amiga.ultranet.ru/Amiga-1251.html + Amiga1251 MIB = 2104 + + // KOI7switched is the MIB identifier with IANA name KOI7-switched. + // + // See http://www.iana.org/assignments/charset-reg/KOI7-switched + KOI7switched MIB = 2105 + + // BRF is the MIB identifier with IANA name BRF. + // + // See http://www.iana.org/assignments/charset-reg/BRF + BRF MIB = 2106 + + // TSCII is the MIB identifier with IANA name TSCII. + // + // See http://www.iana.org/assignments/charset-reg/TSCII + TSCII MIB = 2107 + + // CP51932 is the MIB identifier with IANA name CP51932. + // + // See http://www.iana.org/assignments/charset-reg/CP51932 + CP51932 MIB = 2108 + + // Windows874 is the MIB identifier with IANA name windows-874. + // + // See http://www.iana.org/assignments/charset-reg/windows-874 + Windows874 MIB = 2109 + + // Windows1250 is the MIB identifier with IANA name windows-1250. + // + // Microsoft http://www.iana.org/assignments/charset-reg/windows-1250 + Windows1250 MIB = 2250 + + // Windows1251 is the MIB identifier with IANA name windows-1251. + // + // Microsoft http://www.iana.org/assignments/charset-reg/windows-1251 + Windows1251 MIB = 2251 + + // Windows1252 is the MIB identifier with IANA name windows-1252. + // + // Microsoft http://www.iana.org/assignments/charset-reg/windows-1252 + Windows1252 MIB = 2252 + + // Windows1253 is the MIB identifier with IANA name windows-1253. + // + // Microsoft http://www.iana.org/assignments/charset-reg/windows-1253 + Windows1253 MIB = 2253 + + // Windows1254 is the MIB identifier with IANA name windows-1254. + // + // Microsoft http://www.iana.org/assignments/charset-reg/windows-1254 + Windows1254 MIB = 2254 + + // Windows1255 is the MIB identifier with IANA name windows-1255. + // + // Microsoft http://www.iana.org/assignments/charset-reg/windows-1255 + Windows1255 MIB = 2255 + + // Windows1256 is the MIB identifier with IANA name windows-1256. + // + // Microsoft http://www.iana.org/assignments/charset-reg/windows-1256 + Windows1256 MIB = 2256 + + // Windows1257 is the MIB identifier with IANA name windows-1257. + // + // Microsoft http://www.iana.org/assignments/charset-reg/windows-1257 + Windows1257 MIB = 2257 + + // Windows1258 is the MIB identifier with IANA name windows-1258. + // + // Microsoft http://www.iana.org/assignments/charset-reg/windows-1258 + Windows1258 MIB = 2258 + + // TIS620 is the MIB identifier with IANA name TIS-620. + // + // Thai Industrial Standards Institute (TISI) + TIS620 MIB = 2259 + + // CP50220 is the MIB identifier with IANA name CP50220. + // + // See http://www.iana.org/assignments/charset-reg/CP50220 + CP50220 MIB = 2260 +) diff --git a/vendor/golang.org/x/text/encoding/internal/internal.go b/vendor/golang.org/x/text/encoding/internal/internal.go new file mode 100644 index 0000000000..75a5fd1658 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/internal/internal.go @@ -0,0 +1,75 @@ +// 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 internal contains code that is shared among encoding implementations. +package internal + +import ( + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal/identifier" + "golang.org/x/text/transform" +) + +// Encoding is an implementation of the Encoding interface that adds the String +// and ID methods to an existing encoding. +type Encoding struct { + encoding.Encoding + Name string + MIB identifier.MIB +} + +// _ verifies that Encoding implements identifier.Interface. +var _ identifier.Interface = (*Encoding)(nil) + +func (e *Encoding) String() string { + return e.Name +} + +func (e *Encoding) ID() (mib identifier.MIB, other string) { + return e.MIB, "" +} + +// SimpleEncoding is an Encoding that combines two Transformers. +type SimpleEncoding struct { + Decoder transform.Transformer + Encoder transform.Transformer +} + +func (e *SimpleEncoding) NewDecoder() *encoding.Decoder { + return &encoding.Decoder{Transformer: e.Decoder} +} + +func (e *SimpleEncoding) NewEncoder() *encoding.Encoder { + return &encoding.Encoder{Transformer: e.Encoder} +} + +// FuncEncoding is an Encoding that combines two functions returning a new +// Transformer. +type FuncEncoding struct { + Decoder func() transform.Transformer + Encoder func() transform.Transformer +} + +func (e FuncEncoding) NewDecoder() *encoding.Decoder { + return &encoding.Decoder{Transformer: e.Decoder()} +} + +func (e FuncEncoding) NewEncoder() *encoding.Encoder { + return &encoding.Encoder{Transformer: e.Encoder()} +} + +// A RepertoireError indicates a rune is not in the repertoire of a destination +// encoding. It is associated with an encoding-specific suggested replacement +// byte. +type RepertoireError byte + +// Error implements the error interrface. +func (r RepertoireError) Error() string { + return "encoding: rune not supported by encoding." +} + +// Replacement returns the replacement string associated with this error. +func (r RepertoireError) Replacement() byte { return byte(r) } + +var ErrASCIIReplacement = RepertoireError(encoding.ASCIISub) diff --git a/vendor/golang.org/x/text/encoding/japanese/all.go b/vendor/golang.org/x/text/encoding/japanese/all.go new file mode 100644 index 0000000000..6cfa8de450 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/japanese/all.go @@ -0,0 +1,12 @@ +// 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 japanese + +import ( + "golang.org/x/text/encoding" +) + +// All is a list of all defined encodings in this package. +var All = []encoding.Encoding{EUCJP, ISO2022JP, ShiftJIS} diff --git a/vendor/golang.org/x/text/encoding/japanese/all_test.go b/vendor/golang.org/x/text/encoding/japanese/all_test.go new file mode 100644 index 0000000000..fe397aaef4 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/japanese/all_test.go @@ -0,0 +1,80 @@ +// 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 japanese + +import ( + "testing" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal" + "golang.org/x/text/transform" +) + +func dec(e encoding.Encoding) (dir string, t transform.Transformer, err error) { + return "Decode", e.NewDecoder(), nil +} +func enc(e encoding.Encoding) (dir string, t transform.Transformer, err error) { + return "Encode", e.NewEncoder(), internal.ErrASCIIReplacement +} + +func TestNonRepertoire(t *testing.T) { + testCases := []struct { + init func(e encoding.Encoding) (string, transform.Transformer, error) + e encoding.Encoding + src, want string + }{ + {dec, EUCJP, "\xfe\xfc", "\ufffd"}, + {dec, ISO2022JP, "\x1b$B\x7e\x7e", "\ufffd"}, + {dec, ShiftJIS, "\xef\xfc", "\ufffd"}, + + {enc, EUCJP, "갂", ""}, + {enc, EUCJP, "a갂", "a"}, + {enc, EUCJP, "丌갂", "\x8f\xb0\xa4"}, + + {enc, ISO2022JP, "갂", ""}, + {enc, ISO2022JP, "a갂", "a"}, + {enc, ISO2022JP, "朗갂", "\x1b$BzF\x1b(B"}, // switch back to ASCII mode at end + + {enc, ShiftJIS, "갂", ""}, + {enc, ShiftJIS, "a갂", "a"}, + {enc, ShiftJIS, "\u2190갂", "\x81\xa9"}, + } + for _, tc := range testCases { + dir, tr, wantErr := tc.init(tc.e) + + dst, _, err := transform.String(tr, tc.src) + if err != wantErr { + t.Errorf("%s %v(%q): got %v; want %v", dir, tc.e, tc.src, err, wantErr) + } + if got := string(dst); got != tc.want { + t.Errorf("%s %v(%q):\ngot %q\nwant %q", dir, tc.e, tc.src, got, tc.want) + } + } +} + +func TestCorrect(t *testing.T) { + testCases := []struct { + init func(e encoding.Encoding) (string, transform.Transformer, error) + e encoding.Encoding + src, want string + }{ + {dec, ShiftJIS, "\x9f\xfc", "滌"}, + {dec, ShiftJIS, "\xfb\xfc", "髙"}, + {dec, ShiftJIS, "\xfa\xb1", "﨑"}, + {enc, ShiftJIS, "滌", "\x9f\xfc"}, + {enc, ShiftJIS, "﨑", "\xed\x95"}, + } + for _, tc := range testCases { + dir, tr, _ := tc.init(tc.e) + + dst, _, err := transform.String(tr, tc.src) + if err != nil { + t.Errorf("%s %v(%q): got %v; want %v", dir, tc.e, tc.src, err, nil) + } + if got := string(dst); got != tc.want { + t.Errorf("%s %v(%q):\ngot %q\nwant %q", dir, tc.e, tc.src, got, tc.want) + } + } +} diff --git a/vendor/golang.org/x/text/encoding/japanese/eucjp.go b/vendor/golang.org/x/text/encoding/japanese/eucjp.go new file mode 100644 index 0000000000..40f9b05f38 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/japanese/eucjp.go @@ -0,0 +1,211 @@ +// Copyright 2013 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 japanese + +import ( + "errors" + "unicode/utf8" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal" + "golang.org/x/text/encoding/internal/identifier" + "golang.org/x/text/transform" +) + +// EUCJP is the EUC-JP encoding. +var EUCJP encoding.Encoding = &eucJP + +var eucJP = internal.Encoding{ + &internal.SimpleEncoding{eucJPDecoder{}, eucJPEncoder{}}, + "EUC-JP", + identifier.EUCPkdFmtJapanese, +} + +var errInvalidEUCJP = errors.New("japanese: invalid EUC-JP encoding") + +type eucJPDecoder struct{ transform.NopResetter } + +func (eucJPDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + r, size := rune(0), 0 +loop: + for ; nSrc < len(src); nSrc += size { + switch c0 := src[nSrc]; { + case c0 < utf8.RuneSelf: + r, size = rune(c0), 1 + + case c0 == 0x8e: + if nSrc+1 >= len(src) { + err = transform.ErrShortSrc + break loop + } + c1 := src[nSrc+1] + if c1 < 0xa1 || 0xdf < c1 { + err = errInvalidEUCJP + break loop + } + r, size = rune(c1)+(0xff61-0xa1), 2 + + case c0 == 0x8f: + if nSrc+2 >= len(src) { + err = transform.ErrShortSrc + break loop + } + c1 := src[nSrc+1] + if c1 < 0xa1 || 0xfe < c1 { + err = errInvalidEUCJP + break loop + } + c2 := src[nSrc+2] + if c2 < 0xa1 || 0xfe < c2 { + err = errInvalidEUCJP + break loop + } + r, size = '\ufffd', 3 + if i := int(c1-0xa1)*94 + int(c2-0xa1); i < len(jis0212Decode) { + r = rune(jis0212Decode[i]) + if r == 0 { + r = '\ufffd' + } + } + + case 0xa1 <= c0 && c0 <= 0xfe: + if nSrc+1 >= len(src) { + err = transform.ErrShortSrc + break loop + } + c1 := src[nSrc+1] + if c1 < 0xa1 || 0xfe < c1 { + err = errInvalidEUCJP + break loop + } + r, size = '\ufffd', 2 + if i := int(c0-0xa1)*94 + int(c1-0xa1); i < len(jis0208Decode) { + r = rune(jis0208Decode[i]) + if r == 0 { + r = '\ufffd' + } + } + + default: + err = errInvalidEUCJP + break loop + } + + if nDst+utf8.RuneLen(r) > len(dst) { + err = transform.ErrShortDst + break loop + } + nDst += utf8.EncodeRune(dst[nDst:], r) + } + if atEOF && err == transform.ErrShortSrc { + err = errInvalidEUCJP + } + return nDst, nSrc, err +} + +type eucJPEncoder struct{ transform.NopResetter } + +func (eucJPEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + r, size := rune(0), 0 + for ; nSrc < len(src); nSrc += size { + r = rune(src[nSrc]) + + // Decode a 1-byte rune. + if r < utf8.RuneSelf { + size = 1 + + } else { + // Decode a multi-byte rune. + r, size = utf8.DecodeRune(src[nSrc:]) + if size == 1 { + // All valid runes of size 1 (those below utf8.RuneSelf) were + // handled above. We have invalid UTF-8 or we haven't seen the + // full character yet. + if !atEOF && !utf8.FullRune(src[nSrc:]) { + err = transform.ErrShortSrc + break + } + } + + // func init checks that the switch covers all tables. + switch { + case encode0Low <= r && r < encode0High: + if r = rune(encode0[r-encode0Low]); r != 0 { + goto write2or3 + } + case encode1Low <= r && r < encode1High: + if r = rune(encode1[r-encode1Low]); r != 0 { + goto write2or3 + } + case encode2Low <= r && r < encode2High: + if r = rune(encode2[r-encode2Low]); r != 0 { + goto write2or3 + } + case encode3Low <= r && r < encode3High: + if r = rune(encode3[r-encode3Low]); r != 0 { + goto write2or3 + } + case encode4Low <= r && r < encode4High: + if r = rune(encode4[r-encode4Low]); r != 0 { + goto write2or3 + } + case encode5Low <= r && r < encode5High: + if 0xff61 <= r && r < 0xffa0 { + goto write2 + } + if r = rune(encode5[r-encode5Low]); r != 0 { + goto write2or3 + } + } + err = internal.ErrASCIIReplacement + break + } + + if nDst >= len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst] = uint8(r) + nDst++ + continue + + write2or3: + if r>>tableShift == jis0208 { + if nDst+2 > len(dst) { + err = transform.ErrShortDst + break + } + } else { + if nDst+3 > len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst] = 0x8f + nDst++ + } + dst[nDst+0] = 0xa1 + uint8(r>>codeShift)&codeMask + dst[nDst+1] = 0xa1 + uint8(r)&codeMask + nDst += 2 + continue + + write2: + if nDst+2 > len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst+0] = 0x8e + dst[nDst+1] = uint8(r - (0xff61 - 0xa1)) + nDst += 2 + continue + } + return nDst, nSrc, err +} + +func init() { + // Check that the hard-coded encode switch covers all tables. + if numEncodeTables != 6 { + panic("bad numEncodeTables") + } +} diff --git a/vendor/golang.org/x/text/encoding/japanese/iso2022jp.go b/vendor/golang.org/x/text/encoding/japanese/iso2022jp.go new file mode 100644 index 0000000000..b63e7d5d8f --- /dev/null +++ b/vendor/golang.org/x/text/encoding/japanese/iso2022jp.go @@ -0,0 +1,296 @@ +// Copyright 2013 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 japanese + +import ( + "errors" + "unicode/utf8" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal" + "golang.org/x/text/encoding/internal/identifier" + "golang.org/x/text/transform" +) + +// ISO2022JP is the ISO-2022-JP encoding. +var ISO2022JP encoding.Encoding = &iso2022JP + +var iso2022JP = internal.Encoding{ + internal.FuncEncoding{iso2022JPNewDecoder, iso2022JPNewEncoder}, + "ISO-2022-JP", + identifier.ISO2022JP, +} + +func iso2022JPNewDecoder() transform.Transformer { + return new(iso2022JPDecoder) +} + +func iso2022JPNewEncoder() transform.Transformer { + return new(iso2022JPEncoder) +} + +var errInvalidISO2022JP = errors.New("japanese: invalid ISO-2022-JP encoding") + +const ( + asciiState = iota + katakanaState + jis0208State + jis0212State +) + +const asciiEsc = 0x1b + +type iso2022JPDecoder int + +func (d *iso2022JPDecoder) Reset() { + *d = asciiState +} + +func (d *iso2022JPDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + r, size := rune(0), 0 +loop: + for ; nSrc < len(src); nSrc += size { + c0 := src[nSrc] + if c0 >= utf8.RuneSelf { + err = errInvalidISO2022JP + break loop + } + + if c0 == asciiEsc { + if nSrc+2 >= len(src) { + err = transform.ErrShortSrc + break loop + } + size = 3 + c1 := src[nSrc+1] + c2 := src[nSrc+2] + switch { + case c1 == '$' && (c2 == '@' || c2 == 'B'): + *d = jis0208State + continue + case c1 == '$' && c2 == '(': + if nSrc+3 >= len(src) { + err = transform.ErrShortSrc + break loop + } + size = 4 + if src[nSrc]+3 == 'D' { + *d = jis0212State + continue + } + case c1 == '(' && (c2 == 'B' || c2 == 'J'): + *d = asciiState + continue + case c1 == '(' && c2 == 'I': + *d = katakanaState + continue + } + err = errInvalidISO2022JP + break loop + } + + switch *d { + case asciiState: + r, size = rune(c0), 1 + + case katakanaState: + if c0 < 0x21 || 0x60 <= c0 { + err = errInvalidISO2022JP + break loop + } + r, size = rune(c0)+(0xff61-0x21), 1 + + default: + if c0 == 0x0a { + *d = asciiState + r, size = rune(c0), 1 + break + } + if nSrc+1 >= len(src) { + err = transform.ErrShortSrc + break loop + } + size = 2 + c1 := src[nSrc+1] + i := int(c0-0x21)*94 + int(c1-0x21) + if *d == jis0208State && i < len(jis0208Decode) { + r = rune(jis0208Decode[i]) + } else if *d == jis0212State && i < len(jis0212Decode) { + r = rune(jis0212Decode[i]) + } else { + r = '\ufffd' + break + } + if r == 0 { + r = '\ufffd' + } + } + + if nDst+utf8.RuneLen(r) > len(dst) { + err = transform.ErrShortDst + break loop + } + nDst += utf8.EncodeRune(dst[nDst:], r) + } + if atEOF && err == transform.ErrShortSrc { + err = errInvalidISO2022JP + } + return nDst, nSrc, err +} + +type iso2022JPEncoder int + +func (e *iso2022JPEncoder) Reset() { + *e = asciiState +} + +func (e *iso2022JPEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + r, size := rune(0), 0 + for ; nSrc < len(src); nSrc += size { + r = rune(src[nSrc]) + + // Decode a 1-byte rune. + if r < utf8.RuneSelf { + size = 1 + + } else { + // Decode a multi-byte rune. + r, size = utf8.DecodeRune(src[nSrc:]) + if size == 1 { + // All valid runes of size 1 (those below utf8.RuneSelf) were + // handled above. We have invalid UTF-8 or we haven't seen the + // full character yet. + if !atEOF && !utf8.FullRune(src[nSrc:]) { + err = transform.ErrShortSrc + break + } + } + + // func init checks that the switch covers all tables. + // + // http://encoding.spec.whatwg.org/#iso-2022-jp says that "the index jis0212 + // is not used by the iso-2022-jp encoder due to lack of widespread support". + // + // TODO: do we have to special-case U+00A5 and U+203E, as per + // http://encoding.spec.whatwg.org/#iso-2022-jp + // Doing so would mean that "\u00a5" would not be preserved + // after an encode-decode round trip. + switch { + case encode0Low <= r && r < encode0High: + if r = rune(encode0[r-encode0Low]); r>>tableShift == jis0208 { + goto writeJIS + } + case encode1Low <= r && r < encode1High: + if r = rune(encode1[r-encode1Low]); r>>tableShift == jis0208 { + goto writeJIS + } + case encode2Low <= r && r < encode2High: + if r = rune(encode2[r-encode2Low]); r>>tableShift == jis0208 { + goto writeJIS + } + case encode3Low <= r && r < encode3High: + if r = rune(encode3[r-encode3Low]); r>>tableShift == jis0208 { + goto writeJIS + } + case encode4Low <= r && r < encode4High: + if r = rune(encode4[r-encode4Low]); r>>tableShift == jis0208 { + goto writeJIS + } + case encode5Low <= r && r < encode5High: + if 0xff61 <= r && r < 0xffa0 { + goto writeKatakana + } + if r = rune(encode5[r-encode5Low]); r>>tableShift == jis0208 { + goto writeJIS + } + } + + // Switch back to ASCII state in case of error so that an ASCII + // replacement character can be written in the correct state. + if *e != asciiState { + if nDst+3 > len(dst) { + err = transform.ErrShortDst + break + } + *e = asciiState + dst[nDst+0] = asciiEsc + dst[nDst+1] = '(' + dst[nDst+2] = 'B' + nDst += 3 + } + err = internal.ErrASCIIReplacement + break + } + + if *e != asciiState { + if nDst+4 > len(dst) { + err = transform.ErrShortDst + break + } + *e = asciiState + dst[nDst+0] = asciiEsc + dst[nDst+1] = '(' + dst[nDst+2] = 'B' + nDst += 3 + } else if nDst >= len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst] = uint8(r) + nDst++ + continue + + writeJIS: + if *e != jis0208State { + if nDst+5 > len(dst) { + err = transform.ErrShortDst + break + } + *e = jis0208State + dst[nDst+0] = asciiEsc + dst[nDst+1] = '$' + dst[nDst+2] = 'B' + nDst += 3 + } else if nDst+2 > len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst+0] = 0x21 + uint8(r>>codeShift)&codeMask + dst[nDst+1] = 0x21 + uint8(r)&codeMask + nDst += 2 + continue + + writeKatakana: + if *e != katakanaState { + if nDst+4 > len(dst) { + err = transform.ErrShortDst + break + } + *e = katakanaState + dst[nDst+0] = asciiEsc + dst[nDst+1] = '(' + dst[nDst+2] = 'I' + nDst += 3 + } else if nDst >= len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst] = uint8(r - (0xff61 - 0x21)) + nDst++ + continue + } + if atEOF && err == nil && *e != asciiState { + if nDst+3 > len(dst) { + err = transform.ErrShortDst + } else { + *e = asciiState + dst[nDst+0] = asciiEsc + dst[nDst+1] = '(' + dst[nDst+2] = 'B' + nDst += 3 + } + } + return nDst, nSrc, err +} diff --git a/vendor/golang.org/x/text/encoding/japanese/maketables.go b/vendor/golang.org/x/text/encoding/japanese/maketables.go new file mode 100644 index 0000000000..d6c10deb07 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/japanese/maketables.go @@ -0,0 +1,161 @@ +// Copyright 2013 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 + +// This program generates tables.go: +// go run maketables.go | gofmt > tables.go + +// TODO: Emoji extensions? +// http://www.unicode.org/faq/emoji_dingbats.html +// http://www.unicode.org/Public/UNIDATA/EmojiSources.txt + +import ( + "bufio" + "fmt" + "log" + "net/http" + "sort" + "strings" +) + +type entry struct { + jisCode, table int +} + +func main() { + fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n") + fmt.Printf("// Package japanese provides Japanese encodings such as EUC-JP and Shift JIS.\n") + fmt.Printf(`package japanese // import "golang.org/x/text/encoding/japanese"` + "\n\n") + + reverse := [65536]entry{} + for i := range reverse { + reverse[i].table = -1 + } + + tables := []struct { + url string + name string + }{ + {"http://encoding.spec.whatwg.org/index-jis0208.txt", "0208"}, + {"http://encoding.spec.whatwg.org/index-jis0212.txt", "0212"}, + } + for i, table := range tables { + res, err := http.Get(table.url) + if err != nil { + log.Fatalf("%q: Get: %v", table.url, err) + } + defer res.Body.Close() + + mapping := [65536]uint16{} + + scanner := bufio.NewScanner(res.Body) + for scanner.Scan() { + s := strings.TrimSpace(scanner.Text()) + if s == "" || s[0] == '#' { + continue + } + x, y := 0, uint16(0) + if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { + log.Fatalf("%q: could not parse %q", table.url, s) + } + if x < 0 || 120*94 <= x { + log.Fatalf("%q: JIS code %d is out of range", table.url, x) + } + mapping[x] = y + if reverse[y].table == -1 { + reverse[y] = entry{jisCode: x, table: i} + } + } + if err := scanner.Err(); err != nil { + log.Fatalf("%q: scanner error: %v", table.url, err) + } + + fmt.Printf("// jis%sDecode is the decoding table from JIS %s code to Unicode.\n// It is defined at %s\n", + table.name, table.name, table.url) + fmt.Printf("var jis%sDecode = [...]uint16{\n", table.name) + for i, m := range mapping { + if m != 0 { + fmt.Printf("\t%d: 0x%04X,\n", i, m) + } + } + fmt.Printf("}\n\n") + } + + // Any run of at least separation continuous zero entries in the reverse map will + // be a separate encode table. + const separation = 1024 + + intervals := []interval(nil) + low, high := -1, -1 + for i, v := range reverse { + if v.table == -1 { + continue + } + if low < 0 { + low = i + } else if i-high >= separation { + if high >= 0 { + intervals = append(intervals, interval{low, high}) + } + low = i + } + high = i + 1 + } + if high >= 0 { + intervals = append(intervals, interval{low, high}) + } + sort.Sort(byDecreasingLength(intervals)) + + fmt.Printf("const (\n") + fmt.Printf("\tjis0208 = 1\n") + fmt.Printf("\tjis0212 = 2\n") + fmt.Printf("\tcodeMask = 0x7f\n") + fmt.Printf("\tcodeShift = 7\n") + fmt.Printf("\ttableShift = 14\n") + fmt.Printf(")\n\n") + + fmt.Printf("const numEncodeTables = %d\n\n", len(intervals)) + fmt.Printf("// encodeX are the encoding tables from Unicode to JIS code,\n") + fmt.Printf("// sorted by decreasing length.\n") + for i, v := range intervals { + fmt.Printf("// encode%d: %5d entries for runes in [%5d, %5d).\n", i, v.len(), v.low, v.high) + } + fmt.Printf("//\n") + fmt.Printf("// The high two bits of the value record whether the JIS code comes from the\n") + fmt.Printf("// JIS0208 table (high bits == 1) or the JIS0212 table (high bits == 2).\n") + fmt.Printf("// The low 14 bits are two 7-bit unsigned integers j1 and j2 that form the\n") + fmt.Printf("// JIS code (94*j1 + j2) within that table.\n") + fmt.Printf("\n") + + for i, v := range intervals { + fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high) + fmt.Printf("var encode%d = [...]uint16{\n", i) + for j := v.low; j < v.high; j++ { + x := reverse[j] + if x.table == -1 { + continue + } + fmt.Printf("\t%d - %d: jis%s<<14 | 0x%02X<<7 | 0x%02X,\n", + j, v.low, tables[x.table].name, x.jisCode/94, x.jisCode%94) + } + fmt.Printf("}\n\n") + } +} + +// interval is a half-open interval [low, high). +type interval struct { + low, high int +} + +func (i interval) len() int { return i.high - i.low } + +// byDecreasingLength sorts intervals by decreasing length. +type byDecreasingLength []interval + +func (b byDecreasingLength) Len() int { return len(b) } +func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() } +func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] } diff --git a/vendor/golang.org/x/text/encoding/japanese/shiftjis.go b/vendor/golang.org/x/text/encoding/japanese/shiftjis.go new file mode 100644 index 0000000000..099aecc31c --- /dev/null +++ b/vendor/golang.org/x/text/encoding/japanese/shiftjis.go @@ -0,0 +1,189 @@ +// Copyright 2013 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 japanese + +import ( + "errors" + "unicode/utf8" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal" + "golang.org/x/text/encoding/internal/identifier" + "golang.org/x/text/transform" +) + +// ShiftJIS is the Shift JIS encoding, also known as Code Page 932 and +// Windows-31J. +var ShiftJIS encoding.Encoding = &shiftJIS + +var shiftJIS = internal.Encoding{ + &internal.SimpleEncoding{shiftJISDecoder{}, shiftJISEncoder{}}, + "Shift JIS", + identifier.ShiftJIS, +} + +var errInvalidShiftJIS = errors.New("japanese: invalid Shift JIS encoding") + +type shiftJISDecoder struct{ transform.NopResetter } + +func (shiftJISDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + r, size := rune(0), 0 +loop: + for ; nSrc < len(src); nSrc += size { + switch c0 := src[nSrc]; { + case c0 < utf8.RuneSelf: + r, size = rune(c0), 1 + + case 0xa1 <= c0 && c0 < 0xe0: + r, size = rune(c0)+(0xff61-0xa1), 1 + + case (0x81 <= c0 && c0 < 0xa0) || (0xe0 <= c0 && c0 < 0xfd): + if c0 <= 0x9f { + c0 -= 0x70 + } else { + c0 -= 0xb0 + } + c0 = 2*c0 - 0x21 + + if nSrc+1 >= len(src) { + err = transform.ErrShortSrc + break loop + } + c1 := src[nSrc+1] + switch { + case c1 < 0x40: + err = errInvalidShiftJIS + break loop + case c1 < 0x7f: + c0-- + c1 -= 0x40 + case c1 == 0x7f: + err = errInvalidShiftJIS + break loop + case c1 < 0x9f: + c0-- + c1 -= 0x41 + case c1 < 0xfd: + c1 -= 0x9f + default: + err = errInvalidShiftJIS + break loop + } + r, size = '\ufffd', 2 + if i := int(c0)*94 + int(c1); i < len(jis0208Decode) { + r = rune(jis0208Decode[i]) + if r == 0 { + r = '\ufffd' + } + } + + default: + err = errInvalidShiftJIS + break loop + } + + if nDst+utf8.RuneLen(r) > len(dst) { + err = transform.ErrShortDst + break loop + } + nDst += utf8.EncodeRune(dst[nDst:], r) + } + if atEOF && err == transform.ErrShortSrc { + err = errInvalidShiftJIS + } + return nDst, nSrc, err +} + +type shiftJISEncoder struct{ transform.NopResetter } + +func (shiftJISEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + r, size := rune(0), 0 +loop: + for ; nSrc < len(src); nSrc += size { + r = rune(src[nSrc]) + + // Decode a 1-byte rune. + if r < utf8.RuneSelf { + size = 1 + + } else { + // Decode a multi-byte rune. + r, size = utf8.DecodeRune(src[nSrc:]) + if size == 1 { + // All valid runes of size 1 (those below utf8.RuneSelf) were + // handled above. We have invalid UTF-8 or we haven't seen the + // full character yet. + if !atEOF && !utf8.FullRune(src[nSrc:]) { + err = transform.ErrShortSrc + break loop + } + } + + // func init checks that the switch covers all tables. + switch { + case encode0Low <= r && r < encode0High: + if r = rune(encode0[r-encode0Low]); r>>tableShift == jis0208 { + goto write2 + } + case encode1Low <= r && r < encode1High: + if r = rune(encode1[r-encode1Low]); r>>tableShift == jis0208 { + goto write2 + } + case encode2Low <= r && r < encode2High: + if r = rune(encode2[r-encode2Low]); r>>tableShift == jis0208 { + goto write2 + } + case encode3Low <= r && r < encode3High: + if r = rune(encode3[r-encode3Low]); r>>tableShift == jis0208 { + goto write2 + } + case encode4Low <= r && r < encode4High: + if r = rune(encode4[r-encode4Low]); r>>tableShift == jis0208 { + goto write2 + } + case encode5Low <= r && r < encode5High: + if 0xff61 <= r && r < 0xffa0 { + r -= 0xff61 - 0xa1 + goto write1 + } + if r = rune(encode5[r-encode5Low]); r>>tableShift == jis0208 { + goto write2 + } + } + err = internal.ErrASCIIReplacement + break + } + + write1: + if nDst >= len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst] = uint8(r) + nDst++ + continue + + write2: + j1 := uint8(r>>codeShift) & codeMask + j2 := uint8(r) & codeMask + if nDst+2 > len(dst) { + err = transform.ErrShortDst + break loop + } + if j1 <= 61 { + dst[nDst+0] = 129 + j1/2 + } else { + dst[nDst+0] = 193 + j1/2 + } + if j1&1 == 0 { + dst[nDst+1] = j2 + j2/63 + 64 + } else { + dst[nDst+1] = j2 + 159 + } + nDst += 2 + continue + } + return nDst, nSrc, err +} diff --git a/vendor/golang.org/x/text/encoding/japanese/tables.go b/vendor/golang.org/x/text/encoding/japanese/tables.go new file mode 100644 index 0000000000..8717b79ae0 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/japanese/tables.go @@ -0,0 +1,26971 @@ +// generated by go run maketables.go; DO NOT EDIT + +// Package japanese provides Japanese encodings such as EUC-JP and Shift JIS. +package japanese // import "golang.org/x/text/encoding/japanese" + +// jis0208Decode is the decoding table from JIS 0208 code to Unicode. +// It is defined at http://encoding.spec.whatwg.org/index-jis0208.txt +var jis0208Decode = [...]uint16{ + 0: 0x3000, + 1: 0x3001, + 2: 0x3002, + 3: 0xFF0C, + 4: 0xFF0E, + 5: 0x30FB, + 6: 0xFF1A, + 7: 0xFF1B, + 8: 0xFF1F, + 9: 0xFF01, + 10: 0x309B, + 11: 0x309C, + 12: 0x00B4, + 13: 0xFF40, + 14: 0x00A8, + 15: 0xFF3E, + 16: 0xFFE3, + 17: 0xFF3F, + 18: 0x30FD, + 19: 0x30FE, + 20: 0x309D, + 21: 0x309E, + 22: 0x3003, + 23: 0x4EDD, + 24: 0x3005, + 25: 0x3006, + 26: 0x3007, + 27: 0x30FC, + 28: 0x2015, + 29: 0x2010, + 30: 0xFF0F, + 31: 0xFF3C, + 32: 0xFF5E, + 33: 0x2225, + 34: 0xFF5C, + 35: 0x2026, + 36: 0x2025, + 37: 0x2018, + 38: 0x2019, + 39: 0x201C, + 40: 0x201D, + 41: 0xFF08, + 42: 0xFF09, + 43: 0x3014, + 44: 0x3015, + 45: 0xFF3B, + 46: 0xFF3D, + 47: 0xFF5B, + 48: 0xFF5D, + 49: 0x3008, + 50: 0x3009, + 51: 0x300A, + 52: 0x300B, + 53: 0x300C, + 54: 0x300D, + 55: 0x300E, + 56: 0x300F, + 57: 0x3010, + 58: 0x3011, + 59: 0xFF0B, + 60: 0xFF0D, + 61: 0x00B1, + 62: 0x00D7, + 63: 0x00F7, + 64: 0xFF1D, + 65: 0x2260, + 66: 0xFF1C, + 67: 0xFF1E, + 68: 0x2266, + 69: 0x2267, + 70: 0x221E, + 71: 0x2234, + 72: 0x2642, + 73: 0x2640, + 74: 0x00B0, + 75: 0x2032, + 76: 0x2033, + 77: 0x2103, + 78: 0xFFE5, + 79: 0xFF04, + 80: 0xFFE0, + 81: 0xFFE1, + 82: 0xFF05, + 83: 0xFF03, + 84: 0xFF06, + 85: 0xFF0A, + 86: 0xFF20, + 87: 0x00A7, + 88: 0x2606, + 89: 0x2605, + 90: 0x25CB, + 91: 0x25CF, + 92: 0x25CE, + 93: 0x25C7, + 94: 0x25C6, + 95: 0x25A1, + 96: 0x25A0, + 97: 0x25B3, + 98: 0x25B2, + 99: 0x25BD, + 100: 0x25BC, + 101: 0x203B, + 102: 0x3012, + 103: 0x2192, + 104: 0x2190, + 105: 0x2191, + 106: 0x2193, + 107: 0x3013, + 119: 0x2208, + 120: 0x220B, + 121: 0x2286, + 122: 0x2287, + 123: 0x2282, + 124: 0x2283, + 125: 0x222A, + 126: 0x2229, + 135: 0x2227, + 136: 0x2228, + 137: 0xFFE2, + 138: 0x21D2, + 139: 0x21D4, + 140: 0x2200, + 141: 0x2203, + 153: 0x2220, + 154: 0x22A5, + 155: 0x2312, + 156: 0x2202, + 157: 0x2207, + 158: 0x2261, + 159: 0x2252, + 160: 0x226A, + 161: 0x226B, + 162: 0x221A, + 163: 0x223D, + 164: 0x221D, + 165: 0x2235, + 166: 0x222B, + 167: 0x222C, + 175: 0x212B, + 176: 0x2030, + 177: 0x266F, + 178: 0x266D, + 179: 0x266A, + 180: 0x2020, + 181: 0x2021, + 182: 0x00B6, + 187: 0x25EF, + 203: 0xFF10, + 204: 0xFF11, + 205: 0xFF12, + 206: 0xFF13, + 207: 0xFF14, + 208: 0xFF15, + 209: 0xFF16, + 210: 0xFF17, + 211: 0xFF18, + 212: 0xFF19, + 220: 0xFF21, + 221: 0xFF22, + 222: 0xFF23, + 223: 0xFF24, + 224: 0xFF25, + 225: 0xFF26, + 226: 0xFF27, + 227: 0xFF28, + 228: 0xFF29, + 229: 0xFF2A, + 230: 0xFF2B, + 231: 0xFF2C, + 232: 0xFF2D, + 233: 0xFF2E, + 234: 0xFF2F, + 235: 0xFF30, + 236: 0xFF31, + 237: 0xFF32, + 238: 0xFF33, + 239: 0xFF34, + 240: 0xFF35, + 241: 0xFF36, + 242: 0xFF37, + 243: 0xFF38, + 244: 0xFF39, + 245: 0xFF3A, + 252: 0xFF41, + 253: 0xFF42, + 254: 0xFF43, + 255: 0xFF44, + 256: 0xFF45, + 257: 0xFF46, + 258: 0xFF47, + 259: 0xFF48, + 260: 0xFF49, + 261: 0xFF4A, + 262: 0xFF4B, + 263: 0xFF4C, + 264: 0xFF4D, + 265: 0xFF4E, + 266: 0xFF4F, + 267: 0xFF50, + 268: 0xFF51, + 269: 0xFF52, + 270: 0xFF53, + 271: 0xFF54, + 272: 0xFF55, + 273: 0xFF56, + 274: 0xFF57, + 275: 0xFF58, + 276: 0xFF59, + 277: 0xFF5A, + 282: 0x3041, + 283: 0x3042, + 284: 0x3043, + 285: 0x3044, + 286: 0x3045, + 287: 0x3046, + 288: 0x3047, + 289: 0x3048, + 290: 0x3049, + 291: 0x304A, + 292: 0x304B, + 293: 0x304C, + 294: 0x304D, + 295: 0x304E, + 296: 0x304F, + 297: 0x3050, + 298: 0x3051, + 299: 0x3052, + 300: 0x3053, + 301: 0x3054, + 302: 0x3055, + 303: 0x3056, + 304: 0x3057, + 305: 0x3058, + 306: 0x3059, + 307: 0x305A, + 308: 0x305B, + 309: 0x305C, + 310: 0x305D, + 311: 0x305E, + 312: 0x305F, + 313: 0x3060, + 314: 0x3061, + 315: 0x3062, + 316: 0x3063, + 317: 0x3064, + 318: 0x3065, + 319: 0x3066, + 320: 0x3067, + 321: 0x3068, + 322: 0x3069, + 323: 0x306A, + 324: 0x306B, + 325: 0x306C, + 326: 0x306D, + 327: 0x306E, + 328: 0x306F, + 329: 0x3070, + 330: 0x3071, + 331: 0x3072, + 332: 0x3073, + 333: 0x3074, + 334: 0x3075, + 335: 0x3076, + 336: 0x3077, + 337: 0x3078, + 338: 0x3079, + 339: 0x307A, + 340: 0x307B, + 341: 0x307C, + 342: 0x307D, + 343: 0x307E, + 344: 0x307F, + 345: 0x3080, + 346: 0x3081, + 347: 0x3082, + 348: 0x3083, + 349: 0x3084, + 350: 0x3085, + 351: 0x3086, + 352: 0x3087, + 353: 0x3088, + 354: 0x3089, + 355: 0x308A, + 356: 0x308B, + 357: 0x308C, + 358: 0x308D, + 359: 0x308E, + 360: 0x308F, + 361: 0x3090, + 362: 0x3091, + 363: 0x3092, + 364: 0x3093, + 376: 0x30A1, + 377: 0x30A2, + 378: 0x30A3, + 379: 0x30A4, + 380: 0x30A5, + 381: 0x30A6, + 382: 0x30A7, + 383: 0x30A8, + 384: 0x30A9, + 385: 0x30AA, + 386: 0x30AB, + 387: 0x30AC, + 388: 0x30AD, + 389: 0x30AE, + 390: 0x30AF, + 391: 0x30B0, + 392: 0x30B1, + 393: 0x30B2, + 394: 0x30B3, + 395: 0x30B4, + 396: 0x30B5, + 397: 0x30B6, + 398: 0x30B7, + 399: 0x30B8, + 400: 0x30B9, + 401: 0x30BA, + 402: 0x30BB, + 403: 0x30BC, + 404: 0x30BD, + 405: 0x30BE, + 406: 0x30BF, + 407: 0x30C0, + 408: 0x30C1, + 409: 0x30C2, + 410: 0x30C3, + 411: 0x30C4, + 412: 0x30C5, + 413: 0x30C6, + 414: 0x30C7, + 415: 0x30C8, + 416: 0x30C9, + 417: 0x30CA, + 418: 0x30CB, + 419: 0x30CC, + 420: 0x30CD, + 421: 0x30CE, + 422: 0x30CF, + 423: 0x30D0, + 424: 0x30D1, + 425: 0x30D2, + 426: 0x30D3, + 427: 0x30D4, + 428: 0x30D5, + 429: 0x30D6, + 430: 0x30D7, + 431: 0x30D8, + 432: 0x30D9, + 433: 0x30DA, + 434: 0x30DB, + 435: 0x30DC, + 436: 0x30DD, + 437: 0x30DE, + 438: 0x30DF, + 439: 0x30E0, + 440: 0x30E1, + 441: 0x30E2, + 442: 0x30E3, + 443: 0x30E4, + 444: 0x30E5, + 445: 0x30E6, + 446: 0x30E7, + 447: 0x30E8, + 448: 0x30E9, + 449: 0x30EA, + 450: 0x30EB, + 451: 0x30EC, + 452: 0x30ED, + 453: 0x30EE, + 454: 0x30EF, + 455: 0x30F0, + 456: 0x30F1, + 457: 0x30F2, + 458: 0x30F3, + 459: 0x30F4, + 460: 0x30F5, + 461: 0x30F6, + 470: 0x0391, + 471: 0x0392, + 472: 0x0393, + 473: 0x0394, + 474: 0x0395, + 475: 0x0396, + 476: 0x0397, + 477: 0x0398, + 478: 0x0399, + 479: 0x039A, + 480: 0x039B, + 481: 0x039C, + 482: 0x039D, + 483: 0x039E, + 484: 0x039F, + 485: 0x03A0, + 486: 0x03A1, + 487: 0x03A3, + 488: 0x03A4, + 489: 0x03A5, + 490: 0x03A6, + 491: 0x03A7, + 492: 0x03A8, + 493: 0x03A9, + 502: 0x03B1, + 503: 0x03B2, + 504: 0x03B3, + 505: 0x03B4, + 506: 0x03B5, + 507: 0x03B6, + 508: 0x03B7, + 509: 0x03B8, + 510: 0x03B9, + 511: 0x03BA, + 512: 0x03BB, + 513: 0x03BC, + 514: 0x03BD, + 515: 0x03BE, + 516: 0x03BF, + 517: 0x03C0, + 518: 0x03C1, + 519: 0x03C3, + 520: 0x03C4, + 521: 0x03C5, + 522: 0x03C6, + 523: 0x03C7, + 524: 0x03C8, + 525: 0x03C9, + 564: 0x0410, + 565: 0x0411, + 566: 0x0412, + 567: 0x0413, + 568: 0x0414, + 569: 0x0415, + 570: 0x0401, + 571: 0x0416, + 572: 0x0417, + 573: 0x0418, + 574: 0x0419, + 575: 0x041A, + 576: 0x041B, + 577: 0x041C, + 578: 0x041D, + 579: 0x041E, + 580: 0x041F, + 581: 0x0420, + 582: 0x0421, + 583: 0x0422, + 584: 0x0423, + 585: 0x0424, + 586: 0x0425, + 587: 0x0426, + 588: 0x0427, + 589: 0x0428, + 590: 0x0429, + 591: 0x042A, + 592: 0x042B, + 593: 0x042C, + 594: 0x042D, + 595: 0x042E, + 596: 0x042F, + 612: 0x0430, + 613: 0x0431, + 614: 0x0432, + 615: 0x0433, + 616: 0x0434, + 617: 0x0435, + 618: 0x0451, + 619: 0x0436, + 620: 0x0437, + 621: 0x0438, + 622: 0x0439, + 623: 0x043A, + 624: 0x043B, + 625: 0x043C, + 626: 0x043D, + 627: 0x043E, + 628: 0x043F, + 629: 0x0440, + 630: 0x0441, + 631: 0x0442, + 632: 0x0443, + 633: 0x0444, + 634: 0x0445, + 635: 0x0446, + 636: 0x0447, + 637: 0x0448, + 638: 0x0449, + 639: 0x044A, + 640: 0x044B, + 641: 0x044C, + 642: 0x044D, + 643: 0x044E, + 644: 0x044F, + 658: 0x2500, + 659: 0x2502, + 660: 0x250C, + 661: 0x2510, + 662: 0x2518, + 663: 0x2514, + 664: 0x251C, + 665: 0x252C, + 666: 0x2524, + 667: 0x2534, + 668: 0x253C, + 669: 0x2501, + 670: 0x2503, + 671: 0x250F, + 672: 0x2513, + 673: 0x251B, + 674: 0x2517, + 675: 0x2523, + 676: 0x2533, + 677: 0x252B, + 678: 0x253B, + 679: 0x254B, + 680: 0x2520, + 681: 0x252F, + 682: 0x2528, + 683: 0x2537, + 684: 0x253F, + 685: 0x251D, + 686: 0x2530, + 687: 0x2525, + 688: 0x2538, + 689: 0x2542, + 1128: 0x2460, + 1129: 0x2461, + 1130: 0x2462, + 1131: 0x2463, + 1132: 0x2464, + 1133: 0x2465, + 1134: 0x2466, + 1135: 0x2467, + 1136: 0x2468, + 1137: 0x2469, + 1138: 0x246A, + 1139: 0x246B, + 1140: 0x246C, + 1141: 0x246D, + 1142: 0x246E, + 1143: 0x246F, + 1144: 0x2470, + 1145: 0x2471, + 1146: 0x2472, + 1147: 0x2473, + 1148: 0x2160, + 1149: 0x2161, + 1150: 0x2162, + 1151: 0x2163, + 1152: 0x2164, + 1153: 0x2165, + 1154: 0x2166, + 1155: 0x2167, + 1156: 0x2168, + 1157: 0x2169, + 1159: 0x3349, + 1160: 0x3314, + 1161: 0x3322, + 1162: 0x334D, + 1163: 0x3318, + 1164: 0x3327, + 1165: 0x3303, + 1166: 0x3336, + 1167: 0x3351, + 1168: 0x3357, + 1169: 0x330D, + 1170: 0x3326, + 1171: 0x3323, + 1172: 0x332B, + 1173: 0x334A, + 1174: 0x333B, + 1175: 0x339C, + 1176: 0x339D, + 1177: 0x339E, + 1178: 0x338E, + 1179: 0x338F, + 1180: 0x33C4, + 1181: 0x33A1, + 1190: 0x337B, + 1191: 0x301D, + 1192: 0x301F, + 1193: 0x2116, + 1194: 0x33CD, + 1195: 0x2121, + 1196: 0x32A4, + 1197: 0x32A5, + 1198: 0x32A6, + 1199: 0x32A7, + 1200: 0x32A8, + 1201: 0x3231, + 1202: 0x3232, + 1203: 0x3239, + 1204: 0x337E, + 1205: 0x337D, + 1206: 0x337C, + 1207: 0x2252, + 1208: 0x2261, + 1209: 0x222B, + 1210: 0x222E, + 1211: 0x2211, + 1212: 0x221A, + 1213: 0x22A5, + 1214: 0x2220, + 1215: 0x221F, + 1216: 0x22BF, + 1217: 0x2235, + 1218: 0x2229, + 1219: 0x222A, + 1410: 0x4E9C, + 1411: 0x5516, + 1412: 0x5A03, + 1413: 0x963F, + 1414: 0x54C0, + 1415: 0x611B, + 1416: 0x6328, + 1417: 0x59F6, + 1418: 0x9022, + 1419: 0x8475, + 1420: 0x831C, + 1421: 0x7A50, + 1422: 0x60AA, + 1423: 0x63E1, + 1424: 0x6E25, + 1425: 0x65ED, + 1426: 0x8466, + 1427: 0x82A6, + 1428: 0x9BF5, + 1429: 0x6893, + 1430: 0x5727, + 1431: 0x65A1, + 1432: 0x6271, + 1433: 0x5B9B, + 1434: 0x59D0, + 1435: 0x867B, + 1436: 0x98F4, + 1437: 0x7D62, + 1438: 0x7DBE, + 1439: 0x9B8E, + 1440: 0x6216, + 1441: 0x7C9F, + 1442: 0x88B7, + 1443: 0x5B89, + 1444: 0x5EB5, + 1445: 0x6309, + 1446: 0x6697, + 1447: 0x6848, + 1448: 0x95C7, + 1449: 0x978D, + 1450: 0x674F, + 1451: 0x4EE5, + 1452: 0x4F0A, + 1453: 0x4F4D, + 1454: 0x4F9D, + 1455: 0x5049, + 1456: 0x56F2, + 1457: 0x5937, + 1458: 0x59D4, + 1459: 0x5A01, + 1460: 0x5C09, + 1461: 0x60DF, + 1462: 0x610F, + 1463: 0x6170, + 1464: 0x6613, + 1465: 0x6905, + 1466: 0x70BA, + 1467: 0x754F, + 1468: 0x7570, + 1469: 0x79FB, + 1470: 0x7DAD, + 1471: 0x7DEF, + 1472: 0x80C3, + 1473: 0x840E, + 1474: 0x8863, + 1475: 0x8B02, + 1476: 0x9055, + 1477: 0x907A, + 1478: 0x533B, + 1479: 0x4E95, + 1480: 0x4EA5, + 1481: 0x57DF, + 1482: 0x80B2, + 1483: 0x90C1, + 1484: 0x78EF, + 1485: 0x4E00, + 1486: 0x58F1, + 1487: 0x6EA2, + 1488: 0x9038, + 1489: 0x7A32, + 1490: 0x8328, + 1491: 0x828B, + 1492: 0x9C2F, + 1493: 0x5141, + 1494: 0x5370, + 1495: 0x54BD, + 1496: 0x54E1, + 1497: 0x56E0, + 1498: 0x59FB, + 1499: 0x5F15, + 1500: 0x98F2, + 1501: 0x6DEB, + 1502: 0x80E4, + 1503: 0x852D, + 1504: 0x9662, + 1505: 0x9670, + 1506: 0x96A0, + 1507: 0x97FB, + 1508: 0x540B, + 1509: 0x53F3, + 1510: 0x5B87, + 1511: 0x70CF, + 1512: 0x7FBD, + 1513: 0x8FC2, + 1514: 0x96E8, + 1515: 0x536F, + 1516: 0x9D5C, + 1517: 0x7ABA, + 1518: 0x4E11, + 1519: 0x7893, + 1520: 0x81FC, + 1521: 0x6E26, + 1522: 0x5618, + 1523: 0x5504, + 1524: 0x6B1D, + 1525: 0x851A, + 1526: 0x9C3B, + 1527: 0x59E5, + 1528: 0x53A9, + 1529: 0x6D66, + 1530: 0x74DC, + 1531: 0x958F, + 1532: 0x5642, + 1533: 0x4E91, + 1534: 0x904B, + 1535: 0x96F2, + 1536: 0x834F, + 1537: 0x990C, + 1538: 0x53E1, + 1539: 0x55B6, + 1540: 0x5B30, + 1541: 0x5F71, + 1542: 0x6620, + 1543: 0x66F3, + 1544: 0x6804, + 1545: 0x6C38, + 1546: 0x6CF3, + 1547: 0x6D29, + 1548: 0x745B, + 1549: 0x76C8, + 1550: 0x7A4E, + 1551: 0x9834, + 1552: 0x82F1, + 1553: 0x885B, + 1554: 0x8A60, + 1555: 0x92ED, + 1556: 0x6DB2, + 1557: 0x75AB, + 1558: 0x76CA, + 1559: 0x99C5, + 1560: 0x60A6, + 1561: 0x8B01, + 1562: 0x8D8A, + 1563: 0x95B2, + 1564: 0x698E, + 1565: 0x53AD, + 1566: 0x5186, + 1567: 0x5712, + 1568: 0x5830, + 1569: 0x5944, + 1570: 0x5BB4, + 1571: 0x5EF6, + 1572: 0x6028, + 1573: 0x63A9, + 1574: 0x63F4, + 1575: 0x6CBF, + 1576: 0x6F14, + 1577: 0x708E, + 1578: 0x7114, + 1579: 0x7159, + 1580: 0x71D5, + 1581: 0x733F, + 1582: 0x7E01, + 1583: 0x8276, + 1584: 0x82D1, + 1585: 0x8597, + 1586: 0x9060, + 1587: 0x925B, + 1588: 0x9D1B, + 1589: 0x5869, + 1590: 0x65BC, + 1591: 0x6C5A, + 1592: 0x7525, + 1593: 0x51F9, + 1594: 0x592E, + 1595: 0x5965, + 1596: 0x5F80, + 1597: 0x5FDC, + 1598: 0x62BC, + 1599: 0x65FA, + 1600: 0x6A2A, + 1601: 0x6B27, + 1602: 0x6BB4, + 1603: 0x738B, + 1604: 0x7FC1, + 1605: 0x8956, + 1606: 0x9D2C, + 1607: 0x9D0E, + 1608: 0x9EC4, + 1609: 0x5CA1, + 1610: 0x6C96, + 1611: 0x837B, + 1612: 0x5104, + 1613: 0x5C4B, + 1614: 0x61B6, + 1615: 0x81C6, + 1616: 0x6876, + 1617: 0x7261, + 1618: 0x4E59, + 1619: 0x4FFA, + 1620: 0x5378, + 1621: 0x6069, + 1622: 0x6E29, + 1623: 0x7A4F, + 1624: 0x97F3, + 1625: 0x4E0B, + 1626: 0x5316, + 1627: 0x4EEE, + 1628: 0x4F55, + 1629: 0x4F3D, + 1630: 0x4FA1, + 1631: 0x4F73, + 1632: 0x52A0, + 1633: 0x53EF, + 1634: 0x5609, + 1635: 0x590F, + 1636: 0x5AC1, + 1637: 0x5BB6, + 1638: 0x5BE1, + 1639: 0x79D1, + 1640: 0x6687, + 1641: 0x679C, + 1642: 0x67B6, + 1643: 0x6B4C, + 1644: 0x6CB3, + 1645: 0x706B, + 1646: 0x73C2, + 1647: 0x798D, + 1648: 0x79BE, + 1649: 0x7A3C, + 1650: 0x7B87, + 1651: 0x82B1, + 1652: 0x82DB, + 1653: 0x8304, + 1654: 0x8377, + 1655: 0x83EF, + 1656: 0x83D3, + 1657: 0x8766, + 1658: 0x8AB2, + 1659: 0x5629, + 1660: 0x8CA8, + 1661: 0x8FE6, + 1662: 0x904E, + 1663: 0x971E, + 1664: 0x868A, + 1665: 0x4FC4, + 1666: 0x5CE8, + 1667: 0x6211, + 1668: 0x7259, + 1669: 0x753B, + 1670: 0x81E5, + 1671: 0x82BD, + 1672: 0x86FE, + 1673: 0x8CC0, + 1674: 0x96C5, + 1675: 0x9913, + 1676: 0x99D5, + 1677: 0x4ECB, + 1678: 0x4F1A, + 1679: 0x89E3, + 1680: 0x56DE, + 1681: 0x584A, + 1682: 0x58CA, + 1683: 0x5EFB, + 1684: 0x5FEB, + 1685: 0x602A, + 1686: 0x6094, + 1687: 0x6062, + 1688: 0x61D0, + 1689: 0x6212, + 1690: 0x62D0, + 1691: 0x6539, + 1692: 0x9B41, + 1693: 0x6666, + 1694: 0x68B0, + 1695: 0x6D77, + 1696: 0x7070, + 1697: 0x754C, + 1698: 0x7686, + 1699: 0x7D75, + 1700: 0x82A5, + 1701: 0x87F9, + 1702: 0x958B, + 1703: 0x968E, + 1704: 0x8C9D, + 1705: 0x51F1, + 1706: 0x52BE, + 1707: 0x5916, + 1708: 0x54B3, + 1709: 0x5BB3, + 1710: 0x5D16, + 1711: 0x6168, + 1712: 0x6982, + 1713: 0x6DAF, + 1714: 0x788D, + 1715: 0x84CB, + 1716: 0x8857, + 1717: 0x8A72, + 1718: 0x93A7, + 1719: 0x9AB8, + 1720: 0x6D6C, + 1721: 0x99A8, + 1722: 0x86D9, + 1723: 0x57A3, + 1724: 0x67FF, + 1725: 0x86CE, + 1726: 0x920E, + 1727: 0x5283, + 1728: 0x5687, + 1729: 0x5404, + 1730: 0x5ED3, + 1731: 0x62E1, + 1732: 0x64B9, + 1733: 0x683C, + 1734: 0x6838, + 1735: 0x6BBB, + 1736: 0x7372, + 1737: 0x78BA, + 1738: 0x7A6B, + 1739: 0x899A, + 1740: 0x89D2, + 1741: 0x8D6B, + 1742: 0x8F03, + 1743: 0x90ED, + 1744: 0x95A3, + 1745: 0x9694, + 1746: 0x9769, + 1747: 0x5B66, + 1748: 0x5CB3, + 1749: 0x697D, + 1750: 0x984D, + 1751: 0x984E, + 1752: 0x639B, + 1753: 0x7B20, + 1754: 0x6A2B, + 1755: 0x6A7F, + 1756: 0x68B6, + 1757: 0x9C0D, + 1758: 0x6F5F, + 1759: 0x5272, + 1760: 0x559D, + 1761: 0x6070, + 1762: 0x62EC, + 1763: 0x6D3B, + 1764: 0x6E07, + 1765: 0x6ED1, + 1766: 0x845B, + 1767: 0x8910, + 1768: 0x8F44, + 1769: 0x4E14, + 1770: 0x9C39, + 1771: 0x53F6, + 1772: 0x691B, + 1773: 0x6A3A, + 1774: 0x9784, + 1775: 0x682A, + 1776: 0x515C, + 1777: 0x7AC3, + 1778: 0x84B2, + 1779: 0x91DC, + 1780: 0x938C, + 1781: 0x565B, + 1782: 0x9D28, + 1783: 0x6822, + 1784: 0x8305, + 1785: 0x8431, + 1786: 0x7CA5, + 1787: 0x5208, + 1788: 0x82C5, + 1789: 0x74E6, + 1790: 0x4E7E, + 1791: 0x4F83, + 1792: 0x51A0, + 1793: 0x5BD2, + 1794: 0x520A, + 1795: 0x52D8, + 1796: 0x52E7, + 1797: 0x5DFB, + 1798: 0x559A, + 1799: 0x582A, + 1800: 0x59E6, + 1801: 0x5B8C, + 1802: 0x5B98, + 1803: 0x5BDB, + 1804: 0x5E72, + 1805: 0x5E79, + 1806: 0x60A3, + 1807: 0x611F, + 1808: 0x6163, + 1809: 0x61BE, + 1810: 0x63DB, + 1811: 0x6562, + 1812: 0x67D1, + 1813: 0x6853, + 1814: 0x68FA, + 1815: 0x6B3E, + 1816: 0x6B53, + 1817: 0x6C57, + 1818: 0x6F22, + 1819: 0x6F97, + 1820: 0x6F45, + 1821: 0x74B0, + 1822: 0x7518, + 1823: 0x76E3, + 1824: 0x770B, + 1825: 0x7AFF, + 1826: 0x7BA1, + 1827: 0x7C21, + 1828: 0x7DE9, + 1829: 0x7F36, + 1830: 0x7FF0, + 1831: 0x809D, + 1832: 0x8266, + 1833: 0x839E, + 1834: 0x89B3, + 1835: 0x8ACC, + 1836: 0x8CAB, + 1837: 0x9084, + 1838: 0x9451, + 1839: 0x9593, + 1840: 0x9591, + 1841: 0x95A2, + 1842: 0x9665, + 1843: 0x97D3, + 1844: 0x9928, + 1845: 0x8218, + 1846: 0x4E38, + 1847: 0x542B, + 1848: 0x5CB8, + 1849: 0x5DCC, + 1850: 0x73A9, + 1851: 0x764C, + 1852: 0x773C, + 1853: 0x5CA9, + 1854: 0x7FEB, + 1855: 0x8D0B, + 1856: 0x96C1, + 1857: 0x9811, + 1858: 0x9854, + 1859: 0x9858, + 1860: 0x4F01, + 1861: 0x4F0E, + 1862: 0x5371, + 1863: 0x559C, + 1864: 0x5668, + 1865: 0x57FA, + 1866: 0x5947, + 1867: 0x5B09, + 1868: 0x5BC4, + 1869: 0x5C90, + 1870: 0x5E0C, + 1871: 0x5E7E, + 1872: 0x5FCC, + 1873: 0x63EE, + 1874: 0x673A, + 1875: 0x65D7, + 1876: 0x65E2, + 1877: 0x671F, + 1878: 0x68CB, + 1879: 0x68C4, + 1880: 0x6A5F, + 1881: 0x5E30, + 1882: 0x6BC5, + 1883: 0x6C17, + 1884: 0x6C7D, + 1885: 0x757F, + 1886: 0x7948, + 1887: 0x5B63, + 1888: 0x7A00, + 1889: 0x7D00, + 1890: 0x5FBD, + 1891: 0x898F, + 1892: 0x8A18, + 1893: 0x8CB4, + 1894: 0x8D77, + 1895: 0x8ECC, + 1896: 0x8F1D, + 1897: 0x98E2, + 1898: 0x9A0E, + 1899: 0x9B3C, + 1900: 0x4E80, + 1901: 0x507D, + 1902: 0x5100, + 1903: 0x5993, + 1904: 0x5B9C, + 1905: 0x622F, + 1906: 0x6280, + 1907: 0x64EC, + 1908: 0x6B3A, + 1909: 0x72A0, + 1910: 0x7591, + 1911: 0x7947, + 1912: 0x7FA9, + 1913: 0x87FB, + 1914: 0x8ABC, + 1915: 0x8B70, + 1916: 0x63AC, + 1917: 0x83CA, + 1918: 0x97A0, + 1919: 0x5409, + 1920: 0x5403, + 1921: 0x55AB, + 1922: 0x6854, + 1923: 0x6A58, + 1924: 0x8A70, + 1925: 0x7827, + 1926: 0x6775, + 1927: 0x9ECD, + 1928: 0x5374, + 1929: 0x5BA2, + 1930: 0x811A, + 1931: 0x8650, + 1932: 0x9006, + 1933: 0x4E18, + 1934: 0x4E45, + 1935: 0x4EC7, + 1936: 0x4F11, + 1937: 0x53CA, + 1938: 0x5438, + 1939: 0x5BAE, + 1940: 0x5F13, + 1941: 0x6025, + 1942: 0x6551, + 1943: 0x673D, + 1944: 0x6C42, + 1945: 0x6C72, + 1946: 0x6CE3, + 1947: 0x7078, + 1948: 0x7403, + 1949: 0x7A76, + 1950: 0x7AAE, + 1951: 0x7B08, + 1952: 0x7D1A, + 1953: 0x7CFE, + 1954: 0x7D66, + 1955: 0x65E7, + 1956: 0x725B, + 1957: 0x53BB, + 1958: 0x5C45, + 1959: 0x5DE8, + 1960: 0x62D2, + 1961: 0x62E0, + 1962: 0x6319, + 1963: 0x6E20, + 1964: 0x865A, + 1965: 0x8A31, + 1966: 0x8DDD, + 1967: 0x92F8, + 1968: 0x6F01, + 1969: 0x79A6, + 1970: 0x9B5A, + 1971: 0x4EA8, + 1972: 0x4EAB, + 1973: 0x4EAC, + 1974: 0x4F9B, + 1975: 0x4FA0, + 1976: 0x50D1, + 1977: 0x5147, + 1978: 0x7AF6, + 1979: 0x5171, + 1980: 0x51F6, + 1981: 0x5354, + 1982: 0x5321, + 1983: 0x537F, + 1984: 0x53EB, + 1985: 0x55AC, + 1986: 0x5883, + 1987: 0x5CE1, + 1988: 0x5F37, + 1989: 0x5F4A, + 1990: 0x602F, + 1991: 0x6050, + 1992: 0x606D, + 1993: 0x631F, + 1994: 0x6559, + 1995: 0x6A4B, + 1996: 0x6CC1, + 1997: 0x72C2, + 1998: 0x72ED, + 1999: 0x77EF, + 2000: 0x80F8, + 2001: 0x8105, + 2002: 0x8208, + 2003: 0x854E, + 2004: 0x90F7, + 2005: 0x93E1, + 2006: 0x97FF, + 2007: 0x9957, + 2008: 0x9A5A, + 2009: 0x4EF0, + 2010: 0x51DD, + 2011: 0x5C2D, + 2012: 0x6681, + 2013: 0x696D, + 2014: 0x5C40, + 2015: 0x66F2, + 2016: 0x6975, + 2017: 0x7389, + 2018: 0x6850, + 2019: 0x7C81, + 2020: 0x50C5, + 2021: 0x52E4, + 2022: 0x5747, + 2023: 0x5DFE, + 2024: 0x9326, + 2025: 0x65A4, + 2026: 0x6B23, + 2027: 0x6B3D, + 2028: 0x7434, + 2029: 0x7981, + 2030: 0x79BD, + 2031: 0x7B4B, + 2032: 0x7DCA, + 2033: 0x82B9, + 2034: 0x83CC, + 2035: 0x887F, + 2036: 0x895F, + 2037: 0x8B39, + 2038: 0x8FD1, + 2039: 0x91D1, + 2040: 0x541F, + 2041: 0x9280, + 2042: 0x4E5D, + 2043: 0x5036, + 2044: 0x53E5, + 2045: 0x533A, + 2046: 0x72D7, + 2047: 0x7396, + 2048: 0x77E9, + 2049: 0x82E6, + 2050: 0x8EAF, + 2051: 0x99C6, + 2052: 0x99C8, + 2053: 0x99D2, + 2054: 0x5177, + 2055: 0x611A, + 2056: 0x865E, + 2057: 0x55B0, + 2058: 0x7A7A, + 2059: 0x5076, + 2060: 0x5BD3, + 2061: 0x9047, + 2062: 0x9685, + 2063: 0x4E32, + 2064: 0x6ADB, + 2065: 0x91E7, + 2066: 0x5C51, + 2067: 0x5C48, + 2068: 0x6398, + 2069: 0x7A9F, + 2070: 0x6C93, + 2071: 0x9774, + 2072: 0x8F61, + 2073: 0x7AAA, + 2074: 0x718A, + 2075: 0x9688, + 2076: 0x7C82, + 2077: 0x6817, + 2078: 0x7E70, + 2079: 0x6851, + 2080: 0x936C, + 2081: 0x52F2, + 2082: 0x541B, + 2083: 0x85AB, + 2084: 0x8A13, + 2085: 0x7FA4, + 2086: 0x8ECD, + 2087: 0x90E1, + 2088: 0x5366, + 2089: 0x8888, + 2090: 0x7941, + 2091: 0x4FC2, + 2092: 0x50BE, + 2093: 0x5211, + 2094: 0x5144, + 2095: 0x5553, + 2096: 0x572D, + 2097: 0x73EA, + 2098: 0x578B, + 2099: 0x5951, + 2100: 0x5F62, + 2101: 0x5F84, + 2102: 0x6075, + 2103: 0x6176, + 2104: 0x6167, + 2105: 0x61A9, + 2106: 0x63B2, + 2107: 0x643A, + 2108: 0x656C, + 2109: 0x666F, + 2110: 0x6842, + 2111: 0x6E13, + 2112: 0x7566, + 2113: 0x7A3D, + 2114: 0x7CFB, + 2115: 0x7D4C, + 2116: 0x7D99, + 2117: 0x7E4B, + 2118: 0x7F6B, + 2119: 0x830E, + 2120: 0x834A, + 2121: 0x86CD, + 2122: 0x8A08, + 2123: 0x8A63, + 2124: 0x8B66, + 2125: 0x8EFD, + 2126: 0x981A, + 2127: 0x9D8F, + 2128: 0x82B8, + 2129: 0x8FCE, + 2130: 0x9BE8, + 2131: 0x5287, + 2132: 0x621F, + 2133: 0x6483, + 2134: 0x6FC0, + 2135: 0x9699, + 2136: 0x6841, + 2137: 0x5091, + 2138: 0x6B20, + 2139: 0x6C7A, + 2140: 0x6F54, + 2141: 0x7A74, + 2142: 0x7D50, + 2143: 0x8840, + 2144: 0x8A23, + 2145: 0x6708, + 2146: 0x4EF6, + 2147: 0x5039, + 2148: 0x5026, + 2149: 0x5065, + 2150: 0x517C, + 2151: 0x5238, + 2152: 0x5263, + 2153: 0x55A7, + 2154: 0x570F, + 2155: 0x5805, + 2156: 0x5ACC, + 2157: 0x5EFA, + 2158: 0x61B2, + 2159: 0x61F8, + 2160: 0x62F3, + 2161: 0x6372, + 2162: 0x691C, + 2163: 0x6A29, + 2164: 0x727D, + 2165: 0x72AC, + 2166: 0x732E, + 2167: 0x7814, + 2168: 0x786F, + 2169: 0x7D79, + 2170: 0x770C, + 2171: 0x80A9, + 2172: 0x898B, + 2173: 0x8B19, + 2174: 0x8CE2, + 2175: 0x8ED2, + 2176: 0x9063, + 2177: 0x9375, + 2178: 0x967A, + 2179: 0x9855, + 2180: 0x9A13, + 2181: 0x9E78, + 2182: 0x5143, + 2183: 0x539F, + 2184: 0x53B3, + 2185: 0x5E7B, + 2186: 0x5F26, + 2187: 0x6E1B, + 2188: 0x6E90, + 2189: 0x7384, + 2190: 0x73FE, + 2191: 0x7D43, + 2192: 0x8237, + 2193: 0x8A00, + 2194: 0x8AFA, + 2195: 0x9650, + 2196: 0x4E4E, + 2197: 0x500B, + 2198: 0x53E4, + 2199: 0x547C, + 2200: 0x56FA, + 2201: 0x59D1, + 2202: 0x5B64, + 2203: 0x5DF1, + 2204: 0x5EAB, + 2205: 0x5F27, + 2206: 0x6238, + 2207: 0x6545, + 2208: 0x67AF, + 2209: 0x6E56, + 2210: 0x72D0, + 2211: 0x7CCA, + 2212: 0x88B4, + 2213: 0x80A1, + 2214: 0x80E1, + 2215: 0x83F0, + 2216: 0x864E, + 2217: 0x8A87, + 2218: 0x8DE8, + 2219: 0x9237, + 2220: 0x96C7, + 2221: 0x9867, + 2222: 0x9F13, + 2223: 0x4E94, + 2224: 0x4E92, + 2225: 0x4F0D, + 2226: 0x5348, + 2227: 0x5449, + 2228: 0x543E, + 2229: 0x5A2F, + 2230: 0x5F8C, + 2231: 0x5FA1, + 2232: 0x609F, + 2233: 0x68A7, + 2234: 0x6A8E, + 2235: 0x745A, + 2236: 0x7881, + 2237: 0x8A9E, + 2238: 0x8AA4, + 2239: 0x8B77, + 2240: 0x9190, + 2241: 0x4E5E, + 2242: 0x9BC9, + 2243: 0x4EA4, + 2244: 0x4F7C, + 2245: 0x4FAF, + 2246: 0x5019, + 2247: 0x5016, + 2248: 0x5149, + 2249: 0x516C, + 2250: 0x529F, + 2251: 0x52B9, + 2252: 0x52FE, + 2253: 0x539A, + 2254: 0x53E3, + 2255: 0x5411, + 2256: 0x540E, + 2257: 0x5589, + 2258: 0x5751, + 2259: 0x57A2, + 2260: 0x597D, + 2261: 0x5B54, + 2262: 0x5B5D, + 2263: 0x5B8F, + 2264: 0x5DE5, + 2265: 0x5DE7, + 2266: 0x5DF7, + 2267: 0x5E78, + 2268: 0x5E83, + 2269: 0x5E9A, + 2270: 0x5EB7, + 2271: 0x5F18, + 2272: 0x6052, + 2273: 0x614C, + 2274: 0x6297, + 2275: 0x62D8, + 2276: 0x63A7, + 2277: 0x653B, + 2278: 0x6602, + 2279: 0x6643, + 2280: 0x66F4, + 2281: 0x676D, + 2282: 0x6821, + 2283: 0x6897, + 2284: 0x69CB, + 2285: 0x6C5F, + 2286: 0x6D2A, + 2287: 0x6D69, + 2288: 0x6E2F, + 2289: 0x6E9D, + 2290: 0x7532, + 2291: 0x7687, + 2292: 0x786C, + 2293: 0x7A3F, + 2294: 0x7CE0, + 2295: 0x7D05, + 2296: 0x7D18, + 2297: 0x7D5E, + 2298: 0x7DB1, + 2299: 0x8015, + 2300: 0x8003, + 2301: 0x80AF, + 2302: 0x80B1, + 2303: 0x8154, + 2304: 0x818F, + 2305: 0x822A, + 2306: 0x8352, + 2307: 0x884C, + 2308: 0x8861, + 2309: 0x8B1B, + 2310: 0x8CA2, + 2311: 0x8CFC, + 2312: 0x90CA, + 2313: 0x9175, + 2314: 0x9271, + 2315: 0x783F, + 2316: 0x92FC, + 2317: 0x95A4, + 2318: 0x964D, + 2319: 0x9805, + 2320: 0x9999, + 2321: 0x9AD8, + 2322: 0x9D3B, + 2323: 0x525B, + 2324: 0x52AB, + 2325: 0x53F7, + 2326: 0x5408, + 2327: 0x58D5, + 2328: 0x62F7, + 2329: 0x6FE0, + 2330: 0x8C6A, + 2331: 0x8F5F, + 2332: 0x9EB9, + 2333: 0x514B, + 2334: 0x523B, + 2335: 0x544A, + 2336: 0x56FD, + 2337: 0x7A40, + 2338: 0x9177, + 2339: 0x9D60, + 2340: 0x9ED2, + 2341: 0x7344, + 2342: 0x6F09, + 2343: 0x8170, + 2344: 0x7511, + 2345: 0x5FFD, + 2346: 0x60DA, + 2347: 0x9AA8, + 2348: 0x72DB, + 2349: 0x8FBC, + 2350: 0x6B64, + 2351: 0x9803, + 2352: 0x4ECA, + 2353: 0x56F0, + 2354: 0x5764, + 2355: 0x58BE, + 2356: 0x5A5A, + 2357: 0x6068, + 2358: 0x61C7, + 2359: 0x660F, + 2360: 0x6606, + 2361: 0x6839, + 2362: 0x68B1, + 2363: 0x6DF7, + 2364: 0x75D5, + 2365: 0x7D3A, + 2366: 0x826E, + 2367: 0x9B42, + 2368: 0x4E9B, + 2369: 0x4F50, + 2370: 0x53C9, + 2371: 0x5506, + 2372: 0x5D6F, + 2373: 0x5DE6, + 2374: 0x5DEE, + 2375: 0x67FB, + 2376: 0x6C99, + 2377: 0x7473, + 2378: 0x7802, + 2379: 0x8A50, + 2380: 0x9396, + 2381: 0x88DF, + 2382: 0x5750, + 2383: 0x5EA7, + 2384: 0x632B, + 2385: 0x50B5, + 2386: 0x50AC, + 2387: 0x518D, + 2388: 0x6700, + 2389: 0x54C9, + 2390: 0x585E, + 2391: 0x59BB, + 2392: 0x5BB0, + 2393: 0x5F69, + 2394: 0x624D, + 2395: 0x63A1, + 2396: 0x683D, + 2397: 0x6B73, + 2398: 0x6E08, + 2399: 0x707D, + 2400: 0x91C7, + 2401: 0x7280, + 2402: 0x7815, + 2403: 0x7826, + 2404: 0x796D, + 2405: 0x658E, + 2406: 0x7D30, + 2407: 0x83DC, + 2408: 0x88C1, + 2409: 0x8F09, + 2410: 0x969B, + 2411: 0x5264, + 2412: 0x5728, + 2413: 0x6750, + 2414: 0x7F6A, + 2415: 0x8CA1, + 2416: 0x51B4, + 2417: 0x5742, + 2418: 0x962A, + 2419: 0x583A, + 2420: 0x698A, + 2421: 0x80B4, + 2422: 0x54B2, + 2423: 0x5D0E, + 2424: 0x57FC, + 2425: 0x7895, + 2426: 0x9DFA, + 2427: 0x4F5C, + 2428: 0x524A, + 2429: 0x548B, + 2430: 0x643E, + 2431: 0x6628, + 2432: 0x6714, + 2433: 0x67F5, + 2434: 0x7A84, + 2435: 0x7B56, + 2436: 0x7D22, + 2437: 0x932F, + 2438: 0x685C, + 2439: 0x9BAD, + 2440: 0x7B39, + 2441: 0x5319, + 2442: 0x518A, + 2443: 0x5237, + 2444: 0x5BDF, + 2445: 0x62F6, + 2446: 0x64AE, + 2447: 0x64E6, + 2448: 0x672D, + 2449: 0x6BBA, + 2450: 0x85A9, + 2451: 0x96D1, + 2452: 0x7690, + 2453: 0x9BD6, + 2454: 0x634C, + 2455: 0x9306, + 2456: 0x9BAB, + 2457: 0x76BF, + 2458: 0x6652, + 2459: 0x4E09, + 2460: 0x5098, + 2461: 0x53C2, + 2462: 0x5C71, + 2463: 0x60E8, + 2464: 0x6492, + 2465: 0x6563, + 2466: 0x685F, + 2467: 0x71E6, + 2468: 0x73CA, + 2469: 0x7523, + 2470: 0x7B97, + 2471: 0x7E82, + 2472: 0x8695, + 2473: 0x8B83, + 2474: 0x8CDB, + 2475: 0x9178, + 2476: 0x9910, + 2477: 0x65AC, + 2478: 0x66AB, + 2479: 0x6B8B, + 2480: 0x4ED5, + 2481: 0x4ED4, + 2482: 0x4F3A, + 2483: 0x4F7F, + 2484: 0x523A, + 2485: 0x53F8, + 2486: 0x53F2, + 2487: 0x55E3, + 2488: 0x56DB, + 2489: 0x58EB, + 2490: 0x59CB, + 2491: 0x59C9, + 2492: 0x59FF, + 2493: 0x5B50, + 2494: 0x5C4D, + 2495: 0x5E02, + 2496: 0x5E2B, + 2497: 0x5FD7, + 2498: 0x601D, + 2499: 0x6307, + 2500: 0x652F, + 2501: 0x5B5C, + 2502: 0x65AF, + 2503: 0x65BD, + 2504: 0x65E8, + 2505: 0x679D, + 2506: 0x6B62, + 2507: 0x6B7B, + 2508: 0x6C0F, + 2509: 0x7345, + 2510: 0x7949, + 2511: 0x79C1, + 2512: 0x7CF8, + 2513: 0x7D19, + 2514: 0x7D2B, + 2515: 0x80A2, + 2516: 0x8102, + 2517: 0x81F3, + 2518: 0x8996, + 2519: 0x8A5E, + 2520: 0x8A69, + 2521: 0x8A66, + 2522: 0x8A8C, + 2523: 0x8AEE, + 2524: 0x8CC7, + 2525: 0x8CDC, + 2526: 0x96CC, + 2527: 0x98FC, + 2528: 0x6B6F, + 2529: 0x4E8B, + 2530: 0x4F3C, + 2531: 0x4F8D, + 2532: 0x5150, + 2533: 0x5B57, + 2534: 0x5BFA, + 2535: 0x6148, + 2536: 0x6301, + 2537: 0x6642, + 2538: 0x6B21, + 2539: 0x6ECB, + 2540: 0x6CBB, + 2541: 0x723E, + 2542: 0x74BD, + 2543: 0x75D4, + 2544: 0x78C1, + 2545: 0x793A, + 2546: 0x800C, + 2547: 0x8033, + 2548: 0x81EA, + 2549: 0x8494, + 2550: 0x8F9E, + 2551: 0x6C50, + 2552: 0x9E7F, + 2553: 0x5F0F, + 2554: 0x8B58, + 2555: 0x9D2B, + 2556: 0x7AFA, + 2557: 0x8EF8, + 2558: 0x5B8D, + 2559: 0x96EB, + 2560: 0x4E03, + 2561: 0x53F1, + 2562: 0x57F7, + 2563: 0x5931, + 2564: 0x5AC9, + 2565: 0x5BA4, + 2566: 0x6089, + 2567: 0x6E7F, + 2568: 0x6F06, + 2569: 0x75BE, + 2570: 0x8CEA, + 2571: 0x5B9F, + 2572: 0x8500, + 2573: 0x7BE0, + 2574: 0x5072, + 2575: 0x67F4, + 2576: 0x829D, + 2577: 0x5C61, + 2578: 0x854A, + 2579: 0x7E1E, + 2580: 0x820E, + 2581: 0x5199, + 2582: 0x5C04, + 2583: 0x6368, + 2584: 0x8D66, + 2585: 0x659C, + 2586: 0x716E, + 2587: 0x793E, + 2588: 0x7D17, + 2589: 0x8005, + 2590: 0x8B1D, + 2591: 0x8ECA, + 2592: 0x906E, + 2593: 0x86C7, + 2594: 0x90AA, + 2595: 0x501F, + 2596: 0x52FA, + 2597: 0x5C3A, + 2598: 0x6753, + 2599: 0x707C, + 2600: 0x7235, + 2601: 0x914C, + 2602: 0x91C8, + 2603: 0x932B, + 2604: 0x82E5, + 2605: 0x5BC2, + 2606: 0x5F31, + 2607: 0x60F9, + 2608: 0x4E3B, + 2609: 0x53D6, + 2610: 0x5B88, + 2611: 0x624B, + 2612: 0x6731, + 2613: 0x6B8A, + 2614: 0x72E9, + 2615: 0x73E0, + 2616: 0x7A2E, + 2617: 0x816B, + 2618: 0x8DA3, + 2619: 0x9152, + 2620: 0x9996, + 2621: 0x5112, + 2622: 0x53D7, + 2623: 0x546A, + 2624: 0x5BFF, + 2625: 0x6388, + 2626: 0x6A39, + 2627: 0x7DAC, + 2628: 0x9700, + 2629: 0x56DA, + 2630: 0x53CE, + 2631: 0x5468, + 2632: 0x5B97, + 2633: 0x5C31, + 2634: 0x5DDE, + 2635: 0x4FEE, + 2636: 0x6101, + 2637: 0x62FE, + 2638: 0x6D32, + 2639: 0x79C0, + 2640: 0x79CB, + 2641: 0x7D42, + 2642: 0x7E4D, + 2643: 0x7FD2, + 2644: 0x81ED, + 2645: 0x821F, + 2646: 0x8490, + 2647: 0x8846, + 2648: 0x8972, + 2649: 0x8B90, + 2650: 0x8E74, + 2651: 0x8F2F, + 2652: 0x9031, + 2653: 0x914B, + 2654: 0x916C, + 2655: 0x96C6, + 2656: 0x919C, + 2657: 0x4EC0, + 2658: 0x4F4F, + 2659: 0x5145, + 2660: 0x5341, + 2661: 0x5F93, + 2662: 0x620E, + 2663: 0x67D4, + 2664: 0x6C41, + 2665: 0x6E0B, + 2666: 0x7363, + 2667: 0x7E26, + 2668: 0x91CD, + 2669: 0x9283, + 2670: 0x53D4, + 2671: 0x5919, + 2672: 0x5BBF, + 2673: 0x6DD1, + 2674: 0x795D, + 2675: 0x7E2E, + 2676: 0x7C9B, + 2677: 0x587E, + 2678: 0x719F, + 2679: 0x51FA, + 2680: 0x8853, + 2681: 0x8FF0, + 2682: 0x4FCA, + 2683: 0x5CFB, + 2684: 0x6625, + 2685: 0x77AC, + 2686: 0x7AE3, + 2687: 0x821C, + 2688: 0x99FF, + 2689: 0x51C6, + 2690: 0x5FAA, + 2691: 0x65EC, + 2692: 0x696F, + 2693: 0x6B89, + 2694: 0x6DF3, + 2695: 0x6E96, + 2696: 0x6F64, + 2697: 0x76FE, + 2698: 0x7D14, + 2699: 0x5DE1, + 2700: 0x9075, + 2701: 0x9187, + 2702: 0x9806, + 2703: 0x51E6, + 2704: 0x521D, + 2705: 0x6240, + 2706: 0x6691, + 2707: 0x66D9, + 2708: 0x6E1A, + 2709: 0x5EB6, + 2710: 0x7DD2, + 2711: 0x7F72, + 2712: 0x66F8, + 2713: 0x85AF, + 2714: 0x85F7, + 2715: 0x8AF8, + 2716: 0x52A9, + 2717: 0x53D9, + 2718: 0x5973, + 2719: 0x5E8F, + 2720: 0x5F90, + 2721: 0x6055, + 2722: 0x92E4, + 2723: 0x9664, + 2724: 0x50B7, + 2725: 0x511F, + 2726: 0x52DD, + 2727: 0x5320, + 2728: 0x5347, + 2729: 0x53EC, + 2730: 0x54E8, + 2731: 0x5546, + 2732: 0x5531, + 2733: 0x5617, + 2734: 0x5968, + 2735: 0x59BE, + 2736: 0x5A3C, + 2737: 0x5BB5, + 2738: 0x5C06, + 2739: 0x5C0F, + 2740: 0x5C11, + 2741: 0x5C1A, + 2742: 0x5E84, + 2743: 0x5E8A, + 2744: 0x5EE0, + 2745: 0x5F70, + 2746: 0x627F, + 2747: 0x6284, + 2748: 0x62DB, + 2749: 0x638C, + 2750: 0x6377, + 2751: 0x6607, + 2752: 0x660C, + 2753: 0x662D, + 2754: 0x6676, + 2755: 0x677E, + 2756: 0x68A2, + 2757: 0x6A1F, + 2758: 0x6A35, + 2759: 0x6CBC, + 2760: 0x6D88, + 2761: 0x6E09, + 2762: 0x6E58, + 2763: 0x713C, + 2764: 0x7126, + 2765: 0x7167, + 2766: 0x75C7, + 2767: 0x7701, + 2768: 0x785D, + 2769: 0x7901, + 2770: 0x7965, + 2771: 0x79F0, + 2772: 0x7AE0, + 2773: 0x7B11, + 2774: 0x7CA7, + 2775: 0x7D39, + 2776: 0x8096, + 2777: 0x83D6, + 2778: 0x848B, + 2779: 0x8549, + 2780: 0x885D, + 2781: 0x88F3, + 2782: 0x8A1F, + 2783: 0x8A3C, + 2784: 0x8A54, + 2785: 0x8A73, + 2786: 0x8C61, + 2787: 0x8CDE, + 2788: 0x91A4, + 2789: 0x9266, + 2790: 0x937E, + 2791: 0x9418, + 2792: 0x969C, + 2793: 0x9798, + 2794: 0x4E0A, + 2795: 0x4E08, + 2796: 0x4E1E, + 2797: 0x4E57, + 2798: 0x5197, + 2799: 0x5270, + 2800: 0x57CE, + 2801: 0x5834, + 2802: 0x58CC, + 2803: 0x5B22, + 2804: 0x5E38, + 2805: 0x60C5, + 2806: 0x64FE, + 2807: 0x6761, + 2808: 0x6756, + 2809: 0x6D44, + 2810: 0x72B6, + 2811: 0x7573, + 2812: 0x7A63, + 2813: 0x84B8, + 2814: 0x8B72, + 2815: 0x91B8, + 2816: 0x9320, + 2817: 0x5631, + 2818: 0x57F4, + 2819: 0x98FE, + 2820: 0x62ED, + 2821: 0x690D, + 2822: 0x6B96, + 2823: 0x71ED, + 2824: 0x7E54, + 2825: 0x8077, + 2826: 0x8272, + 2827: 0x89E6, + 2828: 0x98DF, + 2829: 0x8755, + 2830: 0x8FB1, + 2831: 0x5C3B, + 2832: 0x4F38, + 2833: 0x4FE1, + 2834: 0x4FB5, + 2835: 0x5507, + 2836: 0x5A20, + 2837: 0x5BDD, + 2838: 0x5BE9, + 2839: 0x5FC3, + 2840: 0x614E, + 2841: 0x632F, + 2842: 0x65B0, + 2843: 0x664B, + 2844: 0x68EE, + 2845: 0x699B, + 2846: 0x6D78, + 2847: 0x6DF1, + 2848: 0x7533, + 2849: 0x75B9, + 2850: 0x771F, + 2851: 0x795E, + 2852: 0x79E6, + 2853: 0x7D33, + 2854: 0x81E3, + 2855: 0x82AF, + 2856: 0x85AA, + 2857: 0x89AA, + 2858: 0x8A3A, + 2859: 0x8EAB, + 2860: 0x8F9B, + 2861: 0x9032, + 2862: 0x91DD, + 2863: 0x9707, + 2864: 0x4EBA, + 2865: 0x4EC1, + 2866: 0x5203, + 2867: 0x5875, + 2868: 0x58EC, + 2869: 0x5C0B, + 2870: 0x751A, + 2871: 0x5C3D, + 2872: 0x814E, + 2873: 0x8A0A, + 2874: 0x8FC5, + 2875: 0x9663, + 2876: 0x976D, + 2877: 0x7B25, + 2878: 0x8ACF, + 2879: 0x9808, + 2880: 0x9162, + 2881: 0x56F3, + 2882: 0x53A8, + 2883: 0x9017, + 2884: 0x5439, + 2885: 0x5782, + 2886: 0x5E25, + 2887: 0x63A8, + 2888: 0x6C34, + 2889: 0x708A, + 2890: 0x7761, + 2891: 0x7C8B, + 2892: 0x7FE0, + 2893: 0x8870, + 2894: 0x9042, + 2895: 0x9154, + 2896: 0x9310, + 2897: 0x9318, + 2898: 0x968F, + 2899: 0x745E, + 2900: 0x9AC4, + 2901: 0x5D07, + 2902: 0x5D69, + 2903: 0x6570, + 2904: 0x67A2, + 2905: 0x8DA8, + 2906: 0x96DB, + 2907: 0x636E, + 2908: 0x6749, + 2909: 0x6919, + 2910: 0x83C5, + 2911: 0x9817, + 2912: 0x96C0, + 2913: 0x88FE, + 2914: 0x6F84, + 2915: 0x647A, + 2916: 0x5BF8, + 2917: 0x4E16, + 2918: 0x702C, + 2919: 0x755D, + 2920: 0x662F, + 2921: 0x51C4, + 2922: 0x5236, + 2923: 0x52E2, + 2924: 0x59D3, + 2925: 0x5F81, + 2926: 0x6027, + 2927: 0x6210, + 2928: 0x653F, + 2929: 0x6574, + 2930: 0x661F, + 2931: 0x6674, + 2932: 0x68F2, + 2933: 0x6816, + 2934: 0x6B63, + 2935: 0x6E05, + 2936: 0x7272, + 2937: 0x751F, + 2938: 0x76DB, + 2939: 0x7CBE, + 2940: 0x8056, + 2941: 0x58F0, + 2942: 0x88FD, + 2943: 0x897F, + 2944: 0x8AA0, + 2945: 0x8A93, + 2946: 0x8ACB, + 2947: 0x901D, + 2948: 0x9192, + 2949: 0x9752, + 2950: 0x9759, + 2951: 0x6589, + 2952: 0x7A0E, + 2953: 0x8106, + 2954: 0x96BB, + 2955: 0x5E2D, + 2956: 0x60DC, + 2957: 0x621A, + 2958: 0x65A5, + 2959: 0x6614, + 2960: 0x6790, + 2961: 0x77F3, + 2962: 0x7A4D, + 2963: 0x7C4D, + 2964: 0x7E3E, + 2965: 0x810A, + 2966: 0x8CAC, + 2967: 0x8D64, + 2968: 0x8DE1, + 2969: 0x8E5F, + 2970: 0x78A9, + 2971: 0x5207, + 2972: 0x62D9, + 2973: 0x63A5, + 2974: 0x6442, + 2975: 0x6298, + 2976: 0x8A2D, + 2977: 0x7A83, + 2978: 0x7BC0, + 2979: 0x8AAC, + 2980: 0x96EA, + 2981: 0x7D76, + 2982: 0x820C, + 2983: 0x8749, + 2984: 0x4ED9, + 2985: 0x5148, + 2986: 0x5343, + 2987: 0x5360, + 2988: 0x5BA3, + 2989: 0x5C02, + 2990: 0x5C16, + 2991: 0x5DDD, + 2992: 0x6226, + 2993: 0x6247, + 2994: 0x64B0, + 2995: 0x6813, + 2996: 0x6834, + 2997: 0x6CC9, + 2998: 0x6D45, + 2999: 0x6D17, + 3000: 0x67D3, + 3001: 0x6F5C, + 3002: 0x714E, + 3003: 0x717D, + 3004: 0x65CB, + 3005: 0x7A7F, + 3006: 0x7BAD, + 3007: 0x7DDA, + 3008: 0x7E4A, + 3009: 0x7FA8, + 3010: 0x817A, + 3011: 0x821B, + 3012: 0x8239, + 3013: 0x85A6, + 3014: 0x8A6E, + 3015: 0x8CCE, + 3016: 0x8DF5, + 3017: 0x9078, + 3018: 0x9077, + 3019: 0x92AD, + 3020: 0x9291, + 3021: 0x9583, + 3022: 0x9BAE, + 3023: 0x524D, + 3024: 0x5584, + 3025: 0x6F38, + 3026: 0x7136, + 3027: 0x5168, + 3028: 0x7985, + 3029: 0x7E55, + 3030: 0x81B3, + 3031: 0x7CCE, + 3032: 0x564C, + 3033: 0x5851, + 3034: 0x5CA8, + 3035: 0x63AA, + 3036: 0x66FE, + 3037: 0x66FD, + 3038: 0x695A, + 3039: 0x72D9, + 3040: 0x758F, + 3041: 0x758E, + 3042: 0x790E, + 3043: 0x7956, + 3044: 0x79DF, + 3045: 0x7C97, + 3046: 0x7D20, + 3047: 0x7D44, + 3048: 0x8607, + 3049: 0x8A34, + 3050: 0x963B, + 3051: 0x9061, + 3052: 0x9F20, + 3053: 0x50E7, + 3054: 0x5275, + 3055: 0x53CC, + 3056: 0x53E2, + 3057: 0x5009, + 3058: 0x55AA, + 3059: 0x58EE, + 3060: 0x594F, + 3061: 0x723D, + 3062: 0x5B8B, + 3063: 0x5C64, + 3064: 0x531D, + 3065: 0x60E3, + 3066: 0x60F3, + 3067: 0x635C, + 3068: 0x6383, + 3069: 0x633F, + 3070: 0x63BB, + 3071: 0x64CD, + 3072: 0x65E9, + 3073: 0x66F9, + 3074: 0x5DE3, + 3075: 0x69CD, + 3076: 0x69FD, + 3077: 0x6F15, + 3078: 0x71E5, + 3079: 0x4E89, + 3080: 0x75E9, + 3081: 0x76F8, + 3082: 0x7A93, + 3083: 0x7CDF, + 3084: 0x7DCF, + 3085: 0x7D9C, + 3086: 0x8061, + 3087: 0x8349, + 3088: 0x8358, + 3089: 0x846C, + 3090: 0x84BC, + 3091: 0x85FB, + 3092: 0x88C5, + 3093: 0x8D70, + 3094: 0x9001, + 3095: 0x906D, + 3096: 0x9397, + 3097: 0x971C, + 3098: 0x9A12, + 3099: 0x50CF, + 3100: 0x5897, + 3101: 0x618E, + 3102: 0x81D3, + 3103: 0x8535, + 3104: 0x8D08, + 3105: 0x9020, + 3106: 0x4FC3, + 3107: 0x5074, + 3108: 0x5247, + 3109: 0x5373, + 3110: 0x606F, + 3111: 0x6349, + 3112: 0x675F, + 3113: 0x6E2C, + 3114: 0x8DB3, + 3115: 0x901F, + 3116: 0x4FD7, + 3117: 0x5C5E, + 3118: 0x8CCA, + 3119: 0x65CF, + 3120: 0x7D9A, + 3121: 0x5352, + 3122: 0x8896, + 3123: 0x5176, + 3124: 0x63C3, + 3125: 0x5B58, + 3126: 0x5B6B, + 3127: 0x5C0A, + 3128: 0x640D, + 3129: 0x6751, + 3130: 0x905C, + 3131: 0x4ED6, + 3132: 0x591A, + 3133: 0x592A, + 3134: 0x6C70, + 3135: 0x8A51, + 3136: 0x553E, + 3137: 0x5815, + 3138: 0x59A5, + 3139: 0x60F0, + 3140: 0x6253, + 3141: 0x67C1, + 3142: 0x8235, + 3143: 0x6955, + 3144: 0x9640, + 3145: 0x99C4, + 3146: 0x9A28, + 3147: 0x4F53, + 3148: 0x5806, + 3149: 0x5BFE, + 3150: 0x8010, + 3151: 0x5CB1, + 3152: 0x5E2F, + 3153: 0x5F85, + 3154: 0x6020, + 3155: 0x614B, + 3156: 0x6234, + 3157: 0x66FF, + 3158: 0x6CF0, + 3159: 0x6EDE, + 3160: 0x80CE, + 3161: 0x817F, + 3162: 0x82D4, + 3163: 0x888B, + 3164: 0x8CB8, + 3165: 0x9000, + 3166: 0x902E, + 3167: 0x968A, + 3168: 0x9EDB, + 3169: 0x9BDB, + 3170: 0x4EE3, + 3171: 0x53F0, + 3172: 0x5927, + 3173: 0x7B2C, + 3174: 0x918D, + 3175: 0x984C, + 3176: 0x9DF9, + 3177: 0x6EDD, + 3178: 0x7027, + 3179: 0x5353, + 3180: 0x5544, + 3181: 0x5B85, + 3182: 0x6258, + 3183: 0x629E, + 3184: 0x62D3, + 3185: 0x6CA2, + 3186: 0x6FEF, + 3187: 0x7422, + 3188: 0x8A17, + 3189: 0x9438, + 3190: 0x6FC1, + 3191: 0x8AFE, + 3192: 0x8338, + 3193: 0x51E7, + 3194: 0x86F8, + 3195: 0x53EA, + 3196: 0x53E9, + 3197: 0x4F46, + 3198: 0x9054, + 3199: 0x8FB0, + 3200: 0x596A, + 3201: 0x8131, + 3202: 0x5DFD, + 3203: 0x7AEA, + 3204: 0x8FBF, + 3205: 0x68DA, + 3206: 0x8C37, + 3207: 0x72F8, + 3208: 0x9C48, + 3209: 0x6A3D, + 3210: 0x8AB0, + 3211: 0x4E39, + 3212: 0x5358, + 3213: 0x5606, + 3214: 0x5766, + 3215: 0x62C5, + 3216: 0x63A2, + 3217: 0x65E6, + 3218: 0x6B4E, + 3219: 0x6DE1, + 3220: 0x6E5B, + 3221: 0x70AD, + 3222: 0x77ED, + 3223: 0x7AEF, + 3224: 0x7BAA, + 3225: 0x7DBB, + 3226: 0x803D, + 3227: 0x80C6, + 3228: 0x86CB, + 3229: 0x8A95, + 3230: 0x935B, + 3231: 0x56E3, + 3232: 0x58C7, + 3233: 0x5F3E, + 3234: 0x65AD, + 3235: 0x6696, + 3236: 0x6A80, + 3237: 0x6BB5, + 3238: 0x7537, + 3239: 0x8AC7, + 3240: 0x5024, + 3241: 0x77E5, + 3242: 0x5730, + 3243: 0x5F1B, + 3244: 0x6065, + 3245: 0x667A, + 3246: 0x6C60, + 3247: 0x75F4, + 3248: 0x7A1A, + 3249: 0x7F6E, + 3250: 0x81F4, + 3251: 0x8718, + 3252: 0x9045, + 3253: 0x99B3, + 3254: 0x7BC9, + 3255: 0x755C, + 3256: 0x7AF9, + 3257: 0x7B51, + 3258: 0x84C4, + 3259: 0x9010, + 3260: 0x79E9, + 3261: 0x7A92, + 3262: 0x8336, + 3263: 0x5AE1, + 3264: 0x7740, + 3265: 0x4E2D, + 3266: 0x4EF2, + 3267: 0x5B99, + 3268: 0x5FE0, + 3269: 0x62BD, + 3270: 0x663C, + 3271: 0x67F1, + 3272: 0x6CE8, + 3273: 0x866B, + 3274: 0x8877, + 3275: 0x8A3B, + 3276: 0x914E, + 3277: 0x92F3, + 3278: 0x99D0, + 3279: 0x6A17, + 3280: 0x7026, + 3281: 0x732A, + 3282: 0x82E7, + 3283: 0x8457, + 3284: 0x8CAF, + 3285: 0x4E01, + 3286: 0x5146, + 3287: 0x51CB, + 3288: 0x558B, + 3289: 0x5BF5, + 3290: 0x5E16, + 3291: 0x5E33, + 3292: 0x5E81, + 3293: 0x5F14, + 3294: 0x5F35, + 3295: 0x5F6B, + 3296: 0x5FB4, + 3297: 0x61F2, + 3298: 0x6311, + 3299: 0x66A2, + 3300: 0x671D, + 3301: 0x6F6E, + 3302: 0x7252, + 3303: 0x753A, + 3304: 0x773A, + 3305: 0x8074, + 3306: 0x8139, + 3307: 0x8178, + 3308: 0x8776, + 3309: 0x8ABF, + 3310: 0x8ADC, + 3311: 0x8D85, + 3312: 0x8DF3, + 3313: 0x929A, + 3314: 0x9577, + 3315: 0x9802, + 3316: 0x9CE5, + 3317: 0x52C5, + 3318: 0x6357, + 3319: 0x76F4, + 3320: 0x6715, + 3321: 0x6C88, + 3322: 0x73CD, + 3323: 0x8CC3, + 3324: 0x93AE, + 3325: 0x9673, + 3326: 0x6D25, + 3327: 0x589C, + 3328: 0x690E, + 3329: 0x69CC, + 3330: 0x8FFD, + 3331: 0x939A, + 3332: 0x75DB, + 3333: 0x901A, + 3334: 0x585A, + 3335: 0x6802, + 3336: 0x63B4, + 3337: 0x69FB, + 3338: 0x4F43, + 3339: 0x6F2C, + 3340: 0x67D8, + 3341: 0x8FBB, + 3342: 0x8526, + 3343: 0x7DB4, + 3344: 0x9354, + 3345: 0x693F, + 3346: 0x6F70, + 3347: 0x576A, + 3348: 0x58F7, + 3349: 0x5B2C, + 3350: 0x7D2C, + 3351: 0x722A, + 3352: 0x540A, + 3353: 0x91E3, + 3354: 0x9DB4, + 3355: 0x4EAD, + 3356: 0x4F4E, + 3357: 0x505C, + 3358: 0x5075, + 3359: 0x5243, + 3360: 0x8C9E, + 3361: 0x5448, + 3362: 0x5824, + 3363: 0x5B9A, + 3364: 0x5E1D, + 3365: 0x5E95, + 3366: 0x5EAD, + 3367: 0x5EF7, + 3368: 0x5F1F, + 3369: 0x608C, + 3370: 0x62B5, + 3371: 0x633A, + 3372: 0x63D0, + 3373: 0x68AF, + 3374: 0x6C40, + 3375: 0x7887, + 3376: 0x798E, + 3377: 0x7A0B, + 3378: 0x7DE0, + 3379: 0x8247, + 3380: 0x8A02, + 3381: 0x8AE6, + 3382: 0x8E44, + 3383: 0x9013, + 3384: 0x90B8, + 3385: 0x912D, + 3386: 0x91D8, + 3387: 0x9F0E, + 3388: 0x6CE5, + 3389: 0x6458, + 3390: 0x64E2, + 3391: 0x6575, + 3392: 0x6EF4, + 3393: 0x7684, + 3394: 0x7B1B, + 3395: 0x9069, + 3396: 0x93D1, + 3397: 0x6EBA, + 3398: 0x54F2, + 3399: 0x5FB9, + 3400: 0x64A4, + 3401: 0x8F4D, + 3402: 0x8FED, + 3403: 0x9244, + 3404: 0x5178, + 3405: 0x586B, + 3406: 0x5929, + 3407: 0x5C55, + 3408: 0x5E97, + 3409: 0x6DFB, + 3410: 0x7E8F, + 3411: 0x751C, + 3412: 0x8CBC, + 3413: 0x8EE2, + 3414: 0x985B, + 3415: 0x70B9, + 3416: 0x4F1D, + 3417: 0x6BBF, + 3418: 0x6FB1, + 3419: 0x7530, + 3420: 0x96FB, + 3421: 0x514E, + 3422: 0x5410, + 3423: 0x5835, + 3424: 0x5857, + 3425: 0x59AC, + 3426: 0x5C60, + 3427: 0x5F92, + 3428: 0x6597, + 3429: 0x675C, + 3430: 0x6E21, + 3431: 0x767B, + 3432: 0x83DF, + 3433: 0x8CED, + 3434: 0x9014, + 3435: 0x90FD, + 3436: 0x934D, + 3437: 0x7825, + 3438: 0x783A, + 3439: 0x52AA, + 3440: 0x5EA6, + 3441: 0x571F, + 3442: 0x5974, + 3443: 0x6012, + 3444: 0x5012, + 3445: 0x515A, + 3446: 0x51AC, + 3447: 0x51CD, + 3448: 0x5200, + 3449: 0x5510, + 3450: 0x5854, + 3451: 0x5858, + 3452: 0x5957, + 3453: 0x5B95, + 3454: 0x5CF6, + 3455: 0x5D8B, + 3456: 0x60BC, + 3457: 0x6295, + 3458: 0x642D, + 3459: 0x6771, + 3460: 0x6843, + 3461: 0x68BC, + 3462: 0x68DF, + 3463: 0x76D7, + 3464: 0x6DD8, + 3465: 0x6E6F, + 3466: 0x6D9B, + 3467: 0x706F, + 3468: 0x71C8, + 3469: 0x5F53, + 3470: 0x75D8, + 3471: 0x7977, + 3472: 0x7B49, + 3473: 0x7B54, + 3474: 0x7B52, + 3475: 0x7CD6, + 3476: 0x7D71, + 3477: 0x5230, + 3478: 0x8463, + 3479: 0x8569, + 3480: 0x85E4, + 3481: 0x8A0E, + 3482: 0x8B04, + 3483: 0x8C46, + 3484: 0x8E0F, + 3485: 0x9003, + 3486: 0x900F, + 3487: 0x9419, + 3488: 0x9676, + 3489: 0x982D, + 3490: 0x9A30, + 3491: 0x95D8, + 3492: 0x50CD, + 3493: 0x52D5, + 3494: 0x540C, + 3495: 0x5802, + 3496: 0x5C0E, + 3497: 0x61A7, + 3498: 0x649E, + 3499: 0x6D1E, + 3500: 0x77B3, + 3501: 0x7AE5, + 3502: 0x80F4, + 3503: 0x8404, + 3504: 0x9053, + 3505: 0x9285, + 3506: 0x5CE0, + 3507: 0x9D07, + 3508: 0x533F, + 3509: 0x5F97, + 3510: 0x5FB3, + 3511: 0x6D9C, + 3512: 0x7279, + 3513: 0x7763, + 3514: 0x79BF, + 3515: 0x7BE4, + 3516: 0x6BD2, + 3517: 0x72EC, + 3518: 0x8AAD, + 3519: 0x6803, + 3520: 0x6A61, + 3521: 0x51F8, + 3522: 0x7A81, + 3523: 0x6934, + 3524: 0x5C4A, + 3525: 0x9CF6, + 3526: 0x82EB, + 3527: 0x5BC5, + 3528: 0x9149, + 3529: 0x701E, + 3530: 0x5678, + 3531: 0x5C6F, + 3532: 0x60C7, + 3533: 0x6566, + 3534: 0x6C8C, + 3535: 0x8C5A, + 3536: 0x9041, + 3537: 0x9813, + 3538: 0x5451, + 3539: 0x66C7, + 3540: 0x920D, + 3541: 0x5948, + 3542: 0x90A3, + 3543: 0x5185, + 3544: 0x4E4D, + 3545: 0x51EA, + 3546: 0x8599, + 3547: 0x8B0E, + 3548: 0x7058, + 3549: 0x637A, + 3550: 0x934B, + 3551: 0x6962, + 3552: 0x99B4, + 3553: 0x7E04, + 3554: 0x7577, + 3555: 0x5357, + 3556: 0x6960, + 3557: 0x8EDF, + 3558: 0x96E3, + 3559: 0x6C5D, + 3560: 0x4E8C, + 3561: 0x5C3C, + 3562: 0x5F10, + 3563: 0x8FE9, + 3564: 0x5302, + 3565: 0x8CD1, + 3566: 0x8089, + 3567: 0x8679, + 3568: 0x5EFF, + 3569: 0x65E5, + 3570: 0x4E73, + 3571: 0x5165, + 3572: 0x5982, + 3573: 0x5C3F, + 3574: 0x97EE, + 3575: 0x4EFB, + 3576: 0x598A, + 3577: 0x5FCD, + 3578: 0x8A8D, + 3579: 0x6FE1, + 3580: 0x79B0, + 3581: 0x7962, + 3582: 0x5BE7, + 3583: 0x8471, + 3584: 0x732B, + 3585: 0x71B1, + 3586: 0x5E74, + 3587: 0x5FF5, + 3588: 0x637B, + 3589: 0x649A, + 3590: 0x71C3, + 3591: 0x7C98, + 3592: 0x4E43, + 3593: 0x5EFC, + 3594: 0x4E4B, + 3595: 0x57DC, + 3596: 0x56A2, + 3597: 0x60A9, + 3598: 0x6FC3, + 3599: 0x7D0D, + 3600: 0x80FD, + 3601: 0x8133, + 3602: 0x81BF, + 3603: 0x8FB2, + 3604: 0x8997, + 3605: 0x86A4, + 3606: 0x5DF4, + 3607: 0x628A, + 3608: 0x64AD, + 3609: 0x8987, + 3610: 0x6777, + 3611: 0x6CE2, + 3612: 0x6D3E, + 3613: 0x7436, + 3614: 0x7834, + 3615: 0x5A46, + 3616: 0x7F75, + 3617: 0x82AD, + 3618: 0x99AC, + 3619: 0x4FF3, + 3620: 0x5EC3, + 3621: 0x62DD, + 3622: 0x6392, + 3623: 0x6557, + 3624: 0x676F, + 3625: 0x76C3, + 3626: 0x724C, + 3627: 0x80CC, + 3628: 0x80BA, + 3629: 0x8F29, + 3630: 0x914D, + 3631: 0x500D, + 3632: 0x57F9, + 3633: 0x5A92, + 3634: 0x6885, + 3635: 0x6973, + 3636: 0x7164, + 3637: 0x72FD, + 3638: 0x8CB7, + 3639: 0x58F2, + 3640: 0x8CE0, + 3641: 0x966A, + 3642: 0x9019, + 3643: 0x877F, + 3644: 0x79E4, + 3645: 0x77E7, + 3646: 0x8429, + 3647: 0x4F2F, + 3648: 0x5265, + 3649: 0x535A, + 3650: 0x62CD, + 3651: 0x67CF, + 3652: 0x6CCA, + 3653: 0x767D, + 3654: 0x7B94, + 3655: 0x7C95, + 3656: 0x8236, + 3657: 0x8584, + 3658: 0x8FEB, + 3659: 0x66DD, + 3660: 0x6F20, + 3661: 0x7206, + 3662: 0x7E1B, + 3663: 0x83AB, + 3664: 0x99C1, + 3665: 0x9EA6, + 3666: 0x51FD, + 3667: 0x7BB1, + 3668: 0x7872, + 3669: 0x7BB8, + 3670: 0x8087, + 3671: 0x7B48, + 3672: 0x6AE8, + 3673: 0x5E61, + 3674: 0x808C, + 3675: 0x7551, + 3676: 0x7560, + 3677: 0x516B, + 3678: 0x9262, + 3679: 0x6E8C, + 3680: 0x767A, + 3681: 0x9197, + 3682: 0x9AEA, + 3683: 0x4F10, + 3684: 0x7F70, + 3685: 0x629C, + 3686: 0x7B4F, + 3687: 0x95A5, + 3688: 0x9CE9, + 3689: 0x567A, + 3690: 0x5859, + 3691: 0x86E4, + 3692: 0x96BC, + 3693: 0x4F34, + 3694: 0x5224, + 3695: 0x534A, + 3696: 0x53CD, + 3697: 0x53DB, + 3698: 0x5E06, + 3699: 0x642C, + 3700: 0x6591, + 3701: 0x677F, + 3702: 0x6C3E, + 3703: 0x6C4E, + 3704: 0x7248, + 3705: 0x72AF, + 3706: 0x73ED, + 3707: 0x7554, + 3708: 0x7E41, + 3709: 0x822C, + 3710: 0x85E9, + 3711: 0x8CA9, + 3712: 0x7BC4, + 3713: 0x91C6, + 3714: 0x7169, + 3715: 0x9812, + 3716: 0x98EF, + 3717: 0x633D, + 3718: 0x6669, + 3719: 0x756A, + 3720: 0x76E4, + 3721: 0x78D0, + 3722: 0x8543, + 3723: 0x86EE, + 3724: 0x532A, + 3725: 0x5351, + 3726: 0x5426, + 3727: 0x5983, + 3728: 0x5E87, + 3729: 0x5F7C, + 3730: 0x60B2, + 3731: 0x6249, + 3732: 0x6279, + 3733: 0x62AB, + 3734: 0x6590, + 3735: 0x6BD4, + 3736: 0x6CCC, + 3737: 0x75B2, + 3738: 0x76AE, + 3739: 0x7891, + 3740: 0x79D8, + 3741: 0x7DCB, + 3742: 0x7F77, + 3743: 0x80A5, + 3744: 0x88AB, + 3745: 0x8AB9, + 3746: 0x8CBB, + 3747: 0x907F, + 3748: 0x975E, + 3749: 0x98DB, + 3750: 0x6A0B, + 3751: 0x7C38, + 3752: 0x5099, + 3753: 0x5C3E, + 3754: 0x5FAE, + 3755: 0x6787, + 3756: 0x6BD8, + 3757: 0x7435, + 3758: 0x7709, + 3759: 0x7F8E, + 3760: 0x9F3B, + 3761: 0x67CA, + 3762: 0x7A17, + 3763: 0x5339, + 3764: 0x758B, + 3765: 0x9AED, + 3766: 0x5F66, + 3767: 0x819D, + 3768: 0x83F1, + 3769: 0x8098, + 3770: 0x5F3C, + 3771: 0x5FC5, + 3772: 0x7562, + 3773: 0x7B46, + 3774: 0x903C, + 3775: 0x6867, + 3776: 0x59EB, + 3777: 0x5A9B, + 3778: 0x7D10, + 3779: 0x767E, + 3780: 0x8B2C, + 3781: 0x4FF5, + 3782: 0x5F6A, + 3783: 0x6A19, + 3784: 0x6C37, + 3785: 0x6F02, + 3786: 0x74E2, + 3787: 0x7968, + 3788: 0x8868, + 3789: 0x8A55, + 3790: 0x8C79, + 3791: 0x5EDF, + 3792: 0x63CF, + 3793: 0x75C5, + 3794: 0x79D2, + 3795: 0x82D7, + 3796: 0x9328, + 3797: 0x92F2, + 3798: 0x849C, + 3799: 0x86ED, + 3800: 0x9C2D, + 3801: 0x54C1, + 3802: 0x5F6C, + 3803: 0x658C, + 3804: 0x6D5C, + 3805: 0x7015, + 3806: 0x8CA7, + 3807: 0x8CD3, + 3808: 0x983B, + 3809: 0x654F, + 3810: 0x74F6, + 3811: 0x4E0D, + 3812: 0x4ED8, + 3813: 0x57E0, + 3814: 0x592B, + 3815: 0x5A66, + 3816: 0x5BCC, + 3817: 0x51A8, + 3818: 0x5E03, + 3819: 0x5E9C, + 3820: 0x6016, + 3821: 0x6276, + 3822: 0x6577, + 3823: 0x65A7, + 3824: 0x666E, + 3825: 0x6D6E, + 3826: 0x7236, + 3827: 0x7B26, + 3828: 0x8150, + 3829: 0x819A, + 3830: 0x8299, + 3831: 0x8B5C, + 3832: 0x8CA0, + 3833: 0x8CE6, + 3834: 0x8D74, + 3835: 0x961C, + 3836: 0x9644, + 3837: 0x4FAE, + 3838: 0x64AB, + 3839: 0x6B66, + 3840: 0x821E, + 3841: 0x8461, + 3842: 0x856A, + 3843: 0x90E8, + 3844: 0x5C01, + 3845: 0x6953, + 3846: 0x98A8, + 3847: 0x847A, + 3848: 0x8557, + 3849: 0x4F0F, + 3850: 0x526F, + 3851: 0x5FA9, + 3852: 0x5E45, + 3853: 0x670D, + 3854: 0x798F, + 3855: 0x8179, + 3856: 0x8907, + 3857: 0x8986, + 3858: 0x6DF5, + 3859: 0x5F17, + 3860: 0x6255, + 3861: 0x6CB8, + 3862: 0x4ECF, + 3863: 0x7269, + 3864: 0x9B92, + 3865: 0x5206, + 3866: 0x543B, + 3867: 0x5674, + 3868: 0x58B3, + 3869: 0x61A4, + 3870: 0x626E, + 3871: 0x711A, + 3872: 0x596E, + 3873: 0x7C89, + 3874: 0x7CDE, + 3875: 0x7D1B, + 3876: 0x96F0, + 3877: 0x6587, + 3878: 0x805E, + 3879: 0x4E19, + 3880: 0x4F75, + 3881: 0x5175, + 3882: 0x5840, + 3883: 0x5E63, + 3884: 0x5E73, + 3885: 0x5F0A, + 3886: 0x67C4, + 3887: 0x4E26, + 3888: 0x853D, + 3889: 0x9589, + 3890: 0x965B, + 3891: 0x7C73, + 3892: 0x9801, + 3893: 0x50FB, + 3894: 0x58C1, + 3895: 0x7656, + 3896: 0x78A7, + 3897: 0x5225, + 3898: 0x77A5, + 3899: 0x8511, + 3900: 0x7B86, + 3901: 0x504F, + 3902: 0x5909, + 3903: 0x7247, + 3904: 0x7BC7, + 3905: 0x7DE8, + 3906: 0x8FBA, + 3907: 0x8FD4, + 3908: 0x904D, + 3909: 0x4FBF, + 3910: 0x52C9, + 3911: 0x5A29, + 3912: 0x5F01, + 3913: 0x97AD, + 3914: 0x4FDD, + 3915: 0x8217, + 3916: 0x92EA, + 3917: 0x5703, + 3918: 0x6355, + 3919: 0x6B69, + 3920: 0x752B, + 3921: 0x88DC, + 3922: 0x8F14, + 3923: 0x7A42, + 3924: 0x52DF, + 3925: 0x5893, + 3926: 0x6155, + 3927: 0x620A, + 3928: 0x66AE, + 3929: 0x6BCD, + 3930: 0x7C3F, + 3931: 0x83E9, + 3932: 0x5023, + 3933: 0x4FF8, + 3934: 0x5305, + 3935: 0x5446, + 3936: 0x5831, + 3937: 0x5949, + 3938: 0x5B9D, + 3939: 0x5CF0, + 3940: 0x5CEF, + 3941: 0x5D29, + 3942: 0x5E96, + 3943: 0x62B1, + 3944: 0x6367, + 3945: 0x653E, + 3946: 0x65B9, + 3947: 0x670B, + 3948: 0x6CD5, + 3949: 0x6CE1, + 3950: 0x70F9, + 3951: 0x7832, + 3952: 0x7E2B, + 3953: 0x80DE, + 3954: 0x82B3, + 3955: 0x840C, + 3956: 0x84EC, + 3957: 0x8702, + 3958: 0x8912, + 3959: 0x8A2A, + 3960: 0x8C4A, + 3961: 0x90A6, + 3962: 0x92D2, + 3963: 0x98FD, + 3964: 0x9CF3, + 3965: 0x9D6C, + 3966: 0x4E4F, + 3967: 0x4EA1, + 3968: 0x508D, + 3969: 0x5256, + 3970: 0x574A, + 3971: 0x59A8, + 3972: 0x5E3D, + 3973: 0x5FD8, + 3974: 0x5FD9, + 3975: 0x623F, + 3976: 0x66B4, + 3977: 0x671B, + 3978: 0x67D0, + 3979: 0x68D2, + 3980: 0x5192, + 3981: 0x7D21, + 3982: 0x80AA, + 3983: 0x81A8, + 3984: 0x8B00, + 3985: 0x8C8C, + 3986: 0x8CBF, + 3987: 0x927E, + 3988: 0x9632, + 3989: 0x5420, + 3990: 0x982C, + 3991: 0x5317, + 3992: 0x50D5, + 3993: 0x535C, + 3994: 0x58A8, + 3995: 0x64B2, + 3996: 0x6734, + 3997: 0x7267, + 3998: 0x7766, + 3999: 0x7A46, + 4000: 0x91E6, + 4001: 0x52C3, + 4002: 0x6CA1, + 4003: 0x6B86, + 4004: 0x5800, + 4005: 0x5E4C, + 4006: 0x5954, + 4007: 0x672C, + 4008: 0x7FFB, + 4009: 0x51E1, + 4010: 0x76C6, + 4011: 0x6469, + 4012: 0x78E8, + 4013: 0x9B54, + 4014: 0x9EBB, + 4015: 0x57CB, + 4016: 0x59B9, + 4017: 0x6627, + 4018: 0x679A, + 4019: 0x6BCE, + 4020: 0x54E9, + 4021: 0x69D9, + 4022: 0x5E55, + 4023: 0x819C, + 4024: 0x6795, + 4025: 0x9BAA, + 4026: 0x67FE, + 4027: 0x9C52, + 4028: 0x685D, + 4029: 0x4EA6, + 4030: 0x4FE3, + 4031: 0x53C8, + 4032: 0x62B9, + 4033: 0x672B, + 4034: 0x6CAB, + 4035: 0x8FC4, + 4036: 0x4FAD, + 4037: 0x7E6D, + 4038: 0x9EBF, + 4039: 0x4E07, + 4040: 0x6162, + 4041: 0x6E80, + 4042: 0x6F2B, + 4043: 0x8513, + 4044: 0x5473, + 4045: 0x672A, + 4046: 0x9B45, + 4047: 0x5DF3, + 4048: 0x7B95, + 4049: 0x5CAC, + 4050: 0x5BC6, + 4051: 0x871C, + 4052: 0x6E4A, + 4053: 0x84D1, + 4054: 0x7A14, + 4055: 0x8108, + 4056: 0x5999, + 4057: 0x7C8D, + 4058: 0x6C11, + 4059: 0x7720, + 4060: 0x52D9, + 4061: 0x5922, + 4062: 0x7121, + 4063: 0x725F, + 4064: 0x77DB, + 4065: 0x9727, + 4066: 0x9D61, + 4067: 0x690B, + 4068: 0x5A7F, + 4069: 0x5A18, + 4070: 0x51A5, + 4071: 0x540D, + 4072: 0x547D, + 4073: 0x660E, + 4074: 0x76DF, + 4075: 0x8FF7, + 4076: 0x9298, + 4077: 0x9CF4, + 4078: 0x59EA, + 4079: 0x725D, + 4080: 0x6EC5, + 4081: 0x514D, + 4082: 0x68C9, + 4083: 0x7DBF, + 4084: 0x7DEC, + 4085: 0x9762, + 4086: 0x9EBA, + 4087: 0x6478, + 4088: 0x6A21, + 4089: 0x8302, + 4090: 0x5984, + 4091: 0x5B5F, + 4092: 0x6BDB, + 4093: 0x731B, + 4094: 0x76F2, + 4095: 0x7DB2, + 4096: 0x8017, + 4097: 0x8499, + 4098: 0x5132, + 4099: 0x6728, + 4100: 0x9ED9, + 4101: 0x76EE, + 4102: 0x6762, + 4103: 0x52FF, + 4104: 0x9905, + 4105: 0x5C24, + 4106: 0x623B, + 4107: 0x7C7E, + 4108: 0x8CB0, + 4109: 0x554F, + 4110: 0x60B6, + 4111: 0x7D0B, + 4112: 0x9580, + 4113: 0x5301, + 4114: 0x4E5F, + 4115: 0x51B6, + 4116: 0x591C, + 4117: 0x723A, + 4118: 0x8036, + 4119: 0x91CE, + 4120: 0x5F25, + 4121: 0x77E2, + 4122: 0x5384, + 4123: 0x5F79, + 4124: 0x7D04, + 4125: 0x85AC, + 4126: 0x8A33, + 4127: 0x8E8D, + 4128: 0x9756, + 4129: 0x67F3, + 4130: 0x85AE, + 4131: 0x9453, + 4132: 0x6109, + 4133: 0x6108, + 4134: 0x6CB9, + 4135: 0x7652, + 4136: 0x8AED, + 4137: 0x8F38, + 4138: 0x552F, + 4139: 0x4F51, + 4140: 0x512A, + 4141: 0x52C7, + 4142: 0x53CB, + 4143: 0x5BA5, + 4144: 0x5E7D, + 4145: 0x60A0, + 4146: 0x6182, + 4147: 0x63D6, + 4148: 0x6709, + 4149: 0x67DA, + 4150: 0x6E67, + 4151: 0x6D8C, + 4152: 0x7336, + 4153: 0x7337, + 4154: 0x7531, + 4155: 0x7950, + 4156: 0x88D5, + 4157: 0x8A98, + 4158: 0x904A, + 4159: 0x9091, + 4160: 0x90F5, + 4161: 0x96C4, + 4162: 0x878D, + 4163: 0x5915, + 4164: 0x4E88, + 4165: 0x4F59, + 4166: 0x4E0E, + 4167: 0x8A89, + 4168: 0x8F3F, + 4169: 0x9810, + 4170: 0x50AD, + 4171: 0x5E7C, + 4172: 0x5996, + 4173: 0x5BB9, + 4174: 0x5EB8, + 4175: 0x63DA, + 4176: 0x63FA, + 4177: 0x64C1, + 4178: 0x66DC, + 4179: 0x694A, + 4180: 0x69D8, + 4181: 0x6D0B, + 4182: 0x6EB6, + 4183: 0x7194, + 4184: 0x7528, + 4185: 0x7AAF, + 4186: 0x7F8A, + 4187: 0x8000, + 4188: 0x8449, + 4189: 0x84C9, + 4190: 0x8981, + 4191: 0x8B21, + 4192: 0x8E0A, + 4193: 0x9065, + 4194: 0x967D, + 4195: 0x990A, + 4196: 0x617E, + 4197: 0x6291, + 4198: 0x6B32, + 4199: 0x6C83, + 4200: 0x6D74, + 4201: 0x7FCC, + 4202: 0x7FFC, + 4203: 0x6DC0, + 4204: 0x7F85, + 4205: 0x87BA, + 4206: 0x88F8, + 4207: 0x6765, + 4208: 0x83B1, + 4209: 0x983C, + 4210: 0x96F7, + 4211: 0x6D1B, + 4212: 0x7D61, + 4213: 0x843D, + 4214: 0x916A, + 4215: 0x4E71, + 4216: 0x5375, + 4217: 0x5D50, + 4218: 0x6B04, + 4219: 0x6FEB, + 4220: 0x85CD, + 4221: 0x862D, + 4222: 0x89A7, + 4223: 0x5229, + 4224: 0x540F, + 4225: 0x5C65, + 4226: 0x674E, + 4227: 0x68A8, + 4228: 0x7406, + 4229: 0x7483, + 4230: 0x75E2, + 4231: 0x88CF, + 4232: 0x88E1, + 4233: 0x91CC, + 4234: 0x96E2, + 4235: 0x9678, + 4236: 0x5F8B, + 4237: 0x7387, + 4238: 0x7ACB, + 4239: 0x844E, + 4240: 0x63A0, + 4241: 0x7565, + 4242: 0x5289, + 4243: 0x6D41, + 4244: 0x6E9C, + 4245: 0x7409, + 4246: 0x7559, + 4247: 0x786B, + 4248: 0x7C92, + 4249: 0x9686, + 4250: 0x7ADC, + 4251: 0x9F8D, + 4252: 0x4FB6, + 4253: 0x616E, + 4254: 0x65C5, + 4255: 0x865C, + 4256: 0x4E86, + 4257: 0x4EAE, + 4258: 0x50DA, + 4259: 0x4E21, + 4260: 0x51CC, + 4261: 0x5BEE, + 4262: 0x6599, + 4263: 0x6881, + 4264: 0x6DBC, + 4265: 0x731F, + 4266: 0x7642, + 4267: 0x77AD, + 4268: 0x7A1C, + 4269: 0x7CE7, + 4270: 0x826F, + 4271: 0x8AD2, + 4272: 0x907C, + 4273: 0x91CF, + 4274: 0x9675, + 4275: 0x9818, + 4276: 0x529B, + 4277: 0x7DD1, + 4278: 0x502B, + 4279: 0x5398, + 4280: 0x6797, + 4281: 0x6DCB, + 4282: 0x71D0, + 4283: 0x7433, + 4284: 0x81E8, + 4285: 0x8F2A, + 4286: 0x96A3, + 4287: 0x9C57, + 4288: 0x9E9F, + 4289: 0x7460, + 4290: 0x5841, + 4291: 0x6D99, + 4292: 0x7D2F, + 4293: 0x985E, + 4294: 0x4EE4, + 4295: 0x4F36, + 4296: 0x4F8B, + 4297: 0x51B7, + 4298: 0x52B1, + 4299: 0x5DBA, + 4300: 0x601C, + 4301: 0x73B2, + 4302: 0x793C, + 4303: 0x82D3, + 4304: 0x9234, + 4305: 0x96B7, + 4306: 0x96F6, + 4307: 0x970A, + 4308: 0x9E97, + 4309: 0x9F62, + 4310: 0x66A6, + 4311: 0x6B74, + 4312: 0x5217, + 4313: 0x52A3, + 4314: 0x70C8, + 4315: 0x88C2, + 4316: 0x5EC9, + 4317: 0x604B, + 4318: 0x6190, + 4319: 0x6F23, + 4320: 0x7149, + 4321: 0x7C3E, + 4322: 0x7DF4, + 4323: 0x806F, + 4324: 0x84EE, + 4325: 0x9023, + 4326: 0x932C, + 4327: 0x5442, + 4328: 0x9B6F, + 4329: 0x6AD3, + 4330: 0x7089, + 4331: 0x8CC2, + 4332: 0x8DEF, + 4333: 0x9732, + 4334: 0x52B4, + 4335: 0x5A41, + 4336: 0x5ECA, + 4337: 0x5F04, + 4338: 0x6717, + 4339: 0x697C, + 4340: 0x6994, + 4341: 0x6D6A, + 4342: 0x6F0F, + 4343: 0x7262, + 4344: 0x72FC, + 4345: 0x7BED, + 4346: 0x8001, + 4347: 0x807E, + 4348: 0x874B, + 4349: 0x90CE, + 4350: 0x516D, + 4351: 0x9E93, + 4352: 0x7984, + 4353: 0x808B, + 4354: 0x9332, + 4355: 0x8AD6, + 4356: 0x502D, + 4357: 0x548C, + 4358: 0x8A71, + 4359: 0x6B6A, + 4360: 0x8CC4, + 4361: 0x8107, + 4362: 0x60D1, + 4363: 0x67A0, + 4364: 0x9DF2, + 4365: 0x4E99, + 4366: 0x4E98, + 4367: 0x9C10, + 4368: 0x8A6B, + 4369: 0x85C1, + 4370: 0x8568, + 4371: 0x6900, + 4372: 0x6E7E, + 4373: 0x7897, + 4374: 0x8155, + 4418: 0x5F0C, + 4419: 0x4E10, + 4420: 0x4E15, + 4421: 0x4E2A, + 4422: 0x4E31, + 4423: 0x4E36, + 4424: 0x4E3C, + 4425: 0x4E3F, + 4426: 0x4E42, + 4427: 0x4E56, + 4428: 0x4E58, + 4429: 0x4E82, + 4430: 0x4E85, + 4431: 0x8C6B, + 4432: 0x4E8A, + 4433: 0x8212, + 4434: 0x5F0D, + 4435: 0x4E8E, + 4436: 0x4E9E, + 4437: 0x4E9F, + 4438: 0x4EA0, + 4439: 0x4EA2, + 4440: 0x4EB0, + 4441: 0x4EB3, + 4442: 0x4EB6, + 4443: 0x4ECE, + 4444: 0x4ECD, + 4445: 0x4EC4, + 4446: 0x4EC6, + 4447: 0x4EC2, + 4448: 0x4ED7, + 4449: 0x4EDE, + 4450: 0x4EED, + 4451: 0x4EDF, + 4452: 0x4EF7, + 4453: 0x4F09, + 4454: 0x4F5A, + 4455: 0x4F30, + 4456: 0x4F5B, + 4457: 0x4F5D, + 4458: 0x4F57, + 4459: 0x4F47, + 4460: 0x4F76, + 4461: 0x4F88, + 4462: 0x4F8F, + 4463: 0x4F98, + 4464: 0x4F7B, + 4465: 0x4F69, + 4466: 0x4F70, + 4467: 0x4F91, + 4468: 0x4F6F, + 4469: 0x4F86, + 4470: 0x4F96, + 4471: 0x5118, + 4472: 0x4FD4, + 4473: 0x4FDF, + 4474: 0x4FCE, + 4475: 0x4FD8, + 4476: 0x4FDB, + 4477: 0x4FD1, + 4478: 0x4FDA, + 4479: 0x4FD0, + 4480: 0x4FE4, + 4481: 0x4FE5, + 4482: 0x501A, + 4483: 0x5028, + 4484: 0x5014, + 4485: 0x502A, + 4486: 0x5025, + 4487: 0x5005, + 4488: 0x4F1C, + 4489: 0x4FF6, + 4490: 0x5021, + 4491: 0x5029, + 4492: 0x502C, + 4493: 0x4FFE, + 4494: 0x4FEF, + 4495: 0x5011, + 4496: 0x5006, + 4497: 0x5043, + 4498: 0x5047, + 4499: 0x6703, + 4500: 0x5055, + 4501: 0x5050, + 4502: 0x5048, + 4503: 0x505A, + 4504: 0x5056, + 4505: 0x506C, + 4506: 0x5078, + 4507: 0x5080, + 4508: 0x509A, + 4509: 0x5085, + 4510: 0x50B4, + 4511: 0x50B2, + 4512: 0x50C9, + 4513: 0x50CA, + 4514: 0x50B3, + 4515: 0x50C2, + 4516: 0x50D6, + 4517: 0x50DE, + 4518: 0x50E5, + 4519: 0x50ED, + 4520: 0x50E3, + 4521: 0x50EE, + 4522: 0x50F9, + 4523: 0x50F5, + 4524: 0x5109, + 4525: 0x5101, + 4526: 0x5102, + 4527: 0x5116, + 4528: 0x5115, + 4529: 0x5114, + 4530: 0x511A, + 4531: 0x5121, + 4532: 0x513A, + 4533: 0x5137, + 4534: 0x513C, + 4535: 0x513B, + 4536: 0x513F, + 4537: 0x5140, + 4538: 0x5152, + 4539: 0x514C, + 4540: 0x5154, + 4541: 0x5162, + 4542: 0x7AF8, + 4543: 0x5169, + 4544: 0x516A, + 4545: 0x516E, + 4546: 0x5180, + 4547: 0x5182, + 4548: 0x56D8, + 4549: 0x518C, + 4550: 0x5189, + 4551: 0x518F, + 4552: 0x5191, + 4553: 0x5193, + 4554: 0x5195, + 4555: 0x5196, + 4556: 0x51A4, + 4557: 0x51A6, + 4558: 0x51A2, + 4559: 0x51A9, + 4560: 0x51AA, + 4561: 0x51AB, + 4562: 0x51B3, + 4563: 0x51B1, + 4564: 0x51B2, + 4565: 0x51B0, + 4566: 0x51B5, + 4567: 0x51BD, + 4568: 0x51C5, + 4569: 0x51C9, + 4570: 0x51DB, + 4571: 0x51E0, + 4572: 0x8655, + 4573: 0x51E9, + 4574: 0x51ED, + 4575: 0x51F0, + 4576: 0x51F5, + 4577: 0x51FE, + 4578: 0x5204, + 4579: 0x520B, + 4580: 0x5214, + 4581: 0x520E, + 4582: 0x5227, + 4583: 0x522A, + 4584: 0x522E, + 4585: 0x5233, + 4586: 0x5239, + 4587: 0x524F, + 4588: 0x5244, + 4589: 0x524B, + 4590: 0x524C, + 4591: 0x525E, + 4592: 0x5254, + 4593: 0x526A, + 4594: 0x5274, + 4595: 0x5269, + 4596: 0x5273, + 4597: 0x527F, + 4598: 0x527D, + 4599: 0x528D, + 4600: 0x5294, + 4601: 0x5292, + 4602: 0x5271, + 4603: 0x5288, + 4604: 0x5291, + 4605: 0x8FA8, + 4606: 0x8FA7, + 4607: 0x52AC, + 4608: 0x52AD, + 4609: 0x52BC, + 4610: 0x52B5, + 4611: 0x52C1, + 4612: 0x52CD, + 4613: 0x52D7, + 4614: 0x52DE, + 4615: 0x52E3, + 4616: 0x52E6, + 4617: 0x98ED, + 4618: 0x52E0, + 4619: 0x52F3, + 4620: 0x52F5, + 4621: 0x52F8, + 4622: 0x52F9, + 4623: 0x5306, + 4624: 0x5308, + 4625: 0x7538, + 4626: 0x530D, + 4627: 0x5310, + 4628: 0x530F, + 4629: 0x5315, + 4630: 0x531A, + 4631: 0x5323, + 4632: 0x532F, + 4633: 0x5331, + 4634: 0x5333, + 4635: 0x5338, + 4636: 0x5340, + 4637: 0x5346, + 4638: 0x5345, + 4639: 0x4E17, + 4640: 0x5349, + 4641: 0x534D, + 4642: 0x51D6, + 4643: 0x535E, + 4644: 0x5369, + 4645: 0x536E, + 4646: 0x5918, + 4647: 0x537B, + 4648: 0x5377, + 4649: 0x5382, + 4650: 0x5396, + 4651: 0x53A0, + 4652: 0x53A6, + 4653: 0x53A5, + 4654: 0x53AE, + 4655: 0x53B0, + 4656: 0x53B6, + 4657: 0x53C3, + 4658: 0x7C12, + 4659: 0x96D9, + 4660: 0x53DF, + 4661: 0x66FC, + 4662: 0x71EE, + 4663: 0x53EE, + 4664: 0x53E8, + 4665: 0x53ED, + 4666: 0x53FA, + 4667: 0x5401, + 4668: 0x543D, + 4669: 0x5440, + 4670: 0x542C, + 4671: 0x542D, + 4672: 0x543C, + 4673: 0x542E, + 4674: 0x5436, + 4675: 0x5429, + 4676: 0x541D, + 4677: 0x544E, + 4678: 0x548F, + 4679: 0x5475, + 4680: 0x548E, + 4681: 0x545F, + 4682: 0x5471, + 4683: 0x5477, + 4684: 0x5470, + 4685: 0x5492, + 4686: 0x547B, + 4687: 0x5480, + 4688: 0x5476, + 4689: 0x5484, + 4690: 0x5490, + 4691: 0x5486, + 4692: 0x54C7, + 4693: 0x54A2, + 4694: 0x54B8, + 4695: 0x54A5, + 4696: 0x54AC, + 4697: 0x54C4, + 4698: 0x54C8, + 4699: 0x54A8, + 4700: 0x54AB, + 4701: 0x54C2, + 4702: 0x54A4, + 4703: 0x54BE, + 4704: 0x54BC, + 4705: 0x54D8, + 4706: 0x54E5, + 4707: 0x54E6, + 4708: 0x550F, + 4709: 0x5514, + 4710: 0x54FD, + 4711: 0x54EE, + 4712: 0x54ED, + 4713: 0x54FA, + 4714: 0x54E2, + 4715: 0x5539, + 4716: 0x5540, + 4717: 0x5563, + 4718: 0x554C, + 4719: 0x552E, + 4720: 0x555C, + 4721: 0x5545, + 4722: 0x5556, + 4723: 0x5557, + 4724: 0x5538, + 4725: 0x5533, + 4726: 0x555D, + 4727: 0x5599, + 4728: 0x5580, + 4729: 0x54AF, + 4730: 0x558A, + 4731: 0x559F, + 4732: 0x557B, + 4733: 0x557E, + 4734: 0x5598, + 4735: 0x559E, + 4736: 0x55AE, + 4737: 0x557C, + 4738: 0x5583, + 4739: 0x55A9, + 4740: 0x5587, + 4741: 0x55A8, + 4742: 0x55DA, + 4743: 0x55C5, + 4744: 0x55DF, + 4745: 0x55C4, + 4746: 0x55DC, + 4747: 0x55E4, + 4748: 0x55D4, + 4749: 0x5614, + 4750: 0x55F7, + 4751: 0x5616, + 4752: 0x55FE, + 4753: 0x55FD, + 4754: 0x561B, + 4755: 0x55F9, + 4756: 0x564E, + 4757: 0x5650, + 4758: 0x71DF, + 4759: 0x5634, + 4760: 0x5636, + 4761: 0x5632, + 4762: 0x5638, + 4763: 0x566B, + 4764: 0x5664, + 4765: 0x562F, + 4766: 0x566C, + 4767: 0x566A, + 4768: 0x5686, + 4769: 0x5680, + 4770: 0x568A, + 4771: 0x56A0, + 4772: 0x5694, + 4773: 0x568F, + 4774: 0x56A5, + 4775: 0x56AE, + 4776: 0x56B6, + 4777: 0x56B4, + 4778: 0x56C2, + 4779: 0x56BC, + 4780: 0x56C1, + 4781: 0x56C3, + 4782: 0x56C0, + 4783: 0x56C8, + 4784: 0x56CE, + 4785: 0x56D1, + 4786: 0x56D3, + 4787: 0x56D7, + 4788: 0x56EE, + 4789: 0x56F9, + 4790: 0x5700, + 4791: 0x56FF, + 4792: 0x5704, + 4793: 0x5709, + 4794: 0x5708, + 4795: 0x570B, + 4796: 0x570D, + 4797: 0x5713, + 4798: 0x5718, + 4799: 0x5716, + 4800: 0x55C7, + 4801: 0x571C, + 4802: 0x5726, + 4803: 0x5737, + 4804: 0x5738, + 4805: 0x574E, + 4806: 0x573B, + 4807: 0x5740, + 4808: 0x574F, + 4809: 0x5769, + 4810: 0x57C0, + 4811: 0x5788, + 4812: 0x5761, + 4813: 0x577F, + 4814: 0x5789, + 4815: 0x5793, + 4816: 0x57A0, + 4817: 0x57B3, + 4818: 0x57A4, + 4819: 0x57AA, + 4820: 0x57B0, + 4821: 0x57C3, + 4822: 0x57C6, + 4823: 0x57D4, + 4824: 0x57D2, + 4825: 0x57D3, + 4826: 0x580A, + 4827: 0x57D6, + 4828: 0x57E3, + 4829: 0x580B, + 4830: 0x5819, + 4831: 0x581D, + 4832: 0x5872, + 4833: 0x5821, + 4834: 0x5862, + 4835: 0x584B, + 4836: 0x5870, + 4837: 0x6BC0, + 4838: 0x5852, + 4839: 0x583D, + 4840: 0x5879, + 4841: 0x5885, + 4842: 0x58B9, + 4843: 0x589F, + 4844: 0x58AB, + 4845: 0x58BA, + 4846: 0x58DE, + 4847: 0x58BB, + 4848: 0x58B8, + 4849: 0x58AE, + 4850: 0x58C5, + 4851: 0x58D3, + 4852: 0x58D1, + 4853: 0x58D7, + 4854: 0x58D9, + 4855: 0x58D8, + 4856: 0x58E5, + 4857: 0x58DC, + 4858: 0x58E4, + 4859: 0x58DF, + 4860: 0x58EF, + 4861: 0x58FA, + 4862: 0x58F9, + 4863: 0x58FB, + 4864: 0x58FC, + 4865: 0x58FD, + 4866: 0x5902, + 4867: 0x590A, + 4868: 0x5910, + 4869: 0x591B, + 4870: 0x68A6, + 4871: 0x5925, + 4872: 0x592C, + 4873: 0x592D, + 4874: 0x5932, + 4875: 0x5938, + 4876: 0x593E, + 4877: 0x7AD2, + 4878: 0x5955, + 4879: 0x5950, + 4880: 0x594E, + 4881: 0x595A, + 4882: 0x5958, + 4883: 0x5962, + 4884: 0x5960, + 4885: 0x5967, + 4886: 0x596C, + 4887: 0x5969, + 4888: 0x5978, + 4889: 0x5981, + 4890: 0x599D, + 4891: 0x4F5E, + 4892: 0x4FAB, + 4893: 0x59A3, + 4894: 0x59B2, + 4895: 0x59C6, + 4896: 0x59E8, + 4897: 0x59DC, + 4898: 0x598D, + 4899: 0x59D9, + 4900: 0x59DA, + 4901: 0x5A25, + 4902: 0x5A1F, + 4903: 0x5A11, + 4904: 0x5A1C, + 4905: 0x5A09, + 4906: 0x5A1A, + 4907: 0x5A40, + 4908: 0x5A6C, + 4909: 0x5A49, + 4910: 0x5A35, + 4911: 0x5A36, + 4912: 0x5A62, + 4913: 0x5A6A, + 4914: 0x5A9A, + 4915: 0x5ABC, + 4916: 0x5ABE, + 4917: 0x5ACB, + 4918: 0x5AC2, + 4919: 0x5ABD, + 4920: 0x5AE3, + 4921: 0x5AD7, + 4922: 0x5AE6, + 4923: 0x5AE9, + 4924: 0x5AD6, + 4925: 0x5AFA, + 4926: 0x5AFB, + 4927: 0x5B0C, + 4928: 0x5B0B, + 4929: 0x5B16, + 4930: 0x5B32, + 4931: 0x5AD0, + 4932: 0x5B2A, + 4933: 0x5B36, + 4934: 0x5B3E, + 4935: 0x5B43, + 4936: 0x5B45, + 4937: 0x5B40, + 4938: 0x5B51, + 4939: 0x5B55, + 4940: 0x5B5A, + 4941: 0x5B5B, + 4942: 0x5B65, + 4943: 0x5B69, + 4944: 0x5B70, + 4945: 0x5B73, + 4946: 0x5B75, + 4947: 0x5B78, + 4948: 0x6588, + 4949: 0x5B7A, + 4950: 0x5B80, + 4951: 0x5B83, + 4952: 0x5BA6, + 4953: 0x5BB8, + 4954: 0x5BC3, + 4955: 0x5BC7, + 4956: 0x5BC9, + 4957: 0x5BD4, + 4958: 0x5BD0, + 4959: 0x5BE4, + 4960: 0x5BE6, + 4961: 0x5BE2, + 4962: 0x5BDE, + 4963: 0x5BE5, + 4964: 0x5BEB, + 4965: 0x5BF0, + 4966: 0x5BF6, + 4967: 0x5BF3, + 4968: 0x5C05, + 4969: 0x5C07, + 4970: 0x5C08, + 4971: 0x5C0D, + 4972: 0x5C13, + 4973: 0x5C20, + 4974: 0x5C22, + 4975: 0x5C28, + 4976: 0x5C38, + 4977: 0x5C39, + 4978: 0x5C41, + 4979: 0x5C46, + 4980: 0x5C4E, + 4981: 0x5C53, + 4982: 0x5C50, + 4983: 0x5C4F, + 4984: 0x5B71, + 4985: 0x5C6C, + 4986: 0x5C6E, + 4987: 0x4E62, + 4988: 0x5C76, + 4989: 0x5C79, + 4990: 0x5C8C, + 4991: 0x5C91, + 4992: 0x5C94, + 4993: 0x599B, + 4994: 0x5CAB, + 4995: 0x5CBB, + 4996: 0x5CB6, + 4997: 0x5CBC, + 4998: 0x5CB7, + 4999: 0x5CC5, + 5000: 0x5CBE, + 5001: 0x5CC7, + 5002: 0x5CD9, + 5003: 0x5CE9, + 5004: 0x5CFD, + 5005: 0x5CFA, + 5006: 0x5CED, + 5007: 0x5D8C, + 5008: 0x5CEA, + 5009: 0x5D0B, + 5010: 0x5D15, + 5011: 0x5D17, + 5012: 0x5D5C, + 5013: 0x5D1F, + 5014: 0x5D1B, + 5015: 0x5D11, + 5016: 0x5D14, + 5017: 0x5D22, + 5018: 0x5D1A, + 5019: 0x5D19, + 5020: 0x5D18, + 5021: 0x5D4C, + 5022: 0x5D52, + 5023: 0x5D4E, + 5024: 0x5D4B, + 5025: 0x5D6C, + 5026: 0x5D73, + 5027: 0x5D76, + 5028: 0x5D87, + 5029: 0x5D84, + 5030: 0x5D82, + 5031: 0x5DA2, + 5032: 0x5D9D, + 5033: 0x5DAC, + 5034: 0x5DAE, + 5035: 0x5DBD, + 5036: 0x5D90, + 5037: 0x5DB7, + 5038: 0x5DBC, + 5039: 0x5DC9, + 5040: 0x5DCD, + 5041: 0x5DD3, + 5042: 0x5DD2, + 5043: 0x5DD6, + 5044: 0x5DDB, + 5045: 0x5DEB, + 5046: 0x5DF2, + 5047: 0x5DF5, + 5048: 0x5E0B, + 5049: 0x5E1A, + 5050: 0x5E19, + 5051: 0x5E11, + 5052: 0x5E1B, + 5053: 0x5E36, + 5054: 0x5E37, + 5055: 0x5E44, + 5056: 0x5E43, + 5057: 0x5E40, + 5058: 0x5E4E, + 5059: 0x5E57, + 5060: 0x5E54, + 5061: 0x5E5F, + 5062: 0x5E62, + 5063: 0x5E64, + 5064: 0x5E47, + 5065: 0x5E75, + 5066: 0x5E76, + 5067: 0x5E7A, + 5068: 0x9EBC, + 5069: 0x5E7F, + 5070: 0x5EA0, + 5071: 0x5EC1, + 5072: 0x5EC2, + 5073: 0x5EC8, + 5074: 0x5ED0, + 5075: 0x5ECF, + 5076: 0x5ED6, + 5077: 0x5EE3, + 5078: 0x5EDD, + 5079: 0x5EDA, + 5080: 0x5EDB, + 5081: 0x5EE2, + 5082: 0x5EE1, + 5083: 0x5EE8, + 5084: 0x5EE9, + 5085: 0x5EEC, + 5086: 0x5EF1, + 5087: 0x5EF3, + 5088: 0x5EF0, + 5089: 0x5EF4, + 5090: 0x5EF8, + 5091: 0x5EFE, + 5092: 0x5F03, + 5093: 0x5F09, + 5094: 0x5F5D, + 5095: 0x5F5C, + 5096: 0x5F0B, + 5097: 0x5F11, + 5098: 0x5F16, + 5099: 0x5F29, + 5100: 0x5F2D, + 5101: 0x5F38, + 5102: 0x5F41, + 5103: 0x5F48, + 5104: 0x5F4C, + 5105: 0x5F4E, + 5106: 0x5F2F, + 5107: 0x5F51, + 5108: 0x5F56, + 5109: 0x5F57, + 5110: 0x5F59, + 5111: 0x5F61, + 5112: 0x5F6D, + 5113: 0x5F73, + 5114: 0x5F77, + 5115: 0x5F83, + 5116: 0x5F82, + 5117: 0x5F7F, + 5118: 0x5F8A, + 5119: 0x5F88, + 5120: 0x5F91, + 5121: 0x5F87, + 5122: 0x5F9E, + 5123: 0x5F99, + 5124: 0x5F98, + 5125: 0x5FA0, + 5126: 0x5FA8, + 5127: 0x5FAD, + 5128: 0x5FBC, + 5129: 0x5FD6, + 5130: 0x5FFB, + 5131: 0x5FE4, + 5132: 0x5FF8, + 5133: 0x5FF1, + 5134: 0x5FDD, + 5135: 0x60B3, + 5136: 0x5FFF, + 5137: 0x6021, + 5138: 0x6060, + 5139: 0x6019, + 5140: 0x6010, + 5141: 0x6029, + 5142: 0x600E, + 5143: 0x6031, + 5144: 0x601B, + 5145: 0x6015, + 5146: 0x602B, + 5147: 0x6026, + 5148: 0x600F, + 5149: 0x603A, + 5150: 0x605A, + 5151: 0x6041, + 5152: 0x606A, + 5153: 0x6077, + 5154: 0x605F, + 5155: 0x604A, + 5156: 0x6046, + 5157: 0x604D, + 5158: 0x6063, + 5159: 0x6043, + 5160: 0x6064, + 5161: 0x6042, + 5162: 0x606C, + 5163: 0x606B, + 5164: 0x6059, + 5165: 0x6081, + 5166: 0x608D, + 5167: 0x60E7, + 5168: 0x6083, + 5169: 0x609A, + 5170: 0x6084, + 5171: 0x609B, + 5172: 0x6096, + 5173: 0x6097, + 5174: 0x6092, + 5175: 0x60A7, + 5176: 0x608B, + 5177: 0x60E1, + 5178: 0x60B8, + 5179: 0x60E0, + 5180: 0x60D3, + 5181: 0x60B4, + 5182: 0x5FF0, + 5183: 0x60BD, + 5184: 0x60C6, + 5185: 0x60B5, + 5186: 0x60D8, + 5187: 0x614D, + 5188: 0x6115, + 5189: 0x6106, + 5190: 0x60F6, + 5191: 0x60F7, + 5192: 0x6100, + 5193: 0x60F4, + 5194: 0x60FA, + 5195: 0x6103, + 5196: 0x6121, + 5197: 0x60FB, + 5198: 0x60F1, + 5199: 0x610D, + 5200: 0x610E, + 5201: 0x6147, + 5202: 0x613E, + 5203: 0x6128, + 5204: 0x6127, + 5205: 0x614A, + 5206: 0x613F, + 5207: 0x613C, + 5208: 0x612C, + 5209: 0x6134, + 5210: 0x613D, + 5211: 0x6142, + 5212: 0x6144, + 5213: 0x6173, + 5214: 0x6177, + 5215: 0x6158, + 5216: 0x6159, + 5217: 0x615A, + 5218: 0x616B, + 5219: 0x6174, + 5220: 0x616F, + 5221: 0x6165, + 5222: 0x6171, + 5223: 0x615F, + 5224: 0x615D, + 5225: 0x6153, + 5226: 0x6175, + 5227: 0x6199, + 5228: 0x6196, + 5229: 0x6187, + 5230: 0x61AC, + 5231: 0x6194, + 5232: 0x619A, + 5233: 0x618A, + 5234: 0x6191, + 5235: 0x61AB, + 5236: 0x61AE, + 5237: 0x61CC, + 5238: 0x61CA, + 5239: 0x61C9, + 5240: 0x61F7, + 5241: 0x61C8, + 5242: 0x61C3, + 5243: 0x61C6, + 5244: 0x61BA, + 5245: 0x61CB, + 5246: 0x7F79, + 5247: 0x61CD, + 5248: 0x61E6, + 5249: 0x61E3, + 5250: 0x61F6, + 5251: 0x61FA, + 5252: 0x61F4, + 5253: 0x61FF, + 5254: 0x61FD, + 5255: 0x61FC, + 5256: 0x61FE, + 5257: 0x6200, + 5258: 0x6208, + 5259: 0x6209, + 5260: 0x620D, + 5261: 0x620C, + 5262: 0x6214, + 5263: 0x621B, + 5264: 0x621E, + 5265: 0x6221, + 5266: 0x622A, + 5267: 0x622E, + 5268: 0x6230, + 5269: 0x6232, + 5270: 0x6233, + 5271: 0x6241, + 5272: 0x624E, + 5273: 0x625E, + 5274: 0x6263, + 5275: 0x625B, + 5276: 0x6260, + 5277: 0x6268, + 5278: 0x627C, + 5279: 0x6282, + 5280: 0x6289, + 5281: 0x627E, + 5282: 0x6292, + 5283: 0x6293, + 5284: 0x6296, + 5285: 0x62D4, + 5286: 0x6283, + 5287: 0x6294, + 5288: 0x62D7, + 5289: 0x62D1, + 5290: 0x62BB, + 5291: 0x62CF, + 5292: 0x62FF, + 5293: 0x62C6, + 5294: 0x64D4, + 5295: 0x62C8, + 5296: 0x62DC, + 5297: 0x62CC, + 5298: 0x62CA, + 5299: 0x62C2, + 5300: 0x62C7, + 5301: 0x629B, + 5302: 0x62C9, + 5303: 0x630C, + 5304: 0x62EE, + 5305: 0x62F1, + 5306: 0x6327, + 5307: 0x6302, + 5308: 0x6308, + 5309: 0x62EF, + 5310: 0x62F5, + 5311: 0x6350, + 5312: 0x633E, + 5313: 0x634D, + 5314: 0x641C, + 5315: 0x634F, + 5316: 0x6396, + 5317: 0x638E, + 5318: 0x6380, + 5319: 0x63AB, + 5320: 0x6376, + 5321: 0x63A3, + 5322: 0x638F, + 5323: 0x6389, + 5324: 0x639F, + 5325: 0x63B5, + 5326: 0x636B, + 5327: 0x6369, + 5328: 0x63BE, + 5329: 0x63E9, + 5330: 0x63C0, + 5331: 0x63C6, + 5332: 0x63E3, + 5333: 0x63C9, + 5334: 0x63D2, + 5335: 0x63F6, + 5336: 0x63C4, + 5337: 0x6416, + 5338: 0x6434, + 5339: 0x6406, + 5340: 0x6413, + 5341: 0x6426, + 5342: 0x6436, + 5343: 0x651D, + 5344: 0x6417, + 5345: 0x6428, + 5346: 0x640F, + 5347: 0x6467, + 5348: 0x646F, + 5349: 0x6476, + 5350: 0x644E, + 5351: 0x652A, + 5352: 0x6495, + 5353: 0x6493, + 5354: 0x64A5, + 5355: 0x64A9, + 5356: 0x6488, + 5357: 0x64BC, + 5358: 0x64DA, + 5359: 0x64D2, + 5360: 0x64C5, + 5361: 0x64C7, + 5362: 0x64BB, + 5363: 0x64D8, + 5364: 0x64C2, + 5365: 0x64F1, + 5366: 0x64E7, + 5367: 0x8209, + 5368: 0x64E0, + 5369: 0x64E1, + 5370: 0x62AC, + 5371: 0x64E3, + 5372: 0x64EF, + 5373: 0x652C, + 5374: 0x64F6, + 5375: 0x64F4, + 5376: 0x64F2, + 5377: 0x64FA, + 5378: 0x6500, + 5379: 0x64FD, + 5380: 0x6518, + 5381: 0x651C, + 5382: 0x6505, + 5383: 0x6524, + 5384: 0x6523, + 5385: 0x652B, + 5386: 0x6534, + 5387: 0x6535, + 5388: 0x6537, + 5389: 0x6536, + 5390: 0x6538, + 5391: 0x754B, + 5392: 0x6548, + 5393: 0x6556, + 5394: 0x6555, + 5395: 0x654D, + 5396: 0x6558, + 5397: 0x655E, + 5398: 0x655D, + 5399: 0x6572, + 5400: 0x6578, + 5401: 0x6582, + 5402: 0x6583, + 5403: 0x8B8A, + 5404: 0x659B, + 5405: 0x659F, + 5406: 0x65AB, + 5407: 0x65B7, + 5408: 0x65C3, + 5409: 0x65C6, + 5410: 0x65C1, + 5411: 0x65C4, + 5412: 0x65CC, + 5413: 0x65D2, + 5414: 0x65DB, + 5415: 0x65D9, + 5416: 0x65E0, + 5417: 0x65E1, + 5418: 0x65F1, + 5419: 0x6772, + 5420: 0x660A, + 5421: 0x6603, + 5422: 0x65FB, + 5423: 0x6773, + 5424: 0x6635, + 5425: 0x6636, + 5426: 0x6634, + 5427: 0x661C, + 5428: 0x664F, + 5429: 0x6644, + 5430: 0x6649, + 5431: 0x6641, + 5432: 0x665E, + 5433: 0x665D, + 5434: 0x6664, + 5435: 0x6667, + 5436: 0x6668, + 5437: 0x665F, + 5438: 0x6662, + 5439: 0x6670, + 5440: 0x6683, + 5441: 0x6688, + 5442: 0x668E, + 5443: 0x6689, + 5444: 0x6684, + 5445: 0x6698, + 5446: 0x669D, + 5447: 0x66C1, + 5448: 0x66B9, + 5449: 0x66C9, + 5450: 0x66BE, + 5451: 0x66BC, + 5452: 0x66C4, + 5453: 0x66B8, + 5454: 0x66D6, + 5455: 0x66DA, + 5456: 0x66E0, + 5457: 0x663F, + 5458: 0x66E6, + 5459: 0x66E9, + 5460: 0x66F0, + 5461: 0x66F5, + 5462: 0x66F7, + 5463: 0x670F, + 5464: 0x6716, + 5465: 0x671E, + 5466: 0x6726, + 5467: 0x6727, + 5468: 0x9738, + 5469: 0x672E, + 5470: 0x673F, + 5471: 0x6736, + 5472: 0x6741, + 5473: 0x6738, + 5474: 0x6737, + 5475: 0x6746, + 5476: 0x675E, + 5477: 0x6760, + 5478: 0x6759, + 5479: 0x6763, + 5480: 0x6764, + 5481: 0x6789, + 5482: 0x6770, + 5483: 0x67A9, + 5484: 0x677C, + 5485: 0x676A, + 5486: 0x678C, + 5487: 0x678B, + 5488: 0x67A6, + 5489: 0x67A1, + 5490: 0x6785, + 5491: 0x67B7, + 5492: 0x67EF, + 5493: 0x67B4, + 5494: 0x67EC, + 5495: 0x67B3, + 5496: 0x67E9, + 5497: 0x67B8, + 5498: 0x67E4, + 5499: 0x67DE, + 5500: 0x67DD, + 5501: 0x67E2, + 5502: 0x67EE, + 5503: 0x67B9, + 5504: 0x67CE, + 5505: 0x67C6, + 5506: 0x67E7, + 5507: 0x6A9C, + 5508: 0x681E, + 5509: 0x6846, + 5510: 0x6829, + 5511: 0x6840, + 5512: 0x684D, + 5513: 0x6832, + 5514: 0x684E, + 5515: 0x68B3, + 5516: 0x682B, + 5517: 0x6859, + 5518: 0x6863, + 5519: 0x6877, + 5520: 0x687F, + 5521: 0x689F, + 5522: 0x688F, + 5523: 0x68AD, + 5524: 0x6894, + 5525: 0x689D, + 5526: 0x689B, + 5527: 0x6883, + 5528: 0x6AAE, + 5529: 0x68B9, + 5530: 0x6874, + 5531: 0x68B5, + 5532: 0x68A0, + 5533: 0x68BA, + 5534: 0x690F, + 5535: 0x688D, + 5536: 0x687E, + 5537: 0x6901, + 5538: 0x68CA, + 5539: 0x6908, + 5540: 0x68D8, + 5541: 0x6922, + 5542: 0x6926, + 5543: 0x68E1, + 5544: 0x690C, + 5545: 0x68CD, + 5546: 0x68D4, + 5547: 0x68E7, + 5548: 0x68D5, + 5549: 0x6936, + 5550: 0x6912, + 5551: 0x6904, + 5552: 0x68D7, + 5553: 0x68E3, + 5554: 0x6925, + 5555: 0x68F9, + 5556: 0x68E0, + 5557: 0x68EF, + 5558: 0x6928, + 5559: 0x692A, + 5560: 0x691A, + 5561: 0x6923, + 5562: 0x6921, + 5563: 0x68C6, + 5564: 0x6979, + 5565: 0x6977, + 5566: 0x695C, + 5567: 0x6978, + 5568: 0x696B, + 5569: 0x6954, + 5570: 0x697E, + 5571: 0x696E, + 5572: 0x6939, + 5573: 0x6974, + 5574: 0x693D, + 5575: 0x6959, + 5576: 0x6930, + 5577: 0x6961, + 5578: 0x695E, + 5579: 0x695D, + 5580: 0x6981, + 5581: 0x696A, + 5582: 0x69B2, + 5583: 0x69AE, + 5584: 0x69D0, + 5585: 0x69BF, + 5586: 0x69C1, + 5587: 0x69D3, + 5588: 0x69BE, + 5589: 0x69CE, + 5590: 0x5BE8, + 5591: 0x69CA, + 5592: 0x69DD, + 5593: 0x69BB, + 5594: 0x69C3, + 5595: 0x69A7, + 5596: 0x6A2E, + 5597: 0x6991, + 5598: 0x69A0, + 5599: 0x699C, + 5600: 0x6995, + 5601: 0x69B4, + 5602: 0x69DE, + 5603: 0x69E8, + 5604: 0x6A02, + 5605: 0x6A1B, + 5606: 0x69FF, + 5607: 0x6B0A, + 5608: 0x69F9, + 5609: 0x69F2, + 5610: 0x69E7, + 5611: 0x6A05, + 5612: 0x69B1, + 5613: 0x6A1E, + 5614: 0x69ED, + 5615: 0x6A14, + 5616: 0x69EB, + 5617: 0x6A0A, + 5618: 0x6A12, + 5619: 0x6AC1, + 5620: 0x6A23, + 5621: 0x6A13, + 5622: 0x6A44, + 5623: 0x6A0C, + 5624: 0x6A72, + 5625: 0x6A36, + 5626: 0x6A78, + 5627: 0x6A47, + 5628: 0x6A62, + 5629: 0x6A59, + 5630: 0x6A66, + 5631: 0x6A48, + 5632: 0x6A38, + 5633: 0x6A22, + 5634: 0x6A90, + 5635: 0x6A8D, + 5636: 0x6AA0, + 5637: 0x6A84, + 5638: 0x6AA2, + 5639: 0x6AA3, + 5640: 0x6A97, + 5641: 0x8617, + 5642: 0x6ABB, + 5643: 0x6AC3, + 5644: 0x6AC2, + 5645: 0x6AB8, + 5646: 0x6AB3, + 5647: 0x6AAC, + 5648: 0x6ADE, + 5649: 0x6AD1, + 5650: 0x6ADF, + 5651: 0x6AAA, + 5652: 0x6ADA, + 5653: 0x6AEA, + 5654: 0x6AFB, + 5655: 0x6B05, + 5656: 0x8616, + 5657: 0x6AFA, + 5658: 0x6B12, + 5659: 0x6B16, + 5660: 0x9B31, + 5661: 0x6B1F, + 5662: 0x6B38, + 5663: 0x6B37, + 5664: 0x76DC, + 5665: 0x6B39, + 5666: 0x98EE, + 5667: 0x6B47, + 5668: 0x6B43, + 5669: 0x6B49, + 5670: 0x6B50, + 5671: 0x6B59, + 5672: 0x6B54, + 5673: 0x6B5B, + 5674: 0x6B5F, + 5675: 0x6B61, + 5676: 0x6B78, + 5677: 0x6B79, + 5678: 0x6B7F, + 5679: 0x6B80, + 5680: 0x6B84, + 5681: 0x6B83, + 5682: 0x6B8D, + 5683: 0x6B98, + 5684: 0x6B95, + 5685: 0x6B9E, + 5686: 0x6BA4, + 5687: 0x6BAA, + 5688: 0x6BAB, + 5689: 0x6BAF, + 5690: 0x6BB2, + 5691: 0x6BB1, + 5692: 0x6BB3, + 5693: 0x6BB7, + 5694: 0x6BBC, + 5695: 0x6BC6, + 5696: 0x6BCB, + 5697: 0x6BD3, + 5698: 0x6BDF, + 5699: 0x6BEC, + 5700: 0x6BEB, + 5701: 0x6BF3, + 5702: 0x6BEF, + 5703: 0x9EBE, + 5704: 0x6C08, + 5705: 0x6C13, + 5706: 0x6C14, + 5707: 0x6C1B, + 5708: 0x6C24, + 5709: 0x6C23, + 5710: 0x6C5E, + 5711: 0x6C55, + 5712: 0x6C62, + 5713: 0x6C6A, + 5714: 0x6C82, + 5715: 0x6C8D, + 5716: 0x6C9A, + 5717: 0x6C81, + 5718: 0x6C9B, + 5719: 0x6C7E, + 5720: 0x6C68, + 5721: 0x6C73, + 5722: 0x6C92, + 5723: 0x6C90, + 5724: 0x6CC4, + 5725: 0x6CF1, + 5726: 0x6CD3, + 5727: 0x6CBD, + 5728: 0x6CD7, + 5729: 0x6CC5, + 5730: 0x6CDD, + 5731: 0x6CAE, + 5732: 0x6CB1, + 5733: 0x6CBE, + 5734: 0x6CBA, + 5735: 0x6CDB, + 5736: 0x6CEF, + 5737: 0x6CD9, + 5738: 0x6CEA, + 5739: 0x6D1F, + 5740: 0x884D, + 5741: 0x6D36, + 5742: 0x6D2B, + 5743: 0x6D3D, + 5744: 0x6D38, + 5745: 0x6D19, + 5746: 0x6D35, + 5747: 0x6D33, + 5748: 0x6D12, + 5749: 0x6D0C, + 5750: 0x6D63, + 5751: 0x6D93, + 5752: 0x6D64, + 5753: 0x6D5A, + 5754: 0x6D79, + 5755: 0x6D59, + 5756: 0x6D8E, + 5757: 0x6D95, + 5758: 0x6FE4, + 5759: 0x6D85, + 5760: 0x6DF9, + 5761: 0x6E15, + 5762: 0x6E0A, + 5763: 0x6DB5, + 5764: 0x6DC7, + 5765: 0x6DE6, + 5766: 0x6DB8, + 5767: 0x6DC6, + 5768: 0x6DEC, + 5769: 0x6DDE, + 5770: 0x6DCC, + 5771: 0x6DE8, + 5772: 0x6DD2, + 5773: 0x6DC5, + 5774: 0x6DFA, + 5775: 0x6DD9, + 5776: 0x6DE4, + 5777: 0x6DD5, + 5778: 0x6DEA, + 5779: 0x6DEE, + 5780: 0x6E2D, + 5781: 0x6E6E, + 5782: 0x6E2E, + 5783: 0x6E19, + 5784: 0x6E72, + 5785: 0x6E5F, + 5786: 0x6E3E, + 5787: 0x6E23, + 5788: 0x6E6B, + 5789: 0x6E2B, + 5790: 0x6E76, + 5791: 0x6E4D, + 5792: 0x6E1F, + 5793: 0x6E43, + 5794: 0x6E3A, + 5795: 0x6E4E, + 5796: 0x6E24, + 5797: 0x6EFF, + 5798: 0x6E1D, + 5799: 0x6E38, + 5800: 0x6E82, + 5801: 0x6EAA, + 5802: 0x6E98, + 5803: 0x6EC9, + 5804: 0x6EB7, + 5805: 0x6ED3, + 5806: 0x6EBD, + 5807: 0x6EAF, + 5808: 0x6EC4, + 5809: 0x6EB2, + 5810: 0x6ED4, + 5811: 0x6ED5, + 5812: 0x6E8F, + 5813: 0x6EA5, + 5814: 0x6EC2, + 5815: 0x6E9F, + 5816: 0x6F41, + 5817: 0x6F11, + 5818: 0x704C, + 5819: 0x6EEC, + 5820: 0x6EF8, + 5821: 0x6EFE, + 5822: 0x6F3F, + 5823: 0x6EF2, + 5824: 0x6F31, + 5825: 0x6EEF, + 5826: 0x6F32, + 5827: 0x6ECC, + 5828: 0x6F3E, + 5829: 0x6F13, + 5830: 0x6EF7, + 5831: 0x6F86, + 5832: 0x6F7A, + 5833: 0x6F78, + 5834: 0x6F81, + 5835: 0x6F80, + 5836: 0x6F6F, + 5837: 0x6F5B, + 5838: 0x6FF3, + 5839: 0x6F6D, + 5840: 0x6F82, + 5841: 0x6F7C, + 5842: 0x6F58, + 5843: 0x6F8E, + 5844: 0x6F91, + 5845: 0x6FC2, + 5846: 0x6F66, + 5847: 0x6FB3, + 5848: 0x6FA3, + 5849: 0x6FA1, + 5850: 0x6FA4, + 5851: 0x6FB9, + 5852: 0x6FC6, + 5853: 0x6FAA, + 5854: 0x6FDF, + 5855: 0x6FD5, + 5856: 0x6FEC, + 5857: 0x6FD4, + 5858: 0x6FD8, + 5859: 0x6FF1, + 5860: 0x6FEE, + 5861: 0x6FDB, + 5862: 0x7009, + 5863: 0x700B, + 5864: 0x6FFA, + 5865: 0x7011, + 5866: 0x7001, + 5867: 0x700F, + 5868: 0x6FFE, + 5869: 0x701B, + 5870: 0x701A, + 5871: 0x6F74, + 5872: 0x701D, + 5873: 0x7018, + 5874: 0x701F, + 5875: 0x7030, + 5876: 0x703E, + 5877: 0x7032, + 5878: 0x7051, + 5879: 0x7063, + 5880: 0x7099, + 5881: 0x7092, + 5882: 0x70AF, + 5883: 0x70F1, + 5884: 0x70AC, + 5885: 0x70B8, + 5886: 0x70B3, + 5887: 0x70AE, + 5888: 0x70DF, + 5889: 0x70CB, + 5890: 0x70DD, + 5891: 0x70D9, + 5892: 0x7109, + 5893: 0x70FD, + 5894: 0x711C, + 5895: 0x7119, + 5896: 0x7165, + 5897: 0x7155, + 5898: 0x7188, + 5899: 0x7166, + 5900: 0x7162, + 5901: 0x714C, + 5902: 0x7156, + 5903: 0x716C, + 5904: 0x718F, + 5905: 0x71FB, + 5906: 0x7184, + 5907: 0x7195, + 5908: 0x71A8, + 5909: 0x71AC, + 5910: 0x71D7, + 5911: 0x71B9, + 5912: 0x71BE, + 5913: 0x71D2, + 5914: 0x71C9, + 5915: 0x71D4, + 5916: 0x71CE, + 5917: 0x71E0, + 5918: 0x71EC, + 5919: 0x71E7, + 5920: 0x71F5, + 5921: 0x71FC, + 5922: 0x71F9, + 5923: 0x71FF, + 5924: 0x720D, + 5925: 0x7210, + 5926: 0x721B, + 5927: 0x7228, + 5928: 0x722D, + 5929: 0x722C, + 5930: 0x7230, + 5931: 0x7232, + 5932: 0x723B, + 5933: 0x723C, + 5934: 0x723F, + 5935: 0x7240, + 5936: 0x7246, + 5937: 0x724B, + 5938: 0x7258, + 5939: 0x7274, + 5940: 0x727E, + 5941: 0x7282, + 5942: 0x7281, + 5943: 0x7287, + 5944: 0x7292, + 5945: 0x7296, + 5946: 0x72A2, + 5947: 0x72A7, + 5948: 0x72B9, + 5949: 0x72B2, + 5950: 0x72C3, + 5951: 0x72C6, + 5952: 0x72C4, + 5953: 0x72CE, + 5954: 0x72D2, + 5955: 0x72E2, + 5956: 0x72E0, + 5957: 0x72E1, + 5958: 0x72F9, + 5959: 0x72F7, + 5960: 0x500F, + 5961: 0x7317, + 5962: 0x730A, + 5963: 0x731C, + 5964: 0x7316, + 5965: 0x731D, + 5966: 0x7334, + 5967: 0x732F, + 5968: 0x7329, + 5969: 0x7325, + 5970: 0x733E, + 5971: 0x734E, + 5972: 0x734F, + 5973: 0x9ED8, + 5974: 0x7357, + 5975: 0x736A, + 5976: 0x7368, + 5977: 0x7370, + 5978: 0x7378, + 5979: 0x7375, + 5980: 0x737B, + 5981: 0x737A, + 5982: 0x73C8, + 5983: 0x73B3, + 5984: 0x73CE, + 5985: 0x73BB, + 5986: 0x73C0, + 5987: 0x73E5, + 5988: 0x73EE, + 5989: 0x73DE, + 5990: 0x74A2, + 5991: 0x7405, + 5992: 0x746F, + 5993: 0x7425, + 5994: 0x73F8, + 5995: 0x7432, + 5996: 0x743A, + 5997: 0x7455, + 5998: 0x743F, + 5999: 0x745F, + 6000: 0x7459, + 6001: 0x7441, + 6002: 0x745C, + 6003: 0x7469, + 6004: 0x7470, + 6005: 0x7463, + 6006: 0x746A, + 6007: 0x7476, + 6008: 0x747E, + 6009: 0x748B, + 6010: 0x749E, + 6011: 0x74A7, + 6012: 0x74CA, + 6013: 0x74CF, + 6014: 0x74D4, + 6015: 0x73F1, + 6016: 0x74E0, + 6017: 0x74E3, + 6018: 0x74E7, + 6019: 0x74E9, + 6020: 0x74EE, + 6021: 0x74F2, + 6022: 0x74F0, + 6023: 0x74F1, + 6024: 0x74F8, + 6025: 0x74F7, + 6026: 0x7504, + 6027: 0x7503, + 6028: 0x7505, + 6029: 0x750C, + 6030: 0x750E, + 6031: 0x750D, + 6032: 0x7515, + 6033: 0x7513, + 6034: 0x751E, + 6035: 0x7526, + 6036: 0x752C, + 6037: 0x753C, + 6038: 0x7544, + 6039: 0x754D, + 6040: 0x754A, + 6041: 0x7549, + 6042: 0x755B, + 6043: 0x7546, + 6044: 0x755A, + 6045: 0x7569, + 6046: 0x7564, + 6047: 0x7567, + 6048: 0x756B, + 6049: 0x756D, + 6050: 0x7578, + 6051: 0x7576, + 6052: 0x7586, + 6053: 0x7587, + 6054: 0x7574, + 6055: 0x758A, + 6056: 0x7589, + 6057: 0x7582, + 6058: 0x7594, + 6059: 0x759A, + 6060: 0x759D, + 6061: 0x75A5, + 6062: 0x75A3, + 6063: 0x75C2, + 6064: 0x75B3, + 6065: 0x75C3, + 6066: 0x75B5, + 6067: 0x75BD, + 6068: 0x75B8, + 6069: 0x75BC, + 6070: 0x75B1, + 6071: 0x75CD, + 6072: 0x75CA, + 6073: 0x75D2, + 6074: 0x75D9, + 6075: 0x75E3, + 6076: 0x75DE, + 6077: 0x75FE, + 6078: 0x75FF, + 6079: 0x75FC, + 6080: 0x7601, + 6081: 0x75F0, + 6082: 0x75FA, + 6083: 0x75F2, + 6084: 0x75F3, + 6085: 0x760B, + 6086: 0x760D, + 6087: 0x7609, + 6088: 0x761F, + 6089: 0x7627, + 6090: 0x7620, + 6091: 0x7621, + 6092: 0x7622, + 6093: 0x7624, + 6094: 0x7634, + 6095: 0x7630, + 6096: 0x763B, + 6097: 0x7647, + 6098: 0x7648, + 6099: 0x7646, + 6100: 0x765C, + 6101: 0x7658, + 6102: 0x7661, + 6103: 0x7662, + 6104: 0x7668, + 6105: 0x7669, + 6106: 0x766A, + 6107: 0x7667, + 6108: 0x766C, + 6109: 0x7670, + 6110: 0x7672, + 6111: 0x7676, + 6112: 0x7678, + 6113: 0x767C, + 6114: 0x7680, + 6115: 0x7683, + 6116: 0x7688, + 6117: 0x768B, + 6118: 0x768E, + 6119: 0x7696, + 6120: 0x7693, + 6121: 0x7699, + 6122: 0x769A, + 6123: 0x76B0, + 6124: 0x76B4, + 6125: 0x76B8, + 6126: 0x76B9, + 6127: 0x76BA, + 6128: 0x76C2, + 6129: 0x76CD, + 6130: 0x76D6, + 6131: 0x76D2, + 6132: 0x76DE, + 6133: 0x76E1, + 6134: 0x76E5, + 6135: 0x76E7, + 6136: 0x76EA, + 6137: 0x862F, + 6138: 0x76FB, + 6139: 0x7708, + 6140: 0x7707, + 6141: 0x7704, + 6142: 0x7729, + 6143: 0x7724, + 6144: 0x771E, + 6145: 0x7725, + 6146: 0x7726, + 6147: 0x771B, + 6148: 0x7737, + 6149: 0x7738, + 6150: 0x7747, + 6151: 0x775A, + 6152: 0x7768, + 6153: 0x776B, + 6154: 0x775B, + 6155: 0x7765, + 6156: 0x777F, + 6157: 0x777E, + 6158: 0x7779, + 6159: 0x778E, + 6160: 0x778B, + 6161: 0x7791, + 6162: 0x77A0, + 6163: 0x779E, + 6164: 0x77B0, + 6165: 0x77B6, + 6166: 0x77B9, + 6167: 0x77BF, + 6168: 0x77BC, + 6169: 0x77BD, + 6170: 0x77BB, + 6171: 0x77C7, + 6172: 0x77CD, + 6173: 0x77D7, + 6174: 0x77DA, + 6175: 0x77DC, + 6176: 0x77E3, + 6177: 0x77EE, + 6178: 0x77FC, + 6179: 0x780C, + 6180: 0x7812, + 6181: 0x7926, + 6182: 0x7820, + 6183: 0x792A, + 6184: 0x7845, + 6185: 0x788E, + 6186: 0x7874, + 6187: 0x7886, + 6188: 0x787C, + 6189: 0x789A, + 6190: 0x788C, + 6191: 0x78A3, + 6192: 0x78B5, + 6193: 0x78AA, + 6194: 0x78AF, + 6195: 0x78D1, + 6196: 0x78C6, + 6197: 0x78CB, + 6198: 0x78D4, + 6199: 0x78BE, + 6200: 0x78BC, + 6201: 0x78C5, + 6202: 0x78CA, + 6203: 0x78EC, + 6204: 0x78E7, + 6205: 0x78DA, + 6206: 0x78FD, + 6207: 0x78F4, + 6208: 0x7907, + 6209: 0x7912, + 6210: 0x7911, + 6211: 0x7919, + 6212: 0x792C, + 6213: 0x792B, + 6214: 0x7940, + 6215: 0x7960, + 6216: 0x7957, + 6217: 0x795F, + 6218: 0x795A, + 6219: 0x7955, + 6220: 0x7953, + 6221: 0x797A, + 6222: 0x797F, + 6223: 0x798A, + 6224: 0x799D, + 6225: 0x79A7, + 6226: 0x9F4B, + 6227: 0x79AA, + 6228: 0x79AE, + 6229: 0x79B3, + 6230: 0x79B9, + 6231: 0x79BA, + 6232: 0x79C9, + 6233: 0x79D5, + 6234: 0x79E7, + 6235: 0x79EC, + 6236: 0x79E1, + 6237: 0x79E3, + 6238: 0x7A08, + 6239: 0x7A0D, + 6240: 0x7A18, + 6241: 0x7A19, + 6242: 0x7A20, + 6243: 0x7A1F, + 6244: 0x7980, + 6245: 0x7A31, + 6246: 0x7A3B, + 6247: 0x7A3E, + 6248: 0x7A37, + 6249: 0x7A43, + 6250: 0x7A57, + 6251: 0x7A49, + 6252: 0x7A61, + 6253: 0x7A62, + 6254: 0x7A69, + 6255: 0x9F9D, + 6256: 0x7A70, + 6257: 0x7A79, + 6258: 0x7A7D, + 6259: 0x7A88, + 6260: 0x7A97, + 6261: 0x7A95, + 6262: 0x7A98, + 6263: 0x7A96, + 6264: 0x7AA9, + 6265: 0x7AC8, + 6266: 0x7AB0, + 6267: 0x7AB6, + 6268: 0x7AC5, + 6269: 0x7AC4, + 6270: 0x7ABF, + 6271: 0x9083, + 6272: 0x7AC7, + 6273: 0x7ACA, + 6274: 0x7ACD, + 6275: 0x7ACF, + 6276: 0x7AD5, + 6277: 0x7AD3, + 6278: 0x7AD9, + 6279: 0x7ADA, + 6280: 0x7ADD, + 6281: 0x7AE1, + 6282: 0x7AE2, + 6283: 0x7AE6, + 6284: 0x7AED, + 6285: 0x7AF0, + 6286: 0x7B02, + 6287: 0x7B0F, + 6288: 0x7B0A, + 6289: 0x7B06, + 6290: 0x7B33, + 6291: 0x7B18, + 6292: 0x7B19, + 6293: 0x7B1E, + 6294: 0x7B35, + 6295: 0x7B28, + 6296: 0x7B36, + 6297: 0x7B50, + 6298: 0x7B7A, + 6299: 0x7B04, + 6300: 0x7B4D, + 6301: 0x7B0B, + 6302: 0x7B4C, + 6303: 0x7B45, + 6304: 0x7B75, + 6305: 0x7B65, + 6306: 0x7B74, + 6307: 0x7B67, + 6308: 0x7B70, + 6309: 0x7B71, + 6310: 0x7B6C, + 6311: 0x7B6E, + 6312: 0x7B9D, + 6313: 0x7B98, + 6314: 0x7B9F, + 6315: 0x7B8D, + 6316: 0x7B9C, + 6317: 0x7B9A, + 6318: 0x7B8B, + 6319: 0x7B92, + 6320: 0x7B8F, + 6321: 0x7B5D, + 6322: 0x7B99, + 6323: 0x7BCB, + 6324: 0x7BC1, + 6325: 0x7BCC, + 6326: 0x7BCF, + 6327: 0x7BB4, + 6328: 0x7BC6, + 6329: 0x7BDD, + 6330: 0x7BE9, + 6331: 0x7C11, + 6332: 0x7C14, + 6333: 0x7BE6, + 6334: 0x7BE5, + 6335: 0x7C60, + 6336: 0x7C00, + 6337: 0x7C07, + 6338: 0x7C13, + 6339: 0x7BF3, + 6340: 0x7BF7, + 6341: 0x7C17, + 6342: 0x7C0D, + 6343: 0x7BF6, + 6344: 0x7C23, + 6345: 0x7C27, + 6346: 0x7C2A, + 6347: 0x7C1F, + 6348: 0x7C37, + 6349: 0x7C2B, + 6350: 0x7C3D, + 6351: 0x7C4C, + 6352: 0x7C43, + 6353: 0x7C54, + 6354: 0x7C4F, + 6355: 0x7C40, + 6356: 0x7C50, + 6357: 0x7C58, + 6358: 0x7C5F, + 6359: 0x7C64, + 6360: 0x7C56, + 6361: 0x7C65, + 6362: 0x7C6C, + 6363: 0x7C75, + 6364: 0x7C83, + 6365: 0x7C90, + 6366: 0x7CA4, + 6367: 0x7CAD, + 6368: 0x7CA2, + 6369: 0x7CAB, + 6370: 0x7CA1, + 6371: 0x7CA8, + 6372: 0x7CB3, + 6373: 0x7CB2, + 6374: 0x7CB1, + 6375: 0x7CAE, + 6376: 0x7CB9, + 6377: 0x7CBD, + 6378: 0x7CC0, + 6379: 0x7CC5, + 6380: 0x7CC2, + 6381: 0x7CD8, + 6382: 0x7CD2, + 6383: 0x7CDC, + 6384: 0x7CE2, + 6385: 0x9B3B, + 6386: 0x7CEF, + 6387: 0x7CF2, + 6388: 0x7CF4, + 6389: 0x7CF6, + 6390: 0x7CFA, + 6391: 0x7D06, + 6392: 0x7D02, + 6393: 0x7D1C, + 6394: 0x7D15, + 6395: 0x7D0A, + 6396: 0x7D45, + 6397: 0x7D4B, + 6398: 0x7D2E, + 6399: 0x7D32, + 6400: 0x7D3F, + 6401: 0x7D35, + 6402: 0x7D46, + 6403: 0x7D73, + 6404: 0x7D56, + 6405: 0x7D4E, + 6406: 0x7D72, + 6407: 0x7D68, + 6408: 0x7D6E, + 6409: 0x7D4F, + 6410: 0x7D63, + 6411: 0x7D93, + 6412: 0x7D89, + 6413: 0x7D5B, + 6414: 0x7D8F, + 6415: 0x7D7D, + 6416: 0x7D9B, + 6417: 0x7DBA, + 6418: 0x7DAE, + 6419: 0x7DA3, + 6420: 0x7DB5, + 6421: 0x7DC7, + 6422: 0x7DBD, + 6423: 0x7DAB, + 6424: 0x7E3D, + 6425: 0x7DA2, + 6426: 0x7DAF, + 6427: 0x7DDC, + 6428: 0x7DB8, + 6429: 0x7D9F, + 6430: 0x7DB0, + 6431: 0x7DD8, + 6432: 0x7DDD, + 6433: 0x7DE4, + 6434: 0x7DDE, + 6435: 0x7DFB, + 6436: 0x7DF2, + 6437: 0x7DE1, + 6438: 0x7E05, + 6439: 0x7E0A, + 6440: 0x7E23, + 6441: 0x7E21, + 6442: 0x7E12, + 6443: 0x7E31, + 6444: 0x7E1F, + 6445: 0x7E09, + 6446: 0x7E0B, + 6447: 0x7E22, + 6448: 0x7E46, + 6449: 0x7E66, + 6450: 0x7E3B, + 6451: 0x7E35, + 6452: 0x7E39, + 6453: 0x7E43, + 6454: 0x7E37, + 6455: 0x7E32, + 6456: 0x7E3A, + 6457: 0x7E67, + 6458: 0x7E5D, + 6459: 0x7E56, + 6460: 0x7E5E, + 6461: 0x7E59, + 6462: 0x7E5A, + 6463: 0x7E79, + 6464: 0x7E6A, + 6465: 0x7E69, + 6466: 0x7E7C, + 6467: 0x7E7B, + 6468: 0x7E83, + 6469: 0x7DD5, + 6470: 0x7E7D, + 6471: 0x8FAE, + 6472: 0x7E7F, + 6473: 0x7E88, + 6474: 0x7E89, + 6475: 0x7E8C, + 6476: 0x7E92, + 6477: 0x7E90, + 6478: 0x7E93, + 6479: 0x7E94, + 6480: 0x7E96, + 6481: 0x7E8E, + 6482: 0x7E9B, + 6483: 0x7E9C, + 6484: 0x7F38, + 6485: 0x7F3A, + 6486: 0x7F45, + 6487: 0x7F4C, + 6488: 0x7F4D, + 6489: 0x7F4E, + 6490: 0x7F50, + 6491: 0x7F51, + 6492: 0x7F55, + 6493: 0x7F54, + 6494: 0x7F58, + 6495: 0x7F5F, + 6496: 0x7F60, + 6497: 0x7F68, + 6498: 0x7F69, + 6499: 0x7F67, + 6500: 0x7F78, + 6501: 0x7F82, + 6502: 0x7F86, + 6503: 0x7F83, + 6504: 0x7F88, + 6505: 0x7F87, + 6506: 0x7F8C, + 6507: 0x7F94, + 6508: 0x7F9E, + 6509: 0x7F9D, + 6510: 0x7F9A, + 6511: 0x7FA3, + 6512: 0x7FAF, + 6513: 0x7FB2, + 6514: 0x7FB9, + 6515: 0x7FAE, + 6516: 0x7FB6, + 6517: 0x7FB8, + 6518: 0x8B71, + 6519: 0x7FC5, + 6520: 0x7FC6, + 6521: 0x7FCA, + 6522: 0x7FD5, + 6523: 0x7FD4, + 6524: 0x7FE1, + 6525: 0x7FE6, + 6526: 0x7FE9, + 6527: 0x7FF3, + 6528: 0x7FF9, + 6529: 0x98DC, + 6530: 0x8006, + 6531: 0x8004, + 6532: 0x800B, + 6533: 0x8012, + 6534: 0x8018, + 6535: 0x8019, + 6536: 0x801C, + 6537: 0x8021, + 6538: 0x8028, + 6539: 0x803F, + 6540: 0x803B, + 6541: 0x804A, + 6542: 0x8046, + 6543: 0x8052, + 6544: 0x8058, + 6545: 0x805A, + 6546: 0x805F, + 6547: 0x8062, + 6548: 0x8068, + 6549: 0x8073, + 6550: 0x8072, + 6551: 0x8070, + 6552: 0x8076, + 6553: 0x8079, + 6554: 0x807D, + 6555: 0x807F, + 6556: 0x8084, + 6557: 0x8086, + 6558: 0x8085, + 6559: 0x809B, + 6560: 0x8093, + 6561: 0x809A, + 6562: 0x80AD, + 6563: 0x5190, + 6564: 0x80AC, + 6565: 0x80DB, + 6566: 0x80E5, + 6567: 0x80D9, + 6568: 0x80DD, + 6569: 0x80C4, + 6570: 0x80DA, + 6571: 0x80D6, + 6572: 0x8109, + 6573: 0x80EF, + 6574: 0x80F1, + 6575: 0x811B, + 6576: 0x8129, + 6577: 0x8123, + 6578: 0x812F, + 6579: 0x814B, + 6580: 0x968B, + 6581: 0x8146, + 6582: 0x813E, + 6583: 0x8153, + 6584: 0x8151, + 6585: 0x80FC, + 6586: 0x8171, + 6587: 0x816E, + 6588: 0x8165, + 6589: 0x8166, + 6590: 0x8174, + 6591: 0x8183, + 6592: 0x8188, + 6593: 0x818A, + 6594: 0x8180, + 6595: 0x8182, + 6596: 0x81A0, + 6597: 0x8195, + 6598: 0x81A4, + 6599: 0x81A3, + 6600: 0x815F, + 6601: 0x8193, + 6602: 0x81A9, + 6603: 0x81B0, + 6604: 0x81B5, + 6605: 0x81BE, + 6606: 0x81B8, + 6607: 0x81BD, + 6608: 0x81C0, + 6609: 0x81C2, + 6610: 0x81BA, + 6611: 0x81C9, + 6612: 0x81CD, + 6613: 0x81D1, + 6614: 0x81D9, + 6615: 0x81D8, + 6616: 0x81C8, + 6617: 0x81DA, + 6618: 0x81DF, + 6619: 0x81E0, + 6620: 0x81E7, + 6621: 0x81FA, + 6622: 0x81FB, + 6623: 0x81FE, + 6624: 0x8201, + 6625: 0x8202, + 6626: 0x8205, + 6627: 0x8207, + 6628: 0x820A, + 6629: 0x820D, + 6630: 0x8210, + 6631: 0x8216, + 6632: 0x8229, + 6633: 0x822B, + 6634: 0x8238, + 6635: 0x8233, + 6636: 0x8240, + 6637: 0x8259, + 6638: 0x8258, + 6639: 0x825D, + 6640: 0x825A, + 6641: 0x825F, + 6642: 0x8264, + 6643: 0x8262, + 6644: 0x8268, + 6645: 0x826A, + 6646: 0x826B, + 6647: 0x822E, + 6648: 0x8271, + 6649: 0x8277, + 6650: 0x8278, + 6651: 0x827E, + 6652: 0x828D, + 6653: 0x8292, + 6654: 0x82AB, + 6655: 0x829F, + 6656: 0x82BB, + 6657: 0x82AC, + 6658: 0x82E1, + 6659: 0x82E3, + 6660: 0x82DF, + 6661: 0x82D2, + 6662: 0x82F4, + 6663: 0x82F3, + 6664: 0x82FA, + 6665: 0x8393, + 6666: 0x8303, + 6667: 0x82FB, + 6668: 0x82F9, + 6669: 0x82DE, + 6670: 0x8306, + 6671: 0x82DC, + 6672: 0x8309, + 6673: 0x82D9, + 6674: 0x8335, + 6675: 0x8334, + 6676: 0x8316, + 6677: 0x8332, + 6678: 0x8331, + 6679: 0x8340, + 6680: 0x8339, + 6681: 0x8350, + 6682: 0x8345, + 6683: 0x832F, + 6684: 0x832B, + 6685: 0x8317, + 6686: 0x8318, + 6687: 0x8385, + 6688: 0x839A, + 6689: 0x83AA, + 6690: 0x839F, + 6691: 0x83A2, + 6692: 0x8396, + 6693: 0x8323, + 6694: 0x838E, + 6695: 0x8387, + 6696: 0x838A, + 6697: 0x837C, + 6698: 0x83B5, + 6699: 0x8373, + 6700: 0x8375, + 6701: 0x83A0, + 6702: 0x8389, + 6703: 0x83A8, + 6704: 0x83F4, + 6705: 0x8413, + 6706: 0x83EB, + 6707: 0x83CE, + 6708: 0x83FD, + 6709: 0x8403, + 6710: 0x83D8, + 6711: 0x840B, + 6712: 0x83C1, + 6713: 0x83F7, + 6714: 0x8407, + 6715: 0x83E0, + 6716: 0x83F2, + 6717: 0x840D, + 6718: 0x8422, + 6719: 0x8420, + 6720: 0x83BD, + 6721: 0x8438, + 6722: 0x8506, + 6723: 0x83FB, + 6724: 0x846D, + 6725: 0x842A, + 6726: 0x843C, + 6727: 0x855A, + 6728: 0x8484, + 6729: 0x8477, + 6730: 0x846B, + 6731: 0x84AD, + 6732: 0x846E, + 6733: 0x8482, + 6734: 0x8469, + 6735: 0x8446, + 6736: 0x842C, + 6737: 0x846F, + 6738: 0x8479, + 6739: 0x8435, + 6740: 0x84CA, + 6741: 0x8462, + 6742: 0x84B9, + 6743: 0x84BF, + 6744: 0x849F, + 6745: 0x84D9, + 6746: 0x84CD, + 6747: 0x84BB, + 6748: 0x84DA, + 6749: 0x84D0, + 6750: 0x84C1, + 6751: 0x84C6, + 6752: 0x84D6, + 6753: 0x84A1, + 6754: 0x8521, + 6755: 0x84FF, + 6756: 0x84F4, + 6757: 0x8517, + 6758: 0x8518, + 6759: 0x852C, + 6760: 0x851F, + 6761: 0x8515, + 6762: 0x8514, + 6763: 0x84FC, + 6764: 0x8540, + 6765: 0x8563, + 6766: 0x8558, + 6767: 0x8548, + 6768: 0x8541, + 6769: 0x8602, + 6770: 0x854B, + 6771: 0x8555, + 6772: 0x8580, + 6773: 0x85A4, + 6774: 0x8588, + 6775: 0x8591, + 6776: 0x858A, + 6777: 0x85A8, + 6778: 0x856D, + 6779: 0x8594, + 6780: 0x859B, + 6781: 0x85EA, + 6782: 0x8587, + 6783: 0x859C, + 6784: 0x8577, + 6785: 0x857E, + 6786: 0x8590, + 6787: 0x85C9, + 6788: 0x85BA, + 6789: 0x85CF, + 6790: 0x85B9, + 6791: 0x85D0, + 6792: 0x85D5, + 6793: 0x85DD, + 6794: 0x85E5, + 6795: 0x85DC, + 6796: 0x85F9, + 6797: 0x860A, + 6798: 0x8613, + 6799: 0x860B, + 6800: 0x85FE, + 6801: 0x85FA, + 6802: 0x8606, + 6803: 0x8622, + 6804: 0x861A, + 6805: 0x8630, + 6806: 0x863F, + 6807: 0x864D, + 6808: 0x4E55, + 6809: 0x8654, + 6810: 0x865F, + 6811: 0x8667, + 6812: 0x8671, + 6813: 0x8693, + 6814: 0x86A3, + 6815: 0x86A9, + 6816: 0x86AA, + 6817: 0x868B, + 6818: 0x868C, + 6819: 0x86B6, + 6820: 0x86AF, + 6821: 0x86C4, + 6822: 0x86C6, + 6823: 0x86B0, + 6824: 0x86C9, + 6825: 0x8823, + 6826: 0x86AB, + 6827: 0x86D4, + 6828: 0x86DE, + 6829: 0x86E9, + 6830: 0x86EC, + 6831: 0x86DF, + 6832: 0x86DB, + 6833: 0x86EF, + 6834: 0x8712, + 6835: 0x8706, + 6836: 0x8708, + 6837: 0x8700, + 6838: 0x8703, + 6839: 0x86FB, + 6840: 0x8711, + 6841: 0x8709, + 6842: 0x870D, + 6843: 0x86F9, + 6844: 0x870A, + 6845: 0x8734, + 6846: 0x873F, + 6847: 0x8737, + 6848: 0x873B, + 6849: 0x8725, + 6850: 0x8729, + 6851: 0x871A, + 6852: 0x8760, + 6853: 0x875F, + 6854: 0x8778, + 6855: 0x874C, + 6856: 0x874E, + 6857: 0x8774, + 6858: 0x8757, + 6859: 0x8768, + 6860: 0x876E, + 6861: 0x8759, + 6862: 0x8753, + 6863: 0x8763, + 6864: 0x876A, + 6865: 0x8805, + 6866: 0x87A2, + 6867: 0x879F, + 6868: 0x8782, + 6869: 0x87AF, + 6870: 0x87CB, + 6871: 0x87BD, + 6872: 0x87C0, + 6873: 0x87D0, + 6874: 0x96D6, + 6875: 0x87AB, + 6876: 0x87C4, + 6877: 0x87B3, + 6878: 0x87C7, + 6879: 0x87C6, + 6880: 0x87BB, + 6881: 0x87EF, + 6882: 0x87F2, + 6883: 0x87E0, + 6884: 0x880F, + 6885: 0x880D, + 6886: 0x87FE, + 6887: 0x87F6, + 6888: 0x87F7, + 6889: 0x880E, + 6890: 0x87D2, + 6891: 0x8811, + 6892: 0x8816, + 6893: 0x8815, + 6894: 0x8822, + 6895: 0x8821, + 6896: 0x8831, + 6897: 0x8836, + 6898: 0x8839, + 6899: 0x8827, + 6900: 0x883B, + 6901: 0x8844, + 6902: 0x8842, + 6903: 0x8852, + 6904: 0x8859, + 6905: 0x885E, + 6906: 0x8862, + 6907: 0x886B, + 6908: 0x8881, + 6909: 0x887E, + 6910: 0x889E, + 6911: 0x8875, + 6912: 0x887D, + 6913: 0x88B5, + 6914: 0x8872, + 6915: 0x8882, + 6916: 0x8897, + 6917: 0x8892, + 6918: 0x88AE, + 6919: 0x8899, + 6920: 0x88A2, + 6921: 0x888D, + 6922: 0x88A4, + 6923: 0x88B0, + 6924: 0x88BF, + 6925: 0x88B1, + 6926: 0x88C3, + 6927: 0x88C4, + 6928: 0x88D4, + 6929: 0x88D8, + 6930: 0x88D9, + 6931: 0x88DD, + 6932: 0x88F9, + 6933: 0x8902, + 6934: 0x88FC, + 6935: 0x88F4, + 6936: 0x88E8, + 6937: 0x88F2, + 6938: 0x8904, + 6939: 0x890C, + 6940: 0x890A, + 6941: 0x8913, + 6942: 0x8943, + 6943: 0x891E, + 6944: 0x8925, + 6945: 0x892A, + 6946: 0x892B, + 6947: 0x8941, + 6948: 0x8944, + 6949: 0x893B, + 6950: 0x8936, + 6951: 0x8938, + 6952: 0x894C, + 6953: 0x891D, + 6954: 0x8960, + 6955: 0x895E, + 6956: 0x8966, + 6957: 0x8964, + 6958: 0x896D, + 6959: 0x896A, + 6960: 0x896F, + 6961: 0x8974, + 6962: 0x8977, + 6963: 0x897E, + 6964: 0x8983, + 6965: 0x8988, + 6966: 0x898A, + 6967: 0x8993, + 6968: 0x8998, + 6969: 0x89A1, + 6970: 0x89A9, + 6971: 0x89A6, + 6972: 0x89AC, + 6973: 0x89AF, + 6974: 0x89B2, + 6975: 0x89BA, + 6976: 0x89BD, + 6977: 0x89BF, + 6978: 0x89C0, + 6979: 0x89DA, + 6980: 0x89DC, + 6981: 0x89DD, + 6982: 0x89E7, + 6983: 0x89F4, + 6984: 0x89F8, + 6985: 0x8A03, + 6986: 0x8A16, + 6987: 0x8A10, + 6988: 0x8A0C, + 6989: 0x8A1B, + 6990: 0x8A1D, + 6991: 0x8A25, + 6992: 0x8A36, + 6993: 0x8A41, + 6994: 0x8A5B, + 6995: 0x8A52, + 6996: 0x8A46, + 6997: 0x8A48, + 6998: 0x8A7C, + 6999: 0x8A6D, + 7000: 0x8A6C, + 7001: 0x8A62, + 7002: 0x8A85, + 7003: 0x8A82, + 7004: 0x8A84, + 7005: 0x8AA8, + 7006: 0x8AA1, + 7007: 0x8A91, + 7008: 0x8AA5, + 7009: 0x8AA6, + 7010: 0x8A9A, + 7011: 0x8AA3, + 7012: 0x8AC4, + 7013: 0x8ACD, + 7014: 0x8AC2, + 7015: 0x8ADA, + 7016: 0x8AEB, + 7017: 0x8AF3, + 7018: 0x8AE7, + 7019: 0x8AE4, + 7020: 0x8AF1, + 7021: 0x8B14, + 7022: 0x8AE0, + 7023: 0x8AE2, + 7024: 0x8AF7, + 7025: 0x8ADE, + 7026: 0x8ADB, + 7027: 0x8B0C, + 7028: 0x8B07, + 7029: 0x8B1A, + 7030: 0x8AE1, + 7031: 0x8B16, + 7032: 0x8B10, + 7033: 0x8B17, + 7034: 0x8B20, + 7035: 0x8B33, + 7036: 0x97AB, + 7037: 0x8B26, + 7038: 0x8B2B, + 7039: 0x8B3E, + 7040: 0x8B28, + 7041: 0x8B41, + 7042: 0x8B4C, + 7043: 0x8B4F, + 7044: 0x8B4E, + 7045: 0x8B49, + 7046: 0x8B56, + 7047: 0x8B5B, + 7048: 0x8B5A, + 7049: 0x8B6B, + 7050: 0x8B5F, + 7051: 0x8B6C, + 7052: 0x8B6F, + 7053: 0x8B74, + 7054: 0x8B7D, + 7055: 0x8B80, + 7056: 0x8B8C, + 7057: 0x8B8E, + 7058: 0x8B92, + 7059: 0x8B93, + 7060: 0x8B96, + 7061: 0x8B99, + 7062: 0x8B9A, + 7063: 0x8C3A, + 7064: 0x8C41, + 7065: 0x8C3F, + 7066: 0x8C48, + 7067: 0x8C4C, + 7068: 0x8C4E, + 7069: 0x8C50, + 7070: 0x8C55, + 7071: 0x8C62, + 7072: 0x8C6C, + 7073: 0x8C78, + 7074: 0x8C7A, + 7075: 0x8C82, + 7076: 0x8C89, + 7077: 0x8C85, + 7078: 0x8C8A, + 7079: 0x8C8D, + 7080: 0x8C8E, + 7081: 0x8C94, + 7082: 0x8C7C, + 7083: 0x8C98, + 7084: 0x621D, + 7085: 0x8CAD, + 7086: 0x8CAA, + 7087: 0x8CBD, + 7088: 0x8CB2, + 7089: 0x8CB3, + 7090: 0x8CAE, + 7091: 0x8CB6, + 7092: 0x8CC8, + 7093: 0x8CC1, + 7094: 0x8CE4, + 7095: 0x8CE3, + 7096: 0x8CDA, + 7097: 0x8CFD, + 7098: 0x8CFA, + 7099: 0x8CFB, + 7100: 0x8D04, + 7101: 0x8D05, + 7102: 0x8D0A, + 7103: 0x8D07, + 7104: 0x8D0F, + 7105: 0x8D0D, + 7106: 0x8D10, + 7107: 0x9F4E, + 7108: 0x8D13, + 7109: 0x8CCD, + 7110: 0x8D14, + 7111: 0x8D16, + 7112: 0x8D67, + 7113: 0x8D6D, + 7114: 0x8D71, + 7115: 0x8D73, + 7116: 0x8D81, + 7117: 0x8D99, + 7118: 0x8DC2, + 7119: 0x8DBE, + 7120: 0x8DBA, + 7121: 0x8DCF, + 7122: 0x8DDA, + 7123: 0x8DD6, + 7124: 0x8DCC, + 7125: 0x8DDB, + 7126: 0x8DCB, + 7127: 0x8DEA, + 7128: 0x8DEB, + 7129: 0x8DDF, + 7130: 0x8DE3, + 7131: 0x8DFC, + 7132: 0x8E08, + 7133: 0x8E09, + 7134: 0x8DFF, + 7135: 0x8E1D, + 7136: 0x8E1E, + 7137: 0x8E10, + 7138: 0x8E1F, + 7139: 0x8E42, + 7140: 0x8E35, + 7141: 0x8E30, + 7142: 0x8E34, + 7143: 0x8E4A, + 7144: 0x8E47, + 7145: 0x8E49, + 7146: 0x8E4C, + 7147: 0x8E50, + 7148: 0x8E48, + 7149: 0x8E59, + 7150: 0x8E64, + 7151: 0x8E60, + 7152: 0x8E2A, + 7153: 0x8E63, + 7154: 0x8E55, + 7155: 0x8E76, + 7156: 0x8E72, + 7157: 0x8E7C, + 7158: 0x8E81, + 7159: 0x8E87, + 7160: 0x8E85, + 7161: 0x8E84, + 7162: 0x8E8B, + 7163: 0x8E8A, + 7164: 0x8E93, + 7165: 0x8E91, + 7166: 0x8E94, + 7167: 0x8E99, + 7168: 0x8EAA, + 7169: 0x8EA1, + 7170: 0x8EAC, + 7171: 0x8EB0, + 7172: 0x8EC6, + 7173: 0x8EB1, + 7174: 0x8EBE, + 7175: 0x8EC5, + 7176: 0x8EC8, + 7177: 0x8ECB, + 7178: 0x8EDB, + 7179: 0x8EE3, + 7180: 0x8EFC, + 7181: 0x8EFB, + 7182: 0x8EEB, + 7183: 0x8EFE, + 7184: 0x8F0A, + 7185: 0x8F05, + 7186: 0x8F15, + 7187: 0x8F12, + 7188: 0x8F19, + 7189: 0x8F13, + 7190: 0x8F1C, + 7191: 0x8F1F, + 7192: 0x8F1B, + 7193: 0x8F0C, + 7194: 0x8F26, + 7195: 0x8F33, + 7196: 0x8F3B, + 7197: 0x8F39, + 7198: 0x8F45, + 7199: 0x8F42, + 7200: 0x8F3E, + 7201: 0x8F4C, + 7202: 0x8F49, + 7203: 0x8F46, + 7204: 0x8F4E, + 7205: 0x8F57, + 7206: 0x8F5C, + 7207: 0x8F62, + 7208: 0x8F63, + 7209: 0x8F64, + 7210: 0x8F9C, + 7211: 0x8F9F, + 7212: 0x8FA3, + 7213: 0x8FAD, + 7214: 0x8FAF, + 7215: 0x8FB7, + 7216: 0x8FDA, + 7217: 0x8FE5, + 7218: 0x8FE2, + 7219: 0x8FEA, + 7220: 0x8FEF, + 7221: 0x9087, + 7222: 0x8FF4, + 7223: 0x9005, + 7224: 0x8FF9, + 7225: 0x8FFA, + 7226: 0x9011, + 7227: 0x9015, + 7228: 0x9021, + 7229: 0x900D, + 7230: 0x901E, + 7231: 0x9016, + 7232: 0x900B, + 7233: 0x9027, + 7234: 0x9036, + 7235: 0x9035, + 7236: 0x9039, + 7237: 0x8FF8, + 7238: 0x904F, + 7239: 0x9050, + 7240: 0x9051, + 7241: 0x9052, + 7242: 0x900E, + 7243: 0x9049, + 7244: 0x903E, + 7245: 0x9056, + 7246: 0x9058, + 7247: 0x905E, + 7248: 0x9068, + 7249: 0x906F, + 7250: 0x9076, + 7251: 0x96A8, + 7252: 0x9072, + 7253: 0x9082, + 7254: 0x907D, + 7255: 0x9081, + 7256: 0x9080, + 7257: 0x908A, + 7258: 0x9089, + 7259: 0x908F, + 7260: 0x90A8, + 7261: 0x90AF, + 7262: 0x90B1, + 7263: 0x90B5, + 7264: 0x90E2, + 7265: 0x90E4, + 7266: 0x6248, + 7267: 0x90DB, + 7268: 0x9102, + 7269: 0x9112, + 7270: 0x9119, + 7271: 0x9132, + 7272: 0x9130, + 7273: 0x914A, + 7274: 0x9156, + 7275: 0x9158, + 7276: 0x9163, + 7277: 0x9165, + 7278: 0x9169, + 7279: 0x9173, + 7280: 0x9172, + 7281: 0x918B, + 7282: 0x9189, + 7283: 0x9182, + 7284: 0x91A2, + 7285: 0x91AB, + 7286: 0x91AF, + 7287: 0x91AA, + 7288: 0x91B5, + 7289: 0x91B4, + 7290: 0x91BA, + 7291: 0x91C0, + 7292: 0x91C1, + 7293: 0x91C9, + 7294: 0x91CB, + 7295: 0x91D0, + 7296: 0x91D6, + 7297: 0x91DF, + 7298: 0x91E1, + 7299: 0x91DB, + 7300: 0x91FC, + 7301: 0x91F5, + 7302: 0x91F6, + 7303: 0x921E, + 7304: 0x91FF, + 7305: 0x9214, + 7306: 0x922C, + 7307: 0x9215, + 7308: 0x9211, + 7309: 0x925E, + 7310: 0x9257, + 7311: 0x9245, + 7312: 0x9249, + 7313: 0x9264, + 7314: 0x9248, + 7315: 0x9295, + 7316: 0x923F, + 7317: 0x924B, + 7318: 0x9250, + 7319: 0x929C, + 7320: 0x9296, + 7321: 0x9293, + 7322: 0x929B, + 7323: 0x925A, + 7324: 0x92CF, + 7325: 0x92B9, + 7326: 0x92B7, + 7327: 0x92E9, + 7328: 0x930F, + 7329: 0x92FA, + 7330: 0x9344, + 7331: 0x932E, + 7332: 0x9319, + 7333: 0x9322, + 7334: 0x931A, + 7335: 0x9323, + 7336: 0x933A, + 7337: 0x9335, + 7338: 0x933B, + 7339: 0x935C, + 7340: 0x9360, + 7341: 0x937C, + 7342: 0x936E, + 7343: 0x9356, + 7344: 0x93B0, + 7345: 0x93AC, + 7346: 0x93AD, + 7347: 0x9394, + 7348: 0x93B9, + 7349: 0x93D6, + 7350: 0x93D7, + 7351: 0x93E8, + 7352: 0x93E5, + 7353: 0x93D8, + 7354: 0x93C3, + 7355: 0x93DD, + 7356: 0x93D0, + 7357: 0x93C8, + 7358: 0x93E4, + 7359: 0x941A, + 7360: 0x9414, + 7361: 0x9413, + 7362: 0x9403, + 7363: 0x9407, + 7364: 0x9410, + 7365: 0x9436, + 7366: 0x942B, + 7367: 0x9435, + 7368: 0x9421, + 7369: 0x943A, + 7370: 0x9441, + 7371: 0x9452, + 7372: 0x9444, + 7373: 0x945B, + 7374: 0x9460, + 7375: 0x9462, + 7376: 0x945E, + 7377: 0x946A, + 7378: 0x9229, + 7379: 0x9470, + 7380: 0x9475, + 7381: 0x9477, + 7382: 0x947D, + 7383: 0x945A, + 7384: 0x947C, + 7385: 0x947E, + 7386: 0x9481, + 7387: 0x947F, + 7388: 0x9582, + 7389: 0x9587, + 7390: 0x958A, + 7391: 0x9594, + 7392: 0x9596, + 7393: 0x9598, + 7394: 0x9599, + 7395: 0x95A0, + 7396: 0x95A8, + 7397: 0x95A7, + 7398: 0x95AD, + 7399: 0x95BC, + 7400: 0x95BB, + 7401: 0x95B9, + 7402: 0x95BE, + 7403: 0x95CA, + 7404: 0x6FF6, + 7405: 0x95C3, + 7406: 0x95CD, + 7407: 0x95CC, + 7408: 0x95D5, + 7409: 0x95D4, + 7410: 0x95D6, + 7411: 0x95DC, + 7412: 0x95E1, + 7413: 0x95E5, + 7414: 0x95E2, + 7415: 0x9621, + 7416: 0x9628, + 7417: 0x962E, + 7418: 0x962F, + 7419: 0x9642, + 7420: 0x964C, + 7421: 0x964F, + 7422: 0x964B, + 7423: 0x9677, + 7424: 0x965C, + 7425: 0x965E, + 7426: 0x965D, + 7427: 0x965F, + 7428: 0x9666, + 7429: 0x9672, + 7430: 0x966C, + 7431: 0x968D, + 7432: 0x9698, + 7433: 0x9695, + 7434: 0x9697, + 7435: 0x96AA, + 7436: 0x96A7, + 7437: 0x96B1, + 7438: 0x96B2, + 7439: 0x96B0, + 7440: 0x96B4, + 7441: 0x96B6, + 7442: 0x96B8, + 7443: 0x96B9, + 7444: 0x96CE, + 7445: 0x96CB, + 7446: 0x96C9, + 7447: 0x96CD, + 7448: 0x894D, + 7449: 0x96DC, + 7450: 0x970D, + 7451: 0x96D5, + 7452: 0x96F9, + 7453: 0x9704, + 7454: 0x9706, + 7455: 0x9708, + 7456: 0x9713, + 7457: 0x970E, + 7458: 0x9711, + 7459: 0x970F, + 7460: 0x9716, + 7461: 0x9719, + 7462: 0x9724, + 7463: 0x972A, + 7464: 0x9730, + 7465: 0x9739, + 7466: 0x973D, + 7467: 0x973E, + 7468: 0x9744, + 7469: 0x9746, + 7470: 0x9748, + 7471: 0x9742, + 7472: 0x9749, + 7473: 0x975C, + 7474: 0x9760, + 7475: 0x9764, + 7476: 0x9766, + 7477: 0x9768, + 7478: 0x52D2, + 7479: 0x976B, + 7480: 0x9771, + 7481: 0x9779, + 7482: 0x9785, + 7483: 0x977C, + 7484: 0x9781, + 7485: 0x977A, + 7486: 0x9786, + 7487: 0x978B, + 7488: 0x978F, + 7489: 0x9790, + 7490: 0x979C, + 7491: 0x97A8, + 7492: 0x97A6, + 7493: 0x97A3, + 7494: 0x97B3, + 7495: 0x97B4, + 7496: 0x97C3, + 7497: 0x97C6, + 7498: 0x97C8, + 7499: 0x97CB, + 7500: 0x97DC, + 7501: 0x97ED, + 7502: 0x9F4F, + 7503: 0x97F2, + 7504: 0x7ADF, + 7505: 0x97F6, + 7506: 0x97F5, + 7507: 0x980F, + 7508: 0x980C, + 7509: 0x9838, + 7510: 0x9824, + 7511: 0x9821, + 7512: 0x9837, + 7513: 0x983D, + 7514: 0x9846, + 7515: 0x984F, + 7516: 0x984B, + 7517: 0x986B, + 7518: 0x986F, + 7519: 0x9870, + 7520: 0x9871, + 7521: 0x9874, + 7522: 0x9873, + 7523: 0x98AA, + 7524: 0x98AF, + 7525: 0x98B1, + 7526: 0x98B6, + 7527: 0x98C4, + 7528: 0x98C3, + 7529: 0x98C6, + 7530: 0x98E9, + 7531: 0x98EB, + 7532: 0x9903, + 7533: 0x9909, + 7534: 0x9912, + 7535: 0x9914, + 7536: 0x9918, + 7537: 0x9921, + 7538: 0x991D, + 7539: 0x991E, + 7540: 0x9924, + 7541: 0x9920, + 7542: 0x992C, + 7543: 0x992E, + 7544: 0x993D, + 7545: 0x993E, + 7546: 0x9942, + 7547: 0x9949, + 7548: 0x9945, + 7549: 0x9950, + 7550: 0x994B, + 7551: 0x9951, + 7552: 0x9952, + 7553: 0x994C, + 7554: 0x9955, + 7555: 0x9997, + 7556: 0x9998, + 7557: 0x99A5, + 7558: 0x99AD, + 7559: 0x99AE, + 7560: 0x99BC, + 7561: 0x99DF, + 7562: 0x99DB, + 7563: 0x99DD, + 7564: 0x99D8, + 7565: 0x99D1, + 7566: 0x99ED, + 7567: 0x99EE, + 7568: 0x99F1, + 7569: 0x99F2, + 7570: 0x99FB, + 7571: 0x99F8, + 7572: 0x9A01, + 7573: 0x9A0F, + 7574: 0x9A05, + 7575: 0x99E2, + 7576: 0x9A19, + 7577: 0x9A2B, + 7578: 0x9A37, + 7579: 0x9A45, + 7580: 0x9A42, + 7581: 0x9A40, + 7582: 0x9A43, + 7583: 0x9A3E, + 7584: 0x9A55, + 7585: 0x9A4D, + 7586: 0x9A5B, + 7587: 0x9A57, + 7588: 0x9A5F, + 7589: 0x9A62, + 7590: 0x9A65, + 7591: 0x9A64, + 7592: 0x9A69, + 7593: 0x9A6B, + 7594: 0x9A6A, + 7595: 0x9AAD, + 7596: 0x9AB0, + 7597: 0x9ABC, + 7598: 0x9AC0, + 7599: 0x9ACF, + 7600: 0x9AD1, + 7601: 0x9AD3, + 7602: 0x9AD4, + 7603: 0x9ADE, + 7604: 0x9ADF, + 7605: 0x9AE2, + 7606: 0x9AE3, + 7607: 0x9AE6, + 7608: 0x9AEF, + 7609: 0x9AEB, + 7610: 0x9AEE, + 7611: 0x9AF4, + 7612: 0x9AF1, + 7613: 0x9AF7, + 7614: 0x9AFB, + 7615: 0x9B06, + 7616: 0x9B18, + 7617: 0x9B1A, + 7618: 0x9B1F, + 7619: 0x9B22, + 7620: 0x9B23, + 7621: 0x9B25, + 7622: 0x9B27, + 7623: 0x9B28, + 7624: 0x9B29, + 7625: 0x9B2A, + 7626: 0x9B2E, + 7627: 0x9B2F, + 7628: 0x9B32, + 7629: 0x9B44, + 7630: 0x9B43, + 7631: 0x9B4F, + 7632: 0x9B4D, + 7633: 0x9B4E, + 7634: 0x9B51, + 7635: 0x9B58, + 7636: 0x9B74, + 7637: 0x9B93, + 7638: 0x9B83, + 7639: 0x9B91, + 7640: 0x9B96, + 7641: 0x9B97, + 7642: 0x9B9F, + 7643: 0x9BA0, + 7644: 0x9BA8, + 7645: 0x9BB4, + 7646: 0x9BC0, + 7647: 0x9BCA, + 7648: 0x9BB9, + 7649: 0x9BC6, + 7650: 0x9BCF, + 7651: 0x9BD1, + 7652: 0x9BD2, + 7653: 0x9BE3, + 7654: 0x9BE2, + 7655: 0x9BE4, + 7656: 0x9BD4, + 7657: 0x9BE1, + 7658: 0x9C3A, + 7659: 0x9BF2, + 7660: 0x9BF1, + 7661: 0x9BF0, + 7662: 0x9C15, + 7663: 0x9C14, + 7664: 0x9C09, + 7665: 0x9C13, + 7666: 0x9C0C, + 7667: 0x9C06, + 7668: 0x9C08, + 7669: 0x9C12, + 7670: 0x9C0A, + 7671: 0x9C04, + 7672: 0x9C2E, + 7673: 0x9C1B, + 7674: 0x9C25, + 7675: 0x9C24, + 7676: 0x9C21, + 7677: 0x9C30, + 7678: 0x9C47, + 7679: 0x9C32, + 7680: 0x9C46, + 7681: 0x9C3E, + 7682: 0x9C5A, + 7683: 0x9C60, + 7684: 0x9C67, + 7685: 0x9C76, + 7686: 0x9C78, + 7687: 0x9CE7, + 7688: 0x9CEC, + 7689: 0x9CF0, + 7690: 0x9D09, + 7691: 0x9D08, + 7692: 0x9CEB, + 7693: 0x9D03, + 7694: 0x9D06, + 7695: 0x9D2A, + 7696: 0x9D26, + 7697: 0x9DAF, + 7698: 0x9D23, + 7699: 0x9D1F, + 7700: 0x9D44, + 7701: 0x9D15, + 7702: 0x9D12, + 7703: 0x9D41, + 7704: 0x9D3F, + 7705: 0x9D3E, + 7706: 0x9D46, + 7707: 0x9D48, + 7708: 0x9D5D, + 7709: 0x9D5E, + 7710: 0x9D64, + 7711: 0x9D51, + 7712: 0x9D50, + 7713: 0x9D59, + 7714: 0x9D72, + 7715: 0x9D89, + 7716: 0x9D87, + 7717: 0x9DAB, + 7718: 0x9D6F, + 7719: 0x9D7A, + 7720: 0x9D9A, + 7721: 0x9DA4, + 7722: 0x9DA9, + 7723: 0x9DB2, + 7724: 0x9DC4, + 7725: 0x9DC1, + 7726: 0x9DBB, + 7727: 0x9DB8, + 7728: 0x9DBA, + 7729: 0x9DC6, + 7730: 0x9DCF, + 7731: 0x9DC2, + 7732: 0x9DD9, + 7733: 0x9DD3, + 7734: 0x9DF8, + 7735: 0x9DE6, + 7736: 0x9DED, + 7737: 0x9DEF, + 7738: 0x9DFD, + 7739: 0x9E1A, + 7740: 0x9E1B, + 7741: 0x9E1E, + 7742: 0x9E75, + 7743: 0x9E79, + 7744: 0x9E7D, + 7745: 0x9E81, + 7746: 0x9E88, + 7747: 0x9E8B, + 7748: 0x9E8C, + 7749: 0x9E92, + 7750: 0x9E95, + 7751: 0x9E91, + 7752: 0x9E9D, + 7753: 0x9EA5, + 7754: 0x9EA9, + 7755: 0x9EB8, + 7756: 0x9EAA, + 7757: 0x9EAD, + 7758: 0x9761, + 7759: 0x9ECC, + 7760: 0x9ECE, + 7761: 0x9ECF, + 7762: 0x9ED0, + 7763: 0x9ED4, + 7764: 0x9EDC, + 7765: 0x9EDE, + 7766: 0x9EDD, + 7767: 0x9EE0, + 7768: 0x9EE5, + 7769: 0x9EE8, + 7770: 0x9EEF, + 7771: 0x9EF4, + 7772: 0x9EF6, + 7773: 0x9EF7, + 7774: 0x9EF9, + 7775: 0x9EFB, + 7776: 0x9EFC, + 7777: 0x9EFD, + 7778: 0x9F07, + 7779: 0x9F08, + 7780: 0x76B7, + 7781: 0x9F15, + 7782: 0x9F21, + 7783: 0x9F2C, + 7784: 0x9F3E, + 7785: 0x9F4A, + 7786: 0x9F52, + 7787: 0x9F54, + 7788: 0x9F63, + 7789: 0x9F5F, + 7790: 0x9F60, + 7791: 0x9F61, + 7792: 0x9F66, + 7793: 0x9F67, + 7794: 0x9F6C, + 7795: 0x9F6A, + 7796: 0x9F77, + 7797: 0x9F72, + 7798: 0x9F76, + 7799: 0x9F95, + 7800: 0x9F9C, + 7801: 0x9FA0, + 7802: 0x582F, + 7803: 0x69C7, + 7804: 0x9059, + 7805: 0x7464, + 7806: 0x51DC, + 7807: 0x7199, + 8272: 0x7E8A, + 8273: 0x891C, + 8274: 0x9348, + 8275: 0x9288, + 8276: 0x84DC, + 8277: 0x4FC9, + 8278: 0x70BB, + 8279: 0x6631, + 8280: 0x68C8, + 8281: 0x92F9, + 8282: 0x66FB, + 8283: 0x5F45, + 8284: 0x4E28, + 8285: 0x4EE1, + 8286: 0x4EFC, + 8287: 0x4F00, + 8288: 0x4F03, + 8289: 0x4F39, + 8290: 0x4F56, + 8291: 0x4F92, + 8292: 0x4F8A, + 8293: 0x4F9A, + 8294: 0x4F94, + 8295: 0x4FCD, + 8296: 0x5040, + 8297: 0x5022, + 8298: 0x4FFF, + 8299: 0x501E, + 8300: 0x5046, + 8301: 0x5070, + 8302: 0x5042, + 8303: 0x5094, + 8304: 0x50F4, + 8305: 0x50D8, + 8306: 0x514A, + 8307: 0x5164, + 8308: 0x519D, + 8309: 0x51BE, + 8310: 0x51EC, + 8311: 0x5215, + 8312: 0x529C, + 8313: 0x52A6, + 8314: 0x52C0, + 8315: 0x52DB, + 8316: 0x5300, + 8317: 0x5307, + 8318: 0x5324, + 8319: 0x5372, + 8320: 0x5393, + 8321: 0x53B2, + 8322: 0x53DD, + 8323: 0xFA0E, + 8324: 0x549C, + 8325: 0x548A, + 8326: 0x54A9, + 8327: 0x54FF, + 8328: 0x5586, + 8329: 0x5759, + 8330: 0x5765, + 8331: 0x57AC, + 8332: 0x57C8, + 8333: 0x57C7, + 8334: 0xFA0F, + 8335: 0xFA10, + 8336: 0x589E, + 8337: 0x58B2, + 8338: 0x590B, + 8339: 0x5953, + 8340: 0x595B, + 8341: 0x595D, + 8342: 0x5963, + 8343: 0x59A4, + 8344: 0x59BA, + 8345: 0x5B56, + 8346: 0x5BC0, + 8347: 0x752F, + 8348: 0x5BD8, + 8349: 0x5BEC, + 8350: 0x5C1E, + 8351: 0x5CA6, + 8352: 0x5CBA, + 8353: 0x5CF5, + 8354: 0x5D27, + 8355: 0x5D53, + 8356: 0xFA11, + 8357: 0x5D42, + 8358: 0x5D6D, + 8359: 0x5DB8, + 8360: 0x5DB9, + 8361: 0x5DD0, + 8362: 0x5F21, + 8363: 0x5F34, + 8364: 0x5F67, + 8365: 0x5FB7, + 8366: 0x5FDE, + 8367: 0x605D, + 8368: 0x6085, + 8369: 0x608A, + 8370: 0x60DE, + 8371: 0x60D5, + 8372: 0x6120, + 8373: 0x60F2, + 8374: 0x6111, + 8375: 0x6137, + 8376: 0x6130, + 8377: 0x6198, + 8378: 0x6213, + 8379: 0x62A6, + 8380: 0x63F5, + 8381: 0x6460, + 8382: 0x649D, + 8383: 0x64CE, + 8384: 0x654E, + 8385: 0x6600, + 8386: 0x6615, + 8387: 0x663B, + 8388: 0x6609, + 8389: 0x662E, + 8390: 0x661E, + 8391: 0x6624, + 8392: 0x6665, + 8393: 0x6657, + 8394: 0x6659, + 8395: 0xFA12, + 8396: 0x6673, + 8397: 0x6699, + 8398: 0x66A0, + 8399: 0x66B2, + 8400: 0x66BF, + 8401: 0x66FA, + 8402: 0x670E, + 8403: 0xF929, + 8404: 0x6766, + 8405: 0x67BB, + 8406: 0x6852, + 8407: 0x67C0, + 8408: 0x6801, + 8409: 0x6844, + 8410: 0x68CF, + 8411: 0xFA13, + 8412: 0x6968, + 8413: 0xFA14, + 8414: 0x6998, + 8415: 0x69E2, + 8416: 0x6A30, + 8417: 0x6A6B, + 8418: 0x6A46, + 8419: 0x6A73, + 8420: 0x6A7E, + 8421: 0x6AE2, + 8422: 0x6AE4, + 8423: 0x6BD6, + 8424: 0x6C3F, + 8425: 0x6C5C, + 8426: 0x6C86, + 8427: 0x6C6F, + 8428: 0x6CDA, + 8429: 0x6D04, + 8430: 0x6D87, + 8431: 0x6D6F, + 8432: 0x6D96, + 8433: 0x6DAC, + 8434: 0x6DCF, + 8435: 0x6DF8, + 8436: 0x6DF2, + 8437: 0x6DFC, + 8438: 0x6E39, + 8439: 0x6E5C, + 8440: 0x6E27, + 8441: 0x6E3C, + 8442: 0x6EBF, + 8443: 0x6F88, + 8444: 0x6FB5, + 8445: 0x6FF5, + 8446: 0x7005, + 8447: 0x7007, + 8448: 0x7028, + 8449: 0x7085, + 8450: 0x70AB, + 8451: 0x710F, + 8452: 0x7104, + 8453: 0x715C, + 8454: 0x7146, + 8455: 0x7147, + 8456: 0xFA15, + 8457: 0x71C1, + 8458: 0x71FE, + 8459: 0x72B1, + 8460: 0x72BE, + 8461: 0x7324, + 8462: 0xFA16, + 8463: 0x7377, + 8464: 0x73BD, + 8465: 0x73C9, + 8466: 0x73D6, + 8467: 0x73E3, + 8468: 0x73D2, + 8469: 0x7407, + 8470: 0x73F5, + 8471: 0x7426, + 8472: 0x742A, + 8473: 0x7429, + 8474: 0x742E, + 8475: 0x7462, + 8476: 0x7489, + 8477: 0x749F, + 8478: 0x7501, + 8479: 0x756F, + 8480: 0x7682, + 8481: 0x769C, + 8482: 0x769E, + 8483: 0x769B, + 8484: 0x76A6, + 8485: 0xFA17, + 8486: 0x7746, + 8487: 0x52AF, + 8488: 0x7821, + 8489: 0x784E, + 8490: 0x7864, + 8491: 0x787A, + 8492: 0x7930, + 8493: 0xFA18, + 8494: 0xFA19, + 8495: 0xFA1A, + 8496: 0x7994, + 8497: 0xFA1B, + 8498: 0x799B, + 8499: 0x7AD1, + 8500: 0x7AE7, + 8501: 0xFA1C, + 8502: 0x7AEB, + 8503: 0x7B9E, + 8504: 0xFA1D, + 8505: 0x7D48, + 8506: 0x7D5C, + 8507: 0x7DB7, + 8508: 0x7DA0, + 8509: 0x7DD6, + 8510: 0x7E52, + 8511: 0x7F47, + 8512: 0x7FA1, + 8513: 0xFA1E, + 8514: 0x8301, + 8515: 0x8362, + 8516: 0x837F, + 8517: 0x83C7, + 8518: 0x83F6, + 8519: 0x8448, + 8520: 0x84B4, + 8521: 0x8553, + 8522: 0x8559, + 8523: 0x856B, + 8524: 0xFA1F, + 8525: 0x85B0, + 8526: 0xFA20, + 8527: 0xFA21, + 8528: 0x8807, + 8529: 0x88F5, + 8530: 0x8A12, + 8531: 0x8A37, + 8532: 0x8A79, + 8533: 0x8AA7, + 8534: 0x8ABE, + 8535: 0x8ADF, + 8536: 0xFA22, + 8537: 0x8AF6, + 8538: 0x8B53, + 8539: 0x8B7F, + 8540: 0x8CF0, + 8541: 0x8CF4, + 8542: 0x8D12, + 8543: 0x8D76, + 8544: 0xFA23, + 8545: 0x8ECF, + 8546: 0xFA24, + 8547: 0xFA25, + 8548: 0x9067, + 8549: 0x90DE, + 8550: 0xFA26, + 8551: 0x9115, + 8552: 0x9127, + 8553: 0x91DA, + 8554: 0x91D7, + 8555: 0x91DE, + 8556: 0x91ED, + 8557: 0x91EE, + 8558: 0x91E4, + 8559: 0x91E5, + 8560: 0x9206, + 8561: 0x9210, + 8562: 0x920A, + 8563: 0x923A, + 8564: 0x9240, + 8565: 0x923C, + 8566: 0x924E, + 8567: 0x9259, + 8568: 0x9251, + 8569: 0x9239, + 8570: 0x9267, + 8571: 0x92A7, + 8572: 0x9277, + 8573: 0x9278, + 8574: 0x92E7, + 8575: 0x92D7, + 8576: 0x92D9, + 8577: 0x92D0, + 8578: 0xFA27, + 8579: 0x92D5, + 8580: 0x92E0, + 8581: 0x92D3, + 8582: 0x9325, + 8583: 0x9321, + 8584: 0x92FB, + 8585: 0xFA28, + 8586: 0x931E, + 8587: 0x92FF, + 8588: 0x931D, + 8589: 0x9302, + 8590: 0x9370, + 8591: 0x9357, + 8592: 0x93A4, + 8593: 0x93C6, + 8594: 0x93DE, + 8595: 0x93F8, + 8596: 0x9431, + 8597: 0x9445, + 8598: 0x9448, + 8599: 0x9592, + 8600: 0xF9DC, + 8601: 0xFA29, + 8602: 0x969D, + 8603: 0x96AF, + 8604: 0x9733, + 8605: 0x973B, + 8606: 0x9743, + 8607: 0x974D, + 8608: 0x974F, + 8609: 0x9751, + 8610: 0x9755, + 8611: 0x9857, + 8612: 0x9865, + 8613: 0xFA2A, + 8614: 0xFA2B, + 8615: 0x9927, + 8616: 0xFA2C, + 8617: 0x999E, + 8618: 0x9A4E, + 8619: 0x9AD9, + 8620: 0x9ADC, + 8621: 0x9B75, + 8622: 0x9B72, + 8623: 0x9B8F, + 8624: 0x9BB1, + 8625: 0x9BBB, + 8626: 0x9C00, + 8627: 0x9D70, + 8628: 0x9D6B, + 8629: 0xFA2D, + 8630: 0x9E19, + 8631: 0x9ED1, + 8634: 0x2170, + 8635: 0x2171, + 8636: 0x2172, + 8637: 0x2173, + 8638: 0x2174, + 8639: 0x2175, + 8640: 0x2176, + 8641: 0x2177, + 8642: 0x2178, + 8643: 0x2179, + 8644: 0xFFE2, + 8645: 0xFFE4, + 8646: 0xFF07, + 8647: 0xFF02, + 10716: 0x2170, + 10717: 0x2171, + 10718: 0x2172, + 10719: 0x2173, + 10720: 0x2174, + 10721: 0x2175, + 10722: 0x2176, + 10723: 0x2177, + 10724: 0x2178, + 10725: 0x2179, + 10726: 0x2160, + 10727: 0x2161, + 10728: 0x2162, + 10729: 0x2163, + 10730: 0x2164, + 10731: 0x2165, + 10732: 0x2166, + 10733: 0x2167, + 10734: 0x2168, + 10735: 0x2169, + 10736: 0xFFE2, + 10737: 0xFFE4, + 10738: 0xFF07, + 10739: 0xFF02, + 10740: 0x3231, + 10741: 0x2116, + 10742: 0x2121, + 10743: 0x2235, + 10744: 0x7E8A, + 10745: 0x891C, + 10746: 0x9348, + 10747: 0x9288, + 10748: 0x84DC, + 10749: 0x4FC9, + 10750: 0x70BB, + 10751: 0x6631, + 10752: 0x68C8, + 10753: 0x92F9, + 10754: 0x66FB, + 10755: 0x5F45, + 10756: 0x4E28, + 10757: 0x4EE1, + 10758: 0x4EFC, + 10759: 0x4F00, + 10760: 0x4F03, + 10761: 0x4F39, + 10762: 0x4F56, + 10763: 0x4F92, + 10764: 0x4F8A, + 10765: 0x4F9A, + 10766: 0x4F94, + 10767: 0x4FCD, + 10768: 0x5040, + 10769: 0x5022, + 10770: 0x4FFF, + 10771: 0x501E, + 10772: 0x5046, + 10773: 0x5070, + 10774: 0x5042, + 10775: 0x5094, + 10776: 0x50F4, + 10777: 0x50D8, + 10778: 0x514A, + 10779: 0x5164, + 10780: 0x519D, + 10781: 0x51BE, + 10782: 0x51EC, + 10783: 0x5215, + 10784: 0x529C, + 10785: 0x52A6, + 10786: 0x52C0, + 10787: 0x52DB, + 10788: 0x5300, + 10789: 0x5307, + 10790: 0x5324, + 10791: 0x5372, + 10792: 0x5393, + 10793: 0x53B2, + 10794: 0x53DD, + 10795: 0xFA0E, + 10796: 0x549C, + 10797: 0x548A, + 10798: 0x54A9, + 10799: 0x54FF, + 10800: 0x5586, + 10801: 0x5759, + 10802: 0x5765, + 10803: 0x57AC, + 10804: 0x57C8, + 10805: 0x57C7, + 10806: 0xFA0F, + 10807: 0xFA10, + 10808: 0x589E, + 10809: 0x58B2, + 10810: 0x590B, + 10811: 0x5953, + 10812: 0x595B, + 10813: 0x595D, + 10814: 0x5963, + 10815: 0x59A4, + 10816: 0x59BA, + 10817: 0x5B56, + 10818: 0x5BC0, + 10819: 0x752F, + 10820: 0x5BD8, + 10821: 0x5BEC, + 10822: 0x5C1E, + 10823: 0x5CA6, + 10824: 0x5CBA, + 10825: 0x5CF5, + 10826: 0x5D27, + 10827: 0x5D53, + 10828: 0xFA11, + 10829: 0x5D42, + 10830: 0x5D6D, + 10831: 0x5DB8, + 10832: 0x5DB9, + 10833: 0x5DD0, + 10834: 0x5F21, + 10835: 0x5F34, + 10836: 0x5F67, + 10837: 0x5FB7, + 10838: 0x5FDE, + 10839: 0x605D, + 10840: 0x6085, + 10841: 0x608A, + 10842: 0x60DE, + 10843: 0x60D5, + 10844: 0x6120, + 10845: 0x60F2, + 10846: 0x6111, + 10847: 0x6137, + 10848: 0x6130, + 10849: 0x6198, + 10850: 0x6213, + 10851: 0x62A6, + 10852: 0x63F5, + 10853: 0x6460, + 10854: 0x649D, + 10855: 0x64CE, + 10856: 0x654E, + 10857: 0x6600, + 10858: 0x6615, + 10859: 0x663B, + 10860: 0x6609, + 10861: 0x662E, + 10862: 0x661E, + 10863: 0x6624, + 10864: 0x6665, + 10865: 0x6657, + 10866: 0x6659, + 10867: 0xFA12, + 10868: 0x6673, + 10869: 0x6699, + 10870: 0x66A0, + 10871: 0x66B2, + 10872: 0x66BF, + 10873: 0x66FA, + 10874: 0x670E, + 10875: 0xF929, + 10876: 0x6766, + 10877: 0x67BB, + 10878: 0x6852, + 10879: 0x67C0, + 10880: 0x6801, + 10881: 0x6844, + 10882: 0x68CF, + 10883: 0xFA13, + 10884: 0x6968, + 10885: 0xFA14, + 10886: 0x6998, + 10887: 0x69E2, + 10888: 0x6A30, + 10889: 0x6A6B, + 10890: 0x6A46, + 10891: 0x6A73, + 10892: 0x6A7E, + 10893: 0x6AE2, + 10894: 0x6AE4, + 10895: 0x6BD6, + 10896: 0x6C3F, + 10897: 0x6C5C, + 10898: 0x6C86, + 10899: 0x6C6F, + 10900: 0x6CDA, + 10901: 0x6D04, + 10902: 0x6D87, + 10903: 0x6D6F, + 10904: 0x6D96, + 10905: 0x6DAC, + 10906: 0x6DCF, + 10907: 0x6DF8, + 10908: 0x6DF2, + 10909: 0x6DFC, + 10910: 0x6E39, + 10911: 0x6E5C, + 10912: 0x6E27, + 10913: 0x6E3C, + 10914: 0x6EBF, + 10915: 0x6F88, + 10916: 0x6FB5, + 10917: 0x6FF5, + 10918: 0x7005, + 10919: 0x7007, + 10920: 0x7028, + 10921: 0x7085, + 10922: 0x70AB, + 10923: 0x710F, + 10924: 0x7104, + 10925: 0x715C, + 10926: 0x7146, + 10927: 0x7147, + 10928: 0xFA15, + 10929: 0x71C1, + 10930: 0x71FE, + 10931: 0x72B1, + 10932: 0x72BE, + 10933: 0x7324, + 10934: 0xFA16, + 10935: 0x7377, + 10936: 0x73BD, + 10937: 0x73C9, + 10938: 0x73D6, + 10939: 0x73E3, + 10940: 0x73D2, + 10941: 0x7407, + 10942: 0x73F5, + 10943: 0x7426, + 10944: 0x742A, + 10945: 0x7429, + 10946: 0x742E, + 10947: 0x7462, + 10948: 0x7489, + 10949: 0x749F, + 10950: 0x7501, + 10951: 0x756F, + 10952: 0x7682, + 10953: 0x769C, + 10954: 0x769E, + 10955: 0x769B, + 10956: 0x76A6, + 10957: 0xFA17, + 10958: 0x7746, + 10959: 0x52AF, + 10960: 0x7821, + 10961: 0x784E, + 10962: 0x7864, + 10963: 0x787A, + 10964: 0x7930, + 10965: 0xFA18, + 10966: 0xFA19, + 10967: 0xFA1A, + 10968: 0x7994, + 10969: 0xFA1B, + 10970: 0x799B, + 10971: 0x7AD1, + 10972: 0x7AE7, + 10973: 0xFA1C, + 10974: 0x7AEB, + 10975: 0x7B9E, + 10976: 0xFA1D, + 10977: 0x7D48, + 10978: 0x7D5C, + 10979: 0x7DB7, + 10980: 0x7DA0, + 10981: 0x7DD6, + 10982: 0x7E52, + 10983: 0x7F47, + 10984: 0x7FA1, + 10985: 0xFA1E, + 10986: 0x8301, + 10987: 0x8362, + 10988: 0x837F, + 10989: 0x83C7, + 10990: 0x83F6, + 10991: 0x8448, + 10992: 0x84B4, + 10993: 0x8553, + 10994: 0x8559, + 10995: 0x856B, + 10996: 0xFA1F, + 10997: 0x85B0, + 10998: 0xFA20, + 10999: 0xFA21, + 11000: 0x8807, + 11001: 0x88F5, + 11002: 0x8A12, + 11003: 0x8A37, + 11004: 0x8A79, + 11005: 0x8AA7, + 11006: 0x8ABE, + 11007: 0x8ADF, + 11008: 0xFA22, + 11009: 0x8AF6, + 11010: 0x8B53, + 11011: 0x8B7F, + 11012: 0x8CF0, + 11013: 0x8CF4, + 11014: 0x8D12, + 11015: 0x8D76, + 11016: 0xFA23, + 11017: 0x8ECF, + 11018: 0xFA24, + 11019: 0xFA25, + 11020: 0x9067, + 11021: 0x90DE, + 11022: 0xFA26, + 11023: 0x9115, + 11024: 0x9127, + 11025: 0x91DA, + 11026: 0x91D7, + 11027: 0x91DE, + 11028: 0x91ED, + 11029: 0x91EE, + 11030: 0x91E4, + 11031: 0x91E5, + 11032: 0x9206, + 11033: 0x9210, + 11034: 0x920A, + 11035: 0x923A, + 11036: 0x9240, + 11037: 0x923C, + 11038: 0x924E, + 11039: 0x9259, + 11040: 0x9251, + 11041: 0x9239, + 11042: 0x9267, + 11043: 0x92A7, + 11044: 0x9277, + 11045: 0x9278, + 11046: 0x92E7, + 11047: 0x92D7, + 11048: 0x92D9, + 11049: 0x92D0, + 11050: 0xFA27, + 11051: 0x92D5, + 11052: 0x92E0, + 11053: 0x92D3, + 11054: 0x9325, + 11055: 0x9321, + 11056: 0x92FB, + 11057: 0xFA28, + 11058: 0x931E, + 11059: 0x92FF, + 11060: 0x931D, + 11061: 0x9302, + 11062: 0x9370, + 11063: 0x9357, + 11064: 0x93A4, + 11065: 0x93C6, + 11066: 0x93DE, + 11067: 0x93F8, + 11068: 0x9431, + 11069: 0x9445, + 11070: 0x9448, + 11071: 0x9592, + 11072: 0xF9DC, + 11073: 0xFA29, + 11074: 0x969D, + 11075: 0x96AF, + 11076: 0x9733, + 11077: 0x973B, + 11078: 0x9743, + 11079: 0x974D, + 11080: 0x974F, + 11081: 0x9751, + 11082: 0x9755, + 11083: 0x9857, + 11084: 0x9865, + 11085: 0xFA2A, + 11086: 0xFA2B, + 11087: 0x9927, + 11088: 0xFA2C, + 11089: 0x999E, + 11090: 0x9A4E, + 11091: 0x9AD9, + 11092: 0x9ADC, + 11093: 0x9B75, + 11094: 0x9B72, + 11095: 0x9B8F, + 11096: 0x9BB1, + 11097: 0x9BBB, + 11098: 0x9C00, + 11099: 0x9D70, + 11100: 0x9D6B, + 11101: 0xFA2D, + 11102: 0x9E19, + 11103: 0x9ED1, +} + +// jis0212Decode is the decoding table from JIS 0212 code to Unicode. +// It is defined at http://encoding.spec.whatwg.org/index-jis0212.txt +var jis0212Decode = [...]uint16{ + 108: 0x02D8, + 109: 0x02C7, + 110: 0x00B8, + 111: 0x02D9, + 112: 0x02DD, + 113: 0x00AF, + 114: 0x02DB, + 115: 0x02DA, + 116: 0xFF5E, + 117: 0x0384, + 118: 0x0385, + 127: 0x00A1, + 128: 0x00A6, + 129: 0x00BF, + 168: 0x00BA, + 169: 0x00AA, + 170: 0x00A9, + 171: 0x00AE, + 172: 0x2122, + 173: 0x00A4, + 174: 0x2116, + 534: 0x0386, + 535: 0x0388, + 536: 0x0389, + 537: 0x038A, + 538: 0x03AA, + 540: 0x038C, + 542: 0x038E, + 543: 0x03AB, + 545: 0x038F, + 550: 0x03AC, + 551: 0x03AD, + 552: 0x03AE, + 553: 0x03AF, + 554: 0x03CA, + 555: 0x0390, + 556: 0x03CC, + 557: 0x03C2, + 558: 0x03CD, + 559: 0x03CB, + 560: 0x03B0, + 561: 0x03CE, + 597: 0x0402, + 598: 0x0403, + 599: 0x0404, + 600: 0x0405, + 601: 0x0406, + 602: 0x0407, + 603: 0x0408, + 604: 0x0409, + 605: 0x040A, + 606: 0x040B, + 607: 0x040C, + 608: 0x040E, + 609: 0x040F, + 645: 0x0452, + 646: 0x0453, + 647: 0x0454, + 648: 0x0455, + 649: 0x0456, + 650: 0x0457, + 651: 0x0458, + 652: 0x0459, + 653: 0x045A, + 654: 0x045B, + 655: 0x045C, + 656: 0x045E, + 657: 0x045F, + 752: 0x00C6, + 753: 0x0110, + 755: 0x0126, + 757: 0x0132, + 759: 0x0141, + 760: 0x013F, + 762: 0x014A, + 763: 0x00D8, + 764: 0x0152, + 766: 0x0166, + 767: 0x00DE, + 784: 0x00E6, + 785: 0x0111, + 786: 0x00F0, + 787: 0x0127, + 788: 0x0131, + 789: 0x0133, + 790: 0x0138, + 791: 0x0142, + 792: 0x0140, + 793: 0x0149, + 794: 0x014B, + 795: 0x00F8, + 796: 0x0153, + 797: 0x00DF, + 798: 0x0167, + 799: 0x00FE, + 846: 0x00C1, + 847: 0x00C0, + 848: 0x00C4, + 849: 0x00C2, + 850: 0x0102, + 851: 0x01CD, + 852: 0x0100, + 853: 0x0104, + 854: 0x00C5, + 855: 0x00C3, + 856: 0x0106, + 857: 0x0108, + 858: 0x010C, + 859: 0x00C7, + 860: 0x010A, + 861: 0x010E, + 862: 0x00C9, + 863: 0x00C8, + 864: 0x00CB, + 865: 0x00CA, + 866: 0x011A, + 867: 0x0116, + 868: 0x0112, + 869: 0x0118, + 871: 0x011C, + 872: 0x011E, + 873: 0x0122, + 874: 0x0120, + 875: 0x0124, + 876: 0x00CD, + 877: 0x00CC, + 878: 0x00CF, + 879: 0x00CE, + 880: 0x01CF, + 881: 0x0130, + 882: 0x012A, + 883: 0x012E, + 884: 0x0128, + 885: 0x0134, + 886: 0x0136, + 887: 0x0139, + 888: 0x013D, + 889: 0x013B, + 890: 0x0143, + 891: 0x0147, + 892: 0x0145, + 893: 0x00D1, + 894: 0x00D3, + 895: 0x00D2, + 896: 0x00D6, + 897: 0x00D4, + 898: 0x01D1, + 899: 0x0150, + 900: 0x014C, + 901: 0x00D5, + 902: 0x0154, + 903: 0x0158, + 904: 0x0156, + 905: 0x015A, + 906: 0x015C, + 907: 0x0160, + 908: 0x015E, + 909: 0x0164, + 910: 0x0162, + 911: 0x00DA, + 912: 0x00D9, + 913: 0x00DC, + 914: 0x00DB, + 915: 0x016C, + 916: 0x01D3, + 917: 0x0170, + 918: 0x016A, + 919: 0x0172, + 920: 0x016E, + 921: 0x0168, + 922: 0x01D7, + 923: 0x01DB, + 924: 0x01D9, + 925: 0x01D5, + 926: 0x0174, + 927: 0x00DD, + 928: 0x0178, + 929: 0x0176, + 930: 0x0179, + 931: 0x017D, + 932: 0x017B, + 940: 0x00E1, + 941: 0x00E0, + 942: 0x00E4, + 943: 0x00E2, + 944: 0x0103, + 945: 0x01CE, + 946: 0x0101, + 947: 0x0105, + 948: 0x00E5, + 949: 0x00E3, + 950: 0x0107, + 951: 0x0109, + 952: 0x010D, + 953: 0x00E7, + 954: 0x010B, + 955: 0x010F, + 956: 0x00E9, + 957: 0x00E8, + 958: 0x00EB, + 959: 0x00EA, + 960: 0x011B, + 961: 0x0117, + 962: 0x0113, + 963: 0x0119, + 964: 0x01F5, + 965: 0x011D, + 966: 0x011F, + 968: 0x0121, + 969: 0x0125, + 970: 0x00ED, + 971: 0x00EC, + 972: 0x00EF, + 973: 0x00EE, + 974: 0x01D0, + 976: 0x012B, + 977: 0x012F, + 978: 0x0129, + 979: 0x0135, + 980: 0x0137, + 981: 0x013A, + 982: 0x013E, + 983: 0x013C, + 984: 0x0144, + 985: 0x0148, + 986: 0x0146, + 987: 0x00F1, + 988: 0x00F3, + 989: 0x00F2, + 990: 0x00F6, + 991: 0x00F4, + 992: 0x01D2, + 993: 0x0151, + 994: 0x014D, + 995: 0x00F5, + 996: 0x0155, + 997: 0x0159, + 998: 0x0157, + 999: 0x015B, + 1000: 0x015D, + 1001: 0x0161, + 1002: 0x015F, + 1003: 0x0165, + 1004: 0x0163, + 1005: 0x00FA, + 1006: 0x00F9, + 1007: 0x00FC, + 1008: 0x00FB, + 1009: 0x016D, + 1010: 0x01D4, + 1011: 0x0171, + 1012: 0x016B, + 1013: 0x0173, + 1014: 0x016F, + 1015: 0x0169, + 1016: 0x01D8, + 1017: 0x01DC, + 1018: 0x01DA, + 1019: 0x01D6, + 1020: 0x0175, + 1021: 0x00FD, + 1022: 0x00FF, + 1023: 0x0177, + 1024: 0x017A, + 1025: 0x017E, + 1026: 0x017C, + 1410: 0x4E02, + 1411: 0x4E04, + 1412: 0x4E05, + 1413: 0x4E0C, + 1414: 0x4E12, + 1415: 0x4E1F, + 1416: 0x4E23, + 1417: 0x4E24, + 1418: 0x4E28, + 1419: 0x4E2B, + 1420: 0x4E2E, + 1421: 0x4E2F, + 1422: 0x4E30, + 1423: 0x4E35, + 1424: 0x4E40, + 1425: 0x4E41, + 1426: 0x4E44, + 1427: 0x4E47, + 1428: 0x4E51, + 1429: 0x4E5A, + 1430: 0x4E5C, + 1431: 0x4E63, + 1432: 0x4E68, + 1433: 0x4E69, + 1434: 0x4E74, + 1435: 0x4E75, + 1436: 0x4E79, + 1437: 0x4E7F, + 1438: 0x4E8D, + 1439: 0x4E96, + 1440: 0x4E97, + 1441: 0x4E9D, + 1442: 0x4EAF, + 1443: 0x4EB9, + 1444: 0x4EC3, + 1445: 0x4ED0, + 1446: 0x4EDA, + 1447: 0x4EDB, + 1448: 0x4EE0, + 1449: 0x4EE1, + 1450: 0x4EE2, + 1451: 0x4EE8, + 1452: 0x4EEF, + 1453: 0x4EF1, + 1454: 0x4EF3, + 1455: 0x4EF5, + 1456: 0x4EFD, + 1457: 0x4EFE, + 1458: 0x4EFF, + 1459: 0x4F00, + 1460: 0x4F02, + 1461: 0x4F03, + 1462: 0x4F08, + 1463: 0x4F0B, + 1464: 0x4F0C, + 1465: 0x4F12, + 1466: 0x4F15, + 1467: 0x4F16, + 1468: 0x4F17, + 1469: 0x4F19, + 1470: 0x4F2E, + 1471: 0x4F31, + 1472: 0x4F60, + 1473: 0x4F33, + 1474: 0x4F35, + 1475: 0x4F37, + 1476: 0x4F39, + 1477: 0x4F3B, + 1478: 0x4F3E, + 1479: 0x4F40, + 1480: 0x4F42, + 1481: 0x4F48, + 1482: 0x4F49, + 1483: 0x4F4B, + 1484: 0x4F4C, + 1485: 0x4F52, + 1486: 0x4F54, + 1487: 0x4F56, + 1488: 0x4F58, + 1489: 0x4F5F, + 1490: 0x4F63, + 1491: 0x4F6A, + 1492: 0x4F6C, + 1493: 0x4F6E, + 1494: 0x4F71, + 1495: 0x4F77, + 1496: 0x4F78, + 1497: 0x4F79, + 1498: 0x4F7A, + 1499: 0x4F7D, + 1500: 0x4F7E, + 1501: 0x4F81, + 1502: 0x4F82, + 1503: 0x4F84, + 1504: 0x4F85, + 1505: 0x4F89, + 1506: 0x4F8A, + 1507: 0x4F8C, + 1508: 0x4F8E, + 1509: 0x4F90, + 1510: 0x4F92, + 1511: 0x4F93, + 1512: 0x4F94, + 1513: 0x4F97, + 1514: 0x4F99, + 1515: 0x4F9A, + 1516: 0x4F9E, + 1517: 0x4F9F, + 1518: 0x4FB2, + 1519: 0x4FB7, + 1520: 0x4FB9, + 1521: 0x4FBB, + 1522: 0x4FBC, + 1523: 0x4FBD, + 1524: 0x4FBE, + 1525: 0x4FC0, + 1526: 0x4FC1, + 1527: 0x4FC5, + 1528: 0x4FC6, + 1529: 0x4FC8, + 1530: 0x4FC9, + 1531: 0x4FCB, + 1532: 0x4FCC, + 1533: 0x4FCD, + 1534: 0x4FCF, + 1535: 0x4FD2, + 1536: 0x4FDC, + 1537: 0x4FE0, + 1538: 0x4FE2, + 1539: 0x4FF0, + 1540: 0x4FF2, + 1541: 0x4FFC, + 1542: 0x4FFD, + 1543: 0x4FFF, + 1544: 0x5000, + 1545: 0x5001, + 1546: 0x5004, + 1547: 0x5007, + 1548: 0x500A, + 1549: 0x500C, + 1550: 0x500E, + 1551: 0x5010, + 1552: 0x5013, + 1553: 0x5017, + 1554: 0x5018, + 1555: 0x501B, + 1556: 0x501C, + 1557: 0x501D, + 1558: 0x501E, + 1559: 0x5022, + 1560: 0x5027, + 1561: 0x502E, + 1562: 0x5030, + 1563: 0x5032, + 1564: 0x5033, + 1565: 0x5035, + 1566: 0x5040, + 1567: 0x5041, + 1568: 0x5042, + 1569: 0x5045, + 1570: 0x5046, + 1571: 0x504A, + 1572: 0x504C, + 1573: 0x504E, + 1574: 0x5051, + 1575: 0x5052, + 1576: 0x5053, + 1577: 0x5057, + 1578: 0x5059, + 1579: 0x505F, + 1580: 0x5060, + 1581: 0x5062, + 1582: 0x5063, + 1583: 0x5066, + 1584: 0x5067, + 1585: 0x506A, + 1586: 0x506D, + 1587: 0x5070, + 1588: 0x5071, + 1589: 0x503B, + 1590: 0x5081, + 1591: 0x5083, + 1592: 0x5084, + 1593: 0x5086, + 1594: 0x508A, + 1595: 0x508E, + 1596: 0x508F, + 1597: 0x5090, + 1598: 0x5092, + 1599: 0x5093, + 1600: 0x5094, + 1601: 0x5096, + 1602: 0x509B, + 1603: 0x509C, + 1604: 0x509E, + 1605: 0x509F, + 1606: 0x50A0, + 1607: 0x50A1, + 1608: 0x50A2, + 1609: 0x50AA, + 1610: 0x50AF, + 1611: 0x50B0, + 1612: 0x50B9, + 1613: 0x50BA, + 1614: 0x50BD, + 1615: 0x50C0, + 1616: 0x50C3, + 1617: 0x50C4, + 1618: 0x50C7, + 1619: 0x50CC, + 1620: 0x50CE, + 1621: 0x50D0, + 1622: 0x50D3, + 1623: 0x50D4, + 1624: 0x50D8, + 1625: 0x50DC, + 1626: 0x50DD, + 1627: 0x50DF, + 1628: 0x50E2, + 1629: 0x50E4, + 1630: 0x50E6, + 1631: 0x50E8, + 1632: 0x50E9, + 1633: 0x50EF, + 1634: 0x50F1, + 1635: 0x50F6, + 1636: 0x50FA, + 1637: 0x50FE, + 1638: 0x5103, + 1639: 0x5106, + 1640: 0x5107, + 1641: 0x5108, + 1642: 0x510B, + 1643: 0x510C, + 1644: 0x510D, + 1645: 0x510E, + 1646: 0x50F2, + 1647: 0x5110, + 1648: 0x5117, + 1649: 0x5119, + 1650: 0x511B, + 1651: 0x511C, + 1652: 0x511D, + 1653: 0x511E, + 1654: 0x5123, + 1655: 0x5127, + 1656: 0x5128, + 1657: 0x512C, + 1658: 0x512D, + 1659: 0x512F, + 1660: 0x5131, + 1661: 0x5133, + 1662: 0x5134, + 1663: 0x5135, + 1664: 0x5138, + 1665: 0x5139, + 1666: 0x5142, + 1667: 0x514A, + 1668: 0x514F, + 1669: 0x5153, + 1670: 0x5155, + 1671: 0x5157, + 1672: 0x5158, + 1673: 0x515F, + 1674: 0x5164, + 1675: 0x5166, + 1676: 0x517E, + 1677: 0x5183, + 1678: 0x5184, + 1679: 0x518B, + 1680: 0x518E, + 1681: 0x5198, + 1682: 0x519D, + 1683: 0x51A1, + 1684: 0x51A3, + 1685: 0x51AD, + 1686: 0x51B8, + 1687: 0x51BA, + 1688: 0x51BC, + 1689: 0x51BE, + 1690: 0x51BF, + 1691: 0x51C2, + 1692: 0x51C8, + 1693: 0x51CF, + 1694: 0x51D1, + 1695: 0x51D2, + 1696: 0x51D3, + 1697: 0x51D5, + 1698: 0x51D8, + 1699: 0x51DE, + 1700: 0x51E2, + 1701: 0x51E5, + 1702: 0x51EE, + 1703: 0x51F2, + 1704: 0x51F3, + 1705: 0x51F4, + 1706: 0x51F7, + 1707: 0x5201, + 1708: 0x5202, + 1709: 0x5205, + 1710: 0x5212, + 1711: 0x5213, + 1712: 0x5215, + 1713: 0x5216, + 1714: 0x5218, + 1715: 0x5222, + 1716: 0x5228, + 1717: 0x5231, + 1718: 0x5232, + 1719: 0x5235, + 1720: 0x523C, + 1721: 0x5245, + 1722: 0x5249, + 1723: 0x5255, + 1724: 0x5257, + 1725: 0x5258, + 1726: 0x525A, + 1727: 0x525C, + 1728: 0x525F, + 1729: 0x5260, + 1730: 0x5261, + 1731: 0x5266, + 1732: 0x526E, + 1733: 0x5277, + 1734: 0x5278, + 1735: 0x5279, + 1736: 0x5280, + 1737: 0x5282, + 1738: 0x5285, + 1739: 0x528A, + 1740: 0x528C, + 1741: 0x5293, + 1742: 0x5295, + 1743: 0x5296, + 1744: 0x5297, + 1745: 0x5298, + 1746: 0x529A, + 1747: 0x529C, + 1748: 0x52A4, + 1749: 0x52A5, + 1750: 0x52A6, + 1751: 0x52A7, + 1752: 0x52AF, + 1753: 0x52B0, + 1754: 0x52B6, + 1755: 0x52B7, + 1756: 0x52B8, + 1757: 0x52BA, + 1758: 0x52BB, + 1759: 0x52BD, + 1760: 0x52C0, + 1761: 0x52C4, + 1762: 0x52C6, + 1763: 0x52C8, + 1764: 0x52CC, + 1765: 0x52CF, + 1766: 0x52D1, + 1767: 0x52D4, + 1768: 0x52D6, + 1769: 0x52DB, + 1770: 0x52DC, + 1771: 0x52E1, + 1772: 0x52E5, + 1773: 0x52E8, + 1774: 0x52E9, + 1775: 0x52EA, + 1776: 0x52EC, + 1777: 0x52F0, + 1778: 0x52F1, + 1779: 0x52F4, + 1780: 0x52F6, + 1781: 0x52F7, + 1782: 0x5300, + 1783: 0x5303, + 1784: 0x530A, + 1785: 0x530B, + 1786: 0x530C, + 1787: 0x5311, + 1788: 0x5313, + 1789: 0x5318, + 1790: 0x531B, + 1791: 0x531C, + 1792: 0x531E, + 1793: 0x531F, + 1794: 0x5325, + 1795: 0x5327, + 1796: 0x5328, + 1797: 0x5329, + 1798: 0x532B, + 1799: 0x532C, + 1800: 0x532D, + 1801: 0x5330, + 1802: 0x5332, + 1803: 0x5335, + 1804: 0x533C, + 1805: 0x533D, + 1806: 0x533E, + 1807: 0x5342, + 1808: 0x534C, + 1809: 0x534B, + 1810: 0x5359, + 1811: 0x535B, + 1812: 0x5361, + 1813: 0x5363, + 1814: 0x5365, + 1815: 0x536C, + 1816: 0x536D, + 1817: 0x5372, + 1818: 0x5379, + 1819: 0x537E, + 1820: 0x5383, + 1821: 0x5387, + 1822: 0x5388, + 1823: 0x538E, + 1824: 0x5393, + 1825: 0x5394, + 1826: 0x5399, + 1827: 0x539D, + 1828: 0x53A1, + 1829: 0x53A4, + 1830: 0x53AA, + 1831: 0x53AB, + 1832: 0x53AF, + 1833: 0x53B2, + 1834: 0x53B4, + 1835: 0x53B5, + 1836: 0x53B7, + 1837: 0x53B8, + 1838: 0x53BA, + 1839: 0x53BD, + 1840: 0x53C0, + 1841: 0x53C5, + 1842: 0x53CF, + 1843: 0x53D2, + 1844: 0x53D3, + 1845: 0x53D5, + 1846: 0x53DA, + 1847: 0x53DD, + 1848: 0x53DE, + 1849: 0x53E0, + 1850: 0x53E6, + 1851: 0x53E7, + 1852: 0x53F5, + 1853: 0x5402, + 1854: 0x5413, + 1855: 0x541A, + 1856: 0x5421, + 1857: 0x5427, + 1858: 0x5428, + 1859: 0x542A, + 1860: 0x542F, + 1861: 0x5431, + 1862: 0x5434, + 1863: 0x5435, + 1864: 0x5443, + 1865: 0x5444, + 1866: 0x5447, + 1867: 0x544D, + 1868: 0x544F, + 1869: 0x545E, + 1870: 0x5462, + 1871: 0x5464, + 1872: 0x5466, + 1873: 0x5467, + 1874: 0x5469, + 1875: 0x546B, + 1876: 0x546D, + 1877: 0x546E, + 1878: 0x5474, + 1879: 0x547F, + 1880: 0x5481, + 1881: 0x5483, + 1882: 0x5485, + 1883: 0x5488, + 1884: 0x5489, + 1885: 0x548D, + 1886: 0x5491, + 1887: 0x5495, + 1888: 0x5496, + 1889: 0x549C, + 1890: 0x549F, + 1891: 0x54A1, + 1892: 0x54A6, + 1893: 0x54A7, + 1894: 0x54A9, + 1895: 0x54AA, + 1896: 0x54AD, + 1897: 0x54AE, + 1898: 0x54B1, + 1899: 0x54B7, + 1900: 0x54B9, + 1901: 0x54BA, + 1902: 0x54BB, + 1903: 0x54BF, + 1904: 0x54C6, + 1905: 0x54CA, + 1906: 0x54CD, + 1907: 0x54CE, + 1908: 0x54E0, + 1909: 0x54EA, + 1910: 0x54EC, + 1911: 0x54EF, + 1912: 0x54F6, + 1913: 0x54FC, + 1914: 0x54FE, + 1915: 0x54FF, + 1916: 0x5500, + 1917: 0x5501, + 1918: 0x5505, + 1919: 0x5508, + 1920: 0x5509, + 1921: 0x550C, + 1922: 0x550D, + 1923: 0x550E, + 1924: 0x5515, + 1925: 0x552A, + 1926: 0x552B, + 1927: 0x5532, + 1928: 0x5535, + 1929: 0x5536, + 1930: 0x553B, + 1931: 0x553C, + 1932: 0x553D, + 1933: 0x5541, + 1934: 0x5547, + 1935: 0x5549, + 1936: 0x554A, + 1937: 0x554D, + 1938: 0x5550, + 1939: 0x5551, + 1940: 0x5558, + 1941: 0x555A, + 1942: 0x555B, + 1943: 0x555E, + 1944: 0x5560, + 1945: 0x5561, + 1946: 0x5564, + 1947: 0x5566, + 1948: 0x557F, + 1949: 0x5581, + 1950: 0x5582, + 1951: 0x5586, + 1952: 0x5588, + 1953: 0x558E, + 1954: 0x558F, + 1955: 0x5591, + 1956: 0x5592, + 1957: 0x5593, + 1958: 0x5594, + 1959: 0x5597, + 1960: 0x55A3, + 1961: 0x55A4, + 1962: 0x55AD, + 1963: 0x55B2, + 1964: 0x55BF, + 1965: 0x55C1, + 1966: 0x55C3, + 1967: 0x55C6, + 1968: 0x55C9, + 1969: 0x55CB, + 1970: 0x55CC, + 1971: 0x55CE, + 1972: 0x55D1, + 1973: 0x55D2, + 1974: 0x55D3, + 1975: 0x55D7, + 1976: 0x55D8, + 1977: 0x55DB, + 1978: 0x55DE, + 1979: 0x55E2, + 1980: 0x55E9, + 1981: 0x55F6, + 1982: 0x55FF, + 1983: 0x5605, + 1984: 0x5608, + 1985: 0x560A, + 1986: 0x560D, + 1987: 0x560E, + 1988: 0x560F, + 1989: 0x5610, + 1990: 0x5611, + 1991: 0x5612, + 1992: 0x5619, + 1993: 0x562C, + 1994: 0x5630, + 1995: 0x5633, + 1996: 0x5635, + 1997: 0x5637, + 1998: 0x5639, + 1999: 0x563B, + 2000: 0x563C, + 2001: 0x563D, + 2002: 0x563F, + 2003: 0x5640, + 2004: 0x5641, + 2005: 0x5643, + 2006: 0x5644, + 2007: 0x5646, + 2008: 0x5649, + 2009: 0x564B, + 2010: 0x564D, + 2011: 0x564F, + 2012: 0x5654, + 2013: 0x565E, + 2014: 0x5660, + 2015: 0x5661, + 2016: 0x5662, + 2017: 0x5663, + 2018: 0x5666, + 2019: 0x5669, + 2020: 0x566D, + 2021: 0x566F, + 2022: 0x5671, + 2023: 0x5672, + 2024: 0x5675, + 2025: 0x5684, + 2026: 0x5685, + 2027: 0x5688, + 2028: 0x568B, + 2029: 0x568C, + 2030: 0x5695, + 2031: 0x5699, + 2032: 0x569A, + 2033: 0x569D, + 2034: 0x569E, + 2035: 0x569F, + 2036: 0x56A6, + 2037: 0x56A7, + 2038: 0x56A8, + 2039: 0x56A9, + 2040: 0x56AB, + 2041: 0x56AC, + 2042: 0x56AD, + 2043: 0x56B1, + 2044: 0x56B3, + 2045: 0x56B7, + 2046: 0x56BE, + 2047: 0x56C5, + 2048: 0x56C9, + 2049: 0x56CA, + 2050: 0x56CB, + 2051: 0x56CF, + 2052: 0x56D0, + 2053: 0x56CC, + 2054: 0x56CD, + 2055: 0x56D9, + 2056: 0x56DC, + 2057: 0x56DD, + 2058: 0x56DF, + 2059: 0x56E1, + 2060: 0x56E4, + 2061: 0x56E5, + 2062: 0x56E6, + 2063: 0x56E7, + 2064: 0x56E8, + 2065: 0x56F1, + 2066: 0x56EB, + 2067: 0x56ED, + 2068: 0x56F6, + 2069: 0x56F7, + 2070: 0x5701, + 2071: 0x5702, + 2072: 0x5707, + 2073: 0x570A, + 2074: 0x570C, + 2075: 0x5711, + 2076: 0x5715, + 2077: 0x571A, + 2078: 0x571B, + 2079: 0x571D, + 2080: 0x5720, + 2081: 0x5722, + 2082: 0x5723, + 2083: 0x5724, + 2084: 0x5725, + 2085: 0x5729, + 2086: 0x572A, + 2087: 0x572C, + 2088: 0x572E, + 2089: 0x572F, + 2090: 0x5733, + 2091: 0x5734, + 2092: 0x573D, + 2093: 0x573E, + 2094: 0x573F, + 2095: 0x5745, + 2096: 0x5746, + 2097: 0x574C, + 2098: 0x574D, + 2099: 0x5752, + 2100: 0x5762, + 2101: 0x5765, + 2102: 0x5767, + 2103: 0x5768, + 2104: 0x576B, + 2105: 0x576D, + 2106: 0x576E, + 2107: 0x576F, + 2108: 0x5770, + 2109: 0x5771, + 2110: 0x5773, + 2111: 0x5774, + 2112: 0x5775, + 2113: 0x5777, + 2114: 0x5779, + 2115: 0x577A, + 2116: 0x577B, + 2117: 0x577C, + 2118: 0x577E, + 2119: 0x5781, + 2120: 0x5783, + 2121: 0x578C, + 2122: 0x5794, + 2123: 0x5797, + 2124: 0x5799, + 2125: 0x579A, + 2126: 0x579C, + 2127: 0x579D, + 2128: 0x579E, + 2129: 0x579F, + 2130: 0x57A1, + 2131: 0x5795, + 2132: 0x57A7, + 2133: 0x57A8, + 2134: 0x57A9, + 2135: 0x57AC, + 2136: 0x57B8, + 2137: 0x57BD, + 2138: 0x57C7, + 2139: 0x57C8, + 2140: 0x57CC, + 2141: 0x57CF, + 2142: 0x57D5, + 2143: 0x57DD, + 2144: 0x57DE, + 2145: 0x57E4, + 2146: 0x57E6, + 2147: 0x57E7, + 2148: 0x57E9, + 2149: 0x57ED, + 2150: 0x57F0, + 2151: 0x57F5, + 2152: 0x57F6, + 2153: 0x57F8, + 2154: 0x57FD, + 2155: 0x57FE, + 2156: 0x57FF, + 2157: 0x5803, + 2158: 0x5804, + 2159: 0x5808, + 2160: 0x5809, + 2161: 0x57E1, + 2162: 0x580C, + 2163: 0x580D, + 2164: 0x581B, + 2165: 0x581E, + 2166: 0x581F, + 2167: 0x5820, + 2168: 0x5826, + 2169: 0x5827, + 2170: 0x582D, + 2171: 0x5832, + 2172: 0x5839, + 2173: 0x583F, + 2174: 0x5849, + 2175: 0x584C, + 2176: 0x584D, + 2177: 0x584F, + 2178: 0x5850, + 2179: 0x5855, + 2180: 0x585F, + 2181: 0x5861, + 2182: 0x5864, + 2183: 0x5867, + 2184: 0x5868, + 2185: 0x5878, + 2186: 0x587C, + 2187: 0x587F, + 2188: 0x5880, + 2189: 0x5881, + 2190: 0x5887, + 2191: 0x5888, + 2192: 0x5889, + 2193: 0x588A, + 2194: 0x588C, + 2195: 0x588D, + 2196: 0x588F, + 2197: 0x5890, + 2198: 0x5894, + 2199: 0x5896, + 2200: 0x589D, + 2201: 0x58A0, + 2202: 0x58A1, + 2203: 0x58A2, + 2204: 0x58A6, + 2205: 0x58A9, + 2206: 0x58B1, + 2207: 0x58B2, + 2208: 0x58C4, + 2209: 0x58BC, + 2210: 0x58C2, + 2211: 0x58C8, + 2212: 0x58CD, + 2213: 0x58CE, + 2214: 0x58D0, + 2215: 0x58D2, + 2216: 0x58D4, + 2217: 0x58D6, + 2218: 0x58DA, + 2219: 0x58DD, + 2220: 0x58E1, + 2221: 0x58E2, + 2222: 0x58E9, + 2223: 0x58F3, + 2224: 0x5905, + 2225: 0x5906, + 2226: 0x590B, + 2227: 0x590C, + 2228: 0x5912, + 2229: 0x5913, + 2230: 0x5914, + 2231: 0x8641, + 2232: 0x591D, + 2233: 0x5921, + 2234: 0x5923, + 2235: 0x5924, + 2236: 0x5928, + 2237: 0x592F, + 2238: 0x5930, + 2239: 0x5933, + 2240: 0x5935, + 2241: 0x5936, + 2242: 0x593F, + 2243: 0x5943, + 2244: 0x5946, + 2245: 0x5952, + 2246: 0x5953, + 2247: 0x5959, + 2248: 0x595B, + 2249: 0x595D, + 2250: 0x595E, + 2251: 0x595F, + 2252: 0x5961, + 2253: 0x5963, + 2254: 0x596B, + 2255: 0x596D, + 2256: 0x596F, + 2257: 0x5972, + 2258: 0x5975, + 2259: 0x5976, + 2260: 0x5979, + 2261: 0x597B, + 2262: 0x597C, + 2263: 0x598B, + 2264: 0x598C, + 2265: 0x598E, + 2266: 0x5992, + 2267: 0x5995, + 2268: 0x5997, + 2269: 0x599F, + 2270: 0x59A4, + 2271: 0x59A7, + 2272: 0x59AD, + 2273: 0x59AE, + 2274: 0x59AF, + 2275: 0x59B0, + 2276: 0x59B3, + 2277: 0x59B7, + 2278: 0x59BA, + 2279: 0x59BC, + 2280: 0x59C1, + 2281: 0x59C3, + 2282: 0x59C4, + 2283: 0x59C8, + 2284: 0x59CA, + 2285: 0x59CD, + 2286: 0x59D2, + 2287: 0x59DD, + 2288: 0x59DE, + 2289: 0x59DF, + 2290: 0x59E3, + 2291: 0x59E4, + 2292: 0x59E7, + 2293: 0x59EE, + 2294: 0x59EF, + 2295: 0x59F1, + 2296: 0x59F2, + 2297: 0x59F4, + 2298: 0x59F7, + 2299: 0x5A00, + 2300: 0x5A04, + 2301: 0x5A0C, + 2302: 0x5A0D, + 2303: 0x5A0E, + 2304: 0x5A12, + 2305: 0x5A13, + 2306: 0x5A1E, + 2307: 0x5A23, + 2308: 0x5A24, + 2309: 0x5A27, + 2310: 0x5A28, + 2311: 0x5A2A, + 2312: 0x5A2D, + 2313: 0x5A30, + 2314: 0x5A44, + 2315: 0x5A45, + 2316: 0x5A47, + 2317: 0x5A48, + 2318: 0x5A4C, + 2319: 0x5A50, + 2320: 0x5A55, + 2321: 0x5A5E, + 2322: 0x5A63, + 2323: 0x5A65, + 2324: 0x5A67, + 2325: 0x5A6D, + 2326: 0x5A77, + 2327: 0x5A7A, + 2328: 0x5A7B, + 2329: 0x5A7E, + 2330: 0x5A8B, + 2331: 0x5A90, + 2332: 0x5A93, + 2333: 0x5A96, + 2334: 0x5A99, + 2335: 0x5A9C, + 2336: 0x5A9E, + 2337: 0x5A9F, + 2338: 0x5AA0, + 2339: 0x5AA2, + 2340: 0x5AA7, + 2341: 0x5AAC, + 2342: 0x5AB1, + 2343: 0x5AB2, + 2344: 0x5AB3, + 2345: 0x5AB5, + 2346: 0x5AB8, + 2347: 0x5ABA, + 2348: 0x5ABB, + 2349: 0x5ABF, + 2350: 0x5AC4, + 2351: 0x5AC6, + 2352: 0x5AC8, + 2353: 0x5ACF, + 2354: 0x5ADA, + 2355: 0x5ADC, + 2356: 0x5AE0, + 2357: 0x5AE5, + 2358: 0x5AEA, + 2359: 0x5AEE, + 2360: 0x5AF5, + 2361: 0x5AF6, + 2362: 0x5AFD, + 2363: 0x5B00, + 2364: 0x5B01, + 2365: 0x5B08, + 2366: 0x5B17, + 2367: 0x5B34, + 2368: 0x5B19, + 2369: 0x5B1B, + 2370: 0x5B1D, + 2371: 0x5B21, + 2372: 0x5B25, + 2373: 0x5B2D, + 2374: 0x5B38, + 2375: 0x5B41, + 2376: 0x5B4B, + 2377: 0x5B4C, + 2378: 0x5B52, + 2379: 0x5B56, + 2380: 0x5B5E, + 2381: 0x5B68, + 2382: 0x5B6E, + 2383: 0x5B6F, + 2384: 0x5B7C, + 2385: 0x5B7D, + 2386: 0x5B7E, + 2387: 0x5B7F, + 2388: 0x5B81, + 2389: 0x5B84, + 2390: 0x5B86, + 2391: 0x5B8A, + 2392: 0x5B8E, + 2393: 0x5B90, + 2394: 0x5B91, + 2395: 0x5B93, + 2396: 0x5B94, + 2397: 0x5B96, + 2398: 0x5BA8, + 2399: 0x5BA9, + 2400: 0x5BAC, + 2401: 0x5BAD, + 2402: 0x5BAF, + 2403: 0x5BB1, + 2404: 0x5BB2, + 2405: 0x5BB7, + 2406: 0x5BBA, + 2407: 0x5BBC, + 2408: 0x5BC0, + 2409: 0x5BC1, + 2410: 0x5BCD, + 2411: 0x5BCF, + 2412: 0x5BD6, + 2413: 0x5BD7, + 2414: 0x5BD8, + 2415: 0x5BD9, + 2416: 0x5BDA, + 2417: 0x5BE0, + 2418: 0x5BEF, + 2419: 0x5BF1, + 2420: 0x5BF4, + 2421: 0x5BFD, + 2422: 0x5C0C, + 2423: 0x5C17, + 2424: 0x5C1E, + 2425: 0x5C1F, + 2426: 0x5C23, + 2427: 0x5C26, + 2428: 0x5C29, + 2429: 0x5C2B, + 2430: 0x5C2C, + 2431: 0x5C2E, + 2432: 0x5C30, + 2433: 0x5C32, + 2434: 0x5C35, + 2435: 0x5C36, + 2436: 0x5C59, + 2437: 0x5C5A, + 2438: 0x5C5C, + 2439: 0x5C62, + 2440: 0x5C63, + 2441: 0x5C67, + 2442: 0x5C68, + 2443: 0x5C69, + 2444: 0x5C6D, + 2445: 0x5C70, + 2446: 0x5C74, + 2447: 0x5C75, + 2448: 0x5C7A, + 2449: 0x5C7B, + 2450: 0x5C7C, + 2451: 0x5C7D, + 2452: 0x5C87, + 2453: 0x5C88, + 2454: 0x5C8A, + 2455: 0x5C8F, + 2456: 0x5C92, + 2457: 0x5C9D, + 2458: 0x5C9F, + 2459: 0x5CA0, + 2460: 0x5CA2, + 2461: 0x5CA3, + 2462: 0x5CA6, + 2463: 0x5CAA, + 2464: 0x5CB2, + 2465: 0x5CB4, + 2466: 0x5CB5, + 2467: 0x5CBA, + 2468: 0x5CC9, + 2469: 0x5CCB, + 2470: 0x5CD2, + 2471: 0x5CDD, + 2472: 0x5CD7, + 2473: 0x5CEE, + 2474: 0x5CF1, + 2475: 0x5CF2, + 2476: 0x5CF4, + 2477: 0x5D01, + 2478: 0x5D06, + 2479: 0x5D0D, + 2480: 0x5D12, + 2481: 0x5D2B, + 2482: 0x5D23, + 2483: 0x5D24, + 2484: 0x5D26, + 2485: 0x5D27, + 2486: 0x5D31, + 2487: 0x5D34, + 2488: 0x5D39, + 2489: 0x5D3D, + 2490: 0x5D3F, + 2491: 0x5D42, + 2492: 0x5D43, + 2493: 0x5D46, + 2494: 0x5D48, + 2495: 0x5D55, + 2496: 0x5D51, + 2497: 0x5D59, + 2498: 0x5D4A, + 2499: 0x5D5F, + 2500: 0x5D60, + 2501: 0x5D61, + 2502: 0x5D62, + 2503: 0x5D64, + 2504: 0x5D6A, + 2505: 0x5D6D, + 2506: 0x5D70, + 2507: 0x5D79, + 2508: 0x5D7A, + 2509: 0x5D7E, + 2510: 0x5D7F, + 2511: 0x5D81, + 2512: 0x5D83, + 2513: 0x5D88, + 2514: 0x5D8A, + 2515: 0x5D92, + 2516: 0x5D93, + 2517: 0x5D94, + 2518: 0x5D95, + 2519: 0x5D99, + 2520: 0x5D9B, + 2521: 0x5D9F, + 2522: 0x5DA0, + 2523: 0x5DA7, + 2524: 0x5DAB, + 2525: 0x5DB0, + 2526: 0x5DB4, + 2527: 0x5DB8, + 2528: 0x5DB9, + 2529: 0x5DC3, + 2530: 0x5DC7, + 2531: 0x5DCB, + 2532: 0x5DD0, + 2533: 0x5DCE, + 2534: 0x5DD8, + 2535: 0x5DD9, + 2536: 0x5DE0, + 2537: 0x5DE4, + 2538: 0x5DE9, + 2539: 0x5DF8, + 2540: 0x5DF9, + 2541: 0x5E00, + 2542: 0x5E07, + 2543: 0x5E0D, + 2544: 0x5E12, + 2545: 0x5E14, + 2546: 0x5E15, + 2547: 0x5E18, + 2548: 0x5E1F, + 2549: 0x5E20, + 2550: 0x5E2E, + 2551: 0x5E28, + 2552: 0x5E32, + 2553: 0x5E35, + 2554: 0x5E3E, + 2555: 0x5E4B, + 2556: 0x5E50, + 2557: 0x5E49, + 2558: 0x5E51, + 2559: 0x5E56, + 2560: 0x5E58, + 2561: 0x5E5B, + 2562: 0x5E5C, + 2563: 0x5E5E, + 2564: 0x5E68, + 2565: 0x5E6A, + 2566: 0x5E6B, + 2567: 0x5E6C, + 2568: 0x5E6D, + 2569: 0x5E6E, + 2570: 0x5E70, + 2571: 0x5E80, + 2572: 0x5E8B, + 2573: 0x5E8E, + 2574: 0x5EA2, + 2575: 0x5EA4, + 2576: 0x5EA5, + 2577: 0x5EA8, + 2578: 0x5EAA, + 2579: 0x5EAC, + 2580: 0x5EB1, + 2581: 0x5EB3, + 2582: 0x5EBD, + 2583: 0x5EBE, + 2584: 0x5EBF, + 2585: 0x5EC6, + 2586: 0x5ECC, + 2587: 0x5ECB, + 2588: 0x5ECE, + 2589: 0x5ED1, + 2590: 0x5ED2, + 2591: 0x5ED4, + 2592: 0x5ED5, + 2593: 0x5EDC, + 2594: 0x5EDE, + 2595: 0x5EE5, + 2596: 0x5EEB, + 2597: 0x5F02, + 2598: 0x5F06, + 2599: 0x5F07, + 2600: 0x5F08, + 2601: 0x5F0E, + 2602: 0x5F19, + 2603: 0x5F1C, + 2604: 0x5F1D, + 2605: 0x5F21, + 2606: 0x5F22, + 2607: 0x5F23, + 2608: 0x5F24, + 2609: 0x5F28, + 2610: 0x5F2B, + 2611: 0x5F2C, + 2612: 0x5F2E, + 2613: 0x5F30, + 2614: 0x5F34, + 2615: 0x5F36, + 2616: 0x5F3B, + 2617: 0x5F3D, + 2618: 0x5F3F, + 2619: 0x5F40, + 2620: 0x5F44, + 2621: 0x5F45, + 2622: 0x5F47, + 2623: 0x5F4D, + 2624: 0x5F50, + 2625: 0x5F54, + 2626: 0x5F58, + 2627: 0x5F5B, + 2628: 0x5F60, + 2629: 0x5F63, + 2630: 0x5F64, + 2631: 0x5F67, + 2632: 0x5F6F, + 2633: 0x5F72, + 2634: 0x5F74, + 2635: 0x5F75, + 2636: 0x5F78, + 2637: 0x5F7A, + 2638: 0x5F7D, + 2639: 0x5F7E, + 2640: 0x5F89, + 2641: 0x5F8D, + 2642: 0x5F8F, + 2643: 0x5F96, + 2644: 0x5F9C, + 2645: 0x5F9D, + 2646: 0x5FA2, + 2647: 0x5FA7, + 2648: 0x5FAB, + 2649: 0x5FA4, + 2650: 0x5FAC, + 2651: 0x5FAF, + 2652: 0x5FB0, + 2653: 0x5FB1, + 2654: 0x5FB8, + 2655: 0x5FC4, + 2656: 0x5FC7, + 2657: 0x5FC8, + 2658: 0x5FC9, + 2659: 0x5FCB, + 2660: 0x5FD0, + 2661: 0x5FD1, + 2662: 0x5FD2, + 2663: 0x5FD3, + 2664: 0x5FD4, + 2665: 0x5FDE, + 2666: 0x5FE1, + 2667: 0x5FE2, + 2668: 0x5FE8, + 2669: 0x5FE9, + 2670: 0x5FEA, + 2671: 0x5FEC, + 2672: 0x5FED, + 2673: 0x5FEE, + 2674: 0x5FEF, + 2675: 0x5FF2, + 2676: 0x5FF3, + 2677: 0x5FF6, + 2678: 0x5FFA, + 2679: 0x5FFC, + 2680: 0x6007, + 2681: 0x600A, + 2682: 0x600D, + 2683: 0x6013, + 2684: 0x6014, + 2685: 0x6017, + 2686: 0x6018, + 2687: 0x601A, + 2688: 0x601F, + 2689: 0x6024, + 2690: 0x602D, + 2691: 0x6033, + 2692: 0x6035, + 2693: 0x6040, + 2694: 0x6047, + 2695: 0x6048, + 2696: 0x6049, + 2697: 0x604C, + 2698: 0x6051, + 2699: 0x6054, + 2700: 0x6056, + 2701: 0x6057, + 2702: 0x605D, + 2703: 0x6061, + 2704: 0x6067, + 2705: 0x6071, + 2706: 0x607E, + 2707: 0x607F, + 2708: 0x6082, + 2709: 0x6086, + 2710: 0x6088, + 2711: 0x608A, + 2712: 0x608E, + 2713: 0x6091, + 2714: 0x6093, + 2715: 0x6095, + 2716: 0x6098, + 2717: 0x609D, + 2718: 0x609E, + 2719: 0x60A2, + 2720: 0x60A4, + 2721: 0x60A5, + 2722: 0x60A8, + 2723: 0x60B0, + 2724: 0x60B1, + 2725: 0x60B7, + 2726: 0x60BB, + 2727: 0x60BE, + 2728: 0x60C2, + 2729: 0x60C4, + 2730: 0x60C8, + 2731: 0x60C9, + 2732: 0x60CA, + 2733: 0x60CB, + 2734: 0x60CE, + 2735: 0x60CF, + 2736: 0x60D4, + 2737: 0x60D5, + 2738: 0x60D9, + 2739: 0x60DB, + 2740: 0x60DD, + 2741: 0x60DE, + 2742: 0x60E2, + 2743: 0x60E5, + 2744: 0x60F2, + 2745: 0x60F5, + 2746: 0x60F8, + 2747: 0x60FC, + 2748: 0x60FD, + 2749: 0x6102, + 2750: 0x6107, + 2751: 0x610A, + 2752: 0x610C, + 2753: 0x6110, + 2754: 0x6111, + 2755: 0x6112, + 2756: 0x6113, + 2757: 0x6114, + 2758: 0x6116, + 2759: 0x6117, + 2760: 0x6119, + 2761: 0x611C, + 2762: 0x611E, + 2763: 0x6122, + 2764: 0x612A, + 2765: 0x612B, + 2766: 0x6130, + 2767: 0x6131, + 2768: 0x6135, + 2769: 0x6136, + 2770: 0x6137, + 2771: 0x6139, + 2772: 0x6141, + 2773: 0x6145, + 2774: 0x6146, + 2775: 0x6149, + 2776: 0x615E, + 2777: 0x6160, + 2778: 0x616C, + 2779: 0x6172, + 2780: 0x6178, + 2781: 0x617B, + 2782: 0x617C, + 2783: 0x617F, + 2784: 0x6180, + 2785: 0x6181, + 2786: 0x6183, + 2787: 0x6184, + 2788: 0x618B, + 2789: 0x618D, + 2790: 0x6192, + 2791: 0x6193, + 2792: 0x6197, + 2793: 0x6198, + 2794: 0x619C, + 2795: 0x619D, + 2796: 0x619F, + 2797: 0x61A0, + 2798: 0x61A5, + 2799: 0x61A8, + 2800: 0x61AA, + 2801: 0x61AD, + 2802: 0x61B8, + 2803: 0x61B9, + 2804: 0x61BC, + 2805: 0x61C0, + 2806: 0x61C1, + 2807: 0x61C2, + 2808: 0x61CE, + 2809: 0x61CF, + 2810: 0x61D5, + 2811: 0x61DC, + 2812: 0x61DD, + 2813: 0x61DE, + 2814: 0x61DF, + 2815: 0x61E1, + 2816: 0x61E2, + 2817: 0x61E7, + 2818: 0x61E9, + 2819: 0x61E5, + 2820: 0x61EC, + 2821: 0x61ED, + 2822: 0x61EF, + 2823: 0x6201, + 2824: 0x6203, + 2825: 0x6204, + 2826: 0x6207, + 2827: 0x6213, + 2828: 0x6215, + 2829: 0x621C, + 2830: 0x6220, + 2831: 0x6222, + 2832: 0x6223, + 2833: 0x6227, + 2834: 0x6229, + 2835: 0x622B, + 2836: 0x6239, + 2837: 0x623D, + 2838: 0x6242, + 2839: 0x6243, + 2840: 0x6244, + 2841: 0x6246, + 2842: 0x624C, + 2843: 0x6250, + 2844: 0x6251, + 2845: 0x6252, + 2846: 0x6254, + 2847: 0x6256, + 2848: 0x625A, + 2849: 0x625C, + 2850: 0x6264, + 2851: 0x626D, + 2852: 0x626F, + 2853: 0x6273, + 2854: 0x627A, + 2855: 0x627D, + 2856: 0x628D, + 2857: 0x628E, + 2858: 0x628F, + 2859: 0x6290, + 2860: 0x62A6, + 2861: 0x62A8, + 2862: 0x62B3, + 2863: 0x62B6, + 2864: 0x62B7, + 2865: 0x62BA, + 2866: 0x62BE, + 2867: 0x62BF, + 2868: 0x62C4, + 2869: 0x62CE, + 2870: 0x62D5, + 2871: 0x62D6, + 2872: 0x62DA, + 2873: 0x62EA, + 2874: 0x62F2, + 2875: 0x62F4, + 2876: 0x62FC, + 2877: 0x62FD, + 2878: 0x6303, + 2879: 0x6304, + 2880: 0x630A, + 2881: 0x630B, + 2882: 0x630D, + 2883: 0x6310, + 2884: 0x6313, + 2885: 0x6316, + 2886: 0x6318, + 2887: 0x6329, + 2888: 0x632A, + 2889: 0x632D, + 2890: 0x6335, + 2891: 0x6336, + 2892: 0x6339, + 2893: 0x633C, + 2894: 0x6341, + 2895: 0x6342, + 2896: 0x6343, + 2897: 0x6344, + 2898: 0x6346, + 2899: 0x634A, + 2900: 0x634B, + 2901: 0x634E, + 2902: 0x6352, + 2903: 0x6353, + 2904: 0x6354, + 2905: 0x6358, + 2906: 0x635B, + 2907: 0x6365, + 2908: 0x6366, + 2909: 0x636C, + 2910: 0x636D, + 2911: 0x6371, + 2912: 0x6374, + 2913: 0x6375, + 2914: 0x6378, + 2915: 0x637C, + 2916: 0x637D, + 2917: 0x637F, + 2918: 0x6382, + 2919: 0x6384, + 2920: 0x6387, + 2921: 0x638A, + 2922: 0x6390, + 2923: 0x6394, + 2924: 0x6395, + 2925: 0x6399, + 2926: 0x639A, + 2927: 0x639E, + 2928: 0x63A4, + 2929: 0x63A6, + 2930: 0x63AD, + 2931: 0x63AE, + 2932: 0x63AF, + 2933: 0x63BD, + 2934: 0x63C1, + 2935: 0x63C5, + 2936: 0x63C8, + 2937: 0x63CE, + 2938: 0x63D1, + 2939: 0x63D3, + 2940: 0x63D4, + 2941: 0x63D5, + 2942: 0x63DC, + 2943: 0x63E0, + 2944: 0x63E5, + 2945: 0x63EA, + 2946: 0x63EC, + 2947: 0x63F2, + 2948: 0x63F3, + 2949: 0x63F5, + 2950: 0x63F8, + 2951: 0x63F9, + 2952: 0x6409, + 2953: 0x640A, + 2954: 0x6410, + 2955: 0x6412, + 2956: 0x6414, + 2957: 0x6418, + 2958: 0x641E, + 2959: 0x6420, + 2960: 0x6422, + 2961: 0x6424, + 2962: 0x6425, + 2963: 0x6429, + 2964: 0x642A, + 2965: 0x642F, + 2966: 0x6430, + 2967: 0x6435, + 2968: 0x643D, + 2969: 0x643F, + 2970: 0x644B, + 2971: 0x644F, + 2972: 0x6451, + 2973: 0x6452, + 2974: 0x6453, + 2975: 0x6454, + 2976: 0x645A, + 2977: 0x645B, + 2978: 0x645C, + 2979: 0x645D, + 2980: 0x645F, + 2981: 0x6460, + 2982: 0x6461, + 2983: 0x6463, + 2984: 0x646D, + 2985: 0x6473, + 2986: 0x6474, + 2987: 0x647B, + 2988: 0x647D, + 2989: 0x6485, + 2990: 0x6487, + 2991: 0x648F, + 2992: 0x6490, + 2993: 0x6491, + 2994: 0x6498, + 2995: 0x6499, + 2996: 0x649B, + 2997: 0x649D, + 2998: 0x649F, + 2999: 0x64A1, + 3000: 0x64A3, + 3001: 0x64A6, + 3002: 0x64A8, + 3003: 0x64AC, + 3004: 0x64B3, + 3005: 0x64BD, + 3006: 0x64BE, + 3007: 0x64BF, + 3008: 0x64C4, + 3009: 0x64C9, + 3010: 0x64CA, + 3011: 0x64CB, + 3012: 0x64CC, + 3013: 0x64CE, + 3014: 0x64D0, + 3015: 0x64D1, + 3016: 0x64D5, + 3017: 0x64D7, + 3018: 0x64E4, + 3019: 0x64E5, + 3020: 0x64E9, + 3021: 0x64EA, + 3022: 0x64ED, + 3023: 0x64F0, + 3024: 0x64F5, + 3025: 0x64F7, + 3026: 0x64FB, + 3027: 0x64FF, + 3028: 0x6501, + 3029: 0x6504, + 3030: 0x6508, + 3031: 0x6509, + 3032: 0x650A, + 3033: 0x650F, + 3034: 0x6513, + 3035: 0x6514, + 3036: 0x6516, + 3037: 0x6519, + 3038: 0x651B, + 3039: 0x651E, + 3040: 0x651F, + 3041: 0x6522, + 3042: 0x6526, + 3043: 0x6529, + 3044: 0x652E, + 3045: 0x6531, + 3046: 0x653A, + 3047: 0x653C, + 3048: 0x653D, + 3049: 0x6543, + 3050: 0x6547, + 3051: 0x6549, + 3052: 0x6550, + 3053: 0x6552, + 3054: 0x6554, + 3055: 0x655F, + 3056: 0x6560, + 3057: 0x6567, + 3058: 0x656B, + 3059: 0x657A, + 3060: 0x657D, + 3061: 0x6581, + 3062: 0x6585, + 3063: 0x658A, + 3064: 0x6592, + 3065: 0x6595, + 3066: 0x6598, + 3067: 0x659D, + 3068: 0x65A0, + 3069: 0x65A3, + 3070: 0x65A6, + 3071: 0x65AE, + 3072: 0x65B2, + 3073: 0x65B3, + 3074: 0x65B4, + 3075: 0x65BF, + 3076: 0x65C2, + 3077: 0x65C8, + 3078: 0x65C9, + 3079: 0x65CE, + 3080: 0x65D0, + 3081: 0x65D4, + 3082: 0x65D6, + 3083: 0x65D8, + 3084: 0x65DF, + 3085: 0x65F0, + 3086: 0x65F2, + 3087: 0x65F4, + 3088: 0x65F5, + 3089: 0x65F9, + 3090: 0x65FE, + 3091: 0x65FF, + 3092: 0x6600, + 3093: 0x6604, + 3094: 0x6608, + 3095: 0x6609, + 3096: 0x660D, + 3097: 0x6611, + 3098: 0x6612, + 3099: 0x6615, + 3100: 0x6616, + 3101: 0x661D, + 3102: 0x661E, + 3103: 0x6621, + 3104: 0x6622, + 3105: 0x6623, + 3106: 0x6624, + 3107: 0x6626, + 3108: 0x6629, + 3109: 0x662A, + 3110: 0x662B, + 3111: 0x662C, + 3112: 0x662E, + 3113: 0x6630, + 3114: 0x6631, + 3115: 0x6633, + 3116: 0x6639, + 3117: 0x6637, + 3118: 0x6640, + 3119: 0x6645, + 3120: 0x6646, + 3121: 0x664A, + 3122: 0x664C, + 3123: 0x6651, + 3124: 0x664E, + 3125: 0x6657, + 3126: 0x6658, + 3127: 0x6659, + 3128: 0x665B, + 3129: 0x665C, + 3130: 0x6660, + 3131: 0x6661, + 3132: 0x66FB, + 3133: 0x666A, + 3134: 0x666B, + 3135: 0x666C, + 3136: 0x667E, + 3137: 0x6673, + 3138: 0x6675, + 3139: 0x667F, + 3140: 0x6677, + 3141: 0x6678, + 3142: 0x6679, + 3143: 0x667B, + 3144: 0x6680, + 3145: 0x667C, + 3146: 0x668B, + 3147: 0x668C, + 3148: 0x668D, + 3149: 0x6690, + 3150: 0x6692, + 3151: 0x6699, + 3152: 0x669A, + 3153: 0x669B, + 3154: 0x669C, + 3155: 0x669F, + 3156: 0x66A0, + 3157: 0x66A4, + 3158: 0x66AD, + 3159: 0x66B1, + 3160: 0x66B2, + 3161: 0x66B5, + 3162: 0x66BB, + 3163: 0x66BF, + 3164: 0x66C0, + 3165: 0x66C2, + 3166: 0x66C3, + 3167: 0x66C8, + 3168: 0x66CC, + 3169: 0x66CE, + 3170: 0x66CF, + 3171: 0x66D4, + 3172: 0x66DB, + 3173: 0x66DF, + 3174: 0x66E8, + 3175: 0x66EB, + 3176: 0x66EC, + 3177: 0x66EE, + 3178: 0x66FA, + 3179: 0x6705, + 3180: 0x6707, + 3181: 0x670E, + 3182: 0x6713, + 3183: 0x6719, + 3184: 0x671C, + 3185: 0x6720, + 3186: 0x6722, + 3187: 0x6733, + 3188: 0x673E, + 3189: 0x6745, + 3190: 0x6747, + 3191: 0x6748, + 3192: 0x674C, + 3193: 0x6754, + 3194: 0x6755, + 3195: 0x675D, + 3196: 0x6766, + 3197: 0x676C, + 3198: 0x676E, + 3199: 0x6774, + 3200: 0x6776, + 3201: 0x677B, + 3202: 0x6781, + 3203: 0x6784, + 3204: 0x678E, + 3205: 0x678F, + 3206: 0x6791, + 3207: 0x6793, + 3208: 0x6796, + 3209: 0x6798, + 3210: 0x6799, + 3211: 0x679B, + 3212: 0x67B0, + 3213: 0x67B1, + 3214: 0x67B2, + 3215: 0x67B5, + 3216: 0x67BB, + 3217: 0x67BC, + 3218: 0x67BD, + 3219: 0x67F9, + 3220: 0x67C0, + 3221: 0x67C2, + 3222: 0x67C3, + 3223: 0x67C5, + 3224: 0x67C8, + 3225: 0x67C9, + 3226: 0x67D2, + 3227: 0x67D7, + 3228: 0x67D9, + 3229: 0x67DC, + 3230: 0x67E1, + 3231: 0x67E6, + 3232: 0x67F0, + 3233: 0x67F2, + 3234: 0x67F6, + 3235: 0x67F7, + 3236: 0x6852, + 3237: 0x6814, + 3238: 0x6819, + 3239: 0x681D, + 3240: 0x681F, + 3241: 0x6828, + 3242: 0x6827, + 3243: 0x682C, + 3244: 0x682D, + 3245: 0x682F, + 3246: 0x6830, + 3247: 0x6831, + 3248: 0x6833, + 3249: 0x683B, + 3250: 0x683F, + 3251: 0x6844, + 3252: 0x6845, + 3253: 0x684A, + 3254: 0x684C, + 3255: 0x6855, + 3256: 0x6857, + 3257: 0x6858, + 3258: 0x685B, + 3259: 0x686B, + 3260: 0x686E, + 3261: 0x686F, + 3262: 0x6870, + 3263: 0x6871, + 3264: 0x6872, + 3265: 0x6875, + 3266: 0x6879, + 3267: 0x687A, + 3268: 0x687B, + 3269: 0x687C, + 3270: 0x6882, + 3271: 0x6884, + 3272: 0x6886, + 3273: 0x6888, + 3274: 0x6896, + 3275: 0x6898, + 3276: 0x689A, + 3277: 0x689C, + 3278: 0x68A1, + 3279: 0x68A3, + 3280: 0x68A5, + 3281: 0x68A9, + 3282: 0x68AA, + 3283: 0x68AE, + 3284: 0x68B2, + 3285: 0x68BB, + 3286: 0x68C5, + 3287: 0x68C8, + 3288: 0x68CC, + 3289: 0x68CF, + 3290: 0x68D0, + 3291: 0x68D1, + 3292: 0x68D3, + 3293: 0x68D6, + 3294: 0x68D9, + 3295: 0x68DC, + 3296: 0x68DD, + 3297: 0x68E5, + 3298: 0x68E8, + 3299: 0x68EA, + 3300: 0x68EB, + 3301: 0x68EC, + 3302: 0x68ED, + 3303: 0x68F0, + 3304: 0x68F1, + 3305: 0x68F5, + 3306: 0x68F6, + 3307: 0x68FB, + 3308: 0x68FC, + 3309: 0x68FD, + 3310: 0x6906, + 3311: 0x6909, + 3312: 0x690A, + 3313: 0x6910, + 3314: 0x6911, + 3315: 0x6913, + 3316: 0x6916, + 3317: 0x6917, + 3318: 0x6931, + 3319: 0x6933, + 3320: 0x6935, + 3321: 0x6938, + 3322: 0x693B, + 3323: 0x6942, + 3324: 0x6945, + 3325: 0x6949, + 3326: 0x694E, + 3327: 0x6957, + 3328: 0x695B, + 3329: 0x6963, + 3330: 0x6964, + 3331: 0x6965, + 3332: 0x6966, + 3333: 0x6968, + 3334: 0x6969, + 3335: 0x696C, + 3336: 0x6970, + 3337: 0x6971, + 3338: 0x6972, + 3339: 0x697A, + 3340: 0x697B, + 3341: 0x697F, + 3342: 0x6980, + 3343: 0x698D, + 3344: 0x6992, + 3345: 0x6996, + 3346: 0x6998, + 3347: 0x69A1, + 3348: 0x69A5, + 3349: 0x69A6, + 3350: 0x69A8, + 3351: 0x69AB, + 3352: 0x69AD, + 3353: 0x69AF, + 3354: 0x69B7, + 3355: 0x69B8, + 3356: 0x69BA, + 3357: 0x69BC, + 3358: 0x69C5, + 3359: 0x69C8, + 3360: 0x69D1, + 3361: 0x69D6, + 3362: 0x69D7, + 3363: 0x69E2, + 3364: 0x69E5, + 3365: 0x69EE, + 3366: 0x69EF, + 3367: 0x69F1, + 3368: 0x69F3, + 3369: 0x69F5, + 3370: 0x69FE, + 3371: 0x6A00, + 3372: 0x6A01, + 3373: 0x6A03, + 3374: 0x6A0F, + 3375: 0x6A11, + 3376: 0x6A15, + 3377: 0x6A1A, + 3378: 0x6A1D, + 3379: 0x6A20, + 3380: 0x6A24, + 3381: 0x6A28, + 3382: 0x6A30, + 3383: 0x6A32, + 3384: 0x6A34, + 3385: 0x6A37, + 3386: 0x6A3B, + 3387: 0x6A3E, + 3388: 0x6A3F, + 3389: 0x6A45, + 3390: 0x6A46, + 3391: 0x6A49, + 3392: 0x6A4A, + 3393: 0x6A4E, + 3394: 0x6A50, + 3395: 0x6A51, + 3396: 0x6A52, + 3397: 0x6A55, + 3398: 0x6A56, + 3399: 0x6A5B, + 3400: 0x6A64, + 3401: 0x6A67, + 3402: 0x6A6A, + 3403: 0x6A71, + 3404: 0x6A73, + 3405: 0x6A7E, + 3406: 0x6A81, + 3407: 0x6A83, + 3408: 0x6A86, + 3409: 0x6A87, + 3410: 0x6A89, + 3411: 0x6A8B, + 3412: 0x6A91, + 3413: 0x6A9B, + 3414: 0x6A9D, + 3415: 0x6A9E, + 3416: 0x6A9F, + 3417: 0x6AA5, + 3418: 0x6AAB, + 3419: 0x6AAF, + 3420: 0x6AB0, + 3421: 0x6AB1, + 3422: 0x6AB4, + 3423: 0x6ABD, + 3424: 0x6ABE, + 3425: 0x6ABF, + 3426: 0x6AC6, + 3427: 0x6AC9, + 3428: 0x6AC8, + 3429: 0x6ACC, + 3430: 0x6AD0, + 3431: 0x6AD4, + 3432: 0x6AD5, + 3433: 0x6AD6, + 3434: 0x6ADC, + 3435: 0x6ADD, + 3436: 0x6AE4, + 3437: 0x6AE7, + 3438: 0x6AEC, + 3439: 0x6AF0, + 3440: 0x6AF1, + 3441: 0x6AF2, + 3442: 0x6AFC, + 3443: 0x6AFD, + 3444: 0x6B02, + 3445: 0x6B03, + 3446: 0x6B06, + 3447: 0x6B07, + 3448: 0x6B09, + 3449: 0x6B0F, + 3450: 0x6B10, + 3451: 0x6B11, + 3452: 0x6B17, + 3453: 0x6B1B, + 3454: 0x6B1E, + 3455: 0x6B24, + 3456: 0x6B28, + 3457: 0x6B2B, + 3458: 0x6B2C, + 3459: 0x6B2F, + 3460: 0x6B35, + 3461: 0x6B36, + 3462: 0x6B3B, + 3463: 0x6B3F, + 3464: 0x6B46, + 3465: 0x6B4A, + 3466: 0x6B4D, + 3467: 0x6B52, + 3468: 0x6B56, + 3469: 0x6B58, + 3470: 0x6B5D, + 3471: 0x6B60, + 3472: 0x6B67, + 3473: 0x6B6B, + 3474: 0x6B6E, + 3475: 0x6B70, + 3476: 0x6B75, + 3477: 0x6B7D, + 3478: 0x6B7E, + 3479: 0x6B82, + 3480: 0x6B85, + 3481: 0x6B97, + 3482: 0x6B9B, + 3483: 0x6B9F, + 3484: 0x6BA0, + 3485: 0x6BA2, + 3486: 0x6BA3, + 3487: 0x6BA8, + 3488: 0x6BA9, + 3489: 0x6BAC, + 3490: 0x6BAD, + 3491: 0x6BAE, + 3492: 0x6BB0, + 3493: 0x6BB8, + 3494: 0x6BB9, + 3495: 0x6BBD, + 3496: 0x6BBE, + 3497: 0x6BC3, + 3498: 0x6BC4, + 3499: 0x6BC9, + 3500: 0x6BCC, + 3501: 0x6BD6, + 3502: 0x6BDA, + 3503: 0x6BE1, + 3504: 0x6BE3, + 3505: 0x6BE6, + 3506: 0x6BE7, + 3507: 0x6BEE, + 3508: 0x6BF1, + 3509: 0x6BF7, + 3510: 0x6BF9, + 3511: 0x6BFF, + 3512: 0x6C02, + 3513: 0x6C04, + 3514: 0x6C05, + 3515: 0x6C09, + 3516: 0x6C0D, + 3517: 0x6C0E, + 3518: 0x6C10, + 3519: 0x6C12, + 3520: 0x6C19, + 3521: 0x6C1F, + 3522: 0x6C26, + 3523: 0x6C27, + 3524: 0x6C28, + 3525: 0x6C2C, + 3526: 0x6C2E, + 3527: 0x6C33, + 3528: 0x6C35, + 3529: 0x6C36, + 3530: 0x6C3A, + 3531: 0x6C3B, + 3532: 0x6C3F, + 3533: 0x6C4A, + 3534: 0x6C4B, + 3535: 0x6C4D, + 3536: 0x6C4F, + 3537: 0x6C52, + 3538: 0x6C54, + 3539: 0x6C59, + 3540: 0x6C5B, + 3541: 0x6C5C, + 3542: 0x6C6B, + 3543: 0x6C6D, + 3544: 0x6C6F, + 3545: 0x6C74, + 3546: 0x6C76, + 3547: 0x6C78, + 3548: 0x6C79, + 3549: 0x6C7B, + 3550: 0x6C85, + 3551: 0x6C86, + 3552: 0x6C87, + 3553: 0x6C89, + 3554: 0x6C94, + 3555: 0x6C95, + 3556: 0x6C97, + 3557: 0x6C98, + 3558: 0x6C9C, + 3559: 0x6C9F, + 3560: 0x6CB0, + 3561: 0x6CB2, + 3562: 0x6CB4, + 3563: 0x6CC2, + 3564: 0x6CC6, + 3565: 0x6CCD, + 3566: 0x6CCF, + 3567: 0x6CD0, + 3568: 0x6CD1, + 3569: 0x6CD2, + 3570: 0x6CD4, + 3571: 0x6CD6, + 3572: 0x6CDA, + 3573: 0x6CDC, + 3574: 0x6CE0, + 3575: 0x6CE7, + 3576: 0x6CE9, + 3577: 0x6CEB, + 3578: 0x6CEC, + 3579: 0x6CEE, + 3580: 0x6CF2, + 3581: 0x6CF4, + 3582: 0x6D04, + 3583: 0x6D07, + 3584: 0x6D0A, + 3585: 0x6D0E, + 3586: 0x6D0F, + 3587: 0x6D11, + 3588: 0x6D13, + 3589: 0x6D1A, + 3590: 0x6D26, + 3591: 0x6D27, + 3592: 0x6D28, + 3593: 0x6C67, + 3594: 0x6D2E, + 3595: 0x6D2F, + 3596: 0x6D31, + 3597: 0x6D39, + 3598: 0x6D3C, + 3599: 0x6D3F, + 3600: 0x6D57, + 3601: 0x6D5E, + 3602: 0x6D5F, + 3603: 0x6D61, + 3604: 0x6D65, + 3605: 0x6D67, + 3606: 0x6D6F, + 3607: 0x6D70, + 3608: 0x6D7C, + 3609: 0x6D82, + 3610: 0x6D87, + 3611: 0x6D91, + 3612: 0x6D92, + 3613: 0x6D94, + 3614: 0x6D96, + 3615: 0x6D97, + 3616: 0x6D98, + 3617: 0x6DAA, + 3618: 0x6DAC, + 3619: 0x6DB4, + 3620: 0x6DB7, + 3621: 0x6DB9, + 3622: 0x6DBD, + 3623: 0x6DBF, + 3624: 0x6DC4, + 3625: 0x6DC8, + 3626: 0x6DCA, + 3627: 0x6DCE, + 3628: 0x6DCF, + 3629: 0x6DD6, + 3630: 0x6DDB, + 3631: 0x6DDD, + 3632: 0x6DDF, + 3633: 0x6DE0, + 3634: 0x6DE2, + 3635: 0x6DE5, + 3636: 0x6DE9, + 3637: 0x6DEF, + 3638: 0x6DF0, + 3639: 0x6DF4, + 3640: 0x6DF6, + 3641: 0x6DFC, + 3642: 0x6E00, + 3643: 0x6E04, + 3644: 0x6E1E, + 3645: 0x6E22, + 3646: 0x6E27, + 3647: 0x6E32, + 3648: 0x6E36, + 3649: 0x6E39, + 3650: 0x6E3B, + 3651: 0x6E3C, + 3652: 0x6E44, + 3653: 0x6E45, + 3654: 0x6E48, + 3655: 0x6E49, + 3656: 0x6E4B, + 3657: 0x6E4F, + 3658: 0x6E51, + 3659: 0x6E52, + 3660: 0x6E53, + 3661: 0x6E54, + 3662: 0x6E57, + 3663: 0x6E5C, + 3664: 0x6E5D, + 3665: 0x6E5E, + 3666: 0x6E62, + 3667: 0x6E63, + 3668: 0x6E68, + 3669: 0x6E73, + 3670: 0x6E7B, + 3671: 0x6E7D, + 3672: 0x6E8D, + 3673: 0x6E93, + 3674: 0x6E99, + 3675: 0x6EA0, + 3676: 0x6EA7, + 3677: 0x6EAD, + 3678: 0x6EAE, + 3679: 0x6EB1, + 3680: 0x6EB3, + 3681: 0x6EBB, + 3682: 0x6EBF, + 3683: 0x6EC0, + 3684: 0x6EC1, + 3685: 0x6EC3, + 3686: 0x6EC7, + 3687: 0x6EC8, + 3688: 0x6ECA, + 3689: 0x6ECD, + 3690: 0x6ECE, + 3691: 0x6ECF, + 3692: 0x6EEB, + 3693: 0x6EED, + 3694: 0x6EEE, + 3695: 0x6EF9, + 3696: 0x6EFB, + 3697: 0x6EFD, + 3698: 0x6F04, + 3699: 0x6F08, + 3700: 0x6F0A, + 3701: 0x6F0C, + 3702: 0x6F0D, + 3703: 0x6F16, + 3704: 0x6F18, + 3705: 0x6F1A, + 3706: 0x6F1B, + 3707: 0x6F26, + 3708: 0x6F29, + 3709: 0x6F2A, + 3710: 0x6F2F, + 3711: 0x6F30, + 3712: 0x6F33, + 3713: 0x6F36, + 3714: 0x6F3B, + 3715: 0x6F3C, + 3716: 0x6F2D, + 3717: 0x6F4F, + 3718: 0x6F51, + 3719: 0x6F52, + 3720: 0x6F53, + 3721: 0x6F57, + 3722: 0x6F59, + 3723: 0x6F5A, + 3724: 0x6F5D, + 3725: 0x6F5E, + 3726: 0x6F61, + 3727: 0x6F62, + 3728: 0x6F68, + 3729: 0x6F6C, + 3730: 0x6F7D, + 3731: 0x6F7E, + 3732: 0x6F83, + 3733: 0x6F87, + 3734: 0x6F88, + 3735: 0x6F8B, + 3736: 0x6F8C, + 3737: 0x6F8D, + 3738: 0x6F90, + 3739: 0x6F92, + 3740: 0x6F93, + 3741: 0x6F94, + 3742: 0x6F96, + 3743: 0x6F9A, + 3744: 0x6F9F, + 3745: 0x6FA0, + 3746: 0x6FA5, + 3747: 0x6FA6, + 3748: 0x6FA7, + 3749: 0x6FA8, + 3750: 0x6FAE, + 3751: 0x6FAF, + 3752: 0x6FB0, + 3753: 0x6FB5, + 3754: 0x6FB6, + 3755: 0x6FBC, + 3756: 0x6FC5, + 3757: 0x6FC7, + 3758: 0x6FC8, + 3759: 0x6FCA, + 3760: 0x6FDA, + 3761: 0x6FDE, + 3762: 0x6FE8, + 3763: 0x6FE9, + 3764: 0x6FF0, + 3765: 0x6FF5, + 3766: 0x6FF9, + 3767: 0x6FFC, + 3768: 0x6FFD, + 3769: 0x7000, + 3770: 0x7005, + 3771: 0x7006, + 3772: 0x7007, + 3773: 0x700D, + 3774: 0x7017, + 3775: 0x7020, + 3776: 0x7023, + 3777: 0x702F, + 3778: 0x7034, + 3779: 0x7037, + 3780: 0x7039, + 3781: 0x703C, + 3782: 0x7043, + 3783: 0x7044, + 3784: 0x7048, + 3785: 0x7049, + 3786: 0x704A, + 3787: 0x704B, + 3788: 0x7054, + 3789: 0x7055, + 3790: 0x705D, + 3791: 0x705E, + 3792: 0x704E, + 3793: 0x7064, + 3794: 0x7065, + 3795: 0x706C, + 3796: 0x706E, + 3797: 0x7075, + 3798: 0x7076, + 3799: 0x707E, + 3800: 0x7081, + 3801: 0x7085, + 3802: 0x7086, + 3803: 0x7094, + 3804: 0x7095, + 3805: 0x7096, + 3806: 0x7097, + 3807: 0x7098, + 3808: 0x709B, + 3809: 0x70A4, + 3810: 0x70AB, + 3811: 0x70B0, + 3812: 0x70B1, + 3813: 0x70B4, + 3814: 0x70B7, + 3815: 0x70CA, + 3816: 0x70D1, + 3817: 0x70D3, + 3818: 0x70D4, + 3819: 0x70D5, + 3820: 0x70D6, + 3821: 0x70D8, + 3822: 0x70DC, + 3823: 0x70E4, + 3824: 0x70FA, + 3825: 0x7103, + 3826: 0x7104, + 3827: 0x7105, + 3828: 0x7106, + 3829: 0x7107, + 3830: 0x710B, + 3831: 0x710C, + 3832: 0x710F, + 3833: 0x711E, + 3834: 0x7120, + 3835: 0x712B, + 3836: 0x712D, + 3837: 0x712F, + 3838: 0x7130, + 3839: 0x7131, + 3840: 0x7138, + 3841: 0x7141, + 3842: 0x7145, + 3843: 0x7146, + 3844: 0x7147, + 3845: 0x714A, + 3846: 0x714B, + 3847: 0x7150, + 3848: 0x7152, + 3849: 0x7157, + 3850: 0x715A, + 3851: 0x715C, + 3852: 0x715E, + 3853: 0x7160, + 3854: 0x7168, + 3855: 0x7179, + 3856: 0x7180, + 3857: 0x7185, + 3858: 0x7187, + 3859: 0x718C, + 3860: 0x7192, + 3861: 0x719A, + 3862: 0x719B, + 3863: 0x71A0, + 3864: 0x71A2, + 3865: 0x71AF, + 3866: 0x71B0, + 3867: 0x71B2, + 3868: 0x71B3, + 3869: 0x71BA, + 3870: 0x71BF, + 3871: 0x71C0, + 3872: 0x71C1, + 3873: 0x71C4, + 3874: 0x71CB, + 3875: 0x71CC, + 3876: 0x71D3, + 3877: 0x71D6, + 3878: 0x71D9, + 3879: 0x71DA, + 3880: 0x71DC, + 3881: 0x71F8, + 3882: 0x71FE, + 3883: 0x7200, + 3884: 0x7207, + 3885: 0x7208, + 3886: 0x7209, + 3887: 0x7213, + 3888: 0x7217, + 3889: 0x721A, + 3890: 0x721D, + 3891: 0x721F, + 3892: 0x7224, + 3893: 0x722B, + 3894: 0x722F, + 3895: 0x7234, + 3896: 0x7238, + 3897: 0x7239, + 3898: 0x7241, + 3899: 0x7242, + 3900: 0x7243, + 3901: 0x7245, + 3902: 0x724E, + 3903: 0x724F, + 3904: 0x7250, + 3905: 0x7253, + 3906: 0x7255, + 3907: 0x7256, + 3908: 0x725A, + 3909: 0x725C, + 3910: 0x725E, + 3911: 0x7260, + 3912: 0x7263, + 3913: 0x7268, + 3914: 0x726B, + 3915: 0x726E, + 3916: 0x726F, + 3917: 0x7271, + 3918: 0x7277, + 3919: 0x7278, + 3920: 0x727B, + 3921: 0x727C, + 3922: 0x727F, + 3923: 0x7284, + 3924: 0x7289, + 3925: 0x728D, + 3926: 0x728E, + 3927: 0x7293, + 3928: 0x729B, + 3929: 0x72A8, + 3930: 0x72AD, + 3931: 0x72AE, + 3932: 0x72B1, + 3933: 0x72B4, + 3934: 0x72BE, + 3935: 0x72C1, + 3936: 0x72C7, + 3937: 0x72C9, + 3938: 0x72CC, + 3939: 0x72D5, + 3940: 0x72D6, + 3941: 0x72D8, + 3942: 0x72DF, + 3943: 0x72E5, + 3944: 0x72F3, + 3945: 0x72F4, + 3946: 0x72FA, + 3947: 0x72FB, + 3948: 0x72FE, + 3949: 0x7302, + 3950: 0x7304, + 3951: 0x7305, + 3952: 0x7307, + 3953: 0x730B, + 3954: 0x730D, + 3955: 0x7312, + 3956: 0x7313, + 3957: 0x7318, + 3958: 0x7319, + 3959: 0x731E, + 3960: 0x7322, + 3961: 0x7324, + 3962: 0x7327, + 3963: 0x7328, + 3964: 0x732C, + 3965: 0x7331, + 3966: 0x7332, + 3967: 0x7335, + 3968: 0x733A, + 3969: 0x733B, + 3970: 0x733D, + 3971: 0x7343, + 3972: 0x734D, + 3973: 0x7350, + 3974: 0x7352, + 3975: 0x7356, + 3976: 0x7358, + 3977: 0x735D, + 3978: 0x735E, + 3979: 0x735F, + 3980: 0x7360, + 3981: 0x7366, + 3982: 0x7367, + 3983: 0x7369, + 3984: 0x736B, + 3985: 0x736C, + 3986: 0x736E, + 3987: 0x736F, + 3988: 0x7371, + 3989: 0x7377, + 3990: 0x7379, + 3991: 0x737C, + 3992: 0x7380, + 3993: 0x7381, + 3994: 0x7383, + 3995: 0x7385, + 3996: 0x7386, + 3997: 0x738E, + 3998: 0x7390, + 3999: 0x7393, + 4000: 0x7395, + 4001: 0x7397, + 4002: 0x7398, + 4003: 0x739C, + 4004: 0x739E, + 4005: 0x739F, + 4006: 0x73A0, + 4007: 0x73A2, + 4008: 0x73A5, + 4009: 0x73A6, + 4010: 0x73AA, + 4011: 0x73AB, + 4012: 0x73AD, + 4013: 0x73B5, + 4014: 0x73B7, + 4015: 0x73B9, + 4016: 0x73BC, + 4017: 0x73BD, + 4018: 0x73BF, + 4019: 0x73C5, + 4020: 0x73C6, + 4021: 0x73C9, + 4022: 0x73CB, + 4023: 0x73CC, + 4024: 0x73CF, + 4025: 0x73D2, + 4026: 0x73D3, + 4027: 0x73D6, + 4028: 0x73D9, + 4029: 0x73DD, + 4030: 0x73E1, + 4031: 0x73E3, + 4032: 0x73E6, + 4033: 0x73E7, + 4034: 0x73E9, + 4035: 0x73F4, + 4036: 0x73F5, + 4037: 0x73F7, + 4038: 0x73F9, + 4039: 0x73FA, + 4040: 0x73FB, + 4041: 0x73FD, + 4042: 0x73FF, + 4043: 0x7400, + 4044: 0x7401, + 4045: 0x7404, + 4046: 0x7407, + 4047: 0x740A, + 4048: 0x7411, + 4049: 0x741A, + 4050: 0x741B, + 4051: 0x7424, + 4052: 0x7426, + 4053: 0x7428, + 4054: 0x7429, + 4055: 0x742A, + 4056: 0x742B, + 4057: 0x742C, + 4058: 0x742D, + 4059: 0x742E, + 4060: 0x742F, + 4061: 0x7430, + 4062: 0x7431, + 4063: 0x7439, + 4064: 0x7440, + 4065: 0x7443, + 4066: 0x7444, + 4067: 0x7446, + 4068: 0x7447, + 4069: 0x744B, + 4070: 0x744D, + 4071: 0x7451, + 4072: 0x7452, + 4073: 0x7457, + 4074: 0x745D, + 4075: 0x7462, + 4076: 0x7466, + 4077: 0x7467, + 4078: 0x7468, + 4079: 0x746B, + 4080: 0x746D, + 4081: 0x746E, + 4082: 0x7471, + 4083: 0x7472, + 4084: 0x7480, + 4085: 0x7481, + 4086: 0x7485, + 4087: 0x7486, + 4088: 0x7487, + 4089: 0x7489, + 4090: 0x748F, + 4091: 0x7490, + 4092: 0x7491, + 4093: 0x7492, + 4094: 0x7498, + 4095: 0x7499, + 4096: 0x749A, + 4097: 0x749C, + 4098: 0x749F, + 4099: 0x74A0, + 4100: 0x74A1, + 4101: 0x74A3, + 4102: 0x74A6, + 4103: 0x74A8, + 4104: 0x74A9, + 4105: 0x74AA, + 4106: 0x74AB, + 4107: 0x74AE, + 4108: 0x74AF, + 4109: 0x74B1, + 4110: 0x74B2, + 4111: 0x74B5, + 4112: 0x74B9, + 4113: 0x74BB, + 4114: 0x74BF, + 4115: 0x74C8, + 4116: 0x74C9, + 4117: 0x74CC, + 4118: 0x74D0, + 4119: 0x74D3, + 4120: 0x74D8, + 4121: 0x74DA, + 4122: 0x74DB, + 4123: 0x74DE, + 4124: 0x74DF, + 4125: 0x74E4, + 4126: 0x74E8, + 4127: 0x74EA, + 4128: 0x74EB, + 4129: 0x74EF, + 4130: 0x74F4, + 4131: 0x74FA, + 4132: 0x74FB, + 4133: 0x74FC, + 4134: 0x74FF, + 4135: 0x7506, + 4136: 0x7512, + 4137: 0x7516, + 4138: 0x7517, + 4139: 0x7520, + 4140: 0x7521, + 4141: 0x7524, + 4142: 0x7527, + 4143: 0x7529, + 4144: 0x752A, + 4145: 0x752F, + 4146: 0x7536, + 4147: 0x7539, + 4148: 0x753D, + 4149: 0x753E, + 4150: 0x753F, + 4151: 0x7540, + 4152: 0x7543, + 4153: 0x7547, + 4154: 0x7548, + 4155: 0x754E, + 4156: 0x7550, + 4157: 0x7552, + 4158: 0x7557, + 4159: 0x755E, + 4160: 0x755F, + 4161: 0x7561, + 4162: 0x756F, + 4163: 0x7571, + 4164: 0x7579, + 4165: 0x757A, + 4166: 0x757B, + 4167: 0x757C, + 4168: 0x757D, + 4169: 0x757E, + 4170: 0x7581, + 4171: 0x7585, + 4172: 0x7590, + 4173: 0x7592, + 4174: 0x7593, + 4175: 0x7595, + 4176: 0x7599, + 4177: 0x759C, + 4178: 0x75A2, + 4179: 0x75A4, + 4180: 0x75B4, + 4181: 0x75BA, + 4182: 0x75BF, + 4183: 0x75C0, + 4184: 0x75C1, + 4185: 0x75C4, + 4186: 0x75C6, + 4187: 0x75CC, + 4188: 0x75CE, + 4189: 0x75CF, + 4190: 0x75D7, + 4191: 0x75DC, + 4192: 0x75DF, + 4193: 0x75E0, + 4194: 0x75E1, + 4195: 0x75E4, + 4196: 0x75E7, + 4197: 0x75EC, + 4198: 0x75EE, + 4199: 0x75EF, + 4200: 0x75F1, + 4201: 0x75F9, + 4202: 0x7600, + 4203: 0x7602, + 4204: 0x7603, + 4205: 0x7604, + 4206: 0x7607, + 4207: 0x7608, + 4208: 0x760A, + 4209: 0x760C, + 4210: 0x760F, + 4211: 0x7612, + 4212: 0x7613, + 4213: 0x7615, + 4214: 0x7616, + 4215: 0x7619, + 4216: 0x761B, + 4217: 0x761C, + 4218: 0x761D, + 4219: 0x761E, + 4220: 0x7623, + 4221: 0x7625, + 4222: 0x7626, + 4223: 0x7629, + 4224: 0x762D, + 4225: 0x7632, + 4226: 0x7633, + 4227: 0x7635, + 4228: 0x7638, + 4229: 0x7639, + 4230: 0x763A, + 4231: 0x763C, + 4232: 0x764A, + 4233: 0x7640, + 4234: 0x7641, + 4235: 0x7643, + 4236: 0x7644, + 4237: 0x7645, + 4238: 0x7649, + 4239: 0x764B, + 4240: 0x7655, + 4241: 0x7659, + 4242: 0x765F, + 4243: 0x7664, + 4244: 0x7665, + 4245: 0x766D, + 4246: 0x766E, + 4247: 0x766F, + 4248: 0x7671, + 4249: 0x7674, + 4250: 0x7681, + 4251: 0x7685, + 4252: 0x768C, + 4253: 0x768D, + 4254: 0x7695, + 4255: 0x769B, + 4256: 0x769C, + 4257: 0x769D, + 4258: 0x769F, + 4259: 0x76A0, + 4260: 0x76A2, + 4261: 0x76A3, + 4262: 0x76A4, + 4263: 0x76A5, + 4264: 0x76A6, + 4265: 0x76A7, + 4266: 0x76A8, + 4267: 0x76AA, + 4268: 0x76AD, + 4269: 0x76BD, + 4270: 0x76C1, + 4271: 0x76C5, + 4272: 0x76C9, + 4273: 0x76CB, + 4274: 0x76CC, + 4275: 0x76CE, + 4276: 0x76D4, + 4277: 0x76D9, + 4278: 0x76E0, + 4279: 0x76E6, + 4280: 0x76E8, + 4281: 0x76EC, + 4282: 0x76F0, + 4283: 0x76F1, + 4284: 0x76F6, + 4285: 0x76F9, + 4286: 0x76FC, + 4287: 0x7700, + 4288: 0x7706, + 4289: 0x770A, + 4290: 0x770E, + 4291: 0x7712, + 4292: 0x7714, + 4293: 0x7715, + 4294: 0x7717, + 4295: 0x7719, + 4296: 0x771A, + 4297: 0x771C, + 4298: 0x7722, + 4299: 0x7728, + 4300: 0x772D, + 4301: 0x772E, + 4302: 0x772F, + 4303: 0x7734, + 4304: 0x7735, + 4305: 0x7736, + 4306: 0x7739, + 4307: 0x773D, + 4308: 0x773E, + 4309: 0x7742, + 4310: 0x7745, + 4311: 0x7746, + 4312: 0x774A, + 4313: 0x774D, + 4314: 0x774E, + 4315: 0x774F, + 4316: 0x7752, + 4317: 0x7756, + 4318: 0x7757, + 4319: 0x775C, + 4320: 0x775E, + 4321: 0x775F, + 4322: 0x7760, + 4323: 0x7762, + 4324: 0x7764, + 4325: 0x7767, + 4326: 0x776A, + 4327: 0x776C, + 4328: 0x7770, + 4329: 0x7772, + 4330: 0x7773, + 4331: 0x7774, + 4332: 0x777A, + 4333: 0x777D, + 4334: 0x7780, + 4335: 0x7784, + 4336: 0x778C, + 4337: 0x778D, + 4338: 0x7794, + 4339: 0x7795, + 4340: 0x7796, + 4341: 0x779A, + 4342: 0x779F, + 4343: 0x77A2, + 4344: 0x77A7, + 4345: 0x77AA, + 4346: 0x77AE, + 4347: 0x77AF, + 4348: 0x77B1, + 4349: 0x77B5, + 4350: 0x77BE, + 4351: 0x77C3, + 4352: 0x77C9, + 4353: 0x77D1, + 4354: 0x77D2, + 4355: 0x77D5, + 4356: 0x77D9, + 4357: 0x77DE, + 4358: 0x77DF, + 4359: 0x77E0, + 4360: 0x77E4, + 4361: 0x77E6, + 4362: 0x77EA, + 4363: 0x77EC, + 4364: 0x77F0, + 4365: 0x77F1, + 4366: 0x77F4, + 4367: 0x77F8, + 4368: 0x77FB, + 4369: 0x7805, + 4370: 0x7806, + 4371: 0x7809, + 4372: 0x780D, + 4373: 0x780E, + 4374: 0x7811, + 4375: 0x781D, + 4376: 0x7821, + 4377: 0x7822, + 4378: 0x7823, + 4379: 0x782D, + 4380: 0x782E, + 4381: 0x7830, + 4382: 0x7835, + 4383: 0x7837, + 4384: 0x7843, + 4385: 0x7844, + 4386: 0x7847, + 4387: 0x7848, + 4388: 0x784C, + 4389: 0x784E, + 4390: 0x7852, + 4391: 0x785C, + 4392: 0x785E, + 4393: 0x7860, + 4394: 0x7861, + 4395: 0x7863, + 4396: 0x7864, + 4397: 0x7868, + 4398: 0x786A, + 4399: 0x786E, + 4400: 0x787A, + 4401: 0x787E, + 4402: 0x788A, + 4403: 0x788F, + 4404: 0x7894, + 4405: 0x7898, + 4406: 0x78A1, + 4407: 0x789D, + 4408: 0x789E, + 4409: 0x789F, + 4410: 0x78A4, + 4411: 0x78A8, + 4412: 0x78AC, + 4413: 0x78AD, + 4414: 0x78B0, + 4415: 0x78B1, + 4416: 0x78B2, + 4417: 0x78B3, + 4418: 0x78BB, + 4419: 0x78BD, + 4420: 0x78BF, + 4421: 0x78C7, + 4422: 0x78C8, + 4423: 0x78C9, + 4424: 0x78CC, + 4425: 0x78CE, + 4426: 0x78D2, + 4427: 0x78D3, + 4428: 0x78D5, + 4429: 0x78D6, + 4430: 0x78E4, + 4431: 0x78DB, + 4432: 0x78DF, + 4433: 0x78E0, + 4434: 0x78E1, + 4435: 0x78E6, + 4436: 0x78EA, + 4437: 0x78F2, + 4438: 0x78F3, + 4439: 0x7900, + 4440: 0x78F6, + 4441: 0x78F7, + 4442: 0x78FA, + 4443: 0x78FB, + 4444: 0x78FF, + 4445: 0x7906, + 4446: 0x790C, + 4447: 0x7910, + 4448: 0x791A, + 4449: 0x791C, + 4450: 0x791E, + 4451: 0x791F, + 4452: 0x7920, + 4453: 0x7925, + 4454: 0x7927, + 4455: 0x7929, + 4456: 0x792D, + 4457: 0x7931, + 4458: 0x7934, + 4459: 0x7935, + 4460: 0x793B, + 4461: 0x793D, + 4462: 0x793F, + 4463: 0x7944, + 4464: 0x7945, + 4465: 0x7946, + 4466: 0x794A, + 4467: 0x794B, + 4468: 0x794F, + 4469: 0x7951, + 4470: 0x7954, + 4471: 0x7958, + 4472: 0x795B, + 4473: 0x795C, + 4474: 0x7967, + 4475: 0x7969, + 4476: 0x796B, + 4477: 0x7972, + 4478: 0x7979, + 4479: 0x797B, + 4480: 0x797C, + 4481: 0x797E, + 4482: 0x798B, + 4483: 0x798C, + 4484: 0x7991, + 4485: 0x7993, + 4486: 0x7994, + 4487: 0x7995, + 4488: 0x7996, + 4489: 0x7998, + 4490: 0x799B, + 4491: 0x799C, + 4492: 0x79A1, + 4493: 0x79A8, + 4494: 0x79A9, + 4495: 0x79AB, + 4496: 0x79AF, + 4497: 0x79B1, + 4498: 0x79B4, + 4499: 0x79B8, + 4500: 0x79BB, + 4501: 0x79C2, + 4502: 0x79C4, + 4503: 0x79C7, + 4504: 0x79C8, + 4505: 0x79CA, + 4506: 0x79CF, + 4507: 0x79D4, + 4508: 0x79D6, + 4509: 0x79DA, + 4510: 0x79DD, + 4511: 0x79DE, + 4512: 0x79E0, + 4513: 0x79E2, + 4514: 0x79E5, + 4515: 0x79EA, + 4516: 0x79EB, + 4517: 0x79ED, + 4518: 0x79F1, + 4519: 0x79F8, + 4520: 0x79FC, + 4521: 0x7A02, + 4522: 0x7A03, + 4523: 0x7A07, + 4524: 0x7A09, + 4525: 0x7A0A, + 4526: 0x7A0C, + 4527: 0x7A11, + 4528: 0x7A15, + 4529: 0x7A1B, + 4530: 0x7A1E, + 4531: 0x7A21, + 4532: 0x7A27, + 4533: 0x7A2B, + 4534: 0x7A2D, + 4535: 0x7A2F, + 4536: 0x7A30, + 4537: 0x7A34, + 4538: 0x7A35, + 4539: 0x7A38, + 4540: 0x7A39, + 4541: 0x7A3A, + 4542: 0x7A44, + 4543: 0x7A45, + 4544: 0x7A47, + 4545: 0x7A48, + 4546: 0x7A4C, + 4547: 0x7A55, + 4548: 0x7A56, + 4549: 0x7A59, + 4550: 0x7A5C, + 4551: 0x7A5D, + 4552: 0x7A5F, + 4553: 0x7A60, + 4554: 0x7A65, + 4555: 0x7A67, + 4556: 0x7A6A, + 4557: 0x7A6D, + 4558: 0x7A75, + 4559: 0x7A78, + 4560: 0x7A7E, + 4561: 0x7A80, + 4562: 0x7A82, + 4563: 0x7A85, + 4564: 0x7A86, + 4565: 0x7A8A, + 4566: 0x7A8B, + 4567: 0x7A90, + 4568: 0x7A91, + 4569: 0x7A94, + 4570: 0x7A9E, + 4571: 0x7AA0, + 4572: 0x7AA3, + 4573: 0x7AAC, + 4574: 0x7AB3, + 4575: 0x7AB5, + 4576: 0x7AB9, + 4577: 0x7ABB, + 4578: 0x7ABC, + 4579: 0x7AC6, + 4580: 0x7AC9, + 4581: 0x7ACC, + 4582: 0x7ACE, + 4583: 0x7AD1, + 4584: 0x7ADB, + 4585: 0x7AE8, + 4586: 0x7AE9, + 4587: 0x7AEB, + 4588: 0x7AEC, + 4589: 0x7AF1, + 4590: 0x7AF4, + 4591: 0x7AFB, + 4592: 0x7AFD, + 4593: 0x7AFE, + 4594: 0x7B07, + 4595: 0x7B14, + 4596: 0x7B1F, + 4597: 0x7B23, + 4598: 0x7B27, + 4599: 0x7B29, + 4600: 0x7B2A, + 4601: 0x7B2B, + 4602: 0x7B2D, + 4603: 0x7B2E, + 4604: 0x7B2F, + 4605: 0x7B30, + 4606: 0x7B31, + 4607: 0x7B34, + 4608: 0x7B3D, + 4609: 0x7B3F, + 4610: 0x7B40, + 4611: 0x7B41, + 4612: 0x7B47, + 4613: 0x7B4E, + 4614: 0x7B55, + 4615: 0x7B60, + 4616: 0x7B64, + 4617: 0x7B66, + 4618: 0x7B69, + 4619: 0x7B6A, + 4620: 0x7B6D, + 4621: 0x7B6F, + 4622: 0x7B72, + 4623: 0x7B73, + 4624: 0x7B77, + 4625: 0x7B84, + 4626: 0x7B89, + 4627: 0x7B8E, + 4628: 0x7B90, + 4629: 0x7B91, + 4630: 0x7B96, + 4631: 0x7B9B, + 4632: 0x7B9E, + 4633: 0x7BA0, + 4634: 0x7BA5, + 4635: 0x7BAC, + 4636: 0x7BAF, + 4637: 0x7BB0, + 4638: 0x7BB2, + 4639: 0x7BB5, + 4640: 0x7BB6, + 4641: 0x7BBA, + 4642: 0x7BBB, + 4643: 0x7BBC, + 4644: 0x7BBD, + 4645: 0x7BC2, + 4646: 0x7BC5, + 4647: 0x7BC8, + 4648: 0x7BCA, + 4649: 0x7BD4, + 4650: 0x7BD6, + 4651: 0x7BD7, + 4652: 0x7BD9, + 4653: 0x7BDA, + 4654: 0x7BDB, + 4655: 0x7BE8, + 4656: 0x7BEA, + 4657: 0x7BF2, + 4658: 0x7BF4, + 4659: 0x7BF5, + 4660: 0x7BF8, + 4661: 0x7BF9, + 4662: 0x7BFA, + 4663: 0x7BFC, + 4664: 0x7BFE, + 4665: 0x7C01, + 4666: 0x7C02, + 4667: 0x7C03, + 4668: 0x7C04, + 4669: 0x7C06, + 4670: 0x7C09, + 4671: 0x7C0B, + 4672: 0x7C0C, + 4673: 0x7C0E, + 4674: 0x7C0F, + 4675: 0x7C19, + 4676: 0x7C1B, + 4677: 0x7C20, + 4678: 0x7C25, + 4679: 0x7C26, + 4680: 0x7C28, + 4681: 0x7C2C, + 4682: 0x7C31, + 4683: 0x7C33, + 4684: 0x7C34, + 4685: 0x7C36, + 4686: 0x7C39, + 4687: 0x7C3A, + 4688: 0x7C46, + 4689: 0x7C4A, + 4690: 0x7C55, + 4691: 0x7C51, + 4692: 0x7C52, + 4693: 0x7C53, + 4694: 0x7C59, + 4695: 0x7C5A, + 4696: 0x7C5B, + 4697: 0x7C5C, + 4698: 0x7C5D, + 4699: 0x7C5E, + 4700: 0x7C61, + 4701: 0x7C63, + 4702: 0x7C67, + 4703: 0x7C69, + 4704: 0x7C6D, + 4705: 0x7C6E, + 4706: 0x7C70, + 4707: 0x7C72, + 4708: 0x7C79, + 4709: 0x7C7C, + 4710: 0x7C7D, + 4711: 0x7C86, + 4712: 0x7C87, + 4713: 0x7C8F, + 4714: 0x7C94, + 4715: 0x7C9E, + 4716: 0x7CA0, + 4717: 0x7CA6, + 4718: 0x7CB0, + 4719: 0x7CB6, + 4720: 0x7CB7, + 4721: 0x7CBA, + 4722: 0x7CBB, + 4723: 0x7CBC, + 4724: 0x7CBF, + 4725: 0x7CC4, + 4726: 0x7CC7, + 4727: 0x7CC8, + 4728: 0x7CC9, + 4729: 0x7CCD, + 4730: 0x7CCF, + 4731: 0x7CD3, + 4732: 0x7CD4, + 4733: 0x7CD5, + 4734: 0x7CD7, + 4735: 0x7CD9, + 4736: 0x7CDA, + 4737: 0x7CDD, + 4738: 0x7CE6, + 4739: 0x7CE9, + 4740: 0x7CEB, + 4741: 0x7CF5, + 4742: 0x7D03, + 4743: 0x7D07, + 4744: 0x7D08, + 4745: 0x7D09, + 4746: 0x7D0F, + 4747: 0x7D11, + 4748: 0x7D12, + 4749: 0x7D13, + 4750: 0x7D16, + 4751: 0x7D1D, + 4752: 0x7D1E, + 4753: 0x7D23, + 4754: 0x7D26, + 4755: 0x7D2A, + 4756: 0x7D2D, + 4757: 0x7D31, + 4758: 0x7D3C, + 4759: 0x7D3D, + 4760: 0x7D3E, + 4761: 0x7D40, + 4762: 0x7D41, + 4763: 0x7D47, + 4764: 0x7D48, + 4765: 0x7D4D, + 4766: 0x7D51, + 4767: 0x7D53, + 4768: 0x7D57, + 4769: 0x7D59, + 4770: 0x7D5A, + 4771: 0x7D5C, + 4772: 0x7D5D, + 4773: 0x7D65, + 4774: 0x7D67, + 4775: 0x7D6A, + 4776: 0x7D70, + 4777: 0x7D78, + 4778: 0x7D7A, + 4779: 0x7D7B, + 4780: 0x7D7F, + 4781: 0x7D81, + 4782: 0x7D82, + 4783: 0x7D83, + 4784: 0x7D85, + 4785: 0x7D86, + 4786: 0x7D88, + 4787: 0x7D8B, + 4788: 0x7D8C, + 4789: 0x7D8D, + 4790: 0x7D91, + 4791: 0x7D96, + 4792: 0x7D97, + 4793: 0x7D9D, + 4794: 0x7D9E, + 4795: 0x7DA6, + 4796: 0x7DA7, + 4797: 0x7DAA, + 4798: 0x7DB3, + 4799: 0x7DB6, + 4800: 0x7DB7, + 4801: 0x7DB9, + 4802: 0x7DC2, + 4803: 0x7DC3, + 4804: 0x7DC4, + 4805: 0x7DC5, + 4806: 0x7DC6, + 4807: 0x7DCC, + 4808: 0x7DCD, + 4809: 0x7DCE, + 4810: 0x7DD7, + 4811: 0x7DD9, + 4812: 0x7E00, + 4813: 0x7DE2, + 4814: 0x7DE5, + 4815: 0x7DE6, + 4816: 0x7DEA, + 4817: 0x7DEB, + 4818: 0x7DED, + 4819: 0x7DF1, + 4820: 0x7DF5, + 4821: 0x7DF6, + 4822: 0x7DF9, + 4823: 0x7DFA, + 4824: 0x7E08, + 4825: 0x7E10, + 4826: 0x7E11, + 4827: 0x7E15, + 4828: 0x7E17, + 4829: 0x7E1C, + 4830: 0x7E1D, + 4831: 0x7E20, + 4832: 0x7E27, + 4833: 0x7E28, + 4834: 0x7E2C, + 4835: 0x7E2D, + 4836: 0x7E2F, + 4837: 0x7E33, + 4838: 0x7E36, + 4839: 0x7E3F, + 4840: 0x7E44, + 4841: 0x7E45, + 4842: 0x7E47, + 4843: 0x7E4E, + 4844: 0x7E50, + 4845: 0x7E52, + 4846: 0x7E58, + 4847: 0x7E5F, + 4848: 0x7E61, + 4849: 0x7E62, + 4850: 0x7E65, + 4851: 0x7E6B, + 4852: 0x7E6E, + 4853: 0x7E6F, + 4854: 0x7E73, + 4855: 0x7E78, + 4856: 0x7E7E, + 4857: 0x7E81, + 4858: 0x7E86, + 4859: 0x7E87, + 4860: 0x7E8A, + 4861: 0x7E8D, + 4862: 0x7E91, + 4863: 0x7E95, + 4864: 0x7E98, + 4865: 0x7E9A, + 4866: 0x7E9D, + 4867: 0x7E9E, + 4868: 0x7F3C, + 4869: 0x7F3B, + 4870: 0x7F3D, + 4871: 0x7F3E, + 4872: 0x7F3F, + 4873: 0x7F43, + 4874: 0x7F44, + 4875: 0x7F47, + 4876: 0x7F4F, + 4877: 0x7F52, + 4878: 0x7F53, + 4879: 0x7F5B, + 4880: 0x7F5C, + 4881: 0x7F5D, + 4882: 0x7F61, + 4883: 0x7F63, + 4884: 0x7F64, + 4885: 0x7F65, + 4886: 0x7F66, + 4887: 0x7F6D, + 4888: 0x7F71, + 4889: 0x7F7D, + 4890: 0x7F7E, + 4891: 0x7F7F, + 4892: 0x7F80, + 4893: 0x7F8B, + 4894: 0x7F8D, + 4895: 0x7F8F, + 4896: 0x7F90, + 4897: 0x7F91, + 4898: 0x7F96, + 4899: 0x7F97, + 4900: 0x7F9C, + 4901: 0x7FA1, + 4902: 0x7FA2, + 4903: 0x7FA6, + 4904: 0x7FAA, + 4905: 0x7FAD, + 4906: 0x7FB4, + 4907: 0x7FBC, + 4908: 0x7FBF, + 4909: 0x7FC0, + 4910: 0x7FC3, + 4911: 0x7FC8, + 4912: 0x7FCE, + 4913: 0x7FCF, + 4914: 0x7FDB, + 4915: 0x7FDF, + 4916: 0x7FE3, + 4917: 0x7FE5, + 4918: 0x7FE8, + 4919: 0x7FEC, + 4920: 0x7FEE, + 4921: 0x7FEF, + 4922: 0x7FF2, + 4923: 0x7FFA, + 4924: 0x7FFD, + 4925: 0x7FFE, + 4926: 0x7FFF, + 4927: 0x8007, + 4928: 0x8008, + 4929: 0x800A, + 4930: 0x800D, + 4931: 0x800E, + 4932: 0x800F, + 4933: 0x8011, + 4934: 0x8013, + 4935: 0x8014, + 4936: 0x8016, + 4937: 0x801D, + 4938: 0x801E, + 4939: 0x801F, + 4940: 0x8020, + 4941: 0x8024, + 4942: 0x8026, + 4943: 0x802C, + 4944: 0x802E, + 4945: 0x8030, + 4946: 0x8034, + 4947: 0x8035, + 4948: 0x8037, + 4949: 0x8039, + 4950: 0x803A, + 4951: 0x803C, + 4952: 0x803E, + 4953: 0x8040, + 4954: 0x8044, + 4955: 0x8060, + 4956: 0x8064, + 4957: 0x8066, + 4958: 0x806D, + 4959: 0x8071, + 4960: 0x8075, + 4961: 0x8081, + 4962: 0x8088, + 4963: 0x808E, + 4964: 0x809C, + 4965: 0x809E, + 4966: 0x80A6, + 4967: 0x80A7, + 4968: 0x80AB, + 4969: 0x80B8, + 4970: 0x80B9, + 4971: 0x80C8, + 4972: 0x80CD, + 4973: 0x80CF, + 4974: 0x80D2, + 4975: 0x80D4, + 4976: 0x80D5, + 4977: 0x80D7, + 4978: 0x80D8, + 4979: 0x80E0, + 4980: 0x80ED, + 4981: 0x80EE, + 4982: 0x80F0, + 4983: 0x80F2, + 4984: 0x80F3, + 4985: 0x80F6, + 4986: 0x80F9, + 4987: 0x80FA, + 4988: 0x80FE, + 4989: 0x8103, + 4990: 0x810B, + 4991: 0x8116, + 4992: 0x8117, + 4993: 0x8118, + 4994: 0x811C, + 4995: 0x811E, + 4996: 0x8120, + 4997: 0x8124, + 4998: 0x8127, + 4999: 0x812C, + 5000: 0x8130, + 5001: 0x8135, + 5002: 0x813A, + 5003: 0x813C, + 5004: 0x8145, + 5005: 0x8147, + 5006: 0x814A, + 5007: 0x814C, + 5008: 0x8152, + 5009: 0x8157, + 5010: 0x8160, + 5011: 0x8161, + 5012: 0x8167, + 5013: 0x8168, + 5014: 0x8169, + 5015: 0x816D, + 5016: 0x816F, + 5017: 0x8177, + 5018: 0x8181, + 5019: 0x8190, + 5020: 0x8184, + 5021: 0x8185, + 5022: 0x8186, + 5023: 0x818B, + 5024: 0x818E, + 5025: 0x8196, + 5026: 0x8198, + 5027: 0x819B, + 5028: 0x819E, + 5029: 0x81A2, + 5030: 0x81AE, + 5031: 0x81B2, + 5032: 0x81B4, + 5033: 0x81BB, + 5034: 0x81CB, + 5035: 0x81C3, + 5036: 0x81C5, + 5037: 0x81CA, + 5038: 0x81CE, + 5039: 0x81CF, + 5040: 0x81D5, + 5041: 0x81D7, + 5042: 0x81DB, + 5043: 0x81DD, + 5044: 0x81DE, + 5045: 0x81E1, + 5046: 0x81E4, + 5047: 0x81EB, + 5048: 0x81EC, + 5049: 0x81F0, + 5050: 0x81F1, + 5051: 0x81F2, + 5052: 0x81F5, + 5053: 0x81F6, + 5054: 0x81F8, + 5055: 0x81F9, + 5056: 0x81FD, + 5057: 0x81FF, + 5058: 0x8200, + 5059: 0x8203, + 5060: 0x820F, + 5061: 0x8213, + 5062: 0x8214, + 5063: 0x8219, + 5064: 0x821A, + 5065: 0x821D, + 5066: 0x8221, + 5067: 0x8222, + 5068: 0x8228, + 5069: 0x8232, + 5070: 0x8234, + 5071: 0x823A, + 5072: 0x8243, + 5073: 0x8244, + 5074: 0x8245, + 5075: 0x8246, + 5076: 0x824B, + 5077: 0x824E, + 5078: 0x824F, + 5079: 0x8251, + 5080: 0x8256, + 5081: 0x825C, + 5082: 0x8260, + 5083: 0x8263, + 5084: 0x8267, + 5085: 0x826D, + 5086: 0x8274, + 5087: 0x827B, + 5088: 0x827D, + 5089: 0x827F, + 5090: 0x8280, + 5091: 0x8281, + 5092: 0x8283, + 5093: 0x8284, + 5094: 0x8287, + 5095: 0x8289, + 5096: 0x828A, + 5097: 0x828E, + 5098: 0x8291, + 5099: 0x8294, + 5100: 0x8296, + 5101: 0x8298, + 5102: 0x829A, + 5103: 0x829B, + 5104: 0x82A0, + 5105: 0x82A1, + 5106: 0x82A3, + 5107: 0x82A4, + 5108: 0x82A7, + 5109: 0x82A8, + 5110: 0x82A9, + 5111: 0x82AA, + 5112: 0x82AE, + 5113: 0x82B0, + 5114: 0x82B2, + 5115: 0x82B4, + 5116: 0x82B7, + 5117: 0x82BA, + 5118: 0x82BC, + 5119: 0x82BE, + 5120: 0x82BF, + 5121: 0x82C6, + 5122: 0x82D0, + 5123: 0x82D5, + 5124: 0x82DA, + 5125: 0x82E0, + 5126: 0x82E2, + 5127: 0x82E4, + 5128: 0x82E8, + 5129: 0x82EA, + 5130: 0x82ED, + 5131: 0x82EF, + 5132: 0x82F6, + 5133: 0x82F7, + 5134: 0x82FD, + 5135: 0x82FE, + 5136: 0x8300, + 5137: 0x8301, + 5138: 0x8307, + 5139: 0x8308, + 5140: 0x830A, + 5141: 0x830B, + 5142: 0x8354, + 5143: 0x831B, + 5144: 0x831D, + 5145: 0x831E, + 5146: 0x831F, + 5147: 0x8321, + 5148: 0x8322, + 5149: 0x832C, + 5150: 0x832D, + 5151: 0x832E, + 5152: 0x8330, + 5153: 0x8333, + 5154: 0x8337, + 5155: 0x833A, + 5156: 0x833C, + 5157: 0x833D, + 5158: 0x8342, + 5159: 0x8343, + 5160: 0x8344, + 5161: 0x8347, + 5162: 0x834D, + 5163: 0x834E, + 5164: 0x8351, + 5165: 0x8355, + 5166: 0x8356, + 5167: 0x8357, + 5168: 0x8370, + 5169: 0x8378, + 5170: 0x837D, + 5171: 0x837F, + 5172: 0x8380, + 5173: 0x8382, + 5174: 0x8384, + 5175: 0x8386, + 5176: 0x838D, + 5177: 0x8392, + 5178: 0x8394, + 5179: 0x8395, + 5180: 0x8398, + 5181: 0x8399, + 5182: 0x839B, + 5183: 0x839C, + 5184: 0x839D, + 5185: 0x83A6, + 5186: 0x83A7, + 5187: 0x83A9, + 5188: 0x83AC, + 5189: 0x83BE, + 5190: 0x83BF, + 5191: 0x83C0, + 5192: 0x83C7, + 5193: 0x83C9, + 5194: 0x83CF, + 5195: 0x83D0, + 5196: 0x83D1, + 5197: 0x83D4, + 5198: 0x83DD, + 5199: 0x8353, + 5200: 0x83E8, + 5201: 0x83EA, + 5202: 0x83F6, + 5203: 0x83F8, + 5204: 0x83F9, + 5205: 0x83FC, + 5206: 0x8401, + 5207: 0x8406, + 5208: 0x840A, + 5209: 0x840F, + 5210: 0x8411, + 5211: 0x8415, + 5212: 0x8419, + 5213: 0x83AD, + 5214: 0x842F, + 5215: 0x8439, + 5216: 0x8445, + 5217: 0x8447, + 5218: 0x8448, + 5219: 0x844A, + 5220: 0x844D, + 5221: 0x844F, + 5222: 0x8451, + 5223: 0x8452, + 5224: 0x8456, + 5225: 0x8458, + 5226: 0x8459, + 5227: 0x845A, + 5228: 0x845C, + 5229: 0x8460, + 5230: 0x8464, + 5231: 0x8465, + 5232: 0x8467, + 5233: 0x846A, + 5234: 0x8470, + 5235: 0x8473, + 5236: 0x8474, + 5237: 0x8476, + 5238: 0x8478, + 5239: 0x847C, + 5240: 0x847D, + 5241: 0x8481, + 5242: 0x8485, + 5243: 0x8492, + 5244: 0x8493, + 5245: 0x8495, + 5246: 0x849E, + 5247: 0x84A6, + 5248: 0x84A8, + 5249: 0x84A9, + 5250: 0x84AA, + 5251: 0x84AF, + 5252: 0x84B1, + 5253: 0x84B4, + 5254: 0x84BA, + 5255: 0x84BD, + 5256: 0x84BE, + 5257: 0x84C0, + 5258: 0x84C2, + 5259: 0x84C7, + 5260: 0x84C8, + 5261: 0x84CC, + 5262: 0x84CF, + 5263: 0x84D3, + 5264: 0x84DC, + 5265: 0x84E7, + 5266: 0x84EA, + 5267: 0x84EF, + 5268: 0x84F0, + 5269: 0x84F1, + 5270: 0x84F2, + 5271: 0x84F7, + 5272: 0x8532, + 5273: 0x84FA, + 5274: 0x84FB, + 5275: 0x84FD, + 5276: 0x8502, + 5277: 0x8503, + 5278: 0x8507, + 5279: 0x850C, + 5280: 0x850E, + 5281: 0x8510, + 5282: 0x851C, + 5283: 0x851E, + 5284: 0x8522, + 5285: 0x8523, + 5286: 0x8524, + 5287: 0x8525, + 5288: 0x8527, + 5289: 0x852A, + 5290: 0x852B, + 5291: 0x852F, + 5292: 0x8533, + 5293: 0x8534, + 5294: 0x8536, + 5295: 0x853F, + 5296: 0x8546, + 5297: 0x854F, + 5298: 0x8550, + 5299: 0x8551, + 5300: 0x8552, + 5301: 0x8553, + 5302: 0x8556, + 5303: 0x8559, + 5304: 0x855C, + 5305: 0x855D, + 5306: 0x855E, + 5307: 0x855F, + 5308: 0x8560, + 5309: 0x8561, + 5310: 0x8562, + 5311: 0x8564, + 5312: 0x856B, + 5313: 0x856F, + 5314: 0x8579, + 5315: 0x857A, + 5316: 0x857B, + 5317: 0x857D, + 5318: 0x857F, + 5319: 0x8581, + 5320: 0x8585, + 5321: 0x8586, + 5322: 0x8589, + 5323: 0x858B, + 5324: 0x858C, + 5325: 0x858F, + 5326: 0x8593, + 5327: 0x8598, + 5328: 0x859D, + 5329: 0x859F, + 5330: 0x85A0, + 5331: 0x85A2, + 5332: 0x85A5, + 5333: 0x85A7, + 5334: 0x85B4, + 5335: 0x85B6, + 5336: 0x85B7, + 5337: 0x85B8, + 5338: 0x85BC, + 5339: 0x85BD, + 5340: 0x85BE, + 5341: 0x85BF, + 5342: 0x85C2, + 5343: 0x85C7, + 5344: 0x85CA, + 5345: 0x85CB, + 5346: 0x85CE, + 5347: 0x85AD, + 5348: 0x85D8, + 5349: 0x85DA, + 5350: 0x85DF, + 5351: 0x85E0, + 5352: 0x85E6, + 5353: 0x85E8, + 5354: 0x85ED, + 5355: 0x85F3, + 5356: 0x85F6, + 5357: 0x85FC, + 5358: 0x85FF, + 5359: 0x8600, + 5360: 0x8604, + 5361: 0x8605, + 5362: 0x860D, + 5363: 0x860E, + 5364: 0x8610, + 5365: 0x8611, + 5366: 0x8612, + 5367: 0x8618, + 5368: 0x8619, + 5369: 0x861B, + 5370: 0x861E, + 5371: 0x8621, + 5372: 0x8627, + 5373: 0x8629, + 5374: 0x8636, + 5375: 0x8638, + 5376: 0x863A, + 5377: 0x863C, + 5378: 0x863D, + 5379: 0x8640, + 5380: 0x8642, + 5381: 0x8646, + 5382: 0x8652, + 5383: 0x8653, + 5384: 0x8656, + 5385: 0x8657, + 5386: 0x8658, + 5387: 0x8659, + 5388: 0x865D, + 5389: 0x8660, + 5390: 0x8661, + 5391: 0x8662, + 5392: 0x8663, + 5393: 0x8664, + 5394: 0x8669, + 5395: 0x866C, + 5396: 0x866F, + 5397: 0x8675, + 5398: 0x8676, + 5399: 0x8677, + 5400: 0x867A, + 5401: 0x868D, + 5402: 0x8691, + 5403: 0x8696, + 5404: 0x8698, + 5405: 0x869A, + 5406: 0x869C, + 5407: 0x86A1, + 5408: 0x86A6, + 5409: 0x86A7, + 5410: 0x86A8, + 5411: 0x86AD, + 5412: 0x86B1, + 5413: 0x86B3, + 5414: 0x86B4, + 5415: 0x86B5, + 5416: 0x86B7, + 5417: 0x86B8, + 5418: 0x86B9, + 5419: 0x86BF, + 5420: 0x86C0, + 5421: 0x86C1, + 5422: 0x86C3, + 5423: 0x86C5, + 5424: 0x86D1, + 5425: 0x86D2, + 5426: 0x86D5, + 5427: 0x86D7, + 5428: 0x86DA, + 5429: 0x86DC, + 5430: 0x86E0, + 5431: 0x86E3, + 5432: 0x86E5, + 5433: 0x86E7, + 5434: 0x8688, + 5435: 0x86FA, + 5436: 0x86FC, + 5437: 0x86FD, + 5438: 0x8704, + 5439: 0x8705, + 5440: 0x8707, + 5441: 0x870B, + 5442: 0x870E, + 5443: 0x870F, + 5444: 0x8710, + 5445: 0x8713, + 5446: 0x8714, + 5447: 0x8719, + 5448: 0x871E, + 5449: 0x871F, + 5450: 0x8721, + 5451: 0x8723, + 5452: 0x8728, + 5453: 0x872E, + 5454: 0x872F, + 5455: 0x8731, + 5456: 0x8732, + 5457: 0x8739, + 5458: 0x873A, + 5459: 0x873C, + 5460: 0x873D, + 5461: 0x873E, + 5462: 0x8740, + 5463: 0x8743, + 5464: 0x8745, + 5465: 0x874D, + 5466: 0x8758, + 5467: 0x875D, + 5468: 0x8761, + 5469: 0x8764, + 5470: 0x8765, + 5471: 0x876F, + 5472: 0x8771, + 5473: 0x8772, + 5474: 0x877B, + 5475: 0x8783, + 5476: 0x8784, + 5477: 0x8785, + 5478: 0x8786, + 5479: 0x8787, + 5480: 0x8788, + 5481: 0x8789, + 5482: 0x878B, + 5483: 0x878C, + 5484: 0x8790, + 5485: 0x8793, + 5486: 0x8795, + 5487: 0x8797, + 5488: 0x8798, + 5489: 0x8799, + 5490: 0x879E, + 5491: 0x87A0, + 5492: 0x87A3, + 5493: 0x87A7, + 5494: 0x87AC, + 5495: 0x87AD, + 5496: 0x87AE, + 5497: 0x87B1, + 5498: 0x87B5, + 5499: 0x87BE, + 5500: 0x87BF, + 5501: 0x87C1, + 5502: 0x87C8, + 5503: 0x87C9, + 5504: 0x87CA, + 5505: 0x87CE, + 5506: 0x87D5, + 5507: 0x87D6, + 5508: 0x87D9, + 5509: 0x87DA, + 5510: 0x87DC, + 5511: 0x87DF, + 5512: 0x87E2, + 5513: 0x87E3, + 5514: 0x87E4, + 5515: 0x87EA, + 5516: 0x87EB, + 5517: 0x87ED, + 5518: 0x87F1, + 5519: 0x87F3, + 5520: 0x87F8, + 5521: 0x87FA, + 5522: 0x87FF, + 5523: 0x8801, + 5524: 0x8803, + 5525: 0x8806, + 5526: 0x8809, + 5527: 0x880A, + 5528: 0x880B, + 5529: 0x8810, + 5530: 0x8819, + 5531: 0x8812, + 5532: 0x8813, + 5533: 0x8814, + 5534: 0x8818, + 5535: 0x881A, + 5536: 0x881B, + 5537: 0x881C, + 5538: 0x881E, + 5539: 0x881F, + 5540: 0x8828, + 5541: 0x882D, + 5542: 0x882E, + 5543: 0x8830, + 5544: 0x8832, + 5545: 0x8835, + 5546: 0x883A, + 5547: 0x883C, + 5548: 0x8841, + 5549: 0x8843, + 5550: 0x8845, + 5551: 0x8848, + 5552: 0x8849, + 5553: 0x884A, + 5554: 0x884B, + 5555: 0x884E, + 5556: 0x8851, + 5557: 0x8855, + 5558: 0x8856, + 5559: 0x8858, + 5560: 0x885A, + 5561: 0x885C, + 5562: 0x885F, + 5563: 0x8860, + 5564: 0x8864, + 5565: 0x8869, + 5566: 0x8871, + 5567: 0x8879, + 5568: 0x887B, + 5569: 0x8880, + 5570: 0x8898, + 5571: 0x889A, + 5572: 0x889B, + 5573: 0x889C, + 5574: 0x889F, + 5575: 0x88A0, + 5576: 0x88A8, + 5577: 0x88AA, + 5578: 0x88BA, + 5579: 0x88BD, + 5580: 0x88BE, + 5581: 0x88C0, + 5582: 0x88CA, + 5583: 0x88CB, + 5584: 0x88CC, + 5585: 0x88CD, + 5586: 0x88CE, + 5587: 0x88D1, + 5588: 0x88D2, + 5589: 0x88D3, + 5590: 0x88DB, + 5591: 0x88DE, + 5592: 0x88E7, + 5593: 0x88EF, + 5594: 0x88F0, + 5595: 0x88F1, + 5596: 0x88F5, + 5597: 0x88F7, + 5598: 0x8901, + 5599: 0x8906, + 5600: 0x890D, + 5601: 0x890E, + 5602: 0x890F, + 5603: 0x8915, + 5604: 0x8916, + 5605: 0x8918, + 5606: 0x8919, + 5607: 0x891A, + 5608: 0x891C, + 5609: 0x8920, + 5610: 0x8926, + 5611: 0x8927, + 5612: 0x8928, + 5613: 0x8930, + 5614: 0x8931, + 5615: 0x8932, + 5616: 0x8935, + 5617: 0x8939, + 5618: 0x893A, + 5619: 0x893E, + 5620: 0x8940, + 5621: 0x8942, + 5622: 0x8945, + 5623: 0x8946, + 5624: 0x8949, + 5625: 0x894F, + 5626: 0x8952, + 5627: 0x8957, + 5628: 0x895A, + 5629: 0x895B, + 5630: 0x895C, + 5631: 0x8961, + 5632: 0x8962, + 5633: 0x8963, + 5634: 0x896B, + 5635: 0x896E, + 5636: 0x8970, + 5637: 0x8973, + 5638: 0x8975, + 5639: 0x897A, + 5640: 0x897B, + 5641: 0x897C, + 5642: 0x897D, + 5643: 0x8989, + 5644: 0x898D, + 5645: 0x8990, + 5646: 0x8994, + 5647: 0x8995, + 5648: 0x899B, + 5649: 0x899C, + 5650: 0x899F, + 5651: 0x89A0, + 5652: 0x89A5, + 5653: 0x89B0, + 5654: 0x89B4, + 5655: 0x89B5, + 5656: 0x89B6, + 5657: 0x89B7, + 5658: 0x89BC, + 5659: 0x89D4, + 5660: 0x89D5, + 5661: 0x89D6, + 5662: 0x89D7, + 5663: 0x89D8, + 5664: 0x89E5, + 5665: 0x89E9, + 5666: 0x89EB, + 5667: 0x89ED, + 5668: 0x89F1, + 5669: 0x89F3, + 5670: 0x89F6, + 5671: 0x89F9, + 5672: 0x89FD, + 5673: 0x89FF, + 5674: 0x8A04, + 5675: 0x8A05, + 5676: 0x8A07, + 5677: 0x8A0F, + 5678: 0x8A11, + 5679: 0x8A12, + 5680: 0x8A14, + 5681: 0x8A15, + 5682: 0x8A1E, + 5683: 0x8A20, + 5684: 0x8A22, + 5685: 0x8A24, + 5686: 0x8A26, + 5687: 0x8A2B, + 5688: 0x8A2C, + 5689: 0x8A2F, + 5690: 0x8A35, + 5691: 0x8A37, + 5692: 0x8A3D, + 5693: 0x8A3E, + 5694: 0x8A40, + 5695: 0x8A43, + 5696: 0x8A45, + 5697: 0x8A47, + 5698: 0x8A49, + 5699: 0x8A4D, + 5700: 0x8A4E, + 5701: 0x8A53, + 5702: 0x8A56, + 5703: 0x8A57, + 5704: 0x8A58, + 5705: 0x8A5C, + 5706: 0x8A5D, + 5707: 0x8A61, + 5708: 0x8A65, + 5709: 0x8A67, + 5710: 0x8A75, + 5711: 0x8A76, + 5712: 0x8A77, + 5713: 0x8A79, + 5714: 0x8A7A, + 5715: 0x8A7B, + 5716: 0x8A7E, + 5717: 0x8A7F, + 5718: 0x8A80, + 5719: 0x8A83, + 5720: 0x8A86, + 5721: 0x8A8B, + 5722: 0x8A8F, + 5723: 0x8A90, + 5724: 0x8A92, + 5725: 0x8A96, + 5726: 0x8A97, + 5727: 0x8A99, + 5728: 0x8A9F, + 5729: 0x8AA7, + 5730: 0x8AA9, + 5731: 0x8AAE, + 5732: 0x8AAF, + 5733: 0x8AB3, + 5734: 0x8AB6, + 5735: 0x8AB7, + 5736: 0x8ABB, + 5737: 0x8ABE, + 5738: 0x8AC3, + 5739: 0x8AC6, + 5740: 0x8AC8, + 5741: 0x8AC9, + 5742: 0x8ACA, + 5743: 0x8AD1, + 5744: 0x8AD3, + 5745: 0x8AD4, + 5746: 0x8AD5, + 5747: 0x8AD7, + 5748: 0x8ADD, + 5749: 0x8ADF, + 5750: 0x8AEC, + 5751: 0x8AF0, + 5752: 0x8AF4, + 5753: 0x8AF5, + 5754: 0x8AF6, + 5755: 0x8AFC, + 5756: 0x8AFF, + 5757: 0x8B05, + 5758: 0x8B06, + 5759: 0x8B0B, + 5760: 0x8B11, + 5761: 0x8B1C, + 5762: 0x8B1E, + 5763: 0x8B1F, + 5764: 0x8B0A, + 5765: 0x8B2D, + 5766: 0x8B30, + 5767: 0x8B37, + 5768: 0x8B3C, + 5769: 0x8B42, + 5770: 0x8B43, + 5771: 0x8B44, + 5772: 0x8B45, + 5773: 0x8B46, + 5774: 0x8B48, + 5775: 0x8B52, + 5776: 0x8B53, + 5777: 0x8B54, + 5778: 0x8B59, + 5779: 0x8B4D, + 5780: 0x8B5E, + 5781: 0x8B63, + 5782: 0x8B6D, + 5783: 0x8B76, + 5784: 0x8B78, + 5785: 0x8B79, + 5786: 0x8B7C, + 5787: 0x8B7E, + 5788: 0x8B81, + 5789: 0x8B84, + 5790: 0x8B85, + 5791: 0x8B8B, + 5792: 0x8B8D, + 5793: 0x8B8F, + 5794: 0x8B94, + 5795: 0x8B95, + 5796: 0x8B9C, + 5797: 0x8B9E, + 5798: 0x8B9F, + 5799: 0x8C38, + 5800: 0x8C39, + 5801: 0x8C3D, + 5802: 0x8C3E, + 5803: 0x8C45, + 5804: 0x8C47, + 5805: 0x8C49, + 5806: 0x8C4B, + 5807: 0x8C4F, + 5808: 0x8C51, + 5809: 0x8C53, + 5810: 0x8C54, + 5811: 0x8C57, + 5812: 0x8C58, + 5813: 0x8C5B, + 5814: 0x8C5D, + 5815: 0x8C59, + 5816: 0x8C63, + 5817: 0x8C64, + 5818: 0x8C66, + 5819: 0x8C68, + 5820: 0x8C69, + 5821: 0x8C6D, + 5822: 0x8C73, + 5823: 0x8C75, + 5824: 0x8C76, + 5825: 0x8C7B, + 5826: 0x8C7E, + 5827: 0x8C86, + 5828: 0x8C87, + 5829: 0x8C8B, + 5830: 0x8C90, + 5831: 0x8C92, + 5832: 0x8C93, + 5833: 0x8C99, + 5834: 0x8C9B, + 5835: 0x8C9C, + 5836: 0x8CA4, + 5837: 0x8CB9, + 5838: 0x8CBA, + 5839: 0x8CC5, + 5840: 0x8CC6, + 5841: 0x8CC9, + 5842: 0x8CCB, + 5843: 0x8CCF, + 5844: 0x8CD6, + 5845: 0x8CD5, + 5846: 0x8CD9, + 5847: 0x8CDD, + 5848: 0x8CE1, + 5849: 0x8CE8, + 5850: 0x8CEC, + 5851: 0x8CEF, + 5852: 0x8CF0, + 5853: 0x8CF2, + 5854: 0x8CF5, + 5855: 0x8CF7, + 5856: 0x8CF8, + 5857: 0x8CFE, + 5858: 0x8CFF, + 5859: 0x8D01, + 5860: 0x8D03, + 5861: 0x8D09, + 5862: 0x8D12, + 5863: 0x8D17, + 5864: 0x8D1B, + 5865: 0x8D65, + 5866: 0x8D69, + 5867: 0x8D6C, + 5868: 0x8D6E, + 5869: 0x8D7F, + 5870: 0x8D82, + 5871: 0x8D84, + 5872: 0x8D88, + 5873: 0x8D8D, + 5874: 0x8D90, + 5875: 0x8D91, + 5876: 0x8D95, + 5877: 0x8D9E, + 5878: 0x8D9F, + 5879: 0x8DA0, + 5880: 0x8DA6, + 5881: 0x8DAB, + 5882: 0x8DAC, + 5883: 0x8DAF, + 5884: 0x8DB2, + 5885: 0x8DB5, + 5886: 0x8DB7, + 5887: 0x8DB9, + 5888: 0x8DBB, + 5889: 0x8DC0, + 5890: 0x8DC5, + 5891: 0x8DC6, + 5892: 0x8DC7, + 5893: 0x8DC8, + 5894: 0x8DCA, + 5895: 0x8DCE, + 5896: 0x8DD1, + 5897: 0x8DD4, + 5898: 0x8DD5, + 5899: 0x8DD7, + 5900: 0x8DD9, + 5901: 0x8DE4, + 5902: 0x8DE5, + 5903: 0x8DE7, + 5904: 0x8DEC, + 5905: 0x8DF0, + 5906: 0x8DBC, + 5907: 0x8DF1, + 5908: 0x8DF2, + 5909: 0x8DF4, + 5910: 0x8DFD, + 5911: 0x8E01, + 5912: 0x8E04, + 5913: 0x8E05, + 5914: 0x8E06, + 5915: 0x8E0B, + 5916: 0x8E11, + 5917: 0x8E14, + 5918: 0x8E16, + 5919: 0x8E20, + 5920: 0x8E21, + 5921: 0x8E22, + 5922: 0x8E23, + 5923: 0x8E26, + 5924: 0x8E27, + 5925: 0x8E31, + 5926: 0x8E33, + 5927: 0x8E36, + 5928: 0x8E37, + 5929: 0x8E38, + 5930: 0x8E39, + 5931: 0x8E3D, + 5932: 0x8E40, + 5933: 0x8E41, + 5934: 0x8E4B, + 5935: 0x8E4D, + 5936: 0x8E4E, + 5937: 0x8E4F, + 5938: 0x8E54, + 5939: 0x8E5B, + 5940: 0x8E5C, + 5941: 0x8E5D, + 5942: 0x8E5E, + 5943: 0x8E61, + 5944: 0x8E62, + 5945: 0x8E69, + 5946: 0x8E6C, + 5947: 0x8E6D, + 5948: 0x8E6F, + 5949: 0x8E70, + 5950: 0x8E71, + 5951: 0x8E79, + 5952: 0x8E7A, + 5953: 0x8E7B, + 5954: 0x8E82, + 5955: 0x8E83, + 5956: 0x8E89, + 5957: 0x8E90, + 5958: 0x8E92, + 5959: 0x8E95, + 5960: 0x8E9A, + 5961: 0x8E9B, + 5962: 0x8E9D, + 5963: 0x8E9E, + 5964: 0x8EA2, + 5965: 0x8EA7, + 5966: 0x8EA9, + 5967: 0x8EAD, + 5968: 0x8EAE, + 5969: 0x8EB3, + 5970: 0x8EB5, + 5971: 0x8EBA, + 5972: 0x8EBB, + 5973: 0x8EC0, + 5974: 0x8EC1, + 5975: 0x8EC3, + 5976: 0x8EC4, + 5977: 0x8EC7, + 5978: 0x8ECF, + 5979: 0x8ED1, + 5980: 0x8ED4, + 5981: 0x8EDC, + 5982: 0x8EE8, + 5983: 0x8EEE, + 5984: 0x8EF0, + 5985: 0x8EF1, + 5986: 0x8EF7, + 5987: 0x8EF9, + 5988: 0x8EFA, + 5989: 0x8EED, + 5990: 0x8F00, + 5991: 0x8F02, + 5992: 0x8F07, + 5993: 0x8F08, + 5994: 0x8F0F, + 5995: 0x8F10, + 5996: 0x8F16, + 5997: 0x8F17, + 5998: 0x8F18, + 5999: 0x8F1E, + 6000: 0x8F20, + 6001: 0x8F21, + 6002: 0x8F23, + 6003: 0x8F25, + 6004: 0x8F27, + 6005: 0x8F28, + 6006: 0x8F2C, + 6007: 0x8F2D, + 6008: 0x8F2E, + 6009: 0x8F34, + 6010: 0x8F35, + 6011: 0x8F36, + 6012: 0x8F37, + 6013: 0x8F3A, + 6014: 0x8F40, + 6015: 0x8F41, + 6016: 0x8F43, + 6017: 0x8F47, + 6018: 0x8F4F, + 6019: 0x8F51, + 6020: 0x8F52, + 6021: 0x8F53, + 6022: 0x8F54, + 6023: 0x8F55, + 6024: 0x8F58, + 6025: 0x8F5D, + 6026: 0x8F5E, + 6027: 0x8F65, + 6028: 0x8F9D, + 6029: 0x8FA0, + 6030: 0x8FA1, + 6031: 0x8FA4, + 6032: 0x8FA5, + 6033: 0x8FA6, + 6034: 0x8FB5, + 6035: 0x8FB6, + 6036: 0x8FB8, + 6037: 0x8FBE, + 6038: 0x8FC0, + 6039: 0x8FC1, + 6040: 0x8FC6, + 6041: 0x8FCA, + 6042: 0x8FCB, + 6043: 0x8FCD, + 6044: 0x8FD0, + 6045: 0x8FD2, + 6046: 0x8FD3, + 6047: 0x8FD5, + 6048: 0x8FE0, + 6049: 0x8FE3, + 6050: 0x8FE4, + 6051: 0x8FE8, + 6052: 0x8FEE, + 6053: 0x8FF1, + 6054: 0x8FF5, + 6055: 0x8FF6, + 6056: 0x8FFB, + 6057: 0x8FFE, + 6058: 0x9002, + 6059: 0x9004, + 6060: 0x9008, + 6061: 0x900C, + 6062: 0x9018, + 6063: 0x901B, + 6064: 0x9028, + 6065: 0x9029, + 6066: 0x902F, + 6067: 0x902A, + 6068: 0x902C, + 6069: 0x902D, + 6070: 0x9033, + 6071: 0x9034, + 6072: 0x9037, + 6073: 0x903F, + 6074: 0x9043, + 6075: 0x9044, + 6076: 0x904C, + 6077: 0x905B, + 6078: 0x905D, + 6079: 0x9062, + 6080: 0x9066, + 6081: 0x9067, + 6082: 0x906C, + 6083: 0x9070, + 6084: 0x9074, + 6085: 0x9079, + 6086: 0x9085, + 6087: 0x9088, + 6088: 0x908B, + 6089: 0x908C, + 6090: 0x908E, + 6091: 0x9090, + 6092: 0x9095, + 6093: 0x9097, + 6094: 0x9098, + 6095: 0x9099, + 6096: 0x909B, + 6097: 0x90A0, + 6098: 0x90A1, + 6099: 0x90A2, + 6100: 0x90A5, + 6101: 0x90B0, + 6102: 0x90B2, + 6103: 0x90B3, + 6104: 0x90B4, + 6105: 0x90B6, + 6106: 0x90BD, + 6107: 0x90CC, + 6108: 0x90BE, + 6109: 0x90C3, + 6110: 0x90C4, + 6111: 0x90C5, + 6112: 0x90C7, + 6113: 0x90C8, + 6114: 0x90D5, + 6115: 0x90D7, + 6116: 0x90D8, + 6117: 0x90D9, + 6118: 0x90DC, + 6119: 0x90DD, + 6120: 0x90DF, + 6121: 0x90E5, + 6122: 0x90D2, + 6123: 0x90F6, + 6124: 0x90EB, + 6125: 0x90EF, + 6126: 0x90F0, + 6127: 0x90F4, + 6128: 0x90FE, + 6129: 0x90FF, + 6130: 0x9100, + 6131: 0x9104, + 6132: 0x9105, + 6133: 0x9106, + 6134: 0x9108, + 6135: 0x910D, + 6136: 0x9110, + 6137: 0x9114, + 6138: 0x9116, + 6139: 0x9117, + 6140: 0x9118, + 6141: 0x911A, + 6142: 0x911C, + 6143: 0x911E, + 6144: 0x9120, + 6145: 0x9125, + 6146: 0x9122, + 6147: 0x9123, + 6148: 0x9127, + 6149: 0x9129, + 6150: 0x912E, + 6151: 0x912F, + 6152: 0x9131, + 6153: 0x9134, + 6154: 0x9136, + 6155: 0x9137, + 6156: 0x9139, + 6157: 0x913A, + 6158: 0x913C, + 6159: 0x913D, + 6160: 0x9143, + 6161: 0x9147, + 6162: 0x9148, + 6163: 0x914F, + 6164: 0x9153, + 6165: 0x9157, + 6166: 0x9159, + 6167: 0x915A, + 6168: 0x915B, + 6169: 0x9161, + 6170: 0x9164, + 6171: 0x9167, + 6172: 0x916D, + 6173: 0x9174, + 6174: 0x9179, + 6175: 0x917A, + 6176: 0x917B, + 6177: 0x9181, + 6178: 0x9183, + 6179: 0x9185, + 6180: 0x9186, + 6181: 0x918A, + 6182: 0x918E, + 6183: 0x9191, + 6184: 0x9193, + 6185: 0x9194, + 6186: 0x9195, + 6187: 0x9198, + 6188: 0x919E, + 6189: 0x91A1, + 6190: 0x91A6, + 6191: 0x91A8, + 6192: 0x91AC, + 6193: 0x91AD, + 6194: 0x91AE, + 6195: 0x91B0, + 6196: 0x91B1, + 6197: 0x91B2, + 6198: 0x91B3, + 6199: 0x91B6, + 6200: 0x91BB, + 6201: 0x91BC, + 6202: 0x91BD, + 6203: 0x91BF, + 6204: 0x91C2, + 6205: 0x91C3, + 6206: 0x91C5, + 6207: 0x91D3, + 6208: 0x91D4, + 6209: 0x91D7, + 6210: 0x91D9, + 6211: 0x91DA, + 6212: 0x91DE, + 6213: 0x91E4, + 6214: 0x91E5, + 6215: 0x91E9, + 6216: 0x91EA, + 6217: 0x91EC, + 6218: 0x91ED, + 6219: 0x91EE, + 6220: 0x91EF, + 6221: 0x91F0, + 6222: 0x91F1, + 6223: 0x91F7, + 6224: 0x91F9, + 6225: 0x91FB, + 6226: 0x91FD, + 6227: 0x9200, + 6228: 0x9201, + 6229: 0x9204, + 6230: 0x9205, + 6231: 0x9206, + 6232: 0x9207, + 6233: 0x9209, + 6234: 0x920A, + 6235: 0x920C, + 6236: 0x9210, + 6237: 0x9212, + 6238: 0x9213, + 6239: 0x9216, + 6240: 0x9218, + 6241: 0x921C, + 6242: 0x921D, + 6243: 0x9223, + 6244: 0x9224, + 6245: 0x9225, + 6246: 0x9226, + 6247: 0x9228, + 6248: 0x922E, + 6249: 0x922F, + 6250: 0x9230, + 6251: 0x9233, + 6252: 0x9235, + 6253: 0x9236, + 6254: 0x9238, + 6255: 0x9239, + 6256: 0x923A, + 6257: 0x923C, + 6258: 0x923E, + 6259: 0x9240, + 6260: 0x9242, + 6261: 0x9243, + 6262: 0x9246, + 6263: 0x9247, + 6264: 0x924A, + 6265: 0x924D, + 6266: 0x924E, + 6267: 0x924F, + 6268: 0x9251, + 6269: 0x9258, + 6270: 0x9259, + 6271: 0x925C, + 6272: 0x925D, + 6273: 0x9260, + 6274: 0x9261, + 6275: 0x9265, + 6276: 0x9267, + 6277: 0x9268, + 6278: 0x9269, + 6279: 0x926E, + 6280: 0x926F, + 6281: 0x9270, + 6282: 0x9275, + 6283: 0x9276, + 6284: 0x9277, + 6285: 0x9278, + 6286: 0x9279, + 6287: 0x927B, + 6288: 0x927C, + 6289: 0x927D, + 6290: 0x927F, + 6291: 0x9288, + 6292: 0x9289, + 6293: 0x928A, + 6294: 0x928D, + 6295: 0x928E, + 6296: 0x9292, + 6297: 0x9297, + 6298: 0x9299, + 6299: 0x929F, + 6300: 0x92A0, + 6301: 0x92A4, + 6302: 0x92A5, + 6303: 0x92A7, + 6304: 0x92A8, + 6305: 0x92AB, + 6306: 0x92AF, + 6307: 0x92B2, + 6308: 0x92B6, + 6309: 0x92B8, + 6310: 0x92BA, + 6311: 0x92BB, + 6312: 0x92BC, + 6313: 0x92BD, + 6314: 0x92BF, + 6315: 0x92C0, + 6316: 0x92C1, + 6317: 0x92C2, + 6318: 0x92C3, + 6319: 0x92C5, + 6320: 0x92C6, + 6321: 0x92C7, + 6322: 0x92C8, + 6323: 0x92CB, + 6324: 0x92CC, + 6325: 0x92CD, + 6326: 0x92CE, + 6327: 0x92D0, + 6328: 0x92D3, + 6329: 0x92D5, + 6330: 0x92D7, + 6331: 0x92D8, + 6332: 0x92D9, + 6333: 0x92DC, + 6334: 0x92DD, + 6335: 0x92DF, + 6336: 0x92E0, + 6337: 0x92E1, + 6338: 0x92E3, + 6339: 0x92E5, + 6340: 0x92E7, + 6341: 0x92E8, + 6342: 0x92EC, + 6343: 0x92EE, + 6344: 0x92F0, + 6345: 0x92F9, + 6346: 0x92FB, + 6347: 0x92FF, + 6348: 0x9300, + 6349: 0x9302, + 6350: 0x9308, + 6351: 0x930D, + 6352: 0x9311, + 6353: 0x9314, + 6354: 0x9315, + 6355: 0x931C, + 6356: 0x931D, + 6357: 0x931E, + 6358: 0x931F, + 6359: 0x9321, + 6360: 0x9324, + 6361: 0x9325, + 6362: 0x9327, + 6363: 0x9329, + 6364: 0x932A, + 6365: 0x9333, + 6366: 0x9334, + 6367: 0x9336, + 6368: 0x9337, + 6369: 0x9347, + 6370: 0x9348, + 6371: 0x9349, + 6372: 0x9350, + 6373: 0x9351, + 6374: 0x9352, + 6375: 0x9355, + 6376: 0x9357, + 6377: 0x9358, + 6378: 0x935A, + 6379: 0x935E, + 6380: 0x9364, + 6381: 0x9365, + 6382: 0x9367, + 6383: 0x9369, + 6384: 0x936A, + 6385: 0x936D, + 6386: 0x936F, + 6387: 0x9370, + 6388: 0x9371, + 6389: 0x9373, + 6390: 0x9374, + 6391: 0x9376, + 6392: 0x937A, + 6393: 0x937D, + 6394: 0x937F, + 6395: 0x9380, + 6396: 0x9381, + 6397: 0x9382, + 6398: 0x9388, + 6399: 0x938A, + 6400: 0x938B, + 6401: 0x938D, + 6402: 0x938F, + 6403: 0x9392, + 6404: 0x9395, + 6405: 0x9398, + 6406: 0x939B, + 6407: 0x939E, + 6408: 0x93A1, + 6409: 0x93A3, + 6410: 0x93A4, + 6411: 0x93A6, + 6412: 0x93A8, + 6413: 0x93AB, + 6414: 0x93B4, + 6415: 0x93B5, + 6416: 0x93B6, + 6417: 0x93BA, + 6418: 0x93A9, + 6419: 0x93C1, + 6420: 0x93C4, + 6421: 0x93C5, + 6422: 0x93C6, + 6423: 0x93C7, + 6424: 0x93C9, + 6425: 0x93CA, + 6426: 0x93CB, + 6427: 0x93CC, + 6428: 0x93CD, + 6429: 0x93D3, + 6430: 0x93D9, + 6431: 0x93DC, + 6432: 0x93DE, + 6433: 0x93DF, + 6434: 0x93E2, + 6435: 0x93E6, + 6436: 0x93E7, + 6437: 0x93F9, + 6438: 0x93F7, + 6439: 0x93F8, + 6440: 0x93FA, + 6441: 0x93FB, + 6442: 0x93FD, + 6443: 0x9401, + 6444: 0x9402, + 6445: 0x9404, + 6446: 0x9408, + 6447: 0x9409, + 6448: 0x940D, + 6449: 0x940E, + 6450: 0x940F, + 6451: 0x9415, + 6452: 0x9416, + 6453: 0x9417, + 6454: 0x941F, + 6455: 0x942E, + 6456: 0x942F, + 6457: 0x9431, + 6458: 0x9432, + 6459: 0x9433, + 6460: 0x9434, + 6461: 0x943B, + 6462: 0x943F, + 6463: 0x943D, + 6464: 0x9443, + 6465: 0x9445, + 6466: 0x9448, + 6467: 0x944A, + 6468: 0x944C, + 6469: 0x9455, + 6470: 0x9459, + 6471: 0x945C, + 6472: 0x945F, + 6473: 0x9461, + 6474: 0x9463, + 6475: 0x9468, + 6476: 0x946B, + 6477: 0x946D, + 6478: 0x946E, + 6479: 0x946F, + 6480: 0x9471, + 6481: 0x9472, + 6482: 0x9484, + 6483: 0x9483, + 6484: 0x9578, + 6485: 0x9579, + 6486: 0x957E, + 6487: 0x9584, + 6488: 0x9588, + 6489: 0x958C, + 6490: 0x958D, + 6491: 0x958E, + 6492: 0x959D, + 6493: 0x959E, + 6494: 0x959F, + 6495: 0x95A1, + 6496: 0x95A6, + 6497: 0x95A9, + 6498: 0x95AB, + 6499: 0x95AC, + 6500: 0x95B4, + 6501: 0x95B6, + 6502: 0x95BA, + 6503: 0x95BD, + 6504: 0x95BF, + 6505: 0x95C6, + 6506: 0x95C8, + 6507: 0x95C9, + 6508: 0x95CB, + 6509: 0x95D0, + 6510: 0x95D1, + 6511: 0x95D2, + 6512: 0x95D3, + 6513: 0x95D9, + 6514: 0x95DA, + 6515: 0x95DD, + 6516: 0x95DE, + 6517: 0x95DF, + 6518: 0x95E0, + 6519: 0x95E4, + 6520: 0x95E6, + 6521: 0x961D, + 6522: 0x961E, + 6523: 0x9622, + 6524: 0x9624, + 6525: 0x9625, + 6526: 0x9626, + 6527: 0x962C, + 6528: 0x9631, + 6529: 0x9633, + 6530: 0x9637, + 6531: 0x9638, + 6532: 0x9639, + 6533: 0x963A, + 6534: 0x963C, + 6535: 0x963D, + 6536: 0x9641, + 6537: 0x9652, + 6538: 0x9654, + 6539: 0x9656, + 6540: 0x9657, + 6541: 0x9658, + 6542: 0x9661, + 6543: 0x966E, + 6544: 0x9674, + 6545: 0x967B, + 6546: 0x967C, + 6547: 0x967E, + 6548: 0x967F, + 6549: 0x9681, + 6550: 0x9682, + 6551: 0x9683, + 6552: 0x9684, + 6553: 0x9689, + 6554: 0x9691, + 6555: 0x9696, + 6556: 0x969A, + 6557: 0x969D, + 6558: 0x969F, + 6559: 0x96A4, + 6560: 0x96A5, + 6561: 0x96A6, + 6562: 0x96A9, + 6563: 0x96AE, + 6564: 0x96AF, + 6565: 0x96B3, + 6566: 0x96BA, + 6567: 0x96CA, + 6568: 0x96D2, + 6569: 0x5DB2, + 6570: 0x96D8, + 6571: 0x96DA, + 6572: 0x96DD, + 6573: 0x96DE, + 6574: 0x96DF, + 6575: 0x96E9, + 6576: 0x96EF, + 6577: 0x96F1, + 6578: 0x96FA, + 6579: 0x9702, + 6580: 0x9703, + 6581: 0x9705, + 6582: 0x9709, + 6583: 0x971A, + 6584: 0x971B, + 6585: 0x971D, + 6586: 0x9721, + 6587: 0x9722, + 6588: 0x9723, + 6589: 0x9728, + 6590: 0x9731, + 6591: 0x9733, + 6592: 0x9741, + 6593: 0x9743, + 6594: 0x974A, + 6595: 0x974E, + 6596: 0x974F, + 6597: 0x9755, + 6598: 0x9757, + 6599: 0x9758, + 6600: 0x975A, + 6601: 0x975B, + 6602: 0x9763, + 6603: 0x9767, + 6604: 0x976A, + 6605: 0x976E, + 6606: 0x9773, + 6607: 0x9776, + 6608: 0x9777, + 6609: 0x9778, + 6610: 0x977B, + 6611: 0x977D, + 6612: 0x977F, + 6613: 0x9780, + 6614: 0x9789, + 6615: 0x9795, + 6616: 0x9796, + 6617: 0x9797, + 6618: 0x9799, + 6619: 0x979A, + 6620: 0x979E, + 6621: 0x979F, + 6622: 0x97A2, + 6623: 0x97AC, + 6624: 0x97AE, + 6625: 0x97B1, + 6626: 0x97B2, + 6627: 0x97B5, + 6628: 0x97B6, + 6629: 0x97B8, + 6630: 0x97B9, + 6631: 0x97BA, + 6632: 0x97BC, + 6633: 0x97BE, + 6634: 0x97BF, + 6635: 0x97C1, + 6636: 0x97C4, + 6637: 0x97C5, + 6638: 0x97C7, + 6639: 0x97C9, + 6640: 0x97CA, + 6641: 0x97CC, + 6642: 0x97CD, + 6643: 0x97CE, + 6644: 0x97D0, + 6645: 0x97D1, + 6646: 0x97D4, + 6647: 0x97D7, + 6648: 0x97D8, + 6649: 0x97D9, + 6650: 0x97DD, + 6651: 0x97DE, + 6652: 0x97E0, + 6653: 0x97DB, + 6654: 0x97E1, + 6655: 0x97E4, + 6656: 0x97EF, + 6657: 0x97F1, + 6658: 0x97F4, + 6659: 0x97F7, + 6660: 0x97F8, + 6661: 0x97FA, + 6662: 0x9807, + 6663: 0x980A, + 6664: 0x9819, + 6665: 0x980D, + 6666: 0x980E, + 6667: 0x9814, + 6668: 0x9816, + 6669: 0x981C, + 6670: 0x981E, + 6671: 0x9820, + 6672: 0x9823, + 6673: 0x9826, + 6674: 0x982B, + 6675: 0x982E, + 6676: 0x982F, + 6677: 0x9830, + 6678: 0x9832, + 6679: 0x9833, + 6680: 0x9835, + 6681: 0x9825, + 6682: 0x983E, + 6683: 0x9844, + 6684: 0x9847, + 6685: 0x984A, + 6686: 0x9851, + 6687: 0x9852, + 6688: 0x9853, + 6689: 0x9856, + 6690: 0x9857, + 6691: 0x9859, + 6692: 0x985A, + 6693: 0x9862, + 6694: 0x9863, + 6695: 0x9865, + 6696: 0x9866, + 6697: 0x986A, + 6698: 0x986C, + 6699: 0x98AB, + 6700: 0x98AD, + 6701: 0x98AE, + 6702: 0x98B0, + 6703: 0x98B4, + 6704: 0x98B7, + 6705: 0x98B8, + 6706: 0x98BA, + 6707: 0x98BB, + 6708: 0x98BF, + 6709: 0x98C2, + 6710: 0x98C5, + 6711: 0x98C8, + 6712: 0x98CC, + 6713: 0x98E1, + 6714: 0x98E3, + 6715: 0x98E5, + 6716: 0x98E6, + 6717: 0x98E7, + 6718: 0x98EA, + 6719: 0x98F3, + 6720: 0x98F6, + 6721: 0x9902, + 6722: 0x9907, + 6723: 0x9908, + 6724: 0x9911, + 6725: 0x9915, + 6726: 0x9916, + 6727: 0x9917, + 6728: 0x991A, + 6729: 0x991B, + 6730: 0x991C, + 6731: 0x991F, + 6732: 0x9922, + 6733: 0x9926, + 6734: 0x9927, + 6735: 0x992B, + 6736: 0x9931, + 6737: 0x9932, + 6738: 0x9933, + 6739: 0x9934, + 6740: 0x9935, + 6741: 0x9939, + 6742: 0x993A, + 6743: 0x993B, + 6744: 0x993C, + 6745: 0x9940, + 6746: 0x9941, + 6747: 0x9946, + 6748: 0x9947, + 6749: 0x9948, + 6750: 0x994D, + 6751: 0x994E, + 6752: 0x9954, + 6753: 0x9958, + 6754: 0x9959, + 6755: 0x995B, + 6756: 0x995C, + 6757: 0x995E, + 6758: 0x995F, + 6759: 0x9960, + 6760: 0x999B, + 6761: 0x999D, + 6762: 0x999F, + 6763: 0x99A6, + 6764: 0x99B0, + 6765: 0x99B1, + 6766: 0x99B2, + 6767: 0x99B5, + 6768: 0x99B9, + 6769: 0x99BA, + 6770: 0x99BD, + 6771: 0x99BF, + 6772: 0x99C3, + 6773: 0x99C9, + 6774: 0x99D3, + 6775: 0x99D4, + 6776: 0x99D9, + 6777: 0x99DA, + 6778: 0x99DC, + 6779: 0x99DE, + 6780: 0x99E7, + 6781: 0x99EA, + 6782: 0x99EB, + 6783: 0x99EC, + 6784: 0x99F0, + 6785: 0x99F4, + 6786: 0x99F5, + 6787: 0x99F9, + 6788: 0x99FD, + 6789: 0x99FE, + 6790: 0x9A02, + 6791: 0x9A03, + 6792: 0x9A04, + 6793: 0x9A0B, + 6794: 0x9A0C, + 6795: 0x9A10, + 6796: 0x9A11, + 6797: 0x9A16, + 6798: 0x9A1E, + 6799: 0x9A20, + 6800: 0x9A22, + 6801: 0x9A23, + 6802: 0x9A24, + 6803: 0x9A27, + 6804: 0x9A2D, + 6805: 0x9A2E, + 6806: 0x9A33, + 6807: 0x9A35, + 6808: 0x9A36, + 6809: 0x9A38, + 6810: 0x9A47, + 6811: 0x9A41, + 6812: 0x9A44, + 6813: 0x9A4A, + 6814: 0x9A4B, + 6815: 0x9A4C, + 6816: 0x9A4E, + 6817: 0x9A51, + 6818: 0x9A54, + 6819: 0x9A56, + 6820: 0x9A5D, + 6821: 0x9AAA, + 6822: 0x9AAC, + 6823: 0x9AAE, + 6824: 0x9AAF, + 6825: 0x9AB2, + 6826: 0x9AB4, + 6827: 0x9AB5, + 6828: 0x9AB6, + 6829: 0x9AB9, + 6830: 0x9ABB, + 6831: 0x9ABE, + 6832: 0x9ABF, + 6833: 0x9AC1, + 6834: 0x9AC3, + 6835: 0x9AC6, + 6836: 0x9AC8, + 6837: 0x9ACE, + 6838: 0x9AD0, + 6839: 0x9AD2, + 6840: 0x9AD5, + 6841: 0x9AD6, + 6842: 0x9AD7, + 6843: 0x9ADB, + 6844: 0x9ADC, + 6845: 0x9AE0, + 6846: 0x9AE4, + 6847: 0x9AE5, + 6848: 0x9AE7, + 6849: 0x9AE9, + 6850: 0x9AEC, + 6851: 0x9AF2, + 6852: 0x9AF3, + 6853: 0x9AF5, + 6854: 0x9AF9, + 6855: 0x9AFA, + 6856: 0x9AFD, + 6857: 0x9AFF, + 6858: 0x9B00, + 6859: 0x9B01, + 6860: 0x9B02, + 6861: 0x9B03, + 6862: 0x9B04, + 6863: 0x9B05, + 6864: 0x9B08, + 6865: 0x9B09, + 6866: 0x9B0B, + 6867: 0x9B0C, + 6868: 0x9B0D, + 6869: 0x9B0E, + 6870: 0x9B10, + 6871: 0x9B12, + 6872: 0x9B16, + 6873: 0x9B19, + 6874: 0x9B1B, + 6875: 0x9B1C, + 6876: 0x9B20, + 6877: 0x9B26, + 6878: 0x9B2B, + 6879: 0x9B2D, + 6880: 0x9B33, + 6881: 0x9B34, + 6882: 0x9B35, + 6883: 0x9B37, + 6884: 0x9B39, + 6885: 0x9B3A, + 6886: 0x9B3D, + 6887: 0x9B48, + 6888: 0x9B4B, + 6889: 0x9B4C, + 6890: 0x9B55, + 6891: 0x9B56, + 6892: 0x9B57, + 6893: 0x9B5B, + 6894: 0x9B5E, + 6895: 0x9B61, + 6896: 0x9B63, + 6897: 0x9B65, + 6898: 0x9B66, + 6899: 0x9B68, + 6900: 0x9B6A, + 6901: 0x9B6B, + 6902: 0x9B6C, + 6903: 0x9B6D, + 6904: 0x9B6E, + 6905: 0x9B73, + 6906: 0x9B75, + 6907: 0x9B77, + 6908: 0x9B78, + 6909: 0x9B79, + 6910: 0x9B7F, + 6911: 0x9B80, + 6912: 0x9B84, + 6913: 0x9B85, + 6914: 0x9B86, + 6915: 0x9B87, + 6916: 0x9B89, + 6917: 0x9B8A, + 6918: 0x9B8B, + 6919: 0x9B8D, + 6920: 0x9B8F, + 6921: 0x9B90, + 6922: 0x9B94, + 6923: 0x9B9A, + 6924: 0x9B9D, + 6925: 0x9B9E, + 6926: 0x9BA6, + 6927: 0x9BA7, + 6928: 0x9BA9, + 6929: 0x9BAC, + 6930: 0x9BB0, + 6931: 0x9BB1, + 6932: 0x9BB2, + 6933: 0x9BB7, + 6934: 0x9BB8, + 6935: 0x9BBB, + 6936: 0x9BBC, + 6937: 0x9BBE, + 6938: 0x9BBF, + 6939: 0x9BC1, + 6940: 0x9BC7, + 6941: 0x9BC8, + 6942: 0x9BCE, + 6943: 0x9BD0, + 6944: 0x9BD7, + 6945: 0x9BD8, + 6946: 0x9BDD, + 6947: 0x9BDF, + 6948: 0x9BE5, + 6949: 0x9BE7, + 6950: 0x9BEA, + 6951: 0x9BEB, + 6952: 0x9BEF, + 6953: 0x9BF3, + 6954: 0x9BF7, + 6955: 0x9BF8, + 6956: 0x9BF9, + 6957: 0x9BFA, + 6958: 0x9BFD, + 6959: 0x9BFF, + 6960: 0x9C00, + 6961: 0x9C02, + 6962: 0x9C0B, + 6963: 0x9C0F, + 6964: 0x9C11, + 6965: 0x9C16, + 6966: 0x9C18, + 6967: 0x9C19, + 6968: 0x9C1A, + 6969: 0x9C1C, + 6970: 0x9C1E, + 6971: 0x9C22, + 6972: 0x9C23, + 6973: 0x9C26, + 6974: 0x9C27, + 6975: 0x9C28, + 6976: 0x9C29, + 6977: 0x9C2A, + 6978: 0x9C31, + 6979: 0x9C35, + 6980: 0x9C36, + 6981: 0x9C37, + 6982: 0x9C3D, + 6983: 0x9C41, + 6984: 0x9C43, + 6985: 0x9C44, + 6986: 0x9C45, + 6987: 0x9C49, + 6988: 0x9C4A, + 6989: 0x9C4E, + 6990: 0x9C4F, + 6991: 0x9C50, + 6992: 0x9C53, + 6993: 0x9C54, + 6994: 0x9C56, + 6995: 0x9C58, + 6996: 0x9C5B, + 6997: 0x9C5D, + 6998: 0x9C5E, + 6999: 0x9C5F, + 7000: 0x9C63, + 7001: 0x9C69, + 7002: 0x9C6A, + 7003: 0x9C5C, + 7004: 0x9C6B, + 7005: 0x9C68, + 7006: 0x9C6E, + 7007: 0x9C70, + 7008: 0x9C72, + 7009: 0x9C75, + 7010: 0x9C77, + 7011: 0x9C7B, + 7012: 0x9CE6, + 7013: 0x9CF2, + 7014: 0x9CF7, + 7015: 0x9CF9, + 7016: 0x9D0B, + 7017: 0x9D02, + 7018: 0x9D11, + 7019: 0x9D17, + 7020: 0x9D18, + 7021: 0x9D1C, + 7022: 0x9D1D, + 7023: 0x9D1E, + 7024: 0x9D2F, + 7025: 0x9D30, + 7026: 0x9D32, + 7027: 0x9D33, + 7028: 0x9D34, + 7029: 0x9D3A, + 7030: 0x9D3C, + 7031: 0x9D45, + 7032: 0x9D3D, + 7033: 0x9D42, + 7034: 0x9D43, + 7035: 0x9D47, + 7036: 0x9D4A, + 7037: 0x9D53, + 7038: 0x9D54, + 7039: 0x9D5F, + 7040: 0x9D63, + 7041: 0x9D62, + 7042: 0x9D65, + 7043: 0x9D69, + 7044: 0x9D6A, + 7045: 0x9D6B, + 7046: 0x9D70, + 7047: 0x9D76, + 7048: 0x9D77, + 7049: 0x9D7B, + 7050: 0x9D7C, + 7051: 0x9D7E, + 7052: 0x9D83, + 7053: 0x9D84, + 7054: 0x9D86, + 7055: 0x9D8A, + 7056: 0x9D8D, + 7057: 0x9D8E, + 7058: 0x9D92, + 7059: 0x9D93, + 7060: 0x9D95, + 7061: 0x9D96, + 7062: 0x9D97, + 7063: 0x9D98, + 7064: 0x9DA1, + 7065: 0x9DAA, + 7066: 0x9DAC, + 7067: 0x9DAE, + 7068: 0x9DB1, + 7069: 0x9DB5, + 7070: 0x9DB9, + 7071: 0x9DBC, + 7072: 0x9DBF, + 7073: 0x9DC3, + 7074: 0x9DC7, + 7075: 0x9DC9, + 7076: 0x9DCA, + 7077: 0x9DD4, + 7078: 0x9DD5, + 7079: 0x9DD6, + 7080: 0x9DD7, + 7081: 0x9DDA, + 7082: 0x9DDE, + 7083: 0x9DDF, + 7084: 0x9DE0, + 7085: 0x9DE5, + 7086: 0x9DE7, + 7087: 0x9DE9, + 7088: 0x9DEB, + 7089: 0x9DEE, + 7090: 0x9DF0, + 7091: 0x9DF3, + 7092: 0x9DF4, + 7093: 0x9DFE, + 7094: 0x9E0A, + 7095: 0x9E02, + 7096: 0x9E07, + 7097: 0x9E0E, + 7098: 0x9E10, + 7099: 0x9E11, + 7100: 0x9E12, + 7101: 0x9E15, + 7102: 0x9E16, + 7103: 0x9E19, + 7104: 0x9E1C, + 7105: 0x9E1D, + 7106: 0x9E7A, + 7107: 0x9E7B, + 7108: 0x9E7C, + 7109: 0x9E80, + 7110: 0x9E82, + 7111: 0x9E83, + 7112: 0x9E84, + 7113: 0x9E85, + 7114: 0x9E87, + 7115: 0x9E8E, + 7116: 0x9E8F, + 7117: 0x9E96, + 7118: 0x9E98, + 7119: 0x9E9B, + 7120: 0x9E9E, + 7121: 0x9EA4, + 7122: 0x9EA8, + 7123: 0x9EAC, + 7124: 0x9EAE, + 7125: 0x9EAF, + 7126: 0x9EB0, + 7127: 0x9EB3, + 7128: 0x9EB4, + 7129: 0x9EB5, + 7130: 0x9EC6, + 7131: 0x9EC8, + 7132: 0x9ECB, + 7133: 0x9ED5, + 7134: 0x9EDF, + 7135: 0x9EE4, + 7136: 0x9EE7, + 7137: 0x9EEC, + 7138: 0x9EED, + 7139: 0x9EEE, + 7140: 0x9EF0, + 7141: 0x9EF1, + 7142: 0x9EF2, + 7143: 0x9EF5, + 7144: 0x9EF8, + 7145: 0x9EFF, + 7146: 0x9F02, + 7147: 0x9F03, + 7148: 0x9F09, + 7149: 0x9F0F, + 7150: 0x9F10, + 7151: 0x9F11, + 7152: 0x9F12, + 7153: 0x9F14, + 7154: 0x9F16, + 7155: 0x9F17, + 7156: 0x9F19, + 7157: 0x9F1A, + 7158: 0x9F1B, + 7159: 0x9F1F, + 7160: 0x9F22, + 7161: 0x9F26, + 7162: 0x9F2A, + 7163: 0x9F2B, + 7164: 0x9F2F, + 7165: 0x9F31, + 7166: 0x9F32, + 7167: 0x9F34, + 7168: 0x9F37, + 7169: 0x9F39, + 7170: 0x9F3A, + 7171: 0x9F3C, + 7172: 0x9F3D, + 7173: 0x9F3F, + 7174: 0x9F41, + 7175: 0x9F43, + 7176: 0x9F44, + 7177: 0x9F45, + 7178: 0x9F46, + 7179: 0x9F47, + 7180: 0x9F53, + 7181: 0x9F55, + 7182: 0x9F56, + 7183: 0x9F57, + 7184: 0x9F58, + 7185: 0x9F5A, + 7186: 0x9F5D, + 7187: 0x9F5E, + 7188: 0x9F68, + 7189: 0x9F69, + 7190: 0x9F6D, + 7191: 0x9F6E, + 7192: 0x9F6F, + 7193: 0x9F70, + 7194: 0x9F71, + 7195: 0x9F73, + 7196: 0x9F75, + 7197: 0x9F7A, + 7198: 0x9F7D, + 7199: 0x9F8F, + 7200: 0x9F90, + 7201: 0x9F91, + 7202: 0x9F92, + 7203: 0x9F94, + 7204: 0x9F96, + 7205: 0x9F97, + 7206: 0x9F9E, + 7207: 0x9FA1, + 7208: 0x9FA2, + 7209: 0x9FA3, + 7210: 0x9FA5, +} + +const ( + jis0208 = 1 + jis0212 = 2 + codeMask = 0x7f + codeShift = 7 + tableShift = 14 +) + +const numEncodeTables = 6 + +// encodeX are the encoding tables from Unicode to JIS code, +// sorted by decreasing length. +// encode0: 20902 entries for runes in [19968, 40870). +// encode1: 1632 entries for runes in [ 8208, 9840). +// encode2: 974 entries for runes in [12288, 13262). +// encode3: 959 entries for runes in [ 161, 1120). +// encode4: 261 entries for runes in [63785, 64046). +// encode5: 229 entries for runes in [65281, 65510). +// +// The high two bits of the value record whether the JIS code comes from the +// JIS0208 table (high bits == 1) or the JIS0212 table (high bits == 2). +// The low 14 bits are two 7-bit unsigned integers j1 and j2 that form the +// JIS code (94*j1 + j2) within that table. + +const encode0Low, encode0High = 19968, 40870 + +var encode0 = [...]uint16{ + 19968 - 19968: jis0208<<14 | 0x0F<<7 | 0x4B, + 19969 - 19968: jis0208<<14 | 0x22<<7 | 0x59, + 19970 - 19968: jis0212<<14 | 0x0F<<7 | 0x00, + 19971 - 19968: jis0208<<14 | 0x1B<<7 | 0x16, + 19972 - 19968: jis0212<<14 | 0x0F<<7 | 0x01, + 19973 - 19968: jis0212<<14 | 0x0F<<7 | 0x02, + 19975 - 19968: jis0208<<14 | 0x2A<<7 | 0x5B, + 19976 - 19968: jis0208<<14 | 0x1D<<7 | 0x45, + 19977 - 19968: jis0208<<14 | 0x1A<<7 | 0x0F, + 19978 - 19968: jis0208<<14 | 0x1D<<7 | 0x44, + 19979 - 19968: jis0208<<14 | 0x11<<7 | 0x1B, + 19980 - 19968: jis0212<<14 | 0x0F<<7 | 0x03, + 19981 - 19968: jis0208<<14 | 0x28<<7 | 0x33, + 19982 - 19968: jis0208<<14 | 0x2C<<7 | 0x1E, + 19984 - 19968: jis0208<<14 | 0x2F<<7 | 0x01, + 19985 - 19968: jis0208<<14 | 0x10<<7 | 0x0E, + 19986 - 19968: jis0212<<14 | 0x0F<<7 | 0x04, + 19988 - 19968: jis0208<<14 | 0x12<<7 | 0x4D, + 19989 - 19968: jis0208<<14 | 0x2F<<7 | 0x02, + 19990 - 19968: jis0208<<14 | 0x1F<<7 | 0x03, + 19991 - 19968: jis0208<<14 | 0x31<<7 | 0x21, + 19992 - 19968: jis0208<<14 | 0x14<<7 | 0x35, + 19993 - 19968: jis0208<<14 | 0x29<<7 | 0x19, + 19998 - 19968: jis0208<<14 | 0x1D<<7 | 0x46, + 19999 - 19968: jis0212<<14 | 0x0F<<7 | 0x05, + 20001 - 19968: jis0208<<14 | 0x2D<<7 | 0x1D, + 20003 - 19968: jis0212<<14 | 0x0F<<7 | 0x06, + 20004 - 19968: jis0212<<14 | 0x0F<<7 | 0x07, + 20006 - 19968: jis0208<<14 | 0x29<<7 | 0x21, + 20008 - 19968: jis0208<<14 | 0x58<<7 | 0x0C, + 20010 - 19968: jis0208<<14 | 0x2F<<7 | 0x03, + 20011 - 19968: jis0212<<14 | 0x0F<<7 | 0x09, + 20013 - 19968: jis0208<<14 | 0x22<<7 | 0x45, + 20014 - 19968: jis0212<<14 | 0x0F<<7 | 0x0A, + 20015 - 19968: jis0212<<14 | 0x0F<<7 | 0x0B, + 20016 - 19968: jis0212<<14 | 0x0F<<7 | 0x0C, + 20017 - 19968: jis0208<<14 | 0x2F<<7 | 0x04, + 20018 - 19968: jis0208<<14 | 0x15<<7 | 0x59, + 20021 - 19968: jis0212<<14 | 0x0F<<7 | 0x0D, + 20022 - 19968: jis0208<<14 | 0x2F<<7 | 0x05, + 20024 - 19968: jis0208<<14 | 0x13<<7 | 0x3C, + 20025 - 19968: jis0208<<14 | 0x22<<7 | 0x0F, + 20027 - 19968: jis0208<<14 | 0x1B<<7 | 0x46, + 20028 - 19968: jis0208<<14 | 0x2F<<7 | 0x06, + 20031 - 19968: jis0208<<14 | 0x2F<<7 | 0x07, + 20032 - 19968: jis0212<<14 | 0x0F<<7 | 0x0E, + 20033 - 19968: jis0212<<14 | 0x0F<<7 | 0x0F, + 20034 - 19968: jis0208<<14 | 0x2F<<7 | 0x08, + 20035 - 19968: jis0208<<14 | 0x26<<7 | 0x14, + 20036 - 19968: jis0212<<14 | 0x0F<<7 | 0x10, + 20037 - 19968: jis0208<<14 | 0x14<<7 | 0x36, + 20039 - 19968: jis0212<<14 | 0x0F<<7 | 0x11, + 20043 - 19968: jis0208<<14 | 0x26<<7 | 0x16, + 20045 - 19968: jis0208<<14 | 0x25<<7 | 0x42, + 20046 - 19968: jis0208<<14 | 0x17<<7 | 0x22, + 20047 - 19968: jis0208<<14 | 0x2A<<7 | 0x12, + 20049 - 19968: jis0212<<14 | 0x0F<<7 | 0x12, + 20053 - 19968: jis0208<<14 | 0x48<<7 | 0x28, + 20054 - 19968: jis0208<<14 | 0x2F<<7 | 0x09, + 20055 - 19968: jis0208<<14 | 0x1D<<7 | 0x47, + 20056 - 19968: jis0208<<14 | 0x2F<<7 | 0x0A, + 20057 - 19968: jis0208<<14 | 0x11<<7 | 0x14, + 20058 - 19968: jis0212<<14 | 0x0F<<7 | 0x13, + 20060 - 19968: jis0212<<14 | 0x0F<<7 | 0x14, + 20061 - 19968: jis0208<<14 | 0x15<<7 | 0x44, + 20062 - 19968: jis0208<<14 | 0x17<<7 | 0x4F, + 20063 - 19968: jis0208<<14 | 0x2B<<7 | 0x48, + 20066 - 19968: jis0208<<14 | 0x35<<7 | 0x05, + 20067 - 19968: jis0212<<14 | 0x0F<<7 | 0x15, + 20072 - 19968: jis0212<<14 | 0x0F<<7 | 0x16, + 20073 - 19968: jis0212<<14 | 0x0F<<7 | 0x17, + 20081 - 19968: jis0208<<14 | 0x2C<<7 | 0x4F, + 20083 - 19968: jis0208<<14 | 0x25<<7 | 0x5C, + 20084 - 19968: jis0212<<14 | 0x0F<<7 | 0x18, + 20085 - 19968: jis0212<<14 | 0x0F<<7 | 0x19, + 20089 - 19968: jis0212<<14 | 0x0F<<7 | 0x1A, + 20094 - 19968: jis0208<<14 | 0x13<<7 | 0x04, + 20095 - 19968: jis0212<<14 | 0x0F<<7 | 0x1B, + 20096 - 19968: jis0208<<14 | 0x14<<7 | 0x14, + 20098 - 19968: jis0208<<14 | 0x2F<<7 | 0x0B, + 20101 - 19968: jis0208<<14 | 0x2F<<7 | 0x0C, + 20102 - 19968: jis0208<<14 | 0x2D<<7 | 0x1A, + 20104 - 19968: jis0208<<14 | 0x2C<<7 | 0x1C, + 20105 - 19968: jis0208<<14 | 0x20<<7 | 0x47, + 20106 - 19968: jis0208<<14 | 0x2F<<7 | 0x0E, + 20107 - 19968: jis0208<<14 | 0x1A<<7 | 0x55, + 20108 - 19968: jis0208<<14 | 0x25<<7 | 0x52, + 20109 - 19968: jis0212<<14 | 0x0F<<7 | 0x1C, + 20110 - 19968: jis0208<<14 | 0x2F<<7 | 0x11, + 20113 - 19968: jis0208<<14 | 0x10<<7 | 0x1D, + 20114 - 19968: jis0208<<14 | 0x17<<7 | 0x3E, + 20116 - 19968: jis0208<<14 | 0x17<<7 | 0x3D, + 20117 - 19968: jis0208<<14 | 0x0F<<7 | 0x45, + 20118 - 19968: jis0212<<14 | 0x0F<<7 | 0x1D, + 20119 - 19968: jis0212<<14 | 0x0F<<7 | 0x1E, + 20120 - 19968: jis0208<<14 | 0x2E<<7 | 0x2A, + 20121 - 19968: jis0208<<14 | 0x2E<<7 | 0x29, + 20123 - 19968: jis0208<<14 | 0x19<<7 | 0x12, + 20124 - 19968: jis0208<<14 | 0x0F<<7 | 0x00, + 20125 - 19968: jis0212<<14 | 0x0F<<7 | 0x1F, + 20126 - 19968: jis0208<<14 | 0x2F<<7 | 0x12, + 20127 - 19968: jis0208<<14 | 0x2F<<7 | 0x13, + 20128 - 19968: jis0208<<14 | 0x2F<<7 | 0x14, + 20129 - 19968: jis0208<<14 | 0x2A<<7 | 0x13, + 20130 - 19968: jis0208<<14 | 0x2F<<7 | 0x15, + 20132 - 19968: jis0208<<14 | 0x17<<7 | 0x51, + 20133 - 19968: jis0208<<14 | 0x0F<<7 | 0x46, + 20134 - 19968: jis0208<<14 | 0x2A<<7 | 0x51, + 20136 - 19968: jis0208<<14 | 0x14<<7 | 0x5B, + 20139 - 19968: jis0208<<14 | 0x14<<7 | 0x5C, + 20140 - 19968: jis0208<<14 | 0x14<<7 | 0x5D, + 20141 - 19968: jis0208<<14 | 0x23<<7 | 0x41, + 20142 - 19968: jis0208<<14 | 0x2D<<7 | 0x1B, + 20143 - 19968: jis0212<<14 | 0x0F<<7 | 0x20, + 20144 - 19968: jis0208<<14 | 0x2F<<7 | 0x16, + 20147 - 19968: jis0208<<14 | 0x2F<<7 | 0x17, + 20150 - 19968: jis0208<<14 | 0x2F<<7 | 0x18, + 20153 - 19968: jis0212<<14 | 0x0F<<7 | 0x21, + 20154 - 19968: jis0208<<14 | 0x1E<<7 | 0x2C, + 20160 - 19968: jis0208<<14 | 0x1C<<7 | 0x19, + 20161 - 19968: jis0208<<14 | 0x1E<<7 | 0x2D, + 20162 - 19968: jis0208<<14 | 0x2F<<7 | 0x1D, + 20163 - 19968: jis0212<<14 | 0x0F<<7 | 0x22, + 20164 - 19968: jis0208<<14 | 0x2F<<7 | 0x1B, + 20166 - 19968: jis0208<<14 | 0x2F<<7 | 0x1C, + 20167 - 19968: jis0208<<14 | 0x14<<7 | 0x37, + 20170 - 19968: jis0208<<14 | 0x19<<7 | 0x02, + 20171 - 19968: jis0208<<14 | 0x11<<7 | 0x4F, + 20173 - 19968: jis0208<<14 | 0x2F<<7 | 0x1A, + 20174 - 19968: jis0208<<14 | 0x2F<<7 | 0x19, + 20175 - 19968: jis0208<<14 | 0x29<<7 | 0x08, + 20176 - 19968: jis0212<<14 | 0x0F<<7 | 0x23, + 20180 - 19968: jis0208<<14 | 0x1A<<7 | 0x25, + 20181 - 19968: jis0208<<14 | 0x1A<<7 | 0x24, + 20182 - 19968: jis0208<<14 | 0x21<<7 | 0x1D, + 20183 - 19968: jis0208<<14 | 0x2F<<7 | 0x1E, + 20184 - 19968: jis0208<<14 | 0x28<<7 | 0x34, + 20185 - 19968: jis0208<<14 | 0x1F<<7 | 0x46, + 20186 - 19968: jis0212<<14 | 0x0F<<7 | 0x24, + 20187 - 19968: jis0212<<14 | 0x0F<<7 | 0x25, + 20189 - 19968: jis0208<<14 | 0x00<<7 | 0x17, + 20190 - 19968: jis0208<<14 | 0x2F<<7 | 0x1F, + 20191 - 19968: jis0208<<14 | 0x2F<<7 | 0x21, + 20192 - 19968: jis0212<<14 | 0x0F<<7 | 0x26, + 20193 - 19968: jis0208<<14 | 0x58<<7 | 0x0D, + 20194 - 19968: jis0212<<14 | 0x0F<<7 | 0x28, + 20195 - 19968: jis0208<<14 | 0x21<<7 | 0x44, + 20196 - 19968: jis0208<<14 | 0x2D<<7 | 0x40, + 20197 - 19968: jis0208<<14 | 0x0F<<7 | 0x29, + 20200 - 19968: jis0212<<14 | 0x0F<<7 | 0x29, + 20205 - 19968: jis0208<<14 | 0x2F<<7 | 0x20, + 20206 - 19968: jis0208<<14 | 0x11<<7 | 0x1D, + 20207 - 19968: jis0212<<14 | 0x0F<<7 | 0x2A, + 20208 - 19968: jis0208<<14 | 0x15<<7 | 0x23, + 20209 - 19968: jis0212<<14 | 0x0F<<7 | 0x2B, + 20210 - 19968: jis0208<<14 | 0x22<<7 | 0x46, + 20211 - 19968: jis0212<<14 | 0x0F<<7 | 0x2C, + 20213 - 19968: jis0212<<14 | 0x0F<<7 | 0x2D, + 20214 - 19968: jis0208<<14 | 0x16<<7 | 0x4E, + 20215 - 19968: jis0208<<14 | 0x2F<<7 | 0x22, + 20219 - 19968: jis0208<<14 | 0x26<<7 | 0x03, + 20220 - 19968: jis0208<<14 | 0x58<<7 | 0x0E, + 20221 - 19968: jis0212<<14 | 0x0F<<7 | 0x2E, + 20222 - 19968: jis0212<<14 | 0x0F<<7 | 0x2F, + 20223 - 19968: jis0212<<14 | 0x0F<<7 | 0x30, + 20224 - 19968: jis0208<<14 | 0x58<<7 | 0x0F, + 20225 - 19968: jis0208<<14 | 0x13<<7 | 0x4A, + 20226 - 19968: jis0212<<14 | 0x0F<<7 | 0x32, + 20227 - 19968: jis0208<<14 | 0x58<<7 | 0x10, + 20232 - 19968: jis0212<<14 | 0x0F<<7 | 0x34, + 20233 - 19968: jis0208<<14 | 0x2F<<7 | 0x23, + 20234 - 19968: jis0208<<14 | 0x0F<<7 | 0x2A, + 20235 - 19968: jis0212<<14 | 0x0F<<7 | 0x35, + 20236 - 19968: jis0212<<14 | 0x0F<<7 | 0x36, + 20237 - 19968: jis0208<<14 | 0x17<<7 | 0x3F, + 20238 - 19968: jis0208<<14 | 0x13<<7 | 0x4B, + 20239 - 19968: jis0208<<14 | 0x28<<7 | 0x59, + 20240 - 19968: jis0208<<14 | 0x27<<7 | 0x11, + 20241 - 19968: jis0208<<14 | 0x14<<7 | 0x38, + 20242 - 19968: jis0212<<14 | 0x0F<<7 | 0x37, + 20245 - 19968: jis0212<<14 | 0x0F<<7 | 0x38, + 20246 - 19968: jis0212<<14 | 0x0F<<7 | 0x39, + 20247 - 19968: jis0212<<14 | 0x0F<<7 | 0x3A, + 20249 - 19968: jis0212<<14 | 0x0F<<7 | 0x3B, + 20250 - 19968: jis0208<<14 | 0x11<<7 | 0x50, + 20252 - 19968: jis0208<<14 | 0x2F<<7 | 0x46, + 20253 - 19968: jis0208<<14 | 0x24<<7 | 0x20, + 20270 - 19968: jis0212<<14 | 0x0F<<7 | 0x3C, + 20271 - 19968: jis0208<<14 | 0x26<<7 | 0x4B, + 20272 - 19968: jis0208<<14 | 0x2F<<7 | 0x25, + 20273 - 19968: jis0212<<14 | 0x0F<<7 | 0x3D, + 20275 - 19968: jis0212<<14 | 0x0F<<7 | 0x3F, + 20276 - 19968: jis0208<<14 | 0x27<<7 | 0x1B, + 20277 - 19968: jis0212<<14 | 0x0F<<7 | 0x40, + 20278 - 19968: jis0208<<14 | 0x2D<<7 | 0x41, + 20279 - 19968: jis0212<<14 | 0x0F<<7 | 0x41, + 20280 - 19968: jis0208<<14 | 0x1E<<7 | 0x0C, + 20281 - 19968: jis0208<<14 | 0x58<<7 | 0x11, + 20282 - 19968: jis0208<<14 | 0x1A<<7 | 0x26, + 20283 - 19968: jis0212<<14 | 0x0F<<7 | 0x43, + 20284 - 19968: jis0208<<14 | 0x1A<<7 | 0x56, + 20285 - 19968: jis0208<<14 | 0x11<<7 | 0x1F, + 20286 - 19968: jis0212<<14 | 0x0F<<7 | 0x44, + 20288 - 19968: jis0212<<14 | 0x0F<<7 | 0x45, + 20290 - 19968: jis0212<<14 | 0x0F<<7 | 0x46, + 20291 - 19968: jis0208<<14 | 0x23<<7 | 0x30, + 20294 - 19968: jis0208<<14 | 0x22<<7 | 0x01, + 20295 - 19968: jis0208<<14 | 0x2F<<7 | 0x29, + 20296 - 19968: jis0212<<14 | 0x0F<<7 | 0x47, + 20297 - 19968: jis0212<<14 | 0x0F<<7 | 0x48, + 20299 - 19968: jis0212<<14 | 0x0F<<7 | 0x49, + 20300 - 19968: jis0212<<14 | 0x0F<<7 | 0x4A, + 20301 - 19968: jis0208<<14 | 0x0F<<7 | 0x2B, + 20302 - 19968: jis0208<<14 | 0x23<<7 | 0x42, + 20303 - 19968: jis0208<<14 | 0x1C<<7 | 0x1A, + 20304 - 19968: jis0208<<14 | 0x19<<7 | 0x13, + 20305 - 19968: jis0208<<14 | 0x2C<<7 | 0x03, + 20306 - 19968: jis0212<<14 | 0x0F<<7 | 0x4B, + 20307 - 19968: jis0208<<14 | 0x21<<7 | 0x2D, + 20308 - 19968: jis0212<<14 | 0x0F<<7 | 0x4C, + 20309 - 19968: jis0208<<14 | 0x11<<7 | 0x1E, + 20310 - 19968: jis0208<<14 | 0x58<<7 | 0x12, + 20311 - 19968: jis0208<<14 | 0x2F<<7 | 0x28, + 20312 - 19968: jis0212<<14 | 0x0F<<7 | 0x4E, + 20313 - 19968: jis0208<<14 | 0x2C<<7 | 0x1D, + 20314 - 19968: jis0208<<14 | 0x2F<<7 | 0x24, + 20315 - 19968: jis0208<<14 | 0x2F<<7 | 0x26, + 20316 - 19968: jis0208<<14 | 0x19<<7 | 0x4D, + 20317 - 19968: jis0208<<14 | 0x2F<<7 | 0x27, + 20318 - 19968: jis0208<<14 | 0x34<<7 | 0x03, + 20319 - 19968: jis0212<<14 | 0x0F<<7 | 0x4F, + 20320 - 19968: jis0212<<14 | 0x0F<<7 | 0x3E, + 20323 - 19968: jis0212<<14 | 0x0F<<7 | 0x50, + 20329 - 19968: jis0208<<14 | 0x2F<<7 | 0x2F, + 20330 - 19968: jis0212<<14 | 0x0F<<7 | 0x51, + 20332 - 19968: jis0212<<14 | 0x0F<<7 | 0x52, + 20334 - 19968: jis0212<<14 | 0x0F<<7 | 0x53, + 20335 - 19968: jis0208<<14 | 0x2F<<7 | 0x32, + 20336 - 19968: jis0208<<14 | 0x2F<<7 | 0x30, + 20337 - 19968: jis0212<<14 | 0x0F<<7 | 0x54, + 20339 - 19968: jis0208<<14 | 0x11<<7 | 0x21, + 20341 - 19968: jis0208<<14 | 0x29<<7 | 0x1A, + 20342 - 19968: jis0208<<14 | 0x2F<<7 | 0x2A, + 20343 - 19968: jis0212<<14 | 0x0F<<7 | 0x55, + 20344 - 19968: jis0212<<14 | 0x0F<<7 | 0x56, + 20345 - 19968: jis0212<<14 | 0x0F<<7 | 0x57, + 20346 - 19968: jis0212<<14 | 0x0F<<7 | 0x58, + 20347 - 19968: jis0208<<14 | 0x2F<<7 | 0x2E, + 20348 - 19968: jis0208<<14 | 0x17<<7 | 0x52, + 20349 - 19968: jis0212<<14 | 0x0F<<7 | 0x59, + 20350 - 19968: jis0212<<14 | 0x0F<<7 | 0x5A, + 20351 - 19968: jis0208<<14 | 0x1A<<7 | 0x27, + 20353 - 19968: jis0212<<14 | 0x0F<<7 | 0x5B, + 20354 - 19968: jis0212<<14 | 0x0F<<7 | 0x5C, + 20355 - 19968: jis0208<<14 | 0x13<<7 | 0x05, + 20356 - 19968: jis0212<<14 | 0x0F<<7 | 0x5D, + 20357 - 19968: jis0212<<14 | 0x10<<7 | 0x00, + 20358 - 19968: jis0208<<14 | 0x2F<<7 | 0x33, + 20360 - 19968: jis0208<<14 | 0x2F<<7 | 0x2B, + 20361 - 19968: jis0212<<14 | 0x10<<7 | 0x01, + 20362 - 19968: jis0208<<14 | 0x58<<7 | 0x14, + 20363 - 19968: jis0208<<14 | 0x2D<<7 | 0x42, + 20364 - 19968: jis0212<<14 | 0x10<<7 | 0x03, + 20365 - 19968: jis0208<<14 | 0x1A<<7 | 0x57, + 20366 - 19968: jis0212<<14 | 0x10<<7 | 0x04, + 20367 - 19968: jis0208<<14 | 0x2F<<7 | 0x2C, + 20368 - 19968: jis0212<<14 | 0x10<<7 | 0x05, + 20369 - 19968: jis0208<<14 | 0x2F<<7 | 0x31, + 20370 - 19968: jis0208<<14 | 0x58<<7 | 0x13, + 20371 - 19968: jis0212<<14 | 0x10<<7 | 0x07, + 20372 - 19968: jis0208<<14 | 0x58<<7 | 0x16, + 20374 - 19968: jis0208<<14 | 0x2F<<7 | 0x34, + 20375 - 19968: jis0212<<14 | 0x10<<7 | 0x09, + 20376 - 19968: jis0208<<14 | 0x2F<<7 | 0x2D, + 20377 - 19968: jis0212<<14 | 0x10<<7 | 0x0A, + 20378 - 19968: jis0208<<14 | 0x58<<7 | 0x15, + 20379 - 19968: jis0208<<14 | 0x15<<7 | 0x00, + 20381 - 19968: jis0208<<14 | 0x0F<<7 | 0x2C, + 20382 - 19968: jis0212<<14 | 0x10<<7 | 0x0C, + 20383 - 19968: jis0212<<14 | 0x10<<7 | 0x0D, + 20384 - 19968: jis0208<<14 | 0x15<<7 | 0x01, + 20385 - 19968: jis0208<<14 | 0x11<<7 | 0x20, + 20395 - 19968: jis0208<<14 | 0x34<<7 | 0x04, + 20397 - 19968: jis0208<<14 | 0x2A<<7 | 0x58, + 20398 - 19968: jis0208<<14 | 0x28<<7 | 0x4D, + 20399 - 19968: jis0208<<14 | 0x17<<7 | 0x53, + 20402 - 19968: jis0212<<14 | 0x10<<7 | 0x0E, + 20405 - 19968: jis0208<<14 | 0x1E<<7 | 0x0E, + 20406 - 19968: jis0208<<14 | 0x2D<<7 | 0x16, + 20407 - 19968: jis0212<<14 | 0x10<<7 | 0x0F, + 20409 - 19968: jis0212<<14 | 0x10<<7 | 0x10, + 20411 - 19968: jis0212<<14 | 0x10<<7 | 0x11, + 20412 - 19968: jis0212<<14 | 0x10<<7 | 0x12, + 20413 - 19968: jis0212<<14 | 0x10<<7 | 0x13, + 20414 - 19968: jis0212<<14 | 0x10<<7 | 0x14, + 20415 - 19968: jis0208<<14 | 0x29<<7 | 0x37, + 20416 - 19968: jis0212<<14 | 0x10<<7 | 0x15, + 20417 - 19968: jis0212<<14 | 0x10<<7 | 0x16, + 20418 - 19968: jis0208<<14 | 0x16<<7 | 0x17, + 20419 - 19968: jis0208<<14 | 0x21<<7 | 0x04, + 20420 - 19968: jis0208<<14 | 0x11<<7 | 0x43, + 20421 - 19968: jis0212<<14 | 0x10<<7 | 0x17, + 20422 - 19968: jis0212<<14 | 0x10<<7 | 0x18, + 20424 - 19968: jis0212<<14 | 0x10<<7 | 0x19, + 20425 - 19968: jis0208<<14 | 0x58<<7 | 0x05, + 20426 - 19968: jis0208<<14 | 0x1C<<7 | 0x32, + 20427 - 19968: jis0212<<14 | 0x10<<7 | 0x1B, + 20428 - 19968: jis0212<<14 | 0x10<<7 | 0x1C, + 20429 - 19968: jis0208<<14 | 0x58<<7 | 0x17, + 20430 - 19968: jis0208<<14 | 0x2F<<7 | 0x38, + 20431 - 19968: jis0212<<14 | 0x10<<7 | 0x1E, + 20432 - 19968: jis0208<<14 | 0x2F<<7 | 0x3D, + 20433 - 19968: jis0208<<14 | 0x2F<<7 | 0x3B, + 20434 - 19968: jis0212<<14 | 0x10<<7 | 0x1F, + 20436 - 19968: jis0208<<14 | 0x2F<<7 | 0x36, + 20439 - 19968: jis0208<<14 | 0x21<<7 | 0x0E, + 20440 - 19968: jis0208<<14 | 0x2F<<7 | 0x39, + 20442 - 19968: jis0208<<14 | 0x2F<<7 | 0x3C, + 20443 - 19968: jis0208<<14 | 0x2F<<7 | 0x3A, + 20444 - 19968: jis0212<<14 | 0x10<<7 | 0x20, + 20445 - 19968: jis0208<<14 | 0x29<<7 | 0x3C, + 20447 - 19968: jis0208<<14 | 0x2F<<7 | 0x37, + 20448 - 19968: jis0212<<14 | 0x10<<7 | 0x21, + 20449 - 19968: jis0208<<14 | 0x1E<<7 | 0x0D, + 20450 - 19968: jis0212<<14 | 0x10<<7 | 0x22, + 20451 - 19968: jis0208<<14 | 0x2A<<7 | 0x52, + 20452 - 19968: jis0208<<14 | 0x2F<<7 | 0x3E, + 20453 - 19968: jis0208<<14 | 0x2F<<7 | 0x3F, + 20462 - 19968: jis0208<<14 | 0x1C<<7 | 0x03, + 20463 - 19968: jis0208<<14 | 0x2F<<7 | 0x4C, + 20464 - 19968: jis0212<<14 | 0x10<<7 | 0x23, + 20466 - 19968: jis0212<<14 | 0x10<<7 | 0x24, + 20467 - 19968: jis0208<<14 | 0x26<<7 | 0x2F, + 20469 - 19968: jis0208<<14 | 0x28<<7 | 0x15, + 20470 - 19968: jis0208<<14 | 0x2F<<7 | 0x47, + 20472 - 19968: jis0208<<14 | 0x29<<7 | 0x4F, + 20474 - 19968: jis0208<<14 | 0x11<<7 | 0x15, + 20476 - 19968: jis0212<<14 | 0x10<<7 | 0x25, + 20477 - 19968: jis0212<<14 | 0x10<<7 | 0x26, + 20478 - 19968: jis0208<<14 | 0x2F<<7 | 0x4B, + 20479 - 19968: jis0208<<14 | 0x58<<7 | 0x1A, + 20480 - 19968: jis0212<<14 | 0x10<<7 | 0x28, + 20481 - 19968: jis0212<<14 | 0x10<<7 | 0x29, + 20484 - 19968: jis0212<<14 | 0x10<<7 | 0x2A, + 20485 - 19968: jis0208<<14 | 0x2F<<7 | 0x45, + 20486 - 19968: jis0208<<14 | 0x2F<<7 | 0x4E, + 20487 - 19968: jis0212<<14 | 0x10<<7 | 0x2B, + 20489 - 19968: jis0208<<14 | 0x20<<7 | 0x31, + 20490 - 19968: jis0212<<14 | 0x10<<7 | 0x2C, + 20491 - 19968: jis0208<<14 | 0x17<<7 | 0x23, + 20492 - 19968: jis0212<<14 | 0x10<<7 | 0x2D, + 20493 - 19968: jis0208<<14 | 0x26<<7 | 0x3B, + 20494 - 19968: jis0212<<14 | 0x10<<7 | 0x2E, + 20495 - 19968: jis0208<<14 | 0x3F<<7 | 0x26, + 20496 - 19968: jis0212<<14 | 0x10<<7 | 0x2F, + 20497 - 19968: jis0208<<14 | 0x2F<<7 | 0x4D, + 20498 - 19968: jis0208<<14 | 0x24<<7 | 0x3C, + 20499 - 19968: jis0212<<14 | 0x10<<7 | 0x30, + 20500 - 19968: jis0208<<14 | 0x2F<<7 | 0x42, + 20502 - 19968: jis0208<<14 | 0x17<<7 | 0x55, + 20503 - 19968: jis0212<<14 | 0x10<<7 | 0x31, + 20504 - 19968: jis0212<<14 | 0x10<<7 | 0x32, + 20505 - 19968: jis0208<<14 | 0x17<<7 | 0x54, + 20506 - 19968: jis0208<<14 | 0x2F<<7 | 0x40, + 20507 - 19968: jis0212<<14 | 0x10<<7 | 0x33, + 20508 - 19968: jis0212<<14 | 0x10<<7 | 0x34, + 20509 - 19968: jis0212<<14 | 0x10<<7 | 0x35, + 20510 - 19968: jis0208<<14 | 0x58<<7 | 0x1B, + 20511 - 19968: jis0208<<14 | 0x1B<<7 | 0x39, + 20513 - 19968: jis0208<<14 | 0x2F<<7 | 0x48, + 20514 - 19968: jis0208<<14 | 0x58<<7 | 0x19, + 20515 - 19968: jis0208<<14 | 0x29<<7 | 0x4E, + 20516 - 19968: jis0208<<14 | 0x22<<7 | 0x2C, + 20517 - 19968: jis0208<<14 | 0x2F<<7 | 0x44, + 20518 - 19968: jis0208<<14 | 0x16<<7 | 0x50, + 20519 - 19968: jis0212<<14 | 0x10<<7 | 0x38, + 20520 - 19968: jis0208<<14 | 0x2F<<7 | 0x41, + 20521 - 19968: jis0208<<14 | 0x2F<<7 | 0x49, + 20522 - 19968: jis0208<<14 | 0x2F<<7 | 0x43, + 20523 - 19968: jis0208<<14 | 0x2D<<7 | 0x30, + 20524 - 19968: jis0208<<14 | 0x2F<<7 | 0x4A, + 20525 - 19968: jis0208<<14 | 0x2E<<7 | 0x20, + 20526 - 19968: jis0212<<14 | 0x10<<7 | 0x39, + 20528 - 19968: jis0212<<14 | 0x10<<7 | 0x3A, + 20530 - 19968: jis0212<<14 | 0x10<<7 | 0x3B, + 20531 - 19968: jis0212<<14 | 0x10<<7 | 0x3C, + 20533 - 19968: jis0212<<14 | 0x10<<7 | 0x3D, + 20534 - 19968: jis0208<<14 | 0x15<<7 | 0x45, + 20537 - 19968: jis0208<<14 | 0x16<<7 | 0x4F, + 20539 - 19968: jis0212<<14 | 0x10<<7 | 0x55, + 20544 - 19968: jis0208<<14 | 0x58<<7 | 0x18, + 20545 - 19968: jis0212<<14 | 0x10<<7 | 0x3F, + 20546 - 19968: jis0208<<14 | 0x58<<7 | 0x1E, + 20547 - 19968: jis0208<<14 | 0x2F<<7 | 0x4F, + 20549 - 19968: jis0212<<14 | 0x10<<7 | 0x41, + 20550 - 19968: jis0208<<14 | 0x58<<7 | 0x1C, + 20551 - 19968: jis0208<<14 | 0x2F<<7 | 0x50, + 20552 - 19968: jis0208<<14 | 0x2F<<7 | 0x54, + 20553 - 19968: jis0208<<14 | 0x0F<<7 | 0x2D, + 20554 - 19968: jis0212<<14 | 0x10<<7 | 0x43, + 20556 - 19968: jis0212<<14 | 0x10<<7 | 0x44, + 20558 - 19968: jis0212<<14 | 0x10<<7 | 0x45, + 20559 - 19968: jis0208<<14 | 0x29<<7 | 0x2F, + 20560 - 19968: jis0208<<14 | 0x2F<<7 | 0x53, + 20561 - 19968: jis0212<<14 | 0x10<<7 | 0x46, + 20562 - 19968: jis0212<<14 | 0x10<<7 | 0x47, + 20563 - 19968: jis0212<<14 | 0x10<<7 | 0x48, + 20565 - 19968: jis0208<<14 | 0x2F<<7 | 0x52, + 20566 - 19968: jis0208<<14 | 0x2F<<7 | 0x56, + 20567 - 19968: jis0212<<14 | 0x10<<7 | 0x49, + 20569 - 19968: jis0212<<14 | 0x10<<7 | 0x4A, + 20570 - 19968: jis0208<<14 | 0x2F<<7 | 0x55, + 20572 - 19968: jis0208<<14 | 0x23<<7 | 0x43, + 20575 - 19968: jis0212<<14 | 0x10<<7 | 0x4B, + 20576 - 19968: jis0212<<14 | 0x10<<7 | 0x4C, + 20578 - 19968: jis0212<<14 | 0x10<<7 | 0x4D, + 20579 - 19968: jis0212<<14 | 0x10<<7 | 0x4E, + 20581 - 19968: jis0208<<14 | 0x16<<7 | 0x51, + 20582 - 19968: jis0212<<14 | 0x10<<7 | 0x4F, + 20583 - 19968: jis0212<<14 | 0x10<<7 | 0x50, + 20586 - 19968: jis0212<<14 | 0x10<<7 | 0x51, + 20588 - 19968: jis0208<<14 | 0x2F<<7 | 0x57, + 20589 - 19968: jis0212<<14 | 0x10<<7 | 0x52, + 20592 - 19968: jis0208<<14 | 0x58<<7 | 0x1D, + 20593 - 19968: jis0212<<14 | 0x10<<7 | 0x54, + 20594 - 19968: jis0208<<14 | 0x1B<<7 | 0x24, + 20596 - 19968: jis0208<<14 | 0x21<<7 | 0x05, + 20597 - 19968: jis0208<<14 | 0x23<<7 | 0x44, + 20598 - 19968: jis0208<<14 | 0x15<<7 | 0x55, + 20600 - 19968: jis0208<<14 | 0x2F<<7 | 0x58, + 20605 - 19968: jis0208<<14 | 0x14<<7 | 0x15, + 20608 - 19968: jis0208<<14 | 0x2F<<7 | 0x59, + 20609 - 19968: jis0212<<14 | 0x10<<7 | 0x56, + 20611 - 19968: jis0212<<14 | 0x10<<7 | 0x57, + 20612 - 19968: jis0212<<14 | 0x10<<7 | 0x58, + 20613 - 19968: jis0208<<14 | 0x2F<<7 | 0x5B, + 20614 - 19968: jis0212<<14 | 0x10<<7 | 0x59, + 20618 - 19968: jis0212<<14 | 0x10<<7 | 0x5A, + 20621 - 19968: jis0208<<14 | 0x2A<<7 | 0x14, + 20622 - 19968: jis0212<<14 | 0x10<<7 | 0x5B, + 20623 - 19968: jis0212<<14 | 0x10<<7 | 0x5C, + 20624 - 19968: jis0212<<14 | 0x10<<7 | 0x5D, + 20625 - 19968: jis0208<<14 | 0x16<<7 | 0x45, + 20626 - 19968: jis0212<<14 | 0x11<<7 | 0x00, + 20627 - 19968: jis0212<<14 | 0x11<<7 | 0x01, + 20628 - 19968: jis0208<<14 | 0x58<<7 | 0x1F, + 20630 - 19968: jis0212<<14 | 0x11<<7 | 0x03, + 20632 - 19968: jis0208<<14 | 0x1A<<7 | 0x10, + 20633 - 19968: jis0208<<14 | 0x27<<7 | 0x56, + 20634 - 19968: jis0208<<14 | 0x2F<<7 | 0x5A, + 20635 - 19968: jis0212<<14 | 0x11<<7 | 0x04, + 20636 - 19968: jis0212<<14 | 0x11<<7 | 0x05, + 20638 - 19968: jis0212<<14 | 0x11<<7 | 0x06, + 20639 - 19968: jis0212<<14 | 0x11<<7 | 0x07, + 20640 - 19968: jis0212<<14 | 0x11<<7 | 0x08, + 20641 - 19968: jis0212<<14 | 0x11<<7 | 0x09, + 20642 - 19968: jis0212<<14 | 0x11<<7 | 0x0A, + 20650 - 19968: jis0212<<14 | 0x11<<7 | 0x0B, + 20652 - 19968: jis0208<<14 | 0x19<<7 | 0x24, + 20653 - 19968: jis0208<<14 | 0x2C<<7 | 0x22, + 20655 - 19968: jis0212<<14 | 0x11<<7 | 0x0C, + 20656 - 19968: jis0212<<14 | 0x11<<7 | 0x0D, + 20658 - 19968: jis0208<<14 | 0x2F<<7 | 0x5D, + 20659 - 19968: jis0208<<14 | 0x30<<7 | 0x02, + 20660 - 19968: jis0208<<14 | 0x2F<<7 | 0x5C, + 20661 - 19968: jis0208<<14 | 0x19<<7 | 0x23, + 20663 - 19968: jis0208<<14 | 0x1C<<7 | 0x5C, + 20665 - 19968: jis0212<<14 | 0x11<<7 | 0x0E, + 20666 - 19968: jis0212<<14 | 0x11<<7 | 0x0F, + 20669 - 19968: jis0212<<14 | 0x11<<7 | 0x10, + 20670 - 19968: jis0208<<14 | 0x16<<7 | 0x18, + 20672 - 19968: jis0212<<14 | 0x11<<7 | 0x11, + 20674 - 19968: jis0208<<14 | 0x30<<7 | 0x03, + 20675 - 19968: jis0212<<14 | 0x11<<7 | 0x12, + 20676 - 19968: jis0212<<14 | 0x11<<7 | 0x13, + 20677 - 19968: jis0208<<14 | 0x15<<7 | 0x2E, + 20679 - 19968: jis0212<<14 | 0x11<<7 | 0x14, + 20681 - 19968: jis0208<<14 | 0x30<<7 | 0x00, + 20682 - 19968: jis0208<<14 | 0x30<<7 | 0x01, + 20684 - 19968: jis0212<<14 | 0x11<<7 | 0x15, + 20685 - 19968: jis0208<<14 | 0x25<<7 | 0x0E, + 20686 - 19968: jis0212<<14 | 0x11<<7 | 0x16, + 20687 - 19968: jis0208<<14 | 0x20<<7 | 0x5B, + 20688 - 19968: jis0212<<14 | 0x11<<7 | 0x17, + 20689 - 19968: jis0208<<14 | 0x15<<7 | 0x02, + 20691 - 19968: jis0212<<14 | 0x11<<7 | 0x18, + 20692 - 19968: jis0212<<14 | 0x11<<7 | 0x19, + 20693 - 19968: jis0208<<14 | 0x2A<<7 | 0x2C, + 20694 - 19968: jis0208<<14 | 0x30<<7 | 0x04, + 20696 - 19968: jis0208<<14 | 0x58<<7 | 0x21, + 20698 - 19968: jis0208<<14 | 0x2D<<7 | 0x1C, + 20700 - 19968: jis0212<<14 | 0x11<<7 | 0x1B, + 20701 - 19968: jis0212<<14 | 0x11<<7 | 0x1C, + 20702 - 19968: jis0208<<14 | 0x30<<7 | 0x05, + 20703 - 19968: jis0212<<14 | 0x11<<7 | 0x1D, + 20706 - 19968: jis0212<<14 | 0x11<<7 | 0x1E, + 20707 - 19968: jis0208<<14 | 0x30<<7 | 0x08, + 20708 - 19968: jis0212<<14 | 0x11<<7 | 0x1F, + 20709 - 19968: jis0208<<14 | 0x30<<7 | 0x06, + 20710 - 19968: jis0212<<14 | 0x11<<7 | 0x20, + 20711 - 19968: jis0208<<14 | 0x20<<7 | 0x2D, + 20712 - 19968: jis0212<<14 | 0x11<<7 | 0x21, + 20713 - 19968: jis0212<<14 | 0x11<<7 | 0x22, + 20717 - 19968: jis0208<<14 | 0x30<<7 | 0x07, + 20718 - 19968: jis0208<<14 | 0x30<<7 | 0x09, + 20719 - 19968: jis0212<<14 | 0x11<<7 | 0x23, + 20721 - 19968: jis0212<<14 | 0x11<<7 | 0x24, + 20722 - 19968: jis0212<<14 | 0x11<<7 | 0x30, + 20724 - 19968: jis0208<<14 | 0x58<<7 | 0x20, + 20725 - 19968: jis0208<<14 | 0x30<<7 | 0x0B, + 20726 - 19968: jis0212<<14 | 0x11<<7 | 0x25, + 20729 - 19968: jis0208<<14 | 0x30<<7 | 0x0A, + 20730 - 19968: jis0212<<14 | 0x11<<7 | 0x26, + 20731 - 19968: jis0208<<14 | 0x29<<7 | 0x27, + 20734 - 19968: jis0212<<14 | 0x11<<7 | 0x27, + 20736 - 19968: jis0208<<14 | 0x14<<7 | 0x16, + 20737 - 19968: jis0208<<14 | 0x30<<7 | 0x0D, + 20738 - 19968: jis0208<<14 | 0x30<<7 | 0x0E, + 20739 - 19968: jis0212<<14 | 0x11<<7 | 0x28, + 20740 - 19968: jis0208<<14 | 0x11<<7 | 0x0E, + 20742 - 19968: jis0212<<14 | 0x11<<7 | 0x29, + 20743 - 19968: jis0212<<14 | 0x11<<7 | 0x2A, + 20744 - 19968: jis0212<<14 | 0x11<<7 | 0x2B, + 20745 - 19968: jis0208<<14 | 0x30<<7 | 0x0C, + 20747 - 19968: jis0212<<14 | 0x11<<7 | 0x2C, + 20748 - 19968: jis0212<<14 | 0x11<<7 | 0x2D, + 20749 - 19968: jis0212<<14 | 0x11<<7 | 0x2E, + 20750 - 19968: jis0212<<14 | 0x11<<7 | 0x2F, + 20752 - 19968: jis0212<<14 | 0x11<<7 | 0x31, + 20754 - 19968: jis0208<<14 | 0x1B<<7 | 0x53, + 20756 - 19968: jis0208<<14 | 0x30<<7 | 0x11, + 20757 - 19968: jis0208<<14 | 0x30<<7 | 0x10, + 20758 - 19968: jis0208<<14 | 0x30<<7 | 0x0F, + 20759 - 19968: jis0212<<14 | 0x11<<7 | 0x32, + 20760 - 19968: jis0208<<14 | 0x2F<<7 | 0x35, + 20761 - 19968: jis0212<<14 | 0x11<<7 | 0x33, + 20762 - 19968: jis0208<<14 | 0x30<<7 | 0x12, + 20763 - 19968: jis0212<<14 | 0x11<<7 | 0x34, + 20764 - 19968: jis0212<<14 | 0x11<<7 | 0x35, + 20765 - 19968: jis0212<<14 | 0x11<<7 | 0x36, + 20766 - 19968: jis0212<<14 | 0x11<<7 | 0x37, + 20767 - 19968: jis0208<<14 | 0x1C<<7 | 0x5D, + 20769 - 19968: jis0208<<14 | 0x30<<7 | 0x13, + 20771 - 19968: jis0212<<14 | 0x11<<7 | 0x38, + 20775 - 19968: jis0212<<14 | 0x11<<7 | 0x39, + 20776 - 19968: jis0212<<14 | 0x11<<7 | 0x3A, + 20778 - 19968: jis0208<<14 | 0x2C<<7 | 0x04, + 20780 - 19968: jis0212<<14 | 0x11<<7 | 0x3B, + 20781 - 19968: jis0212<<14 | 0x11<<7 | 0x3C, + 20783 - 19968: jis0212<<14 | 0x11<<7 | 0x3D, + 20785 - 19968: jis0212<<14 | 0x11<<7 | 0x3E, + 20786 - 19968: jis0208<<14 | 0x2B<<7 | 0x38, + 20787 - 19968: jis0212<<14 | 0x11<<7 | 0x3F, + 20788 - 19968: jis0212<<14 | 0x11<<7 | 0x40, + 20789 - 19968: jis0212<<14 | 0x11<<7 | 0x41, + 20791 - 19968: jis0208<<14 | 0x30<<7 | 0x15, + 20792 - 19968: jis0212<<14 | 0x11<<7 | 0x42, + 20793 - 19968: jis0212<<14 | 0x11<<7 | 0x43, + 20794 - 19968: jis0208<<14 | 0x30<<7 | 0x14, + 20795 - 19968: jis0208<<14 | 0x30<<7 | 0x17, + 20796 - 19968: jis0208<<14 | 0x30<<7 | 0x16, + 20799 - 19968: jis0208<<14 | 0x30<<7 | 0x18, + 20800 - 19968: jis0208<<14 | 0x30<<7 | 0x19, + 20801 - 19968: jis0208<<14 | 0x0F<<7 | 0x53, + 20802 - 19968: jis0212<<14 | 0x11<<7 | 0x44, + 20803 - 19968: jis0208<<14 | 0x17<<7 | 0x14, + 20804 - 19968: jis0208<<14 | 0x16<<7 | 0x1A, + 20805 - 19968: jis0208<<14 | 0x1C<<7 | 0x1B, + 20806 - 19968: jis0208<<14 | 0x22<<7 | 0x5A, + 20807 - 19968: jis0208<<14 | 0x15<<7 | 0x03, + 20808 - 19968: jis0208<<14 | 0x1F<<7 | 0x47, + 20809 - 19968: jis0208<<14 | 0x17<<7 | 0x56, + 20810 - 19968: jis0208<<14 | 0x58<<7 | 0x22, + 20811 - 19968: jis0208<<14 | 0x18<<7 | 0x4D, + 20812 - 19968: jis0208<<14 | 0x30<<7 | 0x1B, + 20813 - 19968: jis0208<<14 | 0x2B<<7 | 0x27, + 20814 - 19968: jis0208<<14 | 0x24<<7 | 0x25, + 20815 - 19968: jis0212<<14 | 0x11<<7 | 0x46, + 20816 - 19968: jis0208<<14 | 0x1A<<7 | 0x58, + 20818 - 19968: jis0208<<14 | 0x30<<7 | 0x1A, + 20819 - 19968: jis0212<<14 | 0x11<<7 | 0x47, + 20820 - 19968: jis0208<<14 | 0x30<<7 | 0x1C, + 20821 - 19968: jis0212<<14 | 0x11<<7 | 0x48, + 20823 - 19968: jis0212<<14 | 0x11<<7 | 0x49, + 20824 - 19968: jis0212<<14 | 0x11<<7 | 0x4A, + 20826 - 19968: jis0208<<14 | 0x24<<7 | 0x3D, + 20828 - 19968: jis0208<<14 | 0x12<<7 | 0x54, + 20831 - 19968: jis0212<<14 | 0x11<<7 | 0x4B, + 20834 - 19968: jis0208<<14 | 0x30<<7 | 0x1D, + 20836 - 19968: jis0208<<14 | 0x58<<7 | 0x23, + 20837 - 19968: jis0208<<14 | 0x25<<7 | 0x5D, + 20838 - 19968: jis0212<<14 | 0x11<<7 | 0x4D, + 20840 - 19968: jis0208<<14 | 0x20<<7 | 0x13, + 20841 - 19968: jis0208<<14 | 0x30<<7 | 0x1F, + 20842 - 19968: jis0208<<14 | 0x30<<7 | 0x20, + 20843 - 19968: jis0208<<14 | 0x27<<7 | 0x0B, + 20844 - 19968: jis0208<<14 | 0x17<<7 | 0x57, + 20845 - 19968: jis0208<<14 | 0x2E<<7 | 0x1A, + 20846 - 19968: jis0208<<14 | 0x30<<7 | 0x21, + 20849 - 19968: jis0208<<14 | 0x15<<7 | 0x05, + 20853 - 19968: jis0208<<14 | 0x29<<7 | 0x1B, + 20854 - 19968: jis0208<<14 | 0x21<<7 | 0x15, + 20855 - 19968: jis0208<<14 | 0x15<<7 | 0x50, + 20856 - 19968: jis0208<<14 | 0x24<<7 | 0x14, + 20860 - 19968: jis0208<<14 | 0x16<<7 | 0x52, + 20862 - 19968: jis0212<<14 | 0x11<<7 | 0x4E, + 20864 - 19968: jis0208<<14 | 0x30<<7 | 0x22, + 20866 - 19968: jis0208<<14 | 0x30<<7 | 0x23, + 20867 - 19968: jis0212<<14 | 0x11<<7 | 0x4F, + 20868 - 19968: jis0212<<14 | 0x11<<7 | 0x50, + 20869 - 19968: jis0208<<14 | 0x25<<7 | 0x41, + 20870 - 19968: jis0208<<14 | 0x10<<7 | 0x3E, + 20873 - 19968: jis0208<<14 | 0x30<<7 | 0x26, + 20874 - 19968: jis0208<<14 | 0x19<<7 | 0x5C, + 20875 - 19968: jis0212<<14 | 0x11<<7 | 0x51, + 20876 - 19968: jis0208<<14 | 0x30<<7 | 0x25, + 20877 - 19968: jis0208<<14 | 0x19<<7 | 0x25, + 20878 - 19968: jis0212<<14 | 0x11<<7 | 0x52, + 20879 - 19968: jis0208<<14 | 0x30<<7 | 0x27, + 20880 - 19968: jis0208<<14 | 0x45<<7 | 0x4D, + 20881 - 19968: jis0208<<14 | 0x30<<7 | 0x28, + 20882 - 19968: jis0208<<14 | 0x2A<<7 | 0x20, + 20883 - 19968: jis0208<<14 | 0x30<<7 | 0x29, + 20885 - 19968: jis0208<<14 | 0x30<<7 | 0x2A, + 20886 - 19968: jis0208<<14 | 0x30<<7 | 0x2B, + 20887 - 19968: jis0208<<14 | 0x1D<<7 | 0x48, + 20888 - 19968: jis0212<<14 | 0x11<<7 | 0x53, + 20889 - 19968: jis0208<<14 | 0x1B<<7 | 0x2B, + 20893 - 19968: jis0208<<14 | 0x58<<7 | 0x24, + 20896 - 19968: jis0208<<14 | 0x13<<7 | 0x06, + 20897 - 19968: jis0212<<14 | 0x11<<7 | 0x55, + 20898 - 19968: jis0208<<14 | 0x30<<7 | 0x2E, + 20899 - 19968: jis0212<<14 | 0x11<<7 | 0x56, + 20900 - 19968: jis0208<<14 | 0x30<<7 | 0x2C, + 20901 - 19968: jis0208<<14 | 0x2B<<7 | 0x1C, + 20902 - 19968: jis0208<<14 | 0x30<<7 | 0x2D, + 20904 - 19968: jis0208<<14 | 0x28<<7 | 0x39, + 20905 - 19968: jis0208<<14 | 0x30<<7 | 0x2F, + 20906 - 19968: jis0208<<14 | 0x30<<7 | 0x30, + 20907 - 19968: jis0208<<14 | 0x30<<7 | 0x31, + 20908 - 19968: jis0208<<14 | 0x24<<7 | 0x3E, + 20909 - 19968: jis0212<<14 | 0x11<<7 | 0x57, + 20912 - 19968: jis0208<<14 | 0x30<<7 | 0x35, + 20913 - 19968: jis0208<<14 | 0x30<<7 | 0x33, + 20914 - 19968: jis0208<<14 | 0x30<<7 | 0x34, + 20915 - 19968: jis0208<<14 | 0x30<<7 | 0x32, + 20916 - 19968: jis0208<<14 | 0x19<<7 | 0x42, + 20917 - 19968: jis0208<<14 | 0x30<<7 | 0x36, + 20918 - 19968: jis0208<<14 | 0x2B<<7 | 0x49, + 20919 - 19968: jis0208<<14 | 0x2D<<7 | 0x43, + 20920 - 19968: jis0212<<14 | 0x11<<7 | 0x58, + 20922 - 19968: jis0212<<14 | 0x11<<7 | 0x59, + 20924 - 19968: jis0212<<14 | 0x11<<7 | 0x5A, + 20925 - 19968: jis0208<<14 | 0x30<<7 | 0x37, + 20926 - 19968: jis0208<<14 | 0x58<<7 | 0x25, + 20927 - 19968: jis0212<<14 | 0x11<<7 | 0x5C, + 20930 - 19968: jis0212<<14 | 0x11<<7 | 0x5D, + 20932 - 19968: jis0208<<14 | 0x1F<<7 | 0x07, + 20933 - 19968: jis0208<<14 | 0x30<<7 | 0x38, + 20934 - 19968: jis0208<<14 | 0x1C<<7 | 0x39, + 20936 - 19968: jis0212<<14 | 0x12<<7 | 0x00, + 20937 - 19968: jis0208<<14 | 0x30<<7 | 0x39, + 20939 - 19968: jis0208<<14 | 0x22<<7 | 0x5B, + 20940 - 19968: jis0208<<14 | 0x2D<<7 | 0x1E, + 20941 - 19968: jis0208<<14 | 0x24<<7 | 0x3F, + 20943 - 19968: jis0212<<14 | 0x12<<7 | 0x01, + 20945 - 19968: jis0212<<14 | 0x12<<7 | 0x02, + 20946 - 19968: jis0212<<14 | 0x12<<7 | 0x03, + 20947 - 19968: jis0212<<14 | 0x12<<7 | 0x04, + 20949 - 19968: jis0212<<14 | 0x12<<7 | 0x05, + 20950 - 19968: jis0208<<14 | 0x31<<7 | 0x24, + 20952 - 19968: jis0212<<14 | 0x12<<7 | 0x06, + 20955 - 19968: jis0208<<14 | 0x30<<7 | 0x3A, + 20956 - 19968: jis0208<<14 | 0x53<<7 | 0x04, + 20957 - 19968: jis0208<<14 | 0x15<<7 | 0x24, + 20958 - 19968: jis0212<<14 | 0x12<<7 | 0x07, + 20960 - 19968: jis0208<<14 | 0x30<<7 | 0x3B, + 20961 - 19968: jis0208<<14 | 0x2A<<7 | 0x3D, + 20962 - 19968: jis0212<<14 | 0x12<<7 | 0x08, + 20965 - 19968: jis0212<<14 | 0x12<<7 | 0x09, + 20966 - 19968: jis0208<<14 | 0x1C<<7 | 0x47, + 20967 - 19968: jis0208<<14 | 0x21<<7 | 0x5B, + 20969 - 19968: jis0208<<14 | 0x30<<7 | 0x3D, + 20970 - 19968: jis0208<<14 | 0x25<<7 | 0x43, + 20972 - 19968: jis0208<<14 | 0x58<<7 | 0x26, + 20973 - 19968: jis0208<<14 | 0x30<<7 | 0x3E, + 20974 - 19968: jis0212<<14 | 0x12<<7 | 0x0A, + 20976 - 19968: jis0208<<14 | 0x30<<7 | 0x3F, + 20977 - 19968: jis0208<<14 | 0x12<<7 | 0x0D, + 20978 - 19968: jis0212<<14 | 0x12<<7 | 0x0B, + 20979 - 19968: jis0212<<14 | 0x12<<7 | 0x0C, + 20980 - 19968: jis0212<<14 | 0x12<<7 | 0x0D, + 20981 - 19968: jis0208<<14 | 0x30<<7 | 0x40, + 20982 - 19968: jis0208<<14 | 0x15<<7 | 0x06, + 20983 - 19968: jis0212<<14 | 0x12<<7 | 0x0E, + 20984 - 19968: jis0208<<14 | 0x25<<7 | 0x2B, + 20985 - 19968: jis0208<<14 | 0x10<<7 | 0x59, + 20986 - 19968: jis0208<<14 | 0x1C<<7 | 0x2F, + 20989 - 19968: jis0208<<14 | 0x27<<7 | 0x00, + 20990 - 19968: jis0208<<14 | 0x30<<7 | 0x41, + 20992 - 19968: jis0208<<14 | 0x24<<7 | 0x40, + 20993 - 19968: jis0212<<14 | 0x12<<7 | 0x0F, + 20994 - 19968: jis0212<<14 | 0x12<<7 | 0x10, + 20995 - 19968: jis0208<<14 | 0x1E<<7 | 0x2E, + 20996 - 19968: jis0208<<14 | 0x30<<7 | 0x42, + 20997 - 19968: jis0212<<14 | 0x12<<7 | 0x11, + 20998 - 19968: jis0208<<14 | 0x29<<7 | 0x0B, + 20999 - 19968: jis0208<<14 | 0x1F<<7 | 0x39, + 21000 - 19968: jis0208<<14 | 0x13<<7 | 0x01, + 21002 - 19968: jis0208<<14 | 0x13<<7 | 0x08, + 21003 - 19968: jis0208<<14 | 0x30<<7 | 0x43, + 21006 - 19968: jis0208<<14 | 0x30<<7 | 0x45, + 21009 - 19968: jis0208<<14 | 0x16<<7 | 0x19, + 21010 - 19968: jis0212<<14 | 0x12<<7 | 0x12, + 21011 - 19968: jis0212<<14 | 0x12<<7 | 0x13, + 21012 - 19968: jis0208<<14 | 0x30<<7 | 0x44, + 21013 - 19968: jis0208<<14 | 0x58<<7 | 0x27, + 21014 - 19968: jis0212<<14 | 0x12<<7 | 0x15, + 21015 - 19968: jis0208<<14 | 0x2D<<7 | 0x52, + 21016 - 19968: jis0212<<14 | 0x12<<7 | 0x16, + 21021 - 19968: jis0208<<14 | 0x1C<<7 | 0x48, + 21026 - 19968: jis0212<<14 | 0x12<<7 | 0x17, + 21028 - 19968: jis0208<<14 | 0x27<<7 | 0x1C, + 21029 - 19968: jis0208<<14 | 0x29<<7 | 0x2B, + 21031 - 19968: jis0208<<14 | 0x30<<7 | 0x46, + 21032 - 19968: jis0212<<14 | 0x12<<7 | 0x18, + 21033 - 19968: jis0208<<14 | 0x2C<<7 | 0x57, + 21034 - 19968: jis0208<<14 | 0x30<<7 | 0x47, + 21038 - 19968: jis0208<<14 | 0x30<<7 | 0x48, + 21040 - 19968: jis0208<<14 | 0x24<<7 | 0x5D, + 21041 - 19968: jis0212<<14 | 0x12<<7 | 0x19, + 21042 - 19968: jis0212<<14 | 0x12<<7 | 0x1A, + 21043 - 19968: jis0208<<14 | 0x30<<7 | 0x49, + 21045 - 19968: jis0212<<14 | 0x12<<7 | 0x1B, + 21046 - 19968: jis0208<<14 | 0x1F<<7 | 0x08, + 21047 - 19968: jis0208<<14 | 0x19<<7 | 0x5D, + 21048 - 19968: jis0208<<14 | 0x16<<7 | 0x53, + 21049 - 19968: jis0208<<14 | 0x30<<7 | 0x4A, + 21050 - 19968: jis0208<<14 | 0x1A<<7 | 0x28, + 21051 - 19968: jis0208<<14 | 0x18<<7 | 0x4E, + 21052 - 19968: jis0212<<14 | 0x12<<7 | 0x1C, + 21059 - 19968: jis0208<<14 | 0x23<<7 | 0x45, + 21060 - 19968: jis0208<<14 | 0x30<<7 | 0x4C, + 21061 - 19968: jis0212<<14 | 0x12<<7 | 0x1D, + 21063 - 19968: jis0208<<14 | 0x21<<7 | 0x06, + 21065 - 19968: jis0212<<14 | 0x12<<7 | 0x1E, + 21066 - 19968: jis0208<<14 | 0x19<<7 | 0x4E, + 21067 - 19968: jis0208<<14 | 0x30<<7 | 0x4D, + 21068 - 19968: jis0208<<14 | 0x30<<7 | 0x4E, + 21069 - 19968: jis0208<<14 | 0x20<<7 | 0x0F, + 21071 - 19968: jis0208<<14 | 0x30<<7 | 0x4B, + 21076 - 19968: jis0208<<14 | 0x30<<7 | 0x50, + 21077 - 19968: jis0212<<14 | 0x12<<7 | 0x1F, + 21078 - 19968: jis0208<<14 | 0x2A<<7 | 0x15, + 21079 - 19968: jis0212<<14 | 0x12<<7 | 0x20, + 21080 - 19968: jis0212<<14 | 0x12<<7 | 0x21, + 21082 - 19968: jis0212<<14 | 0x12<<7 | 0x22, + 21083 - 19968: jis0208<<14 | 0x18<<7 | 0x43, + 21084 - 19968: jis0212<<14 | 0x12<<7 | 0x23, + 21086 - 19968: jis0208<<14 | 0x30<<7 | 0x4F, + 21087 - 19968: jis0212<<14 | 0x12<<7 | 0x24, + 21088 - 19968: jis0212<<14 | 0x12<<7 | 0x25, + 21089 - 19968: jis0212<<14 | 0x12<<7 | 0x26, + 21091 - 19968: jis0208<<14 | 0x16<<7 | 0x54, + 21092 - 19968: jis0208<<14 | 0x19<<7 | 0x3D, + 21093 - 19968: jis0208<<14 | 0x26<<7 | 0x4C, + 21094 - 19968: jis0212<<14 | 0x12<<7 | 0x27, + 21097 - 19968: jis0208<<14 | 0x30<<7 | 0x53, + 21098 - 19968: jis0208<<14 | 0x30<<7 | 0x51, + 21102 - 19968: jis0212<<14 | 0x12<<7 | 0x28, + 21103 - 19968: jis0208<<14 | 0x28<<7 | 0x5A, + 21104 - 19968: jis0208<<14 | 0x1D<<7 | 0x49, + 21105 - 19968: jis0208<<14 | 0x30<<7 | 0x5A, + 21106 - 19968: jis0208<<14 | 0x12<<7 | 0x43, + 21107 - 19968: jis0208<<14 | 0x30<<7 | 0x54, + 21108 - 19968: jis0208<<14 | 0x30<<7 | 0x52, + 21109 - 19968: jis0208<<14 | 0x20<<7 | 0x2E, + 21111 - 19968: jis0212<<14 | 0x12<<7 | 0x29, + 21112 - 19968: jis0212<<14 | 0x12<<7 | 0x2A, + 21113 - 19968: jis0212<<14 | 0x12<<7 | 0x2B, + 21117 - 19968: jis0208<<14 | 0x30<<7 | 0x56, + 21119 - 19968: jis0208<<14 | 0x30<<7 | 0x55, + 21120 - 19968: jis0212<<14 | 0x12<<7 | 0x2C, + 21122 - 19968: jis0212<<14 | 0x12<<7 | 0x2D, + 21123 - 19968: jis0208<<14 | 0x12<<7 | 0x23, + 21125 - 19968: jis0212<<14 | 0x12<<7 | 0x2E, + 21127 - 19968: jis0208<<14 | 0x16<<7 | 0x3F, + 21128 - 19968: jis0208<<14 | 0x30<<7 | 0x5B, + 21129 - 19968: jis0208<<14 | 0x2D<<7 | 0x0C, + 21130 - 19968: jis0212<<14 | 0x12<<7 | 0x2F, + 21132 - 19968: jis0212<<14 | 0x12<<7 | 0x30, + 21133 - 19968: jis0208<<14 | 0x30<<7 | 0x57, + 21137 - 19968: jis0208<<14 | 0x30<<7 | 0x5C, + 21138 - 19968: jis0208<<14 | 0x30<<7 | 0x59, + 21139 - 19968: jis0212<<14 | 0x12<<7 | 0x31, + 21140 - 19968: jis0208<<14 | 0x30<<7 | 0x58, + 21141 - 19968: jis0212<<14 | 0x12<<7 | 0x32, + 21142 - 19968: jis0212<<14 | 0x12<<7 | 0x33, + 21143 - 19968: jis0212<<14 | 0x12<<7 | 0x34, + 21144 - 19968: jis0212<<14 | 0x12<<7 | 0x35, + 21146 - 19968: jis0212<<14 | 0x12<<7 | 0x36, + 21147 - 19968: jis0208<<14 | 0x2D<<7 | 0x2E, + 21148 - 19968: jis0208<<14 | 0x58<<7 | 0x28, + 21151 - 19968: jis0208<<14 | 0x17<<7 | 0x58, + 21152 - 19968: jis0208<<14 | 0x11<<7 | 0x22, + 21155 - 19968: jis0208<<14 | 0x2D<<7 | 0x53, + 21156 - 19968: jis0212<<14 | 0x12<<7 | 0x38, + 21157 - 19968: jis0212<<14 | 0x12<<7 | 0x39, + 21158 - 19968: jis0208<<14 | 0x58<<7 | 0x29, + 21159 - 19968: jis0212<<14 | 0x12<<7 | 0x3B, + 21161 - 19968: jis0208<<14 | 0x1C<<7 | 0x54, + 21162 - 19968: jis0208<<14 | 0x24<<7 | 0x37, + 21163 - 19968: jis0208<<14 | 0x18<<7 | 0x44, + 21164 - 19968: jis0208<<14 | 0x31<<7 | 0x01, + 21165 - 19968: jis0208<<14 | 0x31<<7 | 0x02, + 21167 - 19968: jis0208<<14 | 0x5A<<7 | 0x1B, + 21168 - 19968: jis0212<<14 | 0x12<<7 | 0x3D, + 21169 - 19968: jis0208<<14 | 0x2D<<7 | 0x44, + 21172 - 19968: jis0208<<14 | 0x2E<<7 | 0x0A, + 21173 - 19968: jis0208<<14 | 0x31<<7 | 0x04, + 21174 - 19968: jis0212<<14 | 0x12<<7 | 0x3E, + 21175 - 19968: jis0212<<14 | 0x12<<7 | 0x3F, + 21176 - 19968: jis0212<<14 | 0x12<<7 | 0x40, + 21177 - 19968: jis0208<<14 | 0x17<<7 | 0x59, + 21178 - 19968: jis0212<<14 | 0x12<<7 | 0x41, + 21179 - 19968: jis0212<<14 | 0x12<<7 | 0x42, + 21180 - 19968: jis0208<<14 | 0x31<<7 | 0x03, + 21181 - 19968: jis0212<<14 | 0x12<<7 | 0x43, + 21182 - 19968: jis0208<<14 | 0x12<<7 | 0x0E, + 21184 - 19968: jis0208<<14 | 0x58<<7 | 0x2A, + 21185 - 19968: jis0208<<14 | 0x31<<7 | 0x05, + 21187 - 19968: jis0208<<14 | 0x2A<<7 | 0x35, + 21188 - 19968: jis0212<<14 | 0x12<<7 | 0x45, + 21189 - 19968: jis0208<<14 | 0x23<<7 | 0x1B, + 21190 - 19968: jis0212<<14 | 0x12<<7 | 0x46, + 21191 - 19968: jis0208<<14 | 0x2C<<7 | 0x05, + 21192 - 19968: jis0212<<14 | 0x12<<7 | 0x47, + 21193 - 19968: jis0208<<14 | 0x29<<7 | 0x38, + 21196 - 19968: jis0212<<14 | 0x12<<7 | 0x48, + 21197 - 19968: jis0208<<14 | 0x31<<7 | 0x06, + 21199 - 19968: jis0212<<14 | 0x12<<7 | 0x49, + 21201 - 19968: jis0212<<14 | 0x12<<7 | 0x4A, + 21202 - 19968: jis0208<<14 | 0x4F<<7 | 0x34, + 21204 - 19968: jis0212<<14 | 0x12<<7 | 0x4B, + 21205 - 19968: jis0208<<14 | 0x25<<7 | 0x0F, + 21206 - 19968: jis0212<<14 | 0x12<<7 | 0x4C, + 21207 - 19968: jis0208<<14 | 0x31<<7 | 0x07, + 21208 - 19968: jis0208<<14 | 0x13<<7 | 0x09, + 21209 - 19968: jis0208<<14 | 0x2B<<7 | 0x12, + 21211 - 19968: jis0208<<14 | 0x58<<7 | 0x2B, + 21212 - 19968: jis0212<<14 | 0x12<<7 | 0x4E, + 21213 - 19968: jis0208<<14 | 0x1D<<7 | 0x00, + 21214 - 19968: jis0208<<14 | 0x31<<7 | 0x08, + 21215 - 19968: jis0208<<14 | 0x29<<7 | 0x46, + 21216 - 19968: jis0208<<14 | 0x31<<7 | 0x0C, + 21217 - 19968: jis0212<<14 | 0x12<<7 | 0x4F, + 21218 - 19968: jis0208<<14 | 0x1F<<7 | 0x09, + 21219 - 19968: jis0208<<14 | 0x31<<7 | 0x09, + 21220 - 19968: jis0208<<14 | 0x15<<7 | 0x2F, + 21221 - 19968: jis0212<<14 | 0x12<<7 | 0x50, + 21222 - 19968: jis0208<<14 | 0x31<<7 | 0x0A, + 21223 - 19968: jis0208<<14 | 0x13<<7 | 0x0A, + 21224 - 19968: jis0212<<14 | 0x12<<7 | 0x51, + 21225 - 19968: jis0212<<14 | 0x12<<7 | 0x52, + 21226 - 19968: jis0212<<14 | 0x12<<7 | 0x53, + 21228 - 19968: jis0212<<14 | 0x12<<7 | 0x54, + 21232 - 19968: jis0212<<14 | 0x12<<7 | 0x55, + 21233 - 19968: jis0212<<14 | 0x12<<7 | 0x56, + 21234 - 19968: jis0208<<14 | 0x16<<7 | 0x0D, + 21235 - 19968: jis0208<<14 | 0x31<<7 | 0x0D, + 21236 - 19968: jis0212<<14 | 0x12<<7 | 0x57, + 21237 - 19968: jis0208<<14 | 0x31<<7 | 0x0E, + 21238 - 19968: jis0212<<14 | 0x12<<7 | 0x58, + 21239 - 19968: jis0212<<14 | 0x12<<7 | 0x59, + 21240 - 19968: jis0208<<14 | 0x31<<7 | 0x0F, + 21241 - 19968: jis0208<<14 | 0x31<<7 | 0x10, + 21242 - 19968: jis0208<<14 | 0x1B<<7 | 0x3A, + 21246 - 19968: jis0208<<14 | 0x17<<7 | 0x5A, + 21247 - 19968: jis0208<<14 | 0x2B<<7 | 0x3D, + 21248 - 19968: jis0208<<14 | 0x58<<7 | 0x2C, + 21249 - 19968: jis0208<<14 | 0x2B<<7 | 0x47, + 21250 - 19968: jis0208<<14 | 0x25<<7 | 0x56, + 21251 - 19968: jis0212<<14 | 0x12<<7 | 0x5B, + 21253 - 19968: jis0208<<14 | 0x29<<7 | 0x50, + 21254 - 19968: jis0208<<14 | 0x31<<7 | 0x11, + 21255 - 19968: jis0208<<14 | 0x58<<7 | 0x2D, + 21256 - 19968: jis0208<<14 | 0x31<<7 | 0x12, + 21258 - 19968: jis0212<<14 | 0x12<<7 | 0x5C, + 21259 - 19968: jis0212<<14 | 0x12<<7 | 0x5D, + 21260 - 19968: jis0212<<14 | 0x13<<7 | 0x00, + 21261 - 19968: jis0208<<14 | 0x31<<7 | 0x14, + 21263 - 19968: jis0208<<14 | 0x31<<7 | 0x16, + 21264 - 19968: jis0208<<14 | 0x31<<7 | 0x15, + 21265 - 19968: jis0212<<14 | 0x13<<7 | 0x01, + 21267 - 19968: jis0212<<14 | 0x13<<7 | 0x02, + 21269 - 19968: jis0208<<14 | 0x31<<7 | 0x17, + 21270 - 19968: jis0208<<14 | 0x11<<7 | 0x1C, + 21271 - 19968: jis0208<<14 | 0x2A<<7 | 0x2B, + 21272 - 19968: jis0212<<14 | 0x13<<7 | 0x03, + 21273 - 19968: jis0208<<14 | 0x19<<7 | 0x5B, + 21274 - 19968: jis0208<<14 | 0x31<<7 | 0x18, + 21275 - 19968: jis0212<<14 | 0x13<<7 | 0x04, + 21276 - 19968: jis0212<<14 | 0x13<<7 | 0x05, + 21277 - 19968: jis0208<<14 | 0x20<<7 | 0x38, + 21278 - 19968: jis0212<<14 | 0x13<<7 | 0x06, + 21279 - 19968: jis0212<<14 | 0x13<<7 | 0x07, + 21280 - 19968: jis0208<<14 | 0x1D<<7 | 0x01, + 21281 - 19968: jis0208<<14 | 0x15<<7 | 0x08, + 21283 - 19968: jis0208<<14 | 0x31<<7 | 0x19, + 21284 - 19968: jis0208<<14 | 0x58<<7 | 0x2E, + 21285 - 19968: jis0212<<14 | 0x13<<7 | 0x08, + 21287 - 19968: jis0212<<14 | 0x13<<7 | 0x09, + 21288 - 19968: jis0212<<14 | 0x13<<7 | 0x0A, + 21289 - 19968: jis0212<<14 | 0x13<<7 | 0x0B, + 21290 - 19968: jis0208<<14 | 0x27<<7 | 0x3A, + 21291 - 19968: jis0212<<14 | 0x13<<7 | 0x0C, + 21292 - 19968: jis0212<<14 | 0x13<<7 | 0x0D, + 21293 - 19968: jis0212<<14 | 0x13<<7 | 0x0E, + 21295 - 19968: jis0208<<14 | 0x31<<7 | 0x1A, + 21296 - 19968: jis0212<<14 | 0x13<<7 | 0x0F, + 21297 - 19968: jis0208<<14 | 0x31<<7 | 0x1B, + 21298 - 19968: jis0212<<14 | 0x13<<7 | 0x10, + 21299 - 19968: jis0208<<14 | 0x31<<7 | 0x1C, + 21301 - 19968: jis0212<<14 | 0x13<<7 | 0x11, + 21304 - 19968: jis0208<<14 | 0x31<<7 | 0x1D, + 21305 - 19968: jis0208<<14 | 0x28<<7 | 0x03, + 21306 - 19968: jis0208<<14 | 0x15<<7 | 0x47, + 21307 - 19968: jis0208<<14 | 0x0F<<7 | 0x44, + 21308 - 19968: jis0212<<14 | 0x13<<7 | 0x12, + 21309 - 19968: jis0212<<14 | 0x13<<7 | 0x13, + 21310 - 19968: jis0212<<14 | 0x13<<7 | 0x14, + 21311 - 19968: jis0208<<14 | 0x25<<7 | 0x1E, + 21312 - 19968: jis0208<<14 | 0x31<<7 | 0x1E, + 21313 - 19968: jis0208<<14 | 0x1C<<7 | 0x1C, + 21314 - 19968: jis0212<<14 | 0x13<<7 | 0x15, + 21315 - 19968: jis0208<<14 | 0x1F<<7 | 0x48, + 21317 - 19968: jis0208<<14 | 0x31<<7 | 0x20, + 21318 - 19968: jis0208<<14 | 0x31<<7 | 0x1F, + 21319 - 19968: jis0208<<14 | 0x1D<<7 | 0x02, + 21320 - 19968: jis0208<<14 | 0x17<<7 | 0x40, + 21321 - 19968: jis0208<<14 | 0x31<<7 | 0x22, + 21322 - 19968: jis0208<<14 | 0x27<<7 | 0x1D, + 21323 - 19968: jis0212<<14 | 0x13<<7 | 0x17, + 21324 - 19968: jis0212<<14 | 0x13<<7 | 0x16, + 21325 - 19968: jis0208<<14 | 0x31<<7 | 0x23, + 21329 - 19968: jis0208<<14 | 0x27<<7 | 0x3B, + 21330 - 19968: jis0208<<14 | 0x21<<7 | 0x13, + 21331 - 19968: jis0208<<14 | 0x21<<7 | 0x4D, + 21332 - 19968: jis0208<<14 | 0x15<<7 | 0x07, + 21335 - 19968: jis0208<<14 | 0x25<<7 | 0x4D, + 21336 - 19968: jis0208<<14 | 0x22<<7 | 0x10, + 21337 - 19968: jis0212<<14 | 0x13<<7 | 0x18, + 21338 - 19968: jis0208<<14 | 0x26<<7 | 0x4D, + 21339 - 19968: jis0212<<14 | 0x13<<7 | 0x19, + 21340 - 19968: jis0208<<14 | 0x2A<<7 | 0x2D, + 21342 - 19968: jis0208<<14 | 0x31<<7 | 0x25, + 21344 - 19968: jis0208<<14 | 0x1F<<7 | 0x49, + 21345 - 19968: jis0212<<14 | 0x13<<7 | 0x1A, + 21347 - 19968: jis0212<<14 | 0x13<<7 | 0x1B, + 21349 - 19968: jis0212<<14 | 0x13<<7 | 0x1C, + 21350 - 19968: jis0208<<14 | 0x16<<7 | 0x14, + 21353 - 19968: jis0208<<14 | 0x31<<7 | 0x26, + 21356 - 19968: jis0212<<14 | 0x13<<7 | 0x1D, + 21357 - 19968: jis0212<<14 | 0x13<<7 | 0x1E, + 21358 - 19968: jis0208<<14 | 0x31<<7 | 0x27, + 21359 - 19968: jis0208<<14 | 0x10<<7 | 0x0B, + 21360 - 19968: jis0208<<14 | 0x0F<<7 | 0x54, + 21361 - 19968: jis0208<<14 | 0x13<<7 | 0x4C, + 21362 - 19968: jis0208<<14 | 0x58<<7 | 0x2F, + 21363 - 19968: jis0208<<14 | 0x21<<7 | 0x07, + 21364 - 19968: jis0208<<14 | 0x14<<7 | 0x30, + 21365 - 19968: jis0208<<14 | 0x2C<<7 | 0x50, + 21367 - 19968: jis0208<<14 | 0x31<<7 | 0x2A, + 21368 - 19968: jis0208<<14 | 0x11<<7 | 0x16, + 21369 - 19968: jis0212<<14 | 0x13<<7 | 0x20, + 21371 - 19968: jis0208<<14 | 0x31<<7 | 0x29, + 21374 - 19968: jis0212<<14 | 0x13<<7 | 0x21, + 21375 - 19968: jis0208<<14 | 0x15<<7 | 0x09, + 21378 - 19968: jis0208<<14 | 0x31<<7 | 0x2B, + 21379 - 19968: jis0212<<14 | 0x13<<7 | 0x22, + 21380 - 19968: jis0208<<14 | 0x2B<<7 | 0x50, + 21383 - 19968: jis0212<<14 | 0x13<<7 | 0x23, + 21384 - 19968: jis0212<<14 | 0x13<<7 | 0x24, + 21390 - 19968: jis0212<<14 | 0x13<<7 | 0x25, + 21395 - 19968: jis0208<<14 | 0x58<<7 | 0x30, + 21396 - 19968: jis0212<<14 | 0x13<<7 | 0x27, + 21398 - 19968: jis0208<<14 | 0x31<<7 | 0x2C, + 21400 - 19968: jis0208<<14 | 0x2D<<7 | 0x31, + 21401 - 19968: jis0212<<14 | 0x13<<7 | 0x28, + 21402 - 19968: jis0208<<14 | 0x17<<7 | 0x5B, + 21405 - 19968: jis0212<<14 | 0x13<<7 | 0x29, + 21407 - 19968: jis0208<<14 | 0x17<<7 | 0x15, + 21408 - 19968: jis0208<<14 | 0x31<<7 | 0x2D, + 21409 - 19968: jis0212<<14 | 0x13<<7 | 0x2A, + 21412 - 19968: jis0212<<14 | 0x13<<7 | 0x2B, + 21413 - 19968: jis0208<<14 | 0x31<<7 | 0x2F, + 21414 - 19968: jis0208<<14 | 0x31<<7 | 0x2E, + 21416 - 19968: jis0208<<14 | 0x1E<<7 | 0x3E, + 21417 - 19968: jis0208<<14 | 0x10<<7 | 0x18, + 21418 - 19968: jis0212<<14 | 0x13<<7 | 0x2C, + 21419 - 19968: jis0212<<14 | 0x13<<7 | 0x2D, + 21421 - 19968: jis0208<<14 | 0x10<<7 | 0x3D, + 21422 - 19968: jis0208<<14 | 0x31<<7 | 0x30, + 21423 - 19968: jis0212<<14 | 0x13<<7 | 0x2E, + 21424 - 19968: jis0208<<14 | 0x31<<7 | 0x31, + 21426 - 19968: jis0208<<14 | 0x58<<7 | 0x31, + 21427 - 19968: jis0208<<14 | 0x17<<7 | 0x16, + 21428 - 19968: jis0212<<14 | 0x13<<7 | 0x30, + 21429 - 19968: jis0212<<14 | 0x13<<7 | 0x31, + 21430 - 19968: jis0208<<14 | 0x31<<7 | 0x32, + 21431 - 19968: jis0212<<14 | 0x13<<7 | 0x32, + 21432 - 19968: jis0212<<14 | 0x13<<7 | 0x33, + 21434 - 19968: jis0212<<14 | 0x13<<7 | 0x34, + 21435 - 19968: jis0208<<14 | 0x14<<7 | 0x4D, + 21437 - 19968: jis0212<<14 | 0x13<<7 | 0x35, + 21440 - 19968: jis0212<<14 | 0x13<<7 | 0x36, + 21442 - 19968: jis0208<<14 | 0x1A<<7 | 0x11, + 21443 - 19968: jis0208<<14 | 0x31<<7 | 0x33, + 21445 - 19968: jis0212<<14 | 0x13<<7 | 0x37, + 21448 - 19968: jis0208<<14 | 0x2A<<7 | 0x53, + 21449 - 19968: jis0208<<14 | 0x19<<7 | 0x14, + 21450 - 19968: jis0208<<14 | 0x14<<7 | 0x39, + 21451 - 19968: jis0208<<14 | 0x2C<<7 | 0x06, + 21452 - 19968: jis0208<<14 | 0x20<<7 | 0x2F, + 21453 - 19968: jis0208<<14 | 0x27<<7 | 0x1E, + 21454 - 19968: jis0208<<14 | 0x1B<<7 | 0x5C, + 21455 - 19968: jis0212<<14 | 0x13<<7 | 0x38, + 21458 - 19968: jis0212<<14 | 0x13<<7 | 0x39, + 21459 - 19968: jis0212<<14 | 0x13<<7 | 0x3A, + 21460 - 19968: jis0208<<14 | 0x1C<<7 | 0x26, + 21461 - 19968: jis0212<<14 | 0x13<<7 | 0x3B, + 21462 - 19968: jis0208<<14 | 0x1B<<7 | 0x47, + 21463 - 19968: jis0208<<14 | 0x1B<<7 | 0x54, + 21465 - 19968: jis0208<<14 | 0x1C<<7 | 0x55, + 21466 - 19968: jis0212<<14 | 0x13<<7 | 0x3C, + 21467 - 19968: jis0208<<14 | 0x27<<7 | 0x1F, + 21469 - 19968: jis0208<<14 | 0x58<<7 | 0x32, + 21470 - 19968: jis0212<<14 | 0x13<<7 | 0x3E, + 21471 - 19968: jis0208<<14 | 0x31<<7 | 0x36, + 21472 - 19968: jis0212<<14 | 0x13<<7 | 0x3F, + 21473 - 19968: jis0208<<14 | 0x10<<7 | 0x22, + 21474 - 19968: jis0208<<14 | 0x20<<7 | 0x30, + 21475 - 19968: jis0208<<14 | 0x17<<7 | 0x5C, + 21476 - 19968: jis0208<<14 | 0x17<<7 | 0x24, + 21477 - 19968: jis0208<<14 | 0x15<<7 | 0x46, + 21478 - 19968: jis0212<<14 | 0x13<<7 | 0x40, + 21479 - 19968: jis0212<<14 | 0x13<<7 | 0x41, + 21480 - 19968: jis0208<<14 | 0x31<<7 | 0x3A, + 21481 - 19968: jis0208<<14 | 0x22<<7 | 0x00, + 21482 - 19968: jis0208<<14 | 0x21<<7 | 0x5D, + 21483 - 19968: jis0208<<14 | 0x15<<7 | 0x0A, + 21484 - 19968: jis0208<<14 | 0x1D<<7 | 0x03, + 21485 - 19968: jis0208<<14 | 0x31<<7 | 0x3B, + 21486 - 19968: jis0208<<14 | 0x31<<7 | 0x39, + 21487 - 19968: jis0208<<14 | 0x11<<7 | 0x23, + 21488 - 19968: jis0208<<14 | 0x21<<7 | 0x45, + 21489 - 19968: jis0208<<14 | 0x1B<<7 | 0x17, + 21490 - 19968: jis0208<<14 | 0x1A<<7 | 0x2A, + 21491 - 19968: jis0208<<14 | 0x10<<7 | 0x05, + 21493 - 19968: jis0212<<14 | 0x13<<7 | 0x42, + 21494 - 19968: jis0208<<14 | 0x12<<7 | 0x4F, + 21495 - 19968: jis0208<<14 | 0x18<<7 | 0x45, + 21496 - 19968: jis0208<<14 | 0x1A<<7 | 0x29, + 21498 - 19968: jis0208<<14 | 0x31<<7 | 0x3C, + 21505 - 19968: jis0208<<14 | 0x31<<7 | 0x3D, + 21506 - 19968: jis0212<<14 | 0x13<<7 | 0x43, + 21507 - 19968: jis0208<<14 | 0x14<<7 | 0x28, + 21508 - 19968: jis0208<<14 | 0x12<<7 | 0x25, + 21512 - 19968: jis0208<<14 | 0x18<<7 | 0x46, + 21513 - 19968: jis0208<<14 | 0x14<<7 | 0x27, + 21514 - 19968: jis0208<<14 | 0x23<<7 | 0x3E, + 21515 - 19968: jis0208<<14 | 0x10<<7 | 0x04, + 21516 - 19968: jis0208<<14 | 0x25<<7 | 0x10, + 21517 - 19968: jis0208<<14 | 0x2B<<7 | 0x1D, + 21518 - 19968: jis0208<<14 | 0x18<<7 | 0x00, + 21519 - 19968: jis0208<<14 | 0x2C<<7 | 0x58, + 21520 - 19968: jis0208<<14 | 0x24<<7 | 0x26, + 21521 - 19968: jis0208<<14 | 0x17<<7 | 0x5D, + 21523 - 19968: jis0212<<14 | 0x13<<7 | 0x44, + 21530 - 19968: jis0212<<14 | 0x13<<7 | 0x45, + 21531 - 19968: jis0208<<14 | 0x16<<7 | 0x0E, + 21533 - 19968: jis0208<<14 | 0x31<<7 | 0x46, + 21535 - 19968: jis0208<<14 | 0x15<<7 | 0x42, + 21536 - 19968: jis0208<<14 | 0x2A<<7 | 0x29, + 21537 - 19968: jis0212<<14 | 0x13<<7 | 0x46, + 21542 - 19968: jis0208<<14 | 0x27<<7 | 0x3C, + 21543 - 19968: jis0212<<14 | 0x13<<7 | 0x47, + 21544 - 19968: jis0212<<14 | 0x13<<7 | 0x48, + 21545 - 19968: jis0208<<14 | 0x31<<7 | 0x45, + 21546 - 19968: jis0212<<14 | 0x13<<7 | 0x49, + 21547 - 19968: jis0208<<14 | 0x13<<7 | 0x3D, + 21548 - 19968: jis0208<<14 | 0x31<<7 | 0x40, + 21549 - 19968: jis0208<<14 | 0x31<<7 | 0x41, + 21550 - 19968: jis0208<<14 | 0x31<<7 | 0x43, + 21551 - 19968: jis0212<<14 | 0x13<<7 | 0x4A, + 21553 - 19968: jis0212<<14 | 0x13<<7 | 0x4B, + 21556 - 19968: jis0212<<14 | 0x13<<7 | 0x4C, + 21557 - 19968: jis0212<<14 | 0x13<<7 | 0x4D, + 21558 - 19968: jis0208<<14 | 0x31<<7 | 0x44, + 21560 - 19968: jis0208<<14 | 0x14<<7 | 0x3A, + 21561 - 19968: jis0208<<14 | 0x1E<<7 | 0x40, + 21563 - 19968: jis0208<<14 | 0x29<<7 | 0x0C, + 21564 - 19968: jis0208<<14 | 0x31<<7 | 0x42, + 21565 - 19968: jis0208<<14 | 0x31<<7 | 0x3E, + 21566 - 19968: jis0208<<14 | 0x17<<7 | 0x42, + 21568 - 19968: jis0208<<14 | 0x31<<7 | 0x3F, + 21570 - 19968: jis0208<<14 | 0x2E<<7 | 0x03, + 21571 - 19968: jis0212<<14 | 0x13<<7 | 0x4E, + 21572 - 19968: jis0212<<14 | 0x13<<7 | 0x4F, + 21574 - 19968: jis0208<<14 | 0x29<<7 | 0x51, + 21575 - 19968: jis0212<<14 | 0x13<<7 | 0x50, + 21576 - 19968: jis0208<<14 | 0x23<<7 | 0x47, + 21577 - 19968: jis0208<<14 | 0x17<<7 | 0x41, + 21578 - 19968: jis0208<<14 | 0x18<<7 | 0x4F, + 21581 - 19968: jis0212<<14 | 0x13<<7 | 0x51, + 21582 - 19968: jis0208<<14 | 0x31<<7 | 0x47, + 21583 - 19968: jis0212<<14 | 0x13<<7 | 0x52, + 21585 - 19968: jis0208<<14 | 0x25<<7 | 0x3C, + 21598 - 19968: jis0212<<14 | 0x13<<7 | 0x53, + 21599 - 19968: jis0208<<14 | 0x31<<7 | 0x4B, + 21602 - 19968: jis0212<<14 | 0x13<<7 | 0x54, + 21604 - 19968: jis0212<<14 | 0x13<<7 | 0x55, + 21606 - 19968: jis0212<<14 | 0x13<<7 | 0x56, + 21607 - 19968: jis0212<<14 | 0x13<<7 | 0x57, + 21608 - 19968: jis0208<<14 | 0x1B<<7 | 0x5D, + 21609 - 19968: jis0212<<14 | 0x13<<7 | 0x58, + 21610 - 19968: jis0208<<14 | 0x1B<<7 | 0x55, + 21611 - 19968: jis0212<<14 | 0x13<<7 | 0x59, + 21613 - 19968: jis0212<<14 | 0x13<<7 | 0x5A, + 21614 - 19968: jis0212<<14 | 0x13<<7 | 0x5B, + 21616 - 19968: jis0208<<14 | 0x31<<7 | 0x4E, + 21617 - 19968: jis0208<<14 | 0x31<<7 | 0x4C, + 21619 - 19968: jis0208<<14 | 0x2B<<7 | 0x02, + 21620 - 19968: jis0212<<14 | 0x13<<7 | 0x5C, + 21621 - 19968: jis0208<<14 | 0x31<<7 | 0x49, + 21622 - 19968: jis0208<<14 | 0x31<<7 | 0x52, + 21623 - 19968: jis0208<<14 | 0x31<<7 | 0x4D, + 21627 - 19968: jis0208<<14 | 0x31<<7 | 0x50, + 21628 - 19968: jis0208<<14 | 0x17<<7 | 0x25, + 21629 - 19968: jis0208<<14 | 0x2B<<7 | 0x1E, + 21631 - 19968: jis0212<<14 | 0x13<<7 | 0x5D, + 21632 - 19968: jis0208<<14 | 0x31<<7 | 0x51, + 21633 - 19968: jis0212<<14 | 0x14<<7 | 0x00, + 21635 - 19968: jis0212<<14 | 0x14<<7 | 0x01, + 21636 - 19968: jis0208<<14 | 0x31<<7 | 0x53, + 21637 - 19968: jis0212<<14 | 0x14<<7 | 0x02, + 21638 - 19968: jis0208<<14 | 0x31<<7 | 0x55, + 21640 - 19968: jis0212<<14 | 0x14<<7 | 0x03, + 21641 - 19968: jis0212<<14 | 0x14<<7 | 0x04, + 21642 - 19968: jis0208<<14 | 0x58<<7 | 0x35, + 21643 - 19968: jis0208<<14 | 0x19<<7 | 0x4F, + 21644 - 19968: jis0208<<14 | 0x2E<<7 | 0x21, + 21645 - 19968: jis0212<<14 | 0x14<<7 | 0x05, + 21646 - 19968: jis0208<<14 | 0x31<<7 | 0x4A, + 21647 - 19968: jis0208<<14 | 0x31<<7 | 0x48, + 21648 - 19968: jis0208<<14 | 0x31<<7 | 0x54, + 21649 - 19968: jis0212<<14 | 0x14<<7 | 0x06, + 21650 - 19968: jis0208<<14 | 0x31<<7 | 0x4F, + 21653 - 19968: jis0212<<14 | 0x14<<7 | 0x07, + 21654 - 19968: jis0212<<14 | 0x14<<7 | 0x08, + 21660 - 19968: jis0208<<14 | 0x58<<7 | 0x34, + 21663 - 19968: jis0212<<14 | 0x14<<7 | 0x0A, + 21665 - 19968: jis0212<<14 | 0x14<<7 | 0x0B, + 21666 - 19968: jis0208<<14 | 0x31<<7 | 0x57, + 21668 - 19968: jis0208<<14 | 0x32<<7 | 0x02, + 21669 - 19968: jis0208<<14 | 0x31<<7 | 0x59, + 21670 - 19968: jis0212<<14 | 0x14<<7 | 0x0C, + 21671 - 19968: jis0212<<14 | 0x14<<7 | 0x0D, + 21672 - 19968: jis0208<<14 | 0x31<<7 | 0x5D, + 21673 - 19968: jis0208<<14 | 0x58<<7 | 0x36, + 21674 - 19968: jis0212<<14 | 0x14<<7 | 0x0F, + 21675 - 19968: jis0208<<14 | 0x32<<7 | 0x00, + 21676 - 19968: jis0208<<14 | 0x31<<7 | 0x5A, + 21677 - 19968: jis0212<<14 | 0x14<<7 | 0x10, + 21678 - 19968: jis0212<<14 | 0x14<<7 | 0x11, + 21679 - 19968: jis0208<<14 | 0x32<<7 | 0x1D, + 21681 - 19968: jis0212<<14 | 0x14<<7 | 0x12, + 21682 - 19968: jis0208<<14 | 0x19<<7 | 0x48, + 21683 - 19968: jis0208<<14 | 0x12<<7 | 0x10, + 21687 - 19968: jis0212<<14 | 0x14<<7 | 0x13, + 21688 - 19968: jis0208<<14 | 0x31<<7 | 0x58, + 21689 - 19968: jis0212<<14 | 0x14<<7 | 0x14, + 21690 - 19968: jis0212<<14 | 0x14<<7 | 0x15, + 21691 - 19968: jis0212<<14 | 0x14<<7 | 0x16, + 21692 - 19968: jis0208<<14 | 0x32<<7 | 0x04, + 21693 - 19968: jis0208<<14 | 0x0F<<7 | 0x55, + 21694 - 19968: jis0208<<14 | 0x32<<7 | 0x03, + 21695 - 19968: jis0212<<14 | 0x14<<7 | 0x17, + 21696 - 19968: jis0208<<14 | 0x0F<<7 | 0x04, + 21697 - 19968: jis0208<<14 | 0x28<<7 | 0x29, + 21698 - 19968: jis0208<<14 | 0x32<<7 | 0x01, + 21700 - 19968: jis0208<<14 | 0x31<<7 | 0x5B, + 21702 - 19968: jis0212<<14 | 0x14<<7 | 0x18, + 21703 - 19968: jis0208<<14 | 0x31<<7 | 0x56, + 21704 - 19968: jis0208<<14 | 0x31<<7 | 0x5C, + 21705 - 19968: jis0208<<14 | 0x19<<7 | 0x27, + 21706 - 19968: jis0212<<14 | 0x14<<7 | 0x19, + 21709 - 19968: jis0212<<14 | 0x14<<7 | 0x1A, + 21710 - 19968: jis0212<<14 | 0x14<<7 | 0x1B, + 21720 - 19968: jis0208<<14 | 0x32<<7 | 0x05, + 21728 - 19968: jis0212<<14 | 0x14<<7 | 0x1C, + 21729 - 19968: jis0208<<14 | 0x0F<<7 | 0x56, + 21730 - 19968: jis0208<<14 | 0x32<<7 | 0x0E, + 21733 - 19968: jis0208<<14 | 0x32<<7 | 0x06, + 21734 - 19968: jis0208<<14 | 0x32<<7 | 0x07, + 21736 - 19968: jis0208<<14 | 0x1D<<7 | 0x04, + 21737 - 19968: jis0208<<14 | 0x2A<<7 | 0x48, + 21738 - 19968: jis0212<<14 | 0x14<<7 | 0x1D, + 21740 - 19968: jis0212<<14 | 0x14<<7 | 0x1E, + 21741 - 19968: jis0208<<14 | 0x32<<7 | 0x0C, + 21742 - 19968: jis0208<<14 | 0x32<<7 | 0x0B, + 21743 - 19968: jis0212<<14 | 0x14<<7 | 0x1F, + 21746 - 19968: jis0208<<14 | 0x24<<7 | 0x0E, + 21750 - 19968: jis0212<<14 | 0x14<<7 | 0x20, + 21754 - 19968: jis0208<<14 | 0x32<<7 | 0x0D, + 21756 - 19968: jis0212<<14 | 0x14<<7 | 0x21, + 21757 - 19968: jis0208<<14 | 0x32<<7 | 0x0A, + 21758 - 19968: jis0212<<14 | 0x14<<7 | 0x22, + 21759 - 19968: jis0208<<14 | 0x58<<7 | 0x37, + 21760 - 19968: jis0212<<14 | 0x14<<7 | 0x24, + 21761 - 19968: jis0212<<14 | 0x14<<7 | 0x25, + 21764 - 19968: jis0208<<14 | 0x10<<7 | 0x13, + 21765 - 19968: jis0212<<14 | 0x14<<7 | 0x26, + 21766 - 19968: jis0208<<14 | 0x19<<7 | 0x15, + 21767 - 19968: jis0208<<14 | 0x1E<<7 | 0x0F, + 21768 - 19968: jis0212<<14 | 0x14<<7 | 0x27, + 21769 - 19968: jis0212<<14 | 0x14<<7 | 0x28, + 21772 - 19968: jis0212<<14 | 0x14<<7 | 0x29, + 21773 - 19968: jis0212<<14 | 0x14<<7 | 0x2A, + 21774 - 19968: jis0212<<14 | 0x14<<7 | 0x2B, + 21775 - 19968: jis0208<<14 | 0x32<<7 | 0x08, + 21776 - 19968: jis0208<<14 | 0x24<<7 | 0x41, + 21780 - 19968: jis0208<<14 | 0x32<<7 | 0x09, + 21781 - 19968: jis0212<<14 | 0x14<<7 | 0x2C, + 21782 - 19968: jis0208<<14 | 0x0F<<7 | 0x01, + 21802 - 19968: jis0212<<14 | 0x14<<7 | 0x2D, + 21803 - 19968: jis0212<<14 | 0x14<<7 | 0x2E, + 21806 - 19968: jis0208<<14 | 0x32<<7 | 0x13, + 21807 - 19968: jis0208<<14 | 0x2C<<7 | 0x02, + 21809 - 19968: jis0208<<14 | 0x1D<<7 | 0x06, + 21810 - 19968: jis0212<<14 | 0x14<<7 | 0x2F, + 21811 - 19968: jis0208<<14 | 0x32<<7 | 0x19, + 21813 - 19968: jis0212<<14 | 0x14<<7 | 0x30, + 21814 - 19968: jis0212<<14 | 0x14<<7 | 0x31, + 21816 - 19968: jis0208<<14 | 0x32<<7 | 0x18, + 21817 - 19968: jis0208<<14 | 0x32<<7 | 0x0F, + 21819 - 19968: jis0212<<14 | 0x14<<7 | 0x32, + 21820 - 19968: jis0212<<14 | 0x14<<7 | 0x33, + 21821 - 19968: jis0212<<14 | 0x14<<7 | 0x34, + 21822 - 19968: jis0208<<14 | 0x21<<7 | 0x22, + 21824 - 19968: jis0208<<14 | 0x32<<7 | 0x10, + 21825 - 19968: jis0212<<14 | 0x14<<7 | 0x35, + 21828 - 19968: jis0208<<14 | 0x21<<7 | 0x4E, + 21829 - 19968: jis0208<<14 | 0x32<<7 | 0x15, + 21830 - 19968: jis0208<<14 | 0x1D<<7 | 0x05, + 21831 - 19968: jis0212<<14 | 0x14<<7 | 0x36, + 21833 - 19968: jis0212<<14 | 0x14<<7 | 0x37, + 21834 - 19968: jis0212<<14 | 0x14<<7 | 0x38, + 21836 - 19968: jis0208<<14 | 0x32<<7 | 0x12, + 21837 - 19968: jis0212<<14 | 0x14<<7 | 0x39, + 21839 - 19968: jis0208<<14 | 0x2B<<7 | 0x43, + 21840 - 19968: jis0212<<14 | 0x14<<7 | 0x3A, + 21841 - 19968: jis0212<<14 | 0x14<<7 | 0x3B, + 21843 - 19968: jis0208<<14 | 0x16<<7 | 0x1B, + 21846 - 19968: jis0208<<14 | 0x32<<7 | 0x16, + 21847 - 19968: jis0208<<14 | 0x32<<7 | 0x17, + 21848 - 19968: jis0212<<14 | 0x14<<7 | 0x3C, + 21850 - 19968: jis0212<<14 | 0x14<<7 | 0x3D, + 21851 - 19968: jis0212<<14 | 0x14<<7 | 0x3E, + 21852 - 19968: jis0208<<14 | 0x32<<7 | 0x14, + 21853 - 19968: jis0208<<14 | 0x32<<7 | 0x1A, + 21854 - 19968: jis0212<<14 | 0x14<<7 | 0x3F, + 21856 - 19968: jis0212<<14 | 0x14<<7 | 0x40, + 21857 - 19968: jis0212<<14 | 0x14<<7 | 0x41, + 21859 - 19968: jis0208<<14 | 0x32<<7 | 0x11, + 21860 - 19968: jis0212<<14 | 0x14<<7 | 0x42, + 21862 - 19968: jis0212<<14 | 0x14<<7 | 0x43, + 21883 - 19968: jis0208<<14 | 0x32<<7 | 0x20, + 21884 - 19968: jis0208<<14 | 0x32<<7 | 0x25, + 21886 - 19968: jis0208<<14 | 0x32<<7 | 0x21, + 21887 - 19968: jis0212<<14 | 0x14<<7 | 0x44, + 21888 - 19968: jis0208<<14 | 0x32<<7 | 0x1C, + 21889 - 19968: jis0212<<14 | 0x14<<7 | 0x45, + 21890 - 19968: jis0212<<14 | 0x14<<7 | 0x46, + 21891 - 19968: jis0208<<14 | 0x32<<7 | 0x26, + 21892 - 19968: jis0208<<14 | 0x20<<7 | 0x10, + 21894 - 19968: jis0208<<14 | 0x58<<7 | 0x38, + 21895 - 19968: jis0208<<14 | 0x32<<7 | 0x28, + 21896 - 19968: jis0212<<14 | 0x14<<7 | 0x48, + 21897 - 19968: jis0208<<14 | 0x18<<7 | 0x01, + 21898 - 19968: jis0208<<14 | 0x32<<7 | 0x1E, + 21899 - 19968: jis0208<<14 | 0x22<<7 | 0x5C, + 21902 - 19968: jis0212<<14 | 0x14<<7 | 0x49, + 21903 - 19968: jis0212<<14 | 0x14<<7 | 0x4A, + 21905 - 19968: jis0212<<14 | 0x14<<7 | 0x4B, + 21906 - 19968: jis0212<<14 | 0x14<<7 | 0x4C, + 21907 - 19968: jis0212<<14 | 0x14<<7 | 0x4D, + 21908 - 19968: jis0212<<14 | 0x14<<7 | 0x4E, + 21911 - 19968: jis0212<<14 | 0x14<<7 | 0x4F, + 21912 - 19968: jis0208<<14 | 0x32<<7 | 0x22, + 21913 - 19968: jis0208<<14 | 0x32<<7 | 0x1B, + 21914 - 19968: jis0208<<14 | 0x13<<7 | 0x0C, + 21916 - 19968: jis0208<<14 | 0x13<<7 | 0x4D, + 21917 - 19968: jis0208<<14 | 0x12<<7 | 0x44, + 21918 - 19968: jis0208<<14 | 0x32<<7 | 0x23, + 21919 - 19968: jis0208<<14 | 0x32<<7 | 0x1F, + 21923 - 19968: jis0212<<14 | 0x14<<7 | 0x50, + 21924 - 19968: jis0212<<14 | 0x14<<7 | 0x51, + 21927 - 19968: jis0208<<14 | 0x16<<7 | 0x55, + 21928 - 19968: jis0208<<14 | 0x32<<7 | 0x29, + 21929 - 19968: jis0208<<14 | 0x32<<7 | 0x27, + 21930 - 19968: jis0208<<14 | 0x20<<7 | 0x32, + 21931 - 19968: jis0208<<14 | 0x14<<7 | 0x29, + 21932 - 19968: jis0208<<14 | 0x15<<7 | 0x0B, + 21933 - 19968: jis0212<<14 | 0x14<<7 | 0x52, + 21934 - 19968: jis0208<<14 | 0x32<<7 | 0x24, + 21936 - 19968: jis0208<<14 | 0x15<<7 | 0x53, + 21938 - 19968: jis0212<<14 | 0x14<<7 | 0x53, + 21942 - 19968: jis0208<<14 | 0x10<<7 | 0x23, + 21951 - 19968: jis0212<<14 | 0x14<<7 | 0x54, + 21953 - 19968: jis0212<<14 | 0x14<<7 | 0x55, + 21955 - 19968: jis0212<<14 | 0x14<<7 | 0x56, + 21956 - 19968: jis0208<<14 | 0x32<<7 | 0x2D, + 21957 - 19968: jis0208<<14 | 0x32<<7 | 0x2B, + 21958 - 19968: jis0212<<14 | 0x14<<7 | 0x57, + 21959 - 19968: jis0208<<14 | 0x33<<7 | 0x06, + 21961 - 19968: jis0212<<14 | 0x14<<7 | 0x58, + 21963 - 19968: jis0212<<14 | 0x14<<7 | 0x59, + 21964 - 19968: jis0212<<14 | 0x14<<7 | 0x5A, + 21966 - 19968: jis0212<<14 | 0x14<<7 | 0x5B, + 21969 - 19968: jis0212<<14 | 0x14<<7 | 0x5C, + 21970 - 19968: jis0212<<14 | 0x14<<7 | 0x5D, + 21971 - 19968: jis0212<<14 | 0x15<<7 | 0x00, + 21972 - 19968: jis0208<<14 | 0x32<<7 | 0x30, + 21975 - 19968: jis0212<<14 | 0x15<<7 | 0x01, + 21976 - 19968: jis0212<<14 | 0x15<<7 | 0x02, + 21978 - 19968: jis0208<<14 | 0x32<<7 | 0x2A, + 21979 - 19968: jis0212<<14 | 0x15<<7 | 0x03, + 21980 - 19968: jis0208<<14 | 0x32<<7 | 0x2E, + 21982 - 19968: jis0212<<14 | 0x15<<7 | 0x04, + 21983 - 19968: jis0208<<14 | 0x32<<7 | 0x2C, + 21986 - 19968: jis0212<<14 | 0x15<<7 | 0x05, + 21987 - 19968: jis0208<<14 | 0x1A<<7 | 0x2B, + 21988 - 19968: jis0208<<14 | 0x32<<7 | 0x2F, + 21993 - 19968: jis0212<<14 | 0x15<<7 | 0x06, + 22006 - 19968: jis0212<<14 | 0x15<<7 | 0x07, + 22007 - 19968: jis0208<<14 | 0x32<<7 | 0x32, + 22009 - 19968: jis0208<<14 | 0x32<<7 | 0x37, + 22013 - 19968: jis0208<<14 | 0x32<<7 | 0x35, + 22014 - 19968: jis0208<<14 | 0x32<<7 | 0x34, + 22015 - 19968: jis0212<<14 | 0x15<<7 | 0x08, + 22021 - 19968: jis0212<<14 | 0x15<<7 | 0x09, + 22022 - 19968: jis0208<<14 | 0x22<<7 | 0x11, + 22024 - 19968: jis0212<<14 | 0x15<<7 | 0x0A, + 22025 - 19968: jis0208<<14 | 0x11<<7 | 0x24, + 22026 - 19968: jis0212<<14 | 0x15<<7 | 0x0B, + 22029 - 19968: jis0212<<14 | 0x15<<7 | 0x0C, + 22030 - 19968: jis0212<<14 | 0x15<<7 | 0x0D, + 22031 - 19968: jis0212<<14 | 0x15<<7 | 0x0E, + 22032 - 19968: jis0212<<14 | 0x15<<7 | 0x0F, + 22033 - 19968: jis0212<<14 | 0x15<<7 | 0x10, + 22034 - 19968: jis0212<<14 | 0x15<<7 | 0x11, + 22036 - 19968: jis0208<<14 | 0x32<<7 | 0x31, + 22038 - 19968: jis0208<<14 | 0x32<<7 | 0x33, + 22039 - 19968: jis0208<<14 | 0x1D<<7 | 0x07, + 22040 - 19968: jis0208<<14 | 0x10<<7 | 0x12, + 22041 - 19968: jis0212<<14 | 0x15<<7 | 0x12, + 22043 - 19968: jis0208<<14 | 0x32<<7 | 0x36, + 22057 - 19968: jis0208<<14 | 0x11<<7 | 0x3D, + 22060 - 19968: jis0212<<14 | 0x15<<7 | 0x13, + 22063 - 19968: jis0208<<14 | 0x32<<7 | 0x41, + 22064 - 19968: jis0212<<14 | 0x15<<7 | 0x14, + 22065 - 19968: jis0208<<14 | 0x1D<<7 | 0x5B, + 22066 - 19968: jis0208<<14 | 0x32<<7 | 0x3D, + 22067 - 19968: jis0212<<14 | 0x15<<7 | 0x15, + 22068 - 19968: jis0208<<14 | 0x32<<7 | 0x3B, + 22069 - 19968: jis0212<<14 | 0x15<<7 | 0x16, + 22070 - 19968: jis0208<<14 | 0x32<<7 | 0x3C, + 22071 - 19968: jis0212<<14 | 0x15<<7 | 0x17, + 22072 - 19968: jis0208<<14 | 0x32<<7 | 0x3E, + 22073 - 19968: jis0212<<14 | 0x15<<7 | 0x18, + 22075 - 19968: jis0212<<14 | 0x15<<7 | 0x19, + 22076 - 19968: jis0212<<14 | 0x15<<7 | 0x1A, + 22077 - 19968: jis0212<<14 | 0x15<<7 | 0x1B, + 22079 - 19968: jis0212<<14 | 0x15<<7 | 0x1C, + 22080 - 19968: jis0212<<14 | 0x15<<7 | 0x1D, + 22081 - 19968: jis0212<<14 | 0x15<<7 | 0x1E, + 22082 - 19968: jis0208<<14 | 0x10<<7 | 0x1C, + 22083 - 19968: jis0212<<14 | 0x15<<7 | 0x1F, + 22084 - 19968: jis0212<<14 | 0x15<<7 | 0x20, + 22086 - 19968: jis0212<<14 | 0x15<<7 | 0x21, + 22089 - 19968: jis0212<<14 | 0x15<<7 | 0x22, + 22091 - 19968: jis0212<<14 | 0x15<<7 | 0x23, + 22092 - 19968: jis0208<<14 | 0x20<<7 | 0x18, + 22093 - 19968: jis0212<<14 | 0x15<<7 | 0x24, + 22094 - 19968: jis0208<<14 | 0x32<<7 | 0x38, + 22095 - 19968: jis0212<<14 | 0x15<<7 | 0x25, + 22096 - 19968: jis0208<<14 | 0x32<<7 | 0x39, + 22100 - 19968: jis0212<<14 | 0x15<<7 | 0x26, + 22107 - 19968: jis0208<<14 | 0x12<<7 | 0x59, + 22110 - 19968: jis0212<<14 | 0x15<<7 | 0x27, + 22112 - 19968: jis0212<<14 | 0x15<<7 | 0x28, + 22113 - 19968: jis0212<<14 | 0x15<<7 | 0x29, + 22114 - 19968: jis0212<<14 | 0x15<<7 | 0x2A, + 22115 - 19968: jis0212<<14 | 0x15<<7 | 0x2B, + 22116 - 19968: jis0208<<14 | 0x32<<7 | 0x40, + 22118 - 19968: jis0212<<14 | 0x15<<7 | 0x2C, + 22120 - 19968: jis0208<<14 | 0x13<<7 | 0x4E, + 22121 - 19968: jis0212<<14 | 0x15<<7 | 0x2D, + 22122 - 19968: jis0208<<14 | 0x32<<7 | 0x43, + 22123 - 19968: jis0208<<14 | 0x32<<7 | 0x3F, + 22124 - 19968: jis0208<<14 | 0x32<<7 | 0x42, + 22125 - 19968: jis0212<<14 | 0x15<<7 | 0x2E, + 22127 - 19968: jis0212<<14 | 0x15<<7 | 0x2F, + 22129 - 19968: jis0212<<14 | 0x15<<7 | 0x30, + 22130 - 19968: jis0212<<14 | 0x15<<7 | 0x31, + 22132 - 19968: jis0208<<14 | 0x29<<7 | 0x0D, + 22133 - 19968: jis0212<<14 | 0x15<<7 | 0x32, + 22136 - 19968: jis0208<<14 | 0x25<<7 | 0x34, + 22138 - 19968: jis0208<<14 | 0x27<<7 | 0x17, + 22144 - 19968: jis0208<<14 | 0x32<<7 | 0x45, + 22148 - 19968: jis0212<<14 | 0x15<<7 | 0x33, + 22149 - 19968: jis0212<<14 | 0x15<<7 | 0x34, + 22150 - 19968: jis0208<<14 | 0x32<<7 | 0x44, + 22151 - 19968: jis0208<<14 | 0x12<<7 | 0x24, + 22152 - 19968: jis0212<<14 | 0x15<<7 | 0x35, + 22154 - 19968: jis0208<<14 | 0x32<<7 | 0x46, + 22155 - 19968: jis0212<<14 | 0x15<<7 | 0x36, + 22156 - 19968: jis0212<<14 | 0x15<<7 | 0x37, + 22159 - 19968: jis0208<<14 | 0x32<<7 | 0x49, + 22164 - 19968: jis0208<<14 | 0x32<<7 | 0x48, + 22165 - 19968: jis0212<<14 | 0x15<<7 | 0x38, + 22169 - 19968: jis0212<<14 | 0x15<<7 | 0x39, + 22170 - 19968: jis0212<<14 | 0x15<<7 | 0x3A, + 22173 - 19968: jis0212<<14 | 0x15<<7 | 0x3B, + 22174 - 19968: jis0212<<14 | 0x15<<7 | 0x3C, + 22175 - 19968: jis0212<<14 | 0x15<<7 | 0x3D, + 22176 - 19968: jis0208<<14 | 0x32<<7 | 0x47, + 22178 - 19968: jis0208<<14 | 0x26<<7 | 0x18, + 22181 - 19968: jis0208<<14 | 0x32<<7 | 0x4A, + 22182 - 19968: jis0212<<14 | 0x15<<7 | 0x3E, + 22183 - 19968: jis0212<<14 | 0x15<<7 | 0x3F, + 22184 - 19968: jis0212<<14 | 0x15<<7 | 0x40, + 22185 - 19968: jis0212<<14 | 0x15<<7 | 0x41, + 22187 - 19968: jis0212<<14 | 0x15<<7 | 0x42, + 22188 - 19968: jis0212<<14 | 0x15<<7 | 0x43, + 22189 - 19968: jis0212<<14 | 0x15<<7 | 0x44, + 22190 - 19968: jis0208<<14 | 0x32<<7 | 0x4B, + 22193 - 19968: jis0212<<14 | 0x15<<7 | 0x45, + 22195 - 19968: jis0212<<14 | 0x15<<7 | 0x46, + 22196 - 19968: jis0208<<14 | 0x32<<7 | 0x4D, + 22198 - 19968: jis0208<<14 | 0x32<<7 | 0x4C, + 22199 - 19968: jis0212<<14 | 0x15<<7 | 0x47, + 22204 - 19968: jis0208<<14 | 0x32<<7 | 0x4F, + 22206 - 19968: jis0212<<14 | 0x15<<7 | 0x48, + 22208 - 19968: jis0208<<14 | 0x32<<7 | 0x52, + 22209 - 19968: jis0208<<14 | 0x32<<7 | 0x50, + 22210 - 19968: jis0208<<14 | 0x32<<7 | 0x4E, + 22211 - 19968: jis0208<<14 | 0x32<<7 | 0x51, + 22213 - 19968: jis0212<<14 | 0x15<<7 | 0x49, + 22216 - 19968: jis0208<<14 | 0x32<<7 | 0x53, + 22217 - 19968: jis0212<<14 | 0x15<<7 | 0x4A, + 22218 - 19968: jis0212<<14 | 0x15<<7 | 0x4B, + 22219 - 19968: jis0212<<14 | 0x15<<7 | 0x4C, + 22220 - 19968: jis0212<<14 | 0x15<<7 | 0x4F, + 22221 - 19968: jis0212<<14 | 0x15<<7 | 0x50, + 22222 - 19968: jis0208<<14 | 0x32<<7 | 0x54, + 22223 - 19968: jis0212<<14 | 0x15<<7 | 0x4D, + 22224 - 19968: jis0212<<14 | 0x15<<7 | 0x4E, + 22225 - 19968: jis0208<<14 | 0x32<<7 | 0x55, + 22227 - 19968: jis0208<<14 | 0x32<<7 | 0x56, + 22231 - 19968: jis0208<<14 | 0x32<<7 | 0x57, + 22232 - 19968: jis0208<<14 | 0x30<<7 | 0x24, + 22233 - 19968: jis0212<<14 | 0x15<<7 | 0x51, + 22234 - 19968: jis0208<<14 | 0x1B<<7 | 0x5B, + 22235 - 19968: jis0208<<14 | 0x1A<<7 | 0x2C, + 22236 - 19968: jis0212<<14 | 0x15<<7 | 0x52, + 22237 - 19968: jis0212<<14 | 0x15<<7 | 0x53, + 22238 - 19968: jis0208<<14 | 0x11<<7 | 0x52, + 22239 - 19968: jis0212<<14 | 0x15<<7 | 0x54, + 22240 - 19968: jis0208<<14 | 0x0F<<7 | 0x57, + 22241 - 19968: jis0212<<14 | 0x15<<7 | 0x55, + 22243 - 19968: jis0208<<14 | 0x22<<7 | 0x23, + 22244 - 19968: jis0212<<14 | 0x15<<7 | 0x56, + 22245 - 19968: jis0212<<14 | 0x15<<7 | 0x57, + 22246 - 19968: jis0212<<14 | 0x15<<7 | 0x58, + 22247 - 19968: jis0212<<14 | 0x15<<7 | 0x59, + 22248 - 19968: jis0212<<14 | 0x15<<7 | 0x5A, + 22251 - 19968: jis0212<<14 | 0x15<<7 | 0x5C, + 22253 - 19968: jis0212<<14 | 0x15<<7 | 0x5D, + 22254 - 19968: jis0208<<14 | 0x32<<7 | 0x58, + 22256 - 19968: jis0208<<14 | 0x19<<7 | 0x03, + 22257 - 19968: jis0212<<14 | 0x15<<7 | 0x5B, + 22258 - 19968: jis0208<<14 | 0x0F<<7 | 0x2E, + 22259 - 19968: jis0208<<14 | 0x1E<<7 | 0x3D, + 22262 - 19968: jis0212<<14 | 0x16<<7 | 0x00, + 22263 - 19968: jis0212<<14 | 0x16<<7 | 0x01, + 22265 - 19968: jis0208<<14 | 0x32<<7 | 0x59, + 22266 - 19968: jis0208<<14 | 0x17<<7 | 0x26, + 22269 - 19968: jis0208<<14 | 0x18<<7 | 0x50, + 22271 - 19968: jis0208<<14 | 0x32<<7 | 0x5B, + 22272 - 19968: jis0208<<14 | 0x32<<7 | 0x5A, + 22273 - 19968: jis0212<<14 | 0x16<<7 | 0x02, + 22274 - 19968: jis0212<<14 | 0x16<<7 | 0x03, + 22275 - 19968: jis0208<<14 | 0x29<<7 | 0x3F, + 22276 - 19968: jis0208<<14 | 0x32<<7 | 0x5C, + 22279 - 19968: jis0212<<14 | 0x16<<7 | 0x04, + 22280 - 19968: jis0208<<14 | 0x33<<7 | 0x00, + 22281 - 19968: jis0208<<14 | 0x32<<7 | 0x5D, + 22282 - 19968: jis0212<<14 | 0x16<<7 | 0x05, + 22283 - 19968: jis0208<<14 | 0x33<<7 | 0x01, + 22284 - 19968: jis0212<<14 | 0x16<<7 | 0x06, + 22285 - 19968: jis0208<<14 | 0x33<<7 | 0x02, + 22287 - 19968: jis0208<<14 | 0x16<<7 | 0x56, + 22289 - 19968: jis0212<<14 | 0x16<<7 | 0x07, + 22290 - 19968: jis0208<<14 | 0x10<<7 | 0x3F, + 22291 - 19968: jis0208<<14 | 0x33<<7 | 0x03, + 22293 - 19968: jis0212<<14 | 0x16<<7 | 0x08, + 22294 - 19968: jis0208<<14 | 0x33<<7 | 0x05, + 22296 - 19968: jis0208<<14 | 0x33<<7 | 0x04, + 22298 - 19968: jis0212<<14 | 0x16<<7 | 0x09, + 22299 - 19968: jis0212<<14 | 0x16<<7 | 0x0A, + 22300 - 19968: jis0208<<14 | 0x33<<7 | 0x07, + 22301 - 19968: jis0212<<14 | 0x16<<7 | 0x0B, + 22303 - 19968: jis0208<<14 | 0x24<<7 | 0x39, + 22304 - 19968: jis0212<<14 | 0x16<<7 | 0x0C, + 22306 - 19968: jis0212<<14 | 0x16<<7 | 0x0D, + 22307 - 19968: jis0212<<14 | 0x16<<7 | 0x0E, + 22308 - 19968: jis0212<<14 | 0x16<<7 | 0x0F, + 22309 - 19968: jis0212<<14 | 0x16<<7 | 0x10, + 22310 - 19968: jis0208<<14 | 0x33<<7 | 0x08, + 22311 - 19968: jis0208<<14 | 0x0F<<7 | 0x14, + 22312 - 19968: jis0208<<14 | 0x19<<7 | 0x3E, + 22313 - 19968: jis0212<<14 | 0x16<<7 | 0x11, + 22314 - 19968: jis0212<<14 | 0x16<<7 | 0x12, + 22316 - 19968: jis0212<<14 | 0x16<<7 | 0x13, + 22317 - 19968: jis0208<<14 | 0x16<<7 | 0x1C, + 22318 - 19968: jis0212<<14 | 0x16<<7 | 0x14, + 22319 - 19968: jis0212<<14 | 0x16<<7 | 0x15, + 22320 - 19968: jis0208<<14 | 0x22<<7 | 0x2E, + 22323 - 19968: jis0212<<14 | 0x16<<7 | 0x16, + 22324 - 19968: jis0212<<14 | 0x16<<7 | 0x17, + 22327 - 19968: jis0208<<14 | 0x33<<7 | 0x09, + 22328 - 19968: jis0208<<14 | 0x33<<7 | 0x0A, + 22331 - 19968: jis0208<<14 | 0x33<<7 | 0x0C, + 22333 - 19968: jis0212<<14 | 0x16<<7 | 0x18, + 22334 - 19968: jis0212<<14 | 0x16<<7 | 0x19, + 22335 - 19968: jis0212<<14 | 0x16<<7 | 0x1A, + 22336 - 19968: jis0208<<14 | 0x33<<7 | 0x0D, + 22338 - 19968: jis0208<<14 | 0x19<<7 | 0x43, + 22341 - 19968: jis0212<<14 | 0x16<<7 | 0x1B, + 22342 - 19968: jis0212<<14 | 0x16<<7 | 0x1C, + 22343 - 19968: jis0208<<14 | 0x15<<7 | 0x30, + 22346 - 19968: jis0208<<14 | 0x2A<<7 | 0x16, + 22348 - 19968: jis0212<<14 | 0x16<<7 | 0x1D, + 22349 - 19968: jis0212<<14 | 0x16<<7 | 0x1E, + 22350 - 19968: jis0208<<14 | 0x33<<7 | 0x0B, + 22351 - 19968: jis0208<<14 | 0x33<<7 | 0x0E, + 22352 - 19968: jis0208<<14 | 0x19<<7 | 0x20, + 22353 - 19968: jis0208<<14 | 0x18<<7 | 0x02, + 22354 - 19968: jis0212<<14 | 0x16<<7 | 0x1F, + 22361 - 19968: jis0208<<14 | 0x58<<7 | 0x39, + 22369 - 19968: jis0208<<14 | 0x33<<7 | 0x12, + 22370 - 19968: jis0212<<14 | 0x16<<7 | 0x20, + 22372 - 19968: jis0208<<14 | 0x19<<7 | 0x04, + 22373 - 19968: jis0208<<14 | 0x58<<7 | 0x3A, + 22374 - 19968: jis0208<<14 | 0x22<<7 | 0x12, + 22375 - 19968: jis0212<<14 | 0x16<<7 | 0x22, + 22376 - 19968: jis0212<<14 | 0x16<<7 | 0x23, + 22377 - 19968: jis0208<<14 | 0x33<<7 | 0x0F, + 22378 - 19968: jis0208<<14 | 0x23<<7 | 0x39, + 22379 - 19968: jis0212<<14 | 0x16<<7 | 0x24, + 22381 - 19968: jis0212<<14 | 0x16<<7 | 0x25, + 22382 - 19968: jis0212<<14 | 0x16<<7 | 0x26, + 22383 - 19968: jis0212<<14 | 0x16<<7 | 0x27, + 22384 - 19968: jis0212<<14 | 0x16<<7 | 0x28, + 22385 - 19968: jis0212<<14 | 0x16<<7 | 0x29, + 22387 - 19968: jis0212<<14 | 0x16<<7 | 0x2A, + 22388 - 19968: jis0212<<14 | 0x16<<7 | 0x2B, + 22389 - 19968: jis0212<<14 | 0x16<<7 | 0x2C, + 22391 - 19968: jis0212<<14 | 0x16<<7 | 0x2D, + 22393 - 19968: jis0212<<14 | 0x16<<7 | 0x2E, + 22394 - 19968: jis0212<<14 | 0x16<<7 | 0x2F, + 22395 - 19968: jis0212<<14 | 0x16<<7 | 0x30, + 22396 - 19968: jis0212<<14 | 0x16<<7 | 0x31, + 22398 - 19968: jis0212<<14 | 0x16<<7 | 0x32, + 22399 - 19968: jis0208<<14 | 0x33<<7 | 0x13, + 22401 - 19968: jis0212<<14 | 0x16<<7 | 0x33, + 22402 - 19968: jis0208<<14 | 0x1E<<7 | 0x41, + 22403 - 19968: jis0212<<14 | 0x16<<7 | 0x34, + 22408 - 19968: jis0208<<14 | 0x33<<7 | 0x11, + 22409 - 19968: jis0208<<14 | 0x33<<7 | 0x14, + 22411 - 19968: jis0208<<14 | 0x16<<7 | 0x1E, + 22412 - 19968: jis0212<<14 | 0x16<<7 | 0x35, + 22419 - 19968: jis0208<<14 | 0x33<<7 | 0x15, + 22420 - 19968: jis0212<<14 | 0x16<<7 | 0x36, + 22421 - 19968: jis0212<<14 | 0x16<<7 | 0x3F, + 22423 - 19968: jis0212<<14 | 0x16<<7 | 0x37, + 22425 - 19968: jis0212<<14 | 0x16<<7 | 0x38, + 22426 - 19968: jis0212<<14 | 0x16<<7 | 0x39, + 22428 - 19968: jis0212<<14 | 0x16<<7 | 0x3A, + 22429 - 19968: jis0212<<14 | 0x16<<7 | 0x3B, + 22430 - 19968: jis0212<<14 | 0x16<<7 | 0x3C, + 22431 - 19968: jis0212<<14 | 0x16<<7 | 0x3D, + 22432 - 19968: jis0208<<14 | 0x33<<7 | 0x16, + 22433 - 19968: jis0212<<14 | 0x16<<7 | 0x3E, + 22434 - 19968: jis0208<<14 | 0x18<<7 | 0x03, + 22435 - 19968: jis0208<<14 | 0x12<<7 | 0x1F, + 22436 - 19968: jis0208<<14 | 0x33<<7 | 0x18, + 22439 - 19968: jis0212<<14 | 0x16<<7 | 0x40, + 22440 - 19968: jis0212<<14 | 0x16<<7 | 0x41, + 22441 - 19968: jis0212<<14 | 0x16<<7 | 0x42, + 22442 - 19968: jis0208<<14 | 0x33<<7 | 0x19, + 22444 - 19968: jis0208<<14 | 0x58<<7 | 0x3B, + 22448 - 19968: jis0208<<14 | 0x33<<7 | 0x1A, + 22451 - 19968: jis0208<<14 | 0x33<<7 | 0x17, + 22456 - 19968: jis0212<<14 | 0x16<<7 | 0x44, + 22461 - 19968: jis0212<<14 | 0x16<<7 | 0x45, + 22464 - 19968: jis0208<<14 | 0x33<<7 | 0x10, + 22467 - 19968: jis0208<<14 | 0x33<<7 | 0x1B, + 22470 - 19968: jis0208<<14 | 0x33<<7 | 0x1C, + 22471 - 19968: jis0208<<14 | 0x58<<7 | 0x3D, + 22472 - 19968: jis0208<<14 | 0x58<<7 | 0x3C, + 22475 - 19968: jis0208<<14 | 0x2A<<7 | 0x43, + 22476 - 19968: jis0212<<14 | 0x16<<7 | 0x48, + 22478 - 19968: jis0208<<14 | 0x1D<<7 | 0x4A, + 22479 - 19968: jis0212<<14 | 0x16<<7 | 0x49, + 22482 - 19968: jis0208<<14 | 0x33<<7 | 0x1E, + 22483 - 19968: jis0208<<14 | 0x33<<7 | 0x1F, + 22484 - 19968: jis0208<<14 | 0x33<<7 | 0x1D, + 22485 - 19968: jis0212<<14 | 0x16<<7 | 0x4A, + 22486 - 19968: jis0208<<14 | 0x33<<7 | 0x21, + 22492 - 19968: jis0208<<14 | 0x26<<7 | 0x17, + 22493 - 19968: jis0212<<14 | 0x16<<7 | 0x4B, + 22494 - 19968: jis0212<<14 | 0x16<<7 | 0x4C, + 22495 - 19968: jis0208<<14 | 0x0F<<7 | 0x47, + 22496 - 19968: jis0208<<14 | 0x28<<7 | 0x35, + 22497 - 19968: jis0212<<14 | 0x16<<7 | 0x5D, + 22499 - 19968: jis0208<<14 | 0x33<<7 | 0x22, + 22500 - 19968: jis0212<<14 | 0x16<<7 | 0x4D, + 22502 - 19968: jis0212<<14 | 0x16<<7 | 0x4E, + 22503 - 19968: jis0212<<14 | 0x16<<7 | 0x4F, + 22505 - 19968: jis0212<<14 | 0x16<<7 | 0x50, + 22509 - 19968: jis0212<<14 | 0x16<<7 | 0x51, + 22512 - 19968: jis0212<<14 | 0x16<<7 | 0x52, + 22516 - 19968: jis0208<<14 | 0x1D<<7 | 0x5C, + 22517 - 19968: jis0212<<14 | 0x16<<7 | 0x53, + 22518 - 19968: jis0212<<14 | 0x16<<7 | 0x54, + 22519 - 19968: jis0208<<14 | 0x1B<<7 | 0x18, + 22520 - 19968: jis0212<<14 | 0x16<<7 | 0x55, + 22521 - 19968: jis0208<<14 | 0x26<<7 | 0x3C, + 22522 - 19968: jis0208<<14 | 0x13<<7 | 0x4F, + 22524 - 19968: jis0208<<14 | 0x19<<7 | 0x4A, + 22525 - 19968: jis0212<<14 | 0x16<<7 | 0x56, + 22526 - 19968: jis0212<<14 | 0x16<<7 | 0x57, + 22527 - 19968: jis0212<<14 | 0x16<<7 | 0x58, + 22528 - 19968: jis0208<<14 | 0x2A<<7 | 0x38, + 22530 - 19968: jis0208<<14 | 0x25<<7 | 0x11, + 22531 - 19968: jis0212<<14 | 0x16<<7 | 0x59, + 22532 - 19968: jis0212<<14 | 0x16<<7 | 0x5A, + 22533 - 19968: jis0208<<14 | 0x16<<7 | 0x57, + 22534 - 19968: jis0208<<14 | 0x21<<7 | 0x2E, + 22536 - 19968: jis0212<<14 | 0x16<<7 | 0x5B, + 22537 - 19968: jis0212<<14 | 0x16<<7 | 0x5C, + 22538 - 19968: jis0208<<14 | 0x33<<7 | 0x20, + 22539 - 19968: jis0208<<14 | 0x33<<7 | 0x23, + 22540 - 19968: jis0212<<14 | 0x17<<7 | 0x00, + 22541 - 19968: jis0212<<14 | 0x17<<7 | 0x01, + 22549 - 19968: jis0208<<14 | 0x21<<7 | 0x23, + 22553 - 19968: jis0208<<14 | 0x33<<7 | 0x24, + 22555 - 19968: jis0212<<14 | 0x17<<7 | 0x02, + 22557 - 19968: jis0208<<14 | 0x33<<7 | 0x25, + 22558 - 19968: jis0212<<14 | 0x17<<7 | 0x03, + 22559 - 19968: jis0212<<14 | 0x17<<7 | 0x04, + 22560 - 19968: jis0212<<14 | 0x17<<7 | 0x05, + 22561 - 19968: jis0208<<14 | 0x33<<7 | 0x27, + 22564 - 19968: jis0208<<14 | 0x23<<7 | 0x48, + 22566 - 19968: jis0212<<14 | 0x17<<7 | 0x06, + 22567 - 19968: jis0212<<14 | 0x17<<7 | 0x07, + 22570 - 19968: jis0208<<14 | 0x13<<7 | 0x0D, + 22573 - 19968: jis0212<<14 | 0x17<<7 | 0x08, + 22575 - 19968: jis0208<<14 | 0x53<<7 | 0x00, + 22576 - 19968: jis0208<<14 | 0x10<<7 | 0x40, + 22577 - 19968: jis0208<<14 | 0x29<<7 | 0x52, + 22578 - 19968: jis0212<<14 | 0x17<<7 | 0x09, + 22580 - 19968: jis0208<<14 | 0x1D<<7 | 0x4B, + 22581 - 19968: jis0208<<14 | 0x24<<7 | 0x27, + 22585 - 19968: jis0212<<14 | 0x17<<7 | 0x0A, + 22586 - 19968: jis0208<<14 | 0x19<<7 | 0x45, + 22589 - 19968: jis0208<<14 | 0x33<<7 | 0x2D, + 22591 - 19968: jis0212<<14 | 0x17<<7 | 0x0B, + 22592 - 19968: jis0208<<14 | 0x29<<7 | 0x1C, + 22593 - 19968: jis0208<<14 | 0x2D<<7 | 0x3C, + 22601 - 19968: jis0212<<14 | 0x17<<7 | 0x0C, + 22602 - 19968: jis0208<<14 | 0x11<<7 | 0x53, + 22603 - 19968: jis0208<<14 | 0x33<<7 | 0x29, + 22604 - 19968: jis0212<<14 | 0x17<<7 | 0x0D, + 22605 - 19968: jis0212<<14 | 0x17<<7 | 0x0E, + 22607 - 19968: jis0212<<14 | 0x17<<7 | 0x0F, + 22608 - 19968: jis0212<<14 | 0x17<<7 | 0x10, + 22609 - 19968: jis0208<<14 | 0x20<<7 | 0x19, + 22610 - 19968: jis0208<<14 | 0x33<<7 | 0x2C, + 22612 - 19968: jis0208<<14 | 0x24<<7 | 0x42, + 22613 - 19968: jis0212<<14 | 0x17<<7 | 0x11, + 22615 - 19968: jis0208<<14 | 0x24<<7 | 0x28, + 22616 - 19968: jis0208<<14 | 0x24<<7 | 0x43, + 22617 - 19968: jis0208<<14 | 0x27<<7 | 0x18, + 22618 - 19968: jis0208<<14 | 0x23<<7 | 0x2C, + 22622 - 19968: jis0208<<14 | 0x19<<7 | 0x28, + 22623 - 19968: jis0212<<14 | 0x17<<7 | 0x12, + 22625 - 19968: jis0212<<14 | 0x17<<7 | 0x13, + 22626 - 19968: jis0208<<14 | 0x33<<7 | 0x28, + 22628 - 19968: jis0212<<14 | 0x17<<7 | 0x14, + 22631 - 19968: jis0212<<14 | 0x17<<7 | 0x15, + 22632 - 19968: jis0212<<14 | 0x17<<7 | 0x16, + 22633 - 19968: jis0208<<14 | 0x10<<7 | 0x55, + 22635 - 19968: jis0208<<14 | 0x24<<7 | 0x15, + 22640 - 19968: jis0208<<14 | 0x33<<7 | 0x2A, + 22642 - 19968: jis0208<<14 | 0x33<<7 | 0x26, + 22645 - 19968: jis0208<<14 | 0x1E<<7 | 0x2F, + 22648 - 19968: jis0212<<14 | 0x17<<7 | 0x17, + 22649 - 19968: jis0208<<14 | 0x33<<7 | 0x2E, + 22652 - 19968: jis0212<<14 | 0x17<<7 | 0x18, + 22654 - 19968: jis0208<<14 | 0x1C<<7 | 0x2D, + 22655 - 19968: jis0212<<14 | 0x17<<7 | 0x19, + 22656 - 19968: jis0212<<14 | 0x17<<7 | 0x1A, + 22657 - 19968: jis0212<<14 | 0x17<<7 | 0x1B, + 22659 - 19968: jis0208<<14 | 0x15<<7 | 0x0C, + 22661 - 19968: jis0208<<14 | 0x33<<7 | 0x2F, + 22663 - 19968: jis0212<<14 | 0x17<<7 | 0x1C, + 22664 - 19968: jis0212<<14 | 0x17<<7 | 0x1D, + 22665 - 19968: jis0212<<14 | 0x17<<7 | 0x1E, + 22666 - 19968: jis0212<<14 | 0x17<<7 | 0x1F, + 22668 - 19968: jis0212<<14 | 0x17<<7 | 0x20, + 22669 - 19968: jis0212<<14 | 0x17<<7 | 0x21, + 22671 - 19968: jis0212<<14 | 0x17<<7 | 0x22, + 22672 - 19968: jis0212<<14 | 0x17<<7 | 0x23, + 22675 - 19968: jis0208<<14 | 0x29<<7 | 0x47, + 22676 - 19968: jis0212<<14 | 0x17<<7 | 0x24, + 22678 - 19968: jis0212<<14 | 0x17<<7 | 0x25, + 22679 - 19968: jis0208<<14 | 0x20<<7 | 0x5C, + 22684 - 19968: jis0208<<14 | 0x23<<7 | 0x25, + 22685 - 19968: jis0212<<14 | 0x17<<7 | 0x26, + 22686 - 19968: jis0208<<14 | 0x58<<7 | 0x40, + 22687 - 19968: jis0208<<14 | 0x33<<7 | 0x31, + 22688 - 19968: jis0212<<14 | 0x17<<7 | 0x27, + 22689 - 19968: jis0212<<14 | 0x17<<7 | 0x28, + 22690 - 19968: jis0212<<14 | 0x17<<7 | 0x29, + 22694 - 19968: jis0212<<14 | 0x17<<7 | 0x2A, + 22696 - 19968: jis0208<<14 | 0x2A<<7 | 0x2E, + 22697 - 19968: jis0212<<14 | 0x17<<7 | 0x2B, + 22699 - 19968: jis0208<<14 | 0x33<<7 | 0x32, + 22702 - 19968: jis0208<<14 | 0x33<<7 | 0x37, + 22705 - 19968: jis0212<<14 | 0x17<<7 | 0x2C, + 22706 - 19968: jis0208<<14 | 0x58<<7 | 0x41, + 22707 - 19968: jis0208<<14 | 0x29<<7 | 0x0E, + 22712 - 19968: jis0208<<14 | 0x33<<7 | 0x36, + 22713 - 19968: jis0208<<14 | 0x33<<7 | 0x30, + 22714 - 19968: jis0208<<14 | 0x33<<7 | 0x33, + 22715 - 19968: jis0208<<14 | 0x33<<7 | 0x35, + 22716 - 19968: jis0212<<14 | 0x17<<7 | 0x2F, + 22718 - 19968: jis0208<<14 | 0x19<<7 | 0x05, + 22721 - 19968: jis0208<<14 | 0x29<<7 | 0x28, + 22722 - 19968: jis0212<<14 | 0x17<<7 | 0x30, + 22724 - 19968: jis0212<<14 | 0x17<<7 | 0x2E, + 22725 - 19968: jis0208<<14 | 0x33<<7 | 0x38, + 22727 - 19968: jis0208<<14 | 0x22<<7 | 0x24, + 22728 - 19968: jis0212<<14 | 0x17<<7 | 0x31, + 22730 - 19968: jis0208<<14 | 0x11<<7 | 0x54, + 22732 - 19968: jis0208<<14 | 0x1D<<7 | 0x4C, + 22733 - 19968: jis0212<<14 | 0x17<<7 | 0x32, + 22734 - 19968: jis0212<<14 | 0x17<<7 | 0x33, + 22736 - 19968: jis0212<<14 | 0x17<<7 | 0x34, + 22737 - 19968: jis0208<<14 | 0x33<<7 | 0x3A, + 22738 - 19968: jis0212<<14 | 0x17<<7 | 0x35, + 22739 - 19968: jis0208<<14 | 0x33<<7 | 0x39, + 22740 - 19968: jis0212<<14 | 0x17<<7 | 0x36, + 22741 - 19968: jis0208<<14 | 0x18<<7 | 0x47, + 22742 - 19968: jis0212<<14 | 0x17<<7 | 0x37, + 22743 - 19968: jis0208<<14 | 0x33<<7 | 0x3B, + 22744 - 19968: jis0208<<14 | 0x33<<7 | 0x3D, + 22745 - 19968: jis0208<<14 | 0x33<<7 | 0x3C, + 22746 - 19968: jis0212<<14 | 0x17<<7 | 0x38, + 22748 - 19968: jis0208<<14 | 0x33<<7 | 0x3F, + 22749 - 19968: jis0212<<14 | 0x17<<7 | 0x39, + 22750 - 19968: jis0208<<14 | 0x33<<7 | 0x34, + 22751 - 19968: jis0208<<14 | 0x33<<7 | 0x41, + 22753 - 19968: jis0212<<14 | 0x17<<7 | 0x3A, + 22754 - 19968: jis0212<<14 | 0x17<<7 | 0x3B, + 22756 - 19968: jis0208<<14 | 0x33<<7 | 0x40, + 22757 - 19968: jis0208<<14 | 0x33<<7 | 0x3E, + 22761 - 19968: jis0212<<14 | 0x17<<7 | 0x3C, + 22763 - 19968: jis0208<<14 | 0x1A<<7 | 0x2D, + 22764 - 19968: jis0208<<14 | 0x1E<<7 | 0x30, + 22766 - 19968: jis0208<<14 | 0x20<<7 | 0x33, + 22767 - 19968: jis0208<<14 | 0x33<<7 | 0x42, + 22768 - 19968: jis0208<<14 | 0x1F<<7 | 0x1B, + 22769 - 19968: jis0208<<14 | 0x0F<<7 | 0x4C, + 22770 - 19968: jis0208<<14 | 0x26<<7 | 0x43, + 22771 - 19968: jis0212<<14 | 0x17<<7 | 0x3D, + 22775 - 19968: jis0208<<14 | 0x23<<7 | 0x3A, + 22777 - 19968: jis0208<<14 | 0x33<<7 | 0x44, + 22778 - 19968: jis0208<<14 | 0x33<<7 | 0x43, + 22779 - 19968: jis0208<<14 | 0x33<<7 | 0x45, + 22780 - 19968: jis0208<<14 | 0x33<<7 | 0x46, + 22781 - 19968: jis0208<<14 | 0x33<<7 | 0x47, + 22786 - 19968: jis0208<<14 | 0x33<<7 | 0x48, + 22789 - 19968: jis0212<<14 | 0x17<<7 | 0x3E, + 22790 - 19968: jis0212<<14 | 0x17<<7 | 0x3F, + 22793 - 19968: jis0208<<14 | 0x29<<7 | 0x30, + 22794 - 19968: jis0208<<14 | 0x33<<7 | 0x49, + 22795 - 19968: jis0208<<14 | 0x58<<7 | 0x42, + 22796 - 19968: jis0212<<14 | 0x17<<7 | 0x41, + 22799 - 19968: jis0208<<14 | 0x11<<7 | 0x25, + 22800 - 19968: jis0208<<14 | 0x33<<7 | 0x4A, + 22802 - 19968: jis0212<<14 | 0x17<<7 | 0x42, + 22803 - 19968: jis0212<<14 | 0x17<<7 | 0x43, + 22804 - 19968: jis0212<<14 | 0x17<<7 | 0x44, + 22805 - 19968: jis0208<<14 | 0x2C<<7 | 0x1B, + 22806 - 19968: jis0208<<14 | 0x12<<7 | 0x0F, + 22808 - 19968: jis0208<<14 | 0x31<<7 | 0x28, + 22809 - 19968: jis0208<<14 | 0x1C<<7 | 0x27, + 22810 - 19968: jis0208<<14 | 0x21<<7 | 0x1E, + 22811 - 19968: jis0208<<14 | 0x33<<7 | 0x4B, + 22812 - 19968: jis0208<<14 | 0x2B<<7 | 0x4A, + 22813 - 19968: jis0212<<14 | 0x17<<7 | 0x46, + 22817 - 19968: jis0212<<14 | 0x17<<7 | 0x47, + 22818 - 19968: jis0208<<14 | 0x2B<<7 | 0x13, + 22819 - 19968: jis0212<<14 | 0x17<<7 | 0x48, + 22820 - 19968: jis0212<<14 | 0x17<<7 | 0x49, + 22821 - 19968: jis0208<<14 | 0x33<<7 | 0x4D, + 22823 - 19968: jis0208<<14 | 0x21<<7 | 0x46, + 22824 - 19968: jis0212<<14 | 0x17<<7 | 0x4A, + 22825 - 19968: jis0208<<14 | 0x24<<7 | 0x16, + 22826 - 19968: jis0208<<14 | 0x21<<7 | 0x1F, + 22827 - 19968: jis0208<<14 | 0x28<<7 | 0x36, + 22828 - 19968: jis0208<<14 | 0x33<<7 | 0x4E, + 22829 - 19968: jis0208<<14 | 0x33<<7 | 0x4F, + 22830 - 19968: jis0208<<14 | 0x10<<7 | 0x5A, + 22831 - 19968: jis0212<<14 | 0x17<<7 | 0x4B, + 22832 - 19968: jis0212<<14 | 0x17<<7 | 0x4C, + 22833 - 19968: jis0208<<14 | 0x1B<<7 | 0x19, + 22834 - 19968: jis0208<<14 | 0x33<<7 | 0x50, + 22835 - 19968: jis0212<<14 | 0x17<<7 | 0x4D, + 22837 - 19968: jis0212<<14 | 0x17<<7 | 0x4E, + 22838 - 19968: jis0212<<14 | 0x17<<7 | 0x4F, + 22839 - 19968: jis0208<<14 | 0x0F<<7 | 0x2F, + 22840 - 19968: jis0208<<14 | 0x33<<7 | 0x51, + 22846 - 19968: jis0208<<14 | 0x33<<7 | 0x52, + 22847 - 19968: jis0212<<14 | 0x17<<7 | 0x50, + 22851 - 19968: jis0212<<14 | 0x17<<7 | 0x51, + 22852 - 19968: jis0208<<14 | 0x10<<7 | 0x41, + 22854 - 19968: jis0212<<14 | 0x17<<7 | 0x52, + 22855 - 19968: jis0208<<14 | 0x13<<7 | 0x50, + 22856 - 19968: jis0208<<14 | 0x25<<7 | 0x3F, + 22857 - 19968: jis0208<<14 | 0x29<<7 | 0x53, + 22862 - 19968: jis0208<<14 | 0x33<<7 | 0x56, + 22863 - 19968: jis0208<<14 | 0x20<<7 | 0x34, + 22864 - 19968: jis0208<<14 | 0x33<<7 | 0x55, + 22865 - 19968: jis0208<<14 | 0x16<<7 | 0x1F, + 22866 - 19968: jis0212<<14 | 0x17<<7 | 0x53, + 22867 - 19968: jis0208<<14 | 0x58<<7 | 0x43, + 22868 - 19968: jis0208<<14 | 0x2A<<7 | 0x3A, + 22869 - 19968: jis0208<<14 | 0x33<<7 | 0x54, + 22871 - 19968: jis0208<<14 | 0x24<<7 | 0x44, + 22872 - 19968: jis0208<<14 | 0x33<<7 | 0x58, + 22873 - 19968: jis0212<<14 | 0x17<<7 | 0x55, + 22874 - 19968: jis0208<<14 | 0x33<<7 | 0x57, + 22875 - 19968: jis0208<<14 | 0x58<<7 | 0x44, + 22877 - 19968: jis0208<<14 | 0x58<<7 | 0x45, + 22878 - 19968: jis0212<<14 | 0x17<<7 | 0x58, + 22879 - 19968: jis0212<<14 | 0x17<<7 | 0x59, + 22880 - 19968: jis0208<<14 | 0x33<<7 | 0x5A, + 22881 - 19968: jis0212<<14 | 0x17<<7 | 0x5A, + 22882 - 19968: jis0208<<14 | 0x33<<7 | 0x59, + 22883 - 19968: jis0208<<14 | 0x58<<7 | 0x46, + 22885 - 19968: jis0208<<14 | 0x10<<7 | 0x5B, + 22887 - 19968: jis0208<<14 | 0x33<<7 | 0x5B, + 22888 - 19968: jis0208<<14 | 0x1D<<7 | 0x08, + 22889 - 19968: jis0208<<14 | 0x33<<7 | 0x5D, + 22890 - 19968: jis0208<<14 | 0x22<<7 | 0x04, + 22891 - 19968: jis0212<<14 | 0x17<<7 | 0x5C, + 22892 - 19968: jis0208<<14 | 0x33<<7 | 0x5C, + 22893 - 19968: jis0212<<14 | 0x17<<7 | 0x5D, + 22894 - 19968: jis0208<<14 | 0x29<<7 | 0x12, + 22895 - 19968: jis0212<<14 | 0x18<<7 | 0x00, + 22898 - 19968: jis0212<<14 | 0x18<<7 | 0x01, + 22899 - 19968: jis0208<<14 | 0x1C<<7 | 0x56, + 22900 - 19968: jis0208<<14 | 0x24<<7 | 0x3A, + 22901 - 19968: jis0212<<14 | 0x18<<7 | 0x02, + 22902 - 19968: jis0212<<14 | 0x18<<7 | 0x03, + 22904 - 19968: jis0208<<14 | 0x34<<7 | 0x00, + 22905 - 19968: jis0212<<14 | 0x18<<7 | 0x04, + 22907 - 19968: jis0212<<14 | 0x18<<7 | 0x05, + 22908 - 19968: jis0212<<14 | 0x18<<7 | 0x06, + 22909 - 19968: jis0208<<14 | 0x18<<7 | 0x04, + 22913 - 19968: jis0208<<14 | 0x34<<7 | 0x01, + 22914 - 19968: jis0208<<14 | 0x26<<7 | 0x00, + 22915 - 19968: jis0208<<14 | 0x27<<7 | 0x3D, + 22916 - 19968: jis0208<<14 | 0x2B<<7 | 0x30, + 22922 - 19968: jis0208<<14 | 0x26<<7 | 0x04, + 22923 - 19968: jis0212<<14 | 0x18<<7 | 0x07, + 22924 - 19968: jis0212<<14 | 0x18<<7 | 0x08, + 22925 - 19968: jis0208<<14 | 0x34<<7 | 0x0A, + 22926 - 19968: jis0212<<14 | 0x18<<7 | 0x09, + 22930 - 19968: jis0212<<14 | 0x18<<7 | 0x0A, + 22931 - 19968: jis0208<<14 | 0x14<<7 | 0x17, + 22933 - 19968: jis0212<<14 | 0x18<<7 | 0x0B, + 22934 - 19968: jis0208<<14 | 0x2C<<7 | 0x24, + 22935 - 19968: jis0212<<14 | 0x18<<7 | 0x0C, + 22937 - 19968: jis0208<<14 | 0x2B<<7 | 0x0E, + 22939 - 19968: jis0208<<14 | 0x35<<7 | 0x0B, + 22941 - 19968: jis0208<<14 | 0x34<<7 | 0x02, + 22943 - 19968: jis0212<<14 | 0x18<<7 | 0x0D, + 22947 - 19968: jis0208<<14 | 0x34<<7 | 0x05, + 22948 - 19968: jis0208<<14 | 0x58<<7 | 0x47, + 22949 - 19968: jis0208<<14 | 0x21<<7 | 0x24, + 22951 - 19968: jis0212<<14 | 0x18<<7 | 0x0F, + 22952 - 19968: jis0208<<14 | 0x2A<<7 | 0x17, + 22956 - 19968: jis0208<<14 | 0x24<<7 | 0x29, + 22957 - 19968: jis0212<<14 | 0x18<<7 | 0x10, + 22958 - 19968: jis0212<<14 | 0x18<<7 | 0x11, + 22959 - 19968: jis0212<<14 | 0x18<<7 | 0x12, + 22960 - 19968: jis0212<<14 | 0x18<<7 | 0x13, + 22962 - 19968: jis0208<<14 | 0x34<<7 | 0x06, + 22963 - 19968: jis0212<<14 | 0x18<<7 | 0x14, + 22967 - 19968: jis0212<<14 | 0x18<<7 | 0x15, + 22969 - 19968: jis0208<<14 | 0x2A<<7 | 0x44, + 22970 - 19968: jis0208<<14 | 0x58<<7 | 0x48, + 22971 - 19968: jis0208<<14 | 0x19<<7 | 0x29, + 22972 - 19968: jis0212<<14 | 0x18<<7 | 0x17, + 22974 - 19968: jis0208<<14 | 0x1D<<7 | 0x09, + 22977 - 19968: jis0212<<14 | 0x18<<7 | 0x18, + 22979 - 19968: jis0212<<14 | 0x18<<7 | 0x19, + 22980 - 19968: jis0212<<14 | 0x18<<7 | 0x1A, + 22982 - 19968: jis0208<<14 | 0x34<<7 | 0x07, + 22984 - 19968: jis0212<<14 | 0x18<<7 | 0x1B, + 22985 - 19968: jis0208<<14 | 0x1A<<7 | 0x2F, + 22986 - 19968: jis0212<<14 | 0x18<<7 | 0x1C, + 22987 - 19968: jis0208<<14 | 0x1A<<7 | 0x2E, + 22989 - 19968: jis0212<<14 | 0x18<<7 | 0x1D, + 22992 - 19968: jis0208<<14 | 0x0F<<7 | 0x18, + 22993 - 19968: jis0208<<14 | 0x17<<7 | 0x27, + 22994 - 19968: jis0212<<14 | 0x18<<7 | 0x1E, + 22995 - 19968: jis0208<<14 | 0x1F<<7 | 0x0A, + 22996 - 19968: jis0208<<14 | 0x0F<<7 | 0x30, + 23001 - 19968: jis0208<<14 | 0x34<<7 | 0x0B, + 23002 - 19968: jis0208<<14 | 0x34<<7 | 0x0C, + 23004 - 19968: jis0208<<14 | 0x34<<7 | 0x09, + 23005 - 19968: jis0212<<14 | 0x18<<7 | 0x1F, + 23006 - 19968: jis0212<<14 | 0x18<<7 | 0x20, + 23007 - 19968: jis0212<<14 | 0x18<<7 | 0x21, + 23011 - 19968: jis0212<<14 | 0x18<<7 | 0x22, + 23012 - 19968: jis0212<<14 | 0x18<<7 | 0x23, + 23013 - 19968: jis0208<<14 | 0x10<<7 | 0x17, + 23014 - 19968: jis0208<<14 | 0x13<<7 | 0x0E, + 23015 - 19968: jis0212<<14 | 0x18<<7 | 0x24, + 23016 - 19968: jis0208<<14 | 0x34<<7 | 0x08, + 23018 - 19968: jis0208<<14 | 0x2B<<7 | 0x24, + 23019 - 19968: jis0208<<14 | 0x28<<7 | 0x10, + 23022 - 19968: jis0212<<14 | 0x18<<7 | 0x25, + 23023 - 19968: jis0212<<14 | 0x18<<7 | 0x26, + 23025 - 19968: jis0212<<14 | 0x18<<7 | 0x27, + 23026 - 19968: jis0212<<14 | 0x18<<7 | 0x28, + 23028 - 19968: jis0212<<14 | 0x18<<7 | 0x29, + 23030 - 19968: jis0208<<14 | 0x0F<<7 | 0x07, + 23031 - 19968: jis0212<<14 | 0x18<<7 | 0x2A, + 23035 - 19968: jis0208<<14 | 0x0F<<7 | 0x58, + 23039 - 19968: jis0208<<14 | 0x1A<<7 | 0x30, + 23040 - 19968: jis0212<<14 | 0x18<<7 | 0x2B, + 23041 - 19968: jis0208<<14 | 0x0F<<7 | 0x31, + 23043 - 19968: jis0208<<14 | 0x0F<<7 | 0x02, + 23044 - 19968: jis0212<<14 | 0x18<<7 | 0x2C, + 23049 - 19968: jis0208<<14 | 0x34<<7 | 0x11, + 23052 - 19968: jis0212<<14 | 0x18<<7 | 0x2D, + 23053 - 19968: jis0212<<14 | 0x18<<7 | 0x2E, + 23054 - 19968: jis0212<<14 | 0x18<<7 | 0x2F, + 23057 - 19968: jis0208<<14 | 0x34<<7 | 0x0F, + 23058 - 19968: jis0212<<14 | 0x18<<7 | 0x30, + 23059 - 19968: jis0212<<14 | 0x18<<7 | 0x31, + 23064 - 19968: jis0208<<14 | 0x2B<<7 | 0x1B, + 23066 - 19968: jis0208<<14 | 0x34<<7 | 0x12, + 23068 - 19968: jis0208<<14 | 0x34<<7 | 0x10, + 23070 - 19968: jis0212<<14 | 0x18<<7 | 0x32, + 23071 - 19968: jis0208<<14 | 0x34<<7 | 0x0E, + 23072 - 19968: jis0208<<14 | 0x1E<<7 | 0x10, + 23075 - 19968: jis0212<<14 | 0x18<<7 | 0x33, + 23076 - 19968: jis0212<<14 | 0x18<<7 | 0x34, + 23077 - 19968: jis0208<<14 | 0x34<<7 | 0x0D, + 23079 - 19968: jis0212<<14 | 0x18<<7 | 0x35, + 23080 - 19968: jis0212<<14 | 0x18<<7 | 0x36, + 23081 - 19968: jis0208<<14 | 0x29<<7 | 0x39, + 23082 - 19968: jis0212<<14 | 0x18<<7 | 0x37, + 23085 - 19968: jis0212<<14 | 0x18<<7 | 0x38, + 23087 - 19968: jis0208<<14 | 0x17<<7 | 0x43, + 23088 - 19968: jis0212<<14 | 0x18<<7 | 0x39, + 23093 - 19968: jis0208<<14 | 0x34<<7 | 0x16, + 23094 - 19968: jis0208<<14 | 0x34<<7 | 0x17, + 23100 - 19968: jis0208<<14 | 0x1D<<7 | 0x0A, + 23104 - 19968: jis0208<<14 | 0x34<<7 | 0x13, + 23105 - 19968: jis0208<<14 | 0x2E<<7 | 0x0B, + 23108 - 19968: jis0212<<14 | 0x18<<7 | 0x3A, + 23109 - 19968: jis0212<<14 | 0x18<<7 | 0x3B, + 23110 - 19968: jis0208<<14 | 0x26<<7 | 0x2B, + 23111 - 19968: jis0212<<14 | 0x18<<7 | 0x3C, + 23112 - 19968: jis0212<<14 | 0x18<<7 | 0x3D, + 23113 - 19968: jis0208<<14 | 0x34<<7 | 0x15, + 23116 - 19968: jis0212<<14 | 0x18<<7 | 0x3E, + 23120 - 19968: jis0212<<14 | 0x18<<7 | 0x3F, + 23125 - 19968: jis0212<<14 | 0x18<<7 | 0x40, + 23130 - 19968: jis0208<<14 | 0x19<<7 | 0x06, + 23134 - 19968: jis0212<<14 | 0x18<<7 | 0x41, + 23138 - 19968: jis0208<<14 | 0x34<<7 | 0x18, + 23139 - 19968: jis0212<<14 | 0x18<<7 | 0x42, + 23141 - 19968: jis0212<<14 | 0x18<<7 | 0x43, + 23142 - 19968: jis0208<<14 | 0x28<<7 | 0x37, + 23143 - 19968: jis0212<<14 | 0x18<<7 | 0x44, + 23146 - 19968: jis0208<<14 | 0x34<<7 | 0x19, + 23148 - 19968: jis0208<<14 | 0x34<<7 | 0x14, + 23149 - 19968: jis0212<<14 | 0x18<<7 | 0x45, + 23159 - 19968: jis0212<<14 | 0x18<<7 | 0x46, + 23162 - 19968: jis0212<<14 | 0x18<<7 | 0x47, + 23163 - 19968: jis0212<<14 | 0x18<<7 | 0x48, + 23166 - 19968: jis0212<<14 | 0x18<<7 | 0x49, + 23167 - 19968: jis0208<<14 | 0x2B<<7 | 0x1A, + 23179 - 19968: jis0212<<14 | 0x18<<7 | 0x4A, + 23184 - 19968: jis0212<<14 | 0x18<<7 | 0x4B, + 23186 - 19968: jis0208<<14 | 0x26<<7 | 0x3D, + 23187 - 19968: jis0212<<14 | 0x18<<7 | 0x4C, + 23190 - 19968: jis0212<<14 | 0x18<<7 | 0x4D, + 23193 - 19968: jis0212<<14 | 0x18<<7 | 0x4E, + 23194 - 19968: jis0208<<14 | 0x34<<7 | 0x1A, + 23195 - 19968: jis0208<<14 | 0x28<<7 | 0x11, + 23196 - 19968: jis0212<<14 | 0x18<<7 | 0x4F, + 23198 - 19968: jis0212<<14 | 0x18<<7 | 0x50, + 23199 - 19968: jis0212<<14 | 0x18<<7 | 0x51, + 23200 - 19968: jis0212<<14 | 0x18<<7 | 0x52, + 23202 - 19968: jis0212<<14 | 0x18<<7 | 0x53, + 23207 - 19968: jis0212<<14 | 0x18<<7 | 0x54, + 23212 - 19968: jis0212<<14 | 0x18<<7 | 0x55, + 23217 - 19968: jis0212<<14 | 0x18<<7 | 0x56, + 23218 - 19968: jis0212<<14 | 0x18<<7 | 0x57, + 23219 - 19968: jis0212<<14 | 0x18<<7 | 0x58, + 23221 - 19968: jis0212<<14 | 0x18<<7 | 0x59, + 23224 - 19968: jis0212<<14 | 0x18<<7 | 0x5A, + 23226 - 19968: jis0212<<14 | 0x18<<7 | 0x5B, + 23227 - 19968: jis0212<<14 | 0x18<<7 | 0x5C, + 23228 - 19968: jis0208<<14 | 0x34<<7 | 0x1B, + 23229 - 19968: jis0208<<14 | 0x34<<7 | 0x1F, + 23230 - 19968: jis0208<<14 | 0x34<<7 | 0x1C, + 23231 - 19968: jis0212<<14 | 0x18<<7 | 0x5D, + 23233 - 19968: jis0208<<14 | 0x11<<7 | 0x26, + 23234 - 19968: jis0208<<14 | 0x34<<7 | 0x1E, + 23236 - 19968: jis0212<<14 | 0x19<<7 | 0x00, + 23238 - 19968: jis0212<<14 | 0x19<<7 | 0x01, + 23240 - 19968: jis0212<<14 | 0x19<<7 | 0x02, + 23241 - 19968: jis0208<<14 | 0x1B<<7 | 0x1A, + 23243 - 19968: jis0208<<14 | 0x34<<7 | 0x1D, + 23244 - 19968: jis0208<<14 | 0x16<<7 | 0x58, + 23247 - 19968: jis0212<<14 | 0x19<<7 | 0x03, + 23248 - 19968: jis0208<<14 | 0x34<<7 | 0x2B, + 23254 - 19968: jis0208<<14 | 0x34<<7 | 0x24, + 23255 - 19968: jis0208<<14 | 0x34<<7 | 0x21, + 23258 - 19968: jis0212<<14 | 0x19<<7 | 0x04, + 23260 - 19968: jis0212<<14 | 0x19<<7 | 0x05, + 23264 - 19968: jis0212<<14 | 0x19<<7 | 0x06, + 23265 - 19968: jis0208<<14 | 0x22<<7 | 0x43, + 23267 - 19968: jis0208<<14 | 0x34<<7 | 0x20, + 23269 - 19968: jis0212<<14 | 0x19<<7 | 0x07, + 23270 - 19968: jis0208<<14 | 0x34<<7 | 0x22, + 23273 - 19968: jis0208<<14 | 0x34<<7 | 0x23, + 23274 - 19968: jis0212<<14 | 0x19<<7 | 0x08, + 23278 - 19968: jis0212<<14 | 0x19<<7 | 0x09, + 23285 - 19968: jis0212<<14 | 0x19<<7 | 0x0A, + 23286 - 19968: jis0212<<14 | 0x19<<7 | 0x0B, + 23290 - 19968: jis0208<<14 | 0x34<<7 | 0x25, + 23291 - 19968: jis0208<<14 | 0x34<<7 | 0x26, + 23293 - 19968: jis0212<<14 | 0x19<<7 | 0x0C, + 23296 - 19968: jis0212<<14 | 0x19<<7 | 0x0D, + 23297 - 19968: jis0212<<14 | 0x19<<7 | 0x0E, + 23304 - 19968: jis0212<<14 | 0x19<<7 | 0x0F, + 23305 - 19968: jis0208<<14 | 0x13<<7 | 0x51, + 23307 - 19968: jis0208<<14 | 0x34<<7 | 0x28, + 23308 - 19968: jis0208<<14 | 0x34<<7 | 0x27, + 23318 - 19968: jis0208<<14 | 0x34<<7 | 0x29, + 23319 - 19968: jis0212<<14 | 0x19<<7 | 0x10, + 23321 - 19968: jis0212<<14 | 0x19<<7 | 0x12, + 23323 - 19968: jis0212<<14 | 0x19<<7 | 0x13, + 23325 - 19968: jis0212<<14 | 0x19<<7 | 0x14, + 23329 - 19968: jis0212<<14 | 0x19<<7 | 0x15, + 23330 - 19968: jis0208<<14 | 0x1D<<7 | 0x4D, + 23333 - 19968: jis0212<<14 | 0x19<<7 | 0x16, + 23338 - 19968: jis0208<<14 | 0x34<<7 | 0x2C, + 23340 - 19968: jis0208<<14 | 0x23<<7 | 0x3B, + 23341 - 19968: jis0212<<14 | 0x19<<7 | 0x17, + 23344 - 19968: jis0208<<14 | 0x10<<7 | 0x24, + 23346 - 19968: jis0208<<14 | 0x34<<7 | 0x2A, + 23348 - 19968: jis0212<<14 | 0x19<<7 | 0x11, + 23350 - 19968: jis0208<<14 | 0x34<<7 | 0x2D, + 23352 - 19968: jis0212<<14 | 0x19<<7 | 0x18, + 23358 - 19968: jis0208<<14 | 0x34<<7 | 0x2E, + 23360 - 19968: jis0208<<14 | 0x34<<7 | 0x31, + 23361 - 19968: jis0212<<14 | 0x19<<7 | 0x19, + 23363 - 19968: jis0208<<14 | 0x34<<7 | 0x2F, + 23365 - 19968: jis0208<<14 | 0x34<<7 | 0x30, + 23371 - 19968: jis0212<<14 | 0x19<<7 | 0x1A, + 23372 - 19968: jis0212<<14 | 0x19<<7 | 0x1B, + 23376 - 19968: jis0208<<14 | 0x1A<<7 | 0x31, + 23377 - 19968: jis0208<<14 | 0x34<<7 | 0x32, + 23378 - 19968: jis0212<<14 | 0x19<<7 | 0x1C, + 23380 - 19968: jis0208<<14 | 0x18<<7 | 0x05, + 23381 - 19968: jis0208<<14 | 0x34<<7 | 0x33, + 23382 - 19968: jis0208<<14 | 0x58<<7 | 0x49, + 23383 - 19968: jis0208<<14 | 0x1A<<7 | 0x59, + 23384 - 19968: jis0208<<14 | 0x21<<7 | 0x17, + 23386 - 19968: jis0208<<14 | 0x34<<7 | 0x34, + 23387 - 19968: jis0208<<14 | 0x34<<7 | 0x35, + 23388 - 19968: jis0208<<14 | 0x1A<<7 | 0x39, + 23389 - 19968: jis0208<<14 | 0x18<<7 | 0x06, + 23390 - 19968: jis0212<<14 | 0x19<<7 | 0x1E, + 23391 - 19968: jis0208<<14 | 0x2B<<7 | 0x31, + 23395 - 19968: jis0208<<14 | 0x14<<7 | 0x07, + 23396 - 19968: jis0208<<14 | 0x17<<7 | 0x28, + 23397 - 19968: jis0208<<14 | 0x34<<7 | 0x36, + 23398 - 19968: jis0208<<14 | 0x12<<7 | 0x37, + 23400 - 19968: jis0212<<14 | 0x19<<7 | 0x1F, + 23401 - 19968: jis0208<<14 | 0x34<<7 | 0x37, + 23403 - 19968: jis0208<<14 | 0x21<<7 | 0x18, + 23406 - 19968: jis0212<<14 | 0x19<<7 | 0x20, + 23407 - 19968: jis0212<<14 | 0x19<<7 | 0x21, + 23408 - 19968: jis0208<<14 | 0x34<<7 | 0x38, + 23409 - 19968: jis0208<<14 | 0x35<<7 | 0x02, + 23411 - 19968: jis0208<<14 | 0x34<<7 | 0x39, + 23413 - 19968: jis0208<<14 | 0x34<<7 | 0x3A, + 23416 - 19968: jis0208<<14 | 0x34<<7 | 0x3B, + 23418 - 19968: jis0208<<14 | 0x34<<7 | 0x3D, + 23420 - 19968: jis0212<<14 | 0x19<<7 | 0x22, + 23421 - 19968: jis0212<<14 | 0x19<<7 | 0x23, + 23422 - 19968: jis0212<<14 | 0x19<<7 | 0x24, + 23423 - 19968: jis0212<<14 | 0x19<<7 | 0x25, + 23424 - 19968: jis0208<<14 | 0x34<<7 | 0x3E, + 23425 - 19968: jis0212<<14 | 0x19<<7 | 0x26, + 23427 - 19968: jis0208<<14 | 0x34<<7 | 0x3F, + 23428 - 19968: jis0212<<14 | 0x19<<7 | 0x27, + 23429 - 19968: jis0208<<14 | 0x21<<7 | 0x4F, + 23430 - 19968: jis0212<<14 | 0x19<<7 | 0x28, + 23431 - 19968: jis0208<<14 | 0x10<<7 | 0x06, + 23432 - 19968: jis0208<<14 | 0x1B<<7 | 0x48, + 23433 - 19968: jis0208<<14 | 0x0F<<7 | 0x21, + 23434 - 19968: jis0212<<14 | 0x19<<7 | 0x29, + 23435 - 19968: jis0208<<14 | 0x20<<7 | 0x36, + 23436 - 19968: jis0208<<14 | 0x13<<7 | 0x0F, + 23437 - 19968: jis0208<<14 | 0x1B<<7 | 0x14, + 23438 - 19968: jis0212<<14 | 0x19<<7 | 0x2A, + 23439 - 19968: jis0208<<14 | 0x18<<7 | 0x07, + 23440 - 19968: jis0212<<14 | 0x19<<7 | 0x2B, + 23441 - 19968: jis0212<<14 | 0x19<<7 | 0x2C, + 23443 - 19968: jis0212<<14 | 0x19<<7 | 0x2D, + 23444 - 19968: jis0212<<14 | 0x19<<7 | 0x2E, + 23445 - 19968: jis0208<<14 | 0x24<<7 | 0x45, + 23446 - 19968: jis0212<<14 | 0x19<<7 | 0x2F, + 23447 - 19968: jis0208<<14 | 0x1C<<7 | 0x00, + 23448 - 19968: jis0208<<14 | 0x13<<7 | 0x10, + 23449 - 19968: jis0208<<14 | 0x22<<7 | 0x47, + 23450 - 19968: jis0208<<14 | 0x23<<7 | 0x49, + 23451 - 19968: jis0208<<14 | 0x0F<<7 | 0x17, + 23452 - 19968: jis0208<<14 | 0x14<<7 | 0x18, + 23453 - 19968: jis0208<<14 | 0x29<<7 | 0x54, + 23455 - 19968: jis0208<<14 | 0x1B<<7 | 0x21, + 23458 - 19968: jis0208<<14 | 0x14<<7 | 0x31, + 23459 - 19968: jis0208<<14 | 0x1F<<7 | 0x4A, + 23460 - 19968: jis0208<<14 | 0x1B<<7 | 0x1B, + 23461 - 19968: jis0208<<14 | 0x2C<<7 | 0x07, + 23462 - 19968: jis0208<<14 | 0x34<<7 | 0x40, + 23464 - 19968: jis0212<<14 | 0x19<<7 | 0x30, + 23465 - 19968: jis0212<<14 | 0x19<<7 | 0x31, + 23468 - 19968: jis0212<<14 | 0x19<<7 | 0x32, + 23469 - 19968: jis0212<<14 | 0x19<<7 | 0x33, + 23470 - 19968: jis0208<<14 | 0x14<<7 | 0x3B, + 23471 - 19968: jis0212<<14 | 0x19<<7 | 0x34, + 23472 - 19968: jis0208<<14 | 0x19<<7 | 0x2A, + 23473 - 19968: jis0212<<14 | 0x19<<7 | 0x35, + 23474 - 19968: jis0212<<14 | 0x19<<7 | 0x36, + 23475 - 19968: jis0208<<14 | 0x12<<7 | 0x11, + 23476 - 19968: jis0208<<14 | 0x10<<7 | 0x42, + 23477 - 19968: jis0208<<14 | 0x1D<<7 | 0x0B, + 23478 - 19968: jis0208<<14 | 0x11<<7 | 0x27, + 23479 - 19968: jis0212<<14 | 0x19<<7 | 0x37, + 23480 - 19968: jis0208<<14 | 0x34<<7 | 0x41, + 23481 - 19968: jis0208<<14 | 0x2C<<7 | 0x25, + 23482 - 19968: jis0212<<14 | 0x19<<7 | 0x38, + 23484 - 19968: jis0212<<14 | 0x19<<7 | 0x39, + 23487 - 19968: jis0208<<14 | 0x1C<<7 | 0x28, + 23488 - 19968: jis0208<<14 | 0x58<<7 | 0x4A, + 23489 - 19968: jis0212<<14 | 0x19<<7 | 0x3B, + 23490 - 19968: jis0208<<14 | 0x1B<<7 | 0x43, + 23491 - 19968: jis0208<<14 | 0x34<<7 | 0x42, + 23492 - 19968: jis0208<<14 | 0x13<<7 | 0x52, + 23493 - 19968: jis0208<<14 | 0x25<<7 | 0x31, + 23494 - 19968: jis0208<<14 | 0x2B<<7 | 0x08, + 23495 - 19968: jis0208<<14 | 0x34<<7 | 0x43, + 23497 - 19968: jis0208<<14 | 0x34<<7 | 0x44, + 23500 - 19968: jis0208<<14 | 0x28<<7 | 0x38, + 23501 - 19968: jis0212<<14 | 0x19<<7 | 0x3C, + 23503 - 19968: jis0212<<14 | 0x19<<7 | 0x3D, + 23504 - 19968: jis0208<<14 | 0x34<<7 | 0x46, + 23506 - 19968: jis0208<<14 | 0x13<<7 | 0x07, + 23507 - 19968: jis0208<<14 | 0x15<<7 | 0x56, + 23508 - 19968: jis0208<<14 | 0x34<<7 | 0x45, + 23510 - 19968: jis0212<<14 | 0x19<<7 | 0x3E, + 23511 - 19968: jis0212<<14 | 0x19<<7 | 0x3F, + 23512 - 19968: jis0208<<14 | 0x58<<7 | 0x4C, + 23513 - 19968: jis0212<<14 | 0x19<<7 | 0x41, + 23514 - 19968: jis0212<<14 | 0x19<<7 | 0x42, + 23515 - 19968: jis0208<<14 | 0x13<<7 | 0x11, + 23517 - 19968: jis0208<<14 | 0x1E<<7 | 0x11, + 23518 - 19968: jis0208<<14 | 0x34<<7 | 0x4A, + 23519 - 19968: jis0208<<14 | 0x1A<<7 | 0x00, + 23520 - 19968: jis0212<<14 | 0x19<<7 | 0x43, + 23521 - 19968: jis0208<<14 | 0x11<<7 | 0x28, + 23522 - 19968: jis0208<<14 | 0x34<<7 | 0x49, + 23524 - 19968: jis0208<<14 | 0x34<<7 | 0x47, + 23525 - 19968: jis0208<<14 | 0x34<<7 | 0x4B, + 23526 - 19968: jis0208<<14 | 0x34<<7 | 0x48, + 23527 - 19968: jis0208<<14 | 0x26<<7 | 0x0A, + 23528 - 19968: jis0208<<14 | 0x3B<<7 | 0x2C, + 23529 - 19968: jis0208<<14 | 0x1E<<7 | 0x12, + 23531 - 19968: jis0208<<14 | 0x34<<7 | 0x4C, + 23532 - 19968: jis0208<<14 | 0x58<<7 | 0x4D, + 23534 - 19968: jis0208<<14 | 0x2D<<7 | 0x1F, + 23535 - 19968: jis0212<<14 | 0x19<<7 | 0x44, + 23536 - 19968: jis0208<<14 | 0x34<<7 | 0x4D, + 23537 - 19968: jis0212<<14 | 0x19<<7 | 0x45, + 23539 - 19968: jis0208<<14 | 0x34<<7 | 0x4F, + 23540 - 19968: jis0212<<14 | 0x19<<7 | 0x46, + 23541 - 19968: jis0208<<14 | 0x22<<7 | 0x5D, + 23542 - 19968: jis0208<<14 | 0x34<<7 | 0x4E, + 23544 - 19968: jis0208<<14 | 0x1F<<7 | 0x02, + 23546 - 19968: jis0208<<14 | 0x1A<<7 | 0x5A, + 23549 - 19968: jis0212<<14 | 0x19<<7 | 0x47, + 23550 - 19968: jis0208<<14 | 0x21<<7 | 0x2F, + 23551 - 19968: jis0208<<14 | 0x1B<<7 | 0x56, + 23553 - 19968: jis0208<<14 | 0x28<<7 | 0x54, + 23554 - 19968: jis0208<<14 | 0x1F<<7 | 0x4B, + 23556 - 19968: jis0208<<14 | 0x1B<<7 | 0x2C, + 23557 - 19968: jis0208<<14 | 0x34<<7 | 0x50, + 23558 - 19968: jis0208<<14 | 0x1D<<7 | 0x0C, + 23559 - 19968: jis0208<<14 | 0x34<<7 | 0x51, + 23560 - 19968: jis0208<<14 | 0x34<<7 | 0x52, + 23561 - 19968: jis0208<<14 | 0x0F<<7 | 0x32, + 23562 - 19968: jis0208<<14 | 0x21<<7 | 0x19, + 23563 - 19968: jis0208<<14 | 0x1E<<7 | 0x31, + 23564 - 19968: jis0212<<14 | 0x19<<7 | 0x48, + 23565 - 19968: jis0208<<14 | 0x34<<7 | 0x53, + 23566 - 19968: jis0208<<14 | 0x25<<7 | 0x12, + 23567 - 19968: jis0208<<14 | 0x1D<<7 | 0x0D, + 23569 - 19968: jis0208<<14 | 0x1D<<7 | 0x0E, + 23571 - 19968: jis0208<<14 | 0x34<<7 | 0x54, + 23574 - 19968: jis0208<<14 | 0x1F<<7 | 0x4C, + 23575 - 19968: jis0212<<14 | 0x19<<7 | 0x49, + 23578 - 19968: jis0208<<14 | 0x1D<<7 | 0x0F, + 23582 - 19968: jis0208<<14 | 0x58<<7 | 0x4E, + 23583 - 19968: jis0212<<14 | 0x19<<7 | 0x4B, + 23584 - 19968: jis0208<<14 | 0x34<<7 | 0x55, + 23586 - 19968: jis0208<<14 | 0x34<<7 | 0x56, + 23587 - 19968: jis0212<<14 | 0x19<<7 | 0x4C, + 23588 - 19968: jis0208<<14 | 0x2B<<7 | 0x3F, + 23590 - 19968: jis0212<<14 | 0x19<<7 | 0x4D, + 23592 - 19968: jis0208<<14 | 0x34<<7 | 0x57, + 23593 - 19968: jis0212<<14 | 0x19<<7 | 0x4E, + 23595 - 19968: jis0212<<14 | 0x19<<7 | 0x4F, + 23596 - 19968: jis0212<<14 | 0x19<<7 | 0x50, + 23597 - 19968: jis0208<<14 | 0x15<<7 | 0x25, + 23598 - 19968: jis0212<<14 | 0x19<<7 | 0x51, + 23600 - 19968: jis0212<<14 | 0x19<<7 | 0x52, + 23601 - 19968: jis0208<<14 | 0x1C<<7 | 0x01, + 23602 - 19968: jis0212<<14 | 0x19<<7 | 0x53, + 23605 - 19968: jis0212<<14 | 0x19<<7 | 0x54, + 23606 - 19968: jis0212<<14 | 0x19<<7 | 0x55, + 23608 - 19968: jis0208<<14 | 0x34<<7 | 0x58, + 23609 - 19968: jis0208<<14 | 0x34<<7 | 0x59, + 23610 - 19968: jis0208<<14 | 0x1B<<7 | 0x3B, + 23611 - 19968: jis0208<<14 | 0x1E<<7 | 0x0B, + 23612 - 19968: jis0208<<14 | 0x25<<7 | 0x53, + 23613 - 19968: jis0208<<14 | 0x1E<<7 | 0x33, + 23614 - 19968: jis0208<<14 | 0x27<<7 | 0x57, + 23615 - 19968: jis0208<<14 | 0x26<<7 | 0x01, + 23616 - 19968: jis0208<<14 | 0x15<<7 | 0x28, + 23617 - 19968: jis0208<<14 | 0x34<<7 | 0x5A, + 23621 - 19968: jis0208<<14 | 0x14<<7 | 0x4E, + 23622 - 19968: jis0208<<14 | 0x34<<7 | 0x5B, + 23624 - 19968: jis0208<<14 | 0x15<<7 | 0x5D, + 23626 - 19968: jis0208<<14 | 0x25<<7 | 0x2E, + 23627 - 19968: jis0208<<14 | 0x11<<7 | 0x0F, + 23629 - 19968: jis0208<<14 | 0x1A<<7 | 0x32, + 23630 - 19968: jis0208<<14 | 0x34<<7 | 0x5C, + 23631 - 19968: jis0208<<14 | 0x35<<7 | 0x01, + 23632 - 19968: jis0208<<14 | 0x35<<7 | 0x00, + 23633 - 19968: jis0208<<14 | 0x15<<7 | 0x5C, + 23635 - 19968: jis0208<<14 | 0x34<<7 | 0x5D, + 23637 - 19968: jis0208<<14 | 0x24<<7 | 0x17, + 23641 - 19968: jis0212<<14 | 0x19<<7 | 0x56, + 23642 - 19968: jis0212<<14 | 0x19<<7 | 0x57, + 23644 - 19968: jis0212<<14 | 0x19<<7 | 0x58, + 23646 - 19968: jis0208<<14 | 0x21<<7 | 0x0F, + 23648 - 19968: jis0208<<14 | 0x24<<7 | 0x2A, + 23649 - 19968: jis0208<<14 | 0x1B<<7 | 0x27, + 23650 - 19968: jis0212<<14 | 0x19<<7 | 0x59, + 23651 - 19968: jis0212<<14 | 0x19<<7 | 0x5A, + 23652 - 19968: jis0208<<14 | 0x20<<7 | 0x37, + 23653 - 19968: jis0208<<14 | 0x2C<<7 | 0x59, + 23655 - 19968: jis0212<<14 | 0x19<<7 | 0x5B, + 23656 - 19968: jis0212<<14 | 0x19<<7 | 0x5C, + 23657 - 19968: jis0212<<14 | 0x19<<7 | 0x5D, + 23660 - 19968: jis0208<<14 | 0x35<<7 | 0x03, + 23661 - 19968: jis0212<<14 | 0x1A<<7 | 0x00, + 23662 - 19968: jis0208<<14 | 0x35<<7 | 0x04, + 23663 - 19968: jis0208<<14 | 0x25<<7 | 0x35, + 23664 - 19968: jis0212<<14 | 0x1A<<7 | 0x01, + 23665 - 19968: jis0208<<14 | 0x1A<<7 | 0x12, + 23668 - 19968: jis0212<<14 | 0x1A<<7 | 0x02, + 23669 - 19968: jis0212<<14 | 0x1A<<7 | 0x03, + 23670 - 19968: jis0208<<14 | 0x35<<7 | 0x06, + 23673 - 19968: jis0208<<14 | 0x35<<7 | 0x07, + 23674 - 19968: jis0212<<14 | 0x1A<<7 | 0x04, + 23675 - 19968: jis0212<<14 | 0x1A<<7 | 0x05, + 23676 - 19968: jis0212<<14 | 0x1A<<7 | 0x06, + 23677 - 19968: jis0212<<14 | 0x1A<<7 | 0x07, + 23687 - 19968: jis0212<<14 | 0x1A<<7 | 0x08, + 23688 - 19968: jis0212<<14 | 0x1A<<7 | 0x09, + 23690 - 19968: jis0212<<14 | 0x1A<<7 | 0x0A, + 23692 - 19968: jis0208<<14 | 0x35<<7 | 0x08, + 23695 - 19968: jis0212<<14 | 0x1A<<7 | 0x0B, + 23696 - 19968: jis0208<<14 | 0x13<<7 | 0x53, + 23697 - 19968: jis0208<<14 | 0x35<<7 | 0x09, + 23698 - 19968: jis0212<<14 | 0x1A<<7 | 0x0C, + 23700 - 19968: jis0208<<14 | 0x35<<7 | 0x0A, + 23709 - 19968: jis0212<<14 | 0x1A<<7 | 0x0D, + 23711 - 19968: jis0212<<14 | 0x1A<<7 | 0x0E, + 23712 - 19968: jis0212<<14 | 0x1A<<7 | 0x0F, + 23713 - 19968: jis0208<<14 | 0x11<<7 | 0x0B, + 23714 - 19968: jis0212<<14 | 0x1A<<7 | 0x10, + 23715 - 19968: jis0212<<14 | 0x1A<<7 | 0x11, + 23718 - 19968: jis0208<<14 | 0x58<<7 | 0x4F, + 23720 - 19968: jis0208<<14 | 0x20<<7 | 0x1A, + 23721 - 19968: jis0208<<14 | 0x13<<7 | 0x43, + 23722 - 19968: jis0212<<14 | 0x1A<<7 | 0x13, + 23723 - 19968: jis0208<<14 | 0x35<<7 | 0x0C, + 23724 - 19968: jis0208<<14 | 0x2B<<7 | 0x07, + 23729 - 19968: jis0208<<14 | 0x21<<7 | 0x31, + 23730 - 19968: jis0212<<14 | 0x1A<<7 | 0x14, + 23731 - 19968: jis0208<<14 | 0x12<<7 | 0x38, + 23732 - 19968: jis0212<<14 | 0x1A<<7 | 0x15, + 23733 - 19968: jis0212<<14 | 0x1A<<7 | 0x16, + 23734 - 19968: jis0208<<14 | 0x35<<7 | 0x0E, + 23735 - 19968: jis0208<<14 | 0x35<<7 | 0x10, + 23736 - 19968: jis0208<<14 | 0x13<<7 | 0x3E, + 23738 - 19968: jis0208<<14 | 0x58<<7 | 0x50, + 23739 - 19968: jis0208<<14 | 0x35<<7 | 0x0D, + 23740 - 19968: jis0208<<14 | 0x35<<7 | 0x0F, + 23742 - 19968: jis0208<<14 | 0x35<<7 | 0x12, + 23749 - 19968: jis0208<<14 | 0x35<<7 | 0x11, + 23751 - 19968: jis0208<<14 | 0x35<<7 | 0x13, + 23753 - 19968: jis0212<<14 | 0x1A<<7 | 0x18, + 23755 - 19968: jis0212<<14 | 0x1A<<7 | 0x19, + 23762 - 19968: jis0212<<14 | 0x1A<<7 | 0x1A, + 23767 - 19968: jis0212<<14 | 0x1A<<7 | 0x1C, + 23769 - 19968: jis0208<<14 | 0x35<<7 | 0x14, + 23773 - 19968: jis0212<<14 | 0x1A<<7 | 0x1B, + 23776 - 19968: jis0208<<14 | 0x25<<7 | 0x1C, + 23777 - 19968: jis0208<<14 | 0x15<<7 | 0x0D, + 23784 - 19968: jis0208<<14 | 0x11<<7 | 0x44, + 23785 - 19968: jis0208<<14 | 0x35<<7 | 0x15, + 23786 - 19968: jis0208<<14 | 0x35<<7 | 0x1A, + 23789 - 19968: jis0208<<14 | 0x35<<7 | 0x18, + 23790 - 19968: jis0212<<14 | 0x1A<<7 | 0x1D, + 23791 - 19968: jis0208<<14 | 0x29<<7 | 0x56, + 23792 - 19968: jis0208<<14 | 0x29<<7 | 0x55, + 23793 - 19968: jis0212<<14 | 0x1A<<7 | 0x1E, + 23794 - 19968: jis0212<<14 | 0x1A<<7 | 0x1F, + 23796 - 19968: jis0212<<14 | 0x1A<<7 | 0x20, + 23797 - 19968: jis0208<<14 | 0x58<<7 | 0x51, + 23798 - 19968: jis0208<<14 | 0x24<<7 | 0x46, + 23802 - 19968: jis0208<<14 | 0x35<<7 | 0x17, + 23803 - 19968: jis0208<<14 | 0x1C<<7 | 0x33, + 23805 - 19968: jis0208<<14 | 0x35<<7 | 0x16, + 23809 - 19968: jis0212<<14 | 0x1A<<7 | 0x21, + 23814 - 19968: jis0212<<14 | 0x1A<<7 | 0x22, + 23815 - 19968: jis0208<<14 | 0x1E<<7 | 0x51, + 23819 - 19968: jis0208<<14 | 0x35<<7 | 0x1B, + 23821 - 19968: jis0212<<14 | 0x1A<<7 | 0x23, + 23822 - 19968: jis0208<<14 | 0x19<<7 | 0x49, + 23825 - 19968: jis0208<<14 | 0x35<<7 | 0x21, + 23826 - 19968: jis0212<<14 | 0x1A<<7 | 0x24, + 23828 - 19968: jis0208<<14 | 0x35<<7 | 0x22, + 23829 - 19968: jis0208<<14 | 0x35<<7 | 0x1C, + 23830 - 19968: jis0208<<14 | 0x12<<7 | 0x12, + 23831 - 19968: jis0208<<14 | 0x35<<7 | 0x1D, + 23832 - 19968: jis0208<<14 | 0x35<<7 | 0x26, + 23833 - 19968: jis0208<<14 | 0x35<<7 | 0x25, + 23834 - 19968: jis0208<<14 | 0x35<<7 | 0x24, + 23835 - 19968: jis0208<<14 | 0x35<<7 | 0x20, + 23839 - 19968: jis0208<<14 | 0x35<<7 | 0x1F, + 23842 - 19968: jis0208<<14 | 0x35<<7 | 0x23, + 23843 - 19968: jis0212<<14 | 0x1A<<7 | 0x26, + 23844 - 19968: jis0212<<14 | 0x1A<<7 | 0x27, + 23846 - 19968: jis0212<<14 | 0x1A<<7 | 0x28, + 23847 - 19968: jis0208<<14 | 0x58<<7 | 0x52, + 23849 - 19968: jis0208<<14 | 0x29<<7 | 0x57, + 23851 - 19968: jis0212<<14 | 0x1A<<7 | 0x25, + 23857 - 19968: jis0212<<14 | 0x1A<<7 | 0x2A, + 23860 - 19968: jis0212<<14 | 0x1A<<7 | 0x2B, + 23865 - 19968: jis0212<<14 | 0x1A<<7 | 0x2C, + 23869 - 19968: jis0212<<14 | 0x1A<<7 | 0x2D, + 23871 - 19968: jis0212<<14 | 0x1A<<7 | 0x2E, + 23874 - 19968: jis0208<<14 | 0x58<<7 | 0x55, + 23875 - 19968: jis0212<<14 | 0x1A<<7 | 0x30, + 23878 - 19968: jis0212<<14 | 0x1A<<7 | 0x31, + 23880 - 19968: jis0212<<14 | 0x1A<<7 | 0x32, + 23882 - 19968: jis0212<<14 | 0x1A<<7 | 0x36, + 23883 - 19968: jis0208<<14 | 0x35<<7 | 0x2A, + 23884 - 19968: jis0208<<14 | 0x35<<7 | 0x27, + 23886 - 19968: jis0208<<14 | 0x35<<7 | 0x29, + 23888 - 19968: jis0208<<14 | 0x2C<<7 | 0x51, + 23889 - 19968: jis0212<<14 | 0x1A<<7 | 0x34, + 23890 - 19968: jis0208<<14 | 0x35<<7 | 0x28, + 23891 - 19968: jis0208<<14 | 0x58<<7 | 0x53, + 23893 - 19968: jis0212<<14 | 0x1A<<7 | 0x33, + 23897 - 19968: jis0212<<14 | 0x1A<<7 | 0x35, + 23900 - 19968: jis0208<<14 | 0x35<<7 | 0x1E, + 23903 - 19968: jis0212<<14 | 0x1A<<7 | 0x37, + 23904 - 19968: jis0212<<14 | 0x1A<<7 | 0x38, + 23905 - 19968: jis0212<<14 | 0x1A<<7 | 0x39, + 23906 - 19968: jis0212<<14 | 0x1A<<7 | 0x3A, + 23908 - 19968: jis0212<<14 | 0x1A<<7 | 0x3B, + 23913 - 19968: jis0208<<14 | 0x1E<<7 | 0x52, + 23914 - 19968: jis0212<<14 | 0x1A<<7 | 0x3C, + 23916 - 19968: jis0208<<14 | 0x35<<7 | 0x2B, + 23917 - 19968: jis0208<<14 | 0x58<<7 | 0x56, + 23919 - 19968: jis0208<<14 | 0x19<<7 | 0x16, + 23920 - 19968: jis0212<<14 | 0x1A<<7 | 0x3E, + 23923 - 19968: jis0208<<14 | 0x35<<7 | 0x2C, + 23926 - 19968: jis0208<<14 | 0x35<<7 | 0x2D, + 23929 - 19968: jis0212<<14 | 0x1A<<7 | 0x3F, + 23930 - 19968: jis0212<<14 | 0x1A<<7 | 0x40, + 23934 - 19968: jis0212<<14 | 0x1A<<7 | 0x41, + 23935 - 19968: jis0212<<14 | 0x1A<<7 | 0x42, + 23937 - 19968: jis0212<<14 | 0x1A<<7 | 0x43, + 23938 - 19968: jis0208<<14 | 0x35<<7 | 0x30, + 23939 - 19968: jis0212<<14 | 0x1A<<7 | 0x44, + 23940 - 19968: jis0208<<14 | 0x35<<7 | 0x2F, + 23943 - 19968: jis0208<<14 | 0x35<<7 | 0x2E, + 23944 - 19968: jis0212<<14 | 0x1A<<7 | 0x45, + 23946 - 19968: jis0212<<14 | 0x1A<<7 | 0x46, + 23947 - 19968: jis0208<<14 | 0x24<<7 | 0x47, + 23948 - 19968: jis0208<<14 | 0x35<<7 | 0x19, + 23952 - 19968: jis0208<<14 | 0x35<<7 | 0x36, + 23954 - 19968: jis0212<<14 | 0x1A<<7 | 0x47, + 23955 - 19968: jis0212<<14 | 0x1A<<7 | 0x48, + 23956 - 19968: jis0212<<14 | 0x1A<<7 | 0x49, + 23957 - 19968: jis0212<<14 | 0x1A<<7 | 0x4A, + 23961 - 19968: jis0212<<14 | 0x1A<<7 | 0x4B, + 23963 - 19968: jis0212<<14 | 0x1A<<7 | 0x4C, + 23965 - 19968: jis0208<<14 | 0x35<<7 | 0x32, + 23967 - 19968: jis0212<<14 | 0x1A<<7 | 0x4D, + 23968 - 19968: jis0212<<14 | 0x1A<<7 | 0x4E, + 23970 - 19968: jis0208<<14 | 0x35<<7 | 0x31, + 23975 - 19968: jis0212<<14 | 0x1A<<7 | 0x4F, + 23979 - 19968: jis0212<<14 | 0x1A<<7 | 0x50, + 23980 - 19968: jis0208<<14 | 0x35<<7 | 0x33, + 23982 - 19968: jis0208<<14 | 0x35<<7 | 0x34, + 23984 - 19968: jis0212<<14 | 0x1A<<7 | 0x51, + 23986 - 19968: jis0212<<14 | 0x45<<7 | 0x53, + 23988 - 19968: jis0212<<14 | 0x1A<<7 | 0x52, + 23991 - 19968: jis0208<<14 | 0x35<<7 | 0x37, + 23992 - 19968: jis0208<<14 | 0x58<<7 | 0x57, + 23993 - 19968: jis0208<<14 | 0x58<<7 | 0x58, + 23994 - 19968: jis0208<<14 | 0x2D<<7 | 0x45, + 23996 - 19968: jis0208<<14 | 0x35<<7 | 0x38, + 23997 - 19968: jis0208<<14 | 0x35<<7 | 0x35, + 24003 - 19968: jis0212<<14 | 0x1A<<7 | 0x55, + 24007 - 19968: jis0212<<14 | 0x1A<<7 | 0x56, + 24009 - 19968: jis0208<<14 | 0x35<<7 | 0x39, + 24011 - 19968: jis0212<<14 | 0x1A<<7 | 0x57, + 24012 - 19968: jis0208<<14 | 0x13<<7 | 0x3F, + 24013 - 19968: jis0208<<14 | 0x35<<7 | 0x3A, + 24014 - 19968: jis0212<<14 | 0x1A<<7 | 0x59, + 24016 - 19968: jis0208<<14 | 0x58<<7 | 0x59, + 24018 - 19968: jis0208<<14 | 0x35<<7 | 0x3C, + 24019 - 19968: jis0208<<14 | 0x35<<7 | 0x3B, + 24022 - 19968: jis0208<<14 | 0x35<<7 | 0x3D, + 24024 - 19968: jis0212<<14 | 0x1A<<7 | 0x5A, + 24025 - 19968: jis0212<<14 | 0x1A<<7 | 0x5B, + 24027 - 19968: jis0208<<14 | 0x35<<7 | 0x3E, + 24029 - 19968: jis0208<<14 | 0x1F<<7 | 0x4D, + 24030 - 19968: jis0208<<14 | 0x1C<<7 | 0x02, + 24032 - 19968: jis0212<<14 | 0x1A<<7 | 0x5C, + 24033 - 19968: jis0208<<14 | 0x1C<<7 | 0x43, + 24035 - 19968: jis0208<<14 | 0x20<<7 | 0x42, + 24036 - 19968: jis0212<<14 | 0x1A<<7 | 0x5D, + 24037 - 19968: jis0208<<14 | 0x18<<7 | 0x08, + 24038 - 19968: jis0208<<14 | 0x19<<7 | 0x17, + 24039 - 19968: jis0208<<14 | 0x18<<7 | 0x09, + 24040 - 19968: jis0208<<14 | 0x14<<7 | 0x4F, + 24041 - 19968: jis0212<<14 | 0x1B<<7 | 0x00, + 24043 - 19968: jis0208<<14 | 0x35<<7 | 0x3F, + 24046 - 19968: jis0208<<14 | 0x19<<7 | 0x18, + 24049 - 19968: jis0208<<14 | 0x17<<7 | 0x29, + 24050 - 19968: jis0208<<14 | 0x35<<7 | 0x40, + 24051 - 19968: jis0208<<14 | 0x2B<<7 | 0x05, + 24052 - 19968: jis0208<<14 | 0x26<<7 | 0x22, + 24053 - 19968: jis0208<<14 | 0x35<<7 | 0x41, + 24055 - 19968: jis0208<<14 | 0x18<<7 | 0x0A, + 24056 - 19968: jis0212<<14 | 0x1B<<7 | 0x01, + 24057 - 19968: jis0212<<14 | 0x1B<<7 | 0x02, + 24059 - 19968: jis0208<<14 | 0x13<<7 | 0x0B, + 24061 - 19968: jis0208<<14 | 0x22<<7 | 0x06, + 24062 - 19968: jis0208<<14 | 0x15<<7 | 0x31, + 24064 - 19968: jis0212<<14 | 0x1B<<7 | 0x03, + 24066 - 19968: jis0208<<14 | 0x1A<<7 | 0x33, + 24067 - 19968: jis0208<<14 | 0x28<<7 | 0x3A, + 24070 - 19968: jis0208<<14 | 0x27<<7 | 0x20, + 24071 - 19968: jis0212<<14 | 0x1B<<7 | 0x04, + 24075 - 19968: jis0208<<14 | 0x35<<7 | 0x42, + 24076 - 19968: jis0208<<14 | 0x13<<7 | 0x54, + 24077 - 19968: jis0212<<14 | 0x1B<<7 | 0x05, + 24081 - 19968: jis0208<<14 | 0x35<<7 | 0x45, + 24082 - 19968: jis0212<<14 | 0x1B<<7 | 0x06, + 24084 - 19968: jis0212<<14 | 0x1B<<7 | 0x07, + 24085 - 19968: jis0212<<14 | 0x1B<<7 | 0x08, + 24086 - 19968: jis0208<<14 | 0x23<<7 | 0x00, + 24088 - 19968: jis0212<<14 | 0x1B<<7 | 0x09, + 24089 - 19968: jis0208<<14 | 0x35<<7 | 0x44, + 24090 - 19968: jis0208<<14 | 0x35<<7 | 0x43, + 24091 - 19968: jis0208<<14 | 0x35<<7 | 0x46, + 24093 - 19968: jis0208<<14 | 0x23<<7 | 0x4A, + 24095 - 19968: jis0212<<14 | 0x1B<<7 | 0x0A, + 24096 - 19968: jis0212<<14 | 0x1B<<7 | 0x0B, + 24101 - 19968: jis0208<<14 | 0x1E<<7 | 0x42, + 24104 - 19968: jis0212<<14 | 0x1B<<7 | 0x0D, + 24107 - 19968: jis0208<<14 | 0x1A<<7 | 0x34, + 24109 - 19968: jis0208<<14 | 0x1F<<7 | 0x29, + 24110 - 19968: jis0212<<14 | 0x1B<<7 | 0x0C, + 24111 - 19968: jis0208<<14 | 0x21<<7 | 0x32, + 24112 - 19968: jis0208<<14 | 0x14<<7 | 0x01, + 24114 - 19968: jis0212<<14 | 0x1B<<7 | 0x0E, + 24115 - 19968: jis0208<<14 | 0x23<<7 | 0x01, + 24117 - 19968: jis0212<<14 | 0x1B<<7 | 0x0F, + 24118 - 19968: jis0208<<14 | 0x35<<7 | 0x47, + 24119 - 19968: jis0208<<14 | 0x35<<7 | 0x48, + 24120 - 19968: jis0208<<14 | 0x1D<<7 | 0x4E, + 24125 - 19968: jis0208<<14 | 0x2A<<7 | 0x18, + 24126 - 19968: jis0212<<14 | 0x1B<<7 | 0x10, + 24128 - 19968: jis0208<<14 | 0x35<<7 | 0x4B, + 24131 - 19968: jis0208<<14 | 0x35<<7 | 0x4A, + 24132 - 19968: jis0208<<14 | 0x35<<7 | 0x49, + 24133 - 19968: jis0208<<14 | 0x28<<7 | 0x5C, + 24135 - 19968: jis0208<<14 | 0x35<<7 | 0x52, + 24137 - 19968: jis0212<<14 | 0x1B<<7 | 0x13, + 24139 - 19968: jis0212<<14 | 0x1B<<7 | 0x11, + 24140 - 19968: jis0208<<14 | 0x2A<<7 | 0x39, + 24142 - 19968: jis0208<<14 | 0x35<<7 | 0x4C, + 24144 - 19968: jis0212<<14 | 0x1B<<7 | 0x12, + 24145 - 19968: jis0212<<14 | 0x1B<<7 | 0x14, + 24148 - 19968: jis0208<<14 | 0x35<<7 | 0x4E, + 24149 - 19968: jis0208<<14 | 0x2A<<7 | 0x4A, + 24150 - 19968: jis0212<<14 | 0x1B<<7 | 0x15, + 24151 - 19968: jis0208<<14 | 0x35<<7 | 0x4D, + 24152 - 19968: jis0212<<14 | 0x1B<<7 | 0x16, + 24155 - 19968: jis0212<<14 | 0x1B<<7 | 0x17, + 24156 - 19968: jis0212<<14 | 0x1B<<7 | 0x18, + 24158 - 19968: jis0212<<14 | 0x1B<<7 | 0x19, + 24159 - 19968: jis0208<<14 | 0x35<<7 | 0x4F, + 24161 - 19968: jis0208<<14 | 0x27<<7 | 0x07, + 24162 - 19968: jis0208<<14 | 0x35<<7 | 0x50, + 24163 - 19968: jis0208<<14 | 0x29<<7 | 0x1D, + 24164 - 19968: jis0208<<14 | 0x35<<7 | 0x51, + 24168 - 19968: jis0212<<14 | 0x1B<<7 | 0x1A, + 24170 - 19968: jis0212<<14 | 0x1B<<7 | 0x1B, + 24171 - 19968: jis0212<<14 | 0x1B<<7 | 0x1C, + 24172 - 19968: jis0212<<14 | 0x1B<<7 | 0x1D, + 24173 - 19968: jis0212<<14 | 0x1B<<7 | 0x1E, + 24174 - 19968: jis0212<<14 | 0x1B<<7 | 0x1F, + 24176 - 19968: jis0212<<14 | 0x1B<<7 | 0x20, + 24178 - 19968: jis0208<<14 | 0x13<<7 | 0x12, + 24179 - 19968: jis0208<<14 | 0x29<<7 | 0x1E, + 24180 - 19968: jis0208<<14 | 0x26<<7 | 0x0E, + 24181 - 19968: jis0208<<14 | 0x35<<7 | 0x53, + 24182 - 19968: jis0208<<14 | 0x35<<7 | 0x54, + 24184 - 19968: jis0208<<14 | 0x18<<7 | 0x0B, + 24185 - 19968: jis0208<<14 | 0x13<<7 | 0x13, + 24186 - 19968: jis0208<<14 | 0x35<<7 | 0x55, + 24187 - 19968: jis0208<<14 | 0x17<<7 | 0x17, + 24188 - 19968: jis0208<<14 | 0x2C<<7 | 0x23, + 24189 - 19968: jis0208<<14 | 0x2C<<7 | 0x08, + 24190 - 19968: jis0208<<14 | 0x13<<7 | 0x55, + 24191 - 19968: jis0208<<14 | 0x35<<7 | 0x57, + 24192 - 19968: jis0212<<14 | 0x1B<<7 | 0x21, + 24193 - 19968: jis0208<<14 | 0x23<<7 | 0x02, + 24195 - 19968: jis0208<<14 | 0x18<<7 | 0x0C, + 24196 - 19968: jis0208<<14 | 0x1D<<7 | 0x10, + 24199 - 19968: jis0208<<14 | 0x27<<7 | 0x3E, + 24202 - 19968: jis0208<<14 | 0x1D<<7 | 0x11, + 24203 - 19968: jis0212<<14 | 0x1B<<7 | 0x22, + 24206 - 19968: jis0212<<14 | 0x1B<<7 | 0x23, + 24207 - 19968: jis0208<<14 | 0x1C<<7 | 0x57, + 24213 - 19968: jis0208<<14 | 0x23<<7 | 0x4B, + 24214 - 19968: jis0208<<14 | 0x29<<7 | 0x58, + 24215 - 19968: jis0208<<14 | 0x24<<7 | 0x18, + 24218 - 19968: jis0208<<14 | 0x18<<7 | 0x0D, + 24220 - 19968: jis0208<<14 | 0x28<<7 | 0x3B, + 24224 - 19968: jis0208<<14 | 0x35<<7 | 0x58, + 24226 - 19968: jis0212<<14 | 0x1B<<7 | 0x24, + 24228 - 19968: jis0212<<14 | 0x1B<<7 | 0x25, + 24229 - 19968: jis0212<<14 | 0x1B<<7 | 0x26, + 24230 - 19968: jis0208<<14 | 0x24<<7 | 0x38, + 24231 - 19968: jis0208<<14 | 0x19<<7 | 0x21, + 24232 - 19968: jis0212<<14 | 0x1B<<7 | 0x27, + 24234 - 19968: jis0212<<14 | 0x1B<<7 | 0x28, + 24235 - 19968: jis0208<<14 | 0x17<<7 | 0x2A, + 24236 - 19968: jis0212<<14 | 0x1B<<7 | 0x29, + 24237 - 19968: jis0208<<14 | 0x23<<7 | 0x4C, + 24241 - 19968: jis0212<<14 | 0x1B<<7 | 0x2A, + 24243 - 19968: jis0212<<14 | 0x1B<<7 | 0x2B, + 24245 - 19968: jis0208<<14 | 0x0F<<7 | 0x22, + 24246 - 19968: jis0208<<14 | 0x1C<<7 | 0x4D, + 24247 - 19968: jis0208<<14 | 0x18<<7 | 0x0E, + 24248 - 19968: jis0208<<14 | 0x2C<<7 | 0x26, + 24253 - 19968: jis0212<<14 | 0x1B<<7 | 0x2C, + 24254 - 19968: jis0212<<14 | 0x1B<<7 | 0x2D, + 24255 - 19968: jis0212<<14 | 0x1B<<7 | 0x2E, + 24257 - 19968: jis0208<<14 | 0x35<<7 | 0x59, + 24258 - 19968: jis0208<<14 | 0x35<<7 | 0x5A, + 24259 - 19968: jis0208<<14 | 0x26<<7 | 0x30, + 24262 - 19968: jis0212<<14 | 0x1B<<7 | 0x2F, + 24264 - 19968: jis0208<<14 | 0x35<<7 | 0x5B, + 24265 - 19968: jis0208<<14 | 0x2D<<7 | 0x56, + 24266 - 19968: jis0208<<14 | 0x2E<<7 | 0x0C, + 24267 - 19968: jis0212<<14 | 0x1B<<7 | 0x31, + 24268 - 19968: jis0212<<14 | 0x1B<<7 | 0x30, + 24270 - 19968: jis0212<<14 | 0x1B<<7 | 0x32, + 24271 - 19968: jis0208<<14 | 0x35<<7 | 0x5D, + 24272 - 19968: jis0208<<14 | 0x35<<7 | 0x5C, + 24273 - 19968: jis0212<<14 | 0x1B<<7 | 0x33, + 24274 - 19968: jis0212<<14 | 0x1B<<7 | 0x34, + 24275 - 19968: jis0208<<14 | 0x12<<7 | 0x26, + 24276 - 19968: jis0212<<14 | 0x1B<<7 | 0x35, + 24277 - 19968: jis0212<<14 | 0x1B<<7 | 0x36, + 24278 - 19968: jis0208<<14 | 0x36<<7 | 0x00, + 24282 - 19968: jis0208<<14 | 0x36<<7 | 0x03, + 24283 - 19968: jis0208<<14 | 0x36<<7 | 0x04, + 24284 - 19968: jis0212<<14 | 0x1B<<7 | 0x37, + 24285 - 19968: jis0208<<14 | 0x36<<7 | 0x02, + 24286 - 19968: jis0212<<14 | 0x1B<<7 | 0x38, + 24287 - 19968: jis0208<<14 | 0x28<<7 | 0x1F, + 24288 - 19968: jis0208<<14 | 0x1D<<7 | 0x12, + 24289 - 19968: jis0208<<14 | 0x36<<7 | 0x06, + 24290 - 19968: jis0208<<14 | 0x36<<7 | 0x05, + 24291 - 19968: jis0208<<14 | 0x36<<7 | 0x01, + 24293 - 19968: jis0212<<14 | 0x1B<<7 | 0x39, + 24296 - 19968: jis0208<<14 | 0x36<<7 | 0x07, + 24297 - 19968: jis0208<<14 | 0x36<<7 | 0x08, + 24299 - 19968: jis0212<<14 | 0x1B<<7 | 0x3A, + 24300 - 19968: jis0208<<14 | 0x36<<7 | 0x09, + 24304 - 19968: jis0208<<14 | 0x36<<7 | 0x0C, + 24305 - 19968: jis0208<<14 | 0x36<<7 | 0x0A, + 24307 - 19968: jis0208<<14 | 0x36<<7 | 0x0B, + 24308 - 19968: jis0208<<14 | 0x36<<7 | 0x0D, + 24310 - 19968: jis0208<<14 | 0x10<<7 | 0x43, + 24311 - 19968: jis0208<<14 | 0x23<<7 | 0x4D, + 24312 - 19968: jis0208<<14 | 0x36<<7 | 0x0E, + 24314 - 19968: jis0208<<14 | 0x16<<7 | 0x59, + 24315 - 19968: jis0208<<14 | 0x11<<7 | 0x55, + 24316 - 19968: jis0208<<14 | 0x26<<7 | 0x15, + 24318 - 19968: jis0208<<14 | 0x36<<7 | 0x0F, + 24319 - 19968: jis0208<<14 | 0x25<<7 | 0x5A, + 24321 - 19968: jis0208<<14 | 0x29<<7 | 0x3A, + 24322 - 19968: jis0212<<14 | 0x1B<<7 | 0x3B, + 24323 - 19968: jis0208<<14 | 0x36<<7 | 0x10, + 24324 - 19968: jis0208<<14 | 0x2E<<7 | 0x0D, + 24326 - 19968: jis0212<<14 | 0x1B<<7 | 0x3C, + 24327 - 19968: jis0212<<14 | 0x1B<<7 | 0x3D, + 24328 - 19968: jis0212<<14 | 0x1B<<7 | 0x3E, + 24329 - 19968: jis0208<<14 | 0x36<<7 | 0x11, + 24330 - 19968: jis0208<<14 | 0x29<<7 | 0x1F, + 24331 - 19968: jis0208<<14 | 0x36<<7 | 0x14, + 24332 - 19968: jis0208<<14 | 0x2F<<7 | 0x00, + 24333 - 19968: jis0208<<14 | 0x2F<<7 | 0x10, + 24334 - 19968: jis0212<<14 | 0x1B<<7 | 0x3F, + 24335 - 19968: jis0208<<14 | 0x1B<<7 | 0x0F, + 24336 - 19968: jis0208<<14 | 0x25<<7 | 0x54, + 24337 - 19968: jis0208<<14 | 0x36<<7 | 0x15, + 24339 - 19968: jis0208<<14 | 0x14<<7 | 0x3C, + 24340 - 19968: jis0208<<14 | 0x23<<7 | 0x03, + 24341 - 19968: jis0208<<14 | 0x0F<<7 | 0x59, + 24342 - 19968: jis0208<<14 | 0x36<<7 | 0x16, + 24343 - 19968: jis0208<<14 | 0x29<<7 | 0x05, + 24344 - 19968: jis0208<<14 | 0x18<<7 | 0x0F, + 24345 - 19968: jis0212<<14 | 0x1B<<7 | 0x40, + 24347 - 19968: jis0208<<14 | 0x22<<7 | 0x2F, + 24348 - 19968: jis0212<<14 | 0x1B<<7 | 0x41, + 24349 - 19968: jis0212<<14 | 0x1B<<7 | 0x42, + 24351 - 19968: jis0208<<14 | 0x23<<7 | 0x4E, + 24353 - 19968: jis0208<<14 | 0x58<<7 | 0x5A, + 24354 - 19968: jis0212<<14 | 0x1B<<7 | 0x44, + 24355 - 19968: jis0212<<14 | 0x1B<<7 | 0x45, + 24356 - 19968: jis0212<<14 | 0x1B<<7 | 0x46, + 24357 - 19968: jis0208<<14 | 0x2B<<7 | 0x4E, + 24358 - 19968: jis0208<<14 | 0x17<<7 | 0x18, + 24359 - 19968: jis0208<<14 | 0x17<<7 | 0x2B, + 24360 - 19968: jis0212<<14 | 0x1B<<7 | 0x47, + 24361 - 19968: jis0208<<14 | 0x36<<7 | 0x17, + 24363 - 19968: jis0212<<14 | 0x1B<<7 | 0x48, + 24364 - 19968: jis0212<<14 | 0x1B<<7 | 0x49, + 24365 - 19968: jis0208<<14 | 0x36<<7 | 0x18, + 24366 - 19968: jis0212<<14 | 0x1B<<7 | 0x4A, + 24367 - 19968: jis0208<<14 | 0x36<<7 | 0x1E, + 24368 - 19968: jis0212<<14 | 0x1B<<7 | 0x4B, + 24369 - 19968: jis0208<<14 | 0x1B<<7 | 0x44, + 24372 - 19968: jis0208<<14 | 0x58<<7 | 0x5B, + 24373 - 19968: jis0208<<14 | 0x23<<7 | 0x04, + 24374 - 19968: jis0212<<14 | 0x1B<<7 | 0x4D, + 24375 - 19968: jis0208<<14 | 0x15<<7 | 0x0E, + 24376 - 19968: jis0208<<14 | 0x36<<7 | 0x19, + 24379 - 19968: jis0212<<14 | 0x1B<<7 | 0x4E, + 24380 - 19968: jis0208<<14 | 0x28<<7 | 0x0A, + 24381 - 19968: jis0212<<14 | 0x1B<<7 | 0x4F, + 24382 - 19968: jis0208<<14 | 0x22<<7 | 0x25, + 24383 - 19968: jis0212<<14 | 0x1B<<7 | 0x50, + 24384 - 19968: jis0212<<14 | 0x1B<<7 | 0x51, + 24385 - 19968: jis0208<<14 | 0x36<<7 | 0x1A, + 24388 - 19968: jis0212<<14 | 0x1B<<7 | 0x52, + 24389 - 19968: jis0208<<14 | 0x58<<7 | 0x0B, + 24391 - 19968: jis0212<<14 | 0x1B<<7 | 0x54, + 24392 - 19968: jis0208<<14 | 0x36<<7 | 0x1B, + 24394 - 19968: jis0208<<14 | 0x15<<7 | 0x0F, + 24396 - 19968: jis0208<<14 | 0x36<<7 | 0x1C, + 24397 - 19968: jis0212<<14 | 0x1B<<7 | 0x55, + 24398 - 19968: jis0208<<14 | 0x36<<7 | 0x1D, + 24400 - 19968: jis0212<<14 | 0x1B<<7 | 0x56, + 24401 - 19968: jis0208<<14 | 0x36<<7 | 0x1F, + 24403 - 19968: jis0208<<14 | 0x24<<7 | 0x55, + 24404 - 19968: jis0212<<14 | 0x1B<<7 | 0x57, + 24406 - 19968: jis0208<<14 | 0x36<<7 | 0x20, + 24407 - 19968: jis0208<<14 | 0x36<<7 | 0x21, + 24408 - 19968: jis0212<<14 | 0x1B<<7 | 0x58, + 24409 - 19968: jis0208<<14 | 0x36<<7 | 0x22, + 24411 - 19968: jis0212<<14 | 0x1B<<7 | 0x59, + 24412 - 19968: jis0208<<14 | 0x36<<7 | 0x13, + 24413 - 19968: jis0208<<14 | 0x36<<7 | 0x12, + 24416 - 19968: jis0212<<14 | 0x1B<<7 | 0x5A, + 24417 - 19968: jis0208<<14 | 0x36<<7 | 0x23, + 24418 - 19968: jis0208<<14 | 0x16<<7 | 0x20, + 24419 - 19968: jis0212<<14 | 0x1B<<7 | 0x5B, + 24420 - 19968: jis0212<<14 | 0x1B<<7 | 0x5C, + 24422 - 19968: jis0208<<14 | 0x28<<7 | 0x06, + 24423 - 19968: jis0208<<14 | 0x58<<7 | 0x5C, + 24425 - 19968: jis0208<<14 | 0x19<<7 | 0x2B, + 24426 - 19968: jis0208<<14 | 0x28<<7 | 0x16, + 24427 - 19968: jis0208<<14 | 0x23<<7 | 0x05, + 24428 - 19968: jis0208<<14 | 0x28<<7 | 0x2A, + 24429 - 19968: jis0208<<14 | 0x36<<7 | 0x24, + 24431 - 19968: jis0212<<14 | 0x1C<<7 | 0x00, + 24432 - 19968: jis0208<<14 | 0x1D<<7 | 0x13, + 24433 - 19968: jis0208<<14 | 0x10<<7 | 0x25, + 24434 - 19968: jis0212<<14 | 0x1C<<7 | 0x01, + 24435 - 19968: jis0208<<14 | 0x36<<7 | 0x25, + 24436 - 19968: jis0212<<14 | 0x1C<<7 | 0x02, + 24437 - 19968: jis0212<<14 | 0x1C<<7 | 0x03, + 24439 - 19968: jis0208<<14 | 0x36<<7 | 0x26, + 24440 - 19968: jis0212<<14 | 0x1C<<7 | 0x04, + 24441 - 19968: jis0208<<14 | 0x2B<<7 | 0x51, + 24442 - 19968: jis0212<<14 | 0x1C<<7 | 0x05, + 24444 - 19968: jis0208<<14 | 0x27<<7 | 0x3F, + 24445 - 19968: jis0212<<14 | 0x1C<<7 | 0x06, + 24446 - 19968: jis0212<<14 | 0x1C<<7 | 0x07, + 24447 - 19968: jis0208<<14 | 0x36<<7 | 0x29, + 24448 - 19968: jis0208<<14 | 0x10<<7 | 0x5C, + 24449 - 19968: jis0208<<14 | 0x1F<<7 | 0x0B, + 24450 - 19968: jis0208<<14 | 0x36<<7 | 0x28, + 24451 - 19968: jis0208<<14 | 0x36<<7 | 0x27, + 24452 - 19968: jis0208<<14 | 0x16<<7 | 0x21, + 24453 - 19968: jis0208<<14 | 0x21<<7 | 0x33, + 24455 - 19968: jis0208<<14 | 0x36<<7 | 0x2D, + 24456 - 19968: jis0208<<14 | 0x36<<7 | 0x2B, + 24457 - 19968: jis0212<<14 | 0x1C<<7 | 0x08, + 24458 - 19968: jis0208<<14 | 0x36<<7 | 0x2A, + 24459 - 19968: jis0208<<14 | 0x2D<<7 | 0x06, + 24460 - 19968: jis0208<<14 | 0x17<<7 | 0x44, + 24461 - 19968: jis0212<<14 | 0x1C<<7 | 0x09, + 24463 - 19968: jis0212<<14 | 0x1C<<7 | 0x0A, + 24464 - 19968: jis0208<<14 | 0x1C<<7 | 0x58, + 24465 - 19968: jis0208<<14 | 0x36<<7 | 0x2C, + 24466 - 19968: jis0208<<14 | 0x24<<7 | 0x2B, + 24467 - 19968: jis0208<<14 | 0x1C<<7 | 0x1D, + 24470 - 19968: jis0212<<14 | 0x1C<<7 | 0x0B, + 24471 - 19968: jis0208<<14 | 0x25<<7 | 0x1F, + 24472 - 19968: jis0208<<14 | 0x36<<7 | 0x30, + 24473 - 19968: jis0208<<14 | 0x36<<7 | 0x2F, + 24476 - 19968: jis0212<<14 | 0x1C<<7 | 0x0C, + 24477 - 19968: jis0212<<14 | 0x1C<<7 | 0x0D, + 24478 - 19968: jis0208<<14 | 0x36<<7 | 0x2E, + 24480 - 19968: jis0208<<14 | 0x36<<7 | 0x31, + 24481 - 19968: jis0208<<14 | 0x17<<7 | 0x45, + 24482 - 19968: jis0212<<14 | 0x1C<<7 | 0x0E, + 24484 - 19968: jis0212<<14 | 0x1C<<7 | 0x11, + 24487 - 19968: jis0212<<14 | 0x1C<<7 | 0x0F, + 24488 - 19968: jis0208<<14 | 0x36<<7 | 0x32, + 24489 - 19968: jis0208<<14 | 0x28<<7 | 0x5B, + 24490 - 19968: jis0208<<14 | 0x1C<<7 | 0x3A, + 24491 - 19968: jis0212<<14 | 0x1C<<7 | 0x10, + 24492 - 19968: jis0212<<14 | 0x1C<<7 | 0x12, + 24493 - 19968: jis0208<<14 | 0x36<<7 | 0x33, + 24494 - 19968: jis0208<<14 | 0x27<<7 | 0x58, + 24495 - 19968: jis0212<<14 | 0x1C<<7 | 0x13, + 24496 - 19968: jis0212<<14 | 0x1C<<7 | 0x14, + 24497 - 19968: jis0212<<14 | 0x1C<<7 | 0x15, + 24499 - 19968: jis0208<<14 | 0x25<<7 | 0x20, + 24500 - 19968: jis0208<<14 | 0x23<<7 | 0x06, + 24503 - 19968: jis0208<<14 | 0x58<<7 | 0x5D, + 24504 - 19968: jis0212<<14 | 0x1C<<7 | 0x16, + 24505 - 19968: jis0208<<14 | 0x24<<7 | 0x0F, + 24508 - 19968: jis0208<<14 | 0x36<<7 | 0x34, + 24509 - 19968: jis0208<<14 | 0x14<<7 | 0x0A, + 24515 - 19968: jis0208<<14 | 0x1E<<7 | 0x13, + 24516 - 19968: jis0212<<14 | 0x1C<<7 | 0x17, + 24517 - 19968: jis0208<<14 | 0x28<<7 | 0x0B, + 24519 - 19968: jis0212<<14 | 0x1C<<7 | 0x18, + 24520 - 19968: jis0212<<14 | 0x1C<<7 | 0x19, + 24521 - 19968: jis0212<<14 | 0x1C<<7 | 0x1A, + 24523 - 19968: jis0212<<14 | 0x1C<<7 | 0x1B, + 24524 - 19968: jis0208<<14 | 0x13<<7 | 0x56, + 24525 - 19968: jis0208<<14 | 0x26<<7 | 0x05, + 24528 - 19968: jis0212<<14 | 0x1C<<7 | 0x1C, + 24529 - 19968: jis0212<<14 | 0x1C<<7 | 0x1D, + 24530 - 19968: jis0212<<14 | 0x1C<<7 | 0x1E, + 24531 - 19968: jis0212<<14 | 0x1C<<7 | 0x1F, + 24532 - 19968: jis0212<<14 | 0x1C<<7 | 0x20, + 24534 - 19968: jis0208<<14 | 0x36<<7 | 0x35, + 24535 - 19968: jis0208<<14 | 0x1A<<7 | 0x35, + 24536 - 19968: jis0208<<14 | 0x2A<<7 | 0x19, + 24537 - 19968: jis0208<<14 | 0x2A<<7 | 0x1A, + 24540 - 19968: jis0208<<14 | 0x10<<7 | 0x5D, + 24541 - 19968: jis0208<<14 | 0x36<<7 | 0x3A, + 24542 - 19968: jis0208<<14 | 0x59<<7 | 0x00, + 24544 - 19968: jis0208<<14 | 0x22<<7 | 0x48, + 24545 - 19968: jis0212<<14 | 0x1C<<7 | 0x22, + 24546 - 19968: jis0212<<14 | 0x1C<<7 | 0x23, + 24548 - 19968: jis0208<<14 | 0x36<<7 | 0x37, + 24552 - 19968: jis0212<<14 | 0x1C<<7 | 0x24, + 24553 - 19968: jis0212<<14 | 0x1C<<7 | 0x25, + 24554 - 19968: jis0212<<14 | 0x1C<<7 | 0x26, + 24555 - 19968: jis0208<<14 | 0x11<<7 | 0x56, + 24556 - 19968: jis0212<<14 | 0x1C<<7 | 0x27, + 24557 - 19968: jis0212<<14 | 0x1C<<7 | 0x28, + 24558 - 19968: jis0212<<14 | 0x1C<<7 | 0x29, + 24559 - 19968: jis0212<<14 | 0x1C<<7 | 0x2A, + 24560 - 19968: jis0208<<14 | 0x37<<7 | 0x0C, + 24561 - 19968: jis0208<<14 | 0x36<<7 | 0x39, + 24562 - 19968: jis0212<<14 | 0x1C<<7 | 0x2B, + 24563 - 19968: jis0212<<14 | 0x1C<<7 | 0x2C, + 24565 - 19968: jis0208<<14 | 0x26<<7 | 0x0F, + 24566 - 19968: jis0212<<14 | 0x1C<<7 | 0x2D, + 24568 - 19968: jis0208<<14 | 0x36<<7 | 0x38, + 24570 - 19968: jis0212<<14 | 0x1C<<7 | 0x2E, + 24571 - 19968: jis0208<<14 | 0x36<<7 | 0x36, + 24572 - 19968: jis0212<<14 | 0x1C<<7 | 0x2F, + 24573 - 19968: jis0208<<14 | 0x18<<7 | 0x59, + 24575 - 19968: jis0208<<14 | 0x36<<7 | 0x3C, + 24583 - 19968: jis0212<<14 | 0x1C<<7 | 0x30, + 24586 - 19968: jis0212<<14 | 0x1C<<7 | 0x31, + 24589 - 19968: jis0212<<14 | 0x1C<<7 | 0x32, + 24590 - 19968: jis0208<<14 | 0x36<<7 | 0x42, + 24591 - 19968: jis0208<<14 | 0x36<<7 | 0x48, + 24592 - 19968: jis0208<<14 | 0x36<<7 | 0x40, + 24594 - 19968: jis0208<<14 | 0x24<<7 | 0x3B, + 24595 - 19968: jis0212<<14 | 0x1C<<7 | 0x33, + 24596 - 19968: jis0212<<14 | 0x1C<<7 | 0x34, + 24597 - 19968: jis0208<<14 | 0x36<<7 | 0x45, + 24598 - 19968: jis0208<<14 | 0x28<<7 | 0x3C, + 24599 - 19968: jis0212<<14 | 0x1C<<7 | 0x35, + 24600 - 19968: jis0212<<14 | 0x1C<<7 | 0x36, + 24601 - 19968: jis0208<<14 | 0x36<<7 | 0x3F, + 24602 - 19968: jis0212<<14 | 0x1C<<7 | 0x37, + 24603 - 19968: jis0208<<14 | 0x36<<7 | 0x44, + 24604 - 19968: jis0208<<14 | 0x2D<<7 | 0x46, + 24605 - 19968: jis0208<<14 | 0x1A<<7 | 0x36, + 24607 - 19968: jis0212<<14 | 0x1C<<7 | 0x38, + 24608 - 19968: jis0208<<14 | 0x21<<7 | 0x34, + 24609 - 19968: jis0208<<14 | 0x36<<7 | 0x3D, + 24612 - 19968: jis0212<<14 | 0x1C<<7 | 0x39, + 24613 - 19968: jis0208<<14 | 0x14<<7 | 0x3D, + 24614 - 19968: jis0208<<14 | 0x36<<7 | 0x47, + 24615 - 19968: jis0208<<14 | 0x1F<<7 | 0x0C, + 24616 - 19968: jis0208<<14 | 0x10<<7 | 0x44, + 24617 - 19968: jis0208<<14 | 0x36<<7 | 0x41, + 24618 - 19968: jis0208<<14 | 0x11<<7 | 0x57, + 24619 - 19968: jis0208<<14 | 0x36<<7 | 0x46, + 24621 - 19968: jis0212<<14 | 0x1C<<7 | 0x3A, + 24623 - 19968: jis0208<<14 | 0x15<<7 | 0x10, + 24625 - 19968: jis0208<<14 | 0x36<<7 | 0x43, + 24627 - 19968: jis0212<<14 | 0x1C<<7 | 0x3B, + 24629 - 19968: jis0212<<14 | 0x1C<<7 | 0x3C, + 24634 - 19968: jis0208<<14 | 0x36<<7 | 0x49, + 24640 - 19968: jis0212<<14 | 0x1C<<7 | 0x3D, + 24641 - 19968: jis0208<<14 | 0x36<<7 | 0x4B, + 24642 - 19968: jis0208<<14 | 0x36<<7 | 0x55, + 24643 - 19968: jis0208<<14 | 0x36<<7 | 0x53, + 24646 - 19968: jis0208<<14 | 0x36<<7 | 0x50, + 24647 - 19968: jis0212<<14 | 0x1C<<7 | 0x3E, + 24648 - 19968: jis0212<<14 | 0x1C<<7 | 0x3F, + 24649 - 19968: jis0212<<14 | 0x1C<<7 | 0x40, + 24650 - 19968: jis0208<<14 | 0x36<<7 | 0x4F, + 24651 - 19968: jis0208<<14 | 0x2D<<7 | 0x57, + 24652 - 19968: jis0212<<14 | 0x1C<<7 | 0x41, + 24653 - 19968: jis0208<<14 | 0x36<<7 | 0x51, + 24656 - 19968: jis0208<<14 | 0x15<<7 | 0x11, + 24657 - 19968: jis0212<<14 | 0x1C<<7 | 0x42, + 24658 - 19968: jis0208<<14 | 0x18<<7 | 0x10, + 24660 - 19968: jis0212<<14 | 0x1C<<7 | 0x43, + 24661 - 19968: jis0208<<14 | 0x1C<<7 | 0x59, + 24662 - 19968: jis0212<<14 | 0x1C<<7 | 0x44, + 24663 - 19968: jis0212<<14 | 0x1C<<7 | 0x45, + 24665 - 19968: jis0208<<14 | 0x36<<7 | 0x58, + 24666 - 19968: jis0208<<14 | 0x36<<7 | 0x4A, + 24669 - 19968: jis0208<<14 | 0x59<<7 | 0x01, + 24671 - 19968: jis0208<<14 | 0x36<<7 | 0x4E, + 24672 - 19968: jis0208<<14 | 0x36<<7 | 0x3E, + 24673 - 19968: jis0212<<14 | 0x1C<<7 | 0x47, + 24674 - 19968: jis0208<<14 | 0x11<<7 | 0x59, + 24675 - 19968: jis0208<<14 | 0x36<<7 | 0x52, + 24676 - 19968: jis0208<<14 | 0x36<<7 | 0x54, + 24677 - 19968: jis0208<<14 | 0x22<<7 | 0x30, + 24679 - 19968: jis0212<<14 | 0x1C<<7 | 0x48, + 24680 - 19968: jis0208<<14 | 0x19<<7 | 0x07, + 24681 - 19968: jis0208<<14 | 0x11<<7 | 0x17, + 24682 - 19968: jis0208<<14 | 0x36<<7 | 0x4C, + 24683 - 19968: jis0208<<14 | 0x36<<7 | 0x57, + 24684 - 19968: jis0208<<14 | 0x36<<7 | 0x56, + 24685 - 19968: jis0208<<14 | 0x15<<7 | 0x12, + 24687 - 19968: jis0208<<14 | 0x21<<7 | 0x08, + 24688 - 19968: jis0208<<14 | 0x12<<7 | 0x45, + 24689 - 19968: jis0212<<14 | 0x1C<<7 | 0x49, + 24693 - 19968: jis0208<<14 | 0x16<<7 | 0x22, + 24695 - 19968: jis0208<<14 | 0x36<<7 | 0x4D, + 24702 - 19968: jis0212<<14 | 0x1C<<7 | 0x4A, + 24703 - 19968: jis0212<<14 | 0x1C<<7 | 0x4B, + 24705 - 19968: jis0208<<14 | 0x36<<7 | 0x59, + 24706 - 19968: jis0212<<14 | 0x1C<<7 | 0x4C, + 24707 - 19968: jis0208<<14 | 0x36<<7 | 0x5C, + 24708 - 19968: jis0208<<14 | 0x37<<7 | 0x00, + 24709 - 19968: jis0208<<14 | 0x59<<7 | 0x02, + 24710 - 19968: jis0212<<14 | 0x1C<<7 | 0x4D, + 24712 - 19968: jis0212<<14 | 0x1C<<7 | 0x4E, + 24713 - 19968: jis0208<<14 | 0x1B<<7 | 0x1C, + 24714 - 19968: jis0208<<14 | 0x59<<7 | 0x03, + 24715 - 19968: jis0208<<14 | 0x37<<7 | 0x06, + 24716 - 19968: jis0208<<14 | 0x23<<7 | 0x4F, + 24717 - 19968: jis0208<<14 | 0x36<<7 | 0x5A, + 24718 - 19968: jis0212<<14 | 0x1C<<7 | 0x50, + 24721 - 19968: jis0212<<14 | 0x1C<<7 | 0x51, + 24722 - 19968: jis0208<<14 | 0x37<<7 | 0x04, + 24723 - 19968: jis0212<<14 | 0x1C<<7 | 0x52, + 24724 - 19968: jis0208<<14 | 0x11<<7 | 0x58, + 24725 - 19968: jis0212<<14 | 0x1C<<7 | 0x53, + 24726 - 19968: jis0208<<14 | 0x37<<7 | 0x02, + 24727 - 19968: jis0208<<14 | 0x37<<7 | 0x03, + 24728 - 19968: jis0212<<14 | 0x1C<<7 | 0x54, + 24730 - 19968: jis0208<<14 | 0x36<<7 | 0x5D, + 24731 - 19968: jis0208<<14 | 0x37<<7 | 0x01, + 24733 - 19968: jis0212<<14 | 0x1C<<7 | 0x55, + 24734 - 19968: jis0212<<14 | 0x1C<<7 | 0x56, + 24735 - 19968: jis0208<<14 | 0x17<<7 | 0x46, + 24736 - 19968: jis0208<<14 | 0x2C<<7 | 0x09, + 24738 - 19968: jis0212<<14 | 0x1C<<7 | 0x57, + 24739 - 19968: jis0208<<14 | 0x13<<7 | 0x14, + 24740 - 19968: jis0212<<14 | 0x1C<<7 | 0x58, + 24741 - 19968: jis0212<<14 | 0x1C<<7 | 0x59, + 24742 - 19968: jis0208<<14 | 0x10<<7 | 0x38, + 24743 - 19968: jis0208<<14 | 0x37<<7 | 0x05, + 24744 - 19968: jis0212<<14 | 0x1C<<7 | 0x5A, + 24745 - 19968: jis0208<<14 | 0x26<<7 | 0x19, + 24746 - 19968: jis0208<<14 | 0x0F<<7 | 0x0C, + 24752 - 19968: jis0212<<14 | 0x1C<<7 | 0x5B, + 24753 - 19968: jis0212<<14 | 0x1C<<7 | 0x5C, + 24754 - 19968: jis0208<<14 | 0x27<<7 | 0x40, + 24755 - 19968: jis0208<<14 | 0x36<<7 | 0x3B, + 24756 - 19968: jis0208<<14 | 0x37<<7 | 0x0B, + 24757 - 19968: jis0208<<14 | 0x37<<7 | 0x0F, + 24758 - 19968: jis0208<<14 | 0x2B<<7 | 0x44, + 24759 - 19968: jis0212<<14 | 0x1C<<7 | 0x5D, + 24760 - 19968: jis0208<<14 | 0x37<<7 | 0x08, + 24763 - 19968: jis0212<<14 | 0x1D<<7 | 0x00, + 24764 - 19968: jis0208<<14 | 0x24<<7 | 0x48, + 24765 - 19968: jis0208<<14 | 0x37<<7 | 0x0D, + 24766 - 19968: jis0212<<14 | 0x1D<<7 | 0x01, + 24770 - 19968: jis0212<<14 | 0x1D<<7 | 0x02, + 24772 - 19968: jis0212<<14 | 0x1D<<7 | 0x03, + 24773 - 19968: jis0208<<14 | 0x1D<<7 | 0x4F, + 24774 - 19968: jis0208<<14 | 0x37<<7 | 0x0E, + 24775 - 19968: jis0208<<14 | 0x25<<7 | 0x36, + 24776 - 19968: jis0212<<14 | 0x1D<<7 | 0x04, + 24777 - 19968: jis0212<<14 | 0x1D<<7 | 0x05, + 24778 - 19968: jis0212<<14 | 0x1D<<7 | 0x06, + 24779 - 19968: jis0212<<14 | 0x1D<<7 | 0x07, + 24782 - 19968: jis0212<<14 | 0x1D<<7 | 0x08, + 24783 - 19968: jis0212<<14 | 0x1D<<7 | 0x09, + 24785 - 19968: jis0208<<14 | 0x2E<<7 | 0x26, + 24787 - 19968: jis0208<<14 | 0x37<<7 | 0x0A, + 24788 - 19968: jis0212<<14 | 0x1D<<7 | 0x0A, + 24789 - 19968: jis0208<<14 | 0x59<<7 | 0x05, + 24792 - 19968: jis0208<<14 | 0x37<<7 | 0x10, + 24793 - 19968: jis0212<<14 | 0x1D<<7 | 0x0C, + 24794 - 19968: jis0208<<14 | 0x18<<7 | 0x5A, + 24795 - 19968: jis0212<<14 | 0x1D<<7 | 0x0D, + 24796 - 19968: jis0208<<14 | 0x1F<<7 | 0x2A, + 24797 - 19968: jis0212<<14 | 0x1D<<7 | 0x0E, + 24798 - 19968: jis0208<<14 | 0x59<<7 | 0x04, + 24799 - 19968: jis0208<<14 | 0x0F<<7 | 0x33, + 24800 - 19968: jis0208<<14 | 0x37<<7 | 0x09, + 24801 - 19968: jis0208<<14 | 0x37<<7 | 0x07, + 24802 - 19968: jis0212<<14 | 0x1D<<7 | 0x10, + 24803 - 19968: jis0208<<14 | 0x20<<7 | 0x39, + 24805 - 19968: jis0212<<14 | 0x1D<<7 | 0x11, + 24807 - 19968: jis0208<<14 | 0x36<<7 | 0x5B, + 24808 - 19968: jis0208<<14 | 0x1A<<7 | 0x13, + 24816 - 19968: jis0208<<14 | 0x21<<7 | 0x25, + 24817 - 19968: jis0208<<14 | 0x37<<7 | 0x1C, + 24818 - 19968: jis0208<<14 | 0x59<<7 | 0x07, + 24819 - 19968: jis0208<<14 | 0x20<<7 | 0x3A, + 24820 - 19968: jis0208<<14 | 0x37<<7 | 0x17, + 24821 - 19968: jis0212<<14 | 0x1D<<7 | 0x13, + 24822 - 19968: jis0208<<14 | 0x37<<7 | 0x14, + 24823 - 19968: jis0208<<14 | 0x37<<7 | 0x15, + 24824 - 19968: jis0212<<14 | 0x1D<<7 | 0x14, + 24825 - 19968: jis0208<<14 | 0x1B<<7 | 0x45, + 24826 - 19968: jis0208<<14 | 0x37<<7 | 0x18, + 24827 - 19968: jis0208<<14 | 0x37<<7 | 0x1B, + 24828 - 19968: jis0212<<14 | 0x1D<<7 | 0x15, + 24829 - 19968: jis0212<<14 | 0x1D<<7 | 0x16, + 24832 - 19968: jis0208<<14 | 0x37<<7 | 0x16, + 24833 - 19968: jis0208<<14 | 0x1C<<7 | 0x04, + 24834 - 19968: jis0212<<14 | 0x1D<<7 | 0x17, + 24835 - 19968: jis0208<<14 | 0x37<<7 | 0x19, + 24838 - 19968: jis0208<<14 | 0x37<<7 | 0x13, + 24839 - 19968: jis0212<<14 | 0x1D<<7 | 0x18, + 24840 - 19968: jis0208<<14 | 0x2B<<7 | 0x5B, + 24841 - 19968: jis0208<<14 | 0x2B<<7 | 0x5A, + 24842 - 19968: jis0212<<14 | 0x1D<<7 | 0x19, + 24844 - 19968: jis0212<<14 | 0x1D<<7 | 0x1A, + 24845 - 19968: jis0208<<14 | 0x37<<7 | 0x1D, + 24846 - 19968: jis0208<<14 | 0x37<<7 | 0x1E, + 24847 - 19968: jis0208<<14 | 0x0F<<7 | 0x34, + 24848 - 19968: jis0212<<14 | 0x1D<<7 | 0x1B, + 24849 - 19968: jis0208<<14 | 0x59<<7 | 0x08, + 24850 - 19968: jis0212<<14 | 0x1D<<7 | 0x1D, + 24851 - 19968: jis0212<<14 | 0x1D<<7 | 0x1E, + 24852 - 19968: jis0212<<14 | 0x1D<<7 | 0x1F, + 24853 - 19968: jis0208<<14 | 0x37<<7 | 0x12, + 24854 - 19968: jis0212<<14 | 0x1D<<7 | 0x20, + 24855 - 19968: jis0212<<14 | 0x1D<<7 | 0x21, + 24857 - 19968: jis0212<<14 | 0x1D<<7 | 0x22, + 24858 - 19968: jis0208<<14 | 0x15<<7 | 0x51, + 24859 - 19968: jis0208<<14 | 0x0F<<7 | 0x05, + 24860 - 19968: jis0212<<14 | 0x1D<<7 | 0x23, + 24862 - 19968: jis0212<<14 | 0x1D<<7 | 0x24, + 24863 - 19968: jis0208<<14 | 0x13<<7 | 0x15, + 24864 - 19968: jis0208<<14 | 0x59<<7 | 0x06, + 24865 - 19968: jis0208<<14 | 0x37<<7 | 0x1A, + 24866 - 19968: jis0212<<14 | 0x1D<<7 | 0x25, + 24871 - 19968: jis0208<<14 | 0x37<<7 | 0x22, + 24872 - 19968: jis0208<<14 | 0x37<<7 | 0x21, + 24874 - 19968: jis0212<<14 | 0x1D<<7 | 0x26, + 24875 - 19968: jis0212<<14 | 0x1D<<7 | 0x27, + 24876 - 19968: jis0208<<14 | 0x37<<7 | 0x26, + 24880 - 19968: jis0208<<14 | 0x59<<7 | 0x0A, + 24881 - 19968: jis0212<<14 | 0x1D<<7 | 0x29, + 24884 - 19968: jis0208<<14 | 0x37<<7 | 0x27, + 24885 - 19968: jis0212<<14 | 0x1D<<7 | 0x2A, + 24886 - 19968: jis0212<<14 | 0x1D<<7 | 0x2B, + 24887 - 19968: jis0208<<14 | 0x59<<7 | 0x09, + 24889 - 19968: jis0212<<14 | 0x1D<<7 | 0x2D, + 24892 - 19968: jis0208<<14 | 0x37<<7 | 0x25, + 24893 - 19968: jis0208<<14 | 0x37<<7 | 0x28, + 24894 - 19968: jis0208<<14 | 0x37<<7 | 0x20, + 24895 - 19968: jis0208<<14 | 0x37<<7 | 0x24, + 24897 - 19968: jis0212<<14 | 0x1D<<7 | 0x2E, + 24898 - 19968: jis0208<<14 | 0x37<<7 | 0x29, + 24900 - 19968: jis0208<<14 | 0x37<<7 | 0x2A, + 24901 - 19968: jis0212<<14 | 0x1D<<7 | 0x2F, + 24902 - 19968: jis0212<<14 | 0x1D<<7 | 0x30, + 24903 - 19968: jis0208<<14 | 0x37<<7 | 0x1F, + 24904 - 19968: jis0208<<14 | 0x1A<<7 | 0x5B, + 24905 - 19968: jis0212<<14 | 0x1D<<7 | 0x31, + 24906 - 19968: jis0208<<14 | 0x37<<7 | 0x23, + 24907 - 19968: jis0208<<14 | 0x21<<7 | 0x35, + 24908 - 19968: jis0208<<14 | 0x18<<7 | 0x11, + 24909 - 19968: jis0208<<14 | 0x37<<7 | 0x11, + 24910 - 19968: jis0208<<14 | 0x1E<<7 | 0x14, + 24915 - 19968: jis0208<<14 | 0x37<<7 | 0x37, + 24917 - 19968: jis0208<<14 | 0x29<<7 | 0x48, + 24920 - 19968: jis0208<<14 | 0x37<<7 | 0x2D, + 24921 - 19968: jis0208<<14 | 0x37<<7 | 0x2E, + 24922 - 19968: jis0208<<14 | 0x37<<7 | 0x2F, + 24925 - 19968: jis0208<<14 | 0x37<<7 | 0x36, + 24926 - 19968: jis0212<<14 | 0x1D<<7 | 0x32, + 24927 - 19968: jis0208<<14 | 0x37<<7 | 0x35, + 24928 - 19968: jis0212<<14 | 0x1D<<7 | 0x33, + 24930 - 19968: jis0208<<14 | 0x2A<<7 | 0x5C, + 24931 - 19968: jis0208<<14 | 0x13<<7 | 0x16, + 24933 - 19968: jis0208<<14 | 0x37<<7 | 0x33, + 24935 - 19968: jis0208<<14 | 0x16<<7 | 0x24, + 24936 - 19968: jis0208<<14 | 0x12<<7 | 0x13, + 24939 - 19968: jis0208<<14 | 0x37<<7 | 0x30, + 24940 - 19968: jis0212<<14 | 0x1D<<7 | 0x34, + 24942 - 19968: jis0208<<14 | 0x2D<<7 | 0x17, + 24943 - 19968: jis0208<<14 | 0x37<<7 | 0x32, + 24944 - 19968: jis0208<<14 | 0x0F<<7 | 0x35, + 24945 - 19968: jis0208<<14 | 0x37<<7 | 0x34, + 24946 - 19968: jis0212<<14 | 0x1D<<7 | 0x35, + 24947 - 19968: jis0208<<14 | 0x37<<7 | 0x2B, + 24948 - 19968: jis0208<<14 | 0x37<<7 | 0x31, + 24949 - 19968: jis0208<<14 | 0x37<<7 | 0x38, + 24950 - 19968: jis0208<<14 | 0x16<<7 | 0x23, + 24951 - 19968: jis0208<<14 | 0x37<<7 | 0x2C, + 24952 - 19968: jis0212<<14 | 0x1D<<7 | 0x36, + 24955 - 19968: jis0212<<14 | 0x1D<<7 | 0x37, + 24956 - 19968: jis0212<<14 | 0x1D<<7 | 0x38, + 24958 - 19968: jis0208<<14 | 0x2C<<7 | 0x3C, + 24959 - 19968: jis0212<<14 | 0x1D<<7 | 0x39, + 24960 - 19968: jis0212<<14 | 0x1D<<7 | 0x3A, + 24961 - 19968: jis0212<<14 | 0x1D<<7 | 0x3B, + 24962 - 19968: jis0208<<14 | 0x2C<<7 | 0x0A, + 24963 - 19968: jis0212<<14 | 0x1D<<7 | 0x3C, + 24964 - 19968: jis0212<<14 | 0x1D<<7 | 0x3D, + 24967 - 19968: jis0208<<14 | 0x37<<7 | 0x3B, + 24970 - 19968: jis0208<<14 | 0x37<<7 | 0x3F, + 24971 - 19968: jis0212<<14 | 0x1D<<7 | 0x3E, + 24973 - 19968: jis0212<<14 | 0x1D<<7 | 0x3F, + 24974 - 19968: jis0208<<14 | 0x20<<7 | 0x5D, + 24976 - 19968: jis0208<<14 | 0x2D<<7 | 0x58, + 24977 - 19968: jis0208<<14 | 0x37<<7 | 0x40, + 24978 - 19968: jis0212<<14 | 0x1D<<7 | 0x40, + 24979 - 19968: jis0212<<14 | 0x1D<<7 | 0x41, + 24980 - 19968: jis0208<<14 | 0x37<<7 | 0x3D, + 24982 - 19968: jis0208<<14 | 0x37<<7 | 0x3A, + 24983 - 19968: jis0212<<14 | 0x1D<<7 | 0x42, + 24984 - 19968: jis0208<<14 | 0x59<<7 | 0x0B, + 24985 - 19968: jis0208<<14 | 0x37<<7 | 0x39, + 24986 - 19968: jis0208<<14 | 0x37<<7 | 0x3E, + 24988 - 19968: jis0212<<14 | 0x1D<<7 | 0x44, + 24989 - 19968: jis0212<<14 | 0x1D<<7 | 0x45, + 24991 - 19968: jis0212<<14 | 0x1D<<7 | 0x46, + 24992 - 19968: jis0212<<14 | 0x1D<<7 | 0x47, + 24996 - 19968: jis0208<<14 | 0x29<<7 | 0x0F, + 24997 - 19968: jis0212<<14 | 0x1D<<7 | 0x48, + 24999 - 19968: jis0208<<14 | 0x25<<7 | 0x13, + 25000 - 19968: jis0212<<14 | 0x1D<<7 | 0x49, + 25001 - 19968: jis0208<<14 | 0x16<<7 | 0x25, + 25002 - 19968: jis0212<<14 | 0x1D<<7 | 0x4A, + 25003 - 19968: jis0208<<14 | 0x37<<7 | 0x41, + 25004 - 19968: jis0208<<14 | 0x37<<7 | 0x3C, + 25005 - 19968: jis0212<<14 | 0x1D<<7 | 0x4B, + 25006 - 19968: jis0208<<14 | 0x37<<7 | 0x42, + 25010 - 19968: jis0208<<14 | 0x16<<7 | 0x5A, + 25014 - 19968: jis0208<<14 | 0x11<<7 | 0x10, + 25016 - 19968: jis0212<<14 | 0x1D<<7 | 0x4C, + 25017 - 19968: jis0212<<14 | 0x1D<<7 | 0x4D, + 25018 - 19968: jis0208<<14 | 0x37<<7 | 0x4A, + 25020 - 19968: jis0212<<14 | 0x1D<<7 | 0x4E, + 25022 - 19968: jis0208<<14 | 0x13<<7 | 0x17, + 25024 - 19968: jis0212<<14 | 0x1D<<7 | 0x4F, + 25025 - 19968: jis0212<<14 | 0x1D<<7 | 0x50, + 25026 - 19968: jis0212<<14 | 0x1D<<7 | 0x51, + 25027 - 19968: jis0208<<14 | 0x37<<7 | 0x48, + 25030 - 19968: jis0208<<14 | 0x37<<7 | 0x49, + 25031 - 19968: jis0208<<14 | 0x19<<7 | 0x08, + 25032 - 19968: jis0208<<14 | 0x37<<7 | 0x47, + 25033 - 19968: jis0208<<14 | 0x37<<7 | 0x45, + 25034 - 19968: jis0208<<14 | 0x37<<7 | 0x44, + 25035 - 19968: jis0208<<14 | 0x37<<7 | 0x4B, + 25036 - 19968: jis0208<<14 | 0x37<<7 | 0x43, + 25037 - 19968: jis0208<<14 | 0x37<<7 | 0x4D, + 25038 - 19968: jis0212<<14 | 0x1D<<7 | 0x52, + 25039 - 19968: jis0212<<14 | 0x1D<<7 | 0x53, + 25040 - 19968: jis0208<<14 | 0x11<<7 | 0x5A, + 25045 - 19968: jis0212<<14 | 0x1D<<7 | 0x54, + 25052 - 19968: jis0212<<14 | 0x1D<<7 | 0x55, + 25053 - 19968: jis0212<<14 | 0x1D<<7 | 0x56, + 25054 - 19968: jis0212<<14 | 0x1D<<7 | 0x57, + 25055 - 19968: jis0212<<14 | 0x1D<<7 | 0x58, + 25057 - 19968: jis0212<<14 | 0x1D<<7 | 0x59, + 25058 - 19968: jis0212<<14 | 0x1D<<7 | 0x5A, + 25059 - 19968: jis0208<<14 | 0x37<<7 | 0x4F, + 25061 - 19968: jis0212<<14 | 0x1D<<7 | 0x5D, + 25062 - 19968: jis0208<<14 | 0x37<<7 | 0x4E, + 25063 - 19968: jis0212<<14 | 0x1D<<7 | 0x5B, + 25065 - 19968: jis0212<<14 | 0x1D<<7 | 0x5C, + 25068 - 19968: jis0212<<14 | 0x1E<<7 | 0x00, + 25069 - 19968: jis0212<<14 | 0x1E<<7 | 0x01, + 25071 - 19968: jis0212<<14 | 0x1E<<7 | 0x02, + 25074 - 19968: jis0208<<14 | 0x23<<7 | 0x07, + 25076 - 19968: jis0208<<14 | 0x37<<7 | 0x52, + 25078 - 19968: jis0208<<14 | 0x37<<7 | 0x50, + 25079 - 19968: jis0208<<14 | 0x37<<7 | 0x46, + 25080 - 19968: jis0208<<14 | 0x16<<7 | 0x5B, + 25082 - 19968: jis0208<<14 | 0x37<<7 | 0x51, + 25084 - 19968: jis0208<<14 | 0x37<<7 | 0x55, + 25085 - 19968: jis0208<<14 | 0x37<<7 | 0x54, + 25086 - 19968: jis0208<<14 | 0x37<<7 | 0x56, + 25087 - 19968: jis0208<<14 | 0x37<<7 | 0x53, + 25088 - 19968: jis0208<<14 | 0x37<<7 | 0x57, + 25089 - 19968: jis0212<<14 | 0x1E<<7 | 0x03, + 25091 - 19968: jis0212<<14 | 0x1E<<7 | 0x04, + 25092 - 19968: jis0212<<14 | 0x1E<<7 | 0x05, + 25095 - 19968: jis0212<<14 | 0x1E<<7 | 0x06, + 25096 - 19968: jis0208<<14 | 0x37<<7 | 0x58, + 25097 - 19968: jis0208<<14 | 0x37<<7 | 0x59, + 25098 - 19968: jis0208<<14 | 0x29<<7 | 0x49, + 25100 - 19968: jis0208<<14 | 0x37<<7 | 0x5B, + 25101 - 19968: jis0208<<14 | 0x37<<7 | 0x5A, + 25102 - 19968: jis0208<<14 | 0x1C<<7 | 0x1E, + 25104 - 19968: jis0208<<14 | 0x1F<<7 | 0x0D, + 25105 - 19968: jis0208<<14 | 0x11<<7 | 0x45, + 25106 - 19968: jis0208<<14 | 0x11<<7 | 0x5B, + 25107 - 19968: jis0208<<14 | 0x59<<7 | 0x0C, + 25108 - 19968: jis0208<<14 | 0x37<<7 | 0x5C, + 25109 - 19968: jis0212<<14 | 0x1E<<7 | 0x08, + 25110 - 19968: jis0208<<14 | 0x0F<<7 | 0x1E, + 25114 - 19968: jis0208<<14 | 0x1F<<7 | 0x2B, + 25115 - 19968: jis0208<<14 | 0x37<<7 | 0x5D, + 25116 - 19968: jis0212<<14 | 0x1E<<7 | 0x09, + 25117 - 19968: jis0208<<14 | 0x4B<<7 | 0x22, + 25118 - 19968: jis0208<<14 | 0x38<<7 | 0x00, + 25119 - 19968: jis0208<<14 | 0x16<<7 | 0x40, + 25120 - 19968: jis0212<<14 | 0x1E<<7 | 0x0A, + 25121 - 19968: jis0208<<14 | 0x38<<7 | 0x01, + 25122 - 19968: jis0212<<14 | 0x1E<<7 | 0x0B, + 25123 - 19968: jis0212<<14 | 0x1E<<7 | 0x0C, + 25126 - 19968: jis0208<<14 | 0x1F<<7 | 0x4E, + 25127 - 19968: jis0212<<14 | 0x1E<<7 | 0x0D, + 25129 - 19968: jis0212<<14 | 0x1E<<7 | 0x0E, + 25130 - 19968: jis0208<<14 | 0x38<<7 | 0x02, + 25131 - 19968: jis0212<<14 | 0x1E<<7 | 0x0F, + 25134 - 19968: jis0208<<14 | 0x38<<7 | 0x03, + 25135 - 19968: jis0208<<14 | 0x14<<7 | 0x19, + 25136 - 19968: jis0208<<14 | 0x38<<7 | 0x04, + 25138 - 19968: jis0208<<14 | 0x38<<7 | 0x05, + 25139 - 19968: jis0208<<14 | 0x38<<7 | 0x06, + 25140 - 19968: jis0208<<14 | 0x21<<7 | 0x36, + 25144 - 19968: jis0208<<14 | 0x17<<7 | 0x2C, + 25145 - 19968: jis0212<<14 | 0x1E<<7 | 0x10, + 25147 - 19968: jis0208<<14 | 0x2B<<7 | 0x40, + 25149 - 19968: jis0212<<14 | 0x1E<<7 | 0x11, + 25151 - 19968: jis0208<<14 | 0x2A<<7 | 0x1B, + 25152 - 19968: jis0208<<14 | 0x1C<<7 | 0x49, + 25153 - 19968: jis0208<<14 | 0x38<<7 | 0x07, + 25154 - 19968: jis0212<<14 | 0x1E<<7 | 0x12, + 25155 - 19968: jis0212<<14 | 0x1E<<7 | 0x13, + 25156 - 19968: jis0212<<14 | 0x1E<<7 | 0x14, + 25158 - 19968: jis0212<<14 | 0x1E<<7 | 0x15, + 25159 - 19968: jis0208<<14 | 0x1F<<7 | 0x4F, + 25160 - 19968: jis0208<<14 | 0x4D<<7 | 0x1C, + 25161 - 19968: jis0208<<14 | 0x27<<7 | 0x41, + 25163 - 19968: jis0208<<14 | 0x1B<<7 | 0x49, + 25164 - 19968: jis0212<<14 | 0x1E<<7 | 0x16, + 25165 - 19968: jis0208<<14 | 0x19<<7 | 0x2C, + 25166 - 19968: jis0208<<14 | 0x38<<7 | 0x08, + 25168 - 19968: jis0212<<14 | 0x1E<<7 | 0x17, + 25169 - 19968: jis0212<<14 | 0x1E<<7 | 0x18, + 25170 - 19968: jis0212<<14 | 0x1E<<7 | 0x19, + 25171 - 19968: jis0208<<14 | 0x21<<7 | 0x26, + 25172 - 19968: jis0212<<14 | 0x1E<<7 | 0x1A, + 25173 - 19968: jis0208<<14 | 0x29<<7 | 0x06, + 25174 - 19968: jis0212<<14 | 0x1E<<7 | 0x1B, + 25176 - 19968: jis0208<<14 | 0x21<<7 | 0x50, + 25178 - 19968: jis0212<<14 | 0x1E<<7 | 0x1C, + 25179 - 19968: jis0208<<14 | 0x38<<7 | 0x0B, + 25180 - 19968: jis0212<<14 | 0x1E<<7 | 0x1D, + 25182 - 19968: jis0208<<14 | 0x38<<7 | 0x09, + 25184 - 19968: jis0208<<14 | 0x38<<7 | 0x0C, + 25187 - 19968: jis0208<<14 | 0x38<<7 | 0x0A, + 25188 - 19968: jis0212<<14 | 0x1E<<7 | 0x1E, + 25192 - 19968: jis0208<<14 | 0x38<<7 | 0x0D, + 25197 - 19968: jis0212<<14 | 0x1E<<7 | 0x1F, + 25198 - 19968: jis0208<<14 | 0x29<<7 | 0x10, + 25199 - 19968: jis0212<<14 | 0x1E<<7 | 0x20, + 25201 - 19968: jis0208<<14 | 0x0F<<7 | 0x16, + 25203 - 19968: jis0212<<14 | 0x1E<<7 | 0x21, + 25206 - 19968: jis0208<<14 | 0x28<<7 | 0x3D, + 25209 - 19968: jis0208<<14 | 0x27<<7 | 0x42, + 25210 - 19968: jis0212<<14 | 0x1E<<7 | 0x22, + 25212 - 19968: jis0208<<14 | 0x38<<7 | 0x0E, + 25213 - 19968: jis0212<<14 | 0x1E<<7 | 0x23, + 25214 - 19968: jis0208<<14 | 0x38<<7 | 0x11, + 25215 - 19968: jis0208<<14 | 0x1D<<7 | 0x14, + 25216 - 19968: jis0208<<14 | 0x14<<7 | 0x1A, + 25218 - 19968: jis0208<<14 | 0x38<<7 | 0x0F, + 25219 - 19968: jis0208<<14 | 0x38<<7 | 0x16, + 25220 - 19968: jis0208<<14 | 0x1D<<7 | 0x15, + 25225 - 19968: jis0208<<14 | 0x38<<7 | 0x10, + 25226 - 19968: jis0208<<14 | 0x26<<7 | 0x23, + 25229 - 19968: jis0212<<14 | 0x1E<<7 | 0x24, + 25230 - 19968: jis0212<<14 | 0x1E<<7 | 0x25, + 25231 - 19968: jis0212<<14 | 0x1E<<7 | 0x26, + 25232 - 19968: jis0212<<14 | 0x1E<<7 | 0x27, + 25233 - 19968: jis0208<<14 | 0x2C<<7 | 0x3D, + 25234 - 19968: jis0208<<14 | 0x38<<7 | 0x12, + 25235 - 19968: jis0208<<14 | 0x38<<7 | 0x13, + 25236 - 19968: jis0208<<14 | 0x38<<7 | 0x17, + 25237 - 19968: jis0208<<14 | 0x24<<7 | 0x49, + 25238 - 19968: jis0208<<14 | 0x38<<7 | 0x14, + 25239 - 19968: jis0208<<14 | 0x18<<7 | 0x12, + 25240 - 19968: jis0208<<14 | 0x1F<<7 | 0x3D, + 25243 - 19968: jis0208<<14 | 0x38<<7 | 0x25, + 25244 - 19968: jis0208<<14 | 0x27<<7 | 0x13, + 25246 - 19968: jis0208<<14 | 0x21<<7 | 0x51, + 25254 - 19968: jis0208<<14 | 0x59<<7 | 0x0D, + 25256 - 19968: jis0212<<14 | 0x1E<<7 | 0x29, + 25259 - 19968: jis0208<<14 | 0x27<<7 | 0x43, + 25260 - 19968: jis0208<<14 | 0x39<<7 | 0x0C, + 25265 - 19968: jis0208<<14 | 0x29<<7 | 0x59, + 25267 - 19968: jis0212<<14 | 0x1E<<7 | 0x2A, + 25269 - 19968: jis0208<<14 | 0x23<<7 | 0x50, + 25270 - 19968: jis0212<<14 | 0x1E<<7 | 0x2B, + 25271 - 19968: jis0212<<14 | 0x1E<<7 | 0x2C, + 25273 - 19968: jis0208<<14 | 0x2A<<7 | 0x54, + 25274 - 19968: jis0212<<14 | 0x1E<<7 | 0x2D, + 25275 - 19968: jis0208<<14 | 0x38<<7 | 0x1A, + 25276 - 19968: jis0208<<14 | 0x11<<7 | 0x00, + 25277 - 19968: jis0208<<14 | 0x22<<7 | 0x49, + 25278 - 19968: jis0212<<14 | 0x1E<<7 | 0x2E, + 25279 - 19968: jis0212<<14 | 0x1E<<7 | 0x2F, + 25282 - 19968: jis0208<<14 | 0x38<<7 | 0x23, + 25284 - 19968: jis0212<<14 | 0x1E<<7 | 0x30, + 25285 - 19968: jis0208<<14 | 0x22<<7 | 0x13, + 25286 - 19968: jis0208<<14 | 0x38<<7 | 0x1D, + 25287 - 19968: jis0208<<14 | 0x38<<7 | 0x24, + 25288 - 19968: jis0208<<14 | 0x38<<7 | 0x1F, + 25289 - 19968: jis0208<<14 | 0x38<<7 | 0x26, + 25290 - 19968: jis0208<<14 | 0x38<<7 | 0x22, + 25292 - 19968: jis0208<<14 | 0x38<<7 | 0x21, + 25293 - 19968: jis0208<<14 | 0x26<<7 | 0x4E, + 25294 - 19968: jis0212<<14 | 0x1E<<7 | 0x31, + 25295 - 19968: jis0208<<14 | 0x38<<7 | 0x1B, + 25296 - 19968: jis0208<<14 | 0x11<<7 | 0x5C, + 25297 - 19968: jis0208<<14 | 0x38<<7 | 0x19, + 25298 - 19968: jis0208<<14 | 0x14<<7 | 0x50, + 25299 - 19968: jis0208<<14 | 0x21<<7 | 0x52, + 25300 - 19968: jis0208<<14 | 0x38<<7 | 0x15, + 25301 - 19968: jis0212<<14 | 0x1E<<7 | 0x32, + 25302 - 19968: jis0212<<14 | 0x1E<<7 | 0x33, + 25303 - 19968: jis0208<<14 | 0x38<<7 | 0x18, + 25304 - 19968: jis0208<<14 | 0x18<<7 | 0x13, + 25305 - 19968: jis0208<<14 | 0x1F<<7 | 0x3A, + 25306 - 19968: jis0212<<14 | 0x1E<<7 | 0x34, + 25307 - 19968: jis0208<<14 | 0x1D<<7 | 0x16, + 25308 - 19968: jis0208<<14 | 0x38<<7 | 0x20, + 25309 - 19968: jis0208<<14 | 0x26<<7 | 0x31, + 25312 - 19968: jis0208<<14 | 0x14<<7 | 0x51, + 25313 - 19968: jis0208<<14 | 0x12<<7 | 0x27, + 25322 - 19968: jis0212<<14 | 0x1E<<7 | 0x35, + 25324 - 19968: jis0208<<14 | 0x12<<7 | 0x46, + 25325 - 19968: jis0208<<14 | 0x1E<<7 | 0x00, + 25326 - 19968: jis0208<<14 | 0x38<<7 | 0x28, + 25327 - 19968: jis0208<<14 | 0x38<<7 | 0x2D, + 25329 - 19968: jis0208<<14 | 0x38<<7 | 0x29, + 25330 - 19968: jis0212<<14 | 0x1E<<7 | 0x36, + 25331 - 19968: jis0208<<14 | 0x16<<7 | 0x5C, + 25332 - 19968: jis0212<<14 | 0x1E<<7 | 0x37, + 25333 - 19968: jis0208<<14 | 0x38<<7 | 0x2E, + 25334 - 19968: jis0208<<14 | 0x1A<<7 | 0x01, + 25335 - 19968: jis0208<<14 | 0x18<<7 | 0x48, + 25340 - 19968: jis0212<<14 | 0x1E<<7 | 0x38, + 25341 - 19968: jis0212<<14 | 0x1E<<7 | 0x39, + 25342 - 19968: jis0208<<14 | 0x1C<<7 | 0x05, + 25343 - 19968: jis0208<<14 | 0x38<<7 | 0x1C, + 25345 - 19968: jis0208<<14 | 0x1A<<7 | 0x5C, + 25346 - 19968: jis0208<<14 | 0x38<<7 | 0x2B, + 25347 - 19968: jis0212<<14 | 0x1E<<7 | 0x3A, + 25348 - 19968: jis0212<<14 | 0x1E<<7 | 0x3B, + 25351 - 19968: jis0208<<14 | 0x1A<<7 | 0x37, + 25352 - 19968: jis0208<<14 | 0x38<<7 | 0x2C, + 25353 - 19968: jis0208<<14 | 0x0F<<7 | 0x23, + 25354 - 19968: jis0212<<14 | 0x1E<<7 | 0x3C, + 25355 - 19968: jis0212<<14 | 0x1E<<7 | 0x3D, + 25356 - 19968: jis0208<<14 | 0x38<<7 | 0x27, + 25357 - 19968: jis0212<<14 | 0x1E<<7 | 0x3E, + 25360 - 19968: jis0212<<14 | 0x1E<<7 | 0x3F, + 25361 - 19968: jis0208<<14 | 0x23<<7 | 0x08, + 25363 - 19968: jis0212<<14 | 0x1E<<7 | 0x40, + 25366 - 19968: jis0212<<14 | 0x1E<<7 | 0x41, + 25368 - 19968: jis0212<<14 | 0x1E<<7 | 0x42, + 25369 - 19968: jis0208<<14 | 0x14<<7 | 0x52, + 25375 - 19968: jis0208<<14 | 0x15<<7 | 0x13, + 25383 - 19968: jis0208<<14 | 0x38<<7 | 0x2A, + 25384 - 19968: jis0208<<14 | 0x0F<<7 | 0x06, + 25385 - 19968: jis0212<<14 | 0x1E<<7 | 0x43, + 25386 - 19968: jis0212<<14 | 0x1E<<7 | 0x44, + 25387 - 19968: jis0208<<14 | 0x19<<7 | 0x22, + 25389 - 19968: jis0212<<14 | 0x1E<<7 | 0x45, + 25391 - 19968: jis0208<<14 | 0x1E<<7 | 0x15, + 25397 - 19968: jis0212<<14 | 0x1E<<7 | 0x46, + 25398 - 19968: jis0212<<14 | 0x1E<<7 | 0x47, + 25401 - 19968: jis0212<<14 | 0x1E<<7 | 0x48, + 25402 - 19968: jis0208<<14 | 0x23<<7 | 0x51, + 25404 - 19968: jis0212<<14 | 0x1E<<7 | 0x49, + 25405 - 19968: jis0208<<14 | 0x27<<7 | 0x33, + 25406 - 19968: jis0208<<14 | 0x38<<7 | 0x30, + 25407 - 19968: jis0208<<14 | 0x20<<7 | 0x3D, + 25409 - 19968: jis0212<<14 | 0x1E<<7 | 0x4A, + 25410 - 19968: jis0212<<14 | 0x1E<<7 | 0x4B, + 25411 - 19968: jis0212<<14 | 0x1E<<7 | 0x4C, + 25412 - 19968: jis0212<<14 | 0x1E<<7 | 0x4D, + 25414 - 19968: jis0212<<14 | 0x1E<<7 | 0x4E, + 25417 - 19968: jis0208<<14 | 0x21<<7 | 0x09, + 25418 - 19968: jis0212<<14 | 0x1E<<7 | 0x4F, + 25419 - 19968: jis0212<<14 | 0x1E<<7 | 0x50, + 25420 - 19968: jis0208<<14 | 0x1A<<7 | 0x0A, + 25421 - 19968: jis0208<<14 | 0x38<<7 | 0x31, + 25422 - 19968: jis0212<<14 | 0x1E<<7 | 0x51, + 25423 - 19968: jis0208<<14 | 0x38<<7 | 0x33, + 25424 - 19968: jis0208<<14 | 0x38<<7 | 0x2F, + 25426 - 19968: jis0212<<14 | 0x1E<<7 | 0x52, + 25427 - 19968: jis0212<<14 | 0x1E<<7 | 0x53, + 25428 - 19968: jis0212<<14 | 0x1E<<7 | 0x54, + 25429 - 19968: jis0208<<14 | 0x29<<7 | 0x40, + 25431 - 19968: jis0208<<14 | 0x23<<7 | 0x1C, + 25432 - 19968: jis0212<<14 | 0x1E<<7 | 0x55, + 25435 - 19968: jis0212<<14 | 0x1E<<7 | 0x56, + 25436 - 19968: jis0208<<14 | 0x20<<7 | 0x3B, + 25445 - 19968: jis0212<<14 | 0x1E<<7 | 0x57, + 25446 - 19968: jis0212<<14 | 0x1E<<7 | 0x58, + 25447 - 19968: jis0208<<14 | 0x29<<7 | 0x5A, + 25448 - 19968: jis0208<<14 | 0x1B<<7 | 0x2D, + 25449 - 19968: jis0208<<14 | 0x38<<7 | 0x3F, + 25451 - 19968: jis0208<<14 | 0x38<<7 | 0x3E, + 25452 - 19968: jis0212<<14 | 0x1E<<7 | 0x59, + 25453 - 19968: jis0212<<14 | 0x1E<<7 | 0x5A, + 25454 - 19968: jis0208<<14 | 0x1E<<7 | 0x57, + 25457 - 19968: jis0212<<14 | 0x1E<<7 | 0x5B, + 25458 - 19968: jis0208<<14 | 0x16<<7 | 0x5D, + 25460 - 19968: jis0212<<14 | 0x1E<<7 | 0x5C, + 25461 - 19968: jis0212<<14 | 0x1E<<7 | 0x5D, + 25462 - 19968: jis0208<<14 | 0x38<<7 | 0x38, + 25463 - 19968: jis0208<<14 | 0x1D<<7 | 0x18, + 25464 - 19968: jis0212<<14 | 0x1F<<7 | 0x00, + 25466 - 19968: jis0208<<14 | 0x25<<7 | 0x47, + 25467 - 19968: jis0208<<14 | 0x26<<7 | 0x10, + 25468 - 19968: jis0212<<14 | 0x1F<<7 | 0x01, + 25469 - 19968: jis0212<<14 | 0x1F<<7 | 0x02, + 25471 - 19968: jis0212<<14 | 0x1F<<7 | 0x03, + 25472 - 19968: jis0208<<14 | 0x38<<7 | 0x36, + 25474 - 19968: jis0212<<14 | 0x1F<<7 | 0x04, + 25475 - 19968: jis0208<<14 | 0x20<<7 | 0x3C, + 25476 - 19968: jis0212<<14 | 0x1F<<7 | 0x05, + 25479 - 19968: jis0212<<14 | 0x1F<<7 | 0x06, + 25480 - 19968: jis0208<<14 | 0x1B<<7 | 0x57, + 25481 - 19968: jis0208<<14 | 0x38<<7 | 0x3B, + 25482 - 19968: jis0212<<14 | 0x1F<<7 | 0x07, + 25484 - 19968: jis0208<<14 | 0x1D<<7 | 0x17, + 25486 - 19968: jis0208<<14 | 0x38<<7 | 0x35, + 25487 - 19968: jis0208<<14 | 0x38<<7 | 0x3A, + 25488 - 19968: jis0212<<14 | 0x1F<<7 | 0x08, + 25490 - 19968: jis0208<<14 | 0x26<<7 | 0x32, + 25492 - 19968: jis0212<<14 | 0x1F<<7 | 0x09, + 25493 - 19968: jis0212<<14 | 0x1F<<7 | 0x0A, + 25494 - 19968: jis0208<<14 | 0x38<<7 | 0x34, + 25496 - 19968: jis0208<<14 | 0x16<<7 | 0x00, + 25497 - 19968: jis0212<<14 | 0x1F<<7 | 0x0B, + 25498 - 19968: jis0212<<14 | 0x1F<<7 | 0x0C, + 25499 - 19968: jis0208<<14 | 0x12<<7 | 0x3C, + 25502 - 19968: jis0212<<14 | 0x1F<<7 | 0x0D, + 25503 - 19968: jis0208<<14 | 0x38<<7 | 0x3C, + 25504 - 19968: jis0208<<14 | 0x2D<<7 | 0x0A, + 25505 - 19968: jis0208<<14 | 0x19<<7 | 0x2D, + 25506 - 19968: jis0208<<14 | 0x22<<7 | 0x14, + 25507 - 19968: jis0208<<14 | 0x38<<7 | 0x39, + 25508 - 19968: jis0212<<14 | 0x1F<<7 | 0x0E, + 25509 - 19968: jis0208<<14 | 0x1F<<7 | 0x3B, + 25510 - 19968: jis0212<<14 | 0x1F<<7 | 0x0F, + 25511 - 19968: jis0208<<14 | 0x18<<7 | 0x14, + 25512 - 19968: jis0208<<14 | 0x1E<<7 | 0x43, + 25513 - 19968: jis0208<<14 | 0x10<<7 | 0x45, + 25514 - 19968: jis0208<<14 | 0x20<<7 | 0x1B, + 25515 - 19968: jis0208<<14 | 0x38<<7 | 0x37, + 25516 - 19968: jis0208<<14 | 0x14<<7 | 0x24, + 25517 - 19968: jis0212<<14 | 0x1F<<7 | 0x10, + 25518 - 19968: jis0212<<14 | 0x1F<<7 | 0x11, + 25519 - 19968: jis0212<<14 | 0x1F<<7 | 0x12, + 25522 - 19968: jis0208<<14 | 0x16<<7 | 0x26, + 25524 - 19968: jis0208<<14 | 0x23<<7 | 0x2E, + 25525 - 19968: jis0208<<14 | 0x38<<7 | 0x3D, + 25531 - 19968: jis0208<<14 | 0x20<<7 | 0x3E, + 25533 - 19968: jis0212<<14 | 0x1F<<7 | 0x13, + 25534 - 19968: jis0208<<14 | 0x38<<7 | 0x40, + 25536 - 19968: jis0208<<14 | 0x38<<7 | 0x42, + 25537 - 19968: jis0212<<14 | 0x1F<<7 | 0x14, + 25539 - 19968: jis0208<<14 | 0x21<<7 | 0x16, + 25540 - 19968: jis0208<<14 | 0x38<<7 | 0x48, + 25541 - 19968: jis0212<<14 | 0x1F<<7 | 0x15, + 25542 - 19968: jis0208<<14 | 0x38<<7 | 0x43, + 25544 - 19968: jis0212<<14 | 0x1F<<7 | 0x16, + 25545 - 19968: jis0208<<14 | 0x38<<7 | 0x45, + 25550 - 19968: jis0212<<14 | 0x1F<<7 | 0x17, + 25551 - 19968: jis0208<<14 | 0x28<<7 | 0x20, + 25552 - 19968: jis0208<<14 | 0x23<<7 | 0x52, + 25553 - 19968: jis0212<<14 | 0x1F<<7 | 0x18, + 25554 - 19968: jis0208<<14 | 0x38<<7 | 0x46, + 25555 - 19968: jis0212<<14 | 0x1F<<7 | 0x19, + 25556 - 19968: jis0212<<14 | 0x1F<<7 | 0x1A, + 25557 - 19968: jis0212<<14 | 0x1F<<7 | 0x1B, + 25558 - 19968: jis0208<<14 | 0x2C<<7 | 0x0B, + 25562 - 19968: jis0208<<14 | 0x2C<<7 | 0x27, + 25563 - 19968: jis0208<<14 | 0x13<<7 | 0x18, + 25564 - 19968: jis0212<<14 | 0x1F<<7 | 0x1C, + 25568 - 19968: jis0212<<14 | 0x1F<<7 | 0x1D, + 25569 - 19968: jis0208<<14 | 0x0F<<7 | 0x0D, + 25571 - 19968: jis0208<<14 | 0x38<<7 | 0x44, + 25573 - 19968: jis0212<<14 | 0x1F<<7 | 0x1E, + 25577 - 19968: jis0208<<14 | 0x38<<7 | 0x41, + 25578 - 19968: jis0212<<14 | 0x1F<<7 | 0x1F, + 25580 - 19968: jis0212<<14 | 0x1F<<7 | 0x20, + 25582 - 19968: jis0208<<14 | 0x13<<7 | 0x57, + 25586 - 19968: jis0212<<14 | 0x1F<<7 | 0x21, + 25587 - 19968: jis0212<<14 | 0x1F<<7 | 0x22, + 25588 - 19968: jis0208<<14 | 0x10<<7 | 0x46, + 25589 - 19968: jis0208<<14 | 0x59<<7 | 0x0E, + 25590 - 19968: jis0208<<14 | 0x38<<7 | 0x47, + 25592 - 19968: jis0212<<14 | 0x1F<<7 | 0x24, + 25593 - 19968: jis0212<<14 | 0x1F<<7 | 0x25, + 25594 - 19968: jis0208<<14 | 0x2C<<7 | 0x28, + 25606 - 19968: jis0208<<14 | 0x38<<7 | 0x4B, + 25609 - 19968: jis0212<<14 | 0x1F<<7 | 0x26, + 25610 - 19968: jis0212<<14 | 0x1F<<7 | 0x27, + 25613 - 19968: jis0208<<14 | 0x21<<7 | 0x1A, + 25615 - 19968: jis0208<<14 | 0x38<<7 | 0x52, + 25616 - 19968: jis0212<<14 | 0x1F<<7 | 0x28, + 25618 - 19968: jis0212<<14 | 0x1F<<7 | 0x29, + 25619 - 19968: jis0208<<14 | 0x38<<7 | 0x4C, + 25620 - 19968: jis0212<<14 | 0x1F<<7 | 0x2A, + 25622 - 19968: jis0208<<14 | 0x38<<7 | 0x49, + 25623 - 19968: jis0208<<14 | 0x38<<7 | 0x50, + 25624 - 19968: jis0212<<14 | 0x1F<<7 | 0x2B, + 25628 - 19968: jis0208<<14 | 0x38<<7 | 0x32, + 25630 - 19968: jis0212<<14 | 0x1F<<7 | 0x2C, + 25632 - 19968: jis0212<<14 | 0x1F<<7 | 0x2D, + 25634 - 19968: jis0212<<14 | 0x1F<<7 | 0x2E, + 25636 - 19968: jis0212<<14 | 0x1F<<7 | 0x2F, + 25637 - 19968: jis0212<<14 | 0x1F<<7 | 0x30, + 25638 - 19968: jis0208<<14 | 0x38<<7 | 0x4D, + 25640 - 19968: jis0208<<14 | 0x38<<7 | 0x51, + 25641 - 19968: jis0212<<14 | 0x1F<<7 | 0x31, + 25642 - 19968: jis0212<<14 | 0x1F<<7 | 0x32, + 25644 - 19968: jis0208<<14 | 0x27<<7 | 0x21, + 25645 - 19968: jis0208<<14 | 0x24<<7 | 0x4A, + 25647 - 19968: jis0212<<14 | 0x1F<<7 | 0x33, + 25648 - 19968: jis0212<<14 | 0x1F<<7 | 0x34, + 25652 - 19968: jis0208<<14 | 0x38<<7 | 0x4A, + 25653 - 19968: jis0212<<14 | 0x1F<<7 | 0x35, + 25654 - 19968: jis0208<<14 | 0x38<<7 | 0x4E, + 25658 - 19968: jis0208<<14 | 0x16<<7 | 0x27, + 25661 - 19968: jis0212<<14 | 0x1F<<7 | 0x36, + 25662 - 19968: jis0208<<14 | 0x19<<7 | 0x50, + 25663 - 19968: jis0212<<14 | 0x1F<<7 | 0x37, + 25666 - 19968: jis0208<<14 | 0x1F<<7 | 0x3C, + 25675 - 19968: jis0212<<14 | 0x1F<<7 | 0x38, + 25678 - 19968: jis0208<<14 | 0x38<<7 | 0x56, + 25679 - 19968: jis0212<<14 | 0x1F<<7 | 0x39, + 25681 - 19968: jis0212<<14 | 0x1F<<7 | 0x3A, + 25682 - 19968: jis0212<<14 | 0x1F<<7 | 0x3B, + 25683 - 19968: jis0212<<14 | 0x1F<<7 | 0x3C, + 25684 - 19968: jis0212<<14 | 0x1F<<7 | 0x3D, + 25688 - 19968: jis0208<<14 | 0x24<<7 | 0x05, + 25690 - 19968: jis0212<<14 | 0x1F<<7 | 0x3E, + 25691 - 19968: jis0212<<14 | 0x1F<<7 | 0x3F, + 25692 - 19968: jis0212<<14 | 0x1F<<7 | 0x40, + 25693 - 19968: jis0212<<14 | 0x1F<<7 | 0x41, + 25695 - 19968: jis0212<<14 | 0x1F<<7 | 0x42, + 25696 - 19968: jis0208<<14 | 0x59<<7 | 0x0F, + 25697 - 19968: jis0212<<14 | 0x1F<<7 | 0x44, + 25699 - 19968: jis0212<<14 | 0x1F<<7 | 0x45, + 25703 - 19968: jis0208<<14 | 0x38<<7 | 0x53, + 25705 - 19968: jis0208<<14 | 0x2A<<7 | 0x3F, + 25709 - 19968: jis0212<<14 | 0x1F<<7 | 0x46, + 25711 - 19968: jis0208<<14 | 0x38<<7 | 0x54, + 25715 - 19968: jis0212<<14 | 0x1F<<7 | 0x47, + 25716 - 19968: jis0212<<14 | 0x1F<<7 | 0x48, + 25718 - 19968: jis0208<<14 | 0x38<<7 | 0x55, + 25720 - 19968: jis0208<<14 | 0x2B<<7 | 0x2D, + 25722 - 19968: jis0208<<14 | 0x1F<<7 | 0x01, + 25723 - 19968: jis0212<<14 | 0x1F<<7 | 0x49, + 25725 - 19968: jis0212<<14 | 0x1F<<7 | 0x4A, + 25731 - 19968: jis0208<<14 | 0x16<<7 | 0x41, + 25733 - 19968: jis0212<<14 | 0x1F<<7 | 0x4B, + 25735 - 19968: jis0212<<14 | 0x1F<<7 | 0x4C, + 25736 - 19968: jis0208<<14 | 0x38<<7 | 0x5C, + 25743 - 19968: jis0212<<14 | 0x1F<<7 | 0x4D, + 25744 - 19968: jis0212<<14 | 0x1F<<7 | 0x4E, + 25745 - 19968: jis0212<<14 | 0x1F<<7 | 0x4F, + 25746 - 19968: jis0208<<14 | 0x1A<<7 | 0x14, + 25747 - 19968: jis0208<<14 | 0x38<<7 | 0x59, + 25749 - 19968: jis0208<<14 | 0x38<<7 | 0x58, + 25752 - 19968: jis0212<<14 | 0x1F<<7 | 0x50, + 25753 - 19968: jis0212<<14 | 0x1F<<7 | 0x51, + 25754 - 19968: jis0208<<14 | 0x26<<7 | 0x11, + 25755 - 19968: jis0212<<14 | 0x1F<<7 | 0x52, + 25757 - 19968: jis0208<<14 | 0x59<<7 | 0x10, + 25758 - 19968: jis0208<<14 | 0x25<<7 | 0x14, + 25759 - 19968: jis0212<<14 | 0x1F<<7 | 0x54, + 25761 - 19968: jis0212<<14 | 0x1F<<7 | 0x55, + 25763 - 19968: jis0212<<14 | 0x1F<<7 | 0x56, + 25764 - 19968: jis0208<<14 | 0x24<<7 | 0x10, + 25765 - 19968: jis0208<<14 | 0x38<<7 | 0x5A, + 25766 - 19968: jis0212<<14 | 0x1F<<7 | 0x57, + 25768 - 19968: jis0212<<14 | 0x1F<<7 | 0x58, + 25769 - 19968: jis0208<<14 | 0x38<<7 | 0x5B, + 25771 - 19968: jis0208<<14 | 0x28<<7 | 0x4E, + 25772 - 19968: jis0212<<14 | 0x1F<<7 | 0x59, + 25773 - 19968: jis0208<<14 | 0x26<<7 | 0x24, + 25774 - 19968: jis0208<<14 | 0x1A<<7 | 0x02, + 25776 - 19968: jis0208<<14 | 0x1F<<7 | 0x50, + 25778 - 19968: jis0208<<14 | 0x2A<<7 | 0x2F, + 25779 - 19968: jis0212<<14 | 0x1F<<7 | 0x5A, + 25785 - 19968: jis0208<<14 | 0x12<<7 | 0x28, + 25787 - 19968: jis0208<<14 | 0x39<<7 | 0x04, + 25788 - 19968: jis0208<<14 | 0x38<<7 | 0x5D, + 25789 - 19968: jis0212<<14 | 0x1F<<7 | 0x5B, + 25790 - 19968: jis0212<<14 | 0x1F<<7 | 0x5C, + 25791 - 19968: jis0212<<14 | 0x1F<<7 | 0x5D, + 25793 - 19968: jis0208<<14 | 0x2C<<7 | 0x29, + 25794 - 19968: jis0208<<14 | 0x39<<7 | 0x06, + 25796 - 19968: jis0212<<14 | 0x20<<7 | 0x00, + 25797 - 19968: jis0208<<14 | 0x39<<7 | 0x02, + 25799 - 19968: jis0208<<14 | 0x39<<7 | 0x03, + 25801 - 19968: jis0212<<14 | 0x20<<7 | 0x01, + 25802 - 19968: jis0212<<14 | 0x20<<7 | 0x02, + 25803 - 19968: jis0212<<14 | 0x20<<7 | 0x03, + 25804 - 19968: jis0212<<14 | 0x20<<7 | 0x04, + 25805 - 19968: jis0208<<14 | 0x20<<7 | 0x3F, + 25806 - 19968: jis0208<<14 | 0x59<<7 | 0x11, + 25808 - 19968: jis0212<<14 | 0x20<<7 | 0x06, + 25809 - 19968: jis0212<<14 | 0x20<<7 | 0x07, + 25810 - 19968: jis0208<<14 | 0x39<<7 | 0x01, + 25812 - 19968: jis0208<<14 | 0x38<<7 | 0x1E, + 25813 - 19968: jis0212<<14 | 0x20<<7 | 0x08, + 25815 - 19968: jis0212<<14 | 0x20<<7 | 0x09, + 25816 - 19968: jis0208<<14 | 0x39<<7 | 0x05, + 25818 - 19968: jis0208<<14 | 0x39<<7 | 0x00, + 25824 - 19968: jis0208<<14 | 0x39<<7 | 0x0A, + 25825 - 19968: jis0208<<14 | 0x39<<7 | 0x0B, + 25826 - 19968: jis0208<<14 | 0x24<<7 | 0x06, + 25827 - 19968: jis0208<<14 | 0x39<<7 | 0x0D, + 25828 - 19968: jis0212<<14 | 0x20<<7 | 0x0A, + 25829 - 19968: jis0212<<14 | 0x20<<7 | 0x0B, + 25830 - 19968: jis0208<<14 | 0x1A<<7 | 0x03, + 25831 - 19968: jis0208<<14 | 0x39<<7 | 0x08, + 25833 - 19968: jis0212<<14 | 0x20<<7 | 0x0C, + 25834 - 19968: jis0212<<14 | 0x20<<7 | 0x0D, + 25836 - 19968: jis0208<<14 | 0x14<<7 | 0x1B, + 25837 - 19968: jis0212<<14 | 0x20<<7 | 0x0E, + 25839 - 19968: jis0208<<14 | 0x39<<7 | 0x0E, + 25840 - 19968: jis0212<<14 | 0x20<<7 | 0x0F, + 25841 - 19968: jis0208<<14 | 0x39<<7 | 0x07, + 25842 - 19968: jis0208<<14 | 0x39<<7 | 0x12, + 25844 - 19968: jis0208<<14 | 0x39<<7 | 0x11, + 25845 - 19968: jis0212<<14 | 0x20<<7 | 0x10, + 25846 - 19968: jis0208<<14 | 0x39<<7 | 0x10, + 25847 - 19968: jis0212<<14 | 0x20<<7 | 0x11, + 25850 - 19968: jis0208<<14 | 0x39<<7 | 0x13, + 25851 - 19968: jis0212<<14 | 0x20<<7 | 0x12, + 25853 - 19968: jis0208<<14 | 0x39<<7 | 0x15, + 25854 - 19968: jis0208<<14 | 0x1D<<7 | 0x50, + 25855 - 19968: jis0212<<14 | 0x20<<7 | 0x13, + 25856 - 19968: jis0208<<14 | 0x39<<7 | 0x14, + 25857 - 19968: jis0212<<14 | 0x20<<7 | 0x14, + 25860 - 19968: jis0212<<14 | 0x20<<7 | 0x15, + 25861 - 19968: jis0208<<14 | 0x39<<7 | 0x18, + 25864 - 19968: jis0212<<14 | 0x20<<7 | 0x16, + 25865 - 19968: jis0212<<14 | 0x20<<7 | 0x17, + 25866 - 19968: jis0212<<14 | 0x20<<7 | 0x18, + 25871 - 19968: jis0212<<14 | 0x20<<7 | 0x19, + 25875 - 19968: jis0212<<14 | 0x20<<7 | 0x1A, + 25876 - 19968: jis0212<<14 | 0x20<<7 | 0x1B, + 25878 - 19968: jis0212<<14 | 0x20<<7 | 0x1C, + 25880 - 19968: jis0208<<14 | 0x39<<7 | 0x16, + 25881 - 19968: jis0212<<14 | 0x20<<7 | 0x1D, + 25883 - 19968: jis0212<<14 | 0x20<<7 | 0x1E, + 25884 - 19968: jis0208<<14 | 0x39<<7 | 0x17, + 25885 - 19968: jis0208<<14 | 0x38<<7 | 0x4F, + 25886 - 19968: jis0212<<14 | 0x20<<7 | 0x1F, + 25887 - 19968: jis0212<<14 | 0x20<<7 | 0x20, + 25890 - 19968: jis0212<<14 | 0x20<<7 | 0x21, + 25891 - 19968: jis0208<<14 | 0x39<<7 | 0x1A, + 25892 - 19968: jis0208<<14 | 0x39<<7 | 0x19, + 25894 - 19968: jis0212<<14 | 0x20<<7 | 0x22, + 25897 - 19968: jis0212<<14 | 0x20<<7 | 0x23, + 25898 - 19968: jis0208<<14 | 0x38<<7 | 0x57, + 25899 - 19968: jis0208<<14 | 0x39<<7 | 0x1B, + 25900 - 19968: jis0208<<14 | 0x39<<7 | 0x0F, + 25902 - 19968: jis0212<<14 | 0x20<<7 | 0x24, + 25903 - 19968: jis0208<<14 | 0x1A<<7 | 0x38, + 25905 - 19968: jis0212<<14 | 0x20<<7 | 0x25, + 25908 - 19968: jis0208<<14 | 0x39<<7 | 0x1C, + 25909 - 19968: jis0208<<14 | 0x39<<7 | 0x1D, + 25910 - 19968: jis0208<<14 | 0x39<<7 | 0x1F, + 25911 - 19968: jis0208<<14 | 0x39<<7 | 0x1E, + 25912 - 19968: jis0208<<14 | 0x39<<7 | 0x20, + 25913 - 19968: jis0208<<14 | 0x11<<7 | 0x5D, + 25914 - 19968: jis0212<<14 | 0x20<<7 | 0x26, + 25915 - 19968: jis0208<<14 | 0x18<<7 | 0x15, + 25916 - 19968: jis0212<<14 | 0x20<<7 | 0x27, + 25917 - 19968: jis0212<<14 | 0x20<<7 | 0x28, + 25918 - 19968: jis0208<<14 | 0x29<<7 | 0x5B, + 25919 - 19968: jis0208<<14 | 0x1F<<7 | 0x0E, + 25923 - 19968: jis0212<<14 | 0x20<<7 | 0x29, + 25925 - 19968: jis0208<<14 | 0x17<<7 | 0x2D, + 25927 - 19968: jis0212<<14 | 0x20<<7 | 0x2A, + 25928 - 19968: jis0208<<14 | 0x39<<7 | 0x22, + 25929 - 19968: jis0212<<14 | 0x20<<7 | 0x2B, + 25933 - 19968: jis0208<<14 | 0x39<<7 | 0x25, + 25934 - 19968: jis0208<<14 | 0x59<<7 | 0x12, + 25935 - 19968: jis0208<<14 | 0x28<<7 | 0x31, + 25936 - 19968: jis0212<<14 | 0x20<<7 | 0x2C, + 25937 - 19968: jis0208<<14 | 0x14<<7 | 0x3E, + 25938 - 19968: jis0212<<14 | 0x20<<7 | 0x2D, + 25940 - 19968: jis0212<<14 | 0x20<<7 | 0x2E, + 25941 - 19968: jis0208<<14 | 0x39<<7 | 0x24, + 25942 - 19968: jis0208<<14 | 0x39<<7 | 0x23, + 25943 - 19968: jis0208<<14 | 0x26<<7 | 0x33, + 25944 - 19968: jis0208<<14 | 0x39<<7 | 0x26, + 25945 - 19968: jis0208<<14 | 0x15<<7 | 0x14, + 25949 - 19968: jis0208<<14 | 0x39<<7 | 0x28, + 25950 - 19968: jis0208<<14 | 0x39<<7 | 0x27, + 25951 - 19968: jis0212<<14 | 0x20<<7 | 0x2F, + 25952 - 19968: jis0212<<14 | 0x20<<7 | 0x30, + 25954 - 19968: jis0208<<14 | 0x13<<7 | 0x19, + 25955 - 19968: jis0208<<14 | 0x1A<<7 | 0x15, + 25958 - 19968: jis0208<<14 | 0x25<<7 | 0x37, + 25959 - 19968: jis0212<<14 | 0x20<<7 | 0x31, + 25963 - 19968: jis0212<<14 | 0x20<<7 | 0x32, + 25964 - 19968: jis0208<<14 | 0x16<<7 | 0x28, + 25968 - 19968: jis0208<<14 | 0x1E<<7 | 0x53, + 25970 - 19968: jis0208<<14 | 0x39<<7 | 0x29, + 25972 - 19968: jis0208<<14 | 0x1F<<7 | 0x0F, + 25973 - 19968: jis0208<<14 | 0x24<<7 | 0x07, + 25975 - 19968: jis0208<<14 | 0x28<<7 | 0x3E, + 25976 - 19968: jis0208<<14 | 0x39<<7 | 0x2A, + 25978 - 19968: jis0212<<14 | 0x20<<7 | 0x33, + 25981 - 19968: jis0212<<14 | 0x20<<7 | 0x34, + 25985 - 19968: jis0212<<14 | 0x20<<7 | 0x35, + 25986 - 19968: jis0208<<14 | 0x39<<7 | 0x2B, + 25987 - 19968: jis0208<<14 | 0x39<<7 | 0x2C, + 25989 - 19968: jis0212<<14 | 0x20<<7 | 0x36, + 25991 - 19968: jis0208<<14 | 0x29<<7 | 0x17, + 25992 - 19968: jis0208<<14 | 0x34<<7 | 0x3C, + 25993 - 19968: jis0208<<14 | 0x1F<<7 | 0x25, + 25994 - 19968: jis0212<<14 | 0x20<<7 | 0x37, + 25996 - 19968: jis0208<<14 | 0x28<<7 | 0x2B, + 25998 - 19968: jis0208<<14 | 0x19<<7 | 0x37, + 26000 - 19968: jis0208<<14 | 0x27<<7 | 0x44, + 26001 - 19968: jis0208<<14 | 0x27<<7 | 0x22, + 26002 - 19968: jis0212<<14 | 0x20<<7 | 0x38, + 26005 - 19968: jis0212<<14 | 0x20<<7 | 0x39, + 26007 - 19968: jis0208<<14 | 0x24<<7 | 0x2C, + 26008 - 19968: jis0212<<14 | 0x20<<7 | 0x3A, + 26009 - 19968: jis0208<<14 | 0x2D<<7 | 0x20, + 26011 - 19968: jis0208<<14 | 0x39<<7 | 0x2E, + 26012 - 19968: jis0208<<14 | 0x1B<<7 | 0x2F, + 26013 - 19968: jis0212<<14 | 0x20<<7 | 0x3B, + 26015 - 19968: jis0208<<14 | 0x39<<7 | 0x2F, + 26016 - 19968: jis0212<<14 | 0x20<<7 | 0x3C, + 26017 - 19968: jis0208<<14 | 0x0F<<7 | 0x15, + 26019 - 19968: jis0212<<14 | 0x20<<7 | 0x3D, + 26020 - 19968: jis0208<<14 | 0x15<<7 | 0x33, + 26021 - 19968: jis0208<<14 | 0x1F<<7 | 0x2C, + 26022 - 19968: jis0212<<14 | 0x20<<7 | 0x3E, + 26023 - 19968: jis0208<<14 | 0x28<<7 | 0x3F, + 26027 - 19968: jis0208<<14 | 0x39<<7 | 0x30, + 26028 - 19968: jis0208<<14 | 0x1A<<7 | 0x21, + 26029 - 19968: jis0208<<14 | 0x22<<7 | 0x26, + 26030 - 19968: jis0212<<14 | 0x20<<7 | 0x3F, + 26031 - 19968: jis0208<<14 | 0x1A<<7 | 0x3A, + 26032 - 19968: jis0208<<14 | 0x1E<<7 | 0x16, + 26034 - 19968: jis0212<<14 | 0x20<<7 | 0x40, + 26035 - 19968: jis0212<<14 | 0x20<<7 | 0x41, + 26036 - 19968: jis0212<<14 | 0x20<<7 | 0x42, + 26039 - 19968: jis0208<<14 | 0x39<<7 | 0x31, + 26041 - 19968: jis0208<<14 | 0x29<<7 | 0x5C, + 26044 - 19968: jis0208<<14 | 0x10<<7 | 0x56, + 26045 - 19968: jis0208<<14 | 0x1A<<7 | 0x3B, + 26047 - 19968: jis0212<<14 | 0x20<<7 | 0x43, + 26049 - 19968: jis0208<<14 | 0x39<<7 | 0x34, + 26050 - 19968: jis0212<<14 | 0x20<<7 | 0x44, + 26051 - 19968: jis0208<<14 | 0x39<<7 | 0x32, + 26052 - 19968: jis0208<<14 | 0x39<<7 | 0x35, + 26053 - 19968: jis0208<<14 | 0x2D<<7 | 0x18, + 26054 - 19968: jis0208<<14 | 0x39<<7 | 0x33, + 26056 - 19968: jis0212<<14 | 0x20<<7 | 0x45, + 26057 - 19968: jis0212<<14 | 0x20<<7 | 0x46, + 26059 - 19968: jis0208<<14 | 0x1F<<7 | 0x5A, + 26060 - 19968: jis0208<<14 | 0x39<<7 | 0x36, + 26062 - 19968: jis0212<<14 | 0x20<<7 | 0x47, + 26063 - 19968: jis0208<<14 | 0x21<<7 | 0x11, + 26064 - 19968: jis0212<<14 | 0x20<<7 | 0x48, + 26066 - 19968: jis0208<<14 | 0x39<<7 | 0x37, + 26068 - 19968: jis0212<<14 | 0x20<<7 | 0x49, + 26070 - 19968: jis0212<<14 | 0x20<<7 | 0x4A, + 26071 - 19968: jis0208<<14 | 0x13<<7 | 0x59, + 26072 - 19968: jis0212<<14 | 0x20<<7 | 0x4B, + 26073 - 19968: jis0208<<14 | 0x39<<7 | 0x39, + 26075 - 19968: jis0208<<14 | 0x39<<7 | 0x38, + 26079 - 19968: jis0212<<14 | 0x20<<7 | 0x4C, + 26080 - 19968: jis0208<<14 | 0x39<<7 | 0x3A, + 26081 - 19968: jis0208<<14 | 0x39<<7 | 0x3B, + 26082 - 19968: jis0208<<14 | 0x13<<7 | 0x5A, + 26085 - 19968: jis0208<<14 | 0x25<<7 | 0x5B, + 26086 - 19968: jis0208<<14 | 0x22<<7 | 0x15, + 26087 - 19968: jis0208<<14 | 0x14<<7 | 0x4B, + 26088 - 19968: jis0208<<14 | 0x1A<<7 | 0x3C, + 26089 - 19968: jis0208<<14 | 0x20<<7 | 0x40, + 26092 - 19968: jis0208<<14 | 0x1C<<7 | 0x3B, + 26093 - 19968: jis0208<<14 | 0x0F<<7 | 0x0F, + 26096 - 19968: jis0212<<14 | 0x20<<7 | 0x4D, + 26097 - 19968: jis0208<<14 | 0x39<<7 | 0x3C, + 26098 - 19968: jis0212<<14 | 0x20<<7 | 0x4E, + 26100 - 19968: jis0212<<14 | 0x20<<7 | 0x4F, + 26101 - 19968: jis0212<<14 | 0x20<<7 | 0x50, + 26105 - 19968: jis0212<<14 | 0x20<<7 | 0x51, + 26106 - 19968: jis0208<<14 | 0x11<<7 | 0x01, + 26107 - 19968: jis0208<<14 | 0x39<<7 | 0x40, + 26110 - 19968: jis0212<<14 | 0x20<<7 | 0x52, + 26111 - 19968: jis0212<<14 | 0x20<<7 | 0x53, + 26112 - 19968: jis0208<<14 | 0x59<<7 | 0x13, + 26114 - 19968: jis0208<<14 | 0x18<<7 | 0x16, + 26115 - 19968: jis0208<<14 | 0x39<<7 | 0x3F, + 26116 - 19968: jis0212<<14 | 0x20<<7 | 0x55, + 26118 - 19968: jis0208<<14 | 0x19<<7 | 0x0A, + 26119 - 19968: jis0208<<14 | 0x1D<<7 | 0x19, + 26120 - 19968: jis0212<<14 | 0x20<<7 | 0x56, + 26121 - 19968: jis0208<<14 | 0x59<<7 | 0x16, + 26122 - 19968: jis0208<<14 | 0x39<<7 | 0x3E, + 26124 - 19968: jis0208<<14 | 0x1D<<7 | 0x1A, + 26125 - 19968: jis0212<<14 | 0x20<<7 | 0x58, + 26126 - 19968: jis0208<<14 | 0x2B<<7 | 0x1F, + 26127 - 19968: jis0208<<14 | 0x19<<7 | 0x09, + 26129 - 19968: jis0212<<14 | 0x20<<7 | 0x59, + 26130 - 19968: jis0212<<14 | 0x20<<7 | 0x5A, + 26131 - 19968: jis0208<<14 | 0x0F<<7 | 0x36, + 26132 - 19968: jis0208<<14 | 0x1F<<7 | 0x2D, + 26133 - 19968: jis0208<<14 | 0x59<<7 | 0x14, + 26134 - 19968: jis0212<<14 | 0x20<<7 | 0x5C, + 26140 - 19968: jis0208<<14 | 0x39<<7 | 0x45, + 26141 - 19968: jis0212<<14 | 0x20<<7 | 0x5D, + 26142 - 19968: jis0208<<14 | 0x59<<7 | 0x18, + 26143 - 19968: jis0208<<14 | 0x1F<<7 | 0x10, + 26144 - 19968: jis0208<<14 | 0x10<<7 | 0x26, + 26145 - 19968: jis0212<<14 | 0x21<<7 | 0x01, + 26146 - 19968: jis0212<<14 | 0x21<<7 | 0x02, + 26147 - 19968: jis0212<<14 | 0x21<<7 | 0x03, + 26148 - 19968: jis0208<<14 | 0x59<<7 | 0x19, + 26149 - 19968: jis0208<<14 | 0x1C<<7 | 0x34, + 26150 - 19968: jis0212<<14 | 0x21<<7 | 0x05, + 26151 - 19968: jis0208<<14 | 0x2A<<7 | 0x45, + 26152 - 19968: jis0208<<14 | 0x19<<7 | 0x51, + 26153 - 19968: jis0212<<14 | 0x21<<7 | 0x06, + 26154 - 19968: jis0212<<14 | 0x21<<7 | 0x07, + 26155 - 19968: jis0212<<14 | 0x21<<7 | 0x08, + 26156 - 19968: jis0212<<14 | 0x21<<7 | 0x09, + 26157 - 19968: jis0208<<14 | 0x1D<<7 | 0x1B, + 26158 - 19968: jis0208<<14 | 0x59<<7 | 0x17, + 26159 - 19968: jis0208<<14 | 0x1F<<7 | 0x06, + 26160 - 19968: jis0212<<14 | 0x21<<7 | 0x0B, + 26161 - 19968: jis0208<<14 | 0x58<<7 | 0x07, + 26163 - 19968: jis0212<<14 | 0x21<<7 | 0x0D, + 26164 - 19968: jis0208<<14 | 0x39<<7 | 0x44, + 26165 - 19968: jis0208<<14 | 0x39<<7 | 0x42, + 26166 - 19968: jis0208<<14 | 0x39<<7 | 0x43, + 26167 - 19968: jis0212<<14 | 0x21<<7 | 0x0F, + 26169 - 19968: jis0212<<14 | 0x21<<7 | 0x0E, + 26171 - 19968: jis0208<<14 | 0x59<<7 | 0x15, + 26172 - 19968: jis0208<<14 | 0x22<<7 | 0x4A, + 26175 - 19968: jis0208<<14 | 0x3A<<7 | 0x05, + 26176 - 19968: jis0212<<14 | 0x21<<7 | 0x10, + 26177 - 19968: jis0208<<14 | 0x39<<7 | 0x49, + 26178 - 19968: jis0208<<14 | 0x1A<<7 | 0x5D, + 26179 - 19968: jis0208<<14 | 0x18<<7 | 0x17, + 26180 - 19968: jis0208<<14 | 0x39<<7 | 0x47, + 26181 - 19968: jis0212<<14 | 0x21<<7 | 0x11, + 26182 - 19968: jis0212<<14 | 0x21<<7 | 0x12, + 26185 - 19968: jis0208<<14 | 0x39<<7 | 0x48, + 26186 - 19968: jis0212<<14 | 0x21<<7 | 0x13, + 26187 - 19968: jis0208<<14 | 0x1E<<7 | 0x17, + 26188 - 19968: jis0212<<14 | 0x21<<7 | 0x14, + 26190 - 19968: jis0212<<14 | 0x21<<7 | 0x16, + 26191 - 19968: jis0208<<14 | 0x39<<7 | 0x46, + 26193 - 19968: jis0212<<14 | 0x21<<7 | 0x15, + 26194 - 19968: jis0208<<14 | 0x1A<<7 | 0x0E, + 26199 - 19968: jis0208<<14 | 0x59<<7 | 0x1B, + 26200 - 19968: jis0212<<14 | 0x21<<7 | 0x18, + 26201 - 19968: jis0208<<14 | 0x59<<7 | 0x1C, + 26203 - 19968: jis0212<<14 | 0x21<<7 | 0x1A, + 26204 - 19968: jis0212<<14 | 0x21<<7 | 0x1B, + 26205 - 19968: jis0208<<14 | 0x39<<7 | 0x4B, + 26206 - 19968: jis0208<<14 | 0x39<<7 | 0x4A, + 26207 - 19968: jis0208<<14 | 0x39<<7 | 0x4F, + 26208 - 19968: jis0212<<14 | 0x21<<7 | 0x1C, + 26209 - 19968: jis0212<<14 | 0x21<<7 | 0x1D, + 26210 - 19968: jis0208<<14 | 0x39<<7 | 0x50, + 26212 - 19968: jis0208<<14 | 0x39<<7 | 0x4C, + 26213 - 19968: jis0208<<14 | 0x59<<7 | 0x1A, + 26214 - 19968: jis0208<<14 | 0x12<<7 | 0x01, + 26215 - 19968: jis0208<<14 | 0x39<<7 | 0x4D, + 26216 - 19968: jis0208<<14 | 0x39<<7 | 0x4E, + 26217 - 19968: jis0208<<14 | 0x27<<7 | 0x34, + 26218 - 19968: jis0212<<14 | 0x21<<7 | 0x1F, + 26219 - 19968: jis0212<<14 | 0x21<<7 | 0x20, + 26220 - 19968: jis0212<<14 | 0x21<<7 | 0x21, + 26222 - 19968: jis0208<<14 | 0x28<<7 | 0x40, + 26223 - 19968: jis0208<<14 | 0x16<<7 | 0x29, + 26224 - 19968: jis0208<<14 | 0x39<<7 | 0x51, + 26227 - 19968: jis0208<<14 | 0x59<<7 | 0x1E, + 26228 - 19968: jis0208<<14 | 0x1F<<7 | 0x11, + 26229 - 19968: jis0212<<14 | 0x21<<7 | 0x24, + 26230 - 19968: jis0208<<14 | 0x1D<<7 | 0x1C, + 26231 - 19968: jis0212<<14 | 0x21<<7 | 0x26, + 26232 - 19968: jis0212<<14 | 0x21<<7 | 0x27, + 26233 - 19968: jis0212<<14 | 0x21<<7 | 0x28, + 26234 - 19968: jis0208<<14 | 0x22<<7 | 0x31, + 26235 - 19968: jis0212<<14 | 0x21<<7 | 0x29, + 26236 - 19968: jis0212<<14 | 0x21<<7 | 0x2B, + 26238 - 19968: jis0212<<14 | 0x21<<7 | 0x22, + 26239 - 19968: jis0212<<14 | 0x21<<7 | 0x25, + 26240 - 19968: jis0212<<14 | 0x21<<7 | 0x2A, + 26241 - 19968: jis0208<<14 | 0x15<<7 | 0x26, + 26243 - 19968: jis0208<<14 | 0x39<<7 | 0x52, + 26244 - 19968: jis0208<<14 | 0x39<<7 | 0x56, + 26247 - 19968: jis0208<<14 | 0x11<<7 | 0x2A, + 26248 - 19968: jis0208<<14 | 0x39<<7 | 0x53, + 26249 - 19968: jis0208<<14 | 0x39<<7 | 0x55, + 26251 - 19968: jis0212<<14 | 0x21<<7 | 0x2C, + 26252 - 19968: jis0212<<14 | 0x21<<7 | 0x2D, + 26253 - 19968: jis0212<<14 | 0x21<<7 | 0x2E, + 26254 - 19968: jis0208<<14 | 0x39<<7 | 0x54, + 26256 - 19968: jis0212<<14 | 0x21<<7 | 0x2F, + 26257 - 19968: jis0208<<14 | 0x1C<<7 | 0x4A, + 26258 - 19968: jis0212<<14 | 0x21<<7 | 0x30, + 26262 - 19968: jis0208<<14 | 0x22<<7 | 0x27, + 26263 - 19968: jis0208<<14 | 0x0F<<7 | 0x24, + 26264 - 19968: jis0208<<14 | 0x39<<7 | 0x57, + 26265 - 19968: jis0208<<14 | 0x59<<7 | 0x1F, + 26266 - 19968: jis0212<<14 | 0x21<<7 | 0x32, + 26267 - 19968: jis0212<<14 | 0x21<<7 | 0x33, + 26268 - 19968: jis0212<<14 | 0x21<<7 | 0x34, + 26269 - 19968: jis0208<<14 | 0x39<<7 | 0x58, + 26271 - 19968: jis0212<<14 | 0x21<<7 | 0x35, + 26272 - 19968: jis0208<<14 | 0x59<<7 | 0x20, + 26274 - 19968: jis0208<<14 | 0x23<<7 | 0x09, + 26276 - 19968: jis0212<<14 | 0x21<<7 | 0x37, + 26278 - 19968: jis0208<<14 | 0x2D<<7 | 0x50, + 26283 - 19968: jis0208<<14 | 0x1A<<7 | 0x22, + 26285 - 19968: jis0212<<14 | 0x21<<7 | 0x38, + 26286 - 19968: jis0208<<14 | 0x29<<7 | 0x4A, + 26289 - 19968: jis0212<<14 | 0x21<<7 | 0x39, + 26290 - 19968: jis0208<<14 | 0x59<<7 | 0x21, + 26292 - 19968: jis0208<<14 | 0x2A<<7 | 0x1C, + 26293 - 19968: jis0212<<14 | 0x21<<7 | 0x3B, + 26296 - 19968: jis0208<<14 | 0x3A<<7 | 0x01, + 26297 - 19968: jis0208<<14 | 0x39<<7 | 0x5A, + 26299 - 19968: jis0212<<14 | 0x21<<7 | 0x3C, + 26300 - 19968: jis0208<<14 | 0x39<<7 | 0x5D, + 26302 - 19968: jis0208<<14 | 0x39<<7 | 0x5C, + 26303 - 19968: jis0208<<14 | 0x59<<7 | 0x22, + 26304 - 19968: jis0212<<14 | 0x21<<7 | 0x3E, + 26305 - 19968: jis0208<<14 | 0x39<<7 | 0x59, + 26306 - 19968: jis0212<<14 | 0x21<<7 | 0x3F, + 26307 - 19968: jis0212<<14 | 0x21<<7 | 0x40, + 26308 - 19968: jis0208<<14 | 0x3A<<7 | 0x00, + 26311 - 19968: jis0208<<14 | 0x25<<7 | 0x3D, + 26312 - 19968: jis0212<<14 | 0x21<<7 | 0x41, + 26313 - 19968: jis0208<<14 | 0x39<<7 | 0x5B, + 26316 - 19968: jis0212<<14 | 0x21<<7 | 0x42, + 26318 - 19968: jis0212<<14 | 0x21<<7 | 0x43, + 26319 - 19968: jis0212<<14 | 0x21<<7 | 0x44, + 26324 - 19968: jis0212<<14 | 0x21<<7 | 0x45, + 26326 - 19968: jis0208<<14 | 0x3A<<7 | 0x02, + 26329 - 19968: jis0208<<14 | 0x1C<<7 | 0x4B, + 26330 - 19968: jis0208<<14 | 0x3A<<7 | 0x03, + 26331 - 19968: jis0212<<14 | 0x21<<7 | 0x46, + 26332 - 19968: jis0208<<14 | 0x2C<<7 | 0x2A, + 26333 - 19968: jis0208<<14 | 0x26<<7 | 0x57, + 26335 - 19968: jis0212<<14 | 0x21<<7 | 0x47, + 26336 - 19968: jis0208<<14 | 0x3A<<7 | 0x04, + 26342 - 19968: jis0208<<14 | 0x3A<<7 | 0x06, + 26344 - 19968: jis0212<<14 | 0x21<<7 | 0x48, + 26345 - 19968: jis0208<<14 | 0x3A<<7 | 0x07, + 26347 - 19968: jis0212<<14 | 0x21<<7 | 0x49, + 26348 - 19968: jis0212<<14 | 0x21<<7 | 0x4A, + 26350 - 19968: jis0212<<14 | 0x21<<7 | 0x4B, + 26352 - 19968: jis0208<<14 | 0x3A<<7 | 0x08, + 26354 - 19968: jis0208<<14 | 0x15<<7 | 0x29, + 26355 - 19968: jis0208<<14 | 0x10<<7 | 0x27, + 26356 - 19968: jis0208<<14 | 0x18<<7 | 0x18, + 26357 - 19968: jis0208<<14 | 0x3A<<7 | 0x09, + 26359 - 19968: jis0208<<14 | 0x3A<<7 | 0x0A, + 26360 - 19968: jis0208<<14 | 0x1C<<7 | 0x50, + 26361 - 19968: jis0208<<14 | 0x20<<7 | 0x41, + 26362 - 19968: jis0208<<14 | 0x59<<7 | 0x23, + 26363 - 19968: jis0208<<14 | 0x58<<7 | 0x0A, + 26364 - 19968: jis0208<<14 | 0x31<<7 | 0x37, + 26365 - 19968: jis0208<<14 | 0x20<<7 | 0x1D, + 26366 - 19968: jis0208<<14 | 0x20<<7 | 0x1C, + 26367 - 19968: jis0208<<14 | 0x21<<7 | 0x37, + 26368 - 19968: jis0208<<14 | 0x19<<7 | 0x26, + 26371 - 19968: jis0208<<14 | 0x2F<<7 | 0x51, + 26373 - 19968: jis0212<<14 | 0x21<<7 | 0x4D, + 26375 - 19968: jis0212<<14 | 0x21<<7 | 0x4E, + 26376 - 19968: jis0208<<14 | 0x16<<7 | 0x4D, + 26377 - 19968: jis0208<<14 | 0x2C<<7 | 0x0C, + 26379 - 19968: jis0208<<14 | 0x29<<7 | 0x5D, + 26381 - 19968: jis0208<<14 | 0x28<<7 | 0x5D, + 26382 - 19968: jis0208<<14 | 0x59<<7 | 0x24, + 26383 - 19968: jis0208<<14 | 0x3A<<7 | 0x0B, + 26387 - 19968: jis0212<<14 | 0x21<<7 | 0x50, + 26388 - 19968: jis0208<<14 | 0x19<<7 | 0x52, + 26389 - 19968: jis0208<<14 | 0x23<<7 | 0x1E, + 26390 - 19968: jis0208<<14 | 0x3A<<7 | 0x0C, + 26391 - 19968: jis0208<<14 | 0x2E<<7 | 0x0E, + 26393 - 19968: jis0212<<14 | 0x21<<7 | 0x51, + 26395 - 19968: jis0208<<14 | 0x2A<<7 | 0x1D, + 26396 - 19968: jis0212<<14 | 0x21<<7 | 0x52, + 26397 - 19968: jis0208<<14 | 0x23<<7 | 0x0A, + 26398 - 19968: jis0208<<14 | 0x3A<<7 | 0x0D, + 26399 - 19968: jis0208<<14 | 0x13<<7 | 0x5B, + 26400 - 19968: jis0212<<14 | 0x21<<7 | 0x53, + 26402 - 19968: jis0212<<14 | 0x21<<7 | 0x54, + 26406 - 19968: jis0208<<14 | 0x3A<<7 | 0x0E, + 26407 - 19968: jis0208<<14 | 0x3A<<7 | 0x0F, + 26408 - 19968: jis0208<<14 | 0x2B<<7 | 0x39, + 26410 - 19968: jis0208<<14 | 0x2B<<7 | 0x03, + 26411 - 19968: jis0208<<14 | 0x2A<<7 | 0x55, + 26412 - 19968: jis0208<<14 | 0x2A<<7 | 0x3B, + 26413 - 19968: jis0208<<14 | 0x1A<<7 | 0x04, + 26414 - 19968: jis0208<<14 | 0x3A<<7 | 0x11, + 26417 - 19968: jis0208<<14 | 0x1B<<7 | 0x4A, + 26419 - 19968: jis0212<<14 | 0x21<<7 | 0x55, + 26420 - 19968: jis0208<<14 | 0x2A<<7 | 0x30, + 26422 - 19968: jis0208<<14 | 0x3A<<7 | 0x13, + 26423 - 19968: jis0208<<14 | 0x3A<<7 | 0x16, + 26424 - 19968: jis0208<<14 | 0x3A<<7 | 0x15, + 26426 - 19968: jis0208<<14 | 0x13<<7 | 0x58, + 26429 - 19968: jis0208<<14 | 0x14<<7 | 0x3F, + 26430 - 19968: jis0212<<14 | 0x21<<7 | 0x56, + 26431 - 19968: jis0208<<14 | 0x3A<<7 | 0x12, + 26433 - 19968: jis0208<<14 | 0x3A<<7 | 0x14, + 26437 - 19968: jis0212<<14 | 0x21<<7 | 0x57, + 26438 - 19968: jis0208<<14 | 0x3A<<7 | 0x17, + 26439 - 19968: jis0212<<14 | 0x21<<7 | 0x58, + 26440 - 19968: jis0212<<14 | 0x21<<7 | 0x59, + 26441 - 19968: jis0208<<14 | 0x1E<<7 | 0x58, + 26444 - 19968: jis0212<<14 | 0x21<<7 | 0x5A, + 26446 - 19968: jis0208<<14 | 0x2C<<7 | 0x5A, + 26447 - 19968: jis0208<<14 | 0x0F<<7 | 0x28, + 26448 - 19968: jis0208<<14 | 0x19<<7 | 0x3F, + 26449 - 19968: jis0208<<14 | 0x21<<7 | 0x1B, + 26451 - 19968: jis0208<<14 | 0x1B<<7 | 0x3C, + 26452 - 19968: jis0212<<14 | 0x21<<7 | 0x5B, + 26453 - 19968: jis0212<<14 | 0x21<<7 | 0x5C, + 26454 - 19968: jis0208<<14 | 0x1D<<7 | 0x52, + 26457 - 19968: jis0208<<14 | 0x3A<<7 | 0x1A, + 26460 - 19968: jis0208<<14 | 0x24<<7 | 0x2D, + 26461 - 19968: jis0212<<14 | 0x21<<7 | 0x5D, + 26462 - 19968: jis0208<<14 | 0x3A<<7 | 0x18, + 26463 - 19968: jis0208<<14 | 0x21<<7 | 0x0A, + 26464 - 19968: jis0208<<14 | 0x3A<<7 | 0x19, + 26465 - 19968: jis0208<<14 | 0x1D<<7 | 0x51, + 26466 - 19968: jis0208<<14 | 0x2B<<7 | 0x3C, + 26467 - 19968: jis0208<<14 | 0x3A<<7 | 0x1B, + 26468 - 19968: jis0208<<14 | 0x3A<<7 | 0x1C, + 26469 - 19968: jis0208<<14 | 0x2C<<7 | 0x47, + 26470 - 19968: jis0208<<14 | 0x59<<7 | 0x26, + 26474 - 19968: jis0208<<14 | 0x3A<<7 | 0x21, + 26476 - 19968: jis0212<<14 | 0x22<<7 | 0x01, + 26477 - 19968: jis0208<<14 | 0x18<<7 | 0x19, + 26478 - 19968: jis0212<<14 | 0x22<<7 | 0x02, + 26479 - 19968: jis0208<<14 | 0x26<<7 | 0x34, + 26480 - 19968: jis0208<<14 | 0x3A<<7 | 0x1E, + 26481 - 19968: jis0208<<14 | 0x24<<7 | 0x4B, + 26482 - 19968: jis0208<<14 | 0x39<<7 | 0x3D, + 26483 - 19968: jis0208<<14 | 0x39<<7 | 0x41, + 26484 - 19968: jis0212<<14 | 0x22<<7 | 0x03, + 26485 - 19968: jis0208<<14 | 0x14<<7 | 0x2E, + 26486 - 19968: jis0212<<14 | 0x22<<7 | 0x04, + 26487 - 19968: jis0208<<14 | 0x26<<7 | 0x26, + 26491 - 19968: jis0212<<14 | 0x22<<7 | 0x05, + 26492 - 19968: jis0208<<14 | 0x3A<<7 | 0x20, + 26494 - 19968: jis0208<<14 | 0x1D<<7 | 0x1D, + 26495 - 19968: jis0208<<14 | 0x27<<7 | 0x23, + 26497 - 19968: jis0212<<14 | 0x22<<7 | 0x06, + 26500 - 19968: jis0212<<14 | 0x22<<7 | 0x07, + 26501 - 19968: jis0208<<14 | 0x3A<<7 | 0x26, + 26503 - 19968: jis0208<<14 | 0x27<<7 | 0x59, + 26505 - 19968: jis0208<<14 | 0x3A<<7 | 0x1D, + 26507 - 19968: jis0208<<14 | 0x3A<<7 | 0x23, + 26508 - 19968: jis0208<<14 | 0x3A<<7 | 0x22, + 26510 - 19968: jis0212<<14 | 0x22<<7 | 0x08, + 26511 - 19968: jis0212<<14 | 0x22<<7 | 0x09, + 26512 - 19968: jis0208<<14 | 0x1F<<7 | 0x2E, + 26513 - 19968: jis0212<<14 | 0x22<<7 | 0x0A, + 26515 - 19968: jis0212<<14 | 0x22<<7 | 0x0B, + 26517 - 19968: jis0208<<14 | 0x2A<<7 | 0x4C, + 26518 - 19968: jis0212<<14 | 0x22<<7 | 0x0C, + 26519 - 19968: jis0208<<14 | 0x2D<<7 | 0x32, + 26520 - 19968: jis0212<<14 | 0x22<<7 | 0x0D, + 26521 - 19968: jis0212<<14 | 0x22<<7 | 0x0E, + 26522 - 19968: jis0208<<14 | 0x2A<<7 | 0x46, + 26523 - 19968: jis0212<<14 | 0x22<<7 | 0x0F, + 26524 - 19968: jis0208<<14 | 0x11<<7 | 0x2B, + 26525 - 19968: jis0208<<14 | 0x1A<<7 | 0x3D, + 26528 - 19968: jis0208<<14 | 0x2E<<7 | 0x27, + 26529 - 19968: jis0208<<14 | 0x3A<<7 | 0x25, + 26530 - 19968: jis0208<<14 | 0x1E<<7 | 0x54, + 26534 - 19968: jis0208<<14 | 0x3A<<7 | 0x24, + 26537 - 19968: jis0208<<14 | 0x3A<<7 | 0x1F, + 26543 - 19968: jis0208<<14 | 0x17<<7 | 0x2E, + 26544 - 19968: jis0212<<14 | 0x22<<7 | 0x10, + 26545 - 19968: jis0212<<14 | 0x22<<7 | 0x11, + 26546 - 19968: jis0212<<14 | 0x22<<7 | 0x12, + 26547 - 19968: jis0208<<14 | 0x3A<<7 | 0x2B, + 26548 - 19968: jis0208<<14 | 0x3A<<7 | 0x29, + 26549 - 19968: jis0212<<14 | 0x22<<7 | 0x13, + 26550 - 19968: jis0208<<14 | 0x11<<7 | 0x2C, + 26551 - 19968: jis0208<<14 | 0x3A<<7 | 0x27, + 26552 - 19968: jis0208<<14 | 0x3A<<7 | 0x2D, + 26553 - 19968: jis0208<<14 | 0x3A<<7 | 0x33, + 26555 - 19968: jis0208<<14 | 0x59<<7 | 0x27, + 26556 - 19968: jis0212<<14 | 0x22<<7 | 0x15, + 26557 - 19968: jis0212<<14 | 0x22<<7 | 0x16, + 26560 - 19968: jis0208<<14 | 0x59<<7 | 0x29, + 26561 - 19968: jis0208<<14 | 0x21<<7 | 0x27, + 26562 - 19968: jis0212<<14 | 0x22<<7 | 0x19, + 26563 - 19968: jis0212<<14 | 0x22<<7 | 0x1A, + 26564 - 19968: jis0208<<14 | 0x29<<7 | 0x20, + 26565 - 19968: jis0212<<14 | 0x22<<7 | 0x1B, + 26566 - 19968: jis0208<<14 | 0x3A<<7 | 0x35, + 26568 - 19968: jis0212<<14 | 0x22<<7 | 0x1C, + 26569 - 19968: jis0212<<14 | 0x22<<7 | 0x1D, + 26570 - 19968: jis0208<<14 | 0x28<<7 | 0x01, + 26574 - 19968: jis0208<<14 | 0x3A<<7 | 0x34, + 26575 - 19968: jis0208<<14 | 0x26<<7 | 0x4F, + 26576 - 19968: jis0208<<14 | 0x2A<<7 | 0x1E, + 26577 - 19968: jis0208<<14 | 0x13<<7 | 0x1A, + 26578 - 19968: jis0212<<14 | 0x22<<7 | 0x1E, + 26579 - 19968: jis0208<<14 | 0x1F<<7 | 0x56, + 26580 - 19968: jis0208<<14 | 0x1C<<7 | 0x1F, + 26583 - 19968: jis0212<<14 | 0x22<<7 | 0x1F, + 26584 - 19968: jis0208<<14 | 0x23<<7 | 0x32, + 26585 - 19968: jis0212<<14 | 0x22<<7 | 0x20, + 26586 - 19968: jis0208<<14 | 0x2C<<7 | 0x0D, + 26588 - 19968: jis0212<<14 | 0x22<<7 | 0x21, + 26589 - 19968: jis0208<<14 | 0x3A<<7 | 0x30, + 26590 - 19968: jis0208<<14 | 0x3A<<7 | 0x2F, + 26593 - 19968: jis0212<<14 | 0x22<<7 | 0x22, + 26594 - 19968: jis0208<<14 | 0x3A<<7 | 0x31, + 26596 - 19968: jis0208<<14 | 0x3A<<7 | 0x2E, + 26598 - 19968: jis0212<<14 | 0x22<<7 | 0x23, + 26599 - 19968: jis0208<<14 | 0x3A<<7 | 0x36, + 26601 - 19968: jis0208<<14 | 0x3A<<7 | 0x2C, + 26604 - 19968: jis0208<<14 | 0x3A<<7 | 0x2A, + 26606 - 19968: jis0208<<14 | 0x3A<<7 | 0x32, + 26607 - 19968: jis0208<<14 | 0x3A<<7 | 0x28, + 26608 - 19968: jis0212<<14 | 0x22<<7 | 0x24, + 26609 - 19968: jis0208<<14 | 0x22<<7 | 0x4B, + 26610 - 19968: jis0212<<14 | 0x22<<7 | 0x25, + 26611 - 19968: jis0208<<14 | 0x2B<<7 | 0x57, + 26612 - 19968: jis0208<<14 | 0x1B<<7 | 0x25, + 26613 - 19968: jis0208<<14 | 0x19<<7 | 0x53, + 26614 - 19968: jis0212<<14 | 0x22<<7 | 0x26, + 26615 - 19968: jis0212<<14 | 0x22<<7 | 0x27, + 26617 - 19968: jis0212<<14 | 0x22<<7 | 0x17, + 26619 - 19968: jis0208<<14 | 0x19<<7 | 0x19, + 26622 - 19968: jis0208<<14 | 0x2A<<7 | 0x4E, + 26623 - 19968: jis0208<<14 | 0x12<<7 | 0x20, + 26625 - 19968: jis0208<<14 | 0x59<<7 | 0x2A, + 26626 - 19968: jis0208<<14 | 0x23<<7 | 0x2D, + 26627 - 19968: jis0208<<14 | 0x25<<7 | 0x29, + 26628 - 19968: jis0208<<14 | 0x10<<7 | 0x28, + 26643 - 19968: jis0208<<14 | 0x1F<<7 | 0x51, + 26644 - 19968: jis0212<<14 | 0x22<<7 | 0x29, + 26646 - 19968: jis0208<<14 | 0x1F<<7 | 0x13, + 26647 - 19968: jis0208<<14 | 0x16<<7 | 0x09, + 26649 - 19968: jis0212<<14 | 0x22<<7 | 0x2A, + 26653 - 19968: jis0212<<14 | 0x22<<7 | 0x2B, + 26654 - 19968: jis0208<<14 | 0x3A<<7 | 0x38, + 26655 - 19968: jis0212<<14 | 0x22<<7 | 0x2C, + 26657 - 19968: jis0208<<14 | 0x18<<7 | 0x1A, + 26658 - 19968: jis0208<<14 | 0x12<<7 | 0x5B, + 26663 - 19968: jis0212<<14 | 0x22<<7 | 0x2E, + 26664 - 19968: jis0212<<14 | 0x22<<7 | 0x2D, + 26665 - 19968: jis0208<<14 | 0x3A<<7 | 0x3A, + 26666 - 19968: jis0208<<14 | 0x12<<7 | 0x53, + 26667 - 19968: jis0208<<14 | 0x3A<<7 | 0x40, + 26668 - 19968: jis0212<<14 | 0x22<<7 | 0x2F, + 26669 - 19968: jis0212<<14 | 0x22<<7 | 0x30, + 26671 - 19968: jis0212<<14 | 0x22<<7 | 0x31, + 26672 - 19968: jis0212<<14 | 0x22<<7 | 0x32, + 26673 - 19968: jis0212<<14 | 0x22<<7 | 0x33, + 26674 - 19968: jis0208<<14 | 0x3A<<7 | 0x3D, + 26675 - 19968: jis0212<<14 | 0x22<<7 | 0x34, + 26676 - 19968: jis0208<<14 | 0x1F<<7 | 0x52, + 26680 - 19968: jis0208<<14 | 0x12<<7 | 0x2A, + 26681 - 19968: jis0208<<14 | 0x19<<7 | 0x0B, + 26683 - 19968: jis0212<<14 | 0x22<<7 | 0x35, + 26684 - 19968: jis0208<<14 | 0x12<<7 | 0x29, + 26685 - 19968: jis0208<<14 | 0x19<<7 | 0x2E, + 26687 - 19968: jis0212<<14 | 0x22<<7 | 0x36, + 26688 - 19968: jis0208<<14 | 0x3A<<7 | 0x3B, + 26689 - 19968: jis0208<<14 | 0x16<<7 | 0x44, + 26690 - 19968: jis0208<<14 | 0x16<<7 | 0x2A, + 26691 - 19968: jis0208<<14 | 0x24<<7 | 0x4C, + 26692 - 19968: jis0208<<14 | 0x59<<7 | 0x2B, + 26693 - 19968: jis0212<<14 | 0x22<<7 | 0x38, + 26694 - 19968: jis0208<<14 | 0x3A<<7 | 0x39, + 26696 - 19968: jis0208<<14 | 0x0F<<7 | 0x25, + 26698 - 19968: jis0212<<14 | 0x22<<7 | 0x39, + 26700 - 19968: jis0212<<14 | 0x22<<7 | 0x3A, + 26701 - 19968: jis0208<<14 | 0x3A<<7 | 0x3C, + 26702 - 19968: jis0208<<14 | 0x3A<<7 | 0x3E, + 26704 - 19968: jis0208<<14 | 0x15<<7 | 0x2C, + 26705 - 19968: jis0208<<14 | 0x16<<7 | 0x0B, + 26706 - 19968: jis0208<<14 | 0x59<<7 | 0x28, + 26707 - 19968: jis0208<<14 | 0x13<<7 | 0x1B, + 26708 - 19968: jis0208<<14 | 0x14<<7 | 0x2A, + 26709 - 19968: jis0212<<14 | 0x22<<7 | 0x3B, + 26711 - 19968: jis0212<<14 | 0x22<<7 | 0x3C, + 26712 - 19968: jis0212<<14 | 0x22<<7 | 0x3D, + 26713 - 19968: jis0208<<14 | 0x3A<<7 | 0x41, + 26715 - 19968: jis0212<<14 | 0x22<<7 | 0x3E, + 26716 - 19968: jis0208<<14 | 0x19<<7 | 0x58, + 26717 - 19968: jis0208<<14 | 0x2A<<7 | 0x50, + 26719 - 19968: jis0208<<14 | 0x1A<<7 | 0x16, + 26723 - 19968: jis0208<<14 | 0x3A<<7 | 0x42, + 26727 - 19968: jis0208<<14 | 0x28<<7 | 0x0F, + 26731 - 19968: jis0212<<14 | 0x22<<7 | 0x3F, + 26734 - 19968: jis0212<<14 | 0x22<<7 | 0x40, + 26735 - 19968: jis0212<<14 | 0x22<<7 | 0x41, + 26736 - 19968: jis0212<<14 | 0x22<<7 | 0x42, + 26737 - 19968: jis0212<<14 | 0x22<<7 | 0x43, + 26738 - 19968: jis0212<<14 | 0x22<<7 | 0x44, + 26740 - 19968: jis0208<<14 | 0x3A<<7 | 0x4E, + 26741 - 19968: jis0212<<14 | 0x22<<7 | 0x45, + 26742 - 19968: jis0208<<14 | 0x11<<7 | 0x12, + 26743 - 19968: jis0208<<14 | 0x3A<<7 | 0x43, + 26745 - 19968: jis0212<<14 | 0x22<<7 | 0x46, + 26746 - 19968: jis0212<<14 | 0x22<<7 | 0x47, + 26747 - 19968: jis0212<<14 | 0x22<<7 | 0x48, + 26748 - 19968: jis0212<<14 | 0x22<<7 | 0x49, + 26750 - 19968: jis0208<<14 | 0x3A<<7 | 0x54, + 26751 - 19968: jis0208<<14 | 0x3A<<7 | 0x44, + 26753 - 19968: jis0208<<14 | 0x2D<<7 | 0x21, + 26754 - 19968: jis0212<<14 | 0x22<<7 | 0x4A, + 26755 - 19968: jis0208<<14 | 0x3A<<7 | 0x4B, + 26756 - 19968: jis0212<<14 | 0x22<<7 | 0x4B, + 26757 - 19968: jis0208<<14 | 0x26<<7 | 0x3E, + 26758 - 19968: jis0212<<14 | 0x22<<7 | 0x4C, + 26760 - 19968: jis0212<<14 | 0x22<<7 | 0x4D, + 26765 - 19968: jis0208<<14 | 0x3A<<7 | 0x53, + 26767 - 19968: jis0208<<14 | 0x3A<<7 | 0x46, + 26771 - 19968: jis0208<<14 | 0x0F<<7 | 0x13, + 26772 - 19968: jis0208<<14 | 0x3A<<7 | 0x48, + 26774 - 19968: jis0212<<14 | 0x22<<7 | 0x4E, + 26775 - 19968: jis0208<<14 | 0x18<<7 | 0x1B, + 26776 - 19968: jis0212<<14 | 0x22<<7 | 0x4F, + 26778 - 19968: jis0212<<14 | 0x22<<7 | 0x50, + 26779 - 19968: jis0208<<14 | 0x3A<<7 | 0x4A, + 26780 - 19968: jis0212<<14 | 0x22<<7 | 0x51, + 26781 - 19968: jis0208<<14 | 0x3A<<7 | 0x49, + 26783 - 19968: jis0208<<14 | 0x3A<<7 | 0x45, + 26784 - 19968: jis0208<<14 | 0x3A<<7 | 0x50, + 26785 - 19968: jis0212<<14 | 0x22<<7 | 0x52, + 26786 - 19968: jis0208<<14 | 0x1D<<7 | 0x1E, + 26787 - 19968: jis0212<<14 | 0x22<<7 | 0x53, + 26789 - 19968: jis0212<<14 | 0x22<<7 | 0x54, + 26790 - 19968: jis0208<<14 | 0x33<<7 | 0x4C, + 26791 - 19968: jis0208<<14 | 0x17<<7 | 0x47, + 26792 - 19968: jis0208<<14 | 0x2C<<7 | 0x5B, + 26793 - 19968: jis0212<<14 | 0x22<<7 | 0x55, + 26794 - 19968: jis0212<<14 | 0x22<<7 | 0x56, + 26797 - 19968: jis0208<<14 | 0x3A<<7 | 0x47, + 26798 - 19968: jis0212<<14 | 0x22<<7 | 0x57, + 26799 - 19968: jis0208<<14 | 0x23<<7 | 0x53, + 26800 - 19968: jis0208<<14 | 0x12<<7 | 0x02, + 26801 - 19968: jis0208<<14 | 0x19<<7 | 0x0C, + 26802 - 19968: jis0212<<14 | 0x22<<7 | 0x58, + 26803 - 19968: jis0208<<14 | 0x3A<<7 | 0x3F, + 26805 - 19968: jis0208<<14 | 0x3A<<7 | 0x4F, + 26806 - 19968: jis0208<<14 | 0x12<<7 | 0x40, + 26809 - 19968: jis0208<<14 | 0x3A<<7 | 0x4D, + 26810 - 19968: jis0208<<14 | 0x3A<<7 | 0x51, + 26811 - 19968: jis0212<<14 | 0x22<<7 | 0x59, + 26812 - 19968: jis0208<<14 | 0x24<<7 | 0x4D, + 26820 - 19968: jis0208<<14 | 0x13<<7 | 0x5D, + 26821 - 19968: jis0212<<14 | 0x22<<7 | 0x5A, + 26822 - 19968: jis0208<<14 | 0x3B<<7 | 0x11, + 26824 - 19968: jis0208<<14 | 0x58<<7 | 0x08, + 26825 - 19968: jis0208<<14 | 0x2B<<7 | 0x28, + 26826 - 19968: jis0208<<14 | 0x3A<<7 | 0x56, + 26827 - 19968: jis0208<<14 | 0x13<<7 | 0x5C, + 26828 - 19968: jis0212<<14 | 0x22<<7 | 0x5C, + 26829 - 19968: jis0208<<14 | 0x3A<<7 | 0x5D, + 26831 - 19968: jis0208<<14 | 0x59<<7 | 0x2C, + 26832 - 19968: jis0212<<14 | 0x23<<7 | 0x00, + 26833 - 19968: jis0212<<14 | 0x23<<7 | 0x01, + 26834 - 19968: jis0208<<14 | 0x2A<<7 | 0x1F, + 26835 - 19968: jis0212<<14 | 0x23<<7 | 0x02, + 26836 - 19968: jis0208<<14 | 0x3B<<7 | 0x00, + 26837 - 19968: jis0208<<14 | 0x3B<<7 | 0x02, + 26838 - 19968: jis0212<<14 | 0x23<<7 | 0x03, + 26839 - 19968: jis0208<<14 | 0x3B<<7 | 0x06, + 26840 - 19968: jis0208<<14 | 0x3A<<7 | 0x58, + 26841 - 19968: jis0212<<14 | 0x23<<7 | 0x04, + 26842 - 19968: jis0208<<14 | 0x22<<7 | 0x09, + 26844 - 19968: jis0212<<14 | 0x23<<7 | 0x05, + 26845 - 19968: jis0212<<14 | 0x23<<7 | 0x06, + 26847 - 19968: jis0208<<14 | 0x24<<7 | 0x4E, + 26848 - 19968: jis0208<<14 | 0x3B<<7 | 0x0A, + 26849 - 19968: jis0208<<14 | 0x3A<<7 | 0x5B, + 26851 - 19968: jis0208<<14 | 0x3B<<7 | 0x07, + 26853 - 19968: jis0212<<14 | 0x23<<7 | 0x07, + 26855 - 19968: jis0208<<14 | 0x3B<<7 | 0x01, + 26856 - 19968: jis0212<<14 | 0x23<<7 | 0x08, + 26858 - 19968: jis0212<<14 | 0x23<<7 | 0x09, + 26859 - 19968: jis0212<<14 | 0x23<<7 | 0x0A, + 26860 - 19968: jis0212<<14 | 0x23<<7 | 0x0B, + 26861 - 19968: jis0212<<14 | 0x23<<7 | 0x0C, + 26862 - 19968: jis0208<<14 | 0x1E<<7 | 0x18, + 26863 - 19968: jis0208<<14 | 0x3B<<7 | 0x0B, + 26864 - 19968: jis0212<<14 | 0x23<<7 | 0x0D, + 26865 - 19968: jis0212<<14 | 0x23<<7 | 0x0E, + 26866 - 19968: jis0208<<14 | 0x1F<<7 | 0x12, + 26869 - 19968: jis0212<<14 | 0x23<<7 | 0x0F, + 26870 - 19968: jis0212<<14 | 0x23<<7 | 0x10, + 26873 - 19968: jis0208<<14 | 0x3B<<7 | 0x09, + 26874 - 19968: jis0208<<14 | 0x13<<7 | 0x1C, + 26875 - 19968: jis0212<<14 | 0x23<<7 | 0x11, + 26876 - 19968: jis0212<<14 | 0x23<<7 | 0x12, + 26877 - 19968: jis0212<<14 | 0x23<<7 | 0x13, + 26880 - 19968: jis0208<<14 | 0x2E<<7 | 0x2F, + 26881 - 19968: jis0208<<14 | 0x3A<<7 | 0x55, + 26884 - 19968: jis0208<<14 | 0x3B<<7 | 0x05, + 26885 - 19968: jis0208<<14 | 0x0F<<7 | 0x37, + 26886 - 19968: jis0212<<14 | 0x23<<7 | 0x14, + 26888 - 19968: jis0208<<14 | 0x3A<<7 | 0x57, + 26889 - 19968: jis0212<<14 | 0x23<<7 | 0x15, + 26890 - 19968: jis0212<<14 | 0x23<<7 | 0x16, + 26891 - 19968: jis0208<<14 | 0x2B<<7 | 0x19, + 26892 - 19968: jis0208<<14 | 0x3A<<7 | 0x5C, + 26893 - 19968: jis0208<<14 | 0x1E<<7 | 0x01, + 26894 - 19968: jis0208<<14 | 0x23<<7 | 0x26, + 26895 - 19968: jis0208<<14 | 0x3A<<7 | 0x52, + 26896 - 19968: jis0212<<14 | 0x23<<7 | 0x17, + 26897 - 19968: jis0212<<14 | 0x23<<7 | 0x18, + 26898 - 19968: jis0208<<14 | 0x3B<<7 | 0x04, + 26899 - 19968: jis0212<<14 | 0x23<<7 | 0x19, + 26902 - 19968: jis0212<<14 | 0x23<<7 | 0x1A, + 26903 - 19968: jis0212<<14 | 0x23<<7 | 0x1B, + 26905 - 19968: jis0208<<14 | 0x1E<<7 | 0x59, + 26906 - 19968: jis0208<<14 | 0x3B<<7 | 0x0E, + 26907 - 19968: jis0208<<14 | 0x12<<7 | 0x50, + 26908 - 19968: jis0208<<14 | 0x17<<7 | 0x00, + 26913 - 19968: jis0208<<14 | 0x3B<<7 | 0x10, + 26914 - 19968: jis0208<<14 | 0x3A<<7 | 0x59, + 26915 - 19968: jis0208<<14 | 0x3B<<7 | 0x0F, + 26917 - 19968: jis0208<<14 | 0x3B<<7 | 0x08, + 26918 - 19968: jis0208<<14 | 0x3A<<7 | 0x5A, + 26920 - 19968: jis0208<<14 | 0x3B<<7 | 0x0C, + 26922 - 19968: jis0208<<14 | 0x3B<<7 | 0x0D, + 26928 - 19968: jis0208<<14 | 0x3B<<7 | 0x1E, + 26929 - 19968: jis0212<<14 | 0x23<<7 | 0x1C, + 26931 - 19968: jis0212<<14 | 0x23<<7 | 0x1D, + 26932 - 19968: jis0208<<14 | 0x25<<7 | 0x2D, + 26933 - 19968: jis0212<<14 | 0x23<<7 | 0x1E, + 26934 - 19968: jis0208<<14 | 0x3B<<7 | 0x03, + 26936 - 19968: jis0212<<14 | 0x23<<7 | 0x1F, + 26937 - 19968: jis0208<<14 | 0x3B<<7 | 0x1A, + 26939 - 19968: jis0212<<14 | 0x23<<7 | 0x20, + 26941 - 19968: jis0208<<14 | 0x3B<<7 | 0x1C, + 26943 - 19968: jis0208<<14 | 0x23<<7 | 0x37, + 26946 - 19968: jis0212<<14 | 0x23<<7 | 0x21, + 26949 - 19968: jis0212<<14 | 0x23<<7 | 0x22, + 26953 - 19968: jis0212<<14 | 0x23<<7 | 0x23, + 26954 - 19968: jis0208<<14 | 0x2C<<7 | 0x2B, + 26958 - 19968: jis0212<<14 | 0x23<<7 | 0x24, + 26963 - 19968: jis0208<<14 | 0x28<<7 | 0x55, + 26964 - 19968: jis0208<<14 | 0x3B<<7 | 0x17, + 26965 - 19968: jis0208<<14 | 0x21<<7 | 0x29, + 26967 - 19968: jis0212<<14 | 0x23<<7 | 0x25, + 26969 - 19968: jis0208<<14 | 0x3B<<7 | 0x1D, + 26970 - 19968: jis0208<<14 | 0x20<<7 | 0x1E, + 26971 - 19968: jis0212<<14 | 0x23<<7 | 0x26, + 26972 - 19968: jis0208<<14 | 0x3B<<7 | 0x14, + 26973 - 19968: jis0208<<14 | 0x3B<<7 | 0x21, + 26974 - 19968: jis0208<<14 | 0x3B<<7 | 0x20, + 26976 - 19968: jis0208<<14 | 0x25<<7 | 0x4E, + 26977 - 19968: jis0208<<14 | 0x3B<<7 | 0x1F, + 26978 - 19968: jis0208<<14 | 0x25<<7 | 0x49, + 26979 - 19968: jis0212<<14 | 0x23<<7 | 0x27, + 26980 - 19968: jis0212<<14 | 0x23<<7 | 0x28, + 26981 - 19968: jis0212<<14 | 0x23<<7 | 0x29, + 26982 - 19968: jis0212<<14 | 0x23<<7 | 0x2A, + 26984 - 19968: jis0208<<14 | 0x59<<7 | 0x2E, + 26985 - 19968: jis0212<<14 | 0x23<<7 | 0x2C, + 26986 - 19968: jis0208<<14 | 0x3B<<7 | 0x23, + 26987 - 19968: jis0208<<14 | 0x3B<<7 | 0x16, + 26988 - 19968: jis0212<<14 | 0x23<<7 | 0x2D, + 26989 - 19968: jis0208<<14 | 0x15<<7 | 0x27, + 26990 - 19968: jis0208<<14 | 0x3B<<7 | 0x19, + 26991 - 19968: jis0208<<14 | 0x1C<<7 | 0x3C, + 26992 - 19968: jis0212<<14 | 0x23<<7 | 0x2E, + 26993 - 19968: jis0212<<14 | 0x23<<7 | 0x2F, + 26994 - 19968: jis0212<<14 | 0x23<<7 | 0x30, + 26995 - 19968: jis0208<<14 | 0x26<<7 | 0x3F, + 26996 - 19968: jis0208<<14 | 0x3B<<7 | 0x1B, + 26997 - 19968: jis0208<<14 | 0x15<<7 | 0x2A, + 26999 - 19968: jis0208<<14 | 0x3B<<7 | 0x13, + 27000 - 19968: jis0208<<14 | 0x3B<<7 | 0x15, + 27001 - 19968: jis0208<<14 | 0x3B<<7 | 0x12, + 27002 - 19968: jis0212<<14 | 0x23<<7 | 0x31, + 27003 - 19968: jis0212<<14 | 0x23<<7 | 0x32, + 27004 - 19968: jis0208<<14 | 0x2E<<7 | 0x0F, + 27005 - 19968: jis0208<<14 | 0x12<<7 | 0x39, + 27006 - 19968: jis0208<<14 | 0x3B<<7 | 0x18, + 27007 - 19968: jis0212<<14 | 0x23<<7 | 0x33, + 27008 - 19968: jis0212<<14 | 0x23<<7 | 0x34, + 27009 - 19968: jis0208<<14 | 0x3B<<7 | 0x22, + 27010 - 19968: jis0208<<14 | 0x12<<7 | 0x14, + 27018 - 19968: jis0208<<14 | 0x19<<7 | 0x46, + 27021 - 19968: jis0212<<14 | 0x23<<7 | 0x35, + 27022 - 19968: jis0208<<14 | 0x10<<7 | 0x3C, + 27025 - 19968: jis0208<<14 | 0x3B<<7 | 0x33, + 27026 - 19968: jis0212<<14 | 0x23<<7 | 0x36, + 27028 - 19968: jis0208<<14 | 0x2E<<7 | 0x10, + 27029 - 19968: jis0208<<14 | 0x3B<<7 | 0x36, + 27030 - 19968: jis0212<<14 | 0x23<<7 | 0x37, + 27032 - 19968: jis0208<<14 | 0x59<<7 | 0x30, + 27035 - 19968: jis0208<<14 | 0x1E<<7 | 0x19, + 27036 - 19968: jis0208<<14 | 0x3B<<7 | 0x35, + 27040 - 19968: jis0208<<14 | 0x3B<<7 | 0x34, + 27041 - 19968: jis0212<<14 | 0x23<<7 | 0x39, + 27045 - 19968: jis0212<<14 | 0x23<<7 | 0x3A, + 27046 - 19968: jis0212<<14 | 0x23<<7 | 0x3B, + 27047 - 19968: jis0208<<14 | 0x3B<<7 | 0x31, + 27048 - 19968: jis0212<<14 | 0x23<<7 | 0x3C, + 27051 - 19968: jis0212<<14 | 0x23<<7 | 0x3D, + 27053 - 19968: jis0212<<14 | 0x23<<7 | 0x3E, + 27054 - 19968: jis0208<<14 | 0x3B<<7 | 0x25, + 27055 - 19968: jis0212<<14 | 0x23<<7 | 0x3F, + 27057 - 19968: jis0208<<14 | 0x3B<<7 | 0x42, + 27058 - 19968: jis0208<<14 | 0x3B<<7 | 0x24, + 27060 - 19968: jis0208<<14 | 0x3B<<7 | 0x37, + 27063 - 19968: jis0212<<14 | 0x23<<7 | 0x40, + 27064 - 19968: jis0212<<14 | 0x23<<7 | 0x41, + 27066 - 19968: jis0212<<14 | 0x23<<7 | 0x42, + 27067 - 19968: jis0208<<14 | 0x3B<<7 | 0x2F, + 27068 - 19968: jis0212<<14 | 0x23<<7 | 0x43, + 27070 - 19968: jis0208<<14 | 0x3B<<7 | 0x2A, + 27071 - 19968: jis0208<<14 | 0x3B<<7 | 0x27, + 27073 - 19968: jis0208<<14 | 0x3B<<7 | 0x28, + 27075 - 19968: jis0208<<14 | 0x3B<<7 | 0x30, + 27077 - 19968: jis0212<<14 | 0x23<<7 | 0x44, + 27079 - 19968: jis0208<<14 | 0x53<<7 | 0x01, + 27080 - 19968: jis0212<<14 | 0x23<<7 | 0x45, + 27082 - 19968: jis0208<<14 | 0x3B<<7 | 0x2D, + 27083 - 19968: jis0208<<14 | 0x18<<7 | 0x1C, + 27084 - 19968: jis0208<<14 | 0x23<<7 | 0x27, + 27085 - 19968: jis0208<<14 | 0x20<<7 | 0x43, + 27086 - 19968: jis0208<<14 | 0x3B<<7 | 0x2B, + 27088 - 19968: jis0208<<14 | 0x3B<<7 | 0x26, + 27089 - 19968: jis0212<<14 | 0x23<<7 | 0x46, + 27091 - 19968: jis0208<<14 | 0x3B<<7 | 0x29, + 27094 - 19968: jis0212<<14 | 0x23<<7 | 0x47, + 27095 - 19968: jis0212<<14 | 0x23<<7 | 0x48, + 27096 - 19968: jis0208<<14 | 0x2C<<7 | 0x2C, + 27097 - 19968: jis0208<<14 | 0x2A<<7 | 0x49, + 27101 - 19968: jis0208<<14 | 0x3B<<7 | 0x2E, + 27102 - 19968: jis0208<<14 | 0x3B<<7 | 0x38, + 27106 - 19968: jis0208<<14 | 0x59<<7 | 0x31, + 27109 - 19968: jis0212<<14 | 0x23<<7 | 0x4A, + 27111 - 19968: jis0208<<14 | 0x3B<<7 | 0x40, + 27112 - 19968: jis0208<<14 | 0x3B<<7 | 0x39, + 27115 - 19968: jis0208<<14 | 0x3B<<7 | 0x46, + 27117 - 19968: jis0208<<14 | 0x3B<<7 | 0x44, + 27118 - 19968: jis0212<<14 | 0x23<<7 | 0x4B, + 27119 - 19968: jis0212<<14 | 0x23<<7 | 0x4C, + 27121 - 19968: jis0212<<14 | 0x23<<7 | 0x4D, + 27122 - 19968: jis0208<<14 | 0x3B<<7 | 0x3F, + 27123 - 19968: jis0212<<14 | 0x23<<7 | 0x4E, + 27125 - 19968: jis0212<<14 | 0x23<<7 | 0x4F, + 27129 - 19968: jis0208<<14 | 0x3B<<7 | 0x3E, + 27131 - 19968: jis0208<<14 | 0x23<<7 | 0x2F, + 27133 - 19968: jis0208<<14 | 0x20<<7 | 0x44, + 27134 - 19968: jis0212<<14 | 0x23<<7 | 0x50, + 27135 - 19968: jis0208<<14 | 0x3B<<7 | 0x3C, + 27136 - 19968: jis0212<<14 | 0x23<<7 | 0x51, + 27137 - 19968: jis0212<<14 | 0x23<<7 | 0x52, + 27138 - 19968: jis0208<<14 | 0x3B<<7 | 0x3A, + 27139 - 19968: jis0212<<14 | 0x23<<7 | 0x53, + 27141 - 19968: jis0208<<14 | 0x3B<<7 | 0x41, + 27146 - 19968: jis0208<<14 | 0x3B<<7 | 0x47, + 27147 - 19968: jis0208<<14 | 0x27<<7 | 0x54, + 27148 - 19968: jis0208<<14 | 0x3B<<7 | 0x4D, + 27151 - 19968: jis0212<<14 | 0x23<<7 | 0x54, + 27153 - 19968: jis0212<<14 | 0x23<<7 | 0x55, + 27154 - 19968: jis0208<<14 | 0x3B<<7 | 0x48, + 27155 - 19968: jis0208<<14 | 0x3B<<7 | 0x4B, + 27156 - 19968: jis0208<<14 | 0x3B<<7 | 0x45, + 27157 - 19968: jis0212<<14 | 0x23<<7 | 0x56, + 27159 - 19968: jis0208<<14 | 0x22<<7 | 0x53, + 27161 - 19968: jis0208<<14 | 0x28<<7 | 0x17, + 27162 - 19968: jis0212<<14 | 0x23<<7 | 0x57, + 27163 - 19968: jis0208<<14 | 0x3B<<7 | 0x3B, + 27165 - 19968: jis0212<<14 | 0x23<<7 | 0x58, + 27166 - 19968: jis0208<<14 | 0x3B<<7 | 0x43, + 27167 - 19968: jis0208<<14 | 0x1D<<7 | 0x1F, + 27168 - 19968: jis0212<<14 | 0x23<<7 | 0x59, + 27169 - 19968: jis0208<<14 | 0x2B<<7 | 0x2E, + 27170 - 19968: jis0208<<14 | 0x3B<<7 | 0x57, + 27171 - 19968: jis0208<<14 | 0x3B<<7 | 0x4A, + 27172 - 19968: jis0212<<14 | 0x23<<7 | 0x5A, + 27176 - 19968: jis0212<<14 | 0x23<<7 | 0x5B, + 27177 - 19968: jis0208<<14 | 0x17<<7 | 0x01, + 27178 - 19968: jis0208<<14 | 0x11<<7 | 0x02, + 27179 - 19968: jis0208<<14 | 0x12<<7 | 0x3E, + 27182 - 19968: jis0208<<14 | 0x3B<<7 | 0x32, + 27184 - 19968: jis0208<<14 | 0x59<<7 | 0x32, + 27186 - 19968: jis0212<<14 | 0x23<<7 | 0x5D, + 27188 - 19968: jis0212<<14 | 0x24<<7 | 0x00, + 27189 - 19968: jis0208<<14 | 0x1D<<7 | 0x20, + 27190 - 19968: jis0208<<14 | 0x3B<<7 | 0x4F, + 27191 - 19968: jis0212<<14 | 0x24<<7 | 0x01, + 27192 - 19968: jis0208<<14 | 0x3B<<7 | 0x56, + 27193 - 19968: jis0208<<14 | 0x1B<<7 | 0x58, + 27194 - 19968: jis0208<<14 | 0x12<<7 | 0x51, + 27195 - 19968: jis0212<<14 | 0x24<<7 | 0x02, + 27197 - 19968: jis0208<<14 | 0x22<<7 | 0x0D, + 27198 - 19968: jis0212<<14 | 0x24<<7 | 0x03, + 27199 - 19968: jis0212<<14 | 0x24<<7 | 0x04, + 27204 - 19968: jis0208<<14 | 0x3B<<7 | 0x4C, + 27205 - 19968: jis0212<<14 | 0x24<<7 | 0x05, + 27206 - 19968: jis0208<<14 | 0x59<<7 | 0x34, + 27207 - 19968: jis0208<<14 | 0x3B<<7 | 0x51, + 27208 - 19968: jis0208<<14 | 0x3B<<7 | 0x55, + 27209 - 19968: jis0212<<14 | 0x24<<7 | 0x07, + 27210 - 19968: jis0212<<14 | 0x24<<7 | 0x08, + 27211 - 19968: jis0208<<14 | 0x15<<7 | 0x15, + 27214 - 19968: jis0212<<14 | 0x24<<7 | 0x09, + 27216 - 19968: jis0212<<14 | 0x24<<7 | 0x0A, + 27217 - 19968: jis0212<<14 | 0x24<<7 | 0x0B, + 27218 - 19968: jis0212<<14 | 0x24<<7 | 0x0C, + 27221 - 19968: jis0212<<14 | 0x24<<7 | 0x0D, + 27222 - 19968: jis0212<<14 | 0x24<<7 | 0x0E, + 27224 - 19968: jis0208<<14 | 0x14<<7 | 0x2B, + 27225 - 19968: jis0208<<14 | 0x3B<<7 | 0x53, + 27227 - 19968: jis0212<<14 | 0x24<<7 | 0x0F, + 27231 - 19968: jis0208<<14 | 0x14<<7 | 0x00, + 27233 - 19968: jis0208<<14 | 0x25<<7 | 0x2A, + 27234 - 19968: jis0208<<14 | 0x3B<<7 | 0x52, + 27236 - 19968: jis0212<<14 | 0x24<<7 | 0x10, + 27238 - 19968: jis0208<<14 | 0x3B<<7 | 0x54, + 27239 - 19968: jis0212<<14 | 0x24<<7 | 0x11, + 27242 - 19968: jis0212<<14 | 0x24<<7 | 0x12, + 27243 - 19968: jis0208<<14 | 0x59<<7 | 0x33, + 27249 - 19968: jis0212<<14 | 0x24<<7 | 0x13, + 27250 - 19968: jis0208<<14 | 0x3B<<7 | 0x4E, + 27251 - 19968: jis0208<<14 | 0x59<<7 | 0x35, + 27256 - 19968: jis0208<<14 | 0x3B<<7 | 0x50, + 27262 - 19968: jis0208<<14 | 0x59<<7 | 0x36, + 27263 - 19968: jis0208<<14 | 0x12<<7 | 0x3F, + 27264 - 19968: jis0208<<14 | 0x22<<7 | 0x28, + 27265 - 19968: jis0212<<14 | 0x24<<7 | 0x16, + 27267 - 19968: jis0212<<14 | 0x24<<7 | 0x17, + 27268 - 19968: jis0208<<14 | 0x3B<<7 | 0x5B, + 27270 - 19968: jis0212<<14 | 0x24<<7 | 0x18, + 27271 - 19968: jis0212<<14 | 0x24<<7 | 0x19, + 27273 - 19968: jis0212<<14 | 0x24<<7 | 0x1A, + 27275 - 19968: jis0212<<14 | 0x24<<7 | 0x1B, + 27277 - 19968: jis0208<<14 | 0x3B<<7 | 0x59, + 27278 - 19968: jis0208<<14 | 0x17<<7 | 0x48, + 27280 - 19968: jis0208<<14 | 0x3B<<7 | 0x58, + 27281 - 19968: jis0212<<14 | 0x24<<7 | 0x1C, + 27287 - 19968: jis0208<<14 | 0x3C<<7 | 0x00, + 27291 - 19968: jis0212<<14 | 0x24<<7 | 0x1D, + 27292 - 19968: jis0208<<14 | 0x3A<<7 | 0x37, + 27293 - 19968: jis0212<<14 | 0x24<<7 | 0x1E, + 27294 - 19968: jis0212<<14 | 0x24<<7 | 0x1F, + 27295 - 19968: jis0212<<14 | 0x24<<7 | 0x20, + 27296 - 19968: jis0208<<14 | 0x3B<<7 | 0x5A, + 27298 - 19968: jis0208<<14 | 0x3B<<7 | 0x5C, + 27299 - 19968: jis0208<<14 | 0x3B<<7 | 0x5D, + 27301 - 19968: jis0212<<14 | 0x24<<7 | 0x21, + 27306 - 19968: jis0208<<14 | 0x3C<<7 | 0x0B, + 27307 - 19968: jis0212<<14 | 0x24<<7 | 0x22, + 27308 - 19968: jis0208<<14 | 0x3C<<7 | 0x07, + 27310 - 19968: jis0208<<14 | 0x3A<<7 | 0x4C, + 27311 - 19968: jis0212<<14 | 0x24<<7 | 0x23, + 27312 - 19968: jis0212<<14 | 0x24<<7 | 0x24, + 27313 - 19968: jis0212<<14 | 0x24<<7 | 0x25, + 27315 - 19968: jis0208<<14 | 0x3C<<7 | 0x06, + 27316 - 19968: jis0212<<14 | 0x24<<7 | 0x26, + 27320 - 19968: jis0208<<14 | 0x3C<<7 | 0x05, + 27323 - 19968: jis0208<<14 | 0x3C<<7 | 0x02, + 27325 - 19968: jis0212<<14 | 0x24<<7 | 0x27, + 27326 - 19968: jis0212<<14 | 0x24<<7 | 0x28, + 27327 - 19968: jis0212<<14 | 0x24<<7 | 0x29, + 27329 - 19968: jis0208<<14 | 0x3B<<7 | 0x49, + 27330 - 19968: jis0208<<14 | 0x3C<<7 | 0x04, + 27331 - 19968: jis0208<<14 | 0x3C<<7 | 0x03, + 27334 - 19968: jis0212<<14 | 0x24<<7 | 0x2A, + 27336 - 19968: jis0212<<14 | 0x24<<7 | 0x2C, + 27337 - 19968: jis0212<<14 | 0x24<<7 | 0x2B, + 27340 - 19968: jis0212<<14 | 0x24<<7 | 0x2D, + 27344 - 19968: jis0212<<14 | 0x24<<7 | 0x2E, + 27345 - 19968: jis0208<<14 | 0x3C<<7 | 0x09, + 27347 - 19968: jis0208<<14 | 0x2E<<7 | 0x05, + 27348 - 19968: jis0212<<14 | 0x24<<7 | 0x2F, + 27349 - 19968: jis0212<<14 | 0x24<<7 | 0x30, + 27350 - 19968: jis0212<<14 | 0x24<<7 | 0x31, + 27354 - 19968: jis0208<<14 | 0x3C<<7 | 0x0C, + 27355 - 19968: jis0208<<14 | 0x15<<7 | 0x5A, + 27356 - 19968: jis0212<<14 | 0x24<<7 | 0x32, + 27357 - 19968: jis0212<<14 | 0x24<<7 | 0x33, + 27358 - 19968: jis0208<<14 | 0x3C<<7 | 0x08, + 27359 - 19968: jis0208<<14 | 0x3C<<7 | 0x0A, + 27362 - 19968: jis0208<<14 | 0x59<<7 | 0x37, + 27364 - 19968: jis0208<<14 | 0x59<<7 | 0x38, + 27367 - 19968: jis0212<<14 | 0x24<<7 | 0x35, + 27368 - 19968: jis0208<<14 | 0x27<<7 | 0x06, + 27370 - 19968: jis0208<<14 | 0x3C<<7 | 0x0D, + 27372 - 19968: jis0212<<14 | 0x24<<7 | 0x36, + 27376 - 19968: jis0212<<14 | 0x24<<7 | 0x37, + 27377 - 19968: jis0212<<14 | 0x24<<7 | 0x38, + 27378 - 19968: jis0212<<14 | 0x24<<7 | 0x39, + 27386 - 19968: jis0208<<14 | 0x3C<<7 | 0x11, + 27387 - 19968: jis0208<<14 | 0x3C<<7 | 0x0E, + 27388 - 19968: jis0212<<14 | 0x24<<7 | 0x3A, + 27389 - 19968: jis0212<<14 | 0x24<<7 | 0x3B, + 27394 - 19968: jis0212<<14 | 0x24<<7 | 0x3C, + 27395 - 19968: jis0212<<14 | 0x24<<7 | 0x3D, + 27396 - 19968: jis0208<<14 | 0x2C<<7 | 0x52, + 27397 - 19968: jis0208<<14 | 0x3C<<7 | 0x0F, + 27398 - 19968: jis0212<<14 | 0x24<<7 | 0x3E, + 27399 - 19968: jis0212<<14 | 0x24<<7 | 0x3F, + 27401 - 19968: jis0212<<14 | 0x24<<7 | 0x40, + 27402 - 19968: jis0208<<14 | 0x3B<<7 | 0x3D, + 27407 - 19968: jis0212<<14 | 0x24<<7 | 0x41, + 27408 - 19968: jis0212<<14 | 0x24<<7 | 0x42, + 27409 - 19968: jis0212<<14 | 0x24<<7 | 0x43, + 27410 - 19968: jis0208<<14 | 0x3C<<7 | 0x12, + 27414 - 19968: jis0208<<14 | 0x3C<<7 | 0x13, + 27415 - 19968: jis0212<<14 | 0x24<<7 | 0x44, + 27419 - 19968: jis0212<<14 | 0x24<<7 | 0x45, + 27421 - 19968: jis0208<<14 | 0x10<<7 | 0x14, + 27422 - 19968: jis0212<<14 | 0x24<<7 | 0x46, + 27423 - 19968: jis0208<<14 | 0x3C<<7 | 0x15, + 27424 - 19968: jis0208<<14 | 0x16<<7 | 0x46, + 27425 - 19968: jis0208<<14 | 0x1B<<7 | 0x00, + 27427 - 19968: jis0208<<14 | 0x15<<7 | 0x34, + 27428 - 19968: jis0212<<14 | 0x24<<7 | 0x47, + 27431 - 19968: jis0208<<14 | 0x11<<7 | 0x03, + 27432 - 19968: jis0212<<14 | 0x24<<7 | 0x48, + 27435 - 19968: jis0212<<14 | 0x24<<7 | 0x49, + 27436 - 19968: jis0212<<14 | 0x24<<7 | 0x4A, + 27439 - 19968: jis0212<<14 | 0x24<<7 | 0x4B, + 27442 - 19968: jis0208<<14 | 0x2C<<7 | 0x3E, + 27445 - 19968: jis0212<<14 | 0x24<<7 | 0x4C, + 27446 - 19968: jis0212<<14 | 0x24<<7 | 0x4D, + 27447 - 19968: jis0208<<14 | 0x3C<<7 | 0x17, + 27448 - 19968: jis0208<<14 | 0x3C<<7 | 0x16, + 27449 - 19968: jis0208<<14 | 0x3C<<7 | 0x19, + 27450 - 19968: jis0208<<14 | 0x14<<7 | 0x1C, + 27451 - 19968: jis0212<<14 | 0x24<<7 | 0x4E, + 27453 - 19968: jis0208<<14 | 0x15<<7 | 0x35, + 27454 - 19968: jis0208<<14 | 0x13<<7 | 0x1D, + 27455 - 19968: jis0212<<14 | 0x24<<7 | 0x4F, + 27459 - 19968: jis0208<<14 | 0x3C<<7 | 0x1C, + 27462 - 19968: jis0212<<14 | 0x24<<7 | 0x50, + 27463 - 19968: jis0208<<14 | 0x3C<<7 | 0x1B, + 27465 - 19968: jis0208<<14 | 0x3C<<7 | 0x1D, + 27466 - 19968: jis0212<<14 | 0x24<<7 | 0x51, + 27468 - 19968: jis0208<<14 | 0x11<<7 | 0x2D, + 27469 - 19968: jis0212<<14 | 0x24<<7 | 0x52, + 27470 - 19968: jis0208<<14 | 0x22<<7 | 0x16, + 27472 - 19968: jis0208<<14 | 0x3C<<7 | 0x1E, + 27474 - 19968: jis0212<<14 | 0x24<<7 | 0x53, + 27475 - 19968: jis0208<<14 | 0x13<<7 | 0x1E, + 27476 - 19968: jis0208<<14 | 0x3C<<7 | 0x20, + 27478 - 19968: jis0212<<14 | 0x24<<7 | 0x54, + 27480 - 19968: jis0212<<14 | 0x24<<7 | 0x55, + 27481 - 19968: jis0208<<14 | 0x3C<<7 | 0x1F, + 27483 - 19968: jis0208<<14 | 0x3C<<7 | 0x21, + 27485 - 19968: jis0212<<14 | 0x24<<7 | 0x56, + 27487 - 19968: jis0208<<14 | 0x3C<<7 | 0x22, + 27488 - 19968: jis0212<<14 | 0x24<<7 | 0x57, + 27489 - 19968: jis0208<<14 | 0x3C<<7 | 0x23, + 27490 - 19968: jis0208<<14 | 0x1A<<7 | 0x3E, + 27491 - 19968: jis0208<<14 | 0x1F<<7 | 0x14, + 27492 - 19968: jis0208<<14 | 0x19<<7 | 0x00, + 27494 - 19968: jis0208<<14 | 0x28<<7 | 0x4F, + 27495 - 19968: jis0212<<14 | 0x24<<7 | 0x58, + 27497 - 19968: jis0208<<14 | 0x29<<7 | 0x41, + 27498 - 19968: jis0208<<14 | 0x2E<<7 | 0x23, + 27499 - 19968: jis0212<<14 | 0x24<<7 | 0x59, + 27502 - 19968: jis0212<<14 | 0x24<<7 | 0x5A, + 27503 - 19968: jis0208<<14 | 0x1A<<7 | 0x54, + 27504 - 19968: jis0212<<14 | 0x24<<7 | 0x5B, + 27507 - 19968: jis0208<<14 | 0x19<<7 | 0x2F, + 27508 - 19968: jis0208<<14 | 0x2D<<7 | 0x51, + 27509 - 19968: jis0212<<14 | 0x24<<7 | 0x5C, + 27512 - 19968: jis0208<<14 | 0x3C<<7 | 0x24, + 27513 - 19968: jis0208<<14 | 0x3C<<7 | 0x25, + 27515 - 19968: jis0208<<14 | 0x1A<<7 | 0x3F, + 27517 - 19968: jis0212<<14 | 0x24<<7 | 0x5D, + 27518 - 19968: jis0212<<14 | 0x25<<7 | 0x00, + 27519 - 19968: jis0208<<14 | 0x3C<<7 | 0x26, + 27520 - 19968: jis0208<<14 | 0x3C<<7 | 0x27, + 27522 - 19968: jis0212<<14 | 0x25<<7 | 0x01, + 27523 - 19968: jis0208<<14 | 0x3C<<7 | 0x29, + 27524 - 19968: jis0208<<14 | 0x3C<<7 | 0x28, + 27525 - 19968: jis0212<<14 | 0x25<<7 | 0x02, + 27526 - 19968: jis0208<<14 | 0x2A<<7 | 0x37, + 27529 - 19968: jis0208<<14 | 0x1C<<7 | 0x3D, + 27530 - 19968: jis0208<<14 | 0x1B<<7 | 0x4B, + 27531 - 19968: jis0208<<14 | 0x1A<<7 | 0x23, + 27533 - 19968: jis0208<<14 | 0x3C<<7 | 0x2A, + 27541 - 19968: jis0208<<14 | 0x3C<<7 | 0x2C, + 27542 - 19968: jis0208<<14 | 0x1E<<7 | 0x02, + 27543 - 19968: jis0212<<14 | 0x25<<7 | 0x03, + 27544 - 19968: jis0208<<14 | 0x3C<<7 | 0x2B, + 27547 - 19968: jis0212<<14 | 0x25<<7 | 0x04, + 27550 - 19968: jis0208<<14 | 0x3C<<7 | 0x2D, + 27551 - 19968: jis0212<<14 | 0x25<<7 | 0x05, + 27552 - 19968: jis0212<<14 | 0x25<<7 | 0x06, + 27554 - 19968: jis0212<<14 | 0x25<<7 | 0x07, + 27555 - 19968: jis0212<<14 | 0x25<<7 | 0x08, + 27556 - 19968: jis0208<<14 | 0x3C<<7 | 0x2E, + 27560 - 19968: jis0212<<14 | 0x25<<7 | 0x09, + 27561 - 19968: jis0212<<14 | 0x25<<7 | 0x0A, + 27562 - 19968: jis0208<<14 | 0x3C<<7 | 0x2F, + 27563 - 19968: jis0208<<14 | 0x3C<<7 | 0x30, + 27564 - 19968: jis0212<<14 | 0x25<<7 | 0x0B, + 27565 - 19968: jis0212<<14 | 0x25<<7 | 0x0C, + 27566 - 19968: jis0212<<14 | 0x25<<7 | 0x0D, + 27567 - 19968: jis0208<<14 | 0x3C<<7 | 0x31, + 27568 - 19968: jis0212<<14 | 0x25<<7 | 0x0E, + 27569 - 19968: jis0208<<14 | 0x3C<<7 | 0x33, + 27570 - 19968: jis0208<<14 | 0x3C<<7 | 0x32, + 27571 - 19968: jis0208<<14 | 0x3C<<7 | 0x34, + 27572 - 19968: jis0208<<14 | 0x11<<7 | 0x04, + 27573 - 19968: jis0208<<14 | 0x22<<7 | 0x29, + 27575 - 19968: jis0208<<14 | 0x3C<<7 | 0x35, + 27576 - 19968: jis0212<<14 | 0x25<<7 | 0x0F, + 27577 - 19968: jis0212<<14 | 0x25<<7 | 0x10, + 27578 - 19968: jis0208<<14 | 0x1A<<7 | 0x05, + 27579 - 19968: jis0208<<14 | 0x12<<7 | 0x2B, + 27580 - 19968: jis0208<<14 | 0x3C<<7 | 0x36, + 27581 - 19968: jis0212<<14 | 0x25<<7 | 0x11, + 27582 - 19968: jis0212<<14 | 0x25<<7 | 0x12, + 27583 - 19968: jis0208<<14 | 0x24<<7 | 0x21, + 27584 - 19968: jis0208<<14 | 0x33<<7 | 0x2B, + 27587 - 19968: jis0212<<14 | 0x25<<7 | 0x13, + 27588 - 19968: jis0212<<14 | 0x25<<7 | 0x14, + 27589 - 19968: jis0208<<14 | 0x14<<7 | 0x02, + 27590 - 19968: jis0208<<14 | 0x3C<<7 | 0x37, + 27593 - 19968: jis0212<<14 | 0x25<<7 | 0x15, + 27595 - 19968: jis0208<<14 | 0x3C<<7 | 0x38, + 27596 - 19968: jis0212<<14 | 0x25<<7 | 0x16, + 27597 - 19968: jis0208<<14 | 0x29<<7 | 0x4B, + 27598 - 19968: jis0208<<14 | 0x2A<<7 | 0x47, + 27602 - 19968: jis0208<<14 | 0x25<<7 | 0x26, + 27603 - 19968: jis0208<<14 | 0x3C<<7 | 0x39, + 27604 - 19968: jis0208<<14 | 0x27<<7 | 0x45, + 27606 - 19968: jis0208<<14 | 0x59<<7 | 0x39, + 27608 - 19968: jis0208<<14 | 0x27<<7 | 0x5A, + 27610 - 19968: jis0212<<14 | 0x25<<7 | 0x18, + 27611 - 19968: jis0208<<14 | 0x2B<<7 | 0x32, + 27615 - 19968: jis0208<<14 | 0x3C<<7 | 0x3A, + 27617 - 19968: jis0212<<14 | 0x25<<7 | 0x19, + 27619 - 19968: jis0212<<14 | 0x25<<7 | 0x1A, + 27622 - 19968: jis0212<<14 | 0x25<<7 | 0x1B, + 27623 - 19968: jis0212<<14 | 0x25<<7 | 0x1C, + 27627 - 19968: jis0208<<14 | 0x3C<<7 | 0x3C, + 27628 - 19968: jis0208<<14 | 0x3C<<7 | 0x3B, + 27630 - 19968: jis0212<<14 | 0x25<<7 | 0x1D, + 27631 - 19968: jis0208<<14 | 0x3C<<7 | 0x3E, + 27633 - 19968: jis0212<<14 | 0x25<<7 | 0x1E, + 27635 - 19968: jis0208<<14 | 0x3C<<7 | 0x3D, + 27639 - 19968: jis0212<<14 | 0x25<<7 | 0x1F, + 27641 - 19968: jis0212<<14 | 0x25<<7 | 0x20, + 27647 - 19968: jis0212<<14 | 0x25<<7 | 0x21, + 27650 - 19968: jis0212<<14 | 0x25<<7 | 0x22, + 27652 - 19968: jis0212<<14 | 0x25<<7 | 0x23, + 27653 - 19968: jis0212<<14 | 0x25<<7 | 0x24, + 27656 - 19968: jis0208<<14 | 0x3C<<7 | 0x40, + 27657 - 19968: jis0212<<14 | 0x25<<7 | 0x25, + 27661 - 19968: jis0212<<14 | 0x25<<7 | 0x26, + 27662 - 19968: jis0212<<14 | 0x25<<7 | 0x27, + 27663 - 19968: jis0208<<14 | 0x1A<<7 | 0x40, + 27664 - 19968: jis0212<<14 | 0x25<<7 | 0x28, + 27665 - 19968: jis0208<<14 | 0x2B<<7 | 0x10, + 27666 - 19968: jis0212<<14 | 0x25<<7 | 0x29, + 27667 - 19968: jis0208<<14 | 0x3C<<7 | 0x41, + 27668 - 19968: jis0208<<14 | 0x3C<<7 | 0x42, + 27671 - 19968: jis0208<<14 | 0x14<<7 | 0x03, + 27673 - 19968: jis0212<<14 | 0x25<<7 | 0x2A, + 27675 - 19968: jis0208<<14 | 0x3C<<7 | 0x43, + 27679 - 19968: jis0212<<14 | 0x25<<7 | 0x2B, + 27683 - 19968: jis0208<<14 | 0x3C<<7 | 0x45, + 27684 - 19968: jis0208<<14 | 0x3C<<7 | 0x44, + 27686 - 19968: jis0212<<14 | 0x25<<7 | 0x2C, + 27687 - 19968: jis0212<<14 | 0x25<<7 | 0x2D, + 27688 - 19968: jis0212<<14 | 0x25<<7 | 0x2E, + 27692 - 19968: jis0212<<14 | 0x25<<7 | 0x2F, + 27694 - 19968: jis0212<<14 | 0x25<<7 | 0x30, + 27699 - 19968: jis0212<<14 | 0x25<<7 | 0x31, + 27700 - 19968: jis0208<<14 | 0x1E<<7 | 0x44, + 27701 - 19968: jis0212<<14 | 0x25<<7 | 0x32, + 27702 - 19968: jis0212<<14 | 0x25<<7 | 0x33, + 27703 - 19968: jis0208<<14 | 0x28<<7 | 0x18, + 27704 - 19968: jis0208<<14 | 0x10<<7 | 0x29, + 27706 - 19968: jis0212<<14 | 0x25<<7 | 0x34, + 27707 - 19968: jis0212<<14 | 0x25<<7 | 0x35, + 27710 - 19968: jis0208<<14 | 0x27<<7 | 0x24, + 27711 - 19968: jis0208<<14 | 0x59<<7 | 0x3A, + 27712 - 19968: jis0208<<14 | 0x23<<7 | 0x54, + 27713 - 19968: jis0208<<14 | 0x1C<<7 | 0x20, + 27714 - 19968: jis0208<<14 | 0x14<<7 | 0x40, + 27722 - 19968: jis0212<<14 | 0x25<<7 | 0x37, + 27723 - 19968: jis0212<<14 | 0x25<<7 | 0x38, + 27725 - 19968: jis0212<<14 | 0x25<<7 | 0x39, + 27726 - 19968: jis0208<<14 | 0x27<<7 | 0x25, + 27727 - 19968: jis0212<<14 | 0x25<<7 | 0x3A, + 27728 - 19968: jis0208<<14 | 0x1B<<7 | 0x0D, + 27730 - 19968: jis0212<<14 | 0x25<<7 | 0x3B, + 27732 - 19968: jis0212<<14 | 0x25<<7 | 0x3C, + 27733 - 19968: jis0208<<14 | 0x3C<<7 | 0x47, + 27735 - 19968: jis0208<<14 | 0x13<<7 | 0x1F, + 27737 - 19968: jis0212<<14 | 0x25<<7 | 0x3D, + 27738 - 19968: jis0208<<14 | 0x10<<7 | 0x57, + 27739 - 19968: jis0212<<14 | 0x25<<7 | 0x3E, + 27740 - 19968: jis0208<<14 | 0x59<<7 | 0x3B, + 27741 - 19968: jis0208<<14 | 0x25<<7 | 0x51, + 27742 - 19968: jis0208<<14 | 0x3C<<7 | 0x46, + 27743 - 19968: jis0208<<14 | 0x18<<7 | 0x1D, + 27744 - 19968: jis0208<<14 | 0x22<<7 | 0x32, + 27746 - 19968: jis0208<<14 | 0x3C<<7 | 0x48, + 27751 - 19968: jis0212<<14 | 0x26<<7 | 0x15, + 27752 - 19968: jis0208<<14 | 0x3C<<7 | 0x50, + 27754 - 19968: jis0208<<14 | 0x3C<<7 | 0x49, + 27755 - 19968: jis0212<<14 | 0x25<<7 | 0x40, + 27757 - 19968: jis0212<<14 | 0x25<<7 | 0x41, + 27759 - 19968: jis0208<<14 | 0x59<<7 | 0x3D, + 27760 - 19968: jis0208<<14 | 0x21<<7 | 0x20, + 27762 - 19968: jis0208<<14 | 0x14<<7 | 0x41, + 27763 - 19968: jis0208<<14 | 0x3C<<7 | 0x51, + 27764 - 19968: jis0212<<14 | 0x25<<7 | 0x43, + 27766 - 19968: jis0212<<14 | 0x25<<7 | 0x44, + 27768 - 19968: jis0212<<14 | 0x25<<7 | 0x45, + 27769 - 19968: jis0212<<14 | 0x25<<7 | 0x46, + 27770 - 19968: jis0208<<14 | 0x16<<7 | 0x47, + 27771 - 19968: jis0212<<14 | 0x25<<7 | 0x47, + 27773 - 19968: jis0208<<14 | 0x14<<7 | 0x04, + 27774 - 19968: jis0208<<14 | 0x3C<<7 | 0x4F, + 27777 - 19968: jis0208<<14 | 0x3C<<7 | 0x4D, + 27778 - 19968: jis0208<<14 | 0x3C<<7 | 0x4A, + 27779 - 19968: jis0208<<14 | 0x2C<<7 | 0x3F, + 27781 - 19968: jis0212<<14 | 0x25<<7 | 0x48, + 27782 - 19968: jis0208<<14 | 0x59<<7 | 0x3C, + 27783 - 19968: jis0212<<14 | 0x25<<7 | 0x4A, + 27784 - 19968: jis0208<<14 | 0x23<<7 | 0x1F, + 27785 - 19968: jis0212<<14 | 0x25<<7 | 0x4B, + 27788 - 19968: jis0208<<14 | 0x25<<7 | 0x38, + 27789 - 19968: jis0208<<14 | 0x3C<<7 | 0x4B, + 27792 - 19968: jis0208<<14 | 0x3C<<7 | 0x53, + 27794 - 19968: jis0208<<14 | 0x3C<<7 | 0x52, + 27795 - 19968: jis0208<<14 | 0x16<<7 | 0x02, + 27796 - 19968: jis0212<<14 | 0x25<<7 | 0x4C, + 27797 - 19968: jis0212<<14 | 0x25<<7 | 0x4D, + 27798 - 19968: jis0208<<14 | 0x11<<7 | 0x0C, + 27799 - 19968: jis0212<<14 | 0x25<<7 | 0x4E, + 27800 - 19968: jis0212<<14 | 0x25<<7 | 0x4F, + 27801 - 19968: jis0208<<14 | 0x19<<7 | 0x1A, + 27802 - 19968: jis0208<<14 | 0x3C<<7 | 0x4C, + 27803 - 19968: jis0208<<14 | 0x3C<<7 | 0x4E, + 27804 - 19968: jis0212<<14 | 0x25<<7 | 0x50, + 27807 - 19968: jis0212<<14 | 0x25<<7 | 0x51, + 27809 - 19968: jis0208<<14 | 0x2A<<7 | 0x36, + 27810 - 19968: jis0208<<14 | 0x21<<7 | 0x53, + 27819 - 19968: jis0208<<14 | 0x2A<<7 | 0x56, + 27822 - 19968: jis0208<<14 | 0x3C<<7 | 0x5B, + 27824 - 19968: jis0212<<14 | 0x25<<7 | 0x52, + 27825 - 19968: jis0208<<14 | 0x3C<<7 | 0x5C, + 27826 - 19968: jis0212<<14 | 0x25<<7 | 0x53, + 27827 - 19968: jis0208<<14 | 0x11<<7 | 0x2E, + 27828 - 19968: jis0212<<14 | 0x25<<7 | 0x54, + 27832 - 19968: jis0208<<14 | 0x29<<7 | 0x07, + 27833 - 19968: jis0208<<14 | 0x2B<<7 | 0x5C, + 27834 - 19968: jis0208<<14 | 0x3D<<7 | 0x00, + 27835 - 19968: jis0208<<14 | 0x1B<<7 | 0x02, + 27836 - 19968: jis0208<<14 | 0x1D<<7 | 0x21, + 27837 - 19968: jis0208<<14 | 0x3C<<7 | 0x57, + 27838 - 19968: jis0208<<14 | 0x3C<<7 | 0x5D, + 27839 - 19968: jis0208<<14 | 0x10<<7 | 0x47, + 27841 - 19968: jis0208<<14 | 0x15<<7 | 0x16, + 27842 - 19968: jis0212<<14 | 0x25<<7 | 0x55, + 27844 - 19968: jis0208<<14 | 0x3C<<7 | 0x54, + 27845 - 19968: jis0208<<14 | 0x3C<<7 | 0x59, + 27846 - 19968: jis0212<<14 | 0x25<<7 | 0x56, + 27849 - 19968: jis0208<<14 | 0x1F<<7 | 0x53, + 27850 - 19968: jis0208<<14 | 0x26<<7 | 0x50, + 27852 - 19968: jis0208<<14 | 0x27<<7 | 0x46, + 27853 - 19968: jis0212<<14 | 0x25<<7 | 0x57, + 27855 - 19968: jis0212<<14 | 0x25<<7 | 0x58, + 27856 - 19968: jis0212<<14 | 0x25<<7 | 0x59, + 27857 - 19968: jis0212<<14 | 0x25<<7 | 0x5A, + 27858 - 19968: jis0212<<14 | 0x25<<7 | 0x5B, + 27859 - 19968: jis0208<<14 | 0x3C<<7 | 0x56, + 27860 - 19968: jis0212<<14 | 0x25<<7 | 0x5C, + 27861 - 19968: jis0208<<14 | 0x2A<<7 | 0x00, + 27862 - 19968: jis0212<<14 | 0x25<<7 | 0x5D, + 27863 - 19968: jis0208<<14 | 0x3C<<7 | 0x58, + 27865 - 19968: jis0208<<14 | 0x3D<<7 | 0x03, + 27866 - 19968: jis0208<<14 | 0x59<<7 | 0x3E, + 27867 - 19968: jis0208<<14 | 0x3D<<7 | 0x01, + 27868 - 19968: jis0212<<14 | 0x26<<7 | 0x01, + 27869 - 19968: jis0208<<14 | 0x3C<<7 | 0x5A, + 27872 - 19968: jis0212<<14 | 0x26<<7 | 0x02, + 27873 - 19968: jis0208<<14 | 0x2A<<7 | 0x01, + 27874 - 19968: jis0208<<14 | 0x26<<7 | 0x27, + 27875 - 19968: jis0208<<14 | 0x14<<7 | 0x42, + 27877 - 19968: jis0208<<14 | 0x24<<7 | 0x04, + 27879 - 19968: jis0212<<14 | 0x26<<7 | 0x03, + 27880 - 19968: jis0208<<14 | 0x22<<7 | 0x4C, + 27881 - 19968: jis0212<<14 | 0x26<<7 | 0x04, + 27882 - 19968: jis0208<<14 | 0x3D<<7 | 0x04, + 27883 - 19968: jis0212<<14 | 0x26<<7 | 0x05, + 27884 - 19968: jis0212<<14 | 0x26<<7 | 0x06, + 27886 - 19968: jis0212<<14 | 0x26<<7 | 0x07, + 27887 - 19968: jis0208<<14 | 0x3D<<7 | 0x02, + 27888 - 19968: jis0208<<14 | 0x21<<7 | 0x38, + 27889 - 19968: jis0208<<14 | 0x3C<<7 | 0x55, + 27890 - 19968: jis0212<<14 | 0x26<<7 | 0x08, + 27891 - 19968: jis0208<<14 | 0x10<<7 | 0x2A, + 27892 - 19968: jis0212<<14 | 0x26<<7 | 0x09, + 27908 - 19968: jis0208<<14 | 0x59<<7 | 0x3F, + 27911 - 19968: jis0212<<14 | 0x26<<7 | 0x0B, + 27914 - 19968: jis0212<<14 | 0x26<<7 | 0x0C, + 27915 - 19968: jis0208<<14 | 0x2C<<7 | 0x2D, + 27916 - 19968: jis0208<<14 | 0x3D<<7 | 0x0F, + 27918 - 19968: jis0212<<14 | 0x26<<7 | 0x0D, + 27919 - 19968: jis0212<<14 | 0x26<<7 | 0x0E, + 27921 - 19968: jis0212<<14 | 0x26<<7 | 0x0F, + 27922 - 19968: jis0208<<14 | 0x3D<<7 | 0x0E, + 27923 - 19968: jis0212<<14 | 0x26<<7 | 0x10, + 27927 - 19968: jis0208<<14 | 0x1F<<7 | 0x55, + 27929 - 19968: jis0208<<14 | 0x3D<<7 | 0x0B, + 27930 - 19968: jis0212<<14 | 0x26<<7 | 0x11, + 27931 - 19968: jis0208<<14 | 0x2C<<7 | 0x4B, + 27934 - 19968: jis0208<<14 | 0x25<<7 | 0x15, + 27935 - 19968: jis0208<<14 | 0x3D<<7 | 0x05, + 27941 - 19968: jis0208<<14 | 0x23<<7 | 0x24, + 27942 - 19968: jis0212<<14 | 0x26<<7 | 0x12, + 27943 - 19968: jis0212<<14 | 0x26<<7 | 0x13, + 27944 - 19968: jis0212<<14 | 0x26<<7 | 0x14, + 27945 - 19968: jis0208<<14 | 0x10<<7 | 0x2B, + 27946 - 19968: jis0208<<14 | 0x18<<7 | 0x1E, + 27947 - 19968: jis0208<<14 | 0x3D<<7 | 0x08, + 27950 - 19968: jis0212<<14 | 0x26<<7 | 0x16, + 27951 - 19968: jis0212<<14 | 0x26<<7 | 0x17, + 27953 - 19968: jis0212<<14 | 0x26<<7 | 0x18, + 27954 - 19968: jis0208<<14 | 0x1C<<7 | 0x06, + 27955 - 19968: jis0208<<14 | 0x3D<<7 | 0x0D, + 27957 - 19968: jis0208<<14 | 0x3D<<7 | 0x0C, + 27958 - 19968: jis0208<<14 | 0x3D<<7 | 0x07, + 27960 - 19968: jis0208<<14 | 0x3D<<7 | 0x0A, + 27961 - 19968: jis0212<<14 | 0x26<<7 | 0x19, + 27963 - 19968: jis0208<<14 | 0x12<<7 | 0x47, + 27964 - 19968: jis0212<<14 | 0x26<<7 | 0x1A, + 27965 - 19968: jis0208<<14 | 0x3D<<7 | 0x09, + 27966 - 19968: jis0208<<14 | 0x26<<7 | 0x28, + 27967 - 19968: jis0212<<14 | 0x26<<7 | 0x1B, + 27969 - 19968: jis0208<<14 | 0x2D<<7 | 0x0D, + 27972 - 19968: jis0208<<14 | 0x1D<<7 | 0x53, + 27973 - 19968: jis0208<<14 | 0x1F<<7 | 0x54, + 27991 - 19968: jis0212<<14 | 0x26<<7 | 0x1C, + 27993 - 19968: jis0208<<14 | 0x3D<<7 | 0x15, + 27994 - 19968: jis0208<<14 | 0x3D<<7 | 0x13, + 27996 - 19968: jis0208<<14 | 0x28<<7 | 0x2C, + 27998 - 19968: jis0212<<14 | 0x26<<7 | 0x1D, + 27999 - 19968: jis0212<<14 | 0x26<<7 | 0x1E, + 28001 - 19968: jis0212<<14 | 0x26<<7 | 0x1F, + 28003 - 19968: jis0208<<14 | 0x3D<<7 | 0x10, + 28004 - 19968: jis0208<<14 | 0x3D<<7 | 0x12, + 28005 - 19968: jis0212<<14 | 0x26<<7 | 0x20, + 28006 - 19968: jis0208<<14 | 0x10<<7 | 0x19, + 28007 - 19968: jis0212<<14 | 0x26<<7 | 0x21, + 28009 - 19968: jis0208<<14 | 0x18<<7 | 0x1F, + 28010 - 19968: jis0208<<14 | 0x2E<<7 | 0x11, + 28012 - 19968: jis0208<<14 | 0x12<<7 | 0x1C, + 28014 - 19968: jis0208<<14 | 0x28<<7 | 0x41, + 28015 - 19968: jis0208<<14 | 0x59<<7 | 0x41, + 28016 - 19968: jis0212<<14 | 0x26<<7 | 0x23, + 28020 - 19968: jis0208<<14 | 0x2C<<7 | 0x40, + 28023 - 19968: jis0208<<14 | 0x12<<7 | 0x03, + 28024 - 19968: jis0208<<14 | 0x1E<<7 | 0x1A, + 28025 - 19968: jis0208<<14 | 0x3D<<7 | 0x14, + 28028 - 19968: jis0212<<14 | 0x26<<7 | 0x24, + 28034 - 19968: jis0212<<14 | 0x26<<7 | 0x25, + 28037 - 19968: jis0208<<14 | 0x3D<<7 | 0x19, + 28039 - 19968: jis0208<<14 | 0x59<<7 | 0x40, + 28040 - 19968: jis0208<<14 | 0x1D<<7 | 0x22, + 28044 - 19968: jis0208<<14 | 0x2C<<7 | 0x0F, + 28046 - 19968: jis0208<<14 | 0x3D<<7 | 0x16, + 28049 - 19968: jis0212<<14 | 0x26<<7 | 0x27, + 28050 - 19968: jis0212<<14 | 0x26<<7 | 0x28, + 28051 - 19968: jis0208<<14 | 0x3D<<7 | 0x11, + 28052 - 19968: jis0212<<14 | 0x26<<7 | 0x29, + 28053 - 19968: jis0208<<14 | 0x3D<<7 | 0x17, + 28054 - 19968: jis0208<<14 | 0x59<<7 | 0x42, + 28055 - 19968: jis0212<<14 | 0x26<<7 | 0x2B, + 28056 - 19968: jis0212<<14 | 0x26<<7 | 0x2C, + 28057 - 19968: jis0208<<14 | 0x2D<<7 | 0x3D, + 28059 - 19968: jis0208<<14 | 0x24<<7 | 0x52, + 28060 - 19968: jis0208<<14 | 0x25<<7 | 0x21, + 28074 - 19968: jis0212<<14 | 0x26<<7 | 0x2D, + 28076 - 19968: jis0208<<14 | 0x59<<7 | 0x43, + 28079 - 19968: jis0208<<14 | 0x12<<7 | 0x15, + 28082 - 19968: jis0208<<14 | 0x10<<7 | 0x34, + 28084 - 19968: jis0212<<14 | 0x26<<7 | 0x2F, + 28085 - 19968: jis0208<<14 | 0x3D<<7 | 0x1D, + 28087 - 19968: jis0212<<14 | 0x26<<7 | 0x30, + 28088 - 19968: jis0208<<14 | 0x3D<<7 | 0x20, + 28089 - 19968: jis0212<<14 | 0x26<<7 | 0x31, + 28092 - 19968: jis0208<<14 | 0x2D<<7 | 0x22, + 28093 - 19968: jis0212<<14 | 0x26<<7 | 0x32, + 28095 - 19968: jis0212<<14 | 0x26<<7 | 0x33, + 28096 - 19968: jis0208<<14 | 0x2C<<7 | 0x43, + 28100 - 19968: jis0212<<14 | 0x26<<7 | 0x34, + 28101 - 19968: jis0208<<14 | 0x3D<<7 | 0x27, + 28102 - 19968: jis0208<<14 | 0x3D<<7 | 0x21, + 28103 - 19968: jis0208<<14 | 0x3D<<7 | 0x1E, + 28104 - 19968: jis0212<<14 | 0x26<<7 | 0x35, + 28106 - 19968: jis0212<<14 | 0x26<<7 | 0x36, + 28107 - 19968: jis0208<<14 | 0x2D<<7 | 0x33, + 28108 - 19968: jis0208<<14 | 0x3D<<7 | 0x24, + 28110 - 19968: jis0212<<14 | 0x26<<7 | 0x37, + 28111 - 19968: jis0208<<14 | 0x59<<7 | 0x44, + 28113 - 19968: jis0208<<14 | 0x1C<<7 | 0x29, + 28114 - 19968: jis0208<<14 | 0x3D<<7 | 0x26, + 28117 - 19968: jis0208<<14 | 0x3D<<7 | 0x2B, + 28118 - 19968: jis0212<<14 | 0x26<<7 | 0x39, + 28120 - 19968: jis0208<<14 | 0x24<<7 | 0x50, + 28121 - 19968: jis0208<<14 | 0x3D<<7 | 0x29, + 28123 - 19968: jis0212<<14 | 0x26<<7 | 0x3A, + 28125 - 19968: jis0212<<14 | 0x26<<7 | 0x3B, + 28126 - 19968: jis0208<<14 | 0x3D<<7 | 0x23, + 28127 - 19968: jis0212<<14 | 0x26<<7 | 0x3C, + 28128 - 19968: jis0212<<14 | 0x26<<7 | 0x3D, + 28129 - 19968: jis0208<<14 | 0x22<<7 | 0x17, + 28130 - 19968: jis0212<<14 | 0x26<<7 | 0x3E, + 28132 - 19968: jis0208<<14 | 0x3D<<7 | 0x2A, + 28133 - 19968: jis0212<<14 | 0x26<<7 | 0x3F, + 28134 - 19968: jis0208<<14 | 0x3D<<7 | 0x1F, + 28136 - 19968: jis0208<<14 | 0x3D<<7 | 0x25, + 28137 - 19968: jis0212<<14 | 0x26<<7 | 0x40, + 28138 - 19968: jis0208<<14 | 0x3D<<7 | 0x2C, + 28139 - 19968: jis0208<<14 | 0x0F<<7 | 0x5B, + 28140 - 19968: jis0208<<14 | 0x3D<<7 | 0x22, + 28142 - 19968: jis0208<<14 | 0x3D<<7 | 0x2D, + 28143 - 19968: jis0212<<14 | 0x26<<7 | 0x41, + 28144 - 19968: jis0212<<14 | 0x26<<7 | 0x42, + 28145 - 19968: jis0208<<14 | 0x1E<<7 | 0x1B, + 28146 - 19968: jis0208<<14 | 0x59<<7 | 0x46, + 28147 - 19968: jis0208<<14 | 0x1C<<7 | 0x3E, + 28148 - 19968: jis0212<<14 | 0x26<<7 | 0x43, + 28149 - 19968: jis0208<<14 | 0x29<<7 | 0x04, + 28150 - 19968: jis0212<<14 | 0x26<<7 | 0x44, + 28151 - 19968: jis0208<<14 | 0x19<<7 | 0x0D, + 28152 - 19968: jis0208<<14 | 0x59<<7 | 0x45, + 28153 - 19968: jis0208<<14 | 0x3D<<7 | 0x1A, + 28154 - 19968: jis0208<<14 | 0x3D<<7 | 0x28, + 28155 - 19968: jis0208<<14 | 0x24<<7 | 0x19, + 28156 - 19968: jis0208<<14 | 0x59<<7 | 0x47, + 28160 - 19968: jis0212<<14 | 0x26<<7 | 0x46, + 28164 - 19968: jis0212<<14 | 0x26<<7 | 0x47, + 28165 - 19968: jis0208<<14 | 0x1F<<7 | 0x15, + 28167 - 19968: jis0208<<14 | 0x12<<7 | 0x48, + 28168 - 19968: jis0208<<14 | 0x19<<7 | 0x30, + 28169 - 19968: jis0208<<14 | 0x1D<<7 | 0x23, + 28170 - 19968: jis0208<<14 | 0x3D<<7 | 0x1C, + 28171 - 19968: jis0208<<14 | 0x1C<<7 | 0x21, + 28179 - 19968: jis0208<<14 | 0x16<<7 | 0x2B, + 28181 - 19968: jis0208<<14 | 0x3D<<7 | 0x1B, + 28185 - 19968: jis0208<<14 | 0x3D<<7 | 0x31, + 28186 - 19968: jis0208<<14 | 0x1C<<7 | 0x4C, + 28187 - 19968: jis0208<<14 | 0x17<<7 | 0x19, + 28189 - 19968: jis0208<<14 | 0x3D<<7 | 0x40, + 28190 - 19968: jis0212<<14 | 0x26<<7 | 0x48, + 28191 - 19968: jis0208<<14 | 0x3D<<7 | 0x3A, + 28192 - 19968: jis0208<<14 | 0x14<<7 | 0x53, + 28193 - 19968: jis0208<<14 | 0x24<<7 | 0x2E, + 28194 - 19968: jis0212<<14 | 0x26<<7 | 0x49, + 28195 - 19968: jis0208<<14 | 0x3D<<7 | 0x35, + 28196 - 19968: jis0208<<14 | 0x3D<<7 | 0x3E, + 28197 - 19968: jis0208<<14 | 0x0F<<7 | 0x0E, + 28198 - 19968: jis0208<<14 | 0x10<<7 | 0x11, + 28199 - 19968: jis0208<<14 | 0x59<<7 | 0x4A, + 28201 - 19968: jis0208<<14 | 0x11<<7 | 0x18, + 28203 - 19968: jis0208<<14 | 0x3D<<7 | 0x37, + 28204 - 19968: jis0208<<14 | 0x21<<7 | 0x0B, + 28205 - 19968: jis0208<<14 | 0x3D<<7 | 0x2E, + 28206 - 19968: jis0208<<14 | 0x3D<<7 | 0x30, + 28207 - 19968: jis0208<<14 | 0x18<<7 | 0x20, + 28210 - 19968: jis0212<<14 | 0x26<<7 | 0x4B, + 28214 - 19968: jis0212<<14 | 0x26<<7 | 0x4C, + 28216 - 19968: jis0208<<14 | 0x3D<<7 | 0x41, + 28217 - 19968: jis0208<<14 | 0x59<<7 | 0x48, + 28218 - 19968: jis0208<<14 | 0x3D<<7 | 0x3C, + 28219 - 19968: jis0212<<14 | 0x26<<7 | 0x4E, + 28220 - 19968: jis0208<<14 | 0x59<<7 | 0x4B, + 28222 - 19968: jis0208<<14 | 0x3D<<7 | 0x34, + 28227 - 19968: jis0208<<14 | 0x3D<<7 | 0x3B, + 28228 - 19968: jis0212<<14 | 0x26<<7 | 0x50, + 28229 - 19968: jis0212<<14 | 0x26<<7 | 0x51, + 28232 - 19968: jis0212<<14 | 0x26<<7 | 0x52, + 28233 - 19968: jis0212<<14 | 0x26<<7 | 0x53, + 28234 - 19968: jis0208<<14 | 0x2B<<7 | 0x0A, + 28235 - 19968: jis0212<<14 | 0x26<<7 | 0x54, + 28237 - 19968: jis0208<<14 | 0x3D<<7 | 0x39, + 28238 - 19968: jis0208<<14 | 0x3D<<7 | 0x3D, + 28239 - 19968: jis0212<<14 | 0x26<<7 | 0x55, + 28241 - 19968: jis0212<<14 | 0x26<<7 | 0x56, + 28242 - 19968: jis0212<<14 | 0x26<<7 | 0x57, + 28243 - 19968: jis0212<<14 | 0x26<<7 | 0x58, + 28244 - 19968: jis0212<<14 | 0x26<<7 | 0x59, + 28246 - 19968: jis0208<<14 | 0x17<<7 | 0x2F, + 28247 - 19968: jis0212<<14 | 0x26<<7 | 0x5A, + 28248 - 19968: jis0208<<14 | 0x1D<<7 | 0x24, + 28251 - 19968: jis0208<<14 | 0x22<<7 | 0x18, + 28252 - 19968: jis0208<<14 | 0x59<<7 | 0x49, + 28253 - 19968: jis0212<<14 | 0x26<<7 | 0x5C, + 28254 - 19968: jis0212<<14 | 0x26<<7 | 0x5D, + 28255 - 19968: jis0208<<14 | 0x3D<<7 | 0x33, + 28258 - 19968: jis0212<<14 | 0x27<<7 | 0x00, + 28259 - 19968: jis0212<<14 | 0x27<<7 | 0x01, + 28263 - 19968: jis0208<<14 | 0x2C<<7 | 0x0E, + 28264 - 19968: jis0212<<14 | 0x27<<7 | 0x02, + 28267 - 19968: jis0208<<14 | 0x3D<<7 | 0x36, + 28270 - 19968: jis0208<<14 | 0x3D<<7 | 0x2F, + 28271 - 19968: jis0208<<14 | 0x24<<7 | 0x51, + 28274 - 19968: jis0208<<14 | 0x3D<<7 | 0x32, + 28275 - 19968: jis0212<<14 | 0x27<<7 | 0x03, + 28278 - 19968: jis0208<<14 | 0x3D<<7 | 0x38, + 28283 - 19968: jis0212<<14 | 0x27<<7 | 0x04, + 28285 - 19968: jis0212<<14 | 0x27<<7 | 0x05, + 28286 - 19968: jis0208<<14 | 0x2E<<7 | 0x30, + 28287 - 19968: jis0208<<14 | 0x1B<<7 | 0x1D, + 28288 - 19968: jis0208<<14 | 0x2A<<7 | 0x5D, + 28290 - 19968: jis0208<<14 | 0x3D<<7 | 0x42, + 28300 - 19968: jis0208<<14 | 0x27<<7 | 0x0D, + 28301 - 19968: jis0212<<14 | 0x27<<7 | 0x06, + 28303 - 19968: jis0208<<14 | 0x3D<<7 | 0x4E, + 28304 - 19968: jis0208<<14 | 0x17<<7 | 0x1A, + 28307 - 19968: jis0212<<14 | 0x27<<7 | 0x07, + 28310 - 19968: jis0208<<14 | 0x1C<<7 | 0x3F, + 28312 - 19968: jis0208<<14 | 0x3D<<7 | 0x44, + 28313 - 19968: jis0212<<14 | 0x27<<7 | 0x08, + 28316 - 19968: jis0208<<14 | 0x2D<<7 | 0x0E, + 28317 - 19968: jis0208<<14 | 0x18<<7 | 0x21, + 28319 - 19968: jis0208<<14 | 0x3D<<7 | 0x51, + 28320 - 19968: jis0212<<14 | 0x27<<7 | 0x09, + 28322 - 19968: jis0208<<14 | 0x0F<<7 | 0x4D, + 28325 - 19968: jis0208<<14 | 0x3D<<7 | 0x4F, + 28327 - 19968: jis0212<<14 | 0x27<<7 | 0x0A, + 28330 - 19968: jis0208<<14 | 0x3D<<7 | 0x43, + 28333 - 19968: jis0212<<14 | 0x27<<7 | 0x0B, + 28334 - 19968: jis0212<<14 | 0x27<<7 | 0x0C, + 28335 - 19968: jis0208<<14 | 0x3D<<7 | 0x49, + 28337 - 19968: jis0212<<14 | 0x27<<7 | 0x0D, + 28338 - 19968: jis0208<<14 | 0x3D<<7 | 0x4B, + 28339 - 19968: jis0212<<14 | 0x27<<7 | 0x0E, + 28342 - 19968: jis0208<<14 | 0x2C<<7 | 0x2E, + 28343 - 19968: jis0208<<14 | 0x3D<<7 | 0x46, + 28346 - 19968: jis0208<<14 | 0x24<<7 | 0x0D, + 28347 - 19968: jis0212<<14 | 0x27<<7 | 0x0F, + 28349 - 19968: jis0208<<14 | 0x3D<<7 | 0x48, + 28351 - 19968: jis0208<<14 | 0x59<<7 | 0x4C, + 28352 - 19968: jis0212<<14 | 0x27<<7 | 0x11, + 28353 - 19968: jis0212<<14 | 0x27<<7 | 0x12, + 28354 - 19968: jis0208<<14 | 0x3D<<7 | 0x50, + 28355 - 19968: jis0212<<14 | 0x27<<7 | 0x13, + 28356 - 19968: jis0208<<14 | 0x3D<<7 | 0x4A, + 28357 - 19968: jis0208<<14 | 0x2B<<7 | 0x26, + 28359 - 19968: jis0212<<14 | 0x27<<7 | 0x14, + 28360 - 19968: jis0212<<14 | 0x27<<7 | 0x15, + 28361 - 19968: jis0208<<14 | 0x3D<<7 | 0x45, + 28362 - 19968: jis0212<<14 | 0x27<<7 | 0x16, + 28363 - 19968: jis0208<<14 | 0x1B<<7 | 0x01, + 28364 - 19968: jis0208<<14 | 0x3D<<7 | 0x5D, + 28365 - 19968: jis0212<<14 | 0x27<<7 | 0x17, + 28366 - 19968: jis0212<<14 | 0x27<<7 | 0x18, + 28367 - 19968: jis0212<<14 | 0x27<<7 | 0x19, + 28369 - 19968: jis0208<<14 | 0x12<<7 | 0x49, + 28371 - 19968: jis0208<<14 | 0x3D<<7 | 0x47, + 28372 - 19968: jis0208<<14 | 0x3D<<7 | 0x4C, + 28373 - 19968: jis0208<<14 | 0x3D<<7 | 0x4D, + 28381 - 19968: jis0208<<14 | 0x21<<7 | 0x4B, + 28382 - 19968: jis0208<<14 | 0x21<<7 | 0x39, + 28395 - 19968: jis0212<<14 | 0x27<<7 | 0x1A, + 28396 - 19968: jis0208<<14 | 0x3D<<7 | 0x55, + 28397 - 19968: jis0212<<14 | 0x27<<7 | 0x1B, + 28398 - 19968: jis0212<<14 | 0x27<<7 | 0x1C, + 28399 - 19968: jis0208<<14 | 0x3D<<7 | 0x5B, + 28402 - 19968: jis0208<<14 | 0x3D<<7 | 0x59, + 28404 - 19968: jis0208<<14 | 0x24<<7 | 0x08, + 28407 - 19968: jis0208<<14 | 0x3E<<7 | 0x02, + 28408 - 19968: jis0208<<14 | 0x3D<<7 | 0x56, + 28409 - 19968: jis0212<<14 | 0x27<<7 | 0x1D, + 28411 - 19968: jis0212<<14 | 0x27<<7 | 0x1E, + 28413 - 19968: jis0212<<14 | 0x27<<7 | 0x1F, + 28414 - 19968: jis0208<<14 | 0x3D<<7 | 0x57, + 28415 - 19968: jis0208<<14 | 0x3D<<7 | 0x3F, + 28417 - 19968: jis0208<<14 | 0x14<<7 | 0x58, + 28418 - 19968: jis0208<<14 | 0x28<<7 | 0x19, + 28420 - 19968: jis0212<<14 | 0x27<<7 | 0x20, + 28422 - 19968: jis0208<<14 | 0x1B<<7 | 0x1E, + 28424 - 19968: jis0212<<14 | 0x27<<7 | 0x21, + 28425 - 19968: jis0208<<14 | 0x18<<7 | 0x56, + 28426 - 19968: jis0212<<14 | 0x27<<7 | 0x22, + 28428 - 19968: jis0212<<14 | 0x27<<7 | 0x23, + 28429 - 19968: jis0212<<14 | 0x27<<7 | 0x24, + 28431 - 19968: jis0208<<14 | 0x2E<<7 | 0x12, + 28433 - 19968: jis0208<<14 | 0x3D<<7 | 0x53, + 28435 - 19968: jis0208<<14 | 0x3E<<7 | 0x01, + 28436 - 19968: jis0208<<14 | 0x10<<7 | 0x48, + 28437 - 19968: jis0208<<14 | 0x20<<7 | 0x45, + 28438 - 19968: jis0212<<14 | 0x27<<7 | 0x25, + 28440 - 19968: jis0212<<14 | 0x27<<7 | 0x26, + 28442 - 19968: jis0212<<14 | 0x27<<7 | 0x27, + 28443 - 19968: jis0212<<14 | 0x27<<7 | 0x28, + 28448 - 19968: jis0208<<14 | 0x26<<7 | 0x58, + 28450 - 19968: jis0208<<14 | 0x13<<7 | 0x20, + 28451 - 19968: jis0208<<14 | 0x2D<<7 | 0x59, + 28454 - 19968: jis0212<<14 | 0x27<<7 | 0x29, + 28457 - 19968: jis0212<<14 | 0x27<<7 | 0x2A, + 28458 - 19968: jis0212<<14 | 0x27<<7 | 0x2B, + 28459 - 19968: jis0208<<14 | 0x2B<<7 | 0x00, + 28460 - 19968: jis0208<<14 | 0x23<<7 | 0x31, + 28461 - 19968: jis0212<<14 | 0x27<<7 | 0x32, + 28463 - 19968: jis0212<<14 | 0x27<<7 | 0x2C, + 28464 - 19968: jis0212<<14 | 0x27<<7 | 0x2D, + 28465 - 19968: jis0208<<14 | 0x3D<<7 | 0x5A, + 28466 - 19968: jis0208<<14 | 0x3D<<7 | 0x5C, + 28467 - 19968: jis0212<<14 | 0x27<<7 | 0x2E, + 28470 - 19968: jis0212<<14 | 0x27<<7 | 0x2F, + 28472 - 19968: jis0208<<14 | 0x20<<7 | 0x11, + 28475 - 19968: jis0212<<14 | 0x27<<7 | 0x30, + 28476 - 19968: jis0212<<14 | 0x27<<7 | 0x31, + 28478 - 19968: jis0208<<14 | 0x3E<<7 | 0x00, + 28479 - 19968: jis0208<<14 | 0x3D<<7 | 0x58, + 28481 - 19968: jis0208<<14 | 0x3D<<7 | 0x52, + 28485 - 19968: jis0208<<14 | 0x13<<7 | 0x22, + 28495 - 19968: jis0212<<14 | 0x27<<7 | 0x33, + 28497 - 19968: jis0212<<14 | 0x27<<7 | 0x34, + 28498 - 19968: jis0212<<14 | 0x27<<7 | 0x35, + 28499 - 19968: jis0212<<14 | 0x27<<7 | 0x36, + 28500 - 19968: jis0208<<14 | 0x16<<7 | 0x48, + 28503 - 19968: jis0212<<14 | 0x27<<7 | 0x37, + 28504 - 19968: jis0208<<14 | 0x3E<<7 | 0x0E, + 28505 - 19968: jis0212<<14 | 0x27<<7 | 0x38, + 28506 - 19968: jis0212<<14 | 0x27<<7 | 0x39, + 28507 - 19968: jis0208<<14 | 0x3E<<7 | 0x09, + 28508 - 19968: jis0208<<14 | 0x1F<<7 | 0x57, + 28509 - 19968: jis0212<<14 | 0x27<<7 | 0x3A, + 28510 - 19968: jis0212<<14 | 0x27<<7 | 0x3B, + 28511 - 19968: jis0208<<14 | 0x12<<7 | 0x42, + 28513 - 19968: jis0212<<14 | 0x27<<7 | 0x3C, + 28514 - 19968: jis0212<<14 | 0x27<<7 | 0x3D, + 28516 - 19968: jis0208<<14 | 0x1C<<7 | 0x40, + 28518 - 19968: jis0208<<14 | 0x3E<<7 | 0x12, + 28520 - 19968: jis0212<<14 | 0x27<<7 | 0x3E, + 28524 - 19968: jis0212<<14 | 0x27<<7 | 0x3F, + 28525 - 19968: jis0208<<14 | 0x3E<<7 | 0x0B, + 28526 - 19968: jis0208<<14 | 0x23<<7 | 0x0B, + 28527 - 19968: jis0208<<14 | 0x3E<<7 | 0x08, + 28528 - 19968: jis0208<<14 | 0x23<<7 | 0x38, + 28532 - 19968: jis0208<<14 | 0x3E<<7 | 0x2B, + 28536 - 19968: jis0208<<14 | 0x3E<<7 | 0x05, + 28538 - 19968: jis0208<<14 | 0x3E<<7 | 0x04, + 28540 - 19968: jis0208<<14 | 0x3E<<7 | 0x0D, + 28541 - 19968: jis0212<<14 | 0x27<<7 | 0x40, + 28542 - 19968: jis0212<<14 | 0x27<<7 | 0x41, + 28544 - 19968: jis0208<<14 | 0x3E<<7 | 0x07, + 28545 - 19968: jis0208<<14 | 0x3E<<7 | 0x06, + 28546 - 19968: jis0208<<14 | 0x3E<<7 | 0x0C, + 28547 - 19968: jis0212<<14 | 0x27<<7 | 0x42, + 28548 - 19968: jis0208<<14 | 0x1F<<7 | 0x00, + 28550 - 19968: jis0208<<14 | 0x3E<<7 | 0x03, + 28551 - 19968: jis0212<<14 | 0x27<<7 | 0x43, + 28552 - 19968: jis0208<<14 | 0x59<<7 | 0x4D, + 28555 - 19968: jis0212<<14 | 0x27<<7 | 0x45, + 28556 - 19968: jis0212<<14 | 0x27<<7 | 0x46, + 28557 - 19968: jis0212<<14 | 0x27<<7 | 0x47, + 28558 - 19968: jis0208<<14 | 0x3E<<7 | 0x0F, + 28560 - 19968: jis0212<<14 | 0x27<<7 | 0x48, + 28561 - 19968: jis0208<<14 | 0x3E<<7 | 0x10, + 28562 - 19968: jis0212<<14 | 0x27<<7 | 0x49, + 28563 - 19968: jis0212<<14 | 0x27<<7 | 0x4A, + 28564 - 19968: jis0212<<14 | 0x27<<7 | 0x4B, + 28566 - 19968: jis0212<<14 | 0x27<<7 | 0x4C, + 28567 - 19968: jis0208<<14 | 0x13<<7 | 0x21, + 28570 - 19968: jis0212<<14 | 0x27<<7 | 0x4D, + 28575 - 19968: jis0212<<14 | 0x27<<7 | 0x4E, + 28576 - 19968: jis0212<<14 | 0x27<<7 | 0x4F, + 28577 - 19968: jis0208<<14 | 0x3E<<7 | 0x15, + 28579 - 19968: jis0208<<14 | 0x3E<<7 | 0x14, + 28580 - 19968: jis0208<<14 | 0x3E<<7 | 0x16, + 28581 - 19968: jis0212<<14 | 0x27<<7 | 0x50, + 28582 - 19968: jis0212<<14 | 0x27<<7 | 0x51, + 28583 - 19968: jis0212<<14 | 0x27<<7 | 0x52, + 28584 - 19968: jis0212<<14 | 0x27<<7 | 0x53, + 28586 - 19968: jis0208<<14 | 0x3E<<7 | 0x19, + 28590 - 19968: jis0212<<14 | 0x27<<7 | 0x54, + 28591 - 19968: jis0212<<14 | 0x27<<7 | 0x55, + 28592 - 19968: jis0212<<14 | 0x27<<7 | 0x56, + 28593 - 19968: jis0208<<14 | 0x24<<7 | 0x22, + 28595 - 19968: jis0208<<14 | 0x3E<<7 | 0x13, + 28597 - 19968: jis0208<<14 | 0x59<<7 | 0x4E, + 28598 - 19968: jis0212<<14 | 0x27<<7 | 0x58, + 28601 - 19968: jis0208<<14 | 0x3E<<7 | 0x17, + 28604 - 19968: jis0212<<14 | 0x27<<7 | 0x59, + 28608 - 19968: jis0208<<14 | 0x16<<7 | 0x42, + 28609 - 19968: jis0208<<14 | 0x21<<7 | 0x58, + 28610 - 19968: jis0208<<14 | 0x3E<<7 | 0x11, + 28611 - 19968: jis0208<<14 | 0x26<<7 | 0x1A, + 28613 - 19968: jis0212<<14 | 0x27<<7 | 0x5A, + 28614 - 19968: jis0208<<14 | 0x3E<<7 | 0x18, + 28615 - 19968: jis0212<<14 | 0x27<<7 | 0x5B, + 28616 - 19968: jis0212<<14 | 0x27<<7 | 0x5C, + 28618 - 19968: jis0212<<14 | 0x27<<7 | 0x5D, + 28628 - 19968: jis0208<<14 | 0x3E<<7 | 0x1D, + 28629 - 19968: jis0208<<14 | 0x3E<<7 | 0x1B, + 28632 - 19968: jis0208<<14 | 0x3E<<7 | 0x1E, + 28634 - 19968: jis0212<<14 | 0x28<<7 | 0x00, + 28635 - 19968: jis0208<<14 | 0x3E<<7 | 0x21, + 28638 - 19968: jis0212<<14 | 0x28<<7 | 0x01, + 28639 - 19968: jis0208<<14 | 0x3E<<7 | 0x1A, + 28640 - 19968: jis0208<<14 | 0x18<<7 | 0x49, + 28641 - 19968: jis0208<<14 | 0x26<<7 | 0x07, + 28644 - 19968: jis0208<<14 | 0x3D<<7 | 0x18, + 28648 - 19968: jis0212<<14 | 0x28<<7 | 0x02, + 28649 - 19968: jis0212<<14 | 0x28<<7 | 0x03, + 28651 - 19968: jis0208<<14 | 0x2C<<7 | 0x53, + 28652 - 19968: jis0208<<14 | 0x3E<<7 | 0x1C, + 28654 - 19968: jis0208<<14 | 0x3E<<7 | 0x20, + 28655 - 19968: jis0208<<14 | 0x21<<7 | 0x54, + 28656 - 19968: jis0212<<14 | 0x28<<7 | 0x04, + 28657 - 19968: jis0208<<14 | 0x3E<<7 | 0x1F, + 28659 - 19968: jis0208<<14 | 0x3E<<7 | 0x0A, + 28661 - 19968: jis0208<<14 | 0x59<<7 | 0x4F, + 28662 - 19968: jis0208<<14 | 0x4E<<7 | 0x48, + 28665 - 19968: jis0212<<14 | 0x28<<7 | 0x06, + 28666 - 19968: jis0208<<14 | 0x3E<<7 | 0x24, + 28668 - 19968: jis0212<<14 | 0x28<<7 | 0x07, + 28669 - 19968: jis0212<<14 | 0x28<<7 | 0x08, + 28670 - 19968: jis0208<<14 | 0x3E<<7 | 0x28, + 28672 - 19968: jis0212<<14 | 0x28<<7 | 0x09, + 28673 - 19968: jis0208<<14 | 0x3E<<7 | 0x26, + 28677 - 19968: jis0208<<14 | 0x59<<7 | 0x50, + 28678 - 19968: jis0212<<14 | 0x28<<7 | 0x0B, + 28679 - 19968: jis0208<<14 | 0x59<<7 | 0x51, + 28681 - 19968: jis0208<<14 | 0x3E<<7 | 0x22, + 28683 - 19968: jis0208<<14 | 0x3E<<7 | 0x23, + 28685 - 19968: jis0212<<14 | 0x28<<7 | 0x0D, + 28687 - 19968: jis0208<<14 | 0x3E<<7 | 0x27, + 28689 - 19968: jis0208<<14 | 0x3E<<7 | 0x25, + 28693 - 19968: jis0208<<14 | 0x28<<7 | 0x2D, + 28695 - 19968: jis0212<<14 | 0x28<<7 | 0x0E, + 28696 - 19968: jis0208<<14 | 0x3E<<7 | 0x2D, + 28698 - 19968: jis0208<<14 | 0x3E<<7 | 0x2A, + 28699 - 19968: jis0208<<14 | 0x3E<<7 | 0x29, + 28701 - 19968: jis0208<<14 | 0x3E<<7 | 0x2C, + 28702 - 19968: jis0208<<14 | 0x25<<7 | 0x33, + 28703 - 19968: jis0208<<14 | 0x3E<<7 | 0x2E, + 28704 - 19968: jis0212<<14 | 0x28<<7 | 0x0F, + 28707 - 19968: jis0212<<14 | 0x28<<7 | 0x10, + 28710 - 19968: jis0208<<14 | 0x22<<7 | 0x54, + 28711 - 19968: jis0208<<14 | 0x21<<7 | 0x4C, + 28712 - 19968: jis0208<<14 | 0x59<<7 | 0x52, + 28716 - 19968: jis0208<<14 | 0x1F<<7 | 0x04, + 28719 - 19968: jis0212<<14 | 0x28<<7 | 0x11, + 28720 - 19968: jis0208<<14 | 0x3E<<7 | 0x2F, + 28722 - 19968: jis0208<<14 | 0x3E<<7 | 0x31, + 28724 - 19968: jis0212<<14 | 0x28<<7 | 0x12, + 28727 - 19968: jis0212<<14 | 0x28<<7 | 0x13, + 28729 - 19968: jis0212<<14 | 0x28<<7 | 0x14, + 28732 - 19968: jis0212<<14 | 0x28<<7 | 0x15, + 28734 - 19968: jis0208<<14 | 0x3E<<7 | 0x30, + 28739 - 19968: jis0212<<14 | 0x28<<7 | 0x16, + 28740 - 19968: jis0212<<14 | 0x28<<7 | 0x17, + 28744 - 19968: jis0212<<14 | 0x28<<7 | 0x18, + 28745 - 19968: jis0212<<14 | 0x28<<7 | 0x19, + 28746 - 19968: jis0212<<14 | 0x28<<7 | 0x1A, + 28747 - 19968: jis0212<<14 | 0x28<<7 | 0x1B, + 28748 - 19968: jis0208<<14 | 0x3D<<7 | 0x54, + 28750 - 19968: jis0212<<14 | 0x28<<7 | 0x20, + 28753 - 19968: jis0208<<14 | 0x3E<<7 | 0x32, + 28756 - 19968: jis0212<<14 | 0x28<<7 | 0x1C, + 28757 - 19968: jis0212<<14 | 0x28<<7 | 0x1D, + 28760 - 19968: jis0208<<14 | 0x25<<7 | 0x46, + 28765 - 19968: jis0212<<14 | 0x28<<7 | 0x1E, + 28766 - 19968: jis0212<<14 | 0x28<<7 | 0x1F, + 28771 - 19968: jis0208<<14 | 0x3E<<7 | 0x33, + 28772 - 19968: jis0212<<14 | 0x28<<7 | 0x21, + 28773 - 19968: jis0212<<14 | 0x28<<7 | 0x22, + 28779 - 19968: jis0208<<14 | 0x11<<7 | 0x2F, + 28780 - 19968: jis0212<<14 | 0x28<<7 | 0x23, + 28782 - 19968: jis0212<<14 | 0x28<<7 | 0x24, + 28783 - 19968: jis0208<<14 | 0x24<<7 | 0x53, + 28784 - 19968: jis0208<<14 | 0x12<<7 | 0x04, + 28789 - 19968: jis0212<<14 | 0x28<<7 | 0x25, + 28790 - 19968: jis0212<<14 | 0x28<<7 | 0x26, + 28792 - 19968: jis0208<<14 | 0x14<<7 | 0x43, + 28796 - 19968: jis0208<<14 | 0x1B<<7 | 0x3D, + 28797 - 19968: jis0208<<14 | 0x19<<7 | 0x31, + 28798 - 19968: jis0212<<14 | 0x28<<7 | 0x27, + 28801 - 19968: jis0212<<14 | 0x28<<7 | 0x28, + 28805 - 19968: jis0208<<14 | 0x59<<7 | 0x53, + 28806 - 19968: jis0212<<14 | 0x28<<7 | 0x2A, + 28809 - 19968: jis0208<<14 | 0x2E<<7 | 0x06, + 28810 - 19968: jis0208<<14 | 0x1E<<7 | 0x45, + 28814 - 19968: jis0208<<14 | 0x10<<7 | 0x49, + 28818 - 19968: jis0208<<14 | 0x3E<<7 | 0x35, + 28820 - 19968: jis0212<<14 | 0x28<<7 | 0x2B, + 28821 - 19968: jis0212<<14 | 0x28<<7 | 0x2C, + 28822 - 19968: jis0212<<14 | 0x28<<7 | 0x2D, + 28823 - 19968: jis0212<<14 | 0x28<<7 | 0x2E, + 28824 - 19968: jis0212<<14 | 0x28<<7 | 0x2F, + 28825 - 19968: jis0208<<14 | 0x3E<<7 | 0x34, + 28827 - 19968: jis0212<<14 | 0x28<<7 | 0x30, + 28836 - 19968: jis0212<<14 | 0x28<<7 | 0x31, + 28843 - 19968: jis0208<<14 | 0x59<<7 | 0x54, + 28844 - 19968: jis0208<<14 | 0x3E<<7 | 0x38, + 28845 - 19968: jis0208<<14 | 0x22<<7 | 0x19, + 28846 - 19968: jis0208<<14 | 0x3E<<7 | 0x3B, + 28847 - 19968: jis0208<<14 | 0x3E<<7 | 0x36, + 28848 - 19968: jis0212<<14 | 0x28<<7 | 0x33, + 28849 - 19968: jis0212<<14 | 0x28<<7 | 0x34, + 28851 - 19968: jis0208<<14 | 0x3E<<7 | 0x3A, + 28852 - 19968: jis0212<<14 | 0x28<<7 | 0x35, + 28855 - 19968: jis0212<<14 | 0x28<<7 | 0x36, + 28856 - 19968: jis0208<<14 | 0x3E<<7 | 0x39, + 28857 - 19968: jis0208<<14 | 0x24<<7 | 0x1F, + 28858 - 19968: jis0208<<14 | 0x0F<<7 | 0x38, + 28859 - 19968: jis0208<<14 | 0x58<<7 | 0x06, + 28872 - 19968: jis0208<<14 | 0x2D<<7 | 0x54, + 28874 - 19968: jis0212<<14 | 0x28<<7 | 0x37, + 28875 - 19968: jis0208<<14 | 0x3E<<7 | 0x3D, + 28879 - 19968: jis0208<<14 | 0x10<<7 | 0x07, + 28881 - 19968: jis0212<<14 | 0x28<<7 | 0x38, + 28883 - 19968: jis0212<<14 | 0x28<<7 | 0x39, + 28884 - 19968: jis0212<<14 | 0x28<<7 | 0x3A, + 28885 - 19968: jis0212<<14 | 0x28<<7 | 0x3B, + 28886 - 19968: jis0212<<14 | 0x28<<7 | 0x3C, + 28888 - 19968: jis0212<<14 | 0x28<<7 | 0x3D, + 28889 - 19968: jis0208<<14 | 0x3E<<7 | 0x3F, + 28892 - 19968: jis0212<<14 | 0x28<<7 | 0x3E, + 28893 - 19968: jis0208<<14 | 0x3E<<7 | 0x3E, + 28895 - 19968: jis0208<<14 | 0x3E<<7 | 0x3C, + 28900 - 19968: jis0212<<14 | 0x28<<7 | 0x3F, + 28913 - 19968: jis0208<<14 | 0x3E<<7 | 0x37, + 28921 - 19968: jis0208<<14 | 0x2A<<7 | 0x02, + 28922 - 19968: jis0212<<14 | 0x28<<7 | 0x40, + 28925 - 19968: jis0208<<14 | 0x3E<<7 | 0x41, + 28931 - 19968: jis0212<<14 | 0x28<<7 | 0x41, + 28932 - 19968: jis0208<<14 | 0x59<<7 | 0x56, + 28933 - 19968: jis0212<<14 | 0x28<<7 | 0x43, + 28934 - 19968: jis0212<<14 | 0x28<<7 | 0x44, + 28935 - 19968: jis0212<<14 | 0x28<<7 | 0x45, + 28937 - 19968: jis0208<<14 | 0x3E<<7 | 0x40, + 28939 - 19968: jis0212<<14 | 0x28<<7 | 0x46, + 28940 - 19968: jis0212<<14 | 0x28<<7 | 0x47, + 28943 - 19968: jis0208<<14 | 0x59<<7 | 0x55, + 28948 - 19968: jis0208<<14 | 0x10<<7 | 0x4A, + 28953 - 19968: jis0208<<14 | 0x3E<<7 | 0x43, + 28954 - 19968: jis0208<<14 | 0x29<<7 | 0x11, + 28956 - 19968: jis0208<<14 | 0x3E<<7 | 0x42, + 28958 - 19968: jis0212<<14 | 0x28<<7 | 0x49, + 28960 - 19968: jis0212<<14 | 0x28<<7 | 0x4A, + 28961 - 19968: jis0208<<14 | 0x2B<<7 | 0x14, + 28966 - 19968: jis0208<<14 | 0x1D<<7 | 0x26, + 28971 - 19968: jis0212<<14 | 0x28<<7 | 0x4B, + 28973 - 19968: jis0212<<14 | 0x28<<7 | 0x4C, + 28975 - 19968: jis0212<<14 | 0x28<<7 | 0x4D, + 28976 - 19968: jis0212<<14 | 0x28<<7 | 0x4E, + 28977 - 19968: jis0212<<14 | 0x28<<7 | 0x4F, + 28982 - 19968: jis0208<<14 | 0x20<<7 | 0x12, + 28984 - 19968: jis0212<<14 | 0x28<<7 | 0x50, + 28988 - 19968: jis0208<<14 | 0x1D<<7 | 0x25, + 28993 - 19968: jis0212<<14 | 0x28<<7 | 0x51, + 28997 - 19968: jis0212<<14 | 0x28<<7 | 0x52, + 28998 - 19968: jis0208<<14 | 0x59<<7 | 0x58, + 28999 - 19968: jis0208<<14 | 0x59<<7 | 0x59, + 29001 - 19968: jis0208<<14 | 0x2D<<7 | 0x5A, + 29002 - 19968: jis0212<<14 | 0x28<<7 | 0x55, + 29003 - 19968: jis0212<<14 | 0x28<<7 | 0x56, + 29004 - 19968: jis0208<<14 | 0x3E<<7 | 0x49, + 29006 - 19968: jis0208<<14 | 0x1F<<7 | 0x58, + 29008 - 19968: jis0212<<14 | 0x28<<7 | 0x57, + 29010 - 19968: jis0212<<14 | 0x28<<7 | 0x58, + 29013 - 19968: jis0208<<14 | 0x3E<<7 | 0x45, + 29014 - 19968: jis0208<<14 | 0x3E<<7 | 0x4A, + 29015 - 19968: jis0212<<14 | 0x28<<7 | 0x59, + 29017 - 19968: jis0208<<14 | 0x10<<7 | 0x4B, + 29018 - 19968: jis0212<<14 | 0x28<<7 | 0x5A, + 29020 - 19968: jis0208<<14 | 0x59<<7 | 0x57, + 29022 - 19968: jis0212<<14 | 0x28<<7 | 0x5C, + 29024 - 19968: jis0212<<14 | 0x28<<7 | 0x5D, + 29026 - 19968: jis0208<<14 | 0x3E<<7 | 0x48, + 29028 - 19968: jis0208<<14 | 0x26<<7 | 0x40, + 29029 - 19968: jis0208<<14 | 0x3E<<7 | 0x44, + 29030 - 19968: jis0208<<14 | 0x3E<<7 | 0x47, + 29031 - 19968: jis0208<<14 | 0x1D<<7 | 0x27, + 29032 - 19968: jis0212<<14 | 0x29<<7 | 0x00, + 29033 - 19968: jis0208<<14 | 0x27<<7 | 0x30, + 29036 - 19968: jis0208<<14 | 0x3E<<7 | 0x4B, + 29038 - 19968: jis0208<<14 | 0x1B<<7 | 0x30, + 29049 - 19968: jis0212<<14 | 0x29<<7 | 0x01, + 29053 - 19968: jis0208<<14 | 0x1F<<7 | 0x59, + 29056 - 19968: jis0212<<14 | 0x29<<7 | 0x02, + 29060 - 19968: jis0208<<14 | 0x3E<<7 | 0x4E, + 29061 - 19968: jis0212<<14 | 0x29<<7 | 0x03, + 29063 - 19968: jis0212<<14 | 0x29<<7 | 0x04, + 29064 - 19968: jis0208<<14 | 0x3E<<7 | 0x46, + 29066 - 19968: jis0208<<14 | 0x16<<7 | 0x06, + 29068 - 19968: jis0212<<14 | 0x29<<7 | 0x05, + 29071 - 19968: jis0208<<14 | 0x3E<<7 | 0x4C, + 29074 - 19968: jis0212<<14 | 0x29<<7 | 0x06, + 29076 - 19968: jis0208<<14 | 0x2C<<7 | 0x2F, + 29077 - 19968: jis0208<<14 | 0x3E<<7 | 0x4F, + 29081 - 19968: jis0208<<14 | 0x53<<7 | 0x05, + 29082 - 19968: jis0212<<14 | 0x29<<7 | 0x07, + 29083 - 19968: jis0212<<14 | 0x29<<7 | 0x08, + 29087 - 19968: jis0208<<14 | 0x1C<<7 | 0x2E, + 29088 - 19968: jis0212<<14 | 0x29<<7 | 0x09, + 29090 - 19968: jis0212<<14 | 0x29<<7 | 0x0A, + 29096 - 19968: jis0208<<14 | 0x3E<<7 | 0x50, + 29100 - 19968: jis0208<<14 | 0x3E<<7 | 0x51, + 29103 - 19968: jis0212<<14 | 0x29<<7 | 0x0B, + 29104 - 19968: jis0212<<14 | 0x29<<7 | 0x0C, + 29105 - 19968: jis0208<<14 | 0x26<<7 | 0x0D, + 29106 - 19968: jis0212<<14 | 0x29<<7 | 0x0D, + 29107 - 19968: jis0212<<14 | 0x29<<7 | 0x0E, + 29113 - 19968: jis0208<<14 | 0x3E<<7 | 0x53, + 29114 - 19968: jis0212<<14 | 0x29<<7 | 0x0F, + 29118 - 19968: jis0208<<14 | 0x3E<<7 | 0x54, + 29119 - 19968: jis0212<<14 | 0x29<<7 | 0x10, + 29120 - 19968: jis0212<<14 | 0x29<<7 | 0x11, + 29121 - 19968: jis0208<<14 | 0x59<<7 | 0x5B, + 29123 - 19968: jis0208<<14 | 0x26<<7 | 0x12, + 29124 - 19968: jis0212<<14 | 0x29<<7 | 0x13, + 29128 - 19968: jis0208<<14 | 0x24<<7 | 0x54, + 29129 - 19968: jis0208<<14 | 0x3E<<7 | 0x56, + 29131 - 19968: jis0212<<14 | 0x29<<7 | 0x14, + 29132 - 19968: jis0212<<14 | 0x29<<7 | 0x15, + 29134 - 19968: jis0208<<14 | 0x3E<<7 | 0x58, + 29136 - 19968: jis0208<<14 | 0x2D<<7 | 0x34, + 29138 - 19968: jis0208<<14 | 0x3E<<7 | 0x55, + 29139 - 19968: jis0212<<14 | 0x29<<7 | 0x16, + 29140 - 19968: jis0208<<14 | 0x3E<<7 | 0x57, + 29141 - 19968: jis0208<<14 | 0x10<<7 | 0x4C, + 29142 - 19968: jis0212<<14 | 0x29<<7 | 0x17, + 29143 - 19968: jis0208<<14 | 0x3E<<7 | 0x52, + 29145 - 19968: jis0212<<14 | 0x29<<7 | 0x18, + 29146 - 19968: jis0212<<14 | 0x29<<7 | 0x19, + 29148 - 19968: jis0212<<14 | 0x29<<7 | 0x1A, + 29151 - 19968: jis0208<<14 | 0x32<<7 | 0x3A, + 29152 - 19968: jis0208<<14 | 0x3E<<7 | 0x59, + 29157 - 19968: jis0208<<14 | 0x20<<7 | 0x46, + 29158 - 19968: jis0208<<14 | 0x1A<<7 | 0x17, + 29159 - 19968: jis0208<<14 | 0x3E<<7 | 0x5B, + 29164 - 19968: jis0208<<14 | 0x3E<<7 | 0x5A, + 29165 - 19968: jis0208<<14 | 0x1E<<7 | 0x03, + 29166 - 19968: jis0208<<14 | 0x31<<7 | 0x38, + 29173 - 19968: jis0208<<14 | 0x3E<<7 | 0x5C, + 29176 - 19968: jis0212<<14 | 0x29<<7 | 0x1B, + 29177 - 19968: jis0208<<14 | 0x3F<<7 | 0x00, + 29179 - 19968: jis0208<<14 | 0x3E<<7 | 0x4D, + 29180 - 19968: jis0208<<14 | 0x3E<<7 | 0x5D, + 29182 - 19968: jis0208<<14 | 0x59<<7 | 0x5C, + 29183 - 19968: jis0208<<14 | 0x3F<<7 | 0x01, + 29184 - 19968: jis0212<<14 | 0x29<<7 | 0x1D, + 29190 - 19968: jis0208<<14 | 0x26<<7 | 0x59, + 29191 - 19968: jis0212<<14 | 0x29<<7 | 0x1E, + 29192 - 19968: jis0212<<14 | 0x29<<7 | 0x1F, + 29193 - 19968: jis0212<<14 | 0x29<<7 | 0x20, + 29197 - 19968: jis0208<<14 | 0x3F<<7 | 0x02, + 29200 - 19968: jis0208<<14 | 0x3F<<7 | 0x03, + 29203 - 19968: jis0212<<14 | 0x29<<7 | 0x21, + 29207 - 19968: jis0212<<14 | 0x29<<7 | 0x22, + 29210 - 19968: jis0212<<14 | 0x29<<7 | 0x23, + 29211 - 19968: jis0208<<14 | 0x3F<<7 | 0x04, + 29213 - 19968: jis0212<<14 | 0x29<<7 | 0x24, + 29215 - 19968: jis0212<<14 | 0x29<<7 | 0x25, + 29220 - 19968: jis0212<<14 | 0x29<<7 | 0x26, + 29224 - 19968: jis0208<<14 | 0x3F<<7 | 0x05, + 29226 - 19968: jis0208<<14 | 0x23<<7 | 0x3D, + 29227 - 19968: jis0212<<14 | 0x29<<7 | 0x27, + 29228 - 19968: jis0208<<14 | 0x3F<<7 | 0x07, + 29229 - 19968: jis0208<<14 | 0x3F<<7 | 0x06, + 29231 - 19968: jis0212<<14 | 0x29<<7 | 0x28, + 29232 - 19968: jis0208<<14 | 0x3F<<7 | 0x08, + 29234 - 19968: jis0208<<14 | 0x3F<<7 | 0x09, + 29236 - 19968: jis0212<<14 | 0x29<<7 | 0x29, + 29237 - 19968: jis0208<<14 | 0x1B<<7 | 0x3E, + 29238 - 19968: jis0208<<14 | 0x28<<7 | 0x42, + 29240 - 19968: jis0212<<14 | 0x29<<7 | 0x2A, + 29241 - 19968: jis0212<<14 | 0x29<<7 | 0x2B, + 29242 - 19968: jis0208<<14 | 0x2B<<7 | 0x4B, + 29243 - 19968: jis0208<<14 | 0x3F<<7 | 0x0A, + 29244 - 19968: jis0208<<14 | 0x3F<<7 | 0x0B, + 29245 - 19968: jis0208<<14 | 0x20<<7 | 0x35, + 29246 - 19968: jis0208<<14 | 0x1B<<7 | 0x03, + 29247 - 19968: jis0208<<14 | 0x3F<<7 | 0x0C, + 29248 - 19968: jis0208<<14 | 0x3F<<7 | 0x0D, + 29249 - 19968: jis0212<<14 | 0x29<<7 | 0x2C, + 29250 - 19968: jis0212<<14 | 0x29<<7 | 0x2D, + 29251 - 19968: jis0212<<14 | 0x29<<7 | 0x2E, + 29253 - 19968: jis0212<<14 | 0x29<<7 | 0x2F, + 29254 - 19968: jis0208<<14 | 0x3F<<7 | 0x0E, + 29255 - 19968: jis0208<<14 | 0x29<<7 | 0x31, + 29256 - 19968: jis0208<<14 | 0x27<<7 | 0x26, + 29259 - 19968: jis0208<<14 | 0x3F<<7 | 0x0F, + 29260 - 19968: jis0208<<14 | 0x26<<7 | 0x36, + 29262 - 19968: jis0212<<14 | 0x29<<7 | 0x30, + 29263 - 19968: jis0212<<14 | 0x29<<7 | 0x31, + 29264 - 19968: jis0212<<14 | 0x29<<7 | 0x32, + 29266 - 19968: jis0208<<14 | 0x23<<7 | 0x0C, + 29267 - 19968: jis0212<<14 | 0x29<<7 | 0x33, + 29269 - 19968: jis0212<<14 | 0x29<<7 | 0x34, + 29270 - 19968: jis0212<<14 | 0x29<<7 | 0x35, + 29272 - 19968: jis0208<<14 | 0x3F<<7 | 0x10, + 29273 - 19968: jis0208<<14 | 0x11<<7 | 0x46, + 29274 - 19968: jis0212<<14 | 0x29<<7 | 0x36, + 29275 - 19968: jis0208<<14 | 0x14<<7 | 0x4C, + 29276 - 19968: jis0212<<14 | 0x29<<7 | 0x37, + 29277 - 19968: jis0208<<14 | 0x2B<<7 | 0x25, + 29278 - 19968: jis0212<<14 | 0x29<<7 | 0x38, + 29279 - 19968: jis0208<<14 | 0x2B<<7 | 0x15, + 29280 - 19968: jis0212<<14 | 0x29<<7 | 0x39, + 29281 - 19968: jis0208<<14 | 0x11<<7 | 0x13, + 29282 - 19968: jis0208<<14 | 0x2E<<7 | 0x13, + 29283 - 19968: jis0212<<14 | 0x29<<7 | 0x3A, + 29287 - 19968: jis0208<<14 | 0x2A<<7 | 0x31, + 29288 - 19968: jis0212<<14 | 0x29<<7 | 0x3B, + 29289 - 19968: jis0208<<14 | 0x29<<7 | 0x09, + 29291 - 19968: jis0212<<14 | 0x29<<7 | 0x3C, + 29294 - 19968: jis0212<<14 | 0x29<<7 | 0x3D, + 29295 - 19968: jis0212<<14 | 0x29<<7 | 0x3E, + 29297 - 19968: jis0212<<14 | 0x29<<7 | 0x3F, + 29298 - 19968: jis0208<<14 | 0x1F<<7 | 0x16, + 29300 - 19968: jis0208<<14 | 0x3F<<7 | 0x11, + 29303 - 19968: jis0212<<14 | 0x29<<7 | 0x40, + 29304 - 19968: jis0212<<14 | 0x29<<7 | 0x41, + 29305 - 19968: jis0208<<14 | 0x25<<7 | 0x22, + 29307 - 19968: jis0212<<14 | 0x29<<7 | 0x42, + 29308 - 19968: jis0212<<14 | 0x29<<7 | 0x43, + 29309 - 19968: jis0208<<14 | 0x17<<7 | 0x02, + 29310 - 19968: jis0208<<14 | 0x3F<<7 | 0x12, + 29311 - 19968: jis0212<<14 | 0x29<<7 | 0x44, + 29312 - 19968: jis0208<<14 | 0x19<<7 | 0x33, + 29313 - 19968: jis0208<<14 | 0x3F<<7 | 0x14, + 29314 - 19968: jis0208<<14 | 0x3F<<7 | 0x13, + 29316 - 19968: jis0212<<14 | 0x29<<7 | 0x45, + 29319 - 19968: jis0208<<14 | 0x3F<<7 | 0x15, + 29321 - 19968: jis0212<<14 | 0x29<<7 | 0x46, + 29325 - 19968: jis0212<<14 | 0x29<<7 | 0x47, + 29326 - 19968: jis0212<<14 | 0x29<<7 | 0x48, + 29330 - 19968: jis0208<<14 | 0x3F<<7 | 0x16, + 29331 - 19968: jis0212<<14 | 0x29<<7 | 0x49, + 29334 - 19968: jis0208<<14 | 0x3F<<7 | 0x17, + 29339 - 19968: jis0212<<14 | 0x29<<7 | 0x4A, + 29344 - 19968: jis0208<<14 | 0x14<<7 | 0x1D, + 29346 - 19968: jis0208<<14 | 0x3F<<7 | 0x18, + 29351 - 19968: jis0208<<14 | 0x3F<<7 | 0x19, + 29352 - 19968: jis0212<<14 | 0x29<<7 | 0x4B, + 29356 - 19968: jis0208<<14 | 0x17<<7 | 0x03, + 29357 - 19968: jis0212<<14 | 0x29<<7 | 0x4C, + 29358 - 19968: jis0212<<14 | 0x29<<7 | 0x4D, + 29359 - 19968: jis0208<<14 | 0x27<<7 | 0x27, + 29361 - 19968: jis0208<<14 | 0x59<<7 | 0x5D, + 29362 - 19968: jis0208<<14 | 0x3F<<7 | 0x1B, + 29364 - 19968: jis0212<<14 | 0x29<<7 | 0x4F, + 29366 - 19968: jis0208<<14 | 0x1D<<7 | 0x54, + 29369 - 19968: jis0208<<14 | 0x3F<<7 | 0x1A, + 29374 - 19968: jis0208<<14 | 0x5A<<7 | 0x00, + 29377 - 19968: jis0212<<14 | 0x29<<7 | 0x51, + 29378 - 19968: jis0208<<14 | 0x15<<7 | 0x17, + 29379 - 19968: jis0208<<14 | 0x3F<<7 | 0x1C, + 29380 - 19968: jis0208<<14 | 0x3F<<7 | 0x1E, + 29382 - 19968: jis0208<<14 | 0x3F<<7 | 0x1D, + 29383 - 19968: jis0212<<14 | 0x29<<7 | 0x52, + 29385 - 19968: jis0212<<14 | 0x29<<7 | 0x53, + 29388 - 19968: jis0212<<14 | 0x29<<7 | 0x54, + 29390 - 19968: jis0208<<14 | 0x3F<<7 | 0x1F, + 29392 - 19968: jis0208<<14 | 0x17<<7 | 0x30, + 29394 - 19968: jis0208<<14 | 0x3F<<7 | 0x20, + 29397 - 19968: jis0212<<14 | 0x29<<7 | 0x55, + 29398 - 19968: jis0212<<14 | 0x29<<7 | 0x56, + 29399 - 19968: jis0208<<14 | 0x15<<7 | 0x48, + 29400 - 19968: jis0212<<14 | 0x29<<7 | 0x57, + 29401 - 19968: jis0208<<14 | 0x20<<7 | 0x1F, + 29403 - 19968: jis0208<<14 | 0x18<<7 | 0x5C, + 29407 - 19968: jis0212<<14 | 0x29<<7 | 0x58, + 29408 - 19968: jis0208<<14 | 0x3F<<7 | 0x22, + 29409 - 19968: jis0208<<14 | 0x3F<<7 | 0x23, + 29410 - 19968: jis0208<<14 | 0x3F<<7 | 0x21, + 29413 - 19968: jis0212<<14 | 0x29<<7 | 0x59, + 29417 - 19968: jis0208<<14 | 0x1B<<7 | 0x4C, + 29420 - 19968: jis0208<<14 | 0x25<<7 | 0x27, + 29421 - 19968: jis0208<<14 | 0x15<<7 | 0x18, + 29427 - 19968: jis0212<<14 | 0x29<<7 | 0x5A, + 29428 - 19968: jis0212<<14 | 0x29<<7 | 0x5B, + 29431 - 19968: jis0208<<14 | 0x3F<<7 | 0x25, + 29432 - 19968: jis0208<<14 | 0x22<<7 | 0x0B, + 29433 - 19968: jis0208<<14 | 0x3F<<7 | 0x24, + 29434 - 19968: jis0212<<14 | 0x29<<7 | 0x5C, + 29435 - 19968: jis0212<<14 | 0x29<<7 | 0x5D, + 29436 - 19968: jis0208<<14 | 0x2E<<7 | 0x14, + 29437 - 19968: jis0208<<14 | 0x26<<7 | 0x41, + 29438 - 19968: jis0212<<14 | 0x2A<<7 | 0x00, + 29442 - 19968: jis0212<<14 | 0x2A<<7 | 0x01, + 29444 - 19968: jis0212<<14 | 0x2A<<7 | 0x02, + 29445 - 19968: jis0212<<14 | 0x2A<<7 | 0x03, + 29447 - 19968: jis0212<<14 | 0x2A<<7 | 0x04, + 29450 - 19968: jis0208<<14 | 0x3F<<7 | 0x28, + 29451 - 19968: jis0212<<14 | 0x2A<<7 | 0x05, + 29453 - 19968: jis0212<<14 | 0x2A<<7 | 0x06, + 29458 - 19968: jis0212<<14 | 0x2A<<7 | 0x07, + 29459 - 19968: jis0212<<14 | 0x2A<<7 | 0x08, + 29462 - 19968: jis0208<<14 | 0x3F<<7 | 0x2A, + 29463 - 19968: jis0208<<14 | 0x3F<<7 | 0x27, + 29464 - 19968: jis0212<<14 | 0x2A<<7 | 0x09, + 29465 - 19968: jis0212<<14 | 0x2A<<7 | 0x0A, + 29467 - 19968: jis0208<<14 | 0x2B<<7 | 0x33, + 29468 - 19968: jis0208<<14 | 0x3F<<7 | 0x29, + 29469 - 19968: jis0208<<14 | 0x3F<<7 | 0x2B, + 29470 - 19968: jis0212<<14 | 0x2A<<7 | 0x0B, + 29471 - 19968: jis0208<<14 | 0x2D<<7 | 0x23, + 29474 - 19968: jis0212<<14 | 0x2A<<7 | 0x0C, + 29476 - 19968: jis0208<<14 | 0x5A<<7 | 0x01, + 29477 - 19968: jis0208<<14 | 0x3F<<7 | 0x2F, + 29479 - 19968: jis0212<<14 | 0x2A<<7 | 0x0E, + 29480 - 19968: jis0212<<14 | 0x2A<<7 | 0x0F, + 29481 - 19968: jis0208<<14 | 0x3F<<7 | 0x2E, + 29482 - 19968: jis0208<<14 | 0x22<<7 | 0x55, + 29483 - 19968: jis0208<<14 | 0x26<<7 | 0x0C, + 29484 - 19968: jis0212<<14 | 0x2A<<7 | 0x10, + 29486 - 19968: jis0208<<14 | 0x17<<7 | 0x04, + 29487 - 19968: jis0208<<14 | 0x3F<<7 | 0x2D, + 29489 - 19968: jis0212<<14 | 0x2A<<7 | 0x11, + 29490 - 19968: jis0212<<14 | 0x2A<<7 | 0x12, + 29492 - 19968: jis0208<<14 | 0x3F<<7 | 0x2C, + 29493 - 19968: jis0212<<14 | 0x2A<<7 | 0x13, + 29494 - 19968: jis0208<<14 | 0x2C<<7 | 0x10, + 29495 - 19968: jis0208<<14 | 0x2C<<7 | 0x11, + 29498 - 19968: jis0212<<14 | 0x2A<<7 | 0x14, + 29499 - 19968: jis0212<<14 | 0x2A<<7 | 0x15, + 29501 - 19968: jis0212<<14 | 0x2A<<7 | 0x16, + 29502 - 19968: jis0208<<14 | 0x3F<<7 | 0x30, + 29503 - 19968: jis0208<<14 | 0x10<<7 | 0x4D, + 29507 - 19968: jis0212<<14 | 0x2A<<7 | 0x17, + 29508 - 19968: jis0208<<14 | 0x18<<7 | 0x55, + 29509 - 19968: jis0208<<14 | 0x1A<<7 | 0x41, + 29517 - 19968: jis0212<<14 | 0x2A<<7 | 0x18, + 29518 - 19968: jis0208<<14 | 0x3F<<7 | 0x31, + 29519 - 19968: jis0208<<14 | 0x3F<<7 | 0x32, + 29520 - 19968: jis0212<<14 | 0x2A<<7 | 0x19, + 29522 - 19968: jis0212<<14 | 0x2A<<7 | 0x1A, + 29526 - 19968: jis0212<<14 | 0x2A<<7 | 0x1B, + 29527 - 19968: jis0208<<14 | 0x3F<<7 | 0x34, + 29528 - 19968: jis0212<<14 | 0x2A<<7 | 0x1C, + 29533 - 19968: jis0212<<14 | 0x2A<<7 | 0x1D, + 29534 - 19968: jis0212<<14 | 0x2A<<7 | 0x1E, + 29535 - 19968: jis0212<<14 | 0x2A<<7 | 0x1F, + 29536 - 19968: jis0212<<14 | 0x2A<<7 | 0x20, + 29539 - 19968: jis0208<<14 | 0x1C<<7 | 0x22, + 29542 - 19968: jis0212<<14 | 0x2A<<7 | 0x21, + 29543 - 19968: jis0212<<14 | 0x2A<<7 | 0x22, + 29544 - 19968: jis0208<<14 | 0x3F<<7 | 0x36, + 29545 - 19968: jis0212<<14 | 0x2A<<7 | 0x23, + 29546 - 19968: jis0208<<14 | 0x3F<<7 | 0x35, + 29547 - 19968: jis0212<<14 | 0x2A<<7 | 0x24, + 29548 - 19968: jis0212<<14 | 0x2A<<7 | 0x25, + 29550 - 19968: jis0212<<14 | 0x2A<<7 | 0x26, + 29551 - 19968: jis0212<<14 | 0x2A<<7 | 0x27, + 29552 - 19968: jis0208<<14 | 0x3F<<7 | 0x37, + 29553 - 19968: jis0212<<14 | 0x2A<<7 | 0x28, + 29554 - 19968: jis0208<<14 | 0x12<<7 | 0x2C, + 29557 - 19968: jis0208<<14 | 0x3F<<7 | 0x39, + 29559 - 19968: jis0208<<14 | 0x5A<<7 | 0x03, + 29560 - 19968: jis0208<<14 | 0x3F<<7 | 0x38, + 29561 - 19968: jis0212<<14 | 0x2A<<7 | 0x2A, + 29562 - 19968: jis0208<<14 | 0x3F<<7 | 0x3B, + 29563 - 19968: jis0208<<14 | 0x3F<<7 | 0x3A, + 29564 - 19968: jis0212<<14 | 0x2A<<7 | 0x2B, + 29568 - 19968: jis0212<<14 | 0x2A<<7 | 0x2C, + 29569 - 19968: jis0212<<14 | 0x2A<<7 | 0x2D, + 29571 - 19968: jis0212<<14 | 0x2A<<7 | 0x2E, + 29572 - 19968: jis0208<<14 | 0x17<<7 | 0x1B, + 29573 - 19968: jis0212<<14 | 0x2A<<7 | 0x2F, + 29574 - 19968: jis0212<<14 | 0x2A<<7 | 0x30, + 29575 - 19968: jis0208<<14 | 0x2D<<7 | 0x07, + 29577 - 19968: jis0208<<14 | 0x15<<7 | 0x2B, + 29579 - 19968: jis0208<<14 | 0x11<<7 | 0x05, + 29582 - 19968: jis0212<<14 | 0x2A<<7 | 0x31, + 29584 - 19968: jis0212<<14 | 0x2A<<7 | 0x32, + 29587 - 19968: jis0212<<14 | 0x2A<<7 | 0x33, + 29589 - 19968: jis0212<<14 | 0x2A<<7 | 0x34, + 29590 - 19968: jis0208<<14 | 0x15<<7 | 0x49, + 29591 - 19968: jis0212<<14 | 0x2A<<7 | 0x35, + 29592 - 19968: jis0212<<14 | 0x2A<<7 | 0x36, + 29596 - 19968: jis0212<<14 | 0x2A<<7 | 0x37, + 29598 - 19968: jis0212<<14 | 0x2A<<7 | 0x38, + 29599 - 19968: jis0212<<14 | 0x2A<<7 | 0x39, + 29600 - 19968: jis0212<<14 | 0x2A<<7 | 0x3A, + 29602 - 19968: jis0212<<14 | 0x2A<<7 | 0x3B, + 29605 - 19968: jis0212<<14 | 0x2A<<7 | 0x3C, + 29606 - 19968: jis0212<<14 | 0x2A<<7 | 0x3D, + 29609 - 19968: jis0208<<14 | 0x13<<7 | 0x40, + 29610 - 19968: jis0212<<14 | 0x2A<<7 | 0x3E, + 29611 - 19968: jis0212<<14 | 0x2A<<7 | 0x3F, + 29613 - 19968: jis0212<<14 | 0x2A<<7 | 0x40, + 29618 - 19968: jis0208<<14 | 0x2D<<7 | 0x47, + 29619 - 19968: jis0208<<14 | 0x3F<<7 | 0x3D, + 29621 - 19968: jis0212<<14 | 0x2A<<7 | 0x41, + 29623 - 19968: jis0212<<14 | 0x2A<<7 | 0x42, + 29625 - 19968: jis0212<<14 | 0x2A<<7 | 0x43, + 29627 - 19968: jis0208<<14 | 0x3F<<7 | 0x3F, + 29628 - 19968: jis0212<<14 | 0x2A<<7 | 0x44, + 29629 - 19968: jis0208<<14 | 0x5A<<7 | 0x04, + 29631 - 19968: jis0212<<14 | 0x2A<<7 | 0x46, + 29632 - 19968: jis0208<<14 | 0x3F<<7 | 0x40, + 29634 - 19968: jis0208<<14 | 0x11<<7 | 0x30, + 29637 - 19968: jis0212<<14 | 0x2A<<7 | 0x47, + 29638 - 19968: jis0212<<14 | 0x2A<<7 | 0x48, + 29640 - 19968: jis0208<<14 | 0x3F<<7 | 0x3C, + 29641 - 19968: jis0208<<14 | 0x5A<<7 | 0x05, + 29642 - 19968: jis0208<<14 | 0x1A<<7 | 0x18, + 29643 - 19968: jis0212<<14 | 0x2A<<7 | 0x4A, + 29644 - 19968: jis0212<<14 | 0x2A<<7 | 0x4B, + 29645 - 19968: jis0208<<14 | 0x23<<7 | 0x20, + 29646 - 19968: jis0208<<14 | 0x3F<<7 | 0x3E, + 29647 - 19968: jis0212<<14 | 0x2A<<7 | 0x4C, + 29650 - 19968: jis0208<<14 | 0x5A<<7 | 0x08, + 29651 - 19968: jis0212<<14 | 0x2A<<7 | 0x4E, + 29654 - 19968: jis0208<<14 | 0x5A<<7 | 0x06, + 29657 - 19968: jis0212<<14 | 0x2A<<7 | 0x50, + 29661 - 19968: jis0212<<14 | 0x2A<<7 | 0x51, + 29662 - 19968: jis0208<<14 | 0x3F<<7 | 0x43, + 29664 - 19968: jis0208<<14 | 0x1B<<7 | 0x4D, + 29665 - 19968: jis0212<<14 | 0x2A<<7 | 0x52, + 29667 - 19968: jis0208<<14 | 0x5A<<7 | 0x07, + 29669 - 19968: jis0208<<14 | 0x3F<<7 | 0x41, + 29670 - 19968: jis0212<<14 | 0x2A<<7 | 0x54, + 29671 - 19968: jis0212<<14 | 0x2A<<7 | 0x55, + 29673 - 19968: jis0212<<14 | 0x2A<<7 | 0x56, + 29674 - 19968: jis0208<<14 | 0x16<<7 | 0x1D, + 29677 - 19968: jis0208<<14 | 0x27<<7 | 0x28, + 29678 - 19968: jis0208<<14 | 0x3F<<7 | 0x42, + 29681 - 19968: jis0208<<14 | 0x3F<<7 | 0x5D, + 29684 - 19968: jis0212<<14 | 0x2A<<7 | 0x57, + 29685 - 19968: jis0208<<14 | 0x5A<<7 | 0x0A, + 29687 - 19968: jis0212<<14 | 0x2A<<7 | 0x59, + 29688 - 19968: jis0208<<14 | 0x3F<<7 | 0x48, + 29689 - 19968: jis0212<<14 | 0x2A<<7 | 0x5A, + 29690 - 19968: jis0212<<14 | 0x2A<<7 | 0x5B, + 29691 - 19968: jis0212<<14 | 0x2A<<7 | 0x5C, + 29693 - 19968: jis0212<<14 | 0x2A<<7 | 0x5D, + 29694 - 19968: jis0208<<14 | 0x17<<7 | 0x1C, + 29695 - 19968: jis0212<<14 | 0x2B<<7 | 0x00, + 29696 - 19968: jis0212<<14 | 0x2B<<7 | 0x01, + 29697 - 19968: jis0212<<14 | 0x2B<<7 | 0x02, + 29699 - 19968: jis0208<<14 | 0x14<<7 | 0x44, + 29700 - 19968: jis0212<<14 | 0x2B<<7 | 0x03, + 29701 - 19968: jis0208<<14 | 0x3F<<7 | 0x45, + 29702 - 19968: jis0208<<14 | 0x2C<<7 | 0x5C, + 29703 - 19968: jis0208<<14 | 0x5A<<7 | 0x09, + 29705 - 19968: jis0208<<14 | 0x2D<<7 | 0x0F, + 29706 - 19968: jis0212<<14 | 0x2B<<7 | 0x05, + 29713 - 19968: jis0212<<14 | 0x2B<<7 | 0x06, + 29722 - 19968: jis0212<<14 | 0x2B<<7 | 0x07, + 29723 - 19968: jis0212<<14 | 0x2B<<7 | 0x08, + 29730 - 19968: jis0208<<14 | 0x21<<7 | 0x55, + 29732 - 19968: jis0212<<14 | 0x2B<<7 | 0x09, + 29733 - 19968: jis0208<<14 | 0x3F<<7 | 0x47, + 29734 - 19968: jis0208<<14 | 0x5A<<7 | 0x0B, + 29736 - 19968: jis0212<<14 | 0x2B<<7 | 0x0B, + 29737 - 19968: jis0208<<14 | 0x5A<<7 | 0x0D, + 29738 - 19968: jis0208<<14 | 0x5A<<7 | 0x0C, + 29739 - 19968: jis0212<<14 | 0x2B<<7 | 0x0E, + 29740 - 19968: jis0212<<14 | 0x2B<<7 | 0x0F, + 29741 - 19968: jis0212<<14 | 0x2B<<7 | 0x10, + 29742 - 19968: jis0208<<14 | 0x5A<<7 | 0x0E, + 29743 - 19968: jis0212<<14 | 0x2B<<7 | 0x12, + 29744 - 19968: jis0212<<14 | 0x2B<<7 | 0x13, + 29745 - 19968: jis0212<<14 | 0x2B<<7 | 0x14, + 29746 - 19968: jis0208<<14 | 0x3F<<7 | 0x49, + 29747 - 19968: jis0208<<14 | 0x2D<<7 | 0x35, + 29748 - 19968: jis0208<<14 | 0x15<<7 | 0x36, + 29749 - 19968: jis0208<<14 | 0x27<<7 | 0x5B, + 29750 - 19968: jis0208<<14 | 0x26<<7 | 0x29, + 29753 - 19968: jis0212<<14 | 0x2B<<7 | 0x15, + 29754 - 19968: jis0208<<14 | 0x3F<<7 | 0x4A, + 29759 - 19968: jis0208<<14 | 0x3F<<7 | 0x4C, + 29760 - 19968: jis0212<<14 | 0x2B<<7 | 0x16, + 29761 - 19968: jis0208<<14 | 0x3F<<7 | 0x4F, + 29763 - 19968: jis0212<<14 | 0x2B<<7 | 0x17, + 29764 - 19968: jis0212<<14 | 0x2B<<7 | 0x18, + 29766 - 19968: jis0212<<14 | 0x2B<<7 | 0x19, + 29767 - 19968: jis0212<<14 | 0x2B<<7 | 0x1A, + 29771 - 19968: jis0212<<14 | 0x2B<<7 | 0x1B, + 29773 - 19968: jis0212<<14 | 0x2B<<7 | 0x1C, + 29777 - 19968: jis0212<<14 | 0x2B<<7 | 0x1D, + 29778 - 19968: jis0212<<14 | 0x2B<<7 | 0x1E, + 29781 - 19968: jis0208<<14 | 0x3F<<7 | 0x4B, + 29783 - 19968: jis0212<<14 | 0x2B<<7 | 0x1F, + 29785 - 19968: jis0208<<14 | 0x3F<<7 | 0x4E, + 29786 - 19968: jis0208<<14 | 0x17<<7 | 0x49, + 29787 - 19968: jis0208<<14 | 0x10<<7 | 0x2C, + 29788 - 19968: jis0208<<14 | 0x3F<<7 | 0x50, + 29789 - 19968: jis0212<<14 | 0x2B<<7 | 0x20, + 29790 - 19968: jis0208<<14 | 0x1E<<7 | 0x4F, + 29791 - 19968: jis0208<<14 | 0x3F<<7 | 0x4D, + 29792 - 19968: jis0208<<14 | 0x2D<<7 | 0x3B, + 29794 - 19968: jis0208<<14 | 0x5A<<7 | 0x0F, + 29795 - 19968: jis0208<<14 | 0x3F<<7 | 0x53, + 29796 - 19968: jis0208<<14 | 0x53<<7 | 0x03, + 29798 - 19968: jis0212<<14 | 0x2B<<7 | 0x22, + 29799 - 19968: jis0212<<14 | 0x2B<<7 | 0x23, + 29800 - 19968: jis0212<<14 | 0x2B<<7 | 0x24, + 29801 - 19968: jis0208<<14 | 0x3F<<7 | 0x51, + 29802 - 19968: jis0208<<14 | 0x3F<<7 | 0x54, + 29803 - 19968: jis0212<<14 | 0x2B<<7 | 0x25, + 29805 - 19968: jis0212<<14 | 0x2B<<7 | 0x26, + 29806 - 19968: jis0212<<14 | 0x2B<<7 | 0x27, + 29807 - 19968: jis0208<<14 | 0x3F<<7 | 0x46, + 29808 - 19968: jis0208<<14 | 0x3F<<7 | 0x52, + 29809 - 19968: jis0212<<14 | 0x2B<<7 | 0x28, + 29810 - 19968: jis0212<<14 | 0x2B<<7 | 0x29, + 29811 - 19968: jis0208<<14 | 0x19<<7 | 0x1B, + 29814 - 19968: jis0208<<14 | 0x3F<<7 | 0x55, + 29822 - 19968: jis0208<<14 | 0x3F<<7 | 0x56, + 29824 - 19968: jis0212<<14 | 0x2B<<7 | 0x2A, + 29825 - 19968: jis0212<<14 | 0x2B<<7 | 0x2B, + 29827 - 19968: jis0208<<14 | 0x2C<<7 | 0x5D, + 29829 - 19968: jis0212<<14 | 0x2B<<7 | 0x2C, + 29830 - 19968: jis0212<<14 | 0x2B<<7 | 0x2D, + 29831 - 19968: jis0212<<14 | 0x2B<<7 | 0x2E, + 29833 - 19968: jis0208<<14 | 0x5A<<7 | 0x10, + 29835 - 19968: jis0208<<14 | 0x3F<<7 | 0x57, + 29839 - 19968: jis0212<<14 | 0x2B<<7 | 0x30, + 29840 - 19968: jis0212<<14 | 0x2B<<7 | 0x31, + 29841 - 19968: jis0212<<14 | 0x2B<<7 | 0x32, + 29842 - 19968: jis0212<<14 | 0x2B<<7 | 0x33, + 29848 - 19968: jis0212<<14 | 0x2B<<7 | 0x34, + 29849 - 19968: jis0212<<14 | 0x2B<<7 | 0x35, + 29850 - 19968: jis0212<<14 | 0x2B<<7 | 0x36, + 29852 - 19968: jis0212<<14 | 0x2B<<7 | 0x37, + 29854 - 19968: jis0208<<14 | 0x3F<<7 | 0x58, + 29855 - 19968: jis0208<<14 | 0x5A<<7 | 0x11, + 29856 - 19968: jis0212<<14 | 0x2B<<7 | 0x39, + 29857 - 19968: jis0212<<14 | 0x2B<<7 | 0x3A, + 29858 - 19968: jis0208<<14 | 0x3F<<7 | 0x44, + 29859 - 19968: jis0212<<14 | 0x2B<<7 | 0x3B, + 29862 - 19968: jis0212<<14 | 0x2B<<7 | 0x3C, + 29863 - 19968: jis0208<<14 | 0x3F<<7 | 0x59, + 29864 - 19968: jis0212<<14 | 0x2B<<7 | 0x3D, + 29865 - 19968: jis0212<<14 | 0x2B<<7 | 0x3E, + 29866 - 19968: jis0212<<14 | 0x2B<<7 | 0x3F, + 29867 - 19968: jis0212<<14 | 0x2B<<7 | 0x40, + 29870 - 19968: jis0212<<14 | 0x2B<<7 | 0x41, + 29871 - 19968: jis0212<<14 | 0x2B<<7 | 0x42, + 29872 - 19968: jis0208<<14 | 0x13<<7 | 0x23, + 29873 - 19968: jis0212<<14 | 0x2B<<7 | 0x43, + 29874 - 19968: jis0212<<14 | 0x2B<<7 | 0x44, + 29877 - 19968: jis0212<<14 | 0x2B<<7 | 0x45, + 29881 - 19968: jis0212<<14 | 0x2B<<7 | 0x46, + 29883 - 19968: jis0212<<14 | 0x2B<<7 | 0x47, + 29885 - 19968: jis0208<<14 | 0x1B<<7 | 0x04, + 29887 - 19968: jis0212<<14 | 0x2B<<7 | 0x48, + 29896 - 19968: jis0212<<14 | 0x2B<<7 | 0x49, + 29897 - 19968: jis0212<<14 | 0x2B<<7 | 0x4A, + 29898 - 19968: jis0208<<14 | 0x3F<<7 | 0x5A, + 29900 - 19968: jis0212<<14 | 0x2B<<7 | 0x4B, + 29903 - 19968: jis0208<<14 | 0x3F<<7 | 0x5B, + 29904 - 19968: jis0212<<14 | 0x2B<<7 | 0x4C, + 29907 - 19968: jis0212<<14 | 0x2B<<7 | 0x4D, + 29908 - 19968: jis0208<<14 | 0x3F<<7 | 0x5C, + 29912 - 19968: jis0212<<14 | 0x2B<<7 | 0x4E, + 29914 - 19968: jis0212<<14 | 0x2B<<7 | 0x4F, + 29915 - 19968: jis0212<<14 | 0x2B<<7 | 0x50, + 29916 - 19968: jis0208<<14 | 0x10<<7 | 0x1A, + 29918 - 19968: jis0212<<14 | 0x2B<<7 | 0x51, + 29919 - 19968: jis0212<<14 | 0x2B<<7 | 0x52, + 29920 - 19968: jis0208<<14 | 0x40<<7 | 0x00, + 29922 - 19968: jis0208<<14 | 0x28<<7 | 0x1A, + 29923 - 19968: jis0208<<14 | 0x40<<7 | 0x01, + 29924 - 19968: jis0212<<14 | 0x2B<<7 | 0x53, + 29926 - 19968: jis0208<<14 | 0x13<<7 | 0x03, + 29927 - 19968: jis0208<<14 | 0x40<<7 | 0x02, + 29928 - 19968: jis0212<<14 | 0x2B<<7 | 0x54, + 29929 - 19968: jis0208<<14 | 0x40<<7 | 0x03, + 29930 - 19968: jis0212<<14 | 0x2B<<7 | 0x55, + 29931 - 19968: jis0212<<14 | 0x2B<<7 | 0x56, + 29934 - 19968: jis0208<<14 | 0x40<<7 | 0x04, + 29935 - 19968: jis0212<<14 | 0x2B<<7 | 0x57, + 29936 - 19968: jis0208<<14 | 0x40<<7 | 0x06, + 29937 - 19968: jis0208<<14 | 0x40<<7 | 0x07, + 29938 - 19968: jis0208<<14 | 0x40<<7 | 0x05, + 29940 - 19968: jis0212<<14 | 0x2B<<7 | 0x58, + 29942 - 19968: jis0208<<14 | 0x28<<7 | 0x32, + 29943 - 19968: jis0208<<14 | 0x40<<7 | 0x09, + 29944 - 19968: jis0208<<14 | 0x40<<7 | 0x08, + 29946 - 19968: jis0212<<14 | 0x2B<<7 | 0x59, + 29947 - 19968: jis0212<<14 | 0x2B<<7 | 0x5A, + 29948 - 19968: jis0212<<14 | 0x2B<<7 | 0x5B, + 29951 - 19968: jis0212<<14 | 0x2B<<7 | 0x5C, + 29953 - 19968: jis0208<<14 | 0x5A<<7 | 0x12, + 29955 - 19968: jis0208<<14 | 0x40<<7 | 0x0B, + 29956 - 19968: jis0208<<14 | 0x40<<7 | 0x0A, + 29957 - 19968: jis0208<<14 | 0x40<<7 | 0x0C, + 29958 - 19968: jis0212<<14 | 0x2B<<7 | 0x5D, + 29964 - 19968: jis0208<<14 | 0x40<<7 | 0x0D, + 29965 - 19968: jis0208<<14 | 0x40<<7 | 0x0F, + 29966 - 19968: jis0208<<14 | 0x40<<7 | 0x0E, + 29969 - 19968: jis0208<<14 | 0x18<<7 | 0x58, + 29970 - 19968: jis0212<<14 | 0x2C<<7 | 0x00, + 29971 - 19968: jis0208<<14 | 0x40<<7 | 0x11, + 29973 - 19968: jis0208<<14 | 0x40<<7 | 0x10, + 29974 - 19968: jis0212<<14 | 0x2C<<7 | 0x01, + 29975 - 19968: jis0212<<14 | 0x2C<<7 | 0x02, + 29976 - 19968: jis0208<<14 | 0x13<<7 | 0x24, + 29978 - 19968: jis0208<<14 | 0x1E<<7 | 0x32, + 29980 - 19968: jis0208<<14 | 0x24<<7 | 0x1B, + 29982 - 19968: jis0208<<14 | 0x40<<7 | 0x12, + 29983 - 19968: jis0208<<14 | 0x1F<<7 | 0x17, + 29984 - 19968: jis0212<<14 | 0x2C<<7 | 0x03, + 29985 - 19968: jis0212<<14 | 0x2C<<7 | 0x04, + 29987 - 19968: jis0208<<14 | 0x1A<<7 | 0x19, + 29988 - 19968: jis0212<<14 | 0x2C<<7 | 0x05, + 29989 - 19968: jis0208<<14 | 0x10<<7 | 0x58, + 29990 - 19968: jis0208<<14 | 0x40<<7 | 0x13, + 29991 - 19968: jis0212<<14 | 0x2C<<7 | 0x06, + 29992 - 19968: jis0208<<14 | 0x2C<<7 | 0x30, + 29993 - 19968: jis0212<<14 | 0x2C<<7 | 0x07, + 29994 - 19968: jis0212<<14 | 0x2C<<7 | 0x08, + 29995 - 19968: jis0208<<14 | 0x29<<7 | 0x42, + 29996 - 19968: jis0208<<14 | 0x40<<7 | 0x14, + 29999 - 19968: jis0208<<14 | 0x58<<7 | 0x4B, + 30000 - 19968: jis0208<<14 | 0x24<<7 | 0x23, + 30001 - 19968: jis0208<<14 | 0x2C<<7 | 0x12, + 30002 - 19968: jis0208<<14 | 0x18<<7 | 0x22, + 30003 - 19968: jis0208<<14 | 0x1E<<7 | 0x1C, + 30006 - 19968: jis0212<<14 | 0x2C<<7 | 0x0A, + 30007 - 19968: jis0208<<14 | 0x22<<7 | 0x2A, + 30008 - 19968: jis0208<<14 | 0x31<<7 | 0x13, + 30009 - 19968: jis0212<<14 | 0x2C<<7 | 0x0B, + 30010 - 19968: jis0208<<14 | 0x23<<7 | 0x0D, + 30011 - 19968: jis0208<<14 | 0x11<<7 | 0x47, + 30012 - 19968: jis0208<<14 | 0x40<<7 | 0x15, + 30013 - 19968: jis0212<<14 | 0x2C<<7 | 0x0C, + 30014 - 19968: jis0212<<14 | 0x2C<<7 | 0x0D, + 30015 - 19968: jis0212<<14 | 0x2C<<7 | 0x0E, + 30016 - 19968: jis0212<<14 | 0x2C<<7 | 0x0F, + 30019 - 19968: jis0212<<14 | 0x2C<<7 | 0x10, + 30020 - 19968: jis0208<<14 | 0x40<<7 | 0x16, + 30022 - 19968: jis0208<<14 | 0x40<<7 | 0x1B, + 30023 - 19968: jis0212<<14 | 0x2C<<7 | 0x11, + 30024 - 19968: jis0212<<14 | 0x2C<<7 | 0x12, + 30025 - 19968: jis0208<<14 | 0x40<<7 | 0x19, + 30026 - 19968: jis0208<<14 | 0x40<<7 | 0x18, + 30027 - 19968: jis0208<<14 | 0x39<<7 | 0x21, + 30028 - 19968: jis0208<<14 | 0x12<<7 | 0x05, + 30029 - 19968: jis0208<<14 | 0x40<<7 | 0x17, + 30030 - 19968: jis0212<<14 | 0x2C<<7 | 0x13, + 30031 - 19968: jis0208<<14 | 0x0F<<7 | 0x39, + 30032 - 19968: jis0212<<14 | 0x2C<<7 | 0x14, + 30033 - 19968: jis0208<<14 | 0x27<<7 | 0x09, + 30034 - 19968: jis0212<<14 | 0x2C<<7 | 0x15, + 30036 - 19968: jis0208<<14 | 0x27<<7 | 0x29, + 30039 - 19968: jis0212<<14 | 0x2C<<7 | 0x16, + 30041 - 19968: jis0208<<14 | 0x2D<<7 | 0x10, + 30042 - 19968: jis0208<<14 | 0x40<<7 | 0x1C, + 30043 - 19968: jis0208<<14 | 0x40<<7 | 0x1A, + 30044 - 19968: jis0208<<14 | 0x22<<7 | 0x3B, + 30045 - 19968: jis0208<<14 | 0x1F<<7 | 0x05, + 30046 - 19968: jis0212<<14 | 0x2C<<7 | 0x17, + 30047 - 19968: jis0212<<14 | 0x2C<<7 | 0x18, + 30048 - 19968: jis0208<<14 | 0x27<<7 | 0x0A, + 30049 - 19968: jis0212<<14 | 0x2C<<7 | 0x19, + 30050 - 19968: jis0208<<14 | 0x28<<7 | 0x0C, + 30052 - 19968: jis0208<<14 | 0x40<<7 | 0x1E, + 30053 - 19968: jis0208<<14 | 0x2D<<7 | 0x0B, + 30054 - 19968: jis0208<<14 | 0x16<<7 | 0x2C, + 30055 - 19968: jis0208<<14 | 0x40<<7 | 0x1F, + 30057 - 19968: jis0208<<14 | 0x40<<7 | 0x1D, + 30058 - 19968: jis0208<<14 | 0x27<<7 | 0x35, + 30059 - 19968: jis0208<<14 | 0x40<<7 | 0x20, + 30061 - 19968: jis0208<<14 | 0x40<<7 | 0x21, + 30063 - 19968: jis0208<<14 | 0x5A<<7 | 0x13, + 30064 - 19968: jis0208<<14 | 0x0F<<7 | 0x3A, + 30065 - 19968: jis0212<<14 | 0x2C<<7 | 0x1B, + 30067 - 19968: jis0208<<14 | 0x1D<<7 | 0x55, + 30068 - 19968: jis0208<<14 | 0x40<<7 | 0x26, + 30070 - 19968: jis0208<<14 | 0x40<<7 | 0x23, + 30071 - 19968: jis0208<<14 | 0x25<<7 | 0x4C, + 30072 - 19968: jis0208<<14 | 0x40<<7 | 0x22, + 30073 - 19968: jis0212<<14 | 0x2C<<7 | 0x1C, + 30074 - 19968: jis0212<<14 | 0x2C<<7 | 0x1D, + 30075 - 19968: jis0212<<14 | 0x2C<<7 | 0x1E, + 30076 - 19968: jis0212<<14 | 0x2C<<7 | 0x1F, + 30077 - 19968: jis0212<<14 | 0x2C<<7 | 0x20, + 30078 - 19968: jis0212<<14 | 0x2C<<7 | 0x21, + 30079 - 19968: jis0208<<14 | 0x14<<7 | 0x05, + 30081 - 19968: jis0212<<14 | 0x2C<<7 | 0x22, + 30082 - 19968: jis0208<<14 | 0x40<<7 | 0x29, + 30085 - 19968: jis0212<<14 | 0x2C<<7 | 0x23, + 30086 - 19968: jis0208<<14 | 0x40<<7 | 0x24, + 30087 - 19968: jis0208<<14 | 0x40<<7 | 0x25, + 30089 - 19968: jis0208<<14 | 0x40<<7 | 0x28, + 30090 - 19968: jis0208<<14 | 0x40<<7 | 0x27, + 30091 - 19968: jis0208<<14 | 0x28<<7 | 0x04, + 30094 - 19968: jis0208<<14 | 0x20<<7 | 0x21, + 30095 - 19968: jis0208<<14 | 0x20<<7 | 0x20, + 30096 - 19968: jis0212<<14 | 0x2C<<7 | 0x24, + 30097 - 19968: jis0208<<14 | 0x14<<7 | 0x1E, + 30098 - 19968: jis0212<<14 | 0x2C<<7 | 0x25, + 30099 - 19968: jis0212<<14 | 0x2C<<7 | 0x26, + 30100 - 19968: jis0208<<14 | 0x40<<7 | 0x2A, + 30101 - 19968: jis0212<<14 | 0x2C<<7 | 0x27, + 30105 - 19968: jis0212<<14 | 0x2C<<7 | 0x28, + 30106 - 19968: jis0208<<14 | 0x40<<7 | 0x2B, + 30108 - 19968: jis0212<<14 | 0x2C<<7 | 0x29, + 30109 - 19968: jis0208<<14 | 0x40<<7 | 0x2C, + 30114 - 19968: jis0212<<14 | 0x2C<<7 | 0x2A, + 30115 - 19968: jis0208<<14 | 0x40<<7 | 0x2E, + 30116 - 19968: jis0212<<14 | 0x2C<<7 | 0x2B, + 30117 - 19968: jis0208<<14 | 0x40<<7 | 0x2D, + 30123 - 19968: jis0208<<14 | 0x10<<7 | 0x35, + 30129 - 19968: jis0208<<14 | 0x40<<7 | 0x36, + 30130 - 19968: jis0208<<14 | 0x27<<7 | 0x47, + 30131 - 19968: jis0208<<14 | 0x40<<7 | 0x30, + 30132 - 19968: jis0212<<14 | 0x2C<<7 | 0x2C, + 30133 - 19968: jis0208<<14 | 0x40<<7 | 0x32, + 30136 - 19968: jis0208<<14 | 0x40<<7 | 0x34, + 30137 - 19968: jis0208<<14 | 0x1E<<7 | 0x1D, + 30138 - 19968: jis0212<<14 | 0x2C<<7 | 0x2D, + 30140 - 19968: jis0208<<14 | 0x40<<7 | 0x35, + 30141 - 19968: jis0208<<14 | 0x40<<7 | 0x33, + 30142 - 19968: jis0208<<14 | 0x1B<<7 | 0x1F, + 30143 - 19968: jis0212<<14 | 0x2C<<7 | 0x2E, + 30144 - 19968: jis0212<<14 | 0x2C<<7 | 0x2F, + 30145 - 19968: jis0212<<14 | 0x2C<<7 | 0x30, + 30146 - 19968: jis0208<<14 | 0x40<<7 | 0x2F, + 30147 - 19968: jis0208<<14 | 0x40<<7 | 0x31, + 30148 - 19968: jis0212<<14 | 0x2C<<7 | 0x31, + 30149 - 19968: jis0208<<14 | 0x28<<7 | 0x21, + 30150 - 19968: jis0212<<14 | 0x2C<<7 | 0x32, + 30151 - 19968: jis0208<<14 | 0x1D<<7 | 0x28, + 30154 - 19968: jis0208<<14 | 0x40<<7 | 0x38, + 30156 - 19968: jis0212<<14 | 0x2C<<7 | 0x33, + 30157 - 19968: jis0208<<14 | 0x40<<7 | 0x37, + 30158 - 19968: jis0212<<14 | 0x2C<<7 | 0x34, + 30159 - 19968: jis0212<<14 | 0x2C<<7 | 0x35, + 30162 - 19968: jis0208<<14 | 0x40<<7 | 0x39, + 30164 - 19968: jis0208<<14 | 0x1B<<7 | 0x05, + 30165 - 19968: jis0208<<14 | 0x19<<7 | 0x0E, + 30167 - 19968: jis0212<<14 | 0x2C<<7 | 0x36, + 30168 - 19968: jis0208<<14 | 0x24<<7 | 0x56, + 30169 - 19968: jis0208<<14 | 0x40<<7 | 0x3A, + 30171 - 19968: jis0208<<14 | 0x23<<7 | 0x2A, + 30172 - 19968: jis0212<<14 | 0x2C<<7 | 0x37, + 30174 - 19968: jis0208<<14 | 0x40<<7 | 0x3C, + 30175 - 19968: jis0212<<14 | 0x2C<<7 | 0x38, + 30176 - 19968: jis0212<<14 | 0x2C<<7 | 0x39, + 30177 - 19968: jis0212<<14 | 0x2C<<7 | 0x3A, + 30178 - 19968: jis0208<<14 | 0x2D<<7 | 0x00, + 30179 - 19968: jis0208<<14 | 0x40<<7 | 0x3B, + 30180 - 19968: jis0212<<14 | 0x2C<<7 | 0x3B, + 30183 - 19968: jis0212<<14 | 0x2C<<7 | 0x3C, + 30185 - 19968: jis0208<<14 | 0x20<<7 | 0x48, + 30188 - 19968: jis0212<<14 | 0x2C<<7 | 0x3D, + 30190 - 19968: jis0212<<14 | 0x2C<<7 | 0x3E, + 30191 - 19968: jis0212<<14 | 0x2C<<7 | 0x3F, + 30192 - 19968: jis0208<<14 | 0x40<<7 | 0x41, + 30193 - 19968: jis0212<<14 | 0x2C<<7 | 0x40, + 30194 - 19968: jis0208<<14 | 0x40<<7 | 0x43, + 30195 - 19968: jis0208<<14 | 0x40<<7 | 0x44, + 30196 - 19968: jis0208<<14 | 0x22<<7 | 0x33, + 30201 - 19968: jis0212<<14 | 0x2C<<7 | 0x41, + 30202 - 19968: jis0208<<14 | 0x40<<7 | 0x42, + 30204 - 19968: jis0208<<14 | 0x40<<7 | 0x3F, + 30206 - 19968: jis0208<<14 | 0x40<<7 | 0x3D, + 30207 - 19968: jis0208<<14 | 0x40<<7 | 0x3E, + 30208 - 19968: jis0212<<14 | 0x2C<<7 | 0x42, + 30209 - 19968: jis0208<<14 | 0x40<<7 | 0x40, + 30210 - 19968: jis0212<<14 | 0x2C<<7 | 0x43, + 30211 - 19968: jis0212<<14 | 0x2C<<7 | 0x44, + 30212 - 19968: jis0212<<14 | 0x2C<<7 | 0x45, + 30215 - 19968: jis0212<<14 | 0x2C<<7 | 0x46, + 30216 - 19968: jis0212<<14 | 0x2C<<7 | 0x47, + 30217 - 19968: jis0208<<14 | 0x40<<7 | 0x47, + 30218 - 19968: jis0212<<14 | 0x2C<<7 | 0x48, + 30219 - 19968: jis0208<<14 | 0x40<<7 | 0x45, + 30220 - 19968: jis0212<<14 | 0x2C<<7 | 0x49, + 30221 - 19968: jis0208<<14 | 0x40<<7 | 0x46, + 30223 - 19968: jis0212<<14 | 0x2C<<7 | 0x4A, + 30226 - 19968: jis0212<<14 | 0x2C<<7 | 0x4B, + 30227 - 19968: jis0212<<14 | 0x2C<<7 | 0x4C, + 30229 - 19968: jis0212<<14 | 0x2C<<7 | 0x4D, + 30230 - 19968: jis0212<<14 | 0x2C<<7 | 0x4E, + 30233 - 19968: jis0212<<14 | 0x2C<<7 | 0x4F, + 30235 - 19968: jis0212<<14 | 0x2C<<7 | 0x50, + 30236 - 19968: jis0212<<14 | 0x2C<<7 | 0x51, + 30237 - 19968: jis0212<<14 | 0x2C<<7 | 0x52, + 30238 - 19968: jis0212<<14 | 0x2C<<7 | 0x53, + 30239 - 19968: jis0208<<14 | 0x40<<7 | 0x48, + 30240 - 19968: jis0208<<14 | 0x40<<7 | 0x4A, + 30241 - 19968: jis0208<<14 | 0x40<<7 | 0x4B, + 30242 - 19968: jis0208<<14 | 0x40<<7 | 0x4C, + 30243 - 19968: jis0212<<14 | 0x2C<<7 | 0x54, + 30244 - 19968: jis0208<<14 | 0x40<<7 | 0x4D, + 30245 - 19968: jis0212<<14 | 0x2C<<7 | 0x55, + 30246 - 19968: jis0212<<14 | 0x2C<<7 | 0x56, + 30247 - 19968: jis0208<<14 | 0x40<<7 | 0x49, + 30249 - 19968: jis0212<<14 | 0x2C<<7 | 0x57, + 30253 - 19968: jis0212<<14 | 0x2C<<7 | 0x58, + 30256 - 19968: jis0208<<14 | 0x40<<7 | 0x4F, + 30258 - 19968: jis0212<<14 | 0x2C<<7 | 0x59, + 30259 - 19968: jis0212<<14 | 0x2C<<7 | 0x5A, + 30260 - 19968: jis0208<<14 | 0x40<<7 | 0x4E, + 30261 - 19968: jis0212<<14 | 0x2C<<7 | 0x5B, + 30264 - 19968: jis0212<<14 | 0x2C<<7 | 0x5C, + 30265 - 19968: jis0212<<14 | 0x2C<<7 | 0x5D, + 30266 - 19968: jis0212<<14 | 0x2D<<7 | 0x00, + 30267 - 19968: jis0208<<14 | 0x40<<7 | 0x50, + 30268 - 19968: jis0212<<14 | 0x2D<<7 | 0x01, + 30272 - 19968: jis0212<<14 | 0x2D<<7 | 0x03, + 30273 - 19968: jis0212<<14 | 0x2D<<7 | 0x04, + 30274 - 19968: jis0208<<14 | 0x2D<<7 | 0x24, + 30275 - 19968: jis0212<<14 | 0x2D<<7 | 0x05, + 30276 - 19968: jis0212<<14 | 0x2D<<7 | 0x06, + 30277 - 19968: jis0212<<14 | 0x2D<<7 | 0x07, + 30278 - 19968: jis0208<<14 | 0x40<<7 | 0x53, + 30279 - 19968: jis0208<<14 | 0x40<<7 | 0x51, + 30280 - 19968: jis0208<<14 | 0x40<<7 | 0x52, + 30281 - 19968: jis0212<<14 | 0x2D<<7 | 0x08, + 30282 - 19968: jis0212<<14 | 0x2D<<7 | 0x02, + 30283 - 19968: jis0212<<14 | 0x2D<<7 | 0x09, + 30284 - 19968: jis0208<<14 | 0x13<<7 | 0x41, + 30290 - 19968: jis0208<<14 | 0x2B<<7 | 0x5D, + 30293 - 19968: jis0212<<14 | 0x2D<<7 | 0x0A, + 30294 - 19968: jis0208<<14 | 0x29<<7 | 0x29, + 30296 - 19968: jis0208<<14 | 0x40<<7 | 0x55, + 30297 - 19968: jis0212<<14 | 0x2D<<7 | 0x0B, + 30300 - 19968: jis0208<<14 | 0x40<<7 | 0x54, + 30303 - 19968: jis0212<<14 | 0x2D<<7 | 0x0C, + 30305 - 19968: jis0208<<14 | 0x40<<7 | 0x56, + 30306 - 19968: jis0208<<14 | 0x40<<7 | 0x57, + 30308 - 19968: jis0212<<14 | 0x2D<<7 | 0x0D, + 30309 - 19968: jis0212<<14 | 0x2D<<7 | 0x0E, + 30311 - 19968: jis0208<<14 | 0x40<<7 | 0x5B, + 30312 - 19968: jis0208<<14 | 0x40<<7 | 0x58, + 30313 - 19968: jis0208<<14 | 0x40<<7 | 0x59, + 30314 - 19968: jis0208<<14 | 0x40<<7 | 0x5A, + 30316 - 19968: jis0208<<14 | 0x40<<7 | 0x5C, + 30317 - 19968: jis0212<<14 | 0x2D<<7 | 0x0F, + 30318 - 19968: jis0212<<14 | 0x2D<<7 | 0x10, + 30319 - 19968: jis0212<<14 | 0x2D<<7 | 0x11, + 30320 - 19968: jis0208<<14 | 0x40<<7 | 0x5D, + 30321 - 19968: jis0212<<14 | 0x2D<<7 | 0x12, + 30322 - 19968: jis0208<<14 | 0x41<<7 | 0x00, + 30324 - 19968: jis0212<<14 | 0x2D<<7 | 0x13, + 30326 - 19968: jis0208<<14 | 0x41<<7 | 0x01, + 30328 - 19968: jis0208<<14 | 0x41<<7 | 0x02, + 30330 - 19968: jis0208<<14 | 0x27<<7 | 0x0E, + 30331 - 19968: jis0208<<14 | 0x24<<7 | 0x2F, + 30332 - 19968: jis0208<<14 | 0x41<<7 | 0x03, + 30333 - 19968: jis0208<<14 | 0x26<<7 | 0x51, + 30334 - 19968: jis0208<<14 | 0x28<<7 | 0x13, + 30336 - 19968: jis0208<<14 | 0x41<<7 | 0x04, + 30337 - 19968: jis0212<<14 | 0x2D<<7 | 0x14, + 30338 - 19968: jis0208<<14 | 0x5A<<7 | 0x14, + 30339 - 19968: jis0208<<14 | 0x41<<7 | 0x05, + 30340 - 19968: jis0208<<14 | 0x24<<7 | 0x09, + 30341 - 19968: jis0212<<14 | 0x2D<<7 | 0x15, + 30342 - 19968: jis0208<<14 | 0x12<<7 | 0x06, + 30343 - 19968: jis0208<<14 | 0x18<<7 | 0x23, + 30344 - 19968: jis0208<<14 | 0x41<<7 | 0x06, + 30347 - 19968: jis0208<<14 | 0x41<<7 | 0x07, + 30348 - 19968: jis0212<<14 | 0x2D<<7 | 0x16, + 30349 - 19968: jis0212<<14 | 0x2D<<7 | 0x17, + 30350 - 19968: jis0208<<14 | 0x41<<7 | 0x08, + 30352 - 19968: jis0208<<14 | 0x1A<<7 | 0x08, + 30355 - 19968: jis0208<<14 | 0x41<<7 | 0x0A, + 30357 - 19968: jis0212<<14 | 0x2D<<7 | 0x18, + 30358 - 19968: jis0208<<14 | 0x41<<7 | 0x09, + 30361 - 19968: jis0208<<14 | 0x41<<7 | 0x0B, + 30362 - 19968: jis0208<<14 | 0x41<<7 | 0x0C, + 30363 - 19968: jis0208<<14 | 0x5A<<7 | 0x17, + 30364 - 19968: jis0208<<14 | 0x5A<<7 | 0x15, + 30365 - 19968: jis0212<<14 | 0x2D<<7 | 0x1B, + 30366 - 19968: jis0208<<14 | 0x5A<<7 | 0x16, + 30367 - 19968: jis0212<<14 | 0x2D<<7 | 0x1C, + 30368 - 19968: jis0212<<14 | 0x2D<<7 | 0x1D, + 30370 - 19968: jis0212<<14 | 0x2D<<7 | 0x1E, + 30371 - 19968: jis0212<<14 | 0x2D<<7 | 0x1F, + 30372 - 19968: jis0212<<14 | 0x2D<<7 | 0x20, + 30373 - 19968: jis0212<<14 | 0x2D<<7 | 0x21, + 30374 - 19968: jis0208<<14 | 0x5A<<7 | 0x18, + 30375 - 19968: jis0212<<14 | 0x2D<<7 | 0x23, + 30376 - 19968: jis0212<<14 | 0x2D<<7 | 0x24, + 30378 - 19968: jis0212<<14 | 0x2D<<7 | 0x25, + 30381 - 19968: jis0212<<14 | 0x2D<<7 | 0x26, + 30382 - 19968: jis0208<<14 | 0x27<<7 | 0x48, + 30384 - 19968: jis0208<<14 | 0x41<<7 | 0x0D, + 30388 - 19968: jis0208<<14 | 0x41<<7 | 0x0E, + 30391 - 19968: jis0208<<14 | 0x52<<7 | 0x48, + 30392 - 19968: jis0208<<14 | 0x41<<7 | 0x0F, + 30393 - 19968: jis0208<<14 | 0x41<<7 | 0x10, + 30394 - 19968: jis0208<<14 | 0x41<<7 | 0x11, + 30397 - 19968: jis0212<<14 | 0x2D<<7 | 0x27, + 30399 - 19968: jis0208<<14 | 0x1A<<7 | 0x0D, + 30401 - 19968: jis0212<<14 | 0x2D<<7 | 0x28, + 30402 - 19968: jis0208<<14 | 0x41<<7 | 0x12, + 30403 - 19968: jis0208<<14 | 0x26<<7 | 0x35, + 30405 - 19968: jis0212<<14 | 0x2D<<7 | 0x29, + 30406 - 19968: jis0208<<14 | 0x2A<<7 | 0x3E, + 30408 - 19968: jis0208<<14 | 0x10<<7 | 0x2D, + 30409 - 19968: jis0212<<14 | 0x2D<<7 | 0x2A, + 30410 - 19968: jis0208<<14 | 0x10<<7 | 0x36, + 30411 - 19968: jis0212<<14 | 0x2D<<7 | 0x2B, + 30412 - 19968: jis0212<<14 | 0x2D<<7 | 0x2C, + 30413 - 19968: jis0208<<14 | 0x41<<7 | 0x13, + 30414 - 19968: jis0212<<14 | 0x2D<<7 | 0x2D, + 30418 - 19968: jis0208<<14 | 0x41<<7 | 0x15, + 30420 - 19968: jis0212<<14 | 0x2D<<7 | 0x2E, + 30422 - 19968: jis0208<<14 | 0x41<<7 | 0x14, + 30423 - 19968: jis0208<<14 | 0x24<<7 | 0x4F, + 30425 - 19968: jis0212<<14 | 0x2D<<7 | 0x2F, + 30427 - 19968: jis0208<<14 | 0x1F<<7 | 0x18, + 30428 - 19968: jis0208<<14 | 0x3C<<7 | 0x18, + 30430 - 19968: jis0208<<14 | 0x41<<7 | 0x16, + 30431 - 19968: jis0208<<14 | 0x2B<<7 | 0x20, + 30432 - 19968: jis0212<<14 | 0x2D<<7 | 0x30, + 30433 - 19968: jis0208<<14 | 0x41<<7 | 0x17, + 30435 - 19968: jis0208<<14 | 0x13<<7 | 0x25, + 30436 - 19968: jis0208<<14 | 0x27<<7 | 0x36, + 30437 - 19968: jis0208<<14 | 0x41<<7 | 0x18, + 30438 - 19968: jis0212<<14 | 0x2D<<7 | 0x31, + 30439 - 19968: jis0208<<14 | 0x41<<7 | 0x19, + 30440 - 19968: jis0212<<14 | 0x2D<<7 | 0x32, + 30442 - 19968: jis0208<<14 | 0x41<<7 | 0x1A, + 30444 - 19968: jis0212<<14 | 0x2D<<7 | 0x33, + 30446 - 19968: jis0208<<14 | 0x2B<<7 | 0x3B, + 30448 - 19968: jis0212<<14 | 0x2D<<7 | 0x34, + 30449 - 19968: jis0212<<14 | 0x2D<<7 | 0x35, + 30450 - 19968: jis0208<<14 | 0x2B<<7 | 0x34, + 30452 - 19968: jis0208<<14 | 0x23<<7 | 0x1D, + 30454 - 19968: jis0212<<14 | 0x2D<<7 | 0x36, + 30456 - 19968: jis0208<<14 | 0x20<<7 | 0x49, + 30457 - 19968: jis0212<<14 | 0x2D<<7 | 0x37, + 30459 - 19968: jis0208<<14 | 0x41<<7 | 0x1C, + 30460 - 19968: jis0212<<14 | 0x2D<<7 | 0x38, + 30462 - 19968: jis0208<<14 | 0x1C<<7 | 0x41, + 30464 - 19968: jis0212<<14 | 0x2D<<7 | 0x39, + 30465 - 19968: jis0208<<14 | 0x1D<<7 | 0x29, + 30468 - 19968: jis0208<<14 | 0x41<<7 | 0x1F, + 30470 - 19968: jis0212<<14 | 0x2D<<7 | 0x3A, + 30471 - 19968: jis0208<<14 | 0x41<<7 | 0x1E, + 30472 - 19968: jis0208<<14 | 0x41<<7 | 0x1D, + 30473 - 19968: jis0208<<14 | 0x27<<7 | 0x5C, + 30474 - 19968: jis0212<<14 | 0x2D<<7 | 0x3B, + 30475 - 19968: jis0208<<14 | 0x13<<7 | 0x26, + 30476 - 19968: jis0208<<14 | 0x17<<7 | 0x08, + 30478 - 19968: jis0212<<14 | 0x2D<<7 | 0x3C, + 30482 - 19968: jis0212<<14 | 0x2D<<7 | 0x3D, + 30484 - 19968: jis0212<<14 | 0x2D<<7 | 0x3E, + 30485 - 19968: jis0212<<14 | 0x2D<<7 | 0x3F, + 30487 - 19968: jis0212<<14 | 0x2D<<7 | 0x40, + 30489 - 19968: jis0212<<14 | 0x2D<<7 | 0x41, + 30490 - 19968: jis0212<<14 | 0x2D<<7 | 0x42, + 30491 - 19968: jis0208<<14 | 0x41<<7 | 0x25, + 30492 - 19968: jis0212<<14 | 0x2D<<7 | 0x43, + 30494 - 19968: jis0208<<14 | 0x41<<7 | 0x22, + 30495 - 19968: jis0208<<14 | 0x1E<<7 | 0x1E, + 30496 - 19968: jis0208<<14 | 0x2B<<7 | 0x11, + 30498 - 19968: jis0212<<14 | 0x2D<<7 | 0x44, + 30500 - 19968: jis0208<<14 | 0x41<<7 | 0x21, + 30501 - 19968: jis0208<<14 | 0x41<<7 | 0x23, + 30502 - 19968: jis0208<<14 | 0x41<<7 | 0x24, + 30504 - 19968: jis0212<<14 | 0x2D<<7 | 0x45, + 30505 - 19968: jis0208<<14 | 0x41<<7 | 0x20, + 30509 - 19968: jis0212<<14 | 0x2D<<7 | 0x46, + 30510 - 19968: jis0212<<14 | 0x2D<<7 | 0x47, + 30511 - 19968: jis0212<<14 | 0x2D<<7 | 0x48, + 30516 - 19968: jis0212<<14 | 0x2D<<7 | 0x49, + 30517 - 19968: jis0212<<14 | 0x2D<<7 | 0x4A, + 30518 - 19968: jis0212<<14 | 0x2D<<7 | 0x4B, + 30519 - 19968: jis0208<<14 | 0x41<<7 | 0x26, + 30520 - 19968: jis0208<<14 | 0x41<<7 | 0x27, + 30521 - 19968: jis0212<<14 | 0x2D<<7 | 0x4C, + 30522 - 19968: jis0208<<14 | 0x23<<7 | 0x0E, + 30524 - 19968: jis0208<<14 | 0x13<<7 | 0x42, + 30525 - 19968: jis0212<<14 | 0x2D<<7 | 0x4D, + 30526 - 19968: jis0212<<14 | 0x2D<<7 | 0x4E, + 30528 - 19968: jis0208<<14 | 0x22<<7 | 0x44, + 30530 - 19968: jis0212<<14 | 0x2D<<7 | 0x4F, + 30533 - 19968: jis0212<<14 | 0x2D<<7 | 0x50, + 30534 - 19968: jis0208<<14 | 0x5A<<7 | 0x1A, + 30535 - 19968: jis0208<<14 | 0x41<<7 | 0x28, + 30538 - 19968: jis0212<<14 | 0x2D<<7 | 0x52, + 30541 - 19968: jis0212<<14 | 0x2D<<7 | 0x53, + 30542 - 19968: jis0212<<14 | 0x2D<<7 | 0x54, + 30543 - 19968: jis0212<<14 | 0x2D<<7 | 0x55, + 30546 - 19968: jis0212<<14 | 0x2D<<7 | 0x56, + 30550 - 19968: jis0212<<14 | 0x2D<<7 | 0x57, + 30551 - 19968: jis0212<<14 | 0x2D<<7 | 0x58, + 30554 - 19968: jis0208<<14 | 0x41<<7 | 0x29, + 30555 - 19968: jis0208<<14 | 0x41<<7 | 0x2C, + 30556 - 19968: jis0212<<14 | 0x2D<<7 | 0x59, + 30558 - 19968: jis0212<<14 | 0x2D<<7 | 0x5A, + 30559 - 19968: jis0212<<14 | 0x2D<<7 | 0x5B, + 30560 - 19968: jis0212<<14 | 0x2D<<7 | 0x5C, + 30561 - 19968: jis0208<<14 | 0x1E<<7 | 0x46, + 30562 - 19968: jis0212<<14 | 0x2D<<7 | 0x5D, + 30563 - 19968: jis0208<<14 | 0x25<<7 | 0x23, + 30564 - 19968: jis0212<<14 | 0x2E<<7 | 0x00, + 30565 - 19968: jis0208<<14 | 0x41<<7 | 0x2D, + 30566 - 19968: jis0208<<14 | 0x2A<<7 | 0x32, + 30567 - 19968: jis0212<<14 | 0x2E<<7 | 0x01, + 30568 - 19968: jis0208<<14 | 0x41<<7 | 0x2A, + 30570 - 19968: jis0212<<14 | 0x2E<<7 | 0x02, + 30571 - 19968: jis0208<<14 | 0x41<<7 | 0x2B, + 30572 - 19968: jis0212<<14 | 0x2E<<7 | 0x03, + 30576 - 19968: jis0212<<14 | 0x2E<<7 | 0x04, + 30578 - 19968: jis0212<<14 | 0x2E<<7 | 0x05, + 30579 - 19968: jis0212<<14 | 0x2E<<7 | 0x06, + 30580 - 19968: jis0212<<14 | 0x2E<<7 | 0x07, + 30585 - 19968: jis0208<<14 | 0x41<<7 | 0x30, + 30586 - 19968: jis0212<<14 | 0x2E<<7 | 0x08, + 30589 - 19968: jis0212<<14 | 0x2E<<7 | 0x09, + 30590 - 19968: jis0208<<14 | 0x41<<7 | 0x2F, + 30591 - 19968: jis0208<<14 | 0x41<<7 | 0x2E, + 30592 - 19968: jis0212<<14 | 0x2E<<7 | 0x0A, + 30596 - 19968: jis0212<<14 | 0x2E<<7 | 0x0B, + 30603 - 19968: jis0208<<14 | 0x41<<7 | 0x32, + 30604 - 19968: jis0212<<14 | 0x2E<<7 | 0x0C, + 30605 - 19968: jis0212<<14 | 0x2E<<7 | 0x0D, + 30606 - 19968: jis0208<<14 | 0x41<<7 | 0x31, + 30609 - 19968: jis0208<<14 | 0x41<<7 | 0x33, + 30612 - 19968: jis0212<<14 | 0x2E<<7 | 0x0E, + 30613 - 19968: jis0212<<14 | 0x2E<<7 | 0x0F, + 30614 - 19968: jis0212<<14 | 0x2E<<7 | 0x10, + 30618 - 19968: jis0212<<14 | 0x2E<<7 | 0x11, + 30622 - 19968: jis0208<<14 | 0x41<<7 | 0x35, + 30623 - 19968: jis0212<<14 | 0x2E<<7 | 0x12, + 30624 - 19968: jis0208<<14 | 0x41<<7 | 0x34, + 30626 - 19968: jis0212<<14 | 0x2E<<7 | 0x13, + 30629 - 19968: jis0208<<14 | 0x29<<7 | 0x2C, + 30631 - 19968: jis0212<<14 | 0x2E<<7 | 0x14, + 30634 - 19968: jis0212<<14 | 0x2E<<7 | 0x15, + 30636 - 19968: jis0208<<14 | 0x1C<<7 | 0x35, + 30637 - 19968: jis0208<<14 | 0x2D<<7 | 0x25, + 30638 - 19968: jis0212<<14 | 0x2E<<7 | 0x16, + 30639 - 19968: jis0212<<14 | 0x2E<<7 | 0x17, + 30640 - 19968: jis0208<<14 | 0x41<<7 | 0x36, + 30641 - 19968: jis0212<<14 | 0x2E<<7 | 0x18, + 30643 - 19968: jis0208<<14 | 0x25<<7 | 0x16, + 30645 - 19968: jis0212<<14 | 0x2E<<7 | 0x19, + 30646 - 19968: jis0208<<14 | 0x41<<7 | 0x37, + 30649 - 19968: jis0208<<14 | 0x41<<7 | 0x38, + 30651 - 19968: jis0208<<14 | 0x41<<7 | 0x3C, + 30652 - 19968: jis0208<<14 | 0x41<<7 | 0x3A, + 30653 - 19968: jis0208<<14 | 0x41<<7 | 0x3B, + 30654 - 19968: jis0212<<14 | 0x2E<<7 | 0x1A, + 30655 - 19968: jis0208<<14 | 0x41<<7 | 0x39, + 30659 - 19968: jis0212<<14 | 0x2E<<7 | 0x1B, + 30663 - 19968: jis0208<<14 | 0x41<<7 | 0x3D, + 30665 - 19968: jis0212<<14 | 0x2E<<7 | 0x1C, + 30669 - 19968: jis0208<<14 | 0x41<<7 | 0x3E, + 30673 - 19968: jis0212<<14 | 0x2E<<7 | 0x1D, + 30674 - 19968: jis0212<<14 | 0x2E<<7 | 0x1E, + 30677 - 19968: jis0212<<14 | 0x2E<<7 | 0x1F, + 30679 - 19968: jis0208<<14 | 0x41<<7 | 0x3F, + 30681 - 19968: jis0212<<14 | 0x2E<<7 | 0x20, + 30682 - 19968: jis0208<<14 | 0x41<<7 | 0x40, + 30683 - 19968: jis0208<<14 | 0x2B<<7 | 0x16, + 30684 - 19968: jis0208<<14 | 0x41<<7 | 0x41, + 30686 - 19968: jis0212<<14 | 0x2E<<7 | 0x21, + 30687 - 19968: jis0212<<14 | 0x2E<<7 | 0x22, + 30688 - 19968: jis0212<<14 | 0x2E<<7 | 0x23, + 30690 - 19968: jis0208<<14 | 0x2B<<7 | 0x4F, + 30691 - 19968: jis0208<<14 | 0x41<<7 | 0x42, + 30692 - 19968: jis0212<<14 | 0x2E<<7 | 0x24, + 30693 - 19968: jis0208<<14 | 0x22<<7 | 0x2D, + 30694 - 19968: jis0212<<14 | 0x2E<<7 | 0x25, + 30695 - 19968: jis0208<<14 | 0x26<<7 | 0x49, + 30697 - 19968: jis0208<<14 | 0x15<<7 | 0x4A, + 30698 - 19968: jis0212<<14 | 0x2E<<7 | 0x26, + 30700 - 19968: jis0212<<14 | 0x2E<<7 | 0x27, + 30701 - 19968: jis0208<<14 | 0x22<<7 | 0x1A, + 30702 - 19968: jis0208<<14 | 0x41<<7 | 0x43, + 30703 - 19968: jis0208<<14 | 0x15<<7 | 0x19, + 30704 - 19968: jis0212<<14 | 0x2E<<7 | 0x28, + 30705 - 19968: jis0212<<14 | 0x2E<<7 | 0x29, + 30707 - 19968: jis0208<<14 | 0x1F<<7 | 0x2F, + 30708 - 19968: jis0212<<14 | 0x2E<<7 | 0x2A, + 30712 - 19968: jis0212<<14 | 0x2E<<7 | 0x2B, + 30715 - 19968: jis0212<<14 | 0x2E<<7 | 0x2C, + 30716 - 19968: jis0208<<14 | 0x41<<7 | 0x44, + 30722 - 19968: jis0208<<14 | 0x19<<7 | 0x1C, + 30725 - 19968: jis0212<<14 | 0x2E<<7 | 0x2D, + 30726 - 19968: jis0212<<14 | 0x2E<<7 | 0x2E, + 30729 - 19968: jis0212<<14 | 0x2E<<7 | 0x2F, + 30732 - 19968: jis0208<<14 | 0x41<<7 | 0x45, + 30733 - 19968: jis0212<<14 | 0x2E<<7 | 0x30, + 30734 - 19968: jis0212<<14 | 0x2E<<7 | 0x31, + 30737 - 19968: jis0212<<14 | 0x2E<<7 | 0x32, + 30738 - 19968: jis0208<<14 | 0x41<<7 | 0x46, + 30740 - 19968: jis0208<<14 | 0x17<<7 | 0x05, + 30741 - 19968: jis0208<<14 | 0x19<<7 | 0x34, + 30749 - 19968: jis0212<<14 | 0x2E<<7 | 0x33, + 30752 - 19968: jis0208<<14 | 0x41<<7 | 0x48, + 30753 - 19968: jis0208<<14 | 0x5A<<7 | 0x1C, + 30754 - 19968: jis0212<<14 | 0x2E<<7 | 0x35, + 30755 - 19968: jis0212<<14 | 0x2E<<7 | 0x36, + 30757 - 19968: jis0208<<14 | 0x24<<7 | 0x35, + 30758 - 19968: jis0208<<14 | 0x19<<7 | 0x35, + 30759 - 19968: jis0208<<14 | 0x14<<7 | 0x2D, + 30765 - 19968: jis0212<<14 | 0x2E<<7 | 0x37, + 30766 - 19968: jis0212<<14 | 0x2E<<7 | 0x38, + 30768 - 19968: jis0212<<14 | 0x2E<<7 | 0x39, + 30770 - 19968: jis0208<<14 | 0x2A<<7 | 0x03, + 30772 - 19968: jis0208<<14 | 0x26<<7 | 0x2A, + 30773 - 19968: jis0212<<14 | 0x2E<<7 | 0x3A, + 30775 - 19968: jis0212<<14 | 0x2E<<7 | 0x3B, + 30778 - 19968: jis0208<<14 | 0x24<<7 | 0x36, + 30783 - 19968: jis0208<<14 | 0x18<<7 | 0x3B, + 30787 - 19968: jis0212<<14 | 0x2E<<7 | 0x3C, + 30788 - 19968: jis0212<<14 | 0x2E<<7 | 0x3D, + 30789 - 19968: jis0208<<14 | 0x41<<7 | 0x4A, + 30791 - 19968: jis0212<<14 | 0x2E<<7 | 0x3E, + 30792 - 19968: jis0212<<14 | 0x2E<<7 | 0x3F, + 30796 - 19968: jis0212<<14 | 0x2E<<7 | 0x40, + 30798 - 19968: jis0208<<14 | 0x5A<<7 | 0x1D, + 30802 - 19968: jis0212<<14 | 0x2E<<7 | 0x42, + 30812 - 19968: jis0212<<14 | 0x2E<<7 | 0x43, + 30813 - 19968: jis0208<<14 | 0x1D<<7 | 0x2A, + 30814 - 19968: jis0212<<14 | 0x2E<<7 | 0x44, + 30816 - 19968: jis0212<<14 | 0x2E<<7 | 0x45, + 30817 - 19968: jis0212<<14 | 0x2E<<7 | 0x46, + 30819 - 19968: jis0212<<14 | 0x2E<<7 | 0x47, + 30820 - 19968: jis0208<<14 | 0x5A<<7 | 0x1E, + 30824 - 19968: jis0212<<14 | 0x2E<<7 | 0x49, + 30826 - 19968: jis0212<<14 | 0x2E<<7 | 0x4A, + 30827 - 19968: jis0208<<14 | 0x2D<<7 | 0x11, + 30828 - 19968: jis0208<<14 | 0x18<<7 | 0x24, + 30830 - 19968: jis0212<<14 | 0x2E<<7 | 0x4B, + 30831 - 19968: jis0208<<14 | 0x17<<7 | 0x06, + 30834 - 19968: jis0208<<14 | 0x27<<7 | 0x02, + 30836 - 19968: jis0208<<14 | 0x41<<7 | 0x4C, + 30842 - 19968: jis0208<<14 | 0x5A<<7 | 0x1F, + 30844 - 19968: jis0208<<14 | 0x41<<7 | 0x4E, + 30846 - 19968: jis0212<<14 | 0x2E<<7 | 0x4D, + 30849 - 19968: jis0208<<14 | 0x17<<7 | 0x4A, + 30854 - 19968: jis0208<<14 | 0x41<<7 | 0x4D, + 30855 - 19968: jis0208<<14 | 0x23<<7 | 0x55, + 30858 - 19968: jis0212<<14 | 0x2E<<7 | 0x4E, + 30860 - 19968: jis0208<<14 | 0x41<<7 | 0x50, + 30861 - 19968: jis0208<<14 | 0x12<<7 | 0x16, + 30862 - 19968: jis0208<<14 | 0x41<<7 | 0x4B, + 30863 - 19968: jis0212<<14 | 0x2E<<7 | 0x4F, + 30865 - 19968: jis0208<<14 | 0x27<<7 | 0x49, + 30867 - 19968: jis0208<<14 | 0x10<<7 | 0x0F, + 30868 - 19968: jis0212<<14 | 0x2E<<7 | 0x50, + 30869 - 19968: jis0208<<14 | 0x19<<7 | 0x4B, + 30871 - 19968: jis0208<<14 | 0x2E<<7 | 0x31, + 30872 - 19968: jis0212<<14 | 0x2E<<7 | 0x51, + 30874 - 19968: jis0208<<14 | 0x41<<7 | 0x4F, + 30877 - 19968: jis0212<<14 | 0x2E<<7 | 0x53, + 30878 - 19968: jis0212<<14 | 0x2E<<7 | 0x54, + 30879 - 19968: jis0212<<14 | 0x2E<<7 | 0x55, + 30881 - 19968: jis0212<<14 | 0x2E<<7 | 0x52, + 30883 - 19968: jis0208<<14 | 0x41<<7 | 0x51, + 30884 - 19968: jis0212<<14 | 0x2E<<7 | 0x56, + 30887 - 19968: jis0208<<14 | 0x29<<7 | 0x2A, + 30888 - 19968: jis0212<<14 | 0x2E<<7 | 0x57, + 30889 - 19968: jis0208<<14 | 0x1F<<7 | 0x38, + 30890 - 19968: jis0208<<14 | 0x41<<7 | 0x53, + 30892 - 19968: jis0212<<14 | 0x2E<<7 | 0x58, + 30893 - 19968: jis0212<<14 | 0x2E<<7 | 0x59, + 30895 - 19968: jis0208<<14 | 0x41<<7 | 0x54, + 30896 - 19968: jis0212<<14 | 0x2E<<7 | 0x5A, + 30897 - 19968: jis0212<<14 | 0x2E<<7 | 0x5B, + 30898 - 19968: jis0212<<14 | 0x2E<<7 | 0x5C, + 30899 - 19968: jis0212<<14 | 0x2E<<7 | 0x5D, + 30901 - 19968: jis0208<<14 | 0x41<<7 | 0x52, + 30906 - 19968: jis0208<<14 | 0x12<<7 | 0x2D, + 30907 - 19968: jis0212<<14 | 0x2F<<7 | 0x00, + 30908 - 19968: jis0208<<14 | 0x41<<7 | 0x5A, + 30909 - 19968: jis0212<<14 | 0x2F<<7 | 0x01, + 30910 - 19968: jis0208<<14 | 0x41<<7 | 0x59, + 30911 - 19968: jis0212<<14 | 0x2F<<7 | 0x02, + 30913 - 19968: jis0208<<14 | 0x1B<<7 | 0x06, + 30917 - 19968: jis0208<<14 | 0x41<<7 | 0x5B, + 30918 - 19968: jis0208<<14 | 0x41<<7 | 0x56, + 30919 - 19968: jis0212<<14 | 0x2F<<7 | 0x03, + 30920 - 19968: jis0212<<14 | 0x2F<<7 | 0x04, + 30921 - 19968: jis0212<<14 | 0x2F<<7 | 0x05, + 30922 - 19968: jis0208<<14 | 0x41<<7 | 0x5C, + 30923 - 19968: jis0208<<14 | 0x41<<7 | 0x57, + 30924 - 19968: jis0212<<14 | 0x2F<<7 | 0x06, + 30926 - 19968: jis0212<<14 | 0x2F<<7 | 0x07, + 30928 - 19968: jis0208<<14 | 0x27<<7 | 0x37, + 30929 - 19968: jis0208<<14 | 0x41<<7 | 0x55, + 30930 - 19968: jis0212<<14 | 0x2F<<7 | 0x08, + 30931 - 19968: jis0212<<14 | 0x2F<<7 | 0x09, + 30932 - 19968: jis0208<<14 | 0x41<<7 | 0x58, + 30933 - 19968: jis0212<<14 | 0x2F<<7 | 0x0A, + 30934 - 19968: jis0212<<14 | 0x2F<<7 | 0x0B, + 30938 - 19968: jis0208<<14 | 0x42<<7 | 0x01, + 30939 - 19968: jis0212<<14 | 0x2F<<7 | 0x0D, + 30943 - 19968: jis0212<<14 | 0x2F<<7 | 0x0E, + 30944 - 19968: jis0212<<14 | 0x2F<<7 | 0x0F, + 30945 - 19968: jis0212<<14 | 0x2F<<7 | 0x10, + 30948 - 19968: jis0212<<14 | 0x2F<<7 | 0x0C, + 30950 - 19968: jis0212<<14 | 0x2F<<7 | 0x11, + 30951 - 19968: jis0208<<14 | 0x42<<7 | 0x00, + 30952 - 19968: jis0208<<14 | 0x2A<<7 | 0x40, + 30954 - 19968: jis0212<<14 | 0x2F<<7 | 0x12, + 30956 - 19968: jis0208<<14 | 0x41<<7 | 0x5D, + 30959 - 19968: jis0208<<14 | 0x0F<<7 | 0x4A, + 30962 - 19968: jis0212<<14 | 0x2F<<7 | 0x13, + 30963 - 19968: jis0212<<14 | 0x2F<<7 | 0x14, + 30964 - 19968: jis0208<<14 | 0x42<<7 | 0x03, + 30966 - 19968: jis0212<<14 | 0x2F<<7 | 0x16, + 30967 - 19968: jis0212<<14 | 0x2F<<7 | 0x17, + 30970 - 19968: jis0212<<14 | 0x2F<<7 | 0x18, + 30971 - 19968: jis0212<<14 | 0x2F<<7 | 0x19, + 30973 - 19968: jis0208<<14 | 0x42<<7 | 0x02, + 30975 - 19968: jis0212<<14 | 0x2F<<7 | 0x1A, + 30976 - 19968: jis0212<<14 | 0x2F<<7 | 0x15, + 30977 - 19968: jis0208<<14 | 0x1D<<7 | 0x2B, + 30982 - 19968: jis0212<<14 | 0x2F<<7 | 0x1B, + 30983 - 19968: jis0208<<14 | 0x42<<7 | 0x04, + 30988 - 19968: jis0212<<14 | 0x2F<<7 | 0x1C, + 30990 - 19968: jis0208<<14 | 0x20<<7 | 0x22, + 30992 - 19968: jis0212<<14 | 0x2F<<7 | 0x1D, + 30993 - 19968: jis0208<<14 | 0x42<<7 | 0x06, + 30994 - 19968: jis0208<<14 | 0x42<<7 | 0x05, + 31001 - 19968: jis0208<<14 | 0x42<<7 | 0x07, + 31002 - 19968: jis0212<<14 | 0x2F<<7 | 0x1E, + 31004 - 19968: jis0212<<14 | 0x2F<<7 | 0x1F, + 31006 - 19968: jis0212<<14 | 0x2F<<7 | 0x20, + 31007 - 19968: jis0212<<14 | 0x2F<<7 | 0x21, + 31008 - 19968: jis0212<<14 | 0x2F<<7 | 0x22, + 31013 - 19968: jis0212<<14 | 0x2F<<7 | 0x23, + 31014 - 19968: jis0208<<14 | 0x41<<7 | 0x47, + 31015 - 19968: jis0212<<14 | 0x2F<<7 | 0x24, + 31017 - 19968: jis0212<<14 | 0x2F<<7 | 0x25, + 31018 - 19968: jis0208<<14 | 0x41<<7 | 0x49, + 31019 - 19968: jis0208<<14 | 0x42<<7 | 0x09, + 31020 - 19968: jis0208<<14 | 0x42<<7 | 0x08, + 31021 - 19968: jis0212<<14 | 0x2F<<7 | 0x26, + 31024 - 19968: jis0208<<14 | 0x5A<<7 | 0x20, + 31025 - 19968: jis0212<<14 | 0x2F<<7 | 0x27, + 31028 - 19968: jis0212<<14 | 0x2F<<7 | 0x28, + 31029 - 19968: jis0212<<14 | 0x2F<<7 | 0x29, + 31034 - 19968: jis0208<<14 | 0x1B<<7 | 0x07, + 31035 - 19968: jis0212<<14 | 0x2F<<7 | 0x2A, + 31036 - 19968: jis0208<<14 | 0x2D<<7 | 0x48, + 31037 - 19968: jis0212<<14 | 0x2F<<7 | 0x2B, + 31038 - 19968: jis0208<<14 | 0x1B<<7 | 0x31, + 31039 - 19968: jis0212<<14 | 0x2F<<7 | 0x2C, + 31040 - 19968: jis0208<<14 | 0x42<<7 | 0x0A, + 31041 - 19968: jis0208<<14 | 0x16<<7 | 0x16, + 31044 - 19968: jis0212<<14 | 0x2F<<7 | 0x2D, + 31045 - 19968: jis0212<<14 | 0x2F<<7 | 0x2E, + 31046 - 19968: jis0212<<14 | 0x2F<<7 | 0x2F, + 31047 - 19968: jis0208<<14 | 0x14<<7 | 0x1F, + 31048 - 19968: jis0208<<14 | 0x14<<7 | 0x06, + 31049 - 19968: jis0208<<14 | 0x1A<<7 | 0x42, + 31050 - 19968: jis0212<<14 | 0x2F<<7 | 0x30, + 31051 - 19968: jis0212<<14 | 0x2F<<7 | 0x31, + 31055 - 19968: jis0212<<14 | 0x2F<<7 | 0x32, + 31056 - 19968: jis0208<<14 | 0x2C<<7 | 0x13, + 31057 - 19968: jis0212<<14 | 0x2F<<7 | 0x33, + 31059 - 19968: jis0208<<14 | 0x42<<7 | 0x10, + 31060 - 19968: jis0212<<14 | 0x2F<<7 | 0x34, + 31061 - 19968: jis0208<<14 | 0x42<<7 | 0x0F, + 31062 - 19968: jis0208<<14 | 0x20<<7 | 0x23, + 31063 - 19968: jis0208<<14 | 0x42<<7 | 0x0C, + 31064 - 19968: jis0212<<14 | 0x2F<<7 | 0x35, + 31066 - 19968: jis0208<<14 | 0x42<<7 | 0x0E, + 31067 - 19968: jis0212<<14 | 0x2F<<7 | 0x36, + 31068 - 19968: jis0212<<14 | 0x2F<<7 | 0x37, + 31069 - 19968: jis0208<<14 | 0x1C<<7 | 0x2A, + 31070 - 19968: jis0208<<14 | 0x1E<<7 | 0x1F, + 31071 - 19968: jis0208<<14 | 0x42<<7 | 0x0D, + 31072 - 19968: jis0208<<14 | 0x42<<7 | 0x0B, + 31074 - 19968: jis0208<<14 | 0x26<<7 | 0x09, + 31077 - 19968: jis0208<<14 | 0x1D<<7 | 0x2C, + 31079 - 19968: jis0212<<14 | 0x2F<<7 | 0x38, + 31080 - 19968: jis0208<<14 | 0x28<<7 | 0x1B, + 31081 - 19968: jis0212<<14 | 0x2F<<7 | 0x39, + 31083 - 19968: jis0212<<14 | 0x2F<<7 | 0x3A, + 31085 - 19968: jis0208<<14 | 0x19<<7 | 0x36, + 31090 - 19968: jis0212<<14 | 0x2F<<7 | 0x3B, + 31095 - 19968: jis0208<<14 | 0x24<<7 | 0x57, + 31097 - 19968: jis0212<<14 | 0x2F<<7 | 0x3C, + 31098 - 19968: jis0208<<14 | 0x42<<7 | 0x11, + 31099 - 19968: jis0212<<14 | 0x2F<<7 | 0x3D, + 31100 - 19968: jis0212<<14 | 0x2F<<7 | 0x3E, + 31102 - 19968: jis0212<<14 | 0x2F<<7 | 0x3F, + 31103 - 19968: jis0208<<14 | 0x42<<7 | 0x12, + 31104 - 19968: jis0208<<14 | 0x42<<7 | 0x28, + 31105 - 19968: jis0208<<14 | 0x15<<7 | 0x37, + 31108 - 19968: jis0208<<14 | 0x2E<<7 | 0x1C, + 31109 - 19968: jis0208<<14 | 0x20<<7 | 0x14, + 31114 - 19968: jis0208<<14 | 0x42<<7 | 0x13, + 31115 - 19968: jis0212<<14 | 0x2F<<7 | 0x40, + 31116 - 19968: jis0212<<14 | 0x2F<<7 | 0x41, + 31117 - 19968: jis0208<<14 | 0x11<<7 | 0x31, + 31118 - 19968: jis0208<<14 | 0x23<<7 | 0x56, + 31119 - 19968: jis0208<<14 | 0x29<<7 | 0x00, + 31121 - 19968: jis0212<<14 | 0x2F<<7 | 0x42, + 31123 - 19968: jis0212<<14 | 0x2F<<7 | 0x43, + 31124 - 19968: jis0208<<14 | 0x5A<<7 | 0x24, + 31125 - 19968: jis0212<<14 | 0x2F<<7 | 0x45, + 31126 - 19968: jis0212<<14 | 0x2F<<7 | 0x46, + 31128 - 19968: jis0212<<14 | 0x2F<<7 | 0x47, + 31131 - 19968: jis0208<<14 | 0x5A<<7 | 0x26, + 31132 - 19968: jis0212<<14 | 0x2F<<7 | 0x49, + 31133 - 19968: jis0208<<14 | 0x42<<7 | 0x14, + 31137 - 19968: jis0212<<14 | 0x2F<<7 | 0x4A, + 31142 - 19968: jis0208<<14 | 0x14<<7 | 0x59, + 31143 - 19968: jis0208<<14 | 0x42<<7 | 0x15, + 31144 - 19968: jis0212<<14 | 0x2F<<7 | 0x4B, + 31145 - 19968: jis0212<<14 | 0x2F<<7 | 0x4C, + 31146 - 19968: jis0208<<14 | 0x42<<7 | 0x17, + 31147 - 19968: jis0212<<14 | 0x2F<<7 | 0x4D, + 31150 - 19968: jis0208<<14 | 0x42<<7 | 0x18, + 31151 - 19968: jis0212<<14 | 0x2F<<7 | 0x4E, + 31152 - 19968: jis0208<<14 | 0x26<<7 | 0x08, + 31153 - 19968: jis0212<<14 | 0x2F<<7 | 0x4F, + 31155 - 19968: jis0208<<14 | 0x42<<7 | 0x19, + 31156 - 19968: jis0212<<14 | 0x2F<<7 | 0x50, + 31160 - 19968: jis0212<<14 | 0x2F<<7 | 0x51, + 31161 - 19968: jis0208<<14 | 0x42<<7 | 0x1A, + 31162 - 19968: jis0208<<14 | 0x42<<7 | 0x1B, + 31163 - 19968: jis0212<<14 | 0x2F<<7 | 0x52, + 31165 - 19968: jis0208<<14 | 0x15<<7 | 0x38, + 31166 - 19968: jis0208<<14 | 0x11<<7 | 0x32, + 31167 - 19968: jis0208<<14 | 0x25<<7 | 0x24, + 31168 - 19968: jis0208<<14 | 0x1C<<7 | 0x07, + 31169 - 19968: jis0208<<14 | 0x1A<<7 | 0x43, + 31170 - 19968: jis0212<<14 | 0x2F<<7 | 0x53, + 31172 - 19968: jis0212<<14 | 0x2F<<7 | 0x54, + 31175 - 19968: jis0212<<14 | 0x2F<<7 | 0x55, + 31176 - 19968: jis0212<<14 | 0x2F<<7 | 0x56, + 31177 - 19968: jis0208<<14 | 0x42<<7 | 0x1C, + 31178 - 19968: jis0212<<14 | 0x2F<<7 | 0x57, + 31179 - 19968: jis0208<<14 | 0x1C<<7 | 0x08, + 31183 - 19968: jis0212<<14 | 0x2F<<7 | 0x58, + 31185 - 19968: jis0208<<14 | 0x11<<7 | 0x29, + 31186 - 19968: jis0208<<14 | 0x28<<7 | 0x22, + 31188 - 19968: jis0212<<14 | 0x2F<<7 | 0x59, + 31189 - 19968: jis0208<<14 | 0x42<<7 | 0x1D, + 31190 - 19968: jis0212<<14 | 0x2F<<7 | 0x5A, + 31192 - 19968: jis0208<<14 | 0x27<<7 | 0x4A, + 31194 - 19968: jis0212<<14 | 0x2F<<7 | 0x5B, + 31197 - 19968: jis0212<<14 | 0x2F<<7 | 0x5C, + 31198 - 19968: jis0212<<14 | 0x2F<<7 | 0x5D, + 31199 - 19968: jis0208<<14 | 0x20<<7 | 0x24, + 31200 - 19968: jis0212<<14 | 0x30<<7 | 0x00, + 31201 - 19968: jis0208<<14 | 0x42<<7 | 0x20, + 31202 - 19968: jis0212<<14 | 0x30<<7 | 0x01, + 31203 - 19968: jis0208<<14 | 0x42<<7 | 0x21, + 31204 - 19968: jis0208<<14 | 0x26<<7 | 0x48, + 31205 - 19968: jis0212<<14 | 0x30<<7 | 0x02, + 31206 - 19968: jis0208<<14 | 0x1E<<7 | 0x20, + 31207 - 19968: jis0208<<14 | 0x42<<7 | 0x1E, + 31209 - 19968: jis0208<<14 | 0x22<<7 | 0x40, + 31210 - 19968: jis0212<<14 | 0x30<<7 | 0x03, + 31211 - 19968: jis0212<<14 | 0x30<<7 | 0x04, + 31212 - 19968: jis0208<<14 | 0x42<<7 | 0x1F, + 31213 - 19968: jis0212<<14 | 0x30<<7 | 0x05, + 31216 - 19968: jis0208<<14 | 0x1D<<7 | 0x2D, + 31217 - 19968: jis0212<<14 | 0x30<<7 | 0x06, + 31224 - 19968: jis0212<<14 | 0x30<<7 | 0x07, + 31227 - 19968: jis0208<<14 | 0x0F<<7 | 0x3B, + 31228 - 19968: jis0212<<14 | 0x30<<7 | 0x08, + 31232 - 19968: jis0208<<14 | 0x14<<7 | 0x08, + 31234 - 19968: jis0212<<14 | 0x30<<7 | 0x09, + 31235 - 19968: jis0212<<14 | 0x30<<7 | 0x0A, + 31239 - 19968: jis0212<<14 | 0x30<<7 | 0x0B, + 31240 - 19968: jis0208<<14 | 0x42<<7 | 0x22, + 31241 - 19968: jis0212<<14 | 0x30<<7 | 0x0C, + 31242 - 19968: jis0212<<14 | 0x30<<7 | 0x0D, + 31243 - 19968: jis0208<<14 | 0x23<<7 | 0x57, + 31244 - 19968: jis0212<<14 | 0x30<<7 | 0x0E, + 31245 - 19968: jis0208<<14 | 0x42<<7 | 0x23, + 31246 - 19968: jis0208<<14 | 0x1F<<7 | 0x26, + 31249 - 19968: jis0212<<14 | 0x30<<7 | 0x0F, + 31252 - 19968: jis0208<<14 | 0x2B<<7 | 0x0C, + 31253 - 19968: jis0212<<14 | 0x30<<7 | 0x10, + 31255 - 19968: jis0208<<14 | 0x28<<7 | 0x02, + 31256 - 19968: jis0208<<14 | 0x42<<7 | 0x24, + 31257 - 19968: jis0208<<14 | 0x42<<7 | 0x25, + 31258 - 19968: jis0208<<14 | 0x22<<7 | 0x34, + 31259 - 19968: jis0212<<14 | 0x30<<7 | 0x11, + 31260 - 19968: jis0208<<14 | 0x2D<<7 | 0x26, + 31262 - 19968: jis0212<<14 | 0x30<<7 | 0x12, + 31263 - 19968: jis0208<<14 | 0x42<<7 | 0x27, + 31264 - 19968: jis0208<<14 | 0x42<<7 | 0x26, + 31265 - 19968: jis0212<<14 | 0x30<<7 | 0x13, + 31271 - 19968: jis0212<<14 | 0x30<<7 | 0x14, + 31275 - 19968: jis0212<<14 | 0x30<<7 | 0x15, + 31277 - 19968: jis0212<<14 | 0x30<<7 | 0x16, + 31278 - 19968: jis0208<<14 | 0x1B<<7 | 0x4E, + 31279 - 19968: jis0212<<14 | 0x30<<7 | 0x17, + 31280 - 19968: jis0212<<14 | 0x30<<7 | 0x18, + 31281 - 19968: jis0208<<14 | 0x42<<7 | 0x29, + 31282 - 19968: jis0208<<14 | 0x0F<<7 | 0x4F, + 31284 - 19968: jis0212<<14 | 0x30<<7 | 0x19, + 31285 - 19968: jis0212<<14 | 0x30<<7 | 0x1A, + 31287 - 19968: jis0208<<14 | 0x42<<7 | 0x2C, + 31288 - 19968: jis0212<<14 | 0x30<<7 | 0x1B, + 31289 - 19968: jis0212<<14 | 0x30<<7 | 0x1C, + 31290 - 19968: jis0212<<14 | 0x30<<7 | 0x1D, + 31291 - 19968: jis0208<<14 | 0x42<<7 | 0x2A, + 31292 - 19968: jis0208<<14 | 0x11<<7 | 0x33, + 31293 - 19968: jis0208<<14 | 0x16<<7 | 0x2D, + 31294 - 19968: jis0208<<14 | 0x42<<7 | 0x2B, + 31295 - 19968: jis0208<<14 | 0x18<<7 | 0x25, + 31296 - 19968: jis0208<<14 | 0x18<<7 | 0x51, + 31298 - 19968: jis0208<<14 | 0x29<<7 | 0x45, + 31299 - 19968: jis0208<<14 | 0x42<<7 | 0x2D, + 31300 - 19968: jis0212<<14 | 0x30<<7 | 0x1E, + 31301 - 19968: jis0212<<14 | 0x30<<7 | 0x1F, + 31302 - 19968: jis0208<<14 | 0x2A<<7 | 0x33, + 31303 - 19968: jis0212<<14 | 0x30<<7 | 0x20, + 31304 - 19968: jis0212<<14 | 0x30<<7 | 0x21, + 31305 - 19968: jis0208<<14 | 0x42<<7 | 0x2F, + 31308 - 19968: jis0212<<14 | 0x30<<7 | 0x22, + 31309 - 19968: jis0208<<14 | 0x1F<<7 | 0x30, + 31310 - 19968: jis0208<<14 | 0x10<<7 | 0x2E, + 31311 - 19968: jis0208<<14 | 0x11<<7 | 0x19, + 31312 - 19968: jis0208<<14 | 0x0F<<7 | 0x0B, + 31317 - 19968: jis0212<<14 | 0x30<<7 | 0x23, + 31318 - 19968: jis0212<<14 | 0x30<<7 | 0x24, + 31319 - 19968: jis0208<<14 | 0x42<<7 | 0x2E, + 31321 - 19968: jis0212<<14 | 0x30<<7 | 0x25, + 31324 - 19968: jis0212<<14 | 0x30<<7 | 0x26, + 31325 - 19968: jis0212<<14 | 0x30<<7 | 0x27, + 31327 - 19968: jis0212<<14 | 0x30<<7 | 0x28, + 31328 - 19968: jis0212<<14 | 0x30<<7 | 0x29, + 31329 - 19968: jis0208<<14 | 0x42<<7 | 0x30, + 31330 - 19968: jis0208<<14 | 0x42<<7 | 0x31, + 31331 - 19968: jis0208<<14 | 0x1D<<7 | 0x56, + 31333 - 19968: jis0212<<14 | 0x30<<7 | 0x2A, + 31335 - 19968: jis0212<<14 | 0x30<<7 | 0x2B, + 31337 - 19968: jis0208<<14 | 0x42<<7 | 0x32, + 31338 - 19968: jis0212<<14 | 0x30<<7 | 0x2C, + 31339 - 19968: jis0208<<14 | 0x12<<7 | 0x2E, + 31341 - 19968: jis0212<<14 | 0x30<<7 | 0x2D, + 31344 - 19968: jis0208<<14 | 0x42<<7 | 0x34, + 31348 - 19968: jis0208<<14 | 0x16<<7 | 0x49, + 31349 - 19968: jis0212<<14 | 0x30<<7 | 0x2E, + 31350 - 19968: jis0208<<14 | 0x14<<7 | 0x45, + 31352 - 19968: jis0212<<14 | 0x30<<7 | 0x2F, + 31353 - 19968: jis0208<<14 | 0x42<<7 | 0x35, + 31354 - 19968: jis0208<<14 | 0x15<<7 | 0x54, + 31357 - 19968: jis0208<<14 | 0x42<<7 | 0x36, + 31358 - 19968: jis0212<<14 | 0x30<<7 | 0x30, + 31359 - 19968: jis0208<<14 | 0x1F<<7 | 0x5B, + 31360 - 19968: jis0212<<14 | 0x30<<7 | 0x31, + 31361 - 19968: jis0208<<14 | 0x25<<7 | 0x2C, + 31362 - 19968: jis0212<<14 | 0x30<<7 | 0x32, + 31363 - 19968: jis0208<<14 | 0x1F<<7 | 0x3F, + 31364 - 19968: jis0208<<14 | 0x19<<7 | 0x54, + 31365 - 19968: jis0212<<14 | 0x30<<7 | 0x33, + 31366 - 19968: jis0212<<14 | 0x30<<7 | 0x34, + 31368 - 19968: jis0208<<14 | 0x42<<7 | 0x37, + 31370 - 19968: jis0212<<14 | 0x30<<7 | 0x35, + 31371 - 19968: jis0212<<14 | 0x30<<7 | 0x36, + 31376 - 19968: jis0212<<14 | 0x30<<7 | 0x37, + 31377 - 19968: jis0212<<14 | 0x30<<7 | 0x38, + 31378 - 19968: jis0208<<14 | 0x22<<7 | 0x41, + 31379 - 19968: jis0208<<14 | 0x20<<7 | 0x4A, + 31380 - 19968: jis0212<<14 | 0x30<<7 | 0x39, + 31381 - 19968: jis0208<<14 | 0x42<<7 | 0x39, + 31382 - 19968: jis0208<<14 | 0x42<<7 | 0x3B, + 31383 - 19968: jis0208<<14 | 0x42<<7 | 0x38, + 31384 - 19968: jis0208<<14 | 0x42<<7 | 0x3A, + 31390 - 19968: jis0212<<14 | 0x30<<7 | 0x3A, + 31391 - 19968: jis0208<<14 | 0x16<<7 | 0x01, + 31392 - 19968: jis0212<<14 | 0x30<<7 | 0x3B, + 31395 - 19968: jis0212<<14 | 0x30<<7 | 0x3C, + 31401 - 19968: jis0208<<14 | 0x42<<7 | 0x3C, + 31402 - 19968: jis0208<<14 | 0x16<<7 | 0x05, + 31404 - 19968: jis0212<<14 | 0x30<<7 | 0x3D, + 31406 - 19968: jis0208<<14 | 0x14<<7 | 0x46, + 31407 - 19968: jis0208<<14 | 0x2C<<7 | 0x31, + 31408 - 19968: jis0208<<14 | 0x42<<7 | 0x3E, + 31411 - 19968: jis0212<<14 | 0x30<<7 | 0x3E, + 31413 - 19968: jis0212<<14 | 0x30<<7 | 0x3F, + 31414 - 19968: jis0208<<14 | 0x42<<7 | 0x3F, + 31417 - 19968: jis0212<<14 | 0x30<<7 | 0x40, + 31418 - 19968: jis0208<<14 | 0x10<<7 | 0x0D, + 31419 - 19968: jis0212<<14 | 0x30<<7 | 0x41, + 31420 - 19968: jis0212<<14 | 0x30<<7 | 0x42, + 31423 - 19968: jis0208<<14 | 0x42<<7 | 0x42, + 31427 - 19968: jis0208<<14 | 0x12<<7 | 0x55, + 31428 - 19968: jis0208<<14 | 0x42<<7 | 0x41, + 31429 - 19968: jis0208<<14 | 0x42<<7 | 0x40, + 31430 - 19968: jis0212<<14 | 0x30<<7 | 0x43, + 31431 - 19968: jis0208<<14 | 0x42<<7 | 0x44, + 31432 - 19968: jis0208<<14 | 0x42<<7 | 0x3D, + 31433 - 19968: jis0212<<14 | 0x30<<7 | 0x44, + 31434 - 19968: jis0208<<14 | 0x42<<7 | 0x45, + 31435 - 19968: jis0208<<14 | 0x2D<<7 | 0x08, + 31436 - 19968: jis0212<<14 | 0x30<<7 | 0x45, + 31437 - 19968: jis0208<<14 | 0x42<<7 | 0x46, + 31438 - 19968: jis0212<<14 | 0x30<<7 | 0x46, + 31439 - 19968: jis0208<<14 | 0x42<<7 | 0x47, + 31441 - 19968: jis0208<<14 | 0x5A<<7 | 0x27, + 31442 - 19968: jis0208<<14 | 0x33<<7 | 0x53, + 31443 - 19968: jis0208<<14 | 0x42<<7 | 0x49, + 31445 - 19968: jis0208<<14 | 0x42<<7 | 0x48, + 31449 - 19968: jis0208<<14 | 0x42<<7 | 0x4A, + 31450 - 19968: jis0208<<14 | 0x42<<7 | 0x4B, + 31451 - 19968: jis0212<<14 | 0x30<<7 | 0x48, + 31452 - 19968: jis0208<<14 | 0x2D<<7 | 0x14, + 31453 - 19968: jis0208<<14 | 0x42<<7 | 0x4C, + 31455 - 19968: jis0208<<14 | 0x4F<<7 | 0x4E, + 31456 - 19968: jis0208<<14 | 0x1D<<7 | 0x2E, + 31457 - 19968: jis0208<<14 | 0x42<<7 | 0x4D, + 31458 - 19968: jis0208<<14 | 0x42<<7 | 0x4E, + 31459 - 19968: jis0208<<14 | 0x1C<<7 | 0x36, + 31461 - 19968: jis0208<<14 | 0x25<<7 | 0x17, + 31462 - 19968: jis0208<<14 | 0x42<<7 | 0x4F, + 31463 - 19968: jis0208<<14 | 0x5A<<7 | 0x28, + 31464 - 19968: jis0212<<14 | 0x30<<7 | 0x49, + 31465 - 19968: jis0212<<14 | 0x30<<7 | 0x4A, + 31466 - 19968: jis0208<<14 | 0x22<<7 | 0x07, + 31467 - 19968: jis0208<<14 | 0x5A<<7 | 0x2A, + 31468 - 19968: jis0212<<14 | 0x30<<7 | 0x4C, + 31469 - 19968: jis0208<<14 | 0x42<<7 | 0x50, + 31471 - 19968: jis0208<<14 | 0x22<<7 | 0x1B, + 31472 - 19968: jis0208<<14 | 0x42<<7 | 0x51, + 31473 - 19968: jis0212<<14 | 0x30<<7 | 0x4D, + 31476 - 19968: jis0212<<14 | 0x30<<7 | 0x4E, + 31478 - 19968: jis0208<<14 | 0x15<<7 | 0x04, + 31480 - 19968: jis0208<<14 | 0x30<<7 | 0x1E, + 31481 - 19968: jis0208<<14 | 0x22<<7 | 0x3C, + 31482 - 19968: jis0208<<14 | 0x1B<<7 | 0x12, + 31483 - 19968: jis0212<<14 | 0x30<<7 | 0x4F, + 31485 - 19968: jis0212<<14 | 0x30<<7 | 0x50, + 31486 - 19968: jis0212<<14 | 0x30<<7 | 0x51, + 31487 - 19968: jis0208<<14 | 0x13<<7 | 0x27, + 31490 - 19968: jis0208<<14 | 0x42<<7 | 0x52, + 31492 - 19968: jis0208<<14 | 0x43<<7 | 0x01, + 31494 - 19968: jis0208<<14 | 0x42<<7 | 0x55, + 31495 - 19968: jis0212<<14 | 0x30<<7 | 0x52, + 31496 - 19968: jis0208<<14 | 0x14<<7 | 0x47, + 31498 - 19968: jis0208<<14 | 0x42<<7 | 0x54, + 31499 - 19968: jis0208<<14 | 0x43<<7 | 0x03, + 31503 - 19968: jis0208<<14 | 0x42<<7 | 0x53, + 31505 - 19968: jis0208<<14 | 0x1D<<7 | 0x2F, + 31508 - 19968: jis0212<<14 | 0x30<<7 | 0x53, + 31512 - 19968: jis0208<<14 | 0x42<<7 | 0x57, + 31513 - 19968: jis0208<<14 | 0x42<<7 | 0x58, + 31515 - 19968: jis0208<<14 | 0x24<<7 | 0x0A, + 31518 - 19968: jis0208<<14 | 0x42<<7 | 0x59, + 31519 - 19968: jis0212<<14 | 0x30<<7 | 0x54, + 31520 - 19968: jis0208<<14 | 0x12<<7 | 0x3D, + 31523 - 19968: jis0212<<14 | 0x30<<7 | 0x55, + 31525 - 19968: jis0208<<14 | 0x1E<<7 | 0x39, + 31526 - 19968: jis0208<<14 | 0x28<<7 | 0x43, + 31527 - 19968: jis0212<<14 | 0x30<<7 | 0x56, + 31528 - 19968: jis0208<<14 | 0x42<<7 | 0x5B, + 31529 - 19968: jis0212<<14 | 0x30<<7 | 0x57, + 31530 - 19968: jis0212<<14 | 0x30<<7 | 0x58, + 31531 - 19968: jis0212<<14 | 0x30<<7 | 0x59, + 31532 - 19968: jis0208<<14 | 0x21<<7 | 0x47, + 31533 - 19968: jis0212<<14 | 0x30<<7 | 0x5A, + 31534 - 19968: jis0212<<14 | 0x30<<7 | 0x5B, + 31535 - 19968: jis0212<<14 | 0x30<<7 | 0x5C, + 31536 - 19968: jis0212<<14 | 0x30<<7 | 0x5D, + 31537 - 19968: jis0212<<14 | 0x31<<7 | 0x00, + 31539 - 19968: jis0208<<14 | 0x42<<7 | 0x56, + 31540 - 19968: jis0212<<14 | 0x31<<7 | 0x01, + 31541 - 19968: jis0208<<14 | 0x42<<7 | 0x5A, + 31542 - 19968: jis0208<<14 | 0x42<<7 | 0x5C, + 31545 - 19968: jis0208<<14 | 0x19<<7 | 0x5A, + 31549 - 19968: jis0212<<14 | 0x31<<7 | 0x02, + 31551 - 19968: jis0212<<14 | 0x31<<7 | 0x03, + 31552 - 19968: jis0212<<14 | 0x31<<7 | 0x04, + 31553 - 19968: jis0212<<14 | 0x31<<7 | 0x05, + 31557 - 19968: jis0208<<14 | 0x43<<7 | 0x05, + 31558 - 19968: jis0208<<14 | 0x28<<7 | 0x0D, + 31559 - 19968: jis0212<<14 | 0x31<<7 | 0x06, + 31560 - 19968: jis0208<<14 | 0x27<<7 | 0x05, + 31561 - 19968: jis0208<<14 | 0x24<<7 | 0x58, + 31563 - 19968: jis0208<<14 | 0x15<<7 | 0x39, + 31564 - 19968: jis0208<<14 | 0x43<<7 | 0x04, + 31565 - 19968: jis0208<<14 | 0x43<<7 | 0x02, + 31566 - 19968: jis0212<<14 | 0x31<<7 | 0x07, + 31567 - 19968: jis0208<<14 | 0x27<<7 | 0x14, + 31568 - 19968: jis0208<<14 | 0x42<<7 | 0x5D, + 31569 - 19968: jis0208<<14 | 0x22<<7 | 0x3D, + 31570 - 19968: jis0208<<14 | 0x24<<7 | 0x5A, + 31572 - 19968: jis0208<<14 | 0x24<<7 | 0x59, + 31573 - 19968: jis0212<<14 | 0x31<<7 | 0x08, + 31574 - 19968: jis0208<<14 | 0x19<<7 | 0x55, + 31581 - 19968: jis0208<<14 | 0x43<<7 | 0x17, + 31584 - 19968: jis0212<<14 | 0x31<<7 | 0x09, + 31588 - 19968: jis0212<<14 | 0x31<<7 | 0x0A, + 31589 - 19968: jis0208<<14 | 0x43<<7 | 0x07, + 31590 - 19968: jis0212<<14 | 0x31<<7 | 0x0B, + 31591 - 19968: jis0208<<14 | 0x43<<7 | 0x09, + 31593 - 19968: jis0212<<14 | 0x31<<7 | 0x0C, + 31594 - 19968: jis0212<<14 | 0x31<<7 | 0x0D, + 31596 - 19968: jis0208<<14 | 0x43<<7 | 0x0C, + 31597 - 19968: jis0212<<14 | 0x31<<7 | 0x0E, + 31598 - 19968: jis0208<<14 | 0x43<<7 | 0x0D, + 31599 - 19968: jis0212<<14 | 0x31<<7 | 0x0F, + 31600 - 19968: jis0208<<14 | 0x43<<7 | 0x0A, + 31601 - 19968: jis0208<<14 | 0x43<<7 | 0x0B, + 31602 - 19968: jis0212<<14 | 0x31<<7 | 0x10, + 31603 - 19968: jis0212<<14 | 0x31<<7 | 0x11, + 31604 - 19968: jis0208<<14 | 0x43<<7 | 0x08, + 31605 - 19968: jis0208<<14 | 0x43<<7 | 0x06, + 31607 - 19968: jis0212<<14 | 0x31<<7 | 0x12, + 31610 - 19968: jis0208<<14 | 0x43<<7 | 0x00, + 31620 - 19968: jis0212<<14 | 0x31<<7 | 0x13, + 31622 - 19968: jis0208<<14 | 0x29<<7 | 0x2E, + 31623 - 19968: jis0208<<14 | 0x11<<7 | 0x34, + 31625 - 19968: jis0212<<14 | 0x31<<7 | 0x14, + 31627 - 19968: jis0208<<14 | 0x43<<7 | 0x14, + 31629 - 19968: jis0208<<14 | 0x43<<7 | 0x11, + 31630 - 19968: jis0212<<14 | 0x31<<7 | 0x15, + 31631 - 19968: jis0208<<14 | 0x43<<7 | 0x16, + 31632 - 19968: jis0212<<14 | 0x31<<7 | 0x16, + 31633 - 19968: jis0212<<14 | 0x31<<7 | 0x17, + 31634 - 19968: jis0208<<14 | 0x43<<7 | 0x15, + 31636 - 19968: jis0208<<14 | 0x26<<7 | 0x52, + 31637 - 19968: jis0208<<14 | 0x2B<<7 | 0x06, + 31638 - 19968: jis0212<<14 | 0x31<<7 | 0x18, + 31639 - 19968: jis0208<<14 | 0x1A<<7 | 0x1A, + 31640 - 19968: jis0208<<14 | 0x43<<7 | 0x0F, + 31641 - 19968: jis0208<<14 | 0x43<<7 | 0x18, + 31642 - 19968: jis0208<<14 | 0x43<<7 | 0x13, + 31643 - 19968: jis0212<<14 | 0x31<<7 | 0x19, + 31644 - 19968: jis0208<<14 | 0x43<<7 | 0x12, + 31645 - 19968: jis0208<<14 | 0x43<<7 | 0x0E, + 31646 - 19968: jis0208<<14 | 0x5A<<7 | 0x2B, + 31647 - 19968: jis0208<<14 | 0x43<<7 | 0x10, + 31648 - 19968: jis0212<<14 | 0x31<<7 | 0x1B, + 31649 - 19968: jis0208<<14 | 0x13<<7 | 0x28, + 31653 - 19968: jis0212<<14 | 0x31<<7 | 0x1C, + 31658 - 19968: jis0208<<14 | 0x22<<7 | 0x1C, + 31660 - 19968: jis0212<<14 | 0x31<<7 | 0x1D, + 31661 - 19968: jis0208<<14 | 0x1F<<7 | 0x5C, + 31663 - 19968: jis0212<<14 | 0x31<<7 | 0x1E, + 31664 - 19968: jis0212<<14 | 0x31<<7 | 0x1F, + 31665 - 19968: jis0208<<14 | 0x27<<7 | 0x01, + 31666 - 19968: jis0212<<14 | 0x31<<7 | 0x20, + 31668 - 19968: jis0208<<14 | 0x43<<7 | 0x1D, + 31669 - 19968: jis0212<<14 | 0x31<<7 | 0x21, + 31670 - 19968: jis0212<<14 | 0x31<<7 | 0x22, + 31672 - 19968: jis0208<<14 | 0x27<<7 | 0x03, + 31674 - 19968: jis0212<<14 | 0x31<<7 | 0x23, + 31675 - 19968: jis0212<<14 | 0x31<<7 | 0x24, + 31676 - 19968: jis0212<<14 | 0x31<<7 | 0x25, + 31677 - 19968: jis0212<<14 | 0x31<<7 | 0x26, + 31680 - 19968: jis0208<<14 | 0x1F<<7 | 0x40, + 31681 - 19968: jis0208<<14 | 0x43<<7 | 0x1A, + 31682 - 19968: jis0212<<14 | 0x31<<7 | 0x27, + 31684 - 19968: jis0208<<14 | 0x27<<7 | 0x2E, + 31685 - 19968: jis0212<<14 | 0x31<<7 | 0x28, + 31686 - 19968: jis0208<<14 | 0x43<<7 | 0x1E, + 31687 - 19968: jis0208<<14 | 0x29<<7 | 0x32, + 31688 - 19968: jis0212<<14 | 0x31<<7 | 0x29, + 31689 - 19968: jis0208<<14 | 0x22<<7 | 0x3A, + 31690 - 19968: jis0212<<14 | 0x31<<7 | 0x2A, + 31691 - 19968: jis0208<<14 | 0x43<<7 | 0x19, + 31692 - 19968: jis0208<<14 | 0x43<<7 | 0x1B, + 31695 - 19968: jis0208<<14 | 0x43<<7 | 0x1C, + 31700 - 19968: jis0212<<14 | 0x31<<7 | 0x2B, + 31702 - 19968: jis0212<<14 | 0x31<<7 | 0x2C, + 31703 - 19968: jis0212<<14 | 0x31<<7 | 0x2D, + 31705 - 19968: jis0212<<14 | 0x31<<7 | 0x2E, + 31706 - 19968: jis0212<<14 | 0x31<<7 | 0x2F, + 31707 - 19968: jis0212<<14 | 0x31<<7 | 0x30, + 31709 - 19968: jis0208<<14 | 0x43<<7 | 0x1F, + 31712 - 19968: jis0208<<14 | 0x1B<<7 | 0x23, + 31716 - 19968: jis0208<<14 | 0x25<<7 | 0x25, + 31717 - 19968: jis0208<<14 | 0x43<<7 | 0x24, + 31718 - 19968: jis0208<<14 | 0x43<<7 | 0x23, + 31720 - 19968: jis0212<<14 | 0x31<<7 | 0x31, + 31721 - 19968: jis0208<<14 | 0x43<<7 | 0x20, + 31722 - 19968: jis0212<<14 | 0x31<<7 | 0x32, + 31725 - 19968: jis0208<<14 | 0x2E<<7 | 0x15, + 31730 - 19968: jis0212<<14 | 0x31<<7 | 0x33, + 31731 - 19968: jis0208<<14 | 0x43<<7 | 0x29, + 31732 - 19968: jis0212<<14 | 0x31<<7 | 0x34, + 31733 - 19968: jis0212<<14 | 0x31<<7 | 0x35, + 31734 - 19968: jis0208<<14 | 0x43<<7 | 0x2D, + 31735 - 19968: jis0208<<14 | 0x43<<7 | 0x2A, + 31736 - 19968: jis0212<<14 | 0x31<<7 | 0x36, + 31737 - 19968: jis0212<<14 | 0x31<<7 | 0x37, + 31738 - 19968: jis0212<<14 | 0x31<<7 | 0x38, + 31740 - 19968: jis0212<<14 | 0x31<<7 | 0x39, + 31742 - 19968: jis0212<<14 | 0x31<<7 | 0x3A, + 31744 - 19968: jis0208<<14 | 0x43<<7 | 0x26, + 31745 - 19968: jis0212<<14 | 0x31<<7 | 0x3B, + 31746 - 19968: jis0212<<14 | 0x31<<7 | 0x3C, + 31747 - 19968: jis0212<<14 | 0x31<<7 | 0x3D, + 31748 - 19968: jis0212<<14 | 0x31<<7 | 0x3E, + 31750 - 19968: jis0212<<14 | 0x31<<7 | 0x3F, + 31751 - 19968: jis0208<<14 | 0x43<<7 | 0x27, + 31753 - 19968: jis0212<<14 | 0x31<<7 | 0x40, + 31755 - 19968: jis0212<<14 | 0x31<<7 | 0x41, + 31756 - 19968: jis0212<<14 | 0x31<<7 | 0x42, + 31757 - 19968: jis0208<<14 | 0x43<<7 | 0x2C, + 31758 - 19968: jis0212<<14 | 0x31<<7 | 0x43, + 31759 - 19968: jis0212<<14 | 0x31<<7 | 0x44, + 31761 - 19968: jis0208<<14 | 0x43<<7 | 0x21, + 31762 - 19968: jis0208<<14 | 0x31<<7 | 0x34, + 31763 - 19968: jis0208<<14 | 0x43<<7 | 0x28, + 31764 - 19968: jis0208<<14 | 0x43<<7 | 0x22, + 31767 - 19968: jis0208<<14 | 0x43<<7 | 0x2B, + 31769 - 19968: jis0212<<14 | 0x31<<7 | 0x45, + 31771 - 19968: jis0212<<14 | 0x31<<7 | 0x46, + 31775 - 19968: jis0208<<14 | 0x43<<7 | 0x31, + 31776 - 19968: jis0212<<14 | 0x31<<7 | 0x47, + 31777 - 19968: jis0208<<14 | 0x13<<7 | 0x29, + 31779 - 19968: jis0208<<14 | 0x43<<7 | 0x2E, + 31781 - 19968: jis0212<<14 | 0x31<<7 | 0x48, + 31782 - 19968: jis0212<<14 | 0x31<<7 | 0x49, + 31783 - 19968: jis0208<<14 | 0x43<<7 | 0x2F, + 31784 - 19968: jis0212<<14 | 0x31<<7 | 0x4A, + 31786 - 19968: jis0208<<14 | 0x43<<7 | 0x30, + 31787 - 19968: jis0208<<14 | 0x43<<7 | 0x33, + 31788 - 19968: jis0212<<14 | 0x31<<7 | 0x4B, + 31793 - 19968: jis0212<<14 | 0x31<<7 | 0x4C, + 31795 - 19968: jis0212<<14 | 0x31<<7 | 0x4D, + 31796 - 19968: jis0212<<14 | 0x31<<7 | 0x4E, + 31798 - 19968: jis0212<<14 | 0x31<<7 | 0x4F, + 31799 - 19968: jis0208<<14 | 0x43<<7 | 0x32, + 31800 - 19968: jis0208<<14 | 0x27<<7 | 0x55, + 31801 - 19968: jis0212<<14 | 0x31<<7 | 0x50, + 31802 - 19968: jis0212<<14 | 0x31<<7 | 0x51, + 31805 - 19968: jis0208<<14 | 0x43<<7 | 0x34, + 31806 - 19968: jis0208<<14 | 0x2D<<7 | 0x5B, + 31807 - 19968: jis0208<<14 | 0x29<<7 | 0x4C, + 31808 - 19968: jis0208<<14 | 0x43<<7 | 0x39, + 31811 - 19968: jis0208<<14 | 0x43<<7 | 0x36, + 31814 - 19968: jis0212<<14 | 0x31<<7 | 0x52, + 31818 - 19968: jis0212<<14 | 0x31<<7 | 0x53, + 31820 - 19968: jis0208<<14 | 0x43<<7 | 0x35, + 31821 - 19968: jis0208<<14 | 0x1F<<7 | 0x31, + 31823 - 19968: jis0208<<14 | 0x43<<7 | 0x38, + 31824 - 19968: jis0208<<14 | 0x43<<7 | 0x3A, + 31825 - 19968: jis0212<<14 | 0x31<<7 | 0x55, + 31826 - 19968: jis0212<<14 | 0x31<<7 | 0x56, + 31827 - 19968: jis0212<<14 | 0x31<<7 | 0x57, + 31828 - 19968: jis0208<<14 | 0x43<<7 | 0x37, + 31829 - 19968: jis0212<<14 | 0x31<<7 | 0x54, + 31830 - 19968: jis0208<<14 | 0x43<<7 | 0x3E, + 31832 - 19968: jis0208<<14 | 0x43<<7 | 0x3B, + 31833 - 19968: jis0212<<14 | 0x31<<7 | 0x58, + 31834 - 19968: jis0212<<14 | 0x31<<7 | 0x59, + 31835 - 19968: jis0212<<14 | 0x31<<7 | 0x5A, + 31836 - 19968: jis0212<<14 | 0x31<<7 | 0x5B, + 31837 - 19968: jis0212<<14 | 0x31<<7 | 0x5C, + 31838 - 19968: jis0212<<14 | 0x31<<7 | 0x5D, + 31839 - 19968: jis0208<<14 | 0x43<<7 | 0x3C, + 31840 - 19968: jis0208<<14 | 0x43<<7 | 0x25, + 31841 - 19968: jis0212<<14 | 0x32<<7 | 0x00, + 31843 - 19968: jis0212<<14 | 0x32<<7 | 0x01, + 31844 - 19968: jis0208<<14 | 0x43<<7 | 0x3D, + 31845 - 19968: jis0208<<14 | 0x43<<7 | 0x3F, + 31847 - 19968: jis0212<<14 | 0x32<<7 | 0x02, + 31849 - 19968: jis0212<<14 | 0x32<<7 | 0x03, + 31852 - 19968: jis0208<<14 | 0x43<<7 | 0x40, + 31853 - 19968: jis0212<<14 | 0x32<<7 | 0x04, + 31854 - 19968: jis0212<<14 | 0x32<<7 | 0x05, + 31856 - 19968: jis0212<<14 | 0x32<<7 | 0x06, + 31858 - 19968: jis0212<<14 | 0x32<<7 | 0x07, + 31859 - 19968: jis0208<<14 | 0x29<<7 | 0x25, + 31861 - 19968: jis0208<<14 | 0x43<<7 | 0x41, + 31865 - 19968: jis0212<<14 | 0x32<<7 | 0x08, + 31868 - 19968: jis0212<<14 | 0x32<<7 | 0x09, + 31869 - 19968: jis0212<<14 | 0x32<<7 | 0x0A, + 31870 - 19968: jis0208<<14 | 0x2B<<7 | 0x41, + 31873 - 19968: jis0208<<14 | 0x15<<7 | 0x2D, + 31874 - 19968: jis0208<<14 | 0x16<<7 | 0x08, + 31875 - 19968: jis0208<<14 | 0x43<<7 | 0x42, + 31878 - 19968: jis0212<<14 | 0x32<<7 | 0x0B, + 31879 - 19968: jis0212<<14 | 0x32<<7 | 0x0C, + 31881 - 19968: jis0208<<14 | 0x29<<7 | 0x13, + 31883 - 19968: jis0208<<14 | 0x1E<<7 | 0x47, + 31885 - 19968: jis0208<<14 | 0x2B<<7 | 0x0F, + 31887 - 19968: jis0212<<14 | 0x32<<7 | 0x0D, + 31888 - 19968: jis0208<<14 | 0x43<<7 | 0x43, + 31890 - 19968: jis0208<<14 | 0x2D<<7 | 0x12, + 31892 - 19968: jis0212<<14 | 0x32<<7 | 0x0E, + 31893 - 19968: jis0208<<14 | 0x26<<7 | 0x53, + 31895 - 19968: jis0208<<14 | 0x20<<7 | 0x25, + 31896 - 19968: jis0208<<14 | 0x26<<7 | 0x13, + 31899 - 19968: jis0208<<14 | 0x1C<<7 | 0x2C, + 31902 - 19968: jis0212<<14 | 0x32<<7 | 0x0F, + 31903 - 19968: jis0208<<14 | 0x0F<<7 | 0x1F, + 31904 - 19968: jis0212<<14 | 0x32<<7 | 0x10, + 31905 - 19968: jis0208<<14 | 0x43<<7 | 0x48, + 31906 - 19968: jis0208<<14 | 0x43<<7 | 0x46, + 31908 - 19968: jis0208<<14 | 0x43<<7 | 0x44, + 31909 - 19968: jis0208<<14 | 0x13<<7 | 0x00, + 31910 - 19968: jis0212<<14 | 0x32<<7 | 0x11, + 31911 - 19968: jis0208<<14 | 0x1D<<7 | 0x30, + 31912 - 19968: jis0208<<14 | 0x43<<7 | 0x49, + 31915 - 19968: jis0208<<14 | 0x43<<7 | 0x47, + 31917 - 19968: jis0208<<14 | 0x43<<7 | 0x45, + 31918 - 19968: jis0208<<14 | 0x43<<7 | 0x4D, + 31920 - 19968: jis0212<<14 | 0x32<<7 | 0x12, + 31921 - 19968: jis0208<<14 | 0x43<<7 | 0x4C, + 31922 - 19968: jis0208<<14 | 0x43<<7 | 0x4B, + 31923 - 19968: jis0208<<14 | 0x43<<7 | 0x4A, + 31926 - 19968: jis0212<<14 | 0x32<<7 | 0x13, + 31927 - 19968: jis0212<<14 | 0x32<<7 | 0x14, + 31929 - 19968: jis0208<<14 | 0x43<<7 | 0x4E, + 31930 - 19968: jis0212<<14 | 0x32<<7 | 0x15, + 31931 - 19968: jis0212<<14 | 0x32<<7 | 0x16, + 31932 - 19968: jis0212<<14 | 0x32<<7 | 0x17, + 31933 - 19968: jis0208<<14 | 0x43<<7 | 0x4F, + 31934 - 19968: jis0208<<14 | 0x1F<<7 | 0x19, + 31935 - 19968: jis0212<<14 | 0x32<<7 | 0x18, + 31936 - 19968: jis0208<<14 | 0x43<<7 | 0x50, + 31938 - 19968: jis0208<<14 | 0x43<<7 | 0x52, + 31940 - 19968: jis0212<<14 | 0x32<<7 | 0x19, + 31941 - 19968: jis0208<<14 | 0x43<<7 | 0x51, + 31943 - 19968: jis0212<<14 | 0x32<<7 | 0x1A, + 31944 - 19968: jis0212<<14 | 0x32<<7 | 0x1B, + 31945 - 19968: jis0212<<14 | 0x32<<7 | 0x1C, + 31946 - 19968: jis0208<<14 | 0x17<<7 | 0x31, + 31949 - 19968: jis0212<<14 | 0x32<<7 | 0x1D, + 31950 - 19968: jis0208<<14 | 0x20<<7 | 0x17, + 31951 - 19968: jis0212<<14 | 0x32<<7 | 0x1E, + 31954 - 19968: jis0208<<14 | 0x43<<7 | 0x54, + 31955 - 19968: jis0212<<14 | 0x32<<7 | 0x1F, + 31956 - 19968: jis0212<<14 | 0x32<<7 | 0x20, + 31957 - 19968: jis0212<<14 | 0x32<<7 | 0x21, + 31958 - 19968: jis0208<<14 | 0x24<<7 | 0x5B, + 31959 - 19968: jis0212<<14 | 0x32<<7 | 0x22, + 31960 - 19968: jis0208<<14 | 0x43<<7 | 0x53, + 31961 - 19968: jis0212<<14 | 0x32<<7 | 0x23, + 31962 - 19968: jis0212<<14 | 0x32<<7 | 0x24, + 31964 - 19968: jis0208<<14 | 0x43<<7 | 0x55, + 31965 - 19968: jis0212<<14 | 0x32<<7 | 0x25, + 31966 - 19968: jis0208<<14 | 0x29<<7 | 0x14, + 31967 - 19968: jis0208<<14 | 0x20<<7 | 0x4B, + 31968 - 19968: jis0208<<14 | 0x18<<7 | 0x26, + 31970 - 19968: jis0208<<14 | 0x43<<7 | 0x56, + 31974 - 19968: jis0212<<14 | 0x32<<7 | 0x26, + 31975 - 19968: jis0208<<14 | 0x2D<<7 | 0x27, + 31977 - 19968: jis0212<<14 | 0x32<<7 | 0x27, + 31979 - 19968: jis0212<<14 | 0x32<<7 | 0x28, + 31983 - 19968: jis0208<<14 | 0x43<<7 | 0x58, + 31986 - 19968: jis0208<<14 | 0x43<<7 | 0x59, + 31988 - 19968: jis0208<<14 | 0x43<<7 | 0x5A, + 31989 - 19968: jis0212<<14 | 0x32<<7 | 0x29, + 31990 - 19968: jis0208<<14 | 0x43<<7 | 0x5B, + 31992 - 19968: jis0208<<14 | 0x1A<<7 | 0x44, + 31994 - 19968: jis0208<<14 | 0x43<<7 | 0x5C, + 31995 - 19968: jis0208<<14 | 0x16<<7 | 0x2E, + 31998 - 19968: jis0208<<14 | 0x14<<7 | 0x49, + 32000 - 19968: jis0208<<14 | 0x14<<7 | 0x09, + 32002 - 19968: jis0208<<14 | 0x44<<7 | 0x00, + 32003 - 19968: jis0212<<14 | 0x32<<7 | 0x2A, + 32004 - 19968: jis0208<<14 | 0x2B<<7 | 0x52, + 32005 - 19968: jis0208<<14 | 0x18<<7 | 0x27, + 32006 - 19968: jis0208<<14 | 0x43<<7 | 0x5D, + 32007 - 19968: jis0212<<14 | 0x32<<7 | 0x2B, + 32008 - 19968: jis0212<<14 | 0x32<<7 | 0x2C, + 32009 - 19968: jis0212<<14 | 0x32<<7 | 0x2D, + 32010 - 19968: jis0208<<14 | 0x44<<7 | 0x03, + 32011 - 19968: jis0208<<14 | 0x2B<<7 | 0x45, + 32013 - 19968: jis0208<<14 | 0x26<<7 | 0x1B, + 32015 - 19968: jis0212<<14 | 0x32<<7 | 0x2E, + 32016 - 19968: jis0208<<14 | 0x28<<7 | 0x12, + 32017 - 19968: jis0212<<14 | 0x32<<7 | 0x2F, + 32018 - 19968: jis0212<<14 | 0x32<<7 | 0x30, + 32019 - 19968: jis0212<<14 | 0x32<<7 | 0x31, + 32020 - 19968: jis0208<<14 | 0x1C<<7 | 0x42, + 32021 - 19968: jis0208<<14 | 0x44<<7 | 0x02, + 32022 - 19968: jis0212<<14 | 0x32<<7 | 0x32, + 32023 - 19968: jis0208<<14 | 0x1B<<7 | 0x32, + 32024 - 19968: jis0208<<14 | 0x18<<7 | 0x28, + 32025 - 19968: jis0208<<14 | 0x1A<<7 | 0x45, + 32026 - 19968: jis0208<<14 | 0x14<<7 | 0x48, + 32027 - 19968: jis0208<<14 | 0x29<<7 | 0x15, + 32028 - 19968: jis0208<<14 | 0x44<<7 | 0x01, + 32029 - 19968: jis0212<<14 | 0x32<<7 | 0x33, + 32030 - 19968: jis0212<<14 | 0x32<<7 | 0x34, + 32032 - 19968: jis0208<<14 | 0x20<<7 | 0x26, + 32033 - 19968: jis0208<<14 | 0x2A<<7 | 0x21, + 32034 - 19968: jis0208<<14 | 0x19<<7 | 0x56, + 32035 - 19968: jis0212<<14 | 0x32<<7 | 0x35, + 32038 - 19968: jis0212<<14 | 0x32<<7 | 0x36, + 32042 - 19968: jis0212<<14 | 0x32<<7 | 0x37, + 32043 - 19968: jis0208<<14 | 0x1A<<7 | 0x46, + 32044 - 19968: jis0208<<14 | 0x23<<7 | 0x3C, + 32045 - 19968: jis0212<<14 | 0x32<<7 | 0x38, + 32046 - 19968: jis0208<<14 | 0x44<<7 | 0x06, + 32047 - 19968: jis0208<<14 | 0x2D<<7 | 0x3E, + 32048 - 19968: jis0208<<14 | 0x19<<7 | 0x38, + 32049 - 19968: jis0212<<14 | 0x32<<7 | 0x39, + 32050 - 19968: jis0208<<14 | 0x44<<7 | 0x07, + 32051 - 19968: jis0208<<14 | 0x1E<<7 | 0x21, + 32053 - 19968: jis0208<<14 | 0x44<<7 | 0x09, + 32057 - 19968: jis0208<<14 | 0x1D<<7 | 0x31, + 32058 - 19968: jis0208<<14 | 0x19<<7 | 0x0F, + 32060 - 19968: jis0212<<14 | 0x32<<7 | 0x3A, + 32061 - 19968: jis0212<<14 | 0x32<<7 | 0x3B, + 32062 - 19968: jis0212<<14 | 0x32<<7 | 0x3C, + 32063 - 19968: jis0208<<14 | 0x44<<7 | 0x08, + 32064 - 19968: jis0212<<14 | 0x32<<7 | 0x3D, + 32065 - 19968: jis0212<<14 | 0x32<<7 | 0x3E, + 32066 - 19968: jis0208<<14 | 0x1C<<7 | 0x09, + 32067 - 19968: jis0208<<14 | 0x17<<7 | 0x1D, + 32068 - 19968: jis0208<<14 | 0x20<<7 | 0x27, + 32069 - 19968: jis0208<<14 | 0x44<<7 | 0x04, + 32070 - 19968: jis0208<<14 | 0x44<<7 | 0x0A, + 32071 - 19968: jis0212<<14 | 0x32<<7 | 0x3F, + 32072 - 19968: jis0208<<14 | 0x5A<<7 | 0x2D, + 32075 - 19968: jis0208<<14 | 0x44<<7 | 0x05, + 32076 - 19968: jis0208<<14 | 0x16<<7 | 0x2F, + 32077 - 19968: jis0212<<14 | 0x32<<7 | 0x41, + 32078 - 19968: jis0208<<14 | 0x44<<7 | 0x0D, + 32079 - 19968: jis0208<<14 | 0x44<<7 | 0x11, + 32080 - 19968: jis0208<<14 | 0x16<<7 | 0x4A, + 32081 - 19968: jis0212<<14 | 0x32<<7 | 0x42, + 32083 - 19968: jis0212<<14 | 0x32<<7 | 0x43, + 32086 - 19968: jis0208<<14 | 0x44<<7 | 0x0C, + 32087 - 19968: jis0212<<14 | 0x32<<7 | 0x44, + 32089 - 19968: jis0212<<14 | 0x32<<7 | 0x45, + 32090 - 19968: jis0212<<14 | 0x32<<7 | 0x46, + 32091 - 19968: jis0208<<14 | 0x44<<7 | 0x15, + 32092 - 19968: jis0208<<14 | 0x5A<<7 | 0x2E, + 32093 - 19968: jis0212<<14 | 0x32<<7 | 0x48, + 32094 - 19968: jis0208<<14 | 0x18<<7 | 0x29, + 32097 - 19968: jis0208<<14 | 0x2C<<7 | 0x4C, + 32098 - 19968: jis0208<<14 | 0x0F<<7 | 0x1B, + 32099 - 19968: jis0208<<14 | 0x44<<7 | 0x12, + 32101 - 19968: jis0212<<14 | 0x32<<7 | 0x49, + 32102 - 19968: jis0208<<14 | 0x14<<7 | 0x4A, + 32103 - 19968: jis0212<<14 | 0x32<<7 | 0x4A, + 32104 - 19968: jis0208<<14 | 0x44<<7 | 0x0F, + 32106 - 19968: jis0212<<14 | 0x32<<7 | 0x4B, + 32110 - 19968: jis0208<<14 | 0x44<<7 | 0x10, + 32112 - 19968: jis0212<<14 | 0x32<<7 | 0x4C, + 32113 - 19968: jis0208<<14 | 0x24<<7 | 0x5C, + 32114 - 19968: jis0208<<14 | 0x44<<7 | 0x0E, + 32115 - 19968: jis0208<<14 | 0x44<<7 | 0x0B, + 32117 - 19968: jis0208<<14 | 0x12<<7 | 0x07, + 32118 - 19968: jis0208<<14 | 0x1F<<7 | 0x43, + 32120 - 19968: jis0212<<14 | 0x32<<7 | 0x4D, + 32121 - 19968: jis0208<<14 | 0x17<<7 | 0x07, + 32122 - 19968: jis0212<<14 | 0x32<<7 | 0x4E, + 32123 - 19968: jis0212<<14 | 0x32<<7 | 0x4F, + 32125 - 19968: jis0208<<14 | 0x44<<7 | 0x17, + 32127 - 19968: jis0212<<14 | 0x32<<7 | 0x50, + 32129 - 19968: jis0212<<14 | 0x32<<7 | 0x51, + 32130 - 19968: jis0212<<14 | 0x32<<7 | 0x52, + 32131 - 19968: jis0212<<14 | 0x32<<7 | 0x53, + 32133 - 19968: jis0212<<14 | 0x32<<7 | 0x54, + 32134 - 19968: jis0212<<14 | 0x32<<7 | 0x55, + 32136 - 19968: jis0212<<14 | 0x32<<7 | 0x56, + 32137 - 19968: jis0208<<14 | 0x44<<7 | 0x14, + 32139 - 19968: jis0212<<14 | 0x32<<7 | 0x57, + 32140 - 19968: jis0212<<14 | 0x32<<7 | 0x58, + 32141 - 19968: jis0212<<14 | 0x32<<7 | 0x59, + 32143 - 19968: jis0208<<14 | 0x44<<7 | 0x16, + 32145 - 19968: jis0212<<14 | 0x32<<7 | 0x5A, + 32147 - 19968: jis0208<<14 | 0x44<<7 | 0x13, + 32150 - 19968: jis0212<<14 | 0x32<<7 | 0x5B, + 32151 - 19968: jis0212<<14 | 0x32<<7 | 0x5C, + 32153 - 19968: jis0208<<14 | 0x16<<7 | 0x30, + 32154 - 19968: jis0208<<14 | 0x21<<7 | 0x12, + 32155 - 19968: jis0208<<14 | 0x44<<7 | 0x18, + 32156 - 19968: jis0208<<14 | 0x20<<7 | 0x4D, + 32157 - 19968: jis0212<<14 | 0x32<<7 | 0x5D, + 32158 - 19968: jis0212<<14 | 0x33<<7 | 0x00, + 32159 - 19968: jis0208<<14 | 0x44<<7 | 0x25, + 32160 - 19968: jis0208<<14 | 0x5A<<7 | 0x30, + 32162 - 19968: jis0208<<14 | 0x44<<7 | 0x21, + 32163 - 19968: jis0208<<14 | 0x44<<7 | 0x1B, + 32166 - 19968: jis0212<<14 | 0x33<<7 | 0x01, + 32167 - 19968: jis0212<<14 | 0x33<<7 | 0x02, + 32170 - 19968: jis0212<<14 | 0x33<<7 | 0x03, + 32171 - 19968: jis0208<<14 | 0x44<<7 | 0x1F, + 32172 - 19968: jis0208<<14 | 0x1B<<7 | 0x59, + 32173 - 19968: jis0208<<14 | 0x0F<<7 | 0x3C, + 32174 - 19968: jis0208<<14 | 0x44<<7 | 0x1A, + 32175 - 19968: jis0208<<14 | 0x44<<7 | 0x22, + 32176 - 19968: jis0208<<14 | 0x44<<7 | 0x26, + 32177 - 19968: jis0208<<14 | 0x18<<7 | 0x2A, + 32178 - 19968: jis0208<<14 | 0x2B<<7 | 0x35, + 32179 - 19968: jis0212<<14 | 0x33<<7 | 0x04, + 32180 - 19968: jis0208<<14 | 0x23<<7 | 0x35, + 32181 - 19968: jis0208<<14 | 0x44<<7 | 0x1C, + 32182 - 19968: jis0212<<14 | 0x33<<7 | 0x05, + 32183 - 19968: jis0208<<14 | 0x5A<<7 | 0x2F, + 32184 - 19968: jis0208<<14 | 0x44<<7 | 0x24, + 32185 - 19968: jis0212<<14 | 0x33<<7 | 0x07, + 32186 - 19968: jis0208<<14 | 0x44<<7 | 0x19, + 32187 - 19968: jis0208<<14 | 0x22<<7 | 0x1D, + 32189 - 19968: jis0208<<14 | 0x44<<7 | 0x1E, + 32190 - 19968: jis0208<<14 | 0x0F<<7 | 0x1C, + 32191 - 19968: jis0208<<14 | 0x2B<<7 | 0x29, + 32194 - 19968: jis0212<<14 | 0x33<<7 | 0x08, + 32195 - 19968: jis0212<<14 | 0x33<<7 | 0x09, + 32196 - 19968: jis0212<<14 | 0x33<<7 | 0x0A, + 32197 - 19968: jis0212<<14 | 0x33<<7 | 0x0B, + 32198 - 19968: jis0212<<14 | 0x33<<7 | 0x0C, + 32199 - 19968: jis0208<<14 | 0x44<<7 | 0x1D, + 32202 - 19968: jis0208<<14 | 0x15<<7 | 0x3A, + 32203 - 19968: jis0208<<14 | 0x27<<7 | 0x4B, + 32204 - 19968: jis0212<<14 | 0x33<<7 | 0x0D, + 32205 - 19968: jis0212<<14 | 0x33<<7 | 0x0E, + 32206 - 19968: jis0212<<14 | 0x33<<7 | 0x0F, + 32207 - 19968: jis0208<<14 | 0x20<<7 | 0x4C, + 32209 - 19968: jis0208<<14 | 0x2D<<7 | 0x2F, + 32210 - 19968: jis0208<<14 | 0x1C<<7 | 0x4E, + 32213 - 19968: jis0208<<14 | 0x44<<7 | 0x4D, + 32214 - 19968: jis0208<<14 | 0x5A<<7 | 0x31, + 32215 - 19968: jis0212<<14 | 0x33<<7 | 0x10, + 32216 - 19968: jis0208<<14 | 0x44<<7 | 0x27, + 32217 - 19968: jis0212<<14 | 0x33<<7 | 0x11, + 32218 - 19968: jis0208<<14 | 0x1F<<7 | 0x5D, + 32220 - 19968: jis0208<<14 | 0x44<<7 | 0x23, + 32221 - 19968: jis0208<<14 | 0x44<<7 | 0x28, + 32222 - 19968: jis0208<<14 | 0x44<<7 | 0x2A, + 32224 - 19968: jis0208<<14 | 0x23<<7 | 0x58, + 32225 - 19968: jis0208<<14 | 0x44<<7 | 0x2D, + 32226 - 19968: jis0212<<14 | 0x33<<7 | 0x13, + 32228 - 19968: jis0208<<14 | 0x44<<7 | 0x29, + 32229 - 19968: jis0212<<14 | 0x33<<7 | 0x14, + 32230 - 19968: jis0212<<14 | 0x33<<7 | 0x15, + 32232 - 19968: jis0208<<14 | 0x29<<7 | 0x33, + 32233 - 19968: jis0208<<14 | 0x13<<7 | 0x2A, + 32234 - 19968: jis0212<<14 | 0x33<<7 | 0x16, + 32235 - 19968: jis0212<<14 | 0x33<<7 | 0x17, + 32236 - 19968: jis0208<<14 | 0x2B<<7 | 0x2A, + 32237 - 19968: jis0212<<14 | 0x33<<7 | 0x18, + 32239 - 19968: jis0208<<14 | 0x0F<<7 | 0x3D, + 32241 - 19968: jis0212<<14 | 0x33<<7 | 0x19, + 32242 - 19968: jis0208<<14 | 0x44<<7 | 0x2C, + 32244 - 19968: jis0208<<14 | 0x2D<<7 | 0x5C, + 32245 - 19968: jis0212<<14 | 0x33<<7 | 0x1A, + 32246 - 19968: jis0212<<14 | 0x33<<7 | 0x1B, + 32249 - 19968: jis0212<<14 | 0x33<<7 | 0x1C, + 32250 - 19968: jis0212<<14 | 0x33<<7 | 0x1D, + 32251 - 19968: jis0208<<14 | 0x44<<7 | 0x2B, + 32256 - 19968: jis0212<<14 | 0x33<<7 | 0x12, + 32257 - 19968: jis0208<<14 | 0x10<<7 | 0x4E, + 32260 - 19968: jis0208<<14 | 0x25<<7 | 0x4B, + 32261 - 19968: jis0208<<14 | 0x44<<7 | 0x2E, + 32264 - 19968: jis0212<<14 | 0x33<<7 | 0x1E, + 32265 - 19968: jis0208<<14 | 0x44<<7 | 0x35, + 32266 - 19968: jis0208<<14 | 0x44<<7 | 0x2F, + 32267 - 19968: jis0208<<14 | 0x44<<7 | 0x36, + 32272 - 19968: jis0212<<14 | 0x33<<7 | 0x1F, + 32273 - 19968: jis0212<<14 | 0x33<<7 | 0x20, + 32274 - 19968: jis0208<<14 | 0x44<<7 | 0x32, + 32277 - 19968: jis0212<<14 | 0x33<<7 | 0x21, + 32279 - 19968: jis0212<<14 | 0x33<<7 | 0x22, + 32283 - 19968: jis0208<<14 | 0x26<<7 | 0x5A, + 32284 - 19968: jis0212<<14 | 0x33<<7 | 0x23, + 32285 - 19968: jis0212<<14 | 0x33<<7 | 0x24, + 32286 - 19968: jis0208<<14 | 0x1B<<7 | 0x29, + 32287 - 19968: jis0208<<14 | 0x44<<7 | 0x34, + 32288 - 19968: jis0212<<14 | 0x33<<7 | 0x25, + 32289 - 19968: jis0208<<14 | 0x44<<7 | 0x31, + 32290 - 19968: jis0208<<14 | 0x44<<7 | 0x37, + 32291 - 19968: jis0208<<14 | 0x44<<7 | 0x30, + 32294 - 19968: jis0208<<14 | 0x1C<<7 | 0x23, + 32295 - 19968: jis0212<<14 | 0x33<<7 | 0x26, + 32296 - 19968: jis0212<<14 | 0x33<<7 | 0x27, + 32299 - 19968: jis0208<<14 | 0x2A<<7 | 0x04, + 32300 - 19968: jis0212<<14 | 0x33<<7 | 0x28, + 32301 - 19968: jis0212<<14 | 0x33<<7 | 0x29, + 32302 - 19968: jis0208<<14 | 0x1C<<7 | 0x2B, + 32303 - 19968: jis0212<<14 | 0x33<<7 | 0x2A, + 32305 - 19968: jis0208<<14 | 0x44<<7 | 0x33, + 32306 - 19968: jis0208<<14 | 0x44<<7 | 0x3F, + 32307 - 19968: jis0212<<14 | 0x33<<7 | 0x2B, + 32309 - 19968: jis0208<<14 | 0x44<<7 | 0x3B, + 32310 - 19968: jis0212<<14 | 0x33<<7 | 0x2C, + 32311 - 19968: jis0208<<14 | 0x44<<7 | 0x3E, + 32313 - 19968: jis0208<<14 | 0x44<<7 | 0x3C, + 32314 - 19968: jis0208<<14 | 0x44<<7 | 0x40, + 32315 - 19968: jis0208<<14 | 0x44<<7 | 0x3A, + 32317 - 19968: jis0208<<14 | 0x44<<7 | 0x20, + 32318 - 19968: jis0208<<14 | 0x1F<<7 | 0x32, + 32319 - 19968: jis0212<<14 | 0x33<<7 | 0x2D, + 32321 - 19968: jis0208<<14 | 0x27<<7 | 0x2A, + 32323 - 19968: jis0208<<14 | 0x44<<7 | 0x3D, + 32324 - 19968: jis0212<<14 | 0x33<<7 | 0x2E, + 32325 - 19968: jis0212<<14 | 0x33<<7 | 0x2F, + 32326 - 19968: jis0208<<14 | 0x44<<7 | 0x38, + 32327 - 19968: jis0212<<14 | 0x33<<7 | 0x30, + 32330 - 19968: jis0208<<14 | 0x20<<7 | 0x00, + 32331 - 19968: jis0208<<14 | 0x16<<7 | 0x31, + 32333 - 19968: jis0208<<14 | 0x1C<<7 | 0x0A, + 32334 - 19968: jis0212<<14 | 0x33<<7 | 0x31, + 32336 - 19968: jis0212<<14 | 0x33<<7 | 0x32, + 32338 - 19968: jis0208<<14 | 0x5A<<7 | 0x32, + 32340 - 19968: jis0208<<14 | 0x1E<<7 | 0x04, + 32341 - 19968: jis0208<<14 | 0x20<<7 | 0x15, + 32342 - 19968: jis0208<<14 | 0x44<<7 | 0x43, + 32344 - 19968: jis0212<<14 | 0x33<<7 | 0x34, + 32345 - 19968: jis0208<<14 | 0x44<<7 | 0x45, + 32346 - 19968: jis0208<<14 | 0x44<<7 | 0x46, + 32349 - 19968: jis0208<<14 | 0x44<<7 | 0x42, + 32350 - 19968: jis0208<<14 | 0x44<<7 | 0x44, + 32351 - 19968: jis0212<<14 | 0x33<<7 | 0x35, + 32353 - 19968: jis0212<<14 | 0x33<<7 | 0x36, + 32354 - 19968: jis0212<<14 | 0x33<<7 | 0x37, + 32357 - 19968: jis0212<<14 | 0x33<<7 | 0x38, + 32358 - 19968: jis0208<<14 | 0x44<<7 | 0x39, + 32359 - 19968: jis0208<<14 | 0x44<<7 | 0x41, + 32361 - 19968: jis0208<<14 | 0x44<<7 | 0x49, + 32362 - 19968: jis0208<<14 | 0x44<<7 | 0x48, + 32363 - 19968: jis0212<<14 | 0x33<<7 | 0x39, + 32365 - 19968: jis0208<<14 | 0x2A<<7 | 0x59, + 32366 - 19968: jis0212<<14 | 0x33<<7 | 0x3A, + 32367 - 19968: jis0212<<14 | 0x33<<7 | 0x3B, + 32368 - 19968: jis0208<<14 | 0x16<<7 | 0x0A, + 32371 - 19968: jis0212<<14 | 0x33<<7 | 0x3C, + 32376 - 19968: jis0212<<14 | 0x33<<7 | 0x3D, + 32377 - 19968: jis0208<<14 | 0x44<<7 | 0x47, + 32379 - 19968: jis0208<<14 | 0x44<<7 | 0x4B, + 32380 - 19968: jis0208<<14 | 0x44<<7 | 0x4A, + 32381 - 19968: jis0208<<14 | 0x44<<7 | 0x4E, + 32382 - 19968: jis0212<<14 | 0x33<<7 | 0x3E, + 32383 - 19968: jis0208<<14 | 0x44<<7 | 0x50, + 32385 - 19968: jis0212<<14 | 0x33<<7 | 0x3F, + 32386 - 19968: jis0208<<14 | 0x1A<<7 | 0x1B, + 32387 - 19968: jis0208<<14 | 0x44<<7 | 0x4C, + 32390 - 19968: jis0212<<14 | 0x33<<7 | 0x40, + 32391 - 19968: jis0212<<14 | 0x33<<7 | 0x41, + 32392 - 19968: jis0208<<14 | 0x44<<7 | 0x51, + 32393 - 19968: jis0208<<14 | 0x44<<7 | 0x52, + 32394 - 19968: jis0208<<14 | 0x58<<7 | 0x00, + 32396 - 19968: jis0208<<14 | 0x44<<7 | 0x53, + 32397 - 19968: jis0212<<14 | 0x33<<7 | 0x43, + 32398 - 19968: jis0208<<14 | 0x44<<7 | 0x59, + 32399 - 19968: jis0208<<14 | 0x24<<7 | 0x1A, + 32400 - 19968: jis0208<<14 | 0x44<<7 | 0x55, + 32401 - 19968: jis0212<<14 | 0x33<<7 | 0x44, + 32402 - 19968: jis0208<<14 | 0x44<<7 | 0x54, + 32403 - 19968: jis0208<<14 | 0x44<<7 | 0x56, + 32404 - 19968: jis0208<<14 | 0x44<<7 | 0x57, + 32405 - 19968: jis0212<<14 | 0x33<<7 | 0x45, + 32406 - 19968: jis0208<<14 | 0x44<<7 | 0x58, + 32408 - 19968: jis0212<<14 | 0x33<<7 | 0x46, + 32410 - 19968: jis0212<<14 | 0x33<<7 | 0x47, + 32411 - 19968: jis0208<<14 | 0x44<<7 | 0x5A, + 32412 - 19968: jis0208<<14 | 0x44<<7 | 0x5B, + 32413 - 19968: jis0212<<14 | 0x33<<7 | 0x48, + 32414 - 19968: jis0212<<14 | 0x33<<7 | 0x49, + 32566 - 19968: jis0208<<14 | 0x13<<7 | 0x2B, + 32568 - 19968: jis0208<<14 | 0x44<<7 | 0x5C, + 32570 - 19968: jis0208<<14 | 0x44<<7 | 0x5D, + 32571 - 19968: jis0212<<14 | 0x33<<7 | 0x4B, + 32572 - 19968: jis0212<<14 | 0x33<<7 | 0x4A, + 32573 - 19968: jis0212<<14 | 0x33<<7 | 0x4C, + 32574 - 19968: jis0212<<14 | 0x33<<7 | 0x4D, + 32575 - 19968: jis0212<<14 | 0x33<<7 | 0x4E, + 32579 - 19968: jis0212<<14 | 0x33<<7 | 0x4F, + 32580 - 19968: jis0212<<14 | 0x33<<7 | 0x50, + 32581 - 19968: jis0208<<14 | 0x45<<7 | 0x00, + 32583 - 19968: jis0208<<14 | 0x5A<<7 | 0x33, + 32588 - 19968: jis0208<<14 | 0x45<<7 | 0x01, + 32589 - 19968: jis0208<<14 | 0x45<<7 | 0x02, + 32590 - 19968: jis0208<<14 | 0x45<<7 | 0x03, + 32591 - 19968: jis0212<<14 | 0x33<<7 | 0x52, + 32592 - 19968: jis0208<<14 | 0x45<<7 | 0x04, + 32593 - 19968: jis0208<<14 | 0x45<<7 | 0x05, + 32594 - 19968: jis0212<<14 | 0x33<<7 | 0x53, + 32595 - 19968: jis0212<<14 | 0x33<<7 | 0x54, + 32596 - 19968: jis0208<<14 | 0x45<<7 | 0x07, + 32597 - 19968: jis0208<<14 | 0x45<<7 | 0x06, + 32600 - 19968: jis0208<<14 | 0x45<<7 | 0x08, + 32603 - 19968: jis0212<<14 | 0x33<<7 | 0x55, + 32604 - 19968: jis0212<<14 | 0x33<<7 | 0x56, + 32605 - 19968: jis0212<<14 | 0x33<<7 | 0x57, + 32607 - 19968: jis0208<<14 | 0x45<<7 | 0x09, + 32608 - 19968: jis0208<<14 | 0x45<<7 | 0x0A, + 32609 - 19968: jis0212<<14 | 0x33<<7 | 0x58, + 32611 - 19968: jis0212<<14 | 0x33<<7 | 0x59, + 32612 - 19968: jis0212<<14 | 0x33<<7 | 0x5A, + 32613 - 19968: jis0212<<14 | 0x33<<7 | 0x5B, + 32614 - 19968: jis0212<<14 | 0x33<<7 | 0x5C, + 32615 - 19968: jis0208<<14 | 0x45<<7 | 0x0D, + 32616 - 19968: jis0208<<14 | 0x45<<7 | 0x0B, + 32617 - 19968: jis0208<<14 | 0x45<<7 | 0x0C, + 32618 - 19968: jis0208<<14 | 0x19<<7 | 0x40, + 32619 - 19968: jis0208<<14 | 0x16<<7 | 0x32, + 32621 - 19968: jis0212<<14 | 0x33<<7 | 0x5D, + 32622 - 19968: jis0208<<14 | 0x22<<7 | 0x35, + 32624 - 19968: jis0208<<14 | 0x27<<7 | 0x12, + 32625 - 19968: jis0212<<14 | 0x34<<7 | 0x00, + 32626 - 19968: jis0208<<14 | 0x1C<<7 | 0x4F, + 32629 - 19968: jis0208<<14 | 0x26<<7 | 0x2C, + 32631 - 19968: jis0208<<14 | 0x27<<7 | 0x4C, + 32632 - 19968: jis0208<<14 | 0x45<<7 | 0x0E, + 32633 - 19968: jis0208<<14 | 0x37<<7 | 0x4C, + 32637 - 19968: jis0212<<14 | 0x34<<7 | 0x01, + 32638 - 19968: jis0212<<14 | 0x34<<7 | 0x02, + 32639 - 19968: jis0212<<14 | 0x34<<7 | 0x03, + 32640 - 19968: jis0212<<14 | 0x34<<7 | 0x04, + 32642 - 19968: jis0208<<14 | 0x45<<7 | 0x0F, + 32643 - 19968: jis0208<<14 | 0x45<<7 | 0x11, + 32645 - 19968: jis0208<<14 | 0x2C<<7 | 0x44, + 32646 - 19968: jis0208<<14 | 0x45<<7 | 0x10, + 32647 - 19968: jis0208<<14 | 0x45<<7 | 0x13, + 32648 - 19968: jis0208<<14 | 0x45<<7 | 0x12, + 32650 - 19968: jis0208<<14 | 0x2C<<7 | 0x32, + 32651 - 19968: jis0212<<14 | 0x34<<7 | 0x05, + 32652 - 19968: jis0208<<14 | 0x45<<7 | 0x14, + 32653 - 19968: jis0212<<14 | 0x34<<7 | 0x06, + 32654 - 19968: jis0208<<14 | 0x27<<7 | 0x5D, + 32655 - 19968: jis0212<<14 | 0x34<<7 | 0x07, + 32656 - 19968: jis0212<<14 | 0x34<<7 | 0x08, + 32657 - 19968: jis0212<<14 | 0x34<<7 | 0x09, + 32660 - 19968: jis0208<<14 | 0x45<<7 | 0x15, + 32662 - 19968: jis0212<<14 | 0x34<<7 | 0x0A, + 32663 - 19968: jis0212<<14 | 0x34<<7 | 0x0B, + 32666 - 19968: jis0208<<14 | 0x45<<7 | 0x18, + 32668 - 19968: jis0212<<14 | 0x34<<7 | 0x0C, + 32669 - 19968: jis0208<<14 | 0x45<<7 | 0x17, + 32670 - 19968: jis0208<<14 | 0x45<<7 | 0x16, + 32673 - 19968: jis0208<<14 | 0x5A<<7 | 0x34, + 32674 - 19968: jis0212<<14 | 0x34<<7 | 0x0E, + 32675 - 19968: jis0208<<14 | 0x45<<7 | 0x19, + 32676 - 19968: jis0208<<14 | 0x16<<7 | 0x11, + 32678 - 19968: jis0212<<14 | 0x34<<7 | 0x0F, + 32680 - 19968: jis0208<<14 | 0x20<<7 | 0x01, + 32681 - 19968: jis0208<<14 | 0x14<<7 | 0x20, + 32682 - 19968: jis0212<<14 | 0x34<<7 | 0x10, + 32685 - 19968: jis0212<<14 | 0x34<<7 | 0x11, + 32686 - 19968: jis0208<<14 | 0x45<<7 | 0x1D, + 32687 - 19968: jis0208<<14 | 0x45<<7 | 0x1A, + 32690 - 19968: jis0208<<14 | 0x45<<7 | 0x1B, + 32692 - 19968: jis0212<<14 | 0x34<<7 | 0x12, + 32694 - 19968: jis0208<<14 | 0x45<<7 | 0x1E, + 32696 - 19968: jis0208<<14 | 0x45<<7 | 0x1F, + 32697 - 19968: jis0208<<14 | 0x45<<7 | 0x1C, + 32700 - 19968: jis0212<<14 | 0x34<<7 | 0x13, + 32701 - 19968: jis0208<<14 | 0x10<<7 | 0x08, + 32703 - 19968: jis0212<<14 | 0x34<<7 | 0x14, + 32704 - 19968: jis0212<<14 | 0x34<<7 | 0x15, + 32705 - 19968: jis0208<<14 | 0x11<<7 | 0x06, + 32707 - 19968: jis0212<<14 | 0x34<<7 | 0x16, + 32709 - 19968: jis0208<<14 | 0x45<<7 | 0x21, + 32710 - 19968: jis0208<<14 | 0x45<<7 | 0x22, + 32712 - 19968: jis0212<<14 | 0x34<<7 | 0x17, + 32714 - 19968: jis0208<<14 | 0x45<<7 | 0x23, + 32716 - 19968: jis0208<<14 | 0x2C<<7 | 0x41, + 32718 - 19968: jis0212<<14 | 0x34<<7 | 0x18, + 32719 - 19968: jis0212<<14 | 0x34<<7 | 0x19, + 32722 - 19968: jis0208<<14 | 0x1C<<7 | 0x0B, + 32724 - 19968: jis0208<<14 | 0x45<<7 | 0x25, + 32725 - 19968: jis0208<<14 | 0x45<<7 | 0x24, + 32731 - 19968: jis0212<<14 | 0x34<<7 | 0x1A, + 32735 - 19968: jis0212<<14 | 0x34<<7 | 0x1B, + 32736 - 19968: jis0208<<14 | 0x1E<<7 | 0x48, + 32737 - 19968: jis0208<<14 | 0x45<<7 | 0x26, + 32739 - 19968: jis0212<<14 | 0x34<<7 | 0x1C, + 32741 - 19968: jis0212<<14 | 0x34<<7 | 0x1D, + 32742 - 19968: jis0208<<14 | 0x45<<7 | 0x27, + 32744 - 19968: jis0212<<14 | 0x34<<7 | 0x1E, + 32745 - 19968: jis0208<<14 | 0x45<<7 | 0x28, + 32747 - 19968: jis0208<<14 | 0x13<<7 | 0x44, + 32748 - 19968: jis0212<<14 | 0x34<<7 | 0x1F, + 32750 - 19968: jis0212<<14 | 0x34<<7 | 0x20, + 32751 - 19968: jis0212<<14 | 0x34<<7 | 0x21, + 32752 - 19968: jis0208<<14 | 0x13<<7 | 0x2C, + 32754 - 19968: jis0212<<14 | 0x34<<7 | 0x22, + 32755 - 19968: jis0208<<14 | 0x45<<7 | 0x29, + 32761 - 19968: jis0208<<14 | 0x45<<7 | 0x2A, + 32762 - 19968: jis0212<<14 | 0x34<<7 | 0x23, + 32763 - 19968: jis0208<<14 | 0x2A<<7 | 0x3C, + 32764 - 19968: jis0208<<14 | 0x2C<<7 | 0x42, + 32765 - 19968: jis0212<<14 | 0x34<<7 | 0x24, + 32766 - 19968: jis0212<<14 | 0x34<<7 | 0x25, + 32767 - 19968: jis0212<<14 | 0x34<<7 | 0x26, + 32768 - 19968: jis0208<<14 | 0x2C<<7 | 0x33, + 32769 - 19968: jis0208<<14 | 0x2E<<7 | 0x16, + 32771 - 19968: jis0208<<14 | 0x18<<7 | 0x2C, + 32772 - 19968: jis0208<<14 | 0x45<<7 | 0x2D, + 32773 - 19968: jis0208<<14 | 0x1B<<7 | 0x33, + 32774 - 19968: jis0208<<14 | 0x45<<7 | 0x2C, + 32775 - 19968: jis0212<<14 | 0x34<<7 | 0x27, + 32776 - 19968: jis0212<<14 | 0x34<<7 | 0x28, + 32778 - 19968: jis0212<<14 | 0x34<<7 | 0x29, + 32779 - 19968: jis0208<<14 | 0x45<<7 | 0x2E, + 32780 - 19968: jis0208<<14 | 0x1B<<7 | 0x08, + 32781 - 19968: jis0212<<14 | 0x34<<7 | 0x2A, + 32782 - 19968: jis0212<<14 | 0x34<<7 | 0x2B, + 32783 - 19968: jis0212<<14 | 0x34<<7 | 0x2C, + 32784 - 19968: jis0208<<14 | 0x21<<7 | 0x30, + 32785 - 19968: jis0212<<14 | 0x34<<7 | 0x2D, + 32786 - 19968: jis0208<<14 | 0x45<<7 | 0x2F, + 32787 - 19968: jis0212<<14 | 0x34<<7 | 0x2E, + 32788 - 19968: jis0212<<14 | 0x34<<7 | 0x2F, + 32789 - 19968: jis0208<<14 | 0x18<<7 | 0x2B, + 32790 - 19968: jis0212<<14 | 0x34<<7 | 0x30, + 32791 - 19968: jis0208<<14 | 0x2B<<7 | 0x36, + 32792 - 19968: jis0208<<14 | 0x45<<7 | 0x30, + 32793 - 19968: jis0208<<14 | 0x45<<7 | 0x31, + 32796 - 19968: jis0208<<14 | 0x45<<7 | 0x32, + 32797 - 19968: jis0212<<14 | 0x34<<7 | 0x31, + 32798 - 19968: jis0212<<14 | 0x34<<7 | 0x32, + 32799 - 19968: jis0212<<14 | 0x34<<7 | 0x33, + 32800 - 19968: jis0212<<14 | 0x34<<7 | 0x34, + 32801 - 19968: jis0208<<14 | 0x45<<7 | 0x33, + 32804 - 19968: jis0212<<14 | 0x34<<7 | 0x35, + 32806 - 19968: jis0212<<14 | 0x34<<7 | 0x36, + 32808 - 19968: jis0208<<14 | 0x45<<7 | 0x34, + 32812 - 19968: jis0212<<14 | 0x34<<7 | 0x37, + 32814 - 19968: jis0212<<14 | 0x34<<7 | 0x38, + 32816 - 19968: jis0212<<14 | 0x34<<7 | 0x39, + 32819 - 19968: jis0208<<14 | 0x1B<<7 | 0x09, + 32820 - 19968: jis0212<<14 | 0x34<<7 | 0x3A, + 32821 - 19968: jis0212<<14 | 0x34<<7 | 0x3B, + 32822 - 19968: jis0208<<14 | 0x2B<<7 | 0x4C, + 32823 - 19968: jis0212<<14 | 0x34<<7 | 0x3C, + 32825 - 19968: jis0212<<14 | 0x34<<7 | 0x3D, + 32826 - 19968: jis0212<<14 | 0x34<<7 | 0x3E, + 32827 - 19968: jis0208<<14 | 0x45<<7 | 0x36, + 32828 - 19968: jis0212<<14 | 0x34<<7 | 0x3F, + 32829 - 19968: jis0208<<14 | 0x22<<7 | 0x1E, + 32830 - 19968: jis0212<<14 | 0x34<<7 | 0x40, + 32831 - 19968: jis0208<<14 | 0x45<<7 | 0x35, + 32832 - 19968: jis0212<<14 | 0x34<<7 | 0x41, + 32836 - 19968: jis0212<<14 | 0x34<<7 | 0x42, + 32838 - 19968: jis0208<<14 | 0x45<<7 | 0x38, + 32842 - 19968: jis0208<<14 | 0x45<<7 | 0x37, + 32850 - 19968: jis0208<<14 | 0x45<<7 | 0x39, + 32854 - 19968: jis0208<<14 | 0x1F<<7 | 0x1A, + 32856 - 19968: jis0208<<14 | 0x45<<7 | 0x3A, + 32858 - 19968: jis0208<<14 | 0x45<<7 | 0x3B, + 32862 - 19968: jis0208<<14 | 0x29<<7 | 0x18, + 32863 - 19968: jis0208<<14 | 0x45<<7 | 0x3C, + 32864 - 19968: jis0212<<14 | 0x34<<7 | 0x43, + 32865 - 19968: jis0208<<14 | 0x20<<7 | 0x4E, + 32866 - 19968: jis0208<<14 | 0x45<<7 | 0x3D, + 32868 - 19968: jis0212<<14 | 0x34<<7 | 0x44, + 32870 - 19968: jis0212<<14 | 0x34<<7 | 0x45, + 32872 - 19968: jis0208<<14 | 0x45<<7 | 0x3E, + 32877 - 19968: jis0212<<14 | 0x34<<7 | 0x46, + 32879 - 19968: jis0208<<14 | 0x2D<<7 | 0x5D, + 32880 - 19968: jis0208<<14 | 0x45<<7 | 0x41, + 32881 - 19968: jis0212<<14 | 0x34<<7 | 0x47, + 32882 - 19968: jis0208<<14 | 0x45<<7 | 0x40, + 32883 - 19968: jis0208<<14 | 0x45<<7 | 0x3F, + 32884 - 19968: jis0208<<14 | 0x23<<7 | 0x0F, + 32885 - 19968: jis0212<<14 | 0x34<<7 | 0x48, + 32886 - 19968: jis0208<<14 | 0x45<<7 | 0x42, + 32887 - 19968: jis0208<<14 | 0x1E<<7 | 0x05, + 32889 - 19968: jis0208<<14 | 0x45<<7 | 0x43, + 32893 - 19968: jis0208<<14 | 0x45<<7 | 0x44, + 32894 - 19968: jis0208<<14 | 0x2E<<7 | 0x17, + 32895 - 19968: jis0208<<14 | 0x45<<7 | 0x45, + 32897 - 19968: jis0212<<14 | 0x34<<7 | 0x49, + 32900 - 19968: jis0208<<14 | 0x45<<7 | 0x46, + 32901 - 19968: jis0208<<14 | 0x45<<7 | 0x48, + 32902 - 19968: jis0208<<14 | 0x45<<7 | 0x47, + 32903 - 19968: jis0208<<14 | 0x27<<7 | 0x04, + 32904 - 19968: jis0212<<14 | 0x34<<7 | 0x4A, + 32905 - 19968: jis0208<<14 | 0x25<<7 | 0x58, + 32907 - 19968: jis0208<<14 | 0x2E<<7 | 0x1D, + 32908 - 19968: jis0208<<14 | 0x27<<7 | 0x08, + 32910 - 19968: jis0212<<14 | 0x34<<7 | 0x4B, + 32915 - 19968: jis0208<<14 | 0x45<<7 | 0x4A, + 32918 - 19968: jis0208<<14 | 0x1D<<7 | 0x32, + 32920 - 19968: jis0208<<14 | 0x28<<7 | 0x09, + 32922 - 19968: jis0208<<14 | 0x45<<7 | 0x4B, + 32923 - 19968: jis0208<<14 | 0x45<<7 | 0x49, + 32924 - 19968: jis0212<<14 | 0x34<<7 | 0x4C, + 32925 - 19968: jis0208<<14 | 0x13<<7 | 0x2D, + 32926 - 19968: jis0212<<14 | 0x34<<7 | 0x4D, + 32929 - 19968: jis0208<<14 | 0x17<<7 | 0x33, + 32930 - 19968: jis0208<<14 | 0x1A<<7 | 0x47, + 32933 - 19968: jis0208<<14 | 0x27<<7 | 0x4D, + 32934 - 19968: jis0212<<14 | 0x34<<7 | 0x4E, + 32935 - 19968: jis0212<<14 | 0x34<<7 | 0x4F, + 32937 - 19968: jis0208<<14 | 0x17<<7 | 0x09, + 32938 - 19968: jis0208<<14 | 0x2A<<7 | 0x22, + 32939 - 19968: jis0212<<14 | 0x34<<7 | 0x50, + 32940 - 19968: jis0208<<14 | 0x45<<7 | 0x4E, + 32941 - 19968: jis0208<<14 | 0x45<<7 | 0x4C, + 32943 - 19968: jis0208<<14 | 0x18<<7 | 0x2D, + 32945 - 19968: jis0208<<14 | 0x18<<7 | 0x2E, + 32946 - 19968: jis0208<<14 | 0x0F<<7 | 0x48, + 32948 - 19968: jis0208<<14 | 0x19<<7 | 0x47, + 32952 - 19968: jis0212<<14 | 0x34<<7 | 0x51, + 32953 - 19968: jis0212<<14 | 0x34<<7 | 0x52, + 32954 - 19968: jis0208<<14 | 0x26<<7 | 0x38, + 32963 - 19968: jis0208<<14 | 0x0F<<7 | 0x3E, + 32964 - 19968: jis0208<<14 | 0x45<<7 | 0x53, + 32966 - 19968: jis0208<<14 | 0x22<<7 | 0x1F, + 32968 - 19968: jis0212<<14 | 0x34<<7 | 0x53, + 32972 - 19968: jis0208<<14 | 0x26<<7 | 0x37, + 32973 - 19968: jis0212<<14 | 0x34<<7 | 0x54, + 32974 - 19968: jis0208<<14 | 0x21<<7 | 0x3A, + 32975 - 19968: jis0212<<14 | 0x34<<7 | 0x55, + 32978 - 19968: jis0212<<14 | 0x34<<7 | 0x56, + 32980 - 19968: jis0212<<14 | 0x34<<7 | 0x57, + 32981 - 19968: jis0212<<14 | 0x34<<7 | 0x58, + 32982 - 19968: jis0208<<14 | 0x45<<7 | 0x55, + 32983 - 19968: jis0212<<14 | 0x34<<7 | 0x59, + 32984 - 19968: jis0212<<14 | 0x34<<7 | 0x5A, + 32985 - 19968: jis0208<<14 | 0x45<<7 | 0x51, + 32986 - 19968: jis0208<<14 | 0x45<<7 | 0x54, + 32987 - 19968: jis0208<<14 | 0x45<<7 | 0x4F, + 32989 - 19968: jis0208<<14 | 0x45<<7 | 0x52, + 32990 - 19968: jis0208<<14 | 0x2A<<7 | 0x05, + 32992 - 19968: jis0212<<14 | 0x34<<7 | 0x5B, + 32993 - 19968: jis0208<<14 | 0x17<<7 | 0x34, + 32996 - 19968: jis0208<<14 | 0x0F<<7 | 0x5C, + 32997 - 19968: jis0208<<14 | 0x45<<7 | 0x50, + 33005 - 19968: jis0212<<14 | 0x34<<7 | 0x5C, + 33006 - 19968: jis0212<<14 | 0x34<<7 | 0x5D, + 33007 - 19968: jis0208<<14 | 0x45<<7 | 0x57, + 33008 - 19968: jis0212<<14 | 0x35<<7 | 0x00, + 33009 - 19968: jis0208<<14 | 0x45<<7 | 0x58, + 33010 - 19968: jis0212<<14 | 0x35<<7 | 0x01, + 33011 - 19968: jis0212<<14 | 0x35<<7 | 0x02, + 33012 - 19968: jis0208<<14 | 0x25<<7 | 0x18, + 33014 - 19968: jis0212<<14 | 0x35<<7 | 0x03, + 33016 - 19968: jis0208<<14 | 0x15<<7 | 0x1A, + 33017 - 19968: jis0212<<14 | 0x35<<7 | 0x04, + 33018 - 19968: jis0212<<14 | 0x35<<7 | 0x05, + 33020 - 19968: jis0208<<14 | 0x46<<7 | 0x05, + 33021 - 19968: jis0208<<14 | 0x26<<7 | 0x1C, + 33022 - 19968: jis0212<<14 | 0x35<<7 | 0x06, + 33026 - 19968: jis0208<<14 | 0x1A<<7 | 0x48, + 33027 - 19968: jis0212<<14 | 0x35<<7 | 0x07, + 33029 - 19968: jis0208<<14 | 0x15<<7 | 0x1B, + 33030 - 19968: jis0208<<14 | 0x1F<<7 | 0x27, + 33031 - 19968: jis0208<<14 | 0x2E<<7 | 0x25, + 33032 - 19968: jis0208<<14 | 0x2B<<7 | 0x0D, + 33033 - 19968: jis0208<<14 | 0x45<<7 | 0x56, + 33034 - 19968: jis0208<<14 | 0x1F<<7 | 0x33, + 33035 - 19968: jis0212<<14 | 0x35<<7 | 0x08, + 33046 - 19968: jis0212<<14 | 0x35<<7 | 0x09, + 33047 - 19968: jis0212<<14 | 0x35<<7 | 0x0A, + 33048 - 19968: jis0212<<14 | 0x35<<7 | 0x0B, + 33050 - 19968: jis0208<<14 | 0x14<<7 | 0x32, + 33051 - 19968: jis0208<<14 | 0x45<<7 | 0x59, + 33052 - 19968: jis0212<<14 | 0x35<<7 | 0x0C, + 33054 - 19968: jis0212<<14 | 0x35<<7 | 0x0D, + 33056 - 19968: jis0212<<14 | 0x35<<7 | 0x0E, + 33059 - 19968: jis0208<<14 | 0x45<<7 | 0x5B, + 33060 - 19968: jis0212<<14 | 0x35<<7 | 0x0F, + 33063 - 19968: jis0212<<14 | 0x35<<7 | 0x10, + 33065 - 19968: jis0208<<14 | 0x45<<7 | 0x5A, + 33068 - 19968: jis0212<<14 | 0x35<<7 | 0x11, + 33071 - 19968: jis0208<<14 | 0x45<<7 | 0x5C, + 33072 - 19968: jis0212<<14 | 0x35<<7 | 0x12, + 33073 - 19968: jis0208<<14 | 0x22<<7 | 0x05, + 33075 - 19968: jis0208<<14 | 0x26<<7 | 0x1D, + 33077 - 19968: jis0212<<14 | 0x35<<7 | 0x13, + 33081 - 19968: jis0208<<14 | 0x23<<7 | 0x10, + 33082 - 19968: jis0212<<14 | 0x35<<7 | 0x14, + 33084 - 19968: jis0212<<14 | 0x35<<7 | 0x15, + 33086 - 19968: jis0208<<14 | 0x46<<7 | 0x02, + 33093 - 19968: jis0212<<14 | 0x35<<7 | 0x16, + 33094 - 19968: jis0208<<14 | 0x46<<7 | 0x01, + 33095 - 19968: jis0212<<14 | 0x35<<7 | 0x17, + 33098 - 19968: jis0212<<14 | 0x35<<7 | 0x18, + 33099 - 19968: jis0208<<14 | 0x45<<7 | 0x5D, + 33100 - 19968: jis0212<<14 | 0x35<<7 | 0x19, + 33102 - 19968: jis0208<<14 | 0x1E<<7 | 0x34, + 33104 - 19968: jis0208<<14 | 0x28<<7 | 0x44, + 33105 - 19968: jis0208<<14 | 0x46<<7 | 0x04, + 33106 - 19968: jis0212<<14 | 0x35<<7 | 0x1A, + 33107 - 19968: jis0208<<14 | 0x46<<7 | 0x03, + 33108 - 19968: jis0208<<14 | 0x18<<7 | 0x2F, + 33109 - 19968: jis0208<<14 | 0x2E<<7 | 0x32, + 33111 - 19968: jis0212<<14 | 0x35<<7 | 0x1B, + 33119 - 19968: jis0208<<14 | 0x46<<7 | 0x14, + 33120 - 19968: jis0212<<14 | 0x35<<7 | 0x1C, + 33121 - 19968: jis0212<<14 | 0x35<<7 | 0x1D, + 33125 - 19968: jis0208<<14 | 0x46<<7 | 0x08, + 33126 - 19968: jis0208<<14 | 0x46<<7 | 0x09, + 33127 - 19968: jis0212<<14 | 0x35<<7 | 0x1E, + 33128 - 19968: jis0212<<14 | 0x35<<7 | 0x1F, + 33129 - 19968: jis0212<<14 | 0x35<<7 | 0x20, + 33131 - 19968: jis0208<<14 | 0x1B<<7 | 0x4F, + 33133 - 19968: jis0212<<14 | 0x35<<7 | 0x21, + 33134 - 19968: jis0208<<14 | 0x46<<7 | 0x07, + 33135 - 19968: jis0212<<14 | 0x35<<7 | 0x22, + 33136 - 19968: jis0208<<14 | 0x18<<7 | 0x57, + 33137 - 19968: jis0208<<14 | 0x46<<7 | 0x06, + 33140 - 19968: jis0208<<14 | 0x46<<7 | 0x0A, + 33143 - 19968: jis0212<<14 | 0x35<<7 | 0x23, + 33144 - 19968: jis0208<<14 | 0x23<<7 | 0x11, + 33145 - 19968: jis0208<<14 | 0x29<<7 | 0x01, + 33146 - 19968: jis0208<<14 | 0x20<<7 | 0x02, + 33151 - 19968: jis0208<<14 | 0x21<<7 | 0x3B, + 33152 - 19968: jis0208<<14 | 0x46<<7 | 0x0E, + 33153 - 19968: jis0212<<14 | 0x35<<7 | 0x24, + 33154 - 19968: jis0208<<14 | 0x46<<7 | 0x0F, + 33155 - 19968: jis0208<<14 | 0x46<<7 | 0x0B, + 33156 - 19968: jis0212<<14 | 0x35<<7 | 0x26, + 33157 - 19968: jis0212<<14 | 0x35<<7 | 0x27, + 33158 - 19968: jis0212<<14 | 0x35<<7 | 0x28, + 33160 - 19968: jis0208<<14 | 0x46<<7 | 0x0C, + 33162 - 19968: jis0208<<14 | 0x46<<7 | 0x0D, + 33163 - 19968: jis0212<<14 | 0x35<<7 | 0x29, + 33166 - 19968: jis0212<<14 | 0x35<<7 | 0x2A, + 33167 - 19968: jis0208<<14 | 0x18<<7 | 0x30, + 33168 - 19968: jis0212<<14 | 0x35<<7 | 0x25, + 33171 - 19968: jis0208<<14 | 0x46<<7 | 0x15, + 33173 - 19968: jis0208<<14 | 0x46<<7 | 0x11, + 33174 - 19968: jis0212<<14 | 0x35<<7 | 0x2B, + 33176 - 19968: jis0212<<14 | 0x35<<7 | 0x2C, + 33178 - 19968: jis0208<<14 | 0x28<<7 | 0x45, + 33179 - 19968: jis0212<<14 | 0x35<<7 | 0x2D, + 33180 - 19968: jis0208<<14 | 0x2A<<7 | 0x4B, + 33181 - 19968: jis0208<<14 | 0x28<<7 | 0x07, + 33182 - 19968: jis0212<<14 | 0x35<<7 | 0x2E, + 33184 - 19968: jis0208<<14 | 0x46<<7 | 0x10, + 33186 - 19968: jis0212<<14 | 0x35<<7 | 0x2F, + 33187 - 19968: jis0208<<14 | 0x46<<7 | 0x13, + 33188 - 19968: jis0208<<14 | 0x46<<7 | 0x12, + 33192 - 19968: jis0208<<14 | 0x2A<<7 | 0x23, + 33193 - 19968: jis0208<<14 | 0x46<<7 | 0x16, + 33198 - 19968: jis0212<<14 | 0x35<<7 | 0x30, + 33200 - 19968: jis0208<<14 | 0x46<<7 | 0x17, + 33202 - 19968: jis0212<<14 | 0x35<<7 | 0x31, + 33203 - 19968: jis0208<<14 | 0x20<<7 | 0x16, + 33204 - 19968: jis0212<<14 | 0x35<<7 | 0x32, + 33205 - 19968: jis0208<<14 | 0x46<<7 | 0x18, + 33208 - 19968: jis0208<<14 | 0x46<<7 | 0x1A, + 33210 - 19968: jis0208<<14 | 0x46<<7 | 0x1E, + 33211 - 19968: jis0212<<14 | 0x35<<7 | 0x33, + 33213 - 19968: jis0208<<14 | 0x46<<7 | 0x1B, + 33214 - 19968: jis0208<<14 | 0x46<<7 | 0x19, + 33215 - 19968: jis0208<<14 | 0x26<<7 | 0x1E, + 33216 - 19968: jis0208<<14 | 0x46<<7 | 0x1C, + 33218 - 19968: jis0208<<14 | 0x46<<7 | 0x1D, + 33219 - 19968: jis0212<<14 | 0x35<<7 | 0x35, + 33221 - 19968: jis0212<<14 | 0x35<<7 | 0x36, + 33222 - 19968: jis0208<<14 | 0x11<<7 | 0x11, + 33224 - 19968: jis0208<<14 | 0x46<<7 | 0x24, + 33225 - 19968: jis0208<<14 | 0x46<<7 | 0x1F, + 33226 - 19968: jis0212<<14 | 0x35<<7 | 0x37, + 33227 - 19968: jis0212<<14 | 0x35<<7 | 0x34, + 33229 - 19968: jis0208<<14 | 0x46<<7 | 0x20, + 33230 - 19968: jis0212<<14 | 0x35<<7 | 0x38, + 33231 - 19968: jis0212<<14 | 0x35<<7 | 0x39, + 33233 - 19968: jis0208<<14 | 0x46<<7 | 0x21, + 33235 - 19968: jis0208<<14 | 0x21<<7 | 0x00, + 33237 - 19968: jis0212<<14 | 0x35<<7 | 0x3A, + 33239 - 19968: jis0212<<14 | 0x35<<7 | 0x3B, + 33240 - 19968: jis0208<<14 | 0x46<<7 | 0x23, + 33241 - 19968: jis0208<<14 | 0x46<<7 | 0x22, + 33242 - 19968: jis0208<<14 | 0x46<<7 | 0x25, + 33243 - 19968: jis0212<<14 | 0x35<<7 | 0x3C, + 33245 - 19968: jis0212<<14 | 0x35<<7 | 0x3D, + 33246 - 19968: jis0212<<14 | 0x35<<7 | 0x3E, + 33247 - 19968: jis0208<<14 | 0x46<<7 | 0x26, + 33248 - 19968: jis0208<<14 | 0x46<<7 | 0x27, + 33249 - 19968: jis0212<<14 | 0x35<<7 | 0x3F, + 33251 - 19968: jis0208<<14 | 0x1E<<7 | 0x22, + 33252 - 19968: jis0212<<14 | 0x35<<7 | 0x40, + 33253 - 19968: jis0208<<14 | 0x11<<7 | 0x48, + 33255 - 19968: jis0208<<14 | 0x46<<7 | 0x28, + 33256 - 19968: jis0208<<14 | 0x2D<<7 | 0x36, + 33258 - 19968: jis0208<<14 | 0x1B<<7 | 0x0A, + 33259 - 19968: jis0212<<14 | 0x35<<7 | 0x41, + 33260 - 19968: jis0212<<14 | 0x35<<7 | 0x42, + 33261 - 19968: jis0208<<14 | 0x1C<<7 | 0x0C, + 33264 - 19968: jis0212<<14 | 0x35<<7 | 0x43, + 33265 - 19968: jis0212<<14 | 0x35<<7 | 0x44, + 33266 - 19968: jis0212<<14 | 0x35<<7 | 0x45, + 33267 - 19968: jis0208<<14 | 0x1A<<7 | 0x49, + 33268 - 19968: jis0208<<14 | 0x22<<7 | 0x36, + 33269 - 19968: jis0212<<14 | 0x35<<7 | 0x46, + 33270 - 19968: jis0212<<14 | 0x35<<7 | 0x47, + 33272 - 19968: jis0212<<14 | 0x35<<7 | 0x48, + 33273 - 19968: jis0212<<14 | 0x35<<7 | 0x49, + 33274 - 19968: jis0208<<14 | 0x46<<7 | 0x29, + 33275 - 19968: jis0208<<14 | 0x46<<7 | 0x2A, + 33276 - 19968: jis0208<<14 | 0x10<<7 | 0x10, + 33277 - 19968: jis0212<<14 | 0x35<<7 | 0x4A, + 33278 - 19968: jis0208<<14 | 0x46<<7 | 0x2B, + 33279 - 19968: jis0212<<14 | 0x35<<7 | 0x4B, + 33280 - 19968: jis0212<<14 | 0x35<<7 | 0x4C, + 33281 - 19968: jis0208<<14 | 0x46<<7 | 0x2C, + 33282 - 19968: jis0208<<14 | 0x46<<7 | 0x2D, + 33283 - 19968: jis0212<<14 | 0x35<<7 | 0x4D, + 33285 - 19968: jis0208<<14 | 0x46<<7 | 0x2E, + 33287 - 19968: jis0208<<14 | 0x46<<7 | 0x2F, + 33288 - 19968: jis0208<<14 | 0x15<<7 | 0x1C, + 33289 - 19968: jis0208<<14 | 0x39<<7 | 0x09, + 33290 - 19968: jis0208<<14 | 0x46<<7 | 0x30, + 33292 - 19968: jis0208<<14 | 0x1F<<7 | 0x44, + 33293 - 19968: jis0208<<14 | 0x46<<7 | 0x31, + 33294 - 19968: jis0208<<14 | 0x1B<<7 | 0x2A, + 33295 - 19968: jis0212<<14 | 0x35<<7 | 0x4E, + 33296 - 19968: jis0208<<14 | 0x46<<7 | 0x32, + 33298 - 19968: jis0208<<14 | 0x2F<<7 | 0x0F, + 33299 - 19968: jis0212<<14 | 0x35<<7 | 0x4F, + 33300 - 19968: jis0212<<14 | 0x35<<7 | 0x50, + 33302 - 19968: jis0208<<14 | 0x46<<7 | 0x33, + 33303 - 19968: jis0208<<14 | 0x29<<7 | 0x3D, + 33304 - 19968: jis0208<<14 | 0x13<<7 | 0x3B, + 33305 - 19968: jis0212<<14 | 0x35<<7 | 0x51, + 33306 - 19968: jis0212<<14 | 0x35<<7 | 0x52, + 33307 - 19968: jis0208<<14 | 0x20<<7 | 0x03, + 33308 - 19968: jis0208<<14 | 0x1C<<7 | 0x37, + 33309 - 19968: jis0212<<14 | 0x35<<7 | 0x53, + 33310 - 19968: jis0208<<14 | 0x28<<7 | 0x50, + 33311 - 19968: jis0208<<14 | 0x1C<<7 | 0x0D, + 33313 - 19968: jis0212<<14 | 0x35<<7 | 0x54, + 33314 - 19968: jis0212<<14 | 0x35<<7 | 0x55, + 33320 - 19968: jis0212<<14 | 0x35<<7 | 0x56, + 33321 - 19968: jis0208<<14 | 0x46<<7 | 0x34, + 33322 - 19968: jis0208<<14 | 0x18<<7 | 0x31, + 33323 - 19968: jis0208<<14 | 0x46<<7 | 0x35, + 33324 - 19968: jis0208<<14 | 0x27<<7 | 0x2B, + 33326 - 19968: jis0208<<14 | 0x46<<7 | 0x43, + 33330 - 19968: jis0212<<14 | 0x35<<7 | 0x57, + 33331 - 19968: jis0208<<14 | 0x46<<7 | 0x37, + 33332 - 19968: jis0212<<14 | 0x35<<7 | 0x58, + 33333 - 19968: jis0208<<14 | 0x21<<7 | 0x28, + 33334 - 19968: jis0208<<14 | 0x26<<7 | 0x54, + 33335 - 19968: jis0208<<14 | 0x17<<7 | 0x1E, + 33336 - 19968: jis0208<<14 | 0x46<<7 | 0x36, + 33337 - 19968: jis0208<<14 | 0x20<<7 | 0x04, + 33338 - 19968: jis0212<<14 | 0x35<<7 | 0x59, + 33344 - 19968: jis0208<<14 | 0x46<<7 | 0x38, + 33347 - 19968: jis0212<<14 | 0x35<<7 | 0x5A, + 33348 - 19968: jis0212<<14 | 0x35<<7 | 0x5B, + 33349 - 19968: jis0212<<14 | 0x35<<7 | 0x5C, + 33350 - 19968: jis0212<<14 | 0x35<<7 | 0x5D, + 33351 - 19968: jis0208<<14 | 0x23<<7 | 0x59, + 33355 - 19968: jis0212<<14 | 0x36<<7 | 0x00, + 33358 - 19968: jis0212<<14 | 0x36<<7 | 0x01, + 33359 - 19968: jis0212<<14 | 0x36<<7 | 0x02, + 33361 - 19968: jis0212<<14 | 0x36<<7 | 0x03, + 33366 - 19968: jis0212<<14 | 0x36<<7 | 0x04, + 33368 - 19968: jis0208<<14 | 0x46<<7 | 0x3A, + 33369 - 19968: jis0208<<14 | 0x46<<7 | 0x39, + 33370 - 19968: jis0208<<14 | 0x46<<7 | 0x3C, + 33372 - 19968: jis0212<<14 | 0x36<<7 | 0x05, + 33373 - 19968: jis0208<<14 | 0x46<<7 | 0x3B, + 33375 - 19968: jis0208<<14 | 0x46<<7 | 0x3D, + 33376 - 19968: jis0212<<14 | 0x36<<7 | 0x06, + 33378 - 19968: jis0208<<14 | 0x46<<7 | 0x3F, + 33379 - 19968: jis0212<<14 | 0x36<<7 | 0x07, + 33380 - 19968: jis0208<<14 | 0x46<<7 | 0x3E, + 33382 - 19968: jis0208<<14 | 0x13<<7 | 0x2E, + 33383 - 19968: jis0212<<14 | 0x36<<7 | 0x08, + 33384 - 19968: jis0208<<14 | 0x46<<7 | 0x40, + 33386 - 19968: jis0208<<14 | 0x46<<7 | 0x41, + 33387 - 19968: jis0208<<14 | 0x46<<7 | 0x42, + 33389 - 19968: jis0212<<14 | 0x36<<7 | 0x09, + 33390 - 19968: jis0208<<14 | 0x19<<7 | 0x10, + 33391 - 19968: jis0208<<14 | 0x2D<<7 | 0x28, + 33393 - 19968: jis0208<<14 | 0x46<<7 | 0x44, + 33394 - 19968: jis0208<<14 | 0x1E<<7 | 0x06, + 33396 - 19968: jis0212<<14 | 0x36<<7 | 0x0A, + 33398 - 19968: jis0208<<14 | 0x10<<7 | 0x4F, + 33399 - 19968: jis0208<<14 | 0x46<<7 | 0x45, + 33400 - 19968: jis0208<<14 | 0x46<<7 | 0x46, + 33403 - 19968: jis0212<<14 | 0x36<<7 | 0x0B, + 33405 - 19968: jis0212<<14 | 0x36<<7 | 0x0C, + 33406 - 19968: jis0208<<14 | 0x46<<7 | 0x47, + 33407 - 19968: jis0212<<14 | 0x36<<7 | 0x0D, + 33408 - 19968: jis0212<<14 | 0x36<<7 | 0x0E, + 33409 - 19968: jis0212<<14 | 0x36<<7 | 0x0F, + 33411 - 19968: jis0212<<14 | 0x36<<7 | 0x10, + 33412 - 19968: jis0212<<14 | 0x36<<7 | 0x11, + 33415 - 19968: jis0212<<14 | 0x36<<7 | 0x12, + 33417 - 19968: jis0212<<14 | 0x36<<7 | 0x13, + 33418 - 19968: jis0212<<14 | 0x36<<7 | 0x14, + 33419 - 19968: jis0208<<14 | 0x0F<<7 | 0x51, + 33421 - 19968: jis0208<<14 | 0x46<<7 | 0x48, + 33422 - 19968: jis0212<<14 | 0x36<<7 | 0x15, + 33425 - 19968: jis0212<<14 | 0x36<<7 | 0x16, + 33426 - 19968: jis0208<<14 | 0x46<<7 | 0x49, + 33428 - 19968: jis0212<<14 | 0x36<<7 | 0x17, + 33430 - 19968: jis0212<<14 | 0x36<<7 | 0x18, + 33432 - 19968: jis0212<<14 | 0x36<<7 | 0x19, + 33433 - 19968: jis0208<<14 | 0x28<<7 | 0x46, + 33434 - 19968: jis0212<<14 | 0x36<<7 | 0x1A, + 33435 - 19968: jis0212<<14 | 0x36<<7 | 0x1B, + 33437 - 19968: jis0208<<14 | 0x1B<<7 | 0x26, + 33439 - 19968: jis0208<<14 | 0x46<<7 | 0x4B, + 33440 - 19968: jis0212<<14 | 0x36<<7 | 0x1C, + 33441 - 19968: jis0212<<14 | 0x36<<7 | 0x1D, + 33443 - 19968: jis0212<<14 | 0x36<<7 | 0x1E, + 33444 - 19968: jis0212<<14 | 0x36<<7 | 0x1F, + 33445 - 19968: jis0208<<14 | 0x12<<7 | 0x08, + 33446 - 19968: jis0208<<14 | 0x0F<<7 | 0x11, + 33447 - 19968: jis0212<<14 | 0x36<<7 | 0x20, + 33448 - 19968: jis0212<<14 | 0x36<<7 | 0x21, + 33449 - 19968: jis0212<<14 | 0x36<<7 | 0x22, + 33450 - 19968: jis0212<<14 | 0x36<<7 | 0x23, + 33451 - 19968: jis0208<<14 | 0x46<<7 | 0x4A, + 33452 - 19968: jis0208<<14 | 0x46<<7 | 0x4D, + 33453 - 19968: jis0208<<14 | 0x26<<7 | 0x2D, + 33454 - 19968: jis0212<<14 | 0x36<<7 | 0x24, + 33455 - 19968: jis0208<<14 | 0x1E<<7 | 0x23, + 33456 - 19968: jis0212<<14 | 0x36<<7 | 0x25, + 33457 - 19968: jis0208<<14 | 0x11<<7 | 0x35, + 33458 - 19968: jis0212<<14 | 0x36<<7 | 0x26, + 33459 - 19968: jis0208<<14 | 0x2A<<7 | 0x06, + 33460 - 19968: jis0212<<14 | 0x36<<7 | 0x27, + 33463 - 19968: jis0212<<14 | 0x36<<7 | 0x28, + 33464 - 19968: jis0208<<14 | 0x16<<7 | 0x3C, + 33465 - 19968: jis0208<<14 | 0x15<<7 | 0x3B, + 33466 - 19968: jis0212<<14 | 0x36<<7 | 0x29, + 33467 - 19968: jis0208<<14 | 0x46<<7 | 0x4C, + 33468 - 19968: jis0212<<14 | 0x36<<7 | 0x2A, + 33469 - 19968: jis0208<<14 | 0x11<<7 | 0x49, + 33470 - 19968: jis0212<<14 | 0x36<<7 | 0x2B, + 33471 - 19968: jis0212<<14 | 0x36<<7 | 0x2C, + 33477 - 19968: jis0208<<14 | 0x13<<7 | 0x02, + 33478 - 19968: jis0212<<14 | 0x36<<7 | 0x2D, + 33488 - 19968: jis0212<<14 | 0x36<<7 | 0x2E, + 33489 - 19968: jis0208<<14 | 0x10<<7 | 0x50, + 33490 - 19968: jis0208<<14 | 0x46<<7 | 0x51, + 33491 - 19968: jis0208<<14 | 0x2D<<7 | 0x49, + 33492 - 19968: jis0208<<14 | 0x21<<7 | 0x3C, + 33493 - 19968: jis0212<<14 | 0x36<<7 | 0x2F, + 33495 - 19968: jis0208<<14 | 0x28<<7 | 0x23, + 33497 - 19968: jis0208<<14 | 0x46<<7 | 0x5D, + 33498 - 19968: jis0212<<14 | 0x36<<7 | 0x30, + 33499 - 19968: jis0208<<14 | 0x11<<7 | 0x36, + 33500 - 19968: jis0208<<14 | 0x46<<7 | 0x5B, + 33502 - 19968: jis0208<<14 | 0x46<<7 | 0x59, + 33503 - 19968: jis0208<<14 | 0x46<<7 | 0x50, + 33504 - 19968: jis0212<<14 | 0x36<<7 | 0x31, + 33505 - 19968: jis0208<<14 | 0x46<<7 | 0x4E, + 33506 - 19968: jis0212<<14 | 0x36<<7 | 0x32, + 33507 - 19968: jis0208<<14 | 0x46<<7 | 0x4F, + 33508 - 19968: jis0212<<14 | 0x36<<7 | 0x33, + 33509 - 19968: jis0208<<14 | 0x1B<<7 | 0x42, + 33510 - 19968: jis0208<<14 | 0x15<<7 | 0x4B, + 33511 - 19968: jis0208<<14 | 0x22<<7 | 0x56, + 33512 - 19968: jis0212<<14 | 0x36<<7 | 0x34, + 33514 - 19968: jis0212<<14 | 0x36<<7 | 0x35, + 33515 - 19968: jis0208<<14 | 0x25<<7 | 0x30, + 33517 - 19968: jis0212<<14 | 0x36<<7 | 0x36, + 33519 - 19968: jis0212<<14 | 0x36<<7 | 0x37, + 33521 - 19968: jis0208<<14 | 0x10<<7 | 0x30, + 33523 - 19968: jis0208<<14 | 0x46<<7 | 0x53, + 33524 - 19968: jis0208<<14 | 0x46<<7 | 0x52, + 33526 - 19968: jis0212<<14 | 0x36<<7 | 0x38, + 33527 - 19968: jis0212<<14 | 0x36<<7 | 0x39, + 33529 - 19968: jis0208<<14 | 0x46<<7 | 0x58, + 33530 - 19968: jis0208<<14 | 0x46<<7 | 0x54, + 33531 - 19968: jis0208<<14 | 0x46<<7 | 0x57, + 33533 - 19968: jis0212<<14 | 0x36<<7 | 0x3A, + 33534 - 19968: jis0212<<14 | 0x36<<7 | 0x3B, + 33536 - 19968: jis0212<<14 | 0x36<<7 | 0x3C, + 33537 - 19968: jis0208<<14 | 0x5A<<7 | 0x36, + 33538 - 19968: jis0208<<14 | 0x2B<<7 | 0x2F, + 33539 - 19968: jis0208<<14 | 0x46<<7 | 0x56, + 33540 - 19968: jis0208<<14 | 0x11<<7 | 0x37, + 33541 - 19968: jis0208<<14 | 0x12<<7 | 0x5C, + 33542 - 19968: jis0208<<14 | 0x46<<7 | 0x5A, + 33543 - 19968: jis0212<<14 | 0x36<<7 | 0x3E, + 33544 - 19968: jis0212<<14 | 0x36<<7 | 0x3F, + 33545 - 19968: jis0208<<14 | 0x46<<7 | 0x5C, + 33546 - 19968: jis0212<<14 | 0x36<<7 | 0x40, + 33547 - 19968: jis0212<<14 | 0x36<<7 | 0x41, + 33550 - 19968: jis0208<<14 | 0x16<<7 | 0x33, + 33558 - 19968: jis0208<<14 | 0x47<<7 | 0x02, + 33559 - 19968: jis0208<<14 | 0x47<<7 | 0x0B, + 33560 - 19968: jis0208<<14 | 0x47<<7 | 0x0C, + 33563 - 19968: jis0212<<14 | 0x36<<7 | 0x43, + 33564 - 19968: jis0208<<14 | 0x0F<<7 | 0x0A, + 33565 - 19968: jis0212<<14 | 0x36<<7 | 0x44, + 33566 - 19968: jis0212<<14 | 0x36<<7 | 0x45, + 33567 - 19968: jis0212<<14 | 0x36<<7 | 0x46, + 33569 - 19968: jis0212<<14 | 0x36<<7 | 0x47, + 33570 - 19968: jis0212<<14 | 0x36<<7 | 0x48, + 33571 - 19968: jis0208<<14 | 0x47<<7 | 0x13, + 33576 - 19968: jis0208<<14 | 0x0F<<7 | 0x50, + 33579 - 19968: jis0208<<14 | 0x47<<7 | 0x0A, + 33580 - 19968: jis0212<<14 | 0x36<<7 | 0x49, + 33581 - 19968: jis0212<<14 | 0x36<<7 | 0x4A, + 33582 - 19968: jis0212<<14 | 0x36<<7 | 0x4B, + 33583 - 19968: jis0208<<14 | 0x47<<7 | 0x09, + 33584 - 19968: jis0212<<14 | 0x36<<7 | 0x4C, + 33585 - 19968: jis0208<<14 | 0x47<<7 | 0x04, + 33586 - 19968: jis0208<<14 | 0x47<<7 | 0x03, + 33587 - 19968: jis0212<<14 | 0x36<<7 | 0x4D, + 33588 - 19968: jis0208<<14 | 0x47<<7 | 0x01, + 33589 - 19968: jis0208<<14 | 0x47<<7 | 0x00, + 33590 - 19968: jis0208<<14 | 0x22<<7 | 0x42, + 33591 - 19968: jis0212<<14 | 0x36<<7 | 0x4E, + 33592 - 19968: jis0208<<14 | 0x21<<7 | 0x5A, + 33593 - 19968: jis0208<<14 | 0x47<<7 | 0x06, + 33594 - 19968: jis0212<<14 | 0x36<<7 | 0x4F, + 33596 - 19968: jis0212<<14 | 0x36<<7 | 0x50, + 33597 - 19968: jis0212<<14 | 0x36<<7 | 0x51, + 33600 - 19968: jis0208<<14 | 0x47<<7 | 0x05, + 33602 - 19968: jis0212<<14 | 0x36<<7 | 0x52, + 33603 - 19968: jis0212<<14 | 0x36<<7 | 0x53, + 33604 - 19968: jis0212<<14 | 0x36<<7 | 0x54, + 33605 - 19968: jis0208<<14 | 0x47<<7 | 0x08, + 33607 - 19968: jis0212<<14 | 0x36<<7 | 0x55, + 33609 - 19968: jis0208<<14 | 0x20<<7 | 0x4F, + 33610 - 19968: jis0208<<14 | 0x16<<7 | 0x34, + 33613 - 19968: jis0212<<14 | 0x36<<7 | 0x56, + 33614 - 19968: jis0212<<14 | 0x36<<7 | 0x57, + 33615 - 19968: jis0208<<14 | 0x10<<7 | 0x20, + 33616 - 19968: jis0208<<14 | 0x47<<7 | 0x07, + 33617 - 19968: jis0212<<14 | 0x36<<7 | 0x58, + 33618 - 19968: jis0208<<14 | 0x18<<7 | 0x32, + 33619 - 19968: jis0212<<14 | 0x37<<7 | 0x1D, + 33620 - 19968: jis0212<<14 | 0x36<<7 | 0x42, + 33621 - 19968: jis0212<<14 | 0x36<<7 | 0x59, + 33622 - 19968: jis0212<<14 | 0x36<<7 | 0x5A, + 33623 - 19968: jis0212<<14 | 0x36<<7 | 0x5B, + 33624 - 19968: jis0208<<14 | 0x20<<7 | 0x50, + 33634 - 19968: jis0208<<14 | 0x5A<<7 | 0x37, + 33648 - 19968: jis0212<<14 | 0x36<<7 | 0x5C, + 33651 - 19968: jis0208<<14 | 0x47<<7 | 0x19, + 33653 - 19968: jis0208<<14 | 0x47<<7 | 0x1A, + 33655 - 19968: jis0208<<14 | 0x11<<7 | 0x38, + 33656 - 19968: jis0212<<14 | 0x36<<7 | 0x5D, + 33659 - 19968: jis0208<<14 | 0x11<<7 | 0x0D, + 33660 - 19968: jis0208<<14 | 0x47<<7 | 0x17, + 33661 - 19968: jis0212<<14 | 0x37<<7 | 0x00, + 33663 - 19968: jis0208<<14 | 0x5A<<7 | 0x38, + 33664 - 19968: jis0212<<14 | 0x37<<7 | 0x02, + 33666 - 19968: jis0212<<14 | 0x37<<7 | 0x03, + 33668 - 19968: jis0212<<14 | 0x37<<7 | 0x04, + 33669 - 19968: jis0208<<14 | 0x47<<7 | 0x0D, + 33670 - 19968: jis0212<<14 | 0x37<<7 | 0x05, + 33671 - 19968: jis0208<<14 | 0x47<<7 | 0x15, + 33673 - 19968: jis0208<<14 | 0x47<<7 | 0x1C, + 33674 - 19968: jis0208<<14 | 0x47<<7 | 0x16, + 33677 - 19968: jis0212<<14 | 0x37<<7 | 0x06, + 33678 - 19968: jis0208<<14 | 0x47<<7 | 0x14, + 33682 - 19968: jis0212<<14 | 0x37<<7 | 0x07, + 33683 - 19968: jis0208<<14 | 0x46<<7 | 0x55, + 33684 - 19968: jis0212<<14 | 0x37<<7 | 0x08, + 33685 - 19968: jis0212<<14 | 0x37<<7 | 0x09, + 33686 - 19968: jis0208<<14 | 0x47<<7 | 0x12, + 33688 - 19968: jis0212<<14 | 0x37<<7 | 0x0A, + 33689 - 19968: jis0212<<14 | 0x37<<7 | 0x0B, + 33690 - 19968: jis0208<<14 | 0x47<<7 | 0x0E, + 33691 - 19968: jis0212<<14 | 0x37<<7 | 0x0C, + 33692 - 19968: jis0212<<14 | 0x37<<7 | 0x0D, + 33693 - 19968: jis0212<<14 | 0x37<<7 | 0x0E, + 33694 - 19968: jis0208<<14 | 0x13<<7 | 0x2F, + 33695 - 19968: jis0208<<14 | 0x47<<7 | 0x10, + 33696 - 19968: jis0208<<14 | 0x47<<7 | 0x1B, + 33698 - 19968: jis0208<<14 | 0x47<<7 | 0x11, + 33702 - 19968: jis0212<<14 | 0x37<<7 | 0x0F, + 33703 - 19968: jis0212<<14 | 0x37<<7 | 0x10, + 33704 - 19968: jis0208<<14 | 0x47<<7 | 0x1D, + 33705 - 19968: jis0212<<14 | 0x37<<7 | 0x11, + 33706 - 19968: jis0208<<14 | 0x47<<7 | 0x0F, + 33707 - 19968: jis0208<<14 | 0x26<<7 | 0x5B, + 33708 - 19968: jis0212<<14 | 0x37<<7 | 0x12, + 33709 - 19968: jis0212<<14 | 0x37<<7 | 0x2B, + 33713 - 19968: jis0208<<14 | 0x2C<<7 | 0x48, + 33717 - 19968: jis0208<<14 | 0x47<<7 | 0x18, + 33725 - 19968: jis0208<<14 | 0x47<<7 | 0x2E, + 33726 - 19968: jis0212<<14 | 0x37<<7 | 0x13, + 33727 - 19968: jis0212<<14 | 0x37<<7 | 0x14, + 33728 - 19968: jis0212<<14 | 0x37<<7 | 0x15, + 33729 - 19968: jis0208<<14 | 0x47<<7 | 0x26, + 33733 - 19968: jis0208<<14 | 0x1E<<7 | 0x5A, + 33735 - 19968: jis0208<<14 | 0x5A<<7 | 0x39, + 33737 - 19968: jis0212<<14 | 0x37<<7 | 0x17, + 33738 - 19968: jis0208<<14 | 0x14<<7 | 0x25, + 33740 - 19968: jis0208<<14 | 0x15<<7 | 0x3C, + 33742 - 19968: jis0208<<14 | 0x47<<7 | 0x21, + 33743 - 19968: jis0212<<14 | 0x37<<7 | 0x18, + 33744 - 19968: jis0212<<14 | 0x37<<7 | 0x19, + 33745 - 19968: jis0212<<14 | 0x37<<7 | 0x1A, + 33747 - 19968: jis0208<<14 | 0x11<<7 | 0x3A, + 33748 - 19968: jis0212<<14 | 0x37<<7 | 0x1B, + 33750 - 19968: jis0208<<14 | 0x1D<<7 | 0x33, + 33752 - 19968: jis0208<<14 | 0x47<<7 | 0x24, + 33756 - 19968: jis0208<<14 | 0x19<<7 | 0x39, + 33757 - 19968: jis0212<<14 | 0x37<<7 | 0x1C, + 33759 - 19968: jis0208<<14 | 0x24<<7 | 0x30, + 33760 - 19968: jis0208<<14 | 0x47<<7 | 0x29, + 33768 - 19968: jis0212<<14 | 0x37<<7 | 0x1E, + 33769 - 19968: jis0208<<14 | 0x29<<7 | 0x4D, + 33770 - 19968: jis0212<<14 | 0x37<<7 | 0x1F, + 33771 - 19968: jis0208<<14 | 0x47<<7 | 0x20, + 33775 - 19968: jis0208<<14 | 0x11<<7 | 0x39, + 33776 - 19968: jis0208<<14 | 0x17<<7 | 0x35, + 33777 - 19968: jis0208<<14 | 0x28<<7 | 0x08, + 33778 - 19968: jis0208<<14 | 0x47<<7 | 0x2A, + 33780 - 19968: jis0208<<14 | 0x47<<7 | 0x1E, + 33782 - 19968: jis0208<<14 | 0x5A<<7 | 0x3A, + 33783 - 19968: jis0208<<14 | 0x47<<7 | 0x27, + 33784 - 19968: jis0212<<14 | 0x37<<7 | 0x21, + 33785 - 19968: jis0212<<14 | 0x37<<7 | 0x22, + 33787 - 19968: jis0208<<14 | 0x47<<7 | 0x31, + 33788 - 19968: jis0212<<14 | 0x37<<7 | 0x23, + 33789 - 19968: jis0208<<14 | 0x47<<7 | 0x22, + 33793 - 19968: jis0212<<14 | 0x37<<7 | 0x24, + 33795 - 19968: jis0208<<14 | 0x47<<7 | 0x23, + 33796 - 19968: jis0208<<14 | 0x25<<7 | 0x19, + 33798 - 19968: jis0212<<14 | 0x37<<7 | 0x25, + 33799 - 19968: jis0208<<14 | 0x47<<7 | 0x28, + 33802 - 19968: jis0212<<14 | 0x37<<7 | 0x26, + 33803 - 19968: jis0208<<14 | 0x47<<7 | 0x25, + 33804 - 19968: jis0208<<14 | 0x2A<<7 | 0x07, + 33805 - 19968: jis0208<<14 | 0x47<<7 | 0x2B, + 33806 - 19968: jis0208<<14 | 0x0F<<7 | 0x3F, + 33807 - 19968: jis0212<<14 | 0x37<<7 | 0x27, + 33809 - 19968: jis0212<<14 | 0x37<<7 | 0x28, + 33811 - 19968: jis0208<<14 | 0x47<<7 | 0x1F, + 33813 - 19968: jis0212<<14 | 0x37<<7 | 0x29, + 33817 - 19968: jis0212<<14 | 0x37<<7 | 0x2A, + 33824 - 19968: jis0208<<14 | 0x47<<7 | 0x2D, + 33826 - 19968: jis0208<<14 | 0x47<<7 | 0x2C, + 33833 - 19968: jis0208<<14 | 0x26<<7 | 0x4A, + 33834 - 19968: jis0208<<14 | 0x47<<7 | 0x33, + 33836 - 19968: jis0208<<14 | 0x47<<7 | 0x3E, + 33839 - 19968: jis0212<<14 | 0x37<<7 | 0x2C, + 33841 - 19968: jis0208<<14 | 0x12<<7 | 0x5D, + 33845 - 19968: jis0208<<14 | 0x47<<7 | 0x41, + 33848 - 19968: jis0208<<14 | 0x47<<7 | 0x2F, + 33849 - 19968: jis0212<<14 | 0x37<<7 | 0x2D, + 33852 - 19968: jis0208<<14 | 0x47<<7 | 0x34, + 33853 - 19968: jis0208<<14 | 0x2C<<7 | 0x4D, + 33861 - 19968: jis0212<<14 | 0x37<<7 | 0x2E, + 33862 - 19968: jis0208<<14 | 0x47<<7 | 0x3D, + 33863 - 19968: jis0212<<14 | 0x37<<7 | 0x2F, + 33864 - 19968: jis0208<<14 | 0x5A<<7 | 0x3B, + 33865 - 19968: jis0208<<14 | 0x2C<<7 | 0x34, + 33866 - 19968: jis0212<<14 | 0x37<<7 | 0x31, + 33869 - 19968: jis0212<<14 | 0x37<<7 | 0x32, + 33870 - 19968: jis0208<<14 | 0x2D<<7 | 0x09, + 33871 - 19968: jis0212<<14 | 0x37<<7 | 0x33, + 33873 - 19968: jis0212<<14 | 0x37<<7 | 0x34, + 33874 - 19968: jis0212<<14 | 0x37<<7 | 0x35, + 33878 - 19968: jis0212<<14 | 0x37<<7 | 0x36, + 33879 - 19968: jis0208<<14 | 0x22<<7 | 0x57, + 33880 - 19968: jis0212<<14 | 0x37<<7 | 0x37, + 33881 - 19968: jis0212<<14 | 0x37<<7 | 0x38, + 33882 - 19968: jis0212<<14 | 0x37<<7 | 0x39, + 33883 - 19968: jis0208<<14 | 0x12<<7 | 0x4A, + 33884 - 19968: jis0212<<14 | 0x37<<7 | 0x3A, + 33888 - 19968: jis0212<<14 | 0x37<<7 | 0x3B, + 33889 - 19968: jis0208<<14 | 0x28<<7 | 0x51, + 33890 - 19968: jis0208<<14 | 0x47<<7 | 0x43, + 33891 - 19968: jis0208<<14 | 0x25<<7 | 0x00, + 33892 - 19968: jis0212<<14 | 0x37<<7 | 0x3C, + 33893 - 19968: jis0212<<14 | 0x37<<7 | 0x3D, + 33894 - 19968: jis0208<<14 | 0x0F<<7 | 0x10, + 33895 - 19968: jis0212<<14 | 0x37<<7 | 0x3E, + 33897 - 19968: jis0208<<14 | 0x47<<7 | 0x3C, + 33898 - 19968: jis0212<<14 | 0x37<<7 | 0x3F, + 33899 - 19968: jis0208<<14 | 0x47<<7 | 0x38, + 33900 - 19968: jis0208<<14 | 0x20<<7 | 0x51, + 33901 - 19968: jis0208<<14 | 0x47<<7 | 0x32, + 33902 - 19968: jis0208<<14 | 0x47<<7 | 0x3A, + 33903 - 19968: jis0208<<14 | 0x47<<7 | 0x3F, + 33904 - 19968: jis0212<<14 | 0x37<<7 | 0x40, + 33905 - 19968: jis0208<<14 | 0x26<<7 | 0x0B, + 33907 - 19968: jis0212<<14 | 0x37<<7 | 0x41, + 33908 - 19968: jis0212<<14 | 0x37<<7 | 0x42, + 33909 - 19968: jis0208<<14 | 0x0F<<7 | 0x09, + 33910 - 19968: jis0212<<14 | 0x37<<7 | 0x43, + 33911 - 19968: jis0208<<14 | 0x47<<7 | 0x37, + 33912 - 19968: jis0212<<14 | 0x37<<7 | 0x44, + 33913 - 19968: jis0208<<14 | 0x47<<7 | 0x40, + 33914 - 19968: jis0208<<14 | 0x28<<7 | 0x57, + 33916 - 19968: jis0212<<14 | 0x37<<7 | 0x45, + 33917 - 19968: jis0212<<14 | 0x37<<7 | 0x46, + 33921 - 19968: jis0212<<14 | 0x37<<7 | 0x47, + 33922 - 19968: jis0208<<14 | 0x47<<7 | 0x3B, + 33924 - 19968: jis0208<<14 | 0x47<<7 | 0x36, + 33925 - 19968: jis0212<<14 | 0x37<<7 | 0x48, + 33931 - 19968: jis0208<<14 | 0x1D<<7 | 0x34, + 33936 - 19968: jis0208<<14 | 0x1C<<7 | 0x0E, + 33938 - 19968: jis0212<<14 | 0x37<<7 | 0x49, + 33939 - 19968: jis0212<<14 | 0x37<<7 | 0x4A, + 33940 - 19968: jis0208<<14 | 0x1B<<7 | 0x0B, + 33941 - 19968: jis0212<<14 | 0x37<<7 | 0x4B, + 33945 - 19968: jis0208<<14 | 0x2B<<7 | 0x37, + 33948 - 19968: jis0208<<14 | 0x28<<7 | 0x26, + 33950 - 19968: jis0212<<14 | 0x37<<7 | 0x4C, + 33951 - 19968: jis0208<<14 | 0x47<<7 | 0x46, + 33953 - 19968: jis0208<<14 | 0x47<<7 | 0x4F, + 33958 - 19968: jis0212<<14 | 0x37<<7 | 0x4D, + 33960 - 19968: jis0212<<14 | 0x37<<7 | 0x4E, + 33961 - 19968: jis0212<<14 | 0x37<<7 | 0x4F, + 33962 - 19968: jis0212<<14 | 0x37<<7 | 0x50, + 33965 - 19968: jis0208<<14 | 0x47<<7 | 0x39, + 33967 - 19968: jis0212<<14 | 0x37<<7 | 0x51, + 33969 - 19968: jis0212<<14 | 0x37<<7 | 0x52, + 33970 - 19968: jis0208<<14 | 0x12<<7 | 0x56, + 33972 - 19968: jis0208<<14 | 0x5A<<7 | 0x3C, + 33976 - 19968: jis0208<<14 | 0x1D<<7 | 0x57, + 33977 - 19968: jis0208<<14 | 0x47<<7 | 0x44, + 33978 - 19968: jis0212<<14 | 0x37<<7 | 0x54, + 33979 - 19968: jis0208<<14 | 0x47<<7 | 0x49, + 33980 - 19968: jis0208<<14 | 0x20<<7 | 0x52, + 33981 - 19968: jis0212<<14 | 0x37<<7 | 0x55, + 33982 - 19968: jis0212<<14 | 0x37<<7 | 0x56, + 33983 - 19968: jis0208<<14 | 0x47<<7 | 0x45, + 33984 - 19968: jis0212<<14 | 0x37<<7 | 0x57, + 33985 - 19968: jis0208<<14 | 0x47<<7 | 0x4C, + 33986 - 19968: jis0212<<14 | 0x37<<7 | 0x58, + 33988 - 19968: jis0208<<14 | 0x22<<7 | 0x3E, + 33990 - 19968: jis0208<<14 | 0x47<<7 | 0x4D, + 33991 - 19968: jis0212<<14 | 0x37<<7 | 0x59, + 33992 - 19968: jis0212<<14 | 0x37<<7 | 0x5A, + 33993 - 19968: jis0208<<14 | 0x2C<<7 | 0x35, + 33994 - 19968: jis0208<<14 | 0x47<<7 | 0x42, + 33995 - 19968: jis0208<<14 | 0x12<<7 | 0x17, + 33996 - 19968: jis0212<<14 | 0x37<<7 | 0x5B, + 33997 - 19968: jis0208<<14 | 0x47<<7 | 0x48, + 33999 - 19968: jis0212<<14 | 0x37<<7 | 0x5C, + 34000 - 19968: jis0208<<14 | 0x47<<7 | 0x4B, + 34001 - 19968: jis0208<<14 | 0x2B<<7 | 0x0B, + 34003 - 19968: jis0212<<14 | 0x37<<7 | 0x5D, + 34006 - 19968: jis0208<<14 | 0x47<<7 | 0x4E, + 34009 - 19968: jis0208<<14 | 0x47<<7 | 0x47, + 34010 - 19968: jis0208<<14 | 0x47<<7 | 0x4A, + 34012 - 19968: jis0208<<14 | 0x58<<7 | 0x04, + 34023 - 19968: jis0212<<14 | 0x38<<7 | 0x01, + 34026 - 19968: jis0212<<14 | 0x38<<7 | 0x02, + 34028 - 19968: jis0208<<14 | 0x2A<<7 | 0x08, + 34030 - 19968: jis0208<<14 | 0x2E<<7 | 0x00, + 34031 - 19968: jis0212<<14 | 0x38<<7 | 0x03, + 34032 - 19968: jis0212<<14 | 0x38<<7 | 0x04, + 34033 - 19968: jis0212<<14 | 0x38<<7 | 0x05, + 34034 - 19968: jis0212<<14 | 0x38<<7 | 0x06, + 34036 - 19968: jis0208<<14 | 0x47<<7 | 0x52, + 34039 - 19968: jis0212<<14 | 0x38<<7 | 0x07, + 34042 - 19968: jis0212<<14 | 0x38<<7 | 0x09, + 34043 - 19968: jis0212<<14 | 0x38<<7 | 0x0A, + 34044 - 19968: jis0208<<14 | 0x47<<7 | 0x59, + 34045 - 19968: jis0212<<14 | 0x38<<7 | 0x0B, + 34047 - 19968: jis0208<<14 | 0x47<<7 | 0x51, + 34048 - 19968: jis0208<<14 | 0x1B<<7 | 0x22, + 34050 - 19968: jis0212<<14 | 0x38<<7 | 0x0C, + 34051 - 19968: jis0212<<14 | 0x38<<7 | 0x0D, + 34054 - 19968: jis0208<<14 | 0x47<<7 | 0x30, + 34055 - 19968: jis0212<<14 | 0x38<<7 | 0x0E, + 34060 - 19968: jis0212<<14 | 0x38<<7 | 0x0F, + 34062 - 19968: jis0212<<14 | 0x38<<7 | 0x10, + 34064 - 19968: jis0212<<14 | 0x38<<7 | 0x11, + 34065 - 19968: jis0208<<14 | 0x29<<7 | 0x2D, + 34067 - 19968: jis0208<<14 | 0x2B<<7 | 0x01, + 34068 - 19968: jis0208<<14 | 0x47<<7 | 0x58, + 34069 - 19968: jis0208<<14 | 0x47<<7 | 0x57, + 34071 - 19968: jis0208<<14 | 0x47<<7 | 0x53, + 34072 - 19968: jis0208<<14 | 0x47<<7 | 0x54, + 34074 - 19968: jis0208<<14 | 0x10<<7 | 0x15, + 34076 - 19968: jis0212<<14 | 0x38<<7 | 0x12, + 34078 - 19968: jis0212<<14 | 0x38<<7 | 0x13, + 34079 - 19968: jis0208<<14 | 0x47<<7 | 0x56, + 34081 - 19968: jis0208<<14 | 0x47<<7 | 0x50, + 34082 - 19968: jis0212<<14 | 0x38<<7 | 0x14, + 34083 - 19968: jis0212<<14 | 0x38<<7 | 0x15, + 34084 - 19968: jis0212<<14 | 0x38<<7 | 0x16, + 34085 - 19968: jis0212<<14 | 0x38<<7 | 0x17, + 34086 - 19968: jis0208<<14 | 0x23<<7 | 0x34, + 34087 - 19968: jis0212<<14 | 0x38<<7 | 0x18, + 34090 - 19968: jis0212<<14 | 0x38<<7 | 0x19, + 34091 - 19968: jis0212<<14 | 0x38<<7 | 0x1A, + 34092 - 19968: jis0208<<14 | 0x47<<7 | 0x55, + 34093 - 19968: jis0208<<14 | 0x0F<<7 | 0x5D, + 34095 - 19968: jis0212<<14 | 0x38<<7 | 0x1B, + 34098 - 19968: jis0212<<14 | 0x38<<7 | 0x08, + 34099 - 19968: jis0212<<14 | 0x38<<7 | 0x1C, + 34100 - 19968: jis0212<<14 | 0x38<<7 | 0x1D, + 34101 - 19968: jis0208<<14 | 0x21<<7 | 0x01, + 34102 - 19968: jis0212<<14 | 0x38<<7 | 0x1E, + 34109 - 19968: jis0208<<14 | 0x29<<7 | 0x22, + 34111 - 19968: jis0212<<14 | 0x38<<7 | 0x1F, + 34112 - 19968: jis0208<<14 | 0x47<<7 | 0x5A, + 34113 - 19968: jis0208<<14 | 0x48<<7 | 0x00, + 34115 - 19968: jis0208<<14 | 0x27<<7 | 0x38, + 34118 - 19968: jis0212<<14 | 0x38<<7 | 0x20, + 34120 - 19968: jis0208<<14 | 0x47<<7 | 0x5D, + 34121 - 19968: jis0208<<14 | 0x1D<<7 | 0x35, + 34122 - 19968: jis0208<<14 | 0x1B<<7 | 0x28, + 34123 - 19968: jis0208<<14 | 0x48<<7 | 0x02, + 34126 - 19968: jis0208<<14 | 0x15<<7 | 0x1D, + 34127 - 19968: jis0212<<14 | 0x38<<7 | 0x21, + 34128 - 19968: jis0212<<14 | 0x38<<7 | 0x22, + 34129 - 19968: jis0212<<14 | 0x38<<7 | 0x23, + 34130 - 19968: jis0212<<14 | 0x38<<7 | 0x24, + 34131 - 19968: jis0208<<14 | 0x5A<<7 | 0x3D, + 34133 - 19968: jis0208<<14 | 0x48<<7 | 0x03, + 34134 - 19968: jis0212<<14 | 0x38<<7 | 0x26, + 34135 - 19968: jis0208<<14 | 0x28<<7 | 0x58, + 34136 - 19968: jis0208<<14 | 0x47<<7 | 0x5C, + 34137 - 19968: jis0208<<14 | 0x5A<<7 | 0x3E, + 34138 - 19968: jis0208<<14 | 0x47<<7 | 0x35, + 34140 - 19968: jis0212<<14 | 0x38<<7 | 0x28, + 34141 - 19968: jis0212<<14 | 0x38<<7 | 0x29, + 34142 - 19968: jis0212<<14 | 0x38<<7 | 0x2A, + 34143 - 19968: jis0212<<14 | 0x38<<7 | 0x2B, + 34144 - 19968: jis0212<<14 | 0x38<<7 | 0x2C, + 34145 - 19968: jis0212<<14 | 0x38<<7 | 0x2D, + 34146 - 19968: jis0212<<14 | 0x38<<7 | 0x2E, + 34147 - 19968: jis0208<<14 | 0x47<<7 | 0x5B, + 34148 - 19968: jis0212<<14 | 0x38<<7 | 0x2F, + 34152 - 19968: jis0208<<14 | 0x2E<<7 | 0x2E, + 34153 - 19968: jis0208<<14 | 0x25<<7 | 0x01, + 34154 - 19968: jis0208<<14 | 0x28<<7 | 0x52, + 34155 - 19968: jis0208<<14 | 0x5A<<7 | 0x3F, + 34157 - 19968: jis0208<<14 | 0x48<<7 | 0x0A, + 34159 - 19968: jis0212<<14 | 0x38<<7 | 0x31, + 34167 - 19968: jis0208<<14 | 0x48<<7 | 0x10, + 34169 - 19968: jis0212<<14 | 0x38<<7 | 0x32, + 34170 - 19968: jis0212<<14 | 0x38<<7 | 0x33, + 34171 - 19968: jis0212<<14 | 0x38<<7 | 0x34, + 34173 - 19968: jis0212<<14 | 0x38<<7 | 0x35, + 34174 - 19968: jis0208<<14 | 0x48<<7 | 0x11, + 34175 - 19968: jis0212<<14 | 0x38<<7 | 0x36, + 34176 - 19968: jis0208<<14 | 0x48<<7 | 0x04, + 34177 - 19968: jis0212<<14 | 0x38<<7 | 0x37, + 34180 - 19968: jis0208<<14 | 0x26<<7 | 0x55, + 34181 - 19968: jis0212<<14 | 0x38<<7 | 0x38, + 34182 - 19968: jis0212<<14 | 0x38<<7 | 0x39, + 34183 - 19968: jis0208<<14 | 0x48<<7 | 0x0E, + 34184 - 19968: jis0208<<14 | 0x48<<7 | 0x06, + 34185 - 19968: jis0212<<14 | 0x38<<7 | 0x3A, + 34186 - 19968: jis0208<<14 | 0x48<<7 | 0x08, + 34187 - 19968: jis0212<<14 | 0x38<<7 | 0x3B, + 34188 - 19968: jis0212<<14 | 0x38<<7 | 0x3C, + 34191 - 19968: jis0212<<14 | 0x38<<7 | 0x3D, + 34192 - 19968: jis0208<<14 | 0x48<<7 | 0x12, + 34193 - 19968: jis0208<<14 | 0x48<<7 | 0x07, + 34195 - 19968: jis0212<<14 | 0x38<<7 | 0x3E, + 34196 - 19968: jis0208<<14 | 0x48<<7 | 0x0B, + 34199 - 19968: jis0208<<14 | 0x10<<7 | 0x51, + 34200 - 19968: jis0212<<14 | 0x38<<7 | 0x3F, + 34201 - 19968: jis0208<<14 | 0x25<<7 | 0x44, + 34203 - 19968: jis0208<<14 | 0x48<<7 | 0x0C, + 34204 - 19968: jis0208<<14 | 0x48<<7 | 0x0F, + 34205 - 19968: jis0212<<14 | 0x38<<7 | 0x40, + 34207 - 19968: jis0212<<14 | 0x38<<7 | 0x41, + 34208 - 19968: jis0212<<14 | 0x38<<7 | 0x42, + 34210 - 19968: jis0212<<14 | 0x38<<7 | 0x43, + 34212 - 19968: jis0208<<14 | 0x48<<7 | 0x05, + 34213 - 19968: jis0212<<14 | 0x38<<7 | 0x44, + 34214 - 19968: jis0208<<14 | 0x20<<7 | 0x05, + 34215 - 19968: jis0212<<14 | 0x38<<7 | 0x45, + 34216 - 19968: jis0208<<14 | 0x48<<7 | 0x09, + 34217 - 19968: jis0208<<14 | 0x1A<<7 | 0x06, + 34218 - 19968: jis0208<<14 | 0x1E<<7 | 0x24, + 34219 - 19968: jis0208<<14 | 0x16<<7 | 0x0F, + 34220 - 19968: jis0208<<14 | 0x2B<<7 | 0x53, + 34221 - 19968: jis0212<<14 | 0x38<<7 | 0x53, + 34222 - 19968: jis0208<<14 | 0x2B<<7 | 0x58, + 34223 - 19968: jis0208<<14 | 0x1C<<7 | 0x51, + 34224 - 19968: jis0208<<14 | 0x5A<<7 | 0x41, + 34228 - 19968: jis0212<<14 | 0x38<<7 | 0x46, + 34230 - 19968: jis0212<<14 | 0x38<<7 | 0x47, + 34231 - 19968: jis0212<<14 | 0x38<<7 | 0x48, + 34232 - 19968: jis0212<<14 | 0x38<<7 | 0x49, + 34233 - 19968: jis0208<<14 | 0x48<<7 | 0x16, + 34234 - 19968: jis0208<<14 | 0x48<<7 | 0x14, + 34236 - 19968: jis0212<<14 | 0x38<<7 | 0x4A, + 34237 - 19968: jis0212<<14 | 0x38<<7 | 0x4B, + 34238 - 19968: jis0212<<14 | 0x38<<7 | 0x4C, + 34239 - 19968: jis0212<<14 | 0x38<<7 | 0x4D, + 34241 - 19968: jis0208<<14 | 0x2E<<7 | 0x2D, + 34242 - 19968: jis0212<<14 | 0x38<<7 | 0x4E, + 34247 - 19968: jis0212<<14 | 0x38<<7 | 0x4F, + 34249 - 19968: jis0208<<14 | 0x48<<7 | 0x13, + 34250 - 19968: jis0212<<14 | 0x38<<7 | 0x50, + 34251 - 19968: jis0212<<14 | 0x38<<7 | 0x51, + 34253 - 19968: jis0208<<14 | 0x2C<<7 | 0x54, + 34254 - 19968: jis0212<<14 | 0x38<<7 | 0x52, + 34255 - 19968: jis0208<<14 | 0x48<<7 | 0x15, + 34256 - 19968: jis0208<<14 | 0x48<<7 | 0x17, + 34261 - 19968: jis0208<<14 | 0x48<<7 | 0x18, + 34264 - 19968: jis0212<<14 | 0x38<<7 | 0x54, + 34266 - 19968: jis0212<<14 | 0x38<<7 | 0x55, + 34268 - 19968: jis0208<<14 | 0x48<<7 | 0x1B, + 34269 - 19968: jis0208<<14 | 0x48<<7 | 0x19, + 34271 - 19968: jis0212<<14 | 0x38<<7 | 0x56, + 34272 - 19968: jis0212<<14 | 0x38<<7 | 0x57, + 34276 - 19968: jis0208<<14 | 0x25<<7 | 0x02, + 34277 - 19968: jis0208<<14 | 0x48<<7 | 0x1A, + 34278 - 19968: jis0212<<14 | 0x38<<7 | 0x58, + 34280 - 19968: jis0212<<14 | 0x38<<7 | 0x59, + 34281 - 19968: jis0208<<14 | 0x27<<7 | 0x2C, + 34282 - 19968: jis0208<<14 | 0x48<<7 | 0x0D, + 34285 - 19968: jis0212<<14 | 0x38<<7 | 0x5A, + 34291 - 19968: jis0212<<14 | 0x38<<7 | 0x5B, + 34294 - 19968: jis0212<<14 | 0x38<<7 | 0x5C, + 34295 - 19968: jis0208<<14 | 0x1C<<7 | 0x52, + 34297 - 19968: jis0208<<14 | 0x48<<7 | 0x1C, + 34298 - 19968: jis0208<<14 | 0x48<<7 | 0x21, + 34299 - 19968: jis0208<<14 | 0x20<<7 | 0x53, + 34300 - 19968: jis0212<<14 | 0x38<<7 | 0x5D, + 34302 - 19968: jis0208<<14 | 0x48<<7 | 0x20, + 34303 - 19968: jis0212<<14 | 0x39<<7 | 0x00, + 34304 - 19968: jis0212<<14 | 0x39<<7 | 0x01, + 34306 - 19968: jis0208<<14 | 0x48<<7 | 0x01, + 34308 - 19968: jis0212<<14 | 0x39<<7 | 0x02, + 34309 - 19968: jis0212<<14 | 0x39<<7 | 0x03, + 34310 - 19968: jis0208<<14 | 0x48<<7 | 0x22, + 34311 - 19968: jis0208<<14 | 0x20<<7 | 0x28, + 34314 - 19968: jis0208<<14 | 0x48<<7 | 0x1D, + 34315 - 19968: jis0208<<14 | 0x48<<7 | 0x1F, + 34317 - 19968: jis0212<<14 | 0x39<<7 | 0x04, + 34318 - 19968: jis0212<<14 | 0x39<<7 | 0x05, + 34320 - 19968: jis0212<<14 | 0x39<<7 | 0x06, + 34321 - 19968: jis0212<<14 | 0x39<<7 | 0x07, + 34322 - 19968: jis0212<<14 | 0x39<<7 | 0x08, + 34323 - 19968: jis0208<<14 | 0x48<<7 | 0x1E, + 34326 - 19968: jis0208<<14 | 0x3C<<7 | 0x10, + 34327 - 19968: jis0208<<14 | 0x3C<<7 | 0x01, + 34328 - 19968: jis0212<<14 | 0x39<<7 | 0x09, + 34329 - 19968: jis0212<<14 | 0x39<<7 | 0x0A, + 34330 - 19968: jis0208<<14 | 0x48<<7 | 0x24, + 34331 - 19968: jis0212<<14 | 0x39<<7 | 0x0B, + 34334 - 19968: jis0212<<14 | 0x39<<7 | 0x0C, + 34337 - 19968: jis0212<<14 | 0x39<<7 | 0x0D, + 34338 - 19968: jis0208<<14 | 0x48<<7 | 0x23, + 34343 - 19968: jis0212<<14 | 0x39<<7 | 0x0E, + 34345 - 19968: jis0212<<14 | 0x39<<7 | 0x0F, + 34349 - 19968: jis0208<<14 | 0x2C<<7 | 0x55, + 34351 - 19968: jis0208<<14 | 0x41<<7 | 0x1B, + 34352 - 19968: jis0208<<14 | 0x48<<7 | 0x25, + 34358 - 19968: jis0212<<14 | 0x39<<7 | 0x10, + 34360 - 19968: jis0212<<14 | 0x39<<7 | 0x11, + 34362 - 19968: jis0212<<14 | 0x39<<7 | 0x12, + 34364 - 19968: jis0212<<14 | 0x39<<7 | 0x13, + 34365 - 19968: jis0212<<14 | 0x39<<7 | 0x14, + 34367 - 19968: jis0208<<14 | 0x48<<7 | 0x26, + 34368 - 19968: jis0212<<14 | 0x39<<7 | 0x15, + 34369 - 19968: jis0212<<14 | 0x17<<7 | 0x45, + 34370 - 19968: jis0212<<14 | 0x39<<7 | 0x16, + 34374 - 19968: jis0212<<14 | 0x39<<7 | 0x17, + 34381 - 19968: jis0208<<14 | 0x48<<7 | 0x27, + 34382 - 19968: jis0208<<14 | 0x17<<7 | 0x36, + 34384 - 19968: jis0208<<14 | 0x14<<7 | 0x33, + 34386 - 19968: jis0212<<14 | 0x39<<7 | 0x18, + 34387 - 19968: jis0212<<14 | 0x39<<7 | 0x19, + 34388 - 19968: jis0208<<14 | 0x48<<7 | 0x29, + 34389 - 19968: jis0208<<14 | 0x30<<7 | 0x3C, + 34390 - 19968: jis0212<<14 | 0x39<<7 | 0x1A, + 34391 - 19968: jis0212<<14 | 0x39<<7 | 0x1B, + 34392 - 19968: jis0212<<14 | 0x39<<7 | 0x1C, + 34393 - 19968: jis0212<<14 | 0x39<<7 | 0x1D, + 34394 - 19968: jis0208<<14 | 0x14<<7 | 0x54, + 34396 - 19968: jis0208<<14 | 0x2D<<7 | 0x19, + 34397 - 19968: jis0212<<14 | 0x39<<7 | 0x1E, + 34398 - 19968: jis0208<<14 | 0x15<<7 | 0x52, + 34399 - 19968: jis0208<<14 | 0x48<<7 | 0x2A, + 34400 - 19968: jis0212<<14 | 0x39<<7 | 0x1F, + 34401 - 19968: jis0212<<14 | 0x39<<7 | 0x20, + 34402 - 19968: jis0212<<14 | 0x39<<7 | 0x21, + 34403 - 19968: jis0212<<14 | 0x39<<7 | 0x22, + 34404 - 19968: jis0212<<14 | 0x39<<7 | 0x23, + 34407 - 19968: jis0208<<14 | 0x48<<7 | 0x2B, + 34409 - 19968: jis0212<<14 | 0x39<<7 | 0x24, + 34411 - 19968: jis0208<<14 | 0x22<<7 | 0x4D, + 34412 - 19968: jis0212<<14 | 0x39<<7 | 0x25, + 34415 - 19968: jis0212<<14 | 0x39<<7 | 0x26, + 34417 - 19968: jis0208<<14 | 0x48<<7 | 0x2C, + 34421 - 19968: jis0212<<14 | 0x39<<7 | 0x27, + 34422 - 19968: jis0212<<14 | 0x39<<7 | 0x28, + 34423 - 19968: jis0212<<14 | 0x39<<7 | 0x29, + 34425 - 19968: jis0208<<14 | 0x25<<7 | 0x59, + 34426 - 19968: jis0212<<14 | 0x39<<7 | 0x2A, + 34427 - 19968: jis0208<<14 | 0x0F<<7 | 0x19, + 34440 - 19968: jis0212<<14 | 0x39<<7 | 0x4C, + 34442 - 19968: jis0208<<14 | 0x11<<7 | 0x42, + 34443 - 19968: jis0208<<14 | 0x48<<7 | 0x31, + 34444 - 19968: jis0208<<14 | 0x48<<7 | 0x32, + 34445 - 19968: jis0212<<14 | 0x39<<7 | 0x2B, + 34449 - 19968: jis0212<<14 | 0x39<<7 | 0x2C, + 34451 - 19968: jis0208<<14 | 0x48<<7 | 0x2D, + 34453 - 19968: jis0208<<14 | 0x1A<<7 | 0x1C, + 34454 - 19968: jis0212<<14 | 0x39<<7 | 0x2D, + 34456 - 19968: jis0212<<14 | 0x39<<7 | 0x2E, + 34458 - 19968: jis0212<<14 | 0x39<<7 | 0x2F, + 34460 - 19968: jis0212<<14 | 0x39<<7 | 0x30, + 34465 - 19968: jis0212<<14 | 0x39<<7 | 0x31, + 34467 - 19968: jis0208<<14 | 0x48<<7 | 0x2E, + 34468 - 19968: jis0208<<14 | 0x26<<7 | 0x21, + 34470 - 19968: jis0212<<14 | 0x39<<7 | 0x32, + 34471 - 19968: jis0212<<14 | 0x39<<7 | 0x33, + 34472 - 19968: jis0212<<14 | 0x39<<7 | 0x34, + 34473 - 19968: jis0208<<14 | 0x48<<7 | 0x2F, + 34474 - 19968: jis0208<<14 | 0x48<<7 | 0x30, + 34475 - 19968: jis0208<<14 | 0x48<<7 | 0x3A, + 34477 - 19968: jis0212<<14 | 0x39<<7 | 0x35, + 34479 - 19968: jis0208<<14 | 0x48<<7 | 0x34, + 34480 - 19968: jis0208<<14 | 0x48<<7 | 0x37, + 34481 - 19968: jis0212<<14 | 0x39<<7 | 0x36, + 34483 - 19968: jis0212<<14 | 0x39<<7 | 0x37, + 34484 - 19968: jis0212<<14 | 0x39<<7 | 0x38, + 34485 - 19968: jis0212<<14 | 0x39<<7 | 0x39, + 34486 - 19968: jis0208<<14 | 0x48<<7 | 0x33, + 34487 - 19968: jis0212<<14 | 0x39<<7 | 0x3A, + 34488 - 19968: jis0212<<14 | 0x39<<7 | 0x3B, + 34489 - 19968: jis0212<<14 | 0x39<<7 | 0x3C, + 34495 - 19968: jis0212<<14 | 0x39<<7 | 0x3D, + 34496 - 19968: jis0212<<14 | 0x39<<7 | 0x3E, + 34497 - 19968: jis0212<<14 | 0x39<<7 | 0x3F, + 34499 - 19968: jis0212<<14 | 0x39<<7 | 0x40, + 34500 - 19968: jis0208<<14 | 0x48<<7 | 0x35, + 34501 - 19968: jis0212<<14 | 0x39<<7 | 0x41, + 34502 - 19968: jis0208<<14 | 0x48<<7 | 0x36, + 34503 - 19968: jis0208<<14 | 0x1B<<7 | 0x37, + 34505 - 19968: jis0208<<14 | 0x48<<7 | 0x38, + 34507 - 19968: jis0208<<14 | 0x22<<7 | 0x20, + 34509 - 19968: jis0208<<14 | 0x16<<7 | 0x35, + 34510 - 19968: jis0208<<14 | 0x12<<7 | 0x21, + 34513 - 19968: jis0212<<14 | 0x39<<7 | 0x42, + 34514 - 19968: jis0212<<14 | 0x39<<7 | 0x43, + 34516 - 19968: jis0208<<14 | 0x48<<7 | 0x3B, + 34517 - 19968: jis0212<<14 | 0x39<<7 | 0x44, + 34519 - 19968: jis0212<<14 | 0x39<<7 | 0x45, + 34521 - 19968: jis0208<<14 | 0x12<<7 | 0x1E, + 34522 - 19968: jis0212<<14 | 0x39<<7 | 0x46, + 34523 - 19968: jis0208<<14 | 0x48<<7 | 0x40, + 34524 - 19968: jis0212<<14 | 0x39<<7 | 0x47, + 34526 - 19968: jis0208<<14 | 0x48<<7 | 0x3C, + 34527 - 19968: jis0208<<14 | 0x48<<7 | 0x3F, + 34528 - 19968: jis0212<<14 | 0x39<<7 | 0x48, + 34531 - 19968: jis0212<<14 | 0x39<<7 | 0x49, + 34532 - 19968: jis0208<<14 | 0x27<<7 | 0x19, + 34533 - 19968: jis0212<<14 | 0x39<<7 | 0x4A, + 34535 - 19968: jis0212<<14 | 0x39<<7 | 0x4B, + 34537 - 19968: jis0208<<14 | 0x48<<7 | 0x3D, + 34540 - 19968: jis0208<<14 | 0x48<<7 | 0x3E, + 34541 - 19968: jis0208<<14 | 0x28<<7 | 0x27, + 34542 - 19968: jis0208<<14 | 0x27<<7 | 0x39, + 34543 - 19968: jis0208<<14 | 0x48<<7 | 0x41, + 34552 - 19968: jis0208<<14 | 0x21<<7 | 0x5C, + 34553 - 19968: jis0208<<14 | 0x48<<7 | 0x4B, + 34554 - 19968: jis0212<<14 | 0x39<<7 | 0x4D, + 34555 - 19968: jis0208<<14 | 0x48<<7 | 0x47, + 34556 - 19968: jis0212<<14 | 0x39<<7 | 0x4E, + 34557 - 19968: jis0212<<14 | 0x39<<7 | 0x4F, + 34558 - 19968: jis0208<<14 | 0x11<<7 | 0x4A, + 34560 - 19968: jis0208<<14 | 0x48<<7 | 0x45, + 34562 - 19968: jis0208<<14 | 0x2A<<7 | 0x09, + 34563 - 19968: jis0208<<14 | 0x48<<7 | 0x46, + 34564 - 19968: jis0212<<14 | 0x39<<7 | 0x50, + 34565 - 19968: jis0212<<14 | 0x39<<7 | 0x51, + 34566 - 19968: jis0208<<14 | 0x48<<7 | 0x43, + 34567 - 19968: jis0212<<14 | 0x39<<7 | 0x52, + 34568 - 19968: jis0208<<14 | 0x48<<7 | 0x44, + 34569 - 19968: jis0208<<14 | 0x48<<7 | 0x49, + 34570 - 19968: jis0208<<14 | 0x48<<7 | 0x4C, + 34571 - 19968: jis0212<<14 | 0x39<<7 | 0x53, + 34573 - 19968: jis0208<<14 | 0x48<<7 | 0x4A, + 34574 - 19968: jis0212<<14 | 0x39<<7 | 0x54, + 34575 - 19968: jis0212<<14 | 0x39<<7 | 0x55, + 34576 - 19968: jis0212<<14 | 0x39<<7 | 0x56, + 34577 - 19968: jis0208<<14 | 0x48<<7 | 0x48, + 34578 - 19968: jis0208<<14 | 0x48<<7 | 0x42, + 34579 - 19968: jis0212<<14 | 0x39<<7 | 0x57, + 34580 - 19968: jis0212<<14 | 0x39<<7 | 0x58, + 34584 - 19968: jis0208<<14 | 0x22<<7 | 0x37, + 34585 - 19968: jis0212<<14 | 0x39<<7 | 0x59, + 34586 - 19968: jis0208<<14 | 0x48<<7 | 0x53, + 34588 - 19968: jis0208<<14 | 0x2B<<7 | 0x09, + 34590 - 19968: jis0212<<14 | 0x39<<7 | 0x5A, + 34591 - 19968: jis0212<<14 | 0x39<<7 | 0x5B, + 34593 - 19968: jis0212<<14 | 0x39<<7 | 0x5C, + 34595 - 19968: jis0212<<14 | 0x39<<7 | 0x5D, + 34597 - 19968: jis0208<<14 | 0x48<<7 | 0x51, + 34600 - 19968: jis0212<<14 | 0x3A<<7 | 0x00, + 34601 - 19968: jis0208<<14 | 0x48<<7 | 0x52, + 34606 - 19968: jis0212<<14 | 0x3A<<7 | 0x01, + 34607 - 19968: jis0212<<14 | 0x3A<<7 | 0x02, + 34609 - 19968: jis0212<<14 | 0x3A<<7 | 0x03, + 34610 - 19968: jis0212<<14 | 0x3A<<7 | 0x04, + 34612 - 19968: jis0208<<14 | 0x48<<7 | 0x4D, + 34615 - 19968: jis0208<<14 | 0x48<<7 | 0x4F, + 34617 - 19968: jis0212<<14 | 0x3A<<7 | 0x05, + 34618 - 19968: jis0212<<14 | 0x3A<<7 | 0x06, + 34619 - 19968: jis0208<<14 | 0x48<<7 | 0x50, + 34620 - 19968: jis0212<<14 | 0x3A<<7 | 0x07, + 34621 - 19968: jis0212<<14 | 0x3A<<7 | 0x08, + 34622 - 19968: jis0212<<14 | 0x3A<<7 | 0x09, + 34623 - 19968: jis0208<<14 | 0x48<<7 | 0x4E, + 34624 - 19968: jis0212<<14 | 0x3A<<7 | 0x0A, + 34627 - 19968: jis0212<<14 | 0x3A<<7 | 0x0B, + 34629 - 19968: jis0212<<14 | 0x3A<<7 | 0x0C, + 34633 - 19968: jis0208<<14 | 0x1F<<7 | 0x45, + 34635 - 19968: jis0208<<14 | 0x2E<<7 | 0x18, + 34636 - 19968: jis0208<<14 | 0x48<<7 | 0x57, + 34637 - 19968: jis0212<<14 | 0x3A<<7 | 0x0D, + 34638 - 19968: jis0208<<14 | 0x48<<7 | 0x58, + 34643 - 19968: jis0208<<14 | 0x49<<7 | 0x00, + 34645 - 19968: jis0208<<14 | 0x1E<<7 | 0x09, + 34647 - 19968: jis0208<<14 | 0x48<<7 | 0x5A, + 34648 - 19968: jis0212<<14 | 0x3A<<7 | 0x0E, + 34649 - 19968: jis0208<<14 | 0x48<<7 | 0x5D, + 34653 - 19968: jis0212<<14 | 0x3A<<7 | 0x0F, + 34655 - 19968: jis0208<<14 | 0x48<<7 | 0x55, + 34656 - 19968: jis0208<<14 | 0x48<<7 | 0x54, + 34657 - 19968: jis0212<<14 | 0x3A<<7 | 0x10, + 34659 - 19968: jis0208<<14 | 0x49<<7 | 0x01, + 34660 - 19968: jis0212<<14 | 0x3A<<7 | 0x11, + 34661 - 19968: jis0212<<14 | 0x3A<<7 | 0x12, + 34662 - 19968: jis0208<<14 | 0x11<<7 | 0x3B, + 34664 - 19968: jis0208<<14 | 0x48<<7 | 0x5B, + 34666 - 19968: jis0208<<14 | 0x49<<7 | 0x02, + 34670 - 19968: jis0208<<14 | 0x48<<7 | 0x5C, + 34671 - 19968: jis0212<<14 | 0x3A<<7 | 0x13, + 34673 - 19968: jis0212<<14 | 0x3A<<7 | 0x14, + 34674 - 19968: jis0212<<14 | 0x3A<<7 | 0x15, + 34676 - 19968: jis0208<<14 | 0x48<<7 | 0x59, + 34678 - 19968: jis0208<<14 | 0x23<<7 | 0x12, + 34680 - 19968: jis0208<<14 | 0x48<<7 | 0x56, + 34683 - 19968: jis0212<<14 | 0x3A<<7 | 0x16, + 34687 - 19968: jis0208<<14 | 0x26<<7 | 0x47, + 34690 - 19968: jis0208<<14 | 0x49<<7 | 0x06, + 34691 - 19968: jis0212<<14 | 0x3A<<7 | 0x17, + 34692 - 19968: jis0212<<14 | 0x3A<<7 | 0x18, + 34693 - 19968: jis0212<<14 | 0x3A<<7 | 0x19, + 34694 - 19968: jis0212<<14 | 0x3A<<7 | 0x1A, + 34695 - 19968: jis0212<<14 | 0x3A<<7 | 0x1B, + 34696 - 19968: jis0212<<14 | 0x3A<<7 | 0x1C, + 34697 - 19968: jis0212<<14 | 0x3A<<7 | 0x1D, + 34699 - 19968: jis0212<<14 | 0x3A<<7 | 0x1E, + 34700 - 19968: jis0212<<14 | 0x3A<<7 | 0x1F, + 34701 - 19968: jis0208<<14 | 0x2C<<7 | 0x1A, + 34704 - 19968: jis0212<<14 | 0x3A<<7 | 0x20, + 34707 - 19968: jis0212<<14 | 0x3A<<7 | 0x21, + 34709 - 19968: jis0212<<14 | 0x3A<<7 | 0x22, + 34711 - 19968: jis0212<<14 | 0x3A<<7 | 0x23, + 34712 - 19968: jis0212<<14 | 0x3A<<7 | 0x24, + 34713 - 19968: jis0212<<14 | 0x3A<<7 | 0x25, + 34718 - 19968: jis0212<<14 | 0x3A<<7 | 0x26, + 34719 - 19968: jis0208<<14 | 0x49<<7 | 0x05, + 34720 - 19968: jis0212<<14 | 0x3A<<7 | 0x27, + 34722 - 19968: jis0208<<14 | 0x49<<7 | 0x04, + 34723 - 19968: jis0212<<14 | 0x3A<<7 | 0x28, + 34727 - 19968: jis0212<<14 | 0x3A<<7 | 0x29, + 34731 - 19968: jis0208<<14 | 0x49<<7 | 0x0D, + 34732 - 19968: jis0212<<14 | 0x3A<<7 | 0x2A, + 34733 - 19968: jis0212<<14 | 0x3A<<7 | 0x2B, + 34734 - 19968: jis0212<<14 | 0x3A<<7 | 0x2C, + 34735 - 19968: jis0208<<14 | 0x49<<7 | 0x07, + 34737 - 19968: jis0212<<14 | 0x3A<<7 | 0x2D, + 34739 - 19968: jis0208<<14 | 0x49<<7 | 0x0F, + 34741 - 19968: jis0212<<14 | 0x3A<<7 | 0x2E, + 34746 - 19968: jis0208<<14 | 0x2C<<7 | 0x45, + 34747 - 19968: jis0208<<14 | 0x49<<7 | 0x12, + 34749 - 19968: jis0208<<14 | 0x49<<7 | 0x09, + 34750 - 19968: jis0212<<14 | 0x3A<<7 | 0x2F, + 34751 - 19968: jis0212<<14 | 0x3A<<7 | 0x30, + 34752 - 19968: jis0208<<14 | 0x49<<7 | 0x0A, + 34753 - 19968: jis0212<<14 | 0x3A<<7 | 0x31, + 34756 - 19968: jis0208<<14 | 0x49<<7 | 0x0E, + 34758 - 19968: jis0208<<14 | 0x49<<7 | 0x11, + 34759 - 19968: jis0208<<14 | 0x49<<7 | 0x10, + 34760 - 19968: jis0212<<14 | 0x3A<<7 | 0x32, + 34761 - 19968: jis0212<<14 | 0x3A<<7 | 0x33, + 34762 - 19968: jis0212<<14 | 0x3A<<7 | 0x34, + 34763 - 19968: jis0208<<14 | 0x49<<7 | 0x08, + 34766 - 19968: jis0212<<14 | 0x3A<<7 | 0x35, + 34768 - 19968: jis0208<<14 | 0x49<<7 | 0x0B, + 34770 - 19968: jis0208<<14 | 0x49<<7 | 0x1C, + 34773 - 19968: jis0212<<14 | 0x3A<<7 | 0x36, + 34774 - 19968: jis0212<<14 | 0x3A<<7 | 0x37, + 34777 - 19968: jis0212<<14 | 0x3A<<7 | 0x38, + 34778 - 19968: jis0212<<14 | 0x3A<<7 | 0x39, + 34780 - 19968: jis0212<<14 | 0x3A<<7 | 0x3A, + 34783 - 19968: jis0212<<14 | 0x3A<<7 | 0x3B, + 34784 - 19968: jis0208<<14 | 0x49<<7 | 0x15, + 34786 - 19968: jis0212<<14 | 0x3A<<7 | 0x3C, + 34787 - 19968: jis0212<<14 | 0x3A<<7 | 0x3D, + 34788 - 19968: jis0212<<14 | 0x3A<<7 | 0x3E, + 34794 - 19968: jis0212<<14 | 0x3A<<7 | 0x3F, + 34795 - 19968: jis0212<<14 | 0x3A<<7 | 0x40, + 34797 - 19968: jis0212<<14 | 0x3A<<7 | 0x41, + 34799 - 19968: jis0208<<14 | 0x49<<7 | 0x13, + 34801 - 19968: jis0212<<14 | 0x3A<<7 | 0x42, + 34802 - 19968: jis0208<<14 | 0x49<<7 | 0x14, + 34803 - 19968: jis0212<<14 | 0x3A<<7 | 0x43, + 34806 - 19968: jis0208<<14 | 0x49<<7 | 0x19, + 34807 - 19968: jis0208<<14 | 0x49<<7 | 0x1A, + 34808 - 19968: jis0212<<14 | 0x3A<<7 | 0x44, + 34809 - 19968: jis0208<<14 | 0x12<<7 | 0x09, + 34810 - 19968: jis0212<<14 | 0x3A<<7 | 0x45, + 34811 - 19968: jis0208<<14 | 0x14<<7 | 0x21, + 34814 - 19968: jis0208<<14 | 0x49<<7 | 0x18, + 34815 - 19968: jis0212<<14 | 0x3A<<7 | 0x46, + 34817 - 19968: jis0212<<14 | 0x3A<<7 | 0x47, + 34819 - 19968: jis0212<<14 | 0x3A<<7 | 0x48, + 34821 - 19968: jis0208<<14 | 0x49<<7 | 0x03, + 34822 - 19968: jis0212<<14 | 0x3A<<7 | 0x49, + 34823 - 19968: jis0208<<14 | 0x5A<<7 | 0x44, + 34825 - 19968: jis0212<<14 | 0x3A<<7 | 0x4A, + 34826 - 19968: jis0212<<14 | 0x3A<<7 | 0x4B, + 34827 - 19968: jis0212<<14 | 0x3A<<7 | 0x4C, + 34829 - 19968: jis0208<<14 | 0x49<<7 | 0x17, + 34830 - 19968: jis0208<<14 | 0x49<<7 | 0x1B, + 34831 - 19968: jis0208<<14 | 0x49<<7 | 0x16, + 34832 - 19968: jis0212<<14 | 0x3A<<7 | 0x4D, + 34833 - 19968: jis0208<<14 | 0x49<<7 | 0x1D, + 34834 - 19968: jis0212<<14 | 0x3A<<7 | 0x4F, + 34835 - 19968: jis0212<<14 | 0x3A<<7 | 0x50, + 34836 - 19968: jis0212<<14 | 0x3A<<7 | 0x51, + 34837 - 19968: jis0208<<14 | 0x49<<7 | 0x1F, + 34838 - 19968: jis0208<<14 | 0x49<<7 | 0x1E, + 34840 - 19968: jis0212<<14 | 0x3A<<7 | 0x52, + 34841 - 19968: jis0212<<14 | 0x3A<<7 | 0x4E, + 34842 - 19968: jis0212<<14 | 0x3A<<7 | 0x53, + 34843 - 19968: jis0212<<14 | 0x3A<<7 | 0x54, + 34844 - 19968: jis0212<<14 | 0x3A<<7 | 0x55, + 34846 - 19968: jis0212<<14 | 0x3A<<7 | 0x56, + 34847 - 19968: jis0212<<14 | 0x3A<<7 | 0x57, + 34849 - 19968: jis0208<<14 | 0x49<<7 | 0x21, + 34850 - 19968: jis0208<<14 | 0x49<<7 | 0x20, + 34851 - 19968: jis0208<<14 | 0x48<<7 | 0x39, + 34855 - 19968: jis0208<<14 | 0x49<<7 | 0x25, + 34856 - 19968: jis0212<<14 | 0x3A<<7 | 0x58, + 34861 - 19968: jis0212<<14 | 0x3A<<7 | 0x59, + 34862 - 19968: jis0212<<14 | 0x3A<<7 | 0x5A, + 34864 - 19968: jis0212<<14 | 0x3A<<7 | 0x5B, + 34865 - 19968: jis0208<<14 | 0x49<<7 | 0x22, + 34866 - 19968: jis0212<<14 | 0x3A<<7 | 0x5C, + 34869 - 19968: jis0212<<14 | 0x3A<<7 | 0x5D, + 34870 - 19968: jis0208<<14 | 0x49<<7 | 0x23, + 34873 - 19968: jis0208<<14 | 0x49<<7 | 0x24, + 34874 - 19968: jis0212<<14 | 0x3B<<7 | 0x00, + 34875 - 19968: jis0208<<14 | 0x49<<7 | 0x26, + 34876 - 19968: jis0212<<14 | 0x3B<<7 | 0x01, + 34880 - 19968: jis0208<<14 | 0x16<<7 | 0x4B, + 34881 - 19968: jis0212<<14 | 0x3B<<7 | 0x02, + 34882 - 19968: jis0208<<14 | 0x49<<7 | 0x28, + 34883 - 19968: jis0212<<14 | 0x3B<<7 | 0x03, + 34884 - 19968: jis0208<<14 | 0x49<<7 | 0x27, + 34885 - 19968: jis0212<<14 | 0x3B<<7 | 0x04, + 34886 - 19968: jis0208<<14 | 0x1C<<7 | 0x0F, + 34888 - 19968: jis0212<<14 | 0x3B<<7 | 0x05, + 34889 - 19968: jis0212<<14 | 0x3B<<7 | 0x06, + 34890 - 19968: jis0212<<14 | 0x3B<<7 | 0x07, + 34891 - 19968: jis0212<<14 | 0x3B<<7 | 0x08, + 34892 - 19968: jis0208<<14 | 0x18<<7 | 0x33, + 34893 - 19968: jis0208<<14 | 0x3D<<7 | 0x06, + 34894 - 19968: jis0212<<14 | 0x3B<<7 | 0x09, + 34897 - 19968: jis0212<<14 | 0x3B<<7 | 0x0A, + 34898 - 19968: jis0208<<14 | 0x49<<7 | 0x29, + 34899 - 19968: jis0208<<14 | 0x1C<<7 | 0x30, + 34901 - 19968: jis0212<<14 | 0x3B<<7 | 0x0B, + 34902 - 19968: jis0212<<14 | 0x3B<<7 | 0x0C, + 34903 - 19968: jis0208<<14 | 0x12<<7 | 0x18, + 34904 - 19968: jis0212<<14 | 0x3B<<7 | 0x0D, + 34905 - 19968: jis0208<<14 | 0x49<<7 | 0x2A, + 34906 - 19968: jis0212<<14 | 0x3B<<7 | 0x0E, + 34907 - 19968: jis0208<<14 | 0x10<<7 | 0x31, + 34908 - 19968: jis0212<<14 | 0x3B<<7 | 0x0F, + 34909 - 19968: jis0208<<14 | 0x1D<<7 | 0x36, + 34910 - 19968: jis0208<<14 | 0x49<<7 | 0x2B, + 34911 - 19968: jis0212<<14 | 0x3B<<7 | 0x10, + 34912 - 19968: jis0212<<14 | 0x3B<<7 | 0x11, + 34913 - 19968: jis0208<<14 | 0x18<<7 | 0x34, + 34914 - 19968: jis0208<<14 | 0x49<<7 | 0x2C, + 34915 - 19968: jis0208<<14 | 0x0F<<7 | 0x40, + 34916 - 19968: jis0212<<14 | 0x3B<<7 | 0x12, + 34920 - 19968: jis0208<<14 | 0x28<<7 | 0x1C, + 34921 - 19968: jis0212<<14 | 0x3B<<7 | 0x13, + 34923 - 19968: jis0208<<14 | 0x49<<7 | 0x2D, + 34928 - 19968: jis0208<<14 | 0x1E<<7 | 0x49, + 34929 - 19968: jis0212<<14 | 0x3B<<7 | 0x14, + 34930 - 19968: jis0208<<14 | 0x49<<7 | 0x34, + 34933 - 19968: jis0208<<14 | 0x49<<7 | 0x31, + 34935 - 19968: jis0208<<14 | 0x22<<7 | 0x4E, + 34937 - 19968: jis0212<<14 | 0x3B<<7 | 0x15, + 34939 - 19968: jis0212<<14 | 0x3B<<7 | 0x16, + 34941 - 19968: jis0208<<14 | 0x49<<7 | 0x32, + 34942 - 19968: jis0208<<14 | 0x49<<7 | 0x2F, + 34943 - 19968: jis0208<<14 | 0x15<<7 | 0x3D, + 34944 - 19968: jis0212<<14 | 0x3B<<7 | 0x17, + 34945 - 19968: jis0208<<14 | 0x49<<7 | 0x2E, + 34946 - 19968: jis0208<<14 | 0x49<<7 | 0x35, + 34952 - 19968: jis0208<<14 | 0x16<<7 | 0x15, + 34955 - 19968: jis0208<<14 | 0x21<<7 | 0x3D, + 34957 - 19968: jis0208<<14 | 0x49<<7 | 0x3B, + 34962 - 19968: jis0208<<14 | 0x49<<7 | 0x37, + 34966 - 19968: jis0208<<14 | 0x21<<7 | 0x14, + 34967 - 19968: jis0208<<14 | 0x49<<7 | 0x36, + 34968 - 19968: jis0212<<14 | 0x3B<<7 | 0x18, + 34969 - 19968: jis0208<<14 | 0x49<<7 | 0x39, + 34970 - 19968: jis0212<<14 | 0x3B<<7 | 0x19, + 34971 - 19968: jis0212<<14 | 0x3B<<7 | 0x1A, + 34972 - 19968: jis0212<<14 | 0x3B<<7 | 0x1B, + 34974 - 19968: jis0208<<14 | 0x49<<7 | 0x30, + 34975 - 19968: jis0212<<14 | 0x3B<<7 | 0x1C, + 34976 - 19968: jis0212<<14 | 0x3B<<7 | 0x1D, + 34978 - 19968: jis0208<<14 | 0x49<<7 | 0x3A, + 34980 - 19968: jis0208<<14 | 0x49<<7 | 0x3C, + 34984 - 19968: jis0212<<14 | 0x3B<<7 | 0x1E, + 34986 - 19968: jis0212<<14 | 0x3B<<7 | 0x1F, + 34987 - 19968: jis0208<<14 | 0x27<<7 | 0x4E, + 34990 - 19968: jis0208<<14 | 0x49<<7 | 0x38, + 34992 - 19968: jis0208<<14 | 0x49<<7 | 0x3D, + 34993 - 19968: jis0208<<14 | 0x49<<7 | 0x3F, + 34996 - 19968: jis0208<<14 | 0x17<<7 | 0x32, + 34997 - 19968: jis0208<<14 | 0x49<<7 | 0x33, + 34999 - 19968: jis0208<<14 | 0x0F<<7 | 0x20, + 35002 - 19968: jis0212<<14 | 0x3B<<7 | 0x20, + 35005 - 19968: jis0212<<14 | 0x3B<<7 | 0x21, + 35006 - 19968: jis0212<<14 | 0x3B<<7 | 0x22, + 35007 - 19968: jis0208<<14 | 0x49<<7 | 0x3E, + 35008 - 19968: jis0212<<14 | 0x3B<<7 | 0x23, + 35009 - 19968: jis0208<<14 | 0x19<<7 | 0x3A, + 35010 - 19968: jis0208<<14 | 0x2D<<7 | 0x55, + 35011 - 19968: jis0208<<14 | 0x49<<7 | 0x40, + 35012 - 19968: jis0208<<14 | 0x49<<7 | 0x41, + 35013 - 19968: jis0208<<14 | 0x20<<7 | 0x54, + 35018 - 19968: jis0212<<14 | 0x3B<<7 | 0x24, + 35019 - 19968: jis0212<<14 | 0x3B<<7 | 0x25, + 35020 - 19968: jis0212<<14 | 0x3B<<7 | 0x26, + 35021 - 19968: jis0212<<14 | 0x3B<<7 | 0x27, + 35022 - 19968: jis0212<<14 | 0x3B<<7 | 0x28, + 35023 - 19968: jis0208<<14 | 0x2D<<7 | 0x01, + 35025 - 19968: jis0212<<14 | 0x3B<<7 | 0x29, + 35026 - 19968: jis0212<<14 | 0x3B<<7 | 0x2A, + 35027 - 19968: jis0212<<14 | 0x3B<<7 | 0x2B, + 35028 - 19968: jis0208<<14 | 0x49<<7 | 0x42, + 35029 - 19968: jis0208<<14 | 0x2C<<7 | 0x14, + 35032 - 19968: jis0208<<14 | 0x49<<7 | 0x43, + 35033 - 19968: jis0208<<14 | 0x49<<7 | 0x44, + 35035 - 19968: jis0212<<14 | 0x3B<<7 | 0x2C, + 35036 - 19968: jis0208<<14 | 0x29<<7 | 0x43, + 35037 - 19968: jis0208<<14 | 0x49<<7 | 0x45, + 35038 - 19968: jis0212<<14 | 0x3B<<7 | 0x2D, + 35039 - 19968: jis0208<<14 | 0x19<<7 | 0x1F, + 35041 - 19968: jis0208<<14 | 0x2D<<7 | 0x02, + 35047 - 19968: jis0212<<14 | 0x3B<<7 | 0x2E, + 35048 - 19968: jis0208<<14 | 0x49<<7 | 0x4A, + 35055 - 19968: jis0212<<14 | 0x3B<<7 | 0x2F, + 35056 - 19968: jis0212<<14 | 0x3B<<7 | 0x30, + 35057 - 19968: jis0212<<14 | 0x3B<<7 | 0x31, + 35058 - 19968: jis0208<<14 | 0x49<<7 | 0x4B, + 35059 - 19968: jis0208<<14 | 0x1D<<7 | 0x37, + 35060 - 19968: jis0208<<14 | 0x49<<7 | 0x49, + 35061 - 19968: jis0208<<14 | 0x5A<<7 | 0x45, + 35063 - 19968: jis0212<<14 | 0x3B<<7 | 0x33, + 35064 - 19968: jis0208<<14 | 0x2C<<7 | 0x46, + 35065 - 19968: jis0208<<14 | 0x49<<7 | 0x46, + 35068 - 19968: jis0208<<14 | 0x49<<7 | 0x48, + 35069 - 19968: jis0208<<14 | 0x1F<<7 | 0x1C, + 35070 - 19968: jis0208<<14 | 0x1E<<7 | 0x5D, + 35073 - 19968: jis0212<<14 | 0x3B<<7 | 0x34, + 35074 - 19968: jis0208<<14 | 0x49<<7 | 0x47, + 35076 - 19968: jis0208<<14 | 0x49<<7 | 0x4C, + 35078 - 19968: jis0212<<14 | 0x3B<<7 | 0x35, + 35079 - 19968: jis0208<<14 | 0x29<<7 | 0x02, + 35082 - 19968: jis0208<<14 | 0x49<<7 | 0x4E, + 35084 - 19968: jis0208<<14 | 0x49<<7 | 0x4D, + 35085 - 19968: jis0212<<14 | 0x3B<<7 | 0x36, + 35086 - 19968: jis0212<<14 | 0x3B<<7 | 0x37, + 35087 - 19968: jis0212<<14 | 0x3B<<7 | 0x38, + 35088 - 19968: jis0208<<14 | 0x12<<7 | 0x4B, + 35090 - 19968: jis0208<<14 | 0x2A<<7 | 0x0A, + 35091 - 19968: jis0208<<14 | 0x49<<7 | 0x4F, + 35093 - 19968: jis0212<<14 | 0x3B<<7 | 0x39, + 35094 - 19968: jis0212<<14 | 0x3B<<7 | 0x3A, + 35096 - 19968: jis0212<<14 | 0x3B<<7 | 0x3B, + 35097 - 19968: jis0212<<14 | 0x3B<<7 | 0x3C, + 35098 - 19968: jis0212<<14 | 0x3B<<7 | 0x3D, + 35100 - 19968: jis0208<<14 | 0x58<<7 | 0x01, + 35101 - 19968: jis0208<<14 | 0x49<<7 | 0x5B, + 35102 - 19968: jis0208<<14 | 0x49<<7 | 0x51, + 35104 - 19968: jis0212<<14 | 0x3B<<7 | 0x3F, + 35109 - 19968: jis0208<<14 | 0x49<<7 | 0x52, + 35110 - 19968: jis0212<<14 | 0x3B<<7 | 0x40, + 35111 - 19968: jis0212<<14 | 0x3B<<7 | 0x41, + 35112 - 19968: jis0212<<14 | 0x3B<<7 | 0x42, + 35114 - 19968: jis0208<<14 | 0x49<<7 | 0x53, + 35115 - 19968: jis0208<<14 | 0x49<<7 | 0x54, + 35120 - 19968: jis0212<<14 | 0x3B<<7 | 0x43, + 35121 - 19968: jis0212<<14 | 0x3B<<7 | 0x44, + 35122 - 19968: jis0212<<14 | 0x3B<<7 | 0x45, + 35125 - 19968: jis0212<<14 | 0x3B<<7 | 0x46, + 35126 - 19968: jis0208<<14 | 0x49<<7 | 0x58, + 35128 - 19968: jis0208<<14 | 0x49<<7 | 0x59, + 35129 - 19968: jis0212<<14 | 0x3B<<7 | 0x47, + 35130 - 19968: jis0212<<14 | 0x3B<<7 | 0x48, + 35131 - 19968: jis0208<<14 | 0x49<<7 | 0x57, + 35134 - 19968: jis0212<<14 | 0x3B<<7 | 0x49, + 35136 - 19968: jis0212<<14 | 0x3B<<7 | 0x4A, + 35137 - 19968: jis0208<<14 | 0x49<<7 | 0x55, + 35138 - 19968: jis0212<<14 | 0x3B<<7 | 0x4B, + 35139 - 19968: jis0208<<14 | 0x49<<7 | 0x50, + 35140 - 19968: jis0208<<14 | 0x49<<7 | 0x56, + 35141 - 19968: jis0212<<14 | 0x3B<<7 | 0x4C, + 35142 - 19968: jis0212<<14 | 0x3B<<7 | 0x4D, + 35145 - 19968: jis0212<<14 | 0x3B<<7 | 0x4E, + 35148 - 19968: jis0208<<14 | 0x49<<7 | 0x5A, + 35149 - 19968: jis0208<<14 | 0x4F<<7 | 0x16, + 35151 - 19968: jis0212<<14 | 0x3B<<7 | 0x4F, + 35154 - 19968: jis0212<<14 | 0x3B<<7 | 0x50, + 35158 - 19968: jis0208<<14 | 0x11<<7 | 0x07, + 35159 - 19968: jis0212<<14 | 0x3B<<7 | 0x51, + 35162 - 19968: jis0212<<14 | 0x3B<<7 | 0x52, + 35163 - 19968: jis0212<<14 | 0x3B<<7 | 0x53, + 35164 - 19968: jis0212<<14 | 0x3B<<7 | 0x54, + 35166 - 19968: jis0208<<14 | 0x49<<7 | 0x5D, + 35167 - 19968: jis0208<<14 | 0x15<<7 | 0x3E, + 35168 - 19968: jis0208<<14 | 0x49<<7 | 0x5C, + 35169 - 19968: jis0212<<14 | 0x3B<<7 | 0x55, + 35170 - 19968: jis0212<<14 | 0x3B<<7 | 0x56, + 35171 - 19968: jis0212<<14 | 0x3B<<7 | 0x57, + 35172 - 19968: jis0208<<14 | 0x4A<<7 | 0x01, + 35174 - 19968: jis0208<<14 | 0x4A<<7 | 0x00, + 35178 - 19968: jis0208<<14 | 0x4A<<7 | 0x03, + 35179 - 19968: jis0212<<14 | 0x3B<<7 | 0x58, + 35181 - 19968: jis0208<<14 | 0x4A<<7 | 0x02, + 35182 - 19968: jis0212<<14 | 0x3B<<7 | 0x59, + 35183 - 19968: jis0208<<14 | 0x4A<<7 | 0x04, + 35184 - 19968: jis0212<<14 | 0x3B<<7 | 0x5A, + 35186 - 19968: jis0208<<14 | 0x1C<<7 | 0x10, + 35187 - 19968: jis0212<<14 | 0x3B<<7 | 0x5B, + 35188 - 19968: jis0208<<14 | 0x4A<<7 | 0x05, + 35189 - 19968: jis0212<<14 | 0x3B<<7 | 0x5C, + 35191 - 19968: jis0208<<14 | 0x4A<<7 | 0x06, + 35194 - 19968: jis0212<<14 | 0x3B<<7 | 0x5D, + 35195 - 19968: jis0212<<14 | 0x3C<<7 | 0x00, + 35196 - 19968: jis0212<<14 | 0x3C<<7 | 0x01, + 35197 - 19968: jis0212<<14 | 0x3C<<7 | 0x02, + 35198 - 19968: jis0208<<14 | 0x4A<<7 | 0x07, + 35199 - 19968: jis0208<<14 | 0x1F<<7 | 0x1D, + 35201 - 19968: jis0208<<14 | 0x2C<<7 | 0x36, + 35203 - 19968: jis0208<<14 | 0x4A<<7 | 0x08, + 35206 - 19968: jis0208<<14 | 0x29<<7 | 0x03, + 35207 - 19968: jis0208<<14 | 0x26<<7 | 0x25, + 35208 - 19968: jis0208<<14 | 0x4A<<7 | 0x09, + 35209 - 19968: jis0212<<14 | 0x3C<<7 | 0x03, + 35210 - 19968: jis0208<<14 | 0x4A<<7 | 0x0A, + 35211 - 19968: jis0208<<14 | 0x17<<7 | 0x0A, + 35213 - 19968: jis0212<<14 | 0x3C<<7 | 0x04, + 35215 - 19968: jis0208<<14 | 0x14<<7 | 0x0B, + 35216 - 19968: jis0212<<14 | 0x3C<<7 | 0x05, + 35219 - 19968: jis0208<<14 | 0x4A<<7 | 0x0B, + 35220 - 19968: jis0212<<14 | 0x3C<<7 | 0x06, + 35221 - 19968: jis0212<<14 | 0x3C<<7 | 0x07, + 35222 - 19968: jis0208<<14 | 0x1A<<7 | 0x4A, + 35223 - 19968: jis0208<<14 | 0x26<<7 | 0x20, + 35224 - 19968: jis0208<<14 | 0x4A<<7 | 0x0C, + 35226 - 19968: jis0208<<14 | 0x12<<7 | 0x2F, + 35227 - 19968: jis0212<<14 | 0x3C<<7 | 0x08, + 35228 - 19968: jis0212<<14 | 0x3C<<7 | 0x09, + 35231 - 19968: jis0212<<14 | 0x3C<<7 | 0x0A, + 35232 - 19968: jis0212<<14 | 0x3C<<7 | 0x0B, + 35233 - 19968: jis0208<<14 | 0x4A<<7 | 0x0D, + 35237 - 19968: jis0212<<14 | 0x3C<<7 | 0x0C, + 35238 - 19968: jis0208<<14 | 0x4A<<7 | 0x0F, + 35239 - 19968: jis0208<<14 | 0x2C<<7 | 0x56, + 35241 - 19968: jis0208<<14 | 0x4A<<7 | 0x0E, + 35242 - 19968: jis0208<<14 | 0x1E<<7 | 0x25, + 35244 - 19968: jis0208<<14 | 0x4A<<7 | 0x10, + 35247 - 19968: jis0208<<14 | 0x4A<<7 | 0x11, + 35248 - 19968: jis0212<<14 | 0x3C<<7 | 0x0D, + 35250 - 19968: jis0208<<14 | 0x4A<<7 | 0x12, + 35251 - 19968: jis0208<<14 | 0x13<<7 | 0x30, + 35252 - 19968: jis0212<<14 | 0x3C<<7 | 0x0E, + 35253 - 19968: jis0212<<14 | 0x3C<<7 | 0x0F, + 35254 - 19968: jis0212<<14 | 0x3C<<7 | 0x10, + 35255 - 19968: jis0212<<14 | 0x3C<<7 | 0x11, + 35258 - 19968: jis0208<<14 | 0x4A<<7 | 0x13, + 35260 - 19968: jis0212<<14 | 0x3C<<7 | 0x12, + 35261 - 19968: jis0208<<14 | 0x4A<<7 | 0x14, + 35263 - 19968: jis0208<<14 | 0x4A<<7 | 0x15, + 35264 - 19968: jis0208<<14 | 0x4A<<7 | 0x16, + 35282 - 19968: jis0208<<14 | 0x12<<7 | 0x30, + 35284 - 19968: jis0212<<14 | 0x3C<<7 | 0x13, + 35285 - 19968: jis0212<<14 | 0x3C<<7 | 0x14, + 35286 - 19968: jis0212<<14 | 0x3C<<7 | 0x15, + 35287 - 19968: jis0212<<14 | 0x3C<<7 | 0x16, + 35288 - 19968: jis0212<<14 | 0x3C<<7 | 0x17, + 35290 - 19968: jis0208<<14 | 0x4A<<7 | 0x17, + 35292 - 19968: jis0208<<14 | 0x4A<<7 | 0x18, + 35293 - 19968: jis0208<<14 | 0x4A<<7 | 0x19, + 35299 - 19968: jis0208<<14 | 0x11<<7 | 0x51, + 35301 - 19968: jis0212<<14 | 0x3C<<7 | 0x18, + 35302 - 19968: jis0208<<14 | 0x1E<<7 | 0x07, + 35303 - 19968: jis0208<<14 | 0x4A<<7 | 0x1A, + 35305 - 19968: jis0212<<14 | 0x3C<<7 | 0x19, + 35307 - 19968: jis0212<<14 | 0x3C<<7 | 0x1A, + 35309 - 19968: jis0212<<14 | 0x3C<<7 | 0x1B, + 35313 - 19968: jis0212<<14 | 0x3C<<7 | 0x1C, + 35315 - 19968: jis0212<<14 | 0x3C<<7 | 0x1D, + 35316 - 19968: jis0208<<14 | 0x4A<<7 | 0x1B, + 35318 - 19968: jis0212<<14 | 0x3C<<7 | 0x1E, + 35320 - 19968: jis0208<<14 | 0x4A<<7 | 0x1C, + 35321 - 19968: jis0212<<14 | 0x3C<<7 | 0x1F, + 35325 - 19968: jis0212<<14 | 0x3C<<7 | 0x20, + 35327 - 19968: jis0212<<14 | 0x3C<<7 | 0x21, + 35328 - 19968: jis0208<<14 | 0x17<<7 | 0x1F, + 35330 - 19968: jis0208<<14 | 0x23<<7 | 0x5A, + 35331 - 19968: jis0208<<14 | 0x4A<<7 | 0x1D, + 35332 - 19968: jis0212<<14 | 0x3C<<7 | 0x22, + 35333 - 19968: jis0212<<14 | 0x3C<<7 | 0x23, + 35335 - 19968: jis0212<<14 | 0x3C<<7 | 0x24, + 35336 - 19968: jis0208<<14 | 0x16<<7 | 0x36, + 35338 - 19968: jis0208<<14 | 0x1E<<7 | 0x35, + 35340 - 19968: jis0208<<14 | 0x4A<<7 | 0x20, + 35342 - 19968: jis0208<<14 | 0x25<<7 | 0x03, + 35343 - 19968: jis0212<<14 | 0x3C<<7 | 0x25, + 35344 - 19968: jis0208<<14 | 0x4A<<7 | 0x1F, + 35345 - 19968: jis0212<<14 | 0x3C<<7 | 0x26, + 35346 - 19968: jis0208<<14 | 0x5A<<7 | 0x46, + 35347 - 19968: jis0208<<14 | 0x16<<7 | 0x10, + 35348 - 19968: jis0212<<14 | 0x3C<<7 | 0x28, + 35349 - 19968: jis0212<<14 | 0x3C<<7 | 0x29, + 35350 - 19968: jis0208<<14 | 0x4A<<7 | 0x1E, + 35351 - 19968: jis0208<<14 | 0x21<<7 | 0x56, + 35352 - 19968: jis0208<<14 | 0x14<<7 | 0x0C, + 35355 - 19968: jis0208<<14 | 0x4A<<7 | 0x21, + 35357 - 19968: jis0208<<14 | 0x4A<<7 | 0x22, + 35358 - 19968: jis0212<<14 | 0x3C<<7 | 0x2A, + 35359 - 19968: jis0208<<14 | 0x1D<<7 | 0x38, + 35360 - 19968: jis0212<<14 | 0x3C<<7 | 0x2B, + 35362 - 19968: jis0212<<14 | 0x3C<<7 | 0x2C, + 35363 - 19968: jis0208<<14 | 0x16<<7 | 0x4C, + 35364 - 19968: jis0212<<14 | 0x3C<<7 | 0x2D, + 35365 - 19968: jis0208<<14 | 0x4A<<7 | 0x23, + 35366 - 19968: jis0212<<14 | 0x3C<<7 | 0x2E, + 35370 - 19968: jis0208<<14 | 0x2A<<7 | 0x0B, + 35371 - 19968: jis0212<<14 | 0x3C<<7 | 0x2F, + 35372 - 19968: jis0212<<14 | 0x3C<<7 | 0x30, + 35373 - 19968: jis0208<<14 | 0x1F<<7 | 0x3E, + 35375 - 19968: jis0212<<14 | 0x3C<<7 | 0x31, + 35377 - 19968: jis0208<<14 | 0x14<<7 | 0x55, + 35379 - 19968: jis0208<<14 | 0x2B<<7 | 0x54, + 35380 - 19968: jis0208<<14 | 0x20<<7 | 0x29, + 35381 - 19968: jis0212<<14 | 0x3C<<7 | 0x32, + 35382 - 19968: jis0208<<14 | 0x4A<<7 | 0x24, + 35383 - 19968: jis0208<<14 | 0x5A<<7 | 0x47, + 35386 - 19968: jis0208<<14 | 0x1E<<7 | 0x26, + 35387 - 19968: jis0208<<14 | 0x22<<7 | 0x4F, + 35388 - 19968: jis0208<<14 | 0x1D<<7 | 0x39, + 35389 - 19968: jis0212<<14 | 0x3C<<7 | 0x34, + 35390 - 19968: jis0212<<14 | 0x3C<<7 | 0x35, + 35392 - 19968: jis0212<<14 | 0x3C<<7 | 0x36, + 35393 - 19968: jis0208<<14 | 0x4A<<7 | 0x25, + 35395 - 19968: jis0212<<14 | 0x3C<<7 | 0x37, + 35397 - 19968: jis0212<<14 | 0x3C<<7 | 0x38, + 35398 - 19968: jis0208<<14 | 0x4A<<7 | 0x28, + 35399 - 19968: jis0212<<14 | 0x3C<<7 | 0x39, + 35400 - 19968: jis0208<<14 | 0x4A<<7 | 0x29, + 35401 - 19968: jis0212<<14 | 0x3C<<7 | 0x3A, + 35405 - 19968: jis0212<<14 | 0x3C<<7 | 0x3B, + 35406 - 19968: jis0212<<14 | 0x3C<<7 | 0x3C, + 35408 - 19968: jis0208<<14 | 0x19<<7 | 0x1D, + 35409 - 19968: jis0208<<14 | 0x21<<7 | 0x21, + 35410 - 19968: jis0208<<14 | 0x4A<<7 | 0x27, + 35411 - 19968: jis0212<<14 | 0x3C<<7 | 0x3D, + 35412 - 19968: jis0208<<14 | 0x1D<<7 | 0x3A, + 35413 - 19968: jis0208<<14 | 0x28<<7 | 0x1D, + 35414 - 19968: jis0212<<14 | 0x3C<<7 | 0x3E, + 35415 - 19968: jis0212<<14 | 0x3C<<7 | 0x3F, + 35416 - 19968: jis0212<<14 | 0x3C<<7 | 0x40, + 35419 - 19968: jis0208<<14 | 0x4A<<7 | 0x26, + 35420 - 19968: jis0212<<14 | 0x3C<<7 | 0x41, + 35421 - 19968: jis0212<<14 | 0x3C<<7 | 0x42, + 35422 - 19968: jis0208<<14 | 0x1A<<7 | 0x4B, + 35424 - 19968: jis0208<<14 | 0x10<<7 | 0x32, + 35425 - 19968: jis0212<<14 | 0x3C<<7 | 0x43, + 35426 - 19968: jis0208<<14 | 0x4A<<7 | 0x2D, + 35427 - 19968: jis0208<<14 | 0x16<<7 | 0x37, + 35429 - 19968: jis0212<<14 | 0x3C<<7 | 0x44, + 35430 - 19968: jis0208<<14 | 0x1A<<7 | 0x4D, + 35431 - 19968: jis0212<<14 | 0x3C<<7 | 0x45, + 35433 - 19968: jis0208<<14 | 0x1A<<7 | 0x4C, + 35435 - 19968: jis0208<<14 | 0x2E<<7 | 0x2C, + 35436 - 19968: jis0208<<14 | 0x4A<<7 | 0x2C, + 35437 - 19968: jis0208<<14 | 0x4A<<7 | 0x2B, + 35438 - 19968: jis0208<<14 | 0x20<<7 | 0x06, + 35440 - 19968: jis0208<<14 | 0x14<<7 | 0x2C, + 35441 - 19968: jis0208<<14 | 0x2E<<7 | 0x22, + 35442 - 19968: jis0208<<14 | 0x12<<7 | 0x19, + 35443 - 19968: jis0208<<14 | 0x1D<<7 | 0x3B, + 35445 - 19968: jis0212<<14 | 0x3C<<7 | 0x46, + 35446 - 19968: jis0212<<14 | 0x3C<<7 | 0x47, + 35447 - 19968: jis0212<<14 | 0x3C<<7 | 0x48, + 35449 - 19968: jis0208<<14 | 0x5A<<7 | 0x48, + 35450 - 19968: jis0212<<14 | 0x3C<<7 | 0x4A, + 35451 - 19968: jis0212<<14 | 0x3C<<7 | 0x4B, + 35452 - 19968: jis0208<<14 | 0x4A<<7 | 0x2A, + 35454 - 19968: jis0212<<14 | 0x3C<<7 | 0x4C, + 35455 - 19968: jis0212<<14 | 0x3C<<7 | 0x4D, + 35456 - 19968: jis0212<<14 | 0x3C<<7 | 0x4E, + 35458 - 19968: jis0208<<14 | 0x4A<<7 | 0x2F, + 35459 - 19968: jis0212<<14 | 0x3C<<7 | 0x4F, + 35460 - 19968: jis0208<<14 | 0x4A<<7 | 0x30, + 35461 - 19968: jis0208<<14 | 0x4A<<7 | 0x2E, + 35462 - 19968: jis0212<<14 | 0x3C<<7 | 0x50, + 35463 - 19968: jis0208<<14 | 0x17<<7 | 0x37, + 35465 - 19968: jis0208<<14 | 0x2C<<7 | 0x1F, + 35467 - 19968: jis0212<<14 | 0x3C<<7 | 0x51, + 35468 - 19968: jis0208<<14 | 0x1A<<7 | 0x4E, + 35469 - 19968: jis0208<<14 | 0x26<<7 | 0x06, + 35471 - 19968: jis0212<<14 | 0x3C<<7 | 0x52, + 35472 - 19968: jis0212<<14 | 0x3C<<7 | 0x53, + 35473 - 19968: jis0208<<14 | 0x4A<<7 | 0x33, + 35474 - 19968: jis0212<<14 | 0x3C<<7 | 0x54, + 35475 - 19968: jis0208<<14 | 0x1F<<7 | 0x1F, + 35477 - 19968: jis0208<<14 | 0x22<<7 | 0x21, + 35478 - 19968: jis0212<<14 | 0x3C<<7 | 0x55, + 35479 - 19968: jis0212<<14 | 0x3C<<7 | 0x56, + 35480 - 19968: jis0208<<14 | 0x2C<<7 | 0x15, + 35481 - 19968: jis0212<<14 | 0x3C<<7 | 0x57, + 35482 - 19968: jis0208<<14 | 0x4A<<7 | 0x36, + 35486 - 19968: jis0208<<14 | 0x17<<7 | 0x4B, + 35487 - 19968: jis0212<<14 | 0x3C<<7 | 0x58, + 35488 - 19968: jis0208<<14 | 0x1F<<7 | 0x1E, + 35489 - 19968: jis0208<<14 | 0x4A<<7 | 0x32, + 35491 - 19968: jis0208<<14 | 0x4A<<7 | 0x37, + 35492 - 19968: jis0208<<14 | 0x17<<7 | 0x4C, + 35493 - 19968: jis0208<<14 | 0x4A<<7 | 0x34, + 35494 - 19968: jis0208<<14 | 0x4A<<7 | 0x35, + 35495 - 19968: jis0208<<14 | 0x5A<<7 | 0x49, + 35496 - 19968: jis0208<<14 | 0x4A<<7 | 0x31, + 35497 - 19968: jis0212<<14 | 0x3C<<7 | 0x5A, + 35500 - 19968: jis0208<<14 | 0x1F<<7 | 0x41, + 35501 - 19968: jis0208<<14 | 0x25<<7 | 0x28, + 35502 - 19968: jis0212<<14 | 0x3C<<7 | 0x5B, + 35503 - 19968: jis0212<<14 | 0x3C<<7 | 0x5C, + 35504 - 19968: jis0208<<14 | 0x22<<7 | 0x0E, + 35506 - 19968: jis0208<<14 | 0x11<<7 | 0x3C, + 35507 - 19968: jis0212<<14 | 0x3C<<7 | 0x5D, + 35510 - 19968: jis0212<<14 | 0x3D<<7 | 0x00, + 35511 - 19968: jis0212<<14 | 0x3D<<7 | 0x01, + 35513 - 19968: jis0208<<14 | 0x27<<7 | 0x4F, + 35515 - 19968: jis0212<<14 | 0x3D<<7 | 0x02, + 35516 - 19968: jis0208<<14 | 0x14<<7 | 0x22, + 35518 - 19968: jis0208<<14 | 0x5A<<7 | 0x4A, + 35519 - 19968: jis0208<<14 | 0x23<<7 | 0x13, + 35522 - 19968: jis0208<<14 | 0x4A<<7 | 0x3A, + 35523 - 19968: jis0212<<14 | 0x3D<<7 | 0x04, + 35524 - 19968: jis0208<<14 | 0x4A<<7 | 0x38, + 35526 - 19968: jis0212<<14 | 0x3D<<7 | 0x05, + 35527 - 19968: jis0208<<14 | 0x22<<7 | 0x2B, + 35528 - 19968: jis0212<<14 | 0x3D<<7 | 0x06, + 35529 - 19968: jis0212<<14 | 0x3D<<7 | 0x07, + 35530 - 19968: jis0212<<14 | 0x3D<<7 | 0x08, + 35531 - 19968: jis0208<<14 | 0x1F<<7 | 0x20, + 35532 - 19968: jis0208<<14 | 0x13<<7 | 0x31, + 35533 - 19968: jis0208<<14 | 0x4A<<7 | 0x39, + 35535 - 19968: jis0208<<14 | 0x1E<<7 | 0x3A, + 35537 - 19968: jis0212<<14 | 0x3D<<7 | 0x09, + 35538 - 19968: jis0208<<14 | 0x2D<<7 | 0x29, + 35539 - 19968: jis0212<<14 | 0x3D<<7 | 0x0A, + 35540 - 19968: jis0212<<14 | 0x3D<<7 | 0x0B, + 35541 - 19968: jis0212<<14 | 0x3D<<7 | 0x0C, + 35542 - 19968: jis0208<<14 | 0x2E<<7 | 0x1F, + 35543 - 19968: jis0212<<14 | 0x3D<<7 | 0x0D, + 35546 - 19968: jis0208<<14 | 0x4A<<7 | 0x3B, + 35547 - 19968: jis0208<<14 | 0x4A<<7 | 0x46, + 35548 - 19968: jis0208<<14 | 0x23<<7 | 0x14, + 35549 - 19968: jis0212<<14 | 0x3D<<7 | 0x0E, + 35550 - 19968: jis0208<<14 | 0x4A<<7 | 0x45, + 35551 - 19968: jis0208<<14 | 0x5A<<7 | 0x4B, + 35552 - 19968: jis0208<<14 | 0x4A<<7 | 0x42, + 35553 - 19968: jis0208<<14 | 0x4A<<7 | 0x4A, + 35554 - 19968: jis0208<<14 | 0x4A<<7 | 0x43, + 35556 - 19968: jis0208<<14 | 0x4A<<7 | 0x3F, + 35558 - 19968: jis0208<<14 | 0x23<<7 | 0x5B, + 35559 - 19968: jis0208<<14 | 0x4A<<7 | 0x3E, + 35563 - 19968: jis0208<<14 | 0x4A<<7 | 0x3C, + 35564 - 19968: jis0212<<14 | 0x3D<<7 | 0x10, + 35565 - 19968: jis0208<<14 | 0x2C<<7 | 0x00, + 35566 - 19968: jis0208<<14 | 0x1A<<7 | 0x4F, + 35568 - 19968: jis0212<<14 | 0x3D<<7 | 0x11, + 35569 - 19968: jis0208<<14 | 0x4A<<7 | 0x40, + 35571 - 19968: jis0208<<14 | 0x4A<<7 | 0x3D, + 35572 - 19968: jis0212<<14 | 0x3D<<7 | 0x12, + 35573 - 19968: jis0212<<14 | 0x3D<<7 | 0x13, + 35574 - 19968: jis0208<<14 | 0x5A<<7 | 0x4D, + 35575 - 19968: jis0208<<14 | 0x4A<<7 | 0x44, + 35576 - 19968: jis0208<<14 | 0x1C<<7 | 0x53, + 35578 - 19968: jis0208<<14 | 0x17<<7 | 0x20, + 35580 - 19968: jis0212<<14 | 0x3D<<7 | 0x15, + 35582 - 19968: jis0208<<14 | 0x21<<7 | 0x59, + 35583 - 19968: jis0212<<14 | 0x3D<<7 | 0x16, + 35584 - 19968: jis0208<<14 | 0x2A<<7 | 0x24, + 35585 - 19968: jis0208<<14 | 0x10<<7 | 0x39, + 35586 - 19968: jis0208<<14 | 0x0F<<7 | 0x41, + 35588 - 19968: jis0208<<14 | 0x25<<7 | 0x04, + 35589 - 19968: jis0212<<14 | 0x3D<<7 | 0x17, + 35590 - 19968: jis0212<<14 | 0x3D<<7 | 0x18, + 35591 - 19968: jis0208<<14 | 0x4A<<7 | 0x48, + 35594 - 19968: jis0212<<14 | 0x3D<<7 | 0x1E, + 35595 - 19968: jis0212<<14 | 0x3D<<7 | 0x19, + 35596 - 19968: jis0208<<14 | 0x4A<<7 | 0x47, + 35598 - 19968: jis0208<<14 | 0x25<<7 | 0x45, + 35600 - 19968: jis0208<<14 | 0x4A<<7 | 0x4C, + 35601 - 19968: jis0212<<14 | 0x3D<<7 | 0x1A, + 35604 - 19968: jis0208<<14 | 0x4A<<7 | 0x41, + 35606 - 19968: jis0208<<14 | 0x4A<<7 | 0x4B, + 35607 - 19968: jis0208<<14 | 0x4A<<7 | 0x4D, + 35609 - 19968: jis0208<<14 | 0x17<<7 | 0x0B, + 35610 - 19968: jis0208<<14 | 0x4A<<7 | 0x49, + 35611 - 19968: jis0208<<14 | 0x18<<7 | 0x35, + 35612 - 19968: jis0212<<14 | 0x3D<<7 | 0x1B, + 35613 - 19968: jis0208<<14 | 0x1B<<7 | 0x34, + 35614 - 19968: jis0212<<14 | 0x3D<<7 | 0x1C, + 35615 - 19968: jis0212<<14 | 0x3D<<7 | 0x1D, + 35616 - 19968: jis0208<<14 | 0x4A<<7 | 0x4E, + 35617 - 19968: jis0208<<14 | 0x2C<<7 | 0x37, + 35622 - 19968: jis0208<<14 | 0x4A<<7 | 0x51, + 35624 - 19968: jis0208<<14 | 0x4A<<7 | 0x54, + 35627 - 19968: jis0208<<14 | 0x4A<<7 | 0x52, + 35628 - 19968: jis0208<<14 | 0x28<<7 | 0x14, + 35629 - 19968: jis0212<<14 | 0x3D<<7 | 0x1F, + 35632 - 19968: jis0212<<14 | 0x3D<<7 | 0x20, + 35635 - 19968: jis0208<<14 | 0x4A<<7 | 0x4F, + 35639 - 19968: jis0212<<14 | 0x3D<<7 | 0x21, + 35641 - 19968: jis0208<<14 | 0x15<<7 | 0x3F, + 35644 - 19968: jis0212<<14 | 0x3D<<7 | 0x22, + 35646 - 19968: jis0208<<14 | 0x4A<<7 | 0x53, + 35649 - 19968: jis0208<<14 | 0x4A<<7 | 0x55, + 35650 - 19968: jis0212<<14 | 0x3D<<7 | 0x23, + 35651 - 19968: jis0212<<14 | 0x3D<<7 | 0x24, + 35652 - 19968: jis0212<<14 | 0x3D<<7 | 0x25, + 35653 - 19968: jis0212<<14 | 0x3D<<7 | 0x26, + 35654 - 19968: jis0212<<14 | 0x3D<<7 | 0x27, + 35656 - 19968: jis0212<<14 | 0x3D<<7 | 0x28, + 35657 - 19968: jis0208<<14 | 0x4A<<7 | 0x59, + 35660 - 19968: jis0208<<14 | 0x4A<<7 | 0x56, + 35661 - 19968: jis0212<<14 | 0x3D<<7 | 0x2D, + 35662 - 19968: jis0208<<14 | 0x4A<<7 | 0x58, + 35663 - 19968: jis0208<<14 | 0x4A<<7 | 0x57, + 35666 - 19968: jis0212<<14 | 0x3D<<7 | 0x29, + 35667 - 19968: jis0208<<14 | 0x5A<<7 | 0x4E, + 35668 - 19968: jis0212<<14 | 0x3D<<7 | 0x2B, + 35670 - 19968: jis0208<<14 | 0x4A<<7 | 0x5A, + 35672 - 19968: jis0208<<14 | 0x1B<<7 | 0x10, + 35673 - 19968: jis0212<<14 | 0x3D<<7 | 0x2C, + 35674 - 19968: jis0208<<14 | 0x4A<<7 | 0x5C, + 35675 - 19968: jis0208<<14 | 0x4A<<7 | 0x5B, + 35676 - 19968: jis0208<<14 | 0x28<<7 | 0x47, + 35678 - 19968: jis0212<<14 | 0x3D<<7 | 0x2E, + 35679 - 19968: jis0208<<14 | 0x4B<<7 | 0x00, + 35683 - 19968: jis0212<<14 | 0x3D<<7 | 0x2F, + 35686 - 19968: jis0208<<14 | 0x16<<7 | 0x38, + 35691 - 19968: jis0208<<14 | 0x4A<<7 | 0x5D, + 35692 - 19968: jis0208<<14 | 0x4B<<7 | 0x01, + 35693 - 19968: jis0212<<14 | 0x3D<<7 | 0x30, + 35695 - 19968: jis0208<<14 | 0x4B<<7 | 0x02, + 35696 - 19968: jis0208<<14 | 0x14<<7 | 0x23, + 35697 - 19968: jis0208<<14 | 0x45<<7 | 0x20, + 35698 - 19968: jis0208<<14 | 0x1D<<7 | 0x58, + 35700 - 19968: jis0208<<14 | 0x4B<<7 | 0x03, + 35702 - 19968: jis0212<<14 | 0x3D<<7 | 0x31, + 35703 - 19968: jis0208<<14 | 0x17<<7 | 0x4D, + 35704 - 19968: jis0212<<14 | 0x3D<<7 | 0x32, + 35705 - 19968: jis0212<<14 | 0x3D<<7 | 0x33, + 35708 - 19968: jis0212<<14 | 0x3D<<7 | 0x34, + 35709 - 19968: jis0208<<14 | 0x4B<<7 | 0x04, + 35710 - 19968: jis0212<<14 | 0x3D<<7 | 0x35, + 35711 - 19968: jis0208<<14 | 0x5A<<7 | 0x4F, + 35712 - 19968: jis0208<<14 | 0x4B<<7 | 0x05, + 35713 - 19968: jis0212<<14 | 0x3D<<7 | 0x36, + 35715 - 19968: jis0208<<14 | 0x1A<<7 | 0x1D, + 35716 - 19968: jis0212<<14 | 0x3D<<7 | 0x37, + 35717 - 19968: jis0212<<14 | 0x3D<<7 | 0x38, + 35722 - 19968: jis0208<<14 | 0x39<<7 | 0x2D, + 35723 - 19968: jis0212<<14 | 0x3D<<7 | 0x39, + 35724 - 19968: jis0208<<14 | 0x4B<<7 | 0x06, + 35725 - 19968: jis0212<<14 | 0x3D<<7 | 0x3A, + 35726 - 19968: jis0208<<14 | 0x4B<<7 | 0x07, + 35727 - 19968: jis0212<<14 | 0x3D<<7 | 0x3B, + 35728 - 19968: jis0208<<14 | 0x1C<<7 | 0x11, + 35730 - 19968: jis0208<<14 | 0x4B<<7 | 0x08, + 35731 - 19968: jis0208<<14 | 0x4B<<7 | 0x09, + 35732 - 19968: jis0212<<14 | 0x3D<<7 | 0x3C, + 35733 - 19968: jis0212<<14 | 0x3D<<7 | 0x3D, + 35734 - 19968: jis0208<<14 | 0x4B<<7 | 0x0A, + 35737 - 19968: jis0208<<14 | 0x4B<<7 | 0x0B, + 35738 - 19968: jis0208<<14 | 0x4B<<7 | 0x0C, + 35740 - 19968: jis0212<<14 | 0x3D<<7 | 0x3E, + 35742 - 19968: jis0212<<14 | 0x3D<<7 | 0x3F, + 35743 - 19968: jis0212<<14 | 0x3D<<7 | 0x40, + 35895 - 19968: jis0208<<14 | 0x22<<7 | 0x0A, + 35896 - 19968: jis0212<<14 | 0x3D<<7 | 0x41, + 35897 - 19968: jis0212<<14 | 0x3D<<7 | 0x42, + 35898 - 19968: jis0208<<14 | 0x4B<<7 | 0x0D, + 35901 - 19968: jis0212<<14 | 0x3D<<7 | 0x43, + 35902 - 19968: jis0212<<14 | 0x3D<<7 | 0x44, + 35903 - 19968: jis0208<<14 | 0x4B<<7 | 0x0F, + 35905 - 19968: jis0208<<14 | 0x4B<<7 | 0x0E, + 35909 - 19968: jis0212<<14 | 0x3D<<7 | 0x45, + 35910 - 19968: jis0208<<14 | 0x25<<7 | 0x05, + 35911 - 19968: jis0212<<14 | 0x3D<<7 | 0x46, + 35912 - 19968: jis0208<<14 | 0x4B<<7 | 0x10, + 35913 - 19968: jis0212<<14 | 0x3D<<7 | 0x47, + 35914 - 19968: jis0208<<14 | 0x2A<<7 | 0x0C, + 35915 - 19968: jis0212<<14 | 0x3D<<7 | 0x48, + 35916 - 19968: jis0208<<14 | 0x4B<<7 | 0x11, + 35918 - 19968: jis0208<<14 | 0x4B<<7 | 0x12, + 35919 - 19968: jis0212<<14 | 0x3D<<7 | 0x49, + 35920 - 19968: jis0208<<14 | 0x4B<<7 | 0x13, + 35921 - 19968: jis0212<<14 | 0x3D<<7 | 0x4A, + 35923 - 19968: jis0212<<14 | 0x3D<<7 | 0x4B, + 35924 - 19968: jis0212<<14 | 0x3D<<7 | 0x4C, + 35925 - 19968: jis0208<<14 | 0x4B<<7 | 0x14, + 35927 - 19968: jis0212<<14 | 0x3D<<7 | 0x4D, + 35928 - 19968: jis0212<<14 | 0x3D<<7 | 0x4E, + 35929 - 19968: jis0212<<14 | 0x3D<<7 | 0x51, + 35930 - 19968: jis0208<<14 | 0x25<<7 | 0x39, + 35931 - 19968: jis0212<<14 | 0x3D<<7 | 0x4F, + 35933 - 19968: jis0212<<14 | 0x3D<<7 | 0x50, + 35937 - 19968: jis0208<<14 | 0x1D<<7 | 0x3C, + 35938 - 19968: jis0208<<14 | 0x4B<<7 | 0x15, + 35939 - 19968: jis0212<<14 | 0x3D<<7 | 0x52, + 35940 - 19968: jis0212<<14 | 0x3D<<7 | 0x53, + 35942 - 19968: jis0212<<14 | 0x3D<<7 | 0x54, + 35944 - 19968: jis0212<<14 | 0x3D<<7 | 0x55, + 35945 - 19968: jis0212<<14 | 0x3D<<7 | 0x56, + 35946 - 19968: jis0208<<14 | 0x18<<7 | 0x4A, + 35947 - 19968: jis0208<<14 | 0x2F<<7 | 0x0D, + 35948 - 19968: jis0208<<14 | 0x4B<<7 | 0x16, + 35949 - 19968: jis0212<<14 | 0x3D<<7 | 0x57, + 35955 - 19968: jis0212<<14 | 0x3D<<7 | 0x58, + 35957 - 19968: jis0212<<14 | 0x3D<<7 | 0x59, + 35958 - 19968: jis0212<<14 | 0x3D<<7 | 0x5A, + 35960 - 19968: jis0208<<14 | 0x4B<<7 | 0x17, + 35961 - 19968: jis0208<<14 | 0x28<<7 | 0x1E, + 35962 - 19968: jis0208<<14 | 0x4B<<7 | 0x18, + 35963 - 19968: jis0212<<14 | 0x3D<<7 | 0x5B, + 35964 - 19968: jis0208<<14 | 0x4B<<7 | 0x20, + 35966 - 19968: jis0212<<14 | 0x3D<<7 | 0x5C, + 35970 - 19968: jis0208<<14 | 0x4B<<7 | 0x19, + 35973 - 19968: jis0208<<14 | 0x4B<<7 | 0x1B, + 35974 - 19968: jis0212<<14 | 0x3D<<7 | 0x5D, + 35975 - 19968: jis0212<<14 | 0x3E<<7 | 0x00, + 35977 - 19968: jis0208<<14 | 0x4B<<7 | 0x1A, + 35978 - 19968: jis0208<<14 | 0x4B<<7 | 0x1C, + 35979 - 19968: jis0212<<14 | 0x3E<<7 | 0x01, + 35980 - 19968: jis0208<<14 | 0x2A<<7 | 0x25, + 35981 - 19968: jis0208<<14 | 0x4B<<7 | 0x1D, + 35982 - 19968: jis0208<<14 | 0x4B<<7 | 0x1E, + 35984 - 19968: jis0212<<14 | 0x3E<<7 | 0x02, + 35986 - 19968: jis0212<<14 | 0x3E<<7 | 0x03, + 35987 - 19968: jis0212<<14 | 0x3E<<7 | 0x04, + 35988 - 19968: jis0208<<14 | 0x4B<<7 | 0x1F, + 35992 - 19968: jis0208<<14 | 0x4B<<7 | 0x21, + 35993 - 19968: jis0212<<14 | 0x3E<<7 | 0x05, + 35995 - 19968: jis0212<<14 | 0x3E<<7 | 0x06, + 35996 - 19968: jis0212<<14 | 0x3E<<7 | 0x07, + 35997 - 19968: jis0208<<14 | 0x12<<7 | 0x0C, + 35998 - 19968: jis0208<<14 | 0x23<<7 | 0x46, + 36000 - 19968: jis0208<<14 | 0x28<<7 | 0x48, + 36001 - 19968: jis0208<<14 | 0x19<<7 | 0x41, + 36002 - 19968: jis0208<<14 | 0x18<<7 | 0x36, + 36004 - 19968: jis0212<<14 | 0x3E<<7 | 0x08, + 36007 - 19968: jis0208<<14 | 0x28<<7 | 0x2E, + 36008 - 19968: jis0208<<14 | 0x11<<7 | 0x3E, + 36009 - 19968: jis0208<<14 | 0x27<<7 | 0x2D, + 36010 - 19968: jis0208<<14 | 0x4B<<7 | 0x24, + 36011 - 19968: jis0208<<14 | 0x13<<7 | 0x32, + 36012 - 19968: jis0208<<14 | 0x1F<<7 | 0x34, + 36013 - 19968: jis0208<<14 | 0x4B<<7 | 0x23, + 36014 - 19968: jis0208<<14 | 0x4B<<7 | 0x28, + 36015 - 19968: jis0208<<14 | 0x22<<7 | 0x58, + 36016 - 19968: jis0208<<14 | 0x2B<<7 | 0x42, + 36018 - 19968: jis0208<<14 | 0x4B<<7 | 0x26, + 36019 - 19968: jis0208<<14 | 0x4B<<7 | 0x27, + 36020 - 19968: jis0208<<14 | 0x14<<7 | 0x0D, + 36022 - 19968: jis0208<<14 | 0x4B<<7 | 0x29, + 36023 - 19968: jis0208<<14 | 0x26<<7 | 0x42, + 36024 - 19968: jis0208<<14 | 0x21<<7 | 0x3E, + 36025 - 19968: jis0212<<14 | 0x3E<<7 | 0x09, + 36026 - 19968: jis0212<<14 | 0x3E<<7 | 0x0A, + 36027 - 19968: jis0208<<14 | 0x27<<7 | 0x50, + 36028 - 19968: jis0208<<14 | 0x24<<7 | 0x1C, + 36029 - 19968: jis0208<<14 | 0x4B<<7 | 0x25, + 36031 - 19968: jis0208<<14 | 0x2A<<7 | 0x26, + 36032 - 19968: jis0208<<14 | 0x11<<7 | 0x4B, + 36033 - 19968: jis0208<<14 | 0x4B<<7 | 0x2B, + 36034 - 19968: jis0208<<14 | 0x2E<<7 | 0x07, + 36035 - 19968: jis0208<<14 | 0x23<<7 | 0x21, + 36036 - 19968: jis0208<<14 | 0x2E<<7 | 0x24, + 36037 - 19968: jis0212<<14 | 0x3E<<7 | 0x0B, + 36038 - 19968: jis0212<<14 | 0x3E<<7 | 0x0C, + 36039 - 19968: jis0208<<14 | 0x1A<<7 | 0x50, + 36040 - 19968: jis0208<<14 | 0x4B<<7 | 0x2A, + 36041 - 19968: jis0212<<14 | 0x3E<<7 | 0x0D, + 36042 - 19968: jis0208<<14 | 0x21<<7 | 0x10, + 36043 - 19968: jis0212<<14 | 0x3E<<7 | 0x0E, + 36045 - 19968: jis0208<<14 | 0x4B<<7 | 0x3B, + 36046 - 19968: jis0208<<14 | 0x20<<7 | 0x07, + 36047 - 19968: jis0212<<14 | 0x3E<<7 | 0x0F, + 36049 - 19968: jis0208<<14 | 0x25<<7 | 0x57, + 36051 - 19968: jis0208<<14 | 0x28<<7 | 0x2F, + 36053 - 19968: jis0212<<14 | 0x3E<<7 | 0x11, + 36054 - 19968: jis0212<<14 | 0x3E<<7 | 0x10, + 36057 - 19968: jis0212<<14 | 0x3E<<7 | 0x12, + 36058 - 19968: jis0208<<14 | 0x4B<<7 | 0x2E, + 36059 - 19968: jis0208<<14 | 0x1A<<7 | 0x1E, + 36060 - 19968: jis0208<<14 | 0x1A<<7 | 0x51, + 36061 - 19968: jis0212<<14 | 0x3E<<7 | 0x13, + 36062 - 19968: jis0208<<14 | 0x1D<<7 | 0x3D, + 36064 - 19968: jis0208<<14 | 0x26<<7 | 0x44, + 36065 - 19968: jis0212<<14 | 0x3E<<7 | 0x14, + 36066 - 19968: jis0208<<14 | 0x17<<7 | 0x0C, + 36067 - 19968: jis0208<<14 | 0x4B<<7 | 0x2D, + 36068 - 19968: jis0208<<14 | 0x4B<<7 | 0x2C, + 36070 - 19968: jis0208<<14 | 0x28<<7 | 0x49, + 36072 - 19968: jis0212<<14 | 0x3E<<7 | 0x15, + 36074 - 19968: jis0208<<14 | 0x1B<<7 | 0x20, + 36076 - 19968: jis0212<<14 | 0x3E<<7 | 0x16, + 36077 - 19968: jis0208<<14 | 0x24<<7 | 0x31, + 36079 - 19968: jis0212<<14 | 0x3E<<7 | 0x17, + 36080 - 19968: jis0208<<14 | 0x5A<<7 | 0x50, + 36082 - 19968: jis0212<<14 | 0x3E<<7 | 0x19, + 36084 - 19968: jis0208<<14 | 0x5A<<7 | 0x51, + 36085 - 19968: jis0212<<14 | 0x3E<<7 | 0x1A, + 36087 - 19968: jis0212<<14 | 0x3E<<7 | 0x1B, + 36088 - 19968: jis0212<<14 | 0x3E<<7 | 0x1C, + 36090 - 19968: jis0208<<14 | 0x4B<<7 | 0x30, + 36091 - 19968: jis0208<<14 | 0x4B<<7 | 0x31, + 36092 - 19968: jis0208<<14 | 0x18<<7 | 0x37, + 36093 - 19968: jis0208<<14 | 0x4B<<7 | 0x2F, + 36094 - 19968: jis0212<<14 | 0x3E<<7 | 0x1D, + 36095 - 19968: jis0212<<14 | 0x3E<<7 | 0x1E, + 36097 - 19968: jis0212<<14 | 0x3E<<7 | 0x1F, + 36099 - 19968: jis0212<<14 | 0x3E<<7 | 0x20, + 36100 - 19968: jis0208<<14 | 0x4B<<7 | 0x32, + 36101 - 19968: jis0208<<14 | 0x4B<<7 | 0x33, + 36103 - 19968: jis0208<<14 | 0x4B<<7 | 0x35, + 36104 - 19968: jis0208<<14 | 0x21<<7 | 0x02, + 36105 - 19968: jis0212<<14 | 0x3E<<7 | 0x21, + 36106 - 19968: jis0208<<14 | 0x4B<<7 | 0x34, + 36107 - 19968: jis0208<<14 | 0x13<<7 | 0x45, + 36109 - 19968: jis0208<<14 | 0x4B<<7 | 0x37, + 36111 - 19968: jis0208<<14 | 0x4B<<7 | 0x36, + 36112 - 19968: jis0208<<14 | 0x4B<<7 | 0x38, + 36114 - 19968: jis0208<<14 | 0x5A<<7 | 0x52, + 36115 - 19968: jis0208<<14 | 0x4B<<7 | 0x3A, + 36116 - 19968: jis0208<<14 | 0x4B<<7 | 0x3C, + 36118 - 19968: jis0208<<14 | 0x4B<<7 | 0x3D, + 36119 - 19968: jis0212<<14 | 0x3E<<7 | 0x23, + 36123 - 19968: jis0212<<14 | 0x3E<<7 | 0x24, + 36196 - 19968: jis0208<<14 | 0x1F<<7 | 0x35, + 36197 - 19968: jis0212<<14 | 0x3E<<7 | 0x25, + 36198 - 19968: jis0208<<14 | 0x1B<<7 | 0x2E, + 36199 - 19968: jis0208<<14 | 0x4B<<7 | 0x3E, + 36201 - 19968: jis0212<<14 | 0x3E<<7 | 0x26, + 36203 - 19968: jis0208<<14 | 0x12<<7 | 0x31, + 36204 - 19968: jis0212<<14 | 0x3E<<7 | 0x27, + 36205 - 19968: jis0208<<14 | 0x4B<<7 | 0x3F, + 36206 - 19968: jis0212<<14 | 0x3E<<7 | 0x28, + 36208 - 19968: jis0208<<14 | 0x20<<7 | 0x55, + 36209 - 19968: jis0208<<14 | 0x4B<<7 | 0x40, + 36211 - 19968: jis0208<<14 | 0x4B<<7 | 0x41, + 36212 - 19968: jis0208<<14 | 0x28<<7 | 0x4A, + 36214 - 19968: jis0208<<14 | 0x5A<<7 | 0x53, + 36215 - 19968: jis0208<<14 | 0x14<<7 | 0x0E, + 36223 - 19968: jis0212<<14 | 0x3E<<7 | 0x29, + 36225 - 19968: jis0208<<14 | 0x4B<<7 | 0x42, + 36226 - 19968: jis0212<<14 | 0x3E<<7 | 0x2A, + 36228 - 19968: jis0212<<14 | 0x3E<<7 | 0x2B, + 36229 - 19968: jis0208<<14 | 0x23<<7 | 0x15, + 36232 - 19968: jis0212<<14 | 0x3E<<7 | 0x2C, + 36234 - 19968: jis0208<<14 | 0x10<<7 | 0x3A, + 36237 - 19968: jis0212<<14 | 0x3E<<7 | 0x2D, + 36240 - 19968: jis0212<<14 | 0x3E<<7 | 0x2E, + 36241 - 19968: jis0212<<14 | 0x3E<<7 | 0x2F, + 36245 - 19968: jis0212<<14 | 0x3E<<7 | 0x30, + 36249 - 19968: jis0208<<14 | 0x4B<<7 | 0x43, + 36254 - 19968: jis0212<<14 | 0x3E<<7 | 0x31, + 36255 - 19968: jis0212<<14 | 0x3E<<7 | 0x32, + 36256 - 19968: jis0212<<14 | 0x3E<<7 | 0x33, + 36259 - 19968: jis0208<<14 | 0x1B<<7 | 0x50, + 36262 - 19968: jis0212<<14 | 0x3E<<7 | 0x34, + 36264 - 19968: jis0208<<14 | 0x1E<<7 | 0x55, + 36267 - 19968: jis0212<<14 | 0x3E<<7 | 0x35, + 36268 - 19968: jis0212<<14 | 0x3E<<7 | 0x36, + 36271 - 19968: jis0212<<14 | 0x3E<<7 | 0x37, + 36274 - 19968: jis0212<<14 | 0x3E<<7 | 0x38, + 36275 - 19968: jis0208<<14 | 0x21<<7 | 0x0C, + 36277 - 19968: jis0212<<14 | 0x3E<<7 | 0x39, + 36279 - 19968: jis0212<<14 | 0x3E<<7 | 0x3A, + 36281 - 19968: jis0212<<14 | 0x3E<<7 | 0x3B, + 36282 - 19968: jis0208<<14 | 0x4B<<7 | 0x46, + 36283 - 19968: jis0212<<14 | 0x3E<<7 | 0x3C, + 36284 - 19968: jis0212<<14 | 0x3E<<7 | 0x4E, + 36286 - 19968: jis0208<<14 | 0x4B<<7 | 0x45, + 36288 - 19968: jis0212<<14 | 0x3E<<7 | 0x3D, + 36290 - 19968: jis0208<<14 | 0x4B<<7 | 0x44, + 36293 - 19968: jis0212<<14 | 0x3E<<7 | 0x3E, + 36294 - 19968: jis0212<<14 | 0x3E<<7 | 0x3F, + 36295 - 19968: jis0212<<14 | 0x3E<<7 | 0x40, + 36296 - 19968: jis0212<<14 | 0x3E<<7 | 0x41, + 36298 - 19968: jis0212<<14 | 0x3E<<7 | 0x42, + 36299 - 19968: jis0208<<14 | 0x4B<<7 | 0x4C, + 36300 - 19968: jis0208<<14 | 0x4B<<7 | 0x4A, + 36302 - 19968: jis0212<<14 | 0x3E<<7 | 0x43, + 36303 - 19968: jis0208<<14 | 0x4B<<7 | 0x47, + 36305 - 19968: jis0212<<14 | 0x3E<<7 | 0x44, + 36308 - 19968: jis0212<<14 | 0x3E<<7 | 0x45, + 36309 - 19968: jis0212<<14 | 0x3E<<7 | 0x46, + 36310 - 19968: jis0208<<14 | 0x4B<<7 | 0x49, + 36311 - 19968: jis0212<<14 | 0x3E<<7 | 0x47, + 36313 - 19968: jis0212<<14 | 0x3E<<7 | 0x48, + 36314 - 19968: jis0208<<14 | 0x4B<<7 | 0x48, + 36315 - 19968: jis0208<<14 | 0x4B<<7 | 0x4B, + 36317 - 19968: jis0208<<14 | 0x14<<7 | 0x56, + 36319 - 19968: jis0208<<14 | 0x4B<<7 | 0x4F, + 36321 - 19968: jis0208<<14 | 0x1F<<7 | 0x36, + 36323 - 19968: jis0208<<14 | 0x4B<<7 | 0x50, + 36324 - 19968: jis0212<<14 | 0x3E<<7 | 0x49, + 36325 - 19968: jis0212<<14 | 0x3E<<7 | 0x4A, + 36327 - 19968: jis0212<<14 | 0x3E<<7 | 0x4B, + 36328 - 19968: jis0208<<14 | 0x17<<7 | 0x38, + 36330 - 19968: jis0208<<14 | 0x4B<<7 | 0x4D, + 36331 - 19968: jis0208<<14 | 0x4B<<7 | 0x4E, + 36332 - 19968: jis0212<<14 | 0x3E<<7 | 0x4C, + 36335 - 19968: jis0208<<14 | 0x2E<<7 | 0x08, + 36336 - 19968: jis0212<<14 | 0x3E<<7 | 0x4D, + 36337 - 19968: jis0212<<14 | 0x3E<<7 | 0x4F, + 36338 - 19968: jis0212<<14 | 0x3E<<7 | 0x50, + 36339 - 19968: jis0208<<14 | 0x23<<7 | 0x16, + 36340 - 19968: jis0212<<14 | 0x3E<<7 | 0x51, + 36341 - 19968: jis0208<<14 | 0x20<<7 | 0x08, + 36348 - 19968: jis0208<<14 | 0x4B<<7 | 0x51, + 36349 - 19968: jis0212<<14 | 0x3E<<7 | 0x52, + 36351 - 19968: jis0208<<14 | 0x4B<<7 | 0x54, + 36353 - 19968: jis0212<<14 | 0x3E<<7 | 0x53, + 36356 - 19968: jis0212<<14 | 0x3E<<7 | 0x54, + 36357 - 19968: jis0212<<14 | 0x3E<<7 | 0x55, + 36358 - 19968: jis0212<<14 | 0x3E<<7 | 0x56, + 36360 - 19968: jis0208<<14 | 0x4B<<7 | 0x52, + 36361 - 19968: jis0208<<14 | 0x4B<<7 | 0x53, + 36362 - 19968: jis0208<<14 | 0x2C<<7 | 0x38, + 36363 - 19968: jis0212<<14 | 0x3E<<7 | 0x57, + 36367 - 19968: jis0208<<14 | 0x25<<7 | 0x06, + 36368 - 19968: jis0208<<14 | 0x4B<<7 | 0x57, + 36369 - 19968: jis0212<<14 | 0x3E<<7 | 0x58, + 36372 - 19968: jis0212<<14 | 0x3E<<7 | 0x59, + 36374 - 19968: jis0212<<14 | 0x3E<<7 | 0x5A, + 36381 - 19968: jis0208<<14 | 0x4B<<7 | 0x55, + 36382 - 19968: jis0208<<14 | 0x4B<<7 | 0x56, + 36383 - 19968: jis0208<<14 | 0x4B<<7 | 0x58, + 36384 - 19968: jis0212<<14 | 0x3E<<7 | 0x5B, + 36385 - 19968: jis0212<<14 | 0x3E<<7 | 0x5C, + 36386 - 19968: jis0212<<14 | 0x3E<<7 | 0x5D, + 36387 - 19968: jis0212<<14 | 0x3F<<7 | 0x00, + 36390 - 19968: jis0212<<14 | 0x3F<<7 | 0x01, + 36391 - 19968: jis0212<<14 | 0x3F<<7 | 0x02, + 36394 - 19968: jis0208<<14 | 0x4C<<7 | 0x08, + 36400 - 19968: jis0208<<14 | 0x4B<<7 | 0x5B, + 36401 - 19968: jis0212<<14 | 0x3F<<7 | 0x03, + 36403 - 19968: jis0212<<14 | 0x3F<<7 | 0x04, + 36404 - 19968: jis0208<<14 | 0x4B<<7 | 0x5C, + 36405 - 19968: jis0208<<14 | 0x4B<<7 | 0x5A, + 36406 - 19968: jis0212<<14 | 0x3F<<7 | 0x05, + 36407 - 19968: jis0212<<14 | 0x3F<<7 | 0x06, + 36408 - 19968: jis0212<<14 | 0x3F<<7 | 0x07, + 36409 - 19968: jis0212<<14 | 0x3F<<7 | 0x08, + 36413 - 19968: jis0212<<14 | 0x3F<<7 | 0x09, + 36416 - 19968: jis0212<<14 | 0x3F<<7 | 0x0A, + 36417 - 19968: jis0212<<14 | 0x3F<<7 | 0x0B, + 36418 - 19968: jis0208<<14 | 0x4B<<7 | 0x59, + 36420 - 19968: jis0208<<14 | 0x23<<7 | 0x5C, + 36423 - 19968: jis0208<<14 | 0x4C<<7 | 0x00, + 36424 - 19968: jis0208<<14 | 0x4C<<7 | 0x04, + 36425 - 19968: jis0208<<14 | 0x4C<<7 | 0x01, + 36426 - 19968: jis0208<<14 | 0x4B<<7 | 0x5D, + 36427 - 19968: jis0212<<14 | 0x3F<<7 | 0x0C, + 36428 - 19968: jis0208<<14 | 0x4C<<7 | 0x02, + 36429 - 19968: jis0212<<14 | 0x3F<<7 | 0x0D, + 36430 - 19968: jis0212<<14 | 0x3F<<7 | 0x0E, + 36431 - 19968: jis0212<<14 | 0x3F<<7 | 0x0F, + 36432 - 19968: jis0208<<14 | 0x4C<<7 | 0x03, + 36436 - 19968: jis0212<<14 | 0x3F<<7 | 0x10, + 36437 - 19968: jis0208<<14 | 0x4C<<7 | 0x0A, + 36441 - 19968: jis0208<<14 | 0x4C<<7 | 0x05, + 36443 - 19968: jis0212<<14 | 0x3F<<7 | 0x11, + 36444 - 19968: jis0212<<14 | 0x3F<<7 | 0x12, + 36445 - 19968: jis0212<<14 | 0x3F<<7 | 0x13, + 36446 - 19968: jis0212<<14 | 0x3F<<7 | 0x14, + 36447 - 19968: jis0208<<14 | 0x1F<<7 | 0x37, + 36448 - 19968: jis0208<<14 | 0x4C<<7 | 0x07, + 36449 - 19968: jis0212<<14 | 0x3F<<7 | 0x15, + 36450 - 19968: jis0212<<14 | 0x3F<<7 | 0x16, + 36451 - 19968: jis0208<<14 | 0x4C<<7 | 0x09, + 36452 - 19968: jis0208<<14 | 0x4C<<7 | 0x06, + 36457 - 19968: jis0212<<14 | 0x3F<<7 | 0x17, + 36460 - 19968: jis0212<<14 | 0x3F<<7 | 0x18, + 36461 - 19968: jis0212<<14 | 0x3F<<7 | 0x19, + 36463 - 19968: jis0212<<14 | 0x3F<<7 | 0x1A, + 36464 - 19968: jis0212<<14 | 0x3F<<7 | 0x1B, + 36465 - 19968: jis0212<<14 | 0x3F<<7 | 0x1C, + 36466 - 19968: jis0208<<14 | 0x4C<<7 | 0x0C, + 36468 - 19968: jis0208<<14 | 0x1C<<7 | 0x12, + 36470 - 19968: jis0208<<14 | 0x4C<<7 | 0x0B, + 36473 - 19968: jis0212<<14 | 0x3F<<7 | 0x1D, + 36474 - 19968: jis0212<<14 | 0x3F<<7 | 0x1E, + 36475 - 19968: jis0212<<14 | 0x3F<<7 | 0x1F, + 36476 - 19968: jis0208<<14 | 0x4C<<7 | 0x0D, + 36481 - 19968: jis0208<<14 | 0x4C<<7 | 0x0E, + 36482 - 19968: jis0212<<14 | 0x3F<<7 | 0x20, + 36483 - 19968: jis0212<<14 | 0x3F<<7 | 0x21, + 36484 - 19968: jis0208<<14 | 0x4C<<7 | 0x11, + 36485 - 19968: jis0208<<14 | 0x4C<<7 | 0x10, + 36487 - 19968: jis0208<<14 | 0x4C<<7 | 0x0F, + 36489 - 19968: jis0212<<14 | 0x3F<<7 | 0x22, + 36490 - 19968: jis0208<<14 | 0x4C<<7 | 0x13, + 36491 - 19968: jis0208<<14 | 0x4C<<7 | 0x12, + 36493 - 19968: jis0208<<14 | 0x2B<<7 | 0x55, + 36496 - 19968: jis0212<<14 | 0x3F<<7 | 0x23, + 36497 - 19968: jis0208<<14 | 0x4C<<7 | 0x15, + 36498 - 19968: jis0212<<14 | 0x3F<<7 | 0x24, + 36499 - 19968: jis0208<<14 | 0x4C<<7 | 0x14, + 36500 - 19968: jis0208<<14 | 0x4C<<7 | 0x16, + 36501 - 19968: jis0212<<14 | 0x3F<<7 | 0x25, + 36505 - 19968: jis0208<<14 | 0x4C<<7 | 0x17, + 36506 - 19968: jis0212<<14 | 0x3F<<7 | 0x26, + 36507 - 19968: jis0212<<14 | 0x3F<<7 | 0x27, + 36509 - 19968: jis0212<<14 | 0x3F<<7 | 0x28, + 36510 - 19968: jis0212<<14 | 0x3F<<7 | 0x29, + 36513 - 19968: jis0208<<14 | 0x4C<<7 | 0x19, + 36514 - 19968: jis0212<<14 | 0x3F<<7 | 0x2A, + 36519 - 19968: jis0212<<14 | 0x3F<<7 | 0x2B, + 36521 - 19968: jis0212<<14 | 0x3F<<7 | 0x2C, + 36522 - 19968: jis0208<<14 | 0x4C<<7 | 0x18, + 36523 - 19968: jis0208<<14 | 0x1E<<7 | 0x27, + 36524 - 19968: jis0208<<14 | 0x4C<<7 | 0x1A, + 36525 - 19968: jis0212<<14 | 0x3F<<7 | 0x2D, + 36526 - 19968: jis0212<<14 | 0x3F<<7 | 0x2E, + 36527 - 19968: jis0208<<14 | 0x15<<7 | 0x4C, + 36528 - 19968: jis0208<<14 | 0x4C<<7 | 0x1B, + 36529 - 19968: jis0208<<14 | 0x4C<<7 | 0x1D, + 36531 - 19968: jis0212<<14 | 0x3F<<7 | 0x2F, + 36533 - 19968: jis0212<<14 | 0x3F<<7 | 0x30, + 36538 - 19968: jis0212<<14 | 0x3F<<7 | 0x31, + 36539 - 19968: jis0212<<14 | 0x3F<<7 | 0x32, + 36542 - 19968: jis0208<<14 | 0x4C<<7 | 0x1E, + 36544 - 19968: jis0212<<14 | 0x3F<<7 | 0x33, + 36545 - 19968: jis0212<<14 | 0x3F<<7 | 0x34, + 36547 - 19968: jis0212<<14 | 0x3F<<7 | 0x35, + 36548 - 19968: jis0212<<14 | 0x3F<<7 | 0x36, + 36549 - 19968: jis0208<<14 | 0x4C<<7 | 0x1F, + 36550 - 19968: jis0208<<14 | 0x4C<<7 | 0x1C, + 36551 - 19968: jis0212<<14 | 0x3F<<7 | 0x37, + 36552 - 19968: jis0208<<14 | 0x4C<<7 | 0x20, + 36554 - 19968: jis0208<<14 | 0x1B<<7 | 0x35, + 36555 - 19968: jis0208<<14 | 0x4C<<7 | 0x21, + 36556 - 19968: jis0208<<14 | 0x14<<7 | 0x0F, + 36557 - 19968: jis0208<<14 | 0x16<<7 | 0x12, + 36559 - 19968: jis0208<<14 | 0x5A<<7 | 0x55, + 36561 - 19968: jis0212<<14 | 0x3F<<7 | 0x39, + 36562 - 19968: jis0208<<14 | 0x17<<7 | 0x0D, + 36564 - 19968: jis0212<<14 | 0x3F<<7 | 0x3A, + 36571 - 19968: jis0208<<14 | 0x4C<<7 | 0x22, + 36572 - 19968: jis0212<<14 | 0x3F<<7 | 0x3B, + 36575 - 19968: jis0208<<14 | 0x25<<7 | 0x4F, + 36578 - 19968: jis0208<<14 | 0x24<<7 | 0x1D, + 36579 - 19968: jis0208<<14 | 0x4C<<7 | 0x23, + 36584 - 19968: jis0212<<14 | 0x3F<<7 | 0x3C, + 36587 - 19968: jis0208<<14 | 0x4C<<7 | 0x26, + 36589 - 19968: jis0212<<14 | 0x3F<<7 | 0x43, + 36590 - 19968: jis0212<<14 | 0x3F<<7 | 0x3D, + 36592 - 19968: jis0212<<14 | 0x3F<<7 | 0x3E, + 36593 - 19968: jis0212<<14 | 0x3F<<7 | 0x3F, + 36599 - 19968: jis0212<<14 | 0x3F<<7 | 0x40, + 36600 - 19968: jis0208<<14 | 0x1B<<7 | 0x13, + 36601 - 19968: jis0212<<14 | 0x3F<<7 | 0x41, + 36602 - 19968: jis0212<<14 | 0x3F<<7 | 0x42, + 36603 - 19968: jis0208<<14 | 0x4C<<7 | 0x25, + 36604 - 19968: jis0208<<14 | 0x4C<<7 | 0x24, + 36605 - 19968: jis0208<<14 | 0x16<<7 | 0x39, + 36606 - 19968: jis0208<<14 | 0x4C<<7 | 0x27, + 36608 - 19968: jis0212<<14 | 0x3F<<7 | 0x44, + 36610 - 19968: jis0212<<14 | 0x3F<<7 | 0x45, + 36611 - 19968: jis0208<<14 | 0x12<<7 | 0x32, + 36613 - 19968: jis0208<<14 | 0x4C<<7 | 0x29, + 36615 - 19968: jis0212<<14 | 0x3F<<7 | 0x46, + 36616 - 19968: jis0212<<14 | 0x3F<<7 | 0x47, + 36617 - 19968: jis0208<<14 | 0x19<<7 | 0x3B, + 36618 - 19968: jis0208<<14 | 0x4C<<7 | 0x28, + 36620 - 19968: jis0208<<14 | 0x4C<<7 | 0x31, + 36623 - 19968: jis0212<<14 | 0x3F<<7 | 0x48, + 36624 - 19968: jis0212<<14 | 0x3F<<7 | 0x49, + 36626 - 19968: jis0208<<14 | 0x4C<<7 | 0x2B, + 36627 - 19968: jis0208<<14 | 0x4C<<7 | 0x2D, + 36628 - 19968: jis0208<<14 | 0x29<<7 | 0x44, + 36629 - 19968: jis0208<<14 | 0x4C<<7 | 0x2A, + 36630 - 19968: jis0212<<14 | 0x3F<<7 | 0x4A, + 36631 - 19968: jis0212<<14 | 0x3F<<7 | 0x4B, + 36632 - 19968: jis0212<<14 | 0x3F<<7 | 0x4C, + 36633 - 19968: jis0208<<14 | 0x4C<<7 | 0x2C, + 36635 - 19968: jis0208<<14 | 0x4C<<7 | 0x30, + 36636 - 19968: jis0208<<14 | 0x4C<<7 | 0x2E, + 36637 - 19968: jis0208<<14 | 0x14<<7 | 0x10, + 36638 - 19968: jis0212<<14 | 0x3F<<7 | 0x4D, + 36639 - 19968: jis0208<<14 | 0x4C<<7 | 0x2F, + 36640 - 19968: jis0212<<14 | 0x3F<<7 | 0x4E, + 36641 - 19968: jis0212<<14 | 0x3F<<7 | 0x4F, + 36643 - 19968: jis0212<<14 | 0x3F<<7 | 0x50, + 36645 - 19968: jis0212<<14 | 0x3F<<7 | 0x51, + 36646 - 19968: jis0208<<14 | 0x4C<<7 | 0x32, + 36647 - 19968: jis0212<<14 | 0x3F<<7 | 0x52, + 36648 - 19968: jis0212<<14 | 0x3F<<7 | 0x53, + 36649 - 19968: jis0208<<14 | 0x26<<7 | 0x39, + 36650 - 19968: jis0208<<14 | 0x2D<<7 | 0x37, + 36652 - 19968: jis0212<<14 | 0x3F<<7 | 0x54, + 36653 - 19968: jis0212<<14 | 0x3F<<7 | 0x55, + 36654 - 19968: jis0212<<14 | 0x3F<<7 | 0x56, + 36655 - 19968: jis0208<<14 | 0x1C<<7 | 0x13, + 36659 - 19968: jis0208<<14 | 0x4C<<7 | 0x33, + 36660 - 19968: jis0212<<14 | 0x3F<<7 | 0x57, + 36661 - 19968: jis0212<<14 | 0x3F<<7 | 0x58, + 36662 - 19968: jis0212<<14 | 0x3F<<7 | 0x59, + 36663 - 19968: jis0212<<14 | 0x3F<<7 | 0x5A, + 36664 - 19968: jis0208<<14 | 0x2C<<7 | 0x01, + 36665 - 19968: jis0208<<14 | 0x4C<<7 | 0x35, + 36666 - 19968: jis0212<<14 | 0x3F<<7 | 0x5B, + 36667 - 19968: jis0208<<14 | 0x4C<<7 | 0x34, + 36670 - 19968: jis0208<<14 | 0x4C<<7 | 0x38, + 36671 - 19968: jis0208<<14 | 0x2C<<7 | 0x20, + 36672 - 19968: jis0212<<14 | 0x3F<<7 | 0x5C, + 36673 - 19968: jis0212<<14 | 0x3F<<7 | 0x5D, + 36674 - 19968: jis0208<<14 | 0x4C<<7 | 0x37, + 36675 - 19968: jis0212<<14 | 0x40<<7 | 0x00, + 36676 - 19968: jis0208<<14 | 0x12<<7 | 0x4C, + 36677 - 19968: jis0208<<14 | 0x4C<<7 | 0x36, + 36678 - 19968: jis0208<<14 | 0x4C<<7 | 0x3B, + 36679 - 19968: jis0212<<14 | 0x40<<7 | 0x01, + 36681 - 19968: jis0208<<14 | 0x4C<<7 | 0x3A, + 36684 - 19968: jis0208<<14 | 0x4C<<7 | 0x39, + 36685 - 19968: jis0208<<14 | 0x24<<7 | 0x11, + 36686 - 19968: jis0208<<14 | 0x4C<<7 | 0x3C, + 36687 - 19968: jis0212<<14 | 0x40<<7 | 0x02, + 36689 - 19968: jis0212<<14 | 0x40<<7 | 0x03, + 36690 - 19968: jis0212<<14 | 0x40<<7 | 0x04, + 36691 - 19968: jis0212<<14 | 0x40<<7 | 0x05, + 36692 - 19968: jis0212<<14 | 0x40<<7 | 0x06, + 36693 - 19968: jis0212<<14 | 0x40<<7 | 0x07, + 36695 - 19968: jis0208<<14 | 0x4C<<7 | 0x3D, + 36696 - 19968: jis0212<<14 | 0x40<<7 | 0x08, + 36700 - 19968: jis0208<<14 | 0x4C<<7 | 0x3E, + 36701 - 19968: jis0212<<14 | 0x40<<7 | 0x09, + 36702 - 19968: jis0212<<14 | 0x40<<7 | 0x0A, + 36703 - 19968: jis0208<<14 | 0x18<<7 | 0x4B, + 36705 - 19968: jis0208<<14 | 0x16<<7 | 0x04, + 36706 - 19968: jis0208<<14 | 0x4C<<7 | 0x3F, + 36707 - 19968: jis0208<<14 | 0x4C<<7 | 0x40, + 36708 - 19968: jis0208<<14 | 0x4C<<7 | 0x41, + 36709 - 19968: jis0212<<14 | 0x40<<7 | 0x0B, + 36763 - 19968: jis0208<<14 | 0x1E<<7 | 0x28, + 36764 - 19968: jis0208<<14 | 0x4C<<7 | 0x42, + 36765 - 19968: jis0212<<14 | 0x40<<7 | 0x0C, + 36766 - 19968: jis0208<<14 | 0x1B<<7 | 0x0C, + 36767 - 19968: jis0208<<14 | 0x4C<<7 | 0x43, + 36768 - 19968: jis0212<<14 | 0x40<<7 | 0x0D, + 36769 - 19968: jis0212<<14 | 0x40<<7 | 0x0E, + 36771 - 19968: jis0208<<14 | 0x4C<<7 | 0x44, + 36772 - 19968: jis0212<<14 | 0x40<<7 | 0x0F, + 36773 - 19968: jis0212<<14 | 0x40<<7 | 0x10, + 36774 - 19968: jis0212<<14 | 0x40<<7 | 0x11, + 36775 - 19968: jis0208<<14 | 0x31<<7 | 0x00, + 36776 - 19968: jis0208<<14 | 0x30<<7 | 0x5D, + 36781 - 19968: jis0208<<14 | 0x4C<<7 | 0x45, + 36782 - 19968: jis0208<<14 | 0x44<<7 | 0x4F, + 36783 - 19968: jis0208<<14 | 0x4C<<7 | 0x46, + 36784 - 19968: jis0208<<14 | 0x22<<7 | 0x03, + 36785 - 19968: jis0208<<14 | 0x1E<<7 | 0x0A, + 36786 - 19968: jis0208<<14 | 0x26<<7 | 0x1F, + 36789 - 19968: jis0212<<14 | 0x40<<7 | 0x12, + 36790 - 19968: jis0212<<14 | 0x40<<7 | 0x13, + 36791 - 19968: jis0208<<14 | 0x4C<<7 | 0x47, + 36792 - 19968: jis0212<<14 | 0x40<<7 | 0x14, + 36794 - 19968: jis0208<<14 | 0x29<<7 | 0x34, + 36795 - 19968: jis0208<<14 | 0x23<<7 | 0x33, + 36796 - 19968: jis0208<<14 | 0x18<<7 | 0x5D, + 36798 - 19968: jis0212<<14 | 0x40<<7 | 0x15, + 36799 - 19968: jis0208<<14 | 0x22<<7 | 0x08, + 36800 - 19968: jis0212<<14 | 0x40<<7 | 0x16, + 36801 - 19968: jis0212<<14 | 0x40<<7 | 0x17, + 36802 - 19968: jis0208<<14 | 0x10<<7 | 0x09, + 36804 - 19968: jis0208<<14 | 0x2A<<7 | 0x57, + 36805 - 19968: jis0208<<14 | 0x1E<<7 | 0x36, + 36806 - 19968: jis0212<<14 | 0x40<<7 | 0x18, + 36810 - 19968: jis0212<<14 | 0x40<<7 | 0x19, + 36811 - 19968: jis0212<<14 | 0x40<<7 | 0x1A, + 36813 - 19968: jis0212<<14 | 0x40<<7 | 0x1B, + 36814 - 19968: jis0208<<14 | 0x16<<7 | 0x3D, + 36816 - 19968: jis0212<<14 | 0x40<<7 | 0x1C, + 36817 - 19968: jis0208<<14 | 0x15<<7 | 0x40, + 36818 - 19968: jis0212<<14 | 0x40<<7 | 0x1D, + 36819 - 19968: jis0212<<14 | 0x40<<7 | 0x1E, + 36820 - 19968: jis0208<<14 | 0x29<<7 | 0x35, + 36821 - 19968: jis0212<<14 | 0x40<<7 | 0x1F, + 36826 - 19968: jis0208<<14 | 0x4C<<7 | 0x48, + 36832 - 19968: jis0212<<14 | 0x40<<7 | 0x20, + 36834 - 19968: jis0208<<14 | 0x4C<<7 | 0x4A, + 36835 - 19968: jis0212<<14 | 0x40<<7 | 0x21, + 36836 - 19968: jis0212<<14 | 0x40<<7 | 0x22, + 36837 - 19968: jis0208<<14 | 0x4C<<7 | 0x49, + 36838 - 19968: jis0208<<14 | 0x11<<7 | 0x3F, + 36840 - 19968: jis0212<<14 | 0x40<<7 | 0x23, + 36841 - 19968: jis0208<<14 | 0x25<<7 | 0x55, + 36842 - 19968: jis0208<<14 | 0x4C<<7 | 0x4B, + 36843 - 19968: jis0208<<14 | 0x26<<7 | 0x56, + 36845 - 19968: jis0208<<14 | 0x24<<7 | 0x12, + 36846 - 19968: jis0212<<14 | 0x40<<7 | 0x24, + 36847 - 19968: jis0208<<14 | 0x4C<<7 | 0x4C, + 36848 - 19968: jis0208<<14 | 0x1C<<7 | 0x31, + 36849 - 19968: jis0212<<14 | 0x40<<7 | 0x25, + 36852 - 19968: jis0208<<14 | 0x4C<<7 | 0x4E, + 36853 - 19968: jis0212<<14 | 0x40<<7 | 0x26, + 36854 - 19968: jis0212<<14 | 0x40<<7 | 0x27, + 36855 - 19968: jis0208<<14 | 0x2B<<7 | 0x21, + 36856 - 19968: jis0208<<14 | 0x4C<<7 | 0x5D, + 36857 - 19968: jis0208<<14 | 0x4C<<7 | 0x50, + 36858 - 19968: jis0208<<14 | 0x4C<<7 | 0x51, + 36859 - 19968: jis0212<<14 | 0x40<<7 | 0x28, + 36861 - 19968: jis0208<<14 | 0x23<<7 | 0x28, + 36862 - 19968: jis0212<<14 | 0x40<<7 | 0x29, + 36864 - 19968: jis0208<<14 | 0x21<<7 | 0x3F, + 36865 - 19968: jis0208<<14 | 0x20<<7 | 0x56, + 36866 - 19968: jis0212<<14 | 0x40<<7 | 0x2A, + 36867 - 19968: jis0208<<14 | 0x25<<7 | 0x07, + 36868 - 19968: jis0212<<14 | 0x40<<7 | 0x2B, + 36869 - 19968: jis0208<<14 | 0x4C<<7 | 0x4F, + 36870 - 19968: jis0208<<14 | 0x14<<7 | 0x34, + 36872 - 19968: jis0212<<14 | 0x40<<7 | 0x2C, + 36875 - 19968: jis0208<<14 | 0x4C<<7 | 0x58, + 36876 - 19968: jis0212<<14 | 0x40<<7 | 0x2D, + 36877 - 19968: jis0208<<14 | 0x4C<<7 | 0x55, + 36878 - 19968: jis0208<<14 | 0x4D<<7 | 0x04, + 36879 - 19968: jis0208<<14 | 0x25<<7 | 0x08, + 36880 - 19968: jis0208<<14 | 0x22<<7 | 0x3F, + 36881 - 19968: jis0208<<14 | 0x4C<<7 | 0x52, + 36883 - 19968: jis0208<<14 | 0x23<<7 | 0x5D, + 36884 - 19968: jis0208<<14 | 0x24<<7 | 0x32, + 36885 - 19968: jis0208<<14 | 0x4C<<7 | 0x53, + 36886 - 19968: jis0208<<14 | 0x4C<<7 | 0x57, + 36887 - 19968: jis0208<<14 | 0x1E<<7 | 0x3F, + 36888 - 19968: jis0212<<14 | 0x40<<7 | 0x2E, + 36889 - 19968: jis0208<<14 | 0x26<<7 | 0x46, + 36890 - 19968: jis0208<<14 | 0x23<<7 | 0x2B, + 36891 - 19968: jis0212<<14 | 0x40<<7 | 0x2F, + 36893 - 19968: jis0208<<14 | 0x1F<<7 | 0x21, + 36894 - 19968: jis0208<<14 | 0x4C<<7 | 0x56, + 36895 - 19968: jis0208<<14 | 0x21<<7 | 0x0D, + 36896 - 19968: jis0208<<14 | 0x21<<7 | 0x03, + 36897 - 19968: jis0208<<14 | 0x4C<<7 | 0x54, + 36898 - 19968: jis0208<<14 | 0x0F<<7 | 0x08, + 36899 - 19968: jis0208<<14 | 0x2E<<7 | 0x01, + 36903 - 19968: jis0208<<14 | 0x4C<<7 | 0x59, + 36904 - 19968: jis0212<<14 | 0x40<<7 | 0x30, + 36905 - 19968: jis0212<<14 | 0x40<<7 | 0x31, + 36906 - 19968: jis0212<<14 | 0x40<<7 | 0x33, + 36908 - 19968: jis0212<<14 | 0x40<<7 | 0x34, + 36909 - 19968: jis0212<<14 | 0x40<<7 | 0x35, + 36910 - 19968: jis0208<<14 | 0x21<<7 | 0x40, + 36911 - 19968: jis0212<<14 | 0x40<<7 | 0x32, + 36913 - 19968: jis0208<<14 | 0x1C<<7 | 0x14, + 36914 - 19968: jis0208<<14 | 0x1E<<7 | 0x29, + 36915 - 19968: jis0212<<14 | 0x40<<7 | 0x36, + 36916 - 19968: jis0212<<14 | 0x40<<7 | 0x37, + 36917 - 19968: jis0208<<14 | 0x4C<<7 | 0x5B, + 36918 - 19968: jis0208<<14 | 0x4C<<7 | 0x5A, + 36919 - 19968: jis0212<<14 | 0x40<<7 | 0x38, + 36920 - 19968: jis0208<<14 | 0x0F<<7 | 0x4E, + 36921 - 19968: jis0208<<14 | 0x4C<<7 | 0x5C, + 36924 - 19968: jis0208<<14 | 0x28<<7 | 0x0E, + 36926 - 19968: jis0208<<14 | 0x4D<<7 | 0x06, + 36927 - 19968: jis0212<<14 | 0x40<<7 | 0x39, + 36929 - 19968: jis0208<<14 | 0x25<<7 | 0x3A, + 36930 - 19968: jis0208<<14 | 0x1E<<7 | 0x4A, + 36931 - 19968: jis0212<<14 | 0x40<<7 | 0x3A, + 36932 - 19968: jis0212<<14 | 0x40<<7 | 0x3B, + 36933 - 19968: jis0208<<14 | 0x22<<7 | 0x38, + 36935 - 19968: jis0208<<14 | 0x15<<7 | 0x57, + 36937 - 19968: jis0208<<14 | 0x4D<<7 | 0x05, + 36938 - 19968: jis0208<<14 | 0x2C<<7 | 0x16, + 36939 - 19968: jis0208<<14 | 0x10<<7 | 0x1E, + 36940 - 19968: jis0212<<14 | 0x40<<7 | 0x3C, + 36941 - 19968: jis0208<<14 | 0x29<<7 | 0x36, + 36942 - 19968: jis0208<<14 | 0x11<<7 | 0x40, + 36943 - 19968: jis0208<<14 | 0x4D<<7 | 0x00, + 36944 - 19968: jis0208<<14 | 0x4D<<7 | 0x01, + 36945 - 19968: jis0208<<14 | 0x4D<<7 | 0x02, + 36946 - 19968: jis0208<<14 | 0x4D<<7 | 0x03, + 36947 - 19968: jis0208<<14 | 0x25<<7 | 0x1A, + 36948 - 19968: jis0208<<14 | 0x22<<7 | 0x02, + 36949 - 19968: jis0208<<14 | 0x0F<<7 | 0x42, + 36950 - 19968: jis0208<<14 | 0x4D<<7 | 0x07, + 36952 - 19968: jis0208<<14 | 0x4D<<7 | 0x08, + 36953 - 19968: jis0208<<14 | 0x53<<7 | 0x02, + 36955 - 19968: jis0212<<14 | 0x40<<7 | 0x3D, + 36956 - 19968: jis0208<<14 | 0x21<<7 | 0x1C, + 36957 - 19968: jis0212<<14 | 0x40<<7 | 0x3E, + 36958 - 19968: jis0208<<14 | 0x4D<<7 | 0x09, + 36960 - 19968: jis0208<<14 | 0x10<<7 | 0x52, + 36961 - 19968: jis0208<<14 | 0x20<<7 | 0x2B, + 36962 - 19968: jis0212<<14 | 0x40<<7 | 0x3F, + 36963 - 19968: jis0208<<14 | 0x17<<7 | 0x0E, + 36965 - 19968: jis0208<<14 | 0x2C<<7 | 0x39, + 36966 - 19968: jis0212<<14 | 0x40<<7 | 0x40, + 36967 - 19968: jis0208<<14 | 0x5A<<7 | 0x58, + 36968 - 19968: jis0208<<14 | 0x4D<<7 | 0x0A, + 36969 - 19968: jis0208<<14 | 0x24<<7 | 0x0B, + 36972 - 19968: jis0212<<14 | 0x40<<7 | 0x42, + 36973 - 19968: jis0208<<14 | 0x20<<7 | 0x57, + 36974 - 19968: jis0208<<14 | 0x1B<<7 | 0x36, + 36975 - 19968: jis0208<<14 | 0x4D<<7 | 0x0B, + 36976 - 19968: jis0212<<14 | 0x40<<7 | 0x43, + 36978 - 19968: jis0208<<14 | 0x4D<<7 | 0x0E, + 36980 - 19968: jis0212<<14 | 0x40<<7 | 0x44, + 36981 - 19968: jis0208<<14 | 0x1C<<7 | 0x44, + 36982 - 19968: jis0208<<14 | 0x4D<<7 | 0x0C, + 36983 - 19968: jis0208<<14 | 0x20<<7 | 0x0A, + 36984 - 19968: jis0208<<14 | 0x20<<7 | 0x09, + 36985 - 19968: jis0212<<14 | 0x40<<7 | 0x45, + 36986 - 19968: jis0208<<14 | 0x0F<<7 | 0x43, + 36988 - 19968: jis0208<<14 | 0x2D<<7 | 0x2A, + 36989 - 19968: jis0208<<14 | 0x4D<<7 | 0x10, + 36991 - 19968: jis0208<<14 | 0x27<<7 | 0x51, + 36992 - 19968: jis0208<<14 | 0x4D<<7 | 0x12, + 36993 - 19968: jis0208<<14 | 0x4D<<7 | 0x11, + 36994 - 19968: jis0208<<14 | 0x4D<<7 | 0x0F, + 36995 - 19968: jis0208<<14 | 0x42<<7 | 0x43, + 36996 - 19968: jis0208<<14 | 0x13<<7 | 0x33, + 36997 - 19968: jis0212<<14 | 0x40<<7 | 0x46, + 36999 - 19968: jis0208<<14 | 0x4C<<7 | 0x4D, + 37000 - 19968: jis0212<<14 | 0x40<<7 | 0x47, + 37001 - 19968: jis0208<<14 | 0x4D<<7 | 0x14, + 37002 - 19968: jis0208<<14 | 0x4D<<7 | 0x13, + 37003 - 19968: jis0212<<14 | 0x40<<7 | 0x48, + 37004 - 19968: jis0212<<14 | 0x40<<7 | 0x49, + 37006 - 19968: jis0212<<14 | 0x40<<7 | 0x4A, + 37007 - 19968: jis0208<<14 | 0x4D<<7 | 0x15, + 37008 - 19968: jis0212<<14 | 0x40<<7 | 0x4B, + 37009 - 19968: jis0208<<14 | 0x2C<<7 | 0x17, + 37013 - 19968: jis0212<<14 | 0x40<<7 | 0x4C, + 37015 - 19968: jis0212<<14 | 0x40<<7 | 0x4D, + 37016 - 19968: jis0212<<14 | 0x40<<7 | 0x4E, + 37017 - 19968: jis0212<<14 | 0x40<<7 | 0x4F, + 37019 - 19968: jis0212<<14 | 0x40<<7 | 0x50, + 37024 - 19968: jis0212<<14 | 0x40<<7 | 0x51, + 37025 - 19968: jis0212<<14 | 0x40<<7 | 0x52, + 37026 - 19968: jis0212<<14 | 0x40<<7 | 0x53, + 37027 - 19968: jis0208<<14 | 0x25<<7 | 0x40, + 37029 - 19968: jis0212<<14 | 0x40<<7 | 0x54, + 37030 - 19968: jis0208<<14 | 0x2A<<7 | 0x0D, + 37032 - 19968: jis0208<<14 | 0x4D<<7 | 0x16, + 37034 - 19968: jis0208<<14 | 0x1B<<7 | 0x38, + 37039 - 19968: jis0208<<14 | 0x4D<<7 | 0x17, + 37040 - 19968: jis0212<<14 | 0x40<<7 | 0x55, + 37041 - 19968: jis0208<<14 | 0x4D<<7 | 0x18, + 37042 - 19968: jis0212<<14 | 0x40<<7 | 0x56, + 37043 - 19968: jis0212<<14 | 0x40<<7 | 0x57, + 37044 - 19968: jis0212<<14 | 0x40<<7 | 0x58, + 37045 - 19968: jis0208<<14 | 0x4D<<7 | 0x19, + 37046 - 19968: jis0212<<14 | 0x40<<7 | 0x59, + 37048 - 19968: jis0208<<14 | 0x24<<7 | 0x00, + 37053 - 19968: jis0212<<14 | 0x40<<7 | 0x5A, + 37054 - 19968: jis0212<<14 | 0x40<<7 | 0x5C, + 37057 - 19968: jis0208<<14 | 0x0F<<7 | 0x49, + 37059 - 19968: jis0212<<14 | 0x40<<7 | 0x5D, + 37060 - 19968: jis0212<<14 | 0x41<<7 | 0x00, + 37061 - 19968: jis0212<<14 | 0x41<<7 | 0x01, + 37063 - 19968: jis0212<<14 | 0x41<<7 | 0x02, + 37064 - 19968: jis0212<<14 | 0x41<<7 | 0x03, + 37066 - 19968: jis0208<<14 | 0x18<<7 | 0x38, + 37068 - 19968: jis0212<<14 | 0x40<<7 | 0x5B, + 37070 - 19968: jis0208<<14 | 0x2E<<7 | 0x19, + 37074 - 19968: jis0212<<14 | 0x41<<7 | 0x0C, + 37077 - 19968: jis0212<<14 | 0x41<<7 | 0x04, + 37079 - 19968: jis0212<<14 | 0x41<<7 | 0x05, + 37080 - 19968: jis0212<<14 | 0x41<<7 | 0x06, + 37081 - 19968: jis0212<<14 | 0x41<<7 | 0x07, + 37083 - 19968: jis0208<<14 | 0x4D<<7 | 0x1D, + 37084 - 19968: jis0212<<14 | 0x41<<7 | 0x08, + 37085 - 19968: jis0212<<14 | 0x41<<7 | 0x09, + 37086 - 19968: jis0208<<14 | 0x5A<<7 | 0x59, + 37087 - 19968: jis0212<<14 | 0x41<<7 | 0x0A, + 37089 - 19968: jis0208<<14 | 0x16<<7 | 0x13, + 37090 - 19968: jis0208<<14 | 0x4D<<7 | 0x1A, + 37092 - 19968: jis0208<<14 | 0x4D<<7 | 0x1B, + 37093 - 19968: jis0212<<14 | 0x41<<7 | 0x0B, + 37096 - 19968: jis0208<<14 | 0x28<<7 | 0x53, + 37099 - 19968: jis0212<<14 | 0x41<<7 | 0x0E, + 37101 - 19968: jis0208<<14 | 0x12<<7 | 0x33, + 37103 - 19968: jis0212<<14 | 0x41<<7 | 0x0F, + 37104 - 19968: jis0212<<14 | 0x41<<7 | 0x10, + 37108 - 19968: jis0212<<14 | 0x41<<7 | 0x11, + 37109 - 19968: jis0208<<14 | 0x2C<<7 | 0x18, + 37110 - 19968: jis0212<<14 | 0x41<<7 | 0x0D, + 37111 - 19968: jis0208<<14 | 0x15<<7 | 0x1E, + 37117 - 19968: jis0208<<14 | 0x24<<7 | 0x33, + 37118 - 19968: jis0212<<14 | 0x41<<7 | 0x12, + 37119 - 19968: jis0212<<14 | 0x41<<7 | 0x13, + 37120 - 19968: jis0212<<14 | 0x41<<7 | 0x14, + 37122 - 19968: jis0208<<14 | 0x4D<<7 | 0x1E, + 37124 - 19968: jis0212<<14 | 0x41<<7 | 0x15, + 37125 - 19968: jis0212<<14 | 0x41<<7 | 0x16, + 37126 - 19968: jis0212<<14 | 0x41<<7 | 0x17, + 37128 - 19968: jis0212<<14 | 0x41<<7 | 0x18, + 37133 - 19968: jis0212<<14 | 0x41<<7 | 0x19, + 37136 - 19968: jis0212<<14 | 0x41<<7 | 0x1A, + 37138 - 19968: jis0208<<14 | 0x4D<<7 | 0x1F, + 37140 - 19968: jis0212<<14 | 0x41<<7 | 0x1B, + 37141 - 19968: jis0208<<14 | 0x5A<<7 | 0x5B, + 37142 - 19968: jis0212<<14 | 0x41<<7 | 0x1C, + 37143 - 19968: jis0212<<14 | 0x41<<7 | 0x1D, + 37144 - 19968: jis0212<<14 | 0x41<<7 | 0x1E, + 37145 - 19968: jis0208<<14 | 0x4D<<7 | 0x20, + 37146 - 19968: jis0212<<14 | 0x41<<7 | 0x1F, + 37148 - 19968: jis0212<<14 | 0x41<<7 | 0x20, + 37150 - 19968: jis0212<<14 | 0x41<<7 | 0x21, + 37152 - 19968: jis0212<<14 | 0x41<<7 | 0x22, + 37154 - 19968: jis0212<<14 | 0x41<<7 | 0x24, + 37155 - 19968: jis0212<<14 | 0x41<<7 | 0x25, + 37157 - 19968: jis0212<<14 | 0x41<<7 | 0x23, + 37159 - 19968: jis0208<<14 | 0x5A<<7 | 0x5C, + 37161 - 19968: jis0212<<14 | 0x41<<7 | 0x27, + 37165 - 19968: jis0208<<14 | 0x24<<7 | 0x01, + 37166 - 19968: jis0212<<14 | 0x41<<7 | 0x28, + 37167 - 19968: jis0212<<14 | 0x41<<7 | 0x29, + 37168 - 19968: jis0208<<14 | 0x4D<<7 | 0x22, + 37169 - 19968: jis0212<<14 | 0x41<<7 | 0x2A, + 37170 - 19968: jis0208<<14 | 0x4D<<7 | 0x21, + 37172 - 19968: jis0212<<14 | 0x41<<7 | 0x2B, + 37174 - 19968: jis0212<<14 | 0x41<<7 | 0x2C, + 37175 - 19968: jis0212<<14 | 0x41<<7 | 0x2D, + 37177 - 19968: jis0212<<14 | 0x41<<7 | 0x2E, + 37178 - 19968: jis0212<<14 | 0x41<<7 | 0x2F, + 37180 - 19968: jis0212<<14 | 0x41<<7 | 0x30, + 37181 - 19968: jis0212<<14 | 0x41<<7 | 0x31, + 37187 - 19968: jis0212<<14 | 0x41<<7 | 0x32, + 37191 - 19968: jis0212<<14 | 0x41<<7 | 0x33, + 37192 - 19968: jis0212<<14 | 0x41<<7 | 0x34, + 37193 - 19968: jis0208<<14 | 0x25<<7 | 0x32, + 37194 - 19968: jis0208<<14 | 0x4D<<7 | 0x23, + 37195 - 19968: jis0208<<14 | 0x1C<<7 | 0x15, + 37196 - 19968: jis0208<<14 | 0x1B<<7 | 0x3F, + 37197 - 19968: jis0208<<14 | 0x26<<7 | 0x3A, + 37198 - 19968: jis0208<<14 | 0x22<<7 | 0x50, + 37199 - 19968: jis0212<<14 | 0x41<<7 | 0x35, + 37202 - 19968: jis0208<<14 | 0x1B<<7 | 0x51, + 37203 - 19968: jis0212<<14 | 0x41<<7 | 0x36, + 37204 - 19968: jis0208<<14 | 0x1E<<7 | 0x4B, + 37206 - 19968: jis0208<<14 | 0x4D<<7 | 0x24, + 37207 - 19968: jis0212<<14 | 0x41<<7 | 0x37, + 37208 - 19968: jis0208<<14 | 0x4D<<7 | 0x25, + 37209 - 19968: jis0212<<14 | 0x41<<7 | 0x38, + 37210 - 19968: jis0212<<14 | 0x41<<7 | 0x39, + 37211 - 19968: jis0212<<14 | 0x41<<7 | 0x3A, + 37217 - 19968: jis0212<<14 | 0x41<<7 | 0x3B, + 37218 - 19968: jis0208<<14 | 0x1E<<7 | 0x3C, + 37219 - 19968: jis0208<<14 | 0x4D<<7 | 0x26, + 37220 - 19968: jis0212<<14 | 0x41<<7 | 0x3C, + 37221 - 19968: jis0208<<14 | 0x4D<<7 | 0x27, + 37223 - 19968: jis0212<<14 | 0x41<<7 | 0x3D, + 37225 - 19968: jis0208<<14 | 0x4D<<7 | 0x28, + 37226 - 19968: jis0208<<14 | 0x2C<<7 | 0x4E, + 37228 - 19968: jis0208<<14 | 0x1C<<7 | 0x16, + 37229 - 19968: jis0212<<14 | 0x41<<7 | 0x3E, + 37234 - 19968: jis0208<<14 | 0x4D<<7 | 0x2A, + 37235 - 19968: jis0208<<14 | 0x4D<<7 | 0x29, + 37236 - 19968: jis0212<<14 | 0x41<<7 | 0x3F, + 37237 - 19968: jis0208<<14 | 0x18<<7 | 0x39, + 37239 - 19968: jis0208<<14 | 0x18<<7 | 0x52, + 37240 - 19968: jis0208<<14 | 0x1A<<7 | 0x1F, + 37241 - 19968: jis0212<<14 | 0x41<<7 | 0x40, + 37242 - 19968: jis0212<<14 | 0x41<<7 | 0x41, + 37243 - 19968: jis0212<<14 | 0x41<<7 | 0x42, + 37249 - 19968: jis0212<<14 | 0x41<<7 | 0x43, + 37250 - 19968: jis0208<<14 | 0x4D<<7 | 0x2D, + 37251 - 19968: jis0212<<14 | 0x41<<7 | 0x44, + 37253 - 19968: jis0212<<14 | 0x41<<7 | 0x45, + 37254 - 19968: jis0212<<14 | 0x41<<7 | 0x46, + 37255 - 19968: jis0208<<14 | 0x1C<<7 | 0x45, + 37257 - 19968: jis0208<<14 | 0x4D<<7 | 0x2C, + 37258 - 19968: jis0212<<14 | 0x41<<7 | 0x47, + 37259 - 19968: jis0208<<14 | 0x4D<<7 | 0x2B, + 37261 - 19968: jis0208<<14 | 0x21<<7 | 0x48, + 37262 - 19968: jis0212<<14 | 0x41<<7 | 0x48, + 37264 - 19968: jis0208<<14 | 0x17<<7 | 0x4E, + 37265 - 19968: jis0212<<14 | 0x41<<7 | 0x49, + 37266 - 19968: jis0208<<14 | 0x1F<<7 | 0x22, + 37267 - 19968: jis0212<<14 | 0x41<<7 | 0x4A, + 37268 - 19968: jis0212<<14 | 0x41<<7 | 0x4B, + 37269 - 19968: jis0212<<14 | 0x41<<7 | 0x4C, + 37271 - 19968: jis0208<<14 | 0x27<<7 | 0x0F, + 37272 - 19968: jis0212<<14 | 0x41<<7 | 0x4D, + 37276 - 19968: jis0208<<14 | 0x1C<<7 | 0x18, + 37278 - 19968: jis0212<<14 | 0x41<<7 | 0x4E, + 37281 - 19968: jis0212<<14 | 0x41<<7 | 0x4F, + 37282 - 19968: jis0208<<14 | 0x4D<<7 | 0x2E, + 37284 - 19968: jis0208<<14 | 0x1D<<7 | 0x3E, + 37286 - 19968: jis0212<<14 | 0x41<<7 | 0x50, + 37288 - 19968: jis0212<<14 | 0x41<<7 | 0x51, + 37290 - 19968: jis0208<<14 | 0x4D<<7 | 0x31, + 37291 - 19968: jis0208<<14 | 0x4D<<7 | 0x2F, + 37292 - 19968: jis0212<<14 | 0x41<<7 | 0x52, + 37293 - 19968: jis0212<<14 | 0x41<<7 | 0x53, + 37294 - 19968: jis0212<<14 | 0x41<<7 | 0x54, + 37295 - 19968: jis0208<<14 | 0x4D<<7 | 0x30, + 37296 - 19968: jis0212<<14 | 0x41<<7 | 0x55, + 37297 - 19968: jis0212<<14 | 0x41<<7 | 0x56, + 37298 - 19968: jis0212<<14 | 0x41<<7 | 0x57, + 37299 - 19968: jis0212<<14 | 0x41<<7 | 0x58, + 37300 - 19968: jis0208<<14 | 0x4D<<7 | 0x33, + 37301 - 19968: jis0208<<14 | 0x4D<<7 | 0x32, + 37302 - 19968: jis0212<<14 | 0x41<<7 | 0x59, + 37304 - 19968: jis0208<<14 | 0x1D<<7 | 0x59, + 37306 - 19968: jis0208<<14 | 0x4D<<7 | 0x34, + 37307 - 19968: jis0212<<14 | 0x41<<7 | 0x5A, + 37308 - 19968: jis0212<<14 | 0x41<<7 | 0x5B, + 37309 - 19968: jis0212<<14 | 0x41<<7 | 0x5C, + 37311 - 19968: jis0212<<14 | 0x41<<7 | 0x5D, + 37312 - 19968: jis0208<<14 | 0x4D<<7 | 0x35, + 37313 - 19968: jis0208<<14 | 0x4D<<7 | 0x36, + 37314 - 19968: jis0212<<14 | 0x42<<7 | 0x00, + 37315 - 19968: jis0212<<14 | 0x42<<7 | 0x01, + 37317 - 19968: jis0212<<14 | 0x42<<7 | 0x02, + 37318 - 19968: jis0208<<14 | 0x27<<7 | 0x2F, + 37319 - 19968: jis0208<<14 | 0x19<<7 | 0x32, + 37320 - 19968: jis0208<<14 | 0x1B<<7 | 0x40, + 37321 - 19968: jis0208<<14 | 0x4D<<7 | 0x37, + 37323 - 19968: jis0208<<14 | 0x4D<<7 | 0x38, + 37324 - 19968: jis0208<<14 | 0x2D<<7 | 0x03, + 37325 - 19968: jis0208<<14 | 0x1C<<7 | 0x24, + 37326 - 19968: jis0208<<14 | 0x2B<<7 | 0x4D, + 37327 - 19968: jis0208<<14 | 0x2D<<7 | 0x2B, + 37328 - 19968: jis0208<<14 | 0x4D<<7 | 0x39, + 37329 - 19968: jis0208<<14 | 0x15<<7 | 0x41, + 37331 - 19968: jis0212<<14 | 0x42<<7 | 0x03, + 37332 - 19968: jis0212<<14 | 0x42<<7 | 0x04, + 37334 - 19968: jis0208<<14 | 0x4D<<7 | 0x3A, + 37335 - 19968: jis0208<<14 | 0x5B<<7 | 0x00, + 37336 - 19968: jis0208<<14 | 0x24<<7 | 0x02, + 37337 - 19968: jis0212<<14 | 0x42<<7 | 0x06, + 37338 - 19968: jis0208<<14 | 0x5A<<7 | 0x5D, + 37339 - 19968: jis0208<<14 | 0x4D<<7 | 0x3D, + 37340 - 19968: jis0208<<14 | 0x12<<7 | 0x57, + 37341 - 19968: jis0208<<14 | 0x1E<<7 | 0x2A, + 37342 - 19968: jis0208<<14 | 0x5B<<7 | 0x01, + 37343 - 19968: jis0208<<14 | 0x4D<<7 | 0x3B, + 37345 - 19968: jis0208<<14 | 0x4D<<7 | 0x3C, + 37347 - 19968: jis0208<<14 | 0x23<<7 | 0x3F, + 37348 - 19968: jis0208<<14 | 0x5B<<7 | 0x04, + 37349 - 19968: jis0208<<14 | 0x5B<<7 | 0x05, + 37350 - 19968: jis0208<<14 | 0x2A<<7 | 0x34, + 37351 - 19968: jis0208<<14 | 0x15<<7 | 0x5B, + 37353 - 19968: jis0212<<14 | 0x42<<7 | 0x0B, + 37354 - 19968: jis0212<<14 | 0x42<<7 | 0x0C, + 37356 - 19968: jis0212<<14 | 0x42<<7 | 0x0D, + 37357 - 19968: jis0208<<14 | 0x5B<<7 | 0x02, + 37358 - 19968: jis0208<<14 | 0x5B<<7 | 0x03, + 37359 - 19968: jis0212<<14 | 0x42<<7 | 0x10, + 37360 - 19968: jis0212<<14 | 0x42<<7 | 0x11, + 37361 - 19968: jis0212<<14 | 0x42<<7 | 0x12, + 37365 - 19968: jis0208<<14 | 0x4D<<7 | 0x3F, + 37366 - 19968: jis0208<<14 | 0x4D<<7 | 0x40, + 37367 - 19968: jis0212<<14 | 0x42<<7 | 0x13, + 37369 - 19968: jis0212<<14 | 0x42<<7 | 0x14, + 37371 - 19968: jis0212<<14 | 0x42<<7 | 0x15, + 37372 - 19968: jis0208<<14 | 0x4D<<7 | 0x3E, + 37373 - 19968: jis0212<<14 | 0x42<<7 | 0x16, + 37375 - 19968: jis0208<<14 | 0x4D<<7 | 0x42, + 37376 - 19968: jis0212<<14 | 0x42<<7 | 0x17, + 37377 - 19968: jis0212<<14 | 0x42<<7 | 0x18, + 37380 - 19968: jis0212<<14 | 0x42<<7 | 0x19, + 37381 - 19968: jis0212<<14 | 0x42<<7 | 0x1A, + 37382 - 19968: jis0208<<14 | 0x5B<<7 | 0x06, + 37383 - 19968: jis0212<<14 | 0x42<<7 | 0x1C, + 37385 - 19968: jis0212<<14 | 0x42<<7 | 0x1D, + 37386 - 19968: jis0208<<14 | 0x5B<<7 | 0x08, + 37388 - 19968: jis0212<<14 | 0x42<<7 | 0x1F, + 37389 - 19968: jis0208<<14 | 0x25<<7 | 0x3E, + 37390 - 19968: jis0208<<14 | 0x12<<7 | 0x22, + 37392 - 19968: jis0208<<14 | 0x5B<<7 | 0x07, + 37393 - 19968: jis0208<<14 | 0x4D<<7 | 0x46, + 37394 - 19968: jis0212<<14 | 0x42<<7 | 0x21, + 37395 - 19968: jis0212<<14 | 0x42<<7 | 0x22, + 37396 - 19968: jis0208<<14 | 0x4D<<7 | 0x43, + 37397 - 19968: jis0208<<14 | 0x4D<<7 | 0x45, + 37398 - 19968: jis0212<<14 | 0x42<<7 | 0x23, + 37400 - 19968: jis0212<<14 | 0x42<<7 | 0x24, + 37404 - 19968: jis0212<<14 | 0x42<<7 | 0x25, + 37405 - 19968: jis0212<<14 | 0x42<<7 | 0x26, + 37406 - 19968: jis0208<<14 | 0x4D<<7 | 0x41, + 37411 - 19968: jis0212<<14 | 0x42<<7 | 0x27, + 37412 - 19968: jis0212<<14 | 0x42<<7 | 0x28, + 37413 - 19968: jis0212<<14 | 0x42<<7 | 0x29, + 37414 - 19968: jis0212<<14 | 0x42<<7 | 0x2A, + 37416 - 19968: jis0212<<14 | 0x42<<7 | 0x2B, + 37417 - 19968: jis0208<<14 | 0x4E<<7 | 0x2E, + 37420 - 19968: jis0208<<14 | 0x4D<<7 | 0x44, + 37422 - 19968: jis0212<<14 | 0x42<<7 | 0x2C, + 37423 - 19968: jis0212<<14 | 0x42<<7 | 0x2D, + 37424 - 19968: jis0212<<14 | 0x42<<7 | 0x2E, + 37427 - 19968: jis0212<<14 | 0x42<<7 | 0x2F, + 37428 - 19968: jis0208<<14 | 0x2D<<7 | 0x4A, + 37429 - 19968: jis0212<<14 | 0x42<<7 | 0x30, + 37430 - 19968: jis0212<<14 | 0x42<<7 | 0x31, + 37431 - 19968: jis0208<<14 | 0x17<<7 | 0x39, + 37432 - 19968: jis0212<<14 | 0x42<<7 | 0x32, + 37433 - 19968: jis0208<<14 | 0x5B<<7 | 0x0F, + 37434 - 19968: jis0208<<14 | 0x5B<<7 | 0x09, + 37436 - 19968: jis0208<<14 | 0x5B<<7 | 0x0B, + 37438 - 19968: jis0212<<14 | 0x42<<7 | 0x36, + 37439 - 19968: jis0208<<14 | 0x4D<<7 | 0x4E, + 37440 - 19968: jis0208<<14 | 0x5B<<7 | 0x0A, + 37442 - 19968: jis0212<<14 | 0x42<<7 | 0x38, + 37443 - 19968: jis0212<<14 | 0x42<<7 | 0x39, + 37444 - 19968: jis0208<<14 | 0x24<<7 | 0x13, + 37445 - 19968: jis0208<<14 | 0x4D<<7 | 0x49, + 37446 - 19968: jis0212<<14 | 0x42<<7 | 0x3A, + 37447 - 19968: jis0212<<14 | 0x42<<7 | 0x3B, + 37448 - 19968: jis0208<<14 | 0x4D<<7 | 0x4C, + 37449 - 19968: jis0208<<14 | 0x4D<<7 | 0x4A, + 37450 - 19968: jis0212<<14 | 0x42<<7 | 0x3C, + 37451 - 19968: jis0208<<14 | 0x4D<<7 | 0x4F, + 37453 - 19968: jis0212<<14 | 0x42<<7 | 0x3D, + 37454 - 19968: jis0208<<14 | 0x5B<<7 | 0x0C, + 37455 - 19968: jis0212<<14 | 0x42<<7 | 0x3F, + 37456 - 19968: jis0208<<14 | 0x4D<<7 | 0x50, + 37457 - 19968: jis0208<<14 | 0x5B<<7 | 0x0E, + 37463 - 19968: jis0208<<14 | 0x4D<<7 | 0x48, + 37464 - 19968: jis0212<<14 | 0x42<<7 | 0x41, + 37465 - 19968: jis0208<<14 | 0x5B<<7 | 0x0D, + 37466 - 19968: jis0208<<14 | 0x4D<<7 | 0x55, + 37467 - 19968: jis0208<<14 | 0x10<<7 | 0x53, + 37468 - 19968: jis0212<<14 | 0x42<<7 | 0x43, + 37469 - 19968: jis0212<<14 | 0x42<<7 | 0x44, + 37470 - 19968: jis0208<<14 | 0x4D<<7 | 0x47, + 37472 - 19968: jis0212<<14 | 0x42<<7 | 0x45, + 37473 - 19968: jis0212<<14 | 0x42<<7 | 0x46, + 37474 - 19968: jis0208<<14 | 0x27<<7 | 0x0C, + 37476 - 19968: jis0208<<14 | 0x4D<<7 | 0x4B, + 37477 - 19968: jis0212<<14 | 0x42<<7 | 0x47, + 37478 - 19968: jis0208<<14 | 0x1D<<7 | 0x3F, + 37479 - 19968: jis0208<<14 | 0x5B<<7 | 0x10, + 37480 - 19968: jis0212<<14 | 0x42<<7 | 0x49, + 37481 - 19968: jis0212<<14 | 0x42<<7 | 0x4A, + 37486 - 19968: jis0212<<14 | 0x42<<7 | 0x4B, + 37487 - 19968: jis0212<<14 | 0x42<<7 | 0x4C, + 37488 - 19968: jis0212<<14 | 0x42<<7 | 0x4D, + 37489 - 19968: jis0208<<14 | 0x18<<7 | 0x3A, + 37493 - 19968: jis0212<<14 | 0x42<<7 | 0x4E, + 37494 - 19968: jis0212<<14 | 0x42<<7 | 0x4F, + 37495 - 19968: jis0208<<14 | 0x5B<<7 | 0x12, + 37496 - 19968: jis0208<<14 | 0x5B<<7 | 0x13, + 37497 - 19968: jis0212<<14 | 0x42<<7 | 0x52, + 37499 - 19968: jis0212<<14 | 0x42<<7 | 0x53, + 37500 - 19968: jis0212<<14 | 0x42<<7 | 0x54, + 37501 - 19968: jis0212<<14 | 0x42<<7 | 0x55, + 37502 - 19968: jis0208<<14 | 0x2A<<7 | 0x27, + 37503 - 19968: jis0212<<14 | 0x42<<7 | 0x56, + 37504 - 19968: jis0208<<14 | 0x15<<7 | 0x43, + 37507 - 19968: jis0208<<14 | 0x1C<<7 | 0x25, + 37509 - 19968: jis0208<<14 | 0x25<<7 | 0x1B, + 37512 - 19968: jis0208<<14 | 0x58<<7 | 0x03, + 37513 - 19968: jis0212<<14 | 0x42<<7 | 0x58, + 37514 - 19968: jis0212<<14 | 0x42<<7 | 0x59, + 37517 - 19968: jis0212<<14 | 0x42<<7 | 0x5A, + 37518 - 19968: jis0212<<14 | 0x42<<7 | 0x5B, + 37521 - 19968: jis0208<<14 | 0x20<<7 | 0x0C, + 37522 - 19968: jis0212<<14 | 0x42<<7 | 0x5C, + 37523 - 19968: jis0208<<14 | 0x4D<<7 | 0x53, + 37525 - 19968: jis0208<<14 | 0x4D<<7 | 0x4D, + 37526 - 19968: jis0208<<14 | 0x4D<<7 | 0x52, + 37527 - 19968: jis0212<<14 | 0x42<<7 | 0x5D, + 37528 - 19968: jis0208<<14 | 0x2B<<7 | 0x22, + 37529 - 19968: jis0212<<14 | 0x43<<7 | 0x00, + 37530 - 19968: jis0208<<14 | 0x23<<7 | 0x17, + 37531 - 19968: jis0208<<14 | 0x4D<<7 | 0x54, + 37532 - 19968: jis0208<<14 | 0x4D<<7 | 0x51, + 37535 - 19968: jis0212<<14 | 0x43<<7 | 0x01, + 37536 - 19968: jis0212<<14 | 0x43<<7 | 0x02, + 37540 - 19968: jis0212<<14 | 0x43<<7 | 0x03, + 37541 - 19968: jis0212<<14 | 0x43<<7 | 0x04, + 37543 - 19968: jis0208<<14 | 0x5B<<7 | 0x11, + 37544 - 19968: jis0212<<14 | 0x43<<7 | 0x06, + 37547 - 19968: jis0212<<14 | 0x43<<7 | 0x07, + 37549 - 19968: jis0208<<14 | 0x20<<7 | 0x0B, + 37551 - 19968: jis0212<<14 | 0x43<<7 | 0x08, + 37554 - 19968: jis0212<<14 | 0x43<<7 | 0x09, + 37558 - 19968: jis0212<<14 | 0x43<<7 | 0x0A, + 37559 - 19968: jis0208<<14 | 0x4D<<7 | 0x58, + 37560 - 19968: jis0212<<14 | 0x43<<7 | 0x0B, + 37561 - 19968: jis0208<<14 | 0x4D<<7 | 0x57, + 37562 - 19968: jis0212<<14 | 0x43<<7 | 0x0C, + 37563 - 19968: jis0212<<14 | 0x43<<7 | 0x0D, + 37564 - 19968: jis0212<<14 | 0x43<<7 | 0x0E, + 37565 - 19968: jis0212<<14 | 0x43<<7 | 0x0F, + 37567 - 19968: jis0212<<14 | 0x43<<7 | 0x10, + 37568 - 19968: jis0212<<14 | 0x43<<7 | 0x11, + 37569 - 19968: jis0212<<14 | 0x43<<7 | 0x12, + 37570 - 19968: jis0212<<14 | 0x43<<7 | 0x13, + 37571 - 19968: jis0212<<14 | 0x43<<7 | 0x14, + 37573 - 19968: jis0212<<14 | 0x43<<7 | 0x15, + 37574 - 19968: jis0212<<14 | 0x43<<7 | 0x16, + 37575 - 19968: jis0212<<14 | 0x43<<7 | 0x17, + 37576 - 19968: jis0212<<14 | 0x43<<7 | 0x18, + 37579 - 19968: jis0212<<14 | 0x43<<7 | 0x19, + 37580 - 19968: jis0212<<14 | 0x43<<7 | 0x1A, + 37581 - 19968: jis0212<<14 | 0x43<<7 | 0x1B, + 37582 - 19968: jis0212<<14 | 0x43<<7 | 0x1C, + 37583 - 19968: jis0208<<14 | 0x4D<<7 | 0x56, + 37584 - 19968: jis0208<<14 | 0x5B<<7 | 0x17, + 37586 - 19968: jis0208<<14 | 0x2A<<7 | 0x0E, + 37587 - 19968: jis0208<<14 | 0x5B<<7 | 0x1B, + 37589 - 19968: jis0208<<14 | 0x5B<<7 | 0x19, + 37591 - 19968: jis0208<<14 | 0x5B<<7 | 0x15, + 37592 - 19968: jis0212<<14 | 0x43<<7 | 0x21, + 37593 - 19968: jis0208<<14 | 0x5B<<7 | 0x16, + 37596 - 19968: jis0212<<14 | 0x43<<7 | 0x23, + 37597 - 19968: jis0212<<14 | 0x43<<7 | 0x24, + 37599 - 19968: jis0212<<14 | 0x43<<7 | 0x25, + 37600 - 19968: jis0208<<14 | 0x5B<<7 | 0x1A, + 37601 - 19968: jis0212<<14 | 0x43<<7 | 0x27, + 37603 - 19968: jis0212<<14 | 0x43<<7 | 0x28, + 37604 - 19968: jis0208<<14 | 0x1C<<7 | 0x5A, + 37605 - 19968: jis0212<<14 | 0x43<<7 | 0x29, + 37607 - 19968: jis0208<<14 | 0x5B<<7 | 0x14, + 37608 - 19968: jis0212<<14 | 0x43<<7 | 0x2B, + 37609 - 19968: jis0208<<14 | 0x4D<<7 | 0x59, + 37610 - 19968: jis0208<<14 | 0x29<<7 | 0x3E, + 37612 - 19968: jis0212<<14 | 0x43<<7 | 0x2C, + 37613 - 19968: jis0208<<14 | 0x10<<7 | 0x33, + 37614 - 19968: jis0212<<14 | 0x43<<7 | 0x2D, + 37616 - 19968: jis0212<<14 | 0x43<<7 | 0x2E, + 37618 - 19968: jis0208<<14 | 0x28<<7 | 0x25, + 37619 - 19968: jis0208<<14 | 0x22<<7 | 0x51, + 37624 - 19968: jis0208<<14 | 0x14<<7 | 0x57, + 37625 - 19968: jis0208<<14 | 0x58<<7 | 0x09, + 37626 - 19968: jis0208<<14 | 0x4D<<7 | 0x5B, + 37627 - 19968: jis0208<<14 | 0x5B<<7 | 0x1E, + 37628 - 19968: jis0208<<14 | 0x18<<7 | 0x3C, + 37631 - 19968: jis0208<<14 | 0x5B<<7 | 0x21, + 37632 - 19968: jis0212<<14 | 0x43<<7 | 0x32, + 37634 - 19968: jis0208<<14 | 0x5B<<7 | 0x23, + 37638 - 19968: jis0208<<14 | 0x1A<<7 | 0x0B, + 37640 - 19968: jis0212<<14 | 0x43<<7 | 0x34, + 37645 - 19968: jis0212<<14 | 0x43<<7 | 0x35, + 37647 - 19968: jis0208<<14 | 0x4D<<7 | 0x5A, + 37648 - 19968: jis0208<<14 | 0x1E<<7 | 0x4C, + 37649 - 19968: jis0212<<14 | 0x43<<7 | 0x36, + 37652 - 19968: jis0212<<14 | 0x43<<7 | 0x37, + 37653 - 19968: jis0212<<14 | 0x43<<7 | 0x38, + 37656 - 19968: jis0208<<14 | 0x1E<<7 | 0x4D, + 37657 - 19968: jis0208<<14 | 0x4E<<7 | 0x00, + 37658 - 19968: jis0208<<14 | 0x4E<<7 | 0x02, + 37660 - 19968: jis0212<<14 | 0x43<<7 | 0x39, + 37661 - 19968: jis0208<<14 | 0x5B<<7 | 0x22, + 37662 - 19968: jis0208<<14 | 0x5B<<7 | 0x20, + 37663 - 19968: jis0212<<14 | 0x43<<7 | 0x3C, + 37664 - 19968: jis0208<<14 | 0x1D<<7 | 0x5A, + 37665 - 19968: jis0208<<14 | 0x5B<<7 | 0x1D, + 37666 - 19968: jis0208<<14 | 0x4E<<7 | 0x01, + 37667 - 19968: jis0208<<14 | 0x4E<<7 | 0x03, + 37668 - 19968: jis0212<<14 | 0x43<<7 | 0x3E, + 37669 - 19968: jis0208<<14 | 0x5B<<7 | 0x1C, + 37670 - 19968: jis0208<<14 | 0x15<<7 | 0x32, + 37671 - 19968: jis0212<<14 | 0x43<<7 | 0x40, + 37672 - 19968: jis0208<<14 | 0x28<<7 | 0x24, + 37673 - 19968: jis0212<<14 | 0x43<<7 | 0x41, + 37674 - 19968: jis0212<<14 | 0x43<<7 | 0x42, + 37675 - 19968: jis0208<<14 | 0x1B<<7 | 0x41, + 37676 - 19968: jis0208<<14 | 0x2E<<7 | 0x02, + 37678 - 19968: jis0208<<14 | 0x4D<<7 | 0x5D, + 37679 - 19968: jis0208<<14 | 0x19<<7 | 0x57, + 37682 - 19968: jis0208<<14 | 0x2E<<7 | 0x1E, + 37683 - 19968: jis0212<<14 | 0x43<<7 | 0x43, + 37684 - 19968: jis0212<<14 | 0x43<<7 | 0x44, + 37685 - 19968: jis0208<<14 | 0x4E<<7 | 0x05, + 37686 - 19968: jis0212<<14 | 0x43<<7 | 0x45, + 37687 - 19968: jis0212<<14 | 0x43<<7 | 0x46, + 37690 - 19968: jis0208<<14 | 0x4E<<7 | 0x04, + 37691 - 19968: jis0208<<14 | 0x4E<<7 | 0x06, + 37700 - 19968: jis0208<<14 | 0x4D<<7 | 0x5C, + 37703 - 19968: jis0212<<14 | 0x43<<7 | 0x47, + 37704 - 19968: jis0208<<14 | 0x58<<7 | 0x02, + 37705 - 19968: jis0212<<14 | 0x43<<7 | 0x49, + 37707 - 19968: jis0208<<14 | 0x25<<7 | 0x48, + 37709 - 19968: jis0208<<14 | 0x24<<7 | 0x34, + 37712 - 19968: jis0212<<14 | 0x43<<7 | 0x4A, + 37713 - 19968: jis0212<<14 | 0x43<<7 | 0x4B, + 37714 - 19968: jis0212<<14 | 0x43<<7 | 0x4C, + 37716 - 19968: jis0208<<14 | 0x23<<7 | 0x36, + 37717 - 19968: jis0212<<14 | 0x43<<7 | 0x4D, + 37718 - 19968: jis0208<<14 | 0x4E<<7 | 0x0B, + 37719 - 19968: jis0208<<14 | 0x5B<<7 | 0x25, + 37720 - 19968: jis0212<<14 | 0x43<<7 | 0x4F, + 37722 - 19968: jis0212<<14 | 0x43<<7 | 0x50, + 37723 - 19968: jis0208<<14 | 0x22<<7 | 0x22, + 37724 - 19968: jis0208<<14 | 0x4E<<7 | 0x07, + 37726 - 19968: jis0212<<14 | 0x43<<7 | 0x51, + 37728 - 19968: jis0208<<14 | 0x4E<<7 | 0x08, + 37732 - 19968: jis0212<<14 | 0x43<<7 | 0x52, + 37733 - 19968: jis0212<<14 | 0x43<<7 | 0x53, + 37735 - 19968: jis0212<<14 | 0x43<<7 | 0x54, + 37737 - 19968: jis0212<<14 | 0x43<<7 | 0x55, + 37738 - 19968: jis0212<<14 | 0x43<<7 | 0x56, + 37740 - 19968: jis0208<<14 | 0x16<<7 | 0x0C, + 37741 - 19968: jis0212<<14 | 0x43<<7 | 0x57, + 37742 - 19968: jis0208<<14 | 0x4E<<7 | 0x0A, + 37743 - 19968: jis0212<<14 | 0x43<<7 | 0x58, + 37744 - 19968: jis0208<<14 | 0x5B<<7 | 0x24, + 37745 - 19968: jis0212<<14 | 0x43<<7 | 0x5A, + 37747 - 19968: jis0212<<14 | 0x43<<7 | 0x5B, + 37748 - 19968: jis0212<<14 | 0x43<<7 | 0x5C, + 37749 - 19968: jis0208<<14 | 0x17<<7 | 0x0F, + 37750 - 19968: jis0212<<14 | 0x43<<7 | 0x5D, + 37754 - 19968: jis0212<<14 | 0x44<<7 | 0x00, + 37756 - 19968: jis0208<<14 | 0x4E<<7 | 0x09, + 37757 - 19968: jis0212<<14 | 0x44<<7 | 0x01, + 37758 - 19968: jis0208<<14 | 0x1D<<7 | 0x40, + 37759 - 19968: jis0212<<14 | 0x44<<7 | 0x02, + 37760 - 19968: jis0212<<14 | 0x44<<7 | 0x03, + 37761 - 19968: jis0212<<14 | 0x44<<7 | 0x04, + 37762 - 19968: jis0212<<14 | 0x44<<7 | 0x05, + 37768 - 19968: jis0212<<14 | 0x44<<7 | 0x06, + 37770 - 19968: jis0212<<14 | 0x44<<7 | 0x07, + 37771 - 19968: jis0212<<14 | 0x44<<7 | 0x08, + 37772 - 19968: jis0208<<14 | 0x12<<7 | 0x58, + 37773 - 19968: jis0212<<14 | 0x44<<7 | 0x09, + 37775 - 19968: jis0212<<14 | 0x44<<7 | 0x0A, + 37778 - 19968: jis0212<<14 | 0x44<<7 | 0x0B, + 37780 - 19968: jis0208<<14 | 0x4E<<7 | 0x0F, + 37781 - 19968: jis0212<<14 | 0x44<<7 | 0x0C, + 37782 - 19968: jis0208<<14 | 0x19<<7 | 0x1E, + 37783 - 19968: jis0208<<14 | 0x20<<7 | 0x58, + 37784 - 19968: jis0212<<14 | 0x44<<7 | 0x0D, + 37786 - 19968: jis0208<<14 | 0x23<<7 | 0x29, + 37787 - 19968: jis0212<<14 | 0x44<<7 | 0x0E, + 37790 - 19968: jis0212<<14 | 0x44<<7 | 0x0F, + 37793 - 19968: jis0212<<14 | 0x44<<7 | 0x10, + 37795 - 19968: jis0212<<14 | 0x44<<7 | 0x11, + 37796 - 19968: jis0208<<14 | 0x5B<<7 | 0x26, + 37798 - 19968: jis0212<<14 | 0x44<<7 | 0x13, + 37799 - 19968: jis0208<<14 | 0x12<<7 | 0x1A, + 37800 - 19968: jis0212<<14 | 0x44<<7 | 0x14, + 37801 - 19968: jis0212<<14 | 0x44<<7 | 0x1A, + 37803 - 19968: jis0212<<14 | 0x44<<7 | 0x15, + 37804 - 19968: jis0208<<14 | 0x4E<<7 | 0x0D, + 37805 - 19968: jis0208<<14 | 0x4E<<7 | 0x0E, + 37806 - 19968: jis0208<<14 | 0x23<<7 | 0x22, + 37808 - 19968: jis0208<<14 | 0x4E<<7 | 0x0C, + 37812 - 19968: jis0212<<14 | 0x44<<7 | 0x16, + 37813 - 19968: jis0212<<14 | 0x44<<7 | 0x17, + 37814 - 19968: jis0212<<14 | 0x44<<7 | 0x18, + 37817 - 19968: jis0208<<14 | 0x4E<<7 | 0x10, + 37818 - 19968: jis0212<<14 | 0x44<<7 | 0x19, + 37825 - 19968: jis0212<<14 | 0x44<<7 | 0x1B, + 37827 - 19968: jis0208<<14 | 0x4E<<7 | 0x16, + 37828 - 19968: jis0212<<14 | 0x44<<7 | 0x1C, + 37829 - 19968: jis0212<<14 | 0x44<<7 | 0x1D, + 37830 - 19968: jis0208<<14 | 0x5B<<7 | 0x27, + 37831 - 19968: jis0212<<14 | 0x44<<7 | 0x1F, + 37832 - 19968: jis0208<<14 | 0x4E<<7 | 0x19, + 37833 - 19968: jis0212<<14 | 0x44<<7 | 0x20, + 37834 - 19968: jis0212<<14 | 0x44<<7 | 0x21, + 37835 - 19968: jis0212<<14 | 0x44<<7 | 0x22, + 37836 - 19968: jis0212<<14 | 0x44<<7 | 0x23, + 37837 - 19968: jis0212<<14 | 0x44<<7 | 0x24, + 37840 - 19968: jis0208<<14 | 0x4E<<7 | 0x18, + 37841 - 19968: jis0208<<14 | 0x24<<7 | 0x0C, + 37843 - 19968: jis0212<<14 | 0x44<<7 | 0x25, + 37846 - 19968: jis0208<<14 | 0x4E<<7 | 0x11, + 37847 - 19968: jis0208<<14 | 0x4E<<7 | 0x12, + 37848 - 19968: jis0208<<14 | 0x4E<<7 | 0x15, + 37849 - 19968: jis0212<<14 | 0x44<<7 | 0x26, + 37852 - 19968: jis0212<<14 | 0x44<<7 | 0x27, + 37853 - 19968: jis0208<<14 | 0x4E<<7 | 0x17, + 37854 - 19968: jis0208<<14 | 0x5B<<7 | 0x28, + 37855 - 19968: jis0212<<14 | 0x44<<7 | 0x29, + 37857 - 19968: jis0208<<14 | 0x15<<7 | 0x1F, + 37858 - 19968: jis0212<<14 | 0x44<<7 | 0x2A, + 37860 - 19968: jis0208<<14 | 0x4E<<7 | 0x1A, + 37861 - 19968: jis0208<<14 | 0x4E<<7 | 0x14, + 37862 - 19968: jis0212<<14 | 0x44<<7 | 0x2B, + 37863 - 19968: jis0212<<14 | 0x44<<7 | 0x2C, + 37864 - 19968: jis0208<<14 | 0x4E<<7 | 0x13, + 37879 - 19968: jis0212<<14 | 0x44<<7 | 0x2E, + 37880 - 19968: jis0208<<14 | 0x5B<<7 | 0x29, + 37881 - 19968: jis0212<<14 | 0x44<<7 | 0x2D, + 37882 - 19968: jis0212<<14 | 0x44<<7 | 0x30, + 37883 - 19968: jis0212<<14 | 0x44<<7 | 0x31, + 37885 - 19968: jis0212<<14 | 0x44<<7 | 0x32, + 37889 - 19968: jis0212<<14 | 0x44<<7 | 0x33, + 37890 - 19968: jis0212<<14 | 0x44<<7 | 0x34, + 37891 - 19968: jis0208<<14 | 0x4E<<7 | 0x1E, + 37892 - 19968: jis0212<<14 | 0x44<<7 | 0x35, + 37895 - 19968: jis0208<<14 | 0x4E<<7 | 0x1F, + 37896 - 19968: jis0212<<14 | 0x44<<7 | 0x36, + 37897 - 19968: jis0212<<14 | 0x44<<7 | 0x37, + 37901 - 19968: jis0212<<14 | 0x44<<7 | 0x38, + 37902 - 19968: jis0212<<14 | 0x44<<7 | 0x39, + 37903 - 19968: jis0212<<14 | 0x44<<7 | 0x3A, + 37904 - 19968: jis0208<<14 | 0x4E<<7 | 0x20, + 37907 - 19968: jis0208<<14 | 0x4E<<7 | 0x1D, + 37908 - 19968: jis0208<<14 | 0x4E<<7 | 0x1C, + 37909 - 19968: jis0212<<14 | 0x44<<7 | 0x3B, + 37910 - 19968: jis0212<<14 | 0x44<<7 | 0x3C, + 37911 - 19968: jis0212<<14 | 0x44<<7 | 0x3D, + 37912 - 19968: jis0208<<14 | 0x1D<<7 | 0x41, + 37913 - 19968: jis0208<<14 | 0x25<<7 | 0x09, + 37914 - 19968: jis0208<<14 | 0x4E<<7 | 0x1B, + 37919 - 19968: jis0212<<14 | 0x44<<7 | 0x3E, + 37921 - 19968: jis0208<<14 | 0x4E<<7 | 0x24, + 37931 - 19968: jis0208<<14 | 0x4E<<7 | 0x22, + 37934 - 19968: jis0212<<14 | 0x44<<7 | 0x3F, + 37935 - 19968: jis0212<<14 | 0x44<<7 | 0x40, + 37937 - 19968: jis0208<<14 | 0x5B<<7 | 0x2A, + 37938 - 19968: jis0212<<14 | 0x44<<7 | 0x42, + 37939 - 19968: jis0212<<14 | 0x44<<7 | 0x43, + 37940 - 19968: jis0212<<14 | 0x44<<7 | 0x44, + 37941 - 19968: jis0208<<14 | 0x4E<<7 | 0x23, + 37942 - 19968: jis0208<<14 | 0x4E<<7 | 0x21, + 37944 - 19968: jis0208<<14 | 0x21<<7 | 0x57, + 37946 - 19968: jis0208<<14 | 0x4E<<7 | 0x25, + 37947 - 19968: jis0212<<14 | 0x44<<7 | 0x45, + 37949 - 19968: jis0212<<14 | 0x44<<7 | 0x47, + 37951 - 19968: jis0212<<14 | 0x44<<7 | 0x46, + 37953 - 19968: jis0208<<14 | 0x4E<<7 | 0x26, + 37955 - 19968: jis0212<<14 | 0x44<<7 | 0x48, + 37956 - 19968: jis0208<<14 | 0x4E<<7 | 0x28, + 37957 - 19968: jis0208<<14 | 0x5B<<7 | 0x2B, + 37960 - 19968: jis0208<<14 | 0x5B<<7 | 0x2C, + 37962 - 19968: jis0212<<14 | 0x44<<7 | 0x4B, + 37964 - 19968: jis0212<<14 | 0x44<<7 | 0x4C, + 37969 - 19968: jis0208<<14 | 0x13<<7 | 0x34, + 37970 - 19968: jis0208<<14 | 0x4E<<7 | 0x27, + 37971 - 19968: jis0208<<14 | 0x2B<<7 | 0x59, + 37973 - 19968: jis0212<<14 | 0x44<<7 | 0x4D, + 37977 - 19968: jis0212<<14 | 0x44<<7 | 0x4E, + 37978 - 19968: jis0208<<14 | 0x4E<<7 | 0x33, + 37979 - 19968: jis0208<<14 | 0x4E<<7 | 0x29, + 37980 - 19968: jis0212<<14 | 0x44<<7 | 0x4F, + 37982 - 19968: jis0208<<14 | 0x4E<<7 | 0x2C, + 37983 - 19968: jis0212<<14 | 0x44<<7 | 0x50, + 37984 - 19968: jis0208<<14 | 0x4E<<7 | 0x2A, + 37985 - 19968: jis0212<<14 | 0x44<<7 | 0x51, + 37986 - 19968: jis0208<<14 | 0x4E<<7 | 0x2B, + 37987 - 19968: jis0212<<14 | 0x44<<7 | 0x52, + 37992 - 19968: jis0212<<14 | 0x44<<7 | 0x53, + 37994 - 19968: jis0208<<14 | 0x4E<<7 | 0x2D, + 37995 - 19968: jis0212<<14 | 0x44<<7 | 0x54, + 37997 - 19968: jis0212<<14 | 0x44<<7 | 0x55, + 37998 - 19968: jis0212<<14 | 0x44<<7 | 0x56, + 37999 - 19968: jis0212<<14 | 0x44<<7 | 0x57, + 38000 - 19968: jis0208<<14 | 0x4E<<7 | 0x2F, + 38001 - 19968: jis0212<<14 | 0x44<<7 | 0x58, + 38002 - 19968: jis0212<<14 | 0x44<<7 | 0x59, + 38005 - 19968: jis0208<<14 | 0x4E<<7 | 0x30, + 38007 - 19968: jis0208<<14 | 0x4E<<7 | 0x31, + 38012 - 19968: jis0208<<14 | 0x4E<<7 | 0x34, + 38013 - 19968: jis0208<<14 | 0x4E<<7 | 0x32, + 38014 - 19968: jis0208<<14 | 0x4E<<7 | 0x35, + 38015 - 19968: jis0208<<14 | 0x4E<<7 | 0x37, + 38017 - 19968: jis0208<<14 | 0x4E<<7 | 0x36, + 38019 - 19968: jis0212<<14 | 0x44<<7 | 0x5B, + 38020 - 19968: jis0212<<14 | 0x44<<7 | 0x5A, + 38263 - 19968: jis0208<<14 | 0x23<<7 | 0x18, + 38264 - 19968: jis0212<<14 | 0x44<<7 | 0x5C, + 38265 - 19968: jis0212<<14 | 0x44<<7 | 0x5D, + 38270 - 19968: jis0212<<14 | 0x45<<7 | 0x00, + 38272 - 19968: jis0208<<14 | 0x2B<<7 | 0x46, + 38274 - 19968: jis0208<<14 | 0x4E<<7 | 0x38, + 38275 - 19968: jis0208<<14 | 0x20<<7 | 0x0D, + 38276 - 19968: jis0212<<14 | 0x45<<7 | 0x01, + 38279 - 19968: jis0208<<14 | 0x4E<<7 | 0x39, + 38280 - 19968: jis0212<<14 | 0x45<<7 | 0x02, + 38281 - 19968: jis0208<<14 | 0x29<<7 | 0x23, + 38282 - 19968: jis0208<<14 | 0x4E<<7 | 0x3A, + 38283 - 19968: jis0208<<14 | 0x12<<7 | 0x0A, + 38284 - 19968: jis0212<<14 | 0x45<<7 | 0x03, + 38285 - 19968: jis0212<<14 | 0x45<<7 | 0x04, + 38286 - 19968: jis0212<<14 | 0x45<<7 | 0x05, + 38287 - 19968: jis0208<<14 | 0x10<<7 | 0x1B, + 38289 - 19968: jis0208<<14 | 0x13<<7 | 0x36, + 38290 - 19968: jis0208<<14 | 0x5B<<7 | 0x2D, + 38291 - 19968: jis0208<<14 | 0x13<<7 | 0x35, + 38292 - 19968: jis0208<<14 | 0x4E<<7 | 0x3B, + 38294 - 19968: jis0208<<14 | 0x4E<<7 | 0x3C, + 38296 - 19968: jis0208<<14 | 0x4E<<7 | 0x3D, + 38297 - 19968: jis0208<<14 | 0x4E<<7 | 0x3E, + 38301 - 19968: jis0212<<14 | 0x45<<7 | 0x06, + 38302 - 19968: jis0212<<14 | 0x45<<7 | 0x07, + 38303 - 19968: jis0212<<14 | 0x45<<7 | 0x08, + 38304 - 19968: jis0208<<14 | 0x4E<<7 | 0x3F, + 38305 - 19968: jis0212<<14 | 0x45<<7 | 0x09, + 38306 - 19968: jis0208<<14 | 0x13<<7 | 0x37, + 38307 - 19968: jis0208<<14 | 0x12<<7 | 0x34, + 38308 - 19968: jis0208<<14 | 0x18<<7 | 0x3D, + 38309 - 19968: jis0208<<14 | 0x27<<7 | 0x15, + 38310 - 19968: jis0212<<14 | 0x45<<7 | 0x0A, + 38311 - 19968: jis0208<<14 | 0x4E<<7 | 0x41, + 38312 - 19968: jis0208<<14 | 0x4E<<7 | 0x40, + 38313 - 19968: jis0212<<14 | 0x45<<7 | 0x0B, + 38315 - 19968: jis0212<<14 | 0x45<<7 | 0x0C, + 38316 - 19968: jis0212<<14 | 0x45<<7 | 0x0D, + 38317 - 19968: jis0208<<14 | 0x4E<<7 | 0x42, + 38322 - 19968: jis0208<<14 | 0x10<<7 | 0x3B, + 38324 - 19968: jis0212<<14 | 0x45<<7 | 0x0E, + 38326 - 19968: jis0212<<14 | 0x45<<7 | 0x0F, + 38329 - 19968: jis0208<<14 | 0x4E<<7 | 0x45, + 38330 - 19968: jis0212<<14 | 0x45<<7 | 0x10, + 38331 - 19968: jis0208<<14 | 0x4E<<7 | 0x44, + 38332 - 19968: jis0208<<14 | 0x4E<<7 | 0x43, + 38333 - 19968: jis0212<<14 | 0x45<<7 | 0x11, + 38334 - 19968: jis0208<<14 | 0x4E<<7 | 0x46, + 38335 - 19968: jis0212<<14 | 0x45<<7 | 0x12, + 38339 - 19968: jis0208<<14 | 0x4E<<7 | 0x49, + 38342 - 19968: jis0212<<14 | 0x45<<7 | 0x13, + 38343 - 19968: jis0208<<14 | 0x0F<<7 | 0x26, + 38344 - 19968: jis0212<<14 | 0x45<<7 | 0x14, + 38345 - 19968: jis0212<<14 | 0x45<<7 | 0x15, + 38346 - 19968: jis0208<<14 | 0x4E<<7 | 0x47, + 38347 - 19968: jis0212<<14 | 0x45<<7 | 0x16, + 38348 - 19968: jis0208<<14 | 0x4E<<7 | 0x4B, + 38349 - 19968: jis0208<<14 | 0x4E<<7 | 0x4A, + 38352 - 19968: jis0212<<14 | 0x45<<7 | 0x17, + 38353 - 19968: jis0212<<14 | 0x45<<7 | 0x18, + 38354 - 19968: jis0212<<14 | 0x45<<7 | 0x19, + 38355 - 19968: jis0212<<14 | 0x45<<7 | 0x1A, + 38356 - 19968: jis0208<<14 | 0x4E<<7 | 0x4D, + 38357 - 19968: jis0208<<14 | 0x4E<<7 | 0x4C, + 38358 - 19968: jis0208<<14 | 0x4E<<7 | 0x4E, + 38360 - 19968: jis0208<<14 | 0x25<<7 | 0x0D, + 38361 - 19968: jis0212<<14 | 0x45<<7 | 0x1B, + 38362 - 19968: jis0212<<14 | 0x45<<7 | 0x1C, + 38364 - 19968: jis0208<<14 | 0x4E<<7 | 0x4F, + 38365 - 19968: jis0212<<14 | 0x45<<7 | 0x1D, + 38366 - 19968: jis0212<<14 | 0x45<<7 | 0x1E, + 38367 - 19968: jis0212<<14 | 0x45<<7 | 0x1F, + 38368 - 19968: jis0212<<14 | 0x45<<7 | 0x20, + 38369 - 19968: jis0208<<14 | 0x4E<<7 | 0x50, + 38370 - 19968: jis0208<<14 | 0x4E<<7 | 0x52, + 38372 - 19968: jis0212<<14 | 0x45<<7 | 0x21, + 38373 - 19968: jis0208<<14 | 0x4E<<7 | 0x51, + 38374 - 19968: jis0212<<14 | 0x45<<7 | 0x22, + 38428 - 19968: jis0208<<14 | 0x28<<7 | 0x4B, + 38429 - 19968: jis0212<<14 | 0x45<<7 | 0x23, + 38430 - 19968: jis0212<<14 | 0x45<<7 | 0x24, + 38433 - 19968: jis0208<<14 | 0x4E<<7 | 0x53, + 38434 - 19968: jis0212<<14 | 0x45<<7 | 0x25, + 38436 - 19968: jis0212<<14 | 0x45<<7 | 0x26, + 38437 - 19968: jis0212<<14 | 0x45<<7 | 0x27, + 38438 - 19968: jis0212<<14 | 0x45<<7 | 0x28, + 38440 - 19968: jis0208<<14 | 0x4E<<7 | 0x54, + 38442 - 19968: jis0208<<14 | 0x19<<7 | 0x44, + 38444 - 19968: jis0212<<14 | 0x45<<7 | 0x29, + 38446 - 19968: jis0208<<14 | 0x4E<<7 | 0x55, + 38447 - 19968: jis0208<<14 | 0x4E<<7 | 0x56, + 38449 - 19968: jis0212<<14 | 0x45<<7 | 0x2A, + 38450 - 19968: jis0208<<14 | 0x2A<<7 | 0x28, + 38451 - 19968: jis0212<<14 | 0x45<<7 | 0x2B, + 38455 - 19968: jis0212<<14 | 0x45<<7 | 0x2C, + 38456 - 19968: jis0212<<14 | 0x45<<7 | 0x2D, + 38457 - 19968: jis0212<<14 | 0x45<<7 | 0x2E, + 38458 - 19968: jis0212<<14 | 0x45<<7 | 0x2F, + 38459 - 19968: jis0208<<14 | 0x20<<7 | 0x2A, + 38460 - 19968: jis0212<<14 | 0x45<<7 | 0x30, + 38461 - 19968: jis0212<<14 | 0x45<<7 | 0x31, + 38463 - 19968: jis0208<<14 | 0x0F<<7 | 0x03, + 38464 - 19968: jis0208<<14 | 0x21<<7 | 0x2A, + 38465 - 19968: jis0212<<14 | 0x45<<7 | 0x32, + 38466 - 19968: jis0208<<14 | 0x4E<<7 | 0x57, + 38468 - 19968: jis0208<<14 | 0x28<<7 | 0x4C, + 38475 - 19968: jis0208<<14 | 0x4E<<7 | 0x5A, + 38476 - 19968: jis0208<<14 | 0x4E<<7 | 0x58, + 38477 - 19968: jis0208<<14 | 0x18<<7 | 0x3E, + 38479 - 19968: jis0208<<14 | 0x4E<<7 | 0x59, + 38480 - 19968: jis0208<<14 | 0x17<<7 | 0x21, + 38482 - 19968: jis0212<<14 | 0x45<<7 | 0x33, + 38484 - 19968: jis0212<<14 | 0x45<<7 | 0x34, + 38486 - 19968: jis0212<<14 | 0x45<<7 | 0x35, + 38487 - 19968: jis0212<<14 | 0x45<<7 | 0x36, + 38488 - 19968: jis0212<<14 | 0x45<<7 | 0x37, + 38491 - 19968: jis0208<<14 | 0x29<<7 | 0x24, + 38492 - 19968: jis0208<<14 | 0x4E<<7 | 0x5C, + 38493 - 19968: jis0208<<14 | 0x4F<<7 | 0x00, + 38494 - 19968: jis0208<<14 | 0x4E<<7 | 0x5D, + 38495 - 19968: jis0208<<14 | 0x4F<<7 | 0x01, + 38497 - 19968: jis0212<<14 | 0x45<<7 | 0x38, + 38498 - 19968: jis0208<<14 | 0x10<<7 | 0x00, + 38499 - 19968: jis0208<<14 | 0x1E<<7 | 0x37, + 38500 - 19968: jis0208<<14 | 0x1C<<7 | 0x5B, + 38501 - 19968: jis0208<<14 | 0x13<<7 | 0x38, + 38502 - 19968: jis0208<<14 | 0x4F<<7 | 0x02, + 38506 - 19968: jis0208<<14 | 0x26<<7 | 0x45, + 38508 - 19968: jis0208<<14 | 0x4F<<7 | 0x04, + 38510 - 19968: jis0212<<14 | 0x45<<7 | 0x39, + 38512 - 19968: jis0208<<14 | 0x10<<7 | 0x01, + 38514 - 19968: jis0208<<14 | 0x4F<<7 | 0x03, + 38515 - 19968: jis0208<<14 | 0x23<<7 | 0x23, + 38516 - 19968: jis0212<<14 | 0x45<<7 | 0x3A, + 38517 - 19968: jis0208<<14 | 0x2D<<7 | 0x2C, + 38518 - 19968: jis0208<<14 | 0x25<<7 | 0x0A, + 38519 - 19968: jis0208<<14 | 0x4E<<7 | 0x5B, + 38520 - 19968: jis0208<<14 | 0x2D<<7 | 0x05, + 38522 - 19968: jis0208<<14 | 0x17<<7 | 0x10, + 38523 - 19968: jis0212<<14 | 0x45<<7 | 0x3B, + 38524 - 19968: jis0212<<14 | 0x45<<7 | 0x3C, + 38525 - 19968: jis0208<<14 | 0x2C<<7 | 0x3A, + 38526 - 19968: jis0212<<14 | 0x45<<7 | 0x3D, + 38527 - 19968: jis0212<<14 | 0x45<<7 | 0x3E, + 38529 - 19968: jis0212<<14 | 0x45<<7 | 0x3F, + 38530 - 19968: jis0212<<14 | 0x45<<7 | 0x40, + 38531 - 19968: jis0212<<14 | 0x45<<7 | 0x41, + 38532 - 19968: jis0212<<14 | 0x45<<7 | 0x42, + 38533 - 19968: jis0208<<14 | 0x15<<7 | 0x58, + 38534 - 19968: jis0208<<14 | 0x2D<<7 | 0x13, + 38536 - 19968: jis0208<<14 | 0x16<<7 | 0x07, + 38537 - 19968: jis0212<<14 | 0x45<<7 | 0x43, + 38538 - 19968: jis0208<<14 | 0x21<<7 | 0x41, + 38539 - 19968: jis0208<<14 | 0x46<<7 | 0x00, + 38541 - 19968: jis0208<<14 | 0x4F<<7 | 0x05, + 38542 - 19968: jis0208<<14 | 0x12<<7 | 0x0B, + 38543 - 19968: jis0208<<14 | 0x1E<<7 | 0x4E, + 38545 - 19968: jis0212<<14 | 0x45<<7 | 0x44, + 38548 - 19968: jis0208<<14 | 0x12<<7 | 0x35, + 38549 - 19968: jis0208<<14 | 0x4F<<7 | 0x07, + 38550 - 19968: jis0212<<14 | 0x45<<7 | 0x45, + 38551 - 19968: jis0208<<14 | 0x4F<<7 | 0x08, + 38552 - 19968: jis0208<<14 | 0x4F<<7 | 0x06, + 38553 - 19968: jis0208<<14 | 0x16<<7 | 0x43, + 38554 - 19968: jis0212<<14 | 0x45<<7 | 0x46, + 38555 - 19968: jis0208<<14 | 0x19<<7 | 0x3C, + 38556 - 19968: jis0208<<14 | 0x1D<<7 | 0x42, + 38557 - 19968: jis0208<<14 | 0x5B<<7 | 0x30, + 38559 - 19968: jis0212<<14 | 0x45<<7 | 0x48, + 38560 - 19968: jis0208<<14 | 0x10<<7 | 0x02, + 38563 - 19968: jis0208<<14 | 0x2D<<7 | 0x38, + 38564 - 19968: jis0212<<14 | 0x45<<7 | 0x49, + 38565 - 19968: jis0212<<14 | 0x45<<7 | 0x4A, + 38566 - 19968: jis0212<<14 | 0x45<<7 | 0x4B, + 38567 - 19968: jis0208<<14 | 0x4F<<7 | 0x0A, + 38568 - 19968: jis0208<<14 | 0x4D<<7 | 0x0D, + 38569 - 19968: jis0212<<14 | 0x45<<7 | 0x4C, + 38570 - 19968: jis0208<<14 | 0x4F<<7 | 0x09, + 38574 - 19968: jis0212<<14 | 0x45<<7 | 0x4D, + 38575 - 19968: jis0208<<14 | 0x5B<<7 | 0x31, + 38576 - 19968: jis0208<<14 | 0x4F<<7 | 0x0D, + 38577 - 19968: jis0208<<14 | 0x4F<<7 | 0x0B, + 38578 - 19968: jis0208<<14 | 0x4F<<7 | 0x0C, + 38579 - 19968: jis0212<<14 | 0x45<<7 | 0x4F, + 38580 - 19968: jis0208<<14 | 0x4F<<7 | 0x0E, + 38582 - 19968: jis0208<<14 | 0x4F<<7 | 0x0F, + 38583 - 19968: jis0208<<14 | 0x2D<<7 | 0x4B, + 38584 - 19968: jis0208<<14 | 0x4F<<7 | 0x10, + 38585 - 19968: jis0208<<14 | 0x4F<<7 | 0x11, + 38586 - 19968: jis0212<<14 | 0x45<<7 | 0x50, + 38587 - 19968: jis0208<<14 | 0x1F<<7 | 0x28, + 38588 - 19968: jis0208<<14 | 0x27<<7 | 0x1A, + 38592 - 19968: jis0208<<14 | 0x1E<<7 | 0x5C, + 38593 - 19968: jis0208<<14 | 0x13<<7 | 0x46, + 38596 - 19968: jis0208<<14 | 0x2C<<7 | 0x19, + 38597 - 19968: jis0208<<14 | 0x11<<7 | 0x4C, + 38598 - 19968: jis0208<<14 | 0x1C<<7 | 0x17, + 38599 - 19968: jis0208<<14 | 0x17<<7 | 0x3A, + 38601 - 19968: jis0208<<14 | 0x4F<<7 | 0x14, + 38602 - 19968: jis0212<<14 | 0x45<<7 | 0x51, + 38603 - 19968: jis0208<<14 | 0x4F<<7 | 0x13, + 38604 - 19968: jis0208<<14 | 0x1A<<7 | 0x52, + 38605 - 19968: jis0208<<14 | 0x4F<<7 | 0x15, + 38606 - 19968: jis0208<<14 | 0x4F<<7 | 0x12, + 38609 - 19968: jis0208<<14 | 0x1A<<7 | 0x07, + 38610 - 19968: jis0212<<14 | 0x45<<7 | 0x52, + 38613 - 19968: jis0208<<14 | 0x4F<<7 | 0x19, + 38614 - 19968: jis0208<<14 | 0x49<<7 | 0x0C, + 38616 - 19968: jis0212<<14 | 0x45<<7 | 0x54, + 38617 - 19968: jis0208<<14 | 0x31<<7 | 0x35, + 38618 - 19968: jis0212<<14 | 0x45<<7 | 0x55, + 38619 - 19968: jis0208<<14 | 0x1E<<7 | 0x56, + 38620 - 19968: jis0208<<14 | 0x4F<<7 | 0x17, + 38621 - 19968: jis0212<<14 | 0x45<<7 | 0x56, + 38622 - 19968: jis0212<<14 | 0x45<<7 | 0x57, + 38623 - 19968: jis0212<<14 | 0x45<<7 | 0x58, + 38626 - 19968: jis0208<<14 | 0x2D<<7 | 0x04, + 38627 - 19968: jis0208<<14 | 0x25<<7 | 0x50, + 38632 - 19968: jis0208<<14 | 0x10<<7 | 0x0A, + 38633 - 19968: jis0212<<14 | 0x45<<7 | 0x59, + 38634 - 19968: jis0208<<14 | 0x1F<<7 | 0x42, + 38635 - 19968: jis0208<<14 | 0x1B<<7 | 0x15, + 38639 - 19968: jis0212<<14 | 0x45<<7 | 0x5A, + 38640 - 19968: jis0208<<14 | 0x29<<7 | 0x16, + 38641 - 19968: jis0212<<14 | 0x45<<7 | 0x5B, + 38642 - 19968: jis0208<<14 | 0x10<<7 | 0x1F, + 38646 - 19968: jis0208<<14 | 0x2D<<7 | 0x4C, + 38647 - 19968: jis0208<<14 | 0x2C<<7 | 0x4A, + 38649 - 19968: jis0208<<14 | 0x4F<<7 | 0x1A, + 38650 - 19968: jis0212<<14 | 0x45<<7 | 0x5C, + 38651 - 19968: jis0208<<14 | 0x24<<7 | 0x24, + 38656 - 19968: jis0208<<14 | 0x1B<<7 | 0x5A, + 38658 - 19968: jis0212<<14 | 0x45<<7 | 0x5D, + 38659 - 19968: jis0212<<14 | 0x46<<7 | 0x00, + 38660 - 19968: jis0208<<14 | 0x4F<<7 | 0x1B, + 38661 - 19968: jis0212<<14 | 0x46<<7 | 0x01, + 38662 - 19968: jis0208<<14 | 0x4F<<7 | 0x1C, + 38663 - 19968: jis0208<<14 | 0x1E<<7 | 0x2B, + 38664 - 19968: jis0208<<14 | 0x4F<<7 | 0x1D, + 38665 - 19968: jis0212<<14 | 0x46<<7 | 0x02, + 38666 - 19968: jis0208<<14 | 0x2D<<7 | 0x4D, + 38669 - 19968: jis0208<<14 | 0x4F<<7 | 0x18, + 38670 - 19968: jis0208<<14 | 0x4F<<7 | 0x1F, + 38671 - 19968: jis0208<<14 | 0x4F<<7 | 0x21, + 38673 - 19968: jis0208<<14 | 0x4F<<7 | 0x20, + 38675 - 19968: jis0208<<14 | 0x4F<<7 | 0x1E, + 38678 - 19968: jis0208<<14 | 0x4F<<7 | 0x22, + 38681 - 19968: jis0208<<14 | 0x4F<<7 | 0x23, + 38682 - 19968: jis0212<<14 | 0x46<<7 | 0x03, + 38683 - 19968: jis0212<<14 | 0x46<<7 | 0x04, + 38684 - 19968: jis0208<<14 | 0x20<<7 | 0x59, + 38685 - 19968: jis0212<<14 | 0x46<<7 | 0x05, + 38686 - 19968: jis0208<<14 | 0x11<<7 | 0x41, + 38689 - 19968: jis0212<<14 | 0x46<<7 | 0x06, + 38690 - 19968: jis0212<<14 | 0x46<<7 | 0x07, + 38691 - 19968: jis0212<<14 | 0x46<<7 | 0x08, + 38692 - 19968: jis0208<<14 | 0x4F<<7 | 0x24, + 38695 - 19968: jis0208<<14 | 0x2B<<7 | 0x17, + 38696 - 19968: jis0212<<14 | 0x46<<7 | 0x09, + 38698 - 19968: jis0208<<14 | 0x4F<<7 | 0x25, + 38704 - 19968: jis0208<<14 | 0x4F<<7 | 0x26, + 38705 - 19968: jis0212<<14 | 0x46<<7 | 0x0A, + 38706 - 19968: jis0208<<14 | 0x2E<<7 | 0x09, + 38707 - 19968: jis0208<<14 | 0x5B<<7 | 0x32, + 38712 - 19968: jis0208<<14 | 0x3A<<7 | 0x10, + 38713 - 19968: jis0208<<14 | 0x4F<<7 | 0x27, + 38715 - 19968: jis0208<<14 | 0x5B<<7 | 0x33, + 38717 - 19968: jis0208<<14 | 0x4F<<7 | 0x28, + 38718 - 19968: jis0208<<14 | 0x4F<<7 | 0x29, + 38721 - 19968: jis0212<<14 | 0x46<<7 | 0x0C, + 38722 - 19968: jis0208<<14 | 0x4F<<7 | 0x2D, + 38723 - 19968: jis0208<<14 | 0x5B<<7 | 0x34, + 38724 - 19968: jis0208<<14 | 0x4F<<7 | 0x2A, + 38726 - 19968: jis0208<<14 | 0x4F<<7 | 0x2B, + 38728 - 19968: jis0208<<14 | 0x4F<<7 | 0x2C, + 38729 - 19968: jis0208<<14 | 0x4F<<7 | 0x2E, + 38730 - 19968: jis0212<<14 | 0x46<<7 | 0x0E, + 38733 - 19968: jis0208<<14 | 0x5B<<7 | 0x35, + 38734 - 19968: jis0212<<14 | 0x46<<7 | 0x0F, + 38735 - 19968: jis0208<<14 | 0x5B<<7 | 0x36, + 38737 - 19968: jis0208<<14 | 0x5B<<7 | 0x37, + 38738 - 19968: jis0208<<14 | 0x1F<<7 | 0x23, + 38741 - 19968: jis0208<<14 | 0x5B<<7 | 0x38, + 38742 - 19968: jis0208<<14 | 0x2B<<7 | 0x56, + 38743 - 19968: jis0212<<14 | 0x46<<7 | 0x12, + 38744 - 19968: jis0212<<14 | 0x46<<7 | 0x13, + 38745 - 19968: jis0208<<14 | 0x1F<<7 | 0x24, + 38746 - 19968: jis0212<<14 | 0x46<<7 | 0x14, + 38747 - 19968: jis0212<<14 | 0x46<<7 | 0x15, + 38748 - 19968: jis0208<<14 | 0x4F<<7 | 0x2F, + 38750 - 19968: jis0208<<14 | 0x27<<7 | 0x52, + 38752 - 19968: jis0208<<14 | 0x4F<<7 | 0x30, + 38753 - 19968: jis0208<<14 | 0x52<<7 | 0x32, + 38754 - 19968: jis0208<<14 | 0x2B<<7 | 0x2B, + 38755 - 19968: jis0212<<14 | 0x46<<7 | 0x16, + 38756 - 19968: jis0208<<14 | 0x4F<<7 | 0x31, + 38758 - 19968: jis0208<<14 | 0x4F<<7 | 0x32, + 38759 - 19968: jis0212<<14 | 0x46<<7 | 0x17, + 38760 - 19968: jis0208<<14 | 0x4F<<7 | 0x33, + 38761 - 19968: jis0208<<14 | 0x12<<7 | 0x36, + 38762 - 19968: jis0212<<14 | 0x46<<7 | 0x18, + 38763 - 19968: jis0208<<14 | 0x4F<<7 | 0x35, + 38765 - 19968: jis0208<<14 | 0x1E<<7 | 0x38, + 38766 - 19968: jis0212<<14 | 0x46<<7 | 0x19, + 38769 - 19968: jis0208<<14 | 0x4F<<7 | 0x36, + 38771 - 19968: jis0212<<14 | 0x46<<7 | 0x1A, + 38772 - 19968: jis0208<<14 | 0x16<<7 | 0x03, + 38774 - 19968: jis0212<<14 | 0x46<<7 | 0x1B, + 38775 - 19968: jis0212<<14 | 0x46<<7 | 0x1C, + 38776 - 19968: jis0212<<14 | 0x46<<7 | 0x1D, + 38777 - 19968: jis0208<<14 | 0x4F<<7 | 0x37, + 38778 - 19968: jis0208<<14 | 0x4F<<7 | 0x3B, + 38779 - 19968: jis0212<<14 | 0x46<<7 | 0x1E, + 38780 - 19968: jis0208<<14 | 0x4F<<7 | 0x39, + 38781 - 19968: jis0212<<14 | 0x46<<7 | 0x1F, + 38783 - 19968: jis0212<<14 | 0x46<<7 | 0x20, + 38784 - 19968: jis0212<<14 | 0x46<<7 | 0x21, + 38785 - 19968: jis0208<<14 | 0x4F<<7 | 0x3A, + 38788 - 19968: jis0208<<14 | 0x12<<7 | 0x52, + 38789 - 19968: jis0208<<14 | 0x4F<<7 | 0x38, + 38790 - 19968: jis0208<<14 | 0x4F<<7 | 0x3C, + 38793 - 19968: jis0212<<14 | 0x46<<7 | 0x22, + 38795 - 19968: jis0208<<14 | 0x4F<<7 | 0x3D, + 38797 - 19968: jis0208<<14 | 0x0F<<7 | 0x27, + 38799 - 19968: jis0208<<14 | 0x4F<<7 | 0x3E, + 38800 - 19968: jis0208<<14 | 0x4F<<7 | 0x3F, + 38805 - 19968: jis0212<<14 | 0x46<<7 | 0x23, + 38806 - 19968: jis0212<<14 | 0x46<<7 | 0x24, + 38807 - 19968: jis0212<<14 | 0x46<<7 | 0x25, + 38808 - 19968: jis0208<<14 | 0x1D<<7 | 0x43, + 38809 - 19968: jis0212<<14 | 0x46<<7 | 0x26, + 38810 - 19968: jis0212<<14 | 0x46<<7 | 0x27, + 38812 - 19968: jis0208<<14 | 0x4F<<7 | 0x40, + 38814 - 19968: jis0212<<14 | 0x46<<7 | 0x28, + 38815 - 19968: jis0212<<14 | 0x46<<7 | 0x29, + 38816 - 19968: jis0208<<14 | 0x14<<7 | 0x26, + 38818 - 19968: jis0212<<14 | 0x46<<7 | 0x2A, + 38819 - 19968: jis0208<<14 | 0x4F<<7 | 0x43, + 38822 - 19968: jis0208<<14 | 0x4F<<7 | 0x42, + 38824 - 19968: jis0208<<14 | 0x4F<<7 | 0x41, + 38827 - 19968: jis0208<<14 | 0x4A<<7 | 0x50, + 38828 - 19968: jis0212<<14 | 0x46<<7 | 0x2B, + 38829 - 19968: jis0208<<14 | 0x29<<7 | 0x3B, + 38830 - 19968: jis0212<<14 | 0x46<<7 | 0x2C, + 38833 - 19968: jis0212<<14 | 0x46<<7 | 0x2D, + 38834 - 19968: jis0212<<14 | 0x46<<7 | 0x2E, + 38835 - 19968: jis0208<<14 | 0x4F<<7 | 0x44, + 38836 - 19968: jis0208<<14 | 0x4F<<7 | 0x45, + 38837 - 19968: jis0212<<14 | 0x46<<7 | 0x2F, + 38838 - 19968: jis0212<<14 | 0x46<<7 | 0x30, + 38840 - 19968: jis0212<<14 | 0x46<<7 | 0x31, + 38841 - 19968: jis0212<<14 | 0x46<<7 | 0x32, + 38842 - 19968: jis0212<<14 | 0x46<<7 | 0x33, + 38844 - 19968: jis0212<<14 | 0x46<<7 | 0x34, + 38846 - 19968: jis0212<<14 | 0x46<<7 | 0x35, + 38847 - 19968: jis0212<<14 | 0x46<<7 | 0x36, + 38849 - 19968: jis0212<<14 | 0x46<<7 | 0x37, + 38851 - 19968: jis0208<<14 | 0x4F<<7 | 0x46, + 38852 - 19968: jis0212<<14 | 0x46<<7 | 0x38, + 38853 - 19968: jis0212<<14 | 0x46<<7 | 0x39, + 38854 - 19968: jis0208<<14 | 0x4F<<7 | 0x47, + 38855 - 19968: jis0212<<14 | 0x46<<7 | 0x3A, + 38856 - 19968: jis0208<<14 | 0x4F<<7 | 0x48, + 38857 - 19968: jis0212<<14 | 0x46<<7 | 0x3B, + 38858 - 19968: jis0212<<14 | 0x46<<7 | 0x3C, + 38859 - 19968: jis0208<<14 | 0x4F<<7 | 0x49, + 38860 - 19968: jis0212<<14 | 0x46<<7 | 0x3D, + 38861 - 19968: jis0212<<14 | 0x46<<7 | 0x3E, + 38862 - 19968: jis0212<<14 | 0x46<<7 | 0x3F, + 38864 - 19968: jis0212<<14 | 0x46<<7 | 0x40, + 38865 - 19968: jis0212<<14 | 0x46<<7 | 0x41, + 38867 - 19968: jis0208<<14 | 0x13<<7 | 0x39, + 38868 - 19968: jis0212<<14 | 0x46<<7 | 0x42, + 38871 - 19968: jis0212<<14 | 0x46<<7 | 0x43, + 38872 - 19968: jis0212<<14 | 0x46<<7 | 0x44, + 38873 - 19968: jis0212<<14 | 0x46<<7 | 0x45, + 38875 - 19968: jis0212<<14 | 0x46<<7 | 0x49, + 38876 - 19968: jis0208<<14 | 0x4F<<7 | 0x4A, + 38877 - 19968: jis0212<<14 | 0x46<<7 | 0x46, + 38878 - 19968: jis0212<<14 | 0x46<<7 | 0x47, + 38880 - 19968: jis0212<<14 | 0x46<<7 | 0x48, + 38881 - 19968: jis0212<<14 | 0x46<<7 | 0x4A, + 38884 - 19968: jis0212<<14 | 0x46<<7 | 0x4B, + 38893 - 19968: jis0208<<14 | 0x4F<<7 | 0x4B, + 38894 - 19968: jis0208<<14 | 0x26<<7 | 0x02, + 38895 - 19968: jis0212<<14 | 0x46<<7 | 0x4C, + 38897 - 19968: jis0212<<14 | 0x46<<7 | 0x4D, + 38898 - 19968: jis0208<<14 | 0x4F<<7 | 0x4D, + 38899 - 19968: jis0208<<14 | 0x11<<7 | 0x1A, + 38900 - 19968: jis0212<<14 | 0x46<<7 | 0x4E, + 38901 - 19968: jis0208<<14 | 0x4F<<7 | 0x50, + 38902 - 19968: jis0208<<14 | 0x4F<<7 | 0x4F, + 38903 - 19968: jis0212<<14 | 0x46<<7 | 0x4F, + 38904 - 19968: jis0212<<14 | 0x46<<7 | 0x50, + 38906 - 19968: jis0212<<14 | 0x46<<7 | 0x51, + 38907 - 19968: jis0208<<14 | 0x10<<7 | 0x03, + 38911 - 19968: jis0208<<14 | 0x15<<7 | 0x20, + 38913 - 19968: jis0208<<14 | 0x29<<7 | 0x26, + 38914 - 19968: jis0208<<14 | 0x23<<7 | 0x19, + 38915 - 19968: jis0208<<14 | 0x19<<7 | 0x01, + 38917 - 19968: jis0208<<14 | 0x18<<7 | 0x3F, + 38918 - 19968: jis0208<<14 | 0x1C<<7 | 0x46, + 38919 - 19968: jis0212<<14 | 0x46<<7 | 0x52, + 38920 - 19968: jis0208<<14 | 0x1E<<7 | 0x3B, + 38922 - 19968: jis0212<<14 | 0x46<<7 | 0x53, + 38924 - 19968: jis0208<<14 | 0x4F<<7 | 0x52, + 38925 - 19968: jis0212<<14 | 0x46<<7 | 0x55, + 38926 - 19968: jis0212<<14 | 0x46<<7 | 0x56, + 38927 - 19968: jis0208<<14 | 0x4F<<7 | 0x51, + 38928 - 19968: jis0208<<14 | 0x2C<<7 | 0x21, + 38929 - 19968: jis0208<<14 | 0x13<<7 | 0x47, + 38930 - 19968: jis0208<<14 | 0x27<<7 | 0x31, + 38931 - 19968: jis0208<<14 | 0x25<<7 | 0x3B, + 38932 - 19968: jis0212<<14 | 0x46<<7 | 0x57, + 38934 - 19968: jis0212<<14 | 0x46<<7 | 0x58, + 38935 - 19968: jis0208<<14 | 0x1E<<7 | 0x5B, + 38936 - 19968: jis0208<<14 | 0x2D<<7 | 0x2D, + 38937 - 19968: jis0212<<14 | 0x46<<7 | 0x54, + 38938 - 19968: jis0208<<14 | 0x16<<7 | 0x3A, + 38940 - 19968: jis0212<<14 | 0x46<<7 | 0x59, + 38942 - 19968: jis0212<<14 | 0x46<<7 | 0x5A, + 38944 - 19968: jis0212<<14 | 0x46<<7 | 0x5B, + 38945 - 19968: jis0208<<14 | 0x4F<<7 | 0x55, + 38947 - 19968: jis0212<<14 | 0x46<<7 | 0x5C, + 38948 - 19968: jis0208<<14 | 0x4F<<7 | 0x54, + 38949 - 19968: jis0212<<14 | 0x47<<7 | 0x07, + 38950 - 19968: jis0212<<14 | 0x46<<7 | 0x5D, + 38955 - 19968: jis0212<<14 | 0x47<<7 | 0x00, + 38956 - 19968: jis0208<<14 | 0x2A<<7 | 0x2A, + 38957 - 19968: jis0208<<14 | 0x25<<7 | 0x0B, + 38958 - 19968: jis0212<<14 | 0x47<<7 | 0x01, + 38959 - 19968: jis0212<<14 | 0x47<<7 | 0x02, + 38960 - 19968: jis0212<<14 | 0x47<<7 | 0x03, + 38962 - 19968: jis0212<<14 | 0x47<<7 | 0x04, + 38963 - 19968: jis0212<<14 | 0x47<<7 | 0x05, + 38964 - 19968: jis0208<<14 | 0x10<<7 | 0x2F, + 38965 - 19968: jis0212<<14 | 0x47<<7 | 0x06, + 38967 - 19968: jis0208<<14 | 0x4F<<7 | 0x56, + 38968 - 19968: jis0208<<14 | 0x4F<<7 | 0x53, + 38971 - 19968: jis0208<<14 | 0x28<<7 | 0x30, + 38972 - 19968: jis0208<<14 | 0x2C<<7 | 0x49, + 38973 - 19968: jis0208<<14 | 0x4F<<7 | 0x57, + 38974 - 19968: jis0212<<14 | 0x47<<7 | 0x08, + 38980 - 19968: jis0212<<14 | 0x47<<7 | 0x09, + 38982 - 19968: jis0208<<14 | 0x4F<<7 | 0x58, + 38983 - 19968: jis0212<<14 | 0x47<<7 | 0x0A, + 38986 - 19968: jis0212<<14 | 0x47<<7 | 0x0B, + 38987 - 19968: jis0208<<14 | 0x4F<<7 | 0x5A, + 38988 - 19968: jis0208<<14 | 0x21<<7 | 0x49, + 38989 - 19968: jis0208<<14 | 0x12<<7 | 0x3A, + 38990 - 19968: jis0208<<14 | 0x12<<7 | 0x3B, + 38991 - 19968: jis0208<<14 | 0x4F<<7 | 0x59, + 38993 - 19968: jis0212<<14 | 0x47<<7 | 0x0C, + 38994 - 19968: jis0212<<14 | 0x47<<7 | 0x0D, + 38995 - 19968: jis0212<<14 | 0x47<<7 | 0x0E, + 38996 - 19968: jis0208<<14 | 0x13<<7 | 0x48, + 38997 - 19968: jis0208<<14 | 0x17<<7 | 0x11, + 38998 - 19968: jis0212<<14 | 0x47<<7 | 0x0F, + 38999 - 19968: jis0208<<14 | 0x5B<<7 | 0x39, + 39000 - 19968: jis0208<<14 | 0x13<<7 | 0x49, + 39001 - 19968: jis0212<<14 | 0x47<<7 | 0x11, + 39002 - 19968: jis0212<<14 | 0x47<<7 | 0x12, + 39003 - 19968: jis0208<<14 | 0x24<<7 | 0x1E, + 39006 - 19968: jis0208<<14 | 0x2D<<7 | 0x3F, + 39010 - 19968: jis0212<<14 | 0x47<<7 | 0x13, + 39011 - 19968: jis0212<<14 | 0x47<<7 | 0x14, + 39013 - 19968: jis0208<<14 | 0x5B<<7 | 0x3A, + 39014 - 19968: jis0212<<14 | 0x47<<7 | 0x16, + 39015 - 19968: jis0208<<14 | 0x17<<7 | 0x3B, + 39018 - 19968: jis0212<<14 | 0x47<<7 | 0x17, + 39019 - 19968: jis0208<<14 | 0x4F<<7 | 0x5B, + 39020 - 19968: jis0212<<14 | 0x47<<7 | 0x18, + 39023 - 19968: jis0208<<14 | 0x4F<<7 | 0x5C, + 39024 - 19968: jis0208<<14 | 0x4F<<7 | 0x5D, + 39025 - 19968: jis0208<<14 | 0x50<<7 | 0x00, + 39027 - 19968: jis0208<<14 | 0x50<<7 | 0x02, + 39028 - 19968: jis0208<<14 | 0x50<<7 | 0x01, + 39080 - 19968: jis0208<<14 | 0x28<<7 | 0x56, + 39082 - 19968: jis0208<<14 | 0x50<<7 | 0x03, + 39083 - 19968: jis0212<<14 | 0x47<<7 | 0x19, + 39085 - 19968: jis0212<<14 | 0x47<<7 | 0x1A, + 39086 - 19968: jis0212<<14 | 0x47<<7 | 0x1B, + 39087 - 19968: jis0208<<14 | 0x50<<7 | 0x04, + 39088 - 19968: jis0212<<14 | 0x47<<7 | 0x1C, + 39089 - 19968: jis0208<<14 | 0x50<<7 | 0x05, + 39092 - 19968: jis0212<<14 | 0x47<<7 | 0x1D, + 39094 - 19968: jis0208<<14 | 0x50<<7 | 0x06, + 39095 - 19968: jis0212<<14 | 0x47<<7 | 0x1E, + 39096 - 19968: jis0212<<14 | 0x47<<7 | 0x1F, + 39098 - 19968: jis0212<<14 | 0x47<<7 | 0x20, + 39099 - 19968: jis0212<<14 | 0x47<<7 | 0x21, + 39103 - 19968: jis0212<<14 | 0x47<<7 | 0x22, + 39106 - 19968: jis0212<<14 | 0x47<<7 | 0x23, + 39107 - 19968: jis0208<<14 | 0x50<<7 | 0x08, + 39108 - 19968: jis0208<<14 | 0x50<<7 | 0x07, + 39109 - 19968: jis0212<<14 | 0x47<<7 | 0x24, + 39110 - 19968: jis0208<<14 | 0x50<<7 | 0x09, + 39112 - 19968: jis0212<<14 | 0x47<<7 | 0x25, + 39116 - 19968: jis0212<<14 | 0x47<<7 | 0x26, + 39131 - 19968: jis0208<<14 | 0x27<<7 | 0x53, + 39132 - 19968: jis0208<<14 | 0x45<<7 | 0x2B, + 39135 - 19968: jis0208<<14 | 0x1E<<7 | 0x08, + 39137 - 19968: jis0212<<14 | 0x47<<7 | 0x27, + 39138 - 19968: jis0208<<14 | 0x14<<7 | 0x11, + 39139 - 19968: jis0212<<14 | 0x47<<7 | 0x28, + 39141 - 19968: jis0212<<14 | 0x47<<7 | 0x29, + 39142 - 19968: jis0212<<14 | 0x47<<7 | 0x2A, + 39143 - 19968: jis0212<<14 | 0x47<<7 | 0x2B, + 39145 - 19968: jis0208<<14 | 0x50<<7 | 0x0A, + 39146 - 19968: jis0212<<14 | 0x47<<7 | 0x2C, + 39147 - 19968: jis0208<<14 | 0x50<<7 | 0x0B, + 39149 - 19968: jis0208<<14 | 0x31<<7 | 0x0B, + 39150 - 19968: jis0208<<14 | 0x3C<<7 | 0x1A, + 39151 - 19968: jis0208<<14 | 0x27<<7 | 0x32, + 39154 - 19968: jis0208<<14 | 0x0F<<7 | 0x5A, + 39155 - 19968: jis0212<<14 | 0x47<<7 | 0x2D, + 39156 - 19968: jis0208<<14 | 0x0F<<7 | 0x1A, + 39158 - 19968: jis0212<<14 | 0x47<<7 | 0x2E, + 39164 - 19968: jis0208<<14 | 0x1A<<7 | 0x53, + 39165 - 19968: jis0208<<14 | 0x2A<<7 | 0x0F, + 39166 - 19968: jis0208<<14 | 0x1D<<7 | 0x5D, + 39170 - 19968: jis0212<<14 | 0x47<<7 | 0x2F, + 39171 - 19968: jis0208<<14 | 0x50<<7 | 0x0C, + 39173 - 19968: jis0208<<14 | 0x2B<<7 | 0x3E, + 39175 - 19968: jis0212<<14 | 0x47<<7 | 0x30, + 39176 - 19968: jis0212<<14 | 0x47<<7 | 0x31, + 39177 - 19968: jis0208<<14 | 0x50<<7 | 0x0D, + 39178 - 19968: jis0208<<14 | 0x2C<<7 | 0x3B, + 39180 - 19968: jis0208<<14 | 0x10<<7 | 0x21, + 39184 - 19968: jis0208<<14 | 0x1A<<7 | 0x20, + 39185 - 19968: jis0212<<14 | 0x47<<7 | 0x32, + 39186 - 19968: jis0208<<14 | 0x50<<7 | 0x0E, + 39187 - 19968: jis0208<<14 | 0x11<<7 | 0x4D, + 39188 - 19968: jis0208<<14 | 0x50<<7 | 0x0F, + 39189 - 19968: jis0212<<14 | 0x47<<7 | 0x33, + 39190 - 19968: jis0212<<14 | 0x47<<7 | 0x34, + 39191 - 19968: jis0212<<14 | 0x47<<7 | 0x35, + 39192 - 19968: jis0208<<14 | 0x50<<7 | 0x10, + 39194 - 19968: jis0212<<14 | 0x47<<7 | 0x36, + 39195 - 19968: jis0212<<14 | 0x47<<7 | 0x37, + 39196 - 19968: jis0212<<14 | 0x47<<7 | 0x38, + 39197 - 19968: jis0208<<14 | 0x50<<7 | 0x12, + 39198 - 19968: jis0208<<14 | 0x50<<7 | 0x13, + 39199 - 19968: jis0212<<14 | 0x47<<7 | 0x39, + 39200 - 19968: jis0208<<14 | 0x50<<7 | 0x15, + 39201 - 19968: jis0208<<14 | 0x50<<7 | 0x11, + 39202 - 19968: jis0212<<14 | 0x47<<7 | 0x3A, + 39204 - 19968: jis0208<<14 | 0x50<<7 | 0x14, + 39206 - 19968: jis0212<<14 | 0x47<<7 | 0x3B, + 39207 - 19968: jis0208<<14 | 0x5B<<7 | 0x3D, + 39208 - 19968: jis0208<<14 | 0x13<<7 | 0x3A, + 39211 - 19968: jis0212<<14 | 0x47<<7 | 0x3D, + 39212 - 19968: jis0208<<14 | 0x50<<7 | 0x16, + 39214 - 19968: jis0208<<14 | 0x50<<7 | 0x17, + 39217 - 19968: jis0212<<14 | 0x47<<7 | 0x3E, + 39218 - 19968: jis0212<<14 | 0x47<<7 | 0x3F, + 39219 - 19968: jis0212<<14 | 0x47<<7 | 0x40, + 39220 - 19968: jis0212<<14 | 0x47<<7 | 0x41, + 39221 - 19968: jis0212<<14 | 0x47<<7 | 0x42, + 39225 - 19968: jis0212<<14 | 0x47<<7 | 0x43, + 39226 - 19968: jis0212<<14 | 0x47<<7 | 0x44, + 39227 - 19968: jis0212<<14 | 0x47<<7 | 0x45, + 39228 - 19968: jis0212<<14 | 0x47<<7 | 0x46, + 39229 - 19968: jis0208<<14 | 0x50<<7 | 0x18, + 39230 - 19968: jis0208<<14 | 0x50<<7 | 0x19, + 39232 - 19968: jis0212<<14 | 0x47<<7 | 0x47, + 39233 - 19968: jis0212<<14 | 0x47<<7 | 0x48, + 39234 - 19968: jis0208<<14 | 0x50<<7 | 0x1A, + 39237 - 19968: jis0208<<14 | 0x50<<7 | 0x1C, + 39238 - 19968: jis0212<<14 | 0x47<<7 | 0x49, + 39239 - 19968: jis0212<<14 | 0x47<<7 | 0x4A, + 39240 - 19968: jis0212<<14 | 0x47<<7 | 0x4B, + 39241 - 19968: jis0208<<14 | 0x50<<7 | 0x1B, + 39243 - 19968: jis0208<<14 | 0x50<<7 | 0x1E, + 39244 - 19968: jis0208<<14 | 0x50<<7 | 0x21, + 39245 - 19968: jis0212<<14 | 0x47<<7 | 0x4C, + 39246 - 19968: jis0212<<14 | 0x47<<7 | 0x4D, + 39248 - 19968: jis0208<<14 | 0x50<<7 | 0x1D, + 39249 - 19968: jis0208<<14 | 0x50<<7 | 0x1F, + 39250 - 19968: jis0208<<14 | 0x50<<7 | 0x20, + 39252 - 19968: jis0212<<14 | 0x47<<7 | 0x4E, + 39253 - 19968: jis0208<<14 | 0x50<<7 | 0x22, + 39255 - 19968: jis0208<<14 | 0x15<<7 | 0x21, + 39256 - 19968: jis0212<<14 | 0x47<<7 | 0x4F, + 39257 - 19968: jis0212<<14 | 0x47<<7 | 0x50, + 39259 - 19968: jis0212<<14 | 0x47<<7 | 0x51, + 39260 - 19968: jis0212<<14 | 0x47<<7 | 0x52, + 39262 - 19968: jis0212<<14 | 0x47<<7 | 0x53, + 39263 - 19968: jis0212<<14 | 0x47<<7 | 0x54, + 39264 - 19968: jis0212<<14 | 0x47<<7 | 0x55, + 39318 - 19968: jis0208<<14 | 0x1B<<7 | 0x52, + 39319 - 19968: jis0208<<14 | 0x50<<7 | 0x23, + 39320 - 19968: jis0208<<14 | 0x50<<7 | 0x24, + 39321 - 19968: jis0208<<14 | 0x18<<7 | 0x40, + 39323 - 19968: jis0212<<14 | 0x47<<7 | 0x56, + 39325 - 19968: jis0212<<14 | 0x47<<7 | 0x57, + 39326 - 19968: jis0208<<14 | 0x5B<<7 | 0x3F, + 39327 - 19968: jis0212<<14 | 0x47<<7 | 0x58, + 39333 - 19968: jis0208<<14 | 0x50<<7 | 0x25, + 39334 - 19968: jis0212<<14 | 0x47<<7 | 0x59, + 39336 - 19968: jis0208<<14 | 0x12<<7 | 0x1D, + 39340 - 19968: jis0208<<14 | 0x26<<7 | 0x2E, + 39341 - 19968: jis0208<<14 | 0x50<<7 | 0x26, + 39342 - 19968: jis0208<<14 | 0x50<<7 | 0x27, + 39344 - 19968: jis0212<<14 | 0x47<<7 | 0x5A, + 39345 - 19968: jis0212<<14 | 0x47<<7 | 0x5B, + 39346 - 19968: jis0212<<14 | 0x47<<7 | 0x5C, + 39347 - 19968: jis0208<<14 | 0x22<<7 | 0x39, + 39348 - 19968: jis0208<<14 | 0x25<<7 | 0x4A, + 39349 - 19968: jis0212<<14 | 0x47<<7 | 0x5D, + 39353 - 19968: jis0212<<14 | 0x48<<7 | 0x00, + 39354 - 19968: jis0212<<14 | 0x48<<7 | 0x01, + 39356 - 19968: jis0208<<14 | 0x50<<7 | 0x28, + 39357 - 19968: jis0212<<14 | 0x48<<7 | 0x02, + 39359 - 19968: jis0212<<14 | 0x48<<7 | 0x03, + 39361 - 19968: jis0208<<14 | 0x26<<7 | 0x5C, + 39363 - 19968: jis0212<<14 | 0x48<<7 | 0x04, + 39364 - 19968: jis0208<<14 | 0x21<<7 | 0x2B, + 39365 - 19968: jis0208<<14 | 0x10<<7 | 0x37, + 39366 - 19968: jis0208<<14 | 0x15<<7 | 0x4D, + 39368 - 19968: jis0208<<14 | 0x15<<7 | 0x4E, + 39369 - 19968: jis0212<<14 | 0x48<<7 | 0x05, + 39376 - 19968: jis0208<<14 | 0x22<<7 | 0x52, + 39377 - 19968: jis0208<<14 | 0x50<<7 | 0x2D, + 39378 - 19968: jis0208<<14 | 0x15<<7 | 0x4F, + 39379 - 19968: jis0212<<14 | 0x48<<7 | 0x06, + 39380 - 19968: jis0212<<14 | 0x48<<7 | 0x07, + 39381 - 19968: jis0208<<14 | 0x11<<7 | 0x4E, + 39384 - 19968: jis0208<<14 | 0x50<<7 | 0x2C, + 39385 - 19968: jis0212<<14 | 0x48<<7 | 0x08, + 39386 - 19968: jis0212<<14 | 0x48<<7 | 0x09, + 39387 - 19968: jis0208<<14 | 0x50<<7 | 0x2A, + 39388 - 19968: jis0212<<14 | 0x48<<7 | 0x0A, + 39389 - 19968: jis0208<<14 | 0x50<<7 | 0x2B, + 39390 - 19968: jis0212<<14 | 0x48<<7 | 0x0B, + 39391 - 19968: jis0208<<14 | 0x50<<7 | 0x29, + 39394 - 19968: jis0208<<14 | 0x50<<7 | 0x37, + 39399 - 19968: jis0212<<14 | 0x48<<7 | 0x0C, + 39402 - 19968: jis0212<<14 | 0x48<<7 | 0x0D, + 39403 - 19968: jis0212<<14 | 0x48<<7 | 0x0E, + 39404 - 19968: jis0212<<14 | 0x48<<7 | 0x0F, + 39405 - 19968: jis0208<<14 | 0x50<<7 | 0x2E, + 39406 - 19968: jis0208<<14 | 0x50<<7 | 0x2F, + 39408 - 19968: jis0212<<14 | 0x48<<7 | 0x10, + 39409 - 19968: jis0208<<14 | 0x50<<7 | 0x30, + 39410 - 19968: jis0208<<14 | 0x50<<7 | 0x31, + 39412 - 19968: jis0212<<14 | 0x48<<7 | 0x11, + 39413 - 19968: jis0212<<14 | 0x48<<7 | 0x12, + 39416 - 19968: jis0208<<14 | 0x50<<7 | 0x33, + 39417 - 19968: jis0212<<14 | 0x48<<7 | 0x13, + 39419 - 19968: jis0208<<14 | 0x50<<7 | 0x32, + 39421 - 19968: jis0212<<14 | 0x48<<7 | 0x14, + 39422 - 19968: jis0212<<14 | 0x48<<7 | 0x15, + 39423 - 19968: jis0208<<14 | 0x1C<<7 | 0x38, + 39425 - 19968: jis0208<<14 | 0x50<<7 | 0x34, + 39426 - 19968: jis0212<<14 | 0x48<<7 | 0x16, + 39427 - 19968: jis0212<<14 | 0x48<<7 | 0x17, + 39428 - 19968: jis0212<<14 | 0x48<<7 | 0x18, + 39429 - 19968: jis0208<<14 | 0x50<<7 | 0x36, + 39435 - 19968: jis0212<<14 | 0x48<<7 | 0x19, + 39436 - 19968: jis0212<<14 | 0x48<<7 | 0x1A, + 39438 - 19968: jis0208<<14 | 0x14<<7 | 0x12, + 39439 - 19968: jis0208<<14 | 0x50<<7 | 0x35, + 39440 - 19968: jis0212<<14 | 0x48<<7 | 0x1B, + 39441 - 19968: jis0212<<14 | 0x48<<7 | 0x1C, + 39442 - 19968: jis0208<<14 | 0x20<<7 | 0x5A, + 39443 - 19968: jis0208<<14 | 0x17<<7 | 0x12, + 39446 - 19968: jis0212<<14 | 0x48<<7 | 0x1D, + 39449 - 19968: jis0208<<14 | 0x50<<7 | 0x38, + 39454 - 19968: jis0212<<14 | 0x48<<7 | 0x1E, + 39456 - 19968: jis0212<<14 | 0x48<<7 | 0x1F, + 39458 - 19968: jis0212<<14 | 0x48<<7 | 0x20, + 39459 - 19968: jis0212<<14 | 0x48<<7 | 0x21, + 39460 - 19968: jis0212<<14 | 0x48<<7 | 0x22, + 39463 - 19968: jis0212<<14 | 0x48<<7 | 0x23, + 39464 - 19968: jis0208<<14 | 0x21<<7 | 0x2C, + 39467 - 19968: jis0208<<14 | 0x50<<7 | 0x39, + 39469 - 19968: jis0212<<14 | 0x48<<7 | 0x24, + 39470 - 19968: jis0212<<14 | 0x48<<7 | 0x25, + 39472 - 19968: jis0208<<14 | 0x25<<7 | 0x0C, + 39475 - 19968: jis0212<<14 | 0x48<<7 | 0x26, + 39477 - 19968: jis0212<<14 | 0x48<<7 | 0x27, + 39478 - 19968: jis0212<<14 | 0x48<<7 | 0x28, + 39479 - 19968: jis0208<<14 | 0x50<<7 | 0x3A, + 39480 - 19968: jis0212<<14 | 0x48<<7 | 0x29, + 39486 - 19968: jis0208<<14 | 0x50<<7 | 0x3F, + 39488 - 19968: jis0208<<14 | 0x50<<7 | 0x3D, + 39489 - 19968: jis0212<<14 | 0x48<<7 | 0x2B, + 39490 - 19968: jis0208<<14 | 0x50<<7 | 0x3C, + 39491 - 19968: jis0208<<14 | 0x50<<7 | 0x3E, + 39492 - 19968: jis0212<<14 | 0x48<<7 | 0x2C, + 39493 - 19968: jis0208<<14 | 0x50<<7 | 0x3B, + 39495 - 19968: jis0212<<14 | 0x48<<7 | 0x2A, + 39498 - 19968: jis0212<<14 | 0x48<<7 | 0x2D, + 39499 - 19968: jis0212<<14 | 0x48<<7 | 0x2E, + 39500 - 19968: jis0212<<14 | 0x48<<7 | 0x2F, + 39501 - 19968: jis0208<<14 | 0x50<<7 | 0x41, + 39502 - 19968: jis0208<<14 | 0x5B<<7 | 0x40, + 39505 - 19968: jis0212<<14 | 0x48<<7 | 0x31, + 39508 - 19968: jis0212<<14 | 0x48<<7 | 0x32, + 39509 - 19968: jis0208<<14 | 0x50<<7 | 0x40, + 39510 - 19968: jis0212<<14 | 0x48<<7 | 0x33, + 39511 - 19968: jis0208<<14 | 0x50<<7 | 0x43, + 39514 - 19968: jis0208<<14 | 0x15<<7 | 0x22, + 39515 - 19968: jis0208<<14 | 0x50<<7 | 0x42, + 39517 - 19968: jis0212<<14 | 0x48<<7 | 0x34, + 39519 - 19968: jis0208<<14 | 0x50<<7 | 0x44, + 39522 - 19968: jis0208<<14 | 0x50<<7 | 0x45, + 39524 - 19968: jis0208<<14 | 0x50<<7 | 0x47, + 39525 - 19968: jis0208<<14 | 0x50<<7 | 0x46, + 39529 - 19968: jis0208<<14 | 0x50<<7 | 0x48, + 39530 - 19968: jis0208<<14 | 0x50<<7 | 0x4A, + 39531 - 19968: jis0208<<14 | 0x50<<7 | 0x49, + 39592 - 19968: jis0208<<14 | 0x18<<7 | 0x5B, + 39594 - 19968: jis0212<<14 | 0x48<<7 | 0x35, + 39596 - 19968: jis0212<<14 | 0x48<<7 | 0x36, + 39597 - 19968: jis0208<<14 | 0x50<<7 | 0x4B, + 39598 - 19968: jis0212<<14 | 0x48<<7 | 0x37, + 39599 - 19968: jis0212<<14 | 0x48<<7 | 0x38, + 39600 - 19968: jis0208<<14 | 0x50<<7 | 0x4C, + 39602 - 19968: jis0212<<14 | 0x48<<7 | 0x39, + 39604 - 19968: jis0212<<14 | 0x48<<7 | 0x3A, + 39605 - 19968: jis0212<<14 | 0x48<<7 | 0x3B, + 39606 - 19968: jis0212<<14 | 0x48<<7 | 0x3C, + 39608 - 19968: jis0208<<14 | 0x12<<7 | 0x1B, + 39609 - 19968: jis0212<<14 | 0x48<<7 | 0x3D, + 39611 - 19968: jis0212<<14 | 0x48<<7 | 0x3E, + 39612 - 19968: jis0208<<14 | 0x50<<7 | 0x4D, + 39614 - 19968: jis0212<<14 | 0x48<<7 | 0x3F, + 39615 - 19968: jis0212<<14 | 0x48<<7 | 0x40, + 39616 - 19968: jis0208<<14 | 0x50<<7 | 0x4E, + 39617 - 19968: jis0212<<14 | 0x48<<7 | 0x41, + 39619 - 19968: jis0212<<14 | 0x48<<7 | 0x42, + 39620 - 19968: jis0208<<14 | 0x1E<<7 | 0x50, + 39622 - 19968: jis0212<<14 | 0x48<<7 | 0x43, + 39624 - 19968: jis0212<<14 | 0x48<<7 | 0x44, + 39630 - 19968: jis0212<<14 | 0x48<<7 | 0x45, + 39631 - 19968: jis0208<<14 | 0x50<<7 | 0x4F, + 39632 - 19968: jis0212<<14 | 0x48<<7 | 0x46, + 39633 - 19968: jis0208<<14 | 0x50<<7 | 0x50, + 39634 - 19968: jis0212<<14 | 0x48<<7 | 0x47, + 39635 - 19968: jis0208<<14 | 0x50<<7 | 0x51, + 39636 - 19968: jis0208<<14 | 0x50<<7 | 0x52, + 39637 - 19968: jis0212<<14 | 0x48<<7 | 0x48, + 39638 - 19968: jis0212<<14 | 0x48<<7 | 0x49, + 39639 - 19968: jis0212<<14 | 0x48<<7 | 0x4A, + 39640 - 19968: jis0208<<14 | 0x18<<7 | 0x41, + 39641 - 19968: jis0208<<14 | 0x5B<<7 | 0x41, + 39643 - 19968: jis0212<<14 | 0x48<<7 | 0x4B, + 39644 - 19968: jis0208<<14 | 0x5B<<7 | 0x42, + 39646 - 19968: jis0208<<14 | 0x50<<7 | 0x53, + 39647 - 19968: jis0208<<14 | 0x50<<7 | 0x54, + 39648 - 19968: jis0212<<14 | 0x48<<7 | 0x4D, + 39650 - 19968: jis0208<<14 | 0x50<<7 | 0x55, + 39651 - 19968: jis0208<<14 | 0x50<<7 | 0x56, + 39652 - 19968: jis0212<<14 | 0x48<<7 | 0x4E, + 39653 - 19968: jis0212<<14 | 0x48<<7 | 0x4F, + 39654 - 19968: jis0208<<14 | 0x50<<7 | 0x57, + 39655 - 19968: jis0212<<14 | 0x48<<7 | 0x50, + 39657 - 19968: jis0212<<14 | 0x48<<7 | 0x51, + 39658 - 19968: jis0208<<14 | 0x27<<7 | 0x10, + 39659 - 19968: jis0208<<14 | 0x50<<7 | 0x59, + 39660 - 19968: jis0212<<14 | 0x48<<7 | 0x52, + 39661 - 19968: jis0208<<14 | 0x28<<7 | 0x05, + 39662 - 19968: jis0208<<14 | 0x50<<7 | 0x5A, + 39663 - 19968: jis0208<<14 | 0x50<<7 | 0x58, + 39665 - 19968: jis0208<<14 | 0x50<<7 | 0x5C, + 39666 - 19968: jis0212<<14 | 0x48<<7 | 0x53, + 39667 - 19968: jis0212<<14 | 0x48<<7 | 0x54, + 39668 - 19968: jis0208<<14 | 0x50<<7 | 0x5B, + 39669 - 19968: jis0212<<14 | 0x48<<7 | 0x55, + 39671 - 19968: jis0208<<14 | 0x50<<7 | 0x5D, + 39673 - 19968: jis0212<<14 | 0x48<<7 | 0x56, + 39674 - 19968: jis0212<<14 | 0x48<<7 | 0x57, + 39675 - 19968: jis0208<<14 | 0x51<<7 | 0x00, + 39677 - 19968: jis0212<<14 | 0x48<<7 | 0x58, + 39679 - 19968: jis0212<<14 | 0x48<<7 | 0x59, + 39680 - 19968: jis0212<<14 | 0x48<<7 | 0x5A, + 39681 - 19968: jis0212<<14 | 0x48<<7 | 0x5B, + 39682 - 19968: jis0212<<14 | 0x48<<7 | 0x5C, + 39683 - 19968: jis0212<<14 | 0x48<<7 | 0x5D, + 39684 - 19968: jis0212<<14 | 0x49<<7 | 0x00, + 39685 - 19968: jis0212<<14 | 0x49<<7 | 0x01, + 39686 - 19968: jis0208<<14 | 0x51<<7 | 0x01, + 39688 - 19968: jis0212<<14 | 0x49<<7 | 0x02, + 39689 - 19968: jis0212<<14 | 0x49<<7 | 0x03, + 39691 - 19968: jis0212<<14 | 0x49<<7 | 0x04, + 39692 - 19968: jis0212<<14 | 0x49<<7 | 0x05, + 39693 - 19968: jis0212<<14 | 0x49<<7 | 0x06, + 39694 - 19968: jis0212<<14 | 0x49<<7 | 0x07, + 39696 - 19968: jis0212<<14 | 0x49<<7 | 0x08, + 39698 - 19968: jis0212<<14 | 0x49<<7 | 0x09, + 39702 - 19968: jis0212<<14 | 0x49<<7 | 0x0A, + 39704 - 19968: jis0208<<14 | 0x51<<7 | 0x02, + 39705 - 19968: jis0212<<14 | 0x49<<7 | 0x0B, + 39706 - 19968: jis0208<<14 | 0x51<<7 | 0x03, + 39707 - 19968: jis0212<<14 | 0x49<<7 | 0x0C, + 39708 - 19968: jis0212<<14 | 0x49<<7 | 0x0D, + 39711 - 19968: jis0208<<14 | 0x51<<7 | 0x04, + 39712 - 19968: jis0212<<14 | 0x49<<7 | 0x0E, + 39714 - 19968: jis0208<<14 | 0x51<<7 | 0x05, + 39715 - 19968: jis0208<<14 | 0x51<<7 | 0x06, + 39717 - 19968: jis0208<<14 | 0x51<<7 | 0x07, + 39718 - 19968: jis0212<<14 | 0x49<<7 | 0x0F, + 39719 - 19968: jis0208<<14 | 0x51<<7 | 0x08, + 39720 - 19968: jis0208<<14 | 0x51<<7 | 0x09, + 39721 - 19968: jis0208<<14 | 0x51<<7 | 0x0A, + 39722 - 19968: jis0208<<14 | 0x51<<7 | 0x0B, + 39723 - 19968: jis0212<<14 | 0x49<<7 | 0x10, + 39725 - 19968: jis0212<<14 | 0x49<<7 | 0x11, + 39726 - 19968: jis0208<<14 | 0x51<<7 | 0x0C, + 39727 - 19968: jis0208<<14 | 0x51<<7 | 0x0D, + 39729 - 19968: jis0208<<14 | 0x3C<<7 | 0x14, + 39730 - 19968: jis0208<<14 | 0x51<<7 | 0x0E, + 39731 - 19968: jis0212<<14 | 0x49<<7 | 0x12, + 39732 - 19968: jis0212<<14 | 0x49<<7 | 0x13, + 39733 - 19968: jis0212<<14 | 0x49<<7 | 0x14, + 39735 - 19968: jis0212<<14 | 0x49<<7 | 0x15, + 39737 - 19968: jis0212<<14 | 0x49<<7 | 0x16, + 39738 - 19968: jis0212<<14 | 0x49<<7 | 0x17, + 39739 - 19968: jis0208<<14 | 0x43<<7 | 0x57, + 39740 - 19968: jis0208<<14 | 0x14<<7 | 0x13, + 39741 - 19968: jis0212<<14 | 0x49<<7 | 0x18, + 39745 - 19968: jis0208<<14 | 0x12<<7 | 0x00, + 39746 - 19968: jis0208<<14 | 0x19<<7 | 0x11, + 39747 - 19968: jis0208<<14 | 0x51<<7 | 0x10, + 39748 - 19968: jis0208<<14 | 0x51<<7 | 0x0F, + 39749 - 19968: jis0208<<14 | 0x2B<<7 | 0x04, + 39752 - 19968: jis0212<<14 | 0x49<<7 | 0x19, + 39755 - 19968: jis0212<<14 | 0x49<<7 | 0x1A, + 39756 - 19968: jis0212<<14 | 0x49<<7 | 0x1B, + 39757 - 19968: jis0208<<14 | 0x51<<7 | 0x12, + 39758 - 19968: jis0208<<14 | 0x51<<7 | 0x13, + 39759 - 19968: jis0208<<14 | 0x51<<7 | 0x11, + 39761 - 19968: jis0208<<14 | 0x51<<7 | 0x14, + 39764 - 19968: jis0208<<14 | 0x2A<<7 | 0x41, + 39765 - 19968: jis0212<<14 | 0x49<<7 | 0x1C, + 39766 - 19968: jis0212<<14 | 0x49<<7 | 0x1D, + 39767 - 19968: jis0212<<14 | 0x49<<7 | 0x1E, + 39768 - 19968: jis0208<<14 | 0x51<<7 | 0x15, + 39770 - 19968: jis0208<<14 | 0x14<<7 | 0x5A, + 39771 - 19968: jis0212<<14 | 0x49<<7 | 0x1F, + 39774 - 19968: jis0212<<14 | 0x49<<7 | 0x20, + 39777 - 19968: jis0212<<14 | 0x49<<7 | 0x21, + 39779 - 19968: jis0212<<14 | 0x49<<7 | 0x22, + 39781 - 19968: jis0212<<14 | 0x49<<7 | 0x23, + 39782 - 19968: jis0212<<14 | 0x49<<7 | 0x24, + 39784 - 19968: jis0212<<14 | 0x49<<7 | 0x25, + 39786 - 19968: jis0212<<14 | 0x49<<7 | 0x26, + 39787 - 19968: jis0212<<14 | 0x49<<7 | 0x27, + 39788 - 19968: jis0212<<14 | 0x49<<7 | 0x28, + 39789 - 19968: jis0212<<14 | 0x49<<7 | 0x29, + 39790 - 19968: jis0212<<14 | 0x49<<7 | 0x2A, + 39791 - 19968: jis0208<<14 | 0x2E<<7 | 0x04, + 39794 - 19968: jis0208<<14 | 0x5B<<7 | 0x44, + 39795 - 19968: jis0212<<14 | 0x49<<7 | 0x2B, + 39796 - 19968: jis0208<<14 | 0x51<<7 | 0x16, + 39797 - 19968: jis0208<<14 | 0x5B<<7 | 0x43, + 39799 - 19968: jis0212<<14 | 0x49<<7 | 0x2D, + 39800 - 19968: jis0212<<14 | 0x49<<7 | 0x2E, + 39801 - 19968: jis0212<<14 | 0x49<<7 | 0x2F, + 39807 - 19968: jis0212<<14 | 0x49<<7 | 0x30, + 39808 - 19968: jis0212<<14 | 0x49<<7 | 0x31, + 39811 - 19968: jis0208<<14 | 0x51<<7 | 0x18, + 39812 - 19968: jis0212<<14 | 0x49<<7 | 0x32, + 39813 - 19968: jis0212<<14 | 0x49<<7 | 0x33, + 39814 - 19968: jis0212<<14 | 0x49<<7 | 0x34, + 39815 - 19968: jis0212<<14 | 0x49<<7 | 0x35, + 39817 - 19968: jis0212<<14 | 0x49<<7 | 0x36, + 39818 - 19968: jis0212<<14 | 0x49<<7 | 0x37, + 39819 - 19968: jis0212<<14 | 0x49<<7 | 0x38, + 39821 - 19968: jis0212<<14 | 0x49<<7 | 0x39, + 39822 - 19968: jis0208<<14 | 0x0F<<7 | 0x1D, + 39823 - 19968: jis0208<<14 | 0x5B<<7 | 0x45, + 39824 - 19968: jis0212<<14 | 0x49<<7 | 0x3B, + 39825 - 19968: jis0208<<14 | 0x51<<7 | 0x19, + 39826 - 19968: jis0208<<14 | 0x29<<7 | 0x0A, + 39827 - 19968: jis0208<<14 | 0x51<<7 | 0x17, + 39828 - 19968: jis0212<<14 | 0x49<<7 | 0x3C, + 39830 - 19968: jis0208<<14 | 0x51<<7 | 0x1A, + 39831 - 19968: jis0208<<14 | 0x51<<7 | 0x1B, + 39834 - 19968: jis0212<<14 | 0x49<<7 | 0x3D, + 39837 - 19968: jis0212<<14 | 0x49<<7 | 0x3E, + 39838 - 19968: jis0212<<14 | 0x49<<7 | 0x3F, + 39839 - 19968: jis0208<<14 | 0x51<<7 | 0x1C, + 39840 - 19968: jis0208<<14 | 0x51<<7 | 0x1D, + 39846 - 19968: jis0212<<14 | 0x49<<7 | 0x40, + 39847 - 19968: jis0212<<14 | 0x49<<7 | 0x41, + 39848 - 19968: jis0208<<14 | 0x51<<7 | 0x1E, + 39849 - 19968: jis0212<<14 | 0x49<<7 | 0x42, + 39850 - 19968: jis0208<<14 | 0x2A<<7 | 0x4D, + 39851 - 19968: jis0208<<14 | 0x1A<<7 | 0x0C, + 39852 - 19968: jis0212<<14 | 0x49<<7 | 0x43, + 39853 - 19968: jis0208<<14 | 0x19<<7 | 0x59, + 39854 - 19968: jis0208<<14 | 0x20<<7 | 0x0E, + 39856 - 19968: jis0212<<14 | 0x49<<7 | 0x44, + 39857 - 19968: jis0208<<14 | 0x5B<<7 | 0x46, + 39858 - 19968: jis0212<<14 | 0x49<<7 | 0x46, + 39860 - 19968: jis0208<<14 | 0x51<<7 | 0x1F, + 39863 - 19968: jis0212<<14 | 0x49<<7 | 0x47, + 39864 - 19968: jis0212<<14 | 0x49<<7 | 0x48, + 39865 - 19968: jis0208<<14 | 0x51<<7 | 0x22, + 39867 - 19968: jis0208<<14 | 0x5B<<7 | 0x47, + 39868 - 19968: jis0212<<14 | 0x49<<7 | 0x4A, + 39870 - 19968: jis0212<<14 | 0x49<<7 | 0x4B, + 39871 - 19968: jis0212<<14 | 0x49<<7 | 0x4C, + 39872 - 19968: jis0208<<14 | 0x51<<7 | 0x20, + 39873 - 19968: jis0212<<14 | 0x49<<7 | 0x4D, + 39878 - 19968: jis0208<<14 | 0x51<<7 | 0x23, + 39879 - 19968: jis0212<<14 | 0x49<<7 | 0x4E, + 39880 - 19968: jis0212<<14 | 0x49<<7 | 0x4F, + 39881 - 19968: jis0208<<14 | 0x17<<7 | 0x50, + 39882 - 19968: jis0208<<14 | 0x51<<7 | 0x21, + 39886 - 19968: jis0212<<14 | 0x49<<7 | 0x50, + 39887 - 19968: jis0208<<14 | 0x51<<7 | 0x24, + 39888 - 19968: jis0212<<14 | 0x49<<7 | 0x51, + 39889 - 19968: jis0208<<14 | 0x51<<7 | 0x25, + 39890 - 19968: jis0208<<14 | 0x51<<7 | 0x26, + 39892 - 19968: jis0208<<14 | 0x51<<7 | 0x2A, + 39894 - 19968: jis0208<<14 | 0x1A<<7 | 0x09, + 39895 - 19968: jis0212<<14 | 0x49<<7 | 0x52, + 39896 - 19968: jis0212<<14 | 0x49<<7 | 0x53, + 39899 - 19968: jis0208<<14 | 0x21<<7 | 0x43, + 39901 - 19968: jis0212<<14 | 0x49<<7 | 0x54, + 39903 - 19968: jis0212<<14 | 0x49<<7 | 0x55, + 39905 - 19968: jis0208<<14 | 0x51<<7 | 0x2B, + 39906 - 19968: jis0208<<14 | 0x51<<7 | 0x28, + 39907 - 19968: jis0208<<14 | 0x51<<7 | 0x27, + 39908 - 19968: jis0208<<14 | 0x51<<7 | 0x29, + 39909 - 19968: jis0212<<14 | 0x49<<7 | 0x56, + 39911 - 19968: jis0212<<14 | 0x49<<7 | 0x57, + 39912 - 19968: jis0208<<14 | 0x16<<7 | 0x3E, + 39914 - 19968: jis0212<<14 | 0x49<<7 | 0x58, + 39915 - 19968: jis0212<<14 | 0x49<<7 | 0x59, + 39919 - 19968: jis0212<<14 | 0x49<<7 | 0x5A, + 39920 - 19968: jis0208<<14 | 0x51<<7 | 0x2F, + 39921 - 19968: jis0208<<14 | 0x51<<7 | 0x2E, + 39922 - 19968: jis0208<<14 | 0x51<<7 | 0x2D, + 39923 - 19968: jis0212<<14 | 0x49<<7 | 0x5B, + 39925 - 19968: jis0208<<14 | 0x0F<<7 | 0x12, + 39927 - 19968: jis0212<<14 | 0x49<<7 | 0x5C, + 39928 - 19968: jis0212<<14 | 0x49<<7 | 0x5D, + 39929 - 19968: jis0212<<14 | 0x4A<<7 | 0x00, + 39930 - 19968: jis0212<<14 | 0x4A<<7 | 0x01, + 39933 - 19968: jis0212<<14 | 0x4A<<7 | 0x02, + 39935 - 19968: jis0212<<14 | 0x4A<<7 | 0x03, + 39936 - 19968: jis0208<<14 | 0x5B<<7 | 0x48, + 39938 - 19968: jis0212<<14 | 0x4A<<7 | 0x05, + 39940 - 19968: jis0208<<14 | 0x51<<7 | 0x39, + 39942 - 19968: jis0208<<14 | 0x51<<7 | 0x35, + 39944 - 19968: jis0208<<14 | 0x51<<7 | 0x36, + 39945 - 19968: jis0208<<14 | 0x51<<7 | 0x32, + 39946 - 19968: jis0208<<14 | 0x51<<7 | 0x38, + 39947 - 19968: jis0212<<14 | 0x4A<<7 | 0x06, + 39948 - 19968: jis0208<<14 | 0x51<<7 | 0x34, + 39949 - 19968: jis0208<<14 | 0x12<<7 | 0x41, + 39951 - 19968: jis0212<<14 | 0x4A<<7 | 0x07, + 39952 - 19968: jis0208<<14 | 0x2E<<7 | 0x2B, + 39953 - 19968: jis0212<<14 | 0x4A<<7 | 0x08, + 39954 - 19968: jis0208<<14 | 0x51<<7 | 0x37, + 39955 - 19968: jis0208<<14 | 0x51<<7 | 0x33, + 39956 - 19968: jis0208<<14 | 0x51<<7 | 0x31, + 39957 - 19968: jis0208<<14 | 0x51<<7 | 0x30, + 39958 - 19968: jis0212<<14 | 0x4A<<7 | 0x09, + 39960 - 19968: jis0212<<14 | 0x4A<<7 | 0x0A, + 39961 - 19968: jis0212<<14 | 0x4A<<7 | 0x0B, + 39962 - 19968: jis0212<<14 | 0x4A<<7 | 0x0C, + 39963 - 19968: jis0208<<14 | 0x51<<7 | 0x3B, + 39964 - 19968: jis0212<<14 | 0x4A<<7 | 0x0D, + 39966 - 19968: jis0212<<14 | 0x4A<<7 | 0x0E, + 39969 - 19968: jis0208<<14 | 0x51<<7 | 0x3E, + 39970 - 19968: jis0212<<14 | 0x4A<<7 | 0x0F, + 39971 - 19968: jis0212<<14 | 0x4A<<7 | 0x10, + 39972 - 19968: jis0208<<14 | 0x51<<7 | 0x3D, + 39973 - 19968: jis0208<<14 | 0x51<<7 | 0x3C, + 39974 - 19968: jis0212<<14 | 0x4A<<7 | 0x11, + 39975 - 19968: jis0212<<14 | 0x4A<<7 | 0x12, + 39976 - 19968: jis0212<<14 | 0x4A<<7 | 0x13, + 39977 - 19968: jis0212<<14 | 0x4A<<7 | 0x14, + 39978 - 19968: jis0212<<14 | 0x4A<<7 | 0x15, + 39981 - 19968: jis0208<<14 | 0x28<<7 | 0x28, + 39982 - 19968: jis0208<<14 | 0x51<<7 | 0x3A, + 39983 - 19968: jis0208<<14 | 0x0F<<7 | 0x52, + 39984 - 19968: jis0208<<14 | 0x51<<7 | 0x3F, + 39985 - 19968: jis0212<<14 | 0x4A<<7 | 0x16, + 39986 - 19968: jis0208<<14 | 0x51<<7 | 0x41, + 39989 - 19968: jis0212<<14 | 0x4A<<7 | 0x17, + 39990 - 19968: jis0212<<14 | 0x4A<<7 | 0x18, + 39991 - 19968: jis0212<<14 | 0x4A<<7 | 0x19, + 39993 - 19968: jis0208<<14 | 0x12<<7 | 0x4E, + 39994 - 19968: jis0208<<14 | 0x51<<7 | 0x2C, + 39995 - 19968: jis0208<<14 | 0x10<<7 | 0x16, + 39997 - 19968: jis0212<<14 | 0x4A<<7 | 0x1A, + 39998 - 19968: jis0208<<14 | 0x51<<7 | 0x43, + 40001 - 19968: jis0212<<14 | 0x4A<<7 | 0x1B, + 40003 - 19968: jis0212<<14 | 0x4A<<7 | 0x1C, + 40004 - 19968: jis0212<<14 | 0x4A<<7 | 0x1D, + 40005 - 19968: jis0212<<14 | 0x4A<<7 | 0x1E, + 40006 - 19968: jis0208<<14 | 0x51<<7 | 0x42, + 40007 - 19968: jis0208<<14 | 0x51<<7 | 0x40, + 40008 - 19968: jis0208<<14 | 0x22<<7 | 0x0C, + 40009 - 19968: jis0212<<14 | 0x4A<<7 | 0x1F, + 40010 - 19968: jis0212<<14 | 0x4A<<7 | 0x20, + 40014 - 19968: jis0212<<14 | 0x4A<<7 | 0x21, + 40015 - 19968: jis0212<<14 | 0x4A<<7 | 0x22, + 40016 - 19968: jis0212<<14 | 0x4A<<7 | 0x23, + 40018 - 19968: jis0208<<14 | 0x2A<<7 | 0x4F, + 40019 - 19968: jis0212<<14 | 0x4A<<7 | 0x24, + 40020 - 19968: jis0212<<14 | 0x4A<<7 | 0x25, + 40022 - 19968: jis0212<<14 | 0x4A<<7 | 0x26, + 40023 - 19968: jis0208<<14 | 0x2D<<7 | 0x39, + 40024 - 19968: jis0212<<14 | 0x4A<<7 | 0x27, + 40026 - 19968: jis0208<<14 | 0x51<<7 | 0x44, + 40027 - 19968: jis0212<<14 | 0x4A<<7 | 0x28, + 40028 - 19968: jis0212<<14 | 0x4A<<7 | 0x2F, + 40029 - 19968: jis0212<<14 | 0x4A<<7 | 0x29, + 40030 - 19968: jis0212<<14 | 0x4A<<7 | 0x2A, + 40031 - 19968: jis0212<<14 | 0x4A<<7 | 0x2B, + 40032 - 19968: jis0208<<14 | 0x51<<7 | 0x45, + 40035 - 19968: jis0212<<14 | 0x4A<<7 | 0x2C, + 40039 - 19968: jis0208<<14 | 0x51<<7 | 0x46, + 40040 - 19968: jis0212<<14 | 0x4A<<7 | 0x31, + 40041 - 19968: jis0212<<14 | 0x4A<<7 | 0x2D, + 40042 - 19968: jis0212<<14 | 0x4A<<7 | 0x2E, + 40043 - 19968: jis0212<<14 | 0x4A<<7 | 0x30, + 40046 - 19968: jis0212<<14 | 0x4A<<7 | 0x32, + 40048 - 19968: jis0212<<14 | 0x4A<<7 | 0x33, + 40050 - 19968: jis0212<<14 | 0x4A<<7 | 0x34, + 40053 - 19968: jis0212<<14 | 0x4A<<7 | 0x35, + 40054 - 19968: jis0208<<14 | 0x51<<7 | 0x47, + 40055 - 19968: jis0212<<14 | 0x4A<<7 | 0x36, + 40056 - 19968: jis0208<<14 | 0x51<<7 | 0x48, + 40059 - 19968: jis0212<<14 | 0x4A<<7 | 0x37, + 40165 - 19968: jis0208<<14 | 0x23<<7 | 0x1A, + 40166 - 19968: jis0212<<14 | 0x4A<<7 | 0x38, + 40167 - 19968: jis0208<<14 | 0x51<<7 | 0x49, + 40169 - 19968: jis0208<<14 | 0x27<<7 | 0x16, + 40171 - 19968: jis0208<<14 | 0x51<<7 | 0x4E, + 40172 - 19968: jis0208<<14 | 0x51<<7 | 0x4A, + 40176 - 19968: jis0208<<14 | 0x51<<7 | 0x4B, + 40178 - 19968: jis0212<<14 | 0x4A<<7 | 0x39, + 40179 - 19968: jis0208<<14 | 0x2A<<7 | 0x10, + 40180 - 19968: jis0208<<14 | 0x2B<<7 | 0x23, + 40182 - 19968: jis0208<<14 | 0x25<<7 | 0x2F, + 40183 - 19968: jis0212<<14 | 0x4A<<7 | 0x3A, + 40185 - 19968: jis0212<<14 | 0x4A<<7 | 0x3B, + 40194 - 19968: jis0212<<14 | 0x4A<<7 | 0x3D, + 40195 - 19968: jis0208<<14 | 0x51<<7 | 0x4F, + 40198 - 19968: jis0208<<14 | 0x51<<7 | 0x50, + 40199 - 19968: jis0208<<14 | 0x25<<7 | 0x1D, + 40200 - 19968: jis0208<<14 | 0x51<<7 | 0x4D, + 40201 - 19968: jis0208<<14 | 0x51<<7 | 0x4C, + 40203 - 19968: jis0212<<14 | 0x4A<<7 | 0x3C, + 40206 - 19968: jis0208<<14 | 0x11<<7 | 0x09, + 40209 - 19968: jis0212<<14 | 0x4A<<7 | 0x3E, + 40210 - 19968: jis0208<<14 | 0x51<<7 | 0x58, + 40213 - 19968: jis0208<<14 | 0x51<<7 | 0x57, + 40215 - 19968: jis0212<<14 | 0x4A<<7 | 0x3F, + 40216 - 19968: jis0212<<14 | 0x4A<<7 | 0x40, + 40219 - 19968: jis0208<<14 | 0x10<<7 | 0x54, + 40220 - 19968: jis0212<<14 | 0x4A<<7 | 0x41, + 40221 - 19968: jis0212<<14 | 0x4A<<7 | 0x42, + 40222 - 19968: jis0212<<14 | 0x4A<<7 | 0x43, + 40223 - 19968: jis0208<<14 | 0x51<<7 | 0x55, + 40227 - 19968: jis0208<<14 | 0x51<<7 | 0x54, + 40230 - 19968: jis0208<<14 | 0x51<<7 | 0x52, + 40232 - 19968: jis0208<<14 | 0x12<<7 | 0x5A, + 40234 - 19968: jis0208<<14 | 0x51<<7 | 0x51, + 40235 - 19968: jis0208<<14 | 0x1B<<7 | 0x11, + 40236 - 19968: jis0208<<14 | 0x11<<7 | 0x08, + 40239 - 19968: jis0212<<14 | 0x4A<<7 | 0x44, + 40240 - 19968: jis0212<<14 | 0x4A<<7 | 0x45, + 40242 - 19968: jis0212<<14 | 0x4A<<7 | 0x46, + 40243 - 19968: jis0212<<14 | 0x4A<<7 | 0x47, + 40244 - 19968: jis0212<<14 | 0x4A<<7 | 0x48, + 40250 - 19968: jis0212<<14 | 0x4A<<7 | 0x49, + 40251 - 19968: jis0208<<14 | 0x18<<7 | 0x42, + 40252 - 19968: jis0212<<14 | 0x4A<<7 | 0x4A, + 40253 - 19968: jis0212<<14 | 0x4A<<7 | 0x4C, + 40254 - 19968: jis0208<<14 | 0x51<<7 | 0x5B, + 40255 - 19968: jis0208<<14 | 0x51<<7 | 0x5A, + 40257 - 19968: jis0208<<14 | 0x51<<7 | 0x59, + 40258 - 19968: jis0212<<14 | 0x4A<<7 | 0x4D, + 40259 - 19968: jis0212<<14 | 0x4A<<7 | 0x4E, + 40260 - 19968: jis0208<<14 | 0x51<<7 | 0x56, + 40261 - 19968: jis0212<<14 | 0x4A<<7 | 0x4B, + 40262 - 19968: jis0208<<14 | 0x51<<7 | 0x5C, + 40263 - 19968: jis0212<<14 | 0x4A<<7 | 0x4F, + 40264 - 19968: jis0208<<14 | 0x51<<7 | 0x5D, + 40266 - 19968: jis0212<<14 | 0x4A<<7 | 0x50, + 40272 - 19968: jis0208<<14 | 0x52<<7 | 0x04, + 40273 - 19968: jis0208<<14 | 0x52<<7 | 0x03, + 40275 - 19968: jis0212<<14 | 0x4A<<7 | 0x51, + 40276 - 19968: jis0212<<14 | 0x4A<<7 | 0x52, + 40281 - 19968: jis0208<<14 | 0x52<<7 | 0x05, + 40284 - 19968: jis0208<<14 | 0x10<<7 | 0x0C, + 40285 - 19968: jis0208<<14 | 0x52<<7 | 0x00, + 40286 - 19968: jis0208<<14 | 0x52<<7 | 0x01, + 40287 - 19968: jis0212<<14 | 0x4A<<7 | 0x53, + 40288 - 19968: jis0208<<14 | 0x18<<7 | 0x53, + 40289 - 19968: jis0208<<14 | 0x2B<<7 | 0x18, + 40290 - 19968: jis0212<<14 | 0x4A<<7 | 0x55, + 40291 - 19968: jis0212<<14 | 0x4A<<7 | 0x54, + 40292 - 19968: jis0208<<14 | 0x52<<7 | 0x02, + 40293 - 19968: jis0212<<14 | 0x4A<<7 | 0x56, + 40297 - 19968: jis0212<<14 | 0x4A<<7 | 0x57, + 40298 - 19968: jis0212<<14 | 0x4A<<7 | 0x58, + 40299 - 19968: jis0208<<14 | 0x5B<<7 | 0x4A, + 40300 - 19968: jis0208<<14 | 0x2A<<7 | 0x11, + 40303 - 19968: jis0208<<14 | 0x52<<7 | 0x0A, + 40304 - 19968: jis0208<<14 | 0x5B<<7 | 0x49, + 40306 - 19968: jis0208<<14 | 0x52<<7 | 0x06, + 40310 - 19968: jis0212<<14 | 0x4A<<7 | 0x5B, + 40311 - 19968: jis0212<<14 | 0x4A<<7 | 0x5C, + 40314 - 19968: jis0208<<14 | 0x52<<7 | 0x0B, + 40315 - 19968: jis0212<<14 | 0x4A<<7 | 0x5D, + 40316 - 19968: jis0212<<14 | 0x4B<<7 | 0x00, + 40318 - 19968: jis0212<<14 | 0x4B<<7 | 0x01, + 40323 - 19968: jis0212<<14 | 0x4B<<7 | 0x02, + 40324 - 19968: jis0212<<14 | 0x4B<<7 | 0x03, + 40326 - 19968: jis0212<<14 | 0x4B<<7 | 0x04, + 40327 - 19968: jis0208<<14 | 0x52<<7 | 0x08, + 40329 - 19968: jis0208<<14 | 0x52<<7 | 0x07, + 40330 - 19968: jis0212<<14 | 0x4B<<7 | 0x05, + 40333 - 19968: jis0212<<14 | 0x4B<<7 | 0x06, + 40334 - 19968: jis0212<<14 | 0x4B<<7 | 0x07, + 40335 - 19968: jis0208<<14 | 0x16<<7 | 0x3B, + 40338 - 19968: jis0212<<14 | 0x4B<<7 | 0x08, + 40339 - 19968: jis0212<<14 | 0x4B<<7 | 0x09, + 40341 - 19968: jis0212<<14 | 0x4B<<7 | 0x0A, + 40342 - 19968: jis0212<<14 | 0x4B<<7 | 0x0B, + 40343 - 19968: jis0212<<14 | 0x4B<<7 | 0x0C, + 40344 - 19968: jis0212<<14 | 0x4B<<7 | 0x0D, + 40346 - 19968: jis0208<<14 | 0x52<<7 | 0x0C, + 40353 - 19968: jis0212<<14 | 0x4B<<7 | 0x0E, + 40356 - 19968: jis0208<<14 | 0x52<<7 | 0x0D, + 40361 - 19968: jis0208<<14 | 0x52<<7 | 0x0E, + 40362 - 19968: jis0212<<14 | 0x4B<<7 | 0x0F, + 40363 - 19968: jis0208<<14 | 0x52<<7 | 0x09, + 40364 - 19968: jis0212<<14 | 0x4B<<7 | 0x10, + 40366 - 19968: jis0212<<14 | 0x4B<<7 | 0x11, + 40367 - 19968: jis0208<<14 | 0x51<<7 | 0x53, + 40369 - 19968: jis0212<<14 | 0x4B<<7 | 0x12, + 40370 - 19968: jis0208<<14 | 0x52<<7 | 0x0F, + 40372 - 19968: jis0208<<14 | 0x23<<7 | 0x40, + 40373 - 19968: jis0212<<14 | 0x4B<<7 | 0x13, + 40376 - 19968: jis0208<<14 | 0x52<<7 | 0x13, + 40377 - 19968: jis0212<<14 | 0x4B<<7 | 0x14, + 40378 - 19968: jis0208<<14 | 0x52<<7 | 0x14, + 40379 - 19968: jis0208<<14 | 0x52<<7 | 0x12, + 40380 - 19968: jis0212<<14 | 0x4B<<7 | 0x15, + 40383 - 19968: jis0212<<14 | 0x4B<<7 | 0x16, + 40385 - 19968: jis0208<<14 | 0x52<<7 | 0x11, + 40386 - 19968: jis0208<<14 | 0x52<<7 | 0x17, + 40387 - 19968: jis0212<<14 | 0x4B<<7 | 0x17, + 40388 - 19968: jis0208<<14 | 0x52<<7 | 0x10, + 40390 - 19968: jis0208<<14 | 0x52<<7 | 0x15, + 40391 - 19968: jis0212<<14 | 0x4B<<7 | 0x18, + 40393 - 19968: jis0212<<14 | 0x4B<<7 | 0x19, + 40394 - 19968: jis0212<<14 | 0x4B<<7 | 0x1A, + 40399 - 19968: jis0208<<14 | 0x52<<7 | 0x16, + 40403 - 19968: jis0208<<14 | 0x52<<7 | 0x19, + 40404 - 19968: jis0212<<14 | 0x4B<<7 | 0x1B, + 40405 - 19968: jis0212<<14 | 0x4B<<7 | 0x1C, + 40406 - 19968: jis0212<<14 | 0x4B<<7 | 0x1D, + 40407 - 19968: jis0212<<14 | 0x4B<<7 | 0x1E, + 40409 - 19968: jis0208<<14 | 0x52<<7 | 0x18, + 40410 - 19968: jis0212<<14 | 0x4B<<7 | 0x1F, + 40414 - 19968: jis0212<<14 | 0x4B<<7 | 0x20, + 40415 - 19968: jis0212<<14 | 0x4B<<7 | 0x21, + 40416 - 19968: jis0212<<14 | 0x4B<<7 | 0x22, + 40421 - 19968: jis0212<<14 | 0x4B<<7 | 0x23, + 40422 - 19968: jis0208<<14 | 0x52<<7 | 0x1B, + 40423 - 19968: jis0212<<14 | 0x4B<<7 | 0x24, + 40425 - 19968: jis0212<<14 | 0x4B<<7 | 0x25, + 40427 - 19968: jis0212<<14 | 0x4B<<7 | 0x26, + 40429 - 19968: jis0208<<14 | 0x52<<7 | 0x1C, + 40430 - 19968: jis0212<<14 | 0x4B<<7 | 0x27, + 40431 - 19968: jis0208<<14 | 0x52<<7 | 0x1D, + 40432 - 19968: jis0212<<14 | 0x4B<<7 | 0x28, + 40434 - 19968: jis0208<<14 | 0x2E<<7 | 0x28, + 40435 - 19968: jis0212<<14 | 0x4B<<7 | 0x29, + 40436 - 19968: jis0212<<14 | 0x4B<<7 | 0x2A, + 40440 - 19968: jis0208<<14 | 0x52<<7 | 0x1A, + 40441 - 19968: jis0208<<14 | 0x21<<7 | 0x4A, + 40442 - 19968: jis0208<<14 | 0x19<<7 | 0x4C, + 40445 - 19968: jis0208<<14 | 0x52<<7 | 0x1E, + 40446 - 19968: jis0212<<14 | 0x4B<<7 | 0x2B, + 40450 - 19968: jis0212<<14 | 0x4B<<7 | 0x2D, + 40455 - 19968: jis0212<<14 | 0x4B<<7 | 0x2E, + 40458 - 19968: jis0212<<14 | 0x4B<<7 | 0x2C, + 40462 - 19968: jis0212<<14 | 0x4B<<7 | 0x2F, + 40464 - 19968: jis0212<<14 | 0x4B<<7 | 0x30, + 40465 - 19968: jis0212<<14 | 0x4B<<7 | 0x31, + 40466 - 19968: jis0212<<14 | 0x4B<<7 | 0x32, + 40469 - 19968: jis0212<<14 | 0x4B<<7 | 0x33, + 40470 - 19968: jis0212<<14 | 0x4B<<7 | 0x34, + 40473 - 19968: jis0208<<14 | 0x5B<<7 | 0x4C, + 40474 - 19968: jis0208<<14 | 0x52<<7 | 0x1F, + 40475 - 19968: jis0208<<14 | 0x52<<7 | 0x20, + 40476 - 19968: jis0212<<14 | 0x4B<<7 | 0x36, + 40477 - 19968: jis0212<<14 | 0x4B<<7 | 0x37, + 40478 - 19968: jis0208<<14 | 0x52<<7 | 0x21, + 40565 - 19968: jis0208<<14 | 0x52<<7 | 0x22, + 40568 - 19968: jis0208<<14 | 0x17<<7 | 0x13, + 40569 - 19968: jis0208<<14 | 0x52<<7 | 0x23, + 40570 - 19968: jis0212<<14 | 0x4B<<7 | 0x38, + 40571 - 19968: jis0212<<14 | 0x4B<<7 | 0x39, + 40572 - 19968: jis0212<<14 | 0x4B<<7 | 0x3A, + 40573 - 19968: jis0208<<14 | 0x52<<7 | 0x24, + 40575 - 19968: jis0208<<14 | 0x1B<<7 | 0x0E, + 40576 - 19968: jis0212<<14 | 0x4B<<7 | 0x3B, + 40577 - 19968: jis0208<<14 | 0x52<<7 | 0x25, + 40578 - 19968: jis0212<<14 | 0x4B<<7 | 0x3C, + 40579 - 19968: jis0212<<14 | 0x4B<<7 | 0x3D, + 40580 - 19968: jis0212<<14 | 0x4B<<7 | 0x3E, + 40581 - 19968: jis0212<<14 | 0x4B<<7 | 0x3F, + 40583 - 19968: jis0212<<14 | 0x4B<<7 | 0x40, + 40584 - 19968: jis0208<<14 | 0x52<<7 | 0x26, + 40587 - 19968: jis0208<<14 | 0x52<<7 | 0x27, + 40588 - 19968: jis0208<<14 | 0x52<<7 | 0x28, + 40590 - 19968: jis0212<<14 | 0x4B<<7 | 0x41, + 40591 - 19968: jis0212<<14 | 0x4B<<7 | 0x42, + 40593 - 19968: jis0208<<14 | 0x52<<7 | 0x2B, + 40594 - 19968: jis0208<<14 | 0x52<<7 | 0x29, + 40595 - 19968: jis0208<<14 | 0x2E<<7 | 0x1B, + 40597 - 19968: jis0208<<14 | 0x52<<7 | 0x2A, + 40598 - 19968: jis0212<<14 | 0x4B<<7 | 0x43, + 40599 - 19968: jis0208<<14 | 0x2D<<7 | 0x4E, + 40600 - 19968: jis0212<<14 | 0x4B<<7 | 0x44, + 40603 - 19968: jis0212<<14 | 0x4B<<7 | 0x45, + 40605 - 19968: jis0208<<14 | 0x52<<7 | 0x2C, + 40606 - 19968: jis0212<<14 | 0x4B<<7 | 0x46, + 40607 - 19968: jis0208<<14 | 0x2D<<7 | 0x3A, + 40612 - 19968: jis0212<<14 | 0x4B<<7 | 0x47, + 40613 - 19968: jis0208<<14 | 0x52<<7 | 0x2D, + 40614 - 19968: jis0208<<14 | 0x26<<7 | 0x5D, + 40616 - 19968: jis0212<<14 | 0x4B<<7 | 0x48, + 40617 - 19968: jis0208<<14 | 0x52<<7 | 0x2E, + 40618 - 19968: jis0208<<14 | 0x52<<7 | 0x30, + 40620 - 19968: jis0212<<14 | 0x4B<<7 | 0x49, + 40621 - 19968: jis0208<<14 | 0x52<<7 | 0x31, + 40622 - 19968: jis0212<<14 | 0x4B<<7 | 0x4A, + 40623 - 19968: jis0212<<14 | 0x4B<<7 | 0x4B, + 40624 - 19968: jis0212<<14 | 0x4B<<7 | 0x4C, + 40627 - 19968: jis0212<<14 | 0x4B<<7 | 0x4D, + 40628 - 19968: jis0212<<14 | 0x4B<<7 | 0x4E, + 40629 - 19968: jis0212<<14 | 0x4B<<7 | 0x4F, + 40632 - 19968: jis0208<<14 | 0x52<<7 | 0x2F, + 40633 - 19968: jis0208<<14 | 0x18<<7 | 0x4C, + 40634 - 19968: jis0208<<14 | 0x2B<<7 | 0x2C, + 40635 - 19968: jis0208<<14 | 0x2A<<7 | 0x42, + 40636 - 19968: jis0208<<14 | 0x35<<7 | 0x56, + 40638 - 19968: jis0208<<14 | 0x3C<<7 | 0x3F, + 40639 - 19968: jis0208<<14 | 0x2A<<7 | 0x5A, + 40644 - 19968: jis0208<<14 | 0x11<<7 | 0x0A, + 40646 - 19968: jis0212<<14 | 0x4B<<7 | 0x50, + 40648 - 19968: jis0212<<14 | 0x4B<<7 | 0x51, + 40651 - 19968: jis0212<<14 | 0x4B<<7 | 0x52, + 40652 - 19968: jis0208<<14 | 0x52<<7 | 0x33, + 40653 - 19968: jis0208<<14 | 0x14<<7 | 0x2F, + 40654 - 19968: jis0208<<14 | 0x52<<7 | 0x34, + 40655 - 19968: jis0208<<14 | 0x52<<7 | 0x35, + 40656 - 19968: jis0208<<14 | 0x52<<7 | 0x36, + 40657 - 19968: jis0208<<14 | 0x5B<<7 | 0x4D, + 40658 - 19968: jis0208<<14 | 0x18<<7 | 0x54, + 40660 - 19968: jis0208<<14 | 0x52<<7 | 0x37, + 40661 - 19968: jis0212<<14 | 0x4B<<7 | 0x53, + 40664 - 19968: jis0208<<14 | 0x3F<<7 | 0x33, + 40665 - 19968: jis0208<<14 | 0x2B<<7 | 0x3A, + 40667 - 19968: jis0208<<14 | 0x21<<7 | 0x42, + 40668 - 19968: jis0208<<14 | 0x52<<7 | 0x38, + 40669 - 19968: jis0208<<14 | 0x52<<7 | 0x3A, + 40670 - 19968: jis0208<<14 | 0x52<<7 | 0x39, + 40671 - 19968: jis0212<<14 | 0x4B<<7 | 0x54, + 40672 - 19968: jis0208<<14 | 0x52<<7 | 0x3B, + 40676 - 19968: jis0212<<14 | 0x4B<<7 | 0x55, + 40677 - 19968: jis0208<<14 | 0x52<<7 | 0x3C, + 40679 - 19968: jis0212<<14 | 0x4B<<7 | 0x56, + 40680 - 19968: jis0208<<14 | 0x52<<7 | 0x3D, + 40684 - 19968: jis0212<<14 | 0x4B<<7 | 0x57, + 40685 - 19968: jis0212<<14 | 0x4B<<7 | 0x58, + 40686 - 19968: jis0212<<14 | 0x4B<<7 | 0x59, + 40687 - 19968: jis0208<<14 | 0x52<<7 | 0x3E, + 40688 - 19968: jis0212<<14 | 0x4B<<7 | 0x5A, + 40689 - 19968: jis0212<<14 | 0x4B<<7 | 0x5B, + 40690 - 19968: jis0212<<14 | 0x4B<<7 | 0x5C, + 40692 - 19968: jis0208<<14 | 0x52<<7 | 0x3F, + 40693 - 19968: jis0212<<14 | 0x4B<<7 | 0x5D, + 40694 - 19968: jis0208<<14 | 0x52<<7 | 0x40, + 40695 - 19968: jis0208<<14 | 0x52<<7 | 0x41, + 40696 - 19968: jis0212<<14 | 0x4C<<7 | 0x00, + 40697 - 19968: jis0208<<14 | 0x52<<7 | 0x42, + 40699 - 19968: jis0208<<14 | 0x52<<7 | 0x43, + 40700 - 19968: jis0208<<14 | 0x52<<7 | 0x44, + 40701 - 19968: jis0208<<14 | 0x52<<7 | 0x45, + 40703 - 19968: jis0212<<14 | 0x4C<<7 | 0x01, + 40706 - 19968: jis0212<<14 | 0x4C<<7 | 0x02, + 40707 - 19968: jis0212<<14 | 0x4C<<7 | 0x03, + 40711 - 19968: jis0208<<14 | 0x52<<7 | 0x46, + 40712 - 19968: jis0208<<14 | 0x52<<7 | 0x47, + 40713 - 19968: jis0212<<14 | 0x4C<<7 | 0x04, + 40718 - 19968: jis0208<<14 | 0x24<<7 | 0x03, + 40719 - 19968: jis0212<<14 | 0x4C<<7 | 0x05, + 40720 - 19968: jis0212<<14 | 0x4C<<7 | 0x06, + 40721 - 19968: jis0212<<14 | 0x4C<<7 | 0x07, + 40722 - 19968: jis0212<<14 | 0x4C<<7 | 0x08, + 40723 - 19968: jis0208<<14 | 0x17<<7 | 0x3C, + 40724 - 19968: jis0212<<14 | 0x4C<<7 | 0x09, + 40725 - 19968: jis0208<<14 | 0x52<<7 | 0x49, + 40726 - 19968: jis0212<<14 | 0x4C<<7 | 0x0A, + 40727 - 19968: jis0212<<14 | 0x4C<<7 | 0x0B, + 40729 - 19968: jis0212<<14 | 0x4C<<7 | 0x0C, + 40730 - 19968: jis0212<<14 | 0x4C<<7 | 0x0D, + 40731 - 19968: jis0212<<14 | 0x4C<<7 | 0x0E, + 40735 - 19968: jis0212<<14 | 0x4C<<7 | 0x0F, + 40736 - 19968: jis0208<<14 | 0x20<<7 | 0x2C, + 40737 - 19968: jis0208<<14 | 0x52<<7 | 0x4A, + 40738 - 19968: jis0212<<14 | 0x4C<<7 | 0x10, + 40742 - 19968: jis0212<<14 | 0x4C<<7 | 0x11, + 40746 - 19968: jis0212<<14 | 0x4C<<7 | 0x12, + 40747 - 19968: jis0212<<14 | 0x4C<<7 | 0x13, + 40748 - 19968: jis0208<<14 | 0x52<<7 | 0x4B, + 40751 - 19968: jis0212<<14 | 0x4C<<7 | 0x14, + 40753 - 19968: jis0212<<14 | 0x4C<<7 | 0x15, + 40754 - 19968: jis0212<<14 | 0x4C<<7 | 0x16, + 40756 - 19968: jis0212<<14 | 0x4C<<7 | 0x17, + 40759 - 19968: jis0212<<14 | 0x4C<<7 | 0x18, + 40761 - 19968: jis0212<<14 | 0x4C<<7 | 0x19, + 40762 - 19968: jis0212<<14 | 0x4C<<7 | 0x1A, + 40763 - 19968: jis0208<<14 | 0x28<<7 | 0x00, + 40764 - 19968: jis0212<<14 | 0x4C<<7 | 0x1B, + 40765 - 19968: jis0212<<14 | 0x4C<<7 | 0x1C, + 40766 - 19968: jis0208<<14 | 0x52<<7 | 0x4C, + 40767 - 19968: jis0212<<14 | 0x4C<<7 | 0x1D, + 40769 - 19968: jis0212<<14 | 0x4C<<7 | 0x1E, + 40771 - 19968: jis0212<<14 | 0x4C<<7 | 0x1F, + 40772 - 19968: jis0212<<14 | 0x4C<<7 | 0x20, + 40773 - 19968: jis0212<<14 | 0x4C<<7 | 0x21, + 40774 - 19968: jis0212<<14 | 0x4C<<7 | 0x22, + 40775 - 19968: jis0212<<14 | 0x4C<<7 | 0x23, + 40778 - 19968: jis0208<<14 | 0x52<<7 | 0x4D, + 40779 - 19968: jis0208<<14 | 0x42<<7 | 0x16, + 40782 - 19968: jis0208<<14 | 0x4B<<7 | 0x39, + 40783 - 19968: jis0208<<14 | 0x4F<<7 | 0x4C, + 40786 - 19968: jis0208<<14 | 0x52<<7 | 0x4E, + 40787 - 19968: jis0212<<14 | 0x4C<<7 | 0x24, + 40788 - 19968: jis0208<<14 | 0x52<<7 | 0x4F, + 40789 - 19968: jis0212<<14 | 0x4C<<7 | 0x25, + 40790 - 19968: jis0212<<14 | 0x4C<<7 | 0x26, + 40791 - 19968: jis0212<<14 | 0x4C<<7 | 0x27, + 40792 - 19968: jis0212<<14 | 0x4C<<7 | 0x28, + 40794 - 19968: jis0212<<14 | 0x4C<<7 | 0x29, + 40797 - 19968: jis0212<<14 | 0x4C<<7 | 0x2A, + 40798 - 19968: jis0212<<14 | 0x4C<<7 | 0x2B, + 40799 - 19968: jis0208<<14 | 0x52<<7 | 0x51, + 40800 - 19968: jis0208<<14 | 0x52<<7 | 0x52, + 40801 - 19968: jis0208<<14 | 0x52<<7 | 0x53, + 40802 - 19968: jis0208<<14 | 0x2D<<7 | 0x4F, + 40803 - 19968: jis0208<<14 | 0x52<<7 | 0x50, + 40806 - 19968: jis0208<<14 | 0x52<<7 | 0x54, + 40807 - 19968: jis0208<<14 | 0x52<<7 | 0x55, + 40808 - 19968: jis0212<<14 | 0x4C<<7 | 0x2C, + 40809 - 19968: jis0212<<14 | 0x4C<<7 | 0x2D, + 40810 - 19968: jis0208<<14 | 0x52<<7 | 0x57, + 40812 - 19968: jis0208<<14 | 0x52<<7 | 0x56, + 40813 - 19968: jis0212<<14 | 0x4C<<7 | 0x2E, + 40814 - 19968: jis0212<<14 | 0x4C<<7 | 0x2F, + 40815 - 19968: jis0212<<14 | 0x4C<<7 | 0x30, + 40816 - 19968: jis0212<<14 | 0x4C<<7 | 0x31, + 40817 - 19968: jis0212<<14 | 0x4C<<7 | 0x32, + 40818 - 19968: jis0208<<14 | 0x52<<7 | 0x59, + 40819 - 19968: jis0212<<14 | 0x4C<<7 | 0x33, + 40821 - 19968: jis0212<<14 | 0x4C<<7 | 0x34, + 40822 - 19968: jis0208<<14 | 0x52<<7 | 0x5A, + 40823 - 19968: jis0208<<14 | 0x52<<7 | 0x58, + 40826 - 19968: jis0212<<14 | 0x4C<<7 | 0x35, + 40829 - 19968: jis0212<<14 | 0x4C<<7 | 0x36, + 40845 - 19968: jis0208<<14 | 0x2D<<7 | 0x15, + 40847 - 19968: jis0212<<14 | 0x4C<<7 | 0x37, + 40848 - 19968: jis0212<<14 | 0x4C<<7 | 0x38, + 40849 - 19968: jis0212<<14 | 0x4C<<7 | 0x39, + 40850 - 19968: jis0212<<14 | 0x4C<<7 | 0x3A, + 40852 - 19968: jis0212<<14 | 0x4C<<7 | 0x3B, + 40853 - 19968: jis0208<<14 | 0x52<<7 | 0x5B, + 40854 - 19968: jis0212<<14 | 0x4C<<7 | 0x3C, + 40855 - 19968: jis0212<<14 | 0x4C<<7 | 0x3D, + 40860 - 19968: jis0208<<14 | 0x52<<7 | 0x5C, + 40861 - 19968: jis0208<<14 | 0x42<<7 | 0x33, + 40862 - 19968: jis0212<<14 | 0x4C<<7 | 0x3E, + 40864 - 19968: jis0208<<14 | 0x52<<7 | 0x5D, + 40865 - 19968: jis0212<<14 | 0x4C<<7 | 0x3F, + 40866 - 19968: jis0212<<14 | 0x4C<<7 | 0x40, + 40867 - 19968: jis0212<<14 | 0x4C<<7 | 0x41, + 40869 - 19968: jis0212<<14 | 0x4C<<7 | 0x42, +} + +const encode1Low, encode1High = 8208, 9840 + +var encode1 = [...]uint16{ + 8208 - 8208: jis0208<<14 | 0x00<<7 | 0x1D, + 8213 - 8208: jis0208<<14 | 0x00<<7 | 0x1C, + 8216 - 8208: jis0208<<14 | 0x00<<7 | 0x25, + 8217 - 8208: jis0208<<14 | 0x00<<7 | 0x26, + 8220 - 8208: jis0208<<14 | 0x00<<7 | 0x27, + 8221 - 8208: jis0208<<14 | 0x00<<7 | 0x28, + 8224 - 8208: jis0208<<14 | 0x01<<7 | 0x56, + 8225 - 8208: jis0208<<14 | 0x01<<7 | 0x57, + 8229 - 8208: jis0208<<14 | 0x00<<7 | 0x24, + 8230 - 8208: jis0208<<14 | 0x00<<7 | 0x23, + 8240 - 8208: jis0208<<14 | 0x01<<7 | 0x52, + 8242 - 8208: jis0208<<14 | 0x00<<7 | 0x4B, + 8243 - 8208: jis0208<<14 | 0x00<<7 | 0x4C, + 8251 - 8208: jis0208<<14 | 0x01<<7 | 0x07, + 8451 - 8208: jis0208<<14 | 0x00<<7 | 0x4D, + 8470 - 8208: jis0208<<14 | 0x0C<<7 | 0x41, + 8481 - 8208: jis0208<<14 | 0x0C<<7 | 0x43, + 8482 - 8208: jis0212<<14 | 0x01<<7 | 0x4E, + 8491 - 8208: jis0208<<14 | 0x01<<7 | 0x51, + 8544 - 8208: jis0208<<14 | 0x0C<<7 | 0x14, + 8545 - 8208: jis0208<<14 | 0x0C<<7 | 0x15, + 8546 - 8208: jis0208<<14 | 0x0C<<7 | 0x16, + 8547 - 8208: jis0208<<14 | 0x0C<<7 | 0x17, + 8548 - 8208: jis0208<<14 | 0x0C<<7 | 0x18, + 8549 - 8208: jis0208<<14 | 0x0C<<7 | 0x19, + 8550 - 8208: jis0208<<14 | 0x0C<<7 | 0x1A, + 8551 - 8208: jis0208<<14 | 0x0C<<7 | 0x1B, + 8552 - 8208: jis0208<<14 | 0x0C<<7 | 0x1C, + 8553 - 8208: jis0208<<14 | 0x0C<<7 | 0x1D, + 8560 - 8208: jis0208<<14 | 0x5B<<7 | 0x50, + 8561 - 8208: jis0208<<14 | 0x5B<<7 | 0x51, + 8562 - 8208: jis0208<<14 | 0x5B<<7 | 0x52, + 8563 - 8208: jis0208<<14 | 0x5B<<7 | 0x53, + 8564 - 8208: jis0208<<14 | 0x5B<<7 | 0x54, + 8565 - 8208: jis0208<<14 | 0x5B<<7 | 0x55, + 8566 - 8208: jis0208<<14 | 0x5B<<7 | 0x56, + 8567 - 8208: jis0208<<14 | 0x5B<<7 | 0x57, + 8568 - 8208: jis0208<<14 | 0x5B<<7 | 0x58, + 8569 - 8208: jis0208<<14 | 0x5B<<7 | 0x59, + 8592 - 8208: jis0208<<14 | 0x01<<7 | 0x0A, + 8593 - 8208: jis0208<<14 | 0x01<<7 | 0x0B, + 8594 - 8208: jis0208<<14 | 0x01<<7 | 0x09, + 8595 - 8208: jis0208<<14 | 0x01<<7 | 0x0C, + 8658 - 8208: jis0208<<14 | 0x01<<7 | 0x2C, + 8660 - 8208: jis0208<<14 | 0x01<<7 | 0x2D, + 8704 - 8208: jis0208<<14 | 0x01<<7 | 0x2E, + 8706 - 8208: jis0208<<14 | 0x01<<7 | 0x3E, + 8707 - 8208: jis0208<<14 | 0x01<<7 | 0x2F, + 8711 - 8208: jis0208<<14 | 0x01<<7 | 0x3F, + 8712 - 8208: jis0208<<14 | 0x01<<7 | 0x19, + 8715 - 8208: jis0208<<14 | 0x01<<7 | 0x1A, + 8721 - 8208: jis0208<<14 | 0x0C<<7 | 0x53, + 8730 - 8208: jis0208<<14 | 0x01<<7 | 0x44, + 8733 - 8208: jis0208<<14 | 0x01<<7 | 0x46, + 8734 - 8208: jis0208<<14 | 0x00<<7 | 0x46, + 8735 - 8208: jis0208<<14 | 0x0C<<7 | 0x57, + 8736 - 8208: jis0208<<14 | 0x01<<7 | 0x3B, + 8741 - 8208: jis0208<<14 | 0x00<<7 | 0x21, + 8743 - 8208: jis0208<<14 | 0x01<<7 | 0x29, + 8744 - 8208: jis0208<<14 | 0x01<<7 | 0x2A, + 8745 - 8208: jis0208<<14 | 0x01<<7 | 0x20, + 8746 - 8208: jis0208<<14 | 0x01<<7 | 0x1F, + 8747 - 8208: jis0208<<14 | 0x01<<7 | 0x48, + 8748 - 8208: jis0208<<14 | 0x01<<7 | 0x49, + 8750 - 8208: jis0208<<14 | 0x0C<<7 | 0x52, + 8756 - 8208: jis0208<<14 | 0x00<<7 | 0x47, + 8757 - 8208: jis0208<<14 | 0x01<<7 | 0x47, + 8765 - 8208: jis0208<<14 | 0x01<<7 | 0x45, + 8786 - 8208: jis0208<<14 | 0x01<<7 | 0x41, + 8800 - 8208: jis0208<<14 | 0x00<<7 | 0x41, + 8801 - 8208: jis0208<<14 | 0x01<<7 | 0x40, + 8806 - 8208: jis0208<<14 | 0x00<<7 | 0x44, + 8807 - 8208: jis0208<<14 | 0x00<<7 | 0x45, + 8810 - 8208: jis0208<<14 | 0x01<<7 | 0x42, + 8811 - 8208: jis0208<<14 | 0x01<<7 | 0x43, + 8834 - 8208: jis0208<<14 | 0x01<<7 | 0x1D, + 8835 - 8208: jis0208<<14 | 0x01<<7 | 0x1E, + 8838 - 8208: jis0208<<14 | 0x01<<7 | 0x1B, + 8839 - 8208: jis0208<<14 | 0x01<<7 | 0x1C, + 8869 - 8208: jis0208<<14 | 0x01<<7 | 0x3C, + 8895 - 8208: jis0208<<14 | 0x0C<<7 | 0x58, + 8978 - 8208: jis0208<<14 | 0x01<<7 | 0x3D, + 9312 - 8208: jis0208<<14 | 0x0C<<7 | 0x00, + 9313 - 8208: jis0208<<14 | 0x0C<<7 | 0x01, + 9314 - 8208: jis0208<<14 | 0x0C<<7 | 0x02, + 9315 - 8208: jis0208<<14 | 0x0C<<7 | 0x03, + 9316 - 8208: jis0208<<14 | 0x0C<<7 | 0x04, + 9317 - 8208: jis0208<<14 | 0x0C<<7 | 0x05, + 9318 - 8208: jis0208<<14 | 0x0C<<7 | 0x06, + 9319 - 8208: jis0208<<14 | 0x0C<<7 | 0x07, + 9320 - 8208: jis0208<<14 | 0x0C<<7 | 0x08, + 9321 - 8208: jis0208<<14 | 0x0C<<7 | 0x09, + 9322 - 8208: jis0208<<14 | 0x0C<<7 | 0x0A, + 9323 - 8208: jis0208<<14 | 0x0C<<7 | 0x0B, + 9324 - 8208: jis0208<<14 | 0x0C<<7 | 0x0C, + 9325 - 8208: jis0208<<14 | 0x0C<<7 | 0x0D, + 9326 - 8208: jis0208<<14 | 0x0C<<7 | 0x0E, + 9327 - 8208: jis0208<<14 | 0x0C<<7 | 0x0F, + 9328 - 8208: jis0208<<14 | 0x0C<<7 | 0x10, + 9329 - 8208: jis0208<<14 | 0x0C<<7 | 0x11, + 9330 - 8208: jis0208<<14 | 0x0C<<7 | 0x12, + 9331 - 8208: jis0208<<14 | 0x0C<<7 | 0x13, + 9472 - 8208: jis0208<<14 | 0x07<<7 | 0x00, + 9473 - 8208: jis0208<<14 | 0x07<<7 | 0x0B, + 9474 - 8208: jis0208<<14 | 0x07<<7 | 0x01, + 9475 - 8208: jis0208<<14 | 0x07<<7 | 0x0C, + 9484 - 8208: jis0208<<14 | 0x07<<7 | 0x02, + 9487 - 8208: jis0208<<14 | 0x07<<7 | 0x0D, + 9488 - 8208: jis0208<<14 | 0x07<<7 | 0x03, + 9491 - 8208: jis0208<<14 | 0x07<<7 | 0x0E, + 9492 - 8208: jis0208<<14 | 0x07<<7 | 0x05, + 9495 - 8208: jis0208<<14 | 0x07<<7 | 0x10, + 9496 - 8208: jis0208<<14 | 0x07<<7 | 0x04, + 9499 - 8208: jis0208<<14 | 0x07<<7 | 0x0F, + 9500 - 8208: jis0208<<14 | 0x07<<7 | 0x06, + 9501 - 8208: jis0208<<14 | 0x07<<7 | 0x1B, + 9504 - 8208: jis0208<<14 | 0x07<<7 | 0x16, + 9507 - 8208: jis0208<<14 | 0x07<<7 | 0x11, + 9508 - 8208: jis0208<<14 | 0x07<<7 | 0x08, + 9509 - 8208: jis0208<<14 | 0x07<<7 | 0x1D, + 9512 - 8208: jis0208<<14 | 0x07<<7 | 0x18, + 9515 - 8208: jis0208<<14 | 0x07<<7 | 0x13, + 9516 - 8208: jis0208<<14 | 0x07<<7 | 0x07, + 9519 - 8208: jis0208<<14 | 0x07<<7 | 0x17, + 9520 - 8208: jis0208<<14 | 0x07<<7 | 0x1C, + 9523 - 8208: jis0208<<14 | 0x07<<7 | 0x12, + 9524 - 8208: jis0208<<14 | 0x07<<7 | 0x09, + 9527 - 8208: jis0208<<14 | 0x07<<7 | 0x19, + 9528 - 8208: jis0208<<14 | 0x07<<7 | 0x1E, + 9531 - 8208: jis0208<<14 | 0x07<<7 | 0x14, + 9532 - 8208: jis0208<<14 | 0x07<<7 | 0x0A, + 9535 - 8208: jis0208<<14 | 0x07<<7 | 0x1A, + 9538 - 8208: jis0208<<14 | 0x07<<7 | 0x1F, + 9547 - 8208: jis0208<<14 | 0x07<<7 | 0x15, + 9632 - 8208: jis0208<<14 | 0x01<<7 | 0x02, + 9633 - 8208: jis0208<<14 | 0x01<<7 | 0x01, + 9650 - 8208: jis0208<<14 | 0x01<<7 | 0x04, + 9651 - 8208: jis0208<<14 | 0x01<<7 | 0x03, + 9660 - 8208: jis0208<<14 | 0x01<<7 | 0x06, + 9661 - 8208: jis0208<<14 | 0x01<<7 | 0x05, + 9670 - 8208: jis0208<<14 | 0x01<<7 | 0x00, + 9671 - 8208: jis0208<<14 | 0x00<<7 | 0x5D, + 9675 - 8208: jis0208<<14 | 0x00<<7 | 0x5A, + 9678 - 8208: jis0208<<14 | 0x00<<7 | 0x5C, + 9679 - 8208: jis0208<<14 | 0x00<<7 | 0x5B, + 9711 - 8208: jis0208<<14 | 0x01<<7 | 0x5D, + 9733 - 8208: jis0208<<14 | 0x00<<7 | 0x59, + 9734 - 8208: jis0208<<14 | 0x00<<7 | 0x58, + 9792 - 8208: jis0208<<14 | 0x00<<7 | 0x49, + 9794 - 8208: jis0208<<14 | 0x00<<7 | 0x48, + 9834 - 8208: jis0208<<14 | 0x01<<7 | 0x55, + 9837 - 8208: jis0208<<14 | 0x01<<7 | 0x54, + 9839 - 8208: jis0208<<14 | 0x01<<7 | 0x53, +} + +const encode2Low, encode2High = 12288, 13262 + +var encode2 = [...]uint16{ + 12288 - 12288: jis0208<<14 | 0x00<<7 | 0x00, + 12289 - 12288: jis0208<<14 | 0x00<<7 | 0x01, + 12290 - 12288: jis0208<<14 | 0x00<<7 | 0x02, + 12291 - 12288: jis0208<<14 | 0x00<<7 | 0x16, + 12293 - 12288: jis0208<<14 | 0x00<<7 | 0x18, + 12294 - 12288: jis0208<<14 | 0x00<<7 | 0x19, + 12295 - 12288: jis0208<<14 | 0x00<<7 | 0x1A, + 12296 - 12288: jis0208<<14 | 0x00<<7 | 0x31, + 12297 - 12288: jis0208<<14 | 0x00<<7 | 0x32, + 12298 - 12288: jis0208<<14 | 0x00<<7 | 0x33, + 12299 - 12288: jis0208<<14 | 0x00<<7 | 0x34, + 12300 - 12288: jis0208<<14 | 0x00<<7 | 0x35, + 12301 - 12288: jis0208<<14 | 0x00<<7 | 0x36, + 12302 - 12288: jis0208<<14 | 0x00<<7 | 0x37, + 12303 - 12288: jis0208<<14 | 0x00<<7 | 0x38, + 12304 - 12288: jis0208<<14 | 0x00<<7 | 0x39, + 12305 - 12288: jis0208<<14 | 0x00<<7 | 0x3A, + 12306 - 12288: jis0208<<14 | 0x01<<7 | 0x08, + 12307 - 12288: jis0208<<14 | 0x01<<7 | 0x0D, + 12308 - 12288: jis0208<<14 | 0x00<<7 | 0x2B, + 12309 - 12288: jis0208<<14 | 0x00<<7 | 0x2C, + 12317 - 12288: jis0208<<14 | 0x0C<<7 | 0x3F, + 12319 - 12288: jis0208<<14 | 0x0C<<7 | 0x40, + 12353 - 12288: jis0208<<14 | 0x03<<7 | 0x00, + 12354 - 12288: jis0208<<14 | 0x03<<7 | 0x01, + 12355 - 12288: jis0208<<14 | 0x03<<7 | 0x02, + 12356 - 12288: jis0208<<14 | 0x03<<7 | 0x03, + 12357 - 12288: jis0208<<14 | 0x03<<7 | 0x04, + 12358 - 12288: jis0208<<14 | 0x03<<7 | 0x05, + 12359 - 12288: jis0208<<14 | 0x03<<7 | 0x06, + 12360 - 12288: jis0208<<14 | 0x03<<7 | 0x07, + 12361 - 12288: jis0208<<14 | 0x03<<7 | 0x08, + 12362 - 12288: jis0208<<14 | 0x03<<7 | 0x09, + 12363 - 12288: jis0208<<14 | 0x03<<7 | 0x0A, + 12364 - 12288: jis0208<<14 | 0x03<<7 | 0x0B, + 12365 - 12288: jis0208<<14 | 0x03<<7 | 0x0C, + 12366 - 12288: jis0208<<14 | 0x03<<7 | 0x0D, + 12367 - 12288: jis0208<<14 | 0x03<<7 | 0x0E, + 12368 - 12288: jis0208<<14 | 0x03<<7 | 0x0F, + 12369 - 12288: jis0208<<14 | 0x03<<7 | 0x10, + 12370 - 12288: jis0208<<14 | 0x03<<7 | 0x11, + 12371 - 12288: jis0208<<14 | 0x03<<7 | 0x12, + 12372 - 12288: jis0208<<14 | 0x03<<7 | 0x13, + 12373 - 12288: jis0208<<14 | 0x03<<7 | 0x14, + 12374 - 12288: jis0208<<14 | 0x03<<7 | 0x15, + 12375 - 12288: jis0208<<14 | 0x03<<7 | 0x16, + 12376 - 12288: jis0208<<14 | 0x03<<7 | 0x17, + 12377 - 12288: jis0208<<14 | 0x03<<7 | 0x18, + 12378 - 12288: jis0208<<14 | 0x03<<7 | 0x19, + 12379 - 12288: jis0208<<14 | 0x03<<7 | 0x1A, + 12380 - 12288: jis0208<<14 | 0x03<<7 | 0x1B, + 12381 - 12288: jis0208<<14 | 0x03<<7 | 0x1C, + 12382 - 12288: jis0208<<14 | 0x03<<7 | 0x1D, + 12383 - 12288: jis0208<<14 | 0x03<<7 | 0x1E, + 12384 - 12288: jis0208<<14 | 0x03<<7 | 0x1F, + 12385 - 12288: jis0208<<14 | 0x03<<7 | 0x20, + 12386 - 12288: jis0208<<14 | 0x03<<7 | 0x21, + 12387 - 12288: jis0208<<14 | 0x03<<7 | 0x22, + 12388 - 12288: jis0208<<14 | 0x03<<7 | 0x23, + 12389 - 12288: jis0208<<14 | 0x03<<7 | 0x24, + 12390 - 12288: jis0208<<14 | 0x03<<7 | 0x25, + 12391 - 12288: jis0208<<14 | 0x03<<7 | 0x26, + 12392 - 12288: jis0208<<14 | 0x03<<7 | 0x27, + 12393 - 12288: jis0208<<14 | 0x03<<7 | 0x28, + 12394 - 12288: jis0208<<14 | 0x03<<7 | 0x29, + 12395 - 12288: jis0208<<14 | 0x03<<7 | 0x2A, + 12396 - 12288: jis0208<<14 | 0x03<<7 | 0x2B, + 12397 - 12288: jis0208<<14 | 0x03<<7 | 0x2C, + 12398 - 12288: jis0208<<14 | 0x03<<7 | 0x2D, + 12399 - 12288: jis0208<<14 | 0x03<<7 | 0x2E, + 12400 - 12288: jis0208<<14 | 0x03<<7 | 0x2F, + 12401 - 12288: jis0208<<14 | 0x03<<7 | 0x30, + 12402 - 12288: jis0208<<14 | 0x03<<7 | 0x31, + 12403 - 12288: jis0208<<14 | 0x03<<7 | 0x32, + 12404 - 12288: jis0208<<14 | 0x03<<7 | 0x33, + 12405 - 12288: jis0208<<14 | 0x03<<7 | 0x34, + 12406 - 12288: jis0208<<14 | 0x03<<7 | 0x35, + 12407 - 12288: jis0208<<14 | 0x03<<7 | 0x36, + 12408 - 12288: jis0208<<14 | 0x03<<7 | 0x37, + 12409 - 12288: jis0208<<14 | 0x03<<7 | 0x38, + 12410 - 12288: jis0208<<14 | 0x03<<7 | 0x39, + 12411 - 12288: jis0208<<14 | 0x03<<7 | 0x3A, + 12412 - 12288: jis0208<<14 | 0x03<<7 | 0x3B, + 12413 - 12288: jis0208<<14 | 0x03<<7 | 0x3C, + 12414 - 12288: jis0208<<14 | 0x03<<7 | 0x3D, + 12415 - 12288: jis0208<<14 | 0x03<<7 | 0x3E, + 12416 - 12288: jis0208<<14 | 0x03<<7 | 0x3F, + 12417 - 12288: jis0208<<14 | 0x03<<7 | 0x40, + 12418 - 12288: jis0208<<14 | 0x03<<7 | 0x41, + 12419 - 12288: jis0208<<14 | 0x03<<7 | 0x42, + 12420 - 12288: jis0208<<14 | 0x03<<7 | 0x43, + 12421 - 12288: jis0208<<14 | 0x03<<7 | 0x44, + 12422 - 12288: jis0208<<14 | 0x03<<7 | 0x45, + 12423 - 12288: jis0208<<14 | 0x03<<7 | 0x46, + 12424 - 12288: jis0208<<14 | 0x03<<7 | 0x47, + 12425 - 12288: jis0208<<14 | 0x03<<7 | 0x48, + 12426 - 12288: jis0208<<14 | 0x03<<7 | 0x49, + 12427 - 12288: jis0208<<14 | 0x03<<7 | 0x4A, + 12428 - 12288: jis0208<<14 | 0x03<<7 | 0x4B, + 12429 - 12288: jis0208<<14 | 0x03<<7 | 0x4C, + 12430 - 12288: jis0208<<14 | 0x03<<7 | 0x4D, + 12431 - 12288: jis0208<<14 | 0x03<<7 | 0x4E, + 12432 - 12288: jis0208<<14 | 0x03<<7 | 0x4F, + 12433 - 12288: jis0208<<14 | 0x03<<7 | 0x50, + 12434 - 12288: jis0208<<14 | 0x03<<7 | 0x51, + 12435 - 12288: jis0208<<14 | 0x03<<7 | 0x52, + 12443 - 12288: jis0208<<14 | 0x00<<7 | 0x0A, + 12444 - 12288: jis0208<<14 | 0x00<<7 | 0x0B, + 12445 - 12288: jis0208<<14 | 0x00<<7 | 0x14, + 12446 - 12288: jis0208<<14 | 0x00<<7 | 0x15, + 12449 - 12288: jis0208<<14 | 0x04<<7 | 0x00, + 12450 - 12288: jis0208<<14 | 0x04<<7 | 0x01, + 12451 - 12288: jis0208<<14 | 0x04<<7 | 0x02, + 12452 - 12288: jis0208<<14 | 0x04<<7 | 0x03, + 12453 - 12288: jis0208<<14 | 0x04<<7 | 0x04, + 12454 - 12288: jis0208<<14 | 0x04<<7 | 0x05, + 12455 - 12288: jis0208<<14 | 0x04<<7 | 0x06, + 12456 - 12288: jis0208<<14 | 0x04<<7 | 0x07, + 12457 - 12288: jis0208<<14 | 0x04<<7 | 0x08, + 12458 - 12288: jis0208<<14 | 0x04<<7 | 0x09, + 12459 - 12288: jis0208<<14 | 0x04<<7 | 0x0A, + 12460 - 12288: jis0208<<14 | 0x04<<7 | 0x0B, + 12461 - 12288: jis0208<<14 | 0x04<<7 | 0x0C, + 12462 - 12288: jis0208<<14 | 0x04<<7 | 0x0D, + 12463 - 12288: jis0208<<14 | 0x04<<7 | 0x0E, + 12464 - 12288: jis0208<<14 | 0x04<<7 | 0x0F, + 12465 - 12288: jis0208<<14 | 0x04<<7 | 0x10, + 12466 - 12288: jis0208<<14 | 0x04<<7 | 0x11, + 12467 - 12288: jis0208<<14 | 0x04<<7 | 0x12, + 12468 - 12288: jis0208<<14 | 0x04<<7 | 0x13, + 12469 - 12288: jis0208<<14 | 0x04<<7 | 0x14, + 12470 - 12288: jis0208<<14 | 0x04<<7 | 0x15, + 12471 - 12288: jis0208<<14 | 0x04<<7 | 0x16, + 12472 - 12288: jis0208<<14 | 0x04<<7 | 0x17, + 12473 - 12288: jis0208<<14 | 0x04<<7 | 0x18, + 12474 - 12288: jis0208<<14 | 0x04<<7 | 0x19, + 12475 - 12288: jis0208<<14 | 0x04<<7 | 0x1A, + 12476 - 12288: jis0208<<14 | 0x04<<7 | 0x1B, + 12477 - 12288: jis0208<<14 | 0x04<<7 | 0x1C, + 12478 - 12288: jis0208<<14 | 0x04<<7 | 0x1D, + 12479 - 12288: jis0208<<14 | 0x04<<7 | 0x1E, + 12480 - 12288: jis0208<<14 | 0x04<<7 | 0x1F, + 12481 - 12288: jis0208<<14 | 0x04<<7 | 0x20, + 12482 - 12288: jis0208<<14 | 0x04<<7 | 0x21, + 12483 - 12288: jis0208<<14 | 0x04<<7 | 0x22, + 12484 - 12288: jis0208<<14 | 0x04<<7 | 0x23, + 12485 - 12288: jis0208<<14 | 0x04<<7 | 0x24, + 12486 - 12288: jis0208<<14 | 0x04<<7 | 0x25, + 12487 - 12288: jis0208<<14 | 0x04<<7 | 0x26, + 12488 - 12288: jis0208<<14 | 0x04<<7 | 0x27, + 12489 - 12288: jis0208<<14 | 0x04<<7 | 0x28, + 12490 - 12288: jis0208<<14 | 0x04<<7 | 0x29, + 12491 - 12288: jis0208<<14 | 0x04<<7 | 0x2A, + 12492 - 12288: jis0208<<14 | 0x04<<7 | 0x2B, + 12493 - 12288: jis0208<<14 | 0x04<<7 | 0x2C, + 12494 - 12288: jis0208<<14 | 0x04<<7 | 0x2D, + 12495 - 12288: jis0208<<14 | 0x04<<7 | 0x2E, + 12496 - 12288: jis0208<<14 | 0x04<<7 | 0x2F, + 12497 - 12288: jis0208<<14 | 0x04<<7 | 0x30, + 12498 - 12288: jis0208<<14 | 0x04<<7 | 0x31, + 12499 - 12288: jis0208<<14 | 0x04<<7 | 0x32, + 12500 - 12288: jis0208<<14 | 0x04<<7 | 0x33, + 12501 - 12288: jis0208<<14 | 0x04<<7 | 0x34, + 12502 - 12288: jis0208<<14 | 0x04<<7 | 0x35, + 12503 - 12288: jis0208<<14 | 0x04<<7 | 0x36, + 12504 - 12288: jis0208<<14 | 0x04<<7 | 0x37, + 12505 - 12288: jis0208<<14 | 0x04<<7 | 0x38, + 12506 - 12288: jis0208<<14 | 0x04<<7 | 0x39, + 12507 - 12288: jis0208<<14 | 0x04<<7 | 0x3A, + 12508 - 12288: jis0208<<14 | 0x04<<7 | 0x3B, + 12509 - 12288: jis0208<<14 | 0x04<<7 | 0x3C, + 12510 - 12288: jis0208<<14 | 0x04<<7 | 0x3D, + 12511 - 12288: jis0208<<14 | 0x04<<7 | 0x3E, + 12512 - 12288: jis0208<<14 | 0x04<<7 | 0x3F, + 12513 - 12288: jis0208<<14 | 0x04<<7 | 0x40, + 12514 - 12288: jis0208<<14 | 0x04<<7 | 0x41, + 12515 - 12288: jis0208<<14 | 0x04<<7 | 0x42, + 12516 - 12288: jis0208<<14 | 0x04<<7 | 0x43, + 12517 - 12288: jis0208<<14 | 0x04<<7 | 0x44, + 12518 - 12288: jis0208<<14 | 0x04<<7 | 0x45, + 12519 - 12288: jis0208<<14 | 0x04<<7 | 0x46, + 12520 - 12288: jis0208<<14 | 0x04<<7 | 0x47, + 12521 - 12288: jis0208<<14 | 0x04<<7 | 0x48, + 12522 - 12288: jis0208<<14 | 0x04<<7 | 0x49, + 12523 - 12288: jis0208<<14 | 0x04<<7 | 0x4A, + 12524 - 12288: jis0208<<14 | 0x04<<7 | 0x4B, + 12525 - 12288: jis0208<<14 | 0x04<<7 | 0x4C, + 12526 - 12288: jis0208<<14 | 0x04<<7 | 0x4D, + 12527 - 12288: jis0208<<14 | 0x04<<7 | 0x4E, + 12528 - 12288: jis0208<<14 | 0x04<<7 | 0x4F, + 12529 - 12288: jis0208<<14 | 0x04<<7 | 0x50, + 12530 - 12288: jis0208<<14 | 0x04<<7 | 0x51, + 12531 - 12288: jis0208<<14 | 0x04<<7 | 0x52, + 12532 - 12288: jis0208<<14 | 0x04<<7 | 0x53, + 12533 - 12288: jis0208<<14 | 0x04<<7 | 0x54, + 12534 - 12288: jis0208<<14 | 0x04<<7 | 0x55, + 12539 - 12288: jis0208<<14 | 0x00<<7 | 0x05, + 12540 - 12288: jis0208<<14 | 0x00<<7 | 0x1B, + 12541 - 12288: jis0208<<14 | 0x00<<7 | 0x12, + 12542 - 12288: jis0208<<14 | 0x00<<7 | 0x13, + 12849 - 12288: jis0208<<14 | 0x0C<<7 | 0x49, + 12850 - 12288: jis0208<<14 | 0x0C<<7 | 0x4A, + 12857 - 12288: jis0208<<14 | 0x0C<<7 | 0x4B, + 12964 - 12288: jis0208<<14 | 0x0C<<7 | 0x44, + 12965 - 12288: jis0208<<14 | 0x0C<<7 | 0x45, + 12966 - 12288: jis0208<<14 | 0x0C<<7 | 0x46, + 12967 - 12288: jis0208<<14 | 0x0C<<7 | 0x47, + 12968 - 12288: jis0208<<14 | 0x0C<<7 | 0x48, + 13059 - 12288: jis0208<<14 | 0x0C<<7 | 0x25, + 13069 - 12288: jis0208<<14 | 0x0C<<7 | 0x29, + 13076 - 12288: jis0208<<14 | 0x0C<<7 | 0x20, + 13080 - 12288: jis0208<<14 | 0x0C<<7 | 0x23, + 13090 - 12288: jis0208<<14 | 0x0C<<7 | 0x21, + 13091 - 12288: jis0208<<14 | 0x0C<<7 | 0x2B, + 13094 - 12288: jis0208<<14 | 0x0C<<7 | 0x2A, + 13095 - 12288: jis0208<<14 | 0x0C<<7 | 0x24, + 13099 - 12288: jis0208<<14 | 0x0C<<7 | 0x2C, + 13110 - 12288: jis0208<<14 | 0x0C<<7 | 0x26, + 13115 - 12288: jis0208<<14 | 0x0C<<7 | 0x2E, + 13129 - 12288: jis0208<<14 | 0x0C<<7 | 0x1F, + 13130 - 12288: jis0208<<14 | 0x0C<<7 | 0x2D, + 13133 - 12288: jis0208<<14 | 0x0C<<7 | 0x22, + 13137 - 12288: jis0208<<14 | 0x0C<<7 | 0x27, + 13143 - 12288: jis0208<<14 | 0x0C<<7 | 0x28, + 13179 - 12288: jis0208<<14 | 0x0C<<7 | 0x3E, + 13180 - 12288: jis0208<<14 | 0x0C<<7 | 0x4E, + 13181 - 12288: jis0208<<14 | 0x0C<<7 | 0x4D, + 13182 - 12288: jis0208<<14 | 0x0C<<7 | 0x4C, + 13198 - 12288: jis0208<<14 | 0x0C<<7 | 0x32, + 13199 - 12288: jis0208<<14 | 0x0C<<7 | 0x33, + 13212 - 12288: jis0208<<14 | 0x0C<<7 | 0x2F, + 13213 - 12288: jis0208<<14 | 0x0C<<7 | 0x30, + 13214 - 12288: jis0208<<14 | 0x0C<<7 | 0x31, + 13217 - 12288: jis0208<<14 | 0x0C<<7 | 0x35, + 13252 - 12288: jis0208<<14 | 0x0C<<7 | 0x34, + 13261 - 12288: jis0208<<14 | 0x0C<<7 | 0x42, +} + +const encode3Low, encode3High = 161, 1120 + +var encode3 = [...]uint16{ + 161 - 161: jis0212<<14 | 0x01<<7 | 0x21, + 164 - 161: jis0212<<14 | 0x01<<7 | 0x4F, + 166 - 161: jis0212<<14 | 0x01<<7 | 0x22, + 167 - 161: jis0208<<14 | 0x00<<7 | 0x57, + 168 - 161: jis0208<<14 | 0x00<<7 | 0x0E, + 169 - 161: jis0212<<14 | 0x01<<7 | 0x4C, + 170 - 161: jis0212<<14 | 0x01<<7 | 0x4B, + 174 - 161: jis0212<<14 | 0x01<<7 | 0x4D, + 175 - 161: jis0212<<14 | 0x01<<7 | 0x13, + 176 - 161: jis0208<<14 | 0x00<<7 | 0x4A, + 177 - 161: jis0208<<14 | 0x00<<7 | 0x3D, + 180 - 161: jis0208<<14 | 0x00<<7 | 0x0C, + 182 - 161: jis0208<<14 | 0x01<<7 | 0x58, + 184 - 161: jis0212<<14 | 0x01<<7 | 0x10, + 186 - 161: jis0212<<14 | 0x01<<7 | 0x4A, + 191 - 161: jis0212<<14 | 0x01<<7 | 0x23, + 192 - 161: jis0212<<14 | 0x09<<7 | 0x01, + 193 - 161: jis0212<<14 | 0x09<<7 | 0x00, + 194 - 161: jis0212<<14 | 0x09<<7 | 0x03, + 195 - 161: jis0212<<14 | 0x09<<7 | 0x09, + 196 - 161: jis0212<<14 | 0x09<<7 | 0x02, + 197 - 161: jis0212<<14 | 0x09<<7 | 0x08, + 198 - 161: jis0212<<14 | 0x08<<7 | 0x00, + 199 - 161: jis0212<<14 | 0x09<<7 | 0x0D, + 200 - 161: jis0212<<14 | 0x09<<7 | 0x11, + 201 - 161: jis0212<<14 | 0x09<<7 | 0x10, + 202 - 161: jis0212<<14 | 0x09<<7 | 0x13, + 203 - 161: jis0212<<14 | 0x09<<7 | 0x12, + 204 - 161: jis0212<<14 | 0x09<<7 | 0x1F, + 205 - 161: jis0212<<14 | 0x09<<7 | 0x1E, + 206 - 161: jis0212<<14 | 0x09<<7 | 0x21, + 207 - 161: jis0212<<14 | 0x09<<7 | 0x20, + 209 - 161: jis0212<<14 | 0x09<<7 | 0x2F, + 210 - 161: jis0212<<14 | 0x09<<7 | 0x31, + 211 - 161: jis0212<<14 | 0x09<<7 | 0x30, + 212 - 161: jis0212<<14 | 0x09<<7 | 0x33, + 213 - 161: jis0212<<14 | 0x09<<7 | 0x37, + 214 - 161: jis0212<<14 | 0x09<<7 | 0x32, + 215 - 161: jis0208<<14 | 0x00<<7 | 0x3E, + 216 - 161: jis0212<<14 | 0x08<<7 | 0x0B, + 217 - 161: jis0212<<14 | 0x09<<7 | 0x42, + 218 - 161: jis0212<<14 | 0x09<<7 | 0x41, + 219 - 161: jis0212<<14 | 0x09<<7 | 0x44, + 220 - 161: jis0212<<14 | 0x09<<7 | 0x43, + 221 - 161: jis0212<<14 | 0x09<<7 | 0x51, + 222 - 161: jis0212<<14 | 0x08<<7 | 0x0F, + 223 - 161: jis0212<<14 | 0x08<<7 | 0x2D, + 224 - 161: jis0212<<14 | 0x0A<<7 | 0x01, + 225 - 161: jis0212<<14 | 0x0A<<7 | 0x00, + 226 - 161: jis0212<<14 | 0x0A<<7 | 0x03, + 227 - 161: jis0212<<14 | 0x0A<<7 | 0x09, + 228 - 161: jis0212<<14 | 0x0A<<7 | 0x02, + 229 - 161: jis0212<<14 | 0x0A<<7 | 0x08, + 230 - 161: jis0212<<14 | 0x08<<7 | 0x20, + 231 - 161: jis0212<<14 | 0x0A<<7 | 0x0D, + 232 - 161: jis0212<<14 | 0x0A<<7 | 0x11, + 233 - 161: jis0212<<14 | 0x0A<<7 | 0x10, + 234 - 161: jis0212<<14 | 0x0A<<7 | 0x13, + 235 - 161: jis0212<<14 | 0x0A<<7 | 0x12, + 236 - 161: jis0212<<14 | 0x0A<<7 | 0x1F, + 237 - 161: jis0212<<14 | 0x0A<<7 | 0x1E, + 238 - 161: jis0212<<14 | 0x0A<<7 | 0x21, + 239 - 161: jis0212<<14 | 0x0A<<7 | 0x20, + 240 - 161: jis0212<<14 | 0x08<<7 | 0x22, + 241 - 161: jis0212<<14 | 0x0A<<7 | 0x2F, + 242 - 161: jis0212<<14 | 0x0A<<7 | 0x31, + 243 - 161: jis0212<<14 | 0x0A<<7 | 0x30, + 244 - 161: jis0212<<14 | 0x0A<<7 | 0x33, + 245 - 161: jis0212<<14 | 0x0A<<7 | 0x37, + 246 - 161: jis0212<<14 | 0x0A<<7 | 0x32, + 247 - 161: jis0208<<14 | 0x00<<7 | 0x3F, + 248 - 161: jis0212<<14 | 0x08<<7 | 0x2B, + 249 - 161: jis0212<<14 | 0x0A<<7 | 0x42, + 250 - 161: jis0212<<14 | 0x0A<<7 | 0x41, + 251 - 161: jis0212<<14 | 0x0A<<7 | 0x44, + 252 - 161: jis0212<<14 | 0x0A<<7 | 0x43, + 253 - 161: jis0212<<14 | 0x0A<<7 | 0x51, + 254 - 161: jis0212<<14 | 0x08<<7 | 0x2F, + 255 - 161: jis0212<<14 | 0x0A<<7 | 0x52, + 256 - 161: jis0212<<14 | 0x09<<7 | 0x06, + 257 - 161: jis0212<<14 | 0x0A<<7 | 0x06, + 258 - 161: jis0212<<14 | 0x09<<7 | 0x04, + 259 - 161: jis0212<<14 | 0x0A<<7 | 0x04, + 260 - 161: jis0212<<14 | 0x09<<7 | 0x07, + 261 - 161: jis0212<<14 | 0x0A<<7 | 0x07, + 262 - 161: jis0212<<14 | 0x09<<7 | 0x0A, + 263 - 161: jis0212<<14 | 0x0A<<7 | 0x0A, + 264 - 161: jis0212<<14 | 0x09<<7 | 0x0B, + 265 - 161: jis0212<<14 | 0x0A<<7 | 0x0B, + 266 - 161: jis0212<<14 | 0x09<<7 | 0x0E, + 267 - 161: jis0212<<14 | 0x0A<<7 | 0x0E, + 268 - 161: jis0212<<14 | 0x09<<7 | 0x0C, + 269 - 161: jis0212<<14 | 0x0A<<7 | 0x0C, + 270 - 161: jis0212<<14 | 0x09<<7 | 0x0F, + 271 - 161: jis0212<<14 | 0x0A<<7 | 0x0F, + 272 - 161: jis0212<<14 | 0x08<<7 | 0x01, + 273 - 161: jis0212<<14 | 0x08<<7 | 0x21, + 274 - 161: jis0212<<14 | 0x09<<7 | 0x16, + 275 - 161: jis0212<<14 | 0x0A<<7 | 0x16, + 278 - 161: jis0212<<14 | 0x09<<7 | 0x15, + 279 - 161: jis0212<<14 | 0x0A<<7 | 0x15, + 280 - 161: jis0212<<14 | 0x09<<7 | 0x17, + 281 - 161: jis0212<<14 | 0x0A<<7 | 0x17, + 282 - 161: jis0212<<14 | 0x09<<7 | 0x14, + 283 - 161: jis0212<<14 | 0x0A<<7 | 0x14, + 284 - 161: jis0212<<14 | 0x09<<7 | 0x19, + 285 - 161: jis0212<<14 | 0x0A<<7 | 0x19, + 286 - 161: jis0212<<14 | 0x09<<7 | 0x1A, + 287 - 161: jis0212<<14 | 0x0A<<7 | 0x1A, + 288 - 161: jis0212<<14 | 0x09<<7 | 0x1C, + 289 - 161: jis0212<<14 | 0x0A<<7 | 0x1C, + 290 - 161: jis0212<<14 | 0x09<<7 | 0x1B, + 292 - 161: jis0212<<14 | 0x09<<7 | 0x1D, + 293 - 161: jis0212<<14 | 0x0A<<7 | 0x1D, + 294 - 161: jis0212<<14 | 0x08<<7 | 0x03, + 295 - 161: jis0212<<14 | 0x08<<7 | 0x23, + 296 - 161: jis0212<<14 | 0x09<<7 | 0x26, + 297 - 161: jis0212<<14 | 0x0A<<7 | 0x26, + 298 - 161: jis0212<<14 | 0x09<<7 | 0x24, + 299 - 161: jis0212<<14 | 0x0A<<7 | 0x24, + 302 - 161: jis0212<<14 | 0x09<<7 | 0x25, + 303 - 161: jis0212<<14 | 0x0A<<7 | 0x25, + 304 - 161: jis0212<<14 | 0x09<<7 | 0x23, + 305 - 161: jis0212<<14 | 0x08<<7 | 0x24, + 306 - 161: jis0212<<14 | 0x08<<7 | 0x05, + 307 - 161: jis0212<<14 | 0x08<<7 | 0x25, + 308 - 161: jis0212<<14 | 0x09<<7 | 0x27, + 309 - 161: jis0212<<14 | 0x0A<<7 | 0x27, + 310 - 161: jis0212<<14 | 0x09<<7 | 0x28, + 311 - 161: jis0212<<14 | 0x0A<<7 | 0x28, + 312 - 161: jis0212<<14 | 0x08<<7 | 0x26, + 313 - 161: jis0212<<14 | 0x09<<7 | 0x29, + 314 - 161: jis0212<<14 | 0x0A<<7 | 0x29, + 315 - 161: jis0212<<14 | 0x09<<7 | 0x2B, + 316 - 161: jis0212<<14 | 0x0A<<7 | 0x2B, + 317 - 161: jis0212<<14 | 0x09<<7 | 0x2A, + 318 - 161: jis0212<<14 | 0x0A<<7 | 0x2A, + 319 - 161: jis0212<<14 | 0x08<<7 | 0x08, + 320 - 161: jis0212<<14 | 0x08<<7 | 0x28, + 321 - 161: jis0212<<14 | 0x08<<7 | 0x07, + 322 - 161: jis0212<<14 | 0x08<<7 | 0x27, + 323 - 161: jis0212<<14 | 0x09<<7 | 0x2C, + 324 - 161: jis0212<<14 | 0x0A<<7 | 0x2C, + 325 - 161: jis0212<<14 | 0x09<<7 | 0x2E, + 326 - 161: jis0212<<14 | 0x0A<<7 | 0x2E, + 327 - 161: jis0212<<14 | 0x09<<7 | 0x2D, + 328 - 161: jis0212<<14 | 0x0A<<7 | 0x2D, + 329 - 161: jis0212<<14 | 0x08<<7 | 0x29, + 330 - 161: jis0212<<14 | 0x08<<7 | 0x0A, + 331 - 161: jis0212<<14 | 0x08<<7 | 0x2A, + 332 - 161: jis0212<<14 | 0x09<<7 | 0x36, + 333 - 161: jis0212<<14 | 0x0A<<7 | 0x36, + 336 - 161: jis0212<<14 | 0x09<<7 | 0x35, + 337 - 161: jis0212<<14 | 0x0A<<7 | 0x35, + 338 - 161: jis0212<<14 | 0x08<<7 | 0x0C, + 339 - 161: jis0212<<14 | 0x08<<7 | 0x2C, + 340 - 161: jis0212<<14 | 0x09<<7 | 0x38, + 341 - 161: jis0212<<14 | 0x0A<<7 | 0x38, + 342 - 161: jis0212<<14 | 0x09<<7 | 0x3A, + 343 - 161: jis0212<<14 | 0x0A<<7 | 0x3A, + 344 - 161: jis0212<<14 | 0x09<<7 | 0x39, + 345 - 161: jis0212<<14 | 0x0A<<7 | 0x39, + 346 - 161: jis0212<<14 | 0x09<<7 | 0x3B, + 347 - 161: jis0212<<14 | 0x0A<<7 | 0x3B, + 348 - 161: jis0212<<14 | 0x09<<7 | 0x3C, + 349 - 161: jis0212<<14 | 0x0A<<7 | 0x3C, + 350 - 161: jis0212<<14 | 0x09<<7 | 0x3E, + 351 - 161: jis0212<<14 | 0x0A<<7 | 0x3E, + 352 - 161: jis0212<<14 | 0x09<<7 | 0x3D, + 353 - 161: jis0212<<14 | 0x0A<<7 | 0x3D, + 354 - 161: jis0212<<14 | 0x09<<7 | 0x40, + 355 - 161: jis0212<<14 | 0x0A<<7 | 0x40, + 356 - 161: jis0212<<14 | 0x09<<7 | 0x3F, + 357 - 161: jis0212<<14 | 0x0A<<7 | 0x3F, + 358 - 161: jis0212<<14 | 0x08<<7 | 0x0E, + 359 - 161: jis0212<<14 | 0x08<<7 | 0x2E, + 360 - 161: jis0212<<14 | 0x09<<7 | 0x4B, + 361 - 161: jis0212<<14 | 0x0A<<7 | 0x4B, + 362 - 161: jis0212<<14 | 0x09<<7 | 0x48, + 363 - 161: jis0212<<14 | 0x0A<<7 | 0x48, + 364 - 161: jis0212<<14 | 0x09<<7 | 0x45, + 365 - 161: jis0212<<14 | 0x0A<<7 | 0x45, + 366 - 161: jis0212<<14 | 0x09<<7 | 0x4A, + 367 - 161: jis0212<<14 | 0x0A<<7 | 0x4A, + 368 - 161: jis0212<<14 | 0x09<<7 | 0x47, + 369 - 161: jis0212<<14 | 0x0A<<7 | 0x47, + 370 - 161: jis0212<<14 | 0x09<<7 | 0x49, + 371 - 161: jis0212<<14 | 0x0A<<7 | 0x49, + 372 - 161: jis0212<<14 | 0x09<<7 | 0x50, + 373 - 161: jis0212<<14 | 0x0A<<7 | 0x50, + 374 - 161: jis0212<<14 | 0x09<<7 | 0x53, + 375 - 161: jis0212<<14 | 0x0A<<7 | 0x53, + 376 - 161: jis0212<<14 | 0x09<<7 | 0x52, + 377 - 161: jis0212<<14 | 0x09<<7 | 0x54, + 378 - 161: jis0212<<14 | 0x0A<<7 | 0x54, + 379 - 161: jis0212<<14 | 0x09<<7 | 0x56, + 380 - 161: jis0212<<14 | 0x0A<<7 | 0x56, + 381 - 161: jis0212<<14 | 0x09<<7 | 0x55, + 382 - 161: jis0212<<14 | 0x0A<<7 | 0x55, + 461 - 161: jis0212<<14 | 0x09<<7 | 0x05, + 462 - 161: jis0212<<14 | 0x0A<<7 | 0x05, + 463 - 161: jis0212<<14 | 0x09<<7 | 0x22, + 464 - 161: jis0212<<14 | 0x0A<<7 | 0x22, + 465 - 161: jis0212<<14 | 0x09<<7 | 0x34, + 466 - 161: jis0212<<14 | 0x0A<<7 | 0x34, + 467 - 161: jis0212<<14 | 0x09<<7 | 0x46, + 468 - 161: jis0212<<14 | 0x0A<<7 | 0x46, + 469 - 161: jis0212<<14 | 0x09<<7 | 0x4F, + 470 - 161: jis0212<<14 | 0x0A<<7 | 0x4F, + 471 - 161: jis0212<<14 | 0x09<<7 | 0x4C, + 472 - 161: jis0212<<14 | 0x0A<<7 | 0x4C, + 473 - 161: jis0212<<14 | 0x09<<7 | 0x4E, + 474 - 161: jis0212<<14 | 0x0A<<7 | 0x4E, + 475 - 161: jis0212<<14 | 0x09<<7 | 0x4D, + 476 - 161: jis0212<<14 | 0x0A<<7 | 0x4D, + 501 - 161: jis0212<<14 | 0x0A<<7 | 0x18, + 711 - 161: jis0212<<14 | 0x01<<7 | 0x0F, + 728 - 161: jis0212<<14 | 0x01<<7 | 0x0E, + 729 - 161: jis0212<<14 | 0x01<<7 | 0x11, + 730 - 161: jis0212<<14 | 0x01<<7 | 0x15, + 731 - 161: jis0212<<14 | 0x01<<7 | 0x14, + 733 - 161: jis0212<<14 | 0x01<<7 | 0x12, + 900 - 161: jis0212<<14 | 0x01<<7 | 0x17, + 901 - 161: jis0212<<14 | 0x01<<7 | 0x18, + 902 - 161: jis0212<<14 | 0x05<<7 | 0x40, + 904 - 161: jis0212<<14 | 0x05<<7 | 0x41, + 905 - 161: jis0212<<14 | 0x05<<7 | 0x42, + 906 - 161: jis0212<<14 | 0x05<<7 | 0x43, + 908 - 161: jis0212<<14 | 0x05<<7 | 0x46, + 910 - 161: jis0212<<14 | 0x05<<7 | 0x48, + 911 - 161: jis0212<<14 | 0x05<<7 | 0x4B, + 912 - 161: jis0212<<14 | 0x05<<7 | 0x55, + 913 - 161: jis0208<<14 | 0x05<<7 | 0x00, + 914 - 161: jis0208<<14 | 0x05<<7 | 0x01, + 915 - 161: jis0208<<14 | 0x05<<7 | 0x02, + 916 - 161: jis0208<<14 | 0x05<<7 | 0x03, + 917 - 161: jis0208<<14 | 0x05<<7 | 0x04, + 918 - 161: jis0208<<14 | 0x05<<7 | 0x05, + 919 - 161: jis0208<<14 | 0x05<<7 | 0x06, + 920 - 161: jis0208<<14 | 0x05<<7 | 0x07, + 921 - 161: jis0208<<14 | 0x05<<7 | 0x08, + 922 - 161: jis0208<<14 | 0x05<<7 | 0x09, + 923 - 161: jis0208<<14 | 0x05<<7 | 0x0A, + 924 - 161: jis0208<<14 | 0x05<<7 | 0x0B, + 925 - 161: jis0208<<14 | 0x05<<7 | 0x0C, + 926 - 161: jis0208<<14 | 0x05<<7 | 0x0D, + 927 - 161: jis0208<<14 | 0x05<<7 | 0x0E, + 928 - 161: jis0208<<14 | 0x05<<7 | 0x0F, + 929 - 161: jis0208<<14 | 0x05<<7 | 0x10, + 931 - 161: jis0208<<14 | 0x05<<7 | 0x11, + 932 - 161: jis0208<<14 | 0x05<<7 | 0x12, + 933 - 161: jis0208<<14 | 0x05<<7 | 0x13, + 934 - 161: jis0208<<14 | 0x05<<7 | 0x14, + 935 - 161: jis0208<<14 | 0x05<<7 | 0x15, + 936 - 161: jis0208<<14 | 0x05<<7 | 0x16, + 937 - 161: jis0208<<14 | 0x05<<7 | 0x17, + 938 - 161: jis0212<<14 | 0x05<<7 | 0x44, + 939 - 161: jis0212<<14 | 0x05<<7 | 0x49, + 940 - 161: jis0212<<14 | 0x05<<7 | 0x50, + 941 - 161: jis0212<<14 | 0x05<<7 | 0x51, + 942 - 161: jis0212<<14 | 0x05<<7 | 0x52, + 943 - 161: jis0212<<14 | 0x05<<7 | 0x53, + 944 - 161: jis0212<<14 | 0x05<<7 | 0x5A, + 945 - 161: jis0208<<14 | 0x05<<7 | 0x20, + 946 - 161: jis0208<<14 | 0x05<<7 | 0x21, + 947 - 161: jis0208<<14 | 0x05<<7 | 0x22, + 948 - 161: jis0208<<14 | 0x05<<7 | 0x23, + 949 - 161: jis0208<<14 | 0x05<<7 | 0x24, + 950 - 161: jis0208<<14 | 0x05<<7 | 0x25, + 951 - 161: jis0208<<14 | 0x05<<7 | 0x26, + 952 - 161: jis0208<<14 | 0x05<<7 | 0x27, + 953 - 161: jis0208<<14 | 0x05<<7 | 0x28, + 954 - 161: jis0208<<14 | 0x05<<7 | 0x29, + 955 - 161: jis0208<<14 | 0x05<<7 | 0x2A, + 956 - 161: jis0208<<14 | 0x05<<7 | 0x2B, + 957 - 161: jis0208<<14 | 0x05<<7 | 0x2C, + 958 - 161: jis0208<<14 | 0x05<<7 | 0x2D, + 959 - 161: jis0208<<14 | 0x05<<7 | 0x2E, + 960 - 161: jis0208<<14 | 0x05<<7 | 0x2F, + 961 - 161: jis0208<<14 | 0x05<<7 | 0x30, + 962 - 161: jis0212<<14 | 0x05<<7 | 0x57, + 963 - 161: jis0208<<14 | 0x05<<7 | 0x31, + 964 - 161: jis0208<<14 | 0x05<<7 | 0x32, + 965 - 161: jis0208<<14 | 0x05<<7 | 0x33, + 966 - 161: jis0208<<14 | 0x05<<7 | 0x34, + 967 - 161: jis0208<<14 | 0x05<<7 | 0x35, + 968 - 161: jis0208<<14 | 0x05<<7 | 0x36, + 969 - 161: jis0208<<14 | 0x05<<7 | 0x37, + 970 - 161: jis0212<<14 | 0x05<<7 | 0x54, + 971 - 161: jis0212<<14 | 0x05<<7 | 0x59, + 972 - 161: jis0212<<14 | 0x05<<7 | 0x56, + 973 - 161: jis0212<<14 | 0x05<<7 | 0x58, + 974 - 161: jis0212<<14 | 0x05<<7 | 0x5B, + 1025 - 161: jis0208<<14 | 0x06<<7 | 0x06, + 1026 - 161: jis0212<<14 | 0x06<<7 | 0x21, + 1027 - 161: jis0212<<14 | 0x06<<7 | 0x22, + 1028 - 161: jis0212<<14 | 0x06<<7 | 0x23, + 1029 - 161: jis0212<<14 | 0x06<<7 | 0x24, + 1030 - 161: jis0212<<14 | 0x06<<7 | 0x25, + 1031 - 161: jis0212<<14 | 0x06<<7 | 0x26, + 1032 - 161: jis0212<<14 | 0x06<<7 | 0x27, + 1033 - 161: jis0212<<14 | 0x06<<7 | 0x28, + 1034 - 161: jis0212<<14 | 0x06<<7 | 0x29, + 1035 - 161: jis0212<<14 | 0x06<<7 | 0x2A, + 1036 - 161: jis0212<<14 | 0x06<<7 | 0x2B, + 1038 - 161: jis0212<<14 | 0x06<<7 | 0x2C, + 1039 - 161: jis0212<<14 | 0x06<<7 | 0x2D, + 1040 - 161: jis0208<<14 | 0x06<<7 | 0x00, + 1041 - 161: jis0208<<14 | 0x06<<7 | 0x01, + 1042 - 161: jis0208<<14 | 0x06<<7 | 0x02, + 1043 - 161: jis0208<<14 | 0x06<<7 | 0x03, + 1044 - 161: jis0208<<14 | 0x06<<7 | 0x04, + 1045 - 161: jis0208<<14 | 0x06<<7 | 0x05, + 1046 - 161: jis0208<<14 | 0x06<<7 | 0x07, + 1047 - 161: jis0208<<14 | 0x06<<7 | 0x08, + 1048 - 161: jis0208<<14 | 0x06<<7 | 0x09, + 1049 - 161: jis0208<<14 | 0x06<<7 | 0x0A, + 1050 - 161: jis0208<<14 | 0x06<<7 | 0x0B, + 1051 - 161: jis0208<<14 | 0x06<<7 | 0x0C, + 1052 - 161: jis0208<<14 | 0x06<<7 | 0x0D, + 1053 - 161: jis0208<<14 | 0x06<<7 | 0x0E, + 1054 - 161: jis0208<<14 | 0x06<<7 | 0x0F, + 1055 - 161: jis0208<<14 | 0x06<<7 | 0x10, + 1056 - 161: jis0208<<14 | 0x06<<7 | 0x11, + 1057 - 161: jis0208<<14 | 0x06<<7 | 0x12, + 1058 - 161: jis0208<<14 | 0x06<<7 | 0x13, + 1059 - 161: jis0208<<14 | 0x06<<7 | 0x14, + 1060 - 161: jis0208<<14 | 0x06<<7 | 0x15, + 1061 - 161: jis0208<<14 | 0x06<<7 | 0x16, + 1062 - 161: jis0208<<14 | 0x06<<7 | 0x17, + 1063 - 161: jis0208<<14 | 0x06<<7 | 0x18, + 1064 - 161: jis0208<<14 | 0x06<<7 | 0x19, + 1065 - 161: jis0208<<14 | 0x06<<7 | 0x1A, + 1066 - 161: jis0208<<14 | 0x06<<7 | 0x1B, + 1067 - 161: jis0208<<14 | 0x06<<7 | 0x1C, + 1068 - 161: jis0208<<14 | 0x06<<7 | 0x1D, + 1069 - 161: jis0208<<14 | 0x06<<7 | 0x1E, + 1070 - 161: jis0208<<14 | 0x06<<7 | 0x1F, + 1071 - 161: jis0208<<14 | 0x06<<7 | 0x20, + 1072 - 161: jis0208<<14 | 0x06<<7 | 0x30, + 1073 - 161: jis0208<<14 | 0x06<<7 | 0x31, + 1074 - 161: jis0208<<14 | 0x06<<7 | 0x32, + 1075 - 161: jis0208<<14 | 0x06<<7 | 0x33, + 1076 - 161: jis0208<<14 | 0x06<<7 | 0x34, + 1077 - 161: jis0208<<14 | 0x06<<7 | 0x35, + 1078 - 161: jis0208<<14 | 0x06<<7 | 0x37, + 1079 - 161: jis0208<<14 | 0x06<<7 | 0x38, + 1080 - 161: jis0208<<14 | 0x06<<7 | 0x39, + 1081 - 161: jis0208<<14 | 0x06<<7 | 0x3A, + 1082 - 161: jis0208<<14 | 0x06<<7 | 0x3B, + 1083 - 161: jis0208<<14 | 0x06<<7 | 0x3C, + 1084 - 161: jis0208<<14 | 0x06<<7 | 0x3D, + 1085 - 161: jis0208<<14 | 0x06<<7 | 0x3E, + 1086 - 161: jis0208<<14 | 0x06<<7 | 0x3F, + 1087 - 161: jis0208<<14 | 0x06<<7 | 0x40, + 1088 - 161: jis0208<<14 | 0x06<<7 | 0x41, + 1089 - 161: jis0208<<14 | 0x06<<7 | 0x42, + 1090 - 161: jis0208<<14 | 0x06<<7 | 0x43, + 1091 - 161: jis0208<<14 | 0x06<<7 | 0x44, + 1092 - 161: jis0208<<14 | 0x06<<7 | 0x45, + 1093 - 161: jis0208<<14 | 0x06<<7 | 0x46, + 1094 - 161: jis0208<<14 | 0x06<<7 | 0x47, + 1095 - 161: jis0208<<14 | 0x06<<7 | 0x48, + 1096 - 161: jis0208<<14 | 0x06<<7 | 0x49, + 1097 - 161: jis0208<<14 | 0x06<<7 | 0x4A, + 1098 - 161: jis0208<<14 | 0x06<<7 | 0x4B, + 1099 - 161: jis0208<<14 | 0x06<<7 | 0x4C, + 1100 - 161: jis0208<<14 | 0x06<<7 | 0x4D, + 1101 - 161: jis0208<<14 | 0x06<<7 | 0x4E, + 1102 - 161: jis0208<<14 | 0x06<<7 | 0x4F, + 1103 - 161: jis0208<<14 | 0x06<<7 | 0x50, + 1105 - 161: jis0208<<14 | 0x06<<7 | 0x36, + 1106 - 161: jis0212<<14 | 0x06<<7 | 0x51, + 1107 - 161: jis0212<<14 | 0x06<<7 | 0x52, + 1108 - 161: jis0212<<14 | 0x06<<7 | 0x53, + 1109 - 161: jis0212<<14 | 0x06<<7 | 0x54, + 1110 - 161: jis0212<<14 | 0x06<<7 | 0x55, + 1111 - 161: jis0212<<14 | 0x06<<7 | 0x56, + 1112 - 161: jis0212<<14 | 0x06<<7 | 0x57, + 1113 - 161: jis0212<<14 | 0x06<<7 | 0x58, + 1114 - 161: jis0212<<14 | 0x06<<7 | 0x59, + 1115 - 161: jis0212<<14 | 0x06<<7 | 0x5A, + 1116 - 161: jis0212<<14 | 0x06<<7 | 0x5B, + 1118 - 161: jis0212<<14 | 0x06<<7 | 0x5C, + 1119 - 161: jis0212<<14 | 0x06<<7 | 0x5D, +} + +const encode4Low, encode4High = 63785, 64046 + +var encode4 = [...]uint16{ + 63785 - 63785: jis0208<<14 | 0x59<<7 | 0x25, + 63964 - 63785: jis0208<<14 | 0x5B<<7 | 0x2E, + 64014 - 63785: jis0208<<14 | 0x58<<7 | 0x33, + 64015 - 63785: jis0208<<14 | 0x58<<7 | 0x3E, + 64016 - 63785: jis0208<<14 | 0x58<<7 | 0x3F, + 64017 - 63785: jis0208<<14 | 0x58<<7 | 0x54, + 64018 - 63785: jis0208<<14 | 0x59<<7 | 0x1D, + 64019 - 63785: jis0208<<14 | 0x59<<7 | 0x2D, + 64020 - 63785: jis0208<<14 | 0x59<<7 | 0x2F, + 64021 - 63785: jis0208<<14 | 0x59<<7 | 0x5A, + 64022 - 63785: jis0208<<14 | 0x5A<<7 | 0x02, + 64023 - 63785: jis0208<<14 | 0x5A<<7 | 0x19, + 64024 - 63785: jis0208<<14 | 0x5A<<7 | 0x21, + 64025 - 63785: jis0208<<14 | 0x5A<<7 | 0x22, + 64026 - 63785: jis0208<<14 | 0x5A<<7 | 0x23, + 64027 - 63785: jis0208<<14 | 0x5A<<7 | 0x25, + 64028 - 63785: jis0208<<14 | 0x5A<<7 | 0x29, + 64029 - 63785: jis0208<<14 | 0x5A<<7 | 0x2C, + 64030 - 63785: jis0208<<14 | 0x5A<<7 | 0x35, + 64031 - 63785: jis0208<<14 | 0x5A<<7 | 0x40, + 64032 - 63785: jis0208<<14 | 0x5A<<7 | 0x42, + 64033 - 63785: jis0208<<14 | 0x5A<<7 | 0x43, + 64034 - 63785: jis0208<<14 | 0x5A<<7 | 0x4C, + 64035 - 63785: jis0208<<14 | 0x5A<<7 | 0x54, + 64036 - 63785: jis0208<<14 | 0x5A<<7 | 0x56, + 64037 - 63785: jis0208<<14 | 0x5A<<7 | 0x57, + 64038 - 63785: jis0208<<14 | 0x5A<<7 | 0x5A, + 64039 - 63785: jis0208<<14 | 0x5B<<7 | 0x18, + 64040 - 63785: jis0208<<14 | 0x5B<<7 | 0x1F, + 64041 - 63785: jis0208<<14 | 0x5B<<7 | 0x2F, + 64042 - 63785: jis0208<<14 | 0x5B<<7 | 0x3B, + 64043 - 63785: jis0208<<14 | 0x5B<<7 | 0x3C, + 64044 - 63785: jis0208<<14 | 0x5B<<7 | 0x3E, + 64045 - 63785: jis0208<<14 | 0x5B<<7 | 0x4B, +} + +const encode5Low, encode5High = 65281, 65510 + +var encode5 = [...]uint16{ + 65281 - 65281: jis0208<<14 | 0x00<<7 | 0x09, + 65282 - 65281: jis0208<<14 | 0x5B<<7 | 0x5D, + 65283 - 65281: jis0208<<14 | 0x00<<7 | 0x53, + 65284 - 65281: jis0208<<14 | 0x00<<7 | 0x4F, + 65285 - 65281: jis0208<<14 | 0x00<<7 | 0x52, + 65286 - 65281: jis0208<<14 | 0x00<<7 | 0x54, + 65287 - 65281: jis0208<<14 | 0x5B<<7 | 0x5C, + 65288 - 65281: jis0208<<14 | 0x00<<7 | 0x29, + 65289 - 65281: jis0208<<14 | 0x00<<7 | 0x2A, + 65290 - 65281: jis0208<<14 | 0x00<<7 | 0x55, + 65291 - 65281: jis0208<<14 | 0x00<<7 | 0x3B, + 65292 - 65281: jis0208<<14 | 0x00<<7 | 0x03, + 65293 - 65281: jis0208<<14 | 0x00<<7 | 0x3C, + 65294 - 65281: jis0208<<14 | 0x00<<7 | 0x04, + 65295 - 65281: jis0208<<14 | 0x00<<7 | 0x1E, + 65296 - 65281: jis0208<<14 | 0x02<<7 | 0x0F, + 65297 - 65281: jis0208<<14 | 0x02<<7 | 0x10, + 65298 - 65281: jis0208<<14 | 0x02<<7 | 0x11, + 65299 - 65281: jis0208<<14 | 0x02<<7 | 0x12, + 65300 - 65281: jis0208<<14 | 0x02<<7 | 0x13, + 65301 - 65281: jis0208<<14 | 0x02<<7 | 0x14, + 65302 - 65281: jis0208<<14 | 0x02<<7 | 0x15, + 65303 - 65281: jis0208<<14 | 0x02<<7 | 0x16, + 65304 - 65281: jis0208<<14 | 0x02<<7 | 0x17, + 65305 - 65281: jis0208<<14 | 0x02<<7 | 0x18, + 65306 - 65281: jis0208<<14 | 0x00<<7 | 0x06, + 65307 - 65281: jis0208<<14 | 0x00<<7 | 0x07, + 65308 - 65281: jis0208<<14 | 0x00<<7 | 0x42, + 65309 - 65281: jis0208<<14 | 0x00<<7 | 0x40, + 65310 - 65281: jis0208<<14 | 0x00<<7 | 0x43, + 65311 - 65281: jis0208<<14 | 0x00<<7 | 0x08, + 65312 - 65281: jis0208<<14 | 0x00<<7 | 0x56, + 65313 - 65281: jis0208<<14 | 0x02<<7 | 0x20, + 65314 - 65281: jis0208<<14 | 0x02<<7 | 0x21, + 65315 - 65281: jis0208<<14 | 0x02<<7 | 0x22, + 65316 - 65281: jis0208<<14 | 0x02<<7 | 0x23, + 65317 - 65281: jis0208<<14 | 0x02<<7 | 0x24, + 65318 - 65281: jis0208<<14 | 0x02<<7 | 0x25, + 65319 - 65281: jis0208<<14 | 0x02<<7 | 0x26, + 65320 - 65281: jis0208<<14 | 0x02<<7 | 0x27, + 65321 - 65281: jis0208<<14 | 0x02<<7 | 0x28, + 65322 - 65281: jis0208<<14 | 0x02<<7 | 0x29, + 65323 - 65281: jis0208<<14 | 0x02<<7 | 0x2A, + 65324 - 65281: jis0208<<14 | 0x02<<7 | 0x2B, + 65325 - 65281: jis0208<<14 | 0x02<<7 | 0x2C, + 65326 - 65281: jis0208<<14 | 0x02<<7 | 0x2D, + 65327 - 65281: jis0208<<14 | 0x02<<7 | 0x2E, + 65328 - 65281: jis0208<<14 | 0x02<<7 | 0x2F, + 65329 - 65281: jis0208<<14 | 0x02<<7 | 0x30, + 65330 - 65281: jis0208<<14 | 0x02<<7 | 0x31, + 65331 - 65281: jis0208<<14 | 0x02<<7 | 0x32, + 65332 - 65281: jis0208<<14 | 0x02<<7 | 0x33, + 65333 - 65281: jis0208<<14 | 0x02<<7 | 0x34, + 65334 - 65281: jis0208<<14 | 0x02<<7 | 0x35, + 65335 - 65281: jis0208<<14 | 0x02<<7 | 0x36, + 65336 - 65281: jis0208<<14 | 0x02<<7 | 0x37, + 65337 - 65281: jis0208<<14 | 0x02<<7 | 0x38, + 65338 - 65281: jis0208<<14 | 0x02<<7 | 0x39, + 65339 - 65281: jis0208<<14 | 0x00<<7 | 0x2D, + 65340 - 65281: jis0208<<14 | 0x00<<7 | 0x1F, + 65341 - 65281: jis0208<<14 | 0x00<<7 | 0x2E, + 65342 - 65281: jis0208<<14 | 0x00<<7 | 0x0F, + 65343 - 65281: jis0208<<14 | 0x00<<7 | 0x11, + 65344 - 65281: jis0208<<14 | 0x00<<7 | 0x0D, + 65345 - 65281: jis0208<<14 | 0x02<<7 | 0x40, + 65346 - 65281: jis0208<<14 | 0x02<<7 | 0x41, + 65347 - 65281: jis0208<<14 | 0x02<<7 | 0x42, + 65348 - 65281: jis0208<<14 | 0x02<<7 | 0x43, + 65349 - 65281: jis0208<<14 | 0x02<<7 | 0x44, + 65350 - 65281: jis0208<<14 | 0x02<<7 | 0x45, + 65351 - 65281: jis0208<<14 | 0x02<<7 | 0x46, + 65352 - 65281: jis0208<<14 | 0x02<<7 | 0x47, + 65353 - 65281: jis0208<<14 | 0x02<<7 | 0x48, + 65354 - 65281: jis0208<<14 | 0x02<<7 | 0x49, + 65355 - 65281: jis0208<<14 | 0x02<<7 | 0x4A, + 65356 - 65281: jis0208<<14 | 0x02<<7 | 0x4B, + 65357 - 65281: jis0208<<14 | 0x02<<7 | 0x4C, + 65358 - 65281: jis0208<<14 | 0x02<<7 | 0x4D, + 65359 - 65281: jis0208<<14 | 0x02<<7 | 0x4E, + 65360 - 65281: jis0208<<14 | 0x02<<7 | 0x4F, + 65361 - 65281: jis0208<<14 | 0x02<<7 | 0x50, + 65362 - 65281: jis0208<<14 | 0x02<<7 | 0x51, + 65363 - 65281: jis0208<<14 | 0x02<<7 | 0x52, + 65364 - 65281: jis0208<<14 | 0x02<<7 | 0x53, + 65365 - 65281: jis0208<<14 | 0x02<<7 | 0x54, + 65366 - 65281: jis0208<<14 | 0x02<<7 | 0x55, + 65367 - 65281: jis0208<<14 | 0x02<<7 | 0x56, + 65368 - 65281: jis0208<<14 | 0x02<<7 | 0x57, + 65369 - 65281: jis0208<<14 | 0x02<<7 | 0x58, + 65370 - 65281: jis0208<<14 | 0x02<<7 | 0x59, + 65371 - 65281: jis0208<<14 | 0x00<<7 | 0x2F, + 65372 - 65281: jis0208<<14 | 0x00<<7 | 0x22, + 65373 - 65281: jis0208<<14 | 0x00<<7 | 0x30, + 65374 - 65281: jis0208<<14 | 0x00<<7 | 0x20, + 65504 - 65281: jis0208<<14 | 0x00<<7 | 0x50, + 65505 - 65281: jis0208<<14 | 0x00<<7 | 0x51, + 65506 - 65281: jis0208<<14 | 0x01<<7 | 0x2B, + 65507 - 65281: jis0208<<14 | 0x00<<7 | 0x10, + 65508 - 65281: jis0208<<14 | 0x5B<<7 | 0x5B, + 65509 - 65281: jis0208<<14 | 0x00<<7 | 0x4E, +} diff --git a/vendor/golang.org/x/text/encoding/korean/all_test.go b/vendor/golang.org/x/text/encoding/korean/all_test.go new file mode 100644 index 0000000000..502c262dad --- /dev/null +++ b/vendor/golang.org/x/text/encoding/korean/all_test.go @@ -0,0 +1,47 @@ +// 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 korean + +import ( + "testing" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal" + "golang.org/x/text/transform" +) + +func dec(e encoding.Encoding) (dir string, t transform.Transformer, err error) { + return "Decode", e.NewDecoder(), nil +} +func enc(e encoding.Encoding) (dir string, t transform.Transformer, err error) { + return "Encode", e.NewEncoder(), internal.ErrASCIIReplacement +} + +func TestNonRepertoire(t *testing.T) { + testCases := []struct { + init func(e encoding.Encoding) (string, transform.Transformer, error) + e encoding.Encoding + src, want string + }{ + {dec, EUCKR, "\xfe\xfe", "\ufffd"}, + // {dec, EUCKR, "א", "\ufffd"}, // TODO: why is this different? + + {enc, EUCKR, "א", ""}, + {enc, EUCKR, "aא", "a"}, + {enc, EUCKR, "\uac00א", "\xb0\xa1"}, + // TODO: should we also handle Jamo? + } + for _, tc := range testCases { + dir, tr, wantErr := tc.init(tc.e) + + dst, _, err := transform.String(tr, tc.src) + if err != wantErr { + t.Errorf("%s %v(%q): got %v; want %v", dir, tc.e, tc.src, err, wantErr) + } + if got := string(dst); got != tc.want { + t.Errorf("%s %v(%q):\ngot %q\nwant %q", dir, tc.e, tc.src, got, tc.want) + } + } +} diff --git a/vendor/golang.org/x/text/encoding/korean/euckr.go b/vendor/golang.org/x/text/encoding/korean/euckr.go new file mode 100644 index 0000000000..a4b9ff178b --- /dev/null +++ b/vendor/golang.org/x/text/encoding/korean/euckr.go @@ -0,0 +1,178 @@ +// Copyright 2013 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 korean + +import ( + "errors" + "unicode/utf8" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal" + "golang.org/x/text/encoding/internal/identifier" + "golang.org/x/text/transform" +) + +// All is a list of all defined encodings in this package. +var All = []encoding.Encoding{EUCKR} + +// EUCKR is the EUC-KR encoding, also known as Code Page 949. +var EUCKR encoding.Encoding = &eucKR + +var eucKR = internal.Encoding{ + &internal.SimpleEncoding{eucKRDecoder{}, eucKREncoder{}}, + "EUC-KR", + identifier.EUCKR, +} + +var errInvalidEUCKR = errors.New("korean: invalid EUC-KR encoding") + +type eucKRDecoder struct{ transform.NopResetter } + +func (eucKRDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + r, size := rune(0), 0 +loop: + for ; nSrc < len(src); nSrc += size { + switch c0 := src[nSrc]; { + case c0 < utf8.RuneSelf: + r, size = rune(c0), 1 + + case 0x81 <= c0 && c0 < 0xff: + if nSrc+1 >= len(src) { + err = transform.ErrShortSrc + break loop + } + c1 := src[nSrc+1] + if c0 < 0xc7 { + r = 178 * rune(c0-0x81) + switch { + case 0x41 <= c1 && c1 < 0x5b: + r += rune(c1) - (0x41 - 0*26) + case 0x61 <= c1 && c1 < 0x7b: + r += rune(c1) - (0x61 - 1*26) + case 0x81 <= c1 && c1 < 0xff: + r += rune(c1) - (0x81 - 2*26) + default: + err = errInvalidEUCKR + break loop + } + } else if 0xa1 <= c1 && c1 < 0xff { + r = 178*(0xc7-0x81) + rune(c0-0xc7)*94 + rune(c1-0xa1) + } else { + err = errInvalidEUCKR + break loop + } + if int(r) < len(decode) { + r = rune(decode[r]) + if r == 0 { + r = '\ufffd' + } + } else { + r = '\ufffd' + } + size = 2 + + default: + err = errInvalidEUCKR + break loop + } + + if nDst+utf8.RuneLen(r) > len(dst) { + err = transform.ErrShortDst + break loop + } + nDst += utf8.EncodeRune(dst[nDst:], r) + } + if atEOF && err == transform.ErrShortSrc { + err = errInvalidEUCKR + } + return nDst, nSrc, err +} + +type eucKREncoder struct{ transform.NopResetter } + +func (eucKREncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + r, size := rune(0), 0 + for ; nSrc < len(src); nSrc += size { + r = rune(src[nSrc]) + + // Decode a 1-byte rune. + if r < utf8.RuneSelf { + size = 1 + + if nDst >= len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst] = uint8(r) + nDst++ + continue + + } else { + // Decode a multi-byte rune. + r, size = utf8.DecodeRune(src[nSrc:]) + if size == 1 { + // All valid runes of size 1 (those below utf8.RuneSelf) were + // handled above. We have invalid UTF-8 or we haven't seen the + // full character yet. + if !atEOF && !utf8.FullRune(src[nSrc:]) { + err = transform.ErrShortSrc + break + } + } + + // func init checks that the switch covers all tables. + switch { + case encode0Low <= r && r < encode0High: + if r = rune(encode0[r-encode0Low]); r != 0 { + goto write2 + } + case encode1Low <= r && r < encode1High: + if r = rune(encode1[r-encode1Low]); r != 0 { + goto write2 + } + case encode2Low <= r && r < encode2High: + if r = rune(encode2[r-encode2Low]); r != 0 { + goto write2 + } + case encode3Low <= r && r < encode3High: + if r = rune(encode3[r-encode3Low]); r != 0 { + goto write2 + } + case encode4Low <= r && r < encode4High: + if r = rune(encode4[r-encode4Low]); r != 0 { + goto write2 + } + case encode5Low <= r && r < encode5High: + if r = rune(encode5[r-encode5Low]); r != 0 { + goto write2 + } + case encode6Low <= r && r < encode6High: + if r = rune(encode6[r-encode6Low]); r != 0 { + goto write2 + } + } + err = internal.ErrASCIIReplacement + break + } + + write2: + if nDst+2 > len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst+0] = uint8(r >> 8) + dst[nDst+1] = uint8(r) + nDst += 2 + continue + } + return nDst, nSrc, err +} + +func init() { + // Check that the hard-coded encode switch covers all tables. + if numEncodeTables != 7 { + panic("bad numEncodeTables") + } +} diff --git a/vendor/golang.org/x/text/encoding/korean/maketables.go b/vendor/golang.org/x/text/encoding/korean/maketables.go new file mode 100644 index 0000000000..c84034fb67 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/korean/maketables.go @@ -0,0 +1,143 @@ +// Copyright 2013 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 + +// This program generates tables.go: +// go run maketables.go | gofmt > tables.go + +import ( + "bufio" + "fmt" + "log" + "net/http" + "sort" + "strings" +) + +func main() { + fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n") + fmt.Printf("// Package korean provides Korean encodings such as EUC-KR.\n") + fmt.Printf(`package korean // import "golang.org/x/text/encoding/korean"` + "\n\n") + + res, err := http.Get("http://encoding.spec.whatwg.org/index-euc-kr.txt") + if err != nil { + log.Fatalf("Get: %v", err) + } + defer res.Body.Close() + + mapping := [65536]uint16{} + reverse := [65536]uint16{} + + scanner := bufio.NewScanner(res.Body) + for scanner.Scan() { + s := strings.TrimSpace(scanner.Text()) + if s == "" || s[0] == '#' { + continue + } + x, y := uint16(0), uint16(0) + if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { + log.Fatalf("could not parse %q", s) + } + if x < 0 || 178*(0xc7-0x81)+(0xfe-0xc7)*94+(0xff-0xa1) <= x { + log.Fatalf("EUC-KR code %d is out of range", x) + } + mapping[x] = y + if reverse[y] == 0 { + c0, c1 := uint16(0), uint16(0) + if x < 178*(0xc7-0x81) { + c0 = uint16(x/178) + 0x81 + c1 = uint16(x % 178) + switch { + case c1 < 1*26: + c1 += 0x41 + case c1 < 2*26: + c1 += 0x47 + default: + c1 += 0x4d + } + } else { + x -= 178 * (0xc7 - 0x81) + c0 = uint16(x/94) + 0xc7 + c1 = uint16(x%94) + 0xa1 + } + reverse[y] = c0<<8 | c1 + } + } + if err := scanner.Err(); err != nil { + log.Fatalf("scanner error: %v", err) + } + + fmt.Printf("// decode is the decoding table from EUC-KR code to Unicode.\n") + fmt.Printf("// It is defined at http://encoding.spec.whatwg.org/index-euc-kr.txt\n") + fmt.Printf("var decode = [...]uint16{\n") + for i, v := range mapping { + if v != 0 { + fmt.Printf("\t%d: 0x%04X,\n", i, v) + } + } + fmt.Printf("}\n\n") + + // Any run of at least separation continuous zero entries in the reverse map will + // be a separate encode table. + const separation = 1024 + + intervals := []interval(nil) + low, high := -1, -1 + for i, v := range reverse { + if v == 0 { + continue + } + if low < 0 { + low = i + } else if i-high >= separation { + if high >= 0 { + intervals = append(intervals, interval{low, high}) + } + low = i + } + high = i + 1 + } + if high >= 0 { + intervals = append(intervals, interval{low, high}) + } + sort.Sort(byDecreasingLength(intervals)) + + fmt.Printf("const numEncodeTables = %d\n\n", len(intervals)) + fmt.Printf("// encodeX are the encoding tables from Unicode to EUC-KR code,\n") + fmt.Printf("// sorted by decreasing length.\n") + for i, v := range intervals { + fmt.Printf("// encode%d: %5d entries for runes in [%5d, %5d).\n", i, v.len(), v.low, v.high) + } + fmt.Printf("\n") + + for i, v := range intervals { + fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high) + fmt.Printf("var encode%d = [...]uint16{\n", i) + for j := v.low; j < v.high; j++ { + x := reverse[j] + if x == 0 { + continue + } + fmt.Printf("\t%d-%d: 0x%04X,\n", j, v.low, x) + } + fmt.Printf("}\n\n") + } +} + +// interval is a half-open interval [low, high). +type interval struct { + low, high int +} + +func (i interval) len() int { return i.high - i.low } + +// byDecreasingLength sorts intervals by decreasing length. +type byDecreasingLength []interval + +func (b byDecreasingLength) Len() int { return len(b) } +func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() } +func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] } diff --git a/vendor/golang.org/x/text/encoding/korean/tables.go b/vendor/golang.org/x/text/encoding/korean/tables.go new file mode 100644 index 0000000000..0480e85c4a --- /dev/null +++ b/vendor/golang.org/x/text/encoding/korean/tables.go @@ -0,0 +1,34152 @@ +// generated by go run maketables.go; DO NOT EDIT + +// Package korean provides Korean encodings such as EUC-KR. +package korean // import "golang.org/x/text/encoding/korean" + +// decode is the decoding table from EUC-KR code to Unicode. +// It is defined at http://encoding.spec.whatwg.org/index-euc-kr.txt +var decode = [...]uint16{ + 0: 0xAC02, + 1: 0xAC03, + 2: 0xAC05, + 3: 0xAC06, + 4: 0xAC0B, + 5: 0xAC0C, + 6: 0xAC0D, + 7: 0xAC0E, + 8: 0xAC0F, + 9: 0xAC18, + 10: 0xAC1E, + 11: 0xAC1F, + 12: 0xAC21, + 13: 0xAC22, + 14: 0xAC23, + 15: 0xAC25, + 16: 0xAC26, + 17: 0xAC27, + 18: 0xAC28, + 19: 0xAC29, + 20: 0xAC2A, + 21: 0xAC2B, + 22: 0xAC2E, + 23: 0xAC32, + 24: 0xAC33, + 25: 0xAC34, + 26: 0xAC35, + 27: 0xAC36, + 28: 0xAC37, + 29: 0xAC3A, + 30: 0xAC3B, + 31: 0xAC3D, + 32: 0xAC3E, + 33: 0xAC3F, + 34: 0xAC41, + 35: 0xAC42, + 36: 0xAC43, + 37: 0xAC44, + 38: 0xAC45, + 39: 0xAC46, + 40: 0xAC47, + 41: 0xAC48, + 42: 0xAC49, + 43: 0xAC4A, + 44: 0xAC4C, + 45: 0xAC4E, + 46: 0xAC4F, + 47: 0xAC50, + 48: 0xAC51, + 49: 0xAC52, + 50: 0xAC53, + 51: 0xAC55, + 52: 0xAC56, + 53: 0xAC57, + 54: 0xAC59, + 55: 0xAC5A, + 56: 0xAC5B, + 57: 0xAC5D, + 58: 0xAC5E, + 59: 0xAC5F, + 60: 0xAC60, + 61: 0xAC61, + 62: 0xAC62, + 63: 0xAC63, + 64: 0xAC64, + 65: 0xAC65, + 66: 0xAC66, + 67: 0xAC67, + 68: 0xAC68, + 69: 0xAC69, + 70: 0xAC6A, + 71: 0xAC6B, + 72: 0xAC6C, + 73: 0xAC6D, + 74: 0xAC6E, + 75: 0xAC6F, + 76: 0xAC72, + 77: 0xAC73, + 78: 0xAC75, + 79: 0xAC76, + 80: 0xAC79, + 81: 0xAC7B, + 82: 0xAC7C, + 83: 0xAC7D, + 84: 0xAC7E, + 85: 0xAC7F, + 86: 0xAC82, + 87: 0xAC87, + 88: 0xAC88, + 89: 0xAC8D, + 90: 0xAC8E, + 91: 0xAC8F, + 92: 0xAC91, + 93: 0xAC92, + 94: 0xAC93, + 95: 0xAC95, + 96: 0xAC96, + 97: 0xAC97, + 98: 0xAC98, + 99: 0xAC99, + 100: 0xAC9A, + 101: 0xAC9B, + 102: 0xAC9E, + 103: 0xACA2, + 104: 0xACA3, + 105: 0xACA4, + 106: 0xACA5, + 107: 0xACA6, + 108: 0xACA7, + 109: 0xACAB, + 110: 0xACAD, + 111: 0xACAE, + 112: 0xACB1, + 113: 0xACB2, + 114: 0xACB3, + 115: 0xACB4, + 116: 0xACB5, + 117: 0xACB6, + 118: 0xACB7, + 119: 0xACBA, + 120: 0xACBE, + 121: 0xACBF, + 122: 0xACC0, + 123: 0xACC2, + 124: 0xACC3, + 125: 0xACC5, + 126: 0xACC6, + 127: 0xACC7, + 128: 0xACC9, + 129: 0xACCA, + 130: 0xACCB, + 131: 0xACCD, + 132: 0xACCE, + 133: 0xACCF, + 134: 0xACD0, + 135: 0xACD1, + 136: 0xACD2, + 137: 0xACD3, + 138: 0xACD4, + 139: 0xACD6, + 140: 0xACD8, + 141: 0xACD9, + 142: 0xACDA, + 143: 0xACDB, + 144: 0xACDC, + 145: 0xACDD, + 146: 0xACDE, + 147: 0xACDF, + 148: 0xACE2, + 149: 0xACE3, + 150: 0xACE5, + 151: 0xACE6, + 152: 0xACE9, + 153: 0xACEB, + 154: 0xACED, + 155: 0xACEE, + 156: 0xACF2, + 157: 0xACF4, + 158: 0xACF7, + 159: 0xACF8, + 160: 0xACF9, + 161: 0xACFA, + 162: 0xACFB, + 163: 0xACFE, + 164: 0xACFF, + 165: 0xAD01, + 166: 0xAD02, + 167: 0xAD03, + 168: 0xAD05, + 169: 0xAD07, + 170: 0xAD08, + 171: 0xAD09, + 172: 0xAD0A, + 173: 0xAD0B, + 174: 0xAD0E, + 175: 0xAD10, + 176: 0xAD12, + 177: 0xAD13, + 178: 0xAD14, + 179: 0xAD15, + 180: 0xAD16, + 181: 0xAD17, + 182: 0xAD19, + 183: 0xAD1A, + 184: 0xAD1B, + 185: 0xAD1D, + 186: 0xAD1E, + 187: 0xAD1F, + 188: 0xAD21, + 189: 0xAD22, + 190: 0xAD23, + 191: 0xAD24, + 192: 0xAD25, + 193: 0xAD26, + 194: 0xAD27, + 195: 0xAD28, + 196: 0xAD2A, + 197: 0xAD2B, + 198: 0xAD2E, + 199: 0xAD2F, + 200: 0xAD30, + 201: 0xAD31, + 202: 0xAD32, + 203: 0xAD33, + 204: 0xAD36, + 205: 0xAD37, + 206: 0xAD39, + 207: 0xAD3A, + 208: 0xAD3B, + 209: 0xAD3D, + 210: 0xAD3E, + 211: 0xAD3F, + 212: 0xAD40, + 213: 0xAD41, + 214: 0xAD42, + 215: 0xAD43, + 216: 0xAD46, + 217: 0xAD48, + 218: 0xAD4A, + 219: 0xAD4B, + 220: 0xAD4C, + 221: 0xAD4D, + 222: 0xAD4E, + 223: 0xAD4F, + 224: 0xAD51, + 225: 0xAD52, + 226: 0xAD53, + 227: 0xAD55, + 228: 0xAD56, + 229: 0xAD57, + 230: 0xAD59, + 231: 0xAD5A, + 232: 0xAD5B, + 233: 0xAD5C, + 234: 0xAD5D, + 235: 0xAD5E, + 236: 0xAD5F, + 237: 0xAD60, + 238: 0xAD62, + 239: 0xAD64, + 240: 0xAD65, + 241: 0xAD66, + 242: 0xAD67, + 243: 0xAD68, + 244: 0xAD69, + 245: 0xAD6A, + 246: 0xAD6B, + 247: 0xAD6E, + 248: 0xAD6F, + 249: 0xAD71, + 250: 0xAD72, + 251: 0xAD77, + 252: 0xAD78, + 253: 0xAD79, + 254: 0xAD7A, + 255: 0xAD7E, + 256: 0xAD80, + 257: 0xAD83, + 258: 0xAD84, + 259: 0xAD85, + 260: 0xAD86, + 261: 0xAD87, + 262: 0xAD8A, + 263: 0xAD8B, + 264: 0xAD8D, + 265: 0xAD8E, + 266: 0xAD8F, + 267: 0xAD91, + 268: 0xAD92, + 269: 0xAD93, + 270: 0xAD94, + 271: 0xAD95, + 272: 0xAD96, + 273: 0xAD97, + 274: 0xAD98, + 275: 0xAD99, + 276: 0xAD9A, + 277: 0xAD9B, + 278: 0xAD9E, + 279: 0xAD9F, + 280: 0xADA0, + 281: 0xADA1, + 282: 0xADA2, + 283: 0xADA3, + 284: 0xADA5, + 285: 0xADA6, + 286: 0xADA7, + 287: 0xADA8, + 288: 0xADA9, + 289: 0xADAA, + 290: 0xADAB, + 291: 0xADAC, + 292: 0xADAD, + 293: 0xADAE, + 294: 0xADAF, + 295: 0xADB0, + 296: 0xADB1, + 297: 0xADB2, + 298: 0xADB3, + 299: 0xADB4, + 300: 0xADB5, + 301: 0xADB6, + 302: 0xADB8, + 303: 0xADB9, + 304: 0xADBA, + 305: 0xADBB, + 306: 0xADBC, + 307: 0xADBD, + 308: 0xADBE, + 309: 0xADBF, + 310: 0xADC2, + 311: 0xADC3, + 312: 0xADC5, + 313: 0xADC6, + 314: 0xADC7, + 315: 0xADC9, + 316: 0xADCA, + 317: 0xADCB, + 318: 0xADCC, + 319: 0xADCD, + 320: 0xADCE, + 321: 0xADCF, + 322: 0xADD2, + 323: 0xADD4, + 324: 0xADD5, + 325: 0xADD6, + 326: 0xADD7, + 327: 0xADD8, + 328: 0xADD9, + 329: 0xADDA, + 330: 0xADDB, + 331: 0xADDD, + 332: 0xADDE, + 333: 0xADDF, + 334: 0xADE1, + 335: 0xADE2, + 336: 0xADE3, + 337: 0xADE5, + 338: 0xADE6, + 339: 0xADE7, + 340: 0xADE8, + 341: 0xADE9, + 342: 0xADEA, + 343: 0xADEB, + 344: 0xADEC, + 345: 0xADED, + 346: 0xADEE, + 347: 0xADEF, + 348: 0xADF0, + 349: 0xADF1, + 350: 0xADF2, + 351: 0xADF3, + 352: 0xADF4, + 353: 0xADF5, + 354: 0xADF6, + 355: 0xADF7, + 356: 0xADFA, + 357: 0xADFB, + 358: 0xADFD, + 359: 0xADFE, + 360: 0xAE02, + 361: 0xAE03, + 362: 0xAE04, + 363: 0xAE05, + 364: 0xAE06, + 365: 0xAE07, + 366: 0xAE0A, + 367: 0xAE0C, + 368: 0xAE0E, + 369: 0xAE0F, + 370: 0xAE10, + 371: 0xAE11, + 372: 0xAE12, + 373: 0xAE13, + 374: 0xAE15, + 375: 0xAE16, + 376: 0xAE17, + 377: 0xAE18, + 378: 0xAE19, + 379: 0xAE1A, + 380: 0xAE1B, + 381: 0xAE1C, + 382: 0xAE1D, + 383: 0xAE1E, + 384: 0xAE1F, + 385: 0xAE20, + 386: 0xAE21, + 387: 0xAE22, + 388: 0xAE23, + 389: 0xAE24, + 390: 0xAE25, + 391: 0xAE26, + 392: 0xAE27, + 393: 0xAE28, + 394: 0xAE29, + 395: 0xAE2A, + 396: 0xAE2B, + 397: 0xAE2C, + 398: 0xAE2D, + 399: 0xAE2E, + 400: 0xAE2F, + 401: 0xAE32, + 402: 0xAE33, + 403: 0xAE35, + 404: 0xAE36, + 405: 0xAE39, + 406: 0xAE3B, + 407: 0xAE3C, + 408: 0xAE3D, + 409: 0xAE3E, + 410: 0xAE3F, + 411: 0xAE42, + 412: 0xAE44, + 413: 0xAE47, + 414: 0xAE48, + 415: 0xAE49, + 416: 0xAE4B, + 417: 0xAE4F, + 418: 0xAE51, + 419: 0xAE52, + 420: 0xAE53, + 421: 0xAE55, + 422: 0xAE57, + 423: 0xAE58, + 424: 0xAE59, + 425: 0xAE5A, + 426: 0xAE5B, + 427: 0xAE5E, + 428: 0xAE62, + 429: 0xAE63, + 430: 0xAE64, + 431: 0xAE66, + 432: 0xAE67, + 433: 0xAE6A, + 434: 0xAE6B, + 435: 0xAE6D, + 436: 0xAE6E, + 437: 0xAE6F, + 438: 0xAE71, + 439: 0xAE72, + 440: 0xAE73, + 441: 0xAE74, + 442: 0xAE75, + 443: 0xAE76, + 444: 0xAE77, + 445: 0xAE7A, + 446: 0xAE7E, + 447: 0xAE7F, + 448: 0xAE80, + 449: 0xAE81, + 450: 0xAE82, + 451: 0xAE83, + 452: 0xAE86, + 453: 0xAE87, + 454: 0xAE88, + 455: 0xAE89, + 456: 0xAE8A, + 457: 0xAE8B, + 458: 0xAE8D, + 459: 0xAE8E, + 460: 0xAE8F, + 461: 0xAE90, + 462: 0xAE91, + 463: 0xAE92, + 464: 0xAE93, + 465: 0xAE94, + 466: 0xAE95, + 467: 0xAE96, + 468: 0xAE97, + 469: 0xAE98, + 470: 0xAE99, + 471: 0xAE9A, + 472: 0xAE9B, + 473: 0xAE9C, + 474: 0xAE9D, + 475: 0xAE9E, + 476: 0xAE9F, + 477: 0xAEA0, + 478: 0xAEA1, + 479: 0xAEA2, + 480: 0xAEA3, + 481: 0xAEA4, + 482: 0xAEA5, + 483: 0xAEA6, + 484: 0xAEA7, + 485: 0xAEA8, + 486: 0xAEA9, + 487: 0xAEAA, + 488: 0xAEAB, + 489: 0xAEAC, + 490: 0xAEAD, + 491: 0xAEAE, + 492: 0xAEAF, + 493: 0xAEB0, + 494: 0xAEB1, + 495: 0xAEB2, + 496: 0xAEB3, + 497: 0xAEB4, + 498: 0xAEB5, + 499: 0xAEB6, + 500: 0xAEB7, + 501: 0xAEB8, + 502: 0xAEB9, + 503: 0xAEBA, + 504: 0xAEBB, + 505: 0xAEBF, + 506: 0xAEC1, + 507: 0xAEC2, + 508: 0xAEC3, + 509: 0xAEC5, + 510: 0xAEC6, + 511: 0xAEC7, + 512: 0xAEC8, + 513: 0xAEC9, + 514: 0xAECA, + 515: 0xAECB, + 516: 0xAECE, + 517: 0xAED2, + 518: 0xAED3, + 519: 0xAED4, + 520: 0xAED5, + 521: 0xAED6, + 522: 0xAED7, + 523: 0xAEDA, + 524: 0xAEDB, + 525: 0xAEDD, + 526: 0xAEDE, + 527: 0xAEDF, + 528: 0xAEE0, + 529: 0xAEE1, + 530: 0xAEE2, + 531: 0xAEE3, + 532: 0xAEE4, + 533: 0xAEE5, + 534: 0xAEE6, + 535: 0xAEE7, + 536: 0xAEE9, + 537: 0xAEEA, + 538: 0xAEEC, + 539: 0xAEEE, + 540: 0xAEEF, + 541: 0xAEF0, + 542: 0xAEF1, + 543: 0xAEF2, + 544: 0xAEF3, + 545: 0xAEF5, + 546: 0xAEF6, + 547: 0xAEF7, + 548: 0xAEF9, + 549: 0xAEFA, + 550: 0xAEFB, + 551: 0xAEFD, + 552: 0xAEFE, + 553: 0xAEFF, + 554: 0xAF00, + 555: 0xAF01, + 556: 0xAF02, + 557: 0xAF03, + 558: 0xAF04, + 559: 0xAF05, + 560: 0xAF06, + 561: 0xAF09, + 562: 0xAF0A, + 563: 0xAF0B, + 564: 0xAF0C, + 565: 0xAF0E, + 566: 0xAF0F, + 567: 0xAF11, + 568: 0xAF12, + 569: 0xAF13, + 570: 0xAF14, + 571: 0xAF15, + 572: 0xAF16, + 573: 0xAF17, + 574: 0xAF18, + 575: 0xAF19, + 576: 0xAF1A, + 577: 0xAF1B, + 578: 0xAF1C, + 579: 0xAF1D, + 580: 0xAF1E, + 581: 0xAF1F, + 582: 0xAF20, + 583: 0xAF21, + 584: 0xAF22, + 585: 0xAF23, + 586: 0xAF24, + 587: 0xAF25, + 588: 0xAF26, + 589: 0xAF27, + 590: 0xAF28, + 591: 0xAF29, + 592: 0xAF2A, + 593: 0xAF2B, + 594: 0xAF2E, + 595: 0xAF2F, + 596: 0xAF31, + 597: 0xAF33, + 598: 0xAF35, + 599: 0xAF36, + 600: 0xAF37, + 601: 0xAF38, + 602: 0xAF39, + 603: 0xAF3A, + 604: 0xAF3B, + 605: 0xAF3E, + 606: 0xAF40, + 607: 0xAF44, + 608: 0xAF45, + 609: 0xAF46, + 610: 0xAF47, + 611: 0xAF4A, + 612: 0xAF4B, + 613: 0xAF4C, + 614: 0xAF4D, + 615: 0xAF4E, + 616: 0xAF4F, + 617: 0xAF51, + 618: 0xAF52, + 619: 0xAF53, + 620: 0xAF54, + 621: 0xAF55, + 622: 0xAF56, + 623: 0xAF57, + 624: 0xAF58, + 625: 0xAF59, + 626: 0xAF5A, + 627: 0xAF5B, + 628: 0xAF5E, + 629: 0xAF5F, + 630: 0xAF60, + 631: 0xAF61, + 632: 0xAF62, + 633: 0xAF63, + 634: 0xAF66, + 635: 0xAF67, + 636: 0xAF68, + 637: 0xAF69, + 638: 0xAF6A, + 639: 0xAF6B, + 640: 0xAF6C, + 641: 0xAF6D, + 642: 0xAF6E, + 643: 0xAF6F, + 644: 0xAF70, + 645: 0xAF71, + 646: 0xAF72, + 647: 0xAF73, + 648: 0xAF74, + 649: 0xAF75, + 650: 0xAF76, + 651: 0xAF77, + 652: 0xAF78, + 653: 0xAF7A, + 654: 0xAF7B, + 655: 0xAF7C, + 656: 0xAF7D, + 657: 0xAF7E, + 658: 0xAF7F, + 659: 0xAF81, + 660: 0xAF82, + 661: 0xAF83, + 662: 0xAF85, + 663: 0xAF86, + 664: 0xAF87, + 665: 0xAF89, + 666: 0xAF8A, + 667: 0xAF8B, + 668: 0xAF8C, + 669: 0xAF8D, + 670: 0xAF8E, + 671: 0xAF8F, + 672: 0xAF92, + 673: 0xAF93, + 674: 0xAF94, + 675: 0xAF96, + 676: 0xAF97, + 677: 0xAF98, + 678: 0xAF99, + 679: 0xAF9A, + 680: 0xAF9B, + 681: 0xAF9D, + 682: 0xAF9E, + 683: 0xAF9F, + 684: 0xAFA0, + 685: 0xAFA1, + 686: 0xAFA2, + 687: 0xAFA3, + 688: 0xAFA4, + 689: 0xAFA5, + 690: 0xAFA6, + 691: 0xAFA7, + 692: 0xAFA8, + 693: 0xAFA9, + 694: 0xAFAA, + 695: 0xAFAB, + 696: 0xAFAC, + 697: 0xAFAD, + 698: 0xAFAE, + 699: 0xAFAF, + 700: 0xAFB0, + 701: 0xAFB1, + 702: 0xAFB2, + 703: 0xAFB3, + 704: 0xAFB4, + 705: 0xAFB5, + 706: 0xAFB6, + 707: 0xAFB7, + 708: 0xAFBA, + 709: 0xAFBB, + 710: 0xAFBD, + 711: 0xAFBE, + 712: 0xAFBF, + 713: 0xAFC1, + 714: 0xAFC2, + 715: 0xAFC3, + 716: 0xAFC4, + 717: 0xAFC5, + 718: 0xAFC6, + 719: 0xAFCA, + 720: 0xAFCC, + 721: 0xAFCF, + 722: 0xAFD0, + 723: 0xAFD1, + 724: 0xAFD2, + 725: 0xAFD3, + 726: 0xAFD5, + 727: 0xAFD6, + 728: 0xAFD7, + 729: 0xAFD8, + 730: 0xAFD9, + 731: 0xAFDA, + 732: 0xAFDB, + 733: 0xAFDD, + 734: 0xAFDE, + 735: 0xAFDF, + 736: 0xAFE0, + 737: 0xAFE1, + 738: 0xAFE2, + 739: 0xAFE3, + 740: 0xAFE4, + 741: 0xAFE5, + 742: 0xAFE6, + 743: 0xAFE7, + 744: 0xAFEA, + 745: 0xAFEB, + 746: 0xAFEC, + 747: 0xAFED, + 748: 0xAFEE, + 749: 0xAFEF, + 750: 0xAFF2, + 751: 0xAFF3, + 752: 0xAFF5, + 753: 0xAFF6, + 754: 0xAFF7, + 755: 0xAFF9, + 756: 0xAFFA, + 757: 0xAFFB, + 758: 0xAFFC, + 759: 0xAFFD, + 760: 0xAFFE, + 761: 0xAFFF, + 762: 0xB002, + 763: 0xB003, + 764: 0xB005, + 765: 0xB006, + 766: 0xB007, + 767: 0xB008, + 768: 0xB009, + 769: 0xB00A, + 770: 0xB00B, + 771: 0xB00D, + 772: 0xB00E, + 773: 0xB00F, + 774: 0xB011, + 775: 0xB012, + 776: 0xB013, + 777: 0xB015, + 778: 0xB016, + 779: 0xB017, + 780: 0xB018, + 781: 0xB019, + 782: 0xB01A, + 783: 0xB01B, + 784: 0xB01E, + 785: 0xB01F, + 786: 0xB020, + 787: 0xB021, + 788: 0xB022, + 789: 0xB023, + 790: 0xB024, + 791: 0xB025, + 792: 0xB026, + 793: 0xB027, + 794: 0xB029, + 795: 0xB02A, + 796: 0xB02B, + 797: 0xB02C, + 798: 0xB02D, + 799: 0xB02E, + 800: 0xB02F, + 801: 0xB030, + 802: 0xB031, + 803: 0xB032, + 804: 0xB033, + 805: 0xB034, + 806: 0xB035, + 807: 0xB036, + 808: 0xB037, + 809: 0xB038, + 810: 0xB039, + 811: 0xB03A, + 812: 0xB03B, + 813: 0xB03C, + 814: 0xB03D, + 815: 0xB03E, + 816: 0xB03F, + 817: 0xB040, + 818: 0xB041, + 819: 0xB042, + 820: 0xB043, + 821: 0xB046, + 822: 0xB047, + 823: 0xB049, + 824: 0xB04B, + 825: 0xB04D, + 826: 0xB04F, + 827: 0xB050, + 828: 0xB051, + 829: 0xB052, + 830: 0xB056, + 831: 0xB058, + 832: 0xB05A, + 833: 0xB05B, + 834: 0xB05C, + 835: 0xB05E, + 836: 0xB05F, + 837: 0xB060, + 838: 0xB061, + 839: 0xB062, + 840: 0xB063, + 841: 0xB064, + 842: 0xB065, + 843: 0xB066, + 844: 0xB067, + 845: 0xB068, + 846: 0xB069, + 847: 0xB06A, + 848: 0xB06B, + 849: 0xB06C, + 850: 0xB06D, + 851: 0xB06E, + 852: 0xB06F, + 853: 0xB070, + 854: 0xB071, + 855: 0xB072, + 856: 0xB073, + 857: 0xB074, + 858: 0xB075, + 859: 0xB076, + 860: 0xB077, + 861: 0xB078, + 862: 0xB079, + 863: 0xB07A, + 864: 0xB07B, + 865: 0xB07E, + 866: 0xB07F, + 867: 0xB081, + 868: 0xB082, + 869: 0xB083, + 870: 0xB085, + 871: 0xB086, + 872: 0xB087, + 873: 0xB088, + 874: 0xB089, + 875: 0xB08A, + 876: 0xB08B, + 877: 0xB08E, + 878: 0xB090, + 879: 0xB092, + 880: 0xB093, + 881: 0xB094, + 882: 0xB095, + 883: 0xB096, + 884: 0xB097, + 885: 0xB09B, + 886: 0xB09D, + 887: 0xB09E, + 888: 0xB0A3, + 889: 0xB0A4, + 890: 0xB0A5, + 891: 0xB0A6, + 892: 0xB0A7, + 893: 0xB0AA, + 894: 0xB0B0, + 895: 0xB0B2, + 896: 0xB0B6, + 897: 0xB0B7, + 898: 0xB0B9, + 899: 0xB0BA, + 900: 0xB0BB, + 901: 0xB0BD, + 902: 0xB0BE, + 903: 0xB0BF, + 904: 0xB0C0, + 905: 0xB0C1, + 906: 0xB0C2, + 907: 0xB0C3, + 908: 0xB0C6, + 909: 0xB0CA, + 910: 0xB0CB, + 911: 0xB0CC, + 912: 0xB0CD, + 913: 0xB0CE, + 914: 0xB0CF, + 915: 0xB0D2, + 916: 0xB0D3, + 917: 0xB0D5, + 918: 0xB0D6, + 919: 0xB0D7, + 920: 0xB0D9, + 921: 0xB0DA, + 922: 0xB0DB, + 923: 0xB0DC, + 924: 0xB0DD, + 925: 0xB0DE, + 926: 0xB0DF, + 927: 0xB0E1, + 928: 0xB0E2, + 929: 0xB0E3, + 930: 0xB0E4, + 931: 0xB0E6, + 932: 0xB0E7, + 933: 0xB0E8, + 934: 0xB0E9, + 935: 0xB0EA, + 936: 0xB0EB, + 937: 0xB0EC, + 938: 0xB0ED, + 939: 0xB0EE, + 940: 0xB0EF, + 941: 0xB0F0, + 942: 0xB0F1, + 943: 0xB0F2, + 944: 0xB0F3, + 945: 0xB0F4, + 946: 0xB0F5, + 947: 0xB0F6, + 948: 0xB0F7, + 949: 0xB0F8, + 950: 0xB0F9, + 951: 0xB0FA, + 952: 0xB0FB, + 953: 0xB0FC, + 954: 0xB0FD, + 955: 0xB0FE, + 956: 0xB0FF, + 957: 0xB100, + 958: 0xB101, + 959: 0xB102, + 960: 0xB103, + 961: 0xB104, + 962: 0xB105, + 963: 0xB106, + 964: 0xB107, + 965: 0xB10A, + 966: 0xB10D, + 967: 0xB10E, + 968: 0xB10F, + 969: 0xB111, + 970: 0xB114, + 971: 0xB115, + 972: 0xB116, + 973: 0xB117, + 974: 0xB11A, + 975: 0xB11E, + 976: 0xB11F, + 977: 0xB120, + 978: 0xB121, + 979: 0xB122, + 980: 0xB126, + 981: 0xB127, + 982: 0xB129, + 983: 0xB12A, + 984: 0xB12B, + 985: 0xB12D, + 986: 0xB12E, + 987: 0xB12F, + 988: 0xB130, + 989: 0xB131, + 990: 0xB132, + 991: 0xB133, + 992: 0xB136, + 993: 0xB13A, + 994: 0xB13B, + 995: 0xB13C, + 996: 0xB13D, + 997: 0xB13E, + 998: 0xB13F, + 999: 0xB142, + 1000: 0xB143, + 1001: 0xB145, + 1002: 0xB146, + 1003: 0xB147, + 1004: 0xB149, + 1005: 0xB14A, + 1006: 0xB14B, + 1007: 0xB14C, + 1008: 0xB14D, + 1009: 0xB14E, + 1010: 0xB14F, + 1011: 0xB152, + 1012: 0xB153, + 1013: 0xB156, + 1014: 0xB157, + 1015: 0xB159, + 1016: 0xB15A, + 1017: 0xB15B, + 1018: 0xB15D, + 1019: 0xB15E, + 1020: 0xB15F, + 1021: 0xB161, + 1022: 0xB162, + 1023: 0xB163, + 1024: 0xB164, + 1025: 0xB165, + 1026: 0xB166, + 1027: 0xB167, + 1028: 0xB168, + 1029: 0xB169, + 1030: 0xB16A, + 1031: 0xB16B, + 1032: 0xB16C, + 1033: 0xB16D, + 1034: 0xB16E, + 1035: 0xB16F, + 1036: 0xB170, + 1037: 0xB171, + 1038: 0xB172, + 1039: 0xB173, + 1040: 0xB174, + 1041: 0xB175, + 1042: 0xB176, + 1043: 0xB177, + 1044: 0xB17A, + 1045: 0xB17B, + 1046: 0xB17D, + 1047: 0xB17E, + 1048: 0xB17F, + 1049: 0xB181, + 1050: 0xB183, + 1051: 0xB184, + 1052: 0xB185, + 1053: 0xB186, + 1054: 0xB187, + 1055: 0xB18A, + 1056: 0xB18C, + 1057: 0xB18E, + 1058: 0xB18F, + 1059: 0xB190, + 1060: 0xB191, + 1061: 0xB195, + 1062: 0xB196, + 1063: 0xB197, + 1064: 0xB199, + 1065: 0xB19A, + 1066: 0xB19B, + 1067: 0xB19D, + 1068: 0xB19E, + 1069: 0xB19F, + 1070: 0xB1A0, + 1071: 0xB1A1, + 1072: 0xB1A2, + 1073: 0xB1A3, + 1074: 0xB1A4, + 1075: 0xB1A5, + 1076: 0xB1A6, + 1077: 0xB1A7, + 1078: 0xB1A9, + 1079: 0xB1AA, + 1080: 0xB1AB, + 1081: 0xB1AC, + 1082: 0xB1AD, + 1083: 0xB1AE, + 1084: 0xB1AF, + 1085: 0xB1B0, + 1086: 0xB1B1, + 1087: 0xB1B2, + 1088: 0xB1B3, + 1089: 0xB1B4, + 1090: 0xB1B5, + 1091: 0xB1B6, + 1092: 0xB1B7, + 1093: 0xB1B8, + 1094: 0xB1B9, + 1095: 0xB1BA, + 1096: 0xB1BB, + 1097: 0xB1BC, + 1098: 0xB1BD, + 1099: 0xB1BE, + 1100: 0xB1BF, + 1101: 0xB1C0, + 1102: 0xB1C1, + 1103: 0xB1C2, + 1104: 0xB1C3, + 1105: 0xB1C4, + 1106: 0xB1C5, + 1107: 0xB1C6, + 1108: 0xB1C7, + 1109: 0xB1C8, + 1110: 0xB1C9, + 1111: 0xB1CA, + 1112: 0xB1CB, + 1113: 0xB1CD, + 1114: 0xB1CE, + 1115: 0xB1CF, + 1116: 0xB1D1, + 1117: 0xB1D2, + 1118: 0xB1D3, + 1119: 0xB1D5, + 1120: 0xB1D6, + 1121: 0xB1D7, + 1122: 0xB1D8, + 1123: 0xB1D9, + 1124: 0xB1DA, + 1125: 0xB1DB, + 1126: 0xB1DE, + 1127: 0xB1E0, + 1128: 0xB1E1, + 1129: 0xB1E2, + 1130: 0xB1E3, + 1131: 0xB1E4, + 1132: 0xB1E5, + 1133: 0xB1E6, + 1134: 0xB1E7, + 1135: 0xB1EA, + 1136: 0xB1EB, + 1137: 0xB1ED, + 1138: 0xB1EE, + 1139: 0xB1EF, + 1140: 0xB1F1, + 1141: 0xB1F2, + 1142: 0xB1F3, + 1143: 0xB1F4, + 1144: 0xB1F5, + 1145: 0xB1F6, + 1146: 0xB1F7, + 1147: 0xB1F8, + 1148: 0xB1FA, + 1149: 0xB1FC, + 1150: 0xB1FE, + 1151: 0xB1FF, + 1152: 0xB200, + 1153: 0xB201, + 1154: 0xB202, + 1155: 0xB203, + 1156: 0xB206, + 1157: 0xB207, + 1158: 0xB209, + 1159: 0xB20A, + 1160: 0xB20D, + 1161: 0xB20E, + 1162: 0xB20F, + 1163: 0xB210, + 1164: 0xB211, + 1165: 0xB212, + 1166: 0xB213, + 1167: 0xB216, + 1168: 0xB218, + 1169: 0xB21A, + 1170: 0xB21B, + 1171: 0xB21C, + 1172: 0xB21D, + 1173: 0xB21E, + 1174: 0xB21F, + 1175: 0xB221, + 1176: 0xB222, + 1177: 0xB223, + 1178: 0xB224, + 1179: 0xB225, + 1180: 0xB226, + 1181: 0xB227, + 1182: 0xB228, + 1183: 0xB229, + 1184: 0xB22A, + 1185: 0xB22B, + 1186: 0xB22C, + 1187: 0xB22D, + 1188: 0xB22E, + 1189: 0xB22F, + 1190: 0xB230, + 1191: 0xB231, + 1192: 0xB232, + 1193: 0xB233, + 1194: 0xB235, + 1195: 0xB236, + 1196: 0xB237, + 1197: 0xB238, + 1198: 0xB239, + 1199: 0xB23A, + 1200: 0xB23B, + 1201: 0xB23D, + 1202: 0xB23E, + 1203: 0xB23F, + 1204: 0xB240, + 1205: 0xB241, + 1206: 0xB242, + 1207: 0xB243, + 1208: 0xB244, + 1209: 0xB245, + 1210: 0xB246, + 1211: 0xB247, + 1212: 0xB248, + 1213: 0xB249, + 1214: 0xB24A, + 1215: 0xB24B, + 1216: 0xB24C, + 1217: 0xB24D, + 1218: 0xB24E, + 1219: 0xB24F, + 1220: 0xB250, + 1221: 0xB251, + 1222: 0xB252, + 1223: 0xB253, + 1224: 0xB254, + 1225: 0xB255, + 1226: 0xB256, + 1227: 0xB257, + 1228: 0xB259, + 1229: 0xB25A, + 1230: 0xB25B, + 1231: 0xB25D, + 1232: 0xB25E, + 1233: 0xB25F, + 1234: 0xB261, + 1235: 0xB262, + 1236: 0xB263, + 1237: 0xB264, + 1238: 0xB265, + 1239: 0xB266, + 1240: 0xB267, + 1241: 0xB26A, + 1242: 0xB26B, + 1243: 0xB26C, + 1244: 0xB26D, + 1245: 0xB26E, + 1246: 0xB26F, + 1247: 0xB270, + 1248: 0xB271, + 1249: 0xB272, + 1250: 0xB273, + 1251: 0xB276, + 1252: 0xB277, + 1253: 0xB278, + 1254: 0xB279, + 1255: 0xB27A, + 1256: 0xB27B, + 1257: 0xB27D, + 1258: 0xB27E, + 1259: 0xB27F, + 1260: 0xB280, + 1261: 0xB281, + 1262: 0xB282, + 1263: 0xB283, + 1264: 0xB286, + 1265: 0xB287, + 1266: 0xB288, + 1267: 0xB28A, + 1268: 0xB28B, + 1269: 0xB28C, + 1270: 0xB28D, + 1271: 0xB28E, + 1272: 0xB28F, + 1273: 0xB292, + 1274: 0xB293, + 1275: 0xB295, + 1276: 0xB296, + 1277: 0xB297, + 1278: 0xB29B, + 1279: 0xB29C, + 1280: 0xB29D, + 1281: 0xB29E, + 1282: 0xB29F, + 1283: 0xB2A2, + 1284: 0xB2A4, + 1285: 0xB2A7, + 1286: 0xB2A8, + 1287: 0xB2A9, + 1288: 0xB2AB, + 1289: 0xB2AD, + 1290: 0xB2AE, + 1291: 0xB2AF, + 1292: 0xB2B1, + 1293: 0xB2B2, + 1294: 0xB2B3, + 1295: 0xB2B5, + 1296: 0xB2B6, + 1297: 0xB2B7, + 1298: 0xB2B8, + 1299: 0xB2B9, + 1300: 0xB2BA, + 1301: 0xB2BB, + 1302: 0xB2BC, + 1303: 0xB2BD, + 1304: 0xB2BE, + 1305: 0xB2BF, + 1306: 0xB2C0, + 1307: 0xB2C1, + 1308: 0xB2C2, + 1309: 0xB2C3, + 1310: 0xB2C4, + 1311: 0xB2C5, + 1312: 0xB2C6, + 1313: 0xB2C7, + 1314: 0xB2CA, + 1315: 0xB2CB, + 1316: 0xB2CD, + 1317: 0xB2CE, + 1318: 0xB2CF, + 1319: 0xB2D1, + 1320: 0xB2D3, + 1321: 0xB2D4, + 1322: 0xB2D5, + 1323: 0xB2D6, + 1324: 0xB2D7, + 1325: 0xB2DA, + 1326: 0xB2DC, + 1327: 0xB2DE, + 1328: 0xB2DF, + 1329: 0xB2E0, + 1330: 0xB2E1, + 1331: 0xB2E3, + 1332: 0xB2E7, + 1333: 0xB2E9, + 1334: 0xB2EA, + 1335: 0xB2F0, + 1336: 0xB2F1, + 1337: 0xB2F2, + 1338: 0xB2F6, + 1339: 0xB2FC, + 1340: 0xB2FD, + 1341: 0xB2FE, + 1342: 0xB302, + 1343: 0xB303, + 1344: 0xB305, + 1345: 0xB306, + 1346: 0xB307, + 1347: 0xB309, + 1348: 0xB30A, + 1349: 0xB30B, + 1350: 0xB30C, + 1351: 0xB30D, + 1352: 0xB30E, + 1353: 0xB30F, + 1354: 0xB312, + 1355: 0xB316, + 1356: 0xB317, + 1357: 0xB318, + 1358: 0xB319, + 1359: 0xB31A, + 1360: 0xB31B, + 1361: 0xB31D, + 1362: 0xB31E, + 1363: 0xB31F, + 1364: 0xB320, + 1365: 0xB321, + 1366: 0xB322, + 1367: 0xB323, + 1368: 0xB324, + 1369: 0xB325, + 1370: 0xB326, + 1371: 0xB327, + 1372: 0xB328, + 1373: 0xB329, + 1374: 0xB32A, + 1375: 0xB32B, + 1376: 0xB32C, + 1377: 0xB32D, + 1378: 0xB32E, + 1379: 0xB32F, + 1380: 0xB330, + 1381: 0xB331, + 1382: 0xB332, + 1383: 0xB333, + 1384: 0xB334, + 1385: 0xB335, + 1386: 0xB336, + 1387: 0xB337, + 1388: 0xB338, + 1389: 0xB339, + 1390: 0xB33A, + 1391: 0xB33B, + 1392: 0xB33C, + 1393: 0xB33D, + 1394: 0xB33E, + 1395: 0xB33F, + 1396: 0xB340, + 1397: 0xB341, + 1398: 0xB342, + 1399: 0xB343, + 1400: 0xB344, + 1401: 0xB345, + 1402: 0xB346, + 1403: 0xB347, + 1404: 0xB348, + 1405: 0xB349, + 1406: 0xB34A, + 1407: 0xB34B, + 1408: 0xB34C, + 1409: 0xB34D, + 1410: 0xB34E, + 1411: 0xB34F, + 1412: 0xB350, + 1413: 0xB351, + 1414: 0xB352, + 1415: 0xB353, + 1416: 0xB357, + 1417: 0xB359, + 1418: 0xB35A, + 1419: 0xB35D, + 1420: 0xB360, + 1421: 0xB361, + 1422: 0xB362, + 1423: 0xB363, + 1424: 0xB366, + 1425: 0xB368, + 1426: 0xB36A, + 1427: 0xB36C, + 1428: 0xB36D, + 1429: 0xB36F, + 1430: 0xB372, + 1431: 0xB373, + 1432: 0xB375, + 1433: 0xB376, + 1434: 0xB377, + 1435: 0xB379, + 1436: 0xB37A, + 1437: 0xB37B, + 1438: 0xB37C, + 1439: 0xB37D, + 1440: 0xB37E, + 1441: 0xB37F, + 1442: 0xB382, + 1443: 0xB386, + 1444: 0xB387, + 1445: 0xB388, + 1446: 0xB389, + 1447: 0xB38A, + 1448: 0xB38B, + 1449: 0xB38D, + 1450: 0xB38E, + 1451: 0xB38F, + 1452: 0xB391, + 1453: 0xB392, + 1454: 0xB393, + 1455: 0xB395, + 1456: 0xB396, + 1457: 0xB397, + 1458: 0xB398, + 1459: 0xB399, + 1460: 0xB39A, + 1461: 0xB39B, + 1462: 0xB39C, + 1463: 0xB39D, + 1464: 0xB39E, + 1465: 0xB39F, + 1466: 0xB3A2, + 1467: 0xB3A3, + 1468: 0xB3A4, + 1469: 0xB3A5, + 1470: 0xB3A6, + 1471: 0xB3A7, + 1472: 0xB3A9, + 1473: 0xB3AA, + 1474: 0xB3AB, + 1475: 0xB3AD, + 1476: 0xB3AE, + 1477: 0xB3AF, + 1478: 0xB3B0, + 1479: 0xB3B1, + 1480: 0xB3B2, + 1481: 0xB3B3, + 1482: 0xB3B4, + 1483: 0xB3B5, + 1484: 0xB3B6, + 1485: 0xB3B7, + 1486: 0xB3B8, + 1487: 0xB3B9, + 1488: 0xB3BA, + 1489: 0xB3BB, + 1490: 0xB3BC, + 1491: 0xB3BD, + 1492: 0xB3BE, + 1493: 0xB3BF, + 1494: 0xB3C0, + 1495: 0xB3C1, + 1496: 0xB3C2, + 1497: 0xB3C3, + 1498: 0xB3C6, + 1499: 0xB3C7, + 1500: 0xB3C9, + 1501: 0xB3CA, + 1502: 0xB3CD, + 1503: 0xB3CF, + 1504: 0xB3D1, + 1505: 0xB3D2, + 1506: 0xB3D3, + 1507: 0xB3D6, + 1508: 0xB3D8, + 1509: 0xB3DA, + 1510: 0xB3DC, + 1511: 0xB3DE, + 1512: 0xB3DF, + 1513: 0xB3E1, + 1514: 0xB3E2, + 1515: 0xB3E3, + 1516: 0xB3E5, + 1517: 0xB3E6, + 1518: 0xB3E7, + 1519: 0xB3E9, + 1520: 0xB3EA, + 1521: 0xB3EB, + 1522: 0xB3EC, + 1523: 0xB3ED, + 1524: 0xB3EE, + 1525: 0xB3EF, + 1526: 0xB3F0, + 1527: 0xB3F1, + 1528: 0xB3F2, + 1529: 0xB3F3, + 1530: 0xB3F4, + 1531: 0xB3F5, + 1532: 0xB3F6, + 1533: 0xB3F7, + 1534: 0xB3F8, + 1535: 0xB3F9, + 1536: 0xB3FA, + 1537: 0xB3FB, + 1538: 0xB3FD, + 1539: 0xB3FE, + 1540: 0xB3FF, + 1541: 0xB400, + 1542: 0xB401, + 1543: 0xB402, + 1544: 0xB403, + 1545: 0xB404, + 1546: 0xB405, + 1547: 0xB406, + 1548: 0xB407, + 1549: 0xB408, + 1550: 0xB409, + 1551: 0xB40A, + 1552: 0xB40B, + 1553: 0xB40C, + 1554: 0xB40D, + 1555: 0xB40E, + 1556: 0xB40F, + 1557: 0xB411, + 1558: 0xB412, + 1559: 0xB413, + 1560: 0xB414, + 1561: 0xB415, + 1562: 0xB416, + 1563: 0xB417, + 1564: 0xB419, + 1565: 0xB41A, + 1566: 0xB41B, + 1567: 0xB41D, + 1568: 0xB41E, + 1569: 0xB41F, + 1570: 0xB421, + 1571: 0xB422, + 1572: 0xB423, + 1573: 0xB424, + 1574: 0xB425, + 1575: 0xB426, + 1576: 0xB427, + 1577: 0xB42A, + 1578: 0xB42C, + 1579: 0xB42D, + 1580: 0xB42E, + 1581: 0xB42F, + 1582: 0xB430, + 1583: 0xB431, + 1584: 0xB432, + 1585: 0xB433, + 1586: 0xB435, + 1587: 0xB436, + 1588: 0xB437, + 1589: 0xB438, + 1590: 0xB439, + 1591: 0xB43A, + 1592: 0xB43B, + 1593: 0xB43C, + 1594: 0xB43D, + 1595: 0xB43E, + 1596: 0xB43F, + 1597: 0xB440, + 1598: 0xB441, + 1599: 0xB442, + 1600: 0xB443, + 1601: 0xB444, + 1602: 0xB445, + 1603: 0xB446, + 1604: 0xB447, + 1605: 0xB448, + 1606: 0xB449, + 1607: 0xB44A, + 1608: 0xB44B, + 1609: 0xB44C, + 1610: 0xB44D, + 1611: 0xB44E, + 1612: 0xB44F, + 1613: 0xB452, + 1614: 0xB453, + 1615: 0xB455, + 1616: 0xB456, + 1617: 0xB457, + 1618: 0xB459, + 1619: 0xB45A, + 1620: 0xB45B, + 1621: 0xB45C, + 1622: 0xB45D, + 1623: 0xB45E, + 1624: 0xB45F, + 1625: 0xB462, + 1626: 0xB464, + 1627: 0xB466, + 1628: 0xB467, + 1629: 0xB468, + 1630: 0xB469, + 1631: 0xB46A, + 1632: 0xB46B, + 1633: 0xB46D, + 1634: 0xB46E, + 1635: 0xB46F, + 1636: 0xB470, + 1637: 0xB471, + 1638: 0xB472, + 1639: 0xB473, + 1640: 0xB474, + 1641: 0xB475, + 1642: 0xB476, + 1643: 0xB477, + 1644: 0xB478, + 1645: 0xB479, + 1646: 0xB47A, + 1647: 0xB47B, + 1648: 0xB47C, + 1649: 0xB47D, + 1650: 0xB47E, + 1651: 0xB47F, + 1652: 0xB481, + 1653: 0xB482, + 1654: 0xB483, + 1655: 0xB484, + 1656: 0xB485, + 1657: 0xB486, + 1658: 0xB487, + 1659: 0xB489, + 1660: 0xB48A, + 1661: 0xB48B, + 1662: 0xB48C, + 1663: 0xB48D, + 1664: 0xB48E, + 1665: 0xB48F, + 1666: 0xB490, + 1667: 0xB491, + 1668: 0xB492, + 1669: 0xB493, + 1670: 0xB494, + 1671: 0xB495, + 1672: 0xB496, + 1673: 0xB497, + 1674: 0xB498, + 1675: 0xB499, + 1676: 0xB49A, + 1677: 0xB49B, + 1678: 0xB49C, + 1679: 0xB49E, + 1680: 0xB49F, + 1681: 0xB4A0, + 1682: 0xB4A1, + 1683: 0xB4A2, + 1684: 0xB4A3, + 1685: 0xB4A5, + 1686: 0xB4A6, + 1687: 0xB4A7, + 1688: 0xB4A9, + 1689: 0xB4AA, + 1690: 0xB4AB, + 1691: 0xB4AD, + 1692: 0xB4AE, + 1693: 0xB4AF, + 1694: 0xB4B0, + 1695: 0xB4B1, + 1696: 0xB4B2, + 1697: 0xB4B3, + 1698: 0xB4B4, + 1699: 0xB4B6, + 1700: 0xB4B8, + 1701: 0xB4BA, + 1702: 0xB4BB, + 1703: 0xB4BC, + 1704: 0xB4BD, + 1705: 0xB4BE, + 1706: 0xB4BF, + 1707: 0xB4C1, + 1708: 0xB4C2, + 1709: 0xB4C3, + 1710: 0xB4C5, + 1711: 0xB4C6, + 1712: 0xB4C7, + 1713: 0xB4C9, + 1714: 0xB4CA, + 1715: 0xB4CB, + 1716: 0xB4CC, + 1717: 0xB4CD, + 1718: 0xB4CE, + 1719: 0xB4CF, + 1720: 0xB4D1, + 1721: 0xB4D2, + 1722: 0xB4D3, + 1723: 0xB4D4, + 1724: 0xB4D6, + 1725: 0xB4D7, + 1726: 0xB4D8, + 1727: 0xB4D9, + 1728: 0xB4DA, + 1729: 0xB4DB, + 1730: 0xB4DE, + 1731: 0xB4DF, + 1732: 0xB4E1, + 1733: 0xB4E2, + 1734: 0xB4E5, + 1735: 0xB4E7, + 1736: 0xB4E8, + 1737: 0xB4E9, + 1738: 0xB4EA, + 1739: 0xB4EB, + 1740: 0xB4EE, + 1741: 0xB4F0, + 1742: 0xB4F2, + 1743: 0xB4F3, + 1744: 0xB4F4, + 1745: 0xB4F5, + 1746: 0xB4F6, + 1747: 0xB4F7, + 1748: 0xB4F9, + 1749: 0xB4FA, + 1750: 0xB4FB, + 1751: 0xB4FC, + 1752: 0xB4FD, + 1753: 0xB4FE, + 1754: 0xB4FF, + 1755: 0xB500, + 1756: 0xB501, + 1757: 0xB502, + 1758: 0xB503, + 1759: 0xB504, + 1760: 0xB505, + 1761: 0xB506, + 1762: 0xB507, + 1763: 0xB508, + 1764: 0xB509, + 1765: 0xB50A, + 1766: 0xB50B, + 1767: 0xB50C, + 1768: 0xB50D, + 1769: 0xB50E, + 1770: 0xB50F, + 1771: 0xB510, + 1772: 0xB511, + 1773: 0xB512, + 1774: 0xB513, + 1775: 0xB516, + 1776: 0xB517, + 1777: 0xB519, + 1778: 0xB51A, + 1779: 0xB51D, + 1780: 0xB51E, + 1781: 0xB51F, + 1782: 0xB520, + 1783: 0xB521, + 1784: 0xB522, + 1785: 0xB523, + 1786: 0xB526, + 1787: 0xB52B, + 1788: 0xB52C, + 1789: 0xB52D, + 1790: 0xB52E, + 1791: 0xB52F, + 1792: 0xB532, + 1793: 0xB533, + 1794: 0xB535, + 1795: 0xB536, + 1796: 0xB537, + 1797: 0xB539, + 1798: 0xB53A, + 1799: 0xB53B, + 1800: 0xB53C, + 1801: 0xB53D, + 1802: 0xB53E, + 1803: 0xB53F, + 1804: 0xB542, + 1805: 0xB546, + 1806: 0xB547, + 1807: 0xB548, + 1808: 0xB549, + 1809: 0xB54A, + 1810: 0xB54E, + 1811: 0xB54F, + 1812: 0xB551, + 1813: 0xB552, + 1814: 0xB553, + 1815: 0xB555, + 1816: 0xB556, + 1817: 0xB557, + 1818: 0xB558, + 1819: 0xB559, + 1820: 0xB55A, + 1821: 0xB55B, + 1822: 0xB55E, + 1823: 0xB562, + 1824: 0xB563, + 1825: 0xB564, + 1826: 0xB565, + 1827: 0xB566, + 1828: 0xB567, + 1829: 0xB568, + 1830: 0xB569, + 1831: 0xB56A, + 1832: 0xB56B, + 1833: 0xB56C, + 1834: 0xB56D, + 1835: 0xB56E, + 1836: 0xB56F, + 1837: 0xB570, + 1838: 0xB571, + 1839: 0xB572, + 1840: 0xB573, + 1841: 0xB574, + 1842: 0xB575, + 1843: 0xB576, + 1844: 0xB577, + 1845: 0xB578, + 1846: 0xB579, + 1847: 0xB57A, + 1848: 0xB57B, + 1849: 0xB57C, + 1850: 0xB57D, + 1851: 0xB57E, + 1852: 0xB57F, + 1853: 0xB580, + 1854: 0xB581, + 1855: 0xB582, + 1856: 0xB583, + 1857: 0xB584, + 1858: 0xB585, + 1859: 0xB586, + 1860: 0xB587, + 1861: 0xB588, + 1862: 0xB589, + 1863: 0xB58A, + 1864: 0xB58B, + 1865: 0xB58C, + 1866: 0xB58D, + 1867: 0xB58E, + 1868: 0xB58F, + 1869: 0xB590, + 1870: 0xB591, + 1871: 0xB592, + 1872: 0xB593, + 1873: 0xB594, + 1874: 0xB595, + 1875: 0xB596, + 1876: 0xB597, + 1877: 0xB598, + 1878: 0xB599, + 1879: 0xB59A, + 1880: 0xB59B, + 1881: 0xB59C, + 1882: 0xB59D, + 1883: 0xB59E, + 1884: 0xB59F, + 1885: 0xB5A2, + 1886: 0xB5A3, + 1887: 0xB5A5, + 1888: 0xB5A6, + 1889: 0xB5A7, + 1890: 0xB5A9, + 1891: 0xB5AC, + 1892: 0xB5AD, + 1893: 0xB5AE, + 1894: 0xB5AF, + 1895: 0xB5B2, + 1896: 0xB5B6, + 1897: 0xB5B7, + 1898: 0xB5B8, + 1899: 0xB5B9, + 1900: 0xB5BA, + 1901: 0xB5BE, + 1902: 0xB5BF, + 1903: 0xB5C1, + 1904: 0xB5C2, + 1905: 0xB5C3, + 1906: 0xB5C5, + 1907: 0xB5C6, + 1908: 0xB5C7, + 1909: 0xB5C8, + 1910: 0xB5C9, + 1911: 0xB5CA, + 1912: 0xB5CB, + 1913: 0xB5CE, + 1914: 0xB5D2, + 1915: 0xB5D3, + 1916: 0xB5D4, + 1917: 0xB5D5, + 1918: 0xB5D6, + 1919: 0xB5D7, + 1920: 0xB5D9, + 1921: 0xB5DA, + 1922: 0xB5DB, + 1923: 0xB5DC, + 1924: 0xB5DD, + 1925: 0xB5DE, + 1926: 0xB5DF, + 1927: 0xB5E0, + 1928: 0xB5E1, + 1929: 0xB5E2, + 1930: 0xB5E3, + 1931: 0xB5E4, + 1932: 0xB5E5, + 1933: 0xB5E6, + 1934: 0xB5E7, + 1935: 0xB5E8, + 1936: 0xB5E9, + 1937: 0xB5EA, + 1938: 0xB5EB, + 1939: 0xB5ED, + 1940: 0xB5EE, + 1941: 0xB5EF, + 1942: 0xB5F0, + 1943: 0xB5F1, + 1944: 0xB5F2, + 1945: 0xB5F3, + 1946: 0xB5F4, + 1947: 0xB5F5, + 1948: 0xB5F6, + 1949: 0xB5F7, + 1950: 0xB5F8, + 1951: 0xB5F9, + 1952: 0xB5FA, + 1953: 0xB5FB, + 1954: 0xB5FC, + 1955: 0xB5FD, + 1956: 0xB5FE, + 1957: 0xB5FF, + 1958: 0xB600, + 1959: 0xB601, + 1960: 0xB602, + 1961: 0xB603, + 1962: 0xB604, + 1963: 0xB605, + 1964: 0xB606, + 1965: 0xB607, + 1966: 0xB608, + 1967: 0xB609, + 1968: 0xB60A, + 1969: 0xB60B, + 1970: 0xB60C, + 1971: 0xB60D, + 1972: 0xB60E, + 1973: 0xB60F, + 1974: 0xB612, + 1975: 0xB613, + 1976: 0xB615, + 1977: 0xB616, + 1978: 0xB617, + 1979: 0xB619, + 1980: 0xB61A, + 1981: 0xB61B, + 1982: 0xB61C, + 1983: 0xB61D, + 1984: 0xB61E, + 1985: 0xB61F, + 1986: 0xB620, + 1987: 0xB621, + 1988: 0xB622, + 1989: 0xB623, + 1990: 0xB624, + 1991: 0xB626, + 1992: 0xB627, + 1993: 0xB628, + 1994: 0xB629, + 1995: 0xB62A, + 1996: 0xB62B, + 1997: 0xB62D, + 1998: 0xB62E, + 1999: 0xB62F, + 2000: 0xB630, + 2001: 0xB631, + 2002: 0xB632, + 2003: 0xB633, + 2004: 0xB635, + 2005: 0xB636, + 2006: 0xB637, + 2007: 0xB638, + 2008: 0xB639, + 2009: 0xB63A, + 2010: 0xB63B, + 2011: 0xB63C, + 2012: 0xB63D, + 2013: 0xB63E, + 2014: 0xB63F, + 2015: 0xB640, + 2016: 0xB641, + 2017: 0xB642, + 2018: 0xB643, + 2019: 0xB644, + 2020: 0xB645, + 2021: 0xB646, + 2022: 0xB647, + 2023: 0xB649, + 2024: 0xB64A, + 2025: 0xB64B, + 2026: 0xB64C, + 2027: 0xB64D, + 2028: 0xB64E, + 2029: 0xB64F, + 2030: 0xB650, + 2031: 0xB651, + 2032: 0xB652, + 2033: 0xB653, + 2034: 0xB654, + 2035: 0xB655, + 2036: 0xB656, + 2037: 0xB657, + 2038: 0xB658, + 2039: 0xB659, + 2040: 0xB65A, + 2041: 0xB65B, + 2042: 0xB65C, + 2043: 0xB65D, + 2044: 0xB65E, + 2045: 0xB65F, + 2046: 0xB660, + 2047: 0xB661, + 2048: 0xB662, + 2049: 0xB663, + 2050: 0xB665, + 2051: 0xB666, + 2052: 0xB667, + 2053: 0xB669, + 2054: 0xB66A, + 2055: 0xB66B, + 2056: 0xB66C, + 2057: 0xB66D, + 2058: 0xB66E, + 2059: 0xB66F, + 2060: 0xB670, + 2061: 0xB671, + 2062: 0xB672, + 2063: 0xB673, + 2064: 0xB674, + 2065: 0xB675, + 2066: 0xB676, + 2067: 0xB677, + 2068: 0xB678, + 2069: 0xB679, + 2070: 0xB67A, + 2071: 0xB67B, + 2072: 0xB67C, + 2073: 0xB67D, + 2074: 0xB67E, + 2075: 0xB67F, + 2076: 0xB680, + 2077: 0xB681, + 2078: 0xB682, + 2079: 0xB683, + 2080: 0xB684, + 2081: 0xB685, + 2082: 0xB686, + 2083: 0xB687, + 2084: 0xB688, + 2085: 0xB689, + 2086: 0xB68A, + 2087: 0xB68B, + 2088: 0xB68C, + 2089: 0xB68D, + 2090: 0xB68E, + 2091: 0xB68F, + 2092: 0xB690, + 2093: 0xB691, + 2094: 0xB692, + 2095: 0xB693, + 2096: 0xB694, + 2097: 0xB695, + 2098: 0xB696, + 2099: 0xB697, + 2100: 0xB698, + 2101: 0xB699, + 2102: 0xB69A, + 2103: 0xB69B, + 2104: 0xB69E, + 2105: 0xB69F, + 2106: 0xB6A1, + 2107: 0xB6A2, + 2108: 0xB6A3, + 2109: 0xB6A5, + 2110: 0xB6A6, + 2111: 0xB6A7, + 2112: 0xB6A8, + 2113: 0xB6A9, + 2114: 0xB6AA, + 2115: 0xB6AD, + 2116: 0xB6AE, + 2117: 0xB6AF, + 2118: 0xB6B0, + 2119: 0xB6B2, + 2120: 0xB6B3, + 2121: 0xB6B4, + 2122: 0xB6B5, + 2123: 0xB6B6, + 2124: 0xB6B7, + 2125: 0xB6B8, + 2126: 0xB6B9, + 2127: 0xB6BA, + 2128: 0xB6BB, + 2129: 0xB6BC, + 2130: 0xB6BD, + 2131: 0xB6BE, + 2132: 0xB6BF, + 2133: 0xB6C0, + 2134: 0xB6C1, + 2135: 0xB6C2, + 2136: 0xB6C3, + 2137: 0xB6C4, + 2138: 0xB6C5, + 2139: 0xB6C6, + 2140: 0xB6C7, + 2141: 0xB6C8, + 2142: 0xB6C9, + 2143: 0xB6CA, + 2144: 0xB6CB, + 2145: 0xB6CC, + 2146: 0xB6CD, + 2147: 0xB6CE, + 2148: 0xB6CF, + 2149: 0xB6D0, + 2150: 0xB6D1, + 2151: 0xB6D2, + 2152: 0xB6D3, + 2153: 0xB6D5, + 2154: 0xB6D6, + 2155: 0xB6D7, + 2156: 0xB6D8, + 2157: 0xB6D9, + 2158: 0xB6DA, + 2159: 0xB6DB, + 2160: 0xB6DC, + 2161: 0xB6DD, + 2162: 0xB6DE, + 2163: 0xB6DF, + 2164: 0xB6E0, + 2165: 0xB6E1, + 2166: 0xB6E2, + 2167: 0xB6E3, + 2168: 0xB6E4, + 2169: 0xB6E5, + 2170: 0xB6E6, + 2171: 0xB6E7, + 2172: 0xB6E8, + 2173: 0xB6E9, + 2174: 0xB6EA, + 2175: 0xB6EB, + 2176: 0xB6EC, + 2177: 0xB6ED, + 2178: 0xB6EE, + 2179: 0xB6EF, + 2180: 0xB6F1, + 2181: 0xB6F2, + 2182: 0xB6F3, + 2183: 0xB6F5, + 2184: 0xB6F6, + 2185: 0xB6F7, + 2186: 0xB6F9, + 2187: 0xB6FA, + 2188: 0xB6FB, + 2189: 0xB6FC, + 2190: 0xB6FD, + 2191: 0xB6FE, + 2192: 0xB6FF, + 2193: 0xB702, + 2194: 0xB703, + 2195: 0xB704, + 2196: 0xB706, + 2197: 0xB707, + 2198: 0xB708, + 2199: 0xB709, + 2200: 0xB70A, + 2201: 0xB70B, + 2202: 0xB70C, + 2203: 0xB70D, + 2204: 0xB70E, + 2205: 0xB70F, + 2206: 0xB710, + 2207: 0xB711, + 2208: 0xB712, + 2209: 0xB713, + 2210: 0xB714, + 2211: 0xB715, + 2212: 0xB716, + 2213: 0xB717, + 2214: 0xB718, + 2215: 0xB719, + 2216: 0xB71A, + 2217: 0xB71B, + 2218: 0xB71C, + 2219: 0xB71D, + 2220: 0xB71E, + 2221: 0xB71F, + 2222: 0xB720, + 2223: 0xB721, + 2224: 0xB722, + 2225: 0xB723, + 2226: 0xB724, + 2227: 0xB725, + 2228: 0xB726, + 2229: 0xB727, + 2230: 0xB72A, + 2231: 0xB72B, + 2232: 0xB72D, + 2233: 0xB72E, + 2234: 0xB731, + 2235: 0xB732, + 2236: 0xB733, + 2237: 0xB734, + 2238: 0xB735, + 2239: 0xB736, + 2240: 0xB737, + 2241: 0xB73A, + 2242: 0xB73C, + 2243: 0xB73D, + 2244: 0xB73E, + 2245: 0xB73F, + 2246: 0xB740, + 2247: 0xB741, + 2248: 0xB742, + 2249: 0xB743, + 2250: 0xB745, + 2251: 0xB746, + 2252: 0xB747, + 2253: 0xB749, + 2254: 0xB74A, + 2255: 0xB74B, + 2256: 0xB74D, + 2257: 0xB74E, + 2258: 0xB74F, + 2259: 0xB750, + 2260: 0xB751, + 2261: 0xB752, + 2262: 0xB753, + 2263: 0xB756, + 2264: 0xB757, + 2265: 0xB758, + 2266: 0xB759, + 2267: 0xB75A, + 2268: 0xB75B, + 2269: 0xB75C, + 2270: 0xB75D, + 2271: 0xB75E, + 2272: 0xB75F, + 2273: 0xB761, + 2274: 0xB762, + 2275: 0xB763, + 2276: 0xB765, + 2277: 0xB766, + 2278: 0xB767, + 2279: 0xB769, + 2280: 0xB76A, + 2281: 0xB76B, + 2282: 0xB76C, + 2283: 0xB76D, + 2284: 0xB76E, + 2285: 0xB76F, + 2286: 0xB772, + 2287: 0xB774, + 2288: 0xB776, + 2289: 0xB777, + 2290: 0xB778, + 2291: 0xB779, + 2292: 0xB77A, + 2293: 0xB77B, + 2294: 0xB77E, + 2295: 0xB77F, + 2296: 0xB781, + 2297: 0xB782, + 2298: 0xB783, + 2299: 0xB785, + 2300: 0xB786, + 2301: 0xB787, + 2302: 0xB788, + 2303: 0xB789, + 2304: 0xB78A, + 2305: 0xB78B, + 2306: 0xB78E, + 2307: 0xB793, + 2308: 0xB794, + 2309: 0xB795, + 2310: 0xB79A, + 2311: 0xB79B, + 2312: 0xB79D, + 2313: 0xB79E, + 2314: 0xB79F, + 2315: 0xB7A1, + 2316: 0xB7A2, + 2317: 0xB7A3, + 2318: 0xB7A4, + 2319: 0xB7A5, + 2320: 0xB7A6, + 2321: 0xB7A7, + 2322: 0xB7AA, + 2323: 0xB7AE, + 2324: 0xB7AF, + 2325: 0xB7B0, + 2326: 0xB7B1, + 2327: 0xB7B2, + 2328: 0xB7B3, + 2329: 0xB7B6, + 2330: 0xB7B7, + 2331: 0xB7B9, + 2332: 0xB7BA, + 2333: 0xB7BB, + 2334: 0xB7BC, + 2335: 0xB7BD, + 2336: 0xB7BE, + 2337: 0xB7BF, + 2338: 0xB7C0, + 2339: 0xB7C1, + 2340: 0xB7C2, + 2341: 0xB7C3, + 2342: 0xB7C4, + 2343: 0xB7C5, + 2344: 0xB7C6, + 2345: 0xB7C8, + 2346: 0xB7CA, + 2347: 0xB7CB, + 2348: 0xB7CC, + 2349: 0xB7CD, + 2350: 0xB7CE, + 2351: 0xB7CF, + 2352: 0xB7D0, + 2353: 0xB7D1, + 2354: 0xB7D2, + 2355: 0xB7D3, + 2356: 0xB7D4, + 2357: 0xB7D5, + 2358: 0xB7D6, + 2359: 0xB7D7, + 2360: 0xB7D8, + 2361: 0xB7D9, + 2362: 0xB7DA, + 2363: 0xB7DB, + 2364: 0xB7DC, + 2365: 0xB7DD, + 2366: 0xB7DE, + 2367: 0xB7DF, + 2368: 0xB7E0, + 2369: 0xB7E1, + 2370: 0xB7E2, + 2371: 0xB7E3, + 2372: 0xB7E4, + 2373: 0xB7E5, + 2374: 0xB7E6, + 2375: 0xB7E7, + 2376: 0xB7E8, + 2377: 0xB7E9, + 2378: 0xB7EA, + 2379: 0xB7EB, + 2380: 0xB7EE, + 2381: 0xB7EF, + 2382: 0xB7F1, + 2383: 0xB7F2, + 2384: 0xB7F3, + 2385: 0xB7F5, + 2386: 0xB7F6, + 2387: 0xB7F7, + 2388: 0xB7F8, + 2389: 0xB7F9, + 2390: 0xB7FA, + 2391: 0xB7FB, + 2392: 0xB7FE, + 2393: 0xB802, + 2394: 0xB803, + 2395: 0xB804, + 2396: 0xB805, + 2397: 0xB806, + 2398: 0xB80A, + 2399: 0xB80B, + 2400: 0xB80D, + 2401: 0xB80E, + 2402: 0xB80F, + 2403: 0xB811, + 2404: 0xB812, + 2405: 0xB813, + 2406: 0xB814, + 2407: 0xB815, + 2408: 0xB816, + 2409: 0xB817, + 2410: 0xB81A, + 2411: 0xB81C, + 2412: 0xB81E, + 2413: 0xB81F, + 2414: 0xB820, + 2415: 0xB821, + 2416: 0xB822, + 2417: 0xB823, + 2418: 0xB826, + 2419: 0xB827, + 2420: 0xB829, + 2421: 0xB82A, + 2422: 0xB82B, + 2423: 0xB82D, + 2424: 0xB82E, + 2425: 0xB82F, + 2426: 0xB830, + 2427: 0xB831, + 2428: 0xB832, + 2429: 0xB833, + 2430: 0xB836, + 2431: 0xB83A, + 2432: 0xB83B, + 2433: 0xB83C, + 2434: 0xB83D, + 2435: 0xB83E, + 2436: 0xB83F, + 2437: 0xB841, + 2438: 0xB842, + 2439: 0xB843, + 2440: 0xB845, + 2441: 0xB846, + 2442: 0xB847, + 2443: 0xB848, + 2444: 0xB849, + 2445: 0xB84A, + 2446: 0xB84B, + 2447: 0xB84C, + 2448: 0xB84D, + 2449: 0xB84E, + 2450: 0xB84F, + 2451: 0xB850, + 2452: 0xB852, + 2453: 0xB854, + 2454: 0xB855, + 2455: 0xB856, + 2456: 0xB857, + 2457: 0xB858, + 2458: 0xB859, + 2459: 0xB85A, + 2460: 0xB85B, + 2461: 0xB85E, + 2462: 0xB85F, + 2463: 0xB861, + 2464: 0xB862, + 2465: 0xB863, + 2466: 0xB865, + 2467: 0xB866, + 2468: 0xB867, + 2469: 0xB868, + 2470: 0xB869, + 2471: 0xB86A, + 2472: 0xB86B, + 2473: 0xB86E, + 2474: 0xB870, + 2475: 0xB872, + 2476: 0xB873, + 2477: 0xB874, + 2478: 0xB875, + 2479: 0xB876, + 2480: 0xB877, + 2481: 0xB879, + 2482: 0xB87A, + 2483: 0xB87B, + 2484: 0xB87D, + 2485: 0xB87E, + 2486: 0xB87F, + 2487: 0xB880, + 2488: 0xB881, + 2489: 0xB882, + 2490: 0xB883, + 2491: 0xB884, + 2492: 0xB885, + 2493: 0xB886, + 2494: 0xB887, + 2495: 0xB888, + 2496: 0xB889, + 2497: 0xB88A, + 2498: 0xB88B, + 2499: 0xB88C, + 2500: 0xB88E, + 2501: 0xB88F, + 2502: 0xB890, + 2503: 0xB891, + 2504: 0xB892, + 2505: 0xB893, + 2506: 0xB894, + 2507: 0xB895, + 2508: 0xB896, + 2509: 0xB897, + 2510: 0xB898, + 2511: 0xB899, + 2512: 0xB89A, + 2513: 0xB89B, + 2514: 0xB89C, + 2515: 0xB89D, + 2516: 0xB89E, + 2517: 0xB89F, + 2518: 0xB8A0, + 2519: 0xB8A1, + 2520: 0xB8A2, + 2521: 0xB8A3, + 2522: 0xB8A4, + 2523: 0xB8A5, + 2524: 0xB8A6, + 2525: 0xB8A7, + 2526: 0xB8A9, + 2527: 0xB8AA, + 2528: 0xB8AB, + 2529: 0xB8AC, + 2530: 0xB8AD, + 2531: 0xB8AE, + 2532: 0xB8AF, + 2533: 0xB8B1, + 2534: 0xB8B2, + 2535: 0xB8B3, + 2536: 0xB8B5, + 2537: 0xB8B6, + 2538: 0xB8B7, + 2539: 0xB8B9, + 2540: 0xB8BA, + 2541: 0xB8BB, + 2542: 0xB8BC, + 2543: 0xB8BD, + 2544: 0xB8BE, + 2545: 0xB8BF, + 2546: 0xB8C2, + 2547: 0xB8C4, + 2548: 0xB8C6, + 2549: 0xB8C7, + 2550: 0xB8C8, + 2551: 0xB8C9, + 2552: 0xB8CA, + 2553: 0xB8CB, + 2554: 0xB8CD, + 2555: 0xB8CE, + 2556: 0xB8CF, + 2557: 0xB8D1, + 2558: 0xB8D2, + 2559: 0xB8D3, + 2560: 0xB8D5, + 2561: 0xB8D6, + 2562: 0xB8D7, + 2563: 0xB8D8, + 2564: 0xB8D9, + 2565: 0xB8DA, + 2566: 0xB8DB, + 2567: 0xB8DC, + 2568: 0xB8DE, + 2569: 0xB8E0, + 2570: 0xB8E2, + 2571: 0xB8E3, + 2572: 0xB8E4, + 2573: 0xB8E5, + 2574: 0xB8E6, + 2575: 0xB8E7, + 2576: 0xB8EA, + 2577: 0xB8EB, + 2578: 0xB8ED, + 2579: 0xB8EE, + 2580: 0xB8EF, + 2581: 0xB8F1, + 2582: 0xB8F2, + 2583: 0xB8F3, + 2584: 0xB8F4, + 2585: 0xB8F5, + 2586: 0xB8F6, + 2587: 0xB8F7, + 2588: 0xB8FA, + 2589: 0xB8FC, + 2590: 0xB8FE, + 2591: 0xB8FF, + 2592: 0xB900, + 2593: 0xB901, + 2594: 0xB902, + 2595: 0xB903, + 2596: 0xB905, + 2597: 0xB906, + 2598: 0xB907, + 2599: 0xB908, + 2600: 0xB909, + 2601: 0xB90A, + 2602: 0xB90B, + 2603: 0xB90C, + 2604: 0xB90D, + 2605: 0xB90E, + 2606: 0xB90F, + 2607: 0xB910, + 2608: 0xB911, + 2609: 0xB912, + 2610: 0xB913, + 2611: 0xB914, + 2612: 0xB915, + 2613: 0xB916, + 2614: 0xB917, + 2615: 0xB919, + 2616: 0xB91A, + 2617: 0xB91B, + 2618: 0xB91C, + 2619: 0xB91D, + 2620: 0xB91E, + 2621: 0xB91F, + 2622: 0xB921, + 2623: 0xB922, + 2624: 0xB923, + 2625: 0xB924, + 2626: 0xB925, + 2627: 0xB926, + 2628: 0xB927, + 2629: 0xB928, + 2630: 0xB929, + 2631: 0xB92A, + 2632: 0xB92B, + 2633: 0xB92C, + 2634: 0xB92D, + 2635: 0xB92E, + 2636: 0xB92F, + 2637: 0xB930, + 2638: 0xB931, + 2639: 0xB932, + 2640: 0xB933, + 2641: 0xB934, + 2642: 0xB935, + 2643: 0xB936, + 2644: 0xB937, + 2645: 0xB938, + 2646: 0xB939, + 2647: 0xB93A, + 2648: 0xB93B, + 2649: 0xB93E, + 2650: 0xB93F, + 2651: 0xB941, + 2652: 0xB942, + 2653: 0xB943, + 2654: 0xB945, + 2655: 0xB946, + 2656: 0xB947, + 2657: 0xB948, + 2658: 0xB949, + 2659: 0xB94A, + 2660: 0xB94B, + 2661: 0xB94D, + 2662: 0xB94E, + 2663: 0xB950, + 2664: 0xB952, + 2665: 0xB953, + 2666: 0xB954, + 2667: 0xB955, + 2668: 0xB956, + 2669: 0xB957, + 2670: 0xB95A, + 2671: 0xB95B, + 2672: 0xB95D, + 2673: 0xB95E, + 2674: 0xB95F, + 2675: 0xB961, + 2676: 0xB962, + 2677: 0xB963, + 2678: 0xB964, + 2679: 0xB965, + 2680: 0xB966, + 2681: 0xB967, + 2682: 0xB96A, + 2683: 0xB96C, + 2684: 0xB96E, + 2685: 0xB96F, + 2686: 0xB970, + 2687: 0xB971, + 2688: 0xB972, + 2689: 0xB973, + 2690: 0xB976, + 2691: 0xB977, + 2692: 0xB979, + 2693: 0xB97A, + 2694: 0xB97B, + 2695: 0xB97D, + 2696: 0xB97E, + 2697: 0xB97F, + 2698: 0xB980, + 2699: 0xB981, + 2700: 0xB982, + 2701: 0xB983, + 2702: 0xB986, + 2703: 0xB988, + 2704: 0xB98B, + 2705: 0xB98C, + 2706: 0xB98F, + 2707: 0xB990, + 2708: 0xB991, + 2709: 0xB992, + 2710: 0xB993, + 2711: 0xB994, + 2712: 0xB995, + 2713: 0xB996, + 2714: 0xB997, + 2715: 0xB998, + 2716: 0xB999, + 2717: 0xB99A, + 2718: 0xB99B, + 2719: 0xB99C, + 2720: 0xB99D, + 2721: 0xB99E, + 2722: 0xB99F, + 2723: 0xB9A0, + 2724: 0xB9A1, + 2725: 0xB9A2, + 2726: 0xB9A3, + 2727: 0xB9A4, + 2728: 0xB9A5, + 2729: 0xB9A6, + 2730: 0xB9A7, + 2731: 0xB9A8, + 2732: 0xB9A9, + 2733: 0xB9AA, + 2734: 0xB9AB, + 2735: 0xB9AE, + 2736: 0xB9AF, + 2737: 0xB9B1, + 2738: 0xB9B2, + 2739: 0xB9B3, + 2740: 0xB9B5, + 2741: 0xB9B6, + 2742: 0xB9B7, + 2743: 0xB9B8, + 2744: 0xB9B9, + 2745: 0xB9BA, + 2746: 0xB9BB, + 2747: 0xB9BE, + 2748: 0xB9C0, + 2749: 0xB9C2, + 2750: 0xB9C3, + 2751: 0xB9C4, + 2752: 0xB9C5, + 2753: 0xB9C6, + 2754: 0xB9C7, + 2755: 0xB9CA, + 2756: 0xB9CB, + 2757: 0xB9CD, + 2758: 0xB9D3, + 2759: 0xB9D4, + 2760: 0xB9D5, + 2761: 0xB9D6, + 2762: 0xB9D7, + 2763: 0xB9DA, + 2764: 0xB9DC, + 2765: 0xB9DF, + 2766: 0xB9E0, + 2767: 0xB9E2, + 2768: 0xB9E6, + 2769: 0xB9E7, + 2770: 0xB9E9, + 2771: 0xB9EA, + 2772: 0xB9EB, + 2773: 0xB9ED, + 2774: 0xB9EE, + 2775: 0xB9EF, + 2776: 0xB9F0, + 2777: 0xB9F1, + 2778: 0xB9F2, + 2779: 0xB9F3, + 2780: 0xB9F6, + 2781: 0xB9FB, + 2782: 0xB9FC, + 2783: 0xB9FD, + 2784: 0xB9FE, + 2785: 0xB9FF, + 2786: 0xBA02, + 2787: 0xBA03, + 2788: 0xBA04, + 2789: 0xBA05, + 2790: 0xBA06, + 2791: 0xBA07, + 2792: 0xBA09, + 2793: 0xBA0A, + 2794: 0xBA0B, + 2795: 0xBA0C, + 2796: 0xBA0D, + 2797: 0xBA0E, + 2798: 0xBA0F, + 2799: 0xBA10, + 2800: 0xBA11, + 2801: 0xBA12, + 2802: 0xBA13, + 2803: 0xBA14, + 2804: 0xBA16, + 2805: 0xBA17, + 2806: 0xBA18, + 2807: 0xBA19, + 2808: 0xBA1A, + 2809: 0xBA1B, + 2810: 0xBA1C, + 2811: 0xBA1D, + 2812: 0xBA1E, + 2813: 0xBA1F, + 2814: 0xBA20, + 2815: 0xBA21, + 2816: 0xBA22, + 2817: 0xBA23, + 2818: 0xBA24, + 2819: 0xBA25, + 2820: 0xBA26, + 2821: 0xBA27, + 2822: 0xBA28, + 2823: 0xBA29, + 2824: 0xBA2A, + 2825: 0xBA2B, + 2826: 0xBA2C, + 2827: 0xBA2D, + 2828: 0xBA2E, + 2829: 0xBA2F, + 2830: 0xBA30, + 2831: 0xBA31, + 2832: 0xBA32, + 2833: 0xBA33, + 2834: 0xBA34, + 2835: 0xBA35, + 2836: 0xBA36, + 2837: 0xBA37, + 2838: 0xBA3A, + 2839: 0xBA3B, + 2840: 0xBA3D, + 2841: 0xBA3E, + 2842: 0xBA3F, + 2843: 0xBA41, + 2844: 0xBA43, + 2845: 0xBA44, + 2846: 0xBA45, + 2847: 0xBA46, + 2848: 0xBA47, + 2849: 0xBA4A, + 2850: 0xBA4C, + 2851: 0xBA4F, + 2852: 0xBA50, + 2853: 0xBA51, + 2854: 0xBA52, + 2855: 0xBA56, + 2856: 0xBA57, + 2857: 0xBA59, + 2858: 0xBA5A, + 2859: 0xBA5B, + 2860: 0xBA5D, + 2861: 0xBA5E, + 2862: 0xBA5F, + 2863: 0xBA60, + 2864: 0xBA61, + 2865: 0xBA62, + 2866: 0xBA63, + 2867: 0xBA66, + 2868: 0xBA6A, + 2869: 0xBA6B, + 2870: 0xBA6C, + 2871: 0xBA6D, + 2872: 0xBA6E, + 2873: 0xBA6F, + 2874: 0xBA72, + 2875: 0xBA73, + 2876: 0xBA75, + 2877: 0xBA76, + 2878: 0xBA77, + 2879: 0xBA79, + 2880: 0xBA7A, + 2881: 0xBA7B, + 2882: 0xBA7C, + 2883: 0xBA7D, + 2884: 0xBA7E, + 2885: 0xBA7F, + 2886: 0xBA80, + 2887: 0xBA81, + 2888: 0xBA82, + 2889: 0xBA86, + 2890: 0xBA88, + 2891: 0xBA89, + 2892: 0xBA8A, + 2893: 0xBA8B, + 2894: 0xBA8D, + 2895: 0xBA8E, + 2896: 0xBA8F, + 2897: 0xBA90, + 2898: 0xBA91, + 2899: 0xBA92, + 2900: 0xBA93, + 2901: 0xBA94, + 2902: 0xBA95, + 2903: 0xBA96, + 2904: 0xBA97, + 2905: 0xBA98, + 2906: 0xBA99, + 2907: 0xBA9A, + 2908: 0xBA9B, + 2909: 0xBA9C, + 2910: 0xBA9D, + 2911: 0xBA9E, + 2912: 0xBA9F, + 2913: 0xBAA0, + 2914: 0xBAA1, + 2915: 0xBAA2, + 2916: 0xBAA3, + 2917: 0xBAA4, + 2918: 0xBAA5, + 2919: 0xBAA6, + 2920: 0xBAA7, + 2921: 0xBAAA, + 2922: 0xBAAD, + 2923: 0xBAAE, + 2924: 0xBAAF, + 2925: 0xBAB1, + 2926: 0xBAB3, + 2927: 0xBAB4, + 2928: 0xBAB5, + 2929: 0xBAB6, + 2930: 0xBAB7, + 2931: 0xBABA, + 2932: 0xBABC, + 2933: 0xBABE, + 2934: 0xBABF, + 2935: 0xBAC0, + 2936: 0xBAC1, + 2937: 0xBAC2, + 2938: 0xBAC3, + 2939: 0xBAC5, + 2940: 0xBAC6, + 2941: 0xBAC7, + 2942: 0xBAC9, + 2943: 0xBACA, + 2944: 0xBACB, + 2945: 0xBACC, + 2946: 0xBACD, + 2947: 0xBACE, + 2948: 0xBACF, + 2949: 0xBAD0, + 2950: 0xBAD1, + 2951: 0xBAD2, + 2952: 0xBAD3, + 2953: 0xBAD4, + 2954: 0xBAD5, + 2955: 0xBAD6, + 2956: 0xBAD7, + 2957: 0xBADA, + 2958: 0xBADB, + 2959: 0xBADC, + 2960: 0xBADD, + 2961: 0xBADE, + 2962: 0xBADF, + 2963: 0xBAE0, + 2964: 0xBAE1, + 2965: 0xBAE2, + 2966: 0xBAE3, + 2967: 0xBAE4, + 2968: 0xBAE5, + 2969: 0xBAE6, + 2970: 0xBAE7, + 2971: 0xBAE8, + 2972: 0xBAE9, + 2973: 0xBAEA, + 2974: 0xBAEB, + 2975: 0xBAEC, + 2976: 0xBAED, + 2977: 0xBAEE, + 2978: 0xBAEF, + 2979: 0xBAF0, + 2980: 0xBAF1, + 2981: 0xBAF2, + 2982: 0xBAF3, + 2983: 0xBAF4, + 2984: 0xBAF5, + 2985: 0xBAF6, + 2986: 0xBAF7, + 2987: 0xBAF8, + 2988: 0xBAF9, + 2989: 0xBAFA, + 2990: 0xBAFB, + 2991: 0xBAFD, + 2992: 0xBAFE, + 2993: 0xBAFF, + 2994: 0xBB01, + 2995: 0xBB02, + 2996: 0xBB03, + 2997: 0xBB05, + 2998: 0xBB06, + 2999: 0xBB07, + 3000: 0xBB08, + 3001: 0xBB09, + 3002: 0xBB0A, + 3003: 0xBB0B, + 3004: 0xBB0C, + 3005: 0xBB0E, + 3006: 0xBB10, + 3007: 0xBB12, + 3008: 0xBB13, + 3009: 0xBB14, + 3010: 0xBB15, + 3011: 0xBB16, + 3012: 0xBB17, + 3013: 0xBB19, + 3014: 0xBB1A, + 3015: 0xBB1B, + 3016: 0xBB1D, + 3017: 0xBB1E, + 3018: 0xBB1F, + 3019: 0xBB21, + 3020: 0xBB22, + 3021: 0xBB23, + 3022: 0xBB24, + 3023: 0xBB25, + 3024: 0xBB26, + 3025: 0xBB27, + 3026: 0xBB28, + 3027: 0xBB2A, + 3028: 0xBB2C, + 3029: 0xBB2D, + 3030: 0xBB2E, + 3031: 0xBB2F, + 3032: 0xBB30, + 3033: 0xBB31, + 3034: 0xBB32, + 3035: 0xBB33, + 3036: 0xBB37, + 3037: 0xBB39, + 3038: 0xBB3A, + 3039: 0xBB3F, + 3040: 0xBB40, + 3041: 0xBB41, + 3042: 0xBB42, + 3043: 0xBB43, + 3044: 0xBB46, + 3045: 0xBB48, + 3046: 0xBB4A, + 3047: 0xBB4B, + 3048: 0xBB4C, + 3049: 0xBB4E, + 3050: 0xBB51, + 3051: 0xBB52, + 3052: 0xBB53, + 3053: 0xBB55, + 3054: 0xBB56, + 3055: 0xBB57, + 3056: 0xBB59, + 3057: 0xBB5A, + 3058: 0xBB5B, + 3059: 0xBB5C, + 3060: 0xBB5D, + 3061: 0xBB5E, + 3062: 0xBB5F, + 3063: 0xBB60, + 3064: 0xBB62, + 3065: 0xBB64, + 3066: 0xBB65, + 3067: 0xBB66, + 3068: 0xBB67, + 3069: 0xBB68, + 3070: 0xBB69, + 3071: 0xBB6A, + 3072: 0xBB6B, + 3073: 0xBB6D, + 3074: 0xBB6E, + 3075: 0xBB6F, + 3076: 0xBB70, + 3077: 0xBB71, + 3078: 0xBB72, + 3079: 0xBB73, + 3080: 0xBB74, + 3081: 0xBB75, + 3082: 0xBB76, + 3083: 0xBB77, + 3084: 0xBB78, + 3085: 0xBB79, + 3086: 0xBB7A, + 3087: 0xBB7B, + 3088: 0xBB7C, + 3089: 0xBB7D, + 3090: 0xBB7E, + 3091: 0xBB7F, + 3092: 0xBB80, + 3093: 0xBB81, + 3094: 0xBB82, + 3095: 0xBB83, + 3096: 0xBB84, + 3097: 0xBB85, + 3098: 0xBB86, + 3099: 0xBB87, + 3100: 0xBB89, + 3101: 0xBB8A, + 3102: 0xBB8B, + 3103: 0xBB8D, + 3104: 0xBB8E, + 3105: 0xBB8F, + 3106: 0xBB91, + 3107: 0xBB92, + 3108: 0xBB93, + 3109: 0xBB94, + 3110: 0xBB95, + 3111: 0xBB96, + 3112: 0xBB97, + 3113: 0xBB98, + 3114: 0xBB99, + 3115: 0xBB9A, + 3116: 0xBB9B, + 3117: 0xBB9C, + 3118: 0xBB9D, + 3119: 0xBB9E, + 3120: 0xBB9F, + 3121: 0xBBA0, + 3122: 0xBBA1, + 3123: 0xBBA2, + 3124: 0xBBA3, + 3125: 0xBBA5, + 3126: 0xBBA6, + 3127: 0xBBA7, + 3128: 0xBBA9, + 3129: 0xBBAA, + 3130: 0xBBAB, + 3131: 0xBBAD, + 3132: 0xBBAE, + 3133: 0xBBAF, + 3134: 0xBBB0, + 3135: 0xBBB1, + 3136: 0xBBB2, + 3137: 0xBBB3, + 3138: 0xBBB5, + 3139: 0xBBB6, + 3140: 0xBBB8, + 3141: 0xBBB9, + 3142: 0xBBBA, + 3143: 0xBBBB, + 3144: 0xBBBC, + 3145: 0xBBBD, + 3146: 0xBBBE, + 3147: 0xBBBF, + 3148: 0xBBC1, + 3149: 0xBBC2, + 3150: 0xBBC3, + 3151: 0xBBC5, + 3152: 0xBBC6, + 3153: 0xBBC7, + 3154: 0xBBC9, + 3155: 0xBBCA, + 3156: 0xBBCB, + 3157: 0xBBCC, + 3158: 0xBBCD, + 3159: 0xBBCE, + 3160: 0xBBCF, + 3161: 0xBBD1, + 3162: 0xBBD2, + 3163: 0xBBD4, + 3164: 0xBBD5, + 3165: 0xBBD6, + 3166: 0xBBD7, + 3167: 0xBBD8, + 3168: 0xBBD9, + 3169: 0xBBDA, + 3170: 0xBBDB, + 3171: 0xBBDC, + 3172: 0xBBDD, + 3173: 0xBBDE, + 3174: 0xBBDF, + 3175: 0xBBE0, + 3176: 0xBBE1, + 3177: 0xBBE2, + 3178: 0xBBE3, + 3179: 0xBBE4, + 3180: 0xBBE5, + 3181: 0xBBE6, + 3182: 0xBBE7, + 3183: 0xBBE8, + 3184: 0xBBE9, + 3185: 0xBBEA, + 3186: 0xBBEB, + 3187: 0xBBEC, + 3188: 0xBBED, + 3189: 0xBBEE, + 3190: 0xBBEF, + 3191: 0xBBF0, + 3192: 0xBBF1, + 3193: 0xBBF2, + 3194: 0xBBF3, + 3195: 0xBBF4, + 3196: 0xBBF5, + 3197: 0xBBF6, + 3198: 0xBBF7, + 3199: 0xBBFA, + 3200: 0xBBFB, + 3201: 0xBBFD, + 3202: 0xBBFE, + 3203: 0xBC01, + 3204: 0xBC03, + 3205: 0xBC04, + 3206: 0xBC05, + 3207: 0xBC06, + 3208: 0xBC07, + 3209: 0xBC0A, + 3210: 0xBC0E, + 3211: 0xBC10, + 3212: 0xBC12, + 3213: 0xBC13, + 3214: 0xBC19, + 3215: 0xBC1A, + 3216: 0xBC20, + 3217: 0xBC21, + 3218: 0xBC22, + 3219: 0xBC23, + 3220: 0xBC26, + 3221: 0xBC28, + 3222: 0xBC2A, + 3223: 0xBC2B, + 3224: 0xBC2C, + 3225: 0xBC2E, + 3226: 0xBC2F, + 3227: 0xBC32, + 3228: 0xBC33, + 3229: 0xBC35, + 3230: 0xBC36, + 3231: 0xBC37, + 3232: 0xBC39, + 3233: 0xBC3A, + 3234: 0xBC3B, + 3235: 0xBC3C, + 3236: 0xBC3D, + 3237: 0xBC3E, + 3238: 0xBC3F, + 3239: 0xBC42, + 3240: 0xBC46, + 3241: 0xBC47, + 3242: 0xBC48, + 3243: 0xBC4A, + 3244: 0xBC4B, + 3245: 0xBC4E, + 3246: 0xBC4F, + 3247: 0xBC51, + 3248: 0xBC52, + 3249: 0xBC53, + 3250: 0xBC54, + 3251: 0xBC55, + 3252: 0xBC56, + 3253: 0xBC57, + 3254: 0xBC58, + 3255: 0xBC59, + 3256: 0xBC5A, + 3257: 0xBC5B, + 3258: 0xBC5C, + 3259: 0xBC5E, + 3260: 0xBC5F, + 3261: 0xBC60, + 3262: 0xBC61, + 3263: 0xBC62, + 3264: 0xBC63, + 3265: 0xBC64, + 3266: 0xBC65, + 3267: 0xBC66, + 3268: 0xBC67, + 3269: 0xBC68, + 3270: 0xBC69, + 3271: 0xBC6A, + 3272: 0xBC6B, + 3273: 0xBC6C, + 3274: 0xBC6D, + 3275: 0xBC6E, + 3276: 0xBC6F, + 3277: 0xBC70, + 3278: 0xBC71, + 3279: 0xBC72, + 3280: 0xBC73, + 3281: 0xBC74, + 3282: 0xBC75, + 3283: 0xBC76, + 3284: 0xBC77, + 3285: 0xBC78, + 3286: 0xBC79, + 3287: 0xBC7A, + 3288: 0xBC7B, + 3289: 0xBC7C, + 3290: 0xBC7D, + 3291: 0xBC7E, + 3292: 0xBC7F, + 3293: 0xBC80, + 3294: 0xBC81, + 3295: 0xBC82, + 3296: 0xBC83, + 3297: 0xBC86, + 3298: 0xBC87, + 3299: 0xBC89, + 3300: 0xBC8A, + 3301: 0xBC8D, + 3302: 0xBC8F, + 3303: 0xBC90, + 3304: 0xBC91, + 3305: 0xBC92, + 3306: 0xBC93, + 3307: 0xBC96, + 3308: 0xBC98, + 3309: 0xBC9B, + 3310: 0xBC9C, + 3311: 0xBC9D, + 3312: 0xBC9E, + 3313: 0xBC9F, + 3314: 0xBCA2, + 3315: 0xBCA3, + 3316: 0xBCA5, + 3317: 0xBCA6, + 3318: 0xBCA9, + 3319: 0xBCAA, + 3320: 0xBCAB, + 3321: 0xBCAC, + 3322: 0xBCAD, + 3323: 0xBCAE, + 3324: 0xBCAF, + 3325: 0xBCB2, + 3326: 0xBCB6, + 3327: 0xBCB7, + 3328: 0xBCB8, + 3329: 0xBCB9, + 3330: 0xBCBA, + 3331: 0xBCBB, + 3332: 0xBCBE, + 3333: 0xBCBF, + 3334: 0xBCC1, + 3335: 0xBCC2, + 3336: 0xBCC3, + 3337: 0xBCC5, + 3338: 0xBCC6, + 3339: 0xBCC7, + 3340: 0xBCC8, + 3341: 0xBCC9, + 3342: 0xBCCA, + 3343: 0xBCCB, + 3344: 0xBCCC, + 3345: 0xBCCE, + 3346: 0xBCD2, + 3347: 0xBCD3, + 3348: 0xBCD4, + 3349: 0xBCD6, + 3350: 0xBCD7, + 3351: 0xBCD9, + 3352: 0xBCDA, + 3353: 0xBCDB, + 3354: 0xBCDD, + 3355: 0xBCDE, + 3356: 0xBCDF, + 3357: 0xBCE0, + 3358: 0xBCE1, + 3359: 0xBCE2, + 3360: 0xBCE3, + 3361: 0xBCE4, + 3362: 0xBCE5, + 3363: 0xBCE6, + 3364: 0xBCE7, + 3365: 0xBCE8, + 3366: 0xBCE9, + 3367: 0xBCEA, + 3368: 0xBCEB, + 3369: 0xBCEC, + 3370: 0xBCED, + 3371: 0xBCEE, + 3372: 0xBCEF, + 3373: 0xBCF0, + 3374: 0xBCF1, + 3375: 0xBCF2, + 3376: 0xBCF3, + 3377: 0xBCF7, + 3378: 0xBCF9, + 3379: 0xBCFA, + 3380: 0xBCFB, + 3381: 0xBCFD, + 3382: 0xBCFE, + 3383: 0xBCFF, + 3384: 0xBD00, + 3385: 0xBD01, + 3386: 0xBD02, + 3387: 0xBD03, + 3388: 0xBD06, + 3389: 0xBD08, + 3390: 0xBD0A, + 3391: 0xBD0B, + 3392: 0xBD0C, + 3393: 0xBD0D, + 3394: 0xBD0E, + 3395: 0xBD0F, + 3396: 0xBD11, + 3397: 0xBD12, + 3398: 0xBD13, + 3399: 0xBD15, + 3400: 0xBD16, + 3401: 0xBD17, + 3402: 0xBD18, + 3403: 0xBD19, + 3404: 0xBD1A, + 3405: 0xBD1B, + 3406: 0xBD1C, + 3407: 0xBD1D, + 3408: 0xBD1E, + 3409: 0xBD1F, + 3410: 0xBD20, + 3411: 0xBD21, + 3412: 0xBD22, + 3413: 0xBD23, + 3414: 0xBD25, + 3415: 0xBD26, + 3416: 0xBD27, + 3417: 0xBD28, + 3418: 0xBD29, + 3419: 0xBD2A, + 3420: 0xBD2B, + 3421: 0xBD2D, + 3422: 0xBD2E, + 3423: 0xBD2F, + 3424: 0xBD30, + 3425: 0xBD31, + 3426: 0xBD32, + 3427: 0xBD33, + 3428: 0xBD34, + 3429: 0xBD35, + 3430: 0xBD36, + 3431: 0xBD37, + 3432: 0xBD38, + 3433: 0xBD39, + 3434: 0xBD3A, + 3435: 0xBD3B, + 3436: 0xBD3C, + 3437: 0xBD3D, + 3438: 0xBD3E, + 3439: 0xBD3F, + 3440: 0xBD41, + 3441: 0xBD42, + 3442: 0xBD43, + 3443: 0xBD44, + 3444: 0xBD45, + 3445: 0xBD46, + 3446: 0xBD47, + 3447: 0xBD4A, + 3448: 0xBD4B, + 3449: 0xBD4D, + 3450: 0xBD4E, + 3451: 0xBD4F, + 3452: 0xBD51, + 3453: 0xBD52, + 3454: 0xBD53, + 3455: 0xBD54, + 3456: 0xBD55, + 3457: 0xBD56, + 3458: 0xBD57, + 3459: 0xBD5A, + 3460: 0xBD5B, + 3461: 0xBD5C, + 3462: 0xBD5D, + 3463: 0xBD5E, + 3464: 0xBD5F, + 3465: 0xBD60, + 3466: 0xBD61, + 3467: 0xBD62, + 3468: 0xBD63, + 3469: 0xBD65, + 3470: 0xBD66, + 3471: 0xBD67, + 3472: 0xBD69, + 3473: 0xBD6A, + 3474: 0xBD6B, + 3475: 0xBD6C, + 3476: 0xBD6D, + 3477: 0xBD6E, + 3478: 0xBD6F, + 3479: 0xBD70, + 3480: 0xBD71, + 3481: 0xBD72, + 3482: 0xBD73, + 3483: 0xBD74, + 3484: 0xBD75, + 3485: 0xBD76, + 3486: 0xBD77, + 3487: 0xBD78, + 3488: 0xBD79, + 3489: 0xBD7A, + 3490: 0xBD7B, + 3491: 0xBD7C, + 3492: 0xBD7D, + 3493: 0xBD7E, + 3494: 0xBD7F, + 3495: 0xBD82, + 3496: 0xBD83, + 3497: 0xBD85, + 3498: 0xBD86, + 3499: 0xBD8B, + 3500: 0xBD8C, + 3501: 0xBD8D, + 3502: 0xBD8E, + 3503: 0xBD8F, + 3504: 0xBD92, + 3505: 0xBD94, + 3506: 0xBD96, + 3507: 0xBD97, + 3508: 0xBD98, + 3509: 0xBD9B, + 3510: 0xBD9D, + 3511: 0xBD9E, + 3512: 0xBD9F, + 3513: 0xBDA0, + 3514: 0xBDA1, + 3515: 0xBDA2, + 3516: 0xBDA3, + 3517: 0xBDA5, + 3518: 0xBDA6, + 3519: 0xBDA7, + 3520: 0xBDA8, + 3521: 0xBDA9, + 3522: 0xBDAA, + 3523: 0xBDAB, + 3524: 0xBDAC, + 3525: 0xBDAD, + 3526: 0xBDAE, + 3527: 0xBDAF, + 3528: 0xBDB1, + 3529: 0xBDB2, + 3530: 0xBDB3, + 3531: 0xBDB4, + 3532: 0xBDB5, + 3533: 0xBDB6, + 3534: 0xBDB7, + 3535: 0xBDB9, + 3536: 0xBDBA, + 3537: 0xBDBB, + 3538: 0xBDBC, + 3539: 0xBDBD, + 3540: 0xBDBE, + 3541: 0xBDBF, + 3542: 0xBDC0, + 3543: 0xBDC1, + 3544: 0xBDC2, + 3545: 0xBDC3, + 3546: 0xBDC4, + 3547: 0xBDC5, + 3548: 0xBDC6, + 3549: 0xBDC7, + 3550: 0xBDC8, + 3551: 0xBDC9, + 3552: 0xBDCA, + 3553: 0xBDCB, + 3554: 0xBDCC, + 3555: 0xBDCD, + 3556: 0xBDCE, + 3557: 0xBDCF, + 3558: 0xBDD0, + 3559: 0xBDD1, + 3560: 0xBDD2, + 3561: 0xBDD3, + 3562: 0xBDD6, + 3563: 0xBDD7, + 3564: 0xBDD9, + 3565: 0xBDDA, + 3566: 0xBDDB, + 3567: 0xBDDD, + 3568: 0xBDDE, + 3569: 0xBDDF, + 3570: 0xBDE0, + 3571: 0xBDE1, + 3572: 0xBDE2, + 3573: 0xBDE3, + 3574: 0xBDE4, + 3575: 0xBDE5, + 3576: 0xBDE6, + 3577: 0xBDE7, + 3578: 0xBDE8, + 3579: 0xBDEA, + 3580: 0xBDEB, + 3581: 0xBDEC, + 3582: 0xBDED, + 3583: 0xBDEE, + 3584: 0xBDEF, + 3585: 0xBDF1, + 3586: 0xBDF2, + 3587: 0xBDF3, + 3588: 0xBDF5, + 3589: 0xBDF6, + 3590: 0xBDF7, + 3591: 0xBDF9, + 3592: 0xBDFA, + 3593: 0xBDFB, + 3594: 0xBDFC, + 3595: 0xBDFD, + 3596: 0xBDFE, + 3597: 0xBDFF, + 3598: 0xBE01, + 3599: 0xBE02, + 3600: 0xBE04, + 3601: 0xBE06, + 3602: 0xBE07, + 3603: 0xBE08, + 3604: 0xBE09, + 3605: 0xBE0A, + 3606: 0xBE0B, + 3607: 0xBE0E, + 3608: 0xBE0F, + 3609: 0xBE11, + 3610: 0xBE12, + 3611: 0xBE13, + 3612: 0xBE15, + 3613: 0xBE16, + 3614: 0xBE17, + 3615: 0xBE18, + 3616: 0xBE19, + 3617: 0xBE1A, + 3618: 0xBE1B, + 3619: 0xBE1E, + 3620: 0xBE20, + 3621: 0xBE21, + 3622: 0xBE22, + 3623: 0xBE23, + 3624: 0xBE24, + 3625: 0xBE25, + 3626: 0xBE26, + 3627: 0xBE27, + 3628: 0xBE28, + 3629: 0xBE29, + 3630: 0xBE2A, + 3631: 0xBE2B, + 3632: 0xBE2C, + 3633: 0xBE2D, + 3634: 0xBE2E, + 3635: 0xBE2F, + 3636: 0xBE30, + 3637: 0xBE31, + 3638: 0xBE32, + 3639: 0xBE33, + 3640: 0xBE34, + 3641: 0xBE35, + 3642: 0xBE36, + 3643: 0xBE37, + 3644: 0xBE38, + 3645: 0xBE39, + 3646: 0xBE3A, + 3647: 0xBE3B, + 3648: 0xBE3C, + 3649: 0xBE3D, + 3650: 0xBE3E, + 3651: 0xBE3F, + 3652: 0xBE40, + 3653: 0xBE41, + 3654: 0xBE42, + 3655: 0xBE43, + 3656: 0xBE46, + 3657: 0xBE47, + 3658: 0xBE49, + 3659: 0xBE4A, + 3660: 0xBE4B, + 3661: 0xBE4D, + 3662: 0xBE4F, + 3663: 0xBE50, + 3664: 0xBE51, + 3665: 0xBE52, + 3666: 0xBE53, + 3667: 0xBE56, + 3668: 0xBE58, + 3669: 0xBE5C, + 3670: 0xBE5D, + 3671: 0xBE5E, + 3672: 0xBE5F, + 3673: 0xBE62, + 3674: 0xBE63, + 3675: 0xBE65, + 3676: 0xBE66, + 3677: 0xBE67, + 3678: 0xBE69, + 3679: 0xBE6B, + 3680: 0xBE6C, + 3681: 0xBE6D, + 3682: 0xBE6E, + 3683: 0xBE6F, + 3684: 0xBE72, + 3685: 0xBE76, + 3686: 0xBE77, + 3687: 0xBE78, + 3688: 0xBE79, + 3689: 0xBE7A, + 3690: 0xBE7E, + 3691: 0xBE7F, + 3692: 0xBE81, + 3693: 0xBE82, + 3694: 0xBE83, + 3695: 0xBE85, + 3696: 0xBE86, + 3697: 0xBE87, + 3698: 0xBE88, + 3699: 0xBE89, + 3700: 0xBE8A, + 3701: 0xBE8B, + 3702: 0xBE8E, + 3703: 0xBE92, + 3704: 0xBE93, + 3705: 0xBE94, + 3706: 0xBE95, + 3707: 0xBE96, + 3708: 0xBE97, + 3709: 0xBE9A, + 3710: 0xBE9B, + 3711: 0xBE9C, + 3712: 0xBE9D, + 3713: 0xBE9E, + 3714: 0xBE9F, + 3715: 0xBEA0, + 3716: 0xBEA1, + 3717: 0xBEA2, + 3718: 0xBEA3, + 3719: 0xBEA4, + 3720: 0xBEA5, + 3721: 0xBEA6, + 3722: 0xBEA7, + 3723: 0xBEA9, + 3724: 0xBEAA, + 3725: 0xBEAB, + 3726: 0xBEAC, + 3727: 0xBEAD, + 3728: 0xBEAE, + 3729: 0xBEAF, + 3730: 0xBEB0, + 3731: 0xBEB1, + 3732: 0xBEB2, + 3733: 0xBEB3, + 3734: 0xBEB4, + 3735: 0xBEB5, + 3736: 0xBEB6, + 3737: 0xBEB7, + 3738: 0xBEB8, + 3739: 0xBEB9, + 3740: 0xBEBA, + 3741: 0xBEBB, + 3742: 0xBEBC, + 3743: 0xBEBD, + 3744: 0xBEBE, + 3745: 0xBEBF, + 3746: 0xBEC0, + 3747: 0xBEC1, + 3748: 0xBEC2, + 3749: 0xBEC3, + 3750: 0xBEC4, + 3751: 0xBEC5, + 3752: 0xBEC6, + 3753: 0xBEC7, + 3754: 0xBEC8, + 3755: 0xBEC9, + 3756: 0xBECA, + 3757: 0xBECB, + 3758: 0xBECC, + 3759: 0xBECD, + 3760: 0xBECE, + 3761: 0xBECF, + 3762: 0xBED2, + 3763: 0xBED3, + 3764: 0xBED5, + 3765: 0xBED6, + 3766: 0xBED9, + 3767: 0xBEDA, + 3768: 0xBEDB, + 3769: 0xBEDC, + 3770: 0xBEDD, + 3771: 0xBEDE, + 3772: 0xBEDF, + 3773: 0xBEE1, + 3774: 0xBEE2, + 3775: 0xBEE6, + 3776: 0xBEE7, + 3777: 0xBEE8, + 3778: 0xBEE9, + 3779: 0xBEEA, + 3780: 0xBEEB, + 3781: 0xBEED, + 3782: 0xBEEE, + 3783: 0xBEEF, + 3784: 0xBEF0, + 3785: 0xBEF1, + 3786: 0xBEF2, + 3787: 0xBEF3, + 3788: 0xBEF4, + 3789: 0xBEF5, + 3790: 0xBEF6, + 3791: 0xBEF7, + 3792: 0xBEF8, + 3793: 0xBEF9, + 3794: 0xBEFA, + 3795: 0xBEFB, + 3796: 0xBEFC, + 3797: 0xBEFD, + 3798: 0xBEFE, + 3799: 0xBEFF, + 3800: 0xBF00, + 3801: 0xBF02, + 3802: 0xBF03, + 3803: 0xBF04, + 3804: 0xBF05, + 3805: 0xBF06, + 3806: 0xBF07, + 3807: 0xBF0A, + 3808: 0xBF0B, + 3809: 0xBF0C, + 3810: 0xBF0D, + 3811: 0xBF0E, + 3812: 0xBF0F, + 3813: 0xBF10, + 3814: 0xBF11, + 3815: 0xBF12, + 3816: 0xBF13, + 3817: 0xBF14, + 3818: 0xBF15, + 3819: 0xBF16, + 3820: 0xBF17, + 3821: 0xBF1A, + 3822: 0xBF1E, + 3823: 0xBF1F, + 3824: 0xBF20, + 3825: 0xBF21, + 3826: 0xBF22, + 3827: 0xBF23, + 3828: 0xBF24, + 3829: 0xBF25, + 3830: 0xBF26, + 3831: 0xBF27, + 3832: 0xBF28, + 3833: 0xBF29, + 3834: 0xBF2A, + 3835: 0xBF2B, + 3836: 0xBF2C, + 3837: 0xBF2D, + 3838: 0xBF2E, + 3839: 0xBF2F, + 3840: 0xBF30, + 3841: 0xBF31, + 3842: 0xBF32, + 3843: 0xBF33, + 3844: 0xBF34, + 3845: 0xBF35, + 3846: 0xBF36, + 3847: 0xBF37, + 3848: 0xBF38, + 3849: 0xBF39, + 3850: 0xBF3A, + 3851: 0xBF3B, + 3852: 0xBF3C, + 3853: 0xBF3D, + 3854: 0xBF3E, + 3855: 0xBF3F, + 3856: 0xBF42, + 3857: 0xBF43, + 3858: 0xBF45, + 3859: 0xBF46, + 3860: 0xBF47, + 3861: 0xBF49, + 3862: 0xBF4A, + 3863: 0xBF4B, + 3864: 0xBF4C, + 3865: 0xBF4D, + 3866: 0xBF4E, + 3867: 0xBF4F, + 3868: 0xBF52, + 3869: 0xBF53, + 3870: 0xBF54, + 3871: 0xBF56, + 3872: 0xBF57, + 3873: 0xBF58, + 3874: 0xBF59, + 3875: 0xBF5A, + 3876: 0xBF5B, + 3877: 0xBF5C, + 3878: 0xBF5D, + 3879: 0xBF5E, + 3880: 0xBF5F, + 3881: 0xBF60, + 3882: 0xBF61, + 3883: 0xBF62, + 3884: 0xBF63, + 3885: 0xBF64, + 3886: 0xBF65, + 3887: 0xBF66, + 3888: 0xBF67, + 3889: 0xBF68, + 3890: 0xBF69, + 3891: 0xBF6A, + 3892: 0xBF6B, + 3893: 0xBF6C, + 3894: 0xBF6D, + 3895: 0xBF6E, + 3896: 0xBF6F, + 3897: 0xBF70, + 3898: 0xBF71, + 3899: 0xBF72, + 3900: 0xBF73, + 3901: 0xBF74, + 3902: 0xBF75, + 3903: 0xBF76, + 3904: 0xBF77, + 3905: 0xBF78, + 3906: 0xBF79, + 3907: 0xBF7A, + 3908: 0xBF7B, + 3909: 0xBF7C, + 3910: 0xBF7D, + 3911: 0xBF7E, + 3912: 0xBF7F, + 3913: 0xBF80, + 3914: 0xBF81, + 3915: 0xBF82, + 3916: 0xBF83, + 3917: 0xBF84, + 3918: 0xBF85, + 3919: 0xBF86, + 3920: 0xBF87, + 3921: 0xBF88, + 3922: 0xBF89, + 3923: 0xBF8A, + 3924: 0xBF8B, + 3925: 0xBF8C, + 3926: 0xBF8D, + 3927: 0xBF8E, + 3928: 0xBF8F, + 3929: 0xBF90, + 3930: 0xBF91, + 3931: 0xBF92, + 3932: 0xBF93, + 3933: 0xBF95, + 3934: 0xBF96, + 3935: 0xBF97, + 3936: 0xBF98, + 3937: 0xBF99, + 3938: 0xBF9A, + 3939: 0xBF9B, + 3940: 0xBF9C, + 3941: 0xBF9D, + 3942: 0xBF9E, + 3943: 0xBF9F, + 3944: 0xBFA0, + 3945: 0xBFA1, + 3946: 0xBFA2, + 3947: 0xBFA3, + 3948: 0xBFA4, + 3949: 0xBFA5, + 3950: 0xBFA6, + 3951: 0xBFA7, + 3952: 0xBFA8, + 3953: 0xBFA9, + 3954: 0xBFAA, + 3955: 0xBFAB, + 3956: 0xBFAC, + 3957: 0xBFAD, + 3958: 0xBFAE, + 3959: 0xBFAF, + 3960: 0xBFB1, + 3961: 0xBFB2, + 3962: 0xBFB3, + 3963: 0xBFB4, + 3964: 0xBFB5, + 3965: 0xBFB6, + 3966: 0xBFB7, + 3967: 0xBFB8, + 3968: 0xBFB9, + 3969: 0xBFBA, + 3970: 0xBFBB, + 3971: 0xBFBC, + 3972: 0xBFBD, + 3973: 0xBFBE, + 3974: 0xBFBF, + 3975: 0xBFC0, + 3976: 0xBFC1, + 3977: 0xBFC2, + 3978: 0xBFC3, + 3979: 0xBFC4, + 3980: 0xBFC6, + 3981: 0xBFC7, + 3982: 0xBFC8, + 3983: 0xBFC9, + 3984: 0xBFCA, + 3985: 0xBFCB, + 3986: 0xBFCE, + 3987: 0xBFCF, + 3988: 0xBFD1, + 3989: 0xBFD2, + 3990: 0xBFD3, + 3991: 0xBFD5, + 3992: 0xBFD6, + 3993: 0xBFD7, + 3994: 0xBFD8, + 3995: 0xBFD9, + 3996: 0xBFDA, + 3997: 0xBFDB, + 3998: 0xBFDD, + 3999: 0xBFDE, + 4000: 0xBFE0, + 4001: 0xBFE2, + 4002: 0xBFE3, + 4003: 0xBFE4, + 4004: 0xBFE5, + 4005: 0xBFE6, + 4006: 0xBFE7, + 4007: 0xBFE8, + 4008: 0xBFE9, + 4009: 0xBFEA, + 4010: 0xBFEB, + 4011: 0xBFEC, + 4012: 0xBFED, + 4013: 0xBFEE, + 4014: 0xBFEF, + 4015: 0xBFF0, + 4016: 0xBFF1, + 4017: 0xBFF2, + 4018: 0xBFF3, + 4019: 0xBFF4, + 4020: 0xBFF5, + 4021: 0xBFF6, + 4022: 0xBFF7, + 4023: 0xBFF8, + 4024: 0xBFF9, + 4025: 0xBFFA, + 4026: 0xBFFB, + 4027: 0xBFFC, + 4028: 0xBFFD, + 4029: 0xBFFE, + 4030: 0xBFFF, + 4031: 0xC000, + 4032: 0xC001, + 4033: 0xC002, + 4034: 0xC003, + 4035: 0xC004, + 4036: 0xC005, + 4037: 0xC006, + 4038: 0xC007, + 4039: 0xC008, + 4040: 0xC009, + 4041: 0xC00A, + 4042: 0xC00B, + 4043: 0xC00C, + 4044: 0xC00D, + 4045: 0xC00E, + 4046: 0xC00F, + 4047: 0xC010, + 4048: 0xC011, + 4049: 0xC012, + 4050: 0xC013, + 4051: 0xC014, + 4052: 0xC015, + 4053: 0xC016, + 4054: 0xC017, + 4055: 0xC018, + 4056: 0xC019, + 4057: 0xC01A, + 4058: 0xC01B, + 4059: 0xC01C, + 4060: 0xC01D, + 4061: 0xC01E, + 4062: 0xC01F, + 4063: 0xC020, + 4064: 0xC021, + 4065: 0xC022, + 4066: 0xC023, + 4067: 0xC024, + 4068: 0xC025, + 4069: 0xC026, + 4070: 0xC027, + 4071: 0xC028, + 4072: 0xC029, + 4073: 0xC02A, + 4074: 0xC02B, + 4075: 0xC02C, + 4076: 0xC02D, + 4077: 0xC02E, + 4078: 0xC02F, + 4079: 0xC030, + 4080: 0xC031, + 4081: 0xC032, + 4082: 0xC033, + 4083: 0xC034, + 4084: 0xC035, + 4085: 0xC036, + 4086: 0xC037, + 4087: 0xC038, + 4088: 0xC039, + 4089: 0xC03A, + 4090: 0xC03B, + 4091: 0xC03D, + 4092: 0xC03E, + 4093: 0xC03F, + 4094: 0xC040, + 4095: 0xC041, + 4096: 0xC042, + 4097: 0xC043, + 4098: 0xC044, + 4099: 0xC045, + 4100: 0xC046, + 4101: 0xC047, + 4102: 0xC048, + 4103: 0xC049, + 4104: 0xC04A, + 4105: 0xC04B, + 4106: 0xC04C, + 4107: 0xC04D, + 4108: 0xC04E, + 4109: 0xC04F, + 4110: 0xC050, + 4111: 0xC052, + 4112: 0xC053, + 4113: 0xC054, + 4114: 0xC055, + 4115: 0xC056, + 4116: 0xC057, + 4117: 0xC059, + 4118: 0xC05A, + 4119: 0xC05B, + 4120: 0xC05D, + 4121: 0xC05E, + 4122: 0xC05F, + 4123: 0xC061, + 4124: 0xC062, + 4125: 0xC063, + 4126: 0xC064, + 4127: 0xC065, + 4128: 0xC066, + 4129: 0xC067, + 4130: 0xC06A, + 4131: 0xC06B, + 4132: 0xC06C, + 4133: 0xC06D, + 4134: 0xC06E, + 4135: 0xC06F, + 4136: 0xC070, + 4137: 0xC071, + 4138: 0xC072, + 4139: 0xC073, + 4140: 0xC074, + 4141: 0xC075, + 4142: 0xC076, + 4143: 0xC077, + 4144: 0xC078, + 4145: 0xC079, + 4146: 0xC07A, + 4147: 0xC07B, + 4148: 0xC07C, + 4149: 0xC07D, + 4150: 0xC07E, + 4151: 0xC07F, + 4152: 0xC080, + 4153: 0xC081, + 4154: 0xC082, + 4155: 0xC083, + 4156: 0xC084, + 4157: 0xC085, + 4158: 0xC086, + 4159: 0xC087, + 4160: 0xC088, + 4161: 0xC089, + 4162: 0xC08A, + 4163: 0xC08B, + 4164: 0xC08C, + 4165: 0xC08D, + 4166: 0xC08E, + 4167: 0xC08F, + 4168: 0xC092, + 4169: 0xC093, + 4170: 0xC095, + 4171: 0xC096, + 4172: 0xC097, + 4173: 0xC099, + 4174: 0xC09A, + 4175: 0xC09B, + 4176: 0xC09C, + 4177: 0xC09D, + 4178: 0xC09E, + 4179: 0xC09F, + 4180: 0xC0A2, + 4181: 0xC0A4, + 4182: 0xC0A6, + 4183: 0xC0A7, + 4184: 0xC0A8, + 4185: 0xC0A9, + 4186: 0xC0AA, + 4187: 0xC0AB, + 4188: 0xC0AE, + 4189: 0xC0B1, + 4190: 0xC0B2, + 4191: 0xC0B7, + 4192: 0xC0B8, + 4193: 0xC0B9, + 4194: 0xC0BA, + 4195: 0xC0BB, + 4196: 0xC0BE, + 4197: 0xC0C2, + 4198: 0xC0C3, + 4199: 0xC0C4, + 4200: 0xC0C6, + 4201: 0xC0C7, + 4202: 0xC0CA, + 4203: 0xC0CB, + 4204: 0xC0CD, + 4205: 0xC0CE, + 4206: 0xC0CF, + 4207: 0xC0D1, + 4208: 0xC0D2, + 4209: 0xC0D3, + 4210: 0xC0D4, + 4211: 0xC0D5, + 4212: 0xC0D6, + 4213: 0xC0D7, + 4214: 0xC0DA, + 4215: 0xC0DE, + 4216: 0xC0DF, + 4217: 0xC0E0, + 4218: 0xC0E1, + 4219: 0xC0E2, + 4220: 0xC0E3, + 4221: 0xC0E6, + 4222: 0xC0E7, + 4223: 0xC0E9, + 4224: 0xC0EA, + 4225: 0xC0EB, + 4226: 0xC0ED, + 4227: 0xC0EE, + 4228: 0xC0EF, + 4229: 0xC0F0, + 4230: 0xC0F1, + 4231: 0xC0F2, + 4232: 0xC0F3, + 4233: 0xC0F6, + 4234: 0xC0F8, + 4235: 0xC0FA, + 4236: 0xC0FB, + 4237: 0xC0FC, + 4238: 0xC0FD, + 4239: 0xC0FE, + 4240: 0xC0FF, + 4241: 0xC101, + 4242: 0xC102, + 4243: 0xC103, + 4244: 0xC105, + 4245: 0xC106, + 4246: 0xC107, + 4247: 0xC109, + 4248: 0xC10A, + 4249: 0xC10B, + 4250: 0xC10C, + 4251: 0xC10D, + 4252: 0xC10E, + 4253: 0xC10F, + 4254: 0xC111, + 4255: 0xC112, + 4256: 0xC113, + 4257: 0xC114, + 4258: 0xC116, + 4259: 0xC117, + 4260: 0xC118, + 4261: 0xC119, + 4262: 0xC11A, + 4263: 0xC11B, + 4264: 0xC121, + 4265: 0xC122, + 4266: 0xC125, + 4267: 0xC128, + 4268: 0xC129, + 4269: 0xC12A, + 4270: 0xC12B, + 4271: 0xC12E, + 4272: 0xC132, + 4273: 0xC133, + 4274: 0xC134, + 4275: 0xC135, + 4276: 0xC137, + 4277: 0xC13A, + 4278: 0xC13B, + 4279: 0xC13D, + 4280: 0xC13E, + 4281: 0xC13F, + 4282: 0xC141, + 4283: 0xC142, + 4284: 0xC143, + 4285: 0xC144, + 4286: 0xC145, + 4287: 0xC146, + 4288: 0xC147, + 4289: 0xC14A, + 4290: 0xC14E, + 4291: 0xC14F, + 4292: 0xC150, + 4293: 0xC151, + 4294: 0xC152, + 4295: 0xC153, + 4296: 0xC156, + 4297: 0xC157, + 4298: 0xC159, + 4299: 0xC15A, + 4300: 0xC15B, + 4301: 0xC15D, + 4302: 0xC15E, + 4303: 0xC15F, + 4304: 0xC160, + 4305: 0xC161, + 4306: 0xC162, + 4307: 0xC163, + 4308: 0xC166, + 4309: 0xC16A, + 4310: 0xC16B, + 4311: 0xC16C, + 4312: 0xC16D, + 4313: 0xC16E, + 4314: 0xC16F, + 4315: 0xC171, + 4316: 0xC172, + 4317: 0xC173, + 4318: 0xC175, + 4319: 0xC176, + 4320: 0xC177, + 4321: 0xC179, + 4322: 0xC17A, + 4323: 0xC17B, + 4324: 0xC17C, + 4325: 0xC17D, + 4326: 0xC17E, + 4327: 0xC17F, + 4328: 0xC180, + 4329: 0xC181, + 4330: 0xC182, + 4331: 0xC183, + 4332: 0xC184, + 4333: 0xC186, + 4334: 0xC187, + 4335: 0xC188, + 4336: 0xC189, + 4337: 0xC18A, + 4338: 0xC18B, + 4339: 0xC18F, + 4340: 0xC191, + 4341: 0xC192, + 4342: 0xC193, + 4343: 0xC195, + 4344: 0xC197, + 4345: 0xC198, + 4346: 0xC199, + 4347: 0xC19A, + 4348: 0xC19B, + 4349: 0xC19E, + 4350: 0xC1A0, + 4351: 0xC1A2, + 4352: 0xC1A3, + 4353: 0xC1A4, + 4354: 0xC1A6, + 4355: 0xC1A7, + 4356: 0xC1AA, + 4357: 0xC1AB, + 4358: 0xC1AD, + 4359: 0xC1AE, + 4360: 0xC1AF, + 4361: 0xC1B1, + 4362: 0xC1B2, + 4363: 0xC1B3, + 4364: 0xC1B4, + 4365: 0xC1B5, + 4366: 0xC1B6, + 4367: 0xC1B7, + 4368: 0xC1B8, + 4369: 0xC1B9, + 4370: 0xC1BA, + 4371: 0xC1BB, + 4372: 0xC1BC, + 4373: 0xC1BE, + 4374: 0xC1BF, + 4375: 0xC1C0, + 4376: 0xC1C1, + 4377: 0xC1C2, + 4378: 0xC1C3, + 4379: 0xC1C5, + 4380: 0xC1C6, + 4381: 0xC1C7, + 4382: 0xC1C9, + 4383: 0xC1CA, + 4384: 0xC1CB, + 4385: 0xC1CD, + 4386: 0xC1CE, + 4387: 0xC1CF, + 4388: 0xC1D0, + 4389: 0xC1D1, + 4390: 0xC1D2, + 4391: 0xC1D3, + 4392: 0xC1D5, + 4393: 0xC1D6, + 4394: 0xC1D9, + 4395: 0xC1DA, + 4396: 0xC1DB, + 4397: 0xC1DC, + 4398: 0xC1DD, + 4399: 0xC1DE, + 4400: 0xC1DF, + 4401: 0xC1E1, + 4402: 0xC1E2, + 4403: 0xC1E3, + 4404: 0xC1E5, + 4405: 0xC1E6, + 4406: 0xC1E7, + 4407: 0xC1E9, + 4408: 0xC1EA, + 4409: 0xC1EB, + 4410: 0xC1EC, + 4411: 0xC1ED, + 4412: 0xC1EE, + 4413: 0xC1EF, + 4414: 0xC1F2, + 4415: 0xC1F4, + 4416: 0xC1F5, + 4417: 0xC1F6, + 4418: 0xC1F7, + 4419: 0xC1F8, + 4420: 0xC1F9, + 4421: 0xC1FA, + 4422: 0xC1FB, + 4423: 0xC1FE, + 4424: 0xC1FF, + 4425: 0xC201, + 4426: 0xC202, + 4427: 0xC203, + 4428: 0xC205, + 4429: 0xC206, + 4430: 0xC207, + 4431: 0xC208, + 4432: 0xC209, + 4433: 0xC20A, + 4434: 0xC20B, + 4435: 0xC20E, + 4436: 0xC210, + 4437: 0xC212, + 4438: 0xC213, + 4439: 0xC214, + 4440: 0xC215, + 4441: 0xC216, + 4442: 0xC217, + 4443: 0xC21A, + 4444: 0xC21B, + 4445: 0xC21D, + 4446: 0xC21E, + 4447: 0xC221, + 4448: 0xC222, + 4449: 0xC223, + 4450: 0xC224, + 4451: 0xC225, + 4452: 0xC226, + 4453: 0xC227, + 4454: 0xC22A, + 4455: 0xC22C, + 4456: 0xC22E, + 4457: 0xC230, + 4458: 0xC233, + 4459: 0xC235, + 4460: 0xC236, + 4461: 0xC237, + 4462: 0xC238, + 4463: 0xC239, + 4464: 0xC23A, + 4465: 0xC23B, + 4466: 0xC23C, + 4467: 0xC23D, + 4468: 0xC23E, + 4469: 0xC23F, + 4470: 0xC240, + 4471: 0xC241, + 4472: 0xC242, + 4473: 0xC243, + 4474: 0xC244, + 4475: 0xC245, + 4476: 0xC246, + 4477: 0xC247, + 4478: 0xC249, + 4479: 0xC24A, + 4480: 0xC24B, + 4481: 0xC24C, + 4482: 0xC24D, + 4483: 0xC24E, + 4484: 0xC24F, + 4485: 0xC252, + 4486: 0xC253, + 4487: 0xC255, + 4488: 0xC256, + 4489: 0xC257, + 4490: 0xC259, + 4491: 0xC25A, + 4492: 0xC25B, + 4493: 0xC25C, + 4494: 0xC25D, + 4495: 0xC25E, + 4496: 0xC25F, + 4497: 0xC261, + 4498: 0xC262, + 4499: 0xC263, + 4500: 0xC264, + 4501: 0xC266, + 4502: 0xC267, + 4503: 0xC268, + 4504: 0xC269, + 4505: 0xC26A, + 4506: 0xC26B, + 4507: 0xC26E, + 4508: 0xC26F, + 4509: 0xC271, + 4510: 0xC272, + 4511: 0xC273, + 4512: 0xC275, + 4513: 0xC276, + 4514: 0xC277, + 4515: 0xC278, + 4516: 0xC279, + 4517: 0xC27A, + 4518: 0xC27B, + 4519: 0xC27E, + 4520: 0xC280, + 4521: 0xC282, + 4522: 0xC283, + 4523: 0xC284, + 4524: 0xC285, + 4525: 0xC286, + 4526: 0xC287, + 4527: 0xC28A, + 4528: 0xC28B, + 4529: 0xC28C, + 4530: 0xC28D, + 4531: 0xC28E, + 4532: 0xC28F, + 4533: 0xC291, + 4534: 0xC292, + 4535: 0xC293, + 4536: 0xC294, + 4537: 0xC295, + 4538: 0xC296, + 4539: 0xC297, + 4540: 0xC299, + 4541: 0xC29A, + 4542: 0xC29C, + 4543: 0xC29E, + 4544: 0xC29F, + 4545: 0xC2A0, + 4546: 0xC2A1, + 4547: 0xC2A2, + 4548: 0xC2A3, + 4549: 0xC2A6, + 4550: 0xC2A7, + 4551: 0xC2A9, + 4552: 0xC2AA, + 4553: 0xC2AB, + 4554: 0xC2AE, + 4555: 0xC2AF, + 4556: 0xC2B0, + 4557: 0xC2B1, + 4558: 0xC2B2, + 4559: 0xC2B3, + 4560: 0xC2B6, + 4561: 0xC2B8, + 4562: 0xC2BA, + 4563: 0xC2BB, + 4564: 0xC2BC, + 4565: 0xC2BD, + 4566: 0xC2BE, + 4567: 0xC2BF, + 4568: 0xC2C0, + 4569: 0xC2C1, + 4570: 0xC2C2, + 4571: 0xC2C3, + 4572: 0xC2C4, + 4573: 0xC2C5, + 4574: 0xC2C6, + 4575: 0xC2C7, + 4576: 0xC2C8, + 4577: 0xC2C9, + 4578: 0xC2CA, + 4579: 0xC2CB, + 4580: 0xC2CC, + 4581: 0xC2CD, + 4582: 0xC2CE, + 4583: 0xC2CF, + 4584: 0xC2D0, + 4585: 0xC2D1, + 4586: 0xC2D2, + 4587: 0xC2D3, + 4588: 0xC2D4, + 4589: 0xC2D5, + 4590: 0xC2D6, + 4591: 0xC2D7, + 4592: 0xC2D8, + 4593: 0xC2D9, + 4594: 0xC2DA, + 4595: 0xC2DB, + 4596: 0xC2DE, + 4597: 0xC2DF, + 4598: 0xC2E1, + 4599: 0xC2E2, + 4600: 0xC2E5, + 4601: 0xC2E6, + 4602: 0xC2E7, + 4603: 0xC2E8, + 4604: 0xC2E9, + 4605: 0xC2EA, + 4606: 0xC2EE, + 4607: 0xC2F0, + 4608: 0xC2F2, + 4609: 0xC2F3, + 4610: 0xC2F4, + 4611: 0xC2F5, + 4612: 0xC2F7, + 4613: 0xC2FA, + 4614: 0xC2FD, + 4615: 0xC2FE, + 4616: 0xC2FF, + 4617: 0xC301, + 4618: 0xC302, + 4619: 0xC303, + 4620: 0xC304, + 4621: 0xC305, + 4622: 0xC306, + 4623: 0xC307, + 4624: 0xC30A, + 4625: 0xC30B, + 4626: 0xC30E, + 4627: 0xC30F, + 4628: 0xC310, + 4629: 0xC311, + 4630: 0xC312, + 4631: 0xC316, + 4632: 0xC317, + 4633: 0xC319, + 4634: 0xC31A, + 4635: 0xC31B, + 4636: 0xC31D, + 4637: 0xC31E, + 4638: 0xC31F, + 4639: 0xC320, + 4640: 0xC321, + 4641: 0xC322, + 4642: 0xC323, + 4643: 0xC326, + 4644: 0xC327, + 4645: 0xC32A, + 4646: 0xC32B, + 4647: 0xC32C, + 4648: 0xC32D, + 4649: 0xC32E, + 4650: 0xC32F, + 4651: 0xC330, + 4652: 0xC331, + 4653: 0xC332, + 4654: 0xC333, + 4655: 0xC334, + 4656: 0xC335, + 4657: 0xC336, + 4658: 0xC337, + 4659: 0xC338, + 4660: 0xC339, + 4661: 0xC33A, + 4662: 0xC33B, + 4663: 0xC33C, + 4664: 0xC33D, + 4665: 0xC33E, + 4666: 0xC33F, + 4667: 0xC340, + 4668: 0xC341, + 4669: 0xC342, + 4670: 0xC343, + 4671: 0xC344, + 4672: 0xC346, + 4673: 0xC347, + 4674: 0xC348, + 4675: 0xC349, + 4676: 0xC34A, + 4677: 0xC34B, + 4678: 0xC34C, + 4679: 0xC34D, + 4680: 0xC34E, + 4681: 0xC34F, + 4682: 0xC350, + 4683: 0xC351, + 4684: 0xC352, + 4685: 0xC353, + 4686: 0xC354, + 4687: 0xC355, + 4688: 0xC356, + 4689: 0xC357, + 4690: 0xC358, + 4691: 0xC359, + 4692: 0xC35A, + 4693: 0xC35B, + 4694: 0xC35C, + 4695: 0xC35D, + 4696: 0xC35E, + 4697: 0xC35F, + 4698: 0xC360, + 4699: 0xC361, + 4700: 0xC362, + 4701: 0xC363, + 4702: 0xC364, + 4703: 0xC365, + 4704: 0xC366, + 4705: 0xC367, + 4706: 0xC36A, + 4707: 0xC36B, + 4708: 0xC36D, + 4709: 0xC36E, + 4710: 0xC36F, + 4711: 0xC371, + 4712: 0xC373, + 4713: 0xC374, + 4714: 0xC375, + 4715: 0xC376, + 4716: 0xC377, + 4717: 0xC37A, + 4718: 0xC37B, + 4719: 0xC37E, + 4720: 0xC37F, + 4721: 0xC380, + 4722: 0xC381, + 4723: 0xC382, + 4724: 0xC383, + 4725: 0xC385, + 4726: 0xC386, + 4727: 0xC387, + 4728: 0xC389, + 4729: 0xC38A, + 4730: 0xC38B, + 4731: 0xC38D, + 4732: 0xC38E, + 4733: 0xC38F, + 4734: 0xC390, + 4735: 0xC391, + 4736: 0xC392, + 4737: 0xC393, + 4738: 0xC394, + 4739: 0xC395, + 4740: 0xC396, + 4741: 0xC397, + 4742: 0xC398, + 4743: 0xC399, + 4744: 0xC39A, + 4745: 0xC39B, + 4746: 0xC39C, + 4747: 0xC39D, + 4748: 0xC39E, + 4749: 0xC39F, + 4750: 0xC3A0, + 4751: 0xC3A1, + 4752: 0xC3A2, + 4753: 0xC3A3, + 4754: 0xC3A4, + 4755: 0xC3A5, + 4756: 0xC3A6, + 4757: 0xC3A7, + 4758: 0xC3A8, + 4759: 0xC3A9, + 4760: 0xC3AA, + 4761: 0xC3AB, + 4762: 0xC3AC, + 4763: 0xC3AD, + 4764: 0xC3AE, + 4765: 0xC3AF, + 4766: 0xC3B0, + 4767: 0xC3B1, + 4768: 0xC3B2, + 4769: 0xC3B3, + 4770: 0xC3B4, + 4771: 0xC3B5, + 4772: 0xC3B6, + 4773: 0xC3B7, + 4774: 0xC3B8, + 4775: 0xC3B9, + 4776: 0xC3BA, + 4777: 0xC3BB, + 4778: 0xC3BC, + 4779: 0xC3BD, + 4780: 0xC3BE, + 4781: 0xC3BF, + 4782: 0xC3C1, + 4783: 0xC3C2, + 4784: 0xC3C3, + 4785: 0xC3C4, + 4786: 0xC3C5, + 4787: 0xC3C6, + 4788: 0xC3C7, + 4789: 0xC3C8, + 4790: 0xC3C9, + 4791: 0xC3CA, + 4792: 0xC3CB, + 4793: 0xC3CC, + 4794: 0xC3CD, + 4795: 0xC3CE, + 4796: 0xC3CF, + 4797: 0xC3D0, + 4798: 0xC3D1, + 4799: 0xC3D2, + 4800: 0xC3D3, + 4801: 0xC3D4, + 4802: 0xC3D5, + 4803: 0xC3D6, + 4804: 0xC3D7, + 4805: 0xC3DA, + 4806: 0xC3DB, + 4807: 0xC3DD, + 4808: 0xC3DE, + 4809: 0xC3E1, + 4810: 0xC3E3, + 4811: 0xC3E4, + 4812: 0xC3E5, + 4813: 0xC3E6, + 4814: 0xC3E7, + 4815: 0xC3EA, + 4816: 0xC3EB, + 4817: 0xC3EC, + 4818: 0xC3EE, + 4819: 0xC3EF, + 4820: 0xC3F0, + 4821: 0xC3F1, + 4822: 0xC3F2, + 4823: 0xC3F3, + 4824: 0xC3F6, + 4825: 0xC3F7, + 4826: 0xC3F9, + 4827: 0xC3FA, + 4828: 0xC3FB, + 4829: 0xC3FC, + 4830: 0xC3FD, + 4831: 0xC3FE, + 4832: 0xC3FF, + 4833: 0xC400, + 4834: 0xC401, + 4835: 0xC402, + 4836: 0xC403, + 4837: 0xC404, + 4838: 0xC405, + 4839: 0xC406, + 4840: 0xC407, + 4841: 0xC409, + 4842: 0xC40A, + 4843: 0xC40B, + 4844: 0xC40C, + 4845: 0xC40D, + 4846: 0xC40E, + 4847: 0xC40F, + 4848: 0xC411, + 4849: 0xC412, + 4850: 0xC413, + 4851: 0xC414, + 4852: 0xC415, + 4853: 0xC416, + 4854: 0xC417, + 4855: 0xC418, + 4856: 0xC419, + 4857: 0xC41A, + 4858: 0xC41B, + 4859: 0xC41C, + 4860: 0xC41D, + 4861: 0xC41E, + 4862: 0xC41F, + 4863: 0xC420, + 4864: 0xC421, + 4865: 0xC422, + 4866: 0xC423, + 4867: 0xC425, + 4868: 0xC426, + 4869: 0xC427, + 4870: 0xC428, + 4871: 0xC429, + 4872: 0xC42A, + 4873: 0xC42B, + 4874: 0xC42D, + 4875: 0xC42E, + 4876: 0xC42F, + 4877: 0xC431, + 4878: 0xC432, + 4879: 0xC433, + 4880: 0xC435, + 4881: 0xC436, + 4882: 0xC437, + 4883: 0xC438, + 4884: 0xC439, + 4885: 0xC43A, + 4886: 0xC43B, + 4887: 0xC43E, + 4888: 0xC43F, + 4889: 0xC440, + 4890: 0xC441, + 4891: 0xC442, + 4892: 0xC443, + 4893: 0xC444, + 4894: 0xC445, + 4895: 0xC446, + 4896: 0xC447, + 4897: 0xC449, + 4898: 0xC44A, + 4899: 0xC44B, + 4900: 0xC44C, + 4901: 0xC44D, + 4902: 0xC44E, + 4903: 0xC44F, + 4904: 0xC450, + 4905: 0xC451, + 4906: 0xC452, + 4907: 0xC453, + 4908: 0xC454, + 4909: 0xC455, + 4910: 0xC456, + 4911: 0xC457, + 4912: 0xC458, + 4913: 0xC459, + 4914: 0xC45A, + 4915: 0xC45B, + 4916: 0xC45C, + 4917: 0xC45D, + 4918: 0xC45E, + 4919: 0xC45F, + 4920: 0xC460, + 4921: 0xC461, + 4922: 0xC462, + 4923: 0xC463, + 4924: 0xC466, + 4925: 0xC467, + 4926: 0xC469, + 4927: 0xC46A, + 4928: 0xC46B, + 4929: 0xC46D, + 4930: 0xC46E, + 4931: 0xC46F, + 4932: 0xC470, + 4933: 0xC471, + 4934: 0xC472, + 4935: 0xC473, + 4936: 0xC476, + 4937: 0xC477, + 4938: 0xC478, + 4939: 0xC47A, + 4940: 0xC47B, + 4941: 0xC47C, + 4942: 0xC47D, + 4943: 0xC47E, + 4944: 0xC47F, + 4945: 0xC481, + 4946: 0xC482, + 4947: 0xC483, + 4948: 0xC484, + 4949: 0xC485, + 4950: 0xC486, + 4951: 0xC487, + 4952: 0xC488, + 4953: 0xC489, + 4954: 0xC48A, + 4955: 0xC48B, + 4956: 0xC48C, + 4957: 0xC48D, + 4958: 0xC48E, + 4959: 0xC48F, + 4960: 0xC490, + 4961: 0xC491, + 4962: 0xC492, + 4963: 0xC493, + 4964: 0xC495, + 4965: 0xC496, + 4966: 0xC497, + 4967: 0xC498, + 4968: 0xC499, + 4969: 0xC49A, + 4970: 0xC49B, + 4971: 0xC49D, + 4972: 0xC49E, + 4973: 0xC49F, + 4974: 0xC4A0, + 4975: 0xC4A1, + 4976: 0xC4A2, + 4977: 0xC4A3, + 4978: 0xC4A4, + 4979: 0xC4A5, + 4980: 0xC4A6, + 4981: 0xC4A7, + 4982: 0xC4A8, + 4983: 0xC4A9, + 4984: 0xC4AA, + 4985: 0xC4AB, + 4986: 0xC4AC, + 4987: 0xC4AD, + 4988: 0xC4AE, + 4989: 0xC4AF, + 4990: 0xC4B0, + 4991: 0xC4B1, + 4992: 0xC4B2, + 4993: 0xC4B3, + 4994: 0xC4B4, + 4995: 0xC4B5, + 4996: 0xC4B6, + 4997: 0xC4B7, + 4998: 0xC4B9, + 4999: 0xC4BA, + 5000: 0xC4BB, + 5001: 0xC4BD, + 5002: 0xC4BE, + 5003: 0xC4BF, + 5004: 0xC4C0, + 5005: 0xC4C1, + 5006: 0xC4C2, + 5007: 0xC4C3, + 5008: 0xC4C4, + 5009: 0xC4C5, + 5010: 0xC4C6, + 5011: 0xC4C7, + 5012: 0xC4C8, + 5013: 0xC4C9, + 5014: 0xC4CA, + 5015: 0xC4CB, + 5016: 0xC4CC, + 5017: 0xC4CD, + 5018: 0xC4CE, + 5019: 0xC4CF, + 5020: 0xC4D0, + 5021: 0xC4D1, + 5022: 0xC4D2, + 5023: 0xC4D3, + 5024: 0xC4D4, + 5025: 0xC4D5, + 5026: 0xC4D6, + 5027: 0xC4D7, + 5028: 0xC4D8, + 5029: 0xC4D9, + 5030: 0xC4DA, + 5031: 0xC4DB, + 5032: 0xC4DC, + 5033: 0xC4DD, + 5034: 0xC4DE, + 5035: 0xC4DF, + 5036: 0xC4E0, + 5037: 0xC4E1, + 5038: 0xC4E2, + 5039: 0xC4E3, + 5040: 0xC4E4, + 5041: 0xC4E5, + 5042: 0xC4E6, + 5043: 0xC4E7, + 5044: 0xC4E8, + 5045: 0xC4EA, + 5046: 0xC4EB, + 5047: 0xC4EC, + 5048: 0xC4ED, + 5049: 0xC4EE, + 5050: 0xC4EF, + 5051: 0xC4F2, + 5052: 0xC4F3, + 5053: 0xC4F5, + 5054: 0xC4F6, + 5055: 0xC4F7, + 5056: 0xC4F9, + 5057: 0xC4FB, + 5058: 0xC4FC, + 5059: 0xC4FD, + 5060: 0xC4FE, + 5061: 0xC502, + 5062: 0xC503, + 5063: 0xC504, + 5064: 0xC505, + 5065: 0xC506, + 5066: 0xC507, + 5067: 0xC508, + 5068: 0xC509, + 5069: 0xC50A, + 5070: 0xC50B, + 5071: 0xC50D, + 5072: 0xC50E, + 5073: 0xC50F, + 5074: 0xC511, + 5075: 0xC512, + 5076: 0xC513, + 5077: 0xC515, + 5078: 0xC516, + 5079: 0xC517, + 5080: 0xC518, + 5081: 0xC519, + 5082: 0xC51A, + 5083: 0xC51B, + 5084: 0xC51D, + 5085: 0xC51E, + 5086: 0xC51F, + 5087: 0xC520, + 5088: 0xC521, + 5089: 0xC522, + 5090: 0xC523, + 5091: 0xC524, + 5092: 0xC525, + 5093: 0xC526, + 5094: 0xC527, + 5095: 0xC52A, + 5096: 0xC52B, + 5097: 0xC52D, + 5098: 0xC52E, + 5099: 0xC52F, + 5100: 0xC531, + 5101: 0xC532, + 5102: 0xC533, + 5103: 0xC534, + 5104: 0xC535, + 5105: 0xC536, + 5106: 0xC537, + 5107: 0xC53A, + 5108: 0xC53C, + 5109: 0xC53E, + 5110: 0xC53F, + 5111: 0xC540, + 5112: 0xC541, + 5113: 0xC542, + 5114: 0xC543, + 5115: 0xC546, + 5116: 0xC547, + 5117: 0xC54B, + 5118: 0xC54F, + 5119: 0xC550, + 5120: 0xC551, + 5121: 0xC552, + 5122: 0xC556, + 5123: 0xC55A, + 5124: 0xC55B, + 5125: 0xC55C, + 5126: 0xC55F, + 5127: 0xC562, + 5128: 0xC563, + 5129: 0xC565, + 5130: 0xC566, + 5131: 0xC567, + 5132: 0xC569, + 5133: 0xC56A, + 5134: 0xC56B, + 5135: 0xC56C, + 5136: 0xC56D, + 5137: 0xC56E, + 5138: 0xC56F, + 5139: 0xC572, + 5140: 0xC576, + 5141: 0xC577, + 5142: 0xC578, + 5143: 0xC579, + 5144: 0xC57A, + 5145: 0xC57B, + 5146: 0xC57E, + 5147: 0xC57F, + 5148: 0xC581, + 5149: 0xC582, + 5150: 0xC583, + 5151: 0xC585, + 5152: 0xC586, + 5153: 0xC588, + 5154: 0xC589, + 5155: 0xC58A, + 5156: 0xC58B, + 5157: 0xC58E, + 5158: 0xC590, + 5159: 0xC592, + 5160: 0xC593, + 5161: 0xC594, + 5162: 0xC596, + 5163: 0xC599, + 5164: 0xC59A, + 5165: 0xC59B, + 5166: 0xC59D, + 5167: 0xC59E, + 5168: 0xC59F, + 5169: 0xC5A1, + 5170: 0xC5A2, + 5171: 0xC5A3, + 5172: 0xC5A4, + 5173: 0xC5A5, + 5174: 0xC5A6, + 5175: 0xC5A7, + 5176: 0xC5A8, + 5177: 0xC5AA, + 5178: 0xC5AB, + 5179: 0xC5AC, + 5180: 0xC5AD, + 5181: 0xC5AE, + 5182: 0xC5AF, + 5183: 0xC5B0, + 5184: 0xC5B1, + 5185: 0xC5B2, + 5186: 0xC5B3, + 5187: 0xC5B6, + 5188: 0xC5B7, + 5189: 0xC5BA, + 5190: 0xC5BF, + 5191: 0xC5C0, + 5192: 0xC5C1, + 5193: 0xC5C2, + 5194: 0xC5C3, + 5195: 0xC5CB, + 5196: 0xC5CD, + 5197: 0xC5CF, + 5198: 0xC5D2, + 5199: 0xC5D3, + 5200: 0xC5D5, + 5201: 0xC5D6, + 5202: 0xC5D7, + 5203: 0xC5D9, + 5204: 0xC5DA, + 5205: 0xC5DB, + 5206: 0xC5DC, + 5207: 0xC5DD, + 5208: 0xC5DE, + 5209: 0xC5DF, + 5210: 0xC5E2, + 5211: 0xC5E4, + 5212: 0xC5E6, + 5213: 0xC5E7, + 5214: 0xC5E8, + 5215: 0xC5E9, + 5216: 0xC5EA, + 5217: 0xC5EB, + 5218: 0xC5EF, + 5219: 0xC5F1, + 5220: 0xC5F2, + 5221: 0xC5F3, + 5222: 0xC5F5, + 5223: 0xC5F8, + 5224: 0xC5F9, + 5225: 0xC5FA, + 5226: 0xC5FB, + 5227: 0xC602, + 5228: 0xC603, + 5229: 0xC604, + 5230: 0xC609, + 5231: 0xC60A, + 5232: 0xC60B, + 5233: 0xC60D, + 5234: 0xC60E, + 5235: 0xC60F, + 5236: 0xC611, + 5237: 0xC612, + 5238: 0xC613, + 5239: 0xC614, + 5240: 0xC615, + 5241: 0xC616, + 5242: 0xC617, + 5243: 0xC61A, + 5244: 0xC61D, + 5245: 0xC61E, + 5246: 0xC61F, + 5247: 0xC620, + 5248: 0xC621, + 5249: 0xC622, + 5250: 0xC623, + 5251: 0xC626, + 5252: 0xC627, + 5253: 0xC629, + 5254: 0xC62A, + 5255: 0xC62B, + 5256: 0xC62F, + 5257: 0xC631, + 5258: 0xC632, + 5259: 0xC636, + 5260: 0xC638, + 5261: 0xC63A, + 5262: 0xC63C, + 5263: 0xC63D, + 5264: 0xC63E, + 5265: 0xC63F, + 5266: 0xC642, + 5267: 0xC643, + 5268: 0xC645, + 5269: 0xC646, + 5270: 0xC647, + 5271: 0xC649, + 5272: 0xC64A, + 5273: 0xC64B, + 5274: 0xC64C, + 5275: 0xC64D, + 5276: 0xC64E, + 5277: 0xC64F, + 5278: 0xC652, + 5279: 0xC656, + 5280: 0xC657, + 5281: 0xC658, + 5282: 0xC659, + 5283: 0xC65A, + 5284: 0xC65B, + 5285: 0xC65E, + 5286: 0xC65F, + 5287: 0xC661, + 5288: 0xC662, + 5289: 0xC663, + 5290: 0xC664, + 5291: 0xC665, + 5292: 0xC666, + 5293: 0xC667, + 5294: 0xC668, + 5295: 0xC669, + 5296: 0xC66A, + 5297: 0xC66B, + 5298: 0xC66D, + 5299: 0xC66E, + 5300: 0xC670, + 5301: 0xC672, + 5302: 0xC673, + 5303: 0xC674, + 5304: 0xC675, + 5305: 0xC676, + 5306: 0xC677, + 5307: 0xC67A, + 5308: 0xC67B, + 5309: 0xC67D, + 5310: 0xC67E, + 5311: 0xC67F, + 5312: 0xC681, + 5313: 0xC682, + 5314: 0xC683, + 5315: 0xC684, + 5316: 0xC685, + 5317: 0xC686, + 5318: 0xC687, + 5319: 0xC68A, + 5320: 0xC68C, + 5321: 0xC68E, + 5322: 0xC68F, + 5323: 0xC690, + 5324: 0xC691, + 5325: 0xC692, + 5326: 0xC693, + 5327: 0xC696, + 5328: 0xC697, + 5329: 0xC699, + 5330: 0xC69A, + 5331: 0xC69B, + 5332: 0xC69D, + 5333: 0xC69E, + 5334: 0xC69F, + 5335: 0xC6A0, + 5336: 0xC6A1, + 5337: 0xC6A2, + 5338: 0xC6A3, + 5339: 0xC6A6, + 5340: 0xC6A8, + 5341: 0xC6AA, + 5342: 0xC6AB, + 5343: 0xC6AC, + 5344: 0xC6AD, + 5345: 0xC6AE, + 5346: 0xC6AF, + 5347: 0xC6B2, + 5348: 0xC6B3, + 5349: 0xC6B5, + 5350: 0xC6B6, + 5351: 0xC6B7, + 5352: 0xC6BB, + 5353: 0xC6BC, + 5354: 0xC6BD, + 5355: 0xC6BE, + 5356: 0xC6BF, + 5357: 0xC6C2, + 5358: 0xC6C4, + 5359: 0xC6C6, + 5360: 0xC6C7, + 5361: 0xC6C8, + 5362: 0xC6C9, + 5363: 0xC6CA, + 5364: 0xC6CB, + 5365: 0xC6CE, + 5366: 0xC6CF, + 5367: 0xC6D1, + 5368: 0xC6D2, + 5369: 0xC6D3, + 5370: 0xC6D5, + 5371: 0xC6D6, + 5372: 0xC6D7, + 5373: 0xC6D8, + 5374: 0xC6D9, + 5375: 0xC6DA, + 5376: 0xC6DB, + 5377: 0xC6DE, + 5378: 0xC6DF, + 5379: 0xC6E2, + 5380: 0xC6E3, + 5381: 0xC6E4, + 5382: 0xC6E5, + 5383: 0xC6E6, + 5384: 0xC6E7, + 5385: 0xC6EA, + 5386: 0xC6EB, + 5387: 0xC6ED, + 5388: 0xC6EE, + 5389: 0xC6EF, + 5390: 0xC6F1, + 5391: 0xC6F2, + 5392: 0xC6F3, + 5393: 0xC6F4, + 5394: 0xC6F5, + 5395: 0xC6F6, + 5396: 0xC6F7, + 5397: 0xC6FA, + 5398: 0xC6FB, + 5399: 0xC6FC, + 5400: 0xC6FE, + 5401: 0xC6FF, + 5402: 0xC700, + 5403: 0xC701, + 5404: 0xC702, + 5405: 0xC703, + 5406: 0xC706, + 5407: 0xC707, + 5408: 0xC709, + 5409: 0xC70A, + 5410: 0xC70B, + 5411: 0xC70D, + 5412: 0xC70E, + 5413: 0xC70F, + 5414: 0xC710, + 5415: 0xC711, + 5416: 0xC712, + 5417: 0xC713, + 5418: 0xC716, + 5419: 0xC718, + 5420: 0xC71A, + 5421: 0xC71B, + 5422: 0xC71C, + 5423: 0xC71D, + 5424: 0xC71E, + 5425: 0xC71F, + 5426: 0xC722, + 5427: 0xC723, + 5428: 0xC725, + 5429: 0xC726, + 5430: 0xC727, + 5431: 0xC729, + 5432: 0xC72A, + 5433: 0xC72B, + 5434: 0xC72C, + 5435: 0xC72D, + 5436: 0xC72E, + 5437: 0xC72F, + 5438: 0xC732, + 5439: 0xC734, + 5440: 0xC736, + 5441: 0xC738, + 5442: 0xC739, + 5443: 0xC73A, + 5444: 0xC73B, + 5445: 0xC73E, + 5446: 0xC73F, + 5447: 0xC741, + 5448: 0xC742, + 5449: 0xC743, + 5450: 0xC745, + 5451: 0xC746, + 5452: 0xC747, + 5453: 0xC748, + 5454: 0xC749, + 5455: 0xC74B, + 5456: 0xC74E, + 5457: 0xC750, + 5458: 0xC759, + 5459: 0xC75A, + 5460: 0xC75B, + 5461: 0xC75D, + 5462: 0xC75E, + 5463: 0xC75F, + 5464: 0xC761, + 5465: 0xC762, + 5466: 0xC763, + 5467: 0xC764, + 5468: 0xC765, + 5469: 0xC766, + 5470: 0xC767, + 5471: 0xC769, + 5472: 0xC76A, + 5473: 0xC76C, + 5474: 0xC76D, + 5475: 0xC76E, + 5476: 0xC76F, + 5477: 0xC770, + 5478: 0xC771, + 5479: 0xC772, + 5480: 0xC773, + 5481: 0xC776, + 5482: 0xC777, + 5483: 0xC779, + 5484: 0xC77A, + 5485: 0xC77B, + 5486: 0xC77F, + 5487: 0xC780, + 5488: 0xC781, + 5489: 0xC782, + 5490: 0xC786, + 5491: 0xC78B, + 5492: 0xC78C, + 5493: 0xC78D, + 5494: 0xC78F, + 5495: 0xC792, + 5496: 0xC793, + 5497: 0xC795, + 5498: 0xC799, + 5499: 0xC79B, + 5500: 0xC79C, + 5501: 0xC79D, + 5502: 0xC79E, + 5503: 0xC79F, + 5504: 0xC7A2, + 5505: 0xC7A7, + 5506: 0xC7A8, + 5507: 0xC7A9, + 5508: 0xC7AA, + 5509: 0xC7AB, + 5510: 0xC7AE, + 5511: 0xC7AF, + 5512: 0xC7B1, + 5513: 0xC7B2, + 5514: 0xC7B3, + 5515: 0xC7B5, + 5516: 0xC7B6, + 5517: 0xC7B7, + 5518: 0xC7B8, + 5519: 0xC7B9, + 5520: 0xC7BA, + 5521: 0xC7BB, + 5522: 0xC7BE, + 5523: 0xC7C2, + 5524: 0xC7C3, + 5525: 0xC7C4, + 5526: 0xC7C5, + 5527: 0xC7C6, + 5528: 0xC7C7, + 5529: 0xC7CA, + 5530: 0xC7CB, + 5531: 0xC7CD, + 5532: 0xC7CF, + 5533: 0xC7D1, + 5534: 0xC7D2, + 5535: 0xC7D3, + 5536: 0xC7D4, + 5537: 0xC7D5, + 5538: 0xC7D6, + 5539: 0xC7D7, + 5540: 0xC7D9, + 5541: 0xC7DA, + 5542: 0xC7DB, + 5543: 0xC7DC, + 5544: 0xC7DE, + 5545: 0xC7DF, + 5546: 0xC7E0, + 5547: 0xC7E1, + 5548: 0xC7E2, + 5549: 0xC7E3, + 5550: 0xC7E5, + 5551: 0xC7E6, + 5552: 0xC7E7, + 5553: 0xC7E9, + 5554: 0xC7EA, + 5555: 0xC7EB, + 5556: 0xC7ED, + 5557: 0xC7EE, + 5558: 0xC7EF, + 5559: 0xC7F0, + 5560: 0xC7F1, + 5561: 0xC7F2, + 5562: 0xC7F3, + 5563: 0xC7F4, + 5564: 0xC7F5, + 5565: 0xC7F6, + 5566: 0xC7F7, + 5567: 0xC7F8, + 5568: 0xC7F9, + 5569: 0xC7FA, + 5570: 0xC7FB, + 5571: 0xC7FC, + 5572: 0xC7FD, + 5573: 0xC7FE, + 5574: 0xC7FF, + 5575: 0xC802, + 5576: 0xC803, + 5577: 0xC805, + 5578: 0xC806, + 5579: 0xC807, + 5580: 0xC809, + 5581: 0xC80B, + 5582: 0xC80C, + 5583: 0xC80D, + 5584: 0xC80E, + 5585: 0xC80F, + 5586: 0xC812, + 5587: 0xC814, + 5588: 0xC817, + 5589: 0xC818, + 5590: 0xC819, + 5591: 0xC81A, + 5592: 0xC81B, + 5593: 0xC81E, + 5594: 0xC81F, + 5595: 0xC821, + 5596: 0xC822, + 5597: 0xC823, + 5598: 0xC825, + 5599: 0xC826, + 5600: 0xC827, + 5601: 0xC828, + 5602: 0xC829, + 5603: 0xC82A, + 5604: 0xC82B, + 5605: 0xC82E, + 5606: 0xC830, + 5607: 0xC832, + 5608: 0xC833, + 5609: 0xC834, + 5610: 0xC835, + 5611: 0xC836, + 5612: 0xC837, + 5613: 0xC839, + 5614: 0xC83A, + 5615: 0xC83B, + 5616: 0xC83D, + 5617: 0xC83E, + 5618: 0xC83F, + 5619: 0xC841, + 5620: 0xC842, + 5621: 0xC843, + 5622: 0xC844, + 5623: 0xC845, + 5624: 0xC846, + 5625: 0xC847, + 5626: 0xC84A, + 5627: 0xC84B, + 5628: 0xC84E, + 5629: 0xC84F, + 5630: 0xC850, + 5631: 0xC851, + 5632: 0xC852, + 5633: 0xC853, + 5634: 0xC855, + 5635: 0xC856, + 5636: 0xC857, + 5637: 0xC858, + 5638: 0xC859, + 5639: 0xC85A, + 5640: 0xC85B, + 5641: 0xC85C, + 5642: 0xC85D, + 5643: 0xC85E, + 5644: 0xC85F, + 5645: 0xC860, + 5646: 0xC861, + 5647: 0xC862, + 5648: 0xC863, + 5649: 0xC864, + 5650: 0xC865, + 5651: 0xC866, + 5652: 0xC867, + 5653: 0xC868, + 5654: 0xC869, + 5655: 0xC86A, + 5656: 0xC86B, + 5657: 0xC86C, + 5658: 0xC86D, + 5659: 0xC86E, + 5660: 0xC86F, + 5661: 0xC872, + 5662: 0xC873, + 5663: 0xC875, + 5664: 0xC876, + 5665: 0xC877, + 5666: 0xC879, + 5667: 0xC87B, + 5668: 0xC87C, + 5669: 0xC87D, + 5670: 0xC87E, + 5671: 0xC87F, + 5672: 0xC882, + 5673: 0xC884, + 5674: 0xC888, + 5675: 0xC889, + 5676: 0xC88A, + 5677: 0xC88E, + 5678: 0xC88F, + 5679: 0xC890, + 5680: 0xC891, + 5681: 0xC892, + 5682: 0xC893, + 5683: 0xC895, + 5684: 0xC896, + 5685: 0xC897, + 5686: 0xC898, + 5687: 0xC899, + 5688: 0xC89A, + 5689: 0xC89B, + 5690: 0xC89C, + 5691: 0xC89E, + 5692: 0xC8A0, + 5693: 0xC8A2, + 5694: 0xC8A3, + 5695: 0xC8A4, + 5696: 0xC8A5, + 5697: 0xC8A6, + 5698: 0xC8A7, + 5699: 0xC8A9, + 5700: 0xC8AA, + 5701: 0xC8AB, + 5702: 0xC8AC, + 5703: 0xC8AD, + 5704: 0xC8AE, + 5705: 0xC8AF, + 5706: 0xC8B0, + 5707: 0xC8B1, + 5708: 0xC8B2, + 5709: 0xC8B3, + 5710: 0xC8B4, + 5711: 0xC8B5, + 5712: 0xC8B6, + 5713: 0xC8B7, + 5714: 0xC8B8, + 5715: 0xC8B9, + 5716: 0xC8BA, + 5717: 0xC8BB, + 5718: 0xC8BE, + 5719: 0xC8BF, + 5720: 0xC8C0, + 5721: 0xC8C1, + 5722: 0xC8C2, + 5723: 0xC8C3, + 5724: 0xC8C5, + 5725: 0xC8C6, + 5726: 0xC8C7, + 5727: 0xC8C9, + 5728: 0xC8CA, + 5729: 0xC8CB, + 5730: 0xC8CD, + 5731: 0xC8CE, + 5732: 0xC8CF, + 5733: 0xC8D0, + 5734: 0xC8D1, + 5735: 0xC8D2, + 5736: 0xC8D3, + 5737: 0xC8D6, + 5738: 0xC8D8, + 5739: 0xC8DA, + 5740: 0xC8DB, + 5741: 0xC8DC, + 5742: 0xC8DD, + 5743: 0xC8DE, + 5744: 0xC8DF, + 5745: 0xC8E2, + 5746: 0xC8E3, + 5747: 0xC8E5, + 5748: 0xC8E6, + 5749: 0xC8E7, + 5750: 0xC8E8, + 5751: 0xC8E9, + 5752: 0xC8EA, + 5753: 0xC8EB, + 5754: 0xC8EC, + 5755: 0xC8ED, + 5756: 0xC8EE, + 5757: 0xC8EF, + 5758: 0xC8F0, + 5759: 0xC8F1, + 5760: 0xC8F2, + 5761: 0xC8F3, + 5762: 0xC8F4, + 5763: 0xC8F6, + 5764: 0xC8F7, + 5765: 0xC8F8, + 5766: 0xC8F9, + 5767: 0xC8FA, + 5768: 0xC8FB, + 5769: 0xC8FE, + 5770: 0xC8FF, + 5771: 0xC901, + 5772: 0xC902, + 5773: 0xC903, + 5774: 0xC907, + 5775: 0xC908, + 5776: 0xC909, + 5777: 0xC90A, + 5778: 0xC90B, + 5779: 0xC90E, + 5780: 0x3000, + 5781: 0x3001, + 5782: 0x3002, + 5783: 0x00B7, + 5784: 0x2025, + 5785: 0x2026, + 5786: 0x00A8, + 5787: 0x3003, + 5788: 0x00AD, + 5789: 0x2015, + 5790: 0x2225, + 5791: 0xFF3C, + 5792: 0x223C, + 5793: 0x2018, + 5794: 0x2019, + 5795: 0x201C, + 5796: 0x201D, + 5797: 0x3014, + 5798: 0x3015, + 5799: 0x3008, + 5800: 0x3009, + 5801: 0x300A, + 5802: 0x300B, + 5803: 0x300C, + 5804: 0x300D, + 5805: 0x300E, + 5806: 0x300F, + 5807: 0x3010, + 5808: 0x3011, + 5809: 0x00B1, + 5810: 0x00D7, + 5811: 0x00F7, + 5812: 0x2260, + 5813: 0x2264, + 5814: 0x2265, + 5815: 0x221E, + 5816: 0x2234, + 5817: 0x00B0, + 5818: 0x2032, + 5819: 0x2033, + 5820: 0x2103, + 5821: 0x212B, + 5822: 0xFFE0, + 5823: 0xFFE1, + 5824: 0xFFE5, + 5825: 0x2642, + 5826: 0x2640, + 5827: 0x2220, + 5828: 0x22A5, + 5829: 0x2312, + 5830: 0x2202, + 5831: 0x2207, + 5832: 0x2261, + 5833: 0x2252, + 5834: 0x00A7, + 5835: 0x203B, + 5836: 0x2606, + 5837: 0x2605, + 5838: 0x25CB, + 5839: 0x25CF, + 5840: 0x25CE, + 5841: 0x25C7, + 5842: 0x25C6, + 5843: 0x25A1, + 5844: 0x25A0, + 5845: 0x25B3, + 5846: 0x25B2, + 5847: 0x25BD, + 5848: 0x25BC, + 5849: 0x2192, + 5850: 0x2190, + 5851: 0x2191, + 5852: 0x2193, + 5853: 0x2194, + 5854: 0x3013, + 5855: 0x226A, + 5856: 0x226B, + 5857: 0x221A, + 5858: 0x223D, + 5859: 0x221D, + 5860: 0x2235, + 5861: 0x222B, + 5862: 0x222C, + 5863: 0x2208, + 5864: 0x220B, + 5865: 0x2286, + 5866: 0x2287, + 5867: 0x2282, + 5868: 0x2283, + 5869: 0x222A, + 5870: 0x2229, + 5871: 0x2227, + 5872: 0x2228, + 5873: 0xFFE2, + 5874: 0xC910, + 5875: 0xC912, + 5876: 0xC913, + 5877: 0xC914, + 5878: 0xC915, + 5879: 0xC916, + 5880: 0xC917, + 5881: 0xC919, + 5882: 0xC91A, + 5883: 0xC91B, + 5884: 0xC91C, + 5885: 0xC91D, + 5886: 0xC91E, + 5887: 0xC91F, + 5888: 0xC920, + 5889: 0xC921, + 5890: 0xC922, + 5891: 0xC923, + 5892: 0xC924, + 5893: 0xC925, + 5894: 0xC926, + 5895: 0xC927, + 5896: 0xC928, + 5897: 0xC929, + 5898: 0xC92A, + 5899: 0xC92B, + 5900: 0xC92D, + 5901: 0xC92E, + 5902: 0xC92F, + 5903: 0xC930, + 5904: 0xC931, + 5905: 0xC932, + 5906: 0xC933, + 5907: 0xC935, + 5908: 0xC936, + 5909: 0xC937, + 5910: 0xC938, + 5911: 0xC939, + 5912: 0xC93A, + 5913: 0xC93B, + 5914: 0xC93C, + 5915: 0xC93D, + 5916: 0xC93E, + 5917: 0xC93F, + 5918: 0xC940, + 5919: 0xC941, + 5920: 0xC942, + 5921: 0xC943, + 5922: 0xC944, + 5923: 0xC945, + 5924: 0xC946, + 5925: 0xC947, + 5926: 0xC948, + 5927: 0xC949, + 5928: 0xC94A, + 5929: 0xC94B, + 5930: 0xC94C, + 5931: 0xC94D, + 5932: 0xC94E, + 5933: 0xC94F, + 5934: 0xC952, + 5935: 0xC953, + 5936: 0xC955, + 5937: 0xC956, + 5938: 0xC957, + 5939: 0xC959, + 5940: 0xC95A, + 5941: 0xC95B, + 5942: 0xC95C, + 5943: 0xC95D, + 5944: 0xC95E, + 5945: 0xC95F, + 5946: 0xC962, + 5947: 0xC964, + 5948: 0xC965, + 5949: 0xC966, + 5950: 0xC967, + 5951: 0xC968, + 5952: 0xC969, + 5953: 0xC96A, + 5954: 0xC96B, + 5955: 0xC96D, + 5956: 0xC96E, + 5957: 0xC96F, + 5958: 0x21D2, + 5959: 0x21D4, + 5960: 0x2200, + 5961: 0x2203, + 5962: 0x00B4, + 5963: 0xFF5E, + 5964: 0x02C7, + 5965: 0x02D8, + 5966: 0x02DD, + 5967: 0x02DA, + 5968: 0x02D9, + 5969: 0x00B8, + 5970: 0x02DB, + 5971: 0x00A1, + 5972: 0x00BF, + 5973: 0x02D0, + 5974: 0x222E, + 5975: 0x2211, + 5976: 0x220F, + 5977: 0x00A4, + 5978: 0x2109, + 5979: 0x2030, + 5980: 0x25C1, + 5981: 0x25C0, + 5982: 0x25B7, + 5983: 0x25B6, + 5984: 0x2664, + 5985: 0x2660, + 5986: 0x2661, + 5987: 0x2665, + 5988: 0x2667, + 5989: 0x2663, + 5990: 0x2299, + 5991: 0x25C8, + 5992: 0x25A3, + 5993: 0x25D0, + 5994: 0x25D1, + 5995: 0x2592, + 5996: 0x25A4, + 5997: 0x25A5, + 5998: 0x25A8, + 5999: 0x25A7, + 6000: 0x25A6, + 6001: 0x25A9, + 6002: 0x2668, + 6003: 0x260F, + 6004: 0x260E, + 6005: 0x261C, + 6006: 0x261E, + 6007: 0x00B6, + 6008: 0x2020, + 6009: 0x2021, + 6010: 0x2195, + 6011: 0x2197, + 6012: 0x2199, + 6013: 0x2196, + 6014: 0x2198, + 6015: 0x266D, + 6016: 0x2669, + 6017: 0x266A, + 6018: 0x266C, + 6019: 0x327F, + 6020: 0x321C, + 6021: 0x2116, + 6022: 0x33C7, + 6023: 0x2122, + 6024: 0x33C2, + 6025: 0x33D8, + 6026: 0x2121, + 6027: 0x20AC, + 6028: 0x00AE, + 6052: 0xC971, + 6053: 0xC972, + 6054: 0xC973, + 6055: 0xC975, + 6056: 0xC976, + 6057: 0xC977, + 6058: 0xC978, + 6059: 0xC979, + 6060: 0xC97A, + 6061: 0xC97B, + 6062: 0xC97D, + 6063: 0xC97E, + 6064: 0xC97F, + 6065: 0xC980, + 6066: 0xC981, + 6067: 0xC982, + 6068: 0xC983, + 6069: 0xC984, + 6070: 0xC985, + 6071: 0xC986, + 6072: 0xC987, + 6073: 0xC98A, + 6074: 0xC98B, + 6075: 0xC98D, + 6076: 0xC98E, + 6077: 0xC98F, + 6078: 0xC991, + 6079: 0xC992, + 6080: 0xC993, + 6081: 0xC994, + 6082: 0xC995, + 6083: 0xC996, + 6084: 0xC997, + 6085: 0xC99A, + 6086: 0xC99C, + 6087: 0xC99E, + 6088: 0xC99F, + 6089: 0xC9A0, + 6090: 0xC9A1, + 6091: 0xC9A2, + 6092: 0xC9A3, + 6093: 0xC9A4, + 6094: 0xC9A5, + 6095: 0xC9A6, + 6096: 0xC9A7, + 6097: 0xC9A8, + 6098: 0xC9A9, + 6099: 0xC9AA, + 6100: 0xC9AB, + 6101: 0xC9AC, + 6102: 0xC9AD, + 6103: 0xC9AE, + 6104: 0xC9AF, + 6105: 0xC9B0, + 6106: 0xC9B1, + 6107: 0xC9B2, + 6108: 0xC9B3, + 6109: 0xC9B4, + 6110: 0xC9B5, + 6111: 0xC9B6, + 6112: 0xC9B7, + 6113: 0xC9B8, + 6114: 0xC9B9, + 6115: 0xC9BA, + 6116: 0xC9BB, + 6117: 0xC9BC, + 6118: 0xC9BD, + 6119: 0xC9BE, + 6120: 0xC9BF, + 6121: 0xC9C2, + 6122: 0xC9C3, + 6123: 0xC9C5, + 6124: 0xC9C6, + 6125: 0xC9C9, + 6126: 0xC9CB, + 6127: 0xC9CC, + 6128: 0xC9CD, + 6129: 0xC9CE, + 6130: 0xC9CF, + 6131: 0xC9D2, + 6132: 0xC9D4, + 6133: 0xC9D7, + 6134: 0xC9D8, + 6135: 0xC9DB, + 6136: 0xFF01, + 6137: 0xFF02, + 6138: 0xFF03, + 6139: 0xFF04, + 6140: 0xFF05, + 6141: 0xFF06, + 6142: 0xFF07, + 6143: 0xFF08, + 6144: 0xFF09, + 6145: 0xFF0A, + 6146: 0xFF0B, + 6147: 0xFF0C, + 6148: 0xFF0D, + 6149: 0xFF0E, + 6150: 0xFF0F, + 6151: 0xFF10, + 6152: 0xFF11, + 6153: 0xFF12, + 6154: 0xFF13, + 6155: 0xFF14, + 6156: 0xFF15, + 6157: 0xFF16, + 6158: 0xFF17, + 6159: 0xFF18, + 6160: 0xFF19, + 6161: 0xFF1A, + 6162: 0xFF1B, + 6163: 0xFF1C, + 6164: 0xFF1D, + 6165: 0xFF1E, + 6166: 0xFF1F, + 6167: 0xFF20, + 6168: 0xFF21, + 6169: 0xFF22, + 6170: 0xFF23, + 6171: 0xFF24, + 6172: 0xFF25, + 6173: 0xFF26, + 6174: 0xFF27, + 6175: 0xFF28, + 6176: 0xFF29, + 6177: 0xFF2A, + 6178: 0xFF2B, + 6179: 0xFF2C, + 6180: 0xFF2D, + 6181: 0xFF2E, + 6182: 0xFF2F, + 6183: 0xFF30, + 6184: 0xFF31, + 6185: 0xFF32, + 6186: 0xFF33, + 6187: 0xFF34, + 6188: 0xFF35, + 6189: 0xFF36, + 6190: 0xFF37, + 6191: 0xFF38, + 6192: 0xFF39, + 6193: 0xFF3A, + 6194: 0xFF3B, + 6195: 0xFFE6, + 6196: 0xFF3D, + 6197: 0xFF3E, + 6198: 0xFF3F, + 6199: 0xFF40, + 6200: 0xFF41, + 6201: 0xFF42, + 6202: 0xFF43, + 6203: 0xFF44, + 6204: 0xFF45, + 6205: 0xFF46, + 6206: 0xFF47, + 6207: 0xFF48, + 6208: 0xFF49, + 6209: 0xFF4A, + 6210: 0xFF4B, + 6211: 0xFF4C, + 6212: 0xFF4D, + 6213: 0xFF4E, + 6214: 0xFF4F, + 6215: 0xFF50, + 6216: 0xFF51, + 6217: 0xFF52, + 6218: 0xFF53, + 6219: 0xFF54, + 6220: 0xFF55, + 6221: 0xFF56, + 6222: 0xFF57, + 6223: 0xFF58, + 6224: 0xFF59, + 6225: 0xFF5A, + 6226: 0xFF5B, + 6227: 0xFF5C, + 6228: 0xFF5D, + 6229: 0xFFE3, + 6230: 0xC9DE, + 6231: 0xC9DF, + 6232: 0xC9E1, + 6233: 0xC9E3, + 6234: 0xC9E5, + 6235: 0xC9E6, + 6236: 0xC9E8, + 6237: 0xC9E9, + 6238: 0xC9EA, + 6239: 0xC9EB, + 6240: 0xC9EE, + 6241: 0xC9F2, + 6242: 0xC9F3, + 6243: 0xC9F4, + 6244: 0xC9F5, + 6245: 0xC9F6, + 6246: 0xC9F7, + 6247: 0xC9FA, + 6248: 0xC9FB, + 6249: 0xC9FD, + 6250: 0xC9FE, + 6251: 0xC9FF, + 6252: 0xCA01, + 6253: 0xCA02, + 6254: 0xCA03, + 6255: 0xCA04, + 6256: 0xCA05, + 6257: 0xCA06, + 6258: 0xCA07, + 6259: 0xCA0A, + 6260: 0xCA0E, + 6261: 0xCA0F, + 6262: 0xCA10, + 6263: 0xCA11, + 6264: 0xCA12, + 6265: 0xCA13, + 6266: 0xCA15, + 6267: 0xCA16, + 6268: 0xCA17, + 6269: 0xCA19, + 6270: 0xCA1A, + 6271: 0xCA1B, + 6272: 0xCA1C, + 6273: 0xCA1D, + 6274: 0xCA1E, + 6275: 0xCA1F, + 6276: 0xCA20, + 6277: 0xCA21, + 6278: 0xCA22, + 6279: 0xCA23, + 6280: 0xCA24, + 6281: 0xCA25, + 6282: 0xCA26, + 6283: 0xCA27, + 6284: 0xCA28, + 6285: 0xCA2A, + 6286: 0xCA2B, + 6287: 0xCA2C, + 6288: 0xCA2D, + 6289: 0xCA2E, + 6290: 0xCA2F, + 6291: 0xCA30, + 6292: 0xCA31, + 6293: 0xCA32, + 6294: 0xCA33, + 6295: 0xCA34, + 6296: 0xCA35, + 6297: 0xCA36, + 6298: 0xCA37, + 6299: 0xCA38, + 6300: 0xCA39, + 6301: 0xCA3A, + 6302: 0xCA3B, + 6303: 0xCA3C, + 6304: 0xCA3D, + 6305: 0xCA3E, + 6306: 0xCA3F, + 6307: 0xCA40, + 6308: 0xCA41, + 6309: 0xCA42, + 6310: 0xCA43, + 6311: 0xCA44, + 6312: 0xCA45, + 6313: 0xCA46, + 6314: 0x3131, + 6315: 0x3132, + 6316: 0x3133, + 6317: 0x3134, + 6318: 0x3135, + 6319: 0x3136, + 6320: 0x3137, + 6321: 0x3138, + 6322: 0x3139, + 6323: 0x313A, + 6324: 0x313B, + 6325: 0x313C, + 6326: 0x313D, + 6327: 0x313E, + 6328: 0x313F, + 6329: 0x3140, + 6330: 0x3141, + 6331: 0x3142, + 6332: 0x3143, + 6333: 0x3144, + 6334: 0x3145, + 6335: 0x3146, + 6336: 0x3147, + 6337: 0x3148, + 6338: 0x3149, + 6339: 0x314A, + 6340: 0x314B, + 6341: 0x314C, + 6342: 0x314D, + 6343: 0x314E, + 6344: 0x314F, + 6345: 0x3150, + 6346: 0x3151, + 6347: 0x3152, + 6348: 0x3153, + 6349: 0x3154, + 6350: 0x3155, + 6351: 0x3156, + 6352: 0x3157, + 6353: 0x3158, + 6354: 0x3159, + 6355: 0x315A, + 6356: 0x315B, + 6357: 0x315C, + 6358: 0x315D, + 6359: 0x315E, + 6360: 0x315F, + 6361: 0x3160, + 6362: 0x3161, + 6363: 0x3162, + 6364: 0x3163, + 6365: 0x3164, + 6366: 0x3165, + 6367: 0x3166, + 6368: 0x3167, + 6369: 0x3168, + 6370: 0x3169, + 6371: 0x316A, + 6372: 0x316B, + 6373: 0x316C, + 6374: 0x316D, + 6375: 0x316E, + 6376: 0x316F, + 6377: 0x3170, + 6378: 0x3171, + 6379: 0x3172, + 6380: 0x3173, + 6381: 0x3174, + 6382: 0x3175, + 6383: 0x3176, + 6384: 0x3177, + 6385: 0x3178, + 6386: 0x3179, + 6387: 0x317A, + 6388: 0x317B, + 6389: 0x317C, + 6390: 0x317D, + 6391: 0x317E, + 6392: 0x317F, + 6393: 0x3180, + 6394: 0x3181, + 6395: 0x3182, + 6396: 0x3183, + 6397: 0x3184, + 6398: 0x3185, + 6399: 0x3186, + 6400: 0x3187, + 6401: 0x3188, + 6402: 0x3189, + 6403: 0x318A, + 6404: 0x318B, + 6405: 0x318C, + 6406: 0x318D, + 6407: 0x318E, + 6408: 0xCA47, + 6409: 0xCA48, + 6410: 0xCA49, + 6411: 0xCA4A, + 6412: 0xCA4B, + 6413: 0xCA4E, + 6414: 0xCA4F, + 6415: 0xCA51, + 6416: 0xCA52, + 6417: 0xCA53, + 6418: 0xCA55, + 6419: 0xCA56, + 6420: 0xCA57, + 6421: 0xCA58, + 6422: 0xCA59, + 6423: 0xCA5A, + 6424: 0xCA5B, + 6425: 0xCA5E, + 6426: 0xCA62, + 6427: 0xCA63, + 6428: 0xCA64, + 6429: 0xCA65, + 6430: 0xCA66, + 6431: 0xCA67, + 6432: 0xCA69, + 6433: 0xCA6A, + 6434: 0xCA6B, + 6435: 0xCA6C, + 6436: 0xCA6D, + 6437: 0xCA6E, + 6438: 0xCA6F, + 6439: 0xCA70, + 6440: 0xCA71, + 6441: 0xCA72, + 6442: 0xCA73, + 6443: 0xCA74, + 6444: 0xCA75, + 6445: 0xCA76, + 6446: 0xCA77, + 6447: 0xCA78, + 6448: 0xCA79, + 6449: 0xCA7A, + 6450: 0xCA7B, + 6451: 0xCA7C, + 6452: 0xCA7E, + 6453: 0xCA7F, + 6454: 0xCA80, + 6455: 0xCA81, + 6456: 0xCA82, + 6457: 0xCA83, + 6458: 0xCA85, + 6459: 0xCA86, + 6460: 0xCA87, + 6461: 0xCA88, + 6462: 0xCA89, + 6463: 0xCA8A, + 6464: 0xCA8B, + 6465: 0xCA8C, + 6466: 0xCA8D, + 6467: 0xCA8E, + 6468: 0xCA8F, + 6469: 0xCA90, + 6470: 0xCA91, + 6471: 0xCA92, + 6472: 0xCA93, + 6473: 0xCA94, + 6474: 0xCA95, + 6475: 0xCA96, + 6476: 0xCA97, + 6477: 0xCA99, + 6478: 0xCA9A, + 6479: 0xCA9B, + 6480: 0xCA9C, + 6481: 0xCA9D, + 6482: 0xCA9E, + 6483: 0xCA9F, + 6484: 0xCAA0, + 6485: 0xCAA1, + 6486: 0xCAA2, + 6487: 0xCAA3, + 6488: 0xCAA4, + 6489: 0xCAA5, + 6490: 0xCAA6, + 6491: 0xCAA7, + 6492: 0x2170, + 6493: 0x2171, + 6494: 0x2172, + 6495: 0x2173, + 6496: 0x2174, + 6497: 0x2175, + 6498: 0x2176, + 6499: 0x2177, + 6500: 0x2178, + 6501: 0x2179, + 6507: 0x2160, + 6508: 0x2161, + 6509: 0x2162, + 6510: 0x2163, + 6511: 0x2164, + 6512: 0x2165, + 6513: 0x2166, + 6514: 0x2167, + 6515: 0x2168, + 6516: 0x2169, + 6524: 0x0391, + 6525: 0x0392, + 6526: 0x0393, + 6527: 0x0394, + 6528: 0x0395, + 6529: 0x0396, + 6530: 0x0397, + 6531: 0x0398, + 6532: 0x0399, + 6533: 0x039A, + 6534: 0x039B, + 6535: 0x039C, + 6536: 0x039D, + 6537: 0x039E, + 6538: 0x039F, + 6539: 0x03A0, + 6540: 0x03A1, + 6541: 0x03A3, + 6542: 0x03A4, + 6543: 0x03A5, + 6544: 0x03A6, + 6545: 0x03A7, + 6546: 0x03A8, + 6547: 0x03A9, + 6556: 0x03B1, + 6557: 0x03B2, + 6558: 0x03B3, + 6559: 0x03B4, + 6560: 0x03B5, + 6561: 0x03B6, + 6562: 0x03B7, + 6563: 0x03B8, + 6564: 0x03B9, + 6565: 0x03BA, + 6566: 0x03BB, + 6567: 0x03BC, + 6568: 0x03BD, + 6569: 0x03BE, + 6570: 0x03BF, + 6571: 0x03C0, + 6572: 0x03C1, + 6573: 0x03C3, + 6574: 0x03C4, + 6575: 0x03C5, + 6576: 0x03C6, + 6577: 0x03C7, + 6578: 0x03C8, + 6579: 0x03C9, + 6586: 0xCAA8, + 6587: 0xCAA9, + 6588: 0xCAAA, + 6589: 0xCAAB, + 6590: 0xCAAC, + 6591: 0xCAAD, + 6592: 0xCAAE, + 6593: 0xCAAF, + 6594: 0xCAB0, + 6595: 0xCAB1, + 6596: 0xCAB2, + 6597: 0xCAB3, + 6598: 0xCAB4, + 6599: 0xCAB5, + 6600: 0xCAB6, + 6601: 0xCAB7, + 6602: 0xCAB8, + 6603: 0xCAB9, + 6604: 0xCABA, + 6605: 0xCABB, + 6606: 0xCABE, + 6607: 0xCABF, + 6608: 0xCAC1, + 6609: 0xCAC2, + 6610: 0xCAC3, + 6611: 0xCAC5, + 6612: 0xCAC6, + 6613: 0xCAC7, + 6614: 0xCAC8, + 6615: 0xCAC9, + 6616: 0xCACA, + 6617: 0xCACB, + 6618: 0xCACE, + 6619: 0xCAD0, + 6620: 0xCAD2, + 6621: 0xCAD4, + 6622: 0xCAD5, + 6623: 0xCAD6, + 6624: 0xCAD7, + 6625: 0xCADA, + 6626: 0xCADB, + 6627: 0xCADC, + 6628: 0xCADD, + 6629: 0xCADE, + 6630: 0xCADF, + 6631: 0xCAE1, + 6632: 0xCAE2, + 6633: 0xCAE3, + 6634: 0xCAE4, + 6635: 0xCAE5, + 6636: 0xCAE6, + 6637: 0xCAE7, + 6638: 0xCAE8, + 6639: 0xCAE9, + 6640: 0xCAEA, + 6641: 0xCAEB, + 6642: 0xCAED, + 6643: 0xCAEE, + 6644: 0xCAEF, + 6645: 0xCAF0, + 6646: 0xCAF1, + 6647: 0xCAF2, + 6648: 0xCAF3, + 6649: 0xCAF5, + 6650: 0xCAF6, + 6651: 0xCAF7, + 6652: 0xCAF8, + 6653: 0xCAF9, + 6654: 0xCAFA, + 6655: 0xCAFB, + 6656: 0xCAFC, + 6657: 0xCAFD, + 6658: 0xCAFE, + 6659: 0xCAFF, + 6660: 0xCB00, + 6661: 0xCB01, + 6662: 0xCB02, + 6663: 0xCB03, + 6664: 0xCB04, + 6665: 0xCB05, + 6666: 0xCB06, + 6667: 0xCB07, + 6668: 0xCB09, + 6669: 0xCB0A, + 6670: 0x2500, + 6671: 0x2502, + 6672: 0x250C, + 6673: 0x2510, + 6674: 0x2518, + 6675: 0x2514, + 6676: 0x251C, + 6677: 0x252C, + 6678: 0x2524, + 6679: 0x2534, + 6680: 0x253C, + 6681: 0x2501, + 6682: 0x2503, + 6683: 0x250F, + 6684: 0x2513, + 6685: 0x251B, + 6686: 0x2517, + 6687: 0x2523, + 6688: 0x2533, + 6689: 0x252B, + 6690: 0x253B, + 6691: 0x254B, + 6692: 0x2520, + 6693: 0x252F, + 6694: 0x2528, + 6695: 0x2537, + 6696: 0x253F, + 6697: 0x251D, + 6698: 0x2530, + 6699: 0x2525, + 6700: 0x2538, + 6701: 0x2542, + 6702: 0x2512, + 6703: 0x2511, + 6704: 0x251A, + 6705: 0x2519, + 6706: 0x2516, + 6707: 0x2515, + 6708: 0x250E, + 6709: 0x250D, + 6710: 0x251E, + 6711: 0x251F, + 6712: 0x2521, + 6713: 0x2522, + 6714: 0x2526, + 6715: 0x2527, + 6716: 0x2529, + 6717: 0x252A, + 6718: 0x252D, + 6719: 0x252E, + 6720: 0x2531, + 6721: 0x2532, + 6722: 0x2535, + 6723: 0x2536, + 6724: 0x2539, + 6725: 0x253A, + 6726: 0x253D, + 6727: 0x253E, + 6728: 0x2540, + 6729: 0x2541, + 6730: 0x2543, + 6731: 0x2544, + 6732: 0x2545, + 6733: 0x2546, + 6734: 0x2547, + 6735: 0x2548, + 6736: 0x2549, + 6737: 0x254A, + 6764: 0xCB0B, + 6765: 0xCB0C, + 6766: 0xCB0D, + 6767: 0xCB0E, + 6768: 0xCB0F, + 6769: 0xCB11, + 6770: 0xCB12, + 6771: 0xCB13, + 6772: 0xCB15, + 6773: 0xCB16, + 6774: 0xCB17, + 6775: 0xCB19, + 6776: 0xCB1A, + 6777: 0xCB1B, + 6778: 0xCB1C, + 6779: 0xCB1D, + 6780: 0xCB1E, + 6781: 0xCB1F, + 6782: 0xCB22, + 6783: 0xCB23, + 6784: 0xCB24, + 6785: 0xCB25, + 6786: 0xCB26, + 6787: 0xCB27, + 6788: 0xCB28, + 6789: 0xCB29, + 6790: 0xCB2A, + 6791: 0xCB2B, + 6792: 0xCB2C, + 6793: 0xCB2D, + 6794: 0xCB2E, + 6795: 0xCB2F, + 6796: 0xCB30, + 6797: 0xCB31, + 6798: 0xCB32, + 6799: 0xCB33, + 6800: 0xCB34, + 6801: 0xCB35, + 6802: 0xCB36, + 6803: 0xCB37, + 6804: 0xCB38, + 6805: 0xCB39, + 6806: 0xCB3A, + 6807: 0xCB3B, + 6808: 0xCB3C, + 6809: 0xCB3D, + 6810: 0xCB3E, + 6811: 0xCB3F, + 6812: 0xCB40, + 6813: 0xCB42, + 6814: 0xCB43, + 6815: 0xCB44, + 6816: 0xCB45, + 6817: 0xCB46, + 6818: 0xCB47, + 6819: 0xCB4A, + 6820: 0xCB4B, + 6821: 0xCB4D, + 6822: 0xCB4E, + 6823: 0xCB4F, + 6824: 0xCB51, + 6825: 0xCB52, + 6826: 0xCB53, + 6827: 0xCB54, + 6828: 0xCB55, + 6829: 0xCB56, + 6830: 0xCB57, + 6831: 0xCB5A, + 6832: 0xCB5B, + 6833: 0xCB5C, + 6834: 0xCB5E, + 6835: 0xCB5F, + 6836: 0xCB60, + 6837: 0xCB61, + 6838: 0xCB62, + 6839: 0xCB63, + 6840: 0xCB65, + 6841: 0xCB66, + 6842: 0xCB67, + 6843: 0xCB68, + 6844: 0xCB69, + 6845: 0xCB6A, + 6846: 0xCB6B, + 6847: 0xCB6C, + 6848: 0x3395, + 6849: 0x3396, + 6850: 0x3397, + 6851: 0x2113, + 6852: 0x3398, + 6853: 0x33C4, + 6854: 0x33A3, + 6855: 0x33A4, + 6856: 0x33A5, + 6857: 0x33A6, + 6858: 0x3399, + 6859: 0x339A, + 6860: 0x339B, + 6861: 0x339C, + 6862: 0x339D, + 6863: 0x339E, + 6864: 0x339F, + 6865: 0x33A0, + 6866: 0x33A1, + 6867: 0x33A2, + 6868: 0x33CA, + 6869: 0x338D, + 6870: 0x338E, + 6871: 0x338F, + 6872: 0x33CF, + 6873: 0x3388, + 6874: 0x3389, + 6875: 0x33C8, + 6876: 0x33A7, + 6877: 0x33A8, + 6878: 0x33B0, + 6879: 0x33B1, + 6880: 0x33B2, + 6881: 0x33B3, + 6882: 0x33B4, + 6883: 0x33B5, + 6884: 0x33B6, + 6885: 0x33B7, + 6886: 0x33B8, + 6887: 0x33B9, + 6888: 0x3380, + 6889: 0x3381, + 6890: 0x3382, + 6891: 0x3383, + 6892: 0x3384, + 6893: 0x33BA, + 6894: 0x33BB, + 6895: 0x33BC, + 6896: 0x33BD, + 6897: 0x33BE, + 6898: 0x33BF, + 6899: 0x3390, + 6900: 0x3391, + 6901: 0x3392, + 6902: 0x3393, + 6903: 0x3394, + 6904: 0x2126, + 6905: 0x33C0, + 6906: 0x33C1, + 6907: 0x338A, + 6908: 0x338B, + 6909: 0x338C, + 6910: 0x33D6, + 6911: 0x33C5, + 6912: 0x33AD, + 6913: 0x33AE, + 6914: 0x33AF, + 6915: 0x33DB, + 6916: 0x33A9, + 6917: 0x33AA, + 6918: 0x33AB, + 6919: 0x33AC, + 6920: 0x33DD, + 6921: 0x33D0, + 6922: 0x33D3, + 6923: 0x33C3, + 6924: 0x33C9, + 6925: 0x33DC, + 6926: 0x33C6, + 6942: 0xCB6D, + 6943: 0xCB6E, + 6944: 0xCB6F, + 6945: 0xCB70, + 6946: 0xCB71, + 6947: 0xCB72, + 6948: 0xCB73, + 6949: 0xCB74, + 6950: 0xCB75, + 6951: 0xCB76, + 6952: 0xCB77, + 6953: 0xCB7A, + 6954: 0xCB7B, + 6955: 0xCB7C, + 6956: 0xCB7D, + 6957: 0xCB7E, + 6958: 0xCB7F, + 6959: 0xCB80, + 6960: 0xCB81, + 6961: 0xCB82, + 6962: 0xCB83, + 6963: 0xCB84, + 6964: 0xCB85, + 6965: 0xCB86, + 6966: 0xCB87, + 6967: 0xCB88, + 6968: 0xCB89, + 6969: 0xCB8A, + 6970: 0xCB8B, + 6971: 0xCB8C, + 6972: 0xCB8D, + 6973: 0xCB8E, + 6974: 0xCB8F, + 6975: 0xCB90, + 6976: 0xCB91, + 6977: 0xCB92, + 6978: 0xCB93, + 6979: 0xCB94, + 6980: 0xCB95, + 6981: 0xCB96, + 6982: 0xCB97, + 6983: 0xCB98, + 6984: 0xCB99, + 6985: 0xCB9A, + 6986: 0xCB9B, + 6987: 0xCB9D, + 6988: 0xCB9E, + 6989: 0xCB9F, + 6990: 0xCBA0, + 6991: 0xCBA1, + 6992: 0xCBA2, + 6993: 0xCBA3, + 6994: 0xCBA4, + 6995: 0xCBA5, + 6996: 0xCBA6, + 6997: 0xCBA7, + 6998: 0xCBA8, + 6999: 0xCBA9, + 7000: 0xCBAA, + 7001: 0xCBAB, + 7002: 0xCBAC, + 7003: 0xCBAD, + 7004: 0xCBAE, + 7005: 0xCBAF, + 7006: 0xCBB0, + 7007: 0xCBB1, + 7008: 0xCBB2, + 7009: 0xCBB3, + 7010: 0xCBB4, + 7011: 0xCBB5, + 7012: 0xCBB6, + 7013: 0xCBB7, + 7014: 0xCBB9, + 7015: 0xCBBA, + 7016: 0xCBBB, + 7017: 0xCBBC, + 7018: 0xCBBD, + 7019: 0xCBBE, + 7020: 0xCBBF, + 7021: 0xCBC0, + 7022: 0xCBC1, + 7023: 0xCBC2, + 7024: 0xCBC3, + 7025: 0xCBC4, + 7026: 0x00C6, + 7027: 0x00D0, + 7028: 0x00AA, + 7029: 0x0126, + 7031: 0x0132, + 7033: 0x013F, + 7034: 0x0141, + 7035: 0x00D8, + 7036: 0x0152, + 7037: 0x00BA, + 7038: 0x00DE, + 7039: 0x0166, + 7040: 0x014A, + 7042: 0x3260, + 7043: 0x3261, + 7044: 0x3262, + 7045: 0x3263, + 7046: 0x3264, + 7047: 0x3265, + 7048: 0x3266, + 7049: 0x3267, + 7050: 0x3268, + 7051: 0x3269, + 7052: 0x326A, + 7053: 0x326B, + 7054: 0x326C, + 7055: 0x326D, + 7056: 0x326E, + 7057: 0x326F, + 7058: 0x3270, + 7059: 0x3271, + 7060: 0x3272, + 7061: 0x3273, + 7062: 0x3274, + 7063: 0x3275, + 7064: 0x3276, + 7065: 0x3277, + 7066: 0x3278, + 7067: 0x3279, + 7068: 0x327A, + 7069: 0x327B, + 7070: 0x24D0, + 7071: 0x24D1, + 7072: 0x24D2, + 7073: 0x24D3, + 7074: 0x24D4, + 7075: 0x24D5, + 7076: 0x24D6, + 7077: 0x24D7, + 7078: 0x24D8, + 7079: 0x24D9, + 7080: 0x24DA, + 7081: 0x24DB, + 7082: 0x24DC, + 7083: 0x24DD, + 7084: 0x24DE, + 7085: 0x24DF, + 7086: 0x24E0, + 7087: 0x24E1, + 7088: 0x24E2, + 7089: 0x24E3, + 7090: 0x24E4, + 7091: 0x24E5, + 7092: 0x24E6, + 7093: 0x24E7, + 7094: 0x24E8, + 7095: 0x24E9, + 7096: 0x2460, + 7097: 0x2461, + 7098: 0x2462, + 7099: 0x2463, + 7100: 0x2464, + 7101: 0x2465, + 7102: 0x2466, + 7103: 0x2467, + 7104: 0x2468, + 7105: 0x2469, + 7106: 0x246A, + 7107: 0x246B, + 7108: 0x246C, + 7109: 0x246D, + 7110: 0x246E, + 7111: 0x00BD, + 7112: 0x2153, + 7113: 0x2154, + 7114: 0x00BC, + 7115: 0x00BE, + 7116: 0x215B, + 7117: 0x215C, + 7118: 0x215D, + 7119: 0x215E, + 7120: 0xCBC5, + 7121: 0xCBC6, + 7122: 0xCBC7, + 7123: 0xCBC8, + 7124: 0xCBC9, + 7125: 0xCBCA, + 7126: 0xCBCB, + 7127: 0xCBCC, + 7128: 0xCBCD, + 7129: 0xCBCE, + 7130: 0xCBCF, + 7131: 0xCBD0, + 7132: 0xCBD1, + 7133: 0xCBD2, + 7134: 0xCBD3, + 7135: 0xCBD5, + 7136: 0xCBD6, + 7137: 0xCBD7, + 7138: 0xCBD8, + 7139: 0xCBD9, + 7140: 0xCBDA, + 7141: 0xCBDB, + 7142: 0xCBDC, + 7143: 0xCBDD, + 7144: 0xCBDE, + 7145: 0xCBDF, + 7146: 0xCBE0, + 7147: 0xCBE1, + 7148: 0xCBE2, + 7149: 0xCBE3, + 7150: 0xCBE5, + 7151: 0xCBE6, + 7152: 0xCBE8, + 7153: 0xCBEA, + 7154: 0xCBEB, + 7155: 0xCBEC, + 7156: 0xCBED, + 7157: 0xCBEE, + 7158: 0xCBEF, + 7159: 0xCBF0, + 7160: 0xCBF1, + 7161: 0xCBF2, + 7162: 0xCBF3, + 7163: 0xCBF4, + 7164: 0xCBF5, + 7165: 0xCBF6, + 7166: 0xCBF7, + 7167: 0xCBF8, + 7168: 0xCBF9, + 7169: 0xCBFA, + 7170: 0xCBFB, + 7171: 0xCBFC, + 7172: 0xCBFD, + 7173: 0xCBFE, + 7174: 0xCBFF, + 7175: 0xCC00, + 7176: 0xCC01, + 7177: 0xCC02, + 7178: 0xCC03, + 7179: 0xCC04, + 7180: 0xCC05, + 7181: 0xCC06, + 7182: 0xCC07, + 7183: 0xCC08, + 7184: 0xCC09, + 7185: 0xCC0A, + 7186: 0xCC0B, + 7187: 0xCC0E, + 7188: 0xCC0F, + 7189: 0xCC11, + 7190: 0xCC12, + 7191: 0xCC13, + 7192: 0xCC15, + 7193: 0xCC16, + 7194: 0xCC17, + 7195: 0xCC18, + 7196: 0xCC19, + 7197: 0xCC1A, + 7198: 0xCC1B, + 7199: 0xCC1E, + 7200: 0xCC1F, + 7201: 0xCC20, + 7202: 0xCC23, + 7203: 0xCC24, + 7204: 0x00E6, + 7205: 0x0111, + 7206: 0x00F0, + 7207: 0x0127, + 7208: 0x0131, + 7209: 0x0133, + 7210: 0x0138, + 7211: 0x0140, + 7212: 0x0142, + 7213: 0x00F8, + 7214: 0x0153, + 7215: 0x00DF, + 7216: 0x00FE, + 7217: 0x0167, + 7218: 0x014B, + 7219: 0x0149, + 7220: 0x3200, + 7221: 0x3201, + 7222: 0x3202, + 7223: 0x3203, + 7224: 0x3204, + 7225: 0x3205, + 7226: 0x3206, + 7227: 0x3207, + 7228: 0x3208, + 7229: 0x3209, + 7230: 0x320A, + 7231: 0x320B, + 7232: 0x320C, + 7233: 0x320D, + 7234: 0x320E, + 7235: 0x320F, + 7236: 0x3210, + 7237: 0x3211, + 7238: 0x3212, + 7239: 0x3213, + 7240: 0x3214, + 7241: 0x3215, + 7242: 0x3216, + 7243: 0x3217, + 7244: 0x3218, + 7245: 0x3219, + 7246: 0x321A, + 7247: 0x321B, + 7248: 0x249C, + 7249: 0x249D, + 7250: 0x249E, + 7251: 0x249F, + 7252: 0x24A0, + 7253: 0x24A1, + 7254: 0x24A2, + 7255: 0x24A3, + 7256: 0x24A4, + 7257: 0x24A5, + 7258: 0x24A6, + 7259: 0x24A7, + 7260: 0x24A8, + 7261: 0x24A9, + 7262: 0x24AA, + 7263: 0x24AB, + 7264: 0x24AC, + 7265: 0x24AD, + 7266: 0x24AE, + 7267: 0x24AF, + 7268: 0x24B0, + 7269: 0x24B1, + 7270: 0x24B2, + 7271: 0x24B3, + 7272: 0x24B4, + 7273: 0x24B5, + 7274: 0x2474, + 7275: 0x2475, + 7276: 0x2476, + 7277: 0x2477, + 7278: 0x2478, + 7279: 0x2479, + 7280: 0x247A, + 7281: 0x247B, + 7282: 0x247C, + 7283: 0x247D, + 7284: 0x247E, + 7285: 0x247F, + 7286: 0x2480, + 7287: 0x2481, + 7288: 0x2482, + 7289: 0x00B9, + 7290: 0x00B2, + 7291: 0x00B3, + 7292: 0x2074, + 7293: 0x207F, + 7294: 0x2081, + 7295: 0x2082, + 7296: 0x2083, + 7297: 0x2084, + 7298: 0xCC25, + 7299: 0xCC26, + 7300: 0xCC2A, + 7301: 0xCC2B, + 7302: 0xCC2D, + 7303: 0xCC2F, + 7304: 0xCC31, + 7305: 0xCC32, + 7306: 0xCC33, + 7307: 0xCC34, + 7308: 0xCC35, + 7309: 0xCC36, + 7310: 0xCC37, + 7311: 0xCC3A, + 7312: 0xCC3F, + 7313: 0xCC40, + 7314: 0xCC41, + 7315: 0xCC42, + 7316: 0xCC43, + 7317: 0xCC46, + 7318: 0xCC47, + 7319: 0xCC49, + 7320: 0xCC4A, + 7321: 0xCC4B, + 7322: 0xCC4D, + 7323: 0xCC4E, + 7324: 0xCC4F, + 7325: 0xCC50, + 7326: 0xCC51, + 7327: 0xCC52, + 7328: 0xCC53, + 7329: 0xCC56, + 7330: 0xCC5A, + 7331: 0xCC5B, + 7332: 0xCC5C, + 7333: 0xCC5D, + 7334: 0xCC5E, + 7335: 0xCC5F, + 7336: 0xCC61, + 7337: 0xCC62, + 7338: 0xCC63, + 7339: 0xCC65, + 7340: 0xCC67, + 7341: 0xCC69, + 7342: 0xCC6A, + 7343: 0xCC6B, + 7344: 0xCC6C, + 7345: 0xCC6D, + 7346: 0xCC6E, + 7347: 0xCC6F, + 7348: 0xCC71, + 7349: 0xCC72, + 7350: 0xCC73, + 7351: 0xCC74, + 7352: 0xCC76, + 7353: 0xCC77, + 7354: 0xCC78, + 7355: 0xCC79, + 7356: 0xCC7A, + 7357: 0xCC7B, + 7358: 0xCC7C, + 7359: 0xCC7D, + 7360: 0xCC7E, + 7361: 0xCC7F, + 7362: 0xCC80, + 7363: 0xCC81, + 7364: 0xCC82, + 7365: 0xCC83, + 7366: 0xCC84, + 7367: 0xCC85, + 7368: 0xCC86, + 7369: 0xCC87, + 7370: 0xCC88, + 7371: 0xCC89, + 7372: 0xCC8A, + 7373: 0xCC8B, + 7374: 0xCC8C, + 7375: 0xCC8D, + 7376: 0xCC8E, + 7377: 0xCC8F, + 7378: 0xCC90, + 7379: 0xCC91, + 7380: 0xCC92, + 7381: 0xCC93, + 7382: 0x3041, + 7383: 0x3042, + 7384: 0x3043, + 7385: 0x3044, + 7386: 0x3045, + 7387: 0x3046, + 7388: 0x3047, + 7389: 0x3048, + 7390: 0x3049, + 7391: 0x304A, + 7392: 0x304B, + 7393: 0x304C, + 7394: 0x304D, + 7395: 0x304E, + 7396: 0x304F, + 7397: 0x3050, + 7398: 0x3051, + 7399: 0x3052, + 7400: 0x3053, + 7401: 0x3054, + 7402: 0x3055, + 7403: 0x3056, + 7404: 0x3057, + 7405: 0x3058, + 7406: 0x3059, + 7407: 0x305A, + 7408: 0x305B, + 7409: 0x305C, + 7410: 0x305D, + 7411: 0x305E, + 7412: 0x305F, + 7413: 0x3060, + 7414: 0x3061, + 7415: 0x3062, + 7416: 0x3063, + 7417: 0x3064, + 7418: 0x3065, + 7419: 0x3066, + 7420: 0x3067, + 7421: 0x3068, + 7422: 0x3069, + 7423: 0x306A, + 7424: 0x306B, + 7425: 0x306C, + 7426: 0x306D, + 7427: 0x306E, + 7428: 0x306F, + 7429: 0x3070, + 7430: 0x3071, + 7431: 0x3072, + 7432: 0x3073, + 7433: 0x3074, + 7434: 0x3075, + 7435: 0x3076, + 7436: 0x3077, + 7437: 0x3078, + 7438: 0x3079, + 7439: 0x307A, + 7440: 0x307B, + 7441: 0x307C, + 7442: 0x307D, + 7443: 0x307E, + 7444: 0x307F, + 7445: 0x3080, + 7446: 0x3081, + 7447: 0x3082, + 7448: 0x3083, + 7449: 0x3084, + 7450: 0x3085, + 7451: 0x3086, + 7452: 0x3087, + 7453: 0x3088, + 7454: 0x3089, + 7455: 0x308A, + 7456: 0x308B, + 7457: 0x308C, + 7458: 0x308D, + 7459: 0x308E, + 7460: 0x308F, + 7461: 0x3090, + 7462: 0x3091, + 7463: 0x3092, + 7464: 0x3093, + 7476: 0xCC94, + 7477: 0xCC95, + 7478: 0xCC96, + 7479: 0xCC97, + 7480: 0xCC9A, + 7481: 0xCC9B, + 7482: 0xCC9D, + 7483: 0xCC9E, + 7484: 0xCC9F, + 7485: 0xCCA1, + 7486: 0xCCA2, + 7487: 0xCCA3, + 7488: 0xCCA4, + 7489: 0xCCA5, + 7490: 0xCCA6, + 7491: 0xCCA7, + 7492: 0xCCAA, + 7493: 0xCCAE, + 7494: 0xCCAF, + 7495: 0xCCB0, + 7496: 0xCCB1, + 7497: 0xCCB2, + 7498: 0xCCB3, + 7499: 0xCCB6, + 7500: 0xCCB7, + 7501: 0xCCB9, + 7502: 0xCCBA, + 7503: 0xCCBB, + 7504: 0xCCBD, + 7505: 0xCCBE, + 7506: 0xCCBF, + 7507: 0xCCC0, + 7508: 0xCCC1, + 7509: 0xCCC2, + 7510: 0xCCC3, + 7511: 0xCCC6, + 7512: 0xCCC8, + 7513: 0xCCCA, + 7514: 0xCCCB, + 7515: 0xCCCC, + 7516: 0xCCCD, + 7517: 0xCCCE, + 7518: 0xCCCF, + 7519: 0xCCD1, + 7520: 0xCCD2, + 7521: 0xCCD3, + 7522: 0xCCD5, + 7523: 0xCCD6, + 7524: 0xCCD7, + 7525: 0xCCD8, + 7526: 0xCCD9, + 7527: 0xCCDA, + 7528: 0xCCDB, + 7529: 0xCCDC, + 7530: 0xCCDD, + 7531: 0xCCDE, + 7532: 0xCCDF, + 7533: 0xCCE0, + 7534: 0xCCE1, + 7535: 0xCCE2, + 7536: 0xCCE3, + 7537: 0xCCE5, + 7538: 0xCCE6, + 7539: 0xCCE7, + 7540: 0xCCE8, + 7541: 0xCCE9, + 7542: 0xCCEA, + 7543: 0xCCEB, + 7544: 0xCCED, + 7545: 0xCCEE, + 7546: 0xCCEF, + 7547: 0xCCF1, + 7548: 0xCCF2, + 7549: 0xCCF3, + 7550: 0xCCF4, + 7551: 0xCCF5, + 7552: 0xCCF6, + 7553: 0xCCF7, + 7554: 0xCCF8, + 7555: 0xCCF9, + 7556: 0xCCFA, + 7557: 0xCCFB, + 7558: 0xCCFC, + 7559: 0xCCFD, + 7560: 0x30A1, + 7561: 0x30A2, + 7562: 0x30A3, + 7563: 0x30A4, + 7564: 0x30A5, + 7565: 0x30A6, + 7566: 0x30A7, + 7567: 0x30A8, + 7568: 0x30A9, + 7569: 0x30AA, + 7570: 0x30AB, + 7571: 0x30AC, + 7572: 0x30AD, + 7573: 0x30AE, + 7574: 0x30AF, + 7575: 0x30B0, + 7576: 0x30B1, + 7577: 0x30B2, + 7578: 0x30B3, + 7579: 0x30B4, + 7580: 0x30B5, + 7581: 0x30B6, + 7582: 0x30B7, + 7583: 0x30B8, + 7584: 0x30B9, + 7585: 0x30BA, + 7586: 0x30BB, + 7587: 0x30BC, + 7588: 0x30BD, + 7589: 0x30BE, + 7590: 0x30BF, + 7591: 0x30C0, + 7592: 0x30C1, + 7593: 0x30C2, + 7594: 0x30C3, + 7595: 0x30C4, + 7596: 0x30C5, + 7597: 0x30C6, + 7598: 0x30C7, + 7599: 0x30C8, + 7600: 0x30C9, + 7601: 0x30CA, + 7602: 0x30CB, + 7603: 0x30CC, + 7604: 0x30CD, + 7605: 0x30CE, + 7606: 0x30CF, + 7607: 0x30D0, + 7608: 0x30D1, + 7609: 0x30D2, + 7610: 0x30D3, + 7611: 0x30D4, + 7612: 0x30D5, + 7613: 0x30D6, + 7614: 0x30D7, + 7615: 0x30D8, + 7616: 0x30D9, + 7617: 0x30DA, + 7618: 0x30DB, + 7619: 0x30DC, + 7620: 0x30DD, + 7621: 0x30DE, + 7622: 0x30DF, + 7623: 0x30E0, + 7624: 0x30E1, + 7625: 0x30E2, + 7626: 0x30E3, + 7627: 0x30E4, + 7628: 0x30E5, + 7629: 0x30E6, + 7630: 0x30E7, + 7631: 0x30E8, + 7632: 0x30E9, + 7633: 0x30EA, + 7634: 0x30EB, + 7635: 0x30EC, + 7636: 0x30ED, + 7637: 0x30EE, + 7638: 0x30EF, + 7639: 0x30F0, + 7640: 0x30F1, + 7641: 0x30F2, + 7642: 0x30F3, + 7643: 0x30F4, + 7644: 0x30F5, + 7645: 0x30F6, + 7654: 0xCCFE, + 7655: 0xCCFF, + 7656: 0xCD00, + 7657: 0xCD02, + 7658: 0xCD03, + 7659: 0xCD04, + 7660: 0xCD05, + 7661: 0xCD06, + 7662: 0xCD07, + 7663: 0xCD0A, + 7664: 0xCD0B, + 7665: 0xCD0D, + 7666: 0xCD0E, + 7667: 0xCD0F, + 7668: 0xCD11, + 7669: 0xCD12, + 7670: 0xCD13, + 7671: 0xCD14, + 7672: 0xCD15, + 7673: 0xCD16, + 7674: 0xCD17, + 7675: 0xCD1A, + 7676: 0xCD1C, + 7677: 0xCD1E, + 7678: 0xCD1F, + 7679: 0xCD20, + 7680: 0xCD21, + 7681: 0xCD22, + 7682: 0xCD23, + 7683: 0xCD25, + 7684: 0xCD26, + 7685: 0xCD27, + 7686: 0xCD29, + 7687: 0xCD2A, + 7688: 0xCD2B, + 7689: 0xCD2D, + 7690: 0xCD2E, + 7691: 0xCD2F, + 7692: 0xCD30, + 7693: 0xCD31, + 7694: 0xCD32, + 7695: 0xCD33, + 7696: 0xCD34, + 7697: 0xCD35, + 7698: 0xCD36, + 7699: 0xCD37, + 7700: 0xCD38, + 7701: 0xCD3A, + 7702: 0xCD3B, + 7703: 0xCD3C, + 7704: 0xCD3D, + 7705: 0xCD3E, + 7706: 0xCD3F, + 7707: 0xCD40, + 7708: 0xCD41, + 7709: 0xCD42, + 7710: 0xCD43, + 7711: 0xCD44, + 7712: 0xCD45, + 7713: 0xCD46, + 7714: 0xCD47, + 7715: 0xCD48, + 7716: 0xCD49, + 7717: 0xCD4A, + 7718: 0xCD4B, + 7719: 0xCD4C, + 7720: 0xCD4D, + 7721: 0xCD4E, + 7722: 0xCD4F, + 7723: 0xCD50, + 7724: 0xCD51, + 7725: 0xCD52, + 7726: 0xCD53, + 7727: 0xCD54, + 7728: 0xCD55, + 7729: 0xCD56, + 7730: 0xCD57, + 7731: 0xCD58, + 7732: 0xCD59, + 7733: 0xCD5A, + 7734: 0xCD5B, + 7735: 0xCD5D, + 7736: 0xCD5E, + 7737: 0xCD5F, + 7738: 0x0410, + 7739: 0x0411, + 7740: 0x0412, + 7741: 0x0413, + 7742: 0x0414, + 7743: 0x0415, + 7744: 0x0401, + 7745: 0x0416, + 7746: 0x0417, + 7747: 0x0418, + 7748: 0x0419, + 7749: 0x041A, + 7750: 0x041B, + 7751: 0x041C, + 7752: 0x041D, + 7753: 0x041E, + 7754: 0x041F, + 7755: 0x0420, + 7756: 0x0421, + 7757: 0x0422, + 7758: 0x0423, + 7759: 0x0424, + 7760: 0x0425, + 7761: 0x0426, + 7762: 0x0427, + 7763: 0x0428, + 7764: 0x0429, + 7765: 0x042A, + 7766: 0x042B, + 7767: 0x042C, + 7768: 0x042D, + 7769: 0x042E, + 7770: 0x042F, + 7786: 0x0430, + 7787: 0x0431, + 7788: 0x0432, + 7789: 0x0433, + 7790: 0x0434, + 7791: 0x0435, + 7792: 0x0451, + 7793: 0x0436, + 7794: 0x0437, + 7795: 0x0438, + 7796: 0x0439, + 7797: 0x043A, + 7798: 0x043B, + 7799: 0x043C, + 7800: 0x043D, + 7801: 0x043E, + 7802: 0x043F, + 7803: 0x0440, + 7804: 0x0441, + 7805: 0x0442, + 7806: 0x0443, + 7807: 0x0444, + 7808: 0x0445, + 7809: 0x0446, + 7810: 0x0447, + 7811: 0x0448, + 7812: 0x0449, + 7813: 0x044A, + 7814: 0x044B, + 7815: 0x044C, + 7816: 0x044D, + 7817: 0x044E, + 7818: 0x044F, + 7832: 0xCD61, + 7833: 0xCD62, + 7834: 0xCD63, + 7835: 0xCD65, + 7836: 0xCD66, + 7837: 0xCD67, + 7838: 0xCD68, + 7839: 0xCD69, + 7840: 0xCD6A, + 7841: 0xCD6B, + 7842: 0xCD6E, + 7843: 0xCD70, + 7844: 0xCD72, + 7845: 0xCD73, + 7846: 0xCD74, + 7847: 0xCD75, + 7848: 0xCD76, + 7849: 0xCD77, + 7850: 0xCD79, + 7851: 0xCD7A, + 7852: 0xCD7B, + 7853: 0xCD7C, + 7854: 0xCD7D, + 7855: 0xCD7E, + 7856: 0xCD7F, + 7857: 0xCD80, + 7858: 0xCD81, + 7859: 0xCD82, + 7860: 0xCD83, + 7861: 0xCD84, + 7862: 0xCD85, + 7863: 0xCD86, + 7864: 0xCD87, + 7865: 0xCD89, + 7866: 0xCD8A, + 7867: 0xCD8B, + 7868: 0xCD8C, + 7869: 0xCD8D, + 7870: 0xCD8E, + 7871: 0xCD8F, + 7872: 0xCD90, + 7873: 0xCD91, + 7874: 0xCD92, + 7875: 0xCD93, + 7876: 0xCD96, + 7877: 0xCD97, + 7878: 0xCD99, + 7879: 0xCD9A, + 7880: 0xCD9B, + 7881: 0xCD9D, + 7882: 0xCD9E, + 7883: 0xCD9F, + 7884: 0xCDA0, + 7885: 0xCDA1, + 7886: 0xCDA2, + 7887: 0xCDA3, + 7888: 0xCDA6, + 7889: 0xCDA8, + 7890: 0xCDAA, + 7891: 0xCDAB, + 7892: 0xCDAC, + 7893: 0xCDAD, + 7894: 0xCDAE, + 7895: 0xCDAF, + 7896: 0xCDB1, + 7897: 0xCDB2, + 7898: 0xCDB3, + 7899: 0xCDB4, + 7900: 0xCDB5, + 7901: 0xCDB6, + 7902: 0xCDB7, + 7903: 0xCDB8, + 7904: 0xCDB9, + 7905: 0xCDBA, + 7906: 0xCDBB, + 7907: 0xCDBC, + 7908: 0xCDBD, + 7909: 0xCDBE, + 7910: 0xCDBF, + 7911: 0xCDC0, + 7912: 0xCDC1, + 7913: 0xCDC2, + 7914: 0xCDC3, + 7915: 0xCDC5, + 8010: 0xCDC6, + 8011: 0xCDC7, + 8012: 0xCDC8, + 8013: 0xCDC9, + 8014: 0xCDCA, + 8015: 0xCDCB, + 8016: 0xCDCD, + 8017: 0xCDCE, + 8018: 0xCDCF, + 8019: 0xCDD1, + 8020: 0xCDD2, + 8021: 0xCDD3, + 8022: 0xCDD4, + 8023: 0xCDD5, + 8024: 0xCDD6, + 8025: 0xCDD7, + 8026: 0xCDD8, + 8027: 0xCDD9, + 8028: 0xCDDA, + 8029: 0xCDDB, + 8030: 0xCDDC, + 8031: 0xCDDD, + 8032: 0xCDDE, + 8033: 0xCDDF, + 8034: 0xCDE0, + 8035: 0xCDE1, + 8036: 0xCDE2, + 8037: 0xCDE3, + 8038: 0xCDE4, + 8039: 0xCDE5, + 8040: 0xCDE6, + 8041: 0xCDE7, + 8042: 0xCDE9, + 8043: 0xCDEA, + 8044: 0xCDEB, + 8045: 0xCDED, + 8046: 0xCDEE, + 8047: 0xCDEF, + 8048: 0xCDF1, + 8049: 0xCDF2, + 8050: 0xCDF3, + 8051: 0xCDF4, + 8052: 0xCDF5, + 8053: 0xCDF6, + 8054: 0xCDF7, + 8055: 0xCDFA, + 8056: 0xCDFC, + 8057: 0xCDFE, + 8058: 0xCDFF, + 8059: 0xCE00, + 8060: 0xCE01, + 8061: 0xCE02, + 8062: 0xCE03, + 8063: 0xCE05, + 8064: 0xCE06, + 8065: 0xCE07, + 8066: 0xCE09, + 8067: 0xCE0A, + 8068: 0xCE0B, + 8069: 0xCE0D, + 8070: 0xCE0E, + 8071: 0xCE0F, + 8072: 0xCE10, + 8073: 0xCE11, + 8074: 0xCE12, + 8075: 0xCE13, + 8076: 0xCE15, + 8077: 0xCE16, + 8078: 0xCE17, + 8079: 0xCE18, + 8080: 0xCE1A, + 8081: 0xCE1B, + 8082: 0xCE1C, + 8083: 0xCE1D, + 8084: 0xCE1E, + 8085: 0xCE1F, + 8086: 0xCE22, + 8087: 0xCE23, + 8088: 0xCE25, + 8089: 0xCE26, + 8090: 0xCE27, + 8091: 0xCE29, + 8092: 0xCE2A, + 8093: 0xCE2B, + 8188: 0xCE2C, + 8189: 0xCE2D, + 8190: 0xCE2E, + 8191: 0xCE2F, + 8192: 0xCE32, + 8193: 0xCE34, + 8194: 0xCE36, + 8195: 0xCE37, + 8196: 0xCE38, + 8197: 0xCE39, + 8198: 0xCE3A, + 8199: 0xCE3B, + 8200: 0xCE3C, + 8201: 0xCE3D, + 8202: 0xCE3E, + 8203: 0xCE3F, + 8204: 0xCE40, + 8205: 0xCE41, + 8206: 0xCE42, + 8207: 0xCE43, + 8208: 0xCE44, + 8209: 0xCE45, + 8210: 0xCE46, + 8211: 0xCE47, + 8212: 0xCE48, + 8213: 0xCE49, + 8214: 0xCE4A, + 8215: 0xCE4B, + 8216: 0xCE4C, + 8217: 0xCE4D, + 8218: 0xCE4E, + 8219: 0xCE4F, + 8220: 0xCE50, + 8221: 0xCE51, + 8222: 0xCE52, + 8223: 0xCE53, + 8224: 0xCE54, + 8225: 0xCE55, + 8226: 0xCE56, + 8227: 0xCE57, + 8228: 0xCE5A, + 8229: 0xCE5B, + 8230: 0xCE5D, + 8231: 0xCE5E, + 8232: 0xCE62, + 8233: 0xCE63, + 8234: 0xCE64, + 8235: 0xCE65, + 8236: 0xCE66, + 8237: 0xCE67, + 8238: 0xCE6A, + 8239: 0xCE6C, + 8240: 0xCE6E, + 8241: 0xCE6F, + 8242: 0xCE70, + 8243: 0xCE71, + 8244: 0xCE72, + 8245: 0xCE73, + 8246: 0xCE76, + 8247: 0xCE77, + 8248: 0xCE79, + 8249: 0xCE7A, + 8250: 0xCE7B, + 8251: 0xCE7D, + 8252: 0xCE7E, + 8253: 0xCE7F, + 8254: 0xCE80, + 8255: 0xCE81, + 8256: 0xCE82, + 8257: 0xCE83, + 8258: 0xCE86, + 8259: 0xCE88, + 8260: 0xCE8A, + 8261: 0xCE8B, + 8262: 0xCE8C, + 8263: 0xCE8D, + 8264: 0xCE8E, + 8265: 0xCE8F, + 8266: 0xCE92, + 8267: 0xCE93, + 8268: 0xCE95, + 8269: 0xCE96, + 8270: 0xCE97, + 8271: 0xCE99, + 8366: 0xCE9A, + 8367: 0xCE9B, + 8368: 0xCE9C, + 8369: 0xCE9D, + 8370: 0xCE9E, + 8371: 0xCE9F, + 8372: 0xCEA2, + 8373: 0xCEA6, + 8374: 0xCEA7, + 8375: 0xCEA8, + 8376: 0xCEA9, + 8377: 0xCEAA, + 8378: 0xCEAB, + 8379: 0xCEAE, + 8380: 0xCEAF, + 8381: 0xCEB0, + 8382: 0xCEB1, + 8383: 0xCEB2, + 8384: 0xCEB3, + 8385: 0xCEB4, + 8386: 0xCEB5, + 8387: 0xCEB6, + 8388: 0xCEB7, + 8389: 0xCEB8, + 8390: 0xCEB9, + 8391: 0xCEBA, + 8392: 0xCEBB, + 8393: 0xCEBC, + 8394: 0xCEBD, + 8395: 0xCEBE, + 8396: 0xCEBF, + 8397: 0xCEC0, + 8398: 0xCEC2, + 8399: 0xCEC3, + 8400: 0xCEC4, + 8401: 0xCEC5, + 8402: 0xCEC6, + 8403: 0xCEC7, + 8404: 0xCEC8, + 8405: 0xCEC9, + 8406: 0xCECA, + 8407: 0xCECB, + 8408: 0xCECC, + 8409: 0xCECD, + 8410: 0xCECE, + 8411: 0xCECF, + 8412: 0xCED0, + 8413: 0xCED1, + 8414: 0xCED2, + 8415: 0xCED3, + 8416: 0xCED4, + 8417: 0xCED5, + 8418: 0xCED6, + 8419: 0xCED7, + 8420: 0xCED8, + 8421: 0xCED9, + 8422: 0xCEDA, + 8423: 0xCEDB, + 8424: 0xCEDC, + 8425: 0xCEDD, + 8426: 0xCEDE, + 8427: 0xCEDF, + 8428: 0xCEE0, + 8429: 0xCEE1, + 8430: 0xCEE2, + 8431: 0xCEE3, + 8432: 0xCEE6, + 8433: 0xCEE7, + 8434: 0xCEE9, + 8435: 0xCEEA, + 8436: 0xCEED, + 8437: 0xCEEE, + 8438: 0xCEEF, + 8439: 0xCEF0, + 8440: 0xCEF1, + 8441: 0xCEF2, + 8442: 0xCEF3, + 8443: 0xCEF6, + 8444: 0xCEFA, + 8445: 0xCEFB, + 8446: 0xCEFC, + 8447: 0xCEFD, + 8448: 0xCEFE, + 8449: 0xCEFF, + 8450: 0xAC00, + 8451: 0xAC01, + 8452: 0xAC04, + 8453: 0xAC07, + 8454: 0xAC08, + 8455: 0xAC09, + 8456: 0xAC0A, + 8457: 0xAC10, + 8458: 0xAC11, + 8459: 0xAC12, + 8460: 0xAC13, + 8461: 0xAC14, + 8462: 0xAC15, + 8463: 0xAC16, + 8464: 0xAC17, + 8465: 0xAC19, + 8466: 0xAC1A, + 8467: 0xAC1B, + 8468: 0xAC1C, + 8469: 0xAC1D, + 8470: 0xAC20, + 8471: 0xAC24, + 8472: 0xAC2C, + 8473: 0xAC2D, + 8474: 0xAC2F, + 8475: 0xAC30, + 8476: 0xAC31, + 8477: 0xAC38, + 8478: 0xAC39, + 8479: 0xAC3C, + 8480: 0xAC40, + 8481: 0xAC4B, + 8482: 0xAC4D, + 8483: 0xAC54, + 8484: 0xAC58, + 8485: 0xAC5C, + 8486: 0xAC70, + 8487: 0xAC71, + 8488: 0xAC74, + 8489: 0xAC77, + 8490: 0xAC78, + 8491: 0xAC7A, + 8492: 0xAC80, + 8493: 0xAC81, + 8494: 0xAC83, + 8495: 0xAC84, + 8496: 0xAC85, + 8497: 0xAC86, + 8498: 0xAC89, + 8499: 0xAC8A, + 8500: 0xAC8B, + 8501: 0xAC8C, + 8502: 0xAC90, + 8503: 0xAC94, + 8504: 0xAC9C, + 8505: 0xAC9D, + 8506: 0xAC9F, + 8507: 0xACA0, + 8508: 0xACA1, + 8509: 0xACA8, + 8510: 0xACA9, + 8511: 0xACAA, + 8512: 0xACAC, + 8513: 0xACAF, + 8514: 0xACB0, + 8515: 0xACB8, + 8516: 0xACB9, + 8517: 0xACBB, + 8518: 0xACBC, + 8519: 0xACBD, + 8520: 0xACC1, + 8521: 0xACC4, + 8522: 0xACC8, + 8523: 0xACCC, + 8524: 0xACD5, + 8525: 0xACD7, + 8526: 0xACE0, + 8527: 0xACE1, + 8528: 0xACE4, + 8529: 0xACE7, + 8530: 0xACE8, + 8531: 0xACEA, + 8532: 0xACEC, + 8533: 0xACEF, + 8534: 0xACF0, + 8535: 0xACF1, + 8536: 0xACF3, + 8537: 0xACF5, + 8538: 0xACF6, + 8539: 0xACFC, + 8540: 0xACFD, + 8541: 0xAD00, + 8542: 0xAD04, + 8543: 0xAD06, + 8544: 0xCF02, + 8545: 0xCF03, + 8546: 0xCF05, + 8547: 0xCF06, + 8548: 0xCF07, + 8549: 0xCF09, + 8550: 0xCF0A, + 8551: 0xCF0B, + 8552: 0xCF0C, + 8553: 0xCF0D, + 8554: 0xCF0E, + 8555: 0xCF0F, + 8556: 0xCF12, + 8557: 0xCF14, + 8558: 0xCF16, + 8559: 0xCF17, + 8560: 0xCF18, + 8561: 0xCF19, + 8562: 0xCF1A, + 8563: 0xCF1B, + 8564: 0xCF1D, + 8565: 0xCF1E, + 8566: 0xCF1F, + 8567: 0xCF21, + 8568: 0xCF22, + 8569: 0xCF23, + 8570: 0xCF25, + 8571: 0xCF26, + 8572: 0xCF27, + 8573: 0xCF28, + 8574: 0xCF29, + 8575: 0xCF2A, + 8576: 0xCF2B, + 8577: 0xCF2E, + 8578: 0xCF32, + 8579: 0xCF33, + 8580: 0xCF34, + 8581: 0xCF35, + 8582: 0xCF36, + 8583: 0xCF37, + 8584: 0xCF39, + 8585: 0xCF3A, + 8586: 0xCF3B, + 8587: 0xCF3C, + 8588: 0xCF3D, + 8589: 0xCF3E, + 8590: 0xCF3F, + 8591: 0xCF40, + 8592: 0xCF41, + 8593: 0xCF42, + 8594: 0xCF43, + 8595: 0xCF44, + 8596: 0xCF45, + 8597: 0xCF46, + 8598: 0xCF47, + 8599: 0xCF48, + 8600: 0xCF49, + 8601: 0xCF4A, + 8602: 0xCF4B, + 8603: 0xCF4C, + 8604: 0xCF4D, + 8605: 0xCF4E, + 8606: 0xCF4F, + 8607: 0xCF50, + 8608: 0xCF51, + 8609: 0xCF52, + 8610: 0xCF53, + 8611: 0xCF56, + 8612: 0xCF57, + 8613: 0xCF59, + 8614: 0xCF5A, + 8615: 0xCF5B, + 8616: 0xCF5D, + 8617: 0xCF5E, + 8618: 0xCF5F, + 8619: 0xCF60, + 8620: 0xCF61, + 8621: 0xCF62, + 8622: 0xCF63, + 8623: 0xCF66, + 8624: 0xCF68, + 8625: 0xCF6A, + 8626: 0xCF6B, + 8627: 0xCF6C, + 8628: 0xAD0C, + 8629: 0xAD0D, + 8630: 0xAD0F, + 8631: 0xAD11, + 8632: 0xAD18, + 8633: 0xAD1C, + 8634: 0xAD20, + 8635: 0xAD29, + 8636: 0xAD2C, + 8637: 0xAD2D, + 8638: 0xAD34, + 8639: 0xAD35, + 8640: 0xAD38, + 8641: 0xAD3C, + 8642: 0xAD44, + 8643: 0xAD45, + 8644: 0xAD47, + 8645: 0xAD49, + 8646: 0xAD50, + 8647: 0xAD54, + 8648: 0xAD58, + 8649: 0xAD61, + 8650: 0xAD63, + 8651: 0xAD6C, + 8652: 0xAD6D, + 8653: 0xAD70, + 8654: 0xAD73, + 8655: 0xAD74, + 8656: 0xAD75, + 8657: 0xAD76, + 8658: 0xAD7B, + 8659: 0xAD7C, + 8660: 0xAD7D, + 8661: 0xAD7F, + 8662: 0xAD81, + 8663: 0xAD82, + 8664: 0xAD88, + 8665: 0xAD89, + 8666: 0xAD8C, + 8667: 0xAD90, + 8668: 0xAD9C, + 8669: 0xAD9D, + 8670: 0xADA4, + 8671: 0xADB7, + 8672: 0xADC0, + 8673: 0xADC1, + 8674: 0xADC4, + 8675: 0xADC8, + 8676: 0xADD0, + 8677: 0xADD1, + 8678: 0xADD3, + 8679: 0xADDC, + 8680: 0xADE0, + 8681: 0xADE4, + 8682: 0xADF8, + 8683: 0xADF9, + 8684: 0xADFC, + 8685: 0xADFF, + 8686: 0xAE00, + 8687: 0xAE01, + 8688: 0xAE08, + 8689: 0xAE09, + 8690: 0xAE0B, + 8691: 0xAE0D, + 8692: 0xAE14, + 8693: 0xAE30, + 8694: 0xAE31, + 8695: 0xAE34, + 8696: 0xAE37, + 8697: 0xAE38, + 8698: 0xAE3A, + 8699: 0xAE40, + 8700: 0xAE41, + 8701: 0xAE43, + 8702: 0xAE45, + 8703: 0xAE46, + 8704: 0xAE4A, + 8705: 0xAE4C, + 8706: 0xAE4D, + 8707: 0xAE4E, + 8708: 0xAE50, + 8709: 0xAE54, + 8710: 0xAE56, + 8711: 0xAE5C, + 8712: 0xAE5D, + 8713: 0xAE5F, + 8714: 0xAE60, + 8715: 0xAE61, + 8716: 0xAE65, + 8717: 0xAE68, + 8718: 0xAE69, + 8719: 0xAE6C, + 8720: 0xAE70, + 8721: 0xAE78, + 8722: 0xCF6D, + 8723: 0xCF6E, + 8724: 0xCF6F, + 8725: 0xCF72, + 8726: 0xCF73, + 8727: 0xCF75, + 8728: 0xCF76, + 8729: 0xCF77, + 8730: 0xCF79, + 8731: 0xCF7A, + 8732: 0xCF7B, + 8733: 0xCF7C, + 8734: 0xCF7D, + 8735: 0xCF7E, + 8736: 0xCF7F, + 8737: 0xCF81, + 8738: 0xCF82, + 8739: 0xCF83, + 8740: 0xCF84, + 8741: 0xCF86, + 8742: 0xCF87, + 8743: 0xCF88, + 8744: 0xCF89, + 8745: 0xCF8A, + 8746: 0xCF8B, + 8747: 0xCF8D, + 8748: 0xCF8E, + 8749: 0xCF8F, + 8750: 0xCF90, + 8751: 0xCF91, + 8752: 0xCF92, + 8753: 0xCF93, + 8754: 0xCF94, + 8755: 0xCF95, + 8756: 0xCF96, + 8757: 0xCF97, + 8758: 0xCF98, + 8759: 0xCF99, + 8760: 0xCF9A, + 8761: 0xCF9B, + 8762: 0xCF9C, + 8763: 0xCF9D, + 8764: 0xCF9E, + 8765: 0xCF9F, + 8766: 0xCFA0, + 8767: 0xCFA2, + 8768: 0xCFA3, + 8769: 0xCFA4, + 8770: 0xCFA5, + 8771: 0xCFA6, + 8772: 0xCFA7, + 8773: 0xCFA9, + 8774: 0xCFAA, + 8775: 0xCFAB, + 8776: 0xCFAC, + 8777: 0xCFAD, + 8778: 0xCFAE, + 8779: 0xCFAF, + 8780: 0xCFB1, + 8781: 0xCFB2, + 8782: 0xCFB3, + 8783: 0xCFB4, + 8784: 0xCFB5, + 8785: 0xCFB6, + 8786: 0xCFB7, + 8787: 0xCFB8, + 8788: 0xCFB9, + 8789: 0xCFBA, + 8790: 0xCFBB, + 8791: 0xCFBC, + 8792: 0xCFBD, + 8793: 0xCFBE, + 8794: 0xCFBF, + 8795: 0xCFC0, + 8796: 0xCFC1, + 8797: 0xCFC2, + 8798: 0xCFC3, + 8799: 0xCFC5, + 8800: 0xCFC6, + 8801: 0xCFC7, + 8802: 0xCFC8, + 8803: 0xCFC9, + 8804: 0xCFCA, + 8805: 0xCFCB, + 8806: 0xAE79, + 8807: 0xAE7B, + 8808: 0xAE7C, + 8809: 0xAE7D, + 8810: 0xAE84, + 8811: 0xAE85, + 8812: 0xAE8C, + 8813: 0xAEBC, + 8814: 0xAEBD, + 8815: 0xAEBE, + 8816: 0xAEC0, + 8817: 0xAEC4, + 8818: 0xAECC, + 8819: 0xAECD, + 8820: 0xAECF, + 8821: 0xAED0, + 8822: 0xAED1, + 8823: 0xAED8, + 8824: 0xAED9, + 8825: 0xAEDC, + 8826: 0xAEE8, + 8827: 0xAEEB, + 8828: 0xAEED, + 8829: 0xAEF4, + 8830: 0xAEF8, + 8831: 0xAEFC, + 8832: 0xAF07, + 8833: 0xAF08, + 8834: 0xAF0D, + 8835: 0xAF10, + 8836: 0xAF2C, + 8837: 0xAF2D, + 8838: 0xAF30, + 8839: 0xAF32, + 8840: 0xAF34, + 8841: 0xAF3C, + 8842: 0xAF3D, + 8843: 0xAF3F, + 8844: 0xAF41, + 8845: 0xAF42, + 8846: 0xAF43, + 8847: 0xAF48, + 8848: 0xAF49, + 8849: 0xAF50, + 8850: 0xAF5C, + 8851: 0xAF5D, + 8852: 0xAF64, + 8853: 0xAF65, + 8854: 0xAF79, + 8855: 0xAF80, + 8856: 0xAF84, + 8857: 0xAF88, + 8858: 0xAF90, + 8859: 0xAF91, + 8860: 0xAF95, + 8861: 0xAF9C, + 8862: 0xAFB8, + 8863: 0xAFB9, + 8864: 0xAFBC, + 8865: 0xAFC0, + 8866: 0xAFC7, + 8867: 0xAFC8, + 8868: 0xAFC9, + 8869: 0xAFCB, + 8870: 0xAFCD, + 8871: 0xAFCE, + 8872: 0xAFD4, + 8873: 0xAFDC, + 8874: 0xAFE8, + 8875: 0xAFE9, + 8876: 0xAFF0, + 8877: 0xAFF1, + 8878: 0xAFF4, + 8879: 0xAFF8, + 8880: 0xB000, + 8881: 0xB001, + 8882: 0xB004, + 8883: 0xB00C, + 8884: 0xB010, + 8885: 0xB014, + 8886: 0xB01C, + 8887: 0xB01D, + 8888: 0xB028, + 8889: 0xB044, + 8890: 0xB045, + 8891: 0xB048, + 8892: 0xB04A, + 8893: 0xB04C, + 8894: 0xB04E, + 8895: 0xB053, + 8896: 0xB054, + 8897: 0xB055, + 8898: 0xB057, + 8899: 0xB059, + 8900: 0xCFCC, + 8901: 0xCFCD, + 8902: 0xCFCE, + 8903: 0xCFCF, + 8904: 0xCFD0, + 8905: 0xCFD1, + 8906: 0xCFD2, + 8907: 0xCFD3, + 8908: 0xCFD4, + 8909: 0xCFD5, + 8910: 0xCFD6, + 8911: 0xCFD7, + 8912: 0xCFD8, + 8913: 0xCFD9, + 8914: 0xCFDA, + 8915: 0xCFDB, + 8916: 0xCFDC, + 8917: 0xCFDD, + 8918: 0xCFDE, + 8919: 0xCFDF, + 8920: 0xCFE2, + 8921: 0xCFE3, + 8922: 0xCFE5, + 8923: 0xCFE6, + 8924: 0xCFE7, + 8925: 0xCFE9, + 8926: 0xCFEA, + 8927: 0xCFEB, + 8928: 0xCFEC, + 8929: 0xCFED, + 8930: 0xCFEE, + 8931: 0xCFEF, + 8932: 0xCFF2, + 8933: 0xCFF4, + 8934: 0xCFF6, + 8935: 0xCFF7, + 8936: 0xCFF8, + 8937: 0xCFF9, + 8938: 0xCFFA, + 8939: 0xCFFB, + 8940: 0xCFFD, + 8941: 0xCFFE, + 8942: 0xCFFF, + 8943: 0xD001, + 8944: 0xD002, + 8945: 0xD003, + 8946: 0xD005, + 8947: 0xD006, + 8948: 0xD007, + 8949: 0xD008, + 8950: 0xD009, + 8951: 0xD00A, + 8952: 0xD00B, + 8953: 0xD00C, + 8954: 0xD00D, + 8955: 0xD00E, + 8956: 0xD00F, + 8957: 0xD010, + 8958: 0xD012, + 8959: 0xD013, + 8960: 0xD014, + 8961: 0xD015, + 8962: 0xD016, + 8963: 0xD017, + 8964: 0xD019, + 8965: 0xD01A, + 8966: 0xD01B, + 8967: 0xD01C, + 8968: 0xD01D, + 8969: 0xD01E, + 8970: 0xD01F, + 8971: 0xD020, + 8972: 0xD021, + 8973: 0xD022, + 8974: 0xD023, + 8975: 0xD024, + 8976: 0xD025, + 8977: 0xD026, + 8978: 0xD027, + 8979: 0xD028, + 8980: 0xD029, + 8981: 0xD02A, + 8982: 0xD02B, + 8983: 0xD02C, + 8984: 0xB05D, + 8985: 0xB07C, + 8986: 0xB07D, + 8987: 0xB080, + 8988: 0xB084, + 8989: 0xB08C, + 8990: 0xB08D, + 8991: 0xB08F, + 8992: 0xB091, + 8993: 0xB098, + 8994: 0xB099, + 8995: 0xB09A, + 8996: 0xB09C, + 8997: 0xB09F, + 8998: 0xB0A0, + 8999: 0xB0A1, + 9000: 0xB0A2, + 9001: 0xB0A8, + 9002: 0xB0A9, + 9003: 0xB0AB, + 9004: 0xB0AC, + 9005: 0xB0AD, + 9006: 0xB0AE, + 9007: 0xB0AF, + 9008: 0xB0B1, + 9009: 0xB0B3, + 9010: 0xB0B4, + 9011: 0xB0B5, + 9012: 0xB0B8, + 9013: 0xB0BC, + 9014: 0xB0C4, + 9015: 0xB0C5, + 9016: 0xB0C7, + 9017: 0xB0C8, + 9018: 0xB0C9, + 9019: 0xB0D0, + 9020: 0xB0D1, + 9021: 0xB0D4, + 9022: 0xB0D8, + 9023: 0xB0E0, + 9024: 0xB0E5, + 9025: 0xB108, + 9026: 0xB109, + 9027: 0xB10B, + 9028: 0xB10C, + 9029: 0xB110, + 9030: 0xB112, + 9031: 0xB113, + 9032: 0xB118, + 9033: 0xB119, + 9034: 0xB11B, + 9035: 0xB11C, + 9036: 0xB11D, + 9037: 0xB123, + 9038: 0xB124, + 9039: 0xB125, + 9040: 0xB128, + 9041: 0xB12C, + 9042: 0xB134, + 9043: 0xB135, + 9044: 0xB137, + 9045: 0xB138, + 9046: 0xB139, + 9047: 0xB140, + 9048: 0xB141, + 9049: 0xB144, + 9050: 0xB148, + 9051: 0xB150, + 9052: 0xB151, + 9053: 0xB154, + 9054: 0xB155, + 9055: 0xB158, + 9056: 0xB15C, + 9057: 0xB160, + 9058: 0xB178, + 9059: 0xB179, + 9060: 0xB17C, + 9061: 0xB180, + 9062: 0xB182, + 9063: 0xB188, + 9064: 0xB189, + 9065: 0xB18B, + 9066: 0xB18D, + 9067: 0xB192, + 9068: 0xB193, + 9069: 0xB194, + 9070: 0xB198, + 9071: 0xB19C, + 9072: 0xB1A8, + 9073: 0xB1CC, + 9074: 0xB1D0, + 9075: 0xB1D4, + 9076: 0xB1DC, + 9077: 0xB1DD, + 9078: 0xD02E, + 9079: 0xD02F, + 9080: 0xD030, + 9081: 0xD031, + 9082: 0xD032, + 9083: 0xD033, + 9084: 0xD036, + 9085: 0xD037, + 9086: 0xD039, + 9087: 0xD03A, + 9088: 0xD03B, + 9089: 0xD03D, + 9090: 0xD03E, + 9091: 0xD03F, + 9092: 0xD040, + 9093: 0xD041, + 9094: 0xD042, + 9095: 0xD043, + 9096: 0xD046, + 9097: 0xD048, + 9098: 0xD04A, + 9099: 0xD04B, + 9100: 0xD04C, + 9101: 0xD04D, + 9102: 0xD04E, + 9103: 0xD04F, + 9104: 0xD051, + 9105: 0xD052, + 9106: 0xD053, + 9107: 0xD055, + 9108: 0xD056, + 9109: 0xD057, + 9110: 0xD059, + 9111: 0xD05A, + 9112: 0xD05B, + 9113: 0xD05C, + 9114: 0xD05D, + 9115: 0xD05E, + 9116: 0xD05F, + 9117: 0xD061, + 9118: 0xD062, + 9119: 0xD063, + 9120: 0xD064, + 9121: 0xD065, + 9122: 0xD066, + 9123: 0xD067, + 9124: 0xD068, + 9125: 0xD069, + 9126: 0xD06A, + 9127: 0xD06B, + 9128: 0xD06E, + 9129: 0xD06F, + 9130: 0xD071, + 9131: 0xD072, + 9132: 0xD073, + 9133: 0xD075, + 9134: 0xD076, + 9135: 0xD077, + 9136: 0xD078, + 9137: 0xD079, + 9138: 0xD07A, + 9139: 0xD07B, + 9140: 0xD07E, + 9141: 0xD07F, + 9142: 0xD080, + 9143: 0xD082, + 9144: 0xD083, + 9145: 0xD084, + 9146: 0xD085, + 9147: 0xD086, + 9148: 0xD087, + 9149: 0xD088, + 9150: 0xD089, + 9151: 0xD08A, + 9152: 0xD08B, + 9153: 0xD08C, + 9154: 0xD08D, + 9155: 0xD08E, + 9156: 0xD08F, + 9157: 0xD090, + 9158: 0xD091, + 9159: 0xD092, + 9160: 0xD093, + 9161: 0xD094, + 9162: 0xB1DF, + 9163: 0xB1E8, + 9164: 0xB1E9, + 9165: 0xB1EC, + 9166: 0xB1F0, + 9167: 0xB1F9, + 9168: 0xB1FB, + 9169: 0xB1FD, + 9170: 0xB204, + 9171: 0xB205, + 9172: 0xB208, + 9173: 0xB20B, + 9174: 0xB20C, + 9175: 0xB214, + 9176: 0xB215, + 9177: 0xB217, + 9178: 0xB219, + 9179: 0xB220, + 9180: 0xB234, + 9181: 0xB23C, + 9182: 0xB258, + 9183: 0xB25C, + 9184: 0xB260, + 9185: 0xB268, + 9186: 0xB269, + 9187: 0xB274, + 9188: 0xB275, + 9189: 0xB27C, + 9190: 0xB284, + 9191: 0xB285, + 9192: 0xB289, + 9193: 0xB290, + 9194: 0xB291, + 9195: 0xB294, + 9196: 0xB298, + 9197: 0xB299, + 9198: 0xB29A, + 9199: 0xB2A0, + 9200: 0xB2A1, + 9201: 0xB2A3, + 9202: 0xB2A5, + 9203: 0xB2A6, + 9204: 0xB2AA, + 9205: 0xB2AC, + 9206: 0xB2B0, + 9207: 0xB2B4, + 9208: 0xB2C8, + 9209: 0xB2C9, + 9210: 0xB2CC, + 9211: 0xB2D0, + 9212: 0xB2D2, + 9213: 0xB2D8, + 9214: 0xB2D9, + 9215: 0xB2DB, + 9216: 0xB2DD, + 9217: 0xB2E2, + 9218: 0xB2E4, + 9219: 0xB2E5, + 9220: 0xB2E6, + 9221: 0xB2E8, + 9222: 0xB2EB, + 9223: 0xB2EC, + 9224: 0xB2ED, + 9225: 0xB2EE, + 9226: 0xB2EF, + 9227: 0xB2F3, + 9228: 0xB2F4, + 9229: 0xB2F5, + 9230: 0xB2F7, + 9231: 0xB2F8, + 9232: 0xB2F9, + 9233: 0xB2FA, + 9234: 0xB2FB, + 9235: 0xB2FF, + 9236: 0xB300, + 9237: 0xB301, + 9238: 0xB304, + 9239: 0xB308, + 9240: 0xB310, + 9241: 0xB311, + 9242: 0xB313, + 9243: 0xB314, + 9244: 0xB315, + 9245: 0xB31C, + 9246: 0xB354, + 9247: 0xB355, + 9248: 0xB356, + 9249: 0xB358, + 9250: 0xB35B, + 9251: 0xB35C, + 9252: 0xB35E, + 9253: 0xB35F, + 9254: 0xB364, + 9255: 0xB365, + 9256: 0xD095, + 9257: 0xD096, + 9258: 0xD097, + 9259: 0xD098, + 9260: 0xD099, + 9261: 0xD09A, + 9262: 0xD09B, + 9263: 0xD09C, + 9264: 0xD09D, + 9265: 0xD09E, + 9266: 0xD09F, + 9267: 0xD0A0, + 9268: 0xD0A1, + 9269: 0xD0A2, + 9270: 0xD0A3, + 9271: 0xD0A6, + 9272: 0xD0A7, + 9273: 0xD0A9, + 9274: 0xD0AA, + 9275: 0xD0AB, + 9276: 0xD0AD, + 9277: 0xD0AE, + 9278: 0xD0AF, + 9279: 0xD0B0, + 9280: 0xD0B1, + 9281: 0xD0B2, + 9282: 0xD0B3, + 9283: 0xD0B6, + 9284: 0xD0B8, + 9285: 0xD0BA, + 9286: 0xD0BB, + 9287: 0xD0BC, + 9288: 0xD0BD, + 9289: 0xD0BE, + 9290: 0xD0BF, + 9291: 0xD0C2, + 9292: 0xD0C3, + 9293: 0xD0C5, + 9294: 0xD0C6, + 9295: 0xD0C7, + 9296: 0xD0CA, + 9297: 0xD0CB, + 9298: 0xD0CC, + 9299: 0xD0CD, + 9300: 0xD0CE, + 9301: 0xD0CF, + 9302: 0xD0D2, + 9303: 0xD0D6, + 9304: 0xD0D7, + 9305: 0xD0D8, + 9306: 0xD0D9, + 9307: 0xD0DA, + 9308: 0xD0DB, + 9309: 0xD0DE, + 9310: 0xD0DF, + 9311: 0xD0E1, + 9312: 0xD0E2, + 9313: 0xD0E3, + 9314: 0xD0E5, + 9315: 0xD0E6, + 9316: 0xD0E7, + 9317: 0xD0E8, + 9318: 0xD0E9, + 9319: 0xD0EA, + 9320: 0xD0EB, + 9321: 0xD0EE, + 9322: 0xD0F2, + 9323: 0xD0F3, + 9324: 0xD0F4, + 9325: 0xD0F5, + 9326: 0xD0F6, + 9327: 0xD0F7, + 9328: 0xD0F9, + 9329: 0xD0FA, + 9330: 0xD0FB, + 9331: 0xD0FC, + 9332: 0xD0FD, + 9333: 0xD0FE, + 9334: 0xD0FF, + 9335: 0xD100, + 9336: 0xD101, + 9337: 0xD102, + 9338: 0xD103, + 9339: 0xD104, + 9340: 0xB367, + 9341: 0xB369, + 9342: 0xB36B, + 9343: 0xB36E, + 9344: 0xB370, + 9345: 0xB371, + 9346: 0xB374, + 9347: 0xB378, + 9348: 0xB380, + 9349: 0xB381, + 9350: 0xB383, + 9351: 0xB384, + 9352: 0xB385, + 9353: 0xB38C, + 9354: 0xB390, + 9355: 0xB394, + 9356: 0xB3A0, + 9357: 0xB3A1, + 9358: 0xB3A8, + 9359: 0xB3AC, + 9360: 0xB3C4, + 9361: 0xB3C5, + 9362: 0xB3C8, + 9363: 0xB3CB, + 9364: 0xB3CC, + 9365: 0xB3CE, + 9366: 0xB3D0, + 9367: 0xB3D4, + 9368: 0xB3D5, + 9369: 0xB3D7, + 9370: 0xB3D9, + 9371: 0xB3DB, + 9372: 0xB3DD, + 9373: 0xB3E0, + 9374: 0xB3E4, + 9375: 0xB3E8, + 9376: 0xB3FC, + 9377: 0xB410, + 9378: 0xB418, + 9379: 0xB41C, + 9380: 0xB420, + 9381: 0xB428, + 9382: 0xB429, + 9383: 0xB42B, + 9384: 0xB434, + 9385: 0xB450, + 9386: 0xB451, + 9387: 0xB454, + 9388: 0xB458, + 9389: 0xB460, + 9390: 0xB461, + 9391: 0xB463, + 9392: 0xB465, + 9393: 0xB46C, + 9394: 0xB480, + 9395: 0xB488, + 9396: 0xB49D, + 9397: 0xB4A4, + 9398: 0xB4A8, + 9399: 0xB4AC, + 9400: 0xB4B5, + 9401: 0xB4B7, + 9402: 0xB4B9, + 9403: 0xB4C0, + 9404: 0xB4C4, + 9405: 0xB4C8, + 9406: 0xB4D0, + 9407: 0xB4D5, + 9408: 0xB4DC, + 9409: 0xB4DD, + 9410: 0xB4E0, + 9411: 0xB4E3, + 9412: 0xB4E4, + 9413: 0xB4E6, + 9414: 0xB4EC, + 9415: 0xB4ED, + 9416: 0xB4EF, + 9417: 0xB4F1, + 9418: 0xB4F8, + 9419: 0xB514, + 9420: 0xB515, + 9421: 0xB518, + 9422: 0xB51B, + 9423: 0xB51C, + 9424: 0xB524, + 9425: 0xB525, + 9426: 0xB527, + 9427: 0xB528, + 9428: 0xB529, + 9429: 0xB52A, + 9430: 0xB530, + 9431: 0xB531, + 9432: 0xB534, + 9433: 0xB538, + 9434: 0xD105, + 9435: 0xD106, + 9436: 0xD107, + 9437: 0xD108, + 9438: 0xD109, + 9439: 0xD10A, + 9440: 0xD10B, + 9441: 0xD10C, + 9442: 0xD10E, + 9443: 0xD10F, + 9444: 0xD110, + 9445: 0xD111, + 9446: 0xD112, + 9447: 0xD113, + 9448: 0xD114, + 9449: 0xD115, + 9450: 0xD116, + 9451: 0xD117, + 9452: 0xD118, + 9453: 0xD119, + 9454: 0xD11A, + 9455: 0xD11B, + 9456: 0xD11C, + 9457: 0xD11D, + 9458: 0xD11E, + 9459: 0xD11F, + 9460: 0xD120, + 9461: 0xD121, + 9462: 0xD122, + 9463: 0xD123, + 9464: 0xD124, + 9465: 0xD125, + 9466: 0xD126, + 9467: 0xD127, + 9468: 0xD128, + 9469: 0xD129, + 9470: 0xD12A, + 9471: 0xD12B, + 9472: 0xD12C, + 9473: 0xD12D, + 9474: 0xD12E, + 9475: 0xD12F, + 9476: 0xD132, + 9477: 0xD133, + 9478: 0xD135, + 9479: 0xD136, + 9480: 0xD137, + 9481: 0xD139, + 9482: 0xD13B, + 9483: 0xD13C, + 9484: 0xD13D, + 9485: 0xD13E, + 9486: 0xD13F, + 9487: 0xD142, + 9488: 0xD146, + 9489: 0xD147, + 9490: 0xD148, + 9491: 0xD149, + 9492: 0xD14A, + 9493: 0xD14B, + 9494: 0xD14E, + 9495: 0xD14F, + 9496: 0xD151, + 9497: 0xD152, + 9498: 0xD153, + 9499: 0xD155, + 9500: 0xD156, + 9501: 0xD157, + 9502: 0xD158, + 9503: 0xD159, + 9504: 0xD15A, + 9505: 0xD15B, + 9506: 0xD15E, + 9507: 0xD160, + 9508: 0xD162, + 9509: 0xD163, + 9510: 0xD164, + 9511: 0xD165, + 9512: 0xD166, + 9513: 0xD167, + 9514: 0xD169, + 9515: 0xD16A, + 9516: 0xD16B, + 9517: 0xD16D, + 9518: 0xB540, + 9519: 0xB541, + 9520: 0xB543, + 9521: 0xB544, + 9522: 0xB545, + 9523: 0xB54B, + 9524: 0xB54C, + 9525: 0xB54D, + 9526: 0xB550, + 9527: 0xB554, + 9528: 0xB55C, + 9529: 0xB55D, + 9530: 0xB55F, + 9531: 0xB560, + 9532: 0xB561, + 9533: 0xB5A0, + 9534: 0xB5A1, + 9535: 0xB5A4, + 9536: 0xB5A8, + 9537: 0xB5AA, + 9538: 0xB5AB, + 9539: 0xB5B0, + 9540: 0xB5B1, + 9541: 0xB5B3, + 9542: 0xB5B4, + 9543: 0xB5B5, + 9544: 0xB5BB, + 9545: 0xB5BC, + 9546: 0xB5BD, + 9547: 0xB5C0, + 9548: 0xB5C4, + 9549: 0xB5CC, + 9550: 0xB5CD, + 9551: 0xB5CF, + 9552: 0xB5D0, + 9553: 0xB5D1, + 9554: 0xB5D8, + 9555: 0xB5EC, + 9556: 0xB610, + 9557: 0xB611, + 9558: 0xB614, + 9559: 0xB618, + 9560: 0xB625, + 9561: 0xB62C, + 9562: 0xB634, + 9563: 0xB648, + 9564: 0xB664, + 9565: 0xB668, + 9566: 0xB69C, + 9567: 0xB69D, + 9568: 0xB6A0, + 9569: 0xB6A4, + 9570: 0xB6AB, + 9571: 0xB6AC, + 9572: 0xB6B1, + 9573: 0xB6D4, + 9574: 0xB6F0, + 9575: 0xB6F4, + 9576: 0xB6F8, + 9577: 0xB700, + 9578: 0xB701, + 9579: 0xB705, + 9580: 0xB728, + 9581: 0xB729, + 9582: 0xB72C, + 9583: 0xB72F, + 9584: 0xB730, + 9585: 0xB738, + 9586: 0xB739, + 9587: 0xB73B, + 9588: 0xB744, + 9589: 0xB748, + 9590: 0xB74C, + 9591: 0xB754, + 9592: 0xB755, + 9593: 0xB760, + 9594: 0xB764, + 9595: 0xB768, + 9596: 0xB770, + 9597: 0xB771, + 9598: 0xB773, + 9599: 0xB775, + 9600: 0xB77C, + 9601: 0xB77D, + 9602: 0xB780, + 9603: 0xB784, + 9604: 0xB78C, + 9605: 0xB78D, + 9606: 0xB78F, + 9607: 0xB790, + 9608: 0xB791, + 9609: 0xB792, + 9610: 0xB796, + 9611: 0xB797, + 9612: 0xD16E, + 9613: 0xD16F, + 9614: 0xD170, + 9615: 0xD171, + 9616: 0xD172, + 9617: 0xD173, + 9618: 0xD174, + 9619: 0xD175, + 9620: 0xD176, + 9621: 0xD177, + 9622: 0xD178, + 9623: 0xD179, + 9624: 0xD17A, + 9625: 0xD17B, + 9626: 0xD17D, + 9627: 0xD17E, + 9628: 0xD17F, + 9629: 0xD180, + 9630: 0xD181, + 9631: 0xD182, + 9632: 0xD183, + 9633: 0xD185, + 9634: 0xD186, + 9635: 0xD187, + 9636: 0xD189, + 9637: 0xD18A, + 9638: 0xD18B, + 9639: 0xD18C, + 9640: 0xD18D, + 9641: 0xD18E, + 9642: 0xD18F, + 9643: 0xD190, + 9644: 0xD191, + 9645: 0xD192, + 9646: 0xD193, + 9647: 0xD194, + 9648: 0xD195, + 9649: 0xD196, + 9650: 0xD197, + 9651: 0xD198, + 9652: 0xD199, + 9653: 0xD19A, + 9654: 0xD19B, + 9655: 0xD19C, + 9656: 0xD19D, + 9657: 0xD19E, + 9658: 0xD19F, + 9659: 0xD1A2, + 9660: 0xD1A3, + 9661: 0xD1A5, + 9662: 0xD1A6, + 9663: 0xD1A7, + 9664: 0xD1A9, + 9665: 0xD1AA, + 9666: 0xD1AB, + 9667: 0xD1AC, + 9668: 0xD1AD, + 9669: 0xD1AE, + 9670: 0xD1AF, + 9671: 0xD1B2, + 9672: 0xD1B4, + 9673: 0xD1B6, + 9674: 0xD1B7, + 9675: 0xD1B8, + 9676: 0xD1B9, + 9677: 0xD1BB, + 9678: 0xD1BD, + 9679: 0xD1BE, + 9680: 0xD1BF, + 9681: 0xD1C1, + 9682: 0xD1C2, + 9683: 0xD1C3, + 9684: 0xD1C4, + 9685: 0xD1C5, + 9686: 0xD1C6, + 9687: 0xD1C7, + 9688: 0xD1C8, + 9689: 0xD1C9, + 9690: 0xD1CA, + 9691: 0xD1CB, + 9692: 0xD1CC, + 9693: 0xD1CD, + 9694: 0xD1CE, + 9695: 0xD1CF, + 9696: 0xB798, + 9697: 0xB799, + 9698: 0xB79C, + 9699: 0xB7A0, + 9700: 0xB7A8, + 9701: 0xB7A9, + 9702: 0xB7AB, + 9703: 0xB7AC, + 9704: 0xB7AD, + 9705: 0xB7B4, + 9706: 0xB7B5, + 9707: 0xB7B8, + 9708: 0xB7C7, + 9709: 0xB7C9, + 9710: 0xB7EC, + 9711: 0xB7ED, + 9712: 0xB7F0, + 9713: 0xB7F4, + 9714: 0xB7FC, + 9715: 0xB7FD, + 9716: 0xB7FF, + 9717: 0xB800, + 9718: 0xB801, + 9719: 0xB807, + 9720: 0xB808, + 9721: 0xB809, + 9722: 0xB80C, + 9723: 0xB810, + 9724: 0xB818, + 9725: 0xB819, + 9726: 0xB81B, + 9727: 0xB81D, + 9728: 0xB824, + 9729: 0xB825, + 9730: 0xB828, + 9731: 0xB82C, + 9732: 0xB834, + 9733: 0xB835, + 9734: 0xB837, + 9735: 0xB838, + 9736: 0xB839, + 9737: 0xB840, + 9738: 0xB844, + 9739: 0xB851, + 9740: 0xB853, + 9741: 0xB85C, + 9742: 0xB85D, + 9743: 0xB860, + 9744: 0xB864, + 9745: 0xB86C, + 9746: 0xB86D, + 9747: 0xB86F, + 9748: 0xB871, + 9749: 0xB878, + 9750: 0xB87C, + 9751: 0xB88D, + 9752: 0xB8A8, + 9753: 0xB8B0, + 9754: 0xB8B4, + 9755: 0xB8B8, + 9756: 0xB8C0, + 9757: 0xB8C1, + 9758: 0xB8C3, + 9759: 0xB8C5, + 9760: 0xB8CC, + 9761: 0xB8D0, + 9762: 0xB8D4, + 9763: 0xB8DD, + 9764: 0xB8DF, + 9765: 0xB8E1, + 9766: 0xB8E8, + 9767: 0xB8E9, + 9768: 0xB8EC, + 9769: 0xB8F0, + 9770: 0xB8F8, + 9771: 0xB8F9, + 9772: 0xB8FB, + 9773: 0xB8FD, + 9774: 0xB904, + 9775: 0xB918, + 9776: 0xB920, + 9777: 0xB93C, + 9778: 0xB93D, + 9779: 0xB940, + 9780: 0xB944, + 9781: 0xB94C, + 9782: 0xB94F, + 9783: 0xB951, + 9784: 0xB958, + 9785: 0xB959, + 9786: 0xB95C, + 9787: 0xB960, + 9788: 0xB968, + 9789: 0xB969, + 9790: 0xD1D0, + 9791: 0xD1D1, + 9792: 0xD1D2, + 9793: 0xD1D3, + 9794: 0xD1D4, + 9795: 0xD1D5, + 9796: 0xD1D6, + 9797: 0xD1D7, + 9798: 0xD1D9, + 9799: 0xD1DA, + 9800: 0xD1DB, + 9801: 0xD1DC, + 9802: 0xD1DD, + 9803: 0xD1DE, + 9804: 0xD1DF, + 9805: 0xD1E0, + 9806: 0xD1E1, + 9807: 0xD1E2, + 9808: 0xD1E3, + 9809: 0xD1E4, + 9810: 0xD1E5, + 9811: 0xD1E6, + 9812: 0xD1E7, + 9813: 0xD1E8, + 9814: 0xD1E9, + 9815: 0xD1EA, + 9816: 0xD1EB, + 9817: 0xD1EC, + 9818: 0xD1ED, + 9819: 0xD1EE, + 9820: 0xD1EF, + 9821: 0xD1F0, + 9822: 0xD1F1, + 9823: 0xD1F2, + 9824: 0xD1F3, + 9825: 0xD1F5, + 9826: 0xD1F6, + 9827: 0xD1F7, + 9828: 0xD1F9, + 9829: 0xD1FA, + 9830: 0xD1FB, + 9831: 0xD1FC, + 9832: 0xD1FD, + 9833: 0xD1FE, + 9834: 0xD1FF, + 9835: 0xD200, + 9836: 0xD201, + 9837: 0xD202, + 9838: 0xD203, + 9839: 0xD204, + 9840: 0xD205, + 9841: 0xD206, + 9842: 0xD208, + 9843: 0xD20A, + 9844: 0xD20B, + 9845: 0xD20C, + 9846: 0xD20D, + 9847: 0xD20E, + 9848: 0xD20F, + 9849: 0xD211, + 9850: 0xD212, + 9851: 0xD213, + 9852: 0xD214, + 9853: 0xD215, + 9854: 0xD216, + 9855: 0xD217, + 9856: 0xD218, + 9857: 0xD219, + 9858: 0xD21A, + 9859: 0xD21B, + 9860: 0xD21C, + 9861: 0xD21D, + 9862: 0xD21E, + 9863: 0xD21F, + 9864: 0xD220, + 9865: 0xD221, + 9866: 0xD222, + 9867: 0xD223, + 9868: 0xD224, + 9869: 0xD225, + 9870: 0xD226, + 9871: 0xD227, + 9872: 0xD228, + 9873: 0xD229, + 9874: 0xB96B, + 9875: 0xB96D, + 9876: 0xB974, + 9877: 0xB975, + 9878: 0xB978, + 9879: 0xB97C, + 9880: 0xB984, + 9881: 0xB985, + 9882: 0xB987, + 9883: 0xB989, + 9884: 0xB98A, + 9885: 0xB98D, + 9886: 0xB98E, + 9887: 0xB9AC, + 9888: 0xB9AD, + 9889: 0xB9B0, + 9890: 0xB9B4, + 9891: 0xB9BC, + 9892: 0xB9BD, + 9893: 0xB9BF, + 9894: 0xB9C1, + 9895: 0xB9C8, + 9896: 0xB9C9, + 9897: 0xB9CC, + 9898: 0xB9CE, + 9899: 0xB9CF, + 9900: 0xB9D0, + 9901: 0xB9D1, + 9902: 0xB9D2, + 9903: 0xB9D8, + 9904: 0xB9D9, + 9905: 0xB9DB, + 9906: 0xB9DD, + 9907: 0xB9DE, + 9908: 0xB9E1, + 9909: 0xB9E3, + 9910: 0xB9E4, + 9911: 0xB9E5, + 9912: 0xB9E8, + 9913: 0xB9EC, + 9914: 0xB9F4, + 9915: 0xB9F5, + 9916: 0xB9F7, + 9917: 0xB9F8, + 9918: 0xB9F9, + 9919: 0xB9FA, + 9920: 0xBA00, + 9921: 0xBA01, + 9922: 0xBA08, + 9923: 0xBA15, + 9924: 0xBA38, + 9925: 0xBA39, + 9926: 0xBA3C, + 9927: 0xBA40, + 9928: 0xBA42, + 9929: 0xBA48, + 9930: 0xBA49, + 9931: 0xBA4B, + 9932: 0xBA4D, + 9933: 0xBA4E, + 9934: 0xBA53, + 9935: 0xBA54, + 9936: 0xBA55, + 9937: 0xBA58, + 9938: 0xBA5C, + 9939: 0xBA64, + 9940: 0xBA65, + 9941: 0xBA67, + 9942: 0xBA68, + 9943: 0xBA69, + 9944: 0xBA70, + 9945: 0xBA71, + 9946: 0xBA74, + 9947: 0xBA78, + 9948: 0xBA83, + 9949: 0xBA84, + 9950: 0xBA85, + 9951: 0xBA87, + 9952: 0xBA8C, + 9953: 0xBAA8, + 9954: 0xBAA9, + 9955: 0xBAAB, + 9956: 0xBAAC, + 9957: 0xBAB0, + 9958: 0xBAB2, + 9959: 0xBAB8, + 9960: 0xBAB9, + 9961: 0xBABB, + 9962: 0xBABD, + 9963: 0xBAC4, + 9964: 0xBAC8, + 9965: 0xBAD8, + 9966: 0xBAD9, + 9967: 0xBAFC, + 9968: 0xD22A, + 9969: 0xD22B, + 9970: 0xD22E, + 9971: 0xD22F, + 9972: 0xD231, + 9973: 0xD232, + 9974: 0xD233, + 9975: 0xD235, + 9976: 0xD236, + 9977: 0xD237, + 9978: 0xD238, + 9979: 0xD239, + 9980: 0xD23A, + 9981: 0xD23B, + 9982: 0xD23E, + 9983: 0xD240, + 9984: 0xD242, + 9985: 0xD243, + 9986: 0xD244, + 9987: 0xD245, + 9988: 0xD246, + 9989: 0xD247, + 9990: 0xD249, + 9991: 0xD24A, + 9992: 0xD24B, + 9993: 0xD24C, + 9994: 0xD24D, + 9995: 0xD24E, + 9996: 0xD24F, + 9997: 0xD250, + 9998: 0xD251, + 9999: 0xD252, + 10000: 0xD253, + 10001: 0xD254, + 10002: 0xD255, + 10003: 0xD256, + 10004: 0xD257, + 10005: 0xD258, + 10006: 0xD259, + 10007: 0xD25A, + 10008: 0xD25B, + 10009: 0xD25D, + 10010: 0xD25E, + 10011: 0xD25F, + 10012: 0xD260, + 10013: 0xD261, + 10014: 0xD262, + 10015: 0xD263, + 10016: 0xD265, + 10017: 0xD266, + 10018: 0xD267, + 10019: 0xD268, + 10020: 0xD269, + 10021: 0xD26A, + 10022: 0xD26B, + 10023: 0xD26C, + 10024: 0xD26D, + 10025: 0xD26E, + 10026: 0xD26F, + 10027: 0xD270, + 10028: 0xD271, + 10029: 0xD272, + 10030: 0xD273, + 10031: 0xD274, + 10032: 0xD275, + 10033: 0xD276, + 10034: 0xD277, + 10035: 0xD278, + 10036: 0xD279, + 10037: 0xD27A, + 10038: 0xD27B, + 10039: 0xD27C, + 10040: 0xD27D, + 10041: 0xD27E, + 10042: 0xD27F, + 10043: 0xD282, + 10044: 0xD283, + 10045: 0xD285, + 10046: 0xD286, + 10047: 0xD287, + 10048: 0xD289, + 10049: 0xD28A, + 10050: 0xD28B, + 10051: 0xD28C, + 10052: 0xBB00, + 10053: 0xBB04, + 10054: 0xBB0D, + 10055: 0xBB0F, + 10056: 0xBB11, + 10057: 0xBB18, + 10058: 0xBB1C, + 10059: 0xBB20, + 10060: 0xBB29, + 10061: 0xBB2B, + 10062: 0xBB34, + 10063: 0xBB35, + 10064: 0xBB36, + 10065: 0xBB38, + 10066: 0xBB3B, + 10067: 0xBB3C, + 10068: 0xBB3D, + 10069: 0xBB3E, + 10070: 0xBB44, + 10071: 0xBB45, + 10072: 0xBB47, + 10073: 0xBB49, + 10074: 0xBB4D, + 10075: 0xBB4F, + 10076: 0xBB50, + 10077: 0xBB54, + 10078: 0xBB58, + 10079: 0xBB61, + 10080: 0xBB63, + 10081: 0xBB6C, + 10082: 0xBB88, + 10083: 0xBB8C, + 10084: 0xBB90, + 10085: 0xBBA4, + 10086: 0xBBA8, + 10087: 0xBBAC, + 10088: 0xBBB4, + 10089: 0xBBB7, + 10090: 0xBBC0, + 10091: 0xBBC4, + 10092: 0xBBC8, + 10093: 0xBBD0, + 10094: 0xBBD3, + 10095: 0xBBF8, + 10096: 0xBBF9, + 10097: 0xBBFC, + 10098: 0xBBFF, + 10099: 0xBC00, + 10100: 0xBC02, + 10101: 0xBC08, + 10102: 0xBC09, + 10103: 0xBC0B, + 10104: 0xBC0C, + 10105: 0xBC0D, + 10106: 0xBC0F, + 10107: 0xBC11, + 10108: 0xBC14, + 10109: 0xBC15, + 10110: 0xBC16, + 10111: 0xBC17, + 10112: 0xBC18, + 10113: 0xBC1B, + 10114: 0xBC1C, + 10115: 0xBC1D, + 10116: 0xBC1E, + 10117: 0xBC1F, + 10118: 0xBC24, + 10119: 0xBC25, + 10120: 0xBC27, + 10121: 0xBC29, + 10122: 0xBC2D, + 10123: 0xBC30, + 10124: 0xBC31, + 10125: 0xBC34, + 10126: 0xBC38, + 10127: 0xBC40, + 10128: 0xBC41, + 10129: 0xBC43, + 10130: 0xBC44, + 10131: 0xBC45, + 10132: 0xBC49, + 10133: 0xBC4C, + 10134: 0xBC4D, + 10135: 0xBC50, + 10136: 0xBC5D, + 10137: 0xBC84, + 10138: 0xBC85, + 10139: 0xBC88, + 10140: 0xBC8B, + 10141: 0xBC8C, + 10142: 0xBC8E, + 10143: 0xBC94, + 10144: 0xBC95, + 10145: 0xBC97, + 10146: 0xD28D, + 10147: 0xD28E, + 10148: 0xD28F, + 10149: 0xD292, + 10150: 0xD293, + 10151: 0xD294, + 10152: 0xD296, + 10153: 0xD297, + 10154: 0xD298, + 10155: 0xD299, + 10156: 0xD29A, + 10157: 0xD29B, + 10158: 0xD29D, + 10159: 0xD29E, + 10160: 0xD29F, + 10161: 0xD2A1, + 10162: 0xD2A2, + 10163: 0xD2A3, + 10164: 0xD2A5, + 10165: 0xD2A6, + 10166: 0xD2A7, + 10167: 0xD2A8, + 10168: 0xD2A9, + 10169: 0xD2AA, + 10170: 0xD2AB, + 10171: 0xD2AD, + 10172: 0xD2AE, + 10173: 0xD2AF, + 10174: 0xD2B0, + 10175: 0xD2B2, + 10176: 0xD2B3, + 10177: 0xD2B4, + 10178: 0xD2B5, + 10179: 0xD2B6, + 10180: 0xD2B7, + 10181: 0xD2BA, + 10182: 0xD2BB, + 10183: 0xD2BD, + 10184: 0xD2BE, + 10185: 0xD2C1, + 10186: 0xD2C3, + 10187: 0xD2C4, + 10188: 0xD2C5, + 10189: 0xD2C6, + 10190: 0xD2C7, + 10191: 0xD2CA, + 10192: 0xD2CC, + 10193: 0xD2CD, + 10194: 0xD2CE, + 10195: 0xD2CF, + 10196: 0xD2D0, + 10197: 0xD2D1, + 10198: 0xD2D2, + 10199: 0xD2D3, + 10200: 0xD2D5, + 10201: 0xD2D6, + 10202: 0xD2D7, + 10203: 0xD2D9, + 10204: 0xD2DA, + 10205: 0xD2DB, + 10206: 0xD2DD, + 10207: 0xD2DE, + 10208: 0xD2DF, + 10209: 0xD2E0, + 10210: 0xD2E1, + 10211: 0xD2E2, + 10212: 0xD2E3, + 10213: 0xD2E6, + 10214: 0xD2E7, + 10215: 0xD2E8, + 10216: 0xD2E9, + 10217: 0xD2EA, + 10218: 0xD2EB, + 10219: 0xD2EC, + 10220: 0xD2ED, + 10221: 0xD2EE, + 10222: 0xD2EF, + 10223: 0xD2F2, + 10224: 0xD2F3, + 10225: 0xD2F5, + 10226: 0xD2F6, + 10227: 0xD2F7, + 10228: 0xD2F9, + 10229: 0xD2FA, + 10230: 0xBC99, + 10231: 0xBC9A, + 10232: 0xBCA0, + 10233: 0xBCA1, + 10234: 0xBCA4, + 10235: 0xBCA7, + 10236: 0xBCA8, + 10237: 0xBCB0, + 10238: 0xBCB1, + 10239: 0xBCB3, + 10240: 0xBCB4, + 10241: 0xBCB5, + 10242: 0xBCBC, + 10243: 0xBCBD, + 10244: 0xBCC0, + 10245: 0xBCC4, + 10246: 0xBCCD, + 10247: 0xBCCF, + 10248: 0xBCD0, + 10249: 0xBCD1, + 10250: 0xBCD5, + 10251: 0xBCD8, + 10252: 0xBCDC, + 10253: 0xBCF4, + 10254: 0xBCF5, + 10255: 0xBCF6, + 10256: 0xBCF8, + 10257: 0xBCFC, + 10258: 0xBD04, + 10259: 0xBD05, + 10260: 0xBD07, + 10261: 0xBD09, + 10262: 0xBD10, + 10263: 0xBD14, + 10264: 0xBD24, + 10265: 0xBD2C, + 10266: 0xBD40, + 10267: 0xBD48, + 10268: 0xBD49, + 10269: 0xBD4C, + 10270: 0xBD50, + 10271: 0xBD58, + 10272: 0xBD59, + 10273: 0xBD64, + 10274: 0xBD68, + 10275: 0xBD80, + 10276: 0xBD81, + 10277: 0xBD84, + 10278: 0xBD87, + 10279: 0xBD88, + 10280: 0xBD89, + 10281: 0xBD8A, + 10282: 0xBD90, + 10283: 0xBD91, + 10284: 0xBD93, + 10285: 0xBD95, + 10286: 0xBD99, + 10287: 0xBD9A, + 10288: 0xBD9C, + 10289: 0xBDA4, + 10290: 0xBDB0, + 10291: 0xBDB8, + 10292: 0xBDD4, + 10293: 0xBDD5, + 10294: 0xBDD8, + 10295: 0xBDDC, + 10296: 0xBDE9, + 10297: 0xBDF0, + 10298: 0xBDF4, + 10299: 0xBDF8, + 10300: 0xBE00, + 10301: 0xBE03, + 10302: 0xBE05, + 10303: 0xBE0C, + 10304: 0xBE0D, + 10305: 0xBE10, + 10306: 0xBE14, + 10307: 0xBE1C, + 10308: 0xBE1D, + 10309: 0xBE1F, + 10310: 0xBE44, + 10311: 0xBE45, + 10312: 0xBE48, + 10313: 0xBE4C, + 10314: 0xBE4E, + 10315: 0xBE54, + 10316: 0xBE55, + 10317: 0xBE57, + 10318: 0xBE59, + 10319: 0xBE5A, + 10320: 0xBE5B, + 10321: 0xBE60, + 10322: 0xBE61, + 10323: 0xBE64, + 10324: 0xD2FB, + 10325: 0xD2FC, + 10326: 0xD2FD, + 10327: 0xD2FE, + 10328: 0xD2FF, + 10329: 0xD302, + 10330: 0xD304, + 10331: 0xD306, + 10332: 0xD307, + 10333: 0xD308, + 10334: 0xD309, + 10335: 0xD30A, + 10336: 0xD30B, + 10337: 0xD30F, + 10338: 0xD311, + 10339: 0xD312, + 10340: 0xD313, + 10341: 0xD315, + 10342: 0xD317, + 10343: 0xD318, + 10344: 0xD319, + 10345: 0xD31A, + 10346: 0xD31B, + 10347: 0xD31E, + 10348: 0xD322, + 10349: 0xD323, + 10350: 0xD324, + 10351: 0xD326, + 10352: 0xD327, + 10353: 0xD32A, + 10354: 0xD32B, + 10355: 0xD32D, + 10356: 0xD32E, + 10357: 0xD32F, + 10358: 0xD331, + 10359: 0xD332, + 10360: 0xD333, + 10361: 0xD334, + 10362: 0xD335, + 10363: 0xD336, + 10364: 0xD337, + 10365: 0xD33A, + 10366: 0xD33E, + 10367: 0xD33F, + 10368: 0xD340, + 10369: 0xD341, + 10370: 0xD342, + 10371: 0xD343, + 10372: 0xD346, + 10373: 0xD347, + 10374: 0xD348, + 10375: 0xD349, + 10376: 0xD34A, + 10377: 0xD34B, + 10378: 0xD34C, + 10379: 0xD34D, + 10380: 0xD34E, + 10381: 0xD34F, + 10382: 0xD350, + 10383: 0xD351, + 10384: 0xD352, + 10385: 0xD353, + 10386: 0xD354, + 10387: 0xD355, + 10388: 0xD356, + 10389: 0xD357, + 10390: 0xD358, + 10391: 0xD359, + 10392: 0xD35A, + 10393: 0xD35B, + 10394: 0xD35C, + 10395: 0xD35D, + 10396: 0xD35E, + 10397: 0xD35F, + 10398: 0xD360, + 10399: 0xD361, + 10400: 0xD362, + 10401: 0xD363, + 10402: 0xD364, + 10403: 0xD365, + 10404: 0xD366, + 10405: 0xD367, + 10406: 0xD368, + 10407: 0xD369, + 10408: 0xBE68, + 10409: 0xBE6A, + 10410: 0xBE70, + 10411: 0xBE71, + 10412: 0xBE73, + 10413: 0xBE74, + 10414: 0xBE75, + 10415: 0xBE7B, + 10416: 0xBE7C, + 10417: 0xBE7D, + 10418: 0xBE80, + 10419: 0xBE84, + 10420: 0xBE8C, + 10421: 0xBE8D, + 10422: 0xBE8F, + 10423: 0xBE90, + 10424: 0xBE91, + 10425: 0xBE98, + 10426: 0xBE99, + 10427: 0xBEA8, + 10428: 0xBED0, + 10429: 0xBED1, + 10430: 0xBED4, + 10431: 0xBED7, + 10432: 0xBED8, + 10433: 0xBEE0, + 10434: 0xBEE3, + 10435: 0xBEE4, + 10436: 0xBEE5, + 10437: 0xBEEC, + 10438: 0xBF01, + 10439: 0xBF08, + 10440: 0xBF09, + 10441: 0xBF18, + 10442: 0xBF19, + 10443: 0xBF1B, + 10444: 0xBF1C, + 10445: 0xBF1D, + 10446: 0xBF40, + 10447: 0xBF41, + 10448: 0xBF44, + 10449: 0xBF48, + 10450: 0xBF50, + 10451: 0xBF51, + 10452: 0xBF55, + 10453: 0xBF94, + 10454: 0xBFB0, + 10455: 0xBFC5, + 10456: 0xBFCC, + 10457: 0xBFCD, + 10458: 0xBFD0, + 10459: 0xBFD4, + 10460: 0xBFDC, + 10461: 0xBFDF, + 10462: 0xBFE1, + 10463: 0xC03C, + 10464: 0xC051, + 10465: 0xC058, + 10466: 0xC05C, + 10467: 0xC060, + 10468: 0xC068, + 10469: 0xC069, + 10470: 0xC090, + 10471: 0xC091, + 10472: 0xC094, + 10473: 0xC098, + 10474: 0xC0A0, + 10475: 0xC0A1, + 10476: 0xC0A3, + 10477: 0xC0A5, + 10478: 0xC0AC, + 10479: 0xC0AD, + 10480: 0xC0AF, + 10481: 0xC0B0, + 10482: 0xC0B3, + 10483: 0xC0B4, + 10484: 0xC0B5, + 10485: 0xC0B6, + 10486: 0xC0BC, + 10487: 0xC0BD, + 10488: 0xC0BF, + 10489: 0xC0C0, + 10490: 0xC0C1, + 10491: 0xC0C5, + 10492: 0xC0C8, + 10493: 0xC0C9, + 10494: 0xC0CC, + 10495: 0xC0D0, + 10496: 0xC0D8, + 10497: 0xC0D9, + 10498: 0xC0DB, + 10499: 0xC0DC, + 10500: 0xC0DD, + 10501: 0xC0E4, + 10502: 0xD36A, + 10503: 0xD36B, + 10504: 0xD36C, + 10505: 0xD36D, + 10506: 0xD36E, + 10507: 0xD36F, + 10508: 0xD370, + 10509: 0xD371, + 10510: 0xD372, + 10511: 0xD373, + 10512: 0xD374, + 10513: 0xD375, + 10514: 0xD376, + 10515: 0xD377, + 10516: 0xD378, + 10517: 0xD379, + 10518: 0xD37A, + 10519: 0xD37B, + 10520: 0xD37E, + 10521: 0xD37F, + 10522: 0xD381, + 10523: 0xD382, + 10524: 0xD383, + 10525: 0xD385, + 10526: 0xD386, + 10527: 0xD387, + 10528: 0xD388, + 10529: 0xD389, + 10530: 0xD38A, + 10531: 0xD38B, + 10532: 0xD38E, + 10533: 0xD392, + 10534: 0xD393, + 10535: 0xD394, + 10536: 0xD395, + 10537: 0xD396, + 10538: 0xD397, + 10539: 0xD39A, + 10540: 0xD39B, + 10541: 0xD39D, + 10542: 0xD39E, + 10543: 0xD39F, + 10544: 0xD3A1, + 10545: 0xD3A2, + 10546: 0xD3A3, + 10547: 0xD3A4, + 10548: 0xD3A5, + 10549: 0xD3A6, + 10550: 0xD3A7, + 10551: 0xD3AA, + 10552: 0xD3AC, + 10553: 0xD3AE, + 10554: 0xD3AF, + 10555: 0xD3B0, + 10556: 0xD3B1, + 10557: 0xD3B2, + 10558: 0xD3B3, + 10559: 0xD3B5, + 10560: 0xD3B6, + 10561: 0xD3B7, + 10562: 0xD3B9, + 10563: 0xD3BA, + 10564: 0xD3BB, + 10565: 0xD3BD, + 10566: 0xD3BE, + 10567: 0xD3BF, + 10568: 0xD3C0, + 10569: 0xD3C1, + 10570: 0xD3C2, + 10571: 0xD3C3, + 10572: 0xD3C6, + 10573: 0xD3C7, + 10574: 0xD3CA, + 10575: 0xD3CB, + 10576: 0xD3CC, + 10577: 0xD3CD, + 10578: 0xD3CE, + 10579: 0xD3CF, + 10580: 0xD3D1, + 10581: 0xD3D2, + 10582: 0xD3D3, + 10583: 0xD3D4, + 10584: 0xD3D5, + 10585: 0xD3D6, + 10586: 0xC0E5, + 10587: 0xC0E8, + 10588: 0xC0EC, + 10589: 0xC0F4, + 10590: 0xC0F5, + 10591: 0xC0F7, + 10592: 0xC0F9, + 10593: 0xC100, + 10594: 0xC104, + 10595: 0xC108, + 10596: 0xC110, + 10597: 0xC115, + 10598: 0xC11C, + 10599: 0xC11D, + 10600: 0xC11E, + 10601: 0xC11F, + 10602: 0xC120, + 10603: 0xC123, + 10604: 0xC124, + 10605: 0xC126, + 10606: 0xC127, + 10607: 0xC12C, + 10608: 0xC12D, + 10609: 0xC12F, + 10610: 0xC130, + 10611: 0xC131, + 10612: 0xC136, + 10613: 0xC138, + 10614: 0xC139, + 10615: 0xC13C, + 10616: 0xC140, + 10617: 0xC148, + 10618: 0xC149, + 10619: 0xC14B, + 10620: 0xC14C, + 10621: 0xC14D, + 10622: 0xC154, + 10623: 0xC155, + 10624: 0xC158, + 10625: 0xC15C, + 10626: 0xC164, + 10627: 0xC165, + 10628: 0xC167, + 10629: 0xC168, + 10630: 0xC169, + 10631: 0xC170, + 10632: 0xC174, + 10633: 0xC178, + 10634: 0xC185, + 10635: 0xC18C, + 10636: 0xC18D, + 10637: 0xC18E, + 10638: 0xC190, + 10639: 0xC194, + 10640: 0xC196, + 10641: 0xC19C, + 10642: 0xC19D, + 10643: 0xC19F, + 10644: 0xC1A1, + 10645: 0xC1A5, + 10646: 0xC1A8, + 10647: 0xC1A9, + 10648: 0xC1AC, + 10649: 0xC1B0, + 10650: 0xC1BD, + 10651: 0xC1C4, + 10652: 0xC1C8, + 10653: 0xC1CC, + 10654: 0xC1D4, + 10655: 0xC1D7, + 10656: 0xC1D8, + 10657: 0xC1E0, + 10658: 0xC1E4, + 10659: 0xC1E8, + 10660: 0xC1F0, + 10661: 0xC1F1, + 10662: 0xC1F3, + 10663: 0xC1FC, + 10664: 0xC1FD, + 10665: 0xC200, + 10666: 0xC204, + 10667: 0xC20C, + 10668: 0xC20D, + 10669: 0xC20F, + 10670: 0xC211, + 10671: 0xC218, + 10672: 0xC219, + 10673: 0xC21C, + 10674: 0xC21F, + 10675: 0xC220, + 10676: 0xC228, + 10677: 0xC229, + 10678: 0xC22B, + 10679: 0xC22D, + 10680: 0xD3D7, + 10681: 0xD3D9, + 10682: 0xD3DA, + 10683: 0xD3DB, + 10684: 0xD3DC, + 10685: 0xD3DD, + 10686: 0xD3DE, + 10687: 0xD3DF, + 10688: 0xD3E0, + 10689: 0xD3E2, + 10690: 0xD3E4, + 10691: 0xD3E5, + 10692: 0xD3E6, + 10693: 0xD3E7, + 10694: 0xD3E8, + 10695: 0xD3E9, + 10696: 0xD3EA, + 10697: 0xD3EB, + 10698: 0xD3EE, + 10699: 0xD3EF, + 10700: 0xD3F1, + 10701: 0xD3F2, + 10702: 0xD3F3, + 10703: 0xD3F5, + 10704: 0xD3F6, + 10705: 0xD3F7, + 10706: 0xD3F8, + 10707: 0xD3F9, + 10708: 0xD3FA, + 10709: 0xD3FB, + 10710: 0xD3FE, + 10711: 0xD400, + 10712: 0xD402, + 10713: 0xD403, + 10714: 0xD404, + 10715: 0xD405, + 10716: 0xD406, + 10717: 0xD407, + 10718: 0xD409, + 10719: 0xD40A, + 10720: 0xD40B, + 10721: 0xD40C, + 10722: 0xD40D, + 10723: 0xD40E, + 10724: 0xD40F, + 10725: 0xD410, + 10726: 0xD411, + 10727: 0xD412, + 10728: 0xD413, + 10729: 0xD414, + 10730: 0xD415, + 10731: 0xD416, + 10732: 0xD417, + 10733: 0xD418, + 10734: 0xD419, + 10735: 0xD41A, + 10736: 0xD41B, + 10737: 0xD41C, + 10738: 0xD41E, + 10739: 0xD41F, + 10740: 0xD420, + 10741: 0xD421, + 10742: 0xD422, + 10743: 0xD423, + 10744: 0xD424, + 10745: 0xD425, + 10746: 0xD426, + 10747: 0xD427, + 10748: 0xD428, + 10749: 0xD429, + 10750: 0xD42A, + 10751: 0xD42B, + 10752: 0xD42C, + 10753: 0xD42D, + 10754: 0xD42E, + 10755: 0xD42F, + 10756: 0xD430, + 10757: 0xD431, + 10758: 0xD432, + 10759: 0xD433, + 10760: 0xD434, + 10761: 0xD435, + 10762: 0xD436, + 10763: 0xD437, + 10764: 0xC22F, + 10765: 0xC231, + 10766: 0xC232, + 10767: 0xC234, + 10768: 0xC248, + 10769: 0xC250, + 10770: 0xC251, + 10771: 0xC254, + 10772: 0xC258, + 10773: 0xC260, + 10774: 0xC265, + 10775: 0xC26C, + 10776: 0xC26D, + 10777: 0xC270, + 10778: 0xC274, + 10779: 0xC27C, + 10780: 0xC27D, + 10781: 0xC27F, + 10782: 0xC281, + 10783: 0xC288, + 10784: 0xC289, + 10785: 0xC290, + 10786: 0xC298, + 10787: 0xC29B, + 10788: 0xC29D, + 10789: 0xC2A4, + 10790: 0xC2A5, + 10791: 0xC2A8, + 10792: 0xC2AC, + 10793: 0xC2AD, + 10794: 0xC2B4, + 10795: 0xC2B5, + 10796: 0xC2B7, + 10797: 0xC2B9, + 10798: 0xC2DC, + 10799: 0xC2DD, + 10800: 0xC2E0, + 10801: 0xC2E3, + 10802: 0xC2E4, + 10803: 0xC2EB, + 10804: 0xC2EC, + 10805: 0xC2ED, + 10806: 0xC2EF, + 10807: 0xC2F1, + 10808: 0xC2F6, + 10809: 0xC2F8, + 10810: 0xC2F9, + 10811: 0xC2FB, + 10812: 0xC2FC, + 10813: 0xC300, + 10814: 0xC308, + 10815: 0xC309, + 10816: 0xC30C, + 10817: 0xC30D, + 10818: 0xC313, + 10819: 0xC314, + 10820: 0xC315, + 10821: 0xC318, + 10822: 0xC31C, + 10823: 0xC324, + 10824: 0xC325, + 10825: 0xC328, + 10826: 0xC329, + 10827: 0xC345, + 10828: 0xC368, + 10829: 0xC369, + 10830: 0xC36C, + 10831: 0xC370, + 10832: 0xC372, + 10833: 0xC378, + 10834: 0xC379, + 10835: 0xC37C, + 10836: 0xC37D, + 10837: 0xC384, + 10838: 0xC388, + 10839: 0xC38C, + 10840: 0xC3C0, + 10841: 0xC3D8, + 10842: 0xC3D9, + 10843: 0xC3DC, + 10844: 0xC3DF, + 10845: 0xC3E0, + 10846: 0xC3E2, + 10847: 0xC3E8, + 10848: 0xC3E9, + 10849: 0xC3ED, + 10850: 0xC3F4, + 10851: 0xC3F5, + 10852: 0xC3F8, + 10853: 0xC408, + 10854: 0xC410, + 10855: 0xC424, + 10856: 0xC42C, + 10857: 0xC430, + 10858: 0xD438, + 10859: 0xD439, + 10860: 0xD43A, + 10861: 0xD43B, + 10862: 0xD43C, + 10863: 0xD43D, + 10864: 0xD43E, + 10865: 0xD43F, + 10866: 0xD441, + 10867: 0xD442, + 10868: 0xD443, + 10869: 0xD445, + 10870: 0xD446, + 10871: 0xD447, + 10872: 0xD448, + 10873: 0xD449, + 10874: 0xD44A, + 10875: 0xD44B, + 10876: 0xD44C, + 10877: 0xD44D, + 10878: 0xD44E, + 10879: 0xD44F, + 10880: 0xD450, + 10881: 0xD451, + 10882: 0xD452, + 10883: 0xD453, + 10884: 0xD454, + 10885: 0xD455, + 10886: 0xD456, + 10887: 0xD457, + 10888: 0xD458, + 10889: 0xD459, + 10890: 0xD45A, + 10891: 0xD45B, + 10892: 0xD45D, + 10893: 0xD45E, + 10894: 0xD45F, + 10895: 0xD461, + 10896: 0xD462, + 10897: 0xD463, + 10898: 0xD465, + 10899: 0xD466, + 10900: 0xD467, + 10901: 0xD468, + 10902: 0xD469, + 10903: 0xD46A, + 10904: 0xD46B, + 10905: 0xD46C, + 10906: 0xD46E, + 10907: 0xD470, + 10908: 0xD471, + 10909: 0xD472, + 10910: 0xD473, + 10911: 0xD474, + 10912: 0xD475, + 10913: 0xD476, + 10914: 0xD477, + 10915: 0xD47A, + 10916: 0xD47B, + 10917: 0xD47D, + 10918: 0xD47E, + 10919: 0xD481, + 10920: 0xD483, + 10921: 0xD484, + 10922: 0xD485, + 10923: 0xD486, + 10924: 0xD487, + 10925: 0xD48A, + 10926: 0xD48C, + 10927: 0xD48E, + 10928: 0xD48F, + 10929: 0xD490, + 10930: 0xD491, + 10931: 0xD492, + 10932: 0xD493, + 10933: 0xD495, + 10934: 0xD496, + 10935: 0xD497, + 10936: 0xD498, + 10937: 0xD499, + 10938: 0xD49A, + 10939: 0xD49B, + 10940: 0xD49C, + 10941: 0xD49D, + 10942: 0xC434, + 10943: 0xC43C, + 10944: 0xC43D, + 10945: 0xC448, + 10946: 0xC464, + 10947: 0xC465, + 10948: 0xC468, + 10949: 0xC46C, + 10950: 0xC474, + 10951: 0xC475, + 10952: 0xC479, + 10953: 0xC480, + 10954: 0xC494, + 10955: 0xC49C, + 10956: 0xC4B8, + 10957: 0xC4BC, + 10958: 0xC4E9, + 10959: 0xC4F0, + 10960: 0xC4F1, + 10961: 0xC4F4, + 10962: 0xC4F8, + 10963: 0xC4FA, + 10964: 0xC4FF, + 10965: 0xC500, + 10966: 0xC501, + 10967: 0xC50C, + 10968: 0xC510, + 10969: 0xC514, + 10970: 0xC51C, + 10971: 0xC528, + 10972: 0xC529, + 10973: 0xC52C, + 10974: 0xC530, + 10975: 0xC538, + 10976: 0xC539, + 10977: 0xC53B, + 10978: 0xC53D, + 10979: 0xC544, + 10980: 0xC545, + 10981: 0xC548, + 10982: 0xC549, + 10983: 0xC54A, + 10984: 0xC54C, + 10985: 0xC54D, + 10986: 0xC54E, + 10987: 0xC553, + 10988: 0xC554, + 10989: 0xC555, + 10990: 0xC557, + 10991: 0xC558, + 10992: 0xC559, + 10993: 0xC55D, + 10994: 0xC55E, + 10995: 0xC560, + 10996: 0xC561, + 10997: 0xC564, + 10998: 0xC568, + 10999: 0xC570, + 11000: 0xC571, + 11001: 0xC573, + 11002: 0xC574, + 11003: 0xC575, + 11004: 0xC57C, + 11005: 0xC57D, + 11006: 0xC580, + 11007: 0xC584, + 11008: 0xC587, + 11009: 0xC58C, + 11010: 0xC58D, + 11011: 0xC58F, + 11012: 0xC591, + 11013: 0xC595, + 11014: 0xC597, + 11015: 0xC598, + 11016: 0xC59C, + 11017: 0xC5A0, + 11018: 0xC5A9, + 11019: 0xC5B4, + 11020: 0xC5B5, + 11021: 0xC5B8, + 11022: 0xC5B9, + 11023: 0xC5BB, + 11024: 0xC5BC, + 11025: 0xC5BD, + 11026: 0xC5BE, + 11027: 0xC5C4, + 11028: 0xC5C5, + 11029: 0xC5C6, + 11030: 0xC5C7, + 11031: 0xC5C8, + 11032: 0xC5C9, + 11033: 0xC5CA, + 11034: 0xC5CC, + 11035: 0xC5CE, + 11036: 0xD49E, + 11037: 0xD49F, + 11038: 0xD4A0, + 11039: 0xD4A1, + 11040: 0xD4A2, + 11041: 0xD4A3, + 11042: 0xD4A4, + 11043: 0xD4A5, + 11044: 0xD4A6, + 11045: 0xD4A7, + 11046: 0xD4A8, + 11047: 0xD4AA, + 11048: 0xD4AB, + 11049: 0xD4AC, + 11050: 0xD4AD, + 11051: 0xD4AE, + 11052: 0xD4AF, + 11053: 0xD4B0, + 11054: 0xD4B1, + 11055: 0xD4B2, + 11056: 0xD4B3, + 11057: 0xD4B4, + 11058: 0xD4B5, + 11059: 0xD4B6, + 11060: 0xD4B7, + 11061: 0xD4B8, + 11062: 0xD4B9, + 11063: 0xD4BA, + 11064: 0xD4BB, + 11065: 0xD4BC, + 11066: 0xD4BD, + 11067: 0xD4BE, + 11068: 0xD4BF, + 11069: 0xD4C0, + 11070: 0xD4C1, + 11071: 0xD4C2, + 11072: 0xD4C3, + 11073: 0xD4C4, + 11074: 0xD4C5, + 11075: 0xD4C6, + 11076: 0xD4C7, + 11077: 0xD4C8, + 11078: 0xD4C9, + 11079: 0xD4CA, + 11080: 0xD4CB, + 11081: 0xD4CD, + 11082: 0xD4CE, + 11083: 0xD4CF, + 11084: 0xD4D1, + 11085: 0xD4D2, + 11086: 0xD4D3, + 11087: 0xD4D5, + 11088: 0xD4D6, + 11089: 0xD4D7, + 11090: 0xD4D8, + 11091: 0xD4D9, + 11092: 0xD4DA, + 11093: 0xD4DB, + 11094: 0xD4DD, + 11095: 0xD4DE, + 11096: 0xD4E0, + 11097: 0xD4E1, + 11098: 0xD4E2, + 11099: 0xD4E3, + 11100: 0xD4E4, + 11101: 0xD4E5, + 11102: 0xD4E6, + 11103: 0xD4E7, + 11104: 0xD4E9, + 11105: 0xD4EA, + 11106: 0xD4EB, + 11107: 0xD4ED, + 11108: 0xD4EE, + 11109: 0xD4EF, + 11110: 0xD4F1, + 11111: 0xD4F2, + 11112: 0xD4F3, + 11113: 0xD4F4, + 11114: 0xD4F5, + 11115: 0xD4F6, + 11116: 0xD4F7, + 11117: 0xD4F9, + 11118: 0xD4FA, + 11119: 0xD4FC, + 11120: 0xC5D0, + 11121: 0xC5D1, + 11122: 0xC5D4, + 11123: 0xC5D8, + 11124: 0xC5E0, + 11125: 0xC5E1, + 11126: 0xC5E3, + 11127: 0xC5E5, + 11128: 0xC5EC, + 11129: 0xC5ED, + 11130: 0xC5EE, + 11131: 0xC5F0, + 11132: 0xC5F4, + 11133: 0xC5F6, + 11134: 0xC5F7, + 11135: 0xC5FC, + 11136: 0xC5FD, + 11137: 0xC5FE, + 11138: 0xC5FF, + 11139: 0xC600, + 11140: 0xC601, + 11141: 0xC605, + 11142: 0xC606, + 11143: 0xC607, + 11144: 0xC608, + 11145: 0xC60C, + 11146: 0xC610, + 11147: 0xC618, + 11148: 0xC619, + 11149: 0xC61B, + 11150: 0xC61C, + 11151: 0xC624, + 11152: 0xC625, + 11153: 0xC628, + 11154: 0xC62C, + 11155: 0xC62D, + 11156: 0xC62E, + 11157: 0xC630, + 11158: 0xC633, + 11159: 0xC634, + 11160: 0xC635, + 11161: 0xC637, + 11162: 0xC639, + 11163: 0xC63B, + 11164: 0xC640, + 11165: 0xC641, + 11166: 0xC644, + 11167: 0xC648, + 11168: 0xC650, + 11169: 0xC651, + 11170: 0xC653, + 11171: 0xC654, + 11172: 0xC655, + 11173: 0xC65C, + 11174: 0xC65D, + 11175: 0xC660, + 11176: 0xC66C, + 11177: 0xC66F, + 11178: 0xC671, + 11179: 0xC678, + 11180: 0xC679, + 11181: 0xC67C, + 11182: 0xC680, + 11183: 0xC688, + 11184: 0xC689, + 11185: 0xC68B, + 11186: 0xC68D, + 11187: 0xC694, + 11188: 0xC695, + 11189: 0xC698, + 11190: 0xC69C, + 11191: 0xC6A4, + 11192: 0xC6A5, + 11193: 0xC6A7, + 11194: 0xC6A9, + 11195: 0xC6B0, + 11196: 0xC6B1, + 11197: 0xC6B4, + 11198: 0xC6B8, + 11199: 0xC6B9, + 11200: 0xC6BA, + 11201: 0xC6C0, + 11202: 0xC6C1, + 11203: 0xC6C3, + 11204: 0xC6C5, + 11205: 0xC6CC, + 11206: 0xC6CD, + 11207: 0xC6D0, + 11208: 0xC6D4, + 11209: 0xC6DC, + 11210: 0xC6DD, + 11211: 0xC6E0, + 11212: 0xC6E1, + 11213: 0xC6E8, + 11214: 0xD4FE, + 11215: 0xD4FF, + 11216: 0xD500, + 11217: 0xD501, + 11218: 0xD502, + 11219: 0xD503, + 11220: 0xD505, + 11221: 0xD506, + 11222: 0xD507, + 11223: 0xD509, + 11224: 0xD50A, + 11225: 0xD50B, + 11226: 0xD50D, + 11227: 0xD50E, + 11228: 0xD50F, + 11229: 0xD510, + 11230: 0xD511, + 11231: 0xD512, + 11232: 0xD513, + 11233: 0xD516, + 11234: 0xD518, + 11235: 0xD519, + 11236: 0xD51A, + 11237: 0xD51B, + 11238: 0xD51C, + 11239: 0xD51D, + 11240: 0xD51E, + 11241: 0xD51F, + 11242: 0xD520, + 11243: 0xD521, + 11244: 0xD522, + 11245: 0xD523, + 11246: 0xD524, + 11247: 0xD525, + 11248: 0xD526, + 11249: 0xD527, + 11250: 0xD528, + 11251: 0xD529, + 11252: 0xD52A, + 11253: 0xD52B, + 11254: 0xD52C, + 11255: 0xD52D, + 11256: 0xD52E, + 11257: 0xD52F, + 11258: 0xD530, + 11259: 0xD531, + 11260: 0xD532, + 11261: 0xD533, + 11262: 0xD534, + 11263: 0xD535, + 11264: 0xD536, + 11265: 0xD537, + 11266: 0xD538, + 11267: 0xD539, + 11268: 0xD53A, + 11269: 0xD53B, + 11270: 0xD53E, + 11271: 0xD53F, + 11272: 0xD541, + 11273: 0xD542, + 11274: 0xD543, + 11275: 0xD545, + 11276: 0xD546, + 11277: 0xD547, + 11278: 0xD548, + 11279: 0xD549, + 11280: 0xD54A, + 11281: 0xD54B, + 11282: 0xD54E, + 11283: 0xD550, + 11284: 0xD552, + 11285: 0xD553, + 11286: 0xD554, + 11287: 0xD555, + 11288: 0xD556, + 11289: 0xD557, + 11290: 0xD55A, + 11291: 0xD55B, + 11292: 0xD55D, + 11293: 0xD55E, + 11294: 0xD55F, + 11295: 0xD561, + 11296: 0xD562, + 11297: 0xD563, + 11298: 0xC6E9, + 11299: 0xC6EC, + 11300: 0xC6F0, + 11301: 0xC6F8, + 11302: 0xC6F9, + 11303: 0xC6FD, + 11304: 0xC704, + 11305: 0xC705, + 11306: 0xC708, + 11307: 0xC70C, + 11308: 0xC714, + 11309: 0xC715, + 11310: 0xC717, + 11311: 0xC719, + 11312: 0xC720, + 11313: 0xC721, + 11314: 0xC724, + 11315: 0xC728, + 11316: 0xC730, + 11317: 0xC731, + 11318: 0xC733, + 11319: 0xC735, + 11320: 0xC737, + 11321: 0xC73C, + 11322: 0xC73D, + 11323: 0xC740, + 11324: 0xC744, + 11325: 0xC74A, + 11326: 0xC74C, + 11327: 0xC74D, + 11328: 0xC74F, + 11329: 0xC751, + 11330: 0xC752, + 11331: 0xC753, + 11332: 0xC754, + 11333: 0xC755, + 11334: 0xC756, + 11335: 0xC757, + 11336: 0xC758, + 11337: 0xC75C, + 11338: 0xC760, + 11339: 0xC768, + 11340: 0xC76B, + 11341: 0xC774, + 11342: 0xC775, + 11343: 0xC778, + 11344: 0xC77C, + 11345: 0xC77D, + 11346: 0xC77E, + 11347: 0xC783, + 11348: 0xC784, + 11349: 0xC785, + 11350: 0xC787, + 11351: 0xC788, + 11352: 0xC789, + 11353: 0xC78A, + 11354: 0xC78E, + 11355: 0xC790, + 11356: 0xC791, + 11357: 0xC794, + 11358: 0xC796, + 11359: 0xC797, + 11360: 0xC798, + 11361: 0xC79A, + 11362: 0xC7A0, + 11363: 0xC7A1, + 11364: 0xC7A3, + 11365: 0xC7A4, + 11366: 0xC7A5, + 11367: 0xC7A6, + 11368: 0xC7AC, + 11369: 0xC7AD, + 11370: 0xC7B0, + 11371: 0xC7B4, + 11372: 0xC7BC, + 11373: 0xC7BD, + 11374: 0xC7BF, + 11375: 0xC7C0, + 11376: 0xC7C1, + 11377: 0xC7C8, + 11378: 0xC7C9, + 11379: 0xC7CC, + 11380: 0xC7CE, + 11381: 0xC7D0, + 11382: 0xC7D8, + 11383: 0xC7DD, + 11384: 0xC7E4, + 11385: 0xC7E8, + 11386: 0xC7EC, + 11387: 0xC800, + 11388: 0xC801, + 11389: 0xC804, + 11390: 0xC808, + 11391: 0xC80A, + 11392: 0xD564, + 11393: 0xD566, + 11394: 0xD567, + 11395: 0xD56A, + 11396: 0xD56C, + 11397: 0xD56E, + 11398: 0xD56F, + 11399: 0xD570, + 11400: 0xD571, + 11401: 0xD572, + 11402: 0xD573, + 11403: 0xD576, + 11404: 0xD577, + 11405: 0xD579, + 11406: 0xD57A, + 11407: 0xD57B, + 11408: 0xD57D, + 11409: 0xD57E, + 11410: 0xD57F, + 11411: 0xD580, + 11412: 0xD581, + 11413: 0xD582, + 11414: 0xD583, + 11415: 0xD586, + 11416: 0xD58A, + 11417: 0xD58B, + 11418: 0xD58C, + 11419: 0xD58D, + 11420: 0xD58E, + 11421: 0xD58F, + 11422: 0xD591, + 11423: 0xD592, + 11424: 0xD593, + 11425: 0xD594, + 11426: 0xD595, + 11427: 0xD596, + 11428: 0xD597, + 11429: 0xD598, + 11430: 0xD599, + 11431: 0xD59A, + 11432: 0xD59B, + 11433: 0xD59C, + 11434: 0xD59D, + 11435: 0xD59E, + 11436: 0xD59F, + 11437: 0xD5A0, + 11438: 0xD5A1, + 11439: 0xD5A2, + 11440: 0xD5A3, + 11441: 0xD5A4, + 11442: 0xD5A6, + 11443: 0xD5A7, + 11444: 0xD5A8, + 11445: 0xD5A9, + 11446: 0xD5AA, + 11447: 0xD5AB, + 11448: 0xD5AC, + 11449: 0xD5AD, + 11450: 0xD5AE, + 11451: 0xD5AF, + 11452: 0xD5B0, + 11453: 0xD5B1, + 11454: 0xD5B2, + 11455: 0xD5B3, + 11456: 0xD5B4, + 11457: 0xD5B5, + 11458: 0xD5B6, + 11459: 0xD5B7, + 11460: 0xD5B8, + 11461: 0xD5B9, + 11462: 0xD5BA, + 11463: 0xD5BB, + 11464: 0xD5BC, + 11465: 0xD5BD, + 11466: 0xD5BE, + 11467: 0xD5BF, + 11468: 0xD5C0, + 11469: 0xD5C1, + 11470: 0xD5C2, + 11471: 0xD5C3, + 11472: 0xD5C4, + 11473: 0xD5C5, + 11474: 0xD5C6, + 11475: 0xD5C7, + 11476: 0xC810, + 11477: 0xC811, + 11478: 0xC813, + 11479: 0xC815, + 11480: 0xC816, + 11481: 0xC81C, + 11482: 0xC81D, + 11483: 0xC820, + 11484: 0xC824, + 11485: 0xC82C, + 11486: 0xC82D, + 11487: 0xC82F, + 11488: 0xC831, + 11489: 0xC838, + 11490: 0xC83C, + 11491: 0xC840, + 11492: 0xC848, + 11493: 0xC849, + 11494: 0xC84C, + 11495: 0xC84D, + 11496: 0xC854, + 11497: 0xC870, + 11498: 0xC871, + 11499: 0xC874, + 11500: 0xC878, + 11501: 0xC87A, + 11502: 0xC880, + 11503: 0xC881, + 11504: 0xC883, + 11505: 0xC885, + 11506: 0xC886, + 11507: 0xC887, + 11508: 0xC88B, + 11509: 0xC88C, + 11510: 0xC88D, + 11511: 0xC894, + 11512: 0xC89D, + 11513: 0xC89F, + 11514: 0xC8A1, + 11515: 0xC8A8, + 11516: 0xC8BC, + 11517: 0xC8BD, + 11518: 0xC8C4, + 11519: 0xC8C8, + 11520: 0xC8CC, + 11521: 0xC8D4, + 11522: 0xC8D5, + 11523: 0xC8D7, + 11524: 0xC8D9, + 11525: 0xC8E0, + 11526: 0xC8E1, + 11527: 0xC8E4, + 11528: 0xC8F5, + 11529: 0xC8FC, + 11530: 0xC8FD, + 11531: 0xC900, + 11532: 0xC904, + 11533: 0xC905, + 11534: 0xC906, + 11535: 0xC90C, + 11536: 0xC90D, + 11537: 0xC90F, + 11538: 0xC911, + 11539: 0xC918, + 11540: 0xC92C, + 11541: 0xC934, + 11542: 0xC950, + 11543: 0xC951, + 11544: 0xC954, + 11545: 0xC958, + 11546: 0xC960, + 11547: 0xC961, + 11548: 0xC963, + 11549: 0xC96C, + 11550: 0xC970, + 11551: 0xC974, + 11552: 0xC97C, + 11553: 0xC988, + 11554: 0xC989, + 11555: 0xC98C, + 11556: 0xC990, + 11557: 0xC998, + 11558: 0xC999, + 11559: 0xC99B, + 11560: 0xC99D, + 11561: 0xC9C0, + 11562: 0xC9C1, + 11563: 0xC9C4, + 11564: 0xC9C7, + 11565: 0xC9C8, + 11566: 0xC9CA, + 11567: 0xC9D0, + 11568: 0xC9D1, + 11569: 0xC9D3, + 11570: 0xD5CA, + 11571: 0xD5CB, + 11572: 0xD5CD, + 11573: 0xD5CE, + 11574: 0xD5CF, + 11575: 0xD5D1, + 11576: 0xD5D3, + 11577: 0xD5D4, + 11578: 0xD5D5, + 11579: 0xD5D6, + 11580: 0xD5D7, + 11581: 0xD5DA, + 11582: 0xD5DC, + 11583: 0xD5DE, + 11584: 0xD5DF, + 11585: 0xD5E0, + 11586: 0xD5E1, + 11587: 0xD5E2, + 11588: 0xD5E3, + 11589: 0xD5E6, + 11590: 0xD5E7, + 11591: 0xD5E9, + 11592: 0xD5EA, + 11593: 0xD5EB, + 11594: 0xD5ED, + 11595: 0xD5EE, + 11596: 0xD5EF, + 11597: 0xD5F0, + 11598: 0xD5F1, + 11599: 0xD5F2, + 11600: 0xD5F3, + 11601: 0xD5F6, + 11602: 0xD5F8, + 11603: 0xD5FA, + 11604: 0xD5FB, + 11605: 0xD5FC, + 11606: 0xD5FD, + 11607: 0xD5FE, + 11608: 0xD5FF, + 11609: 0xD602, + 11610: 0xD603, + 11611: 0xD605, + 11612: 0xD606, + 11613: 0xD607, + 11614: 0xD609, + 11615: 0xD60A, + 11616: 0xD60B, + 11617: 0xD60C, + 11618: 0xD60D, + 11619: 0xD60E, + 11620: 0xD60F, + 11621: 0xD612, + 11622: 0xD616, + 11623: 0xD617, + 11624: 0xD618, + 11625: 0xD619, + 11626: 0xD61A, + 11627: 0xD61B, + 11628: 0xD61D, + 11629: 0xD61E, + 11630: 0xD61F, + 11631: 0xD621, + 11632: 0xD622, + 11633: 0xD623, + 11634: 0xD625, + 11635: 0xD626, + 11636: 0xD627, + 11637: 0xD628, + 11638: 0xD629, + 11639: 0xD62A, + 11640: 0xD62B, + 11641: 0xD62C, + 11642: 0xD62E, + 11643: 0xD62F, + 11644: 0xD630, + 11645: 0xD631, + 11646: 0xD632, + 11647: 0xD633, + 11648: 0xD634, + 11649: 0xD635, + 11650: 0xD636, + 11651: 0xD637, + 11652: 0xD63A, + 11653: 0xD63B, + 11654: 0xC9D5, + 11655: 0xC9D6, + 11656: 0xC9D9, + 11657: 0xC9DA, + 11658: 0xC9DC, + 11659: 0xC9DD, + 11660: 0xC9E0, + 11661: 0xC9E2, + 11662: 0xC9E4, + 11663: 0xC9E7, + 11664: 0xC9EC, + 11665: 0xC9ED, + 11666: 0xC9EF, + 11667: 0xC9F0, + 11668: 0xC9F1, + 11669: 0xC9F8, + 11670: 0xC9F9, + 11671: 0xC9FC, + 11672: 0xCA00, + 11673: 0xCA08, + 11674: 0xCA09, + 11675: 0xCA0B, + 11676: 0xCA0C, + 11677: 0xCA0D, + 11678: 0xCA14, + 11679: 0xCA18, + 11680: 0xCA29, + 11681: 0xCA4C, + 11682: 0xCA4D, + 11683: 0xCA50, + 11684: 0xCA54, + 11685: 0xCA5C, + 11686: 0xCA5D, + 11687: 0xCA5F, + 11688: 0xCA60, + 11689: 0xCA61, + 11690: 0xCA68, + 11691: 0xCA7D, + 11692: 0xCA84, + 11693: 0xCA98, + 11694: 0xCABC, + 11695: 0xCABD, + 11696: 0xCAC0, + 11697: 0xCAC4, + 11698: 0xCACC, + 11699: 0xCACD, + 11700: 0xCACF, + 11701: 0xCAD1, + 11702: 0xCAD3, + 11703: 0xCAD8, + 11704: 0xCAD9, + 11705: 0xCAE0, + 11706: 0xCAEC, + 11707: 0xCAF4, + 11708: 0xCB08, + 11709: 0xCB10, + 11710: 0xCB14, + 11711: 0xCB18, + 11712: 0xCB20, + 11713: 0xCB21, + 11714: 0xCB41, + 11715: 0xCB48, + 11716: 0xCB49, + 11717: 0xCB4C, + 11718: 0xCB50, + 11719: 0xCB58, + 11720: 0xCB59, + 11721: 0xCB5D, + 11722: 0xCB64, + 11723: 0xCB78, + 11724: 0xCB79, + 11725: 0xCB9C, + 11726: 0xCBB8, + 11727: 0xCBD4, + 11728: 0xCBE4, + 11729: 0xCBE7, + 11730: 0xCBE9, + 11731: 0xCC0C, + 11732: 0xCC0D, + 11733: 0xCC10, + 11734: 0xCC14, + 11735: 0xCC1C, + 11736: 0xCC1D, + 11737: 0xCC21, + 11738: 0xCC22, + 11739: 0xCC27, + 11740: 0xCC28, + 11741: 0xCC29, + 11742: 0xCC2C, + 11743: 0xCC2E, + 11744: 0xCC30, + 11745: 0xCC38, + 11746: 0xCC39, + 11747: 0xCC3B, + 11748: 0xD63D, + 11749: 0xD63E, + 11750: 0xD63F, + 11751: 0xD641, + 11752: 0xD642, + 11753: 0xD643, + 11754: 0xD644, + 11755: 0xD646, + 11756: 0xD647, + 11757: 0xD64A, + 11758: 0xD64C, + 11759: 0xD64E, + 11760: 0xD64F, + 11761: 0xD650, + 11762: 0xD652, + 11763: 0xD653, + 11764: 0xD656, + 11765: 0xD657, + 11766: 0xD659, + 11767: 0xD65A, + 11768: 0xD65B, + 11769: 0xD65D, + 11770: 0xD65E, + 11771: 0xD65F, + 11772: 0xD660, + 11773: 0xD661, + 11774: 0xD662, + 11775: 0xD663, + 11776: 0xD664, + 11777: 0xD665, + 11778: 0xD666, + 11779: 0xD668, + 11780: 0xD66A, + 11781: 0xD66B, + 11782: 0xD66C, + 11783: 0xD66D, + 11784: 0xD66E, + 11785: 0xD66F, + 11786: 0xD672, + 11787: 0xD673, + 11788: 0xD675, + 11789: 0xD676, + 11790: 0xD677, + 11791: 0xD678, + 11792: 0xD679, + 11793: 0xD67A, + 11794: 0xD67B, + 11795: 0xD67C, + 11796: 0xD67D, + 11797: 0xD67E, + 11798: 0xD67F, + 11799: 0xD680, + 11800: 0xD681, + 11801: 0xD682, + 11802: 0xD684, + 11803: 0xD686, + 11804: 0xD687, + 11805: 0xD688, + 11806: 0xD689, + 11807: 0xD68A, + 11808: 0xD68B, + 11809: 0xD68E, + 11810: 0xD68F, + 11811: 0xD691, + 11812: 0xD692, + 11813: 0xD693, + 11814: 0xD695, + 11815: 0xD696, + 11816: 0xD697, + 11817: 0xD698, + 11818: 0xD699, + 11819: 0xD69A, + 11820: 0xD69B, + 11821: 0xD69C, + 11822: 0xD69E, + 11823: 0xD6A0, + 11824: 0xD6A2, + 11825: 0xD6A3, + 11826: 0xD6A4, + 11827: 0xD6A5, + 11828: 0xD6A6, + 11829: 0xD6A7, + 11830: 0xD6A9, + 11831: 0xD6AA, + 11832: 0xCC3C, + 11833: 0xCC3D, + 11834: 0xCC3E, + 11835: 0xCC44, + 11836: 0xCC45, + 11837: 0xCC48, + 11838: 0xCC4C, + 11839: 0xCC54, + 11840: 0xCC55, + 11841: 0xCC57, + 11842: 0xCC58, + 11843: 0xCC59, + 11844: 0xCC60, + 11845: 0xCC64, + 11846: 0xCC66, + 11847: 0xCC68, + 11848: 0xCC70, + 11849: 0xCC75, + 11850: 0xCC98, + 11851: 0xCC99, + 11852: 0xCC9C, + 11853: 0xCCA0, + 11854: 0xCCA8, + 11855: 0xCCA9, + 11856: 0xCCAB, + 11857: 0xCCAC, + 11858: 0xCCAD, + 11859: 0xCCB4, + 11860: 0xCCB5, + 11861: 0xCCB8, + 11862: 0xCCBC, + 11863: 0xCCC4, + 11864: 0xCCC5, + 11865: 0xCCC7, + 11866: 0xCCC9, + 11867: 0xCCD0, + 11868: 0xCCD4, + 11869: 0xCCE4, + 11870: 0xCCEC, + 11871: 0xCCF0, + 11872: 0xCD01, + 11873: 0xCD08, + 11874: 0xCD09, + 11875: 0xCD0C, + 11876: 0xCD10, + 11877: 0xCD18, + 11878: 0xCD19, + 11879: 0xCD1B, + 11880: 0xCD1D, + 11881: 0xCD24, + 11882: 0xCD28, + 11883: 0xCD2C, + 11884: 0xCD39, + 11885: 0xCD5C, + 11886: 0xCD60, + 11887: 0xCD64, + 11888: 0xCD6C, + 11889: 0xCD6D, + 11890: 0xCD6F, + 11891: 0xCD71, + 11892: 0xCD78, + 11893: 0xCD88, + 11894: 0xCD94, + 11895: 0xCD95, + 11896: 0xCD98, + 11897: 0xCD9C, + 11898: 0xCDA4, + 11899: 0xCDA5, + 11900: 0xCDA7, + 11901: 0xCDA9, + 11902: 0xCDB0, + 11903: 0xCDC4, + 11904: 0xCDCC, + 11905: 0xCDD0, + 11906: 0xCDE8, + 11907: 0xCDEC, + 11908: 0xCDF0, + 11909: 0xCDF8, + 11910: 0xCDF9, + 11911: 0xCDFB, + 11912: 0xCDFD, + 11913: 0xCE04, + 11914: 0xCE08, + 11915: 0xCE0C, + 11916: 0xCE14, + 11917: 0xCE19, + 11918: 0xCE20, + 11919: 0xCE21, + 11920: 0xCE24, + 11921: 0xCE28, + 11922: 0xCE30, + 11923: 0xCE31, + 11924: 0xCE33, + 11925: 0xCE35, + 11926: 0xD6AB, + 11927: 0xD6AD, + 11928: 0xD6AE, + 11929: 0xD6AF, + 11930: 0xD6B1, + 11931: 0xD6B2, + 11932: 0xD6B3, + 11933: 0xD6B4, + 11934: 0xD6B5, + 11935: 0xD6B6, + 11936: 0xD6B7, + 11937: 0xD6B8, + 11938: 0xD6BA, + 11939: 0xD6BC, + 11940: 0xD6BD, + 11941: 0xD6BE, + 11942: 0xD6BF, + 11943: 0xD6C0, + 11944: 0xD6C1, + 11945: 0xD6C2, + 11946: 0xD6C3, + 11947: 0xD6C6, + 11948: 0xD6C7, + 11949: 0xD6C9, + 11950: 0xD6CA, + 11951: 0xD6CB, + 11952: 0xD6CD, + 11953: 0xD6CE, + 11954: 0xD6CF, + 11955: 0xD6D0, + 11956: 0xD6D2, + 11957: 0xD6D3, + 11958: 0xD6D5, + 11959: 0xD6D6, + 11960: 0xD6D8, + 11961: 0xD6DA, + 11962: 0xD6DB, + 11963: 0xD6DC, + 11964: 0xD6DD, + 11965: 0xD6DE, + 11966: 0xD6DF, + 11967: 0xD6E1, + 11968: 0xD6E2, + 11969: 0xD6E3, + 11970: 0xD6E5, + 11971: 0xD6E6, + 11972: 0xD6E7, + 11973: 0xD6E9, + 11974: 0xD6EA, + 11975: 0xD6EB, + 11976: 0xD6EC, + 11977: 0xD6ED, + 11978: 0xD6EE, + 11979: 0xD6EF, + 11980: 0xD6F1, + 11981: 0xD6F2, + 11982: 0xD6F3, + 11983: 0xD6F4, + 11984: 0xD6F6, + 11985: 0xD6F7, + 11986: 0xD6F8, + 11987: 0xD6F9, + 11988: 0xD6FA, + 11989: 0xD6FB, + 11990: 0xD6FE, + 11991: 0xD6FF, + 11992: 0xD701, + 11993: 0xD702, + 11994: 0xD703, + 11995: 0xD705, + 11996: 0xD706, + 11997: 0xD707, + 11998: 0xD708, + 11999: 0xD709, + 12000: 0xD70A, + 12001: 0xD70B, + 12002: 0xD70C, + 12003: 0xD70D, + 12004: 0xD70E, + 12005: 0xD70F, + 12006: 0xD710, + 12007: 0xD712, + 12008: 0xD713, + 12009: 0xD714, + 12010: 0xCE58, + 12011: 0xCE59, + 12012: 0xCE5C, + 12013: 0xCE5F, + 12014: 0xCE60, + 12015: 0xCE61, + 12016: 0xCE68, + 12017: 0xCE69, + 12018: 0xCE6B, + 12019: 0xCE6D, + 12020: 0xCE74, + 12021: 0xCE75, + 12022: 0xCE78, + 12023: 0xCE7C, + 12024: 0xCE84, + 12025: 0xCE85, + 12026: 0xCE87, + 12027: 0xCE89, + 12028: 0xCE90, + 12029: 0xCE91, + 12030: 0xCE94, + 12031: 0xCE98, + 12032: 0xCEA0, + 12033: 0xCEA1, + 12034: 0xCEA3, + 12035: 0xCEA4, + 12036: 0xCEA5, + 12037: 0xCEAC, + 12038: 0xCEAD, + 12039: 0xCEC1, + 12040: 0xCEE4, + 12041: 0xCEE5, + 12042: 0xCEE8, + 12043: 0xCEEB, + 12044: 0xCEEC, + 12045: 0xCEF4, + 12046: 0xCEF5, + 12047: 0xCEF7, + 12048: 0xCEF8, + 12049: 0xCEF9, + 12050: 0xCF00, + 12051: 0xCF01, + 12052: 0xCF04, + 12053: 0xCF08, + 12054: 0xCF10, + 12055: 0xCF11, + 12056: 0xCF13, + 12057: 0xCF15, + 12058: 0xCF1C, + 12059: 0xCF20, + 12060: 0xCF24, + 12061: 0xCF2C, + 12062: 0xCF2D, + 12063: 0xCF2F, + 12064: 0xCF30, + 12065: 0xCF31, + 12066: 0xCF38, + 12067: 0xCF54, + 12068: 0xCF55, + 12069: 0xCF58, + 12070: 0xCF5C, + 12071: 0xCF64, + 12072: 0xCF65, + 12073: 0xCF67, + 12074: 0xCF69, + 12075: 0xCF70, + 12076: 0xCF71, + 12077: 0xCF74, + 12078: 0xCF78, + 12079: 0xCF80, + 12080: 0xCF85, + 12081: 0xCF8C, + 12082: 0xCFA1, + 12083: 0xCFA8, + 12084: 0xCFB0, + 12085: 0xCFC4, + 12086: 0xCFE0, + 12087: 0xCFE1, + 12088: 0xCFE4, + 12089: 0xCFE8, + 12090: 0xCFF0, + 12091: 0xCFF1, + 12092: 0xCFF3, + 12093: 0xCFF5, + 12094: 0xCFFC, + 12095: 0xD000, + 12096: 0xD004, + 12097: 0xD011, + 12098: 0xD018, + 12099: 0xD02D, + 12100: 0xD034, + 12101: 0xD035, + 12102: 0xD038, + 12103: 0xD03C, + 12104: 0xD715, + 12105: 0xD716, + 12106: 0xD717, + 12107: 0xD71A, + 12108: 0xD71B, + 12109: 0xD71D, + 12110: 0xD71E, + 12111: 0xD71F, + 12112: 0xD721, + 12113: 0xD722, + 12114: 0xD723, + 12115: 0xD724, + 12116: 0xD725, + 12117: 0xD726, + 12118: 0xD727, + 12119: 0xD72A, + 12120: 0xD72C, + 12121: 0xD72E, + 12122: 0xD72F, + 12123: 0xD730, + 12124: 0xD731, + 12125: 0xD732, + 12126: 0xD733, + 12127: 0xD736, + 12128: 0xD737, + 12129: 0xD739, + 12130: 0xD73A, + 12131: 0xD73B, + 12132: 0xD73D, + 12133: 0xD73E, + 12134: 0xD73F, + 12135: 0xD740, + 12136: 0xD741, + 12137: 0xD742, + 12138: 0xD743, + 12139: 0xD745, + 12140: 0xD746, + 12141: 0xD748, + 12142: 0xD74A, + 12143: 0xD74B, + 12144: 0xD74C, + 12145: 0xD74D, + 12146: 0xD74E, + 12147: 0xD74F, + 12148: 0xD752, + 12149: 0xD753, + 12150: 0xD755, + 12151: 0xD75A, + 12152: 0xD75B, + 12153: 0xD75C, + 12154: 0xD75D, + 12155: 0xD75E, + 12156: 0xD75F, + 12157: 0xD762, + 12158: 0xD764, + 12159: 0xD766, + 12160: 0xD767, + 12161: 0xD768, + 12162: 0xD76A, + 12163: 0xD76B, + 12164: 0xD76D, + 12165: 0xD76E, + 12166: 0xD76F, + 12167: 0xD771, + 12168: 0xD772, + 12169: 0xD773, + 12170: 0xD775, + 12171: 0xD776, + 12172: 0xD777, + 12173: 0xD778, + 12174: 0xD779, + 12175: 0xD77A, + 12176: 0xD77B, + 12177: 0xD77E, + 12178: 0xD77F, + 12179: 0xD780, + 12180: 0xD782, + 12181: 0xD783, + 12182: 0xD784, + 12183: 0xD785, + 12184: 0xD786, + 12185: 0xD787, + 12186: 0xD78A, + 12187: 0xD78B, + 12188: 0xD044, + 12189: 0xD045, + 12190: 0xD047, + 12191: 0xD049, + 12192: 0xD050, + 12193: 0xD054, + 12194: 0xD058, + 12195: 0xD060, + 12196: 0xD06C, + 12197: 0xD06D, + 12198: 0xD070, + 12199: 0xD074, + 12200: 0xD07C, + 12201: 0xD07D, + 12202: 0xD081, + 12203: 0xD0A4, + 12204: 0xD0A5, + 12205: 0xD0A8, + 12206: 0xD0AC, + 12207: 0xD0B4, + 12208: 0xD0B5, + 12209: 0xD0B7, + 12210: 0xD0B9, + 12211: 0xD0C0, + 12212: 0xD0C1, + 12213: 0xD0C4, + 12214: 0xD0C8, + 12215: 0xD0C9, + 12216: 0xD0D0, + 12217: 0xD0D1, + 12218: 0xD0D3, + 12219: 0xD0D4, + 12220: 0xD0D5, + 12221: 0xD0DC, + 12222: 0xD0DD, + 12223: 0xD0E0, + 12224: 0xD0E4, + 12225: 0xD0EC, + 12226: 0xD0ED, + 12227: 0xD0EF, + 12228: 0xD0F0, + 12229: 0xD0F1, + 12230: 0xD0F8, + 12231: 0xD10D, + 12232: 0xD130, + 12233: 0xD131, + 12234: 0xD134, + 12235: 0xD138, + 12236: 0xD13A, + 12237: 0xD140, + 12238: 0xD141, + 12239: 0xD143, + 12240: 0xD144, + 12241: 0xD145, + 12242: 0xD14C, + 12243: 0xD14D, + 12244: 0xD150, + 12245: 0xD154, + 12246: 0xD15C, + 12247: 0xD15D, + 12248: 0xD15F, + 12249: 0xD161, + 12250: 0xD168, + 12251: 0xD16C, + 12252: 0xD17C, + 12253: 0xD184, + 12254: 0xD188, + 12255: 0xD1A0, + 12256: 0xD1A1, + 12257: 0xD1A4, + 12258: 0xD1A8, + 12259: 0xD1B0, + 12260: 0xD1B1, + 12261: 0xD1B3, + 12262: 0xD1B5, + 12263: 0xD1BA, + 12264: 0xD1BC, + 12265: 0xD1C0, + 12266: 0xD1D8, + 12267: 0xD1F4, + 12268: 0xD1F8, + 12269: 0xD207, + 12270: 0xD209, + 12271: 0xD210, + 12272: 0xD22C, + 12273: 0xD22D, + 12274: 0xD230, + 12275: 0xD234, + 12276: 0xD23C, + 12277: 0xD23D, + 12278: 0xD23F, + 12279: 0xD241, + 12280: 0xD248, + 12281: 0xD25C, + 12282: 0xD78D, + 12283: 0xD78E, + 12284: 0xD78F, + 12285: 0xD791, + 12286: 0xD792, + 12287: 0xD793, + 12288: 0xD794, + 12289: 0xD795, + 12290: 0xD796, + 12291: 0xD797, + 12292: 0xD79A, + 12293: 0xD79C, + 12294: 0xD79E, + 12295: 0xD79F, + 12296: 0xD7A0, + 12297: 0xD7A1, + 12298: 0xD7A2, + 12299: 0xD7A3, + 12366: 0xD264, + 12367: 0xD280, + 12368: 0xD281, + 12369: 0xD284, + 12370: 0xD288, + 12371: 0xD290, + 12372: 0xD291, + 12373: 0xD295, + 12374: 0xD29C, + 12375: 0xD2A0, + 12376: 0xD2A4, + 12377: 0xD2AC, + 12378: 0xD2B1, + 12379: 0xD2B8, + 12380: 0xD2B9, + 12381: 0xD2BC, + 12382: 0xD2BF, + 12383: 0xD2C0, + 12384: 0xD2C2, + 12385: 0xD2C8, + 12386: 0xD2C9, + 12387: 0xD2CB, + 12388: 0xD2D4, + 12389: 0xD2D8, + 12390: 0xD2DC, + 12391: 0xD2E4, + 12392: 0xD2E5, + 12393: 0xD2F0, + 12394: 0xD2F1, + 12395: 0xD2F4, + 12396: 0xD2F8, + 12397: 0xD300, + 12398: 0xD301, + 12399: 0xD303, + 12400: 0xD305, + 12401: 0xD30C, + 12402: 0xD30D, + 12403: 0xD30E, + 12404: 0xD310, + 12405: 0xD314, + 12406: 0xD316, + 12407: 0xD31C, + 12408: 0xD31D, + 12409: 0xD31F, + 12410: 0xD320, + 12411: 0xD321, + 12412: 0xD325, + 12413: 0xD328, + 12414: 0xD329, + 12415: 0xD32C, + 12416: 0xD330, + 12417: 0xD338, + 12418: 0xD339, + 12419: 0xD33B, + 12420: 0xD33C, + 12421: 0xD33D, + 12422: 0xD344, + 12423: 0xD345, + 12424: 0xD37C, + 12425: 0xD37D, + 12426: 0xD380, + 12427: 0xD384, + 12428: 0xD38C, + 12429: 0xD38D, + 12430: 0xD38F, + 12431: 0xD390, + 12432: 0xD391, + 12433: 0xD398, + 12434: 0xD399, + 12435: 0xD39C, + 12436: 0xD3A0, + 12437: 0xD3A8, + 12438: 0xD3A9, + 12439: 0xD3AB, + 12440: 0xD3AD, + 12441: 0xD3B4, + 12442: 0xD3B8, + 12443: 0xD3BC, + 12444: 0xD3C4, + 12445: 0xD3C5, + 12446: 0xD3C8, + 12447: 0xD3C9, + 12448: 0xD3D0, + 12449: 0xD3D8, + 12450: 0xD3E1, + 12451: 0xD3E3, + 12452: 0xD3EC, + 12453: 0xD3ED, + 12454: 0xD3F0, + 12455: 0xD3F4, + 12456: 0xD3FC, + 12457: 0xD3FD, + 12458: 0xD3FF, + 12459: 0xD401, + 12460: 0xD408, + 12461: 0xD41D, + 12462: 0xD440, + 12463: 0xD444, + 12464: 0xD45C, + 12465: 0xD460, + 12466: 0xD464, + 12467: 0xD46D, + 12468: 0xD46F, + 12469: 0xD478, + 12470: 0xD479, + 12471: 0xD47C, + 12472: 0xD47F, + 12473: 0xD480, + 12474: 0xD482, + 12475: 0xD488, + 12476: 0xD489, + 12477: 0xD48B, + 12478: 0xD48D, + 12479: 0xD494, + 12480: 0xD4A9, + 12481: 0xD4CC, + 12482: 0xD4D0, + 12483: 0xD4D4, + 12484: 0xD4DC, + 12485: 0xD4DF, + 12486: 0xD4E8, + 12487: 0xD4EC, + 12488: 0xD4F0, + 12489: 0xD4F8, + 12490: 0xD4FB, + 12491: 0xD4FD, + 12492: 0xD504, + 12493: 0xD508, + 12494: 0xD50C, + 12495: 0xD514, + 12496: 0xD515, + 12497: 0xD517, + 12498: 0xD53C, + 12499: 0xD53D, + 12500: 0xD540, + 12501: 0xD544, + 12502: 0xD54C, + 12503: 0xD54D, + 12504: 0xD54F, + 12505: 0xD551, + 12506: 0xD558, + 12507: 0xD559, + 12508: 0xD55C, + 12509: 0xD560, + 12510: 0xD565, + 12511: 0xD568, + 12512: 0xD569, + 12513: 0xD56B, + 12514: 0xD56D, + 12515: 0xD574, + 12516: 0xD575, + 12517: 0xD578, + 12518: 0xD57C, + 12519: 0xD584, + 12520: 0xD585, + 12521: 0xD587, + 12522: 0xD588, + 12523: 0xD589, + 12524: 0xD590, + 12525: 0xD5A5, + 12526: 0xD5C8, + 12527: 0xD5C9, + 12528: 0xD5CC, + 12529: 0xD5D0, + 12530: 0xD5D2, + 12531: 0xD5D8, + 12532: 0xD5D9, + 12533: 0xD5DB, + 12534: 0xD5DD, + 12535: 0xD5E4, + 12536: 0xD5E5, + 12537: 0xD5E8, + 12538: 0xD5EC, + 12539: 0xD5F4, + 12540: 0xD5F5, + 12541: 0xD5F7, + 12542: 0xD5F9, + 12543: 0xD600, + 12544: 0xD601, + 12545: 0xD604, + 12546: 0xD608, + 12547: 0xD610, + 12548: 0xD611, + 12549: 0xD613, + 12550: 0xD614, + 12551: 0xD615, + 12552: 0xD61C, + 12553: 0xD620, + 12554: 0xD624, + 12555: 0xD62D, + 12556: 0xD638, + 12557: 0xD639, + 12558: 0xD63C, + 12559: 0xD640, + 12560: 0xD645, + 12561: 0xD648, + 12562: 0xD649, + 12563: 0xD64B, + 12564: 0xD64D, + 12565: 0xD651, + 12566: 0xD654, + 12567: 0xD655, + 12568: 0xD658, + 12569: 0xD65C, + 12570: 0xD667, + 12571: 0xD669, + 12572: 0xD670, + 12573: 0xD671, + 12574: 0xD674, + 12575: 0xD683, + 12576: 0xD685, + 12577: 0xD68C, + 12578: 0xD68D, + 12579: 0xD690, + 12580: 0xD694, + 12581: 0xD69D, + 12582: 0xD69F, + 12583: 0xD6A1, + 12584: 0xD6A8, + 12585: 0xD6AC, + 12586: 0xD6B0, + 12587: 0xD6B9, + 12588: 0xD6BB, + 12589: 0xD6C4, + 12590: 0xD6C5, + 12591: 0xD6C8, + 12592: 0xD6CC, + 12593: 0xD6D1, + 12594: 0xD6D4, + 12595: 0xD6D7, + 12596: 0xD6D9, + 12597: 0xD6E0, + 12598: 0xD6E4, + 12599: 0xD6E8, + 12600: 0xD6F0, + 12601: 0xD6F5, + 12602: 0xD6FC, + 12603: 0xD6FD, + 12604: 0xD700, + 12605: 0xD704, + 12606: 0xD711, + 12607: 0xD718, + 12608: 0xD719, + 12609: 0xD71C, + 12610: 0xD720, + 12611: 0xD728, + 12612: 0xD729, + 12613: 0xD72B, + 12614: 0xD72D, + 12615: 0xD734, + 12616: 0xD735, + 12617: 0xD738, + 12618: 0xD73C, + 12619: 0xD744, + 12620: 0xD747, + 12621: 0xD749, + 12622: 0xD750, + 12623: 0xD751, + 12624: 0xD754, + 12625: 0xD756, + 12626: 0xD757, + 12627: 0xD758, + 12628: 0xD759, + 12629: 0xD760, + 12630: 0xD761, + 12631: 0xD763, + 12632: 0xD765, + 12633: 0xD769, + 12634: 0xD76C, + 12635: 0xD770, + 12636: 0xD774, + 12637: 0xD77C, + 12638: 0xD77D, + 12639: 0xD781, + 12640: 0xD788, + 12641: 0xD789, + 12642: 0xD78C, + 12643: 0xD790, + 12644: 0xD798, + 12645: 0xD799, + 12646: 0xD79B, + 12647: 0xD79D, + 12742: 0x4F3D, + 12743: 0x4F73, + 12744: 0x5047, + 12745: 0x50F9, + 12746: 0x52A0, + 12747: 0x53EF, + 12748: 0x5475, + 12749: 0x54E5, + 12750: 0x5609, + 12751: 0x5AC1, + 12752: 0x5BB6, + 12753: 0x6687, + 12754: 0x67B6, + 12755: 0x67B7, + 12756: 0x67EF, + 12757: 0x6B4C, + 12758: 0x73C2, + 12759: 0x75C2, + 12760: 0x7A3C, + 12761: 0x82DB, + 12762: 0x8304, + 12763: 0x8857, + 12764: 0x8888, + 12765: 0x8A36, + 12766: 0x8CC8, + 12767: 0x8DCF, + 12768: 0x8EFB, + 12769: 0x8FE6, + 12770: 0x99D5, + 12771: 0x523B, + 12772: 0x5374, + 12773: 0x5404, + 12774: 0x606A, + 12775: 0x6164, + 12776: 0x6BBC, + 12777: 0x73CF, + 12778: 0x811A, + 12779: 0x89BA, + 12780: 0x89D2, + 12781: 0x95A3, + 12782: 0x4F83, + 12783: 0x520A, + 12784: 0x58BE, + 12785: 0x5978, + 12786: 0x59E6, + 12787: 0x5E72, + 12788: 0x5E79, + 12789: 0x61C7, + 12790: 0x63C0, + 12791: 0x6746, + 12792: 0x67EC, + 12793: 0x687F, + 12794: 0x6F97, + 12795: 0x764E, + 12796: 0x770B, + 12797: 0x78F5, + 12798: 0x7A08, + 12799: 0x7AFF, + 12800: 0x7C21, + 12801: 0x809D, + 12802: 0x826E, + 12803: 0x8271, + 12804: 0x8AEB, + 12805: 0x9593, + 12806: 0x4E6B, + 12807: 0x559D, + 12808: 0x66F7, + 12809: 0x6E34, + 12810: 0x78A3, + 12811: 0x7AED, + 12812: 0x845B, + 12813: 0x8910, + 12814: 0x874E, + 12815: 0x97A8, + 12816: 0x52D8, + 12817: 0x574E, + 12818: 0x582A, + 12819: 0x5D4C, + 12820: 0x611F, + 12821: 0x61BE, + 12822: 0x6221, + 12823: 0x6562, + 12824: 0x67D1, + 12825: 0x6A44, + 12826: 0x6E1B, + 12827: 0x7518, + 12828: 0x75B3, + 12829: 0x76E3, + 12830: 0x77B0, + 12831: 0x7D3A, + 12832: 0x90AF, + 12833: 0x9451, + 12834: 0x9452, + 12835: 0x9F95, + 12836: 0x5323, + 12837: 0x5CAC, + 12838: 0x7532, + 12839: 0x80DB, + 12840: 0x9240, + 12841: 0x9598, + 12842: 0x525B, + 12843: 0x5808, + 12844: 0x59DC, + 12845: 0x5CA1, + 12846: 0x5D17, + 12847: 0x5EB7, + 12848: 0x5F3A, + 12849: 0x5F4A, + 12850: 0x6177, + 12851: 0x6C5F, + 12852: 0x757A, + 12853: 0x7586, + 12854: 0x7CE0, + 12855: 0x7D73, + 12856: 0x7DB1, + 12857: 0x7F8C, + 12858: 0x8154, + 12859: 0x8221, + 12860: 0x8591, + 12861: 0x8941, + 12862: 0x8B1B, + 12863: 0x92FC, + 12864: 0x964D, + 12865: 0x9C47, + 12866: 0x4ECB, + 12867: 0x4EF7, + 12868: 0x500B, + 12869: 0x51F1, + 12870: 0x584F, + 12871: 0x6137, + 12872: 0x613E, + 12873: 0x6168, + 12874: 0x6539, + 12875: 0x69EA, + 12876: 0x6F11, + 12877: 0x75A5, + 12878: 0x7686, + 12879: 0x76D6, + 12880: 0x7B87, + 12881: 0x82A5, + 12882: 0x84CB, + 12883: 0xF900, + 12884: 0x93A7, + 12885: 0x958B, + 12886: 0x5580, + 12887: 0x5BA2, + 12888: 0x5751, + 12889: 0xF901, + 12890: 0x7CB3, + 12891: 0x7FB9, + 12892: 0x91B5, + 12893: 0x5028, + 12894: 0x53BB, + 12895: 0x5C45, + 12896: 0x5DE8, + 12897: 0x62D2, + 12898: 0x636E, + 12899: 0x64DA, + 12900: 0x64E7, + 12901: 0x6E20, + 12902: 0x70AC, + 12903: 0x795B, + 12904: 0x8DDD, + 12905: 0x8E1E, + 12906: 0xF902, + 12907: 0x907D, + 12908: 0x9245, + 12909: 0x92F8, + 12910: 0x4E7E, + 12911: 0x4EF6, + 12912: 0x5065, + 12913: 0x5DFE, + 12914: 0x5EFA, + 12915: 0x6106, + 12916: 0x6957, + 12917: 0x8171, + 12918: 0x8654, + 12919: 0x8E47, + 12920: 0x9375, + 12921: 0x9A2B, + 12922: 0x4E5E, + 12923: 0x5091, + 12924: 0x6770, + 12925: 0x6840, + 12926: 0x5109, + 12927: 0x528D, + 12928: 0x5292, + 12929: 0x6AA2, + 12930: 0x77BC, + 12931: 0x9210, + 12932: 0x9ED4, + 12933: 0x52AB, + 12934: 0x602F, + 12935: 0x8FF2, + 12936: 0x5048, + 12937: 0x61A9, + 12938: 0x63ED, + 12939: 0x64CA, + 12940: 0x683C, + 12941: 0x6A84, + 12942: 0x6FC0, + 12943: 0x8188, + 12944: 0x89A1, + 12945: 0x9694, + 12946: 0x5805, + 12947: 0x727D, + 12948: 0x72AC, + 12949: 0x7504, + 12950: 0x7D79, + 12951: 0x7E6D, + 12952: 0x80A9, + 12953: 0x898B, + 12954: 0x8B74, + 12955: 0x9063, + 12956: 0x9D51, + 12957: 0x6289, + 12958: 0x6C7A, + 12959: 0x6F54, + 12960: 0x7D50, + 12961: 0x7F3A, + 12962: 0x8A23, + 12963: 0x517C, + 12964: 0x614A, + 12965: 0x7B9D, + 12966: 0x8B19, + 12967: 0x9257, + 12968: 0x938C, + 12969: 0x4EAC, + 12970: 0x4FD3, + 12971: 0x501E, + 12972: 0x50BE, + 12973: 0x5106, + 12974: 0x52C1, + 12975: 0x52CD, + 12976: 0x537F, + 12977: 0x5770, + 12978: 0x5883, + 12979: 0x5E9A, + 12980: 0x5F91, + 12981: 0x6176, + 12982: 0x61AC, + 12983: 0x64CE, + 12984: 0x656C, + 12985: 0x666F, + 12986: 0x66BB, + 12987: 0x66F4, + 12988: 0x6897, + 12989: 0x6D87, + 12990: 0x7085, + 12991: 0x70F1, + 12992: 0x749F, + 12993: 0x74A5, + 12994: 0x74CA, + 12995: 0x75D9, + 12996: 0x786C, + 12997: 0x78EC, + 12998: 0x7ADF, + 12999: 0x7AF6, + 13000: 0x7D45, + 13001: 0x7D93, + 13002: 0x8015, + 13003: 0x803F, + 13004: 0x811B, + 13005: 0x8396, + 13006: 0x8B66, + 13007: 0x8F15, + 13008: 0x9015, + 13009: 0x93E1, + 13010: 0x9803, + 13011: 0x9838, + 13012: 0x9A5A, + 13013: 0x9BE8, + 13014: 0x4FC2, + 13015: 0x5553, + 13016: 0x583A, + 13017: 0x5951, + 13018: 0x5B63, + 13019: 0x5C46, + 13020: 0x60B8, + 13021: 0x6212, + 13022: 0x6842, + 13023: 0x68B0, + 13024: 0x68E8, + 13025: 0x6EAA, + 13026: 0x754C, + 13027: 0x7678, + 13028: 0x78CE, + 13029: 0x7A3D, + 13030: 0x7CFB, + 13031: 0x7E6B, + 13032: 0x7E7C, + 13033: 0x8A08, + 13034: 0x8AA1, + 13035: 0x8C3F, + 13036: 0x968E, + 13037: 0x9DC4, + 13038: 0x53E4, + 13039: 0x53E9, + 13040: 0x544A, + 13041: 0x5471, + 13042: 0x56FA, + 13043: 0x59D1, + 13044: 0x5B64, + 13045: 0x5C3B, + 13046: 0x5EAB, + 13047: 0x62F7, + 13048: 0x6537, + 13049: 0x6545, + 13050: 0x6572, + 13051: 0x66A0, + 13052: 0x67AF, + 13053: 0x69C1, + 13054: 0x6CBD, + 13055: 0x75FC, + 13056: 0x7690, + 13057: 0x777E, + 13058: 0x7A3F, + 13059: 0x7F94, + 13060: 0x8003, + 13061: 0x80A1, + 13062: 0x818F, + 13063: 0x82E6, + 13064: 0x82FD, + 13065: 0x83F0, + 13066: 0x85C1, + 13067: 0x8831, + 13068: 0x88B4, + 13069: 0x8AA5, + 13070: 0xF903, + 13071: 0x8F9C, + 13072: 0x932E, + 13073: 0x96C7, + 13074: 0x9867, + 13075: 0x9AD8, + 13076: 0x9F13, + 13077: 0x54ED, + 13078: 0x659B, + 13079: 0x66F2, + 13080: 0x688F, + 13081: 0x7A40, + 13082: 0x8C37, + 13083: 0x9D60, + 13084: 0x56F0, + 13085: 0x5764, + 13086: 0x5D11, + 13087: 0x6606, + 13088: 0x68B1, + 13089: 0x68CD, + 13090: 0x6EFE, + 13091: 0x7428, + 13092: 0x889E, + 13093: 0x9BE4, + 13094: 0x6C68, + 13095: 0xF904, + 13096: 0x9AA8, + 13097: 0x4F9B, + 13098: 0x516C, + 13099: 0x5171, + 13100: 0x529F, + 13101: 0x5B54, + 13102: 0x5DE5, + 13103: 0x6050, + 13104: 0x606D, + 13105: 0x62F1, + 13106: 0x63A7, + 13107: 0x653B, + 13108: 0x73D9, + 13109: 0x7A7A, + 13110: 0x86A3, + 13111: 0x8CA2, + 13112: 0x978F, + 13113: 0x4E32, + 13114: 0x5BE1, + 13115: 0x6208, + 13116: 0x679C, + 13117: 0x74DC, + 13118: 0x79D1, + 13119: 0x83D3, + 13120: 0x8A87, + 13121: 0x8AB2, + 13122: 0x8DE8, + 13123: 0x904E, + 13124: 0x934B, + 13125: 0x9846, + 13126: 0x5ED3, + 13127: 0x69E8, + 13128: 0x85FF, + 13129: 0x90ED, + 13130: 0xF905, + 13131: 0x51A0, + 13132: 0x5B98, + 13133: 0x5BEC, + 13134: 0x6163, + 13135: 0x68FA, + 13136: 0x6B3E, + 13137: 0x704C, + 13138: 0x742F, + 13139: 0x74D8, + 13140: 0x7BA1, + 13141: 0x7F50, + 13142: 0x83C5, + 13143: 0x89C0, + 13144: 0x8CAB, + 13145: 0x95DC, + 13146: 0x9928, + 13147: 0x522E, + 13148: 0x605D, + 13149: 0x62EC, + 13150: 0x9002, + 13151: 0x4F8A, + 13152: 0x5149, + 13153: 0x5321, + 13154: 0x58D9, + 13155: 0x5EE3, + 13156: 0x66E0, + 13157: 0x6D38, + 13158: 0x709A, + 13159: 0x72C2, + 13160: 0x73D6, + 13161: 0x7B50, + 13162: 0x80F1, + 13163: 0x945B, + 13164: 0x5366, + 13165: 0x639B, + 13166: 0x7F6B, + 13167: 0x4E56, + 13168: 0x5080, + 13169: 0x584A, + 13170: 0x58DE, + 13171: 0x602A, + 13172: 0x6127, + 13173: 0x62D0, + 13174: 0x69D0, + 13175: 0x9B41, + 13176: 0x5B8F, + 13177: 0x7D18, + 13178: 0x80B1, + 13179: 0x8F5F, + 13180: 0x4EA4, + 13181: 0x50D1, + 13182: 0x54AC, + 13183: 0x55AC, + 13184: 0x5B0C, + 13185: 0x5DA0, + 13186: 0x5DE7, + 13187: 0x652A, + 13188: 0x654E, + 13189: 0x6821, + 13190: 0x6A4B, + 13191: 0x72E1, + 13192: 0x768E, + 13193: 0x77EF, + 13194: 0x7D5E, + 13195: 0x7FF9, + 13196: 0x81A0, + 13197: 0x854E, + 13198: 0x86DF, + 13199: 0x8F03, + 13200: 0x8F4E, + 13201: 0x90CA, + 13202: 0x9903, + 13203: 0x9A55, + 13204: 0x9BAB, + 13205: 0x4E18, + 13206: 0x4E45, + 13207: 0x4E5D, + 13208: 0x4EC7, + 13209: 0x4FF1, + 13210: 0x5177, + 13211: 0x52FE, + 13212: 0x5340, + 13213: 0x53E3, + 13214: 0x53E5, + 13215: 0x548E, + 13216: 0x5614, + 13217: 0x5775, + 13218: 0x57A2, + 13219: 0x5BC7, + 13220: 0x5D87, + 13221: 0x5ED0, + 13222: 0x61FC, + 13223: 0x62D8, + 13224: 0x6551, + 13225: 0x67B8, + 13226: 0x67E9, + 13227: 0x69CB, + 13228: 0x6B50, + 13229: 0x6BC6, + 13230: 0x6BEC, + 13231: 0x6C42, + 13232: 0x6E9D, + 13233: 0x7078, + 13234: 0x72D7, + 13235: 0x7396, + 13236: 0x7403, + 13237: 0x77BF, + 13238: 0x77E9, + 13239: 0x7A76, + 13240: 0x7D7F, + 13241: 0x8009, + 13242: 0x81FC, + 13243: 0x8205, + 13244: 0x820A, + 13245: 0x82DF, + 13246: 0x8862, + 13247: 0x8B33, + 13248: 0x8CFC, + 13249: 0x8EC0, + 13250: 0x9011, + 13251: 0x90B1, + 13252: 0x9264, + 13253: 0x92B6, + 13254: 0x99D2, + 13255: 0x9A45, + 13256: 0x9CE9, + 13257: 0x9DD7, + 13258: 0x9F9C, + 13259: 0x570B, + 13260: 0x5C40, + 13261: 0x83CA, + 13262: 0x97A0, + 13263: 0x97AB, + 13264: 0x9EB4, + 13265: 0x541B, + 13266: 0x7A98, + 13267: 0x7FA4, + 13268: 0x88D9, + 13269: 0x8ECD, + 13270: 0x90E1, + 13271: 0x5800, + 13272: 0x5C48, + 13273: 0x6398, + 13274: 0x7A9F, + 13275: 0x5BAE, + 13276: 0x5F13, + 13277: 0x7A79, + 13278: 0x7AAE, + 13279: 0x828E, + 13280: 0x8EAC, + 13281: 0x5026, + 13282: 0x5238, + 13283: 0x52F8, + 13284: 0x5377, + 13285: 0x5708, + 13286: 0x62F3, + 13287: 0x6372, + 13288: 0x6B0A, + 13289: 0x6DC3, + 13290: 0x7737, + 13291: 0x53A5, + 13292: 0x7357, + 13293: 0x8568, + 13294: 0x8E76, + 13295: 0x95D5, + 13296: 0x673A, + 13297: 0x6AC3, + 13298: 0x6F70, + 13299: 0x8A6D, + 13300: 0x8ECC, + 13301: 0x994B, + 13302: 0xF906, + 13303: 0x6677, + 13304: 0x6B78, + 13305: 0x8CB4, + 13306: 0x9B3C, + 13307: 0xF907, + 13308: 0x53EB, + 13309: 0x572D, + 13310: 0x594E, + 13311: 0x63C6, + 13312: 0x69FB, + 13313: 0x73EA, + 13314: 0x7845, + 13315: 0x7ABA, + 13316: 0x7AC5, + 13317: 0x7CFE, + 13318: 0x8475, + 13319: 0x898F, + 13320: 0x8D73, + 13321: 0x9035, + 13322: 0x95A8, + 13323: 0x52FB, + 13324: 0x5747, + 13325: 0x7547, + 13326: 0x7B60, + 13327: 0x83CC, + 13328: 0x921E, + 13329: 0xF908, + 13330: 0x6A58, + 13331: 0x514B, + 13332: 0x524B, + 13333: 0x5287, + 13334: 0x621F, + 13335: 0x68D8, + 13336: 0x6975, + 13337: 0x9699, + 13338: 0x50C5, + 13339: 0x52A4, + 13340: 0x52E4, + 13341: 0x61C3, + 13342: 0x65A4, + 13343: 0x6839, + 13344: 0x69FF, + 13345: 0x747E, + 13346: 0x7B4B, + 13347: 0x82B9, + 13348: 0x83EB, + 13349: 0x89B2, + 13350: 0x8B39, + 13351: 0x8FD1, + 13352: 0x9949, + 13353: 0xF909, + 13354: 0x4ECA, + 13355: 0x5997, + 13356: 0x64D2, + 13357: 0x6611, + 13358: 0x6A8E, + 13359: 0x7434, + 13360: 0x7981, + 13361: 0x79BD, + 13362: 0x82A9, + 13363: 0x887E, + 13364: 0x887F, + 13365: 0x895F, + 13366: 0xF90A, + 13367: 0x9326, + 13368: 0x4F0B, + 13369: 0x53CA, + 13370: 0x6025, + 13371: 0x6271, + 13372: 0x6C72, + 13373: 0x7D1A, + 13374: 0x7D66, + 13375: 0x4E98, + 13376: 0x5162, + 13377: 0x77DC, + 13378: 0x80AF, + 13379: 0x4F01, + 13380: 0x4F0E, + 13381: 0x5176, + 13382: 0x5180, + 13383: 0x55DC, + 13384: 0x5668, + 13385: 0x573B, + 13386: 0x57FA, + 13387: 0x57FC, + 13388: 0x5914, + 13389: 0x5947, + 13390: 0x5993, + 13391: 0x5BC4, + 13392: 0x5C90, + 13393: 0x5D0E, + 13394: 0x5DF1, + 13395: 0x5E7E, + 13396: 0x5FCC, + 13397: 0x6280, + 13398: 0x65D7, + 13399: 0x65E3, + 13400: 0x671E, + 13401: 0x671F, + 13402: 0x675E, + 13403: 0x68CB, + 13404: 0x68C4, + 13405: 0x6A5F, + 13406: 0x6B3A, + 13407: 0x6C23, + 13408: 0x6C7D, + 13409: 0x6C82, + 13410: 0x6DC7, + 13411: 0x7398, + 13412: 0x7426, + 13413: 0x742A, + 13414: 0x7482, + 13415: 0x74A3, + 13416: 0x7578, + 13417: 0x757F, + 13418: 0x7881, + 13419: 0x78EF, + 13420: 0x7941, + 13421: 0x7947, + 13422: 0x7948, + 13423: 0x797A, + 13424: 0x7B95, + 13425: 0x7D00, + 13426: 0x7DBA, + 13427: 0x7F88, + 13428: 0x8006, + 13429: 0x802D, + 13430: 0x808C, + 13431: 0x8A18, + 13432: 0x8B4F, + 13433: 0x8C48, + 13434: 0x8D77, + 13435: 0x9321, + 13436: 0x9324, + 13437: 0x98E2, + 13438: 0x9951, + 13439: 0x9A0E, + 13440: 0x9A0F, + 13441: 0x9A65, + 13442: 0x9E92, + 13443: 0x7DCA, + 13444: 0x4F76, + 13445: 0x5409, + 13446: 0x62EE, + 13447: 0x6854, + 13448: 0x91D1, + 13449: 0x55AB, + 13450: 0x513A, + 13451: 0xF90B, + 13452: 0xF90C, + 13453: 0x5A1C, + 13454: 0x61E6, + 13455: 0xF90D, + 13456: 0x62CF, + 13457: 0x62FF, + 13458: 0xF90E, + 13459: 0xF90F, + 13460: 0xF910, + 13461: 0xF911, + 13462: 0xF912, + 13463: 0xF913, + 13464: 0x90A3, + 13465: 0xF914, + 13466: 0xF915, + 13467: 0xF916, + 13468: 0xF917, + 13469: 0xF918, + 13470: 0x8AFE, + 13471: 0xF919, + 13472: 0xF91A, + 13473: 0xF91B, + 13474: 0xF91C, + 13475: 0x6696, + 13476: 0xF91D, + 13477: 0x7156, + 13478: 0xF91E, + 13479: 0xF91F, + 13480: 0x96E3, + 13481: 0xF920, + 13482: 0x634F, + 13483: 0x637A, + 13484: 0x5357, + 13485: 0xF921, + 13486: 0x678F, + 13487: 0x6960, + 13488: 0x6E73, + 13489: 0xF922, + 13490: 0x7537, + 13491: 0xF923, + 13492: 0xF924, + 13493: 0xF925, + 13494: 0x7D0D, + 13495: 0xF926, + 13496: 0xF927, + 13497: 0x8872, + 13498: 0x56CA, + 13499: 0x5A18, + 13500: 0xF928, + 13501: 0xF929, + 13502: 0xF92A, + 13503: 0xF92B, + 13504: 0xF92C, + 13505: 0x4E43, + 13506: 0xF92D, + 13507: 0x5167, + 13508: 0x5948, + 13509: 0x67F0, + 13510: 0x8010, + 13511: 0xF92E, + 13512: 0x5973, + 13513: 0x5E74, + 13514: 0x649A, + 13515: 0x79CA, + 13516: 0x5FF5, + 13517: 0x606C, + 13518: 0x62C8, + 13519: 0x637B, + 13520: 0x5BE7, + 13521: 0x5BD7, + 13522: 0x52AA, + 13523: 0xF92F, + 13524: 0x5974, + 13525: 0x5F29, + 13526: 0x6012, + 13527: 0xF930, + 13528: 0xF931, + 13529: 0xF932, + 13530: 0x7459, + 13531: 0xF933, + 13532: 0xF934, + 13533: 0xF935, + 13534: 0xF936, + 13535: 0xF937, + 13536: 0xF938, + 13537: 0x99D1, + 13538: 0xF939, + 13539: 0xF93A, + 13540: 0xF93B, + 13541: 0xF93C, + 13542: 0xF93D, + 13543: 0xF93E, + 13544: 0xF93F, + 13545: 0xF940, + 13546: 0xF941, + 13547: 0xF942, + 13548: 0xF943, + 13549: 0x6FC3, + 13550: 0xF944, + 13551: 0xF945, + 13552: 0x81BF, + 13553: 0x8FB2, + 13554: 0x60F1, + 13555: 0xF946, + 13556: 0xF947, + 13557: 0x8166, + 13558: 0xF948, + 13559: 0xF949, + 13560: 0x5C3F, + 13561: 0xF94A, + 13562: 0xF94B, + 13563: 0xF94C, + 13564: 0xF94D, + 13565: 0xF94E, + 13566: 0xF94F, + 13567: 0xF950, + 13568: 0xF951, + 13569: 0x5AE9, + 13570: 0x8A25, + 13571: 0x677B, + 13572: 0x7D10, + 13573: 0xF952, + 13574: 0xF953, + 13575: 0xF954, + 13576: 0xF955, + 13577: 0xF956, + 13578: 0xF957, + 13579: 0x80FD, + 13580: 0xF958, + 13581: 0xF959, + 13582: 0x5C3C, + 13583: 0x6CE5, + 13584: 0x533F, + 13585: 0x6EBA, + 13586: 0x591A, + 13587: 0x8336, + 13588: 0x4E39, + 13589: 0x4EB6, + 13590: 0x4F46, + 13591: 0x55AE, + 13592: 0x5718, + 13593: 0x58C7, + 13594: 0x5F56, + 13595: 0x65B7, + 13596: 0x65E6, + 13597: 0x6A80, + 13598: 0x6BB5, + 13599: 0x6E4D, + 13600: 0x77ED, + 13601: 0x7AEF, + 13602: 0x7C1E, + 13603: 0x7DDE, + 13604: 0x86CB, + 13605: 0x8892, + 13606: 0x9132, + 13607: 0x935B, + 13608: 0x64BB, + 13609: 0x6FBE, + 13610: 0x737A, + 13611: 0x75B8, + 13612: 0x9054, + 13613: 0x5556, + 13614: 0x574D, + 13615: 0x61BA, + 13616: 0x64D4, + 13617: 0x66C7, + 13618: 0x6DE1, + 13619: 0x6E5B, + 13620: 0x6F6D, + 13621: 0x6FB9, + 13622: 0x75F0, + 13623: 0x8043, + 13624: 0x81BD, + 13625: 0x8541, + 13626: 0x8983, + 13627: 0x8AC7, + 13628: 0x8B5A, + 13629: 0x931F, + 13630: 0x6C93, + 13631: 0x7553, + 13632: 0x7B54, + 13633: 0x8E0F, + 13634: 0x905D, + 13635: 0x5510, + 13636: 0x5802, + 13637: 0x5858, + 13638: 0x5E62, + 13639: 0x6207, + 13640: 0x649E, + 13641: 0x68E0, + 13642: 0x7576, + 13643: 0x7CD6, + 13644: 0x87B3, + 13645: 0x9EE8, + 13646: 0x4EE3, + 13647: 0x5788, + 13648: 0x576E, + 13649: 0x5927, + 13650: 0x5C0D, + 13651: 0x5CB1, + 13652: 0x5E36, + 13653: 0x5F85, + 13654: 0x6234, + 13655: 0x64E1, + 13656: 0x73B3, + 13657: 0x81FA, + 13658: 0x888B, + 13659: 0x8CB8, + 13660: 0x968A, + 13661: 0x9EDB, + 13662: 0x5B85, + 13663: 0x5FB7, + 13664: 0x60B3, + 13665: 0x5012, + 13666: 0x5200, + 13667: 0x5230, + 13668: 0x5716, + 13669: 0x5835, + 13670: 0x5857, + 13671: 0x5C0E, + 13672: 0x5C60, + 13673: 0x5CF6, + 13674: 0x5D8B, + 13675: 0x5EA6, + 13676: 0x5F92, + 13677: 0x60BC, + 13678: 0x6311, + 13679: 0x6389, + 13680: 0x6417, + 13681: 0x6843, + 13682: 0x68F9, + 13683: 0x6AC2, + 13684: 0x6DD8, + 13685: 0x6E21, + 13686: 0x6ED4, + 13687: 0x6FE4, + 13688: 0x71FE, + 13689: 0x76DC, + 13690: 0x7779, + 13691: 0x79B1, + 13692: 0x7A3B, + 13693: 0x8404, + 13694: 0x89A9, + 13695: 0x8CED, + 13696: 0x8DF3, + 13697: 0x8E48, + 13698: 0x9003, + 13699: 0x9014, + 13700: 0x9053, + 13701: 0x90FD, + 13702: 0x934D, + 13703: 0x9676, + 13704: 0x97DC, + 13705: 0x6BD2, + 13706: 0x7006, + 13707: 0x7258, + 13708: 0x72A2, + 13709: 0x7368, + 13710: 0x7763, + 13711: 0x79BF, + 13712: 0x7BE4, + 13713: 0x7E9B, + 13714: 0x8B80, + 13715: 0x58A9, + 13716: 0x60C7, + 13717: 0x6566, + 13718: 0x65FD, + 13719: 0x66BE, + 13720: 0x6C8C, + 13721: 0x711E, + 13722: 0x71C9, + 13723: 0x8C5A, + 13724: 0x9813, + 13725: 0x4E6D, + 13726: 0x7A81, + 13727: 0x4EDD, + 13728: 0x51AC, + 13729: 0x51CD, + 13730: 0x52D5, + 13731: 0x540C, + 13732: 0x61A7, + 13733: 0x6771, + 13734: 0x6850, + 13735: 0x68DF, + 13736: 0x6D1E, + 13737: 0x6F7C, + 13738: 0x75BC, + 13739: 0x77B3, + 13740: 0x7AE5, + 13741: 0x80F4, + 13742: 0x8463, + 13743: 0x9285, + 13744: 0x515C, + 13745: 0x6597, + 13746: 0x675C, + 13747: 0x6793, + 13748: 0x75D8, + 13749: 0x7AC7, + 13750: 0x8373, + 13751: 0xF95A, + 13752: 0x8C46, + 13753: 0x9017, + 13754: 0x982D, + 13755: 0x5C6F, + 13756: 0x81C0, + 13757: 0x829A, + 13758: 0x9041, + 13759: 0x906F, + 13760: 0x920D, + 13761: 0x5F97, + 13762: 0x5D9D, + 13763: 0x6A59, + 13764: 0x71C8, + 13765: 0x767B, + 13766: 0x7B49, + 13767: 0x85E4, + 13768: 0x8B04, + 13769: 0x9127, + 13770: 0x9A30, + 13771: 0x5587, + 13772: 0x61F6, + 13773: 0xF95B, + 13774: 0x7669, + 13775: 0x7F85, + 13776: 0x863F, + 13777: 0x87BA, + 13778: 0x88F8, + 13779: 0x908F, + 13780: 0xF95C, + 13781: 0x6D1B, + 13782: 0x70D9, + 13783: 0x73DE, + 13784: 0x7D61, + 13785: 0x843D, + 13786: 0xF95D, + 13787: 0x916A, + 13788: 0x99F1, + 13789: 0xF95E, + 13790: 0x4E82, + 13791: 0x5375, + 13792: 0x6B04, + 13793: 0x6B12, + 13794: 0x703E, + 13795: 0x721B, + 13796: 0x862D, + 13797: 0x9E1E, + 13798: 0x524C, + 13799: 0x8FA3, + 13800: 0x5D50, + 13801: 0x64E5, + 13802: 0x652C, + 13803: 0x6B16, + 13804: 0x6FEB, + 13805: 0x7C43, + 13806: 0x7E9C, + 13807: 0x85CD, + 13808: 0x8964, + 13809: 0x89BD, + 13810: 0x62C9, + 13811: 0x81D8, + 13812: 0x881F, + 13813: 0x5ECA, + 13814: 0x6717, + 13815: 0x6D6A, + 13816: 0x72FC, + 13817: 0x7405, + 13818: 0x746F, + 13819: 0x8782, + 13820: 0x90DE, + 13821: 0x4F86, + 13822: 0x5D0D, + 13823: 0x5FA0, + 13824: 0x840A, + 13825: 0x51B7, + 13826: 0x63A0, + 13827: 0x7565, + 13828: 0x4EAE, + 13829: 0x5006, + 13830: 0x5169, + 13831: 0x51C9, + 13832: 0x6881, + 13833: 0x6A11, + 13834: 0x7CAE, + 13835: 0x7CB1, + 13836: 0x7CE7, + 13837: 0x826F, + 13838: 0x8AD2, + 13839: 0x8F1B, + 13840: 0x91CF, + 13841: 0x4FB6, + 13842: 0x5137, + 13843: 0x52F5, + 13844: 0x5442, + 13845: 0x5EEC, + 13846: 0x616E, + 13847: 0x623E, + 13848: 0x65C5, + 13849: 0x6ADA, + 13850: 0x6FFE, + 13851: 0x792A, + 13852: 0x85DC, + 13853: 0x8823, + 13854: 0x95AD, + 13855: 0x9A62, + 13856: 0x9A6A, + 13857: 0x9E97, + 13858: 0x9ECE, + 13859: 0x529B, + 13860: 0x66C6, + 13861: 0x6B77, + 13862: 0x701D, + 13863: 0x792B, + 13864: 0x8F62, + 13865: 0x9742, + 13866: 0x6190, + 13867: 0x6200, + 13868: 0x6523, + 13869: 0x6F23, + 13870: 0x7149, + 13871: 0x7489, + 13872: 0x7DF4, + 13873: 0x806F, + 13874: 0x84EE, + 13875: 0x8F26, + 13876: 0x9023, + 13877: 0x934A, + 13878: 0x51BD, + 13879: 0x5217, + 13880: 0x52A3, + 13881: 0x6D0C, + 13882: 0x70C8, + 13883: 0x88C2, + 13884: 0x5EC9, + 13885: 0x6582, + 13886: 0x6BAE, + 13887: 0x6FC2, + 13888: 0x7C3E, + 13889: 0x7375, + 13890: 0x4EE4, + 13891: 0x4F36, + 13892: 0x56F9, + 13893: 0xF95F, + 13894: 0x5CBA, + 13895: 0x5DBA, + 13896: 0x601C, + 13897: 0x73B2, + 13898: 0x7B2D, + 13899: 0x7F9A, + 13900: 0x7FCE, + 13901: 0x8046, + 13902: 0x901E, + 13903: 0x9234, + 13904: 0x96F6, + 13905: 0x9748, + 13906: 0x9818, + 13907: 0x9F61, + 13908: 0x4F8B, + 13909: 0x6FA7, + 13910: 0x79AE, + 13911: 0x91B4, + 13912: 0x96B7, + 13913: 0x52DE, + 13914: 0xF960, + 13915: 0x6488, + 13916: 0x64C4, + 13917: 0x6AD3, + 13918: 0x6F5E, + 13919: 0x7018, + 13920: 0x7210, + 13921: 0x76E7, + 13922: 0x8001, + 13923: 0x8606, + 13924: 0x865C, + 13925: 0x8DEF, + 13926: 0x8F05, + 13927: 0x9732, + 13928: 0x9B6F, + 13929: 0x9DFA, + 13930: 0x9E75, + 13931: 0x788C, + 13932: 0x797F, + 13933: 0x7DA0, + 13934: 0x83C9, + 13935: 0x9304, + 13936: 0x9E7F, + 13937: 0x9E93, + 13938: 0x8AD6, + 13939: 0x58DF, + 13940: 0x5F04, + 13941: 0x6727, + 13942: 0x7027, + 13943: 0x74CF, + 13944: 0x7C60, + 13945: 0x807E, + 13946: 0x5121, + 13947: 0x7028, + 13948: 0x7262, + 13949: 0x78CA, + 13950: 0x8CC2, + 13951: 0x8CDA, + 13952: 0x8CF4, + 13953: 0x96F7, + 13954: 0x4E86, + 13955: 0x50DA, + 13956: 0x5BEE, + 13957: 0x5ED6, + 13958: 0x6599, + 13959: 0x71CE, + 13960: 0x7642, + 13961: 0x77AD, + 13962: 0x804A, + 13963: 0x84FC, + 13964: 0x907C, + 13965: 0x9B27, + 13966: 0x9F8D, + 13967: 0x58D8, + 13968: 0x5A41, + 13969: 0x5C62, + 13970: 0x6A13, + 13971: 0x6DDA, + 13972: 0x6F0F, + 13973: 0x763B, + 13974: 0x7D2F, + 13975: 0x7E37, + 13976: 0x851E, + 13977: 0x8938, + 13978: 0x93E4, + 13979: 0x964B, + 13980: 0x5289, + 13981: 0x65D2, + 13982: 0x67F3, + 13983: 0x69B4, + 13984: 0x6D41, + 13985: 0x6E9C, + 13986: 0x700F, + 13987: 0x7409, + 13988: 0x7460, + 13989: 0x7559, + 13990: 0x7624, + 13991: 0x786B, + 13992: 0x8B2C, + 13993: 0x985E, + 13994: 0x516D, + 13995: 0x622E, + 13996: 0x9678, + 13997: 0x4F96, + 13998: 0x502B, + 13999: 0x5D19, + 14000: 0x6DEA, + 14001: 0x7DB8, + 14002: 0x8F2A, + 14003: 0x5F8B, + 14004: 0x6144, + 14005: 0x6817, + 14006: 0xF961, + 14007: 0x9686, + 14008: 0x52D2, + 14009: 0x808B, + 14010: 0x51DC, + 14011: 0x51CC, + 14012: 0x695E, + 14013: 0x7A1C, + 14014: 0x7DBE, + 14015: 0x83F1, + 14016: 0x9675, + 14017: 0x4FDA, + 14018: 0x5229, + 14019: 0x5398, + 14020: 0x540F, + 14021: 0x550E, + 14022: 0x5C65, + 14023: 0x60A7, + 14024: 0x674E, + 14025: 0x68A8, + 14026: 0x6D6C, + 14027: 0x7281, + 14028: 0x72F8, + 14029: 0x7406, + 14030: 0x7483, + 14031: 0xF962, + 14032: 0x75E2, + 14033: 0x7C6C, + 14034: 0x7F79, + 14035: 0x7FB8, + 14036: 0x8389, + 14037: 0x88CF, + 14038: 0x88E1, + 14039: 0x91CC, + 14040: 0x91D0, + 14041: 0x96E2, + 14042: 0x9BC9, + 14043: 0x541D, + 14044: 0x6F7E, + 14045: 0x71D0, + 14046: 0x7498, + 14047: 0x85FA, + 14048: 0x8EAA, + 14049: 0x96A3, + 14050: 0x9C57, + 14051: 0x9E9F, + 14052: 0x6797, + 14053: 0x6DCB, + 14054: 0x7433, + 14055: 0x81E8, + 14056: 0x9716, + 14057: 0x782C, + 14058: 0x7ACB, + 14059: 0x7B20, + 14060: 0x7C92, + 14061: 0x6469, + 14062: 0x746A, + 14063: 0x75F2, + 14064: 0x78BC, + 14065: 0x78E8, + 14066: 0x99AC, + 14067: 0x9B54, + 14068: 0x9EBB, + 14069: 0x5BDE, + 14070: 0x5E55, + 14071: 0x6F20, + 14072: 0x819C, + 14073: 0x83AB, + 14074: 0x9088, + 14075: 0x4E07, + 14076: 0x534D, + 14077: 0x5A29, + 14078: 0x5DD2, + 14079: 0x5F4E, + 14080: 0x6162, + 14081: 0x633D, + 14082: 0x6669, + 14083: 0x66FC, + 14084: 0x6EFF, + 14085: 0x6F2B, + 14086: 0x7063, + 14087: 0x779E, + 14088: 0x842C, + 14089: 0x8513, + 14090: 0x883B, + 14091: 0x8F13, + 14092: 0x9945, + 14093: 0x9C3B, + 14094: 0x551C, + 14095: 0x62B9, + 14096: 0x672B, + 14097: 0x6CAB, + 14098: 0x8309, + 14099: 0x896A, + 14100: 0x977A, + 14101: 0x4EA1, + 14102: 0x5984, + 14103: 0x5FD8, + 14104: 0x5FD9, + 14105: 0x671B, + 14106: 0x7DB2, + 14107: 0x7F54, + 14108: 0x8292, + 14109: 0x832B, + 14110: 0x83BD, + 14111: 0x8F1E, + 14112: 0x9099, + 14113: 0x57CB, + 14114: 0x59B9, + 14115: 0x5A92, + 14116: 0x5BD0, + 14117: 0x6627, + 14118: 0x679A, + 14119: 0x6885, + 14120: 0x6BCF, + 14121: 0x7164, + 14122: 0x7F75, + 14123: 0x8CB7, + 14124: 0x8CE3, + 14125: 0x9081, + 14126: 0x9B45, + 14127: 0x8108, + 14128: 0x8C8A, + 14129: 0x964C, + 14130: 0x9A40, + 14131: 0x9EA5, + 14132: 0x5B5F, + 14133: 0x6C13, + 14134: 0x731B, + 14135: 0x76F2, + 14136: 0x76DF, + 14137: 0x840C, + 14138: 0x51AA, + 14139: 0x8993, + 14140: 0x514D, + 14141: 0x5195, + 14142: 0x52C9, + 14143: 0x68C9, + 14144: 0x6C94, + 14145: 0x7704, + 14146: 0x7720, + 14147: 0x7DBF, + 14148: 0x7DEC, + 14149: 0x9762, + 14150: 0x9EB5, + 14151: 0x6EC5, + 14152: 0x8511, + 14153: 0x51A5, + 14154: 0x540D, + 14155: 0x547D, + 14156: 0x660E, + 14157: 0x669D, + 14158: 0x6927, + 14159: 0x6E9F, + 14160: 0x76BF, + 14161: 0x7791, + 14162: 0x8317, + 14163: 0x84C2, + 14164: 0x879F, + 14165: 0x9169, + 14166: 0x9298, + 14167: 0x9CF4, + 14168: 0x8882, + 14169: 0x4FAE, + 14170: 0x5192, + 14171: 0x52DF, + 14172: 0x59C6, + 14173: 0x5E3D, + 14174: 0x6155, + 14175: 0x6478, + 14176: 0x6479, + 14177: 0x66AE, + 14178: 0x67D0, + 14179: 0x6A21, + 14180: 0x6BCD, + 14181: 0x6BDB, + 14182: 0x725F, + 14183: 0x7261, + 14184: 0x7441, + 14185: 0x7738, + 14186: 0x77DB, + 14187: 0x8017, + 14188: 0x82BC, + 14189: 0x8305, + 14190: 0x8B00, + 14191: 0x8B28, + 14192: 0x8C8C, + 14193: 0x6728, + 14194: 0x6C90, + 14195: 0x7267, + 14196: 0x76EE, + 14197: 0x7766, + 14198: 0x7A46, + 14199: 0x9DA9, + 14200: 0x6B7F, + 14201: 0x6C92, + 14202: 0x5922, + 14203: 0x6726, + 14204: 0x8499, + 14205: 0x536F, + 14206: 0x5893, + 14207: 0x5999, + 14208: 0x5EDF, + 14209: 0x63CF, + 14210: 0x6634, + 14211: 0x6773, + 14212: 0x6E3A, + 14213: 0x732B, + 14214: 0x7AD7, + 14215: 0x82D7, + 14216: 0x9328, + 14217: 0x52D9, + 14218: 0x5DEB, + 14219: 0x61AE, + 14220: 0x61CB, + 14221: 0x620A, + 14222: 0x62C7, + 14223: 0x64AB, + 14224: 0x65E0, + 14225: 0x6959, + 14226: 0x6B66, + 14227: 0x6BCB, + 14228: 0x7121, + 14229: 0x73F7, + 14230: 0x755D, + 14231: 0x7E46, + 14232: 0x821E, + 14233: 0x8302, + 14234: 0x856A, + 14235: 0x8AA3, + 14236: 0x8CBF, + 14237: 0x9727, + 14238: 0x9D61, + 14239: 0x58A8, + 14240: 0x9ED8, + 14241: 0x5011, + 14242: 0x520E, + 14243: 0x543B, + 14244: 0x554F, + 14245: 0x6587, + 14246: 0x6C76, + 14247: 0x7D0A, + 14248: 0x7D0B, + 14249: 0x805E, + 14250: 0x868A, + 14251: 0x9580, + 14252: 0x96EF, + 14253: 0x52FF, + 14254: 0x6C95, + 14255: 0x7269, + 14256: 0x5473, + 14257: 0x5A9A, + 14258: 0x5C3E, + 14259: 0x5D4B, + 14260: 0x5F4C, + 14261: 0x5FAE, + 14262: 0x672A, + 14263: 0x68B6, + 14264: 0x6963, + 14265: 0x6E3C, + 14266: 0x6E44, + 14267: 0x7709, + 14268: 0x7C73, + 14269: 0x7F8E, + 14270: 0x8587, + 14271: 0x8B0E, + 14272: 0x8FF7, + 14273: 0x9761, + 14274: 0x9EF4, + 14275: 0x5CB7, + 14276: 0x60B6, + 14277: 0x610D, + 14278: 0x61AB, + 14279: 0x654F, + 14280: 0x65FB, + 14281: 0x65FC, + 14282: 0x6C11, + 14283: 0x6CEF, + 14284: 0x739F, + 14285: 0x73C9, + 14286: 0x7DE1, + 14287: 0x9594, + 14288: 0x5BC6, + 14289: 0x871C, + 14290: 0x8B10, + 14291: 0x525D, + 14292: 0x535A, + 14293: 0x62CD, + 14294: 0x640F, + 14295: 0x64B2, + 14296: 0x6734, + 14297: 0x6A38, + 14298: 0x6CCA, + 14299: 0x73C0, + 14300: 0x749E, + 14301: 0x7B94, + 14302: 0x7C95, + 14303: 0x7E1B, + 14304: 0x818A, + 14305: 0x8236, + 14306: 0x8584, + 14307: 0x8FEB, + 14308: 0x96F9, + 14309: 0x99C1, + 14310: 0x4F34, + 14311: 0x534A, + 14312: 0x53CD, + 14313: 0x53DB, + 14314: 0x62CC, + 14315: 0x642C, + 14316: 0x6500, + 14317: 0x6591, + 14318: 0x69C3, + 14319: 0x6CEE, + 14320: 0x6F58, + 14321: 0x73ED, + 14322: 0x7554, + 14323: 0x7622, + 14324: 0x76E4, + 14325: 0x76FC, + 14326: 0x78D0, + 14327: 0x78FB, + 14328: 0x792C, + 14329: 0x7D46, + 14330: 0x822C, + 14331: 0x87E0, + 14332: 0x8FD4, + 14333: 0x9812, + 14334: 0x98EF, + 14335: 0x52C3, + 14336: 0x62D4, + 14337: 0x64A5, + 14338: 0x6E24, + 14339: 0x6F51, + 14340: 0x767C, + 14341: 0x8DCB, + 14342: 0x91B1, + 14343: 0x9262, + 14344: 0x9AEE, + 14345: 0x9B43, + 14346: 0x5023, + 14347: 0x508D, + 14348: 0x574A, + 14349: 0x59A8, + 14350: 0x5C28, + 14351: 0x5E47, + 14352: 0x5F77, + 14353: 0x623F, + 14354: 0x653E, + 14355: 0x65B9, + 14356: 0x65C1, + 14357: 0x6609, + 14358: 0x678B, + 14359: 0x699C, + 14360: 0x6EC2, + 14361: 0x78C5, + 14362: 0x7D21, + 14363: 0x80AA, + 14364: 0x8180, + 14365: 0x822B, + 14366: 0x82B3, + 14367: 0x84A1, + 14368: 0x868C, + 14369: 0x8A2A, + 14370: 0x8B17, + 14371: 0x90A6, + 14372: 0x9632, + 14373: 0x9F90, + 14374: 0x500D, + 14375: 0x4FF3, + 14376: 0xF963, + 14377: 0x57F9, + 14378: 0x5F98, + 14379: 0x62DC, + 14380: 0x6392, + 14381: 0x676F, + 14382: 0x6E43, + 14383: 0x7119, + 14384: 0x76C3, + 14385: 0x80CC, + 14386: 0x80DA, + 14387: 0x88F4, + 14388: 0x88F5, + 14389: 0x8919, + 14390: 0x8CE0, + 14391: 0x8F29, + 14392: 0x914D, + 14393: 0x966A, + 14394: 0x4F2F, + 14395: 0x4F70, + 14396: 0x5E1B, + 14397: 0x67CF, + 14398: 0x6822, + 14399: 0x767D, + 14400: 0x767E, + 14401: 0x9B44, + 14402: 0x5E61, + 14403: 0x6A0A, + 14404: 0x7169, + 14405: 0x71D4, + 14406: 0x756A, + 14407: 0xF964, + 14408: 0x7E41, + 14409: 0x8543, + 14410: 0x85E9, + 14411: 0x98DC, + 14412: 0x4F10, + 14413: 0x7B4F, + 14414: 0x7F70, + 14415: 0x95A5, + 14416: 0x51E1, + 14417: 0x5E06, + 14418: 0x68B5, + 14419: 0x6C3E, + 14420: 0x6C4E, + 14421: 0x6CDB, + 14422: 0x72AF, + 14423: 0x7BC4, + 14424: 0x8303, + 14425: 0x6CD5, + 14426: 0x743A, + 14427: 0x50FB, + 14428: 0x5288, + 14429: 0x58C1, + 14430: 0x64D8, + 14431: 0x6A97, + 14432: 0x74A7, + 14433: 0x7656, + 14434: 0x78A7, + 14435: 0x8617, + 14436: 0x95E2, + 14437: 0x9739, + 14438: 0xF965, + 14439: 0x535E, + 14440: 0x5F01, + 14441: 0x8B8A, + 14442: 0x8FA8, + 14443: 0x8FAF, + 14444: 0x908A, + 14445: 0x5225, + 14446: 0x77A5, + 14447: 0x9C49, + 14448: 0x9F08, + 14449: 0x4E19, + 14450: 0x5002, + 14451: 0x5175, + 14452: 0x5C5B, + 14453: 0x5E77, + 14454: 0x661E, + 14455: 0x663A, + 14456: 0x67C4, + 14457: 0x68C5, + 14458: 0x70B3, + 14459: 0x7501, + 14460: 0x75C5, + 14461: 0x79C9, + 14462: 0x7ADD, + 14463: 0x8F27, + 14464: 0x9920, + 14465: 0x9A08, + 14466: 0x4FDD, + 14467: 0x5821, + 14468: 0x5831, + 14469: 0x5BF6, + 14470: 0x666E, + 14471: 0x6B65, + 14472: 0x6D11, + 14473: 0x6E7A, + 14474: 0x6F7D, + 14475: 0x73E4, + 14476: 0x752B, + 14477: 0x83E9, + 14478: 0x88DC, + 14479: 0x8913, + 14480: 0x8B5C, + 14481: 0x8F14, + 14482: 0x4F0F, + 14483: 0x50D5, + 14484: 0x5310, + 14485: 0x535C, + 14486: 0x5B93, + 14487: 0x5FA9, + 14488: 0x670D, + 14489: 0x798F, + 14490: 0x8179, + 14491: 0x832F, + 14492: 0x8514, + 14493: 0x8907, + 14494: 0x8986, + 14495: 0x8F39, + 14496: 0x8F3B, + 14497: 0x99A5, + 14498: 0x9C12, + 14499: 0x672C, + 14500: 0x4E76, + 14501: 0x4FF8, + 14502: 0x5949, + 14503: 0x5C01, + 14504: 0x5CEF, + 14505: 0x5CF0, + 14506: 0x6367, + 14507: 0x68D2, + 14508: 0x70FD, + 14509: 0x71A2, + 14510: 0x742B, + 14511: 0x7E2B, + 14512: 0x84EC, + 14513: 0x8702, + 14514: 0x9022, + 14515: 0x92D2, + 14516: 0x9CF3, + 14517: 0x4E0D, + 14518: 0x4ED8, + 14519: 0x4FEF, + 14520: 0x5085, + 14521: 0x5256, + 14522: 0x526F, + 14523: 0x5426, + 14524: 0x5490, + 14525: 0x57E0, + 14526: 0x592B, + 14527: 0x5A66, + 14528: 0x5B5A, + 14529: 0x5B75, + 14530: 0x5BCC, + 14531: 0x5E9C, + 14532: 0xF966, + 14533: 0x6276, + 14534: 0x6577, + 14535: 0x65A7, + 14536: 0x6D6E, + 14537: 0x6EA5, + 14538: 0x7236, + 14539: 0x7B26, + 14540: 0x7C3F, + 14541: 0x7F36, + 14542: 0x8150, + 14543: 0x8151, + 14544: 0x819A, + 14545: 0x8240, + 14546: 0x8299, + 14547: 0x83A9, + 14548: 0x8A03, + 14549: 0x8CA0, + 14550: 0x8CE6, + 14551: 0x8CFB, + 14552: 0x8D74, + 14553: 0x8DBA, + 14554: 0x90E8, + 14555: 0x91DC, + 14556: 0x961C, + 14557: 0x9644, + 14558: 0x99D9, + 14559: 0x9CE7, + 14560: 0x5317, + 14561: 0x5206, + 14562: 0x5429, + 14563: 0x5674, + 14564: 0x58B3, + 14565: 0x5954, + 14566: 0x596E, + 14567: 0x5FFF, + 14568: 0x61A4, + 14569: 0x626E, + 14570: 0x6610, + 14571: 0x6C7E, + 14572: 0x711A, + 14573: 0x76C6, + 14574: 0x7C89, + 14575: 0x7CDE, + 14576: 0x7D1B, + 14577: 0x82AC, + 14578: 0x8CC1, + 14579: 0x96F0, + 14580: 0xF967, + 14581: 0x4F5B, + 14582: 0x5F17, + 14583: 0x5F7F, + 14584: 0x62C2, + 14585: 0x5D29, + 14586: 0x670B, + 14587: 0x68DA, + 14588: 0x787C, + 14589: 0x7E43, + 14590: 0x9D6C, + 14591: 0x4E15, + 14592: 0x5099, + 14593: 0x5315, + 14594: 0x532A, + 14595: 0x5351, + 14596: 0x5983, + 14597: 0x5A62, + 14598: 0x5E87, + 14599: 0x60B2, + 14600: 0x618A, + 14601: 0x6249, + 14602: 0x6279, + 14603: 0x6590, + 14604: 0x6787, + 14605: 0x69A7, + 14606: 0x6BD4, + 14607: 0x6BD6, + 14608: 0x6BD7, + 14609: 0x6BD8, + 14610: 0x6CB8, + 14611: 0xF968, + 14612: 0x7435, + 14613: 0x75FA, + 14614: 0x7812, + 14615: 0x7891, + 14616: 0x79D5, + 14617: 0x79D8, + 14618: 0x7C83, + 14619: 0x7DCB, + 14620: 0x7FE1, + 14621: 0x80A5, + 14622: 0x813E, + 14623: 0x81C2, + 14624: 0x83F2, + 14625: 0x871A, + 14626: 0x88E8, + 14627: 0x8AB9, + 14628: 0x8B6C, + 14629: 0x8CBB, + 14630: 0x9119, + 14631: 0x975E, + 14632: 0x98DB, + 14633: 0x9F3B, + 14634: 0x56AC, + 14635: 0x5B2A, + 14636: 0x5F6C, + 14637: 0x658C, + 14638: 0x6AB3, + 14639: 0x6BAF, + 14640: 0x6D5C, + 14641: 0x6FF1, + 14642: 0x7015, + 14643: 0x725D, + 14644: 0x73AD, + 14645: 0x8CA7, + 14646: 0x8CD3, + 14647: 0x983B, + 14648: 0x6191, + 14649: 0x6C37, + 14650: 0x8058, + 14651: 0x9A01, + 14652: 0x4E4D, + 14653: 0x4E8B, + 14654: 0x4E9B, + 14655: 0x4ED5, + 14656: 0x4F3A, + 14657: 0x4F3C, + 14658: 0x4F7F, + 14659: 0x4FDF, + 14660: 0x50FF, + 14661: 0x53F2, + 14662: 0x53F8, + 14663: 0x5506, + 14664: 0x55E3, + 14665: 0x56DB, + 14666: 0x58EB, + 14667: 0x5962, + 14668: 0x5A11, + 14669: 0x5BEB, + 14670: 0x5BFA, + 14671: 0x5C04, + 14672: 0x5DF3, + 14673: 0x5E2B, + 14674: 0x5F99, + 14675: 0x601D, + 14676: 0x6368, + 14677: 0x659C, + 14678: 0x65AF, + 14679: 0x67F6, + 14680: 0x67FB, + 14681: 0x68AD, + 14682: 0x6B7B, + 14683: 0x6C99, + 14684: 0x6CD7, + 14685: 0x6E23, + 14686: 0x7009, + 14687: 0x7345, + 14688: 0x7802, + 14689: 0x793E, + 14690: 0x7940, + 14691: 0x7960, + 14692: 0x79C1, + 14693: 0x7BE9, + 14694: 0x7D17, + 14695: 0x7D72, + 14696: 0x8086, + 14697: 0x820D, + 14698: 0x838E, + 14699: 0x84D1, + 14700: 0x86C7, + 14701: 0x88DF, + 14702: 0x8A50, + 14703: 0x8A5E, + 14704: 0x8B1D, + 14705: 0x8CDC, + 14706: 0x8D66, + 14707: 0x8FAD, + 14708: 0x90AA, + 14709: 0x98FC, + 14710: 0x99DF, + 14711: 0x9E9D, + 14712: 0x524A, + 14713: 0xF969, + 14714: 0x6714, + 14715: 0xF96A, + 14716: 0x5098, + 14717: 0x522A, + 14718: 0x5C71, + 14719: 0x6563, + 14720: 0x6C55, + 14721: 0x73CA, + 14722: 0x7523, + 14723: 0x759D, + 14724: 0x7B97, + 14725: 0x849C, + 14726: 0x9178, + 14727: 0x9730, + 14728: 0x4E77, + 14729: 0x6492, + 14730: 0x6BBA, + 14731: 0x715E, + 14732: 0x85A9, + 14733: 0x4E09, + 14734: 0xF96B, + 14735: 0x6749, + 14736: 0x68EE, + 14737: 0x6E17, + 14738: 0x829F, + 14739: 0x8518, + 14740: 0x886B, + 14741: 0x63F7, + 14742: 0x6F81, + 14743: 0x9212, + 14744: 0x98AF, + 14745: 0x4E0A, + 14746: 0x50B7, + 14747: 0x50CF, + 14748: 0x511F, + 14749: 0x5546, + 14750: 0x55AA, + 14751: 0x5617, + 14752: 0x5B40, + 14753: 0x5C19, + 14754: 0x5CE0, + 14755: 0x5E38, + 14756: 0x5E8A, + 14757: 0x5EA0, + 14758: 0x5EC2, + 14759: 0x60F3, + 14760: 0x6851, + 14761: 0x6A61, + 14762: 0x6E58, + 14763: 0x723D, + 14764: 0x7240, + 14765: 0x72C0, + 14766: 0x76F8, + 14767: 0x7965, + 14768: 0x7BB1, + 14769: 0x7FD4, + 14770: 0x88F3, + 14771: 0x89F4, + 14772: 0x8A73, + 14773: 0x8C61, + 14774: 0x8CDE, + 14775: 0x971C, + 14776: 0x585E, + 14777: 0x74BD, + 14778: 0x8CFD, + 14779: 0x55C7, + 14780: 0xF96C, + 14781: 0x7A61, + 14782: 0x7D22, + 14783: 0x8272, + 14784: 0x7272, + 14785: 0x751F, + 14786: 0x7525, + 14787: 0xF96D, + 14788: 0x7B19, + 14789: 0x5885, + 14790: 0x58FB, + 14791: 0x5DBC, + 14792: 0x5E8F, + 14793: 0x5EB6, + 14794: 0x5F90, + 14795: 0x6055, + 14796: 0x6292, + 14797: 0x637F, + 14798: 0x654D, + 14799: 0x6691, + 14800: 0x66D9, + 14801: 0x66F8, + 14802: 0x6816, + 14803: 0x68F2, + 14804: 0x7280, + 14805: 0x745E, + 14806: 0x7B6E, + 14807: 0x7D6E, + 14808: 0x7DD6, + 14809: 0x7F72, + 14810: 0x80E5, + 14811: 0x8212, + 14812: 0x85AF, + 14813: 0x897F, + 14814: 0x8A93, + 14815: 0x901D, + 14816: 0x92E4, + 14817: 0x9ECD, + 14818: 0x9F20, + 14819: 0x5915, + 14820: 0x596D, + 14821: 0x5E2D, + 14822: 0x60DC, + 14823: 0x6614, + 14824: 0x6673, + 14825: 0x6790, + 14826: 0x6C50, + 14827: 0x6DC5, + 14828: 0x6F5F, + 14829: 0x77F3, + 14830: 0x78A9, + 14831: 0x84C6, + 14832: 0x91CB, + 14833: 0x932B, + 14834: 0x4ED9, + 14835: 0x50CA, + 14836: 0x5148, + 14837: 0x5584, + 14838: 0x5B0B, + 14839: 0x5BA3, + 14840: 0x6247, + 14841: 0x657E, + 14842: 0x65CB, + 14843: 0x6E32, + 14844: 0x717D, + 14845: 0x7401, + 14846: 0x7444, + 14847: 0x7487, + 14848: 0x74BF, + 14849: 0x766C, + 14850: 0x79AA, + 14851: 0x7DDA, + 14852: 0x7E55, + 14853: 0x7FA8, + 14854: 0x817A, + 14855: 0x81B3, + 14856: 0x8239, + 14857: 0x861A, + 14858: 0x87EC, + 14859: 0x8A75, + 14860: 0x8DE3, + 14861: 0x9078, + 14862: 0x9291, + 14863: 0x9425, + 14864: 0x994D, + 14865: 0x9BAE, + 14866: 0x5368, + 14867: 0x5C51, + 14868: 0x6954, + 14869: 0x6CC4, + 14870: 0x6D29, + 14871: 0x6E2B, + 14872: 0x820C, + 14873: 0x859B, + 14874: 0x893B, + 14875: 0x8A2D, + 14876: 0x8AAA, + 14877: 0x96EA, + 14878: 0x9F67, + 14879: 0x5261, + 14880: 0x66B9, + 14881: 0x6BB2, + 14882: 0x7E96, + 14883: 0x87FE, + 14884: 0x8D0D, + 14885: 0x9583, + 14886: 0x965D, + 14887: 0x651D, + 14888: 0x6D89, + 14889: 0x71EE, + 14890: 0xF96E, + 14891: 0x57CE, + 14892: 0x59D3, + 14893: 0x5BAC, + 14894: 0x6027, + 14895: 0x60FA, + 14896: 0x6210, + 14897: 0x661F, + 14898: 0x665F, + 14899: 0x7329, + 14900: 0x73F9, + 14901: 0x76DB, + 14902: 0x7701, + 14903: 0x7B6C, + 14904: 0x8056, + 14905: 0x8072, + 14906: 0x8165, + 14907: 0x8AA0, + 14908: 0x9192, + 14909: 0x4E16, + 14910: 0x52E2, + 14911: 0x6B72, + 14912: 0x6D17, + 14913: 0x7A05, + 14914: 0x7B39, + 14915: 0x7D30, + 14916: 0xF96F, + 14917: 0x8CB0, + 14918: 0x53EC, + 14919: 0x562F, + 14920: 0x5851, + 14921: 0x5BB5, + 14922: 0x5C0F, + 14923: 0x5C11, + 14924: 0x5DE2, + 14925: 0x6240, + 14926: 0x6383, + 14927: 0x6414, + 14928: 0x662D, + 14929: 0x68B3, + 14930: 0x6CBC, + 14931: 0x6D88, + 14932: 0x6EAF, + 14933: 0x701F, + 14934: 0x70A4, + 14935: 0x71D2, + 14936: 0x7526, + 14937: 0x758F, + 14938: 0x758E, + 14939: 0x7619, + 14940: 0x7B11, + 14941: 0x7BE0, + 14942: 0x7C2B, + 14943: 0x7D20, + 14944: 0x7D39, + 14945: 0x852C, + 14946: 0x856D, + 14947: 0x8607, + 14948: 0x8A34, + 14949: 0x900D, + 14950: 0x9061, + 14951: 0x90B5, + 14952: 0x92B7, + 14953: 0x97F6, + 14954: 0x9A37, + 14955: 0x4FD7, + 14956: 0x5C6C, + 14957: 0x675F, + 14958: 0x6D91, + 14959: 0x7C9F, + 14960: 0x7E8C, + 14961: 0x8B16, + 14962: 0x8D16, + 14963: 0x901F, + 14964: 0x5B6B, + 14965: 0x5DFD, + 14966: 0x640D, + 14967: 0x84C0, + 14968: 0x905C, + 14969: 0x98E1, + 14970: 0x7387, + 14971: 0x5B8B, + 14972: 0x609A, + 14973: 0x677E, + 14974: 0x6DDE, + 14975: 0x8A1F, + 14976: 0x8AA6, + 14977: 0x9001, + 14978: 0x980C, + 14979: 0x5237, + 14980: 0xF970, + 14981: 0x7051, + 14982: 0x788E, + 14983: 0x9396, + 14984: 0x8870, + 14985: 0x91D7, + 14986: 0x4FEE, + 14987: 0x53D7, + 14988: 0x55FD, + 14989: 0x56DA, + 14990: 0x5782, + 14991: 0x58FD, + 14992: 0x5AC2, + 14993: 0x5B88, + 14994: 0x5CAB, + 14995: 0x5CC0, + 14996: 0x5E25, + 14997: 0x6101, + 14998: 0x620D, + 14999: 0x624B, + 15000: 0x6388, + 15001: 0x641C, + 15002: 0x6536, + 15003: 0x6578, + 15004: 0x6A39, + 15005: 0x6B8A, + 15006: 0x6C34, + 15007: 0x6D19, + 15008: 0x6F31, + 15009: 0x71E7, + 15010: 0x72E9, + 15011: 0x7378, + 15012: 0x7407, + 15013: 0x74B2, + 15014: 0x7626, + 15015: 0x7761, + 15016: 0x79C0, + 15017: 0x7A57, + 15018: 0x7AEA, + 15019: 0x7CB9, + 15020: 0x7D8F, + 15021: 0x7DAC, + 15022: 0x7E61, + 15023: 0x7F9E, + 15024: 0x8129, + 15025: 0x8331, + 15026: 0x8490, + 15027: 0x84DA, + 15028: 0x85EA, + 15029: 0x8896, + 15030: 0x8AB0, + 15031: 0x8B90, + 15032: 0x8F38, + 15033: 0x9042, + 15034: 0x9083, + 15035: 0x916C, + 15036: 0x9296, + 15037: 0x92B9, + 15038: 0x968B, + 15039: 0x96A7, + 15040: 0x96A8, + 15041: 0x96D6, + 15042: 0x9700, + 15043: 0x9808, + 15044: 0x9996, + 15045: 0x9AD3, + 15046: 0x9B1A, + 15047: 0x53D4, + 15048: 0x587E, + 15049: 0x5919, + 15050: 0x5B70, + 15051: 0x5BBF, + 15052: 0x6DD1, + 15053: 0x6F5A, + 15054: 0x719F, + 15055: 0x7421, + 15056: 0x74B9, + 15057: 0x8085, + 15058: 0x83FD, + 15059: 0x5DE1, + 15060: 0x5F87, + 15061: 0x5FAA, + 15062: 0x6042, + 15063: 0x65EC, + 15064: 0x6812, + 15065: 0x696F, + 15066: 0x6A53, + 15067: 0x6B89, + 15068: 0x6D35, + 15069: 0x6DF3, + 15070: 0x73E3, + 15071: 0x76FE, + 15072: 0x77AC, + 15073: 0x7B4D, + 15074: 0x7D14, + 15075: 0x8123, + 15076: 0x821C, + 15077: 0x8340, + 15078: 0x84F4, + 15079: 0x8563, + 15080: 0x8A62, + 15081: 0x8AC4, + 15082: 0x9187, + 15083: 0x931E, + 15084: 0x9806, + 15085: 0x99B4, + 15086: 0x620C, + 15087: 0x8853, + 15088: 0x8FF0, + 15089: 0x9265, + 15090: 0x5D07, + 15091: 0x5D27, + 15092: 0x5D69, + 15093: 0x745F, + 15094: 0x819D, + 15095: 0x8768, + 15096: 0x6FD5, + 15097: 0x62FE, + 15098: 0x7FD2, + 15099: 0x8936, + 15100: 0x8972, + 15101: 0x4E1E, + 15102: 0x4E58, + 15103: 0x50E7, + 15104: 0x52DD, + 15105: 0x5347, + 15106: 0x627F, + 15107: 0x6607, + 15108: 0x7E69, + 15109: 0x8805, + 15110: 0x965E, + 15111: 0x4F8D, + 15112: 0x5319, + 15113: 0x5636, + 15114: 0x59CB, + 15115: 0x5AA4, + 15116: 0x5C38, + 15117: 0x5C4E, + 15118: 0x5C4D, + 15119: 0x5E02, + 15120: 0x5F11, + 15121: 0x6043, + 15122: 0x65BD, + 15123: 0x662F, + 15124: 0x6642, + 15125: 0x67BE, + 15126: 0x67F4, + 15127: 0x731C, + 15128: 0x77E2, + 15129: 0x793A, + 15130: 0x7FC5, + 15131: 0x8494, + 15132: 0x84CD, + 15133: 0x8996, + 15134: 0x8A66, + 15135: 0x8A69, + 15136: 0x8AE1, + 15137: 0x8C55, + 15138: 0x8C7A, + 15139: 0x57F4, + 15140: 0x5BD4, + 15141: 0x5F0F, + 15142: 0x606F, + 15143: 0x62ED, + 15144: 0x690D, + 15145: 0x6B96, + 15146: 0x6E5C, + 15147: 0x7184, + 15148: 0x7BD2, + 15149: 0x8755, + 15150: 0x8B58, + 15151: 0x8EFE, + 15152: 0x98DF, + 15153: 0x98FE, + 15154: 0x4F38, + 15155: 0x4F81, + 15156: 0x4FE1, + 15157: 0x547B, + 15158: 0x5A20, + 15159: 0x5BB8, + 15160: 0x613C, + 15161: 0x65B0, + 15162: 0x6668, + 15163: 0x71FC, + 15164: 0x7533, + 15165: 0x795E, + 15166: 0x7D33, + 15167: 0x814E, + 15168: 0x81E3, + 15169: 0x8398, + 15170: 0x85AA, + 15171: 0x85CE, + 15172: 0x8703, + 15173: 0x8A0A, + 15174: 0x8EAB, + 15175: 0x8F9B, + 15176: 0xF971, + 15177: 0x8FC5, + 15178: 0x5931, + 15179: 0x5BA4, + 15180: 0x5BE6, + 15181: 0x6089, + 15182: 0x5BE9, + 15183: 0x5C0B, + 15184: 0x5FC3, + 15185: 0x6C81, + 15186: 0xF972, + 15187: 0x6DF1, + 15188: 0x700B, + 15189: 0x751A, + 15190: 0x82AF, + 15191: 0x8AF6, + 15192: 0x4EC0, + 15193: 0x5341, + 15194: 0xF973, + 15195: 0x96D9, + 15196: 0x6C0F, + 15197: 0x4E9E, + 15198: 0x4FC4, + 15199: 0x5152, + 15200: 0x555E, + 15201: 0x5A25, + 15202: 0x5CE8, + 15203: 0x6211, + 15204: 0x7259, + 15205: 0x82BD, + 15206: 0x83AA, + 15207: 0x86FE, + 15208: 0x8859, + 15209: 0x8A1D, + 15210: 0x963F, + 15211: 0x96C5, + 15212: 0x9913, + 15213: 0x9D09, + 15214: 0x9D5D, + 15215: 0x580A, + 15216: 0x5CB3, + 15217: 0x5DBD, + 15218: 0x5E44, + 15219: 0x60E1, + 15220: 0x6115, + 15221: 0x63E1, + 15222: 0x6A02, + 15223: 0x6E25, + 15224: 0x9102, + 15225: 0x9354, + 15226: 0x984E, + 15227: 0x9C10, + 15228: 0x9F77, + 15229: 0x5B89, + 15230: 0x5CB8, + 15231: 0x6309, + 15232: 0x664F, + 15233: 0x6848, + 15234: 0x773C, + 15235: 0x96C1, + 15236: 0x978D, + 15237: 0x9854, + 15238: 0x9B9F, + 15239: 0x65A1, + 15240: 0x8B01, + 15241: 0x8ECB, + 15242: 0x95BC, + 15243: 0x5535, + 15244: 0x5CA9, + 15245: 0x5DD6, + 15246: 0x5EB5, + 15247: 0x6697, + 15248: 0x764C, + 15249: 0x83F4, + 15250: 0x95C7, + 15251: 0x58D3, + 15252: 0x62BC, + 15253: 0x72CE, + 15254: 0x9D28, + 15255: 0x4EF0, + 15256: 0x592E, + 15257: 0x600F, + 15258: 0x663B, + 15259: 0x6B83, + 15260: 0x79E7, + 15261: 0x9D26, + 15262: 0x5393, + 15263: 0x54C0, + 15264: 0x57C3, + 15265: 0x5D16, + 15266: 0x611B, + 15267: 0x66D6, + 15268: 0x6DAF, + 15269: 0x788D, + 15270: 0x827E, + 15271: 0x9698, + 15272: 0x9744, + 15273: 0x5384, + 15274: 0x627C, + 15275: 0x6396, + 15276: 0x6DB2, + 15277: 0x7E0A, + 15278: 0x814B, + 15279: 0x984D, + 15280: 0x6AFB, + 15281: 0x7F4C, + 15282: 0x9DAF, + 15283: 0x9E1A, + 15284: 0x4E5F, + 15285: 0x503B, + 15286: 0x51B6, + 15287: 0x591C, + 15288: 0x60F9, + 15289: 0x63F6, + 15290: 0x6930, + 15291: 0x723A, + 15292: 0x8036, + 15293: 0xF974, + 15294: 0x91CE, + 15295: 0x5F31, + 15296: 0xF975, + 15297: 0xF976, + 15298: 0x7D04, + 15299: 0x82E5, + 15300: 0x846F, + 15301: 0x84BB, + 15302: 0x85E5, + 15303: 0x8E8D, + 15304: 0xF977, + 15305: 0x4F6F, + 15306: 0xF978, + 15307: 0xF979, + 15308: 0x58E4, + 15309: 0x5B43, + 15310: 0x6059, + 15311: 0x63DA, + 15312: 0x6518, + 15313: 0x656D, + 15314: 0x6698, + 15315: 0xF97A, + 15316: 0x694A, + 15317: 0x6A23, + 15318: 0x6D0B, + 15319: 0x7001, + 15320: 0x716C, + 15321: 0x75D2, + 15322: 0x760D, + 15323: 0x79B3, + 15324: 0x7A70, + 15325: 0xF97B, + 15326: 0x7F8A, + 15327: 0xF97C, + 15328: 0x8944, + 15329: 0xF97D, + 15330: 0x8B93, + 15331: 0x91C0, + 15332: 0x967D, + 15333: 0xF97E, + 15334: 0x990A, + 15335: 0x5704, + 15336: 0x5FA1, + 15337: 0x65BC, + 15338: 0x6F01, + 15339: 0x7600, + 15340: 0x79A6, + 15341: 0x8A9E, + 15342: 0x99AD, + 15343: 0x9B5A, + 15344: 0x9F6C, + 15345: 0x5104, + 15346: 0x61B6, + 15347: 0x6291, + 15348: 0x6A8D, + 15349: 0x81C6, + 15350: 0x5043, + 15351: 0x5830, + 15352: 0x5F66, + 15353: 0x7109, + 15354: 0x8A00, + 15355: 0x8AFA, + 15356: 0x5B7C, + 15357: 0x8616, + 15358: 0x4FFA, + 15359: 0x513C, + 15360: 0x56B4, + 15361: 0x5944, + 15362: 0x63A9, + 15363: 0x6DF9, + 15364: 0x5DAA, + 15365: 0x696D, + 15366: 0x5186, + 15367: 0x4E88, + 15368: 0x4F59, + 15369: 0xF97F, + 15370: 0xF980, + 15371: 0xF981, + 15372: 0x5982, + 15373: 0xF982, + 15374: 0xF983, + 15375: 0x6B5F, + 15376: 0x6C5D, + 15377: 0xF984, + 15378: 0x74B5, + 15379: 0x7916, + 15380: 0xF985, + 15381: 0x8207, + 15382: 0x8245, + 15383: 0x8339, + 15384: 0x8F3F, + 15385: 0x8F5D, + 15386: 0xF986, + 15387: 0x9918, + 15388: 0xF987, + 15389: 0xF988, + 15390: 0xF989, + 15391: 0x4EA6, + 15392: 0xF98A, + 15393: 0x57DF, + 15394: 0x5F79, + 15395: 0x6613, + 15396: 0xF98B, + 15397: 0xF98C, + 15398: 0x75AB, + 15399: 0x7E79, + 15400: 0x8B6F, + 15401: 0xF98D, + 15402: 0x9006, + 15403: 0x9A5B, + 15404: 0x56A5, + 15405: 0x5827, + 15406: 0x59F8, + 15407: 0x5A1F, + 15408: 0x5BB4, + 15409: 0xF98E, + 15410: 0x5EF6, + 15411: 0xF98F, + 15412: 0xF990, + 15413: 0x6350, + 15414: 0x633B, + 15415: 0xF991, + 15416: 0x693D, + 15417: 0x6C87, + 15418: 0x6CBF, + 15419: 0x6D8E, + 15420: 0x6D93, + 15421: 0x6DF5, + 15422: 0x6F14, + 15423: 0xF992, + 15424: 0x70DF, + 15425: 0x7136, + 15426: 0x7159, + 15427: 0xF993, + 15428: 0x71C3, + 15429: 0x71D5, + 15430: 0xF994, + 15431: 0x784F, + 15432: 0x786F, + 15433: 0xF995, + 15434: 0x7B75, + 15435: 0x7DE3, + 15436: 0xF996, + 15437: 0x7E2F, + 15438: 0xF997, + 15439: 0x884D, + 15440: 0x8EDF, + 15441: 0xF998, + 15442: 0xF999, + 15443: 0xF99A, + 15444: 0x925B, + 15445: 0xF99B, + 15446: 0x9CF6, + 15447: 0xF99C, + 15448: 0xF99D, + 15449: 0xF99E, + 15450: 0x6085, + 15451: 0x6D85, + 15452: 0xF99F, + 15453: 0x71B1, + 15454: 0xF9A0, + 15455: 0xF9A1, + 15456: 0x95B1, + 15457: 0x53AD, + 15458: 0xF9A2, + 15459: 0xF9A3, + 15460: 0xF9A4, + 15461: 0x67D3, + 15462: 0xF9A5, + 15463: 0x708E, + 15464: 0x7130, + 15465: 0x7430, + 15466: 0x8276, + 15467: 0x82D2, + 15468: 0xF9A6, + 15469: 0x95BB, + 15470: 0x9AE5, + 15471: 0x9E7D, + 15472: 0x66C4, + 15473: 0xF9A7, + 15474: 0x71C1, + 15475: 0x8449, + 15476: 0xF9A8, + 15477: 0xF9A9, + 15478: 0x584B, + 15479: 0xF9AA, + 15480: 0xF9AB, + 15481: 0x5DB8, + 15482: 0x5F71, + 15483: 0xF9AC, + 15484: 0x6620, + 15485: 0x668E, + 15486: 0x6979, + 15487: 0x69AE, + 15488: 0x6C38, + 15489: 0x6CF3, + 15490: 0x6E36, + 15491: 0x6F41, + 15492: 0x6FDA, + 15493: 0x701B, + 15494: 0x702F, + 15495: 0x7150, + 15496: 0x71DF, + 15497: 0x7370, + 15498: 0xF9AD, + 15499: 0x745B, + 15500: 0xF9AE, + 15501: 0x74D4, + 15502: 0x76C8, + 15503: 0x7A4E, + 15504: 0x7E93, + 15505: 0xF9AF, + 15506: 0xF9B0, + 15507: 0x82F1, + 15508: 0x8A60, + 15509: 0x8FCE, + 15510: 0xF9B1, + 15511: 0x9348, + 15512: 0xF9B2, + 15513: 0x9719, + 15514: 0xF9B3, + 15515: 0xF9B4, + 15516: 0x4E42, + 15517: 0x502A, + 15518: 0xF9B5, + 15519: 0x5208, + 15520: 0x53E1, + 15521: 0x66F3, + 15522: 0x6C6D, + 15523: 0x6FCA, + 15524: 0x730A, + 15525: 0x777F, + 15526: 0x7A62, + 15527: 0x82AE, + 15528: 0x85DD, + 15529: 0x8602, + 15530: 0xF9B6, + 15531: 0x88D4, + 15532: 0x8A63, + 15533: 0x8B7D, + 15534: 0x8C6B, + 15535: 0xF9B7, + 15536: 0x92B3, + 15537: 0xF9B8, + 15538: 0x9713, + 15539: 0x9810, + 15540: 0x4E94, + 15541: 0x4F0D, + 15542: 0x4FC9, + 15543: 0x50B2, + 15544: 0x5348, + 15545: 0x543E, + 15546: 0x5433, + 15547: 0x55DA, + 15548: 0x5862, + 15549: 0x58BA, + 15550: 0x5967, + 15551: 0x5A1B, + 15552: 0x5BE4, + 15553: 0x609F, + 15554: 0xF9B9, + 15555: 0x61CA, + 15556: 0x6556, + 15557: 0x65FF, + 15558: 0x6664, + 15559: 0x68A7, + 15560: 0x6C5A, + 15561: 0x6FB3, + 15562: 0x70CF, + 15563: 0x71AC, + 15564: 0x7352, + 15565: 0x7B7D, + 15566: 0x8708, + 15567: 0x8AA4, + 15568: 0x9C32, + 15569: 0x9F07, + 15570: 0x5C4B, + 15571: 0x6C83, + 15572: 0x7344, + 15573: 0x7389, + 15574: 0x923A, + 15575: 0x6EAB, + 15576: 0x7465, + 15577: 0x761F, + 15578: 0x7A69, + 15579: 0x7E15, + 15580: 0x860A, + 15581: 0x5140, + 15582: 0x58C5, + 15583: 0x64C1, + 15584: 0x74EE, + 15585: 0x7515, + 15586: 0x7670, + 15587: 0x7FC1, + 15588: 0x9095, + 15589: 0x96CD, + 15590: 0x9954, + 15591: 0x6E26, + 15592: 0x74E6, + 15593: 0x7AA9, + 15594: 0x7AAA, + 15595: 0x81E5, + 15596: 0x86D9, + 15597: 0x8778, + 15598: 0x8A1B, + 15599: 0x5A49, + 15600: 0x5B8C, + 15601: 0x5B9B, + 15602: 0x68A1, + 15603: 0x6900, + 15604: 0x6D63, + 15605: 0x73A9, + 15606: 0x7413, + 15607: 0x742C, + 15608: 0x7897, + 15609: 0x7DE9, + 15610: 0x7FEB, + 15611: 0x8118, + 15612: 0x8155, + 15613: 0x839E, + 15614: 0x8C4C, + 15615: 0x962E, + 15616: 0x9811, + 15617: 0x66F0, + 15618: 0x5F80, + 15619: 0x65FA, + 15620: 0x6789, + 15621: 0x6C6A, + 15622: 0x738B, + 15623: 0x502D, + 15624: 0x5A03, + 15625: 0x6B6A, + 15626: 0x77EE, + 15627: 0x5916, + 15628: 0x5D6C, + 15629: 0x5DCD, + 15630: 0x7325, + 15631: 0x754F, + 15632: 0xF9BA, + 15633: 0xF9BB, + 15634: 0x50E5, + 15635: 0x51F9, + 15636: 0x582F, + 15637: 0x592D, + 15638: 0x5996, + 15639: 0x59DA, + 15640: 0x5BE5, + 15641: 0xF9BC, + 15642: 0xF9BD, + 15643: 0x5DA2, + 15644: 0x62D7, + 15645: 0x6416, + 15646: 0x6493, + 15647: 0x64FE, + 15648: 0xF9BE, + 15649: 0x66DC, + 15650: 0xF9BF, + 15651: 0x6A48, + 15652: 0xF9C0, + 15653: 0x71FF, + 15654: 0x7464, + 15655: 0xF9C1, + 15656: 0x7A88, + 15657: 0x7AAF, + 15658: 0x7E47, + 15659: 0x7E5E, + 15660: 0x8000, + 15661: 0x8170, + 15662: 0xF9C2, + 15663: 0x87EF, + 15664: 0x8981, + 15665: 0x8B20, + 15666: 0x9059, + 15667: 0xF9C3, + 15668: 0x9080, + 15669: 0x9952, + 15670: 0x617E, + 15671: 0x6B32, + 15672: 0x6D74, + 15673: 0x7E1F, + 15674: 0x8925, + 15675: 0x8FB1, + 15676: 0x4FD1, + 15677: 0x50AD, + 15678: 0x5197, + 15679: 0x52C7, + 15680: 0x57C7, + 15681: 0x5889, + 15682: 0x5BB9, + 15683: 0x5EB8, + 15684: 0x6142, + 15685: 0x6995, + 15686: 0x6D8C, + 15687: 0x6E67, + 15688: 0x6EB6, + 15689: 0x7194, + 15690: 0x7462, + 15691: 0x7528, + 15692: 0x752C, + 15693: 0x8073, + 15694: 0x8338, + 15695: 0x84C9, + 15696: 0x8E0A, + 15697: 0x9394, + 15698: 0x93DE, + 15699: 0xF9C4, + 15700: 0x4E8E, + 15701: 0x4F51, + 15702: 0x5076, + 15703: 0x512A, + 15704: 0x53C8, + 15705: 0x53CB, + 15706: 0x53F3, + 15707: 0x5B87, + 15708: 0x5BD3, + 15709: 0x5C24, + 15710: 0x611A, + 15711: 0x6182, + 15712: 0x65F4, + 15713: 0x725B, + 15714: 0x7397, + 15715: 0x7440, + 15716: 0x76C2, + 15717: 0x7950, + 15718: 0x7991, + 15719: 0x79B9, + 15720: 0x7D06, + 15721: 0x7FBD, + 15722: 0x828B, + 15723: 0x85D5, + 15724: 0x865E, + 15725: 0x8FC2, + 15726: 0x9047, + 15727: 0x90F5, + 15728: 0x91EA, + 15729: 0x9685, + 15730: 0x96E8, + 15731: 0x96E9, + 15732: 0x52D6, + 15733: 0x5F67, + 15734: 0x65ED, + 15735: 0x6631, + 15736: 0x682F, + 15737: 0x715C, + 15738: 0x7A36, + 15739: 0x90C1, + 15740: 0x980A, + 15741: 0x4E91, + 15742: 0xF9C5, + 15743: 0x6A52, + 15744: 0x6B9E, + 15745: 0x6F90, + 15746: 0x7189, + 15747: 0x8018, + 15748: 0x82B8, + 15749: 0x8553, + 15750: 0x904B, + 15751: 0x9695, + 15752: 0x96F2, + 15753: 0x97FB, + 15754: 0x851A, + 15755: 0x9B31, + 15756: 0x4E90, + 15757: 0x718A, + 15758: 0x96C4, + 15759: 0x5143, + 15760: 0x539F, + 15761: 0x54E1, + 15762: 0x5713, + 15763: 0x5712, + 15764: 0x57A3, + 15765: 0x5A9B, + 15766: 0x5AC4, + 15767: 0x5BC3, + 15768: 0x6028, + 15769: 0x613F, + 15770: 0x63F4, + 15771: 0x6C85, + 15772: 0x6D39, + 15773: 0x6E72, + 15774: 0x6E90, + 15775: 0x7230, + 15776: 0x733F, + 15777: 0x7457, + 15778: 0x82D1, + 15779: 0x8881, + 15780: 0x8F45, + 15781: 0x9060, + 15782: 0xF9C6, + 15783: 0x9662, + 15784: 0x9858, + 15785: 0x9D1B, + 15786: 0x6708, + 15787: 0x8D8A, + 15788: 0x925E, + 15789: 0x4F4D, + 15790: 0x5049, + 15791: 0x50DE, + 15792: 0x5371, + 15793: 0x570D, + 15794: 0x59D4, + 15795: 0x5A01, + 15796: 0x5C09, + 15797: 0x6170, + 15798: 0x6690, + 15799: 0x6E2D, + 15800: 0x7232, + 15801: 0x744B, + 15802: 0x7DEF, + 15803: 0x80C3, + 15804: 0x840E, + 15805: 0x8466, + 15806: 0x853F, + 15807: 0x875F, + 15808: 0x885B, + 15809: 0x8918, + 15810: 0x8B02, + 15811: 0x9055, + 15812: 0x97CB, + 15813: 0x9B4F, + 15814: 0x4E73, + 15815: 0x4F91, + 15816: 0x5112, + 15817: 0x516A, + 15818: 0xF9C7, + 15819: 0x552F, + 15820: 0x55A9, + 15821: 0x5B7A, + 15822: 0x5BA5, + 15823: 0x5E7C, + 15824: 0x5E7D, + 15825: 0x5EBE, + 15826: 0x60A0, + 15827: 0x60DF, + 15828: 0x6108, + 15829: 0x6109, + 15830: 0x63C4, + 15831: 0x6538, + 15832: 0x6709, + 15833: 0xF9C8, + 15834: 0x67D4, + 15835: 0x67DA, + 15836: 0xF9C9, + 15837: 0x6961, + 15838: 0x6962, + 15839: 0x6CB9, + 15840: 0x6D27, + 15841: 0xF9CA, + 15842: 0x6E38, + 15843: 0xF9CB, + 15844: 0x6FE1, + 15845: 0x7336, + 15846: 0x7337, + 15847: 0xF9CC, + 15848: 0x745C, + 15849: 0x7531, + 15850: 0xF9CD, + 15851: 0x7652, + 15852: 0xF9CE, + 15853: 0xF9CF, + 15854: 0x7DAD, + 15855: 0x81FE, + 15856: 0x8438, + 15857: 0x88D5, + 15858: 0x8A98, + 15859: 0x8ADB, + 15860: 0x8AED, + 15861: 0x8E30, + 15862: 0x8E42, + 15863: 0x904A, + 15864: 0x903E, + 15865: 0x907A, + 15866: 0x9149, + 15867: 0x91C9, + 15868: 0x936E, + 15869: 0xF9D0, + 15870: 0xF9D1, + 15871: 0x5809, + 15872: 0xF9D2, + 15873: 0x6BD3, + 15874: 0x8089, + 15875: 0x80B2, + 15876: 0xF9D3, + 15877: 0xF9D4, + 15878: 0x5141, + 15879: 0x596B, + 15880: 0x5C39, + 15881: 0xF9D5, + 15882: 0xF9D6, + 15883: 0x6F64, + 15884: 0x73A7, + 15885: 0x80E4, + 15886: 0x8D07, + 15887: 0xF9D7, + 15888: 0x9217, + 15889: 0x958F, + 15890: 0xF9D8, + 15891: 0xF9D9, + 15892: 0xF9DA, + 15893: 0xF9DB, + 15894: 0x807F, + 15895: 0x620E, + 15896: 0x701C, + 15897: 0x7D68, + 15898: 0x878D, + 15899: 0xF9DC, + 15900: 0x57A0, + 15901: 0x6069, + 15902: 0x6147, + 15903: 0x6BB7, + 15904: 0x8ABE, + 15905: 0x9280, + 15906: 0x96B1, + 15907: 0x4E59, + 15908: 0x541F, + 15909: 0x6DEB, + 15910: 0x852D, + 15911: 0x9670, + 15912: 0x97F3, + 15913: 0x98EE, + 15914: 0x63D6, + 15915: 0x6CE3, + 15916: 0x9091, + 15917: 0x51DD, + 15918: 0x61C9, + 15919: 0x81BA, + 15920: 0x9DF9, + 15921: 0x4F9D, + 15922: 0x501A, + 15923: 0x5100, + 15924: 0x5B9C, + 15925: 0x610F, + 15926: 0x61FF, + 15927: 0x64EC, + 15928: 0x6905, + 15929: 0x6BC5, + 15930: 0x7591, + 15931: 0x77E3, + 15932: 0x7FA9, + 15933: 0x8264, + 15934: 0x858F, + 15935: 0x87FB, + 15936: 0x8863, + 15937: 0x8ABC, + 15938: 0x8B70, + 15939: 0x91AB, + 15940: 0x4E8C, + 15941: 0x4EE5, + 15942: 0x4F0A, + 15943: 0xF9DD, + 15944: 0xF9DE, + 15945: 0x5937, + 15946: 0x59E8, + 15947: 0xF9DF, + 15948: 0x5DF2, + 15949: 0x5F1B, + 15950: 0x5F5B, + 15951: 0x6021, + 15952: 0xF9E0, + 15953: 0xF9E1, + 15954: 0xF9E2, + 15955: 0xF9E3, + 15956: 0x723E, + 15957: 0x73E5, + 15958: 0xF9E4, + 15959: 0x7570, + 15960: 0x75CD, + 15961: 0xF9E5, + 15962: 0x79FB, + 15963: 0xF9E6, + 15964: 0x800C, + 15965: 0x8033, + 15966: 0x8084, + 15967: 0x82E1, + 15968: 0x8351, + 15969: 0xF9E7, + 15970: 0xF9E8, + 15971: 0x8CBD, + 15972: 0x8CB3, + 15973: 0x9087, + 15974: 0xF9E9, + 15975: 0xF9EA, + 15976: 0x98F4, + 15977: 0x990C, + 15978: 0xF9EB, + 15979: 0xF9EC, + 15980: 0x7037, + 15981: 0x76CA, + 15982: 0x7FCA, + 15983: 0x7FCC, + 15984: 0x7FFC, + 15985: 0x8B1A, + 15986: 0x4EBA, + 15987: 0x4EC1, + 15988: 0x5203, + 15989: 0x5370, + 15990: 0xF9ED, + 15991: 0x54BD, + 15992: 0x56E0, + 15993: 0x59FB, + 15994: 0x5BC5, + 15995: 0x5F15, + 15996: 0x5FCD, + 15997: 0x6E6E, + 15998: 0xF9EE, + 15999: 0xF9EF, + 16000: 0x7D6A, + 16001: 0x8335, + 16002: 0xF9F0, + 16003: 0x8693, + 16004: 0x8A8D, + 16005: 0xF9F1, + 16006: 0x976D, + 16007: 0x9777, + 16008: 0xF9F2, + 16009: 0xF9F3, + 16010: 0x4E00, + 16011: 0x4F5A, + 16012: 0x4F7E, + 16013: 0x58F9, + 16014: 0x65E5, + 16015: 0x6EA2, + 16016: 0x9038, + 16017: 0x93B0, + 16018: 0x99B9, + 16019: 0x4EFB, + 16020: 0x58EC, + 16021: 0x598A, + 16022: 0x59D9, + 16023: 0x6041, + 16024: 0xF9F4, + 16025: 0xF9F5, + 16026: 0x7A14, + 16027: 0xF9F6, + 16028: 0x834F, + 16029: 0x8CC3, + 16030: 0x5165, + 16031: 0x5344, + 16032: 0xF9F7, + 16033: 0xF9F8, + 16034: 0xF9F9, + 16035: 0x4ECD, + 16036: 0x5269, + 16037: 0x5B55, + 16038: 0x82BF, + 16039: 0x4ED4, + 16040: 0x523A, + 16041: 0x54A8, + 16042: 0x59C9, + 16043: 0x59FF, + 16044: 0x5B50, + 16045: 0x5B57, + 16046: 0x5B5C, + 16047: 0x6063, + 16048: 0x6148, + 16049: 0x6ECB, + 16050: 0x7099, + 16051: 0x716E, + 16052: 0x7386, + 16053: 0x74F7, + 16054: 0x75B5, + 16055: 0x78C1, + 16056: 0x7D2B, + 16057: 0x8005, + 16058: 0x81EA, + 16059: 0x8328, + 16060: 0x8517, + 16061: 0x85C9, + 16062: 0x8AEE, + 16063: 0x8CC7, + 16064: 0x96CC, + 16065: 0x4F5C, + 16066: 0x52FA, + 16067: 0x56BC, + 16068: 0x65AB, + 16069: 0x6628, + 16070: 0x707C, + 16071: 0x70B8, + 16072: 0x7235, + 16073: 0x7DBD, + 16074: 0x828D, + 16075: 0x914C, + 16076: 0x96C0, + 16077: 0x9D72, + 16078: 0x5B71, + 16079: 0x68E7, + 16080: 0x6B98, + 16081: 0x6F7A, + 16082: 0x76DE, + 16083: 0x5C91, + 16084: 0x66AB, + 16085: 0x6F5B, + 16086: 0x7BB4, + 16087: 0x7C2A, + 16088: 0x8836, + 16089: 0x96DC, + 16090: 0x4E08, + 16091: 0x4ED7, + 16092: 0x5320, + 16093: 0x5834, + 16094: 0x58BB, + 16095: 0x58EF, + 16096: 0x596C, + 16097: 0x5C07, + 16098: 0x5E33, + 16099: 0x5E84, + 16100: 0x5F35, + 16101: 0x638C, + 16102: 0x66B2, + 16103: 0x6756, + 16104: 0x6A1F, + 16105: 0x6AA3, + 16106: 0x6B0C, + 16107: 0x6F3F, + 16108: 0x7246, + 16109: 0xF9FA, + 16110: 0x7350, + 16111: 0x748B, + 16112: 0x7AE0, + 16113: 0x7CA7, + 16114: 0x8178, + 16115: 0x81DF, + 16116: 0x81E7, + 16117: 0x838A, + 16118: 0x846C, + 16119: 0x8523, + 16120: 0x8594, + 16121: 0x85CF, + 16122: 0x88DD, + 16123: 0x8D13, + 16124: 0x91AC, + 16125: 0x9577, + 16126: 0x969C, + 16127: 0x518D, + 16128: 0x54C9, + 16129: 0x5728, + 16130: 0x5BB0, + 16131: 0x624D, + 16132: 0x6750, + 16133: 0x683D, + 16134: 0x6893, + 16135: 0x6E3D, + 16136: 0x6ED3, + 16137: 0x707D, + 16138: 0x7E21, + 16139: 0x88C1, + 16140: 0x8CA1, + 16141: 0x8F09, + 16142: 0x9F4B, + 16143: 0x9F4E, + 16144: 0x722D, + 16145: 0x7B8F, + 16146: 0x8ACD, + 16147: 0x931A, + 16148: 0x4F47, + 16149: 0x4F4E, + 16150: 0x5132, + 16151: 0x5480, + 16152: 0x59D0, + 16153: 0x5E95, + 16154: 0x62B5, + 16155: 0x6775, + 16156: 0x696E, + 16157: 0x6A17, + 16158: 0x6CAE, + 16159: 0x6E1A, + 16160: 0x72D9, + 16161: 0x732A, + 16162: 0x75BD, + 16163: 0x7BB8, + 16164: 0x7D35, + 16165: 0x82E7, + 16166: 0x83F9, + 16167: 0x8457, + 16168: 0x85F7, + 16169: 0x8A5B, + 16170: 0x8CAF, + 16171: 0x8E87, + 16172: 0x9019, + 16173: 0x90B8, + 16174: 0x96CE, + 16175: 0x9F5F, + 16176: 0x52E3, + 16177: 0x540A, + 16178: 0x5AE1, + 16179: 0x5BC2, + 16180: 0x6458, + 16181: 0x6575, + 16182: 0x6EF4, + 16183: 0x72C4, + 16184: 0xF9FB, + 16185: 0x7684, + 16186: 0x7A4D, + 16187: 0x7B1B, + 16188: 0x7C4D, + 16189: 0x7E3E, + 16190: 0x7FDF, + 16191: 0x837B, + 16192: 0x8B2B, + 16193: 0x8CCA, + 16194: 0x8D64, + 16195: 0x8DE1, + 16196: 0x8E5F, + 16197: 0x8FEA, + 16198: 0x8FF9, + 16199: 0x9069, + 16200: 0x93D1, + 16201: 0x4F43, + 16202: 0x4F7A, + 16203: 0x50B3, + 16204: 0x5168, + 16205: 0x5178, + 16206: 0x524D, + 16207: 0x526A, + 16208: 0x5861, + 16209: 0x587C, + 16210: 0x5960, + 16211: 0x5C08, + 16212: 0x5C55, + 16213: 0x5EDB, + 16214: 0x609B, + 16215: 0x6230, + 16216: 0x6813, + 16217: 0x6BBF, + 16218: 0x6C08, + 16219: 0x6FB1, + 16220: 0x714E, + 16221: 0x7420, + 16222: 0x7530, + 16223: 0x7538, + 16224: 0x7551, + 16225: 0x7672, + 16226: 0x7B4C, + 16227: 0x7B8B, + 16228: 0x7BAD, + 16229: 0x7BC6, + 16230: 0x7E8F, + 16231: 0x8A6E, + 16232: 0x8F3E, + 16233: 0x8F49, + 16234: 0x923F, + 16235: 0x9293, + 16236: 0x9322, + 16237: 0x942B, + 16238: 0x96FB, + 16239: 0x985A, + 16240: 0x986B, + 16241: 0x991E, + 16242: 0x5207, + 16243: 0x622A, + 16244: 0x6298, + 16245: 0x6D59, + 16246: 0x7664, + 16247: 0x7ACA, + 16248: 0x7BC0, + 16249: 0x7D76, + 16250: 0x5360, + 16251: 0x5CBE, + 16252: 0x5E97, + 16253: 0x6F38, + 16254: 0x70B9, + 16255: 0x7C98, + 16256: 0x9711, + 16257: 0x9B8E, + 16258: 0x9EDE, + 16259: 0x63A5, + 16260: 0x647A, + 16261: 0x8776, + 16262: 0x4E01, + 16263: 0x4E95, + 16264: 0x4EAD, + 16265: 0x505C, + 16266: 0x5075, + 16267: 0x5448, + 16268: 0x59C3, + 16269: 0x5B9A, + 16270: 0x5E40, + 16271: 0x5EAD, + 16272: 0x5EF7, + 16273: 0x5F81, + 16274: 0x60C5, + 16275: 0x633A, + 16276: 0x653F, + 16277: 0x6574, + 16278: 0x65CC, + 16279: 0x6676, + 16280: 0x6678, + 16281: 0x67FE, + 16282: 0x6968, + 16283: 0x6A89, + 16284: 0x6B63, + 16285: 0x6C40, + 16286: 0x6DC0, + 16287: 0x6DE8, + 16288: 0x6E1F, + 16289: 0x6E5E, + 16290: 0x701E, + 16291: 0x70A1, + 16292: 0x738E, + 16293: 0x73FD, + 16294: 0x753A, + 16295: 0x775B, + 16296: 0x7887, + 16297: 0x798E, + 16298: 0x7A0B, + 16299: 0x7A7D, + 16300: 0x7CBE, + 16301: 0x7D8E, + 16302: 0x8247, + 16303: 0x8A02, + 16304: 0x8AEA, + 16305: 0x8C9E, + 16306: 0x912D, + 16307: 0x914A, + 16308: 0x91D8, + 16309: 0x9266, + 16310: 0x92CC, + 16311: 0x9320, + 16312: 0x9706, + 16313: 0x9756, + 16314: 0x975C, + 16315: 0x9802, + 16316: 0x9F0E, + 16317: 0x5236, + 16318: 0x5291, + 16319: 0x557C, + 16320: 0x5824, + 16321: 0x5E1D, + 16322: 0x5F1F, + 16323: 0x608C, + 16324: 0x63D0, + 16325: 0x68AF, + 16326: 0x6FDF, + 16327: 0x796D, + 16328: 0x7B2C, + 16329: 0x81CD, + 16330: 0x85BA, + 16331: 0x88FD, + 16332: 0x8AF8, + 16333: 0x8E44, + 16334: 0x918D, + 16335: 0x9664, + 16336: 0x969B, + 16337: 0x973D, + 16338: 0x984C, + 16339: 0x9F4A, + 16340: 0x4FCE, + 16341: 0x5146, + 16342: 0x51CB, + 16343: 0x52A9, + 16344: 0x5632, + 16345: 0x5F14, + 16346: 0x5F6B, + 16347: 0x63AA, + 16348: 0x64CD, + 16349: 0x65E9, + 16350: 0x6641, + 16351: 0x66FA, + 16352: 0x66F9, + 16353: 0x671D, + 16354: 0x689D, + 16355: 0x68D7, + 16356: 0x69FD, + 16357: 0x6F15, + 16358: 0x6F6E, + 16359: 0x7167, + 16360: 0x71E5, + 16361: 0x722A, + 16362: 0x74AA, + 16363: 0x773A, + 16364: 0x7956, + 16365: 0x795A, + 16366: 0x79DF, + 16367: 0x7A20, + 16368: 0x7A95, + 16369: 0x7C97, + 16370: 0x7CDF, + 16371: 0x7D44, + 16372: 0x7E70, + 16373: 0x8087, + 16374: 0x85FB, + 16375: 0x86A4, + 16376: 0x8A54, + 16377: 0x8ABF, + 16378: 0x8D99, + 16379: 0x8E81, + 16380: 0x9020, + 16381: 0x906D, + 16382: 0x91E3, + 16383: 0x963B, + 16384: 0x96D5, + 16385: 0x9CE5, + 16386: 0x65CF, + 16387: 0x7C07, + 16388: 0x8DB3, + 16389: 0x93C3, + 16390: 0x5B58, + 16391: 0x5C0A, + 16392: 0x5352, + 16393: 0x62D9, + 16394: 0x731D, + 16395: 0x5027, + 16396: 0x5B97, + 16397: 0x5F9E, + 16398: 0x60B0, + 16399: 0x616B, + 16400: 0x68D5, + 16401: 0x6DD9, + 16402: 0x742E, + 16403: 0x7A2E, + 16404: 0x7D42, + 16405: 0x7D9C, + 16406: 0x7E31, + 16407: 0x816B, + 16408: 0x8E2A, + 16409: 0x8E35, + 16410: 0x937E, + 16411: 0x9418, + 16412: 0x4F50, + 16413: 0x5750, + 16414: 0x5DE6, + 16415: 0x5EA7, + 16416: 0x632B, + 16417: 0x7F6A, + 16418: 0x4E3B, + 16419: 0x4F4F, + 16420: 0x4F8F, + 16421: 0x505A, + 16422: 0x59DD, + 16423: 0x80C4, + 16424: 0x546A, + 16425: 0x5468, + 16426: 0x55FE, + 16427: 0x594F, + 16428: 0x5B99, + 16429: 0x5DDE, + 16430: 0x5EDA, + 16431: 0x665D, + 16432: 0x6731, + 16433: 0x67F1, + 16434: 0x682A, + 16435: 0x6CE8, + 16436: 0x6D32, + 16437: 0x6E4A, + 16438: 0x6F8D, + 16439: 0x70B7, + 16440: 0x73E0, + 16441: 0x7587, + 16442: 0x7C4C, + 16443: 0x7D02, + 16444: 0x7D2C, + 16445: 0x7DA2, + 16446: 0x821F, + 16447: 0x86DB, + 16448: 0x8A3B, + 16449: 0x8A85, + 16450: 0x8D70, + 16451: 0x8E8A, + 16452: 0x8F33, + 16453: 0x9031, + 16454: 0x914E, + 16455: 0x9152, + 16456: 0x9444, + 16457: 0x99D0, + 16458: 0x7AF9, + 16459: 0x7CA5, + 16460: 0x4FCA, + 16461: 0x5101, + 16462: 0x51C6, + 16463: 0x57C8, + 16464: 0x5BEF, + 16465: 0x5CFB, + 16466: 0x6659, + 16467: 0x6A3D, + 16468: 0x6D5A, + 16469: 0x6E96, + 16470: 0x6FEC, + 16471: 0x710C, + 16472: 0x756F, + 16473: 0x7AE3, + 16474: 0x8822, + 16475: 0x9021, + 16476: 0x9075, + 16477: 0x96CB, + 16478: 0x99FF, + 16479: 0x8301, + 16480: 0x4E2D, + 16481: 0x4EF2, + 16482: 0x8846, + 16483: 0x91CD, + 16484: 0x537D, + 16485: 0x6ADB, + 16486: 0x696B, + 16487: 0x6C41, + 16488: 0x847A, + 16489: 0x589E, + 16490: 0x618E, + 16491: 0x66FE, + 16492: 0x62EF, + 16493: 0x70DD, + 16494: 0x7511, + 16495: 0x75C7, + 16496: 0x7E52, + 16497: 0x84B8, + 16498: 0x8B49, + 16499: 0x8D08, + 16500: 0x4E4B, + 16501: 0x53EA, + 16502: 0x54AB, + 16503: 0x5730, + 16504: 0x5740, + 16505: 0x5FD7, + 16506: 0x6301, + 16507: 0x6307, + 16508: 0x646F, + 16509: 0x652F, + 16510: 0x65E8, + 16511: 0x667A, + 16512: 0x679D, + 16513: 0x67B3, + 16514: 0x6B62, + 16515: 0x6C60, + 16516: 0x6C9A, + 16517: 0x6F2C, + 16518: 0x77E5, + 16519: 0x7825, + 16520: 0x7949, + 16521: 0x7957, + 16522: 0x7D19, + 16523: 0x80A2, + 16524: 0x8102, + 16525: 0x81F3, + 16526: 0x829D, + 16527: 0x82B7, + 16528: 0x8718, + 16529: 0x8A8C, + 16530: 0xF9FC, + 16531: 0x8D04, + 16532: 0x8DBE, + 16533: 0x9072, + 16534: 0x76F4, + 16535: 0x7A19, + 16536: 0x7A37, + 16537: 0x7E54, + 16538: 0x8077, + 16539: 0x5507, + 16540: 0x55D4, + 16541: 0x5875, + 16542: 0x632F, + 16543: 0x6422, + 16544: 0x6649, + 16545: 0x664B, + 16546: 0x686D, + 16547: 0x699B, + 16548: 0x6B84, + 16549: 0x6D25, + 16550: 0x6EB1, + 16551: 0x73CD, + 16552: 0x7468, + 16553: 0x74A1, + 16554: 0x755B, + 16555: 0x75B9, + 16556: 0x76E1, + 16557: 0x771E, + 16558: 0x778B, + 16559: 0x79E6, + 16560: 0x7E09, + 16561: 0x7E1D, + 16562: 0x81FB, + 16563: 0x852F, + 16564: 0x8897, + 16565: 0x8A3A, + 16566: 0x8CD1, + 16567: 0x8EEB, + 16568: 0x8FB0, + 16569: 0x9032, + 16570: 0x93AD, + 16571: 0x9663, + 16572: 0x9673, + 16573: 0x9707, + 16574: 0x4F84, + 16575: 0x53F1, + 16576: 0x59EA, + 16577: 0x5AC9, + 16578: 0x5E19, + 16579: 0x684E, + 16580: 0x74C6, + 16581: 0x75BE, + 16582: 0x79E9, + 16583: 0x7A92, + 16584: 0x81A3, + 16585: 0x86ED, + 16586: 0x8CEA, + 16587: 0x8DCC, + 16588: 0x8FED, + 16589: 0x659F, + 16590: 0x6715, + 16591: 0xF9FD, + 16592: 0x57F7, + 16593: 0x6F57, + 16594: 0x7DDD, + 16595: 0x8F2F, + 16596: 0x93F6, + 16597: 0x96C6, + 16598: 0x5FB5, + 16599: 0x61F2, + 16600: 0x6F84, + 16601: 0x4E14, + 16602: 0x4F98, + 16603: 0x501F, + 16604: 0x53C9, + 16605: 0x55DF, + 16606: 0x5D6F, + 16607: 0x5DEE, + 16608: 0x6B21, + 16609: 0x6B64, + 16610: 0x78CB, + 16611: 0x7B9A, + 16612: 0xF9FE, + 16613: 0x8E49, + 16614: 0x8ECA, + 16615: 0x906E, + 16616: 0x6349, + 16617: 0x643E, + 16618: 0x7740, + 16619: 0x7A84, + 16620: 0x932F, + 16621: 0x947F, + 16622: 0x9F6A, + 16623: 0x64B0, + 16624: 0x6FAF, + 16625: 0x71E6, + 16626: 0x74A8, + 16627: 0x74DA, + 16628: 0x7AC4, + 16629: 0x7C12, + 16630: 0x7E82, + 16631: 0x7CB2, + 16632: 0x7E98, + 16633: 0x8B9A, + 16634: 0x8D0A, + 16635: 0x947D, + 16636: 0x9910, + 16637: 0x994C, + 16638: 0x5239, + 16639: 0x5BDF, + 16640: 0x64E6, + 16641: 0x672D, + 16642: 0x7D2E, + 16643: 0x50ED, + 16644: 0x53C3, + 16645: 0x5879, + 16646: 0x6158, + 16647: 0x6159, + 16648: 0x61FA, + 16649: 0x65AC, + 16650: 0x7AD9, + 16651: 0x8B92, + 16652: 0x8B96, + 16653: 0x5009, + 16654: 0x5021, + 16655: 0x5275, + 16656: 0x5531, + 16657: 0x5A3C, + 16658: 0x5EE0, + 16659: 0x5F70, + 16660: 0x6134, + 16661: 0x655E, + 16662: 0x660C, + 16663: 0x6636, + 16664: 0x66A2, + 16665: 0x69CD, + 16666: 0x6EC4, + 16667: 0x6F32, + 16668: 0x7316, + 16669: 0x7621, + 16670: 0x7A93, + 16671: 0x8139, + 16672: 0x8259, + 16673: 0x83D6, + 16674: 0x84BC, + 16675: 0x50B5, + 16676: 0x57F0, + 16677: 0x5BC0, + 16678: 0x5BE8, + 16679: 0x5F69, + 16680: 0x63A1, + 16681: 0x7826, + 16682: 0x7DB5, + 16683: 0x83DC, + 16684: 0x8521, + 16685: 0x91C7, + 16686: 0x91F5, + 16687: 0x518A, + 16688: 0x67F5, + 16689: 0x7B56, + 16690: 0x8CAC, + 16691: 0x51C4, + 16692: 0x59BB, + 16693: 0x60BD, + 16694: 0x8655, + 16695: 0x501C, + 16696: 0xF9FF, + 16697: 0x5254, + 16698: 0x5C3A, + 16699: 0x617D, + 16700: 0x621A, + 16701: 0x62D3, + 16702: 0x64F2, + 16703: 0x65A5, + 16704: 0x6ECC, + 16705: 0x7620, + 16706: 0x810A, + 16707: 0x8E60, + 16708: 0x965F, + 16709: 0x96BB, + 16710: 0x4EDF, + 16711: 0x5343, + 16712: 0x5598, + 16713: 0x5929, + 16714: 0x5DDD, + 16715: 0x64C5, + 16716: 0x6CC9, + 16717: 0x6DFA, + 16718: 0x7394, + 16719: 0x7A7F, + 16720: 0x821B, + 16721: 0x85A6, + 16722: 0x8CE4, + 16723: 0x8E10, + 16724: 0x9077, + 16725: 0x91E7, + 16726: 0x95E1, + 16727: 0x9621, + 16728: 0x97C6, + 16729: 0x51F8, + 16730: 0x54F2, + 16731: 0x5586, + 16732: 0x5FB9, + 16733: 0x64A4, + 16734: 0x6F88, + 16735: 0x7DB4, + 16736: 0x8F1F, + 16737: 0x8F4D, + 16738: 0x9435, + 16739: 0x50C9, + 16740: 0x5C16, + 16741: 0x6CBE, + 16742: 0x6DFB, + 16743: 0x751B, + 16744: 0x77BB, + 16745: 0x7C3D, + 16746: 0x7C64, + 16747: 0x8A79, + 16748: 0x8AC2, + 16749: 0x581E, + 16750: 0x59BE, + 16751: 0x5E16, + 16752: 0x6377, + 16753: 0x7252, + 16754: 0x758A, + 16755: 0x776B, + 16756: 0x8ADC, + 16757: 0x8CBC, + 16758: 0x8F12, + 16759: 0x5EF3, + 16760: 0x6674, + 16761: 0x6DF8, + 16762: 0x807D, + 16763: 0x83C1, + 16764: 0x8ACB, + 16765: 0x9751, + 16766: 0x9BD6, + 16767: 0xFA00, + 16768: 0x5243, + 16769: 0x66FF, + 16770: 0x6D95, + 16771: 0x6EEF, + 16772: 0x7DE0, + 16773: 0x8AE6, + 16774: 0x902E, + 16775: 0x905E, + 16776: 0x9AD4, + 16777: 0x521D, + 16778: 0x527F, + 16779: 0x54E8, + 16780: 0x6194, + 16781: 0x6284, + 16782: 0x62DB, + 16783: 0x68A2, + 16784: 0x6912, + 16785: 0x695A, + 16786: 0x6A35, + 16787: 0x7092, + 16788: 0x7126, + 16789: 0x785D, + 16790: 0x7901, + 16791: 0x790E, + 16792: 0x79D2, + 16793: 0x7A0D, + 16794: 0x8096, + 16795: 0x8278, + 16796: 0x82D5, + 16797: 0x8349, + 16798: 0x8549, + 16799: 0x8C82, + 16800: 0x8D85, + 16801: 0x9162, + 16802: 0x918B, + 16803: 0x91AE, + 16804: 0x4FC3, + 16805: 0x56D1, + 16806: 0x71ED, + 16807: 0x77D7, + 16808: 0x8700, + 16809: 0x89F8, + 16810: 0x5BF8, + 16811: 0x5FD6, + 16812: 0x6751, + 16813: 0x90A8, + 16814: 0x53E2, + 16815: 0x585A, + 16816: 0x5BF5, + 16817: 0x60A4, + 16818: 0x6181, + 16819: 0x6460, + 16820: 0x7E3D, + 16821: 0x8070, + 16822: 0x8525, + 16823: 0x9283, + 16824: 0x64AE, + 16825: 0x50AC, + 16826: 0x5D14, + 16827: 0x6700, + 16828: 0x589C, + 16829: 0x62BD, + 16830: 0x63A8, + 16831: 0x690E, + 16832: 0x6978, + 16833: 0x6A1E, + 16834: 0x6E6B, + 16835: 0x76BA, + 16836: 0x79CB, + 16837: 0x82BB, + 16838: 0x8429, + 16839: 0x8ACF, + 16840: 0x8DA8, + 16841: 0x8FFD, + 16842: 0x9112, + 16843: 0x914B, + 16844: 0x919C, + 16845: 0x9310, + 16846: 0x9318, + 16847: 0x939A, + 16848: 0x96DB, + 16849: 0x9A36, + 16850: 0x9C0D, + 16851: 0x4E11, + 16852: 0x755C, + 16853: 0x795D, + 16854: 0x7AFA, + 16855: 0x7B51, + 16856: 0x7BC9, + 16857: 0x7E2E, + 16858: 0x84C4, + 16859: 0x8E59, + 16860: 0x8E74, + 16861: 0x8EF8, + 16862: 0x9010, + 16863: 0x6625, + 16864: 0x693F, + 16865: 0x7443, + 16866: 0x51FA, + 16867: 0x672E, + 16868: 0x9EDC, + 16869: 0x5145, + 16870: 0x5FE0, + 16871: 0x6C96, + 16872: 0x87F2, + 16873: 0x885D, + 16874: 0x8877, + 16875: 0x60B4, + 16876: 0x81B5, + 16877: 0x8403, + 16878: 0x8D05, + 16879: 0x53D6, + 16880: 0x5439, + 16881: 0x5634, + 16882: 0x5A36, + 16883: 0x5C31, + 16884: 0x708A, + 16885: 0x7FE0, + 16886: 0x805A, + 16887: 0x8106, + 16888: 0x81ED, + 16889: 0x8DA3, + 16890: 0x9189, + 16891: 0x9A5F, + 16892: 0x9DF2, + 16893: 0x5074, + 16894: 0x4EC4, + 16895: 0x53A0, + 16896: 0x60FB, + 16897: 0x6E2C, + 16898: 0x5C64, + 16899: 0x4F88, + 16900: 0x5024, + 16901: 0x55E4, + 16902: 0x5CD9, + 16903: 0x5E5F, + 16904: 0x6065, + 16905: 0x6894, + 16906: 0x6CBB, + 16907: 0x6DC4, + 16908: 0x71BE, + 16909: 0x75D4, + 16910: 0x75F4, + 16911: 0x7661, + 16912: 0x7A1A, + 16913: 0x7A49, + 16914: 0x7DC7, + 16915: 0x7DFB, + 16916: 0x7F6E, + 16917: 0x81F4, + 16918: 0x86A9, + 16919: 0x8F1C, + 16920: 0x96C9, + 16921: 0x99B3, + 16922: 0x9F52, + 16923: 0x5247, + 16924: 0x52C5, + 16925: 0x98ED, + 16926: 0x89AA, + 16927: 0x4E03, + 16928: 0x67D2, + 16929: 0x6F06, + 16930: 0x4FB5, + 16931: 0x5BE2, + 16932: 0x6795, + 16933: 0x6C88, + 16934: 0x6D78, + 16935: 0x741B, + 16936: 0x7827, + 16937: 0x91DD, + 16938: 0x937C, + 16939: 0x87C4, + 16940: 0x79E4, + 16941: 0x7A31, + 16942: 0x5FEB, + 16943: 0x4ED6, + 16944: 0x54A4, + 16945: 0x553E, + 16946: 0x58AE, + 16947: 0x59A5, + 16948: 0x60F0, + 16949: 0x6253, + 16950: 0x62D6, + 16951: 0x6736, + 16952: 0x6955, + 16953: 0x8235, + 16954: 0x9640, + 16955: 0x99B1, + 16956: 0x99DD, + 16957: 0x502C, + 16958: 0x5353, + 16959: 0x5544, + 16960: 0x577C, + 16961: 0xFA01, + 16962: 0x6258, + 16963: 0xFA02, + 16964: 0x64E2, + 16965: 0x666B, + 16966: 0x67DD, + 16967: 0x6FC1, + 16968: 0x6FEF, + 16969: 0x7422, + 16970: 0x7438, + 16971: 0x8A17, + 16972: 0x9438, + 16973: 0x5451, + 16974: 0x5606, + 16975: 0x5766, + 16976: 0x5F48, + 16977: 0x619A, + 16978: 0x6B4E, + 16979: 0x7058, + 16980: 0x70AD, + 16981: 0x7DBB, + 16982: 0x8A95, + 16983: 0x596A, + 16984: 0x812B, + 16985: 0x63A2, + 16986: 0x7708, + 16987: 0x803D, + 16988: 0x8CAA, + 16989: 0x5854, + 16990: 0x642D, + 16991: 0x69BB, + 16992: 0x5B95, + 16993: 0x5E11, + 16994: 0x6E6F, + 16995: 0xFA03, + 16996: 0x8569, + 16997: 0x514C, + 16998: 0x53F0, + 16999: 0x592A, + 17000: 0x6020, + 17001: 0x614B, + 17002: 0x6B86, + 17003: 0x6C70, + 17004: 0x6CF0, + 17005: 0x7B1E, + 17006: 0x80CE, + 17007: 0x82D4, + 17008: 0x8DC6, + 17009: 0x90B0, + 17010: 0x98B1, + 17011: 0xFA04, + 17012: 0x64C7, + 17013: 0x6FA4, + 17014: 0x6491, + 17015: 0x6504, + 17016: 0x514E, + 17017: 0x5410, + 17018: 0x571F, + 17019: 0x8A0E, + 17020: 0x615F, + 17021: 0x6876, + 17022: 0xFA05, + 17023: 0x75DB, + 17024: 0x7B52, + 17025: 0x7D71, + 17026: 0x901A, + 17027: 0x5806, + 17028: 0x69CC, + 17029: 0x817F, + 17030: 0x892A, + 17031: 0x9000, + 17032: 0x9839, + 17033: 0x5078, + 17034: 0x5957, + 17035: 0x59AC, + 17036: 0x6295, + 17037: 0x900F, + 17038: 0x9B2A, + 17039: 0x615D, + 17040: 0x7279, + 17041: 0x95D6, + 17042: 0x5761, + 17043: 0x5A46, + 17044: 0x5DF4, + 17045: 0x628A, + 17046: 0x64AD, + 17047: 0x64FA, + 17048: 0x6777, + 17049: 0x6CE2, + 17050: 0x6D3E, + 17051: 0x722C, + 17052: 0x7436, + 17053: 0x7834, + 17054: 0x7F77, + 17055: 0x82AD, + 17056: 0x8DDB, + 17057: 0x9817, + 17058: 0x5224, + 17059: 0x5742, + 17060: 0x677F, + 17061: 0x7248, + 17062: 0x74E3, + 17063: 0x8CA9, + 17064: 0x8FA6, + 17065: 0x9211, + 17066: 0x962A, + 17067: 0x516B, + 17068: 0x53ED, + 17069: 0x634C, + 17070: 0x4F69, + 17071: 0x5504, + 17072: 0x6096, + 17073: 0x6557, + 17074: 0x6C9B, + 17075: 0x6D7F, + 17076: 0x724C, + 17077: 0x72FD, + 17078: 0x7A17, + 17079: 0x8987, + 17080: 0x8C9D, + 17081: 0x5F6D, + 17082: 0x6F8E, + 17083: 0x70F9, + 17084: 0x81A8, + 17085: 0x610E, + 17086: 0x4FBF, + 17087: 0x504F, + 17088: 0x6241, + 17089: 0x7247, + 17090: 0x7BC7, + 17091: 0x7DE8, + 17092: 0x7FE9, + 17093: 0x904D, + 17094: 0x97AD, + 17095: 0x9A19, + 17096: 0x8CB6, + 17097: 0x576A, + 17098: 0x5E73, + 17099: 0x67B0, + 17100: 0x840D, + 17101: 0x8A55, + 17102: 0x5420, + 17103: 0x5B16, + 17104: 0x5E63, + 17105: 0x5EE2, + 17106: 0x5F0A, + 17107: 0x6583, + 17108: 0x80BA, + 17109: 0x853D, + 17110: 0x9589, + 17111: 0x965B, + 17112: 0x4F48, + 17113: 0x5305, + 17114: 0x530D, + 17115: 0x530F, + 17116: 0x5486, + 17117: 0x54FA, + 17118: 0x5703, + 17119: 0x5E03, + 17120: 0x6016, + 17121: 0x629B, + 17122: 0x62B1, + 17123: 0x6355, + 17124: 0xFA06, + 17125: 0x6CE1, + 17126: 0x6D66, + 17127: 0x75B1, + 17128: 0x7832, + 17129: 0x80DE, + 17130: 0x812F, + 17131: 0x82DE, + 17132: 0x8461, + 17133: 0x84B2, + 17134: 0x888D, + 17135: 0x8912, + 17136: 0x900B, + 17137: 0x92EA, + 17138: 0x98FD, + 17139: 0x9B91, + 17140: 0x5E45, + 17141: 0x66B4, + 17142: 0x66DD, + 17143: 0x7011, + 17144: 0x7206, + 17145: 0xFA07, + 17146: 0x4FF5, + 17147: 0x527D, + 17148: 0x5F6A, + 17149: 0x6153, + 17150: 0x6753, + 17151: 0x6A19, + 17152: 0x6F02, + 17153: 0x74E2, + 17154: 0x7968, + 17155: 0x8868, + 17156: 0x8C79, + 17157: 0x98C7, + 17158: 0x98C4, + 17159: 0x9A43, + 17160: 0x54C1, + 17161: 0x7A1F, + 17162: 0x6953, + 17163: 0x8AF7, + 17164: 0x8C4A, + 17165: 0x98A8, + 17166: 0x99AE, + 17167: 0x5F7C, + 17168: 0x62AB, + 17169: 0x75B2, + 17170: 0x76AE, + 17171: 0x88AB, + 17172: 0x907F, + 17173: 0x9642, + 17174: 0x5339, + 17175: 0x5F3C, + 17176: 0x5FC5, + 17177: 0x6CCC, + 17178: 0x73CC, + 17179: 0x7562, + 17180: 0x758B, + 17181: 0x7B46, + 17182: 0x82FE, + 17183: 0x999D, + 17184: 0x4E4F, + 17185: 0x903C, + 17186: 0x4E0B, + 17187: 0x4F55, + 17188: 0x53A6, + 17189: 0x590F, + 17190: 0x5EC8, + 17191: 0x6630, + 17192: 0x6CB3, + 17193: 0x7455, + 17194: 0x8377, + 17195: 0x8766, + 17196: 0x8CC0, + 17197: 0x9050, + 17198: 0x971E, + 17199: 0x9C15, + 17200: 0x58D1, + 17201: 0x5B78, + 17202: 0x8650, + 17203: 0x8B14, + 17204: 0x9DB4, + 17205: 0x5BD2, + 17206: 0x6068, + 17207: 0x608D, + 17208: 0x65F1, + 17209: 0x6C57, + 17210: 0x6F22, + 17211: 0x6FA3, + 17212: 0x701A, + 17213: 0x7F55, + 17214: 0x7FF0, + 17215: 0x9591, + 17216: 0x9592, + 17217: 0x9650, + 17218: 0x97D3, + 17219: 0x5272, + 17220: 0x8F44, + 17221: 0x51FD, + 17222: 0x542B, + 17223: 0x54B8, + 17224: 0x5563, + 17225: 0x558A, + 17226: 0x6ABB, + 17227: 0x6DB5, + 17228: 0x7DD8, + 17229: 0x8266, + 17230: 0x929C, + 17231: 0x9677, + 17232: 0x9E79, + 17233: 0x5408, + 17234: 0x54C8, + 17235: 0x76D2, + 17236: 0x86E4, + 17237: 0x95A4, + 17238: 0x95D4, + 17239: 0x965C, + 17240: 0x4EA2, + 17241: 0x4F09, + 17242: 0x59EE, + 17243: 0x5AE6, + 17244: 0x5DF7, + 17245: 0x6052, + 17246: 0x6297, + 17247: 0x676D, + 17248: 0x6841, + 17249: 0x6C86, + 17250: 0x6E2F, + 17251: 0x7F38, + 17252: 0x809B, + 17253: 0x822A, + 17254: 0xFA08, + 17255: 0xFA09, + 17256: 0x9805, + 17257: 0x4EA5, + 17258: 0x5055, + 17259: 0x54B3, + 17260: 0x5793, + 17261: 0x595A, + 17262: 0x5B69, + 17263: 0x5BB3, + 17264: 0x61C8, + 17265: 0x6977, + 17266: 0x6D77, + 17267: 0x7023, + 17268: 0x87F9, + 17269: 0x89E3, + 17270: 0x8A72, + 17271: 0x8AE7, + 17272: 0x9082, + 17273: 0x99ED, + 17274: 0x9AB8, + 17275: 0x52BE, + 17276: 0x6838, + 17277: 0x5016, + 17278: 0x5E78, + 17279: 0x674F, + 17280: 0x8347, + 17281: 0x884C, + 17282: 0x4EAB, + 17283: 0x5411, + 17284: 0x56AE, + 17285: 0x73E6, + 17286: 0x9115, + 17287: 0x97FF, + 17288: 0x9909, + 17289: 0x9957, + 17290: 0x9999, + 17291: 0x5653, + 17292: 0x589F, + 17293: 0x865B, + 17294: 0x8A31, + 17295: 0x61B2, + 17296: 0x6AF6, + 17297: 0x737B, + 17298: 0x8ED2, + 17299: 0x6B47, + 17300: 0x96AA, + 17301: 0x9A57, + 17302: 0x5955, + 17303: 0x7200, + 17304: 0x8D6B, + 17305: 0x9769, + 17306: 0x4FD4, + 17307: 0x5CF4, + 17308: 0x5F26, + 17309: 0x61F8, + 17310: 0x665B, + 17311: 0x6CEB, + 17312: 0x70AB, + 17313: 0x7384, + 17314: 0x73B9, + 17315: 0x73FE, + 17316: 0x7729, + 17317: 0x774D, + 17318: 0x7D43, + 17319: 0x7D62, + 17320: 0x7E23, + 17321: 0x8237, + 17322: 0x8852, + 17323: 0xFA0A, + 17324: 0x8CE2, + 17325: 0x9249, + 17326: 0x986F, + 17327: 0x5B51, + 17328: 0x7A74, + 17329: 0x8840, + 17330: 0x9801, + 17331: 0x5ACC, + 17332: 0x4FE0, + 17333: 0x5354, + 17334: 0x593E, + 17335: 0x5CFD, + 17336: 0x633E, + 17337: 0x6D79, + 17338: 0x72F9, + 17339: 0x8105, + 17340: 0x8107, + 17341: 0x83A2, + 17342: 0x92CF, + 17343: 0x9830, + 17344: 0x4EA8, + 17345: 0x5144, + 17346: 0x5211, + 17347: 0x578B, + 17348: 0x5F62, + 17349: 0x6CC2, + 17350: 0x6ECE, + 17351: 0x7005, + 17352: 0x7050, + 17353: 0x70AF, + 17354: 0x7192, + 17355: 0x73E9, + 17356: 0x7469, + 17357: 0x834A, + 17358: 0x87A2, + 17359: 0x8861, + 17360: 0x9008, + 17361: 0x90A2, + 17362: 0x93A3, + 17363: 0x99A8, + 17364: 0x516E, + 17365: 0x5F57, + 17366: 0x60E0, + 17367: 0x6167, + 17368: 0x66B3, + 17369: 0x8559, + 17370: 0x8E4A, + 17371: 0x91AF, + 17372: 0x978B, + 17373: 0x4E4E, + 17374: 0x4E92, + 17375: 0x547C, + 17376: 0x58D5, + 17377: 0x58FA, + 17378: 0x597D, + 17379: 0x5CB5, + 17380: 0x5F27, + 17381: 0x6236, + 17382: 0x6248, + 17383: 0x660A, + 17384: 0x6667, + 17385: 0x6BEB, + 17386: 0x6D69, + 17387: 0x6DCF, + 17388: 0x6E56, + 17389: 0x6EF8, + 17390: 0x6F94, + 17391: 0x6FE0, + 17392: 0x6FE9, + 17393: 0x705D, + 17394: 0x72D0, + 17395: 0x7425, + 17396: 0x745A, + 17397: 0x74E0, + 17398: 0x7693, + 17399: 0x795C, + 17400: 0x7CCA, + 17401: 0x7E1E, + 17402: 0x80E1, + 17403: 0x82A6, + 17404: 0x846B, + 17405: 0x84BF, + 17406: 0x864E, + 17407: 0x865F, + 17408: 0x8774, + 17409: 0x8B77, + 17410: 0x8C6A, + 17411: 0x93AC, + 17412: 0x9800, + 17413: 0x9865, + 17414: 0x60D1, + 17415: 0x6216, + 17416: 0x9177, + 17417: 0x5A5A, + 17418: 0x660F, + 17419: 0x6DF7, + 17420: 0x6E3E, + 17421: 0x743F, + 17422: 0x9B42, + 17423: 0x5FFD, + 17424: 0x60DA, + 17425: 0x7B0F, + 17426: 0x54C4, + 17427: 0x5F18, + 17428: 0x6C5E, + 17429: 0x6CD3, + 17430: 0x6D2A, + 17431: 0x70D8, + 17432: 0x7D05, + 17433: 0x8679, + 17434: 0x8A0C, + 17435: 0x9D3B, + 17436: 0x5316, + 17437: 0x548C, + 17438: 0x5B05, + 17439: 0x6A3A, + 17440: 0x706B, + 17441: 0x7575, + 17442: 0x798D, + 17443: 0x79BE, + 17444: 0x82B1, + 17445: 0x83EF, + 17446: 0x8A71, + 17447: 0x8B41, + 17448: 0x8CA8, + 17449: 0x9774, + 17450: 0xFA0B, + 17451: 0x64F4, + 17452: 0x652B, + 17453: 0x78BA, + 17454: 0x78BB, + 17455: 0x7A6B, + 17456: 0x4E38, + 17457: 0x559A, + 17458: 0x5950, + 17459: 0x5BA6, + 17460: 0x5E7B, + 17461: 0x60A3, + 17462: 0x63DB, + 17463: 0x6B61, + 17464: 0x6665, + 17465: 0x6853, + 17466: 0x6E19, + 17467: 0x7165, + 17468: 0x74B0, + 17469: 0x7D08, + 17470: 0x9084, + 17471: 0x9A69, + 17472: 0x9C25, + 17473: 0x6D3B, + 17474: 0x6ED1, + 17475: 0x733E, + 17476: 0x8C41, + 17477: 0x95CA, + 17478: 0x51F0, + 17479: 0x5E4C, + 17480: 0x5FA8, + 17481: 0x604D, + 17482: 0x60F6, + 17483: 0x6130, + 17484: 0x614C, + 17485: 0x6643, + 17486: 0x6644, + 17487: 0x69A5, + 17488: 0x6CC1, + 17489: 0x6E5F, + 17490: 0x6EC9, + 17491: 0x6F62, + 17492: 0x714C, + 17493: 0x749C, + 17494: 0x7687, + 17495: 0x7BC1, + 17496: 0x7C27, + 17497: 0x8352, + 17498: 0x8757, + 17499: 0x9051, + 17500: 0x968D, + 17501: 0x9EC3, + 17502: 0x532F, + 17503: 0x56DE, + 17504: 0x5EFB, + 17505: 0x5F8A, + 17506: 0x6062, + 17507: 0x6094, + 17508: 0x61F7, + 17509: 0x6666, + 17510: 0x6703, + 17511: 0x6A9C, + 17512: 0x6DEE, + 17513: 0x6FAE, + 17514: 0x7070, + 17515: 0x736A, + 17516: 0x7E6A, + 17517: 0x81BE, + 17518: 0x8334, + 17519: 0x86D4, + 17520: 0x8AA8, + 17521: 0x8CC4, + 17522: 0x5283, + 17523: 0x7372, + 17524: 0x5B96, + 17525: 0x6A6B, + 17526: 0x9404, + 17527: 0x54EE, + 17528: 0x5686, + 17529: 0x5B5D, + 17530: 0x6548, + 17531: 0x6585, + 17532: 0x66C9, + 17533: 0x689F, + 17534: 0x6D8D, + 17535: 0x6DC6, + 17536: 0x723B, + 17537: 0x80B4, + 17538: 0x9175, + 17539: 0x9A4D, + 17540: 0x4FAF, + 17541: 0x5019, + 17542: 0x539A, + 17543: 0x540E, + 17544: 0x543C, + 17545: 0x5589, + 17546: 0x55C5, + 17547: 0x5E3F, + 17548: 0x5F8C, + 17549: 0x673D, + 17550: 0x7166, + 17551: 0x73DD, + 17552: 0x9005, + 17553: 0x52DB, + 17554: 0x52F3, + 17555: 0x5864, + 17556: 0x58CE, + 17557: 0x7104, + 17558: 0x718F, + 17559: 0x71FB, + 17560: 0x85B0, + 17561: 0x8A13, + 17562: 0x6688, + 17563: 0x85A8, + 17564: 0x55A7, + 17565: 0x6684, + 17566: 0x714A, + 17567: 0x8431, + 17568: 0x5349, + 17569: 0x5599, + 17570: 0x6BC1, + 17571: 0x5F59, + 17572: 0x5FBD, + 17573: 0x63EE, + 17574: 0x6689, + 17575: 0x7147, + 17576: 0x8AF1, + 17577: 0x8F1D, + 17578: 0x9EBE, + 17579: 0x4F11, + 17580: 0x643A, + 17581: 0x70CB, + 17582: 0x7566, + 17583: 0x8667, + 17584: 0x6064, + 17585: 0x8B4E, + 17586: 0x9DF8, + 17587: 0x5147, + 17588: 0x51F6, + 17589: 0x5308, + 17590: 0x6D36, + 17591: 0x80F8, + 17592: 0x9ED1, + 17593: 0x6615, + 17594: 0x6B23, + 17595: 0x7098, + 17596: 0x75D5, + 17597: 0x5403, + 17598: 0x5C79, + 17599: 0x7D07, + 17600: 0x8A16, + 17601: 0x6B20, + 17602: 0x6B3D, + 17603: 0x6B46, + 17604: 0x5438, + 17605: 0x6070, + 17606: 0x6D3D, + 17607: 0x7FD5, + 17608: 0x8208, + 17609: 0x50D6, + 17610: 0x51DE, + 17611: 0x559C, + 17612: 0x566B, + 17613: 0x56CD, + 17614: 0x59EC, + 17615: 0x5B09, + 17616: 0x5E0C, + 17617: 0x6199, + 17618: 0x6198, + 17619: 0x6231, + 17620: 0x665E, + 17621: 0x66E6, + 17622: 0x7199, + 17623: 0x71B9, + 17624: 0x71BA, + 17625: 0x72A7, + 17626: 0x79A7, + 17627: 0x7A00, + 17628: 0x7FB2, + 17629: 0x8A70, +} + +const numEncodeTables = 7 + +// encodeX are the encoding tables from Unicode to EUC-KR code, +// sorted by decreasing length. +// encode0: 20893 entries for runes in [19968, 40861). +// encode1: 11172 entries for runes in [44032, 55204). +// encode2: 1625 entries for runes in [ 8213, 9838). +// encode3: 990 entries for runes in [12288, 13278). +// encode4: 945 entries for runes in [ 161, 1106). +// encode5: 268 entries for runes in [63744, 64012). +// encode6: 230 entries for runes in [65281, 65511). + +const encode0Low, encode0High = 19968, 40861 + +var encode0 = [...]uint16{ + 19968 - 19968: 0xECE9, + 19969 - 19968: 0xEFCB, + 19971 - 19968: 0xF6D2, + 19975 - 19968: 0xD8B2, + 19976 - 19968: 0xEDDB, + 19977 - 19968: 0xDFB2, + 19978 - 19968: 0xDFBE, + 19979 - 19968: 0xF9BB, + 19981 - 19968: 0xDCF4, + 19985 - 19968: 0xF5E4, + 19988 - 19968: 0xF3A6, + 19989 - 19968: 0xDDE0, + 19990 - 19968: 0xE1A6, + 19992 - 19968: 0xCEF8, + 19993 - 19968: 0xDCB0, + 19998 - 19968: 0xE3AA, + 20013 - 19968: 0xF1E9, + 20018 - 19968: 0xCDFA, + 20024 - 19968: 0xFCAF, + 20025 - 19968: 0xD3A1, + 20027 - 19968: 0xF1AB, + 20034 - 19968: 0xE7D1, + 20035 - 19968: 0xD2AC, + 20037 - 19968: 0xCEF9, + 20043 - 19968: 0xF1FD, + 20045 - 19968: 0xDEBF, + 20046 - 19968: 0xFBBA, + 20047 - 19968: 0xF9B9, + 20054 - 19968: 0xCED2, + 20056 - 19968: 0xE3AB, + 20057 - 19968: 0xEBE0, + 20061 - 19968: 0xCEFA, + 20062 - 19968: 0xCBF7, + 20063 - 19968: 0xE5A5, + 20075 - 19968: 0xCAE1, + 20077 - 19968: 0xD4CC, + 20083 - 19968: 0xEAE1, + 20086 - 19968: 0xDCE3, + 20087 - 19968: 0xDFAD, + 20094 - 19968: 0xCBEB, + 20098 - 19968: 0xD5AF, + 20102 - 19968: 0xD6F5, + 20104 - 19968: 0xE5F8, + 20107 - 19968: 0xDEC0, + 20108 - 19968: 0xECA3, + 20110 - 19968: 0xE9CD, + 20112 - 19968: 0xEAA7, + 20113 - 19968: 0xE9F6, + 20114 - 19968: 0xFBBB, + 20116 - 19968: 0xE7E9, + 20117 - 19968: 0xEFCC, + 20120 - 19968: 0xD0E6, + 20123 - 19968: 0xDEC1, + 20126 - 19968: 0xE4AC, + 20129 - 19968: 0xD8CC, + 20130 - 19968: 0xF9F1, + 20132 - 19968: 0xCEDF, + 20133 - 19968: 0xFAA4, + 20134 - 19968: 0xE6B2, + 20136 - 19968: 0xFAFB, + 20139 - 19968: 0xFABD, + 20140 - 19968: 0xCCC8, + 20141 - 19968: 0xEFCD, + 20142 - 19968: 0xD5D5, + 20150 - 19968: 0xD3A2, + 20154 - 19968: 0xECD1, + 20160 - 19968: 0xE4A7, + 20161 - 19968: 0xECD2, + 20164 - 19968: 0xF6B1, + 20167 - 19968: 0xCEFB, + 20170 - 19968: 0xD0D1, + 20171 - 19968: 0xCBBF, + 20173 - 19968: 0xEDA4, + 20180 - 19968: 0xEDA8, + 20181 - 19968: 0xDEC2, + 20182 - 19968: 0xF6E2, + 20183 - 19968: 0xEDDC, + 20184 - 19968: 0xDCF5, + 20185 - 19968: 0xE0B9, + 20189 - 19968: 0xD4CE, + 20191 - 19968: 0xF4B5, + 20195 - 19968: 0xD3DB, + 20196 - 19968: 0xD6B5, + 20197 - 19968: 0xECA4, + 20208 - 19968: 0xE4E6, + 20210 - 19968: 0xF1EA, + 20214 - 19968: 0xCBEC, + 20215 - 19968: 0xCBC0, + 20219 - 19968: 0xECF2, + 20225 - 19968: 0xD0EA, + 20233 - 19968: 0xF9F2, + 20234 - 19968: 0xECA5, + 20235 - 19968: 0xD0DF, + 20237 - 19968: 0xE7EA, + 20238 - 19968: 0xD0EB, + 20239 - 19968: 0xDCD1, + 20240 - 19968: 0xDBE9, + 20241 - 19968: 0xFDCC, + 20271 - 19968: 0xDBD7, + 20276 - 19968: 0xDAE1, + 20278 - 19968: 0xD6B6, + 20280 - 19968: 0xE3DF, + 20282 - 19968: 0xDEC3, + 20284 - 19968: 0xDEC4, + 20285 - 19968: 0xCAA1, + 20291 - 19968: 0xEEEC, + 20294 - 19968: 0xD3A3, + 20295 - 19968: 0xEEB7, + 20296 - 19968: 0xF8CF, + 20301 - 19968: 0xEAC8, + 20302 - 19968: 0xEEB8, + 20303 - 19968: 0xF1AC, + 20304 - 19968: 0xF1A5, + 20305 - 19968: 0xE9CE, + 20309 - 19968: 0xF9BC, + 20313 - 19968: 0xE5F9, + 20314 - 19968: 0xECEA, + 20315 - 19968: 0xDDD6, + 20316 - 19968: 0xEDC2, + 20329 - 19968: 0xF8A5, + 20335 - 19968: 0xE5BA, + 20336 - 19968: 0xDBD8, + 20339 - 19968: 0xCAA2, + 20342 - 19968: 0xD1CD, + 20346 - 19968: 0xEEED, + 20350 - 19968: 0xECEB, + 20351 - 19968: 0xDEC5, + 20353 - 19968: 0xE3E0, + 20355 - 19968: 0xCAC9, + 20356 - 19968: 0xF2E9, + 20358 - 19968: 0xD5CE, + 20360 - 19968: 0xF6B6, + 20362 - 19968: 0xCEC2, + 20363 - 19968: 0xD6C7, + 20365 - 19968: 0xE3B4, + 20367 - 19968: 0xF1AD, + 20369 - 19968: 0xEAE2, + 20374 - 19968: 0xD7C2, + 20376 - 19968: 0xF3A7, + 20379 - 19968: 0xCDEA, + 20381 - 19968: 0xEBEE, + 20398 - 19968: 0xD9B2, + 20399 - 19968: 0xFDA5, + 20405 - 19968: 0xF6D5, + 20406 - 19968: 0xD5E2, + 20415 - 19968: 0xF8B5, + 20418 - 19968: 0xCCF5, + 20419 - 19968: 0xF5B5, + 20420 - 19968: 0xE4AD, + 20425 - 19968: 0xE7EB, + 20426 - 19968: 0xF1D5, + 20430 - 19968: 0xF0BB, + 20433 - 19968: 0xE9B5, + 20435 - 19968: 0xCCC9, + 20436 - 19968: 0xFAD5, + 20439 - 19968: 0xE1D4, + 20442 - 19968: 0xD7D6, + 20445 - 19968: 0xDCC1, + 20447 - 19968: 0xDEC6, + 20448 - 19968: 0xFAEF, + 20449 - 19968: 0xE3E1, + 20462 - 19968: 0xE1F3, + 20463 - 19968: 0xDCF6, + 20465 - 19968: 0xCEFC, + 20467 - 19968: 0xDBC4, + 20469 - 19968: 0xF8F1, + 20472 - 19968: 0xDCE4, + 20474 - 19968: 0xE5EF, + 20482 - 19968: 0xDCB1, + 20486 - 19968: 0xD5D6, + 20489 - 19968: 0xF3DA, + 20491 - 19968: 0xCBC1, + 20493 - 19968: 0xDBC3, + 20497 - 19968: 0xD9FA, + 20498 - 19968: 0xD3EE, + 20502 - 19968: 0xFAB8, + 20505 - 19968: 0xFDA6, + 20506 - 19968: 0xEBEF, + 20508 - 19968: 0xF4A6, + 20510 - 19968: 0xCCCA, + 20511 - 19968: 0xF3A8, + 20513 - 19968: 0xF3DB, + 20515 - 19968: 0xDBA7, + 20516 - 19968: 0xF6B7, + 20518 - 19968: 0xCFE6, + 20519 - 19968: 0xF0F2, + 20520 - 19968: 0xCBDA, + 20522 - 19968: 0xE7D2, + 20523 - 19968: 0xD7C3, + 20524 - 19968: 0xF6F0, + 20525 - 19968: 0xE8DE, + 20539 - 19968: 0xE5A6, + 20547 - 19968: 0xE5E7, + 20551 - 19968: 0xCAA3, + 20552 - 19968: 0xCCA7, + 20553 - 19968: 0xEAC9, + 20559 - 19968: 0xF8B6, + 20565 - 19968: 0xFAA5, + 20570 - 19968: 0xF1AE, + 20572 - 19968: 0xEFCE, + 20581 - 19968: 0xCBED, + 20596 - 19968: 0xF6B0, + 20597 - 19968: 0xEFCF, + 20598 - 19968: 0xE9CF, + 20600 - 19968: 0xF7DE, + 20608 - 19968: 0xCED3, + 20613 - 19968: 0xDCF7, + 20621 - 19968: 0xDBA8, + 20625 - 19968: 0xCBF8, + 20632 - 19968: 0xDFA1, + 20633 - 19968: 0xDDE1, + 20652 - 19968: 0xF5CA, + 20653 - 19968: 0xE9B6, + 20658 - 19968: 0xE7EC, + 20659 - 19968: 0xEEEE, + 20661 - 19968: 0xF3F0, + 20663 - 19968: 0xDFBF, + 20670 - 19968: 0xCCCB, + 20677 - 19968: 0xD0C1, + 20681 - 19968: 0xF4D2, + 20682 - 19968: 0xE0BA, + 20687 - 19968: 0xDFC0, + 20689 - 19968: 0xCEE0, + 20693 - 19968: 0xDCD2, + 20694 - 19968: 0xFDEA, + 20698 - 19968: 0xD6F6, + 20702 - 19968: 0xEACA, + 20709 - 19968: 0xE8E9, + 20711 - 19968: 0xE3AC, + 20717 - 19968: 0xF3D0, + 20729 - 19968: 0xCAA4, + 20731 - 19968: 0xDBF8, + 20735 - 19968: 0xDEC7, + 20736 - 19968: 0xEBF0, + 20737 - 19968: 0xF1D6, + 20740 - 19968: 0xE5E2, + 20742 - 19968: 0xCCCC, + 20745 - 19968: 0xCBFB, + 20754 - 19968: 0xEAE3, + 20767 - 19968: 0xDFC1, + 20769 - 19968: 0xD6ED, + 20778 - 19968: 0xE9D0, + 20786 - 19968: 0xEEB9, + 20791 - 19968: 0xD5E3, + 20794 - 19968: 0xD1D3, + 20796 - 19968: 0xE5F0, + 20800 - 19968: 0xE8B4, + 20801 - 19968: 0xEBC3, + 20803 - 19968: 0xEAAA, + 20804 - 19968: 0xFAFC, + 20805 - 19968: 0xF5F6, + 20806 - 19968: 0xF0BC, + 20807 - 19968: 0xFDD4, + 20808 - 19968: 0xE0BB, + 20809 - 19968: 0xCEC3, + 20811 - 19968: 0xD0BA, + 20812 - 19968: 0xF7BA, + 20813 - 19968: 0xD8F3, + 20814 - 19968: 0xF7CD, + 20818 - 19968: 0xE4AE, + 20828 - 19968: 0xD4DF, + 20834 - 19968: 0xD0E7, + 20837 - 19968: 0xECFD, + 20839 - 19968: 0xD2AE, + 20840 - 19968: 0xEEEF, + 20841 - 19968: 0xD5D7, + 20842 - 19968: 0xEAE4, + 20843 - 19968: 0xF8A2, + 20844 - 19968: 0xCDEB, + 20845 - 19968: 0xD7BF, + 20846 - 19968: 0xFBB1, + 20849 - 19968: 0xCDEC, + 20853 - 19968: 0xDCB2, + 20854 - 19968: 0xD0EC, + 20855 - 19968: 0xCEFD, + 20856 - 19968: 0xEEF0, + 20860 - 19968: 0xCCC2, + 20864 - 19968: 0xD0ED, + 20870 - 19968: 0xE5F7, + 20874 - 19968: 0xF3FC, + 20877 - 19968: 0xEEA2, + 20882 - 19968: 0xD9B3, + 20885 - 19968: 0xD8F4, + 20887 - 19968: 0xE9B7, + 20896 - 19968: 0xCEAE, + 20901 - 19968: 0xD9A2, + 20906 - 19968: 0xD8F1, + 20908 - 19968: 0xD4CF, + 20918 - 19968: 0xE5A7, + 20919 - 19968: 0xD5D2, + 20925 - 19968: 0xD6A9, + 20932 - 19968: 0xF4A2, + 20934 - 19968: 0xF1D7, + 20937 - 19968: 0xD5D8, + 20939 - 19968: 0xF0BD, + 20940 - 19968: 0xD7D0, + 20941 - 19968: 0xD4D0, + 20956 - 19968: 0xD7CF, + 20957 - 19968: 0xEBEA, + 20958 - 19968: 0xFDEB, + 20961 - 19968: 0xDBED, + 20976 - 19968: 0xFCC5, + 20977 - 19968: 0xCBC2, + 20982 - 19968: 0xFDD5, + 20984 - 19968: 0xF4C8, + 20985 - 19968: 0xE8EA, + 20986 - 19968: 0xF5F3, + 20989 - 19968: 0xF9DE, + 20992 - 19968: 0xD3EF, + 20995 - 19968: 0xECD3, + 20998 - 19968: 0xDDC2, + 20999 - 19968: 0xEFB7, + 21000 - 19968: 0xE7D4, + 21002 - 19968: 0xCACA, + 21006 - 19968: 0xD9FB, + 21009 - 19968: 0xFAFD, + 21015 - 19968: 0xD6AA, + 21021 - 19968: 0xF4F8, + 21028 - 19968: 0xF7F7, + 21029 - 19968: 0xDCAC, + 21033 - 19968: 0xD7D7, + 21034 - 19968: 0xDFA2, + 21038 - 19968: 0xCEBE, + 21040 - 19968: 0xD3F0, + 21046 - 19968: 0xF0A4, + 21047 - 19968: 0xE1EC, + 21048 - 19968: 0xCFE7, + 21049 - 19968: 0xF3CB, + 21050 - 19968: 0xEDA9, + 21051 - 19968: 0xCABE, + 21059 - 19968: 0xF4EF, + 21063 - 19968: 0xF6CE, + 21066 - 19968: 0xDEFB, + 21067 - 19968: 0xD0BB, + 21068 - 19968: 0xD5B7, + 21069 - 19968: 0xEEF1, + 21076 - 19968: 0xF4A8, + 21078 - 19968: 0xDCF8, + 21083 - 19968: 0xCBA7, + 21085 - 19968: 0xDACE, + 21089 - 19968: 0xE0E6, + 21097 - 19968: 0xEDA5, + 21098 - 19968: 0xEEF2, + 21103 - 19968: 0xDCF9, + 21106 - 19968: 0xF9DC, + 21109 - 19968: 0xF3DC, + 21117 - 19968: 0xF8F2, + 21119 - 19968: 0xF4F9, + 21123 - 19968: 0xFCF1, + 21127 - 19968: 0xD0BC, + 21128 - 19968: 0xDBF9, + 21129 - 19968: 0xD7B1, + 21133 - 19968: 0xCBFC, + 21137 - 19968: 0xF0A5, + 21138 - 19968: 0xCBFD, + 21147 - 19968: 0xD5F4, + 21151 - 19968: 0xCDED, + 21152 - 19968: 0xCAA5, + 21155 - 19968: 0xD6AB, + 21156 - 19968: 0xD0C2, + 21161 - 19968: 0xF0BE, + 21162 - 19968: 0xD2BD, + 21163 - 19968: 0xCCA4, + 21182 - 19968: 0xFAB6, + 21185 - 19968: 0xCCCD, + 21187 - 19968: 0xDAFA, + 21189 - 19968: 0xF6CF, + 21191 - 19968: 0xE9B8, + 21193 - 19968: 0xD8F5, + 21197 - 19968: 0xCCCE, + 21202 - 19968: 0xD7CD, + 21205 - 19968: 0xD4D1, + 21206 - 19968: 0xE9ED, + 21208 - 19968: 0xCAEB, + 21209 - 19968: 0xD9E2, + 21211 - 19968: 0xFDB2, + 21213 - 19968: 0xE3AD, + 21214 - 19968: 0xD6CC, + 21215 - 19968: 0xD9B4, + 21218 - 19968: 0xE1A7, + 21219 - 19968: 0xEED3, + 21220 - 19968: 0xD0C3, + 21235 - 19968: 0xFDB3, + 21237 - 19968: 0xD5E4, + 21240 - 19968: 0xCFE8, + 21242 - 19968: 0xEDC3, + 21243 - 19968: 0xD0B2, + 21246 - 19968: 0xCEFE, + 21247 - 19968: 0xDAA8, + 21253 - 19968: 0xF8D0, + 21256 - 19968: 0xFDD6, + 21261 - 19968: 0xF8D1, + 21263 - 19968: 0xF8D2, + 21264 - 19968: 0xDCD3, + 21269 - 19968: 0xDDE2, + 21270 - 19968: 0xFBF9, + 21271 - 19968: 0xDDC1, + 21273 - 19968: 0xE3B5, + 21280 - 19968: 0xEDDD, + 21281 - 19968: 0xCEC4, + 21283 - 19968: 0xCBA1, + 21290 - 19968: 0xDDE3, + 21295 - 19968: 0xFCDD, + 21305 - 19968: 0xF9AF, + 21311 - 19968: 0xD2FB, + 21312 - 19968: 0xCFA1, + 21313 - 19968: 0xE4A8, + 21315 - 19968: 0xF4B6, + 21316 - 19968: 0xECFE, + 21319 - 19968: 0xE3AE, + 21320 - 19968: 0xE7ED, + 21321 - 19968: 0xFDC1, + 21322 - 19968: 0xDAE2, + 21325 - 19968: 0xD8B3, + 21329 - 19968: 0xDDE4, + 21330 - 19968: 0xF0EF, + 21331 - 19968: 0xF6F1, + 21332 - 19968: 0xFAF0, + 21335 - 19968: 0xD1F5, + 21338 - 19968: 0xDACF, + 21340 - 19968: 0xDCD4, + 21342 - 19968: 0xDCA6, + 21344 - 19968: 0xEFBF, + 21350 - 19968: 0xCECF, + 21352 - 19968: 0xE0D9, + 21359 - 19968: 0xD9D6, + 21360 - 19968: 0xECD4, + 21361 - 19968: 0xEACB, + 21364 - 19968: 0xCABF, + 21365 - 19968: 0xD5B0, + 21367 - 19968: 0xCFE9, + 21373 - 19968: 0xF1ED, + 21375 - 19968: 0xCCCF, + 21380 - 19968: 0xE4F8, + 21395 - 19968: 0xE4ED, + 21400 - 19968: 0xD7D8, + 21402 - 19968: 0xFDA7, + 21407 - 19968: 0xEAAB, + 21408 - 19968: 0xF6B2, + 21413 - 19968: 0xCFF0, + 21414 - 19968: 0xF9BD, + 21421 - 19968: 0xE6F4, + 21435 - 19968: 0xCBDB, + 21443 - 19968: 0xF3D1, + 21448 - 19968: 0xE9D1, + 21449 - 19968: 0xF3A9, + 21450 - 19968: 0xD0E0, + 21451 - 19968: 0xE9D2, + 21453 - 19968: 0xDAE3, + 21460 - 19968: 0xE2D2, + 21462 - 19968: 0xF6A2, + 21463 - 19968: 0xE1F4, + 21467 - 19968: 0xDAE4, + 21473 - 19968: 0xE7D5, + 21474 - 19968: 0xF5BF, + 21475 - 19968: 0xCFA2, + 21476 - 19968: 0xCDAF, + 21477 - 19968: 0xCFA3, + 21481 - 19968: 0xCDB0, + 21482 - 19968: 0xF1FE, + 21483 - 19968: 0xD0A3, + 21484 - 19968: 0xE1AF, + 21485 - 19968: 0xF8A3, + 21487 - 19968: 0xCAA6, + 21488 - 19968: 0xF7BB, + 21489 - 19968: 0xF2EA, + 21490 - 19968: 0xDEC8, + 21491 - 19968: 0xE9D3, + 21496 - 19968: 0xDEC9, + 21507 - 19968: 0xFDDE, + 21508 - 19968: 0xCAC0, + 21512 - 19968: 0xF9EA, + 21513 - 19968: 0xD1CE, + 21514 - 19968: 0xEED4, + 21516 - 19968: 0xD4D2, + 21517 - 19968: 0xD9A3, + 21518 - 19968: 0xFDA8, + 21519 - 19968: 0xD7D9, + 21520 - 19968: 0xF7CE, + 21521 - 19968: 0xFABE, + 21531 - 19968: 0xCFD6, + 21533 - 19968: 0xD7F0, + 21535 - 19968: 0xEBE1, + 21536 - 19968: 0xF8C5, + 21542 - 19968: 0xDCFA, + 21545 - 19968: 0xDDC3, + 21547 - 19968: 0xF9DF, + 21555 - 19968: 0xE7EF, + 21560 - 19968: 0xFDE5, + 21561 - 19968: 0xF6A3, + 21563 - 19968: 0xD9FC, + 21564 - 19968: 0xFDA9, + 21566 - 19968: 0xE7EE, + 21570 - 19968: 0xD5E5, + 21576 - 19968: 0xEFD0, + 21578 - 19968: 0xCDB1, + 21585 - 19968: 0xF7A2, + 21608 - 19968: 0xF1B2, + 21610 - 19968: 0xF1B1, + 21617 - 19968: 0xCDB2, + 21619 - 19968: 0xDAAB, + 21621 - 19968: 0xCAA7, + 21627 - 19968: 0xE3E2, + 21628 - 19968: 0xFBBC, + 21629 - 19968: 0xD9A4, + 21632 - 19968: 0xEEBA, + 21638 - 19968: 0xF8D3, + 21644 - 19968: 0xFBFA, + 21646 - 19968: 0xCFA4, + 21648 - 19968: 0xDCFB, + 21668 - 19968: 0xF6E3, + 21672 - 19968: 0xEDAA, + 21675 - 19968: 0xF2A1, + 21676 - 19968: 0xCEE1, + 21683 - 19968: 0xFAA6, + 21688 - 19968: 0xF9E0, + 21693 - 19968: 0xECD6, + 21696 - 19968: 0xE4EE, + 21697 - 19968: 0xF9A1, + 21700 - 19968: 0xFBEF, + 21704 - 19968: 0xF9EB, + 21705 - 19968: 0xEEA3, + 21729 - 19968: 0xEAAC, + 21733 - 19968: 0xCAA8, + 21736 - 19968: 0xF4FA, + 21741 - 19968: 0xCDD6, + 21742 - 19968: 0xFCF6, + 21746 - 19968: 0xF4C9, + 21754 - 19968: 0xF8D4, + 21764 - 19968: 0xF8A6, + 21766 - 19968: 0xDECA, + 21767 - 19968: 0xF2C6, + 21774 - 19968: 0xD7DA, + 21776 - 19968: 0xD3D0, + 21788 - 19968: 0xD8C5, + 21807 - 19968: 0xEAE6, + 21809 - 19968: 0xF3DD, + 21813 - 19968: 0xE4DA, + 21822 - 19968: 0xF6E4, + 21828 - 19968: 0xF6F2, + 21830 - 19968: 0xDFC2, + 21839 - 19968: 0xD9FD, + 21843 - 19968: 0xCCF6, + 21846 - 19968: 0xD3BA, + 21854 - 19968: 0xE4AF, + 21859 - 19968: 0xF9E1, + 21884 - 19968: 0xF0A6, + 21888 - 19968: 0xCBD3, + 21892 - 19968: 0xE0BC, + 21894 - 19968: 0xF4CA, + 21895 - 19968: 0xD4FA, + 21897 - 19968: 0xFDAA, + 21898 - 19968: 0xF9E2, + 21912 - 19968: 0xF4B7, + 21913 - 19968: 0xFDC2, + 21914 - 19968: 0xFCB0, + 21916 - 19968: 0xFDEC, + 21917 - 19968: 0xCAE2, + 21927 - 19968: 0xFDBD, + 21929 - 19968: 0xEAE7, + 21930 - 19968: 0xDFC3, + 21931 - 19968: 0xD1D2, + 21932 - 19968: 0xCEE2, + 21934 - 19968: 0xD3A4, + 21957 - 19968: 0xFDAB, + 21959 - 19968: 0xDFE0, + 21972 - 19968: 0xF2C7, + 21978 - 19968: 0xE7F0, + 21980 - 19968: 0xD0EE, + 21983 - 19968: 0xF3AA, + 21987 - 19968: 0xDECB, + 21988 - 19968: 0xF6B8, + 22013 - 19968: 0xE1F5, + 22014 - 19968: 0xF1B3, + 22022 - 19968: 0xF7A3, + 22025 - 19968: 0xCAA9, + 22036 - 19968: 0xCFA5, + 22039 - 19968: 0xDFC4, + 22063 - 19968: 0xE1B0, + 22066 - 19968: 0xF0BF, + 22068 - 19968: 0xF6A4, + 22070 - 19968: 0xE3B6, + 22099 - 19968: 0xFAC6, + 22120 - 19968: 0xD0EF, + 22123 - 19968: 0xFDED, + 22132 - 19968: 0xDDC4, + 22150 - 19968: 0xFCF7, + 22181 - 19968: 0xE6BF, + 22188 - 19968: 0xDEAD, + 22190 - 19968: 0xFABF, + 22196 - 19968: 0xE5F1, + 22204 - 19968: 0xEDC4, + 22218 - 19968: 0xD2A5, + 22221 - 19968: 0xFDEE, + 22225 - 19968: 0xF5B6, + 22234 - 19968: 0xE1F6, + 22235 - 19968: 0xDECC, + 22238 - 19968: 0xFCDE, + 22240 - 19968: 0xECD7, + 22256 - 19968: 0xCDDD, + 22265 - 19968: 0xD6B7, + 22266 - 19968: 0xCDB3, + 22275 - 19968: 0xF8D5, + 22276 - 19968: 0xE5D8, + 22280 - 19968: 0xCFEA, + 22283 - 19968: 0xCFD0, + 22285 - 19968: 0xEACC, + 22290 - 19968: 0xEAAE, + 22291 - 19968: 0xEAAD, + 22294 - 19968: 0xD3F1, + 22296 - 19968: 0xD3A5, + 22303 - 19968: 0xF7CF, + 22312 - 19968: 0xEEA4, + 22317 - 19968: 0xD0A4, + 22320 - 19968: 0xF2A2, + 22331 - 19968: 0xD0F0, + 22336 - 19968: 0xF2A3, + 22338 - 19968: 0xF7F8, + 22343 - 19968: 0xD0B3, + 22346 - 19968: 0xDBA9, + 22349 - 19968: 0xD3BB, + 22350 - 19968: 0xCAEC, + 22352 - 19968: 0xF1A6, + 22353 - 19968: 0xCBD5, + 22369 - 19968: 0xF7E7, + 22372 - 19968: 0xCDDE, + 22374 - 19968: 0xF7A4, + 22378 - 19968: 0xF8C0, + 22382 - 19968: 0xD3DD, + 22384 - 19968: 0xCCD0, + 22389 - 19968: 0xCFA6, + 22396 - 19968: 0xF6F3, + 22402 - 19968: 0xE1F7, + 22408 - 19968: 0xD3DC, + 22411 - 19968: 0xFAFE, + 22419 - 19968: 0xFAA7, + 22432 - 19968: 0xEBD9, + 22434 - 19968: 0xCFA7, + 22435 - 19968: 0xEAAF, + 22467 - 19968: 0xE4EF, + 22471 - 19968: 0xE9B9, + 22472 - 19968: 0xF1D8, + 22475 - 19968: 0xD8D8, + 22478 - 19968: 0xE0F2, + 22495 - 19968: 0xE6B4, + 22496 - 19968: 0xDCFC, + 22512 - 19968: 0xF3F1, + 22516 - 19968: 0xE3D0, + 22519 - 19968: 0xF2FB, + 22521 - 19968: 0xDBC6, + 22522 - 19968: 0xD0F1, + 22524 - 19968: 0xD0F2, + 22528 - 19968: 0xCFDC, + 22530 - 19968: 0xD3D1, + 22533 - 19968: 0xCCB1, + 22534 - 19968: 0xF7D8, + 22536 - 19968: 0xCBA8, + 22537 - 19968: 0xEBBC, + 22538 - 19968: 0xE4BE, + 22558 - 19968: 0xF4DC, + 22561 - 19968: 0xDCC2, + 22564 - 19968: 0xF0A7, + 22567 - 19968: 0xE6C0, + 22570 - 19968: 0xCAED, + 22575 - 19968: 0xE8EB, + 22576 - 19968: 0xE5E8, + 22577 - 19968: 0xDCC3, + 22580 - 19968: 0xEDDE, + 22581 - 19968: 0xD3F2, + 22586 - 19968: 0xCCF7, + 22602 - 19968: 0xCED4, + 22603 - 19968: 0xE7AB, + 22607 - 19968: 0xCBC3, + 22609 - 19968: 0xE1B1, + 22612 - 19968: 0xF7B2, + 22615 - 19968: 0xD3F3, + 22616 - 19968: 0xD3D2, + 22618 - 19968: 0xF5C0, + 22622 - 19968: 0xDFDD, + 22625 - 19968: 0xEEF3, + 22626 - 19968: 0xE7F1, + 22628 - 19968: 0xFDB4, + 22645 - 19968: 0xF2C8, + 22649 - 19968: 0xF3D2, + 22652 - 19968: 0xEEF4, + 22654 - 19968: 0xE2D3, + 22659 - 19968: 0xCCD1, + 22661 - 19968: 0xDFEA, + 22665 - 19968: 0xE9BA, + 22675 - 19968: 0xD9D7, + 22684 - 19968: 0xF5CD, + 22686 - 19968: 0xF1F2, + 22687 - 19968: 0xFAC7, + 22696 - 19968: 0xD9F8, + 22697 - 19968: 0xD4C2, + 22702 - 19968: 0xF6E5, + 22707 - 19968: 0xDDC5, + 22714 - 19968: 0xE7F2, + 22715 - 19968: 0xEDDF, + 22718 - 19968: 0xCACB, + 22721 - 19968: 0xDBFA, + 22725 - 19968: 0xE8B5, + 22727 - 19968: 0xD3A6, + 22734 - 19968: 0xFDB5, + 22737 - 19968: 0xF9C9, + 22739 - 19968: 0xE4E2, + 22741 - 19968: 0xFBBD, + 22744 - 19968: 0xD7A4, + 22745 - 19968: 0xCEC5, + 22750 - 19968: 0xCED5, + 22751 - 19968: 0xD6E6, + 22756 - 19968: 0xE5BD, + 22763 - 19968: 0xDECD, + 22764 - 19968: 0xECF3, + 22767 - 19968: 0xEDE0, + 22777 - 19968: 0xECEC, + 22778 - 19968: 0xFBBE, + 22779 - 19968: 0xDFEB, + 22781 - 19968: 0xE1F8, + 22799 - 19968: 0xF9BE, + 22804 - 19968: 0xD0F3, + 22805 - 19968: 0xE0AA, + 22806 - 19968: 0xE8E2, + 22809 - 19968: 0xE2D4, + 22810 - 19968: 0xD2FD, + 22812 - 19968: 0xE5A8, + 22818 - 19968: 0xD9D3, + 22823 - 19968: 0xD3DE, + 22825 - 19968: 0xF4B8, + 22826 - 19968: 0xF7BC, + 22827 - 19968: 0xDCFD, + 22829 - 19968: 0xE8EC, + 22830 - 19968: 0xE4E7, + 22833 - 19968: 0xE3F7, + 22839 - 19968: 0xECA8, + 22846 - 19968: 0xFAF1, + 22852 - 19968: 0xE5F2, + 22855 - 19968: 0xD0F4, + 22856 - 19968: 0xD2AF, + 22857 - 19968: 0xDCE5, + 22862 - 19968: 0xD0A5, + 22863 - 19968: 0xF1B4, + 22864 - 19968: 0xFCB1, + 22865 - 19968: 0xCCF8, + 22868 - 19968: 0xDDC6, + 22869 - 19968: 0xFAD1, + 22871 - 19968: 0xF7DF, + 22874 - 19968: 0xFAA8, + 22880 - 19968: 0xEEF5, + 22882 - 19968: 0xDECE, + 22887 - 19968: 0xE7F3, + 22890 - 19968: 0xF7AC, + 22891 - 19968: 0xEBC4, + 22892 - 19968: 0xEDE1, + 22893 - 19968: 0xE0AB, + 22894 - 19968: 0xDDC7, + 22899 - 19968: 0xD2B3, + 22900 - 19968: 0xD2BF, + 22904 - 19968: 0xCACC, + 22909 - 19968: 0xFBBF, + 22914 - 19968: 0xE5FD, + 22915 - 19968: 0xDDE5, + 22916 - 19968: 0xD8CD, + 22922 - 19968: 0xECF4, + 22931 - 19968: 0xD0F5, + 22934 - 19968: 0xE8ED, + 22935 - 19968: 0xD0D2, + 22937 - 19968: 0xD9D8, + 22949 - 19968: 0xF6E6, + 22952 - 19968: 0xDBAA, + 22956 - 19968: 0xF7E0, + 22969 - 19968: 0xD8D9, + 22971 - 19968: 0xF4A3, + 22974 - 19968: 0xF4DD, + 22979 - 19968: 0xEFD1, + 22982 - 19968: 0xD9B5, + 22985 - 19968: 0xEDAB, + 22987 - 19968: 0xE3B7, + 22992 - 19968: 0xEEBB, + 22993 - 19968: 0xCDB4, + 22995 - 19968: 0xE0F3, + 22996 - 19968: 0xEACD, + 23001 - 19968: 0xECF5, + 23002 - 19968: 0xE8EE, + 23004 - 19968: 0xCBA9, + 23005 - 19968: 0xF1AF, + 23014 - 19968: 0xCACD, + 23016 - 19968: 0xECA9, + 23018 - 19968: 0xF2EB, + 23020 - 19968: 0xFDEF, + 23022 - 19968: 0xF9F3, + 23032 - 19968: 0xE6C1, + 23035 - 19968: 0xECD8, + 23039 - 19968: 0xEDAC, + 23041 - 19968: 0xEACE, + 23043 - 19968: 0xE8DF, + 23057 - 19968: 0xDECF, + 23064 - 19968: 0xD2A6, + 23067 - 19968: 0xE7F4, + 23068 - 19968: 0xD1D6, + 23071 - 19968: 0xE6C2, + 23072 - 19968: 0xE3E3, + 23077 - 19968: 0xE4B0, + 23081 - 19968: 0xD8B4, + 23094 - 19968: 0xF6A5, + 23100 - 19968: 0xF3DE, + 23105 - 19968: 0xD7A5, + 23110 - 19968: 0xF7E8, + 23113 - 19968: 0xE8C6, + 23130 - 19968: 0xFBE6, + 23138 - 19968: 0xDDE6, + 23142 - 19968: 0xDCFE, + 23186 - 19968: 0xD8DA, + 23194 - 19968: 0xDAAC, + 23195 - 19968: 0xEAB0, + 23204 - 19968: 0xE3B8, + 23233 - 19968: 0xCAAA, + 23234 - 19968: 0xE1F9, + 23236 - 19968: 0xEAB1, + 23241 - 19968: 0xF2EC, + 23244 - 19968: 0xFAEE, + 23265 - 19968: 0xEED5, + 23270 - 19968: 0xF9F4, + 23273 - 19968: 0xD2EC, + 23301 - 19968: 0xFBFB, + 23305 - 19968: 0xFDF0, + 23307 - 19968: 0xE0BD, + 23308 - 19968: 0xCEE3, + 23318 - 19968: 0xF8C6, + 23338 - 19968: 0xDEAE, + 23360 - 19968: 0xDFC5, + 23363 - 19968: 0xE5BE, + 23376 - 19968: 0xEDAD, + 23377 - 19968: 0xFAEA, + 23380 - 19968: 0xCDEE, + 23381 - 19968: 0xEDA6, + 23383 - 19968: 0xEDAE, + 23384 - 19968: 0xF0ED, + 23386 - 19968: 0xDDA1, + 23388 - 19968: 0xEDAF, + 23389 - 19968: 0xFCF8, + 23391 - 19968: 0xD8EB, + 23395 - 19968: 0xCCF9, + 23396 - 19968: 0xCDB5, + 23401 - 19968: 0xFAA9, + 23403 - 19968: 0xE1DD, + 23408 - 19968: 0xE2D5, + 23409 - 19968: 0xEDCF, + 23413 - 19968: 0xDDA2, + 23416 - 19968: 0xF9CA, + 23418 - 19968: 0xEAE8, + 23420 - 19968: 0xE5ED, + 23429 - 19968: 0xD3EB, + 23431 - 19968: 0xE9D4, + 23432 - 19968: 0xE1FA, + 23433 - 19968: 0xE4CC, + 23435 - 19968: 0xE1E4, + 23436 - 19968: 0xE8C7, + 23439 - 19968: 0xCEDB, + 23443 - 19968: 0xDCD5, + 23445 - 19968: 0xF7B5, + 23446 - 19968: 0xFCF3, + 23447 - 19968: 0xF0F3, + 23448 - 19968: 0xCEAF, + 23449 - 19968: 0xF1B5, + 23450 - 19968: 0xEFD2, + 23451 - 19968: 0xE8C8, + 23452 - 19968: 0xEBF1, + 23458 - 19968: 0xCBD4, + 23459 - 19968: 0xE0BE, + 23460 - 19968: 0xE3F8, + 23461 - 19968: 0xEAE9, + 23462 - 19968: 0xFCB2, + 23468 - 19968: 0xE0F4, + 23470 - 19968: 0xCFE0, + 23472 - 19968: 0xEEA5, + 23475 - 19968: 0xFAAA, + 23476 - 19968: 0xE6C3, + 23477 - 19968: 0xE1B2, + 23478 - 19968: 0xCAAB, + 23480 - 19968: 0xE3E4, + 23481 - 19968: 0xE9BB, + 23487 - 19968: 0xE2D6, + 23488 - 19968: 0xF3F2, + 23490 - 19968: 0xEED6, + 23491 - 19968: 0xEAB2, + 23492 - 19968: 0xD0F6, + 23493 - 19968: 0xECD9, + 23494 - 19968: 0xDACB, + 23495 - 19968: 0xCFA8, + 23500 - 19968: 0xDDA3, + 23504 - 19968: 0xD8DB, + 23506 - 19968: 0xF9CE, + 23507 - 19968: 0xE9D5, + 23508 - 19968: 0xE3D1, + 23511 - 19968: 0xD2BC, + 23518 - 19968: 0xD8AC, + 23519 - 19968: 0xF3CC, + 23521 - 19968: 0xCDFB, + 23522 - 19968: 0xF6D6, + 23524 - 19968: 0xE7F5, + 23525 - 19968: 0xE8EF, + 23526 - 19968: 0xE3F9, + 23527 - 19968: 0xD2BB, + 23528 - 19968: 0xF3F3, + 23529 - 19968: 0xE3FB, + 23531 - 19968: 0xDED0, + 23532 - 19968: 0xCEB0, + 23534 - 19968: 0xD6F7, + 23535 - 19968: 0xF1D9, + 23541 - 19968: 0xF5C1, + 23542 - 19968: 0xDCC4, + 23544 - 19968: 0xF5BB, + 23546 - 19968: 0xDED1, + 23553 - 19968: 0xDCE6, + 23556 - 19968: 0xDED2, + 23559 - 19968: 0xEDE2, + 23560 - 19968: 0xEEF6, + 23561 - 19968: 0xEACF, + 23562 - 19968: 0xF0EE, + 23563 - 19968: 0xE3FC, + 23565 - 19968: 0xD3DF, + 23566 - 19968: 0xD3F4, + 23567 - 19968: 0xE1B3, + 23569 - 19968: 0xE1B4, + 23574 - 19968: 0xF4D3, + 23577 - 19968: 0xDFC6, + 23588 - 19968: 0xE9D6, + 23592 - 19968: 0xDBAB, + 23601 - 19968: 0xF6A6, + 23608 - 19968: 0xE3B9, + 23609 - 19968: 0xEBC5, + 23610 - 19968: 0xF4A9, + 23611 - 19968: 0xCDB6, + 23612 - 19968: 0xD2F9, + 23614 - 19968: 0xDAAD, + 23615 - 19968: 0xD2E3, + 23616 - 19968: 0xCFD1, + 23621 - 19968: 0xCBDC, + 23622 - 19968: 0xCCFA, + 23624 - 19968: 0xCFDD, + 23627 - 19968: 0xE8A9, + 23629 - 19968: 0xE3BB, + 23630 - 19968: 0xE3BA, + 23633 - 19968: 0xE0DA, + 23637 - 19968: 0xEEF7, + 23643 - 19968: 0xDCB3, + 23648 - 19968: 0xD3F5, + 23650 - 19968: 0xD7A6, + 23652 - 19968: 0xF6B5, + 23653 - 19968: 0xD7DB, + 23660 - 19968: 0xE1D5, + 23663 - 19968: 0xD4EA, + 23665 - 19968: 0xDFA3, + 23673 - 19968: 0xFDDF, + 23696 - 19968: 0xD0F7, + 23697 - 19968: 0xEDD4, + 23713 - 19968: 0xCBAA, + 23721 - 19968: 0xE4DB, + 23723 - 19968: 0xE1FB, + 23724 - 19968: 0xCBA2, + 23729 - 19968: 0xD3E0, + 23731 - 19968: 0xE4BF, + 23733 - 19968: 0xFBC0, + 23735 - 19968: 0xDABE, + 23736 - 19968: 0xE4CD, + 23738 - 19968: 0xD6B9, + 23742 - 19968: 0xEFC0, + 23744 - 19968: 0xE1FC, + 23769 - 19968: 0xF6B9, + 23776 - 19968: 0xDFC7, + 23784 - 19968: 0xE4B1, + 23791 - 19968: 0xDCE7, + 23792 - 19968: 0xDCE8, + 23796 - 19968: 0xFAD6, + 23798 - 19968: 0xD3F6, + 23803 - 19968: 0xF1DA, + 23805 - 19968: 0xFAF2, + 23815 - 19968: 0xE2FD, + 23821 - 19968: 0xD5CF, + 23822 - 19968: 0xD0F8, + 23825 - 19968: 0xCDDF, + 23828 - 19968: 0xF5CB, + 23830 - 19968: 0xE4F0, + 23831 - 19968: 0xCBAB, + 23833 - 19968: 0xD7C4, + 23847 - 19968: 0xE2FE, + 23849 - 19968: 0xDDDA, + 23883 - 19968: 0xDAAE, + 23884 - 19968: 0xCAEE, + 23888 - 19968: 0xD5B9, + 23913 - 19968: 0xE3A1, + 23916 - 19968: 0xE8E3, + 23919 - 19968: 0xF3AB, + 23943 - 19968: 0xCFA9, + 23947 - 19968: 0xD3F7, + 23965 - 19968: 0xD4F1, + 23968 - 19968: 0xCEE4, + 23970 - 19968: 0xE8F2, + 23978 - 19968: 0xE5F5, + 23992 - 19968: 0xE7AE, + 23994 - 19968: 0xD6BA, + 23996 - 19968: 0xDFEC, + 23997 - 19968: 0xE4C0, + 24013 - 19968: 0xE8E4, + 24018 - 19968: 0xD8B5, + 24022 - 19968: 0xE4DC, + 24029 - 19968: 0xF4B9, + 24030 - 19968: 0xF1B6, + 24033 - 19968: 0xE2DE, + 24034 - 19968: 0xE1B5, + 24037 - 19968: 0xCDEF, + 24038 - 19968: 0xF1A7, + 24039 - 19968: 0xCEE5, + 24040 - 19968: 0xCBDD, + 24043 - 19968: 0xD9E3, + 24046 - 19968: 0xF3AC, + 24049 - 19968: 0xD0F9, + 24050 - 19968: 0xECAB, + 24051 - 19968: 0xDED3, + 24052 - 19968: 0xF7E9, + 24055 - 19968: 0xF9F5, + 24061 - 19968: 0xE1DE, + 24062 - 19968: 0xCBEE, + 24066 - 19968: 0xE3BC, + 24067 - 19968: 0xF8D6, + 24070 - 19968: 0xDBEE, + 24076 - 19968: 0xFDF1, + 24081 - 19968: 0xF7B6, + 24086 - 19968: 0xF4DE, + 24089 - 19968: 0xF2ED, + 24091 - 19968: 0xDBD9, + 24093 - 19968: 0xF0A8, + 24101 - 19968: 0xE1FD, + 24107 - 19968: 0xDED4, + 24109 - 19968: 0xE0AC, + 24115 - 19968: 0xEDE3, + 24118 - 19968: 0xD3E1, + 24120 - 19968: 0xDFC8, + 24125 - 19968: 0xD9B6, + 24127 - 19968: 0xFDAC, + 24128 - 19968: 0xEFD3, + 24132 - 19968: 0xE4C1, + 24133 - 19968: 0xF8EB, + 24135 - 19968: 0xDBAC, + 24140 - 19968: 0xFCC6, + 24149 - 19968: 0xD8AD, + 24159 - 19968: 0xF6BA, + 24161 - 19968: 0xDBDF, + 24162 - 19968: 0xD3D3, + 24163 - 19968: 0xF8C7, + 24178 - 19968: 0xCACE, + 24179 - 19968: 0xF8C1, + 24180 - 19968: 0xD2B4, + 24183 - 19968: 0xDCB4, + 24184 - 19968: 0xFAB9, + 24185 - 19968: 0xCACF, + 24187 - 19968: 0xFCB3, + 24188 - 19968: 0xEAEA, + 24189 - 19968: 0xEAEB, + 24190 - 19968: 0xD0FA, + 24196 - 19968: 0xEDE4, + 24199 - 19968: 0xDDE7, + 24202 - 19968: 0xDFC9, + 24207 - 19968: 0xDFED, + 24213 - 19968: 0xEEBC, + 24215 - 19968: 0xEFC1, + 24218 - 19968: 0xCCD2, + 24220 - 19968: 0xDDA4, + 24224 - 19968: 0xDFCA, + 24230 - 19968: 0xD3F8, + 24231 - 19968: 0xF1A8, + 24235 - 19968: 0xCDB7, + 24237 - 19968: 0xEFD4, + 24245 - 19968: 0xE4DD, + 24246 - 19968: 0xDFEE, + 24247 - 19968: 0xCBAC, + 24248 - 19968: 0xE9BC, + 24254 - 19968: 0xEAEC, + 24258 - 19968: 0xDFCB, + 24264 - 19968: 0xF9BF, + 24265 - 19968: 0xD6AF, + 24266 - 19968: 0xD5C6, + 24272 - 19968: 0xCFAA, + 24275 - 19968: 0xCEA9, + 24278 - 19968: 0xD6F8, + 24282 - 19968: 0xF1B7, + 24283 - 19968: 0xEEF8, + 24287 - 19968: 0xD9D9, + 24288 - 19968: 0xF3DF, + 24290 - 19968: 0xF8C8, + 24291 - 19968: 0xCEC6, + 24300 - 19968: 0xD5E6, + 24307 - 19968: 0xF4E6, + 24310 - 19968: 0xE6C5, + 24311 - 19968: 0xEFD5, + 24314 - 19968: 0xCBEF, + 24315 - 19968: 0xFCDF, + 24321 - 19968: 0xDCA7, + 24324 - 19968: 0xD6E7, + 24330 - 19968: 0xF8C9, + 24335 - 19968: 0xE3D2, + 24337 - 19968: 0xE3BD, + 24339 - 19968: 0xCFE1, + 24340 - 19968: 0xF0C0, + 24341 - 19968: 0xECDA, + 24343 - 19968: 0xDDD7, + 24344 - 19968: 0xFBF0, + 24347 - 19968: 0xECAC, + 24351 - 19968: 0xF0A9, + 24358 - 19968: 0xFAD7, + 24359 - 19968: 0xFBC1, + 24361 - 19968: 0xD2C0, + 24369 - 19968: 0xE5B0, + 24373 - 19968: 0xEDE5, + 24378 - 19968: 0xCBAD, + 24380 - 19968: 0xF9B0, + 24392 - 19968: 0xF7A5, + 24394 - 19968: 0xCBAE, + 24396 - 19968: 0xDAAF, + 24398 - 19968: 0xD8B6, + 24406 - 19968: 0xD3A7, + 24407 - 19968: 0xFBB2, + 24409 - 19968: 0xFDC4, + 24411 - 19968: 0xECAD, + 24418 - 19968: 0xFBA1, + 24422 - 19968: 0xE5E9, + 24423 - 19968: 0xE9EE, + 24425 - 19968: 0xF3F4, + 24426 - 19968: 0xF8F3, + 24427 - 19968: 0xF0C1, + 24428 - 19968: 0xDEAF, + 24429 - 19968: 0xF8B0, + 24432 - 19968: 0xF3E0, + 24433 - 19968: 0xE7AF, + 24439 - 19968: 0xDBAD, + 24441 - 19968: 0xE6B5, + 24444 - 19968: 0xF9A8, + 24447 - 19968: 0xDDD8, + 24448 - 19968: 0xE8D9, + 24449 - 19968: 0xEFD6, + 24453 - 19968: 0xD3E2, + 24455 - 19968: 0xE2DF, + 24458 - 19968: 0xFCE0, + 24459 - 19968: 0xD7C8, + 24460 - 19968: 0xFDAD, + 24464 - 19968: 0xDFEF, + 24465 - 19968: 0xCCD3, + 24466 - 19968: 0xD3F9, + 24471 - 19968: 0xD4F0, + 24472 - 19968: 0xDBC7, + 24473 - 19968: 0xDED5, + 24478 - 19968: 0xF0F4, + 24480 - 19968: 0xD5D0, + 24481 - 19968: 0xE5D9, + 24488 - 19968: 0xFCC7, + 24489 - 19968: 0xDCD6, + 24490 - 19968: 0xE2E0, + 24494 - 19968: 0xDAB0, + 24501 - 19968: 0xF3A3, + 24503 - 19968: 0xD3EC, + 24505 - 19968: 0xF4CB, + 24509 - 19968: 0xFDC5, + 24515 - 19968: 0xE3FD, + 24517 - 19968: 0xF9B1, + 24524 - 19968: 0xD0FB, + 24525 - 19968: 0xECDB, + 24534 - 19968: 0xF5BC, + 24535 - 19968: 0xF2A4, + 24536 - 19968: 0xD8CE, + 24537 - 19968: 0xD8CF, + 24544 - 19968: 0xF5F7, + 24555 - 19968: 0xF6E1, + 24565 - 19968: 0xD2B7, + 24573 - 19968: 0xFBEC, + 24575 - 19968: 0xDDC8, + 24591 - 19968: 0xE4E8, + 24594 - 19968: 0xD2C1, + 24598 - 19968: 0xF8D7, + 24604 - 19968: 0xD6BB, + 24605 - 19968: 0xDED6, + 24608 - 19968: 0xF7BD, + 24609 - 19968: 0xECAE, + 24613 - 19968: 0xD0E1, + 24615 - 19968: 0xE0F5, + 24616 - 19968: 0xEAB3, + 24618 - 19968: 0xCED6, + 24623 - 19968: 0xCCA5, + 24641 - 19968: 0xECF6, + 24642 - 19968: 0xE2E1, + 24643 - 19968: 0xE3BE, + 24653 - 19968: 0xFCC8, + 24656 - 19968: 0xCDF0, + 24658 - 19968: 0xF9F6, + 24661 - 19968: 0xDFF0, + 24665 - 19968: 0xE5BF, + 24669 - 19968: 0xCEBF, + 24674 - 19968: 0xFCE1, + 24675 - 19968: 0xEDB0, + 24676 - 19968: 0xFDD1, + 24677 - 19968: 0xF6BB, + 24680 - 19968: 0xF9CF, + 24681 - 19968: 0xEBDA, + 24682 - 19968: 0xCAC1, + 24684 - 19968: 0xD2B8, + 24685 - 19968: 0xCDF1, + 24687 - 19968: 0xE3D3, + 24688 - 19968: 0xFDE6, + 24709 - 19968: 0xE6ED, + 24713 - 19968: 0xE3FA, + 24716 - 19968: 0xF0AA, + 24717 - 19968: 0xF9D0, + 24724 - 19968: 0xFCE2, + 24726 - 19968: 0xF8A7, + 24730 - 19968: 0xE1E5, + 24731 - 19968: 0xEEF9, + 24735 - 19968: 0xE7F6, + 24736 - 19968: 0xEAED, + 24739 - 19968: 0xFCB4, + 24740 - 19968: 0xF5C2, + 24743 - 19968: 0xD7DC, + 24752 - 19968: 0xF0F5, + 24754 - 19968: 0xDDE8, + 24755 - 19968: 0xD3ED, + 24756 - 19968: 0xF5FC, + 24758 - 19968: 0xDABF, + 24760 - 19968: 0xCCFB, + 24764 - 19968: 0xD3FA, + 24765 - 19968: 0xF4A4, + 24773 - 19968: 0xEFD7, + 24775 - 19968: 0xD4C3, + 24785 - 19968: 0xFBE3, + 24794 - 19968: 0xFBED, + 24796 - 19968: 0xE0AD, + 24799 - 19968: 0xEAEE, + 24800 - 19968: 0xFBB3, + 24801 - 19968: 0xE4C2, + 24816 - 19968: 0xF6E7, + 24817 - 19968: 0xD2DD, + 24819 - 19968: 0xDFCC, + 24822 - 19968: 0xFCC9, + 24825 - 19968: 0xE5A9, + 24826 - 19968: 0xE0F6, + 24827 - 19968: 0xF6B3, + 24833 - 19968: 0xE1FE, + 24838 - 19968: 0xCBF0, + 24840 - 19968: 0xEAEF, + 24841 - 19968: 0xEAF0, + 24845 - 19968: 0xDAC0, + 24846 - 19968: 0xF8B4, + 24847 - 19968: 0xEBF2, + 24853 - 19968: 0xE4C3, + 24858 - 19968: 0xE9D7, + 24859 - 19968: 0xE4F1, + 24863 - 19968: 0xCAEF, + 24871 - 19968: 0xCED7, + 24880 - 19968: 0xFCCA, + 24884 - 19968: 0xF3E1, + 24887 - 19968: 0xCBC4, + 24892 - 19968: 0xE3E5, + 24894 - 19968: 0xCBC5, + 24895 - 19968: 0xEAB4, + 24898 - 19968: 0xE9BD, + 24900 - 19968: 0xD7C9, + 24903 - 19968: 0xEBDB, + 24904 - 19968: 0xEDB1, + 24906 - 19968: 0xCCC3, + 24907 - 19968: 0xF7BE, + 24908 - 19968: 0xFCCB, + 24915 - 19968: 0xF8F4, + 24917 - 19968: 0xD9B7, + 24920 - 19968: 0xF3D3, + 24921 - 19968: 0xF3D4, + 24925 - 19968: 0xF7E4, + 24927 - 19968: 0xF7D1, + 24930 - 19968: 0xD8B7, + 24931 - 19968: 0xCEB1, + 24932 - 19968: 0xCAC2, + 24935 - 19968: 0xFBB4, + 24936 - 19968: 0xCBC6, + 24939 - 19968: 0xF0F6, + 24942 - 19968: 0xD5E7, + 24944 - 19968: 0xEAD0, + 24950 - 19968: 0xCCD4, + 24951 - 19968: 0xCBAF, + 24957 - 19968: 0xF4AA, + 24958 - 19968: 0xE9AF, + 24961 - 19968: 0xF5C3, + 24962 - 19968: 0xE9D8, + 24970 - 19968: 0xDDE9, + 24974 - 19968: 0xF1F3, + 24976 - 19968: 0xD5FB, + 24977 - 19968: 0xDEBB, + 24980 - 19968: 0xF4FB, + 24984 - 19968: 0xFDF3, + 24985 - 19968: 0xFDF2, + 24986 - 19968: 0xF7A6, + 24996 - 19968: 0xDDC9, + 24999 - 19968: 0xD4D3, + 25001 - 19968: 0xCCA8, + 25003 - 19968: 0xDAC1, + 25004 - 19968: 0xCCD5, + 25006 - 19968: 0xD9E4, + 25010 - 19968: 0xFACA, + 25014 - 19968: 0xE5E3, + 25018 - 19968: 0xD3BC, + 25022 - 19968: 0xCAF0, + 25027 - 19968: 0xD0C4, + 25031 - 19968: 0xCAD0, + 25032 - 19968: 0xFAAB, + 25033 - 19968: 0xEBEB, + 25034 - 19968: 0xE7F8, + 25035 - 19968: 0xD9E5, + 25062 - 19968: 0xD1D7, + 25074 - 19968: 0xF3A4, + 25078 - 19968: 0xD4FB, + 25079 - 19968: 0xFCE3, + 25080 - 19968: 0xFAD8, + 25082 - 19968: 0xF3D5, + 25084 - 19968: 0xCFAB, + 25087 - 19968: 0xEBF3, + 25088 - 19968: 0xD5FC, + 25095 - 19968: 0xD3D4, + 25096 - 19968: 0xCDFC, + 25098 - 19968: 0xD9E6, + 25100 - 19968: 0xE2F9, + 25101 - 19968: 0xE2A1, + 25102 - 19968: 0xEBD4, + 25104 - 19968: 0xE0F7, + 25105 - 19968: 0xE4B2, + 25106 - 19968: 0xCCFC, + 25110 - 19968: 0xFBE4, + 25114 - 19968: 0xF4AB, + 25119 - 19968: 0xD0BD, + 25121 - 19968: 0xCAF1, + 25130 - 19968: 0xEFB8, + 25134 - 19968: 0xD7C0, + 25136 - 19968: 0xEEFA, + 25137 - 19968: 0xFDF4, + 25140 - 19968: 0xD3E3, + 25142 - 19968: 0xFBC2, + 25150 - 19968: 0xD5E8, + 25151 - 19968: 0xDBAE, + 25152 - 19968: 0xE1B6, + 25153 - 19968: 0xF8B7, + 25159 - 19968: 0xE0BF, + 25160 - 19968: 0xFBC3, + 25161 - 19968: 0xDDEA, + 25163 - 19968: 0xE2A2, + 25165 - 19968: 0xEEA6, + 25171 - 19968: 0xF6E8, + 25176 - 19968: 0xF6F5, + 25198 - 19968: 0xDDCA, + 25201 - 19968: 0xD0E2, + 25206 - 19968: 0xDDA6, + 25209 - 19968: 0xDDEB, + 25212 - 19968: 0xE4F9, + 25215 - 19968: 0xE3AF, + 25216 - 19968: 0xD0FC, + 25220 - 19968: 0xF4FC, + 25225 - 19968: 0xCCBC, + 25226 - 19968: 0xF7EA, + 25233 - 19968: 0xE5E4, + 25234 - 19968: 0xDFF1, + 25237 - 19968: 0xF7E1, + 25239 - 19968: 0xF9F7, + 25240 - 19968: 0xEFB9, + 25243 - 19968: 0xF8D8, + 25259 - 19968: 0xF9A9, + 25265 - 19968: 0xF8D9, + 25269 - 19968: 0xEEBD, + 25273 - 19968: 0xD8C6, + 25276 - 19968: 0xE4E3, + 25277 - 19968: 0xF5CE, + 25282 - 19968: 0xDDD9, + 25287 - 19968: 0xD9E7, + 25288 - 19968: 0xD2B9, + 25289 - 19968: 0xD5C3, + 25292 - 19968: 0xDAE5, + 25293 - 19968: 0xDAD0, + 25295 - 19968: 0xD1D9, + 25296 - 19968: 0xCED8, + 25298 - 19968: 0xCBDE, + 25299 - 19968: 0xF4AC, + 25300 - 19968: 0xDAFB, + 25302 - 19968: 0xF6E9, + 25303 - 19968: 0xE8F3, + 25304 - 19968: 0xCFAC, + 25305 - 19968: 0xF0F0, + 25307 - 19968: 0xF4FD, + 25308 - 19968: 0xDBC8, + 25324 - 19968: 0xCEC0, + 25325 - 19968: 0xE3D4, + 25326 - 19968: 0xD1CF, + 25327 - 19968: 0xF1F5, + 25329 - 19968: 0xCDF2, + 25331 - 19968: 0xCFEB, + 25335 - 19968: 0xCDB8, + 25342 - 19968: 0xE3A6, + 25343 - 19968: 0xD1DA, + 25345 - 19968: 0xF2A5, + 25351 - 19968: 0xF2A6, + 25353 - 19968: 0xE4CE, + 25361 - 19968: 0xD3FB, + 25387 - 19968: 0xF1A9, + 25391 - 19968: 0xF2C9, + 25402 - 19968: 0xEFD8, + 25403 - 19968: 0xE6C9, + 25405 - 19968: 0xD8B8, + 25406 - 19968: 0xFAF3, + 25417 - 19968: 0xF3B5, + 25420 - 19968: 0xF8A4, + 25423 - 19968: 0xD1F3, + 25424 - 19968: 0xE6C8, + 25429 - 19968: 0xF8DA, + 25447 - 19968: 0xDCE9, + 25448 - 19968: 0xDED7, + 25454 - 19968: 0xCBDF, + 25458 - 19968: 0xCFEC, + 25463 - 19968: 0xF4DF, + 25466 - 19968: 0xD1F4, + 25467 - 19968: 0xD2BA, + 25471 - 19968: 0xDFF2, + 25475 - 19968: 0xE1B7, + 25480 - 19968: 0xE2A3, + 25481 - 19968: 0xD3FC, + 25484 - 19968: 0xEDE6, + 25490 - 19968: 0xDBC9, + 25494 - 19968: 0xE4FA, + 25496 - 19968: 0xCFDE, + 25499 - 19968: 0xCED0, + 25504 - 19968: 0xD5D3, + 25505 - 19968: 0xF3F5, + 25506 - 19968: 0xF7AE, + 25509 - 19968: 0xEFC8, + 25511 - 19968: 0xCDF3, + 25512 - 19968: 0xF5CF, + 25513 - 19968: 0xE5F3, + 25514 - 19968: 0xF0C2, + 25536 - 19968: 0xCAD1, + 25540 - 19968: 0xEAF1, + 25542 - 19968: 0xD0A6, + 25551 - 19968: 0xD9DA, + 25552 - 19968: 0xF0AB, + 25558 - 19968: 0xEBE7, + 25562 - 19968: 0xE5C0, + 25563 - 19968: 0xFCB5, + 25569 - 19968: 0xE4C4, + 25581 - 19968: 0xCCA9, + 25582 - 19968: 0xFDC6, + 25588 - 19968: 0xEAB5, + 25590 - 19968: 0xE5AA, + 25591 - 19968: 0xDFBA, + 25613 - 19968: 0xE1DF, + 25615 - 19968: 0xDAD1, + 25620 - 19968: 0xE1B8, + 25622 - 19968: 0xE8F4, + 25623 - 19968: 0xD3FD, + 25628 - 19968: 0xE2A4, + 25634 - 19968: 0xF2CA, + 25644 - 19968: 0xDAE6, + 25645 - 19968: 0xF7B3, + 25658 - 19968: 0xFDCD, + 25662 - 19968: 0xF3B6, + 25688 - 19968: 0xEED7, + 25696 - 19968: 0xF5C4, + 25705 - 19968: 0xD8A4, + 25711 - 19968: 0xF2A7, + 25720 - 19968: 0xD9B8, + 25721 - 19968: 0xD9B9, + 25722 - 19968: 0xEFC9, + 25736 - 19968: 0xD6CE, + 25745 - 19968: 0xF7CB, + 25746 - 19968: 0xDFAE, + 25747 - 19968: 0xE8F5, + 25754 - 19968: 0xD2B5, + 25758 - 19968: 0xD3D5, + 25764 - 19968: 0xF4CC, + 25765 - 19968: 0xDAFC, + 25771 - 19968: 0xD9E8, + 25773 - 19968: 0xF7EB, + 25774 - 19968: 0xF5C9, + 25776 - 19968: 0xF3BC, + 25778 - 19968: 0xDAD2, + 25787 - 19968: 0xD3B5, + 25793 - 19968: 0xE8B6, + 25796 - 19968: 0xD6CF, + 25797 - 19968: 0xF4BA, + 25799 - 19968: 0xF7C9, + 25802 - 19968: 0xCCAA, + 25805 - 19968: 0xF0C3, + 25806 - 19968: 0xCCD6, + 25810 - 19968: 0xD0D3, + 25812 - 19968: 0xD3BD, + 25816 - 19968: 0xDBFB, + 25818 - 19968: 0xCBE0, + 25825 - 19968: 0xD3E4, + 25826 - 19968: 0xF6F7, + 25829 - 19968: 0xD5BA, + 25830 - 19968: 0xF3CD, + 25831 - 19968: 0xCBE1, + 25836 - 19968: 0xEBF4, + 25842 - 19968: 0xF4AD, + 25844 - 19968: 0xFCAA, + 25850 - 19968: 0xF7EC, + 25854 - 19968: 0xE8F6, + 25856 - 19968: 0xDAE7, + 25860 - 19968: 0xF7CC, + 25880 - 19968: 0xE5C1, + 25885 - 19968: 0xE0EE, + 25891 - 19968: 0xD5FD, + 25898 - 19968: 0xCEE6, + 25899 - 19968: 0xFCAB, + 25900 - 19968: 0xD5BB, + 25903 - 19968: 0xF2A8, + 25910 - 19968: 0xE2A5, + 25911 - 19968: 0xCDB9, + 25912 - 19968: 0xEAF2, + 25913 - 19968: 0xCBC7, + 25915 - 19968: 0xCDF4, + 25918 - 19968: 0xDBAF, + 25919 - 19968: 0xEFD9, + 25925 - 19968: 0xCDBA, + 25928 - 19968: 0xFCF9, + 25933 - 19968: 0xDFF3, + 25934 - 19968: 0xCEE7, + 25935 - 19968: 0xDAC2, + 25937 - 19968: 0xCFAD, + 25942 - 19968: 0xE7F9, + 25943 - 19968: 0xF8A8, + 25950 - 19968: 0xF3E2, + 25954 - 19968: 0xCAF2, + 25955 - 19968: 0xDFA4, + 25958 - 19968: 0xD4C4, + 25964 - 19968: 0xCCD7, + 25965 - 19968: 0xE5C2, + 25970 - 19968: 0xCDBB, + 25972 - 19968: 0xEFDA, + 25973 - 19968: 0xEED8, + 25975 - 19968: 0xDDA7, + 25976 - 19968: 0xE2A6, + 25982 - 19968: 0xE0C0, + 25986 - 19968: 0xD6B0, + 25987 - 19968: 0xF8CA, + 25989 - 19968: 0xFCFA, + 25991 - 19968: 0xD9FE, + 25996 - 19968: 0xDEB0, + 26000 - 19968: 0xDDEC, + 26001 - 19968: 0xDAE8, + 26007 - 19968: 0xD4E0, + 26009 - 19968: 0xD6F9, + 26011 - 19968: 0xCDD7, + 26012 - 19968: 0xDED8, + 26015 - 19968: 0xF2F8, + 26017 - 19968: 0xE4D6, + 26020 - 19968: 0xD0C5, + 26021 - 19968: 0xF4AE, + 26023 - 19968: 0xDDA8, + 26027 - 19968: 0xEDC5, + 26028 - 19968: 0xF3D6, + 26031 - 19968: 0xDED9, + 26032 - 19968: 0xE3E6, + 26039 - 19968: 0xD3A8, + 26041 - 19968: 0xDBB0, + 26044 - 19968: 0xE5DA, + 26045 - 19968: 0xE3BF, + 26049 - 19968: 0xDBB1, + 26053 - 19968: 0xD5E9, + 26059 - 19968: 0xE0C1, + 26060 - 19968: 0xEFDB, + 26063 - 19968: 0xF0E9, + 26066 - 19968: 0xD7B2, + 26071 - 19968: 0xD0FD, + 26080 - 19968: 0xD9E9, + 26083 - 19968: 0xD0FE, + 26085 - 19968: 0xECED, + 26086 - 19968: 0xD3A9, + 26088 - 19968: 0xF2A9, + 26089 - 19968: 0xF0C4, + 26092 - 19968: 0xE2E2, + 26093 - 19968: 0xE9EF, + 26097 - 19968: 0xF9D1, + 26100 - 19968: 0xE9D9, + 26106 - 19968: 0xE8DA, + 26107 - 19968: 0xDAC3, + 26108 - 19968: 0xDAC4, + 26109 - 19968: 0xD4C5, + 26111 - 19968: 0xE7FA, + 26118 - 19968: 0xCDE0, + 26119 - 19968: 0xE3B0, + 26121 - 19968: 0xDBB2, + 26122 - 19968: 0xFBC4, + 26124 - 19968: 0xF3E3, + 26126 - 19968: 0xD9A5, + 26127 - 19968: 0xFBE7, + 26128 - 19968: 0xDDCB, + 26129 - 19968: 0xD0D4, + 26131 - 19968: 0xE6B6, + 26132 - 19968: 0xE0AE, + 26133 - 19968: 0xFDDA, + 26142 - 19968: 0xDCB5, + 26143 - 19968: 0xE0F8, + 26144 - 19968: 0xE7B1, + 26149 - 19968: 0xF5F0, + 26151 - 19968: 0xD8DC, + 26152 - 19968: 0xEDC6, + 26157 - 19968: 0xE1B9, + 26159 - 19968: 0xE3C0, + 26160 - 19968: 0xF9C0, + 26161 - 19968: 0xE9F0, + 26164 - 19968: 0xD9DB, + 26166 - 19968: 0xF3E4, + 26170 - 19968: 0xDCB6, + 26171 - 19968: 0xE4E9, + 26177 - 19968: 0xF0C5, + 26178 - 19968: 0xE3C1, + 26179 - 19968: 0xFCCC, + 26180 - 19968: 0xFCCD, + 26185 - 19968: 0xF2CB, + 26187 - 19968: 0xF2CC, + 26191 - 19968: 0xE4CF, + 26201 - 19968: 0xF1DB, + 26203 - 19968: 0xFAD9, + 26205 - 19968: 0xF1B8, + 26206 - 19968: 0xFDF5, + 26207 - 19968: 0xE0F9, + 26212 - 19968: 0xE7FB, + 26213 - 19968: 0xFCB7, + 26214 - 19968: 0xFCE4, + 26215 - 19968: 0xFBC5, + 26216 - 19968: 0xE3E7, + 26217 - 19968: 0xD8B9, + 26219 - 19968: 0xF6F8, + 26222 - 19968: 0xDCC5, + 26223 - 19968: 0xCCD8, + 26227 - 19968: 0xE0AF, + 26228 - 19968: 0xF4E7, + 26230 - 19968: 0xEFDC, + 26231 - 19968: 0xCFFC, + 26232 - 19968: 0xEFDD, + 26234 - 19968: 0xF2AA, + 26244 - 19968: 0xFDBE, + 26247 - 19968: 0xCAAC, + 26248 - 19968: 0xFDBB, + 26249 - 19968: 0xFDC7, + 26254 - 19968: 0xE7B2, + 26256 - 19968: 0xEAD1, + 26257 - 19968: 0xDFF4, + 26262 - 19968: 0xD1EC, + 26263 - 19968: 0xE4DE, + 26264 - 19968: 0xE5C3, + 26269 - 19968: 0xD9A6, + 26272 - 19968: 0xCDBC, + 26274 - 19968: 0xF3E5, + 26283 - 19968: 0xEDD5, + 26286 - 19968: 0xD9BA, + 26290 - 19968: 0xEDE7, + 26291 - 19968: 0xFBB5, + 26292 - 19968: 0xF8EC, + 26297 - 19968: 0xE0E7, + 26299 - 19968: 0xCCD9, + 26302 - 19968: 0xD4C6, + 26308 - 19968: 0xE7A5, + 26310 - 19968: 0xD5F5, + 26311 - 19968: 0xD3BE, + 26313 - 19968: 0xFCFB, + 26326 - 19968: 0xE4F2, + 26329 - 19968: 0xDFF5, + 26332 - 19968: 0xE8F8, + 26333 - 19968: 0xF8ED, + 26336 - 19968: 0xCEC7, + 26342 - 19968: 0xFDF6, + 26352 - 19968: 0xE8D8, + 26354 - 19968: 0xCDD8, + 26355 - 19968: 0xE7D6, + 26356 - 19968: 0xCCDA, + 26359 - 19968: 0xCAE3, + 26360 - 19968: 0xDFF6, + 26361 - 19968: 0xF0C7, + 26362 - 19968: 0xF0C6, + 26364 - 19968: 0xD8BA, + 26366 - 19968: 0xF1F4, + 26367 - 19968: 0xF4F0, + 26368 - 19968: 0xF5CC, + 26371 - 19968: 0xFCE5, + 26376 - 19968: 0xEAC5, + 26377 - 19968: 0xEAF3, + 26379 - 19968: 0xDDDB, + 26381 - 19968: 0xDCD7, + 26388 - 19968: 0xDEFD, + 26389 - 19968: 0xF2F9, + 26391 - 19968: 0xD5C7, + 26395 - 19968: 0xD8D0, + 26397 - 19968: 0xF0C8, + 26398 - 19968: 0xD1A1, + 26399 - 19968: 0xD1A2, + 26406 - 19968: 0xD9D4, + 26407 - 19968: 0xD6E8, + 26408 - 19968: 0xD9CA, + 26410 - 19968: 0xDAB1, + 26411 - 19968: 0xD8C7, + 26412 - 19968: 0xDCE2, + 26413 - 19968: 0xF3CE, + 26414 - 19968: 0xF5F4, + 26417 - 19968: 0xF1B9, + 26420 - 19968: 0xDAD3, + 26422 - 19968: 0xF6EA, + 26426 - 19968: 0xCFF5, + 26429 - 19968: 0xFDAE, + 26438 - 19968: 0xCAD2, + 26441 - 19968: 0xDFB4, + 26446 - 19968: 0xD7DD, + 26447 - 19968: 0xFABA, + 26448 - 19968: 0xEEA7, + 26449 - 19968: 0xF5BD, + 26451 - 19968: 0xF8F5, + 26454 - 19968: 0xEDE8, + 26460 - 19968: 0xD4E1, + 26462 - 19968: 0xD1A3, + 26463 - 19968: 0xE1D6, + 26477 - 19968: 0xF9F8, + 26479 - 19968: 0xDBCA, + 26480 - 19968: 0xCBF9, + 26481 - 19968: 0xD4D4, + 26483 - 19968: 0xD9DC, + 26485 - 19968: 0xEEBE, + 26487 - 19968: 0xF7ED, + 26491 - 19968: 0xD2EE, + 26494 - 19968: 0xE1E6, + 26495 - 19968: 0xF7F9, + 26503 - 19968: 0xDDED, + 26505 - 19968: 0xE8DB, + 26507 - 19968: 0xDBB3, + 26511 - 19968: 0xD1F7, + 26512 - 19968: 0xE0B0, + 26515 - 19968: 0xD4E2, + 26517 - 19968: 0xF6D7, + 26519 - 19968: 0xD7F9, + 26522 - 19968: 0xD8DD, + 26524 - 19968: 0xCDFD, + 26525 - 19968: 0xF2AB, + 26543 - 19968: 0xCDBD, + 26544 - 19968: 0xF8C2, + 26547 - 19968: 0xF2AC, + 26550 - 19968: 0xCAAD, + 26551 - 19968: 0xCAAE, + 26552 - 19968: 0xCFAE, + 26558 - 19968: 0xE3C2, + 26564 - 19968: 0xDCB7, + 26575 - 19968: 0xDBDA, + 26576 - 19968: 0xD9BB, + 26577 - 19968: 0xCAF3, + 26578 - 19968: 0xF6D3, + 26579 - 19968: 0xE6F8, + 26580 - 19968: 0xEAF5, + 26586 - 19968: 0xEAF6, + 26589 - 19968: 0xF6F9, + 26601 - 19968: 0xCFAF, + 26604 - 19968: 0xCAD3, + 26607 - 19968: 0xCAAF, + 26608 - 19968: 0xD2B0, + 26609 - 19968: 0xF1BA, + 26611 - 19968: 0xD7B3, + 26612 - 19968: 0xE3C3, + 26613 - 19968: 0xF3FD, + 26614 - 19968: 0xDEDA, + 26619 - 19968: 0xDEDB, + 26622 - 19968: 0xEFDE, + 26642 - 19968: 0xE2E3, + 26643 - 19968: 0xEEFB, + 26646 - 19968: 0xDFF7, + 26647 - 19968: 0xD7CA, + 26657 - 19968: 0xCEE8, + 26658 - 19968: 0xDBDB, + 26666 - 19968: 0xF1BB, + 26671 - 19968: 0xE9F1, + 26680 - 19968: 0xFAB7, + 26681 - 19968: 0xD0C6, + 26684 - 19968: 0xCCAB, + 26685 - 19968: 0xEEA8, + 26688 - 19968: 0xCBFA, + 26689 - 19968: 0xF9F9, + 26690 - 19968: 0xCCFD, + 26691 - 19968: 0xD3FE, + 26696 - 19968: 0xE4D0, + 26702 - 19968: 0xF2EE, + 26704 - 19968: 0xD4D5, + 26705 - 19968: 0xDFCD, + 26707 - 19968: 0xFCB8, + 26708 - 19968: 0xD1D0, + 26733 - 19968: 0xF2CD, + 26742 - 19968: 0xF7D2, + 26751 - 19968: 0xCAD4, + 26753 - 19968: 0xD5D9, + 26757 - 19968: 0xD8DE, + 26767 - 19968: 0xCDD9, + 26771 - 19968: 0xEEA9, + 26772 - 19968: 0xF6BC, + 26775 - 19968: 0xCCDB, + 26781 - 19968: 0xF0C9, + 26783 - 19968: 0xFCFC, + 26785 - 19968: 0xE8C9, + 26786 - 19968: 0xF4FE, + 26791 - 19968: 0xE7FC, + 26792 - 19968: 0xD7DE, + 26797 - 19968: 0xDEDC, + 26799 - 19968: 0xF0AC, + 26800 - 19968: 0xCCFE, + 26801 - 19968: 0xCDE1, + 26803 - 19968: 0xE1BA, + 26805 - 19968: 0xDBEF, + 26806 - 19968: 0xDAB2, + 26820 - 19968: 0xD1A5, + 26821 - 19968: 0xDCB8, + 26825 - 19968: 0xD8F6, + 26827 - 19968: 0xD1A4, + 26829 - 19968: 0xCDE2, + 26834 - 19968: 0xDCEA, + 26837 - 19968: 0xF0F7, + 26839 - 19968: 0xF0CA, + 26840 - 19968: 0xD0BE, + 26842 - 19968: 0xDDDC, + 26847 - 19968: 0xD4D6, + 26848 - 19968: 0xD3D6, + 26855 - 19968: 0xEDD0, + 26856 - 19968: 0xCDA1, + 26862 - 19968: 0xDFB5, + 26866 - 19968: 0xDFF8, + 26873 - 19968: 0xD4A1, + 26874 - 19968: 0xCEB2, + 26880 - 19968: 0xE8CA, + 26885 - 19968: 0xEBF5, + 26893 - 19968: 0xE3D5, + 26894 - 19968: 0xF5D0, + 26898 - 19968: 0xF5A1, + 26919 - 19968: 0xD9A7, + 26928 - 19968: 0xE5AB, + 26941 - 19968: 0xE6CB, + 26943 - 19968: 0xF5F1, + 26954 - 19968: 0xE5C5, + 26963 - 19968: 0xF9A3, + 26964 - 19968: 0xE0DB, + 26965 - 19968: 0xF6EB, + 26967 - 19968: 0xCBF1, + 26969 - 19968: 0xD9EA, + 26970 - 19968: 0xF5A2, + 26974 - 19968: 0xD7D1, + 26976 - 19968: 0xD1F8, + 26977 - 19968: 0xEAF8, + 26978 - 19968: 0xEAF9, + 26979 - 19968: 0xDAB3, + 26984 - 19968: 0xEFDF, + 26987 - 19968: 0xF1EF, + 26989 - 19968: 0xE5F6, + 26990 - 19968: 0xEEBF, + 26991 - 19968: 0xE2E4, + 26997 - 19968: 0xD0BF, + 26999 - 19968: 0xFAAC, + 27000 - 19968: 0xF5D1, + 27001 - 19968: 0xE7B3, + 27029 - 19968: 0xE9BE, + 27035 - 19968: 0xF2CE, + 27036 - 19968: 0xDBB4, + 27045 - 19968: 0xFCCE, + 27047 - 19968: 0xDDEE, + 27054 - 19968: 0xE7B4, + 27060 - 19968: 0xD7B4, + 27067 - 19968: 0xF7B4, + 27073 - 19968: 0xCDBE, + 27075 - 19968: 0xDAE9, + 27083 - 19968: 0xCFB0, + 27084 - 19968: 0xF7D9, + 27085 - 19968: 0xF3E6, + 27088 - 19968: 0xCED9, + 27112 - 19968: 0xCEAA, + 27114 - 19968: 0xCBC8, + 27131 - 19968: 0xD0A7, + 27133 - 19968: 0xF0CB, + 27135 - 19968: 0xD0C7, + 27138 - 19968: 0xE4C5, + 27146 - 19968: 0xDBE0, + 27153 - 19968: 0xD5DA, + 27155 - 19968: 0xD7A7, + 27159 - 19968: 0xEEC0, + 27161 - 19968: 0xF8F6, + 27166 - 19968: 0xF5D2, + 27167 - 19968: 0xEDE9, + 27169 - 19968: 0xD9BC, + 27171 - 19968: 0xE5C6, + 27189 - 19968: 0xF5A3, + 27192 - 19968: 0xDAD4, + 27193 - 19968: 0xE2A7, + 27194 - 19968: 0xFBFC, + 27197 - 19968: 0xF1DC, + 27204 - 19968: 0xCAF4, + 27208 - 19968: 0xE8FA, + 27211 - 19968: 0xCEE9, + 27218 - 19968: 0xE9F8, + 27219 - 19968: 0xE2E5, + 27224 - 19968: 0xD0B9, + 27225 - 19968: 0xD4F2, + 27231 - 19968: 0xD1A6, + 27233 - 19968: 0xDFCE, + 27243 - 19968: 0xFCF4, + 27264 - 19968: 0xD3AA, + 27268 - 19968: 0xCCAC, + 27273 - 19968: 0xEFE0, + 27277 - 19968: 0xE5E5, + 27278 - 19968: 0xD0D5, + 27287 - 19968: 0xDBFC, + 27292 - 19968: 0xFCE6, + 27298 - 19968: 0xCBFE, + 27299 - 19968: 0xEDEA, + 27315 - 19968: 0xDEB1, + 27323 - 19968: 0xF9E3, + 27330 - 19968: 0xD4A2, + 27331 - 19968: 0xCFF6, + 27347 - 19968: 0xD6D0, + 27354 - 19968: 0xD5EA, + 27355 - 19968: 0xF1EE, + 27382 - 19968: 0xFACB, + 27387 - 19968: 0xE5A1, + 27396 - 19968: 0xD5B1, + 27402 - 19968: 0xCFED, + 27404 - 19968: 0xEDEB, + 27410 - 19968: 0xD5B2, + 27414 - 19968: 0xD5BC, + 27424 - 19968: 0xFDE2, + 27425 - 19968: 0xF3AD, + 27427 - 19968: 0xFDDB, + 27442 - 19968: 0xE9B0, + 27450 - 19968: 0xD1A7, + 27453 - 19968: 0xFDE3, + 27454 - 19968: 0xCEB3, + 27462 - 19968: 0xFDE4, + 27463 - 19968: 0xFACE, + 27468 - 19968: 0xCAB0, + 27470 - 19968: 0xF7A7, + 27472 - 19968: 0xCFB1, + 27487 - 19968: 0xE6A2, + 27489 - 19968: 0xFCB6, + 27490 - 19968: 0xF2AD, + 27491 - 19968: 0xEFE1, + 27492 - 19968: 0xF3AE, + 27493 - 19968: 0xDCC6, + 27494 - 19968: 0xD9EB, + 27498 - 19968: 0xE8E0, + 27506 - 19968: 0xE1A8, + 27511 - 19968: 0xD5F6, + 27512 - 19968: 0xCFFD, + 27515 - 19968: 0xDEDD, + 27519 - 19968: 0xD9D1, + 27523 - 19968: 0xE4EA, + 27524 - 19968: 0xF2CF, + 27526 - 19968: 0xF7BF, + 27529 - 19968: 0xE2E6, + 27530 - 19968: 0xE2A8, + 27542 - 19968: 0xE3D6, + 27544 - 19968: 0xEDD1, + 27550 - 19968: 0xE9F9, + 27566 - 19968: 0xD6B1, + 27567 - 19968: 0xDEB2, + 27570 - 19968: 0xE0E8, + 27573 - 19968: 0xD3AB, + 27575 - 19968: 0xEBDC, + 27578 - 19968: 0xDFAF, + 27580 - 19968: 0xCAC3, + 27583 - 19968: 0xEEFC, + 27585 - 19968: 0xFDC3, + 27589 - 19968: 0xEBF6, + 27590 - 19968: 0xCFB2, + 27595 - 19968: 0xD9EC, + 27597 - 19968: 0xD9BD, + 27599 - 19968: 0xD8DF, + 27602 - 19968: 0xD4B8, + 27603 - 19968: 0xEBBE, + 27604 - 19968: 0xDDEF, + 27606 - 19968: 0xDDF0, + 27607 - 19968: 0xDDF1, + 27608 - 19968: 0xDDF2, + 27611 - 19968: 0xD9BE, + 27627 - 19968: 0xFBC6, + 27628 - 19968: 0xCFB3, + 27656 - 19968: 0xEEFD, + 27663 - 19968: 0xE4AB, + 27665 - 19968: 0xDAC5, + 27667 - 19968: 0xD8EC, + 27683 - 19968: 0xD1A8, + 27700 - 19968: 0xE2A9, + 27703 - 19968: 0xDEBC, + 27704 - 19968: 0xE7B5, + 27710 - 19968: 0xDBF0, + 27712 - 19968: 0xEFE2, + 27713 - 19968: 0xF1F0, + 27714 - 19968: 0xCFB4, + 27726 - 19968: 0xDBF1, + 27728 - 19968: 0xE0B1, + 27733 - 19968: 0xDFA5, + 27735 - 19968: 0xF9D2, + 27738 - 19968: 0xE7FD, + 27741 - 19968: 0xE6A3, + 27742 - 19968: 0xFBF1, + 27743 - 19968: 0xCBB0, + 27744 - 19968: 0xF2AE, + 27752 - 19968: 0xCDE7, + 27754 - 19968: 0xE8DC, + 27757 - 19968: 0xE7D7, + 27760 - 19968: 0xF7C0, + 27762 - 19968: 0xD0E3, + 27766 - 19968: 0xDAA1, + 27770 - 19968: 0xCCBD, + 27773 - 19968: 0xD1A9, + 27774 - 19968: 0xDDCC, + 27777 - 19968: 0xE3FE, + 27778 - 19968: 0xD1AA, + 27779 - 19968: 0xE8AA, + 27781 - 19968: 0xEAB6, + 27782 - 19968: 0xF9FA, + 27783 - 19968: 0xE6CC, + 27784 - 19968: 0xF6D8, + 27788 - 19968: 0xD4C7, + 27792 - 19968: 0xD9CB, + 27794 - 19968: 0xD9D2, + 27795 - 19968: 0xD3CB, + 27796 - 19968: 0xD8F7, + 27797 - 19968: 0xDAA9, + 27798 - 19968: 0xF5F8, + 27801 - 19968: 0xDEDE, + 27802 - 19968: 0xF2AF, + 27803 - 19968: 0xF8A9, + 27819 - 19968: 0xD8C8, + 27822 - 19968: 0xEEC1, + 27827 - 19968: 0xF9C1, + 27832 - 19968: 0xDDF3, + 27833 - 19968: 0xEAFA, + 27835 - 19968: 0xF6BD, + 27836 - 19968: 0xE1BB, + 27837 - 19968: 0xCDBF, + 27838 - 19968: 0xF4D4, + 27839 - 19968: 0xE6CD, + 27841 - 19968: 0xFCCF, + 27842 - 19968: 0xFBA2, + 27844 - 19968: 0xE0DC, + 27849 - 19968: 0xF4BB, + 27850 - 19968: 0xDAD5, + 27852 - 19968: 0xF9B2, + 27859 - 19968: 0xFBF2, + 27861 - 19968: 0xDBF6, + 27863 - 19968: 0xDEDF, + 27867 - 19968: 0xDBF2, + 27873 - 19968: 0xF8DC, + 27874 - 19968: 0xF7EE, + 27875 - 19968: 0xEBE8, + 27877 - 19968: 0xD2FA, + 27880 - 19968: 0xF1BC, + 27883 - 19968: 0xFADA, + 27886 - 19968: 0xDAEA, + 27887 - 19968: 0xDAC6, + 27888 - 19968: 0xF7C1, + 27891 - 19968: 0xE7B6, + 27915 - 19968: 0xE5C7, + 27916 - 19968: 0xD6AC, + 27921 - 19968: 0xDCC7, + 27927 - 19968: 0xE1A9, + 27929 - 19968: 0xE2AA, + 27931 - 19968: 0xD5A6, + 27934 - 19968: 0xD4D7, + 27941 - 19968: 0xF2D0, + 27943 - 19968: 0xEAFB, + 27945 - 19968: 0xE0DD, + 27946 - 19968: 0xFBF3, + 27954 - 19968: 0xF1BD, + 27957 - 19968: 0xE2E7, + 27958 - 19968: 0xFDD7, + 27960 - 19968: 0xCEC8, + 27961 - 19968: 0xEAB7, + 27963 - 19968: 0xFCC0, + 27965 - 19968: 0xFDE7, + 27966 - 19968: 0xF7EF, + 27969 - 19968: 0xD7B5, + 27993 - 19968: 0xEFBA, + 27994 - 19968: 0xF1DD, + 27996 - 19968: 0xDEB3, + 28003 - 19968: 0xE8CB, + 28006 - 19968: 0xF8DD, + 28009 - 19968: 0xFBC7, + 28010 - 19968: 0xD5C8, + 28012 - 19968: 0xD7DF, + 28014 - 19968: 0xDDA9, + 28020 - 19968: 0xE9B1, + 28023 - 19968: 0xFAAD, + 28024 - 19968: 0xF6D9, + 28025 - 19968: 0xFAF4, + 28031 - 19968: 0xF8AA, + 28037 - 19968: 0xE6EE, + 28039 - 19968: 0xCCDC, + 28040 - 19968: 0xE1BC, + 28041 - 19968: 0xE0EF, + 28044 - 19968: 0xE9BF, + 28045 - 19968: 0xFCFD, + 28046 - 19968: 0xE6CE, + 28049 - 19968: 0xE1D7, + 28051 - 19968: 0xE6CF, + 28053 - 19968: 0xF4F1, + 28079 - 19968: 0xE4F3, + 28082 - 19968: 0xE4FB, + 28085 - 19968: 0xF9E4, + 28096 - 19968: 0xEFE3, + 28099 - 19968: 0xCFEE, + 28100 - 19968: 0xF6BE, + 28101 - 19968: 0xE0B2, + 28102 - 19968: 0xFCFE, + 28103 - 19968: 0xD1AB, + 28107 - 19968: 0xD7FA, + 28111 - 19968: 0xFBC8, + 28113 - 19968: 0xE2D7, + 28120 - 19968: 0xD4A3, + 28121 - 19968: 0xF0F8, + 28122 - 19968: 0xD7A8, + 28126 - 19968: 0xE1E7, + 28129 - 19968: 0xD3BF, + 28136 - 19968: 0xEFE4, + 28138 - 19968: 0xD7C5, + 28139 - 19968: 0xEBE2, + 28142 - 19968: 0xFCE7, + 28145 - 19968: 0xE4A2, + 28147 - 19968: 0xE2E8, + 28149 - 19968: 0xE6D0, + 28151 - 19968: 0xFBE8, + 28152 - 19968: 0xF4E8, + 28153 - 19968: 0xE5F4, + 28154 - 19968: 0xF4BC, + 28155 - 19968: 0xF4D5, + 28183 - 19968: 0xDFB6, + 28185 - 19968: 0xFCB9, + 28186 - 19968: 0xEEC2, + 28187 - 19968: 0xCAF5, + 28191 - 19968: 0xEFE5, + 28192 - 19968: 0xCBE2, + 28193 - 19968: 0xD4A4, + 28195 - 19968: 0xDEE0, + 28196 - 19968: 0xDAFD, + 28197 - 19968: 0xE4C6, + 28198 - 19968: 0xE8BE, + 28203 - 19968: 0xE0DE, + 28204 - 19968: 0xF6B4, + 28205 - 19968: 0xEAD2, + 28207 - 19968: 0xF9FB, + 28210 - 19968: 0xE0C2, + 28212 - 19968: 0xCAE4, + 28214 - 19968: 0xE7B7, + 28216 - 19968: 0xEAFD, + 28218 - 19968: 0xD9DD, + 28220 - 19968: 0xDAB4, + 28221 - 19968: 0xEEAA, + 28222 - 19968: 0xFBE9, + 28227 - 19968: 0xDBCB, + 28228 - 19968: 0xDAB5, + 28234 - 19968: 0xF1BE, + 28237 - 19968: 0xD3AC, + 28246 - 19968: 0xFBC9, + 28248 - 19968: 0xDFCF, + 28251 - 19968: 0xD3C0, + 28252 - 19968: 0xE3D7, + 28254 - 19968: 0xEFE6, + 28255 - 19968: 0xFCD0, + 28263 - 19968: 0xE9C0, + 28267 - 19968: 0xF5D3, + 28270 - 19968: 0xECDC, + 28271 - 19968: 0xF7B7, + 28274 - 19968: 0xEAB8, + 28275 - 19968: 0xD1F9, + 28282 - 19968: 0xDCC8, + 28304 - 19968: 0xEAB9, + 28310 - 19968: 0xF1DE, + 28316 - 19968: 0xD7B6, + 28317 - 19968: 0xCFB5, + 28319 - 19968: 0xD9A8, + 28322 - 19968: 0xECEE, + 28325 - 19968: 0xDDAA, + 28330 - 19968: 0xCDA2, + 28331 - 19968: 0xE8AE, + 28335 - 19968: 0xE1BD, + 28337 - 19968: 0xF2D1, + 28342 - 19968: 0xE9C1, + 28346 - 19968: 0xD2FC, + 28354 - 19968: 0xDBB5, + 28356 - 19968: 0xF3E7, + 28357 - 19968: 0xD8FE, + 28361 - 19968: 0xFCD1, + 28363 - 19968: 0xEDB2, + 28364 - 19968: 0xF4AF, + 28366 - 19968: 0xFBA3, + 28369 - 19968: 0xFCC1, + 28371 - 19968: 0xEEAB, + 28372 - 19968: 0xD4A5, + 28399 - 19968: 0xF4F2, + 28404 - 19968: 0xEED9, + 28408 - 19968: 0xFBCA, + 28414 - 19968: 0xCDE3, + 28415 - 19968: 0xD8BB, + 28417 - 19968: 0xE5DB, + 28418 - 19968: 0xF8F7, + 28422 - 19968: 0xF6D4, + 28431 - 19968: 0xD7A9, + 28433 - 19968: 0xCBC9, + 28436 - 19968: 0xE6D1, + 28437 - 19968: 0xF0CC, + 28448 - 19968: 0xD8AE, + 28450 - 19968: 0xF9D3, + 28451 - 19968: 0xD5FE, + 28459 - 19968: 0xD8BC, + 28460 - 19968: 0xF2B0, + 28465 - 19968: 0xE2AB, + 28466 - 19968: 0xF3E8, + 28472 - 19968: 0xEFC2, + 28479 - 19968: 0xEDEC, + 28481 - 19968: 0xE7B8, + 28497 - 19968: 0xDAFE, + 28500 - 19968: 0xCCBE, + 28503 - 19968: 0xF2FC, + 28504 - 19968: 0xDAEB, + 28506 - 19968: 0xE2D8, + 28507 - 19968: 0xEDD6, + 28510 - 19968: 0xD6D1, + 28511 - 19968: 0xE0B3, + 28514 - 19968: 0xFCD2, + 28516 - 19968: 0xEBC8, + 28525 - 19968: 0xD3C1, + 28526 - 19968: 0xF0CD, + 28528 - 19968: 0xCFF7, + 28538 - 19968: 0xEDD2, + 28540 - 19968: 0xD4D8, + 28541 - 19968: 0xDCC9, + 28542 - 19968: 0xD7F1, + 28545 - 19968: 0xDFBB, + 28548 - 19968: 0xF3A5, + 28552 - 19968: 0xF4CD, + 28557 - 19968: 0xF1BF, + 28558 - 19968: 0xF8B1, + 28560 - 19968: 0xE9FA, + 28564 - 19968: 0xFBCB, + 28567 - 19968: 0xCAD5, + 28579 - 19968: 0xF9D4, + 28580 - 19968: 0xF7CA, + 28583 - 19968: 0xD6C8, + 28590 - 19968: 0xFCE8, + 28591 - 19968: 0xF3BD, + 28593 - 19968: 0xEEFE, + 28595 - 19968: 0xE7FE, + 28601 - 19968: 0xD3C2, + 28606 - 19968: 0xD3B6, + 28608 - 19968: 0xCCAD, + 28609 - 19968: 0xF6FA, + 28610 - 19968: 0xD6B2, + 28611 - 19968: 0xD2D8, + 28618 - 19968: 0xE7D8, + 28629 - 19968: 0xE3A5, + 28634 - 19968: 0xE7B9, + 28639 - 19968: 0xF0AD, + 28640 - 19968: 0xFBCC, + 28641 - 19968: 0xEBA1, + 28644 - 19968: 0xD4A6, + 28649 - 19968: 0xFBCD, + 28651 - 19968: 0xD5BD, + 28652 - 19968: 0xF1DF, + 28655 - 19968: 0xF6FB, + 28657 - 19968: 0xDEB4, + 28670 - 19968: 0xD5EB, + 28673 - 19968: 0xE5C8, + 28677 - 19968: 0xFBA4, + 28678 - 19968: 0xD4B9, + 28681 - 19968: 0xDEE1, + 28683 - 19968: 0xE4A3, + 28687 - 19968: 0xD7B7, + 28689 - 19968: 0xF8EE, + 28693 - 19968: 0xDEB5, + 28696 - 19968: 0xD6D2, + 28698 - 19968: 0xF9D5, + 28699 - 19968: 0xE7BA, + 28700 - 19968: 0xEBD5, + 28701 - 19968: 0xD5F7, + 28702 - 19968: 0xEFE7, + 28703 - 19968: 0xE1BE, + 28707 - 19968: 0xFAAE, + 28711 - 19968: 0xD6E9, + 28712 - 19968: 0xD6EE, + 28719 - 19968: 0xE7BB, + 28727 - 19968: 0xECCB, + 28734 - 19968: 0xD5B3, + 28748 - 19968: 0xCEB4, + 28752 - 19968: 0xFBA5, + 28753 - 19968: 0xE1EE, + 28760 - 19968: 0xF7A8, + 28765 - 19968: 0xFBCE, + 28771 - 19968: 0xD8BD, + 28779 - 19968: 0xFBFD, + 28784 - 19968: 0xFCE9, + 28792 - 19968: 0xCFB6, + 28796 - 19968: 0xEDC7, + 28797 - 19968: 0xEEAC, + 28805 - 19968: 0xCCDD, + 28810 - 19968: 0xF6A7, + 28814 - 19968: 0xE6FA, + 28818 - 19968: 0xF5A4, + 28824 - 19968: 0xFDDC, + 28825 - 19968: 0xEDB3, + 28826 - 19968: 0xCEC9, + 28833 - 19968: 0xEFE8, + 28836 - 19968: 0xE1BF, + 28843 - 19968: 0xFADB, + 28844 - 19968: 0xCBE3, + 28845 - 19968: 0xF7A9, + 28847 - 19968: 0xFBA6, + 28851 - 19968: 0xDCB9, + 28855 - 19968: 0xF1C0, + 28856 - 19968: 0xEDC8, + 28857 - 19968: 0xEFC3, + 28872 - 19968: 0xD6AD, + 28875 - 19968: 0xFDCE, + 28879 - 19968: 0xE8A1, + 28888 - 19968: 0xFBF4, + 28889 - 19968: 0xD5A7, + 28893 - 19968: 0xF1F6, + 28895 - 19968: 0xE6D3, + 28913 - 19968: 0xCCDE, + 28921 - 19968: 0xF8B2, + 28925 - 19968: 0xDCEB, + 28932 - 19968: 0xFDB6, + 28937 - 19968: 0xE5EA, + 28940 - 19968: 0xF1E0, + 28953 - 19968: 0xDBCC, + 28954 - 19968: 0xDDCD, + 28958 - 19968: 0xD4C8, + 28961 - 19968: 0xD9ED, + 28966 - 19968: 0xF5A5, + 28976 - 19968: 0xE6FB, + 28982 - 19968: 0xE6D4, + 28999 - 19968: 0xFDC8, + 29001 - 19968: 0xD6A1, + 29002 - 19968: 0xFDBF, + 29004 - 19968: 0xFCD3, + 29006 - 19968: 0xEFA1, + 29008 - 19968: 0xE7BC, + 29014 - 19968: 0xD1EE, + 29017 - 19968: 0xE6D5, + 29020 - 19968: 0xE9F2, + 29022 - 19968: 0xDFB0, + 29028 - 19968: 0xD8E0, + 29029 - 19968: 0xFCBA, + 29030 - 19968: 0xFDAF, + 29031 - 19968: 0xF0CE, + 29033 - 19968: 0xDBE1, + 29036 - 19968: 0xE5C9, + 29038 - 19968: 0xEDB4, + 29053 - 19968: 0xE0C3, + 29060 - 19968: 0xE3D8, + 29065 - 19968: 0xE9FB, + 29066 - 19968: 0xEAA8, + 29071 - 19968: 0xFDB7, + 29074 - 19968: 0xFBA7, + 29076 - 19968: 0xE9C2, + 29081 - 19968: 0xFDF7, + 29087 - 19968: 0xE2D9, + 29090 - 19968: 0xDCEC, + 29100 - 19968: 0xE8A2, + 29105 - 19968: 0xE6F0, + 29113 - 19968: 0xFDF8, + 29114 - 19968: 0xFDF9, + 29118 - 19968: 0xF6BF, + 29121 - 19968: 0xE7A7, + 29123 - 19968: 0xE6D7, + 29128 - 19968: 0xD4F3, + 29129 - 19968: 0xD4C9, + 29134 - 19968: 0xD6FA, + 29136 - 19968: 0xD7F2, + 29138 - 19968: 0xE1C0, + 29140 - 19968: 0xDBE2, + 29141 - 19968: 0xE6D8, + 29151 - 19968: 0xE7BD, + 29157 - 19968: 0xF0CF, + 29158 - 19968: 0xF3BE, + 29159 - 19968: 0xE2AC, + 29165 - 19968: 0xF5B7, + 29166 - 19968: 0xE0F0, + 29179 - 19968: 0xFDB8, + 29180 - 19968: 0xE3E8, + 29182 - 19968: 0xD4A7, + 29183 - 19968: 0xE8FC, + 29184 - 19968: 0xFAD2, + 29190 - 19968: 0xF8EF, + 29200 - 19968: 0xD6D3, + 29211 - 19968: 0xD5B4, + 29226 - 19968: 0xF0D0, + 29228 - 19968: 0xF7F0, + 29229 - 19968: 0xEEB3, + 29232 - 19968: 0xEABA, + 29234 - 19968: 0xEAD3, + 29237 - 19968: 0xEDC9, + 29238 - 19968: 0xDDAB, + 29242 - 19968: 0xE5AC, + 29243 - 19968: 0xFDA1, + 29245 - 19968: 0xDFD0, + 29246 - 19968: 0xECB3, + 29248 - 19968: 0xDFD1, + 29254 - 19968: 0xEDED, + 29255 - 19968: 0xF8B8, + 29256 - 19968: 0xF7FA, + 29260 - 19968: 0xF8AB, + 29266 - 19968: 0xF4E0, + 29272 - 19968: 0xD4BA, + 29273 - 19968: 0xE4B3, + 29275 - 19968: 0xE9DA, + 29277 - 19968: 0xDEB6, + 29279 - 19968: 0xD9BF, + 29281 - 19968: 0xD9C0, + 29282 - 19968: 0xD6EF, + 29287 - 19968: 0xD9CC, + 29289 - 19968: 0xDAAA, + 29298 - 19968: 0xDFE5, + 29305 - 19968: 0xF7E5, + 29309 - 19968: 0xCCB2, + 29312 - 19968: 0xDFF9, + 29313 - 19968: 0xD7E0, + 29346 - 19968: 0xD4BB, + 29351 - 19968: 0xFDFA, + 29356 - 19968: 0xCCB3, + 29359 - 19968: 0xDBF3, + 29376 - 19968: 0xDFD2, + 29378 - 19968: 0xCECA, + 29380 - 19968: 0xEEDA, + 29390 - 19968: 0xE4E4, + 29392 - 19968: 0xFBCF, + 29399 - 19968: 0xCFB7, + 29401 - 19968: 0xEEC3, + 29409 - 19968: 0xCEEA, + 29417 - 19968: 0xE2AD, + 29432 - 19968: 0xD7E1, + 29433 - 19968: 0xFAF5, + 29436 - 19968: 0xD5C9, + 29437 - 19968: 0xF8AC, + 29450 - 19968: 0xE7D9, + 29462 - 19968: 0xF3E9, + 29467 - 19968: 0xD8ED, + 29468 - 19968: 0xE3C4, + 29469 - 19968: 0xF0F1, + 29477 - 19968: 0xE8E5, + 29481 - 19968: 0xE0FA, + 29482 - 19968: 0xEEC4, + 29483 - 19968: 0xD9DE, + 29494 - 19968: 0xEBA2, + 29495 - 19968: 0xEBA3, + 29502 - 19968: 0xFCC2, + 29503 - 19968: 0xEABB, + 29508 - 19968: 0xE8AB, + 29509 - 19968: 0xDEE2, + 29520 - 19968: 0xEDEF, + 29522 - 19968: 0xE8A3, + 29527 - 19968: 0xCFF1, + 29544 - 19968: 0xD4BC, + 29546 - 19968: 0xFCEA, + 29552 - 19968: 0xE7BE, + 29554 - 19968: 0xFCF2, + 29557 - 19968: 0xD6B4, + 29560 - 19968: 0xE2AE, + 29562 - 19968: 0xD3B7, + 29563 - 19968: 0xFACC, + 29572 - 19968: 0xFADC, + 29574 - 19968: 0xEDB5, + 29575 - 19968: 0xE1E3, + 29577 - 19968: 0xE8AC, + 29579 - 19968: 0xE8DD, + 29582 - 19968: 0xEFE9, + 29588 - 19968: 0xF4BD, + 29590 - 19968: 0xCFB8, + 29591 - 19968: 0xE9DB, + 29592 - 19968: 0xD1AC, + 29599 - 19968: 0xDAC7, + 29607 - 19968: 0xEBC9, + 29609 - 19968: 0xE8CC, + 29613 - 19968: 0xDEB7, + 29618 - 19968: 0xD6BC, + 29619 - 19968: 0xD3E5, + 29625 - 19968: 0xFADD, + 29632 - 19968: 0xDAD6, + 29634 - 19968: 0xCAB1, + 29641 - 19968: 0xDAC8, + 29642 - 19968: 0xDFA6, + 29644 - 19968: 0xF9B3, + 29645 - 19968: 0xF2D2, + 29647 - 19968: 0xCAC4, + 29654 - 19968: 0xCECB, + 29657 - 19968: 0xCDF5, + 29661 - 19968: 0xFDB0, + 29662 - 19968: 0xD5A8, + 29664 - 19968: 0xF1C1, + 29667 - 19968: 0xE2E9, + 29668 - 19968: 0xDCCA, + 29669 - 19968: 0xECB4, + 29670 - 19968: 0xFAC0, + 29673 - 19968: 0xFBA8, + 29674 - 19968: 0xD0A8, + 29677 - 19968: 0xDAEC, + 29687 - 19968: 0xD9EE, + 29689 - 19968: 0xE0FB, + 29693 - 19968: 0xEFEA, + 29694 - 19968: 0xFADE, + 29697 - 19968: 0xE0C4, + 29699 - 19968: 0xCFB9, + 29701 - 19968: 0xD5CA, + 29702 - 19968: 0xD7E2, + 29703 - 19968: 0xE2AF, + 29705 - 19968: 0xD7B8, + 29715 - 19968: 0xE8CD, + 29723 - 19968: 0xF6DA, + 29728 - 19968: 0xEFA2, + 29729 - 19968: 0xE2DA, + 29730 - 19968: 0xF6FC, + 29733 - 19968: 0xFBD0, + 29734 - 19968: 0xD1AD, + 29736 - 19968: 0xCDE4, + 29738 - 19968: 0xD1AE, + 29739 - 19968: 0xDCED, + 29740 - 19968: 0xE8CE, + 29742 - 19968: 0xF0F9, + 29743 - 19968: 0xCEB5, + 29744 - 19968: 0xE6FC, + 29747 - 19968: 0xD7FB, + 29748 - 19968: 0xD0D6, + 29749 - 19968: 0xDDF5, + 29750 - 19968: 0xF7F1, + 29752 - 19968: 0xF6FD, + 29754 - 19968: 0xDBF7, + 29759 - 19968: 0xFBEA, + 29760 - 19968: 0xE9DC, + 29761 - 19968: 0xD9C1, + 29763 - 19968: 0xF5F2, + 29764 - 19968: 0xE0C5, + 29771 - 19968: 0xEAD4, + 29781 - 19968: 0xF9C2, + 29783 - 19968: 0xEABC, + 29785 - 19968: 0xD2C5, + 29786 - 19968: 0xFBD1, + 29787 - 19968: 0xE7C0, + 29788 - 19968: 0xEBA5, + 29790 - 19968: 0xDFFA, + 29791 - 19968: 0xE3A2, + 29792 - 19968: 0xD7B9, + 29794 - 19968: 0xE9C3, + 29796 - 19968: 0xE8FD, + 29797 - 19968: 0xE8AF, + 29800 - 19968: 0xF2D3, + 29801 - 19968: 0xFBA9, + 29802 - 19968: 0xD8A5, + 29807 - 19968: 0xD5CB, + 29822 - 19968: 0xD0C8, + 29826 - 19968: 0xD1AF, + 29827 - 19968: 0xD7E3, + 29831 - 19968: 0xE0C6, + 29833 - 19968: 0xD6A2, + 29835 - 19968: 0xEDF0, + 29848 - 19968: 0xD7F3, + 29852 - 19968: 0xFCD4, + 29854 - 19968: 0xDAD7, + 29855 - 19968: 0xCCDF, + 29857 - 19968: 0xF2D4, + 29859 - 19968: 0xD1B0, + 29861 - 19968: 0xCCE0, + 29863 - 19968: 0xDBFD, + 29864 - 19968: 0xF3BF, + 29866 - 19968: 0xF0D1, + 29872 - 19968: 0xFCBB, + 29874 - 19968: 0xE2B0, + 29877 - 19968: 0xE6A5, + 29881 - 19968: 0xE2DB, + 29885 - 19968: 0xDFDE, + 29887 - 19968: 0xE0C7, + 29894 - 19968: 0xF2EF, + 29898 - 19968: 0xCCE1, + 29903 - 19968: 0xD6EA, + 29908 - 19968: 0xE7C2, + 29912 - 19968: 0xCEB6, + 29914 - 19968: 0xF3C0, + 29916 - 19968: 0xCDFE, + 29920 - 19968: 0xFBD2, + 29922 - 19968: 0xF8F8, + 29923 - 19968: 0xF7FB, + 29926 - 19968: 0xE8BF, + 29934 - 19968: 0xE8B7, + 29943 - 19968: 0xEDB6, + 29953 - 19968: 0xDCBA, + 29956 - 19968: 0xCCB4, + 29969 - 19968: 0xF1F7, + 29973 - 19968: 0xE8B8, + 29976 - 19968: 0xCAF6, + 29978 - 19968: 0xE4A4, + 29979 - 19968: 0xF4D6, + 29983 - 19968: 0xDFE6, + 29987 - 19968: 0xDFA7, + 29989 - 19968: 0xDFE7, + 29990 - 19968: 0xE1C1, + 29992 - 19968: 0xE9C4, + 29995 - 19968: 0xDCCB, + 29996 - 19968: 0xE9C5, + 30000 - 19968: 0xEFA3, + 30001 - 19968: 0xEBA6, + 30002 - 19968: 0xCBA3, + 30003 - 19968: 0xE3E9, + 30007 - 19968: 0xD1FB, + 30008 - 19968: 0xEFA4, + 30010 - 19968: 0xEFEB, + 30023 - 19968: 0xD0B4, + 30028 - 19968: 0xCDA3, + 30031 - 19968: 0xE8E6, + 30033 - 19968: 0xEFA5, + 30035 - 19968: 0xD3CC, + 30036 - 19968: 0xDAED, + 30041 - 19968: 0xD7BA, + 30043 - 19968: 0xF2D5, + 30044 - 19968: 0xF5E5, + 30045 - 19968: 0xD9EF, + 30050 - 19968: 0xF9B4, + 30053 - 19968: 0xD5D4, + 30054 - 19968: 0xFDCF, + 30058 - 19968: 0xDBE3, + 30063 - 19968: 0xF1E1, + 30064 - 19968: 0xECB6, + 30069 - 19968: 0xFBFE, + 30070 - 19968: 0xD3D7, + 30072 - 19968: 0xD1B1, + 30074 - 19968: 0xCBB1, + 30079 - 19968: 0xD1B2, + 30086 - 19968: 0xCBB2, + 30087 - 19968: 0xF1C2, + 30090 - 19968: 0xF4E1, + 30091 - 19968: 0xF9B5, + 30094 - 19968: 0xE1C3, + 30095 - 19968: 0xE1C2, + 30097 - 19968: 0xEBF7, + 30109 - 19968: 0xDFA8, + 30117 - 19968: 0xCBCA, + 30123 - 19968: 0xE6B9, + 30129 - 19968: 0xF8DE, + 30130 - 19968: 0xF9AA, + 30131 - 19968: 0xCAF7, + 30133 - 19968: 0xEDB7, + 30136 - 19968: 0xD3B8, + 30137 - 19968: 0xF2D6, + 30140 - 19968: 0xD4D9, + 30141 - 19968: 0xEEC5, + 30142 - 19968: 0xF2F0, + 30146 - 19968: 0xCAB2, + 30149 - 19968: 0xDCBB, + 30151 - 19968: 0xF1F8, + 30157 - 19968: 0xECB7, + 30162 - 19968: 0xE5CA, + 30164 - 19968: 0xF6C0, + 30165 - 19968: 0xFDDD, + 30168 - 19968: 0xD4E3, + 30169 - 19968: 0xCCE2, + 30171 - 19968: 0xF7D4, + 30178 - 19968: 0xD7E5, + 30192 - 19968: 0xD3C3, + 30194 - 19968: 0xD8A6, + 30196 - 19968: 0xF6C1, + 30202 - 19968: 0xDDF6, + 30204 - 19968: 0xCDC0, + 30208 - 19968: 0xE5DC, + 30221 - 19968: 0xE5CB, + 30233 - 19968: 0xE1C4, + 30239 - 19968: 0xE8B0, + 30240 - 19968: 0xF4B0, + 30241 - 19968: 0xF3EA, + 30242 - 19968: 0xDAEE, + 30244 - 19968: 0xD7BB, + 30246 - 19968: 0xE2B1, + 30267 - 19968: 0xD7AA, + 30274 - 19968: 0xD6FB, + 30284 - 19968: 0xE4DF, + 30286 - 19968: 0xCAD6, + 30290 - 19968: 0xEBA8, + 30294 - 19968: 0xDBFE, + 30305 - 19968: 0xF6C2, + 30308 - 19968: 0xEFBB, + 30313 - 19968: 0xD4FD, + 30316 - 19968: 0xE0C8, + 30320 - 19968: 0xE8B9, + 30322 - 19968: 0xEFA6, + 30328 - 19968: 0xCDA4, + 30331 - 19968: 0xD4F4, + 30332 - 19968: 0xDBA1, + 30333 - 19968: 0xDBDC, + 30334 - 19968: 0xDBDD, + 30340 - 19968: 0xEEDC, + 30342 - 19968: 0xCBCB, + 30343 - 19968: 0xFCD5, + 30350 - 19968: 0xCEEB, + 30352 - 19968: 0xCDC1, + 30355 - 19968: 0xFBD3, + 30382 - 19968: 0xF9AB, + 30394 - 19968: 0xF5D4, + 30399 - 19968: 0xD9A9, + 30402 - 19968: 0xE9DD, + 30403 - 19968: 0xDBCD, + 30406 - 19968: 0xDDCE, + 30408 - 19968: 0xE7C3, + 30410 - 19968: 0xECCC, + 30418 - 19968: 0xF9EC, + 30422 - 19968: 0xCBCC, + 30427 - 19968: 0xE0FC, + 30428 - 19968: 0xD4A8, + 30430 - 19968: 0xEDD3, + 30431 - 19968: 0xD8EF, + 30433 - 19968: 0xF2D7, + 30435 - 19968: 0xCAF8, + 30436 - 19968: 0xDAEF, + 30439 - 19968: 0xD6D4, + 30446 - 19968: 0xD9CD, + 30450 - 19968: 0xD8EE, + 30452 - 19968: 0xF2C1, + 30456 - 19968: 0xDFD3, + 30460 - 19968: 0xDAF0, + 30462 - 19968: 0xE2EA, + 30465 - 19968: 0xE0FD, + 30468 - 19968: 0xD8F8, + 30472 - 19968: 0xF7AF, + 30473 - 19968: 0xDAB6, + 30475 - 19968: 0xCAD7, + 30494 - 19968: 0xF2D8, + 30496 - 19968: 0xD8F9, + 30505 - 19968: 0xFADF, + 30519 - 19968: 0xCFEF, + 30520 - 19968: 0xD9C2, + 30522 - 19968: 0xF0D2, + 30524 - 19968: 0xE4D1, + 30528 - 19968: 0xF3B7, + 30541 - 19968: 0xFAE0, + 30555 - 19968: 0xEFEC, + 30561 - 19968: 0xE2B2, + 30563 - 19968: 0xD4BD, + 30566 - 19968: 0xD9CE, + 30571 - 19968: 0xF4E2, + 30585 - 19968: 0xD4A9, + 30590 - 19968: 0xCDC2, + 30591 - 19968: 0xE7DA, + 30603 - 19968: 0xF2D9, + 30609 - 19968: 0xD9AA, + 30622 - 19968: 0xD8BE, + 30629 - 19968: 0xDCAD, + 30636 - 19968: 0xE2EB, + 30637 - 19968: 0xD6FC, + 30640 - 19968: 0xCAF9, + 30643 - 19968: 0xD4DA, + 30651 - 19968: 0xF4D7, + 30652 - 19968: 0xCCA1, + 30655 - 19968: 0xCFBA, + 30679 - 19968: 0xF5B8, + 30683 - 19968: 0xD9C3, + 30684 - 19968: 0xD0E8, + 30690 - 19968: 0xE3C5, + 30691 - 19968: 0xEBF8, + 30693 - 19968: 0xF2B1, + 30697 - 19968: 0xCFBB, + 30701 - 19968: 0xD3AD, + 30702 - 19968: 0xE8E1, + 30703 - 19968: 0xCEEC, + 30707 - 19968: 0xE0B4, + 30722 - 19968: 0xDEE3, + 30738 - 19968: 0xDDF7, + 30757 - 19968: 0xF2B2, + 30758 - 19968: 0xF3F6, + 30759 - 19968: 0xF6DB, + 30764 - 19968: 0xD7FE, + 30770 - 19968: 0xF8DF, + 30772 - 19968: 0xF7F2, + 30789 - 19968: 0xD0A9, + 30799 - 19968: 0xE6DA, + 30813 - 19968: 0xF5A6, + 30827 - 19968: 0xD7BC, + 30828 - 19968: 0xCCE3, + 30831 - 19968: 0xE6DB, + 30844 - 19968: 0xDDDD, + 30849 - 19968: 0xD1B3, + 30855 - 19968: 0xEFED, + 30860 - 19968: 0xD6DE, + 30861 - 19968: 0xE4F4, + 30862 - 19968: 0xE1EF, + 30865 - 19968: 0xDDF8, + 30871 - 19968: 0xE8CF, + 30883 - 19968: 0xCAE5, + 30887 - 19968: 0xDCA1, + 30889 - 19968: 0xE0B5, + 30906 - 19968: 0xFCAC, + 30907 - 19968: 0xFCAD, + 30908 - 19968: 0xD8A7, + 30913 - 19968: 0xEDB8, + 30917 - 19968: 0xDBB6, + 30922 - 19968: 0xD6F0, + 30923 - 19968: 0xF3AF, + 30926 - 19968: 0xCDA5, + 30928 - 19968: 0xDAF1, + 30952 - 19968: 0xD8A8, + 30956 - 19968: 0xCCE4, + 30959 - 19968: 0xD1B4, + 30965 - 19968: 0xCAD8, + 30971 - 19968: 0xDAF2, + 30977 - 19968: 0xF5A7, + 30990 - 19968: 0xF5A8, + 30998 - 19968: 0xE6A6, + 31018 - 19968: 0xD5EC, + 31019 - 19968: 0xD5F8, + 31020 - 19968: 0xDAF3, + 31034 - 19968: 0xE3C6, + 31038 - 19968: 0xDEE4, + 31040 - 19968: 0xDEE5, + 31041 - 19968: 0xD1B5, + 31047 - 19968: 0xD1B6, + 31048 - 19968: 0xD1B7, + 31049 - 19968: 0xF2B3, + 31056 - 19968: 0xE9DE, + 31062 - 19968: 0xF0D3, + 31063 - 19968: 0xF2B4, + 31066 - 19968: 0xF0D4, + 31067 - 19968: 0xCBE4, + 31068 - 19968: 0xFBD4, + 31069 - 19968: 0xF5E6, + 31070 - 19968: 0xE3EA, + 31072 - 19968: 0xDEE6, + 31077 - 19968: 0xDFD4, + 31080 - 19968: 0xF8F9, + 31085 - 19968: 0xF0AE, + 31098 - 19968: 0xD1B8, + 31103 - 19968: 0xD6DF, + 31105 - 19968: 0xD0D7, + 31117 - 19968: 0xFCA1, + 31118 - 19968: 0xEFEE, + 31119 - 19968: 0xDCD8, + 31121 - 19968: 0xE9DF, + 31142 - 19968: 0xE5DD, + 31143 - 19968: 0xFDFB, + 31146 - 19968: 0xE0C9, + 31150 - 19968: 0xD6C9, + 31153 - 19968: 0xD4AA, + 31155 - 19968: 0xE5CC, + 31161 - 19968: 0xE9E0, + 31165 - 19968: 0xD0D8, + 31166 - 19968: 0xFCA2, + 31167 - 19968: 0xD4BE, + 31168 - 19968: 0xE2B3, + 31169 - 19968: 0xDEE7, + 31177 - 19968: 0xDCBC, + 31178 - 19968: 0xD2B6, + 31179 - 19968: 0xF5D5, + 31185 - 19968: 0xCEA1, + 31186 - 19968: 0xF5A9, + 31189 - 19968: 0xDDF9, + 31192 - 19968: 0xDDFA, + 31199 - 19968: 0xF0D5, + 31204 - 19968: 0xF6DF, + 31206 - 19968: 0xF2DA, + 31207 - 19968: 0xE4EB, + 31209 - 19968: 0xF2F1, + 31227 - 19968: 0xECB9, + 31232 - 19968: 0xFDFC, + 31237 - 19968: 0xE1AA, + 31240 - 19968: 0xCAD9, + 31243 - 19968: 0xEFEF, + 31245 - 19968: 0xF5AA, + 31252 - 19968: 0xECF9, + 31255 - 19968: 0xF8AD, + 31257 - 19968: 0xF2C2, + 31258 - 19968: 0xF6C3, + 31260 - 19968: 0xD7D2, + 31263 - 19968: 0xF9A2, + 31264 - 19968: 0xF0D6, + 31278 - 19968: 0xF0FA, + 31281 - 19968: 0xF6E0, + 31286 - 19968: 0xE9F3, + 31287 - 19968: 0xF2C3, + 31291 - 19968: 0xD4AB, + 31292 - 19968: 0xCAB3, + 31293 - 19968: 0xCDA6, + 31295 - 19968: 0xCDC3, + 31296 - 19968: 0xCDDA, + 31302 - 19968: 0xD9CF, + 31305 - 19968: 0xF6C4, + 31309 - 19968: 0xEEDD, + 31310 - 19968: 0xE7C4, + 31319 - 19968: 0xE2B4, + 31329 - 19968: 0xDFE2, + 31330 - 19968: 0xE7DB, + 31337 - 19968: 0xE8B1, + 31339 - 19968: 0xFCAE, + 31344 - 19968: 0xE5CD, + 31348 - 19968: 0xFAEB, + 31350 - 19968: 0xCFBC, + 31353 - 19968: 0xCFE2, + 31354 - 19968: 0xCDF6, + 31357 - 19968: 0xEFF0, + 31359 - 19968: 0xF4BE, + 31361 - 19968: 0xD4CD, + 31364 - 19968: 0xF3B8, + 31368 - 19968: 0xE9A1, + 31378 - 19968: 0xF2F2, + 31379 - 19968: 0xF3EB, + 31381 - 19968: 0xF0D7, + 31384 - 19968: 0xCFD7, + 31391 - 19968: 0xCFDF, + 31401 - 19968: 0xE8C0, + 31402 - 19968: 0xE8C1, + 31406 - 19968: 0xCFE3, + 31407 - 19968: 0xE9A2, + 31418 - 19968: 0xD0AA, + 31428 - 19968: 0xF3C1, + 31429 - 19968: 0xD0AB, + 31431 - 19968: 0xD4E4, + 31434 - 19968: 0xEFBC, + 31435 - 19968: 0xD8A1, + 31447 - 19968: 0xD9DF, + 31449 - 19968: 0xF3D7, + 31453 - 19968: 0xDCBD, + 31455 - 19968: 0xCCE5, + 31456 - 19968: 0xEDF1, + 31459 - 19968: 0xF1E2, + 31461 - 19968: 0xD4DB, + 31466 - 19968: 0xE2B5, + 31469 - 19968: 0xCAE6, + 31471 - 19968: 0xD3AE, + 31478 - 19968: 0xCCE6, + 31481 - 19968: 0xF1D3, + 31482 - 19968: 0xF5E7, + 31487 - 19968: 0xCADA, + 31503 - 19968: 0xFBEE, + 31505 - 19968: 0xE1C5, + 31513 - 19968: 0xDFE9, + 31515 - 19968: 0xEEDE, + 31518 - 19968: 0xF7C2, + 31520 - 19968: 0xD8A2, + 31526 - 19968: 0xDDAC, + 31532 - 19968: 0xF0AF, + 31533 - 19968: 0xD6BD, + 31545 - 19968: 0xE1AB, + 31558 - 19968: 0xF9B6, + 31561 - 19968: 0xD4F5, + 31563 - 19968: 0xD0C9, + 31564 - 19968: 0xEFA7, + 31565 - 19968: 0xE2EC, + 31567 - 19968: 0xDBEA, + 31568 - 19968: 0xCECC, + 31569 - 19968: 0xF5E8, + 31570 - 19968: 0xF7D5, + 31572 - 19968: 0xD3CD, + 31574 - 19968: 0xF3FE, + 31584 - 19968: 0xD0B5, + 31596 - 19968: 0xE0FE, + 31598 - 19968: 0xDFFB, + 31605 - 19968: 0xE6DD, + 31613 - 19968: 0xE8A4, + 31623 - 19968: 0xCBCD, + 31627 - 19968: 0xEFA8, + 31631 - 19968: 0xEEB4, + 31636 - 19968: 0xDAD8, + 31637 - 19968: 0xD1B9, + 31639 - 19968: 0xDFA9, + 31642 - 19968: 0xF3B0, + 31645 - 19968: 0xCCC4, + 31649 - 19968: 0xCEB7, + 31661 - 19968: 0xEFA9, + 31665 - 19968: 0xDFD5, + 31668 - 19968: 0xEDD7, + 31672 - 19968: 0xEEC6, + 31680 - 19968: 0xEFBD, + 31681 - 19968: 0xFCD6, + 31684 - 19968: 0xDBF4, + 31686 - 19968: 0xEFAA, + 31687 - 19968: 0xF8B9, + 31689 - 19968: 0xF5E9, + 31698 - 19968: 0xE3D9, + 31712 - 19968: 0xE1C6, + 31716 - 19968: 0xD4BF, + 31721 - 19968: 0xDEE8, + 31751 - 19968: 0xF0EA, + 31762 - 19968: 0xF3C2, + 31774 - 19968: 0xD3AF, + 31777 - 19968: 0xCADB, + 31783 - 19968: 0xFCD7, + 31786 - 19968: 0xEDD8, + 31787 - 19968: 0xE1C7, + 31805 - 19968: 0xF4D8, + 31806 - 19968: 0xD6B3, + 31807 - 19968: 0xDDAD, + 31811 - 19968: 0xD5BE, + 31820 - 19968: 0xF1C3, + 31821 - 19968: 0xEEDF, + 31840 - 19968: 0xD6EB, + 31844 - 19968: 0xF4D9, + 31852 - 19968: 0xD7E6, + 31859 - 19968: 0xDAB7, + 31875 - 19968: 0xDDFB, + 31881 - 19968: 0xDDCF, + 31890 - 19968: 0xD8A3, + 31893 - 19968: 0xDAD9, + 31895 - 19968: 0xF0D8, + 31896 - 19968: 0xEFC4, + 31903 - 19968: 0xE1D8, + 31909 - 19968: 0xF1D4, + 31911 - 19968: 0xEDF2, + 31918 - 19968: 0xD5DB, + 31921 - 19968: 0xD5DC, + 31922 - 19968: 0xF3C4, + 31923 - 19968: 0xCBD7, + 31929 - 19968: 0xE2B6, + 31934 - 19968: 0xEFF1, + 31946 - 19968: 0xFBD5, + 31958 - 19968: 0xD3D8, + 31966 - 19968: 0xDDD0, + 31967 - 19968: 0xF0D9, + 31968 - 19968: 0xCBB3, + 31975 - 19968: 0xD5DD, + 31995 - 19968: 0xCDA7, + 31998 - 19968: 0xD0AC, + 32000 - 19968: 0xD1BA, + 32002 - 19968: 0xF1C4, + 32004 - 19968: 0xE5B3, + 32005 - 19968: 0xFBF5, + 32006 - 19968: 0xE9E1, + 32007 - 19968: 0xFDE0, + 32008 - 19968: 0xFCBC, + 32010 - 19968: 0xDAA2, + 32011 - 19968: 0xDAA3, + 32013 - 19968: 0xD2A1, + 32016 - 19968: 0xD2EF, + 32020 - 19968: 0xE2ED, + 32023 - 19968: 0xDEE9, + 32024 - 19968: 0xCEDC, + 32025 - 19968: 0xF2B5, + 32026 - 19968: 0xD0E4, + 32027 - 19968: 0xDDD1, + 32032 - 19968: 0xE1C8, + 32033 - 19968: 0xDBB7, + 32034 - 19968: 0xDFE3, + 32043 - 19968: 0xEDB9, + 32044 - 19968: 0xF1C5, + 32046 - 19968: 0xF3CF, + 32047 - 19968: 0xD7AB, + 32048 - 19968: 0xE1AC, + 32051 - 19968: 0xE3EB, + 32053 - 19968: 0xEEC7, + 32057 - 19968: 0xE1C9, + 32058 - 19968: 0xCAFA, + 32066 - 19968: 0xF0FB, + 32067 - 19968: 0xFAE1, + 32068 - 19968: 0xF0DA, + 32069 - 19968: 0xCCE7, + 32070 - 19968: 0xDAF4, + 32080 - 19968: 0xCCBF, + 32094 - 19968: 0xCEED, + 32097 - 19968: 0xD5A9, + 32098 - 19968: 0xFAE2, + 32102 - 19968: 0xD0E5, + 32104 - 19968: 0xEBD6, + 32106 - 19968: 0xECDF, + 32110 - 19968: 0xDFFC, + 32113 - 19968: 0xF7D6, + 32114 - 19968: 0xDEEA, + 32115 - 19968: 0xCBB4, + 32118 - 19968: 0xEFBE, + 32121 - 19968: 0xCCB5, + 32127 - 19968: 0xCFBD, + 32142 - 19968: 0xEFF2, + 32143 - 19968: 0xE2B7, + 32147 - 19968: 0xCCE8, + 32156 - 19968: 0xF0FC, + 32160 - 19968: 0xD6E0, + 32162 - 19968: 0xF1C6, + 32172 - 19968: 0xE2B8, + 32173 - 19968: 0xEBAB, + 32177 - 19968: 0xCBB5, + 32178 - 19968: 0xD8D1, + 32180 - 19968: 0xF4CE, + 32181 - 19968: 0xF3F7, + 32184 - 19968: 0xD7C6, + 32186 - 19968: 0xD1BB, + 32187 - 19968: 0xF7AA, + 32189 - 19968: 0xEDCA, + 32190 - 19968: 0xD7D3, + 32191 - 19968: 0xD8FA, + 32199 - 19968: 0xF6C5, + 32202 - 19968: 0xD1CC, + 32203 - 19968: 0xDDFC, + 32214 - 19968: 0xDFFD, + 32216 - 19968: 0xF9E5, + 32218 - 19968: 0xE0CA, + 32221 - 19968: 0xF2FD, + 32222 - 19968: 0xD3B0, + 32224 - 19968: 0xF4F3, + 32225 - 19968: 0xDAC9, + 32227 - 19968: 0xE6DE, + 32232 - 19968: 0xF8BA, + 32233 - 19968: 0xE8D0, + 32236 - 19968: 0xD8FB, + 32239 - 19968: 0xEAD5, + 32244 - 19968: 0xD6A3, + 32251 - 19968: 0xF6C6, + 32265 - 19968: 0xF2DB, + 32266 - 19968: 0xE4FC, + 32277 - 19968: 0xE8B2, + 32283 - 19968: 0xDADA, + 32285 - 19968: 0xF2DC, + 32286 - 19968: 0xFBD6, + 32287 - 19968: 0xE9B2, + 32289 - 19968: 0xEEAD, + 32291 - 19968: 0xFAE3, + 32299 - 19968: 0xDCEE, + 32302 - 19968: 0xF5EA, + 32303 - 19968: 0xE6E0, + 32305 - 19968: 0xF0FD, + 32311 - 19968: 0xD7AC, + 32317 - 19968: 0xF5C5, + 32318 - 19968: 0xEEE0, + 32321 - 19968: 0xDBE5, + 32323 - 19968: 0xDDDE, + 32326 - 19968: 0xD9F0, + 32327 - 19968: 0xE9A3, + 32338 - 19968: 0xF1F9, + 32340 - 19968: 0xF2C4, + 32341 - 19968: 0xE0CB, + 32350 - 19968: 0xE9A4, + 32353 - 19968: 0xE2B9, + 32361 - 19968: 0xE3B1, + 32362 - 19968: 0xFCEB, + 32363 - 19968: 0xCDA8, + 32365 - 19968: 0xCCB6, + 32368 - 19968: 0xF0DB, + 32377 - 19968: 0xE6BA, + 32380 - 19968: 0xCDA9, + 32386 - 19968: 0xF3C3, + 32396 - 19968: 0xE1D9, + 32399 - 19968: 0xEFAB, + 32403 - 19968: 0xE7C5, + 32406 - 19968: 0xE0E9, + 32408 - 19968: 0xF3C5, + 32411 - 19968: 0xD4C0, + 32412 - 19968: 0xD5BF, + 32566 - 19968: 0xDDAE, + 32568 - 19968: 0xF9FC, + 32570 - 19968: 0xCCC0, + 32588 - 19968: 0xE5A2, + 32592 - 19968: 0xCEB8, + 32596 - 19968: 0xD8D2, + 32597 - 19968: 0xF9D6, + 32618 - 19968: 0xF1AA, + 32619 - 19968: 0xCED1, + 32622 - 19968: 0xF6C7, + 32624 - 19968: 0xDBEB, + 32626 - 19968: 0xDFFE, + 32629 - 19968: 0xD8E1, + 32631 - 19968: 0xF7F3, + 32633 - 19968: 0xD7E7, + 32645 - 19968: 0xD4FE, + 32648 - 19968: 0xD1BC, + 32650 - 19968: 0xE5CF, + 32652 - 19968: 0xCBB6, + 32654 - 19968: 0xDAB8, + 32660 - 19968: 0xCDC4, + 32666 - 19968: 0xD6BE, + 32670 - 19968: 0xE2BA, + 32676 - 19968: 0xCFD8, + 32680 - 19968: 0xE0CC, + 32681 - 19968: 0xEBF9, + 32690 - 19968: 0xFDFD, + 32696 - 19968: 0xD7E8, + 32697 - 19968: 0xCBD8, + 32701 - 19968: 0xE9E2, + 32705 - 19968: 0xE8BA, + 32709 - 19968: 0xE3C7, + 32714 - 19968: 0xECCD, + 32716 - 19968: 0xECCE, + 32718 - 19968: 0xD6BF, + 32722 - 19968: 0xE3A7, + 32724 - 19968: 0xDFD6, + 32725 - 19968: 0xFDE8, + 32735 - 19968: 0xEEE1, + 32736 - 19968: 0xF6A8, + 32737 - 19968: 0xDDFD, + 32745 - 19968: 0xF8BB, + 32747 - 19968: 0xE8D1, + 32752 - 19968: 0xF9D7, + 32761 - 19968: 0xCEEE, + 32764 - 19968: 0xECCF, + 32768 - 19968: 0xE9A5, + 32769 - 19968: 0xD6D5, + 32771 - 19968: 0xCDC5, + 32773 - 19968: 0xEDBA, + 32774 - 19968: 0xD1BD, + 32777 - 19968: 0xCFBE, + 32780 - 19968: 0xECBB, + 32784 - 19968: 0xD2B1, + 32789 - 19968: 0xCCE9, + 32791 - 19968: 0xD9C4, + 32792 - 19968: 0xE9FC, + 32813 - 19968: 0xD1BE, + 32819 - 19968: 0xECBC, + 32822 - 19968: 0xE5AD, + 32829 - 19968: 0xF7B0, + 32831 - 19968: 0xCCEA, + 32835 - 19968: 0xD3C4, + 32838 - 19968: 0xD6C0, + 32842 - 19968: 0xD6FD, + 32854 - 19968: 0xE1A1, + 32856 - 19968: 0xDEBD, + 32858 - 19968: 0xF6A9, + 32862 - 19968: 0xDAA4, + 32879 - 19968: 0xD6A4, + 32880 - 19968: 0xF5C6, + 32882 - 19968: 0xE1A2, + 32883 - 19968: 0xE9C6, + 32887 - 19968: 0xF2C5, + 32893 - 19968: 0xF4E9, + 32894 - 19968: 0xD6EC, + 32895 - 19968: 0xEBD3, + 32900 - 19968: 0xECBD, + 32901 - 19968: 0xE2DC, + 32902 - 19968: 0xDEEB, + 32903 - 19968: 0xF0DC, + 32905 - 19968: 0xEBBF, + 32907 - 19968: 0xD7CE, + 32908 - 19968: 0xD1BF, + 32918 - 19968: 0xF5AB, + 32923 - 19968: 0xF9FD, + 32925 - 19968: 0xCADC, + 32929 - 19968: 0xCDC6, + 32930 - 19968: 0xF2B6, + 32933 - 19968: 0xDDFE, + 32937 - 19968: 0xCCB7, + 32938 - 19968: 0xDBB8, + 32943 - 19968: 0xD0E9, + 32945 - 19968: 0xCEDD, + 32946 - 19968: 0xEBC0, + 32948 - 19968: 0xFDA2, + 32954 - 19968: 0xF8CB, + 32963 - 19968: 0xEAD6, + 32964 - 19968: 0xF1B0, + 32972 - 19968: 0xDBCE, + 32974 - 19968: 0xF7C3, + 32986 - 19968: 0xDBCF, + 32987 - 19968: 0xCBA4, + 32990 - 19968: 0xF8E0, + 32993 - 19968: 0xFBD7, + 32996 - 19968: 0xEBCA, + 32997 - 19968: 0xE0A1, + 33009 - 19968: 0xCECD, + 33012 - 19968: 0xD4DC, + 33016 - 19968: 0xFDD8, + 33021 - 19968: 0xD2F6, + 33026 - 19968: 0xF2B7, + 33029 - 19968: 0xFAF6, + 33030 - 19968: 0xF6AA, + 33031 - 19968: 0xFAF7, + 33032 - 19968: 0xD8E6, + 33034 - 19968: 0xF4B1, + 33048 - 19968: 0xE8D2, + 33050 - 19968: 0xCAC5, + 33051 - 19968: 0xCCEB, + 33059 - 19968: 0xE2EE, + 33065 - 19968: 0xE2BB, + 33067 - 19968: 0xF7AD, + 33071 - 19968: 0xF8E1, + 33081 - 19968: 0xF3EC, + 33086 - 19968: 0xDEA1, + 33099 - 19968: 0xE4FD, + 33102 - 19968: 0xE3EC, + 33104 - 19968: 0xDDAF, + 33105 - 19968: 0xDDB0, + 33108 - 19968: 0xCBB7, + 33109 - 19968: 0xE8D3, + 33125 - 19968: 0xE1A3, + 33126 - 19968: 0xD2E0, + 33131 - 19968: 0xF0FE, + 33136 - 19968: 0xE9A6, + 33137 - 19968: 0xCBF2, + 33144 - 19968: 0xEDF3, + 33145 - 19968: 0xDCD9, + 33146 - 19968: 0xE0CD, + 33151 - 19968: 0xF7DA, + 33152 - 19968: 0xDBB9, + 33160 - 19968: 0xCCAE, + 33162 - 19968: 0xDADB, + 33167 - 19968: 0xCDC7, + 33178 - 19968: 0xDDB1, + 33180 - 19968: 0xD8AF, + 33181 - 19968: 0xE3A3, + 33184 - 19968: 0xCEEF, + 33187 - 19968: 0xF2F3, + 33192 - 19968: 0xF8B3, + 33203 - 19968: 0xE0CE, + 33205 - 19968: 0xF5FD, + 33210 - 19968: 0xEBEC, + 33213 - 19968: 0xD3C5, + 33214 - 19968: 0xFCEC, + 33215 - 19968: 0xD2DB, + 33216 - 19968: 0xD4EB, + 33218 - 19968: 0xDEA2, + 33222 - 19968: 0xE5E6, + 33229 - 19968: 0xF0B0, + 33240 - 19968: 0xD5C4, + 33247 - 19968: 0xEDF4, + 33251 - 19968: 0xE3ED, + 33253 - 19968: 0xE8C2, + 33255 - 19968: 0xEDF5, + 33256 - 19968: 0xD7FC, + 33258 - 19968: 0xEDBB, + 33261 - 19968: 0xF6AB, + 33267 - 19968: 0xF2B8, + 33268 - 19968: 0xF6C8, + 33274 - 19968: 0xD3E6, + 33275 - 19968: 0xF2DD, + 33276 - 19968: 0xCFBF, + 33278 - 19968: 0xEBAC, + 33285 - 19968: 0xCFC0, + 33287 - 19968: 0xE6A8, + 33288 - 19968: 0xFDE9, + 33290 - 19968: 0xCFC1, + 33292 - 19968: 0xE0DF, + 33293 - 19968: 0xDEEC, + 33298 - 19968: 0xE0A2, + 33307 - 19968: 0xF4BF, + 33308 - 19968: 0xE2EF, + 33310 - 19968: 0xD9F1, + 33311 - 19968: 0xF1C7, + 33313 - 19968: 0xCBB8, + 33322 - 19968: 0xF9FE, + 33323 - 19968: 0xDBBA, + 33324 - 19968: 0xDAF5, + 33333 - 19968: 0xF6EC, + 33334 - 19968: 0xDADC, + 33335 - 19968: 0xFAE4, + 33337 - 19968: 0xE0CF, + 33344 - 19968: 0xDDB2, + 33349 - 19968: 0xE6A9, + 33351 - 19968: 0xEFF3, + 33369 - 19968: 0xF3ED, + 33380 - 19968: 0xEBFA, + 33382 - 19968: 0xF9E6, + 33390 - 19968: 0xCADD, + 33391 - 19968: 0xD5DE, + 33393 - 19968: 0xCADE, + 33394 - 19968: 0xDFE4, + 33398 - 19968: 0xE6FD, + 33400 - 19968: 0xF5AC, + 33406 - 19968: 0xE4F5, + 33419 - 19968: 0xE9E3, + 33421 - 19968: 0xEDCB, + 33422 - 19968: 0xCFE4, + 33426 - 19968: 0xD8D3, + 33433 - 19968: 0xDDB3, + 33434 - 19968: 0xD4EC, + 33437 - 19968: 0xF2B9, + 33439 - 19968: 0xDFB7, + 33445 - 19968: 0xCBCE, + 33446 - 19968: 0xFBD8, + 33449 - 19968: 0xD0D9, + 33452 - 19968: 0xDDD2, + 33453 - 19968: 0xF7F4, + 33454 - 19968: 0xE7DC, + 33455 - 19968: 0xE4A5, + 33457 - 19968: 0xFCA3, + 33459 - 19968: 0xDBBB, + 33463 - 19968: 0xF2BA, + 33464 - 19968: 0xE9FD, + 33465 - 19968: 0xD0CA, + 33467 - 19968: 0xF5D6, + 33468 - 19968: 0xD9C5, + 33469 - 19968: 0xE4B4, + 33471 - 19968: 0xEDA7, + 33489 - 19968: 0xEABD, + 33490 - 19968: 0xE6FE, + 33492 - 19968: 0xF7C4, + 33493 - 19968: 0xF5AD, + 33495 - 19968: 0xD9E0, + 33499 - 19968: 0xCAB4, + 33502 - 19968: 0xF8E2, + 33503 - 19968: 0xCFC2, + 33505 - 19968: 0xECBE, + 33509 - 19968: 0xE5B4, + 33510 - 19968: 0xCDC8, + 33511 - 19968: 0xEEC8, + 33521 - 19968: 0xE7C8, + 33533 - 19968: 0xCDC9, + 33534 - 19968: 0xF9B7, + 33537 - 19968: 0xF1E8, + 33538 - 19968: 0xD9F2, + 33539 - 19968: 0xDBF5, + 33540 - 19968: 0xCAB5, + 33541 - 19968: 0xD9C6, + 33545 - 19968: 0xD8C9, + 33559 - 19968: 0xD9AB, + 33576 - 19968: 0xEDBC, + 33579 - 19968: 0xD8D4, + 33583 - 19968: 0xDCDA, + 33585 - 19968: 0xE2BC, + 33588 - 19968: 0xFCED, + 33589 - 19968: 0xECE0, + 33590 - 19968: 0xD2FE, + 33592 - 19968: 0xE9C7, + 33593 - 19968: 0xE6AA, + 33600 - 19968: 0xE2F0, + 33607 - 19968: 0xFABB, + 33609 - 19968: 0xF5AE, + 33610 - 19968: 0xFBAA, + 33615 - 19968: 0xECFB, + 33617 - 19968: 0xECBF, + 33618 - 19968: 0xFCD8, + 33651 - 19968: 0xD4E5, + 33655 - 19968: 0xF9C3, + 33659 - 19968: 0xEEE2, + 33673 - 19968: 0xD7E9, + 33674 - 19968: 0xEDF6, + 33678 - 19968: 0xDEED, + 33686 - 19968: 0xCCEC, + 33688 - 19968: 0xE3EE, + 33694 - 19968: 0xE8D4, + 33698 - 19968: 0xFAF8, + 33705 - 19968: 0xDDB4, + 33706 - 19968: 0xE4B5, + 33707 - 19968: 0xD8B0, + 33725 - 19968: 0xD8D5, + 33729 - 19968: 0xF4EA, + 33733 - 19968: 0xCEB9, + 33737 - 19968: 0xD6E1, + 33738 - 19968: 0xCFD2, + 33740 - 19968: 0xD0B6, + 33747 - 19968: 0xCEA2, + 33750 - 19968: 0xF3EE, + 33756 - 19968: 0xF3F8, + 33769 - 19968: 0xDCCC, + 33771 - 19968: 0xD0CB, + 33775 - 19968: 0xFCA4, + 33776 - 19968: 0xCDCA, + 33777 - 19968: 0xD7D4, + 33778 - 19968: 0xDEA3, + 33780 - 19968: 0xE4E0, + 33785 - 19968: 0xEEC9, + 33789 - 19968: 0xE2DD, + 33795 - 19968: 0xF5FE, + 33796 - 19968: 0xD4AC, + 33802 - 19968: 0xD5D1, + 33804 - 19968: 0xD8F0, + 33805 - 19968: 0xF8C3, + 33806 - 19968: 0xEAD7, + 33833 - 19968: 0xF5D7, + 33836 - 19968: 0xD8BF, + 33841 - 19968: 0xFDC0, + 33848 - 19968: 0xEBAD, + 33853 - 19968: 0xD5AA, + 33865 - 19968: 0xE7A8, + 33879 - 19968: 0xEECA, + 33883 - 19968: 0xCAE7, + 33889 - 19968: 0xF8E3, + 33891 - 19968: 0xD4DD, + 33894 - 19968: 0xEAD8, + 33899 - 19968: 0xFBD9, + 33900 - 19968: 0xEDF7, + 33903 - 19968: 0xE5B5, + 33909 - 19968: 0xD0AD, + 33914 - 19968: 0xF1F1, + 33936 - 19968: 0xE2BD, + 33940 - 19968: 0xE3C8, + 33945 - 19968: 0xD9D5, + 33948 - 19968: 0xDFAA, + 33953 - 19968: 0xDBBC, + 33970 - 19968: 0xF8E4, + 33976 - 19968: 0xF1FA, + 33979 - 19968: 0xE5B6, + 33980 - 19968: 0xF3EF, + 33983 - 19968: 0xFBDA, + 33984 - 19968: 0xE1E0, + 33986 - 19968: 0xD9AC, + 33988 - 19968: 0xF5EB, + 33990 - 19968: 0xE0B6, + 33993 - 19968: 0xE9C8, + 33995 - 19968: 0xCBCF, + 33997 - 19968: 0xE3C9, + 34001 - 19968: 0xDEEE, + 34010 - 19968: 0xE2BE, + 34028 - 19968: 0xDCEF, + 34030 - 19968: 0xD6A5, + 34036 - 19968: 0xE2F1, + 34044 - 19968: 0xD6FE, + 34065 - 19968: 0xD9A1, + 34067 - 19968: 0xD8C0, + 34068 - 19968: 0xDCDB, + 34071 - 19968: 0xEDBD, + 34072 - 19968: 0xDFB8, + 34074 - 19968: 0xEAA5, + 34078 - 19968: 0xD7AD, + 34081 - 19968: 0xF3F9, + 34083 - 19968: 0xEDF8, + 34085 - 19968: 0xF5C7, + 34092 - 19968: 0xE1CA, + 34093 - 19968: 0xEBE3, + 34095 - 19968: 0xF2DE, + 34109 - 19968: 0xF8CC, + 34111 - 19968: 0xEAD9, + 34113 - 19968: 0xD3C6, + 34115 - 19968: 0xDBE6, + 34121 - 19968: 0xF5AF, + 34126 - 19968: 0xCEF0, + 34131 - 19968: 0xE9FE, + 34137 - 19968: 0xFBB6, + 34147 - 19968: 0xE2F2, + 34152 - 19968: 0xCFF2, + 34153 - 19968: 0xF7B9, + 34154 - 19968: 0xD9F3, + 34157 - 19968: 0xE1CB, + 34180 - 19968: 0xDADD, + 34183 - 19968: 0xDAB9, + 34191 - 19968: 0xEBFB, + 34193 - 19968: 0xCBB9, + 34196 - 19968: 0xEDF9, + 34203 - 19968: 0xE0E0, + 34214 - 19968: 0xF4C0, + 34216 - 19968: 0xFDBC, + 34217 - 19968: 0xDFB1, + 34218 - 19968: 0xE3EF, + 34223 - 19968: 0xE0A3, + 34224 - 19968: 0xFDB9, + 34234 - 19968: 0xF0B1, + 34241 - 19968: 0xCDCB, + 34249 - 19968: 0xEDBE, + 34253 - 19968: 0xD5C0, + 34254 - 19968: 0xE3F0, + 34255 - 19968: 0xEDFA, + 34261 - 19968: 0xE9E4, + 34268 - 19968: 0xD5ED, + 34269 - 19968: 0xE7DD, + 34276 - 19968: 0xD4F6, + 34277 - 19968: 0xE5B7, + 34281 - 19968: 0xDBE7, + 34282 - 19968: 0xE2BF, + 34295 - 19968: 0xEECB, + 34298 - 19968: 0xD7F4, + 34299 - 19968: 0xF0DD, + 34303 - 19968: 0xCEAB, + 34306 - 19968: 0xE7DE, + 34310 - 19968: 0xD6D6, + 34311 - 19968: 0xE1CC, + 34314 - 19968: 0xE8B3, + 34326 - 19968: 0xE5EE, + 34327 - 19968: 0xDCA2, + 34330 - 19968: 0xE0D0, + 34349 - 19968: 0xD5B5, + 34367 - 19968: 0xD5A1, + 34382 - 19968: 0xFBDB, + 34384 - 19968: 0xF9CB, + 34388 - 19968: 0xCBF3, + 34389 - 19968: 0xF4A5, + 34395 - 19968: 0xFAC8, + 34396 - 19968: 0xD6D7, + 34398 - 19968: 0xE9E5, + 34399 - 19968: 0xFBDC, + 34407 - 19968: 0xFDD0, + 34425 - 19968: 0xFBF6, + 34442 - 19968: 0xDAA5, + 34444 - 19968: 0xDBBD, + 34451 - 19968: 0xECE2, + 34467 - 19968: 0xCDF7, + 34468 - 19968: 0xF0DE, + 34473 - 19968: 0xF6C9, + 34503 - 19968: 0xDEEF, + 34507 - 19968: 0xD3B1, + 34516 - 19968: 0xFCEE, + 34521 - 19968: 0xE8C3, + 34523 - 19968: 0xF1C8, + 34527 - 19968: 0xCEF1, + 34532 - 19968: 0xF9ED, + 34541 - 19968: 0xF2F4, + 34558 - 19968: 0xE4B6, + 34560 - 19968: 0xF5B9, + 34562 - 19968: 0xDCF0, + 34563 - 19968: 0xE3F1, + 34568 - 19968: 0xE8A5, + 34584 - 19968: 0xF2BB, + 34586 - 19968: 0xDEA4, + 34588 - 19968: 0xDACC, + 34638 - 19968: 0xCAE9, + 34645 - 19968: 0xE3DA, + 34647 - 19968: 0xFCD9, + 34655 - 19968: 0xEADA, + 34662 - 19968: 0xF9C4, + 34664 - 19968: 0xE3A4, + 34676 - 19968: 0xFBDD, + 34678 - 19968: 0xEFCA, + 34680 - 19968: 0xE8C4, + 34690 - 19968: 0xD5CC, + 34701 - 19968: 0xEBD7, + 34719 - 19968: 0xD9AD, + 34722 - 19968: 0xFBAB, + 34739 - 19968: 0xD3D9, + 34746 - 19968: 0xD5A2, + 34756 - 19968: 0xF6DE, + 34784 - 19968: 0xDAF6, + 34796 - 19968: 0xE0D1, + 34799 - 19968: 0xE9A8, + 34802 - 19968: 0xF5F9, + 34809 - 19968: 0xFAAF, + 34811 - 19968: 0xEBFC, + 34814 - 19968: 0xE0EA, + 34821 - 19968: 0xE3B2, + 34847 - 19968: 0xD5C5, + 34850 - 19968: 0xF1E3, + 34851 - 19968: 0xD5EE, + 34865 - 19968: 0xCDCC, + 34870 - 19968: 0xEDD9, + 34875 - 19968: 0xD8C1, + 34880 - 19968: 0xFAEC, + 34886 - 19968: 0xF1EB, + 34892 - 19968: 0xFABC, + 34893 - 19968: 0xE6E2, + 34898 - 19968: 0xFAE5, + 34899 - 19968: 0xE2FA, + 34903 - 19968: 0xCAB6, + 34905 - 19968: 0xE4B7, + 34907 - 19968: 0xEADB, + 34909 - 19968: 0xF5FA, + 34913 - 19968: 0xFBAC, + 34914 - 19968: 0xCFC3, + 34915 - 19968: 0xEBFD, + 34920 - 19968: 0xF8FA, + 34923 - 19968: 0xDFB9, + 34928 - 19968: 0xE1F1, + 34930 - 19968: 0xD2A4, + 34935 - 19968: 0xF5FB, + 34942 - 19968: 0xD0DA, + 34943 - 19968: 0xD0DB, + 34945 - 19968: 0xEABE, + 34946 - 19968: 0xD9B1, + 34952 - 19968: 0xCAB7, + 34955 - 19968: 0xD3E7, + 34957 - 19968: 0xF8E5, + 34962 - 19968: 0xD3B2, + 34966 - 19968: 0xE2C0, + 34967 - 19968: 0xF2DF, + 34974 - 19968: 0xCDE5, + 34987 - 19968: 0xF9AC, + 34996 - 19968: 0xCDCD, + 35009 - 19968: 0xEEAE, + 35010 - 19968: 0xD6AE, + 35023 - 19968: 0xD7EA, + 35028 - 19968: 0xE7E0, + 35029 - 19968: 0xEBAE, + 35033 - 19968: 0xCFD9, + 35036 - 19968: 0xDCCD, + 35037 - 19968: 0xEDFB, + 35039 - 19968: 0xDEF0, + 35041 - 19968: 0xD7EB, + 35048 - 19968: 0xDEA5, + 35059 - 19968: 0xDFD7, + 35060 - 19968: 0xDBD0, + 35061 - 19968: 0xDBD1, + 35064 - 19968: 0xD5A3, + 35069 - 19968: 0xF0B2, + 35079 - 19968: 0xDCDC, + 35088 - 19968: 0xCAE8, + 35090 - 19968: 0xF8E6, + 35091 - 19968: 0xDCCE, + 35096 - 19968: 0xEADC, + 35097 - 19968: 0xDBD2, + 35109 - 19968: 0xE9B3, + 35114 - 19968: 0xF7DB, + 35126 - 19968: 0xE3A8, + 35128 - 19968: 0xD7AE, + 35131 - 19968: 0xE0E1, + 35137 - 19968: 0xCBBA, + 35140 - 19968: 0xE5D1, + 35167 - 19968: 0xD0DC, + 35172 - 19968: 0xD5C1, + 35178 - 19968: 0xD8CA, + 35186 - 19968: 0xE3A9, + 35199 - 19968: 0xE0A4, + 35201 - 19968: 0xE9A9, + 35203 - 19968: 0xD3C7, + 35206 - 19968: 0xDCDD, + 35207 - 19968: 0xF8AE, + 35211 - 19968: 0xCCB8, + 35215 - 19968: 0xD0AE, + 35219 - 19968: 0xD8F2, + 35222 - 19968: 0xE3CA, + 35233 - 19968: 0xCCAF, + 35241 - 19968: 0xD4AD, + 35242 - 19968: 0xF6D1, + 35250 - 19968: 0xD0CC, + 35258 - 19968: 0xCAC6, + 35261 - 19968: 0xD5C2, + 35264 - 19968: 0xCEBA, + 35282 - 19968: 0xCAC7, + 35299 - 19968: 0xFAB0, + 35316 - 19968: 0xDFD8, + 35320 - 19968: 0xF5BA, + 35328 - 19968: 0xE5EB, + 35330 - 19968: 0xEFF4, + 35331 - 19968: 0xDDB5, + 35336 - 19968: 0xCDAA, + 35338 - 19968: 0xE3F2, + 35340 - 19968: 0xFBF7, + 35342 - 19968: 0xF7D0, + 35347 - 19968: 0xFDBA, + 35350 - 19968: 0xFDE1, + 35351 - 19968: 0xF6FE, + 35352 - 19968: 0xD1C0, + 35355 - 19968: 0xE8C5, + 35357 - 19968: 0xE4B8, + 35359 - 19968: 0xE1E8, + 35363 - 19968: 0xCCC1, + 35365 - 19968: 0xD2ED, + 35370 - 19968: 0xDBBE, + 35373 - 19968: 0xE0E2, + 35377 - 19968: 0xFAC9, + 35380 - 19968: 0xE1CD, + 35382 - 19968: 0xCAB8, + 35386 - 19968: 0xF2E0, + 35387 - 19968: 0xF1C9, + 35408 - 19968: 0xDEF1, + 35412 - 19968: 0xF0DF, + 35413 - 19968: 0xF8C4, + 35419 - 19968: 0xEECC, + 35422 - 19968: 0xDEF2, + 35424 - 19968: 0xE7C9, + 35426 - 19968: 0xE2F3, + 35427 - 19968: 0xE7E1, + 35430 - 19968: 0xE3CB, + 35433 - 19968: 0xE3CC, + 35437 - 19968: 0xCFF8, + 35438 - 19968: 0xEFAC, + 35440 - 19968: 0xFDFE, + 35441 - 19968: 0xFCA5, + 35442 - 19968: 0xFAB1, + 35443 - 19968: 0xDFD9, + 35445 - 19968: 0xE0D2, + 35449 - 19968: 0xF4DA, + 35461 - 19968: 0xF1CA, + 35463 - 19968: 0xCEA3, + 35468 - 19968: 0xF2BC, + 35469 - 19968: 0xECE3, + 35475 - 19968: 0xE0A5, + 35477 - 19968: 0xF7AB, + 35480 - 19968: 0xEBAF, + 35486 - 19968: 0xE5DE, + 35488 - 19968: 0xE1A4, + 35489 - 19968: 0xCDAB, + 35491 - 19968: 0xD9F4, + 35492 - 19968: 0xE8A6, + 35493 - 19968: 0xCDCE, + 35494 - 19968: 0xE1E9, + 35496 - 19968: 0xFCEF, + 35498 - 19968: 0xE0E3, + 35504 - 19968: 0xE2C1, + 35506 - 19968: 0xCEA4, + 35513 - 19968: 0xDEA6, + 35516 - 19968: 0xEBFE, + 35518 - 19968: 0xEBDD, + 35519 - 19968: 0xF0E0, + 35522 - 19968: 0xF4DB, + 35524 - 19968: 0xE2F4, + 35527 - 19968: 0xD3C8, + 35531 - 19968: 0xF4EB, + 35533 - 19968: 0xEEB5, + 35535 - 19968: 0xF5D8, + 35538 - 19968: 0xD5DF, + 35542 - 19968: 0xD6E5, + 35547 - 19968: 0xEBB0, + 35548 - 19968: 0xF4E3, + 35553 - 19968: 0xE3CD, + 35558 - 19968: 0xF4F4, + 35559 - 19968: 0xFAB2, + 35562 - 19968: 0xEFF5, + 35563 - 19968: 0xCADF, + 35565 - 19968: 0xEBB1, + 35566 - 19968: 0xEDBF, + 35569 - 19968: 0xFDC9, + 35574 - 19968: 0xE4A6, + 35575 - 19968: 0xF9A4, + 35576 - 19968: 0xF0B3, + 35578 - 19968: 0xE5EC, + 35582 - 19968: 0xD1E7, + 35584 - 19968: 0xD9C7, + 35585 - 19968: 0xE4D7, + 35586 - 19968: 0xEADD, + 35588 - 19968: 0xD4F7, + 35598 - 19968: 0xDABA, + 35600 - 19968: 0xDACD, + 35604 - 19968: 0xF9CC, + 35606 - 19968: 0xE1DA, + 35607 - 19968: 0xDBBF, + 35609 - 19968: 0xCCC5, + 35610 - 19968: 0xECD0, + 35611 - 19968: 0xCBBB, + 35613 - 19968: 0xDEF3, + 35616 - 19968: 0xE9AA, + 35624 - 19968: 0xD9C8, + 35627 - 19968: 0xEEE3, + 35628 - 19968: 0xD7BD, + 35635 - 19968: 0xCFC4, + 35641 - 19968: 0xD0CD, + 35649 - 19968: 0xFCA6, + 35657 - 19968: 0xF1FB, + 35662 - 19968: 0xFDD2, + 35663 - 19968: 0xD1C1, + 35672 - 19968: 0xE3DB, + 35674 - 19968: 0xD3C9, + 35676 - 19968: 0xDCCF, + 35686 - 19968: 0xCCED, + 35692 - 19968: 0xDEA7, + 35695 - 19968: 0xE6BB, + 35696 - 19968: 0xECA1, + 35700 - 19968: 0xCCB9, + 35703 - 19968: 0xFBDE, + 35709 - 19968: 0xE7E2, + 35712 - 19968: 0xD4C1, + 35722 - 19968: 0xDCA8, + 35728 - 19968: 0xE2C2, + 35730 - 19968: 0xF3D8, + 35731 - 19968: 0xE5D3, + 35734 - 19968: 0xF3D9, + 35738 - 19968: 0xF3C6, + 35895 - 19968: 0xCDDB, + 35903 - 19968: 0xCDAC, + 35905 - 19968: 0xFCC3, + 35910 - 19968: 0xD4E7, + 35912 - 19968: 0xD1C2, + 35914 - 19968: 0xF9A5, + 35916 - 19968: 0xE8D5, + 35925 - 19968: 0xE3CE, + 35930 - 19968: 0xD4CA, + 35937 - 19968: 0xDFDA, + 35946 - 19968: 0xFBDF, + 35947 - 19968: 0xE7E3, + 35961 - 19968: 0xF8FB, + 35962 - 19968: 0xE3CF, + 35970 - 19968: 0xF5B0, + 35978 - 19968: 0xD8E7, + 35980 - 19968: 0xD9C9, + 35997 - 19968: 0xF8AF, + 35998 - 19968: 0xEFF6, + 36000 - 19968: 0xDDB6, + 36001 - 19968: 0xEEAF, + 36002 - 19968: 0xCDF8, + 36007 - 19968: 0xDEB8, + 36008 - 19968: 0xFCA7, + 36009 - 19968: 0xF7FC, + 36010 - 19968: 0xF7B1, + 36011 - 19968: 0xCEBB, + 36012 - 19968: 0xF4A1, + 36015 - 19968: 0xEECD, + 36016 - 19968: 0xE1AE, + 36019 - 19968: 0xECC3, + 36020 - 19968: 0xCFFE, + 36022 - 19968: 0xF8BF, + 36023 - 19968: 0xD8E2, + 36024 - 19968: 0xD3E8, + 36027 - 19968: 0xDEA8, + 36028 - 19968: 0xF4E4, + 36029 - 19968: 0xECC2, + 36031 - 19968: 0xD9F5, + 36032 - 19968: 0xF9C5, + 36033 - 19968: 0xDDD3, + 36034 - 19968: 0xD6F1, + 36035 - 19968: 0xECFC, + 36036 - 19968: 0xFCF0, + 36039 - 19968: 0xEDC0, + 36040 - 19968: 0xCAB9, + 36042 - 19968: 0xEEE4, + 36049 - 19968: 0xF2E1, + 36051 - 19968: 0xDEB9, + 36058 - 19968: 0xD6F2, + 36060 - 19968: 0xDEF4, + 36062 - 19968: 0xDFDB, + 36064 - 19968: 0xDBD3, + 36066 - 19968: 0xFAE7, + 36067 - 19968: 0xD8E3, + 36068 - 19968: 0xF4C1, + 36070 - 19968: 0xDDB7, + 36074 - 19968: 0xF2F5, + 36077 - 19968: 0xD4AE, + 36084 - 19968: 0xD6F3, + 36091 - 19968: 0xDDB8, + 36092 - 19968: 0xCFC5, + 36093 - 19968: 0xDFDF, + 36100 - 19968: 0xF2BE, + 36101 - 19968: 0xF6A1, + 36103 - 19968: 0xEBCB, + 36104 - 19968: 0xF1FC, + 36106 - 19968: 0xF3C7, + 36109 - 19968: 0xE0EB, + 36115 - 19968: 0xEDFC, + 36118 - 19968: 0xE1DB, + 36196 - 19968: 0xEEE5, + 36198 - 19968: 0xDEF5, + 36203 - 19968: 0xFAD3, + 36208 - 19968: 0xF1CB, + 36211 - 19968: 0xD0AF, + 36212 - 19968: 0xDDB9, + 36215 - 19968: 0xD1C3, + 36229 - 19968: 0xF5B1, + 36234 - 19968: 0xEAC6, + 36249 - 19968: 0xF0E1, + 36259 - 19968: 0xF6AC, + 36264 - 19968: 0xF5D9, + 36275 - 19968: 0xF0EB, + 36282 - 19968: 0xDDBA, + 36286 - 19968: 0xF2BF, + 36294 - 19968: 0xF7C5, + 36299 - 19968: 0xDBA2, + 36300 - 19968: 0xF2F6, + 36303 - 19968: 0xCABA, + 36315 - 19968: 0xF7F5, + 36317 - 19968: 0xCBE5, + 36321 - 19968: 0xEEE6, + 36323 - 19968: 0xE0D3, + 36328 - 19968: 0xCEA5, + 36335 - 19968: 0xD6D8, + 36339 - 19968: 0xD4AF, + 36362 - 19968: 0xE9C9, + 36367 - 19968: 0xD3CE, + 36368 - 19968: 0xF4C2, + 36382 - 19968: 0xCBE6, + 36394 - 19968: 0xF1A1, + 36400 - 19968: 0xEBB2, + 36405 - 19968: 0xF1A2, + 36418 - 19968: 0xEBB3, + 36420 - 19968: 0xF0B4, + 36423 - 19968: 0xCBF4, + 36424 - 19968: 0xD4B0, + 36425 - 19968: 0xF3B2, + 36426 - 19968: 0xFBB7, + 36441 - 19968: 0xF5EC, + 36447 - 19968: 0xEEE7, + 36448 - 19968: 0xF4B2, + 36468 - 19968: 0xF5ED, + 36470 - 19968: 0xCFF3, + 36481 - 19968: 0xF0E2, + 36487 - 19968: 0xEECE, + 36490 - 19968: 0xF1CC, + 36493 - 19968: 0xE5B8, + 36522 - 19968: 0xD7F5, + 36523 - 19968: 0xE3F3, + 36524 - 19968: 0xCFE5, + 36544 - 19968: 0xCFC6, + 36554 - 19968: 0xF3B3, + 36555 - 19968: 0xE4D8, + 36556 - 19968: 0xCFF9, + 36557 - 19968: 0xCFDA, + 36562 - 19968: 0xFACD, + 36575 - 19968: 0xE6E3, + 36587 - 19968: 0xF2E2, + 36600 - 19968: 0xF5EE, + 36603 - 19968: 0xCABB, + 36606 - 19968: 0xE3DC, + 36611 - 19968: 0xCEF2, + 36613 - 19968: 0xD6D9, + 36617 - 19968: 0xEEB0, + 36626 - 19968: 0xF4E5, + 36627 - 19968: 0xD8C2, + 36628 - 19968: 0xDCD0, + 36629 - 19968: 0xCCEE, + 36635 - 19968: 0xD5E0, + 36636 - 19968: 0xF6CA, + 36637 - 19968: 0xFDCA, + 36638 - 19968: 0xD8D6, + 36639 - 19968: 0xF4CF, + 36646 - 19968: 0xD6A6, + 36647 - 19968: 0xDCBE, + 36649 - 19968: 0xDBD4, + 36650 - 19968: 0xD7C7, + 36655 - 19968: 0xF2FE, + 36659 - 19968: 0xF1CD, + 36664 - 19968: 0xE2C3, + 36665 - 19968: 0xDCDE, + 36667 - 19968: 0xDCDF, + 36670 - 19968: 0xEFAD, + 36671 - 19968: 0xE6AB, + 36676 - 19968: 0xF9DD, + 36677 - 19968: 0xEABF, + 36681 - 19968: 0xEFAE, + 36685 - 19968: 0xF4D0, + 36686 - 19968: 0xCEF3, + 36701 - 19968: 0xE6AC, + 36703 - 19968: 0xCEDE, + 36706 - 19968: 0xD5F9, + 36763 - 19968: 0xE3F4, + 36764 - 19968: 0xCDD0, + 36771 - 19968: 0xD5B8, + 36774 - 19968: 0xF7FD, + 36776 - 19968: 0xDCA9, + 36781 - 19968: 0xDEF6, + 36783 - 19968: 0xDCAA, + 36784 - 19968: 0xF2E3, + 36785 - 19968: 0xE9B4, + 36786 - 19968: 0xD2DC, + 36802 - 19968: 0xE9E6, + 36805 - 19968: 0xE3F6, + 36814 - 19968: 0xE7CA, + 36817 - 19968: 0xD0CE, + 36820 - 19968: 0xDAF7, + 36838 - 19968: 0xCABC, + 36842 - 19968: 0xEEE8, + 36843 - 19968: 0xDADE, + 36845 - 19968: 0xF2F7, + 36848 - 19968: 0xE2FB, + 36850 - 19968: 0xCCA6, + 36855 - 19968: 0xDABB, + 36857 - 19968: 0xEEE9, + 36861 - 19968: 0xF5DA, + 36864 - 19968: 0xF7DC, + 36865 - 19968: 0xE1EA, + 36866 - 19968: 0xCEC1, + 36867 - 19968: 0xD4B1, + 36869 - 19968: 0xFDB1, + 36870 - 19968: 0xE6BD, + 36872 - 19968: 0xFBAD, + 36875 - 19968: 0xF8E7, + 36877 - 19968: 0xE1CE, + 36879 - 19968: 0xF7E2, + 36880 - 19968: 0xF5EF, + 36881 - 19968: 0xCFC7, + 36884 - 19968: 0xD4B2, + 36885 - 19968: 0xCCEF, + 36887 - 19968: 0xD4E8, + 36889 - 19968: 0xEECF, + 36890 - 19968: 0xF7D7, + 36893 - 19968: 0xE0A6, + 36894 - 19968: 0xD6C1, + 36895 - 19968: 0xE1DC, + 36896 - 19968: 0xF0E3, + 36897 - 19968: 0xF1E4, + 36898 - 19968: 0xDCF1, + 36899 - 19968: 0xD6A7, + 36910 - 19968: 0xF4F5, + 36913 - 19968: 0xF1CE, + 36914 - 19968: 0xF2E4, + 36917 - 19968: 0xD0B0, + 36920 - 19968: 0xECEF, + 36924 - 19968: 0xF9BA, + 36926 - 19968: 0xEBB5, + 36929 - 19968: 0xD4ED, + 36930 - 19968: 0xE2C4, + 36935 - 19968: 0xE9E7, + 36938 - 19968: 0xEBB4, + 36939 - 19968: 0xEAA1, + 36941 - 19968: 0xF8BC, + 36942 - 19968: 0xCEA6, + 36944 - 19968: 0xF9C6, + 36945 - 19968: 0xFCDA, + 36947 - 19968: 0xD4B3, + 36948 - 19968: 0xD3B9, + 36949 - 19968: 0xEADE, + 36953 - 19968: 0xE9AB, + 36956 - 19968: 0xE1E1, + 36957 - 19968: 0xD3CF, + 36958 - 19968: 0xF4F6, + 36960 - 19968: 0xEAC0, + 36961 - 19968: 0xE1CF, + 36963 - 19968: 0xCCBA, + 36969 - 19968: 0xEEEA, + 36973 - 19968: 0xF0E4, + 36974 - 19968: 0xF3B4, + 36975 - 19968: 0xD4EE, + 36978 - 19968: 0xF2C0, + 36981 - 19968: 0xF1E5, + 36983 - 19968: 0xF4C3, + 36984 - 19968: 0xE0D4, + 36986 - 19968: 0xEBB6, + 36988 - 19968: 0xD7A1, + 36989 - 19968: 0xCBE8, + 36991 - 19968: 0xF9AD, + 36992 - 19968: 0xE9AD, + 36993 - 19968: 0xD8E4, + 36994 - 19968: 0xFAB3, + 36995 - 19968: 0xE2C5, + 36996 - 19968: 0xFCBD, + 36999 - 19968: 0xECC4, + 37000 - 19968: 0xD8B1, + 37002 - 19968: 0xDCAB, + 37007 - 19968: 0xD5A4, + 37009 - 19968: 0xEBE9, + 37013 - 19968: 0xE8BB, + 37017 - 19968: 0xD8D7, + 37026 - 19968: 0xFBAE, + 37027 - 19968: 0xD1E1, + 37030 - 19968: 0xDBC0, + 37032 - 19968: 0xF5BE, + 37034 - 19968: 0xDEF7, + 37039 - 19968: 0xCAFB, + 37040 - 19968: 0xF7C6, + 37041 - 19968: 0xCFC8, + 37045 - 19968: 0xE1D0, + 37048 - 19968: 0xEED0, + 37057 - 19968: 0xE9F4, + 37066 - 19968: 0xCEF4, + 37086 - 19968: 0xD5CD, + 37089 - 19968: 0xCFDB, + 37096 - 19968: 0xDDBB, + 37101 - 19968: 0xCEAC, + 37109 - 19968: 0xE9E8, + 37117 - 19968: 0xD4B4, + 37122 - 19968: 0xE4C7, + 37138 - 19968: 0xF5DB, + 37141 - 19968: 0xFAC1, + 37145 - 19968: 0xDEA9, + 37159 - 19968: 0xD4F8, + 37165 - 19968: 0xEFF7, + 37170 - 19968: 0xD3B3, + 37193 - 19968: 0xEBB7, + 37194 - 19968: 0xEFF8, + 37195 - 19968: 0xF5DC, + 37196 - 19968: 0xEDCC, + 37197 - 19968: 0xDBD5, + 37198 - 19968: 0xF1CF, + 37202 - 19968: 0xF1D0, + 37218 - 19968: 0xF5B2, + 37225 - 19968: 0xD9AE, + 37226 - 19968: 0xD5AC, + 37228 - 19968: 0xE2C6, + 37237 - 19968: 0xFDA3, + 37239 - 19968: 0xFBE5, + 37240 - 19968: 0xDFAB, + 37255 - 19968: 0xE2F5, + 37257 - 19968: 0xF6AD, + 37259 - 19968: 0xF5B3, + 37261 - 19968: 0xF0B5, + 37266 - 19968: 0xE1A5, + 37276 - 19968: 0xF5DD, + 37291 - 19968: 0xECA2, + 37292 - 19968: 0xEDFD, + 37294 - 19968: 0xF5B4, + 37295 - 19968: 0xFBB8, + 37297 - 19968: 0xDBA3, + 37300 - 19968: 0xD6CA, + 37301 - 19968: 0xCBD9, + 37312 - 19968: 0xE5D4, + 37319 - 19968: 0xF3FA, + 37321 - 19968: 0xEBB8, + 37323 - 19968: 0xE0B7, + 37324 - 19968: 0xD7EC, + 37325 - 19968: 0xF1EC, + 37326 - 19968: 0xE5AF, + 37327 - 19968: 0xD5E1, + 37328 - 19968: 0xD7ED, + 37329 - 19968: 0xD1D1, + 37335 - 19968: 0xE1F2, + 37336 - 19968: 0xEFF9, + 37340 - 19968: 0xDDBC, + 37341 - 19968: 0xF6DC, + 37347 - 19968: 0xF0E5, + 37351 - 19968: 0xF4C4, + 37354 - 19968: 0xE9E9, + 37365 - 19968: 0xF3FB, + 37389 - 19968: 0xD4EF, + 37392 - 19968: 0xCCA2, + 37393 - 19968: 0xF7FE, + 37394 - 19968: 0xDFBC, + 37399 - 19968: 0xEBCD, + 37406 - 19968: 0xD0B7, + 37428 - 19968: 0xD6C2, + 37434 - 19968: 0xE8AD, + 37439 - 19968: 0xEFAF, + 37440 - 19968: 0xCBA5, + 37445 - 19968: 0xCBE9, + 37449 - 19968: 0xFAE8, + 37463 - 19968: 0xCCC6, + 37467 - 19968: 0xE6E7, + 37470 - 19968: 0xEAC7, + 37474 - 19968: 0xDBA4, + 37476 - 19968: 0xCFC9, + 37477 - 19968: 0xE2FC, + 37478 - 19968: 0xEFFA, + 37504 - 19968: 0xEBDE, + 37507 - 19968: 0xF5C8, + 37509 - 19968: 0xD4DE, + 37521 - 19968: 0xE0D5, + 37523 - 19968: 0xEFB0, + 37526 - 19968: 0xE2C7, + 37528 - 19968: 0xD9AF, + 37532 - 19968: 0xF9E7, + 37555 - 19968: 0xE7E5, + 37558 - 19968: 0xCFCA, + 37559 - 19968: 0xE1D1, + 37561 - 19968: 0xE2C8, + 37580 - 19968: 0xEFFB, + 37583 - 19968: 0xFAF9, + 37586 - 19968: 0xDCF2, + 37604 - 19968: 0xE0A7, + 37610 - 19968: 0xF8E8, + 37624 - 19968: 0xCBEA, + 37628 - 19968: 0xCBBC, + 37636 - 19968: 0xD6E2, + 37648 - 19968: 0xF5DE, + 37656 - 19968: 0xF5DF, + 37658 - 19968: 0xEEB6, + 37662 - 19968: 0xE2F6, + 37663 - 19968: 0xD3CA, + 37664 - 19968: 0xEFFC, + 37665 - 19968: 0xD1C4, + 37666 - 19968: 0xEFB1, + 37668 - 19968: 0xD1C5, + 37670 - 19968: 0xD0DE, + 37672 - 19968: 0xD9E1, + 37675 - 19968: 0xE0B8, + 37678 - 19968: 0xCDD1, + 37679 - 19968: 0xF3B9, + 37704 - 19968: 0xE7CC, + 37706 - 19968: 0xD6A8, + 37707 - 19968: 0xCEA7, + 37709 - 19968: 0xD4B5, + 37716 - 19968: 0xE4C8, + 37723 - 19968: 0xD3B4, + 37742 - 19968: 0xEBB9, + 37749 - 19968: 0xCBF5, + 37756 - 19968: 0xF6DD, + 37758 - 19968: 0xF1A3, + 37772 - 19968: 0xCCC7, + 37780 - 19968: 0xE9CA, + 37782 - 19968: 0xE1F0, + 37786 - 19968: 0xF5E0, + 37795 - 19968: 0xFBAF, + 37799 - 19968: 0xCBD1, + 37804 - 19968: 0xFBE0, + 37805 - 19968: 0xF2E5, + 37808 - 19968: 0xECF0, + 37827 - 19968: 0xF0EC, + 37841 - 19968: 0xEEEB, + 37854 - 19968: 0xE9CB, + 37857 - 19968: 0xCCF0, + 37860 - 19968: 0xD7AF, + 37878 - 19968: 0xF3A1, + 37892 - 19968: 0xFCF5, + 37912 - 19968: 0xF1A4, + 37925 - 19968: 0xE0D6, + 37931 - 19968: 0xEFB2, + 37941 - 19968: 0xF4D1, + 37944 - 19968: 0xF7A1, + 37956 - 19968: 0xF1D1, + 37969 - 19968: 0xCAFC, + 37970 - 19968: 0xCAFD, + 37979 - 19968: 0xCECE, + 38013 - 19968: 0xF3C8, + 38015 - 19968: 0xF3BA, + 38263 - 19968: 0xEDFE, + 38272 - 19968: 0xDAA6, + 38275 - 19968: 0xE0EC, + 38281 - 19968: 0xF8CD, + 38283 - 19968: 0xCBD2, + 38287 - 19968: 0xEBCE, + 38289 - 19968: 0xF9D8, + 38290 - 19968: 0xF9D9, + 38291 - 19968: 0xCAE0, + 38292 - 19968: 0xDACA, + 38296 - 19968: 0xCBA6, + 38307 - 19968: 0xCAC8, + 38308 - 19968: 0xF9EE, + 38309 - 19968: 0xDBEC, + 38312 - 19968: 0xD0B1, + 38317 - 19968: 0xD5EF, + 38321 - 19968: 0xE6F3, + 38331 - 19968: 0xE7A2, + 38332 - 19968: 0xE4D9, + 38343 - 19968: 0xE4E1, + 38346 - 19968: 0xFCC4, + 38356 - 19968: 0xF9EF, + 38357 - 19968: 0xCFF4, + 38358 - 19968: 0xF7E6, + 38364 - 19968: 0xCEBC, + 38369 - 19968: 0xF4C5, + 38370 - 19968: 0xDCA3, + 38428 - 19968: 0xDDBD, + 38433 - 19968: 0xF4C6, + 38442 - 19968: 0xF8A1, + 38446 - 19968: 0xE8D6, + 38450 - 19968: 0xDBC1, + 38459 - 19968: 0xF0E6, + 38463 - 19968: 0xE4B9, + 38464 - 19968: 0xF6ED, + 38466 - 19968: 0xF9AE, + 38468 - 19968: 0xDDBE, + 38475 - 19968: 0xD7B0, + 38476 - 19968: 0xD8E8, + 38477 - 19968: 0xCBBD, + 38480 - 19968: 0xF9DA, + 38491 - 19968: 0xF8CE, + 38492 - 19968: 0xF9F0, + 38493 - 19968: 0xE0ED, + 38494 - 19968: 0xE3B3, + 38495 - 19968: 0xF4B3, + 38498 - 19968: 0xEAC2, + 38499 - 19968: 0xF2E6, + 38500 - 19968: 0xF0B6, + 38506 - 19968: 0xDBD6, + 38512 - 19968: 0xEBE4, + 38515 - 19968: 0xF2E7, + 38517 - 19968: 0xD7D5, + 38518 - 19968: 0xD4B6, + 38519 - 19968: 0xF9E8, + 38520 - 19968: 0xD7C1, + 38525 - 19968: 0xE5D5, + 38533 - 19968: 0xE9EA, + 38534 - 19968: 0xD7CC, + 38538 - 19968: 0xD3E9, + 38539 - 19968: 0xE2C9, + 38541 - 19968: 0xFCDB, + 38542 - 19968: 0xCDAD, + 38548 - 19968: 0xCCB0, + 38549 - 19968: 0xEAA2, + 38552 - 19968: 0xE4F6, + 38553 - 19968: 0xD0C0, + 38555 - 19968: 0xF0B7, + 38556 - 19968: 0xEEA1, + 38563 - 19968: 0xD7F6, + 38567 - 19968: 0xE2CA, + 38568 - 19968: 0xE2CB, + 38570 - 19968: 0xFACF, + 38577 - 19968: 0xEBDF, + 38583 - 19968: 0xD6CB, + 38587 - 19968: 0xF4B4, + 38592 - 19968: 0xEDCD, + 38593 - 19968: 0xE4D2, + 38596 - 19968: 0xEAA9, + 38597 - 19968: 0xE4BA, + 38598 - 19968: 0xF3A2, + 38599 - 19968: 0xCDD2, + 38601 - 19968: 0xF6CB, + 38603 - 19968: 0xF1E6, + 38604 - 19968: 0xEDC1, + 38605 - 19968: 0xE8BC, + 38606 - 19968: 0xEED1, + 38613 - 19968: 0xF0E7, + 38614 - 19968: 0xE2CC, + 38617 - 19968: 0xE4AA, + 38619 - 19968: 0xF5E1, + 38620 - 19968: 0xEDDA, + 38626 - 19968: 0xD7EE, + 38627 - 19968: 0xD1F1, + 38632 - 19968: 0xE9EB, + 38633 - 19968: 0xE9EC, + 38634 - 19968: 0xE0E4, + 38639 - 19968: 0xDAA7, + 38640 - 19968: 0xDDD4, + 38642 - 19968: 0xEAA3, + 38646 - 19968: 0xD6C3, + 38647 - 19968: 0xD6F4, + 38649 - 19968: 0xDADF, + 38651 - 19968: 0xEFB3, + 38656 - 19968: 0xE2CD, + 38662 - 19968: 0xEFFD, + 38663 - 19968: 0xF2E8, + 38673 - 19968: 0xEFC5, + 38675 - 19968: 0xE7E7, + 38678 - 19968: 0xD7FD, + 38681 - 19968: 0xE7CE, + 38684 - 19968: 0xDFDC, + 38686 - 19968: 0xF9C7, + 38695 - 19968: 0xD9F6, + 38704 - 19968: 0xDFAC, + 38706 - 19968: 0xD6DA, + 38713 - 19968: 0xDCA4, + 38717 - 19968: 0xF0B8, + 38722 - 19968: 0xD5FA, + 38724 - 19968: 0xE4F7, + 38728 - 19968: 0xD6C4, + 38737 - 19968: 0xF4EC, + 38742 - 19968: 0xEFFE, + 38748 - 19968: 0xF0A1, + 38750 - 19968: 0xDEAA, + 38753 - 19968: 0xDABC, + 38754 - 19968: 0xD8FC, + 38761 - 19968: 0xFAD4, + 38765 - 19968: 0xECE5, + 38772 - 19968: 0xFCA8, + 38775 - 19968: 0xECE6, + 38778 - 19968: 0xD8CB, + 38795 - 19968: 0xFBB9, + 38797 - 19968: 0xE4D3, + 38799 - 19968: 0xCDF9, + 38816 - 19968: 0xCFD3, + 38824 - 19968: 0xCAEA, + 38827 - 19968: 0xCFD4, + 38829 - 19968: 0xF8BD, + 38854 - 19968: 0xF4C7, + 38859 - 19968: 0xEADF, + 38867 - 19968: 0xF9DB, + 38876 - 19968: 0xD4B7, + 38899 - 19968: 0xEBE5, + 38902 - 19968: 0xE1D2, + 38907 - 19968: 0xEAA4, + 38911 - 19968: 0xFAC2, + 38912 - 19968: 0xFBE1, + 38913 - 19968: 0xFAED, + 38914 - 19968: 0xF0A2, + 38915 - 19968: 0xCCF1, + 38917 - 19968: 0xFAA3, + 38918 - 19968: 0xE2F7, + 38920 - 19968: 0xE2CE, + 38922 - 19968: 0xE9F5, + 38924 - 19968: 0xE1EB, + 38928 - 19968: 0xE7E8, + 38929 - 19968: 0xE8D7, + 38930 - 19968: 0xDAF8, + 38931 - 19968: 0xD4CB, + 38935 - 19968: 0xF7F6, + 38936 - 19968: 0xD6C5, + 38957 - 19968: 0xD4E9, + 38960 - 19968: 0xFAFA, + 38968 - 19968: 0xCCF2, + 38969 - 19968: 0xF7DD, + 38971 - 19968: 0xDEBA, + 38982 - 19968: 0xCEA8, + 38988 - 19968: 0xF0B9, + 38989 - 19968: 0xE4FE, + 38990 - 19968: 0xE4C9, + 38996 - 19968: 0xE4D4, + 39000 - 19968: 0xEAC3, + 39002 - 19968: 0xEFB4, + 39006 - 19968: 0xD7BE, + 39013 - 19968: 0xFBE2, + 39015 - 19968: 0xCDD3, + 39019 - 19968: 0xEFB5, + 39023 - 19968: 0xFAE9, + 39080 - 19968: 0xF9A6, + 39087 - 19968: 0xDFBD, + 39089 - 19968: 0xF7C7, + 39108 - 19968: 0xF8FD, + 39111 - 19968: 0xF8FC, + 39131 - 19968: 0xDEAB, + 39132 - 19968: 0xDBE8, + 39135 - 19968: 0xE3DD, + 39137 - 19968: 0xE1E2, + 39138 - 19968: 0xD1C6, + 39149 - 19968: 0xF6D0, + 39150 - 19968: 0xEBE6, + 39151 - 19968: 0xDAF9, + 39156 - 19968: 0xECC7, + 39164 - 19968: 0xDEF8, + 39165 - 19968: 0xF8E9, + 39166 - 19968: 0xE3DE, + 39171 - 19968: 0xCEF5, + 39177 - 19968: 0xFAC3, + 39178 - 19968: 0xE5D7, + 39180 - 19968: 0xECC8, + 39184 - 19968: 0xF3C9, + 39187 - 19968: 0xE4BB, + 39192 - 19968: 0xE6AE, + 39198 - 19968: 0xEFB6, + 39200 - 19968: 0xDCBF, + 39208 - 19968: 0xCEBD, + 39237 - 19968: 0xD8C3, + 39241 - 19968: 0xD0CF, + 39243 - 19968: 0xCFFA, + 39244 - 19968: 0xF3CA, + 39245 - 19968: 0xE0D7, + 39249 - 19968: 0xD1C7, + 39250 - 19968: 0xE9AE, + 39252 - 19968: 0xE8BD, + 39255 - 19968: 0xFAC4, + 39318 - 19968: 0xE2CF, + 39321 - 19968: 0xFAC5, + 39325 - 19968: 0xF9B8, + 39333 - 19968: 0xDCE0, + 39336 - 19968: 0xFBB0, + 39340 - 19968: 0xD8A9, + 39341 - 19968: 0xE5DF, + 39342 - 19968: 0xF9A7, + 39345 - 19968: 0xF6EE, + 39347 - 19968: 0xF6CC, + 39348 - 19968: 0xE2F8, + 39353 - 19968: 0xECF1, + 39361 - 19968: 0xDAE0, + 39376 - 19968: 0xF1D2, + 39377 - 19968: 0xD2CC, + 39378 - 19968: 0xCFCB, + 39381 - 19968: 0xCABD, + 39385 - 19968: 0xDDBF, + 39389 - 19968: 0xF6EF, + 39391 - 19968: 0xDEF9, + 39405 - 19968: 0xFAB4, + 39409 - 19968: 0xD5AD, + 39423 - 19968: 0xF1E7, + 39425 - 19968: 0xDEBE, + 39432 - 19968: 0xDCC0, + 39438 - 19968: 0xD1C8, + 39439 - 19968: 0xD1C9, + 39449 - 19968: 0xF8BE, + 39467 - 19968: 0xCBF6, + 39472 - 19968: 0xD4F9, + 39478 - 19968: 0xF5E2, + 39479 - 19968: 0xE1D3, + 39488 - 19968: 0xD8E9, + 39491 - 19968: 0xF8FE, + 39493 - 19968: 0xCFCC, + 39501 - 19968: 0xFDA4, + 39509 - 19968: 0xCEF6, + 39511 - 19968: 0xFAD0, + 39514 - 19968: 0xCCF3, + 39515 - 19968: 0xE6BE, + 39519 - 19968: 0xF6AE, + 39522 - 19968: 0xD5F0, + 39525 - 19968: 0xD1CA, + 39529 - 19968: 0xFCBE, + 39530 - 19968: 0xD5F1, + 39592 - 19968: 0xCDE9, + 39608 - 19968: 0xFAB5, + 39635 - 19968: 0xE2D0, + 39636 - 19968: 0xF4F7, + 39640 - 19968: 0xCDD4, + 39653 - 19968: 0xE7A3, + 39662 - 19968: 0xDBA5, + 39706 - 19968: 0xE2D1, + 39719 - 19968: 0xD7A2, + 39722 - 19968: 0xF7E3, + 39729 - 19968: 0xEAA6, + 39740 - 19968: 0xD0A1, + 39745 - 19968: 0xCEDA, + 39746 - 19968: 0xFBEB, + 39747 - 19968: 0xDBA6, + 39748 - 19968: 0xDBDE, + 39749 - 19968: 0xD8E5, + 39759 - 19968: 0xEAE0, + 39764 - 19968: 0xD8AA, + 39770 - 19968: 0xE5E0, + 39791 - 19968: 0xD6DB, + 39822 - 19968: 0xEFC6, + 39825 - 19968: 0xF8EA, + 39839 - 19968: 0xE4D5, + 39851 - 19968: 0xCEF7, + 39854 - 19968: 0xE0D8, + 39881 - 19968: 0xD7EF, + 39894 - 19968: 0xF4ED, + 39908 - 19968: 0xCDE6, + 39912 - 19968: 0xCCF4, + 39949 - 19968: 0xF5E3, + 39952 - 19968: 0xE4CA, + 39954 - 19968: 0xDCE1, + 39957 - 19968: 0xF9C8, + 39973 - 19968: 0xFCBF, + 39986 - 19968: 0xE8A7, + 39995 - 19968: 0xD8C4, + 40007 - 19968: 0xCBBE, + 40009 - 19968: 0xDCAE, + 40023 - 19968: 0xD7F7, + 40165 - 19968: 0xF0E8, + 40167 - 19968: 0xDDC0, + 40169 - 19968: 0xCFCD, + 40179 - 19968: 0xDCF3, + 40180 - 19968: 0xD9B0, + 40182 - 19968: 0xE6E9, + 40201 - 19968: 0xE4BC, + 40219 - 19968: 0xEAC4, + 40230 - 19968: 0xE4EC, + 40232 - 19968: 0xE4E5, + 40251 - 19968: 0xFBF8, + 40273 - 19968: 0xCCBB, + 40285 - 19968: 0xE4BD, + 40288 - 19968: 0xCDDC, + 40289 - 19968: 0xD9F7, + 40300 - 19968: 0xDDDF, + 40306 - 19968: 0xEDCE, + 40361 - 19968: 0xD9D0, + 40367 - 19968: 0xE5A3, + 40372 - 19968: 0xF9CD, + 40388 - 19968: 0xCDAE, + 40407 - 19968: 0xCFCE, + 40434 - 19968: 0xF6AF, + 40440 - 19968: 0xFDD3, + 40441 - 19968: 0xEBED, + 40442 - 19968: 0xD6DC, + 40474 - 19968: 0xE5A4, + 40478 - 19968: 0xD5B6, + 40565 - 19968: 0xD6DD, + 40569 - 19968: 0xF9E9, + 40573 - 19968: 0xE7A4, + 40575 - 19968: 0xD6E3, + 40594 - 19968: 0xD1CB, + 40595 - 19968: 0xD6E4, + 40599 - 19968: 0xD5F2, + 40605 - 19968: 0xDEFA, + 40607 - 19968: 0xD7F8, + 40613 - 19968: 0xD8EA, + 40628 - 19968: 0xCFD5, + 40629 - 19968: 0xD8FD, + 40635 - 19968: 0xD8AB, + 40638 - 19968: 0xFDCB, + 40643 - 19968: 0xFCDC, + 40653 - 19968: 0xE0A8, + 40654 - 19968: 0xD5F3, + 40657 - 19968: 0xFDD9, + 40660 - 19968: 0xCCA3, + 40664 - 19968: 0xD9F9, + 40667 - 19968: 0xD3EA, + 40668 - 19968: 0xF5F5, + 40670 - 19968: 0xEFC7, + 40680 - 19968: 0xD3DA, + 40692 - 19968: 0xDABD, + 40711 - 19968: 0xE8A8, + 40712 - 19968: 0xDCAF, + 40718 - 19968: 0xF0A3, + 40723 - 19968: 0xCDD5, + 40736 - 19968: 0xE0A9, + 40763 - 19968: 0xDEAC, + 40778 - 19968: 0xF0BA, + 40779 - 19968: 0xEEB1, + 40782 - 19968: 0xEEB2, + 40786 - 19968: 0xF6CD, + 40799 - 19968: 0xEED2, + 40801 - 19968: 0xD6C6, + 40807 - 19968: 0xE0E5, + 40810 - 19968: 0xF3BB, + 40812 - 19968: 0xE5E1, + 40823 - 19968: 0xE4CB, + 40845 - 19968: 0xD7A3, + 40848 - 19968: 0xDBC2, + 40853 - 19968: 0xCAFE, + 40860 - 19968: 0xCFCF, +} + +const encode1Low, encode1High = 44032, 55204 + +var encode1 = [...]uint16{ + 44032 - 44032: 0xB0A1, + 44033 - 44032: 0xB0A2, + 44034 - 44032: 0x8141, + 44035 - 44032: 0x8142, + 44036 - 44032: 0xB0A3, + 44037 - 44032: 0x8143, + 44038 - 44032: 0x8144, + 44039 - 44032: 0xB0A4, + 44040 - 44032: 0xB0A5, + 44041 - 44032: 0xB0A6, + 44042 - 44032: 0xB0A7, + 44043 - 44032: 0x8145, + 44044 - 44032: 0x8146, + 44045 - 44032: 0x8147, + 44046 - 44032: 0x8148, + 44047 - 44032: 0x8149, + 44048 - 44032: 0xB0A8, + 44049 - 44032: 0xB0A9, + 44050 - 44032: 0xB0AA, + 44051 - 44032: 0xB0AB, + 44052 - 44032: 0xB0AC, + 44053 - 44032: 0xB0AD, + 44054 - 44032: 0xB0AE, + 44055 - 44032: 0xB0AF, + 44056 - 44032: 0x814A, + 44057 - 44032: 0xB0B0, + 44058 - 44032: 0xB0B1, + 44059 - 44032: 0xB0B2, + 44060 - 44032: 0xB0B3, + 44061 - 44032: 0xB0B4, + 44062 - 44032: 0x814B, + 44063 - 44032: 0x814C, + 44064 - 44032: 0xB0B5, + 44065 - 44032: 0x814D, + 44066 - 44032: 0x814E, + 44067 - 44032: 0x814F, + 44068 - 44032: 0xB0B6, + 44069 - 44032: 0x8150, + 44070 - 44032: 0x8151, + 44071 - 44032: 0x8152, + 44072 - 44032: 0x8153, + 44073 - 44032: 0x8154, + 44074 - 44032: 0x8155, + 44075 - 44032: 0x8156, + 44076 - 44032: 0xB0B7, + 44077 - 44032: 0xB0B8, + 44078 - 44032: 0x8157, + 44079 - 44032: 0xB0B9, + 44080 - 44032: 0xB0BA, + 44081 - 44032: 0xB0BB, + 44082 - 44032: 0x8158, + 44083 - 44032: 0x8159, + 44084 - 44032: 0x815A, + 44085 - 44032: 0x8161, + 44086 - 44032: 0x8162, + 44087 - 44032: 0x8163, + 44088 - 44032: 0xB0BC, + 44089 - 44032: 0xB0BD, + 44090 - 44032: 0x8164, + 44091 - 44032: 0x8165, + 44092 - 44032: 0xB0BE, + 44093 - 44032: 0x8166, + 44094 - 44032: 0x8167, + 44095 - 44032: 0x8168, + 44096 - 44032: 0xB0BF, + 44097 - 44032: 0x8169, + 44098 - 44032: 0x816A, + 44099 - 44032: 0x816B, + 44100 - 44032: 0x816C, + 44101 - 44032: 0x816D, + 44102 - 44032: 0x816E, + 44103 - 44032: 0x816F, + 44104 - 44032: 0x8170, + 44105 - 44032: 0x8171, + 44106 - 44032: 0x8172, + 44107 - 44032: 0xB0C0, + 44108 - 44032: 0x8173, + 44109 - 44032: 0xB0C1, + 44110 - 44032: 0x8174, + 44111 - 44032: 0x8175, + 44112 - 44032: 0x8176, + 44113 - 44032: 0x8177, + 44114 - 44032: 0x8178, + 44115 - 44032: 0x8179, + 44116 - 44032: 0xB0C2, + 44117 - 44032: 0x817A, + 44118 - 44032: 0x8181, + 44119 - 44032: 0x8182, + 44120 - 44032: 0xB0C3, + 44121 - 44032: 0x8183, + 44122 - 44032: 0x8184, + 44123 - 44032: 0x8185, + 44124 - 44032: 0xB0C4, + 44125 - 44032: 0x8186, + 44126 - 44032: 0x8187, + 44127 - 44032: 0x8188, + 44128 - 44032: 0x8189, + 44129 - 44032: 0x818A, + 44130 - 44032: 0x818B, + 44131 - 44032: 0x818C, + 44132 - 44032: 0x818D, + 44133 - 44032: 0x818E, + 44134 - 44032: 0x818F, + 44135 - 44032: 0x8190, + 44136 - 44032: 0x8191, + 44137 - 44032: 0x8192, + 44138 - 44032: 0x8193, + 44139 - 44032: 0x8194, + 44140 - 44032: 0x8195, + 44141 - 44032: 0x8196, + 44142 - 44032: 0x8197, + 44143 - 44032: 0x8198, + 44144 - 44032: 0xB0C5, + 44145 - 44032: 0xB0C6, + 44146 - 44032: 0x8199, + 44147 - 44032: 0x819A, + 44148 - 44032: 0xB0C7, + 44149 - 44032: 0x819B, + 44150 - 44032: 0x819C, + 44151 - 44032: 0xB0C8, + 44152 - 44032: 0xB0C9, + 44153 - 44032: 0x819D, + 44154 - 44032: 0xB0CA, + 44155 - 44032: 0x819E, + 44156 - 44032: 0x819F, + 44157 - 44032: 0x81A0, + 44158 - 44032: 0x81A1, + 44159 - 44032: 0x81A2, + 44160 - 44032: 0xB0CB, + 44161 - 44032: 0xB0CC, + 44162 - 44032: 0x81A3, + 44163 - 44032: 0xB0CD, + 44164 - 44032: 0xB0CE, + 44165 - 44032: 0xB0CF, + 44166 - 44032: 0xB0D0, + 44167 - 44032: 0x81A4, + 44168 - 44032: 0x81A5, + 44169 - 44032: 0xB0D1, + 44170 - 44032: 0xB0D2, + 44171 - 44032: 0xB0D3, + 44172 - 44032: 0xB0D4, + 44173 - 44032: 0x81A6, + 44174 - 44032: 0x81A7, + 44175 - 44032: 0x81A8, + 44176 - 44032: 0xB0D5, + 44177 - 44032: 0x81A9, + 44178 - 44032: 0x81AA, + 44179 - 44032: 0x81AB, + 44180 - 44032: 0xB0D6, + 44181 - 44032: 0x81AC, + 44182 - 44032: 0x81AD, + 44183 - 44032: 0x81AE, + 44184 - 44032: 0x81AF, + 44185 - 44032: 0x81B0, + 44186 - 44032: 0x81B1, + 44187 - 44032: 0x81B2, + 44188 - 44032: 0xB0D7, + 44189 - 44032: 0xB0D8, + 44190 - 44032: 0x81B3, + 44191 - 44032: 0xB0D9, + 44192 - 44032: 0xB0DA, + 44193 - 44032: 0xB0DB, + 44194 - 44032: 0x81B4, + 44195 - 44032: 0x81B5, + 44196 - 44032: 0x81B6, + 44197 - 44032: 0x81B7, + 44198 - 44032: 0x81B8, + 44199 - 44032: 0x81B9, + 44200 - 44032: 0xB0DC, + 44201 - 44032: 0xB0DD, + 44202 - 44032: 0xB0DE, + 44203 - 44032: 0x81BA, + 44204 - 44032: 0xB0DF, + 44205 - 44032: 0x81BB, + 44206 - 44032: 0x81BC, + 44207 - 44032: 0xB0E0, + 44208 - 44032: 0xB0E1, + 44209 - 44032: 0x81BD, + 44210 - 44032: 0x81BE, + 44211 - 44032: 0x81BF, + 44212 - 44032: 0x81C0, + 44213 - 44032: 0x81C1, + 44214 - 44032: 0x81C2, + 44215 - 44032: 0x81C3, + 44216 - 44032: 0xB0E2, + 44217 - 44032: 0xB0E3, + 44218 - 44032: 0x81C4, + 44219 - 44032: 0xB0E4, + 44220 - 44032: 0xB0E5, + 44221 - 44032: 0xB0E6, + 44222 - 44032: 0x81C5, + 44223 - 44032: 0x81C6, + 44224 - 44032: 0x81C7, + 44225 - 44032: 0xB0E7, + 44226 - 44032: 0x81C8, + 44227 - 44032: 0x81C9, + 44228 - 44032: 0xB0E8, + 44229 - 44032: 0x81CA, + 44230 - 44032: 0x81CB, + 44231 - 44032: 0x81CC, + 44232 - 44032: 0xB0E9, + 44233 - 44032: 0x81CD, + 44234 - 44032: 0x81CE, + 44235 - 44032: 0x81CF, + 44236 - 44032: 0xB0EA, + 44237 - 44032: 0x81D0, + 44238 - 44032: 0x81D1, + 44239 - 44032: 0x81D2, + 44240 - 44032: 0x81D3, + 44241 - 44032: 0x81D4, + 44242 - 44032: 0x81D5, + 44243 - 44032: 0x81D6, + 44244 - 44032: 0x81D7, + 44245 - 44032: 0xB0EB, + 44246 - 44032: 0x81D8, + 44247 - 44032: 0xB0EC, + 44248 - 44032: 0x81D9, + 44249 - 44032: 0x81DA, + 44250 - 44032: 0x81DB, + 44251 - 44032: 0x81DC, + 44252 - 44032: 0x81DD, + 44253 - 44032: 0x81DE, + 44254 - 44032: 0x81DF, + 44255 - 44032: 0x81E0, + 44256 - 44032: 0xB0ED, + 44257 - 44032: 0xB0EE, + 44258 - 44032: 0x81E1, + 44259 - 44032: 0x81E2, + 44260 - 44032: 0xB0EF, + 44261 - 44032: 0x81E3, + 44262 - 44032: 0x81E4, + 44263 - 44032: 0xB0F0, + 44264 - 44032: 0xB0F1, + 44265 - 44032: 0x81E5, + 44266 - 44032: 0xB0F2, + 44267 - 44032: 0x81E6, + 44268 - 44032: 0xB0F3, + 44269 - 44032: 0x81E7, + 44270 - 44032: 0x81E8, + 44271 - 44032: 0xB0F4, + 44272 - 44032: 0xB0F5, + 44273 - 44032: 0xB0F6, + 44274 - 44032: 0x81E9, + 44275 - 44032: 0xB0F7, + 44276 - 44032: 0x81EA, + 44277 - 44032: 0xB0F8, + 44278 - 44032: 0xB0F9, + 44279 - 44032: 0x81EB, + 44280 - 44032: 0x81EC, + 44281 - 44032: 0x81ED, + 44282 - 44032: 0x81EE, + 44283 - 44032: 0x81EF, + 44284 - 44032: 0xB0FA, + 44285 - 44032: 0xB0FB, + 44286 - 44032: 0x81F0, + 44287 - 44032: 0x81F1, + 44288 - 44032: 0xB0FC, + 44289 - 44032: 0x81F2, + 44290 - 44032: 0x81F3, + 44291 - 44032: 0x81F4, + 44292 - 44032: 0xB0FD, + 44293 - 44032: 0x81F5, + 44294 - 44032: 0xB0FE, + 44295 - 44032: 0x81F6, + 44296 - 44032: 0x81F7, + 44297 - 44032: 0x81F8, + 44298 - 44032: 0x81F9, + 44299 - 44032: 0x81FA, + 44300 - 44032: 0xB1A1, + 44301 - 44032: 0xB1A2, + 44302 - 44032: 0x81FB, + 44303 - 44032: 0xB1A3, + 44304 - 44032: 0x81FC, + 44305 - 44032: 0xB1A4, + 44306 - 44032: 0x81FD, + 44307 - 44032: 0x81FE, + 44308 - 44032: 0x8241, + 44309 - 44032: 0x8242, + 44310 - 44032: 0x8243, + 44311 - 44032: 0x8244, + 44312 - 44032: 0xB1A5, + 44313 - 44032: 0x8245, + 44314 - 44032: 0x8246, + 44315 - 44032: 0x8247, + 44316 - 44032: 0xB1A6, + 44317 - 44032: 0x8248, + 44318 - 44032: 0x8249, + 44319 - 44032: 0x824A, + 44320 - 44032: 0xB1A7, + 44321 - 44032: 0x824B, + 44322 - 44032: 0x824C, + 44323 - 44032: 0x824D, + 44324 - 44032: 0x824E, + 44325 - 44032: 0x824F, + 44326 - 44032: 0x8250, + 44327 - 44032: 0x8251, + 44328 - 44032: 0x8252, + 44329 - 44032: 0xB1A8, + 44330 - 44032: 0x8253, + 44331 - 44032: 0x8254, + 44332 - 44032: 0xB1A9, + 44333 - 44032: 0xB1AA, + 44334 - 44032: 0x8255, + 44335 - 44032: 0x8256, + 44336 - 44032: 0x8257, + 44337 - 44032: 0x8258, + 44338 - 44032: 0x8259, + 44339 - 44032: 0x825A, + 44340 - 44032: 0xB1AB, + 44341 - 44032: 0xB1AC, + 44342 - 44032: 0x8261, + 44343 - 44032: 0x8262, + 44344 - 44032: 0xB1AD, + 44345 - 44032: 0x8263, + 44346 - 44032: 0x8264, + 44347 - 44032: 0x8265, + 44348 - 44032: 0xB1AE, + 44349 - 44032: 0x8266, + 44350 - 44032: 0x8267, + 44351 - 44032: 0x8268, + 44352 - 44032: 0x8269, + 44353 - 44032: 0x826A, + 44354 - 44032: 0x826B, + 44355 - 44032: 0x826C, + 44356 - 44032: 0xB1AF, + 44357 - 44032: 0xB1B0, + 44358 - 44032: 0x826D, + 44359 - 44032: 0xB1B1, + 44360 - 44032: 0x826E, + 44361 - 44032: 0xB1B2, + 44362 - 44032: 0x826F, + 44363 - 44032: 0x8270, + 44364 - 44032: 0x8271, + 44365 - 44032: 0x8272, + 44366 - 44032: 0x8273, + 44367 - 44032: 0x8274, + 44368 - 44032: 0xB1B3, + 44369 - 44032: 0x8275, + 44370 - 44032: 0x8276, + 44371 - 44032: 0x8277, + 44372 - 44032: 0xB1B4, + 44373 - 44032: 0x8278, + 44374 - 44032: 0x8279, + 44375 - 44032: 0x827A, + 44376 - 44032: 0xB1B5, + 44377 - 44032: 0x8281, + 44378 - 44032: 0x8282, + 44379 - 44032: 0x8283, + 44380 - 44032: 0x8284, + 44381 - 44032: 0x8285, + 44382 - 44032: 0x8286, + 44383 - 44032: 0x8287, + 44384 - 44032: 0x8288, + 44385 - 44032: 0xB1B6, + 44386 - 44032: 0x8289, + 44387 - 44032: 0xB1B7, + 44388 - 44032: 0x828A, + 44389 - 44032: 0x828B, + 44390 - 44032: 0x828C, + 44391 - 44032: 0x828D, + 44392 - 44032: 0x828E, + 44393 - 44032: 0x828F, + 44394 - 44032: 0x8290, + 44395 - 44032: 0x8291, + 44396 - 44032: 0xB1B8, + 44397 - 44032: 0xB1B9, + 44398 - 44032: 0x8292, + 44399 - 44032: 0x8293, + 44400 - 44032: 0xB1BA, + 44401 - 44032: 0x8294, + 44402 - 44032: 0x8295, + 44403 - 44032: 0xB1BB, + 44404 - 44032: 0xB1BC, + 44405 - 44032: 0xB1BD, + 44406 - 44032: 0xB1BE, + 44407 - 44032: 0x8296, + 44408 - 44032: 0x8297, + 44409 - 44032: 0x8298, + 44410 - 44032: 0x8299, + 44411 - 44032: 0xB1BF, + 44412 - 44032: 0xB1C0, + 44413 - 44032: 0xB1C1, + 44414 - 44032: 0x829A, + 44415 - 44032: 0xB1C2, + 44416 - 44032: 0x829B, + 44417 - 44032: 0xB1C3, + 44418 - 44032: 0xB1C4, + 44419 - 44032: 0x829C, + 44420 - 44032: 0x829D, + 44421 - 44032: 0x829E, + 44422 - 44032: 0x829F, + 44423 - 44032: 0x82A0, + 44424 - 44032: 0xB1C5, + 44425 - 44032: 0xB1C6, + 44426 - 44032: 0x82A1, + 44427 - 44032: 0x82A2, + 44428 - 44032: 0xB1C7, + 44429 - 44032: 0x82A3, + 44430 - 44032: 0x82A4, + 44431 - 44032: 0x82A5, + 44432 - 44032: 0xB1C8, + 44433 - 44032: 0x82A6, + 44434 - 44032: 0x82A7, + 44435 - 44032: 0x82A8, + 44436 - 44032: 0x82A9, + 44437 - 44032: 0x82AA, + 44438 - 44032: 0x82AB, + 44439 - 44032: 0x82AC, + 44440 - 44032: 0x82AD, + 44441 - 44032: 0x82AE, + 44442 - 44032: 0x82AF, + 44443 - 44032: 0x82B0, + 44444 - 44032: 0xB1C9, + 44445 - 44032: 0xB1CA, + 44446 - 44032: 0x82B1, + 44447 - 44032: 0x82B2, + 44448 - 44032: 0x82B3, + 44449 - 44032: 0x82B4, + 44450 - 44032: 0x82B5, + 44451 - 44032: 0x82B6, + 44452 - 44032: 0xB1CB, + 44453 - 44032: 0x82B7, + 44454 - 44032: 0x82B8, + 44455 - 44032: 0x82B9, + 44456 - 44032: 0x82BA, + 44457 - 44032: 0x82BB, + 44458 - 44032: 0x82BC, + 44459 - 44032: 0x82BD, + 44460 - 44032: 0x82BE, + 44461 - 44032: 0x82BF, + 44462 - 44032: 0x82C0, + 44463 - 44032: 0x82C1, + 44464 - 44032: 0x82C2, + 44465 - 44032: 0x82C3, + 44466 - 44032: 0x82C4, + 44467 - 44032: 0x82C5, + 44468 - 44032: 0x82C6, + 44469 - 44032: 0x82C7, + 44470 - 44032: 0x82C8, + 44471 - 44032: 0xB1CC, + 44472 - 44032: 0x82C9, + 44473 - 44032: 0x82CA, + 44474 - 44032: 0x82CB, + 44475 - 44032: 0x82CC, + 44476 - 44032: 0x82CD, + 44477 - 44032: 0x82CE, + 44478 - 44032: 0x82CF, + 44479 - 44032: 0x82D0, + 44480 - 44032: 0xB1CD, + 44481 - 44032: 0xB1CE, + 44482 - 44032: 0x82D1, + 44483 - 44032: 0x82D2, + 44484 - 44032: 0xB1CF, + 44485 - 44032: 0x82D3, + 44486 - 44032: 0x82D4, + 44487 - 44032: 0x82D5, + 44488 - 44032: 0xB1D0, + 44489 - 44032: 0x82D6, + 44490 - 44032: 0x82D7, + 44491 - 44032: 0x82D8, + 44492 - 44032: 0x82D9, + 44493 - 44032: 0x82DA, + 44494 - 44032: 0x82DB, + 44495 - 44032: 0x82DC, + 44496 - 44032: 0xB1D1, + 44497 - 44032: 0xB1D2, + 44498 - 44032: 0x82DD, + 44499 - 44032: 0xB1D3, + 44500 - 44032: 0x82DE, + 44501 - 44032: 0x82DF, + 44502 - 44032: 0x82E0, + 44503 - 44032: 0x82E1, + 44504 - 44032: 0x82E2, + 44505 - 44032: 0x82E3, + 44506 - 44032: 0x82E4, + 44507 - 44032: 0x82E5, + 44508 - 44032: 0xB1D4, + 44509 - 44032: 0x82E6, + 44510 - 44032: 0x82E7, + 44511 - 44032: 0x82E8, + 44512 - 44032: 0xB1D5, + 44513 - 44032: 0x82E9, + 44514 - 44032: 0x82EA, + 44515 - 44032: 0x82EB, + 44516 - 44032: 0xB1D6, + 44517 - 44032: 0x82EC, + 44518 - 44032: 0x82ED, + 44519 - 44032: 0x82EE, + 44520 - 44032: 0x82EF, + 44521 - 44032: 0x82F0, + 44522 - 44032: 0x82F1, + 44523 - 44032: 0x82F2, + 44524 - 44032: 0x82F3, + 44525 - 44032: 0x82F4, + 44526 - 44032: 0x82F5, + 44527 - 44032: 0x82F6, + 44528 - 44032: 0x82F7, + 44529 - 44032: 0x82F8, + 44530 - 44032: 0x82F9, + 44531 - 44032: 0x82FA, + 44532 - 44032: 0x82FB, + 44533 - 44032: 0x82FC, + 44534 - 44032: 0x82FD, + 44535 - 44032: 0x82FE, + 44536 - 44032: 0xB1D7, + 44537 - 44032: 0xB1D8, + 44538 - 44032: 0x8341, + 44539 - 44032: 0x8342, + 44540 - 44032: 0xB1D9, + 44541 - 44032: 0x8343, + 44542 - 44032: 0x8344, + 44543 - 44032: 0xB1DA, + 44544 - 44032: 0xB1DB, + 44545 - 44032: 0xB1DC, + 44546 - 44032: 0x8345, + 44547 - 44032: 0x8346, + 44548 - 44032: 0x8347, + 44549 - 44032: 0x8348, + 44550 - 44032: 0x8349, + 44551 - 44032: 0x834A, + 44552 - 44032: 0xB1DD, + 44553 - 44032: 0xB1DE, + 44554 - 44032: 0x834B, + 44555 - 44032: 0xB1DF, + 44556 - 44032: 0x834C, + 44557 - 44032: 0xB1E0, + 44558 - 44032: 0x834D, + 44559 - 44032: 0x834E, + 44560 - 44032: 0x834F, + 44561 - 44032: 0x8350, + 44562 - 44032: 0x8351, + 44563 - 44032: 0x8352, + 44564 - 44032: 0xB1E1, + 44565 - 44032: 0x8353, + 44566 - 44032: 0x8354, + 44567 - 44032: 0x8355, + 44568 - 44032: 0x8356, + 44569 - 44032: 0x8357, + 44570 - 44032: 0x8358, + 44571 - 44032: 0x8359, + 44572 - 44032: 0x835A, + 44573 - 44032: 0x8361, + 44574 - 44032: 0x8362, + 44575 - 44032: 0x8363, + 44576 - 44032: 0x8364, + 44577 - 44032: 0x8365, + 44578 - 44032: 0x8366, + 44579 - 44032: 0x8367, + 44580 - 44032: 0x8368, + 44581 - 44032: 0x8369, + 44582 - 44032: 0x836A, + 44583 - 44032: 0x836B, + 44584 - 44032: 0x836C, + 44585 - 44032: 0x836D, + 44586 - 44032: 0x836E, + 44587 - 44032: 0x836F, + 44588 - 44032: 0x8370, + 44589 - 44032: 0x8371, + 44590 - 44032: 0x8372, + 44591 - 44032: 0x8373, + 44592 - 44032: 0xB1E2, + 44593 - 44032: 0xB1E3, + 44594 - 44032: 0x8374, + 44595 - 44032: 0x8375, + 44596 - 44032: 0xB1E4, + 44597 - 44032: 0x8376, + 44598 - 44032: 0x8377, + 44599 - 44032: 0xB1E5, + 44600 - 44032: 0xB1E6, + 44601 - 44032: 0x8378, + 44602 - 44032: 0xB1E7, + 44603 - 44032: 0x8379, + 44604 - 44032: 0x837A, + 44605 - 44032: 0x8381, + 44606 - 44032: 0x8382, + 44607 - 44032: 0x8383, + 44608 - 44032: 0xB1E8, + 44609 - 44032: 0xB1E9, + 44610 - 44032: 0x8384, + 44611 - 44032: 0xB1EA, + 44612 - 44032: 0x8385, + 44613 - 44032: 0xB1EB, + 44614 - 44032: 0xB1EC, + 44615 - 44032: 0x8386, + 44616 - 44032: 0x8387, + 44617 - 44032: 0x8388, + 44618 - 44032: 0xB1ED, + 44619 - 44032: 0x8389, + 44620 - 44032: 0xB1EE, + 44621 - 44032: 0xB1EF, + 44622 - 44032: 0xB1F0, + 44623 - 44032: 0x838A, + 44624 - 44032: 0xB1F1, + 44625 - 44032: 0x838B, + 44626 - 44032: 0x838C, + 44627 - 44032: 0x838D, + 44628 - 44032: 0xB1F2, + 44629 - 44032: 0x838E, + 44630 - 44032: 0xB1F3, + 44631 - 44032: 0x838F, + 44632 - 44032: 0x8390, + 44633 - 44032: 0x8391, + 44634 - 44032: 0x8392, + 44635 - 44032: 0x8393, + 44636 - 44032: 0xB1F4, + 44637 - 44032: 0xB1F5, + 44638 - 44032: 0x8394, + 44639 - 44032: 0xB1F6, + 44640 - 44032: 0xB1F7, + 44641 - 44032: 0xB1F8, + 44642 - 44032: 0x8395, + 44643 - 44032: 0x8396, + 44644 - 44032: 0x8397, + 44645 - 44032: 0xB1F9, + 44646 - 44032: 0x8398, + 44647 - 44032: 0x8399, + 44648 - 44032: 0xB1FA, + 44649 - 44032: 0xB1FB, + 44650 - 44032: 0x839A, + 44651 - 44032: 0x839B, + 44652 - 44032: 0xB1FC, + 44653 - 44032: 0x839C, + 44654 - 44032: 0x839D, + 44655 - 44032: 0x839E, + 44656 - 44032: 0xB1FD, + 44657 - 44032: 0x839F, + 44658 - 44032: 0x83A0, + 44659 - 44032: 0x83A1, + 44660 - 44032: 0x83A2, + 44661 - 44032: 0x83A3, + 44662 - 44032: 0x83A4, + 44663 - 44032: 0x83A5, + 44664 - 44032: 0xB1FE, + 44665 - 44032: 0xB2A1, + 44666 - 44032: 0x83A6, + 44667 - 44032: 0xB2A2, + 44668 - 44032: 0xB2A3, + 44669 - 44032: 0xB2A4, + 44670 - 44032: 0x83A7, + 44671 - 44032: 0x83A8, + 44672 - 44032: 0x83A9, + 44673 - 44032: 0x83AA, + 44674 - 44032: 0x83AB, + 44675 - 44032: 0x83AC, + 44676 - 44032: 0xB2A5, + 44677 - 44032: 0xB2A6, + 44678 - 44032: 0x83AD, + 44679 - 44032: 0x83AE, + 44680 - 44032: 0x83AF, + 44681 - 44032: 0x83B0, + 44682 - 44032: 0x83B1, + 44683 - 44032: 0x83B2, + 44684 - 44032: 0xB2A7, + 44685 - 44032: 0x83B3, + 44686 - 44032: 0x83B4, + 44687 - 44032: 0x83B5, + 44688 - 44032: 0x83B6, + 44689 - 44032: 0x83B7, + 44690 - 44032: 0x83B8, + 44691 - 44032: 0x83B9, + 44692 - 44032: 0x83BA, + 44693 - 44032: 0x83BB, + 44694 - 44032: 0x83BC, + 44695 - 44032: 0x83BD, + 44696 - 44032: 0x83BE, + 44697 - 44032: 0x83BF, + 44698 - 44032: 0x83C0, + 44699 - 44032: 0x83C1, + 44700 - 44032: 0x83C2, + 44701 - 44032: 0x83C3, + 44702 - 44032: 0x83C4, + 44703 - 44032: 0x83C5, + 44704 - 44032: 0x83C6, + 44705 - 44032: 0x83C7, + 44706 - 44032: 0x83C8, + 44707 - 44032: 0x83C9, + 44708 - 44032: 0x83CA, + 44709 - 44032: 0x83CB, + 44710 - 44032: 0x83CC, + 44711 - 44032: 0x83CD, + 44712 - 44032: 0x83CE, + 44713 - 44032: 0x83CF, + 44714 - 44032: 0x83D0, + 44715 - 44032: 0x83D1, + 44716 - 44032: 0x83D2, + 44717 - 44032: 0x83D3, + 44718 - 44032: 0x83D4, + 44719 - 44032: 0x83D5, + 44720 - 44032: 0x83D6, + 44721 - 44032: 0x83D7, + 44722 - 44032: 0x83D8, + 44723 - 44032: 0x83D9, + 44724 - 44032: 0x83DA, + 44725 - 44032: 0x83DB, + 44726 - 44032: 0x83DC, + 44727 - 44032: 0x83DD, + 44728 - 44032: 0x83DE, + 44729 - 44032: 0x83DF, + 44730 - 44032: 0x83E0, + 44731 - 44032: 0x83E1, + 44732 - 44032: 0xB2A8, + 44733 - 44032: 0xB2A9, + 44734 - 44032: 0xB2AA, + 44735 - 44032: 0x83E2, + 44736 - 44032: 0xB2AB, + 44737 - 44032: 0x83E3, + 44738 - 44032: 0x83E4, + 44739 - 44032: 0x83E5, + 44740 - 44032: 0xB2AC, + 44741 - 44032: 0x83E6, + 44742 - 44032: 0x83E7, + 44743 - 44032: 0x83E8, + 44744 - 44032: 0x83E9, + 44745 - 44032: 0x83EA, + 44746 - 44032: 0x83EB, + 44747 - 44032: 0x83EC, + 44748 - 44032: 0xB2AD, + 44749 - 44032: 0xB2AE, + 44750 - 44032: 0x83ED, + 44751 - 44032: 0xB2AF, + 44752 - 44032: 0xB2B0, + 44753 - 44032: 0xB2B1, + 44754 - 44032: 0x83EE, + 44755 - 44032: 0x83EF, + 44756 - 44032: 0x83F0, + 44757 - 44032: 0x83F1, + 44758 - 44032: 0x83F2, + 44759 - 44032: 0x83F3, + 44760 - 44032: 0xB2B2, + 44761 - 44032: 0xB2B3, + 44762 - 44032: 0x83F4, + 44763 - 44032: 0x83F5, + 44764 - 44032: 0xB2B4, + 44765 - 44032: 0x83F6, + 44766 - 44032: 0x83F7, + 44767 - 44032: 0x83F8, + 44768 - 44032: 0x83F9, + 44769 - 44032: 0x83FA, + 44770 - 44032: 0x83FB, + 44771 - 44032: 0x83FC, + 44772 - 44032: 0x83FD, + 44773 - 44032: 0x83FE, + 44774 - 44032: 0x8441, + 44775 - 44032: 0x8442, + 44776 - 44032: 0xB2B5, + 44777 - 44032: 0x8443, + 44778 - 44032: 0x8444, + 44779 - 44032: 0xB2B6, + 44780 - 44032: 0x8445, + 44781 - 44032: 0xB2B7, + 44782 - 44032: 0x8446, + 44783 - 44032: 0x8447, + 44784 - 44032: 0x8448, + 44785 - 44032: 0x8449, + 44786 - 44032: 0x844A, + 44787 - 44032: 0x844B, + 44788 - 44032: 0xB2B8, + 44789 - 44032: 0x844C, + 44790 - 44032: 0x844D, + 44791 - 44032: 0x844E, + 44792 - 44032: 0xB2B9, + 44793 - 44032: 0x844F, + 44794 - 44032: 0x8450, + 44795 - 44032: 0x8451, + 44796 - 44032: 0xB2BA, + 44797 - 44032: 0x8452, + 44798 - 44032: 0x8453, + 44799 - 44032: 0x8454, + 44800 - 44032: 0x8455, + 44801 - 44032: 0x8456, + 44802 - 44032: 0x8457, + 44803 - 44032: 0x8458, + 44804 - 44032: 0x8459, + 44805 - 44032: 0x845A, + 44806 - 44032: 0x8461, + 44807 - 44032: 0xB2BB, + 44808 - 44032: 0xB2BC, + 44809 - 44032: 0x8462, + 44810 - 44032: 0x8463, + 44811 - 44032: 0x8464, + 44812 - 44032: 0x8465, + 44813 - 44032: 0xB2BD, + 44814 - 44032: 0x8466, + 44815 - 44032: 0x8467, + 44816 - 44032: 0xB2BE, + 44817 - 44032: 0x8468, + 44818 - 44032: 0x8469, + 44819 - 44032: 0x846A, + 44820 - 44032: 0x846B, + 44821 - 44032: 0x846C, + 44822 - 44032: 0x846D, + 44823 - 44032: 0x846E, + 44824 - 44032: 0x846F, + 44825 - 44032: 0x8470, + 44826 - 44032: 0x8471, + 44827 - 44032: 0x8472, + 44828 - 44032: 0x8473, + 44829 - 44032: 0x8474, + 44830 - 44032: 0x8475, + 44831 - 44032: 0x8476, + 44832 - 44032: 0x8477, + 44833 - 44032: 0x8478, + 44834 - 44032: 0x8479, + 44835 - 44032: 0x847A, + 44836 - 44032: 0x8481, + 44837 - 44032: 0x8482, + 44838 - 44032: 0x8483, + 44839 - 44032: 0x8484, + 44840 - 44032: 0x8485, + 44841 - 44032: 0x8486, + 44842 - 44032: 0x8487, + 44843 - 44032: 0x8488, + 44844 - 44032: 0xB2BF, + 44845 - 44032: 0xB2C0, + 44846 - 44032: 0x8489, + 44847 - 44032: 0x848A, + 44848 - 44032: 0xB2C1, + 44849 - 44032: 0x848B, + 44850 - 44032: 0xB2C2, + 44851 - 44032: 0x848C, + 44852 - 44032: 0xB2C3, + 44853 - 44032: 0x848D, + 44854 - 44032: 0x848E, + 44855 - 44032: 0x848F, + 44856 - 44032: 0x8490, + 44857 - 44032: 0x8491, + 44858 - 44032: 0x8492, + 44859 - 44032: 0x8493, + 44860 - 44032: 0xB2C4, + 44861 - 44032: 0xB2C5, + 44862 - 44032: 0x8494, + 44863 - 44032: 0xB2C6, + 44864 - 44032: 0x8495, + 44865 - 44032: 0xB2C7, + 44866 - 44032: 0xB2C8, + 44867 - 44032: 0xB2C9, + 44868 - 44032: 0x8496, + 44869 - 44032: 0x8497, + 44870 - 44032: 0x8498, + 44871 - 44032: 0x8499, + 44872 - 44032: 0xB2CA, + 44873 - 44032: 0xB2CB, + 44874 - 44032: 0x849A, + 44875 - 44032: 0x849B, + 44876 - 44032: 0x849C, + 44877 - 44032: 0x849D, + 44878 - 44032: 0x849E, + 44879 - 44032: 0x849F, + 44880 - 44032: 0xB2CC, + 44881 - 44032: 0x84A0, + 44882 - 44032: 0x84A1, + 44883 - 44032: 0x84A2, + 44884 - 44032: 0x84A3, + 44885 - 44032: 0x84A4, + 44886 - 44032: 0x84A5, + 44887 - 44032: 0x84A6, + 44888 - 44032: 0x84A7, + 44889 - 44032: 0x84A8, + 44890 - 44032: 0x84A9, + 44891 - 44032: 0x84AA, + 44892 - 44032: 0xB2CD, + 44893 - 44032: 0xB2CE, + 44894 - 44032: 0x84AB, + 44895 - 44032: 0x84AC, + 44896 - 44032: 0x84AD, + 44897 - 44032: 0x84AE, + 44898 - 44032: 0x84AF, + 44899 - 44032: 0x84B0, + 44900 - 44032: 0xB2CF, + 44901 - 44032: 0xB2D0, + 44902 - 44032: 0x84B1, + 44903 - 44032: 0x84B2, + 44904 - 44032: 0x84B3, + 44905 - 44032: 0x84B4, + 44906 - 44032: 0x84B5, + 44907 - 44032: 0x84B6, + 44908 - 44032: 0x84B7, + 44909 - 44032: 0x84B8, + 44910 - 44032: 0x84B9, + 44911 - 44032: 0x84BA, + 44912 - 44032: 0x84BB, + 44913 - 44032: 0x84BC, + 44914 - 44032: 0x84BD, + 44915 - 44032: 0x84BE, + 44916 - 44032: 0x84BF, + 44917 - 44032: 0x84C0, + 44918 - 44032: 0x84C1, + 44919 - 44032: 0x84C2, + 44920 - 44032: 0x84C3, + 44921 - 44032: 0xB2D1, + 44922 - 44032: 0x84C4, + 44923 - 44032: 0x84C5, + 44924 - 44032: 0x84C6, + 44925 - 44032: 0x84C7, + 44926 - 44032: 0x84C8, + 44927 - 44032: 0x84C9, + 44928 - 44032: 0xB2D2, + 44929 - 44032: 0x84CA, + 44930 - 44032: 0x84CB, + 44931 - 44032: 0x84CC, + 44932 - 44032: 0xB2D3, + 44933 - 44032: 0x84CD, + 44934 - 44032: 0x84CE, + 44935 - 44032: 0x84CF, + 44936 - 44032: 0xB2D4, + 44937 - 44032: 0x84D0, + 44938 - 44032: 0x84D1, + 44939 - 44032: 0x84D2, + 44940 - 44032: 0x84D3, + 44941 - 44032: 0x84D4, + 44942 - 44032: 0x84D5, + 44943 - 44032: 0x84D6, + 44944 - 44032: 0xB2D5, + 44945 - 44032: 0xB2D6, + 44946 - 44032: 0x84D7, + 44947 - 44032: 0x84D8, + 44948 - 44032: 0x84D9, + 44949 - 44032: 0xB2D7, + 44950 - 44032: 0x84DA, + 44951 - 44032: 0x84DB, + 44952 - 44032: 0x84DC, + 44953 - 44032: 0x84DD, + 44954 - 44032: 0x84DE, + 44955 - 44032: 0x84DF, + 44956 - 44032: 0xB2D8, + 44957 - 44032: 0x84E0, + 44958 - 44032: 0x84E1, + 44959 - 44032: 0x84E2, + 44960 - 44032: 0x84E3, + 44961 - 44032: 0x84E4, + 44962 - 44032: 0x84E5, + 44963 - 44032: 0x84E6, + 44964 - 44032: 0x84E7, + 44965 - 44032: 0x84E8, + 44966 - 44032: 0x84E9, + 44967 - 44032: 0x84EA, + 44968 - 44032: 0x84EB, + 44969 - 44032: 0x84EC, + 44970 - 44032: 0x84ED, + 44971 - 44032: 0x84EE, + 44972 - 44032: 0x84EF, + 44973 - 44032: 0x84F0, + 44974 - 44032: 0x84F1, + 44975 - 44032: 0x84F2, + 44976 - 44032: 0x84F3, + 44977 - 44032: 0x84F4, + 44978 - 44032: 0x84F5, + 44979 - 44032: 0x84F6, + 44980 - 44032: 0x84F7, + 44981 - 44032: 0x84F8, + 44982 - 44032: 0x84F9, + 44983 - 44032: 0x84FA, + 44984 - 44032: 0xB2D9, + 44985 - 44032: 0xB2DA, + 44986 - 44032: 0x84FB, + 44987 - 44032: 0x84FC, + 44988 - 44032: 0xB2DB, + 44989 - 44032: 0x84FD, + 44990 - 44032: 0x84FE, + 44991 - 44032: 0x8541, + 44992 - 44032: 0xB2DC, + 44993 - 44032: 0x8542, + 44994 - 44032: 0x8543, + 44995 - 44032: 0x8544, + 44996 - 44032: 0x8545, + 44997 - 44032: 0x8546, + 44998 - 44032: 0x8547, + 44999 - 44032: 0xB2DD, + 45000 - 44032: 0xB2DE, + 45001 - 44032: 0xB2DF, + 45002 - 44032: 0x8548, + 45003 - 44032: 0xB2E0, + 45004 - 44032: 0x8549, + 45005 - 44032: 0xB2E1, + 45006 - 44032: 0xB2E2, + 45007 - 44032: 0x854A, + 45008 - 44032: 0x854B, + 45009 - 44032: 0x854C, + 45010 - 44032: 0x854D, + 45011 - 44032: 0x854E, + 45012 - 44032: 0xB2E3, + 45013 - 44032: 0x854F, + 45014 - 44032: 0x8550, + 45015 - 44032: 0x8551, + 45016 - 44032: 0x8552, + 45017 - 44032: 0x8553, + 45018 - 44032: 0x8554, + 45019 - 44032: 0x8555, + 45020 - 44032: 0xB2E4, + 45021 - 44032: 0x8556, + 45022 - 44032: 0x8557, + 45023 - 44032: 0x8558, + 45024 - 44032: 0x8559, + 45025 - 44032: 0x855A, + 45026 - 44032: 0x8561, + 45027 - 44032: 0x8562, + 45028 - 44032: 0x8563, + 45029 - 44032: 0x8564, + 45030 - 44032: 0x8565, + 45031 - 44032: 0x8566, + 45032 - 44032: 0xB2E5, + 45033 - 44032: 0xB2E6, + 45034 - 44032: 0x8567, + 45035 - 44032: 0x8568, + 45036 - 44032: 0x8569, + 45037 - 44032: 0x856A, + 45038 - 44032: 0x856B, + 45039 - 44032: 0x856C, + 45040 - 44032: 0xB2E7, + 45041 - 44032: 0xB2E8, + 45042 - 44032: 0x856D, + 45043 - 44032: 0x856E, + 45044 - 44032: 0xB2E9, + 45045 - 44032: 0x856F, + 45046 - 44032: 0x8570, + 45047 - 44032: 0x8571, + 45048 - 44032: 0xB2EA, + 45049 - 44032: 0x8572, + 45050 - 44032: 0x8573, + 45051 - 44032: 0x8574, + 45052 - 44032: 0x8575, + 45053 - 44032: 0x8576, + 45054 - 44032: 0x8577, + 45055 - 44032: 0x8578, + 45056 - 44032: 0xB2EB, + 45057 - 44032: 0xB2EC, + 45058 - 44032: 0x8579, + 45059 - 44032: 0x857A, + 45060 - 44032: 0xB2ED, + 45061 - 44032: 0x8581, + 45062 - 44032: 0x8582, + 45063 - 44032: 0x8583, + 45064 - 44032: 0x8584, + 45065 - 44032: 0x8585, + 45066 - 44032: 0x8586, + 45067 - 44032: 0x8587, + 45068 - 44032: 0xB2EE, + 45069 - 44032: 0x8588, + 45070 - 44032: 0x8589, + 45071 - 44032: 0x858A, + 45072 - 44032: 0xB2EF, + 45073 - 44032: 0x858B, + 45074 - 44032: 0x858C, + 45075 - 44032: 0x858D, + 45076 - 44032: 0xB2F0, + 45077 - 44032: 0x858E, + 45078 - 44032: 0x858F, + 45079 - 44032: 0x8590, + 45080 - 44032: 0x8591, + 45081 - 44032: 0x8592, + 45082 - 44032: 0x8593, + 45083 - 44032: 0x8594, + 45084 - 44032: 0xB2F1, + 45085 - 44032: 0xB2F2, + 45086 - 44032: 0x8595, + 45087 - 44032: 0x8596, + 45088 - 44032: 0x8597, + 45089 - 44032: 0x8598, + 45090 - 44032: 0x8599, + 45091 - 44032: 0x859A, + 45092 - 44032: 0x859B, + 45093 - 44032: 0x859C, + 45094 - 44032: 0x859D, + 45095 - 44032: 0x859E, + 45096 - 44032: 0xB2F3, + 45097 - 44032: 0x859F, + 45098 - 44032: 0x85A0, + 45099 - 44032: 0x85A1, + 45100 - 44032: 0x85A2, + 45101 - 44032: 0x85A3, + 45102 - 44032: 0x85A4, + 45103 - 44032: 0x85A5, + 45104 - 44032: 0x85A6, + 45105 - 44032: 0x85A7, + 45106 - 44032: 0x85A8, + 45107 - 44032: 0x85A9, + 45108 - 44032: 0x85AA, + 45109 - 44032: 0x85AB, + 45110 - 44032: 0x85AC, + 45111 - 44032: 0x85AD, + 45112 - 44032: 0x85AE, + 45113 - 44032: 0x85AF, + 45114 - 44032: 0x85B0, + 45115 - 44032: 0x85B1, + 45116 - 44032: 0x85B2, + 45117 - 44032: 0x85B3, + 45118 - 44032: 0x85B4, + 45119 - 44032: 0x85B5, + 45120 - 44032: 0x85B6, + 45121 - 44032: 0x85B7, + 45122 - 44032: 0x85B8, + 45123 - 44032: 0x85B9, + 45124 - 44032: 0xB2F4, + 45125 - 44032: 0xB2F5, + 45126 - 44032: 0x85BA, + 45127 - 44032: 0x85BB, + 45128 - 44032: 0xB2F6, + 45129 - 44032: 0x85BC, + 45130 - 44032: 0xB2F7, + 45131 - 44032: 0x85BD, + 45132 - 44032: 0xB2F8, + 45133 - 44032: 0x85BE, + 45134 - 44032: 0xB2F9, + 45135 - 44032: 0x85BF, + 45136 - 44032: 0x85C0, + 45137 - 44032: 0x85C1, + 45138 - 44032: 0x85C2, + 45139 - 44032: 0xB2FA, + 45140 - 44032: 0xB2FB, + 45141 - 44032: 0xB2FC, + 45142 - 44032: 0x85C3, + 45143 - 44032: 0xB2FD, + 45144 - 44032: 0x85C4, + 45145 - 44032: 0xB2FE, + 45146 - 44032: 0x85C5, + 45147 - 44032: 0x85C6, + 45148 - 44032: 0x85C7, + 45149 - 44032: 0xB3A1, + 45150 - 44032: 0x85C8, + 45151 - 44032: 0x85C9, + 45152 - 44032: 0x85CA, + 45153 - 44032: 0x85CB, + 45154 - 44032: 0x85CC, + 45155 - 44032: 0x85CD, + 45156 - 44032: 0x85CE, + 45157 - 44032: 0x85CF, + 45158 - 44032: 0x85D0, + 45159 - 44032: 0x85D1, + 45160 - 44032: 0x85D2, + 45161 - 44032: 0x85D3, + 45162 - 44032: 0x85D4, + 45163 - 44032: 0x85D5, + 45164 - 44032: 0x85D6, + 45165 - 44032: 0x85D7, + 45166 - 44032: 0x85D8, + 45167 - 44032: 0x85D9, + 45168 - 44032: 0x85DA, + 45169 - 44032: 0x85DB, + 45170 - 44032: 0x85DC, + 45171 - 44032: 0x85DD, + 45172 - 44032: 0x85DE, + 45173 - 44032: 0x85DF, + 45174 - 44032: 0x85E0, + 45175 - 44032: 0x85E1, + 45176 - 44032: 0x85E2, + 45177 - 44032: 0x85E3, + 45178 - 44032: 0x85E4, + 45179 - 44032: 0x85E5, + 45180 - 44032: 0xB3A2, + 45181 - 44032: 0xB3A3, + 45182 - 44032: 0x85E6, + 45183 - 44032: 0x85E7, + 45184 - 44032: 0xB3A4, + 45185 - 44032: 0x85E8, + 45186 - 44032: 0x85E9, + 45187 - 44032: 0x85EA, + 45188 - 44032: 0xB3A5, + 45189 - 44032: 0x85EB, + 45190 - 44032: 0x85EC, + 45191 - 44032: 0x85ED, + 45192 - 44032: 0x85EE, + 45193 - 44032: 0x85EF, + 45194 - 44032: 0x85F0, + 45195 - 44032: 0x85F1, + 45196 - 44032: 0xB3A6, + 45197 - 44032: 0xB3A7, + 45198 - 44032: 0x85F2, + 45199 - 44032: 0xB3A8, + 45200 - 44032: 0x85F3, + 45201 - 44032: 0xB3A9, + 45202 - 44032: 0x85F4, + 45203 - 44032: 0x85F5, + 45204 - 44032: 0x85F6, + 45205 - 44032: 0x85F7, + 45206 - 44032: 0x85F8, + 45207 - 44032: 0x85F9, + 45208 - 44032: 0xB3AA, + 45209 - 44032: 0xB3AB, + 45210 - 44032: 0xB3AC, + 45211 - 44032: 0x85FA, + 45212 - 44032: 0xB3AD, + 45213 - 44032: 0x85FB, + 45214 - 44032: 0x85FC, + 45215 - 44032: 0xB3AE, + 45216 - 44032: 0xB3AF, + 45217 - 44032: 0xB3B0, + 45218 - 44032: 0xB3B1, + 45219 - 44032: 0x85FD, + 45220 - 44032: 0x85FE, + 45221 - 44032: 0x8641, + 45222 - 44032: 0x8642, + 45223 - 44032: 0x8643, + 45224 - 44032: 0xB3B2, + 45225 - 44032: 0xB3B3, + 45226 - 44032: 0x8644, + 45227 - 44032: 0xB3B4, + 45228 - 44032: 0xB3B5, + 45229 - 44032: 0xB3B6, + 45230 - 44032: 0xB3B7, + 45231 - 44032: 0xB3B8, + 45232 - 44032: 0x8645, + 45233 - 44032: 0xB3B9, + 45234 - 44032: 0x8646, + 45235 - 44032: 0xB3BA, + 45236 - 44032: 0xB3BB, + 45237 - 44032: 0xB3BC, + 45238 - 44032: 0x8647, + 45239 - 44032: 0x8648, + 45240 - 44032: 0xB3BD, + 45241 - 44032: 0x8649, + 45242 - 44032: 0x864A, + 45243 - 44032: 0x864B, + 45244 - 44032: 0xB3BE, + 45245 - 44032: 0x864C, + 45246 - 44032: 0x864D, + 45247 - 44032: 0x864E, + 45248 - 44032: 0x864F, + 45249 - 44032: 0x8650, + 45250 - 44032: 0x8651, + 45251 - 44032: 0x8652, + 45252 - 44032: 0xB3BF, + 45253 - 44032: 0xB3C0, + 45254 - 44032: 0x8653, + 45255 - 44032: 0xB3C1, + 45256 - 44032: 0xB3C2, + 45257 - 44032: 0xB3C3, + 45258 - 44032: 0x8654, + 45259 - 44032: 0x8655, + 45260 - 44032: 0x8656, + 45261 - 44032: 0x8657, + 45262 - 44032: 0x8658, + 45263 - 44032: 0x8659, + 45264 - 44032: 0xB3C4, + 45265 - 44032: 0xB3C5, + 45266 - 44032: 0x865A, + 45267 - 44032: 0x8661, + 45268 - 44032: 0xB3C6, + 45269 - 44032: 0x8662, + 45270 - 44032: 0x8663, + 45271 - 44032: 0x8664, + 45272 - 44032: 0xB3C7, + 45273 - 44032: 0x8665, + 45274 - 44032: 0x8666, + 45275 - 44032: 0x8667, + 45276 - 44032: 0x8668, + 45277 - 44032: 0x8669, + 45278 - 44032: 0x866A, + 45279 - 44032: 0x866B, + 45280 - 44032: 0xB3C8, + 45281 - 44032: 0x866C, + 45282 - 44032: 0x866D, + 45283 - 44032: 0x866E, + 45284 - 44032: 0x866F, + 45285 - 44032: 0xB3C9, + 45286 - 44032: 0x8670, + 45287 - 44032: 0x8671, + 45288 - 44032: 0x8672, + 45289 - 44032: 0x8673, + 45290 - 44032: 0x8674, + 45291 - 44032: 0x8675, + 45292 - 44032: 0x8676, + 45293 - 44032: 0x8677, + 45294 - 44032: 0x8678, + 45295 - 44032: 0x8679, + 45296 - 44032: 0x867A, + 45297 - 44032: 0x8681, + 45298 - 44032: 0x8682, + 45299 - 44032: 0x8683, + 45300 - 44032: 0x8684, + 45301 - 44032: 0x8685, + 45302 - 44032: 0x8686, + 45303 - 44032: 0x8687, + 45304 - 44032: 0x8688, + 45305 - 44032: 0x8689, + 45306 - 44032: 0x868A, + 45307 - 44032: 0x868B, + 45308 - 44032: 0x868C, + 45309 - 44032: 0x868D, + 45310 - 44032: 0x868E, + 45311 - 44032: 0x868F, + 45312 - 44032: 0x8690, + 45313 - 44032: 0x8691, + 45314 - 44032: 0x8692, + 45315 - 44032: 0x8693, + 45316 - 44032: 0x8694, + 45317 - 44032: 0x8695, + 45318 - 44032: 0x8696, + 45319 - 44032: 0x8697, + 45320 - 44032: 0xB3CA, + 45321 - 44032: 0xB3CB, + 45322 - 44032: 0x8698, + 45323 - 44032: 0xB3CC, + 45324 - 44032: 0xB3CD, + 45325 - 44032: 0x8699, + 45326 - 44032: 0x869A, + 45327 - 44032: 0x869B, + 45328 - 44032: 0xB3CE, + 45329 - 44032: 0x869C, + 45330 - 44032: 0xB3CF, + 45331 - 44032: 0xB3D0, + 45332 - 44032: 0x869D, + 45333 - 44032: 0x869E, + 45334 - 44032: 0x869F, + 45335 - 44032: 0x86A0, + 45336 - 44032: 0xB3D1, + 45337 - 44032: 0xB3D2, + 45338 - 44032: 0x86A1, + 45339 - 44032: 0xB3D3, + 45340 - 44032: 0xB3D4, + 45341 - 44032: 0xB3D5, + 45342 - 44032: 0x86A2, + 45343 - 44032: 0x86A3, + 45344 - 44032: 0x86A4, + 45345 - 44032: 0x86A5, + 45346 - 44032: 0x86A6, + 45347 - 44032: 0xB3D6, + 45348 - 44032: 0xB3D7, + 45349 - 44032: 0xB3D8, + 45350 - 44032: 0x86A7, + 45351 - 44032: 0x86A8, + 45352 - 44032: 0xB3D9, + 45353 - 44032: 0x86A9, + 45354 - 44032: 0x86AA, + 45355 - 44032: 0x86AB, + 45356 - 44032: 0xB3DA, + 45357 - 44032: 0x86AC, + 45358 - 44032: 0x86AD, + 45359 - 44032: 0x86AE, + 45360 - 44032: 0x86AF, + 45361 - 44032: 0x86B0, + 45362 - 44032: 0x86B1, + 45363 - 44032: 0x86B2, + 45364 - 44032: 0xB3DB, + 45365 - 44032: 0xB3DC, + 45366 - 44032: 0x86B3, + 45367 - 44032: 0xB3DD, + 45368 - 44032: 0xB3DE, + 45369 - 44032: 0xB3DF, + 45370 - 44032: 0x86B4, + 45371 - 44032: 0x86B5, + 45372 - 44032: 0x86B6, + 45373 - 44032: 0x86B7, + 45374 - 44032: 0x86B8, + 45375 - 44032: 0x86B9, + 45376 - 44032: 0xB3E0, + 45377 - 44032: 0xB3E1, + 45378 - 44032: 0x86BA, + 45379 - 44032: 0x86BB, + 45380 - 44032: 0xB3E2, + 45381 - 44032: 0x86BC, + 45382 - 44032: 0x86BD, + 45383 - 44032: 0x86BE, + 45384 - 44032: 0xB3E3, + 45385 - 44032: 0x86BF, + 45386 - 44032: 0x86C0, + 45387 - 44032: 0x86C1, + 45388 - 44032: 0x86C2, + 45389 - 44032: 0x86C3, + 45390 - 44032: 0x86C4, + 45391 - 44032: 0x86C5, + 45392 - 44032: 0xB3E4, + 45393 - 44032: 0xB3E5, + 45394 - 44032: 0x86C6, + 45395 - 44032: 0x86C7, + 45396 - 44032: 0xB3E6, + 45397 - 44032: 0xB3E7, + 45398 - 44032: 0x86C8, + 45399 - 44032: 0x86C9, + 45400 - 44032: 0xB3E8, + 45401 - 44032: 0x86CA, + 45402 - 44032: 0x86CB, + 45403 - 44032: 0x86CC, + 45404 - 44032: 0xB3E9, + 45405 - 44032: 0x86CD, + 45406 - 44032: 0x86CE, + 45407 - 44032: 0x86CF, + 45408 - 44032: 0xB3EA, + 45409 - 44032: 0x86D0, + 45410 - 44032: 0x86D1, + 45411 - 44032: 0x86D2, + 45412 - 44032: 0x86D3, + 45413 - 44032: 0x86D4, + 45414 - 44032: 0x86D5, + 45415 - 44032: 0x86D6, + 45416 - 44032: 0x86D7, + 45417 - 44032: 0x86D8, + 45418 - 44032: 0x86D9, + 45419 - 44032: 0x86DA, + 45420 - 44032: 0x86DB, + 45421 - 44032: 0x86DC, + 45422 - 44032: 0x86DD, + 45423 - 44032: 0x86DE, + 45424 - 44032: 0x86DF, + 45425 - 44032: 0x86E0, + 45426 - 44032: 0x86E1, + 45427 - 44032: 0x86E2, + 45428 - 44032: 0x86E3, + 45429 - 44032: 0x86E4, + 45430 - 44032: 0x86E5, + 45431 - 44032: 0x86E6, + 45432 - 44032: 0xB3EB, + 45433 - 44032: 0xB3EC, + 45434 - 44032: 0x86E7, + 45435 - 44032: 0x86E8, + 45436 - 44032: 0xB3ED, + 45437 - 44032: 0x86E9, + 45438 - 44032: 0x86EA, + 45439 - 44032: 0x86EB, + 45440 - 44032: 0xB3EE, + 45441 - 44032: 0x86EC, + 45442 - 44032: 0xB3EF, + 45443 - 44032: 0x86ED, + 45444 - 44032: 0x86EE, + 45445 - 44032: 0x86EF, + 45446 - 44032: 0x86F0, + 45447 - 44032: 0x86F1, + 45448 - 44032: 0xB3F0, + 45449 - 44032: 0xB3F1, + 45450 - 44032: 0x86F2, + 45451 - 44032: 0xB3F2, + 45452 - 44032: 0x86F3, + 45453 - 44032: 0xB3F3, + 45454 - 44032: 0x86F4, + 45455 - 44032: 0x86F5, + 45456 - 44032: 0x86F6, + 45457 - 44032: 0x86F7, + 45458 - 44032: 0xB3F4, + 45459 - 44032: 0xB3F5, + 45460 - 44032: 0xB3F6, + 45461 - 44032: 0x86F8, + 45462 - 44032: 0x86F9, + 45463 - 44032: 0x86FA, + 45464 - 44032: 0xB3F7, + 45465 - 44032: 0x86FB, + 45466 - 44032: 0x86FC, + 45467 - 44032: 0x86FD, + 45468 - 44032: 0xB3F8, + 45469 - 44032: 0x86FE, + 45470 - 44032: 0x8741, + 45471 - 44032: 0x8742, + 45472 - 44032: 0x8743, + 45473 - 44032: 0x8744, + 45474 - 44032: 0x8745, + 45475 - 44032: 0x8746, + 45476 - 44032: 0x8747, + 45477 - 44032: 0x8748, + 45478 - 44032: 0x8749, + 45479 - 44032: 0x874A, + 45480 - 44032: 0xB3F9, + 45481 - 44032: 0x874B, + 45482 - 44032: 0x874C, + 45483 - 44032: 0x874D, + 45484 - 44032: 0x874E, + 45485 - 44032: 0x874F, + 45486 - 44032: 0x8750, + 45487 - 44032: 0x8751, + 45488 - 44032: 0x8752, + 45489 - 44032: 0x8753, + 45490 - 44032: 0x8754, + 45491 - 44032: 0x8755, + 45492 - 44032: 0x8756, + 45493 - 44032: 0x8757, + 45494 - 44032: 0x8758, + 45495 - 44032: 0x8759, + 45496 - 44032: 0x875A, + 45497 - 44032: 0x8761, + 45498 - 44032: 0x8762, + 45499 - 44032: 0x8763, + 45500 - 44032: 0x8764, + 45501 - 44032: 0x8765, + 45502 - 44032: 0x8766, + 45503 - 44032: 0x8767, + 45504 - 44032: 0x8768, + 45505 - 44032: 0x8769, + 45506 - 44032: 0x876A, + 45507 - 44032: 0x876B, + 45508 - 44032: 0x876C, + 45509 - 44032: 0x876D, + 45510 - 44032: 0x876E, + 45511 - 44032: 0x876F, + 45512 - 44032: 0x8770, + 45513 - 44032: 0x8771, + 45514 - 44032: 0x8772, + 45515 - 44032: 0x8773, + 45516 - 44032: 0xB3FA, + 45517 - 44032: 0x8774, + 45518 - 44032: 0x8775, + 45519 - 44032: 0x8776, + 45520 - 44032: 0xB3FB, + 45521 - 44032: 0x8777, + 45522 - 44032: 0x8778, + 45523 - 44032: 0x8779, + 45524 - 44032: 0xB3FC, + 45525 - 44032: 0x877A, + 45526 - 44032: 0x8781, + 45527 - 44032: 0x8782, + 45528 - 44032: 0x8783, + 45529 - 44032: 0x8784, + 45530 - 44032: 0x8785, + 45531 - 44032: 0x8786, + 45532 - 44032: 0xB3FD, + 45533 - 44032: 0xB3FE, + 45534 - 44032: 0x8787, + 45535 - 44032: 0xB4A1, + 45536 - 44032: 0x8788, + 45537 - 44032: 0x8789, + 45538 - 44032: 0x878A, + 45539 - 44032: 0x878B, + 45540 - 44032: 0x878C, + 45541 - 44032: 0x878D, + 45542 - 44032: 0x878E, + 45543 - 44032: 0x878F, + 45544 - 44032: 0xB4A2, + 45545 - 44032: 0xB4A3, + 45546 - 44032: 0x8790, + 45547 - 44032: 0x8791, + 45548 - 44032: 0xB4A4, + 45549 - 44032: 0x8792, + 45550 - 44032: 0x8793, + 45551 - 44032: 0x8794, + 45552 - 44032: 0xB4A5, + 45553 - 44032: 0x8795, + 45554 - 44032: 0x8796, + 45555 - 44032: 0x8797, + 45556 - 44032: 0x8798, + 45557 - 44032: 0x8799, + 45558 - 44032: 0x879A, + 45559 - 44032: 0x879B, + 45560 - 44032: 0x879C, + 45561 - 44032: 0xB4A6, + 45562 - 44032: 0x879D, + 45563 - 44032: 0xB4A7, + 45564 - 44032: 0x879E, + 45565 - 44032: 0xB4A8, + 45566 - 44032: 0x879F, + 45567 - 44032: 0x87A0, + 45568 - 44032: 0x87A1, + 45569 - 44032: 0x87A2, + 45570 - 44032: 0x87A3, + 45571 - 44032: 0x87A4, + 45572 - 44032: 0xB4A9, + 45573 - 44032: 0xB4AA, + 45574 - 44032: 0x87A5, + 45575 - 44032: 0x87A6, + 45576 - 44032: 0xB4AB, + 45577 - 44032: 0x87A7, + 45578 - 44032: 0x87A8, + 45579 - 44032: 0xB4AC, + 45580 - 44032: 0xB4AD, + 45581 - 44032: 0x87A9, + 45582 - 44032: 0x87AA, + 45583 - 44032: 0x87AB, + 45584 - 44032: 0x87AC, + 45585 - 44032: 0x87AD, + 45586 - 44032: 0x87AE, + 45587 - 44032: 0x87AF, + 45588 - 44032: 0xB4AE, + 45589 - 44032: 0xB4AF, + 45590 - 44032: 0x87B0, + 45591 - 44032: 0xB4B0, + 45592 - 44032: 0x87B1, + 45593 - 44032: 0xB4B1, + 45594 - 44032: 0x87B2, + 45595 - 44032: 0x87B3, + 45596 - 44032: 0x87B4, + 45597 - 44032: 0x87B5, + 45598 - 44032: 0x87B6, + 45599 - 44032: 0x87B7, + 45600 - 44032: 0xB4B2, + 45601 - 44032: 0x87B8, + 45602 - 44032: 0x87B9, + 45603 - 44032: 0x87BA, + 45604 - 44032: 0x87BB, + 45605 - 44032: 0x87BC, + 45606 - 44032: 0x87BD, + 45607 - 44032: 0x87BE, + 45608 - 44032: 0x87BF, + 45609 - 44032: 0x87C0, + 45610 - 44032: 0x87C1, + 45611 - 44032: 0x87C2, + 45612 - 44032: 0x87C3, + 45613 - 44032: 0x87C4, + 45614 - 44032: 0x87C5, + 45615 - 44032: 0x87C6, + 45616 - 44032: 0x87C7, + 45617 - 44032: 0x87C8, + 45618 - 44032: 0x87C9, + 45619 - 44032: 0x87CA, + 45620 - 44032: 0xB4B3, + 45621 - 44032: 0x87CB, + 45622 - 44032: 0x87CC, + 45623 - 44032: 0x87CD, + 45624 - 44032: 0x87CE, + 45625 - 44032: 0x87CF, + 45626 - 44032: 0x87D0, + 45627 - 44032: 0x87D1, + 45628 - 44032: 0xB4B4, + 45629 - 44032: 0x87D2, + 45630 - 44032: 0x87D3, + 45631 - 44032: 0x87D4, + 45632 - 44032: 0x87D5, + 45633 - 44032: 0x87D6, + 45634 - 44032: 0x87D7, + 45635 - 44032: 0x87D8, + 45636 - 44032: 0x87D9, + 45637 - 44032: 0x87DA, + 45638 - 44032: 0x87DB, + 45639 - 44032: 0x87DC, + 45640 - 44032: 0x87DD, + 45641 - 44032: 0x87DE, + 45642 - 44032: 0x87DF, + 45643 - 44032: 0x87E0, + 45644 - 44032: 0x87E1, + 45645 - 44032: 0x87E2, + 45646 - 44032: 0x87E3, + 45647 - 44032: 0x87E4, + 45648 - 44032: 0x87E5, + 45649 - 44032: 0x87E6, + 45650 - 44032: 0x87E7, + 45651 - 44032: 0x87E8, + 45652 - 44032: 0x87E9, + 45653 - 44032: 0x87EA, + 45654 - 44032: 0x87EB, + 45655 - 44032: 0x87EC, + 45656 - 44032: 0xB4B5, + 45657 - 44032: 0x87ED, + 45658 - 44032: 0x87EE, + 45659 - 44032: 0x87EF, + 45660 - 44032: 0xB4B6, + 45661 - 44032: 0x87F0, + 45662 - 44032: 0x87F1, + 45663 - 44032: 0x87F2, + 45664 - 44032: 0xB4B7, + 45665 - 44032: 0x87F3, + 45666 - 44032: 0x87F4, + 45667 - 44032: 0x87F5, + 45668 - 44032: 0x87F6, + 45669 - 44032: 0x87F7, + 45670 - 44032: 0x87F8, + 45671 - 44032: 0x87F9, + 45672 - 44032: 0xB4B8, + 45673 - 44032: 0xB4B9, + 45674 - 44032: 0x87FA, + 45675 - 44032: 0x87FB, + 45676 - 44032: 0x87FC, + 45677 - 44032: 0x87FD, + 45678 - 44032: 0x87FE, + 45679 - 44032: 0x8841, + 45680 - 44032: 0x8842, + 45681 - 44032: 0x8843, + 45682 - 44032: 0x8844, + 45683 - 44032: 0x8845, + 45684 - 44032: 0xB4BA, + 45685 - 44032: 0xB4BB, + 45686 - 44032: 0x8846, + 45687 - 44032: 0x8847, + 45688 - 44032: 0x8848, + 45689 - 44032: 0x8849, + 45690 - 44032: 0x884A, + 45691 - 44032: 0x884B, + 45692 - 44032: 0xB4BC, + 45693 - 44032: 0x884C, + 45694 - 44032: 0x884D, + 45695 - 44032: 0x884E, + 45696 - 44032: 0x884F, + 45697 - 44032: 0x8850, + 45698 - 44032: 0x8851, + 45699 - 44032: 0x8852, + 45700 - 44032: 0xB4BD, + 45701 - 44032: 0xB4BE, + 45702 - 44032: 0x8853, + 45703 - 44032: 0x8854, + 45704 - 44032: 0x8855, + 45705 - 44032: 0xB4BF, + 45706 - 44032: 0x8856, + 45707 - 44032: 0x8857, + 45708 - 44032: 0x8858, + 45709 - 44032: 0x8859, + 45710 - 44032: 0x885A, + 45711 - 44032: 0x8861, + 45712 - 44032: 0xB4C0, + 45713 - 44032: 0xB4C1, + 45714 - 44032: 0x8862, + 45715 - 44032: 0x8863, + 45716 - 44032: 0xB4C2, + 45717 - 44032: 0x8864, + 45718 - 44032: 0x8865, + 45719 - 44032: 0x8866, + 45720 - 44032: 0xB4C3, + 45721 - 44032: 0xB4C4, + 45722 - 44032: 0xB4C5, + 45723 - 44032: 0x8867, + 45724 - 44032: 0x8868, + 45725 - 44032: 0x8869, + 45726 - 44032: 0x886A, + 45727 - 44032: 0x886B, + 45728 - 44032: 0xB4C6, + 45729 - 44032: 0xB4C7, + 45730 - 44032: 0x886C, + 45731 - 44032: 0xB4C8, + 45732 - 44032: 0x886D, + 45733 - 44032: 0xB4C9, + 45734 - 44032: 0xB4CA, + 45735 - 44032: 0x886E, + 45736 - 44032: 0x886F, + 45737 - 44032: 0x8870, + 45738 - 44032: 0xB4CB, + 45739 - 44032: 0x8871, + 45740 - 44032: 0xB4CC, + 45741 - 44032: 0x8872, + 45742 - 44032: 0x8873, + 45743 - 44032: 0x8874, + 45744 - 44032: 0xB4CD, + 45745 - 44032: 0x8875, + 45746 - 44032: 0x8876, + 45747 - 44032: 0x8877, + 45748 - 44032: 0xB4CE, + 45749 - 44032: 0x8878, + 45750 - 44032: 0x8879, + 45751 - 44032: 0x887A, + 45752 - 44032: 0x8881, + 45753 - 44032: 0x8882, + 45754 - 44032: 0x8883, + 45755 - 44032: 0x8884, + 45756 - 44032: 0x8885, + 45757 - 44032: 0x8886, + 45758 - 44032: 0x8887, + 45759 - 44032: 0x8888, + 45760 - 44032: 0x8889, + 45761 - 44032: 0x888A, + 45762 - 44032: 0x888B, + 45763 - 44032: 0x888C, + 45764 - 44032: 0x888D, + 45765 - 44032: 0x888E, + 45766 - 44032: 0x888F, + 45767 - 44032: 0x8890, + 45768 - 44032: 0xB4CF, + 45769 - 44032: 0xB4D0, + 45770 - 44032: 0x8891, + 45771 - 44032: 0x8892, + 45772 - 44032: 0xB4D1, + 45773 - 44032: 0x8893, + 45774 - 44032: 0x8894, + 45775 - 44032: 0x8895, + 45776 - 44032: 0xB4D2, + 45777 - 44032: 0x8896, + 45778 - 44032: 0xB4D3, + 45779 - 44032: 0x8897, + 45780 - 44032: 0x8898, + 45781 - 44032: 0x8899, + 45782 - 44032: 0x889A, + 45783 - 44032: 0x889B, + 45784 - 44032: 0xB4D4, + 45785 - 44032: 0xB4D5, + 45786 - 44032: 0x889C, + 45787 - 44032: 0xB4D6, + 45788 - 44032: 0x889D, + 45789 - 44032: 0xB4D7, + 45790 - 44032: 0x889E, + 45791 - 44032: 0x889F, + 45792 - 44032: 0x88A0, + 45793 - 44032: 0x88A1, + 45794 - 44032: 0xB4D8, + 45795 - 44032: 0x88A2, + 45796 - 44032: 0xB4D9, + 45797 - 44032: 0xB4DA, + 45798 - 44032: 0xB4DB, + 45799 - 44032: 0x88A3, + 45800 - 44032: 0xB4DC, + 45801 - 44032: 0x88A4, + 45802 - 44032: 0x88A5, + 45803 - 44032: 0xB4DD, + 45804 - 44032: 0xB4DE, + 45805 - 44032: 0xB4DF, + 45806 - 44032: 0xB4E0, + 45807 - 44032: 0xB4E1, + 45808 - 44032: 0x88A6, + 45809 - 44032: 0x88A7, + 45810 - 44032: 0x88A8, + 45811 - 44032: 0xB4E2, + 45812 - 44032: 0xB4E3, + 45813 - 44032: 0xB4E4, + 45814 - 44032: 0x88A9, + 45815 - 44032: 0xB4E5, + 45816 - 44032: 0xB4E6, + 45817 - 44032: 0xB4E7, + 45818 - 44032: 0xB4E8, + 45819 - 44032: 0xB4E9, + 45820 - 44032: 0x88AA, + 45821 - 44032: 0x88AB, + 45822 - 44032: 0x88AC, + 45823 - 44032: 0xB4EA, + 45824 - 44032: 0xB4EB, + 45825 - 44032: 0xB4EC, + 45826 - 44032: 0x88AD, + 45827 - 44032: 0x88AE, + 45828 - 44032: 0xB4ED, + 45829 - 44032: 0x88AF, + 45830 - 44032: 0x88B0, + 45831 - 44032: 0x88B1, + 45832 - 44032: 0xB4EE, + 45833 - 44032: 0x88B2, + 45834 - 44032: 0x88B3, + 45835 - 44032: 0x88B4, + 45836 - 44032: 0x88B5, + 45837 - 44032: 0x88B6, + 45838 - 44032: 0x88B7, + 45839 - 44032: 0x88B8, + 45840 - 44032: 0xB4EF, + 45841 - 44032: 0xB4F0, + 45842 - 44032: 0x88B9, + 45843 - 44032: 0xB4F1, + 45844 - 44032: 0xB4F2, + 45845 - 44032: 0xB4F3, + 45846 - 44032: 0x88BA, + 45847 - 44032: 0x88BB, + 45848 - 44032: 0x88BC, + 45849 - 44032: 0x88BD, + 45850 - 44032: 0x88BE, + 45851 - 44032: 0x88BF, + 45852 - 44032: 0xB4F4, + 45853 - 44032: 0x88C0, + 45854 - 44032: 0x88C1, + 45855 - 44032: 0x88C2, + 45856 - 44032: 0x88C3, + 45857 - 44032: 0x88C4, + 45858 - 44032: 0x88C5, + 45859 - 44032: 0x88C6, + 45860 - 44032: 0x88C7, + 45861 - 44032: 0x88C8, + 45862 - 44032: 0x88C9, + 45863 - 44032: 0x88CA, + 45864 - 44032: 0x88CB, + 45865 - 44032: 0x88CC, + 45866 - 44032: 0x88CD, + 45867 - 44032: 0x88CE, + 45868 - 44032: 0x88CF, + 45869 - 44032: 0x88D0, + 45870 - 44032: 0x88D1, + 45871 - 44032: 0x88D2, + 45872 - 44032: 0x88D3, + 45873 - 44032: 0x88D4, + 45874 - 44032: 0x88D5, + 45875 - 44032: 0x88D6, + 45876 - 44032: 0x88D7, + 45877 - 44032: 0x88D8, + 45878 - 44032: 0x88D9, + 45879 - 44032: 0x88DA, + 45880 - 44032: 0x88DB, + 45881 - 44032: 0x88DC, + 45882 - 44032: 0x88DD, + 45883 - 44032: 0x88DE, + 45884 - 44032: 0x88DF, + 45885 - 44032: 0x88E0, + 45886 - 44032: 0x88E1, + 45887 - 44032: 0x88E2, + 45888 - 44032: 0x88E3, + 45889 - 44032: 0x88E4, + 45890 - 44032: 0x88E5, + 45891 - 44032: 0x88E6, + 45892 - 44032: 0x88E7, + 45893 - 44032: 0x88E8, + 45894 - 44032: 0x88E9, + 45895 - 44032: 0x88EA, + 45896 - 44032: 0x88EB, + 45897 - 44032: 0x88EC, + 45898 - 44032: 0x88ED, + 45899 - 44032: 0x88EE, + 45900 - 44032: 0x88EF, + 45901 - 44032: 0x88F0, + 45902 - 44032: 0x88F1, + 45903 - 44032: 0x88F2, + 45904 - 44032: 0x88F3, + 45905 - 44032: 0x88F4, + 45906 - 44032: 0x88F5, + 45907 - 44032: 0x88F6, + 45908 - 44032: 0xB4F5, + 45909 - 44032: 0xB4F6, + 45910 - 44032: 0xB4F7, + 45911 - 44032: 0x88F7, + 45912 - 44032: 0xB4F8, + 45913 - 44032: 0x88F8, + 45914 - 44032: 0x88F9, + 45915 - 44032: 0xB4F9, + 45916 - 44032: 0xB4FA, + 45917 - 44032: 0x88FA, + 45918 - 44032: 0xB4FB, + 45919 - 44032: 0xB4FC, + 45920 - 44032: 0x88FB, + 45921 - 44032: 0x88FC, + 45922 - 44032: 0x88FD, + 45923 - 44032: 0x88FE, + 45924 - 44032: 0xB4FD, + 45925 - 44032: 0xB4FE, + 45926 - 44032: 0x8941, + 45927 - 44032: 0xB5A1, + 45928 - 44032: 0x8942, + 45929 - 44032: 0xB5A2, + 45930 - 44032: 0x8943, + 45931 - 44032: 0xB5A3, + 45932 - 44032: 0x8944, + 45933 - 44032: 0x8945, + 45934 - 44032: 0xB5A4, + 45935 - 44032: 0x8946, + 45936 - 44032: 0xB5A5, + 45937 - 44032: 0xB5A6, + 45938 - 44032: 0x8947, + 45939 - 44032: 0x8948, + 45940 - 44032: 0xB5A7, + 45941 - 44032: 0x8949, + 45942 - 44032: 0x894A, + 45943 - 44032: 0x894B, + 45944 - 44032: 0xB5A8, + 45945 - 44032: 0x894C, + 45946 - 44032: 0x894D, + 45947 - 44032: 0x894E, + 45948 - 44032: 0x894F, + 45949 - 44032: 0x8950, + 45950 - 44032: 0x8951, + 45951 - 44032: 0x8952, + 45952 - 44032: 0xB5A9, + 45953 - 44032: 0xB5AA, + 45954 - 44032: 0x8953, + 45955 - 44032: 0xB5AB, + 45956 - 44032: 0xB5AC, + 45957 - 44032: 0xB5AD, + 45958 - 44032: 0x8954, + 45959 - 44032: 0x8955, + 45960 - 44032: 0x8956, + 45961 - 44032: 0x8957, + 45962 - 44032: 0x8958, + 45963 - 44032: 0x8959, + 45964 - 44032: 0xB5AE, + 45965 - 44032: 0x895A, + 45966 - 44032: 0x8961, + 45967 - 44032: 0x8962, + 45968 - 44032: 0xB5AF, + 45969 - 44032: 0x8963, + 45970 - 44032: 0x8964, + 45971 - 44032: 0x8965, + 45972 - 44032: 0xB5B0, + 45973 - 44032: 0x8966, + 45974 - 44032: 0x8967, + 45975 - 44032: 0x8968, + 45976 - 44032: 0x8969, + 45977 - 44032: 0x896A, + 45978 - 44032: 0x896B, + 45979 - 44032: 0x896C, + 45980 - 44032: 0x896D, + 45981 - 44032: 0x896E, + 45982 - 44032: 0x896F, + 45983 - 44032: 0x8970, + 45984 - 44032: 0xB5B1, + 45985 - 44032: 0xB5B2, + 45986 - 44032: 0x8971, + 45987 - 44032: 0x8972, + 45988 - 44032: 0x8973, + 45989 - 44032: 0x8974, + 45990 - 44032: 0x8975, + 45991 - 44032: 0x8976, + 45992 - 44032: 0xB5B3, + 45993 - 44032: 0x8977, + 45994 - 44032: 0x8978, + 45995 - 44032: 0x8979, + 45996 - 44032: 0xB5B4, + 45997 - 44032: 0x897A, + 45998 - 44032: 0x8981, + 45999 - 44032: 0x8982, + 46000 - 44032: 0x8983, + 46001 - 44032: 0x8984, + 46002 - 44032: 0x8985, + 46003 - 44032: 0x8986, + 46004 - 44032: 0x8987, + 46005 - 44032: 0x8988, + 46006 - 44032: 0x8989, + 46007 - 44032: 0x898A, + 46008 - 44032: 0x898B, + 46009 - 44032: 0x898C, + 46010 - 44032: 0x898D, + 46011 - 44032: 0x898E, + 46012 - 44032: 0x898F, + 46013 - 44032: 0x8990, + 46014 - 44032: 0x8991, + 46015 - 44032: 0x8992, + 46016 - 44032: 0x8993, + 46017 - 44032: 0x8994, + 46018 - 44032: 0x8995, + 46019 - 44032: 0x8996, + 46020 - 44032: 0xB5B5, + 46021 - 44032: 0xB5B6, + 46022 - 44032: 0x8997, + 46023 - 44032: 0x8998, + 46024 - 44032: 0xB5B7, + 46025 - 44032: 0x8999, + 46026 - 44032: 0x899A, + 46027 - 44032: 0xB5B8, + 46028 - 44032: 0xB5B9, + 46029 - 44032: 0x899B, + 46030 - 44032: 0xB5BA, + 46031 - 44032: 0x899C, + 46032 - 44032: 0xB5BB, + 46033 - 44032: 0x899D, + 46034 - 44032: 0x899E, + 46035 - 44032: 0x899F, + 46036 - 44032: 0xB5BC, + 46037 - 44032: 0xB5BD, + 46038 - 44032: 0x89A0, + 46039 - 44032: 0xB5BE, + 46040 - 44032: 0x89A1, + 46041 - 44032: 0xB5BF, + 46042 - 44032: 0x89A2, + 46043 - 44032: 0xB5C0, + 46044 - 44032: 0x89A3, + 46045 - 44032: 0xB5C1, + 46046 - 44032: 0x89A4, + 46047 - 44032: 0x89A5, + 46048 - 44032: 0xB5C2, + 46049 - 44032: 0x89A6, + 46050 - 44032: 0x89A7, + 46051 - 44032: 0x89A8, + 46052 - 44032: 0xB5C3, + 46053 - 44032: 0x89A9, + 46054 - 44032: 0x89AA, + 46055 - 44032: 0x89AB, + 46056 - 44032: 0xB5C4, + 46057 - 44032: 0x89AC, + 46058 - 44032: 0x89AD, + 46059 - 44032: 0x89AE, + 46060 - 44032: 0x89AF, + 46061 - 44032: 0x89B0, + 46062 - 44032: 0x89B1, + 46063 - 44032: 0x89B2, + 46064 - 44032: 0x89B3, + 46065 - 44032: 0x89B4, + 46066 - 44032: 0x89B5, + 46067 - 44032: 0x89B6, + 46068 - 44032: 0x89B7, + 46069 - 44032: 0x89B8, + 46070 - 44032: 0x89B9, + 46071 - 44032: 0x89BA, + 46072 - 44032: 0x89BB, + 46073 - 44032: 0x89BC, + 46074 - 44032: 0x89BD, + 46075 - 44032: 0x89BE, + 46076 - 44032: 0xB5C5, + 46077 - 44032: 0x89BF, + 46078 - 44032: 0x89C0, + 46079 - 44032: 0x89C1, + 46080 - 44032: 0x89C2, + 46081 - 44032: 0x89C3, + 46082 - 44032: 0x89C4, + 46083 - 44032: 0x89C5, + 46084 - 44032: 0x89C6, + 46085 - 44032: 0x89C7, + 46086 - 44032: 0x89C8, + 46087 - 44032: 0x89C9, + 46088 - 44032: 0x89CA, + 46089 - 44032: 0x89CB, + 46090 - 44032: 0x89CC, + 46091 - 44032: 0x89CD, + 46092 - 44032: 0x89CE, + 46093 - 44032: 0x89CF, + 46094 - 44032: 0x89D0, + 46095 - 44032: 0x89D1, + 46096 - 44032: 0xB5C6, + 46097 - 44032: 0x89D2, + 46098 - 44032: 0x89D3, + 46099 - 44032: 0x89D4, + 46100 - 44032: 0x89D5, + 46101 - 44032: 0x89D6, + 46102 - 44032: 0x89D7, + 46103 - 44032: 0x89D8, + 46104 - 44032: 0xB5C7, + 46105 - 44032: 0x89D9, + 46106 - 44032: 0x89DA, + 46107 - 44032: 0x89DB, + 46108 - 44032: 0xB5C8, + 46109 - 44032: 0x89DC, + 46110 - 44032: 0x89DD, + 46111 - 44032: 0x89DE, + 46112 - 44032: 0xB5C9, + 46113 - 44032: 0x89DF, + 46114 - 44032: 0x89E0, + 46115 - 44032: 0x89E1, + 46116 - 44032: 0x89E2, + 46117 - 44032: 0x89E3, + 46118 - 44032: 0x89E4, + 46119 - 44032: 0x89E5, + 46120 - 44032: 0xB5CA, + 46121 - 44032: 0xB5CB, + 46122 - 44032: 0x89E6, + 46123 - 44032: 0xB5CC, + 46124 - 44032: 0x89E7, + 46125 - 44032: 0x89E8, + 46126 - 44032: 0x89E9, + 46127 - 44032: 0x89EA, + 46128 - 44032: 0x89EB, + 46129 - 44032: 0x89EC, + 46130 - 44032: 0x89ED, + 46131 - 44032: 0x89EE, + 46132 - 44032: 0xB5CD, + 46133 - 44032: 0x89EF, + 46134 - 44032: 0x89F0, + 46135 - 44032: 0x89F1, + 46136 - 44032: 0x89F2, + 46137 - 44032: 0x89F3, + 46138 - 44032: 0x89F4, + 46139 - 44032: 0x89F5, + 46140 - 44032: 0x89F6, + 46141 - 44032: 0x89F7, + 46142 - 44032: 0x89F8, + 46143 - 44032: 0x89F9, + 46144 - 44032: 0x89FA, + 46145 - 44032: 0x89FB, + 46146 - 44032: 0x89FC, + 46147 - 44032: 0x89FD, + 46148 - 44032: 0x89FE, + 46149 - 44032: 0x8A41, + 46150 - 44032: 0x8A42, + 46151 - 44032: 0x8A43, + 46152 - 44032: 0x8A44, + 46153 - 44032: 0x8A45, + 46154 - 44032: 0x8A46, + 46155 - 44032: 0x8A47, + 46156 - 44032: 0x8A48, + 46157 - 44032: 0x8A49, + 46158 - 44032: 0x8A4A, + 46159 - 44032: 0x8A4B, + 46160 - 44032: 0xB5CE, + 46161 - 44032: 0xB5CF, + 46162 - 44032: 0x8A4C, + 46163 - 44032: 0x8A4D, + 46164 - 44032: 0xB5D0, + 46165 - 44032: 0x8A4E, + 46166 - 44032: 0x8A4F, + 46167 - 44032: 0x8A50, + 46168 - 44032: 0xB5D1, + 46169 - 44032: 0x8A51, + 46170 - 44032: 0x8A52, + 46171 - 44032: 0x8A53, + 46172 - 44032: 0x8A54, + 46173 - 44032: 0x8A55, + 46174 - 44032: 0x8A56, + 46175 - 44032: 0x8A57, + 46176 - 44032: 0xB5D2, + 46177 - 44032: 0xB5D3, + 46178 - 44032: 0x8A58, + 46179 - 44032: 0xB5D4, + 46180 - 44032: 0x8A59, + 46181 - 44032: 0xB5D5, + 46182 - 44032: 0x8A5A, + 46183 - 44032: 0x8A61, + 46184 - 44032: 0x8A62, + 46185 - 44032: 0x8A63, + 46186 - 44032: 0x8A64, + 46187 - 44032: 0x8A65, + 46188 - 44032: 0xB5D6, + 46189 - 44032: 0x8A66, + 46190 - 44032: 0x8A67, + 46191 - 44032: 0x8A68, + 46192 - 44032: 0x8A69, + 46193 - 44032: 0x8A6A, + 46194 - 44032: 0x8A6B, + 46195 - 44032: 0x8A6C, + 46196 - 44032: 0x8A6D, + 46197 - 44032: 0x8A6E, + 46198 - 44032: 0x8A6F, + 46199 - 44032: 0x8A70, + 46200 - 44032: 0x8A71, + 46201 - 44032: 0x8A72, + 46202 - 44032: 0x8A73, + 46203 - 44032: 0x8A74, + 46204 - 44032: 0x8A75, + 46205 - 44032: 0x8A76, + 46206 - 44032: 0x8A77, + 46207 - 44032: 0x8A78, + 46208 - 44032: 0xB5D7, + 46209 - 44032: 0x8A79, + 46210 - 44032: 0x8A7A, + 46211 - 44032: 0x8A81, + 46212 - 44032: 0x8A82, + 46213 - 44032: 0x8A83, + 46214 - 44032: 0x8A84, + 46215 - 44032: 0x8A85, + 46216 - 44032: 0xB5D8, + 46217 - 44032: 0x8A86, + 46218 - 44032: 0x8A87, + 46219 - 44032: 0x8A88, + 46220 - 44032: 0x8A89, + 46221 - 44032: 0x8A8A, + 46222 - 44032: 0x8A8B, + 46223 - 44032: 0x8A8C, + 46224 - 44032: 0x8A8D, + 46225 - 44032: 0x8A8E, + 46226 - 44032: 0x8A8F, + 46227 - 44032: 0x8A90, + 46228 - 44032: 0x8A91, + 46229 - 44032: 0x8A92, + 46230 - 44032: 0x8A93, + 46231 - 44032: 0x8A94, + 46232 - 44032: 0x8A95, + 46233 - 44032: 0x8A96, + 46234 - 44032: 0x8A97, + 46235 - 44032: 0x8A98, + 46236 - 44032: 0x8A99, + 46237 - 44032: 0xB5D9, + 46238 - 44032: 0x8A9A, + 46239 - 44032: 0x8A9B, + 46240 - 44032: 0x8A9C, + 46241 - 44032: 0x8A9D, + 46242 - 44032: 0x8A9E, + 46243 - 44032: 0x8A9F, + 46244 - 44032: 0xB5DA, + 46245 - 44032: 0x8AA0, + 46246 - 44032: 0x8AA1, + 46247 - 44032: 0x8AA2, + 46248 - 44032: 0xB5DB, + 46249 - 44032: 0x8AA3, + 46250 - 44032: 0x8AA4, + 46251 - 44032: 0x8AA5, + 46252 - 44032: 0xB5DC, + 46253 - 44032: 0x8AA6, + 46254 - 44032: 0x8AA7, + 46255 - 44032: 0x8AA8, + 46256 - 44032: 0x8AA9, + 46257 - 44032: 0x8AAA, + 46258 - 44032: 0x8AAB, + 46259 - 44032: 0x8AAC, + 46260 - 44032: 0x8AAD, + 46261 - 44032: 0xB5DD, + 46262 - 44032: 0x8AAE, + 46263 - 44032: 0xB5DE, + 46264 - 44032: 0x8AAF, + 46265 - 44032: 0xB5DF, + 46266 - 44032: 0x8AB0, + 46267 - 44032: 0x8AB1, + 46268 - 44032: 0x8AB2, + 46269 - 44032: 0x8AB3, + 46270 - 44032: 0x8AB4, + 46271 - 44032: 0x8AB5, + 46272 - 44032: 0xB5E0, + 46273 - 44032: 0x8AB6, + 46274 - 44032: 0x8AB7, + 46275 - 44032: 0x8AB8, + 46276 - 44032: 0xB5E1, + 46277 - 44032: 0x8AB9, + 46278 - 44032: 0x8ABA, + 46279 - 44032: 0x8ABB, + 46280 - 44032: 0xB5E2, + 46281 - 44032: 0x8ABC, + 46282 - 44032: 0x8ABD, + 46283 - 44032: 0x8ABE, + 46284 - 44032: 0x8ABF, + 46285 - 44032: 0x8AC0, + 46286 - 44032: 0x8AC1, + 46287 - 44032: 0x8AC2, + 46288 - 44032: 0xB5E3, + 46289 - 44032: 0x8AC3, + 46290 - 44032: 0x8AC4, + 46291 - 44032: 0x8AC5, + 46292 - 44032: 0x8AC6, + 46293 - 44032: 0xB5E4, + 46294 - 44032: 0x8AC7, + 46295 - 44032: 0x8AC8, + 46296 - 44032: 0x8AC9, + 46297 - 44032: 0x8ACA, + 46298 - 44032: 0x8ACB, + 46299 - 44032: 0x8ACC, + 46300 - 44032: 0xB5E5, + 46301 - 44032: 0xB5E6, + 46302 - 44032: 0x8ACD, + 46303 - 44032: 0x8ACE, + 46304 - 44032: 0xB5E7, + 46305 - 44032: 0x8ACF, + 46306 - 44032: 0x8AD0, + 46307 - 44032: 0xB5E8, + 46308 - 44032: 0xB5E9, + 46309 - 44032: 0x8AD1, + 46310 - 44032: 0xB5EA, + 46311 - 44032: 0x8AD2, + 46312 - 44032: 0x8AD3, + 46313 - 44032: 0x8AD4, + 46314 - 44032: 0x8AD5, + 46315 - 44032: 0x8AD6, + 46316 - 44032: 0xB5EB, + 46317 - 44032: 0xB5EC, + 46318 - 44032: 0x8AD7, + 46319 - 44032: 0xB5ED, + 46320 - 44032: 0x8AD8, + 46321 - 44032: 0xB5EE, + 46322 - 44032: 0x8AD9, + 46323 - 44032: 0x8ADA, + 46324 - 44032: 0x8ADB, + 46325 - 44032: 0x8ADC, + 46326 - 44032: 0x8ADD, + 46327 - 44032: 0x8ADE, + 46328 - 44032: 0xB5EF, + 46329 - 44032: 0x8ADF, + 46330 - 44032: 0x8AE0, + 46331 - 44032: 0x8AE1, + 46332 - 44032: 0x8AE2, + 46333 - 44032: 0x8AE3, + 46334 - 44032: 0x8AE4, + 46335 - 44032: 0x8AE5, + 46336 - 44032: 0x8AE6, + 46337 - 44032: 0x8AE7, + 46338 - 44032: 0x8AE8, + 46339 - 44032: 0x8AE9, + 46340 - 44032: 0x8AEA, + 46341 - 44032: 0x8AEB, + 46342 - 44032: 0x8AEC, + 46343 - 44032: 0x8AED, + 46344 - 44032: 0x8AEE, + 46345 - 44032: 0x8AEF, + 46346 - 44032: 0x8AF0, + 46347 - 44032: 0x8AF1, + 46348 - 44032: 0x8AF2, + 46349 - 44032: 0x8AF3, + 46350 - 44032: 0x8AF4, + 46351 - 44032: 0x8AF5, + 46352 - 44032: 0x8AF6, + 46353 - 44032: 0x8AF7, + 46354 - 44032: 0x8AF8, + 46355 - 44032: 0x8AF9, + 46356 - 44032: 0xB5F0, + 46357 - 44032: 0xB5F1, + 46358 - 44032: 0x8AFA, + 46359 - 44032: 0x8AFB, + 46360 - 44032: 0xB5F2, + 46361 - 44032: 0x8AFC, + 46362 - 44032: 0x8AFD, + 46363 - 44032: 0xB5F3, + 46364 - 44032: 0xB5F4, + 46365 - 44032: 0x8AFE, + 46366 - 44032: 0x8B41, + 46367 - 44032: 0x8B42, + 46368 - 44032: 0x8B43, + 46369 - 44032: 0x8B44, + 46370 - 44032: 0x8B45, + 46371 - 44032: 0x8B46, + 46372 - 44032: 0xB5F5, + 46373 - 44032: 0xB5F6, + 46374 - 44032: 0x8B47, + 46375 - 44032: 0xB5F7, + 46376 - 44032: 0xB5F8, + 46377 - 44032: 0xB5F9, + 46378 - 44032: 0xB5FA, + 46379 - 44032: 0x8B48, + 46380 - 44032: 0x8B49, + 46381 - 44032: 0x8B4A, + 46382 - 44032: 0x8B4B, + 46383 - 44032: 0x8B4C, + 46384 - 44032: 0xB5FB, + 46385 - 44032: 0xB5FC, + 46386 - 44032: 0x8B4D, + 46387 - 44032: 0x8B4E, + 46388 - 44032: 0xB5FD, + 46389 - 44032: 0x8B4F, + 46390 - 44032: 0x8B50, + 46391 - 44032: 0x8B51, + 46392 - 44032: 0xB5FE, + 46393 - 44032: 0x8B52, + 46394 - 44032: 0x8B53, + 46395 - 44032: 0x8B54, + 46396 - 44032: 0x8B55, + 46397 - 44032: 0x8B56, + 46398 - 44032: 0x8B57, + 46399 - 44032: 0x8B58, + 46400 - 44032: 0xB6A1, + 46401 - 44032: 0xB6A2, + 46402 - 44032: 0x8B59, + 46403 - 44032: 0xB6A3, + 46404 - 44032: 0xB6A4, + 46405 - 44032: 0xB6A5, + 46406 - 44032: 0x8B5A, + 46407 - 44032: 0x8B61, + 46408 - 44032: 0x8B62, + 46409 - 44032: 0x8B63, + 46410 - 44032: 0x8B64, + 46411 - 44032: 0xB6A6, + 46412 - 44032: 0xB6A7, + 46413 - 44032: 0xB6A8, + 46414 - 44032: 0x8B65, + 46415 - 44032: 0x8B66, + 46416 - 44032: 0xB6A9, + 46417 - 44032: 0x8B67, + 46418 - 44032: 0x8B68, + 46419 - 44032: 0x8B69, + 46420 - 44032: 0xB6AA, + 46421 - 44032: 0x8B6A, + 46422 - 44032: 0x8B6B, + 46423 - 44032: 0x8B6C, + 46424 - 44032: 0x8B6D, + 46425 - 44032: 0x8B6E, + 46426 - 44032: 0x8B6F, + 46427 - 44032: 0x8B70, + 46428 - 44032: 0xB6AB, + 46429 - 44032: 0xB6AC, + 46430 - 44032: 0x8B71, + 46431 - 44032: 0xB6AD, + 46432 - 44032: 0xB6AE, + 46433 - 44032: 0xB6AF, + 46434 - 44032: 0x8B72, + 46435 - 44032: 0x8B73, + 46436 - 44032: 0x8B74, + 46437 - 44032: 0x8B75, + 46438 - 44032: 0x8B76, + 46439 - 44032: 0x8B77, + 46440 - 44032: 0x8B78, + 46441 - 44032: 0x8B79, + 46442 - 44032: 0x8B7A, + 46443 - 44032: 0x8B81, + 46444 - 44032: 0x8B82, + 46445 - 44032: 0x8B83, + 46446 - 44032: 0x8B84, + 46447 - 44032: 0x8B85, + 46448 - 44032: 0x8B86, + 46449 - 44032: 0x8B87, + 46450 - 44032: 0x8B88, + 46451 - 44032: 0x8B89, + 46452 - 44032: 0x8B8A, + 46453 - 44032: 0x8B8B, + 46454 - 44032: 0x8B8C, + 46455 - 44032: 0x8B8D, + 46456 - 44032: 0x8B8E, + 46457 - 44032: 0x8B8F, + 46458 - 44032: 0x8B90, + 46459 - 44032: 0x8B91, + 46460 - 44032: 0x8B92, + 46461 - 44032: 0x8B93, + 46462 - 44032: 0x8B94, + 46463 - 44032: 0x8B95, + 46464 - 44032: 0x8B96, + 46465 - 44032: 0x8B97, + 46466 - 44032: 0x8B98, + 46467 - 44032: 0x8B99, + 46468 - 44032: 0x8B9A, + 46469 - 44032: 0x8B9B, + 46470 - 44032: 0x8B9C, + 46471 - 44032: 0x8B9D, + 46472 - 44032: 0x8B9E, + 46473 - 44032: 0x8B9F, + 46474 - 44032: 0x8BA0, + 46475 - 44032: 0x8BA1, + 46476 - 44032: 0x8BA2, + 46477 - 44032: 0x8BA3, + 46478 - 44032: 0x8BA4, + 46479 - 44032: 0x8BA5, + 46480 - 44032: 0x8BA6, + 46481 - 44032: 0x8BA7, + 46482 - 44032: 0x8BA8, + 46483 - 44032: 0x8BA9, + 46484 - 44032: 0x8BAA, + 46485 - 44032: 0x8BAB, + 46486 - 44032: 0x8BAC, + 46487 - 44032: 0x8BAD, + 46488 - 44032: 0x8BAE, + 46489 - 44032: 0x8BAF, + 46490 - 44032: 0x8BB0, + 46491 - 44032: 0x8BB1, + 46492 - 44032: 0x8BB2, + 46493 - 44032: 0x8BB3, + 46494 - 44032: 0x8BB4, + 46495 - 44032: 0x8BB5, + 46496 - 44032: 0xB6B0, + 46497 - 44032: 0xB6B1, + 46498 - 44032: 0x8BB6, + 46499 - 44032: 0x8BB7, + 46500 - 44032: 0xB6B2, + 46501 - 44032: 0x8BB8, + 46502 - 44032: 0x8BB9, + 46503 - 44032: 0x8BBA, + 46504 - 44032: 0xB6B3, + 46505 - 44032: 0x8BBB, + 46506 - 44032: 0xB6B4, + 46507 - 44032: 0xB6B5, + 46508 - 44032: 0x8BBC, + 46509 - 44032: 0x8BBD, + 46510 - 44032: 0x8BBE, + 46511 - 44032: 0x8BBF, + 46512 - 44032: 0xB6B6, + 46513 - 44032: 0xB6B7, + 46514 - 44032: 0x8BC0, + 46515 - 44032: 0xB6B8, + 46516 - 44032: 0xB6B9, + 46517 - 44032: 0xB6BA, + 46518 - 44032: 0x8BC1, + 46519 - 44032: 0x8BC2, + 46520 - 44032: 0x8BC3, + 46521 - 44032: 0x8BC4, + 46522 - 44032: 0x8BC5, + 46523 - 44032: 0xB6BB, + 46524 - 44032: 0xB6BC, + 46525 - 44032: 0xB6BD, + 46526 - 44032: 0x8BC6, + 46527 - 44032: 0x8BC7, + 46528 - 44032: 0xB6BE, + 46529 - 44032: 0x8BC8, + 46530 - 44032: 0x8BC9, + 46531 - 44032: 0x8BCA, + 46532 - 44032: 0xB6BF, + 46533 - 44032: 0x8BCB, + 46534 - 44032: 0x8BCC, + 46535 - 44032: 0x8BCD, + 46536 - 44032: 0x8BCE, + 46537 - 44032: 0x8BCF, + 46538 - 44032: 0x8BD0, + 46539 - 44032: 0x8BD1, + 46540 - 44032: 0xB6C0, + 46541 - 44032: 0xB6C1, + 46542 - 44032: 0x8BD2, + 46543 - 44032: 0xB6C2, + 46544 - 44032: 0xB6C3, + 46545 - 44032: 0xB6C4, + 46546 - 44032: 0x8BD3, + 46547 - 44032: 0x8BD4, + 46548 - 44032: 0x8BD5, + 46549 - 44032: 0x8BD6, + 46550 - 44032: 0x8BD7, + 46551 - 44032: 0x8BD8, + 46552 - 44032: 0xB6C5, + 46553 - 44032: 0x8BD9, + 46554 - 44032: 0x8BDA, + 46555 - 44032: 0x8BDB, + 46556 - 44032: 0x8BDC, + 46557 - 44032: 0x8BDD, + 46558 - 44032: 0x8BDE, + 46559 - 44032: 0x8BDF, + 46560 - 44032: 0x8BE0, + 46561 - 44032: 0x8BE1, + 46562 - 44032: 0x8BE2, + 46563 - 44032: 0x8BE3, + 46564 - 44032: 0x8BE4, + 46565 - 44032: 0x8BE5, + 46566 - 44032: 0x8BE6, + 46567 - 44032: 0x8BE7, + 46568 - 44032: 0x8BE8, + 46569 - 44032: 0x8BE9, + 46570 - 44032: 0x8BEA, + 46571 - 44032: 0x8BEB, + 46572 - 44032: 0xB6C6, + 46573 - 44032: 0x8BEC, + 46574 - 44032: 0x8BED, + 46575 - 44032: 0x8BEE, + 46576 - 44032: 0x8BEF, + 46577 - 44032: 0x8BF0, + 46578 - 44032: 0x8BF1, + 46579 - 44032: 0x8BF2, + 46580 - 44032: 0x8BF3, + 46581 - 44032: 0x8BF4, + 46582 - 44032: 0x8BF5, + 46583 - 44032: 0x8BF6, + 46584 - 44032: 0x8BF7, + 46585 - 44032: 0x8BF8, + 46586 - 44032: 0x8BF9, + 46587 - 44032: 0x8BFA, + 46588 - 44032: 0x8BFB, + 46589 - 44032: 0x8BFC, + 46590 - 44032: 0x8BFD, + 46591 - 44032: 0x8BFE, + 46592 - 44032: 0x8C41, + 46593 - 44032: 0x8C42, + 46594 - 44032: 0x8C43, + 46595 - 44032: 0x8C44, + 46596 - 44032: 0x8C45, + 46597 - 44032: 0x8C46, + 46598 - 44032: 0x8C47, + 46599 - 44032: 0x8C48, + 46600 - 44032: 0x8C49, + 46601 - 44032: 0x8C4A, + 46602 - 44032: 0x8C4B, + 46603 - 44032: 0x8C4C, + 46604 - 44032: 0x8C4D, + 46605 - 44032: 0x8C4E, + 46606 - 44032: 0x8C4F, + 46607 - 44032: 0x8C50, + 46608 - 44032: 0xB6C7, + 46609 - 44032: 0xB6C8, + 46610 - 44032: 0x8C51, + 46611 - 44032: 0x8C52, + 46612 - 44032: 0xB6C9, + 46613 - 44032: 0x8C53, + 46614 - 44032: 0x8C54, + 46615 - 44032: 0x8C55, + 46616 - 44032: 0xB6CA, + 46617 - 44032: 0x8C56, + 46618 - 44032: 0x8C57, + 46619 - 44032: 0x8C58, + 46620 - 44032: 0x8C59, + 46621 - 44032: 0x8C5A, + 46622 - 44032: 0x8C61, + 46623 - 44032: 0x8C62, + 46624 - 44032: 0x8C63, + 46625 - 44032: 0x8C64, + 46626 - 44032: 0x8C65, + 46627 - 44032: 0x8C66, + 46628 - 44032: 0x8C67, + 46629 - 44032: 0xB6CB, + 46630 - 44032: 0x8C68, + 46631 - 44032: 0x8C69, + 46632 - 44032: 0x8C6A, + 46633 - 44032: 0x8C6B, + 46634 - 44032: 0x8C6C, + 46635 - 44032: 0x8C6D, + 46636 - 44032: 0xB6CC, + 46637 - 44032: 0x8C6E, + 46638 - 44032: 0x8C6F, + 46639 - 44032: 0x8C70, + 46640 - 44032: 0x8C71, + 46641 - 44032: 0x8C72, + 46642 - 44032: 0x8C73, + 46643 - 44032: 0x8C74, + 46644 - 44032: 0xB6CD, + 46645 - 44032: 0x8C75, + 46646 - 44032: 0x8C76, + 46647 - 44032: 0x8C77, + 46648 - 44032: 0x8C78, + 46649 - 44032: 0x8C79, + 46650 - 44032: 0x8C7A, + 46651 - 44032: 0x8C81, + 46652 - 44032: 0x8C82, + 46653 - 44032: 0x8C83, + 46654 - 44032: 0x8C84, + 46655 - 44032: 0x8C85, + 46656 - 44032: 0x8C86, + 46657 - 44032: 0x8C87, + 46658 - 44032: 0x8C88, + 46659 - 44032: 0x8C89, + 46660 - 44032: 0x8C8A, + 46661 - 44032: 0x8C8B, + 46662 - 44032: 0x8C8C, + 46663 - 44032: 0x8C8D, + 46664 - 44032: 0xB6CE, + 46665 - 44032: 0x8C8E, + 46666 - 44032: 0x8C8F, + 46667 - 44032: 0x8C90, + 46668 - 44032: 0x8C91, + 46669 - 44032: 0x8C92, + 46670 - 44032: 0x8C93, + 46671 - 44032: 0x8C94, + 46672 - 44032: 0x8C95, + 46673 - 44032: 0x8C96, + 46674 - 44032: 0x8C97, + 46675 - 44032: 0x8C98, + 46676 - 44032: 0x8C99, + 46677 - 44032: 0x8C9A, + 46678 - 44032: 0x8C9B, + 46679 - 44032: 0x8C9C, + 46680 - 44032: 0x8C9D, + 46681 - 44032: 0x8C9E, + 46682 - 44032: 0x8C9F, + 46683 - 44032: 0x8CA0, + 46684 - 44032: 0x8CA1, + 46685 - 44032: 0x8CA2, + 46686 - 44032: 0x8CA3, + 46687 - 44032: 0x8CA4, + 46688 - 44032: 0x8CA5, + 46689 - 44032: 0x8CA6, + 46690 - 44032: 0x8CA7, + 46691 - 44032: 0x8CA8, + 46692 - 44032: 0xB6CF, + 46693 - 44032: 0x8CA9, + 46694 - 44032: 0x8CAA, + 46695 - 44032: 0x8CAB, + 46696 - 44032: 0xB6D0, + 46697 - 44032: 0x8CAC, + 46698 - 44032: 0x8CAD, + 46699 - 44032: 0x8CAE, + 46700 - 44032: 0x8CAF, + 46701 - 44032: 0x8CB0, + 46702 - 44032: 0x8CB1, + 46703 - 44032: 0x8CB2, + 46704 - 44032: 0x8CB3, + 46705 - 44032: 0x8CB4, + 46706 - 44032: 0x8CB5, + 46707 - 44032: 0x8CB6, + 46708 - 44032: 0x8CB7, + 46709 - 44032: 0x8CB8, + 46710 - 44032: 0x8CB9, + 46711 - 44032: 0x8CBA, + 46712 - 44032: 0x8CBB, + 46713 - 44032: 0x8CBC, + 46714 - 44032: 0x8CBD, + 46715 - 44032: 0x8CBE, + 46716 - 44032: 0x8CBF, + 46717 - 44032: 0x8CC0, + 46718 - 44032: 0x8CC1, + 46719 - 44032: 0x8CC2, + 46720 - 44032: 0x8CC3, + 46721 - 44032: 0x8CC4, + 46722 - 44032: 0x8CC5, + 46723 - 44032: 0x8CC6, + 46724 - 44032: 0x8CC7, + 46725 - 44032: 0x8CC8, + 46726 - 44032: 0x8CC9, + 46727 - 44032: 0x8CCA, + 46728 - 44032: 0x8CCB, + 46729 - 44032: 0x8CCC, + 46730 - 44032: 0x8CCD, + 46731 - 44032: 0x8CCE, + 46732 - 44032: 0x8CCF, + 46733 - 44032: 0x8CD0, + 46734 - 44032: 0x8CD1, + 46735 - 44032: 0x8CD2, + 46736 - 44032: 0x8CD3, + 46737 - 44032: 0x8CD4, + 46738 - 44032: 0x8CD5, + 46739 - 44032: 0x8CD6, + 46740 - 44032: 0x8CD7, + 46741 - 44032: 0x8CD8, + 46742 - 44032: 0x8CD9, + 46743 - 44032: 0x8CDA, + 46744 - 44032: 0x8CDB, + 46745 - 44032: 0x8CDC, + 46746 - 44032: 0x8CDD, + 46747 - 44032: 0x8CDE, + 46748 - 44032: 0xB6D1, + 46749 - 44032: 0xB6D2, + 46750 - 44032: 0x8CDF, + 46751 - 44032: 0x8CE0, + 46752 - 44032: 0xB6D3, + 46753 - 44032: 0x8CE1, + 46754 - 44032: 0x8CE2, + 46755 - 44032: 0x8CE3, + 46756 - 44032: 0xB6D4, + 46757 - 44032: 0x8CE4, + 46758 - 44032: 0x8CE5, + 46759 - 44032: 0x8CE6, + 46760 - 44032: 0x8CE7, + 46761 - 44032: 0x8CE8, + 46762 - 44032: 0x8CE9, + 46763 - 44032: 0xB6D5, + 46764 - 44032: 0xB6D6, + 46765 - 44032: 0x8CEA, + 46766 - 44032: 0x8CEB, + 46767 - 44032: 0x8CEC, + 46768 - 44032: 0x8CED, + 46769 - 44032: 0xB6D7, + 46770 - 44032: 0x8CEE, + 46771 - 44032: 0x8CEF, + 46772 - 44032: 0x8CF0, + 46773 - 44032: 0x8CF1, + 46774 - 44032: 0x8CF2, + 46775 - 44032: 0x8CF3, + 46776 - 44032: 0x8CF4, + 46777 - 44032: 0x8CF5, + 46778 - 44032: 0x8CF6, + 46779 - 44032: 0x8CF7, + 46780 - 44032: 0x8CF8, + 46781 - 44032: 0x8CF9, + 46782 - 44032: 0x8CFA, + 46783 - 44032: 0x8CFB, + 46784 - 44032: 0x8CFC, + 46785 - 44032: 0x8CFD, + 46786 - 44032: 0x8CFE, + 46787 - 44032: 0x8D41, + 46788 - 44032: 0x8D42, + 46789 - 44032: 0x8D43, + 46790 - 44032: 0x8D44, + 46791 - 44032: 0x8D45, + 46792 - 44032: 0x8D46, + 46793 - 44032: 0x8D47, + 46794 - 44032: 0x8D48, + 46795 - 44032: 0x8D49, + 46796 - 44032: 0x8D4A, + 46797 - 44032: 0x8D4B, + 46798 - 44032: 0x8D4C, + 46799 - 44032: 0x8D4D, + 46800 - 44032: 0x8D4E, + 46801 - 44032: 0x8D4F, + 46802 - 44032: 0x8D50, + 46803 - 44032: 0x8D51, + 46804 - 44032: 0xB6D8, + 46805 - 44032: 0x8D52, + 46806 - 44032: 0x8D53, + 46807 - 44032: 0x8D54, + 46808 - 44032: 0x8D55, + 46809 - 44032: 0x8D56, + 46810 - 44032: 0x8D57, + 46811 - 44032: 0x8D58, + 46812 - 44032: 0x8D59, + 46813 - 44032: 0x8D5A, + 46814 - 44032: 0x8D61, + 46815 - 44032: 0x8D62, + 46816 - 44032: 0x8D63, + 46817 - 44032: 0x8D64, + 46818 - 44032: 0x8D65, + 46819 - 44032: 0x8D66, + 46820 - 44032: 0x8D67, + 46821 - 44032: 0x8D68, + 46822 - 44032: 0x8D69, + 46823 - 44032: 0x8D6A, + 46824 - 44032: 0x8D6B, + 46825 - 44032: 0x8D6C, + 46826 - 44032: 0x8D6D, + 46827 - 44032: 0x8D6E, + 46828 - 44032: 0x8D6F, + 46829 - 44032: 0x8D70, + 46830 - 44032: 0x8D71, + 46831 - 44032: 0x8D72, + 46832 - 44032: 0xB6D9, + 46833 - 44032: 0x8D73, + 46834 - 44032: 0x8D74, + 46835 - 44032: 0x8D75, + 46836 - 44032: 0xB6DA, + 46837 - 44032: 0x8D76, + 46838 - 44032: 0x8D77, + 46839 - 44032: 0x8D78, + 46840 - 44032: 0xB6DB, + 46841 - 44032: 0x8D79, + 46842 - 44032: 0x8D7A, + 46843 - 44032: 0x8D81, + 46844 - 44032: 0x8D82, + 46845 - 44032: 0x8D83, + 46846 - 44032: 0x8D84, + 46847 - 44032: 0x8D85, + 46848 - 44032: 0xB6DC, + 46849 - 44032: 0xB6DD, + 46850 - 44032: 0x8D86, + 46851 - 44032: 0x8D87, + 46852 - 44032: 0x8D88, + 46853 - 44032: 0xB6DE, + 46854 - 44032: 0x8D89, + 46855 - 44032: 0x8D8A, + 46856 - 44032: 0x8D8B, + 46857 - 44032: 0x8D8C, + 46858 - 44032: 0x8D8D, + 46859 - 44032: 0x8D8E, + 46860 - 44032: 0x8D8F, + 46861 - 44032: 0x8D90, + 46862 - 44032: 0x8D91, + 46863 - 44032: 0x8D92, + 46864 - 44032: 0x8D93, + 46865 - 44032: 0x8D94, + 46866 - 44032: 0x8D95, + 46867 - 44032: 0x8D96, + 46868 - 44032: 0x8D97, + 46869 - 44032: 0x8D98, + 46870 - 44032: 0x8D99, + 46871 - 44032: 0x8D9A, + 46872 - 44032: 0x8D9B, + 46873 - 44032: 0x8D9C, + 46874 - 44032: 0x8D9D, + 46875 - 44032: 0x8D9E, + 46876 - 44032: 0x8D9F, + 46877 - 44032: 0x8DA0, + 46878 - 44032: 0x8DA1, + 46879 - 44032: 0x8DA2, + 46880 - 44032: 0x8DA3, + 46881 - 44032: 0x8DA4, + 46882 - 44032: 0x8DA5, + 46883 - 44032: 0x8DA6, + 46884 - 44032: 0x8DA7, + 46885 - 44032: 0x8DA8, + 46886 - 44032: 0x8DA9, + 46887 - 44032: 0x8DAA, + 46888 - 44032: 0xB6DF, + 46889 - 44032: 0xB6E0, + 46890 - 44032: 0x8DAB, + 46891 - 44032: 0x8DAC, + 46892 - 44032: 0xB6E1, + 46893 - 44032: 0x8DAD, + 46894 - 44032: 0x8DAE, + 46895 - 44032: 0xB6E2, + 46896 - 44032: 0xB6E3, + 46897 - 44032: 0x8DAF, + 46898 - 44032: 0x8DB0, + 46899 - 44032: 0x8DB1, + 46900 - 44032: 0x8DB2, + 46901 - 44032: 0x8DB3, + 46902 - 44032: 0x8DB4, + 46903 - 44032: 0x8DB5, + 46904 - 44032: 0xB6E4, + 46905 - 44032: 0xB6E5, + 46906 - 44032: 0x8DB6, + 46907 - 44032: 0xB6E6, + 46908 - 44032: 0x8DB7, + 46909 - 44032: 0x8DB8, + 46910 - 44032: 0x8DB9, + 46911 - 44032: 0x8DBA, + 46912 - 44032: 0x8DBB, + 46913 - 44032: 0x8DBC, + 46914 - 44032: 0x8DBD, + 46915 - 44032: 0x8DBE, + 46916 - 44032: 0xB6E7, + 46917 - 44032: 0x8DBF, + 46918 - 44032: 0x8DC0, + 46919 - 44032: 0x8DC1, + 46920 - 44032: 0xB6E8, + 46921 - 44032: 0x8DC2, + 46922 - 44032: 0x8DC3, + 46923 - 44032: 0x8DC4, + 46924 - 44032: 0xB6E9, + 46925 - 44032: 0x8DC5, + 46926 - 44032: 0x8DC6, + 46927 - 44032: 0x8DC7, + 46928 - 44032: 0x8DC8, + 46929 - 44032: 0x8DC9, + 46930 - 44032: 0x8DCA, + 46931 - 44032: 0x8DCB, + 46932 - 44032: 0xB6EA, + 46933 - 44032: 0xB6EB, + 46934 - 44032: 0x8DCC, + 46935 - 44032: 0x8DCD, + 46936 - 44032: 0x8DCE, + 46937 - 44032: 0x8DCF, + 46938 - 44032: 0x8DD0, + 46939 - 44032: 0x8DD1, + 46940 - 44032: 0x8DD2, + 46941 - 44032: 0x8DD3, + 46942 - 44032: 0x8DD4, + 46943 - 44032: 0x8DD5, + 46944 - 44032: 0xB6EC, + 46945 - 44032: 0x8DD6, + 46946 - 44032: 0x8DD7, + 46947 - 44032: 0x8DD8, + 46948 - 44032: 0xB6ED, + 46949 - 44032: 0x8DD9, + 46950 - 44032: 0x8DDA, + 46951 - 44032: 0x8DDB, + 46952 - 44032: 0xB6EE, + 46953 - 44032: 0x8DDC, + 46954 - 44032: 0x8DDD, + 46955 - 44032: 0x8DDE, + 46956 - 44032: 0x8DDF, + 46957 - 44032: 0x8DE0, + 46958 - 44032: 0x8DE1, + 46959 - 44032: 0x8DE2, + 46960 - 44032: 0xB6EF, + 46961 - 44032: 0xB6F0, + 46962 - 44032: 0x8DE3, + 46963 - 44032: 0xB6F1, + 46964 - 44032: 0x8DE4, + 46965 - 44032: 0xB6F2, + 46966 - 44032: 0x8DE5, + 46967 - 44032: 0x8DE6, + 46968 - 44032: 0x8DE7, + 46969 - 44032: 0x8DE8, + 46970 - 44032: 0x8DE9, + 46971 - 44032: 0x8DEA, + 46972 - 44032: 0xB6F3, + 46973 - 44032: 0xB6F4, + 46974 - 44032: 0x8DEB, + 46975 - 44032: 0x8DEC, + 46976 - 44032: 0xB6F5, + 46977 - 44032: 0x8DED, + 46978 - 44032: 0x8DEE, + 46979 - 44032: 0x8DEF, + 46980 - 44032: 0xB6F6, + 46981 - 44032: 0x8DF0, + 46982 - 44032: 0x8DF1, + 46983 - 44032: 0x8DF2, + 46984 - 44032: 0x8DF3, + 46985 - 44032: 0x8DF4, + 46986 - 44032: 0x8DF5, + 46987 - 44032: 0x8DF6, + 46988 - 44032: 0xB6F7, + 46989 - 44032: 0xB6F8, + 46990 - 44032: 0x8DF7, + 46991 - 44032: 0xB6F9, + 46992 - 44032: 0xB6FA, + 46993 - 44032: 0xB6FB, + 46994 - 44032: 0xB6FC, + 46995 - 44032: 0x8DF8, + 46996 - 44032: 0x8DF9, + 46997 - 44032: 0x8DFA, + 46998 - 44032: 0xB6FD, + 46999 - 44032: 0xB6FE, + 47000 - 44032: 0xB7A1, + 47001 - 44032: 0xB7A2, + 47002 - 44032: 0x8DFB, + 47003 - 44032: 0x8DFC, + 47004 - 44032: 0xB7A3, + 47005 - 44032: 0x8DFD, + 47006 - 44032: 0x8DFE, + 47007 - 44032: 0x8E41, + 47008 - 44032: 0xB7A4, + 47009 - 44032: 0x8E42, + 47010 - 44032: 0x8E43, + 47011 - 44032: 0x8E44, + 47012 - 44032: 0x8E45, + 47013 - 44032: 0x8E46, + 47014 - 44032: 0x8E47, + 47015 - 44032: 0x8E48, + 47016 - 44032: 0xB7A5, + 47017 - 44032: 0xB7A6, + 47018 - 44032: 0x8E49, + 47019 - 44032: 0xB7A7, + 47020 - 44032: 0xB7A8, + 47021 - 44032: 0xB7A9, + 47022 - 44032: 0x8E4A, + 47023 - 44032: 0x8E4B, + 47024 - 44032: 0x8E4C, + 47025 - 44032: 0x8E4D, + 47026 - 44032: 0x8E4E, + 47027 - 44032: 0x8E4F, + 47028 - 44032: 0xB7AA, + 47029 - 44032: 0xB7AB, + 47030 - 44032: 0x8E50, + 47031 - 44032: 0x8E51, + 47032 - 44032: 0xB7AC, + 47033 - 44032: 0x8E52, + 47034 - 44032: 0x8E53, + 47035 - 44032: 0x8E54, + 47036 - 44032: 0x8E55, + 47037 - 44032: 0x8E56, + 47038 - 44032: 0x8E57, + 47039 - 44032: 0x8E58, + 47040 - 44032: 0x8E59, + 47041 - 44032: 0x8E5A, + 47042 - 44032: 0x8E61, + 47043 - 44032: 0x8E62, + 47044 - 44032: 0x8E63, + 47045 - 44032: 0x8E64, + 47046 - 44032: 0x8E65, + 47047 - 44032: 0xB7AD, + 47048 - 44032: 0x8E66, + 47049 - 44032: 0xB7AE, + 47050 - 44032: 0x8E67, + 47051 - 44032: 0x8E68, + 47052 - 44032: 0x8E69, + 47053 - 44032: 0x8E6A, + 47054 - 44032: 0x8E6B, + 47055 - 44032: 0x8E6C, + 47056 - 44032: 0x8E6D, + 47057 - 44032: 0x8E6E, + 47058 - 44032: 0x8E6F, + 47059 - 44032: 0x8E70, + 47060 - 44032: 0x8E71, + 47061 - 44032: 0x8E72, + 47062 - 44032: 0x8E73, + 47063 - 44032: 0x8E74, + 47064 - 44032: 0x8E75, + 47065 - 44032: 0x8E76, + 47066 - 44032: 0x8E77, + 47067 - 44032: 0x8E78, + 47068 - 44032: 0x8E79, + 47069 - 44032: 0x8E7A, + 47070 - 44032: 0x8E81, + 47071 - 44032: 0x8E82, + 47072 - 44032: 0x8E83, + 47073 - 44032: 0x8E84, + 47074 - 44032: 0x8E85, + 47075 - 44032: 0x8E86, + 47076 - 44032: 0x8E87, + 47077 - 44032: 0x8E88, + 47078 - 44032: 0x8E89, + 47079 - 44032: 0x8E8A, + 47080 - 44032: 0x8E8B, + 47081 - 44032: 0x8E8C, + 47082 - 44032: 0x8E8D, + 47083 - 44032: 0x8E8E, + 47084 - 44032: 0xB7AF, + 47085 - 44032: 0xB7B0, + 47086 - 44032: 0x8E8F, + 47087 - 44032: 0x8E90, + 47088 - 44032: 0xB7B1, + 47089 - 44032: 0x8E91, + 47090 - 44032: 0x8E92, + 47091 - 44032: 0x8E93, + 47092 - 44032: 0xB7B2, + 47093 - 44032: 0x8E94, + 47094 - 44032: 0x8E95, + 47095 - 44032: 0x8E96, + 47096 - 44032: 0x8E97, + 47097 - 44032: 0x8E98, + 47098 - 44032: 0x8E99, + 47099 - 44032: 0x8E9A, + 47100 - 44032: 0xB7B3, + 47101 - 44032: 0xB7B4, + 47102 - 44032: 0x8E9B, + 47103 - 44032: 0xB7B5, + 47104 - 44032: 0xB7B6, + 47105 - 44032: 0xB7B7, + 47106 - 44032: 0x8E9C, + 47107 - 44032: 0x8E9D, + 47108 - 44032: 0x8E9E, + 47109 - 44032: 0x8E9F, + 47110 - 44032: 0x8EA0, + 47111 - 44032: 0xB7B8, + 47112 - 44032: 0xB7B9, + 47113 - 44032: 0xB7BA, + 47114 - 44032: 0x8EA1, + 47115 - 44032: 0x8EA2, + 47116 - 44032: 0xB7BB, + 47117 - 44032: 0x8EA3, + 47118 - 44032: 0x8EA4, + 47119 - 44032: 0x8EA5, + 47120 - 44032: 0xB7BC, + 47121 - 44032: 0x8EA6, + 47122 - 44032: 0x8EA7, + 47123 - 44032: 0x8EA8, + 47124 - 44032: 0x8EA9, + 47125 - 44032: 0x8EAA, + 47126 - 44032: 0x8EAB, + 47127 - 44032: 0x8EAC, + 47128 - 44032: 0xB7BD, + 47129 - 44032: 0xB7BE, + 47130 - 44032: 0x8EAD, + 47131 - 44032: 0xB7BF, + 47132 - 44032: 0x8EAE, + 47133 - 44032: 0xB7C0, + 47134 - 44032: 0x8EAF, + 47135 - 44032: 0x8EB0, + 47136 - 44032: 0x8EB1, + 47137 - 44032: 0x8EB2, + 47138 - 44032: 0x8EB3, + 47139 - 44032: 0x8EB4, + 47140 - 44032: 0xB7C1, + 47141 - 44032: 0xB7C2, + 47142 - 44032: 0x8EB5, + 47143 - 44032: 0x8EB6, + 47144 - 44032: 0xB7C3, + 47145 - 44032: 0x8EB7, + 47146 - 44032: 0x8EB8, + 47147 - 44032: 0x8EB9, + 47148 - 44032: 0xB7C4, + 47149 - 44032: 0x8EBA, + 47150 - 44032: 0x8EBB, + 47151 - 44032: 0x8EBC, + 47152 - 44032: 0x8EBD, + 47153 - 44032: 0x8EBE, + 47154 - 44032: 0x8EBF, + 47155 - 44032: 0x8EC0, + 47156 - 44032: 0xB7C5, + 47157 - 44032: 0xB7C6, + 47158 - 44032: 0x8EC1, + 47159 - 44032: 0xB7C7, + 47160 - 44032: 0xB7C8, + 47161 - 44032: 0xB7C9, + 47162 - 44032: 0x8EC2, + 47163 - 44032: 0x8EC3, + 47164 - 44032: 0x8EC4, + 47165 - 44032: 0x8EC5, + 47166 - 44032: 0x8EC6, + 47167 - 44032: 0x8EC7, + 47168 - 44032: 0xB7CA, + 47169 - 44032: 0x8EC8, + 47170 - 44032: 0x8EC9, + 47171 - 44032: 0x8ECA, + 47172 - 44032: 0xB7CB, + 47173 - 44032: 0x8ECB, + 47174 - 44032: 0x8ECC, + 47175 - 44032: 0x8ECD, + 47176 - 44032: 0x8ECE, + 47177 - 44032: 0x8ECF, + 47178 - 44032: 0x8ED0, + 47179 - 44032: 0x8ED1, + 47180 - 44032: 0x8ED2, + 47181 - 44032: 0x8ED3, + 47182 - 44032: 0x8ED4, + 47183 - 44032: 0x8ED5, + 47184 - 44032: 0x8ED6, + 47185 - 44032: 0xB7CC, + 47186 - 44032: 0x8ED7, + 47187 - 44032: 0xB7CD, + 47188 - 44032: 0x8ED8, + 47189 - 44032: 0x8ED9, + 47190 - 44032: 0x8EDA, + 47191 - 44032: 0x8EDB, + 47192 - 44032: 0x8EDC, + 47193 - 44032: 0x8EDD, + 47194 - 44032: 0x8EDE, + 47195 - 44032: 0x8EDF, + 47196 - 44032: 0xB7CE, + 47197 - 44032: 0xB7CF, + 47198 - 44032: 0x8EE0, + 47199 - 44032: 0x8EE1, + 47200 - 44032: 0xB7D0, + 47201 - 44032: 0x8EE2, + 47202 - 44032: 0x8EE3, + 47203 - 44032: 0x8EE4, + 47204 - 44032: 0xB7D1, + 47205 - 44032: 0x8EE5, + 47206 - 44032: 0x8EE6, + 47207 - 44032: 0x8EE7, + 47208 - 44032: 0x8EE8, + 47209 - 44032: 0x8EE9, + 47210 - 44032: 0x8EEA, + 47211 - 44032: 0x8EEB, + 47212 - 44032: 0xB7D2, + 47213 - 44032: 0xB7D3, + 47214 - 44032: 0x8EEC, + 47215 - 44032: 0xB7D4, + 47216 - 44032: 0x8EED, + 47217 - 44032: 0xB7D5, + 47218 - 44032: 0x8EEE, + 47219 - 44032: 0x8EEF, + 47220 - 44032: 0x8EF0, + 47221 - 44032: 0x8EF1, + 47222 - 44032: 0x8EF2, + 47223 - 44032: 0x8EF3, + 47224 - 44032: 0xB7D6, + 47225 - 44032: 0x8EF4, + 47226 - 44032: 0x8EF5, + 47227 - 44032: 0x8EF6, + 47228 - 44032: 0xB7D7, + 47229 - 44032: 0x8EF7, + 47230 - 44032: 0x8EF8, + 47231 - 44032: 0x8EF9, + 47232 - 44032: 0x8EFA, + 47233 - 44032: 0x8EFB, + 47234 - 44032: 0x8EFC, + 47235 - 44032: 0x8EFD, + 47236 - 44032: 0x8EFE, + 47237 - 44032: 0x8F41, + 47238 - 44032: 0x8F42, + 47239 - 44032: 0x8F43, + 47240 - 44032: 0x8F44, + 47241 - 44032: 0x8F45, + 47242 - 44032: 0x8F46, + 47243 - 44032: 0x8F47, + 47244 - 44032: 0x8F48, + 47245 - 44032: 0xB7D8, + 47246 - 44032: 0x8F49, + 47247 - 44032: 0x8F4A, + 47248 - 44032: 0x8F4B, + 47249 - 44032: 0x8F4C, + 47250 - 44032: 0x8F4D, + 47251 - 44032: 0x8F4E, + 47252 - 44032: 0x8F4F, + 47253 - 44032: 0x8F50, + 47254 - 44032: 0x8F51, + 47255 - 44032: 0x8F52, + 47256 - 44032: 0x8F53, + 47257 - 44032: 0x8F54, + 47258 - 44032: 0x8F55, + 47259 - 44032: 0x8F56, + 47260 - 44032: 0x8F57, + 47261 - 44032: 0x8F58, + 47262 - 44032: 0x8F59, + 47263 - 44032: 0x8F5A, + 47264 - 44032: 0x8F61, + 47265 - 44032: 0x8F62, + 47266 - 44032: 0x8F63, + 47267 - 44032: 0x8F64, + 47268 - 44032: 0x8F65, + 47269 - 44032: 0x8F66, + 47270 - 44032: 0x8F67, + 47271 - 44032: 0x8F68, + 47272 - 44032: 0xB7D9, + 47273 - 44032: 0x8F69, + 47274 - 44032: 0x8F6A, + 47275 - 44032: 0x8F6B, + 47276 - 44032: 0x8F6C, + 47277 - 44032: 0x8F6D, + 47278 - 44032: 0x8F6E, + 47279 - 44032: 0x8F6F, + 47280 - 44032: 0xB7DA, + 47281 - 44032: 0x8F70, + 47282 - 44032: 0x8F71, + 47283 - 44032: 0x8F72, + 47284 - 44032: 0xB7DB, + 47285 - 44032: 0x8F73, + 47286 - 44032: 0x8F74, + 47287 - 44032: 0x8F75, + 47288 - 44032: 0xB7DC, + 47289 - 44032: 0x8F76, + 47290 - 44032: 0x8F77, + 47291 - 44032: 0x8F78, + 47292 - 44032: 0x8F79, + 47293 - 44032: 0x8F7A, + 47294 - 44032: 0x8F81, + 47295 - 44032: 0x8F82, + 47296 - 44032: 0xB7DD, + 47297 - 44032: 0xB7DE, + 47298 - 44032: 0x8F83, + 47299 - 44032: 0xB7DF, + 47300 - 44032: 0x8F84, + 47301 - 44032: 0xB7E0, + 47302 - 44032: 0x8F85, + 47303 - 44032: 0x8F86, + 47304 - 44032: 0x8F87, + 47305 - 44032: 0x8F88, + 47306 - 44032: 0x8F89, + 47307 - 44032: 0x8F8A, + 47308 - 44032: 0xB7E1, + 47309 - 44032: 0x8F8B, + 47310 - 44032: 0x8F8C, + 47311 - 44032: 0x8F8D, + 47312 - 44032: 0xB7E2, + 47313 - 44032: 0x8F8E, + 47314 - 44032: 0x8F8F, + 47315 - 44032: 0x8F90, + 47316 - 44032: 0xB7E3, + 47317 - 44032: 0x8F91, + 47318 - 44032: 0x8F92, + 47319 - 44032: 0x8F93, + 47320 - 44032: 0x8F94, + 47321 - 44032: 0x8F95, + 47322 - 44032: 0x8F96, + 47323 - 44032: 0x8F97, + 47324 - 44032: 0x8F98, + 47325 - 44032: 0xB7E4, + 47326 - 44032: 0x8F99, + 47327 - 44032: 0xB7E5, + 47328 - 44032: 0x8F9A, + 47329 - 44032: 0xB7E6, + 47330 - 44032: 0x8F9B, + 47331 - 44032: 0x8F9C, + 47332 - 44032: 0x8F9D, + 47333 - 44032: 0x8F9E, + 47334 - 44032: 0x8F9F, + 47335 - 44032: 0x8FA0, + 47336 - 44032: 0xB7E7, + 47337 - 44032: 0xB7E8, + 47338 - 44032: 0x8FA1, + 47339 - 44032: 0x8FA2, + 47340 - 44032: 0xB7E9, + 47341 - 44032: 0x8FA3, + 47342 - 44032: 0x8FA4, + 47343 - 44032: 0x8FA5, + 47344 - 44032: 0xB7EA, + 47345 - 44032: 0x8FA6, + 47346 - 44032: 0x8FA7, + 47347 - 44032: 0x8FA8, + 47348 - 44032: 0x8FA9, + 47349 - 44032: 0x8FAA, + 47350 - 44032: 0x8FAB, + 47351 - 44032: 0x8FAC, + 47352 - 44032: 0xB7EB, + 47353 - 44032: 0xB7EC, + 47354 - 44032: 0x8FAD, + 47355 - 44032: 0xB7ED, + 47356 - 44032: 0x8FAE, + 47357 - 44032: 0xB7EE, + 47358 - 44032: 0x8FAF, + 47359 - 44032: 0x8FB0, + 47360 - 44032: 0x8FB1, + 47361 - 44032: 0x8FB2, + 47362 - 44032: 0x8FB3, + 47363 - 44032: 0x8FB4, + 47364 - 44032: 0xB7EF, + 47365 - 44032: 0x8FB5, + 47366 - 44032: 0x8FB6, + 47367 - 44032: 0x8FB7, + 47368 - 44032: 0x8FB8, + 47369 - 44032: 0x8FB9, + 47370 - 44032: 0x8FBA, + 47371 - 44032: 0x8FBB, + 47372 - 44032: 0x8FBC, + 47373 - 44032: 0x8FBD, + 47374 - 44032: 0x8FBE, + 47375 - 44032: 0x8FBF, + 47376 - 44032: 0x8FC0, + 47377 - 44032: 0x8FC1, + 47378 - 44032: 0x8FC2, + 47379 - 44032: 0x8FC3, + 47380 - 44032: 0x8FC4, + 47381 - 44032: 0x8FC5, + 47382 - 44032: 0x8FC6, + 47383 - 44032: 0x8FC7, + 47384 - 44032: 0xB7F0, + 47385 - 44032: 0x8FC8, + 47386 - 44032: 0x8FC9, + 47387 - 44032: 0x8FCA, + 47388 - 44032: 0x8FCB, + 47389 - 44032: 0x8FCC, + 47390 - 44032: 0x8FCD, + 47391 - 44032: 0x8FCE, + 47392 - 44032: 0xB7F1, + 47393 - 44032: 0x8FCF, + 47394 - 44032: 0x8FD0, + 47395 - 44032: 0x8FD1, + 47396 - 44032: 0x8FD2, + 47397 - 44032: 0x8FD3, + 47398 - 44032: 0x8FD4, + 47399 - 44032: 0x8FD5, + 47400 - 44032: 0x8FD6, + 47401 - 44032: 0x8FD7, + 47402 - 44032: 0x8FD8, + 47403 - 44032: 0x8FD9, + 47404 - 44032: 0x8FDA, + 47405 - 44032: 0x8FDB, + 47406 - 44032: 0x8FDC, + 47407 - 44032: 0x8FDD, + 47408 - 44032: 0x8FDE, + 47409 - 44032: 0x8FDF, + 47410 - 44032: 0x8FE0, + 47411 - 44032: 0x8FE1, + 47412 - 44032: 0x8FE2, + 47413 - 44032: 0x8FE3, + 47414 - 44032: 0x8FE4, + 47415 - 44032: 0x8FE5, + 47416 - 44032: 0x8FE6, + 47417 - 44032: 0x8FE7, + 47418 - 44032: 0x8FE8, + 47419 - 44032: 0x8FE9, + 47420 - 44032: 0xB7F2, + 47421 - 44032: 0xB7F3, + 47422 - 44032: 0x8FEA, + 47423 - 44032: 0x8FEB, + 47424 - 44032: 0xB7F4, + 47425 - 44032: 0x8FEC, + 47426 - 44032: 0x8FED, + 47427 - 44032: 0x8FEE, + 47428 - 44032: 0xB7F5, + 47429 - 44032: 0x8FEF, + 47430 - 44032: 0x8FF0, + 47431 - 44032: 0x8FF1, + 47432 - 44032: 0x8FF2, + 47433 - 44032: 0x8FF3, + 47434 - 44032: 0x8FF4, + 47435 - 44032: 0x8FF5, + 47436 - 44032: 0xB7F6, + 47437 - 44032: 0x8FF6, + 47438 - 44032: 0x8FF7, + 47439 - 44032: 0xB7F7, + 47440 - 44032: 0x8FF8, + 47441 - 44032: 0xB7F8, + 47442 - 44032: 0x8FF9, + 47443 - 44032: 0x8FFA, + 47444 - 44032: 0x8FFB, + 47445 - 44032: 0x8FFC, + 47446 - 44032: 0x8FFD, + 47447 - 44032: 0x8FFE, + 47448 - 44032: 0xB7F9, + 47449 - 44032: 0xB7FA, + 47450 - 44032: 0x9041, + 47451 - 44032: 0x9042, + 47452 - 44032: 0xB7FB, + 47453 - 44032: 0x9043, + 47454 - 44032: 0x9044, + 47455 - 44032: 0x9045, + 47456 - 44032: 0xB7FC, + 47457 - 44032: 0x9046, + 47458 - 44032: 0x9047, + 47459 - 44032: 0x9048, + 47460 - 44032: 0x9049, + 47461 - 44032: 0x904A, + 47462 - 44032: 0x904B, + 47463 - 44032: 0x904C, + 47464 - 44032: 0xB7FD, + 47465 - 44032: 0xB7FE, + 47466 - 44032: 0x904D, + 47467 - 44032: 0xB8A1, + 47468 - 44032: 0x904E, + 47469 - 44032: 0xB8A2, + 47470 - 44032: 0x904F, + 47471 - 44032: 0x9050, + 47472 - 44032: 0x9051, + 47473 - 44032: 0x9052, + 47474 - 44032: 0x9053, + 47475 - 44032: 0x9054, + 47476 - 44032: 0xB8A3, + 47477 - 44032: 0xB8A4, + 47478 - 44032: 0x9055, + 47479 - 44032: 0x9056, + 47480 - 44032: 0xB8A5, + 47481 - 44032: 0x9057, + 47482 - 44032: 0x9058, + 47483 - 44032: 0x9059, + 47484 - 44032: 0xB8A6, + 47485 - 44032: 0x905A, + 47486 - 44032: 0x9061, + 47487 - 44032: 0x9062, + 47488 - 44032: 0x9063, + 47489 - 44032: 0x9064, + 47490 - 44032: 0x9065, + 47491 - 44032: 0x9066, + 47492 - 44032: 0xB8A7, + 47493 - 44032: 0xB8A8, + 47494 - 44032: 0x9067, + 47495 - 44032: 0xB8A9, + 47496 - 44032: 0x9068, + 47497 - 44032: 0xB8AA, + 47498 - 44032: 0xB8AB, + 47499 - 44032: 0x9069, + 47500 - 44032: 0x906A, + 47501 - 44032: 0xB8AC, + 47502 - 44032: 0xB8AD, + 47503 - 44032: 0x906B, + 47504 - 44032: 0x906C, + 47505 - 44032: 0x906D, + 47506 - 44032: 0x906E, + 47507 - 44032: 0x906F, + 47508 - 44032: 0x9070, + 47509 - 44032: 0x9071, + 47510 - 44032: 0x9072, + 47511 - 44032: 0x9073, + 47512 - 44032: 0x9074, + 47513 - 44032: 0x9075, + 47514 - 44032: 0x9076, + 47515 - 44032: 0x9077, + 47516 - 44032: 0x9078, + 47517 - 44032: 0x9079, + 47518 - 44032: 0x907A, + 47519 - 44032: 0x9081, + 47520 - 44032: 0x9082, + 47521 - 44032: 0x9083, + 47522 - 44032: 0x9084, + 47523 - 44032: 0x9085, + 47524 - 44032: 0x9086, + 47525 - 44032: 0x9087, + 47526 - 44032: 0x9088, + 47527 - 44032: 0x9089, + 47528 - 44032: 0x908A, + 47529 - 44032: 0x908B, + 47530 - 44032: 0x908C, + 47531 - 44032: 0x908D, + 47532 - 44032: 0xB8AE, + 47533 - 44032: 0xB8AF, + 47534 - 44032: 0x908E, + 47535 - 44032: 0x908F, + 47536 - 44032: 0xB8B0, + 47537 - 44032: 0x9090, + 47538 - 44032: 0x9091, + 47539 - 44032: 0x9092, + 47540 - 44032: 0xB8B1, + 47541 - 44032: 0x9093, + 47542 - 44032: 0x9094, + 47543 - 44032: 0x9095, + 47544 - 44032: 0x9096, + 47545 - 44032: 0x9097, + 47546 - 44032: 0x9098, + 47547 - 44032: 0x9099, + 47548 - 44032: 0xB8B2, + 47549 - 44032: 0xB8B3, + 47550 - 44032: 0x909A, + 47551 - 44032: 0xB8B4, + 47552 - 44032: 0x909B, + 47553 - 44032: 0xB8B5, + 47554 - 44032: 0x909C, + 47555 - 44032: 0x909D, + 47556 - 44032: 0x909E, + 47557 - 44032: 0x909F, + 47558 - 44032: 0x90A0, + 47559 - 44032: 0x90A1, + 47560 - 44032: 0xB8B6, + 47561 - 44032: 0xB8B7, + 47562 - 44032: 0x90A2, + 47563 - 44032: 0x90A3, + 47564 - 44032: 0xB8B8, + 47565 - 44032: 0x90A4, + 47566 - 44032: 0xB8B9, + 47567 - 44032: 0xB8BA, + 47568 - 44032: 0xB8BB, + 47569 - 44032: 0xB8BC, + 47570 - 44032: 0xB8BD, + 47571 - 44032: 0x90A5, + 47572 - 44032: 0x90A6, + 47573 - 44032: 0x90A7, + 47574 - 44032: 0x90A8, + 47575 - 44032: 0x90A9, + 47576 - 44032: 0xB8BE, + 47577 - 44032: 0xB8BF, + 47578 - 44032: 0x90AA, + 47579 - 44032: 0xB8C0, + 47580 - 44032: 0x90AB, + 47581 - 44032: 0xB8C1, + 47582 - 44032: 0xB8C2, + 47583 - 44032: 0x90AC, + 47584 - 44032: 0x90AD, + 47585 - 44032: 0xB8C3, + 47586 - 44032: 0x90AE, + 47587 - 44032: 0xB8C4, + 47588 - 44032: 0xB8C5, + 47589 - 44032: 0xB8C6, + 47590 - 44032: 0x90AF, + 47591 - 44032: 0x90B0, + 47592 - 44032: 0xB8C7, + 47593 - 44032: 0x90B1, + 47594 - 44032: 0x90B2, + 47595 - 44032: 0x90B3, + 47596 - 44032: 0xB8C8, + 47597 - 44032: 0x90B4, + 47598 - 44032: 0x90B5, + 47599 - 44032: 0x90B6, + 47600 - 44032: 0x90B7, + 47601 - 44032: 0x90B8, + 47602 - 44032: 0x90B9, + 47603 - 44032: 0x90BA, + 47604 - 44032: 0xB8C9, + 47605 - 44032: 0xB8CA, + 47606 - 44032: 0x90BB, + 47607 - 44032: 0xB8CB, + 47608 - 44032: 0xB8CC, + 47609 - 44032: 0xB8CD, + 47610 - 44032: 0xB8CE, + 47611 - 44032: 0x90BC, + 47612 - 44032: 0x90BD, + 47613 - 44032: 0x90BE, + 47614 - 44032: 0x90BF, + 47615 - 44032: 0x90C0, + 47616 - 44032: 0xB8CF, + 47617 - 44032: 0xB8D0, + 47618 - 44032: 0x90C1, + 47619 - 44032: 0x90C2, + 47620 - 44032: 0x90C3, + 47621 - 44032: 0x90C4, + 47622 - 44032: 0x90C5, + 47623 - 44032: 0x90C6, + 47624 - 44032: 0xB8D1, + 47625 - 44032: 0x90C7, + 47626 - 44032: 0x90C8, + 47627 - 44032: 0x90C9, + 47628 - 44032: 0x90CA, + 47629 - 44032: 0x90CB, + 47630 - 44032: 0x90CC, + 47631 - 44032: 0x90CD, + 47632 - 44032: 0x90CE, + 47633 - 44032: 0x90CF, + 47634 - 44032: 0x90D0, + 47635 - 44032: 0x90D1, + 47636 - 44032: 0x90D2, + 47637 - 44032: 0xB8D2, + 47638 - 44032: 0x90D3, + 47639 - 44032: 0x90D4, + 47640 - 44032: 0x90D5, + 47641 - 44032: 0x90D6, + 47642 - 44032: 0x90D7, + 47643 - 44032: 0x90D8, + 47644 - 44032: 0x90D9, + 47645 - 44032: 0x90DA, + 47646 - 44032: 0x90DB, + 47647 - 44032: 0x90DC, + 47648 - 44032: 0x90DD, + 47649 - 44032: 0x90DE, + 47650 - 44032: 0x90DF, + 47651 - 44032: 0x90E0, + 47652 - 44032: 0x90E1, + 47653 - 44032: 0x90E2, + 47654 - 44032: 0x90E3, + 47655 - 44032: 0x90E4, + 47656 - 44032: 0x90E5, + 47657 - 44032: 0x90E6, + 47658 - 44032: 0x90E7, + 47659 - 44032: 0x90E8, + 47660 - 44032: 0x90E9, + 47661 - 44032: 0x90EA, + 47662 - 44032: 0x90EB, + 47663 - 44032: 0x90EC, + 47664 - 44032: 0x90ED, + 47665 - 44032: 0x90EE, + 47666 - 44032: 0x90EF, + 47667 - 44032: 0x90F0, + 47668 - 44032: 0x90F1, + 47669 - 44032: 0x90F2, + 47670 - 44032: 0x90F3, + 47671 - 44032: 0x90F4, + 47672 - 44032: 0xB8D3, + 47673 - 44032: 0xB8D4, + 47674 - 44032: 0x90F5, + 47675 - 44032: 0x90F6, + 47676 - 44032: 0xB8D5, + 47677 - 44032: 0x90F7, + 47678 - 44032: 0x90F8, + 47679 - 44032: 0x90F9, + 47680 - 44032: 0xB8D6, + 47681 - 44032: 0x90FA, + 47682 - 44032: 0xB8D7, + 47683 - 44032: 0x90FB, + 47684 - 44032: 0x90FC, + 47685 - 44032: 0x90FD, + 47686 - 44032: 0x90FE, + 47687 - 44032: 0x9141, + 47688 - 44032: 0xB8D8, + 47689 - 44032: 0xB8D9, + 47690 - 44032: 0x9142, + 47691 - 44032: 0xB8DA, + 47692 - 44032: 0x9143, + 47693 - 44032: 0xB8DB, + 47694 - 44032: 0xB8DC, + 47695 - 44032: 0x9144, + 47696 - 44032: 0x9145, + 47697 - 44032: 0x9146, + 47698 - 44032: 0x9147, + 47699 - 44032: 0xB8DD, + 47700 - 44032: 0xB8DE, + 47701 - 44032: 0xB8DF, + 47702 - 44032: 0x9148, + 47703 - 44032: 0x9149, + 47704 - 44032: 0xB8E0, + 47705 - 44032: 0x914A, + 47706 - 44032: 0x914B, + 47707 - 44032: 0x914C, + 47708 - 44032: 0xB8E1, + 47709 - 44032: 0x914D, + 47710 - 44032: 0x914E, + 47711 - 44032: 0x914F, + 47712 - 44032: 0x9150, + 47713 - 44032: 0x9151, + 47714 - 44032: 0x9152, + 47715 - 44032: 0x9153, + 47716 - 44032: 0xB8E2, + 47717 - 44032: 0xB8E3, + 47718 - 44032: 0x9154, + 47719 - 44032: 0xB8E4, + 47720 - 44032: 0xB8E5, + 47721 - 44032: 0xB8E6, + 47722 - 44032: 0x9155, + 47723 - 44032: 0x9156, + 47724 - 44032: 0x9157, + 47725 - 44032: 0x9158, + 47726 - 44032: 0x9159, + 47727 - 44032: 0x915A, + 47728 - 44032: 0xB8E7, + 47729 - 44032: 0xB8E8, + 47730 - 44032: 0x9161, + 47731 - 44032: 0x9162, + 47732 - 44032: 0xB8E9, + 47733 - 44032: 0x9163, + 47734 - 44032: 0x9164, + 47735 - 44032: 0x9165, + 47736 - 44032: 0xB8EA, + 47737 - 44032: 0x9166, + 47738 - 44032: 0x9167, + 47739 - 44032: 0x9168, + 47740 - 44032: 0x9169, + 47741 - 44032: 0x916A, + 47742 - 44032: 0x916B, + 47743 - 44032: 0x916C, + 47744 - 44032: 0x916D, + 47745 - 44032: 0x916E, + 47746 - 44032: 0x916F, + 47747 - 44032: 0xB8EB, + 47748 - 44032: 0xB8EC, + 47749 - 44032: 0xB8ED, + 47750 - 44032: 0x9170, + 47751 - 44032: 0xB8EE, + 47752 - 44032: 0x9171, + 47753 - 44032: 0x9172, + 47754 - 44032: 0x9173, + 47755 - 44032: 0x9174, + 47756 - 44032: 0xB8EF, + 47757 - 44032: 0x9175, + 47758 - 44032: 0x9176, + 47759 - 44032: 0x9177, + 47760 - 44032: 0x9178, + 47761 - 44032: 0x9179, + 47762 - 44032: 0x917A, + 47763 - 44032: 0x9181, + 47764 - 44032: 0x9182, + 47765 - 44032: 0x9183, + 47766 - 44032: 0x9184, + 47767 - 44032: 0x9185, + 47768 - 44032: 0x9186, + 47769 - 44032: 0x9187, + 47770 - 44032: 0x9188, + 47771 - 44032: 0x9189, + 47772 - 44032: 0x918A, + 47773 - 44032: 0x918B, + 47774 - 44032: 0x918C, + 47775 - 44032: 0x918D, + 47776 - 44032: 0x918E, + 47777 - 44032: 0x918F, + 47778 - 44032: 0x9190, + 47779 - 44032: 0x9191, + 47780 - 44032: 0x9192, + 47781 - 44032: 0x9193, + 47782 - 44032: 0x9194, + 47783 - 44032: 0x9195, + 47784 - 44032: 0xB8F0, + 47785 - 44032: 0xB8F1, + 47786 - 44032: 0x9196, + 47787 - 44032: 0xB8F2, + 47788 - 44032: 0xB8F3, + 47789 - 44032: 0x9197, + 47790 - 44032: 0x9198, + 47791 - 44032: 0x9199, + 47792 - 44032: 0xB8F4, + 47793 - 44032: 0x919A, + 47794 - 44032: 0xB8F5, + 47795 - 44032: 0x919B, + 47796 - 44032: 0x919C, + 47797 - 44032: 0x919D, + 47798 - 44032: 0x919E, + 47799 - 44032: 0x919F, + 47800 - 44032: 0xB8F6, + 47801 - 44032: 0xB8F7, + 47802 - 44032: 0x91A0, + 47803 - 44032: 0xB8F8, + 47804 - 44032: 0x91A1, + 47805 - 44032: 0xB8F9, + 47806 - 44032: 0x91A2, + 47807 - 44032: 0x91A3, + 47808 - 44032: 0x91A4, + 47809 - 44032: 0x91A5, + 47810 - 44032: 0x91A6, + 47811 - 44032: 0x91A7, + 47812 - 44032: 0xB8FA, + 47813 - 44032: 0x91A8, + 47814 - 44032: 0x91A9, + 47815 - 44032: 0x91AA, + 47816 - 44032: 0xB8FB, + 47817 - 44032: 0x91AB, + 47818 - 44032: 0x91AC, + 47819 - 44032: 0x91AD, + 47820 - 44032: 0x91AE, + 47821 - 44032: 0x91AF, + 47822 - 44032: 0x91B0, + 47823 - 44032: 0x91B1, + 47824 - 44032: 0x91B2, + 47825 - 44032: 0x91B3, + 47826 - 44032: 0x91B4, + 47827 - 44032: 0x91B5, + 47828 - 44032: 0x91B6, + 47829 - 44032: 0x91B7, + 47830 - 44032: 0x91B8, + 47831 - 44032: 0x91B9, + 47832 - 44032: 0xB8FC, + 47833 - 44032: 0xB8FD, + 47834 - 44032: 0x91BA, + 47835 - 44032: 0x91BB, + 47836 - 44032: 0x91BC, + 47837 - 44032: 0x91BD, + 47838 - 44032: 0x91BE, + 47839 - 44032: 0x91BF, + 47840 - 44032: 0x91C0, + 47841 - 44032: 0x91C1, + 47842 - 44032: 0x91C2, + 47843 - 44032: 0x91C3, + 47844 - 44032: 0x91C4, + 47845 - 44032: 0x91C5, + 47846 - 44032: 0x91C6, + 47847 - 44032: 0x91C7, + 47848 - 44032: 0x91C8, + 47849 - 44032: 0x91C9, + 47850 - 44032: 0x91CA, + 47851 - 44032: 0x91CB, + 47852 - 44032: 0x91CC, + 47853 - 44032: 0x91CD, + 47854 - 44032: 0x91CE, + 47855 - 44032: 0x91CF, + 47856 - 44032: 0x91D0, + 47857 - 44032: 0x91D1, + 47858 - 44032: 0x91D2, + 47859 - 44032: 0x91D3, + 47860 - 44032: 0x91D4, + 47861 - 44032: 0x91D5, + 47862 - 44032: 0x91D6, + 47863 - 44032: 0x91D7, + 47864 - 44032: 0x91D8, + 47865 - 44032: 0x91D9, + 47866 - 44032: 0x91DA, + 47867 - 44032: 0x91DB, + 47868 - 44032: 0xB8FE, + 47869 - 44032: 0x91DC, + 47870 - 44032: 0x91DD, + 47871 - 44032: 0x91DE, + 47872 - 44032: 0xB9A1, + 47873 - 44032: 0x91DF, + 47874 - 44032: 0x91E0, + 47875 - 44032: 0x91E1, + 47876 - 44032: 0xB9A2, + 47877 - 44032: 0x91E2, + 47878 - 44032: 0x91E3, + 47879 - 44032: 0x91E4, + 47880 - 44032: 0x91E5, + 47881 - 44032: 0x91E6, + 47882 - 44032: 0x91E7, + 47883 - 44032: 0x91E8, + 47884 - 44032: 0x91E9, + 47885 - 44032: 0xB9A3, + 47886 - 44032: 0x91EA, + 47887 - 44032: 0xB9A4, + 47888 - 44032: 0x91EB, + 47889 - 44032: 0xB9A5, + 47890 - 44032: 0x91EC, + 47891 - 44032: 0x91ED, + 47892 - 44032: 0x91EE, + 47893 - 44032: 0x91EF, + 47894 - 44032: 0x91F0, + 47895 - 44032: 0x91F1, + 47896 - 44032: 0xB9A6, + 47897 - 44032: 0x91F2, + 47898 - 44032: 0x91F3, + 47899 - 44032: 0x91F4, + 47900 - 44032: 0xB9A7, + 47901 - 44032: 0x91F5, + 47902 - 44032: 0x91F6, + 47903 - 44032: 0x91F7, + 47904 - 44032: 0xB9A8, + 47905 - 44032: 0x91F8, + 47906 - 44032: 0x91F9, + 47907 - 44032: 0x91FA, + 47908 - 44032: 0x91FB, + 47909 - 44032: 0x91FC, + 47910 - 44032: 0x91FD, + 47911 - 44032: 0x91FE, + 47912 - 44032: 0x9241, + 47913 - 44032: 0xB9A9, + 47914 - 44032: 0x9242, + 47915 - 44032: 0xB9AA, + 47916 - 44032: 0x9243, + 47917 - 44032: 0x9244, + 47918 - 44032: 0x9245, + 47919 - 44032: 0x9246, + 47920 - 44032: 0x9247, + 47921 - 44032: 0x9248, + 47922 - 44032: 0x9249, + 47923 - 44032: 0x924A, + 47924 - 44032: 0xB9AB, + 47925 - 44032: 0xB9AC, + 47926 - 44032: 0xB9AD, + 47927 - 44032: 0x924B, + 47928 - 44032: 0xB9AE, + 47929 - 44032: 0x924C, + 47930 - 44032: 0x924D, + 47931 - 44032: 0xB9AF, + 47932 - 44032: 0xB9B0, + 47933 - 44032: 0xB9B1, + 47934 - 44032: 0xB9B2, + 47935 - 44032: 0x924E, + 47936 - 44032: 0x924F, + 47937 - 44032: 0x9250, + 47938 - 44032: 0x9251, + 47939 - 44032: 0x9252, + 47940 - 44032: 0xB9B3, + 47941 - 44032: 0xB9B4, + 47942 - 44032: 0x9253, + 47943 - 44032: 0xB9B5, + 47944 - 44032: 0x9254, + 47945 - 44032: 0xB9B6, + 47946 - 44032: 0x9255, + 47947 - 44032: 0x9256, + 47948 - 44032: 0x9257, + 47949 - 44032: 0xB9B7, + 47950 - 44032: 0x9258, + 47951 - 44032: 0xB9B8, + 47952 - 44032: 0xB9B9, + 47953 - 44032: 0x9259, + 47954 - 44032: 0x925A, + 47955 - 44032: 0x9261, + 47956 - 44032: 0xB9BA, + 47957 - 44032: 0x9262, + 47958 - 44032: 0x9263, + 47959 - 44032: 0x9264, + 47960 - 44032: 0xB9BB, + 47961 - 44032: 0x9265, + 47962 - 44032: 0x9266, + 47963 - 44032: 0x9267, + 47964 - 44032: 0x9268, + 47965 - 44032: 0x9269, + 47966 - 44032: 0x926A, + 47967 - 44032: 0x926B, + 47968 - 44032: 0x926C, + 47969 - 44032: 0xB9BC, + 47970 - 44032: 0x926D, + 47971 - 44032: 0xB9BD, + 47972 - 44032: 0x926E, + 47973 - 44032: 0x926F, + 47974 - 44032: 0x9270, + 47975 - 44032: 0x9271, + 47976 - 44032: 0x9272, + 47977 - 44032: 0x9273, + 47978 - 44032: 0x9274, + 47979 - 44032: 0x9275, + 47980 - 44032: 0xB9BE, + 47981 - 44032: 0x9276, + 47982 - 44032: 0x9277, + 47983 - 44032: 0x9278, + 47984 - 44032: 0x9279, + 47985 - 44032: 0x927A, + 47986 - 44032: 0x9281, + 47987 - 44032: 0x9282, + 47988 - 44032: 0x9283, + 47989 - 44032: 0x9284, + 47990 - 44032: 0x9285, + 47991 - 44032: 0x9286, + 47992 - 44032: 0x9287, + 47993 - 44032: 0x9288, + 47994 - 44032: 0x9289, + 47995 - 44032: 0x928A, + 47996 - 44032: 0x928B, + 47997 - 44032: 0x928C, + 47998 - 44032: 0x928D, + 47999 - 44032: 0x928E, + 48000 - 44032: 0x928F, + 48001 - 44032: 0x9290, + 48002 - 44032: 0x9291, + 48003 - 44032: 0x9292, + 48004 - 44032: 0x9293, + 48005 - 44032: 0x9294, + 48006 - 44032: 0x9295, + 48007 - 44032: 0x9296, + 48008 - 44032: 0xB9BF, + 48009 - 44032: 0x9297, + 48010 - 44032: 0x9298, + 48011 - 44032: 0x9299, + 48012 - 44032: 0xB9C0, + 48013 - 44032: 0x929A, + 48014 - 44032: 0x929B, + 48015 - 44032: 0x929C, + 48016 - 44032: 0xB9C1, + 48017 - 44032: 0x929D, + 48018 - 44032: 0x929E, + 48019 - 44032: 0x929F, + 48020 - 44032: 0x92A0, + 48021 - 44032: 0x92A1, + 48022 - 44032: 0x92A2, + 48023 - 44032: 0x92A3, + 48024 - 44032: 0x92A4, + 48025 - 44032: 0x92A5, + 48026 - 44032: 0x92A6, + 48027 - 44032: 0x92A7, + 48028 - 44032: 0x92A8, + 48029 - 44032: 0x92A9, + 48030 - 44032: 0x92AA, + 48031 - 44032: 0x92AB, + 48032 - 44032: 0x92AC, + 48033 - 44032: 0x92AD, + 48034 - 44032: 0x92AE, + 48035 - 44032: 0x92AF, + 48036 - 44032: 0xB9C2, + 48037 - 44032: 0x92B0, + 48038 - 44032: 0x92B1, + 48039 - 44032: 0x92B2, + 48040 - 44032: 0xB9C3, + 48041 - 44032: 0x92B3, + 48042 - 44032: 0x92B4, + 48043 - 44032: 0x92B5, + 48044 - 44032: 0xB9C4, + 48045 - 44032: 0x92B6, + 48046 - 44032: 0x92B7, + 48047 - 44032: 0x92B8, + 48048 - 44032: 0x92B9, + 48049 - 44032: 0x92BA, + 48050 - 44032: 0x92BB, + 48051 - 44032: 0x92BC, + 48052 - 44032: 0xB9C5, + 48053 - 44032: 0x92BD, + 48054 - 44032: 0x92BE, + 48055 - 44032: 0xB9C6, + 48056 - 44032: 0x92BF, + 48057 - 44032: 0x92C0, + 48058 - 44032: 0x92C1, + 48059 - 44032: 0x92C2, + 48060 - 44032: 0x92C3, + 48061 - 44032: 0x92C4, + 48062 - 44032: 0x92C5, + 48063 - 44032: 0x92C6, + 48064 - 44032: 0xB9C7, + 48065 - 44032: 0x92C7, + 48066 - 44032: 0x92C8, + 48067 - 44032: 0x92C9, + 48068 - 44032: 0xB9C8, + 48069 - 44032: 0x92CA, + 48070 - 44032: 0x92CB, + 48071 - 44032: 0x92CC, + 48072 - 44032: 0xB9C9, + 48073 - 44032: 0x92CD, + 48074 - 44032: 0x92CE, + 48075 - 44032: 0x92CF, + 48076 - 44032: 0x92D0, + 48077 - 44032: 0x92D1, + 48078 - 44032: 0x92D2, + 48079 - 44032: 0x92D3, + 48080 - 44032: 0xB9CA, + 48081 - 44032: 0x92D4, + 48082 - 44032: 0x92D5, + 48083 - 44032: 0xB9CB, + 48084 - 44032: 0x92D6, + 48085 - 44032: 0x92D7, + 48086 - 44032: 0x92D8, + 48087 - 44032: 0x92D9, + 48088 - 44032: 0x92DA, + 48089 - 44032: 0x92DB, + 48090 - 44032: 0x92DC, + 48091 - 44032: 0x92DD, + 48092 - 44032: 0x92DE, + 48093 - 44032: 0x92DF, + 48094 - 44032: 0x92E0, + 48095 - 44032: 0x92E1, + 48096 - 44032: 0x92E2, + 48097 - 44032: 0x92E3, + 48098 - 44032: 0x92E4, + 48099 - 44032: 0x92E5, + 48100 - 44032: 0x92E6, + 48101 - 44032: 0x92E7, + 48102 - 44032: 0x92E8, + 48103 - 44032: 0x92E9, + 48104 - 44032: 0x92EA, + 48105 - 44032: 0x92EB, + 48106 - 44032: 0x92EC, + 48107 - 44032: 0x92ED, + 48108 - 44032: 0x92EE, + 48109 - 44032: 0x92EF, + 48110 - 44032: 0x92F0, + 48111 - 44032: 0x92F1, + 48112 - 44032: 0x92F2, + 48113 - 44032: 0x92F3, + 48114 - 44032: 0x92F4, + 48115 - 44032: 0x92F5, + 48116 - 44032: 0x92F6, + 48117 - 44032: 0x92F7, + 48118 - 44032: 0x92F8, + 48119 - 44032: 0x92F9, + 48120 - 44032: 0xB9CC, + 48121 - 44032: 0xB9CD, + 48122 - 44032: 0x92FA, + 48123 - 44032: 0x92FB, + 48124 - 44032: 0xB9CE, + 48125 - 44032: 0x92FC, + 48126 - 44032: 0x92FD, + 48127 - 44032: 0xB9CF, + 48128 - 44032: 0xB9D0, + 48129 - 44032: 0x92FE, + 48130 - 44032: 0xB9D1, + 48131 - 44032: 0x9341, + 48132 - 44032: 0x9342, + 48133 - 44032: 0x9343, + 48134 - 44032: 0x9344, + 48135 - 44032: 0x9345, + 48136 - 44032: 0xB9D2, + 48137 - 44032: 0xB9D3, + 48138 - 44032: 0x9346, + 48139 - 44032: 0xB9D4, + 48140 - 44032: 0xB9D5, + 48141 - 44032: 0xB9D6, + 48142 - 44032: 0x9347, + 48143 - 44032: 0xB9D7, + 48144 - 44032: 0x9348, + 48145 - 44032: 0xB9D8, + 48146 - 44032: 0x9349, + 48147 - 44032: 0x934A, + 48148 - 44032: 0xB9D9, + 48149 - 44032: 0xB9DA, + 48150 - 44032: 0xB9DB, + 48151 - 44032: 0xB9DC, + 48152 - 44032: 0xB9DD, + 48153 - 44032: 0x934B, + 48154 - 44032: 0x934C, + 48155 - 44032: 0xB9DE, + 48156 - 44032: 0xB9DF, + 48157 - 44032: 0xB9E0, + 48158 - 44032: 0xB9E1, + 48159 - 44032: 0xB9E2, + 48160 - 44032: 0x934D, + 48161 - 44032: 0x934E, + 48162 - 44032: 0x934F, + 48163 - 44032: 0x9350, + 48164 - 44032: 0xB9E3, + 48165 - 44032: 0xB9E4, + 48166 - 44032: 0x9351, + 48167 - 44032: 0xB9E5, + 48168 - 44032: 0x9352, + 48169 - 44032: 0xB9E6, + 48170 - 44032: 0x9353, + 48171 - 44032: 0x9354, + 48172 - 44032: 0x9355, + 48173 - 44032: 0xB9E7, + 48174 - 44032: 0x9356, + 48175 - 44032: 0x9357, + 48176 - 44032: 0xB9E8, + 48177 - 44032: 0xB9E9, + 48178 - 44032: 0x9358, + 48179 - 44032: 0x9359, + 48180 - 44032: 0xB9EA, + 48181 - 44032: 0x935A, + 48182 - 44032: 0x9361, + 48183 - 44032: 0x9362, + 48184 - 44032: 0xB9EB, + 48185 - 44032: 0x9363, + 48186 - 44032: 0x9364, + 48187 - 44032: 0x9365, + 48188 - 44032: 0x9366, + 48189 - 44032: 0x9367, + 48190 - 44032: 0x9368, + 48191 - 44032: 0x9369, + 48192 - 44032: 0xB9EC, + 48193 - 44032: 0xB9ED, + 48194 - 44032: 0x936A, + 48195 - 44032: 0xB9EE, + 48196 - 44032: 0xB9EF, + 48197 - 44032: 0xB9F0, + 48198 - 44032: 0x936B, + 48199 - 44032: 0x936C, + 48200 - 44032: 0x936D, + 48201 - 44032: 0xB9F1, + 48202 - 44032: 0x936E, + 48203 - 44032: 0x936F, + 48204 - 44032: 0xB9F2, + 48205 - 44032: 0xB9F3, + 48206 - 44032: 0x9370, + 48207 - 44032: 0x9371, + 48208 - 44032: 0xB9F4, + 48209 - 44032: 0x9372, + 48210 - 44032: 0x9373, + 48211 - 44032: 0x9374, + 48212 - 44032: 0x9375, + 48213 - 44032: 0x9376, + 48214 - 44032: 0x9377, + 48215 - 44032: 0x9378, + 48216 - 44032: 0x9379, + 48217 - 44032: 0x937A, + 48218 - 44032: 0x9381, + 48219 - 44032: 0x9382, + 48220 - 44032: 0x9383, + 48221 - 44032: 0xB9F5, + 48222 - 44032: 0x9384, + 48223 - 44032: 0x9385, + 48224 - 44032: 0x9386, + 48225 - 44032: 0x9387, + 48226 - 44032: 0x9388, + 48227 - 44032: 0x9389, + 48228 - 44032: 0x938A, + 48229 - 44032: 0x938B, + 48230 - 44032: 0x938C, + 48231 - 44032: 0x938D, + 48232 - 44032: 0x938E, + 48233 - 44032: 0x938F, + 48234 - 44032: 0x9390, + 48235 - 44032: 0x9391, + 48236 - 44032: 0x9392, + 48237 - 44032: 0x9393, + 48238 - 44032: 0x9394, + 48239 - 44032: 0x9395, + 48240 - 44032: 0x9396, + 48241 - 44032: 0x9397, + 48242 - 44032: 0x9398, + 48243 - 44032: 0x9399, + 48244 - 44032: 0x939A, + 48245 - 44032: 0x939B, + 48246 - 44032: 0x939C, + 48247 - 44032: 0x939D, + 48248 - 44032: 0x939E, + 48249 - 44032: 0x939F, + 48250 - 44032: 0x93A0, + 48251 - 44032: 0x93A1, + 48252 - 44032: 0x93A2, + 48253 - 44032: 0x93A3, + 48254 - 44032: 0x93A4, + 48255 - 44032: 0x93A5, + 48256 - 44032: 0x93A6, + 48257 - 44032: 0x93A7, + 48258 - 44032: 0x93A8, + 48259 - 44032: 0x93A9, + 48260 - 44032: 0xB9F6, + 48261 - 44032: 0xB9F7, + 48262 - 44032: 0x93AA, + 48263 - 44032: 0x93AB, + 48264 - 44032: 0xB9F8, + 48265 - 44032: 0x93AC, + 48266 - 44032: 0x93AD, + 48267 - 44032: 0xB9F9, + 48268 - 44032: 0xB9FA, + 48269 - 44032: 0x93AE, + 48270 - 44032: 0xB9FB, + 48271 - 44032: 0x93AF, + 48272 - 44032: 0x93B0, + 48273 - 44032: 0x93B1, + 48274 - 44032: 0x93B2, + 48275 - 44032: 0x93B3, + 48276 - 44032: 0xB9FC, + 48277 - 44032: 0xB9FD, + 48278 - 44032: 0x93B4, + 48279 - 44032: 0xB9FE, + 48280 - 44032: 0x93B5, + 48281 - 44032: 0xBAA1, + 48282 - 44032: 0xBAA2, + 48283 - 44032: 0x93B6, + 48284 - 44032: 0x93B7, + 48285 - 44032: 0x93B8, + 48286 - 44032: 0x93B9, + 48287 - 44032: 0x93BA, + 48288 - 44032: 0xBAA3, + 48289 - 44032: 0xBAA4, + 48290 - 44032: 0x93BB, + 48291 - 44032: 0x93BC, + 48292 - 44032: 0xBAA5, + 48293 - 44032: 0x93BD, + 48294 - 44032: 0x93BE, + 48295 - 44032: 0xBAA6, + 48296 - 44032: 0xBAA7, + 48297 - 44032: 0x93BF, + 48298 - 44032: 0x93C0, + 48299 - 44032: 0x93C1, + 48300 - 44032: 0x93C2, + 48301 - 44032: 0x93C3, + 48302 - 44032: 0x93C4, + 48303 - 44032: 0x93C5, + 48304 - 44032: 0xBAA8, + 48305 - 44032: 0xBAA9, + 48306 - 44032: 0x93C6, + 48307 - 44032: 0xBAAA, + 48308 - 44032: 0xBAAB, + 48309 - 44032: 0xBAAC, + 48310 - 44032: 0x93C7, + 48311 - 44032: 0x93C8, + 48312 - 44032: 0x93C9, + 48313 - 44032: 0x93CA, + 48314 - 44032: 0x93CB, + 48315 - 44032: 0x93CC, + 48316 - 44032: 0xBAAD, + 48317 - 44032: 0xBAAE, + 48318 - 44032: 0x93CD, + 48319 - 44032: 0x93CE, + 48320 - 44032: 0xBAAF, + 48321 - 44032: 0x93CF, + 48322 - 44032: 0x93D0, + 48323 - 44032: 0x93D1, + 48324 - 44032: 0xBAB0, + 48325 - 44032: 0x93D2, + 48326 - 44032: 0x93D3, + 48327 - 44032: 0x93D4, + 48328 - 44032: 0x93D5, + 48329 - 44032: 0x93D6, + 48330 - 44032: 0x93D7, + 48331 - 44032: 0x93D8, + 48332 - 44032: 0x93D9, + 48333 - 44032: 0xBAB1, + 48334 - 44032: 0x93DA, + 48335 - 44032: 0xBAB2, + 48336 - 44032: 0xBAB3, + 48337 - 44032: 0xBAB4, + 48338 - 44032: 0x93DB, + 48339 - 44032: 0x93DC, + 48340 - 44032: 0x93DD, + 48341 - 44032: 0xBAB5, + 48342 - 44032: 0x93DE, + 48343 - 44032: 0x93DF, + 48344 - 44032: 0xBAB6, + 48345 - 44032: 0x93E0, + 48346 - 44032: 0x93E1, + 48347 - 44032: 0x93E2, + 48348 - 44032: 0xBAB7, + 48349 - 44032: 0x93E3, + 48350 - 44032: 0x93E4, + 48351 - 44032: 0x93E5, + 48352 - 44032: 0x93E6, + 48353 - 44032: 0x93E7, + 48354 - 44032: 0x93E8, + 48355 - 44032: 0x93E9, + 48356 - 44032: 0x93EA, + 48357 - 44032: 0x93EB, + 48358 - 44032: 0x93EC, + 48359 - 44032: 0x93ED, + 48360 - 44032: 0x93EE, + 48361 - 44032: 0x93EF, + 48362 - 44032: 0x93F0, + 48363 - 44032: 0x93F1, + 48364 - 44032: 0x93F2, + 48365 - 44032: 0x93F3, + 48366 - 44032: 0x93F4, + 48367 - 44032: 0x93F5, + 48368 - 44032: 0x93F6, + 48369 - 44032: 0x93F7, + 48370 - 44032: 0x93F8, + 48371 - 44032: 0x93F9, + 48372 - 44032: 0xBAB8, + 48373 - 44032: 0xBAB9, + 48374 - 44032: 0xBABA, + 48375 - 44032: 0x93FA, + 48376 - 44032: 0xBABB, + 48377 - 44032: 0x93FB, + 48378 - 44032: 0x93FC, + 48379 - 44032: 0x93FD, + 48380 - 44032: 0xBABC, + 48381 - 44032: 0x93FE, + 48382 - 44032: 0x9441, + 48383 - 44032: 0x9442, + 48384 - 44032: 0x9443, + 48385 - 44032: 0x9444, + 48386 - 44032: 0x9445, + 48387 - 44032: 0x9446, + 48388 - 44032: 0xBABD, + 48389 - 44032: 0xBABE, + 48390 - 44032: 0x9447, + 48391 - 44032: 0xBABF, + 48392 - 44032: 0x9448, + 48393 - 44032: 0xBAC0, + 48394 - 44032: 0x9449, + 48395 - 44032: 0x944A, + 48396 - 44032: 0x944B, + 48397 - 44032: 0x944C, + 48398 - 44032: 0x944D, + 48399 - 44032: 0x944E, + 48400 - 44032: 0xBAC1, + 48401 - 44032: 0x944F, + 48402 - 44032: 0x9450, + 48403 - 44032: 0x9451, + 48404 - 44032: 0xBAC2, + 48405 - 44032: 0x9452, + 48406 - 44032: 0x9453, + 48407 - 44032: 0x9454, + 48408 - 44032: 0x9455, + 48409 - 44032: 0x9456, + 48410 - 44032: 0x9457, + 48411 - 44032: 0x9458, + 48412 - 44032: 0x9459, + 48413 - 44032: 0x945A, + 48414 - 44032: 0x9461, + 48415 - 44032: 0x9462, + 48416 - 44032: 0x9463, + 48417 - 44032: 0x9464, + 48418 - 44032: 0x9465, + 48419 - 44032: 0x9466, + 48420 - 44032: 0xBAC3, + 48421 - 44032: 0x9467, + 48422 - 44032: 0x9468, + 48423 - 44032: 0x9469, + 48424 - 44032: 0x946A, + 48425 - 44032: 0x946B, + 48426 - 44032: 0x946C, + 48427 - 44032: 0x946D, + 48428 - 44032: 0xBAC4, + 48429 - 44032: 0x946E, + 48430 - 44032: 0x946F, + 48431 - 44032: 0x9470, + 48432 - 44032: 0x9471, + 48433 - 44032: 0x9472, + 48434 - 44032: 0x9473, + 48435 - 44032: 0x9474, + 48436 - 44032: 0x9475, + 48437 - 44032: 0x9476, + 48438 - 44032: 0x9477, + 48439 - 44032: 0x9478, + 48440 - 44032: 0x9479, + 48441 - 44032: 0x947A, + 48442 - 44032: 0x9481, + 48443 - 44032: 0x9482, + 48444 - 44032: 0x9483, + 48445 - 44032: 0x9484, + 48446 - 44032: 0x9485, + 48447 - 44032: 0x9486, + 48448 - 44032: 0xBAC5, + 48449 - 44032: 0x9487, + 48450 - 44032: 0x9488, + 48451 - 44032: 0x9489, + 48452 - 44032: 0x948A, + 48453 - 44032: 0x948B, + 48454 - 44032: 0x948C, + 48455 - 44032: 0x948D, + 48456 - 44032: 0xBAC6, + 48457 - 44032: 0xBAC7, + 48458 - 44032: 0x948E, + 48459 - 44032: 0x948F, + 48460 - 44032: 0xBAC8, + 48461 - 44032: 0x9490, + 48462 - 44032: 0x9491, + 48463 - 44032: 0x9492, + 48464 - 44032: 0xBAC9, + 48465 - 44032: 0x9493, + 48466 - 44032: 0x9494, + 48467 - 44032: 0x9495, + 48468 - 44032: 0x9496, + 48469 - 44032: 0x9497, + 48470 - 44032: 0x9498, + 48471 - 44032: 0x9499, + 48472 - 44032: 0xBACA, + 48473 - 44032: 0xBACB, + 48474 - 44032: 0x949A, + 48475 - 44032: 0x949B, + 48476 - 44032: 0x949C, + 48477 - 44032: 0x949D, + 48478 - 44032: 0x949E, + 48479 - 44032: 0x949F, + 48480 - 44032: 0x94A0, + 48481 - 44032: 0x94A1, + 48482 - 44032: 0x94A2, + 48483 - 44032: 0x94A3, + 48484 - 44032: 0xBACC, + 48485 - 44032: 0x94A4, + 48486 - 44032: 0x94A5, + 48487 - 44032: 0x94A6, + 48488 - 44032: 0xBACD, + 48489 - 44032: 0x94A7, + 48490 - 44032: 0x94A8, + 48491 - 44032: 0x94A9, + 48492 - 44032: 0x94AA, + 48493 - 44032: 0x94AB, + 48494 - 44032: 0x94AC, + 48495 - 44032: 0x94AD, + 48496 - 44032: 0x94AE, + 48497 - 44032: 0x94AF, + 48498 - 44032: 0x94B0, + 48499 - 44032: 0x94B1, + 48500 - 44032: 0x94B2, + 48501 - 44032: 0x94B3, + 48502 - 44032: 0x94B4, + 48503 - 44032: 0x94B5, + 48504 - 44032: 0x94B6, + 48505 - 44032: 0x94B7, + 48506 - 44032: 0x94B8, + 48507 - 44032: 0x94B9, + 48508 - 44032: 0x94BA, + 48509 - 44032: 0x94BB, + 48510 - 44032: 0x94BC, + 48511 - 44032: 0x94BD, + 48512 - 44032: 0xBACE, + 48513 - 44032: 0xBACF, + 48514 - 44032: 0x94BE, + 48515 - 44032: 0x94BF, + 48516 - 44032: 0xBAD0, + 48517 - 44032: 0x94C0, + 48518 - 44032: 0x94C1, + 48519 - 44032: 0xBAD1, + 48520 - 44032: 0xBAD2, + 48521 - 44032: 0xBAD3, + 48522 - 44032: 0xBAD4, + 48523 - 44032: 0x94C2, + 48524 - 44032: 0x94C3, + 48525 - 44032: 0x94C4, + 48526 - 44032: 0x94C5, + 48527 - 44032: 0x94C6, + 48528 - 44032: 0xBAD5, + 48529 - 44032: 0xBAD6, + 48530 - 44032: 0x94C7, + 48531 - 44032: 0xBAD7, + 48532 - 44032: 0x94C8, + 48533 - 44032: 0xBAD8, + 48534 - 44032: 0x94C9, + 48535 - 44032: 0x94CA, + 48536 - 44032: 0x94CB, + 48537 - 44032: 0xBAD9, + 48538 - 44032: 0xBADA, + 48539 - 44032: 0x94CC, + 48540 - 44032: 0xBADB, + 48541 - 44032: 0x94CD, + 48542 - 44032: 0x94CE, + 48543 - 44032: 0x94CF, + 48544 - 44032: 0x94D0, + 48545 - 44032: 0x94D1, + 48546 - 44032: 0x94D2, + 48547 - 44032: 0x94D3, + 48548 - 44032: 0xBADC, + 48549 - 44032: 0x94D4, + 48550 - 44032: 0x94D5, + 48551 - 44032: 0x94D6, + 48552 - 44032: 0x94D7, + 48553 - 44032: 0x94D8, + 48554 - 44032: 0x94D9, + 48555 - 44032: 0x94DA, + 48556 - 44032: 0x94DB, + 48557 - 44032: 0x94DC, + 48558 - 44032: 0x94DD, + 48559 - 44032: 0x94DE, + 48560 - 44032: 0xBADD, + 48561 - 44032: 0x94DF, + 48562 - 44032: 0x94E0, + 48563 - 44032: 0x94E1, + 48564 - 44032: 0x94E2, + 48565 - 44032: 0x94E3, + 48566 - 44032: 0x94E4, + 48567 - 44032: 0x94E5, + 48568 - 44032: 0xBADE, + 48569 - 44032: 0x94E6, + 48570 - 44032: 0x94E7, + 48571 - 44032: 0x94E8, + 48572 - 44032: 0x94E9, + 48573 - 44032: 0x94EA, + 48574 - 44032: 0x94EB, + 48575 - 44032: 0x94EC, + 48576 - 44032: 0x94ED, + 48577 - 44032: 0x94EE, + 48578 - 44032: 0x94EF, + 48579 - 44032: 0x94F0, + 48580 - 44032: 0x94F1, + 48581 - 44032: 0x94F2, + 48582 - 44032: 0x94F3, + 48583 - 44032: 0x94F4, + 48584 - 44032: 0x94F5, + 48585 - 44032: 0x94F6, + 48586 - 44032: 0x94F7, + 48587 - 44032: 0x94F8, + 48588 - 44032: 0x94F9, + 48589 - 44032: 0x94FA, + 48590 - 44032: 0x94FB, + 48591 - 44032: 0x94FC, + 48592 - 44032: 0x94FD, + 48593 - 44032: 0x94FE, + 48594 - 44032: 0x9541, + 48595 - 44032: 0x9542, + 48596 - 44032: 0xBADF, + 48597 - 44032: 0xBAE0, + 48598 - 44032: 0x9543, + 48599 - 44032: 0x9544, + 48600 - 44032: 0xBAE1, + 48601 - 44032: 0x9545, + 48602 - 44032: 0x9546, + 48603 - 44032: 0x9547, + 48604 - 44032: 0xBAE2, + 48605 - 44032: 0x9548, + 48606 - 44032: 0x9549, + 48607 - 44032: 0x954A, + 48608 - 44032: 0x954B, + 48609 - 44032: 0x954C, + 48610 - 44032: 0x954D, + 48611 - 44032: 0x954E, + 48612 - 44032: 0x954F, + 48613 - 44032: 0x9550, + 48614 - 44032: 0x9551, + 48615 - 44032: 0x9552, + 48616 - 44032: 0x9553, + 48617 - 44032: 0xBAE3, + 48618 - 44032: 0x9554, + 48619 - 44032: 0x9555, + 48620 - 44032: 0x9556, + 48621 - 44032: 0x9557, + 48622 - 44032: 0x9558, + 48623 - 44032: 0x9559, + 48624 - 44032: 0xBAE4, + 48625 - 44032: 0x955A, + 48626 - 44032: 0x9561, + 48627 - 44032: 0x9562, + 48628 - 44032: 0xBAE5, + 48629 - 44032: 0x9563, + 48630 - 44032: 0x9564, + 48631 - 44032: 0x9565, + 48632 - 44032: 0xBAE6, + 48633 - 44032: 0x9566, + 48634 - 44032: 0x9567, + 48635 - 44032: 0x9568, + 48636 - 44032: 0x9569, + 48637 - 44032: 0x956A, + 48638 - 44032: 0x956B, + 48639 - 44032: 0x956C, + 48640 - 44032: 0xBAE7, + 48641 - 44032: 0x956D, + 48642 - 44032: 0x956E, + 48643 - 44032: 0xBAE8, + 48644 - 44032: 0x956F, + 48645 - 44032: 0xBAE9, + 48646 - 44032: 0x9570, + 48647 - 44032: 0x9571, + 48648 - 44032: 0x9572, + 48649 - 44032: 0x9573, + 48650 - 44032: 0x9574, + 48651 - 44032: 0x9575, + 48652 - 44032: 0xBAEA, + 48653 - 44032: 0xBAEB, + 48654 - 44032: 0x9576, + 48655 - 44032: 0x9577, + 48656 - 44032: 0xBAEC, + 48657 - 44032: 0x9578, + 48658 - 44032: 0x9579, + 48659 - 44032: 0x957A, + 48660 - 44032: 0xBAED, + 48661 - 44032: 0x9581, + 48662 - 44032: 0x9582, + 48663 - 44032: 0x9583, + 48664 - 44032: 0x9584, + 48665 - 44032: 0x9585, + 48666 - 44032: 0x9586, + 48667 - 44032: 0x9587, + 48668 - 44032: 0xBAEE, + 48669 - 44032: 0xBAEF, + 48670 - 44032: 0x9588, + 48671 - 44032: 0xBAF0, + 48672 - 44032: 0x9589, + 48673 - 44032: 0x958A, + 48674 - 44032: 0x958B, + 48675 - 44032: 0x958C, + 48676 - 44032: 0x958D, + 48677 - 44032: 0x958E, + 48678 - 44032: 0x958F, + 48679 - 44032: 0x9590, + 48680 - 44032: 0x9591, + 48681 - 44032: 0x9592, + 48682 - 44032: 0x9593, + 48683 - 44032: 0x9594, + 48684 - 44032: 0x9595, + 48685 - 44032: 0x9596, + 48686 - 44032: 0x9597, + 48687 - 44032: 0x9598, + 48688 - 44032: 0x9599, + 48689 - 44032: 0x959A, + 48690 - 44032: 0x959B, + 48691 - 44032: 0x959C, + 48692 - 44032: 0x959D, + 48693 - 44032: 0x959E, + 48694 - 44032: 0x959F, + 48695 - 44032: 0x95A0, + 48696 - 44032: 0x95A1, + 48697 - 44032: 0x95A2, + 48698 - 44032: 0x95A3, + 48699 - 44032: 0x95A4, + 48700 - 44032: 0x95A5, + 48701 - 44032: 0x95A6, + 48702 - 44032: 0x95A7, + 48703 - 44032: 0x95A8, + 48704 - 44032: 0x95A9, + 48705 - 44032: 0x95AA, + 48706 - 44032: 0x95AB, + 48707 - 44032: 0x95AC, + 48708 - 44032: 0xBAF1, + 48709 - 44032: 0xBAF2, + 48710 - 44032: 0x95AD, + 48711 - 44032: 0x95AE, + 48712 - 44032: 0xBAF3, + 48713 - 44032: 0x95AF, + 48714 - 44032: 0x95B0, + 48715 - 44032: 0x95B1, + 48716 - 44032: 0xBAF4, + 48717 - 44032: 0x95B2, + 48718 - 44032: 0xBAF5, + 48719 - 44032: 0x95B3, + 48720 - 44032: 0x95B4, + 48721 - 44032: 0x95B5, + 48722 - 44032: 0x95B6, + 48723 - 44032: 0x95B7, + 48724 - 44032: 0xBAF6, + 48725 - 44032: 0xBAF7, + 48726 - 44032: 0x95B8, + 48727 - 44032: 0xBAF8, + 48728 - 44032: 0x95B9, + 48729 - 44032: 0xBAF9, + 48730 - 44032: 0xBAFA, + 48731 - 44032: 0xBAFB, + 48732 - 44032: 0x95BA, + 48733 - 44032: 0x95BB, + 48734 - 44032: 0x95BC, + 48735 - 44032: 0x95BD, + 48736 - 44032: 0xBAFC, + 48737 - 44032: 0xBAFD, + 48738 - 44032: 0x95BE, + 48739 - 44032: 0x95BF, + 48740 - 44032: 0xBAFE, + 48741 - 44032: 0x95C0, + 48742 - 44032: 0x95C1, + 48743 - 44032: 0x95C2, + 48744 - 44032: 0xBBA1, + 48745 - 44032: 0x95C3, + 48746 - 44032: 0xBBA2, + 48747 - 44032: 0x95C4, + 48748 - 44032: 0x95C5, + 48749 - 44032: 0x95C6, + 48750 - 44032: 0x95C7, + 48751 - 44032: 0x95C8, + 48752 - 44032: 0xBBA3, + 48753 - 44032: 0xBBA4, + 48754 - 44032: 0x95C9, + 48755 - 44032: 0xBBA5, + 48756 - 44032: 0xBBA6, + 48757 - 44032: 0xBBA7, + 48758 - 44032: 0x95CA, + 48759 - 44032: 0x95CB, + 48760 - 44032: 0x95CC, + 48761 - 44032: 0x95CD, + 48762 - 44032: 0x95CE, + 48763 - 44032: 0xBBA8, + 48764 - 44032: 0xBBA9, + 48765 - 44032: 0xBBAA, + 48766 - 44032: 0x95CF, + 48767 - 44032: 0x95D0, + 48768 - 44032: 0xBBAB, + 48769 - 44032: 0x95D1, + 48770 - 44032: 0x95D2, + 48771 - 44032: 0x95D3, + 48772 - 44032: 0xBBAC, + 48773 - 44032: 0x95D4, + 48774 - 44032: 0x95D5, + 48775 - 44032: 0x95D6, + 48776 - 44032: 0x95D7, + 48777 - 44032: 0x95D8, + 48778 - 44032: 0x95D9, + 48779 - 44032: 0x95DA, + 48780 - 44032: 0xBBAD, + 48781 - 44032: 0xBBAE, + 48782 - 44032: 0x95DB, + 48783 - 44032: 0xBBAF, + 48784 - 44032: 0xBBB0, + 48785 - 44032: 0xBBB1, + 48786 - 44032: 0x95DC, + 48787 - 44032: 0x95DD, + 48788 - 44032: 0x95DE, + 48789 - 44032: 0x95DF, + 48790 - 44032: 0x95E0, + 48791 - 44032: 0x95E1, + 48792 - 44032: 0xBBB2, + 48793 - 44032: 0xBBB3, + 48794 - 44032: 0x95E2, + 48795 - 44032: 0x95E3, + 48796 - 44032: 0x95E4, + 48797 - 44032: 0x95E5, + 48798 - 44032: 0x95E6, + 48799 - 44032: 0x95E7, + 48800 - 44032: 0x95E8, + 48801 - 44032: 0x95E9, + 48802 - 44032: 0x95EA, + 48803 - 44032: 0x95EB, + 48804 - 44032: 0x95EC, + 48805 - 44032: 0x95ED, + 48806 - 44032: 0x95EE, + 48807 - 44032: 0x95EF, + 48808 - 44032: 0xBBB4, + 48809 - 44032: 0x95F0, + 48810 - 44032: 0x95F1, + 48811 - 44032: 0x95F2, + 48812 - 44032: 0x95F3, + 48813 - 44032: 0x95F4, + 48814 - 44032: 0x95F5, + 48815 - 44032: 0x95F6, + 48816 - 44032: 0x95F7, + 48817 - 44032: 0x95F8, + 48818 - 44032: 0x95F9, + 48819 - 44032: 0x95FA, + 48820 - 44032: 0x95FB, + 48821 - 44032: 0x95FC, + 48822 - 44032: 0x95FD, + 48823 - 44032: 0x95FE, + 48824 - 44032: 0x9641, + 48825 - 44032: 0x9642, + 48826 - 44032: 0x9643, + 48827 - 44032: 0x9644, + 48828 - 44032: 0x9645, + 48829 - 44032: 0x9646, + 48830 - 44032: 0x9647, + 48831 - 44032: 0x9648, + 48832 - 44032: 0x9649, + 48833 - 44032: 0x964A, + 48834 - 44032: 0x964B, + 48835 - 44032: 0x964C, + 48836 - 44032: 0x964D, + 48837 - 44032: 0x964E, + 48838 - 44032: 0x964F, + 48839 - 44032: 0x9650, + 48840 - 44032: 0x9651, + 48841 - 44032: 0x9652, + 48842 - 44032: 0x9653, + 48843 - 44032: 0x9654, + 48844 - 44032: 0x9655, + 48845 - 44032: 0x9656, + 48846 - 44032: 0x9657, + 48847 - 44032: 0x9658, + 48848 - 44032: 0xBBB5, + 48849 - 44032: 0xBBB6, + 48850 - 44032: 0x9659, + 48851 - 44032: 0x965A, + 48852 - 44032: 0xBBB7, + 48853 - 44032: 0x9661, + 48854 - 44032: 0x9662, + 48855 - 44032: 0xBBB8, + 48856 - 44032: 0xBBB9, + 48857 - 44032: 0x9663, + 48858 - 44032: 0x9664, + 48859 - 44032: 0x9665, + 48860 - 44032: 0x9666, + 48861 - 44032: 0x9667, + 48862 - 44032: 0x9668, + 48863 - 44032: 0x9669, + 48864 - 44032: 0xBBBA, + 48865 - 44032: 0x966A, + 48866 - 44032: 0x966B, + 48867 - 44032: 0xBBBB, + 48868 - 44032: 0xBBBC, + 48869 - 44032: 0xBBBD, + 48870 - 44032: 0x966C, + 48871 - 44032: 0x966D, + 48872 - 44032: 0x966E, + 48873 - 44032: 0x966F, + 48874 - 44032: 0x9670, + 48875 - 44032: 0x9671, + 48876 - 44032: 0xBBBE, + 48877 - 44032: 0x9672, + 48878 - 44032: 0x9673, + 48879 - 44032: 0x9674, + 48880 - 44032: 0x9675, + 48881 - 44032: 0x9676, + 48882 - 44032: 0x9677, + 48883 - 44032: 0x9678, + 48884 - 44032: 0x9679, + 48885 - 44032: 0x967A, + 48886 - 44032: 0x9681, + 48887 - 44032: 0x9682, + 48888 - 44032: 0x9683, + 48889 - 44032: 0x9684, + 48890 - 44032: 0x9685, + 48891 - 44032: 0x9686, + 48892 - 44032: 0x9687, + 48893 - 44032: 0x9688, + 48894 - 44032: 0x9689, + 48895 - 44032: 0x968A, + 48896 - 44032: 0x968B, + 48897 - 44032: 0xBBBF, + 48898 - 44032: 0x968C, + 48899 - 44032: 0x968D, + 48900 - 44032: 0x968E, + 48901 - 44032: 0x968F, + 48902 - 44032: 0x9690, + 48903 - 44032: 0x9691, + 48904 - 44032: 0xBBC0, + 48905 - 44032: 0xBBC1, + 48906 - 44032: 0x9692, + 48907 - 44032: 0x9693, + 48908 - 44032: 0x9694, + 48909 - 44032: 0x9695, + 48910 - 44032: 0x9696, + 48911 - 44032: 0x9697, + 48912 - 44032: 0x9698, + 48913 - 44032: 0x9699, + 48914 - 44032: 0x969A, + 48915 - 44032: 0x969B, + 48916 - 44032: 0x969C, + 48917 - 44032: 0x969D, + 48918 - 44032: 0x969E, + 48919 - 44032: 0x969F, + 48920 - 44032: 0xBBC2, + 48921 - 44032: 0xBBC3, + 48922 - 44032: 0x96A0, + 48923 - 44032: 0xBBC4, + 48924 - 44032: 0xBBC5, + 48925 - 44032: 0xBBC6, + 48926 - 44032: 0x96A1, + 48927 - 44032: 0x96A2, + 48928 - 44032: 0x96A3, + 48929 - 44032: 0x96A4, + 48930 - 44032: 0x96A5, + 48931 - 44032: 0x96A6, + 48932 - 44032: 0x96A7, + 48933 - 44032: 0x96A8, + 48934 - 44032: 0x96A9, + 48935 - 44032: 0x96AA, + 48936 - 44032: 0x96AB, + 48937 - 44032: 0x96AC, + 48938 - 44032: 0x96AD, + 48939 - 44032: 0x96AE, + 48940 - 44032: 0x96AF, + 48941 - 44032: 0x96B0, + 48942 - 44032: 0x96B1, + 48943 - 44032: 0x96B2, + 48944 - 44032: 0x96B3, + 48945 - 44032: 0x96B4, + 48946 - 44032: 0x96B5, + 48947 - 44032: 0x96B6, + 48948 - 44032: 0x96B7, + 48949 - 44032: 0x96B8, + 48950 - 44032: 0x96B9, + 48951 - 44032: 0x96BA, + 48952 - 44032: 0x96BB, + 48953 - 44032: 0x96BC, + 48954 - 44032: 0x96BD, + 48955 - 44032: 0x96BE, + 48956 - 44032: 0x96BF, + 48957 - 44032: 0x96C0, + 48958 - 44032: 0x96C1, + 48959 - 44032: 0x96C2, + 48960 - 44032: 0xBBC7, + 48961 - 44032: 0xBBC8, + 48962 - 44032: 0x96C3, + 48963 - 44032: 0x96C4, + 48964 - 44032: 0xBBC9, + 48965 - 44032: 0x96C5, + 48966 - 44032: 0x96C6, + 48967 - 44032: 0x96C7, + 48968 - 44032: 0xBBCA, + 48969 - 44032: 0x96C8, + 48970 - 44032: 0x96C9, + 48971 - 44032: 0x96CA, + 48972 - 44032: 0x96CB, + 48973 - 44032: 0x96CC, + 48974 - 44032: 0x96CD, + 48975 - 44032: 0x96CE, + 48976 - 44032: 0xBBCB, + 48977 - 44032: 0xBBCC, + 48978 - 44032: 0x96CF, + 48979 - 44032: 0x96D0, + 48980 - 44032: 0x96D1, + 48981 - 44032: 0xBBCD, + 48982 - 44032: 0x96D2, + 48983 - 44032: 0x96D3, + 48984 - 44032: 0x96D4, + 48985 - 44032: 0x96D5, + 48986 - 44032: 0x96D6, + 48987 - 44032: 0x96D7, + 48988 - 44032: 0x96D8, + 48989 - 44032: 0x96D9, + 48990 - 44032: 0x96DA, + 48991 - 44032: 0x96DB, + 48992 - 44032: 0x96DC, + 48993 - 44032: 0x96DD, + 48994 - 44032: 0x96DE, + 48995 - 44032: 0x96DF, + 48996 - 44032: 0x96E0, + 48997 - 44032: 0x96E1, + 48998 - 44032: 0x96E2, + 48999 - 44032: 0x96E3, + 49000 - 44032: 0x96E4, + 49001 - 44032: 0x96E5, + 49002 - 44032: 0x96E6, + 49003 - 44032: 0x96E7, + 49004 - 44032: 0x96E8, + 49005 - 44032: 0x96E9, + 49006 - 44032: 0x96EA, + 49007 - 44032: 0x96EB, + 49008 - 44032: 0x96EC, + 49009 - 44032: 0x96ED, + 49010 - 44032: 0x96EE, + 49011 - 44032: 0x96EF, + 49012 - 44032: 0x96F0, + 49013 - 44032: 0x96F1, + 49014 - 44032: 0x96F2, + 49015 - 44032: 0x96F3, + 49016 - 44032: 0x96F4, + 49017 - 44032: 0x96F5, + 49018 - 44032: 0x96F6, + 49019 - 44032: 0x96F7, + 49020 - 44032: 0x96F8, + 49021 - 44032: 0x96F9, + 49022 - 44032: 0x96FA, + 49023 - 44032: 0x96FB, + 49024 - 44032: 0x96FC, + 49025 - 44032: 0x96FD, + 49026 - 44032: 0x96FE, + 49027 - 44032: 0x9741, + 49028 - 44032: 0x9742, + 49029 - 44032: 0x9743, + 49030 - 44032: 0x9744, + 49031 - 44032: 0x9745, + 49032 - 44032: 0x9746, + 49033 - 44032: 0x9747, + 49034 - 44032: 0x9748, + 49035 - 44032: 0x9749, + 49036 - 44032: 0x974A, + 49037 - 44032: 0x974B, + 49038 - 44032: 0x974C, + 49039 - 44032: 0x974D, + 49040 - 44032: 0x974E, + 49041 - 44032: 0x974F, + 49042 - 44032: 0x9750, + 49043 - 44032: 0x9751, + 49044 - 44032: 0xBBCE, + 49045 - 44032: 0x9752, + 49046 - 44032: 0x9753, + 49047 - 44032: 0x9754, + 49048 - 44032: 0x9755, + 49049 - 44032: 0x9756, + 49050 - 44032: 0x9757, + 49051 - 44032: 0x9758, + 49052 - 44032: 0x9759, + 49053 - 44032: 0x975A, + 49054 - 44032: 0x9761, + 49055 - 44032: 0x9762, + 49056 - 44032: 0x9763, + 49057 - 44032: 0x9764, + 49058 - 44032: 0x9765, + 49059 - 44032: 0x9766, + 49060 - 44032: 0x9767, + 49061 - 44032: 0x9768, + 49062 - 44032: 0x9769, + 49063 - 44032: 0x976A, + 49064 - 44032: 0x976B, + 49065 - 44032: 0x976C, + 49066 - 44032: 0x976D, + 49067 - 44032: 0x976E, + 49068 - 44032: 0x976F, + 49069 - 44032: 0x9770, + 49070 - 44032: 0x9771, + 49071 - 44032: 0x9772, + 49072 - 44032: 0xBBCF, + 49073 - 44032: 0x9773, + 49074 - 44032: 0x9774, + 49075 - 44032: 0x9775, + 49076 - 44032: 0x9776, + 49077 - 44032: 0x9777, + 49078 - 44032: 0x9778, + 49079 - 44032: 0x9779, + 49080 - 44032: 0x977A, + 49081 - 44032: 0x9781, + 49082 - 44032: 0x9782, + 49083 - 44032: 0x9783, + 49084 - 44032: 0x9784, + 49085 - 44032: 0x9785, + 49086 - 44032: 0x9786, + 49087 - 44032: 0x9787, + 49088 - 44032: 0x9788, + 49089 - 44032: 0x9789, + 49090 - 44032: 0x978A, + 49091 - 44032: 0x978B, + 49092 - 44032: 0x978C, + 49093 - 44032: 0xBBD0, + 49094 - 44032: 0x978D, + 49095 - 44032: 0x978E, + 49096 - 44032: 0x978F, + 49097 - 44032: 0x9790, + 49098 - 44032: 0x9791, + 49099 - 44032: 0x9792, + 49100 - 44032: 0xBBD1, + 49101 - 44032: 0xBBD2, + 49102 - 44032: 0x9793, + 49103 - 44032: 0x9794, + 49104 - 44032: 0xBBD3, + 49105 - 44032: 0x9795, + 49106 - 44032: 0x9796, + 49107 - 44032: 0x9797, + 49108 - 44032: 0xBBD4, + 49109 - 44032: 0x9798, + 49110 - 44032: 0x9799, + 49111 - 44032: 0x979A, + 49112 - 44032: 0x979B, + 49113 - 44032: 0x979C, + 49114 - 44032: 0x979D, + 49115 - 44032: 0x979E, + 49116 - 44032: 0xBBD5, + 49117 - 44032: 0x979F, + 49118 - 44032: 0x97A0, + 49119 - 44032: 0xBBD6, + 49120 - 44032: 0x97A1, + 49121 - 44032: 0xBBD7, + 49122 - 44032: 0x97A2, + 49123 - 44032: 0x97A3, + 49124 - 44032: 0x97A4, + 49125 - 44032: 0x97A5, + 49126 - 44032: 0x97A6, + 49127 - 44032: 0x97A7, + 49128 - 44032: 0x97A8, + 49129 - 44032: 0x97A9, + 49130 - 44032: 0x97AA, + 49131 - 44032: 0x97AB, + 49132 - 44032: 0x97AC, + 49133 - 44032: 0x97AD, + 49134 - 44032: 0x97AE, + 49135 - 44032: 0x97AF, + 49136 - 44032: 0x97B0, + 49137 - 44032: 0x97B1, + 49138 - 44032: 0x97B2, + 49139 - 44032: 0x97B3, + 49140 - 44032: 0x97B4, + 49141 - 44032: 0x97B5, + 49142 - 44032: 0x97B6, + 49143 - 44032: 0x97B7, + 49144 - 44032: 0x97B8, + 49145 - 44032: 0x97B9, + 49146 - 44032: 0x97BA, + 49147 - 44032: 0x97BB, + 49148 - 44032: 0x97BC, + 49149 - 44032: 0x97BD, + 49150 - 44032: 0x97BE, + 49151 - 44032: 0x97BF, + 49152 - 44032: 0x97C0, + 49153 - 44032: 0x97C1, + 49154 - 44032: 0x97C2, + 49155 - 44032: 0x97C3, + 49156 - 44032: 0x97C4, + 49157 - 44032: 0x97C5, + 49158 - 44032: 0x97C6, + 49159 - 44032: 0x97C7, + 49160 - 44032: 0x97C8, + 49161 - 44032: 0x97C9, + 49162 - 44032: 0x97CA, + 49163 - 44032: 0x97CB, + 49164 - 44032: 0x97CC, + 49165 - 44032: 0x97CD, + 49166 - 44032: 0x97CE, + 49167 - 44032: 0x97CF, + 49168 - 44032: 0x97D0, + 49169 - 44032: 0x97D1, + 49170 - 44032: 0x97D2, + 49171 - 44032: 0x97D3, + 49172 - 44032: 0x97D4, + 49173 - 44032: 0x97D5, + 49174 - 44032: 0x97D6, + 49175 - 44032: 0x97D7, + 49176 - 44032: 0x97D8, + 49177 - 44032: 0x97D9, + 49178 - 44032: 0x97DA, + 49179 - 44032: 0x97DB, + 49180 - 44032: 0x97DC, + 49181 - 44032: 0x97DD, + 49182 - 44032: 0x97DE, + 49183 - 44032: 0x97DF, + 49184 - 44032: 0x97E0, + 49185 - 44032: 0x97E1, + 49186 - 44032: 0x97E2, + 49187 - 44032: 0x97E3, + 49188 - 44032: 0x97E4, + 49189 - 44032: 0x97E5, + 49190 - 44032: 0x97E6, + 49191 - 44032: 0x97E7, + 49192 - 44032: 0x97E8, + 49193 - 44032: 0x97E9, + 49194 - 44032: 0x97EA, + 49195 - 44032: 0x97EB, + 49196 - 44032: 0x97EC, + 49197 - 44032: 0x97ED, + 49198 - 44032: 0x97EE, + 49199 - 44032: 0x97EF, + 49200 - 44032: 0x97F0, + 49201 - 44032: 0x97F1, + 49202 - 44032: 0x97F2, + 49203 - 44032: 0x97F3, + 49204 - 44032: 0x97F4, + 49205 - 44032: 0x97F5, + 49206 - 44032: 0x97F6, + 49207 - 44032: 0x97F7, + 49208 - 44032: 0x97F8, + 49209 - 44032: 0x97F9, + 49210 - 44032: 0x97FA, + 49211 - 44032: 0x97FB, + 49212 - 44032: 0xBBD8, + 49213 - 44032: 0x97FC, + 49214 - 44032: 0x97FD, + 49215 - 44032: 0x97FE, + 49216 - 44032: 0x9841, + 49217 - 44032: 0x9842, + 49218 - 44032: 0x9843, + 49219 - 44032: 0x9844, + 49220 - 44032: 0x9845, + 49221 - 44032: 0x9846, + 49222 - 44032: 0x9847, + 49223 - 44032: 0x9848, + 49224 - 44032: 0x9849, + 49225 - 44032: 0x984A, + 49226 - 44032: 0x984B, + 49227 - 44032: 0x984C, + 49228 - 44032: 0x984D, + 49229 - 44032: 0x984E, + 49230 - 44032: 0x984F, + 49231 - 44032: 0x9850, + 49232 - 44032: 0x9851, + 49233 - 44032: 0xBBD9, + 49234 - 44032: 0x9852, + 49235 - 44032: 0x9853, + 49236 - 44032: 0x9854, + 49237 - 44032: 0x9855, + 49238 - 44032: 0x9856, + 49239 - 44032: 0x9857, + 49240 - 44032: 0xBBDA, + 49241 - 44032: 0x9858, + 49242 - 44032: 0x9859, + 49243 - 44032: 0x985A, + 49244 - 44032: 0xBBDB, + 49245 - 44032: 0x9861, + 49246 - 44032: 0x9862, + 49247 - 44032: 0x9863, + 49248 - 44032: 0xBBDC, + 49249 - 44032: 0x9864, + 49250 - 44032: 0x9865, + 49251 - 44032: 0x9866, + 49252 - 44032: 0x9867, + 49253 - 44032: 0x9868, + 49254 - 44032: 0x9869, + 49255 - 44032: 0x986A, + 49256 - 44032: 0xBBDD, + 49257 - 44032: 0xBBDE, + 49258 - 44032: 0x986B, + 49259 - 44032: 0x986C, + 49260 - 44032: 0x986D, + 49261 - 44032: 0x986E, + 49262 - 44032: 0x986F, + 49263 - 44032: 0x9870, + 49264 - 44032: 0x9871, + 49265 - 44032: 0x9872, + 49266 - 44032: 0x9873, + 49267 - 44032: 0x9874, + 49268 - 44032: 0x9875, + 49269 - 44032: 0x9876, + 49270 - 44032: 0x9877, + 49271 - 44032: 0x9878, + 49272 - 44032: 0x9879, + 49273 - 44032: 0x987A, + 49274 - 44032: 0x9881, + 49275 - 44032: 0x9882, + 49276 - 44032: 0x9883, + 49277 - 44032: 0x9884, + 49278 - 44032: 0x9885, + 49279 - 44032: 0x9886, + 49280 - 44032: 0x9887, + 49281 - 44032: 0x9888, + 49282 - 44032: 0x9889, + 49283 - 44032: 0x988A, + 49284 - 44032: 0x988B, + 49285 - 44032: 0x988C, + 49286 - 44032: 0x988D, + 49287 - 44032: 0x988E, + 49288 - 44032: 0x988F, + 49289 - 44032: 0x9890, + 49290 - 44032: 0x9891, + 49291 - 44032: 0x9892, + 49292 - 44032: 0x9893, + 49293 - 44032: 0x9894, + 49294 - 44032: 0x9895, + 49295 - 44032: 0x9896, + 49296 - 44032: 0xBBDF, + 49297 - 44032: 0xBBE0, + 49298 - 44032: 0x9897, + 49299 - 44032: 0x9898, + 49300 - 44032: 0xBBE1, + 49301 - 44032: 0x9899, + 49302 - 44032: 0x989A, + 49303 - 44032: 0x989B, + 49304 - 44032: 0xBBE2, + 49305 - 44032: 0x989C, + 49306 - 44032: 0x989D, + 49307 - 44032: 0x989E, + 49308 - 44032: 0x989F, + 49309 - 44032: 0x98A0, + 49310 - 44032: 0x98A1, + 49311 - 44032: 0x98A2, + 49312 - 44032: 0xBBE3, + 49313 - 44032: 0xBBE4, + 49314 - 44032: 0x98A3, + 49315 - 44032: 0xBBE5, + 49316 - 44032: 0x98A4, + 49317 - 44032: 0xBBE6, + 49318 - 44032: 0x98A5, + 49319 - 44032: 0x98A6, + 49320 - 44032: 0x98A7, + 49321 - 44032: 0x98A8, + 49322 - 44032: 0x98A9, + 49323 - 44032: 0x98AA, + 49324 - 44032: 0xBBE7, + 49325 - 44032: 0xBBE8, + 49326 - 44032: 0x98AB, + 49327 - 44032: 0xBBE9, + 49328 - 44032: 0xBBEA, + 49329 - 44032: 0x98AC, + 49330 - 44032: 0x98AD, + 49331 - 44032: 0xBBEB, + 49332 - 44032: 0xBBEC, + 49333 - 44032: 0xBBED, + 49334 - 44032: 0xBBEE, + 49335 - 44032: 0x98AE, + 49336 - 44032: 0x98AF, + 49337 - 44032: 0x98B0, + 49338 - 44032: 0x98B1, + 49339 - 44032: 0x98B2, + 49340 - 44032: 0xBBEF, + 49341 - 44032: 0xBBF0, + 49342 - 44032: 0x98B3, + 49343 - 44032: 0xBBF1, + 49344 - 44032: 0xBBF2, + 49345 - 44032: 0xBBF3, + 49346 - 44032: 0x98B4, + 49347 - 44032: 0x98B5, + 49348 - 44032: 0x98B6, + 49349 - 44032: 0xBBF4, + 49350 - 44032: 0x98B7, + 49351 - 44032: 0x98B8, + 49352 - 44032: 0xBBF5, + 49353 - 44032: 0xBBF6, + 49354 - 44032: 0x98B9, + 49355 - 44032: 0x98BA, + 49356 - 44032: 0xBBF7, + 49357 - 44032: 0x98BB, + 49358 - 44032: 0x98BC, + 49359 - 44032: 0x98BD, + 49360 - 44032: 0xBBF8, + 49361 - 44032: 0x98BE, + 49362 - 44032: 0x98BF, + 49363 - 44032: 0x98C0, + 49364 - 44032: 0x98C1, + 49365 - 44032: 0x98C2, + 49366 - 44032: 0x98C3, + 49367 - 44032: 0x98C4, + 49368 - 44032: 0xBBF9, + 49369 - 44032: 0xBBFA, + 49370 - 44032: 0x98C5, + 49371 - 44032: 0xBBFB, + 49372 - 44032: 0xBBFC, + 49373 - 44032: 0xBBFD, + 49374 - 44032: 0x98C6, + 49375 - 44032: 0x98C7, + 49376 - 44032: 0x98C8, + 49377 - 44032: 0x98C9, + 49378 - 44032: 0x98CA, + 49379 - 44032: 0x98CB, + 49380 - 44032: 0xBBFE, + 49381 - 44032: 0xBCA1, + 49382 - 44032: 0x98CC, + 49383 - 44032: 0x98CD, + 49384 - 44032: 0xBCA2, + 49385 - 44032: 0x98CE, + 49386 - 44032: 0x98CF, + 49387 - 44032: 0x98D0, + 49388 - 44032: 0xBCA3, + 49389 - 44032: 0x98D1, + 49390 - 44032: 0x98D2, + 49391 - 44032: 0x98D3, + 49392 - 44032: 0x98D4, + 49393 - 44032: 0x98D5, + 49394 - 44032: 0x98D6, + 49395 - 44032: 0x98D7, + 49396 - 44032: 0xBCA4, + 49397 - 44032: 0xBCA5, + 49398 - 44032: 0x98D8, + 49399 - 44032: 0xBCA6, + 49400 - 44032: 0x98D9, + 49401 - 44032: 0xBCA7, + 49402 - 44032: 0x98DA, + 49403 - 44032: 0x98DB, + 49404 - 44032: 0x98DC, + 49405 - 44032: 0x98DD, + 49406 - 44032: 0x98DE, + 49407 - 44032: 0x98DF, + 49408 - 44032: 0xBCA8, + 49409 - 44032: 0x98E0, + 49410 - 44032: 0x98E1, + 49411 - 44032: 0x98E2, + 49412 - 44032: 0xBCA9, + 49413 - 44032: 0x98E3, + 49414 - 44032: 0x98E4, + 49415 - 44032: 0x98E5, + 49416 - 44032: 0xBCAA, + 49417 - 44032: 0x98E6, + 49418 - 44032: 0x98E7, + 49419 - 44032: 0x98E8, + 49420 - 44032: 0x98E9, + 49421 - 44032: 0x98EA, + 49422 - 44032: 0x98EB, + 49423 - 44032: 0x98EC, + 49424 - 44032: 0xBCAB, + 49425 - 44032: 0x98ED, + 49426 - 44032: 0x98EE, + 49427 - 44032: 0x98EF, + 49428 - 44032: 0x98F0, + 49429 - 44032: 0xBCAC, + 49430 - 44032: 0x98F1, + 49431 - 44032: 0x98F2, + 49432 - 44032: 0x98F3, + 49433 - 44032: 0x98F4, + 49434 - 44032: 0x98F5, + 49435 - 44032: 0x98F6, + 49436 - 44032: 0xBCAD, + 49437 - 44032: 0xBCAE, + 49438 - 44032: 0xBCAF, + 49439 - 44032: 0xBCB0, + 49440 - 44032: 0xBCB1, + 49441 - 44032: 0x98F7, + 49442 - 44032: 0x98F8, + 49443 - 44032: 0xBCB2, + 49444 - 44032: 0xBCB3, + 49445 - 44032: 0x98F9, + 49446 - 44032: 0xBCB4, + 49447 - 44032: 0xBCB5, + 49448 - 44032: 0x98FA, + 49449 - 44032: 0x98FB, + 49450 - 44032: 0x98FC, + 49451 - 44032: 0x98FD, + 49452 - 44032: 0xBCB6, + 49453 - 44032: 0xBCB7, + 49454 - 44032: 0x98FE, + 49455 - 44032: 0xBCB8, + 49456 - 44032: 0xBCB9, + 49457 - 44032: 0xBCBA, + 49458 - 44032: 0x9941, + 49459 - 44032: 0x9942, + 49460 - 44032: 0x9943, + 49461 - 44032: 0x9944, + 49462 - 44032: 0xBCBB, + 49463 - 44032: 0x9945, + 49464 - 44032: 0xBCBC, + 49465 - 44032: 0xBCBD, + 49466 - 44032: 0x9946, + 49467 - 44032: 0x9947, + 49468 - 44032: 0xBCBE, + 49469 - 44032: 0x9948, + 49470 - 44032: 0x9949, + 49471 - 44032: 0x994A, + 49472 - 44032: 0xBCBF, + 49473 - 44032: 0x994B, + 49474 - 44032: 0x994C, + 49475 - 44032: 0x994D, + 49476 - 44032: 0x994E, + 49477 - 44032: 0x994F, + 49478 - 44032: 0x9950, + 49479 - 44032: 0x9951, + 49480 - 44032: 0xBCC0, + 49481 - 44032: 0xBCC1, + 49482 - 44032: 0x9952, + 49483 - 44032: 0xBCC2, + 49484 - 44032: 0xBCC3, + 49485 - 44032: 0xBCC4, + 49486 - 44032: 0x9953, + 49487 - 44032: 0x9954, + 49488 - 44032: 0x9955, + 49489 - 44032: 0x9956, + 49490 - 44032: 0x9957, + 49491 - 44032: 0x9958, + 49492 - 44032: 0xBCC5, + 49493 - 44032: 0xBCC6, + 49494 - 44032: 0x9959, + 49495 - 44032: 0x995A, + 49496 - 44032: 0xBCC7, + 49497 - 44032: 0x9961, + 49498 - 44032: 0x9962, + 49499 - 44032: 0x9963, + 49500 - 44032: 0xBCC8, + 49501 - 44032: 0x9964, + 49502 - 44032: 0x9965, + 49503 - 44032: 0x9966, + 49504 - 44032: 0x9967, + 49505 - 44032: 0x9968, + 49506 - 44032: 0x9969, + 49507 - 44032: 0x996A, + 49508 - 44032: 0xBCC9, + 49509 - 44032: 0xBCCA, + 49510 - 44032: 0x996B, + 49511 - 44032: 0xBCCB, + 49512 - 44032: 0xBCCC, + 49513 - 44032: 0xBCCD, + 49514 - 44032: 0x996C, + 49515 - 44032: 0x996D, + 49516 - 44032: 0x996E, + 49517 - 44032: 0x996F, + 49518 - 44032: 0x9970, + 49519 - 44032: 0x9971, + 49520 - 44032: 0xBCCE, + 49521 - 44032: 0x9972, + 49522 - 44032: 0x9973, + 49523 - 44032: 0x9974, + 49524 - 44032: 0xBCCF, + 49525 - 44032: 0x9975, + 49526 - 44032: 0x9976, + 49527 - 44032: 0x9977, + 49528 - 44032: 0xBCD0, + 49529 - 44032: 0x9978, + 49530 - 44032: 0x9979, + 49531 - 44032: 0x997A, + 49532 - 44032: 0x9981, + 49533 - 44032: 0x9982, + 49534 - 44032: 0x9983, + 49535 - 44032: 0x9984, + 49536 - 44032: 0x9985, + 49537 - 44032: 0x9986, + 49538 - 44032: 0x9987, + 49539 - 44032: 0x9988, + 49540 - 44032: 0x9989, + 49541 - 44032: 0xBCD1, + 49542 - 44032: 0x998A, + 49543 - 44032: 0x998B, + 49544 - 44032: 0x998C, + 49545 - 44032: 0x998D, + 49546 - 44032: 0x998E, + 49547 - 44032: 0x998F, + 49548 - 44032: 0xBCD2, + 49549 - 44032: 0xBCD3, + 49550 - 44032: 0xBCD4, + 49551 - 44032: 0x9990, + 49552 - 44032: 0xBCD5, + 49553 - 44032: 0x9991, + 49554 - 44032: 0x9992, + 49555 - 44032: 0x9993, + 49556 - 44032: 0xBCD6, + 49557 - 44032: 0x9994, + 49558 - 44032: 0xBCD7, + 49559 - 44032: 0x9995, + 49560 - 44032: 0x9996, + 49561 - 44032: 0x9997, + 49562 - 44032: 0x9998, + 49563 - 44032: 0x9999, + 49564 - 44032: 0xBCD8, + 49565 - 44032: 0xBCD9, + 49566 - 44032: 0x999A, + 49567 - 44032: 0xBCDA, + 49568 - 44032: 0x999B, + 49569 - 44032: 0xBCDB, + 49570 - 44032: 0x999C, + 49571 - 44032: 0x999D, + 49572 - 44032: 0x999E, + 49573 - 44032: 0xBCDC, + 49574 - 44032: 0x999F, + 49575 - 44032: 0x99A0, + 49576 - 44032: 0xBCDD, + 49577 - 44032: 0xBCDE, + 49578 - 44032: 0x99A1, + 49579 - 44032: 0x99A2, + 49580 - 44032: 0xBCDF, + 49581 - 44032: 0x99A3, + 49582 - 44032: 0x99A4, + 49583 - 44032: 0x99A5, + 49584 - 44032: 0xBCE0, + 49585 - 44032: 0x99A6, + 49586 - 44032: 0x99A7, + 49587 - 44032: 0x99A8, + 49588 - 44032: 0x99A9, + 49589 - 44032: 0x99AA, + 49590 - 44032: 0x99AB, + 49591 - 44032: 0x99AC, + 49592 - 44032: 0x99AD, + 49593 - 44032: 0x99AE, + 49594 - 44032: 0x99AF, + 49595 - 44032: 0x99B0, + 49596 - 44032: 0x99B1, + 49597 - 44032: 0xBCE1, + 49598 - 44032: 0x99B2, + 49599 - 44032: 0x99B3, + 49600 - 44032: 0x99B4, + 49601 - 44032: 0x99B5, + 49602 - 44032: 0x99B6, + 49603 - 44032: 0x99B7, + 49604 - 44032: 0xBCE2, + 49605 - 44032: 0x99B8, + 49606 - 44032: 0x99B9, + 49607 - 44032: 0x99BA, + 49608 - 44032: 0xBCE3, + 49609 - 44032: 0x99BB, + 49610 - 44032: 0x99BC, + 49611 - 44032: 0x99BD, + 49612 - 44032: 0xBCE4, + 49613 - 44032: 0x99BE, + 49614 - 44032: 0x99BF, + 49615 - 44032: 0x99C0, + 49616 - 44032: 0x99C1, + 49617 - 44032: 0x99C2, + 49618 - 44032: 0x99C3, + 49619 - 44032: 0x99C4, + 49620 - 44032: 0xBCE5, + 49621 - 44032: 0x99C5, + 49622 - 44032: 0x99C6, + 49623 - 44032: 0xBCE6, + 49624 - 44032: 0xBCE7, + 49625 - 44032: 0x99C7, + 49626 - 44032: 0x99C8, + 49627 - 44032: 0x99C9, + 49628 - 44032: 0x99CA, + 49629 - 44032: 0x99CB, + 49630 - 44032: 0x99CC, + 49631 - 44032: 0x99CD, + 49632 - 44032: 0xBCE8, + 49633 - 44032: 0x99CE, + 49634 - 44032: 0x99CF, + 49635 - 44032: 0x99D0, + 49636 - 44032: 0xBCE9, + 49637 - 44032: 0x99D1, + 49638 - 44032: 0x99D2, + 49639 - 44032: 0x99D3, + 49640 - 44032: 0xBCEA, + 49641 - 44032: 0x99D4, + 49642 - 44032: 0x99D5, + 49643 - 44032: 0x99D6, + 49644 - 44032: 0x99D7, + 49645 - 44032: 0x99D8, + 49646 - 44032: 0x99D9, + 49647 - 44032: 0x99DA, + 49648 - 44032: 0xBCEB, + 49649 - 44032: 0xBCEC, + 49650 - 44032: 0x99DB, + 49651 - 44032: 0xBCED, + 49652 - 44032: 0x99DC, + 49653 - 44032: 0x99DD, + 49654 - 44032: 0x99DE, + 49655 - 44032: 0x99DF, + 49656 - 44032: 0x99E0, + 49657 - 44032: 0x99E1, + 49658 - 44032: 0x99E2, + 49659 - 44032: 0x99E3, + 49660 - 44032: 0xBCEE, + 49661 - 44032: 0xBCEF, + 49662 - 44032: 0x99E4, + 49663 - 44032: 0x99E5, + 49664 - 44032: 0xBCF0, + 49665 - 44032: 0x99E6, + 49666 - 44032: 0x99E7, + 49667 - 44032: 0x99E8, + 49668 - 44032: 0xBCF1, + 49669 - 44032: 0x99E9, + 49670 - 44032: 0x99EA, + 49671 - 44032: 0x99EB, + 49672 - 44032: 0x99EC, + 49673 - 44032: 0x99ED, + 49674 - 44032: 0x99EE, + 49675 - 44032: 0x99EF, + 49676 - 44032: 0xBCF2, + 49677 - 44032: 0xBCF3, + 49678 - 44032: 0x99F0, + 49679 - 44032: 0xBCF4, + 49680 - 44032: 0x99F1, + 49681 - 44032: 0xBCF5, + 49682 - 44032: 0x99F2, + 49683 - 44032: 0x99F3, + 49684 - 44032: 0x99F4, + 49685 - 44032: 0x99F5, + 49686 - 44032: 0x99F6, + 49687 - 44032: 0x99F7, + 49688 - 44032: 0xBCF6, + 49689 - 44032: 0xBCF7, + 49690 - 44032: 0x99F8, + 49691 - 44032: 0x99F9, + 49692 - 44032: 0xBCF8, + 49693 - 44032: 0x99FA, + 49694 - 44032: 0x99FB, + 49695 - 44032: 0xBCF9, + 49696 - 44032: 0xBCFA, + 49697 - 44032: 0x99FC, + 49698 - 44032: 0x99FD, + 49699 - 44032: 0x99FE, + 49700 - 44032: 0x9A41, + 49701 - 44032: 0x9A42, + 49702 - 44032: 0x9A43, + 49703 - 44032: 0x9A44, + 49704 - 44032: 0xBCFB, + 49705 - 44032: 0xBCFC, + 49706 - 44032: 0x9A45, + 49707 - 44032: 0xBCFD, + 49708 - 44032: 0x9A46, + 49709 - 44032: 0xBCFE, + 49710 - 44032: 0x9A47, + 49711 - 44032: 0xBDA1, + 49712 - 44032: 0x9A48, + 49713 - 44032: 0xBDA2, + 49714 - 44032: 0xBDA3, + 49715 - 44032: 0x9A49, + 49716 - 44032: 0xBDA4, + 49717 - 44032: 0x9A4A, + 49718 - 44032: 0x9A4B, + 49719 - 44032: 0x9A4C, + 49720 - 44032: 0x9A4D, + 49721 - 44032: 0x9A4E, + 49722 - 44032: 0x9A4F, + 49723 - 44032: 0x9A50, + 49724 - 44032: 0x9A51, + 49725 - 44032: 0x9A52, + 49726 - 44032: 0x9A53, + 49727 - 44032: 0x9A54, + 49728 - 44032: 0x9A55, + 49729 - 44032: 0x9A56, + 49730 - 44032: 0x9A57, + 49731 - 44032: 0x9A58, + 49732 - 44032: 0x9A59, + 49733 - 44032: 0x9A5A, + 49734 - 44032: 0x9A61, + 49735 - 44032: 0x9A62, + 49736 - 44032: 0xBDA5, + 49737 - 44032: 0x9A63, + 49738 - 44032: 0x9A64, + 49739 - 44032: 0x9A65, + 49740 - 44032: 0x9A66, + 49741 - 44032: 0x9A67, + 49742 - 44032: 0x9A68, + 49743 - 44032: 0x9A69, + 49744 - 44032: 0xBDA6, + 49745 - 44032: 0xBDA7, + 49746 - 44032: 0x9A6A, + 49747 - 44032: 0x9A6B, + 49748 - 44032: 0xBDA8, + 49749 - 44032: 0x9A6C, + 49750 - 44032: 0x9A6D, + 49751 - 44032: 0x9A6E, + 49752 - 44032: 0xBDA9, + 49753 - 44032: 0x9A6F, + 49754 - 44032: 0x9A70, + 49755 - 44032: 0x9A71, + 49756 - 44032: 0x9A72, + 49757 - 44032: 0x9A73, + 49758 - 44032: 0x9A74, + 49759 - 44032: 0x9A75, + 49760 - 44032: 0xBDAA, + 49761 - 44032: 0x9A76, + 49762 - 44032: 0x9A77, + 49763 - 44032: 0x9A78, + 49764 - 44032: 0x9A79, + 49765 - 44032: 0xBDAB, + 49766 - 44032: 0x9A7A, + 49767 - 44032: 0x9A81, + 49768 - 44032: 0x9A82, + 49769 - 44032: 0x9A83, + 49770 - 44032: 0x9A84, + 49771 - 44032: 0x9A85, + 49772 - 44032: 0xBDAC, + 49773 - 44032: 0xBDAD, + 49774 - 44032: 0x9A86, + 49775 - 44032: 0x9A87, + 49776 - 44032: 0xBDAE, + 49777 - 44032: 0x9A88, + 49778 - 44032: 0x9A89, + 49779 - 44032: 0x9A8A, + 49780 - 44032: 0xBDAF, + 49781 - 44032: 0x9A8B, + 49782 - 44032: 0x9A8C, + 49783 - 44032: 0x9A8D, + 49784 - 44032: 0x9A8E, + 49785 - 44032: 0x9A8F, + 49786 - 44032: 0x9A90, + 49787 - 44032: 0x9A91, + 49788 - 44032: 0xBDB0, + 49789 - 44032: 0xBDB1, + 49790 - 44032: 0x9A92, + 49791 - 44032: 0xBDB2, + 49792 - 44032: 0x9A93, + 49793 - 44032: 0xBDB3, + 49794 - 44032: 0x9A94, + 49795 - 44032: 0x9A95, + 49796 - 44032: 0x9A96, + 49797 - 44032: 0x9A97, + 49798 - 44032: 0x9A98, + 49799 - 44032: 0x9A99, + 49800 - 44032: 0xBDB4, + 49801 - 44032: 0xBDB5, + 49802 - 44032: 0x9A9A, + 49803 - 44032: 0x9A9B, + 49804 - 44032: 0x9A9C, + 49805 - 44032: 0x9A9D, + 49806 - 44032: 0x9A9E, + 49807 - 44032: 0x9A9F, + 49808 - 44032: 0xBDB6, + 49809 - 44032: 0x9AA0, + 49810 - 44032: 0x9AA1, + 49811 - 44032: 0x9AA2, + 49812 - 44032: 0x9AA3, + 49813 - 44032: 0x9AA4, + 49814 - 44032: 0x9AA5, + 49815 - 44032: 0x9AA6, + 49816 - 44032: 0xBDB7, + 49817 - 44032: 0x9AA7, + 49818 - 44032: 0x9AA8, + 49819 - 44032: 0xBDB8, + 49820 - 44032: 0x9AA9, + 49821 - 44032: 0xBDB9, + 49822 - 44032: 0x9AAA, + 49823 - 44032: 0x9AAB, + 49824 - 44032: 0x9AAC, + 49825 - 44032: 0x9AAD, + 49826 - 44032: 0x9AAE, + 49827 - 44032: 0x9AAF, + 49828 - 44032: 0xBDBA, + 49829 - 44032: 0xBDBB, + 49830 - 44032: 0x9AB0, + 49831 - 44032: 0x9AB1, + 49832 - 44032: 0xBDBC, + 49833 - 44032: 0x9AB2, + 49834 - 44032: 0x9AB3, + 49835 - 44032: 0x9AB4, + 49836 - 44032: 0xBDBD, + 49837 - 44032: 0xBDBE, + 49838 - 44032: 0x9AB5, + 49839 - 44032: 0x9AB6, + 49840 - 44032: 0x9AB7, + 49841 - 44032: 0x9AB8, + 49842 - 44032: 0x9AB9, + 49843 - 44032: 0x9ABA, + 49844 - 44032: 0xBDBF, + 49845 - 44032: 0xBDC0, + 49846 - 44032: 0x9ABB, + 49847 - 44032: 0xBDC1, + 49848 - 44032: 0x9ABC, + 49849 - 44032: 0xBDC2, + 49850 - 44032: 0x9ABD, + 49851 - 44032: 0x9ABE, + 49852 - 44032: 0x9ABF, + 49853 - 44032: 0x9AC0, + 49854 - 44032: 0x9AC1, + 49855 - 44032: 0x9AC2, + 49856 - 44032: 0x9AC3, + 49857 - 44032: 0x9AC4, + 49858 - 44032: 0x9AC5, + 49859 - 44032: 0x9AC6, + 49860 - 44032: 0x9AC7, + 49861 - 44032: 0x9AC8, + 49862 - 44032: 0x9AC9, + 49863 - 44032: 0x9ACA, + 49864 - 44032: 0x9ACB, + 49865 - 44032: 0x9ACC, + 49866 - 44032: 0x9ACD, + 49867 - 44032: 0x9ACE, + 49868 - 44032: 0x9ACF, + 49869 - 44032: 0x9AD0, + 49870 - 44032: 0x9AD1, + 49871 - 44032: 0x9AD2, + 49872 - 44032: 0x9AD3, + 49873 - 44032: 0x9AD4, + 49874 - 44032: 0x9AD5, + 49875 - 44032: 0x9AD6, + 49876 - 44032: 0x9AD7, + 49877 - 44032: 0x9AD8, + 49878 - 44032: 0x9AD9, + 49879 - 44032: 0x9ADA, + 49880 - 44032: 0x9ADB, + 49881 - 44032: 0x9ADC, + 49882 - 44032: 0x9ADD, + 49883 - 44032: 0x9ADE, + 49884 - 44032: 0xBDC3, + 49885 - 44032: 0xBDC4, + 49886 - 44032: 0x9ADF, + 49887 - 44032: 0x9AE0, + 49888 - 44032: 0xBDC5, + 49889 - 44032: 0x9AE1, + 49890 - 44032: 0x9AE2, + 49891 - 44032: 0xBDC6, + 49892 - 44032: 0xBDC7, + 49893 - 44032: 0x9AE3, + 49894 - 44032: 0x9AE4, + 49895 - 44032: 0x9AE5, + 49896 - 44032: 0x9AE6, + 49897 - 44032: 0x9AE7, + 49898 - 44032: 0x9AE8, + 49899 - 44032: 0xBDC8, + 49900 - 44032: 0xBDC9, + 49901 - 44032: 0xBDCA, + 49902 - 44032: 0x9AE9, + 49903 - 44032: 0xBDCB, + 49904 - 44032: 0x9AEA, + 49905 - 44032: 0xBDCC, + 49906 - 44032: 0x9AEB, + 49907 - 44032: 0x9AEC, + 49908 - 44032: 0x9AED, + 49909 - 44032: 0x9AEE, + 49910 - 44032: 0xBDCD, + 49911 - 44032: 0x9AEF, + 49912 - 44032: 0xBDCE, + 49913 - 44032: 0xBDCF, + 49914 - 44032: 0x9AF0, + 49915 - 44032: 0xBDD0, + 49916 - 44032: 0xBDD1, + 49917 - 44032: 0x9AF1, + 49918 - 44032: 0x9AF2, + 49919 - 44032: 0x9AF3, + 49920 - 44032: 0xBDD2, + 49921 - 44032: 0x9AF4, + 49922 - 44032: 0x9AF5, + 49923 - 44032: 0x9AF6, + 49924 - 44032: 0x9AF7, + 49925 - 44032: 0x9AF8, + 49926 - 44032: 0x9AF9, + 49927 - 44032: 0x9AFA, + 49928 - 44032: 0xBDD3, + 49929 - 44032: 0xBDD4, + 49930 - 44032: 0x9AFB, + 49931 - 44032: 0x9AFC, + 49932 - 44032: 0xBDD5, + 49933 - 44032: 0xBDD6, + 49934 - 44032: 0x9AFD, + 49935 - 44032: 0x9AFE, + 49936 - 44032: 0x9B41, + 49937 - 44032: 0x9B42, + 49938 - 44032: 0x9B43, + 49939 - 44032: 0xBDD7, + 49940 - 44032: 0xBDD8, + 49941 - 44032: 0xBDD9, + 49942 - 44032: 0x9B44, + 49943 - 44032: 0x9B45, + 49944 - 44032: 0xBDDA, + 49945 - 44032: 0x9B46, + 49946 - 44032: 0x9B47, + 49947 - 44032: 0x9B48, + 49948 - 44032: 0xBDDB, + 49949 - 44032: 0x9B49, + 49950 - 44032: 0x9B4A, + 49951 - 44032: 0x9B4B, + 49952 - 44032: 0x9B4C, + 49953 - 44032: 0x9B4D, + 49954 - 44032: 0x9B4E, + 49955 - 44032: 0x9B4F, + 49956 - 44032: 0xBDDC, + 49957 - 44032: 0xBDDD, + 49958 - 44032: 0x9B50, + 49959 - 44032: 0x9B51, + 49960 - 44032: 0xBDDE, + 49961 - 44032: 0xBDDF, + 49962 - 44032: 0x9B52, + 49963 - 44032: 0x9B53, + 49964 - 44032: 0x9B54, + 49965 - 44032: 0x9B55, + 49966 - 44032: 0x9B56, + 49967 - 44032: 0x9B57, + 49968 - 44032: 0x9B58, + 49969 - 44032: 0x9B59, + 49970 - 44032: 0x9B5A, + 49971 - 44032: 0x9B61, + 49972 - 44032: 0x9B62, + 49973 - 44032: 0x9B63, + 49974 - 44032: 0x9B64, + 49975 - 44032: 0x9B65, + 49976 - 44032: 0x9B66, + 49977 - 44032: 0x9B67, + 49978 - 44032: 0x9B68, + 49979 - 44032: 0x9B69, + 49980 - 44032: 0x9B6A, + 49981 - 44032: 0x9B6B, + 49982 - 44032: 0x9B6C, + 49983 - 44032: 0x9B6D, + 49984 - 44032: 0x9B6E, + 49985 - 44032: 0x9B6F, + 49986 - 44032: 0x9B70, + 49987 - 44032: 0x9B71, + 49988 - 44032: 0x9B72, + 49989 - 44032: 0xBDE0, + 49990 - 44032: 0x9B73, + 49991 - 44032: 0x9B74, + 49992 - 44032: 0x9B75, + 49993 - 44032: 0x9B76, + 49994 - 44032: 0x9B77, + 49995 - 44032: 0x9B78, + 49996 - 44032: 0x9B79, + 49997 - 44032: 0x9B7A, + 49998 - 44032: 0x9B81, + 49999 - 44032: 0x9B82, + 50000 - 44032: 0x9B83, + 50001 - 44032: 0x9B84, + 50002 - 44032: 0x9B85, + 50003 - 44032: 0x9B86, + 50004 - 44032: 0x9B87, + 50005 - 44032: 0x9B88, + 50006 - 44032: 0x9B89, + 50007 - 44032: 0x9B8A, + 50008 - 44032: 0x9B8B, + 50009 - 44032: 0x9B8C, + 50010 - 44032: 0x9B8D, + 50011 - 44032: 0x9B8E, + 50012 - 44032: 0x9B8F, + 50013 - 44032: 0x9B90, + 50014 - 44032: 0x9B91, + 50015 - 44032: 0x9B92, + 50016 - 44032: 0x9B93, + 50017 - 44032: 0x9B94, + 50018 - 44032: 0x9B95, + 50019 - 44032: 0x9B96, + 50020 - 44032: 0x9B97, + 50021 - 44032: 0x9B98, + 50022 - 44032: 0x9B99, + 50023 - 44032: 0x9B9A, + 50024 - 44032: 0xBDE1, + 50025 - 44032: 0xBDE2, + 50026 - 44032: 0x9B9B, + 50027 - 44032: 0x9B9C, + 50028 - 44032: 0xBDE3, + 50029 - 44032: 0x9B9D, + 50030 - 44032: 0x9B9E, + 50031 - 44032: 0x9B9F, + 50032 - 44032: 0xBDE4, + 50033 - 44032: 0x9BA0, + 50034 - 44032: 0xBDE5, + 50035 - 44032: 0x9BA1, + 50036 - 44032: 0x9BA2, + 50037 - 44032: 0x9BA3, + 50038 - 44032: 0x9BA4, + 50039 - 44032: 0x9BA5, + 50040 - 44032: 0xBDE6, + 50041 - 44032: 0xBDE7, + 50042 - 44032: 0x9BA6, + 50043 - 44032: 0x9BA7, + 50044 - 44032: 0xBDE8, + 50045 - 44032: 0xBDE9, + 50046 - 44032: 0x9BA8, + 50047 - 44032: 0x9BA9, + 50048 - 44032: 0x9BAA, + 50049 - 44032: 0x9BAB, + 50050 - 44032: 0x9BAC, + 50051 - 44032: 0x9BAD, + 50052 - 44032: 0xBDEA, + 50053 - 44032: 0x9BAE, + 50054 - 44032: 0x9BAF, + 50055 - 44032: 0x9BB0, + 50056 - 44032: 0xBDEB, + 50057 - 44032: 0x9BB1, + 50058 - 44032: 0x9BB2, + 50059 - 44032: 0x9BB3, + 50060 - 44032: 0xBDEC, + 50061 - 44032: 0x9BB4, + 50062 - 44032: 0x9BB5, + 50063 - 44032: 0x9BB6, + 50064 - 44032: 0x9BB7, + 50065 - 44032: 0x9BB8, + 50066 - 44032: 0x9BB9, + 50067 - 44032: 0x9BBA, + 50068 - 44032: 0x9BBB, + 50069 - 44032: 0x9BBC, + 50070 - 44032: 0x9BBD, + 50071 - 44032: 0x9BBE, + 50072 - 44032: 0x9BBF, + 50073 - 44032: 0x9BC0, + 50074 - 44032: 0x9BC1, + 50075 - 44032: 0x9BC2, + 50076 - 44032: 0x9BC3, + 50077 - 44032: 0x9BC4, + 50078 - 44032: 0x9BC5, + 50079 - 44032: 0x9BC6, + 50080 - 44032: 0x9BC7, + 50081 - 44032: 0x9BC8, + 50082 - 44032: 0x9BC9, + 50083 - 44032: 0x9BCA, + 50084 - 44032: 0x9BCB, + 50085 - 44032: 0x9BCC, + 50086 - 44032: 0x9BCD, + 50087 - 44032: 0x9BCE, + 50088 - 44032: 0x9BCF, + 50089 - 44032: 0x9BD0, + 50090 - 44032: 0x9BD1, + 50091 - 44032: 0x9BD2, + 50092 - 44032: 0x9BD3, + 50093 - 44032: 0x9BD4, + 50094 - 44032: 0x9BD5, + 50095 - 44032: 0x9BD6, + 50096 - 44032: 0x9BD7, + 50097 - 44032: 0x9BD8, + 50098 - 44032: 0x9BD9, + 50099 - 44032: 0x9BDA, + 50100 - 44032: 0x9BDB, + 50101 - 44032: 0x9BDC, + 50102 - 44032: 0x9BDD, + 50103 - 44032: 0x9BDE, + 50104 - 44032: 0x9BDF, + 50105 - 44032: 0x9BE0, + 50106 - 44032: 0x9BE1, + 50107 - 44032: 0x9BE2, + 50108 - 44032: 0x9BE3, + 50109 - 44032: 0x9BE4, + 50110 - 44032: 0x9BE5, + 50111 - 44032: 0x9BE6, + 50112 - 44032: 0xBDED, + 50113 - 44032: 0x9BE7, + 50114 - 44032: 0x9BE8, + 50115 - 44032: 0x9BE9, + 50116 - 44032: 0x9BEA, + 50117 - 44032: 0x9BEB, + 50118 - 44032: 0x9BEC, + 50119 - 44032: 0x9BED, + 50120 - 44032: 0x9BEE, + 50121 - 44032: 0x9BEF, + 50122 - 44032: 0x9BF0, + 50123 - 44032: 0x9BF1, + 50124 - 44032: 0x9BF2, + 50125 - 44032: 0x9BF3, + 50126 - 44032: 0x9BF4, + 50127 - 44032: 0x9BF5, + 50128 - 44032: 0x9BF6, + 50129 - 44032: 0x9BF7, + 50130 - 44032: 0x9BF8, + 50131 - 44032: 0x9BF9, + 50132 - 44032: 0x9BFA, + 50133 - 44032: 0x9BFB, + 50134 - 44032: 0x9BFC, + 50135 - 44032: 0x9BFD, + 50136 - 44032: 0xBDEE, + 50137 - 44032: 0xBDEF, + 50138 - 44032: 0x9BFE, + 50139 - 44032: 0x9C41, + 50140 - 44032: 0xBDF0, + 50141 - 44032: 0x9C42, + 50142 - 44032: 0x9C43, + 50143 - 44032: 0xBDF1, + 50144 - 44032: 0xBDF2, + 50145 - 44032: 0x9C44, + 50146 - 44032: 0xBDF3, + 50147 - 44032: 0x9C45, + 50148 - 44032: 0x9C46, + 50149 - 44032: 0x9C47, + 50150 - 44032: 0x9C48, + 50151 - 44032: 0x9C49, + 50152 - 44032: 0xBDF4, + 50153 - 44032: 0xBDF5, + 50154 - 44032: 0x9C4A, + 50155 - 44032: 0x9C4B, + 50156 - 44032: 0x9C4C, + 50157 - 44032: 0xBDF6, + 50158 - 44032: 0x9C4D, + 50159 - 44032: 0x9C4E, + 50160 - 44032: 0x9C4F, + 50161 - 44032: 0x9C50, + 50162 - 44032: 0x9C51, + 50163 - 44032: 0x9C52, + 50164 - 44032: 0xBDF7, + 50165 - 44032: 0xBDF8, + 50166 - 44032: 0x9C53, + 50167 - 44032: 0x9C54, + 50168 - 44032: 0xBDF9, + 50169 - 44032: 0x9C55, + 50170 - 44032: 0x9C56, + 50171 - 44032: 0x9C57, + 50172 - 44032: 0x9C58, + 50173 - 44032: 0x9C59, + 50174 - 44032: 0x9C5A, + 50175 - 44032: 0x9C61, + 50176 - 44032: 0x9C62, + 50177 - 44032: 0x9C63, + 50178 - 44032: 0x9C64, + 50179 - 44032: 0x9C65, + 50180 - 44032: 0x9C66, + 50181 - 44032: 0x9C67, + 50182 - 44032: 0x9C68, + 50183 - 44032: 0x9C69, + 50184 - 44032: 0xBDFA, + 50185 - 44032: 0x9C6A, + 50186 - 44032: 0x9C6B, + 50187 - 44032: 0x9C6C, + 50188 - 44032: 0x9C6D, + 50189 - 44032: 0x9C6E, + 50190 - 44032: 0x9C6F, + 50191 - 44032: 0x9C70, + 50192 - 44032: 0xBDFB, + 50193 - 44032: 0x9C71, + 50194 - 44032: 0x9C72, + 50195 - 44032: 0x9C73, + 50196 - 44032: 0x9C74, + 50197 - 44032: 0x9C75, + 50198 - 44032: 0x9C76, + 50199 - 44032: 0x9C77, + 50200 - 44032: 0x9C78, + 50201 - 44032: 0x9C79, + 50202 - 44032: 0x9C7A, + 50203 - 44032: 0x9C81, + 50204 - 44032: 0x9C82, + 50205 - 44032: 0x9C83, + 50206 - 44032: 0x9C84, + 50207 - 44032: 0x9C85, + 50208 - 44032: 0x9C86, + 50209 - 44032: 0x9C87, + 50210 - 44032: 0x9C88, + 50211 - 44032: 0x9C89, + 50212 - 44032: 0xBDFC, + 50213 - 44032: 0x9C8A, + 50214 - 44032: 0x9C8B, + 50215 - 44032: 0x9C8C, + 50216 - 44032: 0x9C8D, + 50217 - 44032: 0x9C8E, + 50218 - 44032: 0x9C8F, + 50219 - 44032: 0x9C90, + 50220 - 44032: 0xBDFD, + 50221 - 44032: 0x9C91, + 50222 - 44032: 0x9C92, + 50223 - 44032: 0x9C93, + 50224 - 44032: 0xBDFE, + 50225 - 44032: 0x9C94, + 50226 - 44032: 0x9C95, + 50227 - 44032: 0x9C96, + 50228 - 44032: 0xBEA1, + 50229 - 44032: 0x9C97, + 50230 - 44032: 0x9C98, + 50231 - 44032: 0x9C99, + 50232 - 44032: 0x9C9A, + 50233 - 44032: 0x9C9B, + 50234 - 44032: 0x9C9C, + 50235 - 44032: 0x9C9D, + 50236 - 44032: 0xBEA2, + 50237 - 44032: 0xBEA3, + 50238 - 44032: 0x9C9E, + 50239 - 44032: 0x9C9F, + 50240 - 44032: 0x9CA0, + 50241 - 44032: 0x9CA1, + 50242 - 44032: 0x9CA2, + 50243 - 44032: 0x9CA3, + 50244 - 44032: 0x9CA4, + 50245 - 44032: 0x9CA5, + 50246 - 44032: 0x9CA6, + 50247 - 44032: 0x9CA7, + 50248 - 44032: 0xBEA4, + 50249 - 44032: 0x9CA8, + 50250 - 44032: 0x9CA9, + 50251 - 44032: 0x9CAA, + 50252 - 44032: 0x9CAB, + 50253 - 44032: 0x9CAC, + 50254 - 44032: 0x9CAD, + 50255 - 44032: 0x9CAE, + 50256 - 44032: 0x9CAF, + 50257 - 44032: 0x9CB0, + 50258 - 44032: 0x9CB1, + 50259 - 44032: 0x9CB2, + 50260 - 44032: 0x9CB3, + 50261 - 44032: 0x9CB4, + 50262 - 44032: 0x9CB5, + 50263 - 44032: 0x9CB6, + 50264 - 44032: 0x9CB7, + 50265 - 44032: 0x9CB8, + 50266 - 44032: 0x9CB9, + 50267 - 44032: 0x9CBA, + 50268 - 44032: 0x9CBB, + 50269 - 44032: 0x9CBC, + 50270 - 44032: 0x9CBD, + 50271 - 44032: 0x9CBE, + 50272 - 44032: 0x9CBF, + 50273 - 44032: 0x9CC0, + 50274 - 44032: 0x9CC1, + 50275 - 44032: 0x9CC2, + 50276 - 44032: 0xBEA5, + 50277 - 44032: 0xBEA6, + 50278 - 44032: 0x9CC3, + 50279 - 44032: 0x9CC4, + 50280 - 44032: 0xBEA7, + 50281 - 44032: 0x9CC5, + 50282 - 44032: 0x9CC6, + 50283 - 44032: 0x9CC7, + 50284 - 44032: 0xBEA8, + 50285 - 44032: 0x9CC8, + 50286 - 44032: 0x9CC9, + 50287 - 44032: 0x9CCA, + 50288 - 44032: 0x9CCB, + 50289 - 44032: 0x9CCC, + 50290 - 44032: 0x9CCD, + 50291 - 44032: 0x9CCE, + 50292 - 44032: 0xBEA9, + 50293 - 44032: 0xBEAA, + 50294 - 44032: 0x9CCF, + 50295 - 44032: 0x9CD0, + 50296 - 44032: 0x9CD1, + 50297 - 44032: 0xBEAB, + 50298 - 44032: 0x9CD2, + 50299 - 44032: 0x9CD3, + 50300 - 44032: 0x9CD4, + 50301 - 44032: 0x9CD5, + 50302 - 44032: 0x9CD6, + 50303 - 44032: 0x9CD7, + 50304 - 44032: 0xBEAC, + 50305 - 44032: 0x9CD8, + 50306 - 44032: 0x9CD9, + 50307 - 44032: 0x9CDA, + 50308 - 44032: 0x9CDB, + 50309 - 44032: 0x9CDC, + 50310 - 44032: 0x9CDD, + 50311 - 44032: 0x9CDE, + 50312 - 44032: 0x9CDF, + 50313 - 44032: 0x9CE0, + 50314 - 44032: 0x9CE1, + 50315 - 44032: 0x9CE2, + 50316 - 44032: 0x9CE3, + 50317 - 44032: 0x9CE4, + 50318 - 44032: 0x9CE5, + 50319 - 44032: 0x9CE6, + 50320 - 44032: 0x9CE7, + 50321 - 44032: 0x9CE8, + 50322 - 44032: 0x9CE9, + 50323 - 44032: 0x9CEA, + 50324 - 44032: 0xBEAD, + 50325 - 44032: 0x9CEB, + 50326 - 44032: 0x9CEC, + 50327 - 44032: 0x9CED, + 50328 - 44032: 0x9CEE, + 50329 - 44032: 0x9CEF, + 50330 - 44032: 0x9CF0, + 50331 - 44032: 0x9CF1, + 50332 - 44032: 0xBEAE, + 50333 - 44032: 0x9CF2, + 50334 - 44032: 0x9CF3, + 50335 - 44032: 0x9CF4, + 50336 - 44032: 0x9CF5, + 50337 - 44032: 0x9CF6, + 50338 - 44032: 0x9CF7, + 50339 - 44032: 0x9CF8, + 50340 - 44032: 0x9CF9, + 50341 - 44032: 0x9CFA, + 50342 - 44032: 0x9CFB, + 50343 - 44032: 0x9CFC, + 50344 - 44032: 0x9CFD, + 50345 - 44032: 0x9CFE, + 50346 - 44032: 0x9D41, + 50347 - 44032: 0x9D42, + 50348 - 44032: 0x9D43, + 50349 - 44032: 0x9D44, + 50350 - 44032: 0x9D45, + 50351 - 44032: 0x9D46, + 50352 - 44032: 0x9D47, + 50353 - 44032: 0x9D48, + 50354 - 44032: 0x9D49, + 50355 - 44032: 0x9D4A, + 50356 - 44032: 0x9D4B, + 50357 - 44032: 0x9D4C, + 50358 - 44032: 0x9D4D, + 50359 - 44032: 0x9D4E, + 50360 - 44032: 0xBEAF, + 50361 - 44032: 0x9D4F, + 50362 - 44032: 0x9D50, + 50363 - 44032: 0x9D51, + 50364 - 44032: 0xBEB0, + 50365 - 44032: 0x9D52, + 50366 - 44032: 0x9D53, + 50367 - 44032: 0x9D54, + 50368 - 44032: 0x9D55, + 50369 - 44032: 0x9D56, + 50370 - 44032: 0x9D57, + 50371 - 44032: 0x9D58, + 50372 - 44032: 0x9D59, + 50373 - 44032: 0x9D5A, + 50374 - 44032: 0x9D61, + 50375 - 44032: 0x9D62, + 50376 - 44032: 0x9D63, + 50377 - 44032: 0x9D64, + 50378 - 44032: 0x9D65, + 50379 - 44032: 0x9D66, + 50380 - 44032: 0x9D67, + 50381 - 44032: 0x9D68, + 50382 - 44032: 0x9D69, + 50383 - 44032: 0x9D6A, + 50384 - 44032: 0x9D6B, + 50385 - 44032: 0x9D6C, + 50386 - 44032: 0x9D6D, + 50387 - 44032: 0x9D6E, + 50388 - 44032: 0x9D6F, + 50389 - 44032: 0x9D70, + 50390 - 44032: 0x9D71, + 50391 - 44032: 0x9D72, + 50392 - 44032: 0x9D73, + 50393 - 44032: 0x9D74, + 50394 - 44032: 0x9D75, + 50395 - 44032: 0x9D76, + 50396 - 44032: 0x9D77, + 50397 - 44032: 0x9D78, + 50398 - 44032: 0x9D79, + 50399 - 44032: 0x9D7A, + 50400 - 44032: 0x9D81, + 50401 - 44032: 0x9D82, + 50402 - 44032: 0x9D83, + 50403 - 44032: 0x9D84, + 50404 - 44032: 0x9D85, + 50405 - 44032: 0x9D86, + 50406 - 44032: 0x9D87, + 50407 - 44032: 0x9D88, + 50408 - 44032: 0x9D89, + 50409 - 44032: 0xBEB1, + 50410 - 44032: 0x9D8A, + 50411 - 44032: 0x9D8B, + 50412 - 44032: 0x9D8C, + 50413 - 44032: 0x9D8D, + 50414 - 44032: 0x9D8E, + 50415 - 44032: 0x9D8F, + 50416 - 44032: 0xBEB2, + 50417 - 44032: 0xBEB3, + 50418 - 44032: 0x9D90, + 50419 - 44032: 0x9D91, + 50420 - 44032: 0xBEB4, + 50421 - 44032: 0x9D92, + 50422 - 44032: 0x9D93, + 50423 - 44032: 0x9D94, + 50424 - 44032: 0xBEB5, + 50425 - 44032: 0x9D95, + 50426 - 44032: 0xBEB6, + 50427 - 44032: 0x9D96, + 50428 - 44032: 0x9D97, + 50429 - 44032: 0x9D98, + 50430 - 44032: 0x9D99, + 50431 - 44032: 0xBEB7, + 50432 - 44032: 0xBEB8, + 50433 - 44032: 0xBEB9, + 50434 - 44032: 0x9D9A, + 50435 - 44032: 0x9D9B, + 50436 - 44032: 0x9D9C, + 50437 - 44032: 0x9D9D, + 50438 - 44032: 0x9D9E, + 50439 - 44032: 0x9D9F, + 50440 - 44032: 0x9DA0, + 50441 - 44032: 0x9DA1, + 50442 - 44032: 0x9DA2, + 50443 - 44032: 0x9DA3, + 50444 - 44032: 0xBEBA, + 50445 - 44032: 0x9DA4, + 50446 - 44032: 0x9DA5, + 50447 - 44032: 0x9DA6, + 50448 - 44032: 0xBEBB, + 50449 - 44032: 0x9DA7, + 50450 - 44032: 0x9DA8, + 50451 - 44032: 0x9DA9, + 50452 - 44032: 0xBEBC, + 50453 - 44032: 0x9DAA, + 50454 - 44032: 0x9DAB, + 50455 - 44032: 0x9DAC, + 50456 - 44032: 0x9DAD, + 50457 - 44032: 0x9DAE, + 50458 - 44032: 0x9DAF, + 50459 - 44032: 0x9DB0, + 50460 - 44032: 0xBEBD, + 50461 - 44032: 0x9DB1, + 50462 - 44032: 0x9DB2, + 50463 - 44032: 0x9DB3, + 50464 - 44032: 0x9DB4, + 50465 - 44032: 0x9DB5, + 50466 - 44032: 0x9DB6, + 50467 - 44032: 0x9DB7, + 50468 - 44032: 0x9DB8, + 50469 - 44032: 0x9DB9, + 50470 - 44032: 0x9DBA, + 50471 - 44032: 0x9DBB, + 50472 - 44032: 0xBEBE, + 50473 - 44032: 0xBEBF, + 50474 - 44032: 0x9DBC, + 50475 - 44032: 0x9DBD, + 50476 - 44032: 0xBEC0, + 50477 - 44032: 0x9DBE, + 50478 - 44032: 0x9DBF, + 50479 - 44032: 0x9DC0, + 50480 - 44032: 0xBEC1, + 50481 - 44032: 0x9DC1, + 50482 - 44032: 0x9DC2, + 50483 - 44032: 0x9DC3, + 50484 - 44032: 0x9DC4, + 50485 - 44032: 0x9DC5, + 50486 - 44032: 0x9DC6, + 50487 - 44032: 0x9DC7, + 50488 - 44032: 0xBEC2, + 50489 - 44032: 0xBEC3, + 50490 - 44032: 0x9DC8, + 50491 - 44032: 0xBEC4, + 50492 - 44032: 0x9DC9, + 50493 - 44032: 0xBEC5, + 50494 - 44032: 0x9DCA, + 50495 - 44032: 0x9DCB, + 50496 - 44032: 0x9DCC, + 50497 - 44032: 0x9DCD, + 50498 - 44032: 0x9DCE, + 50499 - 44032: 0x9DCF, + 50500 - 44032: 0xBEC6, + 50501 - 44032: 0xBEC7, + 50502 - 44032: 0x9DD0, + 50503 - 44032: 0x9DD1, + 50504 - 44032: 0xBEC8, + 50505 - 44032: 0xBEC9, + 50506 - 44032: 0xBECA, + 50507 - 44032: 0x9DD2, + 50508 - 44032: 0xBECB, + 50509 - 44032: 0xBECC, + 50510 - 44032: 0xBECD, + 50511 - 44032: 0x9DD3, + 50512 - 44032: 0x9DD4, + 50513 - 44032: 0x9DD5, + 50514 - 44032: 0x9DD6, + 50515 - 44032: 0xBECE, + 50516 - 44032: 0xBECF, + 50517 - 44032: 0xBED0, + 50518 - 44032: 0x9DD7, + 50519 - 44032: 0xBED1, + 50520 - 44032: 0xBED2, + 50521 - 44032: 0xBED3, + 50522 - 44032: 0x9DD8, + 50523 - 44032: 0x9DD9, + 50524 - 44032: 0x9DDA, + 50525 - 44032: 0xBED4, + 50526 - 44032: 0xBED5, + 50527 - 44032: 0x9DDB, + 50528 - 44032: 0xBED6, + 50529 - 44032: 0xBED7, + 50530 - 44032: 0x9DDC, + 50531 - 44032: 0x9DDD, + 50532 - 44032: 0xBED8, + 50533 - 44032: 0x9DDE, + 50534 - 44032: 0x9DDF, + 50535 - 44032: 0x9DE0, + 50536 - 44032: 0xBED9, + 50537 - 44032: 0x9DE1, + 50538 - 44032: 0x9DE2, + 50539 - 44032: 0x9DE3, + 50540 - 44032: 0x9DE4, + 50541 - 44032: 0x9DE5, + 50542 - 44032: 0x9DE6, + 50543 - 44032: 0x9DE7, + 50544 - 44032: 0xBEDA, + 50545 - 44032: 0xBEDB, + 50546 - 44032: 0x9DE8, + 50547 - 44032: 0xBEDC, + 50548 - 44032: 0xBEDD, + 50549 - 44032: 0xBEDE, + 50550 - 44032: 0x9DE9, + 50551 - 44032: 0x9DEA, + 50552 - 44032: 0x9DEB, + 50553 - 44032: 0x9DEC, + 50554 - 44032: 0x9DED, + 50555 - 44032: 0x9DEE, + 50556 - 44032: 0xBEDF, + 50557 - 44032: 0xBEE0, + 50558 - 44032: 0x9DEF, + 50559 - 44032: 0x9DF0, + 50560 - 44032: 0xBEE1, + 50561 - 44032: 0x9DF1, + 50562 - 44032: 0x9DF2, + 50563 - 44032: 0x9DF3, + 50564 - 44032: 0xBEE2, + 50565 - 44032: 0x9DF4, + 50566 - 44032: 0x9DF5, + 50567 - 44032: 0xBEE3, + 50568 - 44032: 0x9DF6, + 50569 - 44032: 0x9DF7, + 50570 - 44032: 0x9DF8, + 50571 - 44032: 0x9DF9, + 50572 - 44032: 0xBEE4, + 50573 - 44032: 0xBEE5, + 50574 - 44032: 0x9DFA, + 50575 - 44032: 0xBEE6, + 50576 - 44032: 0x9DFB, + 50577 - 44032: 0xBEE7, + 50578 - 44032: 0x9DFC, + 50579 - 44032: 0x9DFD, + 50580 - 44032: 0x9DFE, + 50581 - 44032: 0xBEE8, + 50582 - 44032: 0x9E41, + 50583 - 44032: 0xBEE9, + 50584 - 44032: 0xBEEA, + 50585 - 44032: 0x9E42, + 50586 - 44032: 0x9E43, + 50587 - 44032: 0x9E44, + 50588 - 44032: 0xBEEB, + 50589 - 44032: 0x9E45, + 50590 - 44032: 0x9E46, + 50591 - 44032: 0x9E47, + 50592 - 44032: 0xBEEC, + 50593 - 44032: 0x9E48, + 50594 - 44032: 0x9E49, + 50595 - 44032: 0x9E4A, + 50596 - 44032: 0x9E4B, + 50597 - 44032: 0x9E4C, + 50598 - 44032: 0x9E4D, + 50599 - 44032: 0x9E4E, + 50600 - 44032: 0x9E4F, + 50601 - 44032: 0xBEED, + 50602 - 44032: 0x9E50, + 50603 - 44032: 0x9E51, + 50604 - 44032: 0x9E52, + 50605 - 44032: 0x9E53, + 50606 - 44032: 0x9E54, + 50607 - 44032: 0x9E55, + 50608 - 44032: 0x9E56, + 50609 - 44032: 0x9E57, + 50610 - 44032: 0x9E58, + 50611 - 44032: 0x9E59, + 50612 - 44032: 0xBEEE, + 50613 - 44032: 0xBEEF, + 50614 - 44032: 0x9E5A, + 50615 - 44032: 0x9E61, + 50616 - 44032: 0xBEF0, + 50617 - 44032: 0xBEF1, + 50618 - 44032: 0x9E62, + 50619 - 44032: 0xBEF2, + 50620 - 44032: 0xBEF3, + 50621 - 44032: 0xBEF4, + 50622 - 44032: 0xBEF5, + 50623 - 44032: 0x9E63, + 50624 - 44032: 0x9E64, + 50625 - 44032: 0x9E65, + 50626 - 44032: 0x9E66, + 50627 - 44032: 0x9E67, + 50628 - 44032: 0xBEF6, + 50629 - 44032: 0xBEF7, + 50630 - 44032: 0xBEF8, + 50631 - 44032: 0xBEF9, + 50632 - 44032: 0xBEFA, + 50633 - 44032: 0xBEFB, + 50634 - 44032: 0xBEFC, + 50635 - 44032: 0x9E68, + 50636 - 44032: 0xBEFD, + 50637 - 44032: 0x9E69, + 50638 - 44032: 0xBEFE, + 50639 - 44032: 0x9E6A, + 50640 - 44032: 0xBFA1, + 50641 - 44032: 0xBFA2, + 50642 - 44032: 0x9E6B, + 50643 - 44032: 0x9E6C, + 50644 - 44032: 0xBFA3, + 50645 - 44032: 0x9E6D, + 50646 - 44032: 0x9E6E, + 50647 - 44032: 0x9E6F, + 50648 - 44032: 0xBFA4, + 50649 - 44032: 0x9E70, + 50650 - 44032: 0x9E71, + 50651 - 44032: 0x9E72, + 50652 - 44032: 0x9E73, + 50653 - 44032: 0x9E74, + 50654 - 44032: 0x9E75, + 50655 - 44032: 0x9E76, + 50656 - 44032: 0xBFA5, + 50657 - 44032: 0xBFA6, + 50658 - 44032: 0x9E77, + 50659 - 44032: 0xBFA7, + 50660 - 44032: 0x9E78, + 50661 - 44032: 0xBFA8, + 50662 - 44032: 0x9E79, + 50663 - 44032: 0x9E7A, + 50664 - 44032: 0x9E81, + 50665 - 44032: 0x9E82, + 50666 - 44032: 0x9E83, + 50667 - 44032: 0x9E84, + 50668 - 44032: 0xBFA9, + 50669 - 44032: 0xBFAA, + 50670 - 44032: 0xBFAB, + 50671 - 44032: 0x9E85, + 50672 - 44032: 0xBFAC, + 50673 - 44032: 0x9E86, + 50674 - 44032: 0x9E87, + 50675 - 44032: 0x9E88, + 50676 - 44032: 0xBFAD, + 50677 - 44032: 0x9E89, + 50678 - 44032: 0xBFAE, + 50679 - 44032: 0xBFAF, + 50680 - 44032: 0x9E8A, + 50681 - 44032: 0x9E8B, + 50682 - 44032: 0x9E8C, + 50683 - 44032: 0x9E8D, + 50684 - 44032: 0xBFB0, + 50685 - 44032: 0xBFB1, + 50686 - 44032: 0xBFB2, + 50687 - 44032: 0xBFB3, + 50688 - 44032: 0xBFB4, + 50689 - 44032: 0xBFB5, + 50690 - 44032: 0x9E8E, + 50691 - 44032: 0x9E8F, + 50692 - 44032: 0x9E90, + 50693 - 44032: 0xBFB6, + 50694 - 44032: 0xBFB7, + 50695 - 44032: 0xBFB8, + 50696 - 44032: 0xBFB9, + 50697 - 44032: 0x9E91, + 50698 - 44032: 0x9E92, + 50699 - 44032: 0x9E93, + 50700 - 44032: 0xBFBA, + 50701 - 44032: 0x9E94, + 50702 - 44032: 0x9E95, + 50703 - 44032: 0x9E96, + 50704 - 44032: 0xBFBB, + 50705 - 44032: 0x9E97, + 50706 - 44032: 0x9E98, + 50707 - 44032: 0x9E99, + 50708 - 44032: 0x9E9A, + 50709 - 44032: 0x9E9B, + 50710 - 44032: 0x9E9C, + 50711 - 44032: 0x9E9D, + 50712 - 44032: 0xBFBC, + 50713 - 44032: 0xBFBD, + 50714 - 44032: 0x9E9E, + 50715 - 44032: 0xBFBE, + 50716 - 44032: 0xBFBF, + 50717 - 44032: 0x9E9F, + 50718 - 44032: 0x9EA0, + 50719 - 44032: 0x9EA1, + 50720 - 44032: 0x9EA2, + 50721 - 44032: 0x9EA3, + 50722 - 44032: 0x9EA4, + 50723 - 44032: 0x9EA5, + 50724 - 44032: 0xBFC0, + 50725 - 44032: 0xBFC1, + 50726 - 44032: 0x9EA6, + 50727 - 44032: 0x9EA7, + 50728 - 44032: 0xBFC2, + 50729 - 44032: 0x9EA8, + 50730 - 44032: 0x9EA9, + 50731 - 44032: 0x9EAA, + 50732 - 44032: 0xBFC3, + 50733 - 44032: 0xBFC4, + 50734 - 44032: 0xBFC5, + 50735 - 44032: 0x9EAB, + 50736 - 44032: 0xBFC6, + 50737 - 44032: 0x9EAC, + 50738 - 44032: 0x9EAD, + 50739 - 44032: 0xBFC7, + 50740 - 44032: 0xBFC8, + 50741 - 44032: 0xBFC9, + 50742 - 44032: 0x9EAE, + 50743 - 44032: 0xBFCA, + 50744 - 44032: 0x9EAF, + 50745 - 44032: 0xBFCB, + 50746 - 44032: 0x9EB0, + 50747 - 44032: 0xBFCC, + 50748 - 44032: 0x9EB1, + 50749 - 44032: 0x9EB2, + 50750 - 44032: 0x9EB3, + 50751 - 44032: 0x9EB4, + 50752 - 44032: 0xBFCD, + 50753 - 44032: 0xBFCE, + 50754 - 44032: 0x9EB5, + 50755 - 44032: 0x9EB6, + 50756 - 44032: 0xBFCF, + 50757 - 44032: 0x9EB7, + 50758 - 44032: 0x9EB8, + 50759 - 44032: 0x9EB9, + 50760 - 44032: 0xBFD0, + 50761 - 44032: 0x9EBA, + 50762 - 44032: 0x9EBB, + 50763 - 44032: 0x9EBC, + 50764 - 44032: 0x9EBD, + 50765 - 44032: 0x9EBE, + 50766 - 44032: 0x9EBF, + 50767 - 44032: 0x9EC0, + 50768 - 44032: 0xBFD1, + 50769 - 44032: 0xBFD2, + 50770 - 44032: 0x9EC1, + 50771 - 44032: 0xBFD3, + 50772 - 44032: 0xBFD4, + 50773 - 44032: 0xBFD5, + 50774 - 44032: 0x9EC2, + 50775 - 44032: 0x9EC3, + 50776 - 44032: 0x9EC4, + 50777 - 44032: 0x9EC5, + 50778 - 44032: 0x9EC6, + 50779 - 44032: 0x9EC7, + 50780 - 44032: 0xBFD6, + 50781 - 44032: 0xBFD7, + 50782 - 44032: 0x9EC8, + 50783 - 44032: 0x9EC9, + 50784 - 44032: 0xBFD8, + 50785 - 44032: 0x9ECA, + 50786 - 44032: 0x9ECB, + 50787 - 44032: 0x9ECC, + 50788 - 44032: 0x9ECD, + 50789 - 44032: 0x9ECE, + 50790 - 44032: 0x9ECF, + 50791 - 44032: 0x9ED0, + 50792 - 44032: 0x9ED1, + 50793 - 44032: 0x9ED2, + 50794 - 44032: 0x9ED3, + 50795 - 44032: 0x9ED4, + 50796 - 44032: 0xBFD9, + 50797 - 44032: 0x9ED5, + 50798 - 44032: 0x9ED6, + 50799 - 44032: 0xBFDA, + 50800 - 44032: 0x9ED7, + 50801 - 44032: 0xBFDB, + 50802 - 44032: 0x9ED8, + 50803 - 44032: 0x9ED9, + 50804 - 44032: 0x9EDA, + 50805 - 44032: 0x9EDB, + 50806 - 44032: 0x9EDC, + 50807 - 44032: 0x9EDD, + 50808 - 44032: 0xBFDC, + 50809 - 44032: 0xBFDD, + 50810 - 44032: 0x9EDE, + 50811 - 44032: 0x9EDF, + 50812 - 44032: 0xBFDE, + 50813 - 44032: 0x9EE0, + 50814 - 44032: 0x9EE1, + 50815 - 44032: 0x9EE2, + 50816 - 44032: 0xBFDF, + 50817 - 44032: 0x9EE3, + 50818 - 44032: 0x9EE4, + 50819 - 44032: 0x9EE5, + 50820 - 44032: 0x9EE6, + 50821 - 44032: 0x9EE7, + 50822 - 44032: 0x9EE8, + 50823 - 44032: 0x9EE9, + 50824 - 44032: 0xBFE0, + 50825 - 44032: 0xBFE1, + 50826 - 44032: 0x9EEA, + 50827 - 44032: 0xBFE2, + 50828 - 44032: 0x9EEB, + 50829 - 44032: 0xBFE3, + 50830 - 44032: 0x9EEC, + 50831 - 44032: 0x9EED, + 50832 - 44032: 0x9EEE, + 50833 - 44032: 0x9EEF, + 50834 - 44032: 0x9EF0, + 50835 - 44032: 0x9EF1, + 50836 - 44032: 0xBFE4, + 50837 - 44032: 0xBFE5, + 50838 - 44032: 0x9EF2, + 50839 - 44032: 0x9EF3, + 50840 - 44032: 0xBFE6, + 50841 - 44032: 0x9EF4, + 50842 - 44032: 0x9EF5, + 50843 - 44032: 0x9EF6, + 50844 - 44032: 0xBFE7, + 50845 - 44032: 0x9EF7, + 50846 - 44032: 0x9EF8, + 50847 - 44032: 0x9EF9, + 50848 - 44032: 0x9EFA, + 50849 - 44032: 0x9EFB, + 50850 - 44032: 0x9EFC, + 50851 - 44032: 0x9EFD, + 50852 - 44032: 0xBFE8, + 50853 - 44032: 0xBFE9, + 50854 - 44032: 0x9EFE, + 50855 - 44032: 0xBFEA, + 50856 - 44032: 0x9F41, + 50857 - 44032: 0xBFEB, + 50858 - 44032: 0x9F42, + 50859 - 44032: 0x9F43, + 50860 - 44032: 0x9F44, + 50861 - 44032: 0x9F45, + 50862 - 44032: 0x9F46, + 50863 - 44032: 0x9F47, + 50864 - 44032: 0xBFEC, + 50865 - 44032: 0xBFED, + 50866 - 44032: 0x9F48, + 50867 - 44032: 0x9F49, + 50868 - 44032: 0xBFEE, + 50869 - 44032: 0x9F4A, + 50870 - 44032: 0x9F4B, + 50871 - 44032: 0x9F4C, + 50872 - 44032: 0xBFEF, + 50873 - 44032: 0xBFF0, + 50874 - 44032: 0xBFF1, + 50875 - 44032: 0x9F4D, + 50876 - 44032: 0x9F4E, + 50877 - 44032: 0x9F4F, + 50878 - 44032: 0x9F50, + 50879 - 44032: 0x9F51, + 50880 - 44032: 0xBFF2, + 50881 - 44032: 0xBFF3, + 50882 - 44032: 0x9F52, + 50883 - 44032: 0xBFF4, + 50884 - 44032: 0x9F53, + 50885 - 44032: 0xBFF5, + 50886 - 44032: 0x9F54, + 50887 - 44032: 0x9F55, + 50888 - 44032: 0x9F56, + 50889 - 44032: 0x9F57, + 50890 - 44032: 0x9F58, + 50891 - 44032: 0x9F59, + 50892 - 44032: 0xBFF6, + 50893 - 44032: 0xBFF7, + 50894 - 44032: 0x9F5A, + 50895 - 44032: 0x9F61, + 50896 - 44032: 0xBFF8, + 50897 - 44032: 0x9F62, + 50898 - 44032: 0x9F63, + 50899 - 44032: 0x9F64, + 50900 - 44032: 0xBFF9, + 50901 - 44032: 0x9F65, + 50902 - 44032: 0x9F66, + 50903 - 44032: 0x9F67, + 50904 - 44032: 0x9F68, + 50905 - 44032: 0x9F69, + 50906 - 44032: 0x9F6A, + 50907 - 44032: 0x9F6B, + 50908 - 44032: 0xBFFA, + 50909 - 44032: 0xBFFB, + 50910 - 44032: 0x9F6C, + 50911 - 44032: 0x9F6D, + 50912 - 44032: 0xBFFC, + 50913 - 44032: 0xBFFD, + 50914 - 44032: 0x9F6E, + 50915 - 44032: 0x9F6F, + 50916 - 44032: 0x9F70, + 50917 - 44032: 0x9F71, + 50918 - 44032: 0x9F72, + 50919 - 44032: 0x9F73, + 50920 - 44032: 0xBFFE, + 50921 - 44032: 0xC0A1, + 50922 - 44032: 0x9F74, + 50923 - 44032: 0x9F75, + 50924 - 44032: 0xC0A2, + 50925 - 44032: 0x9F76, + 50926 - 44032: 0x9F77, + 50927 - 44032: 0x9F78, + 50928 - 44032: 0xC0A3, + 50929 - 44032: 0x9F79, + 50930 - 44032: 0x9F7A, + 50931 - 44032: 0x9F81, + 50932 - 44032: 0x9F82, + 50933 - 44032: 0x9F83, + 50934 - 44032: 0x9F84, + 50935 - 44032: 0x9F85, + 50936 - 44032: 0xC0A4, + 50937 - 44032: 0xC0A5, + 50938 - 44032: 0x9F86, + 50939 - 44032: 0x9F87, + 50940 - 44032: 0x9F88, + 50941 - 44032: 0xC0A6, + 50942 - 44032: 0x9F89, + 50943 - 44032: 0x9F8A, + 50944 - 44032: 0x9F8B, + 50945 - 44032: 0x9F8C, + 50946 - 44032: 0x9F8D, + 50947 - 44032: 0x9F8E, + 50948 - 44032: 0xC0A7, + 50949 - 44032: 0xC0A8, + 50950 - 44032: 0x9F8F, + 50951 - 44032: 0x9F90, + 50952 - 44032: 0xC0A9, + 50953 - 44032: 0x9F91, + 50954 - 44032: 0x9F92, + 50955 - 44032: 0x9F93, + 50956 - 44032: 0xC0AA, + 50957 - 44032: 0x9F94, + 50958 - 44032: 0x9F95, + 50959 - 44032: 0x9F96, + 50960 - 44032: 0x9F97, + 50961 - 44032: 0x9F98, + 50962 - 44032: 0x9F99, + 50963 - 44032: 0x9F9A, + 50964 - 44032: 0xC0AB, + 50965 - 44032: 0xC0AC, + 50966 - 44032: 0x9F9B, + 50967 - 44032: 0xC0AD, + 50968 - 44032: 0x9F9C, + 50969 - 44032: 0xC0AE, + 50970 - 44032: 0x9F9D, + 50971 - 44032: 0x9F9E, + 50972 - 44032: 0x9F9F, + 50973 - 44032: 0x9FA0, + 50974 - 44032: 0x9FA1, + 50975 - 44032: 0x9FA2, + 50976 - 44032: 0xC0AF, + 50977 - 44032: 0xC0B0, + 50978 - 44032: 0x9FA3, + 50979 - 44032: 0x9FA4, + 50980 - 44032: 0xC0B1, + 50981 - 44032: 0x9FA5, + 50982 - 44032: 0x9FA6, + 50983 - 44032: 0x9FA7, + 50984 - 44032: 0xC0B2, + 50985 - 44032: 0x9FA8, + 50986 - 44032: 0x9FA9, + 50987 - 44032: 0x9FAA, + 50988 - 44032: 0x9FAB, + 50989 - 44032: 0x9FAC, + 50990 - 44032: 0x9FAD, + 50991 - 44032: 0x9FAE, + 50992 - 44032: 0xC0B3, + 50993 - 44032: 0xC0B4, + 50994 - 44032: 0x9FAF, + 50995 - 44032: 0xC0B5, + 50996 - 44032: 0x9FB0, + 50997 - 44032: 0xC0B6, + 50998 - 44032: 0x9FB1, + 50999 - 44032: 0xC0B7, + 51000 - 44032: 0x9FB2, + 51001 - 44032: 0x9FB3, + 51002 - 44032: 0x9FB4, + 51003 - 44032: 0x9FB5, + 51004 - 44032: 0xC0B8, + 51005 - 44032: 0xC0B9, + 51006 - 44032: 0x9FB6, + 51007 - 44032: 0x9FB7, + 51008 - 44032: 0xC0BA, + 51009 - 44032: 0x9FB8, + 51010 - 44032: 0x9FB9, + 51011 - 44032: 0x9FBA, + 51012 - 44032: 0xC0BB, + 51013 - 44032: 0x9FBB, + 51014 - 44032: 0x9FBC, + 51015 - 44032: 0x9FBD, + 51016 - 44032: 0x9FBE, + 51017 - 44032: 0x9FBF, + 51018 - 44032: 0xC0BC, + 51019 - 44032: 0x9FC0, + 51020 - 44032: 0xC0BD, + 51021 - 44032: 0xC0BE, + 51022 - 44032: 0x9FC1, + 51023 - 44032: 0xC0BF, + 51024 - 44032: 0x9FC2, + 51025 - 44032: 0xC0C0, + 51026 - 44032: 0xC0C1, + 51027 - 44032: 0xC0C2, + 51028 - 44032: 0xC0C3, + 51029 - 44032: 0xC0C4, + 51030 - 44032: 0xC0C5, + 51031 - 44032: 0xC0C6, + 51032 - 44032: 0xC0C7, + 51033 - 44032: 0x9FC3, + 51034 - 44032: 0x9FC4, + 51035 - 44032: 0x9FC5, + 51036 - 44032: 0xC0C8, + 51037 - 44032: 0x9FC6, + 51038 - 44032: 0x9FC7, + 51039 - 44032: 0x9FC8, + 51040 - 44032: 0xC0C9, + 51041 - 44032: 0x9FC9, + 51042 - 44032: 0x9FCA, + 51043 - 44032: 0x9FCB, + 51044 - 44032: 0x9FCC, + 51045 - 44032: 0x9FCD, + 51046 - 44032: 0x9FCE, + 51047 - 44032: 0x9FCF, + 51048 - 44032: 0xC0CA, + 51049 - 44032: 0x9FD0, + 51050 - 44032: 0x9FD1, + 51051 - 44032: 0xC0CB, + 51052 - 44032: 0x9FD2, + 51053 - 44032: 0x9FD3, + 51054 - 44032: 0x9FD4, + 51055 - 44032: 0x9FD5, + 51056 - 44032: 0x9FD6, + 51057 - 44032: 0x9FD7, + 51058 - 44032: 0x9FD8, + 51059 - 44032: 0x9FD9, + 51060 - 44032: 0xC0CC, + 51061 - 44032: 0xC0CD, + 51062 - 44032: 0x9FDA, + 51063 - 44032: 0x9FDB, + 51064 - 44032: 0xC0CE, + 51065 - 44032: 0x9FDC, + 51066 - 44032: 0x9FDD, + 51067 - 44032: 0x9FDE, + 51068 - 44032: 0xC0CF, + 51069 - 44032: 0xC0D0, + 51070 - 44032: 0xC0D1, + 51071 - 44032: 0x9FDF, + 51072 - 44032: 0x9FE0, + 51073 - 44032: 0x9FE1, + 51074 - 44032: 0x9FE2, + 51075 - 44032: 0xC0D2, + 51076 - 44032: 0xC0D3, + 51077 - 44032: 0xC0D4, + 51078 - 44032: 0x9FE3, + 51079 - 44032: 0xC0D5, + 51080 - 44032: 0xC0D6, + 51081 - 44032: 0xC0D7, + 51082 - 44032: 0xC0D8, + 51083 - 44032: 0x9FE4, + 51084 - 44032: 0x9FE5, + 51085 - 44032: 0x9FE6, + 51086 - 44032: 0xC0D9, + 51087 - 44032: 0x9FE7, + 51088 - 44032: 0xC0DA, + 51089 - 44032: 0xC0DB, + 51090 - 44032: 0x9FE8, + 51091 - 44032: 0x9FE9, + 51092 - 44032: 0xC0DC, + 51093 - 44032: 0x9FEA, + 51094 - 44032: 0xC0DD, + 51095 - 44032: 0xC0DE, + 51096 - 44032: 0xC0DF, + 51097 - 44032: 0x9FEB, + 51098 - 44032: 0xC0E0, + 51099 - 44032: 0x9FEC, + 51100 - 44032: 0x9FED, + 51101 - 44032: 0x9FEE, + 51102 - 44032: 0x9FEF, + 51103 - 44032: 0x9FF0, + 51104 - 44032: 0xC0E1, + 51105 - 44032: 0xC0E2, + 51106 - 44032: 0x9FF1, + 51107 - 44032: 0xC0E3, + 51108 - 44032: 0xC0E4, + 51109 - 44032: 0xC0E5, + 51110 - 44032: 0xC0E6, + 51111 - 44032: 0x9FF2, + 51112 - 44032: 0x9FF3, + 51113 - 44032: 0x9FF4, + 51114 - 44032: 0x9FF5, + 51115 - 44032: 0x9FF6, + 51116 - 44032: 0xC0E7, + 51117 - 44032: 0xC0E8, + 51118 - 44032: 0x9FF7, + 51119 - 44032: 0x9FF8, + 51120 - 44032: 0xC0E9, + 51121 - 44032: 0x9FF9, + 51122 - 44032: 0x9FFA, + 51123 - 44032: 0x9FFB, + 51124 - 44032: 0xC0EA, + 51125 - 44032: 0x9FFC, + 51126 - 44032: 0x9FFD, + 51127 - 44032: 0x9FFE, + 51128 - 44032: 0xA041, + 51129 - 44032: 0xA042, + 51130 - 44032: 0xA043, + 51131 - 44032: 0xA044, + 51132 - 44032: 0xC0EB, + 51133 - 44032: 0xC0EC, + 51134 - 44032: 0xA045, + 51135 - 44032: 0xC0ED, + 51136 - 44032: 0xC0EE, + 51137 - 44032: 0xC0EF, + 51138 - 44032: 0xA046, + 51139 - 44032: 0xA047, + 51140 - 44032: 0xA048, + 51141 - 44032: 0xA049, + 51142 - 44032: 0xA04A, + 51143 - 44032: 0xA04B, + 51144 - 44032: 0xC0F0, + 51145 - 44032: 0xC0F1, + 51146 - 44032: 0xA04C, + 51147 - 44032: 0xA04D, + 51148 - 44032: 0xC0F2, + 51149 - 44032: 0xA04E, + 51150 - 44032: 0xC0F3, + 51151 - 44032: 0xA04F, + 51152 - 44032: 0xC0F4, + 51153 - 44032: 0xA050, + 51154 - 44032: 0xA051, + 51155 - 44032: 0xA052, + 51156 - 44032: 0xA053, + 51157 - 44032: 0xA054, + 51158 - 44032: 0xA055, + 51159 - 44032: 0xA056, + 51160 - 44032: 0xC0F5, + 51161 - 44032: 0xA057, + 51162 - 44032: 0xA058, + 51163 - 44032: 0xA059, + 51164 - 44032: 0xA05A, + 51165 - 44032: 0xC0F6, + 51166 - 44032: 0xA061, + 51167 - 44032: 0xA062, + 51168 - 44032: 0xA063, + 51169 - 44032: 0xA064, + 51170 - 44032: 0xA065, + 51171 - 44032: 0xA066, + 51172 - 44032: 0xC0F7, + 51173 - 44032: 0xA067, + 51174 - 44032: 0xA068, + 51175 - 44032: 0xA069, + 51176 - 44032: 0xC0F8, + 51177 - 44032: 0xA06A, + 51178 - 44032: 0xA06B, + 51179 - 44032: 0xA06C, + 51180 - 44032: 0xC0F9, + 51181 - 44032: 0xA06D, + 51182 - 44032: 0xA06E, + 51183 - 44032: 0xA06F, + 51184 - 44032: 0xA070, + 51185 - 44032: 0xA071, + 51186 - 44032: 0xA072, + 51187 - 44032: 0xA073, + 51188 - 44032: 0xA074, + 51189 - 44032: 0xA075, + 51190 - 44032: 0xA076, + 51191 - 44032: 0xA077, + 51192 - 44032: 0xA078, + 51193 - 44032: 0xA079, + 51194 - 44032: 0xA07A, + 51195 - 44032: 0xA081, + 51196 - 44032: 0xA082, + 51197 - 44032: 0xA083, + 51198 - 44032: 0xA084, + 51199 - 44032: 0xA085, + 51200 - 44032: 0xC0FA, + 51201 - 44032: 0xC0FB, + 51202 - 44032: 0xA086, + 51203 - 44032: 0xA087, + 51204 - 44032: 0xC0FC, + 51205 - 44032: 0xA088, + 51206 - 44032: 0xA089, + 51207 - 44032: 0xA08A, + 51208 - 44032: 0xC0FD, + 51209 - 44032: 0xA08B, + 51210 - 44032: 0xC0FE, + 51211 - 44032: 0xA08C, + 51212 - 44032: 0xA08D, + 51213 - 44032: 0xA08E, + 51214 - 44032: 0xA08F, + 51215 - 44032: 0xA090, + 51216 - 44032: 0xC1A1, + 51217 - 44032: 0xC1A2, + 51218 - 44032: 0xA091, + 51219 - 44032: 0xC1A3, + 51220 - 44032: 0xA092, + 51221 - 44032: 0xC1A4, + 51222 - 44032: 0xC1A5, + 51223 - 44032: 0xA093, + 51224 - 44032: 0xA094, + 51225 - 44032: 0xA095, + 51226 - 44032: 0xA096, + 51227 - 44032: 0xA097, + 51228 - 44032: 0xC1A6, + 51229 - 44032: 0xC1A7, + 51230 - 44032: 0xA098, + 51231 - 44032: 0xA099, + 51232 - 44032: 0xC1A8, + 51233 - 44032: 0xA09A, + 51234 - 44032: 0xA09B, + 51235 - 44032: 0xA09C, + 51236 - 44032: 0xC1A9, + 51237 - 44032: 0xA09D, + 51238 - 44032: 0xA09E, + 51239 - 44032: 0xA09F, + 51240 - 44032: 0xA0A0, + 51241 - 44032: 0xA0A1, + 51242 - 44032: 0xA0A2, + 51243 - 44032: 0xA0A3, + 51244 - 44032: 0xC1AA, + 51245 - 44032: 0xC1AB, + 51246 - 44032: 0xA0A4, + 51247 - 44032: 0xC1AC, + 51248 - 44032: 0xA0A5, + 51249 - 44032: 0xC1AD, + 51250 - 44032: 0xA0A6, + 51251 - 44032: 0xA0A7, + 51252 - 44032: 0xA0A8, + 51253 - 44032: 0xA0A9, + 51254 - 44032: 0xA0AA, + 51255 - 44032: 0xA0AB, + 51256 - 44032: 0xC1AE, + 51257 - 44032: 0xA0AC, + 51258 - 44032: 0xA0AD, + 51259 - 44032: 0xA0AE, + 51260 - 44032: 0xC1AF, + 51261 - 44032: 0xA0AF, + 51262 - 44032: 0xA0B0, + 51263 - 44032: 0xA0B1, + 51264 - 44032: 0xC1B0, + 51265 - 44032: 0xA0B2, + 51266 - 44032: 0xA0B3, + 51267 - 44032: 0xA0B4, + 51268 - 44032: 0xA0B5, + 51269 - 44032: 0xA0B6, + 51270 - 44032: 0xA0B7, + 51271 - 44032: 0xA0B8, + 51272 - 44032: 0xC1B1, + 51273 - 44032: 0xC1B2, + 51274 - 44032: 0xA0B9, + 51275 - 44032: 0xA0BA, + 51276 - 44032: 0xC1B3, + 51277 - 44032: 0xC1B4, + 51278 - 44032: 0xA0BB, + 51279 - 44032: 0xA0BC, + 51280 - 44032: 0xA0BD, + 51281 - 44032: 0xA0BE, + 51282 - 44032: 0xA0BF, + 51283 - 44032: 0xA0C0, + 51284 - 44032: 0xC1B5, + 51285 - 44032: 0xA0C1, + 51286 - 44032: 0xA0C2, + 51287 - 44032: 0xA0C3, + 51288 - 44032: 0xA0C4, + 51289 - 44032: 0xA0C5, + 51290 - 44032: 0xA0C6, + 51291 - 44032: 0xA0C7, + 51292 - 44032: 0xA0C8, + 51293 - 44032: 0xA0C9, + 51294 - 44032: 0xA0CA, + 51295 - 44032: 0xA0CB, + 51296 - 44032: 0xA0CC, + 51297 - 44032: 0xA0CD, + 51298 - 44032: 0xA0CE, + 51299 - 44032: 0xA0CF, + 51300 - 44032: 0xA0D0, + 51301 - 44032: 0xA0D1, + 51302 - 44032: 0xA0D2, + 51303 - 44032: 0xA0D3, + 51304 - 44032: 0xA0D4, + 51305 - 44032: 0xA0D5, + 51306 - 44032: 0xA0D6, + 51307 - 44032: 0xA0D7, + 51308 - 44032: 0xA0D8, + 51309 - 44032: 0xA0D9, + 51310 - 44032: 0xA0DA, + 51311 - 44032: 0xA0DB, + 51312 - 44032: 0xC1B6, + 51313 - 44032: 0xC1B7, + 51314 - 44032: 0xA0DC, + 51315 - 44032: 0xA0DD, + 51316 - 44032: 0xC1B8, + 51317 - 44032: 0xA0DE, + 51318 - 44032: 0xA0DF, + 51319 - 44032: 0xA0E0, + 51320 - 44032: 0xC1B9, + 51321 - 44032: 0xA0E1, + 51322 - 44032: 0xC1BA, + 51323 - 44032: 0xA0E2, + 51324 - 44032: 0xA0E3, + 51325 - 44032: 0xA0E4, + 51326 - 44032: 0xA0E5, + 51327 - 44032: 0xA0E6, + 51328 - 44032: 0xC1BB, + 51329 - 44032: 0xC1BC, + 51330 - 44032: 0xA0E7, + 51331 - 44032: 0xC1BD, + 51332 - 44032: 0xA0E8, + 51333 - 44032: 0xC1BE, + 51334 - 44032: 0xC1BF, + 51335 - 44032: 0xC1C0, + 51336 - 44032: 0xA0E9, + 51337 - 44032: 0xA0EA, + 51338 - 44032: 0xA0EB, + 51339 - 44032: 0xC1C1, + 51340 - 44032: 0xC1C2, + 51341 - 44032: 0xC1C3, + 51342 - 44032: 0xA0EC, + 51343 - 44032: 0xA0ED, + 51344 - 44032: 0xA0EE, + 51345 - 44032: 0xA0EF, + 51346 - 44032: 0xA0F0, + 51347 - 44032: 0xA0F1, + 51348 - 44032: 0xC1C4, + 51349 - 44032: 0xA0F2, + 51350 - 44032: 0xA0F3, + 51351 - 44032: 0xA0F4, + 51352 - 44032: 0xA0F5, + 51353 - 44032: 0xA0F6, + 51354 - 44032: 0xA0F7, + 51355 - 44032: 0xA0F8, + 51356 - 44032: 0xA0F9, + 51357 - 44032: 0xC1C5, + 51358 - 44032: 0xA0FA, + 51359 - 44032: 0xC1C6, + 51360 - 44032: 0xA0FB, + 51361 - 44032: 0xC1C7, + 51362 - 44032: 0xA0FC, + 51363 - 44032: 0xA0FD, + 51364 - 44032: 0xA0FE, + 51365 - 44032: 0xA141, + 51366 - 44032: 0xA142, + 51367 - 44032: 0xA143, + 51368 - 44032: 0xC1C8, + 51369 - 44032: 0xA144, + 51370 - 44032: 0xA145, + 51371 - 44032: 0xA146, + 51372 - 44032: 0xA147, + 51373 - 44032: 0xA148, + 51374 - 44032: 0xA149, + 51375 - 44032: 0xA14A, + 51376 - 44032: 0xA14B, + 51377 - 44032: 0xA14C, + 51378 - 44032: 0xA14D, + 51379 - 44032: 0xA14E, + 51380 - 44032: 0xA14F, + 51381 - 44032: 0xA150, + 51382 - 44032: 0xA151, + 51383 - 44032: 0xA152, + 51384 - 44032: 0xA153, + 51385 - 44032: 0xA154, + 51386 - 44032: 0xA155, + 51387 - 44032: 0xA156, + 51388 - 44032: 0xC1C9, + 51389 - 44032: 0xC1CA, + 51390 - 44032: 0xA157, + 51391 - 44032: 0xA158, + 51392 - 44032: 0xA159, + 51393 - 44032: 0xA15A, + 51394 - 44032: 0xA161, + 51395 - 44032: 0xA162, + 51396 - 44032: 0xC1CB, + 51397 - 44032: 0xA163, + 51398 - 44032: 0xA164, + 51399 - 44032: 0xA165, + 51400 - 44032: 0xC1CC, + 51401 - 44032: 0xA166, + 51402 - 44032: 0xA167, + 51403 - 44032: 0xA168, + 51404 - 44032: 0xC1CD, + 51405 - 44032: 0xA169, + 51406 - 44032: 0xA16A, + 51407 - 44032: 0xA16B, + 51408 - 44032: 0xA16C, + 51409 - 44032: 0xA16D, + 51410 - 44032: 0xA16E, + 51411 - 44032: 0xA16F, + 51412 - 44032: 0xC1CE, + 51413 - 44032: 0xC1CF, + 51414 - 44032: 0xA170, + 51415 - 44032: 0xC1D0, + 51416 - 44032: 0xA171, + 51417 - 44032: 0xC1D1, + 51418 - 44032: 0xA172, + 51419 - 44032: 0xA173, + 51420 - 44032: 0xA174, + 51421 - 44032: 0xA175, + 51422 - 44032: 0xA176, + 51423 - 44032: 0xA177, + 51424 - 44032: 0xC1D2, + 51425 - 44032: 0xC1D3, + 51426 - 44032: 0xA178, + 51427 - 44032: 0xA179, + 51428 - 44032: 0xC1D4, + 51429 - 44032: 0xA17A, + 51430 - 44032: 0xA181, + 51431 - 44032: 0xA182, + 51432 - 44032: 0xA183, + 51433 - 44032: 0xA184, + 51434 - 44032: 0xA185, + 51435 - 44032: 0xA186, + 51436 - 44032: 0xA187, + 51437 - 44032: 0xA188, + 51438 - 44032: 0xA189, + 51439 - 44032: 0xA18A, + 51440 - 44032: 0xA18B, + 51441 - 44032: 0xA18C, + 51442 - 44032: 0xA18D, + 51443 - 44032: 0xA18E, + 51444 - 44032: 0xA18F, + 51445 - 44032: 0xC1D5, + 51446 - 44032: 0xA190, + 51447 - 44032: 0xA191, + 51448 - 44032: 0xA192, + 51449 - 44032: 0xA193, + 51450 - 44032: 0xA194, + 51451 - 44032: 0xA195, + 51452 - 44032: 0xC1D6, + 51453 - 44032: 0xC1D7, + 51454 - 44032: 0xA196, + 51455 - 44032: 0xA197, + 51456 - 44032: 0xC1D8, + 51457 - 44032: 0xA198, + 51458 - 44032: 0xA199, + 51459 - 44032: 0xA19A, + 51460 - 44032: 0xC1D9, + 51461 - 44032: 0xC1DA, + 51462 - 44032: 0xC1DB, + 51463 - 44032: 0xA19B, + 51464 - 44032: 0xA19C, + 51465 - 44032: 0xA19D, + 51466 - 44032: 0xA19E, + 51467 - 44032: 0xA19F, + 51468 - 44032: 0xC1DC, + 51469 - 44032: 0xC1DD, + 51470 - 44032: 0xA1A0, + 51471 - 44032: 0xC1DE, + 51472 - 44032: 0xA241, + 51473 - 44032: 0xC1DF, + 51474 - 44032: 0xA242, + 51475 - 44032: 0xA243, + 51476 - 44032: 0xA244, + 51477 - 44032: 0xA245, + 51478 - 44032: 0xA246, + 51479 - 44032: 0xA247, + 51480 - 44032: 0xC1E0, + 51481 - 44032: 0xA248, + 51482 - 44032: 0xA249, + 51483 - 44032: 0xA24A, + 51484 - 44032: 0xA24B, + 51485 - 44032: 0xA24C, + 51486 - 44032: 0xA24D, + 51487 - 44032: 0xA24E, + 51488 - 44032: 0xA24F, + 51489 - 44032: 0xA250, + 51490 - 44032: 0xA251, + 51491 - 44032: 0xA252, + 51492 - 44032: 0xA253, + 51493 - 44032: 0xA254, + 51494 - 44032: 0xA255, + 51495 - 44032: 0xA256, + 51496 - 44032: 0xA257, + 51497 - 44032: 0xA258, + 51498 - 44032: 0xA259, + 51499 - 44032: 0xA25A, + 51500 - 44032: 0xC1E1, + 51501 - 44032: 0xA261, + 51502 - 44032: 0xA262, + 51503 - 44032: 0xA263, + 51504 - 44032: 0xA264, + 51505 - 44032: 0xA265, + 51506 - 44032: 0xA266, + 51507 - 44032: 0xA267, + 51508 - 44032: 0xC1E2, + 51509 - 44032: 0xA268, + 51510 - 44032: 0xA269, + 51511 - 44032: 0xA26A, + 51512 - 44032: 0xA26B, + 51513 - 44032: 0xA26C, + 51514 - 44032: 0xA26D, + 51515 - 44032: 0xA26E, + 51516 - 44032: 0xA26F, + 51517 - 44032: 0xA270, + 51518 - 44032: 0xA271, + 51519 - 44032: 0xA272, + 51520 - 44032: 0xA273, + 51521 - 44032: 0xA274, + 51522 - 44032: 0xA275, + 51523 - 44032: 0xA276, + 51524 - 44032: 0xA277, + 51525 - 44032: 0xA278, + 51526 - 44032: 0xA279, + 51527 - 44032: 0xA27A, + 51528 - 44032: 0xA281, + 51529 - 44032: 0xA282, + 51530 - 44032: 0xA283, + 51531 - 44032: 0xA284, + 51532 - 44032: 0xA285, + 51533 - 44032: 0xA286, + 51534 - 44032: 0xA287, + 51535 - 44032: 0xA288, + 51536 - 44032: 0xC1E3, + 51537 - 44032: 0xC1E4, + 51538 - 44032: 0xA289, + 51539 - 44032: 0xA28A, + 51540 - 44032: 0xC1E5, + 51541 - 44032: 0xA28B, + 51542 - 44032: 0xA28C, + 51543 - 44032: 0xA28D, + 51544 - 44032: 0xC1E6, + 51545 - 44032: 0xA28E, + 51546 - 44032: 0xA28F, + 51547 - 44032: 0xA290, + 51548 - 44032: 0xA291, + 51549 - 44032: 0xA292, + 51550 - 44032: 0xA293, + 51551 - 44032: 0xA294, + 51552 - 44032: 0xC1E7, + 51553 - 44032: 0xC1E8, + 51554 - 44032: 0xA295, + 51555 - 44032: 0xC1E9, + 51556 - 44032: 0xA296, + 51557 - 44032: 0xA297, + 51558 - 44032: 0xA298, + 51559 - 44032: 0xA299, + 51560 - 44032: 0xA29A, + 51561 - 44032: 0xA29B, + 51562 - 44032: 0xA29C, + 51563 - 44032: 0xA29D, + 51564 - 44032: 0xC1EA, + 51565 - 44032: 0xA29E, + 51566 - 44032: 0xA29F, + 51567 - 44032: 0xA2A0, + 51568 - 44032: 0xC1EB, + 51569 - 44032: 0xA341, + 51570 - 44032: 0xA342, + 51571 - 44032: 0xA343, + 51572 - 44032: 0xC1EC, + 51573 - 44032: 0xA344, + 51574 - 44032: 0xA345, + 51575 - 44032: 0xA346, + 51576 - 44032: 0xA347, + 51577 - 44032: 0xA348, + 51578 - 44032: 0xA349, + 51579 - 44032: 0xA34A, + 51580 - 44032: 0xC1ED, + 51581 - 44032: 0xA34B, + 51582 - 44032: 0xA34C, + 51583 - 44032: 0xA34D, + 51584 - 44032: 0xA34E, + 51585 - 44032: 0xA34F, + 51586 - 44032: 0xA350, + 51587 - 44032: 0xA351, + 51588 - 44032: 0xA352, + 51589 - 44032: 0xA353, + 51590 - 44032: 0xA354, + 51591 - 44032: 0xA355, + 51592 - 44032: 0xC1EE, + 51593 - 44032: 0xC1EF, + 51594 - 44032: 0xA356, + 51595 - 44032: 0xA357, + 51596 - 44032: 0xC1F0, + 51597 - 44032: 0xA358, + 51598 - 44032: 0xA359, + 51599 - 44032: 0xA35A, + 51600 - 44032: 0xC1F1, + 51601 - 44032: 0xA361, + 51602 - 44032: 0xA362, + 51603 - 44032: 0xA363, + 51604 - 44032: 0xA364, + 51605 - 44032: 0xA365, + 51606 - 44032: 0xA366, + 51607 - 44032: 0xA367, + 51608 - 44032: 0xC1F2, + 51609 - 44032: 0xC1F3, + 51610 - 44032: 0xA368, + 51611 - 44032: 0xC1F4, + 51612 - 44032: 0xA369, + 51613 - 44032: 0xC1F5, + 51614 - 44032: 0xA36A, + 51615 - 44032: 0xA36B, + 51616 - 44032: 0xA36C, + 51617 - 44032: 0xA36D, + 51618 - 44032: 0xA36E, + 51619 - 44032: 0xA36F, + 51620 - 44032: 0xA370, + 51621 - 44032: 0xA371, + 51622 - 44032: 0xA372, + 51623 - 44032: 0xA373, + 51624 - 44032: 0xA374, + 51625 - 44032: 0xA375, + 51626 - 44032: 0xA376, + 51627 - 44032: 0xA377, + 51628 - 44032: 0xA378, + 51629 - 44032: 0xA379, + 51630 - 44032: 0xA37A, + 51631 - 44032: 0xA381, + 51632 - 44032: 0xA382, + 51633 - 44032: 0xA383, + 51634 - 44032: 0xA384, + 51635 - 44032: 0xA385, + 51636 - 44032: 0xA386, + 51637 - 44032: 0xA387, + 51638 - 44032: 0xA388, + 51639 - 44032: 0xA389, + 51640 - 44032: 0xA38A, + 51641 - 44032: 0xA38B, + 51642 - 44032: 0xA38C, + 51643 - 44032: 0xA38D, + 51644 - 44032: 0xA38E, + 51645 - 44032: 0xA38F, + 51646 - 44032: 0xA390, + 51647 - 44032: 0xA391, + 51648 - 44032: 0xC1F6, + 51649 - 44032: 0xC1F7, + 51650 - 44032: 0xA392, + 51651 - 44032: 0xA393, + 51652 - 44032: 0xC1F8, + 51653 - 44032: 0xA394, + 51654 - 44032: 0xA395, + 51655 - 44032: 0xC1F9, + 51656 - 44032: 0xC1FA, + 51657 - 44032: 0xA396, + 51658 - 44032: 0xC1FB, + 51659 - 44032: 0xA397, + 51660 - 44032: 0xA398, + 51661 - 44032: 0xA399, + 51662 - 44032: 0xA39A, + 51663 - 44032: 0xA39B, + 51664 - 44032: 0xC1FC, + 51665 - 44032: 0xC1FD, + 51666 - 44032: 0xA39C, + 51667 - 44032: 0xC1FE, + 51668 - 44032: 0xA39D, + 51669 - 44032: 0xC2A1, + 51670 - 44032: 0xC2A2, + 51671 - 44032: 0xA39E, + 51672 - 44032: 0xA39F, + 51673 - 44032: 0xC2A3, + 51674 - 44032: 0xC2A4, + 51675 - 44032: 0xA3A0, + 51676 - 44032: 0xC2A5, + 51677 - 44032: 0xC2A6, + 51678 - 44032: 0xA441, + 51679 - 44032: 0xA442, + 51680 - 44032: 0xC2A7, + 51681 - 44032: 0xA443, + 51682 - 44032: 0xC2A8, + 51683 - 44032: 0xA444, + 51684 - 44032: 0xC2A9, + 51685 - 44032: 0xA445, + 51686 - 44032: 0xA446, + 51687 - 44032: 0xC2AA, + 51688 - 44032: 0xA447, + 51689 - 44032: 0xA448, + 51690 - 44032: 0xA449, + 51691 - 44032: 0xA44A, + 51692 - 44032: 0xC2AB, + 51693 - 44032: 0xC2AC, + 51694 - 44032: 0xA44B, + 51695 - 44032: 0xC2AD, + 51696 - 44032: 0xC2AE, + 51697 - 44032: 0xC2AF, + 51698 - 44032: 0xA44C, + 51699 - 44032: 0xA44D, + 51700 - 44032: 0xA44E, + 51701 - 44032: 0xA44F, + 51702 - 44032: 0xA450, + 51703 - 44032: 0xA451, + 51704 - 44032: 0xC2B0, + 51705 - 44032: 0xC2B1, + 51706 - 44032: 0xA452, + 51707 - 44032: 0xA453, + 51708 - 44032: 0xC2B2, + 51709 - 44032: 0xA454, + 51710 - 44032: 0xA455, + 51711 - 44032: 0xA456, + 51712 - 44032: 0xC2B3, + 51713 - 44032: 0xA457, + 51714 - 44032: 0xA458, + 51715 - 44032: 0xA459, + 51716 - 44032: 0xA45A, + 51717 - 44032: 0xA461, + 51718 - 44032: 0xA462, + 51719 - 44032: 0xA463, + 51720 - 44032: 0xC2B4, + 51721 - 44032: 0xC2B5, + 51722 - 44032: 0xA464, + 51723 - 44032: 0xC2B6, + 51724 - 44032: 0xC2B7, + 51725 - 44032: 0xC2B8, + 51726 - 44032: 0xA465, + 51727 - 44032: 0xA466, + 51728 - 44032: 0xA467, + 51729 - 44032: 0xA468, + 51730 - 44032: 0xA469, + 51731 - 44032: 0xA46A, + 51732 - 44032: 0xC2B9, + 51733 - 44032: 0xA46B, + 51734 - 44032: 0xA46C, + 51735 - 44032: 0xA46D, + 51736 - 44032: 0xC2BA, + 51737 - 44032: 0xA46E, + 51738 - 44032: 0xA46F, + 51739 - 44032: 0xA470, + 51740 - 44032: 0xA471, + 51741 - 44032: 0xA472, + 51742 - 44032: 0xA473, + 51743 - 44032: 0xA474, + 51744 - 44032: 0xA475, + 51745 - 44032: 0xA476, + 51746 - 44032: 0xA477, + 51747 - 44032: 0xA478, + 51748 - 44032: 0xA479, + 51749 - 44032: 0xA47A, + 51750 - 44032: 0xA481, + 51751 - 44032: 0xA482, + 51752 - 44032: 0xA483, + 51753 - 44032: 0xC2BB, + 51754 - 44032: 0xA484, + 51755 - 44032: 0xA485, + 51756 - 44032: 0xA486, + 51757 - 44032: 0xA487, + 51758 - 44032: 0xA488, + 51759 - 44032: 0xA489, + 51760 - 44032: 0xA48A, + 51761 - 44032: 0xA48B, + 51762 - 44032: 0xA48C, + 51763 - 44032: 0xA48D, + 51764 - 44032: 0xA48E, + 51765 - 44032: 0xA48F, + 51766 - 44032: 0xA490, + 51767 - 44032: 0xA491, + 51768 - 44032: 0xA492, + 51769 - 44032: 0xA493, + 51770 - 44032: 0xA494, + 51771 - 44032: 0xA495, + 51772 - 44032: 0xA496, + 51773 - 44032: 0xA497, + 51774 - 44032: 0xA498, + 51775 - 44032: 0xA499, + 51776 - 44032: 0xA49A, + 51777 - 44032: 0xA49B, + 51778 - 44032: 0xA49C, + 51779 - 44032: 0xA49D, + 51780 - 44032: 0xA49E, + 51781 - 44032: 0xA49F, + 51782 - 44032: 0xA4A0, + 51783 - 44032: 0xA541, + 51784 - 44032: 0xA542, + 51785 - 44032: 0xA543, + 51786 - 44032: 0xA544, + 51787 - 44032: 0xA545, + 51788 - 44032: 0xC2BC, + 51789 - 44032: 0xC2BD, + 51790 - 44032: 0xA546, + 51791 - 44032: 0xA547, + 51792 - 44032: 0xC2BE, + 51793 - 44032: 0xA548, + 51794 - 44032: 0xA549, + 51795 - 44032: 0xA54A, + 51796 - 44032: 0xC2BF, + 51797 - 44032: 0xA54B, + 51798 - 44032: 0xA54C, + 51799 - 44032: 0xA54D, + 51800 - 44032: 0xA54E, + 51801 - 44032: 0xA54F, + 51802 - 44032: 0xA550, + 51803 - 44032: 0xA551, + 51804 - 44032: 0xC2C0, + 51805 - 44032: 0xC2C1, + 51806 - 44032: 0xA552, + 51807 - 44032: 0xC2C2, + 51808 - 44032: 0xC2C3, + 51809 - 44032: 0xC2C4, + 51810 - 44032: 0xA553, + 51811 - 44032: 0xA554, + 51812 - 44032: 0xA555, + 51813 - 44032: 0xA556, + 51814 - 44032: 0xA557, + 51815 - 44032: 0xA558, + 51816 - 44032: 0xC2C5, + 51817 - 44032: 0xA559, + 51818 - 44032: 0xA55A, + 51819 - 44032: 0xA561, + 51820 - 44032: 0xA562, + 51821 - 44032: 0xA563, + 51822 - 44032: 0xA564, + 51823 - 44032: 0xA565, + 51824 - 44032: 0xA566, + 51825 - 44032: 0xA567, + 51826 - 44032: 0xA568, + 51827 - 44032: 0xA569, + 51828 - 44032: 0xA56A, + 51829 - 44032: 0xA56B, + 51830 - 44032: 0xA56C, + 51831 - 44032: 0xA56D, + 51832 - 44032: 0xA56E, + 51833 - 44032: 0xA56F, + 51834 - 44032: 0xA570, + 51835 - 44032: 0xA571, + 51836 - 44032: 0xA572, + 51837 - 44032: 0xC2C6, + 51838 - 44032: 0xA573, + 51839 - 44032: 0xA574, + 51840 - 44032: 0xA575, + 51841 - 44032: 0xA576, + 51842 - 44032: 0xA577, + 51843 - 44032: 0xA578, + 51844 - 44032: 0xC2C7, + 51845 - 44032: 0xA579, + 51846 - 44032: 0xA57A, + 51847 - 44032: 0xA581, + 51848 - 44032: 0xA582, + 51849 - 44032: 0xA583, + 51850 - 44032: 0xA584, + 51851 - 44032: 0xA585, + 51852 - 44032: 0xA586, + 51853 - 44032: 0xA587, + 51854 - 44032: 0xA588, + 51855 - 44032: 0xA589, + 51856 - 44032: 0xA58A, + 51857 - 44032: 0xA58B, + 51858 - 44032: 0xA58C, + 51859 - 44032: 0xA58D, + 51860 - 44032: 0xA58E, + 51861 - 44032: 0xA58F, + 51862 - 44032: 0xA590, + 51863 - 44032: 0xA591, + 51864 - 44032: 0xC2C8, + 51865 - 44032: 0xA592, + 51866 - 44032: 0xA593, + 51867 - 44032: 0xA594, + 51868 - 44032: 0xA595, + 51869 - 44032: 0xA596, + 51870 - 44032: 0xA597, + 51871 - 44032: 0xA598, + 51872 - 44032: 0xA599, + 51873 - 44032: 0xA59A, + 51874 - 44032: 0xA59B, + 51875 - 44032: 0xA59C, + 51876 - 44032: 0xA59D, + 51877 - 44032: 0xA59E, + 51878 - 44032: 0xA59F, + 51879 - 44032: 0xA5A0, + 51880 - 44032: 0xA641, + 51881 - 44032: 0xA642, + 51882 - 44032: 0xA643, + 51883 - 44032: 0xA644, + 51884 - 44032: 0xA645, + 51885 - 44032: 0xA646, + 51886 - 44032: 0xA647, + 51887 - 44032: 0xA648, + 51888 - 44032: 0xA649, + 51889 - 44032: 0xA64A, + 51890 - 44032: 0xA64B, + 51891 - 44032: 0xA64C, + 51892 - 44032: 0xA64D, + 51893 - 44032: 0xA64E, + 51894 - 44032: 0xA64F, + 51895 - 44032: 0xA650, + 51896 - 44032: 0xA651, + 51897 - 44032: 0xA652, + 51898 - 44032: 0xA653, + 51899 - 44032: 0xA654, + 51900 - 44032: 0xC2C9, + 51901 - 44032: 0xC2CA, + 51902 - 44032: 0xA655, + 51903 - 44032: 0xA656, + 51904 - 44032: 0xC2CB, + 51905 - 44032: 0xA657, + 51906 - 44032: 0xA658, + 51907 - 44032: 0xA659, + 51908 - 44032: 0xC2CC, + 51909 - 44032: 0xA65A, + 51910 - 44032: 0xA661, + 51911 - 44032: 0xA662, + 51912 - 44032: 0xA663, + 51913 - 44032: 0xA664, + 51914 - 44032: 0xA665, + 51915 - 44032: 0xA666, + 51916 - 44032: 0xC2CD, + 51917 - 44032: 0xC2CE, + 51918 - 44032: 0xA667, + 51919 - 44032: 0xC2CF, + 51920 - 44032: 0xA668, + 51921 - 44032: 0xC2D0, + 51922 - 44032: 0xA669, + 51923 - 44032: 0xC2D1, + 51924 - 44032: 0xA66A, + 51925 - 44032: 0xA66B, + 51926 - 44032: 0xA66C, + 51927 - 44032: 0xA66D, + 51928 - 44032: 0xC2D2, + 51929 - 44032: 0xC2D3, + 51930 - 44032: 0xA66E, + 51931 - 44032: 0xA66F, + 51932 - 44032: 0xA670, + 51933 - 44032: 0xA671, + 51934 - 44032: 0xA672, + 51935 - 44032: 0xA673, + 51936 - 44032: 0xC2D4, + 51937 - 44032: 0xA674, + 51938 - 44032: 0xA675, + 51939 - 44032: 0xA676, + 51940 - 44032: 0xA677, + 51941 - 44032: 0xA678, + 51942 - 44032: 0xA679, + 51943 - 44032: 0xA67A, + 51944 - 44032: 0xA681, + 51945 - 44032: 0xA682, + 51946 - 44032: 0xA683, + 51947 - 44032: 0xA684, + 51948 - 44032: 0xC2D5, + 51949 - 44032: 0xA685, + 51950 - 44032: 0xA686, + 51951 - 44032: 0xA687, + 51952 - 44032: 0xA688, + 51953 - 44032: 0xA689, + 51954 - 44032: 0xA68A, + 51955 - 44032: 0xA68B, + 51956 - 44032: 0xC2D6, + 51957 - 44032: 0xA68C, + 51958 - 44032: 0xA68D, + 51959 - 44032: 0xA68E, + 51960 - 44032: 0xA68F, + 51961 - 44032: 0xA690, + 51962 - 44032: 0xA691, + 51963 - 44032: 0xA692, + 51964 - 44032: 0xA693, + 51965 - 44032: 0xA694, + 51966 - 44032: 0xA695, + 51967 - 44032: 0xA696, + 51968 - 44032: 0xA697, + 51969 - 44032: 0xA698, + 51970 - 44032: 0xA699, + 51971 - 44032: 0xA69A, + 51972 - 44032: 0xA69B, + 51973 - 44032: 0xA69C, + 51974 - 44032: 0xA69D, + 51975 - 44032: 0xA69E, + 51976 - 44032: 0xC2D7, + 51977 - 44032: 0xA69F, + 51978 - 44032: 0xA6A0, + 51979 - 44032: 0xA741, + 51980 - 44032: 0xA742, + 51981 - 44032: 0xA743, + 51982 - 44032: 0xA744, + 51983 - 44032: 0xA745, + 51984 - 44032: 0xC2D8, + 51985 - 44032: 0xA746, + 51986 - 44032: 0xA747, + 51987 - 44032: 0xA748, + 51988 - 44032: 0xC2D9, + 51989 - 44032: 0xA749, + 51990 - 44032: 0xA74A, + 51991 - 44032: 0xA74B, + 51992 - 44032: 0xC2DA, + 51993 - 44032: 0xA74C, + 51994 - 44032: 0xA74D, + 51995 - 44032: 0xA74E, + 51996 - 44032: 0xA74F, + 51997 - 44032: 0xA750, + 51998 - 44032: 0xA751, + 51999 - 44032: 0xA752, + 52000 - 44032: 0xC2DB, + 52001 - 44032: 0xC2DC, + 52002 - 44032: 0xA753, + 52003 - 44032: 0xA754, + 52004 - 44032: 0xA755, + 52005 - 44032: 0xA756, + 52006 - 44032: 0xA757, + 52007 - 44032: 0xA758, + 52008 - 44032: 0xA759, + 52009 - 44032: 0xA75A, + 52010 - 44032: 0xA761, + 52011 - 44032: 0xA762, + 52012 - 44032: 0xA763, + 52013 - 44032: 0xA764, + 52014 - 44032: 0xA765, + 52015 - 44032: 0xA766, + 52016 - 44032: 0xA767, + 52017 - 44032: 0xA768, + 52018 - 44032: 0xA769, + 52019 - 44032: 0xA76A, + 52020 - 44032: 0xA76B, + 52021 - 44032: 0xA76C, + 52022 - 44032: 0xA76D, + 52023 - 44032: 0xA76E, + 52024 - 44032: 0xA76F, + 52025 - 44032: 0xA770, + 52026 - 44032: 0xA771, + 52027 - 44032: 0xA772, + 52028 - 44032: 0xA773, + 52029 - 44032: 0xA774, + 52030 - 44032: 0xA775, + 52031 - 44032: 0xA776, + 52032 - 44032: 0xA777, + 52033 - 44032: 0xC2DD, + 52034 - 44032: 0xA778, + 52035 - 44032: 0xA779, + 52036 - 44032: 0xA77A, + 52037 - 44032: 0xA781, + 52038 - 44032: 0xA782, + 52039 - 44032: 0xA783, + 52040 - 44032: 0xC2DE, + 52041 - 44032: 0xC2DF, + 52042 - 44032: 0xA784, + 52043 - 44032: 0xA785, + 52044 - 44032: 0xC2E0, + 52045 - 44032: 0xA786, + 52046 - 44032: 0xA787, + 52047 - 44032: 0xA788, + 52048 - 44032: 0xC2E1, + 52049 - 44032: 0xA789, + 52050 - 44032: 0xA78A, + 52051 - 44032: 0xA78B, + 52052 - 44032: 0xA78C, + 52053 - 44032: 0xA78D, + 52054 - 44032: 0xA78E, + 52055 - 44032: 0xA78F, + 52056 - 44032: 0xC2E2, + 52057 - 44032: 0xC2E3, + 52058 - 44032: 0xA790, + 52059 - 44032: 0xA791, + 52060 - 44032: 0xA792, + 52061 - 44032: 0xC2E4, + 52062 - 44032: 0xA793, + 52063 - 44032: 0xA794, + 52064 - 44032: 0xA795, + 52065 - 44032: 0xA796, + 52066 - 44032: 0xA797, + 52067 - 44032: 0xA798, + 52068 - 44032: 0xC2E5, + 52069 - 44032: 0xA799, + 52070 - 44032: 0xA79A, + 52071 - 44032: 0xA79B, + 52072 - 44032: 0xA79C, + 52073 - 44032: 0xA79D, + 52074 - 44032: 0xA79E, + 52075 - 44032: 0xA79F, + 52076 - 44032: 0xA7A0, + 52077 - 44032: 0xA841, + 52078 - 44032: 0xA842, + 52079 - 44032: 0xA843, + 52080 - 44032: 0xA844, + 52081 - 44032: 0xA845, + 52082 - 44032: 0xA846, + 52083 - 44032: 0xA847, + 52084 - 44032: 0xA848, + 52085 - 44032: 0xA849, + 52086 - 44032: 0xA84A, + 52087 - 44032: 0xA84B, + 52088 - 44032: 0xC2E6, + 52089 - 44032: 0xC2E7, + 52090 - 44032: 0xA84C, + 52091 - 44032: 0xA84D, + 52092 - 44032: 0xA84E, + 52093 - 44032: 0xA84F, + 52094 - 44032: 0xA850, + 52095 - 44032: 0xA851, + 52096 - 44032: 0xA852, + 52097 - 44032: 0xA853, + 52098 - 44032: 0xA854, + 52099 - 44032: 0xA855, + 52100 - 44032: 0xA856, + 52101 - 44032: 0xA857, + 52102 - 44032: 0xA858, + 52103 - 44032: 0xA859, + 52104 - 44032: 0xA85A, + 52105 - 44032: 0xA861, + 52106 - 44032: 0xA862, + 52107 - 44032: 0xA863, + 52108 - 44032: 0xA864, + 52109 - 44032: 0xA865, + 52110 - 44032: 0xA866, + 52111 - 44032: 0xA867, + 52112 - 44032: 0xA868, + 52113 - 44032: 0xA869, + 52114 - 44032: 0xA86A, + 52115 - 44032: 0xA86B, + 52116 - 44032: 0xA86C, + 52117 - 44032: 0xA86D, + 52118 - 44032: 0xA86E, + 52119 - 44032: 0xA86F, + 52120 - 44032: 0xA870, + 52121 - 44032: 0xA871, + 52122 - 44032: 0xA872, + 52123 - 44032: 0xA873, + 52124 - 44032: 0xC2E8, + 52125 - 44032: 0xA874, + 52126 - 44032: 0xA875, + 52127 - 44032: 0xA876, + 52128 - 44032: 0xA877, + 52129 - 44032: 0xA878, + 52130 - 44032: 0xA879, + 52131 - 44032: 0xA87A, + 52132 - 44032: 0xA881, + 52133 - 44032: 0xA882, + 52134 - 44032: 0xA883, + 52135 - 44032: 0xA884, + 52136 - 44032: 0xA885, + 52137 - 44032: 0xA886, + 52138 - 44032: 0xA887, + 52139 - 44032: 0xA888, + 52140 - 44032: 0xA889, + 52141 - 44032: 0xA88A, + 52142 - 44032: 0xA88B, + 52143 - 44032: 0xA88C, + 52144 - 44032: 0xA88D, + 52145 - 44032: 0xA88E, + 52146 - 44032: 0xA88F, + 52147 - 44032: 0xA890, + 52148 - 44032: 0xA891, + 52149 - 44032: 0xA892, + 52150 - 44032: 0xA893, + 52151 - 44032: 0xA894, + 52152 - 44032: 0xC2E9, + 52153 - 44032: 0xA895, + 52154 - 44032: 0xA896, + 52155 - 44032: 0xA897, + 52156 - 44032: 0xA898, + 52157 - 44032: 0xA899, + 52158 - 44032: 0xA89A, + 52159 - 44032: 0xA89B, + 52160 - 44032: 0xA89C, + 52161 - 44032: 0xA89D, + 52162 - 44032: 0xA89E, + 52163 - 44032: 0xA89F, + 52164 - 44032: 0xA8A0, + 52165 - 44032: 0xA941, + 52166 - 44032: 0xA942, + 52167 - 44032: 0xA943, + 52168 - 44032: 0xA944, + 52169 - 44032: 0xA945, + 52170 - 44032: 0xA946, + 52171 - 44032: 0xA947, + 52172 - 44032: 0xA948, + 52173 - 44032: 0xA949, + 52174 - 44032: 0xA94A, + 52175 - 44032: 0xA94B, + 52176 - 44032: 0xA94C, + 52177 - 44032: 0xA94D, + 52178 - 44032: 0xA94E, + 52179 - 44032: 0xA94F, + 52180 - 44032: 0xC2EA, + 52181 - 44032: 0xA950, + 52182 - 44032: 0xA951, + 52183 - 44032: 0xA952, + 52184 - 44032: 0xA953, + 52185 - 44032: 0xA954, + 52186 - 44032: 0xA955, + 52187 - 44032: 0xA956, + 52188 - 44032: 0xA957, + 52189 - 44032: 0xA958, + 52190 - 44032: 0xA959, + 52191 - 44032: 0xA95A, + 52192 - 44032: 0xA961, + 52193 - 44032: 0xA962, + 52194 - 44032: 0xA963, + 52195 - 44032: 0xA964, + 52196 - 44032: 0xC2EB, + 52197 - 44032: 0xA965, + 52198 - 44032: 0xA966, + 52199 - 44032: 0xC2EC, + 52200 - 44032: 0xA967, + 52201 - 44032: 0xC2ED, + 52202 - 44032: 0xA968, + 52203 - 44032: 0xA969, + 52204 - 44032: 0xA96A, + 52205 - 44032: 0xA96B, + 52206 - 44032: 0xA96C, + 52207 - 44032: 0xA96D, + 52208 - 44032: 0xA96E, + 52209 - 44032: 0xA96F, + 52210 - 44032: 0xA970, + 52211 - 44032: 0xA971, + 52212 - 44032: 0xA972, + 52213 - 44032: 0xA973, + 52214 - 44032: 0xA974, + 52215 - 44032: 0xA975, + 52216 - 44032: 0xA976, + 52217 - 44032: 0xA977, + 52218 - 44032: 0xA978, + 52219 - 44032: 0xA979, + 52220 - 44032: 0xA97A, + 52221 - 44032: 0xA981, + 52222 - 44032: 0xA982, + 52223 - 44032: 0xA983, + 52224 - 44032: 0xA984, + 52225 - 44032: 0xA985, + 52226 - 44032: 0xA986, + 52227 - 44032: 0xA987, + 52228 - 44032: 0xA988, + 52229 - 44032: 0xA989, + 52230 - 44032: 0xA98A, + 52231 - 44032: 0xA98B, + 52232 - 44032: 0xA98C, + 52233 - 44032: 0xA98D, + 52234 - 44032: 0xA98E, + 52235 - 44032: 0xA98F, + 52236 - 44032: 0xC2EE, + 52237 - 44032: 0xC2EF, + 52238 - 44032: 0xA990, + 52239 - 44032: 0xA991, + 52240 - 44032: 0xC2F0, + 52241 - 44032: 0xA992, + 52242 - 44032: 0xA993, + 52243 - 44032: 0xA994, + 52244 - 44032: 0xC2F1, + 52245 - 44032: 0xA995, + 52246 - 44032: 0xA996, + 52247 - 44032: 0xA997, + 52248 - 44032: 0xA998, + 52249 - 44032: 0xA999, + 52250 - 44032: 0xA99A, + 52251 - 44032: 0xA99B, + 52252 - 44032: 0xC2F2, + 52253 - 44032: 0xC2F3, + 52254 - 44032: 0xA99C, + 52255 - 44032: 0xA99D, + 52256 - 44032: 0xA99E, + 52257 - 44032: 0xC2F4, + 52258 - 44032: 0xC2F5, + 52259 - 44032: 0xA99F, + 52260 - 44032: 0xA9A0, + 52261 - 44032: 0xAA41, + 52262 - 44032: 0xAA42, + 52263 - 44032: 0xC2F6, + 52264 - 44032: 0xC2F7, + 52265 - 44032: 0xC2F8, + 52266 - 44032: 0xAA43, + 52267 - 44032: 0xAA44, + 52268 - 44032: 0xC2F9, + 52269 - 44032: 0xAA45, + 52270 - 44032: 0xC2FA, + 52271 - 44032: 0xAA46, + 52272 - 44032: 0xC2FB, + 52273 - 44032: 0xAA47, + 52274 - 44032: 0xAA48, + 52275 - 44032: 0xAA49, + 52276 - 44032: 0xAA4A, + 52277 - 44032: 0xAA4B, + 52278 - 44032: 0xAA4C, + 52279 - 44032: 0xAA4D, + 52280 - 44032: 0xC2FC, + 52281 - 44032: 0xC2FD, + 52282 - 44032: 0xAA4E, + 52283 - 44032: 0xC2FE, + 52284 - 44032: 0xC3A1, + 52285 - 44032: 0xC3A2, + 52286 - 44032: 0xC3A3, + 52287 - 44032: 0xAA4F, + 52288 - 44032: 0xAA50, + 52289 - 44032: 0xAA51, + 52290 - 44032: 0xAA52, + 52291 - 44032: 0xAA53, + 52292 - 44032: 0xC3A4, + 52293 - 44032: 0xC3A5, + 52294 - 44032: 0xAA54, + 52295 - 44032: 0xAA55, + 52296 - 44032: 0xC3A6, + 52297 - 44032: 0xAA56, + 52298 - 44032: 0xAA57, + 52299 - 44032: 0xAA58, + 52300 - 44032: 0xC3A7, + 52301 - 44032: 0xAA59, + 52302 - 44032: 0xAA5A, + 52303 - 44032: 0xAA61, + 52304 - 44032: 0xAA62, + 52305 - 44032: 0xAA63, + 52306 - 44032: 0xAA64, + 52307 - 44032: 0xAA65, + 52308 - 44032: 0xC3A8, + 52309 - 44032: 0xC3A9, + 52310 - 44032: 0xAA66, + 52311 - 44032: 0xC3AA, + 52312 - 44032: 0xC3AB, + 52313 - 44032: 0xC3AC, + 52314 - 44032: 0xAA67, + 52315 - 44032: 0xAA68, + 52316 - 44032: 0xAA69, + 52317 - 44032: 0xAA6A, + 52318 - 44032: 0xAA6B, + 52319 - 44032: 0xAA6C, + 52320 - 44032: 0xC3AD, + 52321 - 44032: 0xAA6D, + 52322 - 44032: 0xAA6E, + 52323 - 44032: 0xAA6F, + 52324 - 44032: 0xC3AE, + 52325 - 44032: 0xAA70, + 52326 - 44032: 0xC3AF, + 52327 - 44032: 0xAA71, + 52328 - 44032: 0xC3B0, + 52329 - 44032: 0xAA72, + 52330 - 44032: 0xAA73, + 52331 - 44032: 0xAA74, + 52332 - 44032: 0xAA75, + 52333 - 44032: 0xAA76, + 52334 - 44032: 0xAA77, + 52335 - 44032: 0xAA78, + 52336 - 44032: 0xC3B1, + 52337 - 44032: 0xAA79, + 52338 - 44032: 0xAA7A, + 52339 - 44032: 0xAA81, + 52340 - 44032: 0xAA82, + 52341 - 44032: 0xC3B2, + 52342 - 44032: 0xAA83, + 52343 - 44032: 0xAA84, + 52344 - 44032: 0xAA85, + 52345 - 44032: 0xAA86, + 52346 - 44032: 0xAA87, + 52347 - 44032: 0xAA88, + 52348 - 44032: 0xAA89, + 52349 - 44032: 0xAA8A, + 52350 - 44032: 0xAA8B, + 52351 - 44032: 0xAA8C, + 52352 - 44032: 0xAA8D, + 52353 - 44032: 0xAA8E, + 52354 - 44032: 0xAA8F, + 52355 - 44032: 0xAA90, + 52356 - 44032: 0xAA91, + 52357 - 44032: 0xAA92, + 52358 - 44032: 0xAA93, + 52359 - 44032: 0xAA94, + 52360 - 44032: 0xAA95, + 52361 - 44032: 0xAA96, + 52362 - 44032: 0xAA97, + 52363 - 44032: 0xAA98, + 52364 - 44032: 0xAA99, + 52365 - 44032: 0xAA9A, + 52366 - 44032: 0xAA9B, + 52367 - 44032: 0xAA9C, + 52368 - 44032: 0xAA9D, + 52369 - 44032: 0xAA9E, + 52370 - 44032: 0xAA9F, + 52371 - 44032: 0xAAA0, + 52372 - 44032: 0xAB41, + 52373 - 44032: 0xAB42, + 52374 - 44032: 0xAB43, + 52375 - 44032: 0xAB44, + 52376 - 44032: 0xC3B3, + 52377 - 44032: 0xC3B4, + 52378 - 44032: 0xAB45, + 52379 - 44032: 0xAB46, + 52380 - 44032: 0xC3B5, + 52381 - 44032: 0xAB47, + 52382 - 44032: 0xAB48, + 52383 - 44032: 0xAB49, + 52384 - 44032: 0xC3B6, + 52385 - 44032: 0xAB4A, + 52386 - 44032: 0xAB4B, + 52387 - 44032: 0xAB4C, + 52388 - 44032: 0xAB4D, + 52389 - 44032: 0xAB4E, + 52390 - 44032: 0xAB4F, + 52391 - 44032: 0xAB50, + 52392 - 44032: 0xC3B7, + 52393 - 44032: 0xC3B8, + 52394 - 44032: 0xAB51, + 52395 - 44032: 0xC3B9, + 52396 - 44032: 0xC3BA, + 52397 - 44032: 0xC3BB, + 52398 - 44032: 0xAB52, + 52399 - 44032: 0xAB53, + 52400 - 44032: 0xAB54, + 52401 - 44032: 0xAB55, + 52402 - 44032: 0xAB56, + 52403 - 44032: 0xAB57, + 52404 - 44032: 0xC3BC, + 52405 - 44032: 0xC3BD, + 52406 - 44032: 0xAB58, + 52407 - 44032: 0xAB59, + 52408 - 44032: 0xC3BE, + 52409 - 44032: 0xAB5A, + 52410 - 44032: 0xAB61, + 52411 - 44032: 0xAB62, + 52412 - 44032: 0xC3BF, + 52413 - 44032: 0xAB63, + 52414 - 44032: 0xAB64, + 52415 - 44032: 0xAB65, + 52416 - 44032: 0xAB66, + 52417 - 44032: 0xAB67, + 52418 - 44032: 0xAB68, + 52419 - 44032: 0xAB69, + 52420 - 44032: 0xC3C0, + 52421 - 44032: 0xC3C1, + 52422 - 44032: 0xAB6A, + 52423 - 44032: 0xC3C2, + 52424 - 44032: 0xAB6B, + 52425 - 44032: 0xC3C3, + 52426 - 44032: 0xAB6C, + 52427 - 44032: 0xAB6D, + 52428 - 44032: 0xAB6E, + 52429 - 44032: 0xAB6F, + 52430 - 44032: 0xAB70, + 52431 - 44032: 0xAB71, + 52432 - 44032: 0xC3C4, + 52433 - 44032: 0xAB72, + 52434 - 44032: 0xAB73, + 52435 - 44032: 0xAB74, + 52436 - 44032: 0xC3C5, + 52437 - 44032: 0xAB75, + 52438 - 44032: 0xAB76, + 52439 - 44032: 0xAB77, + 52440 - 44032: 0xAB78, + 52441 - 44032: 0xAB79, + 52442 - 44032: 0xAB7A, + 52443 - 44032: 0xAB81, + 52444 - 44032: 0xAB82, + 52445 - 44032: 0xAB83, + 52446 - 44032: 0xAB84, + 52447 - 44032: 0xAB85, + 52448 - 44032: 0xAB86, + 52449 - 44032: 0xAB87, + 52450 - 44032: 0xAB88, + 52451 - 44032: 0xAB89, + 52452 - 44032: 0xC3C6, + 52453 - 44032: 0xAB8A, + 52454 - 44032: 0xAB8B, + 52455 - 44032: 0xAB8C, + 52456 - 44032: 0xAB8D, + 52457 - 44032: 0xAB8E, + 52458 - 44032: 0xAB8F, + 52459 - 44032: 0xAB90, + 52460 - 44032: 0xC3C7, + 52461 - 44032: 0xAB91, + 52462 - 44032: 0xAB92, + 52463 - 44032: 0xAB93, + 52464 - 44032: 0xC3C8, + 52465 - 44032: 0xAB94, + 52466 - 44032: 0xAB95, + 52467 - 44032: 0xAB96, + 52468 - 44032: 0xAB97, + 52469 - 44032: 0xAB98, + 52470 - 44032: 0xAB99, + 52471 - 44032: 0xAB9A, + 52472 - 44032: 0xAB9B, + 52473 - 44032: 0xAB9C, + 52474 - 44032: 0xAB9D, + 52475 - 44032: 0xAB9E, + 52476 - 44032: 0xAB9F, + 52477 - 44032: 0xABA0, + 52478 - 44032: 0xAC41, + 52479 - 44032: 0xAC42, + 52480 - 44032: 0xAC43, + 52481 - 44032: 0xC3C9, + 52482 - 44032: 0xAC44, + 52483 - 44032: 0xAC45, + 52484 - 44032: 0xAC46, + 52485 - 44032: 0xAC47, + 52486 - 44032: 0xAC48, + 52487 - 44032: 0xAC49, + 52488 - 44032: 0xC3CA, + 52489 - 44032: 0xC3CB, + 52490 - 44032: 0xAC4A, + 52491 - 44032: 0xAC4B, + 52492 - 44032: 0xC3CC, + 52493 - 44032: 0xAC4C, + 52494 - 44032: 0xAC4D, + 52495 - 44032: 0xAC4E, + 52496 - 44032: 0xC3CD, + 52497 - 44032: 0xAC4F, + 52498 - 44032: 0xAC50, + 52499 - 44032: 0xAC51, + 52500 - 44032: 0xAC52, + 52501 - 44032: 0xAC53, + 52502 - 44032: 0xAC54, + 52503 - 44032: 0xAC55, + 52504 - 44032: 0xC3CE, + 52505 - 44032: 0xC3CF, + 52506 - 44032: 0xAC56, + 52507 - 44032: 0xC3D0, + 52508 - 44032: 0xAC57, + 52509 - 44032: 0xC3D1, + 52510 - 44032: 0xAC58, + 52511 - 44032: 0xAC59, + 52512 - 44032: 0xAC5A, + 52513 - 44032: 0xAC61, + 52514 - 44032: 0xAC62, + 52515 - 44032: 0xAC63, + 52516 - 44032: 0xC3D2, + 52517 - 44032: 0xAC64, + 52518 - 44032: 0xAC65, + 52519 - 44032: 0xAC66, + 52520 - 44032: 0xC3D3, + 52521 - 44032: 0xAC67, + 52522 - 44032: 0xAC68, + 52523 - 44032: 0xAC69, + 52524 - 44032: 0xC3D4, + 52525 - 44032: 0xAC6A, + 52526 - 44032: 0xAC6B, + 52527 - 44032: 0xAC6C, + 52528 - 44032: 0xAC6D, + 52529 - 44032: 0xAC6E, + 52530 - 44032: 0xAC6F, + 52531 - 44032: 0xAC70, + 52532 - 44032: 0xAC71, + 52533 - 44032: 0xAC72, + 52534 - 44032: 0xAC73, + 52535 - 44032: 0xAC74, + 52536 - 44032: 0xAC75, + 52537 - 44032: 0xC3D5, + 52538 - 44032: 0xAC76, + 52539 - 44032: 0xAC77, + 52540 - 44032: 0xAC78, + 52541 - 44032: 0xAC79, + 52542 - 44032: 0xAC7A, + 52543 - 44032: 0xAC81, + 52544 - 44032: 0xAC82, + 52545 - 44032: 0xAC83, + 52546 - 44032: 0xAC84, + 52547 - 44032: 0xAC85, + 52548 - 44032: 0xAC86, + 52549 - 44032: 0xAC87, + 52550 - 44032: 0xAC88, + 52551 - 44032: 0xAC89, + 52552 - 44032: 0xAC8A, + 52553 - 44032: 0xAC8B, + 52554 - 44032: 0xAC8C, + 52555 - 44032: 0xAC8D, + 52556 - 44032: 0xAC8E, + 52557 - 44032: 0xAC8F, + 52558 - 44032: 0xAC90, + 52559 - 44032: 0xAC91, + 52560 - 44032: 0xAC92, + 52561 - 44032: 0xAC93, + 52562 - 44032: 0xAC94, + 52563 - 44032: 0xAC95, + 52564 - 44032: 0xAC96, + 52565 - 44032: 0xAC97, + 52566 - 44032: 0xAC98, + 52567 - 44032: 0xAC99, + 52568 - 44032: 0xAC9A, + 52569 - 44032: 0xAC9B, + 52570 - 44032: 0xAC9C, + 52571 - 44032: 0xAC9D, + 52572 - 44032: 0xC3D6, + 52573 - 44032: 0xAC9E, + 52574 - 44032: 0xAC9F, + 52575 - 44032: 0xACA0, + 52576 - 44032: 0xC3D7, + 52577 - 44032: 0xAD41, + 52578 - 44032: 0xAD42, + 52579 - 44032: 0xAD43, + 52580 - 44032: 0xC3D8, + 52581 - 44032: 0xAD44, + 52582 - 44032: 0xAD45, + 52583 - 44032: 0xAD46, + 52584 - 44032: 0xAD47, + 52585 - 44032: 0xAD48, + 52586 - 44032: 0xAD49, + 52587 - 44032: 0xAD4A, + 52588 - 44032: 0xC3D9, + 52589 - 44032: 0xC3DA, + 52590 - 44032: 0xAD4B, + 52591 - 44032: 0xC3DB, + 52592 - 44032: 0xAD4C, + 52593 - 44032: 0xC3DC, + 52594 - 44032: 0xAD4D, + 52595 - 44032: 0xAD4E, + 52596 - 44032: 0xAD4F, + 52597 - 44032: 0xAD50, + 52598 - 44032: 0xAD51, + 52599 - 44032: 0xAD52, + 52600 - 44032: 0xC3DD, + 52601 - 44032: 0xAD53, + 52602 - 44032: 0xAD54, + 52603 - 44032: 0xAD55, + 52604 - 44032: 0xAD56, + 52605 - 44032: 0xAD57, + 52606 - 44032: 0xAD58, + 52607 - 44032: 0xAD59, + 52608 - 44032: 0xAD5A, + 52609 - 44032: 0xAD61, + 52610 - 44032: 0xAD62, + 52611 - 44032: 0xAD63, + 52612 - 44032: 0xAD64, + 52613 - 44032: 0xAD65, + 52614 - 44032: 0xAD66, + 52615 - 44032: 0xAD67, + 52616 - 44032: 0xC3DE, + 52617 - 44032: 0xAD68, + 52618 - 44032: 0xAD69, + 52619 - 44032: 0xAD6A, + 52620 - 44032: 0xAD6B, + 52621 - 44032: 0xAD6C, + 52622 - 44032: 0xAD6D, + 52623 - 44032: 0xAD6E, + 52624 - 44032: 0xAD6F, + 52625 - 44032: 0xAD70, + 52626 - 44032: 0xAD71, + 52627 - 44032: 0xAD72, + 52628 - 44032: 0xC3DF, + 52629 - 44032: 0xC3E0, + 52630 - 44032: 0xAD73, + 52631 - 44032: 0xAD74, + 52632 - 44032: 0xC3E1, + 52633 - 44032: 0xAD75, + 52634 - 44032: 0xAD76, + 52635 - 44032: 0xAD77, + 52636 - 44032: 0xC3E2, + 52637 - 44032: 0xAD78, + 52638 - 44032: 0xAD79, + 52639 - 44032: 0xAD7A, + 52640 - 44032: 0xAD81, + 52641 - 44032: 0xAD82, + 52642 - 44032: 0xAD83, + 52643 - 44032: 0xAD84, + 52644 - 44032: 0xC3E3, + 52645 - 44032: 0xC3E4, + 52646 - 44032: 0xAD85, + 52647 - 44032: 0xC3E5, + 52648 - 44032: 0xAD86, + 52649 - 44032: 0xC3E6, + 52650 - 44032: 0xAD87, + 52651 - 44032: 0xAD88, + 52652 - 44032: 0xAD89, + 52653 - 44032: 0xAD8A, + 52654 - 44032: 0xAD8B, + 52655 - 44032: 0xAD8C, + 52656 - 44032: 0xC3E7, + 52657 - 44032: 0xAD8D, + 52658 - 44032: 0xAD8E, + 52659 - 44032: 0xAD8F, + 52660 - 44032: 0xAD90, + 52661 - 44032: 0xAD91, + 52662 - 44032: 0xAD92, + 52663 - 44032: 0xAD93, + 52664 - 44032: 0xAD94, + 52665 - 44032: 0xAD95, + 52666 - 44032: 0xAD96, + 52667 - 44032: 0xAD97, + 52668 - 44032: 0xAD98, + 52669 - 44032: 0xAD99, + 52670 - 44032: 0xAD9A, + 52671 - 44032: 0xAD9B, + 52672 - 44032: 0xAD9C, + 52673 - 44032: 0xAD9D, + 52674 - 44032: 0xAD9E, + 52675 - 44032: 0xAD9F, + 52676 - 44032: 0xC3E8, + 52677 - 44032: 0xADA0, + 52678 - 44032: 0xAE41, + 52679 - 44032: 0xAE42, + 52680 - 44032: 0xAE43, + 52681 - 44032: 0xAE44, + 52682 - 44032: 0xAE45, + 52683 - 44032: 0xAE46, + 52684 - 44032: 0xC3E9, + 52685 - 44032: 0xAE47, + 52686 - 44032: 0xAE48, + 52687 - 44032: 0xAE49, + 52688 - 44032: 0xC3EA, + 52689 - 44032: 0xAE4A, + 52690 - 44032: 0xAE4B, + 52691 - 44032: 0xAE4C, + 52692 - 44032: 0xAE4D, + 52693 - 44032: 0xAE4E, + 52694 - 44032: 0xAE4F, + 52695 - 44032: 0xAE50, + 52696 - 44032: 0xAE51, + 52697 - 44032: 0xAE52, + 52698 - 44032: 0xAE53, + 52699 - 44032: 0xAE54, + 52700 - 44032: 0xAE55, + 52701 - 44032: 0xAE56, + 52702 - 44032: 0xAE57, + 52703 - 44032: 0xAE58, + 52704 - 44032: 0xAE59, + 52705 - 44032: 0xAE5A, + 52706 - 44032: 0xAE61, + 52707 - 44032: 0xAE62, + 52708 - 44032: 0xAE63, + 52709 - 44032: 0xAE64, + 52710 - 44032: 0xAE65, + 52711 - 44032: 0xAE66, + 52712 - 44032: 0xC3EB, + 52713 - 44032: 0xAE67, + 52714 - 44032: 0xAE68, + 52715 - 44032: 0xAE69, + 52716 - 44032: 0xC3EC, + 52717 - 44032: 0xAE6A, + 52718 - 44032: 0xAE6B, + 52719 - 44032: 0xAE6C, + 52720 - 44032: 0xC3ED, + 52721 - 44032: 0xAE6D, + 52722 - 44032: 0xAE6E, + 52723 - 44032: 0xAE6F, + 52724 - 44032: 0xAE70, + 52725 - 44032: 0xAE71, + 52726 - 44032: 0xAE72, + 52727 - 44032: 0xAE73, + 52728 - 44032: 0xC3EE, + 52729 - 44032: 0xC3EF, + 52730 - 44032: 0xAE74, + 52731 - 44032: 0xC3F0, + 52732 - 44032: 0xAE75, + 52733 - 44032: 0xC3F1, + 52734 - 44032: 0xAE76, + 52735 - 44032: 0xAE77, + 52736 - 44032: 0xAE78, + 52737 - 44032: 0xAE79, + 52738 - 44032: 0xAE7A, + 52739 - 44032: 0xAE81, + 52740 - 44032: 0xC3F2, + 52741 - 44032: 0xAE82, + 52742 - 44032: 0xAE83, + 52743 - 44032: 0xAE84, + 52744 - 44032: 0xC3F3, + 52745 - 44032: 0xAE85, + 52746 - 44032: 0xAE86, + 52747 - 44032: 0xAE87, + 52748 - 44032: 0xC3F4, + 52749 - 44032: 0xAE88, + 52750 - 44032: 0xAE89, + 52751 - 44032: 0xAE8A, + 52752 - 44032: 0xAE8B, + 52753 - 44032: 0xAE8C, + 52754 - 44032: 0xAE8D, + 52755 - 44032: 0xAE8E, + 52756 - 44032: 0xC3F5, + 52757 - 44032: 0xAE8F, + 52758 - 44032: 0xAE90, + 52759 - 44032: 0xAE91, + 52760 - 44032: 0xAE92, + 52761 - 44032: 0xC3F6, + 52762 - 44032: 0xAE93, + 52763 - 44032: 0xAE94, + 52764 - 44032: 0xAE95, + 52765 - 44032: 0xAE96, + 52766 - 44032: 0xAE97, + 52767 - 44032: 0xAE98, + 52768 - 44032: 0xC3F7, + 52769 - 44032: 0xC3F8, + 52770 - 44032: 0xAE99, + 52771 - 44032: 0xAE9A, + 52772 - 44032: 0xC3F9, + 52773 - 44032: 0xAE9B, + 52774 - 44032: 0xAE9C, + 52775 - 44032: 0xAE9D, + 52776 - 44032: 0xC3FA, + 52777 - 44032: 0xAE9E, + 52778 - 44032: 0xAE9F, + 52779 - 44032: 0xAEA0, + 52780 - 44032: 0xAF41, + 52781 - 44032: 0xAF42, + 52782 - 44032: 0xAF43, + 52783 - 44032: 0xAF44, + 52784 - 44032: 0xC3FB, + 52785 - 44032: 0xC3FC, + 52786 - 44032: 0xAF45, + 52787 - 44032: 0xC3FD, + 52788 - 44032: 0xAF46, + 52789 - 44032: 0xC3FE, + 52790 - 44032: 0xAF47, + 52791 - 44032: 0xAF48, + 52792 - 44032: 0xAF49, + 52793 - 44032: 0xAF4A, + 52794 - 44032: 0xAF4B, + 52795 - 44032: 0xAF4C, + 52796 - 44032: 0xAF4D, + 52797 - 44032: 0xAF4E, + 52798 - 44032: 0xAF4F, + 52799 - 44032: 0xAF50, + 52800 - 44032: 0xAF51, + 52801 - 44032: 0xAF52, + 52802 - 44032: 0xAF53, + 52803 - 44032: 0xAF54, + 52804 - 44032: 0xAF55, + 52805 - 44032: 0xAF56, + 52806 - 44032: 0xAF57, + 52807 - 44032: 0xAF58, + 52808 - 44032: 0xAF59, + 52809 - 44032: 0xAF5A, + 52810 - 44032: 0xAF61, + 52811 - 44032: 0xAF62, + 52812 - 44032: 0xAF63, + 52813 - 44032: 0xAF64, + 52814 - 44032: 0xAF65, + 52815 - 44032: 0xAF66, + 52816 - 44032: 0xAF67, + 52817 - 44032: 0xAF68, + 52818 - 44032: 0xAF69, + 52819 - 44032: 0xAF6A, + 52820 - 44032: 0xAF6B, + 52821 - 44032: 0xAF6C, + 52822 - 44032: 0xAF6D, + 52823 - 44032: 0xAF6E, + 52824 - 44032: 0xC4A1, + 52825 - 44032: 0xC4A2, + 52826 - 44032: 0xAF6F, + 52827 - 44032: 0xAF70, + 52828 - 44032: 0xC4A3, + 52829 - 44032: 0xAF71, + 52830 - 44032: 0xAF72, + 52831 - 44032: 0xC4A4, + 52832 - 44032: 0xC4A5, + 52833 - 44032: 0xC4A6, + 52834 - 44032: 0xAF73, + 52835 - 44032: 0xAF74, + 52836 - 44032: 0xAF75, + 52837 - 44032: 0xAF76, + 52838 - 44032: 0xAF77, + 52839 - 44032: 0xAF78, + 52840 - 44032: 0xC4A7, + 52841 - 44032: 0xC4A8, + 52842 - 44032: 0xAF79, + 52843 - 44032: 0xC4A9, + 52844 - 44032: 0xAF7A, + 52845 - 44032: 0xC4AA, + 52846 - 44032: 0xAF81, + 52847 - 44032: 0xAF82, + 52848 - 44032: 0xAF83, + 52849 - 44032: 0xAF84, + 52850 - 44032: 0xAF85, + 52851 - 44032: 0xAF86, + 52852 - 44032: 0xC4AB, + 52853 - 44032: 0xC4AC, + 52854 - 44032: 0xAF87, + 52855 - 44032: 0xAF88, + 52856 - 44032: 0xC4AD, + 52857 - 44032: 0xAF89, + 52858 - 44032: 0xAF8A, + 52859 - 44032: 0xAF8B, + 52860 - 44032: 0xC4AE, + 52861 - 44032: 0xAF8C, + 52862 - 44032: 0xAF8D, + 52863 - 44032: 0xAF8E, + 52864 - 44032: 0xAF8F, + 52865 - 44032: 0xAF90, + 52866 - 44032: 0xAF91, + 52867 - 44032: 0xAF92, + 52868 - 44032: 0xC4AF, + 52869 - 44032: 0xC4B0, + 52870 - 44032: 0xAF93, + 52871 - 44032: 0xC4B1, + 52872 - 44032: 0xAF94, + 52873 - 44032: 0xC4B2, + 52874 - 44032: 0xAF95, + 52875 - 44032: 0xAF96, + 52876 - 44032: 0xAF97, + 52877 - 44032: 0xAF98, + 52878 - 44032: 0xAF99, + 52879 - 44032: 0xAF9A, + 52880 - 44032: 0xC4B3, + 52881 - 44032: 0xC4B4, + 52882 - 44032: 0xAF9B, + 52883 - 44032: 0xAF9C, + 52884 - 44032: 0xC4B5, + 52885 - 44032: 0xAF9D, + 52886 - 44032: 0xAF9E, + 52887 - 44032: 0xAF9F, + 52888 - 44032: 0xC4B6, + 52889 - 44032: 0xAFA0, + 52890 - 44032: 0xB041, + 52891 - 44032: 0xB042, + 52892 - 44032: 0xB043, + 52893 - 44032: 0xB044, + 52894 - 44032: 0xB045, + 52895 - 44032: 0xB046, + 52896 - 44032: 0xC4B7, + 52897 - 44032: 0xC4B8, + 52898 - 44032: 0xB047, + 52899 - 44032: 0xC4B9, + 52900 - 44032: 0xC4BA, + 52901 - 44032: 0xC4BB, + 52902 - 44032: 0xB048, + 52903 - 44032: 0xB049, + 52904 - 44032: 0xB04A, + 52905 - 44032: 0xB04B, + 52906 - 44032: 0xB04C, + 52907 - 44032: 0xB04D, + 52908 - 44032: 0xC4BC, + 52909 - 44032: 0xC4BD, + 52910 - 44032: 0xB04E, + 52911 - 44032: 0xB04F, + 52912 - 44032: 0xB050, + 52913 - 44032: 0xB051, + 52914 - 44032: 0xB052, + 52915 - 44032: 0xB053, + 52916 - 44032: 0xB054, + 52917 - 44032: 0xB055, + 52918 - 44032: 0xB056, + 52919 - 44032: 0xB057, + 52920 - 44032: 0xB058, + 52921 - 44032: 0xB059, + 52922 - 44032: 0xB05A, + 52923 - 44032: 0xB061, + 52924 - 44032: 0xB062, + 52925 - 44032: 0xB063, + 52926 - 44032: 0xB064, + 52927 - 44032: 0xB065, + 52928 - 44032: 0xB066, + 52929 - 44032: 0xC4BE, + 52930 - 44032: 0xB067, + 52931 - 44032: 0xB068, + 52932 - 44032: 0xB069, + 52933 - 44032: 0xB06A, + 52934 - 44032: 0xB06B, + 52935 - 44032: 0xB06C, + 52936 - 44032: 0xB06D, + 52937 - 44032: 0xB06E, + 52938 - 44032: 0xB06F, + 52939 - 44032: 0xB070, + 52940 - 44032: 0xB071, + 52941 - 44032: 0xB072, + 52942 - 44032: 0xB073, + 52943 - 44032: 0xB074, + 52944 - 44032: 0xB075, + 52945 - 44032: 0xB076, + 52946 - 44032: 0xB077, + 52947 - 44032: 0xB078, + 52948 - 44032: 0xB079, + 52949 - 44032: 0xB07A, + 52950 - 44032: 0xB081, + 52951 - 44032: 0xB082, + 52952 - 44032: 0xB083, + 52953 - 44032: 0xB084, + 52954 - 44032: 0xB085, + 52955 - 44032: 0xB086, + 52956 - 44032: 0xB087, + 52957 - 44032: 0xB088, + 52958 - 44032: 0xB089, + 52959 - 44032: 0xB08A, + 52960 - 44032: 0xB08B, + 52961 - 44032: 0xB08C, + 52962 - 44032: 0xB08D, + 52963 - 44032: 0xB08E, + 52964 - 44032: 0xC4BF, + 52965 - 44032: 0xC4C0, + 52966 - 44032: 0xB08F, + 52967 - 44032: 0xB090, + 52968 - 44032: 0xC4C1, + 52969 - 44032: 0xB091, + 52970 - 44032: 0xB092, + 52971 - 44032: 0xC4C2, + 52972 - 44032: 0xC4C3, + 52973 - 44032: 0xB093, + 52974 - 44032: 0xB094, + 52975 - 44032: 0xB095, + 52976 - 44032: 0xB096, + 52977 - 44032: 0xB097, + 52978 - 44032: 0xB098, + 52979 - 44032: 0xB099, + 52980 - 44032: 0xC4C4, + 52981 - 44032: 0xC4C5, + 52982 - 44032: 0xB09A, + 52983 - 44032: 0xC4C6, + 52984 - 44032: 0xC4C7, + 52985 - 44032: 0xC4C8, + 52986 - 44032: 0xB09B, + 52987 - 44032: 0xB09C, + 52988 - 44032: 0xB09D, + 52989 - 44032: 0xB09E, + 52990 - 44032: 0xB09F, + 52991 - 44032: 0xB0A0, + 52992 - 44032: 0xC4C9, + 52993 - 44032: 0xC4CA, + 52994 - 44032: 0xB141, + 52995 - 44032: 0xB142, + 52996 - 44032: 0xC4CB, + 52997 - 44032: 0xB143, + 52998 - 44032: 0xB144, + 52999 - 44032: 0xB145, + 53000 - 44032: 0xC4CC, + 53001 - 44032: 0xB146, + 53002 - 44032: 0xB147, + 53003 - 44032: 0xB148, + 53004 - 44032: 0xB149, + 53005 - 44032: 0xB14A, + 53006 - 44032: 0xB14B, + 53007 - 44032: 0xB14C, + 53008 - 44032: 0xC4CD, + 53009 - 44032: 0xC4CE, + 53010 - 44032: 0xB14D, + 53011 - 44032: 0xC4CF, + 53012 - 44032: 0xB14E, + 53013 - 44032: 0xC4D0, + 53014 - 44032: 0xB14F, + 53015 - 44032: 0xB150, + 53016 - 44032: 0xB151, + 53017 - 44032: 0xB152, + 53018 - 44032: 0xB153, + 53019 - 44032: 0xB154, + 53020 - 44032: 0xC4D1, + 53021 - 44032: 0xB155, + 53022 - 44032: 0xB156, + 53023 - 44032: 0xB157, + 53024 - 44032: 0xC4D2, + 53025 - 44032: 0xB158, + 53026 - 44032: 0xB159, + 53027 - 44032: 0xB15A, + 53028 - 44032: 0xC4D3, + 53029 - 44032: 0xB161, + 53030 - 44032: 0xB162, + 53031 - 44032: 0xB163, + 53032 - 44032: 0xB164, + 53033 - 44032: 0xB165, + 53034 - 44032: 0xB166, + 53035 - 44032: 0xB167, + 53036 - 44032: 0xC4D4, + 53037 - 44032: 0xC4D5, + 53038 - 44032: 0xB168, + 53039 - 44032: 0xC4D6, + 53040 - 44032: 0xC4D7, + 53041 - 44032: 0xC4D8, + 53042 - 44032: 0xB169, + 53043 - 44032: 0xB16A, + 53044 - 44032: 0xB16B, + 53045 - 44032: 0xB16C, + 53046 - 44032: 0xB16D, + 53047 - 44032: 0xB16E, + 53048 - 44032: 0xC4D9, + 53049 - 44032: 0xB16F, + 53050 - 44032: 0xB170, + 53051 - 44032: 0xB171, + 53052 - 44032: 0xB172, + 53053 - 44032: 0xB173, + 53054 - 44032: 0xB174, + 53055 - 44032: 0xB175, + 53056 - 44032: 0xB176, + 53057 - 44032: 0xB177, + 53058 - 44032: 0xB178, + 53059 - 44032: 0xB179, + 53060 - 44032: 0xB17A, + 53061 - 44032: 0xB181, + 53062 - 44032: 0xB182, + 53063 - 44032: 0xB183, + 53064 - 44032: 0xB184, + 53065 - 44032: 0xB185, + 53066 - 44032: 0xB186, + 53067 - 44032: 0xB187, + 53068 - 44032: 0xB188, + 53069 - 44032: 0xB189, + 53070 - 44032: 0xB18A, + 53071 - 44032: 0xB18B, + 53072 - 44032: 0xB18C, + 53073 - 44032: 0xB18D, + 53074 - 44032: 0xB18E, + 53075 - 44032: 0xB18F, + 53076 - 44032: 0xC4DA, + 53077 - 44032: 0xC4DB, + 53078 - 44032: 0xB190, + 53079 - 44032: 0xB191, + 53080 - 44032: 0xC4DC, + 53081 - 44032: 0xB192, + 53082 - 44032: 0xB193, + 53083 - 44032: 0xB194, + 53084 - 44032: 0xC4DD, + 53085 - 44032: 0xB195, + 53086 - 44032: 0xB196, + 53087 - 44032: 0xB197, + 53088 - 44032: 0xB198, + 53089 - 44032: 0xB199, + 53090 - 44032: 0xB19A, + 53091 - 44032: 0xB19B, + 53092 - 44032: 0xC4DE, + 53093 - 44032: 0xC4DF, + 53094 - 44032: 0xB19C, + 53095 - 44032: 0xC4E0, + 53096 - 44032: 0xB19D, + 53097 - 44032: 0xC4E1, + 53098 - 44032: 0xB19E, + 53099 - 44032: 0xB19F, + 53100 - 44032: 0xB1A0, + 53101 - 44032: 0xB241, + 53102 - 44032: 0xB242, + 53103 - 44032: 0xB243, + 53104 - 44032: 0xC4E2, + 53105 - 44032: 0xC4E3, + 53106 - 44032: 0xB244, + 53107 - 44032: 0xB245, + 53108 - 44032: 0xC4E4, + 53109 - 44032: 0xB246, + 53110 - 44032: 0xB247, + 53111 - 44032: 0xB248, + 53112 - 44032: 0xC4E5, + 53113 - 44032: 0xB249, + 53114 - 44032: 0xB24A, + 53115 - 44032: 0xB24B, + 53116 - 44032: 0xB24C, + 53117 - 44032: 0xB24D, + 53118 - 44032: 0xB24E, + 53119 - 44032: 0xB24F, + 53120 - 44032: 0xC4E6, + 53121 - 44032: 0xB250, + 53122 - 44032: 0xB251, + 53123 - 44032: 0xB252, + 53124 - 44032: 0xB253, + 53125 - 44032: 0xC4E7, + 53126 - 44032: 0xB254, + 53127 - 44032: 0xB255, + 53128 - 44032: 0xB256, + 53129 - 44032: 0xB257, + 53130 - 44032: 0xB258, + 53131 - 44032: 0xB259, + 53132 - 44032: 0xC4E8, + 53133 - 44032: 0xB25A, + 53134 - 44032: 0xB261, + 53135 - 44032: 0xB262, + 53136 - 44032: 0xB263, + 53137 - 44032: 0xB264, + 53138 - 44032: 0xB265, + 53139 - 44032: 0xB266, + 53140 - 44032: 0xB267, + 53141 - 44032: 0xB268, + 53142 - 44032: 0xB269, + 53143 - 44032: 0xB26A, + 53144 - 44032: 0xB26B, + 53145 - 44032: 0xB26C, + 53146 - 44032: 0xB26D, + 53147 - 44032: 0xB26E, + 53148 - 44032: 0xB26F, + 53149 - 44032: 0xB270, + 53150 - 44032: 0xB271, + 53151 - 44032: 0xB272, + 53152 - 44032: 0xB273, + 53153 - 44032: 0xC4E9, + 53154 - 44032: 0xB274, + 53155 - 44032: 0xB275, + 53156 - 44032: 0xB276, + 53157 - 44032: 0xB277, + 53158 - 44032: 0xB278, + 53159 - 44032: 0xB279, + 53160 - 44032: 0xC4EA, + 53161 - 44032: 0xB27A, + 53162 - 44032: 0xB281, + 53163 - 44032: 0xB282, + 53164 - 44032: 0xB283, + 53165 - 44032: 0xB284, + 53166 - 44032: 0xB285, + 53167 - 44032: 0xB286, + 53168 - 44032: 0xC4EB, + 53169 - 44032: 0xB287, + 53170 - 44032: 0xB288, + 53171 - 44032: 0xB289, + 53172 - 44032: 0xB28A, + 53173 - 44032: 0xB28B, + 53174 - 44032: 0xB28C, + 53175 - 44032: 0xB28D, + 53176 - 44032: 0xB28E, + 53177 - 44032: 0xB28F, + 53178 - 44032: 0xB290, + 53179 - 44032: 0xB291, + 53180 - 44032: 0xB292, + 53181 - 44032: 0xB293, + 53182 - 44032: 0xB294, + 53183 - 44032: 0xB295, + 53184 - 44032: 0xB296, + 53185 - 44032: 0xB297, + 53186 - 44032: 0xB298, + 53187 - 44032: 0xB299, + 53188 - 44032: 0xC4EC, + 53189 - 44032: 0xB29A, + 53190 - 44032: 0xB29B, + 53191 - 44032: 0xB29C, + 53192 - 44032: 0xB29D, + 53193 - 44032: 0xB29E, + 53194 - 44032: 0xB29F, + 53195 - 44032: 0xB2A0, + 53196 - 44032: 0xB341, + 53197 - 44032: 0xB342, + 53198 - 44032: 0xB343, + 53199 - 44032: 0xB344, + 53200 - 44032: 0xB345, + 53201 - 44032: 0xB346, + 53202 - 44032: 0xB347, + 53203 - 44032: 0xB348, + 53204 - 44032: 0xB349, + 53205 - 44032: 0xB34A, + 53206 - 44032: 0xB34B, + 53207 - 44032: 0xB34C, + 53208 - 44032: 0xB34D, + 53209 - 44032: 0xB34E, + 53210 - 44032: 0xB34F, + 53211 - 44032: 0xB350, + 53212 - 44032: 0xB351, + 53213 - 44032: 0xB352, + 53214 - 44032: 0xB353, + 53215 - 44032: 0xB354, + 53216 - 44032: 0xC4ED, + 53217 - 44032: 0xC4EE, + 53218 - 44032: 0xB355, + 53219 - 44032: 0xB356, + 53220 - 44032: 0xC4EF, + 53221 - 44032: 0xB357, + 53222 - 44032: 0xB358, + 53223 - 44032: 0xB359, + 53224 - 44032: 0xC4F0, + 53225 - 44032: 0xB35A, + 53226 - 44032: 0xB361, + 53227 - 44032: 0xB362, + 53228 - 44032: 0xB363, + 53229 - 44032: 0xB364, + 53230 - 44032: 0xB365, + 53231 - 44032: 0xB366, + 53232 - 44032: 0xC4F1, + 53233 - 44032: 0xC4F2, + 53234 - 44032: 0xB367, + 53235 - 44032: 0xC4F3, + 53236 - 44032: 0xB368, + 53237 - 44032: 0xC4F4, + 53238 - 44032: 0xB369, + 53239 - 44032: 0xB36A, + 53240 - 44032: 0xB36B, + 53241 - 44032: 0xB36C, + 53242 - 44032: 0xB36D, + 53243 - 44032: 0xB36E, + 53244 - 44032: 0xC4F5, + 53245 - 44032: 0xB36F, + 53246 - 44032: 0xB370, + 53247 - 44032: 0xB371, + 53248 - 44032: 0xC4F6, + 53249 - 44032: 0xB372, + 53250 - 44032: 0xB373, + 53251 - 44032: 0xB374, + 53252 - 44032: 0xC4F7, + 53253 - 44032: 0xB375, + 53254 - 44032: 0xB376, + 53255 - 44032: 0xB377, + 53256 - 44032: 0xB378, + 53257 - 44032: 0xB379, + 53258 - 44032: 0xB37A, + 53259 - 44032: 0xB381, + 53260 - 44032: 0xB382, + 53261 - 44032: 0xB383, + 53262 - 44032: 0xB384, + 53263 - 44032: 0xB385, + 53264 - 44032: 0xB386, + 53265 - 44032: 0xC4F8, + 53266 - 44032: 0xB387, + 53267 - 44032: 0xB388, + 53268 - 44032: 0xB389, + 53269 - 44032: 0xB38A, + 53270 - 44032: 0xB38B, + 53271 - 44032: 0xB38C, + 53272 - 44032: 0xC4F9, + 53273 - 44032: 0xB38D, + 53274 - 44032: 0xB38E, + 53275 - 44032: 0xB38F, + 53276 - 44032: 0xB390, + 53277 - 44032: 0xB391, + 53278 - 44032: 0xB392, + 53279 - 44032: 0xB393, + 53280 - 44032: 0xB394, + 53281 - 44032: 0xB395, + 53282 - 44032: 0xB396, + 53283 - 44032: 0xB397, + 53284 - 44032: 0xB398, + 53285 - 44032: 0xB399, + 53286 - 44032: 0xB39A, + 53287 - 44032: 0xB39B, + 53288 - 44032: 0xB39C, + 53289 - 44032: 0xB39D, + 53290 - 44032: 0xB39E, + 53291 - 44032: 0xB39F, + 53292 - 44032: 0xB3A0, + 53293 - 44032: 0xC4FA, + 53294 - 44032: 0xB441, + 53295 - 44032: 0xB442, + 53296 - 44032: 0xB443, + 53297 - 44032: 0xB444, + 53298 - 44032: 0xB445, + 53299 - 44032: 0xB446, + 53300 - 44032: 0xC4FB, + 53301 - 44032: 0xC4FC, + 53302 - 44032: 0xB447, + 53303 - 44032: 0xB448, + 53304 - 44032: 0xC4FD, + 53305 - 44032: 0xB449, + 53306 - 44032: 0xB44A, + 53307 - 44032: 0xB44B, + 53308 - 44032: 0xC4FE, + 53309 - 44032: 0xB44C, + 53310 - 44032: 0xB44D, + 53311 - 44032: 0xB44E, + 53312 - 44032: 0xB44F, + 53313 - 44032: 0xB450, + 53314 - 44032: 0xB451, + 53315 - 44032: 0xB452, + 53316 - 44032: 0xC5A1, + 53317 - 44032: 0xC5A2, + 53318 - 44032: 0xB453, + 53319 - 44032: 0xC5A3, + 53320 - 44032: 0xB454, + 53321 - 44032: 0xC5A4, + 53322 - 44032: 0xB455, + 53323 - 44032: 0xB456, + 53324 - 44032: 0xB457, + 53325 - 44032: 0xB458, + 53326 - 44032: 0xB459, + 53327 - 44032: 0xB45A, + 53328 - 44032: 0xC5A5, + 53329 - 44032: 0xB461, + 53330 - 44032: 0xB462, + 53331 - 44032: 0xB463, + 53332 - 44032: 0xC5A6, + 53333 - 44032: 0xB464, + 53334 - 44032: 0xB465, + 53335 - 44032: 0xB466, + 53336 - 44032: 0xC5A7, + 53337 - 44032: 0xB467, + 53338 - 44032: 0xB468, + 53339 - 44032: 0xB469, + 53340 - 44032: 0xB46A, + 53341 - 44032: 0xB46B, + 53342 - 44032: 0xB46C, + 53343 - 44032: 0xB46D, + 53344 - 44032: 0xC5A8, + 53345 - 44032: 0xB46E, + 53346 - 44032: 0xB46F, + 53347 - 44032: 0xB470, + 53348 - 44032: 0xB471, + 53349 - 44032: 0xB472, + 53350 - 44032: 0xB473, + 53351 - 44032: 0xB474, + 53352 - 44032: 0xB475, + 53353 - 44032: 0xB476, + 53354 - 44032: 0xB477, + 53355 - 44032: 0xB478, + 53356 - 44032: 0xC5A9, + 53357 - 44032: 0xC5AA, + 53358 - 44032: 0xB479, + 53359 - 44032: 0xB47A, + 53360 - 44032: 0xC5AB, + 53361 - 44032: 0xB481, + 53362 - 44032: 0xB482, + 53363 - 44032: 0xB483, + 53364 - 44032: 0xC5AC, + 53365 - 44032: 0xB484, + 53366 - 44032: 0xB485, + 53367 - 44032: 0xB486, + 53368 - 44032: 0xB487, + 53369 - 44032: 0xB488, + 53370 - 44032: 0xB489, + 53371 - 44032: 0xB48A, + 53372 - 44032: 0xC5AD, + 53373 - 44032: 0xC5AE, + 53374 - 44032: 0xB48B, + 53375 - 44032: 0xB48C, + 53376 - 44032: 0xB48D, + 53377 - 44032: 0xC5AF, + 53378 - 44032: 0xB48E, + 53379 - 44032: 0xB48F, + 53380 - 44032: 0xB490, + 53381 - 44032: 0xB491, + 53382 - 44032: 0xB492, + 53383 - 44032: 0xB493, + 53384 - 44032: 0xB494, + 53385 - 44032: 0xB495, + 53386 - 44032: 0xB496, + 53387 - 44032: 0xB497, + 53388 - 44032: 0xB498, + 53389 - 44032: 0xB499, + 53390 - 44032: 0xB49A, + 53391 - 44032: 0xB49B, + 53392 - 44032: 0xB49C, + 53393 - 44032: 0xB49D, + 53394 - 44032: 0xB49E, + 53395 - 44032: 0xB49F, + 53396 - 44032: 0xB4A0, + 53397 - 44032: 0xB541, + 53398 - 44032: 0xB542, + 53399 - 44032: 0xB543, + 53400 - 44032: 0xB544, + 53401 - 44032: 0xB545, + 53402 - 44032: 0xB546, + 53403 - 44032: 0xB547, + 53404 - 44032: 0xB548, + 53405 - 44032: 0xB549, + 53406 - 44032: 0xB54A, + 53407 - 44032: 0xB54B, + 53408 - 44032: 0xB54C, + 53409 - 44032: 0xB54D, + 53410 - 44032: 0xB54E, + 53411 - 44032: 0xB54F, + 53412 - 44032: 0xC5B0, + 53413 - 44032: 0xC5B1, + 53414 - 44032: 0xB550, + 53415 - 44032: 0xB551, + 53416 - 44032: 0xC5B2, + 53417 - 44032: 0xB552, + 53418 - 44032: 0xB553, + 53419 - 44032: 0xB554, + 53420 - 44032: 0xC5B3, + 53421 - 44032: 0xB555, + 53422 - 44032: 0xB556, + 53423 - 44032: 0xB557, + 53424 - 44032: 0xB558, + 53425 - 44032: 0xB559, + 53426 - 44032: 0xB55A, + 53427 - 44032: 0xB561, + 53428 - 44032: 0xC5B4, + 53429 - 44032: 0xC5B5, + 53430 - 44032: 0xB562, + 53431 - 44032: 0xC5B6, + 53432 - 44032: 0xB563, + 53433 - 44032: 0xC5B7, + 53434 - 44032: 0xB564, + 53435 - 44032: 0xB565, + 53436 - 44032: 0xB566, + 53437 - 44032: 0xB567, + 53438 - 44032: 0xB568, + 53439 - 44032: 0xB569, + 53440 - 44032: 0xC5B8, + 53441 - 44032: 0xC5B9, + 53442 - 44032: 0xB56A, + 53443 - 44032: 0xB56B, + 53444 - 44032: 0xC5BA, + 53445 - 44032: 0xB56C, + 53446 - 44032: 0xB56D, + 53447 - 44032: 0xB56E, + 53448 - 44032: 0xC5BB, + 53449 - 44032: 0xC5BC, + 53450 - 44032: 0xB56F, + 53451 - 44032: 0xB570, + 53452 - 44032: 0xB571, + 53453 - 44032: 0xB572, + 53454 - 44032: 0xB573, + 53455 - 44032: 0xB574, + 53456 - 44032: 0xC5BD, + 53457 - 44032: 0xC5BE, + 53458 - 44032: 0xB575, + 53459 - 44032: 0xC5BF, + 53460 - 44032: 0xC5C0, + 53461 - 44032: 0xC5C1, + 53462 - 44032: 0xB576, + 53463 - 44032: 0xB577, + 53464 - 44032: 0xB578, + 53465 - 44032: 0xB579, + 53466 - 44032: 0xB57A, + 53467 - 44032: 0xB581, + 53468 - 44032: 0xC5C2, + 53469 - 44032: 0xC5C3, + 53470 - 44032: 0xB582, + 53471 - 44032: 0xB583, + 53472 - 44032: 0xC5C4, + 53473 - 44032: 0xB584, + 53474 - 44032: 0xB585, + 53475 - 44032: 0xB586, + 53476 - 44032: 0xC5C5, + 53477 - 44032: 0xB587, + 53478 - 44032: 0xB588, + 53479 - 44032: 0xB589, + 53480 - 44032: 0xB58A, + 53481 - 44032: 0xB58B, + 53482 - 44032: 0xB58C, + 53483 - 44032: 0xB58D, + 53484 - 44032: 0xC5C6, + 53485 - 44032: 0xC5C7, + 53486 - 44032: 0xB58E, + 53487 - 44032: 0xC5C8, + 53488 - 44032: 0xC5C9, + 53489 - 44032: 0xC5CA, + 53490 - 44032: 0xB58F, + 53491 - 44032: 0xB590, + 53492 - 44032: 0xB591, + 53493 - 44032: 0xB592, + 53494 - 44032: 0xB593, + 53495 - 44032: 0xB594, + 53496 - 44032: 0xC5CB, + 53497 - 44032: 0xB595, + 53498 - 44032: 0xB596, + 53499 - 44032: 0xB597, + 53500 - 44032: 0xB598, + 53501 - 44032: 0xB599, + 53502 - 44032: 0xB59A, + 53503 - 44032: 0xB59B, + 53504 - 44032: 0xB59C, + 53505 - 44032: 0xB59D, + 53506 - 44032: 0xB59E, + 53507 - 44032: 0xB59F, + 53508 - 44032: 0xB5A0, + 53509 - 44032: 0xB641, + 53510 - 44032: 0xB642, + 53511 - 44032: 0xB643, + 53512 - 44032: 0xB644, + 53513 - 44032: 0xB645, + 53514 - 44032: 0xB646, + 53515 - 44032: 0xB647, + 53516 - 44032: 0xB648, + 53517 - 44032: 0xC5CC, + 53518 - 44032: 0xB649, + 53519 - 44032: 0xB64A, + 53520 - 44032: 0xB64B, + 53521 - 44032: 0xB64C, + 53522 - 44032: 0xB64D, + 53523 - 44032: 0xB64E, + 53524 - 44032: 0xB64F, + 53525 - 44032: 0xB650, + 53526 - 44032: 0xB651, + 53527 - 44032: 0xB652, + 53528 - 44032: 0xB653, + 53529 - 44032: 0xB654, + 53530 - 44032: 0xB655, + 53531 - 44032: 0xB656, + 53532 - 44032: 0xB657, + 53533 - 44032: 0xB658, + 53534 - 44032: 0xB659, + 53535 - 44032: 0xB65A, + 53536 - 44032: 0xB661, + 53537 - 44032: 0xB662, + 53538 - 44032: 0xB663, + 53539 - 44032: 0xB664, + 53540 - 44032: 0xB665, + 53541 - 44032: 0xB666, + 53542 - 44032: 0xB667, + 53543 - 44032: 0xB668, + 53544 - 44032: 0xB669, + 53545 - 44032: 0xB66A, + 53546 - 44032: 0xB66B, + 53547 - 44032: 0xB66C, + 53548 - 44032: 0xB66D, + 53549 - 44032: 0xB66E, + 53550 - 44032: 0xB66F, + 53551 - 44032: 0xB670, + 53552 - 44032: 0xC5CD, + 53553 - 44032: 0xC5CE, + 53554 - 44032: 0xB671, + 53555 - 44032: 0xB672, + 53556 - 44032: 0xC5CF, + 53557 - 44032: 0xB673, + 53558 - 44032: 0xB674, + 53559 - 44032: 0xB675, + 53560 - 44032: 0xC5D0, + 53561 - 44032: 0xB676, + 53562 - 44032: 0xC5D1, + 53563 - 44032: 0xB677, + 53564 - 44032: 0xB678, + 53565 - 44032: 0xB679, + 53566 - 44032: 0xB67A, + 53567 - 44032: 0xB681, + 53568 - 44032: 0xC5D2, + 53569 - 44032: 0xC5D3, + 53570 - 44032: 0xB682, + 53571 - 44032: 0xC5D4, + 53572 - 44032: 0xC5D5, + 53573 - 44032: 0xC5D6, + 53574 - 44032: 0xB683, + 53575 - 44032: 0xB684, + 53576 - 44032: 0xB685, + 53577 - 44032: 0xB686, + 53578 - 44032: 0xB687, + 53579 - 44032: 0xB688, + 53580 - 44032: 0xC5D7, + 53581 - 44032: 0xC5D8, + 53582 - 44032: 0xB689, + 53583 - 44032: 0xB68A, + 53584 - 44032: 0xC5D9, + 53585 - 44032: 0xB68B, + 53586 - 44032: 0xB68C, + 53587 - 44032: 0xB68D, + 53588 - 44032: 0xC5DA, + 53589 - 44032: 0xB68E, + 53590 - 44032: 0xB68F, + 53591 - 44032: 0xB690, + 53592 - 44032: 0xB691, + 53593 - 44032: 0xB692, + 53594 - 44032: 0xB693, + 53595 - 44032: 0xB694, + 53596 - 44032: 0xC5DB, + 53597 - 44032: 0xC5DC, + 53598 - 44032: 0xB695, + 53599 - 44032: 0xC5DD, + 53600 - 44032: 0xB696, + 53601 - 44032: 0xC5DE, + 53602 - 44032: 0xB697, + 53603 - 44032: 0xB698, + 53604 - 44032: 0xB699, + 53605 - 44032: 0xB69A, + 53606 - 44032: 0xB69B, + 53607 - 44032: 0xB69C, + 53608 - 44032: 0xC5DF, + 53609 - 44032: 0xB69D, + 53610 - 44032: 0xB69E, + 53611 - 44032: 0xB69F, + 53612 - 44032: 0xC5E0, + 53613 - 44032: 0xB6A0, + 53614 - 44032: 0xB741, + 53615 - 44032: 0xB742, + 53616 - 44032: 0xB743, + 53617 - 44032: 0xB744, + 53618 - 44032: 0xB745, + 53619 - 44032: 0xB746, + 53620 - 44032: 0xB747, + 53621 - 44032: 0xB748, + 53622 - 44032: 0xB749, + 53623 - 44032: 0xB74A, + 53624 - 44032: 0xB74B, + 53625 - 44032: 0xB74C, + 53626 - 44032: 0xB74D, + 53627 - 44032: 0xB74E, + 53628 - 44032: 0xC5E1, + 53629 - 44032: 0xB74F, + 53630 - 44032: 0xB750, + 53631 - 44032: 0xB751, + 53632 - 44032: 0xB752, + 53633 - 44032: 0xB753, + 53634 - 44032: 0xB754, + 53635 - 44032: 0xB755, + 53636 - 44032: 0xC5E2, + 53637 - 44032: 0xB756, + 53638 - 44032: 0xB757, + 53639 - 44032: 0xB758, + 53640 - 44032: 0xC5E3, + 53641 - 44032: 0xB759, + 53642 - 44032: 0xB75A, + 53643 - 44032: 0xB761, + 53644 - 44032: 0xB762, + 53645 - 44032: 0xB763, + 53646 - 44032: 0xB764, + 53647 - 44032: 0xB765, + 53648 - 44032: 0xB766, + 53649 - 44032: 0xB767, + 53650 - 44032: 0xB768, + 53651 - 44032: 0xB769, + 53652 - 44032: 0xB76A, + 53653 - 44032: 0xB76B, + 53654 - 44032: 0xB76C, + 53655 - 44032: 0xB76D, + 53656 - 44032: 0xB76E, + 53657 - 44032: 0xB76F, + 53658 - 44032: 0xB770, + 53659 - 44032: 0xB771, + 53660 - 44032: 0xB772, + 53661 - 44032: 0xB773, + 53662 - 44032: 0xB774, + 53663 - 44032: 0xB775, + 53664 - 44032: 0xC5E4, + 53665 - 44032: 0xC5E5, + 53666 - 44032: 0xB776, + 53667 - 44032: 0xB777, + 53668 - 44032: 0xC5E6, + 53669 - 44032: 0xB778, + 53670 - 44032: 0xB779, + 53671 - 44032: 0xB77A, + 53672 - 44032: 0xC5E7, + 53673 - 44032: 0xB781, + 53674 - 44032: 0xB782, + 53675 - 44032: 0xB783, + 53676 - 44032: 0xB784, + 53677 - 44032: 0xB785, + 53678 - 44032: 0xB786, + 53679 - 44032: 0xB787, + 53680 - 44032: 0xC5E8, + 53681 - 44032: 0xC5E9, + 53682 - 44032: 0xB788, + 53683 - 44032: 0xC5EA, + 53684 - 44032: 0xB789, + 53685 - 44032: 0xC5EB, + 53686 - 44032: 0xB78A, + 53687 - 44032: 0xB78B, + 53688 - 44032: 0xB78C, + 53689 - 44032: 0xB78D, + 53690 - 44032: 0xC5EC, + 53691 - 44032: 0xB78E, + 53692 - 44032: 0xC5ED, + 53693 - 44032: 0xB78F, + 53694 - 44032: 0xB790, + 53695 - 44032: 0xB791, + 53696 - 44032: 0xC5EE, + 53697 - 44032: 0xB792, + 53698 - 44032: 0xB793, + 53699 - 44032: 0xB794, + 53700 - 44032: 0xB795, + 53701 - 44032: 0xB796, + 53702 - 44032: 0xB797, + 53703 - 44032: 0xB798, + 53704 - 44032: 0xB799, + 53705 - 44032: 0xB79A, + 53706 - 44032: 0xB79B, + 53707 - 44032: 0xB79C, + 53708 - 44032: 0xB79D, + 53709 - 44032: 0xB79E, + 53710 - 44032: 0xB79F, + 53711 - 44032: 0xB7A0, + 53712 - 44032: 0xB841, + 53713 - 44032: 0xB842, + 53714 - 44032: 0xB843, + 53715 - 44032: 0xB844, + 53716 - 44032: 0xB845, + 53717 - 44032: 0xB846, + 53718 - 44032: 0xB847, + 53719 - 44032: 0xB848, + 53720 - 44032: 0xC5EF, + 53721 - 44032: 0xB849, + 53722 - 44032: 0xB84A, + 53723 - 44032: 0xB84B, + 53724 - 44032: 0xB84C, + 53725 - 44032: 0xB84D, + 53726 - 44032: 0xB84E, + 53727 - 44032: 0xB84F, + 53728 - 44032: 0xB850, + 53729 - 44032: 0xB851, + 53730 - 44032: 0xB852, + 53731 - 44032: 0xB853, + 53732 - 44032: 0xB854, + 53733 - 44032: 0xB855, + 53734 - 44032: 0xB856, + 53735 - 44032: 0xB857, + 53736 - 44032: 0xB858, + 53737 - 44032: 0xB859, + 53738 - 44032: 0xB85A, + 53739 - 44032: 0xB861, + 53740 - 44032: 0xB862, + 53741 - 44032: 0xB863, + 53742 - 44032: 0xB864, + 53743 - 44032: 0xB865, + 53744 - 44032: 0xB866, + 53745 - 44032: 0xB867, + 53746 - 44032: 0xB868, + 53747 - 44032: 0xB869, + 53748 - 44032: 0xC5F0, + 53749 - 44032: 0xB86A, + 53750 - 44032: 0xB86B, + 53751 - 44032: 0xB86C, + 53752 - 44032: 0xC5F1, + 53753 - 44032: 0xB86D, + 53754 - 44032: 0xB86E, + 53755 - 44032: 0xB86F, + 53756 - 44032: 0xB870, + 53757 - 44032: 0xB871, + 53758 - 44032: 0xB872, + 53759 - 44032: 0xB873, + 53760 - 44032: 0xB874, + 53761 - 44032: 0xB875, + 53762 - 44032: 0xB876, + 53763 - 44032: 0xB877, + 53764 - 44032: 0xB878, + 53765 - 44032: 0xB879, + 53766 - 44032: 0xB87A, + 53767 - 44032: 0xC5F2, + 53768 - 44032: 0xB881, + 53769 - 44032: 0xC5F3, + 53770 - 44032: 0xB882, + 53771 - 44032: 0xB883, + 53772 - 44032: 0xB884, + 53773 - 44032: 0xB885, + 53774 - 44032: 0xB886, + 53775 - 44032: 0xB887, + 53776 - 44032: 0xC5F4, + 53777 - 44032: 0xB888, + 53778 - 44032: 0xB889, + 53779 - 44032: 0xB88A, + 53780 - 44032: 0xB88B, + 53781 - 44032: 0xB88C, + 53782 - 44032: 0xB88D, + 53783 - 44032: 0xB88E, + 53784 - 44032: 0xB88F, + 53785 - 44032: 0xB890, + 53786 - 44032: 0xB891, + 53787 - 44032: 0xB892, + 53788 - 44032: 0xB893, + 53789 - 44032: 0xB894, + 53790 - 44032: 0xB895, + 53791 - 44032: 0xB896, + 53792 - 44032: 0xB897, + 53793 - 44032: 0xB898, + 53794 - 44032: 0xB899, + 53795 - 44032: 0xB89A, + 53796 - 44032: 0xB89B, + 53797 - 44032: 0xB89C, + 53798 - 44032: 0xB89D, + 53799 - 44032: 0xB89E, + 53800 - 44032: 0xB89F, + 53801 - 44032: 0xB8A0, + 53802 - 44032: 0xB941, + 53803 - 44032: 0xB942, + 53804 - 44032: 0xC5F5, + 53805 - 44032: 0xC5F6, + 53806 - 44032: 0xB943, + 53807 - 44032: 0xB944, + 53808 - 44032: 0xC5F7, + 53809 - 44032: 0xB945, + 53810 - 44032: 0xB946, + 53811 - 44032: 0xB947, + 53812 - 44032: 0xC5F8, + 53813 - 44032: 0xB948, + 53814 - 44032: 0xB949, + 53815 - 44032: 0xB94A, + 53816 - 44032: 0xB94B, + 53817 - 44032: 0xB94C, + 53818 - 44032: 0xB94D, + 53819 - 44032: 0xB94E, + 53820 - 44032: 0xC5F9, + 53821 - 44032: 0xC5FA, + 53822 - 44032: 0xB94F, + 53823 - 44032: 0xC5FB, + 53824 - 44032: 0xB950, + 53825 - 44032: 0xC5FC, + 53826 - 44032: 0xB951, + 53827 - 44032: 0xB952, + 53828 - 44032: 0xB953, + 53829 - 44032: 0xB954, + 53830 - 44032: 0xB955, + 53831 - 44032: 0xB956, + 53832 - 44032: 0xC5FD, + 53833 - 44032: 0xB957, + 53834 - 44032: 0xB958, + 53835 - 44032: 0xB959, + 53836 - 44032: 0xB95A, + 53837 - 44032: 0xB961, + 53838 - 44032: 0xB962, + 53839 - 44032: 0xB963, + 53840 - 44032: 0xB964, + 53841 - 44032: 0xB965, + 53842 - 44032: 0xB966, + 53843 - 44032: 0xB967, + 53844 - 44032: 0xB968, + 53845 - 44032: 0xB969, + 53846 - 44032: 0xB96A, + 53847 - 44032: 0xB96B, + 53848 - 44032: 0xB96C, + 53849 - 44032: 0xB96D, + 53850 - 44032: 0xB96E, + 53851 - 44032: 0xB96F, + 53852 - 44032: 0xC5FE, + 53853 - 44032: 0xB970, + 53854 - 44032: 0xB971, + 53855 - 44032: 0xB972, + 53856 - 44032: 0xB973, + 53857 - 44032: 0xB974, + 53858 - 44032: 0xB975, + 53859 - 44032: 0xB976, + 53860 - 44032: 0xC6A1, + 53861 - 44032: 0xB977, + 53862 - 44032: 0xB978, + 53863 - 44032: 0xB979, + 53864 - 44032: 0xB97A, + 53865 - 44032: 0xB981, + 53866 - 44032: 0xB982, + 53867 - 44032: 0xB983, + 53868 - 44032: 0xB984, + 53869 - 44032: 0xB985, + 53870 - 44032: 0xB986, + 53871 - 44032: 0xB987, + 53872 - 44032: 0xB988, + 53873 - 44032: 0xB989, + 53874 - 44032: 0xB98A, + 53875 - 44032: 0xB98B, + 53876 - 44032: 0xB98C, + 53877 - 44032: 0xB98D, + 53878 - 44032: 0xB98E, + 53879 - 44032: 0xB98F, + 53880 - 44032: 0xB990, + 53881 - 44032: 0xB991, + 53882 - 44032: 0xB992, + 53883 - 44032: 0xB993, + 53884 - 44032: 0xB994, + 53885 - 44032: 0xB995, + 53886 - 44032: 0xB996, + 53887 - 44032: 0xB997, + 53888 - 44032: 0xC6A2, + 53889 - 44032: 0xC6A3, + 53890 - 44032: 0xB998, + 53891 - 44032: 0xB999, + 53892 - 44032: 0xC6A4, + 53893 - 44032: 0xB99A, + 53894 - 44032: 0xB99B, + 53895 - 44032: 0xB99C, + 53896 - 44032: 0xC6A5, + 53897 - 44032: 0xB99D, + 53898 - 44032: 0xB99E, + 53899 - 44032: 0xB99F, + 53900 - 44032: 0xB9A0, + 53901 - 44032: 0xBA41, + 53902 - 44032: 0xBA42, + 53903 - 44032: 0xBA43, + 53904 - 44032: 0xC6A6, + 53905 - 44032: 0xC6A7, + 53906 - 44032: 0xBA44, + 53907 - 44032: 0xBA45, + 53908 - 44032: 0xBA46, + 53909 - 44032: 0xC6A8, + 53910 - 44032: 0xBA47, + 53911 - 44032: 0xBA48, + 53912 - 44032: 0xBA49, + 53913 - 44032: 0xBA4A, + 53914 - 44032: 0xBA4B, + 53915 - 44032: 0xBA4C, + 53916 - 44032: 0xC6A9, + 53917 - 44032: 0xBA4D, + 53918 - 44032: 0xBA4E, + 53919 - 44032: 0xBA4F, + 53920 - 44032: 0xC6AA, + 53921 - 44032: 0xBA50, + 53922 - 44032: 0xBA51, + 53923 - 44032: 0xBA52, + 53924 - 44032: 0xC6AB, + 53925 - 44032: 0xBA53, + 53926 - 44032: 0xBA54, + 53927 - 44032: 0xBA55, + 53928 - 44032: 0xBA56, + 53929 - 44032: 0xBA57, + 53930 - 44032: 0xBA58, + 53931 - 44032: 0xBA59, + 53932 - 44032: 0xC6AC, + 53933 - 44032: 0xBA5A, + 53934 - 44032: 0xBA61, + 53935 - 44032: 0xBA62, + 53936 - 44032: 0xBA63, + 53937 - 44032: 0xC6AD, + 53938 - 44032: 0xBA64, + 53939 - 44032: 0xBA65, + 53940 - 44032: 0xBA66, + 53941 - 44032: 0xBA67, + 53942 - 44032: 0xBA68, + 53943 - 44032: 0xBA69, + 53944 - 44032: 0xC6AE, + 53945 - 44032: 0xC6AF, + 53946 - 44032: 0xBA6A, + 53947 - 44032: 0xBA6B, + 53948 - 44032: 0xC6B0, + 53949 - 44032: 0xBA6C, + 53950 - 44032: 0xBA6D, + 53951 - 44032: 0xC6B1, + 53952 - 44032: 0xC6B2, + 53953 - 44032: 0xBA6E, + 53954 - 44032: 0xC6B3, + 53955 - 44032: 0xBA6F, + 53956 - 44032: 0xBA70, + 53957 - 44032: 0xBA71, + 53958 - 44032: 0xBA72, + 53959 - 44032: 0xBA73, + 53960 - 44032: 0xC6B4, + 53961 - 44032: 0xC6B5, + 53962 - 44032: 0xBA74, + 53963 - 44032: 0xC6B6, + 53964 - 44032: 0xBA75, + 53965 - 44032: 0xBA76, + 53966 - 44032: 0xBA77, + 53967 - 44032: 0xBA78, + 53968 - 44032: 0xBA79, + 53969 - 44032: 0xBA7A, + 53970 - 44032: 0xBA81, + 53971 - 44032: 0xBA82, + 53972 - 44032: 0xC6B7, + 53973 - 44032: 0xBA83, + 53974 - 44032: 0xBA84, + 53975 - 44032: 0xBA85, + 53976 - 44032: 0xC6B8, + 53977 - 44032: 0xBA86, + 53978 - 44032: 0xBA87, + 53979 - 44032: 0xBA88, + 53980 - 44032: 0xC6B9, + 53981 - 44032: 0xBA89, + 53982 - 44032: 0xBA8A, + 53983 - 44032: 0xBA8B, + 53984 - 44032: 0xBA8C, + 53985 - 44032: 0xBA8D, + 53986 - 44032: 0xBA8E, + 53987 - 44032: 0xBA8F, + 53988 - 44032: 0xC6BA, + 53989 - 44032: 0xC6BB, + 53990 - 44032: 0xBA90, + 53991 - 44032: 0xBA91, + 53992 - 44032: 0xBA92, + 53993 - 44032: 0xBA93, + 53994 - 44032: 0xBA94, + 53995 - 44032: 0xBA95, + 53996 - 44032: 0xBA96, + 53997 - 44032: 0xBA97, + 53998 - 44032: 0xBA98, + 53999 - 44032: 0xBA99, + 54000 - 44032: 0xC6BC, + 54001 - 44032: 0xC6BD, + 54002 - 44032: 0xBA9A, + 54003 - 44032: 0xBA9B, + 54004 - 44032: 0xC6BE, + 54005 - 44032: 0xBA9C, + 54006 - 44032: 0xBA9D, + 54007 - 44032: 0xBA9E, + 54008 - 44032: 0xC6BF, + 54009 - 44032: 0xBA9F, + 54010 - 44032: 0xBAA0, + 54011 - 44032: 0xBB41, + 54012 - 44032: 0xBB42, + 54013 - 44032: 0xBB43, + 54014 - 44032: 0xBB44, + 54015 - 44032: 0xBB45, + 54016 - 44032: 0xC6C0, + 54017 - 44032: 0xC6C1, + 54018 - 44032: 0xBB46, + 54019 - 44032: 0xC6C2, + 54020 - 44032: 0xBB47, + 54021 - 44032: 0xC6C3, + 54022 - 44032: 0xBB48, + 54023 - 44032: 0xBB49, + 54024 - 44032: 0xBB4A, + 54025 - 44032: 0xBB4B, + 54026 - 44032: 0xBB4C, + 54027 - 44032: 0xBB4D, + 54028 - 44032: 0xC6C4, + 54029 - 44032: 0xC6C5, + 54030 - 44032: 0xC6C6, + 54031 - 44032: 0xBB4E, + 54032 - 44032: 0xC6C7, + 54033 - 44032: 0xBB4F, + 54034 - 44032: 0xBB50, + 54035 - 44032: 0xBB51, + 54036 - 44032: 0xC6C8, + 54037 - 44032: 0xBB52, + 54038 - 44032: 0xC6C9, + 54039 - 44032: 0xBB53, + 54040 - 44032: 0xBB54, + 54041 - 44032: 0xBB55, + 54042 - 44032: 0xBB56, + 54043 - 44032: 0xBB57, + 54044 - 44032: 0xC6CA, + 54045 - 44032: 0xC6CB, + 54046 - 44032: 0xBB58, + 54047 - 44032: 0xC6CC, + 54048 - 44032: 0xC6CD, + 54049 - 44032: 0xC6CE, + 54050 - 44032: 0xBB59, + 54051 - 44032: 0xBB5A, + 54052 - 44032: 0xBB61, + 54053 - 44032: 0xC6CF, + 54054 - 44032: 0xBB62, + 54055 - 44032: 0xBB63, + 54056 - 44032: 0xC6D0, + 54057 - 44032: 0xC6D1, + 54058 - 44032: 0xBB64, + 54059 - 44032: 0xBB65, + 54060 - 44032: 0xC6D2, + 54061 - 44032: 0xBB66, + 54062 - 44032: 0xBB67, + 54063 - 44032: 0xBB68, + 54064 - 44032: 0xC6D3, + 54065 - 44032: 0xBB69, + 54066 - 44032: 0xBB6A, + 54067 - 44032: 0xBB6B, + 54068 - 44032: 0xBB6C, + 54069 - 44032: 0xBB6D, + 54070 - 44032: 0xBB6E, + 54071 - 44032: 0xBB6F, + 54072 - 44032: 0xC6D4, + 54073 - 44032: 0xC6D5, + 54074 - 44032: 0xBB70, + 54075 - 44032: 0xC6D6, + 54076 - 44032: 0xC6D7, + 54077 - 44032: 0xC6D8, + 54078 - 44032: 0xBB71, + 54079 - 44032: 0xBB72, + 54080 - 44032: 0xBB73, + 54081 - 44032: 0xBB74, + 54082 - 44032: 0xBB75, + 54083 - 44032: 0xBB76, + 54084 - 44032: 0xC6D9, + 54085 - 44032: 0xC6DA, + 54086 - 44032: 0xBB77, + 54087 - 44032: 0xBB78, + 54088 - 44032: 0xBB79, + 54089 - 44032: 0xBB7A, + 54090 - 44032: 0xBB81, + 54091 - 44032: 0xBB82, + 54092 - 44032: 0xBB83, + 54093 - 44032: 0xBB84, + 54094 - 44032: 0xBB85, + 54095 - 44032: 0xBB86, + 54096 - 44032: 0xBB87, + 54097 - 44032: 0xBB88, + 54098 - 44032: 0xBB89, + 54099 - 44032: 0xBB8A, + 54100 - 44032: 0xBB8B, + 54101 - 44032: 0xBB8C, + 54102 - 44032: 0xBB8D, + 54103 - 44032: 0xBB8E, + 54104 - 44032: 0xBB8F, + 54105 - 44032: 0xBB90, + 54106 - 44032: 0xBB91, + 54107 - 44032: 0xBB92, + 54108 - 44032: 0xBB93, + 54109 - 44032: 0xBB94, + 54110 - 44032: 0xBB95, + 54111 - 44032: 0xBB96, + 54112 - 44032: 0xBB97, + 54113 - 44032: 0xBB98, + 54114 - 44032: 0xBB99, + 54115 - 44032: 0xBB9A, + 54116 - 44032: 0xBB9B, + 54117 - 44032: 0xBB9C, + 54118 - 44032: 0xBB9D, + 54119 - 44032: 0xBB9E, + 54120 - 44032: 0xBB9F, + 54121 - 44032: 0xBBA0, + 54122 - 44032: 0xBC41, + 54123 - 44032: 0xBC42, + 54124 - 44032: 0xBC43, + 54125 - 44032: 0xBC44, + 54126 - 44032: 0xBC45, + 54127 - 44032: 0xBC46, + 54128 - 44032: 0xBC47, + 54129 - 44032: 0xBC48, + 54130 - 44032: 0xBC49, + 54131 - 44032: 0xBC4A, + 54132 - 44032: 0xBC4B, + 54133 - 44032: 0xBC4C, + 54134 - 44032: 0xBC4D, + 54135 - 44032: 0xBC4E, + 54136 - 44032: 0xBC4F, + 54137 - 44032: 0xBC50, + 54138 - 44032: 0xBC51, + 54139 - 44032: 0xBC52, + 54140 - 44032: 0xC6DB, + 54141 - 44032: 0xC6DC, + 54142 - 44032: 0xBC53, + 54143 - 44032: 0xBC54, + 54144 - 44032: 0xC6DD, + 54145 - 44032: 0xBC55, + 54146 - 44032: 0xBC56, + 54147 - 44032: 0xBC57, + 54148 - 44032: 0xC6DE, + 54149 - 44032: 0xBC58, + 54150 - 44032: 0xBC59, + 54151 - 44032: 0xBC5A, + 54152 - 44032: 0xBC61, + 54153 - 44032: 0xBC62, + 54154 - 44032: 0xBC63, + 54155 - 44032: 0xBC64, + 54156 - 44032: 0xC6DF, + 54157 - 44032: 0xC6E0, + 54158 - 44032: 0xBC65, + 54159 - 44032: 0xC6E1, + 54160 - 44032: 0xC6E2, + 54161 - 44032: 0xC6E3, + 54162 - 44032: 0xBC66, + 54163 - 44032: 0xBC67, + 54164 - 44032: 0xBC68, + 54165 - 44032: 0xBC69, + 54166 - 44032: 0xBC6A, + 54167 - 44032: 0xBC6B, + 54168 - 44032: 0xC6E4, + 54169 - 44032: 0xC6E5, + 54170 - 44032: 0xBC6C, + 54171 - 44032: 0xBC6D, + 54172 - 44032: 0xC6E6, + 54173 - 44032: 0xBC6E, + 54174 - 44032: 0xBC6F, + 54175 - 44032: 0xBC70, + 54176 - 44032: 0xC6E7, + 54177 - 44032: 0xBC71, + 54178 - 44032: 0xBC72, + 54179 - 44032: 0xBC73, + 54180 - 44032: 0xBC74, + 54181 - 44032: 0xBC75, + 54182 - 44032: 0xBC76, + 54183 - 44032: 0xBC77, + 54184 - 44032: 0xC6E8, + 54185 - 44032: 0xC6E9, + 54186 - 44032: 0xBC78, + 54187 - 44032: 0xC6EA, + 54188 - 44032: 0xBC79, + 54189 - 44032: 0xC6EB, + 54190 - 44032: 0xBC7A, + 54191 - 44032: 0xBC81, + 54192 - 44032: 0xBC82, + 54193 - 44032: 0xBC83, + 54194 - 44032: 0xBC84, + 54195 - 44032: 0xBC85, + 54196 - 44032: 0xC6EC, + 54197 - 44032: 0xBC86, + 54198 - 44032: 0xBC87, + 54199 - 44032: 0xBC88, + 54200 - 44032: 0xC6ED, + 54201 - 44032: 0xBC89, + 54202 - 44032: 0xBC8A, + 54203 - 44032: 0xBC8B, + 54204 - 44032: 0xC6EE, + 54205 - 44032: 0xBC8C, + 54206 - 44032: 0xBC8D, + 54207 - 44032: 0xBC8E, + 54208 - 44032: 0xBC8F, + 54209 - 44032: 0xBC90, + 54210 - 44032: 0xBC91, + 54211 - 44032: 0xBC92, + 54212 - 44032: 0xC6EF, + 54213 - 44032: 0xC6F0, + 54214 - 44032: 0xBC93, + 54215 - 44032: 0xBC94, + 54216 - 44032: 0xC6F1, + 54217 - 44032: 0xC6F2, + 54218 - 44032: 0xBC95, + 54219 - 44032: 0xBC96, + 54220 - 44032: 0xBC97, + 54221 - 44032: 0xBC98, + 54222 - 44032: 0xBC99, + 54223 - 44032: 0xBC9A, + 54224 - 44032: 0xC6F3, + 54225 - 44032: 0xBC9B, + 54226 - 44032: 0xBC9C, + 54227 - 44032: 0xBC9D, + 54228 - 44032: 0xBC9E, + 54229 - 44032: 0xBC9F, + 54230 - 44032: 0xBCA0, + 54231 - 44032: 0xBD41, + 54232 - 44032: 0xC6F4, + 54233 - 44032: 0xBD42, + 54234 - 44032: 0xBD43, + 54235 - 44032: 0xBD44, + 54236 - 44032: 0xBD45, + 54237 - 44032: 0xBD46, + 54238 - 44032: 0xBD47, + 54239 - 44032: 0xBD48, + 54240 - 44032: 0xBD49, + 54241 - 44032: 0xC6F5, + 54242 - 44032: 0xBD4A, + 54243 - 44032: 0xC6F6, + 54244 - 44032: 0xBD4B, + 54245 - 44032: 0xBD4C, + 54246 - 44032: 0xBD4D, + 54247 - 44032: 0xBD4E, + 54248 - 44032: 0xBD4F, + 54249 - 44032: 0xBD50, + 54250 - 44032: 0xBD51, + 54251 - 44032: 0xBD52, + 54252 - 44032: 0xC6F7, + 54253 - 44032: 0xC6F8, + 54254 - 44032: 0xBD53, + 54255 - 44032: 0xBD54, + 54256 - 44032: 0xC6F9, + 54257 - 44032: 0xBD55, + 54258 - 44032: 0xBD56, + 54259 - 44032: 0xBD57, + 54260 - 44032: 0xC6FA, + 54261 - 44032: 0xBD58, + 54262 - 44032: 0xBD59, + 54263 - 44032: 0xBD5A, + 54264 - 44032: 0xBD61, + 54265 - 44032: 0xBD62, + 54266 - 44032: 0xBD63, + 54267 - 44032: 0xBD64, + 54268 - 44032: 0xC6FB, + 54269 - 44032: 0xC6FC, + 54270 - 44032: 0xBD65, + 54271 - 44032: 0xC6FD, + 54272 - 44032: 0xBD66, + 54273 - 44032: 0xC6FE, + 54274 - 44032: 0xBD67, + 54275 - 44032: 0xBD68, + 54276 - 44032: 0xBD69, + 54277 - 44032: 0xBD6A, + 54278 - 44032: 0xBD6B, + 54279 - 44032: 0xBD6C, + 54280 - 44032: 0xC7A1, + 54281 - 44032: 0xBD6D, + 54282 - 44032: 0xBD6E, + 54283 - 44032: 0xBD6F, + 54284 - 44032: 0xBD70, + 54285 - 44032: 0xBD71, + 54286 - 44032: 0xBD72, + 54287 - 44032: 0xBD73, + 54288 - 44032: 0xBD74, + 54289 - 44032: 0xBD75, + 54290 - 44032: 0xBD76, + 54291 - 44032: 0xBD77, + 54292 - 44032: 0xBD78, + 54293 - 44032: 0xBD79, + 54294 - 44032: 0xBD7A, + 54295 - 44032: 0xBD81, + 54296 - 44032: 0xBD82, + 54297 - 44032: 0xBD83, + 54298 - 44032: 0xBD84, + 54299 - 44032: 0xBD85, + 54300 - 44032: 0xBD86, + 54301 - 44032: 0xC7A2, + 54302 - 44032: 0xBD87, + 54303 - 44032: 0xBD88, + 54304 - 44032: 0xBD89, + 54305 - 44032: 0xBD8A, + 54306 - 44032: 0xBD8B, + 54307 - 44032: 0xBD8C, + 54308 - 44032: 0xBD8D, + 54309 - 44032: 0xBD8E, + 54310 - 44032: 0xBD8F, + 54311 - 44032: 0xBD90, + 54312 - 44032: 0xBD91, + 54313 - 44032: 0xBD92, + 54314 - 44032: 0xBD93, + 54315 - 44032: 0xBD94, + 54316 - 44032: 0xBD95, + 54317 - 44032: 0xBD96, + 54318 - 44032: 0xBD97, + 54319 - 44032: 0xBD98, + 54320 - 44032: 0xBD99, + 54321 - 44032: 0xBD9A, + 54322 - 44032: 0xBD9B, + 54323 - 44032: 0xBD9C, + 54324 - 44032: 0xBD9D, + 54325 - 44032: 0xBD9E, + 54326 - 44032: 0xBD9F, + 54327 - 44032: 0xBDA0, + 54328 - 44032: 0xBE41, + 54329 - 44032: 0xBE42, + 54330 - 44032: 0xBE43, + 54331 - 44032: 0xBE44, + 54332 - 44032: 0xBE45, + 54333 - 44032: 0xBE46, + 54334 - 44032: 0xBE47, + 54335 - 44032: 0xBE48, + 54336 - 44032: 0xC7A3, + 54337 - 44032: 0xBE49, + 54338 - 44032: 0xBE4A, + 54339 - 44032: 0xBE4B, + 54340 - 44032: 0xC7A4, + 54341 - 44032: 0xBE4C, + 54342 - 44032: 0xBE4D, + 54343 - 44032: 0xBE4E, + 54344 - 44032: 0xBE4F, + 54345 - 44032: 0xBE50, + 54346 - 44032: 0xBE51, + 54347 - 44032: 0xBE52, + 54348 - 44032: 0xBE53, + 54349 - 44032: 0xBE54, + 54350 - 44032: 0xBE55, + 54351 - 44032: 0xBE56, + 54352 - 44032: 0xBE57, + 54353 - 44032: 0xBE58, + 54354 - 44032: 0xBE59, + 54355 - 44032: 0xBE5A, + 54356 - 44032: 0xBE61, + 54357 - 44032: 0xBE62, + 54358 - 44032: 0xBE63, + 54359 - 44032: 0xBE64, + 54360 - 44032: 0xBE65, + 54361 - 44032: 0xBE66, + 54362 - 44032: 0xBE67, + 54363 - 44032: 0xBE68, + 54364 - 44032: 0xC7A5, + 54365 - 44032: 0xBE69, + 54366 - 44032: 0xBE6A, + 54367 - 44032: 0xBE6B, + 54368 - 44032: 0xC7A6, + 54369 - 44032: 0xBE6C, + 54370 - 44032: 0xBE6D, + 54371 - 44032: 0xBE6E, + 54372 - 44032: 0xC7A7, + 54373 - 44032: 0xBE6F, + 54374 - 44032: 0xBE70, + 54375 - 44032: 0xBE71, + 54376 - 44032: 0xBE72, + 54377 - 44032: 0xBE73, + 54378 - 44032: 0xBE74, + 54379 - 44032: 0xBE75, + 54380 - 44032: 0xBE76, + 54381 - 44032: 0xC7A8, + 54382 - 44032: 0xBE77, + 54383 - 44032: 0xC7A9, + 54384 - 44032: 0xBE78, + 54385 - 44032: 0xBE79, + 54386 - 44032: 0xBE7A, + 54387 - 44032: 0xBE81, + 54388 - 44032: 0xBE82, + 54389 - 44032: 0xBE83, + 54390 - 44032: 0xBE84, + 54391 - 44032: 0xBE85, + 54392 - 44032: 0xC7AA, + 54393 - 44032: 0xC7AB, + 54394 - 44032: 0xBE86, + 54395 - 44032: 0xBE87, + 54396 - 44032: 0xC7AC, + 54397 - 44032: 0xBE88, + 54398 - 44032: 0xBE89, + 54399 - 44032: 0xC7AD, + 54400 - 44032: 0xC7AE, + 54401 - 44032: 0xBE8A, + 54402 - 44032: 0xC7AF, + 54403 - 44032: 0xBE8B, + 54404 - 44032: 0xBE8C, + 54405 - 44032: 0xBE8D, + 54406 - 44032: 0xBE8E, + 54407 - 44032: 0xBE8F, + 54408 - 44032: 0xC7B0, + 54409 - 44032: 0xC7B1, + 54410 - 44032: 0xBE90, + 54411 - 44032: 0xC7B2, + 54412 - 44032: 0xBE91, + 54413 - 44032: 0xC7B3, + 54414 - 44032: 0xBE92, + 54415 - 44032: 0xBE93, + 54416 - 44032: 0xBE94, + 54417 - 44032: 0xBE95, + 54418 - 44032: 0xBE96, + 54419 - 44032: 0xBE97, + 54420 - 44032: 0xC7B4, + 54421 - 44032: 0xBE98, + 54422 - 44032: 0xBE99, + 54423 - 44032: 0xBE9A, + 54424 - 44032: 0xBE9B, + 54425 - 44032: 0xBE9C, + 54426 - 44032: 0xBE9D, + 54427 - 44032: 0xBE9E, + 54428 - 44032: 0xBE9F, + 54429 - 44032: 0xBEA0, + 54430 - 44032: 0xBF41, + 54431 - 44032: 0xBF42, + 54432 - 44032: 0xBF43, + 54433 - 44032: 0xBF44, + 54434 - 44032: 0xBF45, + 54435 - 44032: 0xBF46, + 54436 - 44032: 0xBF47, + 54437 - 44032: 0xBF48, + 54438 - 44032: 0xBF49, + 54439 - 44032: 0xBF4A, + 54440 - 44032: 0xBF4B, + 54441 - 44032: 0xC7B5, + 54442 - 44032: 0xBF4C, + 54443 - 44032: 0xBF4D, + 54444 - 44032: 0xBF4E, + 54445 - 44032: 0xBF4F, + 54446 - 44032: 0xBF50, + 54447 - 44032: 0xBF51, + 54448 - 44032: 0xBF52, + 54449 - 44032: 0xBF53, + 54450 - 44032: 0xBF54, + 54451 - 44032: 0xBF55, + 54452 - 44032: 0xBF56, + 54453 - 44032: 0xBF57, + 54454 - 44032: 0xBF58, + 54455 - 44032: 0xBF59, + 54456 - 44032: 0xBF5A, + 54457 - 44032: 0xBF61, + 54458 - 44032: 0xBF62, + 54459 - 44032: 0xBF63, + 54460 - 44032: 0xBF64, + 54461 - 44032: 0xBF65, + 54462 - 44032: 0xBF66, + 54463 - 44032: 0xBF67, + 54464 - 44032: 0xBF68, + 54465 - 44032: 0xBF69, + 54466 - 44032: 0xBF6A, + 54467 - 44032: 0xBF6B, + 54468 - 44032: 0xBF6C, + 54469 - 44032: 0xBF6D, + 54470 - 44032: 0xBF6E, + 54471 - 44032: 0xBF6F, + 54472 - 44032: 0xBF70, + 54473 - 44032: 0xBF71, + 54474 - 44032: 0xBF72, + 54475 - 44032: 0xBF73, + 54476 - 44032: 0xC7B6, + 54477 - 44032: 0xBF74, + 54478 - 44032: 0xBF75, + 54479 - 44032: 0xBF76, + 54480 - 44032: 0xC7B7, + 54481 - 44032: 0xBF77, + 54482 - 44032: 0xBF78, + 54483 - 44032: 0xBF79, + 54484 - 44032: 0xC7B8, + 54485 - 44032: 0xBF7A, + 54486 - 44032: 0xBF81, + 54487 - 44032: 0xBF82, + 54488 - 44032: 0xBF83, + 54489 - 44032: 0xBF84, + 54490 - 44032: 0xBF85, + 54491 - 44032: 0xBF86, + 54492 - 44032: 0xC7B9, + 54493 - 44032: 0xBF87, + 54494 - 44032: 0xBF88, + 54495 - 44032: 0xC7BA, + 54496 - 44032: 0xBF89, + 54497 - 44032: 0xBF8A, + 54498 - 44032: 0xBF8B, + 54499 - 44032: 0xBF8C, + 54500 - 44032: 0xBF8D, + 54501 - 44032: 0xBF8E, + 54502 - 44032: 0xBF8F, + 54503 - 44032: 0xBF90, + 54504 - 44032: 0xC7BB, + 54505 - 44032: 0xBF91, + 54506 - 44032: 0xBF92, + 54507 - 44032: 0xBF93, + 54508 - 44032: 0xC7BC, + 54509 - 44032: 0xBF94, + 54510 - 44032: 0xBF95, + 54511 - 44032: 0xBF96, + 54512 - 44032: 0xC7BD, + 54513 - 44032: 0xBF97, + 54514 - 44032: 0xBF98, + 54515 - 44032: 0xBF99, + 54516 - 44032: 0xBF9A, + 54517 - 44032: 0xBF9B, + 54518 - 44032: 0xBF9C, + 54519 - 44032: 0xBF9D, + 54520 - 44032: 0xC7BE, + 54521 - 44032: 0xBF9E, + 54522 - 44032: 0xBF9F, + 54523 - 44032: 0xC7BF, + 54524 - 44032: 0xBFA0, + 54525 - 44032: 0xC7C0, + 54526 - 44032: 0xC041, + 54527 - 44032: 0xC042, + 54528 - 44032: 0xC043, + 54529 - 44032: 0xC044, + 54530 - 44032: 0xC045, + 54531 - 44032: 0xC046, + 54532 - 44032: 0xC7C1, + 54533 - 44032: 0xC047, + 54534 - 44032: 0xC048, + 54535 - 44032: 0xC049, + 54536 - 44032: 0xC7C2, + 54537 - 44032: 0xC04A, + 54538 - 44032: 0xC04B, + 54539 - 44032: 0xC04C, + 54540 - 44032: 0xC7C3, + 54541 - 44032: 0xC04D, + 54542 - 44032: 0xC04E, + 54543 - 44032: 0xC04F, + 54544 - 44032: 0xC050, + 54545 - 44032: 0xC051, + 54546 - 44032: 0xC052, + 54547 - 44032: 0xC053, + 54548 - 44032: 0xC7C4, + 54549 - 44032: 0xC7C5, + 54550 - 44032: 0xC054, + 54551 - 44032: 0xC7C6, + 54552 - 44032: 0xC055, + 54553 - 44032: 0xC056, + 54554 - 44032: 0xC057, + 54555 - 44032: 0xC058, + 54556 - 44032: 0xC059, + 54557 - 44032: 0xC05A, + 54558 - 44032: 0xC061, + 54559 - 44032: 0xC062, + 54560 - 44032: 0xC063, + 54561 - 44032: 0xC064, + 54562 - 44032: 0xC065, + 54563 - 44032: 0xC066, + 54564 - 44032: 0xC067, + 54565 - 44032: 0xC068, + 54566 - 44032: 0xC069, + 54567 - 44032: 0xC06A, + 54568 - 44032: 0xC06B, + 54569 - 44032: 0xC06C, + 54570 - 44032: 0xC06D, + 54571 - 44032: 0xC06E, + 54572 - 44032: 0xC06F, + 54573 - 44032: 0xC070, + 54574 - 44032: 0xC071, + 54575 - 44032: 0xC072, + 54576 - 44032: 0xC073, + 54577 - 44032: 0xC074, + 54578 - 44032: 0xC075, + 54579 - 44032: 0xC076, + 54580 - 44032: 0xC077, + 54581 - 44032: 0xC078, + 54582 - 44032: 0xC079, + 54583 - 44032: 0xC07A, + 54584 - 44032: 0xC081, + 54585 - 44032: 0xC082, + 54586 - 44032: 0xC083, + 54587 - 44032: 0xC084, + 54588 - 44032: 0xC7C7, + 54589 - 44032: 0xC7C8, + 54590 - 44032: 0xC085, + 54591 - 44032: 0xC086, + 54592 - 44032: 0xC7C9, + 54593 - 44032: 0xC087, + 54594 - 44032: 0xC088, + 54595 - 44032: 0xC089, + 54596 - 44032: 0xC7CA, + 54597 - 44032: 0xC08A, + 54598 - 44032: 0xC08B, + 54599 - 44032: 0xC08C, + 54600 - 44032: 0xC08D, + 54601 - 44032: 0xC08E, + 54602 - 44032: 0xC08F, + 54603 - 44032: 0xC090, + 54604 - 44032: 0xC7CB, + 54605 - 44032: 0xC7CC, + 54606 - 44032: 0xC091, + 54607 - 44032: 0xC7CD, + 54608 - 44032: 0xC092, + 54609 - 44032: 0xC7CE, + 54610 - 44032: 0xC093, + 54611 - 44032: 0xC094, + 54612 - 44032: 0xC095, + 54613 - 44032: 0xC096, + 54614 - 44032: 0xC097, + 54615 - 44032: 0xC098, + 54616 - 44032: 0xC7CF, + 54617 - 44032: 0xC7D0, + 54618 - 44032: 0xC099, + 54619 - 44032: 0xC09A, + 54620 - 44032: 0xC7D1, + 54621 - 44032: 0xC09B, + 54622 - 44032: 0xC09C, + 54623 - 44032: 0xC09D, + 54624 - 44032: 0xC7D2, + 54625 - 44032: 0xC09E, + 54626 - 44032: 0xC09F, + 54627 - 44032: 0xC0A0, + 54628 - 44032: 0xC141, + 54629 - 44032: 0xC7D3, + 54630 - 44032: 0xC142, + 54631 - 44032: 0xC143, + 54632 - 44032: 0xC7D4, + 54633 - 44032: 0xC7D5, + 54634 - 44032: 0xC144, + 54635 - 44032: 0xC7D6, + 54636 - 44032: 0xC145, + 54637 - 44032: 0xC7D7, + 54638 - 44032: 0xC146, + 54639 - 44032: 0xC147, + 54640 - 44032: 0xC148, + 54641 - 44032: 0xC149, + 54642 - 44032: 0xC14A, + 54643 - 44032: 0xC14B, + 54644 - 44032: 0xC7D8, + 54645 - 44032: 0xC7D9, + 54646 - 44032: 0xC14C, + 54647 - 44032: 0xC14D, + 54648 - 44032: 0xC7DA, + 54649 - 44032: 0xC14E, + 54650 - 44032: 0xC14F, + 54651 - 44032: 0xC150, + 54652 - 44032: 0xC7DB, + 54653 - 44032: 0xC151, + 54654 - 44032: 0xC152, + 54655 - 44032: 0xC153, + 54656 - 44032: 0xC154, + 54657 - 44032: 0xC155, + 54658 - 44032: 0xC156, + 54659 - 44032: 0xC157, + 54660 - 44032: 0xC7DC, + 54661 - 44032: 0xC7DD, + 54662 - 44032: 0xC158, + 54663 - 44032: 0xC7DE, + 54664 - 44032: 0xC7DF, + 54665 - 44032: 0xC7E0, + 54666 - 44032: 0xC159, + 54667 - 44032: 0xC15A, + 54668 - 44032: 0xC161, + 54669 - 44032: 0xC162, + 54670 - 44032: 0xC163, + 54671 - 44032: 0xC164, + 54672 - 44032: 0xC7E1, + 54673 - 44032: 0xC165, + 54674 - 44032: 0xC166, + 54675 - 44032: 0xC167, + 54676 - 44032: 0xC168, + 54677 - 44032: 0xC169, + 54678 - 44032: 0xC16A, + 54679 - 44032: 0xC16B, + 54680 - 44032: 0xC16C, + 54681 - 44032: 0xC16D, + 54682 - 44032: 0xC16E, + 54683 - 44032: 0xC16F, + 54684 - 44032: 0xC170, + 54685 - 44032: 0xC171, + 54686 - 44032: 0xC172, + 54687 - 44032: 0xC173, + 54688 - 44032: 0xC174, + 54689 - 44032: 0xC175, + 54690 - 44032: 0xC176, + 54691 - 44032: 0xC177, + 54692 - 44032: 0xC178, + 54693 - 44032: 0xC7E2, + 54694 - 44032: 0xC179, + 54695 - 44032: 0xC17A, + 54696 - 44032: 0xC181, + 54697 - 44032: 0xC182, + 54698 - 44032: 0xC183, + 54699 - 44032: 0xC184, + 54700 - 44032: 0xC185, + 54701 - 44032: 0xC186, + 54702 - 44032: 0xC187, + 54703 - 44032: 0xC188, + 54704 - 44032: 0xC189, + 54705 - 44032: 0xC18A, + 54706 - 44032: 0xC18B, + 54707 - 44032: 0xC18C, + 54708 - 44032: 0xC18D, + 54709 - 44032: 0xC18E, + 54710 - 44032: 0xC18F, + 54711 - 44032: 0xC190, + 54712 - 44032: 0xC191, + 54713 - 44032: 0xC192, + 54714 - 44032: 0xC193, + 54715 - 44032: 0xC194, + 54716 - 44032: 0xC195, + 54717 - 44032: 0xC196, + 54718 - 44032: 0xC197, + 54719 - 44032: 0xC198, + 54720 - 44032: 0xC199, + 54721 - 44032: 0xC19A, + 54722 - 44032: 0xC19B, + 54723 - 44032: 0xC19C, + 54724 - 44032: 0xC19D, + 54725 - 44032: 0xC19E, + 54726 - 44032: 0xC19F, + 54727 - 44032: 0xC1A0, + 54728 - 44032: 0xC7E3, + 54729 - 44032: 0xC7E4, + 54730 - 44032: 0xC241, + 54731 - 44032: 0xC242, + 54732 - 44032: 0xC7E5, + 54733 - 44032: 0xC243, + 54734 - 44032: 0xC244, + 54735 - 44032: 0xC245, + 54736 - 44032: 0xC7E6, + 54737 - 44032: 0xC246, + 54738 - 44032: 0xC7E7, + 54739 - 44032: 0xC247, + 54740 - 44032: 0xC248, + 54741 - 44032: 0xC249, + 54742 - 44032: 0xC24A, + 54743 - 44032: 0xC24B, + 54744 - 44032: 0xC7E8, + 54745 - 44032: 0xC7E9, + 54746 - 44032: 0xC24C, + 54747 - 44032: 0xC7EA, + 54748 - 44032: 0xC24D, + 54749 - 44032: 0xC7EB, + 54750 - 44032: 0xC24E, + 54751 - 44032: 0xC24F, + 54752 - 44032: 0xC250, + 54753 - 44032: 0xC251, + 54754 - 44032: 0xC252, + 54755 - 44032: 0xC253, + 54756 - 44032: 0xC7EC, + 54757 - 44032: 0xC7ED, + 54758 - 44032: 0xC254, + 54759 - 44032: 0xC255, + 54760 - 44032: 0xC7EE, + 54761 - 44032: 0xC256, + 54762 - 44032: 0xC257, + 54763 - 44032: 0xC258, + 54764 - 44032: 0xC7EF, + 54765 - 44032: 0xC259, + 54766 - 44032: 0xC25A, + 54767 - 44032: 0xC261, + 54768 - 44032: 0xC262, + 54769 - 44032: 0xC263, + 54770 - 44032: 0xC264, + 54771 - 44032: 0xC265, + 54772 - 44032: 0xC7F0, + 54773 - 44032: 0xC7F1, + 54774 - 44032: 0xC266, + 54775 - 44032: 0xC7F2, + 54776 - 44032: 0xC267, + 54777 - 44032: 0xC7F3, + 54778 - 44032: 0xC268, + 54779 - 44032: 0xC269, + 54780 - 44032: 0xC26A, + 54781 - 44032: 0xC26B, + 54782 - 44032: 0xC26C, + 54783 - 44032: 0xC26D, + 54784 - 44032: 0xC7F4, + 54785 - 44032: 0xC7F5, + 54786 - 44032: 0xC26E, + 54787 - 44032: 0xC26F, + 54788 - 44032: 0xC7F6, + 54789 - 44032: 0xC270, + 54790 - 44032: 0xC271, + 54791 - 44032: 0xC272, + 54792 - 44032: 0xC7F7, + 54793 - 44032: 0xC273, + 54794 - 44032: 0xC274, + 54795 - 44032: 0xC275, + 54796 - 44032: 0xC276, + 54797 - 44032: 0xC277, + 54798 - 44032: 0xC278, + 54799 - 44032: 0xC279, + 54800 - 44032: 0xC7F8, + 54801 - 44032: 0xC7F9, + 54802 - 44032: 0xC27A, + 54803 - 44032: 0xC7FA, + 54804 - 44032: 0xC7FB, + 54805 - 44032: 0xC7FC, + 54806 - 44032: 0xC281, + 54807 - 44032: 0xC282, + 54808 - 44032: 0xC283, + 54809 - 44032: 0xC284, + 54810 - 44032: 0xC285, + 54811 - 44032: 0xC286, + 54812 - 44032: 0xC7FD, + 54813 - 44032: 0xC287, + 54814 - 44032: 0xC288, + 54815 - 44032: 0xC289, + 54816 - 44032: 0xC7FE, + 54817 - 44032: 0xC28A, + 54818 - 44032: 0xC28B, + 54819 - 44032: 0xC28C, + 54820 - 44032: 0xC8A1, + 54821 - 44032: 0xC28D, + 54822 - 44032: 0xC28E, + 54823 - 44032: 0xC28F, + 54824 - 44032: 0xC290, + 54825 - 44032: 0xC291, + 54826 - 44032: 0xC292, + 54827 - 44032: 0xC293, + 54828 - 44032: 0xC294, + 54829 - 44032: 0xC8A2, + 54830 - 44032: 0xC295, + 54831 - 44032: 0xC296, + 54832 - 44032: 0xC297, + 54833 - 44032: 0xC298, + 54834 - 44032: 0xC299, + 54835 - 44032: 0xC29A, + 54836 - 44032: 0xC29B, + 54837 - 44032: 0xC29C, + 54838 - 44032: 0xC29D, + 54839 - 44032: 0xC29E, + 54840 - 44032: 0xC8A3, + 54841 - 44032: 0xC8A4, + 54842 - 44032: 0xC29F, + 54843 - 44032: 0xC2A0, + 54844 - 44032: 0xC8A5, + 54845 - 44032: 0xC341, + 54846 - 44032: 0xC342, + 54847 - 44032: 0xC343, + 54848 - 44032: 0xC8A6, + 54849 - 44032: 0xC344, + 54850 - 44032: 0xC345, + 54851 - 44032: 0xC346, + 54852 - 44032: 0xC347, + 54853 - 44032: 0xC8A7, + 54854 - 44032: 0xC348, + 54855 - 44032: 0xC349, + 54856 - 44032: 0xC8A8, + 54857 - 44032: 0xC8A9, + 54858 - 44032: 0xC34A, + 54859 - 44032: 0xC8AA, + 54860 - 44032: 0xC34B, + 54861 - 44032: 0xC8AB, + 54862 - 44032: 0xC34C, + 54863 - 44032: 0xC34D, + 54864 - 44032: 0xC34E, + 54865 - 44032: 0xC8AC, + 54866 - 44032: 0xC34F, + 54867 - 44032: 0xC350, + 54868 - 44032: 0xC8AD, + 54869 - 44032: 0xC8AE, + 54870 - 44032: 0xC351, + 54871 - 44032: 0xC352, + 54872 - 44032: 0xC8AF, + 54873 - 44032: 0xC353, + 54874 - 44032: 0xC354, + 54875 - 44032: 0xC355, + 54876 - 44032: 0xC8B0, + 54877 - 44032: 0xC356, + 54878 - 44032: 0xC357, + 54879 - 44032: 0xC358, + 54880 - 44032: 0xC359, + 54881 - 44032: 0xC35A, + 54882 - 44032: 0xC361, + 54883 - 44032: 0xC362, + 54884 - 44032: 0xC363, + 54885 - 44032: 0xC364, + 54886 - 44032: 0xC365, + 54887 - 44032: 0xC8B1, + 54888 - 44032: 0xC366, + 54889 - 44032: 0xC8B2, + 54890 - 44032: 0xC367, + 54891 - 44032: 0xC368, + 54892 - 44032: 0xC369, + 54893 - 44032: 0xC36A, + 54894 - 44032: 0xC36B, + 54895 - 44032: 0xC36C, + 54896 - 44032: 0xC8B3, + 54897 - 44032: 0xC8B4, + 54898 - 44032: 0xC36D, + 54899 - 44032: 0xC36E, + 54900 - 44032: 0xC8B5, + 54901 - 44032: 0xC36F, + 54902 - 44032: 0xC370, + 54903 - 44032: 0xC371, + 54904 - 44032: 0xC372, + 54905 - 44032: 0xC373, + 54906 - 44032: 0xC374, + 54907 - 44032: 0xC375, + 54908 - 44032: 0xC376, + 54909 - 44032: 0xC377, + 54910 - 44032: 0xC378, + 54911 - 44032: 0xC379, + 54912 - 44032: 0xC37A, + 54913 - 44032: 0xC381, + 54914 - 44032: 0xC382, + 54915 - 44032: 0xC8B6, + 54916 - 44032: 0xC383, + 54917 - 44032: 0xC8B7, + 54918 - 44032: 0xC384, + 54919 - 44032: 0xC385, + 54920 - 44032: 0xC386, + 54921 - 44032: 0xC387, + 54922 - 44032: 0xC388, + 54923 - 44032: 0xC389, + 54924 - 44032: 0xC8B8, + 54925 - 44032: 0xC8B9, + 54926 - 44032: 0xC38A, + 54927 - 44032: 0xC38B, + 54928 - 44032: 0xC8BA, + 54929 - 44032: 0xC38C, + 54930 - 44032: 0xC38D, + 54931 - 44032: 0xC38E, + 54932 - 44032: 0xC8BB, + 54933 - 44032: 0xC38F, + 54934 - 44032: 0xC390, + 54935 - 44032: 0xC391, + 54936 - 44032: 0xC392, + 54937 - 44032: 0xC393, + 54938 - 44032: 0xC394, + 54939 - 44032: 0xC395, + 54940 - 44032: 0xC396, + 54941 - 44032: 0xC8BC, + 54942 - 44032: 0xC397, + 54943 - 44032: 0xC8BD, + 54944 - 44032: 0xC398, + 54945 - 44032: 0xC8BE, + 54946 - 44032: 0xC399, + 54947 - 44032: 0xC39A, + 54948 - 44032: 0xC39B, + 54949 - 44032: 0xC39C, + 54950 - 44032: 0xC39D, + 54951 - 44032: 0xC39E, + 54952 - 44032: 0xC8BF, + 54953 - 44032: 0xC39F, + 54954 - 44032: 0xC3A0, + 54955 - 44032: 0xC441, + 54956 - 44032: 0xC8C0, + 54957 - 44032: 0xC442, + 54958 - 44032: 0xC443, + 54959 - 44032: 0xC444, + 54960 - 44032: 0xC8C1, + 54961 - 44032: 0xC445, + 54962 - 44032: 0xC446, + 54963 - 44032: 0xC447, + 54964 - 44032: 0xC448, + 54965 - 44032: 0xC449, + 54966 - 44032: 0xC44A, + 54967 - 44032: 0xC44B, + 54968 - 44032: 0xC44C, + 54969 - 44032: 0xC8C2, + 54970 - 44032: 0xC44D, + 54971 - 44032: 0xC8C3, + 54972 - 44032: 0xC44E, + 54973 - 44032: 0xC44F, + 54974 - 44032: 0xC450, + 54975 - 44032: 0xC451, + 54976 - 44032: 0xC452, + 54977 - 44032: 0xC453, + 54978 - 44032: 0xC454, + 54979 - 44032: 0xC455, + 54980 - 44032: 0xC8C4, + 54981 - 44032: 0xC8C5, + 54982 - 44032: 0xC456, + 54983 - 44032: 0xC457, + 54984 - 44032: 0xC8C6, + 54985 - 44032: 0xC458, + 54986 - 44032: 0xC459, + 54987 - 44032: 0xC45A, + 54988 - 44032: 0xC8C7, + 54989 - 44032: 0xC461, + 54990 - 44032: 0xC462, + 54991 - 44032: 0xC463, + 54992 - 44032: 0xC464, + 54993 - 44032: 0xC8C8, + 54994 - 44032: 0xC465, + 54995 - 44032: 0xC466, + 54996 - 44032: 0xC8C9, + 54997 - 44032: 0xC467, + 54998 - 44032: 0xC468, + 54999 - 44032: 0xC8CA, + 55000 - 44032: 0xC469, + 55001 - 44032: 0xC8CB, + 55002 - 44032: 0xC46A, + 55003 - 44032: 0xC46B, + 55004 - 44032: 0xC46C, + 55005 - 44032: 0xC46D, + 55006 - 44032: 0xC46E, + 55007 - 44032: 0xC46F, + 55008 - 44032: 0xC8CC, + 55009 - 44032: 0xC470, + 55010 - 44032: 0xC471, + 55011 - 44032: 0xC472, + 55012 - 44032: 0xC8CD, + 55013 - 44032: 0xC473, + 55014 - 44032: 0xC474, + 55015 - 44032: 0xC475, + 55016 - 44032: 0xC8CE, + 55017 - 44032: 0xC476, + 55018 - 44032: 0xC477, + 55019 - 44032: 0xC478, + 55020 - 44032: 0xC479, + 55021 - 44032: 0xC47A, + 55022 - 44032: 0xC481, + 55023 - 44032: 0xC482, + 55024 - 44032: 0xC8CF, + 55025 - 44032: 0xC483, + 55026 - 44032: 0xC484, + 55027 - 44032: 0xC485, + 55028 - 44032: 0xC486, + 55029 - 44032: 0xC8D0, + 55030 - 44032: 0xC487, + 55031 - 44032: 0xC488, + 55032 - 44032: 0xC489, + 55033 - 44032: 0xC48A, + 55034 - 44032: 0xC48B, + 55035 - 44032: 0xC48C, + 55036 - 44032: 0xC8D1, + 55037 - 44032: 0xC8D2, + 55038 - 44032: 0xC48D, + 55039 - 44032: 0xC48E, + 55040 - 44032: 0xC8D3, + 55041 - 44032: 0xC48F, + 55042 - 44032: 0xC490, + 55043 - 44032: 0xC491, + 55044 - 44032: 0xC8D4, + 55045 - 44032: 0xC492, + 55046 - 44032: 0xC493, + 55047 - 44032: 0xC494, + 55048 - 44032: 0xC495, + 55049 - 44032: 0xC496, + 55050 - 44032: 0xC497, + 55051 - 44032: 0xC498, + 55052 - 44032: 0xC499, + 55053 - 44032: 0xC49A, + 55054 - 44032: 0xC49B, + 55055 - 44032: 0xC49C, + 55056 - 44032: 0xC49D, + 55057 - 44032: 0xC8D5, + 55058 - 44032: 0xC49E, + 55059 - 44032: 0xC49F, + 55060 - 44032: 0xC4A0, + 55061 - 44032: 0xC541, + 55062 - 44032: 0xC542, + 55063 - 44032: 0xC543, + 55064 - 44032: 0xC8D6, + 55065 - 44032: 0xC8D7, + 55066 - 44032: 0xC544, + 55067 - 44032: 0xC545, + 55068 - 44032: 0xC8D8, + 55069 - 44032: 0xC546, + 55070 - 44032: 0xC547, + 55071 - 44032: 0xC548, + 55072 - 44032: 0xC8D9, + 55073 - 44032: 0xC549, + 55074 - 44032: 0xC54A, + 55075 - 44032: 0xC54B, + 55076 - 44032: 0xC54C, + 55077 - 44032: 0xC54D, + 55078 - 44032: 0xC54E, + 55079 - 44032: 0xC54F, + 55080 - 44032: 0xC8DA, + 55081 - 44032: 0xC8DB, + 55082 - 44032: 0xC550, + 55083 - 44032: 0xC8DC, + 55084 - 44032: 0xC551, + 55085 - 44032: 0xC8DD, + 55086 - 44032: 0xC552, + 55087 - 44032: 0xC553, + 55088 - 44032: 0xC554, + 55089 - 44032: 0xC555, + 55090 - 44032: 0xC556, + 55091 - 44032: 0xC557, + 55092 - 44032: 0xC8DE, + 55093 - 44032: 0xC8DF, + 55094 - 44032: 0xC558, + 55095 - 44032: 0xC559, + 55096 - 44032: 0xC8E0, + 55097 - 44032: 0xC55A, + 55098 - 44032: 0xC561, + 55099 - 44032: 0xC562, + 55100 - 44032: 0xC8E1, + 55101 - 44032: 0xC563, + 55102 - 44032: 0xC564, + 55103 - 44032: 0xC565, + 55104 - 44032: 0xC566, + 55105 - 44032: 0xC567, + 55106 - 44032: 0xC568, + 55107 - 44032: 0xC569, + 55108 - 44032: 0xC8E2, + 55109 - 44032: 0xC56A, + 55110 - 44032: 0xC56B, + 55111 - 44032: 0xC8E3, + 55112 - 44032: 0xC56C, + 55113 - 44032: 0xC8E4, + 55114 - 44032: 0xC56D, + 55115 - 44032: 0xC56E, + 55116 - 44032: 0xC56F, + 55117 - 44032: 0xC570, + 55118 - 44032: 0xC571, + 55119 - 44032: 0xC572, + 55120 - 44032: 0xC8E5, + 55121 - 44032: 0xC8E6, + 55122 - 44032: 0xC573, + 55123 - 44032: 0xC574, + 55124 - 44032: 0xC8E7, + 55125 - 44032: 0xC575, + 55126 - 44032: 0xC8E8, + 55127 - 44032: 0xC8E9, + 55128 - 44032: 0xC8EA, + 55129 - 44032: 0xC8EB, + 55130 - 44032: 0xC576, + 55131 - 44032: 0xC577, + 55132 - 44032: 0xC578, + 55133 - 44032: 0xC579, + 55134 - 44032: 0xC57A, + 55135 - 44032: 0xC581, + 55136 - 44032: 0xC8EC, + 55137 - 44032: 0xC8ED, + 55138 - 44032: 0xC582, + 55139 - 44032: 0xC8EE, + 55140 - 44032: 0xC583, + 55141 - 44032: 0xC8EF, + 55142 - 44032: 0xC584, + 55143 - 44032: 0xC585, + 55144 - 44032: 0xC586, + 55145 - 44032: 0xC8F0, + 55146 - 44032: 0xC587, + 55147 - 44032: 0xC588, + 55148 - 44032: 0xC8F1, + 55149 - 44032: 0xC589, + 55150 - 44032: 0xC58A, + 55151 - 44032: 0xC58B, + 55152 - 44032: 0xC8F2, + 55153 - 44032: 0xC58C, + 55154 - 44032: 0xC58D, + 55155 - 44032: 0xC58E, + 55156 - 44032: 0xC8F3, + 55157 - 44032: 0xC58F, + 55158 - 44032: 0xC590, + 55159 - 44032: 0xC591, + 55160 - 44032: 0xC592, + 55161 - 44032: 0xC593, + 55162 - 44032: 0xC594, + 55163 - 44032: 0xC595, + 55164 - 44032: 0xC8F4, + 55165 - 44032: 0xC8F5, + 55166 - 44032: 0xC596, + 55167 - 44032: 0xC597, + 55168 - 44032: 0xC598, + 55169 - 44032: 0xC8F6, + 55170 - 44032: 0xC599, + 55171 - 44032: 0xC59A, + 55172 - 44032: 0xC59B, + 55173 - 44032: 0xC59C, + 55174 - 44032: 0xC59D, + 55175 - 44032: 0xC59E, + 55176 - 44032: 0xC8F7, + 55177 - 44032: 0xC8F8, + 55178 - 44032: 0xC59F, + 55179 - 44032: 0xC5A0, + 55180 - 44032: 0xC8F9, + 55181 - 44032: 0xC641, + 55182 - 44032: 0xC642, + 55183 - 44032: 0xC643, + 55184 - 44032: 0xC8FA, + 55185 - 44032: 0xC644, + 55186 - 44032: 0xC645, + 55187 - 44032: 0xC646, + 55188 - 44032: 0xC647, + 55189 - 44032: 0xC648, + 55190 - 44032: 0xC649, + 55191 - 44032: 0xC64A, + 55192 - 44032: 0xC8FB, + 55193 - 44032: 0xC8FC, + 55194 - 44032: 0xC64B, + 55195 - 44032: 0xC8FD, + 55196 - 44032: 0xC64C, + 55197 - 44032: 0xC8FE, + 55198 - 44032: 0xC64D, + 55199 - 44032: 0xC64E, + 55200 - 44032: 0xC64F, + 55201 - 44032: 0xC650, + 55202 - 44032: 0xC651, + 55203 - 44032: 0xC652, +} + +const encode2Low, encode2High = 8213, 9838 + +var encode2 = [...]uint16{ + 8213 - 8213: 0xA1AA, + 8216 - 8213: 0xA1AE, + 8217 - 8213: 0xA1AF, + 8220 - 8213: 0xA1B0, + 8221 - 8213: 0xA1B1, + 8224 - 8213: 0xA2D3, + 8225 - 8213: 0xA2D4, + 8229 - 8213: 0xA1A5, + 8230 - 8213: 0xA1A6, + 8240 - 8213: 0xA2B6, + 8242 - 8213: 0xA1C7, + 8243 - 8213: 0xA1C8, + 8251 - 8213: 0xA1D8, + 8308 - 8213: 0xA9F9, + 8319 - 8213: 0xA9FA, + 8321 - 8213: 0xA9FB, + 8322 - 8213: 0xA9FC, + 8323 - 8213: 0xA9FD, + 8324 - 8213: 0xA9FE, + 8364 - 8213: 0xA2E6, + 8451 - 8213: 0xA1C9, + 8457 - 8213: 0xA2B5, + 8467 - 8213: 0xA7A4, + 8470 - 8213: 0xA2E0, + 8481 - 8213: 0xA2E5, + 8482 - 8213: 0xA2E2, + 8486 - 8213: 0xA7D9, + 8491 - 8213: 0xA1CA, + 8531 - 8213: 0xA8F7, + 8532 - 8213: 0xA8F8, + 8539 - 8213: 0xA8FB, + 8540 - 8213: 0xA8FC, + 8541 - 8213: 0xA8FD, + 8542 - 8213: 0xA8FE, + 8544 - 8213: 0xA5B0, + 8545 - 8213: 0xA5B1, + 8546 - 8213: 0xA5B2, + 8547 - 8213: 0xA5B3, + 8548 - 8213: 0xA5B4, + 8549 - 8213: 0xA5B5, + 8550 - 8213: 0xA5B6, + 8551 - 8213: 0xA5B7, + 8552 - 8213: 0xA5B8, + 8553 - 8213: 0xA5B9, + 8560 - 8213: 0xA5A1, + 8561 - 8213: 0xA5A2, + 8562 - 8213: 0xA5A3, + 8563 - 8213: 0xA5A4, + 8564 - 8213: 0xA5A5, + 8565 - 8213: 0xA5A6, + 8566 - 8213: 0xA5A7, + 8567 - 8213: 0xA5A8, + 8568 - 8213: 0xA5A9, + 8569 - 8213: 0xA5AA, + 8592 - 8213: 0xA1E7, + 8593 - 8213: 0xA1E8, + 8594 - 8213: 0xA1E6, + 8595 - 8213: 0xA1E9, + 8596 - 8213: 0xA1EA, + 8597 - 8213: 0xA2D5, + 8598 - 8213: 0xA2D8, + 8599 - 8213: 0xA2D6, + 8600 - 8213: 0xA2D9, + 8601 - 8213: 0xA2D7, + 8658 - 8213: 0xA2A1, + 8660 - 8213: 0xA2A2, + 8704 - 8213: 0xA2A3, + 8706 - 8213: 0xA1D3, + 8707 - 8213: 0xA2A4, + 8711 - 8213: 0xA1D4, + 8712 - 8213: 0xA1F4, + 8715 - 8213: 0xA1F5, + 8719 - 8213: 0xA2B3, + 8721 - 8213: 0xA2B2, + 8730 - 8213: 0xA1EE, + 8733 - 8213: 0xA1F0, + 8734 - 8213: 0xA1C4, + 8736 - 8213: 0xA1D0, + 8741 - 8213: 0xA1AB, + 8743 - 8213: 0xA1FC, + 8744 - 8213: 0xA1FD, + 8745 - 8213: 0xA1FB, + 8746 - 8213: 0xA1FA, + 8747 - 8213: 0xA1F2, + 8748 - 8213: 0xA1F3, + 8750 - 8213: 0xA2B1, + 8756 - 8213: 0xA1C5, + 8757 - 8213: 0xA1F1, + 8764 - 8213: 0xA1AD, + 8765 - 8213: 0xA1EF, + 8786 - 8213: 0xA1D6, + 8800 - 8213: 0xA1C1, + 8801 - 8213: 0xA1D5, + 8804 - 8213: 0xA1C2, + 8805 - 8213: 0xA1C3, + 8810 - 8213: 0xA1EC, + 8811 - 8213: 0xA1ED, + 8834 - 8213: 0xA1F8, + 8835 - 8213: 0xA1F9, + 8838 - 8213: 0xA1F6, + 8839 - 8213: 0xA1F7, + 8857 - 8213: 0xA2C1, + 8869 - 8213: 0xA1D1, + 8978 - 8213: 0xA1D2, + 9312 - 8213: 0xA8E7, + 9313 - 8213: 0xA8E8, + 9314 - 8213: 0xA8E9, + 9315 - 8213: 0xA8EA, + 9316 - 8213: 0xA8EB, + 9317 - 8213: 0xA8EC, + 9318 - 8213: 0xA8ED, + 9319 - 8213: 0xA8EE, + 9320 - 8213: 0xA8EF, + 9321 - 8213: 0xA8F0, + 9322 - 8213: 0xA8F1, + 9323 - 8213: 0xA8F2, + 9324 - 8213: 0xA8F3, + 9325 - 8213: 0xA8F4, + 9326 - 8213: 0xA8F5, + 9332 - 8213: 0xA9E7, + 9333 - 8213: 0xA9E8, + 9334 - 8213: 0xA9E9, + 9335 - 8213: 0xA9EA, + 9336 - 8213: 0xA9EB, + 9337 - 8213: 0xA9EC, + 9338 - 8213: 0xA9ED, + 9339 - 8213: 0xA9EE, + 9340 - 8213: 0xA9EF, + 9341 - 8213: 0xA9F0, + 9342 - 8213: 0xA9F1, + 9343 - 8213: 0xA9F2, + 9344 - 8213: 0xA9F3, + 9345 - 8213: 0xA9F4, + 9346 - 8213: 0xA9F5, + 9372 - 8213: 0xA9CD, + 9373 - 8213: 0xA9CE, + 9374 - 8213: 0xA9CF, + 9375 - 8213: 0xA9D0, + 9376 - 8213: 0xA9D1, + 9377 - 8213: 0xA9D2, + 9378 - 8213: 0xA9D3, + 9379 - 8213: 0xA9D4, + 9380 - 8213: 0xA9D5, + 9381 - 8213: 0xA9D6, + 9382 - 8213: 0xA9D7, + 9383 - 8213: 0xA9D8, + 9384 - 8213: 0xA9D9, + 9385 - 8213: 0xA9DA, + 9386 - 8213: 0xA9DB, + 9387 - 8213: 0xA9DC, + 9388 - 8213: 0xA9DD, + 9389 - 8213: 0xA9DE, + 9390 - 8213: 0xA9DF, + 9391 - 8213: 0xA9E0, + 9392 - 8213: 0xA9E1, + 9393 - 8213: 0xA9E2, + 9394 - 8213: 0xA9E3, + 9395 - 8213: 0xA9E4, + 9396 - 8213: 0xA9E5, + 9397 - 8213: 0xA9E6, + 9424 - 8213: 0xA8CD, + 9425 - 8213: 0xA8CE, + 9426 - 8213: 0xA8CF, + 9427 - 8213: 0xA8D0, + 9428 - 8213: 0xA8D1, + 9429 - 8213: 0xA8D2, + 9430 - 8213: 0xA8D3, + 9431 - 8213: 0xA8D4, + 9432 - 8213: 0xA8D5, + 9433 - 8213: 0xA8D6, + 9434 - 8213: 0xA8D7, + 9435 - 8213: 0xA8D8, + 9436 - 8213: 0xA8D9, + 9437 - 8213: 0xA8DA, + 9438 - 8213: 0xA8DB, + 9439 - 8213: 0xA8DC, + 9440 - 8213: 0xA8DD, + 9441 - 8213: 0xA8DE, + 9442 - 8213: 0xA8DF, + 9443 - 8213: 0xA8E0, + 9444 - 8213: 0xA8E1, + 9445 - 8213: 0xA8E2, + 9446 - 8213: 0xA8E3, + 9447 - 8213: 0xA8E4, + 9448 - 8213: 0xA8E5, + 9449 - 8213: 0xA8E6, + 9472 - 8213: 0xA6A1, + 9473 - 8213: 0xA6AC, + 9474 - 8213: 0xA6A2, + 9475 - 8213: 0xA6AD, + 9484 - 8213: 0xA6A3, + 9485 - 8213: 0xA6C8, + 9486 - 8213: 0xA6C7, + 9487 - 8213: 0xA6AE, + 9488 - 8213: 0xA6A4, + 9489 - 8213: 0xA6C2, + 9490 - 8213: 0xA6C1, + 9491 - 8213: 0xA6AF, + 9492 - 8213: 0xA6A6, + 9493 - 8213: 0xA6C6, + 9494 - 8213: 0xA6C5, + 9495 - 8213: 0xA6B1, + 9496 - 8213: 0xA6A5, + 9497 - 8213: 0xA6C4, + 9498 - 8213: 0xA6C3, + 9499 - 8213: 0xA6B0, + 9500 - 8213: 0xA6A7, + 9501 - 8213: 0xA6BC, + 9502 - 8213: 0xA6C9, + 9503 - 8213: 0xA6CA, + 9504 - 8213: 0xA6B7, + 9505 - 8213: 0xA6CB, + 9506 - 8213: 0xA6CC, + 9507 - 8213: 0xA6B2, + 9508 - 8213: 0xA6A9, + 9509 - 8213: 0xA6BE, + 9510 - 8213: 0xA6CD, + 9511 - 8213: 0xA6CE, + 9512 - 8213: 0xA6B9, + 9513 - 8213: 0xA6CF, + 9514 - 8213: 0xA6D0, + 9515 - 8213: 0xA6B4, + 9516 - 8213: 0xA6A8, + 9517 - 8213: 0xA6D1, + 9518 - 8213: 0xA6D2, + 9519 - 8213: 0xA6B8, + 9520 - 8213: 0xA6BD, + 9521 - 8213: 0xA6D3, + 9522 - 8213: 0xA6D4, + 9523 - 8213: 0xA6B3, + 9524 - 8213: 0xA6AA, + 9525 - 8213: 0xA6D5, + 9526 - 8213: 0xA6D6, + 9527 - 8213: 0xA6BA, + 9528 - 8213: 0xA6BF, + 9529 - 8213: 0xA6D7, + 9530 - 8213: 0xA6D8, + 9531 - 8213: 0xA6B5, + 9532 - 8213: 0xA6AB, + 9533 - 8213: 0xA6D9, + 9534 - 8213: 0xA6DA, + 9535 - 8213: 0xA6BB, + 9536 - 8213: 0xA6DB, + 9537 - 8213: 0xA6DC, + 9538 - 8213: 0xA6C0, + 9539 - 8213: 0xA6DD, + 9540 - 8213: 0xA6DE, + 9541 - 8213: 0xA6DF, + 9542 - 8213: 0xA6E0, + 9543 - 8213: 0xA6E1, + 9544 - 8213: 0xA6E2, + 9545 - 8213: 0xA6E3, + 9546 - 8213: 0xA6E4, + 9547 - 8213: 0xA6B6, + 9618 - 8213: 0xA2C6, + 9632 - 8213: 0xA1E1, + 9633 - 8213: 0xA1E0, + 9635 - 8213: 0xA2C3, + 9636 - 8213: 0xA2C7, + 9637 - 8213: 0xA2C8, + 9638 - 8213: 0xA2CB, + 9639 - 8213: 0xA2CA, + 9640 - 8213: 0xA2C9, + 9641 - 8213: 0xA2CC, + 9650 - 8213: 0xA1E3, + 9651 - 8213: 0xA1E2, + 9654 - 8213: 0xA2BA, + 9655 - 8213: 0xA2B9, + 9660 - 8213: 0xA1E5, + 9661 - 8213: 0xA1E4, + 9664 - 8213: 0xA2B8, + 9665 - 8213: 0xA2B7, + 9670 - 8213: 0xA1DF, + 9671 - 8213: 0xA1DE, + 9672 - 8213: 0xA2C2, + 9675 - 8213: 0xA1DB, + 9678 - 8213: 0xA1DD, + 9679 - 8213: 0xA1DC, + 9680 - 8213: 0xA2C4, + 9681 - 8213: 0xA2C5, + 9733 - 8213: 0xA1DA, + 9734 - 8213: 0xA1D9, + 9742 - 8213: 0xA2CF, + 9743 - 8213: 0xA2CE, + 9756 - 8213: 0xA2D0, + 9758 - 8213: 0xA2D1, + 9792 - 8213: 0xA1CF, + 9794 - 8213: 0xA1CE, + 9824 - 8213: 0xA2BC, + 9825 - 8213: 0xA2BD, + 9827 - 8213: 0xA2C0, + 9828 - 8213: 0xA2BB, + 9829 - 8213: 0xA2BE, + 9831 - 8213: 0xA2BF, + 9832 - 8213: 0xA2CD, + 9833 - 8213: 0xA2DB, + 9834 - 8213: 0xA2DC, + 9836 - 8213: 0xA2DD, + 9837 - 8213: 0xA2DA, +} + +const encode3Low, encode3High = 12288, 13278 + +var encode3 = [...]uint16{ + 12288 - 12288: 0xA1A1, + 12289 - 12288: 0xA1A2, + 12290 - 12288: 0xA1A3, + 12291 - 12288: 0xA1A8, + 12296 - 12288: 0xA1B4, + 12297 - 12288: 0xA1B5, + 12298 - 12288: 0xA1B6, + 12299 - 12288: 0xA1B7, + 12300 - 12288: 0xA1B8, + 12301 - 12288: 0xA1B9, + 12302 - 12288: 0xA1BA, + 12303 - 12288: 0xA1BB, + 12304 - 12288: 0xA1BC, + 12305 - 12288: 0xA1BD, + 12307 - 12288: 0xA1EB, + 12308 - 12288: 0xA1B2, + 12309 - 12288: 0xA1B3, + 12353 - 12288: 0xAAA1, + 12354 - 12288: 0xAAA2, + 12355 - 12288: 0xAAA3, + 12356 - 12288: 0xAAA4, + 12357 - 12288: 0xAAA5, + 12358 - 12288: 0xAAA6, + 12359 - 12288: 0xAAA7, + 12360 - 12288: 0xAAA8, + 12361 - 12288: 0xAAA9, + 12362 - 12288: 0xAAAA, + 12363 - 12288: 0xAAAB, + 12364 - 12288: 0xAAAC, + 12365 - 12288: 0xAAAD, + 12366 - 12288: 0xAAAE, + 12367 - 12288: 0xAAAF, + 12368 - 12288: 0xAAB0, + 12369 - 12288: 0xAAB1, + 12370 - 12288: 0xAAB2, + 12371 - 12288: 0xAAB3, + 12372 - 12288: 0xAAB4, + 12373 - 12288: 0xAAB5, + 12374 - 12288: 0xAAB6, + 12375 - 12288: 0xAAB7, + 12376 - 12288: 0xAAB8, + 12377 - 12288: 0xAAB9, + 12378 - 12288: 0xAABA, + 12379 - 12288: 0xAABB, + 12380 - 12288: 0xAABC, + 12381 - 12288: 0xAABD, + 12382 - 12288: 0xAABE, + 12383 - 12288: 0xAABF, + 12384 - 12288: 0xAAC0, + 12385 - 12288: 0xAAC1, + 12386 - 12288: 0xAAC2, + 12387 - 12288: 0xAAC3, + 12388 - 12288: 0xAAC4, + 12389 - 12288: 0xAAC5, + 12390 - 12288: 0xAAC6, + 12391 - 12288: 0xAAC7, + 12392 - 12288: 0xAAC8, + 12393 - 12288: 0xAAC9, + 12394 - 12288: 0xAACA, + 12395 - 12288: 0xAACB, + 12396 - 12288: 0xAACC, + 12397 - 12288: 0xAACD, + 12398 - 12288: 0xAACE, + 12399 - 12288: 0xAACF, + 12400 - 12288: 0xAAD0, + 12401 - 12288: 0xAAD1, + 12402 - 12288: 0xAAD2, + 12403 - 12288: 0xAAD3, + 12404 - 12288: 0xAAD4, + 12405 - 12288: 0xAAD5, + 12406 - 12288: 0xAAD6, + 12407 - 12288: 0xAAD7, + 12408 - 12288: 0xAAD8, + 12409 - 12288: 0xAAD9, + 12410 - 12288: 0xAADA, + 12411 - 12288: 0xAADB, + 12412 - 12288: 0xAADC, + 12413 - 12288: 0xAADD, + 12414 - 12288: 0xAADE, + 12415 - 12288: 0xAADF, + 12416 - 12288: 0xAAE0, + 12417 - 12288: 0xAAE1, + 12418 - 12288: 0xAAE2, + 12419 - 12288: 0xAAE3, + 12420 - 12288: 0xAAE4, + 12421 - 12288: 0xAAE5, + 12422 - 12288: 0xAAE6, + 12423 - 12288: 0xAAE7, + 12424 - 12288: 0xAAE8, + 12425 - 12288: 0xAAE9, + 12426 - 12288: 0xAAEA, + 12427 - 12288: 0xAAEB, + 12428 - 12288: 0xAAEC, + 12429 - 12288: 0xAAED, + 12430 - 12288: 0xAAEE, + 12431 - 12288: 0xAAEF, + 12432 - 12288: 0xAAF0, + 12433 - 12288: 0xAAF1, + 12434 - 12288: 0xAAF2, + 12435 - 12288: 0xAAF3, + 12449 - 12288: 0xABA1, + 12450 - 12288: 0xABA2, + 12451 - 12288: 0xABA3, + 12452 - 12288: 0xABA4, + 12453 - 12288: 0xABA5, + 12454 - 12288: 0xABA6, + 12455 - 12288: 0xABA7, + 12456 - 12288: 0xABA8, + 12457 - 12288: 0xABA9, + 12458 - 12288: 0xABAA, + 12459 - 12288: 0xABAB, + 12460 - 12288: 0xABAC, + 12461 - 12288: 0xABAD, + 12462 - 12288: 0xABAE, + 12463 - 12288: 0xABAF, + 12464 - 12288: 0xABB0, + 12465 - 12288: 0xABB1, + 12466 - 12288: 0xABB2, + 12467 - 12288: 0xABB3, + 12468 - 12288: 0xABB4, + 12469 - 12288: 0xABB5, + 12470 - 12288: 0xABB6, + 12471 - 12288: 0xABB7, + 12472 - 12288: 0xABB8, + 12473 - 12288: 0xABB9, + 12474 - 12288: 0xABBA, + 12475 - 12288: 0xABBB, + 12476 - 12288: 0xABBC, + 12477 - 12288: 0xABBD, + 12478 - 12288: 0xABBE, + 12479 - 12288: 0xABBF, + 12480 - 12288: 0xABC0, + 12481 - 12288: 0xABC1, + 12482 - 12288: 0xABC2, + 12483 - 12288: 0xABC3, + 12484 - 12288: 0xABC4, + 12485 - 12288: 0xABC5, + 12486 - 12288: 0xABC6, + 12487 - 12288: 0xABC7, + 12488 - 12288: 0xABC8, + 12489 - 12288: 0xABC9, + 12490 - 12288: 0xABCA, + 12491 - 12288: 0xABCB, + 12492 - 12288: 0xABCC, + 12493 - 12288: 0xABCD, + 12494 - 12288: 0xABCE, + 12495 - 12288: 0xABCF, + 12496 - 12288: 0xABD0, + 12497 - 12288: 0xABD1, + 12498 - 12288: 0xABD2, + 12499 - 12288: 0xABD3, + 12500 - 12288: 0xABD4, + 12501 - 12288: 0xABD5, + 12502 - 12288: 0xABD6, + 12503 - 12288: 0xABD7, + 12504 - 12288: 0xABD8, + 12505 - 12288: 0xABD9, + 12506 - 12288: 0xABDA, + 12507 - 12288: 0xABDB, + 12508 - 12288: 0xABDC, + 12509 - 12288: 0xABDD, + 12510 - 12288: 0xABDE, + 12511 - 12288: 0xABDF, + 12512 - 12288: 0xABE0, + 12513 - 12288: 0xABE1, + 12514 - 12288: 0xABE2, + 12515 - 12288: 0xABE3, + 12516 - 12288: 0xABE4, + 12517 - 12288: 0xABE5, + 12518 - 12288: 0xABE6, + 12519 - 12288: 0xABE7, + 12520 - 12288: 0xABE8, + 12521 - 12288: 0xABE9, + 12522 - 12288: 0xABEA, + 12523 - 12288: 0xABEB, + 12524 - 12288: 0xABEC, + 12525 - 12288: 0xABED, + 12526 - 12288: 0xABEE, + 12527 - 12288: 0xABEF, + 12528 - 12288: 0xABF0, + 12529 - 12288: 0xABF1, + 12530 - 12288: 0xABF2, + 12531 - 12288: 0xABF3, + 12532 - 12288: 0xABF4, + 12533 - 12288: 0xABF5, + 12534 - 12288: 0xABF6, + 12593 - 12288: 0xA4A1, + 12594 - 12288: 0xA4A2, + 12595 - 12288: 0xA4A3, + 12596 - 12288: 0xA4A4, + 12597 - 12288: 0xA4A5, + 12598 - 12288: 0xA4A6, + 12599 - 12288: 0xA4A7, + 12600 - 12288: 0xA4A8, + 12601 - 12288: 0xA4A9, + 12602 - 12288: 0xA4AA, + 12603 - 12288: 0xA4AB, + 12604 - 12288: 0xA4AC, + 12605 - 12288: 0xA4AD, + 12606 - 12288: 0xA4AE, + 12607 - 12288: 0xA4AF, + 12608 - 12288: 0xA4B0, + 12609 - 12288: 0xA4B1, + 12610 - 12288: 0xA4B2, + 12611 - 12288: 0xA4B3, + 12612 - 12288: 0xA4B4, + 12613 - 12288: 0xA4B5, + 12614 - 12288: 0xA4B6, + 12615 - 12288: 0xA4B7, + 12616 - 12288: 0xA4B8, + 12617 - 12288: 0xA4B9, + 12618 - 12288: 0xA4BA, + 12619 - 12288: 0xA4BB, + 12620 - 12288: 0xA4BC, + 12621 - 12288: 0xA4BD, + 12622 - 12288: 0xA4BE, + 12623 - 12288: 0xA4BF, + 12624 - 12288: 0xA4C0, + 12625 - 12288: 0xA4C1, + 12626 - 12288: 0xA4C2, + 12627 - 12288: 0xA4C3, + 12628 - 12288: 0xA4C4, + 12629 - 12288: 0xA4C5, + 12630 - 12288: 0xA4C6, + 12631 - 12288: 0xA4C7, + 12632 - 12288: 0xA4C8, + 12633 - 12288: 0xA4C9, + 12634 - 12288: 0xA4CA, + 12635 - 12288: 0xA4CB, + 12636 - 12288: 0xA4CC, + 12637 - 12288: 0xA4CD, + 12638 - 12288: 0xA4CE, + 12639 - 12288: 0xA4CF, + 12640 - 12288: 0xA4D0, + 12641 - 12288: 0xA4D1, + 12642 - 12288: 0xA4D2, + 12643 - 12288: 0xA4D3, + 12644 - 12288: 0xA4D4, + 12645 - 12288: 0xA4D5, + 12646 - 12288: 0xA4D6, + 12647 - 12288: 0xA4D7, + 12648 - 12288: 0xA4D8, + 12649 - 12288: 0xA4D9, + 12650 - 12288: 0xA4DA, + 12651 - 12288: 0xA4DB, + 12652 - 12288: 0xA4DC, + 12653 - 12288: 0xA4DD, + 12654 - 12288: 0xA4DE, + 12655 - 12288: 0xA4DF, + 12656 - 12288: 0xA4E0, + 12657 - 12288: 0xA4E1, + 12658 - 12288: 0xA4E2, + 12659 - 12288: 0xA4E3, + 12660 - 12288: 0xA4E4, + 12661 - 12288: 0xA4E5, + 12662 - 12288: 0xA4E6, + 12663 - 12288: 0xA4E7, + 12664 - 12288: 0xA4E8, + 12665 - 12288: 0xA4E9, + 12666 - 12288: 0xA4EA, + 12667 - 12288: 0xA4EB, + 12668 - 12288: 0xA4EC, + 12669 - 12288: 0xA4ED, + 12670 - 12288: 0xA4EE, + 12671 - 12288: 0xA4EF, + 12672 - 12288: 0xA4F0, + 12673 - 12288: 0xA4F1, + 12674 - 12288: 0xA4F2, + 12675 - 12288: 0xA4F3, + 12676 - 12288: 0xA4F4, + 12677 - 12288: 0xA4F5, + 12678 - 12288: 0xA4F6, + 12679 - 12288: 0xA4F7, + 12680 - 12288: 0xA4F8, + 12681 - 12288: 0xA4F9, + 12682 - 12288: 0xA4FA, + 12683 - 12288: 0xA4FB, + 12684 - 12288: 0xA4FC, + 12685 - 12288: 0xA4FD, + 12686 - 12288: 0xA4FE, + 12800 - 12288: 0xA9B1, + 12801 - 12288: 0xA9B2, + 12802 - 12288: 0xA9B3, + 12803 - 12288: 0xA9B4, + 12804 - 12288: 0xA9B5, + 12805 - 12288: 0xA9B6, + 12806 - 12288: 0xA9B7, + 12807 - 12288: 0xA9B8, + 12808 - 12288: 0xA9B9, + 12809 - 12288: 0xA9BA, + 12810 - 12288: 0xA9BB, + 12811 - 12288: 0xA9BC, + 12812 - 12288: 0xA9BD, + 12813 - 12288: 0xA9BE, + 12814 - 12288: 0xA9BF, + 12815 - 12288: 0xA9C0, + 12816 - 12288: 0xA9C1, + 12817 - 12288: 0xA9C2, + 12818 - 12288: 0xA9C3, + 12819 - 12288: 0xA9C4, + 12820 - 12288: 0xA9C5, + 12821 - 12288: 0xA9C6, + 12822 - 12288: 0xA9C7, + 12823 - 12288: 0xA9C8, + 12824 - 12288: 0xA9C9, + 12825 - 12288: 0xA9CA, + 12826 - 12288: 0xA9CB, + 12827 - 12288: 0xA9CC, + 12828 - 12288: 0xA2DF, + 12896 - 12288: 0xA8B1, + 12897 - 12288: 0xA8B2, + 12898 - 12288: 0xA8B3, + 12899 - 12288: 0xA8B4, + 12900 - 12288: 0xA8B5, + 12901 - 12288: 0xA8B6, + 12902 - 12288: 0xA8B7, + 12903 - 12288: 0xA8B8, + 12904 - 12288: 0xA8B9, + 12905 - 12288: 0xA8BA, + 12906 - 12288: 0xA8BB, + 12907 - 12288: 0xA8BC, + 12908 - 12288: 0xA8BD, + 12909 - 12288: 0xA8BE, + 12910 - 12288: 0xA8BF, + 12911 - 12288: 0xA8C0, + 12912 - 12288: 0xA8C1, + 12913 - 12288: 0xA8C2, + 12914 - 12288: 0xA8C3, + 12915 - 12288: 0xA8C4, + 12916 - 12288: 0xA8C5, + 12917 - 12288: 0xA8C6, + 12918 - 12288: 0xA8C7, + 12919 - 12288: 0xA8C8, + 12920 - 12288: 0xA8C9, + 12921 - 12288: 0xA8CA, + 12922 - 12288: 0xA8CB, + 12923 - 12288: 0xA8CC, + 12927 - 12288: 0xA2DE, + 13184 - 12288: 0xA7C9, + 13185 - 12288: 0xA7CA, + 13186 - 12288: 0xA7CB, + 13187 - 12288: 0xA7CC, + 13188 - 12288: 0xA7CD, + 13192 - 12288: 0xA7BA, + 13193 - 12288: 0xA7BB, + 13194 - 12288: 0xA7DC, + 13195 - 12288: 0xA7DD, + 13196 - 12288: 0xA7DE, + 13197 - 12288: 0xA7B6, + 13198 - 12288: 0xA7B7, + 13199 - 12288: 0xA7B8, + 13200 - 12288: 0xA7D4, + 13201 - 12288: 0xA7D5, + 13202 - 12288: 0xA7D6, + 13203 - 12288: 0xA7D7, + 13204 - 12288: 0xA7D8, + 13205 - 12288: 0xA7A1, + 13206 - 12288: 0xA7A2, + 13207 - 12288: 0xA7A3, + 13208 - 12288: 0xA7A5, + 13209 - 12288: 0xA7AB, + 13210 - 12288: 0xA7AC, + 13211 - 12288: 0xA7AD, + 13212 - 12288: 0xA7AE, + 13213 - 12288: 0xA7AF, + 13214 - 12288: 0xA7B0, + 13215 - 12288: 0xA7B1, + 13216 - 12288: 0xA7B2, + 13217 - 12288: 0xA7B3, + 13218 - 12288: 0xA7B4, + 13219 - 12288: 0xA7A7, + 13220 - 12288: 0xA7A8, + 13221 - 12288: 0xA7A9, + 13222 - 12288: 0xA7AA, + 13223 - 12288: 0xA7BD, + 13224 - 12288: 0xA7BE, + 13225 - 12288: 0xA7E5, + 13226 - 12288: 0xA7E6, + 13227 - 12288: 0xA7E7, + 13228 - 12288: 0xA7E8, + 13229 - 12288: 0xA7E1, + 13230 - 12288: 0xA7E2, + 13231 - 12288: 0xA7E3, + 13232 - 12288: 0xA7BF, + 13233 - 12288: 0xA7C0, + 13234 - 12288: 0xA7C1, + 13235 - 12288: 0xA7C2, + 13236 - 12288: 0xA7C3, + 13237 - 12288: 0xA7C4, + 13238 - 12288: 0xA7C5, + 13239 - 12288: 0xA7C6, + 13240 - 12288: 0xA7C7, + 13241 - 12288: 0xA7C8, + 13242 - 12288: 0xA7CE, + 13243 - 12288: 0xA7CF, + 13244 - 12288: 0xA7D0, + 13245 - 12288: 0xA7D1, + 13246 - 12288: 0xA7D2, + 13247 - 12288: 0xA7D3, + 13248 - 12288: 0xA7DA, + 13249 - 12288: 0xA7DB, + 13250 - 12288: 0xA2E3, + 13251 - 12288: 0xA7EC, + 13252 - 12288: 0xA7A6, + 13253 - 12288: 0xA7E0, + 13254 - 12288: 0xA7EF, + 13255 - 12288: 0xA2E1, + 13256 - 12288: 0xA7BC, + 13257 - 12288: 0xA7ED, + 13258 - 12288: 0xA7B5, + 13263 - 12288: 0xA7B9, + 13264 - 12288: 0xA7EA, + 13267 - 12288: 0xA7EB, + 13270 - 12288: 0xA7DF, + 13272 - 12288: 0xA2E4, + 13275 - 12288: 0xA7E4, + 13276 - 12288: 0xA7EE, + 13277 - 12288: 0xA7E9, +} + +const encode4Low, encode4High = 161, 1106 + +var encode4 = [...]uint16{ + 161 - 161: 0xA2AE, + 164 - 161: 0xA2B4, + 167 - 161: 0xA1D7, + 168 - 161: 0xA1A7, + 170 - 161: 0xA8A3, + 173 - 161: 0xA1A9, + 174 - 161: 0xA2E7, + 176 - 161: 0xA1C6, + 177 - 161: 0xA1BE, + 178 - 161: 0xA9F7, + 179 - 161: 0xA9F8, + 180 - 161: 0xA2A5, + 182 - 161: 0xA2D2, + 183 - 161: 0xA1A4, + 184 - 161: 0xA2AC, + 185 - 161: 0xA9F6, + 186 - 161: 0xA8AC, + 188 - 161: 0xA8F9, + 189 - 161: 0xA8F6, + 190 - 161: 0xA8FA, + 191 - 161: 0xA2AF, + 198 - 161: 0xA8A1, + 208 - 161: 0xA8A2, + 215 - 161: 0xA1BF, + 216 - 161: 0xA8AA, + 222 - 161: 0xA8AD, + 223 - 161: 0xA9AC, + 230 - 161: 0xA9A1, + 240 - 161: 0xA9A3, + 247 - 161: 0xA1C0, + 248 - 161: 0xA9AA, + 254 - 161: 0xA9AD, + 273 - 161: 0xA9A2, + 294 - 161: 0xA8A4, + 295 - 161: 0xA9A4, + 305 - 161: 0xA9A5, + 306 - 161: 0xA8A6, + 307 - 161: 0xA9A6, + 312 - 161: 0xA9A7, + 319 - 161: 0xA8A8, + 320 - 161: 0xA9A8, + 321 - 161: 0xA8A9, + 322 - 161: 0xA9A9, + 329 - 161: 0xA9B0, + 330 - 161: 0xA8AF, + 331 - 161: 0xA9AF, + 338 - 161: 0xA8AB, + 339 - 161: 0xA9AB, + 358 - 161: 0xA8AE, + 359 - 161: 0xA9AE, + 711 - 161: 0xA2A7, + 720 - 161: 0xA2B0, + 728 - 161: 0xA2A8, + 729 - 161: 0xA2AB, + 730 - 161: 0xA2AA, + 731 - 161: 0xA2AD, + 733 - 161: 0xA2A9, + 913 - 161: 0xA5C1, + 914 - 161: 0xA5C2, + 915 - 161: 0xA5C3, + 916 - 161: 0xA5C4, + 917 - 161: 0xA5C5, + 918 - 161: 0xA5C6, + 919 - 161: 0xA5C7, + 920 - 161: 0xA5C8, + 921 - 161: 0xA5C9, + 922 - 161: 0xA5CA, + 923 - 161: 0xA5CB, + 924 - 161: 0xA5CC, + 925 - 161: 0xA5CD, + 926 - 161: 0xA5CE, + 927 - 161: 0xA5CF, + 928 - 161: 0xA5D0, + 929 - 161: 0xA5D1, + 931 - 161: 0xA5D2, + 932 - 161: 0xA5D3, + 933 - 161: 0xA5D4, + 934 - 161: 0xA5D5, + 935 - 161: 0xA5D6, + 936 - 161: 0xA5D7, + 937 - 161: 0xA5D8, + 945 - 161: 0xA5E1, + 946 - 161: 0xA5E2, + 947 - 161: 0xA5E3, + 948 - 161: 0xA5E4, + 949 - 161: 0xA5E5, + 950 - 161: 0xA5E6, + 951 - 161: 0xA5E7, + 952 - 161: 0xA5E8, + 953 - 161: 0xA5E9, + 954 - 161: 0xA5EA, + 955 - 161: 0xA5EB, + 956 - 161: 0xA5EC, + 957 - 161: 0xA5ED, + 958 - 161: 0xA5EE, + 959 - 161: 0xA5EF, + 960 - 161: 0xA5F0, + 961 - 161: 0xA5F1, + 963 - 161: 0xA5F2, + 964 - 161: 0xA5F3, + 965 - 161: 0xA5F4, + 966 - 161: 0xA5F5, + 967 - 161: 0xA5F6, + 968 - 161: 0xA5F7, + 969 - 161: 0xA5F8, + 1025 - 161: 0xACA7, + 1040 - 161: 0xACA1, + 1041 - 161: 0xACA2, + 1042 - 161: 0xACA3, + 1043 - 161: 0xACA4, + 1044 - 161: 0xACA5, + 1045 - 161: 0xACA6, + 1046 - 161: 0xACA8, + 1047 - 161: 0xACA9, + 1048 - 161: 0xACAA, + 1049 - 161: 0xACAB, + 1050 - 161: 0xACAC, + 1051 - 161: 0xACAD, + 1052 - 161: 0xACAE, + 1053 - 161: 0xACAF, + 1054 - 161: 0xACB0, + 1055 - 161: 0xACB1, + 1056 - 161: 0xACB2, + 1057 - 161: 0xACB3, + 1058 - 161: 0xACB4, + 1059 - 161: 0xACB5, + 1060 - 161: 0xACB6, + 1061 - 161: 0xACB7, + 1062 - 161: 0xACB8, + 1063 - 161: 0xACB9, + 1064 - 161: 0xACBA, + 1065 - 161: 0xACBB, + 1066 - 161: 0xACBC, + 1067 - 161: 0xACBD, + 1068 - 161: 0xACBE, + 1069 - 161: 0xACBF, + 1070 - 161: 0xACC0, + 1071 - 161: 0xACC1, + 1072 - 161: 0xACD1, + 1073 - 161: 0xACD2, + 1074 - 161: 0xACD3, + 1075 - 161: 0xACD4, + 1076 - 161: 0xACD5, + 1077 - 161: 0xACD6, + 1078 - 161: 0xACD8, + 1079 - 161: 0xACD9, + 1080 - 161: 0xACDA, + 1081 - 161: 0xACDB, + 1082 - 161: 0xACDC, + 1083 - 161: 0xACDD, + 1084 - 161: 0xACDE, + 1085 - 161: 0xACDF, + 1086 - 161: 0xACE0, + 1087 - 161: 0xACE1, + 1088 - 161: 0xACE2, + 1089 - 161: 0xACE3, + 1090 - 161: 0xACE4, + 1091 - 161: 0xACE5, + 1092 - 161: 0xACE6, + 1093 - 161: 0xACE7, + 1094 - 161: 0xACE8, + 1095 - 161: 0xACE9, + 1096 - 161: 0xACEA, + 1097 - 161: 0xACEB, + 1098 - 161: 0xACEC, + 1099 - 161: 0xACED, + 1100 - 161: 0xACEE, + 1101 - 161: 0xACEF, + 1102 - 161: 0xACF0, + 1103 - 161: 0xACF1, + 1105 - 161: 0xACD7, +} + +const encode5Low, encode5High = 63744, 64012 + +var encode5 = [...]uint16{ + 63744 - 63744: 0xCBD0, + 63745 - 63744: 0xCBD6, + 63746 - 63744: 0xCBE7, + 63747 - 63744: 0xCDCF, + 63748 - 63744: 0xCDE8, + 63749 - 63744: 0xCEAD, + 63750 - 63744: 0xCFFB, + 63751 - 63744: 0xD0A2, + 63752 - 63744: 0xD0B8, + 63753 - 63744: 0xD0D0, + 63754 - 63744: 0xD0DD, + 63755 - 63744: 0xD1D4, + 63756 - 63744: 0xD1D5, + 63757 - 63744: 0xD1D8, + 63758 - 63744: 0xD1DB, + 63759 - 63744: 0xD1DC, + 63760 - 63744: 0xD1DD, + 63761 - 63744: 0xD1DE, + 63762 - 63744: 0xD1DF, + 63763 - 63744: 0xD1E0, + 63764 - 63744: 0xD1E2, + 63765 - 63744: 0xD1E3, + 63766 - 63744: 0xD1E4, + 63767 - 63744: 0xD1E5, + 63768 - 63744: 0xD1E6, + 63769 - 63744: 0xD1E8, + 63770 - 63744: 0xD1E9, + 63771 - 63744: 0xD1EA, + 63772 - 63744: 0xD1EB, + 63773 - 63744: 0xD1ED, + 63774 - 63744: 0xD1EF, + 63775 - 63744: 0xD1F0, + 63776 - 63744: 0xD1F2, + 63777 - 63744: 0xD1F6, + 63778 - 63744: 0xD1FA, + 63779 - 63744: 0xD1FC, + 63780 - 63744: 0xD1FD, + 63781 - 63744: 0xD1FE, + 63782 - 63744: 0xD2A2, + 63783 - 63744: 0xD2A3, + 63784 - 63744: 0xD2A7, + 63785 - 63744: 0xD2A8, + 63786 - 63744: 0xD2A9, + 63787 - 63744: 0xD2AA, + 63788 - 63744: 0xD2AB, + 63789 - 63744: 0xD2AD, + 63790 - 63744: 0xD2B2, + 63791 - 63744: 0xD2BE, + 63792 - 63744: 0xD2C2, + 63793 - 63744: 0xD2C3, + 63794 - 63744: 0xD2C4, + 63795 - 63744: 0xD2C6, + 63796 - 63744: 0xD2C7, + 63797 - 63744: 0xD2C8, + 63798 - 63744: 0xD2C9, + 63799 - 63744: 0xD2CA, + 63800 - 63744: 0xD2CB, + 63801 - 63744: 0xD2CD, + 63802 - 63744: 0xD2CE, + 63803 - 63744: 0xD2CF, + 63804 - 63744: 0xD2D0, + 63805 - 63744: 0xD2D1, + 63806 - 63744: 0xD2D2, + 63807 - 63744: 0xD2D3, + 63808 - 63744: 0xD2D4, + 63809 - 63744: 0xD2D5, + 63810 - 63744: 0xD2D6, + 63811 - 63744: 0xD2D7, + 63812 - 63744: 0xD2D9, + 63813 - 63744: 0xD2DA, + 63814 - 63744: 0xD2DE, + 63815 - 63744: 0xD2DF, + 63816 - 63744: 0xD2E1, + 63817 - 63744: 0xD2E2, + 63818 - 63744: 0xD2E4, + 63819 - 63744: 0xD2E5, + 63820 - 63744: 0xD2E6, + 63821 - 63744: 0xD2E7, + 63822 - 63744: 0xD2E8, + 63823 - 63744: 0xD2E9, + 63824 - 63744: 0xD2EA, + 63825 - 63744: 0xD2EB, + 63826 - 63744: 0xD2F0, + 63827 - 63744: 0xD2F1, + 63828 - 63744: 0xD2F2, + 63829 - 63744: 0xD2F3, + 63830 - 63744: 0xD2F4, + 63831 - 63744: 0xD2F5, + 63832 - 63744: 0xD2F7, + 63833 - 63744: 0xD2F8, + 63834 - 63744: 0xD4E6, + 63835 - 63744: 0xD4FC, + 63836 - 63744: 0xD5A5, + 63837 - 63744: 0xD5AB, + 63838 - 63744: 0xD5AE, + 63839 - 63744: 0xD6B8, + 63840 - 63744: 0xD6CD, + 63841 - 63744: 0xD7CB, + 63842 - 63744: 0xD7E4, + 63843 - 63744: 0xDBC5, + 63844 - 63744: 0xDBE4, + 63845 - 63744: 0xDCA5, + 63846 - 63744: 0xDDA5, + 63847 - 63744: 0xDDD5, + 63848 - 63744: 0xDDF4, + 63849 - 63744: 0xDEFC, + 63850 - 63744: 0xDEFE, + 63851 - 63744: 0xDFB3, + 63852 - 63744: 0xDFE1, + 63853 - 63744: 0xDFE8, + 63854 - 63744: 0xE0F1, + 63855 - 63744: 0xE1AD, + 63856 - 63744: 0xE1ED, + 63857 - 63744: 0xE3F5, + 63858 - 63744: 0xE4A1, + 63859 - 63744: 0xE4A9, + 63860 - 63744: 0xE5AE, + 63861 - 63744: 0xE5B1, + 63862 - 63744: 0xE5B2, + 63863 - 63744: 0xE5B9, + 63864 - 63744: 0xE5BB, + 63865 - 63744: 0xE5BC, + 63866 - 63744: 0xE5C4, + 63867 - 63744: 0xE5CE, + 63868 - 63744: 0xE5D0, + 63869 - 63744: 0xE5D2, + 63870 - 63744: 0xE5D6, + 63871 - 63744: 0xE5FA, + 63872 - 63744: 0xE5FB, + 63873 - 63744: 0xE5FC, + 63874 - 63744: 0xE5FE, + 63875 - 63744: 0xE6A1, + 63876 - 63744: 0xE6A4, + 63877 - 63744: 0xE6A7, + 63878 - 63744: 0xE6AD, + 63879 - 63744: 0xE6AF, + 63880 - 63744: 0xE6B0, + 63881 - 63744: 0xE6B1, + 63882 - 63744: 0xE6B3, + 63883 - 63744: 0xE6B7, + 63884 - 63744: 0xE6B8, + 63885 - 63744: 0xE6BC, + 63886 - 63744: 0xE6C4, + 63887 - 63744: 0xE6C6, + 63888 - 63744: 0xE6C7, + 63889 - 63744: 0xE6CA, + 63890 - 63744: 0xE6D2, + 63891 - 63744: 0xE6D6, + 63892 - 63744: 0xE6D9, + 63893 - 63744: 0xE6DC, + 63894 - 63744: 0xE6DF, + 63895 - 63744: 0xE6E1, + 63896 - 63744: 0xE6E4, + 63897 - 63744: 0xE6E5, + 63898 - 63744: 0xE6E6, + 63899 - 63744: 0xE6E8, + 63900 - 63744: 0xE6EA, + 63901 - 63744: 0xE6EB, + 63902 - 63744: 0xE6EC, + 63903 - 63744: 0xE6EF, + 63904 - 63744: 0xE6F1, + 63905 - 63744: 0xE6F2, + 63906 - 63744: 0xE6F5, + 63907 - 63744: 0xE6F6, + 63908 - 63744: 0xE6F7, + 63909 - 63744: 0xE6F9, + 63910 - 63744: 0xE7A1, + 63911 - 63744: 0xE7A6, + 63912 - 63744: 0xE7A9, + 63913 - 63744: 0xE7AA, + 63914 - 63744: 0xE7AC, + 63915 - 63744: 0xE7AD, + 63916 - 63744: 0xE7B0, + 63917 - 63744: 0xE7BF, + 63918 - 63744: 0xE7C1, + 63919 - 63744: 0xE7C6, + 63920 - 63744: 0xE7C7, + 63921 - 63744: 0xE7CB, + 63922 - 63744: 0xE7CD, + 63923 - 63744: 0xE7CF, + 63924 - 63744: 0xE7D0, + 63925 - 63744: 0xE7D3, + 63926 - 63744: 0xE7DF, + 63927 - 63744: 0xE7E4, + 63928 - 63744: 0xE7E6, + 63929 - 63744: 0xE7F7, + 63930 - 63744: 0xE8E7, + 63931 - 63744: 0xE8E8, + 63932 - 63744: 0xE8F0, + 63933 - 63744: 0xE8F1, + 63934 - 63744: 0xE8F7, + 63935 - 63744: 0xE8F9, + 63936 - 63744: 0xE8FB, + 63937 - 63744: 0xE8FE, + 63938 - 63744: 0xE9A7, + 63939 - 63744: 0xE9AC, + 63940 - 63744: 0xE9CC, + 63941 - 63744: 0xE9F7, + 63942 - 63744: 0xEAC1, + 63943 - 63744: 0xEAE5, + 63944 - 63744: 0xEAF4, + 63945 - 63744: 0xEAF7, + 63946 - 63744: 0xEAFC, + 63947 - 63744: 0xEAFE, + 63948 - 63744: 0xEBA4, + 63949 - 63744: 0xEBA7, + 63950 - 63744: 0xEBA9, + 63951 - 63744: 0xEBAA, + 63952 - 63744: 0xEBBA, + 63953 - 63744: 0xEBBB, + 63954 - 63744: 0xEBBD, + 63955 - 63744: 0xEBC1, + 63956 - 63744: 0xEBC2, + 63957 - 63744: 0xEBC6, + 63958 - 63744: 0xEBC7, + 63959 - 63744: 0xEBCC, + 63960 - 63744: 0xEBCF, + 63961 - 63744: 0xEBD0, + 63962 - 63744: 0xEBD1, + 63963 - 63744: 0xEBD2, + 63964 - 63744: 0xEBD8, + 63965 - 63744: 0xECA6, + 63966 - 63744: 0xECA7, + 63967 - 63744: 0xECAA, + 63968 - 63744: 0xECAF, + 63969 - 63744: 0xECB0, + 63970 - 63744: 0xECB1, + 63971 - 63744: 0xECB2, + 63972 - 63744: 0xECB5, + 63973 - 63744: 0xECB8, + 63974 - 63744: 0xECBA, + 63975 - 63744: 0xECC0, + 63976 - 63744: 0xECC1, + 63977 - 63744: 0xECC5, + 63978 - 63744: 0xECC6, + 63979 - 63744: 0xECC9, + 63980 - 63744: 0xECCA, + 63981 - 63744: 0xECD5, + 63982 - 63744: 0xECDD, + 63983 - 63744: 0xECDE, + 63984 - 63744: 0xECE1, + 63985 - 63744: 0xECE4, + 63986 - 63744: 0xECE7, + 63987 - 63744: 0xECE8, + 63988 - 63744: 0xECF7, + 63989 - 63744: 0xECF8, + 63990 - 63744: 0xECFA, + 63991 - 63744: 0xEDA1, + 63992 - 63744: 0xEDA2, + 63993 - 63744: 0xEDA3, + 63994 - 63744: 0xEDEE, + 63995 - 63744: 0xEEDB, + 63996 - 63744: 0xF2BD, + 63997 - 63744: 0xF2FA, + 63998 - 63744: 0xF3B1, + 63999 - 63744: 0xF4A7, + 64000 - 63744: 0xF4EE, + 64001 - 63744: 0xF6F4, + 64002 - 63744: 0xF6F6, + 64003 - 63744: 0xF7B8, + 64004 - 63744: 0xF7C8, + 64005 - 63744: 0xF7D3, + 64006 - 63744: 0xF8DB, + 64007 - 63744: 0xF8F0, + 64008 - 63744: 0xFAA1, + 64009 - 63744: 0xFAA2, + 64010 - 63744: 0xFAE6, + 64011 - 63744: 0xFCA9, +} + +const encode6Low, encode6High = 65281, 65511 + +var encode6 = [...]uint16{ + 65281 - 65281: 0xA3A1, + 65282 - 65281: 0xA3A2, + 65283 - 65281: 0xA3A3, + 65284 - 65281: 0xA3A4, + 65285 - 65281: 0xA3A5, + 65286 - 65281: 0xA3A6, + 65287 - 65281: 0xA3A7, + 65288 - 65281: 0xA3A8, + 65289 - 65281: 0xA3A9, + 65290 - 65281: 0xA3AA, + 65291 - 65281: 0xA3AB, + 65292 - 65281: 0xA3AC, + 65293 - 65281: 0xA3AD, + 65294 - 65281: 0xA3AE, + 65295 - 65281: 0xA3AF, + 65296 - 65281: 0xA3B0, + 65297 - 65281: 0xA3B1, + 65298 - 65281: 0xA3B2, + 65299 - 65281: 0xA3B3, + 65300 - 65281: 0xA3B4, + 65301 - 65281: 0xA3B5, + 65302 - 65281: 0xA3B6, + 65303 - 65281: 0xA3B7, + 65304 - 65281: 0xA3B8, + 65305 - 65281: 0xA3B9, + 65306 - 65281: 0xA3BA, + 65307 - 65281: 0xA3BB, + 65308 - 65281: 0xA3BC, + 65309 - 65281: 0xA3BD, + 65310 - 65281: 0xA3BE, + 65311 - 65281: 0xA3BF, + 65312 - 65281: 0xA3C0, + 65313 - 65281: 0xA3C1, + 65314 - 65281: 0xA3C2, + 65315 - 65281: 0xA3C3, + 65316 - 65281: 0xA3C4, + 65317 - 65281: 0xA3C5, + 65318 - 65281: 0xA3C6, + 65319 - 65281: 0xA3C7, + 65320 - 65281: 0xA3C8, + 65321 - 65281: 0xA3C9, + 65322 - 65281: 0xA3CA, + 65323 - 65281: 0xA3CB, + 65324 - 65281: 0xA3CC, + 65325 - 65281: 0xA3CD, + 65326 - 65281: 0xA3CE, + 65327 - 65281: 0xA3CF, + 65328 - 65281: 0xA3D0, + 65329 - 65281: 0xA3D1, + 65330 - 65281: 0xA3D2, + 65331 - 65281: 0xA3D3, + 65332 - 65281: 0xA3D4, + 65333 - 65281: 0xA3D5, + 65334 - 65281: 0xA3D6, + 65335 - 65281: 0xA3D7, + 65336 - 65281: 0xA3D8, + 65337 - 65281: 0xA3D9, + 65338 - 65281: 0xA3DA, + 65339 - 65281: 0xA3DB, + 65340 - 65281: 0xA1AC, + 65341 - 65281: 0xA3DD, + 65342 - 65281: 0xA3DE, + 65343 - 65281: 0xA3DF, + 65344 - 65281: 0xA3E0, + 65345 - 65281: 0xA3E1, + 65346 - 65281: 0xA3E2, + 65347 - 65281: 0xA3E3, + 65348 - 65281: 0xA3E4, + 65349 - 65281: 0xA3E5, + 65350 - 65281: 0xA3E6, + 65351 - 65281: 0xA3E7, + 65352 - 65281: 0xA3E8, + 65353 - 65281: 0xA3E9, + 65354 - 65281: 0xA3EA, + 65355 - 65281: 0xA3EB, + 65356 - 65281: 0xA3EC, + 65357 - 65281: 0xA3ED, + 65358 - 65281: 0xA3EE, + 65359 - 65281: 0xA3EF, + 65360 - 65281: 0xA3F0, + 65361 - 65281: 0xA3F1, + 65362 - 65281: 0xA3F2, + 65363 - 65281: 0xA3F3, + 65364 - 65281: 0xA3F4, + 65365 - 65281: 0xA3F5, + 65366 - 65281: 0xA3F6, + 65367 - 65281: 0xA3F7, + 65368 - 65281: 0xA3F8, + 65369 - 65281: 0xA3F9, + 65370 - 65281: 0xA3FA, + 65371 - 65281: 0xA3FB, + 65372 - 65281: 0xA3FC, + 65373 - 65281: 0xA3FD, + 65374 - 65281: 0xA2A6, + 65504 - 65281: 0xA1CB, + 65505 - 65281: 0xA1CC, + 65506 - 65281: 0xA1FE, + 65507 - 65281: 0xA3FE, + 65509 - 65281: 0xA1CD, + 65510 - 65281: 0xA3DC, +} diff --git a/vendor/golang.org/x/text/encoding/simplifiedchinese/all.go b/vendor/golang.org/x/text/encoding/simplifiedchinese/all.go new file mode 100644 index 0000000000..5ecc526cf8 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/simplifiedchinese/all.go @@ -0,0 +1,12 @@ +// 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 simplifiedchinese + +import ( + "golang.org/x/text/encoding" +) + +// All is a list of all defined encodings in this package. +var All = []encoding.Encoding{GB18030, GBK, HZGB2312} diff --git a/vendor/golang.org/x/text/encoding/simplifiedchinese/all_test.go b/vendor/golang.org/x/text/encoding/simplifiedchinese/all_test.go new file mode 100644 index 0000000000..afdb7aafe1 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/simplifiedchinese/all_test.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 simplifiedchinese + +import ( + "testing" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal" + "golang.org/x/text/transform" +) + +func dec(e encoding.Encoding) (dir string, t transform.Transformer, err error) { + return "Decode", e.NewDecoder(), nil +} +func enc(e encoding.Encoding) (dir string, t transform.Transformer, err error) { + return "Encode", e.NewEncoder(), internal.ErrASCIIReplacement +} + +func TestNonRepertoire(t *testing.T) { + testCases := []struct { + init func(e encoding.Encoding) (string, transform.Transformer, error) + e encoding.Encoding + src, want string + }{ + {dec, GBK, "a\xfe\xfeb", "a\ufffdb"}, + {dec, HZGB2312, "~{z~", "\ufffd"}, + + {enc, GBK, "갂", ""}, + {enc, GBK, "a갂", "a"}, + {enc, GBK, "\u4e02갂", "\x81@"}, + + {enc, HZGB2312, "갂", ""}, + {enc, HZGB2312, "a갂", "a"}, + {enc, HZGB2312, "\u6cf5갂", "~{1C~}"}, + } + for _, tc := range testCases { + dir, tr, wantErr := tc.init(tc.e) + + dst, _, err := transform.String(tr, tc.src) + if err != wantErr { + t.Errorf("%s %v(%q): got %v; want %v", dir, tc.e, tc.src, err, wantErr) + } + if got := string(dst); got != tc.want { + t.Errorf("%s %v(%q):\ngot %q\nwant %q", dir, tc.e, tc.src, got, tc.want) + } + } +} diff --git a/vendor/golang.org/x/text/encoding/simplifiedchinese/gbk.go b/vendor/golang.org/x/text/encoding/simplifiedchinese/gbk.go new file mode 100644 index 0000000000..e0b15bbcc1 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/simplifiedchinese/gbk.go @@ -0,0 +1,281 @@ +// Copyright 2013 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 simplifiedchinese + +import ( + "errors" + "unicode/utf8" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal" + "golang.org/x/text/encoding/internal/identifier" + "golang.org/x/text/transform" +) + +var ( + // GB18030 is the GB18030 encoding. + GB18030 encoding.Encoding = &gbk18030 + // GBK is the GBK encoding. It encodes an extension of the GB2312 character set + // and is also known as Code Page 936. + GBK encoding.Encoding = &gbk +) + +var gbk = internal.Encoding{ + &internal.SimpleEncoding{ + gbkDecoder{gb18030: false}, + gbkEncoder{gb18030: false}, + }, + "GBK", + identifier.GBK, +} + +var gbk18030 = internal.Encoding{ + &internal.SimpleEncoding{ + gbkDecoder{gb18030: true}, + gbkEncoder{gb18030: true}, + }, + "GB18030", + identifier.GB18030, +} + +var ( + errInvalidGB18030 = errors.New("simplifiedchinese: invalid GB18030 encoding") + errInvalidGBK = errors.New("simplifiedchinese: invalid GBK encoding") +) + +type gbkDecoder struct { + transform.NopResetter + gb18030 bool +} + +func (d gbkDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + r, size := rune(0), 0 +loop: + for ; nSrc < len(src); nSrc += size { + switch c0 := src[nSrc]; { + case c0 < utf8.RuneSelf: + r, size = rune(c0), 1 + + // Microsoft's Code Page 936 extends GBK 1.0 to encode the euro sign U+20AC + // as 0x80. The HTML5 specification at http://encoding.spec.whatwg.org/#gbk + // says to treat "gbk" as Code Page 936. + case c0 == 0x80: + r, size = '€', 1 + + case c0 < 0xff: + if nSrc+1 >= len(src) { + err = transform.ErrShortSrc + break loop + } + c1 := src[nSrc+1] + switch { + case 0x40 <= c1 && c1 < 0x7f: + c1 -= 0x40 + case 0x80 <= c1 && c1 < 0xff: + c1 -= 0x41 + case d.gb18030 && 0x30 <= c1 && c1 < 0x40: + if nSrc+3 >= len(src) { + err = transform.ErrShortSrc + break loop + } + c2 := src[nSrc+2] + if c2 < 0x81 || 0xff <= c2 { + err = errInvalidGB18030 + break loop + } + c3 := src[nSrc+3] + if c3 < 0x30 || 0x3a <= c3 { + err = errInvalidGB18030 + break loop + } + size = 4 + r = ((rune(c0-0x81)*10+rune(c1-0x30))*126+rune(c2-0x81))*10 + rune(c3-0x30) + if r < 39420 { + i, j := 0, len(gb18030) + for i < j { + h := i + (j-i)/2 + if r >= rune(gb18030[h][0]) { + i = h + 1 + } else { + j = h + } + } + dec := &gb18030[i-1] + r += rune(dec[1]) - rune(dec[0]) + goto write + } + r -= 189000 + if 0 <= r && r < 0x100000 { + r += 0x10000 + goto write + } + err = errInvalidGB18030 + break loop + default: + if d.gb18030 { + err = errInvalidGB18030 + } else { + err = errInvalidGBK + } + break loop + } + r, size = '\ufffd', 2 + if i := int(c0-0x81)*190 + int(c1); i < len(decode) { + r = rune(decode[i]) + if r == 0 { + r = '\ufffd' + } + } + + default: + if d.gb18030 { + err = errInvalidGB18030 + } else { + err = errInvalidGBK + } + break loop + } + + write: + if nDst+utf8.RuneLen(r) > len(dst) { + err = transform.ErrShortDst + break loop + } + nDst += utf8.EncodeRune(dst[nDst:], r) + } + if atEOF && err == transform.ErrShortSrc { + if d.gb18030 { + err = errInvalidGB18030 + } else { + err = errInvalidGBK + } + } + return nDst, nSrc, err +} + +type gbkEncoder struct { + transform.NopResetter + gb18030 bool +} + +func (e gbkEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + r, r2, size := rune(0), rune(0), 0 + for ; nSrc < len(src); nSrc += size { + r = rune(src[nSrc]) + + // Decode a 1-byte rune. + if r < utf8.RuneSelf { + size = 1 + + } else { + // Decode a multi-byte rune. + r, size = utf8.DecodeRune(src[nSrc:]) + if size == 1 { + // All valid runes of size 1 (those below utf8.RuneSelf) were + // handled above. We have invalid UTF-8 or we haven't seen the + // full character yet. + if !atEOF && !utf8.FullRune(src[nSrc:]) { + err = transform.ErrShortSrc + break + } + } + + // func init checks that the switch covers all tables. + switch { + case encode0Low <= r && r < encode0High: + if r2 = rune(encode0[r-encode0Low]); r2 != 0 { + goto write2 + } + case encode1Low <= r && r < encode1High: + // Microsoft's Code Page 936 extends GBK 1.0 to encode the euro sign U+20AC + // as 0x80. The HTML5 specification at http://encoding.spec.whatwg.org/#gbk + // says to treat "gbk" as Code Page 936. + if r == '€' { + r = 0x80 + goto write1 + } + if r2 = rune(encode1[r-encode1Low]); r2 != 0 { + goto write2 + } + case encode2Low <= r && r < encode2High: + if r2 = rune(encode2[r-encode2Low]); r2 != 0 { + goto write2 + } + case encode3Low <= r && r < encode3High: + if r2 = rune(encode3[r-encode3Low]); r2 != 0 { + goto write2 + } + case encode4Low <= r && r < encode4High: + if r2 = rune(encode4[r-encode4Low]); r2 != 0 { + goto write2 + } + } + + if e.gb18030 { + if r < 0x10000 { + i, j := 0, len(gb18030) + for i < j { + h := i + (j-i)/2 + if r >= rune(gb18030[h][1]) { + i = h + 1 + } else { + j = h + } + } + dec := &gb18030[i-1] + r += rune(dec[0]) - rune(dec[1]) + goto write4 + } else if r < 0x110000 { + r += 189000 - 0x10000 + goto write4 + } + } + err = internal.ErrASCIIReplacement + break + } + + write1: + if nDst >= len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst] = uint8(r) + nDst++ + continue + + write2: + if nDst+2 > len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst+0] = uint8(r2 >> 8) + dst[nDst+1] = uint8(r2) + nDst += 2 + continue + + write4: + if nDst+4 > len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst+3] = uint8(r%10 + 0x30) + r /= 10 + dst[nDst+2] = uint8(r%126 + 0x81) + r /= 126 + dst[nDst+1] = uint8(r%10 + 0x30) + r /= 10 + dst[nDst+0] = uint8(r + 0x81) + nDst += 4 + continue + } + return nDst, nSrc, err +} + +func init() { + // Check that the hard-coded encode switch covers all tables. + if numEncodeTables != 5 { + panic("bad numEncodeTables") + } +} diff --git a/vendor/golang.org/x/text/encoding/simplifiedchinese/hzgb2312.go b/vendor/golang.org/x/text/encoding/simplifiedchinese/hzgb2312.go new file mode 100644 index 0000000000..85de6b1e64 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/simplifiedchinese/hzgb2312.go @@ -0,0 +1,240 @@ +// Copyright 2013 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 simplifiedchinese + +import ( + "errors" + "unicode/utf8" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal" + "golang.org/x/text/encoding/internal/identifier" + "golang.org/x/text/transform" +) + +// HZGB2312 is the HZ-GB2312 encoding. +var HZGB2312 encoding.Encoding = &hzGB2312 + +var hzGB2312 = internal.Encoding{ + internal.FuncEncoding{hzGB2312NewDecoder, hzGB2312NewEncoder}, + "HZ-GB2312", + identifier.HZGB2312, +} + +func hzGB2312NewDecoder() transform.Transformer { + return new(hzGB2312Decoder) +} + +func hzGB2312NewEncoder() transform.Transformer { + return new(hzGB2312Encoder) +} + +var errInvalidHZGB2312 = errors.New("simplifiedchinese: invalid HZ-GB2312 encoding") + +const ( + asciiState = iota + gbState +) + +type hzGB2312Decoder int + +func (d *hzGB2312Decoder) Reset() { + *d = asciiState +} + +func (d *hzGB2312Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + r, size := rune(0), 0 +loop: + for ; nSrc < len(src); nSrc += size { + c0 := src[nSrc] + if c0 >= utf8.RuneSelf { + err = errInvalidHZGB2312 + break loop + } + + if c0 == '~' { + if nSrc+1 >= len(src) { + err = transform.ErrShortSrc + break loop + } + size = 2 + switch src[nSrc+1] { + case '{': + *d = gbState + continue + case '}': + *d = asciiState + continue + case '~': + if nDst >= len(dst) { + err = transform.ErrShortDst + break loop + } + dst[nDst] = '~' + nDst++ + continue + case '\n': + continue + default: + err = errInvalidHZGB2312 + break loop + } + } + + if *d == asciiState { + r, size = rune(c0), 1 + } else { + if nSrc+1 >= len(src) { + err = transform.ErrShortSrc + break loop + } + c1 := src[nSrc+1] + if c0 < 0x21 || 0x7e <= c0 || c1 < 0x21 || 0x7f <= c1 { + err = errInvalidHZGB2312 + break loop + } + + r, size = '\ufffd', 2 + if i := int(c0-0x01)*190 + int(c1+0x3f); i < len(decode) { + r = rune(decode[i]) + if r == 0 { + r = '\ufffd' + } + } + } + + if nDst+utf8.RuneLen(r) > len(dst) { + err = transform.ErrShortDst + break loop + } + nDst += utf8.EncodeRune(dst[nDst:], r) + } + if atEOF && err == transform.ErrShortSrc { + err = errInvalidHZGB2312 + } + return nDst, nSrc, err +} + +type hzGB2312Encoder int + +func (d *hzGB2312Encoder) Reset() { + *d = asciiState +} + +func (e *hzGB2312Encoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + r, size := rune(0), 0 + for ; nSrc < len(src); nSrc += size { + r = rune(src[nSrc]) + + // Decode a 1-byte rune. + if r < utf8.RuneSelf { + size = 1 + if r == '~' { + if nDst+2 > len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst+0] = '~' + dst[nDst+1] = '~' + nDst += 2 + continue + } else if *e != asciiState { + if nDst+3 > len(dst) { + err = transform.ErrShortDst + break + } + *e = asciiState + dst[nDst+0] = '~' + dst[nDst+1] = '}' + nDst += 2 + } else if nDst >= len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst] = uint8(r) + nDst += 1 + continue + + } + + // Decode a multi-byte rune. + r, size = utf8.DecodeRune(src[nSrc:]) + if size == 1 { + // All valid runes of size 1 (those below utf8.RuneSelf) were + // handled above. We have invalid UTF-8 or we haven't seen the + // full character yet. + if !atEOF && !utf8.FullRune(src[nSrc:]) { + err = transform.ErrShortSrc + break + } + } + + // func init checks that the switch covers all tables. + switch { + case encode0Low <= r && r < encode0High: + if r = rune(encode0[r-encode0Low]); r != 0 { + goto writeGB + } + case encode1Low <= r && r < encode1High: + if r = rune(encode1[r-encode1Low]); r != 0 { + goto writeGB + } + case encode2Low <= r && r < encode2High: + if r = rune(encode2[r-encode2Low]); r != 0 { + goto writeGB + } + case encode3Low <= r && r < encode3High: + if r = rune(encode3[r-encode3Low]); r != 0 { + goto writeGB + } + case encode4Low <= r && r < encode4High: + if r = rune(encode4[r-encode4Low]); r != 0 { + goto writeGB + } + } + + terminateInASCIIState: + // Switch back to ASCII state in case of error so that an ASCII + // replacement character can be written in the correct state. + if *e != asciiState { + if nDst+2 > len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst+0] = '~' + dst[nDst+1] = '}' + nDst += 2 + } + err = internal.ErrASCIIReplacement + break + + writeGB: + c0 := uint8(r>>8) - 0x80 + c1 := uint8(r) - 0x80 + if c0 < 0x21 || 0x7e <= c0 || c1 < 0x21 || 0x7f <= c1 { + goto terminateInASCIIState + } + if *e == asciiState { + if nDst+4 > len(dst) { + err = transform.ErrShortDst + break + } + *e = gbState + dst[nDst+0] = '~' + dst[nDst+1] = '{' + nDst += 2 + } else if nDst+2 > len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst+0] = c0 + dst[nDst+1] = c1 + nDst += 2 + continue + } + // TODO: should one always terminate in ASCII state to make it safe to + // concatenate two HZ-GB2312-encoded strings? + return nDst, nSrc, err +} diff --git a/vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go b/vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go new file mode 100644 index 0000000000..55016c7862 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go @@ -0,0 +1,161 @@ +// Copyright 2013 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 + +// This program generates tables.go: +// go run maketables.go | gofmt > tables.go + +import ( + "bufio" + "fmt" + "log" + "net/http" + "sort" + "strings" +) + +func main() { + fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n") + fmt.Printf("// Package simplifiedchinese provides Simplified Chinese encodings such as GBK.\n") + fmt.Printf(`package simplifiedchinese // import "golang.org/x/text/encoding/simplifiedchinese"` + "\n\n") + + printGB18030() + printGBK() +} + +func printGB18030() { + res, err := http.Get("http://encoding.spec.whatwg.org/index-gb18030.txt") + if err != nil { + log.Fatalf("Get: %v", err) + } + defer res.Body.Close() + + fmt.Printf("// gb18030 is the table from http://encoding.spec.whatwg.org/index-gb18030.txt\n") + fmt.Printf("var gb18030 = [...][2]uint16{\n") + scanner := bufio.NewScanner(res.Body) + for scanner.Scan() { + s := strings.TrimSpace(scanner.Text()) + if s == "" || s[0] == '#' { + continue + } + x, y := uint32(0), uint32(0) + if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { + log.Fatalf("could not parse %q", s) + } + if x < 0x10000 && y < 0x10000 { + fmt.Printf("\t{0x%04x, 0x%04x},\n", x, y) + } + } + fmt.Printf("}\n\n") +} + +func printGBK() { + res, err := http.Get("http://encoding.spec.whatwg.org/index-gbk.txt") + if err != nil { + log.Fatalf("Get: %v", err) + } + defer res.Body.Close() + + mapping := [65536]uint16{} + reverse := [65536]uint16{} + + scanner := bufio.NewScanner(res.Body) + for scanner.Scan() { + s := strings.TrimSpace(scanner.Text()) + if s == "" || s[0] == '#' { + continue + } + x, y := uint16(0), uint16(0) + if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { + log.Fatalf("could not parse %q", s) + } + if x < 0 || 126*190 <= x { + log.Fatalf("GBK code %d is out of range", x) + } + mapping[x] = y + if reverse[y] == 0 { + c0, c1 := x/190, x%190 + if c1 >= 0x3f { + c1++ + } + reverse[y] = (0x81+c0)<<8 | (0x40 + c1) + } + } + if err := scanner.Err(); err != nil { + log.Fatalf("scanner error: %v", err) + } + + fmt.Printf("// decode is the decoding table from GBK code to Unicode.\n") + fmt.Printf("// It is defined at http://encoding.spec.whatwg.org/index-gbk.txt\n") + fmt.Printf("var decode = [...]uint16{\n") + for i, v := range mapping { + if v != 0 { + fmt.Printf("\t%d: 0x%04X,\n", i, v) + } + } + fmt.Printf("}\n\n") + + // Any run of at least separation continuous zero entries in the reverse map will + // be a separate encode table. + const separation = 1024 + + intervals := []interval(nil) + low, high := -1, -1 + for i, v := range reverse { + if v == 0 { + continue + } + if low < 0 { + low = i + } else if i-high >= separation { + if high >= 0 { + intervals = append(intervals, interval{low, high}) + } + low = i + } + high = i + 1 + } + if high >= 0 { + intervals = append(intervals, interval{low, high}) + } + sort.Sort(byDecreasingLength(intervals)) + + fmt.Printf("const numEncodeTables = %d\n\n", len(intervals)) + fmt.Printf("// encodeX are the encoding tables from Unicode to GBK code,\n") + fmt.Printf("// sorted by decreasing length.\n") + for i, v := range intervals { + fmt.Printf("// encode%d: %5d entries for runes in [%5d, %5d).\n", i, v.len(), v.low, v.high) + } + fmt.Printf("\n") + + for i, v := range intervals { + fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high) + fmt.Printf("var encode%d = [...]uint16{\n", i) + for j := v.low; j < v.high; j++ { + x := reverse[j] + if x == 0 { + continue + } + fmt.Printf("\t%d-%d: 0x%04X,\n", j, v.low, x) + } + fmt.Printf("}\n\n") + } +} + +// interval is a half-open interval [low, high). +type interval struct { + low, high int +} + +func (i interval) len() int { return i.high - i.low } + +// byDecreasingLength sorts intervals by decreasing length. +type byDecreasingLength []interval + +func (b byDecreasingLength) Len() int { return len(b) } +func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() } +func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] } diff --git a/vendor/golang.org/x/text/encoding/simplifiedchinese/tables.go b/vendor/golang.org/x/text/encoding/simplifiedchinese/tables.go new file mode 100644 index 0000000000..415f52a111 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/simplifiedchinese/tables.go @@ -0,0 +1,43999 @@ +// generated by go run maketables.go; DO NOT EDIT + +// Package simplifiedchinese provides Simplified Chinese encodings such as GBK. +package simplifiedchinese // import "golang.org/x/text/encoding/simplifiedchinese" + +// gb18030 is the table from http://encoding.spec.whatwg.org/index-gb18030.txt +var gb18030 = [...][2]uint16{ + {0x0000, 0x0080}, + {0x0024, 0x00a5}, + {0x0026, 0x00a9}, + {0x002d, 0x00b2}, + {0x0032, 0x00b8}, + {0x0051, 0x00d8}, + {0x0059, 0x00e2}, + {0x005f, 0x00eb}, + {0x0060, 0x00ee}, + {0x0064, 0x00f4}, + {0x0067, 0x00f8}, + {0x0068, 0x00fb}, + {0x0069, 0x00fd}, + {0x006d, 0x0102}, + {0x007e, 0x0114}, + {0x0085, 0x011c}, + {0x0094, 0x012c}, + {0x00ac, 0x0145}, + {0x00af, 0x0149}, + {0x00b3, 0x014e}, + {0x00d0, 0x016c}, + {0x0132, 0x01cf}, + {0x0133, 0x01d1}, + {0x0134, 0x01d3}, + {0x0135, 0x01d5}, + {0x0136, 0x01d7}, + {0x0137, 0x01d9}, + {0x0138, 0x01db}, + {0x0139, 0x01dd}, + {0x0155, 0x01fa}, + {0x01ac, 0x0252}, + {0x01bb, 0x0262}, + {0x0220, 0x02c8}, + {0x0221, 0x02cc}, + {0x022e, 0x02da}, + {0x02e5, 0x03a2}, + {0x02e6, 0x03aa}, + {0x02ed, 0x03c2}, + {0x02ee, 0x03ca}, + {0x0325, 0x0402}, + {0x0333, 0x0450}, + {0x0334, 0x0452}, + {0x1ef2, 0x2011}, + {0x1ef4, 0x2017}, + {0x1ef5, 0x201a}, + {0x1ef7, 0x201e}, + {0x1efe, 0x2027}, + {0x1f07, 0x2031}, + {0x1f08, 0x2034}, + {0x1f09, 0x2036}, + {0x1f0e, 0x203c}, + {0x1f7e, 0x20ad}, + {0x1fd4, 0x2104}, + {0x1fd5, 0x2106}, + {0x1fd8, 0x210a}, + {0x1fe4, 0x2117}, + {0x1fee, 0x2122}, + {0x202c, 0x216c}, + {0x2030, 0x217a}, + {0x2046, 0x2194}, + {0x2048, 0x219a}, + {0x20b6, 0x2209}, + {0x20bc, 0x2210}, + {0x20bd, 0x2212}, + {0x20c0, 0x2216}, + {0x20c4, 0x221b}, + {0x20c6, 0x2221}, + {0x20c8, 0x2224}, + {0x20c9, 0x2226}, + {0x20ca, 0x222c}, + {0x20cc, 0x222f}, + {0x20d1, 0x2238}, + {0x20d6, 0x223e}, + {0x20e0, 0x2249}, + {0x20e3, 0x224d}, + {0x20e8, 0x2253}, + {0x20f5, 0x2262}, + {0x20f7, 0x2268}, + {0x20fd, 0x2270}, + {0x2122, 0x2296}, + {0x2125, 0x229a}, + {0x2130, 0x22a6}, + {0x2149, 0x22c0}, + {0x219b, 0x2313}, + {0x22e8, 0x246a}, + {0x22f2, 0x249c}, + {0x2356, 0x254c}, + {0x235a, 0x2574}, + {0x2367, 0x2590}, + {0x236a, 0x2596}, + {0x2374, 0x25a2}, + {0x2384, 0x25b4}, + {0x238c, 0x25be}, + {0x2394, 0x25c8}, + {0x2397, 0x25cc}, + {0x2399, 0x25d0}, + {0x23ab, 0x25e6}, + {0x23ca, 0x2607}, + {0x23cc, 0x260a}, + {0x2402, 0x2641}, + {0x2403, 0x2643}, + {0x2c41, 0x2e82}, + {0x2c43, 0x2e85}, + {0x2c46, 0x2e89}, + {0x2c48, 0x2e8d}, + {0x2c52, 0x2e98}, + {0x2c61, 0x2ea8}, + {0x2c63, 0x2eab}, + {0x2c66, 0x2eaf}, + {0x2c6a, 0x2eb4}, + {0x2c6c, 0x2eb8}, + {0x2c6f, 0x2ebc}, + {0x2c7d, 0x2ecb}, + {0x2da2, 0x2ffc}, + {0x2da6, 0x3004}, + {0x2da7, 0x3018}, + {0x2dac, 0x301f}, + {0x2dae, 0x302a}, + {0x2dc2, 0x303f}, + {0x2dc4, 0x3094}, + {0x2dcb, 0x309f}, + {0x2dcd, 0x30f7}, + {0x2dd2, 0x30ff}, + {0x2dd8, 0x312a}, + {0x2ece, 0x322a}, + {0x2ed5, 0x3232}, + {0x2f46, 0x32a4}, + {0x3030, 0x3390}, + {0x303c, 0x339f}, + {0x303e, 0x33a2}, + {0x3060, 0x33c5}, + {0x3069, 0x33cf}, + {0x306b, 0x33d3}, + {0x306d, 0x33d6}, + {0x30de, 0x3448}, + {0x3109, 0x3474}, + {0x3233, 0x359f}, + {0x32a2, 0x360f}, + {0x32ad, 0x361b}, + {0x35aa, 0x3919}, + {0x35ff, 0x396f}, + {0x365f, 0x39d1}, + {0x366d, 0x39e0}, + {0x3700, 0x3a74}, + {0x37da, 0x3b4f}, + {0x38f9, 0x3c6f}, + {0x396a, 0x3ce1}, + {0x3cdf, 0x4057}, + {0x3de7, 0x4160}, + {0x3fbe, 0x4338}, + {0x4032, 0x43ad}, + {0x4036, 0x43b2}, + {0x4061, 0x43de}, + {0x4159, 0x44d7}, + {0x42ce, 0x464d}, + {0x42e2, 0x4662}, + {0x43a3, 0x4724}, + {0x43a8, 0x472a}, + {0x43fa, 0x477d}, + {0x440a, 0x478e}, + {0x45c3, 0x4948}, + {0x45f5, 0x497b}, + {0x45f7, 0x497e}, + {0x45fb, 0x4984}, + {0x45fc, 0x4987}, + {0x4610, 0x499c}, + {0x4613, 0x49a0}, + {0x4629, 0x49b8}, + {0x48e8, 0x4c78}, + {0x490f, 0x4ca4}, + {0x497e, 0x4d1a}, + {0x4a12, 0x4daf}, + {0x4a63, 0x9fa6}, + {0x82bd, 0xe76c}, + {0x82be, 0xe7c8}, + {0x82bf, 0xe7e7}, + {0x82cc, 0xe815}, + {0x82cd, 0xe819}, + {0x82d2, 0xe81f}, + {0x82d9, 0xe827}, + {0x82dd, 0xe82d}, + {0x82e1, 0xe833}, + {0x82e9, 0xe83c}, + {0x82f0, 0xe844}, + {0x8300, 0xe856}, + {0x830e, 0xe865}, + {0x93d5, 0xf92d}, + {0x9421, 0xf97a}, + {0x943c, 0xf996}, + {0x948d, 0xf9e8}, + {0x9496, 0xf9f2}, + {0x94b0, 0xfa10}, + {0x94b1, 0xfa12}, + {0x94b2, 0xfa15}, + {0x94b5, 0xfa19}, + {0x94bb, 0xfa22}, + {0x94bc, 0xfa25}, + {0x94be, 0xfa2a}, + {0x98c4, 0xfe32}, + {0x98c5, 0xfe45}, + {0x98c9, 0xfe53}, + {0x98ca, 0xfe58}, + {0x98cb, 0xfe67}, + {0x98cc, 0xfe6c}, + {0x9961, 0xff5f}, + {0x99e2, 0xffe6}, +} + +// decode is the decoding table from GBK code to Unicode. +// It is defined at http://encoding.spec.whatwg.org/index-gbk.txt +var decode = [...]uint16{ + 0: 0x4E02, + 1: 0x4E04, + 2: 0x4E05, + 3: 0x4E06, + 4: 0x4E0F, + 5: 0x4E12, + 6: 0x4E17, + 7: 0x4E1F, + 8: 0x4E20, + 9: 0x4E21, + 10: 0x4E23, + 11: 0x4E26, + 12: 0x4E29, + 13: 0x4E2E, + 14: 0x4E2F, + 15: 0x4E31, + 16: 0x4E33, + 17: 0x4E35, + 18: 0x4E37, + 19: 0x4E3C, + 20: 0x4E40, + 21: 0x4E41, + 22: 0x4E42, + 23: 0x4E44, + 24: 0x4E46, + 25: 0x4E4A, + 26: 0x4E51, + 27: 0x4E55, + 28: 0x4E57, + 29: 0x4E5A, + 30: 0x4E5B, + 31: 0x4E62, + 32: 0x4E63, + 33: 0x4E64, + 34: 0x4E65, + 35: 0x4E67, + 36: 0x4E68, + 37: 0x4E6A, + 38: 0x4E6B, + 39: 0x4E6C, + 40: 0x4E6D, + 41: 0x4E6E, + 42: 0x4E6F, + 43: 0x4E72, + 44: 0x4E74, + 45: 0x4E75, + 46: 0x4E76, + 47: 0x4E77, + 48: 0x4E78, + 49: 0x4E79, + 50: 0x4E7A, + 51: 0x4E7B, + 52: 0x4E7C, + 53: 0x4E7D, + 54: 0x4E7F, + 55: 0x4E80, + 56: 0x4E81, + 57: 0x4E82, + 58: 0x4E83, + 59: 0x4E84, + 60: 0x4E85, + 61: 0x4E87, + 62: 0x4E8A, + 63: 0x4E90, + 64: 0x4E96, + 65: 0x4E97, + 66: 0x4E99, + 67: 0x4E9C, + 68: 0x4E9D, + 69: 0x4E9E, + 70: 0x4EA3, + 71: 0x4EAA, + 72: 0x4EAF, + 73: 0x4EB0, + 74: 0x4EB1, + 75: 0x4EB4, + 76: 0x4EB6, + 77: 0x4EB7, + 78: 0x4EB8, + 79: 0x4EB9, + 80: 0x4EBC, + 81: 0x4EBD, + 82: 0x4EBE, + 83: 0x4EC8, + 84: 0x4ECC, + 85: 0x4ECF, + 86: 0x4ED0, + 87: 0x4ED2, + 88: 0x4EDA, + 89: 0x4EDB, + 90: 0x4EDC, + 91: 0x4EE0, + 92: 0x4EE2, + 93: 0x4EE6, + 94: 0x4EE7, + 95: 0x4EE9, + 96: 0x4EED, + 97: 0x4EEE, + 98: 0x4EEF, + 99: 0x4EF1, + 100: 0x4EF4, + 101: 0x4EF8, + 102: 0x4EF9, + 103: 0x4EFA, + 104: 0x4EFC, + 105: 0x4EFE, + 106: 0x4F00, + 107: 0x4F02, + 108: 0x4F03, + 109: 0x4F04, + 110: 0x4F05, + 111: 0x4F06, + 112: 0x4F07, + 113: 0x4F08, + 114: 0x4F0B, + 115: 0x4F0C, + 116: 0x4F12, + 117: 0x4F13, + 118: 0x4F14, + 119: 0x4F15, + 120: 0x4F16, + 121: 0x4F1C, + 122: 0x4F1D, + 123: 0x4F21, + 124: 0x4F23, + 125: 0x4F28, + 126: 0x4F29, + 127: 0x4F2C, + 128: 0x4F2D, + 129: 0x4F2E, + 130: 0x4F31, + 131: 0x4F33, + 132: 0x4F35, + 133: 0x4F37, + 134: 0x4F39, + 135: 0x4F3B, + 136: 0x4F3E, + 137: 0x4F3F, + 138: 0x4F40, + 139: 0x4F41, + 140: 0x4F42, + 141: 0x4F44, + 142: 0x4F45, + 143: 0x4F47, + 144: 0x4F48, + 145: 0x4F49, + 146: 0x4F4A, + 147: 0x4F4B, + 148: 0x4F4C, + 149: 0x4F52, + 150: 0x4F54, + 151: 0x4F56, + 152: 0x4F61, + 153: 0x4F62, + 154: 0x4F66, + 155: 0x4F68, + 156: 0x4F6A, + 157: 0x4F6B, + 158: 0x4F6D, + 159: 0x4F6E, + 160: 0x4F71, + 161: 0x4F72, + 162: 0x4F75, + 163: 0x4F77, + 164: 0x4F78, + 165: 0x4F79, + 166: 0x4F7A, + 167: 0x4F7D, + 168: 0x4F80, + 169: 0x4F81, + 170: 0x4F82, + 171: 0x4F85, + 172: 0x4F86, + 173: 0x4F87, + 174: 0x4F8A, + 175: 0x4F8C, + 176: 0x4F8E, + 177: 0x4F90, + 178: 0x4F92, + 179: 0x4F93, + 180: 0x4F95, + 181: 0x4F96, + 182: 0x4F98, + 183: 0x4F99, + 184: 0x4F9A, + 185: 0x4F9C, + 186: 0x4F9E, + 187: 0x4F9F, + 188: 0x4FA1, + 189: 0x4FA2, + 190: 0x4FA4, + 191: 0x4FAB, + 192: 0x4FAD, + 193: 0x4FB0, + 194: 0x4FB1, + 195: 0x4FB2, + 196: 0x4FB3, + 197: 0x4FB4, + 198: 0x4FB6, + 199: 0x4FB7, + 200: 0x4FB8, + 201: 0x4FB9, + 202: 0x4FBA, + 203: 0x4FBB, + 204: 0x4FBC, + 205: 0x4FBD, + 206: 0x4FBE, + 207: 0x4FC0, + 208: 0x4FC1, + 209: 0x4FC2, + 210: 0x4FC6, + 211: 0x4FC7, + 212: 0x4FC8, + 213: 0x4FC9, + 214: 0x4FCB, + 215: 0x4FCC, + 216: 0x4FCD, + 217: 0x4FD2, + 218: 0x4FD3, + 219: 0x4FD4, + 220: 0x4FD5, + 221: 0x4FD6, + 222: 0x4FD9, + 223: 0x4FDB, + 224: 0x4FE0, + 225: 0x4FE2, + 226: 0x4FE4, + 227: 0x4FE5, + 228: 0x4FE7, + 229: 0x4FEB, + 230: 0x4FEC, + 231: 0x4FF0, + 232: 0x4FF2, + 233: 0x4FF4, + 234: 0x4FF5, + 235: 0x4FF6, + 236: 0x4FF7, + 237: 0x4FF9, + 238: 0x4FFB, + 239: 0x4FFC, + 240: 0x4FFD, + 241: 0x4FFF, + 242: 0x5000, + 243: 0x5001, + 244: 0x5002, + 245: 0x5003, + 246: 0x5004, + 247: 0x5005, + 248: 0x5006, + 249: 0x5007, + 250: 0x5008, + 251: 0x5009, + 252: 0x500A, + 253: 0x500B, + 254: 0x500E, + 255: 0x5010, + 256: 0x5011, + 257: 0x5013, + 258: 0x5015, + 259: 0x5016, + 260: 0x5017, + 261: 0x501B, + 262: 0x501D, + 263: 0x501E, + 264: 0x5020, + 265: 0x5022, + 266: 0x5023, + 267: 0x5024, + 268: 0x5027, + 269: 0x502B, + 270: 0x502F, + 271: 0x5030, + 272: 0x5031, + 273: 0x5032, + 274: 0x5033, + 275: 0x5034, + 276: 0x5035, + 277: 0x5036, + 278: 0x5037, + 279: 0x5038, + 280: 0x5039, + 281: 0x503B, + 282: 0x503D, + 283: 0x503F, + 284: 0x5040, + 285: 0x5041, + 286: 0x5042, + 287: 0x5044, + 288: 0x5045, + 289: 0x5046, + 290: 0x5049, + 291: 0x504A, + 292: 0x504B, + 293: 0x504D, + 294: 0x5050, + 295: 0x5051, + 296: 0x5052, + 297: 0x5053, + 298: 0x5054, + 299: 0x5056, + 300: 0x5057, + 301: 0x5058, + 302: 0x5059, + 303: 0x505B, + 304: 0x505D, + 305: 0x505E, + 306: 0x505F, + 307: 0x5060, + 308: 0x5061, + 309: 0x5062, + 310: 0x5063, + 311: 0x5064, + 312: 0x5066, + 313: 0x5067, + 314: 0x5068, + 315: 0x5069, + 316: 0x506A, + 317: 0x506B, + 318: 0x506D, + 319: 0x506E, + 320: 0x506F, + 321: 0x5070, + 322: 0x5071, + 323: 0x5072, + 324: 0x5073, + 325: 0x5074, + 326: 0x5075, + 327: 0x5078, + 328: 0x5079, + 329: 0x507A, + 330: 0x507C, + 331: 0x507D, + 332: 0x5081, + 333: 0x5082, + 334: 0x5083, + 335: 0x5084, + 336: 0x5086, + 337: 0x5087, + 338: 0x5089, + 339: 0x508A, + 340: 0x508B, + 341: 0x508C, + 342: 0x508E, + 343: 0x508F, + 344: 0x5090, + 345: 0x5091, + 346: 0x5092, + 347: 0x5093, + 348: 0x5094, + 349: 0x5095, + 350: 0x5096, + 351: 0x5097, + 352: 0x5098, + 353: 0x5099, + 354: 0x509A, + 355: 0x509B, + 356: 0x509C, + 357: 0x509D, + 358: 0x509E, + 359: 0x509F, + 360: 0x50A0, + 361: 0x50A1, + 362: 0x50A2, + 363: 0x50A4, + 364: 0x50A6, + 365: 0x50AA, + 366: 0x50AB, + 367: 0x50AD, + 368: 0x50AE, + 369: 0x50AF, + 370: 0x50B0, + 371: 0x50B1, + 372: 0x50B3, + 373: 0x50B4, + 374: 0x50B5, + 375: 0x50B6, + 376: 0x50B7, + 377: 0x50B8, + 378: 0x50B9, + 379: 0x50BC, + 380: 0x50BD, + 381: 0x50BE, + 382: 0x50BF, + 383: 0x50C0, + 384: 0x50C1, + 385: 0x50C2, + 386: 0x50C3, + 387: 0x50C4, + 388: 0x50C5, + 389: 0x50C6, + 390: 0x50C7, + 391: 0x50C8, + 392: 0x50C9, + 393: 0x50CA, + 394: 0x50CB, + 395: 0x50CC, + 396: 0x50CD, + 397: 0x50CE, + 398: 0x50D0, + 399: 0x50D1, + 400: 0x50D2, + 401: 0x50D3, + 402: 0x50D4, + 403: 0x50D5, + 404: 0x50D7, + 405: 0x50D8, + 406: 0x50D9, + 407: 0x50DB, + 408: 0x50DC, + 409: 0x50DD, + 410: 0x50DE, + 411: 0x50DF, + 412: 0x50E0, + 413: 0x50E1, + 414: 0x50E2, + 415: 0x50E3, + 416: 0x50E4, + 417: 0x50E5, + 418: 0x50E8, + 419: 0x50E9, + 420: 0x50EA, + 421: 0x50EB, + 422: 0x50EF, + 423: 0x50F0, + 424: 0x50F1, + 425: 0x50F2, + 426: 0x50F4, + 427: 0x50F6, + 428: 0x50F7, + 429: 0x50F8, + 430: 0x50F9, + 431: 0x50FA, + 432: 0x50FC, + 433: 0x50FD, + 434: 0x50FE, + 435: 0x50FF, + 436: 0x5100, + 437: 0x5101, + 438: 0x5102, + 439: 0x5103, + 440: 0x5104, + 441: 0x5105, + 442: 0x5108, + 443: 0x5109, + 444: 0x510A, + 445: 0x510C, + 446: 0x510D, + 447: 0x510E, + 448: 0x510F, + 449: 0x5110, + 450: 0x5111, + 451: 0x5113, + 452: 0x5114, + 453: 0x5115, + 454: 0x5116, + 455: 0x5117, + 456: 0x5118, + 457: 0x5119, + 458: 0x511A, + 459: 0x511B, + 460: 0x511C, + 461: 0x511D, + 462: 0x511E, + 463: 0x511F, + 464: 0x5120, + 465: 0x5122, + 466: 0x5123, + 467: 0x5124, + 468: 0x5125, + 469: 0x5126, + 470: 0x5127, + 471: 0x5128, + 472: 0x5129, + 473: 0x512A, + 474: 0x512B, + 475: 0x512C, + 476: 0x512D, + 477: 0x512E, + 478: 0x512F, + 479: 0x5130, + 480: 0x5131, + 481: 0x5132, + 482: 0x5133, + 483: 0x5134, + 484: 0x5135, + 485: 0x5136, + 486: 0x5137, + 487: 0x5138, + 488: 0x5139, + 489: 0x513A, + 490: 0x513B, + 491: 0x513C, + 492: 0x513D, + 493: 0x513E, + 494: 0x5142, + 495: 0x5147, + 496: 0x514A, + 497: 0x514C, + 498: 0x514E, + 499: 0x514F, + 500: 0x5150, + 501: 0x5152, + 502: 0x5153, + 503: 0x5157, + 504: 0x5158, + 505: 0x5159, + 506: 0x515B, + 507: 0x515D, + 508: 0x515E, + 509: 0x515F, + 510: 0x5160, + 511: 0x5161, + 512: 0x5163, + 513: 0x5164, + 514: 0x5166, + 515: 0x5167, + 516: 0x5169, + 517: 0x516A, + 518: 0x516F, + 519: 0x5172, + 520: 0x517A, + 521: 0x517E, + 522: 0x517F, + 523: 0x5183, + 524: 0x5184, + 525: 0x5186, + 526: 0x5187, + 527: 0x518A, + 528: 0x518B, + 529: 0x518E, + 530: 0x518F, + 531: 0x5190, + 532: 0x5191, + 533: 0x5193, + 534: 0x5194, + 535: 0x5198, + 536: 0x519A, + 537: 0x519D, + 538: 0x519E, + 539: 0x519F, + 540: 0x51A1, + 541: 0x51A3, + 542: 0x51A6, + 543: 0x51A7, + 544: 0x51A8, + 545: 0x51A9, + 546: 0x51AA, + 547: 0x51AD, + 548: 0x51AE, + 549: 0x51B4, + 550: 0x51B8, + 551: 0x51B9, + 552: 0x51BA, + 553: 0x51BE, + 554: 0x51BF, + 555: 0x51C1, + 556: 0x51C2, + 557: 0x51C3, + 558: 0x51C5, + 559: 0x51C8, + 560: 0x51CA, + 561: 0x51CD, + 562: 0x51CE, + 563: 0x51D0, + 564: 0x51D2, + 565: 0x51D3, + 566: 0x51D4, + 567: 0x51D5, + 568: 0x51D6, + 569: 0x51D7, + 570: 0x51D8, + 571: 0x51D9, + 572: 0x51DA, + 573: 0x51DC, + 574: 0x51DE, + 575: 0x51DF, + 576: 0x51E2, + 577: 0x51E3, + 578: 0x51E5, + 579: 0x51E6, + 580: 0x51E7, + 581: 0x51E8, + 582: 0x51E9, + 583: 0x51EA, + 584: 0x51EC, + 585: 0x51EE, + 586: 0x51F1, + 587: 0x51F2, + 588: 0x51F4, + 589: 0x51F7, + 590: 0x51FE, + 591: 0x5204, + 592: 0x5205, + 593: 0x5209, + 594: 0x520B, + 595: 0x520C, + 596: 0x520F, + 597: 0x5210, + 598: 0x5213, + 599: 0x5214, + 600: 0x5215, + 601: 0x521C, + 602: 0x521E, + 603: 0x521F, + 604: 0x5221, + 605: 0x5222, + 606: 0x5223, + 607: 0x5225, + 608: 0x5226, + 609: 0x5227, + 610: 0x522A, + 611: 0x522C, + 612: 0x522F, + 613: 0x5231, + 614: 0x5232, + 615: 0x5234, + 616: 0x5235, + 617: 0x523C, + 618: 0x523E, + 619: 0x5244, + 620: 0x5245, + 621: 0x5246, + 622: 0x5247, + 623: 0x5248, + 624: 0x5249, + 625: 0x524B, + 626: 0x524E, + 627: 0x524F, + 628: 0x5252, + 629: 0x5253, + 630: 0x5255, + 631: 0x5257, + 632: 0x5258, + 633: 0x5259, + 634: 0x525A, + 635: 0x525B, + 636: 0x525D, + 637: 0x525F, + 638: 0x5260, + 639: 0x5262, + 640: 0x5263, + 641: 0x5264, + 642: 0x5266, + 643: 0x5268, + 644: 0x526B, + 645: 0x526C, + 646: 0x526D, + 647: 0x526E, + 648: 0x5270, + 649: 0x5271, + 650: 0x5273, + 651: 0x5274, + 652: 0x5275, + 653: 0x5276, + 654: 0x5277, + 655: 0x5278, + 656: 0x5279, + 657: 0x527A, + 658: 0x527B, + 659: 0x527C, + 660: 0x527E, + 661: 0x5280, + 662: 0x5283, + 663: 0x5284, + 664: 0x5285, + 665: 0x5286, + 666: 0x5287, + 667: 0x5289, + 668: 0x528A, + 669: 0x528B, + 670: 0x528C, + 671: 0x528D, + 672: 0x528E, + 673: 0x528F, + 674: 0x5291, + 675: 0x5292, + 676: 0x5294, + 677: 0x5295, + 678: 0x5296, + 679: 0x5297, + 680: 0x5298, + 681: 0x5299, + 682: 0x529A, + 683: 0x529C, + 684: 0x52A4, + 685: 0x52A5, + 686: 0x52A6, + 687: 0x52A7, + 688: 0x52AE, + 689: 0x52AF, + 690: 0x52B0, + 691: 0x52B4, + 692: 0x52B5, + 693: 0x52B6, + 694: 0x52B7, + 695: 0x52B8, + 696: 0x52B9, + 697: 0x52BA, + 698: 0x52BB, + 699: 0x52BC, + 700: 0x52BD, + 701: 0x52C0, + 702: 0x52C1, + 703: 0x52C2, + 704: 0x52C4, + 705: 0x52C5, + 706: 0x52C6, + 707: 0x52C8, + 708: 0x52CA, + 709: 0x52CC, + 710: 0x52CD, + 711: 0x52CE, + 712: 0x52CF, + 713: 0x52D1, + 714: 0x52D3, + 715: 0x52D4, + 716: 0x52D5, + 717: 0x52D7, + 718: 0x52D9, + 719: 0x52DA, + 720: 0x52DB, + 721: 0x52DC, + 722: 0x52DD, + 723: 0x52DE, + 724: 0x52E0, + 725: 0x52E1, + 726: 0x52E2, + 727: 0x52E3, + 728: 0x52E5, + 729: 0x52E6, + 730: 0x52E7, + 731: 0x52E8, + 732: 0x52E9, + 733: 0x52EA, + 734: 0x52EB, + 735: 0x52EC, + 736: 0x52ED, + 737: 0x52EE, + 738: 0x52EF, + 739: 0x52F1, + 740: 0x52F2, + 741: 0x52F3, + 742: 0x52F4, + 743: 0x52F5, + 744: 0x52F6, + 745: 0x52F7, + 746: 0x52F8, + 747: 0x52FB, + 748: 0x52FC, + 749: 0x52FD, + 750: 0x5301, + 751: 0x5302, + 752: 0x5303, + 753: 0x5304, + 754: 0x5307, + 755: 0x5309, + 756: 0x530A, + 757: 0x530B, + 758: 0x530C, + 759: 0x530E, + 760: 0x5311, + 761: 0x5312, + 762: 0x5313, + 763: 0x5314, + 764: 0x5318, + 765: 0x531B, + 766: 0x531C, + 767: 0x531E, + 768: 0x531F, + 769: 0x5322, + 770: 0x5324, + 771: 0x5325, + 772: 0x5327, + 773: 0x5328, + 774: 0x5329, + 775: 0x532B, + 776: 0x532C, + 777: 0x532D, + 778: 0x532F, + 779: 0x5330, + 780: 0x5331, + 781: 0x5332, + 782: 0x5333, + 783: 0x5334, + 784: 0x5335, + 785: 0x5336, + 786: 0x5337, + 787: 0x5338, + 788: 0x533C, + 789: 0x533D, + 790: 0x5340, + 791: 0x5342, + 792: 0x5344, + 793: 0x5346, + 794: 0x534B, + 795: 0x534C, + 796: 0x534D, + 797: 0x5350, + 798: 0x5354, + 799: 0x5358, + 800: 0x5359, + 801: 0x535B, + 802: 0x535D, + 803: 0x5365, + 804: 0x5368, + 805: 0x536A, + 806: 0x536C, + 807: 0x536D, + 808: 0x5372, + 809: 0x5376, + 810: 0x5379, + 811: 0x537B, + 812: 0x537C, + 813: 0x537D, + 814: 0x537E, + 815: 0x5380, + 816: 0x5381, + 817: 0x5383, + 818: 0x5387, + 819: 0x5388, + 820: 0x538A, + 821: 0x538E, + 822: 0x538F, + 823: 0x5390, + 824: 0x5391, + 825: 0x5392, + 826: 0x5393, + 827: 0x5394, + 828: 0x5396, + 829: 0x5397, + 830: 0x5399, + 831: 0x539B, + 832: 0x539C, + 833: 0x539E, + 834: 0x53A0, + 835: 0x53A1, + 836: 0x53A4, + 837: 0x53A7, + 838: 0x53AA, + 839: 0x53AB, + 840: 0x53AC, + 841: 0x53AD, + 842: 0x53AF, + 843: 0x53B0, + 844: 0x53B1, + 845: 0x53B2, + 846: 0x53B3, + 847: 0x53B4, + 848: 0x53B5, + 849: 0x53B7, + 850: 0x53B8, + 851: 0x53B9, + 852: 0x53BA, + 853: 0x53BC, + 854: 0x53BD, + 855: 0x53BE, + 856: 0x53C0, + 857: 0x53C3, + 858: 0x53C4, + 859: 0x53C5, + 860: 0x53C6, + 861: 0x53C7, + 862: 0x53CE, + 863: 0x53CF, + 864: 0x53D0, + 865: 0x53D2, + 866: 0x53D3, + 867: 0x53D5, + 868: 0x53DA, + 869: 0x53DC, + 870: 0x53DD, + 871: 0x53DE, + 872: 0x53E1, + 873: 0x53E2, + 874: 0x53E7, + 875: 0x53F4, + 876: 0x53FA, + 877: 0x53FE, + 878: 0x53FF, + 879: 0x5400, + 880: 0x5402, + 881: 0x5405, + 882: 0x5407, + 883: 0x540B, + 884: 0x5414, + 885: 0x5418, + 886: 0x5419, + 887: 0x541A, + 888: 0x541C, + 889: 0x5422, + 890: 0x5424, + 891: 0x5425, + 892: 0x542A, + 893: 0x5430, + 894: 0x5433, + 895: 0x5436, + 896: 0x5437, + 897: 0x543A, + 898: 0x543D, + 899: 0x543F, + 900: 0x5441, + 901: 0x5442, + 902: 0x5444, + 903: 0x5445, + 904: 0x5447, + 905: 0x5449, + 906: 0x544C, + 907: 0x544D, + 908: 0x544E, + 909: 0x544F, + 910: 0x5451, + 911: 0x545A, + 912: 0x545D, + 913: 0x545E, + 914: 0x545F, + 915: 0x5460, + 916: 0x5461, + 917: 0x5463, + 918: 0x5465, + 919: 0x5467, + 920: 0x5469, + 921: 0x546A, + 922: 0x546B, + 923: 0x546C, + 924: 0x546D, + 925: 0x546E, + 926: 0x546F, + 927: 0x5470, + 928: 0x5474, + 929: 0x5479, + 930: 0x547A, + 931: 0x547E, + 932: 0x547F, + 933: 0x5481, + 934: 0x5483, + 935: 0x5485, + 936: 0x5487, + 937: 0x5488, + 938: 0x5489, + 939: 0x548A, + 940: 0x548D, + 941: 0x5491, + 942: 0x5493, + 943: 0x5497, + 944: 0x5498, + 945: 0x549C, + 946: 0x549E, + 947: 0x549F, + 948: 0x54A0, + 949: 0x54A1, + 950: 0x54A2, + 951: 0x54A5, + 952: 0x54AE, + 953: 0x54B0, + 954: 0x54B2, + 955: 0x54B5, + 956: 0x54B6, + 957: 0x54B7, + 958: 0x54B9, + 959: 0x54BA, + 960: 0x54BC, + 961: 0x54BE, + 962: 0x54C3, + 963: 0x54C5, + 964: 0x54CA, + 965: 0x54CB, + 966: 0x54D6, + 967: 0x54D8, + 968: 0x54DB, + 969: 0x54E0, + 970: 0x54E1, + 971: 0x54E2, + 972: 0x54E3, + 973: 0x54E4, + 974: 0x54EB, + 975: 0x54EC, + 976: 0x54EF, + 977: 0x54F0, + 978: 0x54F1, + 979: 0x54F4, + 980: 0x54F5, + 981: 0x54F6, + 982: 0x54F7, + 983: 0x54F8, + 984: 0x54F9, + 985: 0x54FB, + 986: 0x54FE, + 987: 0x5500, + 988: 0x5502, + 989: 0x5503, + 990: 0x5504, + 991: 0x5505, + 992: 0x5508, + 993: 0x550A, + 994: 0x550B, + 995: 0x550C, + 996: 0x550D, + 997: 0x550E, + 998: 0x5512, + 999: 0x5513, + 1000: 0x5515, + 1001: 0x5516, + 1002: 0x5517, + 1003: 0x5518, + 1004: 0x5519, + 1005: 0x551A, + 1006: 0x551C, + 1007: 0x551D, + 1008: 0x551E, + 1009: 0x551F, + 1010: 0x5521, + 1011: 0x5525, + 1012: 0x5526, + 1013: 0x5528, + 1014: 0x5529, + 1015: 0x552B, + 1016: 0x552D, + 1017: 0x5532, + 1018: 0x5534, + 1019: 0x5535, + 1020: 0x5536, + 1021: 0x5538, + 1022: 0x5539, + 1023: 0x553A, + 1024: 0x553B, + 1025: 0x553D, + 1026: 0x5540, + 1027: 0x5542, + 1028: 0x5545, + 1029: 0x5547, + 1030: 0x5548, + 1031: 0x554B, + 1032: 0x554C, + 1033: 0x554D, + 1034: 0x554E, + 1035: 0x554F, + 1036: 0x5551, + 1037: 0x5552, + 1038: 0x5553, + 1039: 0x5554, + 1040: 0x5557, + 1041: 0x5558, + 1042: 0x5559, + 1043: 0x555A, + 1044: 0x555B, + 1045: 0x555D, + 1046: 0x555E, + 1047: 0x555F, + 1048: 0x5560, + 1049: 0x5562, + 1050: 0x5563, + 1051: 0x5568, + 1052: 0x5569, + 1053: 0x556B, + 1054: 0x556F, + 1055: 0x5570, + 1056: 0x5571, + 1057: 0x5572, + 1058: 0x5573, + 1059: 0x5574, + 1060: 0x5579, + 1061: 0x557A, + 1062: 0x557D, + 1063: 0x557F, + 1064: 0x5585, + 1065: 0x5586, + 1066: 0x558C, + 1067: 0x558D, + 1068: 0x558E, + 1069: 0x5590, + 1070: 0x5592, + 1071: 0x5593, + 1072: 0x5595, + 1073: 0x5596, + 1074: 0x5597, + 1075: 0x559A, + 1076: 0x559B, + 1077: 0x559E, + 1078: 0x55A0, + 1079: 0x55A1, + 1080: 0x55A2, + 1081: 0x55A3, + 1082: 0x55A4, + 1083: 0x55A5, + 1084: 0x55A6, + 1085: 0x55A8, + 1086: 0x55A9, + 1087: 0x55AA, + 1088: 0x55AB, + 1089: 0x55AC, + 1090: 0x55AD, + 1091: 0x55AE, + 1092: 0x55AF, + 1093: 0x55B0, + 1094: 0x55B2, + 1095: 0x55B4, + 1096: 0x55B6, + 1097: 0x55B8, + 1098: 0x55BA, + 1099: 0x55BC, + 1100: 0x55BF, + 1101: 0x55C0, + 1102: 0x55C1, + 1103: 0x55C2, + 1104: 0x55C3, + 1105: 0x55C6, + 1106: 0x55C7, + 1107: 0x55C8, + 1108: 0x55CA, + 1109: 0x55CB, + 1110: 0x55CE, + 1111: 0x55CF, + 1112: 0x55D0, + 1113: 0x55D5, + 1114: 0x55D7, + 1115: 0x55D8, + 1116: 0x55D9, + 1117: 0x55DA, + 1118: 0x55DB, + 1119: 0x55DE, + 1120: 0x55E0, + 1121: 0x55E2, + 1122: 0x55E7, + 1123: 0x55E9, + 1124: 0x55ED, + 1125: 0x55EE, + 1126: 0x55F0, + 1127: 0x55F1, + 1128: 0x55F4, + 1129: 0x55F6, + 1130: 0x55F8, + 1131: 0x55F9, + 1132: 0x55FA, + 1133: 0x55FB, + 1134: 0x55FC, + 1135: 0x55FF, + 1136: 0x5602, + 1137: 0x5603, + 1138: 0x5604, + 1139: 0x5605, + 1140: 0x5606, + 1141: 0x5607, + 1142: 0x560A, + 1143: 0x560B, + 1144: 0x560D, + 1145: 0x5610, + 1146: 0x5611, + 1147: 0x5612, + 1148: 0x5613, + 1149: 0x5614, + 1150: 0x5615, + 1151: 0x5616, + 1152: 0x5617, + 1153: 0x5619, + 1154: 0x561A, + 1155: 0x561C, + 1156: 0x561D, + 1157: 0x5620, + 1158: 0x5621, + 1159: 0x5622, + 1160: 0x5625, + 1161: 0x5626, + 1162: 0x5628, + 1163: 0x5629, + 1164: 0x562A, + 1165: 0x562B, + 1166: 0x562E, + 1167: 0x562F, + 1168: 0x5630, + 1169: 0x5633, + 1170: 0x5635, + 1171: 0x5637, + 1172: 0x5638, + 1173: 0x563A, + 1174: 0x563C, + 1175: 0x563D, + 1176: 0x563E, + 1177: 0x5640, + 1178: 0x5641, + 1179: 0x5642, + 1180: 0x5643, + 1181: 0x5644, + 1182: 0x5645, + 1183: 0x5646, + 1184: 0x5647, + 1185: 0x5648, + 1186: 0x5649, + 1187: 0x564A, + 1188: 0x564B, + 1189: 0x564F, + 1190: 0x5650, + 1191: 0x5651, + 1192: 0x5652, + 1193: 0x5653, + 1194: 0x5655, + 1195: 0x5656, + 1196: 0x565A, + 1197: 0x565B, + 1198: 0x565D, + 1199: 0x565E, + 1200: 0x565F, + 1201: 0x5660, + 1202: 0x5661, + 1203: 0x5663, + 1204: 0x5665, + 1205: 0x5666, + 1206: 0x5667, + 1207: 0x566D, + 1208: 0x566E, + 1209: 0x566F, + 1210: 0x5670, + 1211: 0x5672, + 1212: 0x5673, + 1213: 0x5674, + 1214: 0x5675, + 1215: 0x5677, + 1216: 0x5678, + 1217: 0x5679, + 1218: 0x567A, + 1219: 0x567D, + 1220: 0x567E, + 1221: 0x567F, + 1222: 0x5680, + 1223: 0x5681, + 1224: 0x5682, + 1225: 0x5683, + 1226: 0x5684, + 1227: 0x5687, + 1228: 0x5688, + 1229: 0x5689, + 1230: 0x568A, + 1231: 0x568B, + 1232: 0x568C, + 1233: 0x568D, + 1234: 0x5690, + 1235: 0x5691, + 1236: 0x5692, + 1237: 0x5694, + 1238: 0x5695, + 1239: 0x5696, + 1240: 0x5697, + 1241: 0x5698, + 1242: 0x5699, + 1243: 0x569A, + 1244: 0x569B, + 1245: 0x569C, + 1246: 0x569D, + 1247: 0x569E, + 1248: 0x569F, + 1249: 0x56A0, + 1250: 0x56A1, + 1251: 0x56A2, + 1252: 0x56A4, + 1253: 0x56A5, + 1254: 0x56A6, + 1255: 0x56A7, + 1256: 0x56A8, + 1257: 0x56A9, + 1258: 0x56AA, + 1259: 0x56AB, + 1260: 0x56AC, + 1261: 0x56AD, + 1262: 0x56AE, + 1263: 0x56B0, + 1264: 0x56B1, + 1265: 0x56B2, + 1266: 0x56B3, + 1267: 0x56B4, + 1268: 0x56B5, + 1269: 0x56B6, + 1270: 0x56B8, + 1271: 0x56B9, + 1272: 0x56BA, + 1273: 0x56BB, + 1274: 0x56BD, + 1275: 0x56BE, + 1276: 0x56BF, + 1277: 0x56C0, + 1278: 0x56C1, + 1279: 0x56C2, + 1280: 0x56C3, + 1281: 0x56C4, + 1282: 0x56C5, + 1283: 0x56C6, + 1284: 0x56C7, + 1285: 0x56C8, + 1286: 0x56C9, + 1287: 0x56CB, + 1288: 0x56CC, + 1289: 0x56CD, + 1290: 0x56CE, + 1291: 0x56CF, + 1292: 0x56D0, + 1293: 0x56D1, + 1294: 0x56D2, + 1295: 0x56D3, + 1296: 0x56D5, + 1297: 0x56D6, + 1298: 0x56D8, + 1299: 0x56D9, + 1300: 0x56DC, + 1301: 0x56E3, + 1302: 0x56E5, + 1303: 0x56E6, + 1304: 0x56E7, + 1305: 0x56E8, + 1306: 0x56E9, + 1307: 0x56EA, + 1308: 0x56EC, + 1309: 0x56EE, + 1310: 0x56EF, + 1311: 0x56F2, + 1312: 0x56F3, + 1313: 0x56F6, + 1314: 0x56F7, + 1315: 0x56F8, + 1316: 0x56FB, + 1317: 0x56FC, + 1318: 0x5700, + 1319: 0x5701, + 1320: 0x5702, + 1321: 0x5705, + 1322: 0x5707, + 1323: 0x570B, + 1324: 0x570C, + 1325: 0x570D, + 1326: 0x570E, + 1327: 0x570F, + 1328: 0x5710, + 1329: 0x5711, + 1330: 0x5712, + 1331: 0x5713, + 1332: 0x5714, + 1333: 0x5715, + 1334: 0x5716, + 1335: 0x5717, + 1336: 0x5718, + 1337: 0x5719, + 1338: 0x571A, + 1339: 0x571B, + 1340: 0x571D, + 1341: 0x571E, + 1342: 0x5720, + 1343: 0x5721, + 1344: 0x5722, + 1345: 0x5724, + 1346: 0x5725, + 1347: 0x5726, + 1348: 0x5727, + 1349: 0x572B, + 1350: 0x5731, + 1351: 0x5732, + 1352: 0x5734, + 1353: 0x5735, + 1354: 0x5736, + 1355: 0x5737, + 1356: 0x5738, + 1357: 0x573C, + 1358: 0x573D, + 1359: 0x573F, + 1360: 0x5741, + 1361: 0x5743, + 1362: 0x5744, + 1363: 0x5745, + 1364: 0x5746, + 1365: 0x5748, + 1366: 0x5749, + 1367: 0x574B, + 1368: 0x5752, + 1369: 0x5753, + 1370: 0x5754, + 1371: 0x5755, + 1372: 0x5756, + 1373: 0x5758, + 1374: 0x5759, + 1375: 0x5762, + 1376: 0x5763, + 1377: 0x5765, + 1378: 0x5767, + 1379: 0x576C, + 1380: 0x576E, + 1381: 0x5770, + 1382: 0x5771, + 1383: 0x5772, + 1384: 0x5774, + 1385: 0x5775, + 1386: 0x5778, + 1387: 0x5779, + 1388: 0x577A, + 1389: 0x577D, + 1390: 0x577E, + 1391: 0x577F, + 1392: 0x5780, + 1393: 0x5781, + 1394: 0x5787, + 1395: 0x5788, + 1396: 0x5789, + 1397: 0x578A, + 1398: 0x578D, + 1399: 0x578E, + 1400: 0x578F, + 1401: 0x5790, + 1402: 0x5791, + 1403: 0x5794, + 1404: 0x5795, + 1405: 0x5796, + 1406: 0x5797, + 1407: 0x5798, + 1408: 0x5799, + 1409: 0x579A, + 1410: 0x579C, + 1411: 0x579D, + 1412: 0x579E, + 1413: 0x579F, + 1414: 0x57A5, + 1415: 0x57A8, + 1416: 0x57AA, + 1417: 0x57AC, + 1418: 0x57AF, + 1419: 0x57B0, + 1420: 0x57B1, + 1421: 0x57B3, + 1422: 0x57B5, + 1423: 0x57B6, + 1424: 0x57B7, + 1425: 0x57B9, + 1426: 0x57BA, + 1427: 0x57BB, + 1428: 0x57BC, + 1429: 0x57BD, + 1430: 0x57BE, + 1431: 0x57BF, + 1432: 0x57C0, + 1433: 0x57C1, + 1434: 0x57C4, + 1435: 0x57C5, + 1436: 0x57C6, + 1437: 0x57C7, + 1438: 0x57C8, + 1439: 0x57C9, + 1440: 0x57CA, + 1441: 0x57CC, + 1442: 0x57CD, + 1443: 0x57D0, + 1444: 0x57D1, + 1445: 0x57D3, + 1446: 0x57D6, + 1447: 0x57D7, + 1448: 0x57DB, + 1449: 0x57DC, + 1450: 0x57DE, + 1451: 0x57E1, + 1452: 0x57E2, + 1453: 0x57E3, + 1454: 0x57E5, + 1455: 0x57E6, + 1456: 0x57E7, + 1457: 0x57E8, + 1458: 0x57E9, + 1459: 0x57EA, + 1460: 0x57EB, + 1461: 0x57EC, + 1462: 0x57EE, + 1463: 0x57F0, + 1464: 0x57F1, + 1465: 0x57F2, + 1466: 0x57F3, + 1467: 0x57F5, + 1468: 0x57F6, + 1469: 0x57F7, + 1470: 0x57FB, + 1471: 0x57FC, + 1472: 0x57FE, + 1473: 0x57FF, + 1474: 0x5801, + 1475: 0x5803, + 1476: 0x5804, + 1477: 0x5805, + 1478: 0x5808, + 1479: 0x5809, + 1480: 0x580A, + 1481: 0x580C, + 1482: 0x580E, + 1483: 0x580F, + 1484: 0x5810, + 1485: 0x5812, + 1486: 0x5813, + 1487: 0x5814, + 1488: 0x5816, + 1489: 0x5817, + 1490: 0x5818, + 1491: 0x581A, + 1492: 0x581B, + 1493: 0x581C, + 1494: 0x581D, + 1495: 0x581F, + 1496: 0x5822, + 1497: 0x5823, + 1498: 0x5825, + 1499: 0x5826, + 1500: 0x5827, + 1501: 0x5828, + 1502: 0x5829, + 1503: 0x582B, + 1504: 0x582C, + 1505: 0x582D, + 1506: 0x582E, + 1507: 0x582F, + 1508: 0x5831, + 1509: 0x5832, + 1510: 0x5833, + 1511: 0x5834, + 1512: 0x5836, + 1513: 0x5837, + 1514: 0x5838, + 1515: 0x5839, + 1516: 0x583A, + 1517: 0x583B, + 1518: 0x583C, + 1519: 0x583D, + 1520: 0x583E, + 1521: 0x583F, + 1522: 0x5840, + 1523: 0x5841, + 1524: 0x5842, + 1525: 0x5843, + 1526: 0x5845, + 1527: 0x5846, + 1528: 0x5847, + 1529: 0x5848, + 1530: 0x5849, + 1531: 0x584A, + 1532: 0x584B, + 1533: 0x584E, + 1534: 0x584F, + 1535: 0x5850, + 1536: 0x5852, + 1537: 0x5853, + 1538: 0x5855, + 1539: 0x5856, + 1540: 0x5857, + 1541: 0x5859, + 1542: 0x585A, + 1543: 0x585B, + 1544: 0x585C, + 1545: 0x585D, + 1546: 0x585F, + 1547: 0x5860, + 1548: 0x5861, + 1549: 0x5862, + 1550: 0x5863, + 1551: 0x5864, + 1552: 0x5866, + 1553: 0x5867, + 1554: 0x5868, + 1555: 0x5869, + 1556: 0x586A, + 1557: 0x586D, + 1558: 0x586E, + 1559: 0x586F, + 1560: 0x5870, + 1561: 0x5871, + 1562: 0x5872, + 1563: 0x5873, + 1564: 0x5874, + 1565: 0x5875, + 1566: 0x5876, + 1567: 0x5877, + 1568: 0x5878, + 1569: 0x5879, + 1570: 0x587A, + 1571: 0x587B, + 1572: 0x587C, + 1573: 0x587D, + 1574: 0x587F, + 1575: 0x5882, + 1576: 0x5884, + 1577: 0x5886, + 1578: 0x5887, + 1579: 0x5888, + 1580: 0x588A, + 1581: 0x588B, + 1582: 0x588C, + 1583: 0x588D, + 1584: 0x588E, + 1585: 0x588F, + 1586: 0x5890, + 1587: 0x5891, + 1588: 0x5894, + 1589: 0x5895, + 1590: 0x5896, + 1591: 0x5897, + 1592: 0x5898, + 1593: 0x589B, + 1594: 0x589C, + 1595: 0x589D, + 1596: 0x58A0, + 1597: 0x58A1, + 1598: 0x58A2, + 1599: 0x58A3, + 1600: 0x58A4, + 1601: 0x58A5, + 1602: 0x58A6, + 1603: 0x58A7, + 1604: 0x58AA, + 1605: 0x58AB, + 1606: 0x58AC, + 1607: 0x58AD, + 1608: 0x58AE, + 1609: 0x58AF, + 1610: 0x58B0, + 1611: 0x58B1, + 1612: 0x58B2, + 1613: 0x58B3, + 1614: 0x58B4, + 1615: 0x58B5, + 1616: 0x58B6, + 1617: 0x58B7, + 1618: 0x58B8, + 1619: 0x58B9, + 1620: 0x58BA, + 1621: 0x58BB, + 1622: 0x58BD, + 1623: 0x58BE, + 1624: 0x58BF, + 1625: 0x58C0, + 1626: 0x58C2, + 1627: 0x58C3, + 1628: 0x58C4, + 1629: 0x58C6, + 1630: 0x58C7, + 1631: 0x58C8, + 1632: 0x58C9, + 1633: 0x58CA, + 1634: 0x58CB, + 1635: 0x58CC, + 1636: 0x58CD, + 1637: 0x58CE, + 1638: 0x58CF, + 1639: 0x58D0, + 1640: 0x58D2, + 1641: 0x58D3, + 1642: 0x58D4, + 1643: 0x58D6, + 1644: 0x58D7, + 1645: 0x58D8, + 1646: 0x58D9, + 1647: 0x58DA, + 1648: 0x58DB, + 1649: 0x58DC, + 1650: 0x58DD, + 1651: 0x58DE, + 1652: 0x58DF, + 1653: 0x58E0, + 1654: 0x58E1, + 1655: 0x58E2, + 1656: 0x58E3, + 1657: 0x58E5, + 1658: 0x58E6, + 1659: 0x58E7, + 1660: 0x58E8, + 1661: 0x58E9, + 1662: 0x58EA, + 1663: 0x58ED, + 1664: 0x58EF, + 1665: 0x58F1, + 1666: 0x58F2, + 1667: 0x58F4, + 1668: 0x58F5, + 1669: 0x58F7, + 1670: 0x58F8, + 1671: 0x58FA, + 1672: 0x58FB, + 1673: 0x58FC, + 1674: 0x58FD, + 1675: 0x58FE, + 1676: 0x58FF, + 1677: 0x5900, + 1678: 0x5901, + 1679: 0x5903, + 1680: 0x5905, + 1681: 0x5906, + 1682: 0x5908, + 1683: 0x5909, + 1684: 0x590A, + 1685: 0x590B, + 1686: 0x590C, + 1687: 0x590E, + 1688: 0x5910, + 1689: 0x5911, + 1690: 0x5912, + 1691: 0x5913, + 1692: 0x5917, + 1693: 0x5918, + 1694: 0x591B, + 1695: 0x591D, + 1696: 0x591E, + 1697: 0x5920, + 1698: 0x5921, + 1699: 0x5922, + 1700: 0x5923, + 1701: 0x5926, + 1702: 0x5928, + 1703: 0x592C, + 1704: 0x5930, + 1705: 0x5932, + 1706: 0x5933, + 1707: 0x5935, + 1708: 0x5936, + 1709: 0x593B, + 1710: 0x593D, + 1711: 0x593E, + 1712: 0x593F, + 1713: 0x5940, + 1714: 0x5943, + 1715: 0x5945, + 1716: 0x5946, + 1717: 0x594A, + 1718: 0x594C, + 1719: 0x594D, + 1720: 0x5950, + 1721: 0x5952, + 1722: 0x5953, + 1723: 0x5959, + 1724: 0x595B, + 1725: 0x595C, + 1726: 0x595D, + 1727: 0x595E, + 1728: 0x595F, + 1729: 0x5961, + 1730: 0x5963, + 1731: 0x5964, + 1732: 0x5966, + 1733: 0x5967, + 1734: 0x5968, + 1735: 0x5969, + 1736: 0x596A, + 1737: 0x596B, + 1738: 0x596C, + 1739: 0x596D, + 1740: 0x596E, + 1741: 0x596F, + 1742: 0x5970, + 1743: 0x5971, + 1744: 0x5972, + 1745: 0x5975, + 1746: 0x5977, + 1747: 0x597A, + 1748: 0x597B, + 1749: 0x597C, + 1750: 0x597E, + 1751: 0x597F, + 1752: 0x5980, + 1753: 0x5985, + 1754: 0x5989, + 1755: 0x598B, + 1756: 0x598C, + 1757: 0x598E, + 1758: 0x598F, + 1759: 0x5990, + 1760: 0x5991, + 1761: 0x5994, + 1762: 0x5995, + 1763: 0x5998, + 1764: 0x599A, + 1765: 0x599B, + 1766: 0x599C, + 1767: 0x599D, + 1768: 0x599F, + 1769: 0x59A0, + 1770: 0x59A1, + 1771: 0x59A2, + 1772: 0x59A6, + 1773: 0x59A7, + 1774: 0x59AC, + 1775: 0x59AD, + 1776: 0x59B0, + 1777: 0x59B1, + 1778: 0x59B3, + 1779: 0x59B4, + 1780: 0x59B5, + 1781: 0x59B6, + 1782: 0x59B7, + 1783: 0x59B8, + 1784: 0x59BA, + 1785: 0x59BC, + 1786: 0x59BD, + 1787: 0x59BF, + 1788: 0x59C0, + 1789: 0x59C1, + 1790: 0x59C2, + 1791: 0x59C3, + 1792: 0x59C4, + 1793: 0x59C5, + 1794: 0x59C7, + 1795: 0x59C8, + 1796: 0x59C9, + 1797: 0x59CC, + 1798: 0x59CD, + 1799: 0x59CE, + 1800: 0x59CF, + 1801: 0x59D5, + 1802: 0x59D6, + 1803: 0x59D9, + 1804: 0x59DB, + 1805: 0x59DE, + 1806: 0x59DF, + 1807: 0x59E0, + 1808: 0x59E1, + 1809: 0x59E2, + 1810: 0x59E4, + 1811: 0x59E6, + 1812: 0x59E7, + 1813: 0x59E9, + 1814: 0x59EA, + 1815: 0x59EB, + 1816: 0x59ED, + 1817: 0x59EE, + 1818: 0x59EF, + 1819: 0x59F0, + 1820: 0x59F1, + 1821: 0x59F2, + 1822: 0x59F3, + 1823: 0x59F4, + 1824: 0x59F5, + 1825: 0x59F6, + 1826: 0x59F7, + 1827: 0x59F8, + 1828: 0x59FA, + 1829: 0x59FC, + 1830: 0x59FD, + 1831: 0x59FE, + 1832: 0x5A00, + 1833: 0x5A02, + 1834: 0x5A0A, + 1835: 0x5A0B, + 1836: 0x5A0D, + 1837: 0x5A0E, + 1838: 0x5A0F, + 1839: 0x5A10, + 1840: 0x5A12, + 1841: 0x5A14, + 1842: 0x5A15, + 1843: 0x5A16, + 1844: 0x5A17, + 1845: 0x5A19, + 1846: 0x5A1A, + 1847: 0x5A1B, + 1848: 0x5A1D, + 1849: 0x5A1E, + 1850: 0x5A21, + 1851: 0x5A22, + 1852: 0x5A24, + 1853: 0x5A26, + 1854: 0x5A27, + 1855: 0x5A28, + 1856: 0x5A2A, + 1857: 0x5A2B, + 1858: 0x5A2C, + 1859: 0x5A2D, + 1860: 0x5A2E, + 1861: 0x5A2F, + 1862: 0x5A30, + 1863: 0x5A33, + 1864: 0x5A35, + 1865: 0x5A37, + 1866: 0x5A38, + 1867: 0x5A39, + 1868: 0x5A3A, + 1869: 0x5A3B, + 1870: 0x5A3D, + 1871: 0x5A3E, + 1872: 0x5A3F, + 1873: 0x5A41, + 1874: 0x5A42, + 1875: 0x5A43, + 1876: 0x5A44, + 1877: 0x5A45, + 1878: 0x5A47, + 1879: 0x5A48, + 1880: 0x5A4B, + 1881: 0x5A4C, + 1882: 0x5A4D, + 1883: 0x5A4E, + 1884: 0x5A4F, + 1885: 0x5A50, + 1886: 0x5A51, + 1887: 0x5A52, + 1888: 0x5A53, + 1889: 0x5A54, + 1890: 0x5A56, + 1891: 0x5A57, + 1892: 0x5A58, + 1893: 0x5A59, + 1894: 0x5A5B, + 1895: 0x5A5C, + 1896: 0x5A5D, + 1897: 0x5A5E, + 1898: 0x5A5F, + 1899: 0x5A60, + 1900: 0x5A61, + 1901: 0x5A63, + 1902: 0x5A64, + 1903: 0x5A65, + 1904: 0x5A66, + 1905: 0x5A68, + 1906: 0x5A69, + 1907: 0x5A6B, + 1908: 0x5A6C, + 1909: 0x5A6D, + 1910: 0x5A6E, + 1911: 0x5A6F, + 1912: 0x5A70, + 1913: 0x5A71, + 1914: 0x5A72, + 1915: 0x5A73, + 1916: 0x5A78, + 1917: 0x5A79, + 1918: 0x5A7B, + 1919: 0x5A7C, + 1920: 0x5A7D, + 1921: 0x5A7E, + 1922: 0x5A80, + 1923: 0x5A81, + 1924: 0x5A82, + 1925: 0x5A83, + 1926: 0x5A84, + 1927: 0x5A85, + 1928: 0x5A86, + 1929: 0x5A87, + 1930: 0x5A88, + 1931: 0x5A89, + 1932: 0x5A8A, + 1933: 0x5A8B, + 1934: 0x5A8C, + 1935: 0x5A8D, + 1936: 0x5A8E, + 1937: 0x5A8F, + 1938: 0x5A90, + 1939: 0x5A91, + 1940: 0x5A93, + 1941: 0x5A94, + 1942: 0x5A95, + 1943: 0x5A96, + 1944: 0x5A97, + 1945: 0x5A98, + 1946: 0x5A99, + 1947: 0x5A9C, + 1948: 0x5A9D, + 1949: 0x5A9E, + 1950: 0x5A9F, + 1951: 0x5AA0, + 1952: 0x5AA1, + 1953: 0x5AA2, + 1954: 0x5AA3, + 1955: 0x5AA4, + 1956: 0x5AA5, + 1957: 0x5AA6, + 1958: 0x5AA7, + 1959: 0x5AA8, + 1960: 0x5AA9, + 1961: 0x5AAB, + 1962: 0x5AAC, + 1963: 0x5AAD, + 1964: 0x5AAE, + 1965: 0x5AAF, + 1966: 0x5AB0, + 1967: 0x5AB1, + 1968: 0x5AB4, + 1969: 0x5AB6, + 1970: 0x5AB7, + 1971: 0x5AB9, + 1972: 0x5ABA, + 1973: 0x5ABB, + 1974: 0x5ABC, + 1975: 0x5ABD, + 1976: 0x5ABF, + 1977: 0x5AC0, + 1978: 0x5AC3, + 1979: 0x5AC4, + 1980: 0x5AC5, + 1981: 0x5AC6, + 1982: 0x5AC7, + 1983: 0x5AC8, + 1984: 0x5ACA, + 1985: 0x5ACB, + 1986: 0x5ACD, + 1987: 0x5ACE, + 1988: 0x5ACF, + 1989: 0x5AD0, + 1990: 0x5AD1, + 1991: 0x5AD3, + 1992: 0x5AD5, + 1993: 0x5AD7, + 1994: 0x5AD9, + 1995: 0x5ADA, + 1996: 0x5ADB, + 1997: 0x5ADD, + 1998: 0x5ADE, + 1999: 0x5ADF, + 2000: 0x5AE2, + 2001: 0x5AE4, + 2002: 0x5AE5, + 2003: 0x5AE7, + 2004: 0x5AE8, + 2005: 0x5AEA, + 2006: 0x5AEC, + 2007: 0x5AED, + 2008: 0x5AEE, + 2009: 0x5AEF, + 2010: 0x5AF0, + 2011: 0x5AF2, + 2012: 0x5AF3, + 2013: 0x5AF4, + 2014: 0x5AF5, + 2015: 0x5AF6, + 2016: 0x5AF7, + 2017: 0x5AF8, + 2018: 0x5AF9, + 2019: 0x5AFA, + 2020: 0x5AFB, + 2021: 0x5AFC, + 2022: 0x5AFD, + 2023: 0x5AFE, + 2024: 0x5AFF, + 2025: 0x5B00, + 2026: 0x5B01, + 2027: 0x5B02, + 2028: 0x5B03, + 2029: 0x5B04, + 2030: 0x5B05, + 2031: 0x5B06, + 2032: 0x5B07, + 2033: 0x5B08, + 2034: 0x5B0A, + 2035: 0x5B0B, + 2036: 0x5B0C, + 2037: 0x5B0D, + 2038: 0x5B0E, + 2039: 0x5B0F, + 2040: 0x5B10, + 2041: 0x5B11, + 2042: 0x5B12, + 2043: 0x5B13, + 2044: 0x5B14, + 2045: 0x5B15, + 2046: 0x5B18, + 2047: 0x5B19, + 2048: 0x5B1A, + 2049: 0x5B1B, + 2050: 0x5B1C, + 2051: 0x5B1D, + 2052: 0x5B1E, + 2053: 0x5B1F, + 2054: 0x5B20, + 2055: 0x5B21, + 2056: 0x5B22, + 2057: 0x5B23, + 2058: 0x5B24, + 2059: 0x5B25, + 2060: 0x5B26, + 2061: 0x5B27, + 2062: 0x5B28, + 2063: 0x5B29, + 2064: 0x5B2A, + 2065: 0x5B2B, + 2066: 0x5B2C, + 2067: 0x5B2D, + 2068: 0x5B2E, + 2069: 0x5B2F, + 2070: 0x5B30, + 2071: 0x5B31, + 2072: 0x5B33, + 2073: 0x5B35, + 2074: 0x5B36, + 2075: 0x5B38, + 2076: 0x5B39, + 2077: 0x5B3A, + 2078: 0x5B3B, + 2079: 0x5B3C, + 2080: 0x5B3D, + 2081: 0x5B3E, + 2082: 0x5B3F, + 2083: 0x5B41, + 2084: 0x5B42, + 2085: 0x5B43, + 2086: 0x5B44, + 2087: 0x5B45, + 2088: 0x5B46, + 2089: 0x5B47, + 2090: 0x5B48, + 2091: 0x5B49, + 2092: 0x5B4A, + 2093: 0x5B4B, + 2094: 0x5B4C, + 2095: 0x5B4D, + 2096: 0x5B4E, + 2097: 0x5B4F, + 2098: 0x5B52, + 2099: 0x5B56, + 2100: 0x5B5E, + 2101: 0x5B60, + 2102: 0x5B61, + 2103: 0x5B67, + 2104: 0x5B68, + 2105: 0x5B6B, + 2106: 0x5B6D, + 2107: 0x5B6E, + 2108: 0x5B6F, + 2109: 0x5B72, + 2110: 0x5B74, + 2111: 0x5B76, + 2112: 0x5B77, + 2113: 0x5B78, + 2114: 0x5B79, + 2115: 0x5B7B, + 2116: 0x5B7C, + 2117: 0x5B7E, + 2118: 0x5B7F, + 2119: 0x5B82, + 2120: 0x5B86, + 2121: 0x5B8A, + 2122: 0x5B8D, + 2123: 0x5B8E, + 2124: 0x5B90, + 2125: 0x5B91, + 2126: 0x5B92, + 2127: 0x5B94, + 2128: 0x5B96, + 2129: 0x5B9F, + 2130: 0x5BA7, + 2131: 0x5BA8, + 2132: 0x5BA9, + 2133: 0x5BAC, + 2134: 0x5BAD, + 2135: 0x5BAE, + 2136: 0x5BAF, + 2137: 0x5BB1, + 2138: 0x5BB2, + 2139: 0x5BB7, + 2140: 0x5BBA, + 2141: 0x5BBB, + 2142: 0x5BBC, + 2143: 0x5BC0, + 2144: 0x5BC1, + 2145: 0x5BC3, + 2146: 0x5BC8, + 2147: 0x5BC9, + 2148: 0x5BCA, + 2149: 0x5BCB, + 2150: 0x5BCD, + 2151: 0x5BCE, + 2152: 0x5BCF, + 2153: 0x5BD1, + 2154: 0x5BD4, + 2155: 0x5BD5, + 2156: 0x5BD6, + 2157: 0x5BD7, + 2158: 0x5BD8, + 2159: 0x5BD9, + 2160: 0x5BDA, + 2161: 0x5BDB, + 2162: 0x5BDC, + 2163: 0x5BE0, + 2164: 0x5BE2, + 2165: 0x5BE3, + 2166: 0x5BE6, + 2167: 0x5BE7, + 2168: 0x5BE9, + 2169: 0x5BEA, + 2170: 0x5BEB, + 2171: 0x5BEC, + 2172: 0x5BED, + 2173: 0x5BEF, + 2174: 0x5BF1, + 2175: 0x5BF2, + 2176: 0x5BF3, + 2177: 0x5BF4, + 2178: 0x5BF5, + 2179: 0x5BF6, + 2180: 0x5BF7, + 2181: 0x5BFD, + 2182: 0x5BFE, + 2183: 0x5C00, + 2184: 0x5C02, + 2185: 0x5C03, + 2186: 0x5C05, + 2187: 0x5C07, + 2188: 0x5C08, + 2189: 0x5C0B, + 2190: 0x5C0C, + 2191: 0x5C0D, + 2192: 0x5C0E, + 2193: 0x5C10, + 2194: 0x5C12, + 2195: 0x5C13, + 2196: 0x5C17, + 2197: 0x5C19, + 2198: 0x5C1B, + 2199: 0x5C1E, + 2200: 0x5C1F, + 2201: 0x5C20, + 2202: 0x5C21, + 2203: 0x5C23, + 2204: 0x5C26, + 2205: 0x5C28, + 2206: 0x5C29, + 2207: 0x5C2A, + 2208: 0x5C2B, + 2209: 0x5C2D, + 2210: 0x5C2E, + 2211: 0x5C2F, + 2212: 0x5C30, + 2213: 0x5C32, + 2214: 0x5C33, + 2215: 0x5C35, + 2216: 0x5C36, + 2217: 0x5C37, + 2218: 0x5C43, + 2219: 0x5C44, + 2220: 0x5C46, + 2221: 0x5C47, + 2222: 0x5C4C, + 2223: 0x5C4D, + 2224: 0x5C52, + 2225: 0x5C53, + 2226: 0x5C54, + 2227: 0x5C56, + 2228: 0x5C57, + 2229: 0x5C58, + 2230: 0x5C5A, + 2231: 0x5C5B, + 2232: 0x5C5C, + 2233: 0x5C5D, + 2234: 0x5C5F, + 2235: 0x5C62, + 2236: 0x5C64, + 2237: 0x5C67, + 2238: 0x5C68, + 2239: 0x5C69, + 2240: 0x5C6A, + 2241: 0x5C6B, + 2242: 0x5C6C, + 2243: 0x5C6D, + 2244: 0x5C70, + 2245: 0x5C72, + 2246: 0x5C73, + 2247: 0x5C74, + 2248: 0x5C75, + 2249: 0x5C76, + 2250: 0x5C77, + 2251: 0x5C78, + 2252: 0x5C7B, + 2253: 0x5C7C, + 2254: 0x5C7D, + 2255: 0x5C7E, + 2256: 0x5C80, + 2257: 0x5C83, + 2258: 0x5C84, + 2259: 0x5C85, + 2260: 0x5C86, + 2261: 0x5C87, + 2262: 0x5C89, + 2263: 0x5C8A, + 2264: 0x5C8B, + 2265: 0x5C8E, + 2266: 0x5C8F, + 2267: 0x5C92, + 2268: 0x5C93, + 2269: 0x5C95, + 2270: 0x5C9D, + 2271: 0x5C9E, + 2272: 0x5C9F, + 2273: 0x5CA0, + 2274: 0x5CA1, + 2275: 0x5CA4, + 2276: 0x5CA5, + 2277: 0x5CA6, + 2278: 0x5CA7, + 2279: 0x5CA8, + 2280: 0x5CAA, + 2281: 0x5CAE, + 2282: 0x5CAF, + 2283: 0x5CB0, + 2284: 0x5CB2, + 2285: 0x5CB4, + 2286: 0x5CB6, + 2287: 0x5CB9, + 2288: 0x5CBA, + 2289: 0x5CBB, + 2290: 0x5CBC, + 2291: 0x5CBE, + 2292: 0x5CC0, + 2293: 0x5CC2, + 2294: 0x5CC3, + 2295: 0x5CC5, + 2296: 0x5CC6, + 2297: 0x5CC7, + 2298: 0x5CC8, + 2299: 0x5CC9, + 2300: 0x5CCA, + 2301: 0x5CCC, + 2302: 0x5CCD, + 2303: 0x5CCE, + 2304: 0x5CCF, + 2305: 0x5CD0, + 2306: 0x5CD1, + 2307: 0x5CD3, + 2308: 0x5CD4, + 2309: 0x5CD5, + 2310: 0x5CD6, + 2311: 0x5CD7, + 2312: 0x5CD8, + 2313: 0x5CDA, + 2314: 0x5CDB, + 2315: 0x5CDC, + 2316: 0x5CDD, + 2317: 0x5CDE, + 2318: 0x5CDF, + 2319: 0x5CE0, + 2320: 0x5CE2, + 2321: 0x5CE3, + 2322: 0x5CE7, + 2323: 0x5CE9, + 2324: 0x5CEB, + 2325: 0x5CEC, + 2326: 0x5CEE, + 2327: 0x5CEF, + 2328: 0x5CF1, + 2329: 0x5CF2, + 2330: 0x5CF3, + 2331: 0x5CF4, + 2332: 0x5CF5, + 2333: 0x5CF6, + 2334: 0x5CF7, + 2335: 0x5CF8, + 2336: 0x5CF9, + 2337: 0x5CFA, + 2338: 0x5CFC, + 2339: 0x5CFD, + 2340: 0x5CFE, + 2341: 0x5CFF, + 2342: 0x5D00, + 2343: 0x5D01, + 2344: 0x5D04, + 2345: 0x5D05, + 2346: 0x5D08, + 2347: 0x5D09, + 2348: 0x5D0A, + 2349: 0x5D0B, + 2350: 0x5D0C, + 2351: 0x5D0D, + 2352: 0x5D0F, + 2353: 0x5D10, + 2354: 0x5D11, + 2355: 0x5D12, + 2356: 0x5D13, + 2357: 0x5D15, + 2358: 0x5D17, + 2359: 0x5D18, + 2360: 0x5D19, + 2361: 0x5D1A, + 2362: 0x5D1C, + 2363: 0x5D1D, + 2364: 0x5D1F, + 2365: 0x5D20, + 2366: 0x5D21, + 2367: 0x5D22, + 2368: 0x5D23, + 2369: 0x5D25, + 2370: 0x5D28, + 2371: 0x5D2A, + 2372: 0x5D2B, + 2373: 0x5D2C, + 2374: 0x5D2F, + 2375: 0x5D30, + 2376: 0x5D31, + 2377: 0x5D32, + 2378: 0x5D33, + 2379: 0x5D35, + 2380: 0x5D36, + 2381: 0x5D37, + 2382: 0x5D38, + 2383: 0x5D39, + 2384: 0x5D3A, + 2385: 0x5D3B, + 2386: 0x5D3C, + 2387: 0x5D3F, + 2388: 0x5D40, + 2389: 0x5D41, + 2390: 0x5D42, + 2391: 0x5D43, + 2392: 0x5D44, + 2393: 0x5D45, + 2394: 0x5D46, + 2395: 0x5D48, + 2396: 0x5D49, + 2397: 0x5D4D, + 2398: 0x5D4E, + 2399: 0x5D4F, + 2400: 0x5D50, + 2401: 0x5D51, + 2402: 0x5D52, + 2403: 0x5D53, + 2404: 0x5D54, + 2405: 0x5D55, + 2406: 0x5D56, + 2407: 0x5D57, + 2408: 0x5D59, + 2409: 0x5D5A, + 2410: 0x5D5C, + 2411: 0x5D5E, + 2412: 0x5D5F, + 2413: 0x5D60, + 2414: 0x5D61, + 2415: 0x5D62, + 2416: 0x5D63, + 2417: 0x5D64, + 2418: 0x5D65, + 2419: 0x5D66, + 2420: 0x5D67, + 2421: 0x5D68, + 2422: 0x5D6A, + 2423: 0x5D6D, + 2424: 0x5D6E, + 2425: 0x5D70, + 2426: 0x5D71, + 2427: 0x5D72, + 2428: 0x5D73, + 2429: 0x5D75, + 2430: 0x5D76, + 2431: 0x5D77, + 2432: 0x5D78, + 2433: 0x5D79, + 2434: 0x5D7A, + 2435: 0x5D7B, + 2436: 0x5D7C, + 2437: 0x5D7D, + 2438: 0x5D7E, + 2439: 0x5D7F, + 2440: 0x5D80, + 2441: 0x5D81, + 2442: 0x5D83, + 2443: 0x5D84, + 2444: 0x5D85, + 2445: 0x5D86, + 2446: 0x5D87, + 2447: 0x5D88, + 2448: 0x5D89, + 2449: 0x5D8A, + 2450: 0x5D8B, + 2451: 0x5D8C, + 2452: 0x5D8D, + 2453: 0x5D8E, + 2454: 0x5D8F, + 2455: 0x5D90, + 2456: 0x5D91, + 2457: 0x5D92, + 2458: 0x5D93, + 2459: 0x5D94, + 2460: 0x5D95, + 2461: 0x5D96, + 2462: 0x5D97, + 2463: 0x5D98, + 2464: 0x5D9A, + 2465: 0x5D9B, + 2466: 0x5D9C, + 2467: 0x5D9E, + 2468: 0x5D9F, + 2469: 0x5DA0, + 2470: 0x5DA1, + 2471: 0x5DA2, + 2472: 0x5DA3, + 2473: 0x5DA4, + 2474: 0x5DA5, + 2475: 0x5DA6, + 2476: 0x5DA7, + 2477: 0x5DA8, + 2478: 0x5DA9, + 2479: 0x5DAA, + 2480: 0x5DAB, + 2481: 0x5DAC, + 2482: 0x5DAD, + 2483: 0x5DAE, + 2484: 0x5DAF, + 2485: 0x5DB0, + 2486: 0x5DB1, + 2487: 0x5DB2, + 2488: 0x5DB3, + 2489: 0x5DB4, + 2490: 0x5DB5, + 2491: 0x5DB6, + 2492: 0x5DB8, + 2493: 0x5DB9, + 2494: 0x5DBA, + 2495: 0x5DBB, + 2496: 0x5DBC, + 2497: 0x5DBD, + 2498: 0x5DBE, + 2499: 0x5DBF, + 2500: 0x5DC0, + 2501: 0x5DC1, + 2502: 0x5DC2, + 2503: 0x5DC3, + 2504: 0x5DC4, + 2505: 0x5DC6, + 2506: 0x5DC7, + 2507: 0x5DC8, + 2508: 0x5DC9, + 2509: 0x5DCA, + 2510: 0x5DCB, + 2511: 0x5DCC, + 2512: 0x5DCE, + 2513: 0x5DCF, + 2514: 0x5DD0, + 2515: 0x5DD1, + 2516: 0x5DD2, + 2517: 0x5DD3, + 2518: 0x5DD4, + 2519: 0x5DD5, + 2520: 0x5DD6, + 2521: 0x5DD7, + 2522: 0x5DD8, + 2523: 0x5DD9, + 2524: 0x5DDA, + 2525: 0x5DDC, + 2526: 0x5DDF, + 2527: 0x5DE0, + 2528: 0x5DE3, + 2529: 0x5DE4, + 2530: 0x5DEA, + 2531: 0x5DEC, + 2532: 0x5DED, + 2533: 0x5DF0, + 2534: 0x5DF5, + 2535: 0x5DF6, + 2536: 0x5DF8, + 2537: 0x5DF9, + 2538: 0x5DFA, + 2539: 0x5DFB, + 2540: 0x5DFC, + 2541: 0x5DFF, + 2542: 0x5E00, + 2543: 0x5E04, + 2544: 0x5E07, + 2545: 0x5E09, + 2546: 0x5E0A, + 2547: 0x5E0B, + 2548: 0x5E0D, + 2549: 0x5E0E, + 2550: 0x5E12, + 2551: 0x5E13, + 2552: 0x5E17, + 2553: 0x5E1E, + 2554: 0x5E1F, + 2555: 0x5E20, + 2556: 0x5E21, + 2557: 0x5E22, + 2558: 0x5E23, + 2559: 0x5E24, + 2560: 0x5E25, + 2561: 0x5E28, + 2562: 0x5E29, + 2563: 0x5E2A, + 2564: 0x5E2B, + 2565: 0x5E2C, + 2566: 0x5E2F, + 2567: 0x5E30, + 2568: 0x5E32, + 2569: 0x5E33, + 2570: 0x5E34, + 2571: 0x5E35, + 2572: 0x5E36, + 2573: 0x5E39, + 2574: 0x5E3A, + 2575: 0x5E3E, + 2576: 0x5E3F, + 2577: 0x5E40, + 2578: 0x5E41, + 2579: 0x5E43, + 2580: 0x5E46, + 2581: 0x5E47, + 2582: 0x5E48, + 2583: 0x5E49, + 2584: 0x5E4A, + 2585: 0x5E4B, + 2586: 0x5E4D, + 2587: 0x5E4E, + 2588: 0x5E4F, + 2589: 0x5E50, + 2590: 0x5E51, + 2591: 0x5E52, + 2592: 0x5E53, + 2593: 0x5E56, + 2594: 0x5E57, + 2595: 0x5E58, + 2596: 0x5E59, + 2597: 0x5E5A, + 2598: 0x5E5C, + 2599: 0x5E5D, + 2600: 0x5E5F, + 2601: 0x5E60, + 2602: 0x5E63, + 2603: 0x5E64, + 2604: 0x5E65, + 2605: 0x5E66, + 2606: 0x5E67, + 2607: 0x5E68, + 2608: 0x5E69, + 2609: 0x5E6A, + 2610: 0x5E6B, + 2611: 0x5E6C, + 2612: 0x5E6D, + 2613: 0x5E6E, + 2614: 0x5E6F, + 2615: 0x5E70, + 2616: 0x5E71, + 2617: 0x5E75, + 2618: 0x5E77, + 2619: 0x5E79, + 2620: 0x5E7E, + 2621: 0x5E81, + 2622: 0x5E82, + 2623: 0x5E83, + 2624: 0x5E85, + 2625: 0x5E88, + 2626: 0x5E89, + 2627: 0x5E8C, + 2628: 0x5E8D, + 2629: 0x5E8E, + 2630: 0x5E92, + 2631: 0x5E98, + 2632: 0x5E9B, + 2633: 0x5E9D, + 2634: 0x5EA1, + 2635: 0x5EA2, + 2636: 0x5EA3, + 2637: 0x5EA4, + 2638: 0x5EA8, + 2639: 0x5EA9, + 2640: 0x5EAA, + 2641: 0x5EAB, + 2642: 0x5EAC, + 2643: 0x5EAE, + 2644: 0x5EAF, + 2645: 0x5EB0, + 2646: 0x5EB1, + 2647: 0x5EB2, + 2648: 0x5EB4, + 2649: 0x5EBA, + 2650: 0x5EBB, + 2651: 0x5EBC, + 2652: 0x5EBD, + 2653: 0x5EBF, + 2654: 0x5EC0, + 2655: 0x5EC1, + 2656: 0x5EC2, + 2657: 0x5EC3, + 2658: 0x5EC4, + 2659: 0x5EC5, + 2660: 0x5EC6, + 2661: 0x5EC7, + 2662: 0x5EC8, + 2663: 0x5ECB, + 2664: 0x5ECC, + 2665: 0x5ECD, + 2666: 0x5ECE, + 2667: 0x5ECF, + 2668: 0x5ED0, + 2669: 0x5ED4, + 2670: 0x5ED5, + 2671: 0x5ED7, + 2672: 0x5ED8, + 2673: 0x5ED9, + 2674: 0x5EDA, + 2675: 0x5EDC, + 2676: 0x5EDD, + 2677: 0x5EDE, + 2678: 0x5EDF, + 2679: 0x5EE0, + 2680: 0x5EE1, + 2681: 0x5EE2, + 2682: 0x5EE3, + 2683: 0x5EE4, + 2684: 0x5EE5, + 2685: 0x5EE6, + 2686: 0x5EE7, + 2687: 0x5EE9, + 2688: 0x5EEB, + 2689: 0x5EEC, + 2690: 0x5EED, + 2691: 0x5EEE, + 2692: 0x5EEF, + 2693: 0x5EF0, + 2694: 0x5EF1, + 2695: 0x5EF2, + 2696: 0x5EF3, + 2697: 0x5EF5, + 2698: 0x5EF8, + 2699: 0x5EF9, + 2700: 0x5EFB, + 2701: 0x5EFC, + 2702: 0x5EFD, + 2703: 0x5F05, + 2704: 0x5F06, + 2705: 0x5F07, + 2706: 0x5F09, + 2707: 0x5F0C, + 2708: 0x5F0D, + 2709: 0x5F0E, + 2710: 0x5F10, + 2711: 0x5F12, + 2712: 0x5F14, + 2713: 0x5F16, + 2714: 0x5F19, + 2715: 0x5F1A, + 2716: 0x5F1C, + 2717: 0x5F1D, + 2718: 0x5F1E, + 2719: 0x5F21, + 2720: 0x5F22, + 2721: 0x5F23, + 2722: 0x5F24, + 2723: 0x5F28, + 2724: 0x5F2B, + 2725: 0x5F2C, + 2726: 0x5F2E, + 2727: 0x5F30, + 2728: 0x5F32, + 2729: 0x5F33, + 2730: 0x5F34, + 2731: 0x5F35, + 2732: 0x5F36, + 2733: 0x5F37, + 2734: 0x5F38, + 2735: 0x5F3B, + 2736: 0x5F3D, + 2737: 0x5F3E, + 2738: 0x5F3F, + 2739: 0x5F41, + 2740: 0x5F42, + 2741: 0x5F43, + 2742: 0x5F44, + 2743: 0x5F45, + 2744: 0x5F46, + 2745: 0x5F47, + 2746: 0x5F48, + 2747: 0x5F49, + 2748: 0x5F4A, + 2749: 0x5F4B, + 2750: 0x5F4C, + 2751: 0x5F4D, + 2752: 0x5F4E, + 2753: 0x5F4F, + 2754: 0x5F51, + 2755: 0x5F54, + 2756: 0x5F59, + 2757: 0x5F5A, + 2758: 0x5F5B, + 2759: 0x5F5C, + 2760: 0x5F5E, + 2761: 0x5F5F, + 2762: 0x5F60, + 2763: 0x5F63, + 2764: 0x5F65, + 2765: 0x5F67, + 2766: 0x5F68, + 2767: 0x5F6B, + 2768: 0x5F6E, + 2769: 0x5F6F, + 2770: 0x5F72, + 2771: 0x5F74, + 2772: 0x5F75, + 2773: 0x5F76, + 2774: 0x5F78, + 2775: 0x5F7A, + 2776: 0x5F7D, + 2777: 0x5F7E, + 2778: 0x5F7F, + 2779: 0x5F83, + 2780: 0x5F86, + 2781: 0x5F8D, + 2782: 0x5F8E, + 2783: 0x5F8F, + 2784: 0x5F91, + 2785: 0x5F93, + 2786: 0x5F94, + 2787: 0x5F96, + 2788: 0x5F9A, + 2789: 0x5F9B, + 2790: 0x5F9D, + 2791: 0x5F9E, + 2792: 0x5F9F, + 2793: 0x5FA0, + 2794: 0x5FA2, + 2795: 0x5FA3, + 2796: 0x5FA4, + 2797: 0x5FA5, + 2798: 0x5FA6, + 2799: 0x5FA7, + 2800: 0x5FA9, + 2801: 0x5FAB, + 2802: 0x5FAC, + 2803: 0x5FAF, + 2804: 0x5FB0, + 2805: 0x5FB1, + 2806: 0x5FB2, + 2807: 0x5FB3, + 2808: 0x5FB4, + 2809: 0x5FB6, + 2810: 0x5FB8, + 2811: 0x5FB9, + 2812: 0x5FBA, + 2813: 0x5FBB, + 2814: 0x5FBE, + 2815: 0x5FBF, + 2816: 0x5FC0, + 2817: 0x5FC1, + 2818: 0x5FC2, + 2819: 0x5FC7, + 2820: 0x5FC8, + 2821: 0x5FCA, + 2822: 0x5FCB, + 2823: 0x5FCE, + 2824: 0x5FD3, + 2825: 0x5FD4, + 2826: 0x5FD5, + 2827: 0x5FDA, + 2828: 0x5FDB, + 2829: 0x5FDC, + 2830: 0x5FDE, + 2831: 0x5FDF, + 2832: 0x5FE2, + 2833: 0x5FE3, + 2834: 0x5FE5, + 2835: 0x5FE6, + 2836: 0x5FE8, + 2837: 0x5FE9, + 2838: 0x5FEC, + 2839: 0x5FEF, + 2840: 0x5FF0, + 2841: 0x5FF2, + 2842: 0x5FF3, + 2843: 0x5FF4, + 2844: 0x5FF6, + 2845: 0x5FF7, + 2846: 0x5FF9, + 2847: 0x5FFA, + 2848: 0x5FFC, + 2849: 0x6007, + 2850: 0x6008, + 2851: 0x6009, + 2852: 0x600B, + 2853: 0x600C, + 2854: 0x6010, + 2855: 0x6011, + 2856: 0x6013, + 2857: 0x6017, + 2858: 0x6018, + 2859: 0x601A, + 2860: 0x601E, + 2861: 0x601F, + 2862: 0x6022, + 2863: 0x6023, + 2864: 0x6024, + 2865: 0x602C, + 2866: 0x602D, + 2867: 0x602E, + 2868: 0x6030, + 2869: 0x6031, + 2870: 0x6032, + 2871: 0x6033, + 2872: 0x6034, + 2873: 0x6036, + 2874: 0x6037, + 2875: 0x6038, + 2876: 0x6039, + 2877: 0x603A, + 2878: 0x603D, + 2879: 0x603E, + 2880: 0x6040, + 2881: 0x6044, + 2882: 0x6045, + 2883: 0x6046, + 2884: 0x6047, + 2885: 0x6048, + 2886: 0x6049, + 2887: 0x604A, + 2888: 0x604C, + 2889: 0x604E, + 2890: 0x604F, + 2891: 0x6051, + 2892: 0x6053, + 2893: 0x6054, + 2894: 0x6056, + 2895: 0x6057, + 2896: 0x6058, + 2897: 0x605B, + 2898: 0x605C, + 2899: 0x605E, + 2900: 0x605F, + 2901: 0x6060, + 2902: 0x6061, + 2903: 0x6065, + 2904: 0x6066, + 2905: 0x606E, + 2906: 0x6071, + 2907: 0x6072, + 2908: 0x6074, + 2909: 0x6075, + 2910: 0x6077, + 2911: 0x607E, + 2912: 0x6080, + 2913: 0x6081, + 2914: 0x6082, + 2915: 0x6085, + 2916: 0x6086, + 2917: 0x6087, + 2918: 0x6088, + 2919: 0x608A, + 2920: 0x608B, + 2921: 0x608E, + 2922: 0x608F, + 2923: 0x6090, + 2924: 0x6091, + 2925: 0x6093, + 2926: 0x6095, + 2927: 0x6097, + 2928: 0x6098, + 2929: 0x6099, + 2930: 0x609C, + 2931: 0x609E, + 2932: 0x60A1, + 2933: 0x60A2, + 2934: 0x60A4, + 2935: 0x60A5, + 2936: 0x60A7, + 2937: 0x60A9, + 2938: 0x60AA, + 2939: 0x60AE, + 2940: 0x60B0, + 2941: 0x60B3, + 2942: 0x60B5, + 2943: 0x60B6, + 2944: 0x60B7, + 2945: 0x60B9, + 2946: 0x60BA, + 2947: 0x60BD, + 2948: 0x60BE, + 2949: 0x60BF, + 2950: 0x60C0, + 2951: 0x60C1, + 2952: 0x60C2, + 2953: 0x60C3, + 2954: 0x60C4, + 2955: 0x60C7, + 2956: 0x60C8, + 2957: 0x60C9, + 2958: 0x60CC, + 2959: 0x60CD, + 2960: 0x60CE, + 2961: 0x60CF, + 2962: 0x60D0, + 2963: 0x60D2, + 2964: 0x60D3, + 2965: 0x60D4, + 2966: 0x60D6, + 2967: 0x60D7, + 2968: 0x60D9, + 2969: 0x60DB, + 2970: 0x60DE, + 2971: 0x60E1, + 2972: 0x60E2, + 2973: 0x60E3, + 2974: 0x60E4, + 2975: 0x60E5, + 2976: 0x60EA, + 2977: 0x60F1, + 2978: 0x60F2, + 2979: 0x60F5, + 2980: 0x60F7, + 2981: 0x60F8, + 2982: 0x60FB, + 2983: 0x60FC, + 2984: 0x60FD, + 2985: 0x60FE, + 2986: 0x60FF, + 2987: 0x6102, + 2988: 0x6103, + 2989: 0x6104, + 2990: 0x6105, + 2991: 0x6107, + 2992: 0x610A, + 2993: 0x610B, + 2994: 0x610C, + 2995: 0x6110, + 2996: 0x6111, + 2997: 0x6112, + 2998: 0x6113, + 2999: 0x6114, + 3000: 0x6116, + 3001: 0x6117, + 3002: 0x6118, + 3003: 0x6119, + 3004: 0x611B, + 3005: 0x611C, + 3006: 0x611D, + 3007: 0x611E, + 3008: 0x6121, + 3009: 0x6122, + 3010: 0x6125, + 3011: 0x6128, + 3012: 0x6129, + 3013: 0x612A, + 3014: 0x612C, + 3015: 0x612D, + 3016: 0x612E, + 3017: 0x612F, + 3018: 0x6130, + 3019: 0x6131, + 3020: 0x6132, + 3021: 0x6133, + 3022: 0x6134, + 3023: 0x6135, + 3024: 0x6136, + 3025: 0x6137, + 3026: 0x6138, + 3027: 0x6139, + 3028: 0x613A, + 3029: 0x613B, + 3030: 0x613C, + 3031: 0x613D, + 3032: 0x613E, + 3033: 0x6140, + 3034: 0x6141, + 3035: 0x6142, + 3036: 0x6143, + 3037: 0x6144, + 3038: 0x6145, + 3039: 0x6146, + 3040: 0x6147, + 3041: 0x6149, + 3042: 0x614B, + 3043: 0x614D, + 3044: 0x614F, + 3045: 0x6150, + 3046: 0x6152, + 3047: 0x6153, + 3048: 0x6154, + 3049: 0x6156, + 3050: 0x6157, + 3051: 0x6158, + 3052: 0x6159, + 3053: 0x615A, + 3054: 0x615B, + 3055: 0x615C, + 3056: 0x615E, + 3057: 0x615F, + 3058: 0x6160, + 3059: 0x6161, + 3060: 0x6163, + 3061: 0x6164, + 3062: 0x6165, + 3063: 0x6166, + 3064: 0x6169, + 3065: 0x616A, + 3066: 0x616B, + 3067: 0x616C, + 3068: 0x616D, + 3069: 0x616E, + 3070: 0x616F, + 3071: 0x6171, + 3072: 0x6172, + 3073: 0x6173, + 3074: 0x6174, + 3075: 0x6176, + 3076: 0x6178, + 3077: 0x6179, + 3078: 0x617A, + 3079: 0x617B, + 3080: 0x617C, + 3081: 0x617D, + 3082: 0x617E, + 3083: 0x617F, + 3084: 0x6180, + 3085: 0x6181, + 3086: 0x6182, + 3087: 0x6183, + 3088: 0x6184, + 3089: 0x6185, + 3090: 0x6186, + 3091: 0x6187, + 3092: 0x6188, + 3093: 0x6189, + 3094: 0x618A, + 3095: 0x618C, + 3096: 0x618D, + 3097: 0x618F, + 3098: 0x6190, + 3099: 0x6191, + 3100: 0x6192, + 3101: 0x6193, + 3102: 0x6195, + 3103: 0x6196, + 3104: 0x6197, + 3105: 0x6198, + 3106: 0x6199, + 3107: 0x619A, + 3108: 0x619B, + 3109: 0x619C, + 3110: 0x619E, + 3111: 0x619F, + 3112: 0x61A0, + 3113: 0x61A1, + 3114: 0x61A2, + 3115: 0x61A3, + 3116: 0x61A4, + 3117: 0x61A5, + 3118: 0x61A6, + 3119: 0x61AA, + 3120: 0x61AB, + 3121: 0x61AD, + 3122: 0x61AE, + 3123: 0x61AF, + 3124: 0x61B0, + 3125: 0x61B1, + 3126: 0x61B2, + 3127: 0x61B3, + 3128: 0x61B4, + 3129: 0x61B5, + 3130: 0x61B6, + 3131: 0x61B8, + 3132: 0x61B9, + 3133: 0x61BA, + 3134: 0x61BB, + 3135: 0x61BC, + 3136: 0x61BD, + 3137: 0x61BF, + 3138: 0x61C0, + 3139: 0x61C1, + 3140: 0x61C3, + 3141: 0x61C4, + 3142: 0x61C5, + 3143: 0x61C6, + 3144: 0x61C7, + 3145: 0x61C9, + 3146: 0x61CC, + 3147: 0x61CD, + 3148: 0x61CE, + 3149: 0x61CF, + 3150: 0x61D0, + 3151: 0x61D3, + 3152: 0x61D5, + 3153: 0x61D6, + 3154: 0x61D7, + 3155: 0x61D8, + 3156: 0x61D9, + 3157: 0x61DA, + 3158: 0x61DB, + 3159: 0x61DC, + 3160: 0x61DD, + 3161: 0x61DE, + 3162: 0x61DF, + 3163: 0x61E0, + 3164: 0x61E1, + 3165: 0x61E2, + 3166: 0x61E3, + 3167: 0x61E4, + 3168: 0x61E5, + 3169: 0x61E7, + 3170: 0x61E8, + 3171: 0x61E9, + 3172: 0x61EA, + 3173: 0x61EB, + 3174: 0x61EC, + 3175: 0x61ED, + 3176: 0x61EE, + 3177: 0x61EF, + 3178: 0x61F0, + 3179: 0x61F1, + 3180: 0x61F2, + 3181: 0x61F3, + 3182: 0x61F4, + 3183: 0x61F6, + 3184: 0x61F7, + 3185: 0x61F8, + 3186: 0x61F9, + 3187: 0x61FA, + 3188: 0x61FB, + 3189: 0x61FC, + 3190: 0x61FD, + 3191: 0x61FE, + 3192: 0x6200, + 3193: 0x6201, + 3194: 0x6202, + 3195: 0x6203, + 3196: 0x6204, + 3197: 0x6205, + 3198: 0x6207, + 3199: 0x6209, + 3200: 0x6213, + 3201: 0x6214, + 3202: 0x6219, + 3203: 0x621C, + 3204: 0x621D, + 3205: 0x621E, + 3206: 0x6220, + 3207: 0x6223, + 3208: 0x6226, + 3209: 0x6227, + 3210: 0x6228, + 3211: 0x6229, + 3212: 0x622B, + 3213: 0x622D, + 3214: 0x622F, + 3215: 0x6230, + 3216: 0x6231, + 3217: 0x6232, + 3218: 0x6235, + 3219: 0x6236, + 3220: 0x6238, + 3221: 0x6239, + 3222: 0x623A, + 3223: 0x623B, + 3224: 0x623C, + 3225: 0x6242, + 3226: 0x6244, + 3227: 0x6245, + 3228: 0x6246, + 3229: 0x624A, + 3230: 0x624F, + 3231: 0x6250, + 3232: 0x6255, + 3233: 0x6256, + 3234: 0x6257, + 3235: 0x6259, + 3236: 0x625A, + 3237: 0x625C, + 3238: 0x625D, + 3239: 0x625E, + 3240: 0x625F, + 3241: 0x6260, + 3242: 0x6261, + 3243: 0x6262, + 3244: 0x6264, + 3245: 0x6265, + 3246: 0x6268, + 3247: 0x6271, + 3248: 0x6272, + 3249: 0x6274, + 3250: 0x6275, + 3251: 0x6277, + 3252: 0x6278, + 3253: 0x627A, + 3254: 0x627B, + 3255: 0x627D, + 3256: 0x6281, + 3257: 0x6282, + 3258: 0x6283, + 3259: 0x6285, + 3260: 0x6286, + 3261: 0x6287, + 3262: 0x6288, + 3263: 0x628B, + 3264: 0x628C, + 3265: 0x628D, + 3266: 0x628E, + 3267: 0x628F, + 3268: 0x6290, + 3269: 0x6294, + 3270: 0x6299, + 3271: 0x629C, + 3272: 0x629D, + 3273: 0x629E, + 3274: 0x62A3, + 3275: 0x62A6, + 3276: 0x62A7, + 3277: 0x62A9, + 3278: 0x62AA, + 3279: 0x62AD, + 3280: 0x62AE, + 3281: 0x62AF, + 3282: 0x62B0, + 3283: 0x62B2, + 3284: 0x62B3, + 3285: 0x62B4, + 3286: 0x62B6, + 3287: 0x62B7, + 3288: 0x62B8, + 3289: 0x62BA, + 3290: 0x62BE, + 3291: 0x62C0, + 3292: 0x62C1, + 3293: 0x62C3, + 3294: 0x62CB, + 3295: 0x62CF, + 3296: 0x62D1, + 3297: 0x62D5, + 3298: 0x62DD, + 3299: 0x62DE, + 3300: 0x62E0, + 3301: 0x62E1, + 3302: 0x62E4, + 3303: 0x62EA, + 3304: 0x62EB, + 3305: 0x62F0, + 3306: 0x62F2, + 3307: 0x62F5, + 3308: 0x62F8, + 3309: 0x62F9, + 3310: 0x62FA, + 3311: 0x62FB, + 3312: 0x6300, + 3313: 0x6303, + 3314: 0x6304, + 3315: 0x6305, + 3316: 0x6306, + 3317: 0x630A, + 3318: 0x630B, + 3319: 0x630C, + 3320: 0x630D, + 3321: 0x630F, + 3322: 0x6310, + 3323: 0x6312, + 3324: 0x6313, + 3325: 0x6314, + 3326: 0x6315, + 3327: 0x6317, + 3328: 0x6318, + 3329: 0x6319, + 3330: 0x631C, + 3331: 0x6326, + 3332: 0x6327, + 3333: 0x6329, + 3334: 0x632C, + 3335: 0x632D, + 3336: 0x632E, + 3337: 0x6330, + 3338: 0x6331, + 3339: 0x6333, + 3340: 0x6334, + 3341: 0x6335, + 3342: 0x6336, + 3343: 0x6337, + 3344: 0x6338, + 3345: 0x633B, + 3346: 0x633C, + 3347: 0x633E, + 3348: 0x633F, + 3349: 0x6340, + 3350: 0x6341, + 3351: 0x6344, + 3352: 0x6347, + 3353: 0x6348, + 3354: 0x634A, + 3355: 0x6351, + 3356: 0x6352, + 3357: 0x6353, + 3358: 0x6354, + 3359: 0x6356, + 3360: 0x6357, + 3361: 0x6358, + 3362: 0x6359, + 3363: 0x635A, + 3364: 0x635B, + 3365: 0x635C, + 3366: 0x635D, + 3367: 0x6360, + 3368: 0x6364, + 3369: 0x6365, + 3370: 0x6366, + 3371: 0x6368, + 3372: 0x636A, + 3373: 0x636B, + 3374: 0x636C, + 3375: 0x636F, + 3376: 0x6370, + 3377: 0x6372, + 3378: 0x6373, + 3379: 0x6374, + 3380: 0x6375, + 3381: 0x6378, + 3382: 0x6379, + 3383: 0x637C, + 3384: 0x637D, + 3385: 0x637E, + 3386: 0x637F, + 3387: 0x6381, + 3388: 0x6383, + 3389: 0x6384, + 3390: 0x6385, + 3391: 0x6386, + 3392: 0x638B, + 3393: 0x638D, + 3394: 0x6391, + 3395: 0x6393, + 3396: 0x6394, + 3397: 0x6395, + 3398: 0x6397, + 3399: 0x6399, + 3400: 0x639A, + 3401: 0x639B, + 3402: 0x639C, + 3403: 0x639D, + 3404: 0x639E, + 3405: 0x639F, + 3406: 0x63A1, + 3407: 0x63A4, + 3408: 0x63A6, + 3409: 0x63AB, + 3410: 0x63AF, + 3411: 0x63B1, + 3412: 0x63B2, + 3413: 0x63B5, + 3414: 0x63B6, + 3415: 0x63B9, + 3416: 0x63BB, + 3417: 0x63BD, + 3418: 0x63BF, + 3419: 0x63C0, + 3420: 0x63C1, + 3421: 0x63C2, + 3422: 0x63C3, + 3423: 0x63C5, + 3424: 0x63C7, + 3425: 0x63C8, + 3426: 0x63CA, + 3427: 0x63CB, + 3428: 0x63CC, + 3429: 0x63D1, + 3430: 0x63D3, + 3431: 0x63D4, + 3432: 0x63D5, + 3433: 0x63D7, + 3434: 0x63D8, + 3435: 0x63D9, + 3436: 0x63DA, + 3437: 0x63DB, + 3438: 0x63DC, + 3439: 0x63DD, + 3440: 0x63DF, + 3441: 0x63E2, + 3442: 0x63E4, + 3443: 0x63E5, + 3444: 0x63E6, + 3445: 0x63E7, + 3446: 0x63E8, + 3447: 0x63EB, + 3448: 0x63EC, + 3449: 0x63EE, + 3450: 0x63EF, + 3451: 0x63F0, + 3452: 0x63F1, + 3453: 0x63F3, + 3454: 0x63F5, + 3455: 0x63F7, + 3456: 0x63F9, + 3457: 0x63FA, + 3458: 0x63FB, + 3459: 0x63FC, + 3460: 0x63FE, + 3461: 0x6403, + 3462: 0x6404, + 3463: 0x6406, + 3464: 0x6407, + 3465: 0x6408, + 3466: 0x6409, + 3467: 0x640A, + 3468: 0x640D, + 3469: 0x640E, + 3470: 0x6411, + 3471: 0x6412, + 3472: 0x6415, + 3473: 0x6416, + 3474: 0x6417, + 3475: 0x6418, + 3476: 0x6419, + 3477: 0x641A, + 3478: 0x641D, + 3479: 0x641F, + 3480: 0x6422, + 3481: 0x6423, + 3482: 0x6424, + 3483: 0x6425, + 3484: 0x6427, + 3485: 0x6428, + 3486: 0x6429, + 3487: 0x642B, + 3488: 0x642E, + 3489: 0x642F, + 3490: 0x6430, + 3491: 0x6431, + 3492: 0x6432, + 3493: 0x6433, + 3494: 0x6435, + 3495: 0x6436, + 3496: 0x6437, + 3497: 0x6438, + 3498: 0x6439, + 3499: 0x643B, + 3500: 0x643C, + 3501: 0x643E, + 3502: 0x6440, + 3503: 0x6442, + 3504: 0x6443, + 3505: 0x6449, + 3506: 0x644B, + 3507: 0x644C, + 3508: 0x644D, + 3509: 0x644E, + 3510: 0x644F, + 3511: 0x6450, + 3512: 0x6451, + 3513: 0x6453, + 3514: 0x6455, + 3515: 0x6456, + 3516: 0x6457, + 3517: 0x6459, + 3518: 0x645A, + 3519: 0x645B, + 3520: 0x645C, + 3521: 0x645D, + 3522: 0x645F, + 3523: 0x6460, + 3524: 0x6461, + 3525: 0x6462, + 3526: 0x6463, + 3527: 0x6464, + 3528: 0x6465, + 3529: 0x6466, + 3530: 0x6468, + 3531: 0x646A, + 3532: 0x646B, + 3533: 0x646C, + 3534: 0x646E, + 3535: 0x646F, + 3536: 0x6470, + 3537: 0x6471, + 3538: 0x6472, + 3539: 0x6473, + 3540: 0x6474, + 3541: 0x6475, + 3542: 0x6476, + 3543: 0x6477, + 3544: 0x647B, + 3545: 0x647C, + 3546: 0x647D, + 3547: 0x647E, + 3548: 0x647F, + 3549: 0x6480, + 3550: 0x6481, + 3551: 0x6483, + 3552: 0x6486, + 3553: 0x6488, + 3554: 0x6489, + 3555: 0x648A, + 3556: 0x648B, + 3557: 0x648C, + 3558: 0x648D, + 3559: 0x648E, + 3560: 0x648F, + 3561: 0x6490, + 3562: 0x6493, + 3563: 0x6494, + 3564: 0x6497, + 3565: 0x6498, + 3566: 0x649A, + 3567: 0x649B, + 3568: 0x649C, + 3569: 0x649D, + 3570: 0x649F, + 3571: 0x64A0, + 3572: 0x64A1, + 3573: 0x64A2, + 3574: 0x64A3, + 3575: 0x64A5, + 3576: 0x64A6, + 3577: 0x64A7, + 3578: 0x64A8, + 3579: 0x64AA, + 3580: 0x64AB, + 3581: 0x64AF, + 3582: 0x64B1, + 3583: 0x64B2, + 3584: 0x64B3, + 3585: 0x64B4, + 3586: 0x64B6, + 3587: 0x64B9, + 3588: 0x64BB, + 3589: 0x64BD, + 3590: 0x64BE, + 3591: 0x64BF, + 3592: 0x64C1, + 3593: 0x64C3, + 3594: 0x64C4, + 3595: 0x64C6, + 3596: 0x64C7, + 3597: 0x64C8, + 3598: 0x64C9, + 3599: 0x64CA, + 3600: 0x64CB, + 3601: 0x64CC, + 3602: 0x64CF, + 3603: 0x64D1, + 3604: 0x64D3, + 3605: 0x64D4, + 3606: 0x64D5, + 3607: 0x64D6, + 3608: 0x64D9, + 3609: 0x64DA, + 3610: 0x64DB, + 3611: 0x64DC, + 3612: 0x64DD, + 3613: 0x64DF, + 3614: 0x64E0, + 3615: 0x64E1, + 3616: 0x64E3, + 3617: 0x64E5, + 3618: 0x64E7, + 3619: 0x64E8, + 3620: 0x64E9, + 3621: 0x64EA, + 3622: 0x64EB, + 3623: 0x64EC, + 3624: 0x64ED, + 3625: 0x64EE, + 3626: 0x64EF, + 3627: 0x64F0, + 3628: 0x64F1, + 3629: 0x64F2, + 3630: 0x64F3, + 3631: 0x64F4, + 3632: 0x64F5, + 3633: 0x64F6, + 3634: 0x64F7, + 3635: 0x64F8, + 3636: 0x64F9, + 3637: 0x64FA, + 3638: 0x64FB, + 3639: 0x64FC, + 3640: 0x64FD, + 3641: 0x64FE, + 3642: 0x64FF, + 3643: 0x6501, + 3644: 0x6502, + 3645: 0x6503, + 3646: 0x6504, + 3647: 0x6505, + 3648: 0x6506, + 3649: 0x6507, + 3650: 0x6508, + 3651: 0x650A, + 3652: 0x650B, + 3653: 0x650C, + 3654: 0x650D, + 3655: 0x650E, + 3656: 0x650F, + 3657: 0x6510, + 3658: 0x6511, + 3659: 0x6513, + 3660: 0x6514, + 3661: 0x6515, + 3662: 0x6516, + 3663: 0x6517, + 3664: 0x6519, + 3665: 0x651A, + 3666: 0x651B, + 3667: 0x651C, + 3668: 0x651D, + 3669: 0x651E, + 3670: 0x651F, + 3671: 0x6520, + 3672: 0x6521, + 3673: 0x6522, + 3674: 0x6523, + 3675: 0x6524, + 3676: 0x6526, + 3677: 0x6527, + 3678: 0x6528, + 3679: 0x6529, + 3680: 0x652A, + 3681: 0x652C, + 3682: 0x652D, + 3683: 0x6530, + 3684: 0x6531, + 3685: 0x6532, + 3686: 0x6533, + 3687: 0x6537, + 3688: 0x653A, + 3689: 0x653C, + 3690: 0x653D, + 3691: 0x6540, + 3692: 0x6541, + 3693: 0x6542, + 3694: 0x6543, + 3695: 0x6544, + 3696: 0x6546, + 3697: 0x6547, + 3698: 0x654A, + 3699: 0x654B, + 3700: 0x654D, + 3701: 0x654E, + 3702: 0x6550, + 3703: 0x6552, + 3704: 0x6553, + 3705: 0x6554, + 3706: 0x6557, + 3707: 0x6558, + 3708: 0x655A, + 3709: 0x655C, + 3710: 0x655F, + 3711: 0x6560, + 3712: 0x6561, + 3713: 0x6564, + 3714: 0x6565, + 3715: 0x6567, + 3716: 0x6568, + 3717: 0x6569, + 3718: 0x656A, + 3719: 0x656D, + 3720: 0x656E, + 3721: 0x656F, + 3722: 0x6571, + 3723: 0x6573, + 3724: 0x6575, + 3725: 0x6576, + 3726: 0x6578, + 3727: 0x6579, + 3728: 0x657A, + 3729: 0x657B, + 3730: 0x657C, + 3731: 0x657D, + 3732: 0x657E, + 3733: 0x657F, + 3734: 0x6580, + 3735: 0x6581, + 3736: 0x6582, + 3737: 0x6583, + 3738: 0x6584, + 3739: 0x6585, + 3740: 0x6586, + 3741: 0x6588, + 3742: 0x6589, + 3743: 0x658A, + 3744: 0x658D, + 3745: 0x658E, + 3746: 0x658F, + 3747: 0x6592, + 3748: 0x6594, + 3749: 0x6595, + 3750: 0x6596, + 3751: 0x6598, + 3752: 0x659A, + 3753: 0x659D, + 3754: 0x659E, + 3755: 0x65A0, + 3756: 0x65A2, + 3757: 0x65A3, + 3758: 0x65A6, + 3759: 0x65A8, + 3760: 0x65AA, + 3761: 0x65AC, + 3762: 0x65AE, + 3763: 0x65B1, + 3764: 0x65B2, + 3765: 0x65B3, + 3766: 0x65B4, + 3767: 0x65B5, + 3768: 0x65B6, + 3769: 0x65B7, + 3770: 0x65B8, + 3771: 0x65BA, + 3772: 0x65BB, + 3773: 0x65BE, + 3774: 0x65BF, + 3775: 0x65C0, + 3776: 0x65C2, + 3777: 0x65C7, + 3778: 0x65C8, + 3779: 0x65C9, + 3780: 0x65CA, + 3781: 0x65CD, + 3782: 0x65D0, + 3783: 0x65D1, + 3784: 0x65D3, + 3785: 0x65D4, + 3786: 0x65D5, + 3787: 0x65D8, + 3788: 0x65D9, + 3789: 0x65DA, + 3790: 0x65DB, + 3791: 0x65DC, + 3792: 0x65DD, + 3793: 0x65DE, + 3794: 0x65DF, + 3795: 0x65E1, + 3796: 0x65E3, + 3797: 0x65E4, + 3798: 0x65EA, + 3799: 0x65EB, + 3800: 0x65F2, + 3801: 0x65F3, + 3802: 0x65F4, + 3803: 0x65F5, + 3804: 0x65F8, + 3805: 0x65F9, + 3806: 0x65FB, + 3807: 0x65FC, + 3808: 0x65FD, + 3809: 0x65FE, + 3810: 0x65FF, + 3811: 0x6601, + 3812: 0x6604, + 3813: 0x6605, + 3814: 0x6607, + 3815: 0x6608, + 3816: 0x6609, + 3817: 0x660B, + 3818: 0x660D, + 3819: 0x6610, + 3820: 0x6611, + 3821: 0x6612, + 3822: 0x6616, + 3823: 0x6617, + 3824: 0x6618, + 3825: 0x661A, + 3826: 0x661B, + 3827: 0x661C, + 3828: 0x661E, + 3829: 0x6621, + 3830: 0x6622, + 3831: 0x6623, + 3832: 0x6624, + 3833: 0x6626, + 3834: 0x6629, + 3835: 0x662A, + 3836: 0x662B, + 3837: 0x662C, + 3838: 0x662E, + 3839: 0x6630, + 3840: 0x6632, + 3841: 0x6633, + 3842: 0x6637, + 3843: 0x6638, + 3844: 0x6639, + 3845: 0x663A, + 3846: 0x663B, + 3847: 0x663D, + 3848: 0x663F, + 3849: 0x6640, + 3850: 0x6642, + 3851: 0x6644, + 3852: 0x6645, + 3853: 0x6646, + 3854: 0x6647, + 3855: 0x6648, + 3856: 0x6649, + 3857: 0x664A, + 3858: 0x664D, + 3859: 0x664E, + 3860: 0x6650, + 3861: 0x6651, + 3862: 0x6658, + 3863: 0x6659, + 3864: 0x665B, + 3865: 0x665C, + 3866: 0x665D, + 3867: 0x665E, + 3868: 0x6660, + 3869: 0x6662, + 3870: 0x6663, + 3871: 0x6665, + 3872: 0x6667, + 3873: 0x6669, + 3874: 0x666A, + 3875: 0x666B, + 3876: 0x666C, + 3877: 0x666D, + 3878: 0x6671, + 3879: 0x6672, + 3880: 0x6673, + 3881: 0x6675, + 3882: 0x6678, + 3883: 0x6679, + 3884: 0x667B, + 3885: 0x667C, + 3886: 0x667D, + 3887: 0x667F, + 3888: 0x6680, + 3889: 0x6681, + 3890: 0x6683, + 3891: 0x6685, + 3892: 0x6686, + 3893: 0x6688, + 3894: 0x6689, + 3895: 0x668A, + 3896: 0x668B, + 3897: 0x668D, + 3898: 0x668E, + 3899: 0x668F, + 3900: 0x6690, + 3901: 0x6692, + 3902: 0x6693, + 3903: 0x6694, + 3904: 0x6695, + 3905: 0x6698, + 3906: 0x6699, + 3907: 0x669A, + 3908: 0x669B, + 3909: 0x669C, + 3910: 0x669E, + 3911: 0x669F, + 3912: 0x66A0, + 3913: 0x66A1, + 3914: 0x66A2, + 3915: 0x66A3, + 3916: 0x66A4, + 3917: 0x66A5, + 3918: 0x66A6, + 3919: 0x66A9, + 3920: 0x66AA, + 3921: 0x66AB, + 3922: 0x66AC, + 3923: 0x66AD, + 3924: 0x66AF, + 3925: 0x66B0, + 3926: 0x66B1, + 3927: 0x66B2, + 3928: 0x66B3, + 3929: 0x66B5, + 3930: 0x66B6, + 3931: 0x66B7, + 3932: 0x66B8, + 3933: 0x66BA, + 3934: 0x66BB, + 3935: 0x66BC, + 3936: 0x66BD, + 3937: 0x66BF, + 3938: 0x66C0, + 3939: 0x66C1, + 3940: 0x66C2, + 3941: 0x66C3, + 3942: 0x66C4, + 3943: 0x66C5, + 3944: 0x66C6, + 3945: 0x66C7, + 3946: 0x66C8, + 3947: 0x66C9, + 3948: 0x66CA, + 3949: 0x66CB, + 3950: 0x66CC, + 3951: 0x66CD, + 3952: 0x66CE, + 3953: 0x66CF, + 3954: 0x66D0, + 3955: 0x66D1, + 3956: 0x66D2, + 3957: 0x66D3, + 3958: 0x66D4, + 3959: 0x66D5, + 3960: 0x66D6, + 3961: 0x66D7, + 3962: 0x66D8, + 3963: 0x66DA, + 3964: 0x66DE, + 3965: 0x66DF, + 3966: 0x66E0, + 3967: 0x66E1, + 3968: 0x66E2, + 3969: 0x66E3, + 3970: 0x66E4, + 3971: 0x66E5, + 3972: 0x66E7, + 3973: 0x66E8, + 3974: 0x66EA, + 3975: 0x66EB, + 3976: 0x66EC, + 3977: 0x66ED, + 3978: 0x66EE, + 3979: 0x66EF, + 3980: 0x66F1, + 3981: 0x66F5, + 3982: 0x66F6, + 3983: 0x66F8, + 3984: 0x66FA, + 3985: 0x66FB, + 3986: 0x66FD, + 3987: 0x6701, + 3988: 0x6702, + 3989: 0x6703, + 3990: 0x6704, + 3991: 0x6705, + 3992: 0x6706, + 3993: 0x6707, + 3994: 0x670C, + 3995: 0x670E, + 3996: 0x670F, + 3997: 0x6711, + 3998: 0x6712, + 3999: 0x6713, + 4000: 0x6716, + 4001: 0x6718, + 4002: 0x6719, + 4003: 0x671A, + 4004: 0x671C, + 4005: 0x671E, + 4006: 0x6720, + 4007: 0x6721, + 4008: 0x6722, + 4009: 0x6723, + 4010: 0x6724, + 4011: 0x6725, + 4012: 0x6727, + 4013: 0x6729, + 4014: 0x672E, + 4015: 0x6730, + 4016: 0x6732, + 4017: 0x6733, + 4018: 0x6736, + 4019: 0x6737, + 4020: 0x6738, + 4021: 0x6739, + 4022: 0x673B, + 4023: 0x673C, + 4024: 0x673E, + 4025: 0x673F, + 4026: 0x6741, + 4027: 0x6744, + 4028: 0x6745, + 4029: 0x6747, + 4030: 0x674A, + 4031: 0x674B, + 4032: 0x674D, + 4033: 0x6752, + 4034: 0x6754, + 4035: 0x6755, + 4036: 0x6757, + 4037: 0x6758, + 4038: 0x6759, + 4039: 0x675A, + 4040: 0x675B, + 4041: 0x675D, + 4042: 0x6762, + 4043: 0x6763, + 4044: 0x6764, + 4045: 0x6766, + 4046: 0x6767, + 4047: 0x676B, + 4048: 0x676C, + 4049: 0x676E, + 4050: 0x6771, + 4051: 0x6774, + 4052: 0x6776, + 4053: 0x6778, + 4054: 0x6779, + 4055: 0x677A, + 4056: 0x677B, + 4057: 0x677D, + 4058: 0x6780, + 4059: 0x6782, + 4060: 0x6783, + 4061: 0x6785, + 4062: 0x6786, + 4063: 0x6788, + 4064: 0x678A, + 4065: 0x678C, + 4066: 0x678D, + 4067: 0x678E, + 4068: 0x678F, + 4069: 0x6791, + 4070: 0x6792, + 4071: 0x6793, + 4072: 0x6794, + 4073: 0x6796, + 4074: 0x6799, + 4075: 0x679B, + 4076: 0x679F, + 4077: 0x67A0, + 4078: 0x67A1, + 4079: 0x67A4, + 4080: 0x67A6, + 4081: 0x67A9, + 4082: 0x67AC, + 4083: 0x67AE, + 4084: 0x67B1, + 4085: 0x67B2, + 4086: 0x67B4, + 4087: 0x67B9, + 4088: 0x67BA, + 4089: 0x67BB, + 4090: 0x67BC, + 4091: 0x67BD, + 4092: 0x67BE, + 4093: 0x67BF, + 4094: 0x67C0, + 4095: 0x67C2, + 4096: 0x67C5, + 4097: 0x67C6, + 4098: 0x67C7, + 4099: 0x67C8, + 4100: 0x67C9, + 4101: 0x67CA, + 4102: 0x67CB, + 4103: 0x67CC, + 4104: 0x67CD, + 4105: 0x67CE, + 4106: 0x67D5, + 4107: 0x67D6, + 4108: 0x67D7, + 4109: 0x67DB, + 4110: 0x67DF, + 4111: 0x67E1, + 4112: 0x67E3, + 4113: 0x67E4, + 4114: 0x67E6, + 4115: 0x67E7, + 4116: 0x67E8, + 4117: 0x67EA, + 4118: 0x67EB, + 4119: 0x67ED, + 4120: 0x67EE, + 4121: 0x67F2, + 4122: 0x67F5, + 4123: 0x67F6, + 4124: 0x67F7, + 4125: 0x67F8, + 4126: 0x67F9, + 4127: 0x67FA, + 4128: 0x67FB, + 4129: 0x67FC, + 4130: 0x67FE, + 4131: 0x6801, + 4132: 0x6802, + 4133: 0x6803, + 4134: 0x6804, + 4135: 0x6806, + 4136: 0x680D, + 4137: 0x6810, + 4138: 0x6812, + 4139: 0x6814, + 4140: 0x6815, + 4141: 0x6818, + 4142: 0x6819, + 4143: 0x681A, + 4144: 0x681B, + 4145: 0x681C, + 4146: 0x681E, + 4147: 0x681F, + 4148: 0x6820, + 4149: 0x6822, + 4150: 0x6823, + 4151: 0x6824, + 4152: 0x6825, + 4153: 0x6826, + 4154: 0x6827, + 4155: 0x6828, + 4156: 0x682B, + 4157: 0x682C, + 4158: 0x682D, + 4159: 0x682E, + 4160: 0x682F, + 4161: 0x6830, + 4162: 0x6831, + 4163: 0x6834, + 4164: 0x6835, + 4165: 0x6836, + 4166: 0x683A, + 4167: 0x683B, + 4168: 0x683F, + 4169: 0x6847, + 4170: 0x684B, + 4171: 0x684D, + 4172: 0x684F, + 4173: 0x6852, + 4174: 0x6856, + 4175: 0x6857, + 4176: 0x6858, + 4177: 0x6859, + 4178: 0x685A, + 4179: 0x685B, + 4180: 0x685C, + 4181: 0x685D, + 4182: 0x685E, + 4183: 0x685F, + 4184: 0x686A, + 4185: 0x686C, + 4186: 0x686D, + 4187: 0x686E, + 4188: 0x686F, + 4189: 0x6870, + 4190: 0x6871, + 4191: 0x6872, + 4192: 0x6873, + 4193: 0x6875, + 4194: 0x6878, + 4195: 0x6879, + 4196: 0x687A, + 4197: 0x687B, + 4198: 0x687C, + 4199: 0x687D, + 4200: 0x687E, + 4201: 0x687F, + 4202: 0x6880, + 4203: 0x6882, + 4204: 0x6884, + 4205: 0x6887, + 4206: 0x6888, + 4207: 0x6889, + 4208: 0x688A, + 4209: 0x688B, + 4210: 0x688C, + 4211: 0x688D, + 4212: 0x688E, + 4213: 0x6890, + 4214: 0x6891, + 4215: 0x6892, + 4216: 0x6894, + 4217: 0x6895, + 4218: 0x6896, + 4219: 0x6898, + 4220: 0x6899, + 4221: 0x689A, + 4222: 0x689B, + 4223: 0x689C, + 4224: 0x689D, + 4225: 0x689E, + 4226: 0x689F, + 4227: 0x68A0, + 4228: 0x68A1, + 4229: 0x68A3, + 4230: 0x68A4, + 4231: 0x68A5, + 4232: 0x68A9, + 4233: 0x68AA, + 4234: 0x68AB, + 4235: 0x68AC, + 4236: 0x68AE, + 4237: 0x68B1, + 4238: 0x68B2, + 4239: 0x68B4, + 4240: 0x68B6, + 4241: 0x68B7, + 4242: 0x68B8, + 4243: 0x68B9, + 4244: 0x68BA, + 4245: 0x68BB, + 4246: 0x68BC, + 4247: 0x68BD, + 4248: 0x68BE, + 4249: 0x68BF, + 4250: 0x68C1, + 4251: 0x68C3, + 4252: 0x68C4, + 4253: 0x68C5, + 4254: 0x68C6, + 4255: 0x68C7, + 4256: 0x68C8, + 4257: 0x68CA, + 4258: 0x68CC, + 4259: 0x68CE, + 4260: 0x68CF, + 4261: 0x68D0, + 4262: 0x68D1, + 4263: 0x68D3, + 4264: 0x68D4, + 4265: 0x68D6, + 4266: 0x68D7, + 4267: 0x68D9, + 4268: 0x68DB, + 4269: 0x68DC, + 4270: 0x68DD, + 4271: 0x68DE, + 4272: 0x68DF, + 4273: 0x68E1, + 4274: 0x68E2, + 4275: 0x68E4, + 4276: 0x68E5, + 4277: 0x68E6, + 4278: 0x68E7, + 4279: 0x68E8, + 4280: 0x68E9, + 4281: 0x68EA, + 4282: 0x68EB, + 4283: 0x68EC, + 4284: 0x68ED, + 4285: 0x68EF, + 4286: 0x68F2, + 4287: 0x68F3, + 4288: 0x68F4, + 4289: 0x68F6, + 4290: 0x68F7, + 4291: 0x68F8, + 4292: 0x68FB, + 4293: 0x68FD, + 4294: 0x68FE, + 4295: 0x68FF, + 4296: 0x6900, + 4297: 0x6902, + 4298: 0x6903, + 4299: 0x6904, + 4300: 0x6906, + 4301: 0x6907, + 4302: 0x6908, + 4303: 0x6909, + 4304: 0x690A, + 4305: 0x690C, + 4306: 0x690F, + 4307: 0x6911, + 4308: 0x6913, + 4309: 0x6914, + 4310: 0x6915, + 4311: 0x6916, + 4312: 0x6917, + 4313: 0x6918, + 4314: 0x6919, + 4315: 0x691A, + 4316: 0x691B, + 4317: 0x691C, + 4318: 0x691D, + 4319: 0x691E, + 4320: 0x6921, + 4321: 0x6922, + 4322: 0x6923, + 4323: 0x6925, + 4324: 0x6926, + 4325: 0x6927, + 4326: 0x6928, + 4327: 0x6929, + 4328: 0x692A, + 4329: 0x692B, + 4330: 0x692C, + 4331: 0x692E, + 4332: 0x692F, + 4333: 0x6931, + 4334: 0x6932, + 4335: 0x6933, + 4336: 0x6935, + 4337: 0x6936, + 4338: 0x6937, + 4339: 0x6938, + 4340: 0x693A, + 4341: 0x693B, + 4342: 0x693C, + 4343: 0x693E, + 4344: 0x6940, + 4345: 0x6941, + 4346: 0x6943, + 4347: 0x6944, + 4348: 0x6945, + 4349: 0x6946, + 4350: 0x6947, + 4351: 0x6948, + 4352: 0x6949, + 4353: 0x694A, + 4354: 0x694B, + 4355: 0x694C, + 4356: 0x694D, + 4357: 0x694E, + 4358: 0x694F, + 4359: 0x6950, + 4360: 0x6951, + 4361: 0x6952, + 4362: 0x6953, + 4363: 0x6955, + 4364: 0x6956, + 4365: 0x6958, + 4366: 0x6959, + 4367: 0x695B, + 4368: 0x695C, + 4369: 0x695F, + 4370: 0x6961, + 4371: 0x6962, + 4372: 0x6964, + 4373: 0x6965, + 4374: 0x6967, + 4375: 0x6968, + 4376: 0x6969, + 4377: 0x696A, + 4378: 0x696C, + 4379: 0x696D, + 4380: 0x696F, + 4381: 0x6970, + 4382: 0x6972, + 4383: 0x6973, + 4384: 0x6974, + 4385: 0x6975, + 4386: 0x6976, + 4387: 0x697A, + 4388: 0x697B, + 4389: 0x697D, + 4390: 0x697E, + 4391: 0x697F, + 4392: 0x6981, + 4393: 0x6983, + 4394: 0x6985, + 4395: 0x698A, + 4396: 0x698B, + 4397: 0x698C, + 4398: 0x698E, + 4399: 0x698F, + 4400: 0x6990, + 4401: 0x6991, + 4402: 0x6992, + 4403: 0x6993, + 4404: 0x6996, + 4405: 0x6997, + 4406: 0x6999, + 4407: 0x699A, + 4408: 0x699D, + 4409: 0x699E, + 4410: 0x699F, + 4411: 0x69A0, + 4412: 0x69A1, + 4413: 0x69A2, + 4414: 0x69A3, + 4415: 0x69A4, + 4416: 0x69A5, + 4417: 0x69A6, + 4418: 0x69A9, + 4419: 0x69AA, + 4420: 0x69AC, + 4421: 0x69AE, + 4422: 0x69AF, + 4423: 0x69B0, + 4424: 0x69B2, + 4425: 0x69B3, + 4426: 0x69B5, + 4427: 0x69B6, + 4428: 0x69B8, + 4429: 0x69B9, + 4430: 0x69BA, + 4431: 0x69BC, + 4432: 0x69BD, + 4433: 0x69BE, + 4434: 0x69BF, + 4435: 0x69C0, + 4436: 0x69C2, + 4437: 0x69C3, + 4438: 0x69C4, + 4439: 0x69C5, + 4440: 0x69C6, + 4441: 0x69C7, + 4442: 0x69C8, + 4443: 0x69C9, + 4444: 0x69CB, + 4445: 0x69CD, + 4446: 0x69CF, + 4447: 0x69D1, + 4448: 0x69D2, + 4449: 0x69D3, + 4450: 0x69D5, + 4451: 0x69D6, + 4452: 0x69D7, + 4453: 0x69D8, + 4454: 0x69D9, + 4455: 0x69DA, + 4456: 0x69DC, + 4457: 0x69DD, + 4458: 0x69DE, + 4459: 0x69E1, + 4460: 0x69E2, + 4461: 0x69E3, + 4462: 0x69E4, + 4463: 0x69E5, + 4464: 0x69E6, + 4465: 0x69E7, + 4466: 0x69E8, + 4467: 0x69E9, + 4468: 0x69EA, + 4469: 0x69EB, + 4470: 0x69EC, + 4471: 0x69EE, + 4472: 0x69EF, + 4473: 0x69F0, + 4474: 0x69F1, + 4475: 0x69F3, + 4476: 0x69F4, + 4477: 0x69F5, + 4478: 0x69F6, + 4479: 0x69F7, + 4480: 0x69F8, + 4481: 0x69F9, + 4482: 0x69FA, + 4483: 0x69FB, + 4484: 0x69FC, + 4485: 0x69FE, + 4486: 0x6A00, + 4487: 0x6A01, + 4488: 0x6A02, + 4489: 0x6A03, + 4490: 0x6A04, + 4491: 0x6A05, + 4492: 0x6A06, + 4493: 0x6A07, + 4494: 0x6A08, + 4495: 0x6A09, + 4496: 0x6A0B, + 4497: 0x6A0C, + 4498: 0x6A0D, + 4499: 0x6A0E, + 4500: 0x6A0F, + 4501: 0x6A10, + 4502: 0x6A11, + 4503: 0x6A12, + 4504: 0x6A13, + 4505: 0x6A14, + 4506: 0x6A15, + 4507: 0x6A16, + 4508: 0x6A19, + 4509: 0x6A1A, + 4510: 0x6A1B, + 4511: 0x6A1C, + 4512: 0x6A1D, + 4513: 0x6A1E, + 4514: 0x6A20, + 4515: 0x6A22, + 4516: 0x6A23, + 4517: 0x6A24, + 4518: 0x6A25, + 4519: 0x6A26, + 4520: 0x6A27, + 4521: 0x6A29, + 4522: 0x6A2B, + 4523: 0x6A2C, + 4524: 0x6A2D, + 4525: 0x6A2E, + 4526: 0x6A30, + 4527: 0x6A32, + 4528: 0x6A33, + 4529: 0x6A34, + 4530: 0x6A36, + 4531: 0x6A37, + 4532: 0x6A38, + 4533: 0x6A39, + 4534: 0x6A3A, + 4535: 0x6A3B, + 4536: 0x6A3C, + 4537: 0x6A3F, + 4538: 0x6A40, + 4539: 0x6A41, + 4540: 0x6A42, + 4541: 0x6A43, + 4542: 0x6A45, + 4543: 0x6A46, + 4544: 0x6A48, + 4545: 0x6A49, + 4546: 0x6A4A, + 4547: 0x6A4B, + 4548: 0x6A4C, + 4549: 0x6A4D, + 4550: 0x6A4E, + 4551: 0x6A4F, + 4552: 0x6A51, + 4553: 0x6A52, + 4554: 0x6A53, + 4555: 0x6A54, + 4556: 0x6A55, + 4557: 0x6A56, + 4558: 0x6A57, + 4559: 0x6A5A, + 4560: 0x6A5C, + 4561: 0x6A5D, + 4562: 0x6A5E, + 4563: 0x6A5F, + 4564: 0x6A60, + 4565: 0x6A62, + 4566: 0x6A63, + 4567: 0x6A64, + 4568: 0x6A66, + 4569: 0x6A67, + 4570: 0x6A68, + 4571: 0x6A69, + 4572: 0x6A6A, + 4573: 0x6A6B, + 4574: 0x6A6C, + 4575: 0x6A6D, + 4576: 0x6A6E, + 4577: 0x6A6F, + 4578: 0x6A70, + 4579: 0x6A72, + 4580: 0x6A73, + 4581: 0x6A74, + 4582: 0x6A75, + 4583: 0x6A76, + 4584: 0x6A77, + 4585: 0x6A78, + 4586: 0x6A7A, + 4587: 0x6A7B, + 4588: 0x6A7D, + 4589: 0x6A7E, + 4590: 0x6A7F, + 4591: 0x6A81, + 4592: 0x6A82, + 4593: 0x6A83, + 4594: 0x6A85, + 4595: 0x6A86, + 4596: 0x6A87, + 4597: 0x6A88, + 4598: 0x6A89, + 4599: 0x6A8A, + 4600: 0x6A8B, + 4601: 0x6A8C, + 4602: 0x6A8D, + 4603: 0x6A8F, + 4604: 0x6A92, + 4605: 0x6A93, + 4606: 0x6A94, + 4607: 0x6A95, + 4608: 0x6A96, + 4609: 0x6A98, + 4610: 0x6A99, + 4611: 0x6A9A, + 4612: 0x6A9B, + 4613: 0x6A9C, + 4614: 0x6A9D, + 4615: 0x6A9E, + 4616: 0x6A9F, + 4617: 0x6AA1, + 4618: 0x6AA2, + 4619: 0x6AA3, + 4620: 0x6AA4, + 4621: 0x6AA5, + 4622: 0x6AA6, + 4623: 0x6AA7, + 4624: 0x6AA8, + 4625: 0x6AAA, + 4626: 0x6AAD, + 4627: 0x6AAE, + 4628: 0x6AAF, + 4629: 0x6AB0, + 4630: 0x6AB1, + 4631: 0x6AB2, + 4632: 0x6AB3, + 4633: 0x6AB4, + 4634: 0x6AB5, + 4635: 0x6AB6, + 4636: 0x6AB7, + 4637: 0x6AB8, + 4638: 0x6AB9, + 4639: 0x6ABA, + 4640: 0x6ABB, + 4641: 0x6ABC, + 4642: 0x6ABD, + 4643: 0x6ABE, + 4644: 0x6ABF, + 4645: 0x6AC0, + 4646: 0x6AC1, + 4647: 0x6AC2, + 4648: 0x6AC3, + 4649: 0x6AC4, + 4650: 0x6AC5, + 4651: 0x6AC6, + 4652: 0x6AC7, + 4653: 0x6AC8, + 4654: 0x6AC9, + 4655: 0x6ACA, + 4656: 0x6ACB, + 4657: 0x6ACC, + 4658: 0x6ACD, + 4659: 0x6ACE, + 4660: 0x6ACF, + 4661: 0x6AD0, + 4662: 0x6AD1, + 4663: 0x6AD2, + 4664: 0x6AD3, + 4665: 0x6AD4, + 4666: 0x6AD5, + 4667: 0x6AD6, + 4668: 0x6AD7, + 4669: 0x6AD8, + 4670: 0x6AD9, + 4671: 0x6ADA, + 4672: 0x6ADB, + 4673: 0x6ADC, + 4674: 0x6ADD, + 4675: 0x6ADE, + 4676: 0x6ADF, + 4677: 0x6AE0, + 4678: 0x6AE1, + 4679: 0x6AE2, + 4680: 0x6AE3, + 4681: 0x6AE4, + 4682: 0x6AE5, + 4683: 0x6AE6, + 4684: 0x6AE7, + 4685: 0x6AE8, + 4686: 0x6AE9, + 4687: 0x6AEA, + 4688: 0x6AEB, + 4689: 0x6AEC, + 4690: 0x6AED, + 4691: 0x6AEE, + 4692: 0x6AEF, + 4693: 0x6AF0, + 4694: 0x6AF1, + 4695: 0x6AF2, + 4696: 0x6AF3, + 4697: 0x6AF4, + 4698: 0x6AF5, + 4699: 0x6AF6, + 4700: 0x6AF7, + 4701: 0x6AF8, + 4702: 0x6AF9, + 4703: 0x6AFA, + 4704: 0x6AFB, + 4705: 0x6AFC, + 4706: 0x6AFD, + 4707: 0x6AFE, + 4708: 0x6AFF, + 4709: 0x6B00, + 4710: 0x6B01, + 4711: 0x6B02, + 4712: 0x6B03, + 4713: 0x6B04, + 4714: 0x6B05, + 4715: 0x6B06, + 4716: 0x6B07, + 4717: 0x6B08, + 4718: 0x6B09, + 4719: 0x6B0A, + 4720: 0x6B0B, + 4721: 0x6B0C, + 4722: 0x6B0D, + 4723: 0x6B0E, + 4724: 0x6B0F, + 4725: 0x6B10, + 4726: 0x6B11, + 4727: 0x6B12, + 4728: 0x6B13, + 4729: 0x6B14, + 4730: 0x6B15, + 4731: 0x6B16, + 4732: 0x6B17, + 4733: 0x6B18, + 4734: 0x6B19, + 4735: 0x6B1A, + 4736: 0x6B1B, + 4737: 0x6B1C, + 4738: 0x6B1D, + 4739: 0x6B1E, + 4740: 0x6B1F, + 4741: 0x6B25, + 4742: 0x6B26, + 4743: 0x6B28, + 4744: 0x6B29, + 4745: 0x6B2A, + 4746: 0x6B2B, + 4747: 0x6B2C, + 4748: 0x6B2D, + 4749: 0x6B2E, + 4750: 0x6B2F, + 4751: 0x6B30, + 4752: 0x6B31, + 4753: 0x6B33, + 4754: 0x6B34, + 4755: 0x6B35, + 4756: 0x6B36, + 4757: 0x6B38, + 4758: 0x6B3B, + 4759: 0x6B3C, + 4760: 0x6B3D, + 4761: 0x6B3F, + 4762: 0x6B40, + 4763: 0x6B41, + 4764: 0x6B42, + 4765: 0x6B44, + 4766: 0x6B45, + 4767: 0x6B48, + 4768: 0x6B4A, + 4769: 0x6B4B, + 4770: 0x6B4D, + 4771: 0x6B4E, + 4772: 0x6B4F, + 4773: 0x6B50, + 4774: 0x6B51, + 4775: 0x6B52, + 4776: 0x6B53, + 4777: 0x6B54, + 4778: 0x6B55, + 4779: 0x6B56, + 4780: 0x6B57, + 4781: 0x6B58, + 4782: 0x6B5A, + 4783: 0x6B5B, + 4784: 0x6B5C, + 4785: 0x6B5D, + 4786: 0x6B5E, + 4787: 0x6B5F, + 4788: 0x6B60, + 4789: 0x6B61, + 4790: 0x6B68, + 4791: 0x6B69, + 4792: 0x6B6B, + 4793: 0x6B6C, + 4794: 0x6B6D, + 4795: 0x6B6E, + 4796: 0x6B6F, + 4797: 0x6B70, + 4798: 0x6B71, + 4799: 0x6B72, + 4800: 0x6B73, + 4801: 0x6B74, + 4802: 0x6B75, + 4803: 0x6B76, + 4804: 0x6B77, + 4805: 0x6B78, + 4806: 0x6B7A, + 4807: 0x6B7D, + 4808: 0x6B7E, + 4809: 0x6B7F, + 4810: 0x6B80, + 4811: 0x6B85, + 4812: 0x6B88, + 4813: 0x6B8C, + 4814: 0x6B8E, + 4815: 0x6B8F, + 4816: 0x6B90, + 4817: 0x6B91, + 4818: 0x6B94, + 4819: 0x6B95, + 4820: 0x6B97, + 4821: 0x6B98, + 4822: 0x6B99, + 4823: 0x6B9C, + 4824: 0x6B9D, + 4825: 0x6B9E, + 4826: 0x6B9F, + 4827: 0x6BA0, + 4828: 0x6BA2, + 4829: 0x6BA3, + 4830: 0x6BA4, + 4831: 0x6BA5, + 4832: 0x6BA6, + 4833: 0x6BA7, + 4834: 0x6BA8, + 4835: 0x6BA9, + 4836: 0x6BAB, + 4837: 0x6BAC, + 4838: 0x6BAD, + 4839: 0x6BAE, + 4840: 0x6BAF, + 4841: 0x6BB0, + 4842: 0x6BB1, + 4843: 0x6BB2, + 4844: 0x6BB6, + 4845: 0x6BB8, + 4846: 0x6BB9, + 4847: 0x6BBA, + 4848: 0x6BBB, + 4849: 0x6BBC, + 4850: 0x6BBD, + 4851: 0x6BBE, + 4852: 0x6BC0, + 4853: 0x6BC3, + 4854: 0x6BC4, + 4855: 0x6BC6, + 4856: 0x6BC7, + 4857: 0x6BC8, + 4858: 0x6BC9, + 4859: 0x6BCA, + 4860: 0x6BCC, + 4861: 0x6BCE, + 4862: 0x6BD0, + 4863: 0x6BD1, + 4864: 0x6BD8, + 4865: 0x6BDA, + 4866: 0x6BDC, + 4867: 0x6BDD, + 4868: 0x6BDE, + 4869: 0x6BDF, + 4870: 0x6BE0, + 4871: 0x6BE2, + 4872: 0x6BE3, + 4873: 0x6BE4, + 4874: 0x6BE5, + 4875: 0x6BE6, + 4876: 0x6BE7, + 4877: 0x6BE8, + 4878: 0x6BE9, + 4879: 0x6BEC, + 4880: 0x6BED, + 4881: 0x6BEE, + 4882: 0x6BF0, + 4883: 0x6BF1, + 4884: 0x6BF2, + 4885: 0x6BF4, + 4886: 0x6BF6, + 4887: 0x6BF7, + 4888: 0x6BF8, + 4889: 0x6BFA, + 4890: 0x6BFB, + 4891: 0x6BFC, + 4892: 0x6BFE, + 4893: 0x6BFF, + 4894: 0x6C00, + 4895: 0x6C01, + 4896: 0x6C02, + 4897: 0x6C03, + 4898: 0x6C04, + 4899: 0x6C08, + 4900: 0x6C09, + 4901: 0x6C0A, + 4902: 0x6C0B, + 4903: 0x6C0C, + 4904: 0x6C0E, + 4905: 0x6C12, + 4906: 0x6C17, + 4907: 0x6C1C, + 4908: 0x6C1D, + 4909: 0x6C1E, + 4910: 0x6C20, + 4911: 0x6C23, + 4912: 0x6C25, + 4913: 0x6C2B, + 4914: 0x6C2C, + 4915: 0x6C2D, + 4916: 0x6C31, + 4917: 0x6C33, + 4918: 0x6C36, + 4919: 0x6C37, + 4920: 0x6C39, + 4921: 0x6C3A, + 4922: 0x6C3B, + 4923: 0x6C3C, + 4924: 0x6C3E, + 4925: 0x6C3F, + 4926: 0x6C43, + 4927: 0x6C44, + 4928: 0x6C45, + 4929: 0x6C48, + 4930: 0x6C4B, + 4931: 0x6C4C, + 4932: 0x6C4D, + 4933: 0x6C4E, + 4934: 0x6C4F, + 4935: 0x6C51, + 4936: 0x6C52, + 4937: 0x6C53, + 4938: 0x6C56, + 4939: 0x6C58, + 4940: 0x6C59, + 4941: 0x6C5A, + 4942: 0x6C62, + 4943: 0x6C63, + 4944: 0x6C65, + 4945: 0x6C66, + 4946: 0x6C67, + 4947: 0x6C6B, + 4948: 0x6C6C, + 4949: 0x6C6D, + 4950: 0x6C6E, + 4951: 0x6C6F, + 4952: 0x6C71, + 4953: 0x6C73, + 4954: 0x6C75, + 4955: 0x6C77, + 4956: 0x6C78, + 4957: 0x6C7A, + 4958: 0x6C7B, + 4959: 0x6C7C, + 4960: 0x6C7F, + 4961: 0x6C80, + 4962: 0x6C84, + 4963: 0x6C87, + 4964: 0x6C8A, + 4965: 0x6C8B, + 4966: 0x6C8D, + 4967: 0x6C8E, + 4968: 0x6C91, + 4969: 0x6C92, + 4970: 0x6C95, + 4971: 0x6C96, + 4972: 0x6C97, + 4973: 0x6C98, + 4974: 0x6C9A, + 4975: 0x6C9C, + 4976: 0x6C9D, + 4977: 0x6C9E, + 4978: 0x6CA0, + 4979: 0x6CA2, + 4980: 0x6CA8, + 4981: 0x6CAC, + 4982: 0x6CAF, + 4983: 0x6CB0, + 4984: 0x6CB4, + 4985: 0x6CB5, + 4986: 0x6CB6, + 4987: 0x6CB7, + 4988: 0x6CBA, + 4989: 0x6CC0, + 4990: 0x6CC1, + 4991: 0x6CC2, + 4992: 0x6CC3, + 4993: 0x6CC6, + 4994: 0x6CC7, + 4995: 0x6CC8, + 4996: 0x6CCB, + 4997: 0x6CCD, + 4998: 0x6CCE, + 4999: 0x6CCF, + 5000: 0x6CD1, + 5001: 0x6CD2, + 5002: 0x6CD8, + 5003: 0x6CD9, + 5004: 0x6CDA, + 5005: 0x6CDC, + 5006: 0x6CDD, + 5007: 0x6CDF, + 5008: 0x6CE4, + 5009: 0x6CE6, + 5010: 0x6CE7, + 5011: 0x6CE9, + 5012: 0x6CEC, + 5013: 0x6CED, + 5014: 0x6CF2, + 5015: 0x6CF4, + 5016: 0x6CF9, + 5017: 0x6CFF, + 5018: 0x6D00, + 5019: 0x6D02, + 5020: 0x6D03, + 5021: 0x6D05, + 5022: 0x6D06, + 5023: 0x6D08, + 5024: 0x6D09, + 5025: 0x6D0A, + 5026: 0x6D0D, + 5027: 0x6D0F, + 5028: 0x6D10, + 5029: 0x6D11, + 5030: 0x6D13, + 5031: 0x6D14, + 5032: 0x6D15, + 5033: 0x6D16, + 5034: 0x6D18, + 5035: 0x6D1C, + 5036: 0x6D1D, + 5037: 0x6D1F, + 5038: 0x6D20, + 5039: 0x6D21, + 5040: 0x6D22, + 5041: 0x6D23, + 5042: 0x6D24, + 5043: 0x6D26, + 5044: 0x6D28, + 5045: 0x6D29, + 5046: 0x6D2C, + 5047: 0x6D2D, + 5048: 0x6D2F, + 5049: 0x6D30, + 5050: 0x6D34, + 5051: 0x6D36, + 5052: 0x6D37, + 5053: 0x6D38, + 5054: 0x6D3A, + 5055: 0x6D3F, + 5056: 0x6D40, + 5057: 0x6D42, + 5058: 0x6D44, + 5059: 0x6D49, + 5060: 0x6D4C, + 5061: 0x6D50, + 5062: 0x6D55, + 5063: 0x6D56, + 5064: 0x6D57, + 5065: 0x6D58, + 5066: 0x6D5B, + 5067: 0x6D5D, + 5068: 0x6D5F, + 5069: 0x6D61, + 5070: 0x6D62, + 5071: 0x6D64, + 5072: 0x6D65, + 5073: 0x6D67, + 5074: 0x6D68, + 5075: 0x6D6B, + 5076: 0x6D6C, + 5077: 0x6D6D, + 5078: 0x6D70, + 5079: 0x6D71, + 5080: 0x6D72, + 5081: 0x6D73, + 5082: 0x6D75, + 5083: 0x6D76, + 5084: 0x6D79, + 5085: 0x6D7A, + 5086: 0x6D7B, + 5087: 0x6D7D, + 5088: 0x6D7E, + 5089: 0x6D7F, + 5090: 0x6D80, + 5091: 0x6D81, + 5092: 0x6D83, + 5093: 0x6D84, + 5094: 0x6D86, + 5095: 0x6D87, + 5096: 0x6D8A, + 5097: 0x6D8B, + 5098: 0x6D8D, + 5099: 0x6D8F, + 5100: 0x6D90, + 5101: 0x6D92, + 5102: 0x6D96, + 5103: 0x6D97, + 5104: 0x6D98, + 5105: 0x6D99, + 5106: 0x6D9A, + 5107: 0x6D9C, + 5108: 0x6DA2, + 5109: 0x6DA5, + 5110: 0x6DAC, + 5111: 0x6DAD, + 5112: 0x6DB0, + 5113: 0x6DB1, + 5114: 0x6DB3, + 5115: 0x6DB4, + 5116: 0x6DB6, + 5117: 0x6DB7, + 5118: 0x6DB9, + 5119: 0x6DBA, + 5120: 0x6DBB, + 5121: 0x6DBC, + 5122: 0x6DBD, + 5123: 0x6DBE, + 5124: 0x6DC1, + 5125: 0x6DC2, + 5126: 0x6DC3, + 5127: 0x6DC8, + 5128: 0x6DC9, + 5129: 0x6DCA, + 5130: 0x6DCD, + 5131: 0x6DCE, + 5132: 0x6DCF, + 5133: 0x6DD0, + 5134: 0x6DD2, + 5135: 0x6DD3, + 5136: 0x6DD4, + 5137: 0x6DD5, + 5138: 0x6DD7, + 5139: 0x6DDA, + 5140: 0x6DDB, + 5141: 0x6DDC, + 5142: 0x6DDF, + 5143: 0x6DE2, + 5144: 0x6DE3, + 5145: 0x6DE5, + 5146: 0x6DE7, + 5147: 0x6DE8, + 5148: 0x6DE9, + 5149: 0x6DEA, + 5150: 0x6DED, + 5151: 0x6DEF, + 5152: 0x6DF0, + 5153: 0x6DF2, + 5154: 0x6DF4, + 5155: 0x6DF5, + 5156: 0x6DF6, + 5157: 0x6DF8, + 5158: 0x6DFA, + 5159: 0x6DFD, + 5160: 0x6DFE, + 5161: 0x6DFF, + 5162: 0x6E00, + 5163: 0x6E01, + 5164: 0x6E02, + 5165: 0x6E03, + 5166: 0x6E04, + 5167: 0x6E06, + 5168: 0x6E07, + 5169: 0x6E08, + 5170: 0x6E09, + 5171: 0x6E0B, + 5172: 0x6E0F, + 5173: 0x6E12, + 5174: 0x6E13, + 5175: 0x6E15, + 5176: 0x6E18, + 5177: 0x6E19, + 5178: 0x6E1B, + 5179: 0x6E1C, + 5180: 0x6E1E, + 5181: 0x6E1F, + 5182: 0x6E22, + 5183: 0x6E26, + 5184: 0x6E27, + 5185: 0x6E28, + 5186: 0x6E2A, + 5187: 0x6E2C, + 5188: 0x6E2E, + 5189: 0x6E30, + 5190: 0x6E31, + 5191: 0x6E33, + 5192: 0x6E35, + 5193: 0x6E36, + 5194: 0x6E37, + 5195: 0x6E39, + 5196: 0x6E3B, + 5197: 0x6E3C, + 5198: 0x6E3D, + 5199: 0x6E3E, + 5200: 0x6E3F, + 5201: 0x6E40, + 5202: 0x6E41, + 5203: 0x6E42, + 5204: 0x6E45, + 5205: 0x6E46, + 5206: 0x6E47, + 5207: 0x6E48, + 5208: 0x6E49, + 5209: 0x6E4A, + 5210: 0x6E4B, + 5211: 0x6E4C, + 5212: 0x6E4F, + 5213: 0x6E50, + 5214: 0x6E51, + 5215: 0x6E52, + 5216: 0x6E55, + 5217: 0x6E57, + 5218: 0x6E59, + 5219: 0x6E5A, + 5220: 0x6E5C, + 5221: 0x6E5D, + 5222: 0x6E5E, + 5223: 0x6E60, + 5224: 0x6E61, + 5225: 0x6E62, + 5226: 0x6E63, + 5227: 0x6E64, + 5228: 0x6E65, + 5229: 0x6E66, + 5230: 0x6E67, + 5231: 0x6E68, + 5232: 0x6E69, + 5233: 0x6E6A, + 5234: 0x6E6C, + 5235: 0x6E6D, + 5236: 0x6E6F, + 5237: 0x6E70, + 5238: 0x6E71, + 5239: 0x6E72, + 5240: 0x6E73, + 5241: 0x6E74, + 5242: 0x6E75, + 5243: 0x6E76, + 5244: 0x6E77, + 5245: 0x6E78, + 5246: 0x6E79, + 5247: 0x6E7A, + 5248: 0x6E7B, + 5249: 0x6E7C, + 5250: 0x6E7D, + 5251: 0x6E80, + 5252: 0x6E81, + 5253: 0x6E82, + 5254: 0x6E84, + 5255: 0x6E87, + 5256: 0x6E88, + 5257: 0x6E8A, + 5258: 0x6E8B, + 5259: 0x6E8C, + 5260: 0x6E8D, + 5261: 0x6E8E, + 5262: 0x6E91, + 5263: 0x6E92, + 5264: 0x6E93, + 5265: 0x6E94, + 5266: 0x6E95, + 5267: 0x6E96, + 5268: 0x6E97, + 5269: 0x6E99, + 5270: 0x6E9A, + 5271: 0x6E9B, + 5272: 0x6E9D, + 5273: 0x6E9E, + 5274: 0x6EA0, + 5275: 0x6EA1, + 5276: 0x6EA3, + 5277: 0x6EA4, + 5278: 0x6EA6, + 5279: 0x6EA8, + 5280: 0x6EA9, + 5281: 0x6EAB, + 5282: 0x6EAC, + 5283: 0x6EAD, + 5284: 0x6EAE, + 5285: 0x6EB0, + 5286: 0x6EB3, + 5287: 0x6EB5, + 5288: 0x6EB8, + 5289: 0x6EB9, + 5290: 0x6EBC, + 5291: 0x6EBE, + 5292: 0x6EBF, + 5293: 0x6EC0, + 5294: 0x6EC3, + 5295: 0x6EC4, + 5296: 0x6EC5, + 5297: 0x6EC6, + 5298: 0x6EC8, + 5299: 0x6EC9, + 5300: 0x6ECA, + 5301: 0x6ECC, + 5302: 0x6ECD, + 5303: 0x6ECE, + 5304: 0x6ED0, + 5305: 0x6ED2, + 5306: 0x6ED6, + 5307: 0x6ED8, + 5308: 0x6ED9, + 5309: 0x6EDB, + 5310: 0x6EDC, + 5311: 0x6EDD, + 5312: 0x6EE3, + 5313: 0x6EE7, + 5314: 0x6EEA, + 5315: 0x6EEB, + 5316: 0x6EEC, + 5317: 0x6EED, + 5318: 0x6EEE, + 5319: 0x6EEF, + 5320: 0x6EF0, + 5321: 0x6EF1, + 5322: 0x6EF2, + 5323: 0x6EF3, + 5324: 0x6EF5, + 5325: 0x6EF6, + 5326: 0x6EF7, + 5327: 0x6EF8, + 5328: 0x6EFA, + 5329: 0x6EFB, + 5330: 0x6EFC, + 5331: 0x6EFD, + 5332: 0x6EFE, + 5333: 0x6EFF, + 5334: 0x6F00, + 5335: 0x6F01, + 5336: 0x6F03, + 5337: 0x6F04, + 5338: 0x6F05, + 5339: 0x6F07, + 5340: 0x6F08, + 5341: 0x6F0A, + 5342: 0x6F0B, + 5343: 0x6F0C, + 5344: 0x6F0D, + 5345: 0x6F0E, + 5346: 0x6F10, + 5347: 0x6F11, + 5348: 0x6F12, + 5349: 0x6F16, + 5350: 0x6F17, + 5351: 0x6F18, + 5352: 0x6F19, + 5353: 0x6F1A, + 5354: 0x6F1B, + 5355: 0x6F1C, + 5356: 0x6F1D, + 5357: 0x6F1E, + 5358: 0x6F1F, + 5359: 0x6F21, + 5360: 0x6F22, + 5361: 0x6F23, + 5362: 0x6F25, + 5363: 0x6F26, + 5364: 0x6F27, + 5365: 0x6F28, + 5366: 0x6F2C, + 5367: 0x6F2E, + 5368: 0x6F30, + 5369: 0x6F32, + 5370: 0x6F34, + 5371: 0x6F35, + 5372: 0x6F37, + 5373: 0x6F38, + 5374: 0x6F39, + 5375: 0x6F3A, + 5376: 0x6F3B, + 5377: 0x6F3C, + 5378: 0x6F3D, + 5379: 0x6F3F, + 5380: 0x6F40, + 5381: 0x6F41, + 5382: 0x6F42, + 5383: 0x6F43, + 5384: 0x6F44, + 5385: 0x6F45, + 5386: 0x6F48, + 5387: 0x6F49, + 5388: 0x6F4A, + 5389: 0x6F4C, + 5390: 0x6F4E, + 5391: 0x6F4F, + 5392: 0x6F50, + 5393: 0x6F51, + 5394: 0x6F52, + 5395: 0x6F53, + 5396: 0x6F54, + 5397: 0x6F55, + 5398: 0x6F56, + 5399: 0x6F57, + 5400: 0x6F59, + 5401: 0x6F5A, + 5402: 0x6F5B, + 5403: 0x6F5D, + 5404: 0x6F5F, + 5405: 0x6F60, + 5406: 0x6F61, + 5407: 0x6F63, + 5408: 0x6F64, + 5409: 0x6F65, + 5410: 0x6F67, + 5411: 0x6F68, + 5412: 0x6F69, + 5413: 0x6F6A, + 5414: 0x6F6B, + 5415: 0x6F6C, + 5416: 0x6F6F, + 5417: 0x6F70, + 5418: 0x6F71, + 5419: 0x6F73, + 5420: 0x6F75, + 5421: 0x6F76, + 5422: 0x6F77, + 5423: 0x6F79, + 5424: 0x6F7B, + 5425: 0x6F7D, + 5426: 0x6F7E, + 5427: 0x6F7F, + 5428: 0x6F80, + 5429: 0x6F81, + 5430: 0x6F82, + 5431: 0x6F83, + 5432: 0x6F85, + 5433: 0x6F86, + 5434: 0x6F87, + 5435: 0x6F8A, + 5436: 0x6F8B, + 5437: 0x6F8F, + 5438: 0x6F90, + 5439: 0x6F91, + 5440: 0x6F92, + 5441: 0x6F93, + 5442: 0x6F94, + 5443: 0x6F95, + 5444: 0x6F96, + 5445: 0x6F97, + 5446: 0x6F98, + 5447: 0x6F99, + 5448: 0x6F9A, + 5449: 0x6F9B, + 5450: 0x6F9D, + 5451: 0x6F9E, + 5452: 0x6F9F, + 5453: 0x6FA0, + 5454: 0x6FA2, + 5455: 0x6FA3, + 5456: 0x6FA4, + 5457: 0x6FA5, + 5458: 0x6FA6, + 5459: 0x6FA8, + 5460: 0x6FA9, + 5461: 0x6FAA, + 5462: 0x6FAB, + 5463: 0x6FAC, + 5464: 0x6FAD, + 5465: 0x6FAE, + 5466: 0x6FAF, + 5467: 0x6FB0, + 5468: 0x6FB1, + 5469: 0x6FB2, + 5470: 0x6FB4, + 5471: 0x6FB5, + 5472: 0x6FB7, + 5473: 0x6FB8, + 5474: 0x6FBA, + 5475: 0x6FBB, + 5476: 0x6FBC, + 5477: 0x6FBD, + 5478: 0x6FBE, + 5479: 0x6FBF, + 5480: 0x6FC1, + 5481: 0x6FC3, + 5482: 0x6FC4, + 5483: 0x6FC5, + 5484: 0x6FC6, + 5485: 0x6FC7, + 5486: 0x6FC8, + 5487: 0x6FCA, + 5488: 0x6FCB, + 5489: 0x6FCC, + 5490: 0x6FCD, + 5491: 0x6FCE, + 5492: 0x6FCF, + 5493: 0x6FD0, + 5494: 0x6FD3, + 5495: 0x6FD4, + 5496: 0x6FD5, + 5497: 0x6FD6, + 5498: 0x6FD7, + 5499: 0x6FD8, + 5500: 0x6FD9, + 5501: 0x6FDA, + 5502: 0x6FDB, + 5503: 0x6FDC, + 5504: 0x6FDD, + 5505: 0x6FDF, + 5506: 0x6FE2, + 5507: 0x6FE3, + 5508: 0x6FE4, + 5509: 0x6FE5, + 5510: 0x6FE6, + 5511: 0x6FE7, + 5512: 0x6FE8, + 5513: 0x6FE9, + 5514: 0x6FEA, + 5515: 0x6FEB, + 5516: 0x6FEC, + 5517: 0x6FED, + 5518: 0x6FF0, + 5519: 0x6FF1, + 5520: 0x6FF2, + 5521: 0x6FF3, + 5522: 0x6FF4, + 5523: 0x6FF5, + 5524: 0x6FF6, + 5525: 0x6FF7, + 5526: 0x6FF8, + 5527: 0x6FF9, + 5528: 0x6FFA, + 5529: 0x6FFB, + 5530: 0x6FFC, + 5531: 0x6FFD, + 5532: 0x6FFE, + 5533: 0x6FFF, + 5534: 0x7000, + 5535: 0x7001, + 5536: 0x7002, + 5537: 0x7003, + 5538: 0x7004, + 5539: 0x7005, + 5540: 0x7006, + 5541: 0x7007, + 5542: 0x7008, + 5543: 0x7009, + 5544: 0x700A, + 5545: 0x700B, + 5546: 0x700C, + 5547: 0x700D, + 5548: 0x700E, + 5549: 0x700F, + 5550: 0x7010, + 5551: 0x7012, + 5552: 0x7013, + 5553: 0x7014, + 5554: 0x7015, + 5555: 0x7016, + 5556: 0x7017, + 5557: 0x7018, + 5558: 0x7019, + 5559: 0x701C, + 5560: 0x701D, + 5561: 0x701E, + 5562: 0x701F, + 5563: 0x7020, + 5564: 0x7021, + 5565: 0x7022, + 5566: 0x7024, + 5567: 0x7025, + 5568: 0x7026, + 5569: 0x7027, + 5570: 0x7028, + 5571: 0x7029, + 5572: 0x702A, + 5573: 0x702B, + 5574: 0x702C, + 5575: 0x702D, + 5576: 0x702E, + 5577: 0x702F, + 5578: 0x7030, + 5579: 0x7031, + 5580: 0x7032, + 5581: 0x7033, + 5582: 0x7034, + 5583: 0x7036, + 5584: 0x7037, + 5585: 0x7038, + 5586: 0x703A, + 5587: 0x703B, + 5588: 0x703C, + 5589: 0x703D, + 5590: 0x703E, + 5591: 0x703F, + 5592: 0x7040, + 5593: 0x7041, + 5594: 0x7042, + 5595: 0x7043, + 5596: 0x7044, + 5597: 0x7045, + 5598: 0x7046, + 5599: 0x7047, + 5600: 0x7048, + 5601: 0x7049, + 5602: 0x704A, + 5603: 0x704B, + 5604: 0x704D, + 5605: 0x704E, + 5606: 0x7050, + 5607: 0x7051, + 5608: 0x7052, + 5609: 0x7053, + 5610: 0x7054, + 5611: 0x7055, + 5612: 0x7056, + 5613: 0x7057, + 5614: 0x7058, + 5615: 0x7059, + 5616: 0x705A, + 5617: 0x705B, + 5618: 0x705C, + 5619: 0x705D, + 5620: 0x705F, + 5621: 0x7060, + 5622: 0x7061, + 5623: 0x7062, + 5624: 0x7063, + 5625: 0x7064, + 5626: 0x7065, + 5627: 0x7066, + 5628: 0x7067, + 5629: 0x7068, + 5630: 0x7069, + 5631: 0x706A, + 5632: 0x706E, + 5633: 0x7071, + 5634: 0x7072, + 5635: 0x7073, + 5636: 0x7074, + 5637: 0x7077, + 5638: 0x7079, + 5639: 0x707A, + 5640: 0x707B, + 5641: 0x707D, + 5642: 0x7081, + 5643: 0x7082, + 5644: 0x7083, + 5645: 0x7084, + 5646: 0x7086, + 5647: 0x7087, + 5648: 0x7088, + 5649: 0x708B, + 5650: 0x708C, + 5651: 0x708D, + 5652: 0x708F, + 5653: 0x7090, + 5654: 0x7091, + 5655: 0x7093, + 5656: 0x7097, + 5657: 0x7098, + 5658: 0x709A, + 5659: 0x709B, + 5660: 0x709E, + 5661: 0x709F, + 5662: 0x70A0, + 5663: 0x70A1, + 5664: 0x70A2, + 5665: 0x70A3, + 5666: 0x70A4, + 5667: 0x70A5, + 5668: 0x70A6, + 5669: 0x70A7, + 5670: 0x70A8, + 5671: 0x70A9, + 5672: 0x70AA, + 5673: 0x70B0, + 5674: 0x70B2, + 5675: 0x70B4, + 5676: 0x70B5, + 5677: 0x70B6, + 5678: 0x70BA, + 5679: 0x70BE, + 5680: 0x70BF, + 5681: 0x70C4, + 5682: 0x70C5, + 5683: 0x70C6, + 5684: 0x70C7, + 5685: 0x70C9, + 5686: 0x70CB, + 5687: 0x70CC, + 5688: 0x70CD, + 5689: 0x70CE, + 5690: 0x70CF, + 5691: 0x70D0, + 5692: 0x70D1, + 5693: 0x70D2, + 5694: 0x70D3, + 5695: 0x70D4, + 5696: 0x70D5, + 5697: 0x70D6, + 5698: 0x70D7, + 5699: 0x70DA, + 5700: 0x70DC, + 5701: 0x70DD, + 5702: 0x70DE, + 5703: 0x70E0, + 5704: 0x70E1, + 5705: 0x70E2, + 5706: 0x70E3, + 5707: 0x70E5, + 5708: 0x70EA, + 5709: 0x70EE, + 5710: 0x70F0, + 5711: 0x70F1, + 5712: 0x70F2, + 5713: 0x70F3, + 5714: 0x70F4, + 5715: 0x70F5, + 5716: 0x70F6, + 5717: 0x70F8, + 5718: 0x70FA, + 5719: 0x70FB, + 5720: 0x70FC, + 5721: 0x70FE, + 5722: 0x70FF, + 5723: 0x7100, + 5724: 0x7101, + 5725: 0x7102, + 5726: 0x7103, + 5727: 0x7104, + 5728: 0x7105, + 5729: 0x7106, + 5730: 0x7107, + 5731: 0x7108, + 5732: 0x710B, + 5733: 0x710C, + 5734: 0x710D, + 5735: 0x710E, + 5736: 0x710F, + 5737: 0x7111, + 5738: 0x7112, + 5739: 0x7114, + 5740: 0x7117, + 5741: 0x711B, + 5742: 0x711C, + 5743: 0x711D, + 5744: 0x711E, + 5745: 0x711F, + 5746: 0x7120, + 5747: 0x7121, + 5748: 0x7122, + 5749: 0x7123, + 5750: 0x7124, + 5751: 0x7125, + 5752: 0x7127, + 5753: 0x7128, + 5754: 0x7129, + 5755: 0x712A, + 5756: 0x712B, + 5757: 0x712C, + 5758: 0x712D, + 5759: 0x712E, + 5760: 0x7132, + 5761: 0x7133, + 5762: 0x7134, + 5763: 0x7135, + 5764: 0x7137, + 5765: 0x7138, + 5766: 0x7139, + 5767: 0x713A, + 5768: 0x713B, + 5769: 0x713C, + 5770: 0x713D, + 5771: 0x713E, + 5772: 0x713F, + 5773: 0x7140, + 5774: 0x7141, + 5775: 0x7142, + 5776: 0x7143, + 5777: 0x7144, + 5778: 0x7146, + 5779: 0x7147, + 5780: 0x7148, + 5781: 0x7149, + 5782: 0x714B, + 5783: 0x714D, + 5784: 0x714F, + 5785: 0x7150, + 5786: 0x7151, + 5787: 0x7152, + 5788: 0x7153, + 5789: 0x7154, + 5790: 0x7155, + 5791: 0x7156, + 5792: 0x7157, + 5793: 0x7158, + 5794: 0x7159, + 5795: 0x715A, + 5796: 0x715B, + 5797: 0x715D, + 5798: 0x715F, + 5799: 0x7160, + 5800: 0x7161, + 5801: 0x7162, + 5802: 0x7163, + 5803: 0x7165, + 5804: 0x7169, + 5805: 0x716A, + 5806: 0x716B, + 5807: 0x716C, + 5808: 0x716D, + 5809: 0x716F, + 5810: 0x7170, + 5811: 0x7171, + 5812: 0x7174, + 5813: 0x7175, + 5814: 0x7176, + 5815: 0x7177, + 5816: 0x7179, + 5817: 0x717B, + 5818: 0x717C, + 5819: 0x717E, + 5820: 0x717F, + 5821: 0x7180, + 5822: 0x7181, + 5823: 0x7182, + 5824: 0x7183, + 5825: 0x7185, + 5826: 0x7186, + 5827: 0x7187, + 5828: 0x7188, + 5829: 0x7189, + 5830: 0x718B, + 5831: 0x718C, + 5832: 0x718D, + 5833: 0x718E, + 5834: 0x7190, + 5835: 0x7191, + 5836: 0x7192, + 5837: 0x7193, + 5838: 0x7195, + 5839: 0x7196, + 5840: 0x7197, + 5841: 0x719A, + 5842: 0x719B, + 5843: 0x719C, + 5844: 0x719D, + 5845: 0x719E, + 5846: 0x71A1, + 5847: 0x71A2, + 5848: 0x71A3, + 5849: 0x71A4, + 5850: 0x71A5, + 5851: 0x71A6, + 5852: 0x71A7, + 5853: 0x71A9, + 5854: 0x71AA, + 5855: 0x71AB, + 5856: 0x71AD, + 5857: 0x71AE, + 5858: 0x71AF, + 5859: 0x71B0, + 5860: 0x71B1, + 5861: 0x71B2, + 5862: 0x71B4, + 5863: 0x71B6, + 5864: 0x71B7, + 5865: 0x71B8, + 5866: 0x71BA, + 5867: 0x71BB, + 5868: 0x71BC, + 5869: 0x71BD, + 5870: 0x71BE, + 5871: 0x71BF, + 5872: 0x71C0, + 5873: 0x71C1, + 5874: 0x71C2, + 5875: 0x71C4, + 5876: 0x71C5, + 5877: 0x71C6, + 5878: 0x71C7, + 5879: 0x71C8, + 5880: 0x71C9, + 5881: 0x71CA, + 5882: 0x71CB, + 5883: 0x71CC, + 5884: 0x71CD, + 5885: 0x71CF, + 5886: 0x71D0, + 5887: 0x71D1, + 5888: 0x71D2, + 5889: 0x71D3, + 5890: 0x71D6, + 5891: 0x71D7, + 5892: 0x71D8, + 5893: 0x71D9, + 5894: 0x71DA, + 5895: 0x71DB, + 5896: 0x71DC, + 5897: 0x71DD, + 5898: 0x71DE, + 5899: 0x71DF, + 5900: 0x71E1, + 5901: 0x71E2, + 5902: 0x71E3, + 5903: 0x71E4, + 5904: 0x71E6, + 5905: 0x71E8, + 5906: 0x71E9, + 5907: 0x71EA, + 5908: 0x71EB, + 5909: 0x71EC, + 5910: 0x71ED, + 5911: 0x71EF, + 5912: 0x71F0, + 5913: 0x71F1, + 5914: 0x71F2, + 5915: 0x71F3, + 5916: 0x71F4, + 5917: 0x71F5, + 5918: 0x71F6, + 5919: 0x71F7, + 5920: 0x71F8, + 5921: 0x71FA, + 5922: 0x71FB, + 5923: 0x71FC, + 5924: 0x71FD, + 5925: 0x71FE, + 5926: 0x71FF, + 5927: 0x7200, + 5928: 0x7201, + 5929: 0x7202, + 5930: 0x7203, + 5931: 0x7204, + 5932: 0x7205, + 5933: 0x7207, + 5934: 0x7208, + 5935: 0x7209, + 5936: 0x720A, + 5937: 0x720B, + 5938: 0x720C, + 5939: 0x720D, + 5940: 0x720E, + 5941: 0x720F, + 5942: 0x7210, + 5943: 0x7211, + 5944: 0x7212, + 5945: 0x7213, + 5946: 0x7214, + 5947: 0x7215, + 5948: 0x7216, + 5949: 0x7217, + 5950: 0x7218, + 5951: 0x7219, + 5952: 0x721A, + 5953: 0x721B, + 5954: 0x721C, + 5955: 0x721E, + 5956: 0x721F, + 5957: 0x7220, + 5958: 0x7221, + 5959: 0x7222, + 5960: 0x7223, + 5961: 0x7224, + 5962: 0x7225, + 5963: 0x7226, + 5964: 0x7227, + 5965: 0x7229, + 5966: 0x722B, + 5967: 0x722D, + 5968: 0x722E, + 5969: 0x722F, + 5970: 0x7232, + 5971: 0x7233, + 5972: 0x7234, + 5973: 0x723A, + 5974: 0x723C, + 5975: 0x723E, + 5976: 0x7240, + 5977: 0x7241, + 5978: 0x7242, + 5979: 0x7243, + 5980: 0x7244, + 5981: 0x7245, + 5982: 0x7246, + 5983: 0x7249, + 5984: 0x724A, + 5985: 0x724B, + 5986: 0x724E, + 5987: 0x724F, + 5988: 0x7250, + 5989: 0x7251, + 5990: 0x7253, + 5991: 0x7254, + 5992: 0x7255, + 5993: 0x7257, + 5994: 0x7258, + 5995: 0x725A, + 5996: 0x725C, + 5997: 0x725E, + 5998: 0x7260, + 5999: 0x7263, + 6000: 0x7264, + 6001: 0x7265, + 6002: 0x7268, + 6003: 0x726A, + 6004: 0x726B, + 6005: 0x726C, + 6006: 0x726D, + 6007: 0x7270, + 6008: 0x7271, + 6009: 0x7273, + 6010: 0x7274, + 6011: 0x7276, + 6012: 0x7277, + 6013: 0x7278, + 6014: 0x727B, + 6015: 0x727C, + 6016: 0x727D, + 6017: 0x7282, + 6018: 0x7283, + 6019: 0x7285, + 6020: 0x7286, + 6021: 0x7287, + 6022: 0x7288, + 6023: 0x7289, + 6024: 0x728C, + 6025: 0x728E, + 6026: 0x7290, + 6027: 0x7291, + 6028: 0x7293, + 6029: 0x7294, + 6030: 0x7295, + 6031: 0x7296, + 6032: 0x7297, + 6033: 0x7298, + 6034: 0x7299, + 6035: 0x729A, + 6036: 0x729B, + 6037: 0x729C, + 6038: 0x729D, + 6039: 0x729E, + 6040: 0x72A0, + 6041: 0x72A1, + 6042: 0x72A2, + 6043: 0x72A3, + 6044: 0x72A4, + 6045: 0x72A5, + 6046: 0x72A6, + 6047: 0x72A7, + 6048: 0x72A8, + 6049: 0x72A9, + 6050: 0x72AA, + 6051: 0x72AB, + 6052: 0x72AE, + 6053: 0x72B1, + 6054: 0x72B2, + 6055: 0x72B3, + 6056: 0x72B5, + 6057: 0x72BA, + 6058: 0x72BB, + 6059: 0x72BC, + 6060: 0x72BD, + 6061: 0x72BE, + 6062: 0x72BF, + 6063: 0x72C0, + 6064: 0x72C5, + 6065: 0x72C6, + 6066: 0x72C7, + 6067: 0x72C9, + 6068: 0x72CA, + 6069: 0x72CB, + 6070: 0x72CC, + 6071: 0x72CF, + 6072: 0x72D1, + 6073: 0x72D3, + 6074: 0x72D4, + 6075: 0x72D5, + 6076: 0x72D6, + 6077: 0x72D8, + 6078: 0x72DA, + 6079: 0x72DB, + 6176: 0x3000, + 6177: 0x3001, + 6178: 0x3002, + 6179: 0x00B7, + 6180: 0x02C9, + 6181: 0x02C7, + 6182: 0x00A8, + 6183: 0x3003, + 6184: 0x3005, + 6185: 0x2014, + 6186: 0xFF5E, + 6187: 0x2016, + 6188: 0x2026, + 6189: 0x2018, + 6190: 0x2019, + 6191: 0x201C, + 6192: 0x201D, + 6193: 0x3014, + 6194: 0x3015, + 6195: 0x3008, + 6196: 0x3009, + 6197: 0x300A, + 6198: 0x300B, + 6199: 0x300C, + 6200: 0x300D, + 6201: 0x300E, + 6202: 0x300F, + 6203: 0x3016, + 6204: 0x3017, + 6205: 0x3010, + 6206: 0x3011, + 6207: 0x00B1, + 6208: 0x00D7, + 6209: 0x00F7, + 6210: 0x2236, + 6211: 0x2227, + 6212: 0x2228, + 6213: 0x2211, + 6214: 0x220F, + 6215: 0x222A, + 6216: 0x2229, + 6217: 0x2208, + 6218: 0x2237, + 6219: 0x221A, + 6220: 0x22A5, + 6221: 0x2225, + 6222: 0x2220, + 6223: 0x2312, + 6224: 0x2299, + 6225: 0x222B, + 6226: 0x222E, + 6227: 0x2261, + 6228: 0x224C, + 6229: 0x2248, + 6230: 0x223D, + 6231: 0x221D, + 6232: 0x2260, + 6233: 0x226E, + 6234: 0x226F, + 6235: 0x2264, + 6236: 0x2265, + 6237: 0x221E, + 6238: 0x2235, + 6239: 0x2234, + 6240: 0x2642, + 6241: 0x2640, + 6242: 0x00B0, + 6243: 0x2032, + 6244: 0x2033, + 6245: 0x2103, + 6246: 0xFF04, + 6247: 0x00A4, + 6248: 0xFFE0, + 6249: 0xFFE1, + 6250: 0x2030, + 6251: 0x00A7, + 6252: 0x2116, + 6253: 0x2606, + 6254: 0x2605, + 6255: 0x25CB, + 6256: 0x25CF, + 6257: 0x25CE, + 6258: 0x25C7, + 6259: 0x25C6, + 6260: 0x25A1, + 6261: 0x25A0, + 6262: 0x25B3, + 6263: 0x25B2, + 6264: 0x203B, + 6265: 0x2192, + 6266: 0x2190, + 6267: 0x2191, + 6268: 0x2193, + 6269: 0x3013, + 6366: 0x2170, + 6367: 0x2171, + 6368: 0x2172, + 6369: 0x2173, + 6370: 0x2174, + 6371: 0x2175, + 6372: 0x2176, + 6373: 0x2177, + 6374: 0x2178, + 6375: 0x2179, + 6382: 0x2488, + 6383: 0x2489, + 6384: 0x248A, + 6385: 0x248B, + 6386: 0x248C, + 6387: 0x248D, + 6388: 0x248E, + 6389: 0x248F, + 6390: 0x2490, + 6391: 0x2491, + 6392: 0x2492, + 6393: 0x2493, + 6394: 0x2494, + 6395: 0x2495, + 6396: 0x2496, + 6397: 0x2497, + 6398: 0x2498, + 6399: 0x2499, + 6400: 0x249A, + 6401: 0x249B, + 6402: 0x2474, + 6403: 0x2475, + 6404: 0x2476, + 6405: 0x2477, + 6406: 0x2478, + 6407: 0x2479, + 6408: 0x247A, + 6409: 0x247B, + 6410: 0x247C, + 6411: 0x247D, + 6412: 0x247E, + 6413: 0x247F, + 6414: 0x2480, + 6415: 0x2481, + 6416: 0x2482, + 6417: 0x2483, + 6418: 0x2484, + 6419: 0x2485, + 6420: 0x2486, + 6421: 0x2487, + 6422: 0x2460, + 6423: 0x2461, + 6424: 0x2462, + 6425: 0x2463, + 6426: 0x2464, + 6427: 0x2465, + 6428: 0x2466, + 6429: 0x2467, + 6430: 0x2468, + 6431: 0x2469, + 6432: 0x20AC, + 6434: 0x3220, + 6435: 0x3221, + 6436: 0x3222, + 6437: 0x3223, + 6438: 0x3224, + 6439: 0x3225, + 6440: 0x3226, + 6441: 0x3227, + 6442: 0x3228, + 6443: 0x3229, + 6446: 0x2160, + 6447: 0x2161, + 6448: 0x2162, + 6449: 0x2163, + 6450: 0x2164, + 6451: 0x2165, + 6452: 0x2166, + 6453: 0x2167, + 6454: 0x2168, + 6455: 0x2169, + 6456: 0x216A, + 6457: 0x216B, + 6555: 0x3000, + 6556: 0xFF01, + 6557: 0xFF02, + 6558: 0xFF03, + 6559: 0xFFE5, + 6560: 0xFF05, + 6561: 0xFF06, + 6562: 0xFF07, + 6563: 0xFF08, + 6564: 0xFF09, + 6565: 0xFF0A, + 6566: 0xFF0B, + 6567: 0xFF0C, + 6568: 0xFF0D, + 6569: 0xFF0E, + 6570: 0xFF0F, + 6571: 0xFF10, + 6572: 0xFF11, + 6573: 0xFF12, + 6574: 0xFF13, + 6575: 0xFF14, + 6576: 0xFF15, + 6577: 0xFF16, + 6578: 0xFF17, + 6579: 0xFF18, + 6580: 0xFF19, + 6581: 0xFF1A, + 6582: 0xFF1B, + 6583: 0xFF1C, + 6584: 0xFF1D, + 6585: 0xFF1E, + 6586: 0xFF1F, + 6587: 0xFF20, + 6588: 0xFF21, + 6589: 0xFF22, + 6590: 0xFF23, + 6591: 0xFF24, + 6592: 0xFF25, + 6593: 0xFF26, + 6594: 0xFF27, + 6595: 0xFF28, + 6596: 0xFF29, + 6597: 0xFF2A, + 6598: 0xFF2B, + 6599: 0xFF2C, + 6600: 0xFF2D, + 6601: 0xFF2E, + 6602: 0xFF2F, + 6603: 0xFF30, + 6604: 0xFF31, + 6605: 0xFF32, + 6606: 0xFF33, + 6607: 0xFF34, + 6608: 0xFF35, + 6609: 0xFF36, + 6610: 0xFF37, + 6611: 0xFF38, + 6612: 0xFF39, + 6613: 0xFF3A, + 6614: 0xFF3B, + 6615: 0xFF3C, + 6616: 0xFF3D, + 6617: 0xFF3E, + 6618: 0xFF3F, + 6619: 0xFF40, + 6620: 0xFF41, + 6621: 0xFF42, + 6622: 0xFF43, + 6623: 0xFF44, + 6624: 0xFF45, + 6625: 0xFF46, + 6626: 0xFF47, + 6627: 0xFF48, + 6628: 0xFF49, + 6629: 0xFF4A, + 6630: 0xFF4B, + 6631: 0xFF4C, + 6632: 0xFF4D, + 6633: 0xFF4E, + 6634: 0xFF4F, + 6635: 0xFF50, + 6636: 0xFF51, + 6637: 0xFF52, + 6638: 0xFF53, + 6639: 0xFF54, + 6640: 0xFF55, + 6641: 0xFF56, + 6642: 0xFF57, + 6643: 0xFF58, + 6644: 0xFF59, + 6645: 0xFF5A, + 6646: 0xFF5B, + 6647: 0xFF5C, + 6648: 0xFF5D, + 6649: 0xFFE3, + 6746: 0x3041, + 6747: 0x3042, + 6748: 0x3043, + 6749: 0x3044, + 6750: 0x3045, + 6751: 0x3046, + 6752: 0x3047, + 6753: 0x3048, + 6754: 0x3049, + 6755: 0x304A, + 6756: 0x304B, + 6757: 0x304C, + 6758: 0x304D, + 6759: 0x304E, + 6760: 0x304F, + 6761: 0x3050, + 6762: 0x3051, + 6763: 0x3052, + 6764: 0x3053, + 6765: 0x3054, + 6766: 0x3055, + 6767: 0x3056, + 6768: 0x3057, + 6769: 0x3058, + 6770: 0x3059, + 6771: 0x305A, + 6772: 0x305B, + 6773: 0x305C, + 6774: 0x305D, + 6775: 0x305E, + 6776: 0x305F, + 6777: 0x3060, + 6778: 0x3061, + 6779: 0x3062, + 6780: 0x3063, + 6781: 0x3064, + 6782: 0x3065, + 6783: 0x3066, + 6784: 0x3067, + 6785: 0x3068, + 6786: 0x3069, + 6787: 0x306A, + 6788: 0x306B, + 6789: 0x306C, + 6790: 0x306D, + 6791: 0x306E, + 6792: 0x306F, + 6793: 0x3070, + 6794: 0x3071, + 6795: 0x3072, + 6796: 0x3073, + 6797: 0x3074, + 6798: 0x3075, + 6799: 0x3076, + 6800: 0x3077, + 6801: 0x3078, + 6802: 0x3079, + 6803: 0x307A, + 6804: 0x307B, + 6805: 0x307C, + 6806: 0x307D, + 6807: 0x307E, + 6808: 0x307F, + 6809: 0x3080, + 6810: 0x3081, + 6811: 0x3082, + 6812: 0x3083, + 6813: 0x3084, + 6814: 0x3085, + 6815: 0x3086, + 6816: 0x3087, + 6817: 0x3088, + 6818: 0x3089, + 6819: 0x308A, + 6820: 0x308B, + 6821: 0x308C, + 6822: 0x308D, + 6823: 0x308E, + 6824: 0x308F, + 6825: 0x3090, + 6826: 0x3091, + 6827: 0x3092, + 6828: 0x3093, + 6936: 0x30A1, + 6937: 0x30A2, + 6938: 0x30A3, + 6939: 0x30A4, + 6940: 0x30A5, + 6941: 0x30A6, + 6942: 0x30A7, + 6943: 0x30A8, + 6944: 0x30A9, + 6945: 0x30AA, + 6946: 0x30AB, + 6947: 0x30AC, + 6948: 0x30AD, + 6949: 0x30AE, + 6950: 0x30AF, + 6951: 0x30B0, + 6952: 0x30B1, + 6953: 0x30B2, + 6954: 0x30B3, + 6955: 0x30B4, + 6956: 0x30B5, + 6957: 0x30B6, + 6958: 0x30B7, + 6959: 0x30B8, + 6960: 0x30B9, + 6961: 0x30BA, + 6962: 0x30BB, + 6963: 0x30BC, + 6964: 0x30BD, + 6965: 0x30BE, + 6966: 0x30BF, + 6967: 0x30C0, + 6968: 0x30C1, + 6969: 0x30C2, + 6970: 0x30C3, + 6971: 0x30C4, + 6972: 0x30C5, + 6973: 0x30C6, + 6974: 0x30C7, + 6975: 0x30C8, + 6976: 0x30C9, + 6977: 0x30CA, + 6978: 0x30CB, + 6979: 0x30CC, + 6980: 0x30CD, + 6981: 0x30CE, + 6982: 0x30CF, + 6983: 0x30D0, + 6984: 0x30D1, + 6985: 0x30D2, + 6986: 0x30D3, + 6987: 0x30D4, + 6988: 0x30D5, + 6989: 0x30D6, + 6990: 0x30D7, + 6991: 0x30D8, + 6992: 0x30D9, + 6993: 0x30DA, + 6994: 0x30DB, + 6995: 0x30DC, + 6996: 0x30DD, + 6997: 0x30DE, + 6998: 0x30DF, + 6999: 0x30E0, + 7000: 0x30E1, + 7001: 0x30E2, + 7002: 0x30E3, + 7003: 0x30E4, + 7004: 0x30E5, + 7005: 0x30E6, + 7006: 0x30E7, + 7007: 0x30E8, + 7008: 0x30E9, + 7009: 0x30EA, + 7010: 0x30EB, + 7011: 0x30EC, + 7012: 0x30ED, + 7013: 0x30EE, + 7014: 0x30EF, + 7015: 0x30F0, + 7016: 0x30F1, + 7017: 0x30F2, + 7018: 0x30F3, + 7019: 0x30F4, + 7020: 0x30F5, + 7021: 0x30F6, + 7126: 0x0391, + 7127: 0x0392, + 7128: 0x0393, + 7129: 0x0394, + 7130: 0x0395, + 7131: 0x0396, + 7132: 0x0397, + 7133: 0x0398, + 7134: 0x0399, + 7135: 0x039A, + 7136: 0x039B, + 7137: 0x039C, + 7138: 0x039D, + 7139: 0x039E, + 7140: 0x039F, + 7141: 0x03A0, + 7142: 0x03A1, + 7143: 0x03A3, + 7144: 0x03A4, + 7145: 0x03A5, + 7146: 0x03A6, + 7147: 0x03A7, + 7148: 0x03A8, + 7149: 0x03A9, + 7158: 0x03B1, + 7159: 0x03B2, + 7160: 0x03B3, + 7161: 0x03B4, + 7162: 0x03B5, + 7163: 0x03B6, + 7164: 0x03B7, + 7165: 0x03B8, + 7166: 0x03B9, + 7167: 0x03BA, + 7168: 0x03BB, + 7169: 0x03BC, + 7170: 0x03BD, + 7171: 0x03BE, + 7172: 0x03BF, + 7173: 0x03C0, + 7174: 0x03C1, + 7175: 0x03C3, + 7176: 0x03C4, + 7177: 0x03C5, + 7178: 0x03C6, + 7179: 0x03C7, + 7180: 0x03C8, + 7181: 0x03C9, + 7189: 0xFE35, + 7190: 0xFE36, + 7191: 0xFE39, + 7192: 0xFE3A, + 7193: 0xFE3F, + 7194: 0xFE40, + 7195: 0xFE3D, + 7196: 0xFE3E, + 7197: 0xFE41, + 7198: 0xFE42, + 7199: 0xFE43, + 7200: 0xFE44, + 7203: 0xFE3B, + 7204: 0xFE3C, + 7205: 0xFE37, + 7206: 0xFE38, + 7207: 0xFE31, + 7209: 0xFE33, + 7210: 0xFE34, + 7316: 0x0410, + 7317: 0x0411, + 7318: 0x0412, + 7319: 0x0413, + 7320: 0x0414, + 7321: 0x0415, + 7322: 0x0401, + 7323: 0x0416, + 7324: 0x0417, + 7325: 0x0418, + 7326: 0x0419, + 7327: 0x041A, + 7328: 0x041B, + 7329: 0x041C, + 7330: 0x041D, + 7331: 0x041E, + 7332: 0x041F, + 7333: 0x0420, + 7334: 0x0421, + 7335: 0x0422, + 7336: 0x0423, + 7337: 0x0424, + 7338: 0x0425, + 7339: 0x0426, + 7340: 0x0427, + 7341: 0x0428, + 7342: 0x0429, + 7343: 0x042A, + 7344: 0x042B, + 7345: 0x042C, + 7346: 0x042D, + 7347: 0x042E, + 7348: 0x042F, + 7364: 0x0430, + 7365: 0x0431, + 7366: 0x0432, + 7367: 0x0433, + 7368: 0x0434, + 7369: 0x0435, + 7370: 0x0451, + 7371: 0x0436, + 7372: 0x0437, + 7373: 0x0438, + 7374: 0x0439, + 7375: 0x043A, + 7376: 0x043B, + 7377: 0x043C, + 7378: 0x043D, + 7379: 0x043E, + 7380: 0x043F, + 7381: 0x0440, + 7382: 0x0441, + 7383: 0x0442, + 7384: 0x0443, + 7385: 0x0444, + 7386: 0x0445, + 7387: 0x0446, + 7388: 0x0447, + 7389: 0x0448, + 7390: 0x0449, + 7391: 0x044A, + 7392: 0x044B, + 7393: 0x044C, + 7394: 0x044D, + 7395: 0x044E, + 7396: 0x044F, + 7410: 0x02CA, + 7411: 0x02CB, + 7412: 0x02D9, + 7413: 0x2013, + 7414: 0x2015, + 7415: 0x2025, + 7416: 0x2035, + 7417: 0x2105, + 7418: 0x2109, + 7419: 0x2196, + 7420: 0x2197, + 7421: 0x2198, + 7422: 0x2199, + 7423: 0x2215, + 7424: 0x221F, + 7425: 0x2223, + 7426: 0x2252, + 7427: 0x2266, + 7428: 0x2267, + 7429: 0x22BF, + 7430: 0x2550, + 7431: 0x2551, + 7432: 0x2552, + 7433: 0x2553, + 7434: 0x2554, + 7435: 0x2555, + 7436: 0x2556, + 7437: 0x2557, + 7438: 0x2558, + 7439: 0x2559, + 7440: 0x255A, + 7441: 0x255B, + 7442: 0x255C, + 7443: 0x255D, + 7444: 0x255E, + 7445: 0x255F, + 7446: 0x2560, + 7447: 0x2561, + 7448: 0x2562, + 7449: 0x2563, + 7450: 0x2564, + 7451: 0x2565, + 7452: 0x2566, + 7453: 0x2567, + 7454: 0x2568, + 7455: 0x2569, + 7456: 0x256A, + 7457: 0x256B, + 7458: 0x256C, + 7459: 0x256D, + 7460: 0x256E, + 7461: 0x256F, + 7462: 0x2570, + 7463: 0x2571, + 7464: 0x2572, + 7465: 0x2573, + 7466: 0x2581, + 7467: 0x2582, + 7468: 0x2583, + 7469: 0x2584, + 7470: 0x2585, + 7471: 0x2586, + 7472: 0x2587, + 7473: 0x2588, + 7474: 0x2589, + 7475: 0x258A, + 7476: 0x258B, + 7477: 0x258C, + 7478: 0x258D, + 7479: 0x258E, + 7480: 0x258F, + 7481: 0x2593, + 7482: 0x2594, + 7483: 0x2595, + 7484: 0x25BC, + 7485: 0x25BD, + 7486: 0x25E2, + 7487: 0x25E3, + 7488: 0x25E4, + 7489: 0x25E5, + 7490: 0x2609, + 7491: 0x2295, + 7492: 0x3012, + 7493: 0x301D, + 7494: 0x301E, + 7506: 0x0101, + 7507: 0x00E1, + 7508: 0x01CE, + 7509: 0x00E0, + 7510: 0x0113, + 7511: 0x00E9, + 7512: 0x011B, + 7513: 0x00E8, + 7514: 0x012B, + 7515: 0x00ED, + 7516: 0x01D0, + 7517: 0x00EC, + 7518: 0x014D, + 7519: 0x00F3, + 7520: 0x01D2, + 7521: 0x00F2, + 7522: 0x016B, + 7523: 0x00FA, + 7524: 0x01D4, + 7525: 0x00F9, + 7526: 0x01D6, + 7527: 0x01D8, + 7528: 0x01DA, + 7529: 0x01DC, + 7530: 0x00FC, + 7531: 0x00EA, + 7532: 0x0251, + 7534: 0x0144, + 7535: 0x0148, + 7536: 0x01F9, + 7537: 0x0261, + 7542: 0x3105, + 7543: 0x3106, + 7544: 0x3107, + 7545: 0x3108, + 7546: 0x3109, + 7547: 0x310A, + 7548: 0x310B, + 7549: 0x310C, + 7550: 0x310D, + 7551: 0x310E, + 7552: 0x310F, + 7553: 0x3110, + 7554: 0x3111, + 7555: 0x3112, + 7556: 0x3113, + 7557: 0x3114, + 7558: 0x3115, + 7559: 0x3116, + 7560: 0x3117, + 7561: 0x3118, + 7562: 0x3119, + 7563: 0x311A, + 7564: 0x311B, + 7565: 0x311C, + 7566: 0x311D, + 7567: 0x311E, + 7568: 0x311F, + 7569: 0x3120, + 7570: 0x3121, + 7571: 0x3122, + 7572: 0x3123, + 7573: 0x3124, + 7574: 0x3125, + 7575: 0x3126, + 7576: 0x3127, + 7577: 0x3128, + 7578: 0x3129, + 7600: 0x3021, + 7601: 0x3022, + 7602: 0x3023, + 7603: 0x3024, + 7604: 0x3025, + 7605: 0x3026, + 7606: 0x3027, + 7607: 0x3028, + 7608: 0x3029, + 7609: 0x32A3, + 7610: 0x338E, + 7611: 0x338F, + 7612: 0x339C, + 7613: 0x339D, + 7614: 0x339E, + 7615: 0x33A1, + 7616: 0x33C4, + 7617: 0x33CE, + 7618: 0x33D1, + 7619: 0x33D2, + 7620: 0x33D5, + 7621: 0xFE30, + 7622: 0xFFE2, + 7623: 0xFFE4, + 7625: 0x2121, + 7626: 0x3231, + 7628: 0x2010, + 7632: 0x30FC, + 7633: 0x309B, + 7634: 0x309C, + 7635: 0x30FD, + 7636: 0x30FE, + 7637: 0x3006, + 7638: 0x309D, + 7639: 0x309E, + 7640: 0xFE49, + 7641: 0xFE4A, + 7642: 0xFE4B, + 7643: 0xFE4C, + 7644: 0xFE4D, + 7645: 0xFE4E, + 7646: 0xFE4F, + 7647: 0xFE50, + 7648: 0xFE51, + 7649: 0xFE52, + 7650: 0xFE54, + 7651: 0xFE55, + 7652: 0xFE56, + 7653: 0xFE57, + 7654: 0xFE59, + 7655: 0xFE5A, + 7656: 0xFE5B, + 7657: 0xFE5C, + 7658: 0xFE5D, + 7659: 0xFE5E, + 7660: 0xFE5F, + 7661: 0xFE60, + 7662: 0xFE61, + 7663: 0xFE62, + 7664: 0xFE63, + 7665: 0xFE64, + 7666: 0xFE65, + 7667: 0xFE66, + 7668: 0xFE68, + 7669: 0xFE69, + 7670: 0xFE6A, + 7671: 0xFE6B, + 7672: 0x303E, + 7673: 0x2FF0, + 7674: 0x2FF1, + 7675: 0x2FF2, + 7676: 0x2FF3, + 7677: 0x2FF4, + 7678: 0x2FF5, + 7679: 0x2FF6, + 7680: 0x2FF7, + 7681: 0x2FF8, + 7682: 0x2FF9, + 7683: 0x2FFA, + 7684: 0x2FFB, + 7685: 0x3007, + 7699: 0x2500, + 7700: 0x2501, + 7701: 0x2502, + 7702: 0x2503, + 7703: 0x2504, + 7704: 0x2505, + 7705: 0x2506, + 7706: 0x2507, + 7707: 0x2508, + 7708: 0x2509, + 7709: 0x250A, + 7710: 0x250B, + 7711: 0x250C, + 7712: 0x250D, + 7713: 0x250E, + 7714: 0x250F, + 7715: 0x2510, + 7716: 0x2511, + 7717: 0x2512, + 7718: 0x2513, + 7719: 0x2514, + 7720: 0x2515, + 7721: 0x2516, + 7722: 0x2517, + 7723: 0x2518, + 7724: 0x2519, + 7725: 0x251A, + 7726: 0x251B, + 7727: 0x251C, + 7728: 0x251D, + 7729: 0x251E, + 7730: 0x251F, + 7731: 0x2520, + 7732: 0x2521, + 7733: 0x2522, + 7734: 0x2523, + 7735: 0x2524, + 7736: 0x2525, + 7737: 0x2526, + 7738: 0x2527, + 7739: 0x2528, + 7740: 0x2529, + 7741: 0x252A, + 7742: 0x252B, + 7743: 0x252C, + 7744: 0x252D, + 7745: 0x252E, + 7746: 0x252F, + 7747: 0x2530, + 7748: 0x2531, + 7749: 0x2532, + 7750: 0x2533, + 7751: 0x2534, + 7752: 0x2535, + 7753: 0x2536, + 7754: 0x2537, + 7755: 0x2538, + 7756: 0x2539, + 7757: 0x253A, + 7758: 0x253B, + 7759: 0x253C, + 7760: 0x253D, + 7761: 0x253E, + 7762: 0x253F, + 7763: 0x2540, + 7764: 0x2541, + 7765: 0x2542, + 7766: 0x2543, + 7767: 0x2544, + 7768: 0x2545, + 7769: 0x2546, + 7770: 0x2547, + 7771: 0x2548, + 7772: 0x2549, + 7773: 0x254A, + 7774: 0x254B, + 7790: 0x72DC, + 7791: 0x72DD, + 7792: 0x72DF, + 7793: 0x72E2, + 7794: 0x72E3, + 7795: 0x72E4, + 7796: 0x72E5, + 7797: 0x72E6, + 7798: 0x72E7, + 7799: 0x72EA, + 7800: 0x72EB, + 7801: 0x72F5, + 7802: 0x72F6, + 7803: 0x72F9, + 7804: 0x72FD, + 7805: 0x72FE, + 7806: 0x72FF, + 7807: 0x7300, + 7808: 0x7302, + 7809: 0x7304, + 7810: 0x7305, + 7811: 0x7306, + 7812: 0x7307, + 7813: 0x7308, + 7814: 0x7309, + 7815: 0x730B, + 7816: 0x730C, + 7817: 0x730D, + 7818: 0x730F, + 7819: 0x7310, + 7820: 0x7311, + 7821: 0x7312, + 7822: 0x7314, + 7823: 0x7318, + 7824: 0x7319, + 7825: 0x731A, + 7826: 0x731F, + 7827: 0x7320, + 7828: 0x7323, + 7829: 0x7324, + 7830: 0x7326, + 7831: 0x7327, + 7832: 0x7328, + 7833: 0x732D, + 7834: 0x732F, + 7835: 0x7330, + 7836: 0x7332, + 7837: 0x7333, + 7838: 0x7335, + 7839: 0x7336, + 7840: 0x733A, + 7841: 0x733B, + 7842: 0x733C, + 7843: 0x733D, + 7844: 0x7340, + 7845: 0x7341, + 7846: 0x7342, + 7847: 0x7343, + 7848: 0x7344, + 7849: 0x7345, + 7850: 0x7346, + 7851: 0x7347, + 7852: 0x7348, + 7853: 0x7349, + 7854: 0x734A, + 7855: 0x734B, + 7856: 0x734C, + 7857: 0x734E, + 7858: 0x734F, + 7859: 0x7351, + 7860: 0x7353, + 7861: 0x7354, + 7862: 0x7355, + 7863: 0x7356, + 7864: 0x7358, + 7865: 0x7359, + 7866: 0x735A, + 7867: 0x735B, + 7868: 0x735C, + 7869: 0x735D, + 7870: 0x735E, + 7871: 0x735F, + 7872: 0x7361, + 7873: 0x7362, + 7874: 0x7363, + 7875: 0x7364, + 7876: 0x7365, + 7877: 0x7366, + 7878: 0x7367, + 7879: 0x7368, + 7880: 0x7369, + 7881: 0x736A, + 7882: 0x736B, + 7883: 0x736E, + 7884: 0x7370, + 7885: 0x7371, + 7980: 0x7372, + 7981: 0x7373, + 7982: 0x7374, + 7983: 0x7375, + 7984: 0x7376, + 7985: 0x7377, + 7986: 0x7378, + 7987: 0x7379, + 7988: 0x737A, + 7989: 0x737B, + 7990: 0x737C, + 7991: 0x737D, + 7992: 0x737F, + 7993: 0x7380, + 7994: 0x7381, + 7995: 0x7382, + 7996: 0x7383, + 7997: 0x7385, + 7998: 0x7386, + 7999: 0x7388, + 8000: 0x738A, + 8001: 0x738C, + 8002: 0x738D, + 8003: 0x738F, + 8004: 0x7390, + 8005: 0x7392, + 8006: 0x7393, + 8007: 0x7394, + 8008: 0x7395, + 8009: 0x7397, + 8010: 0x7398, + 8011: 0x7399, + 8012: 0x739A, + 8013: 0x739C, + 8014: 0x739D, + 8015: 0x739E, + 8016: 0x73A0, + 8017: 0x73A1, + 8018: 0x73A3, + 8019: 0x73A4, + 8020: 0x73A5, + 8021: 0x73A6, + 8022: 0x73A7, + 8023: 0x73A8, + 8024: 0x73AA, + 8025: 0x73AC, + 8026: 0x73AD, + 8027: 0x73B1, + 8028: 0x73B4, + 8029: 0x73B5, + 8030: 0x73B6, + 8031: 0x73B8, + 8032: 0x73B9, + 8033: 0x73BC, + 8034: 0x73BD, + 8035: 0x73BE, + 8036: 0x73BF, + 8037: 0x73C1, + 8038: 0x73C3, + 8039: 0x73C4, + 8040: 0x73C5, + 8041: 0x73C6, + 8042: 0x73C7, + 8043: 0x73CB, + 8044: 0x73CC, + 8045: 0x73CE, + 8046: 0x73D2, + 8047: 0x73D3, + 8048: 0x73D4, + 8049: 0x73D5, + 8050: 0x73D6, + 8051: 0x73D7, + 8052: 0x73D8, + 8053: 0x73DA, + 8054: 0x73DB, + 8055: 0x73DC, + 8056: 0x73DD, + 8057: 0x73DF, + 8058: 0x73E1, + 8059: 0x73E2, + 8060: 0x73E3, + 8061: 0x73E4, + 8062: 0x73E6, + 8063: 0x73E8, + 8064: 0x73EA, + 8065: 0x73EB, + 8066: 0x73EC, + 8067: 0x73EE, + 8068: 0x73EF, + 8069: 0x73F0, + 8070: 0x73F1, + 8071: 0x73F3, + 8072: 0x73F4, + 8073: 0x73F5, + 8074: 0x73F6, + 8075: 0x73F7, + 8170: 0x73F8, + 8171: 0x73F9, + 8172: 0x73FA, + 8173: 0x73FB, + 8174: 0x73FC, + 8175: 0x73FD, + 8176: 0x73FE, + 8177: 0x73FF, + 8178: 0x7400, + 8179: 0x7401, + 8180: 0x7402, + 8181: 0x7404, + 8182: 0x7407, + 8183: 0x7408, + 8184: 0x740B, + 8185: 0x740C, + 8186: 0x740D, + 8187: 0x740E, + 8188: 0x7411, + 8189: 0x7412, + 8190: 0x7413, + 8191: 0x7414, + 8192: 0x7415, + 8193: 0x7416, + 8194: 0x7417, + 8195: 0x7418, + 8196: 0x7419, + 8197: 0x741C, + 8198: 0x741D, + 8199: 0x741E, + 8200: 0x741F, + 8201: 0x7420, + 8202: 0x7421, + 8203: 0x7423, + 8204: 0x7424, + 8205: 0x7427, + 8206: 0x7429, + 8207: 0x742B, + 8208: 0x742D, + 8209: 0x742F, + 8210: 0x7431, + 8211: 0x7432, + 8212: 0x7437, + 8213: 0x7438, + 8214: 0x7439, + 8215: 0x743A, + 8216: 0x743B, + 8217: 0x743D, + 8218: 0x743E, + 8219: 0x743F, + 8220: 0x7440, + 8221: 0x7442, + 8222: 0x7443, + 8223: 0x7444, + 8224: 0x7445, + 8225: 0x7446, + 8226: 0x7447, + 8227: 0x7448, + 8228: 0x7449, + 8229: 0x744A, + 8230: 0x744B, + 8231: 0x744C, + 8232: 0x744D, + 8233: 0x744E, + 8234: 0x744F, + 8235: 0x7450, + 8236: 0x7451, + 8237: 0x7452, + 8238: 0x7453, + 8239: 0x7454, + 8240: 0x7456, + 8241: 0x7458, + 8242: 0x745D, + 8243: 0x7460, + 8244: 0x7461, + 8245: 0x7462, + 8246: 0x7463, + 8247: 0x7464, + 8248: 0x7465, + 8249: 0x7466, + 8250: 0x7467, + 8251: 0x7468, + 8252: 0x7469, + 8253: 0x746A, + 8254: 0x746B, + 8255: 0x746C, + 8256: 0x746E, + 8257: 0x746F, + 8258: 0x7471, + 8259: 0x7472, + 8260: 0x7473, + 8261: 0x7474, + 8262: 0x7475, + 8263: 0x7478, + 8264: 0x7479, + 8265: 0x747A, + 8360: 0x747B, + 8361: 0x747C, + 8362: 0x747D, + 8363: 0x747F, + 8364: 0x7482, + 8365: 0x7484, + 8366: 0x7485, + 8367: 0x7486, + 8368: 0x7488, + 8369: 0x7489, + 8370: 0x748A, + 8371: 0x748C, + 8372: 0x748D, + 8373: 0x748F, + 8374: 0x7491, + 8375: 0x7492, + 8376: 0x7493, + 8377: 0x7494, + 8378: 0x7495, + 8379: 0x7496, + 8380: 0x7497, + 8381: 0x7498, + 8382: 0x7499, + 8383: 0x749A, + 8384: 0x749B, + 8385: 0x749D, + 8386: 0x749F, + 8387: 0x74A0, + 8388: 0x74A1, + 8389: 0x74A2, + 8390: 0x74A3, + 8391: 0x74A4, + 8392: 0x74A5, + 8393: 0x74A6, + 8394: 0x74AA, + 8395: 0x74AB, + 8396: 0x74AC, + 8397: 0x74AD, + 8398: 0x74AE, + 8399: 0x74AF, + 8400: 0x74B0, + 8401: 0x74B1, + 8402: 0x74B2, + 8403: 0x74B3, + 8404: 0x74B4, + 8405: 0x74B5, + 8406: 0x74B6, + 8407: 0x74B7, + 8408: 0x74B8, + 8409: 0x74B9, + 8410: 0x74BB, + 8411: 0x74BC, + 8412: 0x74BD, + 8413: 0x74BE, + 8414: 0x74BF, + 8415: 0x74C0, + 8416: 0x74C1, + 8417: 0x74C2, + 8418: 0x74C3, + 8419: 0x74C4, + 8420: 0x74C5, + 8421: 0x74C6, + 8422: 0x74C7, + 8423: 0x74C8, + 8424: 0x74C9, + 8425: 0x74CA, + 8426: 0x74CB, + 8427: 0x74CC, + 8428: 0x74CD, + 8429: 0x74CE, + 8430: 0x74CF, + 8431: 0x74D0, + 8432: 0x74D1, + 8433: 0x74D3, + 8434: 0x74D4, + 8435: 0x74D5, + 8436: 0x74D6, + 8437: 0x74D7, + 8438: 0x74D8, + 8439: 0x74D9, + 8440: 0x74DA, + 8441: 0x74DB, + 8442: 0x74DD, + 8443: 0x74DF, + 8444: 0x74E1, + 8445: 0x74E5, + 8446: 0x74E7, + 8447: 0x74E8, + 8448: 0x74E9, + 8449: 0x74EA, + 8450: 0x74EB, + 8451: 0x74EC, + 8452: 0x74ED, + 8453: 0x74F0, + 8454: 0x74F1, + 8455: 0x74F2, + 8550: 0x74F3, + 8551: 0x74F5, + 8552: 0x74F8, + 8553: 0x74F9, + 8554: 0x74FA, + 8555: 0x74FB, + 8556: 0x74FC, + 8557: 0x74FD, + 8558: 0x74FE, + 8559: 0x7500, + 8560: 0x7501, + 8561: 0x7502, + 8562: 0x7503, + 8563: 0x7505, + 8564: 0x7506, + 8565: 0x7507, + 8566: 0x7508, + 8567: 0x7509, + 8568: 0x750A, + 8569: 0x750B, + 8570: 0x750C, + 8571: 0x750E, + 8572: 0x7510, + 8573: 0x7512, + 8574: 0x7514, + 8575: 0x7515, + 8576: 0x7516, + 8577: 0x7517, + 8578: 0x751B, + 8579: 0x751D, + 8580: 0x751E, + 8581: 0x7520, + 8582: 0x7521, + 8583: 0x7522, + 8584: 0x7523, + 8585: 0x7524, + 8586: 0x7526, + 8587: 0x7527, + 8588: 0x752A, + 8589: 0x752E, + 8590: 0x7534, + 8591: 0x7536, + 8592: 0x7539, + 8593: 0x753C, + 8594: 0x753D, + 8595: 0x753F, + 8596: 0x7541, + 8597: 0x7542, + 8598: 0x7543, + 8599: 0x7544, + 8600: 0x7546, + 8601: 0x7547, + 8602: 0x7549, + 8603: 0x754A, + 8604: 0x754D, + 8605: 0x7550, + 8606: 0x7551, + 8607: 0x7552, + 8608: 0x7553, + 8609: 0x7555, + 8610: 0x7556, + 8611: 0x7557, + 8612: 0x7558, + 8613: 0x755D, + 8614: 0x755E, + 8615: 0x755F, + 8616: 0x7560, + 8617: 0x7561, + 8618: 0x7562, + 8619: 0x7563, + 8620: 0x7564, + 8621: 0x7567, + 8622: 0x7568, + 8623: 0x7569, + 8624: 0x756B, + 8625: 0x756C, + 8626: 0x756D, + 8627: 0x756E, + 8628: 0x756F, + 8629: 0x7570, + 8630: 0x7571, + 8631: 0x7573, + 8632: 0x7575, + 8633: 0x7576, + 8634: 0x7577, + 8635: 0x757A, + 8636: 0x757B, + 8637: 0x757C, + 8638: 0x757D, + 8639: 0x757E, + 8640: 0x7580, + 8641: 0x7581, + 8642: 0x7582, + 8643: 0x7584, + 8644: 0x7585, + 8645: 0x7587, + 8740: 0x7588, + 8741: 0x7589, + 8742: 0x758A, + 8743: 0x758C, + 8744: 0x758D, + 8745: 0x758E, + 8746: 0x7590, + 8747: 0x7593, + 8748: 0x7595, + 8749: 0x7598, + 8750: 0x759B, + 8751: 0x759C, + 8752: 0x759E, + 8753: 0x75A2, + 8754: 0x75A6, + 8755: 0x75A7, + 8756: 0x75A8, + 8757: 0x75A9, + 8758: 0x75AA, + 8759: 0x75AD, + 8760: 0x75B6, + 8761: 0x75B7, + 8762: 0x75BA, + 8763: 0x75BB, + 8764: 0x75BF, + 8765: 0x75C0, + 8766: 0x75C1, + 8767: 0x75C6, + 8768: 0x75CB, + 8769: 0x75CC, + 8770: 0x75CE, + 8771: 0x75CF, + 8772: 0x75D0, + 8773: 0x75D1, + 8774: 0x75D3, + 8775: 0x75D7, + 8776: 0x75D9, + 8777: 0x75DA, + 8778: 0x75DC, + 8779: 0x75DD, + 8780: 0x75DF, + 8781: 0x75E0, + 8782: 0x75E1, + 8783: 0x75E5, + 8784: 0x75E9, + 8785: 0x75EC, + 8786: 0x75ED, + 8787: 0x75EE, + 8788: 0x75EF, + 8789: 0x75F2, + 8790: 0x75F3, + 8791: 0x75F5, + 8792: 0x75F6, + 8793: 0x75F7, + 8794: 0x75F8, + 8795: 0x75FA, + 8796: 0x75FB, + 8797: 0x75FD, + 8798: 0x75FE, + 8799: 0x7602, + 8800: 0x7604, + 8801: 0x7606, + 8802: 0x7607, + 8803: 0x7608, + 8804: 0x7609, + 8805: 0x760B, + 8806: 0x760D, + 8807: 0x760E, + 8808: 0x760F, + 8809: 0x7611, + 8810: 0x7612, + 8811: 0x7613, + 8812: 0x7614, + 8813: 0x7616, + 8814: 0x761A, + 8815: 0x761C, + 8816: 0x761D, + 8817: 0x761E, + 8818: 0x7621, + 8819: 0x7623, + 8820: 0x7627, + 8821: 0x7628, + 8822: 0x762C, + 8823: 0x762E, + 8824: 0x762F, + 8825: 0x7631, + 8826: 0x7632, + 8827: 0x7636, + 8828: 0x7637, + 8829: 0x7639, + 8830: 0x763A, + 8831: 0x763B, + 8832: 0x763D, + 8833: 0x7641, + 8834: 0x7642, + 8835: 0x7644, + 8930: 0x7645, + 8931: 0x7646, + 8932: 0x7647, + 8933: 0x7648, + 8934: 0x7649, + 8935: 0x764A, + 8936: 0x764B, + 8937: 0x764E, + 8938: 0x764F, + 8939: 0x7650, + 8940: 0x7651, + 8941: 0x7652, + 8942: 0x7653, + 8943: 0x7655, + 8944: 0x7657, + 8945: 0x7658, + 8946: 0x7659, + 8947: 0x765A, + 8948: 0x765B, + 8949: 0x765D, + 8950: 0x765F, + 8951: 0x7660, + 8952: 0x7661, + 8953: 0x7662, + 8954: 0x7664, + 8955: 0x7665, + 8956: 0x7666, + 8957: 0x7667, + 8958: 0x7668, + 8959: 0x7669, + 8960: 0x766A, + 8961: 0x766C, + 8962: 0x766D, + 8963: 0x766E, + 8964: 0x7670, + 8965: 0x7671, + 8966: 0x7672, + 8967: 0x7673, + 8968: 0x7674, + 8969: 0x7675, + 8970: 0x7676, + 8971: 0x7677, + 8972: 0x7679, + 8973: 0x767A, + 8974: 0x767C, + 8975: 0x767F, + 8976: 0x7680, + 8977: 0x7681, + 8978: 0x7683, + 8979: 0x7685, + 8980: 0x7689, + 8981: 0x768A, + 8982: 0x768C, + 8983: 0x768D, + 8984: 0x768F, + 8985: 0x7690, + 8986: 0x7692, + 8987: 0x7694, + 8988: 0x7695, + 8989: 0x7697, + 8990: 0x7698, + 8991: 0x769A, + 8992: 0x769B, + 8993: 0x769C, + 8994: 0x769D, + 8995: 0x769E, + 8996: 0x769F, + 8997: 0x76A0, + 8998: 0x76A1, + 8999: 0x76A2, + 9000: 0x76A3, + 9001: 0x76A5, + 9002: 0x76A6, + 9003: 0x76A7, + 9004: 0x76A8, + 9005: 0x76A9, + 9006: 0x76AA, + 9007: 0x76AB, + 9008: 0x76AC, + 9009: 0x76AD, + 9010: 0x76AF, + 9011: 0x76B0, + 9012: 0x76B3, + 9013: 0x76B5, + 9014: 0x76B6, + 9015: 0x76B7, + 9016: 0x76B8, + 9017: 0x76B9, + 9018: 0x76BA, + 9019: 0x76BB, + 9020: 0x76BC, + 9021: 0x76BD, + 9022: 0x76BE, + 9023: 0x76C0, + 9024: 0x76C1, + 9025: 0x76C3, + 9026: 0x554A, + 9027: 0x963F, + 9028: 0x57C3, + 9029: 0x6328, + 9030: 0x54CE, + 9031: 0x5509, + 9032: 0x54C0, + 9033: 0x7691, + 9034: 0x764C, + 9035: 0x853C, + 9036: 0x77EE, + 9037: 0x827E, + 9038: 0x788D, + 9039: 0x7231, + 9040: 0x9698, + 9041: 0x978D, + 9042: 0x6C28, + 9043: 0x5B89, + 9044: 0x4FFA, + 9045: 0x6309, + 9046: 0x6697, + 9047: 0x5CB8, + 9048: 0x80FA, + 9049: 0x6848, + 9050: 0x80AE, + 9051: 0x6602, + 9052: 0x76CE, + 9053: 0x51F9, + 9054: 0x6556, + 9055: 0x71AC, + 9056: 0x7FF1, + 9057: 0x8884, + 9058: 0x50B2, + 9059: 0x5965, + 9060: 0x61CA, + 9061: 0x6FB3, + 9062: 0x82AD, + 9063: 0x634C, + 9064: 0x6252, + 9065: 0x53ED, + 9066: 0x5427, + 9067: 0x7B06, + 9068: 0x516B, + 9069: 0x75A4, + 9070: 0x5DF4, + 9071: 0x62D4, + 9072: 0x8DCB, + 9073: 0x9776, + 9074: 0x628A, + 9075: 0x8019, + 9076: 0x575D, + 9077: 0x9738, + 9078: 0x7F62, + 9079: 0x7238, + 9080: 0x767D, + 9081: 0x67CF, + 9082: 0x767E, + 9083: 0x6446, + 9084: 0x4F70, + 9085: 0x8D25, + 9086: 0x62DC, + 9087: 0x7A17, + 9088: 0x6591, + 9089: 0x73ED, + 9090: 0x642C, + 9091: 0x6273, + 9092: 0x822C, + 9093: 0x9881, + 9094: 0x677F, + 9095: 0x7248, + 9096: 0x626E, + 9097: 0x62CC, + 9098: 0x4F34, + 9099: 0x74E3, + 9100: 0x534A, + 9101: 0x529E, + 9102: 0x7ECA, + 9103: 0x90A6, + 9104: 0x5E2E, + 9105: 0x6886, + 9106: 0x699C, + 9107: 0x8180, + 9108: 0x7ED1, + 9109: 0x68D2, + 9110: 0x78C5, + 9111: 0x868C, + 9112: 0x9551, + 9113: 0x508D, + 9114: 0x8C24, + 9115: 0x82DE, + 9116: 0x80DE, + 9117: 0x5305, + 9118: 0x8912, + 9119: 0x5265, + 9120: 0x76C4, + 9121: 0x76C7, + 9122: 0x76C9, + 9123: 0x76CB, + 9124: 0x76CC, + 9125: 0x76D3, + 9126: 0x76D5, + 9127: 0x76D9, + 9128: 0x76DA, + 9129: 0x76DC, + 9130: 0x76DD, + 9131: 0x76DE, + 9132: 0x76E0, + 9133: 0x76E1, + 9134: 0x76E2, + 9135: 0x76E3, + 9136: 0x76E4, + 9137: 0x76E6, + 9138: 0x76E7, + 9139: 0x76E8, + 9140: 0x76E9, + 9141: 0x76EA, + 9142: 0x76EB, + 9143: 0x76EC, + 9144: 0x76ED, + 9145: 0x76F0, + 9146: 0x76F3, + 9147: 0x76F5, + 9148: 0x76F6, + 9149: 0x76F7, + 9150: 0x76FA, + 9151: 0x76FB, + 9152: 0x76FD, + 9153: 0x76FF, + 9154: 0x7700, + 9155: 0x7702, + 9156: 0x7703, + 9157: 0x7705, + 9158: 0x7706, + 9159: 0x770A, + 9160: 0x770C, + 9161: 0x770E, + 9162: 0x770F, + 9163: 0x7710, + 9164: 0x7711, + 9165: 0x7712, + 9166: 0x7713, + 9167: 0x7714, + 9168: 0x7715, + 9169: 0x7716, + 9170: 0x7717, + 9171: 0x7718, + 9172: 0x771B, + 9173: 0x771C, + 9174: 0x771D, + 9175: 0x771E, + 9176: 0x7721, + 9177: 0x7723, + 9178: 0x7724, + 9179: 0x7725, + 9180: 0x7727, + 9181: 0x772A, + 9182: 0x772B, + 9183: 0x772C, + 9184: 0x772E, + 9185: 0x7730, + 9186: 0x7731, + 9187: 0x7732, + 9188: 0x7733, + 9189: 0x7734, + 9190: 0x7739, + 9191: 0x773B, + 9192: 0x773D, + 9193: 0x773E, + 9194: 0x773F, + 9195: 0x7742, + 9196: 0x7744, + 9197: 0x7745, + 9198: 0x7746, + 9199: 0x7748, + 9200: 0x7749, + 9201: 0x774A, + 9202: 0x774B, + 9203: 0x774C, + 9204: 0x774D, + 9205: 0x774E, + 9206: 0x774F, + 9207: 0x7752, + 9208: 0x7753, + 9209: 0x7754, + 9210: 0x7755, + 9211: 0x7756, + 9212: 0x7757, + 9213: 0x7758, + 9214: 0x7759, + 9215: 0x775C, + 9216: 0x8584, + 9217: 0x96F9, + 9218: 0x4FDD, + 9219: 0x5821, + 9220: 0x9971, + 9221: 0x5B9D, + 9222: 0x62B1, + 9223: 0x62A5, + 9224: 0x66B4, + 9225: 0x8C79, + 9226: 0x9C8D, + 9227: 0x7206, + 9228: 0x676F, + 9229: 0x7891, + 9230: 0x60B2, + 9231: 0x5351, + 9232: 0x5317, + 9233: 0x8F88, + 9234: 0x80CC, + 9235: 0x8D1D, + 9236: 0x94A1, + 9237: 0x500D, + 9238: 0x72C8, + 9239: 0x5907, + 9240: 0x60EB, + 9241: 0x7119, + 9242: 0x88AB, + 9243: 0x5954, + 9244: 0x82EF, + 9245: 0x672C, + 9246: 0x7B28, + 9247: 0x5D29, + 9248: 0x7EF7, + 9249: 0x752D, + 9250: 0x6CF5, + 9251: 0x8E66, + 9252: 0x8FF8, + 9253: 0x903C, + 9254: 0x9F3B, + 9255: 0x6BD4, + 9256: 0x9119, + 9257: 0x7B14, + 9258: 0x5F7C, + 9259: 0x78A7, + 9260: 0x84D6, + 9261: 0x853D, + 9262: 0x6BD5, + 9263: 0x6BD9, + 9264: 0x6BD6, + 9265: 0x5E01, + 9266: 0x5E87, + 9267: 0x75F9, + 9268: 0x95ED, + 9269: 0x655D, + 9270: 0x5F0A, + 9271: 0x5FC5, + 9272: 0x8F9F, + 9273: 0x58C1, + 9274: 0x81C2, + 9275: 0x907F, + 9276: 0x965B, + 9277: 0x97AD, + 9278: 0x8FB9, + 9279: 0x7F16, + 9280: 0x8D2C, + 9281: 0x6241, + 9282: 0x4FBF, + 9283: 0x53D8, + 9284: 0x535E, + 9285: 0x8FA8, + 9286: 0x8FA9, + 9287: 0x8FAB, + 9288: 0x904D, + 9289: 0x6807, + 9290: 0x5F6A, + 9291: 0x8198, + 9292: 0x8868, + 9293: 0x9CD6, + 9294: 0x618B, + 9295: 0x522B, + 9296: 0x762A, + 9297: 0x5F6C, + 9298: 0x658C, + 9299: 0x6FD2, + 9300: 0x6EE8, + 9301: 0x5BBE, + 9302: 0x6448, + 9303: 0x5175, + 9304: 0x51B0, + 9305: 0x67C4, + 9306: 0x4E19, + 9307: 0x79C9, + 9308: 0x997C, + 9309: 0x70B3, + 9310: 0x775D, + 9311: 0x775E, + 9312: 0x775F, + 9313: 0x7760, + 9314: 0x7764, + 9315: 0x7767, + 9316: 0x7769, + 9317: 0x776A, + 9318: 0x776D, + 9319: 0x776E, + 9320: 0x776F, + 9321: 0x7770, + 9322: 0x7771, + 9323: 0x7772, + 9324: 0x7773, + 9325: 0x7774, + 9326: 0x7775, + 9327: 0x7776, + 9328: 0x7777, + 9329: 0x7778, + 9330: 0x777A, + 9331: 0x777B, + 9332: 0x777C, + 9333: 0x7781, + 9334: 0x7782, + 9335: 0x7783, + 9336: 0x7786, + 9337: 0x7787, + 9338: 0x7788, + 9339: 0x7789, + 9340: 0x778A, + 9341: 0x778B, + 9342: 0x778F, + 9343: 0x7790, + 9344: 0x7793, + 9345: 0x7794, + 9346: 0x7795, + 9347: 0x7796, + 9348: 0x7797, + 9349: 0x7798, + 9350: 0x7799, + 9351: 0x779A, + 9352: 0x779B, + 9353: 0x779C, + 9354: 0x779D, + 9355: 0x779E, + 9356: 0x77A1, + 9357: 0x77A3, + 9358: 0x77A4, + 9359: 0x77A6, + 9360: 0x77A8, + 9361: 0x77AB, + 9362: 0x77AD, + 9363: 0x77AE, + 9364: 0x77AF, + 9365: 0x77B1, + 9366: 0x77B2, + 9367: 0x77B4, + 9368: 0x77B6, + 9369: 0x77B7, + 9370: 0x77B8, + 9371: 0x77B9, + 9372: 0x77BA, + 9373: 0x77BC, + 9374: 0x77BE, + 9375: 0x77C0, + 9376: 0x77C1, + 9377: 0x77C2, + 9378: 0x77C3, + 9379: 0x77C4, + 9380: 0x77C5, + 9381: 0x77C6, + 9382: 0x77C7, + 9383: 0x77C8, + 9384: 0x77C9, + 9385: 0x77CA, + 9386: 0x77CB, + 9387: 0x77CC, + 9388: 0x77CE, + 9389: 0x77CF, + 9390: 0x77D0, + 9391: 0x77D1, + 9392: 0x77D2, + 9393: 0x77D3, + 9394: 0x77D4, + 9395: 0x77D5, + 9396: 0x77D6, + 9397: 0x77D8, + 9398: 0x77D9, + 9399: 0x77DA, + 9400: 0x77DD, + 9401: 0x77DE, + 9402: 0x77DF, + 9403: 0x77E0, + 9404: 0x77E1, + 9405: 0x77E4, + 9406: 0x75C5, + 9407: 0x5E76, + 9408: 0x73BB, + 9409: 0x83E0, + 9410: 0x64AD, + 9411: 0x62E8, + 9412: 0x94B5, + 9413: 0x6CE2, + 9414: 0x535A, + 9415: 0x52C3, + 9416: 0x640F, + 9417: 0x94C2, + 9418: 0x7B94, + 9419: 0x4F2F, + 9420: 0x5E1B, + 9421: 0x8236, + 9422: 0x8116, + 9423: 0x818A, + 9424: 0x6E24, + 9425: 0x6CCA, + 9426: 0x9A73, + 9427: 0x6355, + 9428: 0x535C, + 9429: 0x54FA, + 9430: 0x8865, + 9431: 0x57E0, + 9432: 0x4E0D, + 9433: 0x5E03, + 9434: 0x6B65, + 9435: 0x7C3F, + 9436: 0x90E8, + 9437: 0x6016, + 9438: 0x64E6, + 9439: 0x731C, + 9440: 0x88C1, + 9441: 0x6750, + 9442: 0x624D, + 9443: 0x8D22, + 9444: 0x776C, + 9445: 0x8E29, + 9446: 0x91C7, + 9447: 0x5F69, + 9448: 0x83DC, + 9449: 0x8521, + 9450: 0x9910, + 9451: 0x53C2, + 9452: 0x8695, + 9453: 0x6B8B, + 9454: 0x60ED, + 9455: 0x60E8, + 9456: 0x707F, + 9457: 0x82CD, + 9458: 0x8231, + 9459: 0x4ED3, + 9460: 0x6CA7, + 9461: 0x85CF, + 9462: 0x64CD, + 9463: 0x7CD9, + 9464: 0x69FD, + 9465: 0x66F9, + 9466: 0x8349, + 9467: 0x5395, + 9468: 0x7B56, + 9469: 0x4FA7, + 9470: 0x518C, + 9471: 0x6D4B, + 9472: 0x5C42, + 9473: 0x8E6D, + 9474: 0x63D2, + 9475: 0x53C9, + 9476: 0x832C, + 9477: 0x8336, + 9478: 0x67E5, + 9479: 0x78B4, + 9480: 0x643D, + 9481: 0x5BDF, + 9482: 0x5C94, + 9483: 0x5DEE, + 9484: 0x8BE7, + 9485: 0x62C6, + 9486: 0x67F4, + 9487: 0x8C7A, + 9488: 0x6400, + 9489: 0x63BA, + 9490: 0x8749, + 9491: 0x998B, + 9492: 0x8C17, + 9493: 0x7F20, + 9494: 0x94F2, + 9495: 0x4EA7, + 9496: 0x9610, + 9497: 0x98A4, + 9498: 0x660C, + 9499: 0x7316, + 9500: 0x77E6, + 9501: 0x77E8, + 9502: 0x77EA, + 9503: 0x77EF, + 9504: 0x77F0, + 9505: 0x77F1, + 9506: 0x77F2, + 9507: 0x77F4, + 9508: 0x77F5, + 9509: 0x77F7, + 9510: 0x77F9, + 9511: 0x77FA, + 9512: 0x77FB, + 9513: 0x77FC, + 9514: 0x7803, + 9515: 0x7804, + 9516: 0x7805, + 9517: 0x7806, + 9518: 0x7807, + 9519: 0x7808, + 9520: 0x780A, + 9521: 0x780B, + 9522: 0x780E, + 9523: 0x780F, + 9524: 0x7810, + 9525: 0x7813, + 9526: 0x7815, + 9527: 0x7819, + 9528: 0x781B, + 9529: 0x781E, + 9530: 0x7820, + 9531: 0x7821, + 9532: 0x7822, + 9533: 0x7824, + 9534: 0x7828, + 9535: 0x782A, + 9536: 0x782B, + 9537: 0x782E, + 9538: 0x782F, + 9539: 0x7831, + 9540: 0x7832, + 9541: 0x7833, + 9542: 0x7835, + 9543: 0x7836, + 9544: 0x783D, + 9545: 0x783F, + 9546: 0x7841, + 9547: 0x7842, + 9548: 0x7843, + 9549: 0x7844, + 9550: 0x7846, + 9551: 0x7848, + 9552: 0x7849, + 9553: 0x784A, + 9554: 0x784B, + 9555: 0x784D, + 9556: 0x784F, + 9557: 0x7851, + 9558: 0x7853, + 9559: 0x7854, + 9560: 0x7858, + 9561: 0x7859, + 9562: 0x785A, + 9563: 0x785B, + 9564: 0x785C, + 9565: 0x785E, + 9566: 0x785F, + 9567: 0x7860, + 9568: 0x7861, + 9569: 0x7862, + 9570: 0x7863, + 9571: 0x7864, + 9572: 0x7865, + 9573: 0x7866, + 9574: 0x7867, + 9575: 0x7868, + 9576: 0x7869, + 9577: 0x786F, + 9578: 0x7870, + 9579: 0x7871, + 9580: 0x7872, + 9581: 0x7873, + 9582: 0x7874, + 9583: 0x7875, + 9584: 0x7876, + 9585: 0x7878, + 9586: 0x7879, + 9587: 0x787A, + 9588: 0x787B, + 9589: 0x787D, + 9590: 0x787E, + 9591: 0x787F, + 9592: 0x7880, + 9593: 0x7881, + 9594: 0x7882, + 9595: 0x7883, + 9596: 0x573A, + 9597: 0x5C1D, + 9598: 0x5E38, + 9599: 0x957F, + 9600: 0x507F, + 9601: 0x80A0, + 9602: 0x5382, + 9603: 0x655E, + 9604: 0x7545, + 9605: 0x5531, + 9606: 0x5021, + 9607: 0x8D85, + 9608: 0x6284, + 9609: 0x949E, + 9610: 0x671D, + 9611: 0x5632, + 9612: 0x6F6E, + 9613: 0x5DE2, + 9614: 0x5435, + 9615: 0x7092, + 9616: 0x8F66, + 9617: 0x626F, + 9618: 0x64A4, + 9619: 0x63A3, + 9620: 0x5F7B, + 9621: 0x6F88, + 9622: 0x90F4, + 9623: 0x81E3, + 9624: 0x8FB0, + 9625: 0x5C18, + 9626: 0x6668, + 9627: 0x5FF1, + 9628: 0x6C89, + 9629: 0x9648, + 9630: 0x8D81, + 9631: 0x886C, + 9632: 0x6491, + 9633: 0x79F0, + 9634: 0x57CE, + 9635: 0x6A59, + 9636: 0x6210, + 9637: 0x5448, + 9638: 0x4E58, + 9639: 0x7A0B, + 9640: 0x60E9, + 9641: 0x6F84, + 9642: 0x8BDA, + 9643: 0x627F, + 9644: 0x901E, + 9645: 0x9A8B, + 9646: 0x79E4, + 9647: 0x5403, + 9648: 0x75F4, + 9649: 0x6301, + 9650: 0x5319, + 9651: 0x6C60, + 9652: 0x8FDF, + 9653: 0x5F1B, + 9654: 0x9A70, + 9655: 0x803B, + 9656: 0x9F7F, + 9657: 0x4F88, + 9658: 0x5C3A, + 9659: 0x8D64, + 9660: 0x7FC5, + 9661: 0x65A5, + 9662: 0x70BD, + 9663: 0x5145, + 9664: 0x51B2, + 9665: 0x866B, + 9666: 0x5D07, + 9667: 0x5BA0, + 9668: 0x62BD, + 9669: 0x916C, + 9670: 0x7574, + 9671: 0x8E0C, + 9672: 0x7A20, + 9673: 0x6101, + 9674: 0x7B79, + 9675: 0x4EC7, + 9676: 0x7EF8, + 9677: 0x7785, + 9678: 0x4E11, + 9679: 0x81ED, + 9680: 0x521D, + 9681: 0x51FA, + 9682: 0x6A71, + 9683: 0x53A8, + 9684: 0x8E87, + 9685: 0x9504, + 9686: 0x96CF, + 9687: 0x6EC1, + 9688: 0x9664, + 9689: 0x695A, + 9690: 0x7884, + 9691: 0x7885, + 9692: 0x7886, + 9693: 0x7888, + 9694: 0x788A, + 9695: 0x788B, + 9696: 0x788F, + 9697: 0x7890, + 9698: 0x7892, + 9699: 0x7894, + 9700: 0x7895, + 9701: 0x7896, + 9702: 0x7899, + 9703: 0x789D, + 9704: 0x789E, + 9705: 0x78A0, + 9706: 0x78A2, + 9707: 0x78A4, + 9708: 0x78A6, + 9709: 0x78A8, + 9710: 0x78A9, + 9711: 0x78AA, + 9712: 0x78AB, + 9713: 0x78AC, + 9714: 0x78AD, + 9715: 0x78AE, + 9716: 0x78AF, + 9717: 0x78B5, + 9718: 0x78B6, + 9719: 0x78B7, + 9720: 0x78B8, + 9721: 0x78BA, + 9722: 0x78BB, + 9723: 0x78BC, + 9724: 0x78BD, + 9725: 0x78BF, + 9726: 0x78C0, + 9727: 0x78C2, + 9728: 0x78C3, + 9729: 0x78C4, + 9730: 0x78C6, + 9731: 0x78C7, + 9732: 0x78C8, + 9733: 0x78CC, + 9734: 0x78CD, + 9735: 0x78CE, + 9736: 0x78CF, + 9737: 0x78D1, + 9738: 0x78D2, + 9739: 0x78D3, + 9740: 0x78D6, + 9741: 0x78D7, + 9742: 0x78D8, + 9743: 0x78DA, + 9744: 0x78DB, + 9745: 0x78DC, + 9746: 0x78DD, + 9747: 0x78DE, + 9748: 0x78DF, + 9749: 0x78E0, + 9750: 0x78E1, + 9751: 0x78E2, + 9752: 0x78E3, + 9753: 0x78E4, + 9754: 0x78E5, + 9755: 0x78E6, + 9756: 0x78E7, + 9757: 0x78E9, + 9758: 0x78EA, + 9759: 0x78EB, + 9760: 0x78ED, + 9761: 0x78EE, + 9762: 0x78EF, + 9763: 0x78F0, + 9764: 0x78F1, + 9765: 0x78F3, + 9766: 0x78F5, + 9767: 0x78F6, + 9768: 0x78F8, + 9769: 0x78F9, + 9770: 0x78FB, + 9771: 0x78FC, + 9772: 0x78FD, + 9773: 0x78FE, + 9774: 0x78FF, + 9775: 0x7900, + 9776: 0x7902, + 9777: 0x7903, + 9778: 0x7904, + 9779: 0x7906, + 9780: 0x7907, + 9781: 0x7908, + 9782: 0x7909, + 9783: 0x790A, + 9784: 0x790B, + 9785: 0x790C, + 9786: 0x7840, + 9787: 0x50A8, + 9788: 0x77D7, + 9789: 0x6410, + 9790: 0x89E6, + 9791: 0x5904, + 9792: 0x63E3, + 9793: 0x5DDD, + 9794: 0x7A7F, + 9795: 0x693D, + 9796: 0x4F20, + 9797: 0x8239, + 9798: 0x5598, + 9799: 0x4E32, + 9800: 0x75AE, + 9801: 0x7A97, + 9802: 0x5E62, + 9803: 0x5E8A, + 9804: 0x95EF, + 9805: 0x521B, + 9806: 0x5439, + 9807: 0x708A, + 9808: 0x6376, + 9809: 0x9524, + 9810: 0x5782, + 9811: 0x6625, + 9812: 0x693F, + 9813: 0x9187, + 9814: 0x5507, + 9815: 0x6DF3, + 9816: 0x7EAF, + 9817: 0x8822, + 9818: 0x6233, + 9819: 0x7EF0, + 9820: 0x75B5, + 9821: 0x8328, + 9822: 0x78C1, + 9823: 0x96CC, + 9824: 0x8F9E, + 9825: 0x6148, + 9826: 0x74F7, + 9827: 0x8BCD, + 9828: 0x6B64, + 9829: 0x523A, + 9830: 0x8D50, + 9831: 0x6B21, + 9832: 0x806A, + 9833: 0x8471, + 9834: 0x56F1, + 9835: 0x5306, + 9836: 0x4ECE, + 9837: 0x4E1B, + 9838: 0x51D1, + 9839: 0x7C97, + 9840: 0x918B, + 9841: 0x7C07, + 9842: 0x4FC3, + 9843: 0x8E7F, + 9844: 0x7BE1, + 9845: 0x7A9C, + 9846: 0x6467, + 9847: 0x5D14, + 9848: 0x50AC, + 9849: 0x8106, + 9850: 0x7601, + 9851: 0x7CB9, + 9852: 0x6DEC, + 9853: 0x7FE0, + 9854: 0x6751, + 9855: 0x5B58, + 9856: 0x5BF8, + 9857: 0x78CB, + 9858: 0x64AE, + 9859: 0x6413, + 9860: 0x63AA, + 9861: 0x632B, + 9862: 0x9519, + 9863: 0x642D, + 9864: 0x8FBE, + 9865: 0x7B54, + 9866: 0x7629, + 9867: 0x6253, + 9868: 0x5927, + 9869: 0x5446, + 9870: 0x6B79, + 9871: 0x50A3, + 9872: 0x6234, + 9873: 0x5E26, + 9874: 0x6B86, + 9875: 0x4EE3, + 9876: 0x8D37, + 9877: 0x888B, + 9878: 0x5F85, + 9879: 0x902E, + 9880: 0x790D, + 9881: 0x790E, + 9882: 0x790F, + 9883: 0x7910, + 9884: 0x7911, + 9885: 0x7912, + 9886: 0x7914, + 9887: 0x7915, + 9888: 0x7916, + 9889: 0x7917, + 9890: 0x7918, + 9891: 0x7919, + 9892: 0x791A, + 9893: 0x791B, + 9894: 0x791C, + 9895: 0x791D, + 9896: 0x791F, + 9897: 0x7920, + 9898: 0x7921, + 9899: 0x7922, + 9900: 0x7923, + 9901: 0x7925, + 9902: 0x7926, + 9903: 0x7927, + 9904: 0x7928, + 9905: 0x7929, + 9906: 0x792A, + 9907: 0x792B, + 9908: 0x792C, + 9909: 0x792D, + 9910: 0x792E, + 9911: 0x792F, + 9912: 0x7930, + 9913: 0x7931, + 9914: 0x7932, + 9915: 0x7933, + 9916: 0x7935, + 9917: 0x7936, + 9918: 0x7937, + 9919: 0x7938, + 9920: 0x7939, + 9921: 0x793D, + 9922: 0x793F, + 9923: 0x7942, + 9924: 0x7943, + 9925: 0x7944, + 9926: 0x7945, + 9927: 0x7947, + 9928: 0x794A, + 9929: 0x794B, + 9930: 0x794C, + 9931: 0x794D, + 9932: 0x794E, + 9933: 0x794F, + 9934: 0x7950, + 9935: 0x7951, + 9936: 0x7952, + 9937: 0x7954, + 9938: 0x7955, + 9939: 0x7958, + 9940: 0x7959, + 9941: 0x7961, + 9942: 0x7963, + 9943: 0x7964, + 9944: 0x7966, + 9945: 0x7969, + 9946: 0x796A, + 9947: 0x796B, + 9948: 0x796C, + 9949: 0x796E, + 9950: 0x7970, + 9951: 0x7971, + 9952: 0x7972, + 9953: 0x7973, + 9954: 0x7974, + 9955: 0x7975, + 9956: 0x7976, + 9957: 0x7979, + 9958: 0x797B, + 9959: 0x797C, + 9960: 0x797D, + 9961: 0x797E, + 9962: 0x797F, + 9963: 0x7982, + 9964: 0x7983, + 9965: 0x7986, + 9966: 0x7987, + 9967: 0x7988, + 9968: 0x7989, + 9969: 0x798B, + 9970: 0x798C, + 9971: 0x798D, + 9972: 0x798E, + 9973: 0x7990, + 9974: 0x7991, + 9975: 0x7992, + 9976: 0x6020, + 9977: 0x803D, + 9978: 0x62C5, + 9979: 0x4E39, + 9980: 0x5355, + 9981: 0x90F8, + 9982: 0x63B8, + 9983: 0x80C6, + 9984: 0x65E6, + 9985: 0x6C2E, + 9986: 0x4F46, + 9987: 0x60EE, + 9988: 0x6DE1, + 9989: 0x8BDE, + 9990: 0x5F39, + 9991: 0x86CB, + 9992: 0x5F53, + 9993: 0x6321, + 9994: 0x515A, + 9995: 0x8361, + 9996: 0x6863, + 9997: 0x5200, + 9998: 0x6363, + 9999: 0x8E48, + 10000: 0x5012, + 10001: 0x5C9B, + 10002: 0x7977, + 10003: 0x5BFC, + 10004: 0x5230, + 10005: 0x7A3B, + 10006: 0x60BC, + 10007: 0x9053, + 10008: 0x76D7, + 10009: 0x5FB7, + 10010: 0x5F97, + 10011: 0x7684, + 10012: 0x8E6C, + 10013: 0x706F, + 10014: 0x767B, + 10015: 0x7B49, + 10016: 0x77AA, + 10017: 0x51F3, + 10018: 0x9093, + 10019: 0x5824, + 10020: 0x4F4E, + 10021: 0x6EF4, + 10022: 0x8FEA, + 10023: 0x654C, + 10024: 0x7B1B, + 10025: 0x72C4, + 10026: 0x6DA4, + 10027: 0x7FDF, + 10028: 0x5AE1, + 10029: 0x62B5, + 10030: 0x5E95, + 10031: 0x5730, + 10032: 0x8482, + 10033: 0x7B2C, + 10034: 0x5E1D, + 10035: 0x5F1F, + 10036: 0x9012, + 10037: 0x7F14, + 10038: 0x98A0, + 10039: 0x6382, + 10040: 0x6EC7, + 10041: 0x7898, + 10042: 0x70B9, + 10043: 0x5178, + 10044: 0x975B, + 10045: 0x57AB, + 10046: 0x7535, + 10047: 0x4F43, + 10048: 0x7538, + 10049: 0x5E97, + 10050: 0x60E6, + 10051: 0x5960, + 10052: 0x6DC0, + 10053: 0x6BBF, + 10054: 0x7889, + 10055: 0x53FC, + 10056: 0x96D5, + 10057: 0x51CB, + 10058: 0x5201, + 10059: 0x6389, + 10060: 0x540A, + 10061: 0x9493, + 10062: 0x8C03, + 10063: 0x8DCC, + 10064: 0x7239, + 10065: 0x789F, + 10066: 0x8776, + 10067: 0x8FED, + 10068: 0x8C0D, + 10069: 0x53E0, + 10070: 0x7993, + 10071: 0x7994, + 10072: 0x7995, + 10073: 0x7996, + 10074: 0x7997, + 10075: 0x7998, + 10076: 0x7999, + 10077: 0x799B, + 10078: 0x799C, + 10079: 0x799D, + 10080: 0x799E, + 10081: 0x799F, + 10082: 0x79A0, + 10083: 0x79A1, + 10084: 0x79A2, + 10085: 0x79A3, + 10086: 0x79A4, + 10087: 0x79A5, + 10088: 0x79A6, + 10089: 0x79A8, + 10090: 0x79A9, + 10091: 0x79AA, + 10092: 0x79AB, + 10093: 0x79AC, + 10094: 0x79AD, + 10095: 0x79AE, + 10096: 0x79AF, + 10097: 0x79B0, + 10098: 0x79B1, + 10099: 0x79B2, + 10100: 0x79B4, + 10101: 0x79B5, + 10102: 0x79B6, + 10103: 0x79B7, + 10104: 0x79B8, + 10105: 0x79BC, + 10106: 0x79BF, + 10107: 0x79C2, + 10108: 0x79C4, + 10109: 0x79C5, + 10110: 0x79C7, + 10111: 0x79C8, + 10112: 0x79CA, + 10113: 0x79CC, + 10114: 0x79CE, + 10115: 0x79CF, + 10116: 0x79D0, + 10117: 0x79D3, + 10118: 0x79D4, + 10119: 0x79D6, + 10120: 0x79D7, + 10121: 0x79D9, + 10122: 0x79DA, + 10123: 0x79DB, + 10124: 0x79DC, + 10125: 0x79DD, + 10126: 0x79DE, + 10127: 0x79E0, + 10128: 0x79E1, + 10129: 0x79E2, + 10130: 0x79E5, + 10131: 0x79E8, + 10132: 0x79EA, + 10133: 0x79EC, + 10134: 0x79EE, + 10135: 0x79F1, + 10136: 0x79F2, + 10137: 0x79F3, + 10138: 0x79F4, + 10139: 0x79F5, + 10140: 0x79F6, + 10141: 0x79F7, + 10142: 0x79F9, + 10143: 0x79FA, + 10144: 0x79FC, + 10145: 0x79FE, + 10146: 0x79FF, + 10147: 0x7A01, + 10148: 0x7A04, + 10149: 0x7A05, + 10150: 0x7A07, + 10151: 0x7A08, + 10152: 0x7A09, + 10153: 0x7A0A, + 10154: 0x7A0C, + 10155: 0x7A0F, + 10156: 0x7A10, + 10157: 0x7A11, + 10158: 0x7A12, + 10159: 0x7A13, + 10160: 0x7A15, + 10161: 0x7A16, + 10162: 0x7A18, + 10163: 0x7A19, + 10164: 0x7A1B, + 10165: 0x7A1C, + 10166: 0x4E01, + 10167: 0x76EF, + 10168: 0x53EE, + 10169: 0x9489, + 10170: 0x9876, + 10171: 0x9F0E, + 10172: 0x952D, + 10173: 0x5B9A, + 10174: 0x8BA2, + 10175: 0x4E22, + 10176: 0x4E1C, + 10177: 0x51AC, + 10178: 0x8463, + 10179: 0x61C2, + 10180: 0x52A8, + 10181: 0x680B, + 10182: 0x4F97, + 10183: 0x606B, + 10184: 0x51BB, + 10185: 0x6D1E, + 10186: 0x515C, + 10187: 0x6296, + 10188: 0x6597, + 10189: 0x9661, + 10190: 0x8C46, + 10191: 0x9017, + 10192: 0x75D8, + 10193: 0x90FD, + 10194: 0x7763, + 10195: 0x6BD2, + 10196: 0x728A, + 10197: 0x72EC, + 10198: 0x8BFB, + 10199: 0x5835, + 10200: 0x7779, + 10201: 0x8D4C, + 10202: 0x675C, + 10203: 0x9540, + 10204: 0x809A, + 10205: 0x5EA6, + 10206: 0x6E21, + 10207: 0x5992, + 10208: 0x7AEF, + 10209: 0x77ED, + 10210: 0x953B, + 10211: 0x6BB5, + 10212: 0x65AD, + 10213: 0x7F0E, + 10214: 0x5806, + 10215: 0x5151, + 10216: 0x961F, + 10217: 0x5BF9, + 10218: 0x58A9, + 10219: 0x5428, + 10220: 0x8E72, + 10221: 0x6566, + 10222: 0x987F, + 10223: 0x56E4, + 10224: 0x949D, + 10225: 0x76FE, + 10226: 0x9041, + 10227: 0x6387, + 10228: 0x54C6, + 10229: 0x591A, + 10230: 0x593A, + 10231: 0x579B, + 10232: 0x8EB2, + 10233: 0x6735, + 10234: 0x8DFA, + 10235: 0x8235, + 10236: 0x5241, + 10237: 0x60F0, + 10238: 0x5815, + 10239: 0x86FE, + 10240: 0x5CE8, + 10241: 0x9E45, + 10242: 0x4FC4, + 10243: 0x989D, + 10244: 0x8BB9, + 10245: 0x5A25, + 10246: 0x6076, + 10247: 0x5384, + 10248: 0x627C, + 10249: 0x904F, + 10250: 0x9102, + 10251: 0x997F, + 10252: 0x6069, + 10253: 0x800C, + 10254: 0x513F, + 10255: 0x8033, + 10256: 0x5C14, + 10257: 0x9975, + 10258: 0x6D31, + 10259: 0x4E8C, + 10260: 0x7A1D, + 10261: 0x7A1F, + 10262: 0x7A21, + 10263: 0x7A22, + 10264: 0x7A24, + 10265: 0x7A25, + 10266: 0x7A26, + 10267: 0x7A27, + 10268: 0x7A28, + 10269: 0x7A29, + 10270: 0x7A2A, + 10271: 0x7A2B, + 10272: 0x7A2C, + 10273: 0x7A2D, + 10274: 0x7A2E, + 10275: 0x7A2F, + 10276: 0x7A30, + 10277: 0x7A31, + 10278: 0x7A32, + 10279: 0x7A34, + 10280: 0x7A35, + 10281: 0x7A36, + 10282: 0x7A38, + 10283: 0x7A3A, + 10284: 0x7A3E, + 10285: 0x7A40, + 10286: 0x7A41, + 10287: 0x7A42, + 10288: 0x7A43, + 10289: 0x7A44, + 10290: 0x7A45, + 10291: 0x7A47, + 10292: 0x7A48, + 10293: 0x7A49, + 10294: 0x7A4A, + 10295: 0x7A4B, + 10296: 0x7A4C, + 10297: 0x7A4D, + 10298: 0x7A4E, + 10299: 0x7A4F, + 10300: 0x7A50, + 10301: 0x7A52, + 10302: 0x7A53, + 10303: 0x7A54, + 10304: 0x7A55, + 10305: 0x7A56, + 10306: 0x7A58, + 10307: 0x7A59, + 10308: 0x7A5A, + 10309: 0x7A5B, + 10310: 0x7A5C, + 10311: 0x7A5D, + 10312: 0x7A5E, + 10313: 0x7A5F, + 10314: 0x7A60, + 10315: 0x7A61, + 10316: 0x7A62, + 10317: 0x7A63, + 10318: 0x7A64, + 10319: 0x7A65, + 10320: 0x7A66, + 10321: 0x7A67, + 10322: 0x7A68, + 10323: 0x7A69, + 10324: 0x7A6A, + 10325: 0x7A6B, + 10326: 0x7A6C, + 10327: 0x7A6D, + 10328: 0x7A6E, + 10329: 0x7A6F, + 10330: 0x7A71, + 10331: 0x7A72, + 10332: 0x7A73, + 10333: 0x7A75, + 10334: 0x7A7B, + 10335: 0x7A7C, + 10336: 0x7A7D, + 10337: 0x7A7E, + 10338: 0x7A82, + 10339: 0x7A85, + 10340: 0x7A87, + 10341: 0x7A89, + 10342: 0x7A8A, + 10343: 0x7A8B, + 10344: 0x7A8C, + 10345: 0x7A8E, + 10346: 0x7A8F, + 10347: 0x7A90, + 10348: 0x7A93, + 10349: 0x7A94, + 10350: 0x7A99, + 10351: 0x7A9A, + 10352: 0x7A9B, + 10353: 0x7A9E, + 10354: 0x7AA1, + 10355: 0x7AA2, + 10356: 0x8D30, + 10357: 0x53D1, + 10358: 0x7F5A, + 10359: 0x7B4F, + 10360: 0x4F10, + 10361: 0x4E4F, + 10362: 0x9600, + 10363: 0x6CD5, + 10364: 0x73D0, + 10365: 0x85E9, + 10366: 0x5E06, + 10367: 0x756A, + 10368: 0x7FFB, + 10369: 0x6A0A, + 10370: 0x77FE, + 10371: 0x9492, + 10372: 0x7E41, + 10373: 0x51E1, + 10374: 0x70E6, + 10375: 0x53CD, + 10376: 0x8FD4, + 10377: 0x8303, + 10378: 0x8D29, + 10379: 0x72AF, + 10380: 0x996D, + 10381: 0x6CDB, + 10382: 0x574A, + 10383: 0x82B3, + 10384: 0x65B9, + 10385: 0x80AA, + 10386: 0x623F, + 10387: 0x9632, + 10388: 0x59A8, + 10389: 0x4EFF, + 10390: 0x8BBF, + 10391: 0x7EBA, + 10392: 0x653E, + 10393: 0x83F2, + 10394: 0x975E, + 10395: 0x5561, + 10396: 0x98DE, + 10397: 0x80A5, + 10398: 0x532A, + 10399: 0x8BFD, + 10400: 0x5420, + 10401: 0x80BA, + 10402: 0x5E9F, + 10403: 0x6CB8, + 10404: 0x8D39, + 10405: 0x82AC, + 10406: 0x915A, + 10407: 0x5429, + 10408: 0x6C1B, + 10409: 0x5206, + 10410: 0x7EB7, + 10411: 0x575F, + 10412: 0x711A, + 10413: 0x6C7E, + 10414: 0x7C89, + 10415: 0x594B, + 10416: 0x4EFD, + 10417: 0x5FFF, + 10418: 0x6124, + 10419: 0x7CAA, + 10420: 0x4E30, + 10421: 0x5C01, + 10422: 0x67AB, + 10423: 0x8702, + 10424: 0x5CF0, + 10425: 0x950B, + 10426: 0x98CE, + 10427: 0x75AF, + 10428: 0x70FD, + 10429: 0x9022, + 10430: 0x51AF, + 10431: 0x7F1D, + 10432: 0x8BBD, + 10433: 0x5949, + 10434: 0x51E4, + 10435: 0x4F5B, + 10436: 0x5426, + 10437: 0x592B, + 10438: 0x6577, + 10439: 0x80A4, + 10440: 0x5B75, + 10441: 0x6276, + 10442: 0x62C2, + 10443: 0x8F90, + 10444: 0x5E45, + 10445: 0x6C1F, + 10446: 0x7B26, + 10447: 0x4F0F, + 10448: 0x4FD8, + 10449: 0x670D, + 10450: 0x7AA3, + 10451: 0x7AA4, + 10452: 0x7AA7, + 10453: 0x7AA9, + 10454: 0x7AAA, + 10455: 0x7AAB, + 10456: 0x7AAE, + 10457: 0x7AAF, + 10458: 0x7AB0, + 10459: 0x7AB1, + 10460: 0x7AB2, + 10461: 0x7AB4, + 10462: 0x7AB5, + 10463: 0x7AB6, + 10464: 0x7AB7, + 10465: 0x7AB8, + 10466: 0x7AB9, + 10467: 0x7ABA, + 10468: 0x7ABB, + 10469: 0x7ABC, + 10470: 0x7ABD, + 10471: 0x7ABE, + 10472: 0x7AC0, + 10473: 0x7AC1, + 10474: 0x7AC2, + 10475: 0x7AC3, + 10476: 0x7AC4, + 10477: 0x7AC5, + 10478: 0x7AC6, + 10479: 0x7AC7, + 10480: 0x7AC8, + 10481: 0x7AC9, + 10482: 0x7ACA, + 10483: 0x7ACC, + 10484: 0x7ACD, + 10485: 0x7ACE, + 10486: 0x7ACF, + 10487: 0x7AD0, + 10488: 0x7AD1, + 10489: 0x7AD2, + 10490: 0x7AD3, + 10491: 0x7AD4, + 10492: 0x7AD5, + 10493: 0x7AD7, + 10494: 0x7AD8, + 10495: 0x7ADA, + 10496: 0x7ADB, + 10497: 0x7ADC, + 10498: 0x7ADD, + 10499: 0x7AE1, + 10500: 0x7AE2, + 10501: 0x7AE4, + 10502: 0x7AE7, + 10503: 0x7AE8, + 10504: 0x7AE9, + 10505: 0x7AEA, + 10506: 0x7AEB, + 10507: 0x7AEC, + 10508: 0x7AEE, + 10509: 0x7AF0, + 10510: 0x7AF1, + 10511: 0x7AF2, + 10512: 0x7AF3, + 10513: 0x7AF4, + 10514: 0x7AF5, + 10515: 0x7AF6, + 10516: 0x7AF7, + 10517: 0x7AF8, + 10518: 0x7AFB, + 10519: 0x7AFC, + 10520: 0x7AFE, + 10521: 0x7B00, + 10522: 0x7B01, + 10523: 0x7B02, + 10524: 0x7B05, + 10525: 0x7B07, + 10526: 0x7B09, + 10527: 0x7B0C, + 10528: 0x7B0D, + 10529: 0x7B0E, + 10530: 0x7B10, + 10531: 0x7B12, + 10532: 0x7B13, + 10533: 0x7B16, + 10534: 0x7B17, + 10535: 0x7B18, + 10536: 0x7B1A, + 10537: 0x7B1C, + 10538: 0x7B1D, + 10539: 0x7B1F, + 10540: 0x7B21, + 10541: 0x7B22, + 10542: 0x7B23, + 10543: 0x7B27, + 10544: 0x7B29, + 10545: 0x7B2D, + 10546: 0x6D6E, + 10547: 0x6DAA, + 10548: 0x798F, + 10549: 0x88B1, + 10550: 0x5F17, + 10551: 0x752B, + 10552: 0x629A, + 10553: 0x8F85, + 10554: 0x4FEF, + 10555: 0x91DC, + 10556: 0x65A7, + 10557: 0x812F, + 10558: 0x8151, + 10559: 0x5E9C, + 10560: 0x8150, + 10561: 0x8D74, + 10562: 0x526F, + 10563: 0x8986, + 10564: 0x8D4B, + 10565: 0x590D, + 10566: 0x5085, + 10567: 0x4ED8, + 10568: 0x961C, + 10569: 0x7236, + 10570: 0x8179, + 10571: 0x8D1F, + 10572: 0x5BCC, + 10573: 0x8BA3, + 10574: 0x9644, + 10575: 0x5987, + 10576: 0x7F1A, + 10577: 0x5490, + 10578: 0x5676, + 10579: 0x560E, + 10580: 0x8BE5, + 10581: 0x6539, + 10582: 0x6982, + 10583: 0x9499, + 10584: 0x76D6, + 10585: 0x6E89, + 10586: 0x5E72, + 10587: 0x7518, + 10588: 0x6746, + 10589: 0x67D1, + 10590: 0x7AFF, + 10591: 0x809D, + 10592: 0x8D76, + 10593: 0x611F, + 10594: 0x79C6, + 10595: 0x6562, + 10596: 0x8D63, + 10597: 0x5188, + 10598: 0x521A, + 10599: 0x94A2, + 10600: 0x7F38, + 10601: 0x809B, + 10602: 0x7EB2, + 10603: 0x5C97, + 10604: 0x6E2F, + 10605: 0x6760, + 10606: 0x7BD9, + 10607: 0x768B, + 10608: 0x9AD8, + 10609: 0x818F, + 10610: 0x7F94, + 10611: 0x7CD5, + 10612: 0x641E, + 10613: 0x9550, + 10614: 0x7A3F, + 10615: 0x544A, + 10616: 0x54E5, + 10617: 0x6B4C, + 10618: 0x6401, + 10619: 0x6208, + 10620: 0x9E3D, + 10621: 0x80F3, + 10622: 0x7599, + 10623: 0x5272, + 10624: 0x9769, + 10625: 0x845B, + 10626: 0x683C, + 10627: 0x86E4, + 10628: 0x9601, + 10629: 0x9694, + 10630: 0x94EC, + 10631: 0x4E2A, + 10632: 0x5404, + 10633: 0x7ED9, + 10634: 0x6839, + 10635: 0x8DDF, + 10636: 0x8015, + 10637: 0x66F4, + 10638: 0x5E9A, + 10639: 0x7FB9, + 10640: 0x7B2F, + 10641: 0x7B30, + 10642: 0x7B32, + 10643: 0x7B34, + 10644: 0x7B35, + 10645: 0x7B36, + 10646: 0x7B37, + 10647: 0x7B39, + 10648: 0x7B3B, + 10649: 0x7B3D, + 10650: 0x7B3F, + 10651: 0x7B40, + 10652: 0x7B41, + 10653: 0x7B42, + 10654: 0x7B43, + 10655: 0x7B44, + 10656: 0x7B46, + 10657: 0x7B48, + 10658: 0x7B4A, + 10659: 0x7B4D, + 10660: 0x7B4E, + 10661: 0x7B53, + 10662: 0x7B55, + 10663: 0x7B57, + 10664: 0x7B59, + 10665: 0x7B5C, + 10666: 0x7B5E, + 10667: 0x7B5F, + 10668: 0x7B61, + 10669: 0x7B63, + 10670: 0x7B64, + 10671: 0x7B65, + 10672: 0x7B66, + 10673: 0x7B67, + 10674: 0x7B68, + 10675: 0x7B69, + 10676: 0x7B6A, + 10677: 0x7B6B, + 10678: 0x7B6C, + 10679: 0x7B6D, + 10680: 0x7B6F, + 10681: 0x7B70, + 10682: 0x7B73, + 10683: 0x7B74, + 10684: 0x7B76, + 10685: 0x7B78, + 10686: 0x7B7A, + 10687: 0x7B7C, + 10688: 0x7B7D, + 10689: 0x7B7F, + 10690: 0x7B81, + 10691: 0x7B82, + 10692: 0x7B83, + 10693: 0x7B84, + 10694: 0x7B86, + 10695: 0x7B87, + 10696: 0x7B88, + 10697: 0x7B89, + 10698: 0x7B8A, + 10699: 0x7B8B, + 10700: 0x7B8C, + 10701: 0x7B8E, + 10702: 0x7B8F, + 10703: 0x7B91, + 10704: 0x7B92, + 10705: 0x7B93, + 10706: 0x7B96, + 10707: 0x7B98, + 10708: 0x7B99, + 10709: 0x7B9A, + 10710: 0x7B9B, + 10711: 0x7B9E, + 10712: 0x7B9F, + 10713: 0x7BA0, + 10714: 0x7BA3, + 10715: 0x7BA4, + 10716: 0x7BA5, + 10717: 0x7BAE, + 10718: 0x7BAF, + 10719: 0x7BB0, + 10720: 0x7BB2, + 10721: 0x7BB3, + 10722: 0x7BB5, + 10723: 0x7BB6, + 10724: 0x7BB7, + 10725: 0x7BB9, + 10726: 0x7BBA, + 10727: 0x7BBB, + 10728: 0x7BBC, + 10729: 0x7BBD, + 10730: 0x7BBE, + 10731: 0x7BBF, + 10732: 0x7BC0, + 10733: 0x7BC2, + 10734: 0x7BC3, + 10735: 0x7BC4, + 10736: 0x57C2, + 10737: 0x803F, + 10738: 0x6897, + 10739: 0x5DE5, + 10740: 0x653B, + 10741: 0x529F, + 10742: 0x606D, + 10743: 0x9F9A, + 10744: 0x4F9B, + 10745: 0x8EAC, + 10746: 0x516C, + 10747: 0x5BAB, + 10748: 0x5F13, + 10749: 0x5DE9, + 10750: 0x6C5E, + 10751: 0x62F1, + 10752: 0x8D21, + 10753: 0x5171, + 10754: 0x94A9, + 10755: 0x52FE, + 10756: 0x6C9F, + 10757: 0x82DF, + 10758: 0x72D7, + 10759: 0x57A2, + 10760: 0x6784, + 10761: 0x8D2D, + 10762: 0x591F, + 10763: 0x8F9C, + 10764: 0x83C7, + 10765: 0x5495, + 10766: 0x7B8D, + 10767: 0x4F30, + 10768: 0x6CBD, + 10769: 0x5B64, + 10770: 0x59D1, + 10771: 0x9F13, + 10772: 0x53E4, + 10773: 0x86CA, + 10774: 0x9AA8, + 10775: 0x8C37, + 10776: 0x80A1, + 10777: 0x6545, + 10778: 0x987E, + 10779: 0x56FA, + 10780: 0x96C7, + 10781: 0x522E, + 10782: 0x74DC, + 10783: 0x5250, + 10784: 0x5BE1, + 10785: 0x6302, + 10786: 0x8902, + 10787: 0x4E56, + 10788: 0x62D0, + 10789: 0x602A, + 10790: 0x68FA, + 10791: 0x5173, + 10792: 0x5B98, + 10793: 0x51A0, + 10794: 0x89C2, + 10795: 0x7BA1, + 10796: 0x9986, + 10797: 0x7F50, + 10798: 0x60EF, + 10799: 0x704C, + 10800: 0x8D2F, + 10801: 0x5149, + 10802: 0x5E7F, + 10803: 0x901B, + 10804: 0x7470, + 10805: 0x89C4, + 10806: 0x572D, + 10807: 0x7845, + 10808: 0x5F52, + 10809: 0x9F9F, + 10810: 0x95FA, + 10811: 0x8F68, + 10812: 0x9B3C, + 10813: 0x8BE1, + 10814: 0x7678, + 10815: 0x6842, + 10816: 0x67DC, + 10817: 0x8DEA, + 10818: 0x8D35, + 10819: 0x523D, + 10820: 0x8F8A, + 10821: 0x6EDA, + 10822: 0x68CD, + 10823: 0x9505, + 10824: 0x90ED, + 10825: 0x56FD, + 10826: 0x679C, + 10827: 0x88F9, + 10828: 0x8FC7, + 10829: 0x54C8, + 10830: 0x7BC5, + 10831: 0x7BC8, + 10832: 0x7BC9, + 10833: 0x7BCA, + 10834: 0x7BCB, + 10835: 0x7BCD, + 10836: 0x7BCE, + 10837: 0x7BCF, + 10838: 0x7BD0, + 10839: 0x7BD2, + 10840: 0x7BD4, + 10841: 0x7BD5, + 10842: 0x7BD6, + 10843: 0x7BD7, + 10844: 0x7BD8, + 10845: 0x7BDB, + 10846: 0x7BDC, + 10847: 0x7BDE, + 10848: 0x7BDF, + 10849: 0x7BE0, + 10850: 0x7BE2, + 10851: 0x7BE3, + 10852: 0x7BE4, + 10853: 0x7BE7, + 10854: 0x7BE8, + 10855: 0x7BE9, + 10856: 0x7BEB, + 10857: 0x7BEC, + 10858: 0x7BED, + 10859: 0x7BEF, + 10860: 0x7BF0, + 10861: 0x7BF2, + 10862: 0x7BF3, + 10863: 0x7BF4, + 10864: 0x7BF5, + 10865: 0x7BF6, + 10866: 0x7BF8, + 10867: 0x7BF9, + 10868: 0x7BFA, + 10869: 0x7BFB, + 10870: 0x7BFD, + 10871: 0x7BFF, + 10872: 0x7C00, + 10873: 0x7C01, + 10874: 0x7C02, + 10875: 0x7C03, + 10876: 0x7C04, + 10877: 0x7C05, + 10878: 0x7C06, + 10879: 0x7C08, + 10880: 0x7C09, + 10881: 0x7C0A, + 10882: 0x7C0D, + 10883: 0x7C0E, + 10884: 0x7C10, + 10885: 0x7C11, + 10886: 0x7C12, + 10887: 0x7C13, + 10888: 0x7C14, + 10889: 0x7C15, + 10890: 0x7C17, + 10891: 0x7C18, + 10892: 0x7C19, + 10893: 0x7C1A, + 10894: 0x7C1B, + 10895: 0x7C1C, + 10896: 0x7C1D, + 10897: 0x7C1E, + 10898: 0x7C20, + 10899: 0x7C21, + 10900: 0x7C22, + 10901: 0x7C23, + 10902: 0x7C24, + 10903: 0x7C25, + 10904: 0x7C28, + 10905: 0x7C29, + 10906: 0x7C2B, + 10907: 0x7C2C, + 10908: 0x7C2D, + 10909: 0x7C2E, + 10910: 0x7C2F, + 10911: 0x7C30, + 10912: 0x7C31, + 10913: 0x7C32, + 10914: 0x7C33, + 10915: 0x7C34, + 10916: 0x7C35, + 10917: 0x7C36, + 10918: 0x7C37, + 10919: 0x7C39, + 10920: 0x7C3A, + 10921: 0x7C3B, + 10922: 0x7C3C, + 10923: 0x7C3D, + 10924: 0x7C3E, + 10925: 0x7C42, + 10926: 0x9AB8, + 10927: 0x5B69, + 10928: 0x6D77, + 10929: 0x6C26, + 10930: 0x4EA5, + 10931: 0x5BB3, + 10932: 0x9A87, + 10933: 0x9163, + 10934: 0x61A8, + 10935: 0x90AF, + 10936: 0x97E9, + 10937: 0x542B, + 10938: 0x6DB5, + 10939: 0x5BD2, + 10940: 0x51FD, + 10941: 0x558A, + 10942: 0x7F55, + 10943: 0x7FF0, + 10944: 0x64BC, + 10945: 0x634D, + 10946: 0x65F1, + 10947: 0x61BE, + 10948: 0x608D, + 10949: 0x710A, + 10950: 0x6C57, + 10951: 0x6C49, + 10952: 0x592F, + 10953: 0x676D, + 10954: 0x822A, + 10955: 0x58D5, + 10956: 0x568E, + 10957: 0x8C6A, + 10958: 0x6BEB, + 10959: 0x90DD, + 10960: 0x597D, + 10961: 0x8017, + 10962: 0x53F7, + 10963: 0x6D69, + 10964: 0x5475, + 10965: 0x559D, + 10966: 0x8377, + 10967: 0x83CF, + 10968: 0x6838, + 10969: 0x79BE, + 10970: 0x548C, + 10971: 0x4F55, + 10972: 0x5408, + 10973: 0x76D2, + 10974: 0x8C89, + 10975: 0x9602, + 10976: 0x6CB3, + 10977: 0x6DB8, + 10978: 0x8D6B, + 10979: 0x8910, + 10980: 0x9E64, + 10981: 0x8D3A, + 10982: 0x563F, + 10983: 0x9ED1, + 10984: 0x75D5, + 10985: 0x5F88, + 10986: 0x72E0, + 10987: 0x6068, + 10988: 0x54FC, + 10989: 0x4EA8, + 10990: 0x6A2A, + 10991: 0x8861, + 10992: 0x6052, + 10993: 0x8F70, + 10994: 0x54C4, + 10995: 0x70D8, + 10996: 0x8679, + 10997: 0x9E3F, + 10998: 0x6D2A, + 10999: 0x5B8F, + 11000: 0x5F18, + 11001: 0x7EA2, + 11002: 0x5589, + 11003: 0x4FAF, + 11004: 0x7334, + 11005: 0x543C, + 11006: 0x539A, + 11007: 0x5019, + 11008: 0x540E, + 11009: 0x547C, + 11010: 0x4E4E, + 11011: 0x5FFD, + 11012: 0x745A, + 11013: 0x58F6, + 11014: 0x846B, + 11015: 0x80E1, + 11016: 0x8774, + 11017: 0x72D0, + 11018: 0x7CCA, + 11019: 0x6E56, + 11020: 0x7C43, + 11021: 0x7C44, + 11022: 0x7C45, + 11023: 0x7C46, + 11024: 0x7C47, + 11025: 0x7C48, + 11026: 0x7C49, + 11027: 0x7C4A, + 11028: 0x7C4B, + 11029: 0x7C4C, + 11030: 0x7C4E, + 11031: 0x7C4F, + 11032: 0x7C50, + 11033: 0x7C51, + 11034: 0x7C52, + 11035: 0x7C53, + 11036: 0x7C54, + 11037: 0x7C55, + 11038: 0x7C56, + 11039: 0x7C57, + 11040: 0x7C58, + 11041: 0x7C59, + 11042: 0x7C5A, + 11043: 0x7C5B, + 11044: 0x7C5C, + 11045: 0x7C5D, + 11046: 0x7C5E, + 11047: 0x7C5F, + 11048: 0x7C60, + 11049: 0x7C61, + 11050: 0x7C62, + 11051: 0x7C63, + 11052: 0x7C64, + 11053: 0x7C65, + 11054: 0x7C66, + 11055: 0x7C67, + 11056: 0x7C68, + 11057: 0x7C69, + 11058: 0x7C6A, + 11059: 0x7C6B, + 11060: 0x7C6C, + 11061: 0x7C6D, + 11062: 0x7C6E, + 11063: 0x7C6F, + 11064: 0x7C70, + 11065: 0x7C71, + 11066: 0x7C72, + 11067: 0x7C75, + 11068: 0x7C76, + 11069: 0x7C77, + 11070: 0x7C78, + 11071: 0x7C79, + 11072: 0x7C7A, + 11073: 0x7C7E, + 11074: 0x7C7F, + 11075: 0x7C80, + 11076: 0x7C81, + 11077: 0x7C82, + 11078: 0x7C83, + 11079: 0x7C84, + 11080: 0x7C85, + 11081: 0x7C86, + 11082: 0x7C87, + 11083: 0x7C88, + 11084: 0x7C8A, + 11085: 0x7C8B, + 11086: 0x7C8C, + 11087: 0x7C8D, + 11088: 0x7C8E, + 11089: 0x7C8F, + 11090: 0x7C90, + 11091: 0x7C93, + 11092: 0x7C94, + 11093: 0x7C96, + 11094: 0x7C99, + 11095: 0x7C9A, + 11096: 0x7C9B, + 11097: 0x7CA0, + 11098: 0x7CA1, + 11099: 0x7CA3, + 11100: 0x7CA6, + 11101: 0x7CA7, + 11102: 0x7CA8, + 11103: 0x7CA9, + 11104: 0x7CAB, + 11105: 0x7CAC, + 11106: 0x7CAD, + 11107: 0x7CAF, + 11108: 0x7CB0, + 11109: 0x7CB4, + 11110: 0x7CB5, + 11111: 0x7CB6, + 11112: 0x7CB7, + 11113: 0x7CB8, + 11114: 0x7CBA, + 11115: 0x7CBB, + 11116: 0x5F27, + 11117: 0x864E, + 11118: 0x552C, + 11119: 0x62A4, + 11120: 0x4E92, + 11121: 0x6CAA, + 11122: 0x6237, + 11123: 0x82B1, + 11124: 0x54D7, + 11125: 0x534E, + 11126: 0x733E, + 11127: 0x6ED1, + 11128: 0x753B, + 11129: 0x5212, + 11130: 0x5316, + 11131: 0x8BDD, + 11132: 0x69D0, + 11133: 0x5F8A, + 11134: 0x6000, + 11135: 0x6DEE, + 11136: 0x574F, + 11137: 0x6B22, + 11138: 0x73AF, + 11139: 0x6853, + 11140: 0x8FD8, + 11141: 0x7F13, + 11142: 0x6362, + 11143: 0x60A3, + 11144: 0x5524, + 11145: 0x75EA, + 11146: 0x8C62, + 11147: 0x7115, + 11148: 0x6DA3, + 11149: 0x5BA6, + 11150: 0x5E7B, + 11151: 0x8352, + 11152: 0x614C, + 11153: 0x9EC4, + 11154: 0x78FA, + 11155: 0x8757, + 11156: 0x7C27, + 11157: 0x7687, + 11158: 0x51F0, + 11159: 0x60F6, + 11160: 0x714C, + 11161: 0x6643, + 11162: 0x5E4C, + 11163: 0x604D, + 11164: 0x8C0E, + 11165: 0x7070, + 11166: 0x6325, + 11167: 0x8F89, + 11168: 0x5FBD, + 11169: 0x6062, + 11170: 0x86D4, + 11171: 0x56DE, + 11172: 0x6BC1, + 11173: 0x6094, + 11174: 0x6167, + 11175: 0x5349, + 11176: 0x60E0, + 11177: 0x6666, + 11178: 0x8D3F, + 11179: 0x79FD, + 11180: 0x4F1A, + 11181: 0x70E9, + 11182: 0x6C47, + 11183: 0x8BB3, + 11184: 0x8BF2, + 11185: 0x7ED8, + 11186: 0x8364, + 11187: 0x660F, + 11188: 0x5A5A, + 11189: 0x9B42, + 11190: 0x6D51, + 11191: 0x6DF7, + 11192: 0x8C41, + 11193: 0x6D3B, + 11194: 0x4F19, + 11195: 0x706B, + 11196: 0x83B7, + 11197: 0x6216, + 11198: 0x60D1, + 11199: 0x970D, + 11200: 0x8D27, + 11201: 0x7978, + 11202: 0x51FB, + 11203: 0x573E, + 11204: 0x57FA, + 11205: 0x673A, + 11206: 0x7578, + 11207: 0x7A3D, + 11208: 0x79EF, + 11209: 0x7B95, + 11210: 0x7CBF, + 11211: 0x7CC0, + 11212: 0x7CC2, + 11213: 0x7CC3, + 11214: 0x7CC4, + 11215: 0x7CC6, + 11216: 0x7CC9, + 11217: 0x7CCB, + 11218: 0x7CCE, + 11219: 0x7CCF, + 11220: 0x7CD0, + 11221: 0x7CD1, + 11222: 0x7CD2, + 11223: 0x7CD3, + 11224: 0x7CD4, + 11225: 0x7CD8, + 11226: 0x7CDA, + 11227: 0x7CDB, + 11228: 0x7CDD, + 11229: 0x7CDE, + 11230: 0x7CE1, + 11231: 0x7CE2, + 11232: 0x7CE3, + 11233: 0x7CE4, + 11234: 0x7CE5, + 11235: 0x7CE6, + 11236: 0x7CE7, + 11237: 0x7CE9, + 11238: 0x7CEA, + 11239: 0x7CEB, + 11240: 0x7CEC, + 11241: 0x7CED, + 11242: 0x7CEE, + 11243: 0x7CF0, + 11244: 0x7CF1, + 11245: 0x7CF2, + 11246: 0x7CF3, + 11247: 0x7CF4, + 11248: 0x7CF5, + 11249: 0x7CF6, + 11250: 0x7CF7, + 11251: 0x7CF9, + 11252: 0x7CFA, + 11253: 0x7CFC, + 11254: 0x7CFD, + 11255: 0x7CFE, + 11256: 0x7CFF, + 11257: 0x7D00, + 11258: 0x7D01, + 11259: 0x7D02, + 11260: 0x7D03, + 11261: 0x7D04, + 11262: 0x7D05, + 11263: 0x7D06, + 11264: 0x7D07, + 11265: 0x7D08, + 11266: 0x7D09, + 11267: 0x7D0B, + 11268: 0x7D0C, + 11269: 0x7D0D, + 11270: 0x7D0E, + 11271: 0x7D0F, + 11272: 0x7D10, + 11273: 0x7D11, + 11274: 0x7D12, + 11275: 0x7D13, + 11276: 0x7D14, + 11277: 0x7D15, + 11278: 0x7D16, + 11279: 0x7D17, + 11280: 0x7D18, + 11281: 0x7D19, + 11282: 0x7D1A, + 11283: 0x7D1B, + 11284: 0x7D1C, + 11285: 0x7D1D, + 11286: 0x7D1E, + 11287: 0x7D1F, + 11288: 0x7D21, + 11289: 0x7D23, + 11290: 0x7D24, + 11291: 0x7D25, + 11292: 0x7D26, + 11293: 0x7D28, + 11294: 0x7D29, + 11295: 0x7D2A, + 11296: 0x7D2C, + 11297: 0x7D2D, + 11298: 0x7D2E, + 11299: 0x7D30, + 11300: 0x7D31, + 11301: 0x7D32, + 11302: 0x7D33, + 11303: 0x7D34, + 11304: 0x7D35, + 11305: 0x7D36, + 11306: 0x808C, + 11307: 0x9965, + 11308: 0x8FF9, + 11309: 0x6FC0, + 11310: 0x8BA5, + 11311: 0x9E21, + 11312: 0x59EC, + 11313: 0x7EE9, + 11314: 0x7F09, + 11315: 0x5409, + 11316: 0x6781, + 11317: 0x68D8, + 11318: 0x8F91, + 11319: 0x7C4D, + 11320: 0x96C6, + 11321: 0x53CA, + 11322: 0x6025, + 11323: 0x75BE, + 11324: 0x6C72, + 11325: 0x5373, + 11326: 0x5AC9, + 11327: 0x7EA7, + 11328: 0x6324, + 11329: 0x51E0, + 11330: 0x810A, + 11331: 0x5DF1, + 11332: 0x84DF, + 11333: 0x6280, + 11334: 0x5180, + 11335: 0x5B63, + 11336: 0x4F0E, + 11337: 0x796D, + 11338: 0x5242, + 11339: 0x60B8, + 11340: 0x6D4E, + 11341: 0x5BC4, + 11342: 0x5BC2, + 11343: 0x8BA1, + 11344: 0x8BB0, + 11345: 0x65E2, + 11346: 0x5FCC, + 11347: 0x9645, + 11348: 0x5993, + 11349: 0x7EE7, + 11350: 0x7EAA, + 11351: 0x5609, + 11352: 0x67B7, + 11353: 0x5939, + 11354: 0x4F73, + 11355: 0x5BB6, + 11356: 0x52A0, + 11357: 0x835A, + 11358: 0x988A, + 11359: 0x8D3E, + 11360: 0x7532, + 11361: 0x94BE, + 11362: 0x5047, + 11363: 0x7A3C, + 11364: 0x4EF7, + 11365: 0x67B6, + 11366: 0x9A7E, + 11367: 0x5AC1, + 11368: 0x6B7C, + 11369: 0x76D1, + 11370: 0x575A, + 11371: 0x5C16, + 11372: 0x7B3A, + 11373: 0x95F4, + 11374: 0x714E, + 11375: 0x517C, + 11376: 0x80A9, + 11377: 0x8270, + 11378: 0x5978, + 11379: 0x7F04, + 11380: 0x8327, + 11381: 0x68C0, + 11382: 0x67EC, + 11383: 0x78B1, + 11384: 0x7877, + 11385: 0x62E3, + 11386: 0x6361, + 11387: 0x7B80, + 11388: 0x4FED, + 11389: 0x526A, + 11390: 0x51CF, + 11391: 0x8350, + 11392: 0x69DB, + 11393: 0x9274, + 11394: 0x8DF5, + 11395: 0x8D31, + 11396: 0x89C1, + 11397: 0x952E, + 11398: 0x7BAD, + 11399: 0x4EF6, + 11400: 0x7D37, + 11401: 0x7D38, + 11402: 0x7D39, + 11403: 0x7D3A, + 11404: 0x7D3B, + 11405: 0x7D3C, + 11406: 0x7D3D, + 11407: 0x7D3E, + 11408: 0x7D3F, + 11409: 0x7D40, + 11410: 0x7D41, + 11411: 0x7D42, + 11412: 0x7D43, + 11413: 0x7D44, + 11414: 0x7D45, + 11415: 0x7D46, + 11416: 0x7D47, + 11417: 0x7D48, + 11418: 0x7D49, + 11419: 0x7D4A, + 11420: 0x7D4B, + 11421: 0x7D4C, + 11422: 0x7D4D, + 11423: 0x7D4E, + 11424: 0x7D4F, + 11425: 0x7D50, + 11426: 0x7D51, + 11427: 0x7D52, + 11428: 0x7D53, + 11429: 0x7D54, + 11430: 0x7D55, + 11431: 0x7D56, + 11432: 0x7D57, + 11433: 0x7D58, + 11434: 0x7D59, + 11435: 0x7D5A, + 11436: 0x7D5B, + 11437: 0x7D5C, + 11438: 0x7D5D, + 11439: 0x7D5E, + 11440: 0x7D5F, + 11441: 0x7D60, + 11442: 0x7D61, + 11443: 0x7D62, + 11444: 0x7D63, + 11445: 0x7D64, + 11446: 0x7D65, + 11447: 0x7D66, + 11448: 0x7D67, + 11449: 0x7D68, + 11450: 0x7D69, + 11451: 0x7D6A, + 11452: 0x7D6B, + 11453: 0x7D6C, + 11454: 0x7D6D, + 11455: 0x7D6F, + 11456: 0x7D70, + 11457: 0x7D71, + 11458: 0x7D72, + 11459: 0x7D73, + 11460: 0x7D74, + 11461: 0x7D75, + 11462: 0x7D76, + 11463: 0x7D78, + 11464: 0x7D79, + 11465: 0x7D7A, + 11466: 0x7D7B, + 11467: 0x7D7C, + 11468: 0x7D7D, + 11469: 0x7D7E, + 11470: 0x7D7F, + 11471: 0x7D80, + 11472: 0x7D81, + 11473: 0x7D82, + 11474: 0x7D83, + 11475: 0x7D84, + 11476: 0x7D85, + 11477: 0x7D86, + 11478: 0x7D87, + 11479: 0x7D88, + 11480: 0x7D89, + 11481: 0x7D8A, + 11482: 0x7D8B, + 11483: 0x7D8C, + 11484: 0x7D8D, + 11485: 0x7D8E, + 11486: 0x7D8F, + 11487: 0x7D90, + 11488: 0x7D91, + 11489: 0x7D92, + 11490: 0x7D93, + 11491: 0x7D94, + 11492: 0x7D95, + 11493: 0x7D96, + 11494: 0x7D97, + 11495: 0x7D98, + 11496: 0x5065, + 11497: 0x8230, + 11498: 0x5251, + 11499: 0x996F, + 11500: 0x6E10, + 11501: 0x6E85, + 11502: 0x6DA7, + 11503: 0x5EFA, + 11504: 0x50F5, + 11505: 0x59DC, + 11506: 0x5C06, + 11507: 0x6D46, + 11508: 0x6C5F, + 11509: 0x7586, + 11510: 0x848B, + 11511: 0x6868, + 11512: 0x5956, + 11513: 0x8BB2, + 11514: 0x5320, + 11515: 0x9171, + 11516: 0x964D, + 11517: 0x8549, + 11518: 0x6912, + 11519: 0x7901, + 11520: 0x7126, + 11521: 0x80F6, + 11522: 0x4EA4, + 11523: 0x90CA, + 11524: 0x6D47, + 11525: 0x9A84, + 11526: 0x5A07, + 11527: 0x56BC, + 11528: 0x6405, + 11529: 0x94F0, + 11530: 0x77EB, + 11531: 0x4FA5, + 11532: 0x811A, + 11533: 0x72E1, + 11534: 0x89D2, + 11535: 0x997A, + 11536: 0x7F34, + 11537: 0x7EDE, + 11538: 0x527F, + 11539: 0x6559, + 11540: 0x9175, + 11541: 0x8F7F, + 11542: 0x8F83, + 11543: 0x53EB, + 11544: 0x7A96, + 11545: 0x63ED, + 11546: 0x63A5, + 11547: 0x7686, + 11548: 0x79F8, + 11549: 0x8857, + 11550: 0x9636, + 11551: 0x622A, + 11552: 0x52AB, + 11553: 0x8282, + 11554: 0x6854, + 11555: 0x6770, + 11556: 0x6377, + 11557: 0x776B, + 11558: 0x7AED, + 11559: 0x6D01, + 11560: 0x7ED3, + 11561: 0x89E3, + 11562: 0x59D0, + 11563: 0x6212, + 11564: 0x85C9, + 11565: 0x82A5, + 11566: 0x754C, + 11567: 0x501F, + 11568: 0x4ECB, + 11569: 0x75A5, + 11570: 0x8BEB, + 11571: 0x5C4A, + 11572: 0x5DFE, + 11573: 0x7B4B, + 11574: 0x65A4, + 11575: 0x91D1, + 11576: 0x4ECA, + 11577: 0x6D25, + 11578: 0x895F, + 11579: 0x7D27, + 11580: 0x9526, + 11581: 0x4EC5, + 11582: 0x8C28, + 11583: 0x8FDB, + 11584: 0x9773, + 11585: 0x664B, + 11586: 0x7981, + 11587: 0x8FD1, + 11588: 0x70EC, + 11589: 0x6D78, + 11590: 0x7D99, + 11591: 0x7D9A, + 11592: 0x7D9B, + 11593: 0x7D9C, + 11594: 0x7D9D, + 11595: 0x7D9E, + 11596: 0x7D9F, + 11597: 0x7DA0, + 11598: 0x7DA1, + 11599: 0x7DA2, + 11600: 0x7DA3, + 11601: 0x7DA4, + 11602: 0x7DA5, + 11603: 0x7DA7, + 11604: 0x7DA8, + 11605: 0x7DA9, + 11606: 0x7DAA, + 11607: 0x7DAB, + 11608: 0x7DAC, + 11609: 0x7DAD, + 11610: 0x7DAF, + 11611: 0x7DB0, + 11612: 0x7DB1, + 11613: 0x7DB2, + 11614: 0x7DB3, + 11615: 0x7DB4, + 11616: 0x7DB5, + 11617: 0x7DB6, + 11618: 0x7DB7, + 11619: 0x7DB8, + 11620: 0x7DB9, + 11621: 0x7DBA, + 11622: 0x7DBB, + 11623: 0x7DBC, + 11624: 0x7DBD, + 11625: 0x7DBE, + 11626: 0x7DBF, + 11627: 0x7DC0, + 11628: 0x7DC1, + 11629: 0x7DC2, + 11630: 0x7DC3, + 11631: 0x7DC4, + 11632: 0x7DC5, + 11633: 0x7DC6, + 11634: 0x7DC7, + 11635: 0x7DC8, + 11636: 0x7DC9, + 11637: 0x7DCA, + 11638: 0x7DCB, + 11639: 0x7DCC, + 11640: 0x7DCD, + 11641: 0x7DCE, + 11642: 0x7DCF, + 11643: 0x7DD0, + 11644: 0x7DD1, + 11645: 0x7DD2, + 11646: 0x7DD3, + 11647: 0x7DD4, + 11648: 0x7DD5, + 11649: 0x7DD6, + 11650: 0x7DD7, + 11651: 0x7DD8, + 11652: 0x7DD9, + 11653: 0x7DDA, + 11654: 0x7DDB, + 11655: 0x7DDC, + 11656: 0x7DDD, + 11657: 0x7DDE, + 11658: 0x7DDF, + 11659: 0x7DE0, + 11660: 0x7DE1, + 11661: 0x7DE2, + 11662: 0x7DE3, + 11663: 0x7DE4, + 11664: 0x7DE5, + 11665: 0x7DE6, + 11666: 0x7DE7, + 11667: 0x7DE8, + 11668: 0x7DE9, + 11669: 0x7DEA, + 11670: 0x7DEB, + 11671: 0x7DEC, + 11672: 0x7DED, + 11673: 0x7DEE, + 11674: 0x7DEF, + 11675: 0x7DF0, + 11676: 0x7DF1, + 11677: 0x7DF2, + 11678: 0x7DF3, + 11679: 0x7DF4, + 11680: 0x7DF5, + 11681: 0x7DF6, + 11682: 0x7DF7, + 11683: 0x7DF8, + 11684: 0x7DF9, + 11685: 0x7DFA, + 11686: 0x5C3D, + 11687: 0x52B2, + 11688: 0x8346, + 11689: 0x5162, + 11690: 0x830E, + 11691: 0x775B, + 11692: 0x6676, + 11693: 0x9CB8, + 11694: 0x4EAC, + 11695: 0x60CA, + 11696: 0x7CBE, + 11697: 0x7CB3, + 11698: 0x7ECF, + 11699: 0x4E95, + 11700: 0x8B66, + 11701: 0x666F, + 11702: 0x9888, + 11703: 0x9759, + 11704: 0x5883, + 11705: 0x656C, + 11706: 0x955C, + 11707: 0x5F84, + 11708: 0x75C9, + 11709: 0x9756, + 11710: 0x7ADF, + 11711: 0x7ADE, + 11712: 0x51C0, + 11713: 0x70AF, + 11714: 0x7A98, + 11715: 0x63EA, + 11716: 0x7A76, + 11717: 0x7EA0, + 11718: 0x7396, + 11719: 0x97ED, + 11720: 0x4E45, + 11721: 0x7078, + 11722: 0x4E5D, + 11723: 0x9152, + 11724: 0x53A9, + 11725: 0x6551, + 11726: 0x65E7, + 11727: 0x81FC, + 11728: 0x8205, + 11729: 0x548E, + 11730: 0x5C31, + 11731: 0x759A, + 11732: 0x97A0, + 11733: 0x62D8, + 11734: 0x72D9, + 11735: 0x75BD, + 11736: 0x5C45, + 11737: 0x9A79, + 11738: 0x83CA, + 11739: 0x5C40, + 11740: 0x5480, + 11741: 0x77E9, + 11742: 0x4E3E, + 11743: 0x6CAE, + 11744: 0x805A, + 11745: 0x62D2, + 11746: 0x636E, + 11747: 0x5DE8, + 11748: 0x5177, + 11749: 0x8DDD, + 11750: 0x8E1E, + 11751: 0x952F, + 11752: 0x4FF1, + 11753: 0x53E5, + 11754: 0x60E7, + 11755: 0x70AC, + 11756: 0x5267, + 11757: 0x6350, + 11758: 0x9E43, + 11759: 0x5A1F, + 11760: 0x5026, + 11761: 0x7737, + 11762: 0x5377, + 11763: 0x7EE2, + 11764: 0x6485, + 11765: 0x652B, + 11766: 0x6289, + 11767: 0x6398, + 11768: 0x5014, + 11769: 0x7235, + 11770: 0x89C9, + 11771: 0x51B3, + 11772: 0x8BC0, + 11773: 0x7EDD, + 11774: 0x5747, + 11775: 0x83CC, + 11776: 0x94A7, + 11777: 0x519B, + 11778: 0x541B, + 11779: 0x5CFB, + 11780: 0x7DFB, + 11781: 0x7DFC, + 11782: 0x7DFD, + 11783: 0x7DFE, + 11784: 0x7DFF, + 11785: 0x7E00, + 11786: 0x7E01, + 11787: 0x7E02, + 11788: 0x7E03, + 11789: 0x7E04, + 11790: 0x7E05, + 11791: 0x7E06, + 11792: 0x7E07, + 11793: 0x7E08, + 11794: 0x7E09, + 11795: 0x7E0A, + 11796: 0x7E0B, + 11797: 0x7E0C, + 11798: 0x7E0D, + 11799: 0x7E0E, + 11800: 0x7E0F, + 11801: 0x7E10, + 11802: 0x7E11, + 11803: 0x7E12, + 11804: 0x7E13, + 11805: 0x7E14, + 11806: 0x7E15, + 11807: 0x7E16, + 11808: 0x7E17, + 11809: 0x7E18, + 11810: 0x7E19, + 11811: 0x7E1A, + 11812: 0x7E1B, + 11813: 0x7E1C, + 11814: 0x7E1D, + 11815: 0x7E1E, + 11816: 0x7E1F, + 11817: 0x7E20, + 11818: 0x7E21, + 11819: 0x7E22, + 11820: 0x7E23, + 11821: 0x7E24, + 11822: 0x7E25, + 11823: 0x7E26, + 11824: 0x7E27, + 11825: 0x7E28, + 11826: 0x7E29, + 11827: 0x7E2A, + 11828: 0x7E2B, + 11829: 0x7E2C, + 11830: 0x7E2D, + 11831: 0x7E2E, + 11832: 0x7E2F, + 11833: 0x7E30, + 11834: 0x7E31, + 11835: 0x7E32, + 11836: 0x7E33, + 11837: 0x7E34, + 11838: 0x7E35, + 11839: 0x7E36, + 11840: 0x7E37, + 11841: 0x7E38, + 11842: 0x7E39, + 11843: 0x7E3A, + 11844: 0x7E3C, + 11845: 0x7E3D, + 11846: 0x7E3E, + 11847: 0x7E3F, + 11848: 0x7E40, + 11849: 0x7E42, + 11850: 0x7E43, + 11851: 0x7E44, + 11852: 0x7E45, + 11853: 0x7E46, + 11854: 0x7E48, + 11855: 0x7E49, + 11856: 0x7E4A, + 11857: 0x7E4B, + 11858: 0x7E4C, + 11859: 0x7E4D, + 11860: 0x7E4E, + 11861: 0x7E4F, + 11862: 0x7E50, + 11863: 0x7E51, + 11864: 0x7E52, + 11865: 0x7E53, + 11866: 0x7E54, + 11867: 0x7E55, + 11868: 0x7E56, + 11869: 0x7E57, + 11870: 0x7E58, + 11871: 0x7E59, + 11872: 0x7E5A, + 11873: 0x7E5B, + 11874: 0x7E5C, + 11875: 0x7E5D, + 11876: 0x4FCA, + 11877: 0x7AE3, + 11878: 0x6D5A, + 11879: 0x90E1, + 11880: 0x9A8F, + 11881: 0x5580, + 11882: 0x5496, + 11883: 0x5361, + 11884: 0x54AF, + 11885: 0x5F00, + 11886: 0x63E9, + 11887: 0x6977, + 11888: 0x51EF, + 11889: 0x6168, + 11890: 0x520A, + 11891: 0x582A, + 11892: 0x52D8, + 11893: 0x574E, + 11894: 0x780D, + 11895: 0x770B, + 11896: 0x5EB7, + 11897: 0x6177, + 11898: 0x7CE0, + 11899: 0x625B, + 11900: 0x6297, + 11901: 0x4EA2, + 11902: 0x7095, + 11903: 0x8003, + 11904: 0x62F7, + 11905: 0x70E4, + 11906: 0x9760, + 11907: 0x5777, + 11908: 0x82DB, + 11909: 0x67EF, + 11910: 0x68F5, + 11911: 0x78D5, + 11912: 0x9897, + 11913: 0x79D1, + 11914: 0x58F3, + 11915: 0x54B3, + 11916: 0x53EF, + 11917: 0x6E34, + 11918: 0x514B, + 11919: 0x523B, + 11920: 0x5BA2, + 11921: 0x8BFE, + 11922: 0x80AF, + 11923: 0x5543, + 11924: 0x57A6, + 11925: 0x6073, + 11926: 0x5751, + 11927: 0x542D, + 11928: 0x7A7A, + 11929: 0x6050, + 11930: 0x5B54, + 11931: 0x63A7, + 11932: 0x62A0, + 11933: 0x53E3, + 11934: 0x6263, + 11935: 0x5BC7, + 11936: 0x67AF, + 11937: 0x54ED, + 11938: 0x7A9F, + 11939: 0x82E6, + 11940: 0x9177, + 11941: 0x5E93, + 11942: 0x88E4, + 11943: 0x5938, + 11944: 0x57AE, + 11945: 0x630E, + 11946: 0x8DE8, + 11947: 0x80EF, + 11948: 0x5757, + 11949: 0x7B77, + 11950: 0x4FA9, + 11951: 0x5FEB, + 11952: 0x5BBD, + 11953: 0x6B3E, + 11954: 0x5321, + 11955: 0x7B50, + 11956: 0x72C2, + 11957: 0x6846, + 11958: 0x77FF, + 11959: 0x7736, + 11960: 0x65F7, + 11961: 0x51B5, + 11962: 0x4E8F, + 11963: 0x76D4, + 11964: 0x5CBF, + 11965: 0x7AA5, + 11966: 0x8475, + 11967: 0x594E, + 11968: 0x9B41, + 11969: 0x5080, + 11970: 0x7E5E, + 11971: 0x7E5F, + 11972: 0x7E60, + 11973: 0x7E61, + 11974: 0x7E62, + 11975: 0x7E63, + 11976: 0x7E64, + 11977: 0x7E65, + 11978: 0x7E66, + 11979: 0x7E67, + 11980: 0x7E68, + 11981: 0x7E69, + 11982: 0x7E6A, + 11983: 0x7E6B, + 11984: 0x7E6C, + 11985: 0x7E6D, + 11986: 0x7E6E, + 11987: 0x7E6F, + 11988: 0x7E70, + 11989: 0x7E71, + 11990: 0x7E72, + 11991: 0x7E73, + 11992: 0x7E74, + 11993: 0x7E75, + 11994: 0x7E76, + 11995: 0x7E77, + 11996: 0x7E78, + 11997: 0x7E79, + 11998: 0x7E7A, + 11999: 0x7E7B, + 12000: 0x7E7C, + 12001: 0x7E7D, + 12002: 0x7E7E, + 12003: 0x7E7F, + 12004: 0x7E80, + 12005: 0x7E81, + 12006: 0x7E83, + 12007: 0x7E84, + 12008: 0x7E85, + 12009: 0x7E86, + 12010: 0x7E87, + 12011: 0x7E88, + 12012: 0x7E89, + 12013: 0x7E8A, + 12014: 0x7E8B, + 12015: 0x7E8C, + 12016: 0x7E8D, + 12017: 0x7E8E, + 12018: 0x7E8F, + 12019: 0x7E90, + 12020: 0x7E91, + 12021: 0x7E92, + 12022: 0x7E93, + 12023: 0x7E94, + 12024: 0x7E95, + 12025: 0x7E96, + 12026: 0x7E97, + 12027: 0x7E98, + 12028: 0x7E99, + 12029: 0x7E9A, + 12030: 0x7E9C, + 12031: 0x7E9D, + 12032: 0x7E9E, + 12033: 0x7EAE, + 12034: 0x7EB4, + 12035: 0x7EBB, + 12036: 0x7EBC, + 12037: 0x7ED6, + 12038: 0x7EE4, + 12039: 0x7EEC, + 12040: 0x7EF9, + 12041: 0x7F0A, + 12042: 0x7F10, + 12043: 0x7F1E, + 12044: 0x7F37, + 12045: 0x7F39, + 12046: 0x7F3B, + 12047: 0x7F3C, + 12048: 0x7F3D, + 12049: 0x7F3E, + 12050: 0x7F3F, + 12051: 0x7F40, + 12052: 0x7F41, + 12053: 0x7F43, + 12054: 0x7F46, + 12055: 0x7F47, + 12056: 0x7F48, + 12057: 0x7F49, + 12058: 0x7F4A, + 12059: 0x7F4B, + 12060: 0x7F4C, + 12061: 0x7F4D, + 12062: 0x7F4E, + 12063: 0x7F4F, + 12064: 0x7F52, + 12065: 0x7F53, + 12066: 0x9988, + 12067: 0x6127, + 12068: 0x6E83, + 12069: 0x5764, + 12070: 0x6606, + 12071: 0x6346, + 12072: 0x56F0, + 12073: 0x62EC, + 12074: 0x6269, + 12075: 0x5ED3, + 12076: 0x9614, + 12077: 0x5783, + 12078: 0x62C9, + 12079: 0x5587, + 12080: 0x8721, + 12081: 0x814A, + 12082: 0x8FA3, + 12083: 0x5566, + 12084: 0x83B1, + 12085: 0x6765, + 12086: 0x8D56, + 12087: 0x84DD, + 12088: 0x5A6A, + 12089: 0x680F, + 12090: 0x62E6, + 12091: 0x7BEE, + 12092: 0x9611, + 12093: 0x5170, + 12094: 0x6F9C, + 12095: 0x8C30, + 12096: 0x63FD, + 12097: 0x89C8, + 12098: 0x61D2, + 12099: 0x7F06, + 12100: 0x70C2, + 12101: 0x6EE5, + 12102: 0x7405, + 12103: 0x6994, + 12104: 0x72FC, + 12105: 0x5ECA, + 12106: 0x90CE, + 12107: 0x6717, + 12108: 0x6D6A, + 12109: 0x635E, + 12110: 0x52B3, + 12111: 0x7262, + 12112: 0x8001, + 12113: 0x4F6C, + 12114: 0x59E5, + 12115: 0x916A, + 12116: 0x70D9, + 12117: 0x6D9D, + 12118: 0x52D2, + 12119: 0x4E50, + 12120: 0x96F7, + 12121: 0x956D, + 12122: 0x857E, + 12123: 0x78CA, + 12124: 0x7D2F, + 12125: 0x5121, + 12126: 0x5792, + 12127: 0x64C2, + 12128: 0x808B, + 12129: 0x7C7B, + 12130: 0x6CEA, + 12131: 0x68F1, + 12132: 0x695E, + 12133: 0x51B7, + 12134: 0x5398, + 12135: 0x68A8, + 12136: 0x7281, + 12137: 0x9ECE, + 12138: 0x7BF1, + 12139: 0x72F8, + 12140: 0x79BB, + 12141: 0x6F13, + 12142: 0x7406, + 12143: 0x674E, + 12144: 0x91CC, + 12145: 0x9CA4, + 12146: 0x793C, + 12147: 0x8389, + 12148: 0x8354, + 12149: 0x540F, + 12150: 0x6817, + 12151: 0x4E3D, + 12152: 0x5389, + 12153: 0x52B1, + 12154: 0x783E, + 12155: 0x5386, + 12156: 0x5229, + 12157: 0x5088, + 12158: 0x4F8B, + 12159: 0x4FD0, + 12160: 0x7F56, + 12161: 0x7F59, + 12162: 0x7F5B, + 12163: 0x7F5C, + 12164: 0x7F5D, + 12165: 0x7F5E, + 12166: 0x7F60, + 12167: 0x7F63, + 12168: 0x7F64, + 12169: 0x7F65, + 12170: 0x7F66, + 12171: 0x7F67, + 12172: 0x7F6B, + 12173: 0x7F6C, + 12174: 0x7F6D, + 12175: 0x7F6F, + 12176: 0x7F70, + 12177: 0x7F73, + 12178: 0x7F75, + 12179: 0x7F76, + 12180: 0x7F77, + 12181: 0x7F78, + 12182: 0x7F7A, + 12183: 0x7F7B, + 12184: 0x7F7C, + 12185: 0x7F7D, + 12186: 0x7F7F, + 12187: 0x7F80, + 12188: 0x7F82, + 12189: 0x7F83, + 12190: 0x7F84, + 12191: 0x7F85, + 12192: 0x7F86, + 12193: 0x7F87, + 12194: 0x7F88, + 12195: 0x7F89, + 12196: 0x7F8B, + 12197: 0x7F8D, + 12198: 0x7F8F, + 12199: 0x7F90, + 12200: 0x7F91, + 12201: 0x7F92, + 12202: 0x7F93, + 12203: 0x7F95, + 12204: 0x7F96, + 12205: 0x7F97, + 12206: 0x7F98, + 12207: 0x7F99, + 12208: 0x7F9B, + 12209: 0x7F9C, + 12210: 0x7FA0, + 12211: 0x7FA2, + 12212: 0x7FA3, + 12213: 0x7FA5, + 12214: 0x7FA6, + 12215: 0x7FA8, + 12216: 0x7FA9, + 12217: 0x7FAA, + 12218: 0x7FAB, + 12219: 0x7FAC, + 12220: 0x7FAD, + 12221: 0x7FAE, + 12222: 0x7FB1, + 12223: 0x7FB3, + 12224: 0x7FB4, + 12225: 0x7FB5, + 12226: 0x7FB6, + 12227: 0x7FB7, + 12228: 0x7FBA, + 12229: 0x7FBB, + 12230: 0x7FBE, + 12231: 0x7FC0, + 12232: 0x7FC2, + 12233: 0x7FC3, + 12234: 0x7FC4, + 12235: 0x7FC6, + 12236: 0x7FC7, + 12237: 0x7FC8, + 12238: 0x7FC9, + 12239: 0x7FCB, + 12240: 0x7FCD, + 12241: 0x7FCF, + 12242: 0x7FD0, + 12243: 0x7FD1, + 12244: 0x7FD2, + 12245: 0x7FD3, + 12246: 0x7FD6, + 12247: 0x7FD7, + 12248: 0x7FD9, + 12249: 0x7FDA, + 12250: 0x7FDB, + 12251: 0x7FDC, + 12252: 0x7FDD, + 12253: 0x7FDE, + 12254: 0x7FE2, + 12255: 0x7FE3, + 12256: 0x75E2, + 12257: 0x7ACB, + 12258: 0x7C92, + 12259: 0x6CA5, + 12260: 0x96B6, + 12261: 0x529B, + 12262: 0x7483, + 12263: 0x54E9, + 12264: 0x4FE9, + 12265: 0x8054, + 12266: 0x83B2, + 12267: 0x8FDE, + 12268: 0x9570, + 12269: 0x5EC9, + 12270: 0x601C, + 12271: 0x6D9F, + 12272: 0x5E18, + 12273: 0x655B, + 12274: 0x8138, + 12275: 0x94FE, + 12276: 0x604B, + 12277: 0x70BC, + 12278: 0x7EC3, + 12279: 0x7CAE, + 12280: 0x51C9, + 12281: 0x6881, + 12282: 0x7CB1, + 12283: 0x826F, + 12284: 0x4E24, + 12285: 0x8F86, + 12286: 0x91CF, + 12287: 0x667E, + 12288: 0x4EAE, + 12289: 0x8C05, + 12290: 0x64A9, + 12291: 0x804A, + 12292: 0x50DA, + 12293: 0x7597, + 12294: 0x71CE, + 12295: 0x5BE5, + 12296: 0x8FBD, + 12297: 0x6F66, + 12298: 0x4E86, + 12299: 0x6482, + 12300: 0x9563, + 12301: 0x5ED6, + 12302: 0x6599, + 12303: 0x5217, + 12304: 0x88C2, + 12305: 0x70C8, + 12306: 0x52A3, + 12307: 0x730E, + 12308: 0x7433, + 12309: 0x6797, + 12310: 0x78F7, + 12311: 0x9716, + 12312: 0x4E34, + 12313: 0x90BB, + 12314: 0x9CDE, + 12315: 0x6DCB, + 12316: 0x51DB, + 12317: 0x8D41, + 12318: 0x541D, + 12319: 0x62CE, + 12320: 0x73B2, + 12321: 0x83F1, + 12322: 0x96F6, + 12323: 0x9F84, + 12324: 0x94C3, + 12325: 0x4F36, + 12326: 0x7F9A, + 12327: 0x51CC, + 12328: 0x7075, + 12329: 0x9675, + 12330: 0x5CAD, + 12331: 0x9886, + 12332: 0x53E6, + 12333: 0x4EE4, + 12334: 0x6E9C, + 12335: 0x7409, + 12336: 0x69B4, + 12337: 0x786B, + 12338: 0x998F, + 12339: 0x7559, + 12340: 0x5218, + 12341: 0x7624, + 12342: 0x6D41, + 12343: 0x67F3, + 12344: 0x516D, + 12345: 0x9F99, + 12346: 0x804B, + 12347: 0x5499, + 12348: 0x7B3C, + 12349: 0x7ABF, + 12350: 0x7FE4, + 12351: 0x7FE7, + 12352: 0x7FE8, + 12353: 0x7FEA, + 12354: 0x7FEB, + 12355: 0x7FEC, + 12356: 0x7FED, + 12357: 0x7FEF, + 12358: 0x7FF2, + 12359: 0x7FF4, + 12360: 0x7FF5, + 12361: 0x7FF6, + 12362: 0x7FF7, + 12363: 0x7FF8, + 12364: 0x7FF9, + 12365: 0x7FFA, + 12366: 0x7FFD, + 12367: 0x7FFE, + 12368: 0x7FFF, + 12369: 0x8002, + 12370: 0x8007, + 12371: 0x8008, + 12372: 0x8009, + 12373: 0x800A, + 12374: 0x800E, + 12375: 0x800F, + 12376: 0x8011, + 12377: 0x8013, + 12378: 0x801A, + 12379: 0x801B, + 12380: 0x801D, + 12381: 0x801E, + 12382: 0x801F, + 12383: 0x8021, + 12384: 0x8023, + 12385: 0x8024, + 12386: 0x802B, + 12387: 0x802C, + 12388: 0x802D, + 12389: 0x802E, + 12390: 0x802F, + 12391: 0x8030, + 12392: 0x8032, + 12393: 0x8034, + 12394: 0x8039, + 12395: 0x803A, + 12396: 0x803C, + 12397: 0x803E, + 12398: 0x8040, + 12399: 0x8041, + 12400: 0x8044, + 12401: 0x8045, + 12402: 0x8047, + 12403: 0x8048, + 12404: 0x8049, + 12405: 0x804E, + 12406: 0x804F, + 12407: 0x8050, + 12408: 0x8051, + 12409: 0x8053, + 12410: 0x8055, + 12411: 0x8056, + 12412: 0x8057, + 12413: 0x8059, + 12414: 0x805B, + 12415: 0x805C, + 12416: 0x805D, + 12417: 0x805E, + 12418: 0x805F, + 12419: 0x8060, + 12420: 0x8061, + 12421: 0x8062, + 12422: 0x8063, + 12423: 0x8064, + 12424: 0x8065, + 12425: 0x8066, + 12426: 0x8067, + 12427: 0x8068, + 12428: 0x806B, + 12429: 0x806C, + 12430: 0x806D, + 12431: 0x806E, + 12432: 0x806F, + 12433: 0x8070, + 12434: 0x8072, + 12435: 0x8073, + 12436: 0x8074, + 12437: 0x8075, + 12438: 0x8076, + 12439: 0x8077, + 12440: 0x8078, + 12441: 0x8079, + 12442: 0x807A, + 12443: 0x807B, + 12444: 0x807C, + 12445: 0x807D, + 12446: 0x9686, + 12447: 0x5784, + 12448: 0x62E2, + 12449: 0x9647, + 12450: 0x697C, + 12451: 0x5A04, + 12452: 0x6402, + 12453: 0x7BD3, + 12454: 0x6F0F, + 12455: 0x964B, + 12456: 0x82A6, + 12457: 0x5362, + 12458: 0x9885, + 12459: 0x5E90, + 12460: 0x7089, + 12461: 0x63B3, + 12462: 0x5364, + 12463: 0x864F, + 12464: 0x9C81, + 12465: 0x9E93, + 12466: 0x788C, + 12467: 0x9732, + 12468: 0x8DEF, + 12469: 0x8D42, + 12470: 0x9E7F, + 12471: 0x6F5E, + 12472: 0x7984, + 12473: 0x5F55, + 12474: 0x9646, + 12475: 0x622E, + 12476: 0x9A74, + 12477: 0x5415, + 12478: 0x94DD, + 12479: 0x4FA3, + 12480: 0x65C5, + 12481: 0x5C65, + 12482: 0x5C61, + 12483: 0x7F15, + 12484: 0x8651, + 12485: 0x6C2F, + 12486: 0x5F8B, + 12487: 0x7387, + 12488: 0x6EE4, + 12489: 0x7EFF, + 12490: 0x5CE6, + 12491: 0x631B, + 12492: 0x5B6A, + 12493: 0x6EE6, + 12494: 0x5375, + 12495: 0x4E71, + 12496: 0x63A0, + 12497: 0x7565, + 12498: 0x62A1, + 12499: 0x8F6E, + 12500: 0x4F26, + 12501: 0x4ED1, + 12502: 0x6CA6, + 12503: 0x7EB6, + 12504: 0x8BBA, + 12505: 0x841D, + 12506: 0x87BA, + 12507: 0x7F57, + 12508: 0x903B, + 12509: 0x9523, + 12510: 0x7BA9, + 12511: 0x9AA1, + 12512: 0x88F8, + 12513: 0x843D, + 12514: 0x6D1B, + 12515: 0x9A86, + 12516: 0x7EDC, + 12517: 0x5988, + 12518: 0x9EBB, + 12519: 0x739B, + 12520: 0x7801, + 12521: 0x8682, + 12522: 0x9A6C, + 12523: 0x9A82, + 12524: 0x561B, + 12525: 0x5417, + 12526: 0x57CB, + 12527: 0x4E70, + 12528: 0x9EA6, + 12529: 0x5356, + 12530: 0x8FC8, + 12531: 0x8109, + 12532: 0x7792, + 12533: 0x9992, + 12534: 0x86EE, + 12535: 0x6EE1, + 12536: 0x8513, + 12537: 0x66FC, + 12538: 0x6162, + 12539: 0x6F2B, + 12540: 0x807E, + 12541: 0x8081, + 12542: 0x8082, + 12543: 0x8085, + 12544: 0x8088, + 12545: 0x808A, + 12546: 0x808D, + 12547: 0x808E, + 12548: 0x808F, + 12549: 0x8090, + 12550: 0x8091, + 12551: 0x8092, + 12552: 0x8094, + 12553: 0x8095, + 12554: 0x8097, + 12555: 0x8099, + 12556: 0x809E, + 12557: 0x80A3, + 12558: 0x80A6, + 12559: 0x80A7, + 12560: 0x80A8, + 12561: 0x80AC, + 12562: 0x80B0, + 12563: 0x80B3, + 12564: 0x80B5, + 12565: 0x80B6, + 12566: 0x80B8, + 12567: 0x80B9, + 12568: 0x80BB, + 12569: 0x80C5, + 12570: 0x80C7, + 12571: 0x80C8, + 12572: 0x80C9, + 12573: 0x80CA, + 12574: 0x80CB, + 12575: 0x80CF, + 12576: 0x80D0, + 12577: 0x80D1, + 12578: 0x80D2, + 12579: 0x80D3, + 12580: 0x80D4, + 12581: 0x80D5, + 12582: 0x80D8, + 12583: 0x80DF, + 12584: 0x80E0, + 12585: 0x80E2, + 12586: 0x80E3, + 12587: 0x80E6, + 12588: 0x80EE, + 12589: 0x80F5, + 12590: 0x80F7, + 12591: 0x80F9, + 12592: 0x80FB, + 12593: 0x80FE, + 12594: 0x80FF, + 12595: 0x8100, + 12596: 0x8101, + 12597: 0x8103, + 12598: 0x8104, + 12599: 0x8105, + 12600: 0x8107, + 12601: 0x8108, + 12602: 0x810B, + 12603: 0x810C, + 12604: 0x8115, + 12605: 0x8117, + 12606: 0x8119, + 12607: 0x811B, + 12608: 0x811C, + 12609: 0x811D, + 12610: 0x811F, + 12611: 0x8120, + 12612: 0x8121, + 12613: 0x8122, + 12614: 0x8123, + 12615: 0x8124, + 12616: 0x8125, + 12617: 0x8126, + 12618: 0x8127, + 12619: 0x8128, + 12620: 0x8129, + 12621: 0x812A, + 12622: 0x812B, + 12623: 0x812D, + 12624: 0x812E, + 12625: 0x8130, + 12626: 0x8133, + 12627: 0x8134, + 12628: 0x8135, + 12629: 0x8137, + 12630: 0x8139, + 12631: 0x813A, + 12632: 0x813B, + 12633: 0x813C, + 12634: 0x813D, + 12635: 0x813F, + 12636: 0x8C29, + 12637: 0x8292, + 12638: 0x832B, + 12639: 0x76F2, + 12640: 0x6C13, + 12641: 0x5FD9, + 12642: 0x83BD, + 12643: 0x732B, + 12644: 0x8305, + 12645: 0x951A, + 12646: 0x6BDB, + 12647: 0x77DB, + 12648: 0x94C6, + 12649: 0x536F, + 12650: 0x8302, + 12651: 0x5192, + 12652: 0x5E3D, + 12653: 0x8C8C, + 12654: 0x8D38, + 12655: 0x4E48, + 12656: 0x73AB, + 12657: 0x679A, + 12658: 0x6885, + 12659: 0x9176, + 12660: 0x9709, + 12661: 0x7164, + 12662: 0x6CA1, + 12663: 0x7709, + 12664: 0x5A92, + 12665: 0x9541, + 12666: 0x6BCF, + 12667: 0x7F8E, + 12668: 0x6627, + 12669: 0x5BD0, + 12670: 0x59B9, + 12671: 0x5A9A, + 12672: 0x95E8, + 12673: 0x95F7, + 12674: 0x4EEC, + 12675: 0x840C, + 12676: 0x8499, + 12677: 0x6AAC, + 12678: 0x76DF, + 12679: 0x9530, + 12680: 0x731B, + 12681: 0x68A6, + 12682: 0x5B5F, + 12683: 0x772F, + 12684: 0x919A, + 12685: 0x9761, + 12686: 0x7CDC, + 12687: 0x8FF7, + 12688: 0x8C1C, + 12689: 0x5F25, + 12690: 0x7C73, + 12691: 0x79D8, + 12692: 0x89C5, + 12693: 0x6CCC, + 12694: 0x871C, + 12695: 0x5BC6, + 12696: 0x5E42, + 12697: 0x68C9, + 12698: 0x7720, + 12699: 0x7EF5, + 12700: 0x5195, + 12701: 0x514D, + 12702: 0x52C9, + 12703: 0x5A29, + 12704: 0x7F05, + 12705: 0x9762, + 12706: 0x82D7, + 12707: 0x63CF, + 12708: 0x7784, + 12709: 0x85D0, + 12710: 0x79D2, + 12711: 0x6E3A, + 12712: 0x5E99, + 12713: 0x5999, + 12714: 0x8511, + 12715: 0x706D, + 12716: 0x6C11, + 12717: 0x62BF, + 12718: 0x76BF, + 12719: 0x654F, + 12720: 0x60AF, + 12721: 0x95FD, + 12722: 0x660E, + 12723: 0x879F, + 12724: 0x9E23, + 12725: 0x94ED, + 12726: 0x540D, + 12727: 0x547D, + 12728: 0x8C2C, + 12729: 0x6478, + 12730: 0x8140, + 12731: 0x8141, + 12732: 0x8142, + 12733: 0x8143, + 12734: 0x8144, + 12735: 0x8145, + 12736: 0x8147, + 12737: 0x8149, + 12738: 0x814D, + 12739: 0x814E, + 12740: 0x814F, + 12741: 0x8152, + 12742: 0x8156, + 12743: 0x8157, + 12744: 0x8158, + 12745: 0x815B, + 12746: 0x815C, + 12747: 0x815D, + 12748: 0x815E, + 12749: 0x815F, + 12750: 0x8161, + 12751: 0x8162, + 12752: 0x8163, + 12753: 0x8164, + 12754: 0x8166, + 12755: 0x8168, + 12756: 0x816A, + 12757: 0x816B, + 12758: 0x816C, + 12759: 0x816F, + 12760: 0x8172, + 12761: 0x8173, + 12762: 0x8175, + 12763: 0x8176, + 12764: 0x8177, + 12765: 0x8178, + 12766: 0x8181, + 12767: 0x8183, + 12768: 0x8184, + 12769: 0x8185, + 12770: 0x8186, + 12771: 0x8187, + 12772: 0x8189, + 12773: 0x818B, + 12774: 0x818C, + 12775: 0x818D, + 12776: 0x818E, + 12777: 0x8190, + 12778: 0x8192, + 12779: 0x8193, + 12780: 0x8194, + 12781: 0x8195, + 12782: 0x8196, + 12783: 0x8197, + 12784: 0x8199, + 12785: 0x819A, + 12786: 0x819E, + 12787: 0x819F, + 12788: 0x81A0, + 12789: 0x81A1, + 12790: 0x81A2, + 12791: 0x81A4, + 12792: 0x81A5, + 12793: 0x81A7, + 12794: 0x81A9, + 12795: 0x81AB, + 12796: 0x81AC, + 12797: 0x81AD, + 12798: 0x81AE, + 12799: 0x81AF, + 12800: 0x81B0, + 12801: 0x81B1, + 12802: 0x81B2, + 12803: 0x81B4, + 12804: 0x81B5, + 12805: 0x81B6, + 12806: 0x81B7, + 12807: 0x81B8, + 12808: 0x81B9, + 12809: 0x81BC, + 12810: 0x81BD, + 12811: 0x81BE, + 12812: 0x81BF, + 12813: 0x81C4, + 12814: 0x81C5, + 12815: 0x81C7, + 12816: 0x81C8, + 12817: 0x81C9, + 12818: 0x81CB, + 12819: 0x81CD, + 12820: 0x81CE, + 12821: 0x81CF, + 12822: 0x81D0, + 12823: 0x81D1, + 12824: 0x81D2, + 12825: 0x81D3, + 12826: 0x6479, + 12827: 0x8611, + 12828: 0x6A21, + 12829: 0x819C, + 12830: 0x78E8, + 12831: 0x6469, + 12832: 0x9B54, + 12833: 0x62B9, + 12834: 0x672B, + 12835: 0x83AB, + 12836: 0x58A8, + 12837: 0x9ED8, + 12838: 0x6CAB, + 12839: 0x6F20, + 12840: 0x5BDE, + 12841: 0x964C, + 12842: 0x8C0B, + 12843: 0x725F, + 12844: 0x67D0, + 12845: 0x62C7, + 12846: 0x7261, + 12847: 0x4EA9, + 12848: 0x59C6, + 12849: 0x6BCD, + 12850: 0x5893, + 12851: 0x66AE, + 12852: 0x5E55, + 12853: 0x52DF, + 12854: 0x6155, + 12855: 0x6728, + 12856: 0x76EE, + 12857: 0x7766, + 12858: 0x7267, + 12859: 0x7A46, + 12860: 0x62FF, + 12861: 0x54EA, + 12862: 0x5450, + 12863: 0x94A0, + 12864: 0x90A3, + 12865: 0x5A1C, + 12866: 0x7EB3, + 12867: 0x6C16, + 12868: 0x4E43, + 12869: 0x5976, + 12870: 0x8010, + 12871: 0x5948, + 12872: 0x5357, + 12873: 0x7537, + 12874: 0x96BE, + 12875: 0x56CA, + 12876: 0x6320, + 12877: 0x8111, + 12878: 0x607C, + 12879: 0x95F9, + 12880: 0x6DD6, + 12881: 0x5462, + 12882: 0x9981, + 12883: 0x5185, + 12884: 0x5AE9, + 12885: 0x80FD, + 12886: 0x59AE, + 12887: 0x9713, + 12888: 0x502A, + 12889: 0x6CE5, + 12890: 0x5C3C, + 12891: 0x62DF, + 12892: 0x4F60, + 12893: 0x533F, + 12894: 0x817B, + 12895: 0x9006, + 12896: 0x6EBA, + 12897: 0x852B, + 12898: 0x62C8, + 12899: 0x5E74, + 12900: 0x78BE, + 12901: 0x64B5, + 12902: 0x637B, + 12903: 0x5FF5, + 12904: 0x5A18, + 12905: 0x917F, + 12906: 0x9E1F, + 12907: 0x5C3F, + 12908: 0x634F, + 12909: 0x8042, + 12910: 0x5B7D, + 12911: 0x556E, + 12912: 0x954A, + 12913: 0x954D, + 12914: 0x6D85, + 12915: 0x60A8, + 12916: 0x67E0, + 12917: 0x72DE, + 12918: 0x51DD, + 12919: 0x5B81, + 12920: 0x81D4, + 12921: 0x81D5, + 12922: 0x81D6, + 12923: 0x81D7, + 12924: 0x81D8, + 12925: 0x81D9, + 12926: 0x81DA, + 12927: 0x81DB, + 12928: 0x81DC, + 12929: 0x81DD, + 12930: 0x81DE, + 12931: 0x81DF, + 12932: 0x81E0, + 12933: 0x81E1, + 12934: 0x81E2, + 12935: 0x81E4, + 12936: 0x81E5, + 12937: 0x81E6, + 12938: 0x81E8, + 12939: 0x81E9, + 12940: 0x81EB, + 12941: 0x81EE, + 12942: 0x81EF, + 12943: 0x81F0, + 12944: 0x81F1, + 12945: 0x81F2, + 12946: 0x81F5, + 12947: 0x81F6, + 12948: 0x81F7, + 12949: 0x81F8, + 12950: 0x81F9, + 12951: 0x81FA, + 12952: 0x81FD, + 12953: 0x81FF, + 12954: 0x8203, + 12955: 0x8207, + 12956: 0x8208, + 12957: 0x8209, + 12958: 0x820A, + 12959: 0x820B, + 12960: 0x820E, + 12961: 0x820F, + 12962: 0x8211, + 12963: 0x8213, + 12964: 0x8215, + 12965: 0x8216, + 12966: 0x8217, + 12967: 0x8218, + 12968: 0x8219, + 12969: 0x821A, + 12970: 0x821D, + 12971: 0x8220, + 12972: 0x8224, + 12973: 0x8225, + 12974: 0x8226, + 12975: 0x8227, + 12976: 0x8229, + 12977: 0x822E, + 12978: 0x8232, + 12979: 0x823A, + 12980: 0x823C, + 12981: 0x823D, + 12982: 0x823F, + 12983: 0x8240, + 12984: 0x8241, + 12985: 0x8242, + 12986: 0x8243, + 12987: 0x8245, + 12988: 0x8246, + 12989: 0x8248, + 12990: 0x824A, + 12991: 0x824C, + 12992: 0x824D, + 12993: 0x824E, + 12994: 0x8250, + 12995: 0x8251, + 12996: 0x8252, + 12997: 0x8253, + 12998: 0x8254, + 12999: 0x8255, + 13000: 0x8256, + 13001: 0x8257, + 13002: 0x8259, + 13003: 0x825B, + 13004: 0x825C, + 13005: 0x825D, + 13006: 0x825E, + 13007: 0x8260, + 13008: 0x8261, + 13009: 0x8262, + 13010: 0x8263, + 13011: 0x8264, + 13012: 0x8265, + 13013: 0x8266, + 13014: 0x8267, + 13015: 0x8269, + 13016: 0x62E7, + 13017: 0x6CDE, + 13018: 0x725B, + 13019: 0x626D, + 13020: 0x94AE, + 13021: 0x7EBD, + 13022: 0x8113, + 13023: 0x6D53, + 13024: 0x519C, + 13025: 0x5F04, + 13026: 0x5974, + 13027: 0x52AA, + 13028: 0x6012, + 13029: 0x5973, + 13030: 0x6696, + 13031: 0x8650, + 13032: 0x759F, + 13033: 0x632A, + 13034: 0x61E6, + 13035: 0x7CEF, + 13036: 0x8BFA, + 13037: 0x54E6, + 13038: 0x6B27, + 13039: 0x9E25, + 13040: 0x6BB4, + 13041: 0x85D5, + 13042: 0x5455, + 13043: 0x5076, + 13044: 0x6CA4, + 13045: 0x556A, + 13046: 0x8DB4, + 13047: 0x722C, + 13048: 0x5E15, + 13049: 0x6015, + 13050: 0x7436, + 13051: 0x62CD, + 13052: 0x6392, + 13053: 0x724C, + 13054: 0x5F98, + 13055: 0x6E43, + 13056: 0x6D3E, + 13057: 0x6500, + 13058: 0x6F58, + 13059: 0x76D8, + 13060: 0x78D0, + 13061: 0x76FC, + 13062: 0x7554, + 13063: 0x5224, + 13064: 0x53DB, + 13065: 0x4E53, + 13066: 0x5E9E, + 13067: 0x65C1, + 13068: 0x802A, + 13069: 0x80D6, + 13070: 0x629B, + 13071: 0x5486, + 13072: 0x5228, + 13073: 0x70AE, + 13074: 0x888D, + 13075: 0x8DD1, + 13076: 0x6CE1, + 13077: 0x5478, + 13078: 0x80DA, + 13079: 0x57F9, + 13080: 0x88F4, + 13081: 0x8D54, + 13082: 0x966A, + 13083: 0x914D, + 13084: 0x4F69, + 13085: 0x6C9B, + 13086: 0x55B7, + 13087: 0x76C6, + 13088: 0x7830, + 13089: 0x62A8, + 13090: 0x70F9, + 13091: 0x6F8E, + 13092: 0x5F6D, + 13093: 0x84EC, + 13094: 0x68DA, + 13095: 0x787C, + 13096: 0x7BF7, + 13097: 0x81A8, + 13098: 0x670B, + 13099: 0x9E4F, + 13100: 0x6367, + 13101: 0x78B0, + 13102: 0x576F, + 13103: 0x7812, + 13104: 0x9739, + 13105: 0x6279, + 13106: 0x62AB, + 13107: 0x5288, + 13108: 0x7435, + 13109: 0x6BD7, + 13110: 0x826A, + 13111: 0x826B, + 13112: 0x826C, + 13113: 0x826D, + 13114: 0x8271, + 13115: 0x8275, + 13116: 0x8276, + 13117: 0x8277, + 13118: 0x8278, + 13119: 0x827B, + 13120: 0x827C, + 13121: 0x8280, + 13122: 0x8281, + 13123: 0x8283, + 13124: 0x8285, + 13125: 0x8286, + 13126: 0x8287, + 13127: 0x8289, + 13128: 0x828C, + 13129: 0x8290, + 13130: 0x8293, + 13131: 0x8294, + 13132: 0x8295, + 13133: 0x8296, + 13134: 0x829A, + 13135: 0x829B, + 13136: 0x829E, + 13137: 0x82A0, + 13138: 0x82A2, + 13139: 0x82A3, + 13140: 0x82A7, + 13141: 0x82B2, + 13142: 0x82B5, + 13143: 0x82B6, + 13144: 0x82BA, + 13145: 0x82BB, + 13146: 0x82BC, + 13147: 0x82BF, + 13148: 0x82C0, + 13149: 0x82C2, + 13150: 0x82C3, + 13151: 0x82C5, + 13152: 0x82C6, + 13153: 0x82C9, + 13154: 0x82D0, + 13155: 0x82D6, + 13156: 0x82D9, + 13157: 0x82DA, + 13158: 0x82DD, + 13159: 0x82E2, + 13160: 0x82E7, + 13161: 0x82E8, + 13162: 0x82E9, + 13163: 0x82EA, + 13164: 0x82EC, + 13165: 0x82ED, + 13166: 0x82EE, + 13167: 0x82F0, + 13168: 0x82F2, + 13169: 0x82F3, + 13170: 0x82F5, + 13171: 0x82F6, + 13172: 0x82F8, + 13173: 0x82FA, + 13174: 0x82FC, + 13175: 0x82FD, + 13176: 0x82FE, + 13177: 0x82FF, + 13178: 0x8300, + 13179: 0x830A, + 13180: 0x830B, + 13181: 0x830D, + 13182: 0x8310, + 13183: 0x8312, + 13184: 0x8313, + 13185: 0x8316, + 13186: 0x8318, + 13187: 0x8319, + 13188: 0x831D, + 13189: 0x831E, + 13190: 0x831F, + 13191: 0x8320, + 13192: 0x8321, + 13193: 0x8322, + 13194: 0x8323, + 13195: 0x8324, + 13196: 0x8325, + 13197: 0x8326, + 13198: 0x8329, + 13199: 0x832A, + 13200: 0x832E, + 13201: 0x8330, + 13202: 0x8332, + 13203: 0x8337, + 13204: 0x833B, + 13205: 0x833D, + 13206: 0x5564, + 13207: 0x813E, + 13208: 0x75B2, + 13209: 0x76AE, + 13210: 0x5339, + 13211: 0x75DE, + 13212: 0x50FB, + 13213: 0x5C41, + 13214: 0x8B6C, + 13215: 0x7BC7, + 13216: 0x504F, + 13217: 0x7247, + 13218: 0x9A97, + 13219: 0x98D8, + 13220: 0x6F02, + 13221: 0x74E2, + 13222: 0x7968, + 13223: 0x6487, + 13224: 0x77A5, + 13225: 0x62FC, + 13226: 0x9891, + 13227: 0x8D2B, + 13228: 0x54C1, + 13229: 0x8058, + 13230: 0x4E52, + 13231: 0x576A, + 13232: 0x82F9, + 13233: 0x840D, + 13234: 0x5E73, + 13235: 0x51ED, + 13236: 0x74F6, + 13237: 0x8BC4, + 13238: 0x5C4F, + 13239: 0x5761, + 13240: 0x6CFC, + 13241: 0x9887, + 13242: 0x5A46, + 13243: 0x7834, + 13244: 0x9B44, + 13245: 0x8FEB, + 13246: 0x7C95, + 13247: 0x5256, + 13248: 0x6251, + 13249: 0x94FA, + 13250: 0x4EC6, + 13251: 0x8386, + 13252: 0x8461, + 13253: 0x83E9, + 13254: 0x84B2, + 13255: 0x57D4, + 13256: 0x6734, + 13257: 0x5703, + 13258: 0x666E, + 13259: 0x6D66, + 13260: 0x8C31, + 13261: 0x66DD, + 13262: 0x7011, + 13263: 0x671F, + 13264: 0x6B3A, + 13265: 0x6816, + 13266: 0x621A, + 13267: 0x59BB, + 13268: 0x4E03, + 13269: 0x51C4, + 13270: 0x6F06, + 13271: 0x67D2, + 13272: 0x6C8F, + 13273: 0x5176, + 13274: 0x68CB, + 13275: 0x5947, + 13276: 0x6B67, + 13277: 0x7566, + 13278: 0x5D0E, + 13279: 0x8110, + 13280: 0x9F50, + 13281: 0x65D7, + 13282: 0x7948, + 13283: 0x7941, + 13284: 0x9A91, + 13285: 0x8D77, + 13286: 0x5C82, + 13287: 0x4E5E, + 13288: 0x4F01, + 13289: 0x542F, + 13290: 0x5951, + 13291: 0x780C, + 13292: 0x5668, + 13293: 0x6C14, + 13294: 0x8FC4, + 13295: 0x5F03, + 13296: 0x6C7D, + 13297: 0x6CE3, + 13298: 0x8BAB, + 13299: 0x6390, + 13300: 0x833E, + 13301: 0x833F, + 13302: 0x8341, + 13303: 0x8342, + 13304: 0x8344, + 13305: 0x8345, + 13306: 0x8348, + 13307: 0x834A, + 13308: 0x834B, + 13309: 0x834C, + 13310: 0x834D, + 13311: 0x834E, + 13312: 0x8353, + 13313: 0x8355, + 13314: 0x8356, + 13315: 0x8357, + 13316: 0x8358, + 13317: 0x8359, + 13318: 0x835D, + 13319: 0x8362, + 13320: 0x8370, + 13321: 0x8371, + 13322: 0x8372, + 13323: 0x8373, + 13324: 0x8374, + 13325: 0x8375, + 13326: 0x8376, + 13327: 0x8379, + 13328: 0x837A, + 13329: 0x837E, + 13330: 0x837F, + 13331: 0x8380, + 13332: 0x8381, + 13333: 0x8382, + 13334: 0x8383, + 13335: 0x8384, + 13336: 0x8387, + 13337: 0x8388, + 13338: 0x838A, + 13339: 0x838B, + 13340: 0x838C, + 13341: 0x838D, + 13342: 0x838F, + 13343: 0x8390, + 13344: 0x8391, + 13345: 0x8394, + 13346: 0x8395, + 13347: 0x8396, + 13348: 0x8397, + 13349: 0x8399, + 13350: 0x839A, + 13351: 0x839D, + 13352: 0x839F, + 13353: 0x83A1, + 13354: 0x83A2, + 13355: 0x83A3, + 13356: 0x83A4, + 13357: 0x83A5, + 13358: 0x83A6, + 13359: 0x83A7, + 13360: 0x83AC, + 13361: 0x83AD, + 13362: 0x83AE, + 13363: 0x83AF, + 13364: 0x83B5, + 13365: 0x83BB, + 13366: 0x83BE, + 13367: 0x83BF, + 13368: 0x83C2, + 13369: 0x83C3, + 13370: 0x83C4, + 13371: 0x83C6, + 13372: 0x83C8, + 13373: 0x83C9, + 13374: 0x83CB, + 13375: 0x83CD, + 13376: 0x83CE, + 13377: 0x83D0, + 13378: 0x83D1, + 13379: 0x83D2, + 13380: 0x83D3, + 13381: 0x83D5, + 13382: 0x83D7, + 13383: 0x83D9, + 13384: 0x83DA, + 13385: 0x83DB, + 13386: 0x83DE, + 13387: 0x83E2, + 13388: 0x83E3, + 13389: 0x83E4, + 13390: 0x83E6, + 13391: 0x83E7, + 13392: 0x83E8, + 13393: 0x83EB, + 13394: 0x83EC, + 13395: 0x83ED, + 13396: 0x6070, + 13397: 0x6D3D, + 13398: 0x7275, + 13399: 0x6266, + 13400: 0x948E, + 13401: 0x94C5, + 13402: 0x5343, + 13403: 0x8FC1, + 13404: 0x7B7E, + 13405: 0x4EDF, + 13406: 0x8C26, + 13407: 0x4E7E, + 13408: 0x9ED4, + 13409: 0x94B1, + 13410: 0x94B3, + 13411: 0x524D, + 13412: 0x6F5C, + 13413: 0x9063, + 13414: 0x6D45, + 13415: 0x8C34, + 13416: 0x5811, + 13417: 0x5D4C, + 13418: 0x6B20, + 13419: 0x6B49, + 13420: 0x67AA, + 13421: 0x545B, + 13422: 0x8154, + 13423: 0x7F8C, + 13424: 0x5899, + 13425: 0x8537, + 13426: 0x5F3A, + 13427: 0x62A2, + 13428: 0x6A47, + 13429: 0x9539, + 13430: 0x6572, + 13431: 0x6084, + 13432: 0x6865, + 13433: 0x77A7, + 13434: 0x4E54, + 13435: 0x4FA8, + 13436: 0x5DE7, + 13437: 0x9798, + 13438: 0x64AC, + 13439: 0x7FD8, + 13440: 0x5CED, + 13441: 0x4FCF, + 13442: 0x7A8D, + 13443: 0x5207, + 13444: 0x8304, + 13445: 0x4E14, + 13446: 0x602F, + 13447: 0x7A83, + 13448: 0x94A6, + 13449: 0x4FB5, + 13450: 0x4EB2, + 13451: 0x79E6, + 13452: 0x7434, + 13453: 0x52E4, + 13454: 0x82B9, + 13455: 0x64D2, + 13456: 0x79BD, + 13457: 0x5BDD, + 13458: 0x6C81, + 13459: 0x9752, + 13460: 0x8F7B, + 13461: 0x6C22, + 13462: 0x503E, + 13463: 0x537F, + 13464: 0x6E05, + 13465: 0x64CE, + 13466: 0x6674, + 13467: 0x6C30, + 13468: 0x60C5, + 13469: 0x9877, + 13470: 0x8BF7, + 13471: 0x5E86, + 13472: 0x743C, + 13473: 0x7A77, + 13474: 0x79CB, + 13475: 0x4E18, + 13476: 0x90B1, + 13477: 0x7403, + 13478: 0x6C42, + 13479: 0x56DA, + 13480: 0x914B, + 13481: 0x6CC5, + 13482: 0x8D8B, + 13483: 0x533A, + 13484: 0x86C6, + 13485: 0x66F2, + 13486: 0x8EAF, + 13487: 0x5C48, + 13488: 0x9A71, + 13489: 0x6E20, + 13490: 0x83EE, + 13491: 0x83EF, + 13492: 0x83F3, + 13493: 0x83F4, + 13494: 0x83F5, + 13495: 0x83F6, + 13496: 0x83F7, + 13497: 0x83FA, + 13498: 0x83FB, + 13499: 0x83FC, + 13500: 0x83FE, + 13501: 0x83FF, + 13502: 0x8400, + 13503: 0x8402, + 13504: 0x8405, + 13505: 0x8407, + 13506: 0x8408, + 13507: 0x8409, + 13508: 0x840A, + 13509: 0x8410, + 13510: 0x8412, + 13511: 0x8413, + 13512: 0x8414, + 13513: 0x8415, + 13514: 0x8416, + 13515: 0x8417, + 13516: 0x8419, + 13517: 0x841A, + 13518: 0x841B, + 13519: 0x841E, + 13520: 0x841F, + 13521: 0x8420, + 13522: 0x8421, + 13523: 0x8422, + 13524: 0x8423, + 13525: 0x8429, + 13526: 0x842A, + 13527: 0x842B, + 13528: 0x842C, + 13529: 0x842D, + 13530: 0x842E, + 13531: 0x842F, + 13532: 0x8430, + 13533: 0x8432, + 13534: 0x8433, + 13535: 0x8434, + 13536: 0x8435, + 13537: 0x8436, + 13538: 0x8437, + 13539: 0x8439, + 13540: 0x843A, + 13541: 0x843B, + 13542: 0x843E, + 13543: 0x843F, + 13544: 0x8440, + 13545: 0x8441, + 13546: 0x8442, + 13547: 0x8443, + 13548: 0x8444, + 13549: 0x8445, + 13550: 0x8447, + 13551: 0x8448, + 13552: 0x8449, + 13553: 0x844A, + 13554: 0x844B, + 13555: 0x844C, + 13556: 0x844D, + 13557: 0x844E, + 13558: 0x844F, + 13559: 0x8450, + 13560: 0x8452, + 13561: 0x8453, + 13562: 0x8454, + 13563: 0x8455, + 13564: 0x8456, + 13565: 0x8458, + 13566: 0x845D, + 13567: 0x845E, + 13568: 0x845F, + 13569: 0x8460, + 13570: 0x8462, + 13571: 0x8464, + 13572: 0x8465, + 13573: 0x8466, + 13574: 0x8467, + 13575: 0x8468, + 13576: 0x846A, + 13577: 0x846E, + 13578: 0x846F, + 13579: 0x8470, + 13580: 0x8472, + 13581: 0x8474, + 13582: 0x8477, + 13583: 0x8479, + 13584: 0x847B, + 13585: 0x847C, + 13586: 0x53D6, + 13587: 0x5A36, + 13588: 0x9F8B, + 13589: 0x8DA3, + 13590: 0x53BB, + 13591: 0x5708, + 13592: 0x98A7, + 13593: 0x6743, + 13594: 0x919B, + 13595: 0x6CC9, + 13596: 0x5168, + 13597: 0x75CA, + 13598: 0x62F3, + 13599: 0x72AC, + 13600: 0x5238, + 13601: 0x529D, + 13602: 0x7F3A, + 13603: 0x7094, + 13604: 0x7638, + 13605: 0x5374, + 13606: 0x9E4A, + 13607: 0x69B7, + 13608: 0x786E, + 13609: 0x96C0, + 13610: 0x88D9, + 13611: 0x7FA4, + 13612: 0x7136, + 13613: 0x71C3, + 13614: 0x5189, + 13615: 0x67D3, + 13616: 0x74E4, + 13617: 0x58E4, + 13618: 0x6518, + 13619: 0x56B7, + 13620: 0x8BA9, + 13621: 0x9976, + 13622: 0x6270, + 13623: 0x7ED5, + 13624: 0x60F9, + 13625: 0x70ED, + 13626: 0x58EC, + 13627: 0x4EC1, + 13628: 0x4EBA, + 13629: 0x5FCD, + 13630: 0x97E7, + 13631: 0x4EFB, + 13632: 0x8BA4, + 13633: 0x5203, + 13634: 0x598A, + 13635: 0x7EAB, + 13636: 0x6254, + 13637: 0x4ECD, + 13638: 0x65E5, + 13639: 0x620E, + 13640: 0x8338, + 13641: 0x84C9, + 13642: 0x8363, + 13643: 0x878D, + 13644: 0x7194, + 13645: 0x6EB6, + 13646: 0x5BB9, + 13647: 0x7ED2, + 13648: 0x5197, + 13649: 0x63C9, + 13650: 0x67D4, + 13651: 0x8089, + 13652: 0x8339, + 13653: 0x8815, + 13654: 0x5112, + 13655: 0x5B7A, + 13656: 0x5982, + 13657: 0x8FB1, + 13658: 0x4E73, + 13659: 0x6C5D, + 13660: 0x5165, + 13661: 0x8925, + 13662: 0x8F6F, + 13663: 0x962E, + 13664: 0x854A, + 13665: 0x745E, + 13666: 0x9510, + 13667: 0x95F0, + 13668: 0x6DA6, + 13669: 0x82E5, + 13670: 0x5F31, + 13671: 0x6492, + 13672: 0x6D12, + 13673: 0x8428, + 13674: 0x816E, + 13675: 0x9CC3, + 13676: 0x585E, + 13677: 0x8D5B, + 13678: 0x4E09, + 13679: 0x53C1, + 13680: 0x847D, + 13681: 0x847E, + 13682: 0x847F, + 13683: 0x8480, + 13684: 0x8481, + 13685: 0x8483, + 13686: 0x8484, + 13687: 0x8485, + 13688: 0x8486, + 13689: 0x848A, + 13690: 0x848D, + 13691: 0x848F, + 13692: 0x8490, + 13693: 0x8491, + 13694: 0x8492, + 13695: 0x8493, + 13696: 0x8494, + 13697: 0x8495, + 13698: 0x8496, + 13699: 0x8498, + 13700: 0x849A, + 13701: 0x849B, + 13702: 0x849D, + 13703: 0x849E, + 13704: 0x849F, + 13705: 0x84A0, + 13706: 0x84A2, + 13707: 0x84A3, + 13708: 0x84A4, + 13709: 0x84A5, + 13710: 0x84A6, + 13711: 0x84A7, + 13712: 0x84A8, + 13713: 0x84A9, + 13714: 0x84AA, + 13715: 0x84AB, + 13716: 0x84AC, + 13717: 0x84AD, + 13718: 0x84AE, + 13719: 0x84B0, + 13720: 0x84B1, + 13721: 0x84B3, + 13722: 0x84B5, + 13723: 0x84B6, + 13724: 0x84B7, + 13725: 0x84BB, + 13726: 0x84BC, + 13727: 0x84BE, + 13728: 0x84C0, + 13729: 0x84C2, + 13730: 0x84C3, + 13731: 0x84C5, + 13732: 0x84C6, + 13733: 0x84C7, + 13734: 0x84C8, + 13735: 0x84CB, + 13736: 0x84CC, + 13737: 0x84CE, + 13738: 0x84CF, + 13739: 0x84D2, + 13740: 0x84D4, + 13741: 0x84D5, + 13742: 0x84D7, + 13743: 0x84D8, + 13744: 0x84D9, + 13745: 0x84DA, + 13746: 0x84DB, + 13747: 0x84DC, + 13748: 0x84DE, + 13749: 0x84E1, + 13750: 0x84E2, + 13751: 0x84E4, + 13752: 0x84E7, + 13753: 0x84E8, + 13754: 0x84E9, + 13755: 0x84EA, + 13756: 0x84EB, + 13757: 0x84ED, + 13758: 0x84EE, + 13759: 0x84EF, + 13760: 0x84F1, + 13761: 0x84F2, + 13762: 0x84F3, + 13763: 0x84F4, + 13764: 0x84F5, + 13765: 0x84F6, + 13766: 0x84F7, + 13767: 0x84F8, + 13768: 0x84F9, + 13769: 0x84FA, + 13770: 0x84FB, + 13771: 0x84FD, + 13772: 0x84FE, + 13773: 0x8500, + 13774: 0x8501, + 13775: 0x8502, + 13776: 0x4F1E, + 13777: 0x6563, + 13778: 0x6851, + 13779: 0x55D3, + 13780: 0x4E27, + 13781: 0x6414, + 13782: 0x9A9A, + 13783: 0x626B, + 13784: 0x5AC2, + 13785: 0x745F, + 13786: 0x8272, + 13787: 0x6DA9, + 13788: 0x68EE, + 13789: 0x50E7, + 13790: 0x838E, + 13791: 0x7802, + 13792: 0x6740, + 13793: 0x5239, + 13794: 0x6C99, + 13795: 0x7EB1, + 13796: 0x50BB, + 13797: 0x5565, + 13798: 0x715E, + 13799: 0x7B5B, + 13800: 0x6652, + 13801: 0x73CA, + 13802: 0x82EB, + 13803: 0x6749, + 13804: 0x5C71, + 13805: 0x5220, + 13806: 0x717D, + 13807: 0x886B, + 13808: 0x95EA, + 13809: 0x9655, + 13810: 0x64C5, + 13811: 0x8D61, + 13812: 0x81B3, + 13813: 0x5584, + 13814: 0x6C55, + 13815: 0x6247, + 13816: 0x7F2E, + 13817: 0x5892, + 13818: 0x4F24, + 13819: 0x5546, + 13820: 0x8D4F, + 13821: 0x664C, + 13822: 0x4E0A, + 13823: 0x5C1A, + 13824: 0x88F3, + 13825: 0x68A2, + 13826: 0x634E, + 13827: 0x7A0D, + 13828: 0x70E7, + 13829: 0x828D, + 13830: 0x52FA, + 13831: 0x97F6, + 13832: 0x5C11, + 13833: 0x54E8, + 13834: 0x90B5, + 13835: 0x7ECD, + 13836: 0x5962, + 13837: 0x8D4A, + 13838: 0x86C7, + 13839: 0x820C, + 13840: 0x820D, + 13841: 0x8D66, + 13842: 0x6444, + 13843: 0x5C04, + 13844: 0x6151, + 13845: 0x6D89, + 13846: 0x793E, + 13847: 0x8BBE, + 13848: 0x7837, + 13849: 0x7533, + 13850: 0x547B, + 13851: 0x4F38, + 13852: 0x8EAB, + 13853: 0x6DF1, + 13854: 0x5A20, + 13855: 0x7EC5, + 13856: 0x795E, + 13857: 0x6C88, + 13858: 0x5BA1, + 13859: 0x5A76, + 13860: 0x751A, + 13861: 0x80BE, + 13862: 0x614E, + 13863: 0x6E17, + 13864: 0x58F0, + 13865: 0x751F, + 13866: 0x7525, + 13867: 0x7272, + 13868: 0x5347, + 13869: 0x7EF3, + 13870: 0x8503, + 13871: 0x8504, + 13872: 0x8505, + 13873: 0x8506, + 13874: 0x8507, + 13875: 0x8508, + 13876: 0x8509, + 13877: 0x850A, + 13878: 0x850B, + 13879: 0x850D, + 13880: 0x850E, + 13881: 0x850F, + 13882: 0x8510, + 13883: 0x8512, + 13884: 0x8514, + 13885: 0x8515, + 13886: 0x8516, + 13887: 0x8518, + 13888: 0x8519, + 13889: 0x851B, + 13890: 0x851C, + 13891: 0x851D, + 13892: 0x851E, + 13893: 0x8520, + 13894: 0x8522, + 13895: 0x8523, + 13896: 0x8524, + 13897: 0x8525, + 13898: 0x8526, + 13899: 0x8527, + 13900: 0x8528, + 13901: 0x8529, + 13902: 0x852A, + 13903: 0x852D, + 13904: 0x852E, + 13905: 0x852F, + 13906: 0x8530, + 13907: 0x8531, + 13908: 0x8532, + 13909: 0x8533, + 13910: 0x8534, + 13911: 0x8535, + 13912: 0x8536, + 13913: 0x853E, + 13914: 0x853F, + 13915: 0x8540, + 13916: 0x8541, + 13917: 0x8542, + 13918: 0x8544, + 13919: 0x8545, + 13920: 0x8546, + 13921: 0x8547, + 13922: 0x854B, + 13923: 0x854C, + 13924: 0x854D, + 13925: 0x854E, + 13926: 0x854F, + 13927: 0x8550, + 13928: 0x8551, + 13929: 0x8552, + 13930: 0x8553, + 13931: 0x8554, + 13932: 0x8555, + 13933: 0x8557, + 13934: 0x8558, + 13935: 0x855A, + 13936: 0x855B, + 13937: 0x855C, + 13938: 0x855D, + 13939: 0x855F, + 13940: 0x8560, + 13941: 0x8561, + 13942: 0x8562, + 13943: 0x8563, + 13944: 0x8565, + 13945: 0x8566, + 13946: 0x8567, + 13947: 0x8569, + 13948: 0x856A, + 13949: 0x856B, + 13950: 0x856C, + 13951: 0x856D, + 13952: 0x856E, + 13953: 0x856F, + 13954: 0x8570, + 13955: 0x8571, + 13956: 0x8573, + 13957: 0x8575, + 13958: 0x8576, + 13959: 0x8577, + 13960: 0x8578, + 13961: 0x857C, + 13962: 0x857D, + 13963: 0x857F, + 13964: 0x8580, + 13965: 0x8581, + 13966: 0x7701, + 13967: 0x76DB, + 13968: 0x5269, + 13969: 0x80DC, + 13970: 0x5723, + 13971: 0x5E08, + 13972: 0x5931, + 13973: 0x72EE, + 13974: 0x65BD, + 13975: 0x6E7F, + 13976: 0x8BD7, + 13977: 0x5C38, + 13978: 0x8671, + 13979: 0x5341, + 13980: 0x77F3, + 13981: 0x62FE, + 13982: 0x65F6, + 13983: 0x4EC0, + 13984: 0x98DF, + 13985: 0x8680, + 13986: 0x5B9E, + 13987: 0x8BC6, + 13988: 0x53F2, + 13989: 0x77E2, + 13990: 0x4F7F, + 13991: 0x5C4E, + 13992: 0x9A76, + 13993: 0x59CB, + 13994: 0x5F0F, + 13995: 0x793A, + 13996: 0x58EB, + 13997: 0x4E16, + 13998: 0x67FF, + 13999: 0x4E8B, + 14000: 0x62ED, + 14001: 0x8A93, + 14002: 0x901D, + 14003: 0x52BF, + 14004: 0x662F, + 14005: 0x55DC, + 14006: 0x566C, + 14007: 0x9002, + 14008: 0x4ED5, + 14009: 0x4F8D, + 14010: 0x91CA, + 14011: 0x9970, + 14012: 0x6C0F, + 14013: 0x5E02, + 14014: 0x6043, + 14015: 0x5BA4, + 14016: 0x89C6, + 14017: 0x8BD5, + 14018: 0x6536, + 14019: 0x624B, + 14020: 0x9996, + 14021: 0x5B88, + 14022: 0x5BFF, + 14023: 0x6388, + 14024: 0x552E, + 14025: 0x53D7, + 14026: 0x7626, + 14027: 0x517D, + 14028: 0x852C, + 14029: 0x67A2, + 14030: 0x68B3, + 14031: 0x6B8A, + 14032: 0x6292, + 14033: 0x8F93, + 14034: 0x53D4, + 14035: 0x8212, + 14036: 0x6DD1, + 14037: 0x758F, + 14038: 0x4E66, + 14039: 0x8D4E, + 14040: 0x5B70, + 14041: 0x719F, + 14042: 0x85AF, + 14043: 0x6691, + 14044: 0x66D9, + 14045: 0x7F72, + 14046: 0x8700, + 14047: 0x9ECD, + 14048: 0x9F20, + 14049: 0x5C5E, + 14050: 0x672F, + 14051: 0x8FF0, + 14052: 0x6811, + 14053: 0x675F, + 14054: 0x620D, + 14055: 0x7AD6, + 14056: 0x5885, + 14057: 0x5EB6, + 14058: 0x6570, + 14059: 0x6F31, + 14060: 0x8582, + 14061: 0x8583, + 14062: 0x8586, + 14063: 0x8588, + 14064: 0x8589, + 14065: 0x858A, + 14066: 0x858B, + 14067: 0x858C, + 14068: 0x858D, + 14069: 0x858E, + 14070: 0x8590, + 14071: 0x8591, + 14072: 0x8592, + 14073: 0x8593, + 14074: 0x8594, + 14075: 0x8595, + 14076: 0x8596, + 14077: 0x8597, + 14078: 0x8598, + 14079: 0x8599, + 14080: 0x859A, + 14081: 0x859D, + 14082: 0x859E, + 14083: 0x859F, + 14084: 0x85A0, + 14085: 0x85A1, + 14086: 0x85A2, + 14087: 0x85A3, + 14088: 0x85A5, + 14089: 0x85A6, + 14090: 0x85A7, + 14091: 0x85A9, + 14092: 0x85AB, + 14093: 0x85AC, + 14094: 0x85AD, + 14095: 0x85B1, + 14096: 0x85B2, + 14097: 0x85B3, + 14098: 0x85B4, + 14099: 0x85B5, + 14100: 0x85B6, + 14101: 0x85B8, + 14102: 0x85BA, + 14103: 0x85BB, + 14104: 0x85BC, + 14105: 0x85BD, + 14106: 0x85BE, + 14107: 0x85BF, + 14108: 0x85C0, + 14109: 0x85C2, + 14110: 0x85C3, + 14111: 0x85C4, + 14112: 0x85C5, + 14113: 0x85C6, + 14114: 0x85C7, + 14115: 0x85C8, + 14116: 0x85CA, + 14117: 0x85CB, + 14118: 0x85CC, + 14119: 0x85CD, + 14120: 0x85CE, + 14121: 0x85D1, + 14122: 0x85D2, + 14123: 0x85D4, + 14124: 0x85D6, + 14125: 0x85D7, + 14126: 0x85D8, + 14127: 0x85D9, + 14128: 0x85DA, + 14129: 0x85DB, + 14130: 0x85DD, + 14131: 0x85DE, + 14132: 0x85DF, + 14133: 0x85E0, + 14134: 0x85E1, + 14135: 0x85E2, + 14136: 0x85E3, + 14137: 0x85E5, + 14138: 0x85E6, + 14139: 0x85E7, + 14140: 0x85E8, + 14141: 0x85EA, + 14142: 0x85EB, + 14143: 0x85EC, + 14144: 0x85ED, + 14145: 0x85EE, + 14146: 0x85EF, + 14147: 0x85F0, + 14148: 0x85F1, + 14149: 0x85F2, + 14150: 0x85F3, + 14151: 0x85F4, + 14152: 0x85F5, + 14153: 0x85F6, + 14154: 0x85F7, + 14155: 0x85F8, + 14156: 0x6055, + 14157: 0x5237, + 14158: 0x800D, + 14159: 0x6454, + 14160: 0x8870, + 14161: 0x7529, + 14162: 0x5E05, + 14163: 0x6813, + 14164: 0x62F4, + 14165: 0x971C, + 14166: 0x53CC, + 14167: 0x723D, + 14168: 0x8C01, + 14169: 0x6C34, + 14170: 0x7761, + 14171: 0x7A0E, + 14172: 0x542E, + 14173: 0x77AC, + 14174: 0x987A, + 14175: 0x821C, + 14176: 0x8BF4, + 14177: 0x7855, + 14178: 0x6714, + 14179: 0x70C1, + 14180: 0x65AF, + 14181: 0x6495, + 14182: 0x5636, + 14183: 0x601D, + 14184: 0x79C1, + 14185: 0x53F8, + 14186: 0x4E1D, + 14187: 0x6B7B, + 14188: 0x8086, + 14189: 0x5BFA, + 14190: 0x55E3, + 14191: 0x56DB, + 14192: 0x4F3A, + 14193: 0x4F3C, + 14194: 0x9972, + 14195: 0x5DF3, + 14196: 0x677E, + 14197: 0x8038, + 14198: 0x6002, + 14199: 0x9882, + 14200: 0x9001, + 14201: 0x5B8B, + 14202: 0x8BBC, + 14203: 0x8BF5, + 14204: 0x641C, + 14205: 0x8258, + 14206: 0x64DE, + 14207: 0x55FD, + 14208: 0x82CF, + 14209: 0x9165, + 14210: 0x4FD7, + 14211: 0x7D20, + 14212: 0x901F, + 14213: 0x7C9F, + 14214: 0x50F3, + 14215: 0x5851, + 14216: 0x6EAF, + 14217: 0x5BBF, + 14218: 0x8BC9, + 14219: 0x8083, + 14220: 0x9178, + 14221: 0x849C, + 14222: 0x7B97, + 14223: 0x867D, + 14224: 0x968B, + 14225: 0x968F, + 14226: 0x7EE5, + 14227: 0x9AD3, + 14228: 0x788E, + 14229: 0x5C81, + 14230: 0x7A57, + 14231: 0x9042, + 14232: 0x96A7, + 14233: 0x795F, + 14234: 0x5B59, + 14235: 0x635F, + 14236: 0x7B0B, + 14237: 0x84D1, + 14238: 0x68AD, + 14239: 0x5506, + 14240: 0x7F29, + 14241: 0x7410, + 14242: 0x7D22, + 14243: 0x9501, + 14244: 0x6240, + 14245: 0x584C, + 14246: 0x4ED6, + 14247: 0x5B83, + 14248: 0x5979, + 14249: 0x5854, + 14250: 0x85F9, + 14251: 0x85FA, + 14252: 0x85FC, + 14253: 0x85FD, + 14254: 0x85FE, + 14255: 0x8600, + 14256: 0x8601, + 14257: 0x8602, + 14258: 0x8603, + 14259: 0x8604, + 14260: 0x8606, + 14261: 0x8607, + 14262: 0x8608, + 14263: 0x8609, + 14264: 0x860A, + 14265: 0x860B, + 14266: 0x860C, + 14267: 0x860D, + 14268: 0x860E, + 14269: 0x860F, + 14270: 0x8610, + 14271: 0x8612, + 14272: 0x8613, + 14273: 0x8614, + 14274: 0x8615, + 14275: 0x8617, + 14276: 0x8618, + 14277: 0x8619, + 14278: 0x861A, + 14279: 0x861B, + 14280: 0x861C, + 14281: 0x861D, + 14282: 0x861E, + 14283: 0x861F, + 14284: 0x8620, + 14285: 0x8621, + 14286: 0x8622, + 14287: 0x8623, + 14288: 0x8624, + 14289: 0x8625, + 14290: 0x8626, + 14291: 0x8628, + 14292: 0x862A, + 14293: 0x862B, + 14294: 0x862C, + 14295: 0x862D, + 14296: 0x862E, + 14297: 0x862F, + 14298: 0x8630, + 14299: 0x8631, + 14300: 0x8632, + 14301: 0x8633, + 14302: 0x8634, + 14303: 0x8635, + 14304: 0x8636, + 14305: 0x8637, + 14306: 0x8639, + 14307: 0x863A, + 14308: 0x863B, + 14309: 0x863D, + 14310: 0x863E, + 14311: 0x863F, + 14312: 0x8640, + 14313: 0x8641, + 14314: 0x8642, + 14315: 0x8643, + 14316: 0x8644, + 14317: 0x8645, + 14318: 0x8646, + 14319: 0x8647, + 14320: 0x8648, + 14321: 0x8649, + 14322: 0x864A, + 14323: 0x864B, + 14324: 0x864C, + 14325: 0x8652, + 14326: 0x8653, + 14327: 0x8655, + 14328: 0x8656, + 14329: 0x8657, + 14330: 0x8658, + 14331: 0x8659, + 14332: 0x865B, + 14333: 0x865C, + 14334: 0x865D, + 14335: 0x865F, + 14336: 0x8660, + 14337: 0x8661, + 14338: 0x8663, + 14339: 0x8664, + 14340: 0x8665, + 14341: 0x8666, + 14342: 0x8667, + 14343: 0x8668, + 14344: 0x8669, + 14345: 0x866A, + 14346: 0x736D, + 14347: 0x631E, + 14348: 0x8E4B, + 14349: 0x8E0F, + 14350: 0x80CE, + 14351: 0x82D4, + 14352: 0x62AC, + 14353: 0x53F0, + 14354: 0x6CF0, + 14355: 0x915E, + 14356: 0x592A, + 14357: 0x6001, + 14358: 0x6C70, + 14359: 0x574D, + 14360: 0x644A, + 14361: 0x8D2A, + 14362: 0x762B, + 14363: 0x6EE9, + 14364: 0x575B, + 14365: 0x6A80, + 14366: 0x75F0, + 14367: 0x6F6D, + 14368: 0x8C2D, + 14369: 0x8C08, + 14370: 0x5766, + 14371: 0x6BEF, + 14372: 0x8892, + 14373: 0x78B3, + 14374: 0x63A2, + 14375: 0x53F9, + 14376: 0x70AD, + 14377: 0x6C64, + 14378: 0x5858, + 14379: 0x642A, + 14380: 0x5802, + 14381: 0x68E0, + 14382: 0x819B, + 14383: 0x5510, + 14384: 0x7CD6, + 14385: 0x5018, + 14386: 0x8EBA, + 14387: 0x6DCC, + 14388: 0x8D9F, + 14389: 0x70EB, + 14390: 0x638F, + 14391: 0x6D9B, + 14392: 0x6ED4, + 14393: 0x7EE6, + 14394: 0x8404, + 14395: 0x6843, + 14396: 0x9003, + 14397: 0x6DD8, + 14398: 0x9676, + 14399: 0x8BA8, + 14400: 0x5957, + 14401: 0x7279, + 14402: 0x85E4, + 14403: 0x817E, + 14404: 0x75BC, + 14405: 0x8A8A, + 14406: 0x68AF, + 14407: 0x5254, + 14408: 0x8E22, + 14409: 0x9511, + 14410: 0x63D0, + 14411: 0x9898, + 14412: 0x8E44, + 14413: 0x557C, + 14414: 0x4F53, + 14415: 0x66FF, + 14416: 0x568F, + 14417: 0x60D5, + 14418: 0x6D95, + 14419: 0x5243, + 14420: 0x5C49, + 14421: 0x5929, + 14422: 0x6DFB, + 14423: 0x586B, + 14424: 0x7530, + 14425: 0x751C, + 14426: 0x606C, + 14427: 0x8214, + 14428: 0x8146, + 14429: 0x6311, + 14430: 0x6761, + 14431: 0x8FE2, + 14432: 0x773A, + 14433: 0x8DF3, + 14434: 0x8D34, + 14435: 0x94C1, + 14436: 0x5E16, + 14437: 0x5385, + 14438: 0x542C, + 14439: 0x70C3, + 14440: 0x866D, + 14441: 0x866F, + 14442: 0x8670, + 14443: 0x8672, + 14444: 0x8673, + 14445: 0x8674, + 14446: 0x8675, + 14447: 0x8676, + 14448: 0x8677, + 14449: 0x8678, + 14450: 0x8683, + 14451: 0x8684, + 14452: 0x8685, + 14453: 0x8686, + 14454: 0x8687, + 14455: 0x8688, + 14456: 0x8689, + 14457: 0x868E, + 14458: 0x868F, + 14459: 0x8690, + 14460: 0x8691, + 14461: 0x8692, + 14462: 0x8694, + 14463: 0x8696, + 14464: 0x8697, + 14465: 0x8698, + 14466: 0x8699, + 14467: 0x869A, + 14468: 0x869B, + 14469: 0x869E, + 14470: 0x869F, + 14471: 0x86A0, + 14472: 0x86A1, + 14473: 0x86A2, + 14474: 0x86A5, + 14475: 0x86A6, + 14476: 0x86AB, + 14477: 0x86AD, + 14478: 0x86AE, + 14479: 0x86B2, + 14480: 0x86B3, + 14481: 0x86B7, + 14482: 0x86B8, + 14483: 0x86B9, + 14484: 0x86BB, + 14485: 0x86BC, + 14486: 0x86BD, + 14487: 0x86BE, + 14488: 0x86BF, + 14489: 0x86C1, + 14490: 0x86C2, + 14491: 0x86C3, + 14492: 0x86C5, + 14493: 0x86C8, + 14494: 0x86CC, + 14495: 0x86CD, + 14496: 0x86D2, + 14497: 0x86D3, + 14498: 0x86D5, + 14499: 0x86D6, + 14500: 0x86D7, + 14501: 0x86DA, + 14502: 0x86DC, + 14503: 0x86DD, + 14504: 0x86E0, + 14505: 0x86E1, + 14506: 0x86E2, + 14507: 0x86E3, + 14508: 0x86E5, + 14509: 0x86E6, + 14510: 0x86E7, + 14511: 0x86E8, + 14512: 0x86EA, + 14513: 0x86EB, + 14514: 0x86EC, + 14515: 0x86EF, + 14516: 0x86F5, + 14517: 0x86F6, + 14518: 0x86F7, + 14519: 0x86FA, + 14520: 0x86FB, + 14521: 0x86FC, + 14522: 0x86FD, + 14523: 0x86FF, + 14524: 0x8701, + 14525: 0x8704, + 14526: 0x8705, + 14527: 0x8706, + 14528: 0x870B, + 14529: 0x870C, + 14530: 0x870E, + 14531: 0x870F, + 14532: 0x8710, + 14533: 0x8711, + 14534: 0x8714, + 14535: 0x8716, + 14536: 0x6C40, + 14537: 0x5EF7, + 14538: 0x505C, + 14539: 0x4EAD, + 14540: 0x5EAD, + 14541: 0x633A, + 14542: 0x8247, + 14543: 0x901A, + 14544: 0x6850, + 14545: 0x916E, + 14546: 0x77B3, + 14547: 0x540C, + 14548: 0x94DC, + 14549: 0x5F64, + 14550: 0x7AE5, + 14551: 0x6876, + 14552: 0x6345, + 14553: 0x7B52, + 14554: 0x7EDF, + 14555: 0x75DB, + 14556: 0x5077, + 14557: 0x6295, + 14558: 0x5934, + 14559: 0x900F, + 14560: 0x51F8, + 14561: 0x79C3, + 14562: 0x7A81, + 14563: 0x56FE, + 14564: 0x5F92, + 14565: 0x9014, + 14566: 0x6D82, + 14567: 0x5C60, + 14568: 0x571F, + 14569: 0x5410, + 14570: 0x5154, + 14571: 0x6E4D, + 14572: 0x56E2, + 14573: 0x63A8, + 14574: 0x9893, + 14575: 0x817F, + 14576: 0x8715, + 14577: 0x892A, + 14578: 0x9000, + 14579: 0x541E, + 14580: 0x5C6F, + 14581: 0x81C0, + 14582: 0x62D6, + 14583: 0x6258, + 14584: 0x8131, + 14585: 0x9E35, + 14586: 0x9640, + 14587: 0x9A6E, + 14588: 0x9A7C, + 14589: 0x692D, + 14590: 0x59A5, + 14591: 0x62D3, + 14592: 0x553E, + 14593: 0x6316, + 14594: 0x54C7, + 14595: 0x86D9, + 14596: 0x6D3C, + 14597: 0x5A03, + 14598: 0x74E6, + 14599: 0x889C, + 14600: 0x6B6A, + 14601: 0x5916, + 14602: 0x8C4C, + 14603: 0x5F2F, + 14604: 0x6E7E, + 14605: 0x73A9, + 14606: 0x987D, + 14607: 0x4E38, + 14608: 0x70F7, + 14609: 0x5B8C, + 14610: 0x7897, + 14611: 0x633D, + 14612: 0x665A, + 14613: 0x7696, + 14614: 0x60CB, + 14615: 0x5B9B, + 14616: 0x5A49, + 14617: 0x4E07, + 14618: 0x8155, + 14619: 0x6C6A, + 14620: 0x738B, + 14621: 0x4EA1, + 14622: 0x6789, + 14623: 0x7F51, + 14624: 0x5F80, + 14625: 0x65FA, + 14626: 0x671B, + 14627: 0x5FD8, + 14628: 0x5984, + 14629: 0x5A01, + 14630: 0x8719, + 14631: 0x871B, + 14632: 0x871D, + 14633: 0x871F, + 14634: 0x8720, + 14635: 0x8724, + 14636: 0x8726, + 14637: 0x8727, + 14638: 0x8728, + 14639: 0x872A, + 14640: 0x872B, + 14641: 0x872C, + 14642: 0x872D, + 14643: 0x872F, + 14644: 0x8730, + 14645: 0x8732, + 14646: 0x8733, + 14647: 0x8735, + 14648: 0x8736, + 14649: 0x8738, + 14650: 0x8739, + 14651: 0x873A, + 14652: 0x873C, + 14653: 0x873D, + 14654: 0x8740, + 14655: 0x8741, + 14656: 0x8742, + 14657: 0x8743, + 14658: 0x8744, + 14659: 0x8745, + 14660: 0x8746, + 14661: 0x874A, + 14662: 0x874B, + 14663: 0x874D, + 14664: 0x874F, + 14665: 0x8750, + 14666: 0x8751, + 14667: 0x8752, + 14668: 0x8754, + 14669: 0x8755, + 14670: 0x8756, + 14671: 0x8758, + 14672: 0x875A, + 14673: 0x875B, + 14674: 0x875C, + 14675: 0x875D, + 14676: 0x875E, + 14677: 0x875F, + 14678: 0x8761, + 14679: 0x8762, + 14680: 0x8766, + 14681: 0x8767, + 14682: 0x8768, + 14683: 0x8769, + 14684: 0x876A, + 14685: 0x876B, + 14686: 0x876C, + 14687: 0x876D, + 14688: 0x876F, + 14689: 0x8771, + 14690: 0x8772, + 14691: 0x8773, + 14692: 0x8775, + 14693: 0x8777, + 14694: 0x8778, + 14695: 0x8779, + 14696: 0x877A, + 14697: 0x877F, + 14698: 0x8780, + 14699: 0x8781, + 14700: 0x8784, + 14701: 0x8786, + 14702: 0x8787, + 14703: 0x8789, + 14704: 0x878A, + 14705: 0x878C, + 14706: 0x878E, + 14707: 0x878F, + 14708: 0x8790, + 14709: 0x8791, + 14710: 0x8792, + 14711: 0x8794, + 14712: 0x8795, + 14713: 0x8796, + 14714: 0x8798, + 14715: 0x8799, + 14716: 0x879A, + 14717: 0x879B, + 14718: 0x879C, + 14719: 0x879D, + 14720: 0x879E, + 14721: 0x87A0, + 14722: 0x87A1, + 14723: 0x87A2, + 14724: 0x87A3, + 14725: 0x87A4, + 14726: 0x5DCD, + 14727: 0x5FAE, + 14728: 0x5371, + 14729: 0x97E6, + 14730: 0x8FDD, + 14731: 0x6845, + 14732: 0x56F4, + 14733: 0x552F, + 14734: 0x60DF, + 14735: 0x4E3A, + 14736: 0x6F4D, + 14737: 0x7EF4, + 14738: 0x82C7, + 14739: 0x840E, + 14740: 0x59D4, + 14741: 0x4F1F, + 14742: 0x4F2A, + 14743: 0x5C3E, + 14744: 0x7EAC, + 14745: 0x672A, + 14746: 0x851A, + 14747: 0x5473, + 14748: 0x754F, + 14749: 0x80C3, + 14750: 0x5582, + 14751: 0x9B4F, + 14752: 0x4F4D, + 14753: 0x6E2D, + 14754: 0x8C13, + 14755: 0x5C09, + 14756: 0x6170, + 14757: 0x536B, + 14758: 0x761F, + 14759: 0x6E29, + 14760: 0x868A, + 14761: 0x6587, + 14762: 0x95FB, + 14763: 0x7EB9, + 14764: 0x543B, + 14765: 0x7A33, + 14766: 0x7D0A, + 14767: 0x95EE, + 14768: 0x55E1, + 14769: 0x7FC1, + 14770: 0x74EE, + 14771: 0x631D, + 14772: 0x8717, + 14773: 0x6DA1, + 14774: 0x7A9D, + 14775: 0x6211, + 14776: 0x65A1, + 14777: 0x5367, + 14778: 0x63E1, + 14779: 0x6C83, + 14780: 0x5DEB, + 14781: 0x545C, + 14782: 0x94A8, + 14783: 0x4E4C, + 14784: 0x6C61, + 14785: 0x8BEC, + 14786: 0x5C4B, + 14787: 0x65E0, + 14788: 0x829C, + 14789: 0x68A7, + 14790: 0x543E, + 14791: 0x5434, + 14792: 0x6BCB, + 14793: 0x6B66, + 14794: 0x4E94, + 14795: 0x6342, + 14796: 0x5348, + 14797: 0x821E, + 14798: 0x4F0D, + 14799: 0x4FAE, + 14800: 0x575E, + 14801: 0x620A, + 14802: 0x96FE, + 14803: 0x6664, + 14804: 0x7269, + 14805: 0x52FF, + 14806: 0x52A1, + 14807: 0x609F, + 14808: 0x8BEF, + 14809: 0x6614, + 14810: 0x7199, + 14811: 0x6790, + 14812: 0x897F, + 14813: 0x7852, + 14814: 0x77FD, + 14815: 0x6670, + 14816: 0x563B, + 14817: 0x5438, + 14818: 0x9521, + 14819: 0x727A, + 14820: 0x87A5, + 14821: 0x87A6, + 14822: 0x87A7, + 14823: 0x87A9, + 14824: 0x87AA, + 14825: 0x87AE, + 14826: 0x87B0, + 14827: 0x87B1, + 14828: 0x87B2, + 14829: 0x87B4, + 14830: 0x87B6, + 14831: 0x87B7, + 14832: 0x87B8, + 14833: 0x87B9, + 14834: 0x87BB, + 14835: 0x87BC, + 14836: 0x87BE, + 14837: 0x87BF, + 14838: 0x87C1, + 14839: 0x87C2, + 14840: 0x87C3, + 14841: 0x87C4, + 14842: 0x87C5, + 14843: 0x87C7, + 14844: 0x87C8, + 14845: 0x87C9, + 14846: 0x87CC, + 14847: 0x87CD, + 14848: 0x87CE, + 14849: 0x87CF, + 14850: 0x87D0, + 14851: 0x87D4, + 14852: 0x87D5, + 14853: 0x87D6, + 14854: 0x87D7, + 14855: 0x87D8, + 14856: 0x87D9, + 14857: 0x87DA, + 14858: 0x87DC, + 14859: 0x87DD, + 14860: 0x87DE, + 14861: 0x87DF, + 14862: 0x87E1, + 14863: 0x87E2, + 14864: 0x87E3, + 14865: 0x87E4, + 14866: 0x87E6, + 14867: 0x87E7, + 14868: 0x87E8, + 14869: 0x87E9, + 14870: 0x87EB, + 14871: 0x87EC, + 14872: 0x87ED, + 14873: 0x87EF, + 14874: 0x87F0, + 14875: 0x87F1, + 14876: 0x87F2, + 14877: 0x87F3, + 14878: 0x87F4, + 14879: 0x87F5, + 14880: 0x87F6, + 14881: 0x87F7, + 14882: 0x87F8, + 14883: 0x87FA, + 14884: 0x87FB, + 14885: 0x87FC, + 14886: 0x87FD, + 14887: 0x87FF, + 14888: 0x8800, + 14889: 0x8801, + 14890: 0x8802, + 14891: 0x8804, + 14892: 0x8805, + 14893: 0x8806, + 14894: 0x8807, + 14895: 0x8808, + 14896: 0x8809, + 14897: 0x880B, + 14898: 0x880C, + 14899: 0x880D, + 14900: 0x880E, + 14901: 0x880F, + 14902: 0x8810, + 14903: 0x8811, + 14904: 0x8812, + 14905: 0x8814, + 14906: 0x8817, + 14907: 0x8818, + 14908: 0x8819, + 14909: 0x881A, + 14910: 0x881C, + 14911: 0x881D, + 14912: 0x881E, + 14913: 0x881F, + 14914: 0x8820, + 14915: 0x8823, + 14916: 0x7A00, + 14917: 0x606F, + 14918: 0x5E0C, + 14919: 0x6089, + 14920: 0x819D, + 14921: 0x5915, + 14922: 0x60DC, + 14923: 0x7184, + 14924: 0x70EF, + 14925: 0x6EAA, + 14926: 0x6C50, + 14927: 0x7280, + 14928: 0x6A84, + 14929: 0x88AD, + 14930: 0x5E2D, + 14931: 0x4E60, + 14932: 0x5AB3, + 14933: 0x559C, + 14934: 0x94E3, + 14935: 0x6D17, + 14936: 0x7CFB, + 14937: 0x9699, + 14938: 0x620F, + 14939: 0x7EC6, + 14940: 0x778E, + 14941: 0x867E, + 14942: 0x5323, + 14943: 0x971E, + 14944: 0x8F96, + 14945: 0x6687, + 14946: 0x5CE1, + 14947: 0x4FA0, + 14948: 0x72ED, + 14949: 0x4E0B, + 14950: 0x53A6, + 14951: 0x590F, + 14952: 0x5413, + 14953: 0x6380, + 14954: 0x9528, + 14955: 0x5148, + 14956: 0x4ED9, + 14957: 0x9C9C, + 14958: 0x7EA4, + 14959: 0x54B8, + 14960: 0x8D24, + 14961: 0x8854, + 14962: 0x8237, + 14963: 0x95F2, + 14964: 0x6D8E, + 14965: 0x5F26, + 14966: 0x5ACC, + 14967: 0x663E, + 14968: 0x9669, + 14969: 0x73B0, + 14970: 0x732E, + 14971: 0x53BF, + 14972: 0x817A, + 14973: 0x9985, + 14974: 0x7FA1, + 14975: 0x5BAA, + 14976: 0x9677, + 14977: 0x9650, + 14978: 0x7EBF, + 14979: 0x76F8, + 14980: 0x53A2, + 14981: 0x9576, + 14982: 0x9999, + 14983: 0x7BB1, + 14984: 0x8944, + 14985: 0x6E58, + 14986: 0x4E61, + 14987: 0x7FD4, + 14988: 0x7965, + 14989: 0x8BE6, + 14990: 0x60F3, + 14991: 0x54CD, + 14992: 0x4EAB, + 14993: 0x9879, + 14994: 0x5DF7, + 14995: 0x6A61, + 14996: 0x50CF, + 14997: 0x5411, + 14998: 0x8C61, + 14999: 0x8427, + 15000: 0x785D, + 15001: 0x9704, + 15002: 0x524A, + 15003: 0x54EE, + 15004: 0x56A3, + 15005: 0x9500, + 15006: 0x6D88, + 15007: 0x5BB5, + 15008: 0x6DC6, + 15009: 0x6653, + 15010: 0x8824, + 15011: 0x8825, + 15012: 0x8826, + 15013: 0x8827, + 15014: 0x8828, + 15015: 0x8829, + 15016: 0x882A, + 15017: 0x882B, + 15018: 0x882C, + 15019: 0x882D, + 15020: 0x882E, + 15021: 0x882F, + 15022: 0x8830, + 15023: 0x8831, + 15024: 0x8833, + 15025: 0x8834, + 15026: 0x8835, + 15027: 0x8836, + 15028: 0x8837, + 15029: 0x8838, + 15030: 0x883A, + 15031: 0x883B, + 15032: 0x883D, + 15033: 0x883E, + 15034: 0x883F, + 15035: 0x8841, + 15036: 0x8842, + 15037: 0x8843, + 15038: 0x8846, + 15039: 0x8847, + 15040: 0x8848, + 15041: 0x8849, + 15042: 0x884A, + 15043: 0x884B, + 15044: 0x884E, + 15045: 0x884F, + 15046: 0x8850, + 15047: 0x8851, + 15048: 0x8852, + 15049: 0x8853, + 15050: 0x8855, + 15051: 0x8856, + 15052: 0x8858, + 15053: 0x885A, + 15054: 0x885B, + 15055: 0x885C, + 15056: 0x885D, + 15057: 0x885E, + 15058: 0x885F, + 15059: 0x8860, + 15060: 0x8866, + 15061: 0x8867, + 15062: 0x886A, + 15063: 0x886D, + 15064: 0x886F, + 15065: 0x8871, + 15066: 0x8873, + 15067: 0x8874, + 15068: 0x8875, + 15069: 0x8876, + 15070: 0x8878, + 15071: 0x8879, + 15072: 0x887A, + 15073: 0x887B, + 15074: 0x887C, + 15075: 0x8880, + 15076: 0x8883, + 15077: 0x8886, + 15078: 0x8887, + 15079: 0x8889, + 15080: 0x888A, + 15081: 0x888C, + 15082: 0x888E, + 15083: 0x888F, + 15084: 0x8890, + 15085: 0x8891, + 15086: 0x8893, + 15087: 0x8894, + 15088: 0x8895, + 15089: 0x8897, + 15090: 0x8898, + 15091: 0x8899, + 15092: 0x889A, + 15093: 0x889B, + 15094: 0x889D, + 15095: 0x889E, + 15096: 0x889F, + 15097: 0x88A0, + 15098: 0x88A1, + 15099: 0x88A3, + 15100: 0x88A5, + 15101: 0x88A6, + 15102: 0x88A7, + 15103: 0x88A8, + 15104: 0x88A9, + 15105: 0x88AA, + 15106: 0x5C0F, + 15107: 0x5B5D, + 15108: 0x6821, + 15109: 0x8096, + 15110: 0x5578, + 15111: 0x7B11, + 15112: 0x6548, + 15113: 0x6954, + 15114: 0x4E9B, + 15115: 0x6B47, + 15116: 0x874E, + 15117: 0x978B, + 15118: 0x534F, + 15119: 0x631F, + 15120: 0x643A, + 15121: 0x90AA, + 15122: 0x659C, + 15123: 0x80C1, + 15124: 0x8C10, + 15125: 0x5199, + 15126: 0x68B0, + 15127: 0x5378, + 15128: 0x87F9, + 15129: 0x61C8, + 15130: 0x6CC4, + 15131: 0x6CFB, + 15132: 0x8C22, + 15133: 0x5C51, + 15134: 0x85AA, + 15135: 0x82AF, + 15136: 0x950C, + 15137: 0x6B23, + 15138: 0x8F9B, + 15139: 0x65B0, + 15140: 0x5FFB, + 15141: 0x5FC3, + 15142: 0x4FE1, + 15143: 0x8845, + 15144: 0x661F, + 15145: 0x8165, + 15146: 0x7329, + 15147: 0x60FA, + 15148: 0x5174, + 15149: 0x5211, + 15150: 0x578B, + 15151: 0x5F62, + 15152: 0x90A2, + 15153: 0x884C, + 15154: 0x9192, + 15155: 0x5E78, + 15156: 0x674F, + 15157: 0x6027, + 15158: 0x59D3, + 15159: 0x5144, + 15160: 0x51F6, + 15161: 0x80F8, + 15162: 0x5308, + 15163: 0x6C79, + 15164: 0x96C4, + 15165: 0x718A, + 15166: 0x4F11, + 15167: 0x4FEE, + 15168: 0x7F9E, + 15169: 0x673D, + 15170: 0x55C5, + 15171: 0x9508, + 15172: 0x79C0, + 15173: 0x8896, + 15174: 0x7EE3, + 15175: 0x589F, + 15176: 0x620C, + 15177: 0x9700, + 15178: 0x865A, + 15179: 0x5618, + 15180: 0x987B, + 15181: 0x5F90, + 15182: 0x8BB8, + 15183: 0x84C4, + 15184: 0x9157, + 15185: 0x53D9, + 15186: 0x65ED, + 15187: 0x5E8F, + 15188: 0x755C, + 15189: 0x6064, + 15190: 0x7D6E, + 15191: 0x5A7F, + 15192: 0x7EEA, + 15193: 0x7EED, + 15194: 0x8F69, + 15195: 0x55A7, + 15196: 0x5BA3, + 15197: 0x60AC, + 15198: 0x65CB, + 15199: 0x7384, + 15200: 0x88AC, + 15201: 0x88AE, + 15202: 0x88AF, + 15203: 0x88B0, + 15204: 0x88B2, + 15205: 0x88B3, + 15206: 0x88B4, + 15207: 0x88B5, + 15208: 0x88B6, + 15209: 0x88B8, + 15210: 0x88B9, + 15211: 0x88BA, + 15212: 0x88BB, + 15213: 0x88BD, + 15214: 0x88BE, + 15215: 0x88BF, + 15216: 0x88C0, + 15217: 0x88C3, + 15218: 0x88C4, + 15219: 0x88C7, + 15220: 0x88C8, + 15221: 0x88CA, + 15222: 0x88CB, + 15223: 0x88CC, + 15224: 0x88CD, + 15225: 0x88CF, + 15226: 0x88D0, + 15227: 0x88D1, + 15228: 0x88D3, + 15229: 0x88D6, + 15230: 0x88D7, + 15231: 0x88DA, + 15232: 0x88DB, + 15233: 0x88DC, + 15234: 0x88DD, + 15235: 0x88DE, + 15236: 0x88E0, + 15237: 0x88E1, + 15238: 0x88E6, + 15239: 0x88E7, + 15240: 0x88E9, + 15241: 0x88EA, + 15242: 0x88EB, + 15243: 0x88EC, + 15244: 0x88ED, + 15245: 0x88EE, + 15246: 0x88EF, + 15247: 0x88F2, + 15248: 0x88F5, + 15249: 0x88F6, + 15250: 0x88F7, + 15251: 0x88FA, + 15252: 0x88FB, + 15253: 0x88FD, + 15254: 0x88FF, + 15255: 0x8900, + 15256: 0x8901, + 15257: 0x8903, + 15258: 0x8904, + 15259: 0x8905, + 15260: 0x8906, + 15261: 0x8907, + 15262: 0x8908, + 15263: 0x8909, + 15264: 0x890B, + 15265: 0x890C, + 15266: 0x890D, + 15267: 0x890E, + 15268: 0x890F, + 15269: 0x8911, + 15270: 0x8914, + 15271: 0x8915, + 15272: 0x8916, + 15273: 0x8917, + 15274: 0x8918, + 15275: 0x891C, + 15276: 0x891D, + 15277: 0x891E, + 15278: 0x891F, + 15279: 0x8920, + 15280: 0x8922, + 15281: 0x8923, + 15282: 0x8924, + 15283: 0x8926, + 15284: 0x8927, + 15285: 0x8928, + 15286: 0x8929, + 15287: 0x892C, + 15288: 0x892D, + 15289: 0x892E, + 15290: 0x892F, + 15291: 0x8931, + 15292: 0x8932, + 15293: 0x8933, + 15294: 0x8935, + 15295: 0x8937, + 15296: 0x9009, + 15297: 0x7663, + 15298: 0x7729, + 15299: 0x7EDA, + 15300: 0x9774, + 15301: 0x859B, + 15302: 0x5B66, + 15303: 0x7A74, + 15304: 0x96EA, + 15305: 0x8840, + 15306: 0x52CB, + 15307: 0x718F, + 15308: 0x5FAA, + 15309: 0x65EC, + 15310: 0x8BE2, + 15311: 0x5BFB, + 15312: 0x9A6F, + 15313: 0x5DE1, + 15314: 0x6B89, + 15315: 0x6C5B, + 15316: 0x8BAD, + 15317: 0x8BAF, + 15318: 0x900A, + 15319: 0x8FC5, + 15320: 0x538B, + 15321: 0x62BC, + 15322: 0x9E26, + 15323: 0x9E2D, + 15324: 0x5440, + 15325: 0x4E2B, + 15326: 0x82BD, + 15327: 0x7259, + 15328: 0x869C, + 15329: 0x5D16, + 15330: 0x8859, + 15331: 0x6DAF, + 15332: 0x96C5, + 15333: 0x54D1, + 15334: 0x4E9A, + 15335: 0x8BB6, + 15336: 0x7109, + 15337: 0x54BD, + 15338: 0x9609, + 15339: 0x70DF, + 15340: 0x6DF9, + 15341: 0x76D0, + 15342: 0x4E25, + 15343: 0x7814, + 15344: 0x8712, + 15345: 0x5CA9, + 15346: 0x5EF6, + 15347: 0x8A00, + 15348: 0x989C, + 15349: 0x960E, + 15350: 0x708E, + 15351: 0x6CBF, + 15352: 0x5944, + 15353: 0x63A9, + 15354: 0x773C, + 15355: 0x884D, + 15356: 0x6F14, + 15357: 0x8273, + 15358: 0x5830, + 15359: 0x71D5, + 15360: 0x538C, + 15361: 0x781A, + 15362: 0x96C1, + 15363: 0x5501, + 15364: 0x5F66, + 15365: 0x7130, + 15366: 0x5BB4, + 15367: 0x8C1A, + 15368: 0x9A8C, + 15369: 0x6B83, + 15370: 0x592E, + 15371: 0x9E2F, + 15372: 0x79E7, + 15373: 0x6768, + 15374: 0x626C, + 15375: 0x4F6F, + 15376: 0x75A1, + 15377: 0x7F8A, + 15378: 0x6D0B, + 15379: 0x9633, + 15380: 0x6C27, + 15381: 0x4EF0, + 15382: 0x75D2, + 15383: 0x517B, + 15384: 0x6837, + 15385: 0x6F3E, + 15386: 0x9080, + 15387: 0x8170, + 15388: 0x5996, + 15389: 0x7476, + 15390: 0x8938, + 15391: 0x8939, + 15392: 0x893A, + 15393: 0x893B, + 15394: 0x893C, + 15395: 0x893D, + 15396: 0x893E, + 15397: 0x893F, + 15398: 0x8940, + 15399: 0x8942, + 15400: 0x8943, + 15401: 0x8945, + 15402: 0x8946, + 15403: 0x8947, + 15404: 0x8948, + 15405: 0x8949, + 15406: 0x894A, + 15407: 0x894B, + 15408: 0x894C, + 15409: 0x894D, + 15410: 0x894E, + 15411: 0x894F, + 15412: 0x8950, + 15413: 0x8951, + 15414: 0x8952, + 15415: 0x8953, + 15416: 0x8954, + 15417: 0x8955, + 15418: 0x8956, + 15419: 0x8957, + 15420: 0x8958, + 15421: 0x8959, + 15422: 0x895A, + 15423: 0x895B, + 15424: 0x895C, + 15425: 0x895D, + 15426: 0x8960, + 15427: 0x8961, + 15428: 0x8962, + 15429: 0x8963, + 15430: 0x8964, + 15431: 0x8965, + 15432: 0x8967, + 15433: 0x8968, + 15434: 0x8969, + 15435: 0x896A, + 15436: 0x896B, + 15437: 0x896C, + 15438: 0x896D, + 15439: 0x896E, + 15440: 0x896F, + 15441: 0x8970, + 15442: 0x8971, + 15443: 0x8972, + 15444: 0x8973, + 15445: 0x8974, + 15446: 0x8975, + 15447: 0x8976, + 15448: 0x8977, + 15449: 0x8978, + 15450: 0x8979, + 15451: 0x897A, + 15452: 0x897C, + 15453: 0x897D, + 15454: 0x897E, + 15455: 0x8980, + 15456: 0x8982, + 15457: 0x8984, + 15458: 0x8985, + 15459: 0x8987, + 15460: 0x8988, + 15461: 0x8989, + 15462: 0x898A, + 15463: 0x898B, + 15464: 0x898C, + 15465: 0x898D, + 15466: 0x898E, + 15467: 0x898F, + 15468: 0x8990, + 15469: 0x8991, + 15470: 0x8992, + 15471: 0x8993, + 15472: 0x8994, + 15473: 0x8995, + 15474: 0x8996, + 15475: 0x8997, + 15476: 0x8998, + 15477: 0x8999, + 15478: 0x899A, + 15479: 0x899B, + 15480: 0x899C, + 15481: 0x899D, + 15482: 0x899E, + 15483: 0x899F, + 15484: 0x89A0, + 15485: 0x89A1, + 15486: 0x6447, + 15487: 0x5C27, + 15488: 0x9065, + 15489: 0x7A91, + 15490: 0x8C23, + 15491: 0x59DA, + 15492: 0x54AC, + 15493: 0x8200, + 15494: 0x836F, + 15495: 0x8981, + 15496: 0x8000, + 15497: 0x6930, + 15498: 0x564E, + 15499: 0x8036, + 15500: 0x7237, + 15501: 0x91CE, + 15502: 0x51B6, + 15503: 0x4E5F, + 15504: 0x9875, + 15505: 0x6396, + 15506: 0x4E1A, + 15507: 0x53F6, + 15508: 0x66F3, + 15509: 0x814B, + 15510: 0x591C, + 15511: 0x6DB2, + 15512: 0x4E00, + 15513: 0x58F9, + 15514: 0x533B, + 15515: 0x63D6, + 15516: 0x94F1, + 15517: 0x4F9D, + 15518: 0x4F0A, + 15519: 0x8863, + 15520: 0x9890, + 15521: 0x5937, + 15522: 0x9057, + 15523: 0x79FB, + 15524: 0x4EEA, + 15525: 0x80F0, + 15526: 0x7591, + 15527: 0x6C82, + 15528: 0x5B9C, + 15529: 0x59E8, + 15530: 0x5F5D, + 15531: 0x6905, + 15532: 0x8681, + 15533: 0x501A, + 15534: 0x5DF2, + 15535: 0x4E59, + 15536: 0x77E3, + 15537: 0x4EE5, + 15538: 0x827A, + 15539: 0x6291, + 15540: 0x6613, + 15541: 0x9091, + 15542: 0x5C79, + 15543: 0x4EBF, + 15544: 0x5F79, + 15545: 0x81C6, + 15546: 0x9038, + 15547: 0x8084, + 15548: 0x75AB, + 15549: 0x4EA6, + 15550: 0x88D4, + 15551: 0x610F, + 15552: 0x6BC5, + 15553: 0x5FC6, + 15554: 0x4E49, + 15555: 0x76CA, + 15556: 0x6EA2, + 15557: 0x8BE3, + 15558: 0x8BAE, + 15559: 0x8C0A, + 15560: 0x8BD1, + 15561: 0x5F02, + 15562: 0x7FFC, + 15563: 0x7FCC, + 15564: 0x7ECE, + 15565: 0x8335, + 15566: 0x836B, + 15567: 0x56E0, + 15568: 0x6BB7, + 15569: 0x97F3, + 15570: 0x9634, + 15571: 0x59FB, + 15572: 0x541F, + 15573: 0x94F6, + 15574: 0x6DEB, + 15575: 0x5BC5, + 15576: 0x996E, + 15577: 0x5C39, + 15578: 0x5F15, + 15579: 0x9690, + 15580: 0x89A2, + 15581: 0x89A3, + 15582: 0x89A4, + 15583: 0x89A5, + 15584: 0x89A6, + 15585: 0x89A7, + 15586: 0x89A8, + 15587: 0x89A9, + 15588: 0x89AA, + 15589: 0x89AB, + 15590: 0x89AC, + 15591: 0x89AD, + 15592: 0x89AE, + 15593: 0x89AF, + 15594: 0x89B0, + 15595: 0x89B1, + 15596: 0x89B2, + 15597: 0x89B3, + 15598: 0x89B4, + 15599: 0x89B5, + 15600: 0x89B6, + 15601: 0x89B7, + 15602: 0x89B8, + 15603: 0x89B9, + 15604: 0x89BA, + 15605: 0x89BB, + 15606: 0x89BC, + 15607: 0x89BD, + 15608: 0x89BE, + 15609: 0x89BF, + 15610: 0x89C0, + 15611: 0x89C3, + 15612: 0x89CD, + 15613: 0x89D3, + 15614: 0x89D4, + 15615: 0x89D5, + 15616: 0x89D7, + 15617: 0x89D8, + 15618: 0x89D9, + 15619: 0x89DB, + 15620: 0x89DD, + 15621: 0x89DF, + 15622: 0x89E0, + 15623: 0x89E1, + 15624: 0x89E2, + 15625: 0x89E4, + 15626: 0x89E7, + 15627: 0x89E8, + 15628: 0x89E9, + 15629: 0x89EA, + 15630: 0x89EC, + 15631: 0x89ED, + 15632: 0x89EE, + 15633: 0x89F0, + 15634: 0x89F1, + 15635: 0x89F2, + 15636: 0x89F4, + 15637: 0x89F5, + 15638: 0x89F6, + 15639: 0x89F7, + 15640: 0x89F8, + 15641: 0x89F9, + 15642: 0x89FA, + 15643: 0x89FB, + 15644: 0x89FC, + 15645: 0x89FD, + 15646: 0x89FE, + 15647: 0x89FF, + 15648: 0x8A01, + 15649: 0x8A02, + 15650: 0x8A03, + 15651: 0x8A04, + 15652: 0x8A05, + 15653: 0x8A06, + 15654: 0x8A08, + 15655: 0x8A09, + 15656: 0x8A0A, + 15657: 0x8A0B, + 15658: 0x8A0C, + 15659: 0x8A0D, + 15660: 0x8A0E, + 15661: 0x8A0F, + 15662: 0x8A10, + 15663: 0x8A11, + 15664: 0x8A12, + 15665: 0x8A13, + 15666: 0x8A14, + 15667: 0x8A15, + 15668: 0x8A16, + 15669: 0x8A17, + 15670: 0x8A18, + 15671: 0x8A19, + 15672: 0x8A1A, + 15673: 0x8A1B, + 15674: 0x8A1C, + 15675: 0x8A1D, + 15676: 0x5370, + 15677: 0x82F1, + 15678: 0x6A31, + 15679: 0x5A74, + 15680: 0x9E70, + 15681: 0x5E94, + 15682: 0x7F28, + 15683: 0x83B9, + 15684: 0x8424, + 15685: 0x8425, + 15686: 0x8367, + 15687: 0x8747, + 15688: 0x8FCE, + 15689: 0x8D62, + 15690: 0x76C8, + 15691: 0x5F71, + 15692: 0x9896, + 15693: 0x786C, + 15694: 0x6620, + 15695: 0x54DF, + 15696: 0x62E5, + 15697: 0x4F63, + 15698: 0x81C3, + 15699: 0x75C8, + 15700: 0x5EB8, + 15701: 0x96CD, + 15702: 0x8E0A, + 15703: 0x86F9, + 15704: 0x548F, + 15705: 0x6CF3, + 15706: 0x6D8C, + 15707: 0x6C38, + 15708: 0x607F, + 15709: 0x52C7, + 15710: 0x7528, + 15711: 0x5E7D, + 15712: 0x4F18, + 15713: 0x60A0, + 15714: 0x5FE7, + 15715: 0x5C24, + 15716: 0x7531, + 15717: 0x90AE, + 15718: 0x94C0, + 15719: 0x72B9, + 15720: 0x6CB9, + 15721: 0x6E38, + 15722: 0x9149, + 15723: 0x6709, + 15724: 0x53CB, + 15725: 0x53F3, + 15726: 0x4F51, + 15727: 0x91C9, + 15728: 0x8BF1, + 15729: 0x53C8, + 15730: 0x5E7C, + 15731: 0x8FC2, + 15732: 0x6DE4, + 15733: 0x4E8E, + 15734: 0x76C2, + 15735: 0x6986, + 15736: 0x865E, + 15737: 0x611A, + 15738: 0x8206, + 15739: 0x4F59, + 15740: 0x4FDE, + 15741: 0x903E, + 15742: 0x9C7C, + 15743: 0x6109, + 15744: 0x6E1D, + 15745: 0x6E14, + 15746: 0x9685, + 15747: 0x4E88, + 15748: 0x5A31, + 15749: 0x96E8, + 15750: 0x4E0E, + 15751: 0x5C7F, + 15752: 0x79B9, + 15753: 0x5B87, + 15754: 0x8BED, + 15755: 0x7FBD, + 15756: 0x7389, + 15757: 0x57DF, + 15758: 0x828B, + 15759: 0x90C1, + 15760: 0x5401, + 15761: 0x9047, + 15762: 0x55BB, + 15763: 0x5CEA, + 15764: 0x5FA1, + 15765: 0x6108, + 15766: 0x6B32, + 15767: 0x72F1, + 15768: 0x80B2, + 15769: 0x8A89, + 15770: 0x8A1E, + 15771: 0x8A1F, + 15772: 0x8A20, + 15773: 0x8A21, + 15774: 0x8A22, + 15775: 0x8A23, + 15776: 0x8A24, + 15777: 0x8A25, + 15778: 0x8A26, + 15779: 0x8A27, + 15780: 0x8A28, + 15781: 0x8A29, + 15782: 0x8A2A, + 15783: 0x8A2B, + 15784: 0x8A2C, + 15785: 0x8A2D, + 15786: 0x8A2E, + 15787: 0x8A2F, + 15788: 0x8A30, + 15789: 0x8A31, + 15790: 0x8A32, + 15791: 0x8A33, + 15792: 0x8A34, + 15793: 0x8A35, + 15794: 0x8A36, + 15795: 0x8A37, + 15796: 0x8A38, + 15797: 0x8A39, + 15798: 0x8A3A, + 15799: 0x8A3B, + 15800: 0x8A3C, + 15801: 0x8A3D, + 15802: 0x8A3F, + 15803: 0x8A40, + 15804: 0x8A41, + 15805: 0x8A42, + 15806: 0x8A43, + 15807: 0x8A44, + 15808: 0x8A45, + 15809: 0x8A46, + 15810: 0x8A47, + 15811: 0x8A49, + 15812: 0x8A4A, + 15813: 0x8A4B, + 15814: 0x8A4C, + 15815: 0x8A4D, + 15816: 0x8A4E, + 15817: 0x8A4F, + 15818: 0x8A50, + 15819: 0x8A51, + 15820: 0x8A52, + 15821: 0x8A53, + 15822: 0x8A54, + 15823: 0x8A55, + 15824: 0x8A56, + 15825: 0x8A57, + 15826: 0x8A58, + 15827: 0x8A59, + 15828: 0x8A5A, + 15829: 0x8A5B, + 15830: 0x8A5C, + 15831: 0x8A5D, + 15832: 0x8A5E, + 15833: 0x8A5F, + 15834: 0x8A60, + 15835: 0x8A61, + 15836: 0x8A62, + 15837: 0x8A63, + 15838: 0x8A64, + 15839: 0x8A65, + 15840: 0x8A66, + 15841: 0x8A67, + 15842: 0x8A68, + 15843: 0x8A69, + 15844: 0x8A6A, + 15845: 0x8A6B, + 15846: 0x8A6C, + 15847: 0x8A6D, + 15848: 0x8A6E, + 15849: 0x8A6F, + 15850: 0x8A70, + 15851: 0x8A71, + 15852: 0x8A72, + 15853: 0x8A73, + 15854: 0x8A74, + 15855: 0x8A75, + 15856: 0x8A76, + 15857: 0x8A77, + 15858: 0x8A78, + 15859: 0x8A7A, + 15860: 0x8A7B, + 15861: 0x8A7C, + 15862: 0x8A7D, + 15863: 0x8A7E, + 15864: 0x8A7F, + 15865: 0x8A80, + 15866: 0x6D74, + 15867: 0x5BD3, + 15868: 0x88D5, + 15869: 0x9884, + 15870: 0x8C6B, + 15871: 0x9A6D, + 15872: 0x9E33, + 15873: 0x6E0A, + 15874: 0x51A4, + 15875: 0x5143, + 15876: 0x57A3, + 15877: 0x8881, + 15878: 0x539F, + 15879: 0x63F4, + 15880: 0x8F95, + 15881: 0x56ED, + 15882: 0x5458, + 15883: 0x5706, + 15884: 0x733F, + 15885: 0x6E90, + 15886: 0x7F18, + 15887: 0x8FDC, + 15888: 0x82D1, + 15889: 0x613F, + 15890: 0x6028, + 15891: 0x9662, + 15892: 0x66F0, + 15893: 0x7EA6, + 15894: 0x8D8A, + 15895: 0x8DC3, + 15896: 0x94A5, + 15897: 0x5CB3, + 15898: 0x7CA4, + 15899: 0x6708, + 15900: 0x60A6, + 15901: 0x9605, + 15902: 0x8018, + 15903: 0x4E91, + 15904: 0x90E7, + 15905: 0x5300, + 15906: 0x9668, + 15907: 0x5141, + 15908: 0x8FD0, + 15909: 0x8574, + 15910: 0x915D, + 15911: 0x6655, + 15912: 0x97F5, + 15913: 0x5B55, + 15914: 0x531D, + 15915: 0x7838, + 15916: 0x6742, + 15917: 0x683D, + 15918: 0x54C9, + 15919: 0x707E, + 15920: 0x5BB0, + 15921: 0x8F7D, + 15922: 0x518D, + 15923: 0x5728, + 15924: 0x54B1, + 15925: 0x6512, + 15926: 0x6682, + 15927: 0x8D5E, + 15928: 0x8D43, + 15929: 0x810F, + 15930: 0x846C, + 15931: 0x906D, + 15932: 0x7CDF, + 15933: 0x51FF, + 15934: 0x85FB, + 15935: 0x67A3, + 15936: 0x65E9, + 15937: 0x6FA1, + 15938: 0x86A4, + 15939: 0x8E81, + 15940: 0x566A, + 15941: 0x9020, + 15942: 0x7682, + 15943: 0x7076, + 15944: 0x71E5, + 15945: 0x8D23, + 15946: 0x62E9, + 15947: 0x5219, + 15948: 0x6CFD, + 15949: 0x8D3C, + 15950: 0x600E, + 15951: 0x589E, + 15952: 0x618E, + 15953: 0x66FE, + 15954: 0x8D60, + 15955: 0x624E, + 15956: 0x55B3, + 15957: 0x6E23, + 15958: 0x672D, + 15959: 0x8F67, + 15960: 0x8A81, + 15961: 0x8A82, + 15962: 0x8A83, + 15963: 0x8A84, + 15964: 0x8A85, + 15965: 0x8A86, + 15966: 0x8A87, + 15967: 0x8A88, + 15968: 0x8A8B, + 15969: 0x8A8C, + 15970: 0x8A8D, + 15971: 0x8A8E, + 15972: 0x8A8F, + 15973: 0x8A90, + 15974: 0x8A91, + 15975: 0x8A92, + 15976: 0x8A94, + 15977: 0x8A95, + 15978: 0x8A96, + 15979: 0x8A97, + 15980: 0x8A98, + 15981: 0x8A99, + 15982: 0x8A9A, + 15983: 0x8A9B, + 15984: 0x8A9C, + 15985: 0x8A9D, + 15986: 0x8A9E, + 15987: 0x8A9F, + 15988: 0x8AA0, + 15989: 0x8AA1, + 15990: 0x8AA2, + 15991: 0x8AA3, + 15992: 0x8AA4, + 15993: 0x8AA5, + 15994: 0x8AA6, + 15995: 0x8AA7, + 15996: 0x8AA8, + 15997: 0x8AA9, + 15998: 0x8AAA, + 15999: 0x8AAB, + 16000: 0x8AAC, + 16001: 0x8AAD, + 16002: 0x8AAE, + 16003: 0x8AAF, + 16004: 0x8AB0, + 16005: 0x8AB1, + 16006: 0x8AB2, + 16007: 0x8AB3, + 16008: 0x8AB4, + 16009: 0x8AB5, + 16010: 0x8AB6, + 16011: 0x8AB7, + 16012: 0x8AB8, + 16013: 0x8AB9, + 16014: 0x8ABA, + 16015: 0x8ABB, + 16016: 0x8ABC, + 16017: 0x8ABD, + 16018: 0x8ABE, + 16019: 0x8ABF, + 16020: 0x8AC0, + 16021: 0x8AC1, + 16022: 0x8AC2, + 16023: 0x8AC3, + 16024: 0x8AC4, + 16025: 0x8AC5, + 16026: 0x8AC6, + 16027: 0x8AC7, + 16028: 0x8AC8, + 16029: 0x8AC9, + 16030: 0x8ACA, + 16031: 0x8ACB, + 16032: 0x8ACC, + 16033: 0x8ACD, + 16034: 0x8ACE, + 16035: 0x8ACF, + 16036: 0x8AD0, + 16037: 0x8AD1, + 16038: 0x8AD2, + 16039: 0x8AD3, + 16040: 0x8AD4, + 16041: 0x8AD5, + 16042: 0x8AD6, + 16043: 0x8AD7, + 16044: 0x8AD8, + 16045: 0x8AD9, + 16046: 0x8ADA, + 16047: 0x8ADB, + 16048: 0x8ADC, + 16049: 0x8ADD, + 16050: 0x8ADE, + 16051: 0x8ADF, + 16052: 0x8AE0, + 16053: 0x8AE1, + 16054: 0x8AE2, + 16055: 0x8AE3, + 16056: 0x94E1, + 16057: 0x95F8, + 16058: 0x7728, + 16059: 0x6805, + 16060: 0x69A8, + 16061: 0x548B, + 16062: 0x4E4D, + 16063: 0x70B8, + 16064: 0x8BC8, + 16065: 0x6458, + 16066: 0x658B, + 16067: 0x5B85, + 16068: 0x7A84, + 16069: 0x503A, + 16070: 0x5BE8, + 16071: 0x77BB, + 16072: 0x6BE1, + 16073: 0x8A79, + 16074: 0x7C98, + 16075: 0x6CBE, + 16076: 0x76CF, + 16077: 0x65A9, + 16078: 0x8F97, + 16079: 0x5D2D, + 16080: 0x5C55, + 16081: 0x8638, + 16082: 0x6808, + 16083: 0x5360, + 16084: 0x6218, + 16085: 0x7AD9, + 16086: 0x6E5B, + 16087: 0x7EFD, + 16088: 0x6A1F, + 16089: 0x7AE0, + 16090: 0x5F70, + 16091: 0x6F33, + 16092: 0x5F20, + 16093: 0x638C, + 16094: 0x6DA8, + 16095: 0x6756, + 16096: 0x4E08, + 16097: 0x5E10, + 16098: 0x8D26, + 16099: 0x4ED7, + 16100: 0x80C0, + 16101: 0x7634, + 16102: 0x969C, + 16103: 0x62DB, + 16104: 0x662D, + 16105: 0x627E, + 16106: 0x6CBC, + 16107: 0x8D75, + 16108: 0x7167, + 16109: 0x7F69, + 16110: 0x5146, + 16111: 0x8087, + 16112: 0x53EC, + 16113: 0x906E, + 16114: 0x6298, + 16115: 0x54F2, + 16116: 0x86F0, + 16117: 0x8F99, + 16118: 0x8005, + 16119: 0x9517, + 16120: 0x8517, + 16121: 0x8FD9, + 16122: 0x6D59, + 16123: 0x73CD, + 16124: 0x659F, + 16125: 0x771F, + 16126: 0x7504, + 16127: 0x7827, + 16128: 0x81FB, + 16129: 0x8D1E, + 16130: 0x9488, + 16131: 0x4FA6, + 16132: 0x6795, + 16133: 0x75B9, + 16134: 0x8BCA, + 16135: 0x9707, + 16136: 0x632F, + 16137: 0x9547, + 16138: 0x9635, + 16139: 0x84B8, + 16140: 0x6323, + 16141: 0x7741, + 16142: 0x5F81, + 16143: 0x72F0, + 16144: 0x4E89, + 16145: 0x6014, + 16146: 0x6574, + 16147: 0x62EF, + 16148: 0x6B63, + 16149: 0x653F, + 16150: 0x8AE4, + 16151: 0x8AE5, + 16152: 0x8AE6, + 16153: 0x8AE7, + 16154: 0x8AE8, + 16155: 0x8AE9, + 16156: 0x8AEA, + 16157: 0x8AEB, + 16158: 0x8AEC, + 16159: 0x8AED, + 16160: 0x8AEE, + 16161: 0x8AEF, + 16162: 0x8AF0, + 16163: 0x8AF1, + 16164: 0x8AF2, + 16165: 0x8AF3, + 16166: 0x8AF4, + 16167: 0x8AF5, + 16168: 0x8AF6, + 16169: 0x8AF7, + 16170: 0x8AF8, + 16171: 0x8AF9, + 16172: 0x8AFA, + 16173: 0x8AFB, + 16174: 0x8AFC, + 16175: 0x8AFD, + 16176: 0x8AFE, + 16177: 0x8AFF, + 16178: 0x8B00, + 16179: 0x8B01, + 16180: 0x8B02, + 16181: 0x8B03, + 16182: 0x8B04, + 16183: 0x8B05, + 16184: 0x8B06, + 16185: 0x8B08, + 16186: 0x8B09, + 16187: 0x8B0A, + 16188: 0x8B0B, + 16189: 0x8B0C, + 16190: 0x8B0D, + 16191: 0x8B0E, + 16192: 0x8B0F, + 16193: 0x8B10, + 16194: 0x8B11, + 16195: 0x8B12, + 16196: 0x8B13, + 16197: 0x8B14, + 16198: 0x8B15, + 16199: 0x8B16, + 16200: 0x8B17, + 16201: 0x8B18, + 16202: 0x8B19, + 16203: 0x8B1A, + 16204: 0x8B1B, + 16205: 0x8B1C, + 16206: 0x8B1D, + 16207: 0x8B1E, + 16208: 0x8B1F, + 16209: 0x8B20, + 16210: 0x8B21, + 16211: 0x8B22, + 16212: 0x8B23, + 16213: 0x8B24, + 16214: 0x8B25, + 16215: 0x8B27, + 16216: 0x8B28, + 16217: 0x8B29, + 16218: 0x8B2A, + 16219: 0x8B2B, + 16220: 0x8B2C, + 16221: 0x8B2D, + 16222: 0x8B2E, + 16223: 0x8B2F, + 16224: 0x8B30, + 16225: 0x8B31, + 16226: 0x8B32, + 16227: 0x8B33, + 16228: 0x8B34, + 16229: 0x8B35, + 16230: 0x8B36, + 16231: 0x8B37, + 16232: 0x8B38, + 16233: 0x8B39, + 16234: 0x8B3A, + 16235: 0x8B3B, + 16236: 0x8B3C, + 16237: 0x8B3D, + 16238: 0x8B3E, + 16239: 0x8B3F, + 16240: 0x8B40, + 16241: 0x8B41, + 16242: 0x8B42, + 16243: 0x8B43, + 16244: 0x8B44, + 16245: 0x8B45, + 16246: 0x5E27, + 16247: 0x75C7, + 16248: 0x90D1, + 16249: 0x8BC1, + 16250: 0x829D, + 16251: 0x679D, + 16252: 0x652F, + 16253: 0x5431, + 16254: 0x8718, + 16255: 0x77E5, + 16256: 0x80A2, + 16257: 0x8102, + 16258: 0x6C41, + 16259: 0x4E4B, + 16260: 0x7EC7, + 16261: 0x804C, + 16262: 0x76F4, + 16263: 0x690D, + 16264: 0x6B96, + 16265: 0x6267, + 16266: 0x503C, + 16267: 0x4F84, + 16268: 0x5740, + 16269: 0x6307, + 16270: 0x6B62, + 16271: 0x8DBE, + 16272: 0x53EA, + 16273: 0x65E8, + 16274: 0x7EB8, + 16275: 0x5FD7, + 16276: 0x631A, + 16277: 0x63B7, + 16278: 0x81F3, + 16279: 0x81F4, + 16280: 0x7F6E, + 16281: 0x5E1C, + 16282: 0x5CD9, + 16283: 0x5236, + 16284: 0x667A, + 16285: 0x79E9, + 16286: 0x7A1A, + 16287: 0x8D28, + 16288: 0x7099, + 16289: 0x75D4, + 16290: 0x6EDE, + 16291: 0x6CBB, + 16292: 0x7A92, + 16293: 0x4E2D, + 16294: 0x76C5, + 16295: 0x5FE0, + 16296: 0x949F, + 16297: 0x8877, + 16298: 0x7EC8, + 16299: 0x79CD, + 16300: 0x80BF, + 16301: 0x91CD, + 16302: 0x4EF2, + 16303: 0x4F17, + 16304: 0x821F, + 16305: 0x5468, + 16306: 0x5DDE, + 16307: 0x6D32, + 16308: 0x8BCC, + 16309: 0x7CA5, + 16310: 0x8F74, + 16311: 0x8098, + 16312: 0x5E1A, + 16313: 0x5492, + 16314: 0x76B1, + 16315: 0x5B99, + 16316: 0x663C, + 16317: 0x9AA4, + 16318: 0x73E0, + 16319: 0x682A, + 16320: 0x86DB, + 16321: 0x6731, + 16322: 0x732A, + 16323: 0x8BF8, + 16324: 0x8BDB, + 16325: 0x9010, + 16326: 0x7AF9, + 16327: 0x70DB, + 16328: 0x716E, + 16329: 0x62C4, + 16330: 0x77A9, + 16331: 0x5631, + 16332: 0x4E3B, + 16333: 0x8457, + 16334: 0x67F1, + 16335: 0x52A9, + 16336: 0x86C0, + 16337: 0x8D2E, + 16338: 0x94F8, + 16339: 0x7B51, + 16340: 0x8B46, + 16341: 0x8B47, + 16342: 0x8B48, + 16343: 0x8B49, + 16344: 0x8B4A, + 16345: 0x8B4B, + 16346: 0x8B4C, + 16347: 0x8B4D, + 16348: 0x8B4E, + 16349: 0x8B4F, + 16350: 0x8B50, + 16351: 0x8B51, + 16352: 0x8B52, + 16353: 0x8B53, + 16354: 0x8B54, + 16355: 0x8B55, + 16356: 0x8B56, + 16357: 0x8B57, + 16358: 0x8B58, + 16359: 0x8B59, + 16360: 0x8B5A, + 16361: 0x8B5B, + 16362: 0x8B5C, + 16363: 0x8B5D, + 16364: 0x8B5E, + 16365: 0x8B5F, + 16366: 0x8B60, + 16367: 0x8B61, + 16368: 0x8B62, + 16369: 0x8B63, + 16370: 0x8B64, + 16371: 0x8B65, + 16372: 0x8B67, + 16373: 0x8B68, + 16374: 0x8B69, + 16375: 0x8B6A, + 16376: 0x8B6B, + 16377: 0x8B6D, + 16378: 0x8B6E, + 16379: 0x8B6F, + 16380: 0x8B70, + 16381: 0x8B71, + 16382: 0x8B72, + 16383: 0x8B73, + 16384: 0x8B74, + 16385: 0x8B75, + 16386: 0x8B76, + 16387: 0x8B77, + 16388: 0x8B78, + 16389: 0x8B79, + 16390: 0x8B7A, + 16391: 0x8B7B, + 16392: 0x8B7C, + 16393: 0x8B7D, + 16394: 0x8B7E, + 16395: 0x8B7F, + 16396: 0x8B80, + 16397: 0x8B81, + 16398: 0x8B82, + 16399: 0x8B83, + 16400: 0x8B84, + 16401: 0x8B85, + 16402: 0x8B86, + 16403: 0x8B87, + 16404: 0x8B88, + 16405: 0x8B89, + 16406: 0x8B8A, + 16407: 0x8B8B, + 16408: 0x8B8C, + 16409: 0x8B8D, + 16410: 0x8B8E, + 16411: 0x8B8F, + 16412: 0x8B90, + 16413: 0x8B91, + 16414: 0x8B92, + 16415: 0x8B93, + 16416: 0x8B94, + 16417: 0x8B95, + 16418: 0x8B96, + 16419: 0x8B97, + 16420: 0x8B98, + 16421: 0x8B99, + 16422: 0x8B9A, + 16423: 0x8B9B, + 16424: 0x8B9C, + 16425: 0x8B9D, + 16426: 0x8B9E, + 16427: 0x8B9F, + 16428: 0x8BAC, + 16429: 0x8BB1, + 16430: 0x8BBB, + 16431: 0x8BC7, + 16432: 0x8BD0, + 16433: 0x8BEA, + 16434: 0x8C09, + 16435: 0x8C1E, + 16436: 0x4F4F, + 16437: 0x6CE8, + 16438: 0x795D, + 16439: 0x9A7B, + 16440: 0x6293, + 16441: 0x722A, + 16442: 0x62FD, + 16443: 0x4E13, + 16444: 0x7816, + 16445: 0x8F6C, + 16446: 0x64B0, + 16447: 0x8D5A, + 16448: 0x7BC6, + 16449: 0x6869, + 16450: 0x5E84, + 16451: 0x88C5, + 16452: 0x5986, + 16453: 0x649E, + 16454: 0x58EE, + 16455: 0x72B6, + 16456: 0x690E, + 16457: 0x9525, + 16458: 0x8FFD, + 16459: 0x8D58, + 16460: 0x5760, + 16461: 0x7F00, + 16462: 0x8C06, + 16463: 0x51C6, + 16464: 0x6349, + 16465: 0x62D9, + 16466: 0x5353, + 16467: 0x684C, + 16468: 0x7422, + 16469: 0x8301, + 16470: 0x914C, + 16471: 0x5544, + 16472: 0x7740, + 16473: 0x707C, + 16474: 0x6D4A, + 16475: 0x5179, + 16476: 0x54A8, + 16477: 0x8D44, + 16478: 0x59FF, + 16479: 0x6ECB, + 16480: 0x6DC4, + 16481: 0x5B5C, + 16482: 0x7D2B, + 16483: 0x4ED4, + 16484: 0x7C7D, + 16485: 0x6ED3, + 16486: 0x5B50, + 16487: 0x81EA, + 16488: 0x6E0D, + 16489: 0x5B57, + 16490: 0x9B03, + 16491: 0x68D5, + 16492: 0x8E2A, + 16493: 0x5B97, + 16494: 0x7EFC, + 16495: 0x603B, + 16496: 0x7EB5, + 16497: 0x90B9, + 16498: 0x8D70, + 16499: 0x594F, + 16500: 0x63CD, + 16501: 0x79DF, + 16502: 0x8DB3, + 16503: 0x5352, + 16504: 0x65CF, + 16505: 0x7956, + 16506: 0x8BC5, + 16507: 0x963B, + 16508: 0x7EC4, + 16509: 0x94BB, + 16510: 0x7E82, + 16511: 0x5634, + 16512: 0x9189, + 16513: 0x6700, + 16514: 0x7F6A, + 16515: 0x5C0A, + 16516: 0x9075, + 16517: 0x6628, + 16518: 0x5DE6, + 16519: 0x4F50, + 16520: 0x67DE, + 16521: 0x505A, + 16522: 0x4F5C, + 16523: 0x5750, + 16524: 0x5EA7, + 16530: 0x8C38, + 16531: 0x8C39, + 16532: 0x8C3A, + 16533: 0x8C3B, + 16534: 0x8C3C, + 16535: 0x8C3D, + 16536: 0x8C3E, + 16537: 0x8C3F, + 16538: 0x8C40, + 16539: 0x8C42, + 16540: 0x8C43, + 16541: 0x8C44, + 16542: 0x8C45, + 16543: 0x8C48, + 16544: 0x8C4A, + 16545: 0x8C4B, + 16546: 0x8C4D, + 16547: 0x8C4E, + 16548: 0x8C4F, + 16549: 0x8C50, + 16550: 0x8C51, + 16551: 0x8C52, + 16552: 0x8C53, + 16553: 0x8C54, + 16554: 0x8C56, + 16555: 0x8C57, + 16556: 0x8C58, + 16557: 0x8C59, + 16558: 0x8C5B, + 16559: 0x8C5C, + 16560: 0x8C5D, + 16561: 0x8C5E, + 16562: 0x8C5F, + 16563: 0x8C60, + 16564: 0x8C63, + 16565: 0x8C64, + 16566: 0x8C65, + 16567: 0x8C66, + 16568: 0x8C67, + 16569: 0x8C68, + 16570: 0x8C69, + 16571: 0x8C6C, + 16572: 0x8C6D, + 16573: 0x8C6E, + 16574: 0x8C6F, + 16575: 0x8C70, + 16576: 0x8C71, + 16577: 0x8C72, + 16578: 0x8C74, + 16579: 0x8C75, + 16580: 0x8C76, + 16581: 0x8C77, + 16582: 0x8C7B, + 16583: 0x8C7C, + 16584: 0x8C7D, + 16585: 0x8C7E, + 16586: 0x8C7F, + 16587: 0x8C80, + 16588: 0x8C81, + 16589: 0x8C83, + 16590: 0x8C84, + 16591: 0x8C86, + 16592: 0x8C87, + 16593: 0x8C88, + 16594: 0x8C8B, + 16595: 0x8C8D, + 16596: 0x8C8E, + 16597: 0x8C8F, + 16598: 0x8C90, + 16599: 0x8C91, + 16600: 0x8C92, + 16601: 0x8C93, + 16602: 0x8C95, + 16603: 0x8C96, + 16604: 0x8C97, + 16605: 0x8C99, + 16606: 0x8C9A, + 16607: 0x8C9B, + 16608: 0x8C9C, + 16609: 0x8C9D, + 16610: 0x8C9E, + 16611: 0x8C9F, + 16612: 0x8CA0, + 16613: 0x8CA1, + 16614: 0x8CA2, + 16615: 0x8CA3, + 16616: 0x8CA4, + 16617: 0x8CA5, + 16618: 0x8CA6, + 16619: 0x8CA7, + 16620: 0x8CA8, + 16621: 0x8CA9, + 16622: 0x8CAA, + 16623: 0x8CAB, + 16624: 0x8CAC, + 16625: 0x8CAD, + 16626: 0x4E8D, + 16627: 0x4E0C, + 16628: 0x5140, + 16629: 0x4E10, + 16630: 0x5EFF, + 16631: 0x5345, + 16632: 0x4E15, + 16633: 0x4E98, + 16634: 0x4E1E, + 16635: 0x9B32, + 16636: 0x5B6C, + 16637: 0x5669, + 16638: 0x4E28, + 16639: 0x79BA, + 16640: 0x4E3F, + 16641: 0x5315, + 16642: 0x4E47, + 16643: 0x592D, + 16644: 0x723B, + 16645: 0x536E, + 16646: 0x6C10, + 16647: 0x56DF, + 16648: 0x80E4, + 16649: 0x9997, + 16650: 0x6BD3, + 16651: 0x777E, + 16652: 0x9F17, + 16653: 0x4E36, + 16654: 0x4E9F, + 16655: 0x9F10, + 16656: 0x4E5C, + 16657: 0x4E69, + 16658: 0x4E93, + 16659: 0x8288, + 16660: 0x5B5B, + 16661: 0x556C, + 16662: 0x560F, + 16663: 0x4EC4, + 16664: 0x538D, + 16665: 0x539D, + 16666: 0x53A3, + 16667: 0x53A5, + 16668: 0x53AE, + 16669: 0x9765, + 16670: 0x8D5D, + 16671: 0x531A, + 16672: 0x53F5, + 16673: 0x5326, + 16674: 0x532E, + 16675: 0x533E, + 16676: 0x8D5C, + 16677: 0x5366, + 16678: 0x5363, + 16679: 0x5202, + 16680: 0x5208, + 16681: 0x520E, + 16682: 0x522D, + 16683: 0x5233, + 16684: 0x523F, + 16685: 0x5240, + 16686: 0x524C, + 16687: 0x525E, + 16688: 0x5261, + 16689: 0x525C, + 16690: 0x84AF, + 16691: 0x527D, + 16692: 0x5282, + 16693: 0x5281, + 16694: 0x5290, + 16695: 0x5293, + 16696: 0x5182, + 16697: 0x7F54, + 16698: 0x4EBB, + 16699: 0x4EC3, + 16700: 0x4EC9, + 16701: 0x4EC2, + 16702: 0x4EE8, + 16703: 0x4EE1, + 16704: 0x4EEB, + 16705: 0x4EDE, + 16706: 0x4F1B, + 16707: 0x4EF3, + 16708: 0x4F22, + 16709: 0x4F64, + 16710: 0x4EF5, + 16711: 0x4F25, + 16712: 0x4F27, + 16713: 0x4F09, + 16714: 0x4F2B, + 16715: 0x4F5E, + 16716: 0x4F67, + 16717: 0x6538, + 16718: 0x4F5A, + 16719: 0x4F5D, + 16720: 0x8CAE, + 16721: 0x8CAF, + 16722: 0x8CB0, + 16723: 0x8CB1, + 16724: 0x8CB2, + 16725: 0x8CB3, + 16726: 0x8CB4, + 16727: 0x8CB5, + 16728: 0x8CB6, + 16729: 0x8CB7, + 16730: 0x8CB8, + 16731: 0x8CB9, + 16732: 0x8CBA, + 16733: 0x8CBB, + 16734: 0x8CBC, + 16735: 0x8CBD, + 16736: 0x8CBE, + 16737: 0x8CBF, + 16738: 0x8CC0, + 16739: 0x8CC1, + 16740: 0x8CC2, + 16741: 0x8CC3, + 16742: 0x8CC4, + 16743: 0x8CC5, + 16744: 0x8CC6, + 16745: 0x8CC7, + 16746: 0x8CC8, + 16747: 0x8CC9, + 16748: 0x8CCA, + 16749: 0x8CCB, + 16750: 0x8CCC, + 16751: 0x8CCD, + 16752: 0x8CCE, + 16753: 0x8CCF, + 16754: 0x8CD0, + 16755: 0x8CD1, + 16756: 0x8CD2, + 16757: 0x8CD3, + 16758: 0x8CD4, + 16759: 0x8CD5, + 16760: 0x8CD6, + 16761: 0x8CD7, + 16762: 0x8CD8, + 16763: 0x8CD9, + 16764: 0x8CDA, + 16765: 0x8CDB, + 16766: 0x8CDC, + 16767: 0x8CDD, + 16768: 0x8CDE, + 16769: 0x8CDF, + 16770: 0x8CE0, + 16771: 0x8CE1, + 16772: 0x8CE2, + 16773: 0x8CE3, + 16774: 0x8CE4, + 16775: 0x8CE5, + 16776: 0x8CE6, + 16777: 0x8CE7, + 16778: 0x8CE8, + 16779: 0x8CE9, + 16780: 0x8CEA, + 16781: 0x8CEB, + 16782: 0x8CEC, + 16783: 0x8CED, + 16784: 0x8CEE, + 16785: 0x8CEF, + 16786: 0x8CF0, + 16787: 0x8CF1, + 16788: 0x8CF2, + 16789: 0x8CF3, + 16790: 0x8CF4, + 16791: 0x8CF5, + 16792: 0x8CF6, + 16793: 0x8CF7, + 16794: 0x8CF8, + 16795: 0x8CF9, + 16796: 0x8CFA, + 16797: 0x8CFB, + 16798: 0x8CFC, + 16799: 0x8CFD, + 16800: 0x8CFE, + 16801: 0x8CFF, + 16802: 0x8D00, + 16803: 0x8D01, + 16804: 0x8D02, + 16805: 0x8D03, + 16806: 0x8D04, + 16807: 0x8D05, + 16808: 0x8D06, + 16809: 0x8D07, + 16810: 0x8D08, + 16811: 0x8D09, + 16812: 0x8D0A, + 16813: 0x8D0B, + 16814: 0x8D0C, + 16815: 0x8D0D, + 16816: 0x4F5F, + 16817: 0x4F57, + 16818: 0x4F32, + 16819: 0x4F3D, + 16820: 0x4F76, + 16821: 0x4F74, + 16822: 0x4F91, + 16823: 0x4F89, + 16824: 0x4F83, + 16825: 0x4F8F, + 16826: 0x4F7E, + 16827: 0x4F7B, + 16828: 0x4FAA, + 16829: 0x4F7C, + 16830: 0x4FAC, + 16831: 0x4F94, + 16832: 0x4FE6, + 16833: 0x4FE8, + 16834: 0x4FEA, + 16835: 0x4FC5, + 16836: 0x4FDA, + 16837: 0x4FE3, + 16838: 0x4FDC, + 16839: 0x4FD1, + 16840: 0x4FDF, + 16841: 0x4FF8, + 16842: 0x5029, + 16843: 0x504C, + 16844: 0x4FF3, + 16845: 0x502C, + 16846: 0x500F, + 16847: 0x502E, + 16848: 0x502D, + 16849: 0x4FFE, + 16850: 0x501C, + 16851: 0x500C, + 16852: 0x5025, + 16853: 0x5028, + 16854: 0x507E, + 16855: 0x5043, + 16856: 0x5055, + 16857: 0x5048, + 16858: 0x504E, + 16859: 0x506C, + 16860: 0x507B, + 16861: 0x50A5, + 16862: 0x50A7, + 16863: 0x50A9, + 16864: 0x50BA, + 16865: 0x50D6, + 16866: 0x5106, + 16867: 0x50ED, + 16868: 0x50EC, + 16869: 0x50E6, + 16870: 0x50EE, + 16871: 0x5107, + 16872: 0x510B, + 16873: 0x4EDD, + 16874: 0x6C3D, + 16875: 0x4F58, + 16876: 0x4F65, + 16877: 0x4FCE, + 16878: 0x9FA0, + 16879: 0x6C46, + 16880: 0x7C74, + 16881: 0x516E, + 16882: 0x5DFD, + 16883: 0x9EC9, + 16884: 0x9998, + 16885: 0x5181, + 16886: 0x5914, + 16887: 0x52F9, + 16888: 0x530D, + 16889: 0x8A07, + 16890: 0x5310, + 16891: 0x51EB, + 16892: 0x5919, + 16893: 0x5155, + 16894: 0x4EA0, + 16895: 0x5156, + 16896: 0x4EB3, + 16897: 0x886E, + 16898: 0x88A4, + 16899: 0x4EB5, + 16900: 0x8114, + 16901: 0x88D2, + 16902: 0x7980, + 16903: 0x5B34, + 16904: 0x8803, + 16905: 0x7FB8, + 16906: 0x51AB, + 16907: 0x51B1, + 16908: 0x51BD, + 16909: 0x51BC, + 16910: 0x8D0E, + 16911: 0x8D0F, + 16912: 0x8D10, + 16913: 0x8D11, + 16914: 0x8D12, + 16915: 0x8D13, + 16916: 0x8D14, + 16917: 0x8D15, + 16918: 0x8D16, + 16919: 0x8D17, + 16920: 0x8D18, + 16921: 0x8D19, + 16922: 0x8D1A, + 16923: 0x8D1B, + 16924: 0x8D1C, + 16925: 0x8D20, + 16926: 0x8D51, + 16927: 0x8D52, + 16928: 0x8D57, + 16929: 0x8D5F, + 16930: 0x8D65, + 16931: 0x8D68, + 16932: 0x8D69, + 16933: 0x8D6A, + 16934: 0x8D6C, + 16935: 0x8D6E, + 16936: 0x8D6F, + 16937: 0x8D71, + 16938: 0x8D72, + 16939: 0x8D78, + 16940: 0x8D79, + 16941: 0x8D7A, + 16942: 0x8D7B, + 16943: 0x8D7C, + 16944: 0x8D7D, + 16945: 0x8D7E, + 16946: 0x8D7F, + 16947: 0x8D80, + 16948: 0x8D82, + 16949: 0x8D83, + 16950: 0x8D86, + 16951: 0x8D87, + 16952: 0x8D88, + 16953: 0x8D89, + 16954: 0x8D8C, + 16955: 0x8D8D, + 16956: 0x8D8E, + 16957: 0x8D8F, + 16958: 0x8D90, + 16959: 0x8D92, + 16960: 0x8D93, + 16961: 0x8D95, + 16962: 0x8D96, + 16963: 0x8D97, + 16964: 0x8D98, + 16965: 0x8D99, + 16966: 0x8D9A, + 16967: 0x8D9B, + 16968: 0x8D9C, + 16969: 0x8D9D, + 16970: 0x8D9E, + 16971: 0x8DA0, + 16972: 0x8DA1, + 16973: 0x8DA2, + 16974: 0x8DA4, + 16975: 0x8DA5, + 16976: 0x8DA6, + 16977: 0x8DA7, + 16978: 0x8DA8, + 16979: 0x8DA9, + 16980: 0x8DAA, + 16981: 0x8DAB, + 16982: 0x8DAC, + 16983: 0x8DAD, + 16984: 0x8DAE, + 16985: 0x8DAF, + 16986: 0x8DB0, + 16987: 0x8DB2, + 16988: 0x8DB6, + 16989: 0x8DB7, + 16990: 0x8DB9, + 16991: 0x8DBB, + 16992: 0x8DBD, + 16993: 0x8DC0, + 16994: 0x8DC1, + 16995: 0x8DC2, + 16996: 0x8DC5, + 16997: 0x8DC7, + 16998: 0x8DC8, + 16999: 0x8DC9, + 17000: 0x8DCA, + 17001: 0x8DCD, + 17002: 0x8DD0, + 17003: 0x8DD2, + 17004: 0x8DD3, + 17005: 0x8DD4, + 17006: 0x51C7, + 17007: 0x5196, + 17008: 0x51A2, + 17009: 0x51A5, + 17010: 0x8BA0, + 17011: 0x8BA6, + 17012: 0x8BA7, + 17013: 0x8BAA, + 17014: 0x8BB4, + 17015: 0x8BB5, + 17016: 0x8BB7, + 17017: 0x8BC2, + 17018: 0x8BC3, + 17019: 0x8BCB, + 17020: 0x8BCF, + 17021: 0x8BCE, + 17022: 0x8BD2, + 17023: 0x8BD3, + 17024: 0x8BD4, + 17025: 0x8BD6, + 17026: 0x8BD8, + 17027: 0x8BD9, + 17028: 0x8BDC, + 17029: 0x8BDF, + 17030: 0x8BE0, + 17031: 0x8BE4, + 17032: 0x8BE8, + 17033: 0x8BE9, + 17034: 0x8BEE, + 17035: 0x8BF0, + 17036: 0x8BF3, + 17037: 0x8BF6, + 17038: 0x8BF9, + 17039: 0x8BFC, + 17040: 0x8BFF, + 17041: 0x8C00, + 17042: 0x8C02, + 17043: 0x8C04, + 17044: 0x8C07, + 17045: 0x8C0C, + 17046: 0x8C0F, + 17047: 0x8C11, + 17048: 0x8C12, + 17049: 0x8C14, + 17050: 0x8C15, + 17051: 0x8C16, + 17052: 0x8C19, + 17053: 0x8C1B, + 17054: 0x8C18, + 17055: 0x8C1D, + 17056: 0x8C1F, + 17057: 0x8C20, + 17058: 0x8C21, + 17059: 0x8C25, + 17060: 0x8C27, + 17061: 0x8C2A, + 17062: 0x8C2B, + 17063: 0x8C2E, + 17064: 0x8C2F, + 17065: 0x8C32, + 17066: 0x8C33, + 17067: 0x8C35, + 17068: 0x8C36, + 17069: 0x5369, + 17070: 0x537A, + 17071: 0x961D, + 17072: 0x9622, + 17073: 0x9621, + 17074: 0x9631, + 17075: 0x962A, + 17076: 0x963D, + 17077: 0x963C, + 17078: 0x9642, + 17079: 0x9649, + 17080: 0x9654, + 17081: 0x965F, + 17082: 0x9667, + 17083: 0x966C, + 17084: 0x9672, + 17085: 0x9674, + 17086: 0x9688, + 17087: 0x968D, + 17088: 0x9697, + 17089: 0x96B0, + 17090: 0x9097, + 17091: 0x909B, + 17092: 0x909D, + 17093: 0x9099, + 17094: 0x90AC, + 17095: 0x90A1, + 17096: 0x90B4, + 17097: 0x90B3, + 17098: 0x90B6, + 17099: 0x90BA, + 17100: 0x8DD5, + 17101: 0x8DD8, + 17102: 0x8DD9, + 17103: 0x8DDC, + 17104: 0x8DE0, + 17105: 0x8DE1, + 17106: 0x8DE2, + 17107: 0x8DE5, + 17108: 0x8DE6, + 17109: 0x8DE7, + 17110: 0x8DE9, + 17111: 0x8DED, + 17112: 0x8DEE, + 17113: 0x8DF0, + 17114: 0x8DF1, + 17115: 0x8DF2, + 17116: 0x8DF4, + 17117: 0x8DF6, + 17118: 0x8DFC, + 17119: 0x8DFE, + 17120: 0x8DFF, + 17121: 0x8E00, + 17122: 0x8E01, + 17123: 0x8E02, + 17124: 0x8E03, + 17125: 0x8E04, + 17126: 0x8E06, + 17127: 0x8E07, + 17128: 0x8E08, + 17129: 0x8E0B, + 17130: 0x8E0D, + 17131: 0x8E0E, + 17132: 0x8E10, + 17133: 0x8E11, + 17134: 0x8E12, + 17135: 0x8E13, + 17136: 0x8E15, + 17137: 0x8E16, + 17138: 0x8E17, + 17139: 0x8E18, + 17140: 0x8E19, + 17141: 0x8E1A, + 17142: 0x8E1B, + 17143: 0x8E1C, + 17144: 0x8E20, + 17145: 0x8E21, + 17146: 0x8E24, + 17147: 0x8E25, + 17148: 0x8E26, + 17149: 0x8E27, + 17150: 0x8E28, + 17151: 0x8E2B, + 17152: 0x8E2D, + 17153: 0x8E30, + 17154: 0x8E32, + 17155: 0x8E33, + 17156: 0x8E34, + 17157: 0x8E36, + 17158: 0x8E37, + 17159: 0x8E38, + 17160: 0x8E3B, + 17161: 0x8E3C, + 17162: 0x8E3E, + 17163: 0x8E3F, + 17164: 0x8E43, + 17165: 0x8E45, + 17166: 0x8E46, + 17167: 0x8E4C, + 17168: 0x8E4D, + 17169: 0x8E4E, + 17170: 0x8E4F, + 17171: 0x8E50, + 17172: 0x8E53, + 17173: 0x8E54, + 17174: 0x8E55, + 17175: 0x8E56, + 17176: 0x8E57, + 17177: 0x8E58, + 17178: 0x8E5A, + 17179: 0x8E5B, + 17180: 0x8E5C, + 17181: 0x8E5D, + 17182: 0x8E5E, + 17183: 0x8E5F, + 17184: 0x8E60, + 17185: 0x8E61, + 17186: 0x8E62, + 17187: 0x8E63, + 17188: 0x8E64, + 17189: 0x8E65, + 17190: 0x8E67, + 17191: 0x8E68, + 17192: 0x8E6A, + 17193: 0x8E6B, + 17194: 0x8E6E, + 17195: 0x8E71, + 17196: 0x90B8, + 17197: 0x90B0, + 17198: 0x90CF, + 17199: 0x90C5, + 17200: 0x90BE, + 17201: 0x90D0, + 17202: 0x90C4, + 17203: 0x90C7, + 17204: 0x90D3, + 17205: 0x90E6, + 17206: 0x90E2, + 17207: 0x90DC, + 17208: 0x90D7, + 17209: 0x90DB, + 17210: 0x90EB, + 17211: 0x90EF, + 17212: 0x90FE, + 17213: 0x9104, + 17214: 0x9122, + 17215: 0x911E, + 17216: 0x9123, + 17217: 0x9131, + 17218: 0x912F, + 17219: 0x9139, + 17220: 0x9143, + 17221: 0x9146, + 17222: 0x520D, + 17223: 0x5942, + 17224: 0x52A2, + 17225: 0x52AC, + 17226: 0x52AD, + 17227: 0x52BE, + 17228: 0x54FF, + 17229: 0x52D0, + 17230: 0x52D6, + 17231: 0x52F0, + 17232: 0x53DF, + 17233: 0x71EE, + 17234: 0x77CD, + 17235: 0x5EF4, + 17236: 0x51F5, + 17237: 0x51FC, + 17238: 0x9B2F, + 17239: 0x53B6, + 17240: 0x5F01, + 17241: 0x755A, + 17242: 0x5DEF, + 17243: 0x574C, + 17244: 0x57A9, + 17245: 0x57A1, + 17246: 0x587E, + 17247: 0x58BC, + 17248: 0x58C5, + 17249: 0x58D1, + 17250: 0x5729, + 17251: 0x572C, + 17252: 0x572A, + 17253: 0x5733, + 17254: 0x5739, + 17255: 0x572E, + 17256: 0x572F, + 17257: 0x575C, + 17258: 0x573B, + 17259: 0x5742, + 17260: 0x5769, + 17261: 0x5785, + 17262: 0x576B, + 17263: 0x5786, + 17264: 0x577C, + 17265: 0x577B, + 17266: 0x5768, + 17267: 0x576D, + 17268: 0x5776, + 17269: 0x5773, + 17270: 0x57AD, + 17271: 0x57A4, + 17272: 0x578C, + 17273: 0x57B2, + 17274: 0x57CF, + 17275: 0x57A7, + 17276: 0x57B4, + 17277: 0x5793, + 17278: 0x57A0, + 17279: 0x57D5, + 17280: 0x57D8, + 17281: 0x57DA, + 17282: 0x57D9, + 17283: 0x57D2, + 17284: 0x57B8, + 17285: 0x57F4, + 17286: 0x57EF, + 17287: 0x57F8, + 17288: 0x57E4, + 17289: 0x57DD, + 17290: 0x8E73, + 17291: 0x8E75, + 17292: 0x8E77, + 17293: 0x8E78, + 17294: 0x8E79, + 17295: 0x8E7A, + 17296: 0x8E7B, + 17297: 0x8E7D, + 17298: 0x8E7E, + 17299: 0x8E80, + 17300: 0x8E82, + 17301: 0x8E83, + 17302: 0x8E84, + 17303: 0x8E86, + 17304: 0x8E88, + 17305: 0x8E89, + 17306: 0x8E8A, + 17307: 0x8E8B, + 17308: 0x8E8C, + 17309: 0x8E8D, + 17310: 0x8E8E, + 17311: 0x8E91, + 17312: 0x8E92, + 17313: 0x8E93, + 17314: 0x8E95, + 17315: 0x8E96, + 17316: 0x8E97, + 17317: 0x8E98, + 17318: 0x8E99, + 17319: 0x8E9A, + 17320: 0x8E9B, + 17321: 0x8E9D, + 17322: 0x8E9F, + 17323: 0x8EA0, + 17324: 0x8EA1, + 17325: 0x8EA2, + 17326: 0x8EA3, + 17327: 0x8EA4, + 17328: 0x8EA5, + 17329: 0x8EA6, + 17330: 0x8EA7, + 17331: 0x8EA8, + 17332: 0x8EA9, + 17333: 0x8EAA, + 17334: 0x8EAD, + 17335: 0x8EAE, + 17336: 0x8EB0, + 17337: 0x8EB1, + 17338: 0x8EB3, + 17339: 0x8EB4, + 17340: 0x8EB5, + 17341: 0x8EB6, + 17342: 0x8EB7, + 17343: 0x8EB8, + 17344: 0x8EB9, + 17345: 0x8EBB, + 17346: 0x8EBC, + 17347: 0x8EBD, + 17348: 0x8EBE, + 17349: 0x8EBF, + 17350: 0x8EC0, + 17351: 0x8EC1, + 17352: 0x8EC2, + 17353: 0x8EC3, + 17354: 0x8EC4, + 17355: 0x8EC5, + 17356: 0x8EC6, + 17357: 0x8EC7, + 17358: 0x8EC8, + 17359: 0x8EC9, + 17360: 0x8ECA, + 17361: 0x8ECB, + 17362: 0x8ECC, + 17363: 0x8ECD, + 17364: 0x8ECF, + 17365: 0x8ED0, + 17366: 0x8ED1, + 17367: 0x8ED2, + 17368: 0x8ED3, + 17369: 0x8ED4, + 17370: 0x8ED5, + 17371: 0x8ED6, + 17372: 0x8ED7, + 17373: 0x8ED8, + 17374: 0x8ED9, + 17375: 0x8EDA, + 17376: 0x8EDB, + 17377: 0x8EDC, + 17378: 0x8EDD, + 17379: 0x8EDE, + 17380: 0x8EDF, + 17381: 0x8EE0, + 17382: 0x8EE1, + 17383: 0x8EE2, + 17384: 0x8EE3, + 17385: 0x8EE4, + 17386: 0x580B, + 17387: 0x580D, + 17388: 0x57FD, + 17389: 0x57ED, + 17390: 0x5800, + 17391: 0x581E, + 17392: 0x5819, + 17393: 0x5844, + 17394: 0x5820, + 17395: 0x5865, + 17396: 0x586C, + 17397: 0x5881, + 17398: 0x5889, + 17399: 0x589A, + 17400: 0x5880, + 17401: 0x99A8, + 17402: 0x9F19, + 17403: 0x61FF, + 17404: 0x8279, + 17405: 0x827D, + 17406: 0x827F, + 17407: 0x828F, + 17408: 0x828A, + 17409: 0x82A8, + 17410: 0x8284, + 17411: 0x828E, + 17412: 0x8291, + 17413: 0x8297, + 17414: 0x8299, + 17415: 0x82AB, + 17416: 0x82B8, + 17417: 0x82BE, + 17418: 0x82B0, + 17419: 0x82C8, + 17420: 0x82CA, + 17421: 0x82E3, + 17422: 0x8298, + 17423: 0x82B7, + 17424: 0x82AE, + 17425: 0x82CB, + 17426: 0x82CC, + 17427: 0x82C1, + 17428: 0x82A9, + 17429: 0x82B4, + 17430: 0x82A1, + 17431: 0x82AA, + 17432: 0x829F, + 17433: 0x82C4, + 17434: 0x82CE, + 17435: 0x82A4, + 17436: 0x82E1, + 17437: 0x8309, + 17438: 0x82F7, + 17439: 0x82E4, + 17440: 0x830F, + 17441: 0x8307, + 17442: 0x82DC, + 17443: 0x82F4, + 17444: 0x82D2, + 17445: 0x82D8, + 17446: 0x830C, + 17447: 0x82FB, + 17448: 0x82D3, + 17449: 0x8311, + 17450: 0x831A, + 17451: 0x8306, + 17452: 0x8314, + 17453: 0x8315, + 17454: 0x82E0, + 17455: 0x82D5, + 17456: 0x831C, + 17457: 0x8351, + 17458: 0x835B, + 17459: 0x835C, + 17460: 0x8308, + 17461: 0x8392, + 17462: 0x833C, + 17463: 0x8334, + 17464: 0x8331, + 17465: 0x839B, + 17466: 0x835E, + 17467: 0x832F, + 17468: 0x834F, + 17469: 0x8347, + 17470: 0x8343, + 17471: 0x835F, + 17472: 0x8340, + 17473: 0x8317, + 17474: 0x8360, + 17475: 0x832D, + 17476: 0x833A, + 17477: 0x8333, + 17478: 0x8366, + 17479: 0x8365, + 17480: 0x8EE5, + 17481: 0x8EE6, + 17482: 0x8EE7, + 17483: 0x8EE8, + 17484: 0x8EE9, + 17485: 0x8EEA, + 17486: 0x8EEB, + 17487: 0x8EEC, + 17488: 0x8EED, + 17489: 0x8EEE, + 17490: 0x8EEF, + 17491: 0x8EF0, + 17492: 0x8EF1, + 17493: 0x8EF2, + 17494: 0x8EF3, + 17495: 0x8EF4, + 17496: 0x8EF5, + 17497: 0x8EF6, + 17498: 0x8EF7, + 17499: 0x8EF8, + 17500: 0x8EF9, + 17501: 0x8EFA, + 17502: 0x8EFB, + 17503: 0x8EFC, + 17504: 0x8EFD, + 17505: 0x8EFE, + 17506: 0x8EFF, + 17507: 0x8F00, + 17508: 0x8F01, + 17509: 0x8F02, + 17510: 0x8F03, + 17511: 0x8F04, + 17512: 0x8F05, + 17513: 0x8F06, + 17514: 0x8F07, + 17515: 0x8F08, + 17516: 0x8F09, + 17517: 0x8F0A, + 17518: 0x8F0B, + 17519: 0x8F0C, + 17520: 0x8F0D, + 17521: 0x8F0E, + 17522: 0x8F0F, + 17523: 0x8F10, + 17524: 0x8F11, + 17525: 0x8F12, + 17526: 0x8F13, + 17527: 0x8F14, + 17528: 0x8F15, + 17529: 0x8F16, + 17530: 0x8F17, + 17531: 0x8F18, + 17532: 0x8F19, + 17533: 0x8F1A, + 17534: 0x8F1B, + 17535: 0x8F1C, + 17536: 0x8F1D, + 17537: 0x8F1E, + 17538: 0x8F1F, + 17539: 0x8F20, + 17540: 0x8F21, + 17541: 0x8F22, + 17542: 0x8F23, + 17543: 0x8F24, + 17544: 0x8F25, + 17545: 0x8F26, + 17546: 0x8F27, + 17547: 0x8F28, + 17548: 0x8F29, + 17549: 0x8F2A, + 17550: 0x8F2B, + 17551: 0x8F2C, + 17552: 0x8F2D, + 17553: 0x8F2E, + 17554: 0x8F2F, + 17555: 0x8F30, + 17556: 0x8F31, + 17557: 0x8F32, + 17558: 0x8F33, + 17559: 0x8F34, + 17560: 0x8F35, + 17561: 0x8F36, + 17562: 0x8F37, + 17563: 0x8F38, + 17564: 0x8F39, + 17565: 0x8F3A, + 17566: 0x8F3B, + 17567: 0x8F3C, + 17568: 0x8F3D, + 17569: 0x8F3E, + 17570: 0x8F3F, + 17571: 0x8F40, + 17572: 0x8F41, + 17573: 0x8F42, + 17574: 0x8F43, + 17575: 0x8F44, + 17576: 0x8368, + 17577: 0x831B, + 17578: 0x8369, + 17579: 0x836C, + 17580: 0x836A, + 17581: 0x836D, + 17582: 0x836E, + 17583: 0x83B0, + 17584: 0x8378, + 17585: 0x83B3, + 17586: 0x83B4, + 17587: 0x83A0, + 17588: 0x83AA, + 17589: 0x8393, + 17590: 0x839C, + 17591: 0x8385, + 17592: 0x837C, + 17593: 0x83B6, + 17594: 0x83A9, + 17595: 0x837D, + 17596: 0x83B8, + 17597: 0x837B, + 17598: 0x8398, + 17599: 0x839E, + 17600: 0x83A8, + 17601: 0x83BA, + 17602: 0x83BC, + 17603: 0x83C1, + 17604: 0x8401, + 17605: 0x83E5, + 17606: 0x83D8, + 17607: 0x5807, + 17608: 0x8418, + 17609: 0x840B, + 17610: 0x83DD, + 17611: 0x83FD, + 17612: 0x83D6, + 17613: 0x841C, + 17614: 0x8438, + 17615: 0x8411, + 17616: 0x8406, + 17617: 0x83D4, + 17618: 0x83DF, + 17619: 0x840F, + 17620: 0x8403, + 17621: 0x83F8, + 17622: 0x83F9, + 17623: 0x83EA, + 17624: 0x83C5, + 17625: 0x83C0, + 17626: 0x8426, + 17627: 0x83F0, + 17628: 0x83E1, + 17629: 0x845C, + 17630: 0x8451, + 17631: 0x845A, + 17632: 0x8459, + 17633: 0x8473, + 17634: 0x8487, + 17635: 0x8488, + 17636: 0x847A, + 17637: 0x8489, + 17638: 0x8478, + 17639: 0x843C, + 17640: 0x8446, + 17641: 0x8469, + 17642: 0x8476, + 17643: 0x848C, + 17644: 0x848E, + 17645: 0x8431, + 17646: 0x846D, + 17647: 0x84C1, + 17648: 0x84CD, + 17649: 0x84D0, + 17650: 0x84E6, + 17651: 0x84BD, + 17652: 0x84D3, + 17653: 0x84CA, + 17654: 0x84BF, + 17655: 0x84BA, + 17656: 0x84E0, + 17657: 0x84A1, + 17658: 0x84B9, + 17659: 0x84B4, + 17660: 0x8497, + 17661: 0x84E5, + 17662: 0x84E3, + 17663: 0x850C, + 17664: 0x750D, + 17665: 0x8538, + 17666: 0x84F0, + 17667: 0x8539, + 17668: 0x851F, + 17669: 0x853A, + 17670: 0x8F45, + 17671: 0x8F46, + 17672: 0x8F47, + 17673: 0x8F48, + 17674: 0x8F49, + 17675: 0x8F4A, + 17676: 0x8F4B, + 17677: 0x8F4C, + 17678: 0x8F4D, + 17679: 0x8F4E, + 17680: 0x8F4F, + 17681: 0x8F50, + 17682: 0x8F51, + 17683: 0x8F52, + 17684: 0x8F53, + 17685: 0x8F54, + 17686: 0x8F55, + 17687: 0x8F56, + 17688: 0x8F57, + 17689: 0x8F58, + 17690: 0x8F59, + 17691: 0x8F5A, + 17692: 0x8F5B, + 17693: 0x8F5C, + 17694: 0x8F5D, + 17695: 0x8F5E, + 17696: 0x8F5F, + 17697: 0x8F60, + 17698: 0x8F61, + 17699: 0x8F62, + 17700: 0x8F63, + 17701: 0x8F64, + 17702: 0x8F65, + 17703: 0x8F6A, + 17704: 0x8F80, + 17705: 0x8F8C, + 17706: 0x8F92, + 17707: 0x8F9D, + 17708: 0x8FA0, + 17709: 0x8FA1, + 17710: 0x8FA2, + 17711: 0x8FA4, + 17712: 0x8FA5, + 17713: 0x8FA6, + 17714: 0x8FA7, + 17715: 0x8FAA, + 17716: 0x8FAC, + 17717: 0x8FAD, + 17718: 0x8FAE, + 17719: 0x8FAF, + 17720: 0x8FB2, + 17721: 0x8FB3, + 17722: 0x8FB4, + 17723: 0x8FB5, + 17724: 0x8FB7, + 17725: 0x8FB8, + 17726: 0x8FBA, + 17727: 0x8FBB, + 17728: 0x8FBC, + 17729: 0x8FBF, + 17730: 0x8FC0, + 17731: 0x8FC3, + 17732: 0x8FC6, + 17733: 0x8FC9, + 17734: 0x8FCA, + 17735: 0x8FCB, + 17736: 0x8FCC, + 17737: 0x8FCD, + 17738: 0x8FCF, + 17739: 0x8FD2, + 17740: 0x8FD6, + 17741: 0x8FD7, + 17742: 0x8FDA, + 17743: 0x8FE0, + 17744: 0x8FE1, + 17745: 0x8FE3, + 17746: 0x8FE7, + 17747: 0x8FEC, + 17748: 0x8FEF, + 17749: 0x8FF1, + 17750: 0x8FF2, + 17751: 0x8FF4, + 17752: 0x8FF5, + 17753: 0x8FF6, + 17754: 0x8FFA, + 17755: 0x8FFB, + 17756: 0x8FFC, + 17757: 0x8FFE, + 17758: 0x8FFF, + 17759: 0x9007, + 17760: 0x9008, + 17761: 0x900C, + 17762: 0x900E, + 17763: 0x9013, + 17764: 0x9015, + 17765: 0x9018, + 17766: 0x8556, + 17767: 0x853B, + 17768: 0x84FF, + 17769: 0x84FC, + 17770: 0x8559, + 17771: 0x8548, + 17772: 0x8568, + 17773: 0x8564, + 17774: 0x855E, + 17775: 0x857A, + 17776: 0x77A2, + 17777: 0x8543, + 17778: 0x8572, + 17779: 0x857B, + 17780: 0x85A4, + 17781: 0x85A8, + 17782: 0x8587, + 17783: 0x858F, + 17784: 0x8579, + 17785: 0x85AE, + 17786: 0x859C, + 17787: 0x8585, + 17788: 0x85B9, + 17789: 0x85B7, + 17790: 0x85B0, + 17791: 0x85D3, + 17792: 0x85C1, + 17793: 0x85DC, + 17794: 0x85FF, + 17795: 0x8627, + 17796: 0x8605, + 17797: 0x8629, + 17798: 0x8616, + 17799: 0x863C, + 17800: 0x5EFE, + 17801: 0x5F08, + 17802: 0x593C, + 17803: 0x5941, + 17804: 0x8037, + 17805: 0x5955, + 17806: 0x595A, + 17807: 0x5958, + 17808: 0x530F, + 17809: 0x5C22, + 17810: 0x5C25, + 17811: 0x5C2C, + 17812: 0x5C34, + 17813: 0x624C, + 17814: 0x626A, + 17815: 0x629F, + 17816: 0x62BB, + 17817: 0x62CA, + 17818: 0x62DA, + 17819: 0x62D7, + 17820: 0x62EE, + 17821: 0x6322, + 17822: 0x62F6, + 17823: 0x6339, + 17824: 0x634B, + 17825: 0x6343, + 17826: 0x63AD, + 17827: 0x63F6, + 17828: 0x6371, + 17829: 0x637A, + 17830: 0x638E, + 17831: 0x63B4, + 17832: 0x636D, + 17833: 0x63AC, + 17834: 0x638A, + 17835: 0x6369, + 17836: 0x63AE, + 17837: 0x63BC, + 17838: 0x63F2, + 17839: 0x63F8, + 17840: 0x63E0, + 17841: 0x63FF, + 17842: 0x63C4, + 17843: 0x63DE, + 17844: 0x63CE, + 17845: 0x6452, + 17846: 0x63C6, + 17847: 0x63BE, + 17848: 0x6445, + 17849: 0x6441, + 17850: 0x640B, + 17851: 0x641B, + 17852: 0x6420, + 17853: 0x640C, + 17854: 0x6426, + 17855: 0x6421, + 17856: 0x645E, + 17857: 0x6484, + 17858: 0x646D, + 17859: 0x6496, + 17860: 0x9019, + 17861: 0x901C, + 17862: 0x9023, + 17863: 0x9024, + 17864: 0x9025, + 17865: 0x9027, + 17866: 0x9028, + 17867: 0x9029, + 17868: 0x902A, + 17869: 0x902B, + 17870: 0x902C, + 17871: 0x9030, + 17872: 0x9031, + 17873: 0x9032, + 17874: 0x9033, + 17875: 0x9034, + 17876: 0x9037, + 17877: 0x9039, + 17878: 0x903A, + 17879: 0x903D, + 17880: 0x903F, + 17881: 0x9040, + 17882: 0x9043, + 17883: 0x9045, + 17884: 0x9046, + 17885: 0x9048, + 17886: 0x9049, + 17887: 0x904A, + 17888: 0x904B, + 17889: 0x904C, + 17890: 0x904E, + 17891: 0x9054, + 17892: 0x9055, + 17893: 0x9056, + 17894: 0x9059, + 17895: 0x905A, + 17896: 0x905C, + 17897: 0x905D, + 17898: 0x905E, + 17899: 0x905F, + 17900: 0x9060, + 17901: 0x9061, + 17902: 0x9064, + 17903: 0x9066, + 17904: 0x9067, + 17905: 0x9069, + 17906: 0x906A, + 17907: 0x906B, + 17908: 0x906C, + 17909: 0x906F, + 17910: 0x9070, + 17911: 0x9071, + 17912: 0x9072, + 17913: 0x9073, + 17914: 0x9076, + 17915: 0x9077, + 17916: 0x9078, + 17917: 0x9079, + 17918: 0x907A, + 17919: 0x907B, + 17920: 0x907C, + 17921: 0x907E, + 17922: 0x9081, + 17923: 0x9084, + 17924: 0x9085, + 17925: 0x9086, + 17926: 0x9087, + 17927: 0x9089, + 17928: 0x908A, + 17929: 0x908C, + 17930: 0x908D, + 17931: 0x908E, + 17932: 0x908F, + 17933: 0x9090, + 17934: 0x9092, + 17935: 0x9094, + 17936: 0x9096, + 17937: 0x9098, + 17938: 0x909A, + 17939: 0x909C, + 17940: 0x909E, + 17941: 0x909F, + 17942: 0x90A0, + 17943: 0x90A4, + 17944: 0x90A5, + 17945: 0x90A7, + 17946: 0x90A8, + 17947: 0x90A9, + 17948: 0x90AB, + 17949: 0x90AD, + 17950: 0x90B2, + 17951: 0x90B7, + 17952: 0x90BC, + 17953: 0x90BD, + 17954: 0x90BF, + 17955: 0x90C0, + 17956: 0x647A, + 17957: 0x64B7, + 17958: 0x64B8, + 17959: 0x6499, + 17960: 0x64BA, + 17961: 0x64C0, + 17962: 0x64D0, + 17963: 0x64D7, + 17964: 0x64E4, + 17965: 0x64E2, + 17966: 0x6509, + 17967: 0x6525, + 17968: 0x652E, + 17969: 0x5F0B, + 17970: 0x5FD2, + 17971: 0x7519, + 17972: 0x5F11, + 17973: 0x535F, + 17974: 0x53F1, + 17975: 0x53FD, + 17976: 0x53E9, + 17977: 0x53E8, + 17978: 0x53FB, + 17979: 0x5412, + 17980: 0x5416, + 17981: 0x5406, + 17982: 0x544B, + 17983: 0x5452, + 17984: 0x5453, + 17985: 0x5454, + 17986: 0x5456, + 17987: 0x5443, + 17988: 0x5421, + 17989: 0x5457, + 17990: 0x5459, + 17991: 0x5423, + 17992: 0x5432, + 17993: 0x5482, + 17994: 0x5494, + 17995: 0x5477, + 17996: 0x5471, + 17997: 0x5464, + 17998: 0x549A, + 17999: 0x549B, + 18000: 0x5484, + 18001: 0x5476, + 18002: 0x5466, + 18003: 0x549D, + 18004: 0x54D0, + 18005: 0x54AD, + 18006: 0x54C2, + 18007: 0x54B4, + 18008: 0x54D2, + 18009: 0x54A7, + 18010: 0x54A6, + 18011: 0x54D3, + 18012: 0x54D4, + 18013: 0x5472, + 18014: 0x54A3, + 18015: 0x54D5, + 18016: 0x54BB, + 18017: 0x54BF, + 18018: 0x54CC, + 18019: 0x54D9, + 18020: 0x54DA, + 18021: 0x54DC, + 18022: 0x54A9, + 18023: 0x54AA, + 18024: 0x54A4, + 18025: 0x54DD, + 18026: 0x54CF, + 18027: 0x54DE, + 18028: 0x551B, + 18029: 0x54E7, + 18030: 0x5520, + 18031: 0x54FD, + 18032: 0x5514, + 18033: 0x54F3, + 18034: 0x5522, + 18035: 0x5523, + 18036: 0x550F, + 18037: 0x5511, + 18038: 0x5527, + 18039: 0x552A, + 18040: 0x5567, + 18041: 0x558F, + 18042: 0x55B5, + 18043: 0x5549, + 18044: 0x556D, + 18045: 0x5541, + 18046: 0x5555, + 18047: 0x553F, + 18048: 0x5550, + 18049: 0x553C, + 18050: 0x90C2, + 18051: 0x90C3, + 18052: 0x90C6, + 18053: 0x90C8, + 18054: 0x90C9, + 18055: 0x90CB, + 18056: 0x90CC, + 18057: 0x90CD, + 18058: 0x90D2, + 18059: 0x90D4, + 18060: 0x90D5, + 18061: 0x90D6, + 18062: 0x90D8, + 18063: 0x90D9, + 18064: 0x90DA, + 18065: 0x90DE, + 18066: 0x90DF, + 18067: 0x90E0, + 18068: 0x90E3, + 18069: 0x90E4, + 18070: 0x90E5, + 18071: 0x90E9, + 18072: 0x90EA, + 18073: 0x90EC, + 18074: 0x90EE, + 18075: 0x90F0, + 18076: 0x90F1, + 18077: 0x90F2, + 18078: 0x90F3, + 18079: 0x90F5, + 18080: 0x90F6, + 18081: 0x90F7, + 18082: 0x90F9, + 18083: 0x90FA, + 18084: 0x90FB, + 18085: 0x90FC, + 18086: 0x90FF, + 18087: 0x9100, + 18088: 0x9101, + 18089: 0x9103, + 18090: 0x9105, + 18091: 0x9106, + 18092: 0x9107, + 18093: 0x9108, + 18094: 0x9109, + 18095: 0x910A, + 18096: 0x910B, + 18097: 0x910C, + 18098: 0x910D, + 18099: 0x910E, + 18100: 0x910F, + 18101: 0x9110, + 18102: 0x9111, + 18103: 0x9112, + 18104: 0x9113, + 18105: 0x9114, + 18106: 0x9115, + 18107: 0x9116, + 18108: 0x9117, + 18109: 0x9118, + 18110: 0x911A, + 18111: 0x911B, + 18112: 0x911C, + 18113: 0x911D, + 18114: 0x911F, + 18115: 0x9120, + 18116: 0x9121, + 18117: 0x9124, + 18118: 0x9125, + 18119: 0x9126, + 18120: 0x9127, + 18121: 0x9128, + 18122: 0x9129, + 18123: 0x912A, + 18124: 0x912B, + 18125: 0x912C, + 18126: 0x912D, + 18127: 0x912E, + 18128: 0x9130, + 18129: 0x9132, + 18130: 0x9133, + 18131: 0x9134, + 18132: 0x9135, + 18133: 0x9136, + 18134: 0x9137, + 18135: 0x9138, + 18136: 0x913A, + 18137: 0x913B, + 18138: 0x913C, + 18139: 0x913D, + 18140: 0x913E, + 18141: 0x913F, + 18142: 0x9140, + 18143: 0x9141, + 18144: 0x9142, + 18145: 0x9144, + 18146: 0x5537, + 18147: 0x5556, + 18148: 0x5575, + 18149: 0x5576, + 18150: 0x5577, + 18151: 0x5533, + 18152: 0x5530, + 18153: 0x555C, + 18154: 0x558B, + 18155: 0x55D2, + 18156: 0x5583, + 18157: 0x55B1, + 18158: 0x55B9, + 18159: 0x5588, + 18160: 0x5581, + 18161: 0x559F, + 18162: 0x557E, + 18163: 0x55D6, + 18164: 0x5591, + 18165: 0x557B, + 18166: 0x55DF, + 18167: 0x55BD, + 18168: 0x55BE, + 18169: 0x5594, + 18170: 0x5599, + 18171: 0x55EA, + 18172: 0x55F7, + 18173: 0x55C9, + 18174: 0x561F, + 18175: 0x55D1, + 18176: 0x55EB, + 18177: 0x55EC, + 18178: 0x55D4, + 18179: 0x55E6, + 18180: 0x55DD, + 18181: 0x55C4, + 18182: 0x55EF, + 18183: 0x55E5, + 18184: 0x55F2, + 18185: 0x55F3, + 18186: 0x55CC, + 18187: 0x55CD, + 18188: 0x55E8, + 18189: 0x55F5, + 18190: 0x55E4, + 18191: 0x8F94, + 18192: 0x561E, + 18193: 0x5608, + 18194: 0x560C, + 18195: 0x5601, + 18196: 0x5624, + 18197: 0x5623, + 18198: 0x55FE, + 18199: 0x5600, + 18200: 0x5627, + 18201: 0x562D, + 18202: 0x5658, + 18203: 0x5639, + 18204: 0x5657, + 18205: 0x562C, + 18206: 0x564D, + 18207: 0x5662, + 18208: 0x5659, + 18209: 0x565C, + 18210: 0x564C, + 18211: 0x5654, + 18212: 0x5686, + 18213: 0x5664, + 18214: 0x5671, + 18215: 0x566B, + 18216: 0x567B, + 18217: 0x567C, + 18218: 0x5685, + 18219: 0x5693, + 18220: 0x56AF, + 18221: 0x56D4, + 18222: 0x56D7, + 18223: 0x56DD, + 18224: 0x56E1, + 18225: 0x56F5, + 18226: 0x56EB, + 18227: 0x56F9, + 18228: 0x56FF, + 18229: 0x5704, + 18230: 0x570A, + 18231: 0x5709, + 18232: 0x571C, + 18233: 0x5E0F, + 18234: 0x5E19, + 18235: 0x5E14, + 18236: 0x5E11, + 18237: 0x5E31, + 18238: 0x5E3B, + 18239: 0x5E3C, + 18240: 0x9145, + 18241: 0x9147, + 18242: 0x9148, + 18243: 0x9151, + 18244: 0x9153, + 18245: 0x9154, + 18246: 0x9155, + 18247: 0x9156, + 18248: 0x9158, + 18249: 0x9159, + 18250: 0x915B, + 18251: 0x915C, + 18252: 0x915F, + 18253: 0x9160, + 18254: 0x9166, + 18255: 0x9167, + 18256: 0x9168, + 18257: 0x916B, + 18258: 0x916D, + 18259: 0x9173, + 18260: 0x917A, + 18261: 0x917B, + 18262: 0x917C, + 18263: 0x9180, + 18264: 0x9181, + 18265: 0x9182, + 18266: 0x9183, + 18267: 0x9184, + 18268: 0x9186, + 18269: 0x9188, + 18270: 0x918A, + 18271: 0x918E, + 18272: 0x918F, + 18273: 0x9193, + 18274: 0x9194, + 18275: 0x9195, + 18276: 0x9196, + 18277: 0x9197, + 18278: 0x9198, + 18279: 0x9199, + 18280: 0x919C, + 18281: 0x919D, + 18282: 0x919E, + 18283: 0x919F, + 18284: 0x91A0, + 18285: 0x91A1, + 18286: 0x91A4, + 18287: 0x91A5, + 18288: 0x91A6, + 18289: 0x91A7, + 18290: 0x91A8, + 18291: 0x91A9, + 18292: 0x91AB, + 18293: 0x91AC, + 18294: 0x91B0, + 18295: 0x91B1, + 18296: 0x91B2, + 18297: 0x91B3, + 18298: 0x91B6, + 18299: 0x91B7, + 18300: 0x91B8, + 18301: 0x91B9, + 18302: 0x91BB, + 18303: 0x91BC, + 18304: 0x91BD, + 18305: 0x91BE, + 18306: 0x91BF, + 18307: 0x91C0, + 18308: 0x91C1, + 18309: 0x91C2, + 18310: 0x91C3, + 18311: 0x91C4, + 18312: 0x91C5, + 18313: 0x91C6, + 18314: 0x91C8, + 18315: 0x91CB, + 18316: 0x91D0, + 18317: 0x91D2, + 18318: 0x91D3, + 18319: 0x91D4, + 18320: 0x91D5, + 18321: 0x91D6, + 18322: 0x91D7, + 18323: 0x91D8, + 18324: 0x91D9, + 18325: 0x91DA, + 18326: 0x91DB, + 18327: 0x91DD, + 18328: 0x91DE, + 18329: 0x91DF, + 18330: 0x91E0, + 18331: 0x91E1, + 18332: 0x91E2, + 18333: 0x91E3, + 18334: 0x91E4, + 18335: 0x91E5, + 18336: 0x5E37, + 18337: 0x5E44, + 18338: 0x5E54, + 18339: 0x5E5B, + 18340: 0x5E5E, + 18341: 0x5E61, + 18342: 0x5C8C, + 18343: 0x5C7A, + 18344: 0x5C8D, + 18345: 0x5C90, + 18346: 0x5C96, + 18347: 0x5C88, + 18348: 0x5C98, + 18349: 0x5C99, + 18350: 0x5C91, + 18351: 0x5C9A, + 18352: 0x5C9C, + 18353: 0x5CB5, + 18354: 0x5CA2, + 18355: 0x5CBD, + 18356: 0x5CAC, + 18357: 0x5CAB, + 18358: 0x5CB1, + 18359: 0x5CA3, + 18360: 0x5CC1, + 18361: 0x5CB7, + 18362: 0x5CC4, + 18363: 0x5CD2, + 18364: 0x5CE4, + 18365: 0x5CCB, + 18366: 0x5CE5, + 18367: 0x5D02, + 18368: 0x5D03, + 18369: 0x5D27, + 18370: 0x5D26, + 18371: 0x5D2E, + 18372: 0x5D24, + 18373: 0x5D1E, + 18374: 0x5D06, + 18375: 0x5D1B, + 18376: 0x5D58, + 18377: 0x5D3E, + 18378: 0x5D34, + 18379: 0x5D3D, + 18380: 0x5D6C, + 18381: 0x5D5B, + 18382: 0x5D6F, + 18383: 0x5D5D, + 18384: 0x5D6B, + 18385: 0x5D4B, + 18386: 0x5D4A, + 18387: 0x5D69, + 18388: 0x5D74, + 18389: 0x5D82, + 18390: 0x5D99, + 18391: 0x5D9D, + 18392: 0x8C73, + 18393: 0x5DB7, + 18394: 0x5DC5, + 18395: 0x5F73, + 18396: 0x5F77, + 18397: 0x5F82, + 18398: 0x5F87, + 18399: 0x5F89, + 18400: 0x5F8C, + 18401: 0x5F95, + 18402: 0x5F99, + 18403: 0x5F9C, + 18404: 0x5FA8, + 18405: 0x5FAD, + 18406: 0x5FB5, + 18407: 0x5FBC, + 18408: 0x8862, + 18409: 0x5F61, + 18410: 0x72AD, + 18411: 0x72B0, + 18412: 0x72B4, + 18413: 0x72B7, + 18414: 0x72B8, + 18415: 0x72C3, + 18416: 0x72C1, + 18417: 0x72CE, + 18418: 0x72CD, + 18419: 0x72D2, + 18420: 0x72E8, + 18421: 0x72EF, + 18422: 0x72E9, + 18423: 0x72F2, + 18424: 0x72F4, + 18425: 0x72F7, + 18426: 0x7301, + 18427: 0x72F3, + 18428: 0x7303, + 18429: 0x72FA, + 18430: 0x91E6, + 18431: 0x91E7, + 18432: 0x91E8, + 18433: 0x91E9, + 18434: 0x91EA, + 18435: 0x91EB, + 18436: 0x91EC, + 18437: 0x91ED, + 18438: 0x91EE, + 18439: 0x91EF, + 18440: 0x91F0, + 18441: 0x91F1, + 18442: 0x91F2, + 18443: 0x91F3, + 18444: 0x91F4, + 18445: 0x91F5, + 18446: 0x91F6, + 18447: 0x91F7, + 18448: 0x91F8, + 18449: 0x91F9, + 18450: 0x91FA, + 18451: 0x91FB, + 18452: 0x91FC, + 18453: 0x91FD, + 18454: 0x91FE, + 18455: 0x91FF, + 18456: 0x9200, + 18457: 0x9201, + 18458: 0x9202, + 18459: 0x9203, + 18460: 0x9204, + 18461: 0x9205, + 18462: 0x9206, + 18463: 0x9207, + 18464: 0x9208, + 18465: 0x9209, + 18466: 0x920A, + 18467: 0x920B, + 18468: 0x920C, + 18469: 0x920D, + 18470: 0x920E, + 18471: 0x920F, + 18472: 0x9210, + 18473: 0x9211, + 18474: 0x9212, + 18475: 0x9213, + 18476: 0x9214, + 18477: 0x9215, + 18478: 0x9216, + 18479: 0x9217, + 18480: 0x9218, + 18481: 0x9219, + 18482: 0x921A, + 18483: 0x921B, + 18484: 0x921C, + 18485: 0x921D, + 18486: 0x921E, + 18487: 0x921F, + 18488: 0x9220, + 18489: 0x9221, + 18490: 0x9222, + 18491: 0x9223, + 18492: 0x9224, + 18493: 0x9225, + 18494: 0x9226, + 18495: 0x9227, + 18496: 0x9228, + 18497: 0x9229, + 18498: 0x922A, + 18499: 0x922B, + 18500: 0x922C, + 18501: 0x922D, + 18502: 0x922E, + 18503: 0x922F, + 18504: 0x9230, + 18505: 0x9231, + 18506: 0x9232, + 18507: 0x9233, + 18508: 0x9234, + 18509: 0x9235, + 18510: 0x9236, + 18511: 0x9237, + 18512: 0x9238, + 18513: 0x9239, + 18514: 0x923A, + 18515: 0x923B, + 18516: 0x923C, + 18517: 0x923D, + 18518: 0x923E, + 18519: 0x923F, + 18520: 0x9240, + 18521: 0x9241, + 18522: 0x9242, + 18523: 0x9243, + 18524: 0x9244, + 18525: 0x9245, + 18526: 0x72FB, + 18527: 0x7317, + 18528: 0x7313, + 18529: 0x7321, + 18530: 0x730A, + 18531: 0x731E, + 18532: 0x731D, + 18533: 0x7315, + 18534: 0x7322, + 18535: 0x7339, + 18536: 0x7325, + 18537: 0x732C, + 18538: 0x7338, + 18539: 0x7331, + 18540: 0x7350, + 18541: 0x734D, + 18542: 0x7357, + 18543: 0x7360, + 18544: 0x736C, + 18545: 0x736F, + 18546: 0x737E, + 18547: 0x821B, + 18548: 0x5925, + 18549: 0x98E7, + 18550: 0x5924, + 18551: 0x5902, + 18552: 0x9963, + 18553: 0x9967, + 18554: 0x9968, + 18555: 0x9969, + 18556: 0x996A, + 18557: 0x996B, + 18558: 0x996C, + 18559: 0x9974, + 18560: 0x9977, + 18561: 0x997D, + 18562: 0x9980, + 18563: 0x9984, + 18564: 0x9987, + 18565: 0x998A, + 18566: 0x998D, + 18567: 0x9990, + 18568: 0x9991, + 18569: 0x9993, + 18570: 0x9994, + 18571: 0x9995, + 18572: 0x5E80, + 18573: 0x5E91, + 18574: 0x5E8B, + 18575: 0x5E96, + 18576: 0x5EA5, + 18577: 0x5EA0, + 18578: 0x5EB9, + 18579: 0x5EB5, + 18580: 0x5EBE, + 18581: 0x5EB3, + 18582: 0x8D53, + 18583: 0x5ED2, + 18584: 0x5ED1, + 18585: 0x5EDB, + 18586: 0x5EE8, + 18587: 0x5EEA, + 18588: 0x81BA, + 18589: 0x5FC4, + 18590: 0x5FC9, + 18591: 0x5FD6, + 18592: 0x5FCF, + 18593: 0x6003, + 18594: 0x5FEE, + 18595: 0x6004, + 18596: 0x5FE1, + 18597: 0x5FE4, + 18598: 0x5FFE, + 18599: 0x6005, + 18600: 0x6006, + 18601: 0x5FEA, + 18602: 0x5FED, + 18603: 0x5FF8, + 18604: 0x6019, + 18605: 0x6035, + 18606: 0x6026, + 18607: 0x601B, + 18608: 0x600F, + 18609: 0x600D, + 18610: 0x6029, + 18611: 0x602B, + 18612: 0x600A, + 18613: 0x603F, + 18614: 0x6021, + 18615: 0x6078, + 18616: 0x6079, + 18617: 0x607B, + 18618: 0x607A, + 18619: 0x6042, + 18620: 0x9246, + 18621: 0x9247, + 18622: 0x9248, + 18623: 0x9249, + 18624: 0x924A, + 18625: 0x924B, + 18626: 0x924C, + 18627: 0x924D, + 18628: 0x924E, + 18629: 0x924F, + 18630: 0x9250, + 18631: 0x9251, + 18632: 0x9252, + 18633: 0x9253, + 18634: 0x9254, + 18635: 0x9255, + 18636: 0x9256, + 18637: 0x9257, + 18638: 0x9258, + 18639: 0x9259, + 18640: 0x925A, + 18641: 0x925B, + 18642: 0x925C, + 18643: 0x925D, + 18644: 0x925E, + 18645: 0x925F, + 18646: 0x9260, + 18647: 0x9261, + 18648: 0x9262, + 18649: 0x9263, + 18650: 0x9264, + 18651: 0x9265, + 18652: 0x9266, + 18653: 0x9267, + 18654: 0x9268, + 18655: 0x9269, + 18656: 0x926A, + 18657: 0x926B, + 18658: 0x926C, + 18659: 0x926D, + 18660: 0x926E, + 18661: 0x926F, + 18662: 0x9270, + 18663: 0x9271, + 18664: 0x9272, + 18665: 0x9273, + 18666: 0x9275, + 18667: 0x9276, + 18668: 0x9277, + 18669: 0x9278, + 18670: 0x9279, + 18671: 0x927A, + 18672: 0x927B, + 18673: 0x927C, + 18674: 0x927D, + 18675: 0x927E, + 18676: 0x927F, + 18677: 0x9280, + 18678: 0x9281, + 18679: 0x9282, + 18680: 0x9283, + 18681: 0x9284, + 18682: 0x9285, + 18683: 0x9286, + 18684: 0x9287, + 18685: 0x9288, + 18686: 0x9289, + 18687: 0x928A, + 18688: 0x928B, + 18689: 0x928C, + 18690: 0x928D, + 18691: 0x928F, + 18692: 0x9290, + 18693: 0x9291, + 18694: 0x9292, + 18695: 0x9293, + 18696: 0x9294, + 18697: 0x9295, + 18698: 0x9296, + 18699: 0x9297, + 18700: 0x9298, + 18701: 0x9299, + 18702: 0x929A, + 18703: 0x929B, + 18704: 0x929C, + 18705: 0x929D, + 18706: 0x929E, + 18707: 0x929F, + 18708: 0x92A0, + 18709: 0x92A1, + 18710: 0x92A2, + 18711: 0x92A3, + 18712: 0x92A4, + 18713: 0x92A5, + 18714: 0x92A6, + 18715: 0x92A7, + 18716: 0x606A, + 18717: 0x607D, + 18718: 0x6096, + 18719: 0x609A, + 18720: 0x60AD, + 18721: 0x609D, + 18722: 0x6083, + 18723: 0x6092, + 18724: 0x608C, + 18725: 0x609B, + 18726: 0x60EC, + 18727: 0x60BB, + 18728: 0x60B1, + 18729: 0x60DD, + 18730: 0x60D8, + 18731: 0x60C6, + 18732: 0x60DA, + 18733: 0x60B4, + 18734: 0x6120, + 18735: 0x6126, + 18736: 0x6115, + 18737: 0x6123, + 18738: 0x60F4, + 18739: 0x6100, + 18740: 0x610E, + 18741: 0x612B, + 18742: 0x614A, + 18743: 0x6175, + 18744: 0x61AC, + 18745: 0x6194, + 18746: 0x61A7, + 18747: 0x61B7, + 18748: 0x61D4, + 18749: 0x61F5, + 18750: 0x5FDD, + 18751: 0x96B3, + 18752: 0x95E9, + 18753: 0x95EB, + 18754: 0x95F1, + 18755: 0x95F3, + 18756: 0x95F5, + 18757: 0x95F6, + 18758: 0x95FC, + 18759: 0x95FE, + 18760: 0x9603, + 18761: 0x9604, + 18762: 0x9606, + 18763: 0x9608, + 18764: 0x960A, + 18765: 0x960B, + 18766: 0x960C, + 18767: 0x960D, + 18768: 0x960F, + 18769: 0x9612, + 18770: 0x9615, + 18771: 0x9616, + 18772: 0x9617, + 18773: 0x9619, + 18774: 0x961A, + 18775: 0x4E2C, + 18776: 0x723F, + 18777: 0x6215, + 18778: 0x6C35, + 18779: 0x6C54, + 18780: 0x6C5C, + 18781: 0x6C4A, + 18782: 0x6CA3, + 18783: 0x6C85, + 18784: 0x6C90, + 18785: 0x6C94, + 18786: 0x6C8C, + 18787: 0x6C68, + 18788: 0x6C69, + 18789: 0x6C74, + 18790: 0x6C76, + 18791: 0x6C86, + 18792: 0x6CA9, + 18793: 0x6CD0, + 18794: 0x6CD4, + 18795: 0x6CAD, + 18796: 0x6CF7, + 18797: 0x6CF8, + 18798: 0x6CF1, + 18799: 0x6CD7, + 18800: 0x6CB2, + 18801: 0x6CE0, + 18802: 0x6CD6, + 18803: 0x6CFA, + 18804: 0x6CEB, + 18805: 0x6CEE, + 18806: 0x6CB1, + 18807: 0x6CD3, + 18808: 0x6CEF, + 18809: 0x6CFE, + 18810: 0x92A8, + 18811: 0x92A9, + 18812: 0x92AA, + 18813: 0x92AB, + 18814: 0x92AC, + 18815: 0x92AD, + 18816: 0x92AF, + 18817: 0x92B0, + 18818: 0x92B1, + 18819: 0x92B2, + 18820: 0x92B3, + 18821: 0x92B4, + 18822: 0x92B5, + 18823: 0x92B6, + 18824: 0x92B7, + 18825: 0x92B8, + 18826: 0x92B9, + 18827: 0x92BA, + 18828: 0x92BB, + 18829: 0x92BC, + 18830: 0x92BD, + 18831: 0x92BE, + 18832: 0x92BF, + 18833: 0x92C0, + 18834: 0x92C1, + 18835: 0x92C2, + 18836: 0x92C3, + 18837: 0x92C4, + 18838: 0x92C5, + 18839: 0x92C6, + 18840: 0x92C7, + 18841: 0x92C9, + 18842: 0x92CA, + 18843: 0x92CB, + 18844: 0x92CC, + 18845: 0x92CD, + 18846: 0x92CE, + 18847: 0x92CF, + 18848: 0x92D0, + 18849: 0x92D1, + 18850: 0x92D2, + 18851: 0x92D3, + 18852: 0x92D4, + 18853: 0x92D5, + 18854: 0x92D6, + 18855: 0x92D7, + 18856: 0x92D8, + 18857: 0x92D9, + 18858: 0x92DA, + 18859: 0x92DB, + 18860: 0x92DC, + 18861: 0x92DD, + 18862: 0x92DE, + 18863: 0x92DF, + 18864: 0x92E0, + 18865: 0x92E1, + 18866: 0x92E2, + 18867: 0x92E3, + 18868: 0x92E4, + 18869: 0x92E5, + 18870: 0x92E6, + 18871: 0x92E7, + 18872: 0x92E8, + 18873: 0x92E9, + 18874: 0x92EA, + 18875: 0x92EB, + 18876: 0x92EC, + 18877: 0x92ED, + 18878: 0x92EE, + 18879: 0x92EF, + 18880: 0x92F0, + 18881: 0x92F1, + 18882: 0x92F2, + 18883: 0x92F3, + 18884: 0x92F4, + 18885: 0x92F5, + 18886: 0x92F6, + 18887: 0x92F7, + 18888: 0x92F8, + 18889: 0x92F9, + 18890: 0x92FA, + 18891: 0x92FB, + 18892: 0x92FC, + 18893: 0x92FD, + 18894: 0x92FE, + 18895: 0x92FF, + 18896: 0x9300, + 18897: 0x9301, + 18898: 0x9302, + 18899: 0x9303, + 18900: 0x9304, + 18901: 0x9305, + 18902: 0x9306, + 18903: 0x9307, + 18904: 0x9308, + 18905: 0x9309, + 18906: 0x6D39, + 18907: 0x6D27, + 18908: 0x6D0C, + 18909: 0x6D43, + 18910: 0x6D48, + 18911: 0x6D07, + 18912: 0x6D04, + 18913: 0x6D19, + 18914: 0x6D0E, + 18915: 0x6D2B, + 18916: 0x6D4D, + 18917: 0x6D2E, + 18918: 0x6D35, + 18919: 0x6D1A, + 18920: 0x6D4F, + 18921: 0x6D52, + 18922: 0x6D54, + 18923: 0x6D33, + 18924: 0x6D91, + 18925: 0x6D6F, + 18926: 0x6D9E, + 18927: 0x6DA0, + 18928: 0x6D5E, + 18929: 0x6D93, + 18930: 0x6D94, + 18931: 0x6D5C, + 18932: 0x6D60, + 18933: 0x6D7C, + 18934: 0x6D63, + 18935: 0x6E1A, + 18936: 0x6DC7, + 18937: 0x6DC5, + 18938: 0x6DDE, + 18939: 0x6E0E, + 18940: 0x6DBF, + 18941: 0x6DE0, + 18942: 0x6E11, + 18943: 0x6DE6, + 18944: 0x6DDD, + 18945: 0x6DD9, + 18946: 0x6E16, + 18947: 0x6DAB, + 18948: 0x6E0C, + 18949: 0x6DAE, + 18950: 0x6E2B, + 18951: 0x6E6E, + 18952: 0x6E4E, + 18953: 0x6E6B, + 18954: 0x6EB2, + 18955: 0x6E5F, + 18956: 0x6E86, + 18957: 0x6E53, + 18958: 0x6E54, + 18959: 0x6E32, + 18960: 0x6E25, + 18961: 0x6E44, + 18962: 0x6EDF, + 18963: 0x6EB1, + 18964: 0x6E98, + 18965: 0x6EE0, + 18966: 0x6F2D, + 18967: 0x6EE2, + 18968: 0x6EA5, + 18969: 0x6EA7, + 18970: 0x6EBD, + 18971: 0x6EBB, + 18972: 0x6EB7, + 18973: 0x6ED7, + 18974: 0x6EB4, + 18975: 0x6ECF, + 18976: 0x6E8F, + 18977: 0x6EC2, + 18978: 0x6E9F, + 18979: 0x6F62, + 18980: 0x6F46, + 18981: 0x6F47, + 18982: 0x6F24, + 18983: 0x6F15, + 18984: 0x6EF9, + 18985: 0x6F2F, + 18986: 0x6F36, + 18987: 0x6F4B, + 18988: 0x6F74, + 18989: 0x6F2A, + 18990: 0x6F09, + 18991: 0x6F29, + 18992: 0x6F89, + 18993: 0x6F8D, + 18994: 0x6F8C, + 18995: 0x6F78, + 18996: 0x6F72, + 18997: 0x6F7C, + 18998: 0x6F7A, + 18999: 0x6FD1, + 19000: 0x930A, + 19001: 0x930B, + 19002: 0x930C, + 19003: 0x930D, + 19004: 0x930E, + 19005: 0x930F, + 19006: 0x9310, + 19007: 0x9311, + 19008: 0x9312, + 19009: 0x9313, + 19010: 0x9314, + 19011: 0x9315, + 19012: 0x9316, + 19013: 0x9317, + 19014: 0x9318, + 19015: 0x9319, + 19016: 0x931A, + 19017: 0x931B, + 19018: 0x931C, + 19019: 0x931D, + 19020: 0x931E, + 19021: 0x931F, + 19022: 0x9320, + 19023: 0x9321, + 19024: 0x9322, + 19025: 0x9323, + 19026: 0x9324, + 19027: 0x9325, + 19028: 0x9326, + 19029: 0x9327, + 19030: 0x9328, + 19031: 0x9329, + 19032: 0x932A, + 19033: 0x932B, + 19034: 0x932C, + 19035: 0x932D, + 19036: 0x932E, + 19037: 0x932F, + 19038: 0x9330, + 19039: 0x9331, + 19040: 0x9332, + 19041: 0x9333, + 19042: 0x9334, + 19043: 0x9335, + 19044: 0x9336, + 19045: 0x9337, + 19046: 0x9338, + 19047: 0x9339, + 19048: 0x933A, + 19049: 0x933B, + 19050: 0x933C, + 19051: 0x933D, + 19052: 0x933F, + 19053: 0x9340, + 19054: 0x9341, + 19055: 0x9342, + 19056: 0x9343, + 19057: 0x9344, + 19058: 0x9345, + 19059: 0x9346, + 19060: 0x9347, + 19061: 0x9348, + 19062: 0x9349, + 19063: 0x934A, + 19064: 0x934B, + 19065: 0x934C, + 19066: 0x934D, + 19067: 0x934E, + 19068: 0x934F, + 19069: 0x9350, + 19070: 0x9351, + 19071: 0x9352, + 19072: 0x9353, + 19073: 0x9354, + 19074: 0x9355, + 19075: 0x9356, + 19076: 0x9357, + 19077: 0x9358, + 19078: 0x9359, + 19079: 0x935A, + 19080: 0x935B, + 19081: 0x935C, + 19082: 0x935D, + 19083: 0x935E, + 19084: 0x935F, + 19085: 0x9360, + 19086: 0x9361, + 19087: 0x9362, + 19088: 0x9363, + 19089: 0x9364, + 19090: 0x9365, + 19091: 0x9366, + 19092: 0x9367, + 19093: 0x9368, + 19094: 0x9369, + 19095: 0x936B, + 19096: 0x6FC9, + 19097: 0x6FA7, + 19098: 0x6FB9, + 19099: 0x6FB6, + 19100: 0x6FC2, + 19101: 0x6FE1, + 19102: 0x6FEE, + 19103: 0x6FDE, + 19104: 0x6FE0, + 19105: 0x6FEF, + 19106: 0x701A, + 19107: 0x7023, + 19108: 0x701B, + 19109: 0x7039, + 19110: 0x7035, + 19111: 0x704F, + 19112: 0x705E, + 19113: 0x5B80, + 19114: 0x5B84, + 19115: 0x5B95, + 19116: 0x5B93, + 19117: 0x5BA5, + 19118: 0x5BB8, + 19119: 0x752F, + 19120: 0x9A9E, + 19121: 0x6434, + 19122: 0x5BE4, + 19123: 0x5BEE, + 19124: 0x8930, + 19125: 0x5BF0, + 19126: 0x8E47, + 19127: 0x8B07, + 19128: 0x8FB6, + 19129: 0x8FD3, + 19130: 0x8FD5, + 19131: 0x8FE5, + 19132: 0x8FEE, + 19133: 0x8FE4, + 19134: 0x8FE9, + 19135: 0x8FE6, + 19136: 0x8FF3, + 19137: 0x8FE8, + 19138: 0x9005, + 19139: 0x9004, + 19140: 0x900B, + 19141: 0x9026, + 19142: 0x9011, + 19143: 0x900D, + 19144: 0x9016, + 19145: 0x9021, + 19146: 0x9035, + 19147: 0x9036, + 19148: 0x902D, + 19149: 0x902F, + 19150: 0x9044, + 19151: 0x9051, + 19152: 0x9052, + 19153: 0x9050, + 19154: 0x9068, + 19155: 0x9058, + 19156: 0x9062, + 19157: 0x905B, + 19158: 0x66B9, + 19159: 0x9074, + 19160: 0x907D, + 19161: 0x9082, + 19162: 0x9088, + 19163: 0x9083, + 19164: 0x908B, + 19165: 0x5F50, + 19166: 0x5F57, + 19167: 0x5F56, + 19168: 0x5F58, + 19169: 0x5C3B, + 19170: 0x54AB, + 19171: 0x5C50, + 19172: 0x5C59, + 19173: 0x5B71, + 19174: 0x5C63, + 19175: 0x5C66, + 19176: 0x7FBC, + 19177: 0x5F2A, + 19178: 0x5F29, + 19179: 0x5F2D, + 19180: 0x8274, + 19181: 0x5F3C, + 19182: 0x9B3B, + 19183: 0x5C6E, + 19184: 0x5981, + 19185: 0x5983, + 19186: 0x598D, + 19187: 0x59A9, + 19188: 0x59AA, + 19189: 0x59A3, + 19190: 0x936C, + 19191: 0x936D, + 19192: 0x936E, + 19193: 0x936F, + 19194: 0x9370, + 19195: 0x9371, + 19196: 0x9372, + 19197: 0x9373, + 19198: 0x9374, + 19199: 0x9375, + 19200: 0x9376, + 19201: 0x9377, + 19202: 0x9378, + 19203: 0x9379, + 19204: 0x937A, + 19205: 0x937B, + 19206: 0x937C, + 19207: 0x937D, + 19208: 0x937E, + 19209: 0x937F, + 19210: 0x9380, + 19211: 0x9381, + 19212: 0x9382, + 19213: 0x9383, + 19214: 0x9384, + 19215: 0x9385, + 19216: 0x9386, + 19217: 0x9387, + 19218: 0x9388, + 19219: 0x9389, + 19220: 0x938A, + 19221: 0x938B, + 19222: 0x938C, + 19223: 0x938D, + 19224: 0x938E, + 19225: 0x9390, + 19226: 0x9391, + 19227: 0x9392, + 19228: 0x9393, + 19229: 0x9394, + 19230: 0x9395, + 19231: 0x9396, + 19232: 0x9397, + 19233: 0x9398, + 19234: 0x9399, + 19235: 0x939A, + 19236: 0x939B, + 19237: 0x939C, + 19238: 0x939D, + 19239: 0x939E, + 19240: 0x939F, + 19241: 0x93A0, + 19242: 0x93A1, + 19243: 0x93A2, + 19244: 0x93A3, + 19245: 0x93A4, + 19246: 0x93A5, + 19247: 0x93A6, + 19248: 0x93A7, + 19249: 0x93A8, + 19250: 0x93A9, + 19251: 0x93AA, + 19252: 0x93AB, + 19253: 0x93AC, + 19254: 0x93AD, + 19255: 0x93AE, + 19256: 0x93AF, + 19257: 0x93B0, + 19258: 0x93B1, + 19259: 0x93B2, + 19260: 0x93B3, + 19261: 0x93B4, + 19262: 0x93B5, + 19263: 0x93B6, + 19264: 0x93B7, + 19265: 0x93B8, + 19266: 0x93B9, + 19267: 0x93BA, + 19268: 0x93BB, + 19269: 0x93BC, + 19270: 0x93BD, + 19271: 0x93BE, + 19272: 0x93BF, + 19273: 0x93C0, + 19274: 0x93C1, + 19275: 0x93C2, + 19276: 0x93C3, + 19277: 0x93C4, + 19278: 0x93C5, + 19279: 0x93C6, + 19280: 0x93C7, + 19281: 0x93C8, + 19282: 0x93C9, + 19283: 0x93CB, + 19284: 0x93CC, + 19285: 0x93CD, + 19286: 0x5997, + 19287: 0x59CA, + 19288: 0x59AB, + 19289: 0x599E, + 19290: 0x59A4, + 19291: 0x59D2, + 19292: 0x59B2, + 19293: 0x59AF, + 19294: 0x59D7, + 19295: 0x59BE, + 19296: 0x5A05, + 19297: 0x5A06, + 19298: 0x59DD, + 19299: 0x5A08, + 19300: 0x59E3, + 19301: 0x59D8, + 19302: 0x59F9, + 19303: 0x5A0C, + 19304: 0x5A09, + 19305: 0x5A32, + 19306: 0x5A34, + 19307: 0x5A11, + 19308: 0x5A23, + 19309: 0x5A13, + 19310: 0x5A40, + 19311: 0x5A67, + 19312: 0x5A4A, + 19313: 0x5A55, + 19314: 0x5A3C, + 19315: 0x5A62, + 19316: 0x5A75, + 19317: 0x80EC, + 19318: 0x5AAA, + 19319: 0x5A9B, + 19320: 0x5A77, + 19321: 0x5A7A, + 19322: 0x5ABE, + 19323: 0x5AEB, + 19324: 0x5AB2, + 19325: 0x5AD2, + 19326: 0x5AD4, + 19327: 0x5AB8, + 19328: 0x5AE0, + 19329: 0x5AE3, + 19330: 0x5AF1, + 19331: 0x5AD6, + 19332: 0x5AE6, + 19333: 0x5AD8, + 19334: 0x5ADC, + 19335: 0x5B09, + 19336: 0x5B17, + 19337: 0x5B16, + 19338: 0x5B32, + 19339: 0x5B37, + 19340: 0x5B40, + 19341: 0x5C15, + 19342: 0x5C1C, + 19343: 0x5B5A, + 19344: 0x5B65, + 19345: 0x5B73, + 19346: 0x5B51, + 19347: 0x5B53, + 19348: 0x5B62, + 19349: 0x9A75, + 19350: 0x9A77, + 19351: 0x9A78, + 19352: 0x9A7A, + 19353: 0x9A7F, + 19354: 0x9A7D, + 19355: 0x9A80, + 19356: 0x9A81, + 19357: 0x9A85, + 19358: 0x9A88, + 19359: 0x9A8A, + 19360: 0x9A90, + 19361: 0x9A92, + 19362: 0x9A93, + 19363: 0x9A96, + 19364: 0x9A98, + 19365: 0x9A9B, + 19366: 0x9A9C, + 19367: 0x9A9D, + 19368: 0x9A9F, + 19369: 0x9AA0, + 19370: 0x9AA2, + 19371: 0x9AA3, + 19372: 0x9AA5, + 19373: 0x9AA7, + 19374: 0x7E9F, + 19375: 0x7EA1, + 19376: 0x7EA3, + 19377: 0x7EA5, + 19378: 0x7EA8, + 19379: 0x7EA9, + 19380: 0x93CE, + 19381: 0x93CF, + 19382: 0x93D0, + 19383: 0x93D1, + 19384: 0x93D2, + 19385: 0x93D3, + 19386: 0x93D4, + 19387: 0x93D5, + 19388: 0x93D7, + 19389: 0x93D8, + 19390: 0x93D9, + 19391: 0x93DA, + 19392: 0x93DB, + 19393: 0x93DC, + 19394: 0x93DD, + 19395: 0x93DE, + 19396: 0x93DF, + 19397: 0x93E0, + 19398: 0x93E1, + 19399: 0x93E2, + 19400: 0x93E3, + 19401: 0x93E4, + 19402: 0x93E5, + 19403: 0x93E6, + 19404: 0x93E7, + 19405: 0x93E8, + 19406: 0x93E9, + 19407: 0x93EA, + 19408: 0x93EB, + 19409: 0x93EC, + 19410: 0x93ED, + 19411: 0x93EE, + 19412: 0x93EF, + 19413: 0x93F0, + 19414: 0x93F1, + 19415: 0x93F2, + 19416: 0x93F3, + 19417: 0x93F4, + 19418: 0x93F5, + 19419: 0x93F6, + 19420: 0x93F7, + 19421: 0x93F8, + 19422: 0x93F9, + 19423: 0x93FA, + 19424: 0x93FB, + 19425: 0x93FC, + 19426: 0x93FD, + 19427: 0x93FE, + 19428: 0x93FF, + 19429: 0x9400, + 19430: 0x9401, + 19431: 0x9402, + 19432: 0x9403, + 19433: 0x9404, + 19434: 0x9405, + 19435: 0x9406, + 19436: 0x9407, + 19437: 0x9408, + 19438: 0x9409, + 19439: 0x940A, + 19440: 0x940B, + 19441: 0x940C, + 19442: 0x940D, + 19443: 0x940E, + 19444: 0x940F, + 19445: 0x9410, + 19446: 0x9411, + 19447: 0x9412, + 19448: 0x9413, + 19449: 0x9414, + 19450: 0x9415, + 19451: 0x9416, + 19452: 0x9417, + 19453: 0x9418, + 19454: 0x9419, + 19455: 0x941A, + 19456: 0x941B, + 19457: 0x941C, + 19458: 0x941D, + 19459: 0x941E, + 19460: 0x941F, + 19461: 0x9420, + 19462: 0x9421, + 19463: 0x9422, + 19464: 0x9423, + 19465: 0x9424, + 19466: 0x9425, + 19467: 0x9426, + 19468: 0x9427, + 19469: 0x9428, + 19470: 0x9429, + 19471: 0x942A, + 19472: 0x942B, + 19473: 0x942C, + 19474: 0x942D, + 19475: 0x942E, + 19476: 0x7EAD, + 19477: 0x7EB0, + 19478: 0x7EBE, + 19479: 0x7EC0, + 19480: 0x7EC1, + 19481: 0x7EC2, + 19482: 0x7EC9, + 19483: 0x7ECB, + 19484: 0x7ECC, + 19485: 0x7ED0, + 19486: 0x7ED4, + 19487: 0x7ED7, + 19488: 0x7EDB, + 19489: 0x7EE0, + 19490: 0x7EE1, + 19491: 0x7EE8, + 19492: 0x7EEB, + 19493: 0x7EEE, + 19494: 0x7EEF, + 19495: 0x7EF1, + 19496: 0x7EF2, + 19497: 0x7F0D, + 19498: 0x7EF6, + 19499: 0x7EFA, + 19500: 0x7EFB, + 19501: 0x7EFE, + 19502: 0x7F01, + 19503: 0x7F02, + 19504: 0x7F03, + 19505: 0x7F07, + 19506: 0x7F08, + 19507: 0x7F0B, + 19508: 0x7F0C, + 19509: 0x7F0F, + 19510: 0x7F11, + 19511: 0x7F12, + 19512: 0x7F17, + 19513: 0x7F19, + 19514: 0x7F1C, + 19515: 0x7F1B, + 19516: 0x7F1F, + 19517: 0x7F21, + 19518: 0x7F22, + 19519: 0x7F23, + 19520: 0x7F24, + 19521: 0x7F25, + 19522: 0x7F26, + 19523: 0x7F27, + 19524: 0x7F2A, + 19525: 0x7F2B, + 19526: 0x7F2C, + 19527: 0x7F2D, + 19528: 0x7F2F, + 19529: 0x7F30, + 19530: 0x7F31, + 19531: 0x7F32, + 19532: 0x7F33, + 19533: 0x7F35, + 19534: 0x5E7A, + 19535: 0x757F, + 19536: 0x5DDB, + 19537: 0x753E, + 19538: 0x9095, + 19539: 0x738E, + 19540: 0x7391, + 19541: 0x73AE, + 19542: 0x73A2, + 19543: 0x739F, + 19544: 0x73CF, + 19545: 0x73C2, + 19546: 0x73D1, + 19547: 0x73B7, + 19548: 0x73B3, + 19549: 0x73C0, + 19550: 0x73C9, + 19551: 0x73C8, + 19552: 0x73E5, + 19553: 0x73D9, + 19554: 0x987C, + 19555: 0x740A, + 19556: 0x73E9, + 19557: 0x73E7, + 19558: 0x73DE, + 19559: 0x73BA, + 19560: 0x73F2, + 19561: 0x740F, + 19562: 0x742A, + 19563: 0x745B, + 19564: 0x7426, + 19565: 0x7425, + 19566: 0x7428, + 19567: 0x7430, + 19568: 0x742E, + 19569: 0x742C, + 19570: 0x942F, + 19571: 0x9430, + 19572: 0x9431, + 19573: 0x9432, + 19574: 0x9433, + 19575: 0x9434, + 19576: 0x9435, + 19577: 0x9436, + 19578: 0x9437, + 19579: 0x9438, + 19580: 0x9439, + 19581: 0x943A, + 19582: 0x943B, + 19583: 0x943C, + 19584: 0x943D, + 19585: 0x943F, + 19586: 0x9440, + 19587: 0x9441, + 19588: 0x9442, + 19589: 0x9443, + 19590: 0x9444, + 19591: 0x9445, + 19592: 0x9446, + 19593: 0x9447, + 19594: 0x9448, + 19595: 0x9449, + 19596: 0x944A, + 19597: 0x944B, + 19598: 0x944C, + 19599: 0x944D, + 19600: 0x944E, + 19601: 0x944F, + 19602: 0x9450, + 19603: 0x9451, + 19604: 0x9452, + 19605: 0x9453, + 19606: 0x9454, + 19607: 0x9455, + 19608: 0x9456, + 19609: 0x9457, + 19610: 0x9458, + 19611: 0x9459, + 19612: 0x945A, + 19613: 0x945B, + 19614: 0x945C, + 19615: 0x945D, + 19616: 0x945E, + 19617: 0x945F, + 19618: 0x9460, + 19619: 0x9461, + 19620: 0x9462, + 19621: 0x9463, + 19622: 0x9464, + 19623: 0x9465, + 19624: 0x9466, + 19625: 0x9467, + 19626: 0x9468, + 19627: 0x9469, + 19628: 0x946A, + 19629: 0x946C, + 19630: 0x946D, + 19631: 0x946E, + 19632: 0x946F, + 19633: 0x9470, + 19634: 0x9471, + 19635: 0x9472, + 19636: 0x9473, + 19637: 0x9474, + 19638: 0x9475, + 19639: 0x9476, + 19640: 0x9477, + 19641: 0x9478, + 19642: 0x9479, + 19643: 0x947A, + 19644: 0x947B, + 19645: 0x947C, + 19646: 0x947D, + 19647: 0x947E, + 19648: 0x947F, + 19649: 0x9480, + 19650: 0x9481, + 19651: 0x9482, + 19652: 0x9483, + 19653: 0x9484, + 19654: 0x9491, + 19655: 0x9496, + 19656: 0x9498, + 19657: 0x94C7, + 19658: 0x94CF, + 19659: 0x94D3, + 19660: 0x94D4, + 19661: 0x94DA, + 19662: 0x94E6, + 19663: 0x94FB, + 19664: 0x951C, + 19665: 0x9520, + 19666: 0x741B, + 19667: 0x741A, + 19668: 0x7441, + 19669: 0x745C, + 19670: 0x7457, + 19671: 0x7455, + 19672: 0x7459, + 19673: 0x7477, + 19674: 0x746D, + 19675: 0x747E, + 19676: 0x749C, + 19677: 0x748E, + 19678: 0x7480, + 19679: 0x7481, + 19680: 0x7487, + 19681: 0x748B, + 19682: 0x749E, + 19683: 0x74A8, + 19684: 0x74A9, + 19685: 0x7490, + 19686: 0x74A7, + 19687: 0x74D2, + 19688: 0x74BA, + 19689: 0x97EA, + 19690: 0x97EB, + 19691: 0x97EC, + 19692: 0x674C, + 19693: 0x6753, + 19694: 0x675E, + 19695: 0x6748, + 19696: 0x6769, + 19697: 0x67A5, + 19698: 0x6787, + 19699: 0x676A, + 19700: 0x6773, + 19701: 0x6798, + 19702: 0x67A7, + 19703: 0x6775, + 19704: 0x67A8, + 19705: 0x679E, + 19706: 0x67AD, + 19707: 0x678B, + 19708: 0x6777, + 19709: 0x677C, + 19710: 0x67F0, + 19711: 0x6809, + 19712: 0x67D8, + 19713: 0x680A, + 19714: 0x67E9, + 19715: 0x67B0, + 19716: 0x680C, + 19717: 0x67D9, + 19718: 0x67B5, + 19719: 0x67DA, + 19720: 0x67B3, + 19721: 0x67DD, + 19722: 0x6800, + 19723: 0x67C3, + 19724: 0x67B8, + 19725: 0x67E2, + 19726: 0x680E, + 19727: 0x67C1, + 19728: 0x67FD, + 19729: 0x6832, + 19730: 0x6833, + 19731: 0x6860, + 19732: 0x6861, + 19733: 0x684E, + 19734: 0x6862, + 19735: 0x6844, + 19736: 0x6864, + 19737: 0x6883, + 19738: 0x681D, + 19739: 0x6855, + 19740: 0x6866, + 19741: 0x6841, + 19742: 0x6867, + 19743: 0x6840, + 19744: 0x683E, + 19745: 0x684A, + 19746: 0x6849, + 19747: 0x6829, + 19748: 0x68B5, + 19749: 0x688F, + 19750: 0x6874, + 19751: 0x6877, + 19752: 0x6893, + 19753: 0x686B, + 19754: 0x68C2, + 19755: 0x696E, + 19756: 0x68FC, + 19757: 0x691F, + 19758: 0x6920, + 19759: 0x68F9, + 19760: 0x9527, + 19761: 0x9533, + 19762: 0x953D, + 19763: 0x9543, + 19764: 0x9548, + 19765: 0x954B, + 19766: 0x9555, + 19767: 0x955A, + 19768: 0x9560, + 19769: 0x956E, + 19770: 0x9574, + 19771: 0x9575, + 19772: 0x9577, + 19773: 0x9578, + 19774: 0x9579, + 19775: 0x957A, + 19776: 0x957B, + 19777: 0x957C, + 19778: 0x957D, + 19779: 0x957E, + 19780: 0x9580, + 19781: 0x9581, + 19782: 0x9582, + 19783: 0x9583, + 19784: 0x9584, + 19785: 0x9585, + 19786: 0x9586, + 19787: 0x9587, + 19788: 0x9588, + 19789: 0x9589, + 19790: 0x958A, + 19791: 0x958B, + 19792: 0x958C, + 19793: 0x958D, + 19794: 0x958E, + 19795: 0x958F, + 19796: 0x9590, + 19797: 0x9591, + 19798: 0x9592, + 19799: 0x9593, + 19800: 0x9594, + 19801: 0x9595, + 19802: 0x9596, + 19803: 0x9597, + 19804: 0x9598, + 19805: 0x9599, + 19806: 0x959A, + 19807: 0x959B, + 19808: 0x959C, + 19809: 0x959D, + 19810: 0x959E, + 19811: 0x959F, + 19812: 0x95A0, + 19813: 0x95A1, + 19814: 0x95A2, + 19815: 0x95A3, + 19816: 0x95A4, + 19817: 0x95A5, + 19818: 0x95A6, + 19819: 0x95A7, + 19820: 0x95A8, + 19821: 0x95A9, + 19822: 0x95AA, + 19823: 0x95AB, + 19824: 0x95AC, + 19825: 0x95AD, + 19826: 0x95AE, + 19827: 0x95AF, + 19828: 0x95B0, + 19829: 0x95B1, + 19830: 0x95B2, + 19831: 0x95B3, + 19832: 0x95B4, + 19833: 0x95B5, + 19834: 0x95B6, + 19835: 0x95B7, + 19836: 0x95B8, + 19837: 0x95B9, + 19838: 0x95BA, + 19839: 0x95BB, + 19840: 0x95BC, + 19841: 0x95BD, + 19842: 0x95BE, + 19843: 0x95BF, + 19844: 0x95C0, + 19845: 0x95C1, + 19846: 0x95C2, + 19847: 0x95C3, + 19848: 0x95C4, + 19849: 0x95C5, + 19850: 0x95C6, + 19851: 0x95C7, + 19852: 0x95C8, + 19853: 0x95C9, + 19854: 0x95CA, + 19855: 0x95CB, + 19856: 0x6924, + 19857: 0x68F0, + 19858: 0x690B, + 19859: 0x6901, + 19860: 0x6957, + 19861: 0x68E3, + 19862: 0x6910, + 19863: 0x6971, + 19864: 0x6939, + 19865: 0x6960, + 19866: 0x6942, + 19867: 0x695D, + 19868: 0x6984, + 19869: 0x696B, + 19870: 0x6980, + 19871: 0x6998, + 19872: 0x6978, + 19873: 0x6934, + 19874: 0x69CC, + 19875: 0x6987, + 19876: 0x6988, + 19877: 0x69CE, + 19878: 0x6989, + 19879: 0x6966, + 19880: 0x6963, + 19881: 0x6979, + 19882: 0x699B, + 19883: 0x69A7, + 19884: 0x69BB, + 19885: 0x69AB, + 19886: 0x69AD, + 19887: 0x69D4, + 19888: 0x69B1, + 19889: 0x69C1, + 19890: 0x69CA, + 19891: 0x69DF, + 19892: 0x6995, + 19893: 0x69E0, + 19894: 0x698D, + 19895: 0x69FF, + 19896: 0x6A2F, + 19897: 0x69ED, + 19898: 0x6A17, + 19899: 0x6A18, + 19900: 0x6A65, + 19901: 0x69F2, + 19902: 0x6A44, + 19903: 0x6A3E, + 19904: 0x6AA0, + 19905: 0x6A50, + 19906: 0x6A5B, + 19907: 0x6A35, + 19908: 0x6A8E, + 19909: 0x6A79, + 19910: 0x6A3D, + 19911: 0x6A28, + 19912: 0x6A58, + 19913: 0x6A7C, + 19914: 0x6A91, + 19915: 0x6A90, + 19916: 0x6AA9, + 19917: 0x6A97, + 19918: 0x6AAB, + 19919: 0x7337, + 19920: 0x7352, + 19921: 0x6B81, + 19922: 0x6B82, + 19923: 0x6B87, + 19924: 0x6B84, + 19925: 0x6B92, + 19926: 0x6B93, + 19927: 0x6B8D, + 19928: 0x6B9A, + 19929: 0x6B9B, + 19930: 0x6BA1, + 19931: 0x6BAA, + 19932: 0x8F6B, + 19933: 0x8F6D, + 19934: 0x8F71, + 19935: 0x8F72, + 19936: 0x8F73, + 19937: 0x8F75, + 19938: 0x8F76, + 19939: 0x8F78, + 19940: 0x8F77, + 19941: 0x8F79, + 19942: 0x8F7A, + 19943: 0x8F7C, + 19944: 0x8F7E, + 19945: 0x8F81, + 19946: 0x8F82, + 19947: 0x8F84, + 19948: 0x8F87, + 19949: 0x8F8B, + 19950: 0x95CC, + 19951: 0x95CD, + 19952: 0x95CE, + 19953: 0x95CF, + 19954: 0x95D0, + 19955: 0x95D1, + 19956: 0x95D2, + 19957: 0x95D3, + 19958: 0x95D4, + 19959: 0x95D5, + 19960: 0x95D6, + 19961: 0x95D7, + 19962: 0x95D8, + 19963: 0x95D9, + 19964: 0x95DA, + 19965: 0x95DB, + 19966: 0x95DC, + 19967: 0x95DD, + 19968: 0x95DE, + 19969: 0x95DF, + 19970: 0x95E0, + 19971: 0x95E1, + 19972: 0x95E2, + 19973: 0x95E3, + 19974: 0x95E4, + 19975: 0x95E5, + 19976: 0x95E6, + 19977: 0x95E7, + 19978: 0x95EC, + 19979: 0x95FF, + 19980: 0x9607, + 19981: 0x9613, + 19982: 0x9618, + 19983: 0x961B, + 19984: 0x961E, + 19985: 0x9620, + 19986: 0x9623, + 19987: 0x9624, + 19988: 0x9625, + 19989: 0x9626, + 19990: 0x9627, + 19991: 0x9628, + 19992: 0x9629, + 19993: 0x962B, + 19994: 0x962C, + 19995: 0x962D, + 19996: 0x962F, + 19997: 0x9630, + 19998: 0x9637, + 19999: 0x9638, + 20000: 0x9639, + 20001: 0x963A, + 20002: 0x963E, + 20003: 0x9641, + 20004: 0x9643, + 20005: 0x964A, + 20006: 0x964E, + 20007: 0x964F, + 20008: 0x9651, + 20009: 0x9652, + 20010: 0x9653, + 20011: 0x9656, + 20012: 0x9657, + 20013: 0x9658, + 20014: 0x9659, + 20015: 0x965A, + 20016: 0x965C, + 20017: 0x965D, + 20018: 0x965E, + 20019: 0x9660, + 20020: 0x9663, + 20021: 0x9665, + 20022: 0x9666, + 20023: 0x966B, + 20024: 0x966D, + 20025: 0x966E, + 20026: 0x966F, + 20027: 0x9670, + 20028: 0x9671, + 20029: 0x9673, + 20030: 0x9678, + 20031: 0x9679, + 20032: 0x967A, + 20033: 0x967B, + 20034: 0x967C, + 20035: 0x967D, + 20036: 0x967E, + 20037: 0x967F, + 20038: 0x9680, + 20039: 0x9681, + 20040: 0x9682, + 20041: 0x9683, + 20042: 0x9684, + 20043: 0x9687, + 20044: 0x9689, + 20045: 0x968A, + 20046: 0x8F8D, + 20047: 0x8F8E, + 20048: 0x8F8F, + 20049: 0x8F98, + 20050: 0x8F9A, + 20051: 0x8ECE, + 20052: 0x620B, + 20053: 0x6217, + 20054: 0x621B, + 20055: 0x621F, + 20056: 0x6222, + 20057: 0x6221, + 20058: 0x6225, + 20059: 0x6224, + 20060: 0x622C, + 20061: 0x81E7, + 20062: 0x74EF, + 20063: 0x74F4, + 20064: 0x74FF, + 20065: 0x750F, + 20066: 0x7511, + 20067: 0x7513, + 20068: 0x6534, + 20069: 0x65EE, + 20070: 0x65EF, + 20071: 0x65F0, + 20072: 0x660A, + 20073: 0x6619, + 20074: 0x6772, + 20075: 0x6603, + 20076: 0x6615, + 20077: 0x6600, + 20078: 0x7085, + 20079: 0x66F7, + 20080: 0x661D, + 20081: 0x6634, + 20082: 0x6631, + 20083: 0x6636, + 20084: 0x6635, + 20085: 0x8006, + 20086: 0x665F, + 20087: 0x6654, + 20088: 0x6641, + 20089: 0x664F, + 20090: 0x6656, + 20091: 0x6661, + 20092: 0x6657, + 20093: 0x6677, + 20094: 0x6684, + 20095: 0x668C, + 20096: 0x66A7, + 20097: 0x669D, + 20098: 0x66BE, + 20099: 0x66DB, + 20100: 0x66DC, + 20101: 0x66E6, + 20102: 0x66E9, + 20103: 0x8D32, + 20104: 0x8D33, + 20105: 0x8D36, + 20106: 0x8D3B, + 20107: 0x8D3D, + 20108: 0x8D40, + 20109: 0x8D45, + 20110: 0x8D46, + 20111: 0x8D48, + 20112: 0x8D49, + 20113: 0x8D47, + 20114: 0x8D4D, + 20115: 0x8D55, + 20116: 0x8D59, + 20117: 0x89C7, + 20118: 0x89CA, + 20119: 0x89CB, + 20120: 0x89CC, + 20121: 0x89CE, + 20122: 0x89CF, + 20123: 0x89D0, + 20124: 0x89D1, + 20125: 0x726E, + 20126: 0x729F, + 20127: 0x725D, + 20128: 0x7266, + 20129: 0x726F, + 20130: 0x727E, + 20131: 0x727F, + 20132: 0x7284, + 20133: 0x728B, + 20134: 0x728D, + 20135: 0x728F, + 20136: 0x7292, + 20137: 0x6308, + 20138: 0x6332, + 20139: 0x63B0, + 20140: 0x968C, + 20141: 0x968E, + 20142: 0x9691, + 20143: 0x9692, + 20144: 0x9693, + 20145: 0x9695, + 20146: 0x9696, + 20147: 0x969A, + 20148: 0x969B, + 20149: 0x969D, + 20150: 0x969E, + 20151: 0x969F, + 20152: 0x96A0, + 20153: 0x96A1, + 20154: 0x96A2, + 20155: 0x96A3, + 20156: 0x96A4, + 20157: 0x96A5, + 20158: 0x96A6, + 20159: 0x96A8, + 20160: 0x96A9, + 20161: 0x96AA, + 20162: 0x96AB, + 20163: 0x96AC, + 20164: 0x96AD, + 20165: 0x96AE, + 20166: 0x96AF, + 20167: 0x96B1, + 20168: 0x96B2, + 20169: 0x96B4, + 20170: 0x96B5, + 20171: 0x96B7, + 20172: 0x96B8, + 20173: 0x96BA, + 20174: 0x96BB, + 20175: 0x96BF, + 20176: 0x96C2, + 20177: 0x96C3, + 20178: 0x96C8, + 20179: 0x96CA, + 20180: 0x96CB, + 20181: 0x96D0, + 20182: 0x96D1, + 20183: 0x96D3, + 20184: 0x96D4, + 20185: 0x96D6, + 20186: 0x96D7, + 20187: 0x96D8, + 20188: 0x96D9, + 20189: 0x96DA, + 20190: 0x96DB, + 20191: 0x96DC, + 20192: 0x96DD, + 20193: 0x96DE, + 20194: 0x96DF, + 20195: 0x96E1, + 20196: 0x96E2, + 20197: 0x96E3, + 20198: 0x96E4, + 20199: 0x96E5, + 20200: 0x96E6, + 20201: 0x96E7, + 20202: 0x96EB, + 20203: 0x96EC, + 20204: 0x96ED, + 20205: 0x96EE, + 20206: 0x96F0, + 20207: 0x96F1, + 20208: 0x96F2, + 20209: 0x96F4, + 20210: 0x96F5, + 20211: 0x96F8, + 20212: 0x96FA, + 20213: 0x96FB, + 20214: 0x96FC, + 20215: 0x96FD, + 20216: 0x96FF, + 20217: 0x9702, + 20218: 0x9703, + 20219: 0x9705, + 20220: 0x970A, + 20221: 0x970B, + 20222: 0x970C, + 20223: 0x9710, + 20224: 0x9711, + 20225: 0x9712, + 20226: 0x9714, + 20227: 0x9715, + 20228: 0x9717, + 20229: 0x9718, + 20230: 0x9719, + 20231: 0x971A, + 20232: 0x971B, + 20233: 0x971D, + 20234: 0x971F, + 20235: 0x9720, + 20236: 0x643F, + 20237: 0x64D8, + 20238: 0x8004, + 20239: 0x6BEA, + 20240: 0x6BF3, + 20241: 0x6BFD, + 20242: 0x6BF5, + 20243: 0x6BF9, + 20244: 0x6C05, + 20245: 0x6C07, + 20246: 0x6C06, + 20247: 0x6C0D, + 20248: 0x6C15, + 20249: 0x6C18, + 20250: 0x6C19, + 20251: 0x6C1A, + 20252: 0x6C21, + 20253: 0x6C29, + 20254: 0x6C24, + 20255: 0x6C2A, + 20256: 0x6C32, + 20257: 0x6535, + 20258: 0x6555, + 20259: 0x656B, + 20260: 0x724D, + 20261: 0x7252, + 20262: 0x7256, + 20263: 0x7230, + 20264: 0x8662, + 20265: 0x5216, + 20266: 0x809F, + 20267: 0x809C, + 20268: 0x8093, + 20269: 0x80BC, + 20270: 0x670A, + 20271: 0x80BD, + 20272: 0x80B1, + 20273: 0x80AB, + 20274: 0x80AD, + 20275: 0x80B4, + 20276: 0x80B7, + 20277: 0x80E7, + 20278: 0x80E8, + 20279: 0x80E9, + 20280: 0x80EA, + 20281: 0x80DB, + 20282: 0x80C2, + 20283: 0x80C4, + 20284: 0x80D9, + 20285: 0x80CD, + 20286: 0x80D7, + 20287: 0x6710, + 20288: 0x80DD, + 20289: 0x80EB, + 20290: 0x80F1, + 20291: 0x80F4, + 20292: 0x80ED, + 20293: 0x810D, + 20294: 0x810E, + 20295: 0x80F2, + 20296: 0x80FC, + 20297: 0x6715, + 20298: 0x8112, + 20299: 0x8C5A, + 20300: 0x8136, + 20301: 0x811E, + 20302: 0x812C, + 20303: 0x8118, + 20304: 0x8132, + 20305: 0x8148, + 20306: 0x814C, + 20307: 0x8153, + 20308: 0x8174, + 20309: 0x8159, + 20310: 0x815A, + 20311: 0x8171, + 20312: 0x8160, + 20313: 0x8169, + 20314: 0x817C, + 20315: 0x817D, + 20316: 0x816D, + 20317: 0x8167, + 20318: 0x584D, + 20319: 0x5AB5, + 20320: 0x8188, + 20321: 0x8182, + 20322: 0x8191, + 20323: 0x6ED5, + 20324: 0x81A3, + 20325: 0x81AA, + 20326: 0x81CC, + 20327: 0x6726, + 20328: 0x81CA, + 20329: 0x81BB, + 20330: 0x9721, + 20331: 0x9722, + 20332: 0x9723, + 20333: 0x9724, + 20334: 0x9725, + 20335: 0x9726, + 20336: 0x9727, + 20337: 0x9728, + 20338: 0x9729, + 20339: 0x972B, + 20340: 0x972C, + 20341: 0x972E, + 20342: 0x972F, + 20343: 0x9731, + 20344: 0x9733, + 20345: 0x9734, + 20346: 0x9735, + 20347: 0x9736, + 20348: 0x9737, + 20349: 0x973A, + 20350: 0x973B, + 20351: 0x973C, + 20352: 0x973D, + 20353: 0x973F, + 20354: 0x9740, + 20355: 0x9741, + 20356: 0x9742, + 20357: 0x9743, + 20358: 0x9744, + 20359: 0x9745, + 20360: 0x9746, + 20361: 0x9747, + 20362: 0x9748, + 20363: 0x9749, + 20364: 0x974A, + 20365: 0x974B, + 20366: 0x974C, + 20367: 0x974D, + 20368: 0x974E, + 20369: 0x974F, + 20370: 0x9750, + 20371: 0x9751, + 20372: 0x9754, + 20373: 0x9755, + 20374: 0x9757, + 20375: 0x9758, + 20376: 0x975A, + 20377: 0x975C, + 20378: 0x975D, + 20379: 0x975F, + 20380: 0x9763, + 20381: 0x9764, + 20382: 0x9766, + 20383: 0x9767, + 20384: 0x9768, + 20385: 0x976A, + 20386: 0x976B, + 20387: 0x976C, + 20388: 0x976D, + 20389: 0x976E, + 20390: 0x976F, + 20391: 0x9770, + 20392: 0x9771, + 20393: 0x9772, + 20394: 0x9775, + 20395: 0x9777, + 20396: 0x9778, + 20397: 0x9779, + 20398: 0x977A, + 20399: 0x977B, + 20400: 0x977D, + 20401: 0x977E, + 20402: 0x977F, + 20403: 0x9780, + 20404: 0x9781, + 20405: 0x9782, + 20406: 0x9783, + 20407: 0x9784, + 20408: 0x9786, + 20409: 0x9787, + 20410: 0x9788, + 20411: 0x9789, + 20412: 0x978A, + 20413: 0x978C, + 20414: 0x978E, + 20415: 0x978F, + 20416: 0x9790, + 20417: 0x9793, + 20418: 0x9795, + 20419: 0x9796, + 20420: 0x9797, + 20421: 0x9799, + 20422: 0x979A, + 20423: 0x979B, + 20424: 0x979C, + 20425: 0x979D, + 20426: 0x81C1, + 20427: 0x81A6, + 20428: 0x6B24, + 20429: 0x6B37, + 20430: 0x6B39, + 20431: 0x6B43, + 20432: 0x6B46, + 20433: 0x6B59, + 20434: 0x98D1, + 20435: 0x98D2, + 20436: 0x98D3, + 20437: 0x98D5, + 20438: 0x98D9, + 20439: 0x98DA, + 20440: 0x6BB3, + 20441: 0x5F40, + 20442: 0x6BC2, + 20443: 0x89F3, + 20444: 0x6590, + 20445: 0x9F51, + 20446: 0x6593, + 20447: 0x65BC, + 20448: 0x65C6, + 20449: 0x65C4, + 20450: 0x65C3, + 20451: 0x65CC, + 20452: 0x65CE, + 20453: 0x65D2, + 20454: 0x65D6, + 20455: 0x7080, + 20456: 0x709C, + 20457: 0x7096, + 20458: 0x709D, + 20459: 0x70BB, + 20460: 0x70C0, + 20461: 0x70B7, + 20462: 0x70AB, + 20463: 0x70B1, + 20464: 0x70E8, + 20465: 0x70CA, + 20466: 0x7110, + 20467: 0x7113, + 20468: 0x7116, + 20469: 0x712F, + 20470: 0x7131, + 20471: 0x7173, + 20472: 0x715C, + 20473: 0x7168, + 20474: 0x7145, + 20475: 0x7172, + 20476: 0x714A, + 20477: 0x7178, + 20478: 0x717A, + 20479: 0x7198, + 20480: 0x71B3, + 20481: 0x71B5, + 20482: 0x71A8, + 20483: 0x71A0, + 20484: 0x71E0, + 20485: 0x71D4, + 20486: 0x71E7, + 20487: 0x71F9, + 20488: 0x721D, + 20489: 0x7228, + 20490: 0x706C, + 20491: 0x7118, + 20492: 0x7166, + 20493: 0x71B9, + 20494: 0x623E, + 20495: 0x623D, + 20496: 0x6243, + 20497: 0x6248, + 20498: 0x6249, + 20499: 0x793B, + 20500: 0x7940, + 20501: 0x7946, + 20502: 0x7949, + 20503: 0x795B, + 20504: 0x795C, + 20505: 0x7953, + 20506: 0x795A, + 20507: 0x7962, + 20508: 0x7957, + 20509: 0x7960, + 20510: 0x796F, + 20511: 0x7967, + 20512: 0x797A, + 20513: 0x7985, + 20514: 0x798A, + 20515: 0x799A, + 20516: 0x79A7, + 20517: 0x79B3, + 20518: 0x5FD1, + 20519: 0x5FD0, + 20520: 0x979E, + 20521: 0x979F, + 20522: 0x97A1, + 20523: 0x97A2, + 20524: 0x97A4, + 20525: 0x97A5, + 20526: 0x97A6, + 20527: 0x97A7, + 20528: 0x97A8, + 20529: 0x97A9, + 20530: 0x97AA, + 20531: 0x97AC, + 20532: 0x97AE, + 20533: 0x97B0, + 20534: 0x97B1, + 20535: 0x97B3, + 20536: 0x97B5, + 20537: 0x97B6, + 20538: 0x97B7, + 20539: 0x97B8, + 20540: 0x97B9, + 20541: 0x97BA, + 20542: 0x97BB, + 20543: 0x97BC, + 20544: 0x97BD, + 20545: 0x97BE, + 20546: 0x97BF, + 20547: 0x97C0, + 20548: 0x97C1, + 20549: 0x97C2, + 20550: 0x97C3, + 20551: 0x97C4, + 20552: 0x97C5, + 20553: 0x97C6, + 20554: 0x97C7, + 20555: 0x97C8, + 20556: 0x97C9, + 20557: 0x97CA, + 20558: 0x97CB, + 20559: 0x97CC, + 20560: 0x97CD, + 20561: 0x97CE, + 20562: 0x97CF, + 20563: 0x97D0, + 20564: 0x97D1, + 20565: 0x97D2, + 20566: 0x97D3, + 20567: 0x97D4, + 20568: 0x97D5, + 20569: 0x97D6, + 20570: 0x97D7, + 20571: 0x97D8, + 20572: 0x97D9, + 20573: 0x97DA, + 20574: 0x97DB, + 20575: 0x97DC, + 20576: 0x97DD, + 20577: 0x97DE, + 20578: 0x97DF, + 20579: 0x97E0, + 20580: 0x97E1, + 20581: 0x97E2, + 20582: 0x97E3, + 20583: 0x97E4, + 20584: 0x97E5, + 20585: 0x97E8, + 20586: 0x97EE, + 20587: 0x97EF, + 20588: 0x97F0, + 20589: 0x97F1, + 20590: 0x97F2, + 20591: 0x97F4, + 20592: 0x97F7, + 20593: 0x97F8, + 20594: 0x97F9, + 20595: 0x97FA, + 20596: 0x97FB, + 20597: 0x97FC, + 20598: 0x97FD, + 20599: 0x97FE, + 20600: 0x97FF, + 20601: 0x9800, + 20602: 0x9801, + 20603: 0x9802, + 20604: 0x9803, + 20605: 0x9804, + 20606: 0x9805, + 20607: 0x9806, + 20608: 0x9807, + 20609: 0x9808, + 20610: 0x9809, + 20611: 0x980A, + 20612: 0x980B, + 20613: 0x980C, + 20614: 0x980D, + 20615: 0x980E, + 20616: 0x603C, + 20617: 0x605D, + 20618: 0x605A, + 20619: 0x6067, + 20620: 0x6041, + 20621: 0x6059, + 20622: 0x6063, + 20623: 0x60AB, + 20624: 0x6106, + 20625: 0x610D, + 20626: 0x615D, + 20627: 0x61A9, + 20628: 0x619D, + 20629: 0x61CB, + 20630: 0x61D1, + 20631: 0x6206, + 20632: 0x8080, + 20633: 0x807F, + 20634: 0x6C93, + 20635: 0x6CF6, + 20636: 0x6DFC, + 20637: 0x77F6, + 20638: 0x77F8, + 20639: 0x7800, + 20640: 0x7809, + 20641: 0x7817, + 20642: 0x7818, + 20643: 0x7811, + 20644: 0x65AB, + 20645: 0x782D, + 20646: 0x781C, + 20647: 0x781D, + 20648: 0x7839, + 20649: 0x783A, + 20650: 0x783B, + 20651: 0x781F, + 20652: 0x783C, + 20653: 0x7825, + 20654: 0x782C, + 20655: 0x7823, + 20656: 0x7829, + 20657: 0x784E, + 20658: 0x786D, + 20659: 0x7856, + 20660: 0x7857, + 20661: 0x7826, + 20662: 0x7850, + 20663: 0x7847, + 20664: 0x784C, + 20665: 0x786A, + 20666: 0x789B, + 20667: 0x7893, + 20668: 0x789A, + 20669: 0x7887, + 20670: 0x789C, + 20671: 0x78A1, + 20672: 0x78A3, + 20673: 0x78B2, + 20674: 0x78B9, + 20675: 0x78A5, + 20676: 0x78D4, + 20677: 0x78D9, + 20678: 0x78C9, + 20679: 0x78EC, + 20680: 0x78F2, + 20681: 0x7905, + 20682: 0x78F4, + 20683: 0x7913, + 20684: 0x7924, + 20685: 0x791E, + 20686: 0x7934, + 20687: 0x9F9B, + 20688: 0x9EF9, + 20689: 0x9EFB, + 20690: 0x9EFC, + 20691: 0x76F1, + 20692: 0x7704, + 20693: 0x770D, + 20694: 0x76F9, + 20695: 0x7707, + 20696: 0x7708, + 20697: 0x771A, + 20698: 0x7722, + 20699: 0x7719, + 20700: 0x772D, + 20701: 0x7726, + 20702: 0x7735, + 20703: 0x7738, + 20704: 0x7750, + 20705: 0x7751, + 20706: 0x7747, + 20707: 0x7743, + 20708: 0x775A, + 20709: 0x7768, + 20710: 0x980F, + 20711: 0x9810, + 20712: 0x9811, + 20713: 0x9812, + 20714: 0x9813, + 20715: 0x9814, + 20716: 0x9815, + 20717: 0x9816, + 20718: 0x9817, + 20719: 0x9818, + 20720: 0x9819, + 20721: 0x981A, + 20722: 0x981B, + 20723: 0x981C, + 20724: 0x981D, + 20725: 0x981E, + 20726: 0x981F, + 20727: 0x9820, + 20728: 0x9821, + 20729: 0x9822, + 20730: 0x9823, + 20731: 0x9824, + 20732: 0x9825, + 20733: 0x9826, + 20734: 0x9827, + 20735: 0x9828, + 20736: 0x9829, + 20737: 0x982A, + 20738: 0x982B, + 20739: 0x982C, + 20740: 0x982D, + 20741: 0x982E, + 20742: 0x982F, + 20743: 0x9830, + 20744: 0x9831, + 20745: 0x9832, + 20746: 0x9833, + 20747: 0x9834, + 20748: 0x9835, + 20749: 0x9836, + 20750: 0x9837, + 20751: 0x9838, + 20752: 0x9839, + 20753: 0x983A, + 20754: 0x983B, + 20755: 0x983C, + 20756: 0x983D, + 20757: 0x983E, + 20758: 0x983F, + 20759: 0x9840, + 20760: 0x9841, + 20761: 0x9842, + 20762: 0x9843, + 20763: 0x9844, + 20764: 0x9845, + 20765: 0x9846, + 20766: 0x9847, + 20767: 0x9848, + 20768: 0x9849, + 20769: 0x984A, + 20770: 0x984B, + 20771: 0x984C, + 20772: 0x984D, + 20773: 0x984E, + 20774: 0x984F, + 20775: 0x9850, + 20776: 0x9851, + 20777: 0x9852, + 20778: 0x9853, + 20779: 0x9854, + 20780: 0x9855, + 20781: 0x9856, + 20782: 0x9857, + 20783: 0x9858, + 20784: 0x9859, + 20785: 0x985A, + 20786: 0x985B, + 20787: 0x985C, + 20788: 0x985D, + 20789: 0x985E, + 20790: 0x985F, + 20791: 0x9860, + 20792: 0x9861, + 20793: 0x9862, + 20794: 0x9863, + 20795: 0x9864, + 20796: 0x9865, + 20797: 0x9866, + 20798: 0x9867, + 20799: 0x9868, + 20800: 0x9869, + 20801: 0x986A, + 20802: 0x986B, + 20803: 0x986C, + 20804: 0x986D, + 20805: 0x986E, + 20806: 0x7762, + 20807: 0x7765, + 20808: 0x777F, + 20809: 0x778D, + 20810: 0x777D, + 20811: 0x7780, + 20812: 0x778C, + 20813: 0x7791, + 20814: 0x779F, + 20815: 0x77A0, + 20816: 0x77B0, + 20817: 0x77B5, + 20818: 0x77BD, + 20819: 0x753A, + 20820: 0x7540, + 20821: 0x754E, + 20822: 0x754B, + 20823: 0x7548, + 20824: 0x755B, + 20825: 0x7572, + 20826: 0x7579, + 20827: 0x7583, + 20828: 0x7F58, + 20829: 0x7F61, + 20830: 0x7F5F, + 20831: 0x8A48, + 20832: 0x7F68, + 20833: 0x7F74, + 20834: 0x7F71, + 20835: 0x7F79, + 20836: 0x7F81, + 20837: 0x7F7E, + 20838: 0x76CD, + 20839: 0x76E5, + 20840: 0x8832, + 20841: 0x9485, + 20842: 0x9486, + 20843: 0x9487, + 20844: 0x948B, + 20845: 0x948A, + 20846: 0x948C, + 20847: 0x948D, + 20848: 0x948F, + 20849: 0x9490, + 20850: 0x9494, + 20851: 0x9497, + 20852: 0x9495, + 20853: 0x949A, + 20854: 0x949B, + 20855: 0x949C, + 20856: 0x94A3, + 20857: 0x94A4, + 20858: 0x94AB, + 20859: 0x94AA, + 20860: 0x94AD, + 20861: 0x94AC, + 20862: 0x94AF, + 20863: 0x94B0, + 20864: 0x94B2, + 20865: 0x94B4, + 20866: 0x94B6, + 20867: 0x94B7, + 20868: 0x94B8, + 20869: 0x94B9, + 20870: 0x94BA, + 20871: 0x94BC, + 20872: 0x94BD, + 20873: 0x94BF, + 20874: 0x94C4, + 20875: 0x94C8, + 20876: 0x94C9, + 20877: 0x94CA, + 20878: 0x94CB, + 20879: 0x94CC, + 20880: 0x94CD, + 20881: 0x94CE, + 20882: 0x94D0, + 20883: 0x94D1, + 20884: 0x94D2, + 20885: 0x94D5, + 20886: 0x94D6, + 20887: 0x94D7, + 20888: 0x94D9, + 20889: 0x94D8, + 20890: 0x94DB, + 20891: 0x94DE, + 20892: 0x94DF, + 20893: 0x94E0, + 20894: 0x94E2, + 20895: 0x94E4, + 20896: 0x94E5, + 20897: 0x94E7, + 20898: 0x94E8, + 20899: 0x94EA, + 20900: 0x986F, + 20901: 0x9870, + 20902: 0x9871, + 20903: 0x9872, + 20904: 0x9873, + 20905: 0x9874, + 20906: 0x988B, + 20907: 0x988E, + 20908: 0x9892, + 20909: 0x9895, + 20910: 0x9899, + 20911: 0x98A3, + 20912: 0x98A8, + 20913: 0x98A9, + 20914: 0x98AA, + 20915: 0x98AB, + 20916: 0x98AC, + 20917: 0x98AD, + 20918: 0x98AE, + 20919: 0x98AF, + 20920: 0x98B0, + 20921: 0x98B1, + 20922: 0x98B2, + 20923: 0x98B3, + 20924: 0x98B4, + 20925: 0x98B5, + 20926: 0x98B6, + 20927: 0x98B7, + 20928: 0x98B8, + 20929: 0x98B9, + 20930: 0x98BA, + 20931: 0x98BB, + 20932: 0x98BC, + 20933: 0x98BD, + 20934: 0x98BE, + 20935: 0x98BF, + 20936: 0x98C0, + 20937: 0x98C1, + 20938: 0x98C2, + 20939: 0x98C3, + 20940: 0x98C4, + 20941: 0x98C5, + 20942: 0x98C6, + 20943: 0x98C7, + 20944: 0x98C8, + 20945: 0x98C9, + 20946: 0x98CA, + 20947: 0x98CB, + 20948: 0x98CC, + 20949: 0x98CD, + 20950: 0x98CF, + 20951: 0x98D0, + 20952: 0x98D4, + 20953: 0x98D6, + 20954: 0x98D7, + 20955: 0x98DB, + 20956: 0x98DC, + 20957: 0x98DD, + 20958: 0x98E0, + 20959: 0x98E1, + 20960: 0x98E2, + 20961: 0x98E3, + 20962: 0x98E4, + 20963: 0x98E5, + 20964: 0x98E6, + 20965: 0x98E9, + 20966: 0x98EA, + 20967: 0x98EB, + 20968: 0x98EC, + 20969: 0x98ED, + 20970: 0x98EE, + 20971: 0x98EF, + 20972: 0x98F0, + 20973: 0x98F1, + 20974: 0x98F2, + 20975: 0x98F3, + 20976: 0x98F4, + 20977: 0x98F5, + 20978: 0x98F6, + 20979: 0x98F7, + 20980: 0x98F8, + 20981: 0x98F9, + 20982: 0x98FA, + 20983: 0x98FB, + 20984: 0x98FC, + 20985: 0x98FD, + 20986: 0x98FE, + 20987: 0x98FF, + 20988: 0x9900, + 20989: 0x9901, + 20990: 0x9902, + 20991: 0x9903, + 20992: 0x9904, + 20993: 0x9905, + 20994: 0x9906, + 20995: 0x9907, + 20996: 0x94E9, + 20997: 0x94EB, + 20998: 0x94EE, + 20999: 0x94EF, + 21000: 0x94F3, + 21001: 0x94F4, + 21002: 0x94F5, + 21003: 0x94F7, + 21004: 0x94F9, + 21005: 0x94FC, + 21006: 0x94FD, + 21007: 0x94FF, + 21008: 0x9503, + 21009: 0x9502, + 21010: 0x9506, + 21011: 0x9507, + 21012: 0x9509, + 21013: 0x950A, + 21014: 0x950D, + 21015: 0x950E, + 21016: 0x950F, + 21017: 0x9512, + 21018: 0x9513, + 21019: 0x9514, + 21020: 0x9515, + 21021: 0x9516, + 21022: 0x9518, + 21023: 0x951B, + 21024: 0x951D, + 21025: 0x951E, + 21026: 0x951F, + 21027: 0x9522, + 21028: 0x952A, + 21029: 0x952B, + 21030: 0x9529, + 21031: 0x952C, + 21032: 0x9531, + 21033: 0x9532, + 21034: 0x9534, + 21035: 0x9536, + 21036: 0x9537, + 21037: 0x9538, + 21038: 0x953C, + 21039: 0x953E, + 21040: 0x953F, + 21041: 0x9542, + 21042: 0x9535, + 21043: 0x9544, + 21044: 0x9545, + 21045: 0x9546, + 21046: 0x9549, + 21047: 0x954C, + 21048: 0x954E, + 21049: 0x954F, + 21050: 0x9552, + 21051: 0x9553, + 21052: 0x9554, + 21053: 0x9556, + 21054: 0x9557, + 21055: 0x9558, + 21056: 0x9559, + 21057: 0x955B, + 21058: 0x955E, + 21059: 0x955F, + 21060: 0x955D, + 21061: 0x9561, + 21062: 0x9562, + 21063: 0x9564, + 21064: 0x9565, + 21065: 0x9566, + 21066: 0x9567, + 21067: 0x9568, + 21068: 0x9569, + 21069: 0x956A, + 21070: 0x956B, + 21071: 0x956C, + 21072: 0x956F, + 21073: 0x9571, + 21074: 0x9572, + 21075: 0x9573, + 21076: 0x953A, + 21077: 0x77E7, + 21078: 0x77EC, + 21079: 0x96C9, + 21080: 0x79D5, + 21081: 0x79ED, + 21082: 0x79E3, + 21083: 0x79EB, + 21084: 0x7A06, + 21085: 0x5D47, + 21086: 0x7A03, + 21087: 0x7A02, + 21088: 0x7A1E, + 21089: 0x7A14, + 21090: 0x9908, + 21091: 0x9909, + 21092: 0x990A, + 21093: 0x990B, + 21094: 0x990C, + 21095: 0x990E, + 21096: 0x990F, + 21097: 0x9911, + 21098: 0x9912, + 21099: 0x9913, + 21100: 0x9914, + 21101: 0x9915, + 21102: 0x9916, + 21103: 0x9917, + 21104: 0x9918, + 21105: 0x9919, + 21106: 0x991A, + 21107: 0x991B, + 21108: 0x991C, + 21109: 0x991D, + 21110: 0x991E, + 21111: 0x991F, + 21112: 0x9920, + 21113: 0x9921, + 21114: 0x9922, + 21115: 0x9923, + 21116: 0x9924, + 21117: 0x9925, + 21118: 0x9926, + 21119: 0x9927, + 21120: 0x9928, + 21121: 0x9929, + 21122: 0x992A, + 21123: 0x992B, + 21124: 0x992C, + 21125: 0x992D, + 21126: 0x992F, + 21127: 0x9930, + 21128: 0x9931, + 21129: 0x9932, + 21130: 0x9933, + 21131: 0x9934, + 21132: 0x9935, + 21133: 0x9936, + 21134: 0x9937, + 21135: 0x9938, + 21136: 0x9939, + 21137: 0x993A, + 21138: 0x993B, + 21139: 0x993C, + 21140: 0x993D, + 21141: 0x993E, + 21142: 0x993F, + 21143: 0x9940, + 21144: 0x9941, + 21145: 0x9942, + 21146: 0x9943, + 21147: 0x9944, + 21148: 0x9945, + 21149: 0x9946, + 21150: 0x9947, + 21151: 0x9948, + 21152: 0x9949, + 21153: 0x994A, + 21154: 0x994B, + 21155: 0x994C, + 21156: 0x994D, + 21157: 0x994E, + 21158: 0x994F, + 21159: 0x9950, + 21160: 0x9951, + 21161: 0x9952, + 21162: 0x9953, + 21163: 0x9956, + 21164: 0x9957, + 21165: 0x9958, + 21166: 0x9959, + 21167: 0x995A, + 21168: 0x995B, + 21169: 0x995C, + 21170: 0x995D, + 21171: 0x995E, + 21172: 0x995F, + 21173: 0x9960, + 21174: 0x9961, + 21175: 0x9962, + 21176: 0x9964, + 21177: 0x9966, + 21178: 0x9973, + 21179: 0x9978, + 21180: 0x9979, + 21181: 0x997B, + 21182: 0x997E, + 21183: 0x9982, + 21184: 0x9983, + 21185: 0x9989, + 21186: 0x7A39, + 21187: 0x7A37, + 21188: 0x7A51, + 21189: 0x9ECF, + 21190: 0x99A5, + 21191: 0x7A70, + 21192: 0x7688, + 21193: 0x768E, + 21194: 0x7693, + 21195: 0x7699, + 21196: 0x76A4, + 21197: 0x74DE, + 21198: 0x74E0, + 21199: 0x752C, + 21200: 0x9E20, + 21201: 0x9E22, + 21202: 0x9E28, + 21203: 0x9E29, + 21204: 0x9E2A, + 21205: 0x9E2B, + 21206: 0x9E2C, + 21207: 0x9E32, + 21208: 0x9E31, + 21209: 0x9E36, + 21210: 0x9E38, + 21211: 0x9E37, + 21212: 0x9E39, + 21213: 0x9E3A, + 21214: 0x9E3E, + 21215: 0x9E41, + 21216: 0x9E42, + 21217: 0x9E44, + 21218: 0x9E46, + 21219: 0x9E47, + 21220: 0x9E48, + 21221: 0x9E49, + 21222: 0x9E4B, + 21223: 0x9E4C, + 21224: 0x9E4E, + 21225: 0x9E51, + 21226: 0x9E55, + 21227: 0x9E57, + 21228: 0x9E5A, + 21229: 0x9E5B, + 21230: 0x9E5C, + 21231: 0x9E5E, + 21232: 0x9E63, + 21233: 0x9E66, + 21234: 0x9E67, + 21235: 0x9E68, + 21236: 0x9E69, + 21237: 0x9E6A, + 21238: 0x9E6B, + 21239: 0x9E6C, + 21240: 0x9E71, + 21241: 0x9E6D, + 21242: 0x9E73, + 21243: 0x7592, + 21244: 0x7594, + 21245: 0x7596, + 21246: 0x75A0, + 21247: 0x759D, + 21248: 0x75AC, + 21249: 0x75A3, + 21250: 0x75B3, + 21251: 0x75B4, + 21252: 0x75B8, + 21253: 0x75C4, + 21254: 0x75B1, + 21255: 0x75B0, + 21256: 0x75C3, + 21257: 0x75C2, + 21258: 0x75D6, + 21259: 0x75CD, + 21260: 0x75E3, + 21261: 0x75E8, + 21262: 0x75E6, + 21263: 0x75E4, + 21264: 0x75EB, + 21265: 0x75E7, + 21266: 0x7603, + 21267: 0x75F1, + 21268: 0x75FC, + 21269: 0x75FF, + 21270: 0x7610, + 21271: 0x7600, + 21272: 0x7605, + 21273: 0x760C, + 21274: 0x7617, + 21275: 0x760A, + 21276: 0x7625, + 21277: 0x7618, + 21278: 0x7615, + 21279: 0x7619, + 21280: 0x998C, + 21281: 0x998E, + 21282: 0x999A, + 21283: 0x999B, + 21284: 0x999C, + 21285: 0x999D, + 21286: 0x999E, + 21287: 0x999F, + 21288: 0x99A0, + 21289: 0x99A1, + 21290: 0x99A2, + 21291: 0x99A3, + 21292: 0x99A4, + 21293: 0x99A6, + 21294: 0x99A7, + 21295: 0x99A9, + 21296: 0x99AA, + 21297: 0x99AB, + 21298: 0x99AC, + 21299: 0x99AD, + 21300: 0x99AE, + 21301: 0x99AF, + 21302: 0x99B0, + 21303: 0x99B1, + 21304: 0x99B2, + 21305: 0x99B3, + 21306: 0x99B4, + 21307: 0x99B5, + 21308: 0x99B6, + 21309: 0x99B7, + 21310: 0x99B8, + 21311: 0x99B9, + 21312: 0x99BA, + 21313: 0x99BB, + 21314: 0x99BC, + 21315: 0x99BD, + 21316: 0x99BE, + 21317: 0x99BF, + 21318: 0x99C0, + 21319: 0x99C1, + 21320: 0x99C2, + 21321: 0x99C3, + 21322: 0x99C4, + 21323: 0x99C5, + 21324: 0x99C6, + 21325: 0x99C7, + 21326: 0x99C8, + 21327: 0x99C9, + 21328: 0x99CA, + 21329: 0x99CB, + 21330: 0x99CC, + 21331: 0x99CD, + 21332: 0x99CE, + 21333: 0x99CF, + 21334: 0x99D0, + 21335: 0x99D1, + 21336: 0x99D2, + 21337: 0x99D3, + 21338: 0x99D4, + 21339: 0x99D5, + 21340: 0x99D6, + 21341: 0x99D7, + 21342: 0x99D8, + 21343: 0x99D9, + 21344: 0x99DA, + 21345: 0x99DB, + 21346: 0x99DC, + 21347: 0x99DD, + 21348: 0x99DE, + 21349: 0x99DF, + 21350: 0x99E0, + 21351: 0x99E1, + 21352: 0x99E2, + 21353: 0x99E3, + 21354: 0x99E4, + 21355: 0x99E5, + 21356: 0x99E6, + 21357: 0x99E7, + 21358: 0x99E8, + 21359: 0x99E9, + 21360: 0x99EA, + 21361: 0x99EB, + 21362: 0x99EC, + 21363: 0x99ED, + 21364: 0x99EE, + 21365: 0x99EF, + 21366: 0x99F0, + 21367: 0x99F1, + 21368: 0x99F2, + 21369: 0x99F3, + 21370: 0x99F4, + 21371: 0x99F5, + 21372: 0x99F6, + 21373: 0x99F7, + 21374: 0x99F8, + 21375: 0x99F9, + 21376: 0x761B, + 21377: 0x763C, + 21378: 0x7622, + 21379: 0x7620, + 21380: 0x7640, + 21381: 0x762D, + 21382: 0x7630, + 21383: 0x763F, + 21384: 0x7635, + 21385: 0x7643, + 21386: 0x763E, + 21387: 0x7633, + 21388: 0x764D, + 21389: 0x765E, + 21390: 0x7654, + 21391: 0x765C, + 21392: 0x7656, + 21393: 0x766B, + 21394: 0x766F, + 21395: 0x7FCA, + 21396: 0x7AE6, + 21397: 0x7A78, + 21398: 0x7A79, + 21399: 0x7A80, + 21400: 0x7A86, + 21401: 0x7A88, + 21402: 0x7A95, + 21403: 0x7AA6, + 21404: 0x7AA0, + 21405: 0x7AAC, + 21406: 0x7AA8, + 21407: 0x7AAD, + 21408: 0x7AB3, + 21409: 0x8864, + 21410: 0x8869, + 21411: 0x8872, + 21412: 0x887D, + 21413: 0x887F, + 21414: 0x8882, + 21415: 0x88A2, + 21416: 0x88C6, + 21417: 0x88B7, + 21418: 0x88BC, + 21419: 0x88C9, + 21420: 0x88E2, + 21421: 0x88CE, + 21422: 0x88E3, + 21423: 0x88E5, + 21424: 0x88F1, + 21425: 0x891A, + 21426: 0x88FC, + 21427: 0x88E8, + 21428: 0x88FE, + 21429: 0x88F0, + 21430: 0x8921, + 21431: 0x8919, + 21432: 0x8913, + 21433: 0x891B, + 21434: 0x890A, + 21435: 0x8934, + 21436: 0x892B, + 21437: 0x8936, + 21438: 0x8941, + 21439: 0x8966, + 21440: 0x897B, + 21441: 0x758B, + 21442: 0x80E5, + 21443: 0x76B2, + 21444: 0x76B4, + 21445: 0x77DC, + 21446: 0x8012, + 21447: 0x8014, + 21448: 0x8016, + 21449: 0x801C, + 21450: 0x8020, + 21451: 0x8022, + 21452: 0x8025, + 21453: 0x8026, + 21454: 0x8027, + 21455: 0x8029, + 21456: 0x8028, + 21457: 0x8031, + 21458: 0x800B, + 21459: 0x8035, + 21460: 0x8043, + 21461: 0x8046, + 21462: 0x804D, + 21463: 0x8052, + 21464: 0x8069, + 21465: 0x8071, + 21466: 0x8983, + 21467: 0x9878, + 21468: 0x9880, + 21469: 0x9883, + 21470: 0x99FA, + 21471: 0x99FB, + 21472: 0x99FC, + 21473: 0x99FD, + 21474: 0x99FE, + 21475: 0x99FF, + 21476: 0x9A00, + 21477: 0x9A01, + 21478: 0x9A02, + 21479: 0x9A03, + 21480: 0x9A04, + 21481: 0x9A05, + 21482: 0x9A06, + 21483: 0x9A07, + 21484: 0x9A08, + 21485: 0x9A09, + 21486: 0x9A0A, + 21487: 0x9A0B, + 21488: 0x9A0C, + 21489: 0x9A0D, + 21490: 0x9A0E, + 21491: 0x9A0F, + 21492: 0x9A10, + 21493: 0x9A11, + 21494: 0x9A12, + 21495: 0x9A13, + 21496: 0x9A14, + 21497: 0x9A15, + 21498: 0x9A16, + 21499: 0x9A17, + 21500: 0x9A18, + 21501: 0x9A19, + 21502: 0x9A1A, + 21503: 0x9A1B, + 21504: 0x9A1C, + 21505: 0x9A1D, + 21506: 0x9A1E, + 21507: 0x9A1F, + 21508: 0x9A20, + 21509: 0x9A21, + 21510: 0x9A22, + 21511: 0x9A23, + 21512: 0x9A24, + 21513: 0x9A25, + 21514: 0x9A26, + 21515: 0x9A27, + 21516: 0x9A28, + 21517: 0x9A29, + 21518: 0x9A2A, + 21519: 0x9A2B, + 21520: 0x9A2C, + 21521: 0x9A2D, + 21522: 0x9A2E, + 21523: 0x9A2F, + 21524: 0x9A30, + 21525: 0x9A31, + 21526: 0x9A32, + 21527: 0x9A33, + 21528: 0x9A34, + 21529: 0x9A35, + 21530: 0x9A36, + 21531: 0x9A37, + 21532: 0x9A38, + 21533: 0x9A39, + 21534: 0x9A3A, + 21535: 0x9A3B, + 21536: 0x9A3C, + 21537: 0x9A3D, + 21538: 0x9A3E, + 21539: 0x9A3F, + 21540: 0x9A40, + 21541: 0x9A41, + 21542: 0x9A42, + 21543: 0x9A43, + 21544: 0x9A44, + 21545: 0x9A45, + 21546: 0x9A46, + 21547: 0x9A47, + 21548: 0x9A48, + 21549: 0x9A49, + 21550: 0x9A4A, + 21551: 0x9A4B, + 21552: 0x9A4C, + 21553: 0x9A4D, + 21554: 0x9A4E, + 21555: 0x9A4F, + 21556: 0x9A50, + 21557: 0x9A51, + 21558: 0x9A52, + 21559: 0x9A53, + 21560: 0x9A54, + 21561: 0x9A55, + 21562: 0x9A56, + 21563: 0x9A57, + 21564: 0x9A58, + 21565: 0x9A59, + 21566: 0x9889, + 21567: 0x988C, + 21568: 0x988D, + 21569: 0x988F, + 21570: 0x9894, + 21571: 0x989A, + 21572: 0x989B, + 21573: 0x989E, + 21574: 0x989F, + 21575: 0x98A1, + 21576: 0x98A2, + 21577: 0x98A5, + 21578: 0x98A6, + 21579: 0x864D, + 21580: 0x8654, + 21581: 0x866C, + 21582: 0x866E, + 21583: 0x867F, + 21584: 0x867A, + 21585: 0x867C, + 21586: 0x867B, + 21587: 0x86A8, + 21588: 0x868D, + 21589: 0x868B, + 21590: 0x86AC, + 21591: 0x869D, + 21592: 0x86A7, + 21593: 0x86A3, + 21594: 0x86AA, + 21595: 0x8693, + 21596: 0x86A9, + 21597: 0x86B6, + 21598: 0x86C4, + 21599: 0x86B5, + 21600: 0x86CE, + 21601: 0x86B0, + 21602: 0x86BA, + 21603: 0x86B1, + 21604: 0x86AF, + 21605: 0x86C9, + 21606: 0x86CF, + 21607: 0x86B4, + 21608: 0x86E9, + 21609: 0x86F1, + 21610: 0x86F2, + 21611: 0x86ED, + 21612: 0x86F3, + 21613: 0x86D0, + 21614: 0x8713, + 21615: 0x86DE, + 21616: 0x86F4, + 21617: 0x86DF, + 21618: 0x86D8, + 21619: 0x86D1, + 21620: 0x8703, + 21621: 0x8707, + 21622: 0x86F8, + 21623: 0x8708, + 21624: 0x870A, + 21625: 0x870D, + 21626: 0x8709, + 21627: 0x8723, + 21628: 0x873B, + 21629: 0x871E, + 21630: 0x8725, + 21631: 0x872E, + 21632: 0x871A, + 21633: 0x873E, + 21634: 0x8748, + 21635: 0x8734, + 21636: 0x8731, + 21637: 0x8729, + 21638: 0x8737, + 21639: 0x873F, + 21640: 0x8782, + 21641: 0x8722, + 21642: 0x877D, + 21643: 0x877E, + 21644: 0x877B, + 21645: 0x8760, + 21646: 0x8770, + 21647: 0x874C, + 21648: 0x876E, + 21649: 0x878B, + 21650: 0x8753, + 21651: 0x8763, + 21652: 0x877C, + 21653: 0x8764, + 21654: 0x8759, + 21655: 0x8765, + 21656: 0x8793, + 21657: 0x87AF, + 21658: 0x87A8, + 21659: 0x87D2, + 21660: 0x9A5A, + 21661: 0x9A5B, + 21662: 0x9A5C, + 21663: 0x9A5D, + 21664: 0x9A5E, + 21665: 0x9A5F, + 21666: 0x9A60, + 21667: 0x9A61, + 21668: 0x9A62, + 21669: 0x9A63, + 21670: 0x9A64, + 21671: 0x9A65, + 21672: 0x9A66, + 21673: 0x9A67, + 21674: 0x9A68, + 21675: 0x9A69, + 21676: 0x9A6A, + 21677: 0x9A6B, + 21678: 0x9A72, + 21679: 0x9A83, + 21680: 0x9A89, + 21681: 0x9A8D, + 21682: 0x9A8E, + 21683: 0x9A94, + 21684: 0x9A95, + 21685: 0x9A99, + 21686: 0x9AA6, + 21687: 0x9AA9, + 21688: 0x9AAA, + 21689: 0x9AAB, + 21690: 0x9AAC, + 21691: 0x9AAD, + 21692: 0x9AAE, + 21693: 0x9AAF, + 21694: 0x9AB2, + 21695: 0x9AB3, + 21696: 0x9AB4, + 21697: 0x9AB5, + 21698: 0x9AB9, + 21699: 0x9ABB, + 21700: 0x9ABD, + 21701: 0x9ABE, + 21702: 0x9ABF, + 21703: 0x9AC3, + 21704: 0x9AC4, + 21705: 0x9AC6, + 21706: 0x9AC7, + 21707: 0x9AC8, + 21708: 0x9AC9, + 21709: 0x9ACA, + 21710: 0x9ACD, + 21711: 0x9ACE, + 21712: 0x9ACF, + 21713: 0x9AD0, + 21714: 0x9AD2, + 21715: 0x9AD4, + 21716: 0x9AD5, + 21717: 0x9AD6, + 21718: 0x9AD7, + 21719: 0x9AD9, + 21720: 0x9ADA, + 21721: 0x9ADB, + 21722: 0x9ADC, + 21723: 0x9ADD, + 21724: 0x9ADE, + 21725: 0x9AE0, + 21726: 0x9AE2, + 21727: 0x9AE3, + 21728: 0x9AE4, + 21729: 0x9AE5, + 21730: 0x9AE7, + 21731: 0x9AE8, + 21732: 0x9AE9, + 21733: 0x9AEA, + 21734: 0x9AEC, + 21735: 0x9AEE, + 21736: 0x9AF0, + 21737: 0x9AF1, + 21738: 0x9AF2, + 21739: 0x9AF3, + 21740: 0x9AF4, + 21741: 0x9AF5, + 21742: 0x9AF6, + 21743: 0x9AF7, + 21744: 0x9AF8, + 21745: 0x9AFA, + 21746: 0x9AFC, + 21747: 0x9AFD, + 21748: 0x9AFE, + 21749: 0x9AFF, + 21750: 0x9B00, + 21751: 0x9B01, + 21752: 0x9B02, + 21753: 0x9B04, + 21754: 0x9B05, + 21755: 0x9B06, + 21756: 0x87C6, + 21757: 0x8788, + 21758: 0x8785, + 21759: 0x87AD, + 21760: 0x8797, + 21761: 0x8783, + 21762: 0x87AB, + 21763: 0x87E5, + 21764: 0x87AC, + 21765: 0x87B5, + 21766: 0x87B3, + 21767: 0x87CB, + 21768: 0x87D3, + 21769: 0x87BD, + 21770: 0x87D1, + 21771: 0x87C0, + 21772: 0x87CA, + 21773: 0x87DB, + 21774: 0x87EA, + 21775: 0x87E0, + 21776: 0x87EE, + 21777: 0x8816, + 21778: 0x8813, + 21779: 0x87FE, + 21780: 0x880A, + 21781: 0x881B, + 21782: 0x8821, + 21783: 0x8839, + 21784: 0x883C, + 21785: 0x7F36, + 21786: 0x7F42, + 21787: 0x7F44, + 21788: 0x7F45, + 21789: 0x8210, + 21790: 0x7AFA, + 21791: 0x7AFD, + 21792: 0x7B08, + 21793: 0x7B03, + 21794: 0x7B04, + 21795: 0x7B15, + 21796: 0x7B0A, + 21797: 0x7B2B, + 21798: 0x7B0F, + 21799: 0x7B47, + 21800: 0x7B38, + 21801: 0x7B2A, + 21802: 0x7B19, + 21803: 0x7B2E, + 21804: 0x7B31, + 21805: 0x7B20, + 21806: 0x7B25, + 21807: 0x7B24, + 21808: 0x7B33, + 21809: 0x7B3E, + 21810: 0x7B1E, + 21811: 0x7B58, + 21812: 0x7B5A, + 21813: 0x7B45, + 21814: 0x7B75, + 21815: 0x7B4C, + 21816: 0x7B5D, + 21817: 0x7B60, + 21818: 0x7B6E, + 21819: 0x7B7B, + 21820: 0x7B62, + 21821: 0x7B72, + 21822: 0x7B71, + 21823: 0x7B90, + 21824: 0x7BA6, + 21825: 0x7BA7, + 21826: 0x7BB8, + 21827: 0x7BAC, + 21828: 0x7B9D, + 21829: 0x7BA8, + 21830: 0x7B85, + 21831: 0x7BAA, + 21832: 0x7B9C, + 21833: 0x7BA2, + 21834: 0x7BAB, + 21835: 0x7BB4, + 21836: 0x7BD1, + 21837: 0x7BC1, + 21838: 0x7BCC, + 21839: 0x7BDD, + 21840: 0x7BDA, + 21841: 0x7BE5, + 21842: 0x7BE6, + 21843: 0x7BEA, + 21844: 0x7C0C, + 21845: 0x7BFE, + 21846: 0x7BFC, + 21847: 0x7C0F, + 21848: 0x7C16, + 21849: 0x7C0B, + 21850: 0x9B07, + 21851: 0x9B09, + 21852: 0x9B0A, + 21853: 0x9B0B, + 21854: 0x9B0C, + 21855: 0x9B0D, + 21856: 0x9B0E, + 21857: 0x9B10, + 21858: 0x9B11, + 21859: 0x9B12, + 21860: 0x9B14, + 21861: 0x9B15, + 21862: 0x9B16, + 21863: 0x9B17, + 21864: 0x9B18, + 21865: 0x9B19, + 21866: 0x9B1A, + 21867: 0x9B1B, + 21868: 0x9B1C, + 21869: 0x9B1D, + 21870: 0x9B1E, + 21871: 0x9B20, + 21872: 0x9B21, + 21873: 0x9B22, + 21874: 0x9B24, + 21875: 0x9B25, + 21876: 0x9B26, + 21877: 0x9B27, + 21878: 0x9B28, + 21879: 0x9B29, + 21880: 0x9B2A, + 21881: 0x9B2B, + 21882: 0x9B2C, + 21883: 0x9B2D, + 21884: 0x9B2E, + 21885: 0x9B30, + 21886: 0x9B31, + 21887: 0x9B33, + 21888: 0x9B34, + 21889: 0x9B35, + 21890: 0x9B36, + 21891: 0x9B37, + 21892: 0x9B38, + 21893: 0x9B39, + 21894: 0x9B3A, + 21895: 0x9B3D, + 21896: 0x9B3E, + 21897: 0x9B3F, + 21898: 0x9B40, + 21899: 0x9B46, + 21900: 0x9B4A, + 21901: 0x9B4B, + 21902: 0x9B4C, + 21903: 0x9B4E, + 21904: 0x9B50, + 21905: 0x9B52, + 21906: 0x9B53, + 21907: 0x9B55, + 21908: 0x9B56, + 21909: 0x9B57, + 21910: 0x9B58, + 21911: 0x9B59, + 21912: 0x9B5A, + 21913: 0x9B5B, + 21914: 0x9B5C, + 21915: 0x9B5D, + 21916: 0x9B5E, + 21917: 0x9B5F, + 21918: 0x9B60, + 21919: 0x9B61, + 21920: 0x9B62, + 21921: 0x9B63, + 21922: 0x9B64, + 21923: 0x9B65, + 21924: 0x9B66, + 21925: 0x9B67, + 21926: 0x9B68, + 21927: 0x9B69, + 21928: 0x9B6A, + 21929: 0x9B6B, + 21930: 0x9B6C, + 21931: 0x9B6D, + 21932: 0x9B6E, + 21933: 0x9B6F, + 21934: 0x9B70, + 21935: 0x9B71, + 21936: 0x9B72, + 21937: 0x9B73, + 21938: 0x9B74, + 21939: 0x9B75, + 21940: 0x9B76, + 21941: 0x9B77, + 21942: 0x9B78, + 21943: 0x9B79, + 21944: 0x9B7A, + 21945: 0x9B7B, + 21946: 0x7C1F, + 21947: 0x7C2A, + 21948: 0x7C26, + 21949: 0x7C38, + 21950: 0x7C41, + 21951: 0x7C40, + 21952: 0x81FE, + 21953: 0x8201, + 21954: 0x8202, + 21955: 0x8204, + 21956: 0x81EC, + 21957: 0x8844, + 21958: 0x8221, + 21959: 0x8222, + 21960: 0x8223, + 21961: 0x822D, + 21962: 0x822F, + 21963: 0x8228, + 21964: 0x822B, + 21965: 0x8238, + 21966: 0x823B, + 21967: 0x8233, + 21968: 0x8234, + 21969: 0x823E, + 21970: 0x8244, + 21971: 0x8249, + 21972: 0x824B, + 21973: 0x824F, + 21974: 0x825A, + 21975: 0x825F, + 21976: 0x8268, + 21977: 0x887E, + 21978: 0x8885, + 21979: 0x8888, + 21980: 0x88D8, + 21981: 0x88DF, + 21982: 0x895E, + 21983: 0x7F9D, + 21984: 0x7F9F, + 21985: 0x7FA7, + 21986: 0x7FAF, + 21987: 0x7FB0, + 21988: 0x7FB2, + 21989: 0x7C7C, + 21990: 0x6549, + 21991: 0x7C91, + 21992: 0x7C9D, + 21993: 0x7C9C, + 21994: 0x7C9E, + 21995: 0x7CA2, + 21996: 0x7CB2, + 21997: 0x7CBC, + 21998: 0x7CBD, + 21999: 0x7CC1, + 22000: 0x7CC7, + 22001: 0x7CCC, + 22002: 0x7CCD, + 22003: 0x7CC8, + 22004: 0x7CC5, + 22005: 0x7CD7, + 22006: 0x7CE8, + 22007: 0x826E, + 22008: 0x66A8, + 22009: 0x7FBF, + 22010: 0x7FCE, + 22011: 0x7FD5, + 22012: 0x7FE5, + 22013: 0x7FE1, + 22014: 0x7FE6, + 22015: 0x7FE9, + 22016: 0x7FEE, + 22017: 0x7FF3, + 22018: 0x7CF8, + 22019: 0x7D77, + 22020: 0x7DA6, + 22021: 0x7DAE, + 22022: 0x7E47, + 22023: 0x7E9B, + 22024: 0x9EB8, + 22025: 0x9EB4, + 22026: 0x8D73, + 22027: 0x8D84, + 22028: 0x8D94, + 22029: 0x8D91, + 22030: 0x8DB1, + 22031: 0x8D67, + 22032: 0x8D6D, + 22033: 0x8C47, + 22034: 0x8C49, + 22035: 0x914A, + 22036: 0x9150, + 22037: 0x914E, + 22038: 0x914F, + 22039: 0x9164, + 22040: 0x9B7C, + 22041: 0x9B7D, + 22042: 0x9B7E, + 22043: 0x9B7F, + 22044: 0x9B80, + 22045: 0x9B81, + 22046: 0x9B82, + 22047: 0x9B83, + 22048: 0x9B84, + 22049: 0x9B85, + 22050: 0x9B86, + 22051: 0x9B87, + 22052: 0x9B88, + 22053: 0x9B89, + 22054: 0x9B8A, + 22055: 0x9B8B, + 22056: 0x9B8C, + 22057: 0x9B8D, + 22058: 0x9B8E, + 22059: 0x9B8F, + 22060: 0x9B90, + 22061: 0x9B91, + 22062: 0x9B92, + 22063: 0x9B93, + 22064: 0x9B94, + 22065: 0x9B95, + 22066: 0x9B96, + 22067: 0x9B97, + 22068: 0x9B98, + 22069: 0x9B99, + 22070: 0x9B9A, + 22071: 0x9B9B, + 22072: 0x9B9C, + 22073: 0x9B9D, + 22074: 0x9B9E, + 22075: 0x9B9F, + 22076: 0x9BA0, + 22077: 0x9BA1, + 22078: 0x9BA2, + 22079: 0x9BA3, + 22080: 0x9BA4, + 22081: 0x9BA5, + 22082: 0x9BA6, + 22083: 0x9BA7, + 22084: 0x9BA8, + 22085: 0x9BA9, + 22086: 0x9BAA, + 22087: 0x9BAB, + 22088: 0x9BAC, + 22089: 0x9BAD, + 22090: 0x9BAE, + 22091: 0x9BAF, + 22092: 0x9BB0, + 22093: 0x9BB1, + 22094: 0x9BB2, + 22095: 0x9BB3, + 22096: 0x9BB4, + 22097: 0x9BB5, + 22098: 0x9BB6, + 22099: 0x9BB7, + 22100: 0x9BB8, + 22101: 0x9BB9, + 22102: 0x9BBA, + 22103: 0x9BBB, + 22104: 0x9BBC, + 22105: 0x9BBD, + 22106: 0x9BBE, + 22107: 0x9BBF, + 22108: 0x9BC0, + 22109: 0x9BC1, + 22110: 0x9BC2, + 22111: 0x9BC3, + 22112: 0x9BC4, + 22113: 0x9BC5, + 22114: 0x9BC6, + 22115: 0x9BC7, + 22116: 0x9BC8, + 22117: 0x9BC9, + 22118: 0x9BCA, + 22119: 0x9BCB, + 22120: 0x9BCC, + 22121: 0x9BCD, + 22122: 0x9BCE, + 22123: 0x9BCF, + 22124: 0x9BD0, + 22125: 0x9BD1, + 22126: 0x9BD2, + 22127: 0x9BD3, + 22128: 0x9BD4, + 22129: 0x9BD5, + 22130: 0x9BD6, + 22131: 0x9BD7, + 22132: 0x9BD8, + 22133: 0x9BD9, + 22134: 0x9BDA, + 22135: 0x9BDB, + 22136: 0x9162, + 22137: 0x9161, + 22138: 0x9170, + 22139: 0x9169, + 22140: 0x916F, + 22141: 0x917D, + 22142: 0x917E, + 22143: 0x9172, + 22144: 0x9174, + 22145: 0x9179, + 22146: 0x918C, + 22147: 0x9185, + 22148: 0x9190, + 22149: 0x918D, + 22150: 0x9191, + 22151: 0x91A2, + 22152: 0x91A3, + 22153: 0x91AA, + 22154: 0x91AD, + 22155: 0x91AE, + 22156: 0x91AF, + 22157: 0x91B5, + 22158: 0x91B4, + 22159: 0x91BA, + 22160: 0x8C55, + 22161: 0x9E7E, + 22162: 0x8DB8, + 22163: 0x8DEB, + 22164: 0x8E05, + 22165: 0x8E59, + 22166: 0x8E69, + 22167: 0x8DB5, + 22168: 0x8DBF, + 22169: 0x8DBC, + 22170: 0x8DBA, + 22171: 0x8DC4, + 22172: 0x8DD6, + 22173: 0x8DD7, + 22174: 0x8DDA, + 22175: 0x8DDE, + 22176: 0x8DCE, + 22177: 0x8DCF, + 22178: 0x8DDB, + 22179: 0x8DC6, + 22180: 0x8DEC, + 22181: 0x8DF7, + 22182: 0x8DF8, + 22183: 0x8DE3, + 22184: 0x8DF9, + 22185: 0x8DFB, + 22186: 0x8DE4, + 22187: 0x8E09, + 22188: 0x8DFD, + 22189: 0x8E14, + 22190: 0x8E1D, + 22191: 0x8E1F, + 22192: 0x8E2C, + 22193: 0x8E2E, + 22194: 0x8E23, + 22195: 0x8E2F, + 22196: 0x8E3A, + 22197: 0x8E40, + 22198: 0x8E39, + 22199: 0x8E35, + 22200: 0x8E3D, + 22201: 0x8E31, + 22202: 0x8E49, + 22203: 0x8E41, + 22204: 0x8E42, + 22205: 0x8E51, + 22206: 0x8E52, + 22207: 0x8E4A, + 22208: 0x8E70, + 22209: 0x8E76, + 22210: 0x8E7C, + 22211: 0x8E6F, + 22212: 0x8E74, + 22213: 0x8E85, + 22214: 0x8E8F, + 22215: 0x8E94, + 22216: 0x8E90, + 22217: 0x8E9C, + 22218: 0x8E9E, + 22219: 0x8C78, + 22220: 0x8C82, + 22221: 0x8C8A, + 22222: 0x8C85, + 22223: 0x8C98, + 22224: 0x8C94, + 22225: 0x659B, + 22226: 0x89D6, + 22227: 0x89DE, + 22228: 0x89DA, + 22229: 0x89DC, + 22230: 0x9BDC, + 22231: 0x9BDD, + 22232: 0x9BDE, + 22233: 0x9BDF, + 22234: 0x9BE0, + 22235: 0x9BE1, + 22236: 0x9BE2, + 22237: 0x9BE3, + 22238: 0x9BE4, + 22239: 0x9BE5, + 22240: 0x9BE6, + 22241: 0x9BE7, + 22242: 0x9BE8, + 22243: 0x9BE9, + 22244: 0x9BEA, + 22245: 0x9BEB, + 22246: 0x9BEC, + 22247: 0x9BED, + 22248: 0x9BEE, + 22249: 0x9BEF, + 22250: 0x9BF0, + 22251: 0x9BF1, + 22252: 0x9BF2, + 22253: 0x9BF3, + 22254: 0x9BF4, + 22255: 0x9BF5, + 22256: 0x9BF6, + 22257: 0x9BF7, + 22258: 0x9BF8, + 22259: 0x9BF9, + 22260: 0x9BFA, + 22261: 0x9BFB, + 22262: 0x9BFC, + 22263: 0x9BFD, + 22264: 0x9BFE, + 22265: 0x9BFF, + 22266: 0x9C00, + 22267: 0x9C01, + 22268: 0x9C02, + 22269: 0x9C03, + 22270: 0x9C04, + 22271: 0x9C05, + 22272: 0x9C06, + 22273: 0x9C07, + 22274: 0x9C08, + 22275: 0x9C09, + 22276: 0x9C0A, + 22277: 0x9C0B, + 22278: 0x9C0C, + 22279: 0x9C0D, + 22280: 0x9C0E, + 22281: 0x9C0F, + 22282: 0x9C10, + 22283: 0x9C11, + 22284: 0x9C12, + 22285: 0x9C13, + 22286: 0x9C14, + 22287: 0x9C15, + 22288: 0x9C16, + 22289: 0x9C17, + 22290: 0x9C18, + 22291: 0x9C19, + 22292: 0x9C1A, + 22293: 0x9C1B, + 22294: 0x9C1C, + 22295: 0x9C1D, + 22296: 0x9C1E, + 22297: 0x9C1F, + 22298: 0x9C20, + 22299: 0x9C21, + 22300: 0x9C22, + 22301: 0x9C23, + 22302: 0x9C24, + 22303: 0x9C25, + 22304: 0x9C26, + 22305: 0x9C27, + 22306: 0x9C28, + 22307: 0x9C29, + 22308: 0x9C2A, + 22309: 0x9C2B, + 22310: 0x9C2C, + 22311: 0x9C2D, + 22312: 0x9C2E, + 22313: 0x9C2F, + 22314: 0x9C30, + 22315: 0x9C31, + 22316: 0x9C32, + 22317: 0x9C33, + 22318: 0x9C34, + 22319: 0x9C35, + 22320: 0x9C36, + 22321: 0x9C37, + 22322: 0x9C38, + 22323: 0x9C39, + 22324: 0x9C3A, + 22325: 0x9C3B, + 22326: 0x89E5, + 22327: 0x89EB, + 22328: 0x89EF, + 22329: 0x8A3E, + 22330: 0x8B26, + 22331: 0x9753, + 22332: 0x96E9, + 22333: 0x96F3, + 22334: 0x96EF, + 22335: 0x9706, + 22336: 0x9701, + 22337: 0x9708, + 22338: 0x970F, + 22339: 0x970E, + 22340: 0x972A, + 22341: 0x972D, + 22342: 0x9730, + 22343: 0x973E, + 22344: 0x9F80, + 22345: 0x9F83, + 22346: 0x9F85, + 22347: 0x9F86, + 22348: 0x9F87, + 22349: 0x9F88, + 22350: 0x9F89, + 22351: 0x9F8A, + 22352: 0x9F8C, + 22353: 0x9EFE, + 22354: 0x9F0B, + 22355: 0x9F0D, + 22356: 0x96B9, + 22357: 0x96BC, + 22358: 0x96BD, + 22359: 0x96CE, + 22360: 0x96D2, + 22361: 0x77BF, + 22362: 0x96E0, + 22363: 0x928E, + 22364: 0x92AE, + 22365: 0x92C8, + 22366: 0x933E, + 22367: 0x936A, + 22368: 0x93CA, + 22369: 0x938F, + 22370: 0x943E, + 22371: 0x946B, + 22372: 0x9C7F, + 22373: 0x9C82, + 22374: 0x9C85, + 22375: 0x9C86, + 22376: 0x9C87, + 22377: 0x9C88, + 22378: 0x7A23, + 22379: 0x9C8B, + 22380: 0x9C8E, + 22381: 0x9C90, + 22382: 0x9C91, + 22383: 0x9C92, + 22384: 0x9C94, + 22385: 0x9C95, + 22386: 0x9C9A, + 22387: 0x9C9B, + 22388: 0x9C9E, + 22389: 0x9C9F, + 22390: 0x9CA0, + 22391: 0x9CA1, + 22392: 0x9CA2, + 22393: 0x9CA3, + 22394: 0x9CA5, + 22395: 0x9CA6, + 22396: 0x9CA7, + 22397: 0x9CA8, + 22398: 0x9CA9, + 22399: 0x9CAB, + 22400: 0x9CAD, + 22401: 0x9CAE, + 22402: 0x9CB0, + 22403: 0x9CB1, + 22404: 0x9CB2, + 22405: 0x9CB3, + 22406: 0x9CB4, + 22407: 0x9CB5, + 22408: 0x9CB6, + 22409: 0x9CB7, + 22410: 0x9CBA, + 22411: 0x9CBB, + 22412: 0x9CBC, + 22413: 0x9CBD, + 22414: 0x9CC4, + 22415: 0x9CC5, + 22416: 0x9CC6, + 22417: 0x9CC7, + 22418: 0x9CCA, + 22419: 0x9CCB, + 22420: 0x9C3C, + 22421: 0x9C3D, + 22422: 0x9C3E, + 22423: 0x9C3F, + 22424: 0x9C40, + 22425: 0x9C41, + 22426: 0x9C42, + 22427: 0x9C43, + 22428: 0x9C44, + 22429: 0x9C45, + 22430: 0x9C46, + 22431: 0x9C47, + 22432: 0x9C48, + 22433: 0x9C49, + 22434: 0x9C4A, + 22435: 0x9C4B, + 22436: 0x9C4C, + 22437: 0x9C4D, + 22438: 0x9C4E, + 22439: 0x9C4F, + 22440: 0x9C50, + 22441: 0x9C51, + 22442: 0x9C52, + 22443: 0x9C53, + 22444: 0x9C54, + 22445: 0x9C55, + 22446: 0x9C56, + 22447: 0x9C57, + 22448: 0x9C58, + 22449: 0x9C59, + 22450: 0x9C5A, + 22451: 0x9C5B, + 22452: 0x9C5C, + 22453: 0x9C5D, + 22454: 0x9C5E, + 22455: 0x9C5F, + 22456: 0x9C60, + 22457: 0x9C61, + 22458: 0x9C62, + 22459: 0x9C63, + 22460: 0x9C64, + 22461: 0x9C65, + 22462: 0x9C66, + 22463: 0x9C67, + 22464: 0x9C68, + 22465: 0x9C69, + 22466: 0x9C6A, + 22467: 0x9C6B, + 22468: 0x9C6C, + 22469: 0x9C6D, + 22470: 0x9C6E, + 22471: 0x9C6F, + 22472: 0x9C70, + 22473: 0x9C71, + 22474: 0x9C72, + 22475: 0x9C73, + 22476: 0x9C74, + 22477: 0x9C75, + 22478: 0x9C76, + 22479: 0x9C77, + 22480: 0x9C78, + 22481: 0x9C79, + 22482: 0x9C7A, + 22483: 0x9C7B, + 22484: 0x9C7D, + 22485: 0x9C7E, + 22486: 0x9C80, + 22487: 0x9C83, + 22488: 0x9C84, + 22489: 0x9C89, + 22490: 0x9C8A, + 22491: 0x9C8C, + 22492: 0x9C8F, + 22493: 0x9C93, + 22494: 0x9C96, + 22495: 0x9C97, + 22496: 0x9C98, + 22497: 0x9C99, + 22498: 0x9C9D, + 22499: 0x9CAA, + 22500: 0x9CAC, + 22501: 0x9CAF, + 22502: 0x9CB9, + 22503: 0x9CBE, + 22504: 0x9CBF, + 22505: 0x9CC0, + 22506: 0x9CC1, + 22507: 0x9CC2, + 22508: 0x9CC8, + 22509: 0x9CC9, + 22510: 0x9CD1, + 22511: 0x9CD2, + 22512: 0x9CDA, + 22513: 0x9CDB, + 22514: 0x9CE0, + 22515: 0x9CE1, + 22516: 0x9CCC, + 22517: 0x9CCD, + 22518: 0x9CCE, + 22519: 0x9CCF, + 22520: 0x9CD0, + 22521: 0x9CD3, + 22522: 0x9CD4, + 22523: 0x9CD5, + 22524: 0x9CD7, + 22525: 0x9CD8, + 22526: 0x9CD9, + 22527: 0x9CDC, + 22528: 0x9CDD, + 22529: 0x9CDF, + 22530: 0x9CE2, + 22531: 0x977C, + 22532: 0x9785, + 22533: 0x9791, + 22534: 0x9792, + 22535: 0x9794, + 22536: 0x97AF, + 22537: 0x97AB, + 22538: 0x97A3, + 22539: 0x97B2, + 22540: 0x97B4, + 22541: 0x9AB1, + 22542: 0x9AB0, + 22543: 0x9AB7, + 22544: 0x9E58, + 22545: 0x9AB6, + 22546: 0x9ABA, + 22547: 0x9ABC, + 22548: 0x9AC1, + 22549: 0x9AC0, + 22550: 0x9AC5, + 22551: 0x9AC2, + 22552: 0x9ACB, + 22553: 0x9ACC, + 22554: 0x9AD1, + 22555: 0x9B45, + 22556: 0x9B43, + 22557: 0x9B47, + 22558: 0x9B49, + 22559: 0x9B48, + 22560: 0x9B4D, + 22561: 0x9B51, + 22562: 0x98E8, + 22563: 0x990D, + 22564: 0x992E, + 22565: 0x9955, + 22566: 0x9954, + 22567: 0x9ADF, + 22568: 0x9AE1, + 22569: 0x9AE6, + 22570: 0x9AEF, + 22571: 0x9AEB, + 22572: 0x9AFB, + 22573: 0x9AED, + 22574: 0x9AF9, + 22575: 0x9B08, + 22576: 0x9B0F, + 22577: 0x9B13, + 22578: 0x9B1F, + 22579: 0x9B23, + 22580: 0x9EBD, + 22581: 0x9EBE, + 22582: 0x7E3B, + 22583: 0x9E82, + 22584: 0x9E87, + 22585: 0x9E88, + 22586: 0x9E8B, + 22587: 0x9E92, + 22588: 0x93D6, + 22589: 0x9E9D, + 22590: 0x9E9F, + 22591: 0x9EDB, + 22592: 0x9EDC, + 22593: 0x9EDD, + 22594: 0x9EE0, + 22595: 0x9EDF, + 22596: 0x9EE2, + 22597: 0x9EE9, + 22598: 0x9EE7, + 22599: 0x9EE5, + 22600: 0x9EEA, + 22601: 0x9EEF, + 22602: 0x9F22, + 22603: 0x9F2C, + 22604: 0x9F2F, + 22605: 0x9F39, + 22606: 0x9F37, + 22607: 0x9F3D, + 22608: 0x9F3E, + 22609: 0x9F44, + 22610: 0x9CE3, + 22611: 0x9CE4, + 22612: 0x9CE5, + 22613: 0x9CE6, + 22614: 0x9CE7, + 22615: 0x9CE8, + 22616: 0x9CE9, + 22617: 0x9CEA, + 22618: 0x9CEB, + 22619: 0x9CEC, + 22620: 0x9CED, + 22621: 0x9CEE, + 22622: 0x9CEF, + 22623: 0x9CF0, + 22624: 0x9CF1, + 22625: 0x9CF2, + 22626: 0x9CF3, + 22627: 0x9CF4, + 22628: 0x9CF5, + 22629: 0x9CF6, + 22630: 0x9CF7, + 22631: 0x9CF8, + 22632: 0x9CF9, + 22633: 0x9CFA, + 22634: 0x9CFB, + 22635: 0x9CFC, + 22636: 0x9CFD, + 22637: 0x9CFE, + 22638: 0x9CFF, + 22639: 0x9D00, + 22640: 0x9D01, + 22641: 0x9D02, + 22642: 0x9D03, + 22643: 0x9D04, + 22644: 0x9D05, + 22645: 0x9D06, + 22646: 0x9D07, + 22647: 0x9D08, + 22648: 0x9D09, + 22649: 0x9D0A, + 22650: 0x9D0B, + 22651: 0x9D0C, + 22652: 0x9D0D, + 22653: 0x9D0E, + 22654: 0x9D0F, + 22655: 0x9D10, + 22656: 0x9D11, + 22657: 0x9D12, + 22658: 0x9D13, + 22659: 0x9D14, + 22660: 0x9D15, + 22661: 0x9D16, + 22662: 0x9D17, + 22663: 0x9D18, + 22664: 0x9D19, + 22665: 0x9D1A, + 22666: 0x9D1B, + 22667: 0x9D1C, + 22668: 0x9D1D, + 22669: 0x9D1E, + 22670: 0x9D1F, + 22671: 0x9D20, + 22672: 0x9D21, + 22673: 0x9D22, + 22674: 0x9D23, + 22675: 0x9D24, + 22676: 0x9D25, + 22677: 0x9D26, + 22678: 0x9D27, + 22679: 0x9D28, + 22680: 0x9D29, + 22681: 0x9D2A, + 22682: 0x9D2B, + 22683: 0x9D2C, + 22684: 0x9D2D, + 22685: 0x9D2E, + 22686: 0x9D2F, + 22687: 0x9D30, + 22688: 0x9D31, + 22689: 0x9D32, + 22690: 0x9D33, + 22691: 0x9D34, + 22692: 0x9D35, + 22693: 0x9D36, + 22694: 0x9D37, + 22695: 0x9D38, + 22696: 0x9D39, + 22697: 0x9D3A, + 22698: 0x9D3B, + 22699: 0x9D3C, + 22700: 0x9D3D, + 22701: 0x9D3E, + 22702: 0x9D3F, + 22703: 0x9D40, + 22704: 0x9D41, + 22705: 0x9D42, + 22800: 0x9D43, + 22801: 0x9D44, + 22802: 0x9D45, + 22803: 0x9D46, + 22804: 0x9D47, + 22805: 0x9D48, + 22806: 0x9D49, + 22807: 0x9D4A, + 22808: 0x9D4B, + 22809: 0x9D4C, + 22810: 0x9D4D, + 22811: 0x9D4E, + 22812: 0x9D4F, + 22813: 0x9D50, + 22814: 0x9D51, + 22815: 0x9D52, + 22816: 0x9D53, + 22817: 0x9D54, + 22818: 0x9D55, + 22819: 0x9D56, + 22820: 0x9D57, + 22821: 0x9D58, + 22822: 0x9D59, + 22823: 0x9D5A, + 22824: 0x9D5B, + 22825: 0x9D5C, + 22826: 0x9D5D, + 22827: 0x9D5E, + 22828: 0x9D5F, + 22829: 0x9D60, + 22830: 0x9D61, + 22831: 0x9D62, + 22832: 0x9D63, + 22833: 0x9D64, + 22834: 0x9D65, + 22835: 0x9D66, + 22836: 0x9D67, + 22837: 0x9D68, + 22838: 0x9D69, + 22839: 0x9D6A, + 22840: 0x9D6B, + 22841: 0x9D6C, + 22842: 0x9D6D, + 22843: 0x9D6E, + 22844: 0x9D6F, + 22845: 0x9D70, + 22846: 0x9D71, + 22847: 0x9D72, + 22848: 0x9D73, + 22849: 0x9D74, + 22850: 0x9D75, + 22851: 0x9D76, + 22852: 0x9D77, + 22853: 0x9D78, + 22854: 0x9D79, + 22855: 0x9D7A, + 22856: 0x9D7B, + 22857: 0x9D7C, + 22858: 0x9D7D, + 22859: 0x9D7E, + 22860: 0x9D7F, + 22861: 0x9D80, + 22862: 0x9D81, + 22863: 0x9D82, + 22864: 0x9D83, + 22865: 0x9D84, + 22866: 0x9D85, + 22867: 0x9D86, + 22868: 0x9D87, + 22869: 0x9D88, + 22870: 0x9D89, + 22871: 0x9D8A, + 22872: 0x9D8B, + 22873: 0x9D8C, + 22874: 0x9D8D, + 22875: 0x9D8E, + 22876: 0x9D8F, + 22877: 0x9D90, + 22878: 0x9D91, + 22879: 0x9D92, + 22880: 0x9D93, + 22881: 0x9D94, + 22882: 0x9D95, + 22883: 0x9D96, + 22884: 0x9D97, + 22885: 0x9D98, + 22886: 0x9D99, + 22887: 0x9D9A, + 22888: 0x9D9B, + 22889: 0x9D9C, + 22890: 0x9D9D, + 22891: 0x9D9E, + 22892: 0x9D9F, + 22893: 0x9DA0, + 22894: 0x9DA1, + 22895: 0x9DA2, + 22990: 0x9DA3, + 22991: 0x9DA4, + 22992: 0x9DA5, + 22993: 0x9DA6, + 22994: 0x9DA7, + 22995: 0x9DA8, + 22996: 0x9DA9, + 22997: 0x9DAA, + 22998: 0x9DAB, + 22999: 0x9DAC, + 23000: 0x9DAD, + 23001: 0x9DAE, + 23002: 0x9DAF, + 23003: 0x9DB0, + 23004: 0x9DB1, + 23005: 0x9DB2, + 23006: 0x9DB3, + 23007: 0x9DB4, + 23008: 0x9DB5, + 23009: 0x9DB6, + 23010: 0x9DB7, + 23011: 0x9DB8, + 23012: 0x9DB9, + 23013: 0x9DBA, + 23014: 0x9DBB, + 23015: 0x9DBC, + 23016: 0x9DBD, + 23017: 0x9DBE, + 23018: 0x9DBF, + 23019: 0x9DC0, + 23020: 0x9DC1, + 23021: 0x9DC2, + 23022: 0x9DC3, + 23023: 0x9DC4, + 23024: 0x9DC5, + 23025: 0x9DC6, + 23026: 0x9DC7, + 23027: 0x9DC8, + 23028: 0x9DC9, + 23029: 0x9DCA, + 23030: 0x9DCB, + 23031: 0x9DCC, + 23032: 0x9DCD, + 23033: 0x9DCE, + 23034: 0x9DCF, + 23035: 0x9DD0, + 23036: 0x9DD1, + 23037: 0x9DD2, + 23038: 0x9DD3, + 23039: 0x9DD4, + 23040: 0x9DD5, + 23041: 0x9DD6, + 23042: 0x9DD7, + 23043: 0x9DD8, + 23044: 0x9DD9, + 23045: 0x9DDA, + 23046: 0x9DDB, + 23047: 0x9DDC, + 23048: 0x9DDD, + 23049: 0x9DDE, + 23050: 0x9DDF, + 23051: 0x9DE0, + 23052: 0x9DE1, + 23053: 0x9DE2, + 23054: 0x9DE3, + 23055: 0x9DE4, + 23056: 0x9DE5, + 23057: 0x9DE6, + 23058: 0x9DE7, + 23059: 0x9DE8, + 23060: 0x9DE9, + 23061: 0x9DEA, + 23062: 0x9DEB, + 23063: 0x9DEC, + 23064: 0x9DED, + 23065: 0x9DEE, + 23066: 0x9DEF, + 23067: 0x9DF0, + 23068: 0x9DF1, + 23069: 0x9DF2, + 23070: 0x9DF3, + 23071: 0x9DF4, + 23072: 0x9DF5, + 23073: 0x9DF6, + 23074: 0x9DF7, + 23075: 0x9DF8, + 23076: 0x9DF9, + 23077: 0x9DFA, + 23078: 0x9DFB, + 23079: 0x9DFC, + 23080: 0x9DFD, + 23081: 0x9DFE, + 23082: 0x9DFF, + 23083: 0x9E00, + 23084: 0x9E01, + 23085: 0x9E02, + 23180: 0x9E03, + 23181: 0x9E04, + 23182: 0x9E05, + 23183: 0x9E06, + 23184: 0x9E07, + 23185: 0x9E08, + 23186: 0x9E09, + 23187: 0x9E0A, + 23188: 0x9E0B, + 23189: 0x9E0C, + 23190: 0x9E0D, + 23191: 0x9E0E, + 23192: 0x9E0F, + 23193: 0x9E10, + 23194: 0x9E11, + 23195: 0x9E12, + 23196: 0x9E13, + 23197: 0x9E14, + 23198: 0x9E15, + 23199: 0x9E16, + 23200: 0x9E17, + 23201: 0x9E18, + 23202: 0x9E19, + 23203: 0x9E1A, + 23204: 0x9E1B, + 23205: 0x9E1C, + 23206: 0x9E1D, + 23207: 0x9E1E, + 23208: 0x9E24, + 23209: 0x9E27, + 23210: 0x9E2E, + 23211: 0x9E30, + 23212: 0x9E34, + 23213: 0x9E3B, + 23214: 0x9E3C, + 23215: 0x9E40, + 23216: 0x9E4D, + 23217: 0x9E50, + 23218: 0x9E52, + 23219: 0x9E53, + 23220: 0x9E54, + 23221: 0x9E56, + 23222: 0x9E59, + 23223: 0x9E5D, + 23224: 0x9E5F, + 23225: 0x9E60, + 23226: 0x9E61, + 23227: 0x9E62, + 23228: 0x9E65, + 23229: 0x9E6E, + 23230: 0x9E6F, + 23231: 0x9E72, + 23232: 0x9E74, + 23233: 0x9E75, + 23234: 0x9E76, + 23235: 0x9E77, + 23236: 0x9E78, + 23237: 0x9E79, + 23238: 0x9E7A, + 23239: 0x9E7B, + 23240: 0x9E7C, + 23241: 0x9E7D, + 23242: 0x9E80, + 23243: 0x9E81, + 23244: 0x9E83, + 23245: 0x9E84, + 23246: 0x9E85, + 23247: 0x9E86, + 23248: 0x9E89, + 23249: 0x9E8A, + 23250: 0x9E8C, + 23251: 0x9E8D, + 23252: 0x9E8E, + 23253: 0x9E8F, + 23254: 0x9E90, + 23255: 0x9E91, + 23256: 0x9E94, + 23257: 0x9E95, + 23258: 0x9E96, + 23259: 0x9E97, + 23260: 0x9E98, + 23261: 0x9E99, + 23262: 0x9E9A, + 23263: 0x9E9B, + 23264: 0x9E9C, + 23265: 0x9E9E, + 23266: 0x9EA0, + 23267: 0x9EA1, + 23268: 0x9EA2, + 23269: 0x9EA3, + 23270: 0x9EA4, + 23271: 0x9EA5, + 23272: 0x9EA7, + 23273: 0x9EA8, + 23274: 0x9EA9, + 23275: 0x9EAA, + 23370: 0x9EAB, + 23371: 0x9EAC, + 23372: 0x9EAD, + 23373: 0x9EAE, + 23374: 0x9EAF, + 23375: 0x9EB0, + 23376: 0x9EB1, + 23377: 0x9EB2, + 23378: 0x9EB3, + 23379: 0x9EB5, + 23380: 0x9EB6, + 23381: 0x9EB7, + 23382: 0x9EB9, + 23383: 0x9EBA, + 23384: 0x9EBC, + 23385: 0x9EBF, + 23386: 0x9EC0, + 23387: 0x9EC1, + 23388: 0x9EC2, + 23389: 0x9EC3, + 23390: 0x9EC5, + 23391: 0x9EC6, + 23392: 0x9EC7, + 23393: 0x9EC8, + 23394: 0x9ECA, + 23395: 0x9ECB, + 23396: 0x9ECC, + 23397: 0x9ED0, + 23398: 0x9ED2, + 23399: 0x9ED3, + 23400: 0x9ED5, + 23401: 0x9ED6, + 23402: 0x9ED7, + 23403: 0x9ED9, + 23404: 0x9EDA, + 23405: 0x9EDE, + 23406: 0x9EE1, + 23407: 0x9EE3, + 23408: 0x9EE4, + 23409: 0x9EE6, + 23410: 0x9EE8, + 23411: 0x9EEB, + 23412: 0x9EEC, + 23413: 0x9EED, + 23414: 0x9EEE, + 23415: 0x9EF0, + 23416: 0x9EF1, + 23417: 0x9EF2, + 23418: 0x9EF3, + 23419: 0x9EF4, + 23420: 0x9EF5, + 23421: 0x9EF6, + 23422: 0x9EF7, + 23423: 0x9EF8, + 23424: 0x9EFA, + 23425: 0x9EFD, + 23426: 0x9EFF, + 23427: 0x9F00, + 23428: 0x9F01, + 23429: 0x9F02, + 23430: 0x9F03, + 23431: 0x9F04, + 23432: 0x9F05, + 23433: 0x9F06, + 23434: 0x9F07, + 23435: 0x9F08, + 23436: 0x9F09, + 23437: 0x9F0A, + 23438: 0x9F0C, + 23439: 0x9F0F, + 23440: 0x9F11, + 23441: 0x9F12, + 23442: 0x9F14, + 23443: 0x9F15, + 23444: 0x9F16, + 23445: 0x9F18, + 23446: 0x9F1A, + 23447: 0x9F1B, + 23448: 0x9F1C, + 23449: 0x9F1D, + 23450: 0x9F1E, + 23451: 0x9F1F, + 23452: 0x9F21, + 23453: 0x9F23, + 23454: 0x9F24, + 23455: 0x9F25, + 23456: 0x9F26, + 23457: 0x9F27, + 23458: 0x9F28, + 23459: 0x9F29, + 23460: 0x9F2A, + 23461: 0x9F2B, + 23462: 0x9F2D, + 23463: 0x9F2E, + 23464: 0x9F30, + 23465: 0x9F31, + 23560: 0x9F32, + 23561: 0x9F33, + 23562: 0x9F34, + 23563: 0x9F35, + 23564: 0x9F36, + 23565: 0x9F38, + 23566: 0x9F3A, + 23567: 0x9F3C, + 23568: 0x9F3F, + 23569: 0x9F40, + 23570: 0x9F41, + 23571: 0x9F42, + 23572: 0x9F43, + 23573: 0x9F45, + 23574: 0x9F46, + 23575: 0x9F47, + 23576: 0x9F48, + 23577: 0x9F49, + 23578: 0x9F4A, + 23579: 0x9F4B, + 23580: 0x9F4C, + 23581: 0x9F4D, + 23582: 0x9F4E, + 23583: 0x9F4F, + 23584: 0x9F52, + 23585: 0x9F53, + 23586: 0x9F54, + 23587: 0x9F55, + 23588: 0x9F56, + 23589: 0x9F57, + 23590: 0x9F58, + 23591: 0x9F59, + 23592: 0x9F5A, + 23593: 0x9F5B, + 23594: 0x9F5C, + 23595: 0x9F5D, + 23596: 0x9F5E, + 23597: 0x9F5F, + 23598: 0x9F60, + 23599: 0x9F61, + 23600: 0x9F62, + 23601: 0x9F63, + 23602: 0x9F64, + 23603: 0x9F65, + 23604: 0x9F66, + 23605: 0x9F67, + 23606: 0x9F68, + 23607: 0x9F69, + 23608: 0x9F6A, + 23609: 0x9F6B, + 23610: 0x9F6C, + 23611: 0x9F6D, + 23612: 0x9F6E, + 23613: 0x9F6F, + 23614: 0x9F70, + 23615: 0x9F71, + 23616: 0x9F72, + 23617: 0x9F73, + 23618: 0x9F74, + 23619: 0x9F75, + 23620: 0x9F76, + 23621: 0x9F77, + 23622: 0x9F78, + 23623: 0x9F79, + 23624: 0x9F7A, + 23625: 0x9F7B, + 23626: 0x9F7C, + 23627: 0x9F7D, + 23628: 0x9F7E, + 23629: 0x9F81, + 23630: 0x9F82, + 23631: 0x9F8D, + 23632: 0x9F8E, + 23633: 0x9F8F, + 23634: 0x9F90, + 23635: 0x9F91, + 23636: 0x9F92, + 23637: 0x9F93, + 23638: 0x9F94, + 23639: 0x9F95, + 23640: 0x9F96, + 23641: 0x9F97, + 23642: 0x9F98, + 23643: 0x9F9C, + 23644: 0x9F9D, + 23645: 0x9F9E, + 23646: 0x9FA1, + 23647: 0x9FA2, + 23648: 0x9FA3, + 23649: 0x9FA4, + 23650: 0x9FA5, + 23651: 0xF92C, + 23652: 0xF979, + 23653: 0xF995, + 23654: 0xF9E7, + 23655: 0xF9F1, + 23750: 0xFA0C, + 23751: 0xFA0D, + 23752: 0xFA0E, + 23753: 0xFA0F, + 23754: 0xFA11, + 23755: 0xFA13, + 23756: 0xFA14, + 23757: 0xFA18, + 23758: 0xFA1F, + 23759: 0xFA20, + 23760: 0xFA21, + 23761: 0xFA23, + 23762: 0xFA24, + 23763: 0xFA27, + 23764: 0xFA28, + 23765: 0xFA29, + 23766: 0x2E81, + 23770: 0x2E84, + 23771: 0x3473, + 23772: 0x3447, + 23773: 0x2E88, + 23774: 0x2E8B, + 23776: 0x359E, + 23777: 0x361A, + 23778: 0x360E, + 23779: 0x2E8C, + 23780: 0x2E97, + 23781: 0x396E, + 23782: 0x3918, + 23784: 0x39CF, + 23785: 0x39DF, + 23786: 0x3A73, + 23787: 0x39D0, + 23790: 0x3B4E, + 23791: 0x3C6E, + 23792: 0x3CE0, + 23793: 0x2EA7, + 23796: 0x2EAA, + 23797: 0x4056, + 23798: 0x415F, + 23799: 0x2EAE, + 23800: 0x4337, + 23801: 0x2EB3, + 23802: 0x2EB6, + 23803: 0x2EB7, + 23805: 0x43B1, + 23806: 0x43AC, + 23807: 0x2EBB, + 23808: 0x43DD, + 23809: 0x44D6, + 23810: 0x4661, + 23811: 0x464C, + 23813: 0x4723, + 23814: 0x4729, + 23815: 0x477C, + 23816: 0x478D, + 23817: 0x2ECA, + 23818: 0x4947, + 23819: 0x497A, + 23820: 0x497D, + 23821: 0x4982, + 23822: 0x4983, + 23823: 0x4985, + 23824: 0x4986, + 23825: 0x499F, + 23826: 0x499B, + 23827: 0x49B7, + 23828: 0x49B6, + 23831: 0x4CA3, + 23832: 0x4C9F, + 23833: 0x4CA0, + 23834: 0x4CA1, + 23835: 0x4C77, + 23836: 0x4CA2, + 23837: 0x4D13, + 23838: 0x4D14, + 23839: 0x4D15, + 23840: 0x4D16, + 23841: 0x4D17, + 23842: 0x4D18, + 23843: 0x4D19, + 23844: 0x4DAE, +} + +const numEncodeTables = 5 + +// encodeX are the encoding tables from Unicode to GBK code, +// sorted by decreasing length. +// encode0: 28965 entries for runes in [11905, 40870). +// encode1: 1587 entries for runes in [ 8208, 9795). +// encode2: 942 entries for runes in [ 164, 1106). +// encode3: 438 entries for runes in [65072, 65510). +// encode4: 254 entries for runes in [63788, 64042). + +const encode0Low, encode0High = 11905, 40870 + +var encode0 = [...]uint16{ + 11905 - 11905: 0xFE50, + 11908 - 11905: 0xFE54, + 11912 - 11905: 0xFE57, + 11915 - 11905: 0xFE58, + 11916 - 11905: 0xFE5D, + 11927 - 11905: 0xFE5E, + 11943 - 11905: 0xFE6B, + 11946 - 11905: 0xFE6E, + 11950 - 11905: 0xFE71, + 11955 - 11905: 0xFE73, + 11958 - 11905: 0xFE74, + 11959 - 11905: 0xFE75, + 11963 - 11905: 0xFE79, + 11978 - 11905: 0xFE84, + 12272 - 11905: 0xA98A, + 12273 - 11905: 0xA98B, + 12274 - 11905: 0xA98C, + 12275 - 11905: 0xA98D, + 12276 - 11905: 0xA98E, + 12277 - 11905: 0xA98F, + 12278 - 11905: 0xA990, + 12279 - 11905: 0xA991, + 12280 - 11905: 0xA992, + 12281 - 11905: 0xA993, + 12282 - 11905: 0xA994, + 12283 - 11905: 0xA995, + 12288 - 11905: 0xA1A1, + 12289 - 11905: 0xA1A2, + 12290 - 11905: 0xA1A3, + 12291 - 11905: 0xA1A8, + 12293 - 11905: 0xA1A9, + 12294 - 11905: 0xA965, + 12295 - 11905: 0xA996, + 12296 - 11905: 0xA1B4, + 12297 - 11905: 0xA1B5, + 12298 - 11905: 0xA1B6, + 12299 - 11905: 0xA1B7, + 12300 - 11905: 0xA1B8, + 12301 - 11905: 0xA1B9, + 12302 - 11905: 0xA1BA, + 12303 - 11905: 0xA1BB, + 12304 - 11905: 0xA1BE, + 12305 - 11905: 0xA1BF, + 12306 - 11905: 0xA893, + 12307 - 11905: 0xA1FE, + 12308 - 11905: 0xA1B2, + 12309 - 11905: 0xA1B3, + 12310 - 11905: 0xA1BC, + 12311 - 11905: 0xA1BD, + 12317 - 11905: 0xA894, + 12318 - 11905: 0xA895, + 12321 - 11905: 0xA940, + 12322 - 11905: 0xA941, + 12323 - 11905: 0xA942, + 12324 - 11905: 0xA943, + 12325 - 11905: 0xA944, + 12326 - 11905: 0xA945, + 12327 - 11905: 0xA946, + 12328 - 11905: 0xA947, + 12329 - 11905: 0xA948, + 12350 - 11905: 0xA989, + 12353 - 11905: 0xA4A1, + 12354 - 11905: 0xA4A2, + 12355 - 11905: 0xA4A3, + 12356 - 11905: 0xA4A4, + 12357 - 11905: 0xA4A5, + 12358 - 11905: 0xA4A6, + 12359 - 11905: 0xA4A7, + 12360 - 11905: 0xA4A8, + 12361 - 11905: 0xA4A9, + 12362 - 11905: 0xA4AA, + 12363 - 11905: 0xA4AB, + 12364 - 11905: 0xA4AC, + 12365 - 11905: 0xA4AD, + 12366 - 11905: 0xA4AE, + 12367 - 11905: 0xA4AF, + 12368 - 11905: 0xA4B0, + 12369 - 11905: 0xA4B1, + 12370 - 11905: 0xA4B2, + 12371 - 11905: 0xA4B3, + 12372 - 11905: 0xA4B4, + 12373 - 11905: 0xA4B5, + 12374 - 11905: 0xA4B6, + 12375 - 11905: 0xA4B7, + 12376 - 11905: 0xA4B8, + 12377 - 11905: 0xA4B9, + 12378 - 11905: 0xA4BA, + 12379 - 11905: 0xA4BB, + 12380 - 11905: 0xA4BC, + 12381 - 11905: 0xA4BD, + 12382 - 11905: 0xA4BE, + 12383 - 11905: 0xA4BF, + 12384 - 11905: 0xA4C0, + 12385 - 11905: 0xA4C1, + 12386 - 11905: 0xA4C2, + 12387 - 11905: 0xA4C3, + 12388 - 11905: 0xA4C4, + 12389 - 11905: 0xA4C5, + 12390 - 11905: 0xA4C6, + 12391 - 11905: 0xA4C7, + 12392 - 11905: 0xA4C8, + 12393 - 11905: 0xA4C9, + 12394 - 11905: 0xA4CA, + 12395 - 11905: 0xA4CB, + 12396 - 11905: 0xA4CC, + 12397 - 11905: 0xA4CD, + 12398 - 11905: 0xA4CE, + 12399 - 11905: 0xA4CF, + 12400 - 11905: 0xA4D0, + 12401 - 11905: 0xA4D1, + 12402 - 11905: 0xA4D2, + 12403 - 11905: 0xA4D3, + 12404 - 11905: 0xA4D4, + 12405 - 11905: 0xA4D5, + 12406 - 11905: 0xA4D6, + 12407 - 11905: 0xA4D7, + 12408 - 11905: 0xA4D8, + 12409 - 11905: 0xA4D9, + 12410 - 11905: 0xA4DA, + 12411 - 11905: 0xA4DB, + 12412 - 11905: 0xA4DC, + 12413 - 11905: 0xA4DD, + 12414 - 11905: 0xA4DE, + 12415 - 11905: 0xA4DF, + 12416 - 11905: 0xA4E0, + 12417 - 11905: 0xA4E1, + 12418 - 11905: 0xA4E2, + 12419 - 11905: 0xA4E3, + 12420 - 11905: 0xA4E4, + 12421 - 11905: 0xA4E5, + 12422 - 11905: 0xA4E6, + 12423 - 11905: 0xA4E7, + 12424 - 11905: 0xA4E8, + 12425 - 11905: 0xA4E9, + 12426 - 11905: 0xA4EA, + 12427 - 11905: 0xA4EB, + 12428 - 11905: 0xA4EC, + 12429 - 11905: 0xA4ED, + 12430 - 11905: 0xA4EE, + 12431 - 11905: 0xA4EF, + 12432 - 11905: 0xA4F0, + 12433 - 11905: 0xA4F1, + 12434 - 11905: 0xA4F2, + 12435 - 11905: 0xA4F3, + 12443 - 11905: 0xA961, + 12444 - 11905: 0xA962, + 12445 - 11905: 0xA966, + 12446 - 11905: 0xA967, + 12449 - 11905: 0xA5A1, + 12450 - 11905: 0xA5A2, + 12451 - 11905: 0xA5A3, + 12452 - 11905: 0xA5A4, + 12453 - 11905: 0xA5A5, + 12454 - 11905: 0xA5A6, + 12455 - 11905: 0xA5A7, + 12456 - 11905: 0xA5A8, + 12457 - 11905: 0xA5A9, + 12458 - 11905: 0xA5AA, + 12459 - 11905: 0xA5AB, + 12460 - 11905: 0xA5AC, + 12461 - 11905: 0xA5AD, + 12462 - 11905: 0xA5AE, + 12463 - 11905: 0xA5AF, + 12464 - 11905: 0xA5B0, + 12465 - 11905: 0xA5B1, + 12466 - 11905: 0xA5B2, + 12467 - 11905: 0xA5B3, + 12468 - 11905: 0xA5B4, + 12469 - 11905: 0xA5B5, + 12470 - 11905: 0xA5B6, + 12471 - 11905: 0xA5B7, + 12472 - 11905: 0xA5B8, + 12473 - 11905: 0xA5B9, + 12474 - 11905: 0xA5BA, + 12475 - 11905: 0xA5BB, + 12476 - 11905: 0xA5BC, + 12477 - 11905: 0xA5BD, + 12478 - 11905: 0xA5BE, + 12479 - 11905: 0xA5BF, + 12480 - 11905: 0xA5C0, + 12481 - 11905: 0xA5C1, + 12482 - 11905: 0xA5C2, + 12483 - 11905: 0xA5C3, + 12484 - 11905: 0xA5C4, + 12485 - 11905: 0xA5C5, + 12486 - 11905: 0xA5C6, + 12487 - 11905: 0xA5C7, + 12488 - 11905: 0xA5C8, + 12489 - 11905: 0xA5C9, + 12490 - 11905: 0xA5CA, + 12491 - 11905: 0xA5CB, + 12492 - 11905: 0xA5CC, + 12493 - 11905: 0xA5CD, + 12494 - 11905: 0xA5CE, + 12495 - 11905: 0xA5CF, + 12496 - 11905: 0xA5D0, + 12497 - 11905: 0xA5D1, + 12498 - 11905: 0xA5D2, + 12499 - 11905: 0xA5D3, + 12500 - 11905: 0xA5D4, + 12501 - 11905: 0xA5D5, + 12502 - 11905: 0xA5D6, + 12503 - 11905: 0xA5D7, + 12504 - 11905: 0xA5D8, + 12505 - 11905: 0xA5D9, + 12506 - 11905: 0xA5DA, + 12507 - 11905: 0xA5DB, + 12508 - 11905: 0xA5DC, + 12509 - 11905: 0xA5DD, + 12510 - 11905: 0xA5DE, + 12511 - 11905: 0xA5DF, + 12512 - 11905: 0xA5E0, + 12513 - 11905: 0xA5E1, + 12514 - 11905: 0xA5E2, + 12515 - 11905: 0xA5E3, + 12516 - 11905: 0xA5E4, + 12517 - 11905: 0xA5E5, + 12518 - 11905: 0xA5E6, + 12519 - 11905: 0xA5E7, + 12520 - 11905: 0xA5E8, + 12521 - 11905: 0xA5E9, + 12522 - 11905: 0xA5EA, + 12523 - 11905: 0xA5EB, + 12524 - 11905: 0xA5EC, + 12525 - 11905: 0xA5ED, + 12526 - 11905: 0xA5EE, + 12527 - 11905: 0xA5EF, + 12528 - 11905: 0xA5F0, + 12529 - 11905: 0xA5F1, + 12530 - 11905: 0xA5F2, + 12531 - 11905: 0xA5F3, + 12532 - 11905: 0xA5F4, + 12533 - 11905: 0xA5F5, + 12534 - 11905: 0xA5F6, + 12540 - 11905: 0xA960, + 12541 - 11905: 0xA963, + 12542 - 11905: 0xA964, + 12549 - 11905: 0xA8C5, + 12550 - 11905: 0xA8C6, + 12551 - 11905: 0xA8C7, + 12552 - 11905: 0xA8C8, + 12553 - 11905: 0xA8C9, + 12554 - 11905: 0xA8CA, + 12555 - 11905: 0xA8CB, + 12556 - 11905: 0xA8CC, + 12557 - 11905: 0xA8CD, + 12558 - 11905: 0xA8CE, + 12559 - 11905: 0xA8CF, + 12560 - 11905: 0xA8D0, + 12561 - 11905: 0xA8D1, + 12562 - 11905: 0xA8D2, + 12563 - 11905: 0xA8D3, + 12564 - 11905: 0xA8D4, + 12565 - 11905: 0xA8D5, + 12566 - 11905: 0xA8D6, + 12567 - 11905: 0xA8D7, + 12568 - 11905: 0xA8D8, + 12569 - 11905: 0xA8D9, + 12570 - 11905: 0xA8DA, + 12571 - 11905: 0xA8DB, + 12572 - 11905: 0xA8DC, + 12573 - 11905: 0xA8DD, + 12574 - 11905: 0xA8DE, + 12575 - 11905: 0xA8DF, + 12576 - 11905: 0xA8E0, + 12577 - 11905: 0xA8E1, + 12578 - 11905: 0xA8E2, + 12579 - 11905: 0xA8E3, + 12580 - 11905: 0xA8E4, + 12581 - 11905: 0xA8E5, + 12582 - 11905: 0xA8E6, + 12583 - 11905: 0xA8E7, + 12584 - 11905: 0xA8E8, + 12585 - 11905: 0xA8E9, + 12832 - 11905: 0xA2E5, + 12833 - 11905: 0xA2E6, + 12834 - 11905: 0xA2E7, + 12835 - 11905: 0xA2E8, + 12836 - 11905: 0xA2E9, + 12837 - 11905: 0xA2EA, + 12838 - 11905: 0xA2EB, + 12839 - 11905: 0xA2EC, + 12840 - 11905: 0xA2ED, + 12841 - 11905: 0xA2EE, + 12849 - 11905: 0xA95A, + 12963 - 11905: 0xA949, + 13198 - 11905: 0xA94A, + 13199 - 11905: 0xA94B, + 13212 - 11905: 0xA94C, + 13213 - 11905: 0xA94D, + 13214 - 11905: 0xA94E, + 13217 - 11905: 0xA94F, + 13252 - 11905: 0xA950, + 13262 - 11905: 0xA951, + 13265 - 11905: 0xA952, + 13266 - 11905: 0xA953, + 13269 - 11905: 0xA954, + 13383 - 11905: 0xFE56, + 13427 - 11905: 0xFE55, + 13726 - 11905: 0xFE5A, + 13838 - 11905: 0xFE5C, + 13850 - 11905: 0xFE5B, + 14616 - 11905: 0xFE60, + 14702 - 11905: 0xFE5F, + 14799 - 11905: 0xFE62, + 14800 - 11905: 0xFE65, + 14815 - 11905: 0xFE63, + 14963 - 11905: 0xFE64, + 15182 - 11905: 0xFE68, + 15470 - 11905: 0xFE69, + 15584 - 11905: 0xFE6A, + 16470 - 11905: 0xFE6F, + 16735 - 11905: 0xFE70, + 17207 - 11905: 0xFE72, + 17324 - 11905: 0xFE78, + 17329 - 11905: 0xFE77, + 17373 - 11905: 0xFE7A, + 17622 - 11905: 0xFE7B, + 17996 - 11905: 0xFE7D, + 18017 - 11905: 0xFE7C, + 18211 - 11905: 0xFE80, + 18217 - 11905: 0xFE81, + 18300 - 11905: 0xFE82, + 18317 - 11905: 0xFE83, + 18759 - 11905: 0xFE85, + 18810 - 11905: 0xFE86, + 18813 - 11905: 0xFE87, + 18818 - 11905: 0xFE88, + 18819 - 11905: 0xFE89, + 18821 - 11905: 0xFE8A, + 18822 - 11905: 0xFE8B, + 18843 - 11905: 0xFE8D, + 18847 - 11905: 0xFE8C, + 18870 - 11905: 0xFE8F, + 18871 - 11905: 0xFE8E, + 19575 - 11905: 0xFE96, + 19615 - 11905: 0xFE93, + 19616 - 11905: 0xFE94, + 19617 - 11905: 0xFE95, + 19618 - 11905: 0xFE97, + 19619 - 11905: 0xFE92, + 19731 - 11905: 0xFE98, + 19732 - 11905: 0xFE99, + 19733 - 11905: 0xFE9A, + 19734 - 11905: 0xFE9B, + 19735 - 11905: 0xFE9C, + 19736 - 11905: 0xFE9D, + 19737 - 11905: 0xFE9E, + 19886 - 11905: 0xFE9F, + 19968 - 11905: 0xD2BB, + 19969 - 11905: 0xB6A1, + 19970 - 11905: 0x8140, + 19971 - 11905: 0xC6DF, + 19972 - 11905: 0x8141, + 19973 - 11905: 0x8142, + 19974 - 11905: 0x8143, + 19975 - 11905: 0xCDF2, + 19976 - 11905: 0xD5C9, + 19977 - 11905: 0xC8FD, + 19978 - 11905: 0xC9CF, + 19979 - 11905: 0xCFC2, + 19980 - 11905: 0xD8A2, + 19981 - 11905: 0xB2BB, + 19982 - 11905: 0xD3EB, + 19983 - 11905: 0x8144, + 19984 - 11905: 0xD8A4, + 19985 - 11905: 0xB3F3, + 19986 - 11905: 0x8145, + 19987 - 11905: 0xD7A8, + 19988 - 11905: 0xC7D2, + 19989 - 11905: 0xD8A7, + 19990 - 11905: 0xCAC0, + 19991 - 11905: 0x8146, + 19992 - 11905: 0xC7F0, + 19993 - 11905: 0xB1FB, + 19994 - 11905: 0xD2B5, + 19995 - 11905: 0xB4D4, + 19996 - 11905: 0xB6AB, + 19997 - 11905: 0xCBBF, + 19998 - 11905: 0xD8A9, + 19999 - 11905: 0x8147, + 20000 - 11905: 0x8148, + 20001 - 11905: 0x8149, + 20002 - 11905: 0xB6AA, + 20003 - 11905: 0x814A, + 20004 - 11905: 0xC1BD, + 20005 - 11905: 0xD1CF, + 20006 - 11905: 0x814B, + 20007 - 11905: 0xC9A5, + 20008 - 11905: 0xD8AD, + 20009 - 11905: 0x814C, + 20010 - 11905: 0xB8F6, + 20011 - 11905: 0xD1BE, + 20012 - 11905: 0xE3DC, + 20013 - 11905: 0xD6D0, + 20014 - 11905: 0x814D, + 20015 - 11905: 0x814E, + 20016 - 11905: 0xB7E1, + 20017 - 11905: 0x814F, + 20018 - 11905: 0xB4AE, + 20019 - 11905: 0x8150, + 20020 - 11905: 0xC1D9, + 20021 - 11905: 0x8151, + 20022 - 11905: 0xD8BC, + 20023 - 11905: 0x8152, + 20024 - 11905: 0xCDE8, + 20025 - 11905: 0xB5A4, + 20026 - 11905: 0xCEAA, + 20027 - 11905: 0xD6F7, + 20028 - 11905: 0x8153, + 20029 - 11905: 0xC0F6, + 20030 - 11905: 0xBED9, + 20031 - 11905: 0xD8AF, + 20032 - 11905: 0x8154, + 20033 - 11905: 0x8155, + 20034 - 11905: 0x8156, + 20035 - 11905: 0xC4CB, + 20036 - 11905: 0x8157, + 20037 - 11905: 0xBEC3, + 20038 - 11905: 0x8158, + 20039 - 11905: 0xD8B1, + 20040 - 11905: 0xC3B4, + 20041 - 11905: 0xD2E5, + 20042 - 11905: 0x8159, + 20043 - 11905: 0xD6AE, + 20044 - 11905: 0xCEDA, + 20045 - 11905: 0xD5A7, + 20046 - 11905: 0xBAF5, + 20047 - 11905: 0xB7A6, + 20048 - 11905: 0xC0D6, + 20049 - 11905: 0x815A, + 20050 - 11905: 0xC6B9, + 20051 - 11905: 0xC5D2, + 20052 - 11905: 0xC7C7, + 20053 - 11905: 0x815B, + 20054 - 11905: 0xB9D4, + 20055 - 11905: 0x815C, + 20056 - 11905: 0xB3CB, + 20057 - 11905: 0xD2D2, + 20058 - 11905: 0x815D, + 20059 - 11905: 0x815E, + 20060 - 11905: 0xD8BF, + 20061 - 11905: 0xBEC5, + 20062 - 11905: 0xC6F2, + 20063 - 11905: 0xD2B2, + 20064 - 11905: 0xCFB0, + 20065 - 11905: 0xCFE7, + 20066 - 11905: 0x815F, + 20067 - 11905: 0x8160, + 20068 - 11905: 0x8161, + 20069 - 11905: 0x8162, + 20070 - 11905: 0xCAE9, + 20071 - 11905: 0x8163, + 20072 - 11905: 0x8164, + 20073 - 11905: 0xD8C0, + 20074 - 11905: 0x8165, + 20075 - 11905: 0x8166, + 20076 - 11905: 0x8167, + 20077 - 11905: 0x8168, + 20078 - 11905: 0x8169, + 20079 - 11905: 0x816A, + 20080 - 11905: 0xC2F2, + 20081 - 11905: 0xC2D2, + 20082 - 11905: 0x816B, + 20083 - 11905: 0xC8E9, + 20084 - 11905: 0x816C, + 20085 - 11905: 0x816D, + 20086 - 11905: 0x816E, + 20087 - 11905: 0x816F, + 20088 - 11905: 0x8170, + 20089 - 11905: 0x8171, + 20090 - 11905: 0x8172, + 20091 - 11905: 0x8173, + 20092 - 11905: 0x8174, + 20093 - 11905: 0x8175, + 20094 - 11905: 0xC7AC, + 20095 - 11905: 0x8176, + 20096 - 11905: 0x8177, + 20097 - 11905: 0x8178, + 20098 - 11905: 0x8179, + 20099 - 11905: 0x817A, + 20100 - 11905: 0x817B, + 20101 - 11905: 0x817C, + 20102 - 11905: 0xC1CB, + 20103 - 11905: 0x817D, + 20104 - 11905: 0xD3E8, + 20105 - 11905: 0xD5F9, + 20106 - 11905: 0x817E, + 20107 - 11905: 0xCAC2, + 20108 - 11905: 0xB6FE, + 20109 - 11905: 0xD8A1, + 20110 - 11905: 0xD3DA, + 20111 - 11905: 0xBFF7, + 20112 - 11905: 0x8180, + 20113 - 11905: 0xD4C6, + 20114 - 11905: 0xBBA5, + 20115 - 11905: 0xD8C1, + 20116 - 11905: 0xCEE5, + 20117 - 11905: 0xBEAE, + 20118 - 11905: 0x8181, + 20119 - 11905: 0x8182, + 20120 - 11905: 0xD8A8, + 20121 - 11905: 0x8183, + 20122 - 11905: 0xD1C7, + 20123 - 11905: 0xD0A9, + 20124 - 11905: 0x8184, + 20125 - 11905: 0x8185, + 20126 - 11905: 0x8186, + 20127 - 11905: 0xD8BD, + 20128 - 11905: 0xD9EF, + 20129 - 11905: 0xCDF6, + 20130 - 11905: 0xBFBA, + 20131 - 11905: 0x8187, + 20132 - 11905: 0xBDBB, + 20133 - 11905: 0xBAA5, + 20134 - 11905: 0xD2E0, + 20135 - 11905: 0xB2FA, + 20136 - 11905: 0xBAE0, + 20137 - 11905: 0xC4B6, + 20138 - 11905: 0x8188, + 20139 - 11905: 0xCFED, + 20140 - 11905: 0xBEA9, + 20141 - 11905: 0xCDA4, + 20142 - 11905: 0xC1C1, + 20143 - 11905: 0x8189, + 20144 - 11905: 0x818A, + 20145 - 11905: 0x818B, + 20146 - 11905: 0xC7D7, + 20147 - 11905: 0xD9F1, + 20148 - 11905: 0x818C, + 20149 - 11905: 0xD9F4, + 20150 - 11905: 0x818D, + 20151 - 11905: 0x818E, + 20152 - 11905: 0x818F, + 20153 - 11905: 0x8190, + 20154 - 11905: 0xC8CB, + 20155 - 11905: 0xD8E9, + 20156 - 11905: 0x8191, + 20157 - 11905: 0x8192, + 20158 - 11905: 0x8193, + 20159 - 11905: 0xD2DA, + 20160 - 11905: 0xCAB2, + 20161 - 11905: 0xC8CA, + 20162 - 11905: 0xD8EC, + 20163 - 11905: 0xD8EA, + 20164 - 11905: 0xD8C6, + 20165 - 11905: 0xBDF6, + 20166 - 11905: 0xC6CD, + 20167 - 11905: 0xB3F0, + 20168 - 11905: 0x8194, + 20169 - 11905: 0xD8EB, + 20170 - 11905: 0xBDF1, + 20171 - 11905: 0xBDE9, + 20172 - 11905: 0x8195, + 20173 - 11905: 0xC8D4, + 20174 - 11905: 0xB4D3, + 20175 - 11905: 0x8196, + 20176 - 11905: 0x8197, + 20177 - 11905: 0xC2D8, + 20178 - 11905: 0x8198, + 20179 - 11905: 0xB2D6, + 20180 - 11905: 0xD7D0, + 20181 - 11905: 0xCACB, + 20182 - 11905: 0xCBFB, + 20183 - 11905: 0xD5CC, + 20184 - 11905: 0xB8B6, + 20185 - 11905: 0xCFC9, + 20186 - 11905: 0x8199, + 20187 - 11905: 0x819A, + 20188 - 11905: 0x819B, + 20189 - 11905: 0xD9DA, + 20190 - 11905: 0xD8F0, + 20191 - 11905: 0xC7AA, + 20192 - 11905: 0x819C, + 20193 - 11905: 0xD8EE, + 20194 - 11905: 0x819D, + 20195 - 11905: 0xB4FA, + 20196 - 11905: 0xC1EE, + 20197 - 11905: 0xD2D4, + 20198 - 11905: 0x819E, + 20199 - 11905: 0x819F, + 20200 - 11905: 0xD8ED, + 20201 - 11905: 0x81A0, + 20202 - 11905: 0xD2C7, + 20203 - 11905: 0xD8EF, + 20204 - 11905: 0xC3C7, + 20205 - 11905: 0x81A1, + 20206 - 11905: 0x81A2, + 20207 - 11905: 0x81A3, + 20208 - 11905: 0xD1F6, + 20209 - 11905: 0x81A4, + 20210 - 11905: 0xD6D9, + 20211 - 11905: 0xD8F2, + 20212 - 11905: 0x81A5, + 20213 - 11905: 0xD8F5, + 20214 - 11905: 0xBCFE, + 20215 - 11905: 0xBCDB, + 20216 - 11905: 0x81A6, + 20217 - 11905: 0x81A7, + 20218 - 11905: 0x81A8, + 20219 - 11905: 0xC8CE, + 20220 - 11905: 0x81A9, + 20221 - 11905: 0xB7DD, + 20222 - 11905: 0x81AA, + 20223 - 11905: 0xB7C2, + 20224 - 11905: 0x81AB, + 20225 - 11905: 0xC6F3, + 20226 - 11905: 0x81AC, + 20227 - 11905: 0x81AD, + 20228 - 11905: 0x81AE, + 20229 - 11905: 0x81AF, + 20230 - 11905: 0x81B0, + 20231 - 11905: 0x81B1, + 20232 - 11905: 0x81B2, + 20233 - 11905: 0xD8F8, + 20234 - 11905: 0xD2C1, + 20235 - 11905: 0x81B3, + 20236 - 11905: 0x81B4, + 20237 - 11905: 0xCEE9, + 20238 - 11905: 0xBCBF, + 20239 - 11905: 0xB7FC, + 20240 - 11905: 0xB7A5, + 20241 - 11905: 0xD0DD, + 20242 - 11905: 0x81B5, + 20243 - 11905: 0x81B6, + 20244 - 11905: 0x81B7, + 20245 - 11905: 0x81B8, + 20246 - 11905: 0x81B9, + 20247 - 11905: 0xD6DA, + 20248 - 11905: 0xD3C5, + 20249 - 11905: 0xBBEF, + 20250 - 11905: 0xBBE1, + 20251 - 11905: 0xD8F1, + 20252 - 11905: 0x81BA, + 20253 - 11905: 0x81BB, + 20254 - 11905: 0xC9A1, + 20255 - 11905: 0xCEB0, + 20256 - 11905: 0xB4AB, + 20257 - 11905: 0x81BC, + 20258 - 11905: 0xD8F3, + 20259 - 11905: 0x81BD, + 20260 - 11905: 0xC9CB, + 20261 - 11905: 0xD8F6, + 20262 - 11905: 0xC2D7, + 20263 - 11905: 0xD8F7, + 20264 - 11905: 0x81BE, + 20265 - 11905: 0x81BF, + 20266 - 11905: 0xCEB1, + 20267 - 11905: 0xD8F9, + 20268 - 11905: 0x81C0, + 20269 - 11905: 0x81C1, + 20270 - 11905: 0x81C2, + 20271 - 11905: 0xB2AE, + 20272 - 11905: 0xB9C0, + 20273 - 11905: 0x81C3, + 20274 - 11905: 0xD9A3, + 20275 - 11905: 0x81C4, + 20276 - 11905: 0xB0E9, + 20277 - 11905: 0x81C5, + 20278 - 11905: 0xC1E6, + 20279 - 11905: 0x81C6, + 20280 - 11905: 0xC9EC, + 20281 - 11905: 0x81C7, + 20282 - 11905: 0xCBC5, + 20283 - 11905: 0x81C8, + 20284 - 11905: 0xCBC6, + 20285 - 11905: 0xD9A4, + 20286 - 11905: 0x81C9, + 20287 - 11905: 0x81CA, + 20288 - 11905: 0x81CB, + 20289 - 11905: 0x81CC, + 20290 - 11905: 0x81CD, + 20291 - 11905: 0xB5E8, + 20292 - 11905: 0x81CE, + 20293 - 11905: 0x81CF, + 20294 - 11905: 0xB5AB, + 20295 - 11905: 0x81D0, + 20296 - 11905: 0x81D1, + 20297 - 11905: 0x81D2, + 20298 - 11905: 0x81D3, + 20299 - 11905: 0x81D4, + 20300 - 11905: 0x81D5, + 20301 - 11905: 0xCEBB, + 20302 - 11905: 0xB5CD, + 20303 - 11905: 0xD7A1, + 20304 - 11905: 0xD7F4, + 20305 - 11905: 0xD3D3, + 20306 - 11905: 0x81D6, + 20307 - 11905: 0xCCE5, + 20308 - 11905: 0x81D7, + 20309 - 11905: 0xBACE, + 20310 - 11905: 0x81D8, + 20311 - 11905: 0xD9A2, + 20312 - 11905: 0xD9DC, + 20313 - 11905: 0xD3E0, + 20314 - 11905: 0xD8FD, + 20315 - 11905: 0xB7F0, + 20316 - 11905: 0xD7F7, + 20317 - 11905: 0xD8FE, + 20318 - 11905: 0xD8FA, + 20319 - 11905: 0xD9A1, + 20320 - 11905: 0xC4E3, + 20321 - 11905: 0x81D9, + 20322 - 11905: 0x81DA, + 20323 - 11905: 0xD3B6, + 20324 - 11905: 0xD8F4, + 20325 - 11905: 0xD9DD, + 20326 - 11905: 0x81DB, + 20327 - 11905: 0xD8FB, + 20328 - 11905: 0x81DC, + 20329 - 11905: 0xC5E5, + 20330 - 11905: 0x81DD, + 20331 - 11905: 0x81DE, + 20332 - 11905: 0xC0D0, + 20333 - 11905: 0x81DF, + 20334 - 11905: 0x81E0, + 20335 - 11905: 0xD1F0, + 20336 - 11905: 0xB0DB, + 20337 - 11905: 0x81E1, + 20338 - 11905: 0x81E2, + 20339 - 11905: 0xBCD1, + 20340 - 11905: 0xD9A6, + 20341 - 11905: 0x81E3, + 20342 - 11905: 0xD9A5, + 20343 - 11905: 0x81E4, + 20344 - 11905: 0x81E5, + 20345 - 11905: 0x81E6, + 20346 - 11905: 0x81E7, + 20347 - 11905: 0xD9AC, + 20348 - 11905: 0xD9AE, + 20349 - 11905: 0x81E8, + 20350 - 11905: 0xD9AB, + 20351 - 11905: 0xCAB9, + 20352 - 11905: 0x81E9, + 20353 - 11905: 0x81EA, + 20354 - 11905: 0x81EB, + 20355 - 11905: 0xD9A9, + 20356 - 11905: 0xD6B6, + 20357 - 11905: 0x81EC, + 20358 - 11905: 0x81ED, + 20359 - 11905: 0x81EE, + 20360 - 11905: 0xB3DE, + 20361 - 11905: 0xD9A8, + 20362 - 11905: 0x81EF, + 20363 - 11905: 0xC0FD, + 20364 - 11905: 0x81F0, + 20365 - 11905: 0xCACC, + 20366 - 11905: 0x81F1, + 20367 - 11905: 0xD9AA, + 20368 - 11905: 0x81F2, + 20369 - 11905: 0xD9A7, + 20370 - 11905: 0x81F3, + 20371 - 11905: 0x81F4, + 20372 - 11905: 0xD9B0, + 20373 - 11905: 0x81F5, + 20374 - 11905: 0x81F6, + 20375 - 11905: 0xB6B1, + 20376 - 11905: 0x81F7, + 20377 - 11905: 0x81F8, + 20378 - 11905: 0x81F9, + 20379 - 11905: 0xB9A9, + 20380 - 11905: 0x81FA, + 20381 - 11905: 0xD2C0, + 20382 - 11905: 0x81FB, + 20383 - 11905: 0x81FC, + 20384 - 11905: 0xCFC0, + 20385 - 11905: 0x81FD, + 20386 - 11905: 0x81FE, + 20387 - 11905: 0xC2C2, + 20388 - 11905: 0x8240, + 20389 - 11905: 0xBDC4, + 20390 - 11905: 0xD5EC, + 20391 - 11905: 0xB2E0, + 20392 - 11905: 0xC7C8, + 20393 - 11905: 0xBFEB, + 20394 - 11905: 0xD9AD, + 20395 - 11905: 0x8241, + 20396 - 11905: 0xD9AF, + 20397 - 11905: 0x8242, + 20398 - 11905: 0xCEEA, + 20399 - 11905: 0xBAEE, + 20400 - 11905: 0x8243, + 20401 - 11905: 0x8244, + 20402 - 11905: 0x8245, + 20403 - 11905: 0x8246, + 20404 - 11905: 0x8247, + 20405 - 11905: 0xC7D6, + 20406 - 11905: 0x8248, + 20407 - 11905: 0x8249, + 20408 - 11905: 0x824A, + 20409 - 11905: 0x824B, + 20410 - 11905: 0x824C, + 20411 - 11905: 0x824D, + 20412 - 11905: 0x824E, + 20413 - 11905: 0x824F, + 20414 - 11905: 0x8250, + 20415 - 11905: 0xB1E3, + 20416 - 11905: 0x8251, + 20417 - 11905: 0x8252, + 20418 - 11905: 0x8253, + 20419 - 11905: 0xB4D9, + 20420 - 11905: 0xB6ED, + 20421 - 11905: 0xD9B4, + 20422 - 11905: 0x8254, + 20423 - 11905: 0x8255, + 20424 - 11905: 0x8256, + 20425 - 11905: 0x8257, + 20426 - 11905: 0xBFA1, + 20427 - 11905: 0x8258, + 20428 - 11905: 0x8259, + 20429 - 11905: 0x825A, + 20430 - 11905: 0xD9DE, + 20431 - 11905: 0xC7CE, + 20432 - 11905: 0xC0FE, + 20433 - 11905: 0xD9B8, + 20434 - 11905: 0x825B, + 20435 - 11905: 0x825C, + 20436 - 11905: 0x825D, + 20437 - 11905: 0x825E, + 20438 - 11905: 0x825F, + 20439 - 11905: 0xCBD7, + 20440 - 11905: 0xB7FD, + 20441 - 11905: 0x8260, + 20442 - 11905: 0xD9B5, + 20443 - 11905: 0x8261, + 20444 - 11905: 0xD9B7, + 20445 - 11905: 0xB1A3, + 20446 - 11905: 0xD3E1, + 20447 - 11905: 0xD9B9, + 20448 - 11905: 0x8262, + 20449 - 11905: 0xD0C5, + 20450 - 11905: 0x8263, + 20451 - 11905: 0xD9B6, + 20452 - 11905: 0x8264, + 20453 - 11905: 0x8265, + 20454 - 11905: 0xD9B1, + 20455 - 11905: 0x8266, + 20456 - 11905: 0xD9B2, + 20457 - 11905: 0xC1A9, + 20458 - 11905: 0xD9B3, + 20459 - 11905: 0x8267, + 20460 - 11905: 0x8268, + 20461 - 11905: 0xBCF3, + 20462 - 11905: 0xD0DE, + 20463 - 11905: 0xB8A9, + 20464 - 11905: 0x8269, + 20465 - 11905: 0xBEE3, + 20466 - 11905: 0x826A, + 20467 - 11905: 0xD9BD, + 20468 - 11905: 0x826B, + 20469 - 11905: 0x826C, + 20470 - 11905: 0x826D, + 20471 - 11905: 0x826E, + 20472 - 11905: 0xD9BA, + 20473 - 11905: 0x826F, + 20474 - 11905: 0xB0B3, + 20475 - 11905: 0x8270, + 20476 - 11905: 0x8271, + 20477 - 11905: 0x8272, + 20478 - 11905: 0xD9C2, + 20479 - 11905: 0x8273, + 20480 - 11905: 0x8274, + 20481 - 11905: 0x8275, + 20482 - 11905: 0x8276, + 20483 - 11905: 0x8277, + 20484 - 11905: 0x8278, + 20485 - 11905: 0x8279, + 20486 - 11905: 0x827A, + 20487 - 11905: 0x827B, + 20488 - 11905: 0x827C, + 20489 - 11905: 0x827D, + 20490 - 11905: 0x827E, + 20491 - 11905: 0x8280, + 20492 - 11905: 0xD9C4, + 20493 - 11905: 0xB1B6, + 20494 - 11905: 0x8281, + 20495 - 11905: 0xD9BF, + 20496 - 11905: 0x8282, + 20497 - 11905: 0x8283, + 20498 - 11905: 0xB5B9, + 20499 - 11905: 0x8284, + 20500 - 11905: 0xBEF3, + 20501 - 11905: 0x8285, + 20502 - 11905: 0x8286, + 20503 - 11905: 0x8287, + 20504 - 11905: 0xCCC8, + 20505 - 11905: 0xBAF2, + 20506 - 11905: 0xD2D0, + 20507 - 11905: 0x8288, + 20508 - 11905: 0xD9C3, + 20509 - 11905: 0x8289, + 20510 - 11905: 0x828A, + 20511 - 11905: 0xBDE8, + 20512 - 11905: 0x828B, + 20513 - 11905: 0xB3AB, + 20514 - 11905: 0x828C, + 20515 - 11905: 0x828D, + 20516 - 11905: 0x828E, + 20517 - 11905: 0xD9C5, + 20518 - 11905: 0xBEEB, + 20519 - 11905: 0x828F, + 20520 - 11905: 0xD9C6, + 20521 - 11905: 0xD9BB, + 20522 - 11905: 0xC4DF, + 20523 - 11905: 0x8290, + 20524 - 11905: 0xD9BE, + 20525 - 11905: 0xD9C1, + 20526 - 11905: 0xD9C0, + 20527 - 11905: 0x8291, + 20528 - 11905: 0x8292, + 20529 - 11905: 0x8293, + 20530 - 11905: 0x8294, + 20531 - 11905: 0x8295, + 20532 - 11905: 0x8296, + 20533 - 11905: 0x8297, + 20534 - 11905: 0x8298, + 20535 - 11905: 0x8299, + 20536 - 11905: 0x829A, + 20537 - 11905: 0x829B, + 20538 - 11905: 0xD5AE, + 20539 - 11905: 0x829C, + 20540 - 11905: 0xD6B5, + 20541 - 11905: 0x829D, + 20542 - 11905: 0xC7E3, + 20543 - 11905: 0x829E, + 20544 - 11905: 0x829F, + 20545 - 11905: 0x82A0, + 20546 - 11905: 0x82A1, + 20547 - 11905: 0xD9C8, + 20548 - 11905: 0x82A2, + 20549 - 11905: 0x82A3, + 20550 - 11905: 0x82A4, + 20551 - 11905: 0xBCD9, + 20552 - 11905: 0xD9CA, + 20553 - 11905: 0x82A5, + 20554 - 11905: 0x82A6, + 20555 - 11905: 0x82A7, + 20556 - 11905: 0xD9BC, + 20557 - 11905: 0x82A8, + 20558 - 11905: 0xD9CB, + 20559 - 11905: 0xC6AB, + 20560 - 11905: 0x82A9, + 20561 - 11905: 0x82AA, + 20562 - 11905: 0x82AB, + 20563 - 11905: 0x82AC, + 20564 - 11905: 0x82AD, + 20565 - 11905: 0xD9C9, + 20566 - 11905: 0x82AE, + 20567 - 11905: 0x82AF, + 20568 - 11905: 0x82B0, + 20569 - 11905: 0x82B1, + 20570 - 11905: 0xD7F6, + 20571 - 11905: 0x82B2, + 20572 - 11905: 0xCDA3, + 20573 - 11905: 0x82B3, + 20574 - 11905: 0x82B4, + 20575 - 11905: 0x82B5, + 20576 - 11905: 0x82B6, + 20577 - 11905: 0x82B7, + 20578 - 11905: 0x82B8, + 20579 - 11905: 0x82B9, + 20580 - 11905: 0x82BA, + 20581 - 11905: 0xBDA1, + 20582 - 11905: 0x82BB, + 20583 - 11905: 0x82BC, + 20584 - 11905: 0x82BD, + 20585 - 11905: 0x82BE, + 20586 - 11905: 0x82BF, + 20587 - 11905: 0x82C0, + 20588 - 11905: 0xD9CC, + 20589 - 11905: 0x82C1, + 20590 - 11905: 0x82C2, + 20591 - 11905: 0x82C3, + 20592 - 11905: 0x82C4, + 20593 - 11905: 0x82C5, + 20594 - 11905: 0x82C6, + 20595 - 11905: 0x82C7, + 20596 - 11905: 0x82C8, + 20597 - 11905: 0x82C9, + 20598 - 11905: 0xC5BC, + 20599 - 11905: 0xCDB5, + 20600 - 11905: 0x82CA, + 20601 - 11905: 0x82CB, + 20602 - 11905: 0x82CC, + 20603 - 11905: 0xD9CD, + 20604 - 11905: 0x82CD, + 20605 - 11905: 0x82CE, + 20606 - 11905: 0xD9C7, + 20607 - 11905: 0xB3A5, + 20608 - 11905: 0xBFFE, + 20609 - 11905: 0x82CF, + 20610 - 11905: 0x82D0, + 20611 - 11905: 0x82D1, + 20612 - 11905: 0x82D2, + 20613 - 11905: 0xB8B5, + 20614 - 11905: 0x82D3, + 20615 - 11905: 0x82D4, + 20616 - 11905: 0xC0FC, + 20617 - 11905: 0x82D5, + 20618 - 11905: 0x82D6, + 20619 - 11905: 0x82D7, + 20620 - 11905: 0x82D8, + 20621 - 11905: 0xB0F8, + 20622 - 11905: 0x82D9, + 20623 - 11905: 0x82DA, + 20624 - 11905: 0x82DB, + 20625 - 11905: 0x82DC, + 20626 - 11905: 0x82DD, + 20627 - 11905: 0x82DE, + 20628 - 11905: 0x82DF, + 20629 - 11905: 0x82E0, + 20630 - 11905: 0x82E1, + 20631 - 11905: 0x82E2, + 20632 - 11905: 0x82E3, + 20633 - 11905: 0x82E4, + 20634 - 11905: 0x82E5, + 20635 - 11905: 0x82E6, + 20636 - 11905: 0x82E7, + 20637 - 11905: 0x82E8, + 20638 - 11905: 0x82E9, + 20639 - 11905: 0x82EA, + 20640 - 11905: 0x82EB, + 20641 - 11905: 0x82EC, + 20642 - 11905: 0x82ED, + 20643 - 11905: 0xB4F6, + 20644 - 11905: 0x82EE, + 20645 - 11905: 0xD9CE, + 20646 - 11905: 0x82EF, + 20647 - 11905: 0xD9CF, + 20648 - 11905: 0xB4A2, + 20649 - 11905: 0xD9D0, + 20650 - 11905: 0x82F0, + 20651 - 11905: 0x82F1, + 20652 - 11905: 0xB4DF, + 20653 - 11905: 0x82F2, + 20654 - 11905: 0x82F3, + 20655 - 11905: 0x82F4, + 20656 - 11905: 0x82F5, + 20657 - 11905: 0x82F6, + 20658 - 11905: 0xB0C1, + 20659 - 11905: 0x82F7, + 20660 - 11905: 0x82F8, + 20661 - 11905: 0x82F9, + 20662 - 11905: 0x82FA, + 20663 - 11905: 0x82FB, + 20664 - 11905: 0x82FC, + 20665 - 11905: 0x82FD, + 20666 - 11905: 0xD9D1, + 20667 - 11905: 0xC9B5, + 20668 - 11905: 0x82FE, + 20669 - 11905: 0x8340, + 20670 - 11905: 0x8341, + 20671 - 11905: 0x8342, + 20672 - 11905: 0x8343, + 20673 - 11905: 0x8344, + 20674 - 11905: 0x8345, + 20675 - 11905: 0x8346, + 20676 - 11905: 0x8347, + 20677 - 11905: 0x8348, + 20678 - 11905: 0x8349, + 20679 - 11905: 0x834A, + 20680 - 11905: 0x834B, + 20681 - 11905: 0x834C, + 20682 - 11905: 0x834D, + 20683 - 11905: 0x834E, + 20684 - 11905: 0x834F, + 20685 - 11905: 0x8350, + 20686 - 11905: 0x8351, + 20687 - 11905: 0xCFF1, + 20688 - 11905: 0x8352, + 20689 - 11905: 0x8353, + 20690 - 11905: 0x8354, + 20691 - 11905: 0x8355, + 20692 - 11905: 0x8356, + 20693 - 11905: 0x8357, + 20694 - 11905: 0xD9D2, + 20695 - 11905: 0x8358, + 20696 - 11905: 0x8359, + 20697 - 11905: 0x835A, + 20698 - 11905: 0xC1C5, + 20699 - 11905: 0x835B, + 20700 - 11905: 0x835C, + 20701 - 11905: 0x835D, + 20702 - 11905: 0x835E, + 20703 - 11905: 0x835F, + 20704 - 11905: 0x8360, + 20705 - 11905: 0x8361, + 20706 - 11905: 0x8362, + 20707 - 11905: 0x8363, + 20708 - 11905: 0x8364, + 20709 - 11905: 0x8365, + 20710 - 11905: 0xD9D6, + 20711 - 11905: 0xC9AE, + 20712 - 11905: 0x8366, + 20713 - 11905: 0x8367, + 20714 - 11905: 0x8368, + 20715 - 11905: 0x8369, + 20716 - 11905: 0xD9D5, + 20717 - 11905: 0xD9D4, + 20718 - 11905: 0xD9D7, + 20719 - 11905: 0x836A, + 20720 - 11905: 0x836B, + 20721 - 11905: 0x836C, + 20722 - 11905: 0x836D, + 20723 - 11905: 0xCBDB, + 20724 - 11905: 0x836E, + 20725 - 11905: 0xBDA9, + 20726 - 11905: 0x836F, + 20727 - 11905: 0x8370, + 20728 - 11905: 0x8371, + 20729 - 11905: 0x8372, + 20730 - 11905: 0x8373, + 20731 - 11905: 0xC6A7, + 20732 - 11905: 0x8374, + 20733 - 11905: 0x8375, + 20734 - 11905: 0x8376, + 20735 - 11905: 0x8377, + 20736 - 11905: 0x8378, + 20737 - 11905: 0x8379, + 20738 - 11905: 0x837A, + 20739 - 11905: 0x837B, + 20740 - 11905: 0x837C, + 20741 - 11905: 0x837D, + 20742 - 11905: 0xD9D3, + 20743 - 11905: 0xD9D8, + 20744 - 11905: 0x837E, + 20745 - 11905: 0x8380, + 20746 - 11905: 0x8381, + 20747 - 11905: 0xD9D9, + 20748 - 11905: 0x8382, + 20749 - 11905: 0x8383, + 20750 - 11905: 0x8384, + 20751 - 11905: 0x8385, + 20752 - 11905: 0x8386, + 20753 - 11905: 0x8387, + 20754 - 11905: 0xC8E5, + 20755 - 11905: 0x8388, + 20756 - 11905: 0x8389, + 20757 - 11905: 0x838A, + 20758 - 11905: 0x838B, + 20759 - 11905: 0x838C, + 20760 - 11905: 0x838D, + 20761 - 11905: 0x838E, + 20762 - 11905: 0x838F, + 20763 - 11905: 0x8390, + 20764 - 11905: 0x8391, + 20765 - 11905: 0x8392, + 20766 - 11905: 0x8393, + 20767 - 11905: 0x8394, + 20768 - 11905: 0x8395, + 20769 - 11905: 0xC0DC, + 20770 - 11905: 0x8396, + 20771 - 11905: 0x8397, + 20772 - 11905: 0x8398, + 20773 - 11905: 0x8399, + 20774 - 11905: 0x839A, + 20775 - 11905: 0x839B, + 20776 - 11905: 0x839C, + 20777 - 11905: 0x839D, + 20778 - 11905: 0x839E, + 20779 - 11905: 0x839F, + 20780 - 11905: 0x83A0, + 20781 - 11905: 0x83A1, + 20782 - 11905: 0x83A2, + 20783 - 11905: 0x83A3, + 20784 - 11905: 0x83A4, + 20785 - 11905: 0x83A5, + 20786 - 11905: 0x83A6, + 20787 - 11905: 0x83A7, + 20788 - 11905: 0x83A8, + 20789 - 11905: 0x83A9, + 20790 - 11905: 0x83AA, + 20791 - 11905: 0x83AB, + 20792 - 11905: 0x83AC, + 20793 - 11905: 0x83AD, + 20794 - 11905: 0x83AE, + 20795 - 11905: 0x83AF, + 20796 - 11905: 0x83B0, + 20797 - 11905: 0x83B1, + 20798 - 11905: 0x83B2, + 20799 - 11905: 0xB6F9, + 20800 - 11905: 0xD8A3, + 20801 - 11905: 0xD4CA, + 20802 - 11905: 0x83B3, + 20803 - 11905: 0xD4AA, + 20804 - 11905: 0xD0D6, + 20805 - 11905: 0xB3E4, + 20806 - 11905: 0xD5D7, + 20807 - 11905: 0x83B4, + 20808 - 11905: 0xCFC8, + 20809 - 11905: 0xB9E2, + 20810 - 11905: 0x83B5, + 20811 - 11905: 0xBFCB, + 20812 - 11905: 0x83B6, + 20813 - 11905: 0xC3E2, + 20814 - 11905: 0x83B7, + 20815 - 11905: 0x83B8, + 20816 - 11905: 0x83B9, + 20817 - 11905: 0xB6D2, + 20818 - 11905: 0x83BA, + 20819 - 11905: 0x83BB, + 20820 - 11905: 0xCDC3, + 20821 - 11905: 0xD9EE, + 20822 - 11905: 0xD9F0, + 20823 - 11905: 0x83BC, + 20824 - 11905: 0x83BD, + 20825 - 11905: 0x83BE, + 20826 - 11905: 0xB5B3, + 20827 - 11905: 0x83BF, + 20828 - 11905: 0xB6B5, + 20829 - 11905: 0x83C0, + 20830 - 11905: 0x83C1, + 20831 - 11905: 0x83C2, + 20832 - 11905: 0x83C3, + 20833 - 11905: 0x83C4, + 20834 - 11905: 0xBEA4, + 20835 - 11905: 0x83C5, + 20836 - 11905: 0x83C6, + 20837 - 11905: 0xC8EB, + 20838 - 11905: 0x83C7, + 20839 - 11905: 0x83C8, + 20840 - 11905: 0xC8AB, + 20841 - 11905: 0x83C9, + 20842 - 11905: 0x83CA, + 20843 - 11905: 0xB0CB, + 20844 - 11905: 0xB9AB, + 20845 - 11905: 0xC1F9, + 20846 - 11905: 0xD9E2, + 20847 - 11905: 0x83CB, + 20848 - 11905: 0xC0BC, + 20849 - 11905: 0xB9B2, + 20850 - 11905: 0x83CC, + 20851 - 11905: 0xB9D8, + 20852 - 11905: 0xD0CB, + 20853 - 11905: 0xB1F8, + 20854 - 11905: 0xC6E4, + 20855 - 11905: 0xBEDF, + 20856 - 11905: 0xB5E4, + 20857 - 11905: 0xD7C8, + 20858 - 11905: 0x83CD, + 20859 - 11905: 0xD1F8, + 20860 - 11905: 0xBCE6, + 20861 - 11905: 0xCADE, + 20862 - 11905: 0x83CE, + 20863 - 11905: 0x83CF, + 20864 - 11905: 0xBCBD, + 20865 - 11905: 0xD9E6, + 20866 - 11905: 0xD8E7, + 20867 - 11905: 0x83D0, + 20868 - 11905: 0x83D1, + 20869 - 11905: 0xC4DA, + 20870 - 11905: 0x83D2, + 20871 - 11905: 0x83D3, + 20872 - 11905: 0xB8D4, + 20873 - 11905: 0xC8BD, + 20874 - 11905: 0x83D4, + 20875 - 11905: 0x83D5, + 20876 - 11905: 0xB2E1, + 20877 - 11905: 0xD4D9, + 20878 - 11905: 0x83D6, + 20879 - 11905: 0x83D7, + 20880 - 11905: 0x83D8, + 20881 - 11905: 0x83D9, + 20882 - 11905: 0xC3B0, + 20883 - 11905: 0x83DA, + 20884 - 11905: 0x83DB, + 20885 - 11905: 0xC3E1, + 20886 - 11905: 0xDAA2, + 20887 - 11905: 0xC8DF, + 20888 - 11905: 0x83DC, + 20889 - 11905: 0xD0B4, + 20890 - 11905: 0x83DD, + 20891 - 11905: 0xBEFC, + 20892 - 11905: 0xC5A9, + 20893 - 11905: 0x83DE, + 20894 - 11905: 0x83DF, + 20895 - 11905: 0x83E0, + 20896 - 11905: 0xB9DA, + 20897 - 11905: 0x83E1, + 20898 - 11905: 0xDAA3, + 20899 - 11905: 0x83E2, + 20900 - 11905: 0xD4A9, + 20901 - 11905: 0xDAA4, + 20902 - 11905: 0x83E3, + 20903 - 11905: 0x83E4, + 20904 - 11905: 0x83E5, + 20905 - 11905: 0x83E6, + 20906 - 11905: 0x83E7, + 20907 - 11905: 0xD9FB, + 20908 - 11905: 0xB6AC, + 20909 - 11905: 0x83E8, + 20910 - 11905: 0x83E9, + 20911 - 11905: 0xB7EB, + 20912 - 11905: 0xB1F9, + 20913 - 11905: 0xD9FC, + 20914 - 11905: 0xB3E5, + 20915 - 11905: 0xBEF6, + 20916 - 11905: 0x83EA, + 20917 - 11905: 0xBFF6, + 20918 - 11905: 0xD2B1, + 20919 - 11905: 0xC0E4, + 20920 - 11905: 0x83EB, + 20921 - 11905: 0x83EC, + 20922 - 11905: 0x83ED, + 20923 - 11905: 0xB6B3, + 20924 - 11905: 0xD9FE, + 20925 - 11905: 0xD9FD, + 20926 - 11905: 0x83EE, + 20927 - 11905: 0x83EF, + 20928 - 11905: 0xBEBB, + 20929 - 11905: 0x83F0, + 20930 - 11905: 0x83F1, + 20931 - 11905: 0x83F2, + 20932 - 11905: 0xC6E0, + 20933 - 11905: 0x83F3, + 20934 - 11905: 0xD7BC, + 20935 - 11905: 0xDAA1, + 20936 - 11905: 0x83F4, + 20937 - 11905: 0xC1B9, + 20938 - 11905: 0x83F5, + 20939 - 11905: 0xB5F2, + 20940 - 11905: 0xC1E8, + 20941 - 11905: 0x83F6, + 20942 - 11905: 0x83F7, + 20943 - 11905: 0xBCF5, + 20944 - 11905: 0x83F8, + 20945 - 11905: 0xB4D5, + 20946 - 11905: 0x83F9, + 20947 - 11905: 0x83FA, + 20948 - 11905: 0x83FB, + 20949 - 11905: 0x83FC, + 20950 - 11905: 0x83FD, + 20951 - 11905: 0x83FE, + 20952 - 11905: 0x8440, + 20953 - 11905: 0x8441, + 20954 - 11905: 0x8442, + 20955 - 11905: 0xC1DD, + 20956 - 11905: 0x8443, + 20957 - 11905: 0xC4FD, + 20958 - 11905: 0x8444, + 20959 - 11905: 0x8445, + 20960 - 11905: 0xBCB8, + 20961 - 11905: 0xB7B2, + 20962 - 11905: 0x8446, + 20963 - 11905: 0x8447, + 20964 - 11905: 0xB7EF, + 20965 - 11905: 0x8448, + 20966 - 11905: 0x8449, + 20967 - 11905: 0x844A, + 20968 - 11905: 0x844B, + 20969 - 11905: 0x844C, + 20970 - 11905: 0x844D, + 20971 - 11905: 0xD9EC, + 20972 - 11905: 0x844E, + 20973 - 11905: 0xC6BE, + 20974 - 11905: 0x844F, + 20975 - 11905: 0xBFAD, + 20976 - 11905: 0xBBCB, + 20977 - 11905: 0x8450, + 20978 - 11905: 0x8451, + 20979 - 11905: 0xB5CA, + 20980 - 11905: 0x8452, + 20981 - 11905: 0xDBC9, + 20982 - 11905: 0xD0D7, + 20983 - 11905: 0x8453, + 20984 - 11905: 0xCDB9, + 20985 - 11905: 0xB0BC, + 20986 - 11905: 0xB3F6, + 20987 - 11905: 0xBBF7, + 20988 - 11905: 0xDBCA, + 20989 - 11905: 0xBAAF, + 20990 - 11905: 0x8454, + 20991 - 11905: 0xD4E4, + 20992 - 11905: 0xB5B6, + 20993 - 11905: 0xB5F3, + 20994 - 11905: 0xD8D6, + 20995 - 11905: 0xC8D0, + 20996 - 11905: 0x8455, + 20997 - 11905: 0x8456, + 20998 - 11905: 0xB7D6, + 20999 - 11905: 0xC7D0, + 21000 - 11905: 0xD8D7, + 21001 - 11905: 0x8457, + 21002 - 11905: 0xBFAF, + 21003 - 11905: 0x8458, + 21004 - 11905: 0x8459, + 21005 - 11905: 0xDBBB, + 21006 - 11905: 0xD8D8, + 21007 - 11905: 0x845A, + 21008 - 11905: 0x845B, + 21009 - 11905: 0xD0CC, + 21010 - 11905: 0xBBAE, + 21011 - 11905: 0x845C, + 21012 - 11905: 0x845D, + 21013 - 11905: 0x845E, + 21014 - 11905: 0xEBBE, + 21015 - 11905: 0xC1D0, + 21016 - 11905: 0xC1F5, + 21017 - 11905: 0xD4F2, + 21018 - 11905: 0xB8D5, + 21019 - 11905: 0xB4B4, + 21020 - 11905: 0x845F, + 21021 - 11905: 0xB3F5, + 21022 - 11905: 0x8460, + 21023 - 11905: 0x8461, + 21024 - 11905: 0xC9BE, + 21025 - 11905: 0x8462, + 21026 - 11905: 0x8463, + 21027 - 11905: 0x8464, + 21028 - 11905: 0xC5D0, + 21029 - 11905: 0x8465, + 21030 - 11905: 0x8466, + 21031 - 11905: 0x8467, + 21032 - 11905: 0xC5D9, + 21033 - 11905: 0xC0FB, + 21034 - 11905: 0x8468, + 21035 - 11905: 0xB1F0, + 21036 - 11905: 0x8469, + 21037 - 11905: 0xD8D9, + 21038 - 11905: 0xB9CE, + 21039 - 11905: 0x846A, + 21040 - 11905: 0xB5BD, + 21041 - 11905: 0x846B, + 21042 - 11905: 0x846C, + 21043 - 11905: 0xD8DA, + 21044 - 11905: 0x846D, + 21045 - 11905: 0x846E, + 21046 - 11905: 0xD6C6, + 21047 - 11905: 0xCBA2, + 21048 - 11905: 0xC8AF, + 21049 - 11905: 0xC9B2, + 21050 - 11905: 0xB4CC, + 21051 - 11905: 0xBFCC, + 21052 - 11905: 0x846F, + 21053 - 11905: 0xB9F4, + 21054 - 11905: 0x8470, + 21055 - 11905: 0xD8DB, + 21056 - 11905: 0xD8DC, + 21057 - 11905: 0xB6E7, + 21058 - 11905: 0xBCC1, + 21059 - 11905: 0xCCEA, + 21060 - 11905: 0x8471, + 21061 - 11905: 0x8472, + 21062 - 11905: 0x8473, + 21063 - 11905: 0x8474, + 21064 - 11905: 0x8475, + 21065 - 11905: 0x8476, + 21066 - 11905: 0xCFF7, + 21067 - 11905: 0x8477, + 21068 - 11905: 0xD8DD, + 21069 - 11905: 0xC7B0, + 21070 - 11905: 0x8478, + 21071 - 11905: 0x8479, + 21072 - 11905: 0xB9D0, + 21073 - 11905: 0xBDA3, + 21074 - 11905: 0x847A, + 21075 - 11905: 0x847B, + 21076 - 11905: 0xCCDE, + 21077 - 11905: 0x847C, + 21078 - 11905: 0xC6CA, + 21079 - 11905: 0x847D, + 21080 - 11905: 0x847E, + 21081 - 11905: 0x8480, + 21082 - 11905: 0x8481, + 21083 - 11905: 0x8482, + 21084 - 11905: 0xD8E0, + 21085 - 11905: 0x8483, + 21086 - 11905: 0xD8DE, + 21087 - 11905: 0x8484, + 21088 - 11905: 0x8485, + 21089 - 11905: 0xD8DF, + 21090 - 11905: 0x8486, + 21091 - 11905: 0x8487, + 21092 - 11905: 0x8488, + 21093 - 11905: 0xB0FE, + 21094 - 11905: 0x8489, + 21095 - 11905: 0xBEE7, + 21096 - 11905: 0x848A, + 21097 - 11905: 0xCAA3, + 21098 - 11905: 0xBCF4, + 21099 - 11905: 0x848B, + 21100 - 11905: 0x848C, + 21101 - 11905: 0x848D, + 21102 - 11905: 0x848E, + 21103 - 11905: 0xB8B1, + 21104 - 11905: 0x848F, + 21105 - 11905: 0x8490, + 21106 - 11905: 0xB8EE, + 21107 - 11905: 0x8491, + 21108 - 11905: 0x8492, + 21109 - 11905: 0x8493, + 21110 - 11905: 0x8494, + 21111 - 11905: 0x8495, + 21112 - 11905: 0x8496, + 21113 - 11905: 0x8497, + 21114 - 11905: 0x8498, + 21115 - 11905: 0x8499, + 21116 - 11905: 0x849A, + 21117 - 11905: 0xD8E2, + 21118 - 11905: 0x849B, + 21119 - 11905: 0xBDCB, + 21120 - 11905: 0x849C, + 21121 - 11905: 0xD8E4, + 21122 - 11905: 0xD8E3, + 21123 - 11905: 0x849D, + 21124 - 11905: 0x849E, + 21125 - 11905: 0x849F, + 21126 - 11905: 0x84A0, + 21127 - 11905: 0x84A1, + 21128 - 11905: 0xC5FC, + 21129 - 11905: 0x84A2, + 21130 - 11905: 0x84A3, + 21131 - 11905: 0x84A4, + 21132 - 11905: 0x84A5, + 21133 - 11905: 0x84A6, + 21134 - 11905: 0x84A7, + 21135 - 11905: 0x84A8, + 21136 - 11905: 0xD8E5, + 21137 - 11905: 0x84A9, + 21138 - 11905: 0x84AA, + 21139 - 11905: 0xD8E6, + 21140 - 11905: 0x84AB, + 21141 - 11905: 0x84AC, + 21142 - 11905: 0x84AD, + 21143 - 11905: 0x84AE, + 21144 - 11905: 0x84AF, + 21145 - 11905: 0x84B0, + 21146 - 11905: 0x84B1, + 21147 - 11905: 0xC1A6, + 21148 - 11905: 0x84B2, + 21149 - 11905: 0xC8B0, + 21150 - 11905: 0xB0EC, + 21151 - 11905: 0xB9A6, + 21152 - 11905: 0xBCD3, + 21153 - 11905: 0xCEF1, + 21154 - 11905: 0xDBBD, + 21155 - 11905: 0xC1D3, + 21156 - 11905: 0x84B3, + 21157 - 11905: 0x84B4, + 21158 - 11905: 0x84B5, + 21159 - 11905: 0x84B6, + 21160 - 11905: 0xB6AF, + 21161 - 11905: 0xD6FA, + 21162 - 11905: 0xC5AC, + 21163 - 11905: 0xBDD9, + 21164 - 11905: 0xDBBE, + 21165 - 11905: 0xDBBF, + 21166 - 11905: 0x84B7, + 21167 - 11905: 0x84B8, + 21168 - 11905: 0x84B9, + 21169 - 11905: 0xC0F8, + 21170 - 11905: 0xBEA2, + 21171 - 11905: 0xC0CD, + 21172 - 11905: 0x84BA, + 21173 - 11905: 0x84BB, + 21174 - 11905: 0x84BC, + 21175 - 11905: 0x84BD, + 21176 - 11905: 0x84BE, + 21177 - 11905: 0x84BF, + 21178 - 11905: 0x84C0, + 21179 - 11905: 0x84C1, + 21180 - 11905: 0x84C2, + 21181 - 11905: 0x84C3, + 21182 - 11905: 0xDBC0, + 21183 - 11905: 0xCAC6, + 21184 - 11905: 0x84C4, + 21185 - 11905: 0x84C5, + 21186 - 11905: 0x84C6, + 21187 - 11905: 0xB2AA, + 21188 - 11905: 0x84C7, + 21189 - 11905: 0x84C8, + 21190 - 11905: 0x84C9, + 21191 - 11905: 0xD3C2, + 21192 - 11905: 0x84CA, + 21193 - 11905: 0xC3E3, + 21194 - 11905: 0x84CB, + 21195 - 11905: 0xD1AB, + 21196 - 11905: 0x84CC, + 21197 - 11905: 0x84CD, + 21198 - 11905: 0x84CE, + 21199 - 11905: 0x84CF, + 21200 - 11905: 0xDBC2, + 21201 - 11905: 0x84D0, + 21202 - 11905: 0xC0D5, + 21203 - 11905: 0x84D1, + 21204 - 11905: 0x84D2, + 21205 - 11905: 0x84D3, + 21206 - 11905: 0xDBC3, + 21207 - 11905: 0x84D4, + 21208 - 11905: 0xBFB1, + 21209 - 11905: 0x84D5, + 21210 - 11905: 0x84D6, + 21211 - 11905: 0x84D7, + 21212 - 11905: 0x84D8, + 21213 - 11905: 0x84D9, + 21214 - 11905: 0x84DA, + 21215 - 11905: 0xC4BC, + 21216 - 11905: 0x84DB, + 21217 - 11905: 0x84DC, + 21218 - 11905: 0x84DD, + 21219 - 11905: 0x84DE, + 21220 - 11905: 0xC7DA, + 21221 - 11905: 0x84DF, + 21222 - 11905: 0x84E0, + 21223 - 11905: 0x84E1, + 21224 - 11905: 0x84E2, + 21225 - 11905: 0x84E3, + 21226 - 11905: 0x84E4, + 21227 - 11905: 0x84E5, + 21228 - 11905: 0x84E6, + 21229 - 11905: 0x84E7, + 21230 - 11905: 0x84E8, + 21231 - 11905: 0x84E9, + 21232 - 11905: 0xDBC4, + 21233 - 11905: 0x84EA, + 21234 - 11905: 0x84EB, + 21235 - 11905: 0x84EC, + 21236 - 11905: 0x84ED, + 21237 - 11905: 0x84EE, + 21238 - 11905: 0x84EF, + 21239 - 11905: 0x84F0, + 21240 - 11905: 0x84F1, + 21241 - 11905: 0xD9E8, + 21242 - 11905: 0xC9D7, + 21243 - 11905: 0x84F2, + 21244 - 11905: 0x84F3, + 21245 - 11905: 0x84F4, + 21246 - 11905: 0xB9B4, + 21247 - 11905: 0xCEF0, + 21248 - 11905: 0xD4C8, + 21249 - 11905: 0x84F5, + 21250 - 11905: 0x84F6, + 21251 - 11905: 0x84F7, + 21252 - 11905: 0x84F8, + 21253 - 11905: 0xB0FC, + 21254 - 11905: 0xB4D2, + 21255 - 11905: 0x84F9, + 21256 - 11905: 0xD0D9, + 21257 - 11905: 0x84FA, + 21258 - 11905: 0x84FB, + 21259 - 11905: 0x84FC, + 21260 - 11905: 0x84FD, + 21261 - 11905: 0xD9E9, + 21262 - 11905: 0x84FE, + 21263 - 11905: 0xDECB, + 21264 - 11905: 0xD9EB, + 21265 - 11905: 0x8540, + 21266 - 11905: 0x8541, + 21267 - 11905: 0x8542, + 21268 - 11905: 0x8543, + 21269 - 11905: 0xD8B0, + 21270 - 11905: 0xBBAF, + 21271 - 11905: 0xB1B1, + 21272 - 11905: 0x8544, + 21273 - 11905: 0xB3D7, + 21274 - 11905: 0xD8CE, + 21275 - 11905: 0x8545, + 21276 - 11905: 0x8546, + 21277 - 11905: 0xD4D1, + 21278 - 11905: 0x8547, + 21279 - 11905: 0x8548, + 21280 - 11905: 0xBDB3, + 21281 - 11905: 0xBFEF, + 21282 - 11905: 0x8549, + 21283 - 11905: 0xCFBB, + 21284 - 11905: 0x854A, + 21285 - 11905: 0x854B, + 21286 - 11905: 0xD8D0, + 21287 - 11905: 0x854C, + 21288 - 11905: 0x854D, + 21289 - 11905: 0x854E, + 21290 - 11905: 0xB7CB, + 21291 - 11905: 0x854F, + 21292 - 11905: 0x8550, + 21293 - 11905: 0x8551, + 21294 - 11905: 0xD8D1, + 21295 - 11905: 0x8552, + 21296 - 11905: 0x8553, + 21297 - 11905: 0x8554, + 21298 - 11905: 0x8555, + 21299 - 11905: 0x8556, + 21300 - 11905: 0x8557, + 21301 - 11905: 0x8558, + 21302 - 11905: 0x8559, + 21303 - 11905: 0x855A, + 21304 - 11905: 0x855B, + 21305 - 11905: 0xC6A5, + 21306 - 11905: 0xC7F8, + 21307 - 11905: 0xD2BD, + 21308 - 11905: 0x855C, + 21309 - 11905: 0x855D, + 21310 - 11905: 0xD8D2, + 21311 - 11905: 0xC4E4, + 21312 - 11905: 0x855E, + 21313 - 11905: 0xCAAE, + 21314 - 11905: 0x855F, + 21315 - 11905: 0xC7A7, + 21316 - 11905: 0x8560, + 21317 - 11905: 0xD8A6, + 21318 - 11905: 0x8561, + 21319 - 11905: 0xC9FD, + 21320 - 11905: 0xCEE7, + 21321 - 11905: 0xBBDC, + 21322 - 11905: 0xB0EB, + 21323 - 11905: 0x8562, + 21324 - 11905: 0x8563, + 21325 - 11905: 0x8564, + 21326 - 11905: 0xBBAA, + 21327 - 11905: 0xD0AD, + 21328 - 11905: 0x8565, + 21329 - 11905: 0xB1B0, + 21330 - 11905: 0xD7E4, + 21331 - 11905: 0xD7BF, + 21332 - 11905: 0x8566, + 21333 - 11905: 0xB5A5, + 21334 - 11905: 0xC2F4, + 21335 - 11905: 0xC4CF, + 21336 - 11905: 0x8567, + 21337 - 11905: 0x8568, + 21338 - 11905: 0xB2A9, + 21339 - 11905: 0x8569, + 21340 - 11905: 0xB2B7, + 21341 - 11905: 0x856A, + 21342 - 11905: 0xB1E5, + 21343 - 11905: 0xDFB2, + 21344 - 11905: 0xD5BC, + 21345 - 11905: 0xBFA8, + 21346 - 11905: 0xC2AC, + 21347 - 11905: 0xD8D5, + 21348 - 11905: 0xC2B1, + 21349 - 11905: 0x856B, + 21350 - 11905: 0xD8D4, + 21351 - 11905: 0xCED4, + 21352 - 11905: 0x856C, + 21353 - 11905: 0xDAE0, + 21354 - 11905: 0x856D, + 21355 - 11905: 0xCEC0, + 21356 - 11905: 0x856E, + 21357 - 11905: 0x856F, + 21358 - 11905: 0xD8B4, + 21359 - 11905: 0xC3AE, + 21360 - 11905: 0xD3A1, + 21361 - 11905: 0xCEA3, + 21362 - 11905: 0x8570, + 21363 - 11905: 0xBCB4, + 21364 - 11905: 0xC8B4, + 21365 - 11905: 0xC2D1, + 21366 - 11905: 0x8571, + 21367 - 11905: 0xBEED, + 21368 - 11905: 0xD0B6, + 21369 - 11905: 0x8572, + 21370 - 11905: 0xDAE1, + 21371 - 11905: 0x8573, + 21372 - 11905: 0x8574, + 21373 - 11905: 0x8575, + 21374 - 11905: 0x8576, + 21375 - 11905: 0xC7E4, + 21376 - 11905: 0x8577, + 21377 - 11905: 0x8578, + 21378 - 11905: 0xB3A7, + 21379 - 11905: 0x8579, + 21380 - 11905: 0xB6F2, + 21381 - 11905: 0xCCFC, + 21382 - 11905: 0xC0FA, + 21383 - 11905: 0x857A, + 21384 - 11905: 0x857B, + 21385 - 11905: 0xC0F7, + 21386 - 11905: 0x857C, + 21387 - 11905: 0xD1B9, + 21388 - 11905: 0xD1E1, + 21389 - 11905: 0xD8C7, + 21390 - 11905: 0x857D, + 21391 - 11905: 0x857E, + 21392 - 11905: 0x8580, + 21393 - 11905: 0x8581, + 21394 - 11905: 0x8582, + 21395 - 11905: 0x8583, + 21396 - 11905: 0x8584, + 21397 - 11905: 0xB2DE, + 21398 - 11905: 0x8585, + 21399 - 11905: 0x8586, + 21400 - 11905: 0xC0E5, + 21401 - 11905: 0x8587, + 21402 - 11905: 0xBAF1, + 21403 - 11905: 0x8588, + 21404 - 11905: 0x8589, + 21405 - 11905: 0xD8C8, + 21406 - 11905: 0x858A, + 21407 - 11905: 0xD4AD, + 21408 - 11905: 0x858B, + 21409 - 11905: 0x858C, + 21410 - 11905: 0xCFE1, + 21411 - 11905: 0xD8C9, + 21412 - 11905: 0x858D, + 21413 - 11905: 0xD8CA, + 21414 - 11905: 0xCFC3, + 21415 - 11905: 0x858E, + 21416 - 11905: 0xB3F8, + 21417 - 11905: 0xBEC7, + 21418 - 11905: 0x858F, + 21419 - 11905: 0x8590, + 21420 - 11905: 0x8591, + 21421 - 11905: 0x8592, + 21422 - 11905: 0xD8CB, + 21423 - 11905: 0x8593, + 21424 - 11905: 0x8594, + 21425 - 11905: 0x8595, + 21426 - 11905: 0x8596, + 21427 - 11905: 0x8597, + 21428 - 11905: 0x8598, + 21429 - 11905: 0x8599, + 21430 - 11905: 0xDBCC, + 21431 - 11905: 0x859A, + 21432 - 11905: 0x859B, + 21433 - 11905: 0x859C, + 21434 - 11905: 0x859D, + 21435 - 11905: 0xC8A5, + 21436 - 11905: 0x859E, + 21437 - 11905: 0x859F, + 21438 - 11905: 0x85A0, + 21439 - 11905: 0xCFD8, + 21440 - 11905: 0x85A1, + 21441 - 11905: 0xC8FE, + 21442 - 11905: 0xB2CE, + 21443 - 11905: 0x85A2, + 21444 - 11905: 0x85A3, + 21445 - 11905: 0x85A4, + 21446 - 11905: 0x85A5, + 21447 - 11905: 0x85A6, + 21448 - 11905: 0xD3D6, + 21449 - 11905: 0xB2E6, + 21450 - 11905: 0xBCB0, + 21451 - 11905: 0xD3D1, + 21452 - 11905: 0xCBAB, + 21453 - 11905: 0xB7B4, + 21454 - 11905: 0x85A7, + 21455 - 11905: 0x85A8, + 21456 - 11905: 0x85A9, + 21457 - 11905: 0xB7A2, + 21458 - 11905: 0x85AA, + 21459 - 11905: 0x85AB, + 21460 - 11905: 0xCAE5, + 21461 - 11905: 0x85AC, + 21462 - 11905: 0xC8A1, + 21463 - 11905: 0xCADC, + 21464 - 11905: 0xB1E4, + 21465 - 11905: 0xD0F0, + 21466 - 11905: 0x85AD, + 21467 - 11905: 0xC5D1, + 21468 - 11905: 0x85AE, + 21469 - 11905: 0x85AF, + 21470 - 11905: 0x85B0, + 21471 - 11905: 0xDBC5, + 21472 - 11905: 0xB5FE, + 21473 - 11905: 0x85B1, + 21474 - 11905: 0x85B2, + 21475 - 11905: 0xBFDA, + 21476 - 11905: 0xB9C5, + 21477 - 11905: 0xBEE4, + 21478 - 11905: 0xC1ED, + 21479 - 11905: 0x85B3, + 21480 - 11905: 0xDFB6, + 21481 - 11905: 0xDFB5, + 21482 - 11905: 0xD6BB, + 21483 - 11905: 0xBDD0, + 21484 - 11905: 0xD5D9, + 21485 - 11905: 0xB0C8, + 21486 - 11905: 0xB6A3, + 21487 - 11905: 0xBFC9, + 21488 - 11905: 0xCCA8, + 21489 - 11905: 0xDFB3, + 21490 - 11905: 0xCAB7, + 21491 - 11905: 0xD3D2, + 21492 - 11905: 0x85B4, + 21493 - 11905: 0xD8CF, + 21494 - 11905: 0xD2B6, + 21495 - 11905: 0xBAC5, + 21496 - 11905: 0xCBBE, + 21497 - 11905: 0xCCBE, + 21498 - 11905: 0x85B5, + 21499 - 11905: 0xDFB7, + 21500 - 11905: 0xB5F0, + 21501 - 11905: 0xDFB4, + 21502 - 11905: 0x85B6, + 21503 - 11905: 0x85B7, + 21504 - 11905: 0x85B8, + 21505 - 11905: 0xD3F5, + 21506 - 11905: 0x85B9, + 21507 - 11905: 0xB3D4, + 21508 - 11905: 0xB8F7, + 21509 - 11905: 0x85BA, + 21510 - 11905: 0xDFBA, + 21511 - 11905: 0x85BB, + 21512 - 11905: 0xBACF, + 21513 - 11905: 0xBCAA, + 21514 - 11905: 0xB5F5, + 21515 - 11905: 0x85BC, + 21516 - 11905: 0xCDAC, + 21517 - 11905: 0xC3FB, + 21518 - 11905: 0xBAF3, + 21519 - 11905: 0xC0F4, + 21520 - 11905: 0xCDC2, + 21521 - 11905: 0xCFF2, + 21522 - 11905: 0xDFB8, + 21523 - 11905: 0xCFC5, + 21524 - 11905: 0x85BD, + 21525 - 11905: 0xC2C0, + 21526 - 11905: 0xDFB9, + 21527 - 11905: 0xC2F0, + 21528 - 11905: 0x85BE, + 21529 - 11905: 0x85BF, + 21530 - 11905: 0x85C0, + 21531 - 11905: 0xBEFD, + 21532 - 11905: 0x85C1, + 21533 - 11905: 0xC1DF, + 21534 - 11905: 0xCDCC, + 21535 - 11905: 0xD2F7, + 21536 - 11905: 0xB7CD, + 21537 - 11905: 0xDFC1, + 21538 - 11905: 0x85C2, + 21539 - 11905: 0xDFC4, + 21540 - 11905: 0x85C3, + 21541 - 11905: 0x85C4, + 21542 - 11905: 0xB7F1, + 21543 - 11905: 0xB0C9, + 21544 - 11905: 0xB6D6, + 21545 - 11905: 0xB7D4, + 21546 - 11905: 0x85C5, + 21547 - 11905: 0xBAAC, + 21548 - 11905: 0xCCFD, + 21549 - 11905: 0xBFD4, + 21550 - 11905: 0xCBB1, + 21551 - 11905: 0xC6F4, + 21552 - 11905: 0x85C6, + 21553 - 11905: 0xD6A8, + 21554 - 11905: 0xDFC5, + 21555 - 11905: 0x85C7, + 21556 - 11905: 0xCEE2, + 21557 - 11905: 0xB3B3, + 21558 - 11905: 0x85C8, + 21559 - 11905: 0x85C9, + 21560 - 11905: 0xCEFC, + 21561 - 11905: 0xB4B5, + 21562 - 11905: 0x85CA, + 21563 - 11905: 0xCEC7, + 21564 - 11905: 0xBAF0, + 21565 - 11905: 0x85CB, + 21566 - 11905: 0xCEE1, + 21567 - 11905: 0x85CC, + 21568 - 11905: 0xD1BD, + 21569 - 11905: 0x85CD, + 21570 - 11905: 0x85CE, + 21571 - 11905: 0xDFC0, + 21572 - 11905: 0x85CF, + 21573 - 11905: 0x85D0, + 21574 - 11905: 0xB4F4, + 21575 - 11905: 0x85D1, + 21576 - 11905: 0xB3CA, + 21577 - 11905: 0x85D2, + 21578 - 11905: 0xB8E6, + 21579 - 11905: 0xDFBB, + 21580 - 11905: 0x85D3, + 21581 - 11905: 0x85D4, + 21582 - 11905: 0x85D5, + 21583 - 11905: 0x85D6, + 21584 - 11905: 0xC4C5, + 21585 - 11905: 0x85D7, + 21586 - 11905: 0xDFBC, + 21587 - 11905: 0xDFBD, + 21588 - 11905: 0xDFBE, + 21589 - 11905: 0xC5BB, + 21590 - 11905: 0xDFBF, + 21591 - 11905: 0xDFC2, + 21592 - 11905: 0xD4B1, + 21593 - 11905: 0xDFC3, + 21594 - 11905: 0x85D8, + 21595 - 11905: 0xC7BA, + 21596 - 11905: 0xCED8, + 21597 - 11905: 0x85D9, + 21598 - 11905: 0x85DA, + 21599 - 11905: 0x85DB, + 21600 - 11905: 0x85DC, + 21601 - 11905: 0x85DD, + 21602 - 11905: 0xC4D8, + 21603 - 11905: 0x85DE, + 21604 - 11905: 0xDFCA, + 21605 - 11905: 0x85DF, + 21606 - 11905: 0xDFCF, + 21607 - 11905: 0x85E0, + 21608 - 11905: 0xD6DC, + 21609 - 11905: 0x85E1, + 21610 - 11905: 0x85E2, + 21611 - 11905: 0x85E3, + 21612 - 11905: 0x85E4, + 21613 - 11905: 0x85E5, + 21614 - 11905: 0x85E6, + 21615 - 11905: 0x85E7, + 21616 - 11905: 0x85E8, + 21617 - 11905: 0xDFC9, + 21618 - 11905: 0xDFDA, + 21619 - 11905: 0xCEB6, + 21620 - 11905: 0x85E9, + 21621 - 11905: 0xBAC7, + 21622 - 11905: 0xDFCE, + 21623 - 11905: 0xDFC8, + 21624 - 11905: 0xC5DE, + 21625 - 11905: 0x85EA, + 21626 - 11905: 0x85EB, + 21627 - 11905: 0xC9EB, + 21628 - 11905: 0xBAF4, + 21629 - 11905: 0xC3FC, + 21630 - 11905: 0x85EC, + 21631 - 11905: 0x85ED, + 21632 - 11905: 0xBED7, + 21633 - 11905: 0x85EE, + 21634 - 11905: 0xDFC6, + 21635 - 11905: 0x85EF, + 21636 - 11905: 0xDFCD, + 21637 - 11905: 0x85F0, + 21638 - 11905: 0xC5D8, + 21639 - 11905: 0x85F1, + 21640 - 11905: 0x85F2, + 21641 - 11905: 0x85F3, + 21642 - 11905: 0x85F4, + 21643 - 11905: 0xD5A6, + 21644 - 11905: 0xBACD, + 21645 - 11905: 0x85F5, + 21646 - 11905: 0xBECC, + 21647 - 11905: 0xD3BD, + 21648 - 11905: 0xB8C0, + 21649 - 11905: 0x85F6, + 21650 - 11905: 0xD6E4, + 21651 - 11905: 0x85F7, + 21652 - 11905: 0xDFC7, + 21653 - 11905: 0xB9BE, + 21654 - 11905: 0xBFA7, + 21655 - 11905: 0x85F8, + 21656 - 11905: 0x85F9, + 21657 - 11905: 0xC1FC, + 21658 - 11905: 0xDFCB, + 21659 - 11905: 0xDFCC, + 21660 - 11905: 0x85FA, + 21661 - 11905: 0xDFD0, + 21662 - 11905: 0x85FB, + 21663 - 11905: 0x85FC, + 21664 - 11905: 0x85FD, + 21665 - 11905: 0x85FE, + 21666 - 11905: 0x8640, + 21667 - 11905: 0xDFDB, + 21668 - 11905: 0xDFE5, + 21669 - 11905: 0x8641, + 21670 - 11905: 0xDFD7, + 21671 - 11905: 0xDFD6, + 21672 - 11905: 0xD7C9, + 21673 - 11905: 0xDFE3, + 21674 - 11905: 0xDFE4, + 21675 - 11905: 0xE5EB, + 21676 - 11905: 0xD2A7, + 21677 - 11905: 0xDFD2, + 21678 - 11905: 0x8642, + 21679 - 11905: 0xBFA9, + 21680 - 11905: 0x8643, + 21681 - 11905: 0xD4DB, + 21682 - 11905: 0x8644, + 21683 - 11905: 0xBFC8, + 21684 - 11905: 0xDFD4, + 21685 - 11905: 0x8645, + 21686 - 11905: 0x8646, + 21687 - 11905: 0x8647, + 21688 - 11905: 0xCFCC, + 21689 - 11905: 0x8648, + 21690 - 11905: 0x8649, + 21691 - 11905: 0xDFDD, + 21692 - 11905: 0x864A, + 21693 - 11905: 0xD1CA, + 21694 - 11905: 0x864B, + 21695 - 11905: 0xDFDE, + 21696 - 11905: 0xB0A7, + 21697 - 11905: 0xC6B7, + 21698 - 11905: 0xDFD3, + 21699 - 11905: 0x864C, + 21700 - 11905: 0xBAE5, + 21701 - 11905: 0x864D, + 21702 - 11905: 0xB6DF, + 21703 - 11905: 0xCDDB, + 21704 - 11905: 0xB9FE, + 21705 - 11905: 0xD4D5, + 21706 - 11905: 0x864E, + 21707 - 11905: 0x864F, + 21708 - 11905: 0xDFDF, + 21709 - 11905: 0xCFEC, + 21710 - 11905: 0xB0A5, + 21711 - 11905: 0xDFE7, + 21712 - 11905: 0xDFD1, + 21713 - 11905: 0xD1C6, + 21714 - 11905: 0xDFD5, + 21715 - 11905: 0xDFD8, + 21716 - 11905: 0xDFD9, + 21717 - 11905: 0xDFDC, + 21718 - 11905: 0x8650, + 21719 - 11905: 0xBBA9, + 21720 - 11905: 0x8651, + 21721 - 11905: 0xDFE0, + 21722 - 11905: 0xDFE1, + 21723 - 11905: 0x8652, + 21724 - 11905: 0xDFE2, + 21725 - 11905: 0xDFE6, + 21726 - 11905: 0xDFE8, + 21727 - 11905: 0xD3B4, + 21728 - 11905: 0x8653, + 21729 - 11905: 0x8654, + 21730 - 11905: 0x8655, + 21731 - 11905: 0x8656, + 21732 - 11905: 0x8657, + 21733 - 11905: 0xB8E7, + 21734 - 11905: 0xC5B6, + 21735 - 11905: 0xDFEA, + 21736 - 11905: 0xC9DA, + 21737 - 11905: 0xC1A8, + 21738 - 11905: 0xC4C4, + 21739 - 11905: 0x8658, + 21740 - 11905: 0x8659, + 21741 - 11905: 0xBFDE, + 21742 - 11905: 0xCFF8, + 21743 - 11905: 0x865A, + 21744 - 11905: 0x865B, + 21745 - 11905: 0x865C, + 21746 - 11905: 0xD5DC, + 21747 - 11905: 0xDFEE, + 21748 - 11905: 0x865D, + 21749 - 11905: 0x865E, + 21750 - 11905: 0x865F, + 21751 - 11905: 0x8660, + 21752 - 11905: 0x8661, + 21753 - 11905: 0x8662, + 21754 - 11905: 0xB2B8, + 21755 - 11905: 0x8663, + 21756 - 11905: 0xBADF, + 21757 - 11905: 0xDFEC, + 21758 - 11905: 0x8664, + 21759 - 11905: 0xDBC1, + 21760 - 11905: 0x8665, + 21761 - 11905: 0xD1E4, + 21762 - 11905: 0x8666, + 21763 - 11905: 0x8667, + 21764 - 11905: 0x8668, + 21765 - 11905: 0x8669, + 21766 - 11905: 0xCBF4, + 21767 - 11905: 0xB4BD, + 21768 - 11905: 0x866A, + 21769 - 11905: 0xB0A6, + 21770 - 11905: 0x866B, + 21771 - 11905: 0x866C, + 21772 - 11905: 0x866D, + 21773 - 11905: 0x866E, + 21774 - 11905: 0x866F, + 21775 - 11905: 0xDFF1, + 21776 - 11905: 0xCCC6, + 21777 - 11905: 0xDFF2, + 21778 - 11905: 0x8670, + 21779 - 11905: 0x8671, + 21780 - 11905: 0xDFED, + 21781 - 11905: 0x8672, + 21782 - 11905: 0x8673, + 21783 - 11905: 0x8674, + 21784 - 11905: 0x8675, + 21785 - 11905: 0x8676, + 21786 - 11905: 0x8677, + 21787 - 11905: 0xDFE9, + 21788 - 11905: 0x8678, + 21789 - 11905: 0x8679, + 21790 - 11905: 0x867A, + 21791 - 11905: 0x867B, + 21792 - 11905: 0xDFEB, + 21793 - 11905: 0x867C, + 21794 - 11905: 0xDFEF, + 21795 - 11905: 0xDFF0, + 21796 - 11905: 0xBBBD, + 21797 - 11905: 0x867D, + 21798 - 11905: 0x867E, + 21799 - 11905: 0xDFF3, + 21800 - 11905: 0x8680, + 21801 - 11905: 0x8681, + 21802 - 11905: 0xDFF4, + 21803 - 11905: 0x8682, + 21804 - 11905: 0xBBA3, + 21805 - 11905: 0x8683, + 21806 - 11905: 0xCADB, + 21807 - 11905: 0xCEA8, + 21808 - 11905: 0xE0A7, + 21809 - 11905: 0xB3AA, + 21810 - 11905: 0x8684, + 21811 - 11905: 0xE0A6, + 21812 - 11905: 0x8685, + 21813 - 11905: 0x8686, + 21814 - 11905: 0x8687, + 21815 - 11905: 0xE0A1, + 21816 - 11905: 0x8688, + 21817 - 11905: 0x8689, + 21818 - 11905: 0x868A, + 21819 - 11905: 0x868B, + 21820 - 11905: 0xDFFE, + 21821 - 11905: 0x868C, + 21822 - 11905: 0xCDD9, + 21823 - 11905: 0xDFFC, + 21824 - 11905: 0x868D, + 21825 - 11905: 0xDFFA, + 21826 - 11905: 0x868E, + 21827 - 11905: 0xBFD0, + 21828 - 11905: 0xD7C4, + 21829 - 11905: 0x868F, + 21830 - 11905: 0xC9CC, + 21831 - 11905: 0x8690, + 21832 - 11905: 0x8691, + 21833 - 11905: 0xDFF8, + 21834 - 11905: 0xB0A1, + 21835 - 11905: 0x8692, + 21836 - 11905: 0x8693, + 21837 - 11905: 0x8694, + 21838 - 11905: 0x8695, + 21839 - 11905: 0x8696, + 21840 - 11905: 0xDFFD, + 21841 - 11905: 0x8697, + 21842 - 11905: 0x8698, + 21843 - 11905: 0x8699, + 21844 - 11905: 0x869A, + 21845 - 11905: 0xDFFB, + 21846 - 11905: 0xE0A2, + 21847 - 11905: 0x869B, + 21848 - 11905: 0x869C, + 21849 - 11905: 0x869D, + 21850 - 11905: 0x869E, + 21851 - 11905: 0x869F, + 21852 - 11905: 0xE0A8, + 21853 - 11905: 0x86A0, + 21854 - 11905: 0x86A1, + 21855 - 11905: 0x86A2, + 21856 - 11905: 0x86A3, + 21857 - 11905: 0xB7C8, + 21858 - 11905: 0x86A4, + 21859 - 11905: 0x86A5, + 21860 - 11905: 0xC6A1, + 21861 - 11905: 0xC9B6, + 21862 - 11905: 0xC0B2, + 21863 - 11905: 0xDFF5, + 21864 - 11905: 0x86A6, + 21865 - 11905: 0x86A7, + 21866 - 11905: 0xC5BE, + 21867 - 11905: 0x86A8, + 21868 - 11905: 0xD8C4, + 21869 - 11905: 0xDFF9, + 21870 - 11905: 0xC4F6, + 21871 - 11905: 0x86A9, + 21872 - 11905: 0x86AA, + 21873 - 11905: 0x86AB, + 21874 - 11905: 0x86AC, + 21875 - 11905: 0x86AD, + 21876 - 11905: 0x86AE, + 21877 - 11905: 0xE0A3, + 21878 - 11905: 0xE0A4, + 21879 - 11905: 0xE0A5, + 21880 - 11905: 0xD0A5, + 21881 - 11905: 0x86AF, + 21882 - 11905: 0x86B0, + 21883 - 11905: 0xE0B4, + 21884 - 11905: 0xCCE4, + 21885 - 11905: 0x86B1, + 21886 - 11905: 0xE0B1, + 21887 - 11905: 0x86B2, + 21888 - 11905: 0xBFA6, + 21889 - 11905: 0xE0AF, + 21890 - 11905: 0xCEB9, + 21891 - 11905: 0xE0AB, + 21892 - 11905: 0xC9C6, + 21893 - 11905: 0x86B3, + 21894 - 11905: 0x86B4, + 21895 - 11905: 0xC0AE, + 21896 - 11905: 0xE0AE, + 21897 - 11905: 0xBAED, + 21898 - 11905: 0xBAB0, + 21899 - 11905: 0xE0A9, + 21900 - 11905: 0x86B5, + 21901 - 11905: 0x86B6, + 21902 - 11905: 0x86B7, + 21903 - 11905: 0xDFF6, + 21904 - 11905: 0x86B8, + 21905 - 11905: 0xE0B3, + 21906 - 11905: 0x86B9, + 21907 - 11905: 0x86BA, + 21908 - 11905: 0xE0B8, + 21909 - 11905: 0x86BB, + 21910 - 11905: 0x86BC, + 21911 - 11905: 0x86BD, + 21912 - 11905: 0xB4AD, + 21913 - 11905: 0xE0B9, + 21914 - 11905: 0x86BE, + 21915 - 11905: 0x86BF, + 21916 - 11905: 0xCFB2, + 21917 - 11905: 0xBAC8, + 21918 - 11905: 0x86C0, + 21919 - 11905: 0xE0B0, + 21920 - 11905: 0x86C1, + 21921 - 11905: 0x86C2, + 21922 - 11905: 0x86C3, + 21923 - 11905: 0x86C4, + 21924 - 11905: 0x86C5, + 21925 - 11905: 0x86C6, + 21926 - 11905: 0x86C7, + 21927 - 11905: 0xD0FA, + 21928 - 11905: 0x86C8, + 21929 - 11905: 0x86C9, + 21930 - 11905: 0x86CA, + 21931 - 11905: 0x86CB, + 21932 - 11905: 0x86CC, + 21933 - 11905: 0x86CD, + 21934 - 11905: 0x86CE, + 21935 - 11905: 0x86CF, + 21936 - 11905: 0x86D0, + 21937 - 11905: 0xE0AC, + 21938 - 11905: 0x86D1, + 21939 - 11905: 0xD4FB, + 21940 - 11905: 0x86D2, + 21941 - 11905: 0xDFF7, + 21942 - 11905: 0x86D3, + 21943 - 11905: 0xC5E7, + 21944 - 11905: 0x86D4, + 21945 - 11905: 0xE0AD, + 21946 - 11905: 0x86D5, + 21947 - 11905: 0xD3F7, + 21948 - 11905: 0x86D6, + 21949 - 11905: 0xE0B6, + 21950 - 11905: 0xE0B7, + 21951 - 11905: 0x86D7, + 21952 - 11905: 0x86D8, + 21953 - 11905: 0x86D9, + 21954 - 11905: 0x86DA, + 21955 - 11905: 0x86DB, + 21956 - 11905: 0xE0C4, + 21957 - 11905: 0xD0E1, + 21958 - 11905: 0x86DC, + 21959 - 11905: 0x86DD, + 21960 - 11905: 0x86DE, + 21961 - 11905: 0xE0BC, + 21962 - 11905: 0x86DF, + 21963 - 11905: 0x86E0, + 21964 - 11905: 0xE0C9, + 21965 - 11905: 0xE0CA, + 21966 - 11905: 0x86E1, + 21967 - 11905: 0x86E2, + 21968 - 11905: 0x86E3, + 21969 - 11905: 0xE0BE, + 21970 - 11905: 0xE0AA, + 21971 - 11905: 0xC9A4, + 21972 - 11905: 0xE0C1, + 21973 - 11905: 0x86E4, + 21974 - 11905: 0xE0B2, + 21975 - 11905: 0x86E5, + 21976 - 11905: 0x86E6, + 21977 - 11905: 0x86E7, + 21978 - 11905: 0x86E8, + 21979 - 11905: 0x86E9, + 21980 - 11905: 0xCAC8, + 21981 - 11905: 0xE0C3, + 21982 - 11905: 0x86EA, + 21983 - 11905: 0xE0B5, + 21984 - 11905: 0x86EB, + 21985 - 11905: 0xCECB, + 21986 - 11905: 0x86EC, + 21987 - 11905: 0xCBC3, + 21988 - 11905: 0xE0CD, + 21989 - 11905: 0xE0C6, + 21990 - 11905: 0xE0C2, + 21991 - 11905: 0x86ED, + 21992 - 11905: 0xE0CB, + 21993 - 11905: 0x86EE, + 21994 - 11905: 0xE0BA, + 21995 - 11905: 0xE0BF, + 21996 - 11905: 0xE0C0, + 21997 - 11905: 0x86EF, + 21998 - 11905: 0x86F0, + 21999 - 11905: 0xE0C5, + 22000 - 11905: 0x86F1, + 22001 - 11905: 0x86F2, + 22002 - 11905: 0xE0C7, + 22003 - 11905: 0xE0C8, + 22004 - 11905: 0x86F3, + 22005 - 11905: 0xE0CC, + 22006 - 11905: 0x86F4, + 22007 - 11905: 0xE0BB, + 22008 - 11905: 0x86F5, + 22009 - 11905: 0x86F6, + 22010 - 11905: 0x86F7, + 22011 - 11905: 0x86F8, + 22012 - 11905: 0x86F9, + 22013 - 11905: 0xCBD4, + 22014 - 11905: 0xE0D5, + 22015 - 11905: 0x86FA, + 22016 - 11905: 0xE0D6, + 22017 - 11905: 0xE0D2, + 22018 - 11905: 0x86FB, + 22019 - 11905: 0x86FC, + 22020 - 11905: 0x86FD, + 22021 - 11905: 0x86FE, + 22022 - 11905: 0x8740, + 22023 - 11905: 0x8741, + 22024 - 11905: 0xE0D0, + 22025 - 11905: 0xBCCE, + 22026 - 11905: 0x8742, + 22027 - 11905: 0x8743, + 22028 - 11905: 0xE0D1, + 22029 - 11905: 0x8744, + 22030 - 11905: 0xB8C2, + 22031 - 11905: 0xD8C5, + 22032 - 11905: 0x8745, + 22033 - 11905: 0x8746, + 22034 - 11905: 0x8747, + 22035 - 11905: 0x8748, + 22036 - 11905: 0x8749, + 22037 - 11905: 0x874A, + 22038 - 11905: 0x874B, + 22039 - 11905: 0x874C, + 22040 - 11905: 0xD0EA, + 22041 - 11905: 0x874D, + 22042 - 11905: 0x874E, + 22043 - 11905: 0xC2EF, + 22044 - 11905: 0x874F, + 22045 - 11905: 0x8750, + 22046 - 11905: 0xE0CF, + 22047 - 11905: 0xE0BD, + 22048 - 11905: 0x8751, + 22049 - 11905: 0x8752, + 22050 - 11905: 0x8753, + 22051 - 11905: 0xE0D4, + 22052 - 11905: 0xE0D3, + 22053 - 11905: 0x8754, + 22054 - 11905: 0x8755, + 22055 - 11905: 0xE0D7, + 22056 - 11905: 0x8756, + 22057 - 11905: 0x8757, + 22058 - 11905: 0x8758, + 22059 - 11905: 0x8759, + 22060 - 11905: 0xE0DC, + 22061 - 11905: 0xE0D8, + 22062 - 11905: 0x875A, + 22063 - 11905: 0x875B, + 22064 - 11905: 0x875C, + 22065 - 11905: 0xD6F6, + 22066 - 11905: 0xB3B0, + 22067 - 11905: 0x875D, + 22068 - 11905: 0xD7EC, + 22069 - 11905: 0x875E, + 22070 - 11905: 0xCBBB, + 22071 - 11905: 0x875F, + 22072 - 11905: 0x8760, + 22073 - 11905: 0xE0DA, + 22074 - 11905: 0x8761, + 22075 - 11905: 0xCEFB, + 22076 - 11905: 0x8762, + 22077 - 11905: 0x8763, + 22078 - 11905: 0x8764, + 22079 - 11905: 0xBAD9, + 22080 - 11905: 0x8765, + 22081 - 11905: 0x8766, + 22082 - 11905: 0x8767, + 22083 - 11905: 0x8768, + 22084 - 11905: 0x8769, + 22085 - 11905: 0x876A, + 22086 - 11905: 0x876B, + 22087 - 11905: 0x876C, + 22088 - 11905: 0x876D, + 22089 - 11905: 0x876E, + 22090 - 11905: 0x876F, + 22091 - 11905: 0x8770, + 22092 - 11905: 0xE0E1, + 22093 - 11905: 0xE0DD, + 22094 - 11905: 0xD2AD, + 22095 - 11905: 0x8771, + 22096 - 11905: 0x8772, + 22097 - 11905: 0x8773, + 22098 - 11905: 0x8774, + 22099 - 11905: 0x8775, + 22100 - 11905: 0xE0E2, + 22101 - 11905: 0x8776, + 22102 - 11905: 0x8777, + 22103 - 11905: 0xE0DB, + 22104 - 11905: 0xE0D9, + 22105 - 11905: 0xE0DF, + 22106 - 11905: 0x8778, + 22107 - 11905: 0x8779, + 22108 - 11905: 0xE0E0, + 22109 - 11905: 0x877A, + 22110 - 11905: 0x877B, + 22111 - 11905: 0x877C, + 22112 - 11905: 0x877D, + 22113 - 11905: 0x877E, + 22114 - 11905: 0xE0DE, + 22115 - 11905: 0x8780, + 22116 - 11905: 0xE0E4, + 22117 - 11905: 0x8781, + 22118 - 11905: 0x8782, + 22119 - 11905: 0x8783, + 22120 - 11905: 0xC6F7, + 22121 - 11905: 0xD8AC, + 22122 - 11905: 0xD4EB, + 22123 - 11905: 0xE0E6, + 22124 - 11905: 0xCAC9, + 22125 - 11905: 0x8784, + 22126 - 11905: 0x8785, + 22127 - 11905: 0x8786, + 22128 - 11905: 0x8787, + 22129 - 11905: 0xE0E5, + 22130 - 11905: 0x8788, + 22131 - 11905: 0x8789, + 22132 - 11905: 0x878A, + 22133 - 11905: 0x878B, + 22134 - 11905: 0xB8C1, + 22135 - 11905: 0x878C, + 22136 - 11905: 0x878D, + 22137 - 11905: 0x878E, + 22138 - 11905: 0x878F, + 22139 - 11905: 0xE0E7, + 22140 - 11905: 0xE0E8, + 22141 - 11905: 0x8790, + 22142 - 11905: 0x8791, + 22143 - 11905: 0x8792, + 22144 - 11905: 0x8793, + 22145 - 11905: 0x8794, + 22146 - 11905: 0x8795, + 22147 - 11905: 0x8796, + 22148 - 11905: 0x8797, + 22149 - 11905: 0xE0E9, + 22150 - 11905: 0xE0E3, + 22151 - 11905: 0x8798, + 22152 - 11905: 0x8799, + 22153 - 11905: 0x879A, + 22154 - 11905: 0x879B, + 22155 - 11905: 0x879C, + 22156 - 11905: 0x879D, + 22157 - 11905: 0x879E, + 22158 - 11905: 0xBABF, + 22159 - 11905: 0xCCE7, + 22160 - 11905: 0x879F, + 22161 - 11905: 0x87A0, + 22162 - 11905: 0x87A1, + 22163 - 11905: 0xE0EA, + 22164 - 11905: 0x87A2, + 22165 - 11905: 0x87A3, + 22166 - 11905: 0x87A4, + 22167 - 11905: 0x87A5, + 22168 - 11905: 0x87A6, + 22169 - 11905: 0x87A7, + 22170 - 11905: 0x87A8, + 22171 - 11905: 0x87A9, + 22172 - 11905: 0x87AA, + 22173 - 11905: 0x87AB, + 22174 - 11905: 0x87AC, + 22175 - 11905: 0x87AD, + 22176 - 11905: 0x87AE, + 22177 - 11905: 0x87AF, + 22178 - 11905: 0x87B0, + 22179 - 11905: 0xCFF9, + 22180 - 11905: 0x87B1, + 22181 - 11905: 0x87B2, + 22182 - 11905: 0x87B3, + 22183 - 11905: 0x87B4, + 22184 - 11905: 0x87B5, + 22185 - 11905: 0x87B6, + 22186 - 11905: 0x87B7, + 22187 - 11905: 0x87B8, + 22188 - 11905: 0x87B9, + 22189 - 11905: 0x87BA, + 22190 - 11905: 0x87BB, + 22191 - 11905: 0xE0EB, + 22192 - 11905: 0x87BC, + 22193 - 11905: 0x87BD, + 22194 - 11905: 0x87BE, + 22195 - 11905: 0x87BF, + 22196 - 11905: 0x87C0, + 22197 - 11905: 0x87C1, + 22198 - 11905: 0x87C2, + 22199 - 11905: 0xC8C2, + 22200 - 11905: 0x87C3, + 22201 - 11905: 0x87C4, + 22202 - 11905: 0x87C5, + 22203 - 11905: 0x87C6, + 22204 - 11905: 0xBDC0, + 22205 - 11905: 0x87C7, + 22206 - 11905: 0x87C8, + 22207 - 11905: 0x87C9, + 22208 - 11905: 0x87CA, + 22209 - 11905: 0x87CB, + 22210 - 11905: 0x87CC, + 22211 - 11905: 0x87CD, + 22212 - 11905: 0x87CE, + 22213 - 11905: 0x87CF, + 22214 - 11905: 0x87D0, + 22215 - 11905: 0x87D1, + 22216 - 11905: 0x87D2, + 22217 - 11905: 0x87D3, + 22218 - 11905: 0xC4D2, + 22219 - 11905: 0x87D4, + 22220 - 11905: 0x87D5, + 22221 - 11905: 0x87D6, + 22222 - 11905: 0x87D7, + 22223 - 11905: 0x87D8, + 22224 - 11905: 0x87D9, + 22225 - 11905: 0x87DA, + 22226 - 11905: 0x87DB, + 22227 - 11905: 0x87DC, + 22228 - 11905: 0xE0EC, + 22229 - 11905: 0x87DD, + 22230 - 11905: 0x87DE, + 22231 - 11905: 0xE0ED, + 22232 - 11905: 0x87DF, + 22233 - 11905: 0x87E0, + 22234 - 11905: 0xC7F4, + 22235 - 11905: 0xCBC4, + 22236 - 11905: 0x87E1, + 22237 - 11905: 0xE0EE, + 22238 - 11905: 0xBBD8, + 22239 - 11905: 0xD8B6, + 22240 - 11905: 0xD2F2, + 22241 - 11905: 0xE0EF, + 22242 - 11905: 0xCDC5, + 22243 - 11905: 0x87E2, + 22244 - 11905: 0xB6DA, + 22245 - 11905: 0x87E3, + 22246 - 11905: 0x87E4, + 22247 - 11905: 0x87E5, + 22248 - 11905: 0x87E6, + 22249 - 11905: 0x87E7, + 22250 - 11905: 0x87E8, + 22251 - 11905: 0xE0F1, + 22252 - 11905: 0x87E9, + 22253 - 11905: 0xD4B0, + 22254 - 11905: 0x87EA, + 22255 - 11905: 0x87EB, + 22256 - 11905: 0xC0A7, + 22257 - 11905: 0xB4D1, + 22258 - 11905: 0x87EC, + 22259 - 11905: 0x87ED, + 22260 - 11905: 0xCEA7, + 22261 - 11905: 0xE0F0, + 22262 - 11905: 0x87EE, + 22263 - 11905: 0x87EF, + 22264 - 11905: 0x87F0, + 22265 - 11905: 0xE0F2, + 22266 - 11905: 0xB9CC, + 22267 - 11905: 0x87F1, + 22268 - 11905: 0x87F2, + 22269 - 11905: 0xB9FA, + 22270 - 11905: 0xCDBC, + 22271 - 11905: 0xE0F3, + 22272 - 11905: 0x87F3, + 22273 - 11905: 0x87F4, + 22274 - 11905: 0x87F5, + 22275 - 11905: 0xC6D4, + 22276 - 11905: 0xE0F4, + 22277 - 11905: 0x87F6, + 22278 - 11905: 0xD4B2, + 22279 - 11905: 0x87F7, + 22280 - 11905: 0xC8A6, + 22281 - 11905: 0xE0F6, + 22282 - 11905: 0xE0F5, + 22283 - 11905: 0x87F8, + 22284 - 11905: 0x87F9, + 22285 - 11905: 0x87FA, + 22286 - 11905: 0x87FB, + 22287 - 11905: 0x87FC, + 22288 - 11905: 0x87FD, + 22289 - 11905: 0x87FE, + 22290 - 11905: 0x8840, + 22291 - 11905: 0x8841, + 22292 - 11905: 0x8842, + 22293 - 11905: 0x8843, + 22294 - 11905: 0x8844, + 22295 - 11905: 0x8845, + 22296 - 11905: 0x8846, + 22297 - 11905: 0x8847, + 22298 - 11905: 0x8848, + 22299 - 11905: 0x8849, + 22300 - 11905: 0xE0F7, + 22301 - 11905: 0x884A, + 22302 - 11905: 0x884B, + 22303 - 11905: 0xCDC1, + 22304 - 11905: 0x884C, + 22305 - 11905: 0x884D, + 22306 - 11905: 0x884E, + 22307 - 11905: 0xCAA5, + 22308 - 11905: 0x884F, + 22309 - 11905: 0x8850, + 22310 - 11905: 0x8851, + 22311 - 11905: 0x8852, + 22312 - 11905: 0xD4DA, + 22313 - 11905: 0xDBD7, + 22314 - 11905: 0xDBD9, + 22315 - 11905: 0x8853, + 22316 - 11905: 0xDBD8, + 22317 - 11905: 0xB9E7, + 22318 - 11905: 0xDBDC, + 22319 - 11905: 0xDBDD, + 22320 - 11905: 0xB5D8, + 22321 - 11905: 0x8854, + 22322 - 11905: 0x8855, + 22323 - 11905: 0xDBDA, + 22324 - 11905: 0x8856, + 22325 - 11905: 0x8857, + 22326 - 11905: 0x8858, + 22327 - 11905: 0x8859, + 22328 - 11905: 0x885A, + 22329 - 11905: 0xDBDB, + 22330 - 11905: 0xB3A1, + 22331 - 11905: 0xDBDF, + 22332 - 11905: 0x885B, + 22333 - 11905: 0x885C, + 22334 - 11905: 0xBBF8, + 22335 - 11905: 0x885D, + 22336 - 11905: 0xD6B7, + 22337 - 11905: 0x885E, + 22338 - 11905: 0xDBE0, + 22339 - 11905: 0x885F, + 22340 - 11905: 0x8860, + 22341 - 11905: 0x8861, + 22342 - 11905: 0x8862, + 22343 - 11905: 0xBEF9, + 22344 - 11905: 0x8863, + 22345 - 11905: 0x8864, + 22346 - 11905: 0xB7BB, + 22347 - 11905: 0x8865, + 22348 - 11905: 0xDBD0, + 22349 - 11905: 0xCCAE, + 22350 - 11905: 0xBFB2, + 22351 - 11905: 0xBBB5, + 22352 - 11905: 0xD7F8, + 22353 - 11905: 0xBFD3, + 22354 - 11905: 0x8866, + 22355 - 11905: 0x8867, + 22356 - 11905: 0x8868, + 22357 - 11905: 0x8869, + 22358 - 11905: 0x886A, + 22359 - 11905: 0xBFE9, + 22360 - 11905: 0x886B, + 22361 - 11905: 0x886C, + 22362 - 11905: 0xBCE1, + 22363 - 11905: 0xCCB3, + 22364 - 11905: 0xDBDE, + 22365 - 11905: 0xB0D3, + 22366 - 11905: 0xCEEB, + 22367 - 11905: 0xB7D8, + 22368 - 11905: 0xD7B9, + 22369 - 11905: 0xC6C2, + 22370 - 11905: 0x886D, + 22371 - 11905: 0x886E, + 22372 - 11905: 0xC0A4, + 22373 - 11905: 0x886F, + 22374 - 11905: 0xCCB9, + 22375 - 11905: 0x8870, + 22376 - 11905: 0xDBE7, + 22377 - 11905: 0xDBE1, + 22378 - 11905: 0xC6BA, + 22379 - 11905: 0xDBE3, + 22380 - 11905: 0x8871, + 22381 - 11905: 0xDBE8, + 22382 - 11905: 0x8872, + 22383 - 11905: 0xC5F7, + 22384 - 11905: 0x8873, + 22385 - 11905: 0x8874, + 22386 - 11905: 0x8875, + 22387 - 11905: 0xDBEA, + 22388 - 11905: 0x8876, + 22389 - 11905: 0x8877, + 22390 - 11905: 0xDBE9, + 22391 - 11905: 0xBFC0, + 22392 - 11905: 0x8878, + 22393 - 11905: 0x8879, + 22394 - 11905: 0x887A, + 22395 - 11905: 0xDBE6, + 22396 - 11905: 0xDBE5, + 22397 - 11905: 0x887B, + 22398 - 11905: 0x887C, + 22399 - 11905: 0x887D, + 22400 - 11905: 0x887E, + 22401 - 11905: 0x8880, + 22402 - 11905: 0xB4B9, + 22403 - 11905: 0xC0AC, + 22404 - 11905: 0xC2A2, + 22405 - 11905: 0xDBE2, + 22406 - 11905: 0xDBE4, + 22407 - 11905: 0x8881, + 22408 - 11905: 0x8882, + 22409 - 11905: 0x8883, + 22410 - 11905: 0x8884, + 22411 - 11905: 0xD0CD, + 22412 - 11905: 0xDBED, + 22413 - 11905: 0x8885, + 22414 - 11905: 0x8886, + 22415 - 11905: 0x8887, + 22416 - 11905: 0x8888, + 22417 - 11905: 0x8889, + 22418 - 11905: 0xC0DD, + 22419 - 11905: 0xDBF2, + 22420 - 11905: 0x888A, + 22421 - 11905: 0x888B, + 22422 - 11905: 0x888C, + 22423 - 11905: 0x888D, + 22424 - 11905: 0x888E, + 22425 - 11905: 0x888F, + 22426 - 11905: 0x8890, + 22427 - 11905: 0xB6E2, + 22428 - 11905: 0x8891, + 22429 - 11905: 0x8892, + 22430 - 11905: 0x8893, + 22431 - 11905: 0x8894, + 22432 - 11905: 0xDBF3, + 22433 - 11905: 0xDBD2, + 22434 - 11905: 0xB9B8, + 22435 - 11905: 0xD4AB, + 22436 - 11905: 0xDBEC, + 22437 - 11905: 0x8895, + 22438 - 11905: 0xBFD1, + 22439 - 11905: 0xDBF0, + 22440 - 11905: 0x8896, + 22441 - 11905: 0xDBD1, + 22442 - 11905: 0x8897, + 22443 - 11905: 0xB5E6, + 22444 - 11905: 0x8898, + 22445 - 11905: 0xDBEB, + 22446 - 11905: 0xBFE5, + 22447 - 11905: 0x8899, + 22448 - 11905: 0x889A, + 22449 - 11905: 0x889B, + 22450 - 11905: 0xDBEE, + 22451 - 11905: 0x889C, + 22452 - 11905: 0xDBF1, + 22453 - 11905: 0x889D, + 22454 - 11905: 0x889E, + 22455 - 11905: 0x889F, + 22456 - 11905: 0xDBF9, + 22457 - 11905: 0x88A0, + 22458 - 11905: 0x88A1, + 22459 - 11905: 0x88A2, + 22460 - 11905: 0x88A3, + 22461 - 11905: 0x88A4, + 22462 - 11905: 0x88A5, + 22463 - 11905: 0x88A6, + 22464 - 11905: 0x88A7, + 22465 - 11905: 0x88A8, + 22466 - 11905: 0xB9A1, + 22467 - 11905: 0xB0A3, + 22468 - 11905: 0x88A9, + 22469 - 11905: 0x88AA, + 22470 - 11905: 0x88AB, + 22471 - 11905: 0x88AC, + 22472 - 11905: 0x88AD, + 22473 - 11905: 0x88AE, + 22474 - 11905: 0x88AF, + 22475 - 11905: 0xC2F1, + 22476 - 11905: 0x88B0, + 22477 - 11905: 0x88B1, + 22478 - 11905: 0xB3C7, + 22479 - 11905: 0xDBEF, + 22480 - 11905: 0x88B2, + 22481 - 11905: 0x88B3, + 22482 - 11905: 0xDBF8, + 22483 - 11905: 0x88B4, + 22484 - 11905: 0xC6D2, + 22485 - 11905: 0xDBF4, + 22486 - 11905: 0x88B5, + 22487 - 11905: 0x88B6, + 22488 - 11905: 0xDBF5, + 22489 - 11905: 0xDBF7, + 22490 - 11905: 0xDBF6, + 22491 - 11905: 0x88B7, + 22492 - 11905: 0x88B8, + 22493 - 11905: 0xDBFE, + 22494 - 11905: 0x88B9, + 22495 - 11905: 0xD3F2, + 22496 - 11905: 0xB2BA, + 22497 - 11905: 0x88BA, + 22498 - 11905: 0x88BB, + 22499 - 11905: 0x88BC, + 22500 - 11905: 0xDBFD, + 22501 - 11905: 0x88BD, + 22502 - 11905: 0x88BE, + 22503 - 11905: 0x88BF, + 22504 - 11905: 0x88C0, + 22505 - 11905: 0x88C1, + 22506 - 11905: 0x88C2, + 22507 - 11905: 0x88C3, + 22508 - 11905: 0x88C4, + 22509 - 11905: 0xDCA4, + 22510 - 11905: 0x88C5, + 22511 - 11905: 0xDBFB, + 22512 - 11905: 0x88C6, + 22513 - 11905: 0x88C7, + 22514 - 11905: 0x88C8, + 22515 - 11905: 0x88C9, + 22516 - 11905: 0xDBFA, + 22517 - 11905: 0x88CA, + 22518 - 11905: 0x88CB, + 22519 - 11905: 0x88CC, + 22520 - 11905: 0xDBFC, + 22521 - 11905: 0xC5E0, + 22522 - 11905: 0xBBF9, + 22523 - 11905: 0x88CD, + 22524 - 11905: 0x88CE, + 22525 - 11905: 0xDCA3, + 22526 - 11905: 0x88CF, + 22527 - 11905: 0x88D0, + 22528 - 11905: 0xDCA5, + 22529 - 11905: 0x88D1, + 22530 - 11905: 0xCCC3, + 22531 - 11905: 0x88D2, + 22532 - 11905: 0x88D3, + 22533 - 11905: 0x88D4, + 22534 - 11905: 0xB6D1, + 22535 - 11905: 0xDDC0, + 22536 - 11905: 0x88D5, + 22537 - 11905: 0x88D6, + 22538 - 11905: 0x88D7, + 22539 - 11905: 0xDCA1, + 22540 - 11905: 0x88D8, + 22541 - 11905: 0xDCA2, + 22542 - 11905: 0x88D9, + 22543 - 11905: 0x88DA, + 22544 - 11905: 0x88DB, + 22545 - 11905: 0xC7B5, + 22546 - 11905: 0x88DC, + 22547 - 11905: 0x88DD, + 22548 - 11905: 0x88DE, + 22549 - 11905: 0xB6E9, + 22550 - 11905: 0x88DF, + 22551 - 11905: 0x88E0, + 22552 - 11905: 0x88E1, + 22553 - 11905: 0xDCA7, + 22554 - 11905: 0x88E2, + 22555 - 11905: 0x88E3, + 22556 - 11905: 0x88E4, + 22557 - 11905: 0x88E5, + 22558 - 11905: 0xDCA6, + 22559 - 11905: 0x88E6, + 22560 - 11905: 0xDCA9, + 22561 - 11905: 0xB1A4, + 22562 - 11905: 0x88E7, + 22563 - 11905: 0x88E8, + 22564 - 11905: 0xB5CC, + 22565 - 11905: 0x88E9, + 22566 - 11905: 0x88EA, + 22567 - 11905: 0x88EB, + 22568 - 11905: 0x88EC, + 22569 - 11905: 0x88ED, + 22570 - 11905: 0xBFB0, + 22571 - 11905: 0x88EE, + 22572 - 11905: 0x88EF, + 22573 - 11905: 0x88F0, + 22574 - 11905: 0x88F1, + 22575 - 11905: 0x88F2, + 22576 - 11905: 0xD1DF, + 22577 - 11905: 0x88F3, + 22578 - 11905: 0x88F4, + 22579 - 11905: 0x88F5, + 22580 - 11905: 0x88F6, + 22581 - 11905: 0xB6C2, + 22582 - 11905: 0x88F7, + 22583 - 11905: 0x88F8, + 22584 - 11905: 0x88F9, + 22585 - 11905: 0x88FA, + 22586 - 11905: 0x88FB, + 22587 - 11905: 0x88FC, + 22588 - 11905: 0x88FD, + 22589 - 11905: 0x88FE, + 22590 - 11905: 0x8940, + 22591 - 11905: 0x8941, + 22592 - 11905: 0x8942, + 22593 - 11905: 0x8943, + 22594 - 11905: 0x8944, + 22595 - 11905: 0x8945, + 22596 - 11905: 0xDCA8, + 22597 - 11905: 0x8946, + 22598 - 11905: 0x8947, + 22599 - 11905: 0x8948, + 22600 - 11905: 0x8949, + 22601 - 11905: 0x894A, + 22602 - 11905: 0x894B, + 22603 - 11905: 0x894C, + 22604 - 11905: 0xCBFA, + 22605 - 11905: 0xEBF3, + 22606 - 11905: 0x894D, + 22607 - 11905: 0x894E, + 22608 - 11905: 0x894F, + 22609 - 11905: 0xCBDC, + 22610 - 11905: 0x8950, + 22611 - 11905: 0x8951, + 22612 - 11905: 0xCBFE, + 22613 - 11905: 0x8952, + 22614 - 11905: 0x8953, + 22615 - 11905: 0x8954, + 22616 - 11905: 0xCCC1, + 22617 - 11905: 0x8955, + 22618 - 11905: 0x8956, + 22619 - 11905: 0x8957, + 22620 - 11905: 0x8958, + 22621 - 11905: 0x8959, + 22622 - 11905: 0xC8FB, + 22623 - 11905: 0x895A, + 22624 - 11905: 0x895B, + 22625 - 11905: 0x895C, + 22626 - 11905: 0x895D, + 22627 - 11905: 0x895E, + 22628 - 11905: 0x895F, + 22629 - 11905: 0xDCAA, + 22630 - 11905: 0x8960, + 22631 - 11905: 0x8961, + 22632 - 11905: 0x8962, + 22633 - 11905: 0x8963, + 22634 - 11905: 0x8964, + 22635 - 11905: 0xCCEE, + 22636 - 11905: 0xDCAB, + 22637 - 11905: 0x8965, + 22638 - 11905: 0x8966, + 22639 - 11905: 0x8967, + 22640 - 11905: 0x8968, + 22641 - 11905: 0x8969, + 22642 - 11905: 0x896A, + 22643 - 11905: 0x896B, + 22644 - 11905: 0x896C, + 22645 - 11905: 0x896D, + 22646 - 11905: 0x896E, + 22647 - 11905: 0x896F, + 22648 - 11905: 0x8970, + 22649 - 11905: 0x8971, + 22650 - 11905: 0x8972, + 22651 - 11905: 0x8973, + 22652 - 11905: 0x8974, + 22653 - 11905: 0x8975, + 22654 - 11905: 0xDBD3, + 22655 - 11905: 0x8976, + 22656 - 11905: 0xDCAF, + 22657 - 11905: 0xDCAC, + 22658 - 11905: 0x8977, + 22659 - 11905: 0xBEB3, + 22660 - 11905: 0x8978, + 22661 - 11905: 0xCAFB, + 22662 - 11905: 0x8979, + 22663 - 11905: 0x897A, + 22664 - 11905: 0x897B, + 22665 - 11905: 0xDCAD, + 22666 - 11905: 0x897C, + 22667 - 11905: 0x897D, + 22668 - 11905: 0x897E, + 22669 - 11905: 0x8980, + 22670 - 11905: 0x8981, + 22671 - 11905: 0x8982, + 22672 - 11905: 0x8983, + 22673 - 11905: 0x8984, + 22674 - 11905: 0xC9CA, + 22675 - 11905: 0xC4B9, + 22676 - 11905: 0x8985, + 22677 - 11905: 0x8986, + 22678 - 11905: 0x8987, + 22679 - 11905: 0x8988, + 22680 - 11905: 0x8989, + 22681 - 11905: 0xC7BD, + 22682 - 11905: 0xDCAE, + 22683 - 11905: 0x898A, + 22684 - 11905: 0x898B, + 22685 - 11905: 0x898C, + 22686 - 11905: 0xD4F6, + 22687 - 11905: 0xD0E6, + 22688 - 11905: 0x898D, + 22689 - 11905: 0x898E, + 22690 - 11905: 0x898F, + 22691 - 11905: 0x8990, + 22692 - 11905: 0x8991, + 22693 - 11905: 0x8992, + 22694 - 11905: 0x8993, + 22695 - 11905: 0x8994, + 22696 - 11905: 0xC4AB, + 22697 - 11905: 0xB6D5, + 22698 - 11905: 0x8995, + 22699 - 11905: 0x8996, + 22700 - 11905: 0x8997, + 22701 - 11905: 0x8998, + 22702 - 11905: 0x8999, + 22703 - 11905: 0x899A, + 22704 - 11905: 0x899B, + 22705 - 11905: 0x899C, + 22706 - 11905: 0x899D, + 22707 - 11905: 0x899E, + 22708 - 11905: 0x899F, + 22709 - 11905: 0x89A0, + 22710 - 11905: 0x89A1, + 22711 - 11905: 0x89A2, + 22712 - 11905: 0x89A3, + 22713 - 11905: 0x89A4, + 22714 - 11905: 0x89A5, + 22715 - 11905: 0x89A6, + 22716 - 11905: 0xDBD4, + 22717 - 11905: 0x89A7, + 22718 - 11905: 0x89A8, + 22719 - 11905: 0x89A9, + 22720 - 11905: 0x89AA, + 22721 - 11905: 0xB1DA, + 22722 - 11905: 0x89AB, + 22723 - 11905: 0x89AC, + 22724 - 11905: 0x89AD, + 22725 - 11905: 0xDBD5, + 22726 - 11905: 0x89AE, + 22727 - 11905: 0x89AF, + 22728 - 11905: 0x89B0, + 22729 - 11905: 0x89B1, + 22730 - 11905: 0x89B2, + 22731 - 11905: 0x89B3, + 22732 - 11905: 0x89B4, + 22733 - 11905: 0x89B5, + 22734 - 11905: 0x89B6, + 22735 - 11905: 0x89B7, + 22736 - 11905: 0x89B8, + 22737 - 11905: 0xDBD6, + 22738 - 11905: 0x89B9, + 22739 - 11905: 0x89BA, + 22740 - 11905: 0x89BB, + 22741 - 11905: 0xBABE, + 22742 - 11905: 0x89BC, + 22743 - 11905: 0x89BD, + 22744 - 11905: 0x89BE, + 22745 - 11905: 0x89BF, + 22746 - 11905: 0x89C0, + 22747 - 11905: 0x89C1, + 22748 - 11905: 0x89C2, + 22749 - 11905: 0x89C3, + 22750 - 11905: 0x89C4, + 22751 - 11905: 0x89C5, + 22752 - 11905: 0x89C6, + 22753 - 11905: 0x89C7, + 22754 - 11905: 0x89C8, + 22755 - 11905: 0x89C9, + 22756 - 11905: 0xC8C0, + 22757 - 11905: 0x89CA, + 22758 - 11905: 0x89CB, + 22759 - 11905: 0x89CC, + 22760 - 11905: 0x89CD, + 22761 - 11905: 0x89CE, + 22762 - 11905: 0x89CF, + 22763 - 11905: 0xCABF, + 22764 - 11905: 0xC8C9, + 22765 - 11905: 0x89D0, + 22766 - 11905: 0xD7B3, + 22767 - 11905: 0x89D1, + 22768 - 11905: 0xC9F9, + 22769 - 11905: 0x89D2, + 22770 - 11905: 0x89D3, + 22771 - 11905: 0xBFC7, + 22772 - 11905: 0x89D4, + 22773 - 11905: 0x89D5, + 22774 - 11905: 0xBAF8, + 22775 - 11905: 0x89D6, + 22776 - 11905: 0x89D7, + 22777 - 11905: 0xD2BC, + 22778 - 11905: 0x89D8, + 22779 - 11905: 0x89D9, + 22780 - 11905: 0x89DA, + 22781 - 11905: 0x89DB, + 22782 - 11905: 0x89DC, + 22783 - 11905: 0x89DD, + 22784 - 11905: 0x89DE, + 22785 - 11905: 0x89DF, + 22786 - 11905: 0xE2BA, + 22787 - 11905: 0x89E0, + 22788 - 11905: 0xB4A6, + 22789 - 11905: 0x89E1, + 22790 - 11905: 0x89E2, + 22791 - 11905: 0xB1B8, + 22792 - 11905: 0x89E3, + 22793 - 11905: 0x89E4, + 22794 - 11905: 0x89E5, + 22795 - 11905: 0x89E6, + 22796 - 11905: 0x89E7, + 22797 - 11905: 0xB8B4, + 22798 - 11905: 0x89E8, + 22799 - 11905: 0xCFC4, + 22800 - 11905: 0x89E9, + 22801 - 11905: 0x89EA, + 22802 - 11905: 0x89EB, + 22803 - 11905: 0x89EC, + 22804 - 11905: 0xD9E7, + 22805 - 11905: 0xCFA6, + 22806 - 11905: 0xCDE2, + 22807 - 11905: 0x89ED, + 22808 - 11905: 0x89EE, + 22809 - 11905: 0xD9ED, + 22810 - 11905: 0xB6E0, + 22811 - 11905: 0x89EF, + 22812 - 11905: 0xD2B9, + 22813 - 11905: 0x89F0, + 22814 - 11905: 0x89F1, + 22815 - 11905: 0xB9BB, + 22816 - 11905: 0x89F2, + 22817 - 11905: 0x89F3, + 22818 - 11905: 0x89F4, + 22819 - 11905: 0x89F5, + 22820 - 11905: 0xE2B9, + 22821 - 11905: 0xE2B7, + 22822 - 11905: 0x89F6, + 22823 - 11905: 0xB4F3, + 22824 - 11905: 0x89F7, + 22825 - 11905: 0xCCEC, + 22826 - 11905: 0xCCAB, + 22827 - 11905: 0xB7F2, + 22828 - 11905: 0x89F8, + 22829 - 11905: 0xD8B2, + 22830 - 11905: 0xD1EB, + 22831 - 11905: 0xBABB, + 22832 - 11905: 0x89F9, + 22833 - 11905: 0xCAA7, + 22834 - 11905: 0x89FA, + 22835 - 11905: 0x89FB, + 22836 - 11905: 0xCDB7, + 22837 - 11905: 0x89FC, + 22838 - 11905: 0x89FD, + 22839 - 11905: 0xD2C4, + 22840 - 11905: 0xBFE4, + 22841 - 11905: 0xBCD0, + 22842 - 11905: 0xB6E1, + 22843 - 11905: 0x89FE, + 22844 - 11905: 0xDEC5, + 22845 - 11905: 0x8A40, + 22846 - 11905: 0x8A41, + 22847 - 11905: 0x8A42, + 22848 - 11905: 0x8A43, + 22849 - 11905: 0xDEC6, + 22850 - 11905: 0xDBBC, + 22851 - 11905: 0x8A44, + 22852 - 11905: 0xD1D9, + 22853 - 11905: 0x8A45, + 22854 - 11905: 0x8A46, + 22855 - 11905: 0xC6E6, + 22856 - 11905: 0xC4CE, + 22857 - 11905: 0xB7EE, + 22858 - 11905: 0x8A47, + 22859 - 11905: 0xB7DC, + 22860 - 11905: 0x8A48, + 22861 - 11905: 0x8A49, + 22862 - 11905: 0xBFFC, + 22863 - 11905: 0xD7E0, + 22864 - 11905: 0x8A4A, + 22865 - 11905: 0xC6F5, + 22866 - 11905: 0x8A4B, + 22867 - 11905: 0x8A4C, + 22868 - 11905: 0xB1BC, + 22869 - 11905: 0xDEC8, + 22870 - 11905: 0xBDB1, + 22871 - 11905: 0xCCD7, + 22872 - 11905: 0xDECA, + 22873 - 11905: 0x8A4D, + 22874 - 11905: 0xDEC9, + 22875 - 11905: 0x8A4E, + 22876 - 11905: 0x8A4F, + 22877 - 11905: 0x8A50, + 22878 - 11905: 0x8A51, + 22879 - 11905: 0x8A52, + 22880 - 11905: 0xB5EC, + 22881 - 11905: 0x8A53, + 22882 - 11905: 0xC9DD, + 22883 - 11905: 0x8A54, + 22884 - 11905: 0x8A55, + 22885 - 11905: 0xB0C2, + 22886 - 11905: 0x8A56, + 22887 - 11905: 0x8A57, + 22888 - 11905: 0x8A58, + 22889 - 11905: 0x8A59, + 22890 - 11905: 0x8A5A, + 22891 - 11905: 0x8A5B, + 22892 - 11905: 0x8A5C, + 22893 - 11905: 0x8A5D, + 22894 - 11905: 0x8A5E, + 22895 - 11905: 0x8A5F, + 22896 - 11905: 0x8A60, + 22897 - 11905: 0x8A61, + 22898 - 11905: 0x8A62, + 22899 - 11905: 0xC5AE, + 22900 - 11905: 0xC5AB, + 22901 - 11905: 0x8A63, + 22902 - 11905: 0xC4CC, + 22903 - 11905: 0x8A64, + 22904 - 11905: 0xBCE9, + 22905 - 11905: 0xCBFD, + 22906 - 11905: 0x8A65, + 22907 - 11905: 0x8A66, + 22908 - 11905: 0x8A67, + 22909 - 11905: 0xBAC3, + 22910 - 11905: 0x8A68, + 22911 - 11905: 0x8A69, + 22912 - 11905: 0x8A6A, + 22913 - 11905: 0xE5F9, + 22914 - 11905: 0xC8E7, + 22915 - 11905: 0xE5FA, + 22916 - 11905: 0xCDFD, + 22917 - 11905: 0x8A6B, + 22918 - 11905: 0xD7B1, + 22919 - 11905: 0xB8BE, + 22920 - 11905: 0xC2E8, + 22921 - 11905: 0x8A6C, + 22922 - 11905: 0xC8D1, + 22923 - 11905: 0x8A6D, + 22924 - 11905: 0x8A6E, + 22925 - 11905: 0xE5FB, + 22926 - 11905: 0x8A6F, + 22927 - 11905: 0x8A70, + 22928 - 11905: 0x8A71, + 22929 - 11905: 0x8A72, + 22930 - 11905: 0xB6CA, + 22931 - 11905: 0xBCCB, + 22932 - 11905: 0x8A73, + 22933 - 11905: 0x8A74, + 22934 - 11905: 0xD1FD, + 22935 - 11905: 0xE6A1, + 22936 - 11905: 0x8A75, + 22937 - 11905: 0xC3EE, + 22938 - 11905: 0x8A76, + 22939 - 11905: 0x8A77, + 22940 - 11905: 0x8A78, + 22941 - 11905: 0x8A79, + 22942 - 11905: 0xE6A4, + 22943 - 11905: 0x8A7A, + 22944 - 11905: 0x8A7B, + 22945 - 11905: 0x8A7C, + 22946 - 11905: 0x8A7D, + 22947 - 11905: 0xE5FE, + 22948 - 11905: 0xE6A5, + 22949 - 11905: 0xCDD7, + 22950 - 11905: 0x8A7E, + 22951 - 11905: 0x8A80, + 22952 - 11905: 0xB7C1, + 22953 - 11905: 0xE5FC, + 22954 - 11905: 0xE5FD, + 22955 - 11905: 0xE6A3, + 22956 - 11905: 0x8A81, + 22957 - 11905: 0x8A82, + 22958 - 11905: 0xC4DD, + 22959 - 11905: 0xE6A8, + 22960 - 11905: 0x8A83, + 22961 - 11905: 0x8A84, + 22962 - 11905: 0xE6A7, + 22963 - 11905: 0x8A85, + 22964 - 11905: 0x8A86, + 22965 - 11905: 0x8A87, + 22966 - 11905: 0x8A88, + 22967 - 11905: 0x8A89, + 22968 - 11905: 0x8A8A, + 22969 - 11905: 0xC3C3, + 22970 - 11905: 0x8A8B, + 22971 - 11905: 0xC6DE, + 22972 - 11905: 0x8A8C, + 22973 - 11905: 0x8A8D, + 22974 - 11905: 0xE6AA, + 22975 - 11905: 0x8A8E, + 22976 - 11905: 0x8A8F, + 22977 - 11905: 0x8A90, + 22978 - 11905: 0x8A91, + 22979 - 11905: 0x8A92, + 22980 - 11905: 0x8A93, + 22981 - 11905: 0x8A94, + 22982 - 11905: 0xC4B7, + 22983 - 11905: 0x8A95, + 22984 - 11905: 0x8A96, + 22985 - 11905: 0x8A97, + 22986 - 11905: 0xE6A2, + 22987 - 11905: 0xCABC, + 22988 - 11905: 0x8A98, + 22989 - 11905: 0x8A99, + 22990 - 11905: 0x8A9A, + 22991 - 11905: 0x8A9B, + 22992 - 11905: 0xBDE3, + 22993 - 11905: 0xB9C3, + 22994 - 11905: 0xE6A6, + 22995 - 11905: 0xD0D5, + 22996 - 11905: 0xCEAF, + 22997 - 11905: 0x8A9C, + 22998 - 11905: 0x8A9D, + 22999 - 11905: 0xE6A9, + 23000 - 11905: 0xE6B0, + 23001 - 11905: 0x8A9E, + 23002 - 11905: 0xD2A6, + 23003 - 11905: 0x8A9F, + 23004 - 11905: 0xBDAA, + 23005 - 11905: 0xE6AD, + 23006 - 11905: 0x8AA0, + 23007 - 11905: 0x8AA1, + 23008 - 11905: 0x8AA2, + 23009 - 11905: 0x8AA3, + 23010 - 11905: 0x8AA4, + 23011 - 11905: 0xE6AF, + 23012 - 11905: 0x8AA5, + 23013 - 11905: 0xC0D1, + 23014 - 11905: 0x8AA6, + 23015 - 11905: 0x8AA7, + 23016 - 11905: 0xD2CC, + 23017 - 11905: 0x8AA8, + 23018 - 11905: 0x8AA9, + 23019 - 11905: 0x8AAA, + 23020 - 11905: 0xBCA7, + 23021 - 11905: 0x8AAB, + 23022 - 11905: 0x8AAC, + 23023 - 11905: 0x8AAD, + 23024 - 11905: 0x8AAE, + 23025 - 11905: 0x8AAF, + 23026 - 11905: 0x8AB0, + 23027 - 11905: 0x8AB1, + 23028 - 11905: 0x8AB2, + 23029 - 11905: 0x8AB3, + 23030 - 11905: 0x8AB4, + 23031 - 11905: 0x8AB5, + 23032 - 11905: 0x8AB6, + 23033 - 11905: 0xE6B1, + 23034 - 11905: 0x8AB7, + 23035 - 11905: 0xD2F6, + 23036 - 11905: 0x8AB8, + 23037 - 11905: 0x8AB9, + 23038 - 11905: 0x8ABA, + 23039 - 11905: 0xD7CB, + 23040 - 11905: 0x8ABB, + 23041 - 11905: 0xCDFE, + 23042 - 11905: 0x8ABC, + 23043 - 11905: 0xCDDE, + 23044 - 11905: 0xC2A6, + 23045 - 11905: 0xE6AB, + 23046 - 11905: 0xE6AC, + 23047 - 11905: 0xBDBF, + 23048 - 11905: 0xE6AE, + 23049 - 11905: 0xE6B3, + 23050 - 11905: 0x8ABD, + 23051 - 11905: 0x8ABE, + 23052 - 11905: 0xE6B2, + 23053 - 11905: 0x8ABF, + 23054 - 11905: 0x8AC0, + 23055 - 11905: 0x8AC1, + 23056 - 11905: 0x8AC2, + 23057 - 11905: 0xE6B6, + 23058 - 11905: 0x8AC3, + 23059 - 11905: 0xE6B8, + 23060 - 11905: 0x8AC4, + 23061 - 11905: 0x8AC5, + 23062 - 11905: 0x8AC6, + 23063 - 11905: 0x8AC7, + 23064 - 11905: 0xC4EF, + 23065 - 11905: 0x8AC8, + 23066 - 11905: 0x8AC9, + 23067 - 11905: 0x8ACA, + 23068 - 11905: 0xC4C8, + 23069 - 11905: 0x8ACB, + 23070 - 11905: 0x8ACC, + 23071 - 11905: 0xBEEA, + 23072 - 11905: 0xC9EF, + 23073 - 11905: 0x8ACD, + 23074 - 11905: 0x8ACE, + 23075 - 11905: 0xE6B7, + 23076 - 11905: 0x8ACF, + 23077 - 11905: 0xB6F0, + 23078 - 11905: 0x8AD0, + 23079 - 11905: 0x8AD1, + 23080 - 11905: 0x8AD2, + 23081 - 11905: 0xC3E4, + 23082 - 11905: 0x8AD3, + 23083 - 11905: 0x8AD4, + 23084 - 11905: 0x8AD5, + 23085 - 11905: 0x8AD6, + 23086 - 11905: 0x8AD7, + 23087 - 11905: 0x8AD8, + 23088 - 11905: 0x8AD9, + 23089 - 11905: 0xD3E9, + 23090 - 11905: 0xE6B4, + 23091 - 11905: 0x8ADA, + 23092 - 11905: 0xE6B5, + 23093 - 11905: 0x8ADB, + 23094 - 11905: 0xC8A2, + 23095 - 11905: 0x8ADC, + 23096 - 11905: 0x8ADD, + 23097 - 11905: 0x8ADE, + 23098 - 11905: 0x8ADF, + 23099 - 11905: 0x8AE0, + 23100 - 11905: 0xE6BD, + 23101 - 11905: 0x8AE1, + 23102 - 11905: 0x8AE2, + 23103 - 11905: 0x8AE3, + 23104 - 11905: 0xE6B9, + 23105 - 11905: 0x8AE4, + 23106 - 11905: 0x8AE5, + 23107 - 11905: 0x8AE6, + 23108 - 11905: 0x8AE7, + 23109 - 11905: 0x8AE8, + 23110 - 11905: 0xC6C5, + 23111 - 11905: 0x8AE9, + 23112 - 11905: 0x8AEA, + 23113 - 11905: 0xCDF1, + 23114 - 11905: 0xE6BB, + 23115 - 11905: 0x8AEB, + 23116 - 11905: 0x8AEC, + 23117 - 11905: 0x8AED, + 23118 - 11905: 0x8AEE, + 23119 - 11905: 0x8AEF, + 23120 - 11905: 0x8AF0, + 23121 - 11905: 0x8AF1, + 23122 - 11905: 0x8AF2, + 23123 - 11905: 0x8AF3, + 23124 - 11905: 0x8AF4, + 23125 - 11905: 0xE6BC, + 23126 - 11905: 0x8AF5, + 23127 - 11905: 0x8AF6, + 23128 - 11905: 0x8AF7, + 23129 - 11905: 0x8AF8, + 23130 - 11905: 0xBBE9, + 23131 - 11905: 0x8AF9, + 23132 - 11905: 0x8AFA, + 23133 - 11905: 0x8AFB, + 23134 - 11905: 0x8AFC, + 23135 - 11905: 0x8AFD, + 23136 - 11905: 0x8AFE, + 23137 - 11905: 0x8B40, + 23138 - 11905: 0xE6BE, + 23139 - 11905: 0x8B41, + 23140 - 11905: 0x8B42, + 23141 - 11905: 0x8B43, + 23142 - 11905: 0x8B44, + 23143 - 11905: 0xE6BA, + 23144 - 11905: 0x8B45, + 23145 - 11905: 0x8B46, + 23146 - 11905: 0xC0B7, + 23147 - 11905: 0x8B47, + 23148 - 11905: 0x8B48, + 23149 - 11905: 0x8B49, + 23150 - 11905: 0x8B4A, + 23151 - 11905: 0x8B4B, + 23152 - 11905: 0x8B4C, + 23153 - 11905: 0x8B4D, + 23154 - 11905: 0x8B4E, + 23155 - 11905: 0x8B4F, + 23156 - 11905: 0xD3A4, + 23157 - 11905: 0xE6BF, + 23158 - 11905: 0xC9F4, + 23159 - 11905: 0xE6C3, + 23160 - 11905: 0x8B50, + 23161 - 11905: 0x8B51, + 23162 - 11905: 0xE6C4, + 23163 - 11905: 0x8B52, + 23164 - 11905: 0x8B53, + 23165 - 11905: 0x8B54, + 23166 - 11905: 0x8B55, + 23167 - 11905: 0xD0F6, + 23168 - 11905: 0x8B56, + 23169 - 11905: 0x8B57, + 23170 - 11905: 0x8B58, + 23171 - 11905: 0x8B59, + 23172 - 11905: 0x8B5A, + 23173 - 11905: 0x8B5B, + 23174 - 11905: 0x8B5C, + 23175 - 11905: 0x8B5D, + 23176 - 11905: 0x8B5E, + 23177 - 11905: 0x8B5F, + 23178 - 11905: 0x8B60, + 23179 - 11905: 0x8B61, + 23180 - 11905: 0x8B62, + 23181 - 11905: 0x8B63, + 23182 - 11905: 0x8B64, + 23183 - 11905: 0x8B65, + 23184 - 11905: 0x8B66, + 23185 - 11905: 0x8B67, + 23186 - 11905: 0xC3BD, + 23187 - 11905: 0x8B68, + 23188 - 11905: 0x8B69, + 23189 - 11905: 0x8B6A, + 23190 - 11905: 0x8B6B, + 23191 - 11905: 0x8B6C, + 23192 - 11905: 0x8B6D, + 23193 - 11905: 0x8B6E, + 23194 - 11905: 0xC3C4, + 23195 - 11905: 0xE6C2, + 23196 - 11905: 0x8B6F, + 23197 - 11905: 0x8B70, + 23198 - 11905: 0x8B71, + 23199 - 11905: 0x8B72, + 23200 - 11905: 0x8B73, + 23201 - 11905: 0x8B74, + 23202 - 11905: 0x8B75, + 23203 - 11905: 0x8B76, + 23204 - 11905: 0x8B77, + 23205 - 11905: 0x8B78, + 23206 - 11905: 0x8B79, + 23207 - 11905: 0x8B7A, + 23208 - 11905: 0x8B7B, + 23209 - 11905: 0x8B7C, + 23210 - 11905: 0xE6C1, + 23211 - 11905: 0x8B7D, + 23212 - 11905: 0x8B7E, + 23213 - 11905: 0x8B80, + 23214 - 11905: 0x8B81, + 23215 - 11905: 0x8B82, + 23216 - 11905: 0x8B83, + 23217 - 11905: 0x8B84, + 23218 - 11905: 0xE6C7, + 23219 - 11905: 0xCFB1, + 23220 - 11905: 0x8B85, + 23221 - 11905: 0xEBF4, + 23222 - 11905: 0x8B86, + 23223 - 11905: 0x8B87, + 23224 - 11905: 0xE6CA, + 23225 - 11905: 0x8B88, + 23226 - 11905: 0x8B89, + 23227 - 11905: 0x8B8A, + 23228 - 11905: 0x8B8B, + 23229 - 11905: 0x8B8C, + 23230 - 11905: 0xE6C5, + 23231 - 11905: 0x8B8D, + 23232 - 11905: 0x8B8E, + 23233 - 11905: 0xBCDE, + 23234 - 11905: 0xC9A9, + 23235 - 11905: 0x8B8F, + 23236 - 11905: 0x8B90, + 23237 - 11905: 0x8B91, + 23238 - 11905: 0x8B92, + 23239 - 11905: 0x8B93, + 23240 - 11905: 0x8B94, + 23241 - 11905: 0xBCB5, + 23242 - 11905: 0x8B95, + 23243 - 11905: 0x8B96, + 23244 - 11905: 0xCFD3, + 23245 - 11905: 0x8B97, + 23246 - 11905: 0x8B98, + 23247 - 11905: 0x8B99, + 23248 - 11905: 0x8B9A, + 23249 - 11905: 0x8B9B, + 23250 - 11905: 0xE6C8, + 23251 - 11905: 0x8B9C, + 23252 - 11905: 0xE6C9, + 23253 - 11905: 0x8B9D, + 23254 - 11905: 0xE6CE, + 23255 - 11905: 0x8B9E, + 23256 - 11905: 0xE6D0, + 23257 - 11905: 0x8B9F, + 23258 - 11905: 0x8BA0, + 23259 - 11905: 0x8BA1, + 23260 - 11905: 0xE6D1, + 23261 - 11905: 0x8BA2, + 23262 - 11905: 0x8BA3, + 23263 - 11905: 0x8BA4, + 23264 - 11905: 0xE6CB, + 23265 - 11905: 0xB5D5, + 23266 - 11905: 0x8BA5, + 23267 - 11905: 0xE6CC, + 23268 - 11905: 0x8BA6, + 23269 - 11905: 0x8BA7, + 23270 - 11905: 0xE6CF, + 23271 - 11905: 0x8BA8, + 23272 - 11905: 0x8BA9, + 23273 - 11905: 0xC4DB, + 23274 - 11905: 0x8BAA, + 23275 - 11905: 0xE6C6, + 23276 - 11905: 0x8BAB, + 23277 - 11905: 0x8BAC, + 23278 - 11905: 0x8BAD, + 23279 - 11905: 0x8BAE, + 23280 - 11905: 0x8BAF, + 23281 - 11905: 0xE6CD, + 23282 - 11905: 0x8BB0, + 23283 - 11905: 0x8BB1, + 23284 - 11905: 0x8BB2, + 23285 - 11905: 0x8BB3, + 23286 - 11905: 0x8BB4, + 23287 - 11905: 0x8BB5, + 23288 - 11905: 0x8BB6, + 23289 - 11905: 0x8BB7, + 23290 - 11905: 0x8BB8, + 23291 - 11905: 0x8BB9, + 23292 - 11905: 0x8BBA, + 23293 - 11905: 0x8BBB, + 23294 - 11905: 0x8BBC, + 23295 - 11905: 0x8BBD, + 23296 - 11905: 0x8BBE, + 23297 - 11905: 0x8BBF, + 23298 - 11905: 0x8BC0, + 23299 - 11905: 0x8BC1, + 23300 - 11905: 0x8BC2, + 23301 - 11905: 0x8BC3, + 23302 - 11905: 0x8BC4, + 23303 - 11905: 0x8BC5, + 23304 - 11905: 0x8BC6, + 23305 - 11905: 0xE6D2, + 23306 - 11905: 0x8BC7, + 23307 - 11905: 0x8BC8, + 23308 - 11905: 0x8BC9, + 23309 - 11905: 0x8BCA, + 23310 - 11905: 0x8BCB, + 23311 - 11905: 0x8BCC, + 23312 - 11905: 0x8BCD, + 23313 - 11905: 0x8BCE, + 23314 - 11905: 0x8BCF, + 23315 - 11905: 0x8BD0, + 23316 - 11905: 0x8BD1, + 23317 - 11905: 0x8BD2, + 23318 - 11905: 0xE6D4, + 23319 - 11905: 0xE6D3, + 23320 - 11905: 0x8BD3, + 23321 - 11905: 0x8BD4, + 23322 - 11905: 0x8BD5, + 23323 - 11905: 0x8BD6, + 23324 - 11905: 0x8BD7, + 23325 - 11905: 0x8BD8, + 23326 - 11905: 0x8BD9, + 23327 - 11905: 0x8BDA, + 23328 - 11905: 0x8BDB, + 23329 - 11905: 0x8BDC, + 23330 - 11905: 0x8BDD, + 23331 - 11905: 0x8BDE, + 23332 - 11905: 0x8BDF, + 23333 - 11905: 0x8BE0, + 23334 - 11905: 0x8BE1, + 23335 - 11905: 0x8BE2, + 23336 - 11905: 0x8BE3, + 23337 - 11905: 0x8BE4, + 23338 - 11905: 0x8BE5, + 23339 - 11905: 0x8BE6, + 23340 - 11905: 0x8BE7, + 23341 - 11905: 0x8BE8, + 23342 - 11905: 0x8BE9, + 23343 - 11905: 0x8BEA, + 23344 - 11905: 0x8BEB, + 23345 - 11905: 0x8BEC, + 23346 - 11905: 0xE6D5, + 23347 - 11905: 0x8BED, + 23348 - 11905: 0xD9F8, + 23349 - 11905: 0x8BEE, + 23350 - 11905: 0x8BEF, + 23351 - 11905: 0xE6D6, + 23352 - 11905: 0x8BF0, + 23353 - 11905: 0x8BF1, + 23354 - 11905: 0x8BF2, + 23355 - 11905: 0x8BF3, + 23356 - 11905: 0x8BF4, + 23357 - 11905: 0x8BF5, + 23358 - 11905: 0x8BF6, + 23359 - 11905: 0x8BF7, + 23360 - 11905: 0xE6D7, + 23361 - 11905: 0x8BF8, + 23362 - 11905: 0x8BF9, + 23363 - 11905: 0x8BFA, + 23364 - 11905: 0x8BFB, + 23365 - 11905: 0x8BFC, + 23366 - 11905: 0x8BFD, + 23367 - 11905: 0x8BFE, + 23368 - 11905: 0x8C40, + 23369 - 11905: 0x8C41, + 23370 - 11905: 0x8C42, + 23371 - 11905: 0x8C43, + 23372 - 11905: 0x8C44, + 23373 - 11905: 0x8C45, + 23374 - 11905: 0x8C46, + 23375 - 11905: 0x8C47, + 23376 - 11905: 0xD7D3, + 23377 - 11905: 0xE6DD, + 23378 - 11905: 0x8C48, + 23379 - 11905: 0xE6DE, + 23380 - 11905: 0xBFD7, + 23381 - 11905: 0xD4D0, + 23382 - 11905: 0x8C49, + 23383 - 11905: 0xD7D6, + 23384 - 11905: 0xB4E6, + 23385 - 11905: 0xCBEF, + 23386 - 11905: 0xE6DA, + 23387 - 11905: 0xD8C3, + 23388 - 11905: 0xD7CE, + 23389 - 11905: 0xD0A2, + 23390 - 11905: 0x8C4A, + 23391 - 11905: 0xC3CF, + 23392 - 11905: 0x8C4B, + 23393 - 11905: 0x8C4C, + 23394 - 11905: 0xE6DF, + 23395 - 11905: 0xBCBE, + 23396 - 11905: 0xB9C2, + 23397 - 11905: 0xE6DB, + 23398 - 11905: 0xD1A7, + 23399 - 11905: 0x8C4D, + 23400 - 11905: 0x8C4E, + 23401 - 11905: 0xBAA2, + 23402 - 11905: 0xC2CF, + 23403 - 11905: 0x8C4F, + 23404 - 11905: 0xD8AB, + 23405 - 11905: 0x8C50, + 23406 - 11905: 0x8C51, + 23407 - 11905: 0x8C52, + 23408 - 11905: 0xCAEB, + 23409 - 11905: 0xE5EE, + 23410 - 11905: 0x8C53, + 23411 - 11905: 0xE6DC, + 23412 - 11905: 0x8C54, + 23413 - 11905: 0xB7F5, + 23414 - 11905: 0x8C55, + 23415 - 11905: 0x8C56, + 23416 - 11905: 0x8C57, + 23417 - 11905: 0x8C58, + 23418 - 11905: 0xC8E6, + 23419 - 11905: 0x8C59, + 23420 - 11905: 0x8C5A, + 23421 - 11905: 0xC4F5, + 23422 - 11905: 0x8C5B, + 23423 - 11905: 0x8C5C, + 23424 - 11905: 0xE5B2, + 23425 - 11905: 0xC4FE, + 23426 - 11905: 0x8C5D, + 23427 - 11905: 0xCBFC, + 23428 - 11905: 0xE5B3, + 23429 - 11905: 0xD5AC, + 23430 - 11905: 0x8C5E, + 23431 - 11905: 0xD3EE, + 23432 - 11905: 0xCAD8, + 23433 - 11905: 0xB0B2, + 23434 - 11905: 0x8C5F, + 23435 - 11905: 0xCBCE, + 23436 - 11905: 0xCDEA, + 23437 - 11905: 0x8C60, + 23438 - 11905: 0x8C61, + 23439 - 11905: 0xBAEA, + 23440 - 11905: 0x8C62, + 23441 - 11905: 0x8C63, + 23442 - 11905: 0x8C64, + 23443 - 11905: 0xE5B5, + 23444 - 11905: 0x8C65, + 23445 - 11905: 0xE5B4, + 23446 - 11905: 0x8C66, + 23447 - 11905: 0xD7DA, + 23448 - 11905: 0xB9D9, + 23449 - 11905: 0xD6E6, + 23450 - 11905: 0xB6A8, + 23451 - 11905: 0xCDF0, + 23452 - 11905: 0xD2CB, + 23453 - 11905: 0xB1A6, + 23454 - 11905: 0xCAB5, + 23455 - 11905: 0x8C67, + 23456 - 11905: 0xB3E8, + 23457 - 11905: 0xC9F3, + 23458 - 11905: 0xBFCD, + 23459 - 11905: 0xD0FB, + 23460 - 11905: 0xCAD2, + 23461 - 11905: 0xE5B6, + 23462 - 11905: 0xBBC2, + 23463 - 11905: 0x8C68, + 23464 - 11905: 0x8C69, + 23465 - 11905: 0x8C6A, + 23466 - 11905: 0xCFDC, + 23467 - 11905: 0xB9AC, + 23468 - 11905: 0x8C6B, + 23469 - 11905: 0x8C6C, + 23470 - 11905: 0x8C6D, + 23471 - 11905: 0x8C6E, + 23472 - 11905: 0xD4D7, + 23473 - 11905: 0x8C6F, + 23474 - 11905: 0x8C70, + 23475 - 11905: 0xBAA6, + 23476 - 11905: 0xD1E7, + 23477 - 11905: 0xCFFC, + 23478 - 11905: 0xBCD2, + 23479 - 11905: 0x8C71, + 23480 - 11905: 0xE5B7, + 23481 - 11905: 0xC8DD, + 23482 - 11905: 0x8C72, + 23483 - 11905: 0x8C73, + 23484 - 11905: 0x8C74, + 23485 - 11905: 0xBFED, + 23486 - 11905: 0xB1F6, + 23487 - 11905: 0xCBDE, + 23488 - 11905: 0x8C75, + 23489 - 11905: 0x8C76, + 23490 - 11905: 0xBCC5, + 23491 - 11905: 0x8C77, + 23492 - 11905: 0xBCC4, + 23493 - 11905: 0xD2FA, + 23494 - 11905: 0xC3DC, + 23495 - 11905: 0xBFDC, + 23496 - 11905: 0x8C78, + 23497 - 11905: 0x8C79, + 23498 - 11905: 0x8C7A, + 23499 - 11905: 0x8C7B, + 23500 - 11905: 0xB8BB, + 23501 - 11905: 0x8C7C, + 23502 - 11905: 0x8C7D, + 23503 - 11905: 0x8C7E, + 23504 - 11905: 0xC3C2, + 23505 - 11905: 0x8C80, + 23506 - 11905: 0xBAAE, + 23507 - 11905: 0xD4A2, + 23508 - 11905: 0x8C81, + 23509 - 11905: 0x8C82, + 23510 - 11905: 0x8C83, + 23511 - 11905: 0x8C84, + 23512 - 11905: 0x8C85, + 23513 - 11905: 0x8C86, + 23514 - 11905: 0x8C87, + 23515 - 11905: 0x8C88, + 23516 - 11905: 0x8C89, + 23517 - 11905: 0xC7DE, + 23518 - 11905: 0xC4AF, + 23519 - 11905: 0xB2EC, + 23520 - 11905: 0x8C8A, + 23521 - 11905: 0xB9D1, + 23522 - 11905: 0x8C8B, + 23523 - 11905: 0x8C8C, + 23524 - 11905: 0xE5BB, + 23525 - 11905: 0xC1C8, + 23526 - 11905: 0x8C8D, + 23527 - 11905: 0x8C8E, + 23528 - 11905: 0xD5AF, + 23529 - 11905: 0x8C8F, + 23530 - 11905: 0x8C90, + 23531 - 11905: 0x8C91, + 23532 - 11905: 0x8C92, + 23533 - 11905: 0x8C93, + 23534 - 11905: 0xE5BC, + 23535 - 11905: 0x8C94, + 23536 - 11905: 0xE5BE, + 23537 - 11905: 0x8C95, + 23538 - 11905: 0x8C96, + 23539 - 11905: 0x8C97, + 23540 - 11905: 0x8C98, + 23541 - 11905: 0x8C99, + 23542 - 11905: 0x8C9A, + 23543 - 11905: 0x8C9B, + 23544 - 11905: 0xB4E7, + 23545 - 11905: 0xB6D4, + 23546 - 11905: 0xCBC2, + 23547 - 11905: 0xD1B0, + 23548 - 11905: 0xB5BC, + 23549 - 11905: 0x8C9C, + 23550 - 11905: 0x8C9D, + 23551 - 11905: 0xCAD9, + 23552 - 11905: 0x8C9E, + 23553 - 11905: 0xB7E2, + 23554 - 11905: 0x8C9F, + 23555 - 11905: 0x8CA0, + 23556 - 11905: 0xC9E4, + 23557 - 11905: 0x8CA1, + 23558 - 11905: 0xBDAB, + 23559 - 11905: 0x8CA2, + 23560 - 11905: 0x8CA3, + 23561 - 11905: 0xCEBE, + 23562 - 11905: 0xD7F0, + 23563 - 11905: 0x8CA4, + 23564 - 11905: 0x8CA5, + 23565 - 11905: 0x8CA6, + 23566 - 11905: 0x8CA7, + 23567 - 11905: 0xD0A1, + 23568 - 11905: 0x8CA8, + 23569 - 11905: 0xC9D9, + 23570 - 11905: 0x8CA9, + 23571 - 11905: 0x8CAA, + 23572 - 11905: 0xB6FB, + 23573 - 11905: 0xE6D8, + 23574 - 11905: 0xBCE2, + 23575 - 11905: 0x8CAB, + 23576 - 11905: 0xB3BE, + 23577 - 11905: 0x8CAC, + 23578 - 11905: 0xC9D0, + 23579 - 11905: 0x8CAD, + 23580 - 11905: 0xE6D9, + 23581 - 11905: 0xB3A2, + 23582 - 11905: 0x8CAE, + 23583 - 11905: 0x8CAF, + 23584 - 11905: 0x8CB0, + 23585 - 11905: 0x8CB1, + 23586 - 11905: 0xDECC, + 23587 - 11905: 0x8CB2, + 23588 - 11905: 0xD3C8, + 23589 - 11905: 0xDECD, + 23590 - 11905: 0x8CB3, + 23591 - 11905: 0xD2A2, + 23592 - 11905: 0x8CB4, + 23593 - 11905: 0x8CB5, + 23594 - 11905: 0x8CB6, + 23595 - 11905: 0x8CB7, + 23596 - 11905: 0xDECE, + 23597 - 11905: 0x8CB8, + 23598 - 11905: 0x8CB9, + 23599 - 11905: 0x8CBA, + 23600 - 11905: 0x8CBB, + 23601 - 11905: 0xBECD, + 23602 - 11905: 0x8CBC, + 23603 - 11905: 0x8CBD, + 23604 - 11905: 0xDECF, + 23605 - 11905: 0x8CBE, + 23606 - 11905: 0x8CBF, + 23607 - 11905: 0x8CC0, + 23608 - 11905: 0xCAAC, + 23609 - 11905: 0xD2FC, + 23610 - 11905: 0xB3DF, + 23611 - 11905: 0xE5EA, + 23612 - 11905: 0xC4E1, + 23613 - 11905: 0xBEA1, + 23614 - 11905: 0xCEB2, + 23615 - 11905: 0xC4F2, + 23616 - 11905: 0xBED6, + 23617 - 11905: 0xC6A8, + 23618 - 11905: 0xB2E3, + 23619 - 11905: 0x8CC1, + 23620 - 11905: 0x8CC2, + 23621 - 11905: 0xBED3, + 23622 - 11905: 0x8CC3, + 23623 - 11905: 0x8CC4, + 23624 - 11905: 0xC7FC, + 23625 - 11905: 0xCCEB, + 23626 - 11905: 0xBDEC, + 23627 - 11905: 0xCEDD, + 23628 - 11905: 0x8CC5, + 23629 - 11905: 0x8CC6, + 23630 - 11905: 0xCABA, + 23631 - 11905: 0xC6C1, + 23632 - 11905: 0xE5EC, + 23633 - 11905: 0xD0BC, + 23634 - 11905: 0x8CC7, + 23635 - 11905: 0x8CC8, + 23636 - 11905: 0x8CC9, + 23637 - 11905: 0xD5B9, + 23638 - 11905: 0x8CCA, + 23639 - 11905: 0x8CCB, + 23640 - 11905: 0x8CCC, + 23641 - 11905: 0xE5ED, + 23642 - 11905: 0x8CCD, + 23643 - 11905: 0x8CCE, + 23644 - 11905: 0x8CCF, + 23645 - 11905: 0x8CD0, + 23646 - 11905: 0xCAF4, + 23647 - 11905: 0x8CD1, + 23648 - 11905: 0xCDC0, + 23649 - 11905: 0xC2C5, + 23650 - 11905: 0x8CD2, + 23651 - 11905: 0xE5EF, + 23652 - 11905: 0x8CD3, + 23653 - 11905: 0xC2C4, + 23654 - 11905: 0xE5F0, + 23655 - 11905: 0x8CD4, + 23656 - 11905: 0x8CD5, + 23657 - 11905: 0x8CD6, + 23658 - 11905: 0x8CD7, + 23659 - 11905: 0x8CD8, + 23660 - 11905: 0x8CD9, + 23661 - 11905: 0x8CDA, + 23662 - 11905: 0xE5F8, + 23663 - 11905: 0xCDCD, + 23664 - 11905: 0x8CDB, + 23665 - 11905: 0xC9BD, + 23666 - 11905: 0x8CDC, + 23667 - 11905: 0x8CDD, + 23668 - 11905: 0x8CDE, + 23669 - 11905: 0x8CDF, + 23670 - 11905: 0x8CE0, + 23671 - 11905: 0x8CE1, + 23672 - 11905: 0x8CE2, + 23673 - 11905: 0xD2D9, + 23674 - 11905: 0xE1A8, + 23675 - 11905: 0x8CE3, + 23676 - 11905: 0x8CE4, + 23677 - 11905: 0x8CE5, + 23678 - 11905: 0x8CE6, + 23679 - 11905: 0xD3EC, + 23680 - 11905: 0x8CE7, + 23681 - 11905: 0xCBEA, + 23682 - 11905: 0xC6F1, + 23683 - 11905: 0x8CE8, + 23684 - 11905: 0x8CE9, + 23685 - 11905: 0x8CEA, + 23686 - 11905: 0x8CEB, + 23687 - 11905: 0x8CEC, + 23688 - 11905: 0xE1AC, + 23689 - 11905: 0x8CED, + 23690 - 11905: 0x8CEE, + 23691 - 11905: 0x8CEF, + 23692 - 11905: 0xE1A7, + 23693 - 11905: 0xE1A9, + 23694 - 11905: 0x8CF0, + 23695 - 11905: 0x8CF1, + 23696 - 11905: 0xE1AA, + 23697 - 11905: 0xE1AF, + 23698 - 11905: 0x8CF2, + 23699 - 11905: 0x8CF3, + 23700 - 11905: 0xB2ED, + 23701 - 11905: 0x8CF4, + 23702 - 11905: 0xE1AB, + 23703 - 11905: 0xB8DA, + 23704 - 11905: 0xE1AD, + 23705 - 11905: 0xE1AE, + 23706 - 11905: 0xE1B0, + 23707 - 11905: 0xB5BA, + 23708 - 11905: 0xE1B1, + 23709 - 11905: 0x8CF5, + 23710 - 11905: 0x8CF6, + 23711 - 11905: 0x8CF7, + 23712 - 11905: 0x8CF8, + 23713 - 11905: 0x8CF9, + 23714 - 11905: 0xE1B3, + 23715 - 11905: 0xE1B8, + 23716 - 11905: 0x8CFA, + 23717 - 11905: 0x8CFB, + 23718 - 11905: 0x8CFC, + 23719 - 11905: 0x8CFD, + 23720 - 11905: 0x8CFE, + 23721 - 11905: 0xD1D2, + 23722 - 11905: 0x8D40, + 23723 - 11905: 0xE1B6, + 23724 - 11905: 0xE1B5, + 23725 - 11905: 0xC1EB, + 23726 - 11905: 0x8D41, + 23727 - 11905: 0x8D42, + 23728 - 11905: 0x8D43, + 23729 - 11905: 0xE1B7, + 23730 - 11905: 0x8D44, + 23731 - 11905: 0xD4C0, + 23732 - 11905: 0x8D45, + 23733 - 11905: 0xE1B2, + 23734 - 11905: 0x8D46, + 23735 - 11905: 0xE1BA, + 23736 - 11905: 0xB0B6, + 23737 - 11905: 0x8D47, + 23738 - 11905: 0x8D48, + 23739 - 11905: 0x8D49, + 23740 - 11905: 0x8D4A, + 23741 - 11905: 0xE1B4, + 23742 - 11905: 0x8D4B, + 23743 - 11905: 0xBFF9, + 23744 - 11905: 0x8D4C, + 23745 - 11905: 0xE1B9, + 23746 - 11905: 0x8D4D, + 23747 - 11905: 0x8D4E, + 23748 - 11905: 0xE1BB, + 23749 - 11905: 0x8D4F, + 23750 - 11905: 0x8D50, + 23751 - 11905: 0x8D51, + 23752 - 11905: 0x8D52, + 23753 - 11905: 0x8D53, + 23754 - 11905: 0x8D54, + 23755 - 11905: 0xE1BE, + 23756 - 11905: 0x8D55, + 23757 - 11905: 0x8D56, + 23758 - 11905: 0x8D57, + 23759 - 11905: 0x8D58, + 23760 - 11905: 0x8D59, + 23761 - 11905: 0x8D5A, + 23762 - 11905: 0xE1BC, + 23763 - 11905: 0x8D5B, + 23764 - 11905: 0x8D5C, + 23765 - 11905: 0x8D5D, + 23766 - 11905: 0x8D5E, + 23767 - 11905: 0x8D5F, + 23768 - 11905: 0x8D60, + 23769 - 11905: 0xD6C5, + 23770 - 11905: 0x8D61, + 23771 - 11905: 0x8D62, + 23772 - 11905: 0x8D63, + 23773 - 11905: 0x8D64, + 23774 - 11905: 0x8D65, + 23775 - 11905: 0x8D66, + 23776 - 11905: 0x8D67, + 23777 - 11905: 0xCFBF, + 23778 - 11905: 0x8D68, + 23779 - 11905: 0x8D69, + 23780 - 11905: 0xE1BD, + 23781 - 11905: 0xE1BF, + 23782 - 11905: 0xC2CD, + 23783 - 11905: 0x8D6A, + 23784 - 11905: 0xB6EB, + 23785 - 11905: 0x8D6B, + 23786 - 11905: 0xD3F8, + 23787 - 11905: 0x8D6C, + 23788 - 11905: 0x8D6D, + 23789 - 11905: 0xC7CD, + 23790 - 11905: 0x8D6E, + 23791 - 11905: 0x8D6F, + 23792 - 11905: 0xB7E5, + 23793 - 11905: 0x8D70, + 23794 - 11905: 0x8D71, + 23795 - 11905: 0x8D72, + 23796 - 11905: 0x8D73, + 23797 - 11905: 0x8D74, + 23798 - 11905: 0x8D75, + 23799 - 11905: 0x8D76, + 23800 - 11905: 0x8D77, + 23801 - 11905: 0x8D78, + 23802 - 11905: 0x8D79, + 23803 - 11905: 0xBEFE, + 23804 - 11905: 0x8D7A, + 23805 - 11905: 0x8D7B, + 23806 - 11905: 0x8D7C, + 23807 - 11905: 0x8D7D, + 23808 - 11905: 0x8D7E, + 23809 - 11905: 0x8D80, + 23810 - 11905: 0xE1C0, + 23811 - 11905: 0xE1C1, + 23812 - 11905: 0x8D81, + 23813 - 11905: 0x8D82, + 23814 - 11905: 0xE1C7, + 23815 - 11905: 0xB3E7, + 23816 - 11905: 0x8D83, + 23817 - 11905: 0x8D84, + 23818 - 11905: 0x8D85, + 23819 - 11905: 0x8D86, + 23820 - 11905: 0x8D87, + 23821 - 11905: 0x8D88, + 23822 - 11905: 0xC6E9, + 23823 - 11905: 0x8D89, + 23824 - 11905: 0x8D8A, + 23825 - 11905: 0x8D8B, + 23826 - 11905: 0x8D8C, + 23827 - 11905: 0x8D8D, + 23828 - 11905: 0xB4DE, + 23829 - 11905: 0x8D8E, + 23830 - 11905: 0xD1C2, + 23831 - 11905: 0x8D8F, + 23832 - 11905: 0x8D90, + 23833 - 11905: 0x8D91, + 23834 - 11905: 0x8D92, + 23835 - 11905: 0xE1C8, + 23836 - 11905: 0x8D93, + 23837 - 11905: 0x8D94, + 23838 - 11905: 0xE1C6, + 23839 - 11905: 0x8D95, + 23840 - 11905: 0x8D96, + 23841 - 11905: 0x8D97, + 23842 - 11905: 0x8D98, + 23843 - 11905: 0x8D99, + 23844 - 11905: 0xE1C5, + 23845 - 11905: 0x8D9A, + 23846 - 11905: 0xE1C3, + 23847 - 11905: 0xE1C2, + 23848 - 11905: 0x8D9B, + 23849 - 11905: 0xB1C0, + 23850 - 11905: 0x8D9C, + 23851 - 11905: 0x8D9D, + 23852 - 11905: 0x8D9E, + 23853 - 11905: 0xD5B8, + 23854 - 11905: 0xE1C4, + 23855 - 11905: 0x8D9F, + 23856 - 11905: 0x8DA0, + 23857 - 11905: 0x8DA1, + 23858 - 11905: 0x8DA2, + 23859 - 11905: 0x8DA3, + 23860 - 11905: 0xE1CB, + 23861 - 11905: 0x8DA4, + 23862 - 11905: 0x8DA5, + 23863 - 11905: 0x8DA6, + 23864 - 11905: 0x8DA7, + 23865 - 11905: 0x8DA8, + 23866 - 11905: 0x8DA9, + 23867 - 11905: 0x8DAA, + 23868 - 11905: 0x8DAB, + 23869 - 11905: 0xE1CC, + 23870 - 11905: 0xE1CA, + 23871 - 11905: 0x8DAC, + 23872 - 11905: 0x8DAD, + 23873 - 11905: 0x8DAE, + 23874 - 11905: 0x8DAF, + 23875 - 11905: 0x8DB0, + 23876 - 11905: 0x8DB1, + 23877 - 11905: 0x8DB2, + 23878 - 11905: 0x8DB3, + 23879 - 11905: 0xEFFA, + 23880 - 11905: 0x8DB4, + 23881 - 11905: 0x8DB5, + 23882 - 11905: 0xE1D3, + 23883 - 11905: 0xE1D2, + 23884 - 11905: 0xC7B6, + 23885 - 11905: 0x8DB6, + 23886 - 11905: 0x8DB7, + 23887 - 11905: 0x8DB8, + 23888 - 11905: 0x8DB9, + 23889 - 11905: 0x8DBA, + 23890 - 11905: 0x8DBB, + 23891 - 11905: 0x8DBC, + 23892 - 11905: 0x8DBD, + 23893 - 11905: 0x8DBE, + 23894 - 11905: 0x8DBF, + 23895 - 11905: 0x8DC0, + 23896 - 11905: 0xE1C9, + 23897 - 11905: 0x8DC1, + 23898 - 11905: 0x8DC2, + 23899 - 11905: 0xE1CE, + 23900 - 11905: 0x8DC3, + 23901 - 11905: 0xE1D0, + 23902 - 11905: 0x8DC4, + 23903 - 11905: 0x8DC5, + 23904 - 11905: 0x8DC6, + 23905 - 11905: 0x8DC7, + 23906 - 11905: 0x8DC8, + 23907 - 11905: 0x8DC9, + 23908 - 11905: 0x8DCA, + 23909 - 11905: 0x8DCB, + 23910 - 11905: 0x8DCC, + 23911 - 11905: 0x8DCD, + 23912 - 11905: 0x8DCE, + 23913 - 11905: 0xE1D4, + 23914 - 11905: 0x8DCF, + 23915 - 11905: 0xE1D1, + 23916 - 11905: 0xE1CD, + 23917 - 11905: 0x8DD0, + 23918 - 11905: 0x8DD1, + 23919 - 11905: 0xE1CF, + 23920 - 11905: 0x8DD2, + 23921 - 11905: 0x8DD3, + 23922 - 11905: 0x8DD4, + 23923 - 11905: 0x8DD5, + 23924 - 11905: 0xE1D5, + 23925 - 11905: 0x8DD6, + 23926 - 11905: 0x8DD7, + 23927 - 11905: 0x8DD8, + 23928 - 11905: 0x8DD9, + 23929 - 11905: 0x8DDA, + 23930 - 11905: 0x8DDB, + 23931 - 11905: 0x8DDC, + 23932 - 11905: 0x8DDD, + 23933 - 11905: 0x8DDE, + 23934 - 11905: 0x8DDF, + 23935 - 11905: 0x8DE0, + 23936 - 11905: 0x8DE1, + 23937 - 11905: 0x8DE2, + 23938 - 11905: 0xE1D6, + 23939 - 11905: 0x8DE3, + 23940 - 11905: 0x8DE4, + 23941 - 11905: 0x8DE5, + 23942 - 11905: 0x8DE6, + 23943 - 11905: 0x8DE7, + 23944 - 11905: 0x8DE8, + 23945 - 11905: 0x8DE9, + 23946 - 11905: 0x8DEA, + 23947 - 11905: 0x8DEB, + 23948 - 11905: 0x8DEC, + 23949 - 11905: 0x8DED, + 23950 - 11905: 0x8DEE, + 23951 - 11905: 0x8DEF, + 23952 - 11905: 0x8DF0, + 23953 - 11905: 0x8DF1, + 23954 - 11905: 0x8DF2, + 23955 - 11905: 0x8DF3, + 23956 - 11905: 0x8DF4, + 23957 - 11905: 0x8DF5, + 23958 - 11905: 0x8DF6, + 23959 - 11905: 0x8DF7, + 23960 - 11905: 0x8DF8, + 23961 - 11905: 0xE1D7, + 23962 - 11905: 0x8DF9, + 23963 - 11905: 0x8DFA, + 23964 - 11905: 0x8DFB, + 23965 - 11905: 0xE1D8, + 23966 - 11905: 0x8DFC, + 23967 - 11905: 0x8DFD, + 23968 - 11905: 0x8DFE, + 23969 - 11905: 0x8E40, + 23970 - 11905: 0x8E41, + 23971 - 11905: 0x8E42, + 23972 - 11905: 0x8E43, + 23973 - 11905: 0x8E44, + 23974 - 11905: 0x8E45, + 23975 - 11905: 0x8E46, + 23976 - 11905: 0x8E47, + 23977 - 11905: 0x8E48, + 23978 - 11905: 0x8E49, + 23979 - 11905: 0x8E4A, + 23980 - 11905: 0x8E4B, + 23981 - 11905: 0x8E4C, + 23982 - 11905: 0x8E4D, + 23983 - 11905: 0x8E4E, + 23984 - 11905: 0x8E4F, + 23985 - 11905: 0x8E50, + 23986 - 11905: 0x8E51, + 23987 - 11905: 0x8E52, + 23988 - 11905: 0x8E53, + 23989 - 11905: 0x8E54, + 23990 - 11905: 0x8E55, + 23991 - 11905: 0xE1DA, + 23992 - 11905: 0x8E56, + 23993 - 11905: 0x8E57, + 23994 - 11905: 0x8E58, + 23995 - 11905: 0x8E59, + 23996 - 11905: 0x8E5A, + 23997 - 11905: 0x8E5B, + 23998 - 11905: 0x8E5C, + 23999 - 11905: 0x8E5D, + 24000 - 11905: 0x8E5E, + 24001 - 11905: 0x8E5F, + 24002 - 11905: 0x8E60, + 24003 - 11905: 0x8E61, + 24004 - 11905: 0x8E62, + 24005 - 11905: 0xE1DB, + 24006 - 11905: 0x8E63, + 24007 - 11905: 0x8E64, + 24008 - 11905: 0x8E65, + 24009 - 11905: 0x8E66, + 24010 - 11905: 0x8E67, + 24011 - 11905: 0x8E68, + 24012 - 11905: 0x8E69, + 24013 - 11905: 0xCEA1, + 24014 - 11905: 0x8E6A, + 24015 - 11905: 0x8E6B, + 24016 - 11905: 0x8E6C, + 24017 - 11905: 0x8E6D, + 24018 - 11905: 0x8E6E, + 24019 - 11905: 0x8E6F, + 24020 - 11905: 0x8E70, + 24021 - 11905: 0x8E71, + 24022 - 11905: 0x8E72, + 24023 - 11905: 0x8E73, + 24024 - 11905: 0x8E74, + 24025 - 11905: 0x8E75, + 24026 - 11905: 0x8E76, + 24027 - 11905: 0xE7DD, + 24028 - 11905: 0x8E77, + 24029 - 11905: 0xB4A8, + 24030 - 11905: 0xD6DD, + 24031 - 11905: 0x8E78, + 24032 - 11905: 0x8E79, + 24033 - 11905: 0xD1B2, + 24034 - 11905: 0xB3B2, + 24035 - 11905: 0x8E7A, + 24036 - 11905: 0x8E7B, + 24037 - 11905: 0xB9A4, + 24038 - 11905: 0xD7F3, + 24039 - 11905: 0xC7C9, + 24040 - 11905: 0xBEDE, + 24041 - 11905: 0xB9AE, + 24042 - 11905: 0x8E7C, + 24043 - 11905: 0xCED7, + 24044 - 11905: 0x8E7D, + 24045 - 11905: 0x8E7E, + 24046 - 11905: 0xB2EE, + 24047 - 11905: 0xDBCF, + 24048 - 11905: 0x8E80, + 24049 - 11905: 0xBCBA, + 24050 - 11905: 0xD2D1, + 24051 - 11905: 0xCBC8, + 24052 - 11905: 0xB0CD, + 24053 - 11905: 0x8E81, + 24054 - 11905: 0x8E82, + 24055 - 11905: 0xCFEF, + 24056 - 11905: 0x8E83, + 24057 - 11905: 0x8E84, + 24058 - 11905: 0x8E85, + 24059 - 11905: 0x8E86, + 24060 - 11905: 0x8E87, + 24061 - 11905: 0xD9E3, + 24062 - 11905: 0xBDED, + 24063 - 11905: 0x8E88, + 24064 - 11905: 0x8E89, + 24065 - 11905: 0xB1D2, + 24066 - 11905: 0xCAD0, + 24067 - 11905: 0xB2BC, + 24068 - 11905: 0x8E8A, + 24069 - 11905: 0xCBA7, + 24070 - 11905: 0xB7AB, + 24071 - 11905: 0x8E8B, + 24072 - 11905: 0xCAA6, + 24073 - 11905: 0x8E8C, + 24074 - 11905: 0x8E8D, + 24075 - 11905: 0x8E8E, + 24076 - 11905: 0xCFA3, + 24077 - 11905: 0x8E8F, + 24078 - 11905: 0x8E90, + 24079 - 11905: 0xE0F8, + 24080 - 11905: 0xD5CA, + 24081 - 11905: 0xE0FB, + 24082 - 11905: 0x8E91, + 24083 - 11905: 0x8E92, + 24084 - 11905: 0xE0FA, + 24085 - 11905: 0xC5C1, + 24086 - 11905: 0xCCFB, + 24087 - 11905: 0x8E93, + 24088 - 11905: 0xC1B1, + 24089 - 11905: 0xE0F9, + 24090 - 11905: 0xD6E3, + 24091 - 11905: 0xB2AF, + 24092 - 11905: 0xD6C4, + 24093 - 11905: 0xB5DB, + 24094 - 11905: 0x8E94, + 24095 - 11905: 0x8E95, + 24096 - 11905: 0x8E96, + 24097 - 11905: 0x8E97, + 24098 - 11905: 0x8E98, + 24099 - 11905: 0x8E99, + 24100 - 11905: 0x8E9A, + 24101 - 11905: 0x8E9B, + 24102 - 11905: 0xB4F8, + 24103 - 11905: 0xD6A1, + 24104 - 11905: 0x8E9C, + 24105 - 11905: 0x8E9D, + 24106 - 11905: 0x8E9E, + 24107 - 11905: 0x8E9F, + 24108 - 11905: 0x8EA0, + 24109 - 11905: 0xCFAF, + 24110 - 11905: 0xB0EF, + 24111 - 11905: 0x8EA1, + 24112 - 11905: 0x8EA2, + 24113 - 11905: 0xE0FC, + 24114 - 11905: 0x8EA3, + 24115 - 11905: 0x8EA4, + 24116 - 11905: 0x8EA5, + 24117 - 11905: 0x8EA6, + 24118 - 11905: 0x8EA7, + 24119 - 11905: 0xE1A1, + 24120 - 11905: 0xB3A3, + 24121 - 11905: 0x8EA8, + 24122 - 11905: 0x8EA9, + 24123 - 11905: 0xE0FD, + 24124 - 11905: 0xE0FE, + 24125 - 11905: 0xC3B1, + 24126 - 11905: 0x8EAA, + 24127 - 11905: 0x8EAB, + 24128 - 11905: 0x8EAC, + 24129 - 11905: 0x8EAD, + 24130 - 11905: 0xC3DD, + 24131 - 11905: 0x8EAE, + 24132 - 11905: 0xE1A2, + 24133 - 11905: 0xB7F9, + 24134 - 11905: 0x8EAF, + 24135 - 11905: 0x8EB0, + 24136 - 11905: 0x8EB1, + 24137 - 11905: 0x8EB2, + 24138 - 11905: 0x8EB3, + 24139 - 11905: 0x8EB4, + 24140 - 11905: 0xBBCF, + 24141 - 11905: 0x8EB5, + 24142 - 11905: 0x8EB6, + 24143 - 11905: 0x8EB7, + 24144 - 11905: 0x8EB8, + 24145 - 11905: 0x8EB9, + 24146 - 11905: 0x8EBA, + 24147 - 11905: 0x8EBB, + 24148 - 11905: 0xE1A3, + 24149 - 11905: 0xC4BB, + 24150 - 11905: 0x8EBC, + 24151 - 11905: 0x8EBD, + 24152 - 11905: 0x8EBE, + 24153 - 11905: 0x8EBF, + 24154 - 11905: 0x8EC0, + 24155 - 11905: 0xE1A4, + 24156 - 11905: 0x8EC1, + 24157 - 11905: 0x8EC2, + 24158 - 11905: 0xE1A5, + 24159 - 11905: 0x8EC3, + 24160 - 11905: 0x8EC4, + 24161 - 11905: 0xE1A6, + 24162 - 11905: 0xB4B1, + 24163 - 11905: 0x8EC5, + 24164 - 11905: 0x8EC6, + 24165 - 11905: 0x8EC7, + 24166 - 11905: 0x8EC8, + 24167 - 11905: 0x8EC9, + 24168 - 11905: 0x8ECA, + 24169 - 11905: 0x8ECB, + 24170 - 11905: 0x8ECC, + 24171 - 11905: 0x8ECD, + 24172 - 11905: 0x8ECE, + 24173 - 11905: 0x8ECF, + 24174 - 11905: 0x8ED0, + 24175 - 11905: 0x8ED1, + 24176 - 11905: 0x8ED2, + 24177 - 11905: 0x8ED3, + 24178 - 11905: 0xB8C9, + 24179 - 11905: 0xC6BD, + 24180 - 11905: 0xC4EA, + 24181 - 11905: 0x8ED4, + 24182 - 11905: 0xB2A2, + 24183 - 11905: 0x8ED5, + 24184 - 11905: 0xD0D2, + 24185 - 11905: 0x8ED6, + 24186 - 11905: 0xE7DB, + 24187 - 11905: 0xBBC3, + 24188 - 11905: 0xD3D7, + 24189 - 11905: 0xD3C4, + 24190 - 11905: 0x8ED7, + 24191 - 11905: 0xB9E3, + 24192 - 11905: 0xE2CF, + 24193 - 11905: 0x8ED8, + 24194 - 11905: 0x8ED9, + 24195 - 11905: 0x8EDA, + 24196 - 11905: 0xD7AF, + 24197 - 11905: 0x8EDB, + 24198 - 11905: 0xC7EC, + 24199 - 11905: 0xB1D3, + 24200 - 11905: 0x8EDC, + 24201 - 11905: 0x8EDD, + 24202 - 11905: 0xB4B2, + 24203 - 11905: 0xE2D1, + 24204 - 11905: 0x8EDE, + 24205 - 11905: 0x8EDF, + 24206 - 11905: 0x8EE0, + 24207 - 11905: 0xD0F2, + 24208 - 11905: 0xC2AE, + 24209 - 11905: 0xE2D0, + 24210 - 11905: 0x8EE1, + 24211 - 11905: 0xBFE2, + 24212 - 11905: 0xD3A6, + 24213 - 11905: 0xB5D7, + 24214 - 11905: 0xE2D2, + 24215 - 11905: 0xB5EA, + 24216 - 11905: 0x8EE2, + 24217 - 11905: 0xC3ED, + 24218 - 11905: 0xB8FD, + 24219 - 11905: 0x8EE3, + 24220 - 11905: 0xB8AE, + 24221 - 11905: 0x8EE4, + 24222 - 11905: 0xC5D3, + 24223 - 11905: 0xB7CF, + 24224 - 11905: 0xE2D4, + 24225 - 11905: 0x8EE5, + 24226 - 11905: 0x8EE6, + 24227 - 11905: 0x8EE7, + 24228 - 11905: 0x8EE8, + 24229 - 11905: 0xE2D3, + 24230 - 11905: 0xB6C8, + 24231 - 11905: 0xD7F9, + 24232 - 11905: 0x8EE9, + 24233 - 11905: 0x8EEA, + 24234 - 11905: 0x8EEB, + 24235 - 11905: 0x8EEC, + 24236 - 11905: 0x8EED, + 24237 - 11905: 0xCDA5, + 24238 - 11905: 0x8EEE, + 24239 - 11905: 0x8EEF, + 24240 - 11905: 0x8EF0, + 24241 - 11905: 0x8EF1, + 24242 - 11905: 0x8EF2, + 24243 - 11905: 0xE2D8, + 24244 - 11905: 0x8EF3, + 24245 - 11905: 0xE2D6, + 24246 - 11905: 0xCAFC, + 24247 - 11905: 0xBFB5, + 24248 - 11905: 0xD3B9, + 24249 - 11905: 0xE2D5, + 24250 - 11905: 0x8EF4, + 24251 - 11905: 0x8EF5, + 24252 - 11905: 0x8EF6, + 24253 - 11905: 0x8EF7, + 24254 - 11905: 0xE2D7, + 24255 - 11905: 0x8EF8, + 24256 - 11905: 0x8EF9, + 24257 - 11905: 0x8EFA, + 24258 - 11905: 0x8EFB, + 24259 - 11905: 0x8EFC, + 24260 - 11905: 0x8EFD, + 24261 - 11905: 0x8EFE, + 24262 - 11905: 0x8F40, + 24263 - 11905: 0x8F41, + 24264 - 11905: 0x8F42, + 24265 - 11905: 0xC1AE, + 24266 - 11905: 0xC0C8, + 24267 - 11905: 0x8F43, + 24268 - 11905: 0x8F44, + 24269 - 11905: 0x8F45, + 24270 - 11905: 0x8F46, + 24271 - 11905: 0x8F47, + 24272 - 11905: 0x8F48, + 24273 - 11905: 0xE2DB, + 24274 - 11905: 0xE2DA, + 24275 - 11905: 0xC0AA, + 24276 - 11905: 0x8F49, + 24277 - 11905: 0x8F4A, + 24278 - 11905: 0xC1CE, + 24279 - 11905: 0x8F4B, + 24280 - 11905: 0x8F4C, + 24281 - 11905: 0x8F4D, + 24282 - 11905: 0x8F4E, + 24283 - 11905: 0xE2DC, + 24284 - 11905: 0x8F4F, + 24285 - 11905: 0x8F50, + 24286 - 11905: 0x8F51, + 24287 - 11905: 0x8F52, + 24288 - 11905: 0x8F53, + 24289 - 11905: 0x8F54, + 24290 - 11905: 0x8F55, + 24291 - 11905: 0x8F56, + 24292 - 11905: 0x8F57, + 24293 - 11905: 0x8F58, + 24294 - 11905: 0x8F59, + 24295 - 11905: 0x8F5A, + 24296 - 11905: 0xE2DD, + 24297 - 11905: 0x8F5B, + 24298 - 11905: 0xE2DE, + 24299 - 11905: 0x8F5C, + 24300 - 11905: 0x8F5D, + 24301 - 11905: 0x8F5E, + 24302 - 11905: 0x8F5F, + 24303 - 11905: 0x8F60, + 24304 - 11905: 0x8F61, + 24305 - 11905: 0x8F62, + 24306 - 11905: 0x8F63, + 24307 - 11905: 0x8F64, + 24308 - 11905: 0xDBC8, + 24309 - 11905: 0x8F65, + 24310 - 11905: 0xD1D3, + 24311 - 11905: 0xCDA2, + 24312 - 11905: 0x8F66, + 24313 - 11905: 0x8F67, + 24314 - 11905: 0xBDA8, + 24315 - 11905: 0x8F68, + 24316 - 11905: 0x8F69, + 24317 - 11905: 0x8F6A, + 24318 - 11905: 0xDEC3, + 24319 - 11905: 0xD8A5, + 24320 - 11905: 0xBFAA, + 24321 - 11905: 0xDBCD, + 24322 - 11905: 0xD2EC, + 24323 - 11905: 0xC6FA, + 24324 - 11905: 0xC5AA, + 24325 - 11905: 0x8F6B, + 24326 - 11905: 0x8F6C, + 24327 - 11905: 0x8F6D, + 24328 - 11905: 0xDEC4, + 24329 - 11905: 0x8F6E, + 24330 - 11905: 0xB1D7, + 24331 - 11905: 0xDFAE, + 24332 - 11905: 0x8F6F, + 24333 - 11905: 0x8F70, + 24334 - 11905: 0x8F71, + 24335 - 11905: 0xCABD, + 24336 - 11905: 0x8F72, + 24337 - 11905: 0xDFB1, + 24338 - 11905: 0x8F73, + 24339 - 11905: 0xB9AD, + 24340 - 11905: 0x8F74, + 24341 - 11905: 0xD2FD, + 24342 - 11905: 0x8F75, + 24343 - 11905: 0xB8A5, + 24344 - 11905: 0xBAEB, + 24345 - 11905: 0x8F76, + 24346 - 11905: 0x8F77, + 24347 - 11905: 0xB3DA, + 24348 - 11905: 0x8F78, + 24349 - 11905: 0x8F79, + 24350 - 11905: 0x8F7A, + 24351 - 11905: 0xB5DC, + 24352 - 11905: 0xD5C5, + 24353 - 11905: 0x8F7B, + 24354 - 11905: 0x8F7C, + 24355 - 11905: 0x8F7D, + 24356 - 11905: 0x8F7E, + 24357 - 11905: 0xC3D6, + 24358 - 11905: 0xCFD2, + 24359 - 11905: 0xBBA1, + 24360 - 11905: 0x8F80, + 24361 - 11905: 0xE5F3, + 24362 - 11905: 0xE5F2, + 24363 - 11905: 0x8F81, + 24364 - 11905: 0x8F82, + 24365 - 11905: 0xE5F4, + 24366 - 11905: 0x8F83, + 24367 - 11905: 0xCDE4, + 24368 - 11905: 0x8F84, + 24369 - 11905: 0xC8F5, + 24370 - 11905: 0x8F85, + 24371 - 11905: 0x8F86, + 24372 - 11905: 0x8F87, + 24373 - 11905: 0x8F88, + 24374 - 11905: 0x8F89, + 24375 - 11905: 0x8F8A, + 24376 - 11905: 0x8F8B, + 24377 - 11905: 0xB5AF, + 24378 - 11905: 0xC7BF, + 24379 - 11905: 0x8F8C, + 24380 - 11905: 0xE5F6, + 24381 - 11905: 0x8F8D, + 24382 - 11905: 0x8F8E, + 24383 - 11905: 0x8F8F, + 24384 - 11905: 0xECB0, + 24385 - 11905: 0x8F90, + 24386 - 11905: 0x8F91, + 24387 - 11905: 0x8F92, + 24388 - 11905: 0x8F93, + 24389 - 11905: 0x8F94, + 24390 - 11905: 0x8F95, + 24391 - 11905: 0x8F96, + 24392 - 11905: 0x8F97, + 24393 - 11905: 0x8F98, + 24394 - 11905: 0x8F99, + 24395 - 11905: 0x8F9A, + 24396 - 11905: 0x8F9B, + 24397 - 11905: 0x8F9C, + 24398 - 11905: 0x8F9D, + 24399 - 11905: 0x8F9E, + 24400 - 11905: 0xE5E6, + 24401 - 11905: 0x8F9F, + 24402 - 11905: 0xB9E9, + 24403 - 11905: 0xB5B1, + 24404 - 11905: 0x8FA0, + 24405 - 11905: 0xC2BC, + 24406 - 11905: 0xE5E8, + 24407 - 11905: 0xE5E7, + 24408 - 11905: 0xE5E9, + 24409 - 11905: 0x8FA1, + 24410 - 11905: 0x8FA2, + 24411 - 11905: 0x8FA3, + 24412 - 11905: 0x8FA4, + 24413 - 11905: 0xD2CD, + 24414 - 11905: 0x8FA5, + 24415 - 11905: 0x8FA6, + 24416 - 11905: 0x8FA7, + 24417 - 11905: 0xE1EA, + 24418 - 11905: 0xD0CE, + 24419 - 11905: 0x8FA8, + 24420 - 11905: 0xCDAE, + 24421 - 11905: 0x8FA9, + 24422 - 11905: 0xD1E5, + 24423 - 11905: 0x8FAA, + 24424 - 11905: 0x8FAB, + 24425 - 11905: 0xB2CA, + 24426 - 11905: 0xB1EB, + 24427 - 11905: 0x8FAC, + 24428 - 11905: 0xB1F2, + 24429 - 11905: 0xC5ED, + 24430 - 11905: 0x8FAD, + 24431 - 11905: 0x8FAE, + 24432 - 11905: 0xD5C3, + 24433 - 11905: 0xD3B0, + 24434 - 11905: 0x8FAF, + 24435 - 11905: 0xE1DC, + 24436 - 11905: 0x8FB0, + 24437 - 11905: 0x8FB1, + 24438 - 11905: 0x8FB2, + 24439 - 11905: 0xE1DD, + 24440 - 11905: 0x8FB3, + 24441 - 11905: 0xD2DB, + 24442 - 11905: 0x8FB4, + 24443 - 11905: 0xB3B9, + 24444 - 11905: 0xB1CB, + 24445 - 11905: 0x8FB5, + 24446 - 11905: 0x8FB6, + 24447 - 11905: 0x8FB7, + 24448 - 11905: 0xCDF9, + 24449 - 11905: 0xD5F7, + 24450 - 11905: 0xE1DE, + 24451 - 11905: 0x8FB8, + 24452 - 11905: 0xBEB6, + 24453 - 11905: 0xB4FD, + 24454 - 11905: 0x8FB9, + 24455 - 11905: 0xE1DF, + 24456 - 11905: 0xBADC, + 24457 - 11905: 0xE1E0, + 24458 - 11905: 0xBBB2, + 24459 - 11905: 0xC2C9, + 24460 - 11905: 0xE1E1, + 24461 - 11905: 0x8FBA, + 24462 - 11905: 0x8FBB, + 24463 - 11905: 0x8FBC, + 24464 - 11905: 0xD0EC, + 24465 - 11905: 0x8FBD, + 24466 - 11905: 0xCDBD, + 24467 - 11905: 0x8FBE, + 24468 - 11905: 0x8FBF, + 24469 - 11905: 0xE1E2, + 24470 - 11905: 0x8FC0, + 24471 - 11905: 0xB5C3, + 24472 - 11905: 0xC5C7, + 24473 - 11905: 0xE1E3, + 24474 - 11905: 0x8FC1, + 24475 - 11905: 0x8FC2, + 24476 - 11905: 0xE1E4, + 24477 - 11905: 0x8FC3, + 24478 - 11905: 0x8FC4, + 24479 - 11905: 0x8FC5, + 24480 - 11905: 0x8FC6, + 24481 - 11905: 0xD3F9, + 24482 - 11905: 0x8FC7, + 24483 - 11905: 0x8FC8, + 24484 - 11905: 0x8FC9, + 24485 - 11905: 0x8FCA, + 24486 - 11905: 0x8FCB, + 24487 - 11905: 0x8FCC, + 24488 - 11905: 0xE1E5, + 24489 - 11905: 0x8FCD, + 24490 - 11905: 0xD1AD, + 24491 - 11905: 0x8FCE, + 24492 - 11905: 0x8FCF, + 24493 - 11905: 0xE1E6, + 24494 - 11905: 0xCEA2, + 24495 - 11905: 0x8FD0, + 24496 - 11905: 0x8FD1, + 24497 - 11905: 0x8FD2, + 24498 - 11905: 0x8FD3, + 24499 - 11905: 0x8FD4, + 24500 - 11905: 0x8FD5, + 24501 - 11905: 0xE1E7, + 24502 - 11905: 0x8FD6, + 24503 - 11905: 0xB5C2, + 24504 - 11905: 0x8FD7, + 24505 - 11905: 0x8FD8, + 24506 - 11905: 0x8FD9, + 24507 - 11905: 0x8FDA, + 24508 - 11905: 0xE1E8, + 24509 - 11905: 0xBBD5, + 24510 - 11905: 0x8FDB, + 24511 - 11905: 0x8FDC, + 24512 - 11905: 0x8FDD, + 24513 - 11905: 0x8FDE, + 24514 - 11905: 0x8FDF, + 24515 - 11905: 0xD0C4, + 24516 - 11905: 0xE2E0, + 24517 - 11905: 0xB1D8, + 24518 - 11905: 0xD2E4, + 24519 - 11905: 0x8FE0, + 24520 - 11905: 0x8FE1, + 24521 - 11905: 0xE2E1, + 24522 - 11905: 0x8FE2, + 24523 - 11905: 0x8FE3, + 24524 - 11905: 0xBCC9, + 24525 - 11905: 0xC8CC, + 24526 - 11905: 0x8FE4, + 24527 - 11905: 0xE2E3, + 24528 - 11905: 0xECFE, + 24529 - 11905: 0xECFD, + 24530 - 11905: 0xDFAF, + 24531 - 11905: 0x8FE5, + 24532 - 11905: 0x8FE6, + 24533 - 11905: 0x8FE7, + 24534 - 11905: 0xE2E2, + 24535 - 11905: 0xD6BE, + 24536 - 11905: 0xCDFC, + 24537 - 11905: 0xC3A6, + 24538 - 11905: 0x8FE8, + 24539 - 11905: 0x8FE9, + 24540 - 11905: 0x8FEA, + 24541 - 11905: 0xE3C3, + 24542 - 11905: 0x8FEB, + 24543 - 11905: 0x8FEC, + 24544 - 11905: 0xD6D2, + 24545 - 11905: 0xE2E7, + 24546 - 11905: 0x8FED, + 24547 - 11905: 0x8FEE, + 24548 - 11905: 0xE2E8, + 24549 - 11905: 0x8FEF, + 24550 - 11905: 0x8FF0, + 24551 - 11905: 0xD3C7, + 24552 - 11905: 0x8FF1, + 24553 - 11905: 0x8FF2, + 24554 - 11905: 0xE2EC, + 24555 - 11905: 0xBFEC, + 24556 - 11905: 0x8FF3, + 24557 - 11905: 0xE2ED, + 24558 - 11905: 0xE2E5, + 24559 - 11905: 0x8FF4, + 24560 - 11905: 0x8FF5, + 24561 - 11905: 0xB3C0, + 24562 - 11905: 0x8FF6, + 24563 - 11905: 0x8FF7, + 24564 - 11905: 0x8FF8, + 24565 - 11905: 0xC4EE, + 24566 - 11905: 0x8FF9, + 24567 - 11905: 0x8FFA, + 24568 - 11905: 0xE2EE, + 24569 - 11905: 0x8FFB, + 24570 - 11905: 0x8FFC, + 24571 - 11905: 0xD0C3, + 24572 - 11905: 0x8FFD, + 24573 - 11905: 0xBAF6, + 24574 - 11905: 0xE2E9, + 24575 - 11905: 0xB7DE, + 24576 - 11905: 0xBBB3, + 24577 - 11905: 0xCCAC, + 24578 - 11905: 0xCBCB, + 24579 - 11905: 0xE2E4, + 24580 - 11905: 0xE2E6, + 24581 - 11905: 0xE2EA, + 24582 - 11905: 0xE2EB, + 24583 - 11905: 0x8FFE, + 24584 - 11905: 0x9040, + 24585 - 11905: 0x9041, + 24586 - 11905: 0xE2F7, + 24587 - 11905: 0x9042, + 24588 - 11905: 0x9043, + 24589 - 11905: 0xE2F4, + 24590 - 11905: 0xD4F5, + 24591 - 11905: 0xE2F3, + 24592 - 11905: 0x9044, + 24593 - 11905: 0x9045, + 24594 - 11905: 0xC5AD, + 24595 - 11905: 0x9046, + 24596 - 11905: 0xD5FA, + 24597 - 11905: 0xC5C2, + 24598 - 11905: 0xB2C0, + 24599 - 11905: 0x9047, + 24600 - 11905: 0x9048, + 24601 - 11905: 0xE2EF, + 24602 - 11905: 0x9049, + 24603 - 11905: 0xE2F2, + 24604 - 11905: 0xC1AF, + 24605 - 11905: 0xCBBC, + 24606 - 11905: 0x904A, + 24607 - 11905: 0x904B, + 24608 - 11905: 0xB5A1, + 24609 - 11905: 0xE2F9, + 24610 - 11905: 0x904C, + 24611 - 11905: 0x904D, + 24612 - 11905: 0x904E, + 24613 - 11905: 0xBCB1, + 24614 - 11905: 0xE2F1, + 24615 - 11905: 0xD0D4, + 24616 - 11905: 0xD4B9, + 24617 - 11905: 0xE2F5, + 24618 - 11905: 0xB9D6, + 24619 - 11905: 0xE2F6, + 24620 - 11905: 0x904F, + 24621 - 11905: 0x9050, + 24622 - 11905: 0x9051, + 24623 - 11905: 0xC7D3, + 24624 - 11905: 0x9052, + 24625 - 11905: 0x9053, + 24626 - 11905: 0x9054, + 24627 - 11905: 0x9055, + 24628 - 11905: 0x9056, + 24629 - 11905: 0xE2F0, + 24630 - 11905: 0x9057, + 24631 - 11905: 0x9058, + 24632 - 11905: 0x9059, + 24633 - 11905: 0x905A, + 24634 - 11905: 0x905B, + 24635 - 11905: 0xD7DC, + 24636 - 11905: 0xEDA1, + 24637 - 11905: 0x905C, + 24638 - 11905: 0x905D, + 24639 - 11905: 0xE2F8, + 24640 - 11905: 0x905E, + 24641 - 11905: 0xEDA5, + 24642 - 11905: 0xE2FE, + 24643 - 11905: 0xCAD1, + 24644 - 11905: 0x905F, + 24645 - 11905: 0x9060, + 24646 - 11905: 0x9061, + 24647 - 11905: 0x9062, + 24648 - 11905: 0x9063, + 24649 - 11905: 0x9064, + 24650 - 11905: 0x9065, + 24651 - 11905: 0xC1B5, + 24652 - 11905: 0x9066, + 24653 - 11905: 0xBBD0, + 24654 - 11905: 0x9067, + 24655 - 11905: 0x9068, + 24656 - 11905: 0xBFD6, + 24657 - 11905: 0x9069, + 24658 - 11905: 0xBAE3, + 24659 - 11905: 0x906A, + 24660 - 11905: 0x906B, + 24661 - 11905: 0xCBA1, + 24662 - 11905: 0x906C, + 24663 - 11905: 0x906D, + 24664 - 11905: 0x906E, + 24665 - 11905: 0xEDA6, + 24666 - 11905: 0xEDA3, + 24667 - 11905: 0x906F, + 24668 - 11905: 0x9070, + 24669 - 11905: 0xEDA2, + 24670 - 11905: 0x9071, + 24671 - 11905: 0x9072, + 24672 - 11905: 0x9073, + 24673 - 11905: 0x9074, + 24674 - 11905: 0xBBD6, + 24675 - 11905: 0xEDA7, + 24676 - 11905: 0xD0F4, + 24677 - 11905: 0x9075, + 24678 - 11905: 0x9076, + 24679 - 11905: 0xEDA4, + 24680 - 11905: 0xBADE, + 24681 - 11905: 0xB6F7, + 24682 - 11905: 0xE3A1, + 24683 - 11905: 0xB6B2, + 24684 - 11905: 0xCCF1, + 24685 - 11905: 0xB9A7, + 24686 - 11905: 0x9077, + 24687 - 11905: 0xCFA2, + 24688 - 11905: 0xC7A1, + 24689 - 11905: 0x9078, + 24690 - 11905: 0x9079, + 24691 - 11905: 0xBFD2, + 24692 - 11905: 0x907A, + 24693 - 11905: 0x907B, + 24694 - 11905: 0xB6F1, + 24695 - 11905: 0x907C, + 24696 - 11905: 0xE2FA, + 24697 - 11905: 0xE2FB, + 24698 - 11905: 0xE2FD, + 24699 - 11905: 0xE2FC, + 24700 - 11905: 0xC4D5, + 24701 - 11905: 0xE3A2, + 24702 - 11905: 0x907D, + 24703 - 11905: 0xD3C1, + 24704 - 11905: 0x907E, + 24705 - 11905: 0x9080, + 24706 - 11905: 0x9081, + 24707 - 11905: 0xE3A7, + 24708 - 11905: 0xC7C4, + 24709 - 11905: 0x9082, + 24710 - 11905: 0x9083, + 24711 - 11905: 0x9084, + 24712 - 11905: 0x9085, + 24713 - 11905: 0xCFA4, + 24714 - 11905: 0x9086, + 24715 - 11905: 0x9087, + 24716 - 11905: 0xE3A9, + 24717 - 11905: 0xBAB7, + 24718 - 11905: 0x9088, + 24719 - 11905: 0x9089, + 24720 - 11905: 0x908A, + 24721 - 11905: 0x908B, + 24722 - 11905: 0xE3A8, + 24723 - 11905: 0x908C, + 24724 - 11905: 0xBBDA, + 24725 - 11905: 0x908D, + 24726 - 11905: 0xE3A3, + 24727 - 11905: 0x908E, + 24728 - 11905: 0x908F, + 24729 - 11905: 0x9090, + 24730 - 11905: 0xE3A4, + 24731 - 11905: 0xE3AA, + 24732 - 11905: 0x9091, + 24733 - 11905: 0xE3A6, + 24734 - 11905: 0x9092, + 24735 - 11905: 0xCEF2, + 24736 - 11905: 0xD3C6, + 24737 - 11905: 0x9093, + 24738 - 11905: 0x9094, + 24739 - 11905: 0xBBBC, + 24740 - 11905: 0x9095, + 24741 - 11905: 0x9096, + 24742 - 11905: 0xD4C3, + 24743 - 11905: 0x9097, + 24744 - 11905: 0xC4FA, + 24745 - 11905: 0x9098, + 24746 - 11905: 0x9099, + 24747 - 11905: 0xEDA8, + 24748 - 11905: 0xD0FC, + 24749 - 11905: 0xE3A5, + 24750 - 11905: 0x909A, + 24751 - 11905: 0xC3F5, + 24752 - 11905: 0x909B, + 24753 - 11905: 0xE3AD, + 24754 - 11905: 0xB1AF, + 24755 - 11905: 0x909C, + 24756 - 11905: 0xE3B2, + 24757 - 11905: 0x909D, + 24758 - 11905: 0x909E, + 24759 - 11905: 0x909F, + 24760 - 11905: 0xBCC2, + 24761 - 11905: 0x90A0, + 24762 - 11905: 0x90A1, + 24763 - 11905: 0xE3AC, + 24764 - 11905: 0xB5BF, + 24765 - 11905: 0x90A2, + 24766 - 11905: 0x90A3, + 24767 - 11905: 0x90A4, + 24768 - 11905: 0x90A5, + 24769 - 11905: 0x90A6, + 24770 - 11905: 0x90A7, + 24771 - 11905: 0x90A8, + 24772 - 11905: 0x90A9, + 24773 - 11905: 0xC7E9, + 24774 - 11905: 0xE3B0, + 24775 - 11905: 0x90AA, + 24776 - 11905: 0x90AB, + 24777 - 11905: 0x90AC, + 24778 - 11905: 0xBEAA, + 24779 - 11905: 0xCDEF, + 24780 - 11905: 0x90AD, + 24781 - 11905: 0x90AE, + 24782 - 11905: 0x90AF, + 24783 - 11905: 0x90B0, + 24784 - 11905: 0x90B1, + 24785 - 11905: 0xBBF3, + 24786 - 11905: 0x90B2, + 24787 - 11905: 0x90B3, + 24788 - 11905: 0x90B4, + 24789 - 11905: 0xCCE8, + 24790 - 11905: 0x90B5, + 24791 - 11905: 0x90B6, + 24792 - 11905: 0xE3AF, + 24793 - 11905: 0x90B7, + 24794 - 11905: 0xE3B1, + 24795 - 11905: 0x90B8, + 24796 - 11905: 0xCFA7, + 24797 - 11905: 0xE3AE, + 24798 - 11905: 0x90B9, + 24799 - 11905: 0xCEA9, + 24800 - 11905: 0xBBDD, + 24801 - 11905: 0x90BA, + 24802 - 11905: 0x90BB, + 24803 - 11905: 0x90BC, + 24804 - 11905: 0x90BD, + 24805 - 11905: 0x90BE, + 24806 - 11905: 0xB5EB, + 24807 - 11905: 0xBEE5, + 24808 - 11905: 0xB2D2, + 24809 - 11905: 0xB3CD, + 24810 - 11905: 0x90BF, + 24811 - 11905: 0xB1B9, + 24812 - 11905: 0xE3AB, + 24813 - 11905: 0xB2D1, + 24814 - 11905: 0xB5AC, + 24815 - 11905: 0xB9DF, + 24816 - 11905: 0xB6E8, + 24817 - 11905: 0x90C0, + 24818 - 11905: 0x90C1, + 24819 - 11905: 0xCFEB, + 24820 - 11905: 0xE3B7, + 24821 - 11905: 0x90C2, + 24822 - 11905: 0xBBCC, + 24823 - 11905: 0x90C3, + 24824 - 11905: 0x90C4, + 24825 - 11905: 0xC8C7, + 24826 - 11905: 0xD0CA, + 24827 - 11905: 0x90C5, + 24828 - 11905: 0x90C6, + 24829 - 11905: 0x90C7, + 24830 - 11905: 0x90C8, + 24831 - 11905: 0x90C9, + 24832 - 11905: 0xE3B8, + 24833 - 11905: 0xB3EE, + 24834 - 11905: 0x90CA, + 24835 - 11905: 0x90CB, + 24836 - 11905: 0x90CC, + 24837 - 11905: 0x90CD, + 24838 - 11905: 0xEDA9, + 24839 - 11905: 0x90CE, + 24840 - 11905: 0xD3FA, + 24841 - 11905: 0xD3E4, + 24842 - 11905: 0x90CF, + 24843 - 11905: 0x90D0, + 24844 - 11905: 0x90D1, + 24845 - 11905: 0xEDAA, + 24846 - 11905: 0xE3B9, + 24847 - 11905: 0xD2E2, + 24848 - 11905: 0x90D2, + 24849 - 11905: 0x90D3, + 24850 - 11905: 0x90D4, + 24851 - 11905: 0x90D5, + 24852 - 11905: 0x90D6, + 24853 - 11905: 0xE3B5, + 24854 - 11905: 0x90D7, + 24855 - 11905: 0x90D8, + 24856 - 11905: 0x90D9, + 24857 - 11905: 0x90DA, + 24858 - 11905: 0xD3DE, + 24859 - 11905: 0x90DB, + 24860 - 11905: 0x90DC, + 24861 - 11905: 0x90DD, + 24862 - 11905: 0x90DE, + 24863 - 11905: 0xB8D0, + 24864 - 11905: 0xE3B3, + 24865 - 11905: 0x90DF, + 24866 - 11905: 0x90E0, + 24867 - 11905: 0xE3B6, + 24868 - 11905: 0xB7DF, + 24869 - 11905: 0x90E1, + 24870 - 11905: 0xE3B4, + 24871 - 11905: 0xC0A2, + 24872 - 11905: 0x90E2, + 24873 - 11905: 0x90E3, + 24874 - 11905: 0x90E4, + 24875 - 11905: 0xE3BA, + 24876 - 11905: 0x90E5, + 24877 - 11905: 0x90E6, + 24878 - 11905: 0x90E7, + 24879 - 11905: 0x90E8, + 24880 - 11905: 0x90E9, + 24881 - 11905: 0x90EA, + 24882 - 11905: 0x90EB, + 24883 - 11905: 0x90EC, + 24884 - 11905: 0x90ED, + 24885 - 11905: 0x90EE, + 24886 - 11905: 0x90EF, + 24887 - 11905: 0x90F0, + 24888 - 11905: 0x90F1, + 24889 - 11905: 0x90F2, + 24890 - 11905: 0x90F3, + 24891 - 11905: 0x90F4, + 24892 - 11905: 0x90F5, + 24893 - 11905: 0x90F6, + 24894 - 11905: 0x90F7, + 24895 - 11905: 0xD4B8, + 24896 - 11905: 0x90F8, + 24897 - 11905: 0x90F9, + 24898 - 11905: 0x90FA, + 24899 - 11905: 0x90FB, + 24900 - 11905: 0x90FC, + 24901 - 11905: 0x90FD, + 24902 - 11905: 0x90FE, + 24903 - 11905: 0x9140, + 24904 - 11905: 0xB4C8, + 24905 - 11905: 0x9141, + 24906 - 11905: 0xE3BB, + 24907 - 11905: 0x9142, + 24908 - 11905: 0xBBC5, + 24909 - 11905: 0x9143, + 24910 - 11905: 0xC9F7, + 24911 - 11905: 0x9144, + 24912 - 11905: 0x9145, + 24913 - 11905: 0xC9E5, + 24914 - 11905: 0x9146, + 24915 - 11905: 0x9147, + 24916 - 11905: 0x9148, + 24917 - 11905: 0xC4BD, + 24918 - 11905: 0x9149, + 24919 - 11905: 0x914A, + 24920 - 11905: 0x914B, + 24921 - 11905: 0x914C, + 24922 - 11905: 0x914D, + 24923 - 11905: 0x914E, + 24924 - 11905: 0x914F, + 24925 - 11905: 0xEDAB, + 24926 - 11905: 0x9150, + 24927 - 11905: 0x9151, + 24928 - 11905: 0x9152, + 24929 - 11905: 0x9153, + 24930 - 11905: 0xC2FD, + 24931 - 11905: 0x9154, + 24932 - 11905: 0x9155, + 24933 - 11905: 0x9156, + 24934 - 11905: 0x9157, + 24935 - 11905: 0xBBDB, + 24936 - 11905: 0xBFAE, + 24937 - 11905: 0x9158, + 24938 - 11905: 0x9159, + 24939 - 11905: 0x915A, + 24940 - 11905: 0x915B, + 24941 - 11905: 0x915C, + 24942 - 11905: 0x915D, + 24943 - 11905: 0x915E, + 24944 - 11905: 0xCEBF, + 24945 - 11905: 0x915F, + 24946 - 11905: 0x9160, + 24947 - 11905: 0x9161, + 24948 - 11905: 0x9162, + 24949 - 11905: 0xE3BC, + 24950 - 11905: 0x9163, + 24951 - 11905: 0xBFB6, + 24952 - 11905: 0x9164, + 24953 - 11905: 0x9165, + 24954 - 11905: 0x9166, + 24955 - 11905: 0x9167, + 24956 - 11905: 0x9168, + 24957 - 11905: 0x9169, + 24958 - 11905: 0x916A, + 24959 - 11905: 0x916B, + 24960 - 11905: 0x916C, + 24961 - 11905: 0x916D, + 24962 - 11905: 0x916E, + 24963 - 11905: 0x916F, + 24964 - 11905: 0x9170, + 24965 - 11905: 0x9171, + 24966 - 11905: 0x9172, + 24967 - 11905: 0x9173, + 24968 - 11905: 0x9174, + 24969 - 11905: 0x9175, + 24970 - 11905: 0x9176, + 24971 - 11905: 0xB1EF, + 24972 - 11905: 0x9177, + 24973 - 11905: 0x9178, + 24974 - 11905: 0xD4F7, + 24975 - 11905: 0x9179, + 24976 - 11905: 0x917A, + 24977 - 11905: 0x917B, + 24978 - 11905: 0x917C, + 24979 - 11905: 0x917D, + 24980 - 11905: 0xE3BE, + 24981 - 11905: 0x917E, + 24982 - 11905: 0x9180, + 24983 - 11905: 0x9181, + 24984 - 11905: 0x9182, + 24985 - 11905: 0x9183, + 24986 - 11905: 0x9184, + 24987 - 11905: 0x9185, + 24988 - 11905: 0x9186, + 24989 - 11905: 0xEDAD, + 24990 - 11905: 0x9187, + 24991 - 11905: 0x9188, + 24992 - 11905: 0x9189, + 24993 - 11905: 0x918A, + 24994 - 11905: 0x918B, + 24995 - 11905: 0x918C, + 24996 - 11905: 0x918D, + 24997 - 11905: 0x918E, + 24998 - 11905: 0x918F, + 24999 - 11905: 0xE3BF, + 25000 - 11905: 0xBAA9, + 25001 - 11905: 0xEDAC, + 25002 - 11905: 0x9190, + 25003 - 11905: 0x9191, + 25004 - 11905: 0xE3BD, + 25005 - 11905: 0x9192, + 25006 - 11905: 0x9193, + 25007 - 11905: 0x9194, + 25008 - 11905: 0x9195, + 25009 - 11905: 0x9196, + 25010 - 11905: 0x9197, + 25011 - 11905: 0x9198, + 25012 - 11905: 0x9199, + 25013 - 11905: 0x919A, + 25014 - 11905: 0x919B, + 25015 - 11905: 0xE3C0, + 25016 - 11905: 0x919C, + 25017 - 11905: 0x919D, + 25018 - 11905: 0x919E, + 25019 - 11905: 0x919F, + 25020 - 11905: 0x91A0, + 25021 - 11905: 0x91A1, + 25022 - 11905: 0xBAB6, + 25023 - 11905: 0x91A2, + 25024 - 11905: 0x91A3, + 25025 - 11905: 0x91A4, + 25026 - 11905: 0xB6AE, + 25027 - 11905: 0x91A5, + 25028 - 11905: 0x91A6, + 25029 - 11905: 0x91A7, + 25030 - 11905: 0x91A8, + 25031 - 11905: 0x91A9, + 25032 - 11905: 0xD0B8, + 25033 - 11905: 0x91AA, + 25034 - 11905: 0xB0C3, + 25035 - 11905: 0xEDAE, + 25036 - 11905: 0x91AB, + 25037 - 11905: 0x91AC, + 25038 - 11905: 0x91AD, + 25039 - 11905: 0x91AE, + 25040 - 11905: 0x91AF, + 25041 - 11905: 0xEDAF, + 25042 - 11905: 0xC0C1, + 25043 - 11905: 0x91B0, + 25044 - 11905: 0xE3C1, + 25045 - 11905: 0x91B1, + 25046 - 11905: 0x91B2, + 25047 - 11905: 0x91B3, + 25048 - 11905: 0x91B4, + 25049 - 11905: 0x91B5, + 25050 - 11905: 0x91B6, + 25051 - 11905: 0x91B7, + 25052 - 11905: 0x91B8, + 25053 - 11905: 0x91B9, + 25054 - 11905: 0x91BA, + 25055 - 11905: 0x91BB, + 25056 - 11905: 0x91BC, + 25057 - 11905: 0x91BD, + 25058 - 11905: 0x91BE, + 25059 - 11905: 0x91BF, + 25060 - 11905: 0x91C0, + 25061 - 11905: 0x91C1, + 25062 - 11905: 0xC5B3, + 25063 - 11905: 0x91C2, + 25064 - 11905: 0x91C3, + 25065 - 11905: 0x91C4, + 25066 - 11905: 0x91C5, + 25067 - 11905: 0x91C6, + 25068 - 11905: 0x91C7, + 25069 - 11905: 0x91C8, + 25070 - 11905: 0x91C9, + 25071 - 11905: 0x91CA, + 25072 - 11905: 0x91CB, + 25073 - 11905: 0x91CC, + 25074 - 11905: 0x91CD, + 25075 - 11905: 0x91CE, + 25076 - 11905: 0x91CF, + 25077 - 11905: 0xE3C2, + 25078 - 11905: 0x91D0, + 25079 - 11905: 0x91D1, + 25080 - 11905: 0x91D2, + 25081 - 11905: 0x91D3, + 25082 - 11905: 0x91D4, + 25083 - 11905: 0x91D5, + 25084 - 11905: 0x91D6, + 25085 - 11905: 0x91D7, + 25086 - 11905: 0x91D8, + 25087 - 11905: 0xDCB2, + 25088 - 11905: 0x91D9, + 25089 - 11905: 0x91DA, + 25090 - 11905: 0x91DB, + 25091 - 11905: 0x91DC, + 25092 - 11905: 0x91DD, + 25093 - 11905: 0x91DE, + 25094 - 11905: 0xEDB0, + 25095 - 11905: 0x91DF, + 25096 - 11905: 0xB8EA, + 25097 - 11905: 0x91E0, + 25098 - 11905: 0xCEEC, + 25099 - 11905: 0xEAA7, + 25100 - 11905: 0xD0E7, + 25101 - 11905: 0xCAF9, + 25102 - 11905: 0xC8D6, + 25103 - 11905: 0xCFB7, + 25104 - 11905: 0xB3C9, + 25105 - 11905: 0xCED2, + 25106 - 11905: 0xBDE4, + 25107 - 11905: 0x91E1, + 25108 - 11905: 0x91E2, + 25109 - 11905: 0xE3DE, + 25110 - 11905: 0xBBF2, + 25111 - 11905: 0xEAA8, + 25112 - 11905: 0xD5BD, + 25113 - 11905: 0x91E3, + 25114 - 11905: 0xC6DD, + 25115 - 11905: 0xEAA9, + 25116 - 11905: 0x91E4, + 25117 - 11905: 0x91E5, + 25118 - 11905: 0x91E6, + 25119 - 11905: 0xEAAA, + 25120 - 11905: 0x91E7, + 25121 - 11905: 0xEAAC, + 25122 - 11905: 0xEAAB, + 25123 - 11905: 0x91E8, + 25124 - 11905: 0xEAAE, + 25125 - 11905: 0xEAAD, + 25126 - 11905: 0x91E9, + 25127 - 11905: 0x91EA, + 25128 - 11905: 0x91EB, + 25129 - 11905: 0x91EC, + 25130 - 11905: 0xBDD8, + 25131 - 11905: 0x91ED, + 25132 - 11905: 0xEAAF, + 25133 - 11905: 0x91EE, + 25134 - 11905: 0xC2BE, + 25135 - 11905: 0x91EF, + 25136 - 11905: 0x91F0, + 25137 - 11905: 0x91F1, + 25138 - 11905: 0x91F2, + 25139 - 11905: 0xB4C1, + 25140 - 11905: 0xB4F7, + 25141 - 11905: 0x91F3, + 25142 - 11905: 0x91F4, + 25143 - 11905: 0xBBA7, + 25144 - 11905: 0x91F5, + 25145 - 11905: 0x91F6, + 25146 - 11905: 0x91F7, + 25147 - 11905: 0x91F8, + 25148 - 11905: 0x91F9, + 25149 - 11905: 0xECE6, + 25150 - 11905: 0xECE5, + 25151 - 11905: 0xB7BF, + 25152 - 11905: 0xCBF9, + 25153 - 11905: 0xB1E2, + 25154 - 11905: 0x91FA, + 25155 - 11905: 0xECE7, + 25156 - 11905: 0x91FB, + 25157 - 11905: 0x91FC, + 25158 - 11905: 0x91FD, + 25159 - 11905: 0xC9C8, + 25160 - 11905: 0xECE8, + 25161 - 11905: 0xECE9, + 25162 - 11905: 0x91FE, + 25163 - 11905: 0xCAD6, + 25164 - 11905: 0xDED0, + 25165 - 11905: 0xB2C5, + 25166 - 11905: 0xD4FA, + 25167 - 11905: 0x9240, + 25168 - 11905: 0x9241, + 25169 - 11905: 0xC6CB, + 25170 - 11905: 0xB0C7, + 25171 - 11905: 0xB4F2, + 25172 - 11905: 0xC8D3, + 25173 - 11905: 0x9242, + 25174 - 11905: 0x9243, + 25175 - 11905: 0x9244, + 25176 - 11905: 0xCDD0, + 25177 - 11905: 0x9245, + 25178 - 11905: 0x9246, + 25179 - 11905: 0xBFB8, + 25180 - 11905: 0x9247, + 25181 - 11905: 0x9248, + 25182 - 11905: 0x9249, + 25183 - 11905: 0x924A, + 25184 - 11905: 0x924B, + 25185 - 11905: 0x924C, + 25186 - 11905: 0x924D, + 25187 - 11905: 0xBFDB, + 25188 - 11905: 0x924E, + 25189 - 11905: 0x924F, + 25190 - 11905: 0xC7A4, + 25191 - 11905: 0xD6B4, + 25192 - 11905: 0x9250, + 25193 - 11905: 0xC0A9, + 25194 - 11905: 0xDED1, + 25195 - 11905: 0xC9A8, + 25196 - 11905: 0xD1EF, + 25197 - 11905: 0xC5A4, + 25198 - 11905: 0xB0E7, + 25199 - 11905: 0xB3B6, + 25200 - 11905: 0xC8C5, + 25201 - 11905: 0x9251, + 25202 - 11905: 0x9252, + 25203 - 11905: 0xB0E2, + 25204 - 11905: 0x9253, + 25205 - 11905: 0x9254, + 25206 - 11905: 0xB7F6, + 25207 - 11905: 0x9255, + 25208 - 11905: 0x9256, + 25209 - 11905: 0xC5FA, + 25210 - 11905: 0x9257, + 25211 - 11905: 0x9258, + 25212 - 11905: 0xB6F3, + 25213 - 11905: 0x9259, + 25214 - 11905: 0xD5D2, + 25215 - 11905: 0xB3D0, + 25216 - 11905: 0xBCBC, + 25217 - 11905: 0x925A, + 25218 - 11905: 0x925B, + 25219 - 11905: 0x925C, + 25220 - 11905: 0xB3AD, + 25221 - 11905: 0x925D, + 25222 - 11905: 0x925E, + 25223 - 11905: 0x925F, + 25224 - 11905: 0x9260, + 25225 - 11905: 0xBEF1, + 25226 - 11905: 0xB0D1, + 25227 - 11905: 0x9261, + 25228 - 11905: 0x9262, + 25229 - 11905: 0x9263, + 25230 - 11905: 0x9264, + 25231 - 11905: 0x9265, + 25232 - 11905: 0x9266, + 25233 - 11905: 0xD2D6, + 25234 - 11905: 0xCAE3, + 25235 - 11905: 0xD7A5, + 25236 - 11905: 0x9267, + 25237 - 11905: 0xCDB6, + 25238 - 11905: 0xB6B6, + 25239 - 11905: 0xBFB9, + 25240 - 11905: 0xD5DB, + 25241 - 11905: 0x9268, + 25242 - 11905: 0xB8A7, + 25243 - 11905: 0xC5D7, + 25244 - 11905: 0x9269, + 25245 - 11905: 0x926A, + 25246 - 11905: 0x926B, + 25247 - 11905: 0xDED2, + 25248 - 11905: 0xBFD9, + 25249 - 11905: 0xC2D5, + 25250 - 11905: 0xC7C0, + 25251 - 11905: 0x926C, + 25252 - 11905: 0xBBA4, + 25253 - 11905: 0xB1A8, + 25254 - 11905: 0x926D, + 25255 - 11905: 0x926E, + 25256 - 11905: 0xC5EA, + 25257 - 11905: 0x926F, + 25258 - 11905: 0x9270, + 25259 - 11905: 0xC5FB, + 25260 - 11905: 0xCCA7, + 25261 - 11905: 0x9271, + 25262 - 11905: 0x9272, + 25263 - 11905: 0x9273, + 25264 - 11905: 0x9274, + 25265 - 11905: 0xB1A7, + 25266 - 11905: 0x9275, + 25267 - 11905: 0x9276, + 25268 - 11905: 0x9277, + 25269 - 11905: 0xB5D6, + 25270 - 11905: 0x9278, + 25271 - 11905: 0x9279, + 25272 - 11905: 0x927A, + 25273 - 11905: 0xC4A8, + 25274 - 11905: 0x927B, + 25275 - 11905: 0xDED3, + 25276 - 11905: 0xD1BA, + 25277 - 11905: 0xB3E9, + 25278 - 11905: 0x927C, + 25279 - 11905: 0xC3F2, + 25280 - 11905: 0x927D, + 25281 - 11905: 0x927E, + 25282 - 11905: 0xB7F7, + 25283 - 11905: 0x9280, + 25284 - 11905: 0xD6F4, + 25285 - 11905: 0xB5A3, + 25286 - 11905: 0xB2F0, + 25287 - 11905: 0xC4B4, + 25288 - 11905: 0xC4E9, + 25289 - 11905: 0xC0AD, + 25290 - 11905: 0xDED4, + 25291 - 11905: 0x9281, + 25292 - 11905: 0xB0E8, + 25293 - 11905: 0xC5C4, + 25294 - 11905: 0xC1E0, + 25295 - 11905: 0x9282, + 25296 - 11905: 0xB9D5, + 25297 - 11905: 0x9283, + 25298 - 11905: 0xBEDC, + 25299 - 11905: 0xCDD8, + 25300 - 11905: 0xB0CE, + 25301 - 11905: 0x9284, + 25302 - 11905: 0xCDCF, + 25303 - 11905: 0xDED6, + 25304 - 11905: 0xBED0, + 25305 - 11905: 0xD7BE, + 25306 - 11905: 0xDED5, + 25307 - 11905: 0xD5D0, + 25308 - 11905: 0xB0DD, + 25309 - 11905: 0x9285, + 25310 - 11905: 0x9286, + 25311 - 11905: 0xC4E2, + 25312 - 11905: 0x9287, + 25313 - 11905: 0x9288, + 25314 - 11905: 0xC2A3, + 25315 - 11905: 0xBCF0, + 25316 - 11905: 0x9289, + 25317 - 11905: 0xD3B5, + 25318 - 11905: 0xC0B9, + 25319 - 11905: 0xC5A1, + 25320 - 11905: 0xB2A6, + 25321 - 11905: 0xD4F1, + 25322 - 11905: 0x928A, + 25323 - 11905: 0x928B, + 25324 - 11905: 0xC0A8, + 25325 - 11905: 0xCAC3, + 25326 - 11905: 0xDED7, + 25327 - 11905: 0xD5FC, + 25328 - 11905: 0x928C, + 25329 - 11905: 0xB9B0, + 25330 - 11905: 0x928D, + 25331 - 11905: 0xC8AD, + 25332 - 11905: 0xCBA9, + 25333 - 11905: 0x928E, + 25334 - 11905: 0xDED9, + 25335 - 11905: 0xBFBD, + 25336 - 11905: 0x928F, + 25337 - 11905: 0x9290, + 25338 - 11905: 0x9291, + 25339 - 11905: 0x9292, + 25340 - 11905: 0xC6B4, + 25341 - 11905: 0xD7A7, + 25342 - 11905: 0xCAB0, + 25343 - 11905: 0xC4C3, + 25344 - 11905: 0x9293, + 25345 - 11905: 0xB3D6, + 25346 - 11905: 0xB9D2, + 25347 - 11905: 0x9294, + 25348 - 11905: 0x9295, + 25349 - 11905: 0x9296, + 25350 - 11905: 0x9297, + 25351 - 11905: 0xD6B8, + 25352 - 11905: 0xEAFC, + 25353 - 11905: 0xB0B4, + 25354 - 11905: 0x9298, + 25355 - 11905: 0x9299, + 25356 - 11905: 0x929A, + 25357 - 11905: 0x929B, + 25358 - 11905: 0xBFE6, + 25359 - 11905: 0x929C, + 25360 - 11905: 0x929D, + 25361 - 11905: 0xCCF4, + 25362 - 11905: 0x929E, + 25363 - 11905: 0x929F, + 25364 - 11905: 0x92A0, + 25365 - 11905: 0x92A1, + 25366 - 11905: 0xCDDA, + 25367 - 11905: 0x92A2, + 25368 - 11905: 0x92A3, + 25369 - 11905: 0x92A4, + 25370 - 11905: 0xD6BF, + 25371 - 11905: 0xC2CE, + 25372 - 11905: 0x92A5, + 25373 - 11905: 0xCECE, + 25374 - 11905: 0xCCA2, + 25375 - 11905: 0xD0AE, + 25376 - 11905: 0xC4D3, + 25377 - 11905: 0xB5B2, + 25378 - 11905: 0xDED8, + 25379 - 11905: 0xD5F5, + 25380 - 11905: 0xBCB7, + 25381 - 11905: 0xBBD3, + 25382 - 11905: 0x92A6, + 25383 - 11905: 0x92A7, + 25384 - 11905: 0xB0A4, + 25385 - 11905: 0x92A8, + 25386 - 11905: 0xC5B2, + 25387 - 11905: 0xB4EC, + 25388 - 11905: 0x92A9, + 25389 - 11905: 0x92AA, + 25390 - 11905: 0x92AB, + 25391 - 11905: 0xD5F1, + 25392 - 11905: 0x92AC, + 25393 - 11905: 0x92AD, + 25394 - 11905: 0xEAFD, + 25395 - 11905: 0x92AE, + 25396 - 11905: 0x92AF, + 25397 - 11905: 0x92B0, + 25398 - 11905: 0x92B1, + 25399 - 11905: 0x92B2, + 25400 - 11905: 0x92B3, + 25401 - 11905: 0xDEDA, + 25402 - 11905: 0xCDA6, + 25403 - 11905: 0x92B4, + 25404 - 11905: 0x92B5, + 25405 - 11905: 0xCDEC, + 25406 - 11905: 0x92B6, + 25407 - 11905: 0x92B7, + 25408 - 11905: 0x92B8, + 25409 - 11905: 0x92B9, + 25410 - 11905: 0xCEE6, + 25411 - 11905: 0xDEDC, + 25412 - 11905: 0x92BA, + 25413 - 11905: 0xCDB1, + 25414 - 11905: 0xC0A6, + 25415 - 11905: 0x92BB, + 25416 - 11905: 0x92BC, + 25417 - 11905: 0xD7BD, + 25418 - 11905: 0x92BD, + 25419 - 11905: 0xDEDB, + 25420 - 11905: 0xB0C6, + 25421 - 11905: 0xBAB4, + 25422 - 11905: 0xC9D3, + 25423 - 11905: 0xC4F3, + 25424 - 11905: 0xBEE8, + 25425 - 11905: 0x92BE, + 25426 - 11905: 0x92BF, + 25427 - 11905: 0x92C0, + 25428 - 11905: 0x92C1, + 25429 - 11905: 0xB2B6, + 25430 - 11905: 0x92C2, + 25431 - 11905: 0x92C3, + 25432 - 11905: 0x92C4, + 25433 - 11905: 0x92C5, + 25434 - 11905: 0x92C6, + 25435 - 11905: 0x92C7, + 25436 - 11905: 0x92C8, + 25437 - 11905: 0x92C9, + 25438 - 11905: 0xC0CC, + 25439 - 11905: 0xCBF0, + 25440 - 11905: 0x92CA, + 25441 - 11905: 0xBCF1, + 25442 - 11905: 0xBBBB, + 25443 - 11905: 0xB5B7, + 25444 - 11905: 0x92CB, + 25445 - 11905: 0x92CC, + 25446 - 11905: 0x92CD, + 25447 - 11905: 0xC5F5, + 25448 - 11905: 0x92CE, + 25449 - 11905: 0xDEE6, + 25450 - 11905: 0x92CF, + 25451 - 11905: 0x92D0, + 25452 - 11905: 0x92D1, + 25453 - 11905: 0xDEE3, + 25454 - 11905: 0xBEDD, + 25455 - 11905: 0x92D2, + 25456 - 11905: 0x92D3, + 25457 - 11905: 0xDEDF, + 25458 - 11905: 0x92D4, + 25459 - 11905: 0x92D5, + 25460 - 11905: 0x92D6, + 25461 - 11905: 0x92D7, + 25462 - 11905: 0xB4B7, + 25463 - 11905: 0xBDDD, + 25464 - 11905: 0x92D8, + 25465 - 11905: 0x92D9, + 25466 - 11905: 0xDEE0, + 25467 - 11905: 0xC4ED, + 25468 - 11905: 0x92DA, + 25469 - 11905: 0x92DB, + 25470 - 11905: 0x92DC, + 25471 - 11905: 0x92DD, + 25472 - 11905: 0xCFC6, + 25473 - 11905: 0x92DE, + 25474 - 11905: 0xB5E0, + 25475 - 11905: 0x92DF, + 25476 - 11905: 0x92E0, + 25477 - 11905: 0x92E1, + 25478 - 11905: 0x92E2, + 25479 - 11905: 0xB6DE, + 25480 - 11905: 0xCADA, + 25481 - 11905: 0xB5F4, + 25482 - 11905: 0xDEE5, + 25483 - 11905: 0x92E3, + 25484 - 11905: 0xD5C6, + 25485 - 11905: 0x92E4, + 25486 - 11905: 0xDEE1, + 25487 - 11905: 0xCCCD, + 25488 - 11905: 0xC6FE, + 25489 - 11905: 0x92E5, + 25490 - 11905: 0xC5C5, + 25491 - 11905: 0x92E6, + 25492 - 11905: 0x92E7, + 25493 - 11905: 0x92E8, + 25494 - 11905: 0xD2B4, + 25495 - 11905: 0x92E9, + 25496 - 11905: 0xBEF2, + 25497 - 11905: 0x92EA, + 25498 - 11905: 0x92EB, + 25499 - 11905: 0x92EC, + 25500 - 11905: 0x92ED, + 25501 - 11905: 0x92EE, + 25502 - 11905: 0x92EF, + 25503 - 11905: 0x92F0, + 25504 - 11905: 0xC2D3, + 25505 - 11905: 0x92F1, + 25506 - 11905: 0xCCBD, + 25507 - 11905: 0xB3B8, + 25508 - 11905: 0x92F2, + 25509 - 11905: 0xBDD3, + 25510 - 11905: 0x92F3, + 25511 - 11905: 0xBFD8, + 25512 - 11905: 0xCDC6, + 25513 - 11905: 0xD1DA, + 25514 - 11905: 0xB4EB, + 25515 - 11905: 0x92F4, + 25516 - 11905: 0xDEE4, + 25517 - 11905: 0xDEDD, + 25518 - 11905: 0xDEE7, + 25519 - 11905: 0x92F5, + 25520 - 11905: 0xEAFE, + 25521 - 11905: 0x92F6, + 25522 - 11905: 0x92F7, + 25523 - 11905: 0xC2B0, + 25524 - 11905: 0xDEE2, + 25525 - 11905: 0x92F8, + 25526 - 11905: 0x92F9, + 25527 - 11905: 0xD6C0, + 25528 - 11905: 0xB5A7, + 25529 - 11905: 0x92FA, + 25530 - 11905: 0xB2F4, + 25531 - 11905: 0x92FB, + 25532 - 11905: 0xDEE8, + 25533 - 11905: 0x92FC, + 25534 - 11905: 0xDEF2, + 25535 - 11905: 0x92FD, + 25536 - 11905: 0x92FE, + 25537 - 11905: 0x9340, + 25538 - 11905: 0x9341, + 25539 - 11905: 0x9342, + 25540 - 11905: 0xDEED, + 25541 - 11905: 0x9343, + 25542 - 11905: 0xDEF1, + 25543 - 11905: 0x9344, + 25544 - 11905: 0x9345, + 25545 - 11905: 0xC8E0, + 25546 - 11905: 0x9346, + 25547 - 11905: 0x9347, + 25548 - 11905: 0x9348, + 25549 - 11905: 0xD7E1, + 25550 - 11905: 0xDEEF, + 25551 - 11905: 0xC3E8, + 25552 - 11905: 0xCCE1, + 25553 - 11905: 0x9349, + 25554 - 11905: 0xB2E5, + 25555 - 11905: 0x934A, + 25556 - 11905: 0x934B, + 25557 - 11905: 0x934C, + 25558 - 11905: 0xD2BE, + 25559 - 11905: 0x934D, + 25560 - 11905: 0x934E, + 25561 - 11905: 0x934F, + 25562 - 11905: 0x9350, + 25563 - 11905: 0x9351, + 25564 - 11905: 0x9352, + 25565 - 11905: 0x9353, + 25566 - 11905: 0xDEEE, + 25567 - 11905: 0x9354, + 25568 - 11905: 0xDEEB, + 25569 - 11905: 0xCED5, + 25570 - 11905: 0x9355, + 25571 - 11905: 0xB4A7, + 25572 - 11905: 0x9356, + 25573 - 11905: 0x9357, + 25574 - 11905: 0x9358, + 25575 - 11905: 0x9359, + 25576 - 11905: 0x935A, + 25577 - 11905: 0xBFAB, + 25578 - 11905: 0xBEBE, + 25579 - 11905: 0x935B, + 25580 - 11905: 0x935C, + 25581 - 11905: 0xBDD2, + 25582 - 11905: 0x935D, + 25583 - 11905: 0x935E, + 25584 - 11905: 0x935F, + 25585 - 11905: 0x9360, + 25586 - 11905: 0xDEE9, + 25587 - 11905: 0x9361, + 25588 - 11905: 0xD4AE, + 25589 - 11905: 0x9362, + 25590 - 11905: 0xDEDE, + 25591 - 11905: 0x9363, + 25592 - 11905: 0xDEEA, + 25593 - 11905: 0x9364, + 25594 - 11905: 0x9365, + 25595 - 11905: 0x9366, + 25596 - 11905: 0x9367, + 25597 - 11905: 0xC0BF, + 25598 - 11905: 0x9368, + 25599 - 11905: 0xDEEC, + 25600 - 11905: 0xB2F3, + 25601 - 11905: 0xB8E9, + 25602 - 11905: 0xC2A7, + 25603 - 11905: 0x9369, + 25604 - 11905: 0x936A, + 25605 - 11905: 0xBDC1, + 25606 - 11905: 0x936B, + 25607 - 11905: 0x936C, + 25608 - 11905: 0x936D, + 25609 - 11905: 0x936E, + 25610 - 11905: 0x936F, + 25611 - 11905: 0xDEF5, + 25612 - 11905: 0xDEF8, + 25613 - 11905: 0x9370, + 25614 - 11905: 0x9371, + 25615 - 11905: 0xB2AB, + 25616 - 11905: 0xB4A4, + 25617 - 11905: 0x9372, + 25618 - 11905: 0x9373, + 25619 - 11905: 0xB4EA, + 25620 - 11905: 0xC9A6, + 25621 - 11905: 0x9374, + 25622 - 11905: 0x9375, + 25623 - 11905: 0x9376, + 25624 - 11905: 0x9377, + 25625 - 11905: 0x9378, + 25626 - 11905: 0x9379, + 25627 - 11905: 0xDEF6, + 25628 - 11905: 0xCBD1, + 25629 - 11905: 0x937A, + 25630 - 11905: 0xB8E3, + 25631 - 11905: 0x937B, + 25632 - 11905: 0xDEF7, + 25633 - 11905: 0xDEFA, + 25634 - 11905: 0x937C, + 25635 - 11905: 0x937D, + 25636 - 11905: 0x937E, + 25637 - 11905: 0x9380, + 25638 - 11905: 0xDEF9, + 25639 - 11905: 0x9381, + 25640 - 11905: 0x9382, + 25641 - 11905: 0x9383, + 25642 - 11905: 0xCCC2, + 25643 - 11905: 0x9384, + 25644 - 11905: 0xB0E1, + 25645 - 11905: 0xB4EE, + 25646 - 11905: 0x9385, + 25647 - 11905: 0x9386, + 25648 - 11905: 0x9387, + 25649 - 11905: 0x9388, + 25650 - 11905: 0x9389, + 25651 - 11905: 0x938A, + 25652 - 11905: 0xE5BA, + 25653 - 11905: 0x938B, + 25654 - 11905: 0x938C, + 25655 - 11905: 0x938D, + 25656 - 11905: 0x938E, + 25657 - 11905: 0x938F, + 25658 - 11905: 0xD0AF, + 25659 - 11905: 0x9390, + 25660 - 11905: 0x9391, + 25661 - 11905: 0xB2EB, + 25662 - 11905: 0x9392, + 25663 - 11905: 0xEBA1, + 25664 - 11905: 0x9393, + 25665 - 11905: 0xDEF4, + 25666 - 11905: 0x9394, + 25667 - 11905: 0x9395, + 25668 - 11905: 0xC9E3, + 25669 - 11905: 0xDEF3, + 25670 - 11905: 0xB0DA, + 25671 - 11905: 0xD2A1, + 25672 - 11905: 0xB1F7, + 25673 - 11905: 0x9396, + 25674 - 11905: 0xCCAF, + 25675 - 11905: 0x9397, + 25676 - 11905: 0x9398, + 25677 - 11905: 0x9399, + 25678 - 11905: 0x939A, + 25679 - 11905: 0x939B, + 25680 - 11905: 0x939C, + 25681 - 11905: 0x939D, + 25682 - 11905: 0xDEF0, + 25683 - 11905: 0x939E, + 25684 - 11905: 0xCBA4, + 25685 - 11905: 0x939F, + 25686 - 11905: 0x93A0, + 25687 - 11905: 0x93A1, + 25688 - 11905: 0xD5AA, + 25689 - 11905: 0x93A2, + 25690 - 11905: 0x93A3, + 25691 - 11905: 0x93A4, + 25692 - 11905: 0x93A5, + 25693 - 11905: 0x93A6, + 25694 - 11905: 0xDEFB, + 25695 - 11905: 0x93A7, + 25696 - 11905: 0x93A8, + 25697 - 11905: 0x93A9, + 25698 - 11905: 0x93AA, + 25699 - 11905: 0x93AB, + 25700 - 11905: 0x93AC, + 25701 - 11905: 0x93AD, + 25702 - 11905: 0x93AE, + 25703 - 11905: 0xB4DD, + 25704 - 11905: 0x93AF, + 25705 - 11905: 0xC4A6, + 25706 - 11905: 0x93B0, + 25707 - 11905: 0x93B1, + 25708 - 11905: 0x93B2, + 25709 - 11905: 0xDEFD, + 25710 - 11905: 0x93B3, + 25711 - 11905: 0x93B4, + 25712 - 11905: 0x93B5, + 25713 - 11905: 0x93B6, + 25714 - 11905: 0x93B7, + 25715 - 11905: 0x93B8, + 25716 - 11905: 0x93B9, + 25717 - 11905: 0x93BA, + 25718 - 11905: 0x93BB, + 25719 - 11905: 0x93BC, + 25720 - 11905: 0xC3FE, + 25721 - 11905: 0xC4A1, + 25722 - 11905: 0xDFA1, + 25723 - 11905: 0x93BD, + 25724 - 11905: 0x93BE, + 25725 - 11905: 0x93BF, + 25726 - 11905: 0x93C0, + 25727 - 11905: 0x93C1, + 25728 - 11905: 0x93C2, + 25729 - 11905: 0x93C3, + 25730 - 11905: 0xC1CC, + 25731 - 11905: 0x93C4, + 25732 - 11905: 0xDEFC, + 25733 - 11905: 0xBEEF, + 25734 - 11905: 0x93C5, + 25735 - 11905: 0xC6B2, + 25736 - 11905: 0x93C6, + 25737 - 11905: 0x93C7, + 25738 - 11905: 0x93C8, + 25739 - 11905: 0x93C9, + 25740 - 11905: 0x93CA, + 25741 - 11905: 0x93CB, + 25742 - 11905: 0x93CC, + 25743 - 11905: 0x93CD, + 25744 - 11905: 0x93CE, + 25745 - 11905: 0xB3C5, + 25746 - 11905: 0xC8F6, + 25747 - 11905: 0x93CF, + 25748 - 11905: 0x93D0, + 25749 - 11905: 0xCBBA, + 25750 - 11905: 0xDEFE, + 25751 - 11905: 0x93D1, + 25752 - 11905: 0x93D2, + 25753 - 11905: 0xDFA4, + 25754 - 11905: 0x93D3, + 25755 - 11905: 0x93D4, + 25756 - 11905: 0x93D5, + 25757 - 11905: 0x93D6, + 25758 - 11905: 0xD7B2, + 25759 - 11905: 0x93D7, + 25760 - 11905: 0x93D8, + 25761 - 11905: 0x93D9, + 25762 - 11905: 0x93DA, + 25763 - 11905: 0x93DB, + 25764 - 11905: 0xB3B7, + 25765 - 11905: 0x93DC, + 25766 - 11905: 0x93DD, + 25767 - 11905: 0x93DE, + 25768 - 11905: 0x93DF, + 25769 - 11905: 0xC1C3, + 25770 - 11905: 0x93E0, + 25771 - 11905: 0x93E1, + 25772 - 11905: 0xC7CB, + 25773 - 11905: 0xB2A5, + 25774 - 11905: 0xB4E9, + 25775 - 11905: 0x93E2, + 25776 - 11905: 0xD7AB, + 25777 - 11905: 0x93E3, + 25778 - 11905: 0x93E4, + 25779 - 11905: 0x93E5, + 25780 - 11905: 0x93E6, + 25781 - 11905: 0xC4EC, + 25782 - 11905: 0x93E7, + 25783 - 11905: 0xDFA2, + 25784 - 11905: 0xDFA3, + 25785 - 11905: 0x93E8, + 25786 - 11905: 0xDFA5, + 25787 - 11905: 0x93E9, + 25788 - 11905: 0xBAB3, + 25789 - 11905: 0x93EA, + 25790 - 11905: 0x93EB, + 25791 - 11905: 0x93EC, + 25792 - 11905: 0xDFA6, + 25793 - 11905: 0x93ED, + 25794 - 11905: 0xC0DE, + 25795 - 11905: 0x93EE, + 25796 - 11905: 0x93EF, + 25797 - 11905: 0xC9C3, + 25798 - 11905: 0x93F0, + 25799 - 11905: 0x93F1, + 25800 - 11905: 0x93F2, + 25801 - 11905: 0x93F3, + 25802 - 11905: 0x93F4, + 25803 - 11905: 0x93F5, + 25804 - 11905: 0x93F6, + 25805 - 11905: 0xB2D9, + 25806 - 11905: 0xC7E6, + 25807 - 11905: 0x93F7, + 25808 - 11905: 0xDFA7, + 25809 - 11905: 0x93F8, + 25810 - 11905: 0xC7DC, + 25811 - 11905: 0x93F9, + 25812 - 11905: 0x93FA, + 25813 - 11905: 0x93FB, + 25814 - 11905: 0x93FC, + 25815 - 11905: 0xDFA8, + 25816 - 11905: 0xEBA2, + 25817 - 11905: 0x93FD, + 25818 - 11905: 0x93FE, + 25819 - 11905: 0x9440, + 25820 - 11905: 0x9441, + 25821 - 11905: 0x9442, + 25822 - 11905: 0xCBD3, + 25823 - 11905: 0x9443, + 25824 - 11905: 0x9444, + 25825 - 11905: 0x9445, + 25826 - 11905: 0xDFAA, + 25827 - 11905: 0x9446, + 25828 - 11905: 0xDFA9, + 25829 - 11905: 0x9447, + 25830 - 11905: 0xB2C1, + 25831 - 11905: 0x9448, + 25832 - 11905: 0x9449, + 25833 - 11905: 0x944A, + 25834 - 11905: 0x944B, + 25835 - 11905: 0x944C, + 25836 - 11905: 0x944D, + 25837 - 11905: 0x944E, + 25838 - 11905: 0x944F, + 25839 - 11905: 0x9450, + 25840 - 11905: 0x9451, + 25841 - 11905: 0x9452, + 25842 - 11905: 0x9453, + 25843 - 11905: 0x9454, + 25844 - 11905: 0x9455, + 25845 - 11905: 0x9456, + 25846 - 11905: 0x9457, + 25847 - 11905: 0x9458, + 25848 - 11905: 0x9459, + 25849 - 11905: 0x945A, + 25850 - 11905: 0x945B, + 25851 - 11905: 0x945C, + 25852 - 11905: 0x945D, + 25853 - 11905: 0x945E, + 25854 - 11905: 0x945F, + 25855 - 11905: 0x9460, + 25856 - 11905: 0xC5CA, + 25857 - 11905: 0x9461, + 25858 - 11905: 0x9462, + 25859 - 11905: 0x9463, + 25860 - 11905: 0x9464, + 25861 - 11905: 0x9465, + 25862 - 11905: 0x9466, + 25863 - 11905: 0x9467, + 25864 - 11905: 0x9468, + 25865 - 11905: 0xDFAB, + 25866 - 11905: 0x9469, + 25867 - 11905: 0x946A, + 25868 - 11905: 0x946B, + 25869 - 11905: 0x946C, + 25870 - 11905: 0x946D, + 25871 - 11905: 0x946E, + 25872 - 11905: 0x946F, + 25873 - 11905: 0x9470, + 25874 - 11905: 0xD4DC, + 25875 - 11905: 0x9471, + 25876 - 11905: 0x9472, + 25877 - 11905: 0x9473, + 25878 - 11905: 0x9474, + 25879 - 11905: 0x9475, + 25880 - 11905: 0xC8C1, + 25881 - 11905: 0x9476, + 25882 - 11905: 0x9477, + 25883 - 11905: 0x9478, + 25884 - 11905: 0x9479, + 25885 - 11905: 0x947A, + 25886 - 11905: 0x947B, + 25887 - 11905: 0x947C, + 25888 - 11905: 0x947D, + 25889 - 11905: 0x947E, + 25890 - 11905: 0x9480, + 25891 - 11905: 0x9481, + 25892 - 11905: 0x9482, + 25893 - 11905: 0xDFAC, + 25894 - 11905: 0x9483, + 25895 - 11905: 0x9484, + 25896 - 11905: 0x9485, + 25897 - 11905: 0x9486, + 25898 - 11905: 0x9487, + 25899 - 11905: 0xBEF0, + 25900 - 11905: 0x9488, + 25901 - 11905: 0x9489, + 25902 - 11905: 0xDFAD, + 25903 - 11905: 0xD6A7, + 25904 - 11905: 0x948A, + 25905 - 11905: 0x948B, + 25906 - 11905: 0x948C, + 25907 - 11905: 0x948D, + 25908 - 11905: 0xEAB7, + 25909 - 11905: 0xEBB6, + 25910 - 11905: 0xCAD5, + 25911 - 11905: 0x948E, + 25912 - 11905: 0xD8FC, + 25913 - 11905: 0xB8C4, + 25914 - 11905: 0x948F, + 25915 - 11905: 0xB9A5, + 25916 - 11905: 0x9490, + 25917 - 11905: 0x9491, + 25918 - 11905: 0xB7C5, + 25919 - 11905: 0xD5FE, + 25920 - 11905: 0x9492, + 25921 - 11905: 0x9493, + 25922 - 11905: 0x9494, + 25923 - 11905: 0x9495, + 25924 - 11905: 0x9496, + 25925 - 11905: 0xB9CA, + 25926 - 11905: 0x9497, + 25927 - 11905: 0x9498, + 25928 - 11905: 0xD0A7, + 25929 - 11905: 0xF4CD, + 25930 - 11905: 0x9499, + 25931 - 11905: 0x949A, + 25932 - 11905: 0xB5D0, + 25933 - 11905: 0x949B, + 25934 - 11905: 0x949C, + 25935 - 11905: 0xC3F4, + 25936 - 11905: 0x949D, + 25937 - 11905: 0xBEC8, + 25938 - 11905: 0x949E, + 25939 - 11905: 0x949F, + 25940 - 11905: 0x94A0, + 25941 - 11905: 0xEBB7, + 25942 - 11905: 0xB0BD, + 25943 - 11905: 0x94A1, + 25944 - 11905: 0x94A2, + 25945 - 11905: 0xBDCC, + 25946 - 11905: 0x94A3, + 25947 - 11905: 0xC1B2, + 25948 - 11905: 0x94A4, + 25949 - 11905: 0xB1D6, + 25950 - 11905: 0xB3A8, + 25951 - 11905: 0x94A5, + 25952 - 11905: 0x94A6, + 25953 - 11905: 0x94A7, + 25954 - 11905: 0xB8D2, + 25955 - 11905: 0xC9A2, + 25956 - 11905: 0x94A8, + 25957 - 11905: 0x94A9, + 25958 - 11905: 0xB6D8, + 25959 - 11905: 0x94AA, + 25960 - 11905: 0x94AB, + 25961 - 11905: 0x94AC, + 25962 - 11905: 0x94AD, + 25963 - 11905: 0xEBB8, + 25964 - 11905: 0xBEB4, + 25965 - 11905: 0x94AE, + 25966 - 11905: 0x94AF, + 25967 - 11905: 0x94B0, + 25968 - 11905: 0xCAFD, + 25969 - 11905: 0x94B1, + 25970 - 11905: 0xC7C3, + 25971 - 11905: 0x94B2, + 25972 - 11905: 0xD5FB, + 25973 - 11905: 0x94B3, + 25974 - 11905: 0x94B4, + 25975 - 11905: 0xB7F3, + 25976 - 11905: 0x94B5, + 25977 - 11905: 0x94B6, + 25978 - 11905: 0x94B7, + 25979 - 11905: 0x94B8, + 25980 - 11905: 0x94B9, + 25981 - 11905: 0x94BA, + 25982 - 11905: 0x94BB, + 25983 - 11905: 0x94BC, + 25984 - 11905: 0x94BD, + 25985 - 11905: 0x94BE, + 25986 - 11905: 0x94BF, + 25987 - 11905: 0x94C0, + 25988 - 11905: 0x94C1, + 25989 - 11905: 0x94C2, + 25990 - 11905: 0x94C3, + 25991 - 11905: 0xCEC4, + 25992 - 11905: 0x94C4, + 25993 - 11905: 0x94C5, + 25994 - 11905: 0x94C6, + 25995 - 11905: 0xD5AB, + 25996 - 11905: 0xB1F3, + 25997 - 11905: 0x94C7, + 25998 - 11905: 0x94C8, + 25999 - 11905: 0x94C9, + 26000 - 11905: 0xECB3, + 26001 - 11905: 0xB0DF, + 26002 - 11905: 0x94CA, + 26003 - 11905: 0xECB5, + 26004 - 11905: 0x94CB, + 26005 - 11905: 0x94CC, + 26006 - 11905: 0x94CD, + 26007 - 11905: 0xB6B7, + 26008 - 11905: 0x94CE, + 26009 - 11905: 0xC1CF, + 26010 - 11905: 0x94CF, + 26011 - 11905: 0xF5FA, + 26012 - 11905: 0xD0B1, + 26013 - 11905: 0x94D0, + 26014 - 11905: 0x94D1, + 26015 - 11905: 0xD5E5, + 26016 - 11905: 0x94D2, + 26017 - 11905: 0xCED3, + 26018 - 11905: 0x94D3, + 26019 - 11905: 0x94D4, + 26020 - 11905: 0xBDEF, + 26021 - 11905: 0xB3E2, + 26022 - 11905: 0x94D5, + 26023 - 11905: 0xB8AB, + 26024 - 11905: 0x94D6, + 26025 - 11905: 0xD5B6, + 26026 - 11905: 0x94D7, + 26027 - 11905: 0xEDBD, + 26028 - 11905: 0x94D8, + 26029 - 11905: 0xB6CF, + 26030 - 11905: 0x94D9, + 26031 - 11905: 0xCBB9, + 26032 - 11905: 0xD0C2, + 26033 - 11905: 0x94DA, + 26034 - 11905: 0x94DB, + 26035 - 11905: 0x94DC, + 26036 - 11905: 0x94DD, + 26037 - 11905: 0x94DE, + 26038 - 11905: 0x94DF, + 26039 - 11905: 0x94E0, + 26040 - 11905: 0x94E1, + 26041 - 11905: 0xB7BD, + 26042 - 11905: 0x94E2, + 26043 - 11905: 0x94E3, + 26044 - 11905: 0xECB6, + 26045 - 11905: 0xCAA9, + 26046 - 11905: 0x94E4, + 26047 - 11905: 0x94E5, + 26048 - 11905: 0x94E6, + 26049 - 11905: 0xC5D4, + 26050 - 11905: 0x94E7, + 26051 - 11905: 0xECB9, + 26052 - 11905: 0xECB8, + 26053 - 11905: 0xC2C3, + 26054 - 11905: 0xECB7, + 26055 - 11905: 0x94E8, + 26056 - 11905: 0x94E9, + 26057 - 11905: 0x94EA, + 26058 - 11905: 0x94EB, + 26059 - 11905: 0xD0FD, + 26060 - 11905: 0xECBA, + 26061 - 11905: 0x94EC, + 26062 - 11905: 0xECBB, + 26063 - 11905: 0xD7E5, + 26064 - 11905: 0x94ED, + 26065 - 11905: 0x94EE, + 26066 - 11905: 0xECBC, + 26067 - 11905: 0x94EF, + 26068 - 11905: 0x94F0, + 26069 - 11905: 0x94F1, + 26070 - 11905: 0xECBD, + 26071 - 11905: 0xC6EC, + 26072 - 11905: 0x94F2, + 26073 - 11905: 0x94F3, + 26074 - 11905: 0x94F4, + 26075 - 11905: 0x94F5, + 26076 - 11905: 0x94F6, + 26077 - 11905: 0x94F7, + 26078 - 11905: 0x94F8, + 26079 - 11905: 0x94F9, + 26080 - 11905: 0xCEDE, + 26081 - 11905: 0x94FA, + 26082 - 11905: 0xBCC8, + 26083 - 11905: 0x94FB, + 26084 - 11905: 0x94FC, + 26085 - 11905: 0xC8D5, + 26086 - 11905: 0xB5A9, + 26087 - 11905: 0xBEC9, + 26088 - 11905: 0xD6BC, + 26089 - 11905: 0xD4E7, + 26090 - 11905: 0x94FD, + 26091 - 11905: 0x94FE, + 26092 - 11905: 0xD1AE, + 26093 - 11905: 0xD0F1, + 26094 - 11905: 0xEAB8, + 26095 - 11905: 0xEAB9, + 26096 - 11905: 0xEABA, + 26097 - 11905: 0xBAB5, + 26098 - 11905: 0x9540, + 26099 - 11905: 0x9541, + 26100 - 11905: 0x9542, + 26101 - 11905: 0x9543, + 26102 - 11905: 0xCAB1, + 26103 - 11905: 0xBFF5, + 26104 - 11905: 0x9544, + 26105 - 11905: 0x9545, + 26106 - 11905: 0xCDFA, + 26107 - 11905: 0x9546, + 26108 - 11905: 0x9547, + 26109 - 11905: 0x9548, + 26110 - 11905: 0x9549, + 26111 - 11905: 0x954A, + 26112 - 11905: 0xEAC0, + 26113 - 11905: 0x954B, + 26114 - 11905: 0xB0BA, + 26115 - 11905: 0xEABE, + 26116 - 11905: 0x954C, + 26117 - 11905: 0x954D, + 26118 - 11905: 0xC0A5, + 26119 - 11905: 0x954E, + 26120 - 11905: 0x954F, + 26121 - 11905: 0x9550, + 26122 - 11905: 0xEABB, + 26123 - 11905: 0x9551, + 26124 - 11905: 0xB2FD, + 26125 - 11905: 0x9552, + 26126 - 11905: 0xC3F7, + 26127 - 11905: 0xBBE8, + 26128 - 11905: 0x9553, + 26129 - 11905: 0x9554, + 26130 - 11905: 0x9555, + 26131 - 11905: 0xD2D7, + 26132 - 11905: 0xCEF4, + 26133 - 11905: 0xEABF, + 26134 - 11905: 0x9556, + 26135 - 11905: 0x9557, + 26136 - 11905: 0x9558, + 26137 - 11905: 0xEABC, + 26138 - 11905: 0x9559, + 26139 - 11905: 0x955A, + 26140 - 11905: 0x955B, + 26141 - 11905: 0xEAC3, + 26142 - 11905: 0x955C, + 26143 - 11905: 0xD0C7, + 26144 - 11905: 0xD3B3, + 26145 - 11905: 0x955D, + 26146 - 11905: 0x955E, + 26147 - 11905: 0x955F, + 26148 - 11905: 0x9560, + 26149 - 11905: 0xB4BA, + 26150 - 11905: 0x9561, + 26151 - 11905: 0xC3C1, + 26152 - 11905: 0xD7F2, + 26153 - 11905: 0x9562, + 26154 - 11905: 0x9563, + 26155 - 11905: 0x9564, + 26156 - 11905: 0x9565, + 26157 - 11905: 0xD5D1, + 26158 - 11905: 0x9566, + 26159 - 11905: 0xCAC7, + 26160 - 11905: 0x9567, + 26161 - 11905: 0xEAC5, + 26162 - 11905: 0x9568, + 26163 - 11905: 0x9569, + 26164 - 11905: 0xEAC4, + 26165 - 11905: 0xEAC7, + 26166 - 11905: 0xEAC6, + 26167 - 11905: 0x956A, + 26168 - 11905: 0x956B, + 26169 - 11905: 0x956C, + 26170 - 11905: 0x956D, + 26171 - 11905: 0x956E, + 26172 - 11905: 0xD6E7, + 26173 - 11905: 0x956F, + 26174 - 11905: 0xCFD4, + 26175 - 11905: 0x9570, + 26176 - 11905: 0x9571, + 26177 - 11905: 0xEACB, + 26178 - 11905: 0x9572, + 26179 - 11905: 0xBBCE, + 26180 - 11905: 0x9573, + 26181 - 11905: 0x9574, + 26182 - 11905: 0x9575, + 26183 - 11905: 0x9576, + 26184 - 11905: 0x9577, + 26185 - 11905: 0x9578, + 26186 - 11905: 0x9579, + 26187 - 11905: 0xBDFA, + 26188 - 11905: 0xC9CE, + 26189 - 11905: 0x957A, + 26190 - 11905: 0x957B, + 26191 - 11905: 0xEACC, + 26192 - 11905: 0x957C, + 26193 - 11905: 0x957D, + 26194 - 11905: 0xC9B9, + 26195 - 11905: 0xCFFE, + 26196 - 11905: 0xEACA, + 26197 - 11905: 0xD4CE, + 26198 - 11905: 0xEACD, + 26199 - 11905: 0xEACF, + 26200 - 11905: 0x957E, + 26201 - 11905: 0x9580, + 26202 - 11905: 0xCDED, + 26203 - 11905: 0x9581, + 26204 - 11905: 0x9582, + 26205 - 11905: 0x9583, + 26206 - 11905: 0x9584, + 26207 - 11905: 0xEAC9, + 26208 - 11905: 0x9585, + 26209 - 11905: 0xEACE, + 26210 - 11905: 0x9586, + 26211 - 11905: 0x9587, + 26212 - 11905: 0xCEEE, + 26213 - 11905: 0x9588, + 26214 - 11905: 0xBBDE, + 26215 - 11905: 0x9589, + 26216 - 11905: 0xB3BF, + 26217 - 11905: 0x958A, + 26218 - 11905: 0x958B, + 26219 - 11905: 0x958C, + 26220 - 11905: 0x958D, + 26221 - 11905: 0x958E, + 26222 - 11905: 0xC6D5, + 26223 - 11905: 0xBEB0, + 26224 - 11905: 0xCEFA, + 26225 - 11905: 0x958F, + 26226 - 11905: 0x9590, + 26227 - 11905: 0x9591, + 26228 - 11905: 0xC7E7, + 26229 - 11905: 0x9592, + 26230 - 11905: 0xBEA7, + 26231 - 11905: 0xEAD0, + 26232 - 11905: 0x9593, + 26233 - 11905: 0x9594, + 26234 - 11905: 0xD6C7, + 26235 - 11905: 0x9595, + 26236 - 11905: 0x9596, + 26237 - 11905: 0x9597, + 26238 - 11905: 0xC1C0, + 26239 - 11905: 0x9598, + 26240 - 11905: 0x9599, + 26241 - 11905: 0x959A, + 26242 - 11905: 0xD4DD, + 26243 - 11905: 0x959B, + 26244 - 11905: 0xEAD1, + 26245 - 11905: 0x959C, + 26246 - 11905: 0x959D, + 26247 - 11905: 0xCFBE, + 26248 - 11905: 0x959E, + 26249 - 11905: 0x959F, + 26250 - 11905: 0x95A0, + 26251 - 11905: 0x95A1, + 26252 - 11905: 0xEAD2, + 26253 - 11905: 0x95A2, + 26254 - 11905: 0x95A3, + 26255 - 11905: 0x95A4, + 26256 - 11905: 0x95A5, + 26257 - 11905: 0xCAEE, + 26258 - 11905: 0x95A6, + 26259 - 11905: 0x95A7, + 26260 - 11905: 0x95A8, + 26261 - 11905: 0x95A9, + 26262 - 11905: 0xC5AF, + 26263 - 11905: 0xB0B5, + 26264 - 11905: 0x95AA, + 26265 - 11905: 0x95AB, + 26266 - 11905: 0x95AC, + 26267 - 11905: 0x95AD, + 26268 - 11905: 0x95AE, + 26269 - 11905: 0xEAD4, + 26270 - 11905: 0x95AF, + 26271 - 11905: 0x95B0, + 26272 - 11905: 0x95B1, + 26273 - 11905: 0x95B2, + 26274 - 11905: 0x95B3, + 26275 - 11905: 0x95B4, + 26276 - 11905: 0x95B5, + 26277 - 11905: 0x95B6, + 26278 - 11905: 0x95B7, + 26279 - 11905: 0xEAD3, + 26280 - 11905: 0xF4DF, + 26281 - 11905: 0x95B8, + 26282 - 11905: 0x95B9, + 26283 - 11905: 0x95BA, + 26284 - 11905: 0x95BB, + 26285 - 11905: 0x95BC, + 26286 - 11905: 0xC4BA, + 26287 - 11905: 0x95BD, + 26288 - 11905: 0x95BE, + 26289 - 11905: 0x95BF, + 26290 - 11905: 0x95C0, + 26291 - 11905: 0x95C1, + 26292 - 11905: 0xB1A9, + 26293 - 11905: 0x95C2, + 26294 - 11905: 0x95C3, + 26295 - 11905: 0x95C4, + 26296 - 11905: 0x95C5, + 26297 - 11905: 0xE5DF, + 26298 - 11905: 0x95C6, + 26299 - 11905: 0x95C7, + 26300 - 11905: 0x95C8, + 26301 - 11905: 0x95C9, + 26302 - 11905: 0xEAD5, + 26303 - 11905: 0x95CA, + 26304 - 11905: 0x95CB, + 26305 - 11905: 0x95CC, + 26306 - 11905: 0x95CD, + 26307 - 11905: 0x95CE, + 26308 - 11905: 0x95CF, + 26309 - 11905: 0x95D0, + 26310 - 11905: 0x95D1, + 26311 - 11905: 0x95D2, + 26312 - 11905: 0x95D3, + 26313 - 11905: 0x95D4, + 26314 - 11905: 0x95D5, + 26315 - 11905: 0x95D6, + 26316 - 11905: 0x95D7, + 26317 - 11905: 0x95D8, + 26318 - 11905: 0x95D9, + 26319 - 11905: 0x95DA, + 26320 - 11905: 0x95DB, + 26321 - 11905: 0x95DC, + 26322 - 11905: 0x95DD, + 26323 - 11905: 0x95DE, + 26324 - 11905: 0x95DF, + 26325 - 11905: 0x95E0, + 26326 - 11905: 0x95E1, + 26327 - 11905: 0x95E2, + 26328 - 11905: 0x95E3, + 26329 - 11905: 0xCAEF, + 26330 - 11905: 0x95E4, + 26331 - 11905: 0xEAD6, + 26332 - 11905: 0xEAD7, + 26333 - 11905: 0xC6D8, + 26334 - 11905: 0x95E5, + 26335 - 11905: 0x95E6, + 26336 - 11905: 0x95E7, + 26337 - 11905: 0x95E8, + 26338 - 11905: 0x95E9, + 26339 - 11905: 0x95EA, + 26340 - 11905: 0x95EB, + 26341 - 11905: 0x95EC, + 26342 - 11905: 0xEAD8, + 26343 - 11905: 0x95ED, + 26344 - 11905: 0x95EE, + 26345 - 11905: 0xEAD9, + 26346 - 11905: 0x95EF, + 26347 - 11905: 0x95F0, + 26348 - 11905: 0x95F1, + 26349 - 11905: 0x95F2, + 26350 - 11905: 0x95F3, + 26351 - 11905: 0x95F4, + 26352 - 11905: 0xD4BB, + 26353 - 11905: 0x95F5, + 26354 - 11905: 0xC7FA, + 26355 - 11905: 0xD2B7, + 26356 - 11905: 0xB8FC, + 26357 - 11905: 0x95F6, + 26358 - 11905: 0x95F7, + 26359 - 11905: 0xEAC2, + 26360 - 11905: 0x95F8, + 26361 - 11905: 0xB2DC, + 26362 - 11905: 0x95F9, + 26363 - 11905: 0x95FA, + 26364 - 11905: 0xC2FC, + 26365 - 11905: 0x95FB, + 26366 - 11905: 0xD4F8, + 26367 - 11905: 0xCCE6, + 26368 - 11905: 0xD7EE, + 26369 - 11905: 0x95FC, + 26370 - 11905: 0x95FD, + 26371 - 11905: 0x95FE, + 26372 - 11905: 0x9640, + 26373 - 11905: 0x9641, + 26374 - 11905: 0x9642, + 26375 - 11905: 0x9643, + 26376 - 11905: 0xD4C2, + 26377 - 11905: 0xD3D0, + 26378 - 11905: 0xEBC3, + 26379 - 11905: 0xC5F3, + 26380 - 11905: 0x9644, + 26381 - 11905: 0xB7FE, + 26382 - 11905: 0x9645, + 26383 - 11905: 0x9646, + 26384 - 11905: 0xEBD4, + 26385 - 11905: 0x9647, + 26386 - 11905: 0x9648, + 26387 - 11905: 0x9649, + 26388 - 11905: 0xCBB7, + 26389 - 11905: 0xEBDE, + 26390 - 11905: 0x964A, + 26391 - 11905: 0xC0CA, + 26392 - 11905: 0x964B, + 26393 - 11905: 0x964C, + 26394 - 11905: 0x964D, + 26395 - 11905: 0xCDFB, + 26396 - 11905: 0x964E, + 26397 - 11905: 0xB3AF, + 26398 - 11905: 0x964F, + 26399 - 11905: 0xC6DA, + 26400 - 11905: 0x9650, + 26401 - 11905: 0x9651, + 26402 - 11905: 0x9652, + 26403 - 11905: 0x9653, + 26404 - 11905: 0x9654, + 26405 - 11905: 0x9655, + 26406 - 11905: 0xEBFC, + 26407 - 11905: 0x9656, + 26408 - 11905: 0xC4BE, + 26409 - 11905: 0x9657, + 26410 - 11905: 0xCEB4, + 26411 - 11905: 0xC4A9, + 26412 - 11905: 0xB1BE, + 26413 - 11905: 0xD4FD, + 26414 - 11905: 0x9658, + 26415 - 11905: 0xCAF5, + 26416 - 11905: 0x9659, + 26417 - 11905: 0xD6EC, + 26418 - 11905: 0x965A, + 26419 - 11905: 0x965B, + 26420 - 11905: 0xC6D3, + 26421 - 11905: 0xB6E4, + 26422 - 11905: 0x965C, + 26423 - 11905: 0x965D, + 26424 - 11905: 0x965E, + 26425 - 11905: 0x965F, + 26426 - 11905: 0xBBFA, + 26427 - 11905: 0x9660, + 26428 - 11905: 0x9661, + 26429 - 11905: 0xD0E0, + 26430 - 11905: 0x9662, + 26431 - 11905: 0x9663, + 26432 - 11905: 0xC9B1, + 26433 - 11905: 0x9664, + 26434 - 11905: 0xD4D3, + 26435 - 11905: 0xC8A8, + 26436 - 11905: 0x9665, + 26437 - 11905: 0x9666, + 26438 - 11905: 0xB8CB, + 26439 - 11905: 0x9667, + 26440 - 11905: 0xE8BE, + 26441 - 11905: 0xC9BC, + 26442 - 11905: 0x9668, + 26443 - 11905: 0x9669, + 26444 - 11905: 0xE8BB, + 26445 - 11905: 0x966A, + 26446 - 11905: 0xC0EE, + 26447 - 11905: 0xD0D3, + 26448 - 11905: 0xB2C4, + 26449 - 11905: 0xB4E5, + 26450 - 11905: 0x966B, + 26451 - 11905: 0xE8BC, + 26452 - 11905: 0x966C, + 26453 - 11905: 0x966D, + 26454 - 11905: 0xD5C8, + 26455 - 11905: 0x966E, + 26456 - 11905: 0x966F, + 26457 - 11905: 0x9670, + 26458 - 11905: 0x9671, + 26459 - 11905: 0x9672, + 26460 - 11905: 0xB6C5, + 26461 - 11905: 0x9673, + 26462 - 11905: 0xE8BD, + 26463 - 11905: 0xCAF8, + 26464 - 11905: 0xB8DC, + 26465 - 11905: 0xCCF5, + 26466 - 11905: 0x9674, + 26467 - 11905: 0x9675, + 26468 - 11905: 0x9676, + 26469 - 11905: 0xC0B4, + 26470 - 11905: 0x9677, + 26471 - 11905: 0x9678, + 26472 - 11905: 0xD1EE, + 26473 - 11905: 0xE8BF, + 26474 - 11905: 0xE8C2, + 26475 - 11905: 0x9679, + 26476 - 11905: 0x967A, + 26477 - 11905: 0xBABC, + 26478 - 11905: 0x967B, + 26479 - 11905: 0xB1AD, + 26480 - 11905: 0xBDDC, + 26481 - 11905: 0x967C, + 26482 - 11905: 0xEABD, + 26483 - 11905: 0xE8C3, + 26484 - 11905: 0x967D, + 26485 - 11905: 0xE8C6, + 26486 - 11905: 0x967E, + 26487 - 11905: 0xE8CB, + 26488 - 11905: 0x9680, + 26489 - 11905: 0x9681, + 26490 - 11905: 0x9682, + 26491 - 11905: 0x9683, + 26492 - 11905: 0xE8CC, + 26493 - 11905: 0x9684, + 26494 - 11905: 0xCBC9, + 26495 - 11905: 0xB0E5, + 26496 - 11905: 0x9685, + 26497 - 11905: 0xBCAB, + 26498 - 11905: 0x9686, + 26499 - 11905: 0x9687, + 26500 - 11905: 0xB9B9, + 26501 - 11905: 0x9688, + 26502 - 11905: 0x9689, + 26503 - 11905: 0xE8C1, + 26504 - 11905: 0x968A, + 26505 - 11905: 0xCDF7, + 26506 - 11905: 0x968B, + 26507 - 11905: 0xE8CA, + 26508 - 11905: 0x968C, + 26509 - 11905: 0x968D, + 26510 - 11905: 0x968E, + 26511 - 11905: 0x968F, + 26512 - 11905: 0xCEF6, + 26513 - 11905: 0x9690, + 26514 - 11905: 0x9691, + 26515 - 11905: 0x9692, + 26516 - 11905: 0x9693, + 26517 - 11905: 0xD5ED, + 26518 - 11905: 0x9694, + 26519 - 11905: 0xC1D6, + 26520 - 11905: 0xE8C4, + 26521 - 11905: 0x9695, + 26522 - 11905: 0xC3B6, + 26523 - 11905: 0x9696, + 26524 - 11905: 0xB9FB, + 26525 - 11905: 0xD6A6, + 26526 - 11905: 0xE8C8, + 26527 - 11905: 0x9697, + 26528 - 11905: 0x9698, + 26529 - 11905: 0x9699, + 26530 - 11905: 0xCAE0, + 26531 - 11905: 0xD4E6, + 26532 - 11905: 0x969A, + 26533 - 11905: 0xE8C0, + 26534 - 11905: 0x969B, + 26535 - 11905: 0xE8C5, + 26536 - 11905: 0xE8C7, + 26537 - 11905: 0x969C, + 26538 - 11905: 0xC7B9, + 26539 - 11905: 0xB7E3, + 26540 - 11905: 0x969D, + 26541 - 11905: 0xE8C9, + 26542 - 11905: 0x969E, + 26543 - 11905: 0xBFDD, + 26544 - 11905: 0xE8D2, + 26545 - 11905: 0x969F, + 26546 - 11905: 0x96A0, + 26547 - 11905: 0xE8D7, + 26548 - 11905: 0x96A1, + 26549 - 11905: 0xE8D5, + 26550 - 11905: 0xBCDC, + 26551 - 11905: 0xBCCF, + 26552 - 11905: 0xE8DB, + 26553 - 11905: 0x96A2, + 26554 - 11905: 0x96A3, + 26555 - 11905: 0x96A4, + 26556 - 11905: 0x96A5, + 26557 - 11905: 0x96A6, + 26558 - 11905: 0x96A7, + 26559 - 11905: 0x96A8, + 26560 - 11905: 0x96A9, + 26561 - 11905: 0xE8DE, + 26562 - 11905: 0x96AA, + 26563 - 11905: 0xE8DA, + 26564 - 11905: 0xB1FA, + 26565 - 11905: 0x96AB, + 26566 - 11905: 0x96AC, + 26567 - 11905: 0x96AD, + 26568 - 11905: 0x96AE, + 26569 - 11905: 0x96AF, + 26570 - 11905: 0x96B0, + 26571 - 11905: 0x96B1, + 26572 - 11905: 0x96B2, + 26573 - 11905: 0x96B3, + 26574 - 11905: 0x96B4, + 26575 - 11905: 0xB0D8, + 26576 - 11905: 0xC4B3, + 26577 - 11905: 0xB8CC, + 26578 - 11905: 0xC6E2, + 26579 - 11905: 0xC8BE, + 26580 - 11905: 0xC8E1, + 26581 - 11905: 0x96B5, + 26582 - 11905: 0x96B6, + 26583 - 11905: 0x96B7, + 26584 - 11905: 0xE8CF, + 26585 - 11905: 0xE8D4, + 26586 - 11905: 0xE8D6, + 26587 - 11905: 0x96B8, + 26588 - 11905: 0xB9F1, + 26589 - 11905: 0xE8D8, + 26590 - 11905: 0xD7F5, + 26591 - 11905: 0x96B9, + 26592 - 11905: 0xC4FB, + 26593 - 11905: 0x96BA, + 26594 - 11905: 0xE8DC, + 26595 - 11905: 0x96BB, + 26596 - 11905: 0x96BC, + 26597 - 11905: 0xB2E9, + 26598 - 11905: 0x96BD, + 26599 - 11905: 0x96BE, + 26600 - 11905: 0x96BF, + 26601 - 11905: 0xE8D1, + 26602 - 11905: 0x96C0, + 26603 - 11905: 0x96C1, + 26604 - 11905: 0xBCED, + 26605 - 11905: 0x96C2, + 26606 - 11905: 0x96C3, + 26607 - 11905: 0xBFC2, + 26608 - 11905: 0xE8CD, + 26609 - 11905: 0xD6F9, + 26610 - 11905: 0x96C4, + 26611 - 11905: 0xC1F8, + 26612 - 11905: 0xB2F1, + 26613 - 11905: 0x96C5, + 26614 - 11905: 0x96C6, + 26615 - 11905: 0x96C7, + 26616 - 11905: 0x96C8, + 26617 - 11905: 0x96C9, + 26618 - 11905: 0x96CA, + 26619 - 11905: 0x96CB, + 26620 - 11905: 0x96CC, + 26621 - 11905: 0xE8DF, + 26622 - 11905: 0x96CD, + 26623 - 11905: 0xCAC1, + 26624 - 11905: 0xE8D9, + 26625 - 11905: 0x96CE, + 26626 - 11905: 0x96CF, + 26627 - 11905: 0x96D0, + 26628 - 11905: 0x96D1, + 26629 - 11905: 0xD5A4, + 26630 - 11905: 0x96D2, + 26631 - 11905: 0xB1EA, + 26632 - 11905: 0xD5BB, + 26633 - 11905: 0xE8CE, + 26634 - 11905: 0xE8D0, + 26635 - 11905: 0xB6B0, + 26636 - 11905: 0xE8D3, + 26637 - 11905: 0x96D3, + 26638 - 11905: 0xE8DD, + 26639 - 11905: 0xC0B8, + 26640 - 11905: 0x96D4, + 26641 - 11905: 0xCAF7, + 26642 - 11905: 0x96D5, + 26643 - 11905: 0xCBA8, + 26644 - 11905: 0x96D6, + 26645 - 11905: 0x96D7, + 26646 - 11905: 0xC6DC, + 26647 - 11905: 0xC0F5, + 26648 - 11905: 0x96D8, + 26649 - 11905: 0x96D9, + 26650 - 11905: 0x96DA, + 26651 - 11905: 0x96DB, + 26652 - 11905: 0x96DC, + 26653 - 11905: 0xE8E9, + 26654 - 11905: 0x96DD, + 26655 - 11905: 0x96DE, + 26656 - 11905: 0x96DF, + 26657 - 11905: 0xD0A3, + 26658 - 11905: 0x96E0, + 26659 - 11905: 0x96E1, + 26660 - 11905: 0x96E2, + 26661 - 11905: 0x96E3, + 26662 - 11905: 0x96E4, + 26663 - 11905: 0x96E5, + 26664 - 11905: 0x96E6, + 26665 - 11905: 0xE8F2, + 26666 - 11905: 0xD6EA, + 26667 - 11905: 0x96E7, + 26668 - 11905: 0x96E8, + 26669 - 11905: 0x96E9, + 26670 - 11905: 0x96EA, + 26671 - 11905: 0x96EB, + 26672 - 11905: 0x96EC, + 26673 - 11905: 0x96ED, + 26674 - 11905: 0xE8E0, + 26675 - 11905: 0xE8E1, + 26676 - 11905: 0x96EE, + 26677 - 11905: 0x96EF, + 26678 - 11905: 0x96F0, + 26679 - 11905: 0xD1F9, + 26680 - 11905: 0xBACB, + 26681 - 11905: 0xB8F9, + 26682 - 11905: 0x96F1, + 26683 - 11905: 0x96F2, + 26684 - 11905: 0xB8F1, + 26685 - 11905: 0xD4D4, + 26686 - 11905: 0xE8EF, + 26687 - 11905: 0x96F3, + 26688 - 11905: 0xE8EE, + 26689 - 11905: 0xE8EC, + 26690 - 11905: 0xB9F0, + 26691 - 11905: 0xCCD2, + 26692 - 11905: 0xE8E6, + 26693 - 11905: 0xCEA6, + 26694 - 11905: 0xBFF2, + 26695 - 11905: 0x96F4, + 26696 - 11905: 0xB0B8, + 26697 - 11905: 0xE8F1, + 26698 - 11905: 0xE8F0, + 26699 - 11905: 0x96F5, + 26700 - 11905: 0xD7C0, + 26701 - 11905: 0x96F6, + 26702 - 11905: 0xE8E4, + 26703 - 11905: 0x96F7, + 26704 - 11905: 0xCDA9, + 26705 - 11905: 0xC9A3, + 26706 - 11905: 0x96F8, + 26707 - 11905: 0xBBB8, + 26708 - 11905: 0xBDDB, + 26709 - 11905: 0xE8EA, + 26710 - 11905: 0x96F9, + 26711 - 11905: 0x96FA, + 26712 - 11905: 0x96FB, + 26713 - 11905: 0x96FC, + 26714 - 11905: 0x96FD, + 26715 - 11905: 0x96FE, + 26716 - 11905: 0x9740, + 26717 - 11905: 0x9741, + 26718 - 11905: 0x9742, + 26719 - 11905: 0x9743, + 26720 - 11905: 0xE8E2, + 26721 - 11905: 0xE8E3, + 26722 - 11905: 0xE8E5, + 26723 - 11905: 0xB5B5, + 26724 - 11905: 0xE8E7, + 26725 - 11905: 0xC7C5, + 26726 - 11905: 0xE8EB, + 26727 - 11905: 0xE8ED, + 26728 - 11905: 0xBDB0, + 26729 - 11905: 0xD7AE, + 26730 - 11905: 0x9744, + 26731 - 11905: 0xE8F8, + 26732 - 11905: 0x9745, + 26733 - 11905: 0x9746, + 26734 - 11905: 0x9747, + 26735 - 11905: 0x9748, + 26736 - 11905: 0x9749, + 26737 - 11905: 0x974A, + 26738 - 11905: 0x974B, + 26739 - 11905: 0x974C, + 26740 - 11905: 0xE8F5, + 26741 - 11905: 0x974D, + 26742 - 11905: 0xCDB0, + 26743 - 11905: 0xE8F6, + 26744 - 11905: 0x974E, + 26745 - 11905: 0x974F, + 26746 - 11905: 0x9750, + 26747 - 11905: 0x9751, + 26748 - 11905: 0x9752, + 26749 - 11905: 0x9753, + 26750 - 11905: 0x9754, + 26751 - 11905: 0x9755, + 26752 - 11905: 0x9756, + 26753 - 11905: 0xC1BA, + 26754 - 11905: 0x9757, + 26755 - 11905: 0xE8E8, + 26756 - 11905: 0x9758, + 26757 - 11905: 0xC3B7, + 26758 - 11905: 0xB0F0, + 26759 - 11905: 0x9759, + 26760 - 11905: 0x975A, + 26761 - 11905: 0x975B, + 26762 - 11905: 0x975C, + 26763 - 11905: 0x975D, + 26764 - 11905: 0x975E, + 26765 - 11905: 0x975F, + 26766 - 11905: 0x9760, + 26767 - 11905: 0xE8F4, + 26768 - 11905: 0x9761, + 26769 - 11905: 0x9762, + 26770 - 11905: 0x9763, + 26771 - 11905: 0xE8F7, + 26772 - 11905: 0x9764, + 26773 - 11905: 0x9765, + 26774 - 11905: 0x9766, + 26775 - 11905: 0xB9A3, + 26776 - 11905: 0x9767, + 26777 - 11905: 0x9768, + 26778 - 11905: 0x9769, + 26779 - 11905: 0x976A, + 26780 - 11905: 0x976B, + 26781 - 11905: 0x976C, + 26782 - 11905: 0x976D, + 26783 - 11905: 0x976E, + 26784 - 11905: 0x976F, + 26785 - 11905: 0x9770, + 26786 - 11905: 0xC9D2, + 26787 - 11905: 0x9771, + 26788 - 11905: 0x9772, + 26789 - 11905: 0x9773, + 26790 - 11905: 0xC3CE, + 26791 - 11905: 0xCEE0, + 26792 - 11905: 0xC0E6, + 26793 - 11905: 0x9774, + 26794 - 11905: 0x9775, + 26795 - 11905: 0x9776, + 26796 - 11905: 0x9777, + 26797 - 11905: 0xCBF3, + 26798 - 11905: 0x9778, + 26799 - 11905: 0xCCDD, + 26800 - 11905: 0xD0B5, + 26801 - 11905: 0x9779, + 26802 - 11905: 0x977A, + 26803 - 11905: 0xCAE1, + 26804 - 11905: 0x977B, + 26805 - 11905: 0xE8F3, + 26806 - 11905: 0x977C, + 26807 - 11905: 0x977D, + 26808 - 11905: 0x977E, + 26809 - 11905: 0x9780, + 26810 - 11905: 0x9781, + 26811 - 11905: 0x9782, + 26812 - 11905: 0x9783, + 26813 - 11905: 0x9784, + 26814 - 11905: 0x9785, + 26815 - 11905: 0x9786, + 26816 - 11905: 0xBCEC, + 26817 - 11905: 0x9787, + 26818 - 11905: 0xE8F9, + 26819 - 11905: 0x9788, + 26820 - 11905: 0x9789, + 26821 - 11905: 0x978A, + 26822 - 11905: 0x978B, + 26823 - 11905: 0x978C, + 26824 - 11905: 0x978D, + 26825 - 11905: 0xC3DE, + 26826 - 11905: 0x978E, + 26827 - 11905: 0xC6E5, + 26828 - 11905: 0x978F, + 26829 - 11905: 0xB9F7, + 26830 - 11905: 0x9790, + 26831 - 11905: 0x9791, + 26832 - 11905: 0x9792, + 26833 - 11905: 0x9793, + 26834 - 11905: 0xB0F4, + 26835 - 11905: 0x9794, + 26836 - 11905: 0x9795, + 26837 - 11905: 0xD7D8, + 26838 - 11905: 0x9796, + 26839 - 11905: 0x9797, + 26840 - 11905: 0xBCAC, + 26841 - 11905: 0x9798, + 26842 - 11905: 0xC5EF, + 26843 - 11905: 0x9799, + 26844 - 11905: 0x979A, + 26845 - 11905: 0x979B, + 26846 - 11905: 0x979C, + 26847 - 11905: 0x979D, + 26848 - 11905: 0xCCC4, + 26849 - 11905: 0x979E, + 26850 - 11905: 0x979F, + 26851 - 11905: 0xE9A6, + 26852 - 11905: 0x97A0, + 26853 - 11905: 0x97A1, + 26854 - 11905: 0x97A2, + 26855 - 11905: 0x97A3, + 26856 - 11905: 0x97A4, + 26857 - 11905: 0x97A5, + 26858 - 11905: 0x97A6, + 26859 - 11905: 0x97A7, + 26860 - 11905: 0x97A8, + 26861 - 11905: 0x97A9, + 26862 - 11905: 0xC9AD, + 26863 - 11905: 0x97AA, + 26864 - 11905: 0xE9A2, + 26865 - 11905: 0xC0E2, + 26866 - 11905: 0x97AB, + 26867 - 11905: 0x97AC, + 26868 - 11905: 0x97AD, + 26869 - 11905: 0xBFC3, + 26870 - 11905: 0x97AE, + 26871 - 11905: 0x97AF, + 26872 - 11905: 0x97B0, + 26873 - 11905: 0xE8FE, + 26874 - 11905: 0xB9D7, + 26875 - 11905: 0x97B1, + 26876 - 11905: 0xE8FB, + 26877 - 11905: 0x97B2, + 26878 - 11905: 0x97B3, + 26879 - 11905: 0x97B4, + 26880 - 11905: 0x97B5, + 26881 - 11905: 0xE9A4, + 26882 - 11905: 0x97B6, + 26883 - 11905: 0x97B7, + 26884 - 11905: 0x97B8, + 26885 - 11905: 0xD2CE, + 26886 - 11905: 0x97B9, + 26887 - 11905: 0x97BA, + 26888 - 11905: 0x97BB, + 26889 - 11905: 0x97BC, + 26890 - 11905: 0x97BD, + 26891 - 11905: 0xE9A3, + 26892 - 11905: 0x97BE, + 26893 - 11905: 0xD6B2, + 26894 - 11905: 0xD7B5, + 26895 - 11905: 0x97BF, + 26896 - 11905: 0xE9A7, + 26897 - 11905: 0x97C0, + 26898 - 11905: 0xBDB7, + 26899 - 11905: 0x97C1, + 26900 - 11905: 0x97C2, + 26901 - 11905: 0x97C3, + 26902 - 11905: 0x97C4, + 26903 - 11905: 0x97C5, + 26904 - 11905: 0x97C6, + 26905 - 11905: 0x97C7, + 26906 - 11905: 0x97C8, + 26907 - 11905: 0x97C9, + 26908 - 11905: 0x97CA, + 26909 - 11905: 0x97CB, + 26910 - 11905: 0x97CC, + 26911 - 11905: 0xE8FC, + 26912 - 11905: 0xE8FD, + 26913 - 11905: 0x97CD, + 26914 - 11905: 0x97CE, + 26915 - 11905: 0x97CF, + 26916 - 11905: 0xE9A1, + 26917 - 11905: 0x97D0, + 26918 - 11905: 0x97D1, + 26919 - 11905: 0x97D2, + 26920 - 11905: 0x97D3, + 26921 - 11905: 0x97D4, + 26922 - 11905: 0x97D5, + 26923 - 11905: 0x97D6, + 26924 - 11905: 0x97D7, + 26925 - 11905: 0xCDD6, + 26926 - 11905: 0x97D8, + 26927 - 11905: 0x97D9, + 26928 - 11905: 0xD2AC, + 26929 - 11905: 0x97DA, + 26930 - 11905: 0x97DB, + 26931 - 11905: 0x97DC, + 26932 - 11905: 0xE9B2, + 26933 - 11905: 0x97DD, + 26934 - 11905: 0x97DE, + 26935 - 11905: 0x97DF, + 26936 - 11905: 0x97E0, + 26937 - 11905: 0xE9A9, + 26938 - 11905: 0x97E1, + 26939 - 11905: 0x97E2, + 26940 - 11905: 0x97E3, + 26941 - 11905: 0xB4AA, + 26942 - 11905: 0x97E4, + 26943 - 11905: 0xB4BB, + 26944 - 11905: 0x97E5, + 26945 - 11905: 0x97E6, + 26946 - 11905: 0xE9AB, + 26947 - 11905: 0x97E7, + 26948 - 11905: 0x97E8, + 26949 - 11905: 0x97E9, + 26950 - 11905: 0x97EA, + 26951 - 11905: 0x97EB, + 26952 - 11905: 0x97EC, + 26953 - 11905: 0x97ED, + 26954 - 11905: 0x97EE, + 26955 - 11905: 0x97EF, + 26956 - 11905: 0x97F0, + 26957 - 11905: 0x97F1, + 26958 - 11905: 0x97F2, + 26959 - 11905: 0x97F3, + 26960 - 11905: 0x97F4, + 26961 - 11905: 0x97F5, + 26962 - 11905: 0x97F6, + 26963 - 11905: 0x97F7, + 26964 - 11905: 0xD0A8, + 26965 - 11905: 0x97F8, + 26966 - 11905: 0x97F9, + 26967 - 11905: 0xE9A5, + 26968 - 11905: 0x97FA, + 26969 - 11905: 0x97FB, + 26970 - 11905: 0xB3FE, + 26971 - 11905: 0x97FC, + 26972 - 11905: 0x97FD, + 26973 - 11905: 0xE9AC, + 26974 - 11905: 0xC0E3, + 26975 - 11905: 0x97FE, + 26976 - 11905: 0xE9AA, + 26977 - 11905: 0x9840, + 26978 - 11905: 0x9841, + 26979 - 11905: 0xE9B9, + 26980 - 11905: 0x9842, + 26981 - 11905: 0x9843, + 26982 - 11905: 0xE9B8, + 26983 - 11905: 0x9844, + 26984 - 11905: 0x9845, + 26985 - 11905: 0x9846, + 26986 - 11905: 0x9847, + 26987 - 11905: 0xE9AE, + 26988 - 11905: 0x9848, + 26989 - 11905: 0x9849, + 26990 - 11905: 0xE8FA, + 26991 - 11905: 0x984A, + 26992 - 11905: 0x984B, + 26993 - 11905: 0xE9A8, + 26994 - 11905: 0x984C, + 26995 - 11905: 0x984D, + 26996 - 11905: 0x984E, + 26997 - 11905: 0x984F, + 26998 - 11905: 0x9850, + 26999 - 11905: 0xBFAC, + 27000 - 11905: 0xE9B1, + 27001 - 11905: 0xE9BA, + 27002 - 11905: 0x9851, + 27003 - 11905: 0x9852, + 27004 - 11905: 0xC2A5, + 27005 - 11905: 0x9853, + 27006 - 11905: 0x9854, + 27007 - 11905: 0x9855, + 27008 - 11905: 0xE9AF, + 27009 - 11905: 0x9856, + 27010 - 11905: 0xB8C5, + 27011 - 11905: 0x9857, + 27012 - 11905: 0xE9AD, + 27013 - 11905: 0x9858, + 27014 - 11905: 0xD3DC, + 27015 - 11905: 0xE9B4, + 27016 - 11905: 0xE9B5, + 27017 - 11905: 0xE9B7, + 27018 - 11905: 0x9859, + 27019 - 11905: 0x985A, + 27020 - 11905: 0x985B, + 27021 - 11905: 0xE9C7, + 27022 - 11905: 0x985C, + 27023 - 11905: 0x985D, + 27024 - 11905: 0x985E, + 27025 - 11905: 0x985F, + 27026 - 11905: 0x9860, + 27027 - 11905: 0x9861, + 27028 - 11905: 0xC0C6, + 27029 - 11905: 0xE9C5, + 27030 - 11905: 0x9862, + 27031 - 11905: 0x9863, + 27032 - 11905: 0xE9B0, + 27033 - 11905: 0x9864, + 27034 - 11905: 0x9865, + 27035 - 11905: 0xE9BB, + 27036 - 11905: 0xB0F1, + 27037 - 11905: 0x9866, + 27038 - 11905: 0x9867, + 27039 - 11905: 0x9868, + 27040 - 11905: 0x9869, + 27041 - 11905: 0x986A, + 27042 - 11905: 0x986B, + 27043 - 11905: 0x986C, + 27044 - 11905: 0x986D, + 27045 - 11905: 0x986E, + 27046 - 11905: 0x986F, + 27047 - 11905: 0xE9BC, + 27048 - 11905: 0xD5A5, + 27049 - 11905: 0x9870, + 27050 - 11905: 0x9871, + 27051 - 11905: 0xE9BE, + 27052 - 11905: 0x9872, + 27053 - 11905: 0xE9BF, + 27054 - 11905: 0x9873, + 27055 - 11905: 0x9874, + 27056 - 11905: 0x9875, + 27057 - 11905: 0xE9C1, + 27058 - 11905: 0x9876, + 27059 - 11905: 0x9877, + 27060 - 11905: 0xC1F1, + 27061 - 11905: 0x9878, + 27062 - 11905: 0x9879, + 27063 - 11905: 0xC8B6, + 27064 - 11905: 0x987A, + 27065 - 11905: 0x987B, + 27066 - 11905: 0x987C, + 27067 - 11905: 0xE9BD, + 27068 - 11905: 0x987D, + 27069 - 11905: 0x987E, + 27070 - 11905: 0x9880, + 27071 - 11905: 0x9881, + 27072 - 11905: 0x9882, + 27073 - 11905: 0xE9C2, + 27074 - 11905: 0x9883, + 27075 - 11905: 0x9884, + 27076 - 11905: 0x9885, + 27077 - 11905: 0x9886, + 27078 - 11905: 0x9887, + 27079 - 11905: 0x9888, + 27080 - 11905: 0x9889, + 27081 - 11905: 0x988A, + 27082 - 11905: 0xE9C3, + 27083 - 11905: 0x988B, + 27084 - 11905: 0xE9B3, + 27085 - 11905: 0x988C, + 27086 - 11905: 0xE9B6, + 27087 - 11905: 0x988D, + 27088 - 11905: 0xBBB1, + 27089 - 11905: 0x988E, + 27090 - 11905: 0x988F, + 27091 - 11905: 0x9890, + 27092 - 11905: 0xE9C0, + 27093 - 11905: 0x9891, + 27094 - 11905: 0x9892, + 27095 - 11905: 0x9893, + 27096 - 11905: 0x9894, + 27097 - 11905: 0x9895, + 27098 - 11905: 0x9896, + 27099 - 11905: 0xBCF7, + 27100 - 11905: 0x9897, + 27101 - 11905: 0x9898, + 27102 - 11905: 0x9899, + 27103 - 11905: 0xE9C4, + 27104 - 11905: 0xE9C6, + 27105 - 11905: 0x989A, + 27106 - 11905: 0x989B, + 27107 - 11905: 0x989C, + 27108 - 11905: 0x989D, + 27109 - 11905: 0x989E, + 27110 - 11905: 0x989F, + 27111 - 11905: 0x98A0, + 27112 - 11905: 0x98A1, + 27113 - 11905: 0x98A2, + 27114 - 11905: 0x98A3, + 27115 - 11905: 0x98A4, + 27116 - 11905: 0x98A5, + 27117 - 11905: 0xE9CA, + 27118 - 11905: 0x98A6, + 27119 - 11905: 0x98A7, + 27120 - 11905: 0x98A8, + 27121 - 11905: 0x98A9, + 27122 - 11905: 0xE9CE, + 27123 - 11905: 0x98AA, + 27124 - 11905: 0x98AB, + 27125 - 11905: 0x98AC, + 27126 - 11905: 0x98AD, + 27127 - 11905: 0x98AE, + 27128 - 11905: 0x98AF, + 27129 - 11905: 0x98B0, + 27130 - 11905: 0x98B1, + 27131 - 11905: 0x98B2, + 27132 - 11905: 0x98B3, + 27133 - 11905: 0xB2DB, + 27134 - 11905: 0x98B4, + 27135 - 11905: 0xE9C8, + 27136 - 11905: 0x98B5, + 27137 - 11905: 0x98B6, + 27138 - 11905: 0x98B7, + 27139 - 11905: 0x98B8, + 27140 - 11905: 0x98B9, + 27141 - 11905: 0x98BA, + 27142 - 11905: 0x98BB, + 27143 - 11905: 0x98BC, + 27144 - 11905: 0x98BD, + 27145 - 11905: 0x98BE, + 27146 - 11905: 0xB7AE, + 27147 - 11905: 0x98BF, + 27148 - 11905: 0x98C0, + 27149 - 11905: 0x98C1, + 27150 - 11905: 0x98C2, + 27151 - 11905: 0x98C3, + 27152 - 11905: 0x98C4, + 27153 - 11905: 0x98C5, + 27154 - 11905: 0x98C6, + 27155 - 11905: 0x98C7, + 27156 - 11905: 0x98C8, + 27157 - 11905: 0x98C9, + 27158 - 11905: 0x98CA, + 27159 - 11905: 0xE9CB, + 27160 - 11905: 0xE9CC, + 27161 - 11905: 0x98CB, + 27162 - 11905: 0x98CC, + 27163 - 11905: 0x98CD, + 27164 - 11905: 0x98CE, + 27165 - 11905: 0x98CF, + 27166 - 11905: 0x98D0, + 27167 - 11905: 0xD5C1, + 27168 - 11905: 0x98D1, + 27169 - 11905: 0xC4A3, + 27170 - 11905: 0x98D2, + 27171 - 11905: 0x98D3, + 27172 - 11905: 0x98D4, + 27173 - 11905: 0x98D5, + 27174 - 11905: 0x98D6, + 27175 - 11905: 0x98D7, + 27176 - 11905: 0xE9D8, + 27177 - 11905: 0x98D8, + 27178 - 11905: 0xBAE1, + 27179 - 11905: 0x98D9, + 27180 - 11905: 0x98DA, + 27181 - 11905: 0x98DB, + 27182 - 11905: 0x98DC, + 27183 - 11905: 0xE9C9, + 27184 - 11905: 0x98DD, + 27185 - 11905: 0xD3A3, + 27186 - 11905: 0x98DE, + 27187 - 11905: 0x98DF, + 27188 - 11905: 0x98E0, + 27189 - 11905: 0xE9D4, + 27190 - 11905: 0x98E1, + 27191 - 11905: 0x98E2, + 27192 - 11905: 0x98E3, + 27193 - 11905: 0x98E4, + 27194 - 11905: 0x98E5, + 27195 - 11905: 0x98E6, + 27196 - 11905: 0x98E7, + 27197 - 11905: 0xE9D7, + 27198 - 11905: 0xE9D0, + 27199 - 11905: 0x98E8, + 27200 - 11905: 0x98E9, + 27201 - 11905: 0x98EA, + 27202 - 11905: 0x98EB, + 27203 - 11905: 0x98EC, + 27204 - 11905: 0xE9CF, + 27205 - 11905: 0x98ED, + 27206 - 11905: 0x98EE, + 27207 - 11905: 0xC7C1, + 27208 - 11905: 0x98EF, + 27209 - 11905: 0x98F0, + 27210 - 11905: 0x98F1, + 27211 - 11905: 0x98F2, + 27212 - 11905: 0x98F3, + 27213 - 11905: 0x98F4, + 27214 - 11905: 0x98F5, + 27215 - 11905: 0x98F6, + 27216 - 11905: 0xE9D2, + 27217 - 11905: 0x98F7, + 27218 - 11905: 0x98F8, + 27219 - 11905: 0x98F9, + 27220 - 11905: 0x98FA, + 27221 - 11905: 0x98FB, + 27222 - 11905: 0x98FC, + 27223 - 11905: 0x98FD, + 27224 - 11905: 0xE9D9, + 27225 - 11905: 0xB3C8, + 27226 - 11905: 0x98FE, + 27227 - 11905: 0xE9D3, + 27228 - 11905: 0x9940, + 27229 - 11905: 0x9941, + 27230 - 11905: 0x9942, + 27231 - 11905: 0x9943, + 27232 - 11905: 0x9944, + 27233 - 11905: 0xCFF0, + 27234 - 11905: 0x9945, + 27235 - 11905: 0x9946, + 27236 - 11905: 0x9947, + 27237 - 11905: 0xE9CD, + 27238 - 11905: 0x9948, + 27239 - 11905: 0x9949, + 27240 - 11905: 0x994A, + 27241 - 11905: 0x994B, + 27242 - 11905: 0x994C, + 27243 - 11905: 0x994D, + 27244 - 11905: 0x994E, + 27245 - 11905: 0x994F, + 27246 - 11905: 0x9950, + 27247 - 11905: 0x9951, + 27248 - 11905: 0x9952, + 27249 - 11905: 0xB3F7, + 27250 - 11905: 0x9953, + 27251 - 11905: 0x9954, + 27252 - 11905: 0x9955, + 27253 - 11905: 0x9956, + 27254 - 11905: 0x9957, + 27255 - 11905: 0x9958, + 27256 - 11905: 0x9959, + 27257 - 11905: 0xE9D6, + 27258 - 11905: 0x995A, + 27259 - 11905: 0x995B, + 27260 - 11905: 0xE9DA, + 27261 - 11905: 0x995C, + 27262 - 11905: 0x995D, + 27263 - 11905: 0x995E, + 27264 - 11905: 0xCCB4, + 27265 - 11905: 0x995F, + 27266 - 11905: 0x9960, + 27267 - 11905: 0x9961, + 27268 - 11905: 0xCFAD, + 27269 - 11905: 0x9962, + 27270 - 11905: 0x9963, + 27271 - 11905: 0x9964, + 27272 - 11905: 0x9965, + 27273 - 11905: 0x9966, + 27274 - 11905: 0x9967, + 27275 - 11905: 0x9968, + 27276 - 11905: 0x9969, + 27277 - 11905: 0x996A, + 27278 - 11905: 0xE9D5, + 27279 - 11905: 0x996B, + 27280 - 11905: 0xE9DC, + 27281 - 11905: 0xE9DB, + 27282 - 11905: 0x996C, + 27283 - 11905: 0x996D, + 27284 - 11905: 0x996E, + 27285 - 11905: 0x996F, + 27286 - 11905: 0x9970, + 27287 - 11905: 0xE9DE, + 27288 - 11905: 0x9971, + 27289 - 11905: 0x9972, + 27290 - 11905: 0x9973, + 27291 - 11905: 0x9974, + 27292 - 11905: 0x9975, + 27293 - 11905: 0x9976, + 27294 - 11905: 0x9977, + 27295 - 11905: 0x9978, + 27296 - 11905: 0xE9D1, + 27297 - 11905: 0x9979, + 27298 - 11905: 0x997A, + 27299 - 11905: 0x997B, + 27300 - 11905: 0x997C, + 27301 - 11905: 0x997D, + 27302 - 11905: 0x997E, + 27303 - 11905: 0x9980, + 27304 - 11905: 0x9981, + 27305 - 11905: 0xE9DD, + 27306 - 11905: 0x9982, + 27307 - 11905: 0xE9DF, + 27308 - 11905: 0xC3CA, + 27309 - 11905: 0x9983, + 27310 - 11905: 0x9984, + 27311 - 11905: 0x9985, + 27312 - 11905: 0x9986, + 27313 - 11905: 0x9987, + 27314 - 11905: 0x9988, + 27315 - 11905: 0x9989, + 27316 - 11905: 0x998A, + 27317 - 11905: 0x998B, + 27318 - 11905: 0x998C, + 27319 - 11905: 0x998D, + 27320 - 11905: 0x998E, + 27321 - 11905: 0x998F, + 27322 - 11905: 0x9990, + 27323 - 11905: 0x9991, + 27324 - 11905: 0x9992, + 27325 - 11905: 0x9993, + 27326 - 11905: 0x9994, + 27327 - 11905: 0x9995, + 27328 - 11905: 0x9996, + 27329 - 11905: 0x9997, + 27330 - 11905: 0x9998, + 27331 - 11905: 0x9999, + 27332 - 11905: 0x999A, + 27333 - 11905: 0x999B, + 27334 - 11905: 0x999C, + 27335 - 11905: 0x999D, + 27336 - 11905: 0x999E, + 27337 - 11905: 0x999F, + 27338 - 11905: 0x99A0, + 27339 - 11905: 0x99A1, + 27340 - 11905: 0x99A2, + 27341 - 11905: 0x99A3, + 27342 - 11905: 0x99A4, + 27343 - 11905: 0x99A5, + 27344 - 11905: 0x99A6, + 27345 - 11905: 0x99A7, + 27346 - 11905: 0x99A8, + 27347 - 11905: 0x99A9, + 27348 - 11905: 0x99AA, + 27349 - 11905: 0x99AB, + 27350 - 11905: 0x99AC, + 27351 - 11905: 0x99AD, + 27352 - 11905: 0x99AE, + 27353 - 11905: 0x99AF, + 27354 - 11905: 0x99B0, + 27355 - 11905: 0x99B1, + 27356 - 11905: 0x99B2, + 27357 - 11905: 0x99B3, + 27358 - 11905: 0x99B4, + 27359 - 11905: 0x99B5, + 27360 - 11905: 0x99B6, + 27361 - 11905: 0x99B7, + 27362 - 11905: 0x99B8, + 27363 - 11905: 0x99B9, + 27364 - 11905: 0x99BA, + 27365 - 11905: 0x99BB, + 27366 - 11905: 0x99BC, + 27367 - 11905: 0x99BD, + 27368 - 11905: 0x99BE, + 27369 - 11905: 0x99BF, + 27370 - 11905: 0x99C0, + 27371 - 11905: 0x99C1, + 27372 - 11905: 0x99C2, + 27373 - 11905: 0x99C3, + 27374 - 11905: 0x99C4, + 27375 - 11905: 0x99C5, + 27376 - 11905: 0x99C6, + 27377 - 11905: 0x99C7, + 27378 - 11905: 0x99C8, + 27379 - 11905: 0x99C9, + 27380 - 11905: 0x99CA, + 27381 - 11905: 0x99CB, + 27382 - 11905: 0x99CC, + 27383 - 11905: 0x99CD, + 27384 - 11905: 0x99CE, + 27385 - 11905: 0x99CF, + 27386 - 11905: 0x99D0, + 27387 - 11905: 0x99D1, + 27388 - 11905: 0x99D2, + 27389 - 11905: 0x99D3, + 27390 - 11905: 0x99D4, + 27391 - 11905: 0x99D5, + 27392 - 11905: 0x99D6, + 27393 - 11905: 0x99D7, + 27394 - 11905: 0x99D8, + 27395 - 11905: 0x99D9, + 27396 - 11905: 0x99DA, + 27397 - 11905: 0x99DB, + 27398 - 11905: 0x99DC, + 27399 - 11905: 0x99DD, + 27400 - 11905: 0x99DE, + 27401 - 11905: 0x99DF, + 27402 - 11905: 0x99E0, + 27403 - 11905: 0x99E1, + 27404 - 11905: 0x99E2, + 27405 - 11905: 0x99E3, + 27406 - 11905: 0x99E4, + 27407 - 11905: 0x99E5, + 27408 - 11905: 0x99E6, + 27409 - 11905: 0x99E7, + 27410 - 11905: 0x99E8, + 27411 - 11905: 0x99E9, + 27412 - 11905: 0x99EA, + 27413 - 11905: 0x99EB, + 27414 - 11905: 0x99EC, + 27415 - 11905: 0x99ED, + 27416 - 11905: 0x99EE, + 27417 - 11905: 0x99EF, + 27418 - 11905: 0x99F0, + 27419 - 11905: 0x99F1, + 27420 - 11905: 0x99F2, + 27421 - 11905: 0x99F3, + 27422 - 11905: 0x99F4, + 27423 - 11905: 0x99F5, + 27424 - 11905: 0xC7B7, + 27425 - 11905: 0xB4CE, + 27426 - 11905: 0xBBB6, + 27427 - 11905: 0xD0C0, + 27428 - 11905: 0xECA3, + 27429 - 11905: 0x99F6, + 27430 - 11905: 0x99F7, + 27431 - 11905: 0xC5B7, + 27432 - 11905: 0x99F8, + 27433 - 11905: 0x99F9, + 27434 - 11905: 0x99FA, + 27435 - 11905: 0x99FB, + 27436 - 11905: 0x99FC, + 27437 - 11905: 0x99FD, + 27438 - 11905: 0x99FE, + 27439 - 11905: 0x9A40, + 27440 - 11905: 0x9A41, + 27441 - 11905: 0x9A42, + 27442 - 11905: 0xD3FB, + 27443 - 11905: 0x9A43, + 27444 - 11905: 0x9A44, + 27445 - 11905: 0x9A45, + 27446 - 11905: 0x9A46, + 27447 - 11905: 0xECA4, + 27448 - 11905: 0x9A47, + 27449 - 11905: 0xECA5, + 27450 - 11905: 0xC6DB, + 27451 - 11905: 0x9A48, + 27452 - 11905: 0x9A49, + 27453 - 11905: 0x9A4A, + 27454 - 11905: 0xBFEE, + 27455 - 11905: 0x9A4B, + 27456 - 11905: 0x9A4C, + 27457 - 11905: 0x9A4D, + 27458 - 11905: 0x9A4E, + 27459 - 11905: 0xECA6, + 27460 - 11905: 0x9A4F, + 27461 - 11905: 0x9A50, + 27462 - 11905: 0xECA7, + 27463 - 11905: 0xD0AA, + 27464 - 11905: 0x9A51, + 27465 - 11905: 0xC7B8, + 27466 - 11905: 0x9A52, + 27467 - 11905: 0x9A53, + 27468 - 11905: 0xB8E8, + 27469 - 11905: 0x9A54, + 27470 - 11905: 0x9A55, + 27471 - 11905: 0x9A56, + 27472 - 11905: 0x9A57, + 27473 - 11905: 0x9A58, + 27474 - 11905: 0x9A59, + 27475 - 11905: 0x9A5A, + 27476 - 11905: 0x9A5B, + 27477 - 11905: 0x9A5C, + 27478 - 11905: 0x9A5D, + 27479 - 11905: 0x9A5E, + 27480 - 11905: 0x9A5F, + 27481 - 11905: 0xECA8, + 27482 - 11905: 0x9A60, + 27483 - 11905: 0x9A61, + 27484 - 11905: 0x9A62, + 27485 - 11905: 0x9A63, + 27486 - 11905: 0x9A64, + 27487 - 11905: 0x9A65, + 27488 - 11905: 0x9A66, + 27489 - 11905: 0x9A67, + 27490 - 11905: 0xD6B9, + 27491 - 11905: 0xD5FD, + 27492 - 11905: 0xB4CB, + 27493 - 11905: 0xB2BD, + 27494 - 11905: 0xCEE4, + 27495 - 11905: 0xC6E7, + 27496 - 11905: 0x9A68, + 27497 - 11905: 0x9A69, + 27498 - 11905: 0xCDE1, + 27499 - 11905: 0x9A6A, + 27500 - 11905: 0x9A6B, + 27501 - 11905: 0x9A6C, + 27502 - 11905: 0x9A6D, + 27503 - 11905: 0x9A6E, + 27504 - 11905: 0x9A6F, + 27505 - 11905: 0x9A70, + 27506 - 11905: 0x9A71, + 27507 - 11905: 0x9A72, + 27508 - 11905: 0x9A73, + 27509 - 11905: 0x9A74, + 27510 - 11905: 0x9A75, + 27511 - 11905: 0x9A76, + 27512 - 11905: 0x9A77, + 27513 - 11905: 0xB4F5, + 27514 - 11905: 0x9A78, + 27515 - 11905: 0xCBC0, + 27516 - 11905: 0xBCDF, + 27517 - 11905: 0x9A79, + 27518 - 11905: 0x9A7A, + 27519 - 11905: 0x9A7B, + 27520 - 11905: 0x9A7C, + 27521 - 11905: 0xE9E2, + 27522 - 11905: 0xE9E3, + 27523 - 11905: 0xD1EA, + 27524 - 11905: 0xE9E5, + 27525 - 11905: 0x9A7D, + 27526 - 11905: 0xB4F9, + 27527 - 11905: 0xE9E4, + 27528 - 11905: 0x9A7E, + 27529 - 11905: 0xD1B3, + 27530 - 11905: 0xCAE2, + 27531 - 11905: 0xB2D0, + 27532 - 11905: 0x9A80, + 27533 - 11905: 0xE9E8, + 27534 - 11905: 0x9A81, + 27535 - 11905: 0x9A82, + 27536 - 11905: 0x9A83, + 27537 - 11905: 0x9A84, + 27538 - 11905: 0xE9E6, + 27539 - 11905: 0xE9E7, + 27540 - 11905: 0x9A85, + 27541 - 11905: 0x9A86, + 27542 - 11905: 0xD6B3, + 27543 - 11905: 0x9A87, + 27544 - 11905: 0x9A88, + 27545 - 11905: 0x9A89, + 27546 - 11905: 0xE9E9, + 27547 - 11905: 0xE9EA, + 27548 - 11905: 0x9A8A, + 27549 - 11905: 0x9A8B, + 27550 - 11905: 0x9A8C, + 27551 - 11905: 0x9A8D, + 27552 - 11905: 0x9A8E, + 27553 - 11905: 0xE9EB, + 27554 - 11905: 0x9A8F, + 27555 - 11905: 0x9A90, + 27556 - 11905: 0x9A91, + 27557 - 11905: 0x9A92, + 27558 - 11905: 0x9A93, + 27559 - 11905: 0x9A94, + 27560 - 11905: 0x9A95, + 27561 - 11905: 0x9A96, + 27562 - 11905: 0xE9EC, + 27563 - 11905: 0x9A97, + 27564 - 11905: 0x9A98, + 27565 - 11905: 0x9A99, + 27566 - 11905: 0x9A9A, + 27567 - 11905: 0x9A9B, + 27568 - 11905: 0x9A9C, + 27569 - 11905: 0x9A9D, + 27570 - 11905: 0x9A9E, + 27571 - 11905: 0xECAF, + 27572 - 11905: 0xC5B9, + 27573 - 11905: 0xB6CE, + 27574 - 11905: 0x9A9F, + 27575 - 11905: 0xD2F3, + 27576 - 11905: 0x9AA0, + 27577 - 11905: 0x9AA1, + 27578 - 11905: 0x9AA2, + 27579 - 11905: 0x9AA3, + 27580 - 11905: 0x9AA4, + 27581 - 11905: 0x9AA5, + 27582 - 11905: 0x9AA6, + 27583 - 11905: 0xB5EE, + 27584 - 11905: 0x9AA7, + 27585 - 11905: 0xBBD9, + 27586 - 11905: 0xECB1, + 27587 - 11905: 0x9AA8, + 27588 - 11905: 0x9AA9, + 27589 - 11905: 0xD2E3, + 27590 - 11905: 0x9AAA, + 27591 - 11905: 0x9AAB, + 27592 - 11905: 0x9AAC, + 27593 - 11905: 0x9AAD, + 27594 - 11905: 0x9AAE, + 27595 - 11905: 0xCEE3, + 27596 - 11905: 0x9AAF, + 27597 - 11905: 0xC4B8, + 27598 - 11905: 0x9AB0, + 27599 - 11905: 0xC3BF, + 27600 - 11905: 0x9AB1, + 27601 - 11905: 0x9AB2, + 27602 - 11905: 0xB6BE, + 27603 - 11905: 0xD8B9, + 27604 - 11905: 0xB1C8, + 27605 - 11905: 0xB1CF, + 27606 - 11905: 0xB1D1, + 27607 - 11905: 0xC5FE, + 27608 - 11905: 0x9AB3, + 27609 - 11905: 0xB1D0, + 27610 - 11905: 0x9AB4, + 27611 - 11905: 0xC3AB, + 27612 - 11905: 0x9AB5, + 27613 - 11905: 0x9AB6, + 27614 - 11905: 0x9AB7, + 27615 - 11905: 0x9AB8, + 27616 - 11905: 0x9AB9, + 27617 - 11905: 0xD5B1, + 27618 - 11905: 0x9ABA, + 27619 - 11905: 0x9ABB, + 27620 - 11905: 0x9ABC, + 27621 - 11905: 0x9ABD, + 27622 - 11905: 0x9ABE, + 27623 - 11905: 0x9ABF, + 27624 - 11905: 0x9AC0, + 27625 - 11905: 0x9AC1, + 27626 - 11905: 0xEBA4, + 27627 - 11905: 0xBAC1, + 27628 - 11905: 0x9AC2, + 27629 - 11905: 0x9AC3, + 27630 - 11905: 0x9AC4, + 27631 - 11905: 0xCCBA, + 27632 - 11905: 0x9AC5, + 27633 - 11905: 0x9AC6, + 27634 - 11905: 0x9AC7, + 27635 - 11905: 0xEBA5, + 27636 - 11905: 0x9AC8, + 27637 - 11905: 0xEBA7, + 27638 - 11905: 0x9AC9, + 27639 - 11905: 0x9ACA, + 27640 - 11905: 0x9ACB, + 27641 - 11905: 0xEBA8, + 27642 - 11905: 0x9ACC, + 27643 - 11905: 0x9ACD, + 27644 - 11905: 0x9ACE, + 27645 - 11905: 0xEBA6, + 27646 - 11905: 0x9ACF, + 27647 - 11905: 0x9AD0, + 27648 - 11905: 0x9AD1, + 27649 - 11905: 0x9AD2, + 27650 - 11905: 0x9AD3, + 27651 - 11905: 0x9AD4, + 27652 - 11905: 0x9AD5, + 27653 - 11905: 0xEBA9, + 27654 - 11905: 0xEBAB, + 27655 - 11905: 0xEBAA, + 27656 - 11905: 0x9AD6, + 27657 - 11905: 0x9AD7, + 27658 - 11905: 0x9AD8, + 27659 - 11905: 0x9AD9, + 27660 - 11905: 0x9ADA, + 27661 - 11905: 0xEBAC, + 27662 - 11905: 0x9ADB, + 27663 - 11905: 0xCACF, + 27664 - 11905: 0xD8B5, + 27665 - 11905: 0xC3F1, + 27666 - 11905: 0x9ADC, + 27667 - 11905: 0xC3A5, + 27668 - 11905: 0xC6F8, + 27669 - 11905: 0xEBAD, + 27670 - 11905: 0xC4CA, + 27671 - 11905: 0x9ADD, + 27672 - 11905: 0xEBAE, + 27673 - 11905: 0xEBAF, + 27674 - 11905: 0xEBB0, + 27675 - 11905: 0xB7D5, + 27676 - 11905: 0x9ADE, + 27677 - 11905: 0x9ADF, + 27678 - 11905: 0x9AE0, + 27679 - 11905: 0xB7FA, + 27680 - 11905: 0x9AE1, + 27681 - 11905: 0xEBB1, + 27682 - 11905: 0xC7E2, + 27683 - 11905: 0x9AE2, + 27684 - 11905: 0xEBB3, + 27685 - 11905: 0x9AE3, + 27686 - 11905: 0xBAA4, + 27687 - 11905: 0xD1F5, + 27688 - 11905: 0xB0B1, + 27689 - 11905: 0xEBB2, + 27690 - 11905: 0xEBB4, + 27691 - 11905: 0x9AE4, + 27692 - 11905: 0x9AE5, + 27693 - 11905: 0x9AE6, + 27694 - 11905: 0xB5AA, + 27695 - 11905: 0xC2C8, + 27696 - 11905: 0xC7E8, + 27697 - 11905: 0x9AE7, + 27698 - 11905: 0xEBB5, + 27699 - 11905: 0x9AE8, + 27700 - 11905: 0xCBAE, + 27701 - 11905: 0xE3DF, + 27702 - 11905: 0x9AE9, + 27703 - 11905: 0x9AEA, + 27704 - 11905: 0xD3C0, + 27705 - 11905: 0x9AEB, + 27706 - 11905: 0x9AEC, + 27707 - 11905: 0x9AED, + 27708 - 11905: 0x9AEE, + 27709 - 11905: 0xD9DB, + 27710 - 11905: 0x9AEF, + 27711 - 11905: 0x9AF0, + 27712 - 11905: 0xCDA1, + 27713 - 11905: 0xD6AD, + 27714 - 11905: 0xC7F3, + 27715 - 11905: 0x9AF1, + 27716 - 11905: 0x9AF2, + 27717 - 11905: 0x9AF3, + 27718 - 11905: 0xD9E0, + 27719 - 11905: 0xBBE3, + 27720 - 11905: 0x9AF4, + 27721 - 11905: 0xBABA, + 27722 - 11905: 0xE3E2, + 27723 - 11905: 0x9AF5, + 27724 - 11905: 0x9AF6, + 27725 - 11905: 0x9AF7, + 27726 - 11905: 0x9AF8, + 27727 - 11905: 0x9AF9, + 27728 - 11905: 0xCFAB, + 27729 - 11905: 0x9AFA, + 27730 - 11905: 0x9AFB, + 27731 - 11905: 0x9AFC, + 27732 - 11905: 0xE3E0, + 27733 - 11905: 0xC9C7, + 27734 - 11905: 0x9AFD, + 27735 - 11905: 0xBAB9, + 27736 - 11905: 0x9AFE, + 27737 - 11905: 0x9B40, + 27738 - 11905: 0x9B41, + 27739 - 11905: 0xD1B4, + 27740 - 11905: 0xE3E1, + 27741 - 11905: 0xC8EA, + 27742 - 11905: 0xB9AF, + 27743 - 11905: 0xBDAD, + 27744 - 11905: 0xB3D8, + 27745 - 11905: 0xCEDB, + 27746 - 11905: 0x9B42, + 27747 - 11905: 0x9B43, + 27748 - 11905: 0xCCC0, + 27749 - 11905: 0x9B44, + 27750 - 11905: 0x9B45, + 27751 - 11905: 0x9B46, + 27752 - 11905: 0xE3E8, + 27753 - 11905: 0xE3E9, + 27754 - 11905: 0xCDF4, + 27755 - 11905: 0x9B47, + 27756 - 11905: 0x9B48, + 27757 - 11905: 0x9B49, + 27758 - 11905: 0x9B4A, + 27759 - 11905: 0x9B4B, + 27760 - 11905: 0xCCAD, + 27761 - 11905: 0x9B4C, + 27762 - 11905: 0xBCB3, + 27763 - 11905: 0x9B4D, + 27764 - 11905: 0xE3EA, + 27765 - 11905: 0x9B4E, + 27766 - 11905: 0xE3EB, + 27767 - 11905: 0x9B4F, + 27768 - 11905: 0x9B50, + 27769 - 11905: 0xD0DA, + 27770 - 11905: 0x9B51, + 27771 - 11905: 0x9B52, + 27772 - 11905: 0x9B53, + 27773 - 11905: 0xC6FB, + 27774 - 11905: 0xB7DA, + 27775 - 11905: 0x9B54, + 27776 - 11905: 0x9B55, + 27777 - 11905: 0xC7DF, + 27778 - 11905: 0xD2CA, + 27779 - 11905: 0xCED6, + 27780 - 11905: 0x9B56, + 27781 - 11905: 0xE3E4, + 27782 - 11905: 0xE3EC, + 27783 - 11905: 0x9B57, + 27784 - 11905: 0xC9F2, + 27785 - 11905: 0xB3C1, + 27786 - 11905: 0x9B58, + 27787 - 11905: 0x9B59, + 27788 - 11905: 0xE3E7, + 27789 - 11905: 0x9B5A, + 27790 - 11905: 0x9B5B, + 27791 - 11905: 0xC6E3, + 27792 - 11905: 0xE3E5, + 27793 - 11905: 0x9B5C, + 27794 - 11905: 0x9B5D, + 27795 - 11905: 0xEDB3, + 27796 - 11905: 0xE3E6, + 27797 - 11905: 0x9B5E, + 27798 - 11905: 0x9B5F, + 27799 - 11905: 0x9B60, + 27800 - 11905: 0x9B61, + 27801 - 11905: 0xC9B3, + 27802 - 11905: 0x9B62, + 27803 - 11905: 0xC5E6, + 27804 - 11905: 0x9B63, + 27805 - 11905: 0x9B64, + 27806 - 11905: 0x9B65, + 27807 - 11905: 0xB9B5, + 27808 - 11905: 0x9B66, + 27809 - 11905: 0xC3BB, + 27810 - 11905: 0x9B67, + 27811 - 11905: 0xE3E3, + 27812 - 11905: 0xC5BD, + 27813 - 11905: 0xC1A4, + 27814 - 11905: 0xC2D9, + 27815 - 11905: 0xB2D7, + 27816 - 11905: 0x9B68, + 27817 - 11905: 0xE3ED, + 27818 - 11905: 0xBBA6, + 27819 - 11905: 0xC4AD, + 27820 - 11905: 0x9B69, + 27821 - 11905: 0xE3F0, + 27822 - 11905: 0xBEDA, + 27823 - 11905: 0x9B6A, + 27824 - 11905: 0x9B6B, + 27825 - 11905: 0xE3FB, + 27826 - 11905: 0xE3F5, + 27827 - 11905: 0xBAD3, + 27828 - 11905: 0x9B6C, + 27829 - 11905: 0x9B6D, + 27830 - 11905: 0x9B6E, + 27831 - 11905: 0x9B6F, + 27832 - 11905: 0xB7D0, + 27833 - 11905: 0xD3CD, + 27834 - 11905: 0x9B70, + 27835 - 11905: 0xD6CE, + 27836 - 11905: 0xD5D3, + 27837 - 11905: 0xB9C1, + 27838 - 11905: 0xD5B4, + 27839 - 11905: 0xD1D8, + 27840 - 11905: 0x9B71, + 27841 - 11905: 0x9B72, + 27842 - 11905: 0x9B73, + 27843 - 11905: 0x9B74, + 27844 - 11905: 0xD0B9, + 27845 - 11905: 0xC7F6, + 27846 - 11905: 0x9B75, + 27847 - 11905: 0x9B76, + 27848 - 11905: 0x9B77, + 27849 - 11905: 0xC8AA, + 27850 - 11905: 0xB2B4, + 27851 - 11905: 0x9B78, + 27852 - 11905: 0xC3DA, + 27853 - 11905: 0x9B79, + 27854 - 11905: 0x9B7A, + 27855 - 11905: 0x9B7B, + 27856 - 11905: 0xE3EE, + 27857 - 11905: 0x9B7C, + 27858 - 11905: 0x9B7D, + 27859 - 11905: 0xE3FC, + 27860 - 11905: 0xE3EF, + 27861 - 11905: 0xB7A8, + 27862 - 11905: 0xE3F7, + 27863 - 11905: 0xE3F4, + 27864 - 11905: 0x9B7E, + 27865 - 11905: 0x9B80, + 27866 - 11905: 0x9B81, + 27867 - 11905: 0xB7BA, + 27868 - 11905: 0x9B82, + 27869 - 11905: 0x9B83, + 27870 - 11905: 0xC5A2, + 27871 - 11905: 0x9B84, + 27872 - 11905: 0xE3F6, + 27873 - 11905: 0xC5DD, + 27874 - 11905: 0xB2A8, + 27875 - 11905: 0xC6FC, + 27876 - 11905: 0x9B85, + 27877 - 11905: 0xC4E0, + 27878 - 11905: 0x9B86, + 27879 - 11905: 0x9B87, + 27880 - 11905: 0xD7A2, + 27881 - 11905: 0x9B88, + 27882 - 11905: 0xC0E1, + 27883 - 11905: 0xE3F9, + 27884 - 11905: 0x9B89, + 27885 - 11905: 0x9B8A, + 27886 - 11905: 0xE3FA, + 27887 - 11905: 0xE3FD, + 27888 - 11905: 0xCCA9, + 27889 - 11905: 0xE3F3, + 27890 - 11905: 0x9B8B, + 27891 - 11905: 0xD3BE, + 27892 - 11905: 0x9B8C, + 27893 - 11905: 0xB1C3, + 27894 - 11905: 0xEDB4, + 27895 - 11905: 0xE3F1, + 27896 - 11905: 0xE3F2, + 27897 - 11905: 0x9B8D, + 27898 - 11905: 0xE3F8, + 27899 - 11905: 0xD0BA, + 27900 - 11905: 0xC6C3, + 27901 - 11905: 0xD4F3, + 27902 - 11905: 0xE3FE, + 27903 - 11905: 0x9B8E, + 27904 - 11905: 0x9B8F, + 27905 - 11905: 0xBDE0, + 27906 - 11905: 0x9B90, + 27907 - 11905: 0x9B91, + 27908 - 11905: 0xE4A7, + 27909 - 11905: 0x9B92, + 27910 - 11905: 0x9B93, + 27911 - 11905: 0xE4A6, + 27912 - 11905: 0x9B94, + 27913 - 11905: 0x9B95, + 27914 - 11905: 0x9B96, + 27915 - 11905: 0xD1F3, + 27916 - 11905: 0xE4A3, + 27917 - 11905: 0x9B97, + 27918 - 11905: 0xE4A9, + 27919 - 11905: 0x9B98, + 27920 - 11905: 0x9B99, + 27921 - 11905: 0x9B9A, + 27922 - 11905: 0xC8F7, + 27923 - 11905: 0x9B9B, + 27924 - 11905: 0x9B9C, + 27925 - 11905: 0x9B9D, + 27926 - 11905: 0x9B9E, + 27927 - 11905: 0xCFB4, + 27928 - 11905: 0x9B9F, + 27929 - 11905: 0xE4A8, + 27930 - 11905: 0xE4AE, + 27931 - 11905: 0xC2E5, + 27932 - 11905: 0x9BA0, + 27933 - 11905: 0x9BA1, + 27934 - 11905: 0xB6B4, + 27935 - 11905: 0x9BA2, + 27936 - 11905: 0x9BA3, + 27937 - 11905: 0x9BA4, + 27938 - 11905: 0x9BA5, + 27939 - 11905: 0x9BA6, + 27940 - 11905: 0x9BA7, + 27941 - 11905: 0xBDF2, + 27942 - 11905: 0x9BA8, + 27943 - 11905: 0xE4A2, + 27944 - 11905: 0x9BA9, + 27945 - 11905: 0x9BAA, + 27946 - 11905: 0xBAE9, + 27947 - 11905: 0xE4AA, + 27948 - 11905: 0x9BAB, + 27949 - 11905: 0x9BAC, + 27950 - 11905: 0xE4AC, + 27951 - 11905: 0x9BAD, + 27952 - 11905: 0x9BAE, + 27953 - 11905: 0xB6FD, + 27954 - 11905: 0xD6DE, + 27955 - 11905: 0xE4B2, + 27956 - 11905: 0x9BAF, + 27957 - 11905: 0xE4AD, + 27958 - 11905: 0x9BB0, + 27959 - 11905: 0x9BB1, + 27960 - 11905: 0x9BB2, + 27961 - 11905: 0xE4A1, + 27962 - 11905: 0x9BB3, + 27963 - 11905: 0xBBEE, + 27964 - 11905: 0xCDDD, + 27965 - 11905: 0xC7A2, + 27966 - 11905: 0xC5C9, + 27967 - 11905: 0x9BB4, + 27968 - 11905: 0x9BB5, + 27969 - 11905: 0xC1F7, + 27970 - 11905: 0x9BB6, + 27971 - 11905: 0xE4A4, + 27972 - 11905: 0x9BB7, + 27973 - 11905: 0xC7B3, + 27974 - 11905: 0xBDAC, + 27975 - 11905: 0xBDBD, + 27976 - 11905: 0xE4A5, + 27977 - 11905: 0x9BB8, + 27978 - 11905: 0xD7C7, + 27979 - 11905: 0xB2E2, + 27980 - 11905: 0x9BB9, + 27981 - 11905: 0xE4AB, + 27982 - 11905: 0xBCC3, + 27983 - 11905: 0xE4AF, + 27984 - 11905: 0x9BBA, + 27985 - 11905: 0xBBEB, + 27986 - 11905: 0xE4B0, + 27987 - 11905: 0xC5A8, + 27988 - 11905: 0xE4B1, + 27989 - 11905: 0x9BBB, + 27990 - 11905: 0x9BBC, + 27991 - 11905: 0x9BBD, + 27992 - 11905: 0x9BBE, + 27993 - 11905: 0xD5E3, + 27994 - 11905: 0xBFA3, + 27995 - 11905: 0x9BBF, + 27996 - 11905: 0xE4BA, + 27997 - 11905: 0x9BC0, + 27998 - 11905: 0xE4B7, + 27999 - 11905: 0x9BC1, + 28000 - 11905: 0xE4BB, + 28001 - 11905: 0x9BC2, + 28002 - 11905: 0x9BC3, + 28003 - 11905: 0xE4BD, + 28004 - 11905: 0x9BC4, + 28005 - 11905: 0x9BC5, + 28006 - 11905: 0xC6D6, + 28007 - 11905: 0x9BC6, + 28008 - 11905: 0x9BC7, + 28009 - 11905: 0xBAC6, + 28010 - 11905: 0xC0CB, + 28011 - 11905: 0x9BC8, + 28012 - 11905: 0x9BC9, + 28013 - 11905: 0x9BCA, + 28014 - 11905: 0xB8A1, + 28015 - 11905: 0xE4B4, + 28016 - 11905: 0x9BCB, + 28017 - 11905: 0x9BCC, + 28018 - 11905: 0x9BCD, + 28019 - 11905: 0x9BCE, + 28020 - 11905: 0xD4A1, + 28021 - 11905: 0x9BCF, + 28022 - 11905: 0x9BD0, + 28023 - 11905: 0xBAA3, + 28024 - 11905: 0xBDFE, + 28025 - 11905: 0x9BD1, + 28026 - 11905: 0x9BD2, + 28027 - 11905: 0x9BD3, + 28028 - 11905: 0xE4BC, + 28029 - 11905: 0x9BD4, + 28030 - 11905: 0x9BD5, + 28031 - 11905: 0x9BD6, + 28032 - 11905: 0x9BD7, + 28033 - 11905: 0x9BD8, + 28034 - 11905: 0xCDBF, + 28035 - 11905: 0x9BD9, + 28036 - 11905: 0x9BDA, + 28037 - 11905: 0xC4F9, + 28038 - 11905: 0x9BDB, + 28039 - 11905: 0x9BDC, + 28040 - 11905: 0xCFFB, + 28041 - 11905: 0xC9E6, + 28042 - 11905: 0x9BDD, + 28043 - 11905: 0x9BDE, + 28044 - 11905: 0xD3BF, + 28045 - 11905: 0x9BDF, + 28046 - 11905: 0xCFD1, + 28047 - 11905: 0x9BE0, + 28048 - 11905: 0x9BE1, + 28049 - 11905: 0xE4B3, + 28050 - 11905: 0x9BE2, + 28051 - 11905: 0xE4B8, + 28052 - 11905: 0xE4B9, + 28053 - 11905: 0xCCE9, + 28054 - 11905: 0x9BE3, + 28055 - 11905: 0x9BE4, + 28056 - 11905: 0x9BE5, + 28057 - 11905: 0x9BE6, + 28058 - 11905: 0x9BE7, + 28059 - 11905: 0xCCCE, + 28060 - 11905: 0x9BE8, + 28061 - 11905: 0xC0D4, + 28062 - 11905: 0xE4B5, + 28063 - 11905: 0xC1B0, + 28064 - 11905: 0xE4B6, + 28065 - 11905: 0xCED0, + 28066 - 11905: 0x9BE9, + 28067 - 11905: 0xBBC1, + 28068 - 11905: 0xB5D3, + 28069 - 11905: 0x9BEA, + 28070 - 11905: 0xC8F3, + 28071 - 11905: 0xBDA7, + 28072 - 11905: 0xD5C7, + 28073 - 11905: 0xC9AC, + 28074 - 11905: 0xB8A2, + 28075 - 11905: 0xE4CA, + 28076 - 11905: 0x9BEB, + 28077 - 11905: 0x9BEC, + 28078 - 11905: 0xE4CC, + 28079 - 11905: 0xD1C4, + 28080 - 11905: 0x9BED, + 28081 - 11905: 0x9BEE, + 28082 - 11905: 0xD2BA, + 28083 - 11905: 0x9BEF, + 28084 - 11905: 0x9BF0, + 28085 - 11905: 0xBAAD, + 28086 - 11905: 0x9BF1, + 28087 - 11905: 0x9BF2, + 28088 - 11905: 0xBAD4, + 28089 - 11905: 0x9BF3, + 28090 - 11905: 0x9BF4, + 28091 - 11905: 0x9BF5, + 28092 - 11905: 0x9BF6, + 28093 - 11905: 0x9BF7, + 28094 - 11905: 0x9BF8, + 28095 - 11905: 0xE4C3, + 28096 - 11905: 0xB5ED, + 28097 - 11905: 0x9BF9, + 28098 - 11905: 0x9BFA, + 28099 - 11905: 0x9BFB, + 28100 - 11905: 0xD7CD, + 28101 - 11905: 0xE4C0, + 28102 - 11905: 0xCFFD, + 28103 - 11905: 0xE4BF, + 28104 - 11905: 0x9BFC, + 28105 - 11905: 0x9BFD, + 28106 - 11905: 0x9BFE, + 28107 - 11905: 0xC1DC, + 28108 - 11905: 0xCCCA, + 28109 - 11905: 0x9C40, + 28110 - 11905: 0x9C41, + 28111 - 11905: 0x9C42, + 28112 - 11905: 0x9C43, + 28113 - 11905: 0xCAE7, + 28114 - 11905: 0x9C44, + 28115 - 11905: 0x9C45, + 28116 - 11905: 0x9C46, + 28117 - 11905: 0x9C47, + 28118 - 11905: 0xC4D7, + 28119 - 11905: 0x9C48, + 28120 - 11905: 0xCCD4, + 28121 - 11905: 0xE4C8, + 28122 - 11905: 0x9C49, + 28123 - 11905: 0x9C4A, + 28124 - 11905: 0x9C4B, + 28125 - 11905: 0xE4C7, + 28126 - 11905: 0xE4C1, + 28127 - 11905: 0x9C4C, + 28128 - 11905: 0xE4C4, + 28129 - 11905: 0xB5AD, + 28130 - 11905: 0x9C4D, + 28131 - 11905: 0x9C4E, + 28132 - 11905: 0xD3D9, + 28133 - 11905: 0x9C4F, + 28134 - 11905: 0xE4C6, + 28135 - 11905: 0x9C50, + 28136 - 11905: 0x9C51, + 28137 - 11905: 0x9C52, + 28138 - 11905: 0x9C53, + 28139 - 11905: 0xD2F9, + 28140 - 11905: 0xB4E3, + 28141 - 11905: 0x9C54, + 28142 - 11905: 0xBBB4, + 28143 - 11905: 0x9C55, + 28144 - 11905: 0x9C56, + 28145 - 11905: 0xC9EE, + 28146 - 11905: 0x9C57, + 28147 - 11905: 0xB4BE, + 28148 - 11905: 0x9C58, + 28149 - 11905: 0x9C59, + 28150 - 11905: 0x9C5A, + 28151 - 11905: 0xBBEC, + 28152 - 11905: 0x9C5B, + 28153 - 11905: 0xD1CD, + 28154 - 11905: 0x9C5C, + 28155 - 11905: 0xCCED, + 28156 - 11905: 0xEDB5, + 28157 - 11905: 0x9C5D, + 28158 - 11905: 0x9C5E, + 28159 - 11905: 0x9C5F, + 28160 - 11905: 0x9C60, + 28161 - 11905: 0x9C61, + 28162 - 11905: 0x9C62, + 28163 - 11905: 0x9C63, + 28164 - 11905: 0x9C64, + 28165 - 11905: 0xC7E5, + 28166 - 11905: 0x9C65, + 28167 - 11905: 0x9C66, + 28168 - 11905: 0x9C67, + 28169 - 11905: 0x9C68, + 28170 - 11905: 0xD4A8, + 28171 - 11905: 0x9C69, + 28172 - 11905: 0xE4CB, + 28173 - 11905: 0xD7D5, + 28174 - 11905: 0xE4C2, + 28175 - 11905: 0x9C6A, + 28176 - 11905: 0xBDA5, + 28177 - 11905: 0xE4C5, + 28178 - 11905: 0x9C6B, + 28179 - 11905: 0x9C6C, + 28180 - 11905: 0xD3E6, + 28181 - 11905: 0x9C6D, + 28182 - 11905: 0xE4C9, + 28183 - 11905: 0xC9F8, + 28184 - 11905: 0x9C6E, + 28185 - 11905: 0x9C6F, + 28186 - 11905: 0xE4BE, + 28187 - 11905: 0x9C70, + 28188 - 11905: 0x9C71, + 28189 - 11905: 0xD3E5, + 28190 - 11905: 0x9C72, + 28191 - 11905: 0x9C73, + 28192 - 11905: 0xC7FE, + 28193 - 11905: 0xB6C9, + 28194 - 11905: 0x9C74, + 28195 - 11905: 0xD4FC, + 28196 - 11905: 0xB2B3, + 28197 - 11905: 0xE4D7, + 28198 - 11905: 0x9C75, + 28199 - 11905: 0x9C76, + 28200 - 11905: 0x9C77, + 28201 - 11905: 0xCEC2, + 28202 - 11905: 0x9C78, + 28203 - 11905: 0xE4CD, + 28204 - 11905: 0x9C79, + 28205 - 11905: 0xCEBC, + 28206 - 11905: 0x9C7A, + 28207 - 11905: 0xB8DB, + 28208 - 11905: 0x9C7B, + 28209 - 11905: 0x9C7C, + 28210 - 11905: 0xE4D6, + 28211 - 11905: 0x9C7D, + 28212 - 11905: 0xBFCA, + 28213 - 11905: 0x9C7E, + 28214 - 11905: 0x9C80, + 28215 - 11905: 0x9C81, + 28216 - 11905: 0xD3CE, + 28217 - 11905: 0x9C82, + 28218 - 11905: 0xC3EC, + 28219 - 11905: 0x9C83, + 28220 - 11905: 0x9C84, + 28221 - 11905: 0x9C85, + 28222 - 11905: 0x9C86, + 28223 - 11905: 0x9C87, + 28224 - 11905: 0x9C88, + 28225 - 11905: 0x9C89, + 28226 - 11905: 0x9C8A, + 28227 - 11905: 0xC5C8, + 28228 - 11905: 0xE4D8, + 28229 - 11905: 0x9C8B, + 28230 - 11905: 0x9C8C, + 28231 - 11905: 0x9C8D, + 28232 - 11905: 0x9C8E, + 28233 - 11905: 0x9C8F, + 28234 - 11905: 0x9C90, + 28235 - 11905: 0x9C91, + 28236 - 11905: 0x9C92, + 28237 - 11905: 0xCDC4, + 28238 - 11905: 0xE4CF, + 28239 - 11905: 0x9C93, + 28240 - 11905: 0x9C94, + 28241 - 11905: 0x9C95, + 28242 - 11905: 0x9C96, + 28243 - 11905: 0xE4D4, + 28244 - 11905: 0xE4D5, + 28245 - 11905: 0x9C97, + 28246 - 11905: 0xBAFE, + 28247 - 11905: 0x9C98, + 28248 - 11905: 0xCFE6, + 28249 - 11905: 0x9C99, + 28250 - 11905: 0x9C9A, + 28251 - 11905: 0xD5BF, + 28252 - 11905: 0x9C9B, + 28253 - 11905: 0x9C9C, + 28254 - 11905: 0x9C9D, + 28255 - 11905: 0xE4D2, + 28256 - 11905: 0x9C9E, + 28257 - 11905: 0x9C9F, + 28258 - 11905: 0x9CA0, + 28259 - 11905: 0x9CA1, + 28260 - 11905: 0x9CA2, + 28261 - 11905: 0x9CA3, + 28262 - 11905: 0x9CA4, + 28263 - 11905: 0x9CA5, + 28264 - 11905: 0x9CA6, + 28265 - 11905: 0x9CA7, + 28266 - 11905: 0x9CA8, + 28267 - 11905: 0xE4D0, + 28268 - 11905: 0x9CA9, + 28269 - 11905: 0x9CAA, + 28270 - 11905: 0xE4CE, + 28271 - 11905: 0x9CAB, + 28272 - 11905: 0x9CAC, + 28273 - 11905: 0x9CAD, + 28274 - 11905: 0x9CAE, + 28275 - 11905: 0x9CAF, + 28276 - 11905: 0x9CB0, + 28277 - 11905: 0x9CB1, + 28278 - 11905: 0x9CB2, + 28279 - 11905: 0x9CB3, + 28280 - 11905: 0x9CB4, + 28281 - 11905: 0x9CB5, + 28282 - 11905: 0x9CB6, + 28283 - 11905: 0x9CB7, + 28284 - 11905: 0x9CB8, + 28285 - 11905: 0x9CB9, + 28286 - 11905: 0xCDE5, + 28287 - 11905: 0xCAAA, + 28288 - 11905: 0x9CBA, + 28289 - 11905: 0x9CBB, + 28290 - 11905: 0x9CBC, + 28291 - 11905: 0xC0A3, + 28292 - 11905: 0x9CBD, + 28293 - 11905: 0xBDA6, + 28294 - 11905: 0xE4D3, + 28295 - 11905: 0x9CBE, + 28296 - 11905: 0x9CBF, + 28297 - 11905: 0xB8C8, + 28298 - 11905: 0x9CC0, + 28299 - 11905: 0x9CC1, + 28300 - 11905: 0x9CC2, + 28301 - 11905: 0x9CC3, + 28302 - 11905: 0x9CC4, + 28303 - 11905: 0xE4E7, + 28304 - 11905: 0xD4B4, + 28305 - 11905: 0x9CC5, + 28306 - 11905: 0x9CC6, + 28307 - 11905: 0x9CC7, + 28308 - 11905: 0x9CC8, + 28309 - 11905: 0x9CC9, + 28310 - 11905: 0x9CCA, + 28311 - 11905: 0x9CCB, + 28312 - 11905: 0xE4DB, + 28313 - 11905: 0x9CCC, + 28314 - 11905: 0x9CCD, + 28315 - 11905: 0x9CCE, + 28316 - 11905: 0xC1EF, + 28317 - 11905: 0x9CCF, + 28318 - 11905: 0x9CD0, + 28319 - 11905: 0xE4E9, + 28320 - 11905: 0x9CD1, + 28321 - 11905: 0x9CD2, + 28322 - 11905: 0xD2E7, + 28323 - 11905: 0x9CD3, + 28324 - 11905: 0x9CD4, + 28325 - 11905: 0xE4DF, + 28326 - 11905: 0x9CD5, + 28327 - 11905: 0xE4E0, + 28328 - 11905: 0x9CD6, + 28329 - 11905: 0x9CD7, + 28330 - 11905: 0xCFAA, + 28331 - 11905: 0x9CD8, + 28332 - 11905: 0x9CD9, + 28333 - 11905: 0x9CDA, + 28334 - 11905: 0x9CDB, + 28335 - 11905: 0xCBDD, + 28336 - 11905: 0x9CDC, + 28337 - 11905: 0xE4DA, + 28338 - 11905: 0xE4D1, + 28339 - 11905: 0x9CDD, + 28340 - 11905: 0xE4E5, + 28341 - 11905: 0x9CDE, + 28342 - 11905: 0xC8DC, + 28343 - 11905: 0xE4E3, + 28344 - 11905: 0x9CDF, + 28345 - 11905: 0x9CE0, + 28346 - 11905: 0xC4E7, + 28347 - 11905: 0xE4E2, + 28348 - 11905: 0x9CE1, + 28349 - 11905: 0xE4E1, + 28350 - 11905: 0x9CE2, + 28351 - 11905: 0x9CE3, + 28352 - 11905: 0x9CE4, + 28353 - 11905: 0xB3FC, + 28354 - 11905: 0xE4E8, + 28355 - 11905: 0x9CE5, + 28356 - 11905: 0x9CE6, + 28357 - 11905: 0x9CE7, + 28358 - 11905: 0x9CE8, + 28359 - 11905: 0xB5E1, + 28360 - 11905: 0x9CE9, + 28361 - 11905: 0x9CEA, + 28362 - 11905: 0x9CEB, + 28363 - 11905: 0xD7CC, + 28364 - 11905: 0x9CEC, + 28365 - 11905: 0x9CED, + 28366 - 11905: 0x9CEE, + 28367 - 11905: 0xE4E6, + 28368 - 11905: 0x9CEF, + 28369 - 11905: 0xBBAC, + 28370 - 11905: 0x9CF0, + 28371 - 11905: 0xD7D2, + 28372 - 11905: 0xCCCF, + 28373 - 11905: 0xEBF8, + 28374 - 11905: 0x9CF1, + 28375 - 11905: 0xE4E4, + 28376 - 11905: 0x9CF2, + 28377 - 11905: 0x9CF3, + 28378 - 11905: 0xB9F6, + 28379 - 11905: 0x9CF4, + 28380 - 11905: 0x9CF5, + 28381 - 11905: 0x9CF6, + 28382 - 11905: 0xD6CD, + 28383 - 11905: 0xE4D9, + 28384 - 11905: 0xE4DC, + 28385 - 11905: 0xC2FA, + 28386 - 11905: 0xE4DE, + 28387 - 11905: 0x9CF7, + 28388 - 11905: 0xC2CB, + 28389 - 11905: 0xC0C4, + 28390 - 11905: 0xC2D0, + 28391 - 11905: 0x9CF8, + 28392 - 11905: 0xB1F5, + 28393 - 11905: 0xCCB2, + 28394 - 11905: 0x9CF9, + 28395 - 11905: 0x9CFA, + 28396 - 11905: 0x9CFB, + 28397 - 11905: 0x9CFC, + 28398 - 11905: 0x9CFD, + 28399 - 11905: 0x9CFE, + 28400 - 11905: 0x9D40, + 28401 - 11905: 0x9D41, + 28402 - 11905: 0x9D42, + 28403 - 11905: 0x9D43, + 28404 - 11905: 0xB5CE, + 28405 - 11905: 0x9D44, + 28406 - 11905: 0x9D45, + 28407 - 11905: 0x9D46, + 28408 - 11905: 0x9D47, + 28409 - 11905: 0xE4EF, + 28410 - 11905: 0x9D48, + 28411 - 11905: 0x9D49, + 28412 - 11905: 0x9D4A, + 28413 - 11905: 0x9D4B, + 28414 - 11905: 0x9D4C, + 28415 - 11905: 0x9D4D, + 28416 - 11905: 0x9D4E, + 28417 - 11905: 0x9D4F, + 28418 - 11905: 0xC6AF, + 28419 - 11905: 0x9D50, + 28420 - 11905: 0x9D51, + 28421 - 11905: 0x9D52, + 28422 - 11905: 0xC6E1, + 28423 - 11905: 0x9D53, + 28424 - 11905: 0x9D54, + 28425 - 11905: 0xE4F5, + 28426 - 11905: 0x9D55, + 28427 - 11905: 0x9D56, + 28428 - 11905: 0x9D57, + 28429 - 11905: 0x9D58, + 28430 - 11905: 0x9D59, + 28431 - 11905: 0xC2A9, + 28432 - 11905: 0x9D5A, + 28433 - 11905: 0x9D5B, + 28434 - 11905: 0x9D5C, + 28435 - 11905: 0xC0EC, + 28436 - 11905: 0xD1DD, + 28437 - 11905: 0xE4EE, + 28438 - 11905: 0x9D5D, + 28439 - 11905: 0x9D5E, + 28440 - 11905: 0x9D5F, + 28441 - 11905: 0x9D60, + 28442 - 11905: 0x9D61, + 28443 - 11905: 0x9D62, + 28444 - 11905: 0x9D63, + 28445 - 11905: 0x9D64, + 28446 - 11905: 0x9D65, + 28447 - 11905: 0x9D66, + 28448 - 11905: 0xC4AE, + 28449 - 11905: 0x9D67, + 28450 - 11905: 0x9D68, + 28451 - 11905: 0x9D69, + 28452 - 11905: 0xE4ED, + 28453 - 11905: 0x9D6A, + 28454 - 11905: 0x9D6B, + 28455 - 11905: 0x9D6C, + 28456 - 11905: 0x9D6D, + 28457 - 11905: 0xE4F6, + 28458 - 11905: 0xE4F4, + 28459 - 11905: 0xC2FE, + 28460 - 11905: 0x9D6E, + 28461 - 11905: 0xE4DD, + 28462 - 11905: 0x9D6F, + 28463 - 11905: 0xE4F0, + 28464 - 11905: 0x9D70, + 28465 - 11905: 0xCAFE, + 28466 - 11905: 0x9D71, + 28467 - 11905: 0xD5C4, + 28468 - 11905: 0x9D72, + 28469 - 11905: 0x9D73, + 28470 - 11905: 0xE4F1, + 28471 - 11905: 0x9D74, + 28472 - 11905: 0x9D75, + 28473 - 11905: 0x9D76, + 28474 - 11905: 0x9D77, + 28475 - 11905: 0x9D78, + 28476 - 11905: 0x9D79, + 28477 - 11905: 0x9D7A, + 28478 - 11905: 0xD1FA, + 28479 - 11905: 0x9D7B, + 28480 - 11905: 0x9D7C, + 28481 - 11905: 0x9D7D, + 28482 - 11905: 0x9D7E, + 28483 - 11905: 0x9D80, + 28484 - 11905: 0x9D81, + 28485 - 11905: 0x9D82, + 28486 - 11905: 0xE4EB, + 28487 - 11905: 0xE4EC, + 28488 - 11905: 0x9D83, + 28489 - 11905: 0x9D84, + 28490 - 11905: 0x9D85, + 28491 - 11905: 0xE4F2, + 28492 - 11905: 0x9D86, + 28493 - 11905: 0xCEAB, + 28494 - 11905: 0x9D87, + 28495 - 11905: 0x9D88, + 28496 - 11905: 0x9D89, + 28497 - 11905: 0x9D8A, + 28498 - 11905: 0x9D8B, + 28499 - 11905: 0x9D8C, + 28500 - 11905: 0x9D8D, + 28501 - 11905: 0x9D8E, + 28502 - 11905: 0x9D8F, + 28503 - 11905: 0x9D90, + 28504 - 11905: 0xC5CB, + 28505 - 11905: 0x9D91, + 28506 - 11905: 0x9D92, + 28507 - 11905: 0x9D93, + 28508 - 11905: 0xC7B1, + 28509 - 11905: 0x9D94, + 28510 - 11905: 0xC2BA, + 28511 - 11905: 0x9D95, + 28512 - 11905: 0x9D96, + 28513 - 11905: 0x9D97, + 28514 - 11905: 0xE4EA, + 28515 - 11905: 0x9D98, + 28516 - 11905: 0x9D99, + 28517 - 11905: 0x9D9A, + 28518 - 11905: 0xC1CA, + 28519 - 11905: 0x9D9B, + 28520 - 11905: 0x9D9C, + 28521 - 11905: 0x9D9D, + 28522 - 11905: 0x9D9E, + 28523 - 11905: 0x9D9F, + 28524 - 11905: 0x9DA0, + 28525 - 11905: 0xCCB6, + 28526 - 11905: 0xB3B1, + 28527 - 11905: 0x9DA1, + 28528 - 11905: 0x9DA2, + 28529 - 11905: 0x9DA3, + 28530 - 11905: 0xE4FB, + 28531 - 11905: 0x9DA4, + 28532 - 11905: 0xE4F3, + 28533 - 11905: 0x9DA5, + 28534 - 11905: 0x9DA6, + 28535 - 11905: 0x9DA7, + 28536 - 11905: 0xE4FA, + 28537 - 11905: 0x9DA8, + 28538 - 11905: 0xE4FD, + 28539 - 11905: 0x9DA9, + 28540 - 11905: 0xE4FC, + 28541 - 11905: 0x9DAA, + 28542 - 11905: 0x9DAB, + 28543 - 11905: 0x9DAC, + 28544 - 11905: 0x9DAD, + 28545 - 11905: 0x9DAE, + 28546 - 11905: 0x9DAF, + 28547 - 11905: 0x9DB0, + 28548 - 11905: 0xB3CE, + 28549 - 11905: 0x9DB1, + 28550 - 11905: 0x9DB2, + 28551 - 11905: 0x9DB3, + 28552 - 11905: 0xB3BA, + 28553 - 11905: 0xE4F7, + 28554 - 11905: 0x9DB4, + 28555 - 11905: 0x9DB5, + 28556 - 11905: 0xE4F9, + 28557 - 11905: 0xE4F8, + 28558 - 11905: 0xC5EC, + 28559 - 11905: 0x9DB6, + 28560 - 11905: 0x9DB7, + 28561 - 11905: 0x9DB8, + 28562 - 11905: 0x9DB9, + 28563 - 11905: 0x9DBA, + 28564 - 11905: 0x9DBB, + 28565 - 11905: 0x9DBC, + 28566 - 11905: 0x9DBD, + 28567 - 11905: 0x9DBE, + 28568 - 11905: 0x9DBF, + 28569 - 11905: 0x9DC0, + 28570 - 11905: 0x9DC1, + 28571 - 11905: 0x9DC2, + 28572 - 11905: 0xC0BD, + 28573 - 11905: 0x9DC3, + 28574 - 11905: 0x9DC4, + 28575 - 11905: 0x9DC5, + 28576 - 11905: 0x9DC6, + 28577 - 11905: 0xD4E8, + 28578 - 11905: 0x9DC7, + 28579 - 11905: 0x9DC8, + 28580 - 11905: 0x9DC9, + 28581 - 11905: 0x9DCA, + 28582 - 11905: 0x9DCB, + 28583 - 11905: 0xE5A2, + 28584 - 11905: 0x9DCC, + 28585 - 11905: 0x9DCD, + 28586 - 11905: 0x9DCE, + 28587 - 11905: 0x9DCF, + 28588 - 11905: 0x9DD0, + 28589 - 11905: 0x9DD1, + 28590 - 11905: 0x9DD2, + 28591 - 11905: 0x9DD3, + 28592 - 11905: 0x9DD4, + 28593 - 11905: 0x9DD5, + 28594 - 11905: 0x9DD6, + 28595 - 11905: 0xB0C4, + 28596 - 11905: 0x9DD7, + 28597 - 11905: 0x9DD8, + 28598 - 11905: 0xE5A4, + 28599 - 11905: 0x9DD9, + 28600 - 11905: 0x9DDA, + 28601 - 11905: 0xE5A3, + 28602 - 11905: 0x9DDB, + 28603 - 11905: 0x9DDC, + 28604 - 11905: 0x9DDD, + 28605 - 11905: 0x9DDE, + 28606 - 11905: 0x9DDF, + 28607 - 11905: 0x9DE0, + 28608 - 11905: 0xBCA4, + 28609 - 11905: 0x9DE1, + 28610 - 11905: 0xE5A5, + 28611 - 11905: 0x9DE2, + 28612 - 11905: 0x9DE3, + 28613 - 11905: 0x9DE4, + 28614 - 11905: 0x9DE5, + 28615 - 11905: 0x9DE6, + 28616 - 11905: 0x9DE7, + 28617 - 11905: 0xE5A1, + 28618 - 11905: 0x9DE8, + 28619 - 11905: 0x9DE9, + 28620 - 11905: 0x9DEA, + 28621 - 11905: 0x9DEB, + 28622 - 11905: 0x9DEC, + 28623 - 11905: 0x9DED, + 28624 - 11905: 0x9DEE, + 28625 - 11905: 0xE4FE, + 28626 - 11905: 0xB1F4, + 28627 - 11905: 0x9DEF, + 28628 - 11905: 0x9DF0, + 28629 - 11905: 0x9DF1, + 28630 - 11905: 0x9DF2, + 28631 - 11905: 0x9DF3, + 28632 - 11905: 0x9DF4, + 28633 - 11905: 0x9DF5, + 28634 - 11905: 0x9DF6, + 28635 - 11905: 0x9DF7, + 28636 - 11905: 0x9DF8, + 28637 - 11905: 0x9DF9, + 28638 - 11905: 0xE5A8, + 28639 - 11905: 0x9DFA, + 28640 - 11905: 0xE5A9, + 28641 - 11905: 0xE5A6, + 28642 - 11905: 0x9DFB, + 28643 - 11905: 0x9DFC, + 28644 - 11905: 0x9DFD, + 28645 - 11905: 0x9DFE, + 28646 - 11905: 0x9E40, + 28647 - 11905: 0x9E41, + 28648 - 11905: 0x9E42, + 28649 - 11905: 0x9E43, + 28650 - 11905: 0x9E44, + 28651 - 11905: 0x9E45, + 28652 - 11905: 0x9E46, + 28653 - 11905: 0x9E47, + 28654 - 11905: 0xE5A7, + 28655 - 11905: 0xE5AA, + 28656 - 11905: 0x9E48, + 28657 - 11905: 0x9E49, + 28658 - 11905: 0x9E4A, + 28659 - 11905: 0x9E4B, + 28660 - 11905: 0x9E4C, + 28661 - 11905: 0x9E4D, + 28662 - 11905: 0x9E4E, + 28663 - 11905: 0x9E4F, + 28664 - 11905: 0x9E50, + 28665 - 11905: 0x9E51, + 28666 - 11905: 0x9E52, + 28667 - 11905: 0x9E53, + 28668 - 11905: 0x9E54, + 28669 - 11905: 0x9E55, + 28670 - 11905: 0x9E56, + 28671 - 11905: 0x9E57, + 28672 - 11905: 0x9E58, + 28673 - 11905: 0x9E59, + 28674 - 11905: 0x9E5A, + 28675 - 11905: 0x9E5B, + 28676 - 11905: 0x9E5C, + 28677 - 11905: 0x9E5D, + 28678 - 11905: 0x9E5E, + 28679 - 11905: 0x9E5F, + 28680 - 11905: 0x9E60, + 28681 - 11905: 0x9E61, + 28682 - 11905: 0x9E62, + 28683 - 11905: 0x9E63, + 28684 - 11905: 0x9E64, + 28685 - 11905: 0x9E65, + 28686 - 11905: 0x9E66, + 28687 - 11905: 0x9E67, + 28688 - 11905: 0x9E68, + 28689 - 11905: 0xC6D9, + 28690 - 11905: 0x9E69, + 28691 - 11905: 0x9E6A, + 28692 - 11905: 0x9E6B, + 28693 - 11905: 0x9E6C, + 28694 - 11905: 0x9E6D, + 28695 - 11905: 0x9E6E, + 28696 - 11905: 0x9E6F, + 28697 - 11905: 0x9E70, + 28698 - 11905: 0xE5AB, + 28699 - 11905: 0xE5AD, + 28700 - 11905: 0x9E71, + 28701 - 11905: 0x9E72, + 28702 - 11905: 0x9E73, + 28703 - 11905: 0x9E74, + 28704 - 11905: 0x9E75, + 28705 - 11905: 0x9E76, + 28706 - 11905: 0x9E77, + 28707 - 11905: 0xE5AC, + 28708 - 11905: 0x9E78, + 28709 - 11905: 0x9E79, + 28710 - 11905: 0x9E7A, + 28711 - 11905: 0x9E7B, + 28712 - 11905: 0x9E7C, + 28713 - 11905: 0x9E7D, + 28714 - 11905: 0x9E7E, + 28715 - 11905: 0x9E80, + 28716 - 11905: 0x9E81, + 28717 - 11905: 0x9E82, + 28718 - 11905: 0x9E83, + 28719 - 11905: 0x9E84, + 28720 - 11905: 0x9E85, + 28721 - 11905: 0x9E86, + 28722 - 11905: 0x9E87, + 28723 - 11905: 0x9E88, + 28724 - 11905: 0x9E89, + 28725 - 11905: 0xE5AF, + 28726 - 11905: 0x9E8A, + 28727 - 11905: 0x9E8B, + 28728 - 11905: 0x9E8C, + 28729 - 11905: 0xE5AE, + 28730 - 11905: 0x9E8D, + 28731 - 11905: 0x9E8E, + 28732 - 11905: 0x9E8F, + 28733 - 11905: 0x9E90, + 28734 - 11905: 0x9E91, + 28735 - 11905: 0x9E92, + 28736 - 11905: 0x9E93, + 28737 - 11905: 0x9E94, + 28738 - 11905: 0x9E95, + 28739 - 11905: 0x9E96, + 28740 - 11905: 0x9E97, + 28741 - 11905: 0x9E98, + 28742 - 11905: 0x9E99, + 28743 - 11905: 0x9E9A, + 28744 - 11905: 0x9E9B, + 28745 - 11905: 0x9E9C, + 28746 - 11905: 0x9E9D, + 28747 - 11905: 0x9E9E, + 28748 - 11905: 0xB9E0, + 28749 - 11905: 0x9E9F, + 28750 - 11905: 0x9EA0, + 28751 - 11905: 0xE5B0, + 28752 - 11905: 0x9EA1, + 28753 - 11905: 0x9EA2, + 28754 - 11905: 0x9EA3, + 28755 - 11905: 0x9EA4, + 28756 - 11905: 0x9EA5, + 28757 - 11905: 0x9EA6, + 28758 - 11905: 0x9EA7, + 28759 - 11905: 0x9EA8, + 28760 - 11905: 0x9EA9, + 28761 - 11905: 0x9EAA, + 28762 - 11905: 0x9EAB, + 28763 - 11905: 0x9EAC, + 28764 - 11905: 0x9EAD, + 28765 - 11905: 0x9EAE, + 28766 - 11905: 0xE5B1, + 28767 - 11905: 0x9EAF, + 28768 - 11905: 0x9EB0, + 28769 - 11905: 0x9EB1, + 28770 - 11905: 0x9EB2, + 28771 - 11905: 0x9EB3, + 28772 - 11905: 0x9EB4, + 28773 - 11905: 0x9EB5, + 28774 - 11905: 0x9EB6, + 28775 - 11905: 0x9EB7, + 28776 - 11905: 0x9EB8, + 28777 - 11905: 0x9EB9, + 28778 - 11905: 0x9EBA, + 28779 - 11905: 0xBBF0, + 28780 - 11905: 0xECE1, + 28781 - 11905: 0xC3F0, + 28782 - 11905: 0x9EBB, + 28783 - 11905: 0xB5C6, + 28784 - 11905: 0xBBD2, + 28785 - 11905: 0x9EBC, + 28786 - 11905: 0x9EBD, + 28787 - 11905: 0x9EBE, + 28788 - 11905: 0x9EBF, + 28789 - 11905: 0xC1E9, + 28790 - 11905: 0xD4EE, + 28791 - 11905: 0x9EC0, + 28792 - 11905: 0xBEC4, + 28793 - 11905: 0x9EC1, + 28794 - 11905: 0x9EC2, + 28795 - 11905: 0x9EC3, + 28796 - 11905: 0xD7C6, + 28797 - 11905: 0x9EC4, + 28798 - 11905: 0xD4D6, + 28799 - 11905: 0xB2D3, + 28800 - 11905: 0xECBE, + 28801 - 11905: 0x9EC5, + 28802 - 11905: 0x9EC6, + 28803 - 11905: 0x9EC7, + 28804 - 11905: 0x9EC8, + 28805 - 11905: 0xEAC1, + 28806 - 11905: 0x9EC9, + 28807 - 11905: 0x9ECA, + 28808 - 11905: 0x9ECB, + 28809 - 11905: 0xC2AF, + 28810 - 11905: 0xB4B6, + 28811 - 11905: 0x9ECC, + 28812 - 11905: 0x9ECD, + 28813 - 11905: 0x9ECE, + 28814 - 11905: 0xD1D7, + 28815 - 11905: 0x9ECF, + 28816 - 11905: 0x9ED0, + 28817 - 11905: 0x9ED1, + 28818 - 11905: 0xB3B4, + 28819 - 11905: 0x9ED2, + 28820 - 11905: 0xC8B2, + 28821 - 11905: 0xBFBB, + 28822 - 11905: 0xECC0, + 28823 - 11905: 0x9ED3, + 28824 - 11905: 0x9ED4, + 28825 - 11905: 0xD6CB, + 28826 - 11905: 0x9ED5, + 28827 - 11905: 0x9ED6, + 28828 - 11905: 0xECBF, + 28829 - 11905: 0xECC1, + 28830 - 11905: 0x9ED7, + 28831 - 11905: 0x9ED8, + 28832 - 11905: 0x9ED9, + 28833 - 11905: 0x9EDA, + 28834 - 11905: 0x9EDB, + 28835 - 11905: 0x9EDC, + 28836 - 11905: 0x9EDD, + 28837 - 11905: 0x9EDE, + 28838 - 11905: 0x9EDF, + 28839 - 11905: 0x9EE0, + 28840 - 11905: 0x9EE1, + 28841 - 11905: 0x9EE2, + 28842 - 11905: 0x9EE3, + 28843 - 11905: 0xECC5, + 28844 - 11905: 0xBEE6, + 28845 - 11905: 0xCCBF, + 28846 - 11905: 0xC5DA, + 28847 - 11905: 0xBEBC, + 28848 - 11905: 0x9EE4, + 28849 - 11905: 0xECC6, + 28850 - 11905: 0x9EE5, + 28851 - 11905: 0xB1FE, + 28852 - 11905: 0x9EE6, + 28853 - 11905: 0x9EE7, + 28854 - 11905: 0x9EE8, + 28855 - 11905: 0xECC4, + 28856 - 11905: 0xD5A8, + 28857 - 11905: 0xB5E3, + 28858 - 11905: 0x9EE9, + 28859 - 11905: 0xECC2, + 28860 - 11905: 0xC1B6, + 28861 - 11905: 0xB3E3, + 28862 - 11905: 0x9EEA, + 28863 - 11905: 0x9EEB, + 28864 - 11905: 0xECC3, + 28865 - 11905: 0xCBB8, + 28866 - 11905: 0xC0C3, + 28867 - 11905: 0xCCFE, + 28868 - 11905: 0x9EEC, + 28869 - 11905: 0x9EED, + 28870 - 11905: 0x9EEE, + 28871 - 11905: 0x9EEF, + 28872 - 11905: 0xC1D2, + 28873 - 11905: 0x9EF0, + 28874 - 11905: 0xECC8, + 28875 - 11905: 0x9EF1, + 28876 - 11905: 0x9EF2, + 28877 - 11905: 0x9EF3, + 28878 - 11905: 0x9EF4, + 28879 - 11905: 0x9EF5, + 28880 - 11905: 0x9EF6, + 28881 - 11905: 0x9EF7, + 28882 - 11905: 0x9EF8, + 28883 - 11905: 0x9EF9, + 28884 - 11905: 0x9EFA, + 28885 - 11905: 0x9EFB, + 28886 - 11905: 0x9EFC, + 28887 - 11905: 0x9EFD, + 28888 - 11905: 0xBAE6, + 28889 - 11905: 0xC0D3, + 28890 - 11905: 0x9EFE, + 28891 - 11905: 0xD6F2, + 28892 - 11905: 0x9F40, + 28893 - 11905: 0x9F41, + 28894 - 11905: 0x9F42, + 28895 - 11905: 0xD1CC, + 28896 - 11905: 0x9F43, + 28897 - 11905: 0x9F44, + 28898 - 11905: 0x9F45, + 28899 - 11905: 0x9F46, + 28900 - 11905: 0xBFBE, + 28901 - 11905: 0x9F47, + 28902 - 11905: 0xB7B3, + 28903 - 11905: 0xC9D5, + 28904 - 11905: 0xECC7, + 28905 - 11905: 0xBBE2, + 28906 - 11905: 0x9F48, + 28907 - 11905: 0xCCCC, + 28908 - 11905: 0xBDFD, + 28909 - 11905: 0xC8C8, + 28910 - 11905: 0x9F49, + 28911 - 11905: 0xCFA9, + 28912 - 11905: 0x9F4A, + 28913 - 11905: 0x9F4B, + 28914 - 11905: 0x9F4C, + 28915 - 11905: 0x9F4D, + 28916 - 11905: 0x9F4E, + 28917 - 11905: 0x9F4F, + 28918 - 11905: 0x9F50, + 28919 - 11905: 0xCDE9, + 28920 - 11905: 0x9F51, + 28921 - 11905: 0xC5EB, + 28922 - 11905: 0x9F52, + 28923 - 11905: 0x9F53, + 28924 - 11905: 0x9F54, + 28925 - 11905: 0xB7E9, + 28926 - 11905: 0x9F55, + 28927 - 11905: 0x9F56, + 28928 - 11905: 0x9F57, + 28929 - 11905: 0x9F58, + 28930 - 11905: 0x9F59, + 28931 - 11905: 0x9F5A, + 28932 - 11905: 0x9F5B, + 28933 - 11905: 0x9F5C, + 28934 - 11905: 0x9F5D, + 28935 - 11905: 0x9F5E, + 28936 - 11905: 0x9F5F, + 28937 - 11905: 0xD1C9, + 28938 - 11905: 0xBAB8, + 28939 - 11905: 0x9F60, + 28940 - 11905: 0x9F61, + 28941 - 11905: 0x9F62, + 28942 - 11905: 0x9F63, + 28943 - 11905: 0x9F64, + 28944 - 11905: 0xECC9, + 28945 - 11905: 0x9F65, + 28946 - 11905: 0x9F66, + 28947 - 11905: 0xECCA, + 28948 - 11905: 0x9F67, + 28949 - 11905: 0xBBC0, + 28950 - 11905: 0xECCB, + 28951 - 11905: 0x9F68, + 28952 - 11905: 0xECE2, + 28953 - 11905: 0xB1BA, + 28954 - 11905: 0xB7D9, + 28955 - 11905: 0x9F69, + 28956 - 11905: 0x9F6A, + 28957 - 11905: 0x9F6B, + 28958 - 11905: 0x9F6C, + 28959 - 11905: 0x9F6D, + 28960 - 11905: 0x9F6E, + 28961 - 11905: 0x9F6F, + 28962 - 11905: 0x9F70, + 28963 - 11905: 0x9F71, + 28964 - 11905: 0x9F72, + 28965 - 11905: 0x9F73, + 28966 - 11905: 0xBDB9, + 28967 - 11905: 0x9F74, + 28968 - 11905: 0x9F75, + 28969 - 11905: 0x9F76, + 28970 - 11905: 0x9F77, + 28971 - 11905: 0x9F78, + 28972 - 11905: 0x9F79, + 28973 - 11905: 0x9F7A, + 28974 - 11905: 0x9F7B, + 28975 - 11905: 0xECCC, + 28976 - 11905: 0xD1E6, + 28977 - 11905: 0xECCD, + 28978 - 11905: 0x9F7C, + 28979 - 11905: 0x9F7D, + 28980 - 11905: 0x9F7E, + 28981 - 11905: 0x9F80, + 28982 - 11905: 0xC8BB, + 28983 - 11905: 0x9F81, + 28984 - 11905: 0x9F82, + 28985 - 11905: 0x9F83, + 28986 - 11905: 0x9F84, + 28987 - 11905: 0x9F85, + 28988 - 11905: 0x9F86, + 28989 - 11905: 0x9F87, + 28990 - 11905: 0x9F88, + 28991 - 11905: 0x9F89, + 28992 - 11905: 0x9F8A, + 28993 - 11905: 0x9F8B, + 28994 - 11905: 0x9F8C, + 28995 - 11905: 0x9F8D, + 28996 - 11905: 0x9F8E, + 28997 - 11905: 0xECD1, + 28998 - 11905: 0x9F8F, + 28999 - 11905: 0x9F90, + 29000 - 11905: 0x9F91, + 29001 - 11905: 0x9F92, + 29002 - 11905: 0xECD3, + 29003 - 11905: 0x9F93, + 29004 - 11905: 0xBBCD, + 29005 - 11905: 0x9F94, + 29006 - 11905: 0xBCE5, + 29007 - 11905: 0x9F95, + 29008 - 11905: 0x9F96, + 29009 - 11905: 0x9F97, + 29010 - 11905: 0x9F98, + 29011 - 11905: 0x9F99, + 29012 - 11905: 0x9F9A, + 29013 - 11905: 0x9F9B, + 29014 - 11905: 0x9F9C, + 29015 - 11905: 0x9F9D, + 29016 - 11905: 0x9F9E, + 29017 - 11905: 0x9F9F, + 29018 - 11905: 0x9FA0, + 29019 - 11905: 0x9FA1, + 29020 - 11905: 0xECCF, + 29021 - 11905: 0x9FA2, + 29022 - 11905: 0xC9B7, + 29023 - 11905: 0x9FA3, + 29024 - 11905: 0x9FA4, + 29025 - 11905: 0x9FA5, + 29026 - 11905: 0x9FA6, + 29027 - 11905: 0x9FA7, + 29028 - 11905: 0xC3BA, + 29029 - 11905: 0x9FA8, + 29030 - 11905: 0xECE3, + 29031 - 11905: 0xD5D5, + 29032 - 11905: 0xECD0, + 29033 - 11905: 0x9FA9, + 29034 - 11905: 0x9FAA, + 29035 - 11905: 0x9FAB, + 29036 - 11905: 0x9FAC, + 29037 - 11905: 0x9FAD, + 29038 - 11905: 0xD6F3, + 29039 - 11905: 0x9FAE, + 29040 - 11905: 0x9FAF, + 29041 - 11905: 0x9FB0, + 29042 - 11905: 0xECD2, + 29043 - 11905: 0xECCE, + 29044 - 11905: 0x9FB1, + 29045 - 11905: 0x9FB2, + 29046 - 11905: 0x9FB3, + 29047 - 11905: 0x9FB4, + 29048 - 11905: 0xECD4, + 29049 - 11905: 0x9FB5, + 29050 - 11905: 0xECD5, + 29051 - 11905: 0x9FB6, + 29052 - 11905: 0x9FB7, + 29053 - 11905: 0xC9BF, + 29054 - 11905: 0x9FB8, + 29055 - 11905: 0x9FB9, + 29056 - 11905: 0x9FBA, + 29057 - 11905: 0x9FBB, + 29058 - 11905: 0x9FBC, + 29059 - 11905: 0x9FBD, + 29060 - 11905: 0xCFA8, + 29061 - 11905: 0x9FBE, + 29062 - 11905: 0x9FBF, + 29063 - 11905: 0x9FC0, + 29064 - 11905: 0x9FC1, + 29065 - 11905: 0x9FC2, + 29066 - 11905: 0xD0DC, + 29067 - 11905: 0x9FC3, + 29068 - 11905: 0x9FC4, + 29069 - 11905: 0x9FC5, + 29070 - 11905: 0x9FC6, + 29071 - 11905: 0xD1AC, + 29072 - 11905: 0x9FC7, + 29073 - 11905: 0x9FC8, + 29074 - 11905: 0x9FC9, + 29075 - 11905: 0x9FCA, + 29076 - 11905: 0xC8DB, + 29077 - 11905: 0x9FCB, + 29078 - 11905: 0x9FCC, + 29079 - 11905: 0x9FCD, + 29080 - 11905: 0xECD6, + 29081 - 11905: 0xCEF5, + 29082 - 11905: 0x9FCE, + 29083 - 11905: 0x9FCF, + 29084 - 11905: 0x9FD0, + 29085 - 11905: 0x9FD1, + 29086 - 11905: 0x9FD2, + 29087 - 11905: 0xCAEC, + 29088 - 11905: 0xECDA, + 29089 - 11905: 0x9FD3, + 29090 - 11905: 0x9FD4, + 29091 - 11905: 0x9FD5, + 29092 - 11905: 0x9FD6, + 29093 - 11905: 0x9FD7, + 29094 - 11905: 0x9FD8, + 29095 - 11905: 0x9FD9, + 29096 - 11905: 0xECD9, + 29097 - 11905: 0x9FDA, + 29098 - 11905: 0x9FDB, + 29099 - 11905: 0x9FDC, + 29100 - 11905: 0xB0BE, + 29101 - 11905: 0x9FDD, + 29102 - 11905: 0x9FDE, + 29103 - 11905: 0x9FDF, + 29104 - 11905: 0x9FE0, + 29105 - 11905: 0x9FE1, + 29106 - 11905: 0x9FE2, + 29107 - 11905: 0xECD7, + 29108 - 11905: 0x9FE3, + 29109 - 11905: 0xECD8, + 29110 - 11905: 0x9FE4, + 29111 - 11905: 0x9FE5, + 29112 - 11905: 0x9FE6, + 29113 - 11905: 0xECE4, + 29114 - 11905: 0x9FE7, + 29115 - 11905: 0x9FE8, + 29116 - 11905: 0x9FE9, + 29117 - 11905: 0x9FEA, + 29118 - 11905: 0x9FEB, + 29119 - 11905: 0x9FEC, + 29120 - 11905: 0x9FED, + 29121 - 11905: 0x9FEE, + 29122 - 11905: 0x9FEF, + 29123 - 11905: 0xC8BC, + 29124 - 11905: 0x9FF0, + 29125 - 11905: 0x9FF1, + 29126 - 11905: 0x9FF2, + 29127 - 11905: 0x9FF3, + 29128 - 11905: 0x9FF4, + 29129 - 11905: 0x9FF5, + 29130 - 11905: 0x9FF6, + 29131 - 11905: 0x9FF7, + 29132 - 11905: 0x9FF8, + 29133 - 11905: 0x9FF9, + 29134 - 11905: 0xC1C7, + 29135 - 11905: 0x9FFA, + 29136 - 11905: 0x9FFB, + 29137 - 11905: 0x9FFC, + 29138 - 11905: 0x9FFD, + 29139 - 11905: 0x9FFE, + 29140 - 11905: 0xECDC, + 29141 - 11905: 0xD1E0, + 29142 - 11905: 0xA040, + 29143 - 11905: 0xA041, + 29144 - 11905: 0xA042, + 29145 - 11905: 0xA043, + 29146 - 11905: 0xA044, + 29147 - 11905: 0xA045, + 29148 - 11905: 0xA046, + 29149 - 11905: 0xA047, + 29150 - 11905: 0xA048, + 29151 - 11905: 0xA049, + 29152 - 11905: 0xECDB, + 29153 - 11905: 0xA04A, + 29154 - 11905: 0xA04B, + 29155 - 11905: 0xA04C, + 29156 - 11905: 0xA04D, + 29157 - 11905: 0xD4EF, + 29158 - 11905: 0xA04E, + 29159 - 11905: 0xECDD, + 29160 - 11905: 0xA04F, + 29161 - 11905: 0xA050, + 29162 - 11905: 0xA051, + 29163 - 11905: 0xA052, + 29164 - 11905: 0xA053, + 29165 - 11905: 0xA054, + 29166 - 11905: 0xDBC6, + 29167 - 11905: 0xA055, + 29168 - 11905: 0xA056, + 29169 - 11905: 0xA057, + 29170 - 11905: 0xA058, + 29171 - 11905: 0xA059, + 29172 - 11905: 0xA05A, + 29173 - 11905: 0xA05B, + 29174 - 11905: 0xA05C, + 29175 - 11905: 0xA05D, + 29176 - 11905: 0xA05E, + 29177 - 11905: 0xECDE, + 29178 - 11905: 0xA05F, + 29179 - 11905: 0xA060, + 29180 - 11905: 0xA061, + 29181 - 11905: 0xA062, + 29182 - 11905: 0xA063, + 29183 - 11905: 0xA064, + 29184 - 11905: 0xA065, + 29185 - 11905: 0xA066, + 29186 - 11905: 0xA067, + 29187 - 11905: 0xA068, + 29188 - 11905: 0xA069, + 29189 - 11905: 0xA06A, + 29190 - 11905: 0xB1AC, + 29191 - 11905: 0xA06B, + 29192 - 11905: 0xA06C, + 29193 - 11905: 0xA06D, + 29194 - 11905: 0xA06E, + 29195 - 11905: 0xA06F, + 29196 - 11905: 0xA070, + 29197 - 11905: 0xA071, + 29198 - 11905: 0xA072, + 29199 - 11905: 0xA073, + 29200 - 11905: 0xA074, + 29201 - 11905: 0xA075, + 29202 - 11905: 0xA076, + 29203 - 11905: 0xA077, + 29204 - 11905: 0xA078, + 29205 - 11905: 0xA079, + 29206 - 11905: 0xA07A, + 29207 - 11905: 0xA07B, + 29208 - 11905: 0xA07C, + 29209 - 11905: 0xA07D, + 29210 - 11905: 0xA07E, + 29211 - 11905: 0xA080, + 29212 - 11905: 0xA081, + 29213 - 11905: 0xECDF, + 29214 - 11905: 0xA082, + 29215 - 11905: 0xA083, + 29216 - 11905: 0xA084, + 29217 - 11905: 0xA085, + 29218 - 11905: 0xA086, + 29219 - 11905: 0xA087, + 29220 - 11905: 0xA088, + 29221 - 11905: 0xA089, + 29222 - 11905: 0xA08A, + 29223 - 11905: 0xA08B, + 29224 - 11905: 0xECE0, + 29225 - 11905: 0xA08C, + 29226 - 11905: 0xD7A6, + 29227 - 11905: 0xA08D, + 29228 - 11905: 0xC5C0, + 29229 - 11905: 0xA08E, + 29230 - 11905: 0xA08F, + 29231 - 11905: 0xA090, + 29232 - 11905: 0xEBBC, + 29233 - 11905: 0xB0AE, + 29234 - 11905: 0xA091, + 29235 - 11905: 0xA092, + 29236 - 11905: 0xA093, + 29237 - 11905: 0xBEF4, + 29238 - 11905: 0xB8B8, + 29239 - 11905: 0xD2AF, + 29240 - 11905: 0xB0D6, + 29241 - 11905: 0xB5F9, + 29242 - 11905: 0xA094, + 29243 - 11905: 0xD8B3, + 29244 - 11905: 0xA095, + 29245 - 11905: 0xCBAC, + 29246 - 11905: 0xA096, + 29247 - 11905: 0xE3DD, + 29248 - 11905: 0xA097, + 29249 - 11905: 0xA098, + 29250 - 11905: 0xA099, + 29251 - 11905: 0xA09A, + 29252 - 11905: 0xA09B, + 29253 - 11905: 0xA09C, + 29254 - 11905: 0xA09D, + 29255 - 11905: 0xC6AC, + 29256 - 11905: 0xB0E6, + 29257 - 11905: 0xA09E, + 29258 - 11905: 0xA09F, + 29259 - 11905: 0xA0A0, + 29260 - 11905: 0xC5C6, + 29261 - 11905: 0xEBB9, + 29262 - 11905: 0xA0A1, + 29263 - 11905: 0xA0A2, + 29264 - 11905: 0xA0A3, + 29265 - 11905: 0xA0A4, + 29266 - 11905: 0xEBBA, + 29267 - 11905: 0xA0A5, + 29268 - 11905: 0xA0A6, + 29269 - 11905: 0xA0A7, + 29270 - 11905: 0xEBBB, + 29271 - 11905: 0xA0A8, + 29272 - 11905: 0xA0A9, + 29273 - 11905: 0xD1C0, + 29274 - 11905: 0xA0AA, + 29275 - 11905: 0xC5A3, + 29276 - 11905: 0xA0AB, + 29277 - 11905: 0xEAF2, + 29278 - 11905: 0xA0AC, + 29279 - 11905: 0xC4B2, + 29280 - 11905: 0xA0AD, + 29281 - 11905: 0xC4B5, + 29282 - 11905: 0xC0CE, + 29283 - 11905: 0xA0AE, + 29284 - 11905: 0xA0AF, + 29285 - 11905: 0xA0B0, + 29286 - 11905: 0xEAF3, + 29287 - 11905: 0xC4C1, + 29288 - 11905: 0xA0B1, + 29289 - 11905: 0xCEEF, + 29290 - 11905: 0xA0B2, + 29291 - 11905: 0xA0B3, + 29292 - 11905: 0xA0B4, + 29293 - 11905: 0xA0B5, + 29294 - 11905: 0xEAF0, + 29295 - 11905: 0xEAF4, + 29296 - 11905: 0xA0B6, + 29297 - 11905: 0xA0B7, + 29298 - 11905: 0xC9FC, + 29299 - 11905: 0xA0B8, + 29300 - 11905: 0xA0B9, + 29301 - 11905: 0xC7A3, + 29302 - 11905: 0xA0BA, + 29303 - 11905: 0xA0BB, + 29304 - 11905: 0xA0BC, + 29305 - 11905: 0xCCD8, + 29306 - 11905: 0xCEFE, + 29307 - 11905: 0xA0BD, + 29308 - 11905: 0xA0BE, + 29309 - 11905: 0xA0BF, + 29310 - 11905: 0xEAF5, + 29311 - 11905: 0xEAF6, + 29312 - 11905: 0xCFAC, + 29313 - 11905: 0xC0E7, + 29314 - 11905: 0xA0C0, + 29315 - 11905: 0xA0C1, + 29316 - 11905: 0xEAF7, + 29317 - 11905: 0xA0C2, + 29318 - 11905: 0xA0C3, + 29319 - 11905: 0xA0C4, + 29320 - 11905: 0xA0C5, + 29321 - 11905: 0xA0C6, + 29322 - 11905: 0xB6BF, + 29323 - 11905: 0xEAF8, + 29324 - 11905: 0xA0C7, + 29325 - 11905: 0xEAF9, + 29326 - 11905: 0xA0C8, + 29327 - 11905: 0xEAFA, + 29328 - 11905: 0xA0C9, + 29329 - 11905: 0xA0CA, + 29330 - 11905: 0xEAFB, + 29331 - 11905: 0xA0CB, + 29332 - 11905: 0xA0CC, + 29333 - 11905: 0xA0CD, + 29334 - 11905: 0xA0CE, + 29335 - 11905: 0xA0CF, + 29336 - 11905: 0xA0D0, + 29337 - 11905: 0xA0D1, + 29338 - 11905: 0xA0D2, + 29339 - 11905: 0xA0D3, + 29340 - 11905: 0xA0D4, + 29341 - 11905: 0xA0D5, + 29342 - 11905: 0xA0D6, + 29343 - 11905: 0xEAF1, + 29344 - 11905: 0xA0D7, + 29345 - 11905: 0xA0D8, + 29346 - 11905: 0xA0D9, + 29347 - 11905: 0xA0DA, + 29348 - 11905: 0xA0DB, + 29349 - 11905: 0xA0DC, + 29350 - 11905: 0xA0DD, + 29351 - 11905: 0xA0DE, + 29352 - 11905: 0xA0DF, + 29353 - 11905: 0xA0E0, + 29354 - 11905: 0xA0E1, + 29355 - 11905: 0xA0E2, + 29356 - 11905: 0xC8AE, + 29357 - 11905: 0xE1EB, + 29358 - 11905: 0xA0E3, + 29359 - 11905: 0xB7B8, + 29360 - 11905: 0xE1EC, + 29361 - 11905: 0xA0E4, + 29362 - 11905: 0xA0E5, + 29363 - 11905: 0xA0E6, + 29364 - 11905: 0xE1ED, + 29365 - 11905: 0xA0E7, + 29366 - 11905: 0xD7B4, + 29367 - 11905: 0xE1EE, + 29368 - 11905: 0xE1EF, + 29369 - 11905: 0xD3CC, + 29370 - 11905: 0xA0E8, + 29371 - 11905: 0xA0E9, + 29372 - 11905: 0xA0EA, + 29373 - 11905: 0xA0EB, + 29374 - 11905: 0xA0EC, + 29375 - 11905: 0xA0ED, + 29376 - 11905: 0xA0EE, + 29377 - 11905: 0xE1F1, + 29378 - 11905: 0xBFF1, + 29379 - 11905: 0xE1F0, + 29380 - 11905: 0xB5D2, + 29381 - 11905: 0xA0EF, + 29382 - 11905: 0xA0F0, + 29383 - 11905: 0xA0F1, + 29384 - 11905: 0xB1B7, + 29385 - 11905: 0xA0F2, + 29386 - 11905: 0xA0F3, + 29387 - 11905: 0xA0F4, + 29388 - 11905: 0xA0F5, + 29389 - 11905: 0xE1F3, + 29390 - 11905: 0xE1F2, + 29391 - 11905: 0xA0F6, + 29392 - 11905: 0xBAFC, + 29393 - 11905: 0xA0F7, + 29394 - 11905: 0xE1F4, + 29395 - 11905: 0xA0F8, + 29396 - 11905: 0xA0F9, + 29397 - 11905: 0xA0FA, + 29398 - 11905: 0xA0FB, + 29399 - 11905: 0xB9B7, + 29400 - 11905: 0xA0FC, + 29401 - 11905: 0xBED1, + 29402 - 11905: 0xA0FD, + 29403 - 11905: 0xA0FE, + 29404 - 11905: 0xAA40, + 29405 - 11905: 0xAA41, + 29406 - 11905: 0xC4FC, + 29407 - 11905: 0xAA42, + 29408 - 11905: 0xBADD, + 29409 - 11905: 0xBDC6, + 29410 - 11905: 0xAA43, + 29411 - 11905: 0xAA44, + 29412 - 11905: 0xAA45, + 29413 - 11905: 0xAA46, + 29414 - 11905: 0xAA47, + 29415 - 11905: 0xAA48, + 29416 - 11905: 0xE1F5, + 29417 - 11905: 0xE1F7, + 29418 - 11905: 0xAA49, + 29419 - 11905: 0xAA4A, + 29420 - 11905: 0xB6C0, + 29421 - 11905: 0xCFC1, + 29422 - 11905: 0xCAA8, + 29423 - 11905: 0xE1F6, + 29424 - 11905: 0xD5F8, + 29425 - 11905: 0xD3FC, + 29426 - 11905: 0xE1F8, + 29427 - 11905: 0xE1FC, + 29428 - 11905: 0xE1F9, + 29429 - 11905: 0xAA4B, + 29430 - 11905: 0xAA4C, + 29431 - 11905: 0xE1FA, + 29432 - 11905: 0xC0EA, + 29433 - 11905: 0xAA4D, + 29434 - 11905: 0xE1FE, + 29435 - 11905: 0xE2A1, + 29436 - 11905: 0xC0C7, + 29437 - 11905: 0xAA4E, + 29438 - 11905: 0xAA4F, + 29439 - 11905: 0xAA50, + 29440 - 11905: 0xAA51, + 29441 - 11905: 0xE1FB, + 29442 - 11905: 0xAA52, + 29443 - 11905: 0xE1FD, + 29444 - 11905: 0xAA53, + 29445 - 11905: 0xAA54, + 29446 - 11905: 0xAA55, + 29447 - 11905: 0xAA56, + 29448 - 11905: 0xAA57, + 29449 - 11905: 0xAA58, + 29450 - 11905: 0xE2A5, + 29451 - 11905: 0xAA59, + 29452 - 11905: 0xAA5A, + 29453 - 11905: 0xAA5B, + 29454 - 11905: 0xC1D4, + 29455 - 11905: 0xAA5C, + 29456 - 11905: 0xAA5D, + 29457 - 11905: 0xAA5E, + 29458 - 11905: 0xAA5F, + 29459 - 11905: 0xE2A3, + 29460 - 11905: 0xAA60, + 29461 - 11905: 0xE2A8, + 29462 - 11905: 0xB2FE, + 29463 - 11905: 0xE2A2, + 29464 - 11905: 0xAA61, + 29465 - 11905: 0xAA62, + 29466 - 11905: 0xAA63, + 29467 - 11905: 0xC3CD, + 29468 - 11905: 0xB2C2, + 29469 - 11905: 0xE2A7, + 29470 - 11905: 0xE2A6, + 29471 - 11905: 0xAA64, + 29472 - 11905: 0xAA65, + 29473 - 11905: 0xE2A4, + 29474 - 11905: 0xE2A9, + 29475 - 11905: 0xAA66, + 29476 - 11905: 0xAA67, + 29477 - 11905: 0xE2AB, + 29478 - 11905: 0xAA68, + 29479 - 11905: 0xAA69, + 29480 - 11905: 0xAA6A, + 29481 - 11905: 0xD0C9, + 29482 - 11905: 0xD6ED, + 29483 - 11905: 0xC3A8, + 29484 - 11905: 0xE2AC, + 29485 - 11905: 0xAA6B, + 29486 - 11905: 0xCFD7, + 29487 - 11905: 0xAA6C, + 29488 - 11905: 0xAA6D, + 29489 - 11905: 0xE2AE, + 29490 - 11905: 0xAA6E, + 29491 - 11905: 0xAA6F, + 29492 - 11905: 0xBAEF, + 29493 - 11905: 0xAA70, + 29494 - 11905: 0xAA71, + 29495 - 11905: 0xE9E0, + 29496 - 11905: 0xE2AD, + 29497 - 11905: 0xE2AA, + 29498 - 11905: 0xAA72, + 29499 - 11905: 0xAA73, + 29500 - 11905: 0xAA74, + 29501 - 11905: 0xAA75, + 29502 - 11905: 0xBBAB, + 29503 - 11905: 0xD4B3, + 29504 - 11905: 0xAA76, + 29505 - 11905: 0xAA77, + 29506 - 11905: 0xAA78, + 29507 - 11905: 0xAA79, + 29508 - 11905: 0xAA7A, + 29509 - 11905: 0xAA7B, + 29510 - 11905: 0xAA7C, + 29511 - 11905: 0xAA7D, + 29512 - 11905: 0xAA7E, + 29513 - 11905: 0xAA80, + 29514 - 11905: 0xAA81, + 29515 - 11905: 0xAA82, + 29516 - 11905: 0xAA83, + 29517 - 11905: 0xE2B0, + 29518 - 11905: 0xAA84, + 29519 - 11905: 0xAA85, + 29520 - 11905: 0xE2AF, + 29521 - 11905: 0xAA86, + 29522 - 11905: 0xE9E1, + 29523 - 11905: 0xAA87, + 29524 - 11905: 0xAA88, + 29525 - 11905: 0xAA89, + 29526 - 11905: 0xAA8A, + 29527 - 11905: 0xE2B1, + 29528 - 11905: 0xAA8B, + 29529 - 11905: 0xAA8C, + 29530 - 11905: 0xAA8D, + 29531 - 11905: 0xAA8E, + 29532 - 11905: 0xAA8F, + 29533 - 11905: 0xAA90, + 29534 - 11905: 0xAA91, + 29535 - 11905: 0xAA92, + 29536 - 11905: 0xE2B2, + 29537 - 11905: 0xAA93, + 29538 - 11905: 0xAA94, + 29539 - 11905: 0xAA95, + 29540 - 11905: 0xAA96, + 29541 - 11905: 0xAA97, + 29542 - 11905: 0xAA98, + 29543 - 11905: 0xAA99, + 29544 - 11905: 0xAA9A, + 29545 - 11905: 0xAA9B, + 29546 - 11905: 0xAA9C, + 29547 - 11905: 0xAA9D, + 29548 - 11905: 0xE2B3, + 29549 - 11905: 0xCCA1, + 29550 - 11905: 0xAA9E, + 29551 - 11905: 0xE2B4, + 29552 - 11905: 0xAA9F, + 29553 - 11905: 0xAAA0, + 29554 - 11905: 0xAB40, + 29555 - 11905: 0xAB41, + 29556 - 11905: 0xAB42, + 29557 - 11905: 0xAB43, + 29558 - 11905: 0xAB44, + 29559 - 11905: 0xAB45, + 29560 - 11905: 0xAB46, + 29561 - 11905: 0xAB47, + 29562 - 11905: 0xAB48, + 29563 - 11905: 0xAB49, + 29564 - 11905: 0xAB4A, + 29565 - 11905: 0xAB4B, + 29566 - 11905: 0xE2B5, + 29567 - 11905: 0xAB4C, + 29568 - 11905: 0xAB4D, + 29569 - 11905: 0xAB4E, + 29570 - 11905: 0xAB4F, + 29571 - 11905: 0xAB50, + 29572 - 11905: 0xD0FE, + 29573 - 11905: 0xAB51, + 29574 - 11905: 0xAB52, + 29575 - 11905: 0xC2CA, + 29576 - 11905: 0xAB53, + 29577 - 11905: 0xD3F1, + 29578 - 11905: 0xAB54, + 29579 - 11905: 0xCDF5, + 29580 - 11905: 0xAB55, + 29581 - 11905: 0xAB56, + 29582 - 11905: 0xE7E0, + 29583 - 11905: 0xAB57, + 29584 - 11905: 0xAB58, + 29585 - 11905: 0xE7E1, + 29586 - 11905: 0xAB59, + 29587 - 11905: 0xAB5A, + 29588 - 11905: 0xAB5B, + 29589 - 11905: 0xAB5C, + 29590 - 11905: 0xBEC1, + 29591 - 11905: 0xAB5D, + 29592 - 11905: 0xAB5E, + 29593 - 11905: 0xAB5F, + 29594 - 11905: 0xAB60, + 29595 - 11905: 0xC2EA, + 29596 - 11905: 0xAB61, + 29597 - 11905: 0xAB62, + 29598 - 11905: 0xAB63, + 29599 - 11905: 0xE7E4, + 29600 - 11905: 0xAB64, + 29601 - 11905: 0xAB65, + 29602 - 11905: 0xE7E3, + 29603 - 11905: 0xAB66, + 29604 - 11905: 0xAB67, + 29605 - 11905: 0xAB68, + 29606 - 11905: 0xAB69, + 29607 - 11905: 0xAB6A, + 29608 - 11905: 0xAB6B, + 29609 - 11905: 0xCDE6, + 29610 - 11905: 0xAB6C, + 29611 - 11905: 0xC3B5, + 29612 - 11905: 0xAB6D, + 29613 - 11905: 0xAB6E, + 29614 - 11905: 0xE7E2, + 29615 - 11905: 0xBBB7, + 29616 - 11905: 0xCFD6, + 29617 - 11905: 0xAB6F, + 29618 - 11905: 0xC1E1, + 29619 - 11905: 0xE7E9, + 29620 - 11905: 0xAB70, + 29621 - 11905: 0xAB71, + 29622 - 11905: 0xAB72, + 29623 - 11905: 0xE7E8, + 29624 - 11905: 0xAB73, + 29625 - 11905: 0xAB74, + 29626 - 11905: 0xE7F4, + 29627 - 11905: 0xB2A3, + 29628 - 11905: 0xAB75, + 29629 - 11905: 0xAB76, + 29630 - 11905: 0xAB77, + 29631 - 11905: 0xAB78, + 29632 - 11905: 0xE7EA, + 29633 - 11905: 0xAB79, + 29634 - 11905: 0xE7E6, + 29635 - 11905: 0xAB7A, + 29636 - 11905: 0xAB7B, + 29637 - 11905: 0xAB7C, + 29638 - 11905: 0xAB7D, + 29639 - 11905: 0xAB7E, + 29640 - 11905: 0xE7EC, + 29641 - 11905: 0xE7EB, + 29642 - 11905: 0xC9BA, + 29643 - 11905: 0xAB80, + 29644 - 11905: 0xAB81, + 29645 - 11905: 0xD5E4, + 29646 - 11905: 0xAB82, + 29647 - 11905: 0xE7E5, + 29648 - 11905: 0xB7A9, + 29649 - 11905: 0xE7E7, + 29650 - 11905: 0xAB83, + 29651 - 11905: 0xAB84, + 29652 - 11905: 0xAB85, + 29653 - 11905: 0xAB86, + 29654 - 11905: 0xAB87, + 29655 - 11905: 0xAB88, + 29656 - 11905: 0xAB89, + 29657 - 11905: 0xE7EE, + 29658 - 11905: 0xAB8A, + 29659 - 11905: 0xAB8B, + 29660 - 11905: 0xAB8C, + 29661 - 11905: 0xAB8D, + 29662 - 11905: 0xE7F3, + 29663 - 11905: 0xAB8E, + 29664 - 11905: 0xD6E9, + 29665 - 11905: 0xAB8F, + 29666 - 11905: 0xAB90, + 29667 - 11905: 0xAB91, + 29668 - 11905: 0xAB92, + 29669 - 11905: 0xE7ED, + 29670 - 11905: 0xAB93, + 29671 - 11905: 0xE7F2, + 29672 - 11905: 0xAB94, + 29673 - 11905: 0xE7F1, + 29674 - 11905: 0xAB95, + 29675 - 11905: 0xAB96, + 29676 - 11905: 0xAB97, + 29677 - 11905: 0xB0E0, + 29678 - 11905: 0xAB98, + 29679 - 11905: 0xAB99, + 29680 - 11905: 0xAB9A, + 29681 - 11905: 0xAB9B, + 29682 - 11905: 0xE7F5, + 29683 - 11905: 0xAB9C, + 29684 - 11905: 0xAB9D, + 29685 - 11905: 0xAB9E, + 29686 - 11905: 0xAB9F, + 29687 - 11905: 0xABA0, + 29688 - 11905: 0xAC40, + 29689 - 11905: 0xAC41, + 29690 - 11905: 0xAC42, + 29691 - 11905: 0xAC43, + 29692 - 11905: 0xAC44, + 29693 - 11905: 0xAC45, + 29694 - 11905: 0xAC46, + 29695 - 11905: 0xAC47, + 29696 - 11905: 0xAC48, + 29697 - 11905: 0xAC49, + 29698 - 11905: 0xAC4A, + 29699 - 11905: 0xC7F2, + 29700 - 11905: 0xAC4B, + 29701 - 11905: 0xC0C5, + 29702 - 11905: 0xC0ED, + 29703 - 11905: 0xAC4C, + 29704 - 11905: 0xAC4D, + 29705 - 11905: 0xC1F0, + 29706 - 11905: 0xE7F0, + 29707 - 11905: 0xAC4E, + 29708 - 11905: 0xAC4F, + 29709 - 11905: 0xAC50, + 29710 - 11905: 0xAC51, + 29711 - 11905: 0xE7F6, + 29712 - 11905: 0xCBF6, + 29713 - 11905: 0xAC52, + 29714 - 11905: 0xAC53, + 29715 - 11905: 0xAC54, + 29716 - 11905: 0xAC55, + 29717 - 11905: 0xAC56, + 29718 - 11905: 0xAC57, + 29719 - 11905: 0xAC58, + 29720 - 11905: 0xAC59, + 29721 - 11905: 0xAC5A, + 29722 - 11905: 0xE8A2, + 29723 - 11905: 0xE8A1, + 29724 - 11905: 0xAC5B, + 29725 - 11905: 0xAC5C, + 29726 - 11905: 0xAC5D, + 29727 - 11905: 0xAC5E, + 29728 - 11905: 0xAC5F, + 29729 - 11905: 0xAC60, + 29730 - 11905: 0xD7C1, + 29731 - 11905: 0xAC61, + 29732 - 11905: 0xAC62, + 29733 - 11905: 0xE7FA, + 29734 - 11905: 0xE7F9, + 29735 - 11905: 0xAC63, + 29736 - 11905: 0xE7FB, + 29737 - 11905: 0xAC64, + 29738 - 11905: 0xE7F7, + 29739 - 11905: 0xAC65, + 29740 - 11905: 0xE7FE, + 29741 - 11905: 0xAC66, + 29742 - 11905: 0xE7FD, + 29743 - 11905: 0xAC67, + 29744 - 11905: 0xE7FC, + 29745 - 11905: 0xAC68, + 29746 - 11905: 0xAC69, + 29747 - 11905: 0xC1D5, + 29748 - 11905: 0xC7D9, + 29749 - 11905: 0xC5FD, + 29750 - 11905: 0xC5C3, + 29751 - 11905: 0xAC6A, + 29752 - 11905: 0xAC6B, + 29753 - 11905: 0xAC6C, + 29754 - 11905: 0xAC6D, + 29755 - 11905: 0xAC6E, + 29756 - 11905: 0xC7ED, + 29757 - 11905: 0xAC6F, + 29758 - 11905: 0xAC70, + 29759 - 11905: 0xAC71, + 29760 - 11905: 0xAC72, + 29761 - 11905: 0xE8A3, + 29762 - 11905: 0xAC73, + 29763 - 11905: 0xAC74, + 29764 - 11905: 0xAC75, + 29765 - 11905: 0xAC76, + 29766 - 11905: 0xAC77, + 29767 - 11905: 0xAC78, + 29768 - 11905: 0xAC79, + 29769 - 11905: 0xAC7A, + 29770 - 11905: 0xAC7B, + 29771 - 11905: 0xAC7C, + 29772 - 11905: 0xAC7D, + 29773 - 11905: 0xAC7E, + 29774 - 11905: 0xAC80, + 29775 - 11905: 0xAC81, + 29776 - 11905: 0xAC82, + 29777 - 11905: 0xAC83, + 29778 - 11905: 0xAC84, + 29779 - 11905: 0xAC85, + 29780 - 11905: 0xAC86, + 29781 - 11905: 0xE8A6, + 29782 - 11905: 0xAC87, + 29783 - 11905: 0xE8A5, + 29784 - 11905: 0xAC88, + 29785 - 11905: 0xE8A7, + 29786 - 11905: 0xBAF7, + 29787 - 11905: 0xE7F8, + 29788 - 11905: 0xE8A4, + 29789 - 11905: 0xAC89, + 29790 - 11905: 0xC8F0, + 29791 - 11905: 0xC9AA, + 29792 - 11905: 0xAC8A, + 29793 - 11905: 0xAC8B, + 29794 - 11905: 0xAC8C, + 29795 - 11905: 0xAC8D, + 29796 - 11905: 0xAC8E, + 29797 - 11905: 0xAC8F, + 29798 - 11905: 0xAC90, + 29799 - 11905: 0xAC91, + 29800 - 11905: 0xAC92, + 29801 - 11905: 0xAC93, + 29802 - 11905: 0xAC94, + 29803 - 11905: 0xAC95, + 29804 - 11905: 0xAC96, + 29805 - 11905: 0xE8A9, + 29806 - 11905: 0xAC97, + 29807 - 11905: 0xAC98, + 29808 - 11905: 0xB9E5, + 29809 - 11905: 0xAC99, + 29810 - 11905: 0xAC9A, + 29811 - 11905: 0xAC9B, + 29812 - 11905: 0xAC9C, + 29813 - 11905: 0xAC9D, + 29814 - 11905: 0xD1FE, + 29815 - 11905: 0xE8A8, + 29816 - 11905: 0xAC9E, + 29817 - 11905: 0xAC9F, + 29818 - 11905: 0xACA0, + 29819 - 11905: 0xAD40, + 29820 - 11905: 0xAD41, + 29821 - 11905: 0xAD42, + 29822 - 11905: 0xE8AA, + 29823 - 11905: 0xAD43, + 29824 - 11905: 0xE8AD, + 29825 - 11905: 0xE8AE, + 29826 - 11905: 0xAD44, + 29827 - 11905: 0xC1A7, + 29828 - 11905: 0xAD45, + 29829 - 11905: 0xAD46, + 29830 - 11905: 0xAD47, + 29831 - 11905: 0xE8AF, + 29832 - 11905: 0xAD48, + 29833 - 11905: 0xAD49, + 29834 - 11905: 0xAD4A, + 29835 - 11905: 0xE8B0, + 29836 - 11905: 0xAD4B, + 29837 - 11905: 0xAD4C, + 29838 - 11905: 0xE8AC, + 29839 - 11905: 0xAD4D, + 29840 - 11905: 0xE8B4, + 29841 - 11905: 0xAD4E, + 29842 - 11905: 0xAD4F, + 29843 - 11905: 0xAD50, + 29844 - 11905: 0xAD51, + 29845 - 11905: 0xAD52, + 29846 - 11905: 0xAD53, + 29847 - 11905: 0xAD54, + 29848 - 11905: 0xAD55, + 29849 - 11905: 0xAD56, + 29850 - 11905: 0xAD57, + 29851 - 11905: 0xAD58, + 29852 - 11905: 0xE8AB, + 29853 - 11905: 0xAD59, + 29854 - 11905: 0xE8B1, + 29855 - 11905: 0xAD5A, + 29856 - 11905: 0xAD5B, + 29857 - 11905: 0xAD5C, + 29858 - 11905: 0xAD5D, + 29859 - 11905: 0xAD5E, + 29860 - 11905: 0xAD5F, + 29861 - 11905: 0xAD60, + 29862 - 11905: 0xAD61, + 29863 - 11905: 0xE8B5, + 29864 - 11905: 0xE8B2, + 29865 - 11905: 0xE8B3, + 29866 - 11905: 0xAD62, + 29867 - 11905: 0xAD63, + 29868 - 11905: 0xAD64, + 29869 - 11905: 0xAD65, + 29870 - 11905: 0xAD66, + 29871 - 11905: 0xAD67, + 29872 - 11905: 0xAD68, + 29873 - 11905: 0xAD69, + 29874 - 11905: 0xAD6A, + 29875 - 11905: 0xAD6B, + 29876 - 11905: 0xAD6C, + 29877 - 11905: 0xAD6D, + 29878 - 11905: 0xAD6E, + 29879 - 11905: 0xAD6F, + 29880 - 11905: 0xAD70, + 29881 - 11905: 0xAD71, + 29882 - 11905: 0xE8B7, + 29883 - 11905: 0xAD72, + 29884 - 11905: 0xAD73, + 29885 - 11905: 0xAD74, + 29886 - 11905: 0xAD75, + 29887 - 11905: 0xAD76, + 29888 - 11905: 0xAD77, + 29889 - 11905: 0xAD78, + 29890 - 11905: 0xAD79, + 29891 - 11905: 0xAD7A, + 29892 - 11905: 0xAD7B, + 29893 - 11905: 0xAD7C, + 29894 - 11905: 0xAD7D, + 29895 - 11905: 0xAD7E, + 29896 - 11905: 0xAD80, + 29897 - 11905: 0xAD81, + 29898 - 11905: 0xAD82, + 29899 - 11905: 0xAD83, + 29900 - 11905: 0xAD84, + 29901 - 11905: 0xAD85, + 29902 - 11905: 0xAD86, + 29903 - 11905: 0xAD87, + 29904 - 11905: 0xAD88, + 29905 - 11905: 0xAD89, + 29906 - 11905: 0xE8B6, + 29907 - 11905: 0xAD8A, + 29908 - 11905: 0xAD8B, + 29909 - 11905: 0xAD8C, + 29910 - 11905: 0xAD8D, + 29911 - 11905: 0xAD8E, + 29912 - 11905: 0xAD8F, + 29913 - 11905: 0xAD90, + 29914 - 11905: 0xAD91, + 29915 - 11905: 0xAD92, + 29916 - 11905: 0xB9CF, + 29917 - 11905: 0xAD93, + 29918 - 11905: 0xF0AC, + 29919 - 11905: 0xAD94, + 29920 - 11905: 0xF0AD, + 29921 - 11905: 0xAD95, + 29922 - 11905: 0xC6B0, + 29923 - 11905: 0xB0EA, + 29924 - 11905: 0xC8BF, + 29925 - 11905: 0xAD96, + 29926 - 11905: 0xCDDF, + 29927 - 11905: 0xAD97, + 29928 - 11905: 0xAD98, + 29929 - 11905: 0xAD99, + 29930 - 11905: 0xAD9A, + 29931 - 11905: 0xAD9B, + 29932 - 11905: 0xAD9C, + 29933 - 11905: 0xAD9D, + 29934 - 11905: 0xCECD, + 29935 - 11905: 0xEAB1, + 29936 - 11905: 0xAD9E, + 29937 - 11905: 0xAD9F, + 29938 - 11905: 0xADA0, + 29939 - 11905: 0xAE40, + 29940 - 11905: 0xEAB2, + 29941 - 11905: 0xAE41, + 29942 - 11905: 0xC6BF, + 29943 - 11905: 0xB4C9, + 29944 - 11905: 0xAE42, + 29945 - 11905: 0xAE43, + 29946 - 11905: 0xAE44, + 29947 - 11905: 0xAE45, + 29948 - 11905: 0xAE46, + 29949 - 11905: 0xAE47, + 29950 - 11905: 0xAE48, + 29951 - 11905: 0xEAB3, + 29952 - 11905: 0xAE49, + 29953 - 11905: 0xAE4A, + 29954 - 11905: 0xAE4B, + 29955 - 11905: 0xAE4C, + 29956 - 11905: 0xD5E7, + 29957 - 11905: 0xAE4D, + 29958 - 11905: 0xAE4E, + 29959 - 11905: 0xAE4F, + 29960 - 11905: 0xAE50, + 29961 - 11905: 0xAE51, + 29962 - 11905: 0xAE52, + 29963 - 11905: 0xAE53, + 29964 - 11905: 0xAE54, + 29965 - 11905: 0xDDF9, + 29966 - 11905: 0xAE55, + 29967 - 11905: 0xEAB4, + 29968 - 11905: 0xAE56, + 29969 - 11905: 0xEAB5, + 29970 - 11905: 0xAE57, + 29971 - 11905: 0xEAB6, + 29972 - 11905: 0xAE58, + 29973 - 11905: 0xAE59, + 29974 - 11905: 0xAE5A, + 29975 - 11905: 0xAE5B, + 29976 - 11905: 0xB8CA, + 29977 - 11905: 0xDFB0, + 29978 - 11905: 0xC9F5, + 29979 - 11905: 0xAE5C, + 29980 - 11905: 0xCCF0, + 29981 - 11905: 0xAE5D, + 29982 - 11905: 0xAE5E, + 29983 - 11905: 0xC9FA, + 29984 - 11905: 0xAE5F, + 29985 - 11905: 0xAE60, + 29986 - 11905: 0xAE61, + 29987 - 11905: 0xAE62, + 29988 - 11905: 0xAE63, + 29989 - 11905: 0xC9FB, + 29990 - 11905: 0xAE64, + 29991 - 11905: 0xAE65, + 29992 - 11905: 0xD3C3, + 29993 - 11905: 0xCBA6, + 29994 - 11905: 0xAE66, + 29995 - 11905: 0xB8A6, + 29996 - 11905: 0xF0AE, + 29997 - 11905: 0xB1C2, + 29998 - 11905: 0xAE67, + 29999 - 11905: 0xE5B8, + 30000 - 11905: 0xCCEF, + 30001 - 11905: 0xD3C9, + 30002 - 11905: 0xBCD7, + 30003 - 11905: 0xC9EA, + 30004 - 11905: 0xAE68, + 30005 - 11905: 0xB5E7, + 30006 - 11905: 0xAE69, + 30007 - 11905: 0xC4D0, + 30008 - 11905: 0xB5E9, + 30009 - 11905: 0xAE6A, + 30010 - 11905: 0xEEAE, + 30011 - 11905: 0xBBAD, + 30012 - 11905: 0xAE6B, + 30013 - 11905: 0xAE6C, + 30014 - 11905: 0xE7DE, + 30015 - 11905: 0xAE6D, + 30016 - 11905: 0xEEAF, + 30017 - 11905: 0xAE6E, + 30018 - 11905: 0xAE6F, + 30019 - 11905: 0xAE70, + 30020 - 11905: 0xAE71, + 30021 - 11905: 0xB3A9, + 30022 - 11905: 0xAE72, + 30023 - 11905: 0xAE73, + 30024 - 11905: 0xEEB2, + 30025 - 11905: 0xAE74, + 30026 - 11905: 0xAE75, + 30027 - 11905: 0xEEB1, + 30028 - 11905: 0xBDE7, + 30029 - 11905: 0xAE76, + 30030 - 11905: 0xEEB0, + 30031 - 11905: 0xCEB7, + 30032 - 11905: 0xAE77, + 30033 - 11905: 0xAE78, + 30034 - 11905: 0xAE79, + 30035 - 11905: 0xAE7A, + 30036 - 11905: 0xC5CF, + 30037 - 11905: 0xAE7B, + 30038 - 11905: 0xAE7C, + 30039 - 11905: 0xAE7D, + 30040 - 11905: 0xAE7E, + 30041 - 11905: 0xC1F4, + 30042 - 11905: 0xDBCE, + 30043 - 11905: 0xEEB3, + 30044 - 11905: 0xD0F3, + 30045 - 11905: 0xAE80, + 30046 - 11905: 0xAE81, + 30047 - 11905: 0xAE82, + 30048 - 11905: 0xAE83, + 30049 - 11905: 0xAE84, + 30050 - 11905: 0xAE85, + 30051 - 11905: 0xAE86, + 30052 - 11905: 0xAE87, + 30053 - 11905: 0xC2D4, + 30054 - 11905: 0xC6E8, + 30055 - 11905: 0xAE88, + 30056 - 11905: 0xAE89, + 30057 - 11905: 0xAE8A, + 30058 - 11905: 0xB7AC, + 30059 - 11905: 0xAE8B, + 30060 - 11905: 0xAE8C, + 30061 - 11905: 0xAE8D, + 30062 - 11905: 0xAE8E, + 30063 - 11905: 0xAE8F, + 30064 - 11905: 0xAE90, + 30065 - 11905: 0xAE91, + 30066 - 11905: 0xEEB4, + 30067 - 11905: 0xAE92, + 30068 - 11905: 0xB3EB, + 30069 - 11905: 0xAE93, + 30070 - 11905: 0xAE94, + 30071 - 11905: 0xAE95, + 30072 - 11905: 0xBBFB, + 30073 - 11905: 0xEEB5, + 30074 - 11905: 0xAE96, + 30075 - 11905: 0xAE97, + 30076 - 11905: 0xAE98, + 30077 - 11905: 0xAE99, + 30078 - 11905: 0xAE9A, + 30079 - 11905: 0xE7DC, + 30080 - 11905: 0xAE9B, + 30081 - 11905: 0xAE9C, + 30082 - 11905: 0xAE9D, + 30083 - 11905: 0xEEB6, + 30084 - 11905: 0xAE9E, + 30085 - 11905: 0xAE9F, + 30086 - 11905: 0xBDAE, + 30087 - 11905: 0xAEA0, + 30088 - 11905: 0xAF40, + 30089 - 11905: 0xAF41, + 30090 - 11905: 0xAF42, + 30091 - 11905: 0xF1E2, + 30092 - 11905: 0xAF43, + 30093 - 11905: 0xAF44, + 30094 - 11905: 0xAF45, + 30095 - 11905: 0xCAE8, + 30096 - 11905: 0xAF46, + 30097 - 11905: 0xD2C9, + 30098 - 11905: 0xF0DA, + 30099 - 11905: 0xAF47, + 30100 - 11905: 0xF0DB, + 30101 - 11905: 0xAF48, + 30102 - 11905: 0xF0DC, + 30103 - 11905: 0xC1C6, + 30104 - 11905: 0xAF49, + 30105 - 11905: 0xB8ED, + 30106 - 11905: 0xBECE, + 30107 - 11905: 0xAF4A, + 30108 - 11905: 0xAF4B, + 30109 - 11905: 0xF0DE, + 30110 - 11905: 0xAF4C, + 30111 - 11905: 0xC5B1, + 30112 - 11905: 0xF0DD, + 30113 - 11905: 0xD1F1, + 30114 - 11905: 0xAF4D, + 30115 - 11905: 0xF0E0, + 30116 - 11905: 0xB0CC, + 30117 - 11905: 0xBDEA, + 30118 - 11905: 0xAF4E, + 30119 - 11905: 0xAF4F, + 30120 - 11905: 0xAF50, + 30121 - 11905: 0xAF51, + 30122 - 11905: 0xAF52, + 30123 - 11905: 0xD2DF, + 30124 - 11905: 0xF0DF, + 30125 - 11905: 0xAF53, + 30126 - 11905: 0xB4AF, + 30127 - 11905: 0xB7E8, + 30128 - 11905: 0xF0E6, + 30129 - 11905: 0xF0E5, + 30130 - 11905: 0xC6A3, + 30131 - 11905: 0xF0E1, + 30132 - 11905: 0xF0E2, + 30133 - 11905: 0xB4C3, + 30134 - 11905: 0xAF54, + 30135 - 11905: 0xAF55, + 30136 - 11905: 0xF0E3, + 30137 - 11905: 0xD5EE, + 30138 - 11905: 0xAF56, + 30139 - 11905: 0xAF57, + 30140 - 11905: 0xCCDB, + 30141 - 11905: 0xBED2, + 30142 - 11905: 0xBCB2, + 30143 - 11905: 0xAF58, + 30144 - 11905: 0xAF59, + 30145 - 11905: 0xAF5A, + 30146 - 11905: 0xF0E8, + 30147 - 11905: 0xF0E7, + 30148 - 11905: 0xF0E4, + 30149 - 11905: 0xB2A1, + 30150 - 11905: 0xAF5B, + 30151 - 11905: 0xD6A2, + 30152 - 11905: 0xD3B8, + 30153 - 11905: 0xBEB7, + 30154 - 11905: 0xC8AC, + 30155 - 11905: 0xAF5C, + 30156 - 11905: 0xAF5D, + 30157 - 11905: 0xF0EA, + 30158 - 11905: 0xAF5E, + 30159 - 11905: 0xAF5F, + 30160 - 11905: 0xAF60, + 30161 - 11905: 0xAF61, + 30162 - 11905: 0xD1F7, + 30163 - 11905: 0xAF62, + 30164 - 11905: 0xD6CC, + 30165 - 11905: 0xBADB, + 30166 - 11905: 0xF0E9, + 30167 - 11905: 0xAF63, + 30168 - 11905: 0xB6BB, + 30169 - 11905: 0xAF64, + 30170 - 11905: 0xAF65, + 30171 - 11905: 0xCDB4, + 30172 - 11905: 0xAF66, + 30173 - 11905: 0xAF67, + 30174 - 11905: 0xC6A6, + 30175 - 11905: 0xAF68, + 30176 - 11905: 0xAF69, + 30177 - 11905: 0xAF6A, + 30178 - 11905: 0xC1A1, + 30179 - 11905: 0xF0EB, + 30180 - 11905: 0xF0EE, + 30181 - 11905: 0xAF6B, + 30182 - 11905: 0xF0ED, + 30183 - 11905: 0xF0F0, + 30184 - 11905: 0xF0EC, + 30185 - 11905: 0xAF6C, + 30186 - 11905: 0xBBBE, + 30187 - 11905: 0xF0EF, + 30188 - 11905: 0xAF6D, + 30189 - 11905: 0xAF6E, + 30190 - 11905: 0xAF6F, + 30191 - 11905: 0xAF70, + 30192 - 11905: 0xCCB5, + 30193 - 11905: 0xF0F2, + 30194 - 11905: 0xAF71, + 30195 - 11905: 0xAF72, + 30196 - 11905: 0xB3D5, + 30197 - 11905: 0xAF73, + 30198 - 11905: 0xAF74, + 30199 - 11905: 0xAF75, + 30200 - 11905: 0xAF76, + 30201 - 11905: 0xB1D4, + 30202 - 11905: 0xAF77, + 30203 - 11905: 0xAF78, + 30204 - 11905: 0xF0F3, + 30205 - 11905: 0xAF79, + 30206 - 11905: 0xAF7A, + 30207 - 11905: 0xF0F4, + 30208 - 11905: 0xF0F6, + 30209 - 11905: 0xB4E1, + 30210 - 11905: 0xAF7B, + 30211 - 11905: 0xF0F1, + 30212 - 11905: 0xAF7C, + 30213 - 11905: 0xF0F7, + 30214 - 11905: 0xAF7D, + 30215 - 11905: 0xAF7E, + 30216 - 11905: 0xAF80, + 30217 - 11905: 0xAF81, + 30218 - 11905: 0xF0FA, + 30219 - 11905: 0xAF82, + 30220 - 11905: 0xF0F8, + 30221 - 11905: 0xAF83, + 30222 - 11905: 0xAF84, + 30223 - 11905: 0xAF85, + 30224 - 11905: 0xF0F5, + 30225 - 11905: 0xAF86, + 30226 - 11905: 0xAF87, + 30227 - 11905: 0xAF88, + 30228 - 11905: 0xAF89, + 30229 - 11905: 0xF0FD, + 30230 - 11905: 0xAF8A, + 30231 - 11905: 0xF0F9, + 30232 - 11905: 0xF0FC, + 30233 - 11905: 0xF0FE, + 30234 - 11905: 0xAF8B, + 30235 - 11905: 0xF1A1, + 30236 - 11905: 0xAF8C, + 30237 - 11905: 0xAF8D, + 30238 - 11905: 0xAF8E, + 30239 - 11905: 0xCEC1, + 30240 - 11905: 0xF1A4, + 30241 - 11905: 0xAF8F, + 30242 - 11905: 0xF1A3, + 30243 - 11905: 0xAF90, + 30244 - 11905: 0xC1F6, + 30245 - 11905: 0xF0FB, + 30246 - 11905: 0xCADD, + 30247 - 11905: 0xAF91, + 30248 - 11905: 0xAF92, + 30249 - 11905: 0xB4F1, + 30250 - 11905: 0xB1F1, + 30251 - 11905: 0xCCB1, + 30252 - 11905: 0xAF93, + 30253 - 11905: 0xF1A6, + 30254 - 11905: 0xAF94, + 30255 - 11905: 0xAF95, + 30256 - 11905: 0xF1A7, + 30257 - 11905: 0xAF96, + 30258 - 11905: 0xAF97, + 30259 - 11905: 0xF1AC, + 30260 - 11905: 0xD5CE, + 30261 - 11905: 0xF1A9, + 30262 - 11905: 0xAF98, + 30263 - 11905: 0xAF99, + 30264 - 11905: 0xC8B3, + 30265 - 11905: 0xAF9A, + 30266 - 11905: 0xAF9B, + 30267 - 11905: 0xAF9C, + 30268 - 11905: 0xF1A2, + 30269 - 11905: 0xAF9D, + 30270 - 11905: 0xF1AB, + 30271 - 11905: 0xF1A8, + 30272 - 11905: 0xF1A5, + 30273 - 11905: 0xAF9E, + 30274 - 11905: 0xAF9F, + 30275 - 11905: 0xF1AA, + 30276 - 11905: 0xAFA0, + 30277 - 11905: 0xB040, + 30278 - 11905: 0xB041, + 30279 - 11905: 0xB042, + 30280 - 11905: 0xB043, + 30281 - 11905: 0xB044, + 30282 - 11905: 0xB045, + 30283 - 11905: 0xB046, + 30284 - 11905: 0xB0A9, + 30285 - 11905: 0xF1AD, + 30286 - 11905: 0xB047, + 30287 - 11905: 0xB048, + 30288 - 11905: 0xB049, + 30289 - 11905: 0xB04A, + 30290 - 11905: 0xB04B, + 30291 - 11905: 0xB04C, + 30292 - 11905: 0xF1AF, + 30293 - 11905: 0xB04D, + 30294 - 11905: 0xF1B1, + 30295 - 11905: 0xB04E, + 30296 - 11905: 0xB04F, + 30297 - 11905: 0xB050, + 30298 - 11905: 0xB051, + 30299 - 11905: 0xB052, + 30300 - 11905: 0xF1B0, + 30301 - 11905: 0xB053, + 30302 - 11905: 0xF1AE, + 30303 - 11905: 0xB054, + 30304 - 11905: 0xB055, + 30305 - 11905: 0xB056, + 30306 - 11905: 0xB057, + 30307 - 11905: 0xD1A2, + 30308 - 11905: 0xB058, + 30309 - 11905: 0xB059, + 30310 - 11905: 0xB05A, + 30311 - 11905: 0xB05B, + 30312 - 11905: 0xB05C, + 30313 - 11905: 0xB05D, + 30314 - 11905: 0xB05E, + 30315 - 11905: 0xF1B2, + 30316 - 11905: 0xB05F, + 30317 - 11905: 0xB060, + 30318 - 11905: 0xB061, + 30319 - 11905: 0xF1B3, + 30320 - 11905: 0xB062, + 30321 - 11905: 0xB063, + 30322 - 11905: 0xB064, + 30323 - 11905: 0xB065, + 30324 - 11905: 0xB066, + 30325 - 11905: 0xB067, + 30326 - 11905: 0xB068, + 30327 - 11905: 0xB069, + 30328 - 11905: 0xB9EF, + 30329 - 11905: 0xB06A, + 30330 - 11905: 0xB06B, + 30331 - 11905: 0xB5C7, + 30332 - 11905: 0xB06C, + 30333 - 11905: 0xB0D7, + 30334 - 11905: 0xB0D9, + 30335 - 11905: 0xB06D, + 30336 - 11905: 0xB06E, + 30337 - 11905: 0xB06F, + 30338 - 11905: 0xD4ED, + 30339 - 11905: 0xB070, + 30340 - 11905: 0xB5C4, + 30341 - 11905: 0xB071, + 30342 - 11905: 0xBDD4, + 30343 - 11905: 0xBBCA, + 30344 - 11905: 0xF0A7, + 30345 - 11905: 0xB072, + 30346 - 11905: 0xB073, + 30347 - 11905: 0xB8DE, + 30348 - 11905: 0xB074, + 30349 - 11905: 0xB075, + 30350 - 11905: 0xF0A8, + 30351 - 11905: 0xB076, + 30352 - 11905: 0xB077, + 30353 - 11905: 0xB0A8, + 30354 - 11905: 0xB078, + 30355 - 11905: 0xF0A9, + 30356 - 11905: 0xB079, + 30357 - 11905: 0xB07A, + 30358 - 11905: 0xCDEE, + 30359 - 11905: 0xB07B, + 30360 - 11905: 0xB07C, + 30361 - 11905: 0xF0AA, + 30362 - 11905: 0xB07D, + 30363 - 11905: 0xB07E, + 30364 - 11905: 0xB080, + 30365 - 11905: 0xB081, + 30366 - 11905: 0xB082, + 30367 - 11905: 0xB083, + 30368 - 11905: 0xB084, + 30369 - 11905: 0xB085, + 30370 - 11905: 0xB086, + 30371 - 11905: 0xB087, + 30372 - 11905: 0xF0AB, + 30373 - 11905: 0xB088, + 30374 - 11905: 0xB089, + 30375 - 11905: 0xB08A, + 30376 - 11905: 0xB08B, + 30377 - 11905: 0xB08C, + 30378 - 11905: 0xB08D, + 30379 - 11905: 0xB08E, + 30380 - 11905: 0xB08F, + 30381 - 11905: 0xB090, + 30382 - 11905: 0xC6A4, + 30383 - 11905: 0xB091, + 30384 - 11905: 0xB092, + 30385 - 11905: 0xD6E5, + 30386 - 11905: 0xF1E4, + 30387 - 11905: 0xB093, + 30388 - 11905: 0xF1E5, + 30389 - 11905: 0xB094, + 30390 - 11905: 0xB095, + 30391 - 11905: 0xB096, + 30392 - 11905: 0xB097, + 30393 - 11905: 0xB098, + 30394 - 11905: 0xB099, + 30395 - 11905: 0xB09A, + 30396 - 11905: 0xB09B, + 30397 - 11905: 0xB09C, + 30398 - 11905: 0xB09D, + 30399 - 11905: 0xC3F3, + 30400 - 11905: 0xB09E, + 30401 - 11905: 0xB09F, + 30402 - 11905: 0xD3DB, + 30403 - 11905: 0xB0A0, + 30404 - 11905: 0xB140, + 30405 - 11905: 0xD6D1, + 30406 - 11905: 0xC5E8, + 30407 - 11905: 0xB141, + 30408 - 11905: 0xD3AF, + 30409 - 11905: 0xB142, + 30410 - 11905: 0xD2E6, + 30411 - 11905: 0xB143, + 30412 - 11905: 0xB144, + 30413 - 11905: 0xEEC1, + 30414 - 11905: 0xB0BB, + 30415 - 11905: 0xD5B5, + 30416 - 11905: 0xD1CE, + 30417 - 11905: 0xBCE0, + 30418 - 11905: 0xBAD0, + 30419 - 11905: 0xB145, + 30420 - 11905: 0xBFF8, + 30421 - 11905: 0xB146, + 30422 - 11905: 0xB8C7, + 30423 - 11905: 0xB5C1, + 30424 - 11905: 0xC5CC, + 30425 - 11905: 0xB147, + 30426 - 11905: 0xB148, + 30427 - 11905: 0xCAA2, + 30428 - 11905: 0xB149, + 30429 - 11905: 0xB14A, + 30430 - 11905: 0xB14B, + 30431 - 11905: 0xC3CB, + 30432 - 11905: 0xB14C, + 30433 - 11905: 0xB14D, + 30434 - 11905: 0xB14E, + 30435 - 11905: 0xB14F, + 30436 - 11905: 0xB150, + 30437 - 11905: 0xEEC2, + 30438 - 11905: 0xB151, + 30439 - 11905: 0xB152, + 30440 - 11905: 0xB153, + 30441 - 11905: 0xB154, + 30442 - 11905: 0xB155, + 30443 - 11905: 0xB156, + 30444 - 11905: 0xB157, + 30445 - 11905: 0xB158, + 30446 - 11905: 0xC4BF, + 30447 - 11905: 0xB6A2, + 30448 - 11905: 0xB159, + 30449 - 11905: 0xEDEC, + 30450 - 11905: 0xC3A4, + 30451 - 11905: 0xB15A, + 30452 - 11905: 0xD6B1, + 30453 - 11905: 0xB15B, + 30454 - 11905: 0xB15C, + 30455 - 11905: 0xB15D, + 30456 - 11905: 0xCFE0, + 30457 - 11905: 0xEDEF, + 30458 - 11905: 0xB15E, + 30459 - 11905: 0xB15F, + 30460 - 11905: 0xC5CE, + 30461 - 11905: 0xB160, + 30462 - 11905: 0xB6DC, + 30463 - 11905: 0xB161, + 30464 - 11905: 0xB162, + 30465 - 11905: 0xCAA1, + 30466 - 11905: 0xB163, + 30467 - 11905: 0xB164, + 30468 - 11905: 0xEDED, + 30469 - 11905: 0xB165, + 30470 - 11905: 0xB166, + 30471 - 11905: 0xEDF0, + 30472 - 11905: 0xEDF1, + 30473 - 11905: 0xC3BC, + 30474 - 11905: 0xB167, + 30475 - 11905: 0xBFB4, + 30476 - 11905: 0xB168, + 30477 - 11905: 0xEDEE, + 30478 - 11905: 0xB169, + 30479 - 11905: 0xB16A, + 30480 - 11905: 0xB16B, + 30481 - 11905: 0xB16C, + 30482 - 11905: 0xB16D, + 30483 - 11905: 0xB16E, + 30484 - 11905: 0xB16F, + 30485 - 11905: 0xB170, + 30486 - 11905: 0xB171, + 30487 - 11905: 0xB172, + 30488 - 11905: 0xB173, + 30489 - 11905: 0xEDF4, + 30490 - 11905: 0xEDF2, + 30491 - 11905: 0xB174, + 30492 - 11905: 0xB175, + 30493 - 11905: 0xB176, + 30494 - 11905: 0xB177, + 30495 - 11905: 0xD5E6, + 30496 - 11905: 0xC3DF, + 30497 - 11905: 0xB178, + 30498 - 11905: 0xEDF3, + 30499 - 11905: 0xB179, + 30500 - 11905: 0xB17A, + 30501 - 11905: 0xB17B, + 30502 - 11905: 0xEDF6, + 30503 - 11905: 0xB17C, + 30504 - 11905: 0xD5A3, + 30505 - 11905: 0xD1A3, + 30506 - 11905: 0xB17D, + 30507 - 11905: 0xB17E, + 30508 - 11905: 0xB180, + 30509 - 11905: 0xEDF5, + 30510 - 11905: 0xB181, + 30511 - 11905: 0xC3D0, + 30512 - 11905: 0xB182, + 30513 - 11905: 0xB183, + 30514 - 11905: 0xB184, + 30515 - 11905: 0xB185, + 30516 - 11905: 0xB186, + 30517 - 11905: 0xEDF7, + 30518 - 11905: 0xBFF4, + 30519 - 11905: 0xBEEC, + 30520 - 11905: 0xEDF8, + 30521 - 11905: 0xB187, + 30522 - 11905: 0xCCF7, + 30523 - 11905: 0xB188, + 30524 - 11905: 0xD1DB, + 30525 - 11905: 0xB189, + 30526 - 11905: 0xB18A, + 30527 - 11905: 0xB18B, + 30528 - 11905: 0xD7C5, + 30529 - 11905: 0xD5F6, + 30530 - 11905: 0xB18C, + 30531 - 11905: 0xEDFC, + 30532 - 11905: 0xB18D, + 30533 - 11905: 0xB18E, + 30534 - 11905: 0xB18F, + 30535 - 11905: 0xEDFB, + 30536 - 11905: 0xB190, + 30537 - 11905: 0xB191, + 30538 - 11905: 0xB192, + 30539 - 11905: 0xB193, + 30540 - 11905: 0xB194, + 30541 - 11905: 0xB195, + 30542 - 11905: 0xB196, + 30543 - 11905: 0xB197, + 30544 - 11905: 0xEDF9, + 30545 - 11905: 0xEDFA, + 30546 - 11905: 0xB198, + 30547 - 11905: 0xB199, + 30548 - 11905: 0xB19A, + 30549 - 11905: 0xB19B, + 30550 - 11905: 0xB19C, + 30551 - 11905: 0xB19D, + 30552 - 11905: 0xB19E, + 30553 - 11905: 0xB19F, + 30554 - 11905: 0xEDFD, + 30555 - 11905: 0xBEA6, + 30556 - 11905: 0xB1A0, + 30557 - 11905: 0xB240, + 30558 - 11905: 0xB241, + 30559 - 11905: 0xB242, + 30560 - 11905: 0xB243, + 30561 - 11905: 0xCBAF, + 30562 - 11905: 0xEEA1, + 30563 - 11905: 0xB6BD, + 30564 - 11905: 0xB244, + 30565 - 11905: 0xEEA2, + 30566 - 11905: 0xC4C0, + 30567 - 11905: 0xB245, + 30568 - 11905: 0xEDFE, + 30569 - 11905: 0xB246, + 30570 - 11905: 0xB247, + 30571 - 11905: 0xBDDE, + 30572 - 11905: 0xB2C7, + 30573 - 11905: 0xB248, + 30574 - 11905: 0xB249, + 30575 - 11905: 0xB24A, + 30576 - 11905: 0xB24B, + 30577 - 11905: 0xB24C, + 30578 - 11905: 0xB24D, + 30579 - 11905: 0xB24E, + 30580 - 11905: 0xB24F, + 30581 - 11905: 0xB250, + 30582 - 11905: 0xB251, + 30583 - 11905: 0xB252, + 30584 - 11905: 0xB253, + 30585 - 11905: 0xB6C3, + 30586 - 11905: 0xB254, + 30587 - 11905: 0xB255, + 30588 - 11905: 0xB256, + 30589 - 11905: 0xEEA5, + 30590 - 11905: 0xD8BA, + 30591 - 11905: 0xEEA3, + 30592 - 11905: 0xEEA6, + 30593 - 11905: 0xB257, + 30594 - 11905: 0xB258, + 30595 - 11905: 0xB259, + 30596 - 11905: 0xC3E9, + 30597 - 11905: 0xB3F2, + 30598 - 11905: 0xB25A, + 30599 - 11905: 0xB25B, + 30600 - 11905: 0xB25C, + 30601 - 11905: 0xB25D, + 30602 - 11905: 0xB25E, + 30603 - 11905: 0xB25F, + 30604 - 11905: 0xEEA7, + 30605 - 11905: 0xEEA4, + 30606 - 11905: 0xCFB9, + 30607 - 11905: 0xB260, + 30608 - 11905: 0xB261, + 30609 - 11905: 0xEEA8, + 30610 - 11905: 0xC2F7, + 30611 - 11905: 0xB262, + 30612 - 11905: 0xB263, + 30613 - 11905: 0xB264, + 30614 - 11905: 0xB265, + 30615 - 11905: 0xB266, + 30616 - 11905: 0xB267, + 30617 - 11905: 0xB268, + 30618 - 11905: 0xB269, + 30619 - 11905: 0xB26A, + 30620 - 11905: 0xB26B, + 30621 - 11905: 0xB26C, + 30622 - 11905: 0xB26D, + 30623 - 11905: 0xEEA9, + 30624 - 11905: 0xEEAA, + 30625 - 11905: 0xB26E, + 30626 - 11905: 0xDEAB, + 30627 - 11905: 0xB26F, + 30628 - 11905: 0xB270, + 30629 - 11905: 0xC6B3, + 30630 - 11905: 0xB271, + 30631 - 11905: 0xC7C6, + 30632 - 11905: 0xB272, + 30633 - 11905: 0xD6F5, + 30634 - 11905: 0xB5C9, + 30635 - 11905: 0xB273, + 30636 - 11905: 0xCBB2, + 30637 - 11905: 0xB274, + 30638 - 11905: 0xB275, + 30639 - 11905: 0xB276, + 30640 - 11905: 0xEEAB, + 30641 - 11905: 0xB277, + 30642 - 11905: 0xB278, + 30643 - 11905: 0xCDAB, + 30644 - 11905: 0xB279, + 30645 - 11905: 0xEEAC, + 30646 - 11905: 0xB27A, + 30647 - 11905: 0xB27B, + 30648 - 11905: 0xB27C, + 30649 - 11905: 0xB27D, + 30650 - 11905: 0xB27E, + 30651 - 11905: 0xD5B0, + 30652 - 11905: 0xB280, + 30653 - 11905: 0xEEAD, + 30654 - 11905: 0xB281, + 30655 - 11905: 0xF6C4, + 30656 - 11905: 0xB282, + 30657 - 11905: 0xB283, + 30658 - 11905: 0xB284, + 30659 - 11905: 0xB285, + 30660 - 11905: 0xB286, + 30661 - 11905: 0xB287, + 30662 - 11905: 0xB288, + 30663 - 11905: 0xB289, + 30664 - 11905: 0xB28A, + 30665 - 11905: 0xB28B, + 30666 - 11905: 0xB28C, + 30667 - 11905: 0xB28D, + 30668 - 11905: 0xB28E, + 30669 - 11905: 0xDBC7, + 30670 - 11905: 0xB28F, + 30671 - 11905: 0xB290, + 30672 - 11905: 0xB291, + 30673 - 11905: 0xB292, + 30674 - 11905: 0xB293, + 30675 - 11905: 0xB294, + 30676 - 11905: 0xB295, + 30677 - 11905: 0xB296, + 30678 - 11905: 0xB297, + 30679 - 11905: 0xB4A3, + 30680 - 11905: 0xB298, + 30681 - 11905: 0xB299, + 30682 - 11905: 0xB29A, + 30683 - 11905: 0xC3AC, + 30684 - 11905: 0xF1E6, + 30685 - 11905: 0xB29B, + 30686 - 11905: 0xB29C, + 30687 - 11905: 0xB29D, + 30688 - 11905: 0xB29E, + 30689 - 11905: 0xB29F, + 30690 - 11905: 0xCAB8, + 30691 - 11905: 0xD2D3, + 30692 - 11905: 0xB2A0, + 30693 - 11905: 0xD6AA, + 30694 - 11905: 0xB340, + 30695 - 11905: 0xEFF2, + 30696 - 11905: 0xB341, + 30697 - 11905: 0xBED8, + 30698 - 11905: 0xB342, + 30699 - 11905: 0xBDC3, + 30700 - 11905: 0xEFF3, + 30701 - 11905: 0xB6CC, + 30702 - 11905: 0xB0AB, + 30703 - 11905: 0xB343, + 30704 - 11905: 0xB344, + 30705 - 11905: 0xB345, + 30706 - 11905: 0xB346, + 30707 - 11905: 0xCAAF, + 30708 - 11905: 0xB347, + 30709 - 11905: 0xB348, + 30710 - 11905: 0xEDB6, + 30711 - 11905: 0xB349, + 30712 - 11905: 0xEDB7, + 30713 - 11905: 0xB34A, + 30714 - 11905: 0xB34B, + 30715 - 11905: 0xB34C, + 30716 - 11905: 0xB34D, + 30717 - 11905: 0xCEF9, + 30718 - 11905: 0xB7AF, + 30719 - 11905: 0xBFF3, + 30720 - 11905: 0xEDB8, + 30721 - 11905: 0xC2EB, + 30722 - 11905: 0xC9B0, + 30723 - 11905: 0xB34E, + 30724 - 11905: 0xB34F, + 30725 - 11905: 0xB350, + 30726 - 11905: 0xB351, + 30727 - 11905: 0xB352, + 30728 - 11905: 0xB353, + 30729 - 11905: 0xEDB9, + 30730 - 11905: 0xB354, + 30731 - 11905: 0xB355, + 30732 - 11905: 0xC6F6, + 30733 - 11905: 0xBFB3, + 30734 - 11905: 0xB356, + 30735 - 11905: 0xB357, + 30736 - 11905: 0xB358, + 30737 - 11905: 0xEDBC, + 30738 - 11905: 0xC5F8, + 30739 - 11905: 0xB359, + 30740 - 11905: 0xD1D0, + 30741 - 11905: 0xB35A, + 30742 - 11905: 0xD7A9, + 30743 - 11905: 0xEDBA, + 30744 - 11905: 0xEDBB, + 30745 - 11905: 0xB35B, + 30746 - 11905: 0xD1E2, + 30747 - 11905: 0xB35C, + 30748 - 11905: 0xEDBF, + 30749 - 11905: 0xEDC0, + 30750 - 11905: 0xB35D, + 30751 - 11905: 0xEDC4, + 30752 - 11905: 0xB35E, + 30753 - 11905: 0xB35F, + 30754 - 11905: 0xB360, + 30755 - 11905: 0xEDC8, + 30756 - 11905: 0xB361, + 30757 - 11905: 0xEDC6, + 30758 - 11905: 0xEDCE, + 30759 - 11905: 0xD5E8, + 30760 - 11905: 0xB362, + 30761 - 11905: 0xEDC9, + 30762 - 11905: 0xB363, + 30763 - 11905: 0xB364, + 30764 - 11905: 0xEDC7, + 30765 - 11905: 0xEDBE, + 30766 - 11905: 0xB365, + 30767 - 11905: 0xB366, + 30768 - 11905: 0xC5E9, + 30769 - 11905: 0xB367, + 30770 - 11905: 0xB368, + 30771 - 11905: 0xB369, + 30772 - 11905: 0xC6C6, + 30773 - 11905: 0xB36A, + 30774 - 11905: 0xB36B, + 30775 - 11905: 0xC9E9, + 30776 - 11905: 0xD4D2, + 30777 - 11905: 0xEDC1, + 30778 - 11905: 0xEDC2, + 30779 - 11905: 0xEDC3, + 30780 - 11905: 0xEDC5, + 30781 - 11905: 0xB36C, + 30782 - 11905: 0xC0F9, + 30783 - 11905: 0xB36D, + 30784 - 11905: 0xB4A1, + 30785 - 11905: 0xB36E, + 30786 - 11905: 0xB36F, + 30787 - 11905: 0xB370, + 30788 - 11905: 0xB371, + 30789 - 11905: 0xB9E8, + 30790 - 11905: 0xB372, + 30791 - 11905: 0xEDD0, + 30792 - 11905: 0xB373, + 30793 - 11905: 0xB374, + 30794 - 11905: 0xB375, + 30795 - 11905: 0xB376, + 30796 - 11905: 0xEDD1, + 30797 - 11905: 0xB377, + 30798 - 11905: 0xEDCA, + 30799 - 11905: 0xB378, + 30800 - 11905: 0xEDCF, + 30801 - 11905: 0xB379, + 30802 - 11905: 0xCEF8, + 30803 - 11905: 0xB37A, + 30804 - 11905: 0xB37B, + 30805 - 11905: 0xCBB6, + 30806 - 11905: 0xEDCC, + 30807 - 11905: 0xEDCD, + 30808 - 11905: 0xB37C, + 30809 - 11905: 0xB37D, + 30810 - 11905: 0xB37E, + 30811 - 11905: 0xB380, + 30812 - 11905: 0xB381, + 30813 - 11905: 0xCFF5, + 30814 - 11905: 0xB382, + 30815 - 11905: 0xB383, + 30816 - 11905: 0xB384, + 30817 - 11905: 0xB385, + 30818 - 11905: 0xB386, + 30819 - 11905: 0xB387, + 30820 - 11905: 0xB388, + 30821 - 11905: 0xB389, + 30822 - 11905: 0xB38A, + 30823 - 11905: 0xB38B, + 30824 - 11905: 0xB38C, + 30825 - 11905: 0xB38D, + 30826 - 11905: 0xEDD2, + 30827 - 11905: 0xC1F2, + 30828 - 11905: 0xD3B2, + 30829 - 11905: 0xEDCB, + 30830 - 11905: 0xC8B7, + 30831 - 11905: 0xB38E, + 30832 - 11905: 0xB38F, + 30833 - 11905: 0xB390, + 30834 - 11905: 0xB391, + 30835 - 11905: 0xB392, + 30836 - 11905: 0xB393, + 30837 - 11905: 0xB394, + 30838 - 11905: 0xB395, + 30839 - 11905: 0xBCEF, + 30840 - 11905: 0xB396, + 30841 - 11905: 0xB397, + 30842 - 11905: 0xB398, + 30843 - 11905: 0xB399, + 30844 - 11905: 0xC5F0, + 30845 - 11905: 0xB39A, + 30846 - 11905: 0xB39B, + 30847 - 11905: 0xB39C, + 30848 - 11905: 0xB39D, + 30849 - 11905: 0xB39E, + 30850 - 11905: 0xB39F, + 30851 - 11905: 0xB3A0, + 30852 - 11905: 0xB440, + 30853 - 11905: 0xB441, + 30854 - 11905: 0xB442, + 30855 - 11905: 0xEDD6, + 30856 - 11905: 0xB443, + 30857 - 11905: 0xB5EF, + 30858 - 11905: 0xB444, + 30859 - 11905: 0xB445, + 30860 - 11905: 0xC2B5, + 30861 - 11905: 0xB0AD, + 30862 - 11905: 0xCBE9, + 30863 - 11905: 0xB446, + 30864 - 11905: 0xB447, + 30865 - 11905: 0xB1AE, + 30866 - 11905: 0xB448, + 30867 - 11905: 0xEDD4, + 30868 - 11905: 0xB449, + 30869 - 11905: 0xB44A, + 30870 - 11905: 0xB44B, + 30871 - 11905: 0xCDEB, + 30872 - 11905: 0xB5E2, + 30873 - 11905: 0xB44C, + 30874 - 11905: 0xEDD5, + 30875 - 11905: 0xEDD3, + 30876 - 11905: 0xEDD7, + 30877 - 11905: 0xB44D, + 30878 - 11905: 0xB44E, + 30879 - 11905: 0xB5FA, + 30880 - 11905: 0xB44F, + 30881 - 11905: 0xEDD8, + 30882 - 11905: 0xB450, + 30883 - 11905: 0xEDD9, + 30884 - 11905: 0xB451, + 30885 - 11905: 0xEDDC, + 30886 - 11905: 0xB452, + 30887 - 11905: 0xB1CC, + 30888 - 11905: 0xB453, + 30889 - 11905: 0xB454, + 30890 - 11905: 0xB455, + 30891 - 11905: 0xB456, + 30892 - 11905: 0xB457, + 30893 - 11905: 0xB458, + 30894 - 11905: 0xB459, + 30895 - 11905: 0xB45A, + 30896 - 11905: 0xC5F6, + 30897 - 11905: 0xBCEE, + 30898 - 11905: 0xEDDA, + 30899 - 11905: 0xCCBC, + 30900 - 11905: 0xB2EA, + 30901 - 11905: 0xB45B, + 30902 - 11905: 0xB45C, + 30903 - 11905: 0xB45D, + 30904 - 11905: 0xB45E, + 30905 - 11905: 0xEDDB, + 30906 - 11905: 0xB45F, + 30907 - 11905: 0xB460, + 30908 - 11905: 0xB461, + 30909 - 11905: 0xB462, + 30910 - 11905: 0xC4EB, + 30911 - 11905: 0xB463, + 30912 - 11905: 0xB464, + 30913 - 11905: 0xB4C5, + 30914 - 11905: 0xB465, + 30915 - 11905: 0xB466, + 30916 - 11905: 0xB467, + 30917 - 11905: 0xB0F5, + 30918 - 11905: 0xB468, + 30919 - 11905: 0xB469, + 30920 - 11905: 0xB46A, + 30921 - 11905: 0xEDDF, + 30922 - 11905: 0xC0DA, + 30923 - 11905: 0xB4E8, + 30924 - 11905: 0xB46B, + 30925 - 11905: 0xB46C, + 30926 - 11905: 0xB46D, + 30927 - 11905: 0xB46E, + 30928 - 11905: 0xC5CD, + 30929 - 11905: 0xB46F, + 30930 - 11905: 0xB470, + 30931 - 11905: 0xB471, + 30932 - 11905: 0xEDDD, + 30933 - 11905: 0xBFC4, + 30934 - 11905: 0xB472, + 30935 - 11905: 0xB473, + 30936 - 11905: 0xB474, + 30937 - 11905: 0xEDDE, + 30938 - 11905: 0xB475, + 30939 - 11905: 0xB476, + 30940 - 11905: 0xB477, + 30941 - 11905: 0xB478, + 30942 - 11905: 0xB479, + 30943 - 11905: 0xB47A, + 30944 - 11905: 0xB47B, + 30945 - 11905: 0xB47C, + 30946 - 11905: 0xB47D, + 30947 - 11905: 0xB47E, + 30948 - 11905: 0xB480, + 30949 - 11905: 0xB481, + 30950 - 11905: 0xB482, + 30951 - 11905: 0xB483, + 30952 - 11905: 0xC4A5, + 30953 - 11905: 0xB484, + 30954 - 11905: 0xB485, + 30955 - 11905: 0xB486, + 30956 - 11905: 0xEDE0, + 30957 - 11905: 0xB487, + 30958 - 11905: 0xB488, + 30959 - 11905: 0xB489, + 30960 - 11905: 0xB48A, + 30961 - 11905: 0xB48B, + 30962 - 11905: 0xEDE1, + 30963 - 11905: 0xB48C, + 30964 - 11905: 0xEDE3, + 30965 - 11905: 0xB48D, + 30966 - 11905: 0xB48E, + 30967 - 11905: 0xC1D7, + 30968 - 11905: 0xB48F, + 30969 - 11905: 0xB490, + 30970 - 11905: 0xBBC7, + 30971 - 11905: 0xB491, + 30972 - 11905: 0xB492, + 30973 - 11905: 0xB493, + 30974 - 11905: 0xB494, + 30975 - 11905: 0xB495, + 30976 - 11905: 0xB496, + 30977 - 11905: 0xBDB8, + 30978 - 11905: 0xB497, + 30979 - 11905: 0xB498, + 30980 - 11905: 0xB499, + 30981 - 11905: 0xEDE2, + 30982 - 11905: 0xB49A, + 30983 - 11905: 0xB49B, + 30984 - 11905: 0xB49C, + 30985 - 11905: 0xB49D, + 30986 - 11905: 0xB49E, + 30987 - 11905: 0xB49F, + 30988 - 11905: 0xB4A0, + 30989 - 11905: 0xB540, + 30990 - 11905: 0xB541, + 30991 - 11905: 0xB542, + 30992 - 11905: 0xB543, + 30993 - 11905: 0xB544, + 30994 - 11905: 0xB545, + 30995 - 11905: 0xEDE4, + 30996 - 11905: 0xB546, + 30997 - 11905: 0xB547, + 30998 - 11905: 0xB548, + 30999 - 11905: 0xB549, + 31000 - 11905: 0xB54A, + 31001 - 11905: 0xB54B, + 31002 - 11905: 0xB54C, + 31003 - 11905: 0xB54D, + 31004 - 11905: 0xB54E, + 31005 - 11905: 0xB54F, + 31006 - 11905: 0xEDE6, + 31007 - 11905: 0xB550, + 31008 - 11905: 0xB551, + 31009 - 11905: 0xB552, + 31010 - 11905: 0xB553, + 31011 - 11905: 0xB554, + 31012 - 11905: 0xEDE5, + 31013 - 11905: 0xB555, + 31014 - 11905: 0xB556, + 31015 - 11905: 0xB557, + 31016 - 11905: 0xB558, + 31017 - 11905: 0xB559, + 31018 - 11905: 0xB55A, + 31019 - 11905: 0xB55B, + 31020 - 11905: 0xB55C, + 31021 - 11905: 0xB55D, + 31022 - 11905: 0xB55E, + 31023 - 11905: 0xB55F, + 31024 - 11905: 0xB560, + 31025 - 11905: 0xB561, + 31026 - 11905: 0xB562, + 31027 - 11905: 0xB563, + 31028 - 11905: 0xEDE7, + 31029 - 11905: 0xB564, + 31030 - 11905: 0xB565, + 31031 - 11905: 0xB566, + 31032 - 11905: 0xB567, + 31033 - 11905: 0xB568, + 31034 - 11905: 0xCABE, + 31035 - 11905: 0xECEA, + 31036 - 11905: 0xC0F1, + 31037 - 11905: 0xB569, + 31038 - 11905: 0xC9E7, + 31039 - 11905: 0xB56A, + 31040 - 11905: 0xECEB, + 31041 - 11905: 0xC6EE, + 31042 - 11905: 0xB56B, + 31043 - 11905: 0xB56C, + 31044 - 11905: 0xB56D, + 31045 - 11905: 0xB56E, + 31046 - 11905: 0xECEC, + 31047 - 11905: 0xB56F, + 31048 - 11905: 0xC6ED, + 31049 - 11905: 0xECED, + 31050 - 11905: 0xB570, + 31051 - 11905: 0xB571, + 31052 - 11905: 0xB572, + 31053 - 11905: 0xB573, + 31054 - 11905: 0xB574, + 31055 - 11905: 0xB575, + 31056 - 11905: 0xB576, + 31057 - 11905: 0xB577, + 31058 - 11905: 0xB578, + 31059 - 11905: 0xECF0, + 31060 - 11905: 0xB579, + 31061 - 11905: 0xB57A, + 31062 - 11905: 0xD7E6, + 31063 - 11905: 0xECF3, + 31064 - 11905: 0xB57B, + 31065 - 11905: 0xB57C, + 31066 - 11905: 0xECF1, + 31067 - 11905: 0xECEE, + 31068 - 11905: 0xECEF, + 31069 - 11905: 0xD7A3, + 31070 - 11905: 0xC9F1, + 31071 - 11905: 0xCBEE, + 31072 - 11905: 0xECF4, + 31073 - 11905: 0xB57D, + 31074 - 11905: 0xECF2, + 31075 - 11905: 0xB57E, + 31076 - 11905: 0xB580, + 31077 - 11905: 0xCFE9, + 31078 - 11905: 0xB581, + 31079 - 11905: 0xECF6, + 31080 - 11905: 0xC6B1, + 31081 - 11905: 0xB582, + 31082 - 11905: 0xB583, + 31083 - 11905: 0xB584, + 31084 - 11905: 0xB585, + 31085 - 11905: 0xBCC0, + 31086 - 11905: 0xB586, + 31087 - 11905: 0xECF5, + 31088 - 11905: 0xB587, + 31089 - 11905: 0xB588, + 31090 - 11905: 0xB589, + 31091 - 11905: 0xB58A, + 31092 - 11905: 0xB58B, + 31093 - 11905: 0xB58C, + 31094 - 11905: 0xB58D, + 31095 - 11905: 0xB5BB, + 31096 - 11905: 0xBBF6, + 31097 - 11905: 0xB58E, + 31098 - 11905: 0xECF7, + 31099 - 11905: 0xB58F, + 31100 - 11905: 0xB590, + 31101 - 11905: 0xB591, + 31102 - 11905: 0xB592, + 31103 - 11905: 0xB593, + 31104 - 11905: 0xD9F7, + 31105 - 11905: 0xBDFB, + 31106 - 11905: 0xB594, + 31107 - 11905: 0xB595, + 31108 - 11905: 0xC2BB, + 31109 - 11905: 0xECF8, + 31110 - 11905: 0xB596, + 31111 - 11905: 0xB597, + 31112 - 11905: 0xB598, + 31113 - 11905: 0xB599, + 31114 - 11905: 0xECF9, + 31115 - 11905: 0xB59A, + 31116 - 11905: 0xB59B, + 31117 - 11905: 0xB59C, + 31118 - 11905: 0xB59D, + 31119 - 11905: 0xB8A3, + 31120 - 11905: 0xB59E, + 31121 - 11905: 0xB59F, + 31122 - 11905: 0xB5A0, + 31123 - 11905: 0xB640, + 31124 - 11905: 0xB641, + 31125 - 11905: 0xB642, + 31126 - 11905: 0xB643, + 31127 - 11905: 0xB644, + 31128 - 11905: 0xB645, + 31129 - 11905: 0xB646, + 31130 - 11905: 0xECFA, + 31131 - 11905: 0xB647, + 31132 - 11905: 0xB648, + 31133 - 11905: 0xB649, + 31134 - 11905: 0xB64A, + 31135 - 11905: 0xB64B, + 31136 - 11905: 0xB64C, + 31137 - 11905: 0xB64D, + 31138 - 11905: 0xB64E, + 31139 - 11905: 0xB64F, + 31140 - 11905: 0xB650, + 31141 - 11905: 0xB651, + 31142 - 11905: 0xB652, + 31143 - 11905: 0xECFB, + 31144 - 11905: 0xB653, + 31145 - 11905: 0xB654, + 31146 - 11905: 0xB655, + 31147 - 11905: 0xB656, + 31148 - 11905: 0xB657, + 31149 - 11905: 0xB658, + 31150 - 11905: 0xB659, + 31151 - 11905: 0xB65A, + 31152 - 11905: 0xB65B, + 31153 - 11905: 0xB65C, + 31154 - 11905: 0xB65D, + 31155 - 11905: 0xECFC, + 31156 - 11905: 0xB65E, + 31157 - 11905: 0xB65F, + 31158 - 11905: 0xB660, + 31159 - 11905: 0xB661, + 31160 - 11905: 0xB662, + 31161 - 11905: 0xD3ED, + 31162 - 11905: 0xD8AE, + 31163 - 11905: 0xC0EB, + 31164 - 11905: 0xB663, + 31165 - 11905: 0xC7DD, + 31166 - 11905: 0xBACC, + 31167 - 11905: 0xB664, + 31168 - 11905: 0xD0E3, + 31169 - 11905: 0xCBBD, + 31170 - 11905: 0xB665, + 31171 - 11905: 0xCDBA, + 31172 - 11905: 0xB666, + 31173 - 11905: 0xB667, + 31174 - 11905: 0xB8D1, + 31175 - 11905: 0xB668, + 31176 - 11905: 0xB669, + 31177 - 11905: 0xB1FC, + 31178 - 11905: 0xB66A, + 31179 - 11905: 0xC7EF, + 31180 - 11905: 0xB66B, + 31181 - 11905: 0xD6D6, + 31182 - 11905: 0xB66C, + 31183 - 11905: 0xB66D, + 31184 - 11905: 0xB66E, + 31185 - 11905: 0xBFC6, + 31186 - 11905: 0xC3EB, + 31187 - 11905: 0xB66F, + 31188 - 11905: 0xB670, + 31189 - 11905: 0xEFF5, + 31190 - 11905: 0xB671, + 31191 - 11905: 0xB672, + 31192 - 11905: 0xC3D8, + 31193 - 11905: 0xB673, + 31194 - 11905: 0xB674, + 31195 - 11905: 0xB675, + 31196 - 11905: 0xB676, + 31197 - 11905: 0xB677, + 31198 - 11905: 0xB678, + 31199 - 11905: 0xD7E2, + 31200 - 11905: 0xB679, + 31201 - 11905: 0xB67A, + 31202 - 11905: 0xB67B, + 31203 - 11905: 0xEFF7, + 31204 - 11905: 0xB3D3, + 31205 - 11905: 0xB67C, + 31206 - 11905: 0xC7D8, + 31207 - 11905: 0xD1ED, + 31208 - 11905: 0xB67D, + 31209 - 11905: 0xD6C8, + 31210 - 11905: 0xB67E, + 31211 - 11905: 0xEFF8, + 31212 - 11905: 0xB680, + 31213 - 11905: 0xEFF6, + 31214 - 11905: 0xB681, + 31215 - 11905: 0xBBFD, + 31216 - 11905: 0xB3C6, + 31217 - 11905: 0xB682, + 31218 - 11905: 0xB683, + 31219 - 11905: 0xB684, + 31220 - 11905: 0xB685, + 31221 - 11905: 0xB686, + 31222 - 11905: 0xB687, + 31223 - 11905: 0xB688, + 31224 - 11905: 0xBDD5, + 31225 - 11905: 0xB689, + 31226 - 11905: 0xB68A, + 31227 - 11905: 0xD2C6, + 31228 - 11905: 0xB68B, + 31229 - 11905: 0xBBE0, + 31230 - 11905: 0xB68C, + 31231 - 11905: 0xB68D, + 31232 - 11905: 0xCFA1, + 31233 - 11905: 0xB68E, + 31234 - 11905: 0xEFFC, + 31235 - 11905: 0xEFFB, + 31236 - 11905: 0xB68F, + 31237 - 11905: 0xB690, + 31238 - 11905: 0xEFF9, + 31239 - 11905: 0xB691, + 31240 - 11905: 0xB692, + 31241 - 11905: 0xB693, + 31242 - 11905: 0xB694, + 31243 - 11905: 0xB3CC, + 31244 - 11905: 0xB695, + 31245 - 11905: 0xC9D4, + 31246 - 11905: 0xCBB0, + 31247 - 11905: 0xB696, + 31248 - 11905: 0xB697, + 31249 - 11905: 0xB698, + 31250 - 11905: 0xB699, + 31251 - 11905: 0xB69A, + 31252 - 11905: 0xEFFE, + 31253 - 11905: 0xB69B, + 31254 - 11905: 0xB69C, + 31255 - 11905: 0xB0DE, + 31256 - 11905: 0xB69D, + 31257 - 11905: 0xB69E, + 31258 - 11905: 0xD6C9, + 31259 - 11905: 0xB69F, + 31260 - 11905: 0xB6A0, + 31261 - 11905: 0xB740, + 31262 - 11905: 0xEFFD, + 31263 - 11905: 0xB741, + 31264 - 11905: 0xB3ED, + 31265 - 11905: 0xB742, + 31266 - 11905: 0xB743, + 31267 - 11905: 0xF6D5, + 31268 - 11905: 0xB744, + 31269 - 11905: 0xB745, + 31270 - 11905: 0xB746, + 31271 - 11905: 0xB747, + 31272 - 11905: 0xB748, + 31273 - 11905: 0xB749, + 31274 - 11905: 0xB74A, + 31275 - 11905: 0xB74B, + 31276 - 11905: 0xB74C, + 31277 - 11905: 0xB74D, + 31278 - 11905: 0xB74E, + 31279 - 11905: 0xB74F, + 31280 - 11905: 0xB750, + 31281 - 11905: 0xB751, + 31282 - 11905: 0xB752, + 31283 - 11905: 0xCEC8, + 31284 - 11905: 0xB753, + 31285 - 11905: 0xB754, + 31286 - 11905: 0xB755, + 31287 - 11905: 0xF0A2, + 31288 - 11905: 0xB756, + 31289 - 11905: 0xF0A1, + 31290 - 11905: 0xB757, + 31291 - 11905: 0xB5BE, + 31292 - 11905: 0xBCDA, + 31293 - 11905: 0xBBFC, + 31294 - 11905: 0xB758, + 31295 - 11905: 0xB8E5, + 31296 - 11905: 0xB759, + 31297 - 11905: 0xB75A, + 31298 - 11905: 0xB75B, + 31299 - 11905: 0xB75C, + 31300 - 11905: 0xB75D, + 31301 - 11905: 0xB75E, + 31302 - 11905: 0xC4C2, + 31303 - 11905: 0xB75F, + 31304 - 11905: 0xB760, + 31305 - 11905: 0xB761, + 31306 - 11905: 0xB762, + 31307 - 11905: 0xB763, + 31308 - 11905: 0xB764, + 31309 - 11905: 0xB765, + 31310 - 11905: 0xB766, + 31311 - 11905: 0xB767, + 31312 - 11905: 0xB768, + 31313 - 11905: 0xF0A3, + 31314 - 11905: 0xB769, + 31315 - 11905: 0xB76A, + 31316 - 11905: 0xB76B, + 31317 - 11905: 0xB76C, + 31318 - 11905: 0xB76D, + 31319 - 11905: 0xCBEB, + 31320 - 11905: 0xB76E, + 31321 - 11905: 0xB76F, + 31322 - 11905: 0xB770, + 31323 - 11905: 0xB771, + 31324 - 11905: 0xB772, + 31325 - 11905: 0xB773, + 31326 - 11905: 0xB774, + 31327 - 11905: 0xB775, + 31328 - 11905: 0xB776, + 31329 - 11905: 0xB777, + 31330 - 11905: 0xB778, + 31331 - 11905: 0xB779, + 31332 - 11905: 0xB77A, + 31333 - 11905: 0xB77B, + 31334 - 11905: 0xB77C, + 31335 - 11905: 0xB77D, + 31336 - 11905: 0xB77E, + 31337 - 11905: 0xB780, + 31338 - 11905: 0xB781, + 31339 - 11905: 0xB782, + 31340 - 11905: 0xB783, + 31341 - 11905: 0xB784, + 31342 - 11905: 0xB785, + 31343 - 11905: 0xB786, + 31344 - 11905: 0xF0A6, + 31345 - 11905: 0xB787, + 31346 - 11905: 0xB788, + 31347 - 11905: 0xB789, + 31348 - 11905: 0xD1A8, + 31349 - 11905: 0xB78A, + 31350 - 11905: 0xBEBF, + 31351 - 11905: 0xC7EE, + 31352 - 11905: 0xF1B6, + 31353 - 11905: 0xF1B7, + 31354 - 11905: 0xBFD5, + 31355 - 11905: 0xB78B, + 31356 - 11905: 0xB78C, + 31357 - 11905: 0xB78D, + 31358 - 11905: 0xB78E, + 31359 - 11905: 0xB4A9, + 31360 - 11905: 0xF1B8, + 31361 - 11905: 0xCDBB, + 31362 - 11905: 0xB78F, + 31363 - 11905: 0xC7D4, + 31364 - 11905: 0xD5AD, + 31365 - 11905: 0xB790, + 31366 - 11905: 0xF1B9, + 31367 - 11905: 0xB791, + 31368 - 11905: 0xF1BA, + 31369 - 11905: 0xB792, + 31370 - 11905: 0xB793, + 31371 - 11905: 0xB794, + 31372 - 11905: 0xB795, + 31373 - 11905: 0xC7CF, + 31374 - 11905: 0xB796, + 31375 - 11905: 0xB797, + 31376 - 11905: 0xB798, + 31377 - 11905: 0xD2A4, + 31378 - 11905: 0xD6CF, + 31379 - 11905: 0xB799, + 31380 - 11905: 0xB79A, + 31381 - 11905: 0xF1BB, + 31382 - 11905: 0xBDD1, + 31383 - 11905: 0xB4B0, + 31384 - 11905: 0xBEBD, + 31385 - 11905: 0xB79B, + 31386 - 11905: 0xB79C, + 31387 - 11905: 0xB79D, + 31388 - 11905: 0xB4DC, + 31389 - 11905: 0xCED1, + 31390 - 11905: 0xB79E, + 31391 - 11905: 0xBFDF, + 31392 - 11905: 0xF1BD, + 31393 - 11905: 0xB79F, + 31394 - 11905: 0xB7A0, + 31395 - 11905: 0xB840, + 31396 - 11905: 0xB841, + 31397 - 11905: 0xBFFA, + 31398 - 11905: 0xF1BC, + 31399 - 11905: 0xB842, + 31400 - 11905: 0xF1BF, + 31401 - 11905: 0xB843, + 31402 - 11905: 0xB844, + 31403 - 11905: 0xB845, + 31404 - 11905: 0xF1BE, + 31405 - 11905: 0xF1C0, + 31406 - 11905: 0xB846, + 31407 - 11905: 0xB847, + 31408 - 11905: 0xB848, + 31409 - 11905: 0xB849, + 31410 - 11905: 0xB84A, + 31411 - 11905: 0xF1C1, + 31412 - 11905: 0xB84B, + 31413 - 11905: 0xB84C, + 31414 - 11905: 0xB84D, + 31415 - 11905: 0xB84E, + 31416 - 11905: 0xB84F, + 31417 - 11905: 0xB850, + 31418 - 11905: 0xB851, + 31419 - 11905: 0xB852, + 31420 - 11905: 0xB853, + 31421 - 11905: 0xB854, + 31422 - 11905: 0xB855, + 31423 - 11905: 0xC1FE, + 31424 - 11905: 0xB856, + 31425 - 11905: 0xB857, + 31426 - 11905: 0xB858, + 31427 - 11905: 0xB859, + 31428 - 11905: 0xB85A, + 31429 - 11905: 0xB85B, + 31430 - 11905: 0xB85C, + 31431 - 11905: 0xB85D, + 31432 - 11905: 0xB85E, + 31433 - 11905: 0xB85F, + 31434 - 11905: 0xB860, + 31435 - 11905: 0xC1A2, + 31436 - 11905: 0xB861, + 31437 - 11905: 0xB862, + 31438 - 11905: 0xB863, + 31439 - 11905: 0xB864, + 31440 - 11905: 0xB865, + 31441 - 11905: 0xB866, + 31442 - 11905: 0xB867, + 31443 - 11905: 0xB868, + 31444 - 11905: 0xB869, + 31445 - 11905: 0xB86A, + 31446 - 11905: 0xCAFA, + 31447 - 11905: 0xB86B, + 31448 - 11905: 0xB86C, + 31449 - 11905: 0xD5BE, + 31450 - 11905: 0xB86D, + 31451 - 11905: 0xB86E, + 31452 - 11905: 0xB86F, + 31453 - 11905: 0xB870, + 31454 - 11905: 0xBEBA, + 31455 - 11905: 0xBEB9, + 31456 - 11905: 0xD5C2, + 31457 - 11905: 0xB871, + 31458 - 11905: 0xB872, + 31459 - 11905: 0xBFA2, + 31460 - 11905: 0xB873, + 31461 - 11905: 0xCDAF, + 31462 - 11905: 0xF1B5, + 31463 - 11905: 0xB874, + 31464 - 11905: 0xB875, + 31465 - 11905: 0xB876, + 31466 - 11905: 0xB877, + 31467 - 11905: 0xB878, + 31468 - 11905: 0xB879, + 31469 - 11905: 0xBDDF, + 31470 - 11905: 0xB87A, + 31471 - 11905: 0xB6CB, + 31472 - 11905: 0xB87B, + 31473 - 11905: 0xB87C, + 31474 - 11905: 0xB87D, + 31475 - 11905: 0xB87E, + 31476 - 11905: 0xB880, + 31477 - 11905: 0xB881, + 31478 - 11905: 0xB882, + 31479 - 11905: 0xB883, + 31480 - 11905: 0xB884, + 31481 - 11905: 0xD6F1, + 31482 - 11905: 0xF3C3, + 31483 - 11905: 0xB885, + 31484 - 11905: 0xB886, + 31485 - 11905: 0xF3C4, + 31486 - 11905: 0xB887, + 31487 - 11905: 0xB8CD, + 31488 - 11905: 0xB888, + 31489 - 11905: 0xB889, + 31490 - 11905: 0xB88A, + 31491 - 11905: 0xF3C6, + 31492 - 11905: 0xF3C7, + 31493 - 11905: 0xB88B, + 31494 - 11905: 0xB0CA, + 31495 - 11905: 0xB88C, + 31496 - 11905: 0xF3C5, + 31497 - 11905: 0xB88D, + 31498 - 11905: 0xF3C9, + 31499 - 11905: 0xCBF1, + 31500 - 11905: 0xB88E, + 31501 - 11905: 0xB88F, + 31502 - 11905: 0xB890, + 31503 - 11905: 0xF3CB, + 31504 - 11905: 0xB891, + 31505 - 11905: 0xD0A6, + 31506 - 11905: 0xB892, + 31507 - 11905: 0xB893, + 31508 - 11905: 0xB1CA, + 31509 - 11905: 0xF3C8, + 31510 - 11905: 0xB894, + 31511 - 11905: 0xB895, + 31512 - 11905: 0xB896, + 31513 - 11905: 0xF3CF, + 31514 - 11905: 0xB897, + 31515 - 11905: 0xB5D1, + 31516 - 11905: 0xB898, + 31517 - 11905: 0xB899, + 31518 - 11905: 0xF3D7, + 31519 - 11905: 0xB89A, + 31520 - 11905: 0xF3D2, + 31521 - 11905: 0xB89B, + 31522 - 11905: 0xB89C, + 31523 - 11905: 0xB89D, + 31524 - 11905: 0xF3D4, + 31525 - 11905: 0xF3D3, + 31526 - 11905: 0xB7FB, + 31527 - 11905: 0xB89E, + 31528 - 11905: 0xB1BF, + 31529 - 11905: 0xB89F, + 31530 - 11905: 0xF3CE, + 31531 - 11905: 0xF3CA, + 31532 - 11905: 0xB5DA, + 31533 - 11905: 0xB8A0, + 31534 - 11905: 0xF3D0, + 31535 - 11905: 0xB940, + 31536 - 11905: 0xB941, + 31537 - 11905: 0xF3D1, + 31538 - 11905: 0xB942, + 31539 - 11905: 0xF3D5, + 31540 - 11905: 0xB943, + 31541 - 11905: 0xB944, + 31542 - 11905: 0xB945, + 31543 - 11905: 0xB946, + 31544 - 11905: 0xF3CD, + 31545 - 11905: 0xB947, + 31546 - 11905: 0xBCE3, + 31547 - 11905: 0xB948, + 31548 - 11905: 0xC1FD, + 31549 - 11905: 0xB949, + 31550 - 11905: 0xF3D6, + 31551 - 11905: 0xB94A, + 31552 - 11905: 0xB94B, + 31553 - 11905: 0xB94C, + 31554 - 11905: 0xB94D, + 31555 - 11905: 0xB94E, + 31556 - 11905: 0xB94F, + 31557 - 11905: 0xF3DA, + 31558 - 11905: 0xB950, + 31559 - 11905: 0xF3CC, + 31560 - 11905: 0xB951, + 31561 - 11905: 0xB5C8, + 31562 - 11905: 0xB952, + 31563 - 11905: 0xBDEE, + 31564 - 11905: 0xF3DC, + 31565 - 11905: 0xB953, + 31566 - 11905: 0xB954, + 31567 - 11905: 0xB7A4, + 31568 - 11905: 0xBFF0, + 31569 - 11905: 0xD6FE, + 31570 - 11905: 0xCDB2, + 31571 - 11905: 0xB955, + 31572 - 11905: 0xB4F0, + 31573 - 11905: 0xB956, + 31574 - 11905: 0xB2DF, + 31575 - 11905: 0xB957, + 31576 - 11905: 0xF3D8, + 31577 - 11905: 0xB958, + 31578 - 11905: 0xF3D9, + 31579 - 11905: 0xC9B8, + 31580 - 11905: 0xB959, + 31581 - 11905: 0xF3DD, + 31582 - 11905: 0xB95A, + 31583 - 11905: 0xB95B, + 31584 - 11905: 0xF3DE, + 31585 - 11905: 0xB95C, + 31586 - 11905: 0xF3E1, + 31587 - 11905: 0xB95D, + 31588 - 11905: 0xB95E, + 31589 - 11905: 0xB95F, + 31590 - 11905: 0xB960, + 31591 - 11905: 0xB961, + 31592 - 11905: 0xB962, + 31593 - 11905: 0xB963, + 31594 - 11905: 0xB964, + 31595 - 11905: 0xB965, + 31596 - 11905: 0xB966, + 31597 - 11905: 0xB967, + 31598 - 11905: 0xF3DF, + 31599 - 11905: 0xB968, + 31600 - 11905: 0xB969, + 31601 - 11905: 0xF3E3, + 31602 - 11905: 0xF3E2, + 31603 - 11905: 0xB96A, + 31604 - 11905: 0xB96B, + 31605 - 11905: 0xF3DB, + 31606 - 11905: 0xB96C, + 31607 - 11905: 0xBFEA, + 31608 - 11905: 0xB96D, + 31609 - 11905: 0xB3EF, + 31610 - 11905: 0xB96E, + 31611 - 11905: 0xF3E0, + 31612 - 11905: 0xB96F, + 31613 - 11905: 0xB970, + 31614 - 11905: 0xC7A9, + 31615 - 11905: 0xB971, + 31616 - 11905: 0xBCF2, + 31617 - 11905: 0xB972, + 31618 - 11905: 0xB973, + 31619 - 11905: 0xB974, + 31620 - 11905: 0xB975, + 31621 - 11905: 0xF3EB, + 31622 - 11905: 0xB976, + 31623 - 11905: 0xB977, + 31624 - 11905: 0xB978, + 31625 - 11905: 0xB979, + 31626 - 11905: 0xB97A, + 31627 - 11905: 0xB97B, + 31628 - 11905: 0xB97C, + 31629 - 11905: 0xB9BF, + 31630 - 11905: 0xB97D, + 31631 - 11905: 0xB97E, + 31632 - 11905: 0xF3E4, + 31633 - 11905: 0xB980, + 31634 - 11905: 0xB981, + 31635 - 11905: 0xB982, + 31636 - 11905: 0xB2AD, + 31637 - 11905: 0xBBFE, + 31638 - 11905: 0xB983, + 31639 - 11905: 0xCBE3, + 31640 - 11905: 0xB984, + 31641 - 11905: 0xB985, + 31642 - 11905: 0xB986, + 31643 - 11905: 0xB987, + 31644 - 11905: 0xF3ED, + 31645 - 11905: 0xF3E9, + 31646 - 11905: 0xB988, + 31647 - 11905: 0xB989, + 31648 - 11905: 0xB98A, + 31649 - 11905: 0xB9DC, + 31650 - 11905: 0xF3EE, + 31651 - 11905: 0xB98B, + 31652 - 11905: 0xB98C, + 31653 - 11905: 0xB98D, + 31654 - 11905: 0xF3E5, + 31655 - 11905: 0xF3E6, + 31656 - 11905: 0xF3EA, + 31657 - 11905: 0xC2E1, + 31658 - 11905: 0xF3EC, + 31659 - 11905: 0xF3EF, + 31660 - 11905: 0xF3E8, + 31661 - 11905: 0xBCFD, + 31662 - 11905: 0xB98E, + 31663 - 11905: 0xB98F, + 31664 - 11905: 0xB990, + 31665 - 11905: 0xCFE4, + 31666 - 11905: 0xB991, + 31667 - 11905: 0xB992, + 31668 - 11905: 0xF3F0, + 31669 - 11905: 0xB993, + 31670 - 11905: 0xB994, + 31671 - 11905: 0xB995, + 31672 - 11905: 0xF3E7, + 31673 - 11905: 0xB996, + 31674 - 11905: 0xB997, + 31675 - 11905: 0xB998, + 31676 - 11905: 0xB999, + 31677 - 11905: 0xB99A, + 31678 - 11905: 0xB99B, + 31679 - 11905: 0xB99C, + 31680 - 11905: 0xB99D, + 31681 - 11905: 0xF3F2, + 31682 - 11905: 0xB99E, + 31683 - 11905: 0xB99F, + 31684 - 11905: 0xB9A0, + 31685 - 11905: 0xBA40, + 31686 - 11905: 0xD7AD, + 31687 - 11905: 0xC6AA, + 31688 - 11905: 0xBA41, + 31689 - 11905: 0xBA42, + 31690 - 11905: 0xBA43, + 31691 - 11905: 0xBA44, + 31692 - 11905: 0xF3F3, + 31693 - 11905: 0xBA45, + 31694 - 11905: 0xBA46, + 31695 - 11905: 0xBA47, + 31696 - 11905: 0xBA48, + 31697 - 11905: 0xF3F1, + 31698 - 11905: 0xBA49, + 31699 - 11905: 0xC2A8, + 31700 - 11905: 0xBA4A, + 31701 - 11905: 0xBA4B, + 31702 - 11905: 0xBA4C, + 31703 - 11905: 0xBA4D, + 31704 - 11905: 0xBA4E, + 31705 - 11905: 0xB8DD, + 31706 - 11905: 0xF3F5, + 31707 - 11905: 0xBA4F, + 31708 - 11905: 0xBA50, + 31709 - 11905: 0xF3F4, + 31710 - 11905: 0xBA51, + 31711 - 11905: 0xBA52, + 31712 - 11905: 0xBA53, + 31713 - 11905: 0xB4DB, + 31714 - 11905: 0xBA54, + 31715 - 11905: 0xBA55, + 31716 - 11905: 0xBA56, + 31717 - 11905: 0xF3F6, + 31718 - 11905: 0xF3F7, + 31719 - 11905: 0xBA57, + 31720 - 11905: 0xBA58, + 31721 - 11905: 0xBA59, + 31722 - 11905: 0xF3F8, + 31723 - 11905: 0xBA5A, + 31724 - 11905: 0xBA5B, + 31725 - 11905: 0xBA5C, + 31726 - 11905: 0xC0BA, + 31727 - 11905: 0xBA5D, + 31728 - 11905: 0xBA5E, + 31729 - 11905: 0xC0E9, + 31730 - 11905: 0xBA5F, + 31731 - 11905: 0xBA60, + 31732 - 11905: 0xBA61, + 31733 - 11905: 0xBA62, + 31734 - 11905: 0xBA63, + 31735 - 11905: 0xC5F1, + 31736 - 11905: 0xBA64, + 31737 - 11905: 0xBA65, + 31738 - 11905: 0xBA66, + 31739 - 11905: 0xBA67, + 31740 - 11905: 0xF3FB, + 31741 - 11905: 0xBA68, + 31742 - 11905: 0xF3FA, + 31743 - 11905: 0xBA69, + 31744 - 11905: 0xBA6A, + 31745 - 11905: 0xBA6B, + 31746 - 11905: 0xBA6C, + 31747 - 11905: 0xBA6D, + 31748 - 11905: 0xBA6E, + 31749 - 11905: 0xBA6F, + 31750 - 11905: 0xBA70, + 31751 - 11905: 0xB4D8, + 31752 - 11905: 0xBA71, + 31753 - 11905: 0xBA72, + 31754 - 11905: 0xBA73, + 31755 - 11905: 0xF3FE, + 31756 - 11905: 0xF3F9, + 31757 - 11905: 0xBA74, + 31758 - 11905: 0xBA75, + 31759 - 11905: 0xF3FC, + 31760 - 11905: 0xBA76, + 31761 - 11905: 0xBA77, + 31762 - 11905: 0xBA78, + 31763 - 11905: 0xBA79, + 31764 - 11905: 0xBA7A, + 31765 - 11905: 0xBA7B, + 31766 - 11905: 0xF3FD, + 31767 - 11905: 0xBA7C, + 31768 - 11905: 0xBA7D, + 31769 - 11905: 0xBA7E, + 31770 - 11905: 0xBA80, + 31771 - 11905: 0xBA81, + 31772 - 11905: 0xBA82, + 31773 - 11905: 0xBA83, + 31774 - 11905: 0xBA84, + 31775 - 11905: 0xF4A1, + 31776 - 11905: 0xBA85, + 31777 - 11905: 0xBA86, + 31778 - 11905: 0xBA87, + 31779 - 11905: 0xBA88, + 31780 - 11905: 0xBA89, + 31781 - 11905: 0xBA8A, + 31782 - 11905: 0xF4A3, + 31783 - 11905: 0xBBC9, + 31784 - 11905: 0xBA8B, + 31785 - 11905: 0xBA8C, + 31786 - 11905: 0xF4A2, + 31787 - 11905: 0xBA8D, + 31788 - 11905: 0xBA8E, + 31789 - 11905: 0xBA8F, + 31790 - 11905: 0xBA90, + 31791 - 11905: 0xBA91, + 31792 - 11905: 0xBA92, + 31793 - 11905: 0xBA93, + 31794 - 11905: 0xBA94, + 31795 - 11905: 0xBA95, + 31796 - 11905: 0xBA96, + 31797 - 11905: 0xBA97, + 31798 - 11905: 0xBA98, + 31799 - 11905: 0xBA99, + 31800 - 11905: 0xF4A4, + 31801 - 11905: 0xBA9A, + 31802 - 11905: 0xBA9B, + 31803 - 11905: 0xBA9C, + 31804 - 11905: 0xBA9D, + 31805 - 11905: 0xBA9E, + 31806 - 11905: 0xBA9F, + 31807 - 11905: 0xB2BE, + 31808 - 11905: 0xF4A6, + 31809 - 11905: 0xF4A5, + 31810 - 11905: 0xBAA0, + 31811 - 11905: 0xBB40, + 31812 - 11905: 0xBB41, + 31813 - 11905: 0xBB42, + 31814 - 11905: 0xBB43, + 31815 - 11905: 0xBB44, + 31816 - 11905: 0xBB45, + 31817 - 11905: 0xBB46, + 31818 - 11905: 0xBB47, + 31819 - 11905: 0xBB48, + 31820 - 11905: 0xBB49, + 31821 - 11905: 0xBCAE, + 31822 - 11905: 0xBB4A, + 31823 - 11905: 0xBB4B, + 31824 - 11905: 0xBB4C, + 31825 - 11905: 0xBB4D, + 31826 - 11905: 0xBB4E, + 31827 - 11905: 0xBB4F, + 31828 - 11905: 0xBB50, + 31829 - 11905: 0xBB51, + 31830 - 11905: 0xBB52, + 31831 - 11905: 0xBB53, + 31832 - 11905: 0xBB54, + 31833 - 11905: 0xBB55, + 31834 - 11905: 0xBB56, + 31835 - 11905: 0xBB57, + 31836 - 11905: 0xBB58, + 31837 - 11905: 0xBB59, + 31838 - 11905: 0xBB5A, + 31839 - 11905: 0xBB5B, + 31840 - 11905: 0xBB5C, + 31841 - 11905: 0xBB5D, + 31842 - 11905: 0xBB5E, + 31843 - 11905: 0xBB5F, + 31844 - 11905: 0xBB60, + 31845 - 11905: 0xBB61, + 31846 - 11905: 0xBB62, + 31847 - 11905: 0xBB63, + 31848 - 11905: 0xBB64, + 31849 - 11905: 0xBB65, + 31850 - 11905: 0xBB66, + 31851 - 11905: 0xBB67, + 31852 - 11905: 0xBB68, + 31853 - 11905: 0xBB69, + 31854 - 11905: 0xBB6A, + 31855 - 11905: 0xBB6B, + 31856 - 11905: 0xBB6C, + 31857 - 11905: 0xBB6D, + 31858 - 11905: 0xBB6E, + 31859 - 11905: 0xC3D7, + 31860 - 11905: 0xD9E1, + 31861 - 11905: 0xBB6F, + 31862 - 11905: 0xBB70, + 31863 - 11905: 0xBB71, + 31864 - 11905: 0xBB72, + 31865 - 11905: 0xBB73, + 31866 - 11905: 0xBB74, + 31867 - 11905: 0xC0E0, + 31868 - 11905: 0xF4CC, + 31869 - 11905: 0xD7D1, + 31870 - 11905: 0xBB75, + 31871 - 11905: 0xBB76, + 31872 - 11905: 0xBB77, + 31873 - 11905: 0xBB78, + 31874 - 11905: 0xBB79, + 31875 - 11905: 0xBB7A, + 31876 - 11905: 0xBB7B, + 31877 - 11905: 0xBB7C, + 31878 - 11905: 0xBB7D, + 31879 - 11905: 0xBB7E, + 31880 - 11905: 0xBB80, + 31881 - 11905: 0xB7DB, + 31882 - 11905: 0xBB81, + 31883 - 11905: 0xBB82, + 31884 - 11905: 0xBB83, + 31885 - 11905: 0xBB84, + 31886 - 11905: 0xBB85, + 31887 - 11905: 0xBB86, + 31888 - 11905: 0xBB87, + 31889 - 11905: 0xF4CE, + 31890 - 11905: 0xC1A3, + 31891 - 11905: 0xBB88, + 31892 - 11905: 0xBB89, + 31893 - 11905: 0xC6C9, + 31894 - 11905: 0xBB8A, + 31895 - 11905: 0xB4D6, + 31896 - 11905: 0xD5B3, + 31897 - 11905: 0xBB8B, + 31898 - 11905: 0xBB8C, + 31899 - 11905: 0xBB8D, + 31900 - 11905: 0xF4D0, + 31901 - 11905: 0xF4CF, + 31902 - 11905: 0xF4D1, + 31903 - 11905: 0xCBDA, + 31904 - 11905: 0xBB8E, + 31905 - 11905: 0xBB8F, + 31906 - 11905: 0xF4D2, + 31907 - 11905: 0xBB90, + 31908 - 11905: 0xD4C1, + 31909 - 11905: 0xD6E0, + 31910 - 11905: 0xBB91, + 31911 - 11905: 0xBB92, + 31912 - 11905: 0xBB93, + 31913 - 11905: 0xBB94, + 31914 - 11905: 0xB7E0, + 31915 - 11905: 0xBB95, + 31916 - 11905: 0xBB96, + 31917 - 11905: 0xBB97, + 31918 - 11905: 0xC1B8, + 31919 - 11905: 0xBB98, + 31920 - 11905: 0xBB99, + 31921 - 11905: 0xC1BB, + 31922 - 11905: 0xF4D3, + 31923 - 11905: 0xBEAC, + 31924 - 11905: 0xBB9A, + 31925 - 11905: 0xBB9B, + 31926 - 11905: 0xBB9C, + 31927 - 11905: 0xBB9D, + 31928 - 11905: 0xBB9E, + 31929 - 11905: 0xB4E2, + 31930 - 11905: 0xBB9F, + 31931 - 11905: 0xBBA0, + 31932 - 11905: 0xF4D4, + 31933 - 11905: 0xF4D5, + 31934 - 11905: 0xBEAB, + 31935 - 11905: 0xBC40, + 31936 - 11905: 0xBC41, + 31937 - 11905: 0xF4D6, + 31938 - 11905: 0xBC42, + 31939 - 11905: 0xBC43, + 31940 - 11905: 0xBC44, + 31941 - 11905: 0xF4DB, + 31942 - 11905: 0xBC45, + 31943 - 11905: 0xF4D7, + 31944 - 11905: 0xF4DA, + 31945 - 11905: 0xBC46, + 31946 - 11905: 0xBAFD, + 31947 - 11905: 0xBC47, + 31948 - 11905: 0xF4D8, + 31949 - 11905: 0xF4D9, + 31950 - 11905: 0xBC48, + 31951 - 11905: 0xBC49, + 31952 - 11905: 0xBC4A, + 31953 - 11905: 0xBC4B, + 31954 - 11905: 0xBC4C, + 31955 - 11905: 0xBC4D, + 31956 - 11905: 0xBC4E, + 31957 - 11905: 0xB8E2, + 31958 - 11905: 0xCCC7, + 31959 - 11905: 0xF4DC, + 31960 - 11905: 0xBC4F, + 31961 - 11905: 0xB2DA, + 31962 - 11905: 0xBC50, + 31963 - 11905: 0xBC51, + 31964 - 11905: 0xC3D3, + 31965 - 11905: 0xBC52, + 31966 - 11905: 0xBC53, + 31967 - 11905: 0xD4E3, + 31968 - 11905: 0xBFB7, + 31969 - 11905: 0xBC54, + 31970 - 11905: 0xBC55, + 31971 - 11905: 0xBC56, + 31972 - 11905: 0xBC57, + 31973 - 11905: 0xBC58, + 31974 - 11905: 0xBC59, + 31975 - 11905: 0xBC5A, + 31976 - 11905: 0xF4DD, + 31977 - 11905: 0xBC5B, + 31978 - 11905: 0xBC5C, + 31979 - 11905: 0xBC5D, + 31980 - 11905: 0xBC5E, + 31981 - 11905: 0xBC5F, + 31982 - 11905: 0xBC60, + 31983 - 11905: 0xC5B4, + 31984 - 11905: 0xBC61, + 31985 - 11905: 0xBC62, + 31986 - 11905: 0xBC63, + 31987 - 11905: 0xBC64, + 31988 - 11905: 0xBC65, + 31989 - 11905: 0xBC66, + 31990 - 11905: 0xBC67, + 31991 - 11905: 0xBC68, + 31992 - 11905: 0xF4E9, + 31993 - 11905: 0xBC69, + 31994 - 11905: 0xBC6A, + 31995 - 11905: 0xCFB5, + 31996 - 11905: 0xBC6B, + 31997 - 11905: 0xBC6C, + 31998 - 11905: 0xBC6D, + 31999 - 11905: 0xBC6E, + 32000 - 11905: 0xBC6F, + 32001 - 11905: 0xBC70, + 32002 - 11905: 0xBC71, + 32003 - 11905: 0xBC72, + 32004 - 11905: 0xBC73, + 32005 - 11905: 0xBC74, + 32006 - 11905: 0xBC75, + 32007 - 11905: 0xBC76, + 32008 - 11905: 0xBC77, + 32009 - 11905: 0xBC78, + 32010 - 11905: 0xCEC9, + 32011 - 11905: 0xBC79, + 32012 - 11905: 0xBC7A, + 32013 - 11905: 0xBC7B, + 32014 - 11905: 0xBC7C, + 32015 - 11905: 0xBC7D, + 32016 - 11905: 0xBC7E, + 32017 - 11905: 0xBC80, + 32018 - 11905: 0xBC81, + 32019 - 11905: 0xBC82, + 32020 - 11905: 0xBC83, + 32021 - 11905: 0xBC84, + 32022 - 11905: 0xBC85, + 32023 - 11905: 0xBC86, + 32024 - 11905: 0xBC87, + 32025 - 11905: 0xBC88, + 32026 - 11905: 0xBC89, + 32027 - 11905: 0xBC8A, + 32028 - 11905: 0xBC8B, + 32029 - 11905: 0xBC8C, + 32030 - 11905: 0xBC8D, + 32031 - 11905: 0xBC8E, + 32032 - 11905: 0xCBD8, + 32033 - 11905: 0xBC8F, + 32034 - 11905: 0xCBF7, + 32035 - 11905: 0xBC90, + 32036 - 11905: 0xBC91, + 32037 - 11905: 0xBC92, + 32038 - 11905: 0xBC93, + 32039 - 11905: 0xBDF4, + 32040 - 11905: 0xBC94, + 32041 - 11905: 0xBC95, + 32042 - 11905: 0xBC96, + 32043 - 11905: 0xD7CF, + 32044 - 11905: 0xBC97, + 32045 - 11905: 0xBC98, + 32046 - 11905: 0xBC99, + 32047 - 11905: 0xC0DB, + 32048 - 11905: 0xBC9A, + 32049 - 11905: 0xBC9B, + 32050 - 11905: 0xBC9C, + 32051 - 11905: 0xBC9D, + 32052 - 11905: 0xBC9E, + 32053 - 11905: 0xBC9F, + 32054 - 11905: 0xBCA0, + 32055 - 11905: 0xBD40, + 32056 - 11905: 0xBD41, + 32057 - 11905: 0xBD42, + 32058 - 11905: 0xBD43, + 32059 - 11905: 0xBD44, + 32060 - 11905: 0xBD45, + 32061 - 11905: 0xBD46, + 32062 - 11905: 0xBD47, + 32063 - 11905: 0xBD48, + 32064 - 11905: 0xBD49, + 32065 - 11905: 0xBD4A, + 32066 - 11905: 0xBD4B, + 32067 - 11905: 0xBD4C, + 32068 - 11905: 0xBD4D, + 32069 - 11905: 0xBD4E, + 32070 - 11905: 0xBD4F, + 32071 - 11905: 0xBD50, + 32072 - 11905: 0xBD51, + 32073 - 11905: 0xBD52, + 32074 - 11905: 0xBD53, + 32075 - 11905: 0xBD54, + 32076 - 11905: 0xBD55, + 32077 - 11905: 0xBD56, + 32078 - 11905: 0xBD57, + 32079 - 11905: 0xBD58, + 32080 - 11905: 0xBD59, + 32081 - 11905: 0xBD5A, + 32082 - 11905: 0xBD5B, + 32083 - 11905: 0xBD5C, + 32084 - 11905: 0xBD5D, + 32085 - 11905: 0xBD5E, + 32086 - 11905: 0xBD5F, + 32087 - 11905: 0xBD60, + 32088 - 11905: 0xBD61, + 32089 - 11905: 0xBD62, + 32090 - 11905: 0xBD63, + 32091 - 11905: 0xBD64, + 32092 - 11905: 0xBD65, + 32093 - 11905: 0xBD66, + 32094 - 11905: 0xBD67, + 32095 - 11905: 0xBD68, + 32096 - 11905: 0xBD69, + 32097 - 11905: 0xBD6A, + 32098 - 11905: 0xBD6B, + 32099 - 11905: 0xBD6C, + 32100 - 11905: 0xBD6D, + 32101 - 11905: 0xBD6E, + 32102 - 11905: 0xBD6F, + 32103 - 11905: 0xBD70, + 32104 - 11905: 0xBD71, + 32105 - 11905: 0xBD72, + 32106 - 11905: 0xBD73, + 32107 - 11905: 0xBD74, + 32108 - 11905: 0xBD75, + 32109 - 11905: 0xBD76, + 32110 - 11905: 0xD0F5, + 32111 - 11905: 0xBD77, + 32112 - 11905: 0xBD78, + 32113 - 11905: 0xBD79, + 32114 - 11905: 0xBD7A, + 32115 - 11905: 0xBD7B, + 32116 - 11905: 0xBD7C, + 32117 - 11905: 0xBD7D, + 32118 - 11905: 0xBD7E, + 32119 - 11905: 0xF4EA, + 32120 - 11905: 0xBD80, + 32121 - 11905: 0xBD81, + 32122 - 11905: 0xBD82, + 32123 - 11905: 0xBD83, + 32124 - 11905: 0xBD84, + 32125 - 11905: 0xBD85, + 32126 - 11905: 0xBD86, + 32127 - 11905: 0xBD87, + 32128 - 11905: 0xBD88, + 32129 - 11905: 0xBD89, + 32130 - 11905: 0xBD8A, + 32131 - 11905: 0xBD8B, + 32132 - 11905: 0xBD8C, + 32133 - 11905: 0xBD8D, + 32134 - 11905: 0xBD8E, + 32135 - 11905: 0xBD8F, + 32136 - 11905: 0xBD90, + 32137 - 11905: 0xBD91, + 32138 - 11905: 0xBD92, + 32139 - 11905: 0xBD93, + 32140 - 11905: 0xBD94, + 32141 - 11905: 0xBD95, + 32142 - 11905: 0xBD96, + 32143 - 11905: 0xBD97, + 32144 - 11905: 0xBD98, + 32145 - 11905: 0xBD99, + 32146 - 11905: 0xBD9A, + 32147 - 11905: 0xBD9B, + 32148 - 11905: 0xBD9C, + 32149 - 11905: 0xBD9D, + 32150 - 11905: 0xBD9E, + 32151 - 11905: 0xBD9F, + 32152 - 11905: 0xBDA0, + 32153 - 11905: 0xBE40, + 32154 - 11905: 0xBE41, + 32155 - 11905: 0xBE42, + 32156 - 11905: 0xBE43, + 32157 - 11905: 0xBE44, + 32158 - 11905: 0xBE45, + 32159 - 11905: 0xBE46, + 32160 - 11905: 0xBE47, + 32161 - 11905: 0xBE48, + 32162 - 11905: 0xBE49, + 32163 - 11905: 0xBE4A, + 32164 - 11905: 0xBE4B, + 32165 - 11905: 0xBE4C, + 32166 - 11905: 0xF4EB, + 32167 - 11905: 0xBE4D, + 32168 - 11905: 0xBE4E, + 32169 - 11905: 0xBE4F, + 32170 - 11905: 0xBE50, + 32171 - 11905: 0xBE51, + 32172 - 11905: 0xBE52, + 32173 - 11905: 0xBE53, + 32174 - 11905: 0xF4EC, + 32175 - 11905: 0xBE54, + 32176 - 11905: 0xBE55, + 32177 - 11905: 0xBE56, + 32178 - 11905: 0xBE57, + 32179 - 11905: 0xBE58, + 32180 - 11905: 0xBE59, + 32181 - 11905: 0xBE5A, + 32182 - 11905: 0xBE5B, + 32183 - 11905: 0xBE5C, + 32184 - 11905: 0xBE5D, + 32185 - 11905: 0xBE5E, + 32186 - 11905: 0xBE5F, + 32187 - 11905: 0xBE60, + 32188 - 11905: 0xBE61, + 32189 - 11905: 0xBE62, + 32190 - 11905: 0xBE63, + 32191 - 11905: 0xBE64, + 32192 - 11905: 0xBE65, + 32193 - 11905: 0xBE66, + 32194 - 11905: 0xBE67, + 32195 - 11905: 0xBE68, + 32196 - 11905: 0xBE69, + 32197 - 11905: 0xBE6A, + 32198 - 11905: 0xBE6B, + 32199 - 11905: 0xBE6C, + 32200 - 11905: 0xBE6D, + 32201 - 11905: 0xBE6E, + 32202 - 11905: 0xBE6F, + 32203 - 11905: 0xBE70, + 32204 - 11905: 0xBE71, + 32205 - 11905: 0xBE72, + 32206 - 11905: 0xBE73, + 32207 - 11905: 0xBE74, + 32208 - 11905: 0xBE75, + 32209 - 11905: 0xBE76, + 32210 - 11905: 0xBE77, + 32211 - 11905: 0xBE78, + 32212 - 11905: 0xBE79, + 32213 - 11905: 0xBE7A, + 32214 - 11905: 0xBE7B, + 32215 - 11905: 0xBE7C, + 32216 - 11905: 0xBE7D, + 32217 - 11905: 0xBE7E, + 32218 - 11905: 0xBE80, + 32219 - 11905: 0xBE81, + 32220 - 11905: 0xBE82, + 32221 - 11905: 0xBE83, + 32222 - 11905: 0xBE84, + 32223 - 11905: 0xBE85, + 32224 - 11905: 0xBE86, + 32225 - 11905: 0xBE87, + 32226 - 11905: 0xBE88, + 32227 - 11905: 0xBE89, + 32228 - 11905: 0xBE8A, + 32229 - 11905: 0xBE8B, + 32230 - 11905: 0xBE8C, + 32231 - 11905: 0xBE8D, + 32232 - 11905: 0xBE8E, + 32233 - 11905: 0xBE8F, + 32234 - 11905: 0xBE90, + 32235 - 11905: 0xBE91, + 32236 - 11905: 0xBE92, + 32237 - 11905: 0xBE93, + 32238 - 11905: 0xBE94, + 32239 - 11905: 0xBE95, + 32240 - 11905: 0xBE96, + 32241 - 11905: 0xBE97, + 32242 - 11905: 0xBE98, + 32243 - 11905: 0xBE99, + 32244 - 11905: 0xBE9A, + 32245 - 11905: 0xBE9B, + 32246 - 11905: 0xBE9C, + 32247 - 11905: 0xBE9D, + 32248 - 11905: 0xBE9E, + 32249 - 11905: 0xBE9F, + 32250 - 11905: 0xBEA0, + 32251 - 11905: 0xBF40, + 32252 - 11905: 0xBF41, + 32253 - 11905: 0xBF42, + 32254 - 11905: 0xBF43, + 32255 - 11905: 0xBF44, + 32256 - 11905: 0xBF45, + 32257 - 11905: 0xBF46, + 32258 - 11905: 0xBF47, + 32259 - 11905: 0xBF48, + 32260 - 11905: 0xBF49, + 32261 - 11905: 0xBF4A, + 32262 - 11905: 0xBF4B, + 32263 - 11905: 0xBF4C, + 32264 - 11905: 0xBF4D, + 32265 - 11905: 0xBF4E, + 32266 - 11905: 0xBF4F, + 32267 - 11905: 0xBF50, + 32268 - 11905: 0xBF51, + 32269 - 11905: 0xBF52, + 32270 - 11905: 0xBF53, + 32271 - 11905: 0xBF54, + 32272 - 11905: 0xBF55, + 32273 - 11905: 0xBF56, + 32274 - 11905: 0xBF57, + 32275 - 11905: 0xBF58, + 32276 - 11905: 0xBF59, + 32277 - 11905: 0xBF5A, + 32278 - 11905: 0xBF5B, + 32279 - 11905: 0xBF5C, + 32280 - 11905: 0xBF5D, + 32281 - 11905: 0xBF5E, + 32282 - 11905: 0xBF5F, + 32283 - 11905: 0xBF60, + 32284 - 11905: 0xBF61, + 32285 - 11905: 0xBF62, + 32286 - 11905: 0xBF63, + 32287 - 11905: 0xBF64, + 32288 - 11905: 0xBF65, + 32289 - 11905: 0xBF66, + 32290 - 11905: 0xBF67, + 32291 - 11905: 0xBF68, + 32292 - 11905: 0xBF69, + 32293 - 11905: 0xBF6A, + 32294 - 11905: 0xBF6B, + 32295 - 11905: 0xBF6C, + 32296 - 11905: 0xBF6D, + 32297 - 11905: 0xBF6E, + 32298 - 11905: 0xBF6F, + 32299 - 11905: 0xBF70, + 32300 - 11905: 0xBF71, + 32301 - 11905: 0xBF72, + 32302 - 11905: 0xBF73, + 32303 - 11905: 0xBF74, + 32304 - 11905: 0xBF75, + 32305 - 11905: 0xBF76, + 32306 - 11905: 0xBF77, + 32307 - 11905: 0xBF78, + 32308 - 11905: 0xBF79, + 32309 - 11905: 0xBF7A, + 32310 - 11905: 0xBF7B, + 32311 - 11905: 0xBF7C, + 32312 - 11905: 0xBF7D, + 32313 - 11905: 0xBF7E, + 32314 - 11905: 0xBF80, + 32315 - 11905: 0xF7E3, + 32316 - 11905: 0xBF81, + 32317 - 11905: 0xBF82, + 32318 - 11905: 0xBF83, + 32319 - 11905: 0xBF84, + 32320 - 11905: 0xBF85, + 32321 - 11905: 0xB7B1, + 32322 - 11905: 0xBF86, + 32323 - 11905: 0xBF87, + 32324 - 11905: 0xBF88, + 32325 - 11905: 0xBF89, + 32326 - 11905: 0xBF8A, + 32327 - 11905: 0xF4ED, + 32328 - 11905: 0xBF8B, + 32329 - 11905: 0xBF8C, + 32330 - 11905: 0xBF8D, + 32331 - 11905: 0xBF8E, + 32332 - 11905: 0xBF8F, + 32333 - 11905: 0xBF90, + 32334 - 11905: 0xBF91, + 32335 - 11905: 0xBF92, + 32336 - 11905: 0xBF93, + 32337 - 11905: 0xBF94, + 32338 - 11905: 0xBF95, + 32339 - 11905: 0xBF96, + 32340 - 11905: 0xBF97, + 32341 - 11905: 0xBF98, + 32342 - 11905: 0xBF99, + 32343 - 11905: 0xBF9A, + 32344 - 11905: 0xBF9B, + 32345 - 11905: 0xBF9C, + 32346 - 11905: 0xBF9D, + 32347 - 11905: 0xBF9E, + 32348 - 11905: 0xBF9F, + 32349 - 11905: 0xBFA0, + 32350 - 11905: 0xC040, + 32351 - 11905: 0xC041, + 32352 - 11905: 0xC042, + 32353 - 11905: 0xC043, + 32354 - 11905: 0xC044, + 32355 - 11905: 0xC045, + 32356 - 11905: 0xC046, + 32357 - 11905: 0xC047, + 32358 - 11905: 0xC048, + 32359 - 11905: 0xC049, + 32360 - 11905: 0xC04A, + 32361 - 11905: 0xC04B, + 32362 - 11905: 0xC04C, + 32363 - 11905: 0xC04D, + 32364 - 11905: 0xC04E, + 32365 - 11905: 0xC04F, + 32366 - 11905: 0xC050, + 32367 - 11905: 0xC051, + 32368 - 11905: 0xC052, + 32369 - 11905: 0xC053, + 32370 - 11905: 0xC054, + 32371 - 11905: 0xC055, + 32372 - 11905: 0xC056, + 32373 - 11905: 0xC057, + 32374 - 11905: 0xC058, + 32375 - 11905: 0xC059, + 32376 - 11905: 0xC05A, + 32377 - 11905: 0xC05B, + 32378 - 11905: 0xC05C, + 32379 - 11905: 0xC05D, + 32380 - 11905: 0xC05E, + 32381 - 11905: 0xC05F, + 32382 - 11905: 0xC060, + 32383 - 11905: 0xC061, + 32384 - 11905: 0xC062, + 32385 - 11905: 0xC063, + 32386 - 11905: 0xD7EB, + 32387 - 11905: 0xC064, + 32388 - 11905: 0xC065, + 32389 - 11905: 0xC066, + 32390 - 11905: 0xC067, + 32391 - 11905: 0xC068, + 32392 - 11905: 0xC069, + 32393 - 11905: 0xC06A, + 32394 - 11905: 0xC06B, + 32395 - 11905: 0xC06C, + 32396 - 11905: 0xC06D, + 32397 - 11905: 0xC06E, + 32398 - 11905: 0xC06F, + 32399 - 11905: 0xC070, + 32400 - 11905: 0xC071, + 32401 - 11905: 0xC072, + 32402 - 11905: 0xC073, + 32403 - 11905: 0xC074, + 32404 - 11905: 0xC075, + 32405 - 11905: 0xC076, + 32406 - 11905: 0xC077, + 32407 - 11905: 0xC078, + 32408 - 11905: 0xC079, + 32409 - 11905: 0xC07A, + 32410 - 11905: 0xC07B, + 32411 - 11905: 0xF4EE, + 32412 - 11905: 0xC07C, + 32413 - 11905: 0xC07D, + 32414 - 11905: 0xC07E, + 32415 - 11905: 0xE6F9, + 32416 - 11905: 0xBEC0, + 32417 - 11905: 0xE6FA, + 32418 - 11905: 0xBAEC, + 32419 - 11905: 0xE6FB, + 32420 - 11905: 0xCFCB, + 32421 - 11905: 0xE6FC, + 32422 - 11905: 0xD4BC, + 32423 - 11905: 0xBCB6, + 32424 - 11905: 0xE6FD, + 32425 - 11905: 0xE6FE, + 32426 - 11905: 0xBCCD, + 32427 - 11905: 0xC8D2, + 32428 - 11905: 0xCEB3, + 32429 - 11905: 0xE7A1, + 32430 - 11905: 0xC080, + 32431 - 11905: 0xB4BF, + 32432 - 11905: 0xE7A2, + 32433 - 11905: 0xC9B4, + 32434 - 11905: 0xB8D9, + 32435 - 11905: 0xC4C9, + 32436 - 11905: 0xC081, + 32437 - 11905: 0xD7DD, + 32438 - 11905: 0xC2DA, + 32439 - 11905: 0xB7D7, + 32440 - 11905: 0xD6BD, + 32441 - 11905: 0xCEC6, + 32442 - 11905: 0xB7C4, + 32443 - 11905: 0xC082, + 32444 - 11905: 0xC083, + 32445 - 11905: 0xC5A6, + 32446 - 11905: 0xE7A3, + 32447 - 11905: 0xCFDF, + 32448 - 11905: 0xE7A4, + 32449 - 11905: 0xE7A5, + 32450 - 11905: 0xE7A6, + 32451 - 11905: 0xC1B7, + 32452 - 11905: 0xD7E9, + 32453 - 11905: 0xC9F0, + 32454 - 11905: 0xCFB8, + 32455 - 11905: 0xD6AF, + 32456 - 11905: 0xD6D5, + 32457 - 11905: 0xE7A7, + 32458 - 11905: 0xB0ED, + 32459 - 11905: 0xE7A8, + 32460 - 11905: 0xE7A9, + 32461 - 11905: 0xC9DC, + 32462 - 11905: 0xD2EF, + 32463 - 11905: 0xBEAD, + 32464 - 11905: 0xE7AA, + 32465 - 11905: 0xB0F3, + 32466 - 11905: 0xC8DE, + 32467 - 11905: 0xBDE1, + 32468 - 11905: 0xE7AB, + 32469 - 11905: 0xC8C6, + 32470 - 11905: 0xC084, + 32471 - 11905: 0xE7AC, + 32472 - 11905: 0xBBE6, + 32473 - 11905: 0xB8F8, + 32474 - 11905: 0xD1A4, + 32475 - 11905: 0xE7AD, + 32476 - 11905: 0xC2E7, + 32477 - 11905: 0xBEF8, + 32478 - 11905: 0xBDCA, + 32479 - 11905: 0xCDB3, + 32480 - 11905: 0xE7AE, + 32481 - 11905: 0xE7AF, + 32482 - 11905: 0xBEEE, + 32483 - 11905: 0xD0E5, + 32484 - 11905: 0xC085, + 32485 - 11905: 0xCBE7, + 32486 - 11905: 0xCCD0, + 32487 - 11905: 0xBCCC, + 32488 - 11905: 0xE7B0, + 32489 - 11905: 0xBCA8, + 32490 - 11905: 0xD0F7, + 32491 - 11905: 0xE7B1, + 32492 - 11905: 0xC086, + 32493 - 11905: 0xD0F8, + 32494 - 11905: 0xE7B2, + 32495 - 11905: 0xE7B3, + 32496 - 11905: 0xB4C2, + 32497 - 11905: 0xE7B4, + 32498 - 11905: 0xE7B5, + 32499 - 11905: 0xC9FE, + 32500 - 11905: 0xCEAC, + 32501 - 11905: 0xC3E0, + 32502 - 11905: 0xE7B7, + 32503 - 11905: 0xB1C1, + 32504 - 11905: 0xB3F1, + 32505 - 11905: 0xC087, + 32506 - 11905: 0xE7B8, + 32507 - 11905: 0xE7B9, + 32508 - 11905: 0xD7DB, + 32509 - 11905: 0xD5C0, + 32510 - 11905: 0xE7BA, + 32511 - 11905: 0xC2CC, + 32512 - 11905: 0xD7BA, + 32513 - 11905: 0xE7BB, + 32514 - 11905: 0xE7BC, + 32515 - 11905: 0xE7BD, + 32516 - 11905: 0xBCEA, + 32517 - 11905: 0xC3E5, + 32518 - 11905: 0xC0C2, + 32519 - 11905: 0xE7BE, + 32520 - 11905: 0xE7BF, + 32521 - 11905: 0xBCA9, + 32522 - 11905: 0xC088, + 32523 - 11905: 0xE7C0, + 32524 - 11905: 0xE7C1, + 32525 - 11905: 0xE7B6, + 32526 - 11905: 0xB6D0, + 32527 - 11905: 0xE7C2, + 32528 - 11905: 0xC089, + 32529 - 11905: 0xE7C3, + 32530 - 11905: 0xE7C4, + 32531 - 11905: 0xBBBA, + 32532 - 11905: 0xB5DE, + 32533 - 11905: 0xC2C6, + 32534 - 11905: 0xB1E0, + 32535 - 11905: 0xE7C5, + 32536 - 11905: 0xD4B5, + 32537 - 11905: 0xE7C6, + 32538 - 11905: 0xB8BF, + 32539 - 11905: 0xE7C8, + 32540 - 11905: 0xE7C7, + 32541 - 11905: 0xB7EC, + 32542 - 11905: 0xC08A, + 32543 - 11905: 0xE7C9, + 32544 - 11905: 0xB2F8, + 32545 - 11905: 0xE7CA, + 32546 - 11905: 0xE7CB, + 32547 - 11905: 0xE7CC, + 32548 - 11905: 0xE7CD, + 32549 - 11905: 0xE7CE, + 32550 - 11905: 0xE7CF, + 32551 - 11905: 0xE7D0, + 32552 - 11905: 0xD3A7, + 32553 - 11905: 0xCBF5, + 32554 - 11905: 0xE7D1, + 32555 - 11905: 0xE7D2, + 32556 - 11905: 0xE7D3, + 32557 - 11905: 0xE7D4, + 32558 - 11905: 0xC9C9, + 32559 - 11905: 0xE7D5, + 32560 - 11905: 0xE7D6, + 32561 - 11905: 0xE7D7, + 32562 - 11905: 0xE7D8, + 32563 - 11905: 0xE7D9, + 32564 - 11905: 0xBDC9, + 32565 - 11905: 0xE7DA, + 32566 - 11905: 0xF3BE, + 32567 - 11905: 0xC08B, + 32568 - 11905: 0xB8D7, + 32569 - 11905: 0xC08C, + 32570 - 11905: 0xC8B1, + 32571 - 11905: 0xC08D, + 32572 - 11905: 0xC08E, + 32573 - 11905: 0xC08F, + 32574 - 11905: 0xC090, + 32575 - 11905: 0xC091, + 32576 - 11905: 0xC092, + 32577 - 11905: 0xC093, + 32578 - 11905: 0xF3BF, + 32579 - 11905: 0xC094, + 32580 - 11905: 0xF3C0, + 32581 - 11905: 0xF3C1, + 32582 - 11905: 0xC095, + 32583 - 11905: 0xC096, + 32584 - 11905: 0xC097, + 32585 - 11905: 0xC098, + 32586 - 11905: 0xC099, + 32587 - 11905: 0xC09A, + 32588 - 11905: 0xC09B, + 32589 - 11905: 0xC09C, + 32590 - 11905: 0xC09D, + 32591 - 11905: 0xC09E, + 32592 - 11905: 0xB9DE, + 32593 - 11905: 0xCDF8, + 32594 - 11905: 0xC09F, + 32595 - 11905: 0xC0A0, + 32596 - 11905: 0xD8E8, + 32597 - 11905: 0xBAB1, + 32598 - 11905: 0xC140, + 32599 - 11905: 0xC2DE, + 32600 - 11905: 0xEEB7, + 32601 - 11905: 0xC141, + 32602 - 11905: 0xB7A3, + 32603 - 11905: 0xC142, + 32604 - 11905: 0xC143, + 32605 - 11905: 0xC144, + 32606 - 11905: 0xC145, + 32607 - 11905: 0xEEB9, + 32608 - 11905: 0xC146, + 32609 - 11905: 0xEEB8, + 32610 - 11905: 0xB0D5, + 32611 - 11905: 0xC147, + 32612 - 11905: 0xC148, + 32613 - 11905: 0xC149, + 32614 - 11905: 0xC14A, + 32615 - 11905: 0xC14B, + 32616 - 11905: 0xEEBB, + 32617 - 11905: 0xD5D6, + 32618 - 11905: 0xD7EF, + 32619 - 11905: 0xC14C, + 32620 - 11905: 0xC14D, + 32621 - 11905: 0xC14E, + 32622 - 11905: 0xD6C3, + 32623 - 11905: 0xC14F, + 32624 - 11905: 0xC150, + 32625 - 11905: 0xEEBD, + 32626 - 11905: 0xCAF0, + 32627 - 11905: 0xC151, + 32628 - 11905: 0xEEBC, + 32629 - 11905: 0xC152, + 32630 - 11905: 0xC153, + 32631 - 11905: 0xC154, + 32632 - 11905: 0xC155, + 32633 - 11905: 0xEEBE, + 32634 - 11905: 0xC156, + 32635 - 11905: 0xC157, + 32636 - 11905: 0xC158, + 32637 - 11905: 0xC159, + 32638 - 11905: 0xEEC0, + 32639 - 11905: 0xC15A, + 32640 - 11905: 0xC15B, + 32641 - 11905: 0xEEBF, + 32642 - 11905: 0xC15C, + 32643 - 11905: 0xC15D, + 32644 - 11905: 0xC15E, + 32645 - 11905: 0xC15F, + 32646 - 11905: 0xC160, + 32647 - 11905: 0xC161, + 32648 - 11905: 0xC162, + 32649 - 11905: 0xC163, + 32650 - 11905: 0xD1F2, + 32651 - 11905: 0xC164, + 32652 - 11905: 0xC7BC, + 32653 - 11905: 0xC165, + 32654 - 11905: 0xC3C0, + 32655 - 11905: 0xC166, + 32656 - 11905: 0xC167, + 32657 - 11905: 0xC168, + 32658 - 11905: 0xC169, + 32659 - 11905: 0xC16A, + 32660 - 11905: 0xB8E1, + 32661 - 11905: 0xC16B, + 32662 - 11905: 0xC16C, + 32663 - 11905: 0xC16D, + 32664 - 11905: 0xC16E, + 32665 - 11905: 0xC16F, + 32666 - 11905: 0xC1E7, + 32667 - 11905: 0xC170, + 32668 - 11905: 0xC171, + 32669 - 11905: 0xF4C6, + 32670 - 11905: 0xD0DF, + 32671 - 11905: 0xF4C7, + 32672 - 11905: 0xC172, + 32673 - 11905: 0xCFDB, + 32674 - 11905: 0xC173, + 32675 - 11905: 0xC174, + 32676 - 11905: 0xC8BA, + 32677 - 11905: 0xC175, + 32678 - 11905: 0xC176, + 32679 - 11905: 0xF4C8, + 32680 - 11905: 0xC177, + 32681 - 11905: 0xC178, + 32682 - 11905: 0xC179, + 32683 - 11905: 0xC17A, + 32684 - 11905: 0xC17B, + 32685 - 11905: 0xC17C, + 32686 - 11905: 0xC17D, + 32687 - 11905: 0xF4C9, + 32688 - 11905: 0xF4CA, + 32689 - 11905: 0xC17E, + 32690 - 11905: 0xF4CB, + 32691 - 11905: 0xC180, + 32692 - 11905: 0xC181, + 32693 - 11905: 0xC182, + 32694 - 11905: 0xC183, + 32695 - 11905: 0xC184, + 32696 - 11905: 0xD9FA, + 32697 - 11905: 0xB8FE, + 32698 - 11905: 0xC185, + 32699 - 11905: 0xC186, + 32700 - 11905: 0xE5F1, + 32701 - 11905: 0xD3F0, + 32702 - 11905: 0xC187, + 32703 - 11905: 0xF4E0, + 32704 - 11905: 0xC188, + 32705 - 11905: 0xCECC, + 32706 - 11905: 0xC189, + 32707 - 11905: 0xC18A, + 32708 - 11905: 0xC18B, + 32709 - 11905: 0xB3E1, + 32710 - 11905: 0xC18C, + 32711 - 11905: 0xC18D, + 32712 - 11905: 0xC18E, + 32713 - 11905: 0xC18F, + 32714 - 11905: 0xF1B4, + 32715 - 11905: 0xC190, + 32716 - 11905: 0xD2EE, + 32717 - 11905: 0xC191, + 32718 - 11905: 0xF4E1, + 32719 - 11905: 0xC192, + 32720 - 11905: 0xC193, + 32721 - 11905: 0xC194, + 32722 - 11905: 0xC195, + 32723 - 11905: 0xC196, + 32724 - 11905: 0xCFE8, + 32725 - 11905: 0xF4E2, + 32726 - 11905: 0xC197, + 32727 - 11905: 0xC198, + 32728 - 11905: 0xC7CC, + 32729 - 11905: 0xC199, + 32730 - 11905: 0xC19A, + 32731 - 11905: 0xC19B, + 32732 - 11905: 0xC19C, + 32733 - 11905: 0xC19D, + 32734 - 11905: 0xC19E, + 32735 - 11905: 0xB5D4, + 32736 - 11905: 0xB4E4, + 32737 - 11905: 0xF4E4, + 32738 - 11905: 0xC19F, + 32739 - 11905: 0xC1A0, + 32740 - 11905: 0xC240, + 32741 - 11905: 0xF4E3, + 32742 - 11905: 0xF4E5, + 32743 - 11905: 0xC241, + 32744 - 11905: 0xC242, + 32745 - 11905: 0xF4E6, + 32746 - 11905: 0xC243, + 32747 - 11905: 0xC244, + 32748 - 11905: 0xC245, + 32749 - 11905: 0xC246, + 32750 - 11905: 0xF4E7, + 32751 - 11905: 0xC247, + 32752 - 11905: 0xBAB2, + 32753 - 11905: 0xB0BF, + 32754 - 11905: 0xC248, + 32755 - 11905: 0xF4E8, + 32756 - 11905: 0xC249, + 32757 - 11905: 0xC24A, + 32758 - 11905: 0xC24B, + 32759 - 11905: 0xC24C, + 32760 - 11905: 0xC24D, + 32761 - 11905: 0xC24E, + 32762 - 11905: 0xC24F, + 32763 - 11905: 0xB7AD, + 32764 - 11905: 0xD2ED, + 32765 - 11905: 0xC250, + 32766 - 11905: 0xC251, + 32767 - 11905: 0xC252, + 32768 - 11905: 0xD2AB, + 32769 - 11905: 0xC0CF, + 32770 - 11905: 0xC253, + 32771 - 11905: 0xBFBC, + 32772 - 11905: 0xEBA3, + 32773 - 11905: 0xD5DF, + 32774 - 11905: 0xEAC8, + 32775 - 11905: 0xC254, + 32776 - 11905: 0xC255, + 32777 - 11905: 0xC256, + 32778 - 11905: 0xC257, + 32779 - 11905: 0xF1F3, + 32780 - 11905: 0xB6F8, + 32781 - 11905: 0xCBA3, + 32782 - 11905: 0xC258, + 32783 - 11905: 0xC259, + 32784 - 11905: 0xC4CD, + 32785 - 11905: 0xC25A, + 32786 - 11905: 0xF1E7, + 32787 - 11905: 0xC25B, + 32788 - 11905: 0xF1E8, + 32789 - 11905: 0xB8FB, + 32790 - 11905: 0xF1E9, + 32791 - 11905: 0xBAC4, + 32792 - 11905: 0xD4C5, + 32793 - 11905: 0xB0D2, + 32794 - 11905: 0xC25C, + 32795 - 11905: 0xC25D, + 32796 - 11905: 0xF1EA, + 32797 - 11905: 0xC25E, + 32798 - 11905: 0xC25F, + 32799 - 11905: 0xC260, + 32800 - 11905: 0xF1EB, + 32801 - 11905: 0xC261, + 32802 - 11905: 0xF1EC, + 32803 - 11905: 0xC262, + 32804 - 11905: 0xC263, + 32805 - 11905: 0xF1ED, + 32806 - 11905: 0xF1EE, + 32807 - 11905: 0xF1EF, + 32808 - 11905: 0xF1F1, + 32809 - 11905: 0xF1F0, + 32810 - 11905: 0xC5D5, + 32811 - 11905: 0xC264, + 32812 - 11905: 0xC265, + 32813 - 11905: 0xC266, + 32814 - 11905: 0xC267, + 32815 - 11905: 0xC268, + 32816 - 11905: 0xC269, + 32817 - 11905: 0xF1F2, + 32818 - 11905: 0xC26A, + 32819 - 11905: 0xB6FA, + 32820 - 11905: 0xC26B, + 32821 - 11905: 0xF1F4, + 32822 - 11905: 0xD2AE, + 32823 - 11905: 0xDEC7, + 32824 - 11905: 0xCBCA, + 32825 - 11905: 0xC26C, + 32826 - 11905: 0xC26D, + 32827 - 11905: 0xB3DC, + 32828 - 11905: 0xC26E, + 32829 - 11905: 0xB5A2, + 32830 - 11905: 0xC26F, + 32831 - 11905: 0xB9A2, + 32832 - 11905: 0xC270, + 32833 - 11905: 0xC271, + 32834 - 11905: 0xC4F4, + 32835 - 11905: 0xF1F5, + 32836 - 11905: 0xC272, + 32837 - 11905: 0xC273, + 32838 - 11905: 0xF1F6, + 32839 - 11905: 0xC274, + 32840 - 11905: 0xC275, + 32841 - 11905: 0xC276, + 32842 - 11905: 0xC1C4, + 32843 - 11905: 0xC1FB, + 32844 - 11905: 0xD6B0, + 32845 - 11905: 0xF1F7, + 32846 - 11905: 0xC277, + 32847 - 11905: 0xC278, + 32848 - 11905: 0xC279, + 32849 - 11905: 0xC27A, + 32850 - 11905: 0xF1F8, + 32851 - 11905: 0xC27B, + 32852 - 11905: 0xC1AA, + 32853 - 11905: 0xC27C, + 32854 - 11905: 0xC27D, + 32855 - 11905: 0xC27E, + 32856 - 11905: 0xC6B8, + 32857 - 11905: 0xC280, + 32858 - 11905: 0xBEDB, + 32859 - 11905: 0xC281, + 32860 - 11905: 0xC282, + 32861 - 11905: 0xC283, + 32862 - 11905: 0xC284, + 32863 - 11905: 0xC285, + 32864 - 11905: 0xC286, + 32865 - 11905: 0xC287, + 32866 - 11905: 0xC288, + 32867 - 11905: 0xC289, + 32868 - 11905: 0xC28A, + 32869 - 11905: 0xC28B, + 32870 - 11905: 0xC28C, + 32871 - 11905: 0xC28D, + 32872 - 11905: 0xC28E, + 32873 - 11905: 0xF1F9, + 32874 - 11905: 0xB4CF, + 32875 - 11905: 0xC28F, + 32876 - 11905: 0xC290, + 32877 - 11905: 0xC291, + 32878 - 11905: 0xC292, + 32879 - 11905: 0xC293, + 32880 - 11905: 0xC294, + 32881 - 11905: 0xF1FA, + 32882 - 11905: 0xC295, + 32883 - 11905: 0xC296, + 32884 - 11905: 0xC297, + 32885 - 11905: 0xC298, + 32886 - 11905: 0xC299, + 32887 - 11905: 0xC29A, + 32888 - 11905: 0xC29B, + 32889 - 11905: 0xC29C, + 32890 - 11905: 0xC29D, + 32891 - 11905: 0xC29E, + 32892 - 11905: 0xC29F, + 32893 - 11905: 0xC2A0, + 32894 - 11905: 0xC340, + 32895 - 11905: 0xEDB2, + 32896 - 11905: 0xEDB1, + 32897 - 11905: 0xC341, + 32898 - 11905: 0xC342, + 32899 - 11905: 0xCBE0, + 32900 - 11905: 0xD2DE, + 32901 - 11905: 0xC343, + 32902 - 11905: 0xCBC1, + 32903 - 11905: 0xD5D8, + 32904 - 11905: 0xC344, + 32905 - 11905: 0xC8E2, + 32906 - 11905: 0xC345, + 32907 - 11905: 0xC0DF, + 32908 - 11905: 0xBCA1, + 32909 - 11905: 0xC346, + 32910 - 11905: 0xC347, + 32911 - 11905: 0xC348, + 32912 - 11905: 0xC349, + 32913 - 11905: 0xC34A, + 32914 - 11905: 0xC34B, + 32915 - 11905: 0xEBC1, + 32916 - 11905: 0xC34C, + 32917 - 11905: 0xC34D, + 32918 - 11905: 0xD0A4, + 32919 - 11905: 0xC34E, + 32920 - 11905: 0xD6E2, + 32921 - 11905: 0xC34F, + 32922 - 11905: 0xB6C7, + 32923 - 11905: 0xB8D8, + 32924 - 11905: 0xEBC0, + 32925 - 11905: 0xB8CE, + 32926 - 11905: 0xC350, + 32927 - 11905: 0xEBBF, + 32928 - 11905: 0xB3A6, + 32929 - 11905: 0xB9C9, + 32930 - 11905: 0xD6AB, + 32931 - 11905: 0xC351, + 32932 - 11905: 0xB7F4, + 32933 - 11905: 0xB7CA, + 32934 - 11905: 0xC352, + 32935 - 11905: 0xC353, + 32936 - 11905: 0xC354, + 32937 - 11905: 0xBCE7, + 32938 - 11905: 0xB7BE, + 32939 - 11905: 0xEBC6, + 32940 - 11905: 0xC355, + 32941 - 11905: 0xEBC7, + 32942 - 11905: 0xB0B9, + 32943 - 11905: 0xBFCF, + 32944 - 11905: 0xC356, + 32945 - 11905: 0xEBC5, + 32946 - 11905: 0xD3FD, + 32947 - 11905: 0xC357, + 32948 - 11905: 0xEBC8, + 32949 - 11905: 0xC358, + 32950 - 11905: 0xC359, + 32951 - 11905: 0xEBC9, + 32952 - 11905: 0xC35A, + 32953 - 11905: 0xC35B, + 32954 - 11905: 0xB7CE, + 32955 - 11905: 0xC35C, + 32956 - 11905: 0xEBC2, + 32957 - 11905: 0xEBC4, + 32958 - 11905: 0xC9F6, + 32959 - 11905: 0xD6D7, + 32960 - 11905: 0xD5CD, + 32961 - 11905: 0xD0B2, + 32962 - 11905: 0xEBCF, + 32963 - 11905: 0xCEB8, + 32964 - 11905: 0xEBD0, + 32965 - 11905: 0xC35D, + 32966 - 11905: 0xB5A8, + 32967 - 11905: 0xC35E, + 32968 - 11905: 0xC35F, + 32969 - 11905: 0xC360, + 32970 - 11905: 0xC361, + 32971 - 11905: 0xC362, + 32972 - 11905: 0xB1B3, + 32973 - 11905: 0xEBD2, + 32974 - 11905: 0xCCA5, + 32975 - 11905: 0xC363, + 32976 - 11905: 0xC364, + 32977 - 11905: 0xC365, + 32978 - 11905: 0xC366, + 32979 - 11905: 0xC367, + 32980 - 11905: 0xC368, + 32981 - 11905: 0xC369, + 32982 - 11905: 0xC5D6, + 32983 - 11905: 0xEBD3, + 32984 - 11905: 0xC36A, + 32985 - 11905: 0xEBD1, + 32986 - 11905: 0xC5DF, + 32987 - 11905: 0xEBCE, + 32988 - 11905: 0xCAA4, + 32989 - 11905: 0xEBD5, + 32990 - 11905: 0xB0FB, + 32991 - 11905: 0xC36B, + 32992 - 11905: 0xC36C, + 32993 - 11905: 0xBAFA, + 32994 - 11905: 0xC36D, + 32995 - 11905: 0xC36E, + 32996 - 11905: 0xD8B7, + 32997 - 11905: 0xF1E3, + 32998 - 11905: 0xC36F, + 32999 - 11905: 0xEBCA, + 33000 - 11905: 0xEBCB, + 33001 - 11905: 0xEBCC, + 33002 - 11905: 0xEBCD, + 33003 - 11905: 0xEBD6, + 33004 - 11905: 0xE6C0, + 33005 - 11905: 0xEBD9, + 33006 - 11905: 0xC370, + 33007 - 11905: 0xBFE8, + 33008 - 11905: 0xD2C8, + 33009 - 11905: 0xEBD7, + 33010 - 11905: 0xEBDC, + 33011 - 11905: 0xB8EC, + 33012 - 11905: 0xEBD8, + 33013 - 11905: 0xC371, + 33014 - 11905: 0xBDBA, + 33015 - 11905: 0xC372, + 33016 - 11905: 0xD0D8, + 33017 - 11905: 0xC373, + 33018 - 11905: 0xB0B7, + 33019 - 11905: 0xC374, + 33020 - 11905: 0xEBDD, + 33021 - 11905: 0xC4DC, + 33022 - 11905: 0xC375, + 33023 - 11905: 0xC376, + 33024 - 11905: 0xC377, + 33025 - 11905: 0xC378, + 33026 - 11905: 0xD6AC, + 33027 - 11905: 0xC379, + 33028 - 11905: 0xC37A, + 33029 - 11905: 0xC37B, + 33030 - 11905: 0xB4E0, + 33031 - 11905: 0xC37C, + 33032 - 11905: 0xC37D, + 33033 - 11905: 0xC2F6, + 33034 - 11905: 0xBCB9, + 33035 - 11905: 0xC37E, + 33036 - 11905: 0xC380, + 33037 - 11905: 0xEBDA, + 33038 - 11905: 0xEBDB, + 33039 - 11905: 0xD4E0, + 33040 - 11905: 0xC6EA, + 33041 - 11905: 0xC4D4, + 33042 - 11905: 0xEBDF, + 33043 - 11905: 0xC5A7, + 33044 - 11905: 0xD9F5, + 33045 - 11905: 0xC381, + 33046 - 11905: 0xB2B1, + 33047 - 11905: 0xC382, + 33048 - 11905: 0xEBE4, + 33049 - 11905: 0xC383, + 33050 - 11905: 0xBDC5, + 33051 - 11905: 0xC384, + 33052 - 11905: 0xC385, + 33053 - 11905: 0xC386, + 33054 - 11905: 0xEBE2, + 33055 - 11905: 0xC387, + 33056 - 11905: 0xC388, + 33057 - 11905: 0xC389, + 33058 - 11905: 0xC38A, + 33059 - 11905: 0xC38B, + 33060 - 11905: 0xC38C, + 33061 - 11905: 0xC38D, + 33062 - 11905: 0xC38E, + 33063 - 11905: 0xC38F, + 33064 - 11905: 0xC390, + 33065 - 11905: 0xC391, + 33066 - 11905: 0xC392, + 33067 - 11905: 0xC393, + 33068 - 11905: 0xEBE3, + 33069 - 11905: 0xC394, + 33070 - 11905: 0xC395, + 33071 - 11905: 0xB8AC, + 33072 - 11905: 0xC396, + 33073 - 11905: 0xCDD1, + 33074 - 11905: 0xEBE5, + 33075 - 11905: 0xC397, + 33076 - 11905: 0xC398, + 33077 - 11905: 0xC399, + 33078 - 11905: 0xEBE1, + 33079 - 11905: 0xC39A, + 33080 - 11905: 0xC1B3, + 33081 - 11905: 0xC39B, + 33082 - 11905: 0xC39C, + 33083 - 11905: 0xC39D, + 33084 - 11905: 0xC39E, + 33085 - 11905: 0xC39F, + 33086 - 11905: 0xC6A2, + 33087 - 11905: 0xC3A0, + 33088 - 11905: 0xC440, + 33089 - 11905: 0xC441, + 33090 - 11905: 0xC442, + 33091 - 11905: 0xC443, + 33092 - 11905: 0xC444, + 33093 - 11905: 0xC445, + 33094 - 11905: 0xCCF3, + 33095 - 11905: 0xC446, + 33096 - 11905: 0xEBE6, + 33097 - 11905: 0xC447, + 33098 - 11905: 0xC0B0, + 33099 - 11905: 0xD2B8, + 33100 - 11905: 0xEBE7, + 33101 - 11905: 0xC448, + 33102 - 11905: 0xC449, + 33103 - 11905: 0xC44A, + 33104 - 11905: 0xB8AF, + 33105 - 11905: 0xB8AD, + 33106 - 11905: 0xC44B, + 33107 - 11905: 0xEBE8, + 33108 - 11905: 0xC7BB, + 33109 - 11905: 0xCDF3, + 33110 - 11905: 0xC44C, + 33111 - 11905: 0xC44D, + 33112 - 11905: 0xC44E, + 33113 - 11905: 0xEBEA, + 33114 - 11905: 0xEBEB, + 33115 - 11905: 0xC44F, + 33116 - 11905: 0xC450, + 33117 - 11905: 0xC451, + 33118 - 11905: 0xC452, + 33119 - 11905: 0xC453, + 33120 - 11905: 0xEBED, + 33121 - 11905: 0xC454, + 33122 - 11905: 0xC455, + 33123 - 11905: 0xC456, + 33124 - 11905: 0xC457, + 33125 - 11905: 0xD0C8, + 33126 - 11905: 0xC458, + 33127 - 11905: 0xEBF2, + 33128 - 11905: 0xC459, + 33129 - 11905: 0xEBEE, + 33130 - 11905: 0xC45A, + 33131 - 11905: 0xC45B, + 33132 - 11905: 0xC45C, + 33133 - 11905: 0xEBF1, + 33134 - 11905: 0xC8F9, + 33135 - 11905: 0xC45D, + 33136 - 11905: 0xD1FC, + 33137 - 11905: 0xEBEC, + 33138 - 11905: 0xC45E, + 33139 - 11905: 0xC45F, + 33140 - 11905: 0xEBE9, + 33141 - 11905: 0xC460, + 33142 - 11905: 0xC461, + 33143 - 11905: 0xC462, + 33144 - 11905: 0xC463, + 33145 - 11905: 0xB8B9, + 33146 - 11905: 0xCFD9, + 33147 - 11905: 0xC4E5, + 33148 - 11905: 0xEBEF, + 33149 - 11905: 0xEBF0, + 33150 - 11905: 0xCCDA, + 33151 - 11905: 0xCDC8, + 33152 - 11905: 0xB0F2, + 33153 - 11905: 0xC464, + 33154 - 11905: 0xEBF6, + 33155 - 11905: 0xC465, + 33156 - 11905: 0xC466, + 33157 - 11905: 0xC467, + 33158 - 11905: 0xC468, + 33159 - 11905: 0xC469, + 33160 - 11905: 0xEBF5, + 33161 - 11905: 0xC46A, + 33162 - 11905: 0xB2B2, + 33163 - 11905: 0xC46B, + 33164 - 11905: 0xC46C, + 33165 - 11905: 0xC46D, + 33166 - 11905: 0xC46E, + 33167 - 11905: 0xB8E0, + 33168 - 11905: 0xC46F, + 33169 - 11905: 0xEBF7, + 33170 - 11905: 0xC470, + 33171 - 11905: 0xC471, + 33172 - 11905: 0xC472, + 33173 - 11905: 0xC473, + 33174 - 11905: 0xC474, + 33175 - 11905: 0xC475, + 33176 - 11905: 0xB1EC, + 33177 - 11905: 0xC476, + 33178 - 11905: 0xC477, + 33179 - 11905: 0xCCC5, + 33180 - 11905: 0xC4A4, + 33181 - 11905: 0xCFA5, + 33182 - 11905: 0xC478, + 33183 - 11905: 0xC479, + 33184 - 11905: 0xC47A, + 33185 - 11905: 0xC47B, + 33186 - 11905: 0xC47C, + 33187 - 11905: 0xEBF9, + 33188 - 11905: 0xC47D, + 33189 - 11905: 0xC47E, + 33190 - 11905: 0xECA2, + 33191 - 11905: 0xC480, + 33192 - 11905: 0xC5F2, + 33193 - 11905: 0xC481, + 33194 - 11905: 0xEBFA, + 33195 - 11905: 0xC482, + 33196 - 11905: 0xC483, + 33197 - 11905: 0xC484, + 33198 - 11905: 0xC485, + 33199 - 11905: 0xC486, + 33200 - 11905: 0xC487, + 33201 - 11905: 0xC488, + 33202 - 11905: 0xC489, + 33203 - 11905: 0xC9C5, + 33204 - 11905: 0xC48A, + 33205 - 11905: 0xC48B, + 33206 - 11905: 0xC48C, + 33207 - 11905: 0xC48D, + 33208 - 11905: 0xC48E, + 33209 - 11905: 0xC48F, + 33210 - 11905: 0xE2DF, + 33211 - 11905: 0xEBFE, + 33212 - 11905: 0xC490, + 33213 - 11905: 0xC491, + 33214 - 11905: 0xC492, + 33215 - 11905: 0xC493, + 33216 - 11905: 0xCDCE, + 33217 - 11905: 0xECA1, + 33218 - 11905: 0xB1DB, + 33219 - 11905: 0xD3B7, + 33220 - 11905: 0xC494, + 33221 - 11905: 0xC495, + 33222 - 11905: 0xD2DC, + 33223 - 11905: 0xC496, + 33224 - 11905: 0xC497, + 33225 - 11905: 0xC498, + 33226 - 11905: 0xEBFD, + 33227 - 11905: 0xC499, + 33228 - 11905: 0xEBFB, + 33229 - 11905: 0xC49A, + 33230 - 11905: 0xC49B, + 33231 - 11905: 0xC49C, + 33232 - 11905: 0xC49D, + 33233 - 11905: 0xC49E, + 33234 - 11905: 0xC49F, + 33235 - 11905: 0xC4A0, + 33236 - 11905: 0xC540, + 33237 - 11905: 0xC541, + 33238 - 11905: 0xC542, + 33239 - 11905: 0xC543, + 33240 - 11905: 0xC544, + 33241 - 11905: 0xC545, + 33242 - 11905: 0xC546, + 33243 - 11905: 0xC547, + 33244 - 11905: 0xC548, + 33245 - 11905: 0xC549, + 33246 - 11905: 0xC54A, + 33247 - 11905: 0xC54B, + 33248 - 11905: 0xC54C, + 33249 - 11905: 0xC54D, + 33250 - 11905: 0xC54E, + 33251 - 11905: 0xB3BC, + 33252 - 11905: 0xC54F, + 33253 - 11905: 0xC550, + 33254 - 11905: 0xC551, + 33255 - 11905: 0xEAB0, + 33256 - 11905: 0xC552, + 33257 - 11905: 0xC553, + 33258 - 11905: 0xD7D4, + 33259 - 11905: 0xC554, + 33260 - 11905: 0xF4AB, + 33261 - 11905: 0xB3F4, + 33262 - 11905: 0xC555, + 33263 - 11905: 0xC556, + 33264 - 11905: 0xC557, + 33265 - 11905: 0xC558, + 33266 - 11905: 0xC559, + 33267 - 11905: 0xD6C1, + 33268 - 11905: 0xD6C2, + 33269 - 11905: 0xC55A, + 33270 - 11905: 0xC55B, + 33271 - 11905: 0xC55C, + 33272 - 11905: 0xC55D, + 33273 - 11905: 0xC55E, + 33274 - 11905: 0xC55F, + 33275 - 11905: 0xD5E9, + 33276 - 11905: 0xBECA, + 33277 - 11905: 0xC560, + 33278 - 11905: 0xF4A7, + 33279 - 11905: 0xC561, + 33280 - 11905: 0xD2A8, + 33281 - 11905: 0xF4A8, + 33282 - 11905: 0xF4A9, + 33283 - 11905: 0xC562, + 33284 - 11905: 0xF4AA, + 33285 - 11905: 0xBECB, + 33286 - 11905: 0xD3DF, + 33287 - 11905: 0xC563, + 33288 - 11905: 0xC564, + 33289 - 11905: 0xC565, + 33290 - 11905: 0xC566, + 33291 - 11905: 0xC567, + 33292 - 11905: 0xC9E0, + 33293 - 11905: 0xC9E1, + 33294 - 11905: 0xC568, + 33295 - 11905: 0xC569, + 33296 - 11905: 0xF3C2, + 33297 - 11905: 0xC56A, + 33298 - 11905: 0xCAE6, + 33299 - 11905: 0xC56B, + 33300 - 11905: 0xCCF2, + 33301 - 11905: 0xC56C, + 33302 - 11905: 0xC56D, + 33303 - 11905: 0xC56E, + 33304 - 11905: 0xC56F, + 33305 - 11905: 0xC570, + 33306 - 11905: 0xC571, + 33307 - 11905: 0xE2B6, + 33308 - 11905: 0xCBB4, + 33309 - 11905: 0xC572, + 33310 - 11905: 0xCEE8, + 33311 - 11905: 0xD6DB, + 33312 - 11905: 0xC573, + 33313 - 11905: 0xF4AD, + 33314 - 11905: 0xF4AE, + 33315 - 11905: 0xF4AF, + 33316 - 11905: 0xC574, + 33317 - 11905: 0xC575, + 33318 - 11905: 0xC576, + 33319 - 11905: 0xC577, + 33320 - 11905: 0xF4B2, + 33321 - 11905: 0xC578, + 33322 - 11905: 0xBABD, + 33323 - 11905: 0xF4B3, + 33324 - 11905: 0xB0E3, + 33325 - 11905: 0xF4B0, + 33326 - 11905: 0xC579, + 33327 - 11905: 0xF4B1, + 33328 - 11905: 0xBDA2, + 33329 - 11905: 0xB2D5, + 33330 - 11905: 0xC57A, + 33331 - 11905: 0xF4B6, + 33332 - 11905: 0xF4B7, + 33333 - 11905: 0xB6E6, + 33334 - 11905: 0xB2B0, + 33335 - 11905: 0xCFCF, + 33336 - 11905: 0xF4B4, + 33337 - 11905: 0xB4AC, + 33338 - 11905: 0xC57B, + 33339 - 11905: 0xF4B5, + 33340 - 11905: 0xC57C, + 33341 - 11905: 0xC57D, + 33342 - 11905: 0xF4B8, + 33343 - 11905: 0xC57E, + 33344 - 11905: 0xC580, + 33345 - 11905: 0xC581, + 33346 - 11905: 0xC582, + 33347 - 11905: 0xC583, + 33348 - 11905: 0xF4B9, + 33349 - 11905: 0xC584, + 33350 - 11905: 0xC585, + 33351 - 11905: 0xCDA7, + 33352 - 11905: 0xC586, + 33353 - 11905: 0xF4BA, + 33354 - 11905: 0xC587, + 33355 - 11905: 0xF4BB, + 33356 - 11905: 0xC588, + 33357 - 11905: 0xC589, + 33358 - 11905: 0xC58A, + 33359 - 11905: 0xF4BC, + 33360 - 11905: 0xC58B, + 33361 - 11905: 0xC58C, + 33362 - 11905: 0xC58D, + 33363 - 11905: 0xC58E, + 33364 - 11905: 0xC58F, + 33365 - 11905: 0xC590, + 33366 - 11905: 0xC591, + 33367 - 11905: 0xC592, + 33368 - 11905: 0xCBD2, + 33369 - 11905: 0xC593, + 33370 - 11905: 0xF4BD, + 33371 - 11905: 0xC594, + 33372 - 11905: 0xC595, + 33373 - 11905: 0xC596, + 33374 - 11905: 0xC597, + 33375 - 11905: 0xF4BE, + 33376 - 11905: 0xC598, + 33377 - 11905: 0xC599, + 33378 - 11905: 0xC59A, + 33379 - 11905: 0xC59B, + 33380 - 11905: 0xC59C, + 33381 - 11905: 0xC59D, + 33382 - 11905: 0xC59E, + 33383 - 11905: 0xC59F, + 33384 - 11905: 0xF4BF, + 33385 - 11905: 0xC5A0, + 33386 - 11905: 0xC640, + 33387 - 11905: 0xC641, + 33388 - 11905: 0xC642, + 33389 - 11905: 0xC643, + 33390 - 11905: 0xF4DE, + 33391 - 11905: 0xC1BC, + 33392 - 11905: 0xBCE8, + 33393 - 11905: 0xC644, + 33394 - 11905: 0xC9AB, + 33395 - 11905: 0xD1DE, + 33396 - 11905: 0xE5F5, + 33397 - 11905: 0xC645, + 33398 - 11905: 0xC646, + 33399 - 11905: 0xC647, + 33400 - 11905: 0xC648, + 33401 - 11905: 0xDCB3, + 33402 - 11905: 0xD2D5, + 33403 - 11905: 0xC649, + 33404 - 11905: 0xC64A, + 33405 - 11905: 0xDCB4, + 33406 - 11905: 0xB0AC, + 33407 - 11905: 0xDCB5, + 33408 - 11905: 0xC64B, + 33409 - 11905: 0xC64C, + 33410 - 11905: 0xBDDA, + 33411 - 11905: 0xC64D, + 33412 - 11905: 0xDCB9, + 33413 - 11905: 0xC64E, + 33414 - 11905: 0xC64F, + 33415 - 11905: 0xC650, + 33416 - 11905: 0xD8C2, + 33417 - 11905: 0xC651, + 33418 - 11905: 0xDCB7, + 33419 - 11905: 0xD3F3, + 33420 - 11905: 0xC652, + 33421 - 11905: 0xC9D6, + 33422 - 11905: 0xDCBA, + 33423 - 11905: 0xDCB6, + 33424 - 11905: 0xC653, + 33425 - 11905: 0xDCBB, + 33426 - 11905: 0xC3A2, + 33427 - 11905: 0xC654, + 33428 - 11905: 0xC655, + 33429 - 11905: 0xC656, + 33430 - 11905: 0xC657, + 33431 - 11905: 0xDCBC, + 33432 - 11905: 0xDCC5, + 33433 - 11905: 0xDCBD, + 33434 - 11905: 0xC658, + 33435 - 11905: 0xC659, + 33436 - 11905: 0xCEDF, + 33437 - 11905: 0xD6A5, + 33438 - 11905: 0xC65A, + 33439 - 11905: 0xDCCF, + 33440 - 11905: 0xC65B, + 33441 - 11905: 0xDCCD, + 33442 - 11905: 0xC65C, + 33443 - 11905: 0xC65D, + 33444 - 11905: 0xDCD2, + 33445 - 11905: 0xBDE6, + 33446 - 11905: 0xC2AB, + 33447 - 11905: 0xC65E, + 33448 - 11905: 0xDCB8, + 33449 - 11905: 0xDCCB, + 33450 - 11905: 0xDCCE, + 33451 - 11905: 0xDCBE, + 33452 - 11905: 0xB7D2, + 33453 - 11905: 0xB0C5, + 33454 - 11905: 0xDCC7, + 33455 - 11905: 0xD0BE, + 33456 - 11905: 0xDCC1, + 33457 - 11905: 0xBBA8, + 33458 - 11905: 0xC65F, + 33459 - 11905: 0xB7BC, + 33460 - 11905: 0xDCCC, + 33461 - 11905: 0xC660, + 33462 - 11905: 0xC661, + 33463 - 11905: 0xDCC6, + 33464 - 11905: 0xDCBF, + 33465 - 11905: 0xC7DB, + 33466 - 11905: 0xC662, + 33467 - 11905: 0xC663, + 33468 - 11905: 0xC664, + 33469 - 11905: 0xD1BF, + 33470 - 11905: 0xDCC0, + 33471 - 11905: 0xC665, + 33472 - 11905: 0xC666, + 33473 - 11905: 0xDCCA, + 33474 - 11905: 0xC667, + 33475 - 11905: 0xC668, + 33476 - 11905: 0xDCD0, + 33477 - 11905: 0xC669, + 33478 - 11905: 0xC66A, + 33479 - 11905: 0xCEAD, + 33480 - 11905: 0xDCC2, + 33481 - 11905: 0xC66B, + 33482 - 11905: 0xDCC3, + 33483 - 11905: 0xDCC8, + 33484 - 11905: 0xDCC9, + 33485 - 11905: 0xB2D4, + 33486 - 11905: 0xDCD1, + 33487 - 11905: 0xCBD5, + 33488 - 11905: 0xC66C, + 33489 - 11905: 0xD4B7, + 33490 - 11905: 0xDCDB, + 33491 - 11905: 0xDCDF, + 33492 - 11905: 0xCCA6, + 33493 - 11905: 0xDCE6, + 33494 - 11905: 0xC66D, + 33495 - 11905: 0xC3E7, + 33496 - 11905: 0xDCDC, + 33497 - 11905: 0xC66E, + 33498 - 11905: 0xC66F, + 33499 - 11905: 0xBFC1, + 33500 - 11905: 0xDCD9, + 33501 - 11905: 0xC670, + 33502 - 11905: 0xB0FA, + 33503 - 11905: 0xB9B6, + 33504 - 11905: 0xDCE5, + 33505 - 11905: 0xDCD3, + 33506 - 11905: 0xC671, + 33507 - 11905: 0xDCC4, + 33508 - 11905: 0xDCD6, + 33509 - 11905: 0xC8F4, + 33510 - 11905: 0xBFE0, + 33511 - 11905: 0xC672, + 33512 - 11905: 0xC673, + 33513 - 11905: 0xC674, + 33514 - 11905: 0xC675, + 33515 - 11905: 0xC9BB, + 33516 - 11905: 0xC676, + 33517 - 11905: 0xC677, + 33518 - 11905: 0xC678, + 33519 - 11905: 0xB1BD, + 33520 - 11905: 0xC679, + 33521 - 11905: 0xD3A2, + 33522 - 11905: 0xC67A, + 33523 - 11905: 0xC67B, + 33524 - 11905: 0xDCDA, + 33525 - 11905: 0xC67C, + 33526 - 11905: 0xC67D, + 33527 - 11905: 0xDCD5, + 33528 - 11905: 0xC67E, + 33529 - 11905: 0xC6BB, + 33530 - 11905: 0xC680, + 33531 - 11905: 0xDCDE, + 33532 - 11905: 0xC681, + 33533 - 11905: 0xC682, + 33534 - 11905: 0xC683, + 33535 - 11905: 0xC684, + 33536 - 11905: 0xC685, + 33537 - 11905: 0xD7C2, + 33538 - 11905: 0xC3AF, + 33539 - 11905: 0xB7B6, + 33540 - 11905: 0xC7D1, + 33541 - 11905: 0xC3A9, + 33542 - 11905: 0xDCE2, + 33543 - 11905: 0xDCD8, + 33544 - 11905: 0xDCEB, + 33545 - 11905: 0xDCD4, + 33546 - 11905: 0xC686, + 33547 - 11905: 0xC687, + 33548 - 11905: 0xDCDD, + 33549 - 11905: 0xC688, + 33550 - 11905: 0xBEA5, + 33551 - 11905: 0xDCD7, + 33552 - 11905: 0xC689, + 33553 - 11905: 0xDCE0, + 33554 - 11905: 0xC68A, + 33555 - 11905: 0xC68B, + 33556 - 11905: 0xDCE3, + 33557 - 11905: 0xDCE4, + 33558 - 11905: 0xC68C, + 33559 - 11905: 0xDCF8, + 33560 - 11905: 0xC68D, + 33561 - 11905: 0xC68E, + 33562 - 11905: 0xDCE1, + 33563 - 11905: 0xDDA2, + 33564 - 11905: 0xDCE7, + 33565 - 11905: 0xC68F, + 33566 - 11905: 0xC690, + 33567 - 11905: 0xC691, + 33568 - 11905: 0xC692, + 33569 - 11905: 0xC693, + 33570 - 11905: 0xC694, + 33571 - 11905: 0xC695, + 33572 - 11905: 0xC696, + 33573 - 11905: 0xC697, + 33574 - 11905: 0xC698, + 33575 - 11905: 0xBCEB, + 33576 - 11905: 0xB4C4, + 33577 - 11905: 0xC699, + 33578 - 11905: 0xC69A, + 33579 - 11905: 0xC3A3, + 33580 - 11905: 0xB2E7, + 33581 - 11905: 0xDCFA, + 33582 - 11905: 0xC69B, + 33583 - 11905: 0xDCF2, + 33584 - 11905: 0xC69C, + 33585 - 11905: 0xDCEF, + 33586 - 11905: 0xC69D, + 33587 - 11905: 0xDCFC, + 33588 - 11905: 0xDCEE, + 33589 - 11905: 0xD2F0, + 33590 - 11905: 0xB2E8, + 33591 - 11905: 0xC69E, + 33592 - 11905: 0xC8D7, + 33593 - 11905: 0xC8E3, + 33594 - 11905: 0xDCFB, + 33595 - 11905: 0xC69F, + 33596 - 11905: 0xDCED, + 33597 - 11905: 0xC6A0, + 33598 - 11905: 0xC740, + 33599 - 11905: 0xC741, + 33600 - 11905: 0xDCF7, + 33601 - 11905: 0xC742, + 33602 - 11905: 0xC743, + 33603 - 11905: 0xDCF5, + 33604 - 11905: 0xC744, + 33605 - 11905: 0xC745, + 33606 - 11905: 0xBEA3, + 33607 - 11905: 0xDCF4, + 33608 - 11905: 0xC746, + 33609 - 11905: 0xB2DD, + 33610 - 11905: 0xC747, + 33611 - 11905: 0xC748, + 33612 - 11905: 0xC749, + 33613 - 11905: 0xC74A, + 33614 - 11905: 0xC74B, + 33615 - 11905: 0xDCF3, + 33616 - 11905: 0xBCF6, + 33617 - 11905: 0xDCE8, + 33618 - 11905: 0xBBC4, + 33619 - 11905: 0xC74C, + 33620 - 11905: 0xC0F3, + 33621 - 11905: 0xC74D, + 33622 - 11905: 0xC74E, + 33623 - 11905: 0xC74F, + 33624 - 11905: 0xC750, + 33625 - 11905: 0xC751, + 33626 - 11905: 0xBCD4, + 33627 - 11905: 0xDCE9, + 33628 - 11905: 0xDCEA, + 33629 - 11905: 0xC752, + 33630 - 11905: 0xDCF1, + 33631 - 11905: 0xDCF6, + 33632 - 11905: 0xDCF9, + 33633 - 11905: 0xB5B4, + 33634 - 11905: 0xC753, + 33635 - 11905: 0xC8D9, + 33636 - 11905: 0xBBE7, + 33637 - 11905: 0xDCFE, + 33638 - 11905: 0xDCFD, + 33639 - 11905: 0xD3AB, + 33640 - 11905: 0xDDA1, + 33641 - 11905: 0xDDA3, + 33642 - 11905: 0xDDA5, + 33643 - 11905: 0xD2F1, + 33644 - 11905: 0xDDA4, + 33645 - 11905: 0xDDA6, + 33646 - 11905: 0xDDA7, + 33647 - 11905: 0xD2A9, + 33648 - 11905: 0xC754, + 33649 - 11905: 0xC755, + 33650 - 11905: 0xC756, + 33651 - 11905: 0xC757, + 33652 - 11905: 0xC758, + 33653 - 11905: 0xC759, + 33654 - 11905: 0xC75A, + 33655 - 11905: 0xBAC9, + 33656 - 11905: 0xDDA9, + 33657 - 11905: 0xC75B, + 33658 - 11905: 0xC75C, + 33659 - 11905: 0xDDB6, + 33660 - 11905: 0xDDB1, + 33661 - 11905: 0xDDB4, + 33662 - 11905: 0xC75D, + 33663 - 11905: 0xC75E, + 33664 - 11905: 0xC75F, + 33665 - 11905: 0xC760, + 33666 - 11905: 0xC761, + 33667 - 11905: 0xC762, + 33668 - 11905: 0xC763, + 33669 - 11905: 0xDDB0, + 33670 - 11905: 0xC6CE, + 33671 - 11905: 0xC764, + 33672 - 11905: 0xC765, + 33673 - 11905: 0xC0F2, + 33674 - 11905: 0xC766, + 33675 - 11905: 0xC767, + 33676 - 11905: 0xC768, + 33677 - 11905: 0xC769, + 33678 - 11905: 0xC9AF, + 33679 - 11905: 0xC76A, + 33680 - 11905: 0xC76B, + 33681 - 11905: 0xC76C, + 33682 - 11905: 0xDCEC, + 33683 - 11905: 0xDDAE, + 33684 - 11905: 0xC76D, + 33685 - 11905: 0xC76E, + 33686 - 11905: 0xC76F, + 33687 - 11905: 0xC770, + 33688 - 11905: 0xDDB7, + 33689 - 11905: 0xC771, + 33690 - 11905: 0xC772, + 33691 - 11905: 0xDCF0, + 33692 - 11905: 0xDDAF, + 33693 - 11905: 0xC773, + 33694 - 11905: 0xDDB8, + 33695 - 11905: 0xC774, + 33696 - 11905: 0xDDAC, + 33697 - 11905: 0xC775, + 33698 - 11905: 0xC776, + 33699 - 11905: 0xC777, + 33700 - 11905: 0xC778, + 33701 - 11905: 0xC779, + 33702 - 11905: 0xC77A, + 33703 - 11905: 0xC77B, + 33704 - 11905: 0xDDB9, + 33705 - 11905: 0xDDB3, + 33706 - 11905: 0xDDAD, + 33707 - 11905: 0xC4AA, + 33708 - 11905: 0xC77C, + 33709 - 11905: 0xC77D, + 33710 - 11905: 0xC77E, + 33711 - 11905: 0xC780, + 33712 - 11905: 0xDDA8, + 33713 - 11905: 0xC0B3, + 33714 - 11905: 0xC1AB, + 33715 - 11905: 0xDDAA, + 33716 - 11905: 0xDDAB, + 33717 - 11905: 0xC781, + 33718 - 11905: 0xDDB2, + 33719 - 11905: 0xBBF1, + 33720 - 11905: 0xDDB5, + 33721 - 11905: 0xD3A8, + 33722 - 11905: 0xDDBA, + 33723 - 11905: 0xC782, + 33724 - 11905: 0xDDBB, + 33725 - 11905: 0xC3A7, + 33726 - 11905: 0xC783, + 33727 - 11905: 0xC784, + 33728 - 11905: 0xDDD2, + 33729 - 11905: 0xDDBC, + 33730 - 11905: 0xC785, + 33731 - 11905: 0xC786, + 33732 - 11905: 0xC787, + 33733 - 11905: 0xDDD1, + 33734 - 11905: 0xC788, + 33735 - 11905: 0xB9BD, + 33736 - 11905: 0xC789, + 33737 - 11905: 0xC78A, + 33738 - 11905: 0xBED5, + 33739 - 11905: 0xC78B, + 33740 - 11905: 0xBEFA, + 33741 - 11905: 0xC78C, + 33742 - 11905: 0xC78D, + 33743 - 11905: 0xBACA, + 33744 - 11905: 0xC78E, + 33745 - 11905: 0xC78F, + 33746 - 11905: 0xC790, + 33747 - 11905: 0xC791, + 33748 - 11905: 0xDDCA, + 33749 - 11905: 0xC792, + 33750 - 11905: 0xDDC5, + 33751 - 11905: 0xC793, + 33752 - 11905: 0xDDBF, + 33753 - 11905: 0xC794, + 33754 - 11905: 0xC795, + 33755 - 11905: 0xC796, + 33756 - 11905: 0xB2CB, + 33757 - 11905: 0xDDC3, + 33758 - 11905: 0xC797, + 33759 - 11905: 0xDDCB, + 33760 - 11905: 0xB2A4, + 33761 - 11905: 0xDDD5, + 33762 - 11905: 0xC798, + 33763 - 11905: 0xC799, + 33764 - 11905: 0xC79A, + 33765 - 11905: 0xDDBE, + 33766 - 11905: 0xC79B, + 33767 - 11905: 0xC79C, + 33768 - 11905: 0xC79D, + 33769 - 11905: 0xC6D0, + 33770 - 11905: 0xDDD0, + 33771 - 11905: 0xC79E, + 33772 - 11905: 0xC79F, + 33773 - 11905: 0xC7A0, + 33774 - 11905: 0xC840, + 33775 - 11905: 0xC841, + 33776 - 11905: 0xDDD4, + 33777 - 11905: 0xC1E2, + 33778 - 11905: 0xB7C6, + 33779 - 11905: 0xC842, + 33780 - 11905: 0xC843, + 33781 - 11905: 0xC844, + 33782 - 11905: 0xC845, + 33783 - 11905: 0xC846, + 33784 - 11905: 0xDDCE, + 33785 - 11905: 0xDDCF, + 33786 - 11905: 0xC847, + 33787 - 11905: 0xC848, + 33788 - 11905: 0xC849, + 33789 - 11905: 0xDDC4, + 33790 - 11905: 0xC84A, + 33791 - 11905: 0xC84B, + 33792 - 11905: 0xC84C, + 33793 - 11905: 0xDDBD, + 33794 - 11905: 0xC84D, + 33795 - 11905: 0xDDCD, + 33796 - 11905: 0xCCD1, + 33797 - 11905: 0xC84E, + 33798 - 11905: 0xDDC9, + 33799 - 11905: 0xC84F, + 33800 - 11905: 0xC850, + 33801 - 11905: 0xC851, + 33802 - 11905: 0xC852, + 33803 - 11905: 0xDDC2, + 33804 - 11905: 0xC3C8, + 33805 - 11905: 0xC6BC, + 33806 - 11905: 0xCEAE, + 33807 - 11905: 0xDDCC, + 33808 - 11905: 0xC853, + 33809 - 11905: 0xDDC8, + 33810 - 11905: 0xC854, + 33811 - 11905: 0xC855, + 33812 - 11905: 0xC856, + 33813 - 11905: 0xC857, + 33814 - 11905: 0xC858, + 33815 - 11905: 0xC859, + 33816 - 11905: 0xDDC1, + 33817 - 11905: 0xC85A, + 33818 - 11905: 0xC85B, + 33819 - 11905: 0xC85C, + 33820 - 11905: 0xDDC6, + 33821 - 11905: 0xC2DC, + 33822 - 11905: 0xC85D, + 33823 - 11905: 0xC85E, + 33824 - 11905: 0xC85F, + 33825 - 11905: 0xC860, + 33826 - 11905: 0xC861, + 33827 - 11905: 0xC862, + 33828 - 11905: 0xD3A9, + 33829 - 11905: 0xD3AA, + 33830 - 11905: 0xDDD3, + 33831 - 11905: 0xCFF4, + 33832 - 11905: 0xC8F8, + 33833 - 11905: 0xC863, + 33834 - 11905: 0xC864, + 33835 - 11905: 0xC865, + 33836 - 11905: 0xC866, + 33837 - 11905: 0xC867, + 33838 - 11905: 0xC868, + 33839 - 11905: 0xC869, + 33840 - 11905: 0xC86A, + 33841 - 11905: 0xDDE6, + 33842 - 11905: 0xC86B, + 33843 - 11905: 0xC86C, + 33844 - 11905: 0xC86D, + 33845 - 11905: 0xC86E, + 33846 - 11905: 0xC86F, + 33847 - 11905: 0xC870, + 33848 - 11905: 0xDDC7, + 33849 - 11905: 0xC871, + 33850 - 11905: 0xC872, + 33851 - 11905: 0xC873, + 33852 - 11905: 0xDDE0, + 33853 - 11905: 0xC2E4, + 33854 - 11905: 0xC874, + 33855 - 11905: 0xC875, + 33856 - 11905: 0xC876, + 33857 - 11905: 0xC877, + 33858 - 11905: 0xC878, + 33859 - 11905: 0xC879, + 33860 - 11905: 0xC87A, + 33861 - 11905: 0xC87B, + 33862 - 11905: 0xDDE1, + 33863 - 11905: 0xC87C, + 33864 - 11905: 0xC87D, + 33865 - 11905: 0xC87E, + 33866 - 11905: 0xC880, + 33867 - 11905: 0xC881, + 33868 - 11905: 0xC882, + 33869 - 11905: 0xC883, + 33870 - 11905: 0xC884, + 33871 - 11905: 0xC885, + 33872 - 11905: 0xC886, + 33873 - 11905: 0xDDD7, + 33874 - 11905: 0xC887, + 33875 - 11905: 0xC888, + 33876 - 11905: 0xC889, + 33877 - 11905: 0xC88A, + 33878 - 11905: 0xC88B, + 33879 - 11905: 0xD6F8, + 33880 - 11905: 0xC88C, + 33881 - 11905: 0xDDD9, + 33882 - 11905: 0xDDD8, + 33883 - 11905: 0xB8F0, + 33884 - 11905: 0xDDD6, + 33885 - 11905: 0xC88D, + 33886 - 11905: 0xC88E, + 33887 - 11905: 0xC88F, + 33888 - 11905: 0xC890, + 33889 - 11905: 0xC6CF, + 33890 - 11905: 0xC891, + 33891 - 11905: 0xB6AD, + 33892 - 11905: 0xC892, + 33893 - 11905: 0xC893, + 33894 - 11905: 0xC894, + 33895 - 11905: 0xC895, + 33896 - 11905: 0xC896, + 33897 - 11905: 0xDDE2, + 33898 - 11905: 0xC897, + 33899 - 11905: 0xBAF9, + 33900 - 11905: 0xD4E1, + 33901 - 11905: 0xDDE7, + 33902 - 11905: 0xC898, + 33903 - 11905: 0xC899, + 33904 - 11905: 0xC89A, + 33905 - 11905: 0xB4D0, + 33906 - 11905: 0xC89B, + 33907 - 11905: 0xDDDA, + 33908 - 11905: 0xC89C, + 33909 - 11905: 0xBFFB, + 33910 - 11905: 0xDDE3, + 33911 - 11905: 0xC89D, + 33912 - 11905: 0xDDDF, + 33913 - 11905: 0xC89E, + 33914 - 11905: 0xDDDD, + 33915 - 11905: 0xC89F, + 33916 - 11905: 0xC8A0, + 33917 - 11905: 0xC940, + 33918 - 11905: 0xC941, + 33919 - 11905: 0xC942, + 33920 - 11905: 0xC943, + 33921 - 11905: 0xC944, + 33922 - 11905: 0xB5D9, + 33923 - 11905: 0xC945, + 33924 - 11905: 0xC946, + 33925 - 11905: 0xC947, + 33926 - 11905: 0xC948, + 33927 - 11905: 0xDDDB, + 33928 - 11905: 0xDDDC, + 33929 - 11905: 0xDDDE, + 33930 - 11905: 0xC949, + 33931 - 11905: 0xBDAF, + 33932 - 11905: 0xDDE4, + 33933 - 11905: 0xC94A, + 33934 - 11905: 0xDDE5, + 33935 - 11905: 0xC94B, + 33936 - 11905: 0xC94C, + 33937 - 11905: 0xC94D, + 33938 - 11905: 0xC94E, + 33939 - 11905: 0xC94F, + 33940 - 11905: 0xC950, + 33941 - 11905: 0xC951, + 33942 - 11905: 0xC952, + 33943 - 11905: 0xDDF5, + 33944 - 11905: 0xC953, + 33945 - 11905: 0xC3C9, + 33946 - 11905: 0xC954, + 33947 - 11905: 0xC955, + 33948 - 11905: 0xCBE2, + 33949 - 11905: 0xC956, + 33950 - 11905: 0xC957, + 33951 - 11905: 0xC958, + 33952 - 11905: 0xC959, + 33953 - 11905: 0xDDF2, + 33954 - 11905: 0xC95A, + 33955 - 11905: 0xC95B, + 33956 - 11905: 0xC95C, + 33957 - 11905: 0xC95D, + 33958 - 11905: 0xC95E, + 33959 - 11905: 0xC95F, + 33960 - 11905: 0xC960, + 33961 - 11905: 0xC961, + 33962 - 11905: 0xC962, + 33963 - 11905: 0xC963, + 33964 - 11905: 0xC964, + 33965 - 11905: 0xC965, + 33966 - 11905: 0xC966, + 33967 - 11905: 0xD8E1, + 33968 - 11905: 0xC967, + 33969 - 11905: 0xC968, + 33970 - 11905: 0xC6D1, + 33971 - 11905: 0xC969, + 33972 - 11905: 0xDDF4, + 33973 - 11905: 0xC96A, + 33974 - 11905: 0xC96B, + 33975 - 11905: 0xC96C, + 33976 - 11905: 0xD5F4, + 33977 - 11905: 0xDDF3, + 33978 - 11905: 0xDDF0, + 33979 - 11905: 0xC96D, + 33980 - 11905: 0xC96E, + 33981 - 11905: 0xDDEC, + 33982 - 11905: 0xC96F, + 33983 - 11905: 0xDDEF, + 33984 - 11905: 0xC970, + 33985 - 11905: 0xDDE8, + 33986 - 11905: 0xC971, + 33987 - 11905: 0xC972, + 33988 - 11905: 0xD0EE, + 33989 - 11905: 0xC973, + 33990 - 11905: 0xC974, + 33991 - 11905: 0xC975, + 33992 - 11905: 0xC976, + 33993 - 11905: 0xC8D8, + 33994 - 11905: 0xDDEE, + 33995 - 11905: 0xC977, + 33996 - 11905: 0xC978, + 33997 - 11905: 0xDDE9, + 33998 - 11905: 0xC979, + 33999 - 11905: 0xC97A, + 34000 - 11905: 0xDDEA, + 34001 - 11905: 0xCBF2, + 34002 - 11905: 0xC97B, + 34003 - 11905: 0xDDED, + 34004 - 11905: 0xC97C, + 34005 - 11905: 0xC97D, + 34006 - 11905: 0xB1CD, + 34007 - 11905: 0xC97E, + 34008 - 11905: 0xC980, + 34009 - 11905: 0xC981, + 34010 - 11905: 0xC982, + 34011 - 11905: 0xC983, + 34012 - 11905: 0xC984, + 34013 - 11905: 0xC0B6, + 34014 - 11905: 0xC985, + 34015 - 11905: 0xBCBB, + 34016 - 11905: 0xDDF1, + 34017 - 11905: 0xC986, + 34018 - 11905: 0xC987, + 34019 - 11905: 0xDDF7, + 34020 - 11905: 0xC988, + 34021 - 11905: 0xDDF6, + 34022 - 11905: 0xDDEB, + 34023 - 11905: 0xC989, + 34024 - 11905: 0xC98A, + 34025 - 11905: 0xC98B, + 34026 - 11905: 0xC98C, + 34027 - 11905: 0xC98D, + 34028 - 11905: 0xC5EE, + 34029 - 11905: 0xC98E, + 34030 - 11905: 0xC98F, + 34031 - 11905: 0xC990, + 34032 - 11905: 0xDDFB, + 34033 - 11905: 0xC991, + 34034 - 11905: 0xC992, + 34035 - 11905: 0xC993, + 34036 - 11905: 0xC994, + 34037 - 11905: 0xC995, + 34038 - 11905: 0xC996, + 34039 - 11905: 0xC997, + 34040 - 11905: 0xC998, + 34041 - 11905: 0xC999, + 34042 - 11905: 0xC99A, + 34043 - 11905: 0xC99B, + 34044 - 11905: 0xDEA4, + 34045 - 11905: 0xC99C, + 34046 - 11905: 0xC99D, + 34047 - 11905: 0xDEA3, + 34048 - 11905: 0xC99E, + 34049 - 11905: 0xC99F, + 34050 - 11905: 0xC9A0, + 34051 - 11905: 0xCA40, + 34052 - 11905: 0xCA41, + 34053 - 11905: 0xCA42, + 34054 - 11905: 0xCA43, + 34055 - 11905: 0xCA44, + 34056 - 11905: 0xCA45, + 34057 - 11905: 0xCA46, + 34058 - 11905: 0xCA47, + 34059 - 11905: 0xCA48, + 34060 - 11905: 0xDDF8, + 34061 - 11905: 0xCA49, + 34062 - 11905: 0xCA4A, + 34063 - 11905: 0xCA4B, + 34064 - 11905: 0xCA4C, + 34065 - 11905: 0xC3EF, + 34066 - 11905: 0xCA4D, + 34067 - 11905: 0xC2FB, + 34068 - 11905: 0xCA4E, + 34069 - 11905: 0xCA4F, + 34070 - 11905: 0xCA50, + 34071 - 11905: 0xD5E1, + 34072 - 11905: 0xCA51, + 34073 - 11905: 0xCA52, + 34074 - 11905: 0xCEB5, + 34075 - 11905: 0xCA53, + 34076 - 11905: 0xCA54, + 34077 - 11905: 0xCA55, + 34078 - 11905: 0xCA56, + 34079 - 11905: 0xDDFD, + 34080 - 11905: 0xCA57, + 34081 - 11905: 0xB2CC, + 34082 - 11905: 0xCA58, + 34083 - 11905: 0xCA59, + 34084 - 11905: 0xCA5A, + 34085 - 11905: 0xCA5B, + 34086 - 11905: 0xCA5C, + 34087 - 11905: 0xCA5D, + 34088 - 11905: 0xCA5E, + 34089 - 11905: 0xCA5F, + 34090 - 11905: 0xCA60, + 34091 - 11905: 0xC4E8, + 34092 - 11905: 0xCADF, + 34093 - 11905: 0xCA61, + 34094 - 11905: 0xCA62, + 34095 - 11905: 0xCA63, + 34096 - 11905: 0xCA64, + 34097 - 11905: 0xCA65, + 34098 - 11905: 0xCA66, + 34099 - 11905: 0xCA67, + 34100 - 11905: 0xCA68, + 34101 - 11905: 0xCA69, + 34102 - 11905: 0xCA6A, + 34103 - 11905: 0xC7BE, + 34104 - 11905: 0xDDFA, + 34105 - 11905: 0xDDFC, + 34106 - 11905: 0xDDFE, + 34107 - 11905: 0xDEA2, + 34108 - 11905: 0xB0AA, + 34109 - 11905: 0xB1CE, + 34110 - 11905: 0xCA6B, + 34111 - 11905: 0xCA6C, + 34112 - 11905: 0xCA6D, + 34113 - 11905: 0xCA6E, + 34114 - 11905: 0xCA6F, + 34115 - 11905: 0xDEAC, + 34116 - 11905: 0xCA70, + 34117 - 11905: 0xCA71, + 34118 - 11905: 0xCA72, + 34119 - 11905: 0xCA73, + 34120 - 11905: 0xDEA6, + 34121 - 11905: 0xBDB6, + 34122 - 11905: 0xC8EF, + 34123 - 11905: 0xCA74, + 34124 - 11905: 0xCA75, + 34125 - 11905: 0xCA76, + 34126 - 11905: 0xCA77, + 34127 - 11905: 0xCA78, + 34128 - 11905: 0xCA79, + 34129 - 11905: 0xCA7A, + 34130 - 11905: 0xCA7B, + 34131 - 11905: 0xCA7C, + 34132 - 11905: 0xCA7D, + 34133 - 11905: 0xCA7E, + 34134 - 11905: 0xDEA1, + 34135 - 11905: 0xCA80, + 34136 - 11905: 0xCA81, + 34137 - 11905: 0xDEA5, + 34138 - 11905: 0xCA82, + 34139 - 11905: 0xCA83, + 34140 - 11905: 0xCA84, + 34141 - 11905: 0xCA85, + 34142 - 11905: 0xDEA9, + 34143 - 11905: 0xCA86, + 34144 - 11905: 0xCA87, + 34145 - 11905: 0xCA88, + 34146 - 11905: 0xCA89, + 34147 - 11905: 0xCA8A, + 34148 - 11905: 0xDEA8, + 34149 - 11905: 0xCA8B, + 34150 - 11905: 0xCA8C, + 34151 - 11905: 0xCA8D, + 34152 - 11905: 0xDEA7, + 34153 - 11905: 0xCA8E, + 34154 - 11905: 0xCA8F, + 34155 - 11905: 0xCA90, + 34156 - 11905: 0xCA91, + 34157 - 11905: 0xCA92, + 34158 - 11905: 0xCA93, + 34159 - 11905: 0xCA94, + 34160 - 11905: 0xCA95, + 34161 - 11905: 0xCA96, + 34162 - 11905: 0xDEAD, + 34163 - 11905: 0xCA97, + 34164 - 11905: 0xD4CC, + 34165 - 11905: 0xCA98, + 34166 - 11905: 0xCA99, + 34167 - 11905: 0xCA9A, + 34168 - 11905: 0xCA9B, + 34169 - 11905: 0xDEB3, + 34170 - 11905: 0xDEAA, + 34171 - 11905: 0xDEAE, + 34172 - 11905: 0xCA9C, + 34173 - 11905: 0xCA9D, + 34174 - 11905: 0xC0D9, + 34175 - 11905: 0xCA9E, + 34176 - 11905: 0xCA9F, + 34177 - 11905: 0xCAA0, + 34178 - 11905: 0xCB40, + 34179 - 11905: 0xCB41, + 34180 - 11905: 0xB1A1, + 34181 - 11905: 0xDEB6, + 34182 - 11905: 0xCB42, + 34183 - 11905: 0xDEB1, + 34184 - 11905: 0xCB43, + 34185 - 11905: 0xCB44, + 34186 - 11905: 0xCB45, + 34187 - 11905: 0xCB46, + 34188 - 11905: 0xCB47, + 34189 - 11905: 0xCB48, + 34190 - 11905: 0xCB49, + 34191 - 11905: 0xDEB2, + 34192 - 11905: 0xCB4A, + 34193 - 11905: 0xCB4B, + 34194 - 11905: 0xCB4C, + 34195 - 11905: 0xCB4D, + 34196 - 11905: 0xCB4E, + 34197 - 11905: 0xCB4F, + 34198 - 11905: 0xCB50, + 34199 - 11905: 0xCB51, + 34200 - 11905: 0xCB52, + 34201 - 11905: 0xCB53, + 34202 - 11905: 0xCB54, + 34203 - 11905: 0xD1A6, + 34204 - 11905: 0xDEB5, + 34205 - 11905: 0xCB55, + 34206 - 11905: 0xCB56, + 34207 - 11905: 0xCB57, + 34208 - 11905: 0xCB58, + 34209 - 11905: 0xCB59, + 34210 - 11905: 0xCB5A, + 34211 - 11905: 0xCB5B, + 34212 - 11905: 0xDEAF, + 34213 - 11905: 0xCB5C, + 34214 - 11905: 0xCB5D, + 34215 - 11905: 0xCB5E, + 34216 - 11905: 0xDEB0, + 34217 - 11905: 0xCB5F, + 34218 - 11905: 0xD0BD, + 34219 - 11905: 0xCB60, + 34220 - 11905: 0xCB61, + 34221 - 11905: 0xCB62, + 34222 - 11905: 0xDEB4, + 34223 - 11905: 0xCAED, + 34224 - 11905: 0xDEB9, + 34225 - 11905: 0xCB63, + 34226 - 11905: 0xCB64, + 34227 - 11905: 0xCB65, + 34228 - 11905: 0xCB66, + 34229 - 11905: 0xCB67, + 34230 - 11905: 0xCB68, + 34231 - 11905: 0xDEB8, + 34232 - 11905: 0xCB69, + 34233 - 11905: 0xDEB7, + 34234 - 11905: 0xCB6A, + 34235 - 11905: 0xCB6B, + 34236 - 11905: 0xCB6C, + 34237 - 11905: 0xCB6D, + 34238 - 11905: 0xCB6E, + 34239 - 11905: 0xCB6F, + 34240 - 11905: 0xCB70, + 34241 - 11905: 0xDEBB, + 34242 - 11905: 0xCB71, + 34243 - 11905: 0xCB72, + 34244 - 11905: 0xCB73, + 34245 - 11905: 0xCB74, + 34246 - 11905: 0xCB75, + 34247 - 11905: 0xCB76, + 34248 - 11905: 0xCB77, + 34249 - 11905: 0xBDE5, + 34250 - 11905: 0xCB78, + 34251 - 11905: 0xCB79, + 34252 - 11905: 0xCB7A, + 34253 - 11905: 0xCB7B, + 34254 - 11905: 0xCB7C, + 34255 - 11905: 0xB2D8, + 34256 - 11905: 0xC3EA, + 34257 - 11905: 0xCB7D, + 34258 - 11905: 0xCB7E, + 34259 - 11905: 0xDEBA, + 34260 - 11905: 0xCB80, + 34261 - 11905: 0xC5BA, + 34262 - 11905: 0xCB81, + 34263 - 11905: 0xCB82, + 34264 - 11905: 0xCB83, + 34265 - 11905: 0xCB84, + 34266 - 11905: 0xCB85, + 34267 - 11905: 0xCB86, + 34268 - 11905: 0xDEBC, + 34269 - 11905: 0xCB87, + 34270 - 11905: 0xCB88, + 34271 - 11905: 0xCB89, + 34272 - 11905: 0xCB8A, + 34273 - 11905: 0xCB8B, + 34274 - 11905: 0xCB8C, + 34275 - 11905: 0xCB8D, + 34276 - 11905: 0xCCD9, + 34277 - 11905: 0xCB8E, + 34278 - 11905: 0xCB8F, + 34279 - 11905: 0xCB90, + 34280 - 11905: 0xCB91, + 34281 - 11905: 0xB7AA, + 34282 - 11905: 0xCB92, + 34283 - 11905: 0xCB93, + 34284 - 11905: 0xCB94, + 34285 - 11905: 0xCB95, + 34286 - 11905: 0xCB96, + 34287 - 11905: 0xCB97, + 34288 - 11905: 0xCB98, + 34289 - 11905: 0xCB99, + 34290 - 11905: 0xCB9A, + 34291 - 11905: 0xCB9B, + 34292 - 11905: 0xCB9C, + 34293 - 11905: 0xCB9D, + 34294 - 11905: 0xCB9E, + 34295 - 11905: 0xCB9F, + 34296 - 11905: 0xCBA0, + 34297 - 11905: 0xCC40, + 34298 - 11905: 0xCC41, + 34299 - 11905: 0xD4E5, + 34300 - 11905: 0xCC42, + 34301 - 11905: 0xCC43, + 34302 - 11905: 0xCC44, + 34303 - 11905: 0xDEBD, + 34304 - 11905: 0xCC45, + 34305 - 11905: 0xCC46, + 34306 - 11905: 0xCC47, + 34307 - 11905: 0xCC48, + 34308 - 11905: 0xCC49, + 34309 - 11905: 0xDEBF, + 34310 - 11905: 0xCC4A, + 34311 - 11905: 0xCC4B, + 34312 - 11905: 0xCC4C, + 34313 - 11905: 0xCC4D, + 34314 - 11905: 0xCC4E, + 34315 - 11905: 0xCC4F, + 34316 - 11905: 0xCC50, + 34317 - 11905: 0xCC51, + 34318 - 11905: 0xCC52, + 34319 - 11905: 0xCC53, + 34320 - 11905: 0xCC54, + 34321 - 11905: 0xC4A2, + 34322 - 11905: 0xCC55, + 34323 - 11905: 0xCC56, + 34324 - 11905: 0xCC57, + 34325 - 11905: 0xCC58, + 34326 - 11905: 0xDEC1, + 34327 - 11905: 0xCC59, + 34328 - 11905: 0xCC5A, + 34329 - 11905: 0xCC5B, + 34330 - 11905: 0xCC5C, + 34331 - 11905: 0xCC5D, + 34332 - 11905: 0xCC5E, + 34333 - 11905: 0xCC5F, + 34334 - 11905: 0xCC60, + 34335 - 11905: 0xCC61, + 34336 - 11905: 0xCC62, + 34337 - 11905: 0xCC63, + 34338 - 11905: 0xCC64, + 34339 - 11905: 0xCC65, + 34340 - 11905: 0xCC66, + 34341 - 11905: 0xCC67, + 34342 - 11905: 0xCC68, + 34343 - 11905: 0xDEBE, + 34344 - 11905: 0xCC69, + 34345 - 11905: 0xDEC0, + 34346 - 11905: 0xCC6A, + 34347 - 11905: 0xCC6B, + 34348 - 11905: 0xCC6C, + 34349 - 11905: 0xCC6D, + 34350 - 11905: 0xCC6E, + 34351 - 11905: 0xCC6F, + 34352 - 11905: 0xCC70, + 34353 - 11905: 0xCC71, + 34354 - 11905: 0xCC72, + 34355 - 11905: 0xCC73, + 34356 - 11905: 0xCC74, + 34357 - 11905: 0xCC75, + 34358 - 11905: 0xCC76, + 34359 - 11905: 0xCC77, + 34360 - 11905: 0xD5BA, + 34361 - 11905: 0xCC78, + 34362 - 11905: 0xCC79, + 34363 - 11905: 0xCC7A, + 34364 - 11905: 0xDEC2, + 34365 - 11905: 0xCC7B, + 34366 - 11905: 0xCC7C, + 34367 - 11905: 0xCC7D, + 34368 - 11905: 0xCC7E, + 34369 - 11905: 0xCC80, + 34370 - 11905: 0xCC81, + 34371 - 11905: 0xCC82, + 34372 - 11905: 0xCC83, + 34373 - 11905: 0xCC84, + 34374 - 11905: 0xCC85, + 34375 - 11905: 0xCC86, + 34376 - 11905: 0xCC87, + 34377 - 11905: 0xCC88, + 34378 - 11905: 0xCC89, + 34379 - 11905: 0xCC8A, + 34380 - 11905: 0xCC8B, + 34381 - 11905: 0xF2AE, + 34382 - 11905: 0xBBA2, + 34383 - 11905: 0xC2B2, + 34384 - 11905: 0xC5B0, + 34385 - 11905: 0xC2C7, + 34386 - 11905: 0xCC8C, + 34387 - 11905: 0xCC8D, + 34388 - 11905: 0xF2AF, + 34389 - 11905: 0xCC8E, + 34390 - 11905: 0xCC8F, + 34391 - 11905: 0xCC90, + 34392 - 11905: 0xCC91, + 34393 - 11905: 0xCC92, + 34394 - 11905: 0xD0E9, + 34395 - 11905: 0xCC93, + 34396 - 11905: 0xCC94, + 34397 - 11905: 0xCC95, + 34398 - 11905: 0xD3DD, + 34399 - 11905: 0xCC96, + 34400 - 11905: 0xCC97, + 34401 - 11905: 0xCC98, + 34402 - 11905: 0xEBBD, + 34403 - 11905: 0xCC99, + 34404 - 11905: 0xCC9A, + 34405 - 11905: 0xCC9B, + 34406 - 11905: 0xCC9C, + 34407 - 11905: 0xCC9D, + 34408 - 11905: 0xCC9E, + 34409 - 11905: 0xCC9F, + 34410 - 11905: 0xCCA0, + 34411 - 11905: 0xB3E6, + 34412 - 11905: 0xF2B0, + 34413 - 11905: 0xCD40, + 34414 - 11905: 0xF2B1, + 34415 - 11905: 0xCD41, + 34416 - 11905: 0xCD42, + 34417 - 11905: 0xCAAD, + 34418 - 11905: 0xCD43, + 34419 - 11905: 0xCD44, + 34420 - 11905: 0xCD45, + 34421 - 11905: 0xCD46, + 34422 - 11905: 0xCD47, + 34423 - 11905: 0xCD48, + 34424 - 11905: 0xCD49, + 34425 - 11905: 0xBAE7, + 34426 - 11905: 0xF2B3, + 34427 - 11905: 0xF2B5, + 34428 - 11905: 0xF2B4, + 34429 - 11905: 0xCBE4, + 34430 - 11905: 0xCFBA, + 34431 - 11905: 0xF2B2, + 34432 - 11905: 0xCAB4, + 34433 - 11905: 0xD2CF, + 34434 - 11905: 0xC2EC, + 34435 - 11905: 0xCD4A, + 34436 - 11905: 0xCD4B, + 34437 - 11905: 0xCD4C, + 34438 - 11905: 0xCD4D, + 34439 - 11905: 0xCD4E, + 34440 - 11905: 0xCD4F, + 34441 - 11905: 0xCD50, + 34442 - 11905: 0xCEC3, + 34443 - 11905: 0xF2B8, + 34444 - 11905: 0xB0F6, + 34445 - 11905: 0xF2B7, + 34446 - 11905: 0xCD51, + 34447 - 11905: 0xCD52, + 34448 - 11905: 0xCD53, + 34449 - 11905: 0xCD54, + 34450 - 11905: 0xCD55, + 34451 - 11905: 0xF2BE, + 34452 - 11905: 0xCD56, + 34453 - 11905: 0xB2CF, + 34454 - 11905: 0xCD57, + 34455 - 11905: 0xCD58, + 34456 - 11905: 0xCD59, + 34457 - 11905: 0xCD5A, + 34458 - 11905: 0xCD5B, + 34459 - 11905: 0xCD5C, + 34460 - 11905: 0xD1C1, + 34461 - 11905: 0xF2BA, + 34462 - 11905: 0xCD5D, + 34463 - 11905: 0xCD5E, + 34464 - 11905: 0xCD5F, + 34465 - 11905: 0xCD60, + 34466 - 11905: 0xCD61, + 34467 - 11905: 0xF2BC, + 34468 - 11905: 0xD4E9, + 34469 - 11905: 0xCD62, + 34470 - 11905: 0xCD63, + 34471 - 11905: 0xF2BB, + 34472 - 11905: 0xF2B6, + 34473 - 11905: 0xF2BF, + 34474 - 11905: 0xF2BD, + 34475 - 11905: 0xCD64, + 34476 - 11905: 0xF2B9, + 34477 - 11905: 0xCD65, + 34478 - 11905: 0xCD66, + 34479 - 11905: 0xF2C7, + 34480 - 11905: 0xF2C4, + 34481 - 11905: 0xF2C6, + 34482 - 11905: 0xCD67, + 34483 - 11905: 0xCD68, + 34484 - 11905: 0xF2CA, + 34485 - 11905: 0xF2C2, + 34486 - 11905: 0xF2C0, + 34487 - 11905: 0xCD69, + 34488 - 11905: 0xCD6A, + 34489 - 11905: 0xCD6B, + 34490 - 11905: 0xF2C5, + 34491 - 11905: 0xCD6C, + 34492 - 11905: 0xCD6D, + 34493 - 11905: 0xCD6E, + 34494 - 11905: 0xCD6F, + 34495 - 11905: 0xCD70, + 34496 - 11905: 0xD6FB, + 34497 - 11905: 0xCD71, + 34498 - 11905: 0xCD72, + 34499 - 11905: 0xCD73, + 34500 - 11905: 0xF2C1, + 34501 - 11905: 0xCD74, + 34502 - 11905: 0xC7F9, + 34503 - 11905: 0xC9DF, + 34504 - 11905: 0xCD75, + 34505 - 11905: 0xF2C8, + 34506 - 11905: 0xB9C6, + 34507 - 11905: 0xB5B0, + 34508 - 11905: 0xCD76, + 34509 - 11905: 0xCD77, + 34510 - 11905: 0xF2C3, + 34511 - 11905: 0xF2C9, + 34512 - 11905: 0xF2D0, + 34513 - 11905: 0xF2D6, + 34514 - 11905: 0xCD78, + 34515 - 11905: 0xCD79, + 34516 - 11905: 0xBBD7, + 34517 - 11905: 0xCD7A, + 34518 - 11905: 0xCD7B, + 34519 - 11905: 0xCD7C, + 34520 - 11905: 0xF2D5, + 34521 - 11905: 0xCDDC, + 34522 - 11905: 0xCD7D, + 34523 - 11905: 0xD6EB, + 34524 - 11905: 0xCD7E, + 34525 - 11905: 0xCD80, + 34526 - 11905: 0xF2D2, + 34527 - 11905: 0xF2D4, + 34528 - 11905: 0xCD81, + 34529 - 11905: 0xCD82, + 34530 - 11905: 0xCD83, + 34531 - 11905: 0xCD84, + 34532 - 11905: 0xB8F2, + 34533 - 11905: 0xCD85, + 34534 - 11905: 0xCD86, + 34535 - 11905: 0xCD87, + 34536 - 11905: 0xCD88, + 34537 - 11905: 0xF2CB, + 34538 - 11905: 0xCD89, + 34539 - 11905: 0xCD8A, + 34540 - 11905: 0xCD8B, + 34541 - 11905: 0xF2CE, + 34542 - 11905: 0xC2F9, + 34543 - 11905: 0xCD8C, + 34544 - 11905: 0xD5DD, + 34545 - 11905: 0xF2CC, + 34546 - 11905: 0xF2CD, + 34547 - 11905: 0xF2CF, + 34548 - 11905: 0xF2D3, + 34549 - 11905: 0xCD8D, + 34550 - 11905: 0xCD8E, + 34551 - 11905: 0xCD8F, + 34552 - 11905: 0xF2D9, + 34553 - 11905: 0xD3BC, + 34554 - 11905: 0xCD90, + 34555 - 11905: 0xCD91, + 34556 - 11905: 0xCD92, + 34557 - 11905: 0xCD93, + 34558 - 11905: 0xB6EA, + 34559 - 11905: 0xCD94, + 34560 - 11905: 0xCAF1, + 34561 - 11905: 0xCD95, + 34562 - 11905: 0xB7E4, + 34563 - 11905: 0xF2D7, + 34564 - 11905: 0xCD96, + 34565 - 11905: 0xCD97, + 34566 - 11905: 0xCD98, + 34567 - 11905: 0xF2D8, + 34568 - 11905: 0xF2DA, + 34569 - 11905: 0xF2DD, + 34570 - 11905: 0xF2DB, + 34571 - 11905: 0xCD99, + 34572 - 11905: 0xCD9A, + 34573 - 11905: 0xF2DC, + 34574 - 11905: 0xCD9B, + 34575 - 11905: 0xCD9C, + 34576 - 11905: 0xCD9D, + 34577 - 11905: 0xCD9E, + 34578 - 11905: 0xD1D1, + 34579 - 11905: 0xF2D1, + 34580 - 11905: 0xCD9F, + 34581 - 11905: 0xCDC9, + 34582 - 11905: 0xCDA0, + 34583 - 11905: 0xCECF, + 34584 - 11905: 0xD6A9, + 34585 - 11905: 0xCE40, + 34586 - 11905: 0xF2E3, + 34587 - 11905: 0xCE41, + 34588 - 11905: 0xC3DB, + 34589 - 11905: 0xCE42, + 34590 - 11905: 0xF2E0, + 34591 - 11905: 0xCE43, + 34592 - 11905: 0xCE44, + 34593 - 11905: 0xC0AF, + 34594 - 11905: 0xF2EC, + 34595 - 11905: 0xF2DE, + 34596 - 11905: 0xCE45, + 34597 - 11905: 0xF2E1, + 34598 - 11905: 0xCE46, + 34599 - 11905: 0xCE47, + 34600 - 11905: 0xCE48, + 34601 - 11905: 0xF2E8, + 34602 - 11905: 0xCE49, + 34603 - 11905: 0xCE4A, + 34604 - 11905: 0xCE4B, + 34605 - 11905: 0xCE4C, + 34606 - 11905: 0xF2E2, + 34607 - 11905: 0xCE4D, + 34608 - 11905: 0xCE4E, + 34609 - 11905: 0xF2E7, + 34610 - 11905: 0xCE4F, + 34611 - 11905: 0xCE50, + 34612 - 11905: 0xF2E6, + 34613 - 11905: 0xCE51, + 34614 - 11905: 0xCE52, + 34615 - 11905: 0xF2E9, + 34616 - 11905: 0xCE53, + 34617 - 11905: 0xCE54, + 34618 - 11905: 0xCE55, + 34619 - 11905: 0xF2DF, + 34620 - 11905: 0xCE56, + 34621 - 11905: 0xCE57, + 34622 - 11905: 0xF2E4, + 34623 - 11905: 0xF2EA, + 34624 - 11905: 0xCE58, + 34625 - 11905: 0xCE59, + 34626 - 11905: 0xCE5A, + 34627 - 11905: 0xCE5B, + 34628 - 11905: 0xCE5C, + 34629 - 11905: 0xCE5D, + 34630 - 11905: 0xCE5E, + 34631 - 11905: 0xD3AC, + 34632 - 11905: 0xF2E5, + 34633 - 11905: 0xB2F5, + 34634 - 11905: 0xCE5F, + 34635 - 11905: 0xCE60, + 34636 - 11905: 0xF2F2, + 34637 - 11905: 0xCE61, + 34638 - 11905: 0xD0AB, + 34639 - 11905: 0xCE62, + 34640 - 11905: 0xCE63, + 34641 - 11905: 0xCE64, + 34642 - 11905: 0xCE65, + 34643 - 11905: 0xF2F5, + 34644 - 11905: 0xCE66, + 34645 - 11905: 0xCE67, + 34646 - 11905: 0xCE68, + 34647 - 11905: 0xBBC8, + 34648 - 11905: 0xCE69, + 34649 - 11905: 0xF2F9, + 34650 - 11905: 0xCE6A, + 34651 - 11905: 0xCE6B, + 34652 - 11905: 0xCE6C, + 34653 - 11905: 0xCE6D, + 34654 - 11905: 0xCE6E, + 34655 - 11905: 0xCE6F, + 34656 - 11905: 0xF2F0, + 34657 - 11905: 0xCE70, + 34658 - 11905: 0xCE71, + 34659 - 11905: 0xF2F6, + 34660 - 11905: 0xF2F8, + 34661 - 11905: 0xF2FA, + 34662 - 11905: 0xCE72, + 34663 - 11905: 0xCE73, + 34664 - 11905: 0xCE74, + 34665 - 11905: 0xCE75, + 34666 - 11905: 0xCE76, + 34667 - 11905: 0xCE77, + 34668 - 11905: 0xCE78, + 34669 - 11905: 0xCE79, + 34670 - 11905: 0xF2F3, + 34671 - 11905: 0xCE7A, + 34672 - 11905: 0xF2F1, + 34673 - 11905: 0xCE7B, + 34674 - 11905: 0xCE7C, + 34675 - 11905: 0xCE7D, + 34676 - 11905: 0xBAFB, + 34677 - 11905: 0xCE7E, + 34678 - 11905: 0xB5FB, + 34679 - 11905: 0xCE80, + 34680 - 11905: 0xCE81, + 34681 - 11905: 0xCE82, + 34682 - 11905: 0xCE83, + 34683 - 11905: 0xF2EF, + 34684 - 11905: 0xF2F7, + 34685 - 11905: 0xF2ED, + 34686 - 11905: 0xF2EE, + 34687 - 11905: 0xCE84, + 34688 - 11905: 0xCE85, + 34689 - 11905: 0xCE86, + 34690 - 11905: 0xF2EB, + 34691 - 11905: 0xF3A6, + 34692 - 11905: 0xCE87, + 34693 - 11905: 0xF3A3, + 34694 - 11905: 0xCE88, + 34695 - 11905: 0xCE89, + 34696 - 11905: 0xF3A2, + 34697 - 11905: 0xCE8A, + 34698 - 11905: 0xCE8B, + 34699 - 11905: 0xF2F4, + 34700 - 11905: 0xCE8C, + 34701 - 11905: 0xC8DA, + 34702 - 11905: 0xCE8D, + 34703 - 11905: 0xCE8E, + 34704 - 11905: 0xCE8F, + 34705 - 11905: 0xCE90, + 34706 - 11905: 0xCE91, + 34707 - 11905: 0xF2FB, + 34708 - 11905: 0xCE92, + 34709 - 11905: 0xCE93, + 34710 - 11905: 0xCE94, + 34711 - 11905: 0xF3A5, + 34712 - 11905: 0xCE95, + 34713 - 11905: 0xCE96, + 34714 - 11905: 0xCE97, + 34715 - 11905: 0xCE98, + 34716 - 11905: 0xCE99, + 34717 - 11905: 0xCE9A, + 34718 - 11905: 0xCE9B, + 34719 - 11905: 0xC3F8, + 34720 - 11905: 0xCE9C, + 34721 - 11905: 0xCE9D, + 34722 - 11905: 0xCE9E, + 34723 - 11905: 0xCE9F, + 34724 - 11905: 0xCEA0, + 34725 - 11905: 0xCF40, + 34726 - 11905: 0xCF41, + 34727 - 11905: 0xCF42, + 34728 - 11905: 0xF2FD, + 34729 - 11905: 0xCF43, + 34730 - 11905: 0xCF44, + 34731 - 11905: 0xF3A7, + 34732 - 11905: 0xF3A9, + 34733 - 11905: 0xF3A4, + 34734 - 11905: 0xCF45, + 34735 - 11905: 0xF2FC, + 34736 - 11905: 0xCF46, + 34737 - 11905: 0xCF47, + 34738 - 11905: 0xCF48, + 34739 - 11905: 0xF3AB, + 34740 - 11905: 0xCF49, + 34741 - 11905: 0xF3AA, + 34742 - 11905: 0xCF4A, + 34743 - 11905: 0xCF4B, + 34744 - 11905: 0xCF4C, + 34745 - 11905: 0xCF4D, + 34746 - 11905: 0xC2DD, + 34747 - 11905: 0xCF4E, + 34748 - 11905: 0xCF4F, + 34749 - 11905: 0xF3AE, + 34750 - 11905: 0xCF50, + 34751 - 11905: 0xCF51, + 34752 - 11905: 0xF3B0, + 34753 - 11905: 0xCF52, + 34754 - 11905: 0xCF53, + 34755 - 11905: 0xCF54, + 34756 - 11905: 0xCF55, + 34757 - 11905: 0xCF56, + 34758 - 11905: 0xF3A1, + 34759 - 11905: 0xCF57, + 34760 - 11905: 0xCF58, + 34761 - 11905: 0xCF59, + 34762 - 11905: 0xF3B1, + 34763 - 11905: 0xF3AC, + 34764 - 11905: 0xCF5A, + 34765 - 11905: 0xCF5B, + 34766 - 11905: 0xCF5C, + 34767 - 11905: 0xCF5D, + 34768 - 11905: 0xCF5E, + 34769 - 11905: 0xF3AF, + 34770 - 11905: 0xF2FE, + 34771 - 11905: 0xF3AD, + 34772 - 11905: 0xCF5F, + 34773 - 11905: 0xCF60, + 34774 - 11905: 0xCF61, + 34775 - 11905: 0xCF62, + 34776 - 11905: 0xCF63, + 34777 - 11905: 0xCF64, + 34778 - 11905: 0xCF65, + 34779 - 11905: 0xF3B2, + 34780 - 11905: 0xCF66, + 34781 - 11905: 0xCF67, + 34782 - 11905: 0xCF68, + 34783 - 11905: 0xCF69, + 34784 - 11905: 0xF3B4, + 34785 - 11905: 0xCF6A, + 34786 - 11905: 0xCF6B, + 34787 - 11905: 0xCF6C, + 34788 - 11905: 0xCF6D, + 34789 - 11905: 0xF3A8, + 34790 - 11905: 0xCF6E, + 34791 - 11905: 0xCF6F, + 34792 - 11905: 0xCF70, + 34793 - 11905: 0xCF71, + 34794 - 11905: 0xF3B3, + 34795 - 11905: 0xCF72, + 34796 - 11905: 0xCF73, + 34797 - 11905: 0xCF74, + 34798 - 11905: 0xF3B5, + 34799 - 11905: 0xCF75, + 34800 - 11905: 0xCF76, + 34801 - 11905: 0xCF77, + 34802 - 11905: 0xCF78, + 34803 - 11905: 0xCF79, + 34804 - 11905: 0xCF7A, + 34805 - 11905: 0xCF7B, + 34806 - 11905: 0xCF7C, + 34807 - 11905: 0xCF7D, + 34808 - 11905: 0xCF7E, + 34809 - 11905: 0xD0B7, + 34810 - 11905: 0xCF80, + 34811 - 11905: 0xCF81, + 34812 - 11905: 0xCF82, + 34813 - 11905: 0xCF83, + 34814 - 11905: 0xF3B8, + 34815 - 11905: 0xCF84, + 34816 - 11905: 0xCF85, + 34817 - 11905: 0xCF86, + 34818 - 11905: 0xCF87, + 34819 - 11905: 0xD9F9, + 34820 - 11905: 0xCF88, + 34821 - 11905: 0xCF89, + 34822 - 11905: 0xCF8A, + 34823 - 11905: 0xCF8B, + 34824 - 11905: 0xCF8C, + 34825 - 11905: 0xCF8D, + 34826 - 11905: 0xF3B9, + 34827 - 11905: 0xCF8E, + 34828 - 11905: 0xCF8F, + 34829 - 11905: 0xCF90, + 34830 - 11905: 0xCF91, + 34831 - 11905: 0xCF92, + 34832 - 11905: 0xCF93, + 34833 - 11905: 0xCF94, + 34834 - 11905: 0xCF95, + 34835 - 11905: 0xF3B7, + 34836 - 11905: 0xCF96, + 34837 - 11905: 0xC8E4, + 34838 - 11905: 0xF3B6, + 34839 - 11905: 0xCF97, + 34840 - 11905: 0xCF98, + 34841 - 11905: 0xCF99, + 34842 - 11905: 0xCF9A, + 34843 - 11905: 0xF3BA, + 34844 - 11905: 0xCF9B, + 34845 - 11905: 0xCF9C, + 34846 - 11905: 0xCF9D, + 34847 - 11905: 0xCF9E, + 34848 - 11905: 0xCF9F, + 34849 - 11905: 0xF3BB, + 34850 - 11905: 0xB4C0, + 34851 - 11905: 0xCFA0, + 34852 - 11905: 0xD040, + 34853 - 11905: 0xD041, + 34854 - 11905: 0xD042, + 34855 - 11905: 0xD043, + 34856 - 11905: 0xD044, + 34857 - 11905: 0xD045, + 34858 - 11905: 0xD046, + 34859 - 11905: 0xD047, + 34860 - 11905: 0xD048, + 34861 - 11905: 0xD049, + 34862 - 11905: 0xD04A, + 34863 - 11905: 0xD04B, + 34864 - 11905: 0xD04C, + 34865 - 11905: 0xD04D, + 34866 - 11905: 0xEEC3, + 34867 - 11905: 0xD04E, + 34868 - 11905: 0xD04F, + 34869 - 11905: 0xD050, + 34870 - 11905: 0xD051, + 34871 - 11905: 0xD052, + 34872 - 11905: 0xD053, + 34873 - 11905: 0xF3BC, + 34874 - 11905: 0xD054, + 34875 - 11905: 0xD055, + 34876 - 11905: 0xF3BD, + 34877 - 11905: 0xD056, + 34878 - 11905: 0xD057, + 34879 - 11905: 0xD058, + 34880 - 11905: 0xD1AA, + 34881 - 11905: 0xD059, + 34882 - 11905: 0xD05A, + 34883 - 11905: 0xD05B, + 34884 - 11905: 0xF4AC, + 34885 - 11905: 0xD0C6, + 34886 - 11905: 0xD05C, + 34887 - 11905: 0xD05D, + 34888 - 11905: 0xD05E, + 34889 - 11905: 0xD05F, + 34890 - 11905: 0xD060, + 34891 - 11905: 0xD061, + 34892 - 11905: 0xD0D0, + 34893 - 11905: 0xD1DC, + 34894 - 11905: 0xD062, + 34895 - 11905: 0xD063, + 34896 - 11905: 0xD064, + 34897 - 11905: 0xD065, + 34898 - 11905: 0xD066, + 34899 - 11905: 0xD067, + 34900 - 11905: 0xCFCE, + 34901 - 11905: 0xD068, + 34902 - 11905: 0xD069, + 34903 - 11905: 0xBDD6, + 34904 - 11905: 0xD06A, + 34905 - 11905: 0xD1C3, + 34906 - 11905: 0xD06B, + 34907 - 11905: 0xD06C, + 34908 - 11905: 0xD06D, + 34909 - 11905: 0xD06E, + 34910 - 11905: 0xD06F, + 34911 - 11905: 0xD070, + 34912 - 11905: 0xD071, + 34913 - 11905: 0xBAE2, + 34914 - 11905: 0xE1E9, + 34915 - 11905: 0xD2C2, + 34916 - 11905: 0xF1C2, + 34917 - 11905: 0xB2B9, + 34918 - 11905: 0xD072, + 34919 - 11905: 0xD073, + 34920 - 11905: 0xB1ED, + 34921 - 11905: 0xF1C3, + 34922 - 11905: 0xD074, + 34923 - 11905: 0xC9C0, + 34924 - 11905: 0xB3C4, + 34925 - 11905: 0xD075, + 34926 - 11905: 0xD9F2, + 34927 - 11905: 0xD076, + 34928 - 11905: 0xCBA5, + 34929 - 11905: 0xD077, + 34930 - 11905: 0xF1C4, + 34931 - 11905: 0xD078, + 34932 - 11905: 0xD079, + 34933 - 11905: 0xD07A, + 34934 - 11905: 0xD07B, + 34935 - 11905: 0xD6D4, + 34936 - 11905: 0xD07C, + 34937 - 11905: 0xD07D, + 34938 - 11905: 0xD07E, + 34939 - 11905: 0xD080, + 34940 - 11905: 0xD081, + 34941 - 11905: 0xF1C5, + 34942 - 11905: 0xF4C0, + 34943 - 11905: 0xF1C6, + 34944 - 11905: 0xD082, + 34945 - 11905: 0xD4AC, + 34946 - 11905: 0xF1C7, + 34947 - 11905: 0xD083, + 34948 - 11905: 0xB0C0, + 34949 - 11905: 0xF4C1, + 34950 - 11905: 0xD084, + 34951 - 11905: 0xD085, + 34952 - 11905: 0xF4C2, + 34953 - 11905: 0xD086, + 34954 - 11905: 0xD087, + 34955 - 11905: 0xB4FC, + 34956 - 11905: 0xD088, + 34957 - 11905: 0xC5DB, + 34958 - 11905: 0xD089, + 34959 - 11905: 0xD08A, + 34960 - 11905: 0xD08B, + 34961 - 11905: 0xD08C, + 34962 - 11905: 0xCCBB, + 34963 - 11905: 0xD08D, + 34964 - 11905: 0xD08E, + 34965 - 11905: 0xD08F, + 34966 - 11905: 0xD0E4, + 34967 - 11905: 0xD090, + 34968 - 11905: 0xD091, + 34969 - 11905: 0xD092, + 34970 - 11905: 0xD093, + 34971 - 11905: 0xD094, + 34972 - 11905: 0xCDE0, + 34973 - 11905: 0xD095, + 34974 - 11905: 0xD096, + 34975 - 11905: 0xD097, + 34976 - 11905: 0xD098, + 34977 - 11905: 0xD099, + 34978 - 11905: 0xF1C8, + 34979 - 11905: 0xD09A, + 34980 - 11905: 0xD9F3, + 34981 - 11905: 0xD09B, + 34982 - 11905: 0xD09C, + 34983 - 11905: 0xD09D, + 34984 - 11905: 0xD09E, + 34985 - 11905: 0xD09F, + 34986 - 11905: 0xD0A0, + 34987 - 11905: 0xB1BB, + 34988 - 11905: 0xD140, + 34989 - 11905: 0xCFAE, + 34990 - 11905: 0xD141, + 34991 - 11905: 0xD142, + 34992 - 11905: 0xD143, + 34993 - 11905: 0xB8A4, + 34994 - 11905: 0xD144, + 34995 - 11905: 0xD145, + 34996 - 11905: 0xD146, + 34997 - 11905: 0xD147, + 34998 - 11905: 0xD148, + 34999 - 11905: 0xF1CA, + 35000 - 11905: 0xD149, + 35001 - 11905: 0xD14A, + 35002 - 11905: 0xD14B, + 35003 - 11905: 0xD14C, + 35004 - 11905: 0xF1CB, + 35005 - 11905: 0xD14D, + 35006 - 11905: 0xD14E, + 35007 - 11905: 0xD14F, + 35008 - 11905: 0xD150, + 35009 - 11905: 0xB2C3, + 35010 - 11905: 0xC1D1, + 35011 - 11905: 0xD151, + 35012 - 11905: 0xD152, + 35013 - 11905: 0xD7B0, + 35014 - 11905: 0xF1C9, + 35015 - 11905: 0xD153, + 35016 - 11905: 0xD154, + 35017 - 11905: 0xF1CC, + 35018 - 11905: 0xD155, + 35019 - 11905: 0xD156, + 35020 - 11905: 0xD157, + 35021 - 11905: 0xD158, + 35022 - 11905: 0xF1CE, + 35023 - 11905: 0xD159, + 35024 - 11905: 0xD15A, + 35025 - 11905: 0xD15B, + 35026 - 11905: 0xD9F6, + 35027 - 11905: 0xD15C, + 35028 - 11905: 0xD2E1, + 35029 - 11905: 0xD4A3, + 35030 - 11905: 0xD15D, + 35031 - 11905: 0xD15E, + 35032 - 11905: 0xF4C3, + 35033 - 11905: 0xC8B9, + 35034 - 11905: 0xD15F, + 35035 - 11905: 0xD160, + 35036 - 11905: 0xD161, + 35037 - 11905: 0xD162, + 35038 - 11905: 0xD163, + 35039 - 11905: 0xF4C4, + 35040 - 11905: 0xD164, + 35041 - 11905: 0xD165, + 35042 - 11905: 0xF1CD, + 35043 - 11905: 0xF1CF, + 35044 - 11905: 0xBFE3, + 35045 - 11905: 0xF1D0, + 35046 - 11905: 0xD166, + 35047 - 11905: 0xD167, + 35048 - 11905: 0xF1D4, + 35049 - 11905: 0xD168, + 35050 - 11905: 0xD169, + 35051 - 11905: 0xD16A, + 35052 - 11905: 0xD16B, + 35053 - 11905: 0xD16C, + 35054 - 11905: 0xD16D, + 35055 - 11905: 0xD16E, + 35056 - 11905: 0xF1D6, + 35057 - 11905: 0xF1D1, + 35058 - 11905: 0xD16F, + 35059 - 11905: 0xC9D1, + 35060 - 11905: 0xC5E1, + 35061 - 11905: 0xD170, + 35062 - 11905: 0xD171, + 35063 - 11905: 0xD172, + 35064 - 11905: 0xC2E3, + 35065 - 11905: 0xB9FC, + 35066 - 11905: 0xD173, + 35067 - 11905: 0xD174, + 35068 - 11905: 0xF1D3, + 35069 - 11905: 0xD175, + 35070 - 11905: 0xF1D5, + 35071 - 11905: 0xD176, + 35072 - 11905: 0xD177, + 35073 - 11905: 0xD178, + 35074 - 11905: 0xB9D3, + 35075 - 11905: 0xD179, + 35076 - 11905: 0xD17A, + 35077 - 11905: 0xD17B, + 35078 - 11905: 0xD17C, + 35079 - 11905: 0xD17D, + 35080 - 11905: 0xD17E, + 35081 - 11905: 0xD180, + 35082 - 11905: 0xF1DB, + 35083 - 11905: 0xD181, + 35084 - 11905: 0xD182, + 35085 - 11905: 0xD183, + 35086 - 11905: 0xD184, + 35087 - 11905: 0xD185, + 35088 - 11905: 0xBAD6, + 35089 - 11905: 0xD186, + 35090 - 11905: 0xB0FD, + 35091 - 11905: 0xF1D9, + 35092 - 11905: 0xD187, + 35093 - 11905: 0xD188, + 35094 - 11905: 0xD189, + 35095 - 11905: 0xD18A, + 35096 - 11905: 0xD18B, + 35097 - 11905: 0xF1D8, + 35098 - 11905: 0xF1D2, + 35099 - 11905: 0xF1DA, + 35100 - 11905: 0xD18C, + 35101 - 11905: 0xD18D, + 35102 - 11905: 0xD18E, + 35103 - 11905: 0xD18F, + 35104 - 11905: 0xD190, + 35105 - 11905: 0xF1D7, + 35106 - 11905: 0xD191, + 35107 - 11905: 0xD192, + 35108 - 11905: 0xD193, + 35109 - 11905: 0xC8EC, + 35110 - 11905: 0xD194, + 35111 - 11905: 0xD195, + 35112 - 11905: 0xD196, + 35113 - 11905: 0xD197, + 35114 - 11905: 0xCDCA, + 35115 - 11905: 0xF1DD, + 35116 - 11905: 0xD198, + 35117 - 11905: 0xD199, + 35118 - 11905: 0xD19A, + 35119 - 11905: 0xD19B, + 35120 - 11905: 0xE5BD, + 35121 - 11905: 0xD19C, + 35122 - 11905: 0xD19D, + 35123 - 11905: 0xD19E, + 35124 - 11905: 0xF1DC, + 35125 - 11905: 0xD19F, + 35126 - 11905: 0xF1DE, + 35127 - 11905: 0xD1A0, + 35128 - 11905: 0xD240, + 35129 - 11905: 0xD241, + 35130 - 11905: 0xD242, + 35131 - 11905: 0xD243, + 35132 - 11905: 0xD244, + 35133 - 11905: 0xD245, + 35134 - 11905: 0xD246, + 35135 - 11905: 0xD247, + 35136 - 11905: 0xD248, + 35137 - 11905: 0xF1DF, + 35138 - 11905: 0xD249, + 35139 - 11905: 0xD24A, + 35140 - 11905: 0xCFE5, + 35141 - 11905: 0xD24B, + 35142 - 11905: 0xD24C, + 35143 - 11905: 0xD24D, + 35144 - 11905: 0xD24E, + 35145 - 11905: 0xD24F, + 35146 - 11905: 0xD250, + 35147 - 11905: 0xD251, + 35148 - 11905: 0xD252, + 35149 - 11905: 0xD253, + 35150 - 11905: 0xD254, + 35151 - 11905: 0xD255, + 35152 - 11905: 0xD256, + 35153 - 11905: 0xD257, + 35154 - 11905: 0xD258, + 35155 - 11905: 0xD259, + 35156 - 11905: 0xD25A, + 35157 - 11905: 0xD25B, + 35158 - 11905: 0xD25C, + 35159 - 11905: 0xD25D, + 35160 - 11905: 0xD25E, + 35161 - 11905: 0xD25F, + 35162 - 11905: 0xD260, + 35163 - 11905: 0xD261, + 35164 - 11905: 0xD262, + 35165 - 11905: 0xD263, + 35166 - 11905: 0xF4C5, + 35167 - 11905: 0xBDF3, + 35168 - 11905: 0xD264, + 35169 - 11905: 0xD265, + 35170 - 11905: 0xD266, + 35171 - 11905: 0xD267, + 35172 - 11905: 0xD268, + 35173 - 11905: 0xD269, + 35174 - 11905: 0xF1E0, + 35175 - 11905: 0xD26A, + 35176 - 11905: 0xD26B, + 35177 - 11905: 0xD26C, + 35178 - 11905: 0xD26D, + 35179 - 11905: 0xD26E, + 35180 - 11905: 0xD26F, + 35181 - 11905: 0xD270, + 35182 - 11905: 0xD271, + 35183 - 11905: 0xD272, + 35184 - 11905: 0xD273, + 35185 - 11905: 0xD274, + 35186 - 11905: 0xD275, + 35187 - 11905: 0xD276, + 35188 - 11905: 0xD277, + 35189 - 11905: 0xD278, + 35190 - 11905: 0xD279, + 35191 - 11905: 0xD27A, + 35192 - 11905: 0xD27B, + 35193 - 11905: 0xD27C, + 35194 - 11905: 0xD27D, + 35195 - 11905: 0xF1E1, + 35196 - 11905: 0xD27E, + 35197 - 11905: 0xD280, + 35198 - 11905: 0xD281, + 35199 - 11905: 0xCEF7, + 35200 - 11905: 0xD282, + 35201 - 11905: 0xD2AA, + 35202 - 11905: 0xD283, + 35203 - 11905: 0xF1FB, + 35204 - 11905: 0xD284, + 35205 - 11905: 0xD285, + 35206 - 11905: 0xB8B2, + 35207 - 11905: 0xD286, + 35208 - 11905: 0xD287, + 35209 - 11905: 0xD288, + 35210 - 11905: 0xD289, + 35211 - 11905: 0xD28A, + 35212 - 11905: 0xD28B, + 35213 - 11905: 0xD28C, + 35214 - 11905: 0xD28D, + 35215 - 11905: 0xD28E, + 35216 - 11905: 0xD28F, + 35217 - 11905: 0xD290, + 35218 - 11905: 0xD291, + 35219 - 11905: 0xD292, + 35220 - 11905: 0xD293, + 35221 - 11905: 0xD294, + 35222 - 11905: 0xD295, + 35223 - 11905: 0xD296, + 35224 - 11905: 0xD297, + 35225 - 11905: 0xD298, + 35226 - 11905: 0xD299, + 35227 - 11905: 0xD29A, + 35228 - 11905: 0xD29B, + 35229 - 11905: 0xD29C, + 35230 - 11905: 0xD29D, + 35231 - 11905: 0xD29E, + 35232 - 11905: 0xD29F, + 35233 - 11905: 0xD2A0, + 35234 - 11905: 0xD340, + 35235 - 11905: 0xD341, + 35236 - 11905: 0xD342, + 35237 - 11905: 0xD343, + 35238 - 11905: 0xD344, + 35239 - 11905: 0xD345, + 35240 - 11905: 0xD346, + 35241 - 11905: 0xD347, + 35242 - 11905: 0xD348, + 35243 - 11905: 0xD349, + 35244 - 11905: 0xD34A, + 35245 - 11905: 0xD34B, + 35246 - 11905: 0xD34C, + 35247 - 11905: 0xD34D, + 35248 - 11905: 0xD34E, + 35249 - 11905: 0xD34F, + 35250 - 11905: 0xD350, + 35251 - 11905: 0xD351, + 35252 - 11905: 0xD352, + 35253 - 11905: 0xD353, + 35254 - 11905: 0xD354, + 35255 - 11905: 0xD355, + 35256 - 11905: 0xD356, + 35257 - 11905: 0xD357, + 35258 - 11905: 0xD358, + 35259 - 11905: 0xD359, + 35260 - 11905: 0xD35A, + 35261 - 11905: 0xD35B, + 35262 - 11905: 0xD35C, + 35263 - 11905: 0xD35D, + 35264 - 11905: 0xD35E, + 35265 - 11905: 0xBCFB, + 35266 - 11905: 0xB9DB, + 35267 - 11905: 0xD35F, + 35268 - 11905: 0xB9E6, + 35269 - 11905: 0xC3D9, + 35270 - 11905: 0xCAD3, + 35271 - 11905: 0xEAE8, + 35272 - 11905: 0xC0C0, + 35273 - 11905: 0xBEF5, + 35274 - 11905: 0xEAE9, + 35275 - 11905: 0xEAEA, + 35276 - 11905: 0xEAEB, + 35277 - 11905: 0xD360, + 35278 - 11905: 0xEAEC, + 35279 - 11905: 0xEAED, + 35280 - 11905: 0xEAEE, + 35281 - 11905: 0xEAEF, + 35282 - 11905: 0xBDC7, + 35283 - 11905: 0xD361, + 35284 - 11905: 0xD362, + 35285 - 11905: 0xD363, + 35286 - 11905: 0xF5FB, + 35287 - 11905: 0xD364, + 35288 - 11905: 0xD365, + 35289 - 11905: 0xD366, + 35290 - 11905: 0xF5FD, + 35291 - 11905: 0xD367, + 35292 - 11905: 0xF5FE, + 35293 - 11905: 0xD368, + 35294 - 11905: 0xF5FC, + 35295 - 11905: 0xD369, + 35296 - 11905: 0xD36A, + 35297 - 11905: 0xD36B, + 35298 - 11905: 0xD36C, + 35299 - 11905: 0xBDE2, + 35300 - 11905: 0xD36D, + 35301 - 11905: 0xF6A1, + 35302 - 11905: 0xB4A5, + 35303 - 11905: 0xD36E, + 35304 - 11905: 0xD36F, + 35305 - 11905: 0xD370, + 35306 - 11905: 0xD371, + 35307 - 11905: 0xF6A2, + 35308 - 11905: 0xD372, + 35309 - 11905: 0xD373, + 35310 - 11905: 0xD374, + 35311 - 11905: 0xF6A3, + 35312 - 11905: 0xD375, + 35313 - 11905: 0xD376, + 35314 - 11905: 0xD377, + 35315 - 11905: 0xECB2, + 35316 - 11905: 0xD378, + 35317 - 11905: 0xD379, + 35318 - 11905: 0xD37A, + 35319 - 11905: 0xD37B, + 35320 - 11905: 0xD37C, + 35321 - 11905: 0xD37D, + 35322 - 11905: 0xD37E, + 35323 - 11905: 0xD380, + 35324 - 11905: 0xD381, + 35325 - 11905: 0xD382, + 35326 - 11905: 0xD383, + 35327 - 11905: 0xD384, + 35328 - 11905: 0xD1D4, + 35329 - 11905: 0xD385, + 35330 - 11905: 0xD386, + 35331 - 11905: 0xD387, + 35332 - 11905: 0xD388, + 35333 - 11905: 0xD389, + 35334 - 11905: 0xD38A, + 35335 - 11905: 0xD9EA, + 35336 - 11905: 0xD38B, + 35337 - 11905: 0xD38C, + 35338 - 11905: 0xD38D, + 35339 - 11905: 0xD38E, + 35340 - 11905: 0xD38F, + 35341 - 11905: 0xD390, + 35342 - 11905: 0xD391, + 35343 - 11905: 0xD392, + 35344 - 11905: 0xD393, + 35345 - 11905: 0xD394, + 35346 - 11905: 0xD395, + 35347 - 11905: 0xD396, + 35348 - 11905: 0xD397, + 35349 - 11905: 0xD398, + 35350 - 11905: 0xD399, + 35351 - 11905: 0xD39A, + 35352 - 11905: 0xD39B, + 35353 - 11905: 0xD39C, + 35354 - 11905: 0xD39D, + 35355 - 11905: 0xD39E, + 35356 - 11905: 0xD39F, + 35357 - 11905: 0xD3A0, + 35358 - 11905: 0xD440, + 35359 - 11905: 0xD441, + 35360 - 11905: 0xD442, + 35361 - 11905: 0xD443, + 35362 - 11905: 0xD444, + 35363 - 11905: 0xD445, + 35364 - 11905: 0xD446, + 35365 - 11905: 0xD447, + 35366 - 11905: 0xD448, + 35367 - 11905: 0xD449, + 35368 - 11905: 0xD44A, + 35369 - 11905: 0xD44B, + 35370 - 11905: 0xD44C, + 35371 - 11905: 0xD44D, + 35372 - 11905: 0xD44E, + 35373 - 11905: 0xD44F, + 35374 - 11905: 0xD450, + 35375 - 11905: 0xD451, + 35376 - 11905: 0xD452, + 35377 - 11905: 0xD453, + 35378 - 11905: 0xD454, + 35379 - 11905: 0xD455, + 35380 - 11905: 0xD456, + 35381 - 11905: 0xD457, + 35382 - 11905: 0xD458, + 35383 - 11905: 0xD459, + 35384 - 11905: 0xD45A, + 35385 - 11905: 0xD45B, + 35386 - 11905: 0xD45C, + 35387 - 11905: 0xD45D, + 35388 - 11905: 0xD45E, + 35389 - 11905: 0xD45F, + 35390 - 11905: 0xF6A4, + 35391 - 11905: 0xD460, + 35392 - 11905: 0xD461, + 35393 - 11905: 0xD462, + 35394 - 11905: 0xD463, + 35395 - 11905: 0xD464, + 35396 - 11905: 0xD465, + 35397 - 11905: 0xD466, + 35398 - 11905: 0xD467, + 35399 - 11905: 0xD468, + 35400 - 11905: 0xEEBA, + 35401 - 11905: 0xD469, + 35402 - 11905: 0xD46A, + 35403 - 11905: 0xD46B, + 35404 - 11905: 0xD46C, + 35405 - 11905: 0xD46D, + 35406 - 11905: 0xD46E, + 35407 - 11905: 0xD46F, + 35408 - 11905: 0xD470, + 35409 - 11905: 0xD471, + 35410 - 11905: 0xD472, + 35411 - 11905: 0xD473, + 35412 - 11905: 0xD474, + 35413 - 11905: 0xD475, + 35414 - 11905: 0xD476, + 35415 - 11905: 0xD477, + 35416 - 11905: 0xD478, + 35417 - 11905: 0xD479, + 35418 - 11905: 0xD47A, + 35419 - 11905: 0xD47B, + 35420 - 11905: 0xD47C, + 35421 - 11905: 0xD47D, + 35422 - 11905: 0xD47E, + 35423 - 11905: 0xD480, + 35424 - 11905: 0xD481, + 35425 - 11905: 0xD482, + 35426 - 11905: 0xD483, + 35427 - 11905: 0xD484, + 35428 - 11905: 0xD485, + 35429 - 11905: 0xD486, + 35430 - 11905: 0xD487, + 35431 - 11905: 0xD488, + 35432 - 11905: 0xD489, + 35433 - 11905: 0xD48A, + 35434 - 11905: 0xD48B, + 35435 - 11905: 0xD48C, + 35436 - 11905: 0xD48D, + 35437 - 11905: 0xD48E, + 35438 - 11905: 0xD48F, + 35439 - 11905: 0xD490, + 35440 - 11905: 0xD491, + 35441 - 11905: 0xD492, + 35442 - 11905: 0xD493, + 35443 - 11905: 0xD494, + 35444 - 11905: 0xD495, + 35445 - 11905: 0xD496, + 35446 - 11905: 0xD497, + 35447 - 11905: 0xD498, + 35448 - 11905: 0xD499, + 35449 - 11905: 0xD5B2, + 35450 - 11905: 0xD49A, + 35451 - 11905: 0xD49B, + 35452 - 11905: 0xD49C, + 35453 - 11905: 0xD49D, + 35454 - 11905: 0xD49E, + 35455 - 11905: 0xD49F, + 35456 - 11905: 0xD4A0, + 35457 - 11905: 0xD540, + 35458 - 11905: 0xD541, + 35459 - 11905: 0xD542, + 35460 - 11905: 0xD543, + 35461 - 11905: 0xD544, + 35462 - 11905: 0xD545, + 35463 - 11905: 0xD546, + 35464 - 11905: 0xD547, + 35465 - 11905: 0xD3FE, + 35466 - 11905: 0xCCDC, + 35467 - 11905: 0xD548, + 35468 - 11905: 0xD549, + 35469 - 11905: 0xD54A, + 35470 - 11905: 0xD54B, + 35471 - 11905: 0xD54C, + 35472 - 11905: 0xD54D, + 35473 - 11905: 0xD54E, + 35474 - 11905: 0xD54F, + 35475 - 11905: 0xCAC4, + 35476 - 11905: 0xD550, + 35477 - 11905: 0xD551, + 35478 - 11905: 0xD552, + 35479 - 11905: 0xD553, + 35480 - 11905: 0xD554, + 35481 - 11905: 0xD555, + 35482 - 11905: 0xD556, + 35483 - 11905: 0xD557, + 35484 - 11905: 0xD558, + 35485 - 11905: 0xD559, + 35486 - 11905: 0xD55A, + 35487 - 11905: 0xD55B, + 35488 - 11905: 0xD55C, + 35489 - 11905: 0xD55D, + 35490 - 11905: 0xD55E, + 35491 - 11905: 0xD55F, + 35492 - 11905: 0xD560, + 35493 - 11905: 0xD561, + 35494 - 11905: 0xD562, + 35495 - 11905: 0xD563, + 35496 - 11905: 0xD564, + 35497 - 11905: 0xD565, + 35498 - 11905: 0xD566, + 35499 - 11905: 0xD567, + 35500 - 11905: 0xD568, + 35501 - 11905: 0xD569, + 35502 - 11905: 0xD56A, + 35503 - 11905: 0xD56B, + 35504 - 11905: 0xD56C, + 35505 - 11905: 0xD56D, + 35506 - 11905: 0xD56E, + 35507 - 11905: 0xD56F, + 35508 - 11905: 0xD570, + 35509 - 11905: 0xD571, + 35510 - 11905: 0xD572, + 35511 - 11905: 0xD573, + 35512 - 11905: 0xD574, + 35513 - 11905: 0xD575, + 35514 - 11905: 0xD576, + 35515 - 11905: 0xD577, + 35516 - 11905: 0xD578, + 35517 - 11905: 0xD579, + 35518 - 11905: 0xD57A, + 35519 - 11905: 0xD57B, + 35520 - 11905: 0xD57C, + 35521 - 11905: 0xD57D, + 35522 - 11905: 0xD57E, + 35523 - 11905: 0xD580, + 35524 - 11905: 0xD581, + 35525 - 11905: 0xD582, + 35526 - 11905: 0xD583, + 35527 - 11905: 0xD584, + 35528 - 11905: 0xD585, + 35529 - 11905: 0xD586, + 35530 - 11905: 0xD587, + 35531 - 11905: 0xD588, + 35532 - 11905: 0xD589, + 35533 - 11905: 0xD58A, + 35534 - 11905: 0xD58B, + 35535 - 11905: 0xD58C, + 35536 - 11905: 0xD58D, + 35537 - 11905: 0xD58E, + 35538 - 11905: 0xD58F, + 35539 - 11905: 0xD590, + 35540 - 11905: 0xD591, + 35541 - 11905: 0xD592, + 35542 - 11905: 0xD593, + 35543 - 11905: 0xD594, + 35544 - 11905: 0xD595, + 35545 - 11905: 0xD596, + 35546 - 11905: 0xD597, + 35547 - 11905: 0xD598, + 35548 - 11905: 0xD599, + 35549 - 11905: 0xD59A, + 35550 - 11905: 0xD59B, + 35551 - 11905: 0xD59C, + 35552 - 11905: 0xD59D, + 35553 - 11905: 0xD59E, + 35554 - 11905: 0xD59F, + 35555 - 11905: 0xD5A0, + 35556 - 11905: 0xD640, + 35557 - 11905: 0xD641, + 35558 - 11905: 0xD642, + 35559 - 11905: 0xD643, + 35560 - 11905: 0xD644, + 35561 - 11905: 0xD645, + 35562 - 11905: 0xD646, + 35563 - 11905: 0xD647, + 35564 - 11905: 0xD648, + 35565 - 11905: 0xD649, + 35566 - 11905: 0xD64A, + 35567 - 11905: 0xD64B, + 35568 - 11905: 0xD64C, + 35569 - 11905: 0xD64D, + 35570 - 11905: 0xD64E, + 35571 - 11905: 0xD64F, + 35572 - 11905: 0xD650, + 35573 - 11905: 0xD651, + 35574 - 11905: 0xD652, + 35575 - 11905: 0xD653, + 35576 - 11905: 0xD654, + 35577 - 11905: 0xD655, + 35578 - 11905: 0xD656, + 35579 - 11905: 0xD657, + 35580 - 11905: 0xD658, + 35581 - 11905: 0xD659, + 35582 - 11905: 0xD65A, + 35583 - 11905: 0xD65B, + 35584 - 11905: 0xD65C, + 35585 - 11905: 0xD65D, + 35586 - 11905: 0xD65E, + 35587 - 11905: 0xD65F, + 35588 - 11905: 0xD660, + 35589 - 11905: 0xD661, + 35590 - 11905: 0xD662, + 35591 - 11905: 0xE5C0, + 35592 - 11905: 0xD663, + 35593 - 11905: 0xD664, + 35594 - 11905: 0xD665, + 35595 - 11905: 0xD666, + 35596 - 11905: 0xD667, + 35597 - 11905: 0xD668, + 35598 - 11905: 0xD669, + 35599 - 11905: 0xD66A, + 35600 - 11905: 0xD66B, + 35601 - 11905: 0xD66C, + 35602 - 11905: 0xD66D, + 35603 - 11905: 0xD66E, + 35604 - 11905: 0xD66F, + 35605 - 11905: 0xD670, + 35606 - 11905: 0xD671, + 35607 - 11905: 0xD672, + 35608 - 11905: 0xD673, + 35609 - 11905: 0xD674, + 35610 - 11905: 0xD675, + 35611 - 11905: 0xD676, + 35612 - 11905: 0xD677, + 35613 - 11905: 0xD678, + 35614 - 11905: 0xD679, + 35615 - 11905: 0xD67A, + 35616 - 11905: 0xD67B, + 35617 - 11905: 0xD67C, + 35618 - 11905: 0xD67D, + 35619 - 11905: 0xD67E, + 35620 - 11905: 0xD680, + 35621 - 11905: 0xD681, + 35622 - 11905: 0xF6A5, + 35623 - 11905: 0xD682, + 35624 - 11905: 0xD683, + 35625 - 11905: 0xD684, + 35626 - 11905: 0xD685, + 35627 - 11905: 0xD686, + 35628 - 11905: 0xD687, + 35629 - 11905: 0xD688, + 35630 - 11905: 0xD689, + 35631 - 11905: 0xD68A, + 35632 - 11905: 0xD68B, + 35633 - 11905: 0xD68C, + 35634 - 11905: 0xD68D, + 35635 - 11905: 0xD68E, + 35636 - 11905: 0xD68F, + 35637 - 11905: 0xD690, + 35638 - 11905: 0xD691, + 35639 - 11905: 0xD692, + 35640 - 11905: 0xD693, + 35641 - 11905: 0xD694, + 35642 - 11905: 0xD695, + 35643 - 11905: 0xD696, + 35644 - 11905: 0xD697, + 35645 - 11905: 0xD698, + 35646 - 11905: 0xD699, + 35647 - 11905: 0xD69A, + 35648 - 11905: 0xD69B, + 35649 - 11905: 0xD69C, + 35650 - 11905: 0xD69D, + 35651 - 11905: 0xD69E, + 35652 - 11905: 0xD69F, + 35653 - 11905: 0xD6A0, + 35654 - 11905: 0xD740, + 35655 - 11905: 0xD741, + 35656 - 11905: 0xD742, + 35657 - 11905: 0xD743, + 35658 - 11905: 0xD744, + 35659 - 11905: 0xD745, + 35660 - 11905: 0xD746, + 35661 - 11905: 0xD747, + 35662 - 11905: 0xD748, + 35663 - 11905: 0xD749, + 35664 - 11905: 0xD74A, + 35665 - 11905: 0xD74B, + 35666 - 11905: 0xD74C, + 35667 - 11905: 0xD74D, + 35668 - 11905: 0xD74E, + 35669 - 11905: 0xD74F, + 35670 - 11905: 0xD750, + 35671 - 11905: 0xD751, + 35672 - 11905: 0xD752, + 35673 - 11905: 0xD753, + 35674 - 11905: 0xD754, + 35675 - 11905: 0xD755, + 35676 - 11905: 0xD756, + 35677 - 11905: 0xD757, + 35678 - 11905: 0xD758, + 35679 - 11905: 0xD759, + 35680 - 11905: 0xD75A, + 35681 - 11905: 0xD75B, + 35682 - 11905: 0xD75C, + 35683 - 11905: 0xD75D, + 35684 - 11905: 0xD75E, + 35685 - 11905: 0xD75F, + 35686 - 11905: 0xBEAF, + 35687 - 11905: 0xD760, + 35688 - 11905: 0xD761, + 35689 - 11905: 0xD762, + 35690 - 11905: 0xD763, + 35691 - 11905: 0xD764, + 35692 - 11905: 0xC6A9, + 35693 - 11905: 0xD765, + 35694 - 11905: 0xD766, + 35695 - 11905: 0xD767, + 35696 - 11905: 0xD768, + 35697 - 11905: 0xD769, + 35698 - 11905: 0xD76A, + 35699 - 11905: 0xD76B, + 35700 - 11905: 0xD76C, + 35701 - 11905: 0xD76D, + 35702 - 11905: 0xD76E, + 35703 - 11905: 0xD76F, + 35704 - 11905: 0xD770, + 35705 - 11905: 0xD771, + 35706 - 11905: 0xD772, + 35707 - 11905: 0xD773, + 35708 - 11905: 0xD774, + 35709 - 11905: 0xD775, + 35710 - 11905: 0xD776, + 35711 - 11905: 0xD777, + 35712 - 11905: 0xD778, + 35713 - 11905: 0xD779, + 35714 - 11905: 0xD77A, + 35715 - 11905: 0xD77B, + 35716 - 11905: 0xD77C, + 35717 - 11905: 0xD77D, + 35718 - 11905: 0xD77E, + 35719 - 11905: 0xD780, + 35720 - 11905: 0xD781, + 35721 - 11905: 0xD782, + 35722 - 11905: 0xD783, + 35723 - 11905: 0xD784, + 35724 - 11905: 0xD785, + 35725 - 11905: 0xD786, + 35726 - 11905: 0xD787, + 35727 - 11905: 0xD788, + 35728 - 11905: 0xD789, + 35729 - 11905: 0xD78A, + 35730 - 11905: 0xD78B, + 35731 - 11905: 0xD78C, + 35732 - 11905: 0xD78D, + 35733 - 11905: 0xD78E, + 35734 - 11905: 0xD78F, + 35735 - 11905: 0xD790, + 35736 - 11905: 0xD791, + 35737 - 11905: 0xD792, + 35738 - 11905: 0xD793, + 35739 - 11905: 0xD794, + 35740 - 11905: 0xD795, + 35741 - 11905: 0xD796, + 35742 - 11905: 0xD797, + 35743 - 11905: 0xD798, + 35744 - 11905: 0xDAA5, + 35745 - 11905: 0xBCC6, + 35746 - 11905: 0xB6A9, + 35747 - 11905: 0xB8BC, + 35748 - 11905: 0xC8CF, + 35749 - 11905: 0xBCA5, + 35750 - 11905: 0xDAA6, + 35751 - 11905: 0xDAA7, + 35752 - 11905: 0xCCD6, + 35753 - 11905: 0xC8C3, + 35754 - 11905: 0xDAA8, + 35755 - 11905: 0xC6FD, + 35756 - 11905: 0xD799, + 35757 - 11905: 0xD1B5, + 35758 - 11905: 0xD2E9, + 35759 - 11905: 0xD1B6, + 35760 - 11905: 0xBCC7, + 35761 - 11905: 0xD79A, + 35762 - 11905: 0xBDB2, + 35763 - 11905: 0xBBE4, + 35764 - 11905: 0xDAA9, + 35765 - 11905: 0xDAAA, + 35766 - 11905: 0xD1C8, + 35767 - 11905: 0xDAAB, + 35768 - 11905: 0xD0ED, + 35769 - 11905: 0xB6EF, + 35770 - 11905: 0xC2DB, + 35771 - 11905: 0xD79B, + 35772 - 11905: 0xCBCF, + 35773 - 11905: 0xB7ED, + 35774 - 11905: 0xC9E8, + 35775 - 11905: 0xB7C3, + 35776 - 11905: 0xBEF7, + 35777 - 11905: 0xD6A4, + 35778 - 11905: 0xDAAC, + 35779 - 11905: 0xDAAD, + 35780 - 11905: 0xC6C0, + 35781 - 11905: 0xD7E7, + 35782 - 11905: 0xCAB6, + 35783 - 11905: 0xD79C, + 35784 - 11905: 0xD5A9, + 35785 - 11905: 0xCBDF, + 35786 - 11905: 0xD5EF, + 35787 - 11905: 0xDAAE, + 35788 - 11905: 0xD6DF, + 35789 - 11905: 0xB4CA, + 35790 - 11905: 0xDAB0, + 35791 - 11905: 0xDAAF, + 35792 - 11905: 0xD79D, + 35793 - 11905: 0xD2EB, + 35794 - 11905: 0xDAB1, + 35795 - 11905: 0xDAB2, + 35796 - 11905: 0xDAB3, + 35797 - 11905: 0xCAD4, + 35798 - 11905: 0xDAB4, + 35799 - 11905: 0xCAAB, + 35800 - 11905: 0xDAB5, + 35801 - 11905: 0xDAB6, + 35802 - 11905: 0xB3CF, + 35803 - 11905: 0xD6EF, + 35804 - 11905: 0xDAB7, + 35805 - 11905: 0xBBB0, + 35806 - 11905: 0xB5AE, + 35807 - 11905: 0xDAB8, + 35808 - 11905: 0xDAB9, + 35809 - 11905: 0xB9EE, + 35810 - 11905: 0xD1AF, + 35811 - 11905: 0xD2E8, + 35812 - 11905: 0xDABA, + 35813 - 11905: 0xB8C3, + 35814 - 11905: 0xCFEA, + 35815 - 11905: 0xB2EF, + 35816 - 11905: 0xDABB, + 35817 - 11905: 0xDABC, + 35818 - 11905: 0xD79E, + 35819 - 11905: 0xBDEB, + 35820 - 11905: 0xCEDC, + 35821 - 11905: 0xD3EF, + 35822 - 11905: 0xDABD, + 35823 - 11905: 0xCEF3, + 35824 - 11905: 0xDABE, + 35825 - 11905: 0xD3D5, + 35826 - 11905: 0xBBE5, + 35827 - 11905: 0xDABF, + 35828 - 11905: 0xCBB5, + 35829 - 11905: 0xCBD0, + 35830 - 11905: 0xDAC0, + 35831 - 11905: 0xC7EB, + 35832 - 11905: 0xD6EE, + 35833 - 11905: 0xDAC1, + 35834 - 11905: 0xC5B5, + 35835 - 11905: 0xB6C1, + 35836 - 11905: 0xDAC2, + 35837 - 11905: 0xB7CC, + 35838 - 11905: 0xBFCE, + 35839 - 11905: 0xDAC3, + 35840 - 11905: 0xDAC4, + 35841 - 11905: 0xCBAD, + 35842 - 11905: 0xDAC5, + 35843 - 11905: 0xB5F7, + 35844 - 11905: 0xDAC6, + 35845 - 11905: 0xC1C2, + 35846 - 11905: 0xD7BB, + 35847 - 11905: 0xDAC7, + 35848 - 11905: 0xCCB8, + 35849 - 11905: 0xD79F, + 35850 - 11905: 0xD2EA, + 35851 - 11905: 0xC4B1, + 35852 - 11905: 0xDAC8, + 35853 - 11905: 0xB5FD, + 35854 - 11905: 0xBBD1, + 35855 - 11905: 0xDAC9, + 35856 - 11905: 0xD0B3, + 35857 - 11905: 0xDACA, + 35858 - 11905: 0xDACB, + 35859 - 11905: 0xCEBD, + 35860 - 11905: 0xDACC, + 35861 - 11905: 0xDACD, + 35862 - 11905: 0xDACE, + 35863 - 11905: 0xB2F7, + 35864 - 11905: 0xDAD1, + 35865 - 11905: 0xDACF, + 35866 - 11905: 0xD1E8, + 35867 - 11905: 0xDAD0, + 35868 - 11905: 0xC3D5, + 35869 - 11905: 0xDAD2, + 35870 - 11905: 0xD7A0, + 35871 - 11905: 0xDAD3, + 35872 - 11905: 0xDAD4, + 35873 - 11905: 0xDAD5, + 35874 - 11905: 0xD0BB, + 35875 - 11905: 0xD2A5, + 35876 - 11905: 0xB0F9, + 35877 - 11905: 0xDAD6, + 35878 - 11905: 0xC7AB, + 35879 - 11905: 0xDAD7, + 35880 - 11905: 0xBDF7, + 35881 - 11905: 0xC3A1, + 35882 - 11905: 0xDAD8, + 35883 - 11905: 0xDAD9, + 35884 - 11905: 0xC3FD, + 35885 - 11905: 0xCCB7, + 35886 - 11905: 0xDADA, + 35887 - 11905: 0xDADB, + 35888 - 11905: 0xC0BE, + 35889 - 11905: 0xC6D7, + 35890 - 11905: 0xDADC, + 35891 - 11905: 0xDADD, + 35892 - 11905: 0xC7B4, + 35893 - 11905: 0xDADE, + 35894 - 11905: 0xDADF, + 35895 - 11905: 0xB9C8, + 35896 - 11905: 0xD840, + 35897 - 11905: 0xD841, + 35898 - 11905: 0xD842, + 35899 - 11905: 0xD843, + 35900 - 11905: 0xD844, + 35901 - 11905: 0xD845, + 35902 - 11905: 0xD846, + 35903 - 11905: 0xD847, + 35904 - 11905: 0xD848, + 35905 - 11905: 0xBBED, + 35906 - 11905: 0xD849, + 35907 - 11905: 0xD84A, + 35908 - 11905: 0xD84B, + 35909 - 11905: 0xD84C, + 35910 - 11905: 0xB6B9, + 35911 - 11905: 0xF4F8, + 35912 - 11905: 0xD84D, + 35913 - 11905: 0xF4F9, + 35914 - 11905: 0xD84E, + 35915 - 11905: 0xD84F, + 35916 - 11905: 0xCDE3, + 35917 - 11905: 0xD850, + 35918 - 11905: 0xD851, + 35919 - 11905: 0xD852, + 35920 - 11905: 0xD853, + 35921 - 11905: 0xD854, + 35922 - 11905: 0xD855, + 35923 - 11905: 0xD856, + 35924 - 11905: 0xD857, + 35925 - 11905: 0xF5B9, + 35926 - 11905: 0xD858, + 35927 - 11905: 0xD859, + 35928 - 11905: 0xD85A, + 35929 - 11905: 0xD85B, + 35930 - 11905: 0xEBE0, + 35931 - 11905: 0xD85C, + 35932 - 11905: 0xD85D, + 35933 - 11905: 0xD85E, + 35934 - 11905: 0xD85F, + 35935 - 11905: 0xD860, + 35936 - 11905: 0xD861, + 35937 - 11905: 0xCFF3, + 35938 - 11905: 0xBBBF, + 35939 - 11905: 0xD862, + 35940 - 11905: 0xD863, + 35941 - 11905: 0xD864, + 35942 - 11905: 0xD865, + 35943 - 11905: 0xD866, + 35944 - 11905: 0xD867, + 35945 - 11905: 0xD868, + 35946 - 11905: 0xBAC0, + 35947 - 11905: 0xD4A5, + 35948 - 11905: 0xD869, + 35949 - 11905: 0xD86A, + 35950 - 11905: 0xD86B, + 35951 - 11905: 0xD86C, + 35952 - 11905: 0xD86D, + 35953 - 11905: 0xD86E, + 35954 - 11905: 0xD86F, + 35955 - 11905: 0xE1D9, + 35956 - 11905: 0xD870, + 35957 - 11905: 0xD871, + 35958 - 11905: 0xD872, + 35959 - 11905: 0xD873, + 35960 - 11905: 0xF5F4, + 35961 - 11905: 0xB1AA, + 35962 - 11905: 0xB2F2, + 35963 - 11905: 0xD874, + 35964 - 11905: 0xD875, + 35965 - 11905: 0xD876, + 35966 - 11905: 0xD877, + 35967 - 11905: 0xD878, + 35968 - 11905: 0xD879, + 35969 - 11905: 0xD87A, + 35970 - 11905: 0xF5F5, + 35971 - 11905: 0xD87B, + 35972 - 11905: 0xD87C, + 35973 - 11905: 0xF5F7, + 35974 - 11905: 0xD87D, + 35975 - 11905: 0xD87E, + 35976 - 11905: 0xD880, + 35977 - 11905: 0xBAD1, + 35978 - 11905: 0xF5F6, + 35979 - 11905: 0xD881, + 35980 - 11905: 0xC3B2, + 35981 - 11905: 0xD882, + 35982 - 11905: 0xD883, + 35983 - 11905: 0xD884, + 35984 - 11905: 0xD885, + 35985 - 11905: 0xD886, + 35986 - 11905: 0xD887, + 35987 - 11905: 0xD888, + 35988 - 11905: 0xF5F9, + 35989 - 11905: 0xD889, + 35990 - 11905: 0xD88A, + 35991 - 11905: 0xD88B, + 35992 - 11905: 0xF5F8, + 35993 - 11905: 0xD88C, + 35994 - 11905: 0xD88D, + 35995 - 11905: 0xD88E, + 35996 - 11905: 0xD88F, + 35997 - 11905: 0xD890, + 35998 - 11905: 0xD891, + 35999 - 11905: 0xD892, + 36000 - 11905: 0xD893, + 36001 - 11905: 0xD894, + 36002 - 11905: 0xD895, + 36003 - 11905: 0xD896, + 36004 - 11905: 0xD897, + 36005 - 11905: 0xD898, + 36006 - 11905: 0xD899, + 36007 - 11905: 0xD89A, + 36008 - 11905: 0xD89B, + 36009 - 11905: 0xD89C, + 36010 - 11905: 0xD89D, + 36011 - 11905: 0xD89E, + 36012 - 11905: 0xD89F, + 36013 - 11905: 0xD8A0, + 36014 - 11905: 0xD940, + 36015 - 11905: 0xD941, + 36016 - 11905: 0xD942, + 36017 - 11905: 0xD943, + 36018 - 11905: 0xD944, + 36019 - 11905: 0xD945, + 36020 - 11905: 0xD946, + 36021 - 11905: 0xD947, + 36022 - 11905: 0xD948, + 36023 - 11905: 0xD949, + 36024 - 11905: 0xD94A, + 36025 - 11905: 0xD94B, + 36026 - 11905: 0xD94C, + 36027 - 11905: 0xD94D, + 36028 - 11905: 0xD94E, + 36029 - 11905: 0xD94F, + 36030 - 11905: 0xD950, + 36031 - 11905: 0xD951, + 36032 - 11905: 0xD952, + 36033 - 11905: 0xD953, + 36034 - 11905: 0xD954, + 36035 - 11905: 0xD955, + 36036 - 11905: 0xD956, + 36037 - 11905: 0xD957, + 36038 - 11905: 0xD958, + 36039 - 11905: 0xD959, + 36040 - 11905: 0xD95A, + 36041 - 11905: 0xD95B, + 36042 - 11905: 0xD95C, + 36043 - 11905: 0xD95D, + 36044 - 11905: 0xD95E, + 36045 - 11905: 0xD95F, + 36046 - 11905: 0xD960, + 36047 - 11905: 0xD961, + 36048 - 11905: 0xD962, + 36049 - 11905: 0xD963, + 36050 - 11905: 0xD964, + 36051 - 11905: 0xD965, + 36052 - 11905: 0xD966, + 36053 - 11905: 0xD967, + 36054 - 11905: 0xD968, + 36055 - 11905: 0xD969, + 36056 - 11905: 0xD96A, + 36057 - 11905: 0xD96B, + 36058 - 11905: 0xD96C, + 36059 - 11905: 0xD96D, + 36060 - 11905: 0xD96E, + 36061 - 11905: 0xD96F, + 36062 - 11905: 0xD970, + 36063 - 11905: 0xD971, + 36064 - 11905: 0xD972, + 36065 - 11905: 0xD973, + 36066 - 11905: 0xD974, + 36067 - 11905: 0xD975, + 36068 - 11905: 0xD976, + 36069 - 11905: 0xD977, + 36070 - 11905: 0xD978, + 36071 - 11905: 0xD979, + 36072 - 11905: 0xD97A, + 36073 - 11905: 0xD97B, + 36074 - 11905: 0xD97C, + 36075 - 11905: 0xD97D, + 36076 - 11905: 0xD97E, + 36077 - 11905: 0xD980, + 36078 - 11905: 0xD981, + 36079 - 11905: 0xD982, + 36080 - 11905: 0xD983, + 36081 - 11905: 0xD984, + 36082 - 11905: 0xD985, + 36083 - 11905: 0xD986, + 36084 - 11905: 0xD987, + 36085 - 11905: 0xD988, + 36086 - 11905: 0xD989, + 36087 - 11905: 0xD98A, + 36088 - 11905: 0xD98B, + 36089 - 11905: 0xD98C, + 36090 - 11905: 0xD98D, + 36091 - 11905: 0xD98E, + 36092 - 11905: 0xD98F, + 36093 - 11905: 0xD990, + 36094 - 11905: 0xD991, + 36095 - 11905: 0xD992, + 36096 - 11905: 0xD993, + 36097 - 11905: 0xD994, + 36098 - 11905: 0xD995, + 36099 - 11905: 0xD996, + 36100 - 11905: 0xD997, + 36101 - 11905: 0xD998, + 36102 - 11905: 0xD999, + 36103 - 11905: 0xD99A, + 36104 - 11905: 0xD99B, + 36105 - 11905: 0xD99C, + 36106 - 11905: 0xD99D, + 36107 - 11905: 0xD99E, + 36108 - 11905: 0xD99F, + 36109 - 11905: 0xD9A0, + 36110 - 11905: 0xDA40, + 36111 - 11905: 0xDA41, + 36112 - 11905: 0xDA42, + 36113 - 11905: 0xDA43, + 36114 - 11905: 0xDA44, + 36115 - 11905: 0xDA45, + 36116 - 11905: 0xDA46, + 36117 - 11905: 0xDA47, + 36118 - 11905: 0xDA48, + 36119 - 11905: 0xDA49, + 36120 - 11905: 0xDA4A, + 36121 - 11905: 0xDA4B, + 36122 - 11905: 0xDA4C, + 36123 - 11905: 0xDA4D, + 36124 - 11905: 0xDA4E, + 36125 - 11905: 0xB1B4, + 36126 - 11905: 0xD5EA, + 36127 - 11905: 0xB8BA, + 36128 - 11905: 0xDA4F, + 36129 - 11905: 0xB9B1, + 36130 - 11905: 0xB2C6, + 36131 - 11905: 0xD4F0, + 36132 - 11905: 0xCFCD, + 36133 - 11905: 0xB0DC, + 36134 - 11905: 0xD5CB, + 36135 - 11905: 0xBBF5, + 36136 - 11905: 0xD6CA, + 36137 - 11905: 0xB7B7, + 36138 - 11905: 0xCCB0, + 36139 - 11905: 0xC6B6, + 36140 - 11905: 0xB1E1, + 36141 - 11905: 0xB9BA, + 36142 - 11905: 0xD6FC, + 36143 - 11905: 0xB9E1, + 36144 - 11905: 0xB7A1, + 36145 - 11905: 0xBCFA, + 36146 - 11905: 0xEADA, + 36147 - 11905: 0xEADB, + 36148 - 11905: 0xCCF9, + 36149 - 11905: 0xB9F3, + 36150 - 11905: 0xEADC, + 36151 - 11905: 0xB4FB, + 36152 - 11905: 0xC3B3, + 36153 - 11905: 0xB7D1, + 36154 - 11905: 0xBAD8, + 36155 - 11905: 0xEADD, + 36156 - 11905: 0xD4F4, + 36157 - 11905: 0xEADE, + 36158 - 11905: 0xBCD6, + 36159 - 11905: 0xBBDF, + 36160 - 11905: 0xEADF, + 36161 - 11905: 0xC1DE, + 36162 - 11905: 0xC2B8, + 36163 - 11905: 0xD4DF, + 36164 - 11905: 0xD7CA, + 36165 - 11905: 0xEAE0, + 36166 - 11905: 0xEAE1, + 36167 - 11905: 0xEAE4, + 36168 - 11905: 0xEAE2, + 36169 - 11905: 0xEAE3, + 36170 - 11905: 0xC9DE, + 36171 - 11905: 0xB8B3, + 36172 - 11905: 0xB6C4, + 36173 - 11905: 0xEAE5, + 36174 - 11905: 0xCAEA, + 36175 - 11905: 0xC9CD, + 36176 - 11905: 0xB4CD, + 36177 - 11905: 0xDA50, + 36178 - 11905: 0xDA51, + 36179 - 11905: 0xE2D9, + 36180 - 11905: 0xC5E2, + 36181 - 11905: 0xEAE6, + 36182 - 11905: 0xC0B5, + 36183 - 11905: 0xDA52, + 36184 - 11905: 0xD7B8, + 36185 - 11905: 0xEAE7, + 36186 - 11905: 0xD7AC, + 36187 - 11905: 0xC8FC, + 36188 - 11905: 0xD8D3, + 36189 - 11905: 0xD8CD, + 36190 - 11905: 0xD4DE, + 36191 - 11905: 0xDA53, + 36192 - 11905: 0xD4F9, + 36193 - 11905: 0xC9C4, + 36194 - 11905: 0xD3AE, + 36195 - 11905: 0xB8D3, + 36196 - 11905: 0xB3E0, + 36197 - 11905: 0xDA54, + 36198 - 11905: 0xC9E2, + 36199 - 11905: 0xF4F6, + 36200 - 11905: 0xDA55, + 36201 - 11905: 0xDA56, + 36202 - 11905: 0xDA57, + 36203 - 11905: 0xBAD5, + 36204 - 11905: 0xDA58, + 36205 - 11905: 0xF4F7, + 36206 - 11905: 0xDA59, + 36207 - 11905: 0xDA5A, + 36208 - 11905: 0xD7DF, + 36209 - 11905: 0xDA5B, + 36210 - 11905: 0xDA5C, + 36211 - 11905: 0xF4F1, + 36212 - 11905: 0xB8B0, + 36213 - 11905: 0xD5D4, + 36214 - 11905: 0xB8CF, + 36215 - 11905: 0xC6F0, + 36216 - 11905: 0xDA5D, + 36217 - 11905: 0xDA5E, + 36218 - 11905: 0xDA5F, + 36219 - 11905: 0xDA60, + 36220 - 11905: 0xDA61, + 36221 - 11905: 0xDA62, + 36222 - 11905: 0xDA63, + 36223 - 11905: 0xDA64, + 36224 - 11905: 0xDA65, + 36225 - 11905: 0xB3C3, + 36226 - 11905: 0xDA66, + 36227 - 11905: 0xDA67, + 36228 - 11905: 0xF4F2, + 36229 - 11905: 0xB3AC, + 36230 - 11905: 0xDA68, + 36231 - 11905: 0xDA69, + 36232 - 11905: 0xDA6A, + 36233 - 11905: 0xDA6B, + 36234 - 11905: 0xD4BD, + 36235 - 11905: 0xC7F7, + 36236 - 11905: 0xDA6C, + 36237 - 11905: 0xDA6D, + 36238 - 11905: 0xDA6E, + 36239 - 11905: 0xDA6F, + 36240 - 11905: 0xDA70, + 36241 - 11905: 0xF4F4, + 36242 - 11905: 0xDA71, + 36243 - 11905: 0xDA72, + 36244 - 11905: 0xF4F3, + 36245 - 11905: 0xDA73, + 36246 - 11905: 0xDA74, + 36247 - 11905: 0xDA75, + 36248 - 11905: 0xDA76, + 36249 - 11905: 0xDA77, + 36250 - 11905: 0xDA78, + 36251 - 11905: 0xDA79, + 36252 - 11905: 0xDA7A, + 36253 - 11905: 0xDA7B, + 36254 - 11905: 0xDA7C, + 36255 - 11905: 0xCCCB, + 36256 - 11905: 0xDA7D, + 36257 - 11905: 0xDA7E, + 36258 - 11905: 0xDA80, + 36259 - 11905: 0xC8A4, + 36260 - 11905: 0xDA81, + 36261 - 11905: 0xDA82, + 36262 - 11905: 0xDA83, + 36263 - 11905: 0xDA84, + 36264 - 11905: 0xDA85, + 36265 - 11905: 0xDA86, + 36266 - 11905: 0xDA87, + 36267 - 11905: 0xDA88, + 36268 - 11905: 0xDA89, + 36269 - 11905: 0xDA8A, + 36270 - 11905: 0xDA8B, + 36271 - 11905: 0xDA8C, + 36272 - 11905: 0xDA8D, + 36273 - 11905: 0xF4F5, + 36274 - 11905: 0xDA8E, + 36275 - 11905: 0xD7E3, + 36276 - 11905: 0xC5BF, + 36277 - 11905: 0xF5C0, + 36278 - 11905: 0xDA8F, + 36279 - 11905: 0xDA90, + 36280 - 11905: 0xF5BB, + 36281 - 11905: 0xDA91, + 36282 - 11905: 0xF5C3, + 36283 - 11905: 0xDA92, + 36284 - 11905: 0xF5C2, + 36285 - 11905: 0xDA93, + 36286 - 11905: 0xD6BA, + 36287 - 11905: 0xF5C1, + 36288 - 11905: 0xDA94, + 36289 - 11905: 0xDA95, + 36290 - 11905: 0xDA96, + 36291 - 11905: 0xD4BE, + 36292 - 11905: 0xF5C4, + 36293 - 11905: 0xDA97, + 36294 - 11905: 0xF5CC, + 36295 - 11905: 0xDA98, + 36296 - 11905: 0xDA99, + 36297 - 11905: 0xDA9A, + 36298 - 11905: 0xDA9B, + 36299 - 11905: 0xB0CF, + 36300 - 11905: 0xB5F8, + 36301 - 11905: 0xDA9C, + 36302 - 11905: 0xF5C9, + 36303 - 11905: 0xF5CA, + 36304 - 11905: 0xDA9D, + 36305 - 11905: 0xC5DC, + 36306 - 11905: 0xDA9E, + 36307 - 11905: 0xDA9F, + 36308 - 11905: 0xDAA0, + 36309 - 11905: 0xDB40, + 36310 - 11905: 0xF5C5, + 36311 - 11905: 0xF5C6, + 36312 - 11905: 0xDB41, + 36313 - 11905: 0xDB42, + 36314 - 11905: 0xF5C7, + 36315 - 11905: 0xF5CB, + 36316 - 11905: 0xDB43, + 36317 - 11905: 0xBEE0, + 36318 - 11905: 0xF5C8, + 36319 - 11905: 0xB8FA, + 36320 - 11905: 0xDB44, + 36321 - 11905: 0xDB45, + 36322 - 11905: 0xDB46, + 36323 - 11905: 0xF5D0, + 36324 - 11905: 0xF5D3, + 36325 - 11905: 0xDB47, + 36326 - 11905: 0xDB48, + 36327 - 11905: 0xDB49, + 36328 - 11905: 0xBFE7, + 36329 - 11905: 0xDB4A, + 36330 - 11905: 0xB9F2, + 36331 - 11905: 0xF5BC, + 36332 - 11905: 0xF5CD, + 36333 - 11905: 0xDB4B, + 36334 - 11905: 0xDB4C, + 36335 - 11905: 0xC2B7, + 36336 - 11905: 0xDB4D, + 36337 - 11905: 0xDB4E, + 36338 - 11905: 0xDB4F, + 36339 - 11905: 0xCCF8, + 36340 - 11905: 0xDB50, + 36341 - 11905: 0xBCF9, + 36342 - 11905: 0xDB51, + 36343 - 11905: 0xF5CE, + 36344 - 11905: 0xF5CF, + 36345 - 11905: 0xF5D1, + 36346 - 11905: 0xB6E5, + 36347 - 11905: 0xF5D2, + 36348 - 11905: 0xDB52, + 36349 - 11905: 0xF5D5, + 36350 - 11905: 0xDB53, + 36351 - 11905: 0xDB54, + 36352 - 11905: 0xDB55, + 36353 - 11905: 0xDB56, + 36354 - 11905: 0xDB57, + 36355 - 11905: 0xDB58, + 36356 - 11905: 0xDB59, + 36357 - 11905: 0xF5BD, + 36358 - 11905: 0xDB5A, + 36359 - 11905: 0xDB5B, + 36360 - 11905: 0xDB5C, + 36361 - 11905: 0xF5D4, + 36362 - 11905: 0xD3BB, + 36363 - 11905: 0xDB5D, + 36364 - 11905: 0xB3EC, + 36365 - 11905: 0xDB5E, + 36366 - 11905: 0xDB5F, + 36367 - 11905: 0xCCA4, + 36368 - 11905: 0xDB60, + 36369 - 11905: 0xDB61, + 36370 - 11905: 0xDB62, + 36371 - 11905: 0xDB63, + 36372 - 11905: 0xF5D6, + 36373 - 11905: 0xDB64, + 36374 - 11905: 0xDB65, + 36375 - 11905: 0xDB66, + 36376 - 11905: 0xDB67, + 36377 - 11905: 0xDB68, + 36378 - 11905: 0xDB69, + 36379 - 11905: 0xDB6A, + 36380 - 11905: 0xDB6B, + 36381 - 11905: 0xF5D7, + 36382 - 11905: 0xBEE1, + 36383 - 11905: 0xF5D8, + 36384 - 11905: 0xDB6C, + 36385 - 11905: 0xDB6D, + 36386 - 11905: 0xCCDF, + 36387 - 11905: 0xF5DB, + 36388 - 11905: 0xDB6E, + 36389 - 11905: 0xDB6F, + 36390 - 11905: 0xDB70, + 36391 - 11905: 0xDB71, + 36392 - 11905: 0xDB72, + 36393 - 11905: 0xB2C8, + 36394 - 11905: 0xD7D9, + 36395 - 11905: 0xDB73, + 36396 - 11905: 0xF5D9, + 36397 - 11905: 0xDB74, + 36398 - 11905: 0xF5DA, + 36399 - 11905: 0xF5DC, + 36400 - 11905: 0xDB75, + 36401 - 11905: 0xF5E2, + 36402 - 11905: 0xDB76, + 36403 - 11905: 0xDB77, + 36404 - 11905: 0xDB78, + 36405 - 11905: 0xF5E0, + 36406 - 11905: 0xDB79, + 36407 - 11905: 0xDB7A, + 36408 - 11905: 0xDB7B, + 36409 - 11905: 0xF5DF, + 36410 - 11905: 0xF5DD, + 36411 - 11905: 0xDB7C, + 36412 - 11905: 0xDB7D, + 36413 - 11905: 0xF5E1, + 36414 - 11905: 0xDB7E, + 36415 - 11905: 0xDB80, + 36416 - 11905: 0xF5DE, + 36417 - 11905: 0xF5E4, + 36418 - 11905: 0xF5E5, + 36419 - 11905: 0xDB81, + 36420 - 11905: 0xCCE3, + 36421 - 11905: 0xDB82, + 36422 - 11905: 0xDB83, + 36423 - 11905: 0xE5BF, + 36424 - 11905: 0xB5B8, + 36425 - 11905: 0xF5E3, + 36426 - 11905: 0xF5E8, + 36427 - 11905: 0xCCA3, + 36428 - 11905: 0xDB84, + 36429 - 11905: 0xDB85, + 36430 - 11905: 0xDB86, + 36431 - 11905: 0xDB87, + 36432 - 11905: 0xDB88, + 36433 - 11905: 0xF5E6, + 36434 - 11905: 0xF5E7, + 36435 - 11905: 0xDB89, + 36436 - 11905: 0xDB8A, + 36437 - 11905: 0xDB8B, + 36438 - 11905: 0xDB8C, + 36439 - 11905: 0xDB8D, + 36440 - 11905: 0xDB8E, + 36441 - 11905: 0xF5BE, + 36442 - 11905: 0xDB8F, + 36443 - 11905: 0xDB90, + 36444 - 11905: 0xDB91, + 36445 - 11905: 0xDB92, + 36446 - 11905: 0xDB93, + 36447 - 11905: 0xDB94, + 36448 - 11905: 0xDB95, + 36449 - 11905: 0xDB96, + 36450 - 11905: 0xDB97, + 36451 - 11905: 0xDB98, + 36452 - 11905: 0xDB99, + 36453 - 11905: 0xDB9A, + 36454 - 11905: 0xB1C4, + 36455 - 11905: 0xDB9B, + 36456 - 11905: 0xDB9C, + 36457 - 11905: 0xF5BF, + 36458 - 11905: 0xDB9D, + 36459 - 11905: 0xDB9E, + 36460 - 11905: 0xB5C5, + 36461 - 11905: 0xB2E4, + 36462 - 11905: 0xDB9F, + 36463 - 11905: 0xF5EC, + 36464 - 11905: 0xF5E9, + 36465 - 11905: 0xDBA0, + 36466 - 11905: 0xB6D7, + 36467 - 11905: 0xDC40, + 36468 - 11905: 0xF5ED, + 36469 - 11905: 0xDC41, + 36470 - 11905: 0xF5EA, + 36471 - 11905: 0xDC42, + 36472 - 11905: 0xDC43, + 36473 - 11905: 0xDC44, + 36474 - 11905: 0xDC45, + 36475 - 11905: 0xDC46, + 36476 - 11905: 0xF5EB, + 36477 - 11905: 0xDC47, + 36478 - 11905: 0xDC48, + 36479 - 11905: 0xB4DA, + 36480 - 11905: 0xDC49, + 36481 - 11905: 0xD4EA, + 36482 - 11905: 0xDC4A, + 36483 - 11905: 0xDC4B, + 36484 - 11905: 0xDC4C, + 36485 - 11905: 0xF5EE, + 36486 - 11905: 0xDC4D, + 36487 - 11905: 0xB3F9, + 36488 - 11905: 0xDC4E, + 36489 - 11905: 0xDC4F, + 36490 - 11905: 0xDC50, + 36491 - 11905: 0xDC51, + 36492 - 11905: 0xDC52, + 36493 - 11905: 0xDC53, + 36494 - 11905: 0xDC54, + 36495 - 11905: 0xF5EF, + 36496 - 11905: 0xF5F1, + 36497 - 11905: 0xDC55, + 36498 - 11905: 0xDC56, + 36499 - 11905: 0xDC57, + 36500 - 11905: 0xF5F0, + 36501 - 11905: 0xDC58, + 36502 - 11905: 0xDC59, + 36503 - 11905: 0xDC5A, + 36504 - 11905: 0xDC5B, + 36505 - 11905: 0xDC5C, + 36506 - 11905: 0xDC5D, + 36507 - 11905: 0xDC5E, + 36508 - 11905: 0xF5F2, + 36509 - 11905: 0xDC5F, + 36510 - 11905: 0xF5F3, + 36511 - 11905: 0xDC60, + 36512 - 11905: 0xDC61, + 36513 - 11905: 0xDC62, + 36514 - 11905: 0xDC63, + 36515 - 11905: 0xDC64, + 36516 - 11905: 0xDC65, + 36517 - 11905: 0xDC66, + 36518 - 11905: 0xDC67, + 36519 - 11905: 0xDC68, + 36520 - 11905: 0xDC69, + 36521 - 11905: 0xDC6A, + 36522 - 11905: 0xDC6B, + 36523 - 11905: 0xC9ED, + 36524 - 11905: 0xB9AA, + 36525 - 11905: 0xDC6C, + 36526 - 11905: 0xDC6D, + 36527 - 11905: 0xC7FB, + 36528 - 11905: 0xDC6E, + 36529 - 11905: 0xDC6F, + 36530 - 11905: 0xB6E3, + 36531 - 11905: 0xDC70, + 36532 - 11905: 0xDC71, + 36533 - 11905: 0xDC72, + 36534 - 11905: 0xDC73, + 36535 - 11905: 0xDC74, + 36536 - 11905: 0xDC75, + 36537 - 11905: 0xDC76, + 36538 - 11905: 0xCCC9, + 36539 - 11905: 0xDC77, + 36540 - 11905: 0xDC78, + 36541 - 11905: 0xDC79, + 36542 - 11905: 0xDC7A, + 36543 - 11905: 0xDC7B, + 36544 - 11905: 0xDC7C, + 36545 - 11905: 0xDC7D, + 36546 - 11905: 0xDC7E, + 36547 - 11905: 0xDC80, + 36548 - 11905: 0xDC81, + 36549 - 11905: 0xDC82, + 36550 - 11905: 0xDC83, + 36551 - 11905: 0xDC84, + 36552 - 11905: 0xDC85, + 36553 - 11905: 0xDC86, + 36554 - 11905: 0xDC87, + 36555 - 11905: 0xDC88, + 36556 - 11905: 0xDC89, + 36557 - 11905: 0xDC8A, + 36558 - 11905: 0xEAA6, + 36559 - 11905: 0xDC8B, + 36560 - 11905: 0xDC8C, + 36561 - 11905: 0xDC8D, + 36562 - 11905: 0xDC8E, + 36563 - 11905: 0xDC8F, + 36564 - 11905: 0xDC90, + 36565 - 11905: 0xDC91, + 36566 - 11905: 0xDC92, + 36567 - 11905: 0xDC93, + 36568 - 11905: 0xDC94, + 36569 - 11905: 0xDC95, + 36570 - 11905: 0xDC96, + 36571 - 11905: 0xDC97, + 36572 - 11905: 0xDC98, + 36573 - 11905: 0xDC99, + 36574 - 11905: 0xDC9A, + 36575 - 11905: 0xDC9B, + 36576 - 11905: 0xDC9C, + 36577 - 11905: 0xDC9D, + 36578 - 11905: 0xDC9E, + 36579 - 11905: 0xDC9F, + 36580 - 11905: 0xDCA0, + 36581 - 11905: 0xDD40, + 36582 - 11905: 0xDD41, + 36583 - 11905: 0xDD42, + 36584 - 11905: 0xDD43, + 36585 - 11905: 0xDD44, + 36586 - 11905: 0xDD45, + 36587 - 11905: 0xDD46, + 36588 - 11905: 0xDD47, + 36589 - 11905: 0xDD48, + 36590 - 11905: 0xDD49, + 36591 - 11905: 0xDD4A, + 36592 - 11905: 0xDD4B, + 36593 - 11905: 0xDD4C, + 36594 - 11905: 0xDD4D, + 36595 - 11905: 0xDD4E, + 36596 - 11905: 0xDD4F, + 36597 - 11905: 0xDD50, + 36598 - 11905: 0xDD51, + 36599 - 11905: 0xDD52, + 36600 - 11905: 0xDD53, + 36601 - 11905: 0xDD54, + 36602 - 11905: 0xDD55, + 36603 - 11905: 0xDD56, + 36604 - 11905: 0xDD57, + 36605 - 11905: 0xDD58, + 36606 - 11905: 0xDD59, + 36607 - 11905: 0xDD5A, + 36608 - 11905: 0xDD5B, + 36609 - 11905: 0xDD5C, + 36610 - 11905: 0xDD5D, + 36611 - 11905: 0xDD5E, + 36612 - 11905: 0xDD5F, + 36613 - 11905: 0xDD60, + 36614 - 11905: 0xDD61, + 36615 - 11905: 0xDD62, + 36616 - 11905: 0xDD63, + 36617 - 11905: 0xDD64, + 36618 - 11905: 0xDD65, + 36619 - 11905: 0xDD66, + 36620 - 11905: 0xDD67, + 36621 - 11905: 0xDD68, + 36622 - 11905: 0xDD69, + 36623 - 11905: 0xDD6A, + 36624 - 11905: 0xDD6B, + 36625 - 11905: 0xDD6C, + 36626 - 11905: 0xDD6D, + 36627 - 11905: 0xDD6E, + 36628 - 11905: 0xDD6F, + 36629 - 11905: 0xDD70, + 36630 - 11905: 0xDD71, + 36631 - 11905: 0xDD72, + 36632 - 11905: 0xDD73, + 36633 - 11905: 0xDD74, + 36634 - 11905: 0xDD75, + 36635 - 11905: 0xDD76, + 36636 - 11905: 0xDD77, + 36637 - 11905: 0xDD78, + 36638 - 11905: 0xDD79, + 36639 - 11905: 0xDD7A, + 36640 - 11905: 0xDD7B, + 36641 - 11905: 0xDD7C, + 36642 - 11905: 0xDD7D, + 36643 - 11905: 0xDD7E, + 36644 - 11905: 0xDD80, + 36645 - 11905: 0xDD81, + 36646 - 11905: 0xDD82, + 36647 - 11905: 0xDD83, + 36648 - 11905: 0xDD84, + 36649 - 11905: 0xDD85, + 36650 - 11905: 0xDD86, + 36651 - 11905: 0xDD87, + 36652 - 11905: 0xDD88, + 36653 - 11905: 0xDD89, + 36654 - 11905: 0xDD8A, + 36655 - 11905: 0xDD8B, + 36656 - 11905: 0xDD8C, + 36657 - 11905: 0xDD8D, + 36658 - 11905: 0xDD8E, + 36659 - 11905: 0xDD8F, + 36660 - 11905: 0xDD90, + 36661 - 11905: 0xDD91, + 36662 - 11905: 0xDD92, + 36663 - 11905: 0xDD93, + 36664 - 11905: 0xDD94, + 36665 - 11905: 0xDD95, + 36666 - 11905: 0xDD96, + 36667 - 11905: 0xDD97, + 36668 - 11905: 0xDD98, + 36669 - 11905: 0xDD99, + 36670 - 11905: 0xDD9A, + 36671 - 11905: 0xDD9B, + 36672 - 11905: 0xDD9C, + 36673 - 11905: 0xDD9D, + 36674 - 11905: 0xDD9E, + 36675 - 11905: 0xDD9F, + 36676 - 11905: 0xDDA0, + 36677 - 11905: 0xDE40, + 36678 - 11905: 0xDE41, + 36679 - 11905: 0xDE42, + 36680 - 11905: 0xDE43, + 36681 - 11905: 0xDE44, + 36682 - 11905: 0xDE45, + 36683 - 11905: 0xDE46, + 36684 - 11905: 0xDE47, + 36685 - 11905: 0xDE48, + 36686 - 11905: 0xDE49, + 36687 - 11905: 0xDE4A, + 36688 - 11905: 0xDE4B, + 36689 - 11905: 0xDE4C, + 36690 - 11905: 0xDE4D, + 36691 - 11905: 0xDE4E, + 36692 - 11905: 0xDE4F, + 36693 - 11905: 0xDE50, + 36694 - 11905: 0xDE51, + 36695 - 11905: 0xDE52, + 36696 - 11905: 0xDE53, + 36697 - 11905: 0xDE54, + 36698 - 11905: 0xDE55, + 36699 - 11905: 0xDE56, + 36700 - 11905: 0xDE57, + 36701 - 11905: 0xDE58, + 36702 - 11905: 0xDE59, + 36703 - 11905: 0xDE5A, + 36704 - 11905: 0xDE5B, + 36705 - 11905: 0xDE5C, + 36706 - 11905: 0xDE5D, + 36707 - 11905: 0xDE5E, + 36708 - 11905: 0xDE5F, + 36709 - 11905: 0xDE60, + 36710 - 11905: 0xB3B5, + 36711 - 11905: 0xD4FE, + 36712 - 11905: 0xB9EC, + 36713 - 11905: 0xD0F9, + 36714 - 11905: 0xDE61, + 36715 - 11905: 0xE9ED, + 36716 - 11905: 0xD7AA, + 36717 - 11905: 0xE9EE, + 36718 - 11905: 0xC2D6, + 36719 - 11905: 0xC8ED, + 36720 - 11905: 0xBAE4, + 36721 - 11905: 0xE9EF, + 36722 - 11905: 0xE9F0, + 36723 - 11905: 0xE9F1, + 36724 - 11905: 0xD6E1, + 36725 - 11905: 0xE9F2, + 36726 - 11905: 0xE9F3, + 36727 - 11905: 0xE9F5, + 36728 - 11905: 0xE9F4, + 36729 - 11905: 0xE9F6, + 36730 - 11905: 0xE9F7, + 36731 - 11905: 0xC7E1, + 36732 - 11905: 0xE9F8, + 36733 - 11905: 0xD4D8, + 36734 - 11905: 0xE9F9, + 36735 - 11905: 0xBDCE, + 36736 - 11905: 0xDE62, + 36737 - 11905: 0xE9FA, + 36738 - 11905: 0xE9FB, + 36739 - 11905: 0xBDCF, + 36740 - 11905: 0xE9FC, + 36741 - 11905: 0xB8A8, + 36742 - 11905: 0xC1BE, + 36743 - 11905: 0xE9FD, + 36744 - 11905: 0xB1B2, + 36745 - 11905: 0xBBD4, + 36746 - 11905: 0xB9F5, + 36747 - 11905: 0xE9FE, + 36748 - 11905: 0xDE63, + 36749 - 11905: 0xEAA1, + 36750 - 11905: 0xEAA2, + 36751 - 11905: 0xEAA3, + 36752 - 11905: 0xB7F8, + 36753 - 11905: 0xBCAD, + 36754 - 11905: 0xDE64, + 36755 - 11905: 0xCAE4, + 36756 - 11905: 0xE0CE, + 36757 - 11905: 0xD4AF, + 36758 - 11905: 0xCFBD, + 36759 - 11905: 0xD5B7, + 36760 - 11905: 0xEAA4, + 36761 - 11905: 0xD5DE, + 36762 - 11905: 0xEAA5, + 36763 - 11905: 0xD0C1, + 36764 - 11905: 0xB9BC, + 36765 - 11905: 0xDE65, + 36766 - 11905: 0xB4C7, + 36767 - 11905: 0xB1D9, + 36768 - 11905: 0xDE66, + 36769 - 11905: 0xDE67, + 36770 - 11905: 0xDE68, + 36771 - 11905: 0xC0B1, + 36772 - 11905: 0xDE69, + 36773 - 11905: 0xDE6A, + 36774 - 11905: 0xDE6B, + 36775 - 11905: 0xDE6C, + 36776 - 11905: 0xB1E6, + 36777 - 11905: 0xB1E7, + 36778 - 11905: 0xDE6D, + 36779 - 11905: 0xB1E8, + 36780 - 11905: 0xDE6E, + 36781 - 11905: 0xDE6F, + 36782 - 11905: 0xDE70, + 36783 - 11905: 0xDE71, + 36784 - 11905: 0xB3BD, + 36785 - 11905: 0xC8E8, + 36786 - 11905: 0xDE72, + 36787 - 11905: 0xDE73, + 36788 - 11905: 0xDE74, + 36789 - 11905: 0xDE75, + 36790 - 11905: 0xE5C1, + 36791 - 11905: 0xDE76, + 36792 - 11905: 0xDE77, + 36793 - 11905: 0xB1DF, + 36794 - 11905: 0xDE78, + 36795 - 11905: 0xDE79, + 36796 - 11905: 0xDE7A, + 36797 - 11905: 0xC1C9, + 36798 - 11905: 0xB4EF, + 36799 - 11905: 0xDE7B, + 36800 - 11905: 0xDE7C, + 36801 - 11905: 0xC7A8, + 36802 - 11905: 0xD3D8, + 36803 - 11905: 0xDE7D, + 36804 - 11905: 0xC6F9, + 36805 - 11905: 0xD1B8, + 36806 - 11905: 0xDE7E, + 36807 - 11905: 0xB9FD, + 36808 - 11905: 0xC2F5, + 36809 - 11905: 0xDE80, + 36810 - 11905: 0xDE81, + 36811 - 11905: 0xDE82, + 36812 - 11905: 0xDE83, + 36813 - 11905: 0xDE84, + 36814 - 11905: 0xD3AD, + 36815 - 11905: 0xDE85, + 36816 - 11905: 0xD4CB, + 36817 - 11905: 0xBDFC, + 36818 - 11905: 0xDE86, + 36819 - 11905: 0xE5C2, + 36820 - 11905: 0xB7B5, + 36821 - 11905: 0xE5C3, + 36822 - 11905: 0xDE87, + 36823 - 11905: 0xDE88, + 36824 - 11905: 0xBBB9, + 36825 - 11905: 0xD5E2, + 36826 - 11905: 0xDE89, + 36827 - 11905: 0xBDF8, + 36828 - 11905: 0xD4B6, + 36829 - 11905: 0xCEA5, + 36830 - 11905: 0xC1AC, + 36831 - 11905: 0xB3D9, + 36832 - 11905: 0xDE8A, + 36833 - 11905: 0xDE8B, + 36834 - 11905: 0xCCF6, + 36835 - 11905: 0xDE8C, + 36836 - 11905: 0xE5C6, + 36837 - 11905: 0xE5C4, + 36838 - 11905: 0xE5C8, + 36839 - 11905: 0xDE8D, + 36840 - 11905: 0xE5CA, + 36841 - 11905: 0xE5C7, + 36842 - 11905: 0xB5CF, + 36843 - 11905: 0xC6C8, + 36844 - 11905: 0xDE8E, + 36845 - 11905: 0xB5FC, + 36846 - 11905: 0xE5C5, + 36847 - 11905: 0xDE8F, + 36848 - 11905: 0xCAF6, + 36849 - 11905: 0xDE90, + 36850 - 11905: 0xDE91, + 36851 - 11905: 0xE5C9, + 36852 - 11905: 0xDE92, + 36853 - 11905: 0xDE93, + 36854 - 11905: 0xDE94, + 36855 - 11905: 0xC3D4, + 36856 - 11905: 0xB1C5, + 36857 - 11905: 0xBCA3, + 36858 - 11905: 0xDE95, + 36859 - 11905: 0xDE96, + 36860 - 11905: 0xDE97, + 36861 - 11905: 0xD7B7, + 36862 - 11905: 0xDE98, + 36863 - 11905: 0xDE99, + 36864 - 11905: 0xCDCB, + 36865 - 11905: 0xCBCD, + 36866 - 11905: 0xCACA, + 36867 - 11905: 0xCCD3, + 36868 - 11905: 0xE5CC, + 36869 - 11905: 0xE5CB, + 36870 - 11905: 0xC4E6, + 36871 - 11905: 0xDE9A, + 36872 - 11905: 0xDE9B, + 36873 - 11905: 0xD1A1, + 36874 - 11905: 0xD1B7, + 36875 - 11905: 0xE5CD, + 36876 - 11905: 0xDE9C, + 36877 - 11905: 0xE5D0, + 36878 - 11905: 0xDE9D, + 36879 - 11905: 0xCDB8, + 36880 - 11905: 0xD6F0, + 36881 - 11905: 0xE5CF, + 36882 - 11905: 0xB5DD, + 36883 - 11905: 0xDE9E, + 36884 - 11905: 0xCDBE, + 36885 - 11905: 0xDE9F, + 36886 - 11905: 0xE5D1, + 36887 - 11905: 0xB6BA, + 36888 - 11905: 0xDEA0, + 36889 - 11905: 0xDF40, + 36890 - 11905: 0xCDA8, + 36891 - 11905: 0xB9E4, + 36892 - 11905: 0xDF41, + 36893 - 11905: 0xCAC5, + 36894 - 11905: 0xB3D1, + 36895 - 11905: 0xCBD9, + 36896 - 11905: 0xD4EC, + 36897 - 11905: 0xE5D2, + 36898 - 11905: 0xB7EA, + 36899 - 11905: 0xDF42, + 36900 - 11905: 0xDF43, + 36901 - 11905: 0xDF44, + 36902 - 11905: 0xE5CE, + 36903 - 11905: 0xDF45, + 36904 - 11905: 0xDF46, + 36905 - 11905: 0xDF47, + 36906 - 11905: 0xDF48, + 36907 - 11905: 0xDF49, + 36908 - 11905: 0xDF4A, + 36909 - 11905: 0xE5D5, + 36910 - 11905: 0xB4FE, + 36911 - 11905: 0xE5D6, + 36912 - 11905: 0xDF4B, + 36913 - 11905: 0xDF4C, + 36914 - 11905: 0xDF4D, + 36915 - 11905: 0xDF4E, + 36916 - 11905: 0xDF4F, + 36917 - 11905: 0xE5D3, + 36918 - 11905: 0xE5D4, + 36919 - 11905: 0xDF50, + 36920 - 11905: 0xD2DD, + 36921 - 11905: 0xDF51, + 36922 - 11905: 0xDF52, + 36923 - 11905: 0xC2DF, + 36924 - 11905: 0xB1C6, + 36925 - 11905: 0xDF53, + 36926 - 11905: 0xD3E2, + 36927 - 11905: 0xDF54, + 36928 - 11905: 0xDF55, + 36929 - 11905: 0xB6DD, + 36930 - 11905: 0xCBEC, + 36931 - 11905: 0xDF56, + 36932 - 11905: 0xE5D7, + 36933 - 11905: 0xDF57, + 36934 - 11905: 0xDF58, + 36935 - 11905: 0xD3F6, + 36936 - 11905: 0xDF59, + 36937 - 11905: 0xDF5A, + 36938 - 11905: 0xDF5B, + 36939 - 11905: 0xDF5C, + 36940 - 11905: 0xDF5D, + 36941 - 11905: 0xB1E9, + 36942 - 11905: 0xDF5E, + 36943 - 11905: 0xB6F4, + 36944 - 11905: 0xE5DA, + 36945 - 11905: 0xE5D8, + 36946 - 11905: 0xE5D9, + 36947 - 11905: 0xB5C0, + 36948 - 11905: 0xDF5F, + 36949 - 11905: 0xDF60, + 36950 - 11905: 0xDF61, + 36951 - 11905: 0xD2C5, + 36952 - 11905: 0xE5DC, + 36953 - 11905: 0xDF62, + 36954 - 11905: 0xDF63, + 36955 - 11905: 0xE5DE, + 36956 - 11905: 0xDF64, + 36957 - 11905: 0xDF65, + 36958 - 11905: 0xDF66, + 36959 - 11905: 0xDF67, + 36960 - 11905: 0xDF68, + 36961 - 11905: 0xDF69, + 36962 - 11905: 0xE5DD, + 36963 - 11905: 0xC7B2, + 36964 - 11905: 0xDF6A, + 36965 - 11905: 0xD2A3, + 36966 - 11905: 0xDF6B, + 36967 - 11905: 0xDF6C, + 36968 - 11905: 0xE5DB, + 36969 - 11905: 0xDF6D, + 36970 - 11905: 0xDF6E, + 36971 - 11905: 0xDF6F, + 36972 - 11905: 0xDF70, + 36973 - 11905: 0xD4E2, + 36974 - 11905: 0xD5DA, + 36975 - 11905: 0xDF71, + 36976 - 11905: 0xDF72, + 36977 - 11905: 0xDF73, + 36978 - 11905: 0xDF74, + 36979 - 11905: 0xDF75, + 36980 - 11905: 0xE5E0, + 36981 - 11905: 0xD7F1, + 36982 - 11905: 0xDF76, + 36983 - 11905: 0xDF77, + 36984 - 11905: 0xDF78, + 36985 - 11905: 0xDF79, + 36986 - 11905: 0xDF7A, + 36987 - 11905: 0xDF7B, + 36988 - 11905: 0xDF7C, + 36989 - 11905: 0xE5E1, + 36990 - 11905: 0xDF7D, + 36991 - 11905: 0xB1DC, + 36992 - 11905: 0xD1FB, + 36993 - 11905: 0xDF7E, + 36994 - 11905: 0xE5E2, + 36995 - 11905: 0xE5E4, + 36996 - 11905: 0xDF80, + 36997 - 11905: 0xDF81, + 36998 - 11905: 0xDF82, + 36999 - 11905: 0xDF83, + 37000 - 11905: 0xE5E3, + 37001 - 11905: 0xDF84, + 37002 - 11905: 0xDF85, + 37003 - 11905: 0xE5E5, + 37004 - 11905: 0xDF86, + 37005 - 11905: 0xDF87, + 37006 - 11905: 0xDF88, + 37007 - 11905: 0xDF89, + 37008 - 11905: 0xDF8A, + 37009 - 11905: 0xD2D8, + 37010 - 11905: 0xDF8B, + 37011 - 11905: 0xB5CB, + 37012 - 11905: 0xDF8C, + 37013 - 11905: 0xE7DF, + 37014 - 11905: 0xDF8D, + 37015 - 11905: 0xDAF5, + 37016 - 11905: 0xDF8E, + 37017 - 11905: 0xDAF8, + 37018 - 11905: 0xDF8F, + 37019 - 11905: 0xDAF6, + 37020 - 11905: 0xDF90, + 37021 - 11905: 0xDAF7, + 37022 - 11905: 0xDF91, + 37023 - 11905: 0xDF92, + 37024 - 11905: 0xDF93, + 37025 - 11905: 0xDAFA, + 37026 - 11905: 0xD0CF, + 37027 - 11905: 0xC4C7, + 37028 - 11905: 0xDF94, + 37029 - 11905: 0xDF95, + 37030 - 11905: 0xB0EE, + 37031 - 11905: 0xDF96, + 37032 - 11905: 0xDF97, + 37033 - 11905: 0xDF98, + 37034 - 11905: 0xD0B0, + 37035 - 11905: 0xDF99, + 37036 - 11905: 0xDAF9, + 37037 - 11905: 0xDF9A, + 37038 - 11905: 0xD3CA, + 37039 - 11905: 0xBAAA, + 37040 - 11905: 0xDBA2, + 37041 - 11905: 0xC7F1, + 37042 - 11905: 0xDF9B, + 37043 - 11905: 0xDAFC, + 37044 - 11905: 0xDAFB, + 37045 - 11905: 0xC9DB, + 37046 - 11905: 0xDAFD, + 37047 - 11905: 0xDF9C, + 37048 - 11905: 0xDBA1, + 37049 - 11905: 0xD7DE, + 37050 - 11905: 0xDAFE, + 37051 - 11905: 0xC1DA, + 37052 - 11905: 0xDF9D, + 37053 - 11905: 0xDF9E, + 37054 - 11905: 0xDBA5, + 37055 - 11905: 0xDF9F, + 37056 - 11905: 0xDFA0, + 37057 - 11905: 0xD3F4, + 37058 - 11905: 0xE040, + 37059 - 11905: 0xE041, + 37060 - 11905: 0xDBA7, + 37061 - 11905: 0xDBA4, + 37062 - 11905: 0xE042, + 37063 - 11905: 0xDBA8, + 37064 - 11905: 0xE043, + 37065 - 11905: 0xE044, + 37066 - 11905: 0xBDBC, + 37067 - 11905: 0xE045, + 37068 - 11905: 0xE046, + 37069 - 11905: 0xE047, + 37070 - 11905: 0xC0C9, + 37071 - 11905: 0xDBA3, + 37072 - 11905: 0xDBA6, + 37073 - 11905: 0xD6A3, + 37074 - 11905: 0xE048, + 37075 - 11905: 0xDBA9, + 37076 - 11905: 0xE049, + 37077 - 11905: 0xE04A, + 37078 - 11905: 0xE04B, + 37079 - 11905: 0xDBAD, + 37080 - 11905: 0xE04C, + 37081 - 11905: 0xE04D, + 37082 - 11905: 0xE04E, + 37083 - 11905: 0xDBAE, + 37084 - 11905: 0xDBAC, + 37085 - 11905: 0xBAC2, + 37086 - 11905: 0xE04F, + 37087 - 11905: 0xE050, + 37088 - 11905: 0xE051, + 37089 - 11905: 0xBFA4, + 37090 - 11905: 0xDBAB, + 37091 - 11905: 0xE052, + 37092 - 11905: 0xE053, + 37093 - 11905: 0xE054, + 37094 - 11905: 0xDBAA, + 37095 - 11905: 0xD4C7, + 37096 - 11905: 0xB2BF, + 37097 - 11905: 0xE055, + 37098 - 11905: 0xE056, + 37099 - 11905: 0xDBAF, + 37100 - 11905: 0xE057, + 37101 - 11905: 0xB9F9, + 37102 - 11905: 0xE058, + 37103 - 11905: 0xDBB0, + 37104 - 11905: 0xE059, + 37105 - 11905: 0xE05A, + 37106 - 11905: 0xE05B, + 37107 - 11905: 0xE05C, + 37108 - 11905: 0xB3BB, + 37109 - 11905: 0xE05D, + 37110 - 11905: 0xE05E, + 37111 - 11905: 0xE05F, + 37112 - 11905: 0xB5A6, + 37113 - 11905: 0xE060, + 37114 - 11905: 0xE061, + 37115 - 11905: 0xE062, + 37116 - 11905: 0xE063, + 37117 - 11905: 0xB6BC, + 37118 - 11905: 0xDBB1, + 37119 - 11905: 0xE064, + 37120 - 11905: 0xE065, + 37121 - 11905: 0xE066, + 37122 - 11905: 0xB6F5, + 37123 - 11905: 0xE067, + 37124 - 11905: 0xDBB2, + 37125 - 11905: 0xE068, + 37126 - 11905: 0xE069, + 37127 - 11905: 0xE06A, + 37128 - 11905: 0xE06B, + 37129 - 11905: 0xE06C, + 37130 - 11905: 0xE06D, + 37131 - 11905: 0xE06E, + 37132 - 11905: 0xE06F, + 37133 - 11905: 0xE070, + 37134 - 11905: 0xE071, + 37135 - 11905: 0xE072, + 37136 - 11905: 0xE073, + 37137 - 11905: 0xE074, + 37138 - 11905: 0xE075, + 37139 - 11905: 0xE076, + 37140 - 11905: 0xE077, + 37141 - 11905: 0xE078, + 37142 - 11905: 0xE079, + 37143 - 11905: 0xE07A, + 37144 - 11905: 0xE07B, + 37145 - 11905: 0xB1C9, + 37146 - 11905: 0xE07C, + 37147 - 11905: 0xE07D, + 37148 - 11905: 0xE07E, + 37149 - 11905: 0xE080, + 37150 - 11905: 0xDBB4, + 37151 - 11905: 0xE081, + 37152 - 11905: 0xE082, + 37153 - 11905: 0xE083, + 37154 - 11905: 0xDBB3, + 37155 - 11905: 0xDBB5, + 37156 - 11905: 0xE084, + 37157 - 11905: 0xE085, + 37158 - 11905: 0xE086, + 37159 - 11905: 0xE087, + 37160 - 11905: 0xE088, + 37161 - 11905: 0xE089, + 37162 - 11905: 0xE08A, + 37163 - 11905: 0xE08B, + 37164 - 11905: 0xE08C, + 37165 - 11905: 0xE08D, + 37166 - 11905: 0xE08E, + 37167 - 11905: 0xDBB7, + 37168 - 11905: 0xE08F, + 37169 - 11905: 0xDBB6, + 37170 - 11905: 0xE090, + 37171 - 11905: 0xE091, + 37172 - 11905: 0xE092, + 37173 - 11905: 0xE093, + 37174 - 11905: 0xE094, + 37175 - 11905: 0xE095, + 37176 - 11905: 0xE096, + 37177 - 11905: 0xDBB8, + 37178 - 11905: 0xE097, + 37179 - 11905: 0xE098, + 37180 - 11905: 0xE099, + 37181 - 11905: 0xE09A, + 37182 - 11905: 0xE09B, + 37183 - 11905: 0xE09C, + 37184 - 11905: 0xE09D, + 37185 - 11905: 0xE09E, + 37186 - 11905: 0xE09F, + 37187 - 11905: 0xDBB9, + 37188 - 11905: 0xE0A0, + 37189 - 11905: 0xE140, + 37190 - 11905: 0xDBBA, + 37191 - 11905: 0xE141, + 37192 - 11905: 0xE142, + 37193 - 11905: 0xD3CF, + 37194 - 11905: 0xF4FA, + 37195 - 11905: 0xC7F5, + 37196 - 11905: 0xD7C3, + 37197 - 11905: 0xC5E4, + 37198 - 11905: 0xF4FC, + 37199 - 11905: 0xF4FD, + 37200 - 11905: 0xF4FB, + 37201 - 11905: 0xE143, + 37202 - 11905: 0xBEC6, + 37203 - 11905: 0xE144, + 37204 - 11905: 0xE145, + 37205 - 11905: 0xE146, + 37206 - 11905: 0xE147, + 37207 - 11905: 0xD0EF, + 37208 - 11905: 0xE148, + 37209 - 11905: 0xE149, + 37210 - 11905: 0xB7D3, + 37211 - 11905: 0xE14A, + 37212 - 11905: 0xE14B, + 37213 - 11905: 0xD4CD, + 37214 - 11905: 0xCCAA, + 37215 - 11905: 0xE14C, + 37216 - 11905: 0xE14D, + 37217 - 11905: 0xF5A2, + 37218 - 11905: 0xF5A1, + 37219 - 11905: 0xBAA8, + 37220 - 11905: 0xF4FE, + 37221 - 11905: 0xCBD6, + 37222 - 11905: 0xE14E, + 37223 - 11905: 0xE14F, + 37224 - 11905: 0xE150, + 37225 - 11905: 0xF5A4, + 37226 - 11905: 0xC0D2, + 37227 - 11905: 0xE151, + 37228 - 11905: 0xB3EA, + 37229 - 11905: 0xE152, + 37230 - 11905: 0xCDAA, + 37231 - 11905: 0xF5A5, + 37232 - 11905: 0xF5A3, + 37233 - 11905: 0xBDB4, + 37234 - 11905: 0xF5A8, + 37235 - 11905: 0xE153, + 37236 - 11905: 0xF5A9, + 37237 - 11905: 0xBDCD, + 37238 - 11905: 0xC3B8, + 37239 - 11905: 0xBFE1, + 37240 - 11905: 0xCBE1, + 37241 - 11905: 0xF5AA, + 37242 - 11905: 0xE154, + 37243 - 11905: 0xE155, + 37244 - 11905: 0xE156, + 37245 - 11905: 0xF5A6, + 37246 - 11905: 0xF5A7, + 37247 - 11905: 0xC4F0, + 37248 - 11905: 0xE157, + 37249 - 11905: 0xE158, + 37250 - 11905: 0xE159, + 37251 - 11905: 0xE15A, + 37252 - 11905: 0xE15B, + 37253 - 11905: 0xF5AC, + 37254 - 11905: 0xE15C, + 37255 - 11905: 0xB4BC, + 37256 - 11905: 0xE15D, + 37257 - 11905: 0xD7ED, + 37258 - 11905: 0xE15E, + 37259 - 11905: 0xB4D7, + 37260 - 11905: 0xF5AB, + 37261 - 11905: 0xF5AE, + 37262 - 11905: 0xE15F, + 37263 - 11905: 0xE160, + 37264 - 11905: 0xF5AD, + 37265 - 11905: 0xF5AF, + 37266 - 11905: 0xD0D1, + 37267 - 11905: 0xE161, + 37268 - 11905: 0xE162, + 37269 - 11905: 0xE163, + 37270 - 11905: 0xE164, + 37271 - 11905: 0xE165, + 37272 - 11905: 0xE166, + 37273 - 11905: 0xE167, + 37274 - 11905: 0xC3D1, + 37275 - 11905: 0xC8A9, + 37276 - 11905: 0xE168, + 37277 - 11905: 0xE169, + 37278 - 11905: 0xE16A, + 37279 - 11905: 0xE16B, + 37280 - 11905: 0xE16C, + 37281 - 11905: 0xE16D, + 37282 - 11905: 0xF5B0, + 37283 - 11905: 0xF5B1, + 37284 - 11905: 0xE16E, + 37285 - 11905: 0xE16F, + 37286 - 11905: 0xE170, + 37287 - 11905: 0xE171, + 37288 - 11905: 0xE172, + 37289 - 11905: 0xE173, + 37290 - 11905: 0xF5B2, + 37291 - 11905: 0xE174, + 37292 - 11905: 0xE175, + 37293 - 11905: 0xF5B3, + 37294 - 11905: 0xF5B4, + 37295 - 11905: 0xF5B5, + 37296 - 11905: 0xE176, + 37297 - 11905: 0xE177, + 37298 - 11905: 0xE178, + 37299 - 11905: 0xE179, + 37300 - 11905: 0xF5B7, + 37301 - 11905: 0xF5B6, + 37302 - 11905: 0xE17A, + 37303 - 11905: 0xE17B, + 37304 - 11905: 0xE17C, + 37305 - 11905: 0xE17D, + 37306 - 11905: 0xF5B8, + 37307 - 11905: 0xE17E, + 37308 - 11905: 0xE180, + 37309 - 11905: 0xE181, + 37310 - 11905: 0xE182, + 37311 - 11905: 0xE183, + 37312 - 11905: 0xE184, + 37313 - 11905: 0xE185, + 37314 - 11905: 0xE186, + 37315 - 11905: 0xE187, + 37316 - 11905: 0xE188, + 37317 - 11905: 0xE189, + 37318 - 11905: 0xE18A, + 37319 - 11905: 0xB2C9, + 37320 - 11905: 0xE18B, + 37321 - 11905: 0xD3D4, + 37322 - 11905: 0xCACD, + 37323 - 11905: 0xE18C, + 37324 - 11905: 0xC0EF, + 37325 - 11905: 0xD6D8, + 37326 - 11905: 0xD2B0, + 37327 - 11905: 0xC1BF, + 37328 - 11905: 0xE18D, + 37329 - 11905: 0xBDF0, + 37330 - 11905: 0xE18E, + 37331 - 11905: 0xE18F, + 37332 - 11905: 0xE190, + 37333 - 11905: 0xE191, + 37334 - 11905: 0xE192, + 37335 - 11905: 0xE193, + 37336 - 11905: 0xE194, + 37337 - 11905: 0xE195, + 37338 - 11905: 0xE196, + 37339 - 11905: 0xE197, + 37340 - 11905: 0xB8AA, + 37341 - 11905: 0xE198, + 37342 - 11905: 0xE199, + 37343 - 11905: 0xE19A, + 37344 - 11905: 0xE19B, + 37345 - 11905: 0xE19C, + 37346 - 11905: 0xE19D, + 37347 - 11905: 0xE19E, + 37348 - 11905: 0xE19F, + 37349 - 11905: 0xE1A0, + 37350 - 11905: 0xE240, + 37351 - 11905: 0xE241, + 37352 - 11905: 0xE242, + 37353 - 11905: 0xE243, + 37354 - 11905: 0xE244, + 37355 - 11905: 0xE245, + 37356 - 11905: 0xE246, + 37357 - 11905: 0xE247, + 37358 - 11905: 0xE248, + 37359 - 11905: 0xE249, + 37360 - 11905: 0xE24A, + 37361 - 11905: 0xE24B, + 37362 - 11905: 0xE24C, + 37363 - 11905: 0xE24D, + 37364 - 11905: 0xE24E, + 37365 - 11905: 0xE24F, + 37366 - 11905: 0xE250, + 37367 - 11905: 0xE251, + 37368 - 11905: 0xE252, + 37369 - 11905: 0xE253, + 37370 - 11905: 0xE254, + 37371 - 11905: 0xE255, + 37372 - 11905: 0xE256, + 37373 - 11905: 0xE257, + 37374 - 11905: 0xE258, + 37375 - 11905: 0xE259, + 37376 - 11905: 0xE25A, + 37377 - 11905: 0xE25B, + 37378 - 11905: 0xE25C, + 37379 - 11905: 0xE25D, + 37380 - 11905: 0xE25E, + 37381 - 11905: 0xE25F, + 37382 - 11905: 0xE260, + 37383 - 11905: 0xE261, + 37384 - 11905: 0xE262, + 37385 - 11905: 0xE263, + 37386 - 11905: 0xE264, + 37387 - 11905: 0xE265, + 37388 - 11905: 0xE266, + 37389 - 11905: 0xE267, + 37390 - 11905: 0xE268, + 37391 - 11905: 0xE269, + 37392 - 11905: 0xE26A, + 37393 - 11905: 0xE26B, + 37394 - 11905: 0xE26C, + 37395 - 11905: 0xE26D, + 37396 - 11905: 0xE26E, + 37397 - 11905: 0xE26F, + 37398 - 11905: 0xE270, + 37399 - 11905: 0xE271, + 37400 - 11905: 0xE272, + 37401 - 11905: 0xE273, + 37402 - 11905: 0xE274, + 37403 - 11905: 0xE275, + 37404 - 11905: 0xE276, + 37405 - 11905: 0xE277, + 37406 - 11905: 0xE278, + 37407 - 11905: 0xE279, + 37408 - 11905: 0xE27A, + 37409 - 11905: 0xE27B, + 37410 - 11905: 0xE27C, + 37411 - 11905: 0xE27D, + 37412 - 11905: 0xE27E, + 37413 - 11905: 0xE280, + 37414 - 11905: 0xE281, + 37415 - 11905: 0xE282, + 37416 - 11905: 0xE283, + 37417 - 11905: 0xE284, + 37418 - 11905: 0xE285, + 37419 - 11905: 0xE286, + 37420 - 11905: 0xE287, + 37421 - 11905: 0xE288, + 37422 - 11905: 0xE289, + 37423 - 11905: 0xE28A, + 37424 - 11905: 0xE28B, + 37425 - 11905: 0xE28C, + 37426 - 11905: 0xE28D, + 37427 - 11905: 0xE28E, + 37428 - 11905: 0xE28F, + 37429 - 11905: 0xE290, + 37430 - 11905: 0xE291, + 37431 - 11905: 0xE292, + 37432 - 11905: 0xE293, + 37433 - 11905: 0xE294, + 37434 - 11905: 0xE295, + 37435 - 11905: 0xE296, + 37436 - 11905: 0xE297, + 37437 - 11905: 0xE298, + 37438 - 11905: 0xE299, + 37439 - 11905: 0xE29A, + 37440 - 11905: 0xE29B, + 37441 - 11905: 0xE29C, + 37442 - 11905: 0xE29D, + 37443 - 11905: 0xE29E, + 37444 - 11905: 0xE29F, + 37445 - 11905: 0xE2A0, + 37446 - 11905: 0xE340, + 37447 - 11905: 0xE341, + 37448 - 11905: 0xE342, + 37449 - 11905: 0xE343, + 37450 - 11905: 0xE344, + 37451 - 11905: 0xE345, + 37452 - 11905: 0xE346, + 37453 - 11905: 0xE347, + 37454 - 11905: 0xE348, + 37455 - 11905: 0xE349, + 37456 - 11905: 0xE34A, + 37457 - 11905: 0xE34B, + 37458 - 11905: 0xE34C, + 37459 - 11905: 0xE34D, + 37460 - 11905: 0xE34E, + 37461 - 11905: 0xE34F, + 37462 - 11905: 0xE350, + 37463 - 11905: 0xE351, + 37464 - 11905: 0xE352, + 37465 - 11905: 0xE353, + 37466 - 11905: 0xE354, + 37467 - 11905: 0xE355, + 37468 - 11905: 0xE356, + 37469 - 11905: 0xE357, + 37470 - 11905: 0xE358, + 37471 - 11905: 0xE359, + 37472 - 11905: 0xE35A, + 37473 - 11905: 0xE35B, + 37474 - 11905: 0xE35C, + 37475 - 11905: 0xE35D, + 37476 - 11905: 0xE35E, + 37477 - 11905: 0xE35F, + 37478 - 11905: 0xE360, + 37479 - 11905: 0xE361, + 37480 - 11905: 0xE362, + 37481 - 11905: 0xE363, + 37482 - 11905: 0xE364, + 37483 - 11905: 0xE365, + 37484 - 11905: 0xE366, + 37485 - 11905: 0xE367, + 37486 - 11905: 0xE368, + 37487 - 11905: 0xE369, + 37488 - 11905: 0xE36A, + 37489 - 11905: 0xE36B, + 37490 - 11905: 0xE36C, + 37491 - 11905: 0xE36D, + 37492 - 11905: 0xBCF8, + 37493 - 11905: 0xE36E, + 37494 - 11905: 0xE36F, + 37495 - 11905: 0xE370, + 37496 - 11905: 0xE371, + 37497 - 11905: 0xE372, + 37498 - 11905: 0xE373, + 37499 - 11905: 0xE374, + 37500 - 11905: 0xE375, + 37501 - 11905: 0xE376, + 37502 - 11905: 0xE377, + 37503 - 11905: 0xE378, + 37504 - 11905: 0xE379, + 37505 - 11905: 0xE37A, + 37506 - 11905: 0xE37B, + 37507 - 11905: 0xE37C, + 37508 - 11905: 0xE37D, + 37509 - 11905: 0xE37E, + 37510 - 11905: 0xE380, + 37511 - 11905: 0xE381, + 37512 - 11905: 0xE382, + 37513 - 11905: 0xE383, + 37514 - 11905: 0xE384, + 37515 - 11905: 0xE385, + 37516 - 11905: 0xE386, + 37517 - 11905: 0xE387, + 37518 - 11905: 0xF6C6, + 37519 - 11905: 0xE388, + 37520 - 11905: 0xE389, + 37521 - 11905: 0xE38A, + 37522 - 11905: 0xE38B, + 37523 - 11905: 0xE38C, + 37524 - 11905: 0xE38D, + 37525 - 11905: 0xE38E, + 37526 - 11905: 0xE38F, + 37527 - 11905: 0xE390, + 37528 - 11905: 0xE391, + 37529 - 11905: 0xE392, + 37530 - 11905: 0xE393, + 37531 - 11905: 0xE394, + 37532 - 11905: 0xE395, + 37533 - 11905: 0xE396, + 37534 - 11905: 0xE397, + 37535 - 11905: 0xE398, + 37536 - 11905: 0xE399, + 37537 - 11905: 0xE39A, + 37538 - 11905: 0xE39B, + 37539 - 11905: 0xE39C, + 37540 - 11905: 0xE39D, + 37541 - 11905: 0xE39E, + 37542 - 11905: 0xE39F, + 37543 - 11905: 0xE3A0, + 37544 - 11905: 0xE440, + 37545 - 11905: 0xE441, + 37546 - 11905: 0xE442, + 37547 - 11905: 0xE443, + 37548 - 11905: 0xE444, + 37549 - 11905: 0xE445, + 37550 - 11905: 0xF6C7, + 37551 - 11905: 0xE446, + 37552 - 11905: 0xE447, + 37553 - 11905: 0xE448, + 37554 - 11905: 0xE449, + 37555 - 11905: 0xE44A, + 37556 - 11905: 0xE44B, + 37557 - 11905: 0xE44C, + 37558 - 11905: 0xE44D, + 37559 - 11905: 0xE44E, + 37560 - 11905: 0xE44F, + 37561 - 11905: 0xE450, + 37562 - 11905: 0xE451, + 37563 - 11905: 0xE452, + 37564 - 11905: 0xE453, + 37565 - 11905: 0xE454, + 37566 - 11905: 0xE455, + 37567 - 11905: 0xE456, + 37568 - 11905: 0xE457, + 37569 - 11905: 0xE458, + 37570 - 11905: 0xE459, + 37571 - 11905: 0xE45A, + 37572 - 11905: 0xE45B, + 37573 - 11905: 0xE45C, + 37574 - 11905: 0xE45D, + 37575 - 11905: 0xE45E, + 37576 - 11905: 0xF6C8, + 37577 - 11905: 0xE45F, + 37578 - 11905: 0xE460, + 37579 - 11905: 0xE461, + 37580 - 11905: 0xE462, + 37581 - 11905: 0xE463, + 37582 - 11905: 0xE464, + 37583 - 11905: 0xE465, + 37584 - 11905: 0xE466, + 37585 - 11905: 0xE467, + 37586 - 11905: 0xE468, + 37587 - 11905: 0xE469, + 37588 - 11905: 0xE46A, + 37589 - 11905: 0xE46B, + 37590 - 11905: 0xE46C, + 37591 - 11905: 0xE46D, + 37592 - 11905: 0xE46E, + 37593 - 11905: 0xE46F, + 37594 - 11905: 0xE470, + 37595 - 11905: 0xE471, + 37596 - 11905: 0xE472, + 37597 - 11905: 0xE473, + 37598 - 11905: 0xE474, + 37599 - 11905: 0xE475, + 37600 - 11905: 0xE476, + 37601 - 11905: 0xE477, + 37602 - 11905: 0xE478, + 37603 - 11905: 0xE479, + 37604 - 11905: 0xE47A, + 37605 - 11905: 0xE47B, + 37606 - 11905: 0xE47C, + 37607 - 11905: 0xE47D, + 37608 - 11905: 0xE47E, + 37609 - 11905: 0xE480, + 37610 - 11905: 0xE481, + 37611 - 11905: 0xE482, + 37612 - 11905: 0xE483, + 37613 - 11905: 0xE484, + 37614 - 11905: 0xE485, + 37615 - 11905: 0xE486, + 37616 - 11905: 0xE487, + 37617 - 11905: 0xE488, + 37618 - 11905: 0xE489, + 37619 - 11905: 0xE48A, + 37620 - 11905: 0xE48B, + 37621 - 11905: 0xE48C, + 37622 - 11905: 0xE48D, + 37623 - 11905: 0xE48E, + 37624 - 11905: 0xE48F, + 37625 - 11905: 0xE490, + 37626 - 11905: 0xE491, + 37627 - 11905: 0xE492, + 37628 - 11905: 0xE493, + 37629 - 11905: 0xE494, + 37630 - 11905: 0xE495, + 37631 - 11905: 0xE496, + 37632 - 11905: 0xE497, + 37633 - 11905: 0xE498, + 37634 - 11905: 0xE499, + 37635 - 11905: 0xE49A, + 37636 - 11905: 0xE49B, + 37637 - 11905: 0xE49C, + 37638 - 11905: 0xE49D, + 37639 - 11905: 0xE49E, + 37640 - 11905: 0xE49F, + 37641 - 11905: 0xE4A0, + 37642 - 11905: 0xE540, + 37643 - 11905: 0xE541, + 37644 - 11905: 0xE542, + 37645 - 11905: 0xE543, + 37646 - 11905: 0xE544, + 37647 - 11905: 0xE545, + 37648 - 11905: 0xE546, + 37649 - 11905: 0xE547, + 37650 - 11905: 0xE548, + 37651 - 11905: 0xE549, + 37652 - 11905: 0xE54A, + 37653 - 11905: 0xE54B, + 37654 - 11905: 0xE54C, + 37655 - 11905: 0xE54D, + 37656 - 11905: 0xE54E, + 37657 - 11905: 0xE54F, + 37658 - 11905: 0xE550, + 37659 - 11905: 0xE551, + 37660 - 11905: 0xE552, + 37661 - 11905: 0xE553, + 37662 - 11905: 0xE554, + 37663 - 11905: 0xE555, + 37664 - 11905: 0xE556, + 37665 - 11905: 0xE557, + 37666 - 11905: 0xE558, + 37667 - 11905: 0xE559, + 37668 - 11905: 0xE55A, + 37669 - 11905: 0xE55B, + 37670 - 11905: 0xE55C, + 37671 - 11905: 0xE55D, + 37672 - 11905: 0xE55E, + 37673 - 11905: 0xE55F, + 37674 - 11905: 0xE560, + 37675 - 11905: 0xE561, + 37676 - 11905: 0xE562, + 37677 - 11905: 0xE563, + 37678 - 11905: 0xE564, + 37679 - 11905: 0xE565, + 37680 - 11905: 0xE566, + 37681 - 11905: 0xE567, + 37682 - 11905: 0xE568, + 37683 - 11905: 0xE569, + 37684 - 11905: 0xE56A, + 37685 - 11905: 0xE56B, + 37686 - 11905: 0xE56C, + 37687 - 11905: 0xE56D, + 37688 - 11905: 0xE56E, + 37689 - 11905: 0xE56F, + 37690 - 11905: 0xE570, + 37691 - 11905: 0xE571, + 37692 - 11905: 0xE572, + 37693 - 11905: 0xE573, + 37694 - 11905: 0xF6C9, + 37695 - 11905: 0xE574, + 37696 - 11905: 0xE575, + 37697 - 11905: 0xE576, + 37698 - 11905: 0xE577, + 37699 - 11905: 0xE578, + 37700 - 11905: 0xE579, + 37701 - 11905: 0xE57A, + 37702 - 11905: 0xE57B, + 37703 - 11905: 0xE57C, + 37704 - 11905: 0xE57D, + 37705 - 11905: 0xE57E, + 37706 - 11905: 0xE580, + 37707 - 11905: 0xE581, + 37708 - 11905: 0xE582, + 37709 - 11905: 0xE583, + 37710 - 11905: 0xE584, + 37711 - 11905: 0xE585, + 37712 - 11905: 0xE586, + 37713 - 11905: 0xE587, + 37714 - 11905: 0xE588, + 37715 - 11905: 0xE589, + 37716 - 11905: 0xE58A, + 37717 - 11905: 0xE58B, + 37718 - 11905: 0xE58C, + 37719 - 11905: 0xE58D, + 37720 - 11905: 0xE58E, + 37721 - 11905: 0xE58F, + 37722 - 11905: 0xE590, + 37723 - 11905: 0xE591, + 37724 - 11905: 0xE592, + 37725 - 11905: 0xE593, + 37726 - 11905: 0xE594, + 37727 - 11905: 0xE595, + 37728 - 11905: 0xE596, + 37729 - 11905: 0xE597, + 37730 - 11905: 0xE598, + 37731 - 11905: 0xE599, + 37732 - 11905: 0xE59A, + 37733 - 11905: 0xE59B, + 37734 - 11905: 0xE59C, + 37735 - 11905: 0xE59D, + 37736 - 11905: 0xE59E, + 37737 - 11905: 0xE59F, + 37738 - 11905: 0xF6CA, + 37739 - 11905: 0xE5A0, + 37740 - 11905: 0xE640, + 37741 - 11905: 0xE641, + 37742 - 11905: 0xE642, + 37743 - 11905: 0xE643, + 37744 - 11905: 0xE644, + 37745 - 11905: 0xE645, + 37746 - 11905: 0xE646, + 37747 - 11905: 0xE647, + 37748 - 11905: 0xE648, + 37749 - 11905: 0xE649, + 37750 - 11905: 0xE64A, + 37751 - 11905: 0xE64B, + 37752 - 11905: 0xE64C, + 37753 - 11905: 0xE64D, + 37754 - 11905: 0xE64E, + 37755 - 11905: 0xE64F, + 37756 - 11905: 0xE650, + 37757 - 11905: 0xE651, + 37758 - 11905: 0xE652, + 37759 - 11905: 0xE653, + 37760 - 11905: 0xE654, + 37761 - 11905: 0xE655, + 37762 - 11905: 0xE656, + 37763 - 11905: 0xE657, + 37764 - 11905: 0xE658, + 37765 - 11905: 0xE659, + 37766 - 11905: 0xE65A, + 37767 - 11905: 0xE65B, + 37768 - 11905: 0xE65C, + 37769 - 11905: 0xE65D, + 37770 - 11905: 0xE65E, + 37771 - 11905: 0xE65F, + 37772 - 11905: 0xE660, + 37773 - 11905: 0xE661, + 37774 - 11905: 0xE662, + 37775 - 11905: 0xF6CC, + 37776 - 11905: 0xE663, + 37777 - 11905: 0xE664, + 37778 - 11905: 0xE665, + 37779 - 11905: 0xE666, + 37780 - 11905: 0xE667, + 37781 - 11905: 0xE668, + 37782 - 11905: 0xE669, + 37783 - 11905: 0xE66A, + 37784 - 11905: 0xE66B, + 37785 - 11905: 0xE66C, + 37786 - 11905: 0xE66D, + 37787 - 11905: 0xE66E, + 37788 - 11905: 0xE66F, + 37789 - 11905: 0xE670, + 37790 - 11905: 0xE671, + 37791 - 11905: 0xE672, + 37792 - 11905: 0xE673, + 37793 - 11905: 0xE674, + 37794 - 11905: 0xE675, + 37795 - 11905: 0xE676, + 37796 - 11905: 0xE677, + 37797 - 11905: 0xE678, + 37798 - 11905: 0xE679, + 37799 - 11905: 0xE67A, + 37800 - 11905: 0xE67B, + 37801 - 11905: 0xE67C, + 37802 - 11905: 0xE67D, + 37803 - 11905: 0xE67E, + 37804 - 11905: 0xE680, + 37805 - 11905: 0xE681, + 37806 - 11905: 0xE682, + 37807 - 11905: 0xE683, + 37808 - 11905: 0xE684, + 37809 - 11905: 0xE685, + 37810 - 11905: 0xE686, + 37811 - 11905: 0xE687, + 37812 - 11905: 0xE688, + 37813 - 11905: 0xE689, + 37814 - 11905: 0xE68A, + 37815 - 11905: 0xE68B, + 37816 - 11905: 0xE68C, + 37817 - 11905: 0xE68D, + 37818 - 11905: 0xE68E, + 37819 - 11905: 0xE68F, + 37820 - 11905: 0xE690, + 37821 - 11905: 0xE691, + 37822 - 11905: 0xE692, + 37823 - 11905: 0xE693, + 37824 - 11905: 0xE694, + 37825 - 11905: 0xE695, + 37826 - 11905: 0xE696, + 37827 - 11905: 0xE697, + 37828 - 11905: 0xE698, + 37829 - 11905: 0xE699, + 37830 - 11905: 0xE69A, + 37831 - 11905: 0xE69B, + 37832 - 11905: 0xE69C, + 37833 - 11905: 0xE69D, + 37834 - 11905: 0xF6CB, + 37835 - 11905: 0xE69E, + 37836 - 11905: 0xE69F, + 37837 - 11905: 0xE6A0, + 37838 - 11905: 0xE740, + 37839 - 11905: 0xE741, + 37840 - 11905: 0xE742, + 37841 - 11905: 0xE743, + 37842 - 11905: 0xE744, + 37843 - 11905: 0xE745, + 37844 - 11905: 0xE746, + 37845 - 11905: 0xE747, + 37846 - 11905: 0xF7E9, + 37847 - 11905: 0xE748, + 37848 - 11905: 0xE749, + 37849 - 11905: 0xE74A, + 37850 - 11905: 0xE74B, + 37851 - 11905: 0xE74C, + 37852 - 11905: 0xE74D, + 37853 - 11905: 0xE74E, + 37854 - 11905: 0xE74F, + 37855 - 11905: 0xE750, + 37856 - 11905: 0xE751, + 37857 - 11905: 0xE752, + 37858 - 11905: 0xE753, + 37859 - 11905: 0xE754, + 37860 - 11905: 0xE755, + 37861 - 11905: 0xE756, + 37862 - 11905: 0xE757, + 37863 - 11905: 0xE758, + 37864 - 11905: 0xE759, + 37865 - 11905: 0xE75A, + 37866 - 11905: 0xE75B, + 37867 - 11905: 0xE75C, + 37868 - 11905: 0xE75D, + 37869 - 11905: 0xE75E, + 37870 - 11905: 0xE75F, + 37871 - 11905: 0xE760, + 37872 - 11905: 0xE761, + 37873 - 11905: 0xE762, + 37874 - 11905: 0xE763, + 37875 - 11905: 0xE764, + 37876 - 11905: 0xE765, + 37877 - 11905: 0xE766, + 37878 - 11905: 0xE767, + 37879 - 11905: 0xE768, + 37880 - 11905: 0xE769, + 37881 - 11905: 0xE76A, + 37882 - 11905: 0xE76B, + 37883 - 11905: 0xE76C, + 37884 - 11905: 0xE76D, + 37885 - 11905: 0xE76E, + 37886 - 11905: 0xE76F, + 37887 - 11905: 0xE770, + 37888 - 11905: 0xE771, + 37889 - 11905: 0xE772, + 37890 - 11905: 0xE773, + 37891 - 11905: 0xE774, + 37892 - 11905: 0xE775, + 37893 - 11905: 0xE776, + 37894 - 11905: 0xE777, + 37895 - 11905: 0xE778, + 37896 - 11905: 0xE779, + 37897 - 11905: 0xE77A, + 37898 - 11905: 0xE77B, + 37899 - 11905: 0xE77C, + 37900 - 11905: 0xE77D, + 37901 - 11905: 0xE77E, + 37902 - 11905: 0xE780, + 37903 - 11905: 0xE781, + 37904 - 11905: 0xE782, + 37905 - 11905: 0xE783, + 37906 - 11905: 0xE784, + 37907 - 11905: 0xE785, + 37908 - 11905: 0xE786, + 37909 - 11905: 0xE787, + 37910 - 11905: 0xE788, + 37911 - 11905: 0xE789, + 37912 - 11905: 0xE78A, + 37913 - 11905: 0xE78B, + 37914 - 11905: 0xE78C, + 37915 - 11905: 0xE78D, + 37916 - 11905: 0xE78E, + 37917 - 11905: 0xE78F, + 37918 - 11905: 0xE790, + 37919 - 11905: 0xE791, + 37920 - 11905: 0xE792, + 37921 - 11905: 0xE793, + 37922 - 11905: 0xE794, + 37923 - 11905: 0xE795, + 37924 - 11905: 0xE796, + 37925 - 11905: 0xE797, + 37926 - 11905: 0xE798, + 37927 - 11905: 0xE799, + 37928 - 11905: 0xE79A, + 37929 - 11905: 0xE79B, + 37930 - 11905: 0xE79C, + 37931 - 11905: 0xE79D, + 37932 - 11905: 0xE79E, + 37933 - 11905: 0xE79F, + 37934 - 11905: 0xE7A0, + 37935 - 11905: 0xE840, + 37936 - 11905: 0xE841, + 37937 - 11905: 0xE842, + 37938 - 11905: 0xE843, + 37939 - 11905: 0xE844, + 37940 - 11905: 0xE845, + 37941 - 11905: 0xE846, + 37942 - 11905: 0xE847, + 37943 - 11905: 0xE848, + 37944 - 11905: 0xE849, + 37945 - 11905: 0xE84A, + 37946 - 11905: 0xE84B, + 37947 - 11905: 0xE84C, + 37948 - 11905: 0xE84D, + 37949 - 11905: 0xE84E, + 37950 - 11905: 0xF6CD, + 37951 - 11905: 0xE84F, + 37952 - 11905: 0xE850, + 37953 - 11905: 0xE851, + 37954 - 11905: 0xE852, + 37955 - 11905: 0xE853, + 37956 - 11905: 0xE854, + 37957 - 11905: 0xE855, + 37958 - 11905: 0xE856, + 37959 - 11905: 0xE857, + 37960 - 11905: 0xE858, + 37961 - 11905: 0xE859, + 37962 - 11905: 0xE85A, + 37963 - 11905: 0xE85B, + 37964 - 11905: 0xE85C, + 37965 - 11905: 0xE85D, + 37966 - 11905: 0xE85E, + 37967 - 11905: 0xE85F, + 37968 - 11905: 0xE860, + 37969 - 11905: 0xE861, + 37970 - 11905: 0xE862, + 37971 - 11905: 0xE863, + 37972 - 11905: 0xE864, + 37973 - 11905: 0xE865, + 37974 - 11905: 0xE866, + 37975 - 11905: 0xE867, + 37976 - 11905: 0xE868, + 37977 - 11905: 0xE869, + 37978 - 11905: 0xE86A, + 37979 - 11905: 0xE86B, + 37980 - 11905: 0xE86C, + 37981 - 11905: 0xE86D, + 37982 - 11905: 0xE86E, + 37983 - 11905: 0xE86F, + 37984 - 11905: 0xE870, + 37985 - 11905: 0xE871, + 37986 - 11905: 0xE872, + 37987 - 11905: 0xE873, + 37988 - 11905: 0xE874, + 37989 - 11905: 0xE875, + 37990 - 11905: 0xE876, + 37991 - 11905: 0xE877, + 37992 - 11905: 0xE878, + 37993 - 11905: 0xE879, + 37994 - 11905: 0xE87A, + 37995 - 11905: 0xF6CE, + 37996 - 11905: 0xE87B, + 37997 - 11905: 0xE87C, + 37998 - 11905: 0xE87D, + 37999 - 11905: 0xE87E, + 38000 - 11905: 0xE880, + 38001 - 11905: 0xE881, + 38002 - 11905: 0xE882, + 38003 - 11905: 0xE883, + 38004 - 11905: 0xE884, + 38005 - 11905: 0xE885, + 38006 - 11905: 0xE886, + 38007 - 11905: 0xE887, + 38008 - 11905: 0xE888, + 38009 - 11905: 0xE889, + 38010 - 11905: 0xE88A, + 38011 - 11905: 0xE88B, + 38012 - 11905: 0xE88C, + 38013 - 11905: 0xE88D, + 38014 - 11905: 0xE88E, + 38015 - 11905: 0xE88F, + 38016 - 11905: 0xE890, + 38017 - 11905: 0xE891, + 38018 - 11905: 0xE892, + 38019 - 11905: 0xE893, + 38020 - 11905: 0xE894, + 38021 - 11905: 0xEEC4, + 38022 - 11905: 0xEEC5, + 38023 - 11905: 0xEEC6, + 38024 - 11905: 0xD5EB, + 38025 - 11905: 0xB6A4, + 38026 - 11905: 0xEEC8, + 38027 - 11905: 0xEEC7, + 38028 - 11905: 0xEEC9, + 38029 - 11905: 0xEECA, + 38030 - 11905: 0xC7A5, + 38031 - 11905: 0xEECB, + 38032 - 11905: 0xEECC, + 38033 - 11905: 0xE895, + 38034 - 11905: 0xB7B0, + 38035 - 11905: 0xB5F6, + 38036 - 11905: 0xEECD, + 38037 - 11905: 0xEECF, + 38038 - 11905: 0xE896, + 38039 - 11905: 0xEECE, + 38040 - 11905: 0xE897, + 38041 - 11905: 0xB8C6, + 38042 - 11905: 0xEED0, + 38043 - 11905: 0xEED1, + 38044 - 11905: 0xEED2, + 38045 - 11905: 0xB6DB, + 38046 - 11905: 0xB3AE, + 38047 - 11905: 0xD6D3, + 38048 - 11905: 0xC4C6, + 38049 - 11905: 0xB1B5, + 38050 - 11905: 0xB8D6, + 38051 - 11905: 0xEED3, + 38052 - 11905: 0xEED4, + 38053 - 11905: 0xD4BF, + 38054 - 11905: 0xC7D5, + 38055 - 11905: 0xBEFB, + 38056 - 11905: 0xCED9, + 38057 - 11905: 0xB9B3, + 38058 - 11905: 0xEED6, + 38059 - 11905: 0xEED5, + 38060 - 11905: 0xEED8, + 38061 - 11905: 0xEED7, + 38062 - 11905: 0xC5A5, + 38063 - 11905: 0xEED9, + 38064 - 11905: 0xEEDA, + 38065 - 11905: 0xC7AE, + 38066 - 11905: 0xEEDB, + 38067 - 11905: 0xC7AF, + 38068 - 11905: 0xEEDC, + 38069 - 11905: 0xB2A7, + 38070 - 11905: 0xEEDD, + 38071 - 11905: 0xEEDE, + 38072 - 11905: 0xEEDF, + 38073 - 11905: 0xEEE0, + 38074 - 11905: 0xEEE1, + 38075 - 11905: 0xD7EA, + 38076 - 11905: 0xEEE2, + 38077 - 11905: 0xEEE3, + 38078 - 11905: 0xBCD8, + 38079 - 11905: 0xEEE4, + 38080 - 11905: 0xD3CB, + 38081 - 11905: 0xCCFA, + 38082 - 11905: 0xB2AC, + 38083 - 11905: 0xC1E5, + 38084 - 11905: 0xEEE5, + 38085 - 11905: 0xC7A6, + 38086 - 11905: 0xC3AD, + 38087 - 11905: 0xE898, + 38088 - 11905: 0xEEE6, + 38089 - 11905: 0xEEE7, + 38090 - 11905: 0xEEE8, + 38091 - 11905: 0xEEE9, + 38092 - 11905: 0xEEEA, + 38093 - 11905: 0xEEEB, + 38094 - 11905: 0xEEEC, + 38095 - 11905: 0xE899, + 38096 - 11905: 0xEEED, + 38097 - 11905: 0xEEEE, + 38098 - 11905: 0xEEEF, + 38099 - 11905: 0xE89A, + 38100 - 11905: 0xE89B, + 38101 - 11905: 0xEEF0, + 38102 - 11905: 0xEEF1, + 38103 - 11905: 0xEEF2, + 38104 - 11905: 0xEEF4, + 38105 - 11905: 0xEEF3, + 38106 - 11905: 0xE89C, + 38107 - 11905: 0xEEF5, + 38108 - 11905: 0xCDAD, + 38109 - 11905: 0xC2C1, + 38110 - 11905: 0xEEF6, + 38111 - 11905: 0xEEF7, + 38112 - 11905: 0xEEF8, + 38113 - 11905: 0xD5A1, + 38114 - 11905: 0xEEF9, + 38115 - 11905: 0xCFB3, + 38116 - 11905: 0xEEFA, + 38117 - 11905: 0xEEFB, + 38118 - 11905: 0xE89D, + 38119 - 11905: 0xEEFC, + 38120 - 11905: 0xEEFD, + 38121 - 11905: 0xEFA1, + 38122 - 11905: 0xEEFE, + 38123 - 11905: 0xEFA2, + 38124 - 11905: 0xB8F5, + 38125 - 11905: 0xC3FA, + 38126 - 11905: 0xEFA3, + 38127 - 11905: 0xEFA4, + 38128 - 11905: 0xBDC2, + 38129 - 11905: 0xD2BF, + 38130 - 11905: 0xB2F9, + 38131 - 11905: 0xEFA5, + 38132 - 11905: 0xEFA6, + 38133 - 11905: 0xEFA7, + 38134 - 11905: 0xD2F8, + 38135 - 11905: 0xEFA8, + 38136 - 11905: 0xD6FD, + 38137 - 11905: 0xEFA9, + 38138 - 11905: 0xC6CC, + 38139 - 11905: 0xE89E, + 38140 - 11905: 0xEFAA, + 38141 - 11905: 0xEFAB, + 38142 - 11905: 0xC1B4, + 38143 - 11905: 0xEFAC, + 38144 - 11905: 0xCFFA, + 38145 - 11905: 0xCBF8, + 38146 - 11905: 0xEFAE, + 38147 - 11905: 0xEFAD, + 38148 - 11905: 0xB3FA, + 38149 - 11905: 0xB9F8, + 38150 - 11905: 0xEFAF, + 38151 - 11905: 0xEFB0, + 38152 - 11905: 0xD0E2, + 38153 - 11905: 0xEFB1, + 38154 - 11905: 0xEFB2, + 38155 - 11905: 0xB7E6, + 38156 - 11905: 0xD0BF, + 38157 - 11905: 0xEFB3, + 38158 - 11905: 0xEFB4, + 38159 - 11905: 0xEFB5, + 38160 - 11905: 0xC8F1, + 38161 - 11905: 0xCCE0, + 38162 - 11905: 0xEFB6, + 38163 - 11905: 0xEFB7, + 38164 - 11905: 0xEFB8, + 38165 - 11905: 0xEFB9, + 38166 - 11905: 0xEFBA, + 38167 - 11905: 0xD5E0, + 38168 - 11905: 0xEFBB, + 38169 - 11905: 0xB4ED, + 38170 - 11905: 0xC3AA, + 38171 - 11905: 0xEFBC, + 38172 - 11905: 0xE89F, + 38173 - 11905: 0xEFBD, + 38174 - 11905: 0xEFBE, + 38175 - 11905: 0xEFBF, + 38176 - 11905: 0xE8A0, + 38177 - 11905: 0xCEFD, + 38178 - 11905: 0xEFC0, + 38179 - 11905: 0xC2E0, + 38180 - 11905: 0xB4B8, + 38181 - 11905: 0xD7B6, + 38182 - 11905: 0xBDF5, + 38183 - 11905: 0xE940, + 38184 - 11905: 0xCFC7, + 38185 - 11905: 0xEFC3, + 38186 - 11905: 0xEFC1, + 38187 - 11905: 0xEFC2, + 38188 - 11905: 0xEFC4, + 38189 - 11905: 0xB6A7, + 38190 - 11905: 0xBCFC, + 38191 - 11905: 0xBEE2, + 38192 - 11905: 0xC3CC, + 38193 - 11905: 0xEFC5, + 38194 - 11905: 0xEFC6, + 38195 - 11905: 0xE941, + 38196 - 11905: 0xEFC7, + 38197 - 11905: 0xEFCF, + 38198 - 11905: 0xEFC8, + 38199 - 11905: 0xEFC9, + 38200 - 11905: 0xEFCA, + 38201 - 11905: 0xC7C2, + 38202 - 11905: 0xEFF1, + 38203 - 11905: 0xB6CD, + 38204 - 11905: 0xEFCB, + 38205 - 11905: 0xE942, + 38206 - 11905: 0xEFCC, + 38207 - 11905: 0xEFCD, + 38208 - 11905: 0xB6C6, + 38209 - 11905: 0xC3BE, + 38210 - 11905: 0xEFCE, + 38211 - 11905: 0xE943, + 38212 - 11905: 0xEFD0, + 38213 - 11905: 0xEFD1, + 38214 - 11905: 0xEFD2, + 38215 - 11905: 0xD5F2, + 38216 - 11905: 0xE944, + 38217 - 11905: 0xEFD3, + 38218 - 11905: 0xC4F7, + 38219 - 11905: 0xE945, + 38220 - 11905: 0xEFD4, + 38221 - 11905: 0xC4F8, + 38222 - 11905: 0xEFD5, + 38223 - 11905: 0xEFD6, + 38224 - 11905: 0xB8E4, + 38225 - 11905: 0xB0F7, + 38226 - 11905: 0xEFD7, + 38227 - 11905: 0xEFD8, + 38228 - 11905: 0xEFD9, + 38229 - 11905: 0xE946, + 38230 - 11905: 0xEFDA, + 38231 - 11905: 0xEFDB, + 38232 - 11905: 0xEFDC, + 38233 - 11905: 0xEFDD, + 38234 - 11905: 0xE947, + 38235 - 11905: 0xEFDE, + 38236 - 11905: 0xBEB5, + 38237 - 11905: 0xEFE1, + 38238 - 11905: 0xEFDF, + 38239 - 11905: 0xEFE0, + 38240 - 11905: 0xE948, + 38241 - 11905: 0xEFE2, + 38242 - 11905: 0xEFE3, + 38243 - 11905: 0xC1CD, + 38244 - 11905: 0xEFE4, + 38245 - 11905: 0xEFE5, + 38246 - 11905: 0xEFE6, + 38247 - 11905: 0xEFE7, + 38248 - 11905: 0xEFE8, + 38249 - 11905: 0xEFE9, + 38250 - 11905: 0xEFEA, + 38251 - 11905: 0xEFEB, + 38252 - 11905: 0xEFEC, + 38253 - 11905: 0xC0D8, + 38254 - 11905: 0xE949, + 38255 - 11905: 0xEFED, + 38256 - 11905: 0xC1AD, + 38257 - 11905: 0xEFEE, + 38258 - 11905: 0xEFEF, + 38259 - 11905: 0xEFF0, + 38260 - 11905: 0xE94A, + 38261 - 11905: 0xE94B, + 38262 - 11905: 0xCFE2, + 38263 - 11905: 0xE94C, + 38264 - 11905: 0xE94D, + 38265 - 11905: 0xE94E, + 38266 - 11905: 0xE94F, + 38267 - 11905: 0xE950, + 38268 - 11905: 0xE951, + 38269 - 11905: 0xE952, + 38270 - 11905: 0xE953, + 38271 - 11905: 0xB3A4, + 38272 - 11905: 0xE954, + 38273 - 11905: 0xE955, + 38274 - 11905: 0xE956, + 38275 - 11905: 0xE957, + 38276 - 11905: 0xE958, + 38277 - 11905: 0xE959, + 38278 - 11905: 0xE95A, + 38279 - 11905: 0xE95B, + 38280 - 11905: 0xE95C, + 38281 - 11905: 0xE95D, + 38282 - 11905: 0xE95E, + 38283 - 11905: 0xE95F, + 38284 - 11905: 0xE960, + 38285 - 11905: 0xE961, + 38286 - 11905: 0xE962, + 38287 - 11905: 0xE963, + 38288 - 11905: 0xE964, + 38289 - 11905: 0xE965, + 38290 - 11905: 0xE966, + 38291 - 11905: 0xE967, + 38292 - 11905: 0xE968, + 38293 - 11905: 0xE969, + 38294 - 11905: 0xE96A, + 38295 - 11905: 0xE96B, + 38296 - 11905: 0xE96C, + 38297 - 11905: 0xE96D, + 38298 - 11905: 0xE96E, + 38299 - 11905: 0xE96F, + 38300 - 11905: 0xE970, + 38301 - 11905: 0xE971, + 38302 - 11905: 0xE972, + 38303 - 11905: 0xE973, + 38304 - 11905: 0xE974, + 38305 - 11905: 0xE975, + 38306 - 11905: 0xE976, + 38307 - 11905: 0xE977, + 38308 - 11905: 0xE978, + 38309 - 11905: 0xE979, + 38310 - 11905: 0xE97A, + 38311 - 11905: 0xE97B, + 38312 - 11905: 0xE97C, + 38313 - 11905: 0xE97D, + 38314 - 11905: 0xE97E, + 38315 - 11905: 0xE980, + 38316 - 11905: 0xE981, + 38317 - 11905: 0xE982, + 38318 - 11905: 0xE983, + 38319 - 11905: 0xE984, + 38320 - 11905: 0xE985, + 38321 - 11905: 0xE986, + 38322 - 11905: 0xE987, + 38323 - 11905: 0xE988, + 38324 - 11905: 0xE989, + 38325 - 11905: 0xE98A, + 38326 - 11905: 0xE98B, + 38327 - 11905: 0xE98C, + 38328 - 11905: 0xE98D, + 38329 - 11905: 0xE98E, + 38330 - 11905: 0xE98F, + 38331 - 11905: 0xE990, + 38332 - 11905: 0xE991, + 38333 - 11905: 0xE992, + 38334 - 11905: 0xE993, + 38335 - 11905: 0xE994, + 38336 - 11905: 0xE995, + 38337 - 11905: 0xE996, + 38338 - 11905: 0xE997, + 38339 - 11905: 0xE998, + 38340 - 11905: 0xE999, + 38341 - 11905: 0xE99A, + 38342 - 11905: 0xE99B, + 38343 - 11905: 0xE99C, + 38344 - 11905: 0xE99D, + 38345 - 11905: 0xE99E, + 38346 - 11905: 0xE99F, + 38347 - 11905: 0xE9A0, + 38348 - 11905: 0xEA40, + 38349 - 11905: 0xEA41, + 38350 - 11905: 0xEA42, + 38351 - 11905: 0xEA43, + 38352 - 11905: 0xEA44, + 38353 - 11905: 0xEA45, + 38354 - 11905: 0xEA46, + 38355 - 11905: 0xEA47, + 38356 - 11905: 0xEA48, + 38357 - 11905: 0xEA49, + 38358 - 11905: 0xEA4A, + 38359 - 11905: 0xEA4B, + 38360 - 11905: 0xEA4C, + 38361 - 11905: 0xEA4D, + 38362 - 11905: 0xEA4E, + 38363 - 11905: 0xEA4F, + 38364 - 11905: 0xEA50, + 38365 - 11905: 0xEA51, + 38366 - 11905: 0xEA52, + 38367 - 11905: 0xEA53, + 38368 - 11905: 0xEA54, + 38369 - 11905: 0xEA55, + 38370 - 11905: 0xEA56, + 38371 - 11905: 0xEA57, + 38372 - 11905: 0xEA58, + 38373 - 11905: 0xEA59, + 38374 - 11905: 0xEA5A, + 38375 - 11905: 0xEA5B, + 38376 - 11905: 0xC3C5, + 38377 - 11905: 0xE3C5, + 38378 - 11905: 0xC9C1, + 38379 - 11905: 0xE3C6, + 38380 - 11905: 0xEA5C, + 38381 - 11905: 0xB1D5, + 38382 - 11905: 0xCECA, + 38383 - 11905: 0xB4B3, + 38384 - 11905: 0xC8F2, + 38385 - 11905: 0xE3C7, + 38386 - 11905: 0xCFD0, + 38387 - 11905: 0xE3C8, + 38388 - 11905: 0xBCE4, + 38389 - 11905: 0xE3C9, + 38390 - 11905: 0xE3CA, + 38391 - 11905: 0xC3C6, + 38392 - 11905: 0xD5A2, + 38393 - 11905: 0xC4D6, + 38394 - 11905: 0xB9EB, + 38395 - 11905: 0xCEC5, + 38396 - 11905: 0xE3CB, + 38397 - 11905: 0xC3F6, + 38398 - 11905: 0xE3CC, + 38399 - 11905: 0xEA5D, + 38400 - 11905: 0xB7A7, + 38401 - 11905: 0xB8F3, + 38402 - 11905: 0xBAD2, + 38403 - 11905: 0xE3CD, + 38404 - 11905: 0xE3CE, + 38405 - 11905: 0xD4C4, + 38406 - 11905: 0xE3CF, + 38407 - 11905: 0xEA5E, + 38408 - 11905: 0xE3D0, + 38409 - 11905: 0xD1CB, + 38410 - 11905: 0xE3D1, + 38411 - 11905: 0xE3D2, + 38412 - 11905: 0xE3D3, + 38413 - 11905: 0xE3D4, + 38414 - 11905: 0xD1D6, + 38415 - 11905: 0xE3D5, + 38416 - 11905: 0xB2FB, + 38417 - 11905: 0xC0BB, + 38418 - 11905: 0xE3D6, + 38419 - 11905: 0xEA5F, + 38420 - 11905: 0xC0AB, + 38421 - 11905: 0xE3D7, + 38422 - 11905: 0xE3D8, + 38423 - 11905: 0xE3D9, + 38424 - 11905: 0xEA60, + 38425 - 11905: 0xE3DA, + 38426 - 11905: 0xE3DB, + 38427 - 11905: 0xEA61, + 38428 - 11905: 0xB8B7, + 38429 - 11905: 0xDAE2, + 38430 - 11905: 0xEA62, + 38431 - 11905: 0xB6D3, + 38432 - 11905: 0xEA63, + 38433 - 11905: 0xDAE4, + 38434 - 11905: 0xDAE3, + 38435 - 11905: 0xEA64, + 38436 - 11905: 0xEA65, + 38437 - 11905: 0xEA66, + 38438 - 11905: 0xEA67, + 38439 - 11905: 0xEA68, + 38440 - 11905: 0xEA69, + 38441 - 11905: 0xEA6A, + 38442 - 11905: 0xDAE6, + 38443 - 11905: 0xEA6B, + 38444 - 11905: 0xEA6C, + 38445 - 11905: 0xEA6D, + 38446 - 11905: 0xC8EE, + 38447 - 11905: 0xEA6E, + 38448 - 11905: 0xEA6F, + 38449 - 11905: 0xDAE5, + 38450 - 11905: 0xB7C0, + 38451 - 11905: 0xD1F4, + 38452 - 11905: 0xD2F5, + 38453 - 11905: 0xD5F3, + 38454 - 11905: 0xBDD7, + 38455 - 11905: 0xEA70, + 38456 - 11905: 0xEA71, + 38457 - 11905: 0xEA72, + 38458 - 11905: 0xEA73, + 38459 - 11905: 0xD7E8, + 38460 - 11905: 0xDAE8, + 38461 - 11905: 0xDAE7, + 38462 - 11905: 0xEA74, + 38463 - 11905: 0xB0A2, + 38464 - 11905: 0xCDD3, + 38465 - 11905: 0xEA75, + 38466 - 11905: 0xDAE9, + 38467 - 11905: 0xEA76, + 38468 - 11905: 0xB8BD, + 38469 - 11905: 0xBCCA, + 38470 - 11905: 0xC2BD, + 38471 - 11905: 0xC2A4, + 38472 - 11905: 0xB3C2, + 38473 - 11905: 0xDAEA, + 38474 - 11905: 0xEA77, + 38475 - 11905: 0xC2AA, + 38476 - 11905: 0xC4B0, + 38477 - 11905: 0xBDB5, + 38478 - 11905: 0xEA78, + 38479 - 11905: 0xEA79, + 38480 - 11905: 0xCFDE, + 38481 - 11905: 0xEA7A, + 38482 - 11905: 0xEA7B, + 38483 - 11905: 0xEA7C, + 38484 - 11905: 0xDAEB, + 38485 - 11905: 0xC9C2, + 38486 - 11905: 0xEA7D, + 38487 - 11905: 0xEA7E, + 38488 - 11905: 0xEA80, + 38489 - 11905: 0xEA81, + 38490 - 11905: 0xEA82, + 38491 - 11905: 0xB1DD, + 38492 - 11905: 0xEA83, + 38493 - 11905: 0xEA84, + 38494 - 11905: 0xEA85, + 38495 - 11905: 0xDAEC, + 38496 - 11905: 0xEA86, + 38497 - 11905: 0xB6B8, + 38498 - 11905: 0xD4BA, + 38499 - 11905: 0xEA87, + 38500 - 11905: 0xB3FD, + 38501 - 11905: 0xEA88, + 38502 - 11905: 0xEA89, + 38503 - 11905: 0xDAED, + 38504 - 11905: 0xD4C9, + 38505 - 11905: 0xCFD5, + 38506 - 11905: 0xC5E3, + 38507 - 11905: 0xEA8A, + 38508 - 11905: 0xDAEE, + 38509 - 11905: 0xEA8B, + 38510 - 11905: 0xEA8C, + 38511 - 11905: 0xEA8D, + 38512 - 11905: 0xEA8E, + 38513 - 11905: 0xEA8F, + 38514 - 11905: 0xDAEF, + 38515 - 11905: 0xEA90, + 38516 - 11905: 0xDAF0, + 38517 - 11905: 0xC1EA, + 38518 - 11905: 0xCCD5, + 38519 - 11905: 0xCFDD, + 38520 - 11905: 0xEA91, + 38521 - 11905: 0xEA92, + 38522 - 11905: 0xEA93, + 38523 - 11905: 0xEA94, + 38524 - 11905: 0xEA95, + 38525 - 11905: 0xEA96, + 38526 - 11905: 0xEA97, + 38527 - 11905: 0xEA98, + 38528 - 11905: 0xEA99, + 38529 - 11905: 0xEA9A, + 38530 - 11905: 0xEA9B, + 38531 - 11905: 0xEA9C, + 38532 - 11905: 0xEA9D, + 38533 - 11905: 0xD3E7, + 38534 - 11905: 0xC2A1, + 38535 - 11905: 0xEA9E, + 38536 - 11905: 0xDAF1, + 38537 - 11905: 0xEA9F, + 38538 - 11905: 0xEAA0, + 38539 - 11905: 0xCBE5, + 38540 - 11905: 0xEB40, + 38541 - 11905: 0xDAF2, + 38542 - 11905: 0xEB41, + 38543 - 11905: 0xCBE6, + 38544 - 11905: 0xD2FE, + 38545 - 11905: 0xEB42, + 38546 - 11905: 0xEB43, + 38547 - 11905: 0xEB44, + 38548 - 11905: 0xB8F4, + 38549 - 11905: 0xEB45, + 38550 - 11905: 0xEB46, + 38551 - 11905: 0xDAF3, + 38552 - 11905: 0xB0AF, + 38553 - 11905: 0xCFB6, + 38554 - 11905: 0xEB47, + 38555 - 11905: 0xEB48, + 38556 - 11905: 0xD5CF, + 38557 - 11905: 0xEB49, + 38558 - 11905: 0xEB4A, + 38559 - 11905: 0xEB4B, + 38560 - 11905: 0xEB4C, + 38561 - 11905: 0xEB4D, + 38562 - 11905: 0xEB4E, + 38563 - 11905: 0xEB4F, + 38564 - 11905: 0xEB50, + 38565 - 11905: 0xEB51, + 38566 - 11905: 0xEB52, + 38567 - 11905: 0xCBED, + 38568 - 11905: 0xEB53, + 38569 - 11905: 0xEB54, + 38570 - 11905: 0xEB55, + 38571 - 11905: 0xEB56, + 38572 - 11905: 0xEB57, + 38573 - 11905: 0xEB58, + 38574 - 11905: 0xEB59, + 38575 - 11905: 0xEB5A, + 38576 - 11905: 0xDAF4, + 38577 - 11905: 0xEB5B, + 38578 - 11905: 0xEB5C, + 38579 - 11905: 0xE3C4, + 38580 - 11905: 0xEB5D, + 38581 - 11905: 0xEB5E, + 38582 - 11905: 0xC1A5, + 38583 - 11905: 0xEB5F, + 38584 - 11905: 0xEB60, + 38585 - 11905: 0xF6BF, + 38586 - 11905: 0xEB61, + 38587 - 11905: 0xEB62, + 38588 - 11905: 0xF6C0, + 38589 - 11905: 0xF6C1, + 38590 - 11905: 0xC4D1, + 38591 - 11905: 0xEB63, + 38592 - 11905: 0xC8B8, + 38593 - 11905: 0xD1E3, + 38594 - 11905: 0xEB64, + 38595 - 11905: 0xEB65, + 38596 - 11905: 0xD0DB, + 38597 - 11905: 0xD1C5, + 38598 - 11905: 0xBCAF, + 38599 - 11905: 0xB9CD, + 38600 - 11905: 0xEB66, + 38601 - 11905: 0xEFF4, + 38602 - 11905: 0xEB67, + 38603 - 11905: 0xEB68, + 38604 - 11905: 0xB4C6, + 38605 - 11905: 0xD3BA, + 38606 - 11905: 0xF6C2, + 38607 - 11905: 0xB3FB, + 38608 - 11905: 0xEB69, + 38609 - 11905: 0xEB6A, + 38610 - 11905: 0xF6C3, + 38611 - 11905: 0xEB6B, + 38612 - 11905: 0xEB6C, + 38613 - 11905: 0xB5F1, + 38614 - 11905: 0xEB6D, + 38615 - 11905: 0xEB6E, + 38616 - 11905: 0xEB6F, + 38617 - 11905: 0xEB70, + 38618 - 11905: 0xEB71, + 38619 - 11905: 0xEB72, + 38620 - 11905: 0xEB73, + 38621 - 11905: 0xEB74, + 38622 - 11905: 0xEB75, + 38623 - 11905: 0xEB76, + 38624 - 11905: 0xF6C5, + 38625 - 11905: 0xEB77, + 38626 - 11905: 0xEB78, + 38627 - 11905: 0xEB79, + 38628 - 11905: 0xEB7A, + 38629 - 11905: 0xEB7B, + 38630 - 11905: 0xEB7C, + 38631 - 11905: 0xEB7D, + 38632 - 11905: 0xD3EA, + 38633 - 11905: 0xF6A7, + 38634 - 11905: 0xD1A9, + 38635 - 11905: 0xEB7E, + 38636 - 11905: 0xEB80, + 38637 - 11905: 0xEB81, + 38638 - 11905: 0xEB82, + 38639 - 11905: 0xF6A9, + 38640 - 11905: 0xEB83, + 38641 - 11905: 0xEB84, + 38642 - 11905: 0xEB85, + 38643 - 11905: 0xF6A8, + 38644 - 11905: 0xEB86, + 38645 - 11905: 0xEB87, + 38646 - 11905: 0xC1E3, + 38647 - 11905: 0xC0D7, + 38648 - 11905: 0xEB88, + 38649 - 11905: 0xB1A2, + 38650 - 11905: 0xEB89, + 38651 - 11905: 0xEB8A, + 38652 - 11905: 0xEB8B, + 38653 - 11905: 0xEB8C, + 38654 - 11905: 0xCEED, + 38655 - 11905: 0xEB8D, + 38656 - 11905: 0xD0E8, + 38657 - 11905: 0xF6AB, + 38658 - 11905: 0xEB8E, + 38659 - 11905: 0xEB8F, + 38660 - 11905: 0xCFF6, + 38661 - 11905: 0xEB90, + 38662 - 11905: 0xF6AA, + 38663 - 11905: 0xD5F0, + 38664 - 11905: 0xF6AC, + 38665 - 11905: 0xC3B9, + 38666 - 11905: 0xEB91, + 38667 - 11905: 0xEB92, + 38668 - 11905: 0xEB93, + 38669 - 11905: 0xBBF4, + 38670 - 11905: 0xF6AE, + 38671 - 11905: 0xF6AD, + 38672 - 11905: 0xEB94, + 38673 - 11905: 0xEB95, + 38674 - 11905: 0xEB96, + 38675 - 11905: 0xC4DE, + 38676 - 11905: 0xEB97, + 38677 - 11905: 0xEB98, + 38678 - 11905: 0xC1D8, + 38679 - 11905: 0xEB99, + 38680 - 11905: 0xEB9A, + 38681 - 11905: 0xEB9B, + 38682 - 11905: 0xEB9C, + 38683 - 11905: 0xEB9D, + 38684 - 11905: 0xCBAA, + 38685 - 11905: 0xEB9E, + 38686 - 11905: 0xCFBC, + 38687 - 11905: 0xEB9F, + 38688 - 11905: 0xEBA0, + 38689 - 11905: 0xEC40, + 38690 - 11905: 0xEC41, + 38691 - 11905: 0xEC42, + 38692 - 11905: 0xEC43, + 38693 - 11905: 0xEC44, + 38694 - 11905: 0xEC45, + 38695 - 11905: 0xEC46, + 38696 - 11905: 0xEC47, + 38697 - 11905: 0xEC48, + 38698 - 11905: 0xF6AF, + 38699 - 11905: 0xEC49, + 38700 - 11905: 0xEC4A, + 38701 - 11905: 0xF6B0, + 38702 - 11905: 0xEC4B, + 38703 - 11905: 0xEC4C, + 38704 - 11905: 0xF6B1, + 38705 - 11905: 0xEC4D, + 38706 - 11905: 0xC2B6, + 38707 - 11905: 0xEC4E, + 38708 - 11905: 0xEC4F, + 38709 - 11905: 0xEC50, + 38710 - 11905: 0xEC51, + 38711 - 11905: 0xEC52, + 38712 - 11905: 0xB0D4, + 38713 - 11905: 0xC5F9, + 38714 - 11905: 0xEC53, + 38715 - 11905: 0xEC54, + 38716 - 11905: 0xEC55, + 38717 - 11905: 0xEC56, + 38718 - 11905: 0xF6B2, + 38719 - 11905: 0xEC57, + 38720 - 11905: 0xEC58, + 38721 - 11905: 0xEC59, + 38722 - 11905: 0xEC5A, + 38723 - 11905: 0xEC5B, + 38724 - 11905: 0xEC5C, + 38725 - 11905: 0xEC5D, + 38726 - 11905: 0xEC5E, + 38727 - 11905: 0xEC5F, + 38728 - 11905: 0xEC60, + 38729 - 11905: 0xEC61, + 38730 - 11905: 0xEC62, + 38731 - 11905: 0xEC63, + 38732 - 11905: 0xEC64, + 38733 - 11905: 0xEC65, + 38734 - 11905: 0xEC66, + 38735 - 11905: 0xEC67, + 38736 - 11905: 0xEC68, + 38737 - 11905: 0xEC69, + 38738 - 11905: 0xC7E0, + 38739 - 11905: 0xF6A6, + 38740 - 11905: 0xEC6A, + 38741 - 11905: 0xEC6B, + 38742 - 11905: 0xBEB8, + 38743 - 11905: 0xEC6C, + 38744 - 11905: 0xEC6D, + 38745 - 11905: 0xBEB2, + 38746 - 11905: 0xEC6E, + 38747 - 11905: 0xB5E5, + 38748 - 11905: 0xEC6F, + 38749 - 11905: 0xEC70, + 38750 - 11905: 0xB7C7, + 38751 - 11905: 0xEC71, + 38752 - 11905: 0xBFBF, + 38753 - 11905: 0xC3D2, + 38754 - 11905: 0xC3E6, + 38755 - 11905: 0xEC72, + 38756 - 11905: 0xEC73, + 38757 - 11905: 0xD8CC, + 38758 - 11905: 0xEC74, + 38759 - 11905: 0xEC75, + 38760 - 11905: 0xEC76, + 38761 - 11905: 0xB8EF, + 38762 - 11905: 0xEC77, + 38763 - 11905: 0xEC78, + 38764 - 11905: 0xEC79, + 38765 - 11905: 0xEC7A, + 38766 - 11905: 0xEC7B, + 38767 - 11905: 0xEC7C, + 38768 - 11905: 0xEC7D, + 38769 - 11905: 0xEC7E, + 38770 - 11905: 0xEC80, + 38771 - 11905: 0xBDF9, + 38772 - 11905: 0xD1A5, + 38773 - 11905: 0xEC81, + 38774 - 11905: 0xB0D0, + 38775 - 11905: 0xEC82, + 38776 - 11905: 0xEC83, + 38777 - 11905: 0xEC84, + 38778 - 11905: 0xEC85, + 38779 - 11905: 0xEC86, + 38780 - 11905: 0xF7B0, + 38781 - 11905: 0xEC87, + 38782 - 11905: 0xEC88, + 38783 - 11905: 0xEC89, + 38784 - 11905: 0xEC8A, + 38785 - 11905: 0xEC8B, + 38786 - 11905: 0xEC8C, + 38787 - 11905: 0xEC8D, + 38788 - 11905: 0xEC8E, + 38789 - 11905: 0xF7B1, + 38790 - 11905: 0xEC8F, + 38791 - 11905: 0xEC90, + 38792 - 11905: 0xEC91, + 38793 - 11905: 0xEC92, + 38794 - 11905: 0xEC93, + 38795 - 11905: 0xD0AC, + 38796 - 11905: 0xEC94, + 38797 - 11905: 0xB0B0, + 38798 - 11905: 0xEC95, + 38799 - 11905: 0xEC96, + 38800 - 11905: 0xEC97, + 38801 - 11905: 0xF7B2, + 38802 - 11905: 0xF7B3, + 38803 - 11905: 0xEC98, + 38804 - 11905: 0xF7B4, + 38805 - 11905: 0xEC99, + 38806 - 11905: 0xEC9A, + 38807 - 11905: 0xEC9B, + 38808 - 11905: 0xC7CA, + 38809 - 11905: 0xEC9C, + 38810 - 11905: 0xEC9D, + 38811 - 11905: 0xEC9E, + 38812 - 11905: 0xEC9F, + 38813 - 11905: 0xECA0, + 38814 - 11905: 0xED40, + 38815 - 11905: 0xED41, + 38816 - 11905: 0xBECF, + 38817 - 11905: 0xED42, + 38818 - 11905: 0xED43, + 38819 - 11905: 0xF7B7, + 38820 - 11905: 0xED44, + 38821 - 11905: 0xED45, + 38822 - 11905: 0xED46, + 38823 - 11905: 0xED47, + 38824 - 11905: 0xED48, + 38825 - 11905: 0xED49, + 38826 - 11905: 0xED4A, + 38827 - 11905: 0xF7B6, + 38828 - 11905: 0xED4B, + 38829 - 11905: 0xB1DE, + 38830 - 11905: 0xED4C, + 38831 - 11905: 0xF7B5, + 38832 - 11905: 0xED4D, + 38833 - 11905: 0xED4E, + 38834 - 11905: 0xF7B8, + 38835 - 11905: 0xED4F, + 38836 - 11905: 0xF7B9, + 38837 - 11905: 0xED50, + 38838 - 11905: 0xED51, + 38839 - 11905: 0xED52, + 38840 - 11905: 0xED53, + 38841 - 11905: 0xED54, + 38842 - 11905: 0xED55, + 38843 - 11905: 0xED56, + 38844 - 11905: 0xED57, + 38845 - 11905: 0xED58, + 38846 - 11905: 0xED59, + 38847 - 11905: 0xED5A, + 38848 - 11905: 0xED5B, + 38849 - 11905: 0xED5C, + 38850 - 11905: 0xED5D, + 38851 - 11905: 0xED5E, + 38852 - 11905: 0xED5F, + 38853 - 11905: 0xED60, + 38854 - 11905: 0xED61, + 38855 - 11905: 0xED62, + 38856 - 11905: 0xED63, + 38857 - 11905: 0xED64, + 38858 - 11905: 0xED65, + 38859 - 11905: 0xED66, + 38860 - 11905: 0xED67, + 38861 - 11905: 0xED68, + 38862 - 11905: 0xED69, + 38863 - 11905: 0xED6A, + 38864 - 11905: 0xED6B, + 38865 - 11905: 0xED6C, + 38866 - 11905: 0xED6D, + 38867 - 11905: 0xED6E, + 38868 - 11905: 0xED6F, + 38869 - 11905: 0xED70, + 38870 - 11905: 0xED71, + 38871 - 11905: 0xED72, + 38872 - 11905: 0xED73, + 38873 - 11905: 0xED74, + 38874 - 11905: 0xED75, + 38875 - 11905: 0xED76, + 38876 - 11905: 0xED77, + 38877 - 11905: 0xED78, + 38878 - 11905: 0xED79, + 38879 - 11905: 0xED7A, + 38880 - 11905: 0xED7B, + 38881 - 11905: 0xED7C, + 38882 - 11905: 0xED7D, + 38883 - 11905: 0xED7E, + 38884 - 11905: 0xED80, + 38885 - 11905: 0xED81, + 38886 - 11905: 0xCEA4, + 38887 - 11905: 0xC8CD, + 38888 - 11905: 0xED82, + 38889 - 11905: 0xBAAB, + 38890 - 11905: 0xE8B8, + 38891 - 11905: 0xE8B9, + 38892 - 11905: 0xE8BA, + 38893 - 11905: 0xBEC2, + 38894 - 11905: 0xED83, + 38895 - 11905: 0xED84, + 38896 - 11905: 0xED85, + 38897 - 11905: 0xED86, + 38898 - 11905: 0xED87, + 38899 - 11905: 0xD2F4, + 38900 - 11905: 0xED88, + 38901 - 11905: 0xD4CF, + 38902 - 11905: 0xC9D8, + 38903 - 11905: 0xED89, + 38904 - 11905: 0xED8A, + 38905 - 11905: 0xED8B, + 38906 - 11905: 0xED8C, + 38907 - 11905: 0xED8D, + 38908 - 11905: 0xED8E, + 38909 - 11905: 0xED8F, + 38910 - 11905: 0xED90, + 38911 - 11905: 0xED91, + 38912 - 11905: 0xED92, + 38913 - 11905: 0xED93, + 38914 - 11905: 0xED94, + 38915 - 11905: 0xED95, + 38916 - 11905: 0xED96, + 38917 - 11905: 0xED97, + 38918 - 11905: 0xED98, + 38919 - 11905: 0xED99, + 38920 - 11905: 0xED9A, + 38921 - 11905: 0xED9B, + 38922 - 11905: 0xED9C, + 38923 - 11905: 0xED9D, + 38924 - 11905: 0xED9E, + 38925 - 11905: 0xED9F, + 38926 - 11905: 0xEDA0, + 38927 - 11905: 0xEE40, + 38928 - 11905: 0xEE41, + 38929 - 11905: 0xEE42, + 38930 - 11905: 0xEE43, + 38931 - 11905: 0xEE44, + 38932 - 11905: 0xEE45, + 38933 - 11905: 0xEE46, + 38934 - 11905: 0xEE47, + 38935 - 11905: 0xEE48, + 38936 - 11905: 0xEE49, + 38937 - 11905: 0xEE4A, + 38938 - 11905: 0xEE4B, + 38939 - 11905: 0xEE4C, + 38940 - 11905: 0xEE4D, + 38941 - 11905: 0xEE4E, + 38942 - 11905: 0xEE4F, + 38943 - 11905: 0xEE50, + 38944 - 11905: 0xEE51, + 38945 - 11905: 0xEE52, + 38946 - 11905: 0xEE53, + 38947 - 11905: 0xEE54, + 38948 - 11905: 0xEE55, + 38949 - 11905: 0xEE56, + 38950 - 11905: 0xEE57, + 38951 - 11905: 0xEE58, + 38952 - 11905: 0xEE59, + 38953 - 11905: 0xEE5A, + 38954 - 11905: 0xEE5B, + 38955 - 11905: 0xEE5C, + 38956 - 11905: 0xEE5D, + 38957 - 11905: 0xEE5E, + 38958 - 11905: 0xEE5F, + 38959 - 11905: 0xEE60, + 38960 - 11905: 0xEE61, + 38961 - 11905: 0xEE62, + 38962 - 11905: 0xEE63, + 38963 - 11905: 0xEE64, + 38964 - 11905: 0xEE65, + 38965 - 11905: 0xEE66, + 38966 - 11905: 0xEE67, + 38967 - 11905: 0xEE68, + 38968 - 11905: 0xEE69, + 38969 - 11905: 0xEE6A, + 38970 - 11905: 0xEE6B, + 38971 - 11905: 0xEE6C, + 38972 - 11905: 0xEE6D, + 38973 - 11905: 0xEE6E, + 38974 - 11905: 0xEE6F, + 38975 - 11905: 0xEE70, + 38976 - 11905: 0xEE71, + 38977 - 11905: 0xEE72, + 38978 - 11905: 0xEE73, + 38979 - 11905: 0xEE74, + 38980 - 11905: 0xEE75, + 38981 - 11905: 0xEE76, + 38982 - 11905: 0xEE77, + 38983 - 11905: 0xEE78, + 38984 - 11905: 0xEE79, + 38985 - 11905: 0xEE7A, + 38986 - 11905: 0xEE7B, + 38987 - 11905: 0xEE7C, + 38988 - 11905: 0xEE7D, + 38989 - 11905: 0xEE7E, + 38990 - 11905: 0xEE80, + 38991 - 11905: 0xEE81, + 38992 - 11905: 0xEE82, + 38993 - 11905: 0xEE83, + 38994 - 11905: 0xEE84, + 38995 - 11905: 0xEE85, + 38996 - 11905: 0xEE86, + 38997 - 11905: 0xEE87, + 38998 - 11905: 0xEE88, + 38999 - 11905: 0xEE89, + 39000 - 11905: 0xEE8A, + 39001 - 11905: 0xEE8B, + 39002 - 11905: 0xEE8C, + 39003 - 11905: 0xEE8D, + 39004 - 11905: 0xEE8E, + 39005 - 11905: 0xEE8F, + 39006 - 11905: 0xEE90, + 39007 - 11905: 0xEE91, + 39008 - 11905: 0xEE92, + 39009 - 11905: 0xEE93, + 39010 - 11905: 0xEE94, + 39011 - 11905: 0xEE95, + 39012 - 11905: 0xEE96, + 39013 - 11905: 0xEE97, + 39014 - 11905: 0xEE98, + 39015 - 11905: 0xEE99, + 39016 - 11905: 0xEE9A, + 39017 - 11905: 0xEE9B, + 39018 - 11905: 0xEE9C, + 39019 - 11905: 0xEE9D, + 39020 - 11905: 0xEE9E, + 39021 - 11905: 0xEE9F, + 39022 - 11905: 0xEEA0, + 39023 - 11905: 0xEF40, + 39024 - 11905: 0xEF41, + 39025 - 11905: 0xEF42, + 39026 - 11905: 0xEF43, + 39027 - 11905: 0xEF44, + 39028 - 11905: 0xEF45, + 39029 - 11905: 0xD2B3, + 39030 - 11905: 0xB6A5, + 39031 - 11905: 0xC7EA, + 39032 - 11905: 0xF1FC, + 39033 - 11905: 0xCFEE, + 39034 - 11905: 0xCBB3, + 39035 - 11905: 0xD0EB, + 39036 - 11905: 0xE7EF, + 39037 - 11905: 0xCDE7, + 39038 - 11905: 0xB9CB, + 39039 - 11905: 0xB6D9, + 39040 - 11905: 0xF1FD, + 39041 - 11905: 0xB0E4, + 39042 - 11905: 0xCBCC, + 39043 - 11905: 0xF1FE, + 39044 - 11905: 0xD4A4, + 39045 - 11905: 0xC2AD, + 39046 - 11905: 0xC1EC, + 39047 - 11905: 0xC6C4, + 39048 - 11905: 0xBEB1, + 39049 - 11905: 0xF2A1, + 39050 - 11905: 0xBCD5, + 39051 - 11905: 0xEF46, + 39052 - 11905: 0xF2A2, + 39053 - 11905: 0xF2A3, + 39054 - 11905: 0xEF47, + 39055 - 11905: 0xF2A4, + 39056 - 11905: 0xD2C3, + 39057 - 11905: 0xC6B5, + 39058 - 11905: 0xEF48, + 39059 - 11905: 0xCDC7, + 39060 - 11905: 0xF2A5, + 39061 - 11905: 0xEF49, + 39062 - 11905: 0xD3B1, + 39063 - 11905: 0xBFC5, + 39064 - 11905: 0xCCE2, + 39065 - 11905: 0xEF4A, + 39066 - 11905: 0xF2A6, + 39067 - 11905: 0xF2A7, + 39068 - 11905: 0xD1D5, + 39069 - 11905: 0xB6EE, + 39070 - 11905: 0xF2A8, + 39071 - 11905: 0xF2A9, + 39072 - 11905: 0xB5DF, + 39073 - 11905: 0xF2AA, + 39074 - 11905: 0xF2AB, + 39075 - 11905: 0xEF4B, + 39076 - 11905: 0xB2FC, + 39077 - 11905: 0xF2AC, + 39078 - 11905: 0xF2AD, + 39079 - 11905: 0xC8A7, + 39080 - 11905: 0xEF4C, + 39081 - 11905: 0xEF4D, + 39082 - 11905: 0xEF4E, + 39083 - 11905: 0xEF4F, + 39084 - 11905: 0xEF50, + 39085 - 11905: 0xEF51, + 39086 - 11905: 0xEF52, + 39087 - 11905: 0xEF53, + 39088 - 11905: 0xEF54, + 39089 - 11905: 0xEF55, + 39090 - 11905: 0xEF56, + 39091 - 11905: 0xEF57, + 39092 - 11905: 0xEF58, + 39093 - 11905: 0xEF59, + 39094 - 11905: 0xEF5A, + 39095 - 11905: 0xEF5B, + 39096 - 11905: 0xEF5C, + 39097 - 11905: 0xEF5D, + 39098 - 11905: 0xEF5E, + 39099 - 11905: 0xEF5F, + 39100 - 11905: 0xEF60, + 39101 - 11905: 0xEF61, + 39102 - 11905: 0xEF62, + 39103 - 11905: 0xEF63, + 39104 - 11905: 0xEF64, + 39105 - 11905: 0xEF65, + 39106 - 11905: 0xEF66, + 39107 - 11905: 0xEF67, + 39108 - 11905: 0xEF68, + 39109 - 11905: 0xEF69, + 39110 - 11905: 0xEF6A, + 39111 - 11905: 0xEF6B, + 39112 - 11905: 0xEF6C, + 39113 - 11905: 0xEF6D, + 39114 - 11905: 0xEF6E, + 39115 - 11905: 0xEF6F, + 39116 - 11905: 0xEF70, + 39117 - 11905: 0xEF71, + 39118 - 11905: 0xB7E7, + 39119 - 11905: 0xEF72, + 39120 - 11905: 0xEF73, + 39121 - 11905: 0xECA9, + 39122 - 11905: 0xECAA, + 39123 - 11905: 0xECAB, + 39124 - 11905: 0xEF74, + 39125 - 11905: 0xECAC, + 39126 - 11905: 0xEF75, + 39127 - 11905: 0xEF76, + 39128 - 11905: 0xC6AE, + 39129 - 11905: 0xECAD, + 39130 - 11905: 0xECAE, + 39131 - 11905: 0xEF77, + 39132 - 11905: 0xEF78, + 39133 - 11905: 0xEF79, + 39134 - 11905: 0xB7C9, + 39135 - 11905: 0xCAB3, + 39136 - 11905: 0xEF7A, + 39137 - 11905: 0xEF7B, + 39138 - 11905: 0xEF7C, + 39139 - 11905: 0xEF7D, + 39140 - 11905: 0xEF7E, + 39141 - 11905: 0xEF80, + 39142 - 11905: 0xEF81, + 39143 - 11905: 0xE2B8, + 39144 - 11905: 0xF7CF, + 39145 - 11905: 0xEF82, + 39146 - 11905: 0xEF83, + 39147 - 11905: 0xEF84, + 39148 - 11905: 0xEF85, + 39149 - 11905: 0xEF86, + 39150 - 11905: 0xEF87, + 39151 - 11905: 0xEF88, + 39152 - 11905: 0xEF89, + 39153 - 11905: 0xEF8A, + 39154 - 11905: 0xEF8B, + 39155 - 11905: 0xEF8C, + 39156 - 11905: 0xEF8D, + 39157 - 11905: 0xEF8E, + 39158 - 11905: 0xEF8F, + 39159 - 11905: 0xEF90, + 39160 - 11905: 0xEF91, + 39161 - 11905: 0xEF92, + 39162 - 11905: 0xEF93, + 39163 - 11905: 0xEF94, + 39164 - 11905: 0xEF95, + 39165 - 11905: 0xEF96, + 39166 - 11905: 0xEF97, + 39167 - 11905: 0xEF98, + 39168 - 11905: 0xEF99, + 39169 - 11905: 0xEF9A, + 39170 - 11905: 0xEF9B, + 39171 - 11905: 0xEF9C, + 39172 - 11905: 0xEF9D, + 39173 - 11905: 0xEF9E, + 39174 - 11905: 0xEF9F, + 39175 - 11905: 0xEFA0, + 39176 - 11905: 0xF040, + 39177 - 11905: 0xF041, + 39178 - 11905: 0xF042, + 39179 - 11905: 0xF043, + 39180 - 11905: 0xF044, + 39181 - 11905: 0xF7D0, + 39182 - 11905: 0xF045, + 39183 - 11905: 0xF046, + 39184 - 11905: 0xB2CD, + 39185 - 11905: 0xF047, + 39186 - 11905: 0xF048, + 39187 - 11905: 0xF049, + 39188 - 11905: 0xF04A, + 39189 - 11905: 0xF04B, + 39190 - 11905: 0xF04C, + 39191 - 11905: 0xF04D, + 39192 - 11905: 0xF04E, + 39193 - 11905: 0xF04F, + 39194 - 11905: 0xF050, + 39195 - 11905: 0xF051, + 39196 - 11905: 0xF052, + 39197 - 11905: 0xF053, + 39198 - 11905: 0xF054, + 39199 - 11905: 0xF055, + 39200 - 11905: 0xF056, + 39201 - 11905: 0xF057, + 39202 - 11905: 0xF058, + 39203 - 11905: 0xF059, + 39204 - 11905: 0xF05A, + 39205 - 11905: 0xF05B, + 39206 - 11905: 0xF05C, + 39207 - 11905: 0xF05D, + 39208 - 11905: 0xF05E, + 39209 - 11905: 0xF05F, + 39210 - 11905: 0xF060, + 39211 - 11905: 0xF061, + 39212 - 11905: 0xF062, + 39213 - 11905: 0xF063, + 39214 - 11905: 0xF7D1, + 39215 - 11905: 0xF064, + 39216 - 11905: 0xF065, + 39217 - 11905: 0xF066, + 39218 - 11905: 0xF067, + 39219 - 11905: 0xF068, + 39220 - 11905: 0xF069, + 39221 - 11905: 0xF06A, + 39222 - 11905: 0xF06B, + 39223 - 11905: 0xF06C, + 39224 - 11905: 0xF06D, + 39225 - 11905: 0xF06E, + 39226 - 11905: 0xF06F, + 39227 - 11905: 0xF070, + 39228 - 11905: 0xF071, + 39229 - 11905: 0xF072, + 39230 - 11905: 0xF073, + 39231 - 11905: 0xF074, + 39232 - 11905: 0xF075, + 39233 - 11905: 0xF076, + 39234 - 11905: 0xF077, + 39235 - 11905: 0xF078, + 39236 - 11905: 0xF079, + 39237 - 11905: 0xF07A, + 39238 - 11905: 0xF07B, + 39239 - 11905: 0xF07C, + 39240 - 11905: 0xF07D, + 39241 - 11905: 0xF07E, + 39242 - 11905: 0xF080, + 39243 - 11905: 0xF081, + 39244 - 11905: 0xF082, + 39245 - 11905: 0xF083, + 39246 - 11905: 0xF084, + 39247 - 11905: 0xF085, + 39248 - 11905: 0xF086, + 39249 - 11905: 0xF087, + 39250 - 11905: 0xF088, + 39251 - 11905: 0xF089, + 39252 - 11905: 0xF7D3, + 39253 - 11905: 0xF7D2, + 39254 - 11905: 0xF08A, + 39255 - 11905: 0xF08B, + 39256 - 11905: 0xF08C, + 39257 - 11905: 0xF08D, + 39258 - 11905: 0xF08E, + 39259 - 11905: 0xF08F, + 39260 - 11905: 0xF090, + 39261 - 11905: 0xF091, + 39262 - 11905: 0xF092, + 39263 - 11905: 0xF093, + 39264 - 11905: 0xF094, + 39265 - 11905: 0xF095, + 39266 - 11905: 0xF096, + 39267 - 11905: 0xE2BB, + 39268 - 11905: 0xF097, + 39269 - 11905: 0xBCA2, + 39270 - 11905: 0xF098, + 39271 - 11905: 0xE2BC, + 39272 - 11905: 0xE2BD, + 39273 - 11905: 0xE2BE, + 39274 - 11905: 0xE2BF, + 39275 - 11905: 0xE2C0, + 39276 - 11905: 0xE2C1, + 39277 - 11905: 0xB7B9, + 39278 - 11905: 0xD2FB, + 39279 - 11905: 0xBDA4, + 39280 - 11905: 0xCACE, + 39281 - 11905: 0xB1A5, + 39282 - 11905: 0xCBC7, + 39283 - 11905: 0xF099, + 39284 - 11905: 0xE2C2, + 39285 - 11905: 0xB6FC, + 39286 - 11905: 0xC8C4, + 39287 - 11905: 0xE2C3, + 39288 - 11905: 0xF09A, + 39289 - 11905: 0xF09B, + 39290 - 11905: 0xBDC8, + 39291 - 11905: 0xF09C, + 39292 - 11905: 0xB1FD, + 39293 - 11905: 0xE2C4, + 39294 - 11905: 0xF09D, + 39295 - 11905: 0xB6F6, + 39296 - 11905: 0xE2C5, + 39297 - 11905: 0xC4D9, + 39298 - 11905: 0xF09E, + 39299 - 11905: 0xF09F, + 39300 - 11905: 0xE2C6, + 39301 - 11905: 0xCFDA, + 39302 - 11905: 0xB9DD, + 39303 - 11905: 0xE2C7, + 39304 - 11905: 0xC0A1, + 39305 - 11905: 0xF0A0, + 39306 - 11905: 0xE2C8, + 39307 - 11905: 0xB2F6, + 39308 - 11905: 0xF140, + 39309 - 11905: 0xE2C9, + 39310 - 11905: 0xF141, + 39311 - 11905: 0xC1F3, + 39312 - 11905: 0xE2CA, + 39313 - 11905: 0xE2CB, + 39314 - 11905: 0xC2F8, + 39315 - 11905: 0xE2CC, + 39316 - 11905: 0xE2CD, + 39317 - 11905: 0xE2CE, + 39318 - 11905: 0xCAD7, + 39319 - 11905: 0xD8B8, + 39320 - 11905: 0xD9E5, + 39321 - 11905: 0xCFE3, + 39322 - 11905: 0xF142, + 39323 - 11905: 0xF143, + 39324 - 11905: 0xF144, + 39325 - 11905: 0xF145, + 39326 - 11905: 0xF146, + 39327 - 11905: 0xF147, + 39328 - 11905: 0xF148, + 39329 - 11905: 0xF149, + 39330 - 11905: 0xF14A, + 39331 - 11905: 0xF14B, + 39332 - 11905: 0xF14C, + 39333 - 11905: 0xF0A5, + 39334 - 11905: 0xF14D, + 39335 - 11905: 0xF14E, + 39336 - 11905: 0xDCB0, + 39337 - 11905: 0xF14F, + 39338 - 11905: 0xF150, + 39339 - 11905: 0xF151, + 39340 - 11905: 0xF152, + 39341 - 11905: 0xF153, + 39342 - 11905: 0xF154, + 39343 - 11905: 0xF155, + 39344 - 11905: 0xF156, + 39345 - 11905: 0xF157, + 39346 - 11905: 0xF158, + 39347 - 11905: 0xF159, + 39348 - 11905: 0xF15A, + 39349 - 11905: 0xF15B, + 39350 - 11905: 0xF15C, + 39351 - 11905: 0xF15D, + 39352 - 11905: 0xF15E, + 39353 - 11905: 0xF15F, + 39354 - 11905: 0xF160, + 39355 - 11905: 0xF161, + 39356 - 11905: 0xF162, + 39357 - 11905: 0xF163, + 39358 - 11905: 0xF164, + 39359 - 11905: 0xF165, + 39360 - 11905: 0xF166, + 39361 - 11905: 0xF167, + 39362 - 11905: 0xF168, + 39363 - 11905: 0xF169, + 39364 - 11905: 0xF16A, + 39365 - 11905: 0xF16B, + 39366 - 11905: 0xF16C, + 39367 - 11905: 0xF16D, + 39368 - 11905: 0xF16E, + 39369 - 11905: 0xF16F, + 39370 - 11905: 0xF170, + 39371 - 11905: 0xF171, + 39372 - 11905: 0xF172, + 39373 - 11905: 0xF173, + 39374 - 11905: 0xF174, + 39375 - 11905: 0xF175, + 39376 - 11905: 0xF176, + 39377 - 11905: 0xF177, + 39378 - 11905: 0xF178, + 39379 - 11905: 0xF179, + 39380 - 11905: 0xF17A, + 39381 - 11905: 0xF17B, + 39382 - 11905: 0xF17C, + 39383 - 11905: 0xF17D, + 39384 - 11905: 0xF17E, + 39385 - 11905: 0xF180, + 39386 - 11905: 0xF181, + 39387 - 11905: 0xF182, + 39388 - 11905: 0xF183, + 39389 - 11905: 0xF184, + 39390 - 11905: 0xF185, + 39391 - 11905: 0xF186, + 39392 - 11905: 0xF187, + 39393 - 11905: 0xF188, + 39394 - 11905: 0xF189, + 39395 - 11905: 0xF18A, + 39396 - 11905: 0xF18B, + 39397 - 11905: 0xF18C, + 39398 - 11905: 0xF18D, + 39399 - 11905: 0xF18E, + 39400 - 11905: 0xF18F, + 39401 - 11905: 0xF190, + 39402 - 11905: 0xF191, + 39403 - 11905: 0xF192, + 39404 - 11905: 0xF193, + 39405 - 11905: 0xF194, + 39406 - 11905: 0xF195, + 39407 - 11905: 0xF196, + 39408 - 11905: 0xF197, + 39409 - 11905: 0xF198, + 39410 - 11905: 0xF199, + 39411 - 11905: 0xF19A, + 39412 - 11905: 0xF19B, + 39413 - 11905: 0xF19C, + 39414 - 11905: 0xF19D, + 39415 - 11905: 0xF19E, + 39416 - 11905: 0xF19F, + 39417 - 11905: 0xF1A0, + 39418 - 11905: 0xF240, + 39419 - 11905: 0xF241, + 39420 - 11905: 0xF242, + 39421 - 11905: 0xF243, + 39422 - 11905: 0xF244, + 39423 - 11905: 0xF245, + 39424 - 11905: 0xF246, + 39425 - 11905: 0xF247, + 39426 - 11905: 0xF248, + 39427 - 11905: 0xF249, + 39428 - 11905: 0xF24A, + 39429 - 11905: 0xF24B, + 39430 - 11905: 0xF24C, + 39431 - 11905: 0xF24D, + 39432 - 11905: 0xF24E, + 39433 - 11905: 0xF24F, + 39434 - 11905: 0xF250, + 39435 - 11905: 0xF251, + 39436 - 11905: 0xF252, + 39437 - 11905: 0xF253, + 39438 - 11905: 0xF254, + 39439 - 11905: 0xF255, + 39440 - 11905: 0xF256, + 39441 - 11905: 0xF257, + 39442 - 11905: 0xF258, + 39443 - 11905: 0xF259, + 39444 - 11905: 0xF25A, + 39445 - 11905: 0xF25B, + 39446 - 11905: 0xF25C, + 39447 - 11905: 0xF25D, + 39448 - 11905: 0xF25E, + 39449 - 11905: 0xF25F, + 39450 - 11905: 0xF260, + 39451 - 11905: 0xF261, + 39452 - 11905: 0xF262, + 39453 - 11905: 0xF263, + 39454 - 11905: 0xF264, + 39455 - 11905: 0xF265, + 39456 - 11905: 0xF266, + 39457 - 11905: 0xF267, + 39458 - 11905: 0xF268, + 39459 - 11905: 0xF269, + 39460 - 11905: 0xF26A, + 39461 - 11905: 0xF26B, + 39462 - 11905: 0xF26C, + 39463 - 11905: 0xF26D, + 39464 - 11905: 0xF26E, + 39465 - 11905: 0xF26F, + 39466 - 11905: 0xF270, + 39467 - 11905: 0xF271, + 39468 - 11905: 0xF272, + 39469 - 11905: 0xF273, + 39470 - 11905: 0xF274, + 39471 - 11905: 0xF275, + 39472 - 11905: 0xF276, + 39473 - 11905: 0xF277, + 39474 - 11905: 0xF278, + 39475 - 11905: 0xF279, + 39476 - 11905: 0xF27A, + 39477 - 11905: 0xF27B, + 39478 - 11905: 0xF27C, + 39479 - 11905: 0xF27D, + 39480 - 11905: 0xF27E, + 39481 - 11905: 0xF280, + 39482 - 11905: 0xF281, + 39483 - 11905: 0xF282, + 39484 - 11905: 0xF283, + 39485 - 11905: 0xF284, + 39486 - 11905: 0xF285, + 39487 - 11905: 0xF286, + 39488 - 11905: 0xF287, + 39489 - 11905: 0xF288, + 39490 - 11905: 0xF289, + 39491 - 11905: 0xF28A, + 39492 - 11905: 0xF28B, + 39493 - 11905: 0xF28C, + 39494 - 11905: 0xF28D, + 39495 - 11905: 0xF28E, + 39496 - 11905: 0xF28F, + 39497 - 11905: 0xF290, + 39498 - 11905: 0xF291, + 39499 - 11905: 0xF292, + 39500 - 11905: 0xF293, + 39501 - 11905: 0xF294, + 39502 - 11905: 0xF295, + 39503 - 11905: 0xF296, + 39504 - 11905: 0xF297, + 39505 - 11905: 0xF298, + 39506 - 11905: 0xF299, + 39507 - 11905: 0xF29A, + 39508 - 11905: 0xF29B, + 39509 - 11905: 0xF29C, + 39510 - 11905: 0xF29D, + 39511 - 11905: 0xF29E, + 39512 - 11905: 0xF29F, + 39513 - 11905: 0xF2A0, + 39514 - 11905: 0xF340, + 39515 - 11905: 0xF341, + 39516 - 11905: 0xF342, + 39517 - 11905: 0xF343, + 39518 - 11905: 0xF344, + 39519 - 11905: 0xF345, + 39520 - 11905: 0xF346, + 39521 - 11905: 0xF347, + 39522 - 11905: 0xF348, + 39523 - 11905: 0xF349, + 39524 - 11905: 0xF34A, + 39525 - 11905: 0xF34B, + 39526 - 11905: 0xF34C, + 39527 - 11905: 0xF34D, + 39528 - 11905: 0xF34E, + 39529 - 11905: 0xF34F, + 39530 - 11905: 0xF350, + 39531 - 11905: 0xF351, + 39532 - 11905: 0xC2ED, + 39533 - 11905: 0xD4A6, + 39534 - 11905: 0xCDD4, + 39535 - 11905: 0xD1B1, + 39536 - 11905: 0xB3DB, + 39537 - 11905: 0xC7FD, + 39538 - 11905: 0xF352, + 39539 - 11905: 0xB2B5, + 39540 - 11905: 0xC2BF, + 39541 - 11905: 0xE6E0, + 39542 - 11905: 0xCABB, + 39543 - 11905: 0xE6E1, + 39544 - 11905: 0xE6E2, + 39545 - 11905: 0xBED4, + 39546 - 11905: 0xE6E3, + 39547 - 11905: 0xD7A4, + 39548 - 11905: 0xCDD5, + 39549 - 11905: 0xE6E5, + 39550 - 11905: 0xBCDD, + 39551 - 11905: 0xE6E4, + 39552 - 11905: 0xE6E6, + 39553 - 11905: 0xE6E7, + 39554 - 11905: 0xC2EE, + 39555 - 11905: 0xF353, + 39556 - 11905: 0xBDBE, + 39557 - 11905: 0xE6E8, + 39558 - 11905: 0xC2E6, + 39559 - 11905: 0xBAA7, + 39560 - 11905: 0xE6E9, + 39561 - 11905: 0xF354, + 39562 - 11905: 0xE6EA, + 39563 - 11905: 0xB3D2, + 39564 - 11905: 0xD1E9, + 39565 - 11905: 0xF355, + 39566 - 11905: 0xF356, + 39567 - 11905: 0xBFA5, + 39568 - 11905: 0xE6EB, + 39569 - 11905: 0xC6EF, + 39570 - 11905: 0xE6EC, + 39571 - 11905: 0xE6ED, + 39572 - 11905: 0xF357, + 39573 - 11905: 0xF358, + 39574 - 11905: 0xE6EE, + 39575 - 11905: 0xC6AD, + 39576 - 11905: 0xE6EF, + 39577 - 11905: 0xF359, + 39578 - 11905: 0xC9A7, + 39579 - 11905: 0xE6F0, + 39580 - 11905: 0xE6F1, + 39581 - 11905: 0xE6F2, + 39582 - 11905: 0xE5B9, + 39583 - 11905: 0xE6F3, + 39584 - 11905: 0xE6F4, + 39585 - 11905: 0xC2E2, + 39586 - 11905: 0xE6F5, + 39587 - 11905: 0xE6F6, + 39588 - 11905: 0xD6E8, + 39589 - 11905: 0xE6F7, + 39590 - 11905: 0xF35A, + 39591 - 11905: 0xE6F8, + 39592 - 11905: 0xB9C7, + 39593 - 11905: 0xF35B, + 39594 - 11905: 0xF35C, + 39595 - 11905: 0xF35D, + 39596 - 11905: 0xF35E, + 39597 - 11905: 0xF35F, + 39598 - 11905: 0xF360, + 39599 - 11905: 0xF361, + 39600 - 11905: 0xF7BB, + 39601 - 11905: 0xF7BA, + 39602 - 11905: 0xF362, + 39603 - 11905: 0xF363, + 39604 - 11905: 0xF364, + 39605 - 11905: 0xF365, + 39606 - 11905: 0xF7BE, + 39607 - 11905: 0xF7BC, + 39608 - 11905: 0xBAA1, + 39609 - 11905: 0xF366, + 39610 - 11905: 0xF7BF, + 39611 - 11905: 0xF367, + 39612 - 11905: 0xF7C0, + 39613 - 11905: 0xF368, + 39614 - 11905: 0xF369, + 39615 - 11905: 0xF36A, + 39616 - 11905: 0xF7C2, + 39617 - 11905: 0xF7C1, + 39618 - 11905: 0xF7C4, + 39619 - 11905: 0xF36B, + 39620 - 11905: 0xF36C, + 39621 - 11905: 0xF7C3, + 39622 - 11905: 0xF36D, + 39623 - 11905: 0xF36E, + 39624 - 11905: 0xF36F, + 39625 - 11905: 0xF370, + 39626 - 11905: 0xF371, + 39627 - 11905: 0xF7C5, + 39628 - 11905: 0xF7C6, + 39629 - 11905: 0xF372, + 39630 - 11905: 0xF373, + 39631 - 11905: 0xF374, + 39632 - 11905: 0xF375, + 39633 - 11905: 0xF7C7, + 39634 - 11905: 0xF376, + 39635 - 11905: 0xCBE8, + 39636 - 11905: 0xF377, + 39637 - 11905: 0xF378, + 39638 - 11905: 0xF379, + 39639 - 11905: 0xF37A, + 39640 - 11905: 0xB8DF, + 39641 - 11905: 0xF37B, + 39642 - 11905: 0xF37C, + 39643 - 11905: 0xF37D, + 39644 - 11905: 0xF37E, + 39645 - 11905: 0xF380, + 39646 - 11905: 0xF381, + 39647 - 11905: 0xF7D4, + 39648 - 11905: 0xF382, + 39649 - 11905: 0xF7D5, + 39650 - 11905: 0xF383, + 39651 - 11905: 0xF384, + 39652 - 11905: 0xF385, + 39653 - 11905: 0xF386, + 39654 - 11905: 0xF7D6, + 39655 - 11905: 0xF387, + 39656 - 11905: 0xF388, + 39657 - 11905: 0xF389, + 39658 - 11905: 0xF38A, + 39659 - 11905: 0xF7D8, + 39660 - 11905: 0xF38B, + 39661 - 11905: 0xF7DA, + 39662 - 11905: 0xF38C, + 39663 - 11905: 0xF7D7, + 39664 - 11905: 0xF38D, + 39665 - 11905: 0xF38E, + 39666 - 11905: 0xF38F, + 39667 - 11905: 0xF390, + 39668 - 11905: 0xF391, + 39669 - 11905: 0xF392, + 39670 - 11905: 0xF393, + 39671 - 11905: 0xF394, + 39672 - 11905: 0xF395, + 39673 - 11905: 0xF7DB, + 39674 - 11905: 0xF396, + 39675 - 11905: 0xF7D9, + 39676 - 11905: 0xF397, + 39677 - 11905: 0xF398, + 39678 - 11905: 0xF399, + 39679 - 11905: 0xF39A, + 39680 - 11905: 0xF39B, + 39681 - 11905: 0xF39C, + 39682 - 11905: 0xF39D, + 39683 - 11905: 0xD7D7, + 39684 - 11905: 0xF39E, + 39685 - 11905: 0xF39F, + 39686 - 11905: 0xF3A0, + 39687 - 11905: 0xF440, + 39688 - 11905: 0xF7DC, + 39689 - 11905: 0xF441, + 39690 - 11905: 0xF442, + 39691 - 11905: 0xF443, + 39692 - 11905: 0xF444, + 39693 - 11905: 0xF445, + 39694 - 11905: 0xF446, + 39695 - 11905: 0xF7DD, + 39696 - 11905: 0xF447, + 39697 - 11905: 0xF448, + 39698 - 11905: 0xF449, + 39699 - 11905: 0xF7DE, + 39700 - 11905: 0xF44A, + 39701 - 11905: 0xF44B, + 39702 - 11905: 0xF44C, + 39703 - 11905: 0xF44D, + 39704 - 11905: 0xF44E, + 39705 - 11905: 0xF44F, + 39706 - 11905: 0xF450, + 39707 - 11905: 0xF451, + 39708 - 11905: 0xF452, + 39709 - 11905: 0xF453, + 39710 - 11905: 0xF454, + 39711 - 11905: 0xF7DF, + 39712 - 11905: 0xF455, + 39713 - 11905: 0xF456, + 39714 - 11905: 0xF457, + 39715 - 11905: 0xF7E0, + 39716 - 11905: 0xF458, + 39717 - 11905: 0xF459, + 39718 - 11905: 0xF45A, + 39719 - 11905: 0xF45B, + 39720 - 11905: 0xF45C, + 39721 - 11905: 0xF45D, + 39722 - 11905: 0xF45E, + 39723 - 11905: 0xF45F, + 39724 - 11905: 0xF460, + 39725 - 11905: 0xF461, + 39726 - 11905: 0xF462, + 39727 - 11905: 0xDBCB, + 39728 - 11905: 0xF463, + 39729 - 11905: 0xF464, + 39730 - 11905: 0xD8AA, + 39731 - 11905: 0xF465, + 39732 - 11905: 0xF466, + 39733 - 11905: 0xF467, + 39734 - 11905: 0xF468, + 39735 - 11905: 0xF469, + 39736 - 11905: 0xF46A, + 39737 - 11905: 0xF46B, + 39738 - 11905: 0xF46C, + 39739 - 11905: 0xE5F7, + 39740 - 11905: 0xB9ED, + 39741 - 11905: 0xF46D, + 39742 - 11905: 0xF46E, + 39743 - 11905: 0xF46F, + 39744 - 11905: 0xF470, + 39745 - 11905: 0xBFFD, + 39746 - 11905: 0xBBEA, + 39747 - 11905: 0xF7C9, + 39748 - 11905: 0xC6C7, + 39749 - 11905: 0xF7C8, + 39750 - 11905: 0xF471, + 39751 - 11905: 0xF7CA, + 39752 - 11905: 0xF7CC, + 39753 - 11905: 0xF7CB, + 39754 - 11905: 0xF472, + 39755 - 11905: 0xF473, + 39756 - 11905: 0xF474, + 39757 - 11905: 0xF7CD, + 39758 - 11905: 0xF475, + 39759 - 11905: 0xCEBA, + 39760 - 11905: 0xF476, + 39761 - 11905: 0xF7CE, + 39762 - 11905: 0xF477, + 39763 - 11905: 0xF478, + 39764 - 11905: 0xC4A7, + 39765 - 11905: 0xF479, + 39766 - 11905: 0xF47A, + 39767 - 11905: 0xF47B, + 39768 - 11905: 0xF47C, + 39769 - 11905: 0xF47D, + 39770 - 11905: 0xF47E, + 39771 - 11905: 0xF480, + 39772 - 11905: 0xF481, + 39773 - 11905: 0xF482, + 39774 - 11905: 0xF483, + 39775 - 11905: 0xF484, + 39776 - 11905: 0xF485, + 39777 - 11905: 0xF486, + 39778 - 11905: 0xF487, + 39779 - 11905: 0xF488, + 39780 - 11905: 0xF489, + 39781 - 11905: 0xF48A, + 39782 - 11905: 0xF48B, + 39783 - 11905: 0xF48C, + 39784 - 11905: 0xF48D, + 39785 - 11905: 0xF48E, + 39786 - 11905: 0xF48F, + 39787 - 11905: 0xF490, + 39788 - 11905: 0xF491, + 39789 - 11905: 0xF492, + 39790 - 11905: 0xF493, + 39791 - 11905: 0xF494, + 39792 - 11905: 0xF495, + 39793 - 11905: 0xF496, + 39794 - 11905: 0xF497, + 39795 - 11905: 0xF498, + 39796 - 11905: 0xF499, + 39797 - 11905: 0xF49A, + 39798 - 11905: 0xF49B, + 39799 - 11905: 0xF49C, + 39800 - 11905: 0xF49D, + 39801 - 11905: 0xF49E, + 39802 - 11905: 0xF49F, + 39803 - 11905: 0xF4A0, + 39804 - 11905: 0xF540, + 39805 - 11905: 0xF541, + 39806 - 11905: 0xF542, + 39807 - 11905: 0xF543, + 39808 - 11905: 0xF544, + 39809 - 11905: 0xF545, + 39810 - 11905: 0xF546, + 39811 - 11905: 0xF547, + 39812 - 11905: 0xF548, + 39813 - 11905: 0xF549, + 39814 - 11905: 0xF54A, + 39815 - 11905: 0xF54B, + 39816 - 11905: 0xF54C, + 39817 - 11905: 0xF54D, + 39818 - 11905: 0xF54E, + 39819 - 11905: 0xF54F, + 39820 - 11905: 0xF550, + 39821 - 11905: 0xF551, + 39822 - 11905: 0xF552, + 39823 - 11905: 0xF553, + 39824 - 11905: 0xF554, + 39825 - 11905: 0xF555, + 39826 - 11905: 0xF556, + 39827 - 11905: 0xF557, + 39828 - 11905: 0xF558, + 39829 - 11905: 0xF559, + 39830 - 11905: 0xF55A, + 39831 - 11905: 0xF55B, + 39832 - 11905: 0xF55C, + 39833 - 11905: 0xF55D, + 39834 - 11905: 0xF55E, + 39835 - 11905: 0xF55F, + 39836 - 11905: 0xF560, + 39837 - 11905: 0xF561, + 39838 - 11905: 0xF562, + 39839 - 11905: 0xF563, + 39840 - 11905: 0xF564, + 39841 - 11905: 0xF565, + 39842 - 11905: 0xF566, + 39843 - 11905: 0xF567, + 39844 - 11905: 0xF568, + 39845 - 11905: 0xF569, + 39846 - 11905: 0xF56A, + 39847 - 11905: 0xF56B, + 39848 - 11905: 0xF56C, + 39849 - 11905: 0xF56D, + 39850 - 11905: 0xF56E, + 39851 - 11905: 0xF56F, + 39852 - 11905: 0xF570, + 39853 - 11905: 0xF571, + 39854 - 11905: 0xF572, + 39855 - 11905: 0xF573, + 39856 - 11905: 0xF574, + 39857 - 11905: 0xF575, + 39858 - 11905: 0xF576, + 39859 - 11905: 0xF577, + 39860 - 11905: 0xF578, + 39861 - 11905: 0xF579, + 39862 - 11905: 0xF57A, + 39863 - 11905: 0xF57B, + 39864 - 11905: 0xF57C, + 39865 - 11905: 0xF57D, + 39866 - 11905: 0xF57E, + 39867 - 11905: 0xF580, + 39868 - 11905: 0xF581, + 39869 - 11905: 0xF582, + 39870 - 11905: 0xF583, + 39871 - 11905: 0xF584, + 39872 - 11905: 0xF585, + 39873 - 11905: 0xF586, + 39874 - 11905: 0xF587, + 39875 - 11905: 0xF588, + 39876 - 11905: 0xF589, + 39877 - 11905: 0xF58A, + 39878 - 11905: 0xF58B, + 39879 - 11905: 0xF58C, + 39880 - 11905: 0xF58D, + 39881 - 11905: 0xF58E, + 39882 - 11905: 0xF58F, + 39883 - 11905: 0xF590, + 39884 - 11905: 0xF591, + 39885 - 11905: 0xF592, + 39886 - 11905: 0xF593, + 39887 - 11905: 0xF594, + 39888 - 11905: 0xF595, + 39889 - 11905: 0xF596, + 39890 - 11905: 0xF597, + 39891 - 11905: 0xF598, + 39892 - 11905: 0xF599, + 39893 - 11905: 0xF59A, + 39894 - 11905: 0xF59B, + 39895 - 11905: 0xF59C, + 39896 - 11905: 0xF59D, + 39897 - 11905: 0xF59E, + 39898 - 11905: 0xF59F, + 39899 - 11905: 0xF5A0, + 39900 - 11905: 0xF640, + 39901 - 11905: 0xF641, + 39902 - 11905: 0xF642, + 39903 - 11905: 0xF643, + 39904 - 11905: 0xF644, + 39905 - 11905: 0xF645, + 39906 - 11905: 0xF646, + 39907 - 11905: 0xF647, + 39908 - 11905: 0xF648, + 39909 - 11905: 0xF649, + 39910 - 11905: 0xF64A, + 39911 - 11905: 0xF64B, + 39912 - 11905: 0xF64C, + 39913 - 11905: 0xF64D, + 39914 - 11905: 0xF64E, + 39915 - 11905: 0xF64F, + 39916 - 11905: 0xF650, + 39917 - 11905: 0xF651, + 39918 - 11905: 0xF652, + 39919 - 11905: 0xF653, + 39920 - 11905: 0xF654, + 39921 - 11905: 0xF655, + 39922 - 11905: 0xF656, + 39923 - 11905: 0xF657, + 39924 - 11905: 0xF658, + 39925 - 11905: 0xF659, + 39926 - 11905: 0xF65A, + 39927 - 11905: 0xF65B, + 39928 - 11905: 0xF65C, + 39929 - 11905: 0xF65D, + 39930 - 11905: 0xF65E, + 39931 - 11905: 0xF65F, + 39932 - 11905: 0xF660, + 39933 - 11905: 0xF661, + 39934 - 11905: 0xF662, + 39935 - 11905: 0xF663, + 39936 - 11905: 0xF664, + 39937 - 11905: 0xF665, + 39938 - 11905: 0xF666, + 39939 - 11905: 0xF667, + 39940 - 11905: 0xF668, + 39941 - 11905: 0xF669, + 39942 - 11905: 0xF66A, + 39943 - 11905: 0xF66B, + 39944 - 11905: 0xF66C, + 39945 - 11905: 0xF66D, + 39946 - 11905: 0xF66E, + 39947 - 11905: 0xF66F, + 39948 - 11905: 0xF670, + 39949 - 11905: 0xF671, + 39950 - 11905: 0xF672, + 39951 - 11905: 0xF673, + 39952 - 11905: 0xF674, + 39953 - 11905: 0xF675, + 39954 - 11905: 0xF676, + 39955 - 11905: 0xF677, + 39956 - 11905: 0xF678, + 39957 - 11905: 0xF679, + 39958 - 11905: 0xF67A, + 39959 - 11905: 0xF67B, + 39960 - 11905: 0xF67C, + 39961 - 11905: 0xF67D, + 39962 - 11905: 0xF67E, + 39963 - 11905: 0xF680, + 39964 - 11905: 0xF681, + 39965 - 11905: 0xF682, + 39966 - 11905: 0xF683, + 39967 - 11905: 0xF684, + 39968 - 11905: 0xF685, + 39969 - 11905: 0xF686, + 39970 - 11905: 0xF687, + 39971 - 11905: 0xF688, + 39972 - 11905: 0xF689, + 39973 - 11905: 0xF68A, + 39974 - 11905: 0xF68B, + 39975 - 11905: 0xF68C, + 39976 - 11905: 0xF68D, + 39977 - 11905: 0xF68E, + 39978 - 11905: 0xF68F, + 39979 - 11905: 0xF690, + 39980 - 11905: 0xF691, + 39981 - 11905: 0xF692, + 39982 - 11905: 0xF693, + 39983 - 11905: 0xF694, + 39984 - 11905: 0xF695, + 39985 - 11905: 0xF696, + 39986 - 11905: 0xF697, + 39987 - 11905: 0xF698, + 39988 - 11905: 0xF699, + 39989 - 11905: 0xF69A, + 39990 - 11905: 0xF69B, + 39991 - 11905: 0xF69C, + 39992 - 11905: 0xF69D, + 39993 - 11905: 0xF69E, + 39994 - 11905: 0xF69F, + 39995 - 11905: 0xF6A0, + 39996 - 11905: 0xF740, + 39997 - 11905: 0xF741, + 39998 - 11905: 0xF742, + 39999 - 11905: 0xF743, + 40000 - 11905: 0xF744, + 40001 - 11905: 0xF745, + 40002 - 11905: 0xF746, + 40003 - 11905: 0xF747, + 40004 - 11905: 0xF748, + 40005 - 11905: 0xF749, + 40006 - 11905: 0xF74A, + 40007 - 11905: 0xF74B, + 40008 - 11905: 0xF74C, + 40009 - 11905: 0xF74D, + 40010 - 11905: 0xF74E, + 40011 - 11905: 0xF74F, + 40012 - 11905: 0xF750, + 40013 - 11905: 0xF751, + 40014 - 11905: 0xF752, + 40015 - 11905: 0xF753, + 40016 - 11905: 0xF754, + 40017 - 11905: 0xF755, + 40018 - 11905: 0xF756, + 40019 - 11905: 0xF757, + 40020 - 11905: 0xF758, + 40021 - 11905: 0xF759, + 40022 - 11905: 0xF75A, + 40023 - 11905: 0xF75B, + 40024 - 11905: 0xF75C, + 40025 - 11905: 0xF75D, + 40026 - 11905: 0xF75E, + 40027 - 11905: 0xF75F, + 40028 - 11905: 0xF760, + 40029 - 11905: 0xF761, + 40030 - 11905: 0xF762, + 40031 - 11905: 0xF763, + 40032 - 11905: 0xF764, + 40033 - 11905: 0xF765, + 40034 - 11905: 0xF766, + 40035 - 11905: 0xF767, + 40036 - 11905: 0xF768, + 40037 - 11905: 0xF769, + 40038 - 11905: 0xF76A, + 40039 - 11905: 0xF76B, + 40040 - 11905: 0xF76C, + 40041 - 11905: 0xF76D, + 40042 - 11905: 0xF76E, + 40043 - 11905: 0xF76F, + 40044 - 11905: 0xF770, + 40045 - 11905: 0xF771, + 40046 - 11905: 0xF772, + 40047 - 11905: 0xF773, + 40048 - 11905: 0xF774, + 40049 - 11905: 0xF775, + 40050 - 11905: 0xF776, + 40051 - 11905: 0xF777, + 40052 - 11905: 0xF778, + 40053 - 11905: 0xF779, + 40054 - 11905: 0xF77A, + 40055 - 11905: 0xF77B, + 40056 - 11905: 0xF77C, + 40057 - 11905: 0xF77D, + 40058 - 11905: 0xF77E, + 40059 - 11905: 0xF780, + 40060 - 11905: 0xD3E3, + 40061 - 11905: 0xF781, + 40062 - 11905: 0xF782, + 40063 - 11905: 0xF6CF, + 40064 - 11905: 0xF783, + 40065 - 11905: 0xC2B3, + 40066 - 11905: 0xF6D0, + 40067 - 11905: 0xF784, + 40068 - 11905: 0xF785, + 40069 - 11905: 0xF6D1, + 40070 - 11905: 0xF6D2, + 40071 - 11905: 0xF6D3, + 40072 - 11905: 0xF6D4, + 40073 - 11905: 0xF786, + 40074 - 11905: 0xF787, + 40075 - 11905: 0xF6D6, + 40076 - 11905: 0xF788, + 40077 - 11905: 0xB1AB, + 40078 - 11905: 0xF6D7, + 40079 - 11905: 0xF789, + 40080 - 11905: 0xF6D8, + 40081 - 11905: 0xF6D9, + 40082 - 11905: 0xF6DA, + 40083 - 11905: 0xF78A, + 40084 - 11905: 0xF6DB, + 40085 - 11905: 0xF6DC, + 40086 - 11905: 0xF78B, + 40087 - 11905: 0xF78C, + 40088 - 11905: 0xF78D, + 40089 - 11905: 0xF78E, + 40090 - 11905: 0xF6DD, + 40091 - 11905: 0xF6DE, + 40092 - 11905: 0xCFCA, + 40093 - 11905: 0xF78F, + 40094 - 11905: 0xF6DF, + 40095 - 11905: 0xF6E0, + 40096 - 11905: 0xF6E1, + 40097 - 11905: 0xF6E2, + 40098 - 11905: 0xF6E3, + 40099 - 11905: 0xF6E4, + 40100 - 11905: 0xC0F0, + 40101 - 11905: 0xF6E5, + 40102 - 11905: 0xF6E6, + 40103 - 11905: 0xF6E7, + 40104 - 11905: 0xF6E8, + 40105 - 11905: 0xF6E9, + 40106 - 11905: 0xF790, + 40107 - 11905: 0xF6EA, + 40108 - 11905: 0xF791, + 40109 - 11905: 0xF6EB, + 40110 - 11905: 0xF6EC, + 40111 - 11905: 0xF792, + 40112 - 11905: 0xF6ED, + 40113 - 11905: 0xF6EE, + 40114 - 11905: 0xF6EF, + 40115 - 11905: 0xF6F0, + 40116 - 11905: 0xF6F1, + 40117 - 11905: 0xF6F2, + 40118 - 11905: 0xF6F3, + 40119 - 11905: 0xF6F4, + 40120 - 11905: 0xBEA8, + 40121 - 11905: 0xF793, + 40122 - 11905: 0xF6F5, + 40123 - 11905: 0xF6F6, + 40124 - 11905: 0xF6F7, + 40125 - 11905: 0xF6F8, + 40126 - 11905: 0xF794, + 40127 - 11905: 0xF795, + 40128 - 11905: 0xF796, + 40129 - 11905: 0xF797, + 40130 - 11905: 0xF798, + 40131 - 11905: 0xC8FA, + 40132 - 11905: 0xF6F9, + 40133 - 11905: 0xF6FA, + 40134 - 11905: 0xF6FB, + 40135 - 11905: 0xF6FC, + 40136 - 11905: 0xF799, + 40137 - 11905: 0xF79A, + 40138 - 11905: 0xF6FD, + 40139 - 11905: 0xF6FE, + 40140 - 11905: 0xF7A1, + 40141 - 11905: 0xF7A2, + 40142 - 11905: 0xF7A3, + 40143 - 11905: 0xF7A4, + 40144 - 11905: 0xF7A5, + 40145 - 11905: 0xF79B, + 40146 - 11905: 0xF79C, + 40147 - 11905: 0xF7A6, + 40148 - 11905: 0xF7A7, + 40149 - 11905: 0xF7A8, + 40150 - 11905: 0xB1EE, + 40151 - 11905: 0xF7A9, + 40152 - 11905: 0xF7AA, + 40153 - 11905: 0xF7AB, + 40154 - 11905: 0xF79D, + 40155 - 11905: 0xF79E, + 40156 - 11905: 0xF7AC, + 40157 - 11905: 0xF7AD, + 40158 - 11905: 0xC1DB, + 40159 - 11905: 0xF7AE, + 40160 - 11905: 0xF79F, + 40161 - 11905: 0xF7A0, + 40162 - 11905: 0xF7AF, + 40163 - 11905: 0xF840, + 40164 - 11905: 0xF841, + 40165 - 11905: 0xF842, + 40166 - 11905: 0xF843, + 40167 - 11905: 0xF844, + 40168 - 11905: 0xF845, + 40169 - 11905: 0xF846, + 40170 - 11905: 0xF847, + 40171 - 11905: 0xF848, + 40172 - 11905: 0xF849, + 40173 - 11905: 0xF84A, + 40174 - 11905: 0xF84B, + 40175 - 11905: 0xF84C, + 40176 - 11905: 0xF84D, + 40177 - 11905: 0xF84E, + 40178 - 11905: 0xF84F, + 40179 - 11905: 0xF850, + 40180 - 11905: 0xF851, + 40181 - 11905: 0xF852, + 40182 - 11905: 0xF853, + 40183 - 11905: 0xF854, + 40184 - 11905: 0xF855, + 40185 - 11905: 0xF856, + 40186 - 11905: 0xF857, + 40187 - 11905: 0xF858, + 40188 - 11905: 0xF859, + 40189 - 11905: 0xF85A, + 40190 - 11905: 0xF85B, + 40191 - 11905: 0xF85C, + 40192 - 11905: 0xF85D, + 40193 - 11905: 0xF85E, + 40194 - 11905: 0xF85F, + 40195 - 11905: 0xF860, + 40196 - 11905: 0xF861, + 40197 - 11905: 0xF862, + 40198 - 11905: 0xF863, + 40199 - 11905: 0xF864, + 40200 - 11905: 0xF865, + 40201 - 11905: 0xF866, + 40202 - 11905: 0xF867, + 40203 - 11905: 0xF868, + 40204 - 11905: 0xF869, + 40205 - 11905: 0xF86A, + 40206 - 11905: 0xF86B, + 40207 - 11905: 0xF86C, + 40208 - 11905: 0xF86D, + 40209 - 11905: 0xF86E, + 40210 - 11905: 0xF86F, + 40211 - 11905: 0xF870, + 40212 - 11905: 0xF871, + 40213 - 11905: 0xF872, + 40214 - 11905: 0xF873, + 40215 - 11905: 0xF874, + 40216 - 11905: 0xF875, + 40217 - 11905: 0xF876, + 40218 - 11905: 0xF877, + 40219 - 11905: 0xF878, + 40220 - 11905: 0xF879, + 40221 - 11905: 0xF87A, + 40222 - 11905: 0xF87B, + 40223 - 11905: 0xF87C, + 40224 - 11905: 0xF87D, + 40225 - 11905: 0xF87E, + 40226 - 11905: 0xF880, + 40227 - 11905: 0xF881, + 40228 - 11905: 0xF882, + 40229 - 11905: 0xF883, + 40230 - 11905: 0xF884, + 40231 - 11905: 0xF885, + 40232 - 11905: 0xF886, + 40233 - 11905: 0xF887, + 40234 - 11905: 0xF888, + 40235 - 11905: 0xF889, + 40236 - 11905: 0xF88A, + 40237 - 11905: 0xF88B, + 40238 - 11905: 0xF88C, + 40239 - 11905: 0xF88D, + 40240 - 11905: 0xF88E, + 40241 - 11905: 0xF88F, + 40242 - 11905: 0xF890, + 40243 - 11905: 0xF891, + 40244 - 11905: 0xF892, + 40245 - 11905: 0xF893, + 40246 - 11905: 0xF894, + 40247 - 11905: 0xF895, + 40248 - 11905: 0xF896, + 40249 - 11905: 0xF897, + 40250 - 11905: 0xF898, + 40251 - 11905: 0xF899, + 40252 - 11905: 0xF89A, + 40253 - 11905: 0xF89B, + 40254 - 11905: 0xF89C, + 40255 - 11905: 0xF89D, + 40256 - 11905: 0xF89E, + 40257 - 11905: 0xF89F, + 40258 - 11905: 0xF8A0, + 40259 - 11905: 0xF940, + 40260 - 11905: 0xF941, + 40261 - 11905: 0xF942, + 40262 - 11905: 0xF943, + 40263 - 11905: 0xF944, + 40264 - 11905: 0xF945, + 40265 - 11905: 0xF946, + 40266 - 11905: 0xF947, + 40267 - 11905: 0xF948, + 40268 - 11905: 0xF949, + 40269 - 11905: 0xF94A, + 40270 - 11905: 0xF94B, + 40271 - 11905: 0xF94C, + 40272 - 11905: 0xF94D, + 40273 - 11905: 0xF94E, + 40274 - 11905: 0xF94F, + 40275 - 11905: 0xF950, + 40276 - 11905: 0xF951, + 40277 - 11905: 0xF952, + 40278 - 11905: 0xF953, + 40279 - 11905: 0xF954, + 40280 - 11905: 0xF955, + 40281 - 11905: 0xF956, + 40282 - 11905: 0xF957, + 40283 - 11905: 0xF958, + 40284 - 11905: 0xF959, + 40285 - 11905: 0xF95A, + 40286 - 11905: 0xF95B, + 40287 - 11905: 0xF95C, + 40288 - 11905: 0xF95D, + 40289 - 11905: 0xF95E, + 40290 - 11905: 0xF95F, + 40291 - 11905: 0xF960, + 40292 - 11905: 0xF961, + 40293 - 11905: 0xF962, + 40294 - 11905: 0xF963, + 40295 - 11905: 0xF964, + 40296 - 11905: 0xF965, + 40297 - 11905: 0xF966, + 40298 - 11905: 0xF967, + 40299 - 11905: 0xF968, + 40300 - 11905: 0xF969, + 40301 - 11905: 0xF96A, + 40302 - 11905: 0xF96B, + 40303 - 11905: 0xF96C, + 40304 - 11905: 0xF96D, + 40305 - 11905: 0xF96E, + 40306 - 11905: 0xF96F, + 40307 - 11905: 0xF970, + 40308 - 11905: 0xF971, + 40309 - 11905: 0xF972, + 40310 - 11905: 0xF973, + 40311 - 11905: 0xF974, + 40312 - 11905: 0xF975, + 40313 - 11905: 0xF976, + 40314 - 11905: 0xF977, + 40315 - 11905: 0xF978, + 40316 - 11905: 0xF979, + 40317 - 11905: 0xF97A, + 40318 - 11905: 0xF97B, + 40319 - 11905: 0xF97C, + 40320 - 11905: 0xF97D, + 40321 - 11905: 0xF97E, + 40322 - 11905: 0xF980, + 40323 - 11905: 0xF981, + 40324 - 11905: 0xF982, + 40325 - 11905: 0xF983, + 40326 - 11905: 0xF984, + 40327 - 11905: 0xF985, + 40328 - 11905: 0xF986, + 40329 - 11905: 0xF987, + 40330 - 11905: 0xF988, + 40331 - 11905: 0xF989, + 40332 - 11905: 0xF98A, + 40333 - 11905: 0xF98B, + 40334 - 11905: 0xF98C, + 40335 - 11905: 0xF98D, + 40336 - 11905: 0xF98E, + 40337 - 11905: 0xF98F, + 40338 - 11905: 0xF990, + 40339 - 11905: 0xF991, + 40340 - 11905: 0xF992, + 40341 - 11905: 0xF993, + 40342 - 11905: 0xF994, + 40343 - 11905: 0xF995, + 40344 - 11905: 0xF996, + 40345 - 11905: 0xF997, + 40346 - 11905: 0xF998, + 40347 - 11905: 0xF999, + 40348 - 11905: 0xF99A, + 40349 - 11905: 0xF99B, + 40350 - 11905: 0xF99C, + 40351 - 11905: 0xF99D, + 40352 - 11905: 0xF99E, + 40353 - 11905: 0xF99F, + 40354 - 11905: 0xF9A0, + 40355 - 11905: 0xFA40, + 40356 - 11905: 0xFA41, + 40357 - 11905: 0xFA42, + 40358 - 11905: 0xFA43, + 40359 - 11905: 0xFA44, + 40360 - 11905: 0xFA45, + 40361 - 11905: 0xFA46, + 40362 - 11905: 0xFA47, + 40363 - 11905: 0xFA48, + 40364 - 11905: 0xFA49, + 40365 - 11905: 0xFA4A, + 40366 - 11905: 0xFA4B, + 40367 - 11905: 0xFA4C, + 40368 - 11905: 0xFA4D, + 40369 - 11905: 0xFA4E, + 40370 - 11905: 0xFA4F, + 40371 - 11905: 0xFA50, + 40372 - 11905: 0xFA51, + 40373 - 11905: 0xFA52, + 40374 - 11905: 0xFA53, + 40375 - 11905: 0xFA54, + 40376 - 11905: 0xFA55, + 40377 - 11905: 0xFA56, + 40378 - 11905: 0xFA57, + 40379 - 11905: 0xFA58, + 40380 - 11905: 0xFA59, + 40381 - 11905: 0xFA5A, + 40382 - 11905: 0xFA5B, + 40383 - 11905: 0xFA5C, + 40384 - 11905: 0xFA5D, + 40385 - 11905: 0xFA5E, + 40386 - 11905: 0xFA5F, + 40387 - 11905: 0xFA60, + 40388 - 11905: 0xFA61, + 40389 - 11905: 0xFA62, + 40390 - 11905: 0xFA63, + 40391 - 11905: 0xFA64, + 40392 - 11905: 0xFA65, + 40393 - 11905: 0xFA66, + 40394 - 11905: 0xFA67, + 40395 - 11905: 0xFA68, + 40396 - 11905: 0xFA69, + 40397 - 11905: 0xFA6A, + 40398 - 11905: 0xFA6B, + 40399 - 11905: 0xFA6C, + 40400 - 11905: 0xFA6D, + 40401 - 11905: 0xFA6E, + 40402 - 11905: 0xFA6F, + 40403 - 11905: 0xFA70, + 40404 - 11905: 0xFA71, + 40405 - 11905: 0xFA72, + 40406 - 11905: 0xFA73, + 40407 - 11905: 0xFA74, + 40408 - 11905: 0xFA75, + 40409 - 11905: 0xFA76, + 40410 - 11905: 0xFA77, + 40411 - 11905: 0xFA78, + 40412 - 11905: 0xFA79, + 40413 - 11905: 0xFA7A, + 40414 - 11905: 0xFA7B, + 40415 - 11905: 0xFA7C, + 40416 - 11905: 0xFA7D, + 40417 - 11905: 0xFA7E, + 40418 - 11905: 0xFA80, + 40419 - 11905: 0xFA81, + 40420 - 11905: 0xFA82, + 40421 - 11905: 0xFA83, + 40422 - 11905: 0xFA84, + 40423 - 11905: 0xFA85, + 40424 - 11905: 0xFA86, + 40425 - 11905: 0xFA87, + 40426 - 11905: 0xFA88, + 40427 - 11905: 0xFA89, + 40428 - 11905: 0xFA8A, + 40429 - 11905: 0xFA8B, + 40430 - 11905: 0xFA8C, + 40431 - 11905: 0xFA8D, + 40432 - 11905: 0xFA8E, + 40433 - 11905: 0xFA8F, + 40434 - 11905: 0xFA90, + 40435 - 11905: 0xFA91, + 40436 - 11905: 0xFA92, + 40437 - 11905: 0xFA93, + 40438 - 11905: 0xFA94, + 40439 - 11905: 0xFA95, + 40440 - 11905: 0xFA96, + 40441 - 11905: 0xFA97, + 40442 - 11905: 0xFA98, + 40443 - 11905: 0xFA99, + 40444 - 11905: 0xFA9A, + 40445 - 11905: 0xFA9B, + 40446 - 11905: 0xFA9C, + 40447 - 11905: 0xFA9D, + 40448 - 11905: 0xFA9E, + 40449 - 11905: 0xFA9F, + 40450 - 11905: 0xFAA0, + 40451 - 11905: 0xFB40, + 40452 - 11905: 0xFB41, + 40453 - 11905: 0xFB42, + 40454 - 11905: 0xFB43, + 40455 - 11905: 0xFB44, + 40456 - 11905: 0xFB45, + 40457 - 11905: 0xFB46, + 40458 - 11905: 0xFB47, + 40459 - 11905: 0xFB48, + 40460 - 11905: 0xFB49, + 40461 - 11905: 0xFB4A, + 40462 - 11905: 0xFB4B, + 40463 - 11905: 0xFB4C, + 40464 - 11905: 0xFB4D, + 40465 - 11905: 0xFB4E, + 40466 - 11905: 0xFB4F, + 40467 - 11905: 0xFB50, + 40468 - 11905: 0xFB51, + 40469 - 11905: 0xFB52, + 40470 - 11905: 0xFB53, + 40471 - 11905: 0xFB54, + 40472 - 11905: 0xFB55, + 40473 - 11905: 0xFB56, + 40474 - 11905: 0xFB57, + 40475 - 11905: 0xFB58, + 40476 - 11905: 0xFB59, + 40477 - 11905: 0xFB5A, + 40478 - 11905: 0xFB5B, + 40479 - 11905: 0xC4F1, + 40480 - 11905: 0xF0AF, + 40481 - 11905: 0xBCA6, + 40482 - 11905: 0xF0B0, + 40483 - 11905: 0xC3F9, + 40484 - 11905: 0xFB5C, + 40485 - 11905: 0xC5B8, + 40486 - 11905: 0xD1BB, + 40487 - 11905: 0xFB5D, + 40488 - 11905: 0xF0B1, + 40489 - 11905: 0xF0B2, + 40490 - 11905: 0xF0B3, + 40491 - 11905: 0xF0B4, + 40492 - 11905: 0xF0B5, + 40493 - 11905: 0xD1BC, + 40494 - 11905: 0xFB5E, + 40495 - 11905: 0xD1EC, + 40496 - 11905: 0xFB5F, + 40497 - 11905: 0xF0B7, + 40498 - 11905: 0xF0B6, + 40499 - 11905: 0xD4A7, + 40500 - 11905: 0xFB60, + 40501 - 11905: 0xCDD2, + 40502 - 11905: 0xF0B8, + 40503 - 11905: 0xF0BA, + 40504 - 11905: 0xF0B9, + 40505 - 11905: 0xF0BB, + 40506 - 11905: 0xF0BC, + 40507 - 11905: 0xFB61, + 40508 - 11905: 0xFB62, + 40509 - 11905: 0xB8EB, + 40510 - 11905: 0xF0BD, + 40511 - 11905: 0xBAE8, + 40512 - 11905: 0xFB63, + 40513 - 11905: 0xF0BE, + 40514 - 11905: 0xF0BF, + 40515 - 11905: 0xBEE9, + 40516 - 11905: 0xF0C0, + 40517 - 11905: 0xB6EC, + 40518 - 11905: 0xF0C1, + 40519 - 11905: 0xF0C2, + 40520 - 11905: 0xF0C3, + 40521 - 11905: 0xF0C4, + 40522 - 11905: 0xC8B5, + 40523 - 11905: 0xF0C5, + 40524 - 11905: 0xF0C6, + 40525 - 11905: 0xFB64, + 40526 - 11905: 0xF0C7, + 40527 - 11905: 0xC5F4, + 40528 - 11905: 0xFB65, + 40529 - 11905: 0xF0C8, + 40530 - 11905: 0xFB66, + 40531 - 11905: 0xFB67, + 40532 - 11905: 0xFB68, + 40533 - 11905: 0xF0C9, + 40534 - 11905: 0xFB69, + 40535 - 11905: 0xF0CA, + 40536 - 11905: 0xF7BD, + 40537 - 11905: 0xFB6A, + 40538 - 11905: 0xF0CB, + 40539 - 11905: 0xF0CC, + 40540 - 11905: 0xF0CD, + 40541 - 11905: 0xFB6B, + 40542 - 11905: 0xF0CE, + 40543 - 11905: 0xFB6C, + 40544 - 11905: 0xFB6D, + 40545 - 11905: 0xFB6E, + 40546 - 11905: 0xFB6F, + 40547 - 11905: 0xF0CF, + 40548 - 11905: 0xBAD7, + 40549 - 11905: 0xFB70, + 40550 - 11905: 0xF0D0, + 40551 - 11905: 0xF0D1, + 40552 - 11905: 0xF0D2, + 40553 - 11905: 0xF0D3, + 40554 - 11905: 0xF0D4, + 40555 - 11905: 0xF0D5, + 40556 - 11905: 0xF0D6, + 40557 - 11905: 0xF0D8, + 40558 - 11905: 0xFB71, + 40559 - 11905: 0xFB72, + 40560 - 11905: 0xD3A5, + 40561 - 11905: 0xF0D7, + 40562 - 11905: 0xFB73, + 40563 - 11905: 0xF0D9, + 40564 - 11905: 0xFB74, + 40565 - 11905: 0xFB75, + 40566 - 11905: 0xFB76, + 40567 - 11905: 0xFB77, + 40568 - 11905: 0xFB78, + 40569 - 11905: 0xFB79, + 40570 - 11905: 0xFB7A, + 40571 - 11905: 0xFB7B, + 40572 - 11905: 0xFB7C, + 40573 - 11905: 0xFB7D, + 40574 - 11905: 0xF5BA, + 40575 - 11905: 0xC2B9, + 40576 - 11905: 0xFB7E, + 40577 - 11905: 0xFB80, + 40578 - 11905: 0xF7E4, + 40579 - 11905: 0xFB81, + 40580 - 11905: 0xFB82, + 40581 - 11905: 0xFB83, + 40582 - 11905: 0xFB84, + 40583 - 11905: 0xF7E5, + 40584 - 11905: 0xF7E6, + 40585 - 11905: 0xFB85, + 40586 - 11905: 0xFB86, + 40587 - 11905: 0xF7E7, + 40588 - 11905: 0xFB87, + 40589 - 11905: 0xFB88, + 40590 - 11905: 0xFB89, + 40591 - 11905: 0xFB8A, + 40592 - 11905: 0xFB8B, + 40593 - 11905: 0xFB8C, + 40594 - 11905: 0xF7E8, + 40595 - 11905: 0xC2B4, + 40596 - 11905: 0xFB8D, + 40597 - 11905: 0xFB8E, + 40598 - 11905: 0xFB8F, + 40599 - 11905: 0xFB90, + 40600 - 11905: 0xFB91, + 40601 - 11905: 0xFB92, + 40602 - 11905: 0xFB93, + 40603 - 11905: 0xFB94, + 40604 - 11905: 0xFB95, + 40605 - 11905: 0xF7EA, + 40606 - 11905: 0xFB96, + 40607 - 11905: 0xF7EB, + 40608 - 11905: 0xFB97, + 40609 - 11905: 0xFB98, + 40610 - 11905: 0xFB99, + 40611 - 11905: 0xFB9A, + 40612 - 11905: 0xFB9B, + 40613 - 11905: 0xFB9C, + 40614 - 11905: 0xC2F3, + 40615 - 11905: 0xFB9D, + 40616 - 11905: 0xFB9E, + 40617 - 11905: 0xFB9F, + 40618 - 11905: 0xFBA0, + 40619 - 11905: 0xFC40, + 40620 - 11905: 0xFC41, + 40621 - 11905: 0xFC42, + 40622 - 11905: 0xFC43, + 40623 - 11905: 0xFC44, + 40624 - 11905: 0xFC45, + 40625 - 11905: 0xFC46, + 40626 - 11905: 0xFC47, + 40627 - 11905: 0xFC48, + 40628 - 11905: 0xF4F0, + 40629 - 11905: 0xFC49, + 40630 - 11905: 0xFC4A, + 40631 - 11905: 0xFC4B, + 40632 - 11905: 0xF4EF, + 40633 - 11905: 0xFC4C, + 40634 - 11905: 0xFC4D, + 40635 - 11905: 0xC2E9, + 40636 - 11905: 0xFC4E, + 40637 - 11905: 0xF7E1, + 40638 - 11905: 0xF7E2, + 40639 - 11905: 0xFC4F, + 40640 - 11905: 0xFC50, + 40641 - 11905: 0xFC51, + 40642 - 11905: 0xFC52, + 40643 - 11905: 0xFC53, + 40644 - 11905: 0xBBC6, + 40645 - 11905: 0xFC54, + 40646 - 11905: 0xFC55, + 40647 - 11905: 0xFC56, + 40648 - 11905: 0xFC57, + 40649 - 11905: 0xD9E4, + 40650 - 11905: 0xFC58, + 40651 - 11905: 0xFC59, + 40652 - 11905: 0xFC5A, + 40653 - 11905: 0xCAF2, + 40654 - 11905: 0xC0E8, + 40655 - 11905: 0xF0A4, + 40656 - 11905: 0xFC5B, + 40657 - 11905: 0xBADA, + 40658 - 11905: 0xFC5C, + 40659 - 11905: 0xFC5D, + 40660 - 11905: 0xC7AD, + 40661 - 11905: 0xFC5E, + 40662 - 11905: 0xFC5F, + 40663 - 11905: 0xFC60, + 40664 - 11905: 0xC4AC, + 40665 - 11905: 0xFC61, + 40666 - 11905: 0xFC62, + 40667 - 11905: 0xF7EC, + 40668 - 11905: 0xF7ED, + 40669 - 11905: 0xF7EE, + 40670 - 11905: 0xFC63, + 40671 - 11905: 0xF7F0, + 40672 - 11905: 0xF7EF, + 40673 - 11905: 0xFC64, + 40674 - 11905: 0xF7F1, + 40675 - 11905: 0xFC65, + 40676 - 11905: 0xFC66, + 40677 - 11905: 0xF7F4, + 40678 - 11905: 0xFC67, + 40679 - 11905: 0xF7F3, + 40680 - 11905: 0xFC68, + 40681 - 11905: 0xF7F2, + 40682 - 11905: 0xF7F5, + 40683 - 11905: 0xFC69, + 40684 - 11905: 0xFC6A, + 40685 - 11905: 0xFC6B, + 40686 - 11905: 0xFC6C, + 40687 - 11905: 0xF7F6, + 40688 - 11905: 0xFC6D, + 40689 - 11905: 0xFC6E, + 40690 - 11905: 0xFC6F, + 40691 - 11905: 0xFC70, + 40692 - 11905: 0xFC71, + 40693 - 11905: 0xFC72, + 40694 - 11905: 0xFC73, + 40695 - 11905: 0xFC74, + 40696 - 11905: 0xFC75, + 40697 - 11905: 0xEDE9, + 40698 - 11905: 0xFC76, + 40699 - 11905: 0xEDEA, + 40700 - 11905: 0xEDEB, + 40701 - 11905: 0xFC77, + 40702 - 11905: 0xF6BC, + 40703 - 11905: 0xFC78, + 40704 - 11905: 0xFC79, + 40705 - 11905: 0xFC7A, + 40706 - 11905: 0xFC7B, + 40707 - 11905: 0xFC7C, + 40708 - 11905: 0xFC7D, + 40709 - 11905: 0xFC7E, + 40710 - 11905: 0xFC80, + 40711 - 11905: 0xFC81, + 40712 - 11905: 0xFC82, + 40713 - 11905: 0xFC83, + 40714 - 11905: 0xFC84, + 40715 - 11905: 0xF6BD, + 40716 - 11905: 0xFC85, + 40717 - 11905: 0xF6BE, + 40718 - 11905: 0xB6A6, + 40719 - 11905: 0xFC86, + 40720 - 11905: 0xD8BE, + 40721 - 11905: 0xFC87, + 40722 - 11905: 0xFC88, + 40723 - 11905: 0xB9C4, + 40724 - 11905: 0xFC89, + 40725 - 11905: 0xFC8A, + 40726 - 11905: 0xFC8B, + 40727 - 11905: 0xD8BB, + 40728 - 11905: 0xFC8C, + 40729 - 11905: 0xDCB1, + 40730 - 11905: 0xFC8D, + 40731 - 11905: 0xFC8E, + 40732 - 11905: 0xFC8F, + 40733 - 11905: 0xFC90, + 40734 - 11905: 0xFC91, + 40735 - 11905: 0xFC92, + 40736 - 11905: 0xCAF3, + 40737 - 11905: 0xFC93, + 40738 - 11905: 0xF7F7, + 40739 - 11905: 0xFC94, + 40740 - 11905: 0xFC95, + 40741 - 11905: 0xFC96, + 40742 - 11905: 0xFC97, + 40743 - 11905: 0xFC98, + 40744 - 11905: 0xFC99, + 40745 - 11905: 0xFC9A, + 40746 - 11905: 0xFC9B, + 40747 - 11905: 0xFC9C, + 40748 - 11905: 0xF7F8, + 40749 - 11905: 0xFC9D, + 40750 - 11905: 0xFC9E, + 40751 - 11905: 0xF7F9, + 40752 - 11905: 0xFC9F, + 40753 - 11905: 0xFCA0, + 40754 - 11905: 0xFD40, + 40755 - 11905: 0xFD41, + 40756 - 11905: 0xFD42, + 40757 - 11905: 0xFD43, + 40758 - 11905: 0xFD44, + 40759 - 11905: 0xF7FB, + 40760 - 11905: 0xFD45, + 40761 - 11905: 0xF7FA, + 40762 - 11905: 0xFD46, + 40763 - 11905: 0xB1C7, + 40764 - 11905: 0xFD47, + 40765 - 11905: 0xF7FC, + 40766 - 11905: 0xF7FD, + 40767 - 11905: 0xFD48, + 40768 - 11905: 0xFD49, + 40769 - 11905: 0xFD4A, + 40770 - 11905: 0xFD4B, + 40771 - 11905: 0xFD4C, + 40772 - 11905: 0xF7FE, + 40773 - 11905: 0xFD4D, + 40774 - 11905: 0xFD4E, + 40775 - 11905: 0xFD4F, + 40776 - 11905: 0xFD50, + 40777 - 11905: 0xFD51, + 40778 - 11905: 0xFD52, + 40779 - 11905: 0xFD53, + 40780 - 11905: 0xFD54, + 40781 - 11905: 0xFD55, + 40782 - 11905: 0xFD56, + 40783 - 11905: 0xFD57, + 40784 - 11905: 0xC6EB, + 40785 - 11905: 0xECB4, + 40786 - 11905: 0xFD58, + 40787 - 11905: 0xFD59, + 40788 - 11905: 0xFD5A, + 40789 - 11905: 0xFD5B, + 40790 - 11905: 0xFD5C, + 40791 - 11905: 0xFD5D, + 40792 - 11905: 0xFD5E, + 40793 - 11905: 0xFD5F, + 40794 - 11905: 0xFD60, + 40795 - 11905: 0xFD61, + 40796 - 11905: 0xFD62, + 40797 - 11905: 0xFD63, + 40798 - 11905: 0xFD64, + 40799 - 11905: 0xFD65, + 40800 - 11905: 0xFD66, + 40801 - 11905: 0xFD67, + 40802 - 11905: 0xFD68, + 40803 - 11905: 0xFD69, + 40804 - 11905: 0xFD6A, + 40805 - 11905: 0xFD6B, + 40806 - 11905: 0xFD6C, + 40807 - 11905: 0xFD6D, + 40808 - 11905: 0xFD6E, + 40809 - 11905: 0xFD6F, + 40810 - 11905: 0xFD70, + 40811 - 11905: 0xFD71, + 40812 - 11905: 0xFD72, + 40813 - 11905: 0xFD73, + 40814 - 11905: 0xFD74, + 40815 - 11905: 0xFD75, + 40816 - 11905: 0xFD76, + 40817 - 11905: 0xFD77, + 40818 - 11905: 0xFD78, + 40819 - 11905: 0xFD79, + 40820 - 11905: 0xFD7A, + 40821 - 11905: 0xFD7B, + 40822 - 11905: 0xFD7C, + 40823 - 11905: 0xFD7D, + 40824 - 11905: 0xFD7E, + 40825 - 11905: 0xFD80, + 40826 - 11905: 0xFD81, + 40827 - 11905: 0xFD82, + 40828 - 11905: 0xFD83, + 40829 - 11905: 0xFD84, + 40830 - 11905: 0xFD85, + 40831 - 11905: 0xB3DD, + 40832 - 11905: 0xF6B3, + 40833 - 11905: 0xFD86, + 40834 - 11905: 0xFD87, + 40835 - 11905: 0xF6B4, + 40836 - 11905: 0xC1E4, + 40837 - 11905: 0xF6B5, + 40838 - 11905: 0xF6B6, + 40839 - 11905: 0xF6B7, + 40840 - 11905: 0xF6B8, + 40841 - 11905: 0xF6B9, + 40842 - 11905: 0xF6BA, + 40843 - 11905: 0xC8A3, + 40844 - 11905: 0xF6BB, + 40845 - 11905: 0xFD88, + 40846 - 11905: 0xFD89, + 40847 - 11905: 0xFD8A, + 40848 - 11905: 0xFD8B, + 40849 - 11905: 0xFD8C, + 40850 - 11905: 0xFD8D, + 40851 - 11905: 0xFD8E, + 40852 - 11905: 0xFD8F, + 40853 - 11905: 0xFD90, + 40854 - 11905: 0xFD91, + 40855 - 11905: 0xFD92, + 40856 - 11905: 0xFD93, + 40857 - 11905: 0xC1FA, + 40858 - 11905: 0xB9A8, + 40859 - 11905: 0xEDE8, + 40860 - 11905: 0xFD94, + 40861 - 11905: 0xFD95, + 40862 - 11905: 0xFD96, + 40863 - 11905: 0xB9EA, + 40864 - 11905: 0xD9DF, + 40865 - 11905: 0xFD97, + 40866 - 11905: 0xFD98, + 40867 - 11905: 0xFD99, + 40868 - 11905: 0xFD9A, + 40869 - 11905: 0xFD9B, +} + +const encode1Low, encode1High = 8208, 9795 + +var encode1 = [...]uint16{ + 8208 - 8208: 0xA95C, + 8211 - 8208: 0xA843, + 8212 - 8208: 0xA1AA, + 8213 - 8208: 0xA844, + 8214 - 8208: 0xA1AC, + 8216 - 8208: 0xA1AE, + 8217 - 8208: 0xA1AF, + 8220 - 8208: 0xA1B0, + 8221 - 8208: 0xA1B1, + 8229 - 8208: 0xA845, + 8230 - 8208: 0xA1AD, + 8240 - 8208: 0xA1EB, + 8242 - 8208: 0xA1E4, + 8243 - 8208: 0xA1E5, + 8245 - 8208: 0xA846, + 8251 - 8208: 0xA1F9, + 8364 - 8208: 0xA2E3, + 8451 - 8208: 0xA1E6, + 8453 - 8208: 0xA847, + 8457 - 8208: 0xA848, + 8470 - 8208: 0xA1ED, + 8481 - 8208: 0xA959, + 8544 - 8208: 0xA2F1, + 8545 - 8208: 0xA2F2, + 8546 - 8208: 0xA2F3, + 8547 - 8208: 0xA2F4, + 8548 - 8208: 0xA2F5, + 8549 - 8208: 0xA2F6, + 8550 - 8208: 0xA2F7, + 8551 - 8208: 0xA2F8, + 8552 - 8208: 0xA2F9, + 8553 - 8208: 0xA2FA, + 8554 - 8208: 0xA2FB, + 8555 - 8208: 0xA2FC, + 8560 - 8208: 0xA2A1, + 8561 - 8208: 0xA2A2, + 8562 - 8208: 0xA2A3, + 8563 - 8208: 0xA2A4, + 8564 - 8208: 0xA2A5, + 8565 - 8208: 0xA2A6, + 8566 - 8208: 0xA2A7, + 8567 - 8208: 0xA2A8, + 8568 - 8208: 0xA2A9, + 8569 - 8208: 0xA2AA, + 8592 - 8208: 0xA1FB, + 8593 - 8208: 0xA1FC, + 8594 - 8208: 0xA1FA, + 8595 - 8208: 0xA1FD, + 8598 - 8208: 0xA849, + 8599 - 8208: 0xA84A, + 8600 - 8208: 0xA84B, + 8601 - 8208: 0xA84C, + 8712 - 8208: 0xA1CA, + 8719 - 8208: 0xA1C7, + 8721 - 8208: 0xA1C6, + 8725 - 8208: 0xA84D, + 8730 - 8208: 0xA1CC, + 8733 - 8208: 0xA1D8, + 8734 - 8208: 0xA1DE, + 8735 - 8208: 0xA84E, + 8736 - 8208: 0xA1CF, + 8739 - 8208: 0xA84F, + 8741 - 8208: 0xA1CE, + 8743 - 8208: 0xA1C4, + 8744 - 8208: 0xA1C5, + 8745 - 8208: 0xA1C9, + 8746 - 8208: 0xA1C8, + 8747 - 8208: 0xA1D2, + 8750 - 8208: 0xA1D3, + 8756 - 8208: 0xA1E0, + 8757 - 8208: 0xA1DF, + 8758 - 8208: 0xA1C3, + 8759 - 8208: 0xA1CB, + 8765 - 8208: 0xA1D7, + 8776 - 8208: 0xA1D6, + 8780 - 8208: 0xA1D5, + 8786 - 8208: 0xA850, + 8800 - 8208: 0xA1D9, + 8801 - 8208: 0xA1D4, + 8804 - 8208: 0xA1DC, + 8805 - 8208: 0xA1DD, + 8806 - 8208: 0xA851, + 8807 - 8208: 0xA852, + 8814 - 8208: 0xA1DA, + 8815 - 8208: 0xA1DB, + 8853 - 8208: 0xA892, + 8857 - 8208: 0xA1D1, + 8869 - 8208: 0xA1CD, + 8895 - 8208: 0xA853, + 8978 - 8208: 0xA1D0, + 9312 - 8208: 0xA2D9, + 9313 - 8208: 0xA2DA, + 9314 - 8208: 0xA2DB, + 9315 - 8208: 0xA2DC, + 9316 - 8208: 0xA2DD, + 9317 - 8208: 0xA2DE, + 9318 - 8208: 0xA2DF, + 9319 - 8208: 0xA2E0, + 9320 - 8208: 0xA2E1, + 9321 - 8208: 0xA2E2, + 9332 - 8208: 0xA2C5, + 9333 - 8208: 0xA2C6, + 9334 - 8208: 0xA2C7, + 9335 - 8208: 0xA2C8, + 9336 - 8208: 0xA2C9, + 9337 - 8208: 0xA2CA, + 9338 - 8208: 0xA2CB, + 9339 - 8208: 0xA2CC, + 9340 - 8208: 0xA2CD, + 9341 - 8208: 0xA2CE, + 9342 - 8208: 0xA2CF, + 9343 - 8208: 0xA2D0, + 9344 - 8208: 0xA2D1, + 9345 - 8208: 0xA2D2, + 9346 - 8208: 0xA2D3, + 9347 - 8208: 0xA2D4, + 9348 - 8208: 0xA2D5, + 9349 - 8208: 0xA2D6, + 9350 - 8208: 0xA2D7, + 9351 - 8208: 0xA2D8, + 9352 - 8208: 0xA2B1, + 9353 - 8208: 0xA2B2, + 9354 - 8208: 0xA2B3, + 9355 - 8208: 0xA2B4, + 9356 - 8208: 0xA2B5, + 9357 - 8208: 0xA2B6, + 9358 - 8208: 0xA2B7, + 9359 - 8208: 0xA2B8, + 9360 - 8208: 0xA2B9, + 9361 - 8208: 0xA2BA, + 9362 - 8208: 0xA2BB, + 9363 - 8208: 0xA2BC, + 9364 - 8208: 0xA2BD, + 9365 - 8208: 0xA2BE, + 9366 - 8208: 0xA2BF, + 9367 - 8208: 0xA2C0, + 9368 - 8208: 0xA2C1, + 9369 - 8208: 0xA2C2, + 9370 - 8208: 0xA2C3, + 9371 - 8208: 0xA2C4, + 9472 - 8208: 0xA9A4, + 9473 - 8208: 0xA9A5, + 9474 - 8208: 0xA9A6, + 9475 - 8208: 0xA9A7, + 9476 - 8208: 0xA9A8, + 9477 - 8208: 0xA9A9, + 9478 - 8208: 0xA9AA, + 9479 - 8208: 0xA9AB, + 9480 - 8208: 0xA9AC, + 9481 - 8208: 0xA9AD, + 9482 - 8208: 0xA9AE, + 9483 - 8208: 0xA9AF, + 9484 - 8208: 0xA9B0, + 9485 - 8208: 0xA9B1, + 9486 - 8208: 0xA9B2, + 9487 - 8208: 0xA9B3, + 9488 - 8208: 0xA9B4, + 9489 - 8208: 0xA9B5, + 9490 - 8208: 0xA9B6, + 9491 - 8208: 0xA9B7, + 9492 - 8208: 0xA9B8, + 9493 - 8208: 0xA9B9, + 9494 - 8208: 0xA9BA, + 9495 - 8208: 0xA9BB, + 9496 - 8208: 0xA9BC, + 9497 - 8208: 0xA9BD, + 9498 - 8208: 0xA9BE, + 9499 - 8208: 0xA9BF, + 9500 - 8208: 0xA9C0, + 9501 - 8208: 0xA9C1, + 9502 - 8208: 0xA9C2, + 9503 - 8208: 0xA9C3, + 9504 - 8208: 0xA9C4, + 9505 - 8208: 0xA9C5, + 9506 - 8208: 0xA9C6, + 9507 - 8208: 0xA9C7, + 9508 - 8208: 0xA9C8, + 9509 - 8208: 0xA9C9, + 9510 - 8208: 0xA9CA, + 9511 - 8208: 0xA9CB, + 9512 - 8208: 0xA9CC, + 9513 - 8208: 0xA9CD, + 9514 - 8208: 0xA9CE, + 9515 - 8208: 0xA9CF, + 9516 - 8208: 0xA9D0, + 9517 - 8208: 0xA9D1, + 9518 - 8208: 0xA9D2, + 9519 - 8208: 0xA9D3, + 9520 - 8208: 0xA9D4, + 9521 - 8208: 0xA9D5, + 9522 - 8208: 0xA9D6, + 9523 - 8208: 0xA9D7, + 9524 - 8208: 0xA9D8, + 9525 - 8208: 0xA9D9, + 9526 - 8208: 0xA9DA, + 9527 - 8208: 0xA9DB, + 9528 - 8208: 0xA9DC, + 9529 - 8208: 0xA9DD, + 9530 - 8208: 0xA9DE, + 9531 - 8208: 0xA9DF, + 9532 - 8208: 0xA9E0, + 9533 - 8208: 0xA9E1, + 9534 - 8208: 0xA9E2, + 9535 - 8208: 0xA9E3, + 9536 - 8208: 0xA9E4, + 9537 - 8208: 0xA9E5, + 9538 - 8208: 0xA9E6, + 9539 - 8208: 0xA9E7, + 9540 - 8208: 0xA9E8, + 9541 - 8208: 0xA9E9, + 9542 - 8208: 0xA9EA, + 9543 - 8208: 0xA9EB, + 9544 - 8208: 0xA9EC, + 9545 - 8208: 0xA9ED, + 9546 - 8208: 0xA9EE, + 9547 - 8208: 0xA9EF, + 9552 - 8208: 0xA854, + 9553 - 8208: 0xA855, + 9554 - 8208: 0xA856, + 9555 - 8208: 0xA857, + 9556 - 8208: 0xA858, + 9557 - 8208: 0xA859, + 9558 - 8208: 0xA85A, + 9559 - 8208: 0xA85B, + 9560 - 8208: 0xA85C, + 9561 - 8208: 0xA85D, + 9562 - 8208: 0xA85E, + 9563 - 8208: 0xA85F, + 9564 - 8208: 0xA860, + 9565 - 8208: 0xA861, + 9566 - 8208: 0xA862, + 9567 - 8208: 0xA863, + 9568 - 8208: 0xA864, + 9569 - 8208: 0xA865, + 9570 - 8208: 0xA866, + 9571 - 8208: 0xA867, + 9572 - 8208: 0xA868, + 9573 - 8208: 0xA869, + 9574 - 8208: 0xA86A, + 9575 - 8208: 0xA86B, + 9576 - 8208: 0xA86C, + 9577 - 8208: 0xA86D, + 9578 - 8208: 0xA86E, + 9579 - 8208: 0xA86F, + 9580 - 8208: 0xA870, + 9581 - 8208: 0xA871, + 9582 - 8208: 0xA872, + 9583 - 8208: 0xA873, + 9584 - 8208: 0xA874, + 9585 - 8208: 0xA875, + 9586 - 8208: 0xA876, + 9587 - 8208: 0xA877, + 9601 - 8208: 0xA878, + 9602 - 8208: 0xA879, + 9603 - 8208: 0xA87A, + 9604 - 8208: 0xA87B, + 9605 - 8208: 0xA87C, + 9606 - 8208: 0xA87D, + 9607 - 8208: 0xA87E, + 9608 - 8208: 0xA880, + 9609 - 8208: 0xA881, + 9610 - 8208: 0xA882, + 9611 - 8208: 0xA883, + 9612 - 8208: 0xA884, + 9613 - 8208: 0xA885, + 9614 - 8208: 0xA886, + 9615 - 8208: 0xA887, + 9619 - 8208: 0xA888, + 9620 - 8208: 0xA889, + 9621 - 8208: 0xA88A, + 9632 - 8208: 0xA1F6, + 9633 - 8208: 0xA1F5, + 9650 - 8208: 0xA1F8, + 9651 - 8208: 0xA1F7, + 9660 - 8208: 0xA88B, + 9661 - 8208: 0xA88C, + 9670 - 8208: 0xA1F4, + 9671 - 8208: 0xA1F3, + 9675 - 8208: 0xA1F0, + 9678 - 8208: 0xA1F2, + 9679 - 8208: 0xA1F1, + 9698 - 8208: 0xA88D, + 9699 - 8208: 0xA88E, + 9700 - 8208: 0xA88F, + 9701 - 8208: 0xA890, + 9733 - 8208: 0xA1EF, + 9734 - 8208: 0xA1EE, + 9737 - 8208: 0xA891, + 9792 - 8208: 0xA1E2, + 9794 - 8208: 0xA1E1, +} + +const encode2Low, encode2High = 164, 1106 + +var encode2 = [...]uint16{ + 164 - 164: 0xA1E8, + 167 - 164: 0xA1EC, + 168 - 164: 0xA1A7, + 176 - 164: 0xA1E3, + 177 - 164: 0xA1C0, + 183 - 164: 0xA1A4, + 215 - 164: 0xA1C1, + 224 - 164: 0xA8A4, + 225 - 164: 0xA8A2, + 232 - 164: 0xA8A8, + 233 - 164: 0xA8A6, + 234 - 164: 0xA8BA, + 236 - 164: 0xA8AC, + 237 - 164: 0xA8AA, + 242 - 164: 0xA8B0, + 243 - 164: 0xA8AE, + 247 - 164: 0xA1C2, + 249 - 164: 0xA8B4, + 250 - 164: 0xA8B2, + 252 - 164: 0xA8B9, + 257 - 164: 0xA8A1, + 275 - 164: 0xA8A5, + 283 - 164: 0xA8A7, + 299 - 164: 0xA8A9, + 324 - 164: 0xA8BD, + 328 - 164: 0xA8BE, + 333 - 164: 0xA8AD, + 363 - 164: 0xA8B1, + 462 - 164: 0xA8A3, + 464 - 164: 0xA8AB, + 466 - 164: 0xA8AF, + 468 - 164: 0xA8B3, + 470 - 164: 0xA8B5, + 472 - 164: 0xA8B6, + 474 - 164: 0xA8B7, + 476 - 164: 0xA8B8, + 505 - 164: 0xA8BF, + 593 - 164: 0xA8BB, + 609 - 164: 0xA8C0, + 711 - 164: 0xA1A6, + 713 - 164: 0xA1A5, + 714 - 164: 0xA840, + 715 - 164: 0xA841, + 729 - 164: 0xA842, + 913 - 164: 0xA6A1, + 914 - 164: 0xA6A2, + 915 - 164: 0xA6A3, + 916 - 164: 0xA6A4, + 917 - 164: 0xA6A5, + 918 - 164: 0xA6A6, + 919 - 164: 0xA6A7, + 920 - 164: 0xA6A8, + 921 - 164: 0xA6A9, + 922 - 164: 0xA6AA, + 923 - 164: 0xA6AB, + 924 - 164: 0xA6AC, + 925 - 164: 0xA6AD, + 926 - 164: 0xA6AE, + 927 - 164: 0xA6AF, + 928 - 164: 0xA6B0, + 929 - 164: 0xA6B1, + 931 - 164: 0xA6B2, + 932 - 164: 0xA6B3, + 933 - 164: 0xA6B4, + 934 - 164: 0xA6B5, + 935 - 164: 0xA6B6, + 936 - 164: 0xA6B7, + 937 - 164: 0xA6B8, + 945 - 164: 0xA6C1, + 946 - 164: 0xA6C2, + 947 - 164: 0xA6C3, + 948 - 164: 0xA6C4, + 949 - 164: 0xA6C5, + 950 - 164: 0xA6C6, + 951 - 164: 0xA6C7, + 952 - 164: 0xA6C8, + 953 - 164: 0xA6C9, + 954 - 164: 0xA6CA, + 955 - 164: 0xA6CB, + 956 - 164: 0xA6CC, + 957 - 164: 0xA6CD, + 958 - 164: 0xA6CE, + 959 - 164: 0xA6CF, + 960 - 164: 0xA6D0, + 961 - 164: 0xA6D1, + 963 - 164: 0xA6D2, + 964 - 164: 0xA6D3, + 965 - 164: 0xA6D4, + 966 - 164: 0xA6D5, + 967 - 164: 0xA6D6, + 968 - 164: 0xA6D7, + 969 - 164: 0xA6D8, + 1025 - 164: 0xA7A7, + 1040 - 164: 0xA7A1, + 1041 - 164: 0xA7A2, + 1042 - 164: 0xA7A3, + 1043 - 164: 0xA7A4, + 1044 - 164: 0xA7A5, + 1045 - 164: 0xA7A6, + 1046 - 164: 0xA7A8, + 1047 - 164: 0xA7A9, + 1048 - 164: 0xA7AA, + 1049 - 164: 0xA7AB, + 1050 - 164: 0xA7AC, + 1051 - 164: 0xA7AD, + 1052 - 164: 0xA7AE, + 1053 - 164: 0xA7AF, + 1054 - 164: 0xA7B0, + 1055 - 164: 0xA7B1, + 1056 - 164: 0xA7B2, + 1057 - 164: 0xA7B3, + 1058 - 164: 0xA7B4, + 1059 - 164: 0xA7B5, + 1060 - 164: 0xA7B6, + 1061 - 164: 0xA7B7, + 1062 - 164: 0xA7B8, + 1063 - 164: 0xA7B9, + 1064 - 164: 0xA7BA, + 1065 - 164: 0xA7BB, + 1066 - 164: 0xA7BC, + 1067 - 164: 0xA7BD, + 1068 - 164: 0xA7BE, + 1069 - 164: 0xA7BF, + 1070 - 164: 0xA7C0, + 1071 - 164: 0xA7C1, + 1072 - 164: 0xA7D1, + 1073 - 164: 0xA7D2, + 1074 - 164: 0xA7D3, + 1075 - 164: 0xA7D4, + 1076 - 164: 0xA7D5, + 1077 - 164: 0xA7D6, + 1078 - 164: 0xA7D8, + 1079 - 164: 0xA7D9, + 1080 - 164: 0xA7DA, + 1081 - 164: 0xA7DB, + 1082 - 164: 0xA7DC, + 1083 - 164: 0xA7DD, + 1084 - 164: 0xA7DE, + 1085 - 164: 0xA7DF, + 1086 - 164: 0xA7E0, + 1087 - 164: 0xA7E1, + 1088 - 164: 0xA7E2, + 1089 - 164: 0xA7E3, + 1090 - 164: 0xA7E4, + 1091 - 164: 0xA7E5, + 1092 - 164: 0xA7E6, + 1093 - 164: 0xA7E7, + 1094 - 164: 0xA7E8, + 1095 - 164: 0xA7E9, + 1096 - 164: 0xA7EA, + 1097 - 164: 0xA7EB, + 1098 - 164: 0xA7EC, + 1099 - 164: 0xA7ED, + 1100 - 164: 0xA7EE, + 1101 - 164: 0xA7EF, + 1102 - 164: 0xA7F0, + 1103 - 164: 0xA7F1, + 1105 - 164: 0xA7D7, +} + +const encode3Low, encode3High = 65072, 65510 + +var encode3 = [...]uint16{ + 65072 - 65072: 0xA955, + 65073 - 65072: 0xA6F2, + 65075 - 65072: 0xA6F4, + 65076 - 65072: 0xA6F5, + 65077 - 65072: 0xA6E0, + 65078 - 65072: 0xA6E1, + 65079 - 65072: 0xA6F0, + 65080 - 65072: 0xA6F1, + 65081 - 65072: 0xA6E2, + 65082 - 65072: 0xA6E3, + 65083 - 65072: 0xA6EE, + 65084 - 65072: 0xA6EF, + 65085 - 65072: 0xA6E6, + 65086 - 65072: 0xA6E7, + 65087 - 65072: 0xA6E4, + 65088 - 65072: 0xA6E5, + 65089 - 65072: 0xA6E8, + 65090 - 65072: 0xA6E9, + 65091 - 65072: 0xA6EA, + 65092 - 65072: 0xA6EB, + 65097 - 65072: 0xA968, + 65098 - 65072: 0xA969, + 65099 - 65072: 0xA96A, + 65100 - 65072: 0xA96B, + 65101 - 65072: 0xA96C, + 65102 - 65072: 0xA96D, + 65103 - 65072: 0xA96E, + 65104 - 65072: 0xA96F, + 65105 - 65072: 0xA970, + 65106 - 65072: 0xA971, + 65108 - 65072: 0xA972, + 65109 - 65072: 0xA973, + 65110 - 65072: 0xA974, + 65111 - 65072: 0xA975, + 65113 - 65072: 0xA976, + 65114 - 65072: 0xA977, + 65115 - 65072: 0xA978, + 65116 - 65072: 0xA979, + 65117 - 65072: 0xA97A, + 65118 - 65072: 0xA97B, + 65119 - 65072: 0xA97C, + 65120 - 65072: 0xA97D, + 65121 - 65072: 0xA97E, + 65122 - 65072: 0xA980, + 65123 - 65072: 0xA981, + 65124 - 65072: 0xA982, + 65125 - 65072: 0xA983, + 65126 - 65072: 0xA984, + 65128 - 65072: 0xA985, + 65129 - 65072: 0xA986, + 65130 - 65072: 0xA987, + 65131 - 65072: 0xA988, + 65281 - 65072: 0xA3A1, + 65282 - 65072: 0xA3A2, + 65283 - 65072: 0xA3A3, + 65284 - 65072: 0xA1E7, + 65285 - 65072: 0xA3A5, + 65286 - 65072: 0xA3A6, + 65287 - 65072: 0xA3A7, + 65288 - 65072: 0xA3A8, + 65289 - 65072: 0xA3A9, + 65290 - 65072: 0xA3AA, + 65291 - 65072: 0xA3AB, + 65292 - 65072: 0xA3AC, + 65293 - 65072: 0xA3AD, + 65294 - 65072: 0xA3AE, + 65295 - 65072: 0xA3AF, + 65296 - 65072: 0xA3B0, + 65297 - 65072: 0xA3B1, + 65298 - 65072: 0xA3B2, + 65299 - 65072: 0xA3B3, + 65300 - 65072: 0xA3B4, + 65301 - 65072: 0xA3B5, + 65302 - 65072: 0xA3B6, + 65303 - 65072: 0xA3B7, + 65304 - 65072: 0xA3B8, + 65305 - 65072: 0xA3B9, + 65306 - 65072: 0xA3BA, + 65307 - 65072: 0xA3BB, + 65308 - 65072: 0xA3BC, + 65309 - 65072: 0xA3BD, + 65310 - 65072: 0xA3BE, + 65311 - 65072: 0xA3BF, + 65312 - 65072: 0xA3C0, + 65313 - 65072: 0xA3C1, + 65314 - 65072: 0xA3C2, + 65315 - 65072: 0xA3C3, + 65316 - 65072: 0xA3C4, + 65317 - 65072: 0xA3C5, + 65318 - 65072: 0xA3C6, + 65319 - 65072: 0xA3C7, + 65320 - 65072: 0xA3C8, + 65321 - 65072: 0xA3C9, + 65322 - 65072: 0xA3CA, + 65323 - 65072: 0xA3CB, + 65324 - 65072: 0xA3CC, + 65325 - 65072: 0xA3CD, + 65326 - 65072: 0xA3CE, + 65327 - 65072: 0xA3CF, + 65328 - 65072: 0xA3D0, + 65329 - 65072: 0xA3D1, + 65330 - 65072: 0xA3D2, + 65331 - 65072: 0xA3D3, + 65332 - 65072: 0xA3D4, + 65333 - 65072: 0xA3D5, + 65334 - 65072: 0xA3D6, + 65335 - 65072: 0xA3D7, + 65336 - 65072: 0xA3D8, + 65337 - 65072: 0xA3D9, + 65338 - 65072: 0xA3DA, + 65339 - 65072: 0xA3DB, + 65340 - 65072: 0xA3DC, + 65341 - 65072: 0xA3DD, + 65342 - 65072: 0xA3DE, + 65343 - 65072: 0xA3DF, + 65344 - 65072: 0xA3E0, + 65345 - 65072: 0xA3E1, + 65346 - 65072: 0xA3E2, + 65347 - 65072: 0xA3E3, + 65348 - 65072: 0xA3E4, + 65349 - 65072: 0xA3E5, + 65350 - 65072: 0xA3E6, + 65351 - 65072: 0xA3E7, + 65352 - 65072: 0xA3E8, + 65353 - 65072: 0xA3E9, + 65354 - 65072: 0xA3EA, + 65355 - 65072: 0xA3EB, + 65356 - 65072: 0xA3EC, + 65357 - 65072: 0xA3ED, + 65358 - 65072: 0xA3EE, + 65359 - 65072: 0xA3EF, + 65360 - 65072: 0xA3F0, + 65361 - 65072: 0xA3F1, + 65362 - 65072: 0xA3F2, + 65363 - 65072: 0xA3F3, + 65364 - 65072: 0xA3F4, + 65365 - 65072: 0xA3F5, + 65366 - 65072: 0xA3F6, + 65367 - 65072: 0xA3F7, + 65368 - 65072: 0xA3F8, + 65369 - 65072: 0xA3F9, + 65370 - 65072: 0xA3FA, + 65371 - 65072: 0xA3FB, + 65372 - 65072: 0xA3FC, + 65373 - 65072: 0xA3FD, + 65374 - 65072: 0xA1AB, + 65504 - 65072: 0xA1E9, + 65505 - 65072: 0xA1EA, + 65506 - 65072: 0xA956, + 65507 - 65072: 0xA3FE, + 65508 - 65072: 0xA957, + 65509 - 65072: 0xA3A4, +} + +const encode4Low, encode4High = 63788, 64042 + +var encode4 = [...]uint16{ + 63788 - 63788: 0xFD9C, + 63865 - 63788: 0xFD9D, + 63893 - 63788: 0xFD9E, + 63975 - 63788: 0xFD9F, + 63985 - 63788: 0xFDA0, + 64012 - 63788: 0xFE40, + 64013 - 63788: 0xFE41, + 64014 - 63788: 0xFE42, + 64015 - 63788: 0xFE43, + 64017 - 63788: 0xFE44, + 64019 - 63788: 0xFE45, + 64020 - 63788: 0xFE46, + 64024 - 63788: 0xFE47, + 64031 - 63788: 0xFE48, + 64032 - 63788: 0xFE49, + 64033 - 63788: 0xFE4A, + 64035 - 63788: 0xFE4B, + 64036 - 63788: 0xFE4C, + 64039 - 63788: 0xFE4D, + 64040 - 63788: 0xFE4E, + 64041 - 63788: 0xFE4F, +} diff --git a/vendor/golang.org/x/text/encoding/testdata/candide-gb18030.txt b/vendor/golang.org/x/text/encoding/testdata/candide-gb18030.txt new file mode 100644 index 0000000000..bd7a572277 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/testdata/candide-gb18030.txt @@ -0,0 +1,510 @@ +This file was derived from +http://www.gutenberg.org/cache/epub/4650/pg4650.txt +-------- + + CANDIDE, + + ou + + L'OPTIMISME, + + TRADUIT DE L'ALLEMAND + + DE M. LE DOCTEUR RALPH, + + AVEC LES ADDITIONS + + QU'ON A TROUV07ES DANS LA POCHE DU DOCTEUR, LORSQU'IL MOURUT + + 08 MINDEN, L'AN DE GR00CE 1759 + + 1759 + + + +CHAPITRE I. + +Comment Candide fut lev dans un beau ch09teau, et comment il fut +chass d'icelui. + +Il y avait en Vestphalie, dans le ch09teau de M. le baron de +Thunder-ten-tronckh, un jeune gar04on qui la nature avait donn +les moeurs les plus douces. Sa physionomie annon04ait son 09me. +Il avait le jugement assez droit, avec l'esprit le plus simple; +c'est, je crois, pour cette raison qu'on le nommait Candide. Les +anciens domestiques de la maison soup04onnaient qu'il tait fils +de la soeur de monsieur le baron et d'un bon et honnte +gentilhomme du voisinage, que cette demoiselle ne voulut jamais +pouser parce qu'il n'avait pu prouver que soixante et onze +quartiers, et que le reste de son arbre gnalogique avait t +perdu par l'injure du temps. + +Monsieur le baron tait un des plus puissants seigneurs de la +Westphalie, car son ch09teau avait une porte et des fentres. Sa +grande salle mme tait orne d'une tapisserie. Tous les chiens +de ses basses-cours composaient une meute dans le besoin; ses +palefreniers taient ses piqueurs; le vicaire du village tait +son grand-aum00nier. Ils l'appelaient tous monseigneur, et ils +riaient quand il fesait des contes. + +Madame la baronne, qui pesait environ trois cent cinquante +livres, s'attirait par l une trs grande considration, et +fesait les honneurs de la maison avec une dignit qui la rendait +encore plus respectable. Sa fille Cungonde, 09ge de dix-sept +ans, tait haute en couleur, fra06che, grasse, apptissante. Le +fils du baron paraissait en tout digne de son pre. Le +prcepteur Pangloss[1] tait l'oracle de la maison, et le petit +Candide coutait ses le04ons avec toute la bonne foi de son 09ge et +de son caractre. + + [1] De _pan_, tout, et _glossa_, langue. B. + + +Pangloss enseignait la mtaphysico-thologo-cosmolonigologie. Il +prouvait admirablement qu'il n'y a point d'effet sans cause, et +que, dans ce meilleur des mondes possibles, le ch09teau de +monseigneur le baron tait le plus beau des ch09teaux, et madame +la meilleure des baronnes possibles. + +Il est dmontr, disait-il, que les choses ne peuvent tre +autrement; car tout tant fait pour une fin, tout est +ncessairement pour la meilleure fin. Remarquez bien que les nez +ont t faits pour porter des lunettes; aussi avons-nous des +lunettes[2]. Les jambes sont visiblement institues pour tre +chausses, et nous avons des chausses. Les pierres ont t +formes pour tre tailles et pour en faire des ch09teaux; aussi +monseigneur a un trs beau ch09teau: le plus grand baron de la +province doit tre le mieux log; et les cochons tant faits pour +tre mangs, nous mangeons du porc toute l'anne: par consquent, +ceux qui ont avanc que tout est bien ont dit une sottise; il +fallait dire que tout est au mieux. + + [2] Voyez tome XXVII, page 528; et dans les _Mlanges_, anne + 1738, le chapitre XI de la troisime partie des _07lments de la + philosophie de Newton_; et anne 1768, le chapitre X des + _Singularits de la nature_. B. + + +Candide coutait attentivement, et croyait innocemment; car il +trouvait mademoiselle Cungonde extrmement belle, quoiqu'il ne +pr06t jamais la hardiesse de le lui dire. Il concluait qu'aprs +le bonheur d'tre n baron de Thunder-ten-tronckh, le second +degr de bonheur tait d'tre mademoiselle Cungonde; le +troisime, de la voir tous les jours; et le quatrime, d'entendre +ma06tre Pangloss, le plus grand philosophe de la province, et par +consquent de toute la terre. + +Un jour Cungonde, en se promenant auprs du ch09teau, dans le +petit bois qu'on appelait parc, vit entre des broussailles le +docteur Pangloss qui donnait une le04on de physique exprimentale + la femme de chambre de sa mre, petite brune trs jolie et trs +docile. Comme mademoiselle Cungonde avait beaucoup de +disposition pour les sciences, elle observa, sans souffler, les +expriences ritres dont elle fut tmoin; elle vit clairement +la raison suffisante du docteur, les effets et les causes, et +s'en retourna tout agite, toute pensive, toute remplie du dsir +d'tre savante, songeant qu'elle pourrait bien tre la raison +suffisante du jeune Candide, qui pouvait aussi tre la sienne. + +Elle rencontra Candide en revenant au ch09teau, et rougit: Candide +rougit aussi . Elle lui dit bonjour d'une voix entrecoupe; et +Candide lui parla sans savoir ce qu'il disait. Le lendemain, +aprs le d06ner, comme on sortait de table, Cungonde et Candide +se trouvrent derrire un paravent; Cungonde laissa tomber son +mouchoir, Candide le ramassa; elle lui prit innocemment la main; +le jeune homme baisa innocemment la main de la jeune demoiselle +avec une vivacit, une sensibilit, une gr09ce toute particulire; +leurs bouches se rencontrrent, leurs yeux s'enflammrent, leurs +genoux tremblrent, leurs mains s'garrent. M. le baron de +Thunder-ten-tronckh passa auprs du paravent, et voyant cette +cause et cet effet, chassa Candide du ch09teau grands coups de +pied dans le derrire. Cungonde s'vanouit: elle fut soufflete +par madame la baronne ds qu'elle fut revenue elle-mme; et +tout fut constern dans le plus beau et le plus agrable des +ch09teaux possibles. + + + +CHAPITRE II + +Ce que devint Candide parmi les Bulgares. + + +Candide, chass du paradis terrestre, marcha longtemps sans +savoir o, pleurant, levant les yeux au ciel, les tournant +souvent vers le plus beau des ch09teaux qui renfermait la plus +belle des baronnettes; il se coucha sans souper au milieu des +champs entre deux sillons; la neige tombait gros flocons. +Candide, tout transi, se tra06na le lendemain vers la ville +voisine, qui s'appelle _Valdberghoff-trarbk-dikdorff_, n'ayant +point d'argent, mourant de faim et de lassitude. Il s'arrta +tristement la porte d'un cabaret. Deux hommes habills de bleu +le remarqurent: Camarade, dit l'un, voil un jeune homme trs +bien fait, et qui a la taille requise; ils s'avancrent vers +Candide et le prirent d06ner trs civilement.--Messieurs, leur +dit Candide avec une modestie charmante, vous me faites beaucoup +d'honneur, mais je n'ai pas de quoi payer mon cot.--Ah! +monsieur, lui dit un des bleus, les personnes de votre figure et +de votre mrite ne paient jamais rien: n'avez-vous pas cinq pieds +cinq pouces de haut?--Oui, messieurs, c'est ma taille, dit-il en +fesant la rvrence.--Ah! monsieur, mettez-vous table; non +seulement nous vous dfraierons, mais nous ne souffrirons jamais +qu'un homme comme vous manque d'argent; les hommes ne sont faits +que pour se secourir les uns les autres.--Vous avez raison, dit +Candide; c'est ce que M. Pangloss m'a toujours dit, et je vois +bien que tout est au mieux. On le prie d'accepter quelques cus, +il les prend et veut faire son billet; on n'en veut point, on se +met table. N'aimez-vous pas tendrement?....--Oh! oui, +rpond-il, j'aime tendrement mademoiselle Cungonde.--Non, dit +l'un de ces messieurs, nous vous demandons si vous n'aimez pas +tendrement le roi des Bulgares?--Point du tout, dit-il, car je ne +l'ai jamais vu.--Comment! c'est le plus charmant des rois, et il +faut boire sa sant.--Oh! trs volontiers, messieurs. Et il +boit. C'en est assez, lui dit-on, vous voil l'appui, le +soutien, le dfenseur, le hros des Bulgares; votre fortune est +faite, et votre gloire est assure. On lui met sur-le-champ les +fers aux pieds, et on le mne au rgiment. On le fait tourner +droite, gauche, hausser la baguette, remettre la baguette, +coucher en joue, tirer, doubler le pas, et on lui donne trente +coups de b09ton; le lendemain, il fait l'exercice un peu moins +mal, et il ne re04oit que vingt coups; le surlendemain, on ne lui +en donne que dix, et il est regard par ses camarades comme un +prodige. + +Candide, tout stupfait, ne dmlait pas encore trop bien comment +il tait un hros. Il s'avisa un beau jour de printemps de +s'aller promener, marchant tout droit devant lui, croyant que +c'tait un privilge de l'espce humaine, comme de l'espce +animale, de se servir de ses jambes son plaisir. Il n'eut pas +fait deux lieues que voil quatre autres hros de six pieds qui +l'atteignent, qui le lient, qui le mnent dans un cachot. On lui +demanda juridiquement ce qu'il aimait le mieux d'tre fustig +trente-six fois par tout le rgiment, ou de recevoir -la-fois +douze balles de plomb dans la cervelle. Il eut beau dire que les +volonts sont libres, et qu'il ne voulait ni l'un ni l'autre, il +fallut faire un choix; il se dtermina, en vertu du don de Dieu +qu'on nomme _libert_, passer trente-six fois par les +baguettes; il essuya deux promenades. Le rgiment tait compos +de deux mille hommes; cela lui composa quatre mille coups de +baguette, qui, depuis la nuque du cou jusqu'au cul, lui +dcouvrirent les muscles et les nerfs. Comme on allait procder + la troisime course, Candide, n'en pouvant plus, demanda en +gr09ce qu'on voul04t bien avoir la bont de lui casser la tte; il +obtint cette faveur; on lui bande les yeux; on le fait mettre +genoux. Le roi des Bulgares passe dans ce moment, s'informe du +crime du patient; et comme ce roi avait un grand gnie, il +comprit, par tout ce qu'il apprit de Candide, que c'tait un +jeune mtaphysicien fort ignorant des choses de ce monde, et il +lui accorda sa gr09ce avec une clmence qui sera loue dans tous +les journaux et dans tous les sicles. Un brave chirurgien +gurit Candide en trois semaines avec les mollients enseigns +par Dioscoride. Il avait dj un peu de peau et pouvait marcher, +quand le roi des Bulgares livra bataille au roi des Abares. + + + +CHAPITRE III. + +Comment Candide se sauva d'entre les Bulgares, et ce qu'il +devint. + + +Rien n'tait si beau, si leste, si brillant, si bien ordonn que +les deux armes. Les trompettes, les fifres, les hautbois, les +tambours, les canons; formaient une harmonie telle qu'il n'y en +eut jamais en enfer. Les canons renversrent d'abord peu prs +six mille hommes de chaque c00t; ensuite la mousqueterie 00ta du +meilleur des mondes environ neuf dix mille coquins qui en +infectaient la surface. La ba07onnette fut aussi la raison +suffisante de la mort de quelques milliers d'hommes. Le tout +pouvait bien se monter une trentaine de mille 09mes. Candide, +qui tremblait comme un philosophe, se cacha du mieux qu'il put +pendant cette boucherie hro07que. + +Enfin, tandis que les deux rois fesaient chanter des _Te Deum_, +chacun dans son camp, il prit le parti d'aller raisonner ailleurs +des effets et des causes. Il passa par-dessus des tas de morts +et de mourants, et gagna d'abord un village voisin; il tait en +cendres: c'tait un village abare que les Bulgares avaient br04l, +selon les lois du droit public. Ici des vieillards cribls de +coups regardaient mourir leurs femmes gorges, qui tenaient +leurs enfants leurs mamelles sanglantes; l des filles +ventres aprs avoir assouvi les besoins naturels de quelques +hros, rendaient les derniers soupirs; d'autres demi br04les +criaient qu'on achev09t de leur donner la mort. Des cervelles +taient rpandues sur la terre c00t de bras et de jambes +coups. + +Candide s'enfuit au plus vite dans un autre village: il +appartenait des Bulgares, et les hros abares l'avaient trait +de mme. Candide, toujours marchant sur des membres palpitants +ou travers des ruines, arriva enfin hors du th09tre de la +guerre, portant quelques petites provisions dans son bissac, et +n'oubliant jamais mademoiselle Cungonde. Ses provisions lui +manqurent quand il fut en Hollande; mais ayant entendu dire que +tout le monde tait riche dans ce pays-l, et qu'on y tait +chrtien, il ne douta pas qu'on ne le trait09t aussi bien qu'il +l'avait t dans le ch09teau de M. le baron, avant qu'il en e04t +t chass pour les beaux yeux de mademoiselle Cungonde. + +Il demanda l'aum00ne plusieurs graves personnages, qui lui +rpondirent tous que, s'il continuait faire ce mtier, on +l'enfermerait dans une maison de correction pour lui apprendre +vivre. + +Il s'adressa ensuite un homme qui venait de parler tout seul +une heure de suite sur la charit dans une grande assemble. Cet +orateur le regardant de travers lui dit: Que venez-vous faire +ici? y tes-vous pour la bonne cause? Il n'y a point d'effet sans +cause, rpondit modestement Candide; tout est encha06n +ncessairement et arrang pour le mieux. Il a fallu que je fusse +chass d'auprs de mademoiselle Cungonde, que j'aie pass par +les baguettes, et il faut que je demande mon pain, jusqu' ce que +je puisse en gagner; tout cela ne pouvait tre autrement. Mon +ami, lui dit l'orateur, croyez-vous que le pape soit +l'antechrist? Je ne l'avais pas encore entendu dire, rpondit +Candide: mais qu'il le soit, ou qu'il ne le soit pas, je manque +de pain. Tu ne mrites pas d'en manger, dit l'autre: va, coquin, +va, misrable, ne m'approche de ta vie. La femme de l'orateur +ayant mis la tte la fentre, et avisant un homme qui doutait +que le pape f04t antechrist, lui rpandit sur le chef un +plein..... O ciel! quel excs se porte le zle de la religion +dans les dames! + +Un homme qui n'avait point t baptis, un bon anabaptiste, nomm +Jacques, vit la manire cruelle et ignominieuse dont on traitait +ainsi un de ses frres, un tre deux pieds sans plumes, qui +avait une 09me; il l'amena chez lui, le nettoya, lui donna du pain +et de la bire, lui fit prsent de deux florins, et voulut mme +lui apprendre travailler dans ses manufactures aux toffes de +Perse qu'on fabrique en Hollande. Candide se prosternant presque +devant lui, s'criait: Ma06tre Pangloss me l'avait bien dit que +tout est au mieux dans ce monde, car je suis infiniment plus +touch de votre extrme gnrosit que de la duret de ce +monsieur manteau noir, et de madame son pouse. + +Le lendemain, en se promenant, il rencontra un gueux tout couvert +de pustules, les yeux morts, le bout du nez rong, la bouche de +travers, les dents noires, et parlant de la gorge, tourment +d'une toux violente, et crachant une dent chaque effort. + + + +CHAPITRE IV. + +Comment Candide rencontra son ancien ma06tre de philosophie, le +docteur Pangloss, et ce qui en advint. + + +Candide, plus mu encore de compassion que d'horreur, donna cet +pouvantable gueux les deux florins qu'il avait re04us de son +honnte anabaptiste Jacques. Le fant00me le regarda fixement, +versa des larmes, et sauta son cou. Candide effray recule. +Hlas! dit le misrable l'autre misrable, ne reconnaissez-vous +plus votre cher Pangloss? Qu'entends-je? vous, mon cher ma06tre! +vous, dans cet tat horrible! quel malheur vous est-il donc +arriv? pourquoi n'tes-vous plus dans le plus beau des ch09teaux? +qu'est devenue mademoiselle Cungonde, la perle des filles, le +chef-d'oeuvre de la nature? Je n'en peux plus, dit Pangloss. +Aussit00t Candide le mena dans l'table de l'anabaptiste, o il +lui fit manger un peu de pain; et quand Pangloss fut refait: Eh +bien! lui dit-il, Cungonde? Elle est morte, reprit l'autre. +Candide s'vanouit ce mot: son ami rappela ses sens avec un peu +de mauvais vinaigre qui se trouva par hasard dans l'table. +Candide rouvre les yeux. Cungonde est morte! Ah! meilleur des +mondes, o tes-vous? Mais de quelle maladie est-elle morte? ne +serait-ce point de m'avoir vu chasser du beau ch09teau de monsieur +son pre grands coups de pied? Non, dit Pangloss, elle a t +ventre par des soldats bulgares, aprs avoir t viole autant +qu'on peut l'tre; ils ont cass la tte monsieur le baron qui +voulait la dfendre; madame la baronne a t coupe en morceaux; +mon pauvre pupille trait prcisment comme sa soeur; et quant au +ch09teau, il n'est pas rest pierre sur pierre, pas une grange, +pas un mouton, pas un canard, pas un arbre; mais nous avons t +bien vengs, car les Abares en ont fait autant dans une baronnie +voisine qui appartenait un seigneur bulgare. + +A ce discours, Candide s'vanouit encore; mais revenu soi, et +ayant dit tout ce qu'il devait dire, il s'enquit de la cause et +de l'effet, et de la raison suffisante qui avait mis Pangloss +dans un si piteux tat. Hlas! dit l'autre, c'est l'amour: +l'amour, le consolateur du genre humain, le conservateur de +l'univers, l'09me de tous les tres sensibles, le tendre amour. +Hlas! dit Candide, je l'ai connu cet amour, ce souverain des +coeurs, cette 09me de notre 09me; il ne m'a jamais valu qu'un +baiser et vingt coups de pied au cul. Comment cette belle cause +a-t-elle pu produire en vous un effet si abominable? + +Pangloss rpondit en ces termes: O mon cher Candide! vous avez +connu Paquette, cette jolie suivante de notre auguste baronne: +j'ai go04t dans ses bras les dlices du paradis, qui ont produit +ces tourments d'enfer dont vous me voyez dvor; elle en tait +infecte, elle en est peut-tre morte. Paquette tenait ce +prsent d'un cordelier trs savant qui avait remont la source, +car il l'avait eu d'une vieille comtesse, qui l'avait re04u d'un +capitaine de cavalerie, qui le devait une marquise, qui le +tenait d'un page, qui l'avait re04u d'un jsuite, qui, tant +novice, l'avait eu en droite ligne d'un des compagnons de +Christophe Colomb. Pour moi, je ne le donnerai personne, car +je me meurs. + +O Pangloss! s'cria Candide, voil une trange gnalogie! +n'est-ce pas le diable qui en fut la souche? Point du tout, +rpliqua ce grand homme; c'tait une chose indispensable dans le +meilleur des mondes, un ingrdient ncessaire; car si Colomb +n'avait pas attrap dans une 06le de l'Amrique cette maladie[1] +qui empoisonne la source de la gnration, qui souvent mme +empche la gnration, et qui est videmment l'oppos du grand +but de la nature, nous n'aurions ni le chocolat ni la cochenille; +il faut encore observer que jusqu'aujourd'hui, dans notre +continent, cette maladie nous est particulire, comme la +controverse. Les Turcs, les Indiens, les Persans, les Chinois, +les Siamois, les Japonais, ne la connaissent pas encore; mais il +y a une raison suffisante pour qu'ils la connaissent leur tour +dans quelques sicles. En attendant elle a fait un merveilleux +progrs parmi nous, et surtout dans ces grandes armes composes +d'honntes stipendiaires bien levs, qui dcident du destin des +tats; on peut assurer que, quand trente mille hommes combattent +en bataille range contre des troupes gales en nombre, il y a +environ vingt mille vrols de chaque c00t. + + [1] Voyez tome XXXI, page 7. B. + + +Voil qui est admirable, dit Candide; mais il faut vous faire +gurir. Et comment le puis-je? dit Pangloss; je n'ai pas le sou, +mon ami, et dans toute l'tendue de ce globe on ne peut ni se +faire saigner, ni prendre un lavement sans payer, ou sans qu'il y +ait quelqu'un qui paie pour nous. + +Ce dernier discours dtermina Candide; il alla se jeter aux pieds +de son charitable anabaptiste Jacques, et lui fit une peinture si +touchante de l'tat o son ami tait rduit, que le bon-homme +n'hsita pas recueillir le docteur Pangloss; il le fit gurir +ses dpens. Pangloss, dans la cure, ne perdit qu'un oeil et une +oreille. Il crivait bien, et savait parfaitement +l'arithmtique. L'anabaptiste Jacques en fit son teneur de +livres. Au bout de deux mois, tant oblig d'aller Lisbonne +pour les affaires de son commerce, il mena dans son vaisseau ses +deux philosophes. Pangloss lui expliqua comment tout tait on ne +peut mieux. Jacques n'tait pas de cet avis. Il faut bien, +disait-il, que les hommes aient un peu corrompu la nature, car +ils ne sont point ns loups, et ils sont devenus loups. Dieu ne +leur a donn ni canons de vingt-quatre, ni ba07onnettes, et ils se +sont fait des ba07onnettes et des canons pour se dtruire. Je +pourrais mettre en ligne de compte les banqueroutes, et la +justice qui s'empare des biens des banqueroutiers pour en +frustrer les cranciers. Tout cela tait indispensable, +rpliquait le docteur borgne, et les malheurs particuliers font +le bien gnral; de sorte que plus il y a de malheurs +particuliers, et plus tout est bien. Tandis qu'il raisonnait, +l'air s'obscurcit, les vents soufflrent des quatre coins du +monde, et le vaisseau fut assailli de la plus horrible tempte, +la vue du port de Lisbonne. + + +CHAPITRE V. + +Tempte, naufrage, tremblement de terre, et ce qui advint du +docteur Pangloss, de Candide, et de l'anabaptiste Jacques. + +La moiti des passagers affaiblis, expirants de ces angoisses +inconcevables que le roulis d'un vaisseau porte dans les nerfs et +dans toutes les humeurs du corps agites en sens contraires, +n'avait pas mme la force de s'inquiter du danger. L'autre +moiti jetait des cris et fesait des prires; les voiles taient +dchires, les m09ts briss, le vaisseau entr'ouvert. Travaillait +qui pouvait, personne ne s'entendait, personne ne commandait. +L'anabaptiste aidait un peu la manoeuvre; il tait sur le +tillac; un matelot furieux le frappe rudement et l'tend sur les +planches; mais du coup qu'il lui donna, il eut lui-mme une si +violente secousse, qu'il tomba hors du vaisseau, la tte la +premire. Il restait suspendu et accroch une partie de m09t +rompu. Le bon Jacques court son secours, l'aide remonter, et +de l'effort qu'il fait, il est prcipit dans la mer la vue du +matelot, qui le laissa prir sans daigner seulement le regarder. +Candide approche, voit son bienfaiteur qui repara06t un moment, et +qui est englouti pour jamais. Il veut se jeter aprs lui dans la +mer: le philosophe Pangloss l'en empche, en lui prouvant que la +rade de Lisbonne avait t forme exprs pour que cet anabaptiste +s'y noy09t. Tandis qu'il le prouvait _ priori_, le vaisseau +s'entr'ouvre, tout prit la rserve de Pangloss, de Candide, et +de ce brutal de matelot qui avait noy le vertueux anabaptiste; +le coquin nagea heureusement jusqu'au rivage, o Pangloss et +Candide furent ports sur une planche. + +Quand ils furent revenus un peu eux, ils marchrent vers +Lisbonne; il leur restait quelque argent, avec lequel ils +espraient se sauver de la faim aprs avoir chapp la tempte. + +A peine ont-ils mis le pied dans la ville, en pleurant la mort de +leur bienfaiteur, qu'ils sentent la terre trembler sous leurs +pas[1]; la mer s'lve en bouillonnant dans le port, et brise les +vaisseaux qui sont l'ancre. Des tourbillons de flammes et de +cendres couvrent les rues et les places publiques; les maisons +s'croulent, les toits sont renverss sur les fondements, et les +fondements se dispersent; trente mille habitants de tout 09ge et +de tout sexe sont crass sous des ruines. Le matelot disait en +sifflant et en jurant: il y aura quelque chose gagner ici. +Quelle peut tre la raison suffisante de ce phnomne? disait +Pangloss. Voici le dernier jour du monde! s'criait Candide. +Le matelot court incontinent au milieu des dbris, affronte la +mort pour trouver de l'argent, en trouve, s'en empare, s'enivre, +et ayant cuv son vin, achte les faveurs de la premire fille de +bonne volont qu'il rencontre sur les ruines des maisons +dtruites, et au milieu des mourants et des morts. Pangloss le +tirait cependant par la manche: Mon ami, lui disait-il, cela +n'est pas bien, vous manquez la raison universelle, vous prenez +mal votre temps. Tte et sang, rpondit l'autre, je suis matelot +et n Batavia; j'ai march quatre fois sur le crucifix dans +quatre voyages au Japon[2]; tu as bien trouv ton homme avec ta +raison universelle! + + + [1] Le tremblement de terre de Lisbonne est du 1er novembre 1755. + B. + + [2] Voyez tome XVIII, page 470. B. + + +Quelques clats de pierre avaient bless Candide; il tait tendu +dans la rue et couvert de dbris. Il disait Pangloss: Hlas! +procure-moi un peu de vin et d'huile; je me meurs. Ce +tremblement de terre n'est pas une chose nouvelle, rpondit +Pangloss; la ville de Lima prouva les mmes secousses en +Amrique l'anne passe; mmes causes, mmes effets; il y a +certainement une tra06ne de soufre sous terre depuis Lima jusqu' +Lisbonne. Rien n'est plus probable, dit Candide; mais, pour +Dieu, un peu d'huile et de vin. Comment probable? rpliqua le +philosophe, je soutiens que la chose est dmontre. Candide +perdit connaissance, et Pangloss lui apporta un peu d'eau d'une +fontaine voisine. + +Le lendemain, ayant trouv quelques provisions de bouche en se +glissant travers des dcombres, ils rparrent un peu leurs +forces. Ensuite ils travaillrent comme les autres soulager +les habitants chapps la mort. Quelques citoyens, secourus +par eux, leur donnrent un aussi bon d06ner qu'on le pouvait dans +un tel dsastre: il est vrai que le repas tait triste; les +convives arrosaient leur pain de leurs larmes; mais Pangloss les +consola, en les assurant que les choses ne pouvaient tre +autrement: Car, dit-il, tout ceci est ce qu'il y a de mieux; car +s'il y a un volcan Lisbonne, il ne pouvait tre ailleurs; car +il est impossible que les choses ne soient pas o elles sont, car +tout est bien. + +Un petit homme noir, familier de l'inquisition, lequel tait +c00t de lui, prit poliment la parole et dit: Apparemment que +monsieur ne croit pas au pch originel; car si tout est au +mieux, il n'y a donc eu ni chute ni punition. + +Je demande trs humblement pardon votre excellence, rpondit +Pangloss encore plus poliment, car la chute de l'homme et la +maldiction entraient ncessairement dans le meilleur des mondes +possibles. Monsieur ne croit donc pas la libert? dit le +familier. Votre excellence m'excusera, dit Pangloss; la libert +peut subsister avec la ncessit absolue; car il tait ncessaire +que nous fussions libres; car enfin la volont dtermine...... +Pangloss tait au milieu de sa phrase, quand Je familier fit un +signe de tte son estafier qui lui servait boire du vin de +Porto ou d'Oporto. diff --git a/vendor/golang.org/x/text/encoding/testdata/candide-utf-16le.txt b/vendor/golang.org/x/text/encoding/testdata/candide-utf-16le.txt new file mode 100644 index 0000000000..820608bf13 Binary files /dev/null and b/vendor/golang.org/x/text/encoding/testdata/candide-utf-16le.txt differ diff --git a/vendor/golang.org/x/text/encoding/testdata/candide-utf-8.txt b/vendor/golang.org/x/text/encoding/testdata/candide-utf-8.txt new file mode 100644 index 0000000000..a4fd62993d --- /dev/null +++ b/vendor/golang.org/x/text/encoding/testdata/candide-utf-8.txt @@ -0,0 +1,510 @@ +This file was derived from +http://www.gutenberg.org/cache/epub/4650/pg4650.txt +-------- + + CANDIDE, + + ou + + L'OPTIMISME, + + TRADUIT DE L'ALLEMAND + + DE M. LE DOCTEUR RALPH, + + AVEC LES ADDITIONS + + QU'ON A TROUVÉES DANS LA POCHE DU DOCTEUR, LORSQU'IL MOURUT + + À MINDEN, L'AN DE GRÂCE 1759 + + 1759 + + + +CHAPITRE I. + +Comment Candide fut élevé dans un beau château, et comment il fut +chassé d'icelui. + +Il y avait en Vestphalie, dans le château de M. le baron de +Thunder-ten-tronckh, un jeune garçon à qui la nature avait donné +les moeurs les plus douces. Sa physionomie annonçait son âme. +Il avait le jugement assez droit, avec l'esprit le plus simple; +c'est, je crois, pour cette raison qu'on le nommait Candide. Les +anciens domestiques de la maison soupçonnaient qu'il était fils +de la soeur de monsieur le baron et d'un bon et honnête +gentilhomme du voisinage, que cette demoiselle ne voulut jamais +épouser parce qu'il n'avait pu prouver que soixante et onze +quartiers, et que le reste de son arbre généalogique avait été +perdu par l'injure du temps. + +Monsieur le baron était un des plus puissants seigneurs de la +Westphalie, car son château avait une porte et des fenêtres. Sa +grande salle même était ornée d'une tapisserie. Tous les chiens +de ses basses-cours composaient une meute dans le besoin; ses +palefreniers étaient ses piqueurs; le vicaire du village était +son grand-aumônier. Ils l'appelaient tous monseigneur, et ils +riaient quand il fesait des contes. + +Madame la baronne, qui pesait environ trois cent cinquante +livres, s'attirait par là une très grande considération, et +fesait les honneurs de la maison avec une dignité qui la rendait +encore plus respectable. Sa fille Cunégonde, âgée de dix-sept +ans, était haute en couleur, fraîche, grasse, appétissante. Le +fils du baron paraissait en tout digne de son père. Le +précepteur Pangloss[1] était l'oracle de la maison, et le petit +Candide écoutait ses leçons avec toute la bonne foi de son âge et +de son caractère. + + [1] De _pan_, tout, et _glossa_, langue. B. + + +Pangloss enseignait la métaphysico-théologo-cosmolonigologie. Il +prouvait admirablement qu'il n'y a point d'effet sans cause, et +que, dans ce meilleur des mondes possibles, le château de +monseigneur le baron était le plus beau des châteaux, et madame +la meilleure des baronnes possibles. + +Il est démontré, disait-il, que les choses ne peuvent être +autrement; car tout étant fait pour une fin, tout est +nécessairement pour la meilleure fin. Remarquez bien que les nez +ont été faits pour porter des lunettes; aussi avons-nous des +lunettes[2]. Les jambes sont visiblement instituées pour être +chaussées, et nous avons des chausses. Les pierres ont été +formées pour être taillées et pour en faire des châteaux; aussi +monseigneur a un très beau château: le plus grand baron de la +province doit être le mieux logé; et les cochons étant faits pour +être mangés, nous mangeons du porc toute l'année: par conséquent, +ceux qui ont avancé que tout est bien ont dit une sottise; il +fallait dire que tout est au mieux. + + [2] Voyez tome XXVII, page 528; et dans les _Mélanges_, année + 1738, le chapitre XI de la troisième partie des _Éléments de la + philosophie de Newton_; et année 1768, le chapitre X des + _Singularités de la nature_. B. + + +Candide écoutait attentivement, et croyait innocemment; car il +trouvait mademoiselle Cunégonde extrêmement belle, quoiqu'il ne +prît jamais la hardiesse de le lui dire. Il concluait qu'après +le bonheur d'être né baron de Thunder-ten-tronckh, le second +degré de bonheur était d'être mademoiselle Cunégonde; le +troisième, de la voir tous les jours; et le quatrième, d'entendre +maître Pangloss, le plus grand philosophe de la province, et par +conséquent de toute la terre. + +Un jour Cunégonde, en se promenant auprès du château, dans le +petit bois qu'on appelait parc, vit entre des broussailles le +docteur Pangloss qui donnait une leçon de physique expérimentale +à la femme de chambre de sa mère, petite brune très jolie et très +docile. Comme mademoiselle Cunégonde avait beaucoup de +disposition pour les sciences, elle observa, sans souffler, les +expériences réitérées dont elle fut témoin; elle vit clairement +la raison suffisante du docteur, les effets et les causes, et +s'en retourna tout agitée, toute pensive, toute remplie du désir +d'être savante, songeant qu'elle pourrait bien être la raison +suffisante du jeune Candide, qui pouvait aussi être la sienne. + +Elle rencontra Candide en revenant au château, et rougit: Candide +rougit aussi . Elle lui dit bonjour d'une voix entrecoupée; et +Candide lui parla sans savoir ce qu'il disait. Le lendemain, +après le dîner, comme on sortait de table, Cunégonde et Candide +se trouvèrent derrière un paravent; Cunégonde laissa tomber son +mouchoir, Candide le ramassa; elle lui prit innocemment la main; +le jeune homme baisa innocemment la main de la jeune demoiselle +avec une vivacité, une sensibilité, une grâce toute particulière; +leurs bouches se rencontrèrent, leurs yeux s'enflammèrent, leurs +genoux tremblèrent, leurs mains s'égarèrent. M. le baron de +Thunder-ten-tronckh passa auprès du paravent, et voyant cette +cause et cet effet, chassa Candide du château à grands coups de +pied dans le derrière. Cunégonde s'évanouit: elle fut souffletée +par madame la baronne dès qu'elle fut revenue à elle-même; et +tout fut consterné dans le plus beau et le plus agréable des +châteaux possibles. + + + +CHAPITRE II + +Ce que devint Candide parmi les Bulgares. + + +Candide, chassé du paradis terrestre, marcha longtemps sans +savoir où, pleurant, levant les yeux au ciel, les tournant +souvent vers le plus beau des châteaux qui renfermait la plus +belle des baronnettes; il se coucha sans souper au milieu des +champs entre deux sillons; la neige tombait à gros flocons. +Candide, tout transi, se traîna le lendemain vers la ville +voisine, qui s'appelle _Valdberghoff-trarbk-dikdorff_, n'ayant +point d'argent, mourant de faim et de lassitude. Il s'arrêta +tristement à la porte d'un cabaret. Deux hommes habillés de bleu +le remarquèrent: Camarade, dit l'un, voilà un jeune homme très +bien fait, et qui a la taille requise; ils s'avancèrent vers +Candide et le prièrent à dîner très civilement.--Messieurs, leur +dit Candide avec une modestie charmante, vous me faites beaucoup +d'honneur, mais je n'ai pas de quoi payer mon écot.--Ah! +monsieur, lui dit un des bleus, les personnes de votre figure et +de votre mérite ne paient jamais rien: n'avez-vous pas cinq pieds +cinq pouces de haut?--Oui, messieurs, c'est ma taille, dit-il en +fesant la révérence.--Ah! monsieur, mettez-vous à table; non +seulement nous vous défraierons, mais nous ne souffrirons jamais +qu'un homme comme vous manque d'argent; les hommes ne sont faits +que pour se secourir les uns les autres.--Vous avez raison, dit +Candide; c'est ce que M. Pangloss m'a toujours dit, et je vois +bien que tout est au mieux. On le prie d'accepter quelques écus, +il les prend et veut faire son billet; on n'en veut point, on se +met à table. N'aimez-vous pas tendrement?....--Oh! oui, +répond-il, j'aime tendrement mademoiselle Cunégonde.--Non, dit +l'un de ces messieurs, nous vous demandons si vous n'aimez pas +tendrement le roi des Bulgares?--Point du tout, dit-il, car je ne +l'ai jamais vu.--Comment! c'est le plus charmant des rois, et il +faut boire à sa santé.--Oh! très volontiers, messieurs. Et il +boit. C'en est assez, lui dit-on, vous voilà l'appui, le +soutien, le défenseur, le héros des Bulgares; votre fortune est +faite, et votre gloire est assurée. On lui met sur-le-champ les +fers aux pieds, et on le mène au régiment. On le fait tourner à +droite, à gauche, hausser la baguette, remettre la baguette, +coucher en joue, tirer, doubler le pas, et on lui donne trente +coups de bâton; le lendemain, il fait l'exercice un peu moins +mal, et il ne reçoit que vingt coups; le surlendemain, on ne lui +en donne que dix, et il est regardé par ses camarades comme un +prodige. + +Candide, tout stupéfait, ne démêlait pas encore trop bien comment +il était un héros. Il s'avisa un beau jour de printemps de +s'aller promener, marchant tout droit devant lui, croyant que +c'était un privilège de l'espèce humaine, comme de l'espèce +animale, de se servir de ses jambes à son plaisir. Il n'eut pas +fait deux lieues que voilà quatre autres héros de six pieds qui +l'atteignent, qui le lient, qui le mènent dans un cachot. On lui +demanda juridiquement ce qu'il aimait le mieux d'être fustigé +trente-six fois par tout le régiment, ou de recevoir à-la-fois +douze balles de plomb dans la cervelle. Il eut beau dire que les +volontés sont libres, et qu'il ne voulait ni l'un ni l'autre, il +fallut faire un choix; il se détermina, en vertu du don de Dieu +qu'on nomme _liberté_, à passer trente-six fois par les +baguettes; il essuya deux promenades. Le régiment était composé +de deux mille hommes; cela lui composa quatre mille coups de +baguette, qui, depuis la nuque du cou jusqu'au cul, lui +découvrirent les muscles et les nerfs. Comme on allait procéder +à la troisième course, Candide, n'en pouvant plus, demanda en +grâce qu'on voulût bien avoir la bonté de lui casser la tête; il +obtint cette faveur; on lui bande les yeux; on le fait mettre à +genoux. Le roi des Bulgares passe dans ce moment, s'informe du +crime du patient; et comme ce roi avait un grand génie, il +comprit, par tout ce qu'il apprit de Candide, que c'était un +jeune métaphysicien fort ignorant des choses de ce monde, et il +lui accorda sa grâce avec une clémence qui sera louée dans tous +les journaux et dans tous les siècles. Un brave chirurgien +guérit Candide en trois semaines avec les émollients enseignés +par Dioscoride. Il avait déjà un peu de peau et pouvait marcher, +quand le roi des Bulgares livra bataille au roi des Abares. + + + +CHAPITRE III. + +Comment Candide se sauva d'entre les Bulgares, et ce qu'il +devint. + + +Rien n'était si beau, si leste, si brillant, si bien ordonné que +les deux armées. Les trompettes, les fifres, les hautbois, les +tambours, les canons; formaient une harmonie telle qu'il n'y en +eut jamais en enfer. Les canons renversèrent d'abord à peu près +six mille hommes de chaque côté; ensuite la mousqueterie ôta du +meilleur des mondes environ neuf à dix mille coquins qui en +infectaient la surface. La baïonnette fut aussi la raison +suffisante de la mort de quelques milliers d'hommes. Le tout +pouvait bien se monter à une trentaine de mille âmes. Candide, +qui tremblait comme un philosophe, se cacha du mieux qu'il put +pendant cette boucherie héroïque. + +Enfin, tandis que les deux rois fesaient chanter des _Te Deum_, +chacun dans son camp, il prit le parti d'aller raisonner ailleurs +des effets et des causes. Il passa par-dessus des tas de morts +et de mourants, et gagna d'abord un village voisin; il était en +cendres: c'était un village abare que les Bulgares avaient brûlé, +selon les lois du droit public. Ici des vieillards criblés de +coups regardaient mourir leurs femmes égorgées, qui tenaient +leurs enfants à leurs mamelles sanglantes; là des filles +éventrées après avoir assouvi les besoins naturels de quelques +héros, rendaient les derniers soupirs; d'autres à demi brûlées +criaient qu'on achevât de leur donner la mort. Des cervelles +étaient répandues sur la terre à côté de bras et de jambes +coupés. + +Candide s'enfuit au plus vite dans un autre village: il +appartenait à des Bulgares, et les héros abares l'avaient traité +de même. Candide, toujours marchant sur des membres palpitants +ou à travers des ruines, arriva enfin hors du théâtre de la +guerre, portant quelques petites provisions dans son bissac, et +n'oubliant jamais mademoiselle Cunégonde. Ses provisions lui +manquèrent quand il fut en Hollande; mais ayant entendu dire que +tout le monde était riche dans ce pays-là, et qu'on y était +chrétien, il ne douta pas qu'on ne le traitât aussi bien qu'il +l'avait été dans le château de M. le baron, avant qu'il en eût +été chassé pour les beaux yeux de mademoiselle Cunégonde. + +Il demanda l'aumône à plusieurs graves personnages, qui lui +répondirent tous que, s'il continuait à faire ce métier, on +l'enfermerait dans une maison de correction pour lui apprendre à +vivre. + +Il s'adressa ensuite à un homme qui venait de parler tout seul +une heure de suite sur la charité dans une grande assemblée. Cet +orateur le regardant de travers lui dit: Que venez-vous faire +ici? y êtes-vous pour la bonne cause? Il n'y a point d'effet sans +cause, répondit modestement Candide; tout est enchaîné +nécessairement et arrangé pour le mieux. Il a fallu que je fusse +chassé d'auprès de mademoiselle Cunégonde, que j'aie passé par +les baguettes, et il faut que je demande mon pain, jusqu'à ce que +je puisse en gagner; tout cela ne pouvait être autrement. Mon +ami, lui dit l'orateur, croyez-vous que le pape soit +l'antechrist? Je ne l'avais pas encore entendu dire, répondit +Candide: mais qu'il le soit, ou qu'il ne le soit pas, je manque +de pain. Tu ne mérites pas d'en manger, dit l'autre: va, coquin, +va, misérable, ne m'approche de ta vie. La femme de l'orateur +ayant mis la tête à la fenêtre, et avisant un homme qui doutait +que le pape fût antechrist, lui répandit sur le chef un +plein..... O ciel! à quel excès se porte le zèle de la religion +dans les dames! + +Un homme qui n'avait point été baptisé, un bon anabaptiste, nommé +Jacques, vit la manière cruelle et ignominieuse dont on traitait +ainsi un de ses frères, un être à deux pieds sans plumes, qui +avait une âme; il l'amena chez lui, le nettoya, lui donna du pain +et de la bière, lui fit présent de deux florins, et voulut même +lui apprendre à travailler dans ses manufactures aux étoffes de +Perse qu'on fabrique en Hollande. Candide se prosternant presque +devant lui, s'écriait: Maître Pangloss me l'avait bien dit que +tout est au mieux dans ce monde, car je suis infiniment plus +touché de votre extrême générosité que de la dureté de ce +monsieur à manteau noir, et de madame son épouse. + +Le lendemain, en se promenant, il rencontra un gueux tout couvert +de pustules, les yeux morts, le bout du nez rongé, la bouche de +travers, les dents noires, et parlant de la gorge, tourmenté +d'une toux violente, et crachant une dent à chaque effort. + + + +CHAPITRE IV. + +Comment Candide rencontra son ancien maître de philosophie, le +docteur Pangloss, et ce qui en advint. + + +Candide, plus ému encore de compassion que d'horreur, donna à cet +épouvantable gueux les deux florins qu'il avait reçus de son +honnête anabaptiste Jacques. Le fantôme le regarda fixement, +versa des larmes, et sauta à son cou. Candide effrayé recule. +Hélas! dit le misérable à l'autre misérable, ne reconnaissez-vous +plus votre cher Pangloss? Qu'entends-je? vous, mon cher maître! +vous, dans cet état horrible! quel malheur vous est-il donc +arrivé? pourquoi n'êtes-vous plus dans le plus beau des châteaux? +qu'est devenue mademoiselle Cunégonde, la perle des filles, le +chef-d'oeuvre de la nature? Je n'en peux plus, dit Pangloss. +Aussitôt Candide le mena dans l'étable de l'anabaptiste, où il +lui fit manger un peu de pain; et quand Pangloss fut refait: Eh +bien! lui dit-il, Cunégonde? Elle est morte, reprit l'autre. +Candide s'évanouit à ce mot: son ami rappela ses sens avec un peu +de mauvais vinaigre qui se trouva par hasard dans l'étable. +Candide rouvre les yeux. Cunégonde est morte! Ah! meilleur des +mondes, où êtes-vous? Mais de quelle maladie est-elle morte? ne +serait-ce point de m'avoir vu chasser du beau château de monsieur +son père à grands coups de pied? Non, dit Pangloss, elle a été +éventrée par des soldats bulgares, après avoir été violée autant +qu'on peut l'être; ils ont cassé la tête à monsieur le baron qui +voulait la défendre; madame la baronne a été coupée en morceaux; +mon pauvre pupille traité précisément comme sa soeur; et quant au +château, il n'est pas resté pierre sur pierre, pas une grange, +pas un mouton, pas un canard, pas un arbre; mais nous avons été +bien vengés, car les Abares en ont fait autant dans une baronnie +voisine qui appartenait à un seigneur bulgare. + +A ce discours, Candide s'évanouit encore; mais revenu à soi, et +ayant dit tout ce qu'il devait dire, il s'enquit de la cause et +de l'effet, et de la raison suffisante qui avait mis Pangloss +dans un si piteux état. Hélas! dit l'autre, c'est l'amour: +l'amour, le consolateur du genre humain, le conservateur de +l'univers, l'âme de tous les êtres sensibles, le tendre amour. +Hélas! dit Candide, je l'ai connu cet amour, ce souverain des +coeurs, cette âme de notre âme; il ne m'a jamais valu qu'un +baiser et vingt coups de pied au cul. Comment cette belle cause +a-t-elle pu produire en vous un effet si abominable? + +Pangloss répondit en ces termes: O mon cher Candide! vous avez +connu Paquette, cette jolie suivante de notre auguste baronne: +j'ai goûté dans ses bras les délices du paradis, qui ont produit +ces tourments d'enfer dont vous me voyez dévoré; elle en était +infectée, elle en est peut-être morte. Paquette tenait ce +présent d'un cordelier très savant qui avait remonté à la source, +car il l'avait eu d'une vieille comtesse, qui l'avait reçu d'un +capitaine de cavalerie, qui le devait à une marquise, qui le +tenait d'un page, qui l'avait reçu d'un jésuite, qui, étant +novice, l'avait eu en droite ligne d'un des compagnons de +Christophe Colomb. Pour moi, je ne le donnerai à personne, car +je me meurs. + +O Pangloss! s'écria Candide, voilà une étrange généalogie! +n'est-ce pas le diable qui en fut la souche? Point du tout, +répliqua ce grand homme; c'était une chose indispensable dans le +meilleur des mondes, un ingrédient nécessaire; car si Colomb +n'avait pas attrapé dans une île de l'Amérique cette maladie[1] +qui empoisonne la source de la génération, qui souvent même +empêche la génération, et qui est évidemment l'opposé du grand +but de la nature, nous n'aurions ni le chocolat ni la cochenille; +il faut encore observer que jusqu'aujourd'hui, dans notre +continent, cette maladie nous est particulière, comme la +controverse. Les Turcs, les Indiens, les Persans, les Chinois, +les Siamois, les Japonais, ne la connaissent pas encore; mais il +y a une raison suffisante pour qu'ils la connaissent à leur tour +dans quelques siècles. En attendant elle a fait un merveilleux +progrès parmi nous, et surtout dans ces grandes armées composées +d'honnêtes stipendiaires bien élevés, qui décident du destin des +états; on peut assurer que, quand trente mille hommes combattent +en bataille rangée contre des troupes égales en nombre, il y a +environ vingt mille vérolés de chaque côté. + + [1] Voyez tome XXXI, page 7. B. + + +Voilà qui est admirable, dit Candide; mais il faut vous faire +guérir. Et comment le puis-je? dit Pangloss; je n'ai pas le sou, +mon ami, et dans toute l'étendue de ce globe on ne peut ni se +faire saigner, ni prendre un lavement sans payer, ou sans qu'il y +ait quelqu'un qui paie pour nous. + +Ce dernier discours détermina Candide; il alla se jeter aux pieds +de son charitable anabaptiste Jacques, et lui fit une peinture si +touchante de l'état où son ami était réduit, que le bon-homme +n'hésita pas à recueillir le docteur Pangloss; il le fit guérir à +ses dépens. Pangloss, dans la cure, ne perdit qu'un oeil et une +oreille. Il écrivait bien, et savait parfaitement +l'arithmétique. L'anabaptiste Jacques en fit son teneur de +livres. Au bout de deux mois, étant obligé d'aller à Lisbonne +pour les affaires de son commerce, il mena dans son vaisseau ses +deux philosophes. Pangloss lui expliqua comment tout était on ne +peut mieux. Jacques n'était pas de cet avis. Il faut bien, +disait-il, que les hommes aient un peu corrompu la nature, car +ils ne sont point nés loups, et ils sont devenus loups. Dieu ne +leur a donné ni canons de vingt-quatre, ni baïonnettes, et ils se +sont fait des baïonnettes et des canons pour se détruire. Je +pourrais mettre en ligne de compte les banqueroutes, et la +justice qui s'empare des biens des banqueroutiers pour en +frustrer les créanciers. Tout cela était indispensable, +répliquait le docteur borgne, et les malheurs particuliers font +le bien général; de sorte que plus il y a de malheurs +particuliers, et plus tout est bien. Tandis qu'il raisonnait, +l'air s'obscurcit, les vents soufflèrent des quatre coins du +monde, et le vaisseau fut assailli de la plus horrible tempête, à +la vue du port de Lisbonne. + + +CHAPITRE V. + +Tempête, naufrage, tremblement de terre, et ce qui advint du +docteur Pangloss, de Candide, et de l'anabaptiste Jacques. + +La moitié des passagers affaiblis, expirants de ces angoisses +inconcevables que le roulis d'un vaisseau porte dans les nerfs et +dans toutes les humeurs du corps agitées en sens contraires, +n'avait pas même la force de s'inquiéter du danger. L'autre +moitié jetait des cris et fesait des prières; les voiles étaient +déchirées, les mâts brisés, le vaisseau entr'ouvert. Travaillait +qui pouvait, personne ne s'entendait, personne ne commandait. +L'anabaptiste aidait un peu à la manoeuvre; il était sur le +tillac; un matelot furieux le frappe rudement et l'étend sur les +planches; mais du coup qu'il lui donna, il eut lui-même une si +violente secousse, qu'il tomba hors du vaisseau, la tête la +première. Il restait suspendu et accroché à une partie de mât +rompu. Le bon Jacques court à son secours, l'aide à remonter, et +de l'effort qu'il fait, il est précipité dans la mer à la vue du +matelot, qui le laissa périr sans daigner seulement le regarder. +Candide approche, voit son bienfaiteur qui reparaît un moment, et +qui est englouti pour jamais. Il veut se jeter après lui dans la +mer: le philosophe Pangloss l'en empêche, en lui prouvant que la +rade de Lisbonne avait été formée exprès pour que cet anabaptiste +s'y noyât. Tandis qu'il le prouvait _à priori_, le vaisseau +s'entr'ouvre, tout périt à la réserve de Pangloss, de Candide, et +de ce brutal de matelot qui avait noyé le vertueux anabaptiste; +le coquin nagea heureusement jusqu'au rivage, où Pangloss et +Candide furent portés sur une planche. + +Quand ils furent revenus un peu à eux, ils marchèrent vers +Lisbonne; il leur restait quelque argent, avec lequel ils +espéraient se sauver de la faim après avoir échappé à la tempête. + +A peine ont-ils mis le pied dans la ville, en pleurant la mort de +leur bienfaiteur, qu'ils sentent la terre trembler sous leurs +pas[1]; la mer s'élève en bouillonnant dans le port, et brise les +vaisseaux qui sont à l'ancre. Des tourbillons de flammes et de +cendres couvrent les rues et les places publiques; les maisons +s'écroulent, les toits sont renversés sur les fondements, et les +fondements se dispersent; trente mille habitants de tout âge et +de tout sexe sont écrasés sous des ruines. Le matelot disait en +sifflant et en jurant: il y aura quelque chose à gagner ici. +Quelle peut être la raison suffisante de ce phénomène? disait +Pangloss. Voici le dernier jour du monde! s'écriait Candide. +Le matelot court incontinent au milieu des débris, affronte la +mort pour trouver de l'argent, en trouve, s'en empare, s'enivre, +et ayant cuvé son vin, achète les faveurs de la première fille de +bonne volonté qu'il rencontre sur les ruines des maisons +détruites, et au milieu des mourants et des morts. Pangloss le +tirait cependant par la manche: Mon ami, lui disait-il, cela +n'est pas bien, vous manquez à la raison universelle, vous prenez +mal votre temps. Tête et sang, répondit l'autre, je suis matelot +et né à Batavia; j'ai marché quatre fois sur le crucifix dans +quatre voyages au Japon[2]; tu as bien trouvé ton homme avec ta +raison universelle! + + + [1] Le tremblement de terre de Lisbonne est du 1er novembre 1755. + B. + + [2] Voyez tome XVIII, page 470. B. + + +Quelques éclats de pierre avaient blessé Candide; il était étendu +dans la rue et couvert de débris. Il disait à Pangloss: Hélas! +procure-moi un peu de vin et d'huile; je me meurs. Ce +tremblement de terre n'est pas une chose nouvelle, répondit +Pangloss; la ville de Lima éprouva les mêmes secousses en +Amérique l'année passée; mêmes causes, mêmes effets; il y a +certainement une traînée de soufre sous terre depuis Lima jusqu'à +Lisbonne. Rien n'est plus probable, dit Candide; mais, pour +Dieu, un peu d'huile et de vin. Comment probable? répliqua le +philosophe, je soutiens que la chose est démontrée. Candide +perdit connaissance, et Pangloss lui apporta un peu d'eau d'une +fontaine voisine. + +Le lendemain, ayant trouvé quelques provisions de bouche en se +glissant à travers des décombres, ils réparèrent un peu leurs +forces. Ensuite ils travaillèrent comme les autres à soulager +les habitants échappés à la mort. Quelques citoyens, secourus +par eux, leur donnèrent un aussi bon dîner qu'on le pouvait dans +un tel désastre: il est vrai que le repas était triste; les +convives arrosaient leur pain de leurs larmes; mais Pangloss les +consola, en les assurant que les choses ne pouvaient être +autrement: Car, dit-il, tout ceci est ce qu'il y a de mieux; car +s'il y a un volcan à Lisbonne, il ne pouvait être ailleurs; car +il est impossible que les choses ne soient pas où elles sont, car +tout est bien. + +Un petit homme noir, familier de l'inquisition, lequel était à +côté de lui, prit poliment la parole et dit: Apparemment que +monsieur ne croit pas au péché originel; car si tout est au +mieux, il n'y a donc eu ni chute ni punition. + +Je demande très humblement pardon à votre excellence, répondit +Pangloss encore plus poliment, car la chute de l'homme et la +malédiction entraient nécessairement dans le meilleur des mondes +possibles. Monsieur ne croit donc pas à la liberté? dit le +familier. Votre excellence m'excusera, dit Pangloss; la liberté +peut subsister avec la nécessité absolue; car il était nécessaire +que nous fussions libres; car enfin la volonté déterminée...... +Pangloss était au milieu de sa phrase, quand Je familier fit un +signe de tête à son estafier qui lui servait à boire du vin de +Porto ou d'Oporto. diff --git a/vendor/golang.org/x/text/encoding/testdata/candide-windows-1252.txt b/vendor/golang.org/x/text/encoding/testdata/candide-windows-1252.txt new file mode 100644 index 0000000000..1f8f9eaaf9 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/testdata/candide-windows-1252.txt @@ -0,0 +1,510 @@ +This file was derived from +http://www.gutenberg.org/cache/epub/4650/pg4650.txt +-------- + + CANDIDE, + + ou + + L'OPTIMISME, + + TRADUIT DE L'ALLEMAND + + DE M. LE DOCTEUR RALPH, + + AVEC LES ADDITIONS + + QU'ON A TROUVES DANS LA POCHE DU DOCTEUR, LORSQU'IL MOURUT + + MINDEN, L'AN DE GRCE 1759 + + 1759 + + + +CHAPITRE I. + +Comment Candide fut lev dans un beau chteau, et comment il fut +chass d'icelui. + +Il y avait en Vestphalie, dans le chteau de M. le baron de +Thunder-ten-tronckh, un jeune garon qui la nature avait donn +les moeurs les plus douces. Sa physionomie annonait son me. +Il avait le jugement assez droit, avec l'esprit le plus simple; +c'est, je crois, pour cette raison qu'on le nommait Candide. Les +anciens domestiques de la maison souponnaient qu'il tait fils +de la soeur de monsieur le baron et d'un bon et honnte +gentilhomme du voisinage, que cette demoiselle ne voulut jamais +pouser parce qu'il n'avait pu prouver que soixante et onze +quartiers, et que le reste de son arbre gnalogique avait t +perdu par l'injure du temps. + +Monsieur le baron tait un des plus puissants seigneurs de la +Westphalie, car son chteau avait une porte et des fentres. Sa +grande salle mme tait orne d'une tapisserie. Tous les chiens +de ses basses-cours composaient une meute dans le besoin; ses +palefreniers taient ses piqueurs; le vicaire du village tait +son grand-aumnier. Ils l'appelaient tous monseigneur, et ils +riaient quand il fesait des contes. + +Madame la baronne, qui pesait environ trois cent cinquante +livres, s'attirait par l une trs grande considration, et +fesait les honneurs de la maison avec une dignit qui la rendait +encore plus respectable. Sa fille Cungonde, ge de dix-sept +ans, tait haute en couleur, frache, grasse, apptissante. Le +fils du baron paraissait en tout digne de son pre. Le +prcepteur Pangloss[1] tait l'oracle de la maison, et le petit +Candide coutait ses leons avec toute la bonne foi de son ge et +de son caractre. + + [1] De _pan_, tout, et _glossa_, langue. B. + + +Pangloss enseignait la mtaphysico-thologo-cosmolonigologie. Il +prouvait admirablement qu'il n'y a point d'effet sans cause, et +que, dans ce meilleur des mondes possibles, le chteau de +monseigneur le baron tait le plus beau des chteaux, et madame +la meilleure des baronnes possibles. + +Il est dmontr, disait-il, que les choses ne peuvent tre +autrement; car tout tant fait pour une fin, tout est +ncessairement pour la meilleure fin. Remarquez bien que les nez +ont t faits pour porter des lunettes; aussi avons-nous des +lunettes[2]. Les jambes sont visiblement institues pour tre +chausses, et nous avons des chausses. Les pierres ont t +formes pour tre tailles et pour en faire des chteaux; aussi +monseigneur a un trs beau chteau: le plus grand baron de la +province doit tre le mieux log; et les cochons tant faits pour +tre mangs, nous mangeons du porc toute l'anne: par consquent, +ceux qui ont avanc que tout est bien ont dit une sottise; il +fallait dire que tout est au mieux. + + [2] Voyez tome XXVII, page 528; et dans les _Mlanges_, anne + 1738, le chapitre XI de la troisime partie des _lments de la + philosophie de Newton_; et anne 1768, le chapitre X des + _Singularits de la nature_. B. + + +Candide coutait attentivement, et croyait innocemment; car il +trouvait mademoiselle Cungonde extrmement belle, quoiqu'il ne +prt jamais la hardiesse de le lui dire. Il concluait qu'aprs +le bonheur d'tre n baron de Thunder-ten-tronckh, le second +degr de bonheur tait d'tre mademoiselle Cungonde; le +troisime, de la voir tous les jours; et le quatrime, d'entendre +matre Pangloss, le plus grand philosophe de la province, et par +consquent de toute la terre. + +Un jour Cungonde, en se promenant auprs du chteau, dans le +petit bois qu'on appelait parc, vit entre des broussailles le +docteur Pangloss qui donnait une leon de physique exprimentale + la femme de chambre de sa mre, petite brune trs jolie et trs +docile. Comme mademoiselle Cungonde avait beaucoup de +disposition pour les sciences, elle observa, sans souffler, les +expriences ritres dont elle fut tmoin; elle vit clairement +la raison suffisante du docteur, les effets et les causes, et +s'en retourna tout agite, toute pensive, toute remplie du dsir +d'tre savante, songeant qu'elle pourrait bien tre la raison +suffisante du jeune Candide, qui pouvait aussi tre la sienne. + +Elle rencontra Candide en revenant au chteau, et rougit: Candide +rougit aussi . Elle lui dit bonjour d'une voix entrecoupe; et +Candide lui parla sans savoir ce qu'il disait. Le lendemain, +aprs le dner, comme on sortait de table, Cungonde et Candide +se trouvrent derrire un paravent; Cungonde laissa tomber son +mouchoir, Candide le ramassa; elle lui prit innocemment la main; +le jeune homme baisa innocemment la main de la jeune demoiselle +avec une vivacit, une sensibilit, une grce toute particulire; +leurs bouches se rencontrrent, leurs yeux s'enflammrent, leurs +genoux tremblrent, leurs mains s'garrent. M. le baron de +Thunder-ten-tronckh passa auprs du paravent, et voyant cette +cause et cet effet, chassa Candide du chteau grands coups de +pied dans le derrire. Cungonde s'vanouit: elle fut soufflete +par madame la baronne ds qu'elle fut revenue elle-mme; et +tout fut constern dans le plus beau et le plus agrable des +chteaux possibles. + + + +CHAPITRE II + +Ce que devint Candide parmi les Bulgares. + + +Candide, chass du paradis terrestre, marcha longtemps sans +savoir o, pleurant, levant les yeux au ciel, les tournant +souvent vers le plus beau des chteaux qui renfermait la plus +belle des baronnettes; il se coucha sans souper au milieu des +champs entre deux sillons; la neige tombait gros flocons. +Candide, tout transi, se trana le lendemain vers la ville +voisine, qui s'appelle _Valdberghoff-trarbk-dikdorff_, n'ayant +point d'argent, mourant de faim et de lassitude. Il s'arrta +tristement la porte d'un cabaret. Deux hommes habills de bleu +le remarqurent: Camarade, dit l'un, voil un jeune homme trs +bien fait, et qui a la taille requise; ils s'avancrent vers +Candide et le prirent dner trs civilement.--Messieurs, leur +dit Candide avec une modestie charmante, vous me faites beaucoup +d'honneur, mais je n'ai pas de quoi payer mon cot.--Ah! +monsieur, lui dit un des bleus, les personnes de votre figure et +de votre mrite ne paient jamais rien: n'avez-vous pas cinq pieds +cinq pouces de haut?--Oui, messieurs, c'est ma taille, dit-il en +fesant la rvrence.--Ah! monsieur, mettez-vous table; non +seulement nous vous dfraierons, mais nous ne souffrirons jamais +qu'un homme comme vous manque d'argent; les hommes ne sont faits +que pour se secourir les uns les autres.--Vous avez raison, dit +Candide; c'est ce que M. Pangloss m'a toujours dit, et je vois +bien que tout est au mieux. On le prie d'accepter quelques cus, +il les prend et veut faire son billet; on n'en veut point, on se +met table. N'aimez-vous pas tendrement?....--Oh! oui, +rpond-il, j'aime tendrement mademoiselle Cungonde.--Non, dit +l'un de ces messieurs, nous vous demandons si vous n'aimez pas +tendrement le roi des Bulgares?--Point du tout, dit-il, car je ne +l'ai jamais vu.--Comment! c'est le plus charmant des rois, et il +faut boire sa sant.--Oh! trs volontiers, messieurs. Et il +boit. C'en est assez, lui dit-on, vous voil l'appui, le +soutien, le dfenseur, le hros des Bulgares; votre fortune est +faite, et votre gloire est assure. On lui met sur-le-champ les +fers aux pieds, et on le mne au rgiment. On le fait tourner +droite, gauche, hausser la baguette, remettre la baguette, +coucher en joue, tirer, doubler le pas, et on lui donne trente +coups de bton; le lendemain, il fait l'exercice un peu moins +mal, et il ne reoit que vingt coups; le surlendemain, on ne lui +en donne que dix, et il est regard par ses camarades comme un +prodige. + +Candide, tout stupfait, ne dmlait pas encore trop bien comment +il tait un hros. Il s'avisa un beau jour de printemps de +s'aller promener, marchant tout droit devant lui, croyant que +c'tait un privilge de l'espce humaine, comme de l'espce +animale, de se servir de ses jambes son plaisir. Il n'eut pas +fait deux lieues que voil quatre autres hros de six pieds qui +l'atteignent, qui le lient, qui le mnent dans un cachot. On lui +demanda juridiquement ce qu'il aimait le mieux d'tre fustig +trente-six fois par tout le rgiment, ou de recevoir -la-fois +douze balles de plomb dans la cervelle. Il eut beau dire que les +volonts sont libres, et qu'il ne voulait ni l'un ni l'autre, il +fallut faire un choix; il se dtermina, en vertu du don de Dieu +qu'on nomme _libert_, passer trente-six fois par les +baguettes; il essuya deux promenades. Le rgiment tait compos +de deux mille hommes; cela lui composa quatre mille coups de +baguette, qui, depuis la nuque du cou jusqu'au cul, lui +dcouvrirent les muscles et les nerfs. Comme on allait procder + la troisime course, Candide, n'en pouvant plus, demanda en +grce qu'on voult bien avoir la bont de lui casser la tte; il +obtint cette faveur; on lui bande les yeux; on le fait mettre +genoux. Le roi des Bulgares passe dans ce moment, s'informe du +crime du patient; et comme ce roi avait un grand gnie, il +comprit, par tout ce qu'il apprit de Candide, que c'tait un +jeune mtaphysicien fort ignorant des choses de ce monde, et il +lui accorda sa grce avec une clmence qui sera loue dans tous +les journaux et dans tous les sicles. Un brave chirurgien +gurit Candide en trois semaines avec les mollients enseigns +par Dioscoride. Il avait dj un peu de peau et pouvait marcher, +quand le roi des Bulgares livra bataille au roi des Abares. + + + +CHAPITRE III. + +Comment Candide se sauva d'entre les Bulgares, et ce qu'il +devint. + + +Rien n'tait si beau, si leste, si brillant, si bien ordonn que +les deux armes. Les trompettes, les fifres, les hautbois, les +tambours, les canons; formaient une harmonie telle qu'il n'y en +eut jamais en enfer. Les canons renversrent d'abord peu prs +six mille hommes de chaque ct; ensuite la mousqueterie ta du +meilleur des mondes environ neuf dix mille coquins qui en +infectaient la surface. La baonnette fut aussi la raison +suffisante de la mort de quelques milliers d'hommes. Le tout +pouvait bien se monter une trentaine de mille mes. Candide, +qui tremblait comme un philosophe, se cacha du mieux qu'il put +pendant cette boucherie hroque. + +Enfin, tandis que les deux rois fesaient chanter des _Te Deum_, +chacun dans son camp, il prit le parti d'aller raisonner ailleurs +des effets et des causes. Il passa par-dessus des tas de morts +et de mourants, et gagna d'abord un village voisin; il tait en +cendres: c'tait un village abare que les Bulgares avaient brl, +selon les lois du droit public. Ici des vieillards cribls de +coups regardaient mourir leurs femmes gorges, qui tenaient +leurs enfants leurs mamelles sanglantes; l des filles +ventres aprs avoir assouvi les besoins naturels de quelques +hros, rendaient les derniers soupirs; d'autres demi brles +criaient qu'on achevt de leur donner la mort. Des cervelles +taient rpandues sur la terre ct de bras et de jambes +coups. + +Candide s'enfuit au plus vite dans un autre village: il +appartenait des Bulgares, et les hros abares l'avaient trait +de mme. Candide, toujours marchant sur des membres palpitants +ou travers des ruines, arriva enfin hors du thtre de la +guerre, portant quelques petites provisions dans son bissac, et +n'oubliant jamais mademoiselle Cungonde. Ses provisions lui +manqurent quand il fut en Hollande; mais ayant entendu dire que +tout le monde tait riche dans ce pays-l, et qu'on y tait +chrtien, il ne douta pas qu'on ne le traitt aussi bien qu'il +l'avait t dans le chteau de M. le baron, avant qu'il en et +t chass pour les beaux yeux de mademoiselle Cungonde. + +Il demanda l'aumne plusieurs graves personnages, qui lui +rpondirent tous que, s'il continuait faire ce mtier, on +l'enfermerait dans une maison de correction pour lui apprendre +vivre. + +Il s'adressa ensuite un homme qui venait de parler tout seul +une heure de suite sur la charit dans une grande assemble. Cet +orateur le regardant de travers lui dit: Que venez-vous faire +ici? y tes-vous pour la bonne cause? Il n'y a point d'effet sans +cause, rpondit modestement Candide; tout est enchan +ncessairement et arrang pour le mieux. Il a fallu que je fusse +chass d'auprs de mademoiselle Cungonde, que j'aie pass par +les baguettes, et il faut que je demande mon pain, jusqu' ce que +je puisse en gagner; tout cela ne pouvait tre autrement. Mon +ami, lui dit l'orateur, croyez-vous que le pape soit +l'antechrist? Je ne l'avais pas encore entendu dire, rpondit +Candide: mais qu'il le soit, ou qu'il ne le soit pas, je manque +de pain. Tu ne mrites pas d'en manger, dit l'autre: va, coquin, +va, misrable, ne m'approche de ta vie. La femme de l'orateur +ayant mis la tte la fentre, et avisant un homme qui doutait +que le pape ft antechrist, lui rpandit sur le chef un +plein..... O ciel! quel excs se porte le zle de la religion +dans les dames! + +Un homme qui n'avait point t baptis, un bon anabaptiste, nomm +Jacques, vit la manire cruelle et ignominieuse dont on traitait +ainsi un de ses frres, un tre deux pieds sans plumes, qui +avait une me; il l'amena chez lui, le nettoya, lui donna du pain +et de la bire, lui fit prsent de deux florins, et voulut mme +lui apprendre travailler dans ses manufactures aux toffes de +Perse qu'on fabrique en Hollande. Candide se prosternant presque +devant lui, s'criait: Matre Pangloss me l'avait bien dit que +tout est au mieux dans ce monde, car je suis infiniment plus +touch de votre extrme gnrosit que de la duret de ce +monsieur manteau noir, et de madame son pouse. + +Le lendemain, en se promenant, il rencontra un gueux tout couvert +de pustules, les yeux morts, le bout du nez rong, la bouche de +travers, les dents noires, et parlant de la gorge, tourment +d'une toux violente, et crachant une dent chaque effort. + + + +CHAPITRE IV. + +Comment Candide rencontra son ancien matre de philosophie, le +docteur Pangloss, et ce qui en advint. + + +Candide, plus mu encore de compassion que d'horreur, donna cet +pouvantable gueux les deux florins qu'il avait reus de son +honnte anabaptiste Jacques. Le fantme le regarda fixement, +versa des larmes, et sauta son cou. Candide effray recule. +Hlas! dit le misrable l'autre misrable, ne reconnaissez-vous +plus votre cher Pangloss? Qu'entends-je? vous, mon cher matre! +vous, dans cet tat horrible! quel malheur vous est-il donc +arriv? pourquoi n'tes-vous plus dans le plus beau des chteaux? +qu'est devenue mademoiselle Cungonde, la perle des filles, le +chef-d'oeuvre de la nature? Je n'en peux plus, dit Pangloss. +Aussitt Candide le mena dans l'table de l'anabaptiste, o il +lui fit manger un peu de pain; et quand Pangloss fut refait: Eh +bien! lui dit-il, Cungonde? Elle est morte, reprit l'autre. +Candide s'vanouit ce mot: son ami rappela ses sens avec un peu +de mauvais vinaigre qui se trouva par hasard dans l'table. +Candide rouvre les yeux. Cungonde est morte! Ah! meilleur des +mondes, o tes-vous? Mais de quelle maladie est-elle morte? ne +serait-ce point de m'avoir vu chasser du beau chteau de monsieur +son pre grands coups de pied? Non, dit Pangloss, elle a t +ventre par des soldats bulgares, aprs avoir t viole autant +qu'on peut l'tre; ils ont cass la tte monsieur le baron qui +voulait la dfendre; madame la baronne a t coupe en morceaux; +mon pauvre pupille trait prcisment comme sa soeur; et quant au +chteau, il n'est pas rest pierre sur pierre, pas une grange, +pas un mouton, pas un canard, pas un arbre; mais nous avons t +bien vengs, car les Abares en ont fait autant dans une baronnie +voisine qui appartenait un seigneur bulgare. + +A ce discours, Candide s'vanouit encore; mais revenu soi, et +ayant dit tout ce qu'il devait dire, il s'enquit de la cause et +de l'effet, et de la raison suffisante qui avait mis Pangloss +dans un si piteux tat. Hlas! dit l'autre, c'est l'amour: +l'amour, le consolateur du genre humain, le conservateur de +l'univers, l'me de tous les tres sensibles, le tendre amour. +Hlas! dit Candide, je l'ai connu cet amour, ce souverain des +coeurs, cette me de notre me; il ne m'a jamais valu qu'un +baiser et vingt coups de pied au cul. Comment cette belle cause +a-t-elle pu produire en vous un effet si abominable? + +Pangloss rpondit en ces termes: O mon cher Candide! vous avez +connu Paquette, cette jolie suivante de notre auguste baronne: +j'ai got dans ses bras les dlices du paradis, qui ont produit +ces tourments d'enfer dont vous me voyez dvor; elle en tait +infecte, elle en est peut-tre morte. Paquette tenait ce +prsent d'un cordelier trs savant qui avait remont la source, +car il l'avait eu d'une vieille comtesse, qui l'avait reu d'un +capitaine de cavalerie, qui le devait une marquise, qui le +tenait d'un page, qui l'avait reu d'un jsuite, qui, tant +novice, l'avait eu en droite ligne d'un des compagnons de +Christophe Colomb. Pour moi, je ne le donnerai personne, car +je me meurs. + +O Pangloss! s'cria Candide, voil une trange gnalogie! +n'est-ce pas le diable qui en fut la souche? Point du tout, +rpliqua ce grand homme; c'tait une chose indispensable dans le +meilleur des mondes, un ingrdient ncessaire; car si Colomb +n'avait pas attrap dans une le de l'Amrique cette maladie[1] +qui empoisonne la source de la gnration, qui souvent mme +empche la gnration, et qui est videmment l'oppos du grand +but de la nature, nous n'aurions ni le chocolat ni la cochenille; +il faut encore observer que jusqu'aujourd'hui, dans notre +continent, cette maladie nous est particulire, comme la +controverse. Les Turcs, les Indiens, les Persans, les Chinois, +les Siamois, les Japonais, ne la connaissent pas encore; mais il +y a une raison suffisante pour qu'ils la connaissent leur tour +dans quelques sicles. En attendant elle a fait un merveilleux +progrs parmi nous, et surtout dans ces grandes armes composes +d'honntes stipendiaires bien levs, qui dcident du destin des +tats; on peut assurer que, quand trente mille hommes combattent +en bataille range contre des troupes gales en nombre, il y a +environ vingt mille vrols de chaque ct. + + [1] Voyez tome XXXI, page 7. B. + + +Voil qui est admirable, dit Candide; mais il faut vous faire +gurir. Et comment le puis-je? dit Pangloss; je n'ai pas le sou, +mon ami, et dans toute l'tendue de ce globe on ne peut ni se +faire saigner, ni prendre un lavement sans payer, ou sans qu'il y +ait quelqu'un qui paie pour nous. + +Ce dernier discours dtermina Candide; il alla se jeter aux pieds +de son charitable anabaptiste Jacques, et lui fit une peinture si +touchante de l'tat o son ami tait rduit, que le bon-homme +n'hsita pas recueillir le docteur Pangloss; il le fit gurir +ses dpens. Pangloss, dans la cure, ne perdit qu'un oeil et une +oreille. Il crivait bien, et savait parfaitement +l'arithmtique. L'anabaptiste Jacques en fit son teneur de +livres. Au bout de deux mois, tant oblig d'aller Lisbonne +pour les affaires de son commerce, il mena dans son vaisseau ses +deux philosophes. Pangloss lui expliqua comment tout tait on ne +peut mieux. Jacques n'tait pas de cet avis. Il faut bien, +disait-il, que les hommes aient un peu corrompu la nature, car +ils ne sont point ns loups, et ils sont devenus loups. Dieu ne +leur a donn ni canons de vingt-quatre, ni baonnettes, et ils se +sont fait des baonnettes et des canons pour se dtruire. Je +pourrais mettre en ligne de compte les banqueroutes, et la +justice qui s'empare des biens des banqueroutiers pour en +frustrer les cranciers. Tout cela tait indispensable, +rpliquait le docteur borgne, et les malheurs particuliers font +le bien gnral; de sorte que plus il y a de malheurs +particuliers, et plus tout est bien. Tandis qu'il raisonnait, +l'air s'obscurcit, les vents soufflrent des quatre coins du +monde, et le vaisseau fut assailli de la plus horrible tempte, +la vue du port de Lisbonne. + + +CHAPITRE V. + +Tempte, naufrage, tremblement de terre, et ce qui advint du +docteur Pangloss, de Candide, et de l'anabaptiste Jacques. + +La moiti des passagers affaiblis, expirants de ces angoisses +inconcevables que le roulis d'un vaisseau porte dans les nerfs et +dans toutes les humeurs du corps agites en sens contraires, +n'avait pas mme la force de s'inquiter du danger. L'autre +moiti jetait des cris et fesait des prires; les voiles taient +dchires, les mts briss, le vaisseau entr'ouvert. Travaillait +qui pouvait, personne ne s'entendait, personne ne commandait. +L'anabaptiste aidait un peu la manoeuvre; il tait sur le +tillac; un matelot furieux le frappe rudement et l'tend sur les +planches; mais du coup qu'il lui donna, il eut lui-mme une si +violente secousse, qu'il tomba hors du vaisseau, la tte la +premire. Il restait suspendu et accroch une partie de mt +rompu. Le bon Jacques court son secours, l'aide remonter, et +de l'effort qu'il fait, il est prcipit dans la mer la vue du +matelot, qui le laissa prir sans daigner seulement le regarder. +Candide approche, voit son bienfaiteur qui reparat un moment, et +qui est englouti pour jamais. Il veut se jeter aprs lui dans la +mer: le philosophe Pangloss l'en empche, en lui prouvant que la +rade de Lisbonne avait t forme exprs pour que cet anabaptiste +s'y noyt. Tandis qu'il le prouvait _ priori_, le vaisseau +s'entr'ouvre, tout prit la rserve de Pangloss, de Candide, et +de ce brutal de matelot qui avait noy le vertueux anabaptiste; +le coquin nagea heureusement jusqu'au rivage, o Pangloss et +Candide furent ports sur une planche. + +Quand ils furent revenus un peu eux, ils marchrent vers +Lisbonne; il leur restait quelque argent, avec lequel ils +espraient se sauver de la faim aprs avoir chapp la tempte. + +A peine ont-ils mis le pied dans la ville, en pleurant la mort de +leur bienfaiteur, qu'ils sentent la terre trembler sous leurs +pas[1]; la mer s'lve en bouillonnant dans le port, et brise les +vaisseaux qui sont l'ancre. Des tourbillons de flammes et de +cendres couvrent les rues et les places publiques; les maisons +s'croulent, les toits sont renverss sur les fondements, et les +fondements se dispersent; trente mille habitants de tout ge et +de tout sexe sont crass sous des ruines. Le matelot disait en +sifflant et en jurant: il y aura quelque chose gagner ici. +Quelle peut tre la raison suffisante de ce phnomne? disait +Pangloss. Voici le dernier jour du monde! s'criait Candide. +Le matelot court incontinent au milieu des dbris, affronte la +mort pour trouver de l'argent, en trouve, s'en empare, s'enivre, +et ayant cuv son vin, achte les faveurs de la premire fille de +bonne volont qu'il rencontre sur les ruines des maisons +dtruites, et au milieu des mourants et des morts. Pangloss le +tirait cependant par la manche: Mon ami, lui disait-il, cela +n'est pas bien, vous manquez la raison universelle, vous prenez +mal votre temps. Tte et sang, rpondit l'autre, je suis matelot +et n Batavia; j'ai march quatre fois sur le crucifix dans +quatre voyages au Japon[2]; tu as bien trouv ton homme avec ta +raison universelle! + + + [1] Le tremblement de terre de Lisbonne est du 1er novembre 1755. + B. + + [2] Voyez tome XVIII, page 470. B. + + +Quelques clats de pierre avaient bless Candide; il tait tendu +dans la rue et couvert de dbris. Il disait Pangloss: Hlas! +procure-moi un peu de vin et d'huile; je me meurs. Ce +tremblement de terre n'est pas une chose nouvelle, rpondit +Pangloss; la ville de Lima prouva les mmes secousses en +Amrique l'anne passe; mmes causes, mmes effets; il y a +certainement une trane de soufre sous terre depuis Lima jusqu' +Lisbonne. Rien n'est plus probable, dit Candide; mais, pour +Dieu, un peu d'huile et de vin. Comment probable? rpliqua le +philosophe, je soutiens que la chose est dmontre. Candide +perdit connaissance, et Pangloss lui apporta un peu d'eau d'une +fontaine voisine. + +Le lendemain, ayant trouv quelques provisions de bouche en se +glissant travers des dcombres, ils rparrent un peu leurs +forces. Ensuite ils travaillrent comme les autres soulager +les habitants chapps la mort. Quelques citoyens, secourus +par eux, leur donnrent un aussi bon dner qu'on le pouvait dans +un tel dsastre: il est vrai que le repas tait triste; les +convives arrosaient leur pain de leurs larmes; mais Pangloss les +consola, en les assurant que les choses ne pouvaient tre +autrement: Car, dit-il, tout ceci est ce qu'il y a de mieux; car +s'il y a un volcan Lisbonne, il ne pouvait tre ailleurs; car +il est impossible que les choses ne soient pas o elles sont, car +tout est bien. + +Un petit homme noir, familier de l'inquisition, lequel tait +ct de lui, prit poliment la parole et dit: Apparemment que +monsieur ne croit pas au pch originel; car si tout est au +mieux, il n'y a donc eu ni chute ni punition. + +Je demande trs humblement pardon votre excellence, rpondit +Pangloss encore plus poliment, car la chute de l'homme et la +maldiction entraient ncessairement dans le meilleur des mondes +possibles. Monsieur ne croit donc pas la libert? dit le +familier. Votre excellence m'excusera, dit Pangloss; la libert +peut subsister avec la ncessit absolue; car il tait ncessaire +que nous fussions libres; car enfin la volont dtermine...... +Pangloss tait au milieu de sa phrase, quand Je familier fit un +signe de tte son estafier qui lui servait boire du vin de +Porto ou d'Oporto. diff --git a/vendor/golang.org/x/text/encoding/testdata/rashomon-euc-jp.txt b/vendor/golang.org/x/text/encoding/testdata/rashomon-euc-jp.txt new file mode 100644 index 0000000000..7b03a99069 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/testdata/rashomon-euc-jp.txt @@ -0,0 +1,178 @@ +This file was derived from +http://www.gutenberg.org/cache/epub/1982/pg1982.txt +-------- + + +ζǷ + +λǤ롣ͤβͤβDZߤԤäƤ +βˤϡˤγï⤤ʤ꡹ðɤ礭ʱˡ꤮ +ꤹɤȤޤäƤ롣礬ϩˤʾϡˤγˤ⡢ +򤹤Խޤ汨˹Ҥ⤦󻰿ͤϤꤽʤΤǤ롣줬ˤγ +ï⤤ʤ +ΤȱȡǯԤˤϡϿ̤ȤȤлȤȤ +ĤŤƵäΤӤϰ̤Ǥʤ쵭ˤȡʩ +ʩǺդơðĤꡢʤϤˤĤꤷڤϩФ +Ĥ߽ŤͤƿŤʤˤäƤȱȤǤ롣椬λǤ뤫顢 +νʤɤϡïΤƤƸܤߤԤʤäȤιӤ̤Ƥ +褤ˤơìʤˤࡣͤࡣȤȤޤˤϡ +ʤͤ򡢤ػäơΤƤƹԤȱ褿ǡ +ʤʤȡïǤⵤ̣򰭤äơζؤ­֤ߤ򤷤ʤˤʤ +ƤޤäΤǤ롣 +褫餫󽸤ޤä褿ָȡȤ +ؤơ⤤ʤӡˤΤޤƤʤ顢ӤޤäƤ롣 +ζͼƤǤʤˤϡ줬ޤ褦ˤϤä긫 +ϡξˤͤߤΤǤ롣⺣ϡ¤ +챩⸫ʤͣ꡹줫äƤܤĹ +Ϥʤξˡʵʤˤ򤯤ӤĤƤΤ롣 +ϼʤʤΰ־ʤ餷βʤˤοơˤ˽ +褿礭⮡ʤˤӡˤ򵤤ˤʤ顢ܤꡢΤդΤįƤΤ +롣 +ԤϤäֲͤߤԤäƤפȽ񤤤ͤϡ +Ǥ̤ɤ褦ȱƤϤʤդʤ顢ͤβȤصĤȦǤ +롣꤬μͤϡ͸˲ˤФ줿ˤ񤤤褦ˡԤ +Įϰ̤ʤ餺ƤβͤǯȤƤͤˤФ +줿Τ⡢οξ;Ȥ˳ʤʤ顢ֲͤߤԤäƤ +ȱ⡢ֱˤդꤳ줿ͤԤ꤬ʤơˤƤפ +ŬǤ롣ξ塢ζͤ⾯ʤ餺ʿīβͤ +Sentimentalisme˱ƶʤˤιﲼ꤫դФϡ̤˾ +뤱ʤǡͤϡƤ⺹뤷ɤˤ +ȤơФɤˤʤʤ򡢤ɤˤ褦ȤơȤȤʤ +򤿤ɤʤ顢äϩˤդ뱫βʹȤʤʹƤ +ĤĤǡ󤯤顢äȱ򤢤ĤƤ롣ͼǤϼ˶ +㤯ơ夲ȡβФˤĤФᰡʤ餫ˤˡŤ +Ť٤Ƥ롣 +ɤˤʤʤ򡢤ɤˤ٤ˤϡʤǤʤȤޡˤϤʤ +ǤСϡʤĤˤβƻФڤξǡʤˡˤ򤹤 +Ǥ롣ơξػäơΤ褦˼ΤƤƤޤФ +Ǥ롣ФʤȤСͤιͤϡ٤Ʊƻˤȶˡä +ζɽذ夷Ρ֤СפϡĤǤäƤ⡢ɡ֤Сפ +äͤϡʤФʤȤꤷʤ⡢Ρ֤СפΤ +Ĥ٤ˡθĤͤˤʤ곰˻ʤפȱ +ѶŪ˹ꤹΡͦФˤΤǤ롣 +ͤ礭ʤˤ򤷤ơ줫顢絷Ω夬äͼ䤨Τ +Ԥϡ⤦вߤδǤ롣Ȥδ֤ͼǤȶ˱θ +ʤ᤭̤롣ðɤˤȤޤäƤ꤮ꤹ⡢⤦ɤعԤäƤޤ + +ͤϡ¤ʤ顢δΡʤߡˤ˽Ťͤβθ⤯ +Τޤ򸫤ޤ路δΤʤܤˤΤʤճڤˤͤ줽 +ʽ꤬СǤȤ⤫⡢ȻפäǤ롣ȡ +ξϰؾ롢ιǷðɤäҤˤĤʤ顢ͤˤ +Ƥ⡢ɤͤФǤ롣ͤϡǹˤʤҤŤˤ +ʤ褦˵Ĥʤ顢Ϥ­򡢤Ҥΰֲʤؤ +ߤ +줫顢ʬθǤ롣ϰξؽФ롢ιҤʤˡ +ˤǭΤ褦˿Ȥ¤ơ©򻦤ʤ顢ƻҤ򱮤äƤϰξ夫 +餵Фθˡˤαˤ̤餷Ƥ롣ûʤҤˤˡ +֤ǿä⮤ΤˤǤ롣ͤϡϤᤫ顢ξˤԤϡͤФ +ȹäƤ줬ҤʾäƸȡǤïФȤܤơ +⤽βФ¶躡ưƤ餷ϡä +򤫤ŷ΢ˡʤǤäΤǡˤΤ줿ΤǤ +롣αˡξǡФȤ⤷Ƥ뤫ϡɤͣμԤǤϤ + +ͤϡܼʤˤΤ褦­̤ǡäȵޤҤ򡢰־ʤ +礦褦ˤƾĤ᤿Τʿˤʤ顢 +ؽФơ붲롢ϰƸ +ȡϰˤϡʹ̤ꡢĤλӳʤˤ̵¤˴Ƥ +뤬ФθεڤϰϤפä궹ΤǡϴĤȤ狼ʤͣ +ܤʤ顢ΤΤϡλӳȡʪ夿ӳȤȱ +롣ˤϽˤޤäƤ餷ơλӳϳ줬 +ʤĤơˡƤʹ֤ȱ¤ڤԤͤ¤äͷ +褦ˡ򳫤ꡢФꤷơξˤäƤ +⡢ȤȤι⤯ʤäƤʬˡܤꤷФθ򤦤ơ㤯ʤä +ʬαƤذŤʤ顢ʵפ˰ʤˤǡۤäƤ +ͤϡλӳ।˻פ鷺ɡäʤäˡ +μϡνִ֤ˤϡ⤦ɡ椦˺Ƥ붯ؼʤۤȤ +ɤȤȤˤˤ̳ФåäƤޤäǤ롣 +ͤδϡλϤơ¶ӳäƤʤޤäƤ˿ʹ +򸫤ȩʤҤϤˤʪؤ㤤餻ȱƬΡΤ褦 +Ϸ̤Ǥ롣Ϸ̤ϡμ˲ФȤ⤷Ҥäơλӳΰ +δ褦įƤȱӤĹ򸫤ȡ¿ʬλӳǤ +ͤϡϻʬζݤȻʬι񿴤ȤươûϸƵۡʤˤ򤹤Τ +˺Ƥ쵭εԤθڤСƬȡʤȤˤӤפ褦˴ +ΤǤ롣ȡϷ̤ϡҤ򡢾Ĥδ֤ޤơ줫顢ޤį +Ƥӳμξ򤫤ȡ١οƤλҤ͡ʤߡˤȤ褦 +ˡĹȱӤܤȴϤ᤿ȱϼ˽äȴ餷 +ȱӤܤȴΤ˽äƲͤοϡݤľäƹԤ +ơƱˡϷ̤ФϤư褿 +䡢Ϸ̤ФȱäƤϡ뤫Τʤǫʤषˡ +밭Фȿʬ˶褿ΤǤ롣λïβͤˡ +äβǤˤͤƤʤˡˤ򤹤뤫ͤˤʤ뤫ȱ +򡢲ƻФ顢餯ͤϡ̤ʤǤ +ۤɡˤΰ࿴ϡϷ̤ξޤҤΤ褦ˡ褯dz +ƤΤǤ롣 +ͤˤϡϷ̤ͤȱӤȴ狼ʤääơŪ +ˤϡβҤŤƤ褤ΤʤäͤˤȤäƤϡ +ˡξǡͤȱӤȴȱǴ˵ +餶밭Ǥäͤϡäʬͤˤʤ뵤Ǥʤϡ +˺ƤΤǤ롣 +ǡͤϡξ­ϤơʤꡢҤӾ夬ä +ʤҤŤˤ˼򤫤ʤ顢ԤϷ̤ߤäϷ̤ +äΤϡʤ +Ϸ̤ϡܲͤ򸫤ȡޤ׸ʤߡˤˤǤƤ줿褦ˡӾ夬 + +֤Τ졢ɤعԤ +ͤϡϷ̤ӳˤĤޤŤʤ顢Ƥդᤤƨ褦ȤԼɤǡ +ͤäϷ̤ϡǤⲼͤĤΤƹԤȤ롣ͤԤ +ޤȤơɤͤϻӳǡá̵ΤޤޡĤ߹ä +ϡϤᤫ顢狼äƤ롣ͤϤȤȤϷ̤ӤĤǡ̵ +ؤͤݤ١ܡʤȤˤεӤΤ褦ʡФӤǤ롣 +ֲ򤷤Ƥ򤷤Ƥ̤ȡ衣 +ͤϡϷ̤Ĥȡʤꡢξʧäơ򤤹ݡʤϤ͡ˤο +δؤĤĤɤ⡢Ϸ̤ۤäƤ롣ξʤʤդ碌ơ +©ڤʤ顢򡢴夬ޤ֤γؽФˤʤơΤ褦 +˼ٹʤ夦͡ˤۤäƤ롣򸫤ȡͤϻϤˤϷ̤ +ʬΰջ֤˻ۤƤȱռơΰռϡ +ޤǤϤdzƤο򲿻ʤġˤδ֤ˤޤƤޤä˻Ĥ +ΤϡͣŻ򤷤ơ줬Ρ¤餫դ­Ȥ +ФǤ롣ǡͤϡϷ̤򡢸ʤ顢Ƥä +ָʤϸȡʤӤˤģͤʤɤǤϤʤβ̤꤫ +ιμԤ餪򤫤ơɤ褦ȱ褦ʻϤʤͣʬ +ξǡ򤷤ƤΤʤäФΤ +ȡϷ̤ϡ򡢰礭ơäȤβͤδ򸫼ä +ޤ֤֤ʤäĻΤ褦ʡԤǸΤǤ롣줫顢Ⲥǡء +ɡȰĤˤʤä򲿤ʪǤǤ褦ư٤ǡäʩ +ưƤΤ롣λι顢ʤ餹ˤƤ褦ä +ͤμä褿 +֤ȱȴƤʡνȱȴƤʡʤĤˤˤ褦Ȼפ +㡣 +ͤϡϷ̤¸ʿޤʤΤ˼˾Ƽ˾Ʊˡ +ΤȰ줷ˡؤϤä褿ȡεʤˤ +ؤ̤ΤǤϷ̤ϡҼˡޤӳƬåʤȡˤäĹȴ +Ӥäʤꡢ걡ʤҤˤΤĤ֤䤯褦ǡʤ顢ʻ򱾤 + +ͤȱӤȴȱϡΤ̡ͤ +¿ϡΰ̤ʻ򡢤Ƥ⤤ʹ֤ФǤ롣ˡʬȱȴ +ʤɤϡؤФꤺĤڤäƴΤ򡢴ʤۤˤȱäơ +ӡʤϤˤοؤ˹Ԥä¤ˤäƻʤʤäʤ顢Ǥ +˹ԤäƤ⤷ʤ⡢ν봳ϡ̣褤ȱΤǡ +Ӥ礫äƤΤǤ롣ʬϡνΤȤ +פʤʤСʤˡˤ򤹤ΤǡʤǤ롣 +顢ʬΤƤⰭȤϻפʤϤꤷʤС +򤹤ΤǡʤǤ롣ơλʤ򡢤褯 +ΤäƤνϡʬΤƤΤˤʤȻפǤ +롣Ϸ̤ϡΤʰ̣λ򱾤ä +ͤϡˤơ򺸤μǤʤ顢Ȥơ +äʹƤμǤϡ֤ˤǿ礭⮡ʤˤӡˤ +ˤʤ顢ʹƤΤǤ롣ǷʹƤˡͤοˤϡ +ͦޤ褿ϡäβǤˤ˷礱ƤͦǤ롣 +ơäξؾʤˤäơϷ̤ᤨͦȤϡ +ȿФưȤͦǤ롣ͤϡ򤹤뤫ͤˤʤ뤫¤ʤ +ФǤϤʤλΤˤο鱾Сʤɤȱϡء +ʤռγɤФƤ +֤äȡ +Ϸ̤äȡͤޡʤˤ褦ǰ򲡤ơ­ +ؽФȡ԰դˡμ⮤ΥơϷ̤ζ߾ʤ꤬ߡˤĤߤʤ顢 +ä +֤ǤϡʤʤҤϤˤ򤷤褦Ⱥޤʡʤ⤽ʤС +ΤʤΤ +ͤϡФ䤯Ϸ̤ʪȤä줫顢­ˤߤĤȤϷ +̤򡢼ӤӳξؽݤҤθޤǤϡϤ˸ФǤ롣 +ͤϡȤäɰȩʪ來ˤơޤ֤˵ޤҤ +ꤿ +á褦ݤƤϷ̤ӳ椫顢Τ򵯤Τϡ +줫֤ʤλǤ롣Ϸ̤ϡĤ֤䤯褦ʡ᤯褦ΩƤʤ顢 +ޤdzƤФθ򤿤ˡҤθޤǡäƹԤäơ顢 +ûȱݡʤޡˤˤơβˤϡͣƶʤ +Ȥˤ뤬ФǤ롣 +ͤϡˡơԤĮضƯ˵ޤǤ diff --git a/vendor/golang.org/x/text/encoding/testdata/rashomon-iso-2022-jp.txt b/vendor/golang.org/x/text/encoding/testdata/rashomon-iso-2022-jp.txt new file mode 100644 index 0000000000..0bc24bc1bf --- /dev/null +++ b/vendor/golang.org/x/text/encoding/testdata/rashomon-iso-2022-jp.txt @@ -0,0 +1,178 @@ +This file was derived from +http://www.gutenberg.org/cache/epub/1982/pg1982.txt +-------- +$BMe@8Lg(B + +$B3)@nN6G72p(B + +$B!!0?F|$NJkJ}$N;v$G$"$k!#0l?M$N2<?M$,!"Me@8Lg$N2<$G1+$d$_$rBT$C$F$$$?!#!!9-$$Lg(B +$B$N2<$K$O!"$3$NCK$N30$KC/$b$$$J$$!#$?$@!"=j!9C0EI$NGm$2$?!"Bg$-$J1_Cl$K!"$-$j$.(B +$B$j$9$,0lI$$H$^$C$F$$$k!#Me@8Lg$,!"<k?}BgO)$K$"$k0J>e$O!"$3$NCK$N30$K$b!"1+$d$_(B +$B$r$9$k;T=w3^$dYf1(K9;R$,!"$b$&Fs;0?M$O$"$j$=$&$J$b$N$G$"$k!#$=$l$,!"$3$NCK$N30(B +$B$KC/$b$$$J$$!#(B +$B!!2?8N$+$H1>$&$H!"$3$NFs;0G/!"5~ET$K$O!"CO?L$H$+DTIw$H$+2P;v$H$+q@q<$H$+1>$&:R(B +$B$$$,$D$E$$$F5/$3$C$?!#$=$3$GMlCf$N$5$S$lJ}$O0lDL$j$G$J$$!#5l5-$K$h$k$H!"J)A|$d(B +$BJ)6q$rBG:U$$$F!"$=$NC0$,$D$$$?$j!"6b6d$NGs!J$O$/!K$,$D$$$?$j$7$?LZ$r!"O)$P$?$K(B +$B$D$_=E$M$F?E$NNA!J$7$m!K$KGd$C$F$$$?$H1>$&$3$H$G$"$k!#MlCf$,$=$N;OKv$G$"$k$+$i!"(B +$BMe@8Lg$N=$M}$J$I$O!"85$h$jC/$b<N$F$F8\$_$k<T$,$J$+$C$?!#$9$k$H$=$N9S$l2L$F$?$N(B +$B$r$h$$;v$K$7$F!"8QC,!J$3$j!K$,@3$`!#Ep?M$,@3$`!#$H$&$H$&$7$^$$$K$O!"0z<h$j<j$N(B +$B$J$$;`?M$r!"$3$NLg$X;}$C$FMh$F!"<N$F$F9T$/$H1>$&=,47$5$(=PMh$?!#$=$3$G!"F|$NL\(B +$B$,8+$($J$/$J$k$H!"C/$G$b5$L#$r0-$,$C$F!"$3$NLg$N6a=j$X$OB-$V$_$r$7$J$$;v$K$J$C(B +$B$F$7$^$C$?$N$G$"$k!#(B +$B!!$=$NBe$jKtrm$,2?=h$+$i$+!"$?$/$5$s=8$^$C$FMh$?!#Ck4V8+$k$H!"$=$Nrm$,2?1)$H$J(B +$B$/NX$rIA$$$F!"9b$$rvHx!J$7$S!K$N$^$o$j$rSF$-$J$,$i!"Ht$S$^$o$C$F$$$k!#<l$KLg$N(B +$B>e$N6u$,!"M<>F$1$G$"$+$/$J$k;~$K$O!"$=$l$,8UKc$r$^$$$?$h$&$K$O$C$-$j8+$($?!#rm(B +$B$O!"L^O@!"Lg$N>e$K$"$k;`?M$NFy$r!"Bo$_$KMh$k$N$G$"$k!#!<!<L`$b:#F|$O!"9o8B$,CY(B +$B$$$;$$$+!"0l1)$b8+$($J$$!#M#!"=j!9!"Jx$l$+$+$C$?!"$=$&$7$F$=$NJx$lL\$KD9$$Ap$N(B +$B$O$($?@PCJ$N>e$K!"rm$NJ5!J$/$=!K$,!"E@!9$HGr$/$3$S$j$D$$$F$$$k$N$,8+$($k!#2<?M(B +$B$O<7CJ$"$k@PCJ$N0lHV>e$NCJ$K@v$$$6$i$7$?:0$N2(!J$"$*!K$N?,$r?x$($F!"1&$NKK$K=P(B +$BMh$?!"Bg$-$JLLb.!J$K$-$S!K$r5$$K$7$J$,$i!"$\$s$d$j!"1+$N$U$k$N$rD/$a$F$$$k$N$G(B +$B$"$k!#(B +$B!!:n<T$O$5$C$-!"!V2<?M$,1+$d$_$rBT$C$F$$$?!W$H=q$$$?!#$7$+$7!"2<?M$O!"1+$,$d$s(B +$B$G$b3JJL$I$&$7$h$&$H1>$&Ev$F$O$J$$!#$U$@$s$J$i!"L^O@!"<g?M$N2H$X5"$k2D$-H&$G$"(B +$B$k!#=j$,$=$N<g?M$+$i$O!";M8^F|A0$K2K$r=P$5$l$?!#A0$K$b=q$$$?$h$&$K!"Ev;~5~ET$N(B +$BD.$O0lDL$j$J$i$:?jHy$7$F$$$?!#:#$3$N2<?M$,!"1JG/!";H$o$l$F$$$?<g?M$+$i2K$r=P$5(B +$B$l$?$N$b!"$3$N?jHy$N>.$5$JM>GH$K30$J$i$J$$!#$@$+$i!"!V2<?M$,1+$d$_$rBT$C$F$$$?!W(B +$B$H1>$&$h$j$b!"!V1+$K$U$j$3$a$i$l$?2<?M$,!"9T$-=j$,$J$/$F!"ESJ}$K$/$l$F$$$?!W$H(B +$B1>$&J}$,!"E,Ev$G$"$k!#$=$N>e!":#F|$N6uLOMM$b>/$J$+$i$:$3$NJ?0BD+$N2<?M$N(B +Sentimentalisme$B$K1F6A$7$?!#?=!J$5$k!K$N9o2<$,$j$+$i$U$j=P$7$?1+$O!"L$$@$K>e(B +$B$,$k$1$7$-$,$J$$!#$=$3$G!"2<?M$O!"2?$rA<$$$F$b:9Ev$?$jL@F|$NJk$7$r$I$&$K$+$7$h(B +$B$&$H$7$F!<!<1>$o$P$I$&$K$b$J$i$J$$;v$r!"$I$&$K$+$7$h$&$H$7$F!"$H$j$H$a$b$J$$9M(B +$B$($r$?$I$j$J$,$i!"$5$C$-$+$i<k?}BgO)$K$U$k1+$N2;$rJ9$/$H$b$J$/J9$$$F$$$?!#(B +$B!!1+$OMe@8Lg$r$D$D$s$G!"1s$/$+$i!"$6$"$C$H1>$&2;$r$"$D$a$F$/$k!#M<0G$O<!Bh$K6u(B +$B$rDc$/$7$F!"8+>e$2$k$H!"Lg$N20:,$,!"<P$a$K$D$-=P$7$?a0!J$$$i$+!K$N@h$K!"=E$?$/(B +$B$&$90E$$1@$r;Y$($F$$$k!#(B +$B!!$I$&$K$b$J$i$J$$;v$r!"$I$&$K$+$9$k0Y$K$O!"<jCJ$rA*$s$G$$$kn#!J$$$H$^!K$O$J$$!#(B +$BA*$s$G$$$l$P!"C[CO!J$D$$$8!K$N2<$+!"F;$P$?$NEZ$N>e$G!"q@;`!J$&$($8$K!K$r$9$k$P(B +$B$+$j$G$"$k!#$=$&$7$F!"$3$NLg$N>e$X;}$C$FMh$F!"8$$N$h$&$K<N$F$i$l$F$7$^$&$P$+$j(B +$B$G$"$k!#A*$P$J$$$H$9$l$P!<!<2<?M$N9M$($O!"2?EY$bF1$8F;$rDcWK$7$?MH6g$K!"$d$C$H(B +$B$3$N6I=j$X0)Ce$7$?!#$7$+$7$3$N!V$9$l$P!W$O!"$$$D$b$G$?$C$F$b!"7k6I!V$9$l$P!W$G(B +$B$"$C$?!#2<?M$O!"<jCJ$rA*$P$J$$$H$$$&;v$r9NDj$7$J$,$i$b!"$3$N!V$9$l$P!W$N$+$?$r(B +$B$D$1$k0Y$K!"EvA3!"$3$N8e$KMh$k2D$-!VEp?M$K$J$k$h$j30$K;EJ}$,$J$$!W$H1>$&;v$r!"(B +$B@Q6KE*$K9NDj$9$k$@$1$N!"M&5$$,=P$:$K$$$?$N$G$"$k!#(B +$B!!2<?M$OBg$-$JSj!J$/$5$a!K$r$7$F!"$=$l$+$i!"Bg57$=$&$KN)>e$,$C$?!#M<Nd$($N$9$k(B +$B5~ET$O!"$b$&2P23$,M_$7$$Dx$N4($5$G$"$k!#Iw$OLg$NCl$HCl$H$N4V$r!"M<0G$H6&$K1sN8(B +$B$J$/!"?a$-$L$1$k!#C0EI$NCl$K$H$^$C$F$$$?$-$j$.$j$9$b!"$b$&$I$3$+$X9T$C$F$7$^$C(B +$B$?!#(B +$B!!2<?M$O!"pt$r$A$B$a$J$,$i!";3?a$N4@jN!J$+$6$_!K$K=E$M$?!":0$N2($N8*$r9b$/$7$F(B +$BLg$N$^$o$j$r8+$^$o$7$?!#1+Iw$N45$N$J$$!"?ML\$K$+$+$kW|$N$J$$!"0lHU3Z$K$M$i$l$=(B +$B$&$J=j$,$"$l$P!"$=$3$G$H$b$+$/$b!"Lk$rL@$+$=$&$H;W$C$?$+$i$G$"$k!#$9$k$H!"9,Lg(B +$B$N>e$NO0$X>e$k!"I}$N9-$$!"G7$bC0$rEI$C$?Dt;R$,4c$K$D$$$?!#>e$J$i!"?M$,$$$?$K$7(B +$B$F$b!"$I$&$;;`?M$P$+$j$G$"$k!#2<?M$O!"$=$3$G9x$K$5$2$?@;JA!J$R$8$j$E$+!K$NB@Ea(B +$B$,>dAv$i$J$$$h$&$K5$$r$D$1$J$,$i!"ONApMz$r$O$$$?B-$r!"$=$NDt;R$N0lHV2<$NCJ$X$U(B +$B$_$+$1$?!#(B +$B!!$=$l$+$i!"2?J,$+$N8e$G$"$k!#Me@8Lg$NO0$N>e$X=P$k!"I}$N9-$$Dt;R$NCfCJ$K!"0l?M(B +$B$NCK$,!"G-$N$h$&$K?H$r$A$B$a$F!"B)$r;&$7$J$,$i!">e$NMF;R$r1.$C$F$$$?!#O0$N>e$+(B +$B$i$5$92P$N8w$,!"$+$9$+$K!"$=$NCK$N1&$NKK$r$L$i$7$F$$$k!#C;$$r$!J$R$2!K$NCf$K!"(B +$B@V$/G?$r;}$C$?LLb.$N$"$kKK$G$"$k!#2<?M$O!";O$a$+$i!"$3$N>e$K$$$k<T$O!";`?M$P$+(B +$B$j$@$H9b$r3g$C$F$$$?!#$=$l$,!"Dt;R$rFs;0CJ>e$C$F8+$k$H!">e$G$OC/$+2P$r$H$\$7$F!"(B +$B$7$+$b$=$N2P$rB6=h:!=h$HF0$+$7$F$$$k$i$7$$!#$3$l$O!"$=$NBy$C$?!"2+$$$m$$8w$,!"(B +$B6y!9$KCXia$NAc$r$+$1$?E70fN"$K!"$f$l$J$,$i1G$C$?$N$G!"$9$0$K$=$l$HCN$l$?$N$G$"(B +$B$k!#$3$N1+$NLk$K!"$3$NMe@8Lg$N>e$G!"2P$r$H$b$7$F$$$k$+$i$O!"$I$&$;M#$N<T$G$O$J(B +$B$$!#(B +$B!!2<?M$O!"5\<i!J$d$b$j!K$N$h$&$KB-2;$r$L$9$s$G!"$d$C$H5^$JDt;R$r!"0lHV>e$NCJ$^(B +$B$GGg$&$h$&$K$7$F>e$j$D$a$?!#$=$&$7$FBN$r=PMh$k$@$1!"J?$K$7$J$,$i!"pt$r=PMh$k$@(B +$B$1!"A0$X=P$7$F!"62$k62$k!"O0$NFb$rGA$$$F8+$?!#(B +$B!!8+$k$H!"O0$NFb$K$O!"1=$KJ9$$$?DL$j!"4v$D$+$N;S3<!J$7$,$$!K$,!"L5B$:n$K4~$F$F(B +$B$"$k$,!"2P$N8w$N5Z$VHO0O$,!";W$C$?$h$j69$$$N$G!"?t$O4v$D$H$b$o$+$i$J$$!#M#!"$*(B +$B$\$m$2$J$,$i!"CN$l$k$N$O!"$=$NCf$KMg$N;S3<$H!"CeJ*$rCe$?;S3<$H$,$"$k$H1>$&;v$G(B +$B$"$k!#L^O@!"Cf$K$O=w$bCK$b$^$8$C$F$$$k$i$7$$!#$=$&$7$F!"$=$N;S3<$O3'!"$=$l$,!"(B +$B>(!J$+$D$F!K!"@8$-$F$$$??M4V$@$H1>$&;v<B$5$(5?$o$l$kDx!"EZ$rYT$M$FB$$C$??M7A$N(B +$B$h$&$K!"8}$r3+$$$?$j!"<j$r1d$P$7$?$j$7$F!"$4$m$4$m>2$N>e$K$3$m$,$C$F$$$?!#$7$+(B +$B$b!"8*$H$+6;$H$+$N9b$/$J$C$F$$$kItJ,$K!"$\$s$d$j$7$?2P$N8w$r$&$1$F!"Dc$/$J$C$F(B +$B$$$kItJ,$N1F$r0lAX0E$/$7$J$,$i!"1J5W$K0"!J$*$7!K$NG!$/L[$C$F$$$?!#(B +$B!!2<?M$O!"$=$l$i$N;S3<$NIe`%$7$?=-5$$K;W$o$:!"I!$r1f$C$?!J$*$*$C$?!K!#$7$+$7!"(B +$B$=$N<j$O!"<!$N=V4V$K$O!"$b$&I!$r1f$&;v$rK:$l$F$$$?!#0?$k6/$$46>p$,KX<=!J$[$H$s(B +$B$I$3$H$4$H$/!K$3$NCK$NSL3P$rC%$C$F$7$^$C$?$+$i$G$"$k!#(B +$B!!2<?M$N4c$O!"$=$N;~!"$O$8$a$F!"B6;S3<$NCf$Km-$C$F$$$k!J$&$:$/$^$C$F$$$k!K?M4V(B +$B$r8+$?!#[XH)?'!J$R$O$@$$$m!K$NCeJ*$rCx$?!"GX$NDc$$!"Ai$;$?!"GrH1F,$N!"1n$N$h$&(B +$B$JO7GL$G$"$k!#$=$NO7GL$O!"1&$N<j$K2P$r$H$b$7$?>>$NLZJR$r;}$C$F!"$=$N;S3<$N0l$D(B +$B$N4i$rGA$-$3$`$h$&$KD/$a$F$$$?!#H1$NLS$ND9$$=j$r8+$k$H!"B?J,=w$N;S3<$G$"$m$&!#(B +$B!!2<?M$O!"O;J,$N62I]$H;MJ,$N9%4q?4$H$KF0$+$5$l$F!";C;~$O8F5[!J$$$-!K$r$9$k$N$5(B +$B$(K:$l$F$$$?!#5l5-$N5-<T$N8l$r<Z$j$l$P!"!VF,?H!J$H$&$7$s!K$NLS$bB@$k!W$h$&$K46(B +$B$8$?$N$G$"$k!#$9$k$H!"O7GL$O!">>$NLZJR$r!">2HD$N4V$KA^$7$F!"$=$l$+$i!":#$^$GD/(B +$B$a$F$$$?;S3<$N<s$KN><j$r$+$1$k$H!"CzEY!"1n$N?F$,1n$N;R$NiM!J$7$i$_!K$r$H$k$h$&(B +$B$K!"$=$ND9$$H1$NLS$r0lK\$:$DH4$-$O$8$a$?!#H1$O<j$K=>$C$FH4$1$k$i$7$$!#(B +$B!!$=$NH1$NLS$,!"0lK\$:$DH4$1$k$N$K=>$C$F2<?M$N?4$+$i$O!"62I]$,>/$7$:$D>C$($F9T$C(B +$B$?!#$=$&$7$F!"$=$l$HF1;~$K!"$=$NO7GL$KBP$9$k$O$2$7$$A~0-$,!">/$7$:$DF0$$$FMh$?!#(B +$B$$$d!"$3$NO7GL$KBP$9$k$H1>$C$F$O!"8lJ@$,$"$k$+$bCN$l$J$$!#G+!J$`$7$m!K!"$"$i$f(B +$B$k0-$KBP$9$kH?46$,!"0lJ,Kh$K6/$5$rA}$7$FMh$?$N$G$"$k!#$3$N;~!"C/$+$,$3$N2<?M$K!"(B +$B$5$C$-Lg$N2<$G$3$NCK$,9M$($F$$$?!"q@;`!J$&$($8$K!K$r$9$k$+Ep?M$K$J$k$+$H1>$&Ld(B +$BBj$r!"2~$a$F;}=P$7$?$i!"62$i$/2<?M$O!"2?$NL$N}$b$J$/!"q@;`$rA*$s$@;v$G$"$m$&!#(B +$B$=$l$[$I!"$3$NCK$N0-$rA~$`?4$O!"O7GL$N>2$KA^$7$?>>$NLZJR$N$h$&$K!"@*$h$/G3$(>e(B +$B$,$j$@$7$F$$$?$N$G$"$k!#(B +$B!!2<?M$K$O!"L^O@!"2?8NO7GL$,;`?M$NH1$NLS$rH4$/$+$o$+$i$J$+$C$?!#=>$C$F!"9gM}E*(B +$B$K$O!"$=$l$rA10-$N2?$l$KJR$E$1$F$h$$$+CN$i$J$+$C$?!#$7$+$72<?M$K$H$C$F$O!"$3$N(B +$B1+$NLk$K!"$3$NMe@8Lg$N>e$G!";`?M$NH1$NLS$rH4$/$H1>$&;v$,!"$=$l$@$1$G4{$K5v$92D(B +$B$i$6$k0-$G$"$C$?!#L^O@!!2<?M$O!!$5$C$-Kx<+J,$,!"Ep?M$K$J$k5$$G$$$?;v$J$>$O!!$H(B +$B$&$KK:$l$F$$$k$N$G$"$k!#(B +$B!!$=$3$G!"2<?M$O!"N>B-$KNO$rF~$l$F!"$$$+$J$j!"Dt;R$+$i>e$XHt$S>e$,$C$?!!$=$&$7(B +$B$F@;JA!J$R$8$j$E$+!K$NB@Ea$K<j$r$+$1$J$,$i!"Bg8T$KO7GL$NA0$XJb$_$h$C$?!#O7GL$,(B +$B6C$$$?$N$O!!1>$&Kx$b$J$$!#(B +$B!!O7GL$O!"0lL\2<?M$r8+$k$H!"$^$k$GW8!J$$$7$f$_!K$K$G$bCF$+$l$?$h$&$K!!Ht$S>e$,$C(B +$B$?!#(B +$B!!!V$*$N$l!"$I$3$X9T$/!#!W(B +$B!!2<?M$O!"O7GL$,;S3<$K$D$^$E$-$J$,$i!"92$F$U$?$a$$$FF($2$h$&$H$9$k9T<j$r:I$$$G!"(B +$B$3$&GM$C$?!#O7GL$O!"$=$l$G$b2<?M$r$D$-$N$1$F9T$3$&$H$9$k!#2<?M$OKt!"$=$l$r9T$+(B +$B$9$^$$$H$7$F!"2!$7$b$I$9!#Fs?M$O;S3<$NCf$G!";C!"L58@$N$^$^!"$D$+$_9g$C$?!#$7$+(B +$B$7>!Ii$O!"$O$8$a$+$i!"$o$+$C$F$$$k!#2<?M$O$H$&$H$&!"O7GL$NOS$r$D$+$s$G!"L5M}$K(B +$B$=$3$X$M$8E]$7$?!#CzEY!"7\!J$H$j!K$N5S$N$h$&$J!"9|$HHi$P$+$j$NOS$G$"$k!#(B +$B!!!V2?$r$7$F$$$?!#$5$"2?$r$7$F$$$?!#1>$(!#1>$o$L$H!!$3$l$@$>$h!#!W(B +$B!!2<?M$O!"O7GL$r$D$-J|$9$H!"$$$-$J$j!"B@Ea$N>d$rJ'$C$F!"Gr$$9]!J$O$,$M!K$N?'$r(B +$B$=$N4c$NA0$X$D$-$D$1$?!#$1$l$I$b!"O7GL$OL[$C$F$$$k!#N><j$r$o$J$o$J$U$k$o$;$F!"(B +$B8*$GB)$r@Z$j$J$,$i!"4c$r!"4c5e$,$^$V$?$N30$X=P$=$&$K$J$kDx!"8+3+$$$F!"0"$N$h$&(B +$B$K<9Y9!J$7$e$&$M!K$/L[$C$F$$$k!#$3$l$r8+$k$H!"2<?M$O;O$a$FL@Gr$K$3$NO7GL$N@8;`(B +$B$,!"A4A3!"<+J,$N0U;V$K;YG[$5$l$F$$$k$H1>$&;v$r0U<1$7$?!#$=$&$7$F!"$3$N0U<1$O!"(B +$B:#$^$G$O$2$7$/G3$($F$$$?A~0-$N?4$r2?;~!J$$$D!K$N4V$K$+Nd$^$7$F$7$^$C$?!#8e$K;D$C(B +$B$?$N$O!"M#!"0?;E;v$r$7$F!"$=$l$,1_K~$K@.="$7$?;~$N!"0B$i$+$JF@0U$HK~B-$H$,$"$k(B +$B$P$+$j$G$"$k!#$=$3$G!"2<?M$O!"O7GL$r!"8+2<$2$J$,$i!">/$7@<$r=@$2$F$3$&1>$C$?!#(B +$B!!!V8J$O8!Hs0c;H!J$1$S$$$7!K$ND#$NLr?M$J$I$G$O$J$$!#:#$7J}$3$NLg$N2<$rDL$j$+$+$C(B +$B$?N9$N<T$@!#$@$+$i$*A0$KFl$r$+$1$F!"$I$&$7$h$&$H1>$&$h$&$J;v$O$J$$!#M#:#;~J,!"(B +$B$3$NLg$N>e$G!"2?$r$7$F$$$?$N$@$+!"$=$l$r8J$KOC$5$($9$l$P$$$$$N$@!#!W(B +$B!!$9$k$H!"O7GL$O!"8+3+$$$?4c$r!"0lAXBg$-$/$7$F!"$8$C$H$=$N2<?M$N4i$r8+<i$C$?!#(B +$B$^$V$?$N@V$/$J$C$?!"Fy?)D;$N$h$&$J!"1T$$4c$G8+$?$N$G$"$k!#$=$l$+$i!"b2$G!"KX!"(B +$BI!$H0l$D$K$J$C$??0$r2?$+J*$G$b3z$s$G$$$k$h$&$KF0$+$7$?!#:Y$$9"$G!"@m$C$?9"J)$N(B +$BF0$$$F$$$k$N$,8+$($k!#$=$N;~!"$=$N9"$+$i!"rm!J$+$i$9!K$NSF$/$h$&$J@<$,!"SC$.SC(B +$B$.!"2<?M$N<*$XEA$o$C$FMh$?!#(B +$B!!!V$3$NH1$rH4$$$F$J!"$3$N=w$NH1$rH4$$$F$J!"r#!J$+$D$i!K$K$7$h$&$H;W$&$?$N(B +$B$8$c!#!W(B +$B!!2<?M$O!"O7GL$NEz$,B830!"J?K^$J$N$K<:K>$7$?!#$=$&$7$F<:K>$9$k$HF1;~$K!"KtA0$N(B +$BA~0-$,!"Nd$JInJN$H0l$7$g$K!"?4$NCf$X$O$$$C$FMh$?!#$9$k$H!!$=$N5$?'!J$1$7$-!K$,!"(B +$B@hJ}$X$bDL$8$?$N$G$"$m$&!#O7GL$O!"JR<j$K!"$^$@;S3<$NF,$+$iC%!J$H!K$C$?D9$$H4$1(B +$BLS$r;}$C$?$J$j!"j1!J$R$-!K$N$D$V$d$/$h$&$J@<$G!"8}$4$b$j$J$,$i!"$3$s$J;v$r1>$C(B +$B$?!#(B +$B!!@.Dx!";`?M$NH1$NLS$rH4$/$H1>$&;v$O!"0-$$;v$+$MCN$l$L!#$7$+$7!"$3$&1>$&;`?M$N(B +$BB?$/$O!"3'!!$=$N0L$J;v$r!"$5$l$F$b$$$$?M4V$P$+$j$G$"$k!#8=$K!"<+J,$,:#!"H1$rH4(B +$B$$$?=w$J$I$O!"<X$r;M@#$P$+$j$:$D$K@Z$C$F43$7$?$N$r!"435{!J$[$7$&$*!K$@$H1>$C$F!"(B +$BB@EaBS!J$?$A$O$-!K$N?X$XGd$j$K9T$C$?!#1VIB$K$+$+$C$F;`$J$J$+$C$?$J$i!":#$G$bGd(B +$B$j$K9T$C$F$$$?$+$b$7$l$J$$!#$7$+$b!"$3$N=w$NGd$k435{$O!"L#$,$h$$$H1>$&$N$G!"B@(B +$BEaBS$?$A$,!"7g$+$5$::ZNA$KGc$C$F$$$?$N$G$"$k!#<+J,$O!"$3$N=w$N$7$?;v$,0-$$$H$O(B +$B;W$o$J$$!#$7$J$1$l$P!"q@;`!J$($&$8$K!K$r$9$k$N$G!";EJ}$,$J$/$7$?;v$@$+$i$G$"$k!#(B +$B$@$+$i!"Kt:#!"<+J,$N$7$F$$$?;v$b0-$$;v$H$O;W$o$J$$!#$3$l$b$d$O$j$7$J$1$l$P!"q@(B +$B;`$r$9$k$N$G!";EJ}$,$J$/$9$k;v$@$+$i$G$"$k!#$=$&$7$F!"$=$N;EJ}$,$J$$;v$r!"$h$/(B +$BCN$C$F$$$?$3$N=w$O!"<+J,$N$9$k;v$r5v$7$F$/$l$k$N$K$A$,$$$J$$$H;W$&$+$i$G$"(B +$B$k!#!<!<O7GL$O!"BgBN$3$s$J0UL#$N;v$r1>$C$?!#(B +$B!!2<?M$O!"B@Ea$r>d$K$*$5$a$F!"$=$NB@Ea$NJA$r:8$N<j$G$*$5$($J$,$i!"NdA3$H$7$F!"(B +$B$3$NOC$rJ9$$$F$$$?!#L^O@!"!!1&$N<j$G$O!"@V$/KK$KG?$r;}$?Bg$-$JLLb.!J$K$-$S!K$r(B +$B5$$K$7$J$,$i!"J9$$$F$$$k$N$G$"$k!#$7$+$7!"G7$rJ9$$$F$$$kCf$K!"2<?M$N?4$K$O!"0?(B +$BM&5$$,@8$^$l$FMh$?!#$=$l$O!!$5$C$-!"Lg$N2<$G$3$NCK$K7g$1$F$$$?M&5$$G$"$k!#$=$&(B +$B$7$F!"Kt$5$C$-!"$3$NLg$N>e$X>e!J$"$,!K$C$F!"$=$NO7GL$rJa$($?;~$NM&5$$H$O!"A4A3!"(B +$BH?BP$JJ}8~$KF0$3$&$H$9$kM&5$$G$"$k!#2<?M$O!"q@;`$r$9$k$+Ep?M$K$J$k$+$KLB$o$J$+$C(B +$B$?$P$+$j$G$O$J$$!#$=$N;~$N$3$NCK$N?4$b$A$+$i1>$($P!"q@;`$J$I$H1>$&;v$O!"KX!"9M(B +$B$($k;v$5$(=PMh$J$$Dx!"0U<1$N30$KDI$$=P$5$l$F$$$?!#(B +$B!!!V$-$C$H!"$=$&$+!#!W(B +$B!!O7GL$NOC$,40$k$H!"2<?M$OS^!J$"$6$1!K$k$h$&$J@<$GG0$r2!$7$?!#$=$&$7$F!"0lB-A0(B +$B$X=P$k$H!"IT0U$K!"1&$N<j$rLLb.$+$iN%$7$F!"O7GL$N6_>e!J$($j$,$_!K$r$D$+$_$J$,$i!"(B +$B$3$&1>$C$?!#(B +$B!!!V$G$O!"8J$,0zGm!J$R$O$.!K$r$7$h$&$H:($`$^$$$J!#8J$b$=$&$7$J$1$l$P!"q@;`$r$9(B +$B$kBN$J$N$@!#!W(B +$B!!2<?M$O!"$9$P$d$/!"O7GL$NCeJ*$rGm$.$H$C$?!#$=$l$+$i!"B-$K$7$,$_$D$3$&$H$9$kO7(B +$BGL$r!"<j9S$/;S3<$N>e$X=3E]$7$?!#Dt;R$N8}$^$G$O!"6O$K8^Jb$r?t$($k$P$+$j$G$"$k!#(B +$B2<?M$O!"Gm$.$H$C$?I0H)?'$NCeJ*$r$o$-$K$+$+$($F!"$^$?$?$/4V$K5^$JDt;R$rLk$NDl$X(B +$B$+$12<$j$?!#(B +$B!!;C!";`$s$@$h$&$KE]$l$F$$$?O7GL$,!";S3<$NCf$+$i!"$=$NMg$NBN$r5/$3$7$?$N$O!"$=(B +$B$l$+$i4V$b$J$/$N;v$G$"$k!#O7GL$O!"$D$V$d$/$h$&$J!"$&$a$/$h$&$J@<$rN)$F$J$,$i!"(B +$B$^$@G3$($F$$$k2P$N8w$r$?$h$j$K!"Dt;R$N8}$^$G!"Gg$C$F9T$C$?!#$=$&$7$F!"$=$3$+$i!"(B +$BC;$$GrH1$rE]!J$5$+$5$^!K$K$7$F!"Lg$N2<$rGA$-$3$s$@!#30$K$O!"M#!"9uF6!9!J$3$/$H(B +$B$&$H$&!K$?$kLk$,$"$k$P$+$j$G$"$k!#(B +$B!!2<?M$O!"4{$K!"1+$rKA$7$F!"5~ET$ND.$X6/Ep$rF/$-$K5^$$$G$$$?!#(B diff --git a/vendor/golang.org/x/text/encoding/testdata/rashomon-shift-jis.txt b/vendor/golang.org/x/text/encoding/testdata/rashomon-shift-jis.txt new file mode 100644 index 0000000000..7a54b957f4 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/testdata/rashomon-shift-jis.txt @@ -0,0 +1,178 @@ +This file was derived from +http://www.gutenberg.org/cache/epub/1982/pg1982.txt +-------- + + +H열V + +@̎̕łBl̉lẢʼnJ݂҂ĂB@L +̉ɂ́A̒j̊OɒNȂBAXOh̔A傫ȉ~ɁA肬 +肷CƂ܂ĂB傪A鐝Hɂȏ́A̒j̊OɂAJ +s}❆GXqAOl͂肻Ȃ̂łBꂪA̒j̊O +ɒNȂB +@̂Ɖ]ƁA̓ONAsɂ́AnkƂҕƂΎƂ_[Ƃ] +‚ÂċNBŗ̂т͈ʂłȂBLɂƁA +ōӂāA̒O‚A̔i͂j‚肵؂AH΂ +‚ݏd˂Đd̗ijɔĂƉ]ƂłB̎nł邩A +̏CȂǂ́AN̂ĂČڂ݂҂ȂBƂ̍rʂĂ +悢ɂāAϒKijށBlށBƂƂ܂ɂ́A +ȂlA̖֎ėāÂĂčsƉ]KoBŁA̖ +ȂȂƁANłCāA̖̋ߏւ͑Ԃ݂ȂɂȂ +Ă܂̂łB +@̑薔낪炩AW܂ėBԌƁA낪HƂ +ւ`āAiсĵ܂eȂAт܂ĂBɖ +̋󂪁A[ĂłȂ鎞ɂ́AꂪӖ܂悤ɂ͂茩B +́Aܘ_Ȁɂ鎀l̓A݂ɗ̂łB[[ނ́Ax +AHȂBBAXAꂩAĂ̕ڂɒ +͂ΒȉɁA̕ijA_XƔт‚Ă̂Bl +͎iΒïԏ̒iɐ􂢂炵̉ij̐K𐘂āAE̖jɏo +A傫ȖᬁiɂсjCɂȂAڂAĴӂ̂𒭂߂Ă̂ +B +@҂͂AulJ݂҂ĂvƏBAĺAJ +łiʂǂ悤Ɖ]Ă͂ȂBӂȂAܘ_Al̉Ƃ֋A‚ł +B̎ĺAlܓOɉɂoꂽBOɂ悤ɁAs +͈ʂȂ炸ĂB̉lAiNAgĂlɂo +ꂽ̂A̐̏ȗ]gɊOȂȂBAulJ݂҂Ăv +Ɖ]AuJɂӂ肱߂ꂽlAsȂāArɂĂv +]AKłB̏A̋͗lȂ炸̉̕l +SentimentalismeɉeB\ij̍肩ӂoJ́Aɏ +邯ȂBŁAĺA[Ă薾̕邵ǂɂ +Ƃā[[]΂ǂɂȂȂAǂɂ悤ƂāAƂƂ߂Ȃl +ǂȂA鐝HɂӂJ̉𕷂ƂȂĂB +@J͗‚‚ŁAAƉ]‚߂ĂB[ł͎ɋ +ႭāAグƁẢA΂߂ɂ‚oOi炩j̐ɁAd +Â_xĂB +@ǂɂȂȂAǂɂׂɂ́AiIł硁iƂ܁j͂ȂB +Ił΁Azni‚j̉A΂̓y̏ŁA_iɁj +łBāȀ̖֎ėāÂ悤Ɏ̂ĂĂ܂΂ +łBI΂ȂƂ΁[[l̍ĺAxjgɁA +̋ǏֈB́u΁v́A‚łĂAǁu΁v +BĺAiI΂ȂƂm肵ȂÁu΁v̂ +‚ׂɁARǍɗ‚ulɂȂOɎdȂvƉ]A +ϋɓIɍm肷邾́AECoɂ̂łB +@l͑傫Ți߁jāAꂩAVɗオB[₦̂ +śAΉ~̊łB͖̒ƒƂ̊ԂA[łƋɉ +ȂAʂBOh̒ɂƂ܂Ă肬肷Aǂ֍sĂ܂ +B +@ĺA߂ȂAR̊́i݁jɏd˂Ả̌ +̂܂܂킵BJ̊̂ȂAlڂɂ霜̂ȂAӊyɂ˂ꂻ +ȏ΁AłƂA𖾂ƎvłBƁAK +̘̏O֏A̍LAVOhqɂ‚BȂAlɂ +ĂAǂl΂łBĺAōɂiЂÂj̑ +⑖Ȃ悤ɋC‚ȂAm͂A̒q̈ԉ̒iւ +݂B +@ꂩǍłB̘Ȍ֏oA̍Lq̒iɁAl +̒jAL̂悤ɐg߂āAEȂA̗eqMĂBȌォ +炳΂̌AɁA̒j̉E̖jʂ炵ĂBZ颁iЂj̒ɁA +Ԃ^ᬂ̂jłBĺAn߂Ȁɂ҂́Al΂ +肾ƍĂBꂪAqOiČƁAł͒N΂ƂڂāA +̉΂𑴏ƓĂ炵B́ȂA낢A +Xɒw偂̑V䗠ɁAȂf̂ŁAɂƒmꂽ̂ł +B̉J̖ɁȀ̗ŁA΂ƂĂ邩́AǂB̎҂ł͂ +B +@ĺA{iĵ悤ɑʂŁAƋ}ȒqAԏ̒i +Ŕ悤ɂď‚߂Bđ̂o邾AɂȂAo邾 +AO֏oāA鋰AO̓`ČB +@ƁAO̓ɂ́A\ɕʂA‚̎r[ijAɊĂ +邪A΂̌̋yԔ͈͂Av苷̂ŁA͊‚Ƃ킩ȂBBA +ڂ낰ȂAm̂́A̒ɗ̎r[ƁA𒅂r[ƂƉ] +Bܘ_Aɂ͏j܂Ă炵BāA̎r[͊FAꂪA +i‚ājAĂlԂƉ]^Ays˂đl` +悤ɁAJA΂肵āA낲돰̏ɂ낪ĂB +AƂƂ̍ȂĂ镔ɁAڂ肵΂̌āAႭȂ +镔̉ewÂȂAivɈij̔@قĂB +@ĺA̎r[̕ࣂLCɎv킸A@ijBA +̎́ȀuԂɂ́A@YĂB鋭wiقƂ +ǂƂƂj̒j̚koDĂ܂łB +@l̊́A̎A͂߂āAr[̒LĂi܂Ăjl +BwFiЂ͂j̒𒘂Aw̒ႢAÁÂ悤 +ȘVkłB̘VḱAE̎ɉ΂Ƃ̖ؕЂāA̎r[̈ +̊`ނ悤ɒ߂ĂB̖т̒ƁA̎r[ł낤B +@ĺAZ̋|Ǝl̍DSƂɓāAb͌ċziĵ +YĂBL̋L҂̌؂΁AugiƂj̖тv悤Ɋ +̂łBƁAVḱA̖ؕЂA‚̊Ԃɑ}āAꂩA܂Œ +߂Ăr[̎ɗƁAxA̐e̎qli݁jƂ悤 +ɁA̖̒т{”͂߂B͎ɏ]Ĕ炵B +@̖̔тA{”̂ɏ]ĉl̐ŚA|čs +BāAƓɁA̘Vkɑ΂͂A“ėB +A̘Vkɑ΂Ɖ]ẮAꕾ邩mȂBJiނjA +鈫ɑ΂锽Aꕪɋ𑝂ė̂łB̎AN̉lɁA +̉ł̒jlĂA_iɁj邩lɂȂ邩Ɖ] +A߂ĎoA炭ĺA̖ȂA_I񂾎ł낤B +قǁA̒j̈𑞂ސŚAVk̏ɑ}̖ؕЂ̂悤ɁA悭R +肾Ă̂łB +@lɂ́Aܘ_A̘Vkl̖̔т𔲂킩ȂB]āAI +ɂ́AP̉ɕЂÂĂ悢mȂBlɂƂẮA +J̖ɁȀ̗ŁAl̖̔т𔲂Ɖ]AꂾŊɋ +炴鈫łBܘ_@ĺ@AlɂȂCłȂ́@ +ɖYĂ̂łB +@ŁAĺAɗ͂āAȂAq֔яオ@ +ĐiЂÂj̑ɎȂA҂ɘVk̑O݂֕BVk +̂́@]ȂB +@VḱAډlƁA܂ŜWi݁jɂłeꂽ悤Ɂ@яオ +B +@ûAǂ֍sBv +@ĺAVkr[ɂ‚܂ÂȂAQĂӂ߂ē悤ƂsǂŁA +lBVḱAłl‚̂čsƂBl͖As +܂ƂāAǂBl͎r[̒ŁAbÂ܂܁A‚ݍB +́A͂߂A킩ĂBl͂ƂƂAVk̘r‚ŁA +ւ˂|BxA{iƂj̋r̂悤ȁAƔ΂̘rłB +@uĂBĂB]B]ʂƁ@ꂾBv +@ĺAVk‚ƁAȂȀ𕥂āA|i͂ˁj̐F +̊̑Oւ‚‚BǂAVk͖قĂBȂȂӂ킹āA +ő؂ȂAAዅ܂Ԃ̊O֏oɂȂAJāÂ悤 +ɎXiイˁjقĂBƁAl͎n߂Ėɂ̘Vk̐ +ASRÄӎuɎxzĂƉ]ӎBāÄӎ́A +܂ł͂RĂ̐Sij̊Ԃɂ܂Ă܂BɎc +̂́ABAdāAꂪ~ɐÁA炩ȓӂƖƂ +΂łBŁAĺAVkAȂA_Ă]B +@uȂ͌giтj̖̒lȂǂł͂ȂB̖̉ʂ肩 +̎҂B炨OɓāAǂ悤Ɖ]悤Ȏ͂ȂBBA +̖̏ŁAĂ̂AȂɘb΂̂Bv +@ƁAVḱAJAw傫āAƂ̉l̊B +܂Ԃ̐ԂȂAĤ悤ȁAsŌ̂łBꂩAᰂŁAwA +@ƈ‚ɂȂOłł悤ɓBׂAŁAA +Ă̂B̎A̍AAi炷j̚e悤ȐAbb +Al̎֓`ėB +@u̔𔲂ĂȁȀ̔𔲂ĂȁA顁i‚jɂ悤Ǝv +Bv +@ĺAVk̓OA}Ȃ̂Ɏ]BĎ]ƓɁAO +Aȕ̂ƈꂵɁAS̒ւ͂ėBƁ@̋CFijA +ւʂ̂ł낤BVḱAЎɁA܂r[̓DiƁj +тȂA寁iЂĵ‚Ԃ₭悤ȐŁAȂAȎ] +B +@Al̖̔т𔲂Ɖ]́A˒mʁBA]l +́AF@̈ʂȎAĂlԂ΂łBɁAA +Ȃǂ́Aւl΂肸‚ɐ؂Ċ̂AiقjƉ]āA +сi͂j̐w֔ɍsBuaɂĎȂȂȂAł +ɍsĂȂBȀ̔銱́A悢Ɖ]̂ŁA +тAؗɔĂ̂łB́Ȁ̂Ƃ +vȂBȂ΁A_iɁĵŁAdȂłB +AÂĂƂ͎vȂB͂肵Ȃ΁A_ +̂ŁAdȂ鎖łBāA̎dȂA悭 +mĂ̏́Â鎖Ă̂ɂȂƎvł +B[[VḱÂȈӖ̎]B +@ĺAɂ߂āȂ̎̕łȂARƂāA +̘b𕷂ĂBܘ_A@E̎ł́AԂjɔ^傫Ȗᬁiɂсj +CɂȂAĂ̂łBAV𕷂Ă钆ɁAl̐Sɂ́A +EC܂ėB́@Ảł̒jɌĂECłB +āAȀ̖֏ijāA̘Vk߂̗ECƂ́ASRA +΂ȕɓƂECłBĺA_邩lɂȂ邩ɖȂ +΂ł͂ȂB̎̂̒j̐S]΁A_ȂǂƉ]́AwAl +鎖oȂAӎ̊OɒǂoĂB +@uƁABv +@Vk̘bƁAl͚}ij悤ȐŔOBāAꑫO +֏oƁAsӂɁAE̎ᬂ痣āAVk̋ݏi肪݁j‚݂ȂA +]B +@uł́AȂiЂ͂j悤ƍނ܂ȁBȂȂ΁A_ +̂Ȃ̂Bv +@ĺA΂₭AVk̒𔍂ƂBꂩAɂ݂‚ƂV +kArr[̏֏R|Bq̌܂ł́A͂Ɍܕ𐔂΂łB +ĺAƂOF̒킫ɂāA܂Ԃɋ}Ȓq̒ +肽B +@bA񂾂悤ɓ|ĂVkAr[̒Ȃ̗̂N̂́A +ꂩԂȂ̎łBVḱA‚Ԃ₭悤ȁA߂悤Ȑ𗧂ĂȂA +܂RĂ΂̌ɁAq̌܂ŁAčsBāAA +Z|i܁jɂāẢ`񂾁BOɂ́ABAXi +Ƃj邪΂łB +@ĺAɁAJ`āAs̒֋𓭂ɋ}łB diff --git a/vendor/golang.org/x/text/encoding/testdata/rashomon-utf-8.txt b/vendor/golang.org/x/text/encoding/testdata/rashomon-utf-8.txt new file mode 100644 index 0000000000..a890328324 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/testdata/rashomon-utf-8.txt @@ -0,0 +1,178 @@ +This file was derived from +http://www.gutenberg.org/cache/epub/1982/pg1982.txt +-------- +羅生門 + +芥川龍之介 + + 或日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。 広い門 +の下には、この男の外に誰もいない。ただ、所々丹塗の剥げた、大きな円柱に、きりぎ +りすが一匹とまっている。羅生門が、朱雀大路にある以上は、この男の外にも、雨やみ +をする市女笠や揉烏帽子が、もう二三人はありそうなものである。それが、この男の外 +に誰もいない。 + 何故かと云うと、この二三年、京都には、地震とか辻風とか火事とか饑饉とか云う災 +いがつづいて起こった。そこで洛中のさびれ方は一通りでない。旧記によると、仏像や +仏具を打砕いて、その丹がついたり、金銀の箔(はく)がついたりした木を、路ばたに +つみ重ねて薪の料(しろ)に売っていたと云うことである。洛中がその始末であるから、 +羅生門の修理などは、元より誰も捨てて顧みる者がなかった。するとその荒れ果てたの +をよい事にして、狐狸(こり)が棲む。盗人が棲む。とうとうしまいには、引取り手の +ない死人を、この門へ持って来て、捨てて行くと云う習慣さえ出来た。そこで、日の目 +が見えなくなると、誰でも気味を悪がって、この門の近所へは足ぶみをしない事になっ +てしまったのである。 + その代り又鴉が何処からか、たくさん集まって来た。昼間見ると、その鴉が何羽とな +く輪を描いて、高い鴟尾(しび)のまわりを啼きながら、飛びまわっている。殊に門の +上の空が、夕焼けであかくなる時には、それが胡麻をまいたようにはっきり見えた。鴉 +は、勿論、門の上にある死人の肉を、啄みに来るのである。ーー尤も今日は、刻限が遅 +いせいか、一羽も見えない。唯、所々、崩れかかった、そうしてその崩れ目に長い草の +はえた石段の上に、鴉の糞(くそ)が、点々と白くこびりついているのが見える。下人 +は七段ある石段の一番上の段に洗いざらした紺の襖(あお)の尻を据えて、右の頬に出 +来た、大きな面皰(にきび)を気にしながら、ぼんやり、雨のふるのを眺めているので +ある。 + 作者はさっき、「下人が雨やみを待っていた」と書いた。しかし、下人は、雨がやん +でも格別どうしようと云う当てはない。ふだんなら、勿論、主人の家へ帰る可き筈であ +る。所がその主人からは、四五日前に暇を出された。前にも書いたように、当時京都の +町は一通りならず衰微していた。今この下人が、永年、使われていた主人から暇を出さ +れたのも、この衰微の小さな余波に外ならない。だから、「下人が雨やみを待っていた」 +と云うよりも、「雨にふりこめられた下人が、行き所がなくて、途方にくれていた」と +云う方が、適当である。その上、今日の空模様も少なからずこの平安朝の下人の +Sentimentalismeに影響した。申(さる)の刻下がりからふり出した雨は、未だに上 +がるけしきがない。そこで、下人は、何を措いても差当たり明日の暮しをどうにかしよ +うとしてーー云わばどうにもならない事を、どうにかしようとして、とりとめもない考 +えをたどりながら、さっきから朱雀大路にふる雨の音を聞くともなく聞いていた。 + 雨は羅生門をつつんで、遠くから、ざあっと云う音をあつめてくる。夕闇は次第に空 +を低くして、見上げると、門の屋根が、斜めにつき出した甍(いらか)の先に、重たく +うす暗い雲を支えている。 + どうにもならない事を、どうにかする為には、手段を選んでいる遑(いとま)はない。 +選んでいれば、築地(ついじ)の下か、道ばたの土の上で、饑死(うえじに)をするば +かりである。そうして、この門の上へ持って来て、犬のように捨てられてしまうばかり +である。選ばないとすればーー下人の考えは、何度も同じ道を低徊した揚句に、やっと +この局所へ逢着した。しかしこの「すれば」は、いつもでたっても、結局「すれば」で +あった。下人は、手段を選ばないという事を肯定しながらも、この「すれば」のかたを +つける為に、当然、この後に来る可き「盗人になるより外に仕方がない」と云う事を、 +積極的に肯定するだけの、勇気が出ずにいたのである。 + 下人は大きな嚏(くさめ)をして、それから、大儀そうに立上がった。夕冷えのする +京都は、もう火桶が欲しい程の寒さである。風は門の柱と柱との間を、夕闇と共に遠慮 +なく、吹きぬける。丹塗の柱にとまっていたきりぎりすも、もうどこかへ行ってしまっ +た。 + 下人は、頸をちぢめながら、山吹の汗衫(かざみ)に重ねた、紺の襖の肩を高くして +門のまわりを見まわした。雨風の患のない、人目にかかる惧のない、一晩楽にねられそ +うな所があれば、そこでともかくも、夜を明かそうと思ったからである。すると、幸門 +の上の楼へ上る、幅の広い、之も丹を塗った梯子が眼についた。上なら、人がいたにし +ても、どうせ死人ばかりである。下人は、そこで腰にさげた聖柄(ひじりづか)の太刀 +が鞘走らないように気をつけながら、藁草履をはいた足を、その梯子の一番下の段へふ +みかけた。 + それから、何分かの後である。羅生門の楼の上へ出る、幅の広い梯子の中段に、一人 +の男が、猫のように身をちぢめて、息を殺しながら、上の容子を窺っていた。楼の上か +らさす火の光が、かすかに、その男の右の頬をぬらしている。短い鬚(ひげ)の中に、 +赤く膿を持った面皰のある頬である。下人は、始めから、この上にいる者は、死人ばか +りだと高を括っていた。それが、梯子を二三段上って見ると、上では誰か火をとぼして、 +しかもその火を其処此処と動かしているらしい。これは、その濁った、黄いろい光が、 +隅々に蜘蛛の巣をかけた天井裏に、ゆれながら映ったので、すぐにそれと知れたのであ +る。この雨の夜に、この羅生門の上で、火をともしているからは、どうせ唯の者ではな +い。 + 下人は、宮守(やもり)のように足音をぬすんで、やっと急な梯子を、一番上の段ま +で這うようにして上りつめた。そうして体を出来るだけ、平にしながら、頸を出来るだ +け、前へ出して、恐る恐る、楼の内を覗いて見た。 + 見ると、楼の内には、噂に聞いた通り、幾つかの屍骸(しがい)が、無造作に棄てて +あるが、火の光の及ぶ範囲が、思ったより狭いので、数は幾つともわからない。唯、お +ぼろげながら、知れるのは、その中に裸の屍骸と、着物を着た屍骸とがあると云う事で +ある。勿論、中には女も男もまじっているらしい。そうして、その屍骸は皆、それが、 +嘗(かつて)、生きていた人間だと云う事実さえ疑われる程、土を捏ねて造った人形の +ように、口を開いたり、手を延ばしたりして、ごろごろ床の上にころがっていた。しか +も、肩とか胸とかの高くなっている部分に、ぼんやりした火の光をうけて、低くなって +いる部分の影を一層暗くしながら、永久に唖(おし)の如く黙っていた。 + 下人は、それらの屍骸の腐爛した臭気に思わず、鼻を掩った(おおった)。しかし、 +その手は、次の瞬間には、もう鼻を掩う事を忘れていた。或る強い感情が殆悉(ほとん +どことごとく)この男の嗅覚を奪ってしまったからである。 + 下人の眼は、その時、はじめて、其屍骸の中に蹲っている(うずくまっている)人間 +を見た。檜肌色(ひはだいろ)の着物を著た、背の低い、痩せた、白髪頭の、猿のよう +な老婆である。その老婆は、右の手に火をともした松の木片を持って、その屍骸の一つ +の顔を覗きこむように眺めていた。髪の毛の長い所を見ると、多分女の屍骸であろう。 + 下人は、六分の恐怖と四分の好奇心とに動かされて、暫時は呼吸(いき)をするのさ +え忘れていた。旧記の記者の語を借りれば、「頭身(とうしん)の毛も太る」ように感 +じたのである。すると、老婆は、松の木片を、床板の間に挿して、それから、今まで眺 +めていた屍骸の首に両手をかけると、丁度、猿の親が猿の子の虱(しらみ)をとるよう +に、その長い髪の毛を一本ずつ抜きはじめた。髪は手に従って抜けるらしい。 + その髪の毛が、一本ずつ抜けるのに従って下人の心からは、恐怖が少しずつ消えて行っ +た。そうして、それと同時に、その老婆に対するはげしい憎悪が、少しずつ動いて来た。 +いや、この老婆に対すると云っては、語弊があるかも知れない。寧(むしろ)、あらゆ +る悪に対する反感が、一分毎に強さを増して来たのである。この時、誰かがこの下人に、 +さっき門の下でこの男が考えていた、饑死(うえじに)をするか盗人になるかと云う問 +題を、改めて持出したら、恐らく下人は、何の未練もなく、饑死を選んだ事であろう。 +それほど、この男の悪を憎む心は、老婆の床に挿した松の木片のように、勢よく燃え上 +がりだしていたのである。 + 下人には、勿論、何故老婆が死人の髪の毛を抜くかわからなかった。従って、合理的 +には、それを善悪の何れに片づけてよいか知らなかった。しかし下人にとっては、この +雨の夜に、この羅生門の上で、死人の髪の毛を抜くと云う事が、それだけで既に許す可 +らざる悪であった。勿論 下人は さっき迄自分が、盗人になる気でいた事なぞは と +うに忘れているのである。 + そこで、下人は、両足に力を入れて、いかなり、梯子から上へ飛び上がった そうし +て聖柄(ひじりづか)の太刀に手をかけながら、大股に老婆の前へ歩みよった。老婆が +驚いたのは 云う迄もない。 + 老婆は、一目下人を見ると、まるで弩(いしゆみ)にでも弾かれたように 飛び上がっ +た。 + 「おのれ、どこへ行く。」 + 下人は、老婆が屍骸につまづきながら、慌てふためいて逃げようとする行手を塞いで、 +こう罵った。老婆は、それでも下人をつきのけて行こうとする。下人は又、それを行か +すまいとして、押しもどす。二人は屍骸の中で、暫、無言のまま、つかみ合った。しか +し勝負は、はじめから、わかっている。下人はとうとう、老婆の腕をつかんで、無理に +そこへねじ倒した。丁度、鶏(とり)の脚のような、骨と皮ばかりの腕である。 + 「何をしていた。さあ何をしていた。云え。云わぬと これだぞよ。」 + 下人は、老婆をつき放すと、いきなり、太刀の鞘を払って、白い鋼(はがね)の色を +その眼の前へつきつけた。けれども、老婆は黙っている。両手をわなわなふるわせて、 +肩で息を切りながら、眼を、眼球がまぶたの外へ出そうになる程、見開いて、唖のよう +に執拗(しゅうね)く黙っている。これを見ると、下人は始めて明白にこの老婆の生死 +が、全然、自分の意志に支配されていると云う事を意識した。そうして、この意識は、 +今まではげしく燃えていた憎悪の心を何時(いつ)の間にか冷ましてしまった。後に残っ +たのは、唯、或仕事をして、それが円満に成就した時の、安らかな得意と満足とがある +ばかりである。そこで、下人は、老婆を、見下げながら、少し声を柔げてこう云った。 + 「己は検非違使(けびいし)の庁の役人などではない。今し方この門の下を通りかかっ +た旅の者だ。だからお前に縄をかけて、どうしようと云うような事はない。唯今時分、 +この門の上で、何をしていたのだか、それを己に話さえすればいいのだ。」 + すると、老婆は、見開いた眼を、一層大きくして、じっとその下人の顔を見守った。 +まぶたの赤くなった、肉食鳥のような、鋭い眼で見たのである。それから、皺で、殆、 +鼻と一つになった唇を何か物でも噛んでいるように動かした。細い喉で、尖った喉仏の +動いているのが見える。その時、その喉から、鴉(からす)の啼くような声が、喘ぎ喘 +ぎ、下人の耳へ伝わって来た。 + 「この髪を抜いてな、この女の髪を抜いてな、鬘(かつら)にしようと思うたの +じゃ。」 + 下人は、老婆の答が存外、平凡なのに失望した。そうして失望すると同時に、又前の +憎悪が、冷な侮蔑と一しょに、心の中へはいって来た。すると その気色(けしき)が、 +先方へも通じたのであろう。老婆は、片手に、まだ屍骸の頭から奪(と)った長い抜け +毛を持ったなり、蟇(ひき)のつぶやくような声で、口ごもりながら、こんな事を云っ +た。 + 成程、死人の髪の毛を抜くと云う事は、悪い事かね知れぬ。しかし、こう云う死人の +多くは、皆 その位な事を、されてもいい人間ばかりである。現に、自分が今、髪を抜 +いた女などは、蛇を四寸ばかりずつに切って干したのを、干魚(ほしうお)だと云って、 +太刀帯(たちはき)の陣へ売りに行った。疫病にかかって死ななかったなら、今でも売 +りに行っていたかもしれない。しかも、この女の売る干魚は、味がよいと云うので、太 +刀帯たちが、欠かさず菜料に買っていたのである。自分は、この女のした事が悪いとは +思わない。しなければ、饑死(えうじに)をするので、仕方がなくした事だからである。 +だから、又今、自分のしていた事も悪い事とは思わない。これもやはりしなければ、饑 +死をするので、仕方がなくする事だからである。そうして、その仕方がない事を、よく +知っていたこの女は、自分のする事を許してくれるのにちがいないと思うからであ +る。ーー老婆は、大体こんな意味の事を云った。 + 下人は、太刀を鞘におさめて、その太刀の柄を左の手でおさえながら、冷然として、 +この話を聞いていた。勿論、 右の手では、赤く頬に膿を持た大きな面皰(にきび)を +気にしながら、聞いているのである。しかし、之を聞いている中に、下人の心には、或 +勇気が生まれて来た。それは さっき、門の下でこの男に欠けていた勇気である。そう +して、又さっき、この門の上へ上(あが)って、その老婆を捕えた時の勇気とは、全然、 +反対な方向に動こうとする勇気である。下人は、饑死をするか盗人になるかに迷わなかっ +たばかりではない。その時のこの男の心もちから云えば、饑死などと云う事は、殆、考 +える事さえ出来ない程、意識の外に追い出されていた。 + 「きっと、そうか。」 + 老婆の話が完ると、下人は嘲(あざけ)るような声で念を押した。そうして、一足前 +へ出ると、不意に、右の手を面皰から離して、老婆の襟上(えりがみ)をつかみながら、 +こう云った。 + 「では、己が引剥(ひはぎ)をしようと恨むまいな。己もそうしなければ、饑死をす +る体なのだ。」 + 下人は、すばやく、老婆の着物を剥ぎとった。それから、足にしがみつこうとする老 +婆を、手荒く屍骸の上へ蹴倒した。梯子の口までは、僅に五歩を数えるばかりである。 +下人は、剥ぎとった桧肌色の着物をわきにかかえて、またたく間に急な梯子を夜の底へ +かけ下りた。 + 暫、死んだように倒れていた老婆が、屍骸の中から、その裸の体を起こしたのは、そ +れから間もなくの事である。老婆は、つぶやくような、うめくような声を立てながら、 +まだ燃えている火の光をたよりに、梯子の口まで、這って行った。そうして、そこから、 +短い白髪を倒(さかさま)にして、門の下を覗きこんだ。外には、唯、黒洞々(こくと +うとう)たる夜があるばかりである。 + 下人は、既に、雨を冒して、京都の町へ強盗を働きに急いでいた。 diff --git a/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-hz-gb2312.txt b/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-hz-gb2312.txt new file mode 100644 index 0000000000..5a142ce383 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-hz-gb2312.txt @@ -0,0 +1,107 @@ +This file was derived from +http://www.gutenberg.org/files/23864/23864-0.txt +after converting from Traditional Chinese to Simplified Chinese. +-------- +~{J<<F5ZR;~} + +~{KoWST;#:1xU_#,9zV.4sJB#,K@IzV.5X#,4fMvV.5@#,2;?I2;2lR2!#~} + +~{9J>-V.RTNeJB#,P#V.RT<F#,6xKwFdGi#:R;T;5@#,6~T;Ll#,H}T;5X#,KDT;=+#,NeT;7(!#~} + +~{5@U_#,AnCqSkIOM,Rb#,?ISkV.K@#,?ISkV.Iz#,6x2;N7N#R2#;LlU_#,RuQt!":.Jn!"J1VFR2#;5XU_#,T6=|!"OURW!"9cOA!"K@IzR2#;=+U_#,VG!"PE!"HJ!"SB!"QOR2#;7(U_#,GzVF!"9Y5@!"VwSCR2!#724KNeU_#,=+D*2;NE#,V*V.U_J$#,2;V*U_2;J$!#~} + +~{9JP#V.RT<F#,6xKwFdGi#,T;#:VwJkSP5@#?=+JkSPD\#?Ll5XJk5C#?7(AnJkPP#?1x~}?~{JkG?#?J?WdJkA7#?IM7#JkCw#?NaRT4KV*J$8:RS!#~} + +~{=+L}Na<F#,SCV.1XJ$#,AtV.#;=+2;L}Na<F#,SCV.1X0\#,H%V.!#~} + +~{<F@{RTL}#,DK~}?~{V.JF#,RTWtFdMb!#JFU_#,Rr@{6xVFH(R2!#~} + +~{1xU_#,9n5@R2!#9JD\6xJ>V.2;D\#,SC6xJ>V.2;SC#,=|6xJ>V.T6#,T66xJ>V.=|!#@{6xSUV.#,BR6xH!V.#,J56x18V.#,G?6x1\V.#,E-6xDSV.#,106x=>V.#,X}6x@MV.#,GW6x@kV.#,9%FdN^18#,3vFd2;Rb!#4K1x<RV.J$#,2;?IOH4+R2!#~} + +~{7rN4U=6xCmKcJ$U_#,5CKc6`R2#;N4U=6xCmKc2;J$U_#,5CKcIYR2!#6`KcJ$#,IYKc2;J$#,6x?vN^Kc:u#!NaRT4K9[V.#,J$8:<{RS!#~} + +~{WwU=5Z6~~} + +~{KoWST;#:72SC1xV.7(#,3[35G'~}?~{#,8o35G'3K#,4x<WJ.Mr#,G'@o@!A8!#TrDZMbV.7Q#,1v?MV.SC#,=:FaV.2D#,35<WV.7n#,HU7QG'=p#,H;:sJ.MrV.J&>YRS!#~} + +~{FdSCU=R2#,9sJ$#,>CTr6[1x4lHq#,9%3GTrA&G|#,>C1)J&Tr9zSC2;Wc!#7r6[1x4lHq#,G|A&~}?~{;u#,TrVn:n3KFd1W6xFp#,KdSPVGU_#,2;D\IFFd:sRS!#9J1xNEW>KY#,N46CGIV.>CR2!#7r1x>C6x9z@{U_#,N4V.SPR2!#9J2;>!V*SC1xV.:&U_#,Tr2;D\>!V*SC1xV.@{R2!#~} + +~{IFSC1xU_#,R[2;TY<.#,A82;H}TX#,H!SCl69z#,RrA8l65P#,9J>|J3?IWcR2!#9zV.F6l6J&U_T6Jd#,T6JdTr0YPUF6#;=|l6J&U_9sBt#,9sBtTr0YPU=_#,2F=_Tr<1l6GpR[!#A&G|2F~}?~{#,VPT-DZPil6<R#,0YPUV.7Q#,J.H%FdF_#;9+<RV.7Q#,FF>|0UBm#,<WkPJ8es#,j*~}?~{C,~}?~{#,GpE#4s35#,J.H%FdAy!#~} + +~{9JVG=+NqJ3l65P#,J35PR;VS#,51Na6~J.VS#;]=8QR;J/#,51Na6~J.J/!#9JI15PU_#,E-R2#;H!5PV.@{U_#,;uR2!#9J35U=#,5C35J.3KRTIO#,IMFdOH5CU_#,6x8|Fdl:Fl!#35TS6x3KV.#,WdIF6xQxV.#,JGN=J$5P6xRfG?!#~} + +~{9J1x9sJ$#,2;9s>C!#9JV*1xV.=+#,CqV.K>C|!#9z<R02N#V.VwR2!#~} + +~{D19%5ZH}~} + +~{KoWST;#:72SC1xV.7(#,H+9z~}?~{IO#,FF9z4NV.#;H+>|~}?~{IO#,FF>|4NV.#;H+BC~}?~{IO#,FFBC4NV.#;H+Wd~}?~{IO#,FFWd4NV.#;H+Ni~}?~{IO#,FFNi4NV.!#JG9J0YU=0YJ$#,7GIFV.IFU_R2#;2;U=6xG|HKV.1x#,IFV.IFU_R2!#~} + +~{9JIO1x7%D1#,Fd4N7%=;#,Fd4N7%1x#,FdOB9%3G!#9%3GV.7(#,~}?~{2;5CRQ!#P^~}???~{#,>_FwP5#,H}TB6x:s3I#;>`~}?~{#,SVH}TB6x:sRQ!#=+2;J$Fd7^#,6xRO8=V.#,I1J?H}7VV.R;#,6x3G2;0NU_#,4K9%V.TVR2!#~} + +~{9JIFSC1xU_#,G|HKV.1x#,6x7GU=R2#,0NHKV.3G6x7G9%R2#,;YHKV.9z6x7G>CR2#,1XRTH+Uyl6LlOB#,9J1x2;6Y6x@{?IH+#,4KD19%V.7(R2!#~} + +~{9JSC1xV.7(#,J.TrN'V.#,NeTr9%V.#,16Tr7VV.#,5PTrD\U=V.#,IYTrD\LSV.#,2;HtTrD\1\V.!#9JP!5PV.<a#,4s5PV.G\R2!#~} + +~{7r=+U_#,9zV.8(R2!#8(V\Tr9z1XG?#,8(O6Tr9z1XHu!#9J>}V.KyRT;<l6>|U_H}#:2;V*>|V.2;?IRT=x6xN=V.=x#,2;V*>|V.2;?IRTMK6xN=V.MK#,JGN=wc>|#;2;V*H}>|V.JB#,6xM,H}>|V.U~#,Tr>|J?;sRS#;2;V*H}>|V.H(#,6xM,H}>|V.HN#,Tr>|J?RIRS!#H}>|<H;sGRRI#,TrVn:nV.DQVARS!#JGN=BR>|R}J$!#~} + +~{9JV*J$SPNe#:V*?IRTU=Sk2;?IRTU=U_#,J$!#J6~}?~{9QV.SCU_#,J$!#IOOBM,S{U_#,J$!#RTS]4}2;S]U_#,J$!#=+D\6x>}2;SyU_#,J$!#4KNeU_#,V*J$V.5@R2!#~} + +~{9JT;#:V*<:V*1K#,0YU=2;~}?~{#;2;V*1K6xV*<:#,R;J$R;8:#;2;V*1K2;V*<:#,C?U=1X0\!#~} + +~{>|PN5ZKD~} + +~{KoWST;#:NtV.IFU=U_#,OH~}?~{2;?IJ$#,RT4}5PV.?IJ$!#2;?IJ$TZ<:#,?IJ$TZ5P!#9JIFU=U_#,D\~}?~{2;?IJ$#,2;D\J95P1X?IJ$!#9JT;#:J$?IV*#,6x2;?I~}?~{!#~} + +~{2;?IJ$U_#,JXR2#;?IJ$U_#,9%R2!#JXTr2;Wc#,9%TrSP~}?~{!#IFJXU_#,2Xl6>E5XV.OB#,IF9%U_#,6/l6>ELlV.IO#,9JD\WT1#6xH+J$R2!#~} + +~{<{J$2;9}~}?~{HKV.KyV*#,7GIFV.IFU_R2#;U=J$6xLlOBT;IF#,7GIFV.IFU_R2!#9J>YGo:A2;~}?~{6`A&#,<{HUTB2;~}?~{CwD?#,NE@Wv*2;~}?~{4O6z!#9EV.IFU=U_#,J$l6RWJ$U_R2!#9JIFU=U_V.J$R2#,N^VGC{#,N^SB9&#,9JFdU=J$2;_/!#2;_/U_#,FdKy4k1XJ$#,J$RQ0\U_R2!#9JIFU=U_#,OHA"l62;0\V.5X#,6x2;J'5PV.0\R2!#JG9JJ$1xOHJ$#,6x:sGsU=#,0\1xOHU=6x:sGsJ$!#IFSC1xU_#,P^5@6x1#7(#,9JD\~}?~{J$0\V.U~!#~} + +~{1x7(#:R;T;6H#,6~T;A?#,H}T;J}#,KDT;3F#,NeT;J$!#5XIz6H#,6HIzA?#,A?IzJ}#,J}Iz3F#,3FIzJ$!#9JJ$1xHtRT~}?~{3F~}?~{#,0\1xHtRT~}?~{3F~}?~{!#J$U_V.U=#,Ht>v;}K.l6G'XpV.~}?~{U_#,PNR2!#~} + +~{1xJF5ZNe~} + +~{KoWST;#:72VN~}?~{HgVN9Q#,7VJ}JGR2#;67~}?~{Hg679Q#,PNC{JGR2#;H}>|V.~}?~{#,?IJ91XJ\5P6xN^0\U_#,FfU}JGR2#;1xV.Ky<S#,HgRT~}?~{M6BQU_#,PiJ5JGR2!#~} + +~{72U=U_#,RTU}:O#,RTFfJ$!#9JIF3vFfU_#,N^GnHgLl5X#,2;=_Hg=-:#!#VU6x84J<#,HUTBJGR2!#K@6x~}?~{Iz#,KDJ1JGR2!#Iy2;9}Ne#,NeIyV.1d#,2;?IJ$L}R2#;I+2;9}Ne#,NeI+V.1d#,2;?IJ$9[R2#;N62;9}Ne#,NeN6V.1d#,2;?IJ$3"R2#;U=JF#,2;9}FfU}#,FfU}V.1d#,2;?IJ$GnR2!#FfU}O`Iz#,HgQ-;7V.N^6K#,JlD\GnV.TU#?~} + +~{<$K.V.<2#,VAl6F/J/U_#,JFR2#;~}?~{DqV.<2#,VAl6;YU[U_#,=ZR2!#JG9JIFU=U_#,FdJFOU#,Fd=Z6L!#JFHgUEes#,=ZHg7";z!#~} + +~{7W7W~}??~{#,67BR6x2;?IBRR2#;;k;kcgcg#,PNT26x2;?I0\R2!#BRIzl6VN#,GSIzl6SB#,HuIzl6G?!#VNBR#,J}R2#;SBGS#,JFR2#;G?Hu#,PNR2!#9JIF6/5PU_#,PNV.#,5P1X4SV.#;ShV.#,5P1XH!V.!#RT@{6/V.#,RTWd4}V.!#~} + +~{9JIFU=U_#,GsV.l6JF#,2;Tpl6HK#;9JD\TqHK6xHNJF!#HNJFU_#,FdU=HKR2#,HgW*D>J/!#D>J/V.PT#,02Tr>2#,N#Tr6/#,7=TrV9#,T2TrPP!#9JIFU=HKV.JF#,HgW*T2J/l6G'XpV.I=U_#,JFR2!#~} + +~{PiJ55ZAy~} + +~{KoWST;#:72OH4&U=5X6x4}5PU_X}#,:s4&U=5X6xGwU=U_@M!#~} + +~{9JIFU=U_#,VBHK6x2;VBl6HK!#D\J95PHKWTVAU_#,@{V.R2#;D\J95PHK2;5CVAU_#,:&V.R2!#9J5PX}D\@MV.#,1%D\<"V.#,02D\6/V.!#3vFdKy1XGw#,GwFdKy2;Rb!#PPG'@o6x2;@MU_#,PPl6N^HKV.5XR2#;9%6x1XH!U_#,9%FdKy2;JXR2!#JX6x1X9LU_#,JXFdKy2;9%R2!#~} + +~{9JIF9%U_#,5P2;V*FdKyJX#;IFJXU_#,5P2;V*FdKy9%!#N":uN":u#,VAl6N^PN#;Iq:uIq:u#,VAl6N^Iy#,9JD\~}?~{5PV.K>C|!#=x6x2;?ISyU_#,3eFdPiR2#;MK6x2;?IW7U_#,KY6x2;?I<0R2!#9JNRS{U=#,5PKd8_@]In95#,2;5C2;SkNRU=U_#,9%FdKy1X>HR2#;NR2;S{U=#,Kd;-5X6xJXV.#,5P2;5CSkNRU=U_#,9TFdKyV.R2!#9JPNHK6xNRN^PN#,TrNRW(6x5P7V!#NRW(~}?~{R;#,5P7V~}?~{J.#,JGRTJ.9%FdR;R2!#TrNR~}?~{5P9Q#,D\RT~}?~{;w9QU_#,TrNaV.KySkU=U_T<RS!#NaKySkU=V.5X2;?IV*#,2;?IV*Tr5PKy18U_6`#,5PKy18U_6`#,TrNaKySkU=U_9QRS!#9J18G0Tr:s9Q#,18:sTrG09Q#,18WsTrSR9Q#,18SRTrWs9Q#,N^Ky2;18#,TrN^Ky2;9Q!#9QU_#,18HKU_R2#;~}?~{U_#,J9HK18<:U_R2!#9JV*U=V.5X#,V*U=V.HU#,Tr?IG'@o6x;aU=#;2;V*U=V.5X#,2;V*U=HU#,TrWs2;D\>HSR#,SR2;D\>HWs#,G02;D\>H:s#,:s2;D\>HG0#,6x?vT6U_J}J.@o#,=|U_J}@o:u#!RTNa6HV.#,T=HKV.1xKd6`#,R`^IRfl6J$TU#!9JT;#:J$?I~}?~{R2!#5PKd~}?~{#,?IJ9N^67!#9J2_V.6xV*5CJ'V.<F#,:rV.6xV*6/>2V.@m#,PNV.6xV*K@IzV.5X#,=GV.6xV*SP~}?~{2;WcV.4&!#9JPN1xV.<+#,VAl6N^PN!#N^PNTrIn<d2;D\?z#,VGU_2;D\D1!#RrPN6x4kJ$l6~}?~{#,~}?~{2;D\V*!#HK=TV*NRKyRTJ$V.PN#,6xD*V*NaKyRTVFJ$V.PN!#9JFdU=J$2;~}?~{#,6xS&PNl6N^Gn!#7r1xPNOsK.#,K.V.PP1\8_6xGwOB#,1xV.PN1\J56x;wPi#;K.Rr5X6xVFAw#,1xRr5P6xVFJ$!#9J1xN^3#JF#,K.N^3#PN!#D\Rr5P1d;/6xH!J$U_#,N=V.Iq!#9JNePPN^3#J$#,KDJ1N^3#N;#,HUSP6L3$#,TBSPK@Iz!#~} + +~{>|Uy5ZF_~} + +~{KoWST;#:~} ~{72SC1xV.7(#,=+J\C|l6>}#,:O>|>[~}?~{#,=;:M6xIa#,D*DQl6>|Uy!#>|UyV.DQU_#,RTSX~}?~{V1#,RT;<~}?~{@{!#9JSXFdM>#,6xSUV.RT@{#,:sHK7"#,OHHKVA#,4KV*SXV1V.<FU_R2!#>|Uy~}?~{@{#,>|Uy~}?~{N#!#>Y>|6xUy@{Tr2;<0#,N/>|6xUy@{Tr~}?~{VX>h!#JG9J~}?~{<W6xGw#,HUR92;4&#,165@<fPP#,0Y~}?~{6xUy@{#,TrG\H}=+>|#,>"U_OH#,F#U_:s#,Fd7(J.R;6xVA#;NeJ.@o6xUy@{#,TrujIO=+>|#,Fd7(0kVA#;H}J.@o6xUy@{#,TrH}7VV.6~VA!#JG9J>|N^~}?~{VXTrMv#,N^A8J3TrMv#,N^N/;}TrMv!#9J2;V*Vn:nV.D1U_#,2;D\T%=;#;2;V*I=AV!"OUWh!">ZTsV.PNU_#,2;D\PP>|#;2;SCOg5<U_#,2;D\5C5X@{!#9J1xRTU)A"#,RT@{6/#,RT7V:M~}?~{1dU_R2!#9JFd<2Hg7g#,FdPlHgAV#,GVBSHg;p#,2;6/HgI=#,DQV*HgRu#,6/Hg@WUp!#BSOg7V~}?~{#,@*5X7V@{#,P|H(6x6/!#OHV*SXV1V.<FU_J$#,4K>|UyV.7(R2!#!6>|U~!7T;#:!0QT2;O`NE#,9J~}?~{V.=p9D#;JS2;O`<{#,9J~}?~{V.l:Fl!#!17r=p9Dl:FlU_#,KyRTR;CqV.6zD?R2!#Cq<HW(R;#,TrSBU_2;5C6@=x#,GSU_2;5C6@MK#,4KSC~}?~{V.7(R2!#9JR9U=6`=p9D#,VgU=6`l:Fl#,KyRT1dHKV.6zD?R2!#H}>|?I6aFx#,=+>|?I6aPD!#JG9J3/FxHq#,VgFx6h#,D:Fx9i!#IFSC1xU_#,1\FdHqFx#,;wFd6h9i#,4KVNFxU_R2!#RTVN4}BR#,RT>24};)#,4KVNPDU_R2!#RT=|4}T6#,RTX}4}@M#,RT1%4}<"#,4KVNA&U_R2!#N^Q{U}U}V.Fl#,N^;wLCLCV.3B#,4KVN1dU_R2!#9JSC1xV.7(#,8_AjNpOr#,13GpNpDf#,Qp11Np4S#,HqWdNp9%#,6|1xNpJ3#,9iJ&Np6t#,N'J&RE~}?~{#,Gn?\NpFH#,4KSC1xV.7(R2!#~} + +~{>E1d5Z0K~} + +~{KoWST;#:~} ~{72SC1xV.7(#,=+J\C|l6>}#,:O>|>[:O!#7:5XN^Ia#,ai5X:O=;#,>x5XN^At#,N'5XTrD1#,K@5XTrU=#,M>SPKy2;SI#,>|SPKy2;;w#,3GSPKy2;9%#,5XSPKy2;Uy#,>}C|SPKy2;J\!#9J=+M(l6>E1dV.@{U_#,V*SC1xRS#;=+2;M(>E1dV.@{#,KdV*5XPN#,2;D\5C5XV.@{RS#;VN1x2;V*>E1dV.Ju#,KdV*Ne@{#,2;D\5CHKV.SCRS!#JG9JVGU_V.BG#,1XTSl6@{:&#,TSl6@{6xNq?IPER2#,TSl6:&6x;<?I=bR2!#JG9JG|Vn:nU_RT:&#,R[Vn:nU_RTR5#,GwVn:nU_RT@{!#9JSC1xV.7(#,N^JQFd2;@4#,JQNaSPRT4}V.#;N^JQFd2;9%#,JQNaSPKy2;?I9%R2!#9J=+SPNeN##,1XK@?II1#,1XIz?IB2#,7^KY?INj#,A.=`?IHh#,0.Cq?I73!#724KNeU_#,=+V.9}R2#,SC1xV.TVR2!#82>|I1=+#,1XRTNeN##,2;?I2;2lR2!#~} + +~{PP>|5Z>E~} + +~{KoWST;#:724&>|O`5P#,>xI=R@~}?~{#,JSIz4&8_#,U=B!N^5G#,4K4&I=V.>|R2!#>xK.1XT6K.#,?M>xK.6x@4#,NpS-V.l6K.DZ#,An0k6I6x;wV.@{#,S{U=U_#,N^8=l6K.6xS-?M#,JSIz4&8_#,N^S-K.Aw#,4K4&K.IOV.>|R2!#>x3bTs#,N(X=H%N^At#,Ht=;>|l63bTsV.VP#,1XR@K.2]6x13~}?~{Jw#,4K4&3bTsV.>|R2!#F=B=4&RW#,SR138_#,G0K@:sIz#,4K4&F=B=V.>|R2!#724KKD>|V.@{#,;F5[V.KyRTJ$KD5[R2!#72>|:C8_6x6qOB#,9sQt6x<zRu#,QxIz6x4&J5#,>|N^0Y<2#,JGN=1XJ$!#GpAj5L7@#,1X4&FdQt6xSR13V.#,4K1xV.@{#,5XV.VzR2!#IOSjK.AwVA#,S{IfU_#,4}Fd6(R2!#725XSP>x='!"Ll>.!"Ll@N!"LlB^!"LlO]!"LlO6#,1XX=H%V.#,Np=|R2!#NaT6V.#,5P=|V.#;NaS-V.#,5P13V.!#>|ETSPOUWh!"dj>.!"]s]g!"P!AV!"~}??~{U_#,1X=w82KwV.#,4K7|~}?~{V.Ky4&R2!#5P=|6x>2U_#,JQFdOUR2#;T66xLtU=U_#,S{HKV.=xR2#;FdKy>SRWU_#,@{R2#;~}?~{Jw6/U_#,@4R2#;~}?~{2]6`UOU_#,RIR2#;DqFpU_#,7|R2#;J^:'U_#,82R2#;3>8_6xHqU_#,35@4R2#;106x9cU_#,M=@4R2#;I"6xLu4oU_#,iT~}?~{R2#;IY6xMy@4U_#,S*>|R2#;4G106x18U_#,=xR2#;4GG?6x=xG}U_#,MKR2#;Ga35OH3v>SFd2`U_#,3BR2#;N^T<6xGk:MU_#,D1R2#;1<W_6x3B1xU_#,FZR2#;0k=x0kMKU_#,SUR2#;UH6xA"U_#,<"R2#;<36xOHR{U_#,?JR2#;<{@{6x2;=xU_#,@MR2#;Dq</U_#,PiR2#;R9:tU_#,?VR2#;>|HEU_#,=+2;VXR2#;l:Fl6/U_#,BRR2#;@tE-U_#,>kR2#;I1BmHbJ3U_#,>|N^A8R2#;P|~}?~{2;75FdIaU_#,Gn?\R2#;W;W;tbtb#,PlSkHKQTU_#,J'~}?~{R2#;J}IMU_#,>=R2#;J}7#U_#,@'R2#;OH1)6x:sN7Fd~}?~{U_#,2;>+V.VAR2#;@4N/P;U_#,S{P]O"R2!#1xE-6xO`S-#,>C6x2;:O#,SV2;O`H%#,1X=w2lV.!#1x7G9sRf6`R2#,N)N^Nd=x#,WcRT2"A&AO5PH!HK6xRQ!#7rN)N^BG6xRW5PU_#,1XG\l6HK!#WdN4GW6x7#V.#,Tr2;7~#,2;7~TrDQSC!#WdRQGW8=6x7#2;PP#,Tr2;?ISC!#9J:OV.RTND#,FkV.RTNd#,JGN=1XH!!#AnKXPPRT=LFdCq#,TrCq7~#;AnKX2;PPRT=LFdCq#,TrCq2;7~!#AnKXPPU_#,Sk~}?~{O`5CR2!#~} + +~{5XPN5ZJ.~} + +~{KoWST;#:5XPNSPM(U_!"SP~}?~{U_!"SPV'U_!"SP0/U_!"SPOUU_!"SPT6U_!#NR?IRTMy#,1K?IRT@4#,T;M(!#M(PNU_#,OH>S8_Qt#,@{A85@#,RTU=Tr@{!#?IRTMy#,DQRT75#,T;~}?~{!#~}?~{PNU_#,5PN^18#,3v6xJ$V.#,5PHtSP18#,3v6x2;J$#,DQRT75#,2;@{!#NR3v6x2;@{#,1K3v6x2;@{#,T;V'!#V'PNU_#,5PKd@{NR#,NRN^3vR2#,R}6xH%V.#,An5P0k3v6x;wV.@{!#0/PNU_#,NROH>SV.#,1XS/V.RT4}5P!#Ht5POH>SV.#,S/6xNp4S#,2;S/6x4SV.!#OUPNU_#,NROH>SV.#,1X>S8_QtRT4}5P#;Ht5POH>SV.#,R}6xH%V.#,Np4SR2!#T6PNU_#,JF>yDQRTLtU=#,U=6x2;@{!#724KAyU_#,5XV.5@R2#,=+V.VAHN#,2;?I2;2lR2!#721xSPW_U_!"SP3[U_!"SPO]U_!"SP1@U_!"SPBRU_!"SP11U_!#724KAyU_#,7GLl5XV.TV#,=+V.9}R2!#7rJF>y#,RTR;;wJ.#,T;W_#;WdG?@tHu#,T;3[#;@tG?WdHu#,T;O]#;4s@tE-6x2;7~#,Sv5P~}?~{6xWTU=#,=+2;V*FdD\#,T;1@#;=+Hu2;QO#,=L5@2;Cw#,@tWdN^3##,3B1xW]:a#,T;BR#;=+2;D\AO5P#,RTIY:O~}?~{#,RTHu;wG?#,1xN^Q!7f#,T;11!#724KAyU_#,0\V.5@R2#,=+V.VAHN#,2;?I2;2lR2!#7r5XPNU_#,1xV.VzR2!#AO5PVFJ$#,<FOU0/T6=|#,IO=+V.5@R2!#V*4K6xSCU=U_1XJ$#,2;V*4K6xSCU=U_1X0\!#9JU=5@1XJ$#,VwT;N^U=#,1XU=?IR2#;U=5@2;J$#,VwT;1XU=#,N^U=?IR2!#9J=x2;GsC{#,MK2;1\Wo#,N(CqJG1##,6x@{l6Vw#,9zV.1&R2!#JSWdHgS$6y#,9J?IRTSkV.80InO*#;JSWdHg0.WS#,9J?ISkV.>cK@!#:q6x2;D\J9#,0.6x2;D\An#,BR6x2;D\VN#,F)Ht=>WS#,2;?ISCR2!#V*NaWdV.?IRT;w#,6x2;V*5PV.2;?I;w#,J$V.0kR2#;V*5PV.?I;w#,6x2;V*NaWdV.2;?IRT;w#,J$V.0kR2#;V*5PV.?I;w#,V*NaWdV.?IRT;w#,6x2;V*5XPNV.2;?IRTU=#,J$V.0kR2!#9JV*1xU_#,6/6x2;CT#,>Y6x2;Gn!#9JT;#:V*1KV*<:#,J$DK2;4y#;V*LlV*5X#,J$DK?IH+!#~} + +~{>E5X5ZJ.R;~} + +~{KoWST;#:SC1xV.7(#,SPI"5X#,SPGa5X#,SPUy5X#,SP=;5X#,SPai5X#,SPVX5X#,SP7:5X#,SPN'5X#,SPK@5X!#Vn:nWTU=Fd5XU_#,~}?~{I"5X#;HkHKV.5X2;InU_#,~}?~{Ga5X#;NR5CR`@{#,1K5CR`@{U_#,~}?~{Uy5X#;NR?IRTMy#,1K?IRT@4U_#,~}?~{=;5X#;Vn:nV.5XH}Jt#,OHVA6x5CLlOB~}?~{U_#,~}?~{ai5X#;HkHKV.5XIn#,133GRX6`U_#,~}?~{VX5X#;I=AV!"OUWh!">ZTs#,72DQPPV.5@U_#,~}?~{7:5X#;KySIHkU_0/#,Ky4S9iU_SX#,1K9Q?IRT;wNaV.~}?~{U_#,~}?~{N'5X#;<2U=Tr4f#,2;<2U=TrMvU_#,~}?~{K@5X!#JG9JI"5XTrN^U=#,Ga5XTrN^V9#,Uy5XTrN^9%#,=;5XTrN^>x#,ai5XTr:O=;#,VX5XTrBS#,7:5XTrPP#,N'5XTrD1#,K@5XTrU=!#9EV.IFSC1xU_#,D\J95PHKG0:s2;O`<0#,~}?~{9Q2;O`JQ#,9s<z2;O`>H#,IOOB2;O`JU#,Wd@k6x2;</#,1x:O6x2;Fk!#:Ol6@{6x6/#,2;:Ol6@{6xV9!#8RNJ5P~}?~{6xU{=+@4#,4}V.Ht:NT;#:OH6aFdKy0.TrL}RS!#1xV.GiVwKY#,3KHKV.2;<0!#SI2;S]V.5@#,9%FdKy2;=dR2!#72~}?~{?MV.5@#,InHkTrW(!#VwHK2;?K#,BSl6HDR0#,H}>|WcJ3!#=wQx6xNp@M#,2"Fx;}A&#,TK1x<FD1#,~}?~{2;?I2b!#M6V.N^KyMy#,K@GR2;11!#K@QI2;5C#,J?HK>!A&!#1xJ?IuO]Tr2;>e#,N^KyMyTr9L#,InHkTr>P#,2;5CRQTr67!#JG9JFd1x2;P^6x=d#,2;Gs6x5C#,2;T<6xGW#,2;An6xPE#,={OiH%RI#,VAK@N^KyV.!#NaJ?N^~}?~{2F#,7G6q;uR2#;N^~}?~{C|#,7G6qJYR2!#An7"V.HU#,J?WdWxU_LiU4=s#,YHNTU_Li=;RC#,M6V.N^KyMy#,Vn!"~}?~{V.SBR2!#9JIFSC1xU_#,F)HgBJH;!#BJH;U_#,3#I=V.I_R2!#;wFdJWTrN2VA#,;wFdN2TrJWVA#,;wFdVPTrJWN2>cVA!#8RNJ1x?IJ9HgBJH;:u#?T;?I!#7rNbHKSkT=HKO`6qR2#,51FdM,V[6x<C6xSv7g#,FdO`>HR2HgWsSRJV!#JG9J7=BmBqBV#,N4WcJQR2#;FkSBHgR;#,U~V.5@R2#;8UHa=T5C#,5XV.@mR2!#9JIFSC1xU_#,P/JVHtJ9R;HK#,2;5CRQR2!#=+>|V.JB#,>2RTSD#,U}RTVN#,D\S^J?WdV.6zD?#,J9V.N^V*#;RWFdJB#,8oFdD1#,J9HKN^J6#;RWFd>S#,SXFdM>#,J9Cq2;5CBG!#K'SkV.FZ#,Hg5G8_6xH%FdL]#;K'SkV.InHkVn:nV.5X#,6x7"Fd;z!#HtG}H:Qr#,G}6xMy#,G}6x@4#,D*V*KyV.!#>[H}>|V.~}?~{#,M6V.l6OU#,4KN==+>|V.JBR2!#>E5XV.1d#,G|IlV.A&#,HKGiV.@m#,2;?I2;2lR2!#72~}?~{?MV.5@#,InTrW(#,G3TrI"!#H%9zT=>36xJ&U_#,>x5XR2#;KD39U_#,ai5XR2#;HkInU_#,VX5XR2#;HkG3U_#,Ga5XR2#;139LG00/U_#,N'5XR2#;N^KyMyU_#,K@5XR2!#JG9JI"5XNa=+R;FdV>#,Ga5XNa=+J9V.Jt#,Uy5XNa=+GwFd:s#,=;5XNa=+=wFdJX#,=;5XNa=+9LFd=a#,ai5XNa=+=wFdJQ#,VX5XNa=+<LFdJ3#,7:5XNa=+=xFdM>#,N'5XNa=+H{Fd~}?~{#,K@5XNa=+J>V.RT2;;n!#9J1xV.Gi#:N'TrSy#,2;5CRQTr67#,9}Tr4S!#JG9J2;V*Vn:nV.D1U_#,2;D\T$=;#;2;V*I=AV!"OUWh!">ZTsV.PNU_#,2;D\PP>|#;2;SCOg5<#,2;D\5C5X@{!#KDNeU_#,R;2;V*#,7G0TMuV.1xR2!#7r0TMuV.1x#,7%4s9z#,TrFd~}?~{2;5C>[#;M~<Sl65P#,TrFd=;2;5C:O!#JG9J2;UyLlOBV.=;#,2;QxLlOBV.H(#,PE<:V.K=#,M~<Sl65P#,TrFd3G?I0N#,Fd9z?IcD!#J)N^7(V.IM#,P|N^U~V.An!#78H}>|V.~}?~{#,HtJ9R;HK!#78V.RTJB#,Np8fRTQT#;78V.RT:&#,Np8fRT@{!#M6V.Mv5XH;:s4f#,O]V.K@5XH;:sIz!#7r~}?~{O]l6:&#,H;:sD\~}?~{J$0\!#9J~}?~{1xV.JB#,TZK3Oj5PV.Rb#,2"5PR;Or#,G'@oI1=+#,JGN=GID\3IJB!#JG9JU~>YV.HU#,RD9XU[7{#,N^M(FdJ9#,@wl6@HCmV.IO#,RTVoFdJB!#5PHK?*~}?~{#,1XX=HkV.#,OHFdKy0.#,N"SkV.FZ#,<yD+Kf5P#,RT>vU=JB!#JG9JJ<Hg4&E.#,5PHK?*;'#;:sHgMQMC#,5P2;<0>\!#~} + +~{;p9%5ZJ.6~~} + +~{KoWST;#:72;p9%SPNe#:R;T;;pHK#,6~T;;p;}#,H}T;;p~}?~{#,KDT;;p?b#,NeT;;p6S!#PP;p1XSPRr#,Rr1XKX>_!#7";pSPJ1#,Fp;pSPHU!#J1U_#,LlV.ToR2!#HUU_#,TBTZ;~!"1Z!"Rm!"~}?~{R2!#724KKDK^U_#,7gFpV.HUR2!#72;p9%#,1XRrNe;pV.1d6xS&V.#:;p7"l6DZ#,TrTgS&V.l6Mb#;;p7"6xFd1x>2U_#,4}6xNp9%#,<+Fd;pA&#,?I4S6x4SV.#,2;?I4STrIO!#;p?I7"l6Mb#,N^4}l6DZ#,RTJ17"V.#,;p7"IO7g#,N^9%OB7g#,Vg7g>C#,R97gV9!#72>|1XV*Ne;pV.1d#,RTJ}JXV.!#9JRT;pWt9%U_Cw#,RTK.Wt9%U_G?!#K.?IRT>x#,2;?IRT6a!#7rU=J$9%H!6x2;6hFd9&U_PW#,C|T;!07QAt!1!#9JT;#:CwVwBGV.#,A<=+6hV.#,7G@{2;6/#,7G5C2;SC#,7GN#2;U=!#Vw2;?IRTE-6xPKJ&#,=+2;?IRT~}?~{6x9%U=!#:Ol6@{6x6/#,2;:Ol6@{6xIO!#E-?IRT84O2#,~}?~{?IRT84K5#,Mv9z2;?IRT844f#,K@U_2;?IRT84Iz!#9JCwVwIwV.#,A<=+>/V.!#4K029zH+>|V.5@R2!#~} + +~{SC<d5ZJ.H}~} + +~{KoWST;#:~} ~{72PKJ&J.Mr#,3vUwG'@o#,0YPUV.7Q#,9+<RV.7n#,HU7QG'=p#,DZMbI'6/#,5!l65@B7#,2;5C2YJBU_#,F_J.Mr<R!#O`JXJ}Dj#,RTUyR;HUV.J$#,6x0.>tB;0Y=p#,2;V*5PV.GiU_#,2;HJV.VAR2#,7GCqV.=+R2#,7GVwV.WtR2#,7GJ$V.VwR2!#9JCw>}OM=+KyRT6/6xJ$HK#,3I9&3vl6~}?~{U_#,OHV*R2!#OHV*U_#,2;?IH!l69mIq#,2;?IOsl6JB#,2;?IQil66H#,1XH!l6HK#,V*5PV.GiU_R2!#9JSC<dSPNe#:SPRr<d#,SPDZ<d#,SP74<d#,SPK@<d#,SPIz<d!#Ne<d>cFp#,D*V*Fd5@#,JGN=Iq<M#,HK>}V.1&R2!#Og<dU_#,RrFdOgHK6xSCV.#;DZ<dU_#,RrFd9YHK6xSCV.#;74<dU_#,RrFd5P<d6xSCV.#;K@<dU_#,~}??~{JBl6Mb#,AnNaNEV*V.6x4+l65P<dR2#;Iz<dU_#,741(R2!#9JH}>|V.JB#,D*GWl6<d#,IMD*:ql6<d#,JBD*C\l6<d#,7GJ%OM2;D\SC<d#,7GHJRe2;D\J9<d#,7GN"Cn2;D\5C<dV.J5!#N"TUN"TU#!N^Ky2;SC<dR2!#<dJBN47"6xOHNEU_#,<dSkKy8fU_<fK@!#72>|V.KyS{;w#,3GV.KyS{9%#,HKV.KyS{I1#,1XOHV*FdJX=+!"WsSR!"~}?~{U_!"CEU_!"IaHKV.PUC{#,AnNa<d1XKwV*V.!#5P<dV.@4<dNRU_#,Rr6x@{V.#,5<6xIaV.#,9J74<d?I5C6xSCR2#;RrJG6xV*V.#,9JOg<d!"DZ<d?I5C6xJ9R2#;RrJG6xV*V.#,9JK@<d~}??~{JB#,?IJ98f5P#;RrJG6xV*V.#,9JIz<d?IJ9HgFZ!#Ne<dV.JB#,Vw1XV*V.#,V*V.1XTZl674<d#,9J74<d2;?I2;:qR2!#NtRsV.PKR2#,RAV?TZOD#;V\V.PKR2#,B@Q@TZRs!#9JCw>}OM=+#,D\RTIOVG~}?~{<dU_#,1X3I4s9&!#4K1xV.R*#,H}>|V.KyJQ6x6/R2!#~} diff --git a/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-utf-8.txt b/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-utf-8.txt new file mode 100644 index 0000000000..e15fe5c193 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-gb-levels-1-and-2-utf-8.txt @@ -0,0 +1,107 @@ +This file was derived from +http://www.gutenberg.org/files/23864/23864-0.txt +after converting from Traditional Chinese to Simplified Chinese. +-------- +始计第一 + +孙子曰:兵者,国之大事,死生之地,存亡之道,不可不察也。 + +故经之以五事,校之以计,而索其情:一曰道,二曰天,三曰地,四曰将,五曰法。 + +道者,令民与上同意,可与之死,可与之生,而不畏危也;天者,阴阳、寒暑、时制也;地者,远近、险易、广狭、死生也;将者,智、信、仁、勇、严也;法者,曲制、官道、主用也。凡此五者,将莫不闻,知之者胜,不知者不胜。 + +故校之以计,而索其情,曰:主孰有道?将孰有能?天地孰得?法令孰行?兵?孰强?士卒孰练?赏罚孰明?吾以此知胜负矣。 + +将听吾计,用之必胜,留之;将不听吾计,用之必败,去之。 + +计利以听,乃?之势,以佐其外。势者,因利而制权也。 + +兵者,诡道也。故能而示之不能,用而示之不用,近而示之远,远而示之近。利而诱之,乱而取之,实而备之,强而避之,怒而挠之,卑而骄之,佚而劳之,亲而离之,攻其无备,出其不意。此兵家之胜,不可先传也。 + +夫未战而庙算胜者,得算多也;未战而庙算不胜者,得算少也。多算胜,少算不胜,而况无算乎!吾以此观之,胜负见矣。 + +作战第二 + +孙子曰:凡用兵之法,驰车千?,革车千乘,带甲十万,千里馈粮。则内外之费,宾客之用,胶漆之材,车甲之奉,日费千金,然后十万之师举矣。 + +其用战也,贵胜,久则钝兵挫锐,攻城则力屈,久暴师则国用不足。夫钝兵挫锐,屈力?货,则诸侯乘其弊而起,虽有智者,不能善其后矣。故兵闻拙速,未睹巧之久也。夫兵久而国利者,未之有也。故不尽知用兵之害者,则不能尽知用兵之利也。 + +善用兵者,役不再籍,粮不三载,取用於国,因粮於敌,故军食可足也。国之贫於师者远输,远输则百姓贫;近於师者贵卖,贵卖则百姓竭,财竭则急於丘役。力屈财?,中原内虚於家,百姓之费,十去其七;公家之费,破军罢马,甲胄矢弩,戟?矛?,丘牛大车,十去其六。 + +故智将务食於敌,食敌一钟,当吾二十钟;萁秆一石,当吾二十石。故杀敌者,怒也;取敌之利者,货也。故车战,得车十乘以上,赏其先得者,而更其旌旗。车杂而乘之,卒善而养之,是谓胜敌而益强。 + +故兵贵胜,不贵久。故知兵之将,民之司命。国家安危之主也。 + +谋攻第三 + +孙子曰:凡用兵之法,全国?上,破国次之;全军?上,破军次之;全旅?上,破旅次之;全卒?上,破卒次之;全伍?上,破伍次之。是故百战百胜,非善之善者也;不战而屈人之兵,善之善者也。 + +故上兵伐谋,其次伐交,其次伐兵,其下攻城。攻城之法,?不得已。修???,具器械,三月而后成;距?,又三月而后已。将不胜其忿,而蚁附之,杀士三分之一,而城不拔者,此攻之灾也。 + +故善用兵者,屈人之兵,而非战也,拔人之城而非攻也,毁人之国而非久也,必以全争於天下,故兵不顿而利可全,此谋攻之法也。 + +故用兵之法,十则围之,五则攻之,倍则分之,敌则能战之,少则能逃之,不若则能避之。故小敌之坚,大敌之擒也。 + +夫将者,国之辅也。辅周则国必强,辅隙则国必弱。故君之所以患於军者三:不知军之不可以进而谓之进,不知军之不可以退而谓之退,是谓縻军;不知三军之事,而同三军之政,则军士惑矣;不知三军之权,而同三军之任,则军士疑矣。三军既惑且疑,则诸侯之难至矣。是谓乱军引胜。 + +故知胜有五:知可以战与不可以战者,胜。识?寡之用者,胜。上下同欲者,胜。以虞待不虞者,胜。将能而君不御者,胜。此五者,知胜之道也。 + +故曰:知己知彼,百战不?;不知彼而知己,一胜一负;不知彼不知己,每战必败。 + +军形第四 + +孙子曰:昔之善战者,先?不可胜,以待敌之可胜。不可胜在己,可胜在敌。故善战者,能?不可胜,不能使敌必可胜。故曰:胜可知,而不可?。 + +不可胜者,守也;可胜者,攻也。守则不足,攻则有?。善守者,藏於九地之下,善攻者,动於九天之上,故能自保而全胜也。 + +见胜不过?人之所知,非善之善者也;战胜而天下曰善,非善之善者也。故举秋毫不?多力,见日月不?明目,闻雷霆不?聪耳。古之善战者,胜於易胜者也。故善战者之胜也,无智名,无勇功,故其战胜不忒。不忒者,其所措必胜,胜已败者也。故善战者,先立於不败之地,而不失敌之败也。是故胜兵先胜,而后求战,败兵先战而后求胜。善用兵者,修道而保法,故能?胜败之政。 + +兵法:一曰度,二曰量,三曰数,四曰称,五曰胜。地生度,度生量,量生数,数生称,称生胜。故胜兵若以?称?,败兵若以?称?。胜者之战,若决积水於千仞之?者,形也。 + +兵势第五 + +孙子曰:凡治?如治寡,分数是也;斗?如斗寡,形名是也;三军之?,可使必受敌而无败者,奇正是也;兵之所加,如以?投卵者,虚实是也。 + +凡战者,以正合,以奇胜。故善出奇者,无穷如天地,不竭如江海。终而复始,日月是也。死而?生,四时是也。声不过五,五声之变,不可胜听也;色不过五,五色之变,不可胜观也;味不过五,五味之变,不可胜尝也;战势,不过奇正,奇正之变,不可胜穷也。奇正相生,如循环之无端,熟能穷之哉? + +激水之疾,至於漂石者,势也;?鸟之疾,至於毁折者,节也。是故善战者,其势险,其节短。势如张弩,节如发机。 + +纷纷??,斗乱而不可乱也;浑浑沌沌,形圆而不可败也。乱生於治,怯生於勇,弱生於强。治乱,数也;勇怯,势也;强弱,形也。故善动敌者,形之,敌必从之;予之,敌必取之。以利动之,以卒待之。 + +故善战者,求之於势,不责於人;故能择人而任势。任势者,其战人也,如转木石。木石之性,安则静,危则动,方则止,圆则行。故善战人之势,如转圆石於千仞之山者,势也。 + +虚实第六 + +孙子曰:凡先处战地而待敌者佚,后处战地而趋战者劳。 + +故善战者,致人而不致於人。能使敌人自至者,利之也;能使敌人不得至者,害之也。故敌佚能劳之,饱能饥之,安能动之。出其所必趋,趋其所不意。行千里而不劳者,行於无人之地也;攻而必取者,攻其所不守也。守而必固者,守其所不攻也。 + +故善攻者,敌不知其所守;善守者,敌不知其所攻。微乎微乎,至於无形;神乎神乎,至於无声,故能?敌之司命。进而不可御者,冲其虚也;退而不可追者,速而不可及也。故我欲战,敌虽高垒深沟,不得不与我战者,攻其所必救也;我不欲战,虽画地而守之,敌不得与我战者,乖其所之也。故形人而我无形,则我专而敌分。我专?一,敌分?十,是以十攻其一也。则我?敌寡,能以?击寡者,则吾之所与战者约矣。吾所与战之地不可知,不可知则敌所备者多,敌所备者多,则吾所与战者寡矣。故备前则后寡,备后则前寡,备左则右寡,备右则左寡,无所不备,则无所不寡。寡者,备人者也;?者,使人备己者也。故知战之地,知战之日,则可千里而会战;不知战之地,不知战日,则左不能救右,右不能救左,前不能救后,后不能救前,而况远者数十里,近者数里乎!以吾度之,越人之兵虽多,亦奚益於胜哉!故曰:胜可?也。敌虽?,可使无斗。故策之而知得失之计,候之而知动静之理,形之而知死生之地,角之而知有?不足之处。故形兵之极,至於无形。无形则深间不能窥,智者不能谋。因形而措胜於?,?不能知。人皆知我所以胜之形,而莫知吾所以制胜之形。故其战胜不?,而应形於无穷。夫兵形象水,水之行避高而趋下,兵之形避实而击虚;水因地而制流,兵因敌而制胜。故兵无常势,水无常形。能因敌变化而取胜者,谓之神。故五行无常胜,四时无常位,日有短长,月有死生。 + +军争第七 + +孙子曰: 凡用兵之法,将受命於君,合军聚?,交和而舍,莫难於军争。军争之难者,以迂?直,以患?利。故迂其途,而诱之以利,后人发,先人至,此知迂直之计者也。军争?利,军争?危。举军而争利则不及,委军而争利则?重捐。是故?甲而趋,日夜不处,倍道兼行,百?而争利,则擒三将军,劲者先,疲者后,其法十一而至;五十里而争利,则蹶上将军,其法半至;三十里而争利,则三分之二至。是故军无?重则亡,无粮食则亡,无委积则亡。故不知诸侯之谋者,不能豫交;不知山林、险阻、沮泽之形者,不能行军;不用乡导者,不能得地利。故兵以诈立,以利动,以分和?变者也。故其疾如风,其徐如林,侵掠如火,不动如山,难知如阴,动如雷震。掠乡分?,廓地分利,悬权而动。先知迂直之计者胜,此军争之法也。《军政》曰:“言不相闻,故?之金鼓;视不相见,故?之旌旗。”夫金鼓旌旗者,所以一民之耳目也。民既专一,则勇者不得独进,怯者不得独退,此用?之法也。故夜战多金鼓,昼战多旌旗,所以变人之耳目也。三军可夺气,将军可夺心。是故朝气锐,昼气惰,暮气归。善用兵者,避其锐气,击其惰归,此治气者也。以治待乱,以静待哗,此治心者也。以近待远,以佚待劳,以饱待饥,此治力者也。无邀正正之旗,无击堂堂之陈,此治变者也。故用兵之法,高陵勿向,背丘勿逆,佯北勿从,锐卒勿攻,饵兵勿食,归师勿遏,围师遗?,穷寇勿迫,此用兵之法也。 + +九变第八 + +孙子曰: 凡用兵之法,将受命於君,合军聚合。泛地无舍,衢地合交,绝地无留,围地则谋,死地则战,途有所不由,军有所不击,城有所不攻,地有所不争,君命有所不受。故将通於九变之利者,知用兵矣;将不通九变之利,虽知地形,不能得地之利矣;治兵不知九变之术,虽知五利,不能得人之用矣。是故智者之虑,必杂於利害,杂於利而务可信也,杂於害而患可解也。是故屈诸侯者以害,役诸侯者以业,趋诸侯者以利。故用兵之法,无恃其不来,恃吾有以待之;无恃其不攻,恃吾有所不可攻也。故将有五危,必死可杀,必生可虏,忿速可侮,廉洁可辱,爱民可烦。凡此五者,将之过也,用兵之灾也。覆军杀将,必以五危,不可不察也。 + +行军第九 + +孙子曰:凡处军相敌,绝山依?,视生处高,战隆无登,此处山之军也。绝水必远水,客绝水而来,勿迎之於水内,令半渡而击之利,欲战者,无附於水而迎客,视生处高,无迎水流,此处水上之军也。绝斥泽,唯亟去无留,若交军於斥泽之中,必依水草而背?树,此处斥泽之军也。平陆处易,右背高,前死后生,此处平陆之军也。凡此四军之利,黄帝之所以胜四帝也。凡军好高而恶下,贵阳而贱阴,养生而处实,军无百疾,是谓必胜。丘陵堤防,必处其阳而右背之,此兵之利,地之助也。上雨水流至,欲涉者,待其定也。凡地有绝涧、天井、天牢、天罗、天陷、天隙,必亟去之,勿近也。吾远之,敌近之;吾迎之,敌背之。军旁有险阻、潢井、蒹葭、小林、??者,必谨覆索之,此伏?之所处也。敌近而静者,恃其险也;远而挑战者,欲人之进也;其所居易者,利也;?树动者,来也;?草多障者,疑也;鸟起者,伏也;兽骇者,覆也;尘高而锐者,车来也;卑而广者,徒来也;散而条达者,樵?也;少而往来者,营军也;辞卑而备者,进也;辞强而进驱者,退也;轻车先出居其侧者,陈也;无约而请和者,谋也;奔走而陈兵者,期也;半进半退者,诱也;杖而立者,饥也;汲而先饮者,渴也;见利而不进者,劳也;鸟集者,虚也;夜呼者,恐也;军扰者,将不重也;旌旗动者,乱也;吏怒者,倦也;杀马肉食者,军无粮也;悬?不返其舍者,穷寇也;谆谆翕翕,徐与人言者,失?也;数赏者,窘也;数罚者,困也;先暴而后畏其?者,不精之至也;来委谢者,欲休息也。兵怒而相迎,久而不合,又不相去,必谨察之。兵非贵益多也,惟无武进,足以并力料敌取人而已。夫惟无虑而易敌者,必擒於人。卒未亲而罚之,则不服,不服则难用。卒已亲附而罚不行,则不可用。故合之以文,齐之以武,是谓必取。令素行以教其民,则民服;令素不行以教其民,则民不服。令素行者,与?相得也。 + +地形第十 + +孙子曰:地形有通者、有?者、有支者、有隘者、有险者、有远者。我可以往,彼可以来,曰通。通形者,先居高阳,利粮道,以战则利。可以往,难以返,曰?。?形者,敌无备,出而胜之,敌若有备,出而不胜,难以返,不利。我出而不利,彼出而不利,曰支。支形者,敌虽利我,我无出也,引而去之,令敌半出而击之利。隘形者,我先居之,必盈之以待敌。若敌先居之,盈而勿从,不盈而从之。险形者,我先居之,必居高阳以待敌;若敌先居之,引而去之,勿从也。远形者,势均难以挑战,战而不利。凡此六者,地之道也,将之至任,不可不察也。凡兵有走者、有驰者、有陷者、有崩者、有乱者、有北者。凡此六者,非天地之灾,将之过也。夫势均,以一击十,曰走;卒强吏弱,曰驰;吏强卒弱,曰陷;大吏怒而不服,遇敌?而自战,将不知其能,曰崩;将弱不严,教道不明,吏卒无常,陈兵纵横,曰乱;将不能料敌,以少合?,以弱击强,兵无选锋,曰北。凡此六者,败之道也,将之至任,不可不察也。夫地形者,兵之助也。料敌制胜,计险隘远近,上将之道也。知此而用战者必胜,不知此而用战者必败。故战道必胜,主曰无战,必战可也;战道不胜,主曰必战,无战可也。故进不求名,退不避罪,唯民是保,而利於主,国之宝也。视卒如婴儿,故可以与之赴深溪;视卒如爱子,故可与之俱死。厚而不能使,爱而不能令,乱而不能治,譬若骄子,不可用也。知吾卒之可以击,而不知敌之不可击,胜之半也;知敌之可击,而不知吾卒之不可以击,胜之半也;知敌之可击,知吾卒之可以击,而不知地形之不可以战,胜之半也。故知兵者,动而不迷,举而不穷。故曰:知彼知己,胜乃不殆;知天知地,胜乃可全。 + +九地第十一 + +孙子曰:用兵之法,有散地,有轻地,有争地,有交地,有衢地,有重地,有泛地,有围地,有死地。诸侯自战其地者,?散地;入人之地不深者,?轻地;我得亦利,彼得亦利者,?争地;我可以往,彼可以来者,?交地;诸侯之地三属,先至而得天下?者,?衢地;入人之地深,背城邑多者,?重地;山林、险阻、沮泽,凡难行之道者,?泛地;所由入者隘,所从归者迂,彼寡可以击吾之?者,?围地;疾战则存,不疾战则亡者,?死地。是故散地则无战,轻地则无止,争地则无攻,交地则无绝,衢地则合交,重地则掠,泛地则行,围地则谋,死地则战。古之善用兵者,能使敌人前后不相及,?寡不相恃,贵贱不相救,上下不相收,卒离而不集,兵合而不齐。合於利而动,不合於利而止。敢问敌?而整将来,待之若何曰:先夺其所爱则听矣。兵之情主速,乘人之不及。由不虞之道,攻其所不戒也。凡?客之道,深入则专。主人不克,掠於饶野,三军足食。谨养而勿劳,并气积力,运兵计谋,?不可测。投之无所往,死且不北。死焉不得,士人尽力。兵士甚陷则不惧,无所往则固,深入则拘,不得已则斗。是故其兵不修而戒,不求而得,不约而亲,不令而信,禁祥去疑,至死无所之。吾士无?财,非恶货也;无?命,非恶寿也。令发之日,士卒坐者涕沾襟,偃卧者涕交颐,投之无所往,诸、?之勇也。故善用兵者,譬如率然。率然者,常山之蛇也。击其首则尾至,击其尾则首至,击其中则首尾俱至。敢问兵可使如率然乎?曰可。夫吴人与越人相恶也,当其同舟而济而遇风,其相救也如左右手。是故方马埋轮,未足恃也;齐勇如一,政之道也;刚柔皆得,地之理也。故善用兵者,携手若使一人,不得已也。将军之事,静以幽,正以治,能愚士卒之耳目,使之无知;易其事,革其谋,使人无识;易其居,迂其途,使民不得虑。帅与之期,如登高而去其梯;帅与之深入诸侯之地,而发其机。若驱群羊,驱而往,驱而来,莫知所之。聚三军之?,投之於险,此谓将军之事也。九地之变,屈伸之力,人情之理,不可不察也。凡?客之道,深则专,浅则散。去国越境而师者,绝地也;四彻者,衢地也;入深者,重地也;入浅者,轻地也;背固前隘者,围地也;无所往者,死地也。是故散地吾将一其志,轻地吾将使之属,争地吾将趋其后,交地吾将谨其守,交地吾将固其结,衢地吾将谨其恃,重地吾将继其食,泛地吾将进其途,围地吾将塞其?,死地吾将示之以不活。故兵之情:围则御,不得已则斗,过则从。是故不知诸侯之谋者,不能预交;不知山林、险阻、沮泽之形者,不能行军;不用乡导,不能得地利。四五者,一不知,非霸王之兵也。夫霸王之兵,伐大国,则其?不得聚;威加於敌,则其交不得合。是故不争天下之交,不养天下之权,信己之私,威加於敌,则其城可拔,其国可隳。施无法之赏,悬无政之令。犯三军之?,若使一人。犯之以事,勿告以言;犯之以害,勿告以利。投之亡地然后存,陷之死地然后生。夫?陷於害,然后能?胜败。故?兵之事,在顺详敌之意,并敌一向,千里杀将,是谓巧能成事。是故政举之日,夷关折符,无通其使,厉於廊庙之上,以诛其事。敌人开?,必亟入之,先其所爱,微与之期,践墨随敌,以决战事。是故始如处女,敌人开户;后如脱兔,敌不及拒。 + +火攻第十二 + +孙子曰:凡火攻有五:一曰火人,二曰火积,三曰火?,四曰火库,五曰火队。行火必有因,因必素具。发火有时,起火有日。时者,天之燥也。日者,月在箕、壁、翼、?也。凡此四宿者,风起之日也。凡火攻,必因五火之变而应之:火发於内,则早应之於外;火发而其兵静者,待而勿攻,极其火力,可从而从之,不可从则上。火可发於外,无待於内,以时发之,火发上风,无攻下风,昼风久,夜风止。凡军必知五火之变,以数守之。故以火佐攻者明,以水佐攻者强。水可以绝,不可以夺。夫战胜攻取而不惰其功者凶,命曰“费留”。故曰:明主虑之,良将惰之,非利不动,非得不用,非危不战。主不可以怒而兴师,将不可以?而攻战。合於利而动,不合於利而上。怒可以复喜,?可以复说,亡国不可以复存,死者不可以复生。故明主慎之,良将警之。此安国全军之道也。 + +用间第十三 + +孙子曰: 凡兴师十万,出征千里,百姓之费,公家之奉,日费千金,内外骚动,怠於道路,不得操事者,七十万家。相守数年,以争一日之胜,而爱爵禄百金,不知敌之情者,不仁之至也,非民之将也,非主之佐也,非胜之主也。故明君贤将所以动而胜人,成功出於?者,先知也。先知者,不可取於鬼神,不可象於事,不可验於度,必取於人,知敌之情者也。故用间有五:有因间,有内间,有反间,有死间,有生间。五间俱起,莫知其道,是谓神纪,人君之宝也。乡间者,因其乡人而用之;内间者,因其官人而用之;反间者,因其敌间而用之;死间者,??事於外,令吾闻知之而传於敌间也;生间者,反报也。故三军之事,莫亲於间,赏莫厚於间,事莫密於间,非圣贤不能用间,非仁义不能使间,非微妙不能得间之实。微哉微哉!无所不用间也。间事未发而先闻者,间与所告者兼死。凡军之所欲击,城之所欲攻,人之所欲杀,必先知其守将、左右、?者、门者、舍人之姓名,令吾间必索知之。敌间之来间我者,因而利之,导而舍之,故反间可得而用也;因是而知之,故乡间、内间可得而使也;因是而知之,故死间??事,可使告敌;因是而知之,故生间可使如期。五间之事,主必知之,知之必在於反间,故反间不可不厚也。昔殷之兴也,伊挚在夏;周之兴也,吕牙在殷。故明君贤将,能以上智?间者,必成大功。此兵之要,三军之所恃而动也。 diff --git a/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-simplified-gbk.txt b/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-simplified-gbk.txt new file mode 100644 index 0000000000..ef38e4b647 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-simplified-gbk.txt @@ -0,0 +1,107 @@ +This file was derived from +http://www.gutenberg.org/files/23864/23864-0.txt +after converting from Traditional Chinese to Simplified Chinese. +-------- +ʼƵһ + +Իߣ֮£֮أ֮ɲҲ + +ʾ֮£У֮Լƣ飺һԻԻ죬ԻأԻԻ + +ߣͬ⣬֮֮ηΣҲߣʱҲߣԶסҲߣǡšʡ¡ҲߣơٵҲߣĪţ֪֮ʤ֪߲ʤ + +У֮Լƣ飬ԻеܣãУǿʿͷԴ֪ʤӡ + +ƣ֮ʤ֮ƣ֮ذܣȥ֮ + +˞֮ƣ⡣ߣȨҲ + +ߣҲܶʾ֮ܣöʾ֮ãʾ֮ԶԶʾ֮֮Ҷȡ֮ʵ֮ǿ֮ŭ֮֮֮׶֮ޱ䲻⡣˱֮ʤȴҲ + +δսʤߣҲδս㲻ʤߣҲʤ㲻ʤԴ˹֮ʤӡ + +սڶ + +Իñ֮۳ǧ񆣬ﳵǧˣʮǧ֮ѣ֮ã֮ģ֮շǧȻʮ֮ʦӡ + +սҲʤ۱񣬹ñʦò㡣۱׶ߣӡʱ׾٣δ֮Ҳöߣδ֮Ҳʲ֪ñ֮ߣܾ֪ñ֮Ҳ + +ñߣ۲ټأȡ춹춵УʾʳҲ֮ƶʦԶ䣬Զƶʦ߹սߣƽۡƚԭ춼ң֮ѣʮȥߣ֮ѣƾʸꪘJìţ󳵣ʮȥ + +ǽʳ춵УʳһӣʮӣݽһʯʮʯɱߣŭҲȡ֮ߣҲʳսóʮϣȵߣ졣Ӷ֮ƶ֮νʤжǿ + +ʱʤá֪֮֮˾ҰΣ֮Ҳ + +ı + +Իñ֮ȫϣƹ֮ȫϣƾ֮ȫÞϣô֮ȫϣ֮ȫϣ֮ǹʰսʤ֮Ҳս֮֮Ҳ + +ϱıηη¹ǡ֮鲻ѡޙMݜе¶ɣ鞣¶ѡʤޣϸ֮ɱʿ֮һDzߣ˹֮Ҳ + +ñߣ֮սҲ֮ǶǹҲ֮ǾҲȫ£ʱٶȫı֮Ҳ + +ñ֮ʮΧ֮֮֮սܱ֮֮֮С֮ᣬ֮Ҳ + +ߣ֮Ҳǿ϶ʾ֮Ի춾֪֮Խν֪֮֮˶ν֮ˣν֪֮£֮ͬʿӣ֪֮Ȩ֮ͬΣʿӡȻɣ֮ӡνҾʤ + +֪ʤ壺֪ս벻սߣʤʶ֮ߣʤͬߣʤݴߣʤܶߣʤߣ֪ʤ֮Ҳ + +Ի֪֪ˣսO֪˶֪һʤһ֪˲֪ÿսذܡ + +ε + +Ի֮սߣȞ鲻ʤԴ֮ʤʤڼʤڵСսߣܞ鲻ʤʹбؿʤԻʤ֪ɞ顣 + +ʤߣҲʤߣҲ㣬Nߣ춾ŵ֮£ƹߣ춾֮ϣԱȫʤҲ + +ʤ֪֮֮ҲսʤԻƣ֮Ҳʾ²Ŀ϶֮սߣʤʤҲս֮ʤҲ¹սʤ߯߯ߣʤʤѰҲսߣ춲֮أʧ֮Ҳǹʤʤսܱսʤñߣ޵ܞʤ֮ + +һԻȣԻԻԻƣԻʤȣƣʤʤ愳㏣ܱ㏳愡ʤ֮սˮǧ֮GߣҲ + +Ƶ + +ԻαιѣҲ綷ѣҲ֮ʹܵжްߣҲ֮ӣԴVͶߣʵҲ + +սߣϣʤƳߣأ罭նʼҲʱҲ壬֮䣬ʤҲɫ壬ɫ֮䣬ʤҲζ壬ζ֮䣬ʤҲսƣ֮䣬ʤҲѭ֮޶ˣ֮գ + +ˮ֮ƯʯߣҲv֮춻ߣҲǹսߣգڶ̡󣬽緢 + +׷׼ҶҲ磬ԲɰҲΣ£ǿңҲӣҲǿҲƶߣ֮бش֮֮бȡ֮֮֮ + +սߣ֮ƣˣ˶ơߣսҲתľʯľʯ֮ԣ򾲣Σ򶯣ֹԲСս֮ƣתԲʯǧ֮ɽߣҲ + +ʵ + +Իȴսضսضս͡ + +սߣ˶ˡʹߣ֮Ҳʹ˲ߣ֮Ҳʵܼ֮֮֮ܶ⡣ǧߣ֮ҲȡߣҲضعߣҲ + +ƹߣв֪أߣв֪΢΢Σܞ֮˾ߣҲ˶׷ߣٶɼҲսòսߣؾҲҲս仭ض֮вսߣ֮Ҳ˶Σרз֡רһз֞ʮʮһҲұйѣԱߣ֮սԼӡս֮ز֪֪߶࣬߶࣬ս߹ӡʱǰѣǰѣҹѣѣѡߣҲߣʹ˱Ҳ֪ս֮أ֪ս֮գǧս֪ս֮أ֪սգܾңҲܾǰܾȺ󣬺ܾǰԶʮ֮Խ֮࣬ʤգԻʤɞҲ䱊ʹ޶ʲ֪֮ʧ֮ƣ֪֪֮֮֮֮أ֪֮N֮α֮Ρ䲻߲ܿıζʤ춱֪˽֪ʤ֮ΣĪ֪ʤ֮ΡսʤͣӦˮˮ֮бܸ߶£֮αʵ飻ˮضжʤʱ޳ƣˮ޳Ρб仯ȡʤߣν֮񡣹޳ʤʱ޳λж̳ + + + +Ի ñ֮춾Ͼ۱ͶᣬĪ춾֮ߣ؞ֱԻ;֮˷ֱ֪֮ҲΣپ򲻼ίwؾ衣ǹʒԼ׶ҹУeȣƣߺ䷨ʮһʮϽ䷨ʮ֮ǹʾwʳίʲ֪֮ıߣԥ֪ɽ֡衢֮ߣо絼ߣܵõʱթԷֺ͞Ҳ伲磬֣𣬲ɽֱ֪طȨֱ֪֮ʤ˾֮ҲԻԲţʞ֮ģӲʞ֮졣ߣһ֮ĿҲרһ߲ö߲öˣñ֮Ҳҹսģս죬Ա֮ĿҲɶɶġǹʳ裬ĺ顣ñߣ飬ҲδңԾҲԽԶͣԱҲ֮죬޻֮£αҲñ֮򣬱棬ӣ𹥣ʳʦΧʦIȣñ֮Ҳ + +űڰ + +Ի ñ֮춾ϾۺϡᣬغϽΧıս;ɣܡʽͨ춾ű֮ߣ֪ñӣͨű֪֮Σܵõ֮ӣα֪ű֪֮֮ܵӡǹ֮ǣҲ춺ɽҲǹԺҵñ֮䲻Դ֮䲻ɹҲʽΣɱ²ٿ꣬裬ɷߣ֮Ҳñ֮ҲɱΣɲҲ + +оھ + +ԻУɽYߣս¡޵ǣ˴ɽ֮ҲˮԶˮ;ˮӭ֮ˮڣɶ֮սߣ޸ˮӭͣߣӭˮ˴ˮ֮ҲΨؽȥ춳֮Уˮݶ˴֮Ҳƽ½ףұߣǰ˴ƽ½֮Ҳľ֮Ƶ֮ʤĵҲø߶£ʵްټνʤ̷شұ֮˱֮֮Ҳˮߣ䶨Ҳо쾮Ρޡݡ϶ؽȥ֮ҲԶ֮н֮ӭ֮б֮衢꾮硢С֡[Cߣؽ֮˷֮ҲнߣҲԶսߣ֮ҲߣҲߣҲݶߣҲߣҲ޺ߣҲ߶ߣҲߣͽҲɢߣԒҲٶߣӪҲDZߣҲǿߣҲᳵȳߣҲԼߣıҲ߶±ߣҲߣҲȶߣҲߣҲߣҲߣҲҹߣҲߣҲ춯ߣҲŭߣҲɱʳߣҲIߣҲ׻׻⣬ߣʧҲߣҲߣҲȱη䱊ߣ֮ҲίлߣϢҲŭӭöϣֲȥؽ֮ǹҲΩԲϵȡ˶ѡΩǶ׵ߣˡδ׶֮򲻷á׸У򲻿áʺ֮ģ֮䣬νȡԽزԽ񲻷ߣ뱊Ҳ + +εʮ + +ԻͨߡВߡ֧ߡаߡߡԶߡҿ˿ԻͨͨߣȾӸսԷԻ졣ߣޱʤ֮бʤԷҳ˳Ի֧֧ߣң޳Ҳȥ֮а֮ߣȾ֮ӯ֮ԴСȾ֮ӯӣӯ֮ߣȾ֮ؾӸԴУȾ֮ȥ֮ҲԶߣƾսսߣ֮Ҳ֮ΣɲҲߡгߡߡбߡߡбߡߣ֣֮֮ҲƾһʮԻߣǿԻۣǿԻݣŭБս֪ܣԻϣ̵޳±ݺᣬԻңϵУٺϱǿѡ棬Իߣ֮Ҳ֮ΣɲҲߣ֮ҲϵʤհԶϽ֮Ҳ֪˶ս߱ʤ֪˶ս߱ذܡսʤԻսսҲսʤԻսսҲʽ˲ΨDZ֮ҲӤʿ֮Ϫ簮ӣʿ֮ʹҶΣƩӣҲ֪֮Ի֪֮ɻʤ֮Ҳ֪֮ɻ֪֮Իʤ֮Ҳ֪֮ɻ֪֮Ի֪֮սʤ֮Ҳ֪ߣԣٶԻ֪֪ʤ˲֪֪أʤ˿ȫ + +ŵصʮһ + +Իñ֮ɢأأأнأأصأзأΧأءսߣɢأ֮زߣأҵ˵ߣأҿ˿ߣ齻أ֮±ߣأ֮ضߣصأɽ֡衢󣬷֮ߣ鷺أ߰ӹأ˹ѿԻ֮ߣΧأս棬սߣءǹɢսֹ޹޾ϽصӣУΧıս֮ñߣʹǰ༰Ѳѣȣ²գ϶롣ֹʵб֮Իȶӡ֮٣֮ɲ֮Ҳ֮ר˲ˣҰʳͣ˱ı鲻ɲ⡣Ͷ֮Ҳɲãʿ˾ʿ򲻾壬̣У򶷡ǹ޶䣬ãԼףţȥɣ֮ʿNƣǶҲNǶҲ֮գʿմ齻ãͶ֮֮ҲñߣƩȻȻߣɽ֮ҲβββʱʹȻԻɡԽҲͬ۶ö磬Ҳ֡ǹʷ֣δҲһ֮ҲԵã֮ҲñߣЯʹһˣҲ֮£ģΣʿ֮Ŀʹ֪֮£ıʹʶӣ;ʹ񲻵ǡ˧֮ڣǸ߶ȥݣ˧֮֮أȺĪ֪֮֮Ͷ֮գν֮Ҳŵ֮䣬֮֮ɲҲ֮רdzɢȥԽʦߣҲijߣҲߣصҲdzߣҲǰߣΧҲߣҲǹɢὫһ־Ὣʹ֮Ὣ󣬽ὫأὫᣬὫѣصὫʳὫ;ΧὫIὫʾ֮Բʱ֮飺Χ򶷣ӡǹʲ֪֮ıߣԤ֪ɽ֡衢֮ߣо絼ܵõߣһ֪ǰ֮Ҳ֮䱊þۣ춵У佻úϡǹʲ֮֮Ȩż֮˽춵УǿɰΣġʩ޷֮֮ͣ֮ʹһˡ֮£ԣ֮ԺͶ֮Ȼ棬֮Ȼ춺Ȼܞʤܡʞ֮£˳֮⣬һǧɱνܳ¡ǹ֮գĹ۷ͨʹ֮ϣ¡˿Hؽ֮΢֮ڣīУԾս¡ǹʼ紦Ů˿ãвܡ + +𹥵ʮ + +Ի壺һԻˣԻԻwԻ⣬Իӡлؾߡʱաʱߣ֮ҲߣڻڡFҲߣ֮Ҳ𹥣֮Ӧ֮ڣӦ֮⣻𷢶ߣ𹥣ɴӶ֮ɴϡɷ⣬޴ڣʱ֮Ϸ磬޹·磬ãҹֹ֪֮䣬֮ԻˮǿˮԾԶᡣսʤȡ书ףԻԻ֮֮ǵòãΣսŭʦԑCսϡŭԸϲCԸ˵Ը棬߲Ը֮֮˰ȫ֮Ҳ + +üʮ + +Ի ʦʮ򣬳ǧ֮ѣ֮շǧɧ춵·òߣʮҡ꣬һ֮ʤ»ٽ𣬲֪֮ߣ֮Ҳ֮Ҳ֮Ҳʤ֮ҲͽԶʤˣɹ춱ߣ֪Ҳ֪ߣȡ춹񣬲£춶ȣȡˣ֪֮Ҳü壺䣬ڼ䣬з䣬䣬䡣Ī֪νͣ˾֮Ҳߣ˶֮ڼߣ˶֮ߣм֮ߣN⣬֪֮춵мҲߣҲ֮£Ī춼䣬Ī춼䣬Ī춼䣬ʥͲü䣬岻ʹ䣬΢ܵü֮ʵ΢΢գüҲδߣ߼֮֮֮ɱ֪ؽҡ]ߡߡ֪֮֮м֮ߣ֮֮ʷɵöҲǶ֪֮䡢ڼɵöʹҲǶ֪֮N£ʹУǶ֪֮ʹڡ֮£֪֪֮֮춷䣬ʷ䲻ɲҲ֮Ҳֿģ֮Ҳ󡣹ͽǞߣسɴ󹦡˱֮Ҫ֮ѶҲ diff --git a/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-simplified-utf-8.txt b/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-simplified-utf-8.txt new file mode 100644 index 0000000000..375e1adb1c --- /dev/null +++ b/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-simplified-utf-8.txt @@ -0,0 +1,107 @@ +This file was derived from +http://www.gutenberg.org/files/23864/23864-0.txt +after converting from Traditional Chinese to Simplified Chinese. +-------- +始计第一 + +孙子曰:兵者,国之大事,死生之地,存亡之道,不可不察也。 + +故经之以五事,校之以计,而索其情:一曰道,二曰天,三曰地,四曰将,五曰法。 + +道者,令民与上同意,可与之死,可与之生,而不畏危也;天者,阴阳、寒暑、时制也;地者,远近、险易、广狭、死生也;将者,智、信、仁、勇、严也;法者,曲制、官道、主用也。凡此五者,将莫不闻,知之者胜,不知者不胜。 + +故校之以计,而索其情,曰:主孰有道?将孰有能?天地孰得?法令孰行?兵眾孰强?士卒孰练?赏罚孰明?吾以此知胜负矣。 + +将听吾计,用之必胜,留之;将不听吾计,用之必败,去之。 + +计利以听,乃為之势,以佐其外。势者,因利而制权也。 + +兵者,诡道也。故能而示之不能,用而示之不用,近而示之远,远而示之近。利而诱之,乱而取之,实而备之,强而避之,怒而挠之,卑而骄之,佚而劳之,亲而离之,攻其无备,出其不意。此兵家之胜,不可先传也。 + +夫未战而庙算胜者,得算多也;未战而庙算不胜者,得算少也。多算胜,少算不胜,而况无算乎!吾以此观之,胜负见矣。 + +作战第二 + +孙子曰:凡用兵之法,驰车千駟,革车千乘,带甲十万,千里馈粮。则内外之费,宾客之用,胶漆之材,车甲之奉,日费千金,然后十万之师举矣。 + +其用战也,贵胜,久则钝兵挫锐,攻城则力屈,久暴师则国用不足。夫钝兵挫锐,屈力殫货,则诸侯乘其弊而起,虽有智者,不能善其后矣。故兵闻拙速,未睹巧之久也。夫兵久而国利者,未之有也。故不尽知用兵之害者,则不能尽知用兵之利也。 + +善用兵者,役不再籍,粮不三载,取用於国,因粮於敌,故军食可足也。国之贫於师者远输,远输则百姓贫;近於师者贵卖,贵卖则百姓竭,财竭则急於丘役。力屈财殫,中原内虚於家,百姓之费,十去其七;公家之费,破军罢马,甲胄矢弩,戟楯矛櫓,丘牛大车,十去其六。 + +故智将务食於敌,食敌一钟,当吾二十钟;萁秆一石,当吾二十石。故杀敌者,怒也;取敌之利者,货也。故车战,得车十乘以上,赏其先得者,而更其旌旗。车杂而乘之,卒善而养之,是谓胜敌而益强。 + +故兵贵胜,不贵久。故知兵之将,民之司命。国家安危之主也。 + +谋攻第三 + +孙子曰:凡用兵之法,全国為上,破国次之;全军為上,破军次之;全旅為上,破旅次之;全卒為上,破卒次之;全伍為上,破伍次之。是故百战百胜,非善之善者也;不战而屈人之兵,善之善者也。 + +故上兵伐谋,其次伐交,其次伐兵,其下攻城。攻城之法,為不得已。修櫓轒轀,具器械,三月而后成;距闉,又三月而后已。将不胜其忿,而蚁附之,杀士三分之一,而城不拔者,此攻之灾也。 + +故善用兵者,屈人之兵,而非战也,拔人之城而非攻也,毁人之国而非久也,必以全争於天下,故兵不顿而利可全,此谋攻之法也。 + +故用兵之法,十则围之,五则攻之,倍则分之,敌则能战之,少则能逃之,不若则能避之。故小敌之坚,大敌之擒也。 + +夫将者,国之辅也。辅周则国必强,辅隙则国必弱。故君之所以患於军者三:不知军之不可以进而谓之进,不知军之不可以退而谓之退,是谓縻军;不知三军之事,而同三军之政,则军士惑矣;不知三军之权,而同三军之任,则军士疑矣。三军既惑且疑,则诸侯之难至矣。是谓乱军引胜。 + +故知胜有五:知可以战与不可以战者,胜。识眾寡之用者,胜。上下同欲者,胜。以虞待不虞者,胜。将能而君不御者,胜。此五者,知胜之道也。 + +故曰:知己知彼,百战不貽;不知彼而知己,一胜一负;不知彼不知己,每战必败。 + +军形第四 + +孙子曰:昔之善战者,先為不可胜,以待敌之可胜。不可胜在己,可胜在敌。故善战者,能為不可胜,不能使敌必可胜。故曰:胜可知,而不可為。 + +不可胜者,守也;可胜者,攻也。守则不足,攻则有餘。善守者,藏於九地之下,善攻者,动於九天之上,故能自保而全胜也。 + +见胜不过眾人之所知,非善之善者也;战胜而天下曰善,非善之善者也。故举秋毫不為多力,见日月不為明目,闻雷霆不為聪耳。古之善战者,胜於易胜者也。故善战者之胜也,无智名,无勇功,故其战胜不忒。不忒者,其所措必胜,胜已败者也。故善战者,先立於不败之地,而不失敌之败也。是故胜兵先胜,而后求战,败兵先战而后求胜。善用兵者,修道而保法,故能為胜败之政。 + +兵法:一曰度,二曰量,三曰数,四曰称,五曰胜。地生度,度生量,量生数,数生称,称生胜。故胜兵若以鎰称銖,败兵若以銖称鎰。胜者之战,若决积水於千仞之谿者,形也。 + +兵势第五 + +孙子曰:凡治眾如治寡,分数是也;斗眾如斗寡,形名是也;三军之眾,可使必受敌而无败者,奇正是也;兵之所加,如以碫投卵者,虚实是也。 + +凡战者,以正合,以奇胜。故善出奇者,无穷如天地,不竭如江海。终而复始,日月是也。死而復生,四时是也。声不过五,五声之变,不可胜听也;色不过五,五色之变,不可胜观也;味不过五,五味之变,不可胜尝也;战势,不过奇正,奇正之变,不可胜穷也。奇正相生,如循环之无端,熟能穷之哉? + +激水之疾,至於漂石者,势也;鷙鸟之疾,至於毁折者,节也。是故善战者,其势险,其节短。势如张弩,节如发机。 + +纷纷紜紜,斗乱而不可乱也;浑浑沌沌,形圆而不可败也。乱生於治,怯生於勇,弱生於强。治乱,数也;勇怯,势也;强弱,形也。故善动敌者,形之,敌必从之;予之,敌必取之。以利动之,以卒待之。 + +故善战者,求之於势,不责於人;故能择人而任势。任势者,其战人也,如转木石。木石之性,安则静,危则动,方则止,圆则行。故善战人之势,如转圆石於千仞之山者,势也。 + +虚实第六 + +孙子曰:凡先处战地而待敌者佚,后处战地而趋战者劳。 + +故善战者,致人而不致於人。能使敌人自至者,利之也;能使敌人不得至者,害之也。故敌佚能劳之,饱能饥之,安能动之。出其所必趋,趋其所不意。行千里而不劳者,行於无人之地也;攻而必取者,攻其所不守也。守而必固者,守其所不攻也。 + +故善攻者,敌不知其所守;善守者,敌不知其所攻。微乎微乎,至於无形;神乎神乎,至於无声,故能為敌之司命。进而不可御者,冲其虚也;退而不可追者,速而不可及也。故我欲战,敌虽高垒深沟,不得不与我战者,攻其所必救也;我不欲战,虽画地而守之,敌不得与我战者,乖其所之也。故形人而我无形,则我专而敌分。我专為一,敌分為十,是以十攻其一也。则我眾敌寡,能以眾击寡者,则吾之所与战者约矣。吾所与战之地不可知,不可知则敌所备者多,敌所备者多,则吾所与战者寡矣。故备前则后寡,备后则前寡,备左则右寡,备右则左寡,无所不备,则无所不寡。寡者,备人者也;眾者,使人备己者也。故知战之地,知战之日,则可千里而会战;不知战之地,不知战日,则左不能救右,右不能救左,前不能救后,后不能救前,而况远者数十里,近者数里乎!以吾度之,越人之兵虽多,亦奚益於胜哉!故曰:胜可為也。敌虽眾,可使无斗。故策之而知得失之计,候之而知动静之理,形之而知死生之地,角之而知有餘不足之处。故形兵之极,至於无形。无形则深间不能窥,智者不能谋。因形而措胜於眾,眾不能知。人皆知我所以胜之形,而莫知吾所以制胜之形。故其战胜不復,而应形於无穷。夫兵形象水,水之行避高而趋下,兵之形避实而击虚;水因地而制流,兵因敌而制胜。故兵无常势,水无常形。能因敌变化而取胜者,谓之神。故五行无常胜,四时无常位,日有短长,月有死生。 + +军争第七 + +孙子曰: 凡用兵之法,将受命於君,合军聚眾,交和而舍,莫难於军争。军争之难者,以迂為直,以患為利。故迂其途,而诱之以利,后人发,先人至,此知迂直之计者也。军争為利,军争為危。举军而争利则不及,委军而争利则輜重捐。是故捲甲而趋,日夜不处,倍道兼行,百裡而争利,则擒三将军,劲者先,疲者后,其法十一而至;五十里而争利,则蹶上将军,其法半至;三十里而争利,则三分之二至。是故军无輜重则亡,无粮食则亡,无委积则亡。故不知诸侯之谋者,不能豫交;不知山林、险阻、沮泽之形者,不能行军;不用乡导者,不能得地利。故兵以诈立,以利动,以分和為变者也。故其疾如风,其徐如林,侵掠如火,不动如山,难知如阴,动如雷震。掠乡分眾,廓地分利,悬权而动。先知迂直之计者胜,此军争之法也。《军政》曰:“言不相闻,故為之金鼓;视不相见,故為之旌旗。”夫金鼓旌旗者,所以一民之耳目也。民既专一,则勇者不得独进,怯者不得独退,此用眾之法也。故夜战多金鼓,昼战多旌旗,所以变人之耳目也。三军可夺气,将军可夺心。是故朝气锐,昼气惰,暮气归。善用兵者,避其锐气,击其惰归,此治气者也。以治待乱,以静待哗,此治心者也。以近待远,以佚待劳,以饱待饥,此治力者也。无邀正正之旗,无击堂堂之陈,此治变者也。故用兵之法,高陵勿向,背丘勿逆,佯北勿从,锐卒勿攻,饵兵勿食,归师勿遏,围师遗闕,穷寇勿迫,此用兵之法也。 + +九变第八 + +孙子曰: 凡用兵之法,将受命於君,合军聚合。泛地无舍,衢地合交,绝地无留,围地则谋,死地则战,途有所不由,军有所不击,城有所不攻,地有所不争,君命有所不受。故将通於九变之利者,知用兵矣;将不通九变之利,虽知地形,不能得地之利矣;治兵不知九变之术,虽知五利,不能得人之用矣。是故智者之虑,必杂於利害,杂於利而务可信也,杂於害而患可解也。是故屈诸侯者以害,役诸侯者以业,趋诸侯者以利。故用兵之法,无恃其不来,恃吾有以待之;无恃其不攻,恃吾有所不可攻也。故将有五危,必死可杀,必生可虏,忿速可侮,廉洁可辱,爱民可烦。凡此五者,将之过也,用兵之灾也。覆军杀将,必以五危,不可不察也。 + +行军第九 + +孙子曰:凡处军相敌,绝山依穀,视生处高,战隆无登,此处山之军也。绝水必远水,客绝水而来,勿迎之於水内,令半渡而击之利,欲战者,无附於水而迎客,视生处高,无迎水流,此处水上之军也。绝斥泽,唯亟去无留,若交军於斥泽之中,必依水草而背眾树,此处斥泽之军也。平陆处易,右背高,前死后生,此处平陆之军也。凡此四军之利,黄帝之所以胜四帝也。凡军好高而恶下,贵阳而贱阴,养生而处实,军无百疾,是谓必胜。丘陵堤防,必处其阳而右背之,此兵之利,地之助也。上雨水流至,欲涉者,待其定也。凡地有绝涧、天井、天牢、天罗、天陷、天隙,必亟去之,勿近也。吾远之,敌近之;吾迎之,敌背之。军旁有险阻、潢井、蒹葭、小林、蘙薈者,必谨覆索之,此伏姦之所处也。敌近而静者,恃其险也;远而挑战者,欲人之进也;其所居易者,利也;眾树动者,来也;眾草多障者,疑也;鸟起者,伏也;兽骇者,覆也;尘高而锐者,车来也;卑而广者,徒来也;散而条达者,樵採也;少而往来者,营军也;辞卑而备者,进也;辞强而进驱者,退也;轻车先出居其侧者,陈也;无约而请和者,谋也;奔走而陈兵者,期也;半进半退者,诱也;杖而立者,饥也;汲而先饮者,渴也;见利而不进者,劳也;鸟集者,虚也;夜呼者,恐也;军扰者,将不重也;旌旗动者,乱也;吏怒者,倦也;杀马肉食者,军无粮也;悬甀不返其舍者,穷寇也;谆谆翕翕,徐与人言者,失眾也;数赏者,窘也;数罚者,困也;先暴而后畏其眾者,不精之至也;来委谢者,欲休息也。兵怒而相迎,久而不合,又不相去,必谨察之。兵非贵益多也,惟无武进,足以并力料敌取人而已。夫惟无虑而易敌者,必擒於人。卒未亲而罚之,则不服,不服则难用。卒已亲附而罚不行,则不可用。故合之以文,齐之以武,是谓必取。令素行以教其民,则民服;令素不行以教其民,则民不服。令素行者,与眾相得也。 + +地形第十 + +孙子曰:地形有通者、有掛者、有支者、有隘者、有险者、有远者。我可以往,彼可以来,曰通。通形者,先居高阳,利粮道,以战则利。可以往,难以返,曰掛。掛形者,敌无备,出而胜之,敌若有备,出而不胜,难以返,不利。我出而不利,彼出而不利,曰支。支形者,敌虽利我,我无出也,引而去之,令敌半出而击之利。隘形者,我先居之,必盈之以待敌。若敌先居之,盈而勿从,不盈而从之。险形者,我先居之,必居高阳以待敌;若敌先居之,引而去之,勿从也。远形者,势均难以挑战,战而不利。凡此六者,地之道也,将之至任,不可不察也。凡兵有走者、有驰者、有陷者、有崩者、有乱者、有北者。凡此六者,非天地之灾,将之过也。夫势均,以一击十,曰走;卒强吏弱,曰驰;吏强卒弱,曰陷;大吏怒而不服,遇敌懟而自战,将不知其能,曰崩;将弱不严,教道不明,吏卒无常,陈兵纵横,曰乱;将不能料敌,以少合眾,以弱击强,兵无选锋,曰北。凡此六者,败之道也,将之至任,不可不察也。夫地形者,兵之助也。料敌制胜,计险隘远近,上将之道也。知此而用战者必胜,不知此而用战者必败。故战道必胜,主曰无战,必战可也;战道不胜,主曰必战,无战可也。故进不求名,退不避罪,唯民是保,而利於主,国之宝也。视卒如婴儿,故可以与之赴深溪;视卒如爱子,故可与之俱死。厚而不能使,爱而不能令,乱而不能治,譬若骄子,不可用也。知吾卒之可以击,而不知敌之不可击,胜之半也;知敌之可击,而不知吾卒之不可以击,胜之半也;知敌之可击,知吾卒之可以击,而不知地形之不可以战,胜之半也。故知兵者,动而不迷,举而不穷。故曰:知彼知己,胜乃不殆;知天知地,胜乃可全。 + +九地第十一 + +孙子曰:用兵之法,有散地,有轻地,有争地,有交地,有衢地,有重地,有泛地,有围地,有死地。诸侯自战其地者,為散地;入人之地不深者,為轻地;我得亦利,彼得亦利者,為争地;我可以往,彼可以来者,為交地;诸侯之地三属,先至而得天下眾者,為衢地;入人之地深,背城邑多者,為重地;山林、险阻、沮泽,凡难行之道者,為泛地;所由入者隘,所从归者迂,彼寡可以击吾之眾者,為围地;疾战则存,不疾战则亡者,為死地。是故散地则无战,轻地则无止,争地则无攻,交地则无绝,衢地则合交,重地则掠,泛地则行,围地则谋,死地则战。古之善用兵者,能使敌人前后不相及,眾寡不相恃,贵贱不相救,上下不相收,卒离而不集,兵合而不齐。合於利而动,不合於利而止。敢问敌眾而整将来,待之若何曰:先夺其所爱则听矣。兵之情主速,乘人之不及。由不虞之道,攻其所不戒也。凡為客之道,深入则专。主人不克,掠於饶野,三军足食。谨养而勿劳,并气积力,运兵计谋,為不可测。投之无所往,死且不北。死焉不得,士人尽力。兵士甚陷则不惧,无所往则固,深入则拘,不得已则斗。是故其兵不修而戒,不求而得,不约而亲,不令而信,禁祥去疑,至死无所之。吾士无餘财,非恶货也;无餘命,非恶寿也。令发之日,士卒坐者涕沾襟,偃卧者涕交颐,投之无所往,诸、劌之勇也。故善用兵者,譬如率然。率然者,常山之蛇也。击其首则尾至,击其尾则首至,击其中则首尾俱至。敢问兵可使如率然乎?曰可。夫吴人与越人相恶也,当其同舟而济而遇风,其相救也如左右手。是故方马埋轮,未足恃也;齐勇如一,政之道也;刚柔皆得,地之理也。故善用兵者,携手若使一人,不得已也。将军之事,静以幽,正以治,能愚士卒之耳目,使之无知;易其事,革其谋,使人无识;易其居,迂其途,使民不得虑。帅与之期,如登高而去其梯;帅与之深入诸侯之地,而发其机。若驱群羊,驱而往,驱而来,莫知所之。聚三军之眾,投之於险,此谓将军之事也。九地之变,屈伸之力,人情之理,不可不察也。凡為客之道,深则专,浅则散。去国越境而师者,绝地也;四彻者,衢地也;入深者,重地也;入浅者,轻地也;背固前隘者,围地也;无所往者,死地也。是故散地吾将一其志,轻地吾将使之属,争地吾将趋其后,交地吾将谨其守,交地吾将固其结,衢地吾将谨其恃,重地吾将继其食,泛地吾将进其途,围地吾将塞其闕,死地吾将示之以不活。故兵之情:围则御,不得已则斗,过则从。是故不知诸侯之谋者,不能预交;不知山林、险阻、沮泽之形者,不能行军;不用乡导,不能得地利。四五者,一不知,非霸王之兵也。夫霸王之兵,伐大国,则其眾不得聚;威加於敌,则其交不得合。是故不争天下之交,不养天下之权,信己之私,威加於敌,则其城可拔,其国可隳。施无法之赏,悬无政之令。犯三军之眾,若使一人。犯之以事,勿告以言;犯之以害,勿告以利。投之亡地然后存,陷之死地然后生。夫眾陷於害,然后能為胜败。故為兵之事,在顺详敌之意,并敌一向,千里杀将,是谓巧能成事。是故政举之日,夷关折符,无通其使,厉於廊庙之上,以诛其事。敌人开闔,必亟入之,先其所爱,微与之期,践墨随敌,以决战事。是故始如处女,敌人开户;后如脱兔,敌不及拒。 + +火攻第十二 + +孙子曰:凡火攻有五:一曰火人,二曰火积,三曰火輜,四曰火库,五曰火队。行火必有因,因必素具。发火有时,起火有日。时者,天之燥也。日者,月在箕、壁、翼、軫也。凡此四宿者,风起之日也。凡火攻,必因五火之变而应之:火发於内,则早应之於外;火发而其兵静者,待而勿攻,极其火力,可从而从之,不可从则上。火可发於外,无待於内,以时发之,火发上风,无攻下风,昼风久,夜风止。凡军必知五火之变,以数守之。故以火佐攻者明,以水佐攻者强。水可以绝,不可以夺。夫战胜攻取而不惰其功者凶,命曰“费留”。故曰:明主虑之,良将惰之,非利不动,非得不用,非危不战。主不可以怒而兴师,将不可以慍而攻战。合於利而动,不合於利而上。怒可以复喜,慍可以复说,亡国不可以复存,死者不可以复生。故明主慎之,良将警之。此安国全军之道也。 + +用间第十三 + +孙子曰: 凡兴师十万,出征千里,百姓之费,公家之奉,日费千金,内外骚动,怠於道路,不得操事者,七十万家。相守数年,以争一日之胜,而爱爵禄百金,不知敌之情者,不仁之至也,非民之将也,非主之佐也,非胜之主也。故明君贤将所以动而胜人,成功出於眾者,先知也。先知者,不可取於鬼神,不可象於事,不可验於度,必取於人,知敌之情者也。故用间有五:有因间,有内间,有反间,有死间,有生间。五间俱起,莫知其道,是谓神纪,人君之宝也。乡间者,因其乡人而用之;内间者,因其官人而用之;反间者,因其敌间而用之;死间者,為誑事於外,令吾闻知之而传於敌间也;生间者,反报也。故三军之事,莫亲於间,赏莫厚於间,事莫密於间,非圣贤不能用间,非仁义不能使间,非微妙不能得间之实。微哉微哉!无所不用间也。间事未发而先闻者,间与所告者兼死。凡军之所欲击,城之所欲攻,人之所欲杀,必先知其守将、左右、謁者、门者、舍人之姓名,令吾间必索知之。敌间之来间我者,因而利之,导而舍之,故反间可得而用也;因是而知之,故乡间、内间可得而使也;因是而知之,故死间為誑事,可使告敌;因是而知之,故生间可使如期。五间之事,主必知之,知之必在於反间,故反间不可不厚也。昔殷之兴也,伊挚在夏;周之兴也,吕牙在殷。故明君贤将,能以上智為间者,必成大功。此兵之要,三军之所恃而动也。 diff --git a/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-traditional-big5.txt b/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-traditional-big5.txt new file mode 100644 index 0000000000..1918c8fa9c --- /dev/null +++ b/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-traditional-big5.txt @@ -0,0 +1,106 @@ +This file was derived from +http://www.gutenberg.org/files/23864/23864-0.txt +-------- +lpĤ@ + +]lGL̡AꤧjơAͤaAs`DAi]C + +GgHơAդHpAӯ䱡G@DAGѡATaA|NAkC + +D̡AOPWPNAiPAiP͡AӤȦM]FѪ̡ABHBɨ]Fa̡ABIBsUBͤ]FN̡ABHBBiBY]Fk̡ABxDBDΤ]CZ̡ANDA̳ӡA̤ӡC + +GդHpAӯ䱡AGDEDHNEHѦaEoHkOEHLEjHhEmH@EH^HӭtoC + +Nť^pAΤӡAdFNť^pAΤѡAhC + +pQHťADաAH~Cժ̡A]QӨv]C + +L̡A޹D]CGӥܤAΦӥܤΡAӥܤAӥܤCQӻAæӨAӳƤAjפAӼAźAHӳҤA˦ALơAX䤣NCLaӡAiǤ]C + +ҥԦӼqӪ̡Aoh]FԦӼq⤣Ӫ̡Ao֤]ChӡAֺ⤣ӡAӪpLGI^H[AӭtoC + +@ԲĤG + +]lGZΧLkAdoAdAaҤQUAdX³Ch~OAȤΡAAҤ^AOdAMQUv|oC + +ξԤ]AQӡA[hwLUA𫰫hO}A[ɮvhΤCҶwLUA}OfAhѫJӰ_A̡AൽoCGLDtA@[]CҧL[ӰQ̡A]CGɪΧL`̡AhɪΧLQ]C + +ΧL̡AФAyA³TAΩA]³ġAGxi]Cꤧhv̻AhʩmhFv̶QAQhʩmܡA]ܫhCСCO}]A줺aAʩmOAQhCFaOA}x}AҭHکAurACjAQh䤻C + +GNȭġAĤ@A^GQFmz@ۡA^GQۡCGĪ̡A]FĤQ̡Af]CGԡAoQHWAo̡AӧܺXCӭA򵽦ӾiAO׳ӼĦӯqjC + +GLQӡAQ[CGLNAqRCawMD]C + +ѧĤT + +]lGZΧLkAꬰWA}ꦸFxWA}xFȬWA}ȦF򬰤WA}򦸤FWA}COGʾԦʳӡAD̤]FԦө}HLA̤]C + +GWLѡA䦸A䦸LAU𫰡C𫰤kAowCrVA㾹ATӫᦨFZASTӫwCNӨAƪAhT@Aӫު̡A𤧨a]C + +GΧL̡A}HLAӫDԤ]AޤHӫD]AHӫD[]AHѤUAGLyӧQiAѧ𤧪k]C + +GΧLkAQh򤧡Ah𤧡AhAīhԤA֫hkAYhפCGpĤAjĤ]C + +ұN̡Aꤧ]CPhꥲjAثhꥲzCGgҥHwx̤TGxiHiӿפiAxiHhӿפhAOݭxFTxơAӦPTxFAhxhboFTxvAӦPTxAhxhèoCTxJbBáAhѫJܨoCO׶íx޳ӡC + +GӦGiHԻPiHԪ̡AӡCѲ褧Ϊ̡AӡCWUP̡AӡCHݤ̡AӡCNӧgs̡AӡC̡AӤD]C + +GGvAʾԤMFӪvA@Ӥ@tFvACԥѡC + +xβĥ| + +]lGԪ̡AiӡAHݼĤiӡCiӦbvAiӦbġCGԪ̡AରiӡAϼĥiӡCGGӥiAӤiC + +iӪ̡Au]FiӪ̡A]CuhAhlCu̡AéEaUA̡AʩEѤWAG۫OӥӤ]C + +ӤLHҪAD̤]FԳӦӤѤU굽AD̤]CG|@hOA뤣ءADp^oաCjԪ̡AөӪ̤]CGԪ̤Ӥ]ALWALi\AGԳӤ֡C̡֪AұӡAӤwѪ̤]CGԪ̡Aߩ󤣱ѤaAӤĤѤ]COGӧLӡAӫDԡAѧLԦӫDӡCΧL̡A׹DӫOkAGରӱѤFC + +LkG@סAGqATơA|١AӡCaͫסAץͶqAqͼơAƥͺ١A٥ͳӡCGӧLYHٻˡAѧLYH˺CӪ̤ԡAYMndQƪ̡AΤ]C + +LղĤ + +]lGZvpvAƬO]FpAΦWO]FTxAiϥĦӵLѪ̡A_O]FLҥ[ApHZ̡AO]C + +ZԪ̡AHXAH_ӡCGX_̡ALapѦaAܦpCצӽƩlAO]CӴ_͡A|ɬO]CnLAnܡAiť]F⤣LA⤧ܡAi[]FLAܡAiӹ]FԶաAL_A_ܡAiӽa]C_ۥ͡Ap`LݡAavH + +EeAܩ}̡۪Aդ]FeAܩ󷴧̡A`]COGԪ̡AIA`uCզpiA`poC + +ɯɯƯơAæӤiä]FPPAζӤiѤ]CåͩvAĥͩiAzͩjCváAƤ]FiġAդ]FjzAΤ]CGʼĪ̡AΤAĥqFAĥCHQʤAHݤC + +GԪ̡ADաAdHFGܤHӥաCժ̡AԤH]ApۡCۤʡAwhRAMhʡAhAhCGԤHաAp۩dQs̡Aդ]C + +Ĥ + +]lGZBԦaӫݼĪ̧HABԦa;Ԫ̳ҡC + +GԪ̡APHӤPHCϼĤHۦܪ̡AQ]FϼĤHoܪ̡A`]CGħHҤAȤAwʤCXҥ͡AͨҤNCdӤҪ̡ALHa]Fӥ̡AҤu]CuӥT̡AuҤ]C + +G̡AĤҦuFu̡AĤҧCLGLGAܩLΡFGGAܩLnAGରĤqRCiӤim̡AR]FhӤil̡AtӤiΤ]CGڱԡAS`AoPھԪ̡AҥϤ]FڤԡAeaӦuAĤoPھԪ̡AĨҤ]CGΤHӧڵLΡAhڱMӼĤCڱM@AĤQAOHQ@]ChڲĹAH̡Ah^һPԪ̬oC^һPԤaiAihĩҳƪ̦hAĩҳƪ̦hAh^һPԪ̹oCGƫehAƫheAƥhkAƥkhALҤơAhLҤC̡AƤH̤]F̡AϤHƤv̤]CGԤaAԤAhidӷ|ԡFԤaAԤAhϥkAkϥAeϫAᤣϫeAӪp̼ƤQءA̼إGIH^פAVHLhAOqӫvIGGӥi]CAiϵLCGӪopAԤӪRzAΤӪͤaAӪlBCGΧLAܩLΡCLΫh`sA̤ѡC]Φӱө󲳡AાCHҪکҥHӤΡAӲ^ҥHӤΡCGԳӤ_AΩLaCҧLζHAװͤUAL׹F]aӨyAL]ĦӨӡCGLL`աAL`ΡC]ܤƦӨӪ̡AפCGL`ӡA|ɵL`A馳uA릳͡C + +xĤC + +]lG ZΧLkANRgAXxEAMӪ١AxCx̡AHAHwQCG~AӻHQAHoAHܡAp̤]CxQAxMC|xӪQhΡAexӪQhCOGҦ͡A]BADݦAʸ̦ӪQAhTNxAl̥Ah̫AkQ@ӦܡFQئӪQAhݤWNxAkbܡFTQئӪQAhTGܡCOGxLh`AL³h`ALenh`CGѫJѪ̡AݥFsLBIBqAΪ̡AxFζmɪ̡AoaQCGLHBߡAHQʡAHMܪ̤]CGepA}pLAIpAʦpsApAʦpp_CmAaQAavӰʡCp̳ӡAxk]CmxFnGۻDAGFۨAGܺXCҪܺX̡AҥH@եؤ]CJM@Ahi̤oWiAĪ̤oWhAβk]CG]ԦhA޾ԦhܺXAҥHܤHեؤ]CTxiܮANxiܤߡCOG®UAޮkAǮkCΧL̡AרUAkkAv̤]CHvݶáAHRݼMAvߪ̤]CHݻAHHݳҡAHȡAvO̤]CLܥXAL󤧳Avܪ̤]CGΧLkAŦVAICŰfA˥_űqAUŧALŭAkvŹKAvAaFŭAΧLk]C + +EܲĤK + +]lG ZΧLkANRgAXxEXCxaL١AaXAaLdAahѡAahԡA~ҤѡAxҤAҤAaҤAgRҤCGNqEܤQ̡AΧLoFNqEܤQAaΡAoaQoFvLEܤNAQAoHΨoCOG̤{AQ`AQӰȥiH]A`ӱwiѤ]COG}ѫJ̥H`AнѫJ̥H~AͽѫJ̥HQCGΧLkAL䤣ӡA^HݤFL䤣A^Ҥi]CGNMAiAͥiAtiVAGidARiСCZ̡ANL]AΧLa]CЭxNAHMAi]C + +xĤE + +]lGZBxۼġAs̽\AͳBAԶLnABsx]CAȵӨӡAŪ蠟AObQAԪ̡ALӪȡAͳBALyABWx]CAA߫EhLdAYx󥸿AA̤ӭIABAx]CBAkIAe͡ABx]CZ|xQAҤҥHӥ|Ҥ]CZxnӴcUAQӽ⳱AiͦӳBAxLʯeAOץӡCCAB䶧ӥkIALQAaU]CWByܡAA̡Aݨw]CZaBѤBѨcBùBѳBѻءAEhAŪ]C^AĪ񤧡F^蠟AĭICxǦIBCB㶸BpLBP̡AЯAҳB]CĪR̡AI]FӬDԪ̡AHi]Fҩ~̡AQ]Fʪ̡AӤ]Fh٪̡Aä]F_̡A]F~b̡AФ]FаӾU̡AӤ]FӼs̡A{Ӥ]FӱF̡AĤ]F֦өӪ̡Ax]Fӳƪ̡Ai]FjӶiX̡Ah]FX~䰼̡A]FLӽЩM̡AѤ]FbӳL̡A]Fbibh̡A]Fӥߪ̡AȤ]FVӥ̡A]FQӤi̡AҤ]F̡A]F]I̡A]FxZ̡AN]FܺXʪ̡Aä]FO̡A¤]F׭̡AxL³]Faդ٪̡AaF]FνεA}PH̡A]Fƽ̡A~]Fƻ@̡Ax]FɦӫȨ䲳̡A뤧ܤ]Fөeª̡A𮧤]CLӬ۪A[ӤXASۥhAԹCLDQqh]ALZiAHäOƼĨHӤwCұL{өĪ̡AHC򥼿˦ӻ@AhAAAhΡCw˪ӻ@AhiΡCGXHAHZAOץCOHШAhAFOHШAhACO̡AP۱o]C + +aβĤQ + +]lGaΦq̡B̡B̡Bi̡BI̡B̡CڥiHAiHӡAqCqΪ̡A~AQ³DAHԫhQCiHAHA걾CΪ̡AĵLơAXӳӤAĭYơAXӤӡAHAQCڥXӤQAXӤQACΪ̡AQڡAڵLX]AަӥhAOĥbXQCiΪ̡Aڥ~AդHݼġCYĥ~AզӤűqAզӱqCIΪ̡Aڥ~A~HݼġFYĥ~AަӥhAűq]CΪ̡AէHDԡAԦӤQCZ̡AaD]ANܥAi]CZL̡B̡B̡BY̡Bê̡B_̡CZ̡ADѦaaANL]CҶէAH@QAꨫFjOzA깣FOjzA곴FjOӤAAJȦӦ۾ԡANAYFNzYAйDAOL`ALaAáFNƼġAH֦XAHzjALLWA_CZ̡AѤD]ANܥAi]CҦaΪ̡ALU]CƼĨӡApIiAWND]CӥξԪ̥ӡAӥξԪ̥ѡCGԹDӡADLԡAԥi]FԹDӡADꥲԡALԥi]CGiDWAh׸oAߥOOAӧQDAꤧ_]CpAGiHPu`ˡFpRlAGiPѦCpӤϡARӤOAæӤvAĴYźlAiΤ]C^򤧥iHAӤĤiAӤb]FĤiAӤ^򤧤iHAӤb]FĤiA^򤧥iHAӤaΤiHԡAӤb]CGL̡AʦӤgA|ӤaCGGvAӤDpFѪaAӤDiC + +EaĤQ@ + +]lGΧLkAaAaAaAaAaAaAxaAaAaCѫJ۾Ԩa̡AaFJHa`̡AaFڱoQAoQ̡AaFڥiHAiHӪ̡AaFѫJaTݡAܦӱoѤU̡AaFJHa`AIh̡AaFsLBIBqAAZ椧D̡AxaFҥѤJ̹iAұqk̨AiH^̡AaFeԫhsAeԫh`̡AaCOGahLԡAahLAahLAahLAahXAahAxahAahѡAahԡCjΧL̡AϼĤHeᤣۤΡA褣۫AQ⤣۱ϡAWUۦAӤALXӤCXQӰʡAXQӤCݼIJӾNӡAݤYGܨҷRhťoCLDtAHΡCѤDAҤ٤]CZȤDA`JhMCDHJAdzATxCԾiӤųҡAînOABLpѡAiC뤧LҩAB_CjoAhHɤOCLhƳhߡALҩhTA`JhAowhCOGLצӧ١ADӱoAӿˡAOӫHATháAܦLҤC^hLl]ADcf]FLlRADcؤ]COoAh򧤪̮g̡Aת̮[A뤧LҩAѡB󤧫i]CGΧL̡AĴpvMCvM̡A`sD]C䭺hܡAhܡA䤤hѦܡCݧLiϦpvMGHiCҧdHPVH۴c]AP٦ӹJA۱Ϥ]pkCOG谨IA]Fip@AFD]FXұoAaz]CGΧL̡AYϤ@HAow]CNxơARHաAHvAMh򤧦եءAϤLFơAѡAϤHLѡF~A~Aϥo{CӻPApnӥhFӻP`JѫJaAӵoCYXsϡAXөAXӨӡAҤCETxA뤧IAױNxƤ]CEaܡA}OAHzAi]CZȤDA`hMALhChVҦӮv̡Aa]F|̡Aa]FJ`̡Aa]FJL̡Aa]FITei̡Aa]FLҩ̡Aa]COGa^N@ӡAa^NϤݡAa^NͨAa^NԨuAa^NT䵲Aa^NԨAa^N~䭹Axa^Ni~Aa^NAa^NܤHCGLGhmAowhALhqCOGѫJѪ̡AwFsLBIBqAΪ̡AxFζmɡAoaQC|̡A@ADQL]CQLAjAh䲳oEF¥[ġAh椣oXCOGѤUAiѤUvAHvpA¥[ġAh䫰iޡAioCILkAaLFOCǤTxAYϤ@HCǤHơAŧiHFǤH`AŧiHQC뤧`aMsAaM͡CҲ`AMରӱѡCGLơAbԼĤNAüĤ@VAdNAOץনơCOGF|AišALqϡAFYqWAHݨơCĤH}AEJAҷRALPAHġAHMԨơCOGlpBkAĤH}FpߡAĤΩڡC + +ĤQG + +]lGZ𦳤G@HAGnATA|wAC]A]CoɡA_Cɪ̡AѤ]C̡AbߡBBlBH]CZ|J̡A_]CZA]ܦGo󤺡Ah~FoӨLR̡AݦӤŧAOAiqӱqAiqhWCio~ALݩ󤺡AHɵoAoWALUAޭ[A]CZxܡAHƦuCGH̩AH̱jCiHAiHܡCҾԳӧӤk\̤ARꡧOdCGGD{A}NkADQʡADoΡADMԡCDiHӿvANiHYӧԡCXQӰʡAXQӤWCiHƳߡAYiHƻA`ꤣiHƦsA̤iHƥ͡CGDVA}NĵCwxD]C + +ζĤQT + +]lG ZvQUAXdAʩmOAa^AOdA~̰ʡADAoިƪ̡ACQUaCۦuƦ~AH@餧ӡAӷRSʪAĤ̡Aܤ]ADN]ADD]ADӤD]CGgNҥHʦӳӤHA\X󲳪̡A]C̡Ai󰭯AiHơAiסAHAĤ̤]CGζG]AA϶AAͶCѰ_ADAOׯAHg_]Cm̡A]mHӥΤF̡A]xHӥΤF϶̡A]ĶӥΤF̡AƩ~AO^DӶǩĶ]FͶ̡Aϳ]CGTxơA˩󶡡Ap󶡡AƲK󶡡ADt夣ζADq϶ADLoCLvLvILҤζ]CƥoӥD̡APҧi̭ݦCZxұAұAHұAuNBkB̡֪B̡B٤HmWAO^CĶӶڪ̡A]ӧQAɦӪ٤AG϶ioӥΤ]F]OӪAGmBioӨϤ]F]OӪAGơAiϧiġF]OӪAGͶiϦpCơADAb϶AG϶ip]C蠟]A켰bLFP]AfbCGgNAHW̡Aj\CLnATxҫӰʤ]C diff --git a/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-traditional-utf-8.txt b/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-traditional-utf-8.txt new file mode 100644 index 0000000000..5797b374aa --- /dev/null +++ b/vendor/golang.org/x/text/encoding/testdata/sunzi-bingfa-traditional-utf-8.txt @@ -0,0 +1,106 @@ +This file was derived from +http://www.gutenberg.org/files/23864/23864-0.txt +-------- +始計第一 + +孫子曰:兵者,國之大事,死生之地,存亡之道,不可不察也。 + +故經之以五事,校之以計,而索其情:一曰道,二曰天,三曰地,四曰將,五曰法。 + +道者,令民與上同意,可與之死,可與之生,而不畏危也;天者,陰陽、寒暑、時制也;地者,遠近、險易、廣狹、死生也;將者,智、信、仁、勇、嚴也;法者,曲制、官道、主用也。凡此五者,將莫不聞,知之者勝,不知者不勝。 + +故校之以計,而索其情,曰:主孰有道?將孰有能?天地孰得?法令孰行?兵眾孰強?士卒孰練?賞罰孰明?吾以此知勝負矣。 + +將聽吾計,用之必勝,留之;將不聽吾計,用之必敗,去之。 + +計利以聽,乃為之勢,以佐其外。勢者,因利而制權也。 + +兵者,詭道也。故能而示之不能,用而示之不用,近而示之遠,遠而示之近。利而誘之,亂而取之,實而備之,強而避之,怒而撓之,卑而驕之,佚而勞之,親而離之,攻其無備,出其不意。此兵家之勝,不可先傳也。 + +夫未戰而廟算勝者,得算多也;未戰而廟算不勝者,得算少也。多算勝,少算不勝,而況無算乎!吾以此觀之,勝負見矣。 + +作戰第二 + +孫子曰:凡用兵之法,馳車千駟,革車千乘,帶甲十萬,千里饋糧。則內外之費,賓客之用,膠漆之材,車甲之奉,日費千金,然後十萬之師舉矣。 + +其用戰也,貴勝,久則鈍兵挫銳,攻城則力屈,久暴師則國用不足。夫鈍兵挫銳,屈力殫貨,則諸侯乘其弊而起,雖有智者,不能善其後矣。故兵聞拙速,未睹巧之久也。夫兵久而國利者,未之有也。故不盡知用兵之害者,則不能盡知用兵之利也。 + +善用兵者,役不再籍,糧不三載,取用於國,因糧於敵,故軍食可足也。國之貧於師者遠輸,遠輸則百姓貧;近於師者貴賣,貴賣則百姓竭,財竭則急於丘役。力屈財殫,中原內虛於家,百姓之費,十去其七;公家之費,破軍罷馬,甲胄矢弩,戟楯矛櫓,丘牛大車,十去其六。 + +故智將務食於敵,食敵一鍾,當吾二十鍾;萁稈一石,當吾二十石。故殺敵者,怒也;取敵之利者,貨也。故車戰,得車十乘以上,賞其先得者,而更其旌旗。車雜而乘之,卒善而養之,是謂勝敵而益強。 + +故兵貴勝,不貴久。故知兵之將,民之司命。國家安危之主也。 + +謀攻第三 + +孫子曰:凡用兵之法,全國為上,破國次之;全軍為上,破軍次之;全旅為上,破旅次之;全卒為上,破卒次之;全伍為上,破伍次之。是故百戰百勝,非善之善者也;不戰而屈人之兵,善之善者也。 + +故上兵伐謀,其次伐交,其次伐兵,其下攻城。攻城之法,為不得已。修櫓轒轀,具器械,三月而後成;距闉,又三月而後已。將不勝其忿,而蟻附之,殺士三分之一,而城不拔者,此攻之災也。 + +故善用兵者,屈人之兵,而非戰也,拔人之城而非攻也,毀人之國而非久也,必以全爭於天下,故兵不頓而利可全,此謀攻之法也。 + +故用兵之法,十則圍之,五則攻之,倍則分之,敵則能戰之,少則能逃之,不若則能避之。故小敵之堅,大敵之擒也。 + +夫將者,國之輔也。輔周則國必強,輔隙則國必弱。故君之所以患於軍者三:不知軍之不可以進而謂之進,不知軍之不可以退而謂之退,是謂縻軍;不知三軍之事,而同三軍之政,則軍士惑矣;不知三軍之權,而同三軍之任,則軍士疑矣。三軍既惑且疑,則諸侯之難至矣。是謂亂軍引勝。 + +故知勝有五:知可以戰與不可以戰者,勝。識眾寡之用者,勝。上下同欲者,勝。以虞待不虞者,勝。將能而君不御者,勝。此五者,知勝之道也。 + +故曰:知己知彼,百戰不貽;不知彼而知己,一勝一負;不知彼不知己,每戰必敗。 + +軍形第四 + +孫子曰:昔之善戰者,先為不可勝,以待敵之可勝。不可勝在己,可勝在敵。故善戰者,能為不可勝,不能使敵必可勝。故曰:勝可知,而不可為。 + +不可勝者,守也;可勝者,攻也。守則不足,攻則有餘。善守者,藏於九地之下,善攻者,動於九天之上,故能自保而全勝也。 + +見勝不過眾人之所知,非善之善者也;戰勝而天下曰善,非善之善者也。故舉秋毫不為多力,見日月不為明目,聞雷霆不為聰耳。古之善戰者,勝於易勝者也。故善戰者之勝也,無智名,無勇功,故其戰勝不忒。不忒者,其所措必勝,勝已敗者也。故善戰者,先立於不敗之地,而不失敵之敗也。是故勝兵先勝,而後求戰,敗兵先戰而後求勝。善用兵者,修道而保法,故能為勝敗之政。 + +兵法:一曰度,二曰量,三曰數,四曰稱,五曰勝。地生度,度生量,量生數,數生稱,稱生勝。故勝兵若以鎰稱銖,敗兵若以銖稱鎰。勝者之戰,若決積水於千仞之谿者,形也。 + +兵勢第五 + +孫子曰:凡治眾如治寡,分數是也;鬥眾如鬥寡,形名是也;三軍之眾,可使必受敵而無敗者,奇正是也;兵之所加,如以碫投卵者,虛實是也。 + +凡戰者,以正合,以奇勝。故善出奇者,無窮如天地,不竭如江海。終而複始,日月是也。死而復生,四時是也。聲不過五,五聲之變,不可勝聽也;色不過五,五色之變,不可勝觀也;味不過五,五味之變,不可勝嘗也;戰勢,不過奇正,奇正之變,不可勝窮也。奇正相生,如循環之無端,熟能窮之哉? + +激水之疾,至於漂石者,勢也;鷙鳥之疾,至於毀折者,節也。是故善戰者,其勢險,其節短。勢如張弩,節如發機。 + +紛紛紜紜,鬥亂而不可亂也;渾渾沌沌,形圓而不可敗也。亂生於治,怯生於勇,弱生於強。治亂,數也;勇怯,勢也;強弱,形也。故善動敵者,形之,敵必從之;予之,敵必取之。以利動之,以卒待之。 + +故善戰者,求之於勢,不責於人;故能擇人而任勢。任勢者,其戰人也,如轉木石。木石之性,安則靜,危則動,方則止,圓則行。故善戰人之勢,如轉圓石於千仞之山者,勢也。 + +虛實第六 + +孫子曰:凡先處戰地而待敵者佚,後處戰地而趨戰者勞。 + +故善戰者,致人而不致於人。能使敵人自至者,利之也;能使敵人不得至者,害之也。故敵佚能勞之,飽能饑之,安能動之。出其所必趨,趨其所不意。行千里而不勞者,行於無人之地也;攻而必取者,攻其所不守也。守而必固者,守其所不攻也。 + +故善攻者,敵不知其所守;善守者,敵不知其所攻。微乎微乎,至於無形;神乎神乎,至於無聲,故能為敵之司命。進而不可禦者,沖其虛也;退而不可追者,速而不可及也。故我欲戰,敵雖高壘深溝,不得不與我戰者,攻其所必救也;我不欲戰,雖畫地而守之,敵不得與我戰者,乖其所之也。故形人而我無形,則我專而敵分。我專為一,敵分為十,是以十攻其一也。則我眾敵寡,能以眾擊寡者,則吾之所與戰者約矣。吾所與戰之地不可知,不可知則敵所備者多,敵所備者多,則吾所與戰者寡矣。故備前則後寡,備後則前寡,備左則右寡,備右則左寡,無所不備,則無所不寡。寡者,備人者也;眾者,使人備己者也。故知戰之地,知戰之日,則可千里而會戰;不知戰之地,不知戰日,則左不能救右,右不能救左,前不能救後,後不能救前,而況遠者數十裏,近者數裏乎!以吾度之,越人之兵雖多,亦奚益於勝哉!故曰:勝可為也。敵雖眾,可使無鬥。故策之而知得失之計,候之而知動靜之理,形之而知死生之地,角之而知有餘不足之處。故形兵之極,至於無形。無形則深間不能窺,智者不能謀。因形而措勝於眾,眾不能知。人皆知我所以勝之形,而莫知吾所以制勝之形。故其戰勝不復,而應形於無窮。夫兵形象水,水之行避高而趨下,兵之形避實而擊虛;水因地而制流,兵因敵而制勝。故兵無常勢,水無常形。能因敵變化而取勝者,謂之神。故五行無常勝,四時無常位,日有短長,月有死生。 + +軍爭第七 + +孫子曰: 凡用兵之法,將受命於君,合軍聚眾,交和而舍,莫難於軍爭。軍爭之難者,以迂為直,以患為利。故迂其途,而誘之以利,後人發,先人至,此知迂直之計者也。軍爭為利,軍爭為危。舉軍而爭利則不及,委軍而爭利則輜重捐。是故捲甲而趨,日夜不處,倍道兼行,百裡而爭利,則擒三將軍,勁者先,疲者後,其法十一而至;五十裏而爭利,則蹶上將軍,其法半至;三十裏而爭利,則三分之二至。是故軍無輜重則亡,無糧食則亡,無委積則亡。故不知諸侯之謀者,不能豫交;不知山林、險阻、沮澤之形者,不能行軍;不用鄉導者,不能得地利。故兵以詐立,以利動,以分和為變者也。故其疾如風,其徐如林,侵掠如火,不動如山,難知如陰,動如雷震。掠鄉分眾,廓地分利,懸權而動。先知迂直之計者勝,此軍爭之法也。《軍政》曰:“言不相聞,故為之金鼓;視不相見,故為之旌旗。”夫金鼓旌旗者,所以一民之耳目也。民既專一,則勇者不得獨進,怯者不得獨退,此用眾之法也。故夜戰多金鼓,晝戰多旌旗,所以變人之耳目也。三軍可奪氣,將軍可奪心。是故朝氣銳,晝氣惰,暮氣歸。善用兵者,避其銳氣,擊其惰歸,此治氣者也。以治待亂,以靜待嘩,此治心者也。以近待遠,以佚待勞,以飽待饑,此治力者也。無邀正正之旗,無擊堂堂之陳,此治變者也。故用兵之法,高陵勿向,背丘勿逆,佯北勿從,銳卒勿攻,餌兵勿食,歸師勿遏,圍師遺闕,窮寇勿迫,此用兵之法也。 + +九變第八 + +孫子曰: 凡用兵之法,將受命於君,合軍聚合。泛地無舍,衢地合交,絕地無留,圍地則謀,死地則戰,途有所不由,軍有所不擊,城有所不攻,地有所不爭,君命有所不受。故將通於九變之利者,知用兵矣;將不通九變之利,雖知地形,不能得地之利矣;治兵不知九變之術,雖知五利,不能得人之用矣。是故智者之慮,必雜於利害,雜於利而務可信也,雜於害而患可解也。是故屈諸侯者以害,役諸侯者以業,趨諸侯者以利。故用兵之法,無恃其不來,恃吾有以待之;無恃其不攻,恃吾有所不可攻也。故將有五危,必死可殺,必生可虜,忿速可侮,廉潔可辱,愛民可煩。凡此五者,將之過也,用兵之災也。覆軍殺將,必以五危,不可不察也。 + +行軍第九 + +孫子曰:凡處軍相敵,絕山依穀,視生處高,戰隆無登,此處山之軍也。絕水必遠水,客絕水而來,勿迎之於水內,令半渡而擊之利,欲戰者,無附於水而迎客,視生處高,無迎水流,此處水上之軍也。絕斥澤,唯亟去無留,若交軍於斥澤之中,必依水草而背眾樹,此處斥澤之軍也。平陸處易,右背高,前死後生,此處平陸之軍也。凡此四軍之利,黃帝之所以勝四帝也。凡軍好高而惡下,貴陽而賤陰,養生而處實,軍無百疾,是謂必勝。丘陵堤防,必處其陽而右背之,此兵之利,地之助也。上雨水流至,欲涉者,待其定也。凡地有絕澗、天井、天牢、天羅、天陷、天隙,必亟去之,勿近也。吾遠之,敵近之;吾迎之,敵背之。軍旁有險阻、潢井、蒹葭、小林、蘙薈者,必謹覆索之,此伏姦之所處也。敵近而靜者,恃其險也;遠而挑戰者,欲人之進也;其所居易者,利也;眾樹動者,來也;眾草多障者,疑也;鳥起者,伏也;獸駭者,覆也;塵高而銳者,車來也;卑而廣者,徒來也;散而條達者,樵採也;少而往來者,營軍也;辭卑而備者,進也;辭強而進驅者,退也;輕車先出居其側者,陳也;無約而請和者,謀也;奔走而陳兵者,期也;半進半退者,誘也;杖而立者,饑也;汲而先飲者,渴也;見利而不進者,勞也;鳥集者,虛也;夜呼者,恐也;軍擾者,將不重也;旌旗動者,亂也;吏怒者,倦也;殺馬肉食者,軍無糧也;懸甀不返其舍者,窮寇也;諄諄翕翕,徐與人言者,失眾也;數賞者,窘也;數罰者,困也;先暴而後畏其眾者,不精之至也;來委謝者,欲休息也。兵怒而相迎,久而不合,又不相去,必謹察之。兵非貴益多也,惟無武進,足以並力料敵取人而已。夫惟無慮而易敵者,必擒於人。卒未親而罰之,則不服,不服則難用。卒已親附而罰不行,則不可用。故合之以文,齊之以武,是謂必取。令素行以教其民,則民服;令素不行以教其民,則民不服。令素行者,與眾相得也。 + +地形第十 + +孫子曰:地形有通者、有掛者、有支者、有隘者、有險者、有遠者。我可以往,彼可以來,曰通。通形者,先居高陽,利糧道,以戰則利。可以往,難以返,曰掛。掛形者,敵無備,出而勝之,敵若有備,出而不勝,難以返,不利。我出而不利,彼出而不利,曰支。支形者,敵雖利我,我無出也,引而去之,令敵半出而擊之利。隘形者,我先居之,必盈之以待敵。若敵先居之,盈而勿從,不盈而從之。險形者,我先居之,必居高陽以待敵;若敵先居之,引而去之,勿從也。遠形者,勢均難以挑戰,戰而不利。凡此六者,地之道也,將之至任,不可不察也。凡兵有走者、有馳者、有陷者、有崩者、有亂者、有北者。凡此六者,非天地之災,將之過也。夫勢均,以一擊十,曰走;卒強吏弱,曰馳;吏強卒弱,曰陷;大吏怒而不服,遇敵懟而自戰,將不知其能,曰崩;將弱不嚴,教道不明,吏卒無常,陳兵縱橫,曰亂;將不能料敵,以少合眾,以弱擊強,兵無選鋒,曰北。凡此六者,敗之道也,將之至任,不可不察也。夫地形者,兵之助也。料敵制勝,計險隘遠近,上將之道也。知此而用戰者必勝,不知此而用戰者必敗。故戰道必勝,主曰無戰,必戰可也;戰道不勝,主曰必戰,無戰可也。故進不求名,退不避罪,唯民是保,而利於主,國之寶也。視卒如嬰兒,故可以與之赴深溪;視卒如愛子,故可與之俱死。厚而不能使,愛而不能令,亂而不能治,譬若驕子,不可用也。知吾卒之可以擊,而不知敵之不可擊,勝之半也;知敵之可擊,而不知吾卒之不可以擊,勝之半也;知敵之可擊,知吾卒之可以擊,而不知地形之不可以戰,勝之半也。故知兵者,動而不迷,舉而不窮。故曰:知彼知己,勝乃不殆;知天知地,勝乃可全。 + +九地第十一 + +孫子曰:用兵之法,有散地,有輕地,有爭地,有交地,有衢地,有重地,有泛地,有圍地,有死地。諸侯自戰其地者,為散地;入人之地不深者,為輕地;我得亦利,彼得亦利者,為爭地;我可以往,彼可以來者,為交地;諸侯之地三屬,先至而得天下眾者,為衢地;入人之地深,背城邑多者,為重地;山林、險阻、沮澤,凡難行之道者,為泛地;所由入者隘,所從歸者迂,彼寡可以擊吾之眾者,為圍地;疾戰則存,不疾戰則亡者,為死地。是故散地則無戰,輕地則無止,爭地則無攻,交地則無絕,衢地則合交,重地則掠,泛地則行,圍地則謀,死地則戰。古之善用兵者,能使敵人前後不相及,眾寡不相恃,貴賤不相救,上下不相收,卒離而不集,兵合而不齊。合於利而動,不合於利而止。敢問敵眾而整將來,待之若何曰:先奪其所愛則聽矣。兵之情主速,乘人之不及。由不虞之道,攻其所不戒也。凡為客之道,深入則專。主人不克,掠於饒野,三軍足食。謹養而勿勞,並氣積力,運兵計謀,為不可測。投之無所往,死且不北。死焉不得,士人盡力。兵士甚陷則不懼,無所往則固,深入則拘,不得已則鬥。是故其兵不修而戒,不求而得,不約而親,不令而信,禁祥去疑,至死無所之。吾士無餘財,非惡貨也;無餘命,非惡壽也。令發之日,士卒坐者涕沾襟,偃臥者涕交頤,投之無所往,諸、劌之勇也。故善用兵者,譬如率然。率然者,常山之蛇也。擊其首則尾至,擊其尾則首至,擊其中則首尾俱至。敢問兵可使如率然乎?曰可。夫吳人與越人相惡也,當其同舟而濟而遇風,其相救也如左右手。是故方馬埋輪,未足恃也;齊勇如一,政之道也;剛柔皆得,地之理也。故善用兵者,攜手若使一人,不得已也。將軍之事,靜以幽,正以治,能愚士卒之耳目,使之無知;易其事,革其謀,使人無識;易其居,迂其途,使民不得慮。帥與之期,如登高而去其梯;帥與之深入諸侯之地,而發其機。若驅群羊,驅而往,驅而來,莫知所之。聚三軍之眾,投之於險,此謂將軍之事也。九地之變,屈伸之力,人情之理,不可不察也。凡為客之道,深則專,淺則散。去國越境而師者,絕地也;四徹者,衢地也;入深者,重地也;入淺者,輕地也;背固前隘者,圍地也;無所往者,死地也。是故散地吾將一其志,輕地吾將使之屬,爭地吾將趨其後,交地吾將謹其守,交地吾將固其結,衢地吾將謹其恃,重地吾將繼其食,泛地吾將進其途,圍地吾將塞其闕,死地吾將示之以不活。故兵之情:圍則禦,不得已則鬥,過則從。是故不知諸侯之謀者,不能預交;不知山林、險阻、沮澤之形者,不能行軍;不用鄉導,不能得地利。四五者,一不知,非霸王之兵也。夫霸王之兵,伐大國,則其眾不得聚;威加於敵,則其交不得合。是故不爭天下之交,不養天下之權,信己之私,威加於敵,則其城可拔,其國可隳。施無法之賞,懸無政之令。犯三軍之眾,若使一人。犯之以事,勿告以言;犯之以害,勿告以利。投之亡地然後存,陷之死地然後生。夫眾陷於害,然後能為勝敗。故為兵之事,在順詳敵之意,並敵一向,千里殺將,是謂巧能成事。是故政舉之日,夷關折符,無通其使,厲於廊廟之上,以誅其事。敵人開闔,必亟入之,先其所愛,微與之期,踐墨隨敵,以決戰事。是故始如處女,敵人開戶;後如脫兔,敵不及拒。 + +火攻第十二 + +孫子曰:凡火攻有五:一曰火人,二曰火積,三曰火輜,四曰火庫,五曰火隊。行火必有因,因必素具。發火有時,起火有日。時者,天之燥也。日者,月在箕、壁、翼、軫也。凡此四宿者,風起之日也。凡火攻,必因五火之變而應之:火發於內,則早應之於外;火發而其兵靜者,待而勿攻,極其火力,可從而從之,不可從則上。火可發於外,無待於內,以時發之,火發上風,無攻下風,晝風久,夜風止。凡軍必知五火之變,以數守之。故以火佐攻者明,以水佐攻者強。水可以絕,不可以奪。夫戰勝攻取而不惰其功者凶,命曰“費留”。故曰:明主慮之,良將惰之,非利不動,非得不用,非危不戰。主不可以怒而興師,將不可以慍而攻戰。合於利而動,不合於利而上。怒可以複喜,慍可以複說,亡國不可以複存,死者不可以複生。故明主慎之,良將警之。此安國全軍之道也。 + +用間第十三 + +孫子曰: 凡興師十萬,出征千里,百姓之費,公家之奉,日費千金,內外騷動,怠於道路,不得操事者,七十萬家。相守數年,以爭一日之勝,而愛爵祿百金,不知敵之情者,不仁之至也,非民之將也,非主之佐也,非勝之主也。故明君賢將所以動而勝人,成功出於眾者,先知也。先知者,不可取於鬼神,不可象於事,不可驗於度,必取於人,知敵之情者也。故用間有五:有因間,有內間,有反間,有死間,有生間。五間俱起,莫知其道,是謂神紀,人君之寶也。鄉間者,因其鄉人而用之;內間者,因其官人而用之;反間者,因其敵間而用之;死間者,為誑事於外,令吾聞知之而傳於敵間也;生間者,反報也。故三軍之事,莫親於間,賞莫厚於間,事莫密於間,非聖賢不能用間,非仁義不能使間,非微妙不能得間之實。微哉微哉!無所不用間也。間事未發而先聞者,間與所告者兼死。凡軍之所欲擊,城之所欲攻,人之所欲殺,必先知其守將、左右、謁者、門者、舍人之姓名,令吾間必索知之。敵間之來間我者,因而利之,導而舍之,故反間可得而用也;因是而知之,故鄉間、內間可得而使也;因是而知之,故死間為誑事,可使告敵;因是而知之,故生間可使如期。五間之事,主必知之,知之必在於反間,故反間不可不厚也。昔殷之興也,伊摯在夏;周之興也,呂牙在殷。故明君賢將,能以上智為間者,必成大功。此兵之要,三軍之所恃而動也。 diff --git a/vendor/golang.org/x/text/encoding/testdata/unsu-joh-eun-nal-euc-kr.txt b/vendor/golang.org/x/text/encoding/testdata/unsu-joh-eun-nal-euc-kr.txt new file mode 100644 index 0000000000..c9ba04c4c2 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/testdata/unsu-joh-eun-nal-euc-kr.txt @@ -0,0 +1,175 @@ +This file was derived from +http://www.ibrary.co.kr/index.php/book-list/short-stories/34-short-stories-korean/150-2008-04-20-13-22-32 +-------- +[Ұ] + ̷ ΰ ϰ Ѵ. 츮 ִ ̶ 巯 . ϱ ̷ , ¦ 츮 ķ ̷ 츮 տ 𸥴. յ 鿡Դ ڽ ü ٽ δٴ ׷ ⵵ ִ... + +ٽ о . Ĺ ô Ͽ , . 21⸦ 츮鿡 ׷ ƿ ο ó ̴. ׷ ׷? ̷ 𸣰 ְ, ƴ ̴. 쿬 ̴. Ƴ ڴϴ ÷ ... Ƣ ڰ, ׷ ִ. + +[۰ Ұ] + (, 1900-1943) : Ҽ. ѱ Ҽ Ʋ ۰̴. (). ȣ (޻). 1920 ݱ⿡ Ұ üҼ <ó> < ϴ ȸ>, () ٷ <B簨 극> < > 1920 ߹ Ŀ <ǾƳ> <> <> <> ¿ ɰ Ĺ Ȳ ν ε巯 ǰ ǥߴ. < > ̷ 迭 ϴ ǰ̴. 1930 Ŀ ǽİ а ٰ Ҽ ߽ <ž> <ġ()> <ȭ> Ҽ ǥߴ. + +ħϰ 帰 ǰ ϴ ƴ ٰ . + +̳̾߸ ҹ ȿ η°Ų 븩 ϴ ÷Դ ģ ̾. ȿ(ű⵵ ƴ) ô Ŵ 帰 ࿩ մ ϰ 忡 ϸ ϳϳ ִٰ ħ 纹̸ б() ¿ ֱ Ǿ. + +ù , ° - ħ ٶ ׸ ġ ̾. ׾߸ Ⱥپ 浵 ÷ ¥ ȭ Ǭ, Ǵ ټ Ǭ ϰ չٴڿ 긱 ŭ ⻼. ̳ ̶ Ƚ ̶ ׿ 󸶳 . ܵ ְŴϿ ׺ٵ δ Ƴ ׸ ̴. + + Ƴ ħ 𷰰Ÿ Ѿ. 䵵 ⸦ Դٽ ϴ ̴ ø . ¿ ٵ ƴϷε ״ ̶ 𿡰 ־ ̸ ٿ ڲ ´ٴ ڱ () Ͽ. ǻ翡 ݵ , Ͼ ε ° . ̴뵵 ԰ ü ̴. + +׶ ÷  ǿ ¥ ־ ÷ ϸ õ(۰) . ϰ ұ ʾ ä ΰ Ѽ ָԵ Ȥ Ұ ó ϴϸ ׳ , 谡 бٰ ȩ߰ Ͽ. ׶ ÷ ȭ , + +, , պ , Ծ , Ծ , ¼ ̾! ٷ !ϰ ÷ δ ķ. ȩ ٷǸ ̽ . ÷ ÿﵵ ߲߲Ͽ. + + ȯڰ ׷ Դ ʾҴ. ð ʹٰ . + +̷ ! 䵵 Դ , ó԰ ϰ., ߴ ĺҰǸ, ִ ÿġ ʾҴ. + + ִ. δ 翡 ä ( ) ִ. - Ƚ տ ÷ ǬǬϿ. ׷ װɷ ġ ʾҴ. 帣 ̸ ⸧ָӴϰ ָ , б Ƴ . ڿ <η°!> ϰ θ Ҹ . ڱ⸦ ҷ б л ÷ ־. л ¥¥, 빮 󸶿?, . + +Ƹ б 翡 ִ ̷ ̿Ͽ Ϸ ̸. ϿǸ , ְ ؼ 𸣴ٰ ħ ÷ پ̸. ׷ θ ä ؼ , <> 纹ϸ ̷ ÷ Ѿ . + +빮 Դϱ.ϰ ÷ Ͽ. ״ ߿ 嵵 öŸ Ⱑ Ⱦϱ? ó , ° ׸ Ͽϱ? ƴϴ, ƴϴ. ̻ϰԵ ¹ տ ̴.׸ Ƴ Ź б. - ׼ θ 󱼿 ޸ ũ ְϴ , ƿ. п پ־. ̷ µ, Ҹ ߾Ÿ ɱ׷ɱ׷ Ͽ. + +׶ ÷ , д, , Ҹ ϳ. ºٵ ɾ Կ 츱 ˾.ϰ, ½ پϱ ȯڴ , ׷, ׷ Ϳ.ϰ, Ҹ ڸ . + + , ޸ ŭ , Ƴ ÷ տ Ͽ. ׷ 빮 󸶶 ̿?ϰ л η°Ų ٶ󺸸 ȥ㸻, õ ְ, ̵簡., ߾Ÿ. + + ݽÿ. ̿ Ҿ ÷ Կ . θ û ׼ . Ѳ ̷ ݾ ҷ 󸶸ΰ! ׷ Ⱑ ڿ 縣 Ҵ.  ;. ִ ģ ͺٵ ĥ Ͽ. + + ʹ ѵ. ̷ ϸ л Ͽ. + +ƴϿýô. ռ ġ ⼭ űⰡ ÿ Ѵ´ϴ. ̷ ּž.ϰ ۺ 󱼿 귶. + +׷ ޶ ̴ .  մ ׷ ʵ ԰ ìⷯ . + + л ¿ ÷ ٸ ̻ϰ ŻϿ. ѴٴϺ Ͽ.  ٴϺ ġ ij <Ʈ> ̲ Ͽ. ̲⵵ Ͽ. + + ٸ ſ. ڱ ٴٸ ̴. コ . < ƿ. ̷ µ!> ̷ Ϳ ȴ. ׸  ϴ ڱ⸦ 븮 Ͽ. ׷ ϰ  ʹ. ϰ Ҹ ʹ. ̸, ġڱ.ϰ ź θ¢ Ϳ Դ. ÷ η°Ÿ ä Ѻǿ . + +, .ϰ, ÷ Ǵٽ Ͽ. ־ ÷ ٽñ Ͽ. ٸ ߸ ڱ Ӹ ٽɰ . + + ְ ¦ տ 翡, Ǵ ¾ ܰŸ ƴϰ, Դ. γ ⻼. ڽ ۿ ȵǴ  մԿ 㸮 , ȳ ٳɽÿ. ƴ. + +׷ η°Ÿ аŸ ߿ ư ޹̾. 뵿 Ͽ 帥 ľ ָ âڿ, 帣 ʿ  ѱⰡ ھƳ ϸ ̶ 󸶳 ο . ߱ ϳ . ¸ ˼۱׷ ڸ Ͼ Ҵ. + + ! η°Ÿ аŸ Ƹ . ̷ , ҹ̸ ! + +״ ȱ ̳ ϴ ԰ɰŷȴ. ׷ Ӹ ο Ƴ װ <̷ ƴ϶ ó ⸦ ٸ մ ¿ ɴ > ̾. ϰԵ ϱ ׷ ѹ Ϸ. ڱ⸦ ٸ ִٰ ⸦ ص Ǿ. ׷ٰ η°Ų տ . + +׷ ״ غ ̶ ٷ 忡 , ٴϴ ƴ η°Ÿ ڱ ó ϱ Ͽ. 󸶸 ԰, ̳ Ǵ Դ. ߿ մ ϴ ÷ Ӹ θ Ű <> θ , л . ״ ٽ ٰ. + +ƾ, η° ƴ Ÿöÿ? + + л ſ Ȱ Լ ٹ ä ÷ ŵ鶰 ʾҴ. ÷ ϴ ؿ Ǹ, ƾ, ֵ麸 ΰ Ŵ 帮ϴ. Ű.ϰ, ߱߱ϰԵ ִ Ϻ ¦ . + + ̷, ġʰ. Ҹ ° Ƽ. ÷ ÿ ϰ . + + Դ. ÷ Ÿ ̸ 븮 ־. ׷ () Ʋ ʾҴ. ϰ ư ̱ Ͽ Ÿ ϳ ־. ϰ ū ִ° Ƹ պ ȿ ũ Ͽ 忡 з ġ. ÷ . + +η°Ÿ Ÿöÿ. + +ѵ °̸ ϴٰ λ絿 ¿ֱ Ͽ. η°Ű ſ ̻ϰԵ ׸ η°Ű ٽñ ſǸ ̹ ´. ڲ տ Ÿ ٶ . ̳ ٸ ¢ ٴ ۿ . + + η°ű ذ , ϸŭ ȲϿ. 帮 ϴ ħħϰ Ȳȥ ϴ. â ձ ٴ޾Ƽ ״ ο Ҵ. Ϳü ϰ ׷. ׷ ׷ Ƚɿ ƴϿ, ڱ⸦ ģ ƴ ˰ ڵ ηϴ ̴. + +״ ࿡ ٴġ ð ̶ ø ŷȴ. () ̸ Ͽٴ ϰ ;. ״ θθ Ǿ. ġ ڱ - ϰ ޷ ٸ δ ٰ, ٰ ϴ Ͽ. + +׷ ħ 氡 ģ ġ̰ ´. ۿ 󱼿 ȫ , ΰ Ŀݰ Ŵ, 븣 ¦ а, ִ ιؿ ġ ̸ Ųٷ ٿ ÷ dzäϰ ־. + + ÷, ڳ  ϼ׷. ״ . + +׶׺ ̸ ÿ θ¢. Ҹ ϰ ϽϿ. ÷ ģ  ݰ . ڱ⸦ ̳ ⵵ Ͽ. + +ڳ״ ϼ׷. ڳ׵ ̰ ƺ.ϰ, ÷ 켭 . + +д, ٰ . ׷ , ڳ ޸ ° ?  ̸ . + + ϰ ߶Ͽ. ߾ ̴ ܶѲ Թ , 迡 ʺƴ ̸ ̸ ̸ ̸ Ͼ 붱 ϰ þ Źڿ ÷ ڱ ߵ . ̸ ű ִ ̸ ׸ ѵ ÿġ ʾҴ. ϵ ̴ з 붱 ̱⵵ ϰ ߾ ׸ ûϿ. + +ָ âڴ ĸ ڲڲ ̶̶ Ͽ. İ κο ̲ٸ ׸ ׳ Ű Ҵ. ° ׸ ޾Ƶ . ġ̿ ̶ ϰ âڿ ȭϿ. ̴. + + ÷ Ǯ Ͽ. 迡  ҷŸ ξ Ͽ. + +ġ Ǿ ÷ , ״ٴ, 츮 ܾ Ծ, ϼ. ǽ״. + +Ƶ ̳, ׸ ϳ. . Ҵ. + +׷ 󸶸 ΰ? + + , ! ̷ Ⱥξ , Ծ . ̰ µ. + +, ߱, ׸μ. + +̳, ̰ ԰ ,  Ծ.ϰ ġ ͸ ä ̴ θ¢. ׸ ״ ټ ߴ밡Է ޷, ̳, , ʾ. ߴ ƴ. ߴ밡 ġ ϴ Ͽ. ġ ˾ƺ ȭ , ̸ , ̳ ˰.ڸ 㸮 ĩĩ ϴ ¥ ߴ밡 տ ½ . ǰ Ǭ ߱׶ ϸ . + + , . ̷ ϸ Ϻ ݴ´. ÷ ߿ ó Ǵ ũ ٺٰ ҽÿ ϴ ʹ ٴ ҽġ , ! , , ٸٱ .ϰ ġ ִֿ ޾, ! ø !ϸ鼭, Ǯ ģ. ¾ ٽ ̴ Ǭ Ÿ ´´ٴ ¸ϰ . + + ξ ܸ Ҵ. ÷ Լ Ƶ̰ ſ ٵ, ξ, ξ., ƴ. + + ԰ ÷ ġ ġ ´. Ҹ  Ǵ ִ ÷Է . ̴ , ġ, 콺 ̾߱ ϳ ұ. ° 忡 ʾҰڳ. + +׷. + +ٰ Ⱑ Ƶ׷. ׷ 忡 ϸ մ ϳ ¿ ø ʾҳ. ű ħ ̽ л̽ - ٴϿ ư ִ - <> θ ° ְ. ٽ η° Ÿöÿ ϰ հ ϱ Ź Ѹġ ȴ Ƽϸ < ̷ !> Ҹ߸ Ҳ Ҹ, ! + + ÷ ϰԵ Ҳ Ҹ . Ͻÿ . + + , ¼, < !> ̱ Ҹ óŵ , . + + Ҹ . ׷ Ҹ ÷ ½½ Ͽ. + +ġ ̾ ̸ ٶ󺸸, ݹ ϴ ΰ. + + ÷ ڸ 鿩ø, 츮 ׾ٳ. + +, ״ٴ, ? + +̳ . . + + ģ , . + + , ׾, ... ü ij Դٴ, ̾, ̾.ϰ ÷ Ҹ . + +ġ 󱼷, , ϳ ϳ. ׷ , .ϰ ƴ. + +ġ Ѹġ ÷ ۽۽ ̱׷ ´. + +ױ ׾.ϰ ǰ . + +ױ ׾, Ƹ ִܴ. . ӾҴ.ϰ  ջ ġ ´. + + ƴ ΰ. ָճװ δ´ µ.ϰ, ġ̵ Ҿ ÷ ư Ͽ. + + ׾, ׾뵵׷. + + ÷ ȱ Ȯְ Ҹ Ҹ ־ ־. ġ ä ܾ ԰ Դ. ǿ . + + ÷ ߿ 簡 ٴ޾Ҵ. ̶ ص ̿, ü ƴ϶ Ȱ Ҷ ε ޿ ̴. ÷ ֱ⸦ ʾҴ 빮 鿩 װ ϴ ù () - dz찡 ٴ ٸ . + +Ÿ ħ Ҹ . ׸Ÿ Ҹ . ٸ ħ ߸ - ߸ٴϺ ħ ϰ ұϰ ϴ ϴ Ҹ,  Ҹ ̴. û() Ҹ ̿, ܶܶ ϰ Ѿ Ҹ ٴ ͵ Ҵ 𸣸. + +Ȥ ÷ ұ ħ ߴ 𸥴. ׷ 빮 ڸ , , µ ͺ ʾ, .̶ ģ ϴ. ̾߸ ؿ ù Ѿƹ 强() ̴. + +Ͽ ÷ 湮 Ĭ . ϴ ߱ - ڸ ؿ , Ϳ ˳ ܳ, ʳ, ߱Ⱑ ÷ ڸ 񷶴. + +ȿ  ѱ ̵ û ִ ȣ ƴ. + +̷ , ־õ() ̾! ͵ Ͼ . Ҹ Բ ߱ ٸ á. ׷ ߱濡 ä̴ ƴϰ ɰ ־. ̶ Ҹ Ҹ Ͽ. ̰ . 뵵 ׷ ٿ, ٴ ǥ ̴. Ҹ Կ ƴϰ ġ ӿ Ͽ. ٰ ٰ . + +߷ Ƴ Ӹ ޷ ׾߸ ġ ȯ Ӹ , , , ! پ, ! + + + +, ̰ , ƹ . + + +̳, ׾ ̳, . + + + +. , ׾. + +̷ٰ â , ġ ˾ƺڸ, ! ! ٶ ϰ õ , .ϴ ޾. ׷ þ. ÷ ĥ 󱼿 ߾ŷȴ. + + ٳҴµ ϴ, ϴ... ϰԵ ! ϸ... diff --git a/vendor/golang.org/x/text/encoding/testdata/unsu-joh-eun-nal-utf-8.txt b/vendor/golang.org/x/text/encoding/testdata/unsu-joh-eun-nal-utf-8.txt new file mode 100644 index 0000000000..e10a3d46bf --- /dev/null +++ b/vendor/golang.org/x/text/encoding/testdata/unsu-joh-eun-nal-utf-8.txt @@ -0,0 +1,175 @@ +This file was derived from +http://www.ibrary.co.kr/index.php/book-list/short-stories/34-short-stories-korean/150-2008-04-20-13-22-32 +-------- +[소개] +잔인한 운명은 이렇게 인간을 조롱하곤 한다. 우리가 평소 마음 속 저 깊은 곳에 움켜쥐고 있던 자존심 따위는 어느 한 순간 전혀 무용지물이란 것이 드러나고 만다. 하기야 이렇게 삶의 한 순간, 눈 깜짝할 새에 우리를 후려 갈기고 지나가는 그 진실이 미래의 어느날에는 또 남김없이 우리 눈 앞에 펼쳐질지도 모른다. 죽음을 앞둔 사람들에게는 자신의 삶 전체가 한 순간에 다시 보인다는 그런 얘기도 있던데... + +다시 읽어보니 끔찍한 생각도 든다. 식민지 시대의 암울한 삶, 그 끈끈한 냄새를 피할 수 없다. 21세기를 사는 우리들에겐 그런 냄새는 아예 인연이 없는 것처럼 느껴질 수도 있을 것이다. 그러나 과연 그럴까? 이런 냄새를 모르고 평생 사는 사람도 있겠지만, 전혀 관련이 없는 것은 아닐 것이다. 그저 우연일 뿐이다. 아내를 박대하는 김 첨지의 모습... 요새 같으면 간이 배 밖으로 튀어나온 남자겠지만, 그래도 그 애정은 더 진한 것일 수도 있다. + +[작가 소개] +현 진 건(玄鎭健, 1900-1943) : 소설가. 한국 사실주의 단편소설의 기틀을 다진 작가이다. 본관은 연주(延州). 아호는 빙허(憑虛). 1920년대 전반기에는 자전적 요소가 강한 개인적 체험소설인 <빈처> <술 권하는 사회>, 성(性)의 문제와 애정문제를 다룬 <B사감과 러브레터> <새빨간 웃음> 등이 있으며 1920년대 중반 이후에는 <피아노> <우편국에서> <불> <고향> 등 세태에의 관심과 식민지 상황하의 현실인식이 두드러진 작품을 많이 발표했다. <운수 좋은 날>도 이러한 계열에 속하는 작품이다. 1930년대 이후에는 역사의식과 예언주의적 문학관에 근거한 역사소설 중심의 <무영탑> <흑치상지(黑齒常之)> <선화공주> 등 장편소설을 발표했다. + +새침하게 흐린 품이 눈이 올 듯하더니 눈은 아니 오고 얼다가 만 비가 추적추적 내리었다. + +이날이야말로 동소문 안에서 인력거꾼 노릇을 하는 김 첨지에게는 오래간만에도 닥친 운수 좋은 날이었다. 문안에(거기도 문밖은 아니지만) 들어간답시는 앞집 마나님을 전찻길까지 모셔다 드린 것을 비롯으로 행여나 손님이 있을까 하고 정류장에서 어정어정하며 내리는 사람 하나하나에게 거의 비는 듯한 눈결을 보내고 있다가 마침내 교원인 듯한 양복장이를 동광학교(東光學校)까지 태워다 주기로 되었다. + +첫번에 삼십 전, 둘째 번에 오십 전 - 아침 댓바람에 그리 흔치 않은 일이었다. 그야말로 재수가 옴붙어서 근 열흘 동안 돈 구경도 못한 김 첨지는 십 전짜리 백통화 서 푼, 또는 다섯 푼이 찰깍하고 손바닥에 떨어질 제 거의 눈물을 흘릴 만큼 기뻤었다. 더구나 이날 이때에 이 팔십 전이라는 돈이 그에게 얼마나 유용한지 몰랐다. 컬컬한 목에 모주 한 잔도 적실 수 있거니와 그보다도 앓는 아내에게 설렁탕 한 그릇도 사다줄 수 있음이다. + +그의 아내가 기침으로 쿨럭거리기는 벌써 달포가 넘었다. 조밥도 굶기를 먹다시피 하는 형편이니 물론 약 한 첩 써 본 일이 없다. 구태여 쓰려면 못 쓸 바도 아니로되 그는 병이란 놈에게 약을 주어 보내면 재미를 붙여서 자꾸 온다는 자기의 신조(信條)에 어디까지 충실하였다. 따라서 의사에게 보인 적이 없으니 무슨 병인지는 알 수 없으되 반듯이 누워 가지고, 일어나기는 새로 모로도 못 눕는걸 보면 중증은 중증인 듯. 병이 이대도록 심해지기는 열흘 전에 조밥을 먹고 체한 때문이다. + +그때도 김 첨지가 오래간만에 돈을 얻어서 좁쌀 한 되와 십 전짜리 나무 한 단을 사다 주었더니 김 첨지의 말에 의지하면 그 오라질 년이 천방지축(天方地軸)으로 남비에 대고 끓였다. 마음은 급하고 불길은 달지 않아 채 익지도 않은 것을 그 오라질 년이 숟가락은 고만두고 손으로 움켜서 두 뺨에 주먹덩이 같은 혹이 불거지도록 누가 빼앗을 듯이 처박질 하더니만 그날 저녁부터 가슴이 땅긴다, 배가 켕긴다고 눈을 홉뜨고 지랄병을 하였다. 그때 김 첨지는 열화와 같이 성을 내며, + +“에이, 오라질 년, 조롱복은 할 수가 없어, 못 먹어 병, 먹어서 병, 어쩌란 말이야! 왜 눈을 바루 뜨지 못해!”하고 김 첨지는 앓는 이의 뺨을 한 번 후려갈겼다. 홉뜬 눈은 조금 바루어졌건만 이슬이 맺히었다. 김 첨지의 눈시울도 뜨끈뜨끈하였다. + +이 환자가 그러고도 먹는 데는 물리지 않았다. 사흘 전부터 설렁탕 국물이 마시고 싶다고 남편을 졸랐다. + +“이런 오라질 년! 조밥도 못 먹는 년이 설렁탕은, 또 처먹고 지랄병을 하게.”라고, 야단을 쳐보았건만, 못 사주는 마음이 시원치는 않았다. + +인제 설렁탕을 사줄 수도 있다. 앓는 어미 곁에서 배고파 보채는 개똥이(세 살먹이)에게 죽을 사줄 수도 있다. - 팔십 전을 손에 쥔 김 첨지의 마음은 푼푼하였다. 그러나 그의 행운은 그걸로 그치지 않았다. 땀과 빗물이 섞여 흐르는 목덜미를 기름주머니가 다 된 왜목 수건으로 닦으며, 그 학교 문을 돌아나올 때였다. 뒤에서 <인력거!> 하고 부르는 소리가 난다. 자기를 불러 멈춘 사람이 그 학교 학생인 줄 김 첨지는 한 번 보고 짐작할 수 있었다. 그 학생은 다짜고짜로, “남대문 정거장까지 얼마요?”라고, 물었다. + +아마도 그 학교 기숙사에 있는 이로 동기방학을 이용하여 귀향하려 함이리라. 오늘 가기로 작정은 하였건만 비는 오고, 짐은 있고 해서 어찌할 줄 모르다가 마침 김 첨지를 보고 뛰어나왔음이리라. 그렇지 않으면 왜 구두를 채 신지 못해서 질질 끌고, 비록 <고구라> 양복일망정 노박이로 비를 맞으며 김첨지를 뒤쫓아 나왔으랴. + +“남대문 정거장까지 말씀입니까.”하고 김 첨지는 잠깐 주저하였다. 그는 이 우중에 우장도 없이 그 먼 곳을 철벅거리고 가기가 싫었음일까? 처음 것, 둘째 것으로 그만 만족하였음일까? 아니다, 결코 아니다. 이상하게도 꼬리를 맞물고 덤비는 이 행운 앞에 조금 겁이 났음이다.그리고 집을 나올 제 아내의 부탁이 마음에 켕기었다. - 앞집 마나님한테서 부르러 왔을 제 병인은 그 뼈만 남은 얼굴에 유일의 생물 같은 유달리 크고 움폭한 눈에 애걸하는 빛을 띠우며, “오늘은 나가지 말아요. 제발 덕분에 집에 붙어있어요. 내가 이렇게 아픈데……”라고, 모기 소리같이 중얼거리고 숨을 걸그렁걸그렁 하였다. + +그때에 김 첨지는 대수롭지 않은 듯이, “압다, 젠장맞을 년, 별 빌어먹을 소리를 다 하네. 맞붙들고 앉았으면 누가 먹여 살릴 줄 알아.”하고, 훌쩍 뛰어나오려니까 환자는 붙잡을 듯이 팔을 내저으며, “나가지 말라도 그래, 그러면 일찌기 들어와요.”하고, 목메인 소리가 뒤를 따랐다. + +정거장까지 가잔 말을 들은 순간에 경련적으로 떠는 손, 유달리 큼직한 눈, 울 듯한 아내의 얼굴이 김 첨지의 눈앞에 어른어른하였다. “그래 남대문 정거장까지 얼마란 말이요?”하고 학생은 초조한 듯이 인력거꾼의 얼굴을 바라보며 혼잣말같이, “인천 차가 열 한 점에 있고, 그 다음에는 새로 두 점이든가.”라고, 중얼거린다. + +“일 원 오십 전만 줍시요.” 이 말이 저도 모를 사이에 불쑥 김 첨지의 입에서 떨어졌다. 제 입으로 부르고도 스스로 그 엄청난 돈 액수에 놀래었다. 한꺼번에 이런 금액을 불러라도 본 지가 그 얼마만인가! 그러자 그 돈 벌 용기가 병자에 대한 염려를 사르고 말았다. 설마 오늘 내로 어떠랴 싶었다. 무슨 일이 있더라도 제일 제이의 행운을 곱친 것보다도 오히려 갑절이 많은 이 행운을 놓칠 수 없다 하였다. + +“일 원 오십 전은 너무 과한데.” 이런 말을 하며 학생은 고개를 기웃하였다. + +“아니올시다. 잇수로 치면 여기서 거기가 시오리가 넘는답니다. 또 이런 진 날에 좀더 주셔야지요.”하고 빙글빙글 웃는 차부의 얼굴에는 숨길 수 없는 기쁨이 넘쳐 흘렀다. + +“그러면 달라는 대로 줄 터이니 빨리 가요.” 관대한 어린 손님은 그런 말을 남기고 총총히 옷도 입고 짐도 챙기러 갈 데로 갔다. + +그 학생을 태우고 나선 김 첨지의 다리는 이상하게 거뿐하였다. 달음질을 한다느니보다 거의 나는 듯하였다. 바퀴도 어떻게 속히 도는지 군다느니보다 마치 얼음을 지쳐나가는 <스케이트> 모양으로 미끄러져 가는 듯하였다. 얼은 땅에 비가 내려 미끄럽기도 하였지만. + +이윽고 끄는 이의 다리는 무거워졌다. 자기 집 가까이 다다른 까닭이다. 새삼스러운 염려가 그의 가슴을 눌렀다. <오늘은 나가지 말아요. 내가 이렇게 아픈데!> 이런 말이 잉잉 그의 귀에 울렸다. 그리고 병자의 움쑥 들어간 눈이 원망하는 듯이 자기를 노리는 듯하였다. 그러자 엉엉하고 우는 개똥이의 곡성을 들은 듯싶다. 딸국딸국 하고 숨 모으는 소리도 나는 듯싶다.“왜 이리우, 기차 놓치겠구먼.”하고 탄 이의 초조한 부르짖음이 간신히 그의 귀에 들어왔다. 언뜻 깨달으니 김 첨지는 인력거를 쥔 채 길 한복판에 엉거주춤 멈춰있지 않은가. + +“예, 예.”하고, 김 첨지는 또다시 달음질하였다. 집이 차차 멀어갈수록 김 첨지의 걸음에는 다시금 신이 나기 시작하였다. 다리를 재게 놀려야만 쉴새없이 자기의 머리에 떠오르는 모든 근심과 걱정을 잊을 듯이. + +정거장까지 끌어다주고 그 깜짝 놀란 일 원 오십 전을 정말 제 손에 쥠에, 제 말마따나 십 리나 되는 길을 비를 맞아 가며 질퍽거리고 온 생각은 아니하고, 거저나 얻은 듯이 고마왔다. 졸부나 된 듯이 기뻤다. 제자식 뻘밖에 안되는 어린 손님에게 몇 번 허리를 굽히며, “안녕히 다녀옵시요.”라고 깍듯이 재우쳤다. + +그러나 빈 인력거를 털털거리며 이 우중에 돌아갈 일이 꿈밖이었다. 노동으로 하여 흐른 땀이 식어지자 굶주린 창자에서, 물 흐르는 옷에서 어슬어슬 한기가 솟아나기 비롯하매 일 원 오십 전이란 돈이 얼마나 괜찮고 괴로운 것인 줄 절절히 느끼었다. 정거장을 떠나는 그의 발길은 힘 하나 없었다. 온몸이 옹송그려지며 당장 그 자리에 엎어져 못 일어날 것 같았다. + +“젠장맞을 것! 이 비를 맞으며 빈 인력거를 털털거리고 돌아를 간담. 이런 빌어먹을, 제 할미를 붙을 비가 왜 남의 상판을 딱딱 때려!” + +그는 몹시 홧증을 내며 누구에게 반항이나 하는 듯이 게걸거렸다. 그럴 즈음에 그의 머리엔 또 새로운 광명이 비쳤나니 그것은 <이러구 갈 게 아니라 이 근처를 빙빙 돌며 차 오기를 기다리면 또 손님을 태우게 될는지도 몰라>란 생각이었다. 오늘 운수가 괴상하게도 좋으니까 그런 요행이 또한번 없으리라고 누가 보증하랴. 꼬리를 굴리는 행운이 꼭 자기를 기다리고 있다고 내기를 해도 좋을 만한 믿음을 얻게 되었다. 그렇다고 정거장 인력거꾼의 등살이 무서우니 정거장 앞에 섰을 수는 없었다. + +그래 그는 이전에도 여러 번 해본 일이라 바로 정거장 앞 전차 정류장에서 조금 떨어지게, 사람 다니는 길과 전찻길 틈에 인력거를 세워놓고 자기는 그 근처를 빙빙 돌며 형세를 관망하기로 하였다. 얼마만에 기차는 왔고, 수십 명이나 되는 손이 정류장으로 쏟아져 나왔다. 그 중에서 손님을 물색하는 김 첨지의 눈엔 양머리에 뒤축 높은 구두를 신고 <망토>까지 두른 기생 퇴물인 듯, 난봉 여학생인 듯한 여편네의 모양이 띄었다. 그는 슬근슬근 그 여자의 곁으로 다가들었다. + +“아씨, 인력거 아니 타시랍시요?” + +그 여학생인지 뭔지가 한참은 매우 탯갈을 빼며 입술을 꼭 다문 채 김 첨지를 거들떠보지도 않았다. 김 첨지는 구걸하는 거지나 무엇같이 연해연방 그의 기색을 살피며, “아씨, 정거장 애들보담 아주 싸게 모셔다 드리겠읍니다. 댁이 어디신가요.”하고, 추근추근하게도 그 여자의 들고 있는 일본식 버들고리짝에 제 손을 대었다. + +“왜 이래, 남 귀치않게.” 소리를 벽력같이 지르고는 돌아선다. 김 첨지는 어랍시요 하고 물러섰다. + +전차는 왔다. 김 첨지는 원망스럽게 전차 타는 이를 노리고 있었다. 그러나 그의 예감(豫感)은 틀리지 않았다. 전차가 빡빡하게 사람을 싣고 움직이기 시작하였을 때 타고 남은 손 하나이 있었다. 굉장하게 큰 가방을 들고 있는걸 보면 아마 붐비는 차 안에 짐이 크다 하여 차장에게 밀려내려온 눈치였다. 김 첨지는 대어섰다. + +“인력거를 타시랍시요.” + +한동안 값으로 승강이를 하다가 육십 전에 인사동까지 태워다주기로 하였다. 인력거가 무거워지매 그의 몸은 이상하게도 가벼워졌고 그리고 또 인력거가 가벼워지니 몸은 다시금 무거워졌건만 이번에는 마음조차 초조해 온다. 집의 광경이 자꾸 눈앞에 어른거리어 인제 요행을 바랄 여유도 없었다. 나무 등걸이나 무엇 같고 제 것 같지도 않은 다리를 연해 꾸짖으며 갈팡질팡 뛰는 수밖에 없었다. + +저놈의 인력거군이 저렇게 술이 취해가지고 이 진 땅에 어찌 가노, 라고 길 가는 사람이 걱정을 하리만큼 그의 걸음은 황급하였다. 흐리고 비오는 하늘은 어둠침침하게 벌써 황혼에 가까운 듯하다. 창경원 앞까지 다달아서야 그는 턱에 닿은 숨을 돌리고 걸음도 늦추잡았다. 한 걸음 두 걸음 집이 가까와올수록 그의 마음조차 괴상하게 누그러웠다. 그런데 이 누그러움은 안심에서 오는 게 아니요, 자기를 덮친 무서운 불행을 빈틈없이 알게 될 때가 박두한 것을 두려워하는 마음에서 오는 것이다. + +그는 불행에 다닥치기 전 시간을 얼마쯤이라도 늘리려고 버르적거렸다. 기적(奇蹟)에 가까운 벌이를 하였다는 기쁨을 할 수 있으면 오래 지니고 싶었다. 그는 두리번두리번 사면을 살피었다. 그 모양은 마치 자기 집 - 곧 불행을 향하고 달려가는 제 다리를 제 힘으로는 도저히 어찌할 수 없으니 누구든지 나를 좀 잡아 다고, 구해 다고 하는 듯하였다. + +그럴 즈음에 마침 길가 선술집에서 그의 친구 치삼이가 나온다. 그의 우글우글 살찐 얼굴에 주홍이 돋는 듯, 온 턱과 뺨을 시커멓게 구레나룻이 덮였거늘, 노르탱탱한 얼굴이 바짝 말라서 여기저기 고랑이 패고, 수염도 있대야 턱밑에만 마치 솔잎 송이를 거꾸로 붙여놓은 듯한 김 첨지의 풍채하고는 기이한 대상을 짓고 있었다. + +“여보게 김 첨지, 자네 문안 들어갔다 오는 모양일세그려. 돈 많이 벌었을 테니 한 잔 빨리게.” + +뚱뚱보는 말라깽이를 보든 맡에 부르짖었다. 그 목소리는 몸짓과 딴판으로 연하고 싹싹하였다. 김 첨지는 이 친구를 만난 게 어떻게 반가운지 몰랐다. 자기를 살려준 은인이나 무엇같이 고맙기도 하였다. + +“자네는 벌써 한잔 한 모양일세그려. 자네도 오늘 재미가 좋아보이.”하고, 김 첨지는 얼굴을 펴서 웃었다. + +“압다, 재미 안 좋다고 술 못 먹을 낸가. 그런데 여보게, 자네 왼몸이 어째 물독에 빠진 새앙쥐 같은가? 어서 이리 들어와 말리게.” + +선술집은 훈훈하고 뜨뜻하였다. 추어탕을 끓이는 솥뚜껑을 열 적마다 뭉게뭉게 떠오르는 흰 김, 석쇠에서 뻐지짓뻐지짓 구워지는 너비아니 구이며 제육이며 간이며 콩팥이며 북어며 빈대떡……이 너저분하게 늘어놓인 안주 탁자에 김 첨지는 갑자기 속이 쓰려서 견딜 수 없었다. 마음대로 할 양이면 거기 있는 모든 먹음 먹이를 모조리 깡그리 집어삼켜도 시원치 않았다. 하되 배고픈 이는 위선 분량 많은 빈대떡 두 개를 쪼이기도 하고 추어탕을 한 그릇 청하였다. + +주린 창자는 음식맛을 보더니 더욱더욱 비어지며 자꾸자꾸 들이라들이라 하였다. 순식간에 두부와 미꾸리 든 국 한 그릇을 그냥 물같이 들이키고 말았다. 세째 그릇을 받아들었을 제 데우던 막걸이 곱배기 두 잔이 더웠다. 치삼이와 같이 마시자 원원히 비었던 속이라 찌르르하고 창자에 퍼지며 얼굴이 화끈하였다. 눌러 곱배기 한 잔을 또 마셨다. + +김 첨지의 눈은 벌써 개개 풀리기 시작하였다. 석쇠에 얹힌 떡 두 개를 숭덩숭덩 썰어서 볼을 불룩거리며 또 곱배기 두 잔을 부어라 하였다. + +치삼은 의아한 듯이 김 첨지를 보며, “여보게 또 붓다니, 벌써 우리가 넉 잔씩 먹었네, 돈이 사십 전일세.”라고 주의시켰다. + +“아따 이놈아, 사십 전이 그리 끔찍하냐. 오늘 내가 돈을 막 벌었어. 참 오늘 운수가 좋았느니.” + +“그래 얼마를 벌었단 말인가?” + +“삼십 원을 벌었어, 삼십 원을! 이런 젠장맞을 술을 왜 안부어……괜찮다 괜찮다, 막 먹어도 상관이 없어. 오늘 돈 산더미같이 벌었는데.” + +“어, 이 사람 취했군, 그만두세.” + +“이놈아, 이걸 먹고 취할 내냐, 어서 더 먹어.”하고는 치삼의 귀를 잡아채며 취한 이는 부르짖었다. 그리고 술을 붓는 열 다섯 살 됨직한 중대가리에게로 달려들며, “이놈, 오라질 놈, 왜 술을 붓지 않어.”라고 야단을 쳤다. 중대가리는 히히 웃고 치삼을 보며 문의하는 듯이 눈짓을 하였다. 주정꾼이 눈치를 알아보고 화를 버럭내며, “에미를 붙을 이 오라질 놈들 같으니, 이놈 내가 돈이 없을 줄 알고.”하자마자 허리춤을 훔칫훔칫 하더니 일 원짜리 한 장을 꺼내어 중대가리 앞에 펄쩍 집어던졌다. 그 사품에 몇 푼 은전이 잘그랑 하며 떨어진다. + +“여보게 돈 떨어졌네, 왜 돈을 막 끼얹나.” 이런 말을 하며 일변 돈을 줍는다. 김 첨지는 취한 중에도 돈의 거처를 살피는 듯이 눈을 크게 떠서 땅을 내려다보다가 불시에 제 하는 짓이 너무 더럽다는 듯이 고개를 소스라치자 더욱 성을 내며, “봐라 봐! 이 더러운 놈들아, 내가 돈이 없나, 다리뼉다구를 꺾어놓을 놈들 같으니.”하고 치삼의 주워주는 돈을 받아, “이 원수엣 돈! 이 육시를 할 돈!”하면서, 풀매질을 친다. 벽에 맞아 떨어진 돈은 다시 술 끓이는 양푼에 떨어지며 정당한 매를 맞는다는 듯이 쨍하고 울었다. + +곱배기 두 잔은 또 부어질 겨를도 없이 말려가고 말았다. 김 첨지는 입술과 수염에 붙은 술을 빨아들이고 나서 매우 만족한 듯이 그 솔잎 송이 수염을 쓰다듬으며, “또 부어, 또 부어.”라고, 외쳤다. + +또 한 잔 먹고 나서 김 첨지는 치삼의 어깨를 치며 문득 껄껄 웃는다. 그 웃음 소리가 어떻게 컸는지 술집에 있는 이의 눈은 모두 김 첨지에게로 몰리었다. 웃는 이는 더욱 웃으며, “여보게 치삼이, 내 우스운 이야기 하나 할까. 오늘 손을 태고 정거장에까지 가지 않았겠나.” + +“그래서.” + +“갔다가 그저 오기가 안 됐데그려. 그래 전차 정류장에서 어름어름하며 손님 하나를 태울 궁리를 하지 않았나. 거기 마침 마나님이신지 여학생님이신지 - 요새야 어디 논다니와 아가씨를 구별할 수가 있던가 - <망토>를 두르고 비를 맞고 서 있겠지. 슬근슬근 가까이 가서 인력거 타시랍시요 하고 손가방을 받으랴니까 내 손을 탁 뿌리치고 홱 돌아서더니만 <왜 남을 이렇게 귀찮게 굴어!> 그 소리야말로 꾀꼬리 소리지, 허허!” + +김 첨지는 교묘하게도 정말 꾀꼬리 같은 소리를 내었다. 모든 사람은 일시에 웃었다. + +“빌어먹을 깍쟁이 같은 년, 누가 저를 어쩌나, <왜 남을 귀찮게 굴어!> 어이구 소리가 처신도 없지, 허허.” + +웃음 소리들은 높아졌다. 그러나 그 웃음 소리들이 사라지기 전에 김 첨지는 훌쩍훌쩍 울기 시작하였다. + +치삼은 어이없이 주정뱅이를 바라보며, “금방 웃고 지랄을 하더니 우는 건 또 무슨 일인가.” + +김 첨지는 연해 코를 들여마시며, “우리 마누라가 죽었다네.” + +“뭐, 마누라가 죽다니, 언제?” + +“이놈아 언제는. 오늘이지.” + +“엑기 미친 놈, 거짓말 말아.” + +“거짓말은 왜, 참말로 죽었어, 참말로... 마누라 시체를 집어 뻐들쳐놓고 내가 술을 먹다니, 내가 죽일 놈이야, 죽일 놈이야.”하고 김 첨지는 엉엉 소리를 내어 운다. + +치삼은 흥이 조금 깨어지는 얼굴로, “원 이 사람이, 참말을 하나 거짓말을 하나. 그러면 집으로 가세, 가.”하고 우는 이의 팔을 잡아당기었다. + +치삼의 끄는 손을 뿌리치더니 김 첨지는 눈물이 글썽글썽한 눈으로 싱그레 웃는다. + +“죽기는 누가 죽어.”하고 득의가 양양. + +“죽기는 왜 죽어, 생때같이 살아만 있단다. 그 오라질 년이 밥을 죽이지. 인제 나한테 속았다.”하고 어린애 모양으로 손뼉을 치며 웃는다. + +“이 사람이 정말 미쳤단 말인가. 나도 아주먼네가 앓는단 말은 들었는데.”하고, 치삼이도 어느 불안을 느끼는 듯이 김 첨지에게 또 돌아가라고 권하였다. + +“안 죽었어, 안 죽었대도그래.” + +김 첨지는 홧증을 내며 확신있게 소리를 질렀으되 그 소리엔 안 죽은 것을 믿으려고 애쓰는 가락이 있었다. 기어이 일 원어치를 채워서 곱배기 한 잔씩 더 먹고 나왔다. 궂은 비는 의연히 추적추적 내린다. + +김 첨지는 취중에도 설렁탕을 사가지고 집에 다달았다. 집이라 해도 물론 셋집이요, 또 집 전체를 세든 게 아니라 안과 뚝떨어진 행랑방 한 간을 빌려 든 것인데 물을 길어대고 한 달에 일 원씩 내는 터이다. 만일 김 첨지가 주기를 띠지 않았던들 한 발을 대문에 들여놓았을 제 그곳을 지배하는 무시무시한 정적(靜寂) - 폭풍우가 지나간 뒤의 바다 같은 정적에 다리가 떨렸으리라. + +쿨룩거리는 기침 소리도 들을 수 없다. 그르렁거리는 숨소리조차 들을 수 없다. 다만 이 무덤같은 침묵을 깨뜨리는 - 깨뜨린다느니보다 한층 더 침묵을 깊게 하고 불길하게 하는 빡빡하는 그윽한 소리, 어린애의 젖 빠는 소리가 날 뿐이다. 만일 청각(聽覺)이 예민한 이 같으면 그 빡빡 소리는 빨 따름이요, 꿀떡꿀떡 하고 젖 넘어가는 소리가 없으니 빈 젖을 빤다는 것도 짐작할는지 모르리라. + +혹은 김 첨지도 이 불길한 침묵을 짐작했는지도 모른다. 그렇지 않으면 대문에 들어서자마자 전에 없이, “이 난장 맞을 년, 남편이 들어오는데 나와보지도 않아, 이 오라질 년.”이라고 고함을 친 게 수상하다. 이 고함이야말로 제 몸을 엄습해오는 무시무시한 증을 쫓아버리려는 허장성세(虛張聲勢)인 까닭이다. + +하여간 김 첨지는 방문을 왈칵 열었다. 구역을 나게 하는 추기 - 떨어진 삿자리 밑에서 나온 먼지내, 빨지 않은 기저귀에서 나는 똥내와 오줌내, 가지각색 때가 케케히 앉은 옷내, 병인의 땀 썩은 내가 섞인 추기가 무딘 김 첨지의 코를 찔렀다. + +방안에 들어서며 설렁탕을 한구석에 놓을 사이도 없이 주정군은 목청을 있는 대로 다 내어 호통을 쳤다. + +“이런 오라질 년, 주야장천(晝夜長川) 누워만 있으면 제일이야! 남편이 와도 일어나지를 못해.”라는 소리와 함께 발길로 누운 이의 다리를 몹시 찼다. 그러나 발길에 채이는 건 사람의 살이 아니고 나무등걸과 같은 느낌이 있었다. 이때에 빽빽 소리가 응아 소리로 변하였다. 개똥이가 물었던 젖을 빼어놓고 운다. 운대도 온 얼굴을 찡그려 붙여서, 운다는 표정을 할 뿐이다. 응아 소리도 입에서 나는 게 아니고 마치 뱃속에서 나는 듯하였다. 울다가 울다가 목도 잠겼고 또 울 기운조차 시진한 것 같다. + +발로 차도 그 보람이 없는 걸 보자 남편은 아내의 머리맡으로 달려들어 그야말로 까치집 같은 환자의 머리를 꺼들어 흔들며, “이 년아, 말을 해, 말을! 입이 붙었어, 이 오라질 년!” + +“…” + +“으응, 이것 봐, 아무 말이 없네.” +“…” + +“이년아, 죽었단 말이냐, 왜 말이 없어.” + +“…” + +“으응. 또 대답이 없네, 정말 죽었나버이.” + +이러다가 누운 이의 흰 창을 덮은, 위로 치뜬 눈을 알아보자마자, “이 눈깔! 이 눈깔! 왜 나를 바라보지 못하고 천정만 보느냐, 응.”하는 말 끝엔 목이 메었다. 그러자 산 사람의 눈에서 떨어진 닭의 똥 같은 눈물이 죽은 이의 뻣뻣한 얼굴을 어룽어룽 적시었다. 문득 김 첨지는 미칠 듯이 제 얼굴을 죽은 이의 얼굴에 한테 비비대며 중얼거렸다. + +“설렁탕을 사다놓았는데 왜 먹지를 못하니, 왜 먹지를 못하니... 괴상하게도 오늘은! 운수가 좋더니만... ” diff --git a/vendor/golang.org/x/text/encoding/traditionalchinese/all_test.go b/vendor/golang.org/x/text/encoding/traditionalchinese/all_test.go new file mode 100644 index 0000000000..e779b691e4 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/traditionalchinese/all_test.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 traditionalchinese + +import ( + "testing" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal" + "golang.org/x/text/transform" +) + +func dec(e encoding.Encoding) (dir string, t transform.Transformer, err error) { + return "Decode", e.NewDecoder(), nil +} +func enc(e encoding.Encoding) (dir string, t transform.Transformer, err error) { + return "Encode", e.NewEncoder(), internal.ErrASCIIReplacement +} + +func TestNonRepertoire(t *testing.T) { + testCases := []struct { + init func(e encoding.Encoding) (string, transform.Transformer, error) + e encoding.Encoding + src, want string + }{ + {dec, Big5, "\x81\x40", "\ufffd"}, + + {enc, Big5, "갂", ""}, + {enc, Big5, "a갂", "a"}, + {enc, Big5, "\u43f0갂", "\x87@"}, + } + for _, tc := range testCases { + dir, tr, wantErr := tc.init(tc.e) + + dst, _, err := transform.String(tr, tc.src) + if err != wantErr { + t.Errorf("%s %v(%q): got %v; want %v", dir, tc.e, tc.src, err, wantErr) + } + if got := string(dst); got != tc.want { + t.Errorf("%s %v(%q):\ngot %q\nwant %q", dir, tc.e, tc.src, got, tc.want) + } + } +} diff --git a/vendor/golang.org/x/text/encoding/traditionalchinese/big5.go b/vendor/golang.org/x/text/encoding/traditionalchinese/big5.go new file mode 100644 index 0000000000..275821f5db --- /dev/null +++ b/vendor/golang.org/x/text/encoding/traditionalchinese/big5.go @@ -0,0 +1,198 @@ +// Copyright 2013 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 traditionalchinese + +import ( + "errors" + "unicode/utf8" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal" + "golang.org/x/text/encoding/internal/identifier" + "golang.org/x/text/transform" +) + +// All is a list of all defined encodings in this package. +var All = []encoding.Encoding{Big5} + +// Big5 is the Big5 encoding, also known as Code Page 950. +var Big5 encoding.Encoding = &big5 + +var big5 = internal.Encoding{ + &internal.SimpleEncoding{big5Decoder{}, big5Encoder{}}, + "Big5", + identifier.Big5, +} + +var errInvalidBig5 = errors.New("traditionalchinese: invalid Big5 encoding") + +type big5Decoder struct{ transform.NopResetter } + +func (big5Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + r, size, s := rune(0), 0, "" +loop: + for ; nSrc < len(src); nSrc += size { + switch c0 := src[nSrc]; { + case c0 < utf8.RuneSelf: + r, size = rune(c0), 1 + + case 0x81 <= c0 && c0 < 0xff: + if nSrc+1 >= len(src) { + err = transform.ErrShortSrc + break loop + } + c1 := src[nSrc+1] + switch { + case 0x40 <= c1 && c1 < 0x7f: + c1 -= 0x40 + case 0xa1 <= c1 && c1 < 0xff: + c1 -= 0x62 + default: + err = errInvalidBig5 + break loop + } + r, size = '\ufffd', 2 + if i := int(c0-0x81)*157 + int(c1); i < len(decode) { + if 1133 <= i && i < 1167 { + // The two-rune special cases for LATIN CAPITAL / SMALL E WITH CIRCUMFLEX + // AND MACRON / CARON are from http://encoding.spec.whatwg.org/#big5 + switch i { + case 1133: + s = "\u00CA\u0304" + goto writeStr + case 1135: + s = "\u00CA\u030C" + goto writeStr + case 1164: + s = "\u00EA\u0304" + goto writeStr + case 1166: + s = "\u00EA\u030C" + goto writeStr + } + } + r = rune(decode[i]) + if r == 0 { + r = '\ufffd' + } + } + + default: + err = errInvalidBig5 + break loop + } + + if nDst+utf8.RuneLen(r) > len(dst) { + err = transform.ErrShortDst + break loop + } + nDst += utf8.EncodeRune(dst[nDst:], r) + continue loop + + writeStr: + if nDst+len(s) > len(dst) { + err = transform.ErrShortDst + break loop + } + nDst += copy(dst[nDst:], s) + continue loop + } + if atEOF && err == transform.ErrShortSrc { + err = errInvalidBig5 + } + return nDst, nSrc, err +} + +type big5Encoder struct{ transform.NopResetter } + +func (big5Encoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + r, size := rune(0), 0 + for ; nSrc < len(src); nSrc += size { + r = rune(src[nSrc]) + + // Decode a 1-byte rune. + if r < utf8.RuneSelf { + size = 1 + if nDst >= len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst] = uint8(r) + nDst++ + continue + + } else { + // Decode a multi-byte rune. + r, size = utf8.DecodeRune(src[nSrc:]) + if size == 1 { + // All valid runes of size 1 (those below utf8.RuneSelf) were + // handled above. We have invalid UTF-8 or we haven't seen the + // full character yet. + if !atEOF && !utf8.FullRune(src[nSrc:]) { + err = transform.ErrShortSrc + break + } + } + } + + if r >= utf8.RuneSelf { + // func init checks that the switch covers all tables. + switch { + case encode0Low <= r && r < encode0High: + if r = rune(encode0[r-encode0Low]); r != 0 { + goto write2 + } + case encode1Low <= r && r < encode1High: + if r = rune(encode1[r-encode1Low]); r != 0 { + goto write2 + } + case encode2Low <= r && r < encode2High: + if r = rune(encode2[r-encode2Low]); r != 0 { + goto write2 + } + case encode3Low <= r && r < encode3High: + if r = rune(encode3[r-encode3Low]); r != 0 { + goto write2 + } + case encode4Low <= r && r < encode4High: + if r = rune(encode4[r-encode4Low]); r != 0 { + goto write2 + } + case encode5Low <= r && r < encode5High: + if r = rune(encode5[r-encode5Low]); r != 0 { + goto write2 + } + case encode6Low <= r && r < encode6High: + if r = rune(encode6[r-encode6Low]); r != 0 { + goto write2 + } + case encode7Low <= r && r < encode7High: + if r = rune(encode7[r-encode7Low]); r != 0 { + goto write2 + } + } + err = internal.ErrASCIIReplacement + break + } + + write2: + if nDst+2 > len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst+0] = uint8(r >> 8) + dst[nDst+1] = uint8(r) + nDst += 2 + continue + } + return nDst, nSrc, err +} + +func init() { + // Check that the hard-coded encode switch covers all tables. + if numEncodeTables != 8 { + panic("bad numEncodeTables") + } +} diff --git a/vendor/golang.org/x/text/encoding/traditionalchinese/maketables.go b/vendor/golang.org/x/text/encoding/traditionalchinese/maketables.go new file mode 100644 index 0000000000..cf7fdb31a5 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/traditionalchinese/maketables.go @@ -0,0 +1,140 @@ +// Copyright 2013 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 + +// This program generates tables.go: +// go run maketables.go | gofmt > tables.go + +import ( + "bufio" + "fmt" + "log" + "net/http" + "sort" + "strings" +) + +func main() { + fmt.Printf("// generated by go run maketables.go; DO NOT EDIT\n\n") + fmt.Printf("// Package traditionalchinese provides Traditional Chinese encodings such as Big5.\n") + fmt.Printf(`package traditionalchinese // import "golang.org/x/text/encoding/traditionalchinese"` + "\n\n") + + res, err := http.Get("http://encoding.spec.whatwg.org/index-big5.txt") + if err != nil { + log.Fatalf("Get: %v", err) + } + defer res.Body.Close() + + mapping := [65536]uint32{} + reverse := [65536 * 4]uint16{} + + scanner := bufio.NewScanner(res.Body) + for scanner.Scan() { + s := strings.TrimSpace(scanner.Text()) + if s == "" || s[0] == '#' { + continue + } + x, y := uint16(0), uint32(0) + if _, err := fmt.Sscanf(s, "%d 0x%x", &x, &y); err != nil { + log.Fatalf("could not parse %q", s) + } + if x < 0 || 126*157 <= x { + log.Fatalf("Big5 code %d is out of range", x) + } + mapping[x] = y + + // The WHATWG spec http://encoding.spec.whatwg.org/#indexes says that + // "The index pointer for code point in index is the first pointer + // corresponding to code point in index", which would normally mean + // that the code below should be guarded by "if reverse[y] == 0", but + // last instead of first seems to match the behavior of + // "iconv -f UTF-8 -t BIG5". For example, U+8005 者 occurs twice in + // http://encoding.spec.whatwg.org/index-big5.txt, as index 2148 + // (encoded as "\x8e\xcd") and index 6543 (encoded as "\xaa\xcc") + // and "echo 者 | iconv -f UTF-8 -t BIG5 | xxd" gives "\xaa\xcc". + c0, c1 := x/157, x%157 + if c1 < 0x3f { + c1 += 0x40 + } else { + c1 += 0x62 + } + reverse[y] = (0x81+c0)<<8 | c1 + } + if err := scanner.Err(); err != nil { + log.Fatalf("scanner error: %v", err) + } + + fmt.Printf("// decode is the decoding table from Big5 code to Unicode.\n") + fmt.Printf("// It is defined at http://encoding.spec.whatwg.org/index-big5.txt\n") + fmt.Printf("var decode = [...]uint32{\n") + for i, v := range mapping { + if v != 0 { + fmt.Printf("\t%d: 0x%08X,\n", i, v) + } + } + fmt.Printf("}\n\n") + + // Any run of at least separation continuous zero entries in the reverse map will + // be a separate encode table. + const separation = 1024 + + intervals := []interval(nil) + low, high := -1, -1 + for i, v := range reverse { + if v == 0 { + continue + } + if low < 0 { + low = i + } else if i-high >= separation { + if high >= 0 { + intervals = append(intervals, interval{low, high}) + } + low = i + } + high = i + 1 + } + if high >= 0 { + intervals = append(intervals, interval{low, high}) + } + sort.Sort(byDecreasingLength(intervals)) + + fmt.Printf("const numEncodeTables = %d\n\n", len(intervals)) + fmt.Printf("// encodeX are the encoding tables from Unicode to Big5 code,\n") + fmt.Printf("// sorted by decreasing length.\n") + for i, v := range intervals { + fmt.Printf("// encode%d: %5d entries for runes in [%6d, %6d).\n", i, v.len(), v.low, v.high) + } + fmt.Printf("\n") + + for i, v := range intervals { + fmt.Printf("const encode%dLow, encode%dHigh = %d, %d\n\n", i, i, v.low, v.high) + fmt.Printf("var encode%d = [...]uint16{\n", i) + for j := v.low; j < v.high; j++ { + x := reverse[j] + if x == 0 { + continue + } + fmt.Printf("\t%d-%d: 0x%04X,\n", j, v.low, x) + } + fmt.Printf("}\n\n") + } +} + +// interval is a half-open interval [low, high). +type interval struct { + low, high int +} + +func (i interval) len() int { return i.high - i.low } + +// byDecreasingLength sorts intervals by decreasing length. +type byDecreasingLength []interval + +func (b byDecreasingLength) Len() int { return len(b) } +func (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() } +func (b byDecreasingLength) Swap(i, j int) { b[i], b[j] = b[j], b[i] } diff --git a/vendor/golang.org/x/text/encoding/traditionalchinese/tables.go b/vendor/golang.org/x/text/encoding/traditionalchinese/tables.go new file mode 100644 index 0000000000..d909e38e5e --- /dev/null +++ b/vendor/golang.org/x/text/encoding/traditionalchinese/tables.go @@ -0,0 +1,37142 @@ +// generated by go run maketables.go; DO NOT EDIT + +// Package traditionalchinese provides Traditional Chinese encodings such as Big5. +package traditionalchinese // import "golang.org/x/text/encoding/traditionalchinese" + +// decode is the decoding table from Big5 code to Unicode. +// It is defined at http://encoding.spec.whatwg.org/index-big5.txt +var decode = [...]uint32{ + 942: 0x000043F0, + 943: 0x00004C32, + 944: 0x00004603, + 945: 0x000045A6, + 946: 0x00004578, + 947: 0x00027267, + 948: 0x00004D77, + 949: 0x000045B3, + 950: 0x00027CB1, + 951: 0x00004CE2, + 952: 0x00027CC5, + 953: 0x00003B95, + 954: 0x00004736, + 955: 0x00004744, + 956: 0x00004C47, + 957: 0x00004C40, + 958: 0x000242BF, + 959: 0x00023617, + 960: 0x00027352, + 961: 0x00026E8B, + 962: 0x000270D2, + 963: 0x00004C57, + 964: 0x0002A351, + 965: 0x0000474F, + 966: 0x000045DA, + 967: 0x00004C85, + 968: 0x00027C6C, + 969: 0x00004D07, + 970: 0x00004AA4, + 971: 0x000046A1, + 972: 0x00026B23, + 973: 0x00007225, + 974: 0x00025A54, + 975: 0x00021A63, + 976: 0x00023E06, + 977: 0x00023F61, + 978: 0x0000664D, + 979: 0x000056FB, + 981: 0x00007D95, + 982: 0x0000591D, + 983: 0x00028BB9, + 984: 0x00003DF4, + 985: 0x00009734, + 986: 0x00027BEF, + 987: 0x00005BDB, + 988: 0x00021D5E, + 989: 0x00005AA4, + 990: 0x00003625, + 991: 0x00029EB0, + 992: 0x00005AD1, + 993: 0x00005BB7, + 994: 0x00005CFC, + 995: 0x0000676E, + 996: 0x00008593, + 997: 0x00029945, + 998: 0x00007461, + 999: 0x0000749D, + 1000: 0x00003875, + 1001: 0x00021D53, + 1002: 0x0002369E, + 1003: 0x00026021, + 1004: 0x00003EEC, + 1005: 0x000258DE, + 1006: 0x00003AF5, + 1007: 0x00007AFC, + 1008: 0x00009F97, + 1009: 0x00024161, + 1010: 0x0002890D, + 1011: 0x000231EA, + 1012: 0x00020A8A, + 1013: 0x0002325E, + 1014: 0x0000430A, + 1015: 0x00008484, + 1016: 0x00009F96, + 1017: 0x0000942F, + 1018: 0x00004930, + 1019: 0x00008613, + 1020: 0x00005896, + 1021: 0x0000974A, + 1022: 0x00009218, + 1023: 0x000079D0, + 1024: 0x00007A32, + 1025: 0x00006660, + 1026: 0x00006A29, + 1027: 0x0000889D, + 1028: 0x0000744C, + 1029: 0x00007BC5, + 1030: 0x00006782, + 1031: 0x00007A2C, + 1032: 0x0000524F, + 1033: 0x00009046, + 1034: 0x000034E6, + 1035: 0x000073C4, + 1036: 0x00025DB9, + 1037: 0x000074C6, + 1038: 0x00009FC7, + 1039: 0x000057B3, + 1040: 0x0000492F, + 1041: 0x0000544C, + 1042: 0x00004131, + 1043: 0x0002368E, + 1044: 0x00005818, + 1045: 0x00007A72, + 1046: 0x00027B65, + 1047: 0x00008B8F, + 1048: 0x000046AE, + 1049: 0x00026E88, + 1050: 0x00004181, + 1051: 0x00025D99, + 1052: 0x00007BAE, + 1053: 0x000224BC, + 1054: 0x00009FC8, + 1055: 0x000224C1, + 1056: 0x000224C9, + 1057: 0x000224CC, + 1058: 0x00009FC9, + 1059: 0x00008504, + 1060: 0x000235BB, + 1061: 0x000040B4, + 1062: 0x00009FCA, + 1063: 0x000044E1, + 1064: 0x0002ADFF, + 1065: 0x000062C1, + 1066: 0x0000706E, + 1067: 0x00009FCB, + 1099: 0x000031C0, + 1100: 0x000031C1, + 1101: 0x000031C2, + 1102: 0x000031C3, + 1103: 0x000031C4, + 1104: 0x0002010C, + 1105: 0x000031C5, + 1106: 0x000200D1, + 1107: 0x000200CD, + 1108: 0x000031C6, + 1109: 0x000031C7, + 1110: 0x000200CB, + 1111: 0x00021FE8, + 1112: 0x000031C8, + 1113: 0x000200CA, + 1114: 0x000031C9, + 1115: 0x000031CA, + 1116: 0x000031CB, + 1117: 0x000031CC, + 1118: 0x0002010E, + 1119: 0x000031CD, + 1120: 0x000031CE, + 1121: 0x00000100, + 1122: 0x000000C1, + 1123: 0x000001CD, + 1124: 0x000000C0, + 1125: 0x00000112, + 1126: 0x000000C9, + 1127: 0x0000011A, + 1128: 0x000000C8, + 1129: 0x0000014C, + 1130: 0x000000D3, + 1131: 0x000001D1, + 1132: 0x000000D2, + 1134: 0x00001EBE, + 1136: 0x00001EC0, + 1137: 0x000000CA, + 1138: 0x00000101, + 1139: 0x000000E1, + 1140: 0x000001CE, + 1141: 0x000000E0, + 1142: 0x00000251, + 1143: 0x00000113, + 1144: 0x000000E9, + 1145: 0x0000011B, + 1146: 0x000000E8, + 1147: 0x0000012B, + 1148: 0x000000ED, + 1149: 0x000001D0, + 1150: 0x000000EC, + 1151: 0x0000014D, + 1152: 0x000000F3, + 1153: 0x000001D2, + 1154: 0x000000F2, + 1155: 0x0000016B, + 1156: 0x000000FA, + 1157: 0x000001D4, + 1158: 0x000000F9, + 1159: 0x000001D6, + 1160: 0x000001D8, + 1161: 0x000001DA, + 1162: 0x000001DC, + 1163: 0x000000FC, + 1165: 0x00001EBF, + 1167: 0x00001EC1, + 1168: 0x000000EA, + 1169: 0x00000261, + 1170: 0x000023DA, + 1171: 0x000023DB, + 1256: 0x0002A3A9, + 1257: 0x00021145, + 1259: 0x0000650A, + 1262: 0x00004E3D, + 1263: 0x00006EDD, + 1264: 0x00009D4E, + 1265: 0x000091DF, + 1268: 0x00027735, + 1269: 0x00006491, + 1270: 0x00004F1A, + 1271: 0x00004F28, + 1272: 0x00004FA8, + 1273: 0x00005156, + 1274: 0x00005174, + 1275: 0x0000519C, + 1276: 0x000051E4, + 1277: 0x000052A1, + 1278: 0x000052A8, + 1279: 0x0000533B, + 1280: 0x0000534E, + 1281: 0x000053D1, + 1282: 0x000053D8, + 1283: 0x000056E2, + 1284: 0x000058F0, + 1285: 0x00005904, + 1286: 0x00005907, + 1287: 0x00005932, + 1288: 0x00005934, + 1289: 0x00005B66, + 1290: 0x00005B9E, + 1291: 0x00005B9F, + 1292: 0x00005C9A, + 1293: 0x00005E86, + 1294: 0x0000603B, + 1295: 0x00006589, + 1296: 0x000067FE, + 1297: 0x00006804, + 1298: 0x00006865, + 1299: 0x00006D4E, + 1300: 0x000070BC, + 1301: 0x00007535, + 1302: 0x00007EA4, + 1303: 0x00007EAC, + 1304: 0x00007EBA, + 1305: 0x00007EC7, + 1306: 0x00007ECF, + 1307: 0x00007EDF, + 1308: 0x00007F06, + 1309: 0x00007F37, + 1310: 0x0000827A, + 1311: 0x000082CF, + 1312: 0x0000836F, + 1313: 0x000089C6, + 1314: 0x00008BBE, + 1315: 0x00008BE2, + 1316: 0x00008F66, + 1317: 0x00008F67, + 1318: 0x00008F6E, + 1319: 0x00007411, + 1320: 0x00007CFC, + 1321: 0x00007DCD, + 1322: 0x00006946, + 1323: 0x00007AC9, + 1324: 0x00005227, + 1329: 0x0000918C, + 1330: 0x000078B8, + 1331: 0x0000915E, + 1332: 0x000080BC, + 1334: 0x00008D0B, + 1335: 0x000080F6, + 1336: 0x000209E7, + 1339: 0x0000809F, + 1340: 0x00009EC7, + 1341: 0x00004CCD, + 1342: 0x00009DC9, + 1343: 0x00009E0C, + 1344: 0x00004C3E, + 1345: 0x00029DF6, + 1346: 0x0002700E, + 1347: 0x00009E0A, + 1348: 0x0002A133, + 1349: 0x000035C1, + 1351: 0x00006E9A, + 1352: 0x0000823E, + 1353: 0x00007519, + 1355: 0x00004911, + 1356: 0x00009A6C, + 1357: 0x00009A8F, + 1358: 0x00009F99, + 1359: 0x00007987, + 1360: 0x0002846C, + 1361: 0x00021DCA, + 1362: 0x000205D0, + 1363: 0x00022AE6, + 1364: 0x00004E24, + 1365: 0x00004E81, + 1366: 0x00004E80, + 1367: 0x00004E87, + 1368: 0x00004EBF, + 1369: 0x00004EEB, + 1370: 0x00004F37, + 1371: 0x0000344C, + 1372: 0x00004FBD, + 1373: 0x00003E48, + 1374: 0x00005003, + 1375: 0x00005088, + 1376: 0x0000347D, + 1377: 0x00003493, + 1378: 0x000034A5, + 1379: 0x00005186, + 1380: 0x00005905, + 1381: 0x000051DB, + 1382: 0x000051FC, + 1383: 0x00005205, + 1384: 0x00004E89, + 1385: 0x00005279, + 1386: 0x00005290, + 1387: 0x00005327, + 1388: 0x000035C7, + 1389: 0x000053A9, + 1390: 0x00003551, + 1391: 0x000053B0, + 1392: 0x00003553, + 1393: 0x000053C2, + 1394: 0x00005423, + 1395: 0x0000356D, + 1396: 0x00003572, + 1397: 0x00003681, + 1398: 0x00005493, + 1399: 0x000054A3, + 1400: 0x000054B4, + 1401: 0x000054B9, + 1402: 0x000054D0, + 1403: 0x000054EF, + 1404: 0x00005518, + 1405: 0x00005523, + 1406: 0x00005528, + 1407: 0x00003598, + 1408: 0x0000553F, + 1409: 0x000035A5, + 1410: 0x000035BF, + 1411: 0x000055D7, + 1412: 0x000035C5, + 1413: 0x00027D84, + 1414: 0x00005525, + 1416: 0x00020C42, + 1417: 0x00020D15, + 1418: 0x0002512B, + 1419: 0x00005590, + 1420: 0x00022CC6, + 1421: 0x000039EC, + 1422: 0x00020341, + 1423: 0x00008E46, + 1424: 0x00024DB8, + 1425: 0x000294E5, + 1426: 0x00004053, + 1427: 0x000280BE, + 1428: 0x0000777A, + 1429: 0x00022C38, + 1430: 0x00003A34, + 1431: 0x000047D5, + 1432: 0x0002815D, + 1433: 0x000269F2, + 1434: 0x00024DEA, + 1435: 0x000064DD, + 1436: 0x00020D7C, + 1437: 0x00020FB4, + 1438: 0x00020CD5, + 1439: 0x000210F4, + 1440: 0x0000648D, + 1441: 0x00008E7E, + 1442: 0x00020E96, + 1443: 0x00020C0B, + 1444: 0x00020F64, + 1445: 0x00022CA9, + 1446: 0x00028256, + 1447: 0x000244D3, + 1449: 0x00020D46, + 1450: 0x00029A4D, + 1451: 0x000280E9, + 1452: 0x000047F4, + 1453: 0x00024EA7, + 1454: 0x00022CC2, + 1455: 0x00009AB2, + 1456: 0x00003A67, + 1457: 0x000295F4, + 1458: 0x00003FED, + 1459: 0x00003506, + 1460: 0x000252C7, + 1461: 0x000297D4, + 1462: 0x000278C8, + 1463: 0x00022D44, + 1464: 0x00009D6E, + 1465: 0x00009815, + 1467: 0x000043D9, + 1468: 0x000260A5, + 1469: 0x000064B4, + 1470: 0x000054E3, + 1471: 0x00022D4C, + 1472: 0x00022BCA, + 1473: 0x00021077, + 1474: 0x000039FB, + 1475: 0x0002106F, + 1476: 0x000266DA, + 1477: 0x00026716, + 1478: 0x000279A0, + 1479: 0x000064EA, + 1480: 0x00025052, + 1481: 0x00020C43, + 1482: 0x00008E68, + 1483: 0x000221A1, + 1484: 0x00028B4C, + 1485: 0x00020731, + 1487: 0x0000480B, + 1488: 0x000201A9, + 1489: 0x00003FFA, + 1490: 0x00005873, + 1491: 0x00022D8D, + 1493: 0x000245C8, + 1494: 0x000204FC, + 1495: 0x00026097, + 1496: 0x00020F4C, + 1497: 0x00020D96, + 1498: 0x00005579, + 1499: 0x000040BB, + 1500: 0x000043BA, + 1502: 0x00004AB4, + 1503: 0x00022A66, + 1504: 0x0002109D, + 1505: 0x000081AA, + 1506: 0x000098F5, + 1507: 0x00020D9C, + 1508: 0x00006379, + 1509: 0x000039FE, + 1510: 0x00022775, + 1511: 0x00008DC0, + 1512: 0x000056A1, + 1513: 0x0000647C, + 1514: 0x00003E43, + 1516: 0x0002A601, + 1517: 0x00020E09, + 1518: 0x00022ACF, + 1519: 0x00022CC9, + 1521: 0x000210C8, + 1522: 0x000239C2, + 1523: 0x00003992, + 1524: 0x00003A06, + 1525: 0x0002829B, + 1526: 0x00003578, + 1527: 0x00025E49, + 1528: 0x000220C7, + 1529: 0x00005652, + 1530: 0x00020F31, + 1531: 0x00022CB2, + 1532: 0x00029720, + 1533: 0x000034BC, + 1534: 0x00006C3D, + 1535: 0x00024E3B, + 1538: 0x00027574, + 1539: 0x00022E8B, + 1540: 0x00022208, + 1541: 0x0002A65B, + 1542: 0x00028CCD, + 1543: 0x00020E7A, + 1544: 0x00020C34, + 1545: 0x0002681C, + 1546: 0x00007F93, + 1547: 0x000210CF, + 1548: 0x00022803, + 1549: 0x00022939, + 1550: 0x000035FB, + 1551: 0x000251E3, + 1552: 0x00020E8C, + 1553: 0x00020F8D, + 1554: 0x00020EAA, + 1555: 0x00003F93, + 1556: 0x00020F30, + 1557: 0x00020D47, + 1558: 0x0002114F, + 1559: 0x00020E4C, + 1561: 0x00020EAB, + 1562: 0x00020BA9, + 1563: 0x00020D48, + 1564: 0x000210C0, + 1565: 0x0002113D, + 1566: 0x00003FF9, + 1567: 0x00022696, + 1568: 0x00006432, + 1569: 0x00020FAD, + 1570: 0x000233F4, + 1571: 0x00027639, + 1572: 0x00022BCE, + 1573: 0x00020D7E, + 1574: 0x00020D7F, + 1575: 0x00022C51, + 1576: 0x00022C55, + 1577: 0x00003A18, + 1578: 0x00020E98, + 1579: 0x000210C7, + 1580: 0x00020F2E, + 1581: 0x0002A632, + 1582: 0x00026B50, + 1583: 0x00028CD2, + 1584: 0x00028D99, + 1585: 0x00028CCA, + 1586: 0x000095AA, + 1587: 0x000054CC, + 1588: 0x000082C4, + 1589: 0x000055B9, + 1591: 0x00029EC3, + 1592: 0x00009C26, + 1593: 0x00009AB6, + 1594: 0x0002775E, + 1595: 0x00022DEE, + 1596: 0x00007140, + 1597: 0x0000816D, + 1598: 0x000080EC, + 1599: 0x00005C1C, + 1600: 0x00026572, + 1601: 0x00008134, + 1602: 0x00003797, + 1603: 0x0000535F, + 1604: 0x000280BD, + 1605: 0x000091B6, + 1606: 0x00020EFA, + 1607: 0x00020E0F, + 1608: 0x00020E77, + 1609: 0x00020EFB, + 1610: 0x000035DD, + 1611: 0x00024DEB, + 1612: 0x00003609, + 1613: 0x00020CD6, + 1614: 0x000056AF, + 1615: 0x000227B5, + 1616: 0x000210C9, + 1617: 0x00020E10, + 1618: 0x00020E78, + 1619: 0x00021078, + 1620: 0x00021148, + 1621: 0x00028207, + 1622: 0x00021455, + 1623: 0x00020E79, + 1624: 0x00024E50, + 1625: 0x00022DA4, + 1626: 0x00005A54, + 1627: 0x0002101D, + 1628: 0x0002101E, + 1629: 0x000210F5, + 1630: 0x000210F6, + 1631: 0x0000579C, + 1632: 0x00020E11, + 1633: 0x00027694, + 1634: 0x000282CD, + 1635: 0x00020FB5, + 1636: 0x00020E7B, + 1637: 0x0002517E, + 1638: 0x00003703, + 1639: 0x00020FB6, + 1640: 0x00021180, + 1641: 0x000252D8, + 1642: 0x0002A2BD, + 1643: 0x000249DA, + 1644: 0x0002183A, + 1645: 0x00024177, + 1646: 0x0002827C, + 1647: 0x00005899, + 1648: 0x00005268, + 1649: 0x0000361A, + 1650: 0x0002573D, + 1651: 0x00007BB2, + 1652: 0x00005B68, + 1653: 0x00004800, + 1654: 0x00004B2C, + 1655: 0x00009F27, + 1656: 0x000049E7, + 1657: 0x00009C1F, + 1658: 0x00009B8D, + 1659: 0x00025B74, + 1660: 0x0002313D, + 1661: 0x000055FB, + 1662: 0x000035F2, + 1663: 0x00005689, + 1664: 0x00004E28, + 1665: 0x00005902, + 1666: 0x00021BC1, + 1667: 0x0002F878, + 1668: 0x00009751, + 1669: 0x00020086, + 1670: 0x00004E5B, + 1671: 0x00004EBB, + 1672: 0x0000353E, + 1673: 0x00005C23, + 1674: 0x00005F51, + 1675: 0x00005FC4, + 1676: 0x000038FA, + 1677: 0x0000624C, + 1678: 0x00006535, + 1679: 0x00006B7A, + 1680: 0x00006C35, + 1681: 0x00006C3A, + 1682: 0x0000706C, + 1683: 0x0000722B, + 1684: 0x00004E2C, + 1685: 0x000072AD, + 1686: 0x000248E9, + 1687: 0x00007F52, + 1688: 0x0000793B, + 1689: 0x00007CF9, + 1690: 0x00007F53, + 1691: 0x0002626A, + 1692: 0x000034C1, + 1694: 0x0002634B, + 1695: 0x00008002, + 1696: 0x00008080, + 1697: 0x00026612, + 1698: 0x00026951, + 1699: 0x0000535D, + 1700: 0x00008864, + 1701: 0x000089C1, + 1702: 0x000278B2, + 1703: 0x00008BA0, + 1704: 0x00008D1D, + 1705: 0x00009485, + 1706: 0x00009578, + 1707: 0x0000957F, + 1708: 0x000095E8, + 1709: 0x00028E0F, + 1710: 0x000097E6, + 1711: 0x00009875, + 1712: 0x000098CE, + 1713: 0x000098DE, + 1714: 0x00009963, + 1715: 0x00029810, + 1716: 0x00009C7C, + 1717: 0x00009E1F, + 1718: 0x00009EC4, + 1719: 0x00006B6F, + 1720: 0x0000F907, + 1721: 0x00004E37, + 1722: 0x00020087, + 1723: 0x0000961D, + 1724: 0x00006237, + 1725: 0x000094A2, + 1727: 0x0000503B, + 1728: 0x00006DFE, + 1729: 0x00029C73, + 1730: 0x00009FA6, + 1731: 0x00003DC9, + 1732: 0x0000888F, + 1733: 0x0002414E, + 1734: 0x00007077, + 1735: 0x00005CF5, + 1736: 0x00004B20, + 1737: 0x000251CD, + 1738: 0x00003559, + 1739: 0x00025D30, + 1740: 0x00006122, + 1741: 0x00028A32, + 1742: 0x00008FA7, + 1743: 0x000091F6, + 1744: 0x00007191, + 1745: 0x00006719, + 1746: 0x000073BA, + 1747: 0x00023281, + 1748: 0x0002A107, + 1749: 0x00003C8B, + 1750: 0x00021980, + 1751: 0x00004B10, + 1752: 0x000078E4, + 1753: 0x00007402, + 1754: 0x000051AE, + 1755: 0x0002870F, + 1756: 0x00004009, + 1757: 0x00006A63, + 1758: 0x0002A2BA, + 1759: 0x00004223, + 1760: 0x0000860F, + 1761: 0x00020A6F, + 1762: 0x00007A2A, + 1763: 0x00029947, + 1764: 0x00028AEA, + 1765: 0x00009755, + 1766: 0x0000704D, + 1767: 0x00005324, + 1768: 0x0002207E, + 1769: 0x000093F4, + 1770: 0x000076D9, + 1771: 0x000289E3, + 1772: 0x00009FA7, + 1773: 0x000077DD, + 1774: 0x00004EA3, + 1775: 0x00004FF0, + 1776: 0x000050BC, + 1777: 0x00004E2F, + 1778: 0x00004F17, + 1779: 0x00009FA8, + 1780: 0x00005434, + 1781: 0x00007D8B, + 1782: 0x00005892, + 1783: 0x000058D0, + 1784: 0x00021DB6, + 1785: 0x00005E92, + 1786: 0x00005E99, + 1787: 0x00005FC2, + 1788: 0x00022712, + 1789: 0x0000658B, + 1790: 0x000233F9, + 1791: 0x00006919, + 1792: 0x00006A43, + 1793: 0x00023C63, + 1794: 0x00006CFF, + 1796: 0x00007200, + 1797: 0x00024505, + 1798: 0x0000738C, + 1799: 0x00003EDB, + 1800: 0x00024A13, + 1801: 0x00005B15, + 1802: 0x000074B9, + 1803: 0x00008B83, + 1804: 0x00025CA4, + 1805: 0x00025695, + 1806: 0x00007A93, + 1807: 0x00007BEC, + 1808: 0x00007CC3, + 1809: 0x00007E6C, + 1810: 0x000082F8, + 1811: 0x00008597, + 1812: 0x00009FA9, + 1813: 0x00008890, + 1814: 0x00009FAA, + 1815: 0x00008EB9, + 1816: 0x00009FAB, + 1817: 0x00008FCF, + 1818: 0x0000855F, + 1819: 0x000099E0, + 1820: 0x00009221, + 1821: 0x00009FAC, + 1822: 0x00028DB9, + 1823: 0x0002143F, + 1824: 0x00004071, + 1825: 0x000042A2, + 1826: 0x00005A1A, + 1830: 0x00009868, + 1831: 0x0000676B, + 1832: 0x00004276, + 1833: 0x0000573D, + 1835: 0x000085D6, + 1836: 0x0002497B, + 1837: 0x000082BF, + 1838: 0x0002710D, + 1839: 0x00004C81, + 1840: 0x00026D74, + 1841: 0x00005D7B, + 1842: 0x00026B15, + 1843: 0x00026FBE, + 1844: 0x00009FAD, + 1845: 0x00009FAE, + 1846: 0x00005B96, + 1847: 0x00009FAF, + 1848: 0x000066E7, + 1849: 0x00007E5B, + 1850: 0x00006E57, + 1851: 0x000079CA, + 1852: 0x00003D88, + 1853: 0x000044C3, + 1854: 0x00023256, + 1855: 0x00022796, + 1856: 0x0000439A, + 1857: 0x00004536, + 1859: 0x00005CD5, + 1860: 0x00023B1A, + 1861: 0x00008AF9, + 1862: 0x00005C78, + 1863: 0x00003D12, + 1864: 0x00023551, + 1865: 0x00005D78, + 1866: 0x00009FB2, + 1867: 0x00007157, + 1868: 0x00004558, + 1869: 0x000240EC, + 1870: 0x00021E23, + 1871: 0x00004C77, + 1872: 0x00003978, + 1873: 0x0000344A, + 1874: 0x000201A4, + 1875: 0x00026C41, + 1876: 0x00008ACC, + 1877: 0x00004FB4, + 1878: 0x00020239, + 1879: 0x000059BF, + 1880: 0x0000816C, + 1881: 0x00009856, + 1882: 0x000298FA, + 1883: 0x00005F3B, + 1884: 0x00020B9F, + 1886: 0x000221C1, + 1887: 0x0002896D, + 1888: 0x00004102, + 1889: 0x000046BB, + 1890: 0x00029079, + 1891: 0x00003F07, + 1892: 0x00009FB3, + 1893: 0x0002A1B5, + 1894: 0x000040F8, + 1895: 0x000037D6, + 1896: 0x000046F7, + 1897: 0x00026C46, + 1898: 0x0000417C, + 1899: 0x000286B2, + 1900: 0x000273FF, + 1901: 0x0000456D, + 1902: 0x000038D4, + 1903: 0x0002549A, + 1904: 0x00004561, + 1905: 0x0000451B, + 1906: 0x00004D89, + 1907: 0x00004C7B, + 1908: 0x00004D76, + 1909: 0x000045EA, + 1910: 0x00003FC8, + 1911: 0x00024B0F, + 1912: 0x00003661, + 1913: 0x000044DE, + 1914: 0x000044BD, + 1915: 0x000041ED, + 1916: 0x00005D3E, + 1917: 0x00005D48, + 1918: 0x00005D56, + 1919: 0x00003DFC, + 1920: 0x0000380F, + 1921: 0x00005DA4, + 1922: 0x00005DB9, + 1923: 0x00003820, + 1924: 0x00003838, + 1925: 0x00005E42, + 1926: 0x00005EBD, + 1927: 0x00005F25, + 1928: 0x00005F83, + 1929: 0x00003908, + 1930: 0x00003914, + 1931: 0x0000393F, + 1932: 0x0000394D, + 1933: 0x000060D7, + 1934: 0x0000613D, + 1935: 0x00005CE5, + 1936: 0x00003989, + 1937: 0x000061B7, + 1938: 0x000061B9, + 1939: 0x000061CF, + 1940: 0x000039B8, + 1941: 0x0000622C, + 1942: 0x00006290, + 1943: 0x000062E5, + 1944: 0x00006318, + 1945: 0x000039F8, + 1946: 0x000056B1, + 1947: 0x00003A03, + 1948: 0x000063E2, + 1949: 0x000063FB, + 1950: 0x00006407, + 1951: 0x0000645A, + 1952: 0x00003A4B, + 1953: 0x000064C0, + 1954: 0x00005D15, + 1955: 0x00005621, + 1956: 0x00009F9F, + 1957: 0x00003A97, + 1958: 0x00006586, + 1959: 0x00003ABD, + 1960: 0x000065FF, + 1961: 0x00006653, + 1962: 0x00003AF2, + 1963: 0x00006692, + 1964: 0x00003B22, + 1965: 0x00006716, + 1966: 0x00003B42, + 1967: 0x000067A4, + 1968: 0x00006800, + 1969: 0x00003B58, + 1970: 0x0000684A, + 1971: 0x00006884, + 1972: 0x00003B72, + 1973: 0x00003B71, + 1974: 0x00003B7B, + 1975: 0x00006909, + 1976: 0x00006943, + 1977: 0x0000725C, + 1978: 0x00006964, + 1979: 0x0000699F, + 1980: 0x00006985, + 1981: 0x00003BBC, + 1982: 0x000069D6, + 1983: 0x00003BDD, + 1984: 0x00006A65, + 1985: 0x00006A74, + 1986: 0x00006A71, + 1987: 0x00006A82, + 1988: 0x00003BEC, + 1989: 0x00006A99, + 1990: 0x00003BF2, + 1991: 0x00006AAB, + 1992: 0x00006AB5, + 1993: 0x00006AD4, + 1994: 0x00006AF6, + 1995: 0x00006B81, + 1996: 0x00006BC1, + 1997: 0x00006BEA, + 1998: 0x00006C75, + 1999: 0x00006CAA, + 2000: 0x00003CCB, + 2001: 0x00006D02, + 2002: 0x00006D06, + 2003: 0x00006D26, + 2004: 0x00006D81, + 2005: 0x00003CEF, + 2006: 0x00006DA4, + 2007: 0x00006DB1, + 2008: 0x00006E15, + 2009: 0x00006E18, + 2010: 0x00006E29, + 2011: 0x00006E86, + 2012: 0x000289C0, + 2013: 0x00006EBB, + 2014: 0x00006EE2, + 2015: 0x00006EDA, + 2016: 0x00009F7F, + 2017: 0x00006EE8, + 2018: 0x00006EE9, + 2019: 0x00006F24, + 2020: 0x00006F34, + 2021: 0x00003D46, + 2022: 0x00023F41, + 2023: 0x00006F81, + 2024: 0x00006FBE, + 2025: 0x00003D6A, + 2026: 0x00003D75, + 2027: 0x000071B7, + 2028: 0x00005C99, + 2029: 0x00003D8A, + 2030: 0x0000702C, + 2031: 0x00003D91, + 2032: 0x00007050, + 2033: 0x00007054, + 2034: 0x0000706F, + 2035: 0x0000707F, + 2036: 0x00007089, + 2037: 0x00020325, + 2038: 0x000043C1, + 2039: 0x000035F1, + 2040: 0x00020ED8, + 2041: 0x00023ED7, + 2042: 0x000057BE, + 2043: 0x00026ED3, + 2044: 0x0000713E, + 2045: 0x000257E0, + 2046: 0x0000364E, + 2047: 0x000069A2, + 2048: 0x00028BE9, + 2049: 0x00005B74, + 2050: 0x00007A49, + 2051: 0x000258E1, + 2052: 0x000294D9, + 2053: 0x00007A65, + 2054: 0x00007A7D, + 2055: 0x000259AC, + 2056: 0x00007ABB, + 2057: 0x00007AB0, + 2058: 0x00007AC2, + 2059: 0x00007AC3, + 2060: 0x000071D1, + 2061: 0x0002648D, + 2062: 0x000041CA, + 2063: 0x00007ADA, + 2064: 0x00007ADD, + 2065: 0x00007AEA, + 2066: 0x000041EF, + 2067: 0x000054B2, + 2068: 0x00025C01, + 2069: 0x00007B0B, + 2070: 0x00007B55, + 2071: 0x00007B29, + 2072: 0x0002530E, + 2073: 0x00025CFE, + 2074: 0x00007BA2, + 2075: 0x00007B6F, + 2076: 0x0000839C, + 2077: 0x00025BB4, + 2078: 0x00026C7F, + 2079: 0x00007BD0, + 2080: 0x00008421, + 2081: 0x00007B92, + 2082: 0x00007BB8, + 2083: 0x00025D20, + 2084: 0x00003DAD, + 2085: 0x00025C65, + 2086: 0x00008492, + 2087: 0x00007BFA, + 2088: 0x00007C06, + 2089: 0x00007C35, + 2090: 0x00025CC1, + 2091: 0x00007C44, + 2092: 0x00007C83, + 2093: 0x00024882, + 2094: 0x00007CA6, + 2095: 0x0000667D, + 2096: 0x00024578, + 2097: 0x00007CC9, + 2098: 0x00007CC7, + 2099: 0x00007CE6, + 2100: 0x00007C74, + 2101: 0x00007CF3, + 2102: 0x00007CF5, + 2103: 0x00007CCE, + 2104: 0x00007E67, + 2105: 0x0000451D, + 2106: 0x00026E44, + 2107: 0x00007D5D, + 2108: 0x00026ED6, + 2109: 0x0000748D, + 2110: 0x00007D89, + 2111: 0x00007DAB, + 2112: 0x00007135, + 2113: 0x00007DB3, + 2114: 0x00007DD2, + 2115: 0x00024057, + 2116: 0x00026029, + 2117: 0x00007DE4, + 2118: 0x00003D13, + 2119: 0x00007DF5, + 2120: 0x000217F9, + 2121: 0x00007DE5, + 2122: 0x0002836D, + 2123: 0x00007E1D, + 2124: 0x00026121, + 2125: 0x0002615A, + 2126: 0x00007E6E, + 2127: 0x00007E92, + 2128: 0x0000432B, + 2129: 0x0000946C, + 2130: 0x00007E27, + 2131: 0x00007F40, + 2132: 0x00007F41, + 2133: 0x00007F47, + 2134: 0x00007936, + 2135: 0x000262D0, + 2136: 0x000099E1, + 2137: 0x00007F97, + 2138: 0x00026351, + 2139: 0x00007FA3, + 2140: 0x00021661, + 2141: 0x00020068, + 2142: 0x0000455C, + 2143: 0x00023766, + 2144: 0x00004503, + 2145: 0x0002833A, + 2146: 0x00007FFA, + 2147: 0x00026489, + 2148: 0x00008005, + 2149: 0x00008008, + 2150: 0x0000801D, + 2151: 0x00008028, + 2152: 0x0000802F, + 2153: 0x0002A087, + 2154: 0x00026CC3, + 2155: 0x0000803B, + 2156: 0x0000803C, + 2157: 0x00008061, + 2158: 0x00022714, + 2159: 0x00004989, + 2160: 0x00026626, + 2161: 0x00023DE3, + 2162: 0x000266E8, + 2163: 0x00006725, + 2164: 0x000080A7, + 2165: 0x00028A48, + 2166: 0x00008107, + 2167: 0x0000811A, + 2168: 0x000058B0, + 2169: 0x000226F6, + 2170: 0x00006C7F, + 2171: 0x00026498, + 2172: 0x00024FB8, + 2173: 0x000064E7, + 2174: 0x0002148A, + 2175: 0x00008218, + 2176: 0x0002185E, + 2177: 0x00006A53, + 2178: 0x00024A65, + 2179: 0x00024A95, + 2180: 0x0000447A, + 2181: 0x00008229, + 2182: 0x00020B0D, + 2183: 0x00026A52, + 2184: 0x00023D7E, + 2185: 0x00004FF9, + 2186: 0x000214FD, + 2187: 0x000084E2, + 2188: 0x00008362, + 2189: 0x00026B0A, + 2190: 0x000249A7, + 2191: 0x00023530, + 2192: 0x00021773, + 2193: 0x00023DF8, + 2194: 0x000082AA, + 2195: 0x0000691B, + 2196: 0x0002F994, + 2197: 0x000041DB, + 2198: 0x0000854B, + 2199: 0x000082D0, + 2200: 0x0000831A, + 2201: 0x00020E16, + 2202: 0x000217B4, + 2203: 0x000036C1, + 2204: 0x0002317D, + 2205: 0x0002355A, + 2206: 0x0000827B, + 2207: 0x000082E2, + 2208: 0x00008318, + 2209: 0x00023E8B, + 2210: 0x00026DA3, + 2211: 0x00026B05, + 2212: 0x00026B97, + 2213: 0x000235CE, + 2214: 0x00003DBF, + 2215: 0x0000831D, + 2216: 0x000055EC, + 2217: 0x00008385, + 2218: 0x0000450B, + 2219: 0x00026DA5, + 2220: 0x000083AC, + 2221: 0x000083C1, + 2222: 0x000083D3, + 2223: 0x0000347E, + 2224: 0x00026ED4, + 2225: 0x00006A57, + 2226: 0x0000855A, + 2227: 0x00003496, + 2228: 0x00026E42, + 2229: 0x00022EEF, + 2230: 0x00008458, + 2231: 0x00025BE4, + 2232: 0x00008471, + 2233: 0x00003DD3, + 2234: 0x000044E4, + 2235: 0x00006AA7, + 2236: 0x0000844A, + 2237: 0x00023CB5, + 2238: 0x00007958, + 2239: 0x000084A8, + 2240: 0x00026B96, + 2241: 0x00026E77, + 2242: 0x00026E43, + 2243: 0x000084DE, + 2244: 0x0000840F, + 2245: 0x00008391, + 2246: 0x000044A0, + 2247: 0x00008493, + 2248: 0x000084E4, + 2249: 0x00025C91, + 2250: 0x00004240, + 2251: 0x00025CC0, + 2252: 0x00004543, + 2253: 0x00008534, + 2254: 0x00005AF2, + 2255: 0x00026E99, + 2256: 0x00004527, + 2257: 0x00008573, + 2258: 0x00004516, + 2259: 0x000067BF, + 2260: 0x00008616, + 2261: 0x00028625, + 2262: 0x0002863B, + 2263: 0x000085C1, + 2264: 0x00027088, + 2265: 0x00008602, + 2266: 0x00021582, + 2267: 0x000270CD, + 2268: 0x0002F9B2, + 2269: 0x0000456A, + 2270: 0x00008628, + 2271: 0x00003648, + 2272: 0x000218A2, + 2273: 0x000053F7, + 2274: 0x0002739A, + 2275: 0x0000867E, + 2276: 0x00008771, + 2277: 0x0002A0F8, + 2278: 0x000087EE, + 2279: 0x00022C27, + 2280: 0x000087B1, + 2281: 0x000087DA, + 2282: 0x0000880F, + 2283: 0x00005661, + 2284: 0x0000866C, + 2285: 0x00006856, + 2286: 0x0000460F, + 2287: 0x00008845, + 2288: 0x00008846, + 2289: 0x000275E0, + 2290: 0x00023DB9, + 2291: 0x000275E4, + 2292: 0x0000885E, + 2293: 0x0000889C, + 2294: 0x0000465B, + 2295: 0x000088B4, + 2296: 0x000088B5, + 2297: 0x000063C1, + 2298: 0x000088C5, + 2299: 0x00007777, + 2300: 0x0002770F, + 2301: 0x00008987, + 2302: 0x0000898A, + 2303: 0x000089A6, + 2304: 0x000089A9, + 2305: 0x000089A7, + 2306: 0x000089BC, + 2307: 0x00028A25, + 2308: 0x000089E7, + 2309: 0x00027924, + 2310: 0x00027ABD, + 2311: 0x00008A9C, + 2312: 0x00007793, + 2313: 0x000091FE, + 2314: 0x00008A90, + 2315: 0x00027A59, + 2316: 0x00007AE9, + 2317: 0x00027B3A, + 2318: 0x00023F8F, + 2319: 0x00004713, + 2320: 0x00027B38, + 2321: 0x0000717C, + 2322: 0x00008B0C, + 2323: 0x00008B1F, + 2324: 0x00025430, + 2325: 0x00025565, + 2326: 0x00008B3F, + 2327: 0x00008B4C, + 2328: 0x00008B4D, + 2329: 0x00008AA9, + 2330: 0x00024A7A, + 2331: 0x00008B90, + 2332: 0x00008B9B, + 2333: 0x00008AAF, + 2334: 0x000216DF, + 2335: 0x00004615, + 2336: 0x0000884F, + 2337: 0x00008C9B, + 2338: 0x00027D54, + 2339: 0x00027D8F, + 2340: 0x0002F9D4, + 2341: 0x00003725, + 2342: 0x00027D53, + 2343: 0x00008CD6, + 2344: 0x00027D98, + 2345: 0x00027DBD, + 2346: 0x00008D12, + 2347: 0x00008D03, + 2348: 0x00021910, + 2349: 0x00008CDB, + 2350: 0x0000705C, + 2351: 0x00008D11, + 2352: 0x00024CC9, + 2353: 0x00003ED0, + 2354: 0x00008D77, + 2355: 0x00008DA9, + 2356: 0x00028002, + 2357: 0x00021014, + 2358: 0x0002498A, + 2359: 0x00003B7C, + 2360: 0x000281BC, + 2361: 0x0002710C, + 2362: 0x00007AE7, + 2363: 0x00008EAD, + 2364: 0x00008EB6, + 2365: 0x00008EC3, + 2366: 0x000092D4, + 2367: 0x00008F19, + 2368: 0x00008F2D, + 2369: 0x00028365, + 2370: 0x00028412, + 2371: 0x00008FA5, + 2372: 0x00009303, + 2373: 0x0002A29F, + 2374: 0x00020A50, + 2375: 0x00008FB3, + 2376: 0x0000492A, + 2377: 0x000289DE, + 2378: 0x0002853D, + 2379: 0x00023DBB, + 2380: 0x00005EF8, + 2381: 0x00023262, + 2382: 0x00008FF9, + 2383: 0x0002A014, + 2384: 0x000286BC, + 2385: 0x00028501, + 2386: 0x00022325, + 2387: 0x00003980, + 2388: 0x00026ED7, + 2389: 0x00009037, + 2390: 0x0002853C, + 2391: 0x00027ABE, + 2392: 0x00009061, + 2393: 0x0002856C, + 2394: 0x0002860B, + 2395: 0x000090A8, + 2396: 0x00028713, + 2397: 0x000090C4, + 2398: 0x000286E6, + 2399: 0x000090AE, + 2400: 0x000090FD, + 2401: 0x00009167, + 2402: 0x00003AF0, + 2403: 0x000091A9, + 2404: 0x000091C4, + 2405: 0x00007CAC, + 2406: 0x00028933, + 2407: 0x00021E89, + 2408: 0x0000920E, + 2409: 0x00006C9F, + 2410: 0x00009241, + 2411: 0x00009262, + 2412: 0x000255B9, + 2413: 0x000092B9, + 2414: 0x00028AC6, + 2415: 0x00023C9B, + 2416: 0x00028B0C, + 2417: 0x000255DB, + 2418: 0x00020D31, + 2419: 0x0000932C, + 2420: 0x0000936B, + 2421: 0x00028AE1, + 2422: 0x00028BEB, + 2423: 0x0000708F, + 2424: 0x00005AC3, + 2425: 0x00028AE2, + 2426: 0x00028AE5, + 2427: 0x00004965, + 2428: 0x00009244, + 2429: 0x00028BEC, + 2430: 0x00028C39, + 2431: 0x00028BFF, + 2432: 0x00009373, + 2433: 0x0000945B, + 2434: 0x00008EBC, + 2435: 0x00009585, + 2436: 0x000095A6, + 2437: 0x00009426, + 2438: 0x000095A0, + 2439: 0x00006FF6, + 2440: 0x000042B9, + 2441: 0x0002267A, + 2442: 0x000286D8, + 2443: 0x0002127C, + 2444: 0x00023E2E, + 2445: 0x000049DF, + 2446: 0x00006C1C, + 2447: 0x0000967B, + 2448: 0x00009696, + 2449: 0x0000416C, + 2450: 0x000096A3, + 2451: 0x00026ED5, + 2452: 0x000061DA, + 2453: 0x000096B6, + 2454: 0x000078F5, + 2455: 0x00028AE0, + 2456: 0x000096BD, + 2457: 0x000053CC, + 2458: 0x000049A1, + 2459: 0x00026CB8, + 2460: 0x00020274, + 2461: 0x00026410, + 2462: 0x000290AF, + 2463: 0x000290E5, + 2464: 0x00024AD1, + 2465: 0x00021915, + 2466: 0x0002330A, + 2467: 0x00009731, + 2468: 0x00008642, + 2469: 0x00009736, + 2470: 0x00004A0F, + 2471: 0x0000453D, + 2472: 0x00004585, + 2473: 0x00024AE9, + 2474: 0x00007075, + 2475: 0x00005B41, + 2476: 0x0000971B, + 2477: 0x0000975C, + 2478: 0x000291D5, + 2479: 0x00009757, + 2480: 0x00005B4A, + 2481: 0x000291EB, + 2482: 0x0000975F, + 2483: 0x00009425, + 2484: 0x000050D0, + 2485: 0x000230B7, + 2486: 0x000230BC, + 2487: 0x00009789, + 2488: 0x0000979F, + 2489: 0x000097B1, + 2490: 0x000097BE, + 2491: 0x000097C0, + 2492: 0x000097D2, + 2493: 0x000097E0, + 2494: 0x0002546C, + 2495: 0x000097EE, + 2496: 0x0000741C, + 2497: 0x00029433, + 2498: 0x000097FF, + 2499: 0x000097F5, + 2500: 0x0002941D, + 2501: 0x0002797A, + 2502: 0x00004AD1, + 2503: 0x00009834, + 2504: 0x00009833, + 2505: 0x0000984B, + 2506: 0x00009866, + 2507: 0x00003B0E, + 2508: 0x00027175, + 2509: 0x00003D51, + 2510: 0x00020630, + 2511: 0x0002415C, + 2512: 0x00025706, + 2513: 0x000098CA, + 2514: 0x000098B7, + 2515: 0x000098C8, + 2516: 0x000098C7, + 2517: 0x00004AFF, + 2518: 0x00026D27, + 2519: 0x000216D3, + 2520: 0x000055B0, + 2521: 0x000098E1, + 2522: 0x000098E6, + 2523: 0x000098EC, + 2524: 0x00009378, + 2525: 0x00009939, + 2526: 0x00024A29, + 2527: 0x00004B72, + 2528: 0x00029857, + 2529: 0x00029905, + 2530: 0x000099F5, + 2531: 0x00009A0C, + 2532: 0x00009A3B, + 2533: 0x00009A10, + 2534: 0x00009A58, + 2535: 0x00025725, + 2536: 0x000036C4, + 2537: 0x000290B1, + 2538: 0x00029BD5, + 2539: 0x00009AE0, + 2540: 0x00009AE2, + 2541: 0x00029B05, + 2542: 0x00009AF4, + 2543: 0x00004C0E, + 2544: 0x00009B14, + 2545: 0x00009B2D, + 2546: 0x00028600, + 2547: 0x00005034, + 2548: 0x00009B34, + 2549: 0x000269A8, + 2550: 0x000038C3, + 2551: 0x0002307D, + 2552: 0x00009B50, + 2553: 0x00009B40, + 2554: 0x00029D3E, + 2555: 0x00005A45, + 2556: 0x00021863, + 2557: 0x00009B8E, + 2558: 0x0002424B, + 2559: 0x00009C02, + 2560: 0x00009BFF, + 2561: 0x00009C0C, + 2562: 0x00029E68, + 2563: 0x00009DD4, + 2564: 0x00029FB7, + 2565: 0x0002A192, + 2566: 0x0002A1AB, + 2567: 0x0002A0E1, + 2568: 0x0002A123, + 2569: 0x0002A1DF, + 2570: 0x00009D7E, + 2571: 0x00009D83, + 2572: 0x0002A134, + 2573: 0x00009E0E, + 2574: 0x00006888, + 2575: 0x00009DC4, + 2576: 0x0002215B, + 2577: 0x0002A193, + 2578: 0x0002A220, + 2579: 0x0002193B, + 2580: 0x0002A233, + 2581: 0x00009D39, + 2582: 0x0002A0B9, + 2583: 0x0002A2B4, + 2584: 0x00009E90, + 2585: 0x00009E95, + 2586: 0x00009E9E, + 2587: 0x00009EA2, + 2588: 0x00004D34, + 2589: 0x00009EAA, + 2590: 0x00009EAF, + 2591: 0x00024364, + 2592: 0x00009EC1, + 2593: 0x00003B60, + 2594: 0x000039E5, + 2595: 0x00003D1D, + 2596: 0x00004F32, + 2597: 0x000037BE, + 2598: 0x00028C2B, + 2599: 0x00009F02, + 2600: 0x00009F08, + 2601: 0x00004B96, + 2602: 0x00009424, + 2603: 0x00026DA2, + 2604: 0x00009F17, + 2605: 0x00009F16, + 2606: 0x00009F39, + 2607: 0x0000569F, + 2608: 0x0000568A, + 2609: 0x00009F45, + 2610: 0x000099B8, + 2611: 0x0002908B, + 2612: 0x000097F2, + 2613: 0x0000847F, + 2614: 0x00009F62, + 2615: 0x00009F69, + 2616: 0x00007ADC, + 2617: 0x00009F8E, + 2618: 0x00007216, + 2619: 0x00004BBE, + 2620: 0x00024975, + 2621: 0x000249BB, + 2622: 0x00007177, + 2623: 0x000249F8, + 2624: 0x00024348, + 2625: 0x00024A51, + 2626: 0x0000739E, + 2627: 0x00028BDA, + 2628: 0x000218FA, + 2629: 0x0000799F, + 2630: 0x0002897E, + 2631: 0x00028E36, + 2632: 0x00009369, + 2633: 0x000093F3, + 2634: 0x00028A44, + 2635: 0x000092EC, + 2636: 0x00009381, + 2637: 0x000093CB, + 2638: 0x0002896C, + 2639: 0x000244B9, + 2640: 0x00007217, + 2641: 0x00003EEB, + 2642: 0x00007772, + 2643: 0x00007A43, + 2644: 0x000070D0, + 2645: 0x00024473, + 2646: 0x000243F8, + 2647: 0x0000717E, + 2648: 0x000217EF, + 2649: 0x000070A3, + 2650: 0x000218BE, + 2651: 0x00023599, + 2652: 0x00003EC7, + 2653: 0x00021885, + 2654: 0x0002542F, + 2655: 0x000217F8, + 2656: 0x00003722, + 2657: 0x000216FB, + 2658: 0x00021839, + 2659: 0x000036E1, + 2660: 0x00021774, + 2661: 0x000218D1, + 2662: 0x00025F4B, + 2663: 0x00003723, + 2664: 0x000216C0, + 2665: 0x0000575B, + 2666: 0x00024A25, + 2667: 0x000213FE, + 2668: 0x000212A8, + 2669: 0x000213C6, + 2670: 0x000214B6, + 2671: 0x00008503, + 2672: 0x000236A6, + 2673: 0x00008503, + 2674: 0x00008455, + 2675: 0x00024994, + 2676: 0x00027165, + 2677: 0x00023E31, + 2678: 0x0002555C, + 2679: 0x00023EFB, + 2680: 0x00027052, + 2681: 0x000044F4, + 2682: 0x000236EE, + 2683: 0x0002999D, + 2684: 0x00026F26, + 2685: 0x000067F9, + 2686: 0x00003733, + 2687: 0x00003C15, + 2688: 0x00003DE7, + 2689: 0x0000586C, + 2690: 0x00021922, + 2691: 0x00006810, + 2692: 0x00004057, + 2693: 0x0002373F, + 2694: 0x000240E1, + 2695: 0x0002408B, + 2696: 0x0002410F, + 2697: 0x00026C21, + 2698: 0x000054CB, + 2699: 0x0000569E, + 2700: 0x000266B1, + 2701: 0x00005692, + 2702: 0x00020FDF, + 2703: 0x00020BA8, + 2704: 0x00020E0D, + 2705: 0x000093C6, + 2706: 0x00028B13, + 2707: 0x0000939C, + 2708: 0x00004EF8, + 2709: 0x0000512B, + 2710: 0x00003819, + 2711: 0x00024436, + 2712: 0x00004EBC, + 2713: 0x00020465, + 2714: 0x0002037F, + 2715: 0x00004F4B, + 2716: 0x00004F8A, + 2717: 0x00025651, + 2718: 0x00005A68, + 2719: 0x000201AB, + 2720: 0x000203CB, + 2721: 0x00003999, + 2722: 0x0002030A, + 2723: 0x00020414, + 2724: 0x00003435, + 2725: 0x00004F29, + 2726: 0x000202C0, + 2727: 0x00028EB3, + 2728: 0x00020275, + 2729: 0x00008ADA, + 2730: 0x0002020C, + 2731: 0x00004E98, + 2732: 0x000050CD, + 2733: 0x0000510D, + 2734: 0x00004FA2, + 2735: 0x00004F03, + 2736: 0x00024A0E, + 2737: 0x00023E8A, + 2738: 0x00004F42, + 2739: 0x0000502E, + 2740: 0x0000506C, + 2741: 0x00005081, + 2742: 0x00004FCC, + 2743: 0x00004FE5, + 2744: 0x00005058, + 2745: 0x000050FC, + 2746: 0x00005159, + 2747: 0x0000515B, + 2748: 0x0000515D, + 2749: 0x0000515E, + 2750: 0x00006E76, + 2751: 0x00023595, + 2752: 0x00023E39, + 2753: 0x00023EBF, + 2754: 0x00006D72, + 2755: 0x00021884, + 2756: 0x00023E89, + 2757: 0x000051A8, + 2758: 0x000051C3, + 2759: 0x000205E0, + 2760: 0x000044DD, + 2761: 0x000204A3, + 2762: 0x00020492, + 2763: 0x00020491, + 2764: 0x00008D7A, + 2765: 0x00028A9C, + 2766: 0x0002070E, + 2767: 0x00005259, + 2768: 0x000052A4, + 2769: 0x00020873, + 2770: 0x000052E1, + 2771: 0x0000936E, + 2772: 0x0000467A, + 2773: 0x0000718C, + 2774: 0x0002438C, + 2775: 0x00020C20, + 2776: 0x000249AC, + 2777: 0x000210E4, + 2778: 0x000069D1, + 2779: 0x00020E1D, + 2780: 0x00007479, + 2781: 0x00003EDE, + 2782: 0x00007499, + 2783: 0x00007414, + 2784: 0x00007456, + 2785: 0x00007398, + 2786: 0x00004B8E, + 2787: 0x00024ABC, + 2788: 0x0002408D, + 2789: 0x000053D0, + 2790: 0x00003584, + 2791: 0x0000720F, + 2792: 0x000240C9, + 2793: 0x000055B4, + 2794: 0x00020345, + 2795: 0x000054CD, + 2796: 0x00020BC6, + 2797: 0x0000571D, + 2798: 0x0000925D, + 2799: 0x000096F4, + 2800: 0x00009366, + 2801: 0x000057DD, + 2802: 0x0000578D, + 2803: 0x0000577F, + 2804: 0x0000363E, + 2805: 0x000058CB, + 2806: 0x00005A99, + 2807: 0x00028A46, + 2808: 0x000216FA, + 2809: 0x0002176F, + 2810: 0x00021710, + 2811: 0x00005A2C, + 2812: 0x000059B8, + 2813: 0x0000928F, + 2814: 0x00005A7E, + 2815: 0x00005ACF, + 2816: 0x00005A12, + 2817: 0x00025946, + 2818: 0x000219F3, + 2819: 0x00021861, + 2820: 0x00024295, + 2821: 0x000036F5, + 2822: 0x00006D05, + 2823: 0x00007443, + 2824: 0x00005A21, + 2825: 0x00025E83, + 2826: 0x00005A81, + 2827: 0x00028BD7, + 2828: 0x00020413, + 2829: 0x000093E0, + 2830: 0x0000748C, + 2831: 0x00021303, + 2832: 0x00007105, + 2833: 0x00004972, + 2834: 0x00009408, + 2835: 0x000289FB, + 2836: 0x000093BD, + 2837: 0x000037A0, + 2838: 0x00005C1E, + 2839: 0x00005C9E, + 2840: 0x00005E5E, + 2841: 0x00005E48, + 2842: 0x00021996, + 2843: 0x0002197C, + 2844: 0x00023AEE, + 2845: 0x00005ECD, + 2846: 0x00005B4F, + 2847: 0x00021903, + 2848: 0x00021904, + 2849: 0x00003701, + 2850: 0x000218A0, + 2851: 0x000036DD, + 2852: 0x000216FE, + 2853: 0x000036D3, + 2854: 0x0000812A, + 2855: 0x00028A47, + 2856: 0x00021DBA, + 2857: 0x00023472, + 2858: 0x000289A8, + 2859: 0x00005F0C, + 2860: 0x00005F0E, + 2861: 0x00021927, + 2862: 0x000217AB, + 2863: 0x00005A6B, + 2864: 0x0002173B, + 2865: 0x00005B44, + 2866: 0x00008614, + 2867: 0x000275FD, + 2868: 0x00008860, + 2869: 0x0000607E, + 2870: 0x00022860, + 2871: 0x0002262B, + 2872: 0x00005FDB, + 2873: 0x00003EB8, + 2874: 0x000225AF, + 2875: 0x000225BE, + 2876: 0x00029088, + 2877: 0x00026F73, + 2878: 0x000061C0, + 2879: 0x0002003E, + 2880: 0x00020046, + 2881: 0x0002261B, + 2882: 0x00006199, + 2883: 0x00006198, + 2884: 0x00006075, + 2885: 0x00022C9B, + 2886: 0x00022D07, + 2887: 0x000246D4, + 2888: 0x0002914D, + 2889: 0x00006471, + 2890: 0x00024665, + 2891: 0x00022B6A, + 2892: 0x00003A29, + 2893: 0x00022B22, + 2894: 0x00023450, + 2895: 0x000298EA, + 2896: 0x00022E78, + 2897: 0x00006337, + 2898: 0x0002A45B, + 2899: 0x000064B6, + 2900: 0x00006331, + 2901: 0x000063D1, + 2902: 0x000249E3, + 2903: 0x00022D67, + 2904: 0x000062A4, + 2905: 0x00022CA1, + 2906: 0x0000643B, + 2907: 0x0000656B, + 2908: 0x00006972, + 2909: 0x00003BF4, + 2910: 0x0002308E, + 2911: 0x000232AD, + 2912: 0x00024989, + 2913: 0x000232AB, + 2914: 0x0000550D, + 2915: 0x000232E0, + 2916: 0x000218D9, + 2917: 0x0002943F, + 2918: 0x000066CE, + 2919: 0x00023289, + 2920: 0x000231B3, + 2921: 0x00003AE0, + 2922: 0x00004190, + 2923: 0x00025584, + 2924: 0x00028B22, + 2925: 0x0002558F, + 2926: 0x000216FC, + 2927: 0x0002555B, + 2928: 0x00025425, + 2929: 0x000078EE, + 2930: 0x00023103, + 2931: 0x0002182A, + 2932: 0x00023234, + 2933: 0x00003464, + 2934: 0x0002320F, + 2935: 0x00023182, + 2936: 0x000242C9, + 2937: 0x0000668E, + 2938: 0x00026D24, + 2939: 0x0000666B, + 2940: 0x00004B93, + 2941: 0x00006630, + 2942: 0x00027870, + 2943: 0x00021DEB, + 2944: 0x00006663, + 2945: 0x000232D2, + 2946: 0x000232E1, + 2947: 0x0000661E, + 2948: 0x00025872, + 2949: 0x000038D1, + 2950: 0x0002383A, + 2951: 0x000237BC, + 2952: 0x00003B99, + 2953: 0x000237A2, + 2954: 0x000233FE, + 2955: 0x000074D0, + 2956: 0x00003B96, + 2957: 0x0000678F, + 2958: 0x0002462A, + 2959: 0x000068B6, + 2960: 0x0000681E, + 2961: 0x00003BC4, + 2962: 0x00006ABE, + 2963: 0x00003863, + 2964: 0x000237D5, + 2965: 0x00024487, + 2966: 0x00006A33, + 2967: 0x00006A52, + 2968: 0x00006AC9, + 2969: 0x00006B05, + 2970: 0x00021912, + 2971: 0x00006511, + 2972: 0x00006898, + 2973: 0x00006A4C, + 2974: 0x00003BD7, + 2975: 0x00006A7A, + 2976: 0x00006B57, + 2977: 0x00023FC0, + 2978: 0x00023C9A, + 2979: 0x000093A0, + 2980: 0x000092F2, + 2981: 0x00028BEA, + 2982: 0x00028ACB, + 2983: 0x00009289, + 2984: 0x0002801E, + 2985: 0x000289DC, + 2986: 0x00009467, + 2987: 0x00006DA5, + 2988: 0x00006F0B, + 2989: 0x000249EC, + 2990: 0x00006D67, + 2991: 0x00023F7F, + 2992: 0x00003D8F, + 2993: 0x00006E04, + 2994: 0x0002403C, + 2995: 0x00005A3D, + 2996: 0x00006E0A, + 2997: 0x00005847, + 2998: 0x00006D24, + 2999: 0x00007842, + 3000: 0x0000713B, + 3001: 0x0002431A, + 3002: 0x00024276, + 3003: 0x000070F1, + 3004: 0x00007250, + 3005: 0x00007287, + 3006: 0x00007294, + 3007: 0x0002478F, + 3008: 0x00024725, + 3009: 0x00005179, + 3010: 0x00024AA4, + 3011: 0x000205EB, + 3012: 0x0000747A, + 3013: 0x00023EF8, + 3014: 0x0002365F, + 3015: 0x00024A4A, + 3016: 0x00024917, + 3017: 0x00025FE1, + 3018: 0x00003F06, + 3019: 0x00003EB1, + 3020: 0x00024ADF, + 3021: 0x00028C23, + 3022: 0x00023F35, + 3023: 0x000060A7, + 3024: 0x00003EF3, + 3025: 0x000074CC, + 3026: 0x0000743C, + 3027: 0x00009387, + 3028: 0x00007437, + 3029: 0x0000449F, + 3030: 0x00026DEA, + 3031: 0x00004551, + 3032: 0x00007583, + 3033: 0x00003F63, + 3034: 0x00024CD9, + 3035: 0x00024D06, + 3036: 0x00003F58, + 3037: 0x00007555, + 3038: 0x00007673, + 3039: 0x0002A5C6, + 3040: 0x00003B19, + 3041: 0x00007468, + 3042: 0x00028ACC, + 3043: 0x000249AB, + 3044: 0x0002498E, + 3045: 0x00003AFB, + 3046: 0x00003DCD, + 3047: 0x00024A4E, + 3048: 0x00003EFF, + 3049: 0x000249C5, + 3050: 0x000248F3, + 3051: 0x000091FA, + 3052: 0x00005732, + 3053: 0x00009342, + 3054: 0x00028AE3, + 3055: 0x00021864, + 3056: 0x000050DF, + 3057: 0x00025221, + 3058: 0x000251E7, + 3059: 0x00007778, + 3060: 0x00023232, + 3061: 0x0000770E, + 3062: 0x0000770F, + 3063: 0x0000777B, + 3064: 0x00024697, + 3065: 0x00023781, + 3066: 0x00003A5E, + 3067: 0x000248F0, + 3068: 0x00007438, + 3069: 0x0000749B, + 3070: 0x00003EBF, + 3071: 0x00024ABA, + 3072: 0x00024AC7, + 3073: 0x000040C8, + 3074: 0x00024A96, + 3075: 0x000261AE, + 3076: 0x00009307, + 3077: 0x00025581, + 3078: 0x0000781E, + 3079: 0x0000788D, + 3080: 0x00007888, + 3081: 0x000078D2, + 3082: 0x000073D0, + 3083: 0x00007959, + 3084: 0x00027741, + 3085: 0x000256E3, + 3086: 0x0000410E, + 3087: 0x0000799B, + 3088: 0x00008496, + 3089: 0x000079A5, + 3090: 0x00006A2D, + 3091: 0x00023EFA, + 3092: 0x00007A3A, + 3093: 0x000079F4, + 3094: 0x0000416E, + 3095: 0x000216E6, + 3096: 0x00004132, + 3097: 0x00009235, + 3098: 0x000079F1, + 3099: 0x00020D4C, + 3100: 0x0002498C, + 3101: 0x00020299, + 3102: 0x00023DBA, + 3103: 0x0002176E, + 3104: 0x00003597, + 3105: 0x0000556B, + 3106: 0x00003570, + 3107: 0x000036AA, + 3108: 0x000201D4, + 3109: 0x00020C0D, + 3110: 0x00007AE2, + 3111: 0x00005A59, + 3112: 0x000226F5, + 3113: 0x00025AAF, + 3114: 0x00025A9C, + 3115: 0x00005A0D, + 3116: 0x0002025B, + 3117: 0x000078F0, + 3118: 0x00005A2A, + 3119: 0x00025BC6, + 3120: 0x00007AFE, + 3121: 0x000041F9, + 3122: 0x00007C5D, + 3123: 0x00007C6D, + 3124: 0x00004211, + 3125: 0x00025BB3, + 3126: 0x00025EBC, + 3127: 0x00025EA6, + 3128: 0x00007CCD, + 3129: 0x000249F9, + 3130: 0x000217B0, + 3131: 0x00007C8E, + 3132: 0x00007C7C, + 3133: 0x00007CAE, + 3134: 0x00006AB2, + 3135: 0x00007DDC, + 3136: 0x00007E07, + 3137: 0x00007DD3, + 3138: 0x00007F4E, + 3139: 0x00026261, + 3140: 0x0002615C, + 3141: 0x00027B48, + 3142: 0x00007D97, + 3143: 0x00025E82, + 3144: 0x0000426A, + 3145: 0x00026B75, + 3146: 0x00020916, + 3147: 0x000067D6, + 3148: 0x0002004E, + 3149: 0x000235CF, + 3150: 0x000057C4, + 3151: 0x00026412, + 3152: 0x000263F8, + 3153: 0x00024962, + 3154: 0x00007FDD, + 3155: 0x00007B27, + 3156: 0x0002082C, + 3157: 0x00025AE9, + 3158: 0x00025D43, + 3159: 0x00007B0C, + 3160: 0x00025E0E, + 3161: 0x000099E6, + 3162: 0x00008645, + 3163: 0x00009A63, + 3164: 0x00006A1C, + 3165: 0x0002343F, + 3166: 0x000039E2, + 3167: 0x000249F7, + 3168: 0x000265AD, + 3169: 0x00009A1F, + 3170: 0x000265A0, + 3171: 0x00008480, + 3172: 0x00027127, + 3173: 0x00026CD1, + 3174: 0x000044EA, + 3175: 0x00008137, + 3176: 0x00004402, + 3177: 0x000080C6, + 3178: 0x00008109, + 3179: 0x00008142, + 3180: 0x000267B4, + 3181: 0x000098C3, + 3182: 0x00026A42, + 3183: 0x00008262, + 3184: 0x00008265, + 3185: 0x00026A51, + 3186: 0x00008453, + 3187: 0x00026DA7, + 3188: 0x00008610, + 3189: 0x0002721B, + 3190: 0x00005A86, + 3191: 0x0000417F, + 3192: 0x00021840, + 3193: 0x00005B2B, + 3194: 0x000218A1, + 3195: 0x00005AE4, + 3196: 0x000218D8, + 3197: 0x000086A0, + 3198: 0x0002F9BC, + 3199: 0x00023D8F, + 3200: 0x0000882D, + 3201: 0x00027422, + 3202: 0x00005A02, + 3203: 0x0000886E, + 3204: 0x00004F45, + 3205: 0x00008887, + 3206: 0x000088BF, + 3207: 0x000088E6, + 3208: 0x00008965, + 3209: 0x0000894D, + 3210: 0x00025683, + 3211: 0x00008954, + 3212: 0x00027785, + 3213: 0x00027784, + 3214: 0x00028BF5, + 3215: 0x00028BD9, + 3216: 0x00028B9C, + 3217: 0x000289F9, + 3218: 0x00003EAD, + 3219: 0x000084A3, + 3220: 0x000046F5, + 3221: 0x000046CF, + 3222: 0x000037F2, + 3223: 0x00008A3D, + 3224: 0x00008A1C, + 3225: 0x00029448, + 3226: 0x00005F4D, + 3227: 0x0000922B, + 3228: 0x00024284, + 3229: 0x000065D4, + 3230: 0x00007129, + 3231: 0x000070C4, + 3232: 0x00021845, + 3233: 0x00009D6D, + 3234: 0x00008C9F, + 3235: 0x00008CE9, + 3236: 0x00027DDC, + 3237: 0x0000599A, + 3238: 0x000077C3, + 3239: 0x000059F0, + 3240: 0x0000436E, + 3241: 0x000036D4, + 3242: 0x00008E2A, + 3243: 0x00008EA7, + 3244: 0x00024C09, + 3245: 0x00008F30, + 3246: 0x00008F4A, + 3247: 0x000042F4, + 3248: 0x00006C58, + 3249: 0x00006FBB, + 3250: 0x00022321, + 3251: 0x0000489B, + 3252: 0x00006F79, + 3253: 0x00006E8B, + 3254: 0x000217DA, + 3255: 0x00009BE9, + 3256: 0x000036B5, + 3257: 0x0002492F, + 3258: 0x000090BB, + 3259: 0x00009097, + 3260: 0x00005571, + 3261: 0x00004906, + 3262: 0x000091BB, + 3263: 0x00009404, + 3264: 0x00028A4B, + 3265: 0x00004062, + 3266: 0x00028AFC, + 3267: 0x00009427, + 3268: 0x00028C1D, + 3269: 0x00028C3B, + 3270: 0x000084E5, + 3271: 0x00008A2B, + 3272: 0x00009599, + 3273: 0x000095A7, + 3274: 0x00009597, + 3275: 0x00009596, + 3276: 0x00028D34, + 3277: 0x00007445, + 3278: 0x00003EC2, + 3279: 0x000248FF, + 3280: 0x00024A42, + 3281: 0x000243EA, + 3282: 0x00003EE7, + 3283: 0x00023225, + 3284: 0x0000968F, + 3285: 0x00028EE7, + 3286: 0x00028E66, + 3287: 0x00028E65, + 3288: 0x00003ECC, + 3289: 0x000249ED, + 3290: 0x00024A78, + 3291: 0x00023FEE, + 3292: 0x00007412, + 3293: 0x0000746B, + 3294: 0x00003EFC, + 3295: 0x00009741, + 3296: 0x000290B0, + 3297: 0x00006847, + 3298: 0x00004A1D, + 3299: 0x00029093, + 3300: 0x000257DF, + 3301: 0x0000975D, + 3302: 0x00009368, + 3303: 0x00028989, + 3304: 0x00028C26, + 3305: 0x00028B2F, + 3306: 0x000263BE, + 3307: 0x000092BA, + 3308: 0x00005B11, + 3309: 0x00008B69, + 3310: 0x0000493C, + 3311: 0x000073F9, + 3312: 0x0002421B, + 3313: 0x0000979B, + 3314: 0x00009771, + 3315: 0x00009938, + 3316: 0x00020F26, + 3317: 0x00005DC1, + 3318: 0x00028BC5, + 3319: 0x00024AB2, + 3320: 0x0000981F, + 3321: 0x000294DA, + 3322: 0x000092F6, + 3323: 0x000295D7, + 3324: 0x000091E5, + 3325: 0x000044C0, + 3326: 0x00028B50, + 3327: 0x00024A67, + 3328: 0x00028B64, + 3329: 0x000098DC, + 3330: 0x00028A45, + 3331: 0x00003F00, + 3332: 0x0000922A, + 3333: 0x00004925, + 3334: 0x00008414, + 3335: 0x0000993B, + 3336: 0x0000994D, + 3337: 0x00027B06, + 3338: 0x00003DFD, + 3339: 0x0000999B, + 3340: 0x00004B6F, + 3341: 0x000099AA, + 3342: 0x00009A5C, + 3343: 0x00028B65, + 3344: 0x000258C8, + 3345: 0x00006A8F, + 3346: 0x00009A21, + 3347: 0x00005AFE, + 3348: 0x00009A2F, + 3349: 0x000298F1, + 3350: 0x00004B90, + 3351: 0x00029948, + 3352: 0x000099BC, + 3353: 0x00004BBD, + 3354: 0x00004B97, + 3355: 0x0000937D, + 3356: 0x00005872, + 3357: 0x00021302, + 3358: 0x00005822, + 3359: 0x000249B8, + 3360: 0x000214E8, + 3361: 0x00007844, + 3362: 0x0002271F, + 3363: 0x00023DB8, + 3364: 0x000068C5, + 3365: 0x00003D7D, + 3366: 0x00009458, + 3367: 0x00003927, + 3368: 0x00006150, + 3369: 0x00022781, + 3370: 0x0002296B, + 3371: 0x00006107, + 3372: 0x00009C4F, + 3373: 0x00009C53, + 3374: 0x00009C7B, + 3375: 0x00009C35, + 3376: 0x00009C10, + 3377: 0x00009B7F, + 3378: 0x00009BCF, + 3379: 0x00029E2D, + 3380: 0x00009B9F, + 3381: 0x0002A1F5, + 3382: 0x0002A0FE, + 3383: 0x00009D21, + 3384: 0x00004CAE, + 3385: 0x00024104, + 3386: 0x00009E18, + 3387: 0x00004CB0, + 3388: 0x00009D0C, + 3389: 0x0002A1B4, + 3390: 0x0002A0ED, + 3391: 0x0002A0F3, + 3392: 0x0002992F, + 3393: 0x00009DA5, + 3394: 0x000084BD, + 3395: 0x00026E12, + 3396: 0x00026FDF, + 3397: 0x00026B82, + 3398: 0x000085FC, + 3399: 0x00004533, + 3400: 0x00026DA4, + 3401: 0x00026E84, + 3402: 0x00026DF0, + 3403: 0x00008420, + 3404: 0x000085EE, + 3405: 0x00026E00, + 3406: 0x000237D7, + 3407: 0x00026064, + 3408: 0x000079E2, + 3409: 0x0002359C, + 3410: 0x00023640, + 3411: 0x0000492D, + 3412: 0x000249DE, + 3413: 0x00003D62, + 3414: 0x000093DB, + 3415: 0x000092BE, + 3416: 0x00009348, + 3417: 0x000202BF, + 3418: 0x000078B9, + 3419: 0x00009277, + 3420: 0x0000944D, + 3421: 0x00004FE4, + 3422: 0x00003440, + 3423: 0x00009064, + 3424: 0x0002555D, + 3425: 0x0000783D, + 3426: 0x00007854, + 3427: 0x000078B6, + 3428: 0x0000784B, + 3429: 0x00021757, + 3430: 0x000231C9, + 3431: 0x00024941, + 3432: 0x0000369A, + 3433: 0x00004F72, + 3434: 0x00006FDA, + 3435: 0x00006FD9, + 3436: 0x0000701E, + 3437: 0x0000701E, + 3438: 0x00005414, + 3439: 0x000241B5, + 3440: 0x000057BB, + 3441: 0x000058F3, + 3442: 0x0000578A, + 3443: 0x00009D16, + 3444: 0x000057D7, + 3445: 0x00007134, + 3446: 0x000034AF, + 3447: 0x000241AC, + 3448: 0x000071EB, + 3449: 0x00026C40, + 3450: 0x00024F97, + 3451: 0x00005B28, + 3452: 0x000217B5, + 3453: 0x00028A49, + 3454: 0x0000610C, + 3455: 0x00005ACE, + 3456: 0x00005A0B, + 3457: 0x000042BC, + 3458: 0x00024488, + 3459: 0x0000372C, + 3460: 0x00004B7B, + 3461: 0x000289FC, + 3462: 0x000093BB, + 3463: 0x000093B8, + 3464: 0x000218D6, + 3465: 0x00020F1D, + 3466: 0x00008472, + 3467: 0x00026CC0, + 3468: 0x00021413, + 3469: 0x000242FA, + 3470: 0x00022C26, + 3471: 0x000243C1, + 3472: 0x00005994, + 3473: 0x00023DB7, + 3474: 0x00026741, + 3475: 0x00007DA8, + 3476: 0x0002615B, + 3477: 0x000260A4, + 3478: 0x000249B9, + 3479: 0x0002498B, + 3480: 0x000289FA, + 3481: 0x000092E5, + 3482: 0x000073E2, + 3483: 0x00003EE9, + 3484: 0x000074B4, + 3485: 0x00028B63, + 3486: 0x0002189F, + 3487: 0x00003EE1, + 3488: 0x00024AB3, + 3489: 0x00006AD8, + 3490: 0x000073F3, + 3491: 0x000073FB, + 3492: 0x00003ED6, + 3493: 0x00024A3E, + 3494: 0x00024A94, + 3495: 0x000217D9, + 3496: 0x00024A66, + 3497: 0x000203A7, + 3498: 0x00021424, + 3499: 0x000249E5, + 3500: 0x00007448, + 3501: 0x00024916, + 3502: 0x000070A5, + 3503: 0x00024976, + 3504: 0x00009284, + 3505: 0x000073E6, + 3506: 0x0000935F, + 3507: 0x000204FE, + 3508: 0x00009331, + 3509: 0x00028ACE, + 3510: 0x00028A16, + 3511: 0x00009386, + 3512: 0x00028BE7, + 3513: 0x000255D5, + 3514: 0x00004935, + 3515: 0x00028A82, + 3516: 0x0000716B, + 3517: 0x00024943, + 3518: 0x00020CFF, + 3519: 0x000056A4, + 3520: 0x0002061A, + 3521: 0x00020BEB, + 3522: 0x00020CB8, + 3523: 0x00005502, + 3524: 0x000079C4, + 3525: 0x000217FA, + 3526: 0x00007DFE, + 3527: 0x000216C2, + 3528: 0x00024A50, + 3529: 0x00021852, + 3530: 0x0000452E, + 3531: 0x00009401, + 3532: 0x0000370A, + 3533: 0x00028AC0, + 3534: 0x000249AD, + 3535: 0x000059B0, + 3536: 0x000218BF, + 3537: 0x00021883, + 3538: 0x00027484, + 3539: 0x00005AA1, + 3540: 0x000036E2, + 3541: 0x00023D5B, + 3542: 0x000036B0, + 3543: 0x0000925F, + 3544: 0x00005A79, + 3545: 0x00028A81, + 3546: 0x00021862, + 3547: 0x00009374, + 3548: 0x00003CCD, + 3549: 0x00020AB4, + 3550: 0x00004A96, + 3551: 0x0000398A, + 3552: 0x000050F4, + 3553: 0x00003D69, + 3554: 0x00003D4C, + 3555: 0x0002139C, + 3556: 0x00007175, + 3557: 0x000042FB, + 3558: 0x00028218, + 3559: 0x00006E0F, + 3560: 0x000290E4, + 3561: 0x000044EB, + 3562: 0x00006D57, + 3563: 0x00027E4F, + 3564: 0x00007067, + 3565: 0x00006CAF, + 3566: 0x00003CD6, + 3567: 0x00023FED, + 3568: 0x00023E2D, + 3569: 0x00006E02, + 3570: 0x00006F0C, + 3571: 0x00003D6F, + 3572: 0x000203F5, + 3573: 0x00007551, + 3574: 0x000036BC, + 3575: 0x000034C8, + 3576: 0x00004680, + 3577: 0x00003EDA, + 3578: 0x00004871, + 3579: 0x000059C4, + 3580: 0x0000926E, + 3581: 0x0000493E, + 3582: 0x00008F41, + 3583: 0x00028C1C, + 3584: 0x00026BC0, + 3585: 0x00005812, + 3586: 0x000057C8, + 3587: 0x000036D6, + 3588: 0x00021452, + 3589: 0x000070FE, + 3590: 0x00024362, + 3591: 0x00024A71, + 3592: 0x00022FE3, + 3593: 0x000212B0, + 3594: 0x000223BD, + 3595: 0x000068B9, + 3596: 0x00006967, + 3597: 0x00021398, + 3598: 0x000234E5, + 3599: 0x00027BF4, + 3600: 0x000236DF, + 3601: 0x00028A83, + 3602: 0x000237D6, + 3603: 0x000233FA, + 3604: 0x00024C9F, + 3605: 0x00006A1A, + 3606: 0x000236AD, + 3607: 0x00026CB7, + 3608: 0x0000843E, + 3609: 0x000044DF, + 3610: 0x000044CE, + 3611: 0x00026D26, + 3612: 0x00026D51, + 3613: 0x00026C82, + 3614: 0x00026FDE, + 3615: 0x00006F17, + 3616: 0x00027109, + 3617: 0x0000833D, + 3618: 0x0002173A, + 3619: 0x000083ED, + 3620: 0x00026C80, + 3621: 0x00027053, + 3622: 0x000217DB, + 3623: 0x00005989, + 3624: 0x00005A82, + 3625: 0x000217B3, + 3626: 0x00005A61, + 3627: 0x00005A71, + 3628: 0x00021905, + 3629: 0x000241FC, + 3630: 0x0000372D, + 3631: 0x000059EF, + 3632: 0x0002173C, + 3633: 0x000036C7, + 3634: 0x0000718E, + 3635: 0x00009390, + 3636: 0x0000669A, + 3637: 0x000242A5, + 3638: 0x00005A6E, + 3639: 0x00005A2B, + 3640: 0x00024293, + 3641: 0x00006A2B, + 3642: 0x00023EF9, + 3643: 0x00027736, + 3644: 0x0002445B, + 3645: 0x000242CA, + 3646: 0x0000711D, + 3647: 0x00024259, + 3648: 0x000289E1, + 3649: 0x00004FB0, + 3650: 0x00026D28, + 3651: 0x00005CC2, + 3652: 0x000244CE, + 3653: 0x00027E4D, + 3654: 0x000243BD, + 3655: 0x00006A0C, + 3656: 0x00024256, + 3657: 0x00021304, + 3658: 0x000070A6, + 3659: 0x00007133, + 3660: 0x000243E9, + 3661: 0x00003DA5, + 3662: 0x00006CDF, + 3663: 0x0002F825, + 3664: 0x00024A4F, + 3665: 0x00007E65, + 3666: 0x000059EB, + 3667: 0x00005D2F, + 3668: 0x00003DF3, + 3669: 0x00005F5C, + 3670: 0x00024A5D, + 3671: 0x000217DF, + 3672: 0x00007DA4, + 3673: 0x00008426, + 3674: 0x00005485, + 3675: 0x00023AFA, + 3676: 0x00023300, + 3677: 0x00020214, + 3678: 0x0000577E, + 3679: 0x000208D5, + 3680: 0x00020619, + 3681: 0x00003FE5, + 3682: 0x00021F9E, + 3683: 0x0002A2B6, + 3684: 0x00007003, + 3685: 0x0002915B, + 3686: 0x00005D70, + 3687: 0x0000738F, + 3688: 0x00007CD3, + 3689: 0x00028A59, + 3690: 0x00029420, + 3691: 0x00004FC8, + 3692: 0x00007FE7, + 3693: 0x000072CD, + 3694: 0x00007310, + 3695: 0x00027AF4, + 3696: 0x00007338, + 3697: 0x00007339, + 3698: 0x000256F6, + 3699: 0x00007341, + 3700: 0x00007348, + 3701: 0x00003EA9, + 3702: 0x00027B18, + 3703: 0x0000906C, + 3704: 0x000071F5, + 3705: 0x000248F2, + 3706: 0x000073E1, + 3707: 0x000081F6, + 3708: 0x00003ECA, + 3709: 0x0000770C, + 3710: 0x00003ED1, + 3711: 0x00006CA2, + 3712: 0x000056FD, + 3713: 0x00007419, + 3714: 0x0000741E, + 3715: 0x0000741F, + 3716: 0x00003EE2, + 3717: 0x00003EF0, + 3718: 0x00003EF4, + 3719: 0x00003EFA, + 3720: 0x000074D3, + 3721: 0x00003F0E, + 3722: 0x00003F53, + 3723: 0x00007542, + 3724: 0x0000756D, + 3725: 0x00007572, + 3726: 0x0000758D, + 3727: 0x00003F7C, + 3728: 0x000075C8, + 3729: 0x000075DC, + 3730: 0x00003FC0, + 3731: 0x0000764D, + 3732: 0x00003FD7, + 3733: 0x00007674, + 3734: 0x00003FDC, + 3735: 0x0000767A, + 3736: 0x00024F5C, + 3737: 0x00007188, + 3738: 0x00005623, + 3739: 0x00008980, + 3740: 0x00005869, + 3741: 0x0000401D, + 3742: 0x00007743, + 3743: 0x00004039, + 3744: 0x00006761, + 3745: 0x00004045, + 3746: 0x000035DB, + 3747: 0x00007798, + 3748: 0x0000406A, + 3749: 0x0000406F, + 3750: 0x00005C5E, + 3751: 0x000077BE, + 3752: 0x000077CB, + 3753: 0x000058F2, + 3754: 0x00007818, + 3755: 0x000070B9, + 3756: 0x0000781C, + 3757: 0x000040A8, + 3758: 0x00007839, + 3759: 0x00007847, + 3760: 0x00007851, + 3761: 0x00007866, + 3762: 0x00008448, + 3763: 0x00025535, + 3764: 0x00007933, + 3765: 0x00006803, + 3766: 0x00007932, + 3767: 0x00004103, + 3768: 0x00004109, + 3769: 0x00007991, + 3770: 0x00007999, + 3771: 0x00008FBB, + 3772: 0x00007A06, + 3773: 0x00008FBC, + 3774: 0x00004167, + 3775: 0x00007A91, + 3776: 0x000041B2, + 3777: 0x00007ABC, + 3778: 0x00008279, + 3779: 0x000041C4, + 3780: 0x00007ACF, + 3781: 0x00007ADB, + 3782: 0x000041CF, + 3783: 0x00004E21, + 3784: 0x00007B62, + 3785: 0x00007B6C, + 3786: 0x00007B7B, + 3787: 0x00007C12, + 3788: 0x00007C1B, + 3789: 0x00004260, + 3790: 0x0000427A, + 3791: 0x00007C7B, + 3792: 0x00007C9C, + 3793: 0x0000428C, + 3794: 0x00007CB8, + 3795: 0x00004294, + 3796: 0x00007CED, + 3797: 0x00008F93, + 3798: 0x000070C0, + 3799: 0x00020CCF, + 3800: 0x00007DCF, + 3801: 0x00007DD4, + 3802: 0x00007DD0, + 3803: 0x00007DFD, + 3804: 0x00007FAE, + 3805: 0x00007FB4, + 3806: 0x0000729F, + 3807: 0x00004397, + 3808: 0x00008020, + 3809: 0x00008025, + 3810: 0x00007B39, + 3811: 0x0000802E, + 3812: 0x00008031, + 3813: 0x00008054, + 3814: 0x00003DCC, + 3815: 0x000057B4, + 3816: 0x000070A0, + 3817: 0x000080B7, + 3818: 0x000080E9, + 3819: 0x000043ED, + 3820: 0x0000810C, + 3821: 0x0000732A, + 3822: 0x0000810E, + 3823: 0x00008112, + 3824: 0x00007560, + 3825: 0x00008114, + 3826: 0x00004401, + 3827: 0x00003B39, + 3828: 0x00008156, + 3829: 0x00008159, + 3830: 0x0000815A, + 3831: 0x00004413, + 3832: 0x0000583A, + 3833: 0x0000817C, + 3834: 0x00008184, + 3835: 0x00004425, + 3836: 0x00008193, + 3837: 0x0000442D, + 3838: 0x000081A5, + 3839: 0x000057EF, + 3840: 0x000081C1, + 3841: 0x000081E4, + 3842: 0x00008254, + 3843: 0x0000448F, + 3844: 0x000082A6, + 3845: 0x00008276, + 3846: 0x000082CA, + 3847: 0x000082D8, + 3848: 0x000082FF, + 3849: 0x000044B0, + 3850: 0x00008357, + 3851: 0x00009669, + 3852: 0x0000698A, + 3853: 0x00008405, + 3854: 0x000070F5, + 3855: 0x00008464, + 3856: 0x000060E3, + 3857: 0x00008488, + 3858: 0x00004504, + 3859: 0x000084BE, + 3860: 0x000084E1, + 3861: 0x000084F8, + 3862: 0x00008510, + 3863: 0x00008538, + 3864: 0x00008552, + 3865: 0x0000453B, + 3866: 0x0000856F, + 3867: 0x00008570, + 3868: 0x000085E0, + 3869: 0x00004577, + 3870: 0x00008672, + 3871: 0x00008692, + 3872: 0x000086B2, + 3873: 0x000086EF, + 3874: 0x00009645, + 3875: 0x0000878B, + 3876: 0x00004606, + 3877: 0x00004617, + 3878: 0x000088AE, + 3879: 0x000088FF, + 3880: 0x00008924, + 3881: 0x00008947, + 3882: 0x00008991, + 3883: 0x00027967, + 3884: 0x00008A29, + 3885: 0x00008A38, + 3886: 0x00008A94, + 3887: 0x00008AB4, + 3888: 0x00008C51, + 3889: 0x00008CD4, + 3890: 0x00008CF2, + 3891: 0x00008D1C, + 3892: 0x00004798, + 3893: 0x0000585F, + 3894: 0x00008DC3, + 3895: 0x000047ED, + 3896: 0x00004EEE, + 3897: 0x00008E3A, + 3898: 0x000055D8, + 3899: 0x00005754, + 3900: 0x00008E71, + 3901: 0x000055F5, + 3902: 0x00008EB0, + 3903: 0x00004837, + 3904: 0x00008ECE, + 3905: 0x00008EE2, + 3906: 0x00008EE4, + 3907: 0x00008EED, + 3908: 0x00008EF2, + 3909: 0x00008FB7, + 3910: 0x00008FC1, + 3911: 0x00008FCA, + 3912: 0x00008FCC, + 3913: 0x00009033, + 3914: 0x000099C4, + 3915: 0x000048AD, + 3916: 0x000098E0, + 3917: 0x00009213, + 3918: 0x0000491E, + 3919: 0x00009228, + 3920: 0x00009258, + 3921: 0x0000926B, + 3922: 0x000092B1, + 3923: 0x000092AE, + 3924: 0x000092BF, + 3925: 0x000092E3, + 3926: 0x000092EB, + 3927: 0x000092F3, + 3928: 0x000092F4, + 3929: 0x000092FD, + 3930: 0x00009343, + 3931: 0x00009384, + 3932: 0x000093AD, + 3933: 0x00004945, + 3934: 0x00004951, + 3935: 0x00009EBF, + 3936: 0x00009417, + 3937: 0x00005301, + 3938: 0x0000941D, + 3939: 0x0000942D, + 3940: 0x0000943E, + 3941: 0x0000496A, + 3942: 0x00009454, + 3943: 0x00009479, + 3944: 0x0000952D, + 3945: 0x000095A2, + 3946: 0x000049A7, + 3947: 0x000095F4, + 3948: 0x00009633, + 3949: 0x000049E5, + 3950: 0x000067A0, + 3951: 0x00004A24, + 3952: 0x00009740, + 3953: 0x00004A35, + 3954: 0x000097B2, + 3955: 0x000097C2, + 3956: 0x00005654, + 3957: 0x00004AE4, + 3958: 0x000060E8, + 3959: 0x000098B9, + 3960: 0x00004B19, + 3961: 0x000098F1, + 3962: 0x00005844, + 3963: 0x0000990E, + 3964: 0x00009919, + 3965: 0x000051B4, + 3966: 0x0000991C, + 3967: 0x00009937, + 3968: 0x00009942, + 3969: 0x0000995D, + 3970: 0x00009962, + 3971: 0x00004B70, + 3972: 0x000099C5, + 3973: 0x00004B9D, + 3974: 0x00009A3C, + 3975: 0x00009B0F, + 3976: 0x00007A83, + 3977: 0x00009B69, + 3978: 0x00009B81, + 3979: 0x00009BDD, + 3980: 0x00009BF1, + 3981: 0x00009BF4, + 3982: 0x00004C6D, + 3983: 0x00009C20, + 3984: 0x0000376F, + 3985: 0x00021BC2, + 3986: 0x00009D49, + 3987: 0x00009C3A, + 3988: 0x00009EFE, + 3989: 0x00005650, + 3990: 0x00009D93, + 3991: 0x00009DBD, + 3992: 0x00009DC0, + 3993: 0x00009DFC, + 3994: 0x000094F6, + 3995: 0x00008FB6, + 3996: 0x00009E7B, + 3997: 0x00009EAC, + 3998: 0x00009EB1, + 3999: 0x00009EBD, + 4000: 0x00009EC6, + 4001: 0x000094DC, + 4002: 0x00009EE2, + 4003: 0x00009EF1, + 4004: 0x00009EF8, + 4005: 0x00007AC8, + 4006: 0x00009F44, + 4007: 0x00020094, + 4008: 0x000202B7, + 4009: 0x000203A0, + 4010: 0x0000691A, + 4011: 0x000094C3, + 4012: 0x000059AC, + 4013: 0x000204D7, + 4014: 0x00005840, + 4015: 0x000094C1, + 4016: 0x000037B9, + 4017: 0x000205D5, + 4018: 0x00020615, + 4019: 0x00020676, + 4020: 0x000216BA, + 4021: 0x00005757, + 4022: 0x00007173, + 4023: 0x00020AC2, + 4024: 0x00020ACD, + 4025: 0x00020BBF, + 4026: 0x0000546A, + 4027: 0x0002F83B, + 4028: 0x00020BCB, + 4029: 0x0000549E, + 4030: 0x00020BFB, + 4031: 0x00020C3B, + 4032: 0x00020C53, + 4033: 0x00020C65, + 4034: 0x00020C7C, + 4035: 0x000060E7, + 4036: 0x00020C8D, + 4037: 0x0000567A, + 4038: 0x00020CB5, + 4039: 0x00020CDD, + 4040: 0x00020CED, + 4041: 0x00020D6F, + 4042: 0x00020DB2, + 4043: 0x00020DC8, + 4044: 0x00006955, + 4045: 0x00009C2F, + 4046: 0x000087A5, + 4047: 0x00020E04, + 4048: 0x00020E0E, + 4049: 0x00020ED7, + 4050: 0x00020F90, + 4051: 0x00020F2D, + 4052: 0x00020E73, + 4053: 0x00005C20, + 4054: 0x00020FBC, + 4055: 0x00005E0B, + 4056: 0x0002105C, + 4057: 0x0002104F, + 4058: 0x00021076, + 4059: 0x0000671E, + 4060: 0x0002107B, + 4061: 0x00021088, + 4062: 0x00021096, + 4063: 0x00003647, + 4064: 0x000210BF, + 4065: 0x000210D3, + 4066: 0x0002112F, + 4067: 0x0002113B, + 4068: 0x00005364, + 4069: 0x000084AD, + 4070: 0x000212E3, + 4071: 0x00021375, + 4072: 0x00021336, + 4073: 0x00008B81, + 4074: 0x00021577, + 4075: 0x00021619, + 4076: 0x000217C3, + 4077: 0x000217C7, + 4078: 0x00004E78, + 4079: 0x000070BB, + 4080: 0x0002182D, + 4081: 0x0002196A, + 4082: 0x00021A2D, + 4083: 0x00021A45, + 4084: 0x00021C2A, + 4085: 0x00021C70, + 4086: 0x00021CAC, + 4087: 0x00021EC8, + 4088: 0x000062C3, + 4089: 0x00021ED5, + 4090: 0x00021F15, + 4091: 0x00007198, + 4092: 0x00006855, + 4093: 0x00022045, + 4094: 0x000069E9, + 4095: 0x000036C8, + 4096: 0x0002227C, + 4097: 0x000223D7, + 4098: 0x000223FA, + 4099: 0x0002272A, + 4100: 0x00022871, + 4101: 0x0002294F, + 4102: 0x000082FD, + 4103: 0x00022967, + 4104: 0x00022993, + 4105: 0x00022AD5, + 4106: 0x000089A5, + 4107: 0x00022AE8, + 4108: 0x00008FA0, + 4109: 0x00022B0E, + 4110: 0x000097B8, + 4111: 0x00022B3F, + 4112: 0x00009847, + 4113: 0x00009ABD, + 4114: 0x00022C4C, + 4116: 0x00022C88, + 4117: 0x00022CB7, + 4118: 0x00025BE8, + 4119: 0x00022D08, + 4120: 0x00022D12, + 4121: 0x00022DB7, + 4122: 0x00022D95, + 4123: 0x00022E42, + 4124: 0x00022F74, + 4125: 0x00022FCC, + 4126: 0x00023033, + 4127: 0x00023066, + 4128: 0x0002331F, + 4129: 0x000233DE, + 4130: 0x00005FB1, + 4131: 0x00006648, + 4132: 0x000066BF, + 4133: 0x00027A79, + 4134: 0x00023567, + 4135: 0x000235F3, + 4136: 0x00007201, + 4137: 0x000249BA, + 4138: 0x000077D7, + 4139: 0x0002361A, + 4140: 0x00023716, + 4141: 0x00007E87, + 4142: 0x00020346, + 4143: 0x000058B5, + 4144: 0x0000670E, + 4145: 0x00006918, + 4146: 0x00023AA7, + 4147: 0x00027657, + 4148: 0x00025FE2, + 4149: 0x00023E11, + 4150: 0x00023EB9, + 4151: 0x000275FE, + 4152: 0x0002209A, + 4153: 0x000048D0, + 4154: 0x00004AB8, + 4155: 0x00024119, + 4156: 0x00028A9A, + 4157: 0x000242EE, + 4158: 0x0002430D, + 4159: 0x0002403B, + 4160: 0x00024334, + 4161: 0x00024396, + 4162: 0x00024A45, + 4163: 0x000205CA, + 4164: 0x000051D2, + 4165: 0x00020611, + 4166: 0x0000599F, + 4167: 0x00021EA8, + 4168: 0x00003BBE, + 4169: 0x00023CFF, + 4170: 0x00024404, + 4171: 0x000244D6, + 4172: 0x00005788, + 4173: 0x00024674, + 4174: 0x0000399B, + 4175: 0x0002472F, + 4176: 0x000285E8, + 4177: 0x000299C9, + 4178: 0x00003762, + 4179: 0x000221C3, + 4180: 0x00008B5E, + 4181: 0x00028B4E, + 4182: 0x000099D6, + 4183: 0x00024812, + 4184: 0x000248FB, + 4185: 0x00024A15, + 4186: 0x00007209, + 4187: 0x00024AC0, + 4188: 0x00020C78, + 4189: 0x00005965, + 4190: 0x00024EA5, + 4191: 0x00024F86, + 4192: 0x00020779, + 4193: 0x00008EDA, + 4194: 0x0002502C, + 4195: 0x0000528F, + 4196: 0x0000573F, + 4197: 0x00007171, + 4198: 0x00025299, + 4199: 0x00025419, + 4200: 0x00023F4A, + 4201: 0x00024AA7, + 4202: 0x000055BC, + 4203: 0x00025446, + 4204: 0x0002546E, + 4205: 0x00026B52, + 4206: 0x000091D4, + 4207: 0x00003473, + 4208: 0x0002553F, + 4209: 0x00027632, + 4210: 0x0002555E, + 4211: 0x00004718, + 4212: 0x00025562, + 4213: 0x00025566, + 4214: 0x000257C7, + 4215: 0x0002493F, + 4216: 0x0002585D, + 4217: 0x00005066, + 4218: 0x000034FB, + 4219: 0x000233CC, + 4220: 0x000060DE, + 4221: 0x00025903, + 4222: 0x0000477C, + 4223: 0x00028948, + 4224: 0x00025AAE, + 4225: 0x00025B89, + 4226: 0x00025C06, + 4227: 0x00021D90, + 4228: 0x000057A1, + 4229: 0x00007151, + 4230: 0x00006FB6, + 4231: 0x00026102, + 4232: 0x00027C12, + 4233: 0x00009056, + 4234: 0x000261B2, + 4235: 0x00024F9A, + 4236: 0x00008B62, + 4237: 0x00026402, + 4238: 0x0002644A, + 4239: 0x00005D5B, + 4240: 0x00026BF7, + 4241: 0x00008F36, + 4242: 0x00026484, + 4243: 0x0002191C, + 4244: 0x00008AEA, + 4245: 0x000249F6, + 4246: 0x00026488, + 4247: 0x00023FEF, + 4248: 0x00026512, + 4249: 0x00004BC0, + 4250: 0x000265BF, + 4251: 0x000266B5, + 4252: 0x0002271B, + 4253: 0x00009465, + 4254: 0x000257E1, + 4255: 0x00006195, + 4256: 0x00005A27, + 4257: 0x0002F8CD, + 4258: 0x00004FBB, + 4259: 0x000056B9, + 4260: 0x00024521, + 4261: 0x000266FC, + 4262: 0x00004E6A, + 4263: 0x00024934, + 4264: 0x00009656, + 4265: 0x00006D8F, + 4266: 0x00026CBD, + 4267: 0x00003618, + 4268: 0x00008977, + 4269: 0x00026799, + 4270: 0x0002686E, + 4271: 0x00026411, + 4272: 0x0002685E, + 4273: 0x000071DF, + 4274: 0x000268C7, + 4275: 0x00007B42, + 4276: 0x000290C0, + 4277: 0x00020A11, + 4278: 0x00026926, + 4279: 0x00009104, + 4280: 0x00026939, + 4281: 0x00007A45, + 4282: 0x00009DF0, + 4283: 0x000269FA, + 4284: 0x00009A26, + 4285: 0x00026A2D, + 4286: 0x0000365F, + 4287: 0x00026469, + 4288: 0x00020021, + 4289: 0x00007983, + 4290: 0x00026A34, + 4291: 0x00026B5B, + 4292: 0x00005D2C, + 4293: 0x00023519, + 4294: 0x000083CF, + 4295: 0x00026B9D, + 4296: 0x000046D0, + 4297: 0x00026CA4, + 4298: 0x0000753B, + 4299: 0x00008865, + 4300: 0x00026DAE, + 4301: 0x000058B6, + 4302: 0x0000371C, + 4303: 0x0002258D, + 4304: 0x0002704B, + 4305: 0x000271CD, + 4306: 0x00003C54, + 4307: 0x00027280, + 4308: 0x00027285, + 4309: 0x00009281, + 4310: 0x0002217A, + 4311: 0x0002728B, + 4312: 0x00009330, + 4313: 0x000272E6, + 4314: 0x000249D0, + 4315: 0x00006C39, + 4316: 0x0000949F, + 4317: 0x00027450, + 4318: 0x00020EF8, + 4319: 0x00008827, + 4320: 0x000088F5, + 4321: 0x00022926, + 4322: 0x00028473, + 4323: 0x000217B1, + 4324: 0x00006EB8, + 4325: 0x00024A2A, + 4326: 0x00021820, + 4327: 0x000039A4, + 4328: 0x000036B9, + 4329: 0x00005C10, + 4330: 0x000079E3, + 4331: 0x0000453F, + 4332: 0x000066B6, + 4333: 0x00029CAD, + 4334: 0x000298A4, + 4335: 0x00008943, + 4336: 0x000277CC, + 4337: 0x00027858, + 4338: 0x000056D6, + 4339: 0x000040DF, + 4340: 0x0002160A, + 4341: 0x000039A1, + 4342: 0x0002372F, + 4343: 0x000280E8, + 4344: 0x000213C5, + 4345: 0x000071AD, + 4346: 0x00008366, + 4347: 0x000279DD, + 4348: 0x000291A8, + 4349: 0x00005A67, + 4350: 0x00004CB7, + 4351: 0x000270AF, + 4352: 0x000289AB, + 4353: 0x000279FD, + 4354: 0x00027A0A, + 4355: 0x00027B0B, + 4356: 0x00027D66, + 4357: 0x0002417A, + 4358: 0x00007B43, + 4359: 0x0000797E, + 4360: 0x00028009, + 4361: 0x00006FB5, + 4362: 0x0002A2DF, + 4363: 0x00006A03, + 4364: 0x00028318, + 4365: 0x000053A2, + 4366: 0x00026E07, + 4367: 0x000093BF, + 4368: 0x00006836, + 4369: 0x0000975D, + 4370: 0x0002816F, + 4371: 0x00028023, + 4372: 0x000269B5, + 4373: 0x000213ED, + 4374: 0x0002322F, + 4375: 0x00028048, + 4376: 0x00005D85, + 4377: 0x00028C30, + 4378: 0x00028083, + 4379: 0x00005715, + 4380: 0x00009823, + 4381: 0x00028949, + 4382: 0x00005DAB, + 4383: 0x00024988, + 4384: 0x000065BE, + 4385: 0x000069D5, + 4386: 0x000053D2, + 4387: 0x00024AA5, + 4388: 0x00023F81, + 4389: 0x00003C11, + 4390: 0x00006736, + 4391: 0x00028090, + 4392: 0x000280F4, + 4393: 0x0002812E, + 4394: 0x00021FA1, + 4395: 0x0002814F, + 4396: 0x00028189, + 4397: 0x000281AF, + 4398: 0x0002821A, + 4399: 0x00028306, + 4400: 0x0002832F, + 4401: 0x0002838A, + 4402: 0x000035CA, + 4403: 0x00028468, + 4404: 0x000286AA, + 4405: 0x000048FA, + 4406: 0x000063E6, + 4407: 0x00028956, + 4408: 0x00007808, + 4409: 0x00009255, + 4410: 0x000289B8, + 4411: 0x000043F2, + 4412: 0x000289E7, + 4413: 0x000043DF, + 4414: 0x000289E8, + 4415: 0x00028B46, + 4416: 0x00028BD4, + 4417: 0x000059F8, + 4418: 0x00028C09, + 4419: 0x00008F0B, + 4420: 0x00028FC5, + 4421: 0x000290EC, + 4422: 0x00007B51, + 4423: 0x00029110, + 4424: 0x0002913C, + 4425: 0x00003DF7, + 4426: 0x0002915E, + 4427: 0x00024ACA, + 4428: 0x00008FD0, + 4429: 0x0000728F, + 4430: 0x0000568B, + 4431: 0x000294E7, + 4432: 0x000295E9, + 4433: 0x000295B0, + 4434: 0x000295B8, + 4435: 0x00029732, + 4436: 0x000298D1, + 4437: 0x00029949, + 4438: 0x0002996A, + 4439: 0x000299C3, + 4440: 0x00029A28, + 4441: 0x00029B0E, + 4442: 0x00029D5A, + 4443: 0x00029D9B, + 4444: 0x00007E9F, + 4445: 0x00029EF8, + 4446: 0x00029F23, + 4447: 0x00004CA4, + 4448: 0x00009547, + 4449: 0x0002A293, + 4450: 0x000071A2, + 4451: 0x0002A2FF, + 4452: 0x00004D91, + 4453: 0x00009012, + 4454: 0x0002A5CB, + 4455: 0x00004D9C, + 4456: 0x00020C9C, + 4457: 0x00008FBE, + 4458: 0x000055C1, + 4459: 0x00008FBA, + 4460: 0x000224B0, + 4461: 0x00008FB9, + 4462: 0x00024A93, + 4463: 0x00004509, + 4464: 0x00007E7F, + 4465: 0x00006F56, + 4466: 0x00006AB1, + 4467: 0x00004EEA, + 4468: 0x000034E4, + 4469: 0x00028B2C, + 4470: 0x0002789D, + 4471: 0x0000373A, + 4472: 0x00008E80, + 4473: 0x000217F5, + 4474: 0x00028024, + 4475: 0x00028B6C, + 4476: 0x00028B99, + 4477: 0x00027A3E, + 4478: 0x000266AF, + 4479: 0x00003DEB, + 4480: 0x00027655, + 4481: 0x00023CB7, + 4482: 0x00025635, + 4483: 0x00025956, + 4484: 0x00004E9A, + 4485: 0x00025E81, + 4486: 0x00026258, + 4487: 0x000056BF, + 4488: 0x00020E6D, + 4489: 0x00008E0E, + 4490: 0x00005B6D, + 4491: 0x00023E88, + 4492: 0x00024C9E, + 4493: 0x000063DE, + 4494: 0x000062D0, + 4495: 0x000217F6, + 4496: 0x0002187B, + 4497: 0x00006530, + 4498: 0x0000562D, + 4499: 0x00025C4A, + 4500: 0x0000541A, + 4501: 0x00025311, + 4502: 0x00003DC6, + 4503: 0x00029D98, + 4504: 0x00004C7D, + 4505: 0x00005622, + 4506: 0x0000561E, + 4507: 0x00007F49, + 4508: 0x00025ED8, + 4509: 0x00005975, + 4510: 0x00023D40, + 4511: 0x00008770, + 4512: 0x00004E1C, + 4513: 0x00020FEA, + 4514: 0x00020D49, + 4515: 0x000236BA, + 4516: 0x00008117, + 4517: 0x00009D5E, + 4518: 0x00008D18, + 4519: 0x0000763B, + 4520: 0x00009C45, + 4521: 0x0000764E, + 4522: 0x000077B9, + 4523: 0x00009345, + 4524: 0x00005432, + 4525: 0x00008148, + 4526: 0x000082F7, + 4527: 0x00005625, + 4528: 0x00008132, + 4529: 0x00008418, + 4530: 0x000080BD, + 4531: 0x000055EA, + 4532: 0x00007962, + 4533: 0x00005643, + 4534: 0x00005416, + 4535: 0x00020E9D, + 4536: 0x000035CE, + 4537: 0x00005605, + 4538: 0x000055F1, + 4539: 0x000066F1, + 4540: 0x000282E2, + 4541: 0x0000362D, + 4542: 0x00007534, + 4543: 0x000055F0, + 4544: 0x000055BA, + 4545: 0x00005497, + 4546: 0x00005572, + 4547: 0x00020C41, + 4548: 0x00020C96, + 4549: 0x00005ED0, + 4550: 0x00025148, + 4551: 0x00020E76, + 4552: 0x00022C62, + 4553: 0x00020EA2, + 4554: 0x00009EAB, + 4555: 0x00007D5A, + 4556: 0x000055DE, + 4557: 0x00021075, + 4558: 0x0000629D, + 4559: 0x0000976D, + 4560: 0x00005494, + 4561: 0x00008CCD, + 4562: 0x000071F6, + 4563: 0x00009176, + 4564: 0x000063FC, + 4565: 0x000063B9, + 4566: 0x000063FE, + 4567: 0x00005569, + 4568: 0x00022B43, + 4569: 0x00009C72, + 4570: 0x00022EB3, + 4571: 0x0000519A, + 4572: 0x000034DF, + 4573: 0x00020DA7, + 4574: 0x000051A7, + 4575: 0x0000544D, + 4576: 0x0000551E, + 4577: 0x00005513, + 4578: 0x00007666, + 4579: 0x00008E2D, + 4580: 0x0002688A, + 4581: 0x000075B1, + 4582: 0x000080B6, + 4583: 0x00008804, + 4584: 0x00008786, + 4585: 0x000088C7, + 4586: 0x000081B6, + 4587: 0x0000841C, + 4588: 0x000210C1, + 4589: 0x000044EC, + 4590: 0x00007304, + 4591: 0x00024706, + 4592: 0x00005B90, + 4593: 0x0000830B, + 4594: 0x00026893, + 4595: 0x0000567B, + 4596: 0x000226F4, + 4597: 0x00027D2F, + 4598: 0x000241A3, + 4599: 0x00027D73, + 4600: 0x00026ED0, + 4601: 0x000272B6, + 4602: 0x00009170, + 4603: 0x000211D9, + 4604: 0x00009208, + 4605: 0x00023CFC, + 4606: 0x0002A6A9, + 4607: 0x00020EAC, + 4608: 0x00020EF9, + 4609: 0x00007266, + 4610: 0x00021CA2, + 4611: 0x0000474E, + 4612: 0x00024FC2, + 4613: 0x00027FF9, + 4614: 0x00020FEB, + 4615: 0x000040FA, + 4616: 0x00009C5D, + 4617: 0x0000651F, + 4618: 0x00022DA0, + 4619: 0x000048F3, + 4620: 0x000247E0, + 4621: 0x00029D7C, + 4622: 0x00020FEC, + 4623: 0x00020E0A, + 4624: 0x00006062, + 4625: 0x000275A3, + 4626: 0x00020FED, + 4628: 0x00026048, + 4629: 0x00021187, + 4630: 0x000071A3, + 4631: 0x00007E8E, + 4632: 0x00009D50, + 4633: 0x00004E1A, + 4634: 0x00004E04, + 4635: 0x00003577, + 4636: 0x00005B0D, + 4637: 0x00006CB2, + 4638: 0x00005367, + 4639: 0x000036AC, + 4640: 0x000039DC, + 4641: 0x0000537D, + 4642: 0x000036A5, + 4643: 0x00024618, + 4644: 0x0000589A, + 4645: 0x00024B6E, + 4646: 0x0000822D, + 4647: 0x0000544B, + 4648: 0x000057AA, + 4649: 0x00025A95, + 4650: 0x00020979, + 4652: 0x00003A52, + 4653: 0x00022465, + 4654: 0x00007374, + 4655: 0x00029EAC, + 4656: 0x00004D09, + 4657: 0x00009BED, + 4658: 0x00023CFE, + 4659: 0x00029F30, + 4660: 0x00004C5B, + 4661: 0x00024FA9, + 4662: 0x0002959E, + 4663: 0x00029FDE, + 4664: 0x0000845C, + 4665: 0x00023DB6, + 4666: 0x000272B2, + 4667: 0x000267B3, + 4668: 0x00023720, + 4669: 0x0000632E, + 4670: 0x00007D25, + 4671: 0x00023EF7, + 4672: 0x00023E2C, + 4673: 0x00003A2A, + 4674: 0x00009008, + 4675: 0x000052CC, + 4676: 0x00003E74, + 4677: 0x0000367A, + 4678: 0x000045E9, + 4679: 0x0002048E, + 4680: 0x00007640, + 4681: 0x00005AF0, + 4682: 0x00020EB6, + 4683: 0x0000787A, + 4684: 0x00027F2E, + 4685: 0x000058A7, + 4686: 0x000040BF, + 4687: 0x0000567C, + 4688: 0x00009B8B, + 4689: 0x00005D74, + 4690: 0x00007654, + 4691: 0x0002A434, + 4692: 0x00009E85, + 4693: 0x00004CE1, + 4694: 0x000075F9, + 4695: 0x000037FB, + 4696: 0x00006119, + 4697: 0x000230DA, + 4698: 0x000243F2, + 4700: 0x0000565D, + 4701: 0x000212A9, + 4702: 0x000057A7, + 4703: 0x00024963, + 4704: 0x00029E06, + 4705: 0x00005234, + 4706: 0x000270AE, + 4707: 0x000035AD, + 4708: 0x00006C4A, + 4709: 0x00009D7C, + 4710: 0x00007C56, + 4711: 0x00009B39, + 4712: 0x000057DE, + 4713: 0x0002176C, + 4714: 0x00005C53, + 4715: 0x000064D3, + 4716: 0x000294D0, + 4717: 0x00026335, + 4718: 0x00027164, + 4719: 0x000086AD, + 4720: 0x00020D28, + 4721: 0x00026D22, + 4722: 0x00024AE2, + 4723: 0x00020D71, + 4725: 0x000051FE, + 4726: 0x00021F0F, + 4727: 0x00005D8E, + 4728: 0x00009703, + 4729: 0x00021DD1, + 4730: 0x00009E81, + 4731: 0x0000904C, + 4732: 0x00007B1F, + 4733: 0x00009B02, + 4734: 0x00005CD1, + 4735: 0x00007BA3, + 4736: 0x00006268, + 4737: 0x00006335, + 4738: 0x00009AFF, + 4739: 0x00007BCF, + 4740: 0x00009B2A, + 4741: 0x00007C7E, + 4742: 0x00009B2E, + 4743: 0x00007C42, + 4744: 0x00007C86, + 4745: 0x00009C15, + 4746: 0x00007BFC, + 4747: 0x00009B09, + 4748: 0x00009F17, + 4749: 0x00009C1B, + 4750: 0x0002493E, + 4751: 0x00009F5A, + 4752: 0x00005573, + 4753: 0x00005BC3, + 4754: 0x00004FFD, + 4755: 0x00009E98, + 4756: 0x00004FF2, + 4757: 0x00005260, + 4758: 0x00003E06, + 4759: 0x000052D1, + 4760: 0x00005767, + 4761: 0x00005056, + 4762: 0x000059B7, + 4763: 0x00005E12, + 4764: 0x000097C8, + 4765: 0x00009DAB, + 4766: 0x00008F5C, + 4767: 0x00005469, + 4768: 0x000097B4, + 4769: 0x00009940, + 4770: 0x000097BA, + 4771: 0x0000532C, + 4772: 0x00006130, + 4773: 0x0000692C, + 4774: 0x000053DA, + 4775: 0x00009C0A, + 4776: 0x00009D02, + 4777: 0x00004C3B, + 4778: 0x00009641, + 4779: 0x00006980, + 4780: 0x000050A6, + 4781: 0x00007546, + 4782: 0x0002176D, + 4783: 0x000099DA, + 4784: 0x00005273, + 4786: 0x00009159, + 4787: 0x00009681, + 4788: 0x0000915C, + 4790: 0x00009151, + 4791: 0x00028E97, + 4792: 0x0000637F, + 4793: 0x00026D23, + 4794: 0x00006ACA, + 4795: 0x00005611, + 4796: 0x0000918E, + 4797: 0x0000757A, + 4798: 0x00006285, + 4799: 0x000203FC, + 4800: 0x0000734F, + 4801: 0x00007C70, + 4802: 0x00025C21, + 4803: 0x00023CFD, + 4805: 0x00024919, + 4806: 0x000076D6, + 4807: 0x00009B9D, + 4808: 0x00004E2A, + 4809: 0x00020CD4, + 4810: 0x000083BE, + 4811: 0x00008842, + 4813: 0x00005C4A, + 4814: 0x000069C0, + 4815: 0x000050ED, + 4816: 0x0000577A, + 4817: 0x0000521F, + 4818: 0x00005DF5, + 4819: 0x00004ECE, + 4820: 0x00006C31, + 4821: 0x000201F2, + 4822: 0x00004F39, + 4823: 0x0000549C, + 4824: 0x000054DA, + 4825: 0x0000529A, + 4826: 0x00008D82, + 4827: 0x000035FE, + 4828: 0x00005F0C, + 4829: 0x000035F3, + 4831: 0x00006B52, + 4832: 0x0000917C, + 4833: 0x00009FA5, + 4834: 0x00009B97, + 4835: 0x0000982E, + 4836: 0x000098B4, + 4837: 0x00009ABA, + 4838: 0x00009EA8, + 4839: 0x00009E84, + 4840: 0x0000717A, + 4841: 0x00007B14, + 4843: 0x00006BFA, + 4844: 0x00008818, + 4845: 0x00007F78, + 4847: 0x00005620, + 4848: 0x0002A64A, + 4849: 0x00008E77, + 4850: 0x00009F53, + 4852: 0x00008DD4, + 4853: 0x00008E4F, + 4854: 0x00009E1C, + 4855: 0x00008E01, + 4856: 0x00006282, + 4857: 0x0002837D, + 4858: 0x00008E28, + 4859: 0x00008E75, + 4860: 0x00007AD3, + 4861: 0x00024A77, + 4862: 0x00007A3E, + 4863: 0x000078D8, + 4864: 0x00006CEA, + 4865: 0x00008A67, + 4866: 0x00007607, + 4867: 0x00028A5A, + 4868: 0x00009F26, + 4869: 0x00006CCE, + 4870: 0x000087D6, + 4871: 0x000075C3, + 4872: 0x0002A2B2, + 4873: 0x00007853, + 4874: 0x0002F840, + 4875: 0x00008D0C, + 4876: 0x000072E2, + 4877: 0x00007371, + 4878: 0x00008B2D, + 4879: 0x00007302, + 4880: 0x000074F1, + 4881: 0x00008CEB, + 4882: 0x00024ABB, + 4883: 0x0000862F, + 4884: 0x00005FBA, + 4885: 0x000088A0, + 4886: 0x000044B7, + 4888: 0x0002183B, + 4889: 0x00026E05, + 4891: 0x00008A7E, + 4892: 0x0002251B, + 4894: 0x000060FD, + 4895: 0x00007667, + 4896: 0x00009AD7, + 4897: 0x00009D44, + 4898: 0x0000936E, + 4899: 0x00009B8F, + 4900: 0x000087F5, + 4902: 0x0000880F, + 4903: 0x00008CF7, + 4904: 0x0000732C, + 4905: 0x00009721, + 4906: 0x00009BB0, + 4907: 0x000035D6, + 4908: 0x000072B2, + 4909: 0x00004C07, + 4910: 0x00007C51, + 4911: 0x0000994A, + 4912: 0x00026159, + 4913: 0x00006159, + 4914: 0x00004C04, + 4915: 0x00009E96, + 4916: 0x0000617D, + 4918: 0x0000575F, + 4919: 0x0000616F, + 4920: 0x000062A6, + 4921: 0x00006239, + 4922: 0x000062CE, + 4923: 0x00003A5C, + 4924: 0x000061E2, + 4925: 0x000053AA, + 4926: 0x000233F5, + 4927: 0x00006364, + 4928: 0x00006802, + 4929: 0x000035D2, + 4930: 0x00005D57, + 4931: 0x00028BC2, + 4932: 0x00008FDA, + 4933: 0x00028E39, + 4935: 0x000050D9, + 4936: 0x00021D46, + 4937: 0x00007906, + 4938: 0x00005332, + 4939: 0x00009638, + 4940: 0x00020F3B, + 4941: 0x00004065, + 4943: 0x000077FE, + 4945: 0x00007CC2, + 4946: 0x00025F1A, + 4947: 0x00007CDA, + 4948: 0x00007A2D, + 4949: 0x00008066, + 4950: 0x00008063, + 4951: 0x00007D4D, + 4952: 0x00007505, + 4953: 0x000074F2, + 4954: 0x00008994, + 4955: 0x0000821A, + 4956: 0x0000670C, + 4957: 0x00008062, + 4958: 0x00027486, + 4959: 0x0000805B, + 4960: 0x000074F0, + 4961: 0x00008103, + 4962: 0x00007724, + 4963: 0x00008989, + 4964: 0x000267CC, + 4965: 0x00007553, + 4966: 0x00026ED1, + 4967: 0x000087A9, + 4968: 0x000087CE, + 4969: 0x000081C8, + 4970: 0x0000878C, + 4971: 0x00008A49, + 4972: 0x00008CAD, + 4973: 0x00008B43, + 4974: 0x0000772B, + 4975: 0x000074F8, + 4976: 0x000084DA, + 4977: 0x00003635, + 4978: 0x000069B2, + 4979: 0x00008DA6, + 4981: 0x000089A9, + 4982: 0x00007468, + 4983: 0x00006DB9, + 4984: 0x000087C1, + 4985: 0x00024011, + 4986: 0x000074E7, + 4987: 0x00003DDB, + 4988: 0x00007176, + 4989: 0x000060A4, + 4990: 0x0000619C, + 4991: 0x00003CD1, + 4992: 0x00007162, + 4993: 0x00006077, + 4995: 0x00007F71, + 4996: 0x00028B2D, + 4997: 0x00007250, + 4998: 0x000060E9, + 4999: 0x00004B7E, + 5000: 0x00005220, + 5001: 0x00003C18, + 5002: 0x00023CC7, + 5003: 0x00025ED7, + 5004: 0x00027656, + 5005: 0x00025531, + 5006: 0x00021944, + 5007: 0x000212FE, + 5008: 0x00029903, + 5009: 0x00026DDC, + 5010: 0x000270AD, + 5011: 0x00005CC1, + 5012: 0x000261AD, + 5013: 0x00028A0F, + 5014: 0x00023677, + 5015: 0x000200EE, + 5016: 0x00026846, + 5017: 0x00024F0E, + 5018: 0x00004562, + 5019: 0x00005B1F, + 5020: 0x0002634C, + 5021: 0x00009F50, + 5022: 0x00009EA6, + 5023: 0x0002626B, + 5024: 0x00003000, + 5025: 0x0000FF0C, + 5026: 0x00003001, + 5027: 0x00003002, + 5028: 0x0000FF0E, + 5029: 0x00002027, + 5030: 0x0000FF1B, + 5031: 0x0000FF1A, + 5032: 0x0000FF1F, + 5033: 0x0000FF01, + 5034: 0x0000FE30, + 5035: 0x00002026, + 5036: 0x00002025, + 5037: 0x0000FE50, + 5038: 0x0000FE51, + 5039: 0x0000FE52, + 5040: 0x000000B7, + 5041: 0x0000FE54, + 5042: 0x0000FE55, + 5043: 0x0000FE56, + 5044: 0x0000FE57, + 5045: 0x0000FF5C, + 5046: 0x00002013, + 5047: 0x0000FE31, + 5048: 0x00002014, + 5049: 0x0000FE33, + 5050: 0x00002574, + 5051: 0x0000FE34, + 5052: 0x0000FE4F, + 5053: 0x0000FF08, + 5054: 0x0000FF09, + 5055: 0x0000FE35, + 5056: 0x0000FE36, + 5057: 0x0000FF5B, + 5058: 0x0000FF5D, + 5059: 0x0000FE37, + 5060: 0x0000FE38, + 5061: 0x00003014, + 5062: 0x00003015, + 5063: 0x0000FE39, + 5064: 0x0000FE3A, + 5065: 0x00003010, + 5066: 0x00003011, + 5067: 0x0000FE3B, + 5068: 0x0000FE3C, + 5069: 0x0000300A, + 5070: 0x0000300B, + 5071: 0x0000FE3D, + 5072: 0x0000FE3E, + 5073: 0x00003008, + 5074: 0x00003009, + 5075: 0x0000FE3F, + 5076: 0x0000FE40, + 5077: 0x0000300C, + 5078: 0x0000300D, + 5079: 0x0000FE41, + 5080: 0x0000FE42, + 5081: 0x0000300E, + 5082: 0x0000300F, + 5083: 0x0000FE43, + 5084: 0x0000FE44, + 5085: 0x0000FE59, + 5086: 0x0000FE5A, + 5087: 0x0000FE5B, + 5088: 0x0000FE5C, + 5089: 0x0000FE5D, + 5090: 0x0000FE5E, + 5091: 0x00002018, + 5092: 0x00002019, + 5093: 0x0000201C, + 5094: 0x0000201D, + 5095: 0x0000301D, + 5096: 0x0000301E, + 5097: 0x00002035, + 5098: 0x00002032, + 5099: 0x0000FF03, + 5100: 0x0000FF06, + 5101: 0x0000FF0A, + 5102: 0x0000203B, + 5103: 0x000000A7, + 5104: 0x00003003, + 5105: 0x000025CB, + 5106: 0x000025CF, + 5107: 0x000025B3, + 5108: 0x000025B2, + 5109: 0x000025CE, + 5110: 0x00002606, + 5111: 0x00002605, + 5112: 0x000025C7, + 5113: 0x000025C6, + 5114: 0x000025A1, + 5115: 0x000025A0, + 5116: 0x000025BD, + 5117: 0x000025BC, + 5118: 0x000032A3, + 5119: 0x00002105, + 5120: 0x000000AF, + 5121: 0x0000FFE3, + 5122: 0x0000FF3F, + 5123: 0x000002CD, + 5124: 0x0000FE49, + 5125: 0x0000FE4A, + 5126: 0x0000FE4D, + 5127: 0x0000FE4E, + 5128: 0x0000FE4B, + 5129: 0x0000FE4C, + 5130: 0x0000FE5F, + 5131: 0x0000FE60, + 5132: 0x0000FE61, + 5133: 0x0000FF0B, + 5134: 0x0000FF0D, + 5135: 0x000000D7, + 5136: 0x000000F7, + 5137: 0x000000B1, + 5138: 0x0000221A, + 5139: 0x0000FF1C, + 5140: 0x0000FF1E, + 5141: 0x0000FF1D, + 5142: 0x00002266, + 5143: 0x00002267, + 5144: 0x00002260, + 5145: 0x0000221E, + 5146: 0x00002252, + 5147: 0x00002261, + 5148: 0x0000FE62, + 5149: 0x0000FE63, + 5150: 0x0000FE64, + 5151: 0x0000FE65, + 5152: 0x0000FE66, + 5153: 0x0000FF5E, + 5154: 0x00002229, + 5155: 0x0000222A, + 5156: 0x000022A5, + 5157: 0x00002220, + 5158: 0x0000221F, + 5159: 0x000022BF, + 5160: 0x000033D2, + 5161: 0x000033D1, + 5162: 0x0000222B, + 5163: 0x0000222E, + 5164: 0x00002235, + 5165: 0x00002234, + 5166: 0x00002640, + 5167: 0x00002642, + 5168: 0x00002295, + 5169: 0x00002299, + 5170: 0x00002191, + 5171: 0x00002193, + 5172: 0x00002190, + 5173: 0x00002192, + 5174: 0x00002196, + 5175: 0x00002197, + 5176: 0x00002199, + 5177: 0x00002198, + 5178: 0x00002225, + 5179: 0x00002223, + 5180: 0x0000FF0F, + 5181: 0x0000FF3C, + 5182: 0x00002215, + 5183: 0x0000FE68, + 5184: 0x0000FF04, + 5185: 0x0000FFE5, + 5186: 0x00003012, + 5187: 0x0000FFE0, + 5188: 0x0000FFE1, + 5189: 0x0000FF05, + 5190: 0x0000FF20, + 5191: 0x00002103, + 5192: 0x00002109, + 5193: 0x0000FE69, + 5194: 0x0000FE6A, + 5195: 0x0000FE6B, + 5196: 0x000033D5, + 5197: 0x0000339C, + 5198: 0x0000339D, + 5199: 0x0000339E, + 5200: 0x000033CE, + 5201: 0x000033A1, + 5202: 0x0000338E, + 5203: 0x0000338F, + 5204: 0x000033C4, + 5205: 0x000000B0, + 5206: 0x00005159, + 5207: 0x0000515B, + 5208: 0x0000515E, + 5209: 0x0000515D, + 5210: 0x00005161, + 5211: 0x00005163, + 5212: 0x000055E7, + 5213: 0x000074E9, + 5214: 0x00007CCE, + 5215: 0x00002581, + 5216: 0x00002582, + 5217: 0x00002583, + 5218: 0x00002584, + 5219: 0x00002585, + 5220: 0x00002586, + 5221: 0x00002587, + 5222: 0x00002588, + 5223: 0x0000258F, + 5224: 0x0000258E, + 5225: 0x0000258D, + 5226: 0x0000258C, + 5227: 0x0000258B, + 5228: 0x0000258A, + 5229: 0x00002589, + 5230: 0x0000253C, + 5231: 0x00002534, + 5232: 0x0000252C, + 5233: 0x00002524, + 5234: 0x0000251C, + 5235: 0x00002594, + 5236: 0x00002500, + 5237: 0x00002502, + 5238: 0x00002595, + 5239: 0x0000250C, + 5240: 0x00002510, + 5241: 0x00002514, + 5242: 0x00002518, + 5243: 0x0000256D, + 5244: 0x0000256E, + 5245: 0x00002570, + 5246: 0x0000256F, + 5247: 0x00002550, + 5248: 0x0000255E, + 5249: 0x0000256A, + 5250: 0x00002561, + 5251: 0x000025E2, + 5252: 0x000025E3, + 5253: 0x000025E5, + 5254: 0x000025E4, + 5255: 0x00002571, + 5256: 0x00002572, + 5257: 0x00002573, + 5258: 0x0000FF10, + 5259: 0x0000FF11, + 5260: 0x0000FF12, + 5261: 0x0000FF13, + 5262: 0x0000FF14, + 5263: 0x0000FF15, + 5264: 0x0000FF16, + 5265: 0x0000FF17, + 5266: 0x0000FF18, + 5267: 0x0000FF19, + 5268: 0x00002160, + 5269: 0x00002161, + 5270: 0x00002162, + 5271: 0x00002163, + 5272: 0x00002164, + 5273: 0x00002165, + 5274: 0x00002166, + 5275: 0x00002167, + 5276: 0x00002168, + 5277: 0x00002169, + 5278: 0x00003021, + 5279: 0x00003022, + 5280: 0x00003023, + 5281: 0x00003024, + 5282: 0x00003025, + 5283: 0x00003026, + 5284: 0x00003027, + 5285: 0x00003028, + 5286: 0x00003029, + 5287: 0x00005341, + 5288: 0x00005344, + 5289: 0x00005345, + 5290: 0x0000FF21, + 5291: 0x0000FF22, + 5292: 0x0000FF23, + 5293: 0x0000FF24, + 5294: 0x0000FF25, + 5295: 0x0000FF26, + 5296: 0x0000FF27, + 5297: 0x0000FF28, + 5298: 0x0000FF29, + 5299: 0x0000FF2A, + 5300: 0x0000FF2B, + 5301: 0x0000FF2C, + 5302: 0x0000FF2D, + 5303: 0x0000FF2E, + 5304: 0x0000FF2F, + 5305: 0x0000FF30, + 5306: 0x0000FF31, + 5307: 0x0000FF32, + 5308: 0x0000FF33, + 5309: 0x0000FF34, + 5310: 0x0000FF35, + 5311: 0x0000FF36, + 5312: 0x0000FF37, + 5313: 0x0000FF38, + 5314: 0x0000FF39, + 5315: 0x0000FF3A, + 5316: 0x0000FF41, + 5317: 0x0000FF42, + 5318: 0x0000FF43, + 5319: 0x0000FF44, + 5320: 0x0000FF45, + 5321: 0x0000FF46, + 5322: 0x0000FF47, + 5323: 0x0000FF48, + 5324: 0x0000FF49, + 5325: 0x0000FF4A, + 5326: 0x0000FF4B, + 5327: 0x0000FF4C, + 5328: 0x0000FF4D, + 5329: 0x0000FF4E, + 5330: 0x0000FF4F, + 5331: 0x0000FF50, + 5332: 0x0000FF51, + 5333: 0x0000FF52, + 5334: 0x0000FF53, + 5335: 0x0000FF54, + 5336: 0x0000FF55, + 5337: 0x0000FF56, + 5338: 0x0000FF57, + 5339: 0x0000FF58, + 5340: 0x0000FF59, + 5341: 0x0000FF5A, + 5342: 0x00000391, + 5343: 0x00000392, + 5344: 0x00000393, + 5345: 0x00000394, + 5346: 0x00000395, + 5347: 0x00000396, + 5348: 0x00000397, + 5349: 0x00000398, + 5350: 0x00000399, + 5351: 0x0000039A, + 5352: 0x0000039B, + 5353: 0x0000039C, + 5354: 0x0000039D, + 5355: 0x0000039E, + 5356: 0x0000039F, + 5357: 0x000003A0, + 5358: 0x000003A1, + 5359: 0x000003A3, + 5360: 0x000003A4, + 5361: 0x000003A5, + 5362: 0x000003A6, + 5363: 0x000003A7, + 5364: 0x000003A8, + 5365: 0x000003A9, + 5366: 0x000003B1, + 5367: 0x000003B2, + 5368: 0x000003B3, + 5369: 0x000003B4, + 5370: 0x000003B5, + 5371: 0x000003B6, + 5372: 0x000003B7, + 5373: 0x000003B8, + 5374: 0x000003B9, + 5375: 0x000003BA, + 5376: 0x000003BB, + 5377: 0x000003BC, + 5378: 0x000003BD, + 5379: 0x000003BE, + 5380: 0x000003BF, + 5381: 0x000003C0, + 5382: 0x000003C1, + 5383: 0x000003C3, + 5384: 0x000003C4, + 5385: 0x000003C5, + 5386: 0x000003C6, + 5387: 0x000003C7, + 5388: 0x000003C8, + 5389: 0x000003C9, + 5390: 0x00003105, + 5391: 0x00003106, + 5392: 0x00003107, + 5393: 0x00003108, + 5394: 0x00003109, + 5395: 0x0000310A, + 5396: 0x0000310B, + 5397: 0x0000310C, + 5398: 0x0000310D, + 5399: 0x0000310E, + 5400: 0x0000310F, + 5401: 0x00003110, + 5402: 0x00003111, + 5403: 0x00003112, + 5404: 0x00003113, + 5405: 0x00003114, + 5406: 0x00003115, + 5407: 0x00003116, + 5408: 0x00003117, + 5409: 0x00003118, + 5410: 0x00003119, + 5411: 0x0000311A, + 5412: 0x0000311B, + 5413: 0x0000311C, + 5414: 0x0000311D, + 5415: 0x0000311E, + 5416: 0x0000311F, + 5417: 0x00003120, + 5418: 0x00003121, + 5419: 0x00003122, + 5420: 0x00003123, + 5421: 0x00003124, + 5422: 0x00003125, + 5423: 0x00003126, + 5424: 0x00003127, + 5425: 0x00003128, + 5426: 0x00003129, + 5427: 0x000002D9, + 5428: 0x000002C9, + 5429: 0x000002CA, + 5430: 0x000002C7, + 5431: 0x000002CB, + 5432: 0x00002400, + 5433: 0x00002401, + 5434: 0x00002402, + 5435: 0x00002403, + 5436: 0x00002404, + 5437: 0x00002405, + 5438: 0x00002406, + 5439: 0x00002407, + 5440: 0x00002408, + 5441: 0x00002409, + 5442: 0x0000240A, + 5443: 0x0000240B, + 5444: 0x0000240C, + 5445: 0x0000240D, + 5446: 0x0000240E, + 5447: 0x0000240F, + 5448: 0x00002410, + 5449: 0x00002411, + 5450: 0x00002412, + 5451: 0x00002413, + 5452: 0x00002414, + 5453: 0x00002415, + 5454: 0x00002416, + 5455: 0x00002417, + 5456: 0x00002418, + 5457: 0x00002419, + 5458: 0x0000241A, + 5459: 0x0000241B, + 5460: 0x0000241C, + 5461: 0x0000241D, + 5462: 0x0000241E, + 5463: 0x0000241F, + 5464: 0x00002421, + 5465: 0x000020AC, + 5495: 0x00004E00, + 5496: 0x00004E59, + 5497: 0x00004E01, + 5498: 0x00004E03, + 5499: 0x00004E43, + 5500: 0x00004E5D, + 5501: 0x00004E86, + 5502: 0x00004E8C, + 5503: 0x00004EBA, + 5504: 0x0000513F, + 5505: 0x00005165, + 5506: 0x0000516B, + 5507: 0x000051E0, + 5508: 0x00005200, + 5509: 0x00005201, + 5510: 0x0000529B, + 5511: 0x00005315, + 5512: 0x00005341, + 5513: 0x0000535C, + 5514: 0x000053C8, + 5515: 0x00004E09, + 5516: 0x00004E0B, + 5517: 0x00004E08, + 5518: 0x00004E0A, + 5519: 0x00004E2B, + 5520: 0x00004E38, + 5521: 0x000051E1, + 5522: 0x00004E45, + 5523: 0x00004E48, + 5524: 0x00004E5F, + 5525: 0x00004E5E, + 5526: 0x00004E8E, + 5527: 0x00004EA1, + 5528: 0x00005140, + 5529: 0x00005203, + 5530: 0x000052FA, + 5531: 0x00005343, + 5532: 0x000053C9, + 5533: 0x000053E3, + 5534: 0x0000571F, + 5535: 0x000058EB, + 5536: 0x00005915, + 5537: 0x00005927, + 5538: 0x00005973, + 5539: 0x00005B50, + 5540: 0x00005B51, + 5541: 0x00005B53, + 5542: 0x00005BF8, + 5543: 0x00005C0F, + 5544: 0x00005C22, + 5545: 0x00005C38, + 5546: 0x00005C71, + 5547: 0x00005DDD, + 5548: 0x00005DE5, + 5549: 0x00005DF1, + 5550: 0x00005DF2, + 5551: 0x00005DF3, + 5552: 0x00005DFE, + 5553: 0x00005E72, + 5554: 0x00005EFE, + 5555: 0x00005F0B, + 5556: 0x00005F13, + 5557: 0x0000624D, + 5558: 0x00004E11, + 5559: 0x00004E10, + 5560: 0x00004E0D, + 5561: 0x00004E2D, + 5562: 0x00004E30, + 5563: 0x00004E39, + 5564: 0x00004E4B, + 5565: 0x00005C39, + 5566: 0x00004E88, + 5567: 0x00004E91, + 5568: 0x00004E95, + 5569: 0x00004E92, + 5570: 0x00004E94, + 5571: 0x00004EA2, + 5572: 0x00004EC1, + 5573: 0x00004EC0, + 5574: 0x00004EC3, + 5575: 0x00004EC6, + 5576: 0x00004EC7, + 5577: 0x00004ECD, + 5578: 0x00004ECA, + 5579: 0x00004ECB, + 5580: 0x00004EC4, + 5581: 0x00005143, + 5582: 0x00005141, + 5583: 0x00005167, + 5584: 0x0000516D, + 5585: 0x0000516E, + 5586: 0x0000516C, + 5587: 0x00005197, + 5588: 0x000051F6, + 5589: 0x00005206, + 5590: 0x00005207, + 5591: 0x00005208, + 5592: 0x000052FB, + 5593: 0x000052FE, + 5594: 0x000052FF, + 5595: 0x00005316, + 5596: 0x00005339, + 5597: 0x00005348, + 5598: 0x00005347, + 5599: 0x00005345, + 5600: 0x0000535E, + 5601: 0x00005384, + 5602: 0x000053CB, + 5603: 0x000053CA, + 5604: 0x000053CD, + 5605: 0x000058EC, + 5606: 0x00005929, + 5607: 0x0000592B, + 5608: 0x0000592A, + 5609: 0x0000592D, + 5610: 0x00005B54, + 5611: 0x00005C11, + 5612: 0x00005C24, + 5613: 0x00005C3A, + 5614: 0x00005C6F, + 5615: 0x00005DF4, + 5616: 0x00005E7B, + 5617: 0x00005EFF, + 5618: 0x00005F14, + 5619: 0x00005F15, + 5620: 0x00005FC3, + 5621: 0x00006208, + 5622: 0x00006236, + 5623: 0x0000624B, + 5624: 0x0000624E, + 5625: 0x0000652F, + 5626: 0x00006587, + 5627: 0x00006597, + 5628: 0x000065A4, + 5629: 0x000065B9, + 5630: 0x000065E5, + 5631: 0x000066F0, + 5632: 0x00006708, + 5633: 0x00006728, + 5634: 0x00006B20, + 5635: 0x00006B62, + 5636: 0x00006B79, + 5637: 0x00006BCB, + 5638: 0x00006BD4, + 5639: 0x00006BDB, + 5640: 0x00006C0F, + 5641: 0x00006C34, + 5642: 0x0000706B, + 5643: 0x0000722A, + 5644: 0x00007236, + 5645: 0x0000723B, + 5646: 0x00007247, + 5647: 0x00007259, + 5648: 0x0000725B, + 5649: 0x000072AC, + 5650: 0x0000738B, + 5651: 0x00004E19, + 5652: 0x00004E16, + 5653: 0x00004E15, + 5654: 0x00004E14, + 5655: 0x00004E18, + 5656: 0x00004E3B, + 5657: 0x00004E4D, + 5658: 0x00004E4F, + 5659: 0x00004E4E, + 5660: 0x00004EE5, + 5661: 0x00004ED8, + 5662: 0x00004ED4, + 5663: 0x00004ED5, + 5664: 0x00004ED6, + 5665: 0x00004ED7, + 5666: 0x00004EE3, + 5667: 0x00004EE4, + 5668: 0x00004ED9, + 5669: 0x00004EDE, + 5670: 0x00005145, + 5671: 0x00005144, + 5672: 0x00005189, + 5673: 0x0000518A, + 5674: 0x000051AC, + 5675: 0x000051F9, + 5676: 0x000051FA, + 5677: 0x000051F8, + 5678: 0x0000520A, + 5679: 0x000052A0, + 5680: 0x0000529F, + 5681: 0x00005305, + 5682: 0x00005306, + 5683: 0x00005317, + 5684: 0x0000531D, + 5685: 0x00004EDF, + 5686: 0x0000534A, + 5687: 0x00005349, + 5688: 0x00005361, + 5689: 0x00005360, + 5690: 0x0000536F, + 5691: 0x0000536E, + 5692: 0x000053BB, + 5693: 0x000053EF, + 5694: 0x000053E4, + 5695: 0x000053F3, + 5696: 0x000053EC, + 5697: 0x000053EE, + 5698: 0x000053E9, + 5699: 0x000053E8, + 5700: 0x000053FC, + 5701: 0x000053F8, + 5702: 0x000053F5, + 5703: 0x000053EB, + 5704: 0x000053E6, + 5705: 0x000053EA, + 5706: 0x000053F2, + 5707: 0x000053F1, + 5708: 0x000053F0, + 5709: 0x000053E5, + 5710: 0x000053ED, + 5711: 0x000053FB, + 5712: 0x000056DB, + 5713: 0x000056DA, + 5714: 0x00005916, + 5715: 0x0000592E, + 5716: 0x00005931, + 5717: 0x00005974, + 5718: 0x00005976, + 5719: 0x00005B55, + 5720: 0x00005B83, + 5721: 0x00005C3C, + 5722: 0x00005DE8, + 5723: 0x00005DE7, + 5724: 0x00005DE6, + 5725: 0x00005E02, + 5726: 0x00005E03, + 5727: 0x00005E73, + 5728: 0x00005E7C, + 5729: 0x00005F01, + 5730: 0x00005F18, + 5731: 0x00005F17, + 5732: 0x00005FC5, + 5733: 0x0000620A, + 5734: 0x00006253, + 5735: 0x00006254, + 5736: 0x00006252, + 5737: 0x00006251, + 5738: 0x000065A5, + 5739: 0x000065E6, + 5740: 0x0000672E, + 5741: 0x0000672C, + 5742: 0x0000672A, + 5743: 0x0000672B, + 5744: 0x0000672D, + 5745: 0x00006B63, + 5746: 0x00006BCD, + 5747: 0x00006C11, + 5748: 0x00006C10, + 5749: 0x00006C38, + 5750: 0x00006C41, + 5751: 0x00006C40, + 5752: 0x00006C3E, + 5753: 0x000072AF, + 5754: 0x00007384, + 5755: 0x00007389, + 5756: 0x000074DC, + 5757: 0x000074E6, + 5758: 0x00007518, + 5759: 0x0000751F, + 5760: 0x00007528, + 5761: 0x00007529, + 5762: 0x00007530, + 5763: 0x00007531, + 5764: 0x00007532, + 5765: 0x00007533, + 5766: 0x0000758B, + 5767: 0x0000767D, + 5768: 0x000076AE, + 5769: 0x000076BF, + 5770: 0x000076EE, + 5771: 0x000077DB, + 5772: 0x000077E2, + 5773: 0x000077F3, + 5774: 0x0000793A, + 5775: 0x000079BE, + 5776: 0x00007A74, + 5777: 0x00007ACB, + 5778: 0x00004E1E, + 5779: 0x00004E1F, + 5780: 0x00004E52, + 5781: 0x00004E53, + 5782: 0x00004E69, + 5783: 0x00004E99, + 5784: 0x00004EA4, + 5785: 0x00004EA6, + 5786: 0x00004EA5, + 5787: 0x00004EFF, + 5788: 0x00004F09, + 5789: 0x00004F19, + 5790: 0x00004F0A, + 5791: 0x00004F15, + 5792: 0x00004F0D, + 5793: 0x00004F10, + 5794: 0x00004F11, + 5795: 0x00004F0F, + 5796: 0x00004EF2, + 5797: 0x00004EF6, + 5798: 0x00004EFB, + 5799: 0x00004EF0, + 5800: 0x00004EF3, + 5801: 0x00004EFD, + 5802: 0x00004F01, + 5803: 0x00004F0B, + 5804: 0x00005149, + 5805: 0x00005147, + 5806: 0x00005146, + 5807: 0x00005148, + 5808: 0x00005168, + 5809: 0x00005171, + 5810: 0x0000518D, + 5811: 0x000051B0, + 5812: 0x00005217, + 5813: 0x00005211, + 5814: 0x00005212, + 5815: 0x0000520E, + 5816: 0x00005216, + 5817: 0x000052A3, + 5818: 0x00005308, + 5819: 0x00005321, + 5820: 0x00005320, + 5821: 0x00005370, + 5822: 0x00005371, + 5823: 0x00005409, + 5824: 0x0000540F, + 5825: 0x0000540C, + 5826: 0x0000540A, + 5827: 0x00005410, + 5828: 0x00005401, + 5829: 0x0000540B, + 5830: 0x00005404, + 5831: 0x00005411, + 5832: 0x0000540D, + 5833: 0x00005408, + 5834: 0x00005403, + 5835: 0x0000540E, + 5836: 0x00005406, + 5837: 0x00005412, + 5838: 0x000056E0, + 5839: 0x000056DE, + 5840: 0x000056DD, + 5841: 0x00005733, + 5842: 0x00005730, + 5843: 0x00005728, + 5844: 0x0000572D, + 5845: 0x0000572C, + 5846: 0x0000572F, + 5847: 0x00005729, + 5848: 0x00005919, + 5849: 0x0000591A, + 5850: 0x00005937, + 5851: 0x00005938, + 5852: 0x00005984, + 5853: 0x00005978, + 5854: 0x00005983, + 5855: 0x0000597D, + 5856: 0x00005979, + 5857: 0x00005982, + 5858: 0x00005981, + 5859: 0x00005B57, + 5860: 0x00005B58, + 5861: 0x00005B87, + 5862: 0x00005B88, + 5863: 0x00005B85, + 5864: 0x00005B89, + 5865: 0x00005BFA, + 5866: 0x00005C16, + 5867: 0x00005C79, + 5868: 0x00005DDE, + 5869: 0x00005E06, + 5870: 0x00005E76, + 5871: 0x00005E74, + 5872: 0x00005F0F, + 5873: 0x00005F1B, + 5874: 0x00005FD9, + 5875: 0x00005FD6, + 5876: 0x0000620E, + 5877: 0x0000620C, + 5878: 0x0000620D, + 5879: 0x00006210, + 5880: 0x00006263, + 5881: 0x0000625B, + 5882: 0x00006258, + 5883: 0x00006536, + 5884: 0x000065E9, + 5885: 0x000065E8, + 5886: 0x000065EC, + 5887: 0x000065ED, + 5888: 0x000066F2, + 5889: 0x000066F3, + 5890: 0x00006709, + 5891: 0x0000673D, + 5892: 0x00006734, + 5893: 0x00006731, + 5894: 0x00006735, + 5895: 0x00006B21, + 5896: 0x00006B64, + 5897: 0x00006B7B, + 5898: 0x00006C16, + 5899: 0x00006C5D, + 5900: 0x00006C57, + 5901: 0x00006C59, + 5902: 0x00006C5F, + 5903: 0x00006C60, + 5904: 0x00006C50, + 5905: 0x00006C55, + 5906: 0x00006C61, + 5907: 0x00006C5B, + 5908: 0x00006C4D, + 5909: 0x00006C4E, + 5910: 0x00007070, + 5911: 0x0000725F, + 5912: 0x0000725D, + 5913: 0x0000767E, + 5914: 0x00007AF9, + 5915: 0x00007C73, + 5916: 0x00007CF8, + 5917: 0x00007F36, + 5918: 0x00007F8A, + 5919: 0x00007FBD, + 5920: 0x00008001, + 5921: 0x00008003, + 5922: 0x0000800C, + 5923: 0x00008012, + 5924: 0x00008033, + 5925: 0x0000807F, + 5926: 0x00008089, + 5927: 0x0000808B, + 5928: 0x0000808C, + 5929: 0x000081E3, + 5930: 0x000081EA, + 5931: 0x000081F3, + 5932: 0x000081FC, + 5933: 0x0000820C, + 5934: 0x0000821B, + 5935: 0x0000821F, + 5936: 0x0000826E, + 5937: 0x00008272, + 5938: 0x0000827E, + 5939: 0x0000866B, + 5940: 0x00008840, + 5941: 0x0000884C, + 5942: 0x00008863, + 5943: 0x0000897F, + 5944: 0x00009621, + 5945: 0x00004E32, + 5946: 0x00004EA8, + 5947: 0x00004F4D, + 5948: 0x00004F4F, + 5949: 0x00004F47, + 5950: 0x00004F57, + 5951: 0x00004F5E, + 5952: 0x00004F34, + 5953: 0x00004F5B, + 5954: 0x00004F55, + 5955: 0x00004F30, + 5956: 0x00004F50, + 5957: 0x00004F51, + 5958: 0x00004F3D, + 5959: 0x00004F3A, + 5960: 0x00004F38, + 5961: 0x00004F43, + 5962: 0x00004F54, + 5963: 0x00004F3C, + 5964: 0x00004F46, + 5965: 0x00004F63, + 5966: 0x00004F5C, + 5967: 0x00004F60, + 5968: 0x00004F2F, + 5969: 0x00004F4E, + 5970: 0x00004F36, + 5971: 0x00004F59, + 5972: 0x00004F5D, + 5973: 0x00004F48, + 5974: 0x00004F5A, + 5975: 0x0000514C, + 5976: 0x0000514B, + 5977: 0x0000514D, + 5978: 0x00005175, + 5979: 0x000051B6, + 5980: 0x000051B7, + 5981: 0x00005225, + 5982: 0x00005224, + 5983: 0x00005229, + 5984: 0x0000522A, + 5985: 0x00005228, + 5986: 0x000052AB, + 5987: 0x000052A9, + 5988: 0x000052AA, + 5989: 0x000052AC, + 5990: 0x00005323, + 5991: 0x00005373, + 5992: 0x00005375, + 5993: 0x0000541D, + 5994: 0x0000542D, + 5995: 0x0000541E, + 5996: 0x0000543E, + 5997: 0x00005426, + 5998: 0x0000544E, + 5999: 0x00005427, + 6000: 0x00005446, + 6001: 0x00005443, + 6002: 0x00005433, + 6003: 0x00005448, + 6004: 0x00005442, + 6005: 0x0000541B, + 6006: 0x00005429, + 6007: 0x0000544A, + 6008: 0x00005439, + 6009: 0x0000543B, + 6010: 0x00005438, + 6011: 0x0000542E, + 6012: 0x00005435, + 6013: 0x00005436, + 6014: 0x00005420, + 6015: 0x0000543C, + 6016: 0x00005440, + 6017: 0x00005431, + 6018: 0x0000542B, + 6019: 0x0000541F, + 6020: 0x0000542C, + 6021: 0x000056EA, + 6022: 0x000056F0, + 6023: 0x000056E4, + 6024: 0x000056EB, + 6025: 0x0000574A, + 6026: 0x00005751, + 6027: 0x00005740, + 6028: 0x0000574D, + 6029: 0x00005747, + 6030: 0x0000574E, + 6031: 0x0000573E, + 6032: 0x00005750, + 6033: 0x0000574F, + 6034: 0x0000573B, + 6035: 0x000058EF, + 6036: 0x0000593E, + 6037: 0x0000599D, + 6038: 0x00005992, + 6039: 0x000059A8, + 6040: 0x0000599E, + 6041: 0x000059A3, + 6042: 0x00005999, + 6043: 0x00005996, + 6044: 0x0000598D, + 6045: 0x000059A4, + 6046: 0x00005993, + 6047: 0x0000598A, + 6048: 0x000059A5, + 6049: 0x00005B5D, + 6050: 0x00005B5C, + 6051: 0x00005B5A, + 6052: 0x00005B5B, + 6053: 0x00005B8C, + 6054: 0x00005B8B, + 6055: 0x00005B8F, + 6056: 0x00005C2C, + 6057: 0x00005C40, + 6058: 0x00005C41, + 6059: 0x00005C3F, + 6060: 0x00005C3E, + 6061: 0x00005C90, + 6062: 0x00005C91, + 6063: 0x00005C94, + 6064: 0x00005C8C, + 6065: 0x00005DEB, + 6066: 0x00005E0C, + 6067: 0x00005E8F, + 6068: 0x00005E87, + 6069: 0x00005E8A, + 6070: 0x00005EF7, + 6071: 0x00005F04, + 6072: 0x00005F1F, + 6073: 0x00005F64, + 6074: 0x00005F62, + 6075: 0x00005F77, + 6076: 0x00005F79, + 6077: 0x00005FD8, + 6078: 0x00005FCC, + 6079: 0x00005FD7, + 6080: 0x00005FCD, + 6081: 0x00005FF1, + 6082: 0x00005FEB, + 6083: 0x00005FF8, + 6084: 0x00005FEA, + 6085: 0x00006212, + 6086: 0x00006211, + 6087: 0x00006284, + 6088: 0x00006297, + 6089: 0x00006296, + 6090: 0x00006280, + 6091: 0x00006276, + 6092: 0x00006289, + 6093: 0x0000626D, + 6094: 0x0000628A, + 6095: 0x0000627C, + 6096: 0x0000627E, + 6097: 0x00006279, + 6098: 0x00006273, + 6099: 0x00006292, + 6100: 0x0000626F, + 6101: 0x00006298, + 6102: 0x0000626E, + 6103: 0x00006295, + 6104: 0x00006293, + 6105: 0x00006291, + 6106: 0x00006286, + 6107: 0x00006539, + 6108: 0x0000653B, + 6109: 0x00006538, + 6110: 0x000065F1, + 6111: 0x000066F4, + 6112: 0x0000675F, + 6113: 0x0000674E, + 6114: 0x0000674F, + 6115: 0x00006750, + 6116: 0x00006751, + 6117: 0x0000675C, + 6118: 0x00006756, + 6119: 0x0000675E, + 6120: 0x00006749, + 6121: 0x00006746, + 6122: 0x00006760, + 6123: 0x00006753, + 6124: 0x00006757, + 6125: 0x00006B65, + 6126: 0x00006BCF, + 6127: 0x00006C42, + 6128: 0x00006C5E, + 6129: 0x00006C99, + 6130: 0x00006C81, + 6131: 0x00006C88, + 6132: 0x00006C89, + 6133: 0x00006C85, + 6134: 0x00006C9B, + 6135: 0x00006C6A, + 6136: 0x00006C7A, + 6137: 0x00006C90, + 6138: 0x00006C70, + 6139: 0x00006C8C, + 6140: 0x00006C68, + 6141: 0x00006C96, + 6142: 0x00006C92, + 6143: 0x00006C7D, + 6144: 0x00006C83, + 6145: 0x00006C72, + 6146: 0x00006C7E, + 6147: 0x00006C74, + 6148: 0x00006C86, + 6149: 0x00006C76, + 6150: 0x00006C8D, + 6151: 0x00006C94, + 6152: 0x00006C98, + 6153: 0x00006C82, + 6154: 0x00007076, + 6155: 0x0000707C, + 6156: 0x0000707D, + 6157: 0x00007078, + 6158: 0x00007262, + 6159: 0x00007261, + 6160: 0x00007260, + 6161: 0x000072C4, + 6162: 0x000072C2, + 6163: 0x00007396, + 6164: 0x0000752C, + 6165: 0x0000752B, + 6166: 0x00007537, + 6167: 0x00007538, + 6168: 0x00007682, + 6169: 0x000076EF, + 6170: 0x000077E3, + 6171: 0x000079C1, + 6172: 0x000079C0, + 6173: 0x000079BF, + 6174: 0x00007A76, + 6175: 0x00007CFB, + 6176: 0x00007F55, + 6177: 0x00008096, + 6178: 0x00008093, + 6179: 0x0000809D, + 6180: 0x00008098, + 6181: 0x0000809B, + 6182: 0x0000809A, + 6183: 0x000080B2, + 6184: 0x0000826F, + 6185: 0x00008292, + 6186: 0x0000828B, + 6187: 0x0000828D, + 6188: 0x0000898B, + 6189: 0x000089D2, + 6190: 0x00008A00, + 6191: 0x00008C37, + 6192: 0x00008C46, + 6193: 0x00008C55, + 6194: 0x00008C9D, + 6195: 0x00008D64, + 6196: 0x00008D70, + 6197: 0x00008DB3, + 6198: 0x00008EAB, + 6199: 0x00008ECA, + 6200: 0x00008F9B, + 6201: 0x00008FB0, + 6202: 0x00008FC2, + 6203: 0x00008FC6, + 6204: 0x00008FC5, + 6205: 0x00008FC4, + 6206: 0x00005DE1, + 6207: 0x00009091, + 6208: 0x000090A2, + 6209: 0x000090AA, + 6210: 0x000090A6, + 6211: 0x000090A3, + 6212: 0x00009149, + 6213: 0x000091C6, + 6214: 0x000091CC, + 6215: 0x00009632, + 6216: 0x0000962E, + 6217: 0x00009631, + 6218: 0x0000962A, + 6219: 0x0000962C, + 6220: 0x00004E26, + 6221: 0x00004E56, + 6222: 0x00004E73, + 6223: 0x00004E8B, + 6224: 0x00004E9B, + 6225: 0x00004E9E, + 6226: 0x00004EAB, + 6227: 0x00004EAC, + 6228: 0x00004F6F, + 6229: 0x00004F9D, + 6230: 0x00004F8D, + 6231: 0x00004F73, + 6232: 0x00004F7F, + 6233: 0x00004F6C, + 6234: 0x00004F9B, + 6235: 0x00004F8B, + 6236: 0x00004F86, + 6237: 0x00004F83, + 6238: 0x00004F70, + 6239: 0x00004F75, + 6240: 0x00004F88, + 6241: 0x00004F69, + 6242: 0x00004F7B, + 6243: 0x00004F96, + 6244: 0x00004F7E, + 6245: 0x00004F8F, + 6246: 0x00004F91, + 6247: 0x00004F7A, + 6248: 0x00005154, + 6249: 0x00005152, + 6250: 0x00005155, + 6251: 0x00005169, + 6252: 0x00005177, + 6253: 0x00005176, + 6254: 0x00005178, + 6255: 0x000051BD, + 6256: 0x000051FD, + 6257: 0x0000523B, + 6258: 0x00005238, + 6259: 0x00005237, + 6260: 0x0000523A, + 6261: 0x00005230, + 6262: 0x0000522E, + 6263: 0x00005236, + 6264: 0x00005241, + 6265: 0x000052BE, + 6266: 0x000052BB, + 6267: 0x00005352, + 6268: 0x00005354, + 6269: 0x00005353, + 6270: 0x00005351, + 6271: 0x00005366, + 6272: 0x00005377, + 6273: 0x00005378, + 6274: 0x00005379, + 6275: 0x000053D6, + 6276: 0x000053D4, + 6277: 0x000053D7, + 6278: 0x00005473, + 6279: 0x00005475, + 6280: 0x00005496, + 6281: 0x00005478, + 6282: 0x00005495, + 6283: 0x00005480, + 6284: 0x0000547B, + 6285: 0x00005477, + 6286: 0x00005484, + 6287: 0x00005492, + 6288: 0x00005486, + 6289: 0x0000547C, + 6290: 0x00005490, + 6291: 0x00005471, + 6292: 0x00005476, + 6293: 0x0000548C, + 6294: 0x0000549A, + 6295: 0x00005462, + 6296: 0x00005468, + 6297: 0x0000548B, + 6298: 0x0000547D, + 6299: 0x0000548E, + 6300: 0x000056FA, + 6301: 0x00005783, + 6302: 0x00005777, + 6303: 0x0000576A, + 6304: 0x00005769, + 6305: 0x00005761, + 6306: 0x00005766, + 6307: 0x00005764, + 6308: 0x0000577C, + 6309: 0x0000591C, + 6310: 0x00005949, + 6311: 0x00005947, + 6312: 0x00005948, + 6313: 0x00005944, + 6314: 0x00005954, + 6315: 0x000059BE, + 6316: 0x000059BB, + 6317: 0x000059D4, + 6318: 0x000059B9, + 6319: 0x000059AE, + 6320: 0x000059D1, + 6321: 0x000059C6, + 6322: 0x000059D0, + 6323: 0x000059CD, + 6324: 0x000059CB, + 6325: 0x000059D3, + 6326: 0x000059CA, + 6327: 0x000059AF, + 6328: 0x000059B3, + 6329: 0x000059D2, + 6330: 0x000059C5, + 6331: 0x00005B5F, + 6332: 0x00005B64, + 6333: 0x00005B63, + 6334: 0x00005B97, + 6335: 0x00005B9A, + 6336: 0x00005B98, + 6337: 0x00005B9C, + 6338: 0x00005B99, + 6339: 0x00005B9B, + 6340: 0x00005C1A, + 6341: 0x00005C48, + 6342: 0x00005C45, + 6343: 0x00005C46, + 6344: 0x00005CB7, + 6345: 0x00005CA1, + 6346: 0x00005CB8, + 6347: 0x00005CA9, + 6348: 0x00005CAB, + 6349: 0x00005CB1, + 6350: 0x00005CB3, + 6351: 0x00005E18, + 6352: 0x00005E1A, + 6353: 0x00005E16, + 6354: 0x00005E15, + 6355: 0x00005E1B, + 6356: 0x00005E11, + 6357: 0x00005E78, + 6358: 0x00005E9A, + 6359: 0x00005E97, + 6360: 0x00005E9C, + 6361: 0x00005E95, + 6362: 0x00005E96, + 6363: 0x00005EF6, + 6364: 0x00005F26, + 6365: 0x00005F27, + 6366: 0x00005F29, + 6367: 0x00005F80, + 6368: 0x00005F81, + 6369: 0x00005F7F, + 6370: 0x00005F7C, + 6371: 0x00005FDD, + 6372: 0x00005FE0, + 6373: 0x00005FFD, + 6374: 0x00005FF5, + 6375: 0x00005FFF, + 6376: 0x0000600F, + 6377: 0x00006014, + 6378: 0x0000602F, + 6379: 0x00006035, + 6380: 0x00006016, + 6381: 0x0000602A, + 6382: 0x00006015, + 6383: 0x00006021, + 6384: 0x00006027, + 6385: 0x00006029, + 6386: 0x0000602B, + 6387: 0x0000601B, + 6388: 0x00006216, + 6389: 0x00006215, + 6390: 0x0000623F, + 6391: 0x0000623E, + 6392: 0x00006240, + 6393: 0x0000627F, + 6394: 0x000062C9, + 6395: 0x000062CC, + 6396: 0x000062C4, + 6397: 0x000062BF, + 6398: 0x000062C2, + 6399: 0x000062B9, + 6400: 0x000062D2, + 6401: 0x000062DB, + 6402: 0x000062AB, + 6403: 0x000062D3, + 6404: 0x000062D4, + 6405: 0x000062CB, + 6406: 0x000062C8, + 6407: 0x000062A8, + 6408: 0x000062BD, + 6409: 0x000062BC, + 6410: 0x000062D0, + 6411: 0x000062D9, + 6412: 0x000062C7, + 6413: 0x000062CD, + 6414: 0x000062B5, + 6415: 0x000062DA, + 6416: 0x000062B1, + 6417: 0x000062D8, + 6418: 0x000062D6, + 6419: 0x000062D7, + 6420: 0x000062C6, + 6421: 0x000062AC, + 6422: 0x000062CE, + 6423: 0x0000653E, + 6424: 0x000065A7, + 6425: 0x000065BC, + 6426: 0x000065FA, + 6427: 0x00006614, + 6428: 0x00006613, + 6429: 0x0000660C, + 6430: 0x00006606, + 6431: 0x00006602, + 6432: 0x0000660E, + 6433: 0x00006600, + 6434: 0x0000660F, + 6435: 0x00006615, + 6436: 0x0000660A, + 6437: 0x00006607, + 6438: 0x0000670D, + 6439: 0x0000670B, + 6440: 0x0000676D, + 6441: 0x0000678B, + 6442: 0x00006795, + 6443: 0x00006771, + 6444: 0x0000679C, + 6445: 0x00006773, + 6446: 0x00006777, + 6447: 0x00006787, + 6448: 0x0000679D, + 6449: 0x00006797, + 6450: 0x0000676F, + 6451: 0x00006770, + 6452: 0x0000677F, + 6453: 0x00006789, + 6454: 0x0000677E, + 6455: 0x00006790, + 6456: 0x00006775, + 6457: 0x0000679A, + 6458: 0x00006793, + 6459: 0x0000677C, + 6460: 0x0000676A, + 6461: 0x00006772, + 6462: 0x00006B23, + 6463: 0x00006B66, + 6464: 0x00006B67, + 6465: 0x00006B7F, + 6466: 0x00006C13, + 6467: 0x00006C1B, + 6468: 0x00006CE3, + 6469: 0x00006CE8, + 6470: 0x00006CF3, + 6471: 0x00006CB1, + 6472: 0x00006CCC, + 6473: 0x00006CE5, + 6474: 0x00006CB3, + 6475: 0x00006CBD, + 6476: 0x00006CBE, + 6477: 0x00006CBC, + 6478: 0x00006CE2, + 6479: 0x00006CAB, + 6480: 0x00006CD5, + 6481: 0x00006CD3, + 6482: 0x00006CB8, + 6483: 0x00006CC4, + 6484: 0x00006CB9, + 6485: 0x00006CC1, + 6486: 0x00006CAE, + 6487: 0x00006CD7, + 6488: 0x00006CC5, + 6489: 0x00006CF1, + 6490: 0x00006CBF, + 6491: 0x00006CBB, + 6492: 0x00006CE1, + 6493: 0x00006CDB, + 6494: 0x00006CCA, + 6495: 0x00006CAC, + 6496: 0x00006CEF, + 6497: 0x00006CDC, + 6498: 0x00006CD6, + 6499: 0x00006CE0, + 6500: 0x00007095, + 6501: 0x0000708E, + 6502: 0x00007092, + 6503: 0x0000708A, + 6504: 0x00007099, + 6505: 0x0000722C, + 6506: 0x0000722D, + 6507: 0x00007238, + 6508: 0x00007248, + 6509: 0x00007267, + 6510: 0x00007269, + 6511: 0x000072C0, + 6512: 0x000072CE, + 6513: 0x000072D9, + 6514: 0x000072D7, + 6515: 0x000072D0, + 6516: 0x000073A9, + 6517: 0x000073A8, + 6518: 0x0000739F, + 6519: 0x000073AB, + 6520: 0x000073A5, + 6521: 0x0000753D, + 6522: 0x0000759D, + 6523: 0x00007599, + 6524: 0x0000759A, + 6525: 0x00007684, + 6526: 0x000076C2, + 6527: 0x000076F2, + 6528: 0x000076F4, + 6529: 0x000077E5, + 6530: 0x000077FD, + 6531: 0x0000793E, + 6532: 0x00007940, + 6533: 0x00007941, + 6534: 0x000079C9, + 6535: 0x000079C8, + 6536: 0x00007A7A, + 6537: 0x00007A79, + 6538: 0x00007AFA, + 6539: 0x00007CFE, + 6540: 0x00007F54, + 6541: 0x00007F8C, + 6542: 0x00007F8B, + 6543: 0x00008005, + 6544: 0x000080BA, + 6545: 0x000080A5, + 6546: 0x000080A2, + 6547: 0x000080B1, + 6548: 0x000080A1, + 6549: 0x000080AB, + 6550: 0x000080A9, + 6551: 0x000080B4, + 6552: 0x000080AA, + 6553: 0x000080AF, + 6554: 0x000081E5, + 6555: 0x000081FE, + 6556: 0x0000820D, + 6557: 0x000082B3, + 6558: 0x0000829D, + 6559: 0x00008299, + 6560: 0x000082AD, + 6561: 0x000082BD, + 6562: 0x0000829F, + 6563: 0x000082B9, + 6564: 0x000082B1, + 6565: 0x000082AC, + 6566: 0x000082A5, + 6567: 0x000082AF, + 6568: 0x000082B8, + 6569: 0x000082A3, + 6570: 0x000082B0, + 6571: 0x000082BE, + 6572: 0x000082B7, + 6573: 0x0000864E, + 6574: 0x00008671, + 6575: 0x0000521D, + 6576: 0x00008868, + 6577: 0x00008ECB, + 6578: 0x00008FCE, + 6579: 0x00008FD4, + 6580: 0x00008FD1, + 6581: 0x000090B5, + 6582: 0x000090B8, + 6583: 0x000090B1, + 6584: 0x000090B6, + 6585: 0x000091C7, + 6586: 0x000091D1, + 6587: 0x00009577, + 6588: 0x00009580, + 6589: 0x0000961C, + 6590: 0x00009640, + 6591: 0x0000963F, + 6592: 0x0000963B, + 6593: 0x00009644, + 6594: 0x00009642, + 6595: 0x000096B9, + 6596: 0x000096E8, + 6597: 0x00009752, + 6598: 0x0000975E, + 6599: 0x00004E9F, + 6600: 0x00004EAD, + 6601: 0x00004EAE, + 6602: 0x00004FE1, + 6603: 0x00004FB5, + 6604: 0x00004FAF, + 6605: 0x00004FBF, + 6606: 0x00004FE0, + 6607: 0x00004FD1, + 6608: 0x00004FCF, + 6609: 0x00004FDD, + 6610: 0x00004FC3, + 6611: 0x00004FB6, + 6612: 0x00004FD8, + 6613: 0x00004FDF, + 6614: 0x00004FCA, + 6615: 0x00004FD7, + 6616: 0x00004FAE, + 6617: 0x00004FD0, + 6618: 0x00004FC4, + 6619: 0x00004FC2, + 6620: 0x00004FDA, + 6621: 0x00004FCE, + 6622: 0x00004FDE, + 6623: 0x00004FB7, + 6624: 0x00005157, + 6625: 0x00005192, + 6626: 0x00005191, + 6627: 0x000051A0, + 6628: 0x0000524E, + 6629: 0x00005243, + 6630: 0x0000524A, + 6631: 0x0000524D, + 6632: 0x0000524C, + 6633: 0x0000524B, + 6634: 0x00005247, + 6635: 0x000052C7, + 6636: 0x000052C9, + 6637: 0x000052C3, + 6638: 0x000052C1, + 6639: 0x0000530D, + 6640: 0x00005357, + 6641: 0x0000537B, + 6642: 0x0000539A, + 6643: 0x000053DB, + 6644: 0x000054AC, + 6645: 0x000054C0, + 6646: 0x000054A8, + 6647: 0x000054CE, + 6648: 0x000054C9, + 6649: 0x000054B8, + 6650: 0x000054A6, + 6651: 0x000054B3, + 6652: 0x000054C7, + 6653: 0x000054C2, + 6654: 0x000054BD, + 6655: 0x000054AA, + 6656: 0x000054C1, + 6657: 0x000054C4, + 6658: 0x000054C8, + 6659: 0x000054AF, + 6660: 0x000054AB, + 6661: 0x000054B1, + 6662: 0x000054BB, + 6663: 0x000054A9, + 6664: 0x000054A7, + 6665: 0x000054BF, + 6666: 0x000056FF, + 6667: 0x00005782, + 6668: 0x0000578B, + 6669: 0x000057A0, + 6670: 0x000057A3, + 6671: 0x000057A2, + 6672: 0x000057CE, + 6673: 0x000057AE, + 6674: 0x00005793, + 6675: 0x00005955, + 6676: 0x00005951, + 6677: 0x0000594F, + 6678: 0x0000594E, + 6679: 0x00005950, + 6680: 0x000059DC, + 6681: 0x000059D8, + 6682: 0x000059FF, + 6683: 0x000059E3, + 6684: 0x000059E8, + 6685: 0x00005A03, + 6686: 0x000059E5, + 6687: 0x000059EA, + 6688: 0x000059DA, + 6689: 0x000059E6, + 6690: 0x00005A01, + 6691: 0x000059FB, + 6692: 0x00005B69, + 6693: 0x00005BA3, + 6694: 0x00005BA6, + 6695: 0x00005BA4, + 6696: 0x00005BA2, + 6697: 0x00005BA5, + 6698: 0x00005C01, + 6699: 0x00005C4E, + 6700: 0x00005C4F, + 6701: 0x00005C4D, + 6702: 0x00005C4B, + 6703: 0x00005CD9, + 6704: 0x00005CD2, + 6705: 0x00005DF7, + 6706: 0x00005E1D, + 6707: 0x00005E25, + 6708: 0x00005E1F, + 6709: 0x00005E7D, + 6710: 0x00005EA0, + 6711: 0x00005EA6, + 6712: 0x00005EFA, + 6713: 0x00005F08, + 6714: 0x00005F2D, + 6715: 0x00005F65, + 6716: 0x00005F88, + 6717: 0x00005F85, + 6718: 0x00005F8A, + 6719: 0x00005F8B, + 6720: 0x00005F87, + 6721: 0x00005F8C, + 6722: 0x00005F89, + 6723: 0x00006012, + 6724: 0x0000601D, + 6725: 0x00006020, + 6726: 0x00006025, + 6727: 0x0000600E, + 6728: 0x00006028, + 6729: 0x0000604D, + 6730: 0x00006070, + 6731: 0x00006068, + 6732: 0x00006062, + 6733: 0x00006046, + 6734: 0x00006043, + 6735: 0x0000606C, + 6736: 0x0000606B, + 6737: 0x0000606A, + 6738: 0x00006064, + 6739: 0x00006241, + 6740: 0x000062DC, + 6741: 0x00006316, + 6742: 0x00006309, + 6743: 0x000062FC, + 6744: 0x000062ED, + 6745: 0x00006301, + 6746: 0x000062EE, + 6747: 0x000062FD, + 6748: 0x00006307, + 6749: 0x000062F1, + 6750: 0x000062F7, + 6751: 0x000062EF, + 6752: 0x000062EC, + 6753: 0x000062FE, + 6754: 0x000062F4, + 6755: 0x00006311, + 6756: 0x00006302, + 6757: 0x0000653F, + 6758: 0x00006545, + 6759: 0x000065AB, + 6760: 0x000065BD, + 6761: 0x000065E2, + 6762: 0x00006625, + 6763: 0x0000662D, + 6764: 0x00006620, + 6765: 0x00006627, + 6766: 0x0000662F, + 6767: 0x0000661F, + 6768: 0x00006628, + 6769: 0x00006631, + 6770: 0x00006624, + 6771: 0x000066F7, + 6772: 0x000067FF, + 6773: 0x000067D3, + 6774: 0x000067F1, + 6775: 0x000067D4, + 6776: 0x000067D0, + 6777: 0x000067EC, + 6778: 0x000067B6, + 6779: 0x000067AF, + 6780: 0x000067F5, + 6781: 0x000067E9, + 6782: 0x000067EF, + 6783: 0x000067C4, + 6784: 0x000067D1, + 6785: 0x000067B4, + 6786: 0x000067DA, + 6787: 0x000067E5, + 6788: 0x000067B8, + 6789: 0x000067CF, + 6790: 0x000067DE, + 6791: 0x000067F3, + 6792: 0x000067B0, + 6793: 0x000067D9, + 6794: 0x000067E2, + 6795: 0x000067DD, + 6796: 0x000067D2, + 6797: 0x00006B6A, + 6798: 0x00006B83, + 6799: 0x00006B86, + 6800: 0x00006BB5, + 6801: 0x00006BD2, + 6802: 0x00006BD7, + 6803: 0x00006C1F, + 6804: 0x00006CC9, + 6805: 0x00006D0B, + 6806: 0x00006D32, + 6807: 0x00006D2A, + 6808: 0x00006D41, + 6809: 0x00006D25, + 6810: 0x00006D0C, + 6811: 0x00006D31, + 6812: 0x00006D1E, + 6813: 0x00006D17, + 6814: 0x00006D3B, + 6815: 0x00006D3D, + 6816: 0x00006D3E, + 6817: 0x00006D36, + 6818: 0x00006D1B, + 6819: 0x00006CF5, + 6820: 0x00006D39, + 6821: 0x00006D27, + 6822: 0x00006D38, + 6823: 0x00006D29, + 6824: 0x00006D2E, + 6825: 0x00006D35, + 6826: 0x00006D0E, + 6827: 0x00006D2B, + 6828: 0x000070AB, + 6829: 0x000070BA, + 6830: 0x000070B3, + 6831: 0x000070AC, + 6832: 0x000070AF, + 6833: 0x000070AD, + 6834: 0x000070B8, + 6835: 0x000070AE, + 6836: 0x000070A4, + 6837: 0x00007230, + 6838: 0x00007272, + 6839: 0x0000726F, + 6840: 0x00007274, + 6841: 0x000072E9, + 6842: 0x000072E0, + 6843: 0x000072E1, + 6844: 0x000073B7, + 6845: 0x000073CA, + 6846: 0x000073BB, + 6847: 0x000073B2, + 6848: 0x000073CD, + 6849: 0x000073C0, + 6850: 0x000073B3, + 6851: 0x0000751A, + 6852: 0x0000752D, + 6853: 0x0000754F, + 6854: 0x0000754C, + 6855: 0x0000754E, + 6856: 0x0000754B, + 6857: 0x000075AB, + 6858: 0x000075A4, + 6859: 0x000075A5, + 6860: 0x000075A2, + 6861: 0x000075A3, + 6862: 0x00007678, + 6863: 0x00007686, + 6864: 0x00007687, + 6865: 0x00007688, + 6866: 0x000076C8, + 6867: 0x000076C6, + 6868: 0x000076C3, + 6869: 0x000076C5, + 6870: 0x00007701, + 6871: 0x000076F9, + 6872: 0x000076F8, + 6873: 0x00007709, + 6874: 0x0000770B, + 6875: 0x000076FE, + 6876: 0x000076FC, + 6877: 0x00007707, + 6878: 0x000077DC, + 6879: 0x00007802, + 6880: 0x00007814, + 6881: 0x0000780C, + 6882: 0x0000780D, + 6883: 0x00007946, + 6884: 0x00007949, + 6885: 0x00007948, + 6886: 0x00007947, + 6887: 0x000079B9, + 6888: 0x000079BA, + 6889: 0x000079D1, + 6890: 0x000079D2, + 6891: 0x000079CB, + 6892: 0x00007A7F, + 6893: 0x00007A81, + 6894: 0x00007AFF, + 6895: 0x00007AFD, + 6896: 0x00007C7D, + 6897: 0x00007D02, + 6898: 0x00007D05, + 6899: 0x00007D00, + 6900: 0x00007D09, + 6901: 0x00007D07, + 6902: 0x00007D04, + 6903: 0x00007D06, + 6904: 0x00007F38, + 6905: 0x00007F8E, + 6906: 0x00007FBF, + 6907: 0x00008004, + 6908: 0x00008010, + 6909: 0x0000800D, + 6910: 0x00008011, + 6911: 0x00008036, + 6912: 0x000080D6, + 6913: 0x000080E5, + 6914: 0x000080DA, + 6915: 0x000080C3, + 6916: 0x000080C4, + 6917: 0x000080CC, + 6918: 0x000080E1, + 6919: 0x000080DB, + 6920: 0x000080CE, + 6921: 0x000080DE, + 6922: 0x000080E4, + 6923: 0x000080DD, + 6924: 0x000081F4, + 6925: 0x00008222, + 6926: 0x000082E7, + 6927: 0x00008303, + 6928: 0x00008305, + 6929: 0x000082E3, + 6930: 0x000082DB, + 6931: 0x000082E6, + 6932: 0x00008304, + 6933: 0x000082E5, + 6934: 0x00008302, + 6935: 0x00008309, + 6936: 0x000082D2, + 6937: 0x000082D7, + 6938: 0x000082F1, + 6939: 0x00008301, + 6940: 0x000082DC, + 6941: 0x000082D4, + 6942: 0x000082D1, + 6943: 0x000082DE, + 6944: 0x000082D3, + 6945: 0x000082DF, + 6946: 0x000082EF, + 6947: 0x00008306, + 6948: 0x00008650, + 6949: 0x00008679, + 6950: 0x0000867B, + 6951: 0x0000867A, + 6952: 0x0000884D, + 6953: 0x0000886B, + 6954: 0x00008981, + 6955: 0x000089D4, + 6956: 0x00008A08, + 6957: 0x00008A02, + 6958: 0x00008A03, + 6959: 0x00008C9E, + 6960: 0x00008CA0, + 6961: 0x00008D74, + 6962: 0x00008D73, + 6963: 0x00008DB4, + 6964: 0x00008ECD, + 6965: 0x00008ECC, + 6966: 0x00008FF0, + 6967: 0x00008FE6, + 6968: 0x00008FE2, + 6969: 0x00008FEA, + 6970: 0x00008FE5, + 6971: 0x00008FED, + 6972: 0x00008FEB, + 6973: 0x00008FE4, + 6974: 0x00008FE8, + 6975: 0x000090CA, + 6976: 0x000090CE, + 6977: 0x000090C1, + 6978: 0x000090C3, + 6979: 0x0000914B, + 6980: 0x0000914A, + 6981: 0x000091CD, + 6982: 0x00009582, + 6983: 0x00009650, + 6984: 0x0000964B, + 6985: 0x0000964C, + 6986: 0x0000964D, + 6987: 0x00009762, + 6988: 0x00009769, + 6989: 0x000097CB, + 6990: 0x000097ED, + 6991: 0x000097F3, + 6992: 0x00009801, + 6993: 0x000098A8, + 6994: 0x000098DB, + 6995: 0x000098DF, + 6996: 0x00009996, + 6997: 0x00009999, + 6998: 0x00004E58, + 6999: 0x00004EB3, + 7000: 0x0000500C, + 7001: 0x0000500D, + 7002: 0x00005023, + 7003: 0x00004FEF, + 7004: 0x00005026, + 7005: 0x00005025, + 7006: 0x00004FF8, + 7007: 0x00005029, + 7008: 0x00005016, + 7009: 0x00005006, + 7010: 0x0000503C, + 7011: 0x0000501F, + 7012: 0x0000501A, + 7013: 0x00005012, + 7014: 0x00005011, + 7015: 0x00004FFA, + 7016: 0x00005000, + 7017: 0x00005014, + 7018: 0x00005028, + 7019: 0x00004FF1, + 7020: 0x00005021, + 7021: 0x0000500B, + 7022: 0x00005019, + 7023: 0x00005018, + 7024: 0x00004FF3, + 7025: 0x00004FEE, + 7026: 0x0000502D, + 7027: 0x0000502A, + 7028: 0x00004FFE, + 7029: 0x0000502B, + 7030: 0x00005009, + 7031: 0x0000517C, + 7032: 0x000051A4, + 7033: 0x000051A5, + 7034: 0x000051A2, + 7035: 0x000051CD, + 7036: 0x000051CC, + 7037: 0x000051C6, + 7038: 0x000051CB, + 7039: 0x00005256, + 7040: 0x0000525C, + 7041: 0x00005254, + 7042: 0x0000525B, + 7043: 0x0000525D, + 7044: 0x0000532A, + 7045: 0x0000537F, + 7046: 0x0000539F, + 7047: 0x0000539D, + 7048: 0x000053DF, + 7049: 0x000054E8, + 7050: 0x00005510, + 7051: 0x00005501, + 7052: 0x00005537, + 7053: 0x000054FC, + 7054: 0x000054E5, + 7055: 0x000054F2, + 7056: 0x00005506, + 7057: 0x000054FA, + 7058: 0x00005514, + 7059: 0x000054E9, + 7060: 0x000054ED, + 7061: 0x000054E1, + 7062: 0x00005509, + 7063: 0x000054EE, + 7064: 0x000054EA, + 7065: 0x000054E6, + 7066: 0x00005527, + 7067: 0x00005507, + 7068: 0x000054FD, + 7069: 0x0000550F, + 7070: 0x00005703, + 7071: 0x00005704, + 7072: 0x000057C2, + 7073: 0x000057D4, + 7074: 0x000057CB, + 7075: 0x000057C3, + 7076: 0x00005809, + 7077: 0x0000590F, + 7078: 0x00005957, + 7079: 0x00005958, + 7080: 0x0000595A, + 7081: 0x00005A11, + 7082: 0x00005A18, + 7083: 0x00005A1C, + 7084: 0x00005A1F, + 7085: 0x00005A1B, + 7086: 0x00005A13, + 7087: 0x000059EC, + 7088: 0x00005A20, + 7089: 0x00005A23, + 7090: 0x00005A29, + 7091: 0x00005A25, + 7092: 0x00005A0C, + 7093: 0x00005A09, + 7094: 0x00005B6B, + 7095: 0x00005C58, + 7096: 0x00005BB0, + 7097: 0x00005BB3, + 7098: 0x00005BB6, + 7099: 0x00005BB4, + 7100: 0x00005BAE, + 7101: 0x00005BB5, + 7102: 0x00005BB9, + 7103: 0x00005BB8, + 7104: 0x00005C04, + 7105: 0x00005C51, + 7106: 0x00005C55, + 7107: 0x00005C50, + 7108: 0x00005CED, + 7109: 0x00005CFD, + 7110: 0x00005CFB, + 7111: 0x00005CEA, + 7112: 0x00005CE8, + 7113: 0x00005CF0, + 7114: 0x00005CF6, + 7115: 0x00005D01, + 7116: 0x00005CF4, + 7117: 0x00005DEE, + 7118: 0x00005E2D, + 7119: 0x00005E2B, + 7120: 0x00005EAB, + 7121: 0x00005EAD, + 7122: 0x00005EA7, + 7123: 0x00005F31, + 7124: 0x00005F92, + 7125: 0x00005F91, + 7126: 0x00005F90, + 7127: 0x00006059, + 7128: 0x00006063, + 7129: 0x00006065, + 7130: 0x00006050, + 7131: 0x00006055, + 7132: 0x0000606D, + 7133: 0x00006069, + 7134: 0x0000606F, + 7135: 0x00006084, + 7136: 0x0000609F, + 7137: 0x0000609A, + 7138: 0x0000608D, + 7139: 0x00006094, + 7140: 0x0000608C, + 7141: 0x00006085, + 7142: 0x00006096, + 7143: 0x00006247, + 7144: 0x000062F3, + 7145: 0x00006308, + 7146: 0x000062FF, + 7147: 0x0000634E, + 7148: 0x0000633E, + 7149: 0x0000632F, + 7150: 0x00006355, + 7151: 0x00006342, + 7152: 0x00006346, + 7153: 0x0000634F, + 7154: 0x00006349, + 7155: 0x0000633A, + 7156: 0x00006350, + 7157: 0x0000633D, + 7158: 0x0000632A, + 7159: 0x0000632B, + 7160: 0x00006328, + 7161: 0x0000634D, + 7162: 0x0000634C, + 7163: 0x00006548, + 7164: 0x00006549, + 7165: 0x00006599, + 7166: 0x000065C1, + 7167: 0x000065C5, + 7168: 0x00006642, + 7169: 0x00006649, + 7170: 0x0000664F, + 7171: 0x00006643, + 7172: 0x00006652, + 7173: 0x0000664C, + 7174: 0x00006645, + 7175: 0x00006641, + 7176: 0x000066F8, + 7177: 0x00006714, + 7178: 0x00006715, + 7179: 0x00006717, + 7180: 0x00006821, + 7181: 0x00006838, + 7182: 0x00006848, + 7183: 0x00006846, + 7184: 0x00006853, + 7185: 0x00006839, + 7186: 0x00006842, + 7187: 0x00006854, + 7188: 0x00006829, + 7189: 0x000068B3, + 7190: 0x00006817, + 7191: 0x0000684C, + 7192: 0x00006851, + 7193: 0x0000683D, + 7194: 0x000067F4, + 7195: 0x00006850, + 7196: 0x00006840, + 7197: 0x0000683C, + 7198: 0x00006843, + 7199: 0x0000682A, + 7200: 0x00006845, + 7201: 0x00006813, + 7202: 0x00006818, + 7203: 0x00006841, + 7204: 0x00006B8A, + 7205: 0x00006B89, + 7206: 0x00006BB7, + 7207: 0x00006C23, + 7208: 0x00006C27, + 7209: 0x00006C28, + 7210: 0x00006C26, + 7211: 0x00006C24, + 7212: 0x00006CF0, + 7213: 0x00006D6A, + 7214: 0x00006D95, + 7215: 0x00006D88, + 7216: 0x00006D87, + 7217: 0x00006D66, + 7218: 0x00006D78, + 7219: 0x00006D77, + 7220: 0x00006D59, + 7221: 0x00006D93, + 7222: 0x00006D6C, + 7223: 0x00006D89, + 7224: 0x00006D6E, + 7225: 0x00006D5A, + 7226: 0x00006D74, + 7227: 0x00006D69, + 7228: 0x00006D8C, + 7229: 0x00006D8A, + 7230: 0x00006D79, + 7231: 0x00006D85, + 7232: 0x00006D65, + 7233: 0x00006D94, + 7234: 0x000070CA, + 7235: 0x000070D8, + 7236: 0x000070E4, + 7237: 0x000070D9, + 7238: 0x000070C8, + 7239: 0x000070CF, + 7240: 0x00007239, + 7241: 0x00007279, + 7242: 0x000072FC, + 7243: 0x000072F9, + 7244: 0x000072FD, + 7245: 0x000072F8, + 7246: 0x000072F7, + 7247: 0x00007386, + 7248: 0x000073ED, + 7249: 0x00007409, + 7250: 0x000073EE, + 7251: 0x000073E0, + 7252: 0x000073EA, + 7253: 0x000073DE, + 7254: 0x00007554, + 7255: 0x0000755D, + 7256: 0x0000755C, + 7257: 0x0000755A, + 7258: 0x00007559, + 7259: 0x000075BE, + 7260: 0x000075C5, + 7261: 0x000075C7, + 7262: 0x000075B2, + 7263: 0x000075B3, + 7264: 0x000075BD, + 7265: 0x000075BC, + 7266: 0x000075B9, + 7267: 0x000075C2, + 7268: 0x000075B8, + 7269: 0x0000768B, + 7270: 0x000076B0, + 7271: 0x000076CA, + 7272: 0x000076CD, + 7273: 0x000076CE, + 7274: 0x00007729, + 7275: 0x0000771F, + 7276: 0x00007720, + 7277: 0x00007728, + 7278: 0x000077E9, + 7279: 0x00007830, + 7280: 0x00007827, + 7281: 0x00007838, + 7282: 0x0000781D, + 7283: 0x00007834, + 7284: 0x00007837, + 7285: 0x00007825, + 7286: 0x0000782D, + 7287: 0x00007820, + 7288: 0x0000781F, + 7289: 0x00007832, + 7290: 0x00007955, + 7291: 0x00007950, + 7292: 0x00007960, + 7293: 0x0000795F, + 7294: 0x00007956, + 7295: 0x0000795E, + 7296: 0x0000795D, + 7297: 0x00007957, + 7298: 0x0000795A, + 7299: 0x000079E4, + 7300: 0x000079E3, + 7301: 0x000079E7, + 7302: 0x000079DF, + 7303: 0x000079E6, + 7304: 0x000079E9, + 7305: 0x000079D8, + 7306: 0x00007A84, + 7307: 0x00007A88, + 7308: 0x00007AD9, + 7309: 0x00007B06, + 7310: 0x00007B11, + 7311: 0x00007C89, + 7312: 0x00007D21, + 7313: 0x00007D17, + 7314: 0x00007D0B, + 7315: 0x00007D0A, + 7316: 0x00007D20, + 7317: 0x00007D22, + 7318: 0x00007D14, + 7319: 0x00007D10, + 7320: 0x00007D15, + 7321: 0x00007D1A, + 7322: 0x00007D1C, + 7323: 0x00007D0D, + 7324: 0x00007D19, + 7325: 0x00007D1B, + 7326: 0x00007F3A, + 7327: 0x00007F5F, + 7328: 0x00007F94, + 7329: 0x00007FC5, + 7330: 0x00007FC1, + 7331: 0x00008006, + 7332: 0x00008018, + 7333: 0x00008015, + 7334: 0x00008019, + 7335: 0x00008017, + 7336: 0x0000803D, + 7337: 0x0000803F, + 7338: 0x000080F1, + 7339: 0x00008102, + 7340: 0x000080F0, + 7341: 0x00008105, + 7342: 0x000080ED, + 7343: 0x000080F4, + 7344: 0x00008106, + 7345: 0x000080F8, + 7346: 0x000080F3, + 7347: 0x00008108, + 7348: 0x000080FD, + 7349: 0x0000810A, + 7350: 0x000080FC, + 7351: 0x000080EF, + 7352: 0x000081ED, + 7353: 0x000081EC, + 7354: 0x00008200, + 7355: 0x00008210, + 7356: 0x0000822A, + 7357: 0x0000822B, + 7358: 0x00008228, + 7359: 0x0000822C, + 7360: 0x000082BB, + 7361: 0x0000832B, + 7362: 0x00008352, + 7363: 0x00008354, + 7364: 0x0000834A, + 7365: 0x00008338, + 7366: 0x00008350, + 7367: 0x00008349, + 7368: 0x00008335, + 7369: 0x00008334, + 7370: 0x0000834F, + 7371: 0x00008332, + 7372: 0x00008339, + 7373: 0x00008336, + 7374: 0x00008317, + 7375: 0x00008340, + 7376: 0x00008331, + 7377: 0x00008328, + 7378: 0x00008343, + 7379: 0x00008654, + 7380: 0x0000868A, + 7381: 0x000086AA, + 7382: 0x00008693, + 7383: 0x000086A4, + 7384: 0x000086A9, + 7385: 0x0000868C, + 7386: 0x000086A3, + 7387: 0x0000869C, + 7388: 0x00008870, + 7389: 0x00008877, + 7390: 0x00008881, + 7391: 0x00008882, + 7392: 0x0000887D, + 7393: 0x00008879, + 7394: 0x00008A18, + 7395: 0x00008A10, + 7396: 0x00008A0E, + 7397: 0x00008A0C, + 7398: 0x00008A15, + 7399: 0x00008A0A, + 7400: 0x00008A17, + 7401: 0x00008A13, + 7402: 0x00008A16, + 7403: 0x00008A0F, + 7404: 0x00008A11, + 7405: 0x00008C48, + 7406: 0x00008C7A, + 7407: 0x00008C79, + 7408: 0x00008CA1, + 7409: 0x00008CA2, + 7410: 0x00008D77, + 7411: 0x00008EAC, + 7412: 0x00008ED2, + 7413: 0x00008ED4, + 7414: 0x00008ECF, + 7415: 0x00008FB1, + 7416: 0x00009001, + 7417: 0x00009006, + 7418: 0x00008FF7, + 7419: 0x00009000, + 7420: 0x00008FFA, + 7421: 0x00008FF4, + 7422: 0x00009003, + 7423: 0x00008FFD, + 7424: 0x00009005, + 7425: 0x00008FF8, + 7426: 0x00009095, + 7427: 0x000090E1, + 7428: 0x000090DD, + 7429: 0x000090E2, + 7430: 0x00009152, + 7431: 0x0000914D, + 7432: 0x0000914C, + 7433: 0x000091D8, + 7434: 0x000091DD, + 7435: 0x000091D7, + 7436: 0x000091DC, + 7437: 0x000091D9, + 7438: 0x00009583, + 7439: 0x00009662, + 7440: 0x00009663, + 7441: 0x00009661, + 7442: 0x0000965B, + 7443: 0x0000965D, + 7444: 0x00009664, + 7445: 0x00009658, + 7446: 0x0000965E, + 7447: 0x000096BB, + 7448: 0x000098E2, + 7449: 0x000099AC, + 7450: 0x00009AA8, + 7451: 0x00009AD8, + 7452: 0x00009B25, + 7453: 0x00009B32, + 7454: 0x00009B3C, + 7455: 0x00004E7E, + 7456: 0x0000507A, + 7457: 0x0000507D, + 7458: 0x0000505C, + 7459: 0x00005047, + 7460: 0x00005043, + 7461: 0x0000504C, + 7462: 0x0000505A, + 7463: 0x00005049, + 7464: 0x00005065, + 7465: 0x00005076, + 7466: 0x0000504E, + 7467: 0x00005055, + 7468: 0x00005075, + 7469: 0x00005074, + 7470: 0x00005077, + 7471: 0x0000504F, + 7472: 0x0000500F, + 7473: 0x0000506F, + 7474: 0x0000506D, + 7475: 0x0000515C, + 7476: 0x00005195, + 7477: 0x000051F0, + 7478: 0x0000526A, + 7479: 0x0000526F, + 7480: 0x000052D2, + 7481: 0x000052D9, + 7482: 0x000052D8, + 7483: 0x000052D5, + 7484: 0x00005310, + 7485: 0x0000530F, + 7486: 0x00005319, + 7487: 0x0000533F, + 7488: 0x00005340, + 7489: 0x0000533E, + 7490: 0x000053C3, + 7491: 0x000066FC, + 7492: 0x00005546, + 7493: 0x0000556A, + 7494: 0x00005566, + 7495: 0x00005544, + 7496: 0x0000555E, + 7497: 0x00005561, + 7498: 0x00005543, + 7499: 0x0000554A, + 7500: 0x00005531, + 7501: 0x00005556, + 7502: 0x0000554F, + 7503: 0x00005555, + 7504: 0x0000552F, + 7505: 0x00005564, + 7506: 0x00005538, + 7507: 0x0000552E, + 7508: 0x0000555C, + 7509: 0x0000552C, + 7510: 0x00005563, + 7511: 0x00005533, + 7512: 0x00005541, + 7513: 0x00005557, + 7514: 0x00005708, + 7515: 0x0000570B, + 7516: 0x00005709, + 7517: 0x000057DF, + 7518: 0x00005805, + 7519: 0x0000580A, + 7520: 0x00005806, + 7521: 0x000057E0, + 7522: 0x000057E4, + 7523: 0x000057FA, + 7524: 0x00005802, + 7525: 0x00005835, + 7526: 0x000057F7, + 7527: 0x000057F9, + 7528: 0x00005920, + 7529: 0x00005962, + 7530: 0x00005A36, + 7531: 0x00005A41, + 7532: 0x00005A49, + 7533: 0x00005A66, + 7534: 0x00005A6A, + 7535: 0x00005A40, + 7536: 0x00005A3C, + 7537: 0x00005A62, + 7538: 0x00005A5A, + 7539: 0x00005A46, + 7540: 0x00005A4A, + 7541: 0x00005B70, + 7542: 0x00005BC7, + 7543: 0x00005BC5, + 7544: 0x00005BC4, + 7545: 0x00005BC2, + 7546: 0x00005BBF, + 7547: 0x00005BC6, + 7548: 0x00005C09, + 7549: 0x00005C08, + 7550: 0x00005C07, + 7551: 0x00005C60, + 7552: 0x00005C5C, + 7553: 0x00005C5D, + 7554: 0x00005D07, + 7555: 0x00005D06, + 7556: 0x00005D0E, + 7557: 0x00005D1B, + 7558: 0x00005D16, + 7559: 0x00005D22, + 7560: 0x00005D11, + 7561: 0x00005D29, + 7562: 0x00005D14, + 7563: 0x00005D19, + 7564: 0x00005D24, + 7565: 0x00005D27, + 7566: 0x00005D17, + 7567: 0x00005DE2, + 7568: 0x00005E38, + 7569: 0x00005E36, + 7570: 0x00005E33, + 7571: 0x00005E37, + 7572: 0x00005EB7, + 7573: 0x00005EB8, + 7574: 0x00005EB6, + 7575: 0x00005EB5, + 7576: 0x00005EBE, + 7577: 0x00005F35, + 7578: 0x00005F37, + 7579: 0x00005F57, + 7580: 0x00005F6C, + 7581: 0x00005F69, + 7582: 0x00005F6B, + 7583: 0x00005F97, + 7584: 0x00005F99, + 7585: 0x00005F9E, + 7586: 0x00005F98, + 7587: 0x00005FA1, + 7588: 0x00005FA0, + 7589: 0x00005F9C, + 7590: 0x0000607F, + 7591: 0x000060A3, + 7592: 0x00006089, + 7593: 0x000060A0, + 7594: 0x000060A8, + 7595: 0x000060CB, + 7596: 0x000060B4, + 7597: 0x000060E6, + 7598: 0x000060BD, + 7599: 0x000060C5, + 7600: 0x000060BB, + 7601: 0x000060B5, + 7602: 0x000060DC, + 7603: 0x000060BC, + 7604: 0x000060D8, + 7605: 0x000060D5, + 7606: 0x000060C6, + 7607: 0x000060DF, + 7608: 0x000060B8, + 7609: 0x000060DA, + 7610: 0x000060C7, + 7611: 0x0000621A, + 7612: 0x0000621B, + 7613: 0x00006248, + 7614: 0x000063A0, + 7615: 0x000063A7, + 7616: 0x00006372, + 7617: 0x00006396, + 7618: 0x000063A2, + 7619: 0x000063A5, + 7620: 0x00006377, + 7621: 0x00006367, + 7622: 0x00006398, + 7623: 0x000063AA, + 7624: 0x00006371, + 7625: 0x000063A9, + 7626: 0x00006389, + 7627: 0x00006383, + 7628: 0x0000639B, + 7629: 0x0000636B, + 7630: 0x000063A8, + 7631: 0x00006384, + 7632: 0x00006388, + 7633: 0x00006399, + 7634: 0x000063A1, + 7635: 0x000063AC, + 7636: 0x00006392, + 7637: 0x0000638F, + 7638: 0x00006380, + 7639: 0x0000637B, + 7640: 0x00006369, + 7641: 0x00006368, + 7642: 0x0000637A, + 7643: 0x0000655D, + 7644: 0x00006556, + 7645: 0x00006551, + 7646: 0x00006559, + 7647: 0x00006557, + 7648: 0x0000555F, + 7649: 0x0000654F, + 7650: 0x00006558, + 7651: 0x00006555, + 7652: 0x00006554, + 7653: 0x0000659C, + 7654: 0x0000659B, + 7655: 0x000065AC, + 7656: 0x000065CF, + 7657: 0x000065CB, + 7658: 0x000065CC, + 7659: 0x000065CE, + 7660: 0x0000665D, + 7661: 0x0000665A, + 7662: 0x00006664, + 7663: 0x00006668, + 7664: 0x00006666, + 7665: 0x0000665E, + 7666: 0x000066F9, + 7667: 0x000052D7, + 7668: 0x0000671B, + 7669: 0x00006881, + 7670: 0x000068AF, + 7671: 0x000068A2, + 7672: 0x00006893, + 7673: 0x000068B5, + 7674: 0x0000687F, + 7675: 0x00006876, + 7676: 0x000068B1, + 7677: 0x000068A7, + 7678: 0x00006897, + 7679: 0x000068B0, + 7680: 0x00006883, + 7681: 0x000068C4, + 7682: 0x000068AD, + 7683: 0x00006886, + 7684: 0x00006885, + 7685: 0x00006894, + 7686: 0x0000689D, + 7687: 0x000068A8, + 7688: 0x0000689F, + 7689: 0x000068A1, + 7690: 0x00006882, + 7691: 0x00006B32, + 7692: 0x00006BBA, + 7693: 0x00006BEB, + 7694: 0x00006BEC, + 7695: 0x00006C2B, + 7696: 0x00006D8E, + 7697: 0x00006DBC, + 7698: 0x00006DF3, + 7699: 0x00006DD9, + 7700: 0x00006DB2, + 7701: 0x00006DE1, + 7702: 0x00006DCC, + 7703: 0x00006DE4, + 7704: 0x00006DFB, + 7705: 0x00006DFA, + 7706: 0x00006E05, + 7707: 0x00006DC7, + 7708: 0x00006DCB, + 7709: 0x00006DAF, + 7710: 0x00006DD1, + 7711: 0x00006DAE, + 7712: 0x00006DDE, + 7713: 0x00006DF9, + 7714: 0x00006DB8, + 7715: 0x00006DF7, + 7716: 0x00006DF5, + 7717: 0x00006DC5, + 7718: 0x00006DD2, + 7719: 0x00006E1A, + 7720: 0x00006DB5, + 7721: 0x00006DDA, + 7722: 0x00006DEB, + 7723: 0x00006DD8, + 7724: 0x00006DEA, + 7725: 0x00006DF1, + 7726: 0x00006DEE, + 7727: 0x00006DE8, + 7728: 0x00006DC6, + 7729: 0x00006DC4, + 7730: 0x00006DAA, + 7731: 0x00006DEC, + 7732: 0x00006DBF, + 7733: 0x00006DE6, + 7734: 0x000070F9, + 7735: 0x00007109, + 7736: 0x0000710A, + 7737: 0x000070FD, + 7738: 0x000070EF, + 7739: 0x0000723D, + 7740: 0x0000727D, + 7741: 0x00007281, + 7742: 0x0000731C, + 7743: 0x0000731B, + 7744: 0x00007316, + 7745: 0x00007313, + 7746: 0x00007319, + 7747: 0x00007387, + 7748: 0x00007405, + 7749: 0x0000740A, + 7750: 0x00007403, + 7751: 0x00007406, + 7752: 0x000073FE, + 7753: 0x0000740D, + 7754: 0x000074E0, + 7755: 0x000074F6, + 7756: 0x000074F7, + 7757: 0x0000751C, + 7758: 0x00007522, + 7759: 0x00007565, + 7760: 0x00007566, + 7761: 0x00007562, + 7762: 0x00007570, + 7763: 0x0000758F, + 7764: 0x000075D4, + 7765: 0x000075D5, + 7766: 0x000075B5, + 7767: 0x000075CA, + 7768: 0x000075CD, + 7769: 0x0000768E, + 7770: 0x000076D4, + 7771: 0x000076D2, + 7772: 0x000076DB, + 7773: 0x00007737, + 7774: 0x0000773E, + 7775: 0x0000773C, + 7776: 0x00007736, + 7777: 0x00007738, + 7778: 0x0000773A, + 7779: 0x0000786B, + 7780: 0x00007843, + 7781: 0x0000784E, + 7782: 0x00007965, + 7783: 0x00007968, + 7784: 0x0000796D, + 7785: 0x000079FB, + 7786: 0x00007A92, + 7787: 0x00007A95, + 7788: 0x00007B20, + 7789: 0x00007B28, + 7790: 0x00007B1B, + 7791: 0x00007B2C, + 7792: 0x00007B26, + 7793: 0x00007B19, + 7794: 0x00007B1E, + 7795: 0x00007B2E, + 7796: 0x00007C92, + 7797: 0x00007C97, + 7798: 0x00007C95, + 7799: 0x00007D46, + 7800: 0x00007D43, + 7801: 0x00007D71, + 7802: 0x00007D2E, + 7803: 0x00007D39, + 7804: 0x00007D3C, + 7805: 0x00007D40, + 7806: 0x00007D30, + 7807: 0x00007D33, + 7808: 0x00007D44, + 7809: 0x00007D2F, + 7810: 0x00007D42, + 7811: 0x00007D32, + 7812: 0x00007D31, + 7813: 0x00007F3D, + 7814: 0x00007F9E, + 7815: 0x00007F9A, + 7816: 0x00007FCC, + 7817: 0x00007FCE, + 7818: 0x00007FD2, + 7819: 0x0000801C, + 7820: 0x0000804A, + 7821: 0x00008046, + 7822: 0x0000812F, + 7823: 0x00008116, + 7824: 0x00008123, + 7825: 0x0000812B, + 7826: 0x00008129, + 7827: 0x00008130, + 7828: 0x00008124, + 7829: 0x00008202, + 7830: 0x00008235, + 7831: 0x00008237, + 7832: 0x00008236, + 7833: 0x00008239, + 7834: 0x0000838E, + 7835: 0x0000839E, + 7836: 0x00008398, + 7837: 0x00008378, + 7838: 0x000083A2, + 7839: 0x00008396, + 7840: 0x000083BD, + 7841: 0x000083AB, + 7842: 0x00008392, + 7843: 0x0000838A, + 7844: 0x00008393, + 7845: 0x00008389, + 7846: 0x000083A0, + 7847: 0x00008377, + 7848: 0x0000837B, + 7849: 0x0000837C, + 7850: 0x00008386, + 7851: 0x000083A7, + 7852: 0x00008655, + 7853: 0x00005F6A, + 7854: 0x000086C7, + 7855: 0x000086C0, + 7856: 0x000086B6, + 7857: 0x000086C4, + 7858: 0x000086B5, + 7859: 0x000086C6, + 7860: 0x000086CB, + 7861: 0x000086B1, + 7862: 0x000086AF, + 7863: 0x000086C9, + 7864: 0x00008853, + 7865: 0x0000889E, + 7866: 0x00008888, + 7867: 0x000088AB, + 7868: 0x00008892, + 7869: 0x00008896, + 7870: 0x0000888D, + 7871: 0x0000888B, + 7872: 0x00008993, + 7873: 0x0000898F, + 7874: 0x00008A2A, + 7875: 0x00008A1D, + 7876: 0x00008A23, + 7877: 0x00008A25, + 7878: 0x00008A31, + 7879: 0x00008A2D, + 7880: 0x00008A1F, + 7881: 0x00008A1B, + 7882: 0x00008A22, + 7883: 0x00008C49, + 7884: 0x00008C5A, + 7885: 0x00008CA9, + 7886: 0x00008CAC, + 7887: 0x00008CAB, + 7888: 0x00008CA8, + 7889: 0x00008CAA, + 7890: 0x00008CA7, + 7891: 0x00008D67, + 7892: 0x00008D66, + 7893: 0x00008DBE, + 7894: 0x00008DBA, + 7895: 0x00008EDB, + 7896: 0x00008EDF, + 7897: 0x00009019, + 7898: 0x0000900D, + 7899: 0x0000901A, + 7900: 0x00009017, + 7901: 0x00009023, + 7902: 0x0000901F, + 7903: 0x0000901D, + 7904: 0x00009010, + 7905: 0x00009015, + 7906: 0x0000901E, + 7907: 0x00009020, + 7908: 0x0000900F, + 7909: 0x00009022, + 7910: 0x00009016, + 7911: 0x0000901B, + 7912: 0x00009014, + 7913: 0x000090E8, + 7914: 0x000090ED, + 7915: 0x000090FD, + 7916: 0x00009157, + 7917: 0x000091CE, + 7918: 0x000091F5, + 7919: 0x000091E6, + 7920: 0x000091E3, + 7921: 0x000091E7, + 7922: 0x000091ED, + 7923: 0x000091E9, + 7924: 0x00009589, + 7925: 0x0000966A, + 7926: 0x00009675, + 7927: 0x00009673, + 7928: 0x00009678, + 7929: 0x00009670, + 7930: 0x00009674, + 7931: 0x00009676, + 7932: 0x00009677, + 7933: 0x0000966C, + 7934: 0x000096C0, + 7935: 0x000096EA, + 7936: 0x000096E9, + 7937: 0x00007AE0, + 7938: 0x00007ADF, + 7939: 0x00009802, + 7940: 0x00009803, + 7941: 0x00009B5A, + 7942: 0x00009CE5, + 7943: 0x00009E75, + 7944: 0x00009E7F, + 7945: 0x00009EA5, + 7946: 0x00009EBB, + 7947: 0x000050A2, + 7948: 0x0000508D, + 7949: 0x00005085, + 7950: 0x00005099, + 7951: 0x00005091, + 7952: 0x00005080, + 7953: 0x00005096, + 7954: 0x00005098, + 7955: 0x0000509A, + 7956: 0x00006700, + 7957: 0x000051F1, + 7958: 0x00005272, + 7959: 0x00005274, + 7960: 0x00005275, + 7961: 0x00005269, + 7962: 0x000052DE, + 7963: 0x000052DD, + 7964: 0x000052DB, + 7965: 0x0000535A, + 7966: 0x000053A5, + 7967: 0x0000557B, + 7968: 0x00005580, + 7969: 0x000055A7, + 7970: 0x0000557C, + 7971: 0x0000558A, + 7972: 0x0000559D, + 7973: 0x00005598, + 7974: 0x00005582, + 7975: 0x0000559C, + 7976: 0x000055AA, + 7977: 0x00005594, + 7978: 0x00005587, + 7979: 0x0000558B, + 7980: 0x00005583, + 7981: 0x000055B3, + 7982: 0x000055AE, + 7983: 0x0000559F, + 7984: 0x0000553E, + 7985: 0x000055B2, + 7986: 0x0000559A, + 7987: 0x000055BB, + 7988: 0x000055AC, + 7989: 0x000055B1, + 7990: 0x0000557E, + 7991: 0x00005589, + 7992: 0x000055AB, + 7993: 0x00005599, + 7994: 0x0000570D, + 7995: 0x0000582F, + 7996: 0x0000582A, + 7997: 0x00005834, + 7998: 0x00005824, + 7999: 0x00005830, + 8000: 0x00005831, + 8001: 0x00005821, + 8002: 0x0000581D, + 8003: 0x00005820, + 8004: 0x000058F9, + 8005: 0x000058FA, + 8006: 0x00005960, + 8007: 0x00005A77, + 8008: 0x00005A9A, + 8009: 0x00005A7F, + 8010: 0x00005A92, + 8011: 0x00005A9B, + 8012: 0x00005AA7, + 8013: 0x00005B73, + 8014: 0x00005B71, + 8015: 0x00005BD2, + 8016: 0x00005BCC, + 8017: 0x00005BD3, + 8018: 0x00005BD0, + 8019: 0x00005C0A, + 8020: 0x00005C0B, + 8021: 0x00005C31, + 8022: 0x00005D4C, + 8023: 0x00005D50, + 8024: 0x00005D34, + 8025: 0x00005D47, + 8026: 0x00005DFD, + 8027: 0x00005E45, + 8028: 0x00005E3D, + 8029: 0x00005E40, + 8030: 0x00005E43, + 8031: 0x00005E7E, + 8032: 0x00005ECA, + 8033: 0x00005EC1, + 8034: 0x00005EC2, + 8035: 0x00005EC4, + 8036: 0x00005F3C, + 8037: 0x00005F6D, + 8038: 0x00005FA9, + 8039: 0x00005FAA, + 8040: 0x00005FA8, + 8041: 0x000060D1, + 8042: 0x000060E1, + 8043: 0x000060B2, + 8044: 0x000060B6, + 8045: 0x000060E0, + 8046: 0x0000611C, + 8047: 0x00006123, + 8048: 0x000060FA, + 8049: 0x00006115, + 8050: 0x000060F0, + 8051: 0x000060FB, + 8052: 0x000060F4, + 8053: 0x00006168, + 8054: 0x000060F1, + 8055: 0x0000610E, + 8056: 0x000060F6, + 8057: 0x00006109, + 8058: 0x00006100, + 8059: 0x00006112, + 8060: 0x0000621F, + 8061: 0x00006249, + 8062: 0x000063A3, + 8063: 0x0000638C, + 8064: 0x000063CF, + 8065: 0x000063C0, + 8066: 0x000063E9, + 8067: 0x000063C9, + 8068: 0x000063C6, + 8069: 0x000063CD, + 8070: 0x000063D2, + 8071: 0x000063E3, + 8072: 0x000063D0, + 8073: 0x000063E1, + 8074: 0x000063D6, + 8075: 0x000063ED, + 8076: 0x000063EE, + 8077: 0x00006376, + 8078: 0x000063F4, + 8079: 0x000063EA, + 8080: 0x000063DB, + 8081: 0x00006452, + 8082: 0x000063DA, + 8083: 0x000063F9, + 8084: 0x0000655E, + 8085: 0x00006566, + 8086: 0x00006562, + 8087: 0x00006563, + 8088: 0x00006591, + 8089: 0x00006590, + 8090: 0x000065AF, + 8091: 0x0000666E, + 8092: 0x00006670, + 8093: 0x00006674, + 8094: 0x00006676, + 8095: 0x0000666F, + 8096: 0x00006691, + 8097: 0x0000667A, + 8098: 0x0000667E, + 8099: 0x00006677, + 8100: 0x000066FE, + 8101: 0x000066FF, + 8102: 0x0000671F, + 8103: 0x0000671D, + 8104: 0x000068FA, + 8105: 0x000068D5, + 8106: 0x000068E0, + 8107: 0x000068D8, + 8108: 0x000068D7, + 8109: 0x00006905, + 8110: 0x000068DF, + 8111: 0x000068F5, + 8112: 0x000068EE, + 8113: 0x000068E7, + 8114: 0x000068F9, + 8115: 0x000068D2, + 8116: 0x000068F2, + 8117: 0x000068E3, + 8118: 0x000068CB, + 8119: 0x000068CD, + 8120: 0x0000690D, + 8121: 0x00006912, + 8122: 0x0000690E, + 8123: 0x000068C9, + 8124: 0x000068DA, + 8125: 0x0000696E, + 8126: 0x000068FB, + 8127: 0x00006B3E, + 8128: 0x00006B3A, + 8129: 0x00006B3D, + 8130: 0x00006B98, + 8131: 0x00006B96, + 8132: 0x00006BBC, + 8133: 0x00006BEF, + 8134: 0x00006C2E, + 8135: 0x00006C2F, + 8136: 0x00006C2C, + 8137: 0x00006E2F, + 8138: 0x00006E38, + 8139: 0x00006E54, + 8140: 0x00006E21, + 8141: 0x00006E32, + 8142: 0x00006E67, + 8143: 0x00006E4A, + 8144: 0x00006E20, + 8145: 0x00006E25, + 8146: 0x00006E23, + 8147: 0x00006E1B, + 8148: 0x00006E5B, + 8149: 0x00006E58, + 8150: 0x00006E24, + 8151: 0x00006E56, + 8152: 0x00006E6E, + 8153: 0x00006E2D, + 8154: 0x00006E26, + 8155: 0x00006E6F, + 8156: 0x00006E34, + 8157: 0x00006E4D, + 8158: 0x00006E3A, + 8159: 0x00006E2C, + 8160: 0x00006E43, + 8161: 0x00006E1D, + 8162: 0x00006E3E, + 8163: 0x00006ECB, + 8164: 0x00006E89, + 8165: 0x00006E19, + 8166: 0x00006E4E, + 8167: 0x00006E63, + 8168: 0x00006E44, + 8169: 0x00006E72, + 8170: 0x00006E69, + 8171: 0x00006E5F, + 8172: 0x00007119, + 8173: 0x0000711A, + 8174: 0x00007126, + 8175: 0x00007130, + 8176: 0x00007121, + 8177: 0x00007136, + 8178: 0x0000716E, + 8179: 0x0000711C, + 8180: 0x0000724C, + 8181: 0x00007284, + 8182: 0x00007280, + 8183: 0x00007336, + 8184: 0x00007325, + 8185: 0x00007334, + 8186: 0x00007329, + 8187: 0x0000743A, + 8188: 0x0000742A, + 8189: 0x00007433, + 8190: 0x00007422, + 8191: 0x00007425, + 8192: 0x00007435, + 8193: 0x00007436, + 8194: 0x00007434, + 8195: 0x0000742F, + 8196: 0x0000741B, + 8197: 0x00007426, + 8198: 0x00007428, + 8199: 0x00007525, + 8200: 0x00007526, + 8201: 0x0000756B, + 8202: 0x0000756A, + 8203: 0x000075E2, + 8204: 0x000075DB, + 8205: 0x000075E3, + 8206: 0x000075D9, + 8207: 0x000075D8, + 8208: 0x000075DE, + 8209: 0x000075E0, + 8210: 0x0000767B, + 8211: 0x0000767C, + 8212: 0x00007696, + 8213: 0x00007693, + 8214: 0x000076B4, + 8215: 0x000076DC, + 8216: 0x0000774F, + 8217: 0x000077ED, + 8218: 0x0000785D, + 8219: 0x0000786C, + 8220: 0x0000786F, + 8221: 0x00007A0D, + 8222: 0x00007A08, + 8223: 0x00007A0B, + 8224: 0x00007A05, + 8225: 0x00007A00, + 8226: 0x00007A98, + 8227: 0x00007A97, + 8228: 0x00007A96, + 8229: 0x00007AE5, + 8230: 0x00007AE3, + 8231: 0x00007B49, + 8232: 0x00007B56, + 8233: 0x00007B46, + 8234: 0x00007B50, + 8235: 0x00007B52, + 8236: 0x00007B54, + 8237: 0x00007B4D, + 8238: 0x00007B4B, + 8239: 0x00007B4F, + 8240: 0x00007B51, + 8241: 0x00007C9F, + 8242: 0x00007CA5, + 8243: 0x00007D5E, + 8244: 0x00007D50, + 8245: 0x00007D68, + 8246: 0x00007D55, + 8247: 0x00007D2B, + 8248: 0x00007D6E, + 8249: 0x00007D72, + 8250: 0x00007D61, + 8251: 0x00007D66, + 8252: 0x00007D62, + 8253: 0x00007D70, + 8254: 0x00007D73, + 8255: 0x00005584, + 8256: 0x00007FD4, + 8257: 0x00007FD5, + 8258: 0x0000800B, + 8259: 0x00008052, + 8260: 0x00008085, + 8261: 0x00008155, + 8262: 0x00008154, + 8263: 0x0000814B, + 8264: 0x00008151, + 8265: 0x0000814E, + 8266: 0x00008139, + 8267: 0x00008146, + 8268: 0x0000813E, + 8269: 0x0000814C, + 8270: 0x00008153, + 8271: 0x00008174, + 8272: 0x00008212, + 8273: 0x0000821C, + 8274: 0x000083E9, + 8275: 0x00008403, + 8276: 0x000083F8, + 8277: 0x0000840D, + 8278: 0x000083E0, + 8279: 0x000083C5, + 8280: 0x0000840B, + 8281: 0x000083C1, + 8282: 0x000083EF, + 8283: 0x000083F1, + 8284: 0x000083F4, + 8285: 0x00008457, + 8286: 0x0000840A, + 8287: 0x000083F0, + 8288: 0x0000840C, + 8289: 0x000083CC, + 8290: 0x000083FD, + 8291: 0x000083F2, + 8292: 0x000083CA, + 8293: 0x00008438, + 8294: 0x0000840E, + 8295: 0x00008404, + 8296: 0x000083DC, + 8297: 0x00008407, + 8298: 0x000083D4, + 8299: 0x000083DF, + 8300: 0x0000865B, + 8301: 0x000086DF, + 8302: 0x000086D9, + 8303: 0x000086ED, + 8304: 0x000086D4, + 8305: 0x000086DB, + 8306: 0x000086E4, + 8307: 0x000086D0, + 8308: 0x000086DE, + 8309: 0x00008857, + 8310: 0x000088C1, + 8311: 0x000088C2, + 8312: 0x000088B1, + 8313: 0x00008983, + 8314: 0x00008996, + 8315: 0x00008A3B, + 8316: 0x00008A60, + 8317: 0x00008A55, + 8318: 0x00008A5E, + 8319: 0x00008A3C, + 8320: 0x00008A41, + 8321: 0x00008A54, + 8322: 0x00008A5B, + 8323: 0x00008A50, + 8324: 0x00008A46, + 8325: 0x00008A34, + 8326: 0x00008A3A, + 8327: 0x00008A36, + 8328: 0x00008A56, + 8329: 0x00008C61, + 8330: 0x00008C82, + 8331: 0x00008CAF, + 8332: 0x00008CBC, + 8333: 0x00008CB3, + 8334: 0x00008CBD, + 8335: 0x00008CC1, + 8336: 0x00008CBB, + 8337: 0x00008CC0, + 8338: 0x00008CB4, + 8339: 0x00008CB7, + 8340: 0x00008CB6, + 8341: 0x00008CBF, + 8342: 0x00008CB8, + 8343: 0x00008D8A, + 8344: 0x00008D85, + 8345: 0x00008D81, + 8346: 0x00008DCE, + 8347: 0x00008DDD, + 8348: 0x00008DCB, + 8349: 0x00008DDA, + 8350: 0x00008DD1, + 8351: 0x00008DCC, + 8352: 0x00008DDB, + 8353: 0x00008DC6, + 8354: 0x00008EFB, + 8355: 0x00008EF8, + 8356: 0x00008EFC, + 8357: 0x00008F9C, + 8358: 0x0000902E, + 8359: 0x00009035, + 8360: 0x00009031, + 8361: 0x00009038, + 8362: 0x00009032, + 8363: 0x00009036, + 8364: 0x00009102, + 8365: 0x000090F5, + 8366: 0x00009109, + 8367: 0x000090FE, + 8368: 0x00009163, + 8369: 0x00009165, + 8370: 0x000091CF, + 8371: 0x00009214, + 8372: 0x00009215, + 8373: 0x00009223, + 8374: 0x00009209, + 8375: 0x0000921E, + 8376: 0x0000920D, + 8377: 0x00009210, + 8378: 0x00009207, + 8379: 0x00009211, + 8380: 0x00009594, + 8381: 0x0000958F, + 8382: 0x0000958B, + 8383: 0x00009591, + 8384: 0x00009593, + 8385: 0x00009592, + 8386: 0x0000958E, + 8387: 0x0000968A, + 8388: 0x0000968E, + 8389: 0x0000968B, + 8390: 0x0000967D, + 8391: 0x00009685, + 8392: 0x00009686, + 8393: 0x0000968D, + 8394: 0x00009672, + 8395: 0x00009684, + 8396: 0x000096C1, + 8397: 0x000096C5, + 8398: 0x000096C4, + 8399: 0x000096C6, + 8400: 0x000096C7, + 8401: 0x000096EF, + 8402: 0x000096F2, + 8403: 0x000097CC, + 8404: 0x00009805, + 8405: 0x00009806, + 8406: 0x00009808, + 8407: 0x000098E7, + 8408: 0x000098EA, + 8409: 0x000098EF, + 8410: 0x000098E9, + 8411: 0x000098F2, + 8412: 0x000098ED, + 8413: 0x000099AE, + 8414: 0x000099AD, + 8415: 0x00009EC3, + 8416: 0x00009ECD, + 8417: 0x00009ED1, + 8418: 0x00004E82, + 8419: 0x000050AD, + 8420: 0x000050B5, + 8421: 0x000050B2, + 8422: 0x000050B3, + 8423: 0x000050C5, + 8424: 0x000050BE, + 8425: 0x000050AC, + 8426: 0x000050B7, + 8427: 0x000050BB, + 8428: 0x000050AF, + 8429: 0x000050C7, + 8430: 0x0000527F, + 8431: 0x00005277, + 8432: 0x0000527D, + 8433: 0x000052DF, + 8434: 0x000052E6, + 8435: 0x000052E4, + 8436: 0x000052E2, + 8437: 0x000052E3, + 8438: 0x0000532F, + 8439: 0x000055DF, + 8440: 0x000055E8, + 8441: 0x000055D3, + 8442: 0x000055E6, + 8443: 0x000055CE, + 8444: 0x000055DC, + 8445: 0x000055C7, + 8446: 0x000055D1, + 8447: 0x000055E3, + 8448: 0x000055E4, + 8449: 0x000055EF, + 8450: 0x000055DA, + 8451: 0x000055E1, + 8452: 0x000055C5, + 8453: 0x000055C6, + 8454: 0x000055E5, + 8455: 0x000055C9, + 8456: 0x00005712, + 8457: 0x00005713, + 8458: 0x0000585E, + 8459: 0x00005851, + 8460: 0x00005858, + 8461: 0x00005857, + 8462: 0x0000585A, + 8463: 0x00005854, + 8464: 0x0000586B, + 8465: 0x0000584C, + 8466: 0x0000586D, + 8467: 0x0000584A, + 8468: 0x00005862, + 8469: 0x00005852, + 8470: 0x0000584B, + 8471: 0x00005967, + 8472: 0x00005AC1, + 8473: 0x00005AC9, + 8474: 0x00005ACC, + 8475: 0x00005ABE, + 8476: 0x00005ABD, + 8477: 0x00005ABC, + 8478: 0x00005AB3, + 8479: 0x00005AC2, + 8480: 0x00005AB2, + 8481: 0x00005D69, + 8482: 0x00005D6F, + 8483: 0x00005E4C, + 8484: 0x00005E79, + 8485: 0x00005EC9, + 8486: 0x00005EC8, + 8487: 0x00005F12, + 8488: 0x00005F59, + 8489: 0x00005FAC, + 8490: 0x00005FAE, + 8491: 0x0000611A, + 8492: 0x0000610F, + 8493: 0x00006148, + 8494: 0x0000611F, + 8495: 0x000060F3, + 8496: 0x0000611B, + 8497: 0x000060F9, + 8498: 0x00006101, + 8499: 0x00006108, + 8500: 0x0000614E, + 8501: 0x0000614C, + 8502: 0x00006144, + 8503: 0x0000614D, + 8504: 0x0000613E, + 8505: 0x00006134, + 8506: 0x00006127, + 8507: 0x0000610D, + 8508: 0x00006106, + 8509: 0x00006137, + 8510: 0x00006221, + 8511: 0x00006222, + 8512: 0x00006413, + 8513: 0x0000643E, + 8514: 0x0000641E, + 8515: 0x0000642A, + 8516: 0x0000642D, + 8517: 0x0000643D, + 8518: 0x0000642C, + 8519: 0x0000640F, + 8520: 0x0000641C, + 8521: 0x00006414, + 8522: 0x0000640D, + 8523: 0x00006436, + 8524: 0x00006416, + 8525: 0x00006417, + 8526: 0x00006406, + 8527: 0x0000656C, + 8528: 0x0000659F, + 8529: 0x000065B0, + 8530: 0x00006697, + 8531: 0x00006689, + 8532: 0x00006687, + 8533: 0x00006688, + 8534: 0x00006696, + 8535: 0x00006684, + 8536: 0x00006698, + 8537: 0x0000668D, + 8538: 0x00006703, + 8539: 0x00006994, + 8540: 0x0000696D, + 8541: 0x0000695A, + 8542: 0x00006977, + 8543: 0x00006960, + 8544: 0x00006954, + 8545: 0x00006975, + 8546: 0x00006930, + 8547: 0x00006982, + 8548: 0x0000694A, + 8549: 0x00006968, + 8550: 0x0000696B, + 8551: 0x0000695E, + 8552: 0x00006953, + 8553: 0x00006979, + 8554: 0x00006986, + 8555: 0x0000695D, + 8556: 0x00006963, + 8557: 0x0000695B, + 8558: 0x00006B47, + 8559: 0x00006B72, + 8560: 0x00006BC0, + 8561: 0x00006BBF, + 8562: 0x00006BD3, + 8563: 0x00006BFD, + 8564: 0x00006EA2, + 8565: 0x00006EAF, + 8566: 0x00006ED3, + 8567: 0x00006EB6, + 8568: 0x00006EC2, + 8569: 0x00006E90, + 8570: 0x00006E9D, + 8571: 0x00006EC7, + 8572: 0x00006EC5, + 8573: 0x00006EA5, + 8574: 0x00006E98, + 8575: 0x00006EBC, + 8576: 0x00006EBA, + 8577: 0x00006EAB, + 8578: 0x00006ED1, + 8579: 0x00006E96, + 8580: 0x00006E9C, + 8581: 0x00006EC4, + 8582: 0x00006ED4, + 8583: 0x00006EAA, + 8584: 0x00006EA7, + 8585: 0x00006EB4, + 8586: 0x0000714E, + 8587: 0x00007159, + 8588: 0x00007169, + 8589: 0x00007164, + 8590: 0x00007149, + 8591: 0x00007167, + 8592: 0x0000715C, + 8593: 0x0000716C, + 8594: 0x00007166, + 8595: 0x0000714C, + 8596: 0x00007165, + 8597: 0x0000715E, + 8598: 0x00007146, + 8599: 0x00007168, + 8600: 0x00007156, + 8601: 0x0000723A, + 8602: 0x00007252, + 8603: 0x00007337, + 8604: 0x00007345, + 8605: 0x0000733F, + 8606: 0x0000733E, + 8607: 0x0000746F, + 8608: 0x0000745A, + 8609: 0x00007455, + 8610: 0x0000745F, + 8611: 0x0000745E, + 8612: 0x00007441, + 8613: 0x0000743F, + 8614: 0x00007459, + 8615: 0x0000745B, + 8616: 0x0000745C, + 8617: 0x00007576, + 8618: 0x00007578, + 8619: 0x00007600, + 8620: 0x000075F0, + 8621: 0x00007601, + 8622: 0x000075F2, + 8623: 0x000075F1, + 8624: 0x000075FA, + 8625: 0x000075FF, + 8626: 0x000075F4, + 8627: 0x000075F3, + 8628: 0x000076DE, + 8629: 0x000076DF, + 8630: 0x0000775B, + 8631: 0x0000776B, + 8632: 0x00007766, + 8633: 0x0000775E, + 8634: 0x00007763, + 8635: 0x00007779, + 8636: 0x0000776A, + 8637: 0x0000776C, + 8638: 0x0000775C, + 8639: 0x00007765, + 8640: 0x00007768, + 8641: 0x00007762, + 8642: 0x000077EE, + 8643: 0x0000788E, + 8644: 0x000078B0, + 8645: 0x00007897, + 8646: 0x00007898, + 8647: 0x0000788C, + 8648: 0x00007889, + 8649: 0x0000787C, + 8650: 0x00007891, + 8651: 0x00007893, + 8652: 0x0000787F, + 8653: 0x0000797A, + 8654: 0x0000797F, + 8655: 0x00007981, + 8656: 0x0000842C, + 8657: 0x000079BD, + 8658: 0x00007A1C, + 8659: 0x00007A1A, + 8660: 0x00007A20, + 8661: 0x00007A14, + 8662: 0x00007A1F, + 8663: 0x00007A1E, + 8664: 0x00007A9F, + 8665: 0x00007AA0, + 8666: 0x00007B77, + 8667: 0x00007BC0, + 8668: 0x00007B60, + 8669: 0x00007B6E, + 8670: 0x00007B67, + 8671: 0x00007CB1, + 8672: 0x00007CB3, + 8673: 0x00007CB5, + 8674: 0x00007D93, + 8675: 0x00007D79, + 8676: 0x00007D91, + 8677: 0x00007D81, + 8678: 0x00007D8F, + 8679: 0x00007D5B, + 8680: 0x00007F6E, + 8681: 0x00007F69, + 8682: 0x00007F6A, + 8683: 0x00007F72, + 8684: 0x00007FA9, + 8685: 0x00007FA8, + 8686: 0x00007FA4, + 8687: 0x00008056, + 8688: 0x00008058, + 8689: 0x00008086, + 8690: 0x00008084, + 8691: 0x00008171, + 8692: 0x00008170, + 8693: 0x00008178, + 8694: 0x00008165, + 8695: 0x0000816E, + 8696: 0x00008173, + 8697: 0x0000816B, + 8698: 0x00008179, + 8699: 0x0000817A, + 8700: 0x00008166, + 8701: 0x00008205, + 8702: 0x00008247, + 8703: 0x00008482, + 8704: 0x00008477, + 8705: 0x0000843D, + 8706: 0x00008431, + 8707: 0x00008475, + 8708: 0x00008466, + 8709: 0x0000846B, + 8710: 0x00008449, + 8711: 0x0000846C, + 8712: 0x0000845B, + 8713: 0x0000843C, + 8714: 0x00008435, + 8715: 0x00008461, + 8716: 0x00008463, + 8717: 0x00008469, + 8718: 0x0000846D, + 8719: 0x00008446, + 8720: 0x0000865E, + 8721: 0x0000865C, + 8722: 0x0000865F, + 8723: 0x000086F9, + 8724: 0x00008713, + 8725: 0x00008708, + 8726: 0x00008707, + 8727: 0x00008700, + 8728: 0x000086FE, + 8729: 0x000086FB, + 8730: 0x00008702, + 8731: 0x00008703, + 8732: 0x00008706, + 8733: 0x0000870A, + 8734: 0x00008859, + 8735: 0x000088DF, + 8736: 0x000088D4, + 8737: 0x000088D9, + 8738: 0x000088DC, + 8739: 0x000088D8, + 8740: 0x000088DD, + 8741: 0x000088E1, + 8742: 0x000088CA, + 8743: 0x000088D5, + 8744: 0x000088D2, + 8745: 0x0000899C, + 8746: 0x000089E3, + 8747: 0x00008A6B, + 8748: 0x00008A72, + 8749: 0x00008A73, + 8750: 0x00008A66, + 8751: 0x00008A69, + 8752: 0x00008A70, + 8753: 0x00008A87, + 8754: 0x00008A7C, + 8755: 0x00008A63, + 8756: 0x00008AA0, + 8757: 0x00008A71, + 8758: 0x00008A85, + 8759: 0x00008A6D, + 8760: 0x00008A62, + 8761: 0x00008A6E, + 8762: 0x00008A6C, + 8763: 0x00008A79, + 8764: 0x00008A7B, + 8765: 0x00008A3E, + 8766: 0x00008A68, + 8767: 0x00008C62, + 8768: 0x00008C8A, + 8769: 0x00008C89, + 8770: 0x00008CCA, + 8771: 0x00008CC7, + 8772: 0x00008CC8, + 8773: 0x00008CC4, + 8774: 0x00008CB2, + 8775: 0x00008CC3, + 8776: 0x00008CC2, + 8777: 0x00008CC5, + 8778: 0x00008DE1, + 8779: 0x00008DDF, + 8780: 0x00008DE8, + 8781: 0x00008DEF, + 8782: 0x00008DF3, + 8783: 0x00008DFA, + 8784: 0x00008DEA, + 8785: 0x00008DE4, + 8786: 0x00008DE6, + 8787: 0x00008EB2, + 8788: 0x00008F03, + 8789: 0x00008F09, + 8790: 0x00008EFE, + 8791: 0x00008F0A, + 8792: 0x00008F9F, + 8793: 0x00008FB2, + 8794: 0x0000904B, + 8795: 0x0000904A, + 8796: 0x00009053, + 8797: 0x00009042, + 8798: 0x00009054, + 8799: 0x0000903C, + 8800: 0x00009055, + 8801: 0x00009050, + 8802: 0x00009047, + 8803: 0x0000904F, + 8804: 0x0000904E, + 8805: 0x0000904D, + 8806: 0x00009051, + 8807: 0x0000903E, + 8808: 0x00009041, + 8809: 0x00009112, + 8810: 0x00009117, + 8811: 0x0000916C, + 8812: 0x0000916A, + 8813: 0x00009169, + 8814: 0x000091C9, + 8815: 0x00009237, + 8816: 0x00009257, + 8817: 0x00009238, + 8818: 0x0000923D, + 8819: 0x00009240, + 8820: 0x0000923E, + 8821: 0x0000925B, + 8822: 0x0000924B, + 8823: 0x00009264, + 8824: 0x00009251, + 8825: 0x00009234, + 8826: 0x00009249, + 8827: 0x0000924D, + 8828: 0x00009245, + 8829: 0x00009239, + 8830: 0x0000923F, + 8831: 0x0000925A, + 8832: 0x00009598, + 8833: 0x00009698, + 8834: 0x00009694, + 8835: 0x00009695, + 8836: 0x000096CD, + 8837: 0x000096CB, + 8838: 0x000096C9, + 8839: 0x000096CA, + 8840: 0x000096F7, + 8841: 0x000096FB, + 8842: 0x000096F9, + 8843: 0x000096F6, + 8844: 0x00009756, + 8845: 0x00009774, + 8846: 0x00009776, + 8847: 0x00009810, + 8848: 0x00009811, + 8849: 0x00009813, + 8850: 0x0000980A, + 8851: 0x00009812, + 8852: 0x0000980C, + 8853: 0x000098FC, + 8854: 0x000098F4, + 8855: 0x000098FD, + 8856: 0x000098FE, + 8857: 0x000099B3, + 8858: 0x000099B1, + 8859: 0x000099B4, + 8860: 0x00009AE1, + 8861: 0x00009CE9, + 8862: 0x00009E82, + 8863: 0x00009F0E, + 8864: 0x00009F13, + 8865: 0x00009F20, + 8866: 0x000050E7, + 8867: 0x000050EE, + 8868: 0x000050E5, + 8869: 0x000050D6, + 8870: 0x000050ED, + 8871: 0x000050DA, + 8872: 0x000050D5, + 8873: 0x000050CF, + 8874: 0x000050D1, + 8875: 0x000050F1, + 8876: 0x000050CE, + 8877: 0x000050E9, + 8878: 0x00005162, + 8879: 0x000051F3, + 8880: 0x00005283, + 8881: 0x00005282, + 8882: 0x00005331, + 8883: 0x000053AD, + 8884: 0x000055FE, + 8885: 0x00005600, + 8886: 0x0000561B, + 8887: 0x00005617, + 8888: 0x000055FD, + 8889: 0x00005614, + 8890: 0x00005606, + 8891: 0x00005609, + 8892: 0x0000560D, + 8893: 0x0000560E, + 8894: 0x000055F7, + 8895: 0x00005616, + 8896: 0x0000561F, + 8897: 0x00005608, + 8898: 0x00005610, + 8899: 0x000055F6, + 8900: 0x00005718, + 8901: 0x00005716, + 8902: 0x00005875, + 8903: 0x0000587E, + 8904: 0x00005883, + 8905: 0x00005893, + 8906: 0x0000588A, + 8907: 0x00005879, + 8908: 0x00005885, + 8909: 0x0000587D, + 8910: 0x000058FD, + 8911: 0x00005925, + 8912: 0x00005922, + 8913: 0x00005924, + 8914: 0x0000596A, + 8915: 0x00005969, + 8916: 0x00005AE1, + 8917: 0x00005AE6, + 8918: 0x00005AE9, + 8919: 0x00005AD7, + 8920: 0x00005AD6, + 8921: 0x00005AD8, + 8922: 0x00005AE3, + 8923: 0x00005B75, + 8924: 0x00005BDE, + 8925: 0x00005BE7, + 8926: 0x00005BE1, + 8927: 0x00005BE5, + 8928: 0x00005BE6, + 8929: 0x00005BE8, + 8930: 0x00005BE2, + 8931: 0x00005BE4, + 8932: 0x00005BDF, + 8933: 0x00005C0D, + 8934: 0x00005C62, + 8935: 0x00005D84, + 8936: 0x00005D87, + 8937: 0x00005E5B, + 8938: 0x00005E63, + 8939: 0x00005E55, + 8940: 0x00005E57, + 8941: 0x00005E54, + 8942: 0x00005ED3, + 8943: 0x00005ED6, + 8944: 0x00005F0A, + 8945: 0x00005F46, + 8946: 0x00005F70, + 8947: 0x00005FB9, + 8948: 0x00006147, + 8949: 0x0000613F, + 8950: 0x0000614B, + 8951: 0x00006177, + 8952: 0x00006162, + 8953: 0x00006163, + 8954: 0x0000615F, + 8955: 0x0000615A, + 8956: 0x00006158, + 8957: 0x00006175, + 8958: 0x0000622A, + 8959: 0x00006487, + 8960: 0x00006458, + 8961: 0x00006454, + 8962: 0x000064A4, + 8963: 0x00006478, + 8964: 0x0000645F, + 8965: 0x0000647A, + 8966: 0x00006451, + 8967: 0x00006467, + 8968: 0x00006434, + 8969: 0x0000646D, + 8970: 0x0000647B, + 8971: 0x00006572, + 8972: 0x000065A1, + 8973: 0x000065D7, + 8974: 0x000065D6, + 8975: 0x000066A2, + 8976: 0x000066A8, + 8977: 0x0000669D, + 8978: 0x0000699C, + 8979: 0x000069A8, + 8980: 0x00006995, + 8981: 0x000069C1, + 8982: 0x000069AE, + 8983: 0x000069D3, + 8984: 0x000069CB, + 8985: 0x0000699B, + 8986: 0x000069B7, + 8987: 0x000069BB, + 8988: 0x000069AB, + 8989: 0x000069B4, + 8990: 0x000069D0, + 8991: 0x000069CD, + 8992: 0x000069AD, + 8993: 0x000069CC, + 8994: 0x000069A6, + 8995: 0x000069C3, + 8996: 0x000069A3, + 8997: 0x00006B49, + 8998: 0x00006B4C, + 8999: 0x00006C33, + 9000: 0x00006F33, + 9001: 0x00006F14, + 9002: 0x00006EFE, + 9003: 0x00006F13, + 9004: 0x00006EF4, + 9005: 0x00006F29, + 9006: 0x00006F3E, + 9007: 0x00006F20, + 9008: 0x00006F2C, + 9009: 0x00006F0F, + 9010: 0x00006F02, + 9011: 0x00006F22, + 9012: 0x00006EFF, + 9013: 0x00006EEF, + 9014: 0x00006F06, + 9015: 0x00006F31, + 9016: 0x00006F38, + 9017: 0x00006F32, + 9018: 0x00006F23, + 9019: 0x00006F15, + 9020: 0x00006F2B, + 9021: 0x00006F2F, + 9022: 0x00006F88, + 9023: 0x00006F2A, + 9024: 0x00006EEC, + 9025: 0x00006F01, + 9026: 0x00006EF2, + 9027: 0x00006ECC, + 9028: 0x00006EF7, + 9029: 0x00007194, + 9030: 0x00007199, + 9031: 0x0000717D, + 9032: 0x0000718A, + 9033: 0x00007184, + 9034: 0x00007192, + 9035: 0x0000723E, + 9036: 0x00007292, + 9037: 0x00007296, + 9038: 0x00007344, + 9039: 0x00007350, + 9040: 0x00007464, + 9041: 0x00007463, + 9042: 0x0000746A, + 9043: 0x00007470, + 9044: 0x0000746D, + 9045: 0x00007504, + 9046: 0x00007591, + 9047: 0x00007627, + 9048: 0x0000760D, + 9049: 0x0000760B, + 9050: 0x00007609, + 9051: 0x00007613, + 9052: 0x000076E1, + 9053: 0x000076E3, + 9054: 0x00007784, + 9055: 0x0000777D, + 9056: 0x0000777F, + 9057: 0x00007761, + 9058: 0x000078C1, + 9059: 0x0000789F, + 9060: 0x000078A7, + 9061: 0x000078B3, + 9062: 0x000078A9, + 9063: 0x000078A3, + 9064: 0x0000798E, + 9065: 0x0000798F, + 9066: 0x0000798D, + 9067: 0x00007A2E, + 9068: 0x00007A31, + 9069: 0x00007AAA, + 9070: 0x00007AA9, + 9071: 0x00007AED, + 9072: 0x00007AEF, + 9073: 0x00007BA1, + 9074: 0x00007B95, + 9075: 0x00007B8B, + 9076: 0x00007B75, + 9077: 0x00007B97, + 9078: 0x00007B9D, + 9079: 0x00007B94, + 9080: 0x00007B8F, + 9081: 0x00007BB8, + 9082: 0x00007B87, + 9083: 0x00007B84, + 9084: 0x00007CB9, + 9085: 0x00007CBD, + 9086: 0x00007CBE, + 9087: 0x00007DBB, + 9088: 0x00007DB0, + 9089: 0x00007D9C, + 9090: 0x00007DBD, + 9091: 0x00007DBE, + 9092: 0x00007DA0, + 9093: 0x00007DCA, + 9094: 0x00007DB4, + 9095: 0x00007DB2, + 9096: 0x00007DB1, + 9097: 0x00007DBA, + 9098: 0x00007DA2, + 9099: 0x00007DBF, + 9100: 0x00007DB5, + 9101: 0x00007DB8, + 9102: 0x00007DAD, + 9103: 0x00007DD2, + 9104: 0x00007DC7, + 9105: 0x00007DAC, + 9106: 0x00007F70, + 9107: 0x00007FE0, + 9108: 0x00007FE1, + 9109: 0x00007FDF, + 9110: 0x0000805E, + 9111: 0x0000805A, + 9112: 0x00008087, + 9113: 0x00008150, + 9114: 0x00008180, + 9115: 0x0000818F, + 9116: 0x00008188, + 9117: 0x0000818A, + 9118: 0x0000817F, + 9119: 0x00008182, + 9120: 0x000081E7, + 9121: 0x000081FA, + 9122: 0x00008207, + 9123: 0x00008214, + 9124: 0x0000821E, + 9125: 0x0000824B, + 9126: 0x000084C9, + 9127: 0x000084BF, + 9128: 0x000084C6, + 9129: 0x000084C4, + 9130: 0x00008499, + 9131: 0x0000849E, + 9132: 0x000084B2, + 9133: 0x0000849C, + 9134: 0x000084CB, + 9135: 0x000084B8, + 9136: 0x000084C0, + 9137: 0x000084D3, + 9138: 0x00008490, + 9139: 0x000084BC, + 9140: 0x000084D1, + 9141: 0x000084CA, + 9142: 0x0000873F, + 9143: 0x0000871C, + 9144: 0x0000873B, + 9145: 0x00008722, + 9146: 0x00008725, + 9147: 0x00008734, + 9148: 0x00008718, + 9149: 0x00008755, + 9150: 0x00008737, + 9151: 0x00008729, + 9152: 0x000088F3, + 9153: 0x00008902, + 9154: 0x000088F4, + 9155: 0x000088F9, + 9156: 0x000088F8, + 9157: 0x000088FD, + 9158: 0x000088E8, + 9159: 0x0000891A, + 9160: 0x000088EF, + 9161: 0x00008AA6, + 9162: 0x00008A8C, + 9163: 0x00008A9E, + 9164: 0x00008AA3, + 9165: 0x00008A8D, + 9166: 0x00008AA1, + 9167: 0x00008A93, + 9168: 0x00008AA4, + 9169: 0x00008AAA, + 9170: 0x00008AA5, + 9171: 0x00008AA8, + 9172: 0x00008A98, + 9173: 0x00008A91, + 9174: 0x00008A9A, + 9175: 0x00008AA7, + 9176: 0x00008C6A, + 9177: 0x00008C8D, + 9178: 0x00008C8C, + 9179: 0x00008CD3, + 9180: 0x00008CD1, + 9181: 0x00008CD2, + 9182: 0x00008D6B, + 9183: 0x00008D99, + 9184: 0x00008D95, + 9185: 0x00008DFC, + 9186: 0x00008F14, + 9187: 0x00008F12, + 9188: 0x00008F15, + 9189: 0x00008F13, + 9190: 0x00008FA3, + 9191: 0x00009060, + 9192: 0x00009058, + 9193: 0x0000905C, + 9194: 0x00009063, + 9195: 0x00009059, + 9196: 0x0000905E, + 9197: 0x00009062, + 9198: 0x0000905D, + 9199: 0x0000905B, + 9200: 0x00009119, + 9201: 0x00009118, + 9202: 0x0000911E, + 9203: 0x00009175, + 9204: 0x00009178, + 9205: 0x00009177, + 9206: 0x00009174, + 9207: 0x00009278, + 9208: 0x00009280, + 9209: 0x00009285, + 9210: 0x00009298, + 9211: 0x00009296, + 9212: 0x0000927B, + 9213: 0x00009293, + 9214: 0x0000929C, + 9215: 0x000092A8, + 9216: 0x0000927C, + 9217: 0x00009291, + 9218: 0x000095A1, + 9219: 0x000095A8, + 9220: 0x000095A9, + 9221: 0x000095A3, + 9222: 0x000095A5, + 9223: 0x000095A4, + 9224: 0x00009699, + 9225: 0x0000969C, + 9226: 0x0000969B, + 9227: 0x000096CC, + 9228: 0x000096D2, + 9229: 0x00009700, + 9230: 0x0000977C, + 9231: 0x00009785, + 9232: 0x000097F6, + 9233: 0x00009817, + 9234: 0x00009818, + 9235: 0x000098AF, + 9236: 0x000098B1, + 9237: 0x00009903, + 9238: 0x00009905, + 9239: 0x0000990C, + 9240: 0x00009909, + 9241: 0x000099C1, + 9242: 0x00009AAF, + 9243: 0x00009AB0, + 9244: 0x00009AE6, + 9245: 0x00009B41, + 9246: 0x00009B42, + 9247: 0x00009CF4, + 9248: 0x00009CF6, + 9249: 0x00009CF3, + 9250: 0x00009EBC, + 9251: 0x00009F3B, + 9252: 0x00009F4A, + 9253: 0x00005104, + 9254: 0x00005100, + 9255: 0x000050FB, + 9256: 0x000050F5, + 9257: 0x000050F9, + 9258: 0x00005102, + 9259: 0x00005108, + 9260: 0x00005109, + 9261: 0x00005105, + 9262: 0x000051DC, + 9263: 0x00005287, + 9264: 0x00005288, + 9265: 0x00005289, + 9266: 0x0000528D, + 9267: 0x0000528A, + 9268: 0x000052F0, + 9269: 0x000053B2, + 9270: 0x0000562E, + 9271: 0x0000563B, + 9272: 0x00005639, + 9273: 0x00005632, + 9274: 0x0000563F, + 9275: 0x00005634, + 9276: 0x00005629, + 9277: 0x00005653, + 9278: 0x0000564E, + 9279: 0x00005657, + 9280: 0x00005674, + 9281: 0x00005636, + 9282: 0x0000562F, + 9283: 0x00005630, + 9284: 0x00005880, + 9285: 0x0000589F, + 9286: 0x0000589E, + 9287: 0x000058B3, + 9288: 0x0000589C, + 9289: 0x000058AE, + 9290: 0x000058A9, + 9291: 0x000058A6, + 9292: 0x0000596D, + 9293: 0x00005B09, + 9294: 0x00005AFB, + 9295: 0x00005B0B, + 9296: 0x00005AF5, + 9297: 0x00005B0C, + 9298: 0x00005B08, + 9299: 0x00005BEE, + 9300: 0x00005BEC, + 9301: 0x00005BE9, + 9302: 0x00005BEB, + 9303: 0x00005C64, + 9304: 0x00005C65, + 9305: 0x00005D9D, + 9306: 0x00005D94, + 9307: 0x00005E62, + 9308: 0x00005E5F, + 9309: 0x00005E61, + 9310: 0x00005EE2, + 9311: 0x00005EDA, + 9312: 0x00005EDF, + 9313: 0x00005EDD, + 9314: 0x00005EE3, + 9315: 0x00005EE0, + 9316: 0x00005F48, + 9317: 0x00005F71, + 9318: 0x00005FB7, + 9319: 0x00005FB5, + 9320: 0x00006176, + 9321: 0x00006167, + 9322: 0x0000616E, + 9323: 0x0000615D, + 9324: 0x00006155, + 9325: 0x00006182, + 9326: 0x0000617C, + 9327: 0x00006170, + 9328: 0x0000616B, + 9329: 0x0000617E, + 9330: 0x000061A7, + 9331: 0x00006190, + 9332: 0x000061AB, + 9333: 0x0000618E, + 9334: 0x000061AC, + 9335: 0x0000619A, + 9336: 0x000061A4, + 9337: 0x00006194, + 9338: 0x000061AE, + 9339: 0x0000622E, + 9340: 0x00006469, + 9341: 0x0000646F, + 9342: 0x00006479, + 9343: 0x0000649E, + 9344: 0x000064B2, + 9345: 0x00006488, + 9346: 0x00006490, + 9347: 0x000064B0, + 9348: 0x000064A5, + 9349: 0x00006493, + 9350: 0x00006495, + 9351: 0x000064A9, + 9352: 0x00006492, + 9353: 0x000064AE, + 9354: 0x000064AD, + 9355: 0x000064AB, + 9356: 0x0000649A, + 9357: 0x000064AC, + 9358: 0x00006499, + 9359: 0x000064A2, + 9360: 0x000064B3, + 9361: 0x00006575, + 9362: 0x00006577, + 9363: 0x00006578, + 9364: 0x000066AE, + 9365: 0x000066AB, + 9366: 0x000066B4, + 9367: 0x000066B1, + 9368: 0x00006A23, + 9369: 0x00006A1F, + 9370: 0x000069E8, + 9371: 0x00006A01, + 9372: 0x00006A1E, + 9373: 0x00006A19, + 9374: 0x000069FD, + 9375: 0x00006A21, + 9376: 0x00006A13, + 9377: 0x00006A0A, + 9378: 0x000069F3, + 9379: 0x00006A02, + 9380: 0x00006A05, + 9381: 0x000069ED, + 9382: 0x00006A11, + 9383: 0x00006B50, + 9384: 0x00006B4E, + 9385: 0x00006BA4, + 9386: 0x00006BC5, + 9387: 0x00006BC6, + 9388: 0x00006F3F, + 9389: 0x00006F7C, + 9390: 0x00006F84, + 9391: 0x00006F51, + 9392: 0x00006F66, + 9393: 0x00006F54, + 9394: 0x00006F86, + 9395: 0x00006F6D, + 9396: 0x00006F5B, + 9397: 0x00006F78, + 9398: 0x00006F6E, + 9399: 0x00006F8E, + 9400: 0x00006F7A, + 9401: 0x00006F70, + 9402: 0x00006F64, + 9403: 0x00006F97, + 9404: 0x00006F58, + 9405: 0x00006ED5, + 9406: 0x00006F6F, + 9407: 0x00006F60, + 9408: 0x00006F5F, + 9409: 0x0000719F, + 9410: 0x000071AC, + 9411: 0x000071B1, + 9412: 0x000071A8, + 9413: 0x00007256, + 9414: 0x0000729B, + 9415: 0x0000734E, + 9416: 0x00007357, + 9417: 0x00007469, + 9418: 0x0000748B, + 9419: 0x00007483, + 9420: 0x0000747E, + 9421: 0x00007480, + 9422: 0x0000757F, + 9423: 0x00007620, + 9424: 0x00007629, + 9425: 0x0000761F, + 9426: 0x00007624, + 9427: 0x00007626, + 9428: 0x00007621, + 9429: 0x00007622, + 9430: 0x0000769A, + 9431: 0x000076BA, + 9432: 0x000076E4, + 9433: 0x0000778E, + 9434: 0x00007787, + 9435: 0x0000778C, + 9436: 0x00007791, + 9437: 0x0000778B, + 9438: 0x000078CB, + 9439: 0x000078C5, + 9440: 0x000078BA, + 9441: 0x000078CA, + 9442: 0x000078BE, + 9443: 0x000078D5, + 9444: 0x000078BC, + 9445: 0x000078D0, + 9446: 0x00007A3F, + 9447: 0x00007A3C, + 9448: 0x00007A40, + 9449: 0x00007A3D, + 9450: 0x00007A37, + 9451: 0x00007A3B, + 9452: 0x00007AAF, + 9453: 0x00007AAE, + 9454: 0x00007BAD, + 9455: 0x00007BB1, + 9456: 0x00007BC4, + 9457: 0x00007BB4, + 9458: 0x00007BC6, + 9459: 0x00007BC7, + 9460: 0x00007BC1, + 9461: 0x00007BA0, + 9462: 0x00007BCC, + 9463: 0x00007CCA, + 9464: 0x00007DE0, + 9465: 0x00007DF4, + 9466: 0x00007DEF, + 9467: 0x00007DFB, + 9468: 0x00007DD8, + 9469: 0x00007DEC, + 9470: 0x00007DDD, + 9471: 0x00007DE8, + 9472: 0x00007DE3, + 9473: 0x00007DDA, + 9474: 0x00007DDE, + 9475: 0x00007DE9, + 9476: 0x00007D9E, + 9477: 0x00007DD9, + 9478: 0x00007DF2, + 9479: 0x00007DF9, + 9480: 0x00007F75, + 9481: 0x00007F77, + 9482: 0x00007FAF, + 9483: 0x00007FE9, + 9484: 0x00008026, + 9485: 0x0000819B, + 9486: 0x0000819C, + 9487: 0x0000819D, + 9488: 0x000081A0, + 9489: 0x0000819A, + 9490: 0x00008198, + 9491: 0x00008517, + 9492: 0x0000853D, + 9493: 0x0000851A, + 9494: 0x000084EE, + 9495: 0x0000852C, + 9496: 0x0000852D, + 9497: 0x00008513, + 9498: 0x00008511, + 9499: 0x00008523, + 9500: 0x00008521, + 9501: 0x00008514, + 9502: 0x000084EC, + 9503: 0x00008525, + 9504: 0x000084FF, + 9505: 0x00008506, + 9506: 0x00008782, + 9507: 0x00008774, + 9508: 0x00008776, + 9509: 0x00008760, + 9510: 0x00008766, + 9511: 0x00008778, + 9512: 0x00008768, + 9513: 0x00008759, + 9514: 0x00008757, + 9515: 0x0000874C, + 9516: 0x00008753, + 9517: 0x0000885B, + 9518: 0x0000885D, + 9519: 0x00008910, + 9520: 0x00008907, + 9521: 0x00008912, + 9522: 0x00008913, + 9523: 0x00008915, + 9524: 0x0000890A, + 9525: 0x00008ABC, + 9526: 0x00008AD2, + 9527: 0x00008AC7, + 9528: 0x00008AC4, + 9529: 0x00008A95, + 9530: 0x00008ACB, + 9531: 0x00008AF8, + 9532: 0x00008AB2, + 9533: 0x00008AC9, + 9534: 0x00008AC2, + 9535: 0x00008ABF, + 9536: 0x00008AB0, + 9537: 0x00008AD6, + 9538: 0x00008ACD, + 9539: 0x00008AB6, + 9540: 0x00008AB9, + 9541: 0x00008ADB, + 9542: 0x00008C4C, + 9543: 0x00008C4E, + 9544: 0x00008C6C, + 9545: 0x00008CE0, + 9546: 0x00008CDE, + 9547: 0x00008CE6, + 9548: 0x00008CE4, + 9549: 0x00008CEC, + 9550: 0x00008CED, + 9551: 0x00008CE2, + 9552: 0x00008CE3, + 9553: 0x00008CDC, + 9554: 0x00008CEA, + 9555: 0x00008CE1, + 9556: 0x00008D6D, + 9557: 0x00008D9F, + 9558: 0x00008DA3, + 9559: 0x00008E2B, + 9560: 0x00008E10, + 9561: 0x00008E1D, + 9562: 0x00008E22, + 9563: 0x00008E0F, + 9564: 0x00008E29, + 9565: 0x00008E1F, + 9566: 0x00008E21, + 9567: 0x00008E1E, + 9568: 0x00008EBA, + 9569: 0x00008F1D, + 9570: 0x00008F1B, + 9571: 0x00008F1F, + 9572: 0x00008F29, + 9573: 0x00008F26, + 9574: 0x00008F2A, + 9575: 0x00008F1C, + 9576: 0x00008F1E, + 9577: 0x00008F25, + 9578: 0x00009069, + 9579: 0x0000906E, + 9580: 0x00009068, + 9581: 0x0000906D, + 9582: 0x00009077, + 9583: 0x00009130, + 9584: 0x0000912D, + 9585: 0x00009127, + 9586: 0x00009131, + 9587: 0x00009187, + 9588: 0x00009189, + 9589: 0x0000918B, + 9590: 0x00009183, + 9591: 0x000092C5, + 9592: 0x000092BB, + 9593: 0x000092B7, + 9594: 0x000092EA, + 9595: 0x000092AC, + 9596: 0x000092E4, + 9597: 0x000092C1, + 9598: 0x000092B3, + 9599: 0x000092BC, + 9600: 0x000092D2, + 9601: 0x000092C7, + 9602: 0x000092F0, + 9603: 0x000092B2, + 9604: 0x000095AD, + 9605: 0x000095B1, + 9606: 0x00009704, + 9607: 0x00009706, + 9608: 0x00009707, + 9609: 0x00009709, + 9610: 0x00009760, + 9611: 0x0000978D, + 9612: 0x0000978B, + 9613: 0x0000978F, + 9614: 0x00009821, + 9615: 0x0000982B, + 9616: 0x0000981C, + 9617: 0x000098B3, + 9618: 0x0000990A, + 9619: 0x00009913, + 9620: 0x00009912, + 9621: 0x00009918, + 9622: 0x000099DD, + 9623: 0x000099D0, + 9624: 0x000099DF, + 9625: 0x000099DB, + 9626: 0x000099D1, + 9627: 0x000099D5, + 9628: 0x000099D2, + 9629: 0x000099D9, + 9630: 0x00009AB7, + 9631: 0x00009AEE, + 9632: 0x00009AEF, + 9633: 0x00009B27, + 9634: 0x00009B45, + 9635: 0x00009B44, + 9636: 0x00009B77, + 9637: 0x00009B6F, + 9638: 0x00009D06, + 9639: 0x00009D09, + 9640: 0x00009D03, + 9641: 0x00009EA9, + 9642: 0x00009EBE, + 9643: 0x00009ECE, + 9644: 0x000058A8, + 9645: 0x00009F52, + 9646: 0x00005112, + 9647: 0x00005118, + 9648: 0x00005114, + 9649: 0x00005110, + 9650: 0x00005115, + 9651: 0x00005180, + 9652: 0x000051AA, + 9653: 0x000051DD, + 9654: 0x00005291, + 9655: 0x00005293, + 9656: 0x000052F3, + 9657: 0x00005659, + 9658: 0x0000566B, + 9659: 0x00005679, + 9660: 0x00005669, + 9661: 0x00005664, + 9662: 0x00005678, + 9663: 0x0000566A, + 9664: 0x00005668, + 9665: 0x00005665, + 9666: 0x00005671, + 9667: 0x0000566F, + 9668: 0x0000566C, + 9669: 0x00005662, + 9670: 0x00005676, + 9671: 0x000058C1, + 9672: 0x000058BE, + 9673: 0x000058C7, + 9674: 0x000058C5, + 9675: 0x0000596E, + 9676: 0x00005B1D, + 9677: 0x00005B34, + 9678: 0x00005B78, + 9679: 0x00005BF0, + 9680: 0x00005C0E, + 9681: 0x00005F4A, + 9682: 0x000061B2, + 9683: 0x00006191, + 9684: 0x000061A9, + 9685: 0x0000618A, + 9686: 0x000061CD, + 9687: 0x000061B6, + 9688: 0x000061BE, + 9689: 0x000061CA, + 9690: 0x000061C8, + 9691: 0x00006230, + 9692: 0x000064C5, + 9693: 0x000064C1, + 9694: 0x000064CB, + 9695: 0x000064BB, + 9696: 0x000064BC, + 9697: 0x000064DA, + 9698: 0x000064C4, + 9699: 0x000064C7, + 9700: 0x000064C2, + 9701: 0x000064CD, + 9702: 0x000064BF, + 9703: 0x000064D2, + 9704: 0x000064D4, + 9705: 0x000064BE, + 9706: 0x00006574, + 9707: 0x000066C6, + 9708: 0x000066C9, + 9709: 0x000066B9, + 9710: 0x000066C4, + 9711: 0x000066C7, + 9712: 0x000066B8, + 9713: 0x00006A3D, + 9714: 0x00006A38, + 9715: 0x00006A3A, + 9716: 0x00006A59, + 9717: 0x00006A6B, + 9718: 0x00006A58, + 9719: 0x00006A39, + 9720: 0x00006A44, + 9721: 0x00006A62, + 9722: 0x00006A61, + 9723: 0x00006A4B, + 9724: 0x00006A47, + 9725: 0x00006A35, + 9726: 0x00006A5F, + 9727: 0x00006A48, + 9728: 0x00006B59, + 9729: 0x00006B77, + 9730: 0x00006C05, + 9731: 0x00006FC2, + 9732: 0x00006FB1, + 9733: 0x00006FA1, + 9734: 0x00006FC3, + 9735: 0x00006FA4, + 9736: 0x00006FC1, + 9737: 0x00006FA7, + 9738: 0x00006FB3, + 9739: 0x00006FC0, + 9740: 0x00006FB9, + 9741: 0x00006FB6, + 9742: 0x00006FA6, + 9743: 0x00006FA0, + 9744: 0x00006FB4, + 9745: 0x000071BE, + 9746: 0x000071C9, + 9747: 0x000071D0, + 9748: 0x000071D2, + 9749: 0x000071C8, + 9750: 0x000071D5, + 9751: 0x000071B9, + 9752: 0x000071CE, + 9753: 0x000071D9, + 9754: 0x000071DC, + 9755: 0x000071C3, + 9756: 0x000071C4, + 9757: 0x00007368, + 9758: 0x0000749C, + 9759: 0x000074A3, + 9760: 0x00007498, + 9761: 0x0000749F, + 9762: 0x0000749E, + 9763: 0x000074E2, + 9764: 0x0000750C, + 9765: 0x0000750D, + 9766: 0x00007634, + 9767: 0x00007638, + 9768: 0x0000763A, + 9769: 0x000076E7, + 9770: 0x000076E5, + 9771: 0x000077A0, + 9772: 0x0000779E, + 9773: 0x0000779F, + 9774: 0x000077A5, + 9775: 0x000078E8, + 9776: 0x000078DA, + 9777: 0x000078EC, + 9778: 0x000078E7, + 9779: 0x000079A6, + 9780: 0x00007A4D, + 9781: 0x00007A4E, + 9782: 0x00007A46, + 9783: 0x00007A4C, + 9784: 0x00007A4B, + 9785: 0x00007ABA, + 9786: 0x00007BD9, + 9787: 0x00007C11, + 9788: 0x00007BC9, + 9789: 0x00007BE4, + 9790: 0x00007BDB, + 9791: 0x00007BE1, + 9792: 0x00007BE9, + 9793: 0x00007BE6, + 9794: 0x00007CD5, + 9795: 0x00007CD6, + 9796: 0x00007E0A, + 9797: 0x00007E11, + 9798: 0x00007E08, + 9799: 0x00007E1B, + 9800: 0x00007E23, + 9801: 0x00007E1E, + 9802: 0x00007E1D, + 9803: 0x00007E09, + 9804: 0x00007E10, + 9805: 0x00007F79, + 9806: 0x00007FB2, + 9807: 0x00007FF0, + 9808: 0x00007FF1, + 9809: 0x00007FEE, + 9810: 0x00008028, + 9811: 0x000081B3, + 9812: 0x000081A9, + 9813: 0x000081A8, + 9814: 0x000081FB, + 9815: 0x00008208, + 9816: 0x00008258, + 9817: 0x00008259, + 9818: 0x0000854A, + 9819: 0x00008559, + 9820: 0x00008548, + 9821: 0x00008568, + 9822: 0x00008569, + 9823: 0x00008543, + 9824: 0x00008549, + 9825: 0x0000856D, + 9826: 0x0000856A, + 9827: 0x0000855E, + 9828: 0x00008783, + 9829: 0x0000879F, + 9830: 0x0000879E, + 9831: 0x000087A2, + 9832: 0x0000878D, + 9833: 0x00008861, + 9834: 0x0000892A, + 9835: 0x00008932, + 9836: 0x00008925, + 9837: 0x0000892B, + 9838: 0x00008921, + 9839: 0x000089AA, + 9840: 0x000089A6, + 9841: 0x00008AE6, + 9842: 0x00008AFA, + 9843: 0x00008AEB, + 9844: 0x00008AF1, + 9845: 0x00008B00, + 9846: 0x00008ADC, + 9847: 0x00008AE7, + 9848: 0x00008AEE, + 9849: 0x00008AFE, + 9850: 0x00008B01, + 9851: 0x00008B02, + 9852: 0x00008AF7, + 9853: 0x00008AED, + 9854: 0x00008AF3, + 9855: 0x00008AF6, + 9856: 0x00008AFC, + 9857: 0x00008C6B, + 9858: 0x00008C6D, + 9859: 0x00008C93, + 9860: 0x00008CF4, + 9861: 0x00008E44, + 9862: 0x00008E31, + 9863: 0x00008E34, + 9864: 0x00008E42, + 9865: 0x00008E39, + 9866: 0x00008E35, + 9867: 0x00008F3B, + 9868: 0x00008F2F, + 9869: 0x00008F38, + 9870: 0x00008F33, + 9871: 0x00008FA8, + 9872: 0x00008FA6, + 9873: 0x00009075, + 9874: 0x00009074, + 9875: 0x00009078, + 9876: 0x00009072, + 9877: 0x0000907C, + 9878: 0x0000907A, + 9879: 0x00009134, + 9880: 0x00009192, + 9881: 0x00009320, + 9882: 0x00009336, + 9883: 0x000092F8, + 9884: 0x00009333, + 9885: 0x0000932F, + 9886: 0x00009322, + 9887: 0x000092FC, + 9888: 0x0000932B, + 9889: 0x00009304, + 9890: 0x0000931A, + 9891: 0x00009310, + 9892: 0x00009326, + 9893: 0x00009321, + 9894: 0x00009315, + 9895: 0x0000932E, + 9896: 0x00009319, + 9897: 0x000095BB, + 9898: 0x000096A7, + 9899: 0x000096A8, + 9900: 0x000096AA, + 9901: 0x000096D5, + 9902: 0x0000970E, + 9903: 0x00009711, + 9904: 0x00009716, + 9905: 0x0000970D, + 9906: 0x00009713, + 9907: 0x0000970F, + 9908: 0x0000975B, + 9909: 0x0000975C, + 9910: 0x00009766, + 9911: 0x00009798, + 9912: 0x00009830, + 9913: 0x00009838, + 9914: 0x0000983B, + 9915: 0x00009837, + 9916: 0x0000982D, + 9917: 0x00009839, + 9918: 0x00009824, + 9919: 0x00009910, + 9920: 0x00009928, + 9921: 0x0000991E, + 9922: 0x0000991B, + 9923: 0x00009921, + 9924: 0x0000991A, + 9925: 0x000099ED, + 9926: 0x000099E2, + 9927: 0x000099F1, + 9928: 0x00009AB8, + 9929: 0x00009ABC, + 9930: 0x00009AFB, + 9931: 0x00009AED, + 9932: 0x00009B28, + 9933: 0x00009B91, + 9934: 0x00009D15, + 9935: 0x00009D23, + 9936: 0x00009D26, + 9937: 0x00009D28, + 9938: 0x00009D12, + 9939: 0x00009D1B, + 9940: 0x00009ED8, + 9941: 0x00009ED4, + 9942: 0x00009F8D, + 9943: 0x00009F9C, + 9944: 0x0000512A, + 9945: 0x0000511F, + 9946: 0x00005121, + 9947: 0x00005132, + 9948: 0x000052F5, + 9949: 0x0000568E, + 9950: 0x00005680, + 9951: 0x00005690, + 9952: 0x00005685, + 9953: 0x00005687, + 9954: 0x0000568F, + 9955: 0x000058D5, + 9956: 0x000058D3, + 9957: 0x000058D1, + 9958: 0x000058CE, + 9959: 0x00005B30, + 9960: 0x00005B2A, + 9961: 0x00005B24, + 9962: 0x00005B7A, + 9963: 0x00005C37, + 9964: 0x00005C68, + 9965: 0x00005DBC, + 9966: 0x00005DBA, + 9967: 0x00005DBD, + 9968: 0x00005DB8, + 9969: 0x00005E6B, + 9970: 0x00005F4C, + 9971: 0x00005FBD, + 9972: 0x000061C9, + 9973: 0x000061C2, + 9974: 0x000061C7, + 9975: 0x000061E6, + 9976: 0x000061CB, + 9977: 0x00006232, + 9978: 0x00006234, + 9979: 0x000064CE, + 9980: 0x000064CA, + 9981: 0x000064D8, + 9982: 0x000064E0, + 9983: 0x000064F0, + 9984: 0x000064E6, + 9985: 0x000064EC, + 9986: 0x000064F1, + 9987: 0x000064E2, + 9988: 0x000064ED, + 9989: 0x00006582, + 9990: 0x00006583, + 9991: 0x000066D9, + 9992: 0x000066D6, + 9993: 0x00006A80, + 9994: 0x00006A94, + 9995: 0x00006A84, + 9996: 0x00006AA2, + 9997: 0x00006A9C, + 9998: 0x00006ADB, + 9999: 0x00006AA3, + 10000: 0x00006A7E, + 10001: 0x00006A97, + 10002: 0x00006A90, + 10003: 0x00006AA0, + 10004: 0x00006B5C, + 10005: 0x00006BAE, + 10006: 0x00006BDA, + 10007: 0x00006C08, + 10008: 0x00006FD8, + 10009: 0x00006FF1, + 10010: 0x00006FDF, + 10011: 0x00006FE0, + 10012: 0x00006FDB, + 10013: 0x00006FE4, + 10014: 0x00006FEB, + 10015: 0x00006FEF, + 10016: 0x00006F80, + 10017: 0x00006FEC, + 10018: 0x00006FE1, + 10019: 0x00006FE9, + 10020: 0x00006FD5, + 10021: 0x00006FEE, + 10022: 0x00006FF0, + 10023: 0x000071E7, + 10024: 0x000071DF, + 10025: 0x000071EE, + 10026: 0x000071E6, + 10027: 0x000071E5, + 10028: 0x000071ED, + 10029: 0x000071EC, + 10030: 0x000071F4, + 10031: 0x000071E0, + 10032: 0x00007235, + 10033: 0x00007246, + 10034: 0x00007370, + 10035: 0x00007372, + 10036: 0x000074A9, + 10037: 0x000074B0, + 10038: 0x000074A6, + 10039: 0x000074A8, + 10040: 0x00007646, + 10041: 0x00007642, + 10042: 0x0000764C, + 10043: 0x000076EA, + 10044: 0x000077B3, + 10045: 0x000077AA, + 10046: 0x000077B0, + 10047: 0x000077AC, + 10048: 0x000077A7, + 10049: 0x000077AD, + 10050: 0x000077EF, + 10051: 0x000078F7, + 10052: 0x000078FA, + 10053: 0x000078F4, + 10054: 0x000078EF, + 10055: 0x00007901, + 10056: 0x000079A7, + 10057: 0x000079AA, + 10058: 0x00007A57, + 10059: 0x00007ABF, + 10060: 0x00007C07, + 10061: 0x00007C0D, + 10062: 0x00007BFE, + 10063: 0x00007BF7, + 10064: 0x00007C0C, + 10065: 0x00007BE0, + 10066: 0x00007CE0, + 10067: 0x00007CDC, + 10068: 0x00007CDE, + 10069: 0x00007CE2, + 10070: 0x00007CDF, + 10071: 0x00007CD9, + 10072: 0x00007CDD, + 10073: 0x00007E2E, + 10074: 0x00007E3E, + 10075: 0x00007E46, + 10076: 0x00007E37, + 10077: 0x00007E32, + 10078: 0x00007E43, + 10079: 0x00007E2B, + 10080: 0x00007E3D, + 10081: 0x00007E31, + 10082: 0x00007E45, + 10083: 0x00007E41, + 10084: 0x00007E34, + 10085: 0x00007E39, + 10086: 0x00007E48, + 10087: 0x00007E35, + 10088: 0x00007E3F, + 10089: 0x00007E2F, + 10090: 0x00007F44, + 10091: 0x00007FF3, + 10092: 0x00007FFC, + 10093: 0x00008071, + 10094: 0x00008072, + 10095: 0x00008070, + 10096: 0x0000806F, + 10097: 0x00008073, + 10098: 0x000081C6, + 10099: 0x000081C3, + 10100: 0x000081BA, + 10101: 0x000081C2, + 10102: 0x000081C0, + 10103: 0x000081BF, + 10104: 0x000081BD, + 10105: 0x000081C9, + 10106: 0x000081BE, + 10107: 0x000081E8, + 10108: 0x00008209, + 10109: 0x00008271, + 10110: 0x000085AA, + 10111: 0x00008584, + 10112: 0x0000857E, + 10113: 0x0000859C, + 10114: 0x00008591, + 10115: 0x00008594, + 10116: 0x000085AF, + 10117: 0x0000859B, + 10118: 0x00008587, + 10119: 0x000085A8, + 10120: 0x0000858A, + 10121: 0x00008667, + 10122: 0x000087C0, + 10123: 0x000087D1, + 10124: 0x000087B3, + 10125: 0x000087D2, + 10126: 0x000087C6, + 10127: 0x000087AB, + 10128: 0x000087BB, + 10129: 0x000087BA, + 10130: 0x000087C8, + 10131: 0x000087CB, + 10132: 0x0000893B, + 10133: 0x00008936, + 10134: 0x00008944, + 10135: 0x00008938, + 10136: 0x0000893D, + 10137: 0x000089AC, + 10138: 0x00008B0E, + 10139: 0x00008B17, + 10140: 0x00008B19, + 10141: 0x00008B1B, + 10142: 0x00008B0A, + 10143: 0x00008B20, + 10144: 0x00008B1D, + 10145: 0x00008B04, + 10146: 0x00008B10, + 10147: 0x00008C41, + 10148: 0x00008C3F, + 10149: 0x00008C73, + 10150: 0x00008CFA, + 10151: 0x00008CFD, + 10152: 0x00008CFC, + 10153: 0x00008CF8, + 10154: 0x00008CFB, + 10155: 0x00008DA8, + 10156: 0x00008E49, + 10157: 0x00008E4B, + 10158: 0x00008E48, + 10159: 0x00008E4A, + 10160: 0x00008F44, + 10161: 0x00008F3E, + 10162: 0x00008F42, + 10163: 0x00008F45, + 10164: 0x00008F3F, + 10165: 0x0000907F, + 10166: 0x0000907D, + 10167: 0x00009084, + 10168: 0x00009081, + 10169: 0x00009082, + 10170: 0x00009080, + 10171: 0x00009139, + 10172: 0x000091A3, + 10173: 0x0000919E, + 10174: 0x0000919C, + 10175: 0x0000934D, + 10176: 0x00009382, + 10177: 0x00009328, + 10178: 0x00009375, + 10179: 0x0000934A, + 10180: 0x00009365, + 10181: 0x0000934B, + 10182: 0x00009318, + 10183: 0x0000937E, + 10184: 0x0000936C, + 10185: 0x0000935B, + 10186: 0x00009370, + 10187: 0x0000935A, + 10188: 0x00009354, + 10189: 0x000095CA, + 10190: 0x000095CB, + 10191: 0x000095CC, + 10192: 0x000095C8, + 10193: 0x000095C6, + 10194: 0x000096B1, + 10195: 0x000096B8, + 10196: 0x000096D6, + 10197: 0x0000971C, + 10198: 0x0000971E, + 10199: 0x000097A0, + 10200: 0x000097D3, + 10201: 0x00009846, + 10202: 0x000098B6, + 10203: 0x00009935, + 10204: 0x00009A01, + 10205: 0x000099FF, + 10206: 0x00009BAE, + 10207: 0x00009BAB, + 10208: 0x00009BAA, + 10209: 0x00009BAD, + 10210: 0x00009D3B, + 10211: 0x00009D3F, + 10212: 0x00009E8B, + 10213: 0x00009ECF, + 10214: 0x00009EDE, + 10215: 0x00009EDC, + 10216: 0x00009EDD, + 10217: 0x00009EDB, + 10218: 0x00009F3E, + 10219: 0x00009F4B, + 10220: 0x000053E2, + 10221: 0x00005695, + 10222: 0x000056AE, + 10223: 0x000058D9, + 10224: 0x000058D8, + 10225: 0x00005B38, + 10226: 0x00005F5D, + 10227: 0x000061E3, + 10228: 0x00006233, + 10229: 0x000064F4, + 10230: 0x000064F2, + 10231: 0x000064FE, + 10232: 0x00006506, + 10233: 0x000064FA, + 10234: 0x000064FB, + 10235: 0x000064F7, + 10236: 0x000065B7, + 10237: 0x000066DC, + 10238: 0x00006726, + 10239: 0x00006AB3, + 10240: 0x00006AAC, + 10241: 0x00006AC3, + 10242: 0x00006ABB, + 10243: 0x00006AB8, + 10244: 0x00006AC2, + 10245: 0x00006AAE, + 10246: 0x00006AAF, + 10247: 0x00006B5F, + 10248: 0x00006B78, + 10249: 0x00006BAF, + 10250: 0x00007009, + 10251: 0x0000700B, + 10252: 0x00006FFE, + 10253: 0x00007006, + 10254: 0x00006FFA, + 10255: 0x00007011, + 10256: 0x0000700F, + 10257: 0x000071FB, + 10258: 0x000071FC, + 10259: 0x000071FE, + 10260: 0x000071F8, + 10261: 0x00007377, + 10262: 0x00007375, + 10263: 0x000074A7, + 10264: 0x000074BF, + 10265: 0x00007515, + 10266: 0x00007656, + 10267: 0x00007658, + 10268: 0x00007652, + 10269: 0x000077BD, + 10270: 0x000077BF, + 10271: 0x000077BB, + 10272: 0x000077BC, + 10273: 0x0000790E, + 10274: 0x000079AE, + 10275: 0x00007A61, + 10276: 0x00007A62, + 10277: 0x00007A60, + 10278: 0x00007AC4, + 10279: 0x00007AC5, + 10280: 0x00007C2B, + 10281: 0x00007C27, + 10282: 0x00007C2A, + 10283: 0x00007C1E, + 10284: 0x00007C23, + 10285: 0x00007C21, + 10286: 0x00007CE7, + 10287: 0x00007E54, + 10288: 0x00007E55, + 10289: 0x00007E5E, + 10290: 0x00007E5A, + 10291: 0x00007E61, + 10292: 0x00007E52, + 10293: 0x00007E59, + 10294: 0x00007F48, + 10295: 0x00007FF9, + 10296: 0x00007FFB, + 10297: 0x00008077, + 10298: 0x00008076, + 10299: 0x000081CD, + 10300: 0x000081CF, + 10301: 0x0000820A, + 10302: 0x000085CF, + 10303: 0x000085A9, + 10304: 0x000085CD, + 10305: 0x000085D0, + 10306: 0x000085C9, + 10307: 0x000085B0, + 10308: 0x000085BA, + 10309: 0x000085B9, + 10310: 0x000085A6, + 10311: 0x000087EF, + 10312: 0x000087EC, + 10313: 0x000087F2, + 10314: 0x000087E0, + 10315: 0x00008986, + 10316: 0x000089B2, + 10317: 0x000089F4, + 10318: 0x00008B28, + 10319: 0x00008B39, + 10320: 0x00008B2C, + 10321: 0x00008B2B, + 10322: 0x00008C50, + 10323: 0x00008D05, + 10324: 0x00008E59, + 10325: 0x00008E63, + 10326: 0x00008E66, + 10327: 0x00008E64, + 10328: 0x00008E5F, + 10329: 0x00008E55, + 10330: 0x00008EC0, + 10331: 0x00008F49, + 10332: 0x00008F4D, + 10333: 0x00009087, + 10334: 0x00009083, + 10335: 0x00009088, + 10336: 0x000091AB, + 10337: 0x000091AC, + 10338: 0x000091D0, + 10339: 0x00009394, + 10340: 0x0000938A, + 10341: 0x00009396, + 10342: 0x000093A2, + 10343: 0x000093B3, + 10344: 0x000093AE, + 10345: 0x000093AC, + 10346: 0x000093B0, + 10347: 0x00009398, + 10348: 0x0000939A, + 10349: 0x00009397, + 10350: 0x000095D4, + 10351: 0x000095D6, + 10352: 0x000095D0, + 10353: 0x000095D5, + 10354: 0x000096E2, + 10355: 0x000096DC, + 10356: 0x000096D9, + 10357: 0x000096DB, + 10358: 0x000096DE, + 10359: 0x00009724, + 10360: 0x000097A3, + 10361: 0x000097A6, + 10362: 0x000097AD, + 10363: 0x000097F9, + 10364: 0x0000984D, + 10365: 0x0000984F, + 10366: 0x0000984C, + 10367: 0x0000984E, + 10368: 0x00009853, + 10369: 0x000098BA, + 10370: 0x0000993E, + 10371: 0x0000993F, + 10372: 0x0000993D, + 10373: 0x0000992E, + 10374: 0x000099A5, + 10375: 0x00009A0E, + 10376: 0x00009AC1, + 10377: 0x00009B03, + 10378: 0x00009B06, + 10379: 0x00009B4F, + 10380: 0x00009B4E, + 10381: 0x00009B4D, + 10382: 0x00009BCA, + 10383: 0x00009BC9, + 10384: 0x00009BFD, + 10385: 0x00009BC8, + 10386: 0x00009BC0, + 10387: 0x00009D51, + 10388: 0x00009D5D, + 10389: 0x00009D60, + 10390: 0x00009EE0, + 10391: 0x00009F15, + 10392: 0x00009F2C, + 10393: 0x00005133, + 10394: 0x000056A5, + 10395: 0x000058DE, + 10396: 0x000058DF, + 10397: 0x000058E2, + 10398: 0x00005BF5, + 10399: 0x00009F90, + 10400: 0x00005EEC, + 10401: 0x000061F2, + 10402: 0x000061F7, + 10403: 0x000061F6, + 10404: 0x000061F5, + 10405: 0x00006500, + 10406: 0x0000650F, + 10407: 0x000066E0, + 10408: 0x000066DD, + 10409: 0x00006AE5, + 10410: 0x00006ADD, + 10411: 0x00006ADA, + 10412: 0x00006AD3, + 10413: 0x0000701B, + 10414: 0x0000701F, + 10415: 0x00007028, + 10416: 0x0000701A, + 10417: 0x0000701D, + 10418: 0x00007015, + 10419: 0x00007018, + 10420: 0x00007206, + 10421: 0x0000720D, + 10422: 0x00007258, + 10423: 0x000072A2, + 10424: 0x00007378, + 10425: 0x0000737A, + 10426: 0x000074BD, + 10427: 0x000074CA, + 10428: 0x000074E3, + 10429: 0x00007587, + 10430: 0x00007586, + 10431: 0x0000765F, + 10432: 0x00007661, + 10433: 0x000077C7, + 10434: 0x00007919, + 10435: 0x000079B1, + 10436: 0x00007A6B, + 10437: 0x00007A69, + 10438: 0x00007C3E, + 10439: 0x00007C3F, + 10440: 0x00007C38, + 10441: 0x00007C3D, + 10442: 0x00007C37, + 10443: 0x00007C40, + 10444: 0x00007E6B, + 10445: 0x00007E6D, + 10446: 0x00007E79, + 10447: 0x00007E69, + 10448: 0x00007E6A, + 10449: 0x00007F85, + 10450: 0x00007E73, + 10451: 0x00007FB6, + 10452: 0x00007FB9, + 10453: 0x00007FB8, + 10454: 0x000081D8, + 10455: 0x000085E9, + 10456: 0x000085DD, + 10457: 0x000085EA, + 10458: 0x000085D5, + 10459: 0x000085E4, + 10460: 0x000085E5, + 10461: 0x000085F7, + 10462: 0x000087FB, + 10463: 0x00008805, + 10464: 0x0000880D, + 10465: 0x000087F9, + 10466: 0x000087FE, + 10467: 0x00008960, + 10468: 0x0000895F, + 10469: 0x00008956, + 10470: 0x0000895E, + 10471: 0x00008B41, + 10472: 0x00008B5C, + 10473: 0x00008B58, + 10474: 0x00008B49, + 10475: 0x00008B5A, + 10476: 0x00008B4E, + 10477: 0x00008B4F, + 10478: 0x00008B46, + 10479: 0x00008B59, + 10480: 0x00008D08, + 10481: 0x00008D0A, + 10482: 0x00008E7C, + 10483: 0x00008E72, + 10484: 0x00008E87, + 10485: 0x00008E76, + 10486: 0x00008E6C, + 10487: 0x00008E7A, + 10488: 0x00008E74, + 10489: 0x00008F54, + 10490: 0x00008F4E, + 10491: 0x00008FAD, + 10492: 0x0000908A, + 10493: 0x0000908B, + 10494: 0x000091B1, + 10495: 0x000091AE, + 10496: 0x000093E1, + 10497: 0x000093D1, + 10498: 0x000093DF, + 10499: 0x000093C3, + 10500: 0x000093C8, + 10501: 0x000093DC, + 10502: 0x000093DD, + 10503: 0x000093D6, + 10504: 0x000093E2, + 10505: 0x000093CD, + 10506: 0x000093D8, + 10507: 0x000093E4, + 10508: 0x000093D7, + 10509: 0x000093E8, + 10510: 0x000095DC, + 10511: 0x000096B4, + 10512: 0x000096E3, + 10513: 0x0000972A, + 10514: 0x00009727, + 10515: 0x00009761, + 10516: 0x000097DC, + 10517: 0x000097FB, + 10518: 0x0000985E, + 10519: 0x00009858, + 10520: 0x0000985B, + 10521: 0x000098BC, + 10522: 0x00009945, + 10523: 0x00009949, + 10524: 0x00009A16, + 10525: 0x00009A19, + 10526: 0x00009B0D, + 10527: 0x00009BE8, + 10528: 0x00009BE7, + 10529: 0x00009BD6, + 10530: 0x00009BDB, + 10531: 0x00009D89, + 10532: 0x00009D61, + 10533: 0x00009D72, + 10534: 0x00009D6A, + 10535: 0x00009D6C, + 10536: 0x00009E92, + 10537: 0x00009E97, + 10538: 0x00009E93, + 10539: 0x00009EB4, + 10540: 0x000052F8, + 10541: 0x000056A8, + 10542: 0x000056B7, + 10543: 0x000056B6, + 10544: 0x000056B4, + 10545: 0x000056BC, + 10546: 0x000058E4, + 10547: 0x00005B40, + 10548: 0x00005B43, + 10549: 0x00005B7D, + 10550: 0x00005BF6, + 10551: 0x00005DC9, + 10552: 0x000061F8, + 10553: 0x000061FA, + 10554: 0x00006518, + 10555: 0x00006514, + 10556: 0x00006519, + 10557: 0x000066E6, + 10558: 0x00006727, + 10559: 0x00006AEC, + 10560: 0x0000703E, + 10561: 0x00007030, + 10562: 0x00007032, + 10563: 0x00007210, + 10564: 0x0000737B, + 10565: 0x000074CF, + 10566: 0x00007662, + 10567: 0x00007665, + 10568: 0x00007926, + 10569: 0x0000792A, + 10570: 0x0000792C, + 10571: 0x0000792B, + 10572: 0x00007AC7, + 10573: 0x00007AF6, + 10574: 0x00007C4C, + 10575: 0x00007C43, + 10576: 0x00007C4D, + 10577: 0x00007CEF, + 10578: 0x00007CF0, + 10579: 0x00008FAE, + 10580: 0x00007E7D, + 10581: 0x00007E7C, + 10582: 0x00007E82, + 10583: 0x00007F4C, + 10584: 0x00008000, + 10585: 0x000081DA, + 10586: 0x00008266, + 10587: 0x000085FB, + 10588: 0x000085F9, + 10589: 0x00008611, + 10590: 0x000085FA, + 10591: 0x00008606, + 10592: 0x0000860B, + 10593: 0x00008607, + 10594: 0x0000860A, + 10595: 0x00008814, + 10596: 0x00008815, + 10597: 0x00008964, + 10598: 0x000089BA, + 10599: 0x000089F8, + 10600: 0x00008B70, + 10601: 0x00008B6C, + 10602: 0x00008B66, + 10603: 0x00008B6F, + 10604: 0x00008B5F, + 10605: 0x00008B6B, + 10606: 0x00008D0F, + 10607: 0x00008D0D, + 10608: 0x00008E89, + 10609: 0x00008E81, + 10610: 0x00008E85, + 10611: 0x00008E82, + 10612: 0x000091B4, + 10613: 0x000091CB, + 10614: 0x00009418, + 10615: 0x00009403, + 10616: 0x000093FD, + 10617: 0x000095E1, + 10618: 0x00009730, + 10619: 0x000098C4, + 10620: 0x00009952, + 10621: 0x00009951, + 10622: 0x000099A8, + 10623: 0x00009A2B, + 10624: 0x00009A30, + 10625: 0x00009A37, + 10626: 0x00009A35, + 10627: 0x00009C13, + 10628: 0x00009C0D, + 10629: 0x00009E79, + 10630: 0x00009EB5, + 10631: 0x00009EE8, + 10632: 0x00009F2F, + 10633: 0x00009F5F, + 10634: 0x00009F63, + 10635: 0x00009F61, + 10636: 0x00005137, + 10637: 0x00005138, + 10638: 0x000056C1, + 10639: 0x000056C0, + 10640: 0x000056C2, + 10641: 0x00005914, + 10642: 0x00005C6C, + 10643: 0x00005DCD, + 10644: 0x000061FC, + 10645: 0x000061FE, + 10646: 0x0000651D, + 10647: 0x0000651C, + 10648: 0x00006595, + 10649: 0x000066E9, + 10650: 0x00006AFB, + 10651: 0x00006B04, + 10652: 0x00006AFA, + 10653: 0x00006BB2, + 10654: 0x0000704C, + 10655: 0x0000721B, + 10656: 0x000072A7, + 10657: 0x000074D6, + 10658: 0x000074D4, + 10659: 0x00007669, + 10660: 0x000077D3, + 10661: 0x00007C50, + 10662: 0x00007E8F, + 10663: 0x00007E8C, + 10664: 0x00007FBC, + 10665: 0x00008617, + 10666: 0x0000862D, + 10667: 0x0000861A, + 10668: 0x00008823, + 10669: 0x00008822, + 10670: 0x00008821, + 10671: 0x0000881F, + 10672: 0x0000896A, + 10673: 0x0000896C, + 10674: 0x000089BD, + 10675: 0x00008B74, + 10676: 0x00008B77, + 10677: 0x00008B7D, + 10678: 0x00008D13, + 10679: 0x00008E8A, + 10680: 0x00008E8D, + 10681: 0x00008E8B, + 10682: 0x00008F5F, + 10683: 0x00008FAF, + 10684: 0x000091BA, + 10685: 0x0000942E, + 10686: 0x00009433, + 10687: 0x00009435, + 10688: 0x0000943A, + 10689: 0x00009438, + 10690: 0x00009432, + 10691: 0x0000942B, + 10692: 0x000095E2, + 10693: 0x00009738, + 10694: 0x00009739, + 10695: 0x00009732, + 10696: 0x000097FF, + 10697: 0x00009867, + 10698: 0x00009865, + 10699: 0x00009957, + 10700: 0x00009A45, + 10701: 0x00009A43, + 10702: 0x00009A40, + 10703: 0x00009A3E, + 10704: 0x00009ACF, + 10705: 0x00009B54, + 10706: 0x00009B51, + 10707: 0x00009C2D, + 10708: 0x00009C25, + 10709: 0x00009DAF, + 10710: 0x00009DB4, + 10711: 0x00009DC2, + 10712: 0x00009DB8, + 10713: 0x00009E9D, + 10714: 0x00009EEF, + 10715: 0x00009F19, + 10716: 0x00009F5C, + 10717: 0x00009F66, + 10718: 0x00009F67, + 10719: 0x0000513C, + 10720: 0x0000513B, + 10721: 0x000056C8, + 10722: 0x000056CA, + 10723: 0x000056C9, + 10724: 0x00005B7F, + 10725: 0x00005DD4, + 10726: 0x00005DD2, + 10727: 0x00005F4E, + 10728: 0x000061FF, + 10729: 0x00006524, + 10730: 0x00006B0A, + 10731: 0x00006B61, + 10732: 0x00007051, + 10733: 0x00007058, + 10734: 0x00007380, + 10735: 0x000074E4, + 10736: 0x0000758A, + 10737: 0x0000766E, + 10738: 0x0000766C, + 10739: 0x000079B3, + 10740: 0x00007C60, + 10741: 0x00007C5F, + 10742: 0x0000807E, + 10743: 0x0000807D, + 10744: 0x000081DF, + 10745: 0x00008972, + 10746: 0x0000896F, + 10747: 0x000089FC, + 10748: 0x00008B80, + 10749: 0x00008D16, + 10750: 0x00008D17, + 10751: 0x00008E91, + 10752: 0x00008E93, + 10753: 0x00008F61, + 10754: 0x00009148, + 10755: 0x00009444, + 10756: 0x00009451, + 10757: 0x00009452, + 10758: 0x0000973D, + 10759: 0x0000973E, + 10760: 0x000097C3, + 10761: 0x000097C1, + 10762: 0x0000986B, + 10763: 0x00009955, + 10764: 0x00009A55, + 10765: 0x00009A4D, + 10766: 0x00009AD2, + 10767: 0x00009B1A, + 10768: 0x00009C49, + 10769: 0x00009C31, + 10770: 0x00009C3E, + 10771: 0x00009C3B, + 10772: 0x00009DD3, + 10773: 0x00009DD7, + 10774: 0x00009F34, + 10775: 0x00009F6C, + 10776: 0x00009F6A, + 10777: 0x00009F94, + 10778: 0x000056CC, + 10779: 0x00005DD6, + 10780: 0x00006200, + 10781: 0x00006523, + 10782: 0x0000652B, + 10783: 0x0000652A, + 10784: 0x000066EC, + 10785: 0x00006B10, + 10786: 0x000074DA, + 10787: 0x00007ACA, + 10788: 0x00007C64, + 10789: 0x00007C63, + 10790: 0x00007C65, + 10791: 0x00007E93, + 10792: 0x00007E96, + 10793: 0x00007E94, + 10794: 0x000081E2, + 10795: 0x00008638, + 10796: 0x0000863F, + 10797: 0x00008831, + 10798: 0x00008B8A, + 10799: 0x00009090, + 10800: 0x0000908F, + 10801: 0x00009463, + 10802: 0x00009460, + 10803: 0x00009464, + 10804: 0x00009768, + 10805: 0x0000986F, + 10806: 0x0000995C, + 10807: 0x00009A5A, + 10808: 0x00009A5B, + 10809: 0x00009A57, + 10810: 0x00009AD3, + 10811: 0x00009AD4, + 10812: 0x00009AD1, + 10813: 0x00009C54, + 10814: 0x00009C57, + 10815: 0x00009C56, + 10816: 0x00009DE5, + 10817: 0x00009E9F, + 10818: 0x00009EF4, + 10819: 0x000056D1, + 10820: 0x000058E9, + 10821: 0x0000652C, + 10822: 0x0000705E, + 10823: 0x00007671, + 10824: 0x00007672, + 10825: 0x000077D7, + 10826: 0x00007F50, + 10827: 0x00007F88, + 10828: 0x00008836, + 10829: 0x00008839, + 10830: 0x00008862, + 10831: 0x00008B93, + 10832: 0x00008B92, + 10833: 0x00008B96, + 10834: 0x00008277, + 10835: 0x00008D1B, + 10836: 0x000091C0, + 10837: 0x0000946A, + 10838: 0x00009742, + 10839: 0x00009748, + 10840: 0x00009744, + 10841: 0x000097C6, + 10842: 0x00009870, + 10843: 0x00009A5F, + 10844: 0x00009B22, + 10845: 0x00009B58, + 10846: 0x00009C5F, + 10847: 0x00009DF9, + 10848: 0x00009DFA, + 10849: 0x00009E7C, + 10850: 0x00009E7D, + 10851: 0x00009F07, + 10852: 0x00009F77, + 10853: 0x00009F72, + 10854: 0x00005EF3, + 10855: 0x00006B16, + 10856: 0x00007063, + 10857: 0x00007C6C, + 10858: 0x00007C6E, + 10859: 0x0000883B, + 10860: 0x000089C0, + 10861: 0x00008EA1, + 10862: 0x000091C1, + 10863: 0x00009472, + 10864: 0x00009470, + 10865: 0x00009871, + 10866: 0x0000995E, + 10867: 0x00009AD6, + 10868: 0x00009B23, + 10869: 0x00009ECC, + 10870: 0x00007064, + 10871: 0x000077DA, + 10872: 0x00008B9A, + 10873: 0x00009477, + 10874: 0x000097C9, + 10875: 0x00009A62, + 10876: 0x00009A65, + 10877: 0x00007E9C, + 10878: 0x00008B9C, + 10879: 0x00008EAA, + 10880: 0x000091C5, + 10881: 0x0000947D, + 10882: 0x0000947E, + 10883: 0x0000947C, + 10884: 0x00009C77, + 10885: 0x00009C78, + 10886: 0x00009EF7, + 10887: 0x00008C54, + 10888: 0x0000947F, + 10889: 0x00009E1A, + 10890: 0x00007228, + 10891: 0x00009A6A, + 10892: 0x00009B31, + 10893: 0x00009E1B, + 10894: 0x00009E1E, + 10895: 0x00007C72, + 10896: 0x00002460, + 10897: 0x00002461, + 10898: 0x00002462, + 10899: 0x00002463, + 10900: 0x00002464, + 10901: 0x00002465, + 10902: 0x00002466, + 10903: 0x00002467, + 10904: 0x00002468, + 10905: 0x00002469, + 10906: 0x00002474, + 10907: 0x00002475, + 10908: 0x00002476, + 10909: 0x00002477, + 10910: 0x00002478, + 10911: 0x00002479, + 10912: 0x0000247A, + 10913: 0x0000247B, + 10914: 0x0000247C, + 10915: 0x0000247D, + 10916: 0x00002170, + 10917: 0x00002171, + 10918: 0x00002172, + 10919: 0x00002173, + 10920: 0x00002174, + 10921: 0x00002175, + 10922: 0x00002176, + 10923: 0x00002177, + 10924: 0x00002178, + 10925: 0x00002179, + 10926: 0x00004E36, + 10927: 0x00004E3F, + 10928: 0x00004E85, + 10929: 0x00004EA0, + 10930: 0x00005182, + 10931: 0x00005196, + 10932: 0x000051AB, + 10933: 0x000052F9, + 10934: 0x00005338, + 10935: 0x00005369, + 10936: 0x000053B6, + 10937: 0x0000590A, + 10938: 0x00005B80, + 10939: 0x00005DDB, + 10940: 0x00002F33, + 10941: 0x00005E7F, + 10942: 0x00005EF4, + 10943: 0x00005F50, + 10944: 0x00005F61, + 10945: 0x00006534, + 10946: 0x000065E0, + 10947: 0x00007592, + 10948: 0x00007676, + 10949: 0x00008FB5, + 10950: 0x000096B6, + 10951: 0x000000A8, + 10952: 0x000002C6, + 10953: 0x000030FD, + 10954: 0x000030FE, + 10955: 0x0000309D, + 10956: 0x0000309E, + 10957: 0x00003003, + 10958: 0x00004EDD, + 10959: 0x00003005, + 10960: 0x00003006, + 10961: 0x00003007, + 10962: 0x000030FC, + 10963: 0x0000FF3B, + 10964: 0x0000FF3D, + 10965: 0x0000273D, + 10966: 0x00003041, + 10967: 0x00003042, + 10968: 0x00003043, + 10969: 0x00003044, + 10970: 0x00003045, + 10971: 0x00003046, + 10972: 0x00003047, + 10973: 0x00003048, + 10974: 0x00003049, + 10975: 0x0000304A, + 10976: 0x0000304B, + 10977: 0x0000304C, + 10978: 0x0000304D, + 10979: 0x0000304E, + 10980: 0x0000304F, + 10981: 0x00003050, + 10982: 0x00003051, + 10983: 0x00003052, + 10984: 0x00003053, + 10985: 0x00003054, + 10986: 0x00003055, + 10987: 0x00003056, + 10988: 0x00003057, + 10989: 0x00003058, + 10990: 0x00003059, + 10991: 0x0000305A, + 10992: 0x0000305B, + 10993: 0x0000305C, + 10994: 0x0000305D, + 10995: 0x0000305E, + 10996: 0x0000305F, + 10997: 0x00003060, + 10998: 0x00003061, + 10999: 0x00003062, + 11000: 0x00003063, + 11001: 0x00003064, + 11002: 0x00003065, + 11003: 0x00003066, + 11004: 0x00003067, + 11005: 0x00003068, + 11006: 0x00003069, + 11007: 0x0000306A, + 11008: 0x0000306B, + 11009: 0x0000306C, + 11010: 0x0000306D, + 11011: 0x0000306E, + 11012: 0x0000306F, + 11013: 0x00003070, + 11014: 0x00003071, + 11015: 0x00003072, + 11016: 0x00003073, + 11017: 0x00003074, + 11018: 0x00003075, + 11019: 0x00003076, + 11020: 0x00003077, + 11021: 0x00003078, + 11022: 0x00003079, + 11023: 0x0000307A, + 11024: 0x0000307B, + 11025: 0x0000307C, + 11026: 0x0000307D, + 11027: 0x0000307E, + 11028: 0x0000307F, + 11029: 0x00003080, + 11030: 0x00003081, + 11031: 0x00003082, + 11032: 0x00003083, + 11033: 0x00003084, + 11034: 0x00003085, + 11035: 0x00003086, + 11036: 0x00003087, + 11037: 0x00003088, + 11038: 0x00003089, + 11039: 0x0000308A, + 11040: 0x0000308B, + 11041: 0x0000308C, + 11042: 0x0000308D, + 11043: 0x0000308E, + 11044: 0x0000308F, + 11045: 0x00003090, + 11046: 0x00003091, + 11047: 0x00003092, + 11048: 0x00003093, + 11049: 0x000030A1, + 11050: 0x000030A2, + 11051: 0x000030A3, + 11052: 0x000030A4, + 11053: 0x000030A5, + 11054: 0x000030A6, + 11055: 0x000030A7, + 11056: 0x000030A8, + 11057: 0x000030A9, + 11058: 0x000030AA, + 11059: 0x000030AB, + 11060: 0x000030AC, + 11061: 0x000030AD, + 11062: 0x000030AE, + 11063: 0x000030AF, + 11064: 0x000030B0, + 11065: 0x000030B1, + 11066: 0x000030B2, + 11067: 0x000030B3, + 11068: 0x000030B4, + 11069: 0x000030B5, + 11070: 0x000030B6, + 11071: 0x000030B7, + 11072: 0x000030B8, + 11073: 0x000030B9, + 11074: 0x000030BA, + 11075: 0x000030BB, + 11076: 0x000030BC, + 11077: 0x000030BD, + 11078: 0x000030BE, + 11079: 0x000030BF, + 11080: 0x000030C0, + 11081: 0x000030C1, + 11082: 0x000030C2, + 11083: 0x000030C3, + 11084: 0x000030C4, + 11085: 0x000030C5, + 11086: 0x000030C6, + 11087: 0x000030C7, + 11088: 0x000030C8, + 11089: 0x000030C9, + 11090: 0x000030CA, + 11091: 0x000030CB, + 11092: 0x000030CC, + 11093: 0x000030CD, + 11094: 0x000030CE, + 11095: 0x000030CF, + 11096: 0x000030D0, + 11097: 0x000030D1, + 11098: 0x000030D2, + 11099: 0x000030D3, + 11100: 0x000030D4, + 11101: 0x000030D5, + 11102: 0x000030D6, + 11103: 0x000030D7, + 11104: 0x000030D8, + 11105: 0x000030D9, + 11106: 0x000030DA, + 11107: 0x000030DB, + 11108: 0x000030DC, + 11109: 0x000030DD, + 11110: 0x000030DE, + 11111: 0x000030DF, + 11112: 0x000030E0, + 11113: 0x000030E1, + 11114: 0x000030E2, + 11115: 0x000030E3, + 11116: 0x000030E4, + 11117: 0x000030E5, + 11118: 0x000030E6, + 11119: 0x000030E7, + 11120: 0x000030E8, + 11121: 0x000030E9, + 11122: 0x000030EA, + 11123: 0x000030EB, + 11124: 0x000030EC, + 11125: 0x000030ED, + 11126: 0x000030EE, + 11127: 0x000030EF, + 11128: 0x000030F0, + 11129: 0x000030F1, + 11130: 0x000030F2, + 11131: 0x000030F3, + 11132: 0x000030F4, + 11133: 0x000030F5, + 11134: 0x000030F6, + 11135: 0x00000410, + 11136: 0x00000411, + 11137: 0x00000412, + 11138: 0x00000413, + 11139: 0x00000414, + 11140: 0x00000415, + 11141: 0x00000401, + 11142: 0x00000416, + 11143: 0x00000417, + 11144: 0x00000418, + 11145: 0x00000419, + 11146: 0x0000041A, + 11147: 0x0000041B, + 11148: 0x0000041C, + 11149: 0x0000041D, + 11150: 0x0000041E, + 11151: 0x0000041F, + 11152: 0x00000420, + 11153: 0x00000421, + 11154: 0x00000422, + 11155: 0x00000423, + 11156: 0x00000424, + 11157: 0x00000425, + 11158: 0x00000426, + 11159: 0x00000427, + 11160: 0x00000428, + 11161: 0x00000429, + 11162: 0x0000042A, + 11163: 0x0000042B, + 11164: 0x0000042C, + 11165: 0x0000042D, + 11166: 0x0000042E, + 11167: 0x0000042F, + 11168: 0x00000430, + 11169: 0x00000431, + 11170: 0x00000432, + 11171: 0x00000433, + 11172: 0x00000434, + 11173: 0x00000435, + 11174: 0x00000451, + 11175: 0x00000436, + 11176: 0x00000437, + 11177: 0x00000438, + 11178: 0x00000439, + 11179: 0x0000043A, + 11180: 0x0000043B, + 11181: 0x0000043C, + 11182: 0x0000043D, + 11183: 0x0000043E, + 11184: 0x0000043F, + 11185: 0x00000440, + 11186: 0x00000441, + 11187: 0x00000442, + 11188: 0x00000443, + 11189: 0x00000444, + 11190: 0x00000445, + 11191: 0x00000446, + 11192: 0x00000447, + 11193: 0x00000448, + 11194: 0x00000449, + 11195: 0x0000044A, + 11196: 0x0000044B, + 11197: 0x0000044C, + 11198: 0x0000044D, + 11199: 0x0000044E, + 11200: 0x0000044F, + 11201: 0x000021E7, + 11202: 0x000021B8, + 11203: 0x000021B9, + 11204: 0x000031CF, + 11205: 0x000200CC, + 11206: 0x00004E5A, + 11207: 0x0002008A, + 11208: 0x00005202, + 11209: 0x00004491, + 11210: 0x00009FB0, + 11211: 0x00005188, + 11212: 0x00009FB1, + 11213: 0x00027607, + 11254: 0x0000FFE2, + 11255: 0x0000FFE4, + 11256: 0x0000FF07, + 11257: 0x0000FF02, + 11258: 0x00003231, + 11259: 0x00002116, + 11260: 0x00002121, + 11261: 0x0000309B, + 11262: 0x0000309C, + 11263: 0x00002E80, + 11264: 0x00002E84, + 11265: 0x00002E86, + 11266: 0x00002E87, + 11267: 0x00002E88, + 11268: 0x00002E8A, + 11269: 0x00002E8C, + 11270: 0x00002E8D, + 11271: 0x00002E95, + 11272: 0x00002E9C, + 11273: 0x00002E9D, + 11274: 0x00002EA5, + 11275: 0x00002EA7, + 11276: 0x00002EAA, + 11277: 0x00002EAC, + 11278: 0x00002EAE, + 11279: 0x00002EB6, + 11280: 0x00002EBC, + 11281: 0x00002EBE, + 11282: 0x00002EC6, + 11283: 0x00002ECA, + 11284: 0x00002ECC, + 11285: 0x00002ECD, + 11286: 0x00002ECF, + 11287: 0x00002ED6, + 11288: 0x00002ED7, + 11289: 0x00002EDE, + 11290: 0x00002EE3, + 11294: 0x00000283, + 11295: 0x00000250, + 11296: 0x0000025B, + 11297: 0x00000254, + 11298: 0x00000275, + 11299: 0x00000153, + 11300: 0x000000F8, + 11301: 0x0000014B, + 11302: 0x0000028A, + 11303: 0x0000026A, + 11304: 0x00004E42, + 11305: 0x00004E5C, + 11306: 0x000051F5, + 11307: 0x0000531A, + 11308: 0x00005382, + 11309: 0x00004E07, + 11310: 0x00004E0C, + 11311: 0x00004E47, + 11312: 0x00004E8D, + 11313: 0x000056D7, + 11314: 0x0000FA0C, + 11315: 0x00005C6E, + 11316: 0x00005F73, + 11317: 0x00004E0F, + 11318: 0x00005187, + 11319: 0x00004E0E, + 11320: 0x00004E2E, + 11321: 0x00004E93, + 11322: 0x00004EC2, + 11323: 0x00004EC9, + 11324: 0x00004EC8, + 11325: 0x00005198, + 11326: 0x000052FC, + 11327: 0x0000536C, + 11328: 0x000053B9, + 11329: 0x00005720, + 11330: 0x00005903, + 11331: 0x0000592C, + 11332: 0x00005C10, + 11333: 0x00005DFF, + 11334: 0x000065E1, + 11335: 0x00006BB3, + 11336: 0x00006BCC, + 11337: 0x00006C14, + 11338: 0x0000723F, + 11339: 0x00004E31, + 11340: 0x00004E3C, + 11341: 0x00004EE8, + 11342: 0x00004EDC, + 11343: 0x00004EE9, + 11344: 0x00004EE1, + 11345: 0x00004EDD, + 11346: 0x00004EDA, + 11347: 0x0000520C, + 11348: 0x0000531C, + 11349: 0x0000534C, + 11350: 0x00005722, + 11351: 0x00005723, + 11352: 0x00005917, + 11353: 0x0000592F, + 11354: 0x00005B81, + 11355: 0x00005B84, + 11356: 0x00005C12, + 11357: 0x00005C3B, + 11358: 0x00005C74, + 11359: 0x00005C73, + 11360: 0x00005E04, + 11361: 0x00005E80, + 11362: 0x00005E82, + 11363: 0x00005FC9, + 11364: 0x00006209, + 11365: 0x00006250, + 11366: 0x00006C15, + 11367: 0x00006C36, + 11368: 0x00006C43, + 11369: 0x00006C3F, + 11370: 0x00006C3B, + 11371: 0x000072AE, + 11372: 0x000072B0, + 11373: 0x0000738A, + 11374: 0x000079B8, + 11375: 0x0000808A, + 11376: 0x0000961E, + 11377: 0x00004F0E, + 11378: 0x00004F18, + 11379: 0x00004F2C, + 11380: 0x00004EF5, + 11381: 0x00004F14, + 11382: 0x00004EF1, + 11383: 0x00004F00, + 11384: 0x00004EF7, + 11385: 0x00004F08, + 11386: 0x00004F1D, + 11387: 0x00004F02, + 11388: 0x00004F05, + 11389: 0x00004F22, + 11390: 0x00004F13, + 11391: 0x00004F04, + 11392: 0x00004EF4, + 11393: 0x00004F12, + 11394: 0x000051B1, + 11395: 0x00005213, + 11396: 0x00005209, + 11397: 0x00005210, + 11398: 0x000052A6, + 11399: 0x00005322, + 11400: 0x0000531F, + 11401: 0x0000534D, + 11402: 0x0000538A, + 11403: 0x00005407, + 11404: 0x000056E1, + 11405: 0x000056DF, + 11406: 0x0000572E, + 11407: 0x0000572A, + 11408: 0x00005734, + 11409: 0x0000593C, + 11410: 0x00005980, + 11411: 0x0000597C, + 11412: 0x00005985, + 11413: 0x0000597B, + 11414: 0x0000597E, + 11415: 0x00005977, + 11416: 0x0000597F, + 11417: 0x00005B56, + 11418: 0x00005C15, + 11419: 0x00005C25, + 11420: 0x00005C7C, + 11421: 0x00005C7A, + 11422: 0x00005C7B, + 11423: 0x00005C7E, + 11424: 0x00005DDF, + 11425: 0x00005E75, + 11426: 0x00005E84, + 11427: 0x00005F02, + 11428: 0x00005F1A, + 11429: 0x00005F74, + 11430: 0x00005FD5, + 11431: 0x00005FD4, + 11432: 0x00005FCF, + 11433: 0x0000625C, + 11434: 0x0000625E, + 11435: 0x00006264, + 11436: 0x00006261, + 11437: 0x00006266, + 11438: 0x00006262, + 11439: 0x00006259, + 11440: 0x00006260, + 11441: 0x0000625A, + 11442: 0x00006265, + 11443: 0x000065EF, + 11444: 0x000065EE, + 11445: 0x0000673E, + 11446: 0x00006739, + 11447: 0x00006738, + 11448: 0x0000673B, + 11449: 0x0000673A, + 11450: 0x0000673F, + 11451: 0x0000673C, + 11452: 0x00006733, + 11453: 0x00006C18, + 11454: 0x00006C46, + 11455: 0x00006C52, + 11456: 0x00006C5C, + 11457: 0x00006C4F, + 11458: 0x00006C4A, + 11459: 0x00006C54, + 11460: 0x00006C4B, + 11461: 0x00006C4C, + 11462: 0x00007071, + 11463: 0x0000725E, + 11464: 0x000072B4, + 11465: 0x000072B5, + 11466: 0x0000738E, + 11467: 0x0000752A, + 11468: 0x0000767F, + 11469: 0x00007A75, + 11470: 0x00007F51, + 11471: 0x00008278, + 11472: 0x0000827C, + 11473: 0x00008280, + 11474: 0x0000827D, + 11475: 0x0000827F, + 11476: 0x0000864D, + 11477: 0x0000897E, + 11478: 0x00009099, + 11479: 0x00009097, + 11480: 0x00009098, + 11481: 0x0000909B, + 11482: 0x00009094, + 11483: 0x00009622, + 11484: 0x00009624, + 11485: 0x00009620, + 11486: 0x00009623, + 11487: 0x00004F56, + 11488: 0x00004F3B, + 11489: 0x00004F62, + 11490: 0x00004F49, + 11491: 0x00004F53, + 11492: 0x00004F64, + 11493: 0x00004F3E, + 11494: 0x00004F67, + 11495: 0x00004F52, + 11496: 0x00004F5F, + 11497: 0x00004F41, + 11498: 0x00004F58, + 11499: 0x00004F2D, + 11500: 0x00004F33, + 11501: 0x00004F3F, + 11502: 0x00004F61, + 11503: 0x0000518F, + 11504: 0x000051B9, + 11505: 0x0000521C, + 11506: 0x0000521E, + 11507: 0x00005221, + 11508: 0x000052AD, + 11509: 0x000052AE, + 11510: 0x00005309, + 11511: 0x00005363, + 11512: 0x00005372, + 11513: 0x0000538E, + 11514: 0x0000538F, + 11515: 0x00005430, + 11516: 0x00005437, + 11517: 0x0000542A, + 11518: 0x00005454, + 11519: 0x00005445, + 11520: 0x00005419, + 11521: 0x0000541C, + 11522: 0x00005425, + 11523: 0x00005418, + 11524: 0x0000543D, + 11525: 0x0000544F, + 11526: 0x00005441, + 11527: 0x00005428, + 11528: 0x00005424, + 11529: 0x00005447, + 11530: 0x000056EE, + 11531: 0x000056E7, + 11532: 0x000056E5, + 11533: 0x00005741, + 11534: 0x00005745, + 11535: 0x0000574C, + 11536: 0x00005749, + 11537: 0x0000574B, + 11538: 0x00005752, + 11539: 0x00005906, + 11540: 0x00005940, + 11541: 0x000059A6, + 11542: 0x00005998, + 11543: 0x000059A0, + 11544: 0x00005997, + 11545: 0x0000598E, + 11546: 0x000059A2, + 11547: 0x00005990, + 11548: 0x0000598F, + 11549: 0x000059A7, + 11550: 0x000059A1, + 11551: 0x00005B8E, + 11552: 0x00005B92, + 11553: 0x00005C28, + 11554: 0x00005C2A, + 11555: 0x00005C8D, + 11556: 0x00005C8F, + 11557: 0x00005C88, + 11558: 0x00005C8B, + 11559: 0x00005C89, + 11560: 0x00005C92, + 11561: 0x00005C8A, + 11562: 0x00005C86, + 11563: 0x00005C93, + 11564: 0x00005C95, + 11565: 0x00005DE0, + 11566: 0x00005E0A, + 11567: 0x00005E0E, + 11568: 0x00005E8B, + 11569: 0x00005E89, + 11570: 0x00005E8C, + 11571: 0x00005E88, + 11572: 0x00005E8D, + 11573: 0x00005F05, + 11574: 0x00005F1D, + 11575: 0x00005F78, + 11576: 0x00005F76, + 11577: 0x00005FD2, + 11578: 0x00005FD1, + 11579: 0x00005FD0, + 11580: 0x00005FED, + 11581: 0x00005FE8, + 11582: 0x00005FEE, + 11583: 0x00005FF3, + 11584: 0x00005FE1, + 11585: 0x00005FE4, + 11586: 0x00005FE3, + 11587: 0x00005FFA, + 11588: 0x00005FEF, + 11589: 0x00005FF7, + 11590: 0x00005FFB, + 11591: 0x00006000, + 11592: 0x00005FF4, + 11593: 0x0000623A, + 11594: 0x00006283, + 11595: 0x0000628C, + 11596: 0x0000628E, + 11597: 0x0000628F, + 11598: 0x00006294, + 11599: 0x00006287, + 11600: 0x00006271, + 11601: 0x0000627B, + 11602: 0x0000627A, + 11603: 0x00006270, + 11604: 0x00006281, + 11605: 0x00006288, + 11606: 0x00006277, + 11607: 0x0000627D, + 11608: 0x00006272, + 11609: 0x00006274, + 11610: 0x00006537, + 11611: 0x000065F0, + 11612: 0x000065F4, + 11613: 0x000065F3, + 11614: 0x000065F2, + 11615: 0x000065F5, + 11616: 0x00006745, + 11617: 0x00006747, + 11618: 0x00006759, + 11619: 0x00006755, + 11620: 0x0000674C, + 11621: 0x00006748, + 11622: 0x0000675D, + 11623: 0x0000674D, + 11624: 0x0000675A, + 11625: 0x0000674B, + 11626: 0x00006BD0, + 11627: 0x00006C19, + 11628: 0x00006C1A, + 11629: 0x00006C78, + 11630: 0x00006C67, + 11631: 0x00006C6B, + 11632: 0x00006C84, + 11633: 0x00006C8B, + 11634: 0x00006C8F, + 11635: 0x00006C71, + 11636: 0x00006C6F, + 11637: 0x00006C69, + 11638: 0x00006C9A, + 11639: 0x00006C6D, + 11640: 0x00006C87, + 11641: 0x00006C95, + 11642: 0x00006C9C, + 11643: 0x00006C66, + 11644: 0x00006C73, + 11645: 0x00006C65, + 11646: 0x00006C7B, + 11647: 0x00006C8E, + 11648: 0x00007074, + 11649: 0x0000707A, + 11650: 0x00007263, + 11651: 0x000072BF, + 11652: 0x000072BD, + 11653: 0x000072C3, + 11654: 0x000072C6, + 11655: 0x000072C1, + 11656: 0x000072BA, + 11657: 0x000072C5, + 11658: 0x00007395, + 11659: 0x00007397, + 11660: 0x00007393, + 11661: 0x00007394, + 11662: 0x00007392, + 11663: 0x0000753A, + 11664: 0x00007539, + 11665: 0x00007594, + 11666: 0x00007595, + 11667: 0x00007681, + 11668: 0x0000793D, + 11669: 0x00008034, + 11670: 0x00008095, + 11671: 0x00008099, + 11672: 0x00008090, + 11673: 0x00008092, + 11674: 0x0000809C, + 11675: 0x00008290, + 11676: 0x0000828F, + 11677: 0x00008285, + 11678: 0x0000828E, + 11679: 0x00008291, + 11680: 0x00008293, + 11681: 0x0000828A, + 11682: 0x00008283, + 11683: 0x00008284, + 11684: 0x00008C78, + 11685: 0x00008FC9, + 11686: 0x00008FBF, + 11687: 0x0000909F, + 11688: 0x000090A1, + 11689: 0x000090A5, + 11690: 0x0000909E, + 11691: 0x000090A7, + 11692: 0x000090A0, + 11693: 0x00009630, + 11694: 0x00009628, + 11695: 0x0000962F, + 11696: 0x0000962D, + 11697: 0x00004E33, + 11698: 0x00004F98, + 11699: 0x00004F7C, + 11700: 0x00004F85, + 11701: 0x00004F7D, + 11702: 0x00004F80, + 11703: 0x00004F87, + 11704: 0x00004F76, + 11705: 0x00004F74, + 11706: 0x00004F89, + 11707: 0x00004F84, + 11708: 0x00004F77, + 11709: 0x00004F4C, + 11710: 0x00004F97, + 11711: 0x00004F6A, + 11712: 0x00004F9A, + 11713: 0x00004F79, + 11714: 0x00004F81, + 11715: 0x00004F78, + 11716: 0x00004F90, + 11717: 0x00004F9C, + 11718: 0x00004F94, + 11719: 0x00004F9E, + 11720: 0x00004F92, + 11721: 0x00004F82, + 11722: 0x00004F95, + 11723: 0x00004F6B, + 11724: 0x00004F6E, + 11725: 0x0000519E, + 11726: 0x000051BC, + 11727: 0x000051BE, + 11728: 0x00005235, + 11729: 0x00005232, + 11730: 0x00005233, + 11731: 0x00005246, + 11732: 0x00005231, + 11733: 0x000052BC, + 11734: 0x0000530A, + 11735: 0x0000530B, + 11736: 0x0000533C, + 11737: 0x00005392, + 11738: 0x00005394, + 11739: 0x00005487, + 11740: 0x0000547F, + 11741: 0x00005481, + 11742: 0x00005491, + 11743: 0x00005482, + 11744: 0x00005488, + 11745: 0x0000546B, + 11746: 0x0000547A, + 11747: 0x0000547E, + 11748: 0x00005465, + 11749: 0x0000546C, + 11750: 0x00005474, + 11751: 0x00005466, + 11752: 0x0000548D, + 11753: 0x0000546F, + 11754: 0x00005461, + 11755: 0x00005460, + 11756: 0x00005498, + 11757: 0x00005463, + 11758: 0x00005467, + 11759: 0x00005464, + 11760: 0x000056F7, + 11761: 0x000056F9, + 11762: 0x0000576F, + 11763: 0x00005772, + 11764: 0x0000576D, + 11765: 0x0000576B, + 11766: 0x00005771, + 11767: 0x00005770, + 11768: 0x00005776, + 11769: 0x00005780, + 11770: 0x00005775, + 11771: 0x0000577B, + 11772: 0x00005773, + 11773: 0x00005774, + 11774: 0x00005762, + 11775: 0x00005768, + 11776: 0x0000577D, + 11777: 0x0000590C, + 11778: 0x00005945, + 11779: 0x000059B5, + 11780: 0x000059BA, + 11781: 0x000059CF, + 11782: 0x000059CE, + 11783: 0x000059B2, + 11784: 0x000059CC, + 11785: 0x000059C1, + 11786: 0x000059B6, + 11787: 0x000059BC, + 11788: 0x000059C3, + 11789: 0x000059D6, + 11790: 0x000059B1, + 11791: 0x000059BD, + 11792: 0x000059C0, + 11793: 0x000059C8, + 11794: 0x000059B4, + 11795: 0x000059C7, + 11796: 0x00005B62, + 11797: 0x00005B65, + 11798: 0x00005B93, + 11799: 0x00005B95, + 11800: 0x00005C44, + 11801: 0x00005C47, + 11802: 0x00005CAE, + 11803: 0x00005CA4, + 11804: 0x00005CA0, + 11805: 0x00005CB5, + 11806: 0x00005CAF, + 11807: 0x00005CA8, + 11808: 0x00005CAC, + 11809: 0x00005C9F, + 11810: 0x00005CA3, + 11811: 0x00005CAD, + 11812: 0x00005CA2, + 11813: 0x00005CAA, + 11814: 0x00005CA7, + 11815: 0x00005C9D, + 11816: 0x00005CA5, + 11817: 0x00005CB6, + 11818: 0x00005CB0, + 11819: 0x00005CA6, + 11820: 0x00005E17, + 11821: 0x00005E14, + 11822: 0x00005E19, + 11823: 0x00005F28, + 11824: 0x00005F22, + 11825: 0x00005F23, + 11826: 0x00005F24, + 11827: 0x00005F54, + 11828: 0x00005F82, + 11829: 0x00005F7E, + 11830: 0x00005F7D, + 11831: 0x00005FDE, + 11832: 0x00005FE5, + 11833: 0x0000602D, + 11834: 0x00006026, + 11835: 0x00006019, + 11836: 0x00006032, + 11837: 0x0000600B, + 11838: 0x00006034, + 11839: 0x0000600A, + 11840: 0x00006017, + 11841: 0x00006033, + 11842: 0x0000601A, + 11843: 0x0000601E, + 11844: 0x0000602C, + 11845: 0x00006022, + 11846: 0x0000600D, + 11847: 0x00006010, + 11848: 0x0000602E, + 11849: 0x00006013, + 11850: 0x00006011, + 11851: 0x0000600C, + 11852: 0x00006009, + 11853: 0x0000601C, + 11854: 0x00006214, + 11855: 0x0000623D, + 11856: 0x000062AD, + 11857: 0x000062B4, + 11858: 0x000062D1, + 11859: 0x000062BE, + 11860: 0x000062AA, + 11861: 0x000062B6, + 11862: 0x000062CA, + 11863: 0x000062AE, + 11864: 0x000062B3, + 11865: 0x000062AF, + 11866: 0x000062BB, + 11867: 0x000062A9, + 11868: 0x000062B0, + 11869: 0x000062B8, + 11870: 0x0000653D, + 11871: 0x000065A8, + 11872: 0x000065BB, + 11873: 0x00006609, + 11874: 0x000065FC, + 11875: 0x00006604, + 11876: 0x00006612, + 11877: 0x00006608, + 11878: 0x000065FB, + 11879: 0x00006603, + 11880: 0x0000660B, + 11881: 0x0000660D, + 11882: 0x00006605, + 11883: 0x000065FD, + 11884: 0x00006611, + 11885: 0x00006610, + 11886: 0x000066F6, + 11887: 0x0000670A, + 11888: 0x00006785, + 11889: 0x0000676C, + 11890: 0x0000678E, + 11891: 0x00006792, + 11892: 0x00006776, + 11893: 0x0000677B, + 11894: 0x00006798, + 11895: 0x00006786, + 11896: 0x00006784, + 11897: 0x00006774, + 11898: 0x0000678D, + 11899: 0x0000678C, + 11900: 0x0000677A, + 11901: 0x0000679F, + 11902: 0x00006791, + 11903: 0x00006799, + 11904: 0x00006783, + 11905: 0x0000677D, + 11906: 0x00006781, + 11907: 0x00006778, + 11908: 0x00006779, + 11909: 0x00006794, + 11910: 0x00006B25, + 11911: 0x00006B80, + 11912: 0x00006B7E, + 11913: 0x00006BDE, + 11914: 0x00006C1D, + 11915: 0x00006C93, + 11916: 0x00006CEC, + 11917: 0x00006CEB, + 11918: 0x00006CEE, + 11919: 0x00006CD9, + 11920: 0x00006CB6, + 11921: 0x00006CD4, + 11922: 0x00006CAD, + 11923: 0x00006CE7, + 11924: 0x00006CB7, + 11925: 0x00006CD0, + 11926: 0x00006CC2, + 11927: 0x00006CBA, + 11928: 0x00006CC3, + 11929: 0x00006CC6, + 11930: 0x00006CED, + 11931: 0x00006CF2, + 11932: 0x00006CD2, + 11933: 0x00006CDD, + 11934: 0x00006CB4, + 11935: 0x00006C8A, + 11936: 0x00006C9D, + 11937: 0x00006C80, + 11938: 0x00006CDE, + 11939: 0x00006CC0, + 11940: 0x00006D30, + 11941: 0x00006CCD, + 11942: 0x00006CC7, + 11943: 0x00006CB0, + 11944: 0x00006CF9, + 11945: 0x00006CCF, + 11946: 0x00006CE9, + 11947: 0x00006CD1, + 11948: 0x00007094, + 11949: 0x00007098, + 11950: 0x00007085, + 11951: 0x00007093, + 11952: 0x00007086, + 11953: 0x00007084, + 11954: 0x00007091, + 11955: 0x00007096, + 11956: 0x00007082, + 11957: 0x0000709A, + 11958: 0x00007083, + 11959: 0x0000726A, + 11960: 0x000072D6, + 11961: 0x000072CB, + 11962: 0x000072D8, + 11963: 0x000072C9, + 11964: 0x000072DC, + 11965: 0x000072D2, + 11966: 0x000072D4, + 11967: 0x000072DA, + 11968: 0x000072CC, + 11969: 0x000072D1, + 11970: 0x000073A4, + 11971: 0x000073A1, + 11972: 0x000073AD, + 11973: 0x000073A6, + 11974: 0x000073A2, + 11975: 0x000073A0, + 11976: 0x000073AC, + 11977: 0x0000739D, + 11978: 0x000074DD, + 11979: 0x000074E8, + 11980: 0x0000753F, + 11981: 0x00007540, + 11982: 0x0000753E, + 11983: 0x0000758C, + 11984: 0x00007598, + 11985: 0x000076AF, + 11986: 0x000076F3, + 11987: 0x000076F1, + 11988: 0x000076F0, + 11989: 0x000076F5, + 11990: 0x000077F8, + 11991: 0x000077FC, + 11992: 0x000077F9, + 11993: 0x000077FB, + 11994: 0x000077FA, + 11995: 0x000077F7, + 11996: 0x00007942, + 11997: 0x0000793F, + 11998: 0x000079C5, + 11999: 0x00007A78, + 12000: 0x00007A7B, + 12001: 0x00007AFB, + 12002: 0x00007C75, + 12003: 0x00007CFD, + 12004: 0x00008035, + 12005: 0x0000808F, + 12006: 0x000080AE, + 12007: 0x000080A3, + 12008: 0x000080B8, + 12009: 0x000080B5, + 12010: 0x000080AD, + 12011: 0x00008220, + 12012: 0x000082A0, + 12013: 0x000082C0, + 12014: 0x000082AB, + 12015: 0x0000829A, + 12016: 0x00008298, + 12017: 0x0000829B, + 12018: 0x000082B5, + 12019: 0x000082A7, + 12020: 0x000082AE, + 12021: 0x000082BC, + 12022: 0x0000829E, + 12023: 0x000082BA, + 12024: 0x000082B4, + 12025: 0x000082A8, + 12026: 0x000082A1, + 12027: 0x000082A9, + 12028: 0x000082C2, + 12029: 0x000082A4, + 12030: 0x000082C3, + 12031: 0x000082B6, + 12032: 0x000082A2, + 12033: 0x00008670, + 12034: 0x0000866F, + 12035: 0x0000866D, + 12036: 0x0000866E, + 12037: 0x00008C56, + 12038: 0x00008FD2, + 12039: 0x00008FCB, + 12040: 0x00008FD3, + 12041: 0x00008FCD, + 12042: 0x00008FD6, + 12043: 0x00008FD5, + 12044: 0x00008FD7, + 12045: 0x000090B2, + 12046: 0x000090B4, + 12047: 0x000090AF, + 12048: 0x000090B3, + 12049: 0x000090B0, + 12050: 0x00009639, + 12051: 0x0000963D, + 12052: 0x0000963C, + 12053: 0x0000963A, + 12054: 0x00009643, + 12055: 0x00004FCD, + 12056: 0x00004FC5, + 12057: 0x00004FD3, + 12058: 0x00004FB2, + 12059: 0x00004FC9, + 12060: 0x00004FCB, + 12061: 0x00004FC1, + 12062: 0x00004FD4, + 12063: 0x00004FDC, + 12064: 0x00004FD9, + 12065: 0x00004FBB, + 12066: 0x00004FB3, + 12067: 0x00004FDB, + 12068: 0x00004FC7, + 12069: 0x00004FD6, + 12070: 0x00004FBA, + 12071: 0x00004FC0, + 12072: 0x00004FB9, + 12073: 0x00004FEC, + 12074: 0x00005244, + 12075: 0x00005249, + 12076: 0x000052C0, + 12077: 0x000052C2, + 12078: 0x0000533D, + 12079: 0x0000537C, + 12080: 0x00005397, + 12081: 0x00005396, + 12082: 0x00005399, + 12083: 0x00005398, + 12084: 0x000054BA, + 12085: 0x000054A1, + 12086: 0x000054AD, + 12087: 0x000054A5, + 12088: 0x000054CF, + 12089: 0x000054C3, + 12090: 0x0000830D, + 12091: 0x000054B7, + 12092: 0x000054AE, + 12093: 0x000054D6, + 12094: 0x000054B6, + 12095: 0x000054C5, + 12096: 0x000054C6, + 12097: 0x000054A0, + 12098: 0x00005470, + 12099: 0x000054BC, + 12100: 0x000054A2, + 12101: 0x000054BE, + 12102: 0x00005472, + 12103: 0x000054DE, + 12104: 0x000054B0, + 12105: 0x000057B5, + 12106: 0x0000579E, + 12107: 0x0000579F, + 12108: 0x000057A4, + 12109: 0x0000578C, + 12110: 0x00005797, + 12111: 0x0000579D, + 12112: 0x0000579B, + 12113: 0x00005794, + 12114: 0x00005798, + 12115: 0x0000578F, + 12116: 0x00005799, + 12117: 0x000057A5, + 12118: 0x0000579A, + 12119: 0x00005795, + 12120: 0x000058F4, + 12121: 0x0000590D, + 12122: 0x00005953, + 12123: 0x000059E1, + 12124: 0x000059DE, + 12125: 0x000059EE, + 12126: 0x00005A00, + 12127: 0x000059F1, + 12128: 0x000059DD, + 12129: 0x000059FA, + 12130: 0x000059FD, + 12131: 0x000059FC, + 12132: 0x000059F6, + 12133: 0x000059E4, + 12134: 0x000059F2, + 12135: 0x000059F7, + 12136: 0x000059DB, + 12137: 0x000059E9, + 12138: 0x000059F3, + 12139: 0x000059F5, + 12140: 0x000059E0, + 12141: 0x000059FE, + 12142: 0x000059F4, + 12143: 0x000059ED, + 12144: 0x00005BA8, + 12145: 0x00005C4C, + 12146: 0x00005CD0, + 12147: 0x00005CD8, + 12148: 0x00005CCC, + 12149: 0x00005CD7, + 12150: 0x00005CCB, + 12151: 0x00005CDB, + 12152: 0x00005CDE, + 12153: 0x00005CDA, + 12154: 0x00005CC9, + 12155: 0x00005CC7, + 12156: 0x00005CCA, + 12157: 0x00005CD6, + 12158: 0x00005CD3, + 12159: 0x00005CD4, + 12160: 0x00005CCF, + 12161: 0x00005CC8, + 12162: 0x00005CC6, + 12163: 0x00005CCE, + 12164: 0x00005CDF, + 12165: 0x00005CF8, + 12166: 0x00005DF9, + 12167: 0x00005E21, + 12168: 0x00005E22, + 12169: 0x00005E23, + 12170: 0x00005E20, + 12171: 0x00005E24, + 12172: 0x00005EB0, + 12173: 0x00005EA4, + 12174: 0x00005EA2, + 12175: 0x00005E9B, + 12176: 0x00005EA3, + 12177: 0x00005EA5, + 12178: 0x00005F07, + 12179: 0x00005F2E, + 12180: 0x00005F56, + 12181: 0x00005F86, + 12182: 0x00006037, + 12183: 0x00006039, + 12184: 0x00006054, + 12185: 0x00006072, + 12186: 0x0000605E, + 12187: 0x00006045, + 12188: 0x00006053, + 12189: 0x00006047, + 12190: 0x00006049, + 12191: 0x0000605B, + 12192: 0x0000604C, + 12193: 0x00006040, + 12194: 0x00006042, + 12195: 0x0000605F, + 12196: 0x00006024, + 12197: 0x00006044, + 12198: 0x00006058, + 12199: 0x00006066, + 12200: 0x0000606E, + 12201: 0x00006242, + 12202: 0x00006243, + 12203: 0x000062CF, + 12204: 0x0000630D, + 12205: 0x0000630B, + 12206: 0x000062F5, + 12207: 0x0000630E, + 12208: 0x00006303, + 12209: 0x000062EB, + 12210: 0x000062F9, + 12211: 0x0000630F, + 12212: 0x0000630C, + 12213: 0x000062F8, + 12214: 0x000062F6, + 12215: 0x00006300, + 12216: 0x00006313, + 12217: 0x00006314, + 12218: 0x000062FA, + 12219: 0x00006315, + 12220: 0x000062FB, + 12221: 0x000062F0, + 12222: 0x00006541, + 12223: 0x00006543, + 12224: 0x000065AA, + 12225: 0x000065BF, + 12226: 0x00006636, + 12227: 0x00006621, + 12228: 0x00006632, + 12229: 0x00006635, + 12230: 0x0000661C, + 12231: 0x00006626, + 12232: 0x00006622, + 12233: 0x00006633, + 12234: 0x0000662B, + 12235: 0x0000663A, + 12236: 0x0000661D, + 12237: 0x00006634, + 12238: 0x00006639, + 12239: 0x0000662E, + 12240: 0x0000670F, + 12241: 0x00006710, + 12242: 0x000067C1, + 12243: 0x000067F2, + 12244: 0x000067C8, + 12245: 0x000067BA, + 12246: 0x000067DC, + 12247: 0x000067BB, + 12248: 0x000067F8, + 12249: 0x000067D8, + 12250: 0x000067C0, + 12251: 0x000067B7, + 12252: 0x000067C5, + 12253: 0x000067EB, + 12254: 0x000067E4, + 12255: 0x000067DF, + 12256: 0x000067B5, + 12257: 0x000067CD, + 12258: 0x000067B3, + 12259: 0x000067F7, + 12260: 0x000067F6, + 12261: 0x000067EE, + 12262: 0x000067E3, + 12263: 0x000067C2, + 12264: 0x000067B9, + 12265: 0x000067CE, + 12266: 0x000067E7, + 12267: 0x000067F0, + 12268: 0x000067B2, + 12269: 0x000067FC, + 12270: 0x000067C6, + 12271: 0x000067ED, + 12272: 0x000067CC, + 12273: 0x000067AE, + 12274: 0x000067E6, + 12275: 0x000067DB, + 12276: 0x000067FA, + 12277: 0x000067C9, + 12278: 0x000067CA, + 12279: 0x000067C3, + 12280: 0x000067EA, + 12281: 0x000067CB, + 12282: 0x00006B28, + 12283: 0x00006B82, + 12284: 0x00006B84, + 12285: 0x00006BB6, + 12286: 0x00006BD6, + 12287: 0x00006BD8, + 12288: 0x00006BE0, + 12289: 0x00006C20, + 12290: 0x00006C21, + 12291: 0x00006D28, + 12292: 0x00006D34, + 12293: 0x00006D2D, + 12294: 0x00006D1F, + 12295: 0x00006D3C, + 12296: 0x00006D3F, + 12297: 0x00006D12, + 12298: 0x00006D0A, + 12299: 0x00006CDA, + 12300: 0x00006D33, + 12301: 0x00006D04, + 12302: 0x00006D19, + 12303: 0x00006D3A, + 12304: 0x00006D1A, + 12305: 0x00006D11, + 12306: 0x00006D00, + 12307: 0x00006D1D, + 12308: 0x00006D42, + 12309: 0x00006D01, + 12310: 0x00006D18, + 12311: 0x00006D37, + 12312: 0x00006D03, + 12313: 0x00006D0F, + 12314: 0x00006D40, + 12315: 0x00006D07, + 12316: 0x00006D20, + 12317: 0x00006D2C, + 12318: 0x00006D08, + 12319: 0x00006D22, + 12320: 0x00006D09, + 12321: 0x00006D10, + 12322: 0x000070B7, + 12323: 0x0000709F, + 12324: 0x000070BE, + 12325: 0x000070B1, + 12326: 0x000070B0, + 12327: 0x000070A1, + 12328: 0x000070B4, + 12329: 0x000070B5, + 12330: 0x000070A9, + 12331: 0x00007241, + 12332: 0x00007249, + 12333: 0x0000724A, + 12334: 0x0000726C, + 12335: 0x00007270, + 12336: 0x00007273, + 12337: 0x0000726E, + 12338: 0x000072CA, + 12339: 0x000072E4, + 12340: 0x000072E8, + 12341: 0x000072EB, + 12342: 0x000072DF, + 12343: 0x000072EA, + 12344: 0x000072E6, + 12345: 0x000072E3, + 12346: 0x00007385, + 12347: 0x000073CC, + 12348: 0x000073C2, + 12349: 0x000073C8, + 12350: 0x000073C5, + 12351: 0x000073B9, + 12352: 0x000073B6, + 12353: 0x000073B5, + 12354: 0x000073B4, + 12355: 0x000073EB, + 12356: 0x000073BF, + 12357: 0x000073C7, + 12358: 0x000073BE, + 12359: 0x000073C3, + 12360: 0x000073C6, + 12361: 0x000073B8, + 12362: 0x000073CB, + 12363: 0x000074EC, + 12364: 0x000074EE, + 12365: 0x0000752E, + 12366: 0x00007547, + 12367: 0x00007548, + 12368: 0x000075A7, + 12369: 0x000075AA, + 12370: 0x00007679, + 12371: 0x000076C4, + 12372: 0x00007708, + 12373: 0x00007703, + 12374: 0x00007704, + 12375: 0x00007705, + 12376: 0x0000770A, + 12377: 0x000076F7, + 12378: 0x000076FB, + 12379: 0x000076FA, + 12380: 0x000077E7, + 12381: 0x000077E8, + 12382: 0x00007806, + 12383: 0x00007811, + 12384: 0x00007812, + 12385: 0x00007805, + 12386: 0x00007810, + 12387: 0x0000780F, + 12388: 0x0000780E, + 12389: 0x00007809, + 12390: 0x00007803, + 12391: 0x00007813, + 12392: 0x0000794A, + 12393: 0x0000794C, + 12394: 0x0000794B, + 12395: 0x00007945, + 12396: 0x00007944, + 12397: 0x000079D5, + 12398: 0x000079CD, + 12399: 0x000079CF, + 12400: 0x000079D6, + 12401: 0x000079CE, + 12402: 0x00007A80, + 12403: 0x00007A7E, + 12404: 0x00007AD1, + 12405: 0x00007B00, + 12406: 0x00007B01, + 12407: 0x00007C7A, + 12408: 0x00007C78, + 12409: 0x00007C79, + 12410: 0x00007C7F, + 12411: 0x00007C80, + 12412: 0x00007C81, + 12413: 0x00007D03, + 12414: 0x00007D08, + 12415: 0x00007D01, + 12416: 0x00007F58, + 12417: 0x00007F91, + 12418: 0x00007F8D, + 12419: 0x00007FBE, + 12420: 0x00008007, + 12421: 0x0000800E, + 12422: 0x0000800F, + 12423: 0x00008014, + 12424: 0x00008037, + 12425: 0x000080D8, + 12426: 0x000080C7, + 12427: 0x000080E0, + 12428: 0x000080D1, + 12429: 0x000080C8, + 12430: 0x000080C2, + 12431: 0x000080D0, + 12432: 0x000080C5, + 12433: 0x000080E3, + 12434: 0x000080D9, + 12435: 0x000080DC, + 12436: 0x000080CA, + 12437: 0x000080D5, + 12438: 0x000080C9, + 12439: 0x000080CF, + 12440: 0x000080D7, + 12441: 0x000080E6, + 12442: 0x000080CD, + 12443: 0x000081FF, + 12444: 0x00008221, + 12445: 0x00008294, + 12446: 0x000082D9, + 12447: 0x000082FE, + 12448: 0x000082F9, + 12449: 0x00008307, + 12450: 0x000082E8, + 12451: 0x00008300, + 12452: 0x000082D5, + 12453: 0x0000833A, + 12454: 0x000082EB, + 12455: 0x000082D6, + 12456: 0x000082F4, + 12457: 0x000082EC, + 12458: 0x000082E1, + 12459: 0x000082F2, + 12460: 0x000082F5, + 12461: 0x0000830C, + 12462: 0x000082FB, + 12463: 0x000082F6, + 12464: 0x000082F0, + 12465: 0x000082EA, + 12466: 0x000082E4, + 12467: 0x000082E0, + 12468: 0x000082FA, + 12469: 0x000082F3, + 12470: 0x000082ED, + 12471: 0x00008677, + 12472: 0x00008674, + 12473: 0x0000867C, + 12474: 0x00008673, + 12475: 0x00008841, + 12476: 0x0000884E, + 12477: 0x00008867, + 12478: 0x0000886A, + 12479: 0x00008869, + 12480: 0x000089D3, + 12481: 0x00008A04, + 12482: 0x00008A07, + 12483: 0x00008D72, + 12484: 0x00008FE3, + 12485: 0x00008FE1, + 12486: 0x00008FEE, + 12487: 0x00008FE0, + 12488: 0x000090F1, + 12489: 0x000090BD, + 12490: 0x000090BF, + 12491: 0x000090D5, + 12492: 0x000090C5, + 12493: 0x000090BE, + 12494: 0x000090C7, + 12495: 0x000090CB, + 12496: 0x000090C8, + 12497: 0x000091D4, + 12498: 0x000091D3, + 12499: 0x00009654, + 12500: 0x0000964F, + 12501: 0x00009651, + 12502: 0x00009653, + 12503: 0x0000964A, + 12504: 0x0000964E, + 12505: 0x0000501E, + 12506: 0x00005005, + 12507: 0x00005007, + 12508: 0x00005013, + 12509: 0x00005022, + 12510: 0x00005030, + 12511: 0x0000501B, + 12512: 0x00004FF5, + 12513: 0x00004FF4, + 12514: 0x00005033, + 12515: 0x00005037, + 12516: 0x0000502C, + 12517: 0x00004FF6, + 12518: 0x00004FF7, + 12519: 0x00005017, + 12520: 0x0000501C, + 12521: 0x00005020, + 12522: 0x00005027, + 12523: 0x00005035, + 12524: 0x0000502F, + 12525: 0x00005031, + 12526: 0x0000500E, + 12527: 0x0000515A, + 12528: 0x00005194, + 12529: 0x00005193, + 12530: 0x000051CA, + 12531: 0x000051C4, + 12532: 0x000051C5, + 12533: 0x000051C8, + 12534: 0x000051CE, + 12535: 0x00005261, + 12536: 0x0000525A, + 12537: 0x00005252, + 12538: 0x0000525E, + 12539: 0x0000525F, + 12540: 0x00005255, + 12541: 0x00005262, + 12542: 0x000052CD, + 12543: 0x0000530E, + 12544: 0x0000539E, + 12545: 0x00005526, + 12546: 0x000054E2, + 12547: 0x00005517, + 12548: 0x00005512, + 12549: 0x000054E7, + 12550: 0x000054F3, + 12551: 0x000054E4, + 12552: 0x0000551A, + 12553: 0x000054FF, + 12554: 0x00005504, + 12555: 0x00005508, + 12556: 0x000054EB, + 12557: 0x00005511, + 12558: 0x00005505, + 12559: 0x000054F1, + 12560: 0x0000550A, + 12561: 0x000054FB, + 12562: 0x000054F7, + 12563: 0x000054F8, + 12564: 0x000054E0, + 12565: 0x0000550E, + 12566: 0x00005503, + 12567: 0x0000550B, + 12568: 0x00005701, + 12569: 0x00005702, + 12570: 0x000057CC, + 12571: 0x00005832, + 12572: 0x000057D5, + 12573: 0x000057D2, + 12574: 0x000057BA, + 12575: 0x000057C6, + 12576: 0x000057BD, + 12577: 0x000057BC, + 12578: 0x000057B8, + 12579: 0x000057B6, + 12580: 0x000057BF, + 12581: 0x000057C7, + 12582: 0x000057D0, + 12583: 0x000057B9, + 12584: 0x000057C1, + 12585: 0x0000590E, + 12586: 0x0000594A, + 12587: 0x00005A19, + 12588: 0x00005A16, + 12589: 0x00005A2D, + 12590: 0x00005A2E, + 12591: 0x00005A15, + 12592: 0x00005A0F, + 12593: 0x00005A17, + 12594: 0x00005A0A, + 12595: 0x00005A1E, + 12596: 0x00005A33, + 12597: 0x00005B6C, + 12598: 0x00005BA7, + 12599: 0x00005BAD, + 12600: 0x00005BAC, + 12601: 0x00005C03, + 12602: 0x00005C56, + 12603: 0x00005C54, + 12604: 0x00005CEC, + 12605: 0x00005CFF, + 12606: 0x00005CEE, + 12607: 0x00005CF1, + 12608: 0x00005CF7, + 12609: 0x00005D00, + 12610: 0x00005CF9, + 12611: 0x00005E29, + 12612: 0x00005E28, + 12613: 0x00005EA8, + 12614: 0x00005EAE, + 12615: 0x00005EAA, + 12616: 0x00005EAC, + 12617: 0x00005F33, + 12618: 0x00005F30, + 12619: 0x00005F67, + 12620: 0x0000605D, + 12621: 0x0000605A, + 12622: 0x00006067, + 12623: 0x00006041, + 12624: 0x000060A2, + 12625: 0x00006088, + 12626: 0x00006080, + 12627: 0x00006092, + 12628: 0x00006081, + 12629: 0x0000609D, + 12630: 0x00006083, + 12631: 0x00006095, + 12632: 0x0000609B, + 12633: 0x00006097, + 12634: 0x00006087, + 12635: 0x0000609C, + 12636: 0x0000608E, + 12637: 0x00006219, + 12638: 0x00006246, + 12639: 0x000062F2, + 12640: 0x00006310, + 12641: 0x00006356, + 12642: 0x0000632C, + 12643: 0x00006344, + 12644: 0x00006345, + 12645: 0x00006336, + 12646: 0x00006343, + 12647: 0x000063E4, + 12648: 0x00006339, + 12649: 0x0000634B, + 12650: 0x0000634A, + 12651: 0x0000633C, + 12652: 0x00006329, + 12653: 0x00006341, + 12654: 0x00006334, + 12655: 0x00006358, + 12656: 0x00006354, + 12657: 0x00006359, + 12658: 0x0000632D, + 12659: 0x00006347, + 12660: 0x00006333, + 12661: 0x0000635A, + 12662: 0x00006351, + 12663: 0x00006338, + 12664: 0x00006357, + 12665: 0x00006340, + 12666: 0x00006348, + 12667: 0x0000654A, + 12668: 0x00006546, + 12669: 0x000065C6, + 12670: 0x000065C3, + 12671: 0x000065C4, + 12672: 0x000065C2, + 12673: 0x0000664A, + 12674: 0x0000665F, + 12675: 0x00006647, + 12676: 0x00006651, + 12677: 0x00006712, + 12678: 0x00006713, + 12679: 0x0000681F, + 12680: 0x0000681A, + 12681: 0x00006849, + 12682: 0x00006832, + 12683: 0x00006833, + 12684: 0x0000683B, + 12685: 0x0000684B, + 12686: 0x0000684F, + 12687: 0x00006816, + 12688: 0x00006831, + 12689: 0x0000681C, + 12690: 0x00006835, + 12691: 0x0000682B, + 12692: 0x0000682D, + 12693: 0x0000682F, + 12694: 0x0000684E, + 12695: 0x00006844, + 12696: 0x00006834, + 12697: 0x0000681D, + 12698: 0x00006812, + 12699: 0x00006814, + 12700: 0x00006826, + 12701: 0x00006828, + 12702: 0x0000682E, + 12703: 0x0000684D, + 12704: 0x0000683A, + 12705: 0x00006825, + 12706: 0x00006820, + 12707: 0x00006B2C, + 12708: 0x00006B2F, + 12709: 0x00006B2D, + 12710: 0x00006B31, + 12711: 0x00006B34, + 12712: 0x00006B6D, + 12713: 0x00008082, + 12714: 0x00006B88, + 12715: 0x00006BE6, + 12716: 0x00006BE4, + 12717: 0x00006BE8, + 12718: 0x00006BE3, + 12719: 0x00006BE2, + 12720: 0x00006BE7, + 12721: 0x00006C25, + 12722: 0x00006D7A, + 12723: 0x00006D63, + 12724: 0x00006D64, + 12725: 0x00006D76, + 12726: 0x00006D0D, + 12727: 0x00006D61, + 12728: 0x00006D92, + 12729: 0x00006D58, + 12730: 0x00006D62, + 12731: 0x00006D6D, + 12732: 0x00006D6F, + 12733: 0x00006D91, + 12734: 0x00006D8D, + 12735: 0x00006DEF, + 12736: 0x00006D7F, + 12737: 0x00006D86, + 12738: 0x00006D5E, + 12739: 0x00006D67, + 12740: 0x00006D60, + 12741: 0x00006D97, + 12742: 0x00006D70, + 12743: 0x00006D7C, + 12744: 0x00006D5F, + 12745: 0x00006D82, + 12746: 0x00006D98, + 12747: 0x00006D2F, + 12748: 0x00006D68, + 12749: 0x00006D8B, + 12750: 0x00006D7E, + 12751: 0x00006D80, + 12752: 0x00006D84, + 12753: 0x00006D16, + 12754: 0x00006D83, + 12755: 0x00006D7B, + 12756: 0x00006D7D, + 12757: 0x00006D75, + 12758: 0x00006D90, + 12759: 0x000070DC, + 12760: 0x000070D3, + 12761: 0x000070D1, + 12762: 0x000070DD, + 12763: 0x000070CB, + 12764: 0x00007F39, + 12765: 0x000070E2, + 12766: 0x000070D7, + 12767: 0x000070D2, + 12768: 0x000070DE, + 12769: 0x000070E0, + 12770: 0x000070D4, + 12771: 0x000070CD, + 12772: 0x000070C5, + 12773: 0x000070C6, + 12774: 0x000070C7, + 12775: 0x000070DA, + 12776: 0x000070CE, + 12777: 0x000070E1, + 12778: 0x00007242, + 12779: 0x00007278, + 12780: 0x00007277, + 12781: 0x00007276, + 12782: 0x00007300, + 12783: 0x000072FA, + 12784: 0x000072F4, + 12785: 0x000072FE, + 12786: 0x000072F6, + 12787: 0x000072F3, + 12788: 0x000072FB, + 12789: 0x00007301, + 12790: 0x000073D3, + 12791: 0x000073D9, + 12792: 0x000073E5, + 12793: 0x000073D6, + 12794: 0x000073BC, + 12795: 0x000073E7, + 12796: 0x000073E3, + 12797: 0x000073E9, + 12798: 0x000073DC, + 12799: 0x000073D2, + 12800: 0x000073DB, + 12801: 0x000073D4, + 12802: 0x000073DD, + 12803: 0x000073DA, + 12804: 0x000073D7, + 12805: 0x000073D8, + 12806: 0x000073E8, + 12807: 0x000074DE, + 12808: 0x000074DF, + 12809: 0x000074F4, + 12810: 0x000074F5, + 12811: 0x00007521, + 12812: 0x0000755B, + 12813: 0x0000755F, + 12814: 0x000075B0, + 12815: 0x000075C1, + 12816: 0x000075BB, + 12817: 0x000075C4, + 12818: 0x000075C0, + 12819: 0x000075BF, + 12820: 0x000075B6, + 12821: 0x000075BA, + 12822: 0x0000768A, + 12823: 0x000076C9, + 12824: 0x0000771D, + 12825: 0x0000771B, + 12826: 0x00007710, + 12827: 0x00007713, + 12828: 0x00007712, + 12829: 0x00007723, + 12830: 0x00007711, + 12831: 0x00007715, + 12832: 0x00007719, + 12833: 0x0000771A, + 12834: 0x00007722, + 12835: 0x00007727, + 12836: 0x00007823, + 12837: 0x0000782C, + 12838: 0x00007822, + 12839: 0x00007835, + 12840: 0x0000782F, + 12841: 0x00007828, + 12842: 0x0000782E, + 12843: 0x0000782B, + 12844: 0x00007821, + 12845: 0x00007829, + 12846: 0x00007833, + 12847: 0x0000782A, + 12848: 0x00007831, + 12849: 0x00007954, + 12850: 0x0000795B, + 12851: 0x0000794F, + 12852: 0x0000795C, + 12853: 0x00007953, + 12854: 0x00007952, + 12855: 0x00007951, + 12856: 0x000079EB, + 12857: 0x000079EC, + 12858: 0x000079E0, + 12859: 0x000079EE, + 12860: 0x000079ED, + 12861: 0x000079EA, + 12862: 0x000079DC, + 12863: 0x000079DE, + 12864: 0x000079DD, + 12865: 0x00007A86, + 12866: 0x00007A89, + 12867: 0x00007A85, + 12868: 0x00007A8B, + 12869: 0x00007A8C, + 12870: 0x00007A8A, + 12871: 0x00007A87, + 12872: 0x00007AD8, + 12873: 0x00007B10, + 12874: 0x00007B04, + 12875: 0x00007B13, + 12876: 0x00007B05, + 12877: 0x00007B0F, + 12878: 0x00007B08, + 12879: 0x00007B0A, + 12880: 0x00007B0E, + 12881: 0x00007B09, + 12882: 0x00007B12, + 12883: 0x00007C84, + 12884: 0x00007C91, + 12885: 0x00007C8A, + 12886: 0x00007C8C, + 12887: 0x00007C88, + 12888: 0x00007C8D, + 12889: 0x00007C85, + 12890: 0x00007D1E, + 12891: 0x00007D1D, + 12892: 0x00007D11, + 12893: 0x00007D0E, + 12894: 0x00007D18, + 12895: 0x00007D16, + 12896: 0x00007D13, + 12897: 0x00007D1F, + 12898: 0x00007D12, + 12899: 0x00007D0F, + 12900: 0x00007D0C, + 12901: 0x00007F5C, + 12902: 0x00007F61, + 12903: 0x00007F5E, + 12904: 0x00007F60, + 12905: 0x00007F5D, + 12906: 0x00007F5B, + 12907: 0x00007F96, + 12908: 0x00007F92, + 12909: 0x00007FC3, + 12910: 0x00007FC2, + 12911: 0x00007FC0, + 12912: 0x00008016, + 12913: 0x0000803E, + 12914: 0x00008039, + 12915: 0x000080FA, + 12916: 0x000080F2, + 12917: 0x000080F9, + 12918: 0x000080F5, + 12919: 0x00008101, + 12920: 0x000080FB, + 12921: 0x00008100, + 12922: 0x00008201, + 12923: 0x0000822F, + 12924: 0x00008225, + 12925: 0x00008333, + 12926: 0x0000832D, + 12927: 0x00008344, + 12928: 0x00008319, + 12929: 0x00008351, + 12930: 0x00008325, + 12931: 0x00008356, + 12932: 0x0000833F, + 12933: 0x00008341, + 12934: 0x00008326, + 12935: 0x0000831C, + 12936: 0x00008322, + 12937: 0x00008342, + 12938: 0x0000834E, + 12939: 0x0000831B, + 12940: 0x0000832A, + 12941: 0x00008308, + 12942: 0x0000833C, + 12943: 0x0000834D, + 12944: 0x00008316, + 12945: 0x00008324, + 12946: 0x00008320, + 12947: 0x00008337, + 12948: 0x0000832F, + 12949: 0x00008329, + 12950: 0x00008347, + 12951: 0x00008345, + 12952: 0x0000834C, + 12953: 0x00008353, + 12954: 0x0000831E, + 12955: 0x0000832C, + 12956: 0x0000834B, + 12957: 0x00008327, + 12958: 0x00008348, + 12959: 0x00008653, + 12960: 0x00008652, + 12961: 0x000086A2, + 12962: 0x000086A8, + 12963: 0x00008696, + 12964: 0x0000868D, + 12965: 0x00008691, + 12966: 0x0000869E, + 12967: 0x00008687, + 12968: 0x00008697, + 12969: 0x00008686, + 12970: 0x0000868B, + 12971: 0x0000869A, + 12972: 0x00008685, + 12973: 0x000086A5, + 12974: 0x00008699, + 12975: 0x000086A1, + 12976: 0x000086A7, + 12977: 0x00008695, + 12978: 0x00008698, + 12979: 0x0000868E, + 12980: 0x0000869D, + 12981: 0x00008690, + 12982: 0x00008694, + 12983: 0x00008843, + 12984: 0x00008844, + 12985: 0x0000886D, + 12986: 0x00008875, + 12987: 0x00008876, + 12988: 0x00008872, + 12989: 0x00008880, + 12990: 0x00008871, + 12991: 0x0000887F, + 12992: 0x0000886F, + 12993: 0x00008883, + 12994: 0x0000887E, + 12995: 0x00008874, + 12996: 0x0000887C, + 12997: 0x00008A12, + 12998: 0x00008C47, + 12999: 0x00008C57, + 13000: 0x00008C7B, + 13001: 0x00008CA4, + 13002: 0x00008CA3, + 13003: 0x00008D76, + 13004: 0x00008D78, + 13005: 0x00008DB5, + 13006: 0x00008DB7, + 13007: 0x00008DB6, + 13008: 0x00008ED1, + 13009: 0x00008ED3, + 13010: 0x00008FFE, + 13011: 0x00008FF5, + 13012: 0x00009002, + 13013: 0x00008FFF, + 13014: 0x00008FFB, + 13015: 0x00009004, + 13016: 0x00008FFC, + 13017: 0x00008FF6, + 13018: 0x000090D6, + 13019: 0x000090E0, + 13020: 0x000090D9, + 13021: 0x000090DA, + 13022: 0x000090E3, + 13023: 0x000090DF, + 13024: 0x000090E5, + 13025: 0x000090D8, + 13026: 0x000090DB, + 13027: 0x000090D7, + 13028: 0x000090DC, + 13029: 0x000090E4, + 13030: 0x00009150, + 13031: 0x0000914E, + 13032: 0x0000914F, + 13033: 0x000091D5, + 13034: 0x000091E2, + 13035: 0x000091DA, + 13036: 0x0000965C, + 13037: 0x0000965F, + 13038: 0x000096BC, + 13039: 0x000098E3, + 13040: 0x00009ADF, + 13041: 0x00009B2F, + 13042: 0x00004E7F, + 13043: 0x00005070, + 13044: 0x0000506A, + 13045: 0x00005061, + 13046: 0x0000505E, + 13047: 0x00005060, + 13048: 0x00005053, + 13049: 0x0000504B, + 13050: 0x0000505D, + 13051: 0x00005072, + 13052: 0x00005048, + 13053: 0x0000504D, + 13054: 0x00005041, + 13055: 0x0000505B, + 13056: 0x0000504A, + 13057: 0x00005062, + 13058: 0x00005015, + 13059: 0x00005045, + 13060: 0x0000505F, + 13061: 0x00005069, + 13062: 0x0000506B, + 13063: 0x00005063, + 13064: 0x00005064, + 13065: 0x00005046, + 13066: 0x00005040, + 13067: 0x0000506E, + 13068: 0x00005073, + 13069: 0x00005057, + 13070: 0x00005051, + 13071: 0x000051D0, + 13072: 0x0000526B, + 13073: 0x0000526D, + 13074: 0x0000526C, + 13075: 0x0000526E, + 13076: 0x000052D6, + 13077: 0x000052D3, + 13078: 0x0000532D, + 13079: 0x0000539C, + 13080: 0x00005575, + 13081: 0x00005576, + 13082: 0x0000553C, + 13083: 0x0000554D, + 13084: 0x00005550, + 13085: 0x00005534, + 13086: 0x0000552A, + 13087: 0x00005551, + 13088: 0x00005562, + 13089: 0x00005536, + 13090: 0x00005535, + 13091: 0x00005530, + 13092: 0x00005552, + 13093: 0x00005545, + 13094: 0x0000550C, + 13095: 0x00005532, + 13096: 0x00005565, + 13097: 0x0000554E, + 13098: 0x00005539, + 13099: 0x00005548, + 13100: 0x0000552D, + 13101: 0x0000553B, + 13102: 0x00005540, + 13103: 0x0000554B, + 13104: 0x0000570A, + 13105: 0x00005707, + 13106: 0x000057FB, + 13107: 0x00005814, + 13108: 0x000057E2, + 13109: 0x000057F6, + 13110: 0x000057DC, + 13111: 0x000057F4, + 13112: 0x00005800, + 13113: 0x000057ED, + 13114: 0x000057FD, + 13115: 0x00005808, + 13116: 0x000057F8, + 13117: 0x0000580B, + 13118: 0x000057F3, + 13119: 0x000057CF, + 13120: 0x00005807, + 13121: 0x000057EE, + 13122: 0x000057E3, + 13123: 0x000057F2, + 13124: 0x000057E5, + 13125: 0x000057EC, + 13126: 0x000057E1, + 13127: 0x0000580E, + 13128: 0x000057FC, + 13129: 0x00005810, + 13130: 0x000057E7, + 13131: 0x00005801, + 13132: 0x0000580C, + 13133: 0x000057F1, + 13134: 0x000057E9, + 13135: 0x000057F0, + 13136: 0x0000580D, + 13137: 0x00005804, + 13138: 0x0000595C, + 13139: 0x00005A60, + 13140: 0x00005A58, + 13141: 0x00005A55, + 13142: 0x00005A67, + 13143: 0x00005A5E, + 13144: 0x00005A38, + 13145: 0x00005A35, + 13146: 0x00005A6D, + 13147: 0x00005A50, + 13148: 0x00005A5F, + 13149: 0x00005A65, + 13150: 0x00005A6C, + 13151: 0x00005A53, + 13152: 0x00005A64, + 13153: 0x00005A57, + 13154: 0x00005A43, + 13155: 0x00005A5D, + 13156: 0x00005A52, + 13157: 0x00005A44, + 13158: 0x00005A5B, + 13159: 0x00005A48, + 13160: 0x00005A8E, + 13161: 0x00005A3E, + 13162: 0x00005A4D, + 13163: 0x00005A39, + 13164: 0x00005A4C, + 13165: 0x00005A70, + 13166: 0x00005A69, + 13167: 0x00005A47, + 13168: 0x00005A51, + 13169: 0x00005A56, + 13170: 0x00005A42, + 13171: 0x00005A5C, + 13172: 0x00005B72, + 13173: 0x00005B6E, + 13174: 0x00005BC1, + 13175: 0x00005BC0, + 13176: 0x00005C59, + 13177: 0x00005D1E, + 13178: 0x00005D0B, + 13179: 0x00005D1D, + 13180: 0x00005D1A, + 13181: 0x00005D20, + 13182: 0x00005D0C, + 13183: 0x00005D28, + 13184: 0x00005D0D, + 13185: 0x00005D26, + 13186: 0x00005D25, + 13187: 0x00005D0F, + 13188: 0x00005D30, + 13189: 0x00005D12, + 13190: 0x00005D23, + 13191: 0x00005D1F, + 13192: 0x00005D2E, + 13193: 0x00005E3E, + 13194: 0x00005E34, + 13195: 0x00005EB1, + 13196: 0x00005EB4, + 13197: 0x00005EB9, + 13198: 0x00005EB2, + 13199: 0x00005EB3, + 13200: 0x00005F36, + 13201: 0x00005F38, + 13202: 0x00005F9B, + 13203: 0x00005F96, + 13204: 0x00005F9F, + 13205: 0x0000608A, + 13206: 0x00006090, + 13207: 0x00006086, + 13208: 0x000060BE, + 13209: 0x000060B0, + 13210: 0x000060BA, + 13211: 0x000060D3, + 13212: 0x000060D4, + 13213: 0x000060CF, + 13214: 0x000060E4, + 13215: 0x000060D9, + 13216: 0x000060DD, + 13217: 0x000060C8, + 13218: 0x000060B1, + 13219: 0x000060DB, + 13220: 0x000060B7, + 13221: 0x000060CA, + 13222: 0x000060BF, + 13223: 0x000060C3, + 13224: 0x000060CD, + 13225: 0x000060C0, + 13226: 0x00006332, + 13227: 0x00006365, + 13228: 0x0000638A, + 13229: 0x00006382, + 13230: 0x0000637D, + 13231: 0x000063BD, + 13232: 0x0000639E, + 13233: 0x000063AD, + 13234: 0x0000639D, + 13235: 0x00006397, + 13236: 0x000063AB, + 13237: 0x0000638E, + 13238: 0x0000636F, + 13239: 0x00006387, + 13240: 0x00006390, + 13241: 0x0000636E, + 13242: 0x000063AF, + 13243: 0x00006375, + 13244: 0x0000639C, + 13245: 0x0000636D, + 13246: 0x000063AE, + 13247: 0x0000637C, + 13248: 0x000063A4, + 13249: 0x0000633B, + 13250: 0x0000639F, + 13251: 0x00006378, + 13252: 0x00006385, + 13253: 0x00006381, + 13254: 0x00006391, + 13255: 0x0000638D, + 13256: 0x00006370, + 13257: 0x00006553, + 13258: 0x000065CD, + 13259: 0x00006665, + 13260: 0x00006661, + 13261: 0x0000665B, + 13262: 0x00006659, + 13263: 0x0000665C, + 13264: 0x00006662, + 13265: 0x00006718, + 13266: 0x00006879, + 13267: 0x00006887, + 13268: 0x00006890, + 13269: 0x0000689C, + 13270: 0x0000686D, + 13271: 0x0000686E, + 13272: 0x000068AE, + 13273: 0x000068AB, + 13274: 0x00006956, + 13275: 0x0000686F, + 13276: 0x000068A3, + 13277: 0x000068AC, + 13278: 0x000068A9, + 13279: 0x00006875, + 13280: 0x00006874, + 13281: 0x000068B2, + 13282: 0x0000688F, + 13283: 0x00006877, + 13284: 0x00006892, + 13285: 0x0000687C, + 13286: 0x0000686B, + 13287: 0x00006872, + 13288: 0x000068AA, + 13289: 0x00006880, + 13290: 0x00006871, + 13291: 0x0000687E, + 13292: 0x0000689B, + 13293: 0x00006896, + 13294: 0x0000688B, + 13295: 0x000068A0, + 13296: 0x00006889, + 13297: 0x000068A4, + 13298: 0x00006878, + 13299: 0x0000687B, + 13300: 0x00006891, + 13301: 0x0000688C, + 13302: 0x0000688A, + 13303: 0x0000687D, + 13304: 0x00006B36, + 13305: 0x00006B33, + 13306: 0x00006B37, + 13307: 0x00006B38, + 13308: 0x00006B91, + 13309: 0x00006B8F, + 13310: 0x00006B8D, + 13311: 0x00006B8E, + 13312: 0x00006B8C, + 13313: 0x00006C2A, + 13314: 0x00006DC0, + 13315: 0x00006DAB, + 13316: 0x00006DB4, + 13317: 0x00006DB3, + 13318: 0x00006E74, + 13319: 0x00006DAC, + 13320: 0x00006DE9, + 13321: 0x00006DE2, + 13322: 0x00006DB7, + 13323: 0x00006DF6, + 13324: 0x00006DD4, + 13325: 0x00006E00, + 13326: 0x00006DC8, + 13327: 0x00006DE0, + 13328: 0x00006DDF, + 13329: 0x00006DD6, + 13330: 0x00006DBE, + 13331: 0x00006DE5, + 13332: 0x00006DDC, + 13333: 0x00006DDD, + 13334: 0x00006DDB, + 13335: 0x00006DF4, + 13336: 0x00006DCA, + 13337: 0x00006DBD, + 13338: 0x00006DED, + 13339: 0x00006DF0, + 13340: 0x00006DBA, + 13341: 0x00006DD5, + 13342: 0x00006DC2, + 13343: 0x00006DCF, + 13344: 0x00006DC9, + 13345: 0x00006DD0, + 13346: 0x00006DF2, + 13347: 0x00006DD3, + 13348: 0x00006DFD, + 13349: 0x00006DD7, + 13350: 0x00006DCD, + 13351: 0x00006DE3, + 13352: 0x00006DBB, + 13353: 0x000070FA, + 13354: 0x0000710D, + 13355: 0x000070F7, + 13356: 0x00007117, + 13357: 0x000070F4, + 13358: 0x0000710C, + 13359: 0x000070F0, + 13360: 0x00007104, + 13361: 0x000070F3, + 13362: 0x00007110, + 13363: 0x000070FC, + 13364: 0x000070FF, + 13365: 0x00007106, + 13366: 0x00007113, + 13367: 0x00007100, + 13368: 0x000070F8, + 13369: 0x000070F6, + 13370: 0x0000710B, + 13371: 0x00007102, + 13372: 0x0000710E, + 13373: 0x0000727E, + 13374: 0x0000727B, + 13375: 0x0000727C, + 13376: 0x0000727F, + 13377: 0x0000731D, + 13378: 0x00007317, + 13379: 0x00007307, + 13380: 0x00007311, + 13381: 0x00007318, + 13382: 0x0000730A, + 13383: 0x00007308, + 13384: 0x000072FF, + 13385: 0x0000730F, + 13386: 0x0000731E, + 13387: 0x00007388, + 13388: 0x000073F6, + 13389: 0x000073F8, + 13390: 0x000073F5, + 13391: 0x00007404, + 13392: 0x00007401, + 13393: 0x000073FD, + 13394: 0x00007407, + 13395: 0x00007400, + 13396: 0x000073FA, + 13397: 0x000073FC, + 13398: 0x000073FF, + 13399: 0x0000740C, + 13400: 0x0000740B, + 13401: 0x000073F4, + 13402: 0x00007408, + 13403: 0x00007564, + 13404: 0x00007563, + 13405: 0x000075CE, + 13406: 0x000075D2, + 13407: 0x000075CF, + 13408: 0x000075CB, + 13409: 0x000075CC, + 13410: 0x000075D1, + 13411: 0x000075D0, + 13412: 0x0000768F, + 13413: 0x00007689, + 13414: 0x000076D3, + 13415: 0x00007739, + 13416: 0x0000772F, + 13417: 0x0000772D, + 13418: 0x00007731, + 13419: 0x00007732, + 13420: 0x00007734, + 13421: 0x00007733, + 13422: 0x0000773D, + 13423: 0x00007725, + 13424: 0x0000773B, + 13425: 0x00007735, + 13426: 0x00007848, + 13427: 0x00007852, + 13428: 0x00007849, + 13429: 0x0000784D, + 13430: 0x0000784A, + 13431: 0x0000784C, + 13432: 0x00007826, + 13433: 0x00007845, + 13434: 0x00007850, + 13435: 0x00007964, + 13436: 0x00007967, + 13437: 0x00007969, + 13438: 0x0000796A, + 13439: 0x00007963, + 13440: 0x0000796B, + 13441: 0x00007961, + 13442: 0x000079BB, + 13443: 0x000079FA, + 13444: 0x000079F8, + 13445: 0x000079F6, + 13446: 0x000079F7, + 13447: 0x00007A8F, + 13448: 0x00007A94, + 13449: 0x00007A90, + 13450: 0x00007B35, + 13451: 0x00007B47, + 13452: 0x00007B34, + 13453: 0x00007B25, + 13454: 0x00007B30, + 13455: 0x00007B22, + 13456: 0x00007B24, + 13457: 0x00007B33, + 13458: 0x00007B18, + 13459: 0x00007B2A, + 13460: 0x00007B1D, + 13461: 0x00007B31, + 13462: 0x00007B2B, + 13463: 0x00007B2D, + 13464: 0x00007B2F, + 13465: 0x00007B32, + 13466: 0x00007B38, + 13467: 0x00007B1A, + 13468: 0x00007B23, + 13469: 0x00007C94, + 13470: 0x00007C98, + 13471: 0x00007C96, + 13472: 0x00007CA3, + 13473: 0x00007D35, + 13474: 0x00007D3D, + 13475: 0x00007D38, + 13476: 0x00007D36, + 13477: 0x00007D3A, + 13478: 0x00007D45, + 13479: 0x00007D2C, + 13480: 0x00007D29, + 13481: 0x00007D41, + 13482: 0x00007D47, + 13483: 0x00007D3E, + 13484: 0x00007D3F, + 13485: 0x00007D4A, + 13486: 0x00007D3B, + 13487: 0x00007D28, + 13488: 0x00007F63, + 13489: 0x00007F95, + 13490: 0x00007F9C, + 13491: 0x00007F9D, + 13492: 0x00007F9B, + 13493: 0x00007FCA, + 13494: 0x00007FCB, + 13495: 0x00007FCD, + 13496: 0x00007FD0, + 13497: 0x00007FD1, + 13498: 0x00007FC7, + 13499: 0x00007FCF, + 13500: 0x00007FC9, + 13501: 0x0000801F, + 13502: 0x0000801E, + 13503: 0x0000801B, + 13504: 0x00008047, + 13505: 0x00008043, + 13506: 0x00008048, + 13507: 0x00008118, + 13508: 0x00008125, + 13509: 0x00008119, + 13510: 0x0000811B, + 13511: 0x0000812D, + 13512: 0x0000811F, + 13513: 0x0000812C, + 13514: 0x0000811E, + 13515: 0x00008121, + 13516: 0x00008115, + 13517: 0x00008127, + 13518: 0x0000811D, + 13519: 0x00008122, + 13520: 0x00008211, + 13521: 0x00008238, + 13522: 0x00008233, + 13523: 0x0000823A, + 13524: 0x00008234, + 13525: 0x00008232, + 13526: 0x00008274, + 13527: 0x00008390, + 13528: 0x000083A3, + 13529: 0x000083A8, + 13530: 0x0000838D, + 13531: 0x0000837A, + 13532: 0x00008373, + 13533: 0x000083A4, + 13534: 0x00008374, + 13535: 0x0000838F, + 13536: 0x00008381, + 13537: 0x00008395, + 13538: 0x00008399, + 13539: 0x00008375, + 13540: 0x00008394, + 13541: 0x000083A9, + 13542: 0x0000837D, + 13543: 0x00008383, + 13544: 0x0000838C, + 13545: 0x0000839D, + 13546: 0x0000839B, + 13547: 0x000083AA, + 13548: 0x0000838B, + 13549: 0x0000837E, + 13550: 0x000083A5, + 13551: 0x000083AF, + 13552: 0x00008388, + 13553: 0x00008397, + 13554: 0x000083B0, + 13555: 0x0000837F, + 13556: 0x000083A6, + 13557: 0x00008387, + 13558: 0x000083AE, + 13559: 0x00008376, + 13560: 0x0000839A, + 13561: 0x00008659, + 13562: 0x00008656, + 13563: 0x000086BF, + 13564: 0x000086B7, + 13565: 0x000086C2, + 13566: 0x000086C1, + 13567: 0x000086C5, + 13568: 0x000086BA, + 13569: 0x000086B0, + 13570: 0x000086C8, + 13571: 0x000086B9, + 13572: 0x000086B3, + 13573: 0x000086B8, + 13574: 0x000086CC, + 13575: 0x000086B4, + 13576: 0x000086BB, + 13577: 0x000086BC, + 13578: 0x000086C3, + 13579: 0x000086BD, + 13580: 0x000086BE, + 13581: 0x00008852, + 13582: 0x00008889, + 13583: 0x00008895, + 13584: 0x000088A8, + 13585: 0x000088A2, + 13586: 0x000088AA, + 13587: 0x0000889A, + 13588: 0x00008891, + 13589: 0x000088A1, + 13590: 0x0000889F, + 13591: 0x00008898, + 13592: 0x000088A7, + 13593: 0x00008899, + 13594: 0x0000889B, + 13595: 0x00008897, + 13596: 0x000088A4, + 13597: 0x000088AC, + 13598: 0x0000888C, + 13599: 0x00008893, + 13600: 0x0000888E, + 13601: 0x00008982, + 13602: 0x000089D6, + 13603: 0x000089D9, + 13604: 0x000089D5, + 13605: 0x00008A30, + 13606: 0x00008A27, + 13607: 0x00008A2C, + 13608: 0x00008A1E, + 13609: 0x00008C39, + 13610: 0x00008C3B, + 13611: 0x00008C5C, + 13612: 0x00008C5D, + 13613: 0x00008C7D, + 13614: 0x00008CA5, + 13615: 0x00008D7D, + 13616: 0x00008D7B, + 13617: 0x00008D79, + 13618: 0x00008DBC, + 13619: 0x00008DC2, + 13620: 0x00008DB9, + 13621: 0x00008DBF, + 13622: 0x00008DC1, + 13623: 0x00008ED8, + 13624: 0x00008EDE, + 13625: 0x00008EDD, + 13626: 0x00008EDC, + 13627: 0x00008ED7, + 13628: 0x00008EE0, + 13629: 0x00008EE1, + 13630: 0x00009024, + 13631: 0x0000900B, + 13632: 0x00009011, + 13633: 0x0000901C, + 13634: 0x0000900C, + 13635: 0x00009021, + 13636: 0x000090EF, + 13637: 0x000090EA, + 13638: 0x000090F0, + 13639: 0x000090F4, + 13640: 0x000090F2, + 13641: 0x000090F3, + 13642: 0x000090D4, + 13643: 0x000090EB, + 13644: 0x000090EC, + 13645: 0x000090E9, + 13646: 0x00009156, + 13647: 0x00009158, + 13648: 0x0000915A, + 13649: 0x00009153, + 13650: 0x00009155, + 13651: 0x000091EC, + 13652: 0x000091F4, + 13653: 0x000091F1, + 13654: 0x000091F3, + 13655: 0x000091F8, + 13656: 0x000091E4, + 13657: 0x000091F9, + 13658: 0x000091EA, + 13659: 0x000091EB, + 13660: 0x000091F7, + 13661: 0x000091E8, + 13662: 0x000091EE, + 13663: 0x0000957A, + 13664: 0x00009586, + 13665: 0x00009588, + 13666: 0x0000967C, + 13667: 0x0000966D, + 13668: 0x0000966B, + 13669: 0x00009671, + 13670: 0x0000966F, + 13671: 0x000096BF, + 13672: 0x0000976A, + 13673: 0x00009804, + 13674: 0x000098E5, + 13675: 0x00009997, + 13676: 0x0000509B, + 13677: 0x00005095, + 13678: 0x00005094, + 13679: 0x0000509E, + 13680: 0x0000508B, + 13681: 0x000050A3, + 13682: 0x00005083, + 13683: 0x0000508C, + 13684: 0x0000508E, + 13685: 0x0000509D, + 13686: 0x00005068, + 13687: 0x0000509C, + 13688: 0x00005092, + 13689: 0x00005082, + 13690: 0x00005087, + 13691: 0x0000515F, + 13692: 0x000051D4, + 13693: 0x00005312, + 13694: 0x00005311, + 13695: 0x000053A4, + 13696: 0x000053A7, + 13697: 0x00005591, + 13698: 0x000055A8, + 13699: 0x000055A5, + 13700: 0x000055AD, + 13701: 0x00005577, + 13702: 0x00005645, + 13703: 0x000055A2, + 13704: 0x00005593, + 13705: 0x00005588, + 13706: 0x0000558F, + 13707: 0x000055B5, + 13708: 0x00005581, + 13709: 0x000055A3, + 13710: 0x00005592, + 13711: 0x000055A4, + 13712: 0x0000557D, + 13713: 0x0000558C, + 13714: 0x000055A6, + 13715: 0x0000557F, + 13716: 0x00005595, + 13717: 0x000055A1, + 13718: 0x0000558E, + 13719: 0x0000570C, + 13720: 0x00005829, + 13721: 0x00005837, + 13722: 0x00005819, + 13723: 0x0000581E, + 13724: 0x00005827, + 13725: 0x00005823, + 13726: 0x00005828, + 13727: 0x000057F5, + 13728: 0x00005848, + 13729: 0x00005825, + 13730: 0x0000581C, + 13731: 0x0000581B, + 13732: 0x00005833, + 13733: 0x0000583F, + 13734: 0x00005836, + 13735: 0x0000582E, + 13736: 0x00005839, + 13737: 0x00005838, + 13738: 0x0000582D, + 13739: 0x0000582C, + 13740: 0x0000583B, + 13741: 0x00005961, + 13742: 0x00005AAF, + 13743: 0x00005A94, + 13744: 0x00005A9F, + 13745: 0x00005A7A, + 13746: 0x00005AA2, + 13747: 0x00005A9E, + 13748: 0x00005A78, + 13749: 0x00005AA6, + 13750: 0x00005A7C, + 13751: 0x00005AA5, + 13752: 0x00005AAC, + 13753: 0x00005A95, + 13754: 0x00005AAE, + 13755: 0x00005A37, + 13756: 0x00005A84, + 13757: 0x00005A8A, + 13758: 0x00005A97, + 13759: 0x00005A83, + 13760: 0x00005A8B, + 13761: 0x00005AA9, + 13762: 0x00005A7B, + 13763: 0x00005A7D, + 13764: 0x00005A8C, + 13765: 0x00005A9C, + 13766: 0x00005A8F, + 13767: 0x00005A93, + 13768: 0x00005A9D, + 13769: 0x00005BEA, + 13770: 0x00005BCD, + 13771: 0x00005BCB, + 13772: 0x00005BD4, + 13773: 0x00005BD1, + 13774: 0x00005BCA, + 13775: 0x00005BCE, + 13776: 0x00005C0C, + 13777: 0x00005C30, + 13778: 0x00005D37, + 13779: 0x00005D43, + 13780: 0x00005D6B, + 13781: 0x00005D41, + 13782: 0x00005D4B, + 13783: 0x00005D3F, + 13784: 0x00005D35, + 13785: 0x00005D51, + 13786: 0x00005D4E, + 13787: 0x00005D55, + 13788: 0x00005D33, + 13789: 0x00005D3A, + 13790: 0x00005D52, + 13791: 0x00005D3D, + 13792: 0x00005D31, + 13793: 0x00005D59, + 13794: 0x00005D42, + 13795: 0x00005D39, + 13796: 0x00005D49, + 13797: 0x00005D38, + 13798: 0x00005D3C, + 13799: 0x00005D32, + 13800: 0x00005D36, + 13801: 0x00005D40, + 13802: 0x00005D45, + 13803: 0x00005E44, + 13804: 0x00005E41, + 13805: 0x00005F58, + 13806: 0x00005FA6, + 13807: 0x00005FA5, + 13808: 0x00005FAB, + 13809: 0x000060C9, + 13810: 0x000060B9, + 13811: 0x000060CC, + 13812: 0x000060E2, + 13813: 0x000060CE, + 13814: 0x000060C4, + 13815: 0x00006114, + 13816: 0x000060F2, + 13817: 0x0000610A, + 13818: 0x00006116, + 13819: 0x00006105, + 13820: 0x000060F5, + 13821: 0x00006113, + 13822: 0x000060F8, + 13823: 0x000060FC, + 13824: 0x000060FE, + 13825: 0x000060C1, + 13826: 0x00006103, + 13827: 0x00006118, + 13828: 0x0000611D, + 13829: 0x00006110, + 13830: 0x000060FF, + 13831: 0x00006104, + 13832: 0x0000610B, + 13833: 0x0000624A, + 13834: 0x00006394, + 13835: 0x000063B1, + 13836: 0x000063B0, + 13837: 0x000063CE, + 13838: 0x000063E5, + 13839: 0x000063E8, + 13840: 0x000063EF, + 13841: 0x000063C3, + 13842: 0x0000649D, + 13843: 0x000063F3, + 13844: 0x000063CA, + 13845: 0x000063E0, + 13846: 0x000063F6, + 13847: 0x000063D5, + 13848: 0x000063F2, + 13849: 0x000063F5, + 13850: 0x00006461, + 13851: 0x000063DF, + 13852: 0x000063BE, + 13853: 0x000063DD, + 13854: 0x000063DC, + 13855: 0x000063C4, + 13856: 0x000063D8, + 13857: 0x000063D3, + 13858: 0x000063C2, + 13859: 0x000063C7, + 13860: 0x000063CC, + 13861: 0x000063CB, + 13862: 0x000063C8, + 13863: 0x000063F0, + 13864: 0x000063D7, + 13865: 0x000063D9, + 13866: 0x00006532, + 13867: 0x00006567, + 13868: 0x0000656A, + 13869: 0x00006564, + 13870: 0x0000655C, + 13871: 0x00006568, + 13872: 0x00006565, + 13873: 0x0000658C, + 13874: 0x0000659D, + 13875: 0x0000659E, + 13876: 0x000065AE, + 13877: 0x000065D0, + 13878: 0x000065D2, + 13879: 0x0000667C, + 13880: 0x0000666C, + 13881: 0x0000667B, + 13882: 0x00006680, + 13883: 0x00006671, + 13884: 0x00006679, + 13885: 0x0000666A, + 13886: 0x00006672, + 13887: 0x00006701, + 13888: 0x0000690C, + 13889: 0x000068D3, + 13890: 0x00006904, + 13891: 0x000068DC, + 13892: 0x0000692A, + 13893: 0x000068EC, + 13894: 0x000068EA, + 13895: 0x000068F1, + 13896: 0x0000690F, + 13897: 0x000068D6, + 13898: 0x000068F7, + 13899: 0x000068EB, + 13900: 0x000068E4, + 13901: 0x000068F6, + 13902: 0x00006913, + 13903: 0x00006910, + 13904: 0x000068F3, + 13905: 0x000068E1, + 13906: 0x00006907, + 13907: 0x000068CC, + 13908: 0x00006908, + 13909: 0x00006970, + 13910: 0x000068B4, + 13911: 0x00006911, + 13912: 0x000068EF, + 13913: 0x000068C6, + 13914: 0x00006914, + 13915: 0x000068F8, + 13916: 0x000068D0, + 13917: 0x000068FD, + 13918: 0x000068FC, + 13919: 0x000068E8, + 13920: 0x0000690B, + 13921: 0x0000690A, + 13922: 0x00006917, + 13923: 0x000068CE, + 13924: 0x000068C8, + 13925: 0x000068DD, + 13926: 0x000068DE, + 13927: 0x000068E6, + 13928: 0x000068F4, + 13929: 0x000068D1, + 13930: 0x00006906, + 13931: 0x000068D4, + 13932: 0x000068E9, + 13933: 0x00006915, + 13934: 0x00006925, + 13935: 0x000068C7, + 13936: 0x00006B39, + 13937: 0x00006B3B, + 13938: 0x00006B3F, + 13939: 0x00006B3C, + 13940: 0x00006B94, + 13941: 0x00006B97, + 13942: 0x00006B99, + 13943: 0x00006B95, + 13944: 0x00006BBD, + 13945: 0x00006BF0, + 13946: 0x00006BF2, + 13947: 0x00006BF3, + 13948: 0x00006C30, + 13949: 0x00006DFC, + 13950: 0x00006E46, + 13951: 0x00006E47, + 13952: 0x00006E1F, + 13953: 0x00006E49, + 13954: 0x00006E88, + 13955: 0x00006E3C, + 13956: 0x00006E3D, + 13957: 0x00006E45, + 13958: 0x00006E62, + 13959: 0x00006E2B, + 13960: 0x00006E3F, + 13961: 0x00006E41, + 13962: 0x00006E5D, + 13963: 0x00006E73, + 13964: 0x00006E1C, + 13965: 0x00006E33, + 13966: 0x00006E4B, + 13967: 0x00006E40, + 13968: 0x00006E51, + 13969: 0x00006E3B, + 13970: 0x00006E03, + 13971: 0x00006E2E, + 13972: 0x00006E5E, + 13973: 0x00006E68, + 13974: 0x00006E5C, + 13975: 0x00006E61, + 13976: 0x00006E31, + 13977: 0x00006E28, + 13978: 0x00006E60, + 13979: 0x00006E71, + 13980: 0x00006E6B, + 13981: 0x00006E39, + 13982: 0x00006E22, + 13983: 0x00006E30, + 13984: 0x00006E53, + 13985: 0x00006E65, + 13986: 0x00006E27, + 13987: 0x00006E78, + 13988: 0x00006E64, + 13989: 0x00006E77, + 13990: 0x00006E55, + 13991: 0x00006E79, + 13992: 0x00006E52, + 13993: 0x00006E66, + 13994: 0x00006E35, + 13995: 0x00006E36, + 13996: 0x00006E5A, + 13997: 0x00007120, + 13998: 0x0000711E, + 13999: 0x0000712F, + 14000: 0x000070FB, + 14001: 0x0000712E, + 14002: 0x00007131, + 14003: 0x00007123, + 14004: 0x00007125, + 14005: 0x00007122, + 14006: 0x00007132, + 14007: 0x0000711F, + 14008: 0x00007128, + 14009: 0x0000713A, + 14010: 0x0000711B, + 14011: 0x0000724B, + 14012: 0x0000725A, + 14013: 0x00007288, + 14014: 0x00007289, + 14015: 0x00007286, + 14016: 0x00007285, + 14017: 0x0000728B, + 14018: 0x00007312, + 14019: 0x0000730B, + 14020: 0x00007330, + 14021: 0x00007322, + 14022: 0x00007331, + 14023: 0x00007333, + 14024: 0x00007327, + 14025: 0x00007332, + 14026: 0x0000732D, + 14027: 0x00007326, + 14028: 0x00007323, + 14029: 0x00007335, + 14030: 0x0000730C, + 14031: 0x0000742E, + 14032: 0x0000742C, + 14033: 0x00007430, + 14034: 0x0000742B, + 14035: 0x00007416, + 14036: 0x0000741A, + 14037: 0x00007421, + 14038: 0x0000742D, + 14039: 0x00007431, + 14040: 0x00007424, + 14041: 0x00007423, + 14042: 0x0000741D, + 14043: 0x00007429, + 14044: 0x00007420, + 14045: 0x00007432, + 14046: 0x000074FB, + 14047: 0x0000752F, + 14048: 0x0000756F, + 14049: 0x0000756C, + 14050: 0x000075E7, + 14051: 0x000075DA, + 14052: 0x000075E1, + 14053: 0x000075E6, + 14054: 0x000075DD, + 14055: 0x000075DF, + 14056: 0x000075E4, + 14057: 0x000075D7, + 14058: 0x00007695, + 14059: 0x00007692, + 14060: 0x000076DA, + 14061: 0x00007746, + 14062: 0x00007747, + 14063: 0x00007744, + 14064: 0x0000774D, + 14065: 0x00007745, + 14066: 0x0000774A, + 14067: 0x0000774E, + 14068: 0x0000774B, + 14069: 0x0000774C, + 14070: 0x000077DE, + 14071: 0x000077EC, + 14072: 0x00007860, + 14073: 0x00007864, + 14074: 0x00007865, + 14075: 0x0000785C, + 14076: 0x0000786D, + 14077: 0x00007871, + 14078: 0x0000786A, + 14079: 0x0000786E, + 14080: 0x00007870, + 14081: 0x00007869, + 14082: 0x00007868, + 14083: 0x0000785E, + 14084: 0x00007862, + 14085: 0x00007974, + 14086: 0x00007973, + 14087: 0x00007972, + 14088: 0x00007970, + 14089: 0x00007A02, + 14090: 0x00007A0A, + 14091: 0x00007A03, + 14092: 0x00007A0C, + 14093: 0x00007A04, + 14094: 0x00007A99, + 14095: 0x00007AE6, + 14096: 0x00007AE4, + 14097: 0x00007B4A, + 14098: 0x00007B3B, + 14099: 0x00007B44, + 14100: 0x00007B48, + 14101: 0x00007B4C, + 14102: 0x00007B4E, + 14103: 0x00007B40, + 14104: 0x00007B58, + 14105: 0x00007B45, + 14106: 0x00007CA2, + 14107: 0x00007C9E, + 14108: 0x00007CA8, + 14109: 0x00007CA1, + 14110: 0x00007D58, + 14111: 0x00007D6F, + 14112: 0x00007D63, + 14113: 0x00007D53, + 14114: 0x00007D56, + 14115: 0x00007D67, + 14116: 0x00007D6A, + 14117: 0x00007D4F, + 14118: 0x00007D6D, + 14119: 0x00007D5C, + 14120: 0x00007D6B, + 14121: 0x00007D52, + 14122: 0x00007D54, + 14123: 0x00007D69, + 14124: 0x00007D51, + 14125: 0x00007D5F, + 14126: 0x00007D4E, + 14127: 0x00007F3E, + 14128: 0x00007F3F, + 14129: 0x00007F65, + 14130: 0x00007F66, + 14131: 0x00007FA2, + 14132: 0x00007FA0, + 14133: 0x00007FA1, + 14134: 0x00007FD7, + 14135: 0x00008051, + 14136: 0x0000804F, + 14137: 0x00008050, + 14138: 0x000080FE, + 14139: 0x000080D4, + 14140: 0x00008143, + 14141: 0x0000814A, + 14142: 0x00008152, + 14143: 0x0000814F, + 14144: 0x00008147, + 14145: 0x0000813D, + 14146: 0x0000814D, + 14147: 0x0000813A, + 14148: 0x000081E6, + 14149: 0x000081EE, + 14150: 0x000081F7, + 14151: 0x000081F8, + 14152: 0x000081F9, + 14153: 0x00008204, + 14154: 0x0000823C, + 14155: 0x0000823D, + 14156: 0x0000823F, + 14157: 0x00008275, + 14158: 0x0000833B, + 14159: 0x000083CF, + 14160: 0x000083F9, + 14161: 0x00008423, + 14162: 0x000083C0, + 14163: 0x000083E8, + 14164: 0x00008412, + 14165: 0x000083E7, + 14166: 0x000083E4, + 14167: 0x000083FC, + 14168: 0x000083F6, + 14169: 0x00008410, + 14170: 0x000083C6, + 14171: 0x000083C8, + 14172: 0x000083EB, + 14173: 0x000083E3, + 14174: 0x000083BF, + 14175: 0x00008401, + 14176: 0x000083DD, + 14177: 0x000083E5, + 14178: 0x000083D8, + 14179: 0x000083FF, + 14180: 0x000083E1, + 14181: 0x000083CB, + 14182: 0x000083CE, + 14183: 0x000083D6, + 14184: 0x000083F5, + 14185: 0x000083C9, + 14186: 0x00008409, + 14187: 0x0000840F, + 14188: 0x000083DE, + 14189: 0x00008411, + 14190: 0x00008406, + 14191: 0x000083C2, + 14192: 0x000083F3, + 14193: 0x000083D5, + 14194: 0x000083FA, + 14195: 0x000083C7, + 14196: 0x000083D1, + 14197: 0x000083EA, + 14198: 0x00008413, + 14199: 0x000083C3, + 14200: 0x000083EC, + 14201: 0x000083EE, + 14202: 0x000083C4, + 14203: 0x000083FB, + 14204: 0x000083D7, + 14205: 0x000083E2, + 14206: 0x0000841B, + 14207: 0x000083DB, + 14208: 0x000083FE, + 14209: 0x000086D8, + 14210: 0x000086E2, + 14211: 0x000086E6, + 14212: 0x000086D3, + 14213: 0x000086E3, + 14214: 0x000086DA, + 14215: 0x000086EA, + 14216: 0x000086DD, + 14217: 0x000086EB, + 14218: 0x000086DC, + 14219: 0x000086EC, + 14220: 0x000086E9, + 14221: 0x000086D7, + 14222: 0x000086E8, + 14223: 0x000086D1, + 14224: 0x00008848, + 14225: 0x00008856, + 14226: 0x00008855, + 14227: 0x000088BA, + 14228: 0x000088D7, + 14229: 0x000088B9, + 14230: 0x000088B8, + 14231: 0x000088C0, + 14232: 0x000088BE, + 14233: 0x000088B6, + 14234: 0x000088BC, + 14235: 0x000088B7, + 14236: 0x000088BD, + 14237: 0x000088B2, + 14238: 0x00008901, + 14239: 0x000088C9, + 14240: 0x00008995, + 14241: 0x00008998, + 14242: 0x00008997, + 14243: 0x000089DD, + 14244: 0x000089DA, + 14245: 0x000089DB, + 14246: 0x00008A4E, + 14247: 0x00008A4D, + 14248: 0x00008A39, + 14249: 0x00008A59, + 14250: 0x00008A40, + 14251: 0x00008A57, + 14252: 0x00008A58, + 14253: 0x00008A44, + 14254: 0x00008A45, + 14255: 0x00008A52, + 14256: 0x00008A48, + 14257: 0x00008A51, + 14258: 0x00008A4A, + 14259: 0x00008A4C, + 14260: 0x00008A4F, + 14261: 0x00008C5F, + 14262: 0x00008C81, + 14263: 0x00008C80, + 14264: 0x00008CBA, + 14265: 0x00008CBE, + 14266: 0x00008CB0, + 14267: 0x00008CB9, + 14268: 0x00008CB5, + 14269: 0x00008D84, + 14270: 0x00008D80, + 14271: 0x00008D89, + 14272: 0x00008DD8, + 14273: 0x00008DD3, + 14274: 0x00008DCD, + 14275: 0x00008DC7, + 14276: 0x00008DD6, + 14277: 0x00008DDC, + 14278: 0x00008DCF, + 14279: 0x00008DD5, + 14280: 0x00008DD9, + 14281: 0x00008DC8, + 14282: 0x00008DD7, + 14283: 0x00008DC5, + 14284: 0x00008EEF, + 14285: 0x00008EF7, + 14286: 0x00008EFA, + 14287: 0x00008EF9, + 14288: 0x00008EE6, + 14289: 0x00008EEE, + 14290: 0x00008EE5, + 14291: 0x00008EF5, + 14292: 0x00008EE7, + 14293: 0x00008EE8, + 14294: 0x00008EF6, + 14295: 0x00008EEB, + 14296: 0x00008EF1, + 14297: 0x00008EEC, + 14298: 0x00008EF4, + 14299: 0x00008EE9, + 14300: 0x0000902D, + 14301: 0x00009034, + 14302: 0x0000902F, + 14303: 0x00009106, + 14304: 0x0000912C, + 14305: 0x00009104, + 14306: 0x000090FF, + 14307: 0x000090FC, + 14308: 0x00009108, + 14309: 0x000090F9, + 14310: 0x000090FB, + 14311: 0x00009101, + 14312: 0x00009100, + 14313: 0x00009107, + 14314: 0x00009105, + 14315: 0x00009103, + 14316: 0x00009161, + 14317: 0x00009164, + 14318: 0x0000915F, + 14319: 0x00009162, + 14320: 0x00009160, + 14321: 0x00009201, + 14322: 0x0000920A, + 14323: 0x00009225, + 14324: 0x00009203, + 14325: 0x0000921A, + 14326: 0x00009226, + 14327: 0x0000920F, + 14328: 0x0000920C, + 14329: 0x00009200, + 14330: 0x00009212, + 14331: 0x000091FF, + 14332: 0x000091FD, + 14333: 0x00009206, + 14334: 0x00009204, + 14335: 0x00009227, + 14336: 0x00009202, + 14337: 0x0000921C, + 14338: 0x00009224, + 14339: 0x00009219, + 14340: 0x00009217, + 14341: 0x00009205, + 14342: 0x00009216, + 14343: 0x0000957B, + 14344: 0x0000958D, + 14345: 0x0000958C, + 14346: 0x00009590, + 14347: 0x00009687, + 14348: 0x0000967E, + 14349: 0x00009688, + 14350: 0x00009689, + 14351: 0x00009683, + 14352: 0x00009680, + 14353: 0x000096C2, + 14354: 0x000096C8, + 14355: 0x000096C3, + 14356: 0x000096F1, + 14357: 0x000096F0, + 14358: 0x0000976C, + 14359: 0x00009770, + 14360: 0x0000976E, + 14361: 0x00009807, + 14362: 0x000098A9, + 14363: 0x000098EB, + 14364: 0x00009CE6, + 14365: 0x00009EF9, + 14366: 0x00004E83, + 14367: 0x00004E84, + 14368: 0x00004EB6, + 14369: 0x000050BD, + 14370: 0x000050BF, + 14371: 0x000050C6, + 14372: 0x000050AE, + 14373: 0x000050C4, + 14374: 0x000050CA, + 14375: 0x000050B4, + 14376: 0x000050C8, + 14377: 0x000050C2, + 14378: 0x000050B0, + 14379: 0x000050C1, + 14380: 0x000050BA, + 14381: 0x000050B1, + 14382: 0x000050CB, + 14383: 0x000050C9, + 14384: 0x000050B6, + 14385: 0x000050B8, + 14386: 0x000051D7, + 14387: 0x0000527A, + 14388: 0x00005278, + 14389: 0x0000527B, + 14390: 0x0000527C, + 14391: 0x000055C3, + 14392: 0x000055DB, + 14393: 0x000055CC, + 14394: 0x000055D0, + 14395: 0x000055CB, + 14396: 0x000055CA, + 14397: 0x000055DD, + 14398: 0x000055C0, + 14399: 0x000055D4, + 14400: 0x000055C4, + 14401: 0x000055E9, + 14402: 0x000055BF, + 14403: 0x000055D2, + 14404: 0x0000558D, + 14405: 0x000055CF, + 14406: 0x000055D5, + 14407: 0x000055E2, + 14408: 0x000055D6, + 14409: 0x000055C8, + 14410: 0x000055F2, + 14411: 0x000055CD, + 14412: 0x000055D9, + 14413: 0x000055C2, + 14414: 0x00005714, + 14415: 0x00005853, + 14416: 0x00005868, + 14417: 0x00005864, + 14418: 0x0000584F, + 14419: 0x0000584D, + 14420: 0x00005849, + 14421: 0x0000586F, + 14422: 0x00005855, + 14423: 0x0000584E, + 14424: 0x0000585D, + 14425: 0x00005859, + 14426: 0x00005865, + 14427: 0x0000585B, + 14428: 0x0000583D, + 14429: 0x00005863, + 14430: 0x00005871, + 14431: 0x000058FC, + 14432: 0x00005AC7, + 14433: 0x00005AC4, + 14434: 0x00005ACB, + 14435: 0x00005ABA, + 14436: 0x00005AB8, + 14437: 0x00005AB1, + 14438: 0x00005AB5, + 14439: 0x00005AB0, + 14440: 0x00005ABF, + 14441: 0x00005AC8, + 14442: 0x00005ABB, + 14443: 0x00005AC6, + 14444: 0x00005AB7, + 14445: 0x00005AC0, + 14446: 0x00005ACA, + 14447: 0x00005AB4, + 14448: 0x00005AB6, + 14449: 0x00005ACD, + 14450: 0x00005AB9, + 14451: 0x00005A90, + 14452: 0x00005BD6, + 14453: 0x00005BD8, + 14454: 0x00005BD9, + 14455: 0x00005C1F, + 14456: 0x00005C33, + 14457: 0x00005D71, + 14458: 0x00005D63, + 14459: 0x00005D4A, + 14460: 0x00005D65, + 14461: 0x00005D72, + 14462: 0x00005D6C, + 14463: 0x00005D5E, + 14464: 0x00005D68, + 14465: 0x00005D67, + 14466: 0x00005D62, + 14467: 0x00005DF0, + 14468: 0x00005E4F, + 14469: 0x00005E4E, + 14470: 0x00005E4A, + 14471: 0x00005E4D, + 14472: 0x00005E4B, + 14473: 0x00005EC5, + 14474: 0x00005ECC, + 14475: 0x00005EC6, + 14476: 0x00005ECB, + 14477: 0x00005EC7, + 14478: 0x00005F40, + 14479: 0x00005FAF, + 14480: 0x00005FAD, + 14481: 0x000060F7, + 14482: 0x00006149, + 14483: 0x0000614A, + 14484: 0x0000612B, + 14485: 0x00006145, + 14486: 0x00006136, + 14487: 0x00006132, + 14488: 0x0000612E, + 14489: 0x00006146, + 14490: 0x0000612F, + 14491: 0x0000614F, + 14492: 0x00006129, + 14493: 0x00006140, + 14494: 0x00006220, + 14495: 0x00009168, + 14496: 0x00006223, + 14497: 0x00006225, + 14498: 0x00006224, + 14499: 0x000063C5, + 14500: 0x000063F1, + 14501: 0x000063EB, + 14502: 0x00006410, + 14503: 0x00006412, + 14504: 0x00006409, + 14505: 0x00006420, + 14506: 0x00006424, + 14507: 0x00006433, + 14508: 0x00006443, + 14509: 0x0000641F, + 14510: 0x00006415, + 14511: 0x00006418, + 14512: 0x00006439, + 14513: 0x00006437, + 14514: 0x00006422, + 14515: 0x00006423, + 14516: 0x0000640C, + 14517: 0x00006426, + 14518: 0x00006430, + 14519: 0x00006428, + 14520: 0x00006441, + 14521: 0x00006435, + 14522: 0x0000642F, + 14523: 0x0000640A, + 14524: 0x0000641A, + 14525: 0x00006440, + 14526: 0x00006425, + 14527: 0x00006427, + 14528: 0x0000640B, + 14529: 0x000063E7, + 14530: 0x0000641B, + 14531: 0x0000642E, + 14532: 0x00006421, + 14533: 0x0000640E, + 14534: 0x0000656F, + 14535: 0x00006592, + 14536: 0x000065D3, + 14537: 0x00006686, + 14538: 0x0000668C, + 14539: 0x00006695, + 14540: 0x00006690, + 14541: 0x0000668B, + 14542: 0x0000668A, + 14543: 0x00006699, + 14544: 0x00006694, + 14545: 0x00006678, + 14546: 0x00006720, + 14547: 0x00006966, + 14548: 0x0000695F, + 14549: 0x00006938, + 14550: 0x0000694E, + 14551: 0x00006962, + 14552: 0x00006971, + 14553: 0x0000693F, + 14554: 0x00006945, + 14555: 0x0000696A, + 14556: 0x00006939, + 14557: 0x00006942, + 14558: 0x00006957, + 14559: 0x00006959, + 14560: 0x0000697A, + 14561: 0x00006948, + 14562: 0x00006949, + 14563: 0x00006935, + 14564: 0x0000696C, + 14565: 0x00006933, + 14566: 0x0000693D, + 14567: 0x00006965, + 14568: 0x000068F0, + 14569: 0x00006978, + 14570: 0x00006934, + 14571: 0x00006969, + 14572: 0x00006940, + 14573: 0x0000696F, + 14574: 0x00006944, + 14575: 0x00006976, + 14576: 0x00006958, + 14577: 0x00006941, + 14578: 0x00006974, + 14579: 0x0000694C, + 14580: 0x0000693B, + 14581: 0x0000694B, + 14582: 0x00006937, + 14583: 0x0000695C, + 14584: 0x0000694F, + 14585: 0x00006951, + 14586: 0x00006932, + 14587: 0x00006952, + 14588: 0x0000692F, + 14589: 0x0000697B, + 14590: 0x0000693C, + 14591: 0x00006B46, + 14592: 0x00006B45, + 14593: 0x00006B43, + 14594: 0x00006B42, + 14595: 0x00006B48, + 14596: 0x00006B41, + 14597: 0x00006B9B, + 14598: 0x0000FA0D, + 14599: 0x00006BFB, + 14600: 0x00006BFC, + 14601: 0x00006BF9, + 14602: 0x00006BF7, + 14603: 0x00006BF8, + 14604: 0x00006E9B, + 14605: 0x00006ED6, + 14606: 0x00006EC8, + 14607: 0x00006E8F, + 14608: 0x00006EC0, + 14609: 0x00006E9F, + 14610: 0x00006E93, + 14611: 0x00006E94, + 14612: 0x00006EA0, + 14613: 0x00006EB1, + 14614: 0x00006EB9, + 14615: 0x00006EC6, + 14616: 0x00006ED2, + 14617: 0x00006EBD, + 14618: 0x00006EC1, + 14619: 0x00006E9E, + 14620: 0x00006EC9, + 14621: 0x00006EB7, + 14622: 0x00006EB0, + 14623: 0x00006ECD, + 14624: 0x00006EA6, + 14625: 0x00006ECF, + 14626: 0x00006EB2, + 14627: 0x00006EBE, + 14628: 0x00006EC3, + 14629: 0x00006EDC, + 14630: 0x00006ED8, + 14631: 0x00006E99, + 14632: 0x00006E92, + 14633: 0x00006E8E, + 14634: 0x00006E8D, + 14635: 0x00006EA4, + 14636: 0x00006EA1, + 14637: 0x00006EBF, + 14638: 0x00006EB3, + 14639: 0x00006ED0, + 14640: 0x00006ECA, + 14641: 0x00006E97, + 14642: 0x00006EAE, + 14643: 0x00006EA3, + 14644: 0x00007147, + 14645: 0x00007154, + 14646: 0x00007152, + 14647: 0x00007163, + 14648: 0x00007160, + 14649: 0x00007141, + 14650: 0x0000715D, + 14651: 0x00007162, + 14652: 0x00007172, + 14653: 0x00007178, + 14654: 0x0000716A, + 14655: 0x00007161, + 14656: 0x00007142, + 14657: 0x00007158, + 14658: 0x00007143, + 14659: 0x0000714B, + 14660: 0x00007170, + 14661: 0x0000715F, + 14662: 0x00007150, + 14663: 0x00007153, + 14664: 0x00007144, + 14665: 0x0000714D, + 14666: 0x0000715A, + 14667: 0x0000724F, + 14668: 0x0000728D, + 14669: 0x0000728C, + 14670: 0x00007291, + 14671: 0x00007290, + 14672: 0x0000728E, + 14673: 0x0000733C, + 14674: 0x00007342, + 14675: 0x0000733B, + 14676: 0x0000733A, + 14677: 0x00007340, + 14678: 0x0000734A, + 14679: 0x00007349, + 14680: 0x00007444, + 14681: 0x0000744A, + 14682: 0x0000744B, + 14683: 0x00007452, + 14684: 0x00007451, + 14685: 0x00007457, + 14686: 0x00007440, + 14687: 0x0000744F, + 14688: 0x00007450, + 14689: 0x0000744E, + 14690: 0x00007442, + 14691: 0x00007446, + 14692: 0x0000744D, + 14693: 0x00007454, + 14694: 0x000074E1, + 14695: 0x000074FF, + 14696: 0x000074FE, + 14697: 0x000074FD, + 14698: 0x0000751D, + 14699: 0x00007579, + 14700: 0x00007577, + 14701: 0x00006983, + 14702: 0x000075EF, + 14703: 0x0000760F, + 14704: 0x00007603, + 14705: 0x000075F7, + 14706: 0x000075FE, + 14707: 0x000075FC, + 14708: 0x000075F9, + 14709: 0x000075F8, + 14710: 0x00007610, + 14711: 0x000075FB, + 14712: 0x000075F6, + 14713: 0x000075ED, + 14714: 0x000075F5, + 14715: 0x000075FD, + 14716: 0x00007699, + 14717: 0x000076B5, + 14718: 0x000076DD, + 14719: 0x00007755, + 14720: 0x0000775F, + 14721: 0x00007760, + 14722: 0x00007752, + 14723: 0x00007756, + 14724: 0x0000775A, + 14725: 0x00007769, + 14726: 0x00007767, + 14727: 0x00007754, + 14728: 0x00007759, + 14729: 0x0000776D, + 14730: 0x000077E0, + 14731: 0x00007887, + 14732: 0x0000789A, + 14733: 0x00007894, + 14734: 0x0000788F, + 14735: 0x00007884, + 14736: 0x00007895, + 14737: 0x00007885, + 14738: 0x00007886, + 14739: 0x000078A1, + 14740: 0x00007883, + 14741: 0x00007879, + 14742: 0x00007899, + 14743: 0x00007880, + 14744: 0x00007896, + 14745: 0x0000787B, + 14746: 0x0000797C, + 14747: 0x00007982, + 14748: 0x0000797D, + 14749: 0x00007979, + 14750: 0x00007A11, + 14751: 0x00007A18, + 14752: 0x00007A19, + 14753: 0x00007A12, + 14754: 0x00007A17, + 14755: 0x00007A15, + 14756: 0x00007A22, + 14757: 0x00007A13, + 14758: 0x00007A1B, + 14759: 0x00007A10, + 14760: 0x00007AA3, + 14761: 0x00007AA2, + 14762: 0x00007A9E, + 14763: 0x00007AEB, + 14764: 0x00007B66, + 14765: 0x00007B64, + 14766: 0x00007B6D, + 14767: 0x00007B74, + 14768: 0x00007B69, + 14769: 0x00007B72, + 14770: 0x00007B65, + 14771: 0x00007B73, + 14772: 0x00007B71, + 14773: 0x00007B70, + 14774: 0x00007B61, + 14775: 0x00007B78, + 14776: 0x00007B76, + 14777: 0x00007B63, + 14778: 0x00007CB2, + 14779: 0x00007CB4, + 14780: 0x00007CAF, + 14781: 0x00007D88, + 14782: 0x00007D86, + 14783: 0x00007D80, + 14784: 0x00007D8D, + 14785: 0x00007D7F, + 14786: 0x00007D85, + 14787: 0x00007D7A, + 14788: 0x00007D8E, + 14789: 0x00007D7B, + 14790: 0x00007D83, + 14791: 0x00007D7C, + 14792: 0x00007D8C, + 14793: 0x00007D94, + 14794: 0x00007D84, + 14795: 0x00007D7D, + 14796: 0x00007D92, + 14797: 0x00007F6D, + 14798: 0x00007F6B, + 14799: 0x00007F67, + 14800: 0x00007F68, + 14801: 0x00007F6C, + 14802: 0x00007FA6, + 14803: 0x00007FA5, + 14804: 0x00007FA7, + 14805: 0x00007FDB, + 14806: 0x00007FDC, + 14807: 0x00008021, + 14808: 0x00008164, + 14809: 0x00008160, + 14810: 0x00008177, + 14811: 0x0000815C, + 14812: 0x00008169, + 14813: 0x0000815B, + 14814: 0x00008162, + 14815: 0x00008172, + 14816: 0x00006721, + 14817: 0x0000815E, + 14818: 0x00008176, + 14819: 0x00008167, + 14820: 0x0000816F, + 14821: 0x00008144, + 14822: 0x00008161, + 14823: 0x0000821D, + 14824: 0x00008249, + 14825: 0x00008244, + 14826: 0x00008240, + 14827: 0x00008242, + 14828: 0x00008245, + 14829: 0x000084F1, + 14830: 0x0000843F, + 14831: 0x00008456, + 14832: 0x00008476, + 14833: 0x00008479, + 14834: 0x0000848F, + 14835: 0x0000848D, + 14836: 0x00008465, + 14837: 0x00008451, + 14838: 0x00008440, + 14839: 0x00008486, + 14840: 0x00008467, + 14841: 0x00008430, + 14842: 0x0000844D, + 14843: 0x0000847D, + 14844: 0x0000845A, + 14845: 0x00008459, + 14846: 0x00008474, + 14847: 0x00008473, + 14848: 0x0000845D, + 14849: 0x00008507, + 14850: 0x0000845E, + 14851: 0x00008437, + 14852: 0x0000843A, + 14853: 0x00008434, + 14854: 0x0000847A, + 14855: 0x00008443, + 14856: 0x00008478, + 14857: 0x00008432, + 14858: 0x00008445, + 14859: 0x00008429, + 14860: 0x000083D9, + 14861: 0x0000844B, + 14862: 0x0000842F, + 14863: 0x00008442, + 14864: 0x0000842D, + 14865: 0x0000845F, + 14866: 0x00008470, + 14867: 0x00008439, + 14868: 0x0000844E, + 14869: 0x0000844C, + 14870: 0x00008452, + 14871: 0x0000846F, + 14872: 0x000084C5, + 14873: 0x0000848E, + 14874: 0x0000843B, + 14875: 0x00008447, + 14876: 0x00008436, + 14877: 0x00008433, + 14878: 0x00008468, + 14879: 0x0000847E, + 14880: 0x00008444, + 14881: 0x0000842B, + 14882: 0x00008460, + 14883: 0x00008454, + 14884: 0x0000846E, + 14885: 0x00008450, + 14886: 0x0000870B, + 14887: 0x00008704, + 14888: 0x000086F7, + 14889: 0x0000870C, + 14890: 0x000086FA, + 14891: 0x000086D6, + 14892: 0x000086F5, + 14893: 0x0000874D, + 14894: 0x000086F8, + 14895: 0x0000870E, + 14896: 0x00008709, + 14897: 0x00008701, + 14898: 0x000086F6, + 14899: 0x0000870D, + 14900: 0x00008705, + 14901: 0x000088D6, + 14902: 0x000088CB, + 14903: 0x000088CD, + 14904: 0x000088CE, + 14905: 0x000088DE, + 14906: 0x000088DB, + 14907: 0x000088DA, + 14908: 0x000088CC, + 14909: 0x000088D0, + 14910: 0x00008985, + 14911: 0x0000899B, + 14912: 0x000089DF, + 14913: 0x000089E5, + 14914: 0x000089E4, + 14915: 0x000089E1, + 14916: 0x000089E0, + 14917: 0x000089E2, + 14918: 0x000089DC, + 14919: 0x000089E6, + 14920: 0x00008A76, + 14921: 0x00008A86, + 14922: 0x00008A7F, + 14923: 0x00008A61, + 14924: 0x00008A3F, + 14925: 0x00008A77, + 14926: 0x00008A82, + 14927: 0x00008A84, + 14928: 0x00008A75, + 14929: 0x00008A83, + 14930: 0x00008A81, + 14931: 0x00008A74, + 14932: 0x00008A7A, + 14933: 0x00008C3C, + 14934: 0x00008C4B, + 14935: 0x00008C4A, + 14936: 0x00008C65, + 14937: 0x00008C64, + 14938: 0x00008C66, + 14939: 0x00008C86, + 14940: 0x00008C84, + 14941: 0x00008C85, + 14942: 0x00008CCC, + 14943: 0x00008D68, + 14944: 0x00008D69, + 14945: 0x00008D91, + 14946: 0x00008D8C, + 14947: 0x00008D8E, + 14948: 0x00008D8F, + 14949: 0x00008D8D, + 14950: 0x00008D93, + 14951: 0x00008D94, + 14952: 0x00008D90, + 14953: 0x00008D92, + 14954: 0x00008DF0, + 14955: 0x00008DE0, + 14956: 0x00008DEC, + 14957: 0x00008DF1, + 14958: 0x00008DEE, + 14959: 0x00008DD0, + 14960: 0x00008DE9, + 14961: 0x00008DE3, + 14962: 0x00008DE2, + 14963: 0x00008DE7, + 14964: 0x00008DF2, + 14965: 0x00008DEB, + 14966: 0x00008DF4, + 14967: 0x00008F06, + 14968: 0x00008EFF, + 14969: 0x00008F01, + 14970: 0x00008F00, + 14971: 0x00008F05, + 14972: 0x00008F07, + 14973: 0x00008F08, + 14974: 0x00008F02, + 14975: 0x00008F0B, + 14976: 0x00009052, + 14977: 0x0000903F, + 14978: 0x00009044, + 14979: 0x00009049, + 14980: 0x0000903D, + 14981: 0x00009110, + 14982: 0x0000910D, + 14983: 0x0000910F, + 14984: 0x00009111, + 14985: 0x00009116, + 14986: 0x00009114, + 14987: 0x0000910B, + 14988: 0x0000910E, + 14989: 0x0000916E, + 14990: 0x0000916F, + 14991: 0x00009248, + 14992: 0x00009252, + 14993: 0x00009230, + 14994: 0x0000923A, + 14995: 0x00009266, + 14996: 0x00009233, + 14997: 0x00009265, + 14998: 0x0000925E, + 14999: 0x00009283, + 15000: 0x0000922E, + 15001: 0x0000924A, + 15002: 0x00009246, + 15003: 0x0000926D, + 15004: 0x0000926C, + 15005: 0x0000924F, + 15006: 0x00009260, + 15007: 0x00009267, + 15008: 0x0000926F, + 15009: 0x00009236, + 15010: 0x00009261, + 15011: 0x00009270, + 15012: 0x00009231, + 15013: 0x00009254, + 15014: 0x00009263, + 15015: 0x00009250, + 15016: 0x00009272, + 15017: 0x0000924E, + 15018: 0x00009253, + 15019: 0x0000924C, + 15020: 0x00009256, + 15021: 0x00009232, + 15022: 0x0000959F, + 15023: 0x0000959C, + 15024: 0x0000959E, + 15025: 0x0000959B, + 15026: 0x00009692, + 15027: 0x00009693, + 15028: 0x00009691, + 15029: 0x00009697, + 15030: 0x000096CE, + 15031: 0x000096FA, + 15032: 0x000096FD, + 15033: 0x000096F8, + 15034: 0x000096F5, + 15035: 0x00009773, + 15036: 0x00009777, + 15037: 0x00009778, + 15038: 0x00009772, + 15039: 0x0000980F, + 15040: 0x0000980D, + 15041: 0x0000980E, + 15042: 0x000098AC, + 15043: 0x000098F6, + 15044: 0x000098F9, + 15045: 0x000099AF, + 15046: 0x000099B2, + 15047: 0x000099B0, + 15048: 0x000099B5, + 15049: 0x00009AAD, + 15050: 0x00009AAB, + 15051: 0x00009B5B, + 15052: 0x00009CEA, + 15053: 0x00009CED, + 15054: 0x00009CE7, + 15055: 0x00009E80, + 15056: 0x00009EFD, + 15057: 0x000050E6, + 15058: 0x000050D4, + 15059: 0x000050D7, + 15060: 0x000050E8, + 15061: 0x000050F3, + 15062: 0x000050DB, + 15063: 0x000050EA, + 15064: 0x000050DD, + 15065: 0x000050E4, + 15066: 0x000050D3, + 15067: 0x000050EC, + 15068: 0x000050F0, + 15069: 0x000050EF, + 15070: 0x000050E3, + 15071: 0x000050E0, + 15072: 0x000051D8, + 15073: 0x00005280, + 15074: 0x00005281, + 15075: 0x000052E9, + 15076: 0x000052EB, + 15077: 0x00005330, + 15078: 0x000053AC, + 15079: 0x00005627, + 15080: 0x00005615, + 15081: 0x0000560C, + 15082: 0x00005612, + 15083: 0x000055FC, + 15084: 0x0000560F, + 15085: 0x0000561C, + 15086: 0x00005601, + 15087: 0x00005613, + 15088: 0x00005602, + 15089: 0x000055FA, + 15090: 0x0000561D, + 15091: 0x00005604, + 15092: 0x000055FF, + 15093: 0x000055F9, + 15094: 0x00005889, + 15095: 0x0000587C, + 15096: 0x00005890, + 15097: 0x00005898, + 15098: 0x00005886, + 15099: 0x00005881, + 15100: 0x0000587F, + 15101: 0x00005874, + 15102: 0x0000588B, + 15103: 0x0000587A, + 15104: 0x00005887, + 15105: 0x00005891, + 15106: 0x0000588E, + 15107: 0x00005876, + 15108: 0x00005882, + 15109: 0x00005888, + 15110: 0x0000587B, + 15111: 0x00005894, + 15112: 0x0000588F, + 15113: 0x000058FE, + 15114: 0x0000596B, + 15115: 0x00005ADC, + 15116: 0x00005AEE, + 15117: 0x00005AE5, + 15118: 0x00005AD5, + 15119: 0x00005AEA, + 15120: 0x00005ADA, + 15121: 0x00005AED, + 15122: 0x00005AEB, + 15123: 0x00005AF3, + 15124: 0x00005AE2, + 15125: 0x00005AE0, + 15126: 0x00005ADB, + 15127: 0x00005AEC, + 15128: 0x00005ADE, + 15129: 0x00005ADD, + 15130: 0x00005AD9, + 15131: 0x00005AE8, + 15132: 0x00005ADF, + 15133: 0x00005B77, + 15134: 0x00005BE0, + 15135: 0x00005BE3, + 15136: 0x00005C63, + 15137: 0x00005D82, + 15138: 0x00005D80, + 15139: 0x00005D7D, + 15140: 0x00005D86, + 15141: 0x00005D7A, + 15142: 0x00005D81, + 15143: 0x00005D77, + 15144: 0x00005D8A, + 15145: 0x00005D89, + 15146: 0x00005D88, + 15147: 0x00005D7E, + 15148: 0x00005D7C, + 15149: 0x00005D8D, + 15150: 0x00005D79, + 15151: 0x00005D7F, + 15152: 0x00005E58, + 15153: 0x00005E59, + 15154: 0x00005E53, + 15155: 0x00005ED8, + 15156: 0x00005ED1, + 15157: 0x00005ED7, + 15158: 0x00005ECE, + 15159: 0x00005EDC, + 15160: 0x00005ED5, + 15161: 0x00005ED9, + 15162: 0x00005ED2, + 15163: 0x00005ED4, + 15164: 0x00005F44, + 15165: 0x00005F43, + 15166: 0x00005F6F, + 15167: 0x00005FB6, + 15168: 0x0000612C, + 15169: 0x00006128, + 15170: 0x00006141, + 15171: 0x0000615E, + 15172: 0x00006171, + 15173: 0x00006173, + 15174: 0x00006152, + 15175: 0x00006153, + 15176: 0x00006172, + 15177: 0x0000616C, + 15178: 0x00006180, + 15179: 0x00006174, + 15180: 0x00006154, + 15181: 0x0000617A, + 15182: 0x0000615B, + 15183: 0x00006165, + 15184: 0x0000613B, + 15185: 0x0000616A, + 15186: 0x00006161, + 15187: 0x00006156, + 15188: 0x00006229, + 15189: 0x00006227, + 15190: 0x0000622B, + 15191: 0x0000642B, + 15192: 0x0000644D, + 15193: 0x0000645B, + 15194: 0x0000645D, + 15195: 0x00006474, + 15196: 0x00006476, + 15197: 0x00006472, + 15198: 0x00006473, + 15199: 0x0000647D, + 15200: 0x00006475, + 15201: 0x00006466, + 15202: 0x000064A6, + 15203: 0x0000644E, + 15204: 0x00006482, + 15205: 0x0000645E, + 15206: 0x0000645C, + 15207: 0x0000644B, + 15208: 0x00006453, + 15209: 0x00006460, + 15210: 0x00006450, + 15211: 0x0000647F, + 15212: 0x0000643F, + 15213: 0x0000646C, + 15214: 0x0000646B, + 15215: 0x00006459, + 15216: 0x00006465, + 15217: 0x00006477, + 15218: 0x00006573, + 15219: 0x000065A0, + 15220: 0x000066A1, + 15221: 0x000066A0, + 15222: 0x0000669F, + 15223: 0x00006705, + 15224: 0x00006704, + 15225: 0x00006722, + 15226: 0x000069B1, + 15227: 0x000069B6, + 15228: 0x000069C9, + 15229: 0x000069A0, + 15230: 0x000069CE, + 15231: 0x00006996, + 15232: 0x000069B0, + 15233: 0x000069AC, + 15234: 0x000069BC, + 15235: 0x00006991, + 15236: 0x00006999, + 15237: 0x0000698E, + 15238: 0x000069A7, + 15239: 0x0000698D, + 15240: 0x000069A9, + 15241: 0x000069BE, + 15242: 0x000069AF, + 15243: 0x000069BF, + 15244: 0x000069C4, + 15245: 0x000069BD, + 15246: 0x000069A4, + 15247: 0x000069D4, + 15248: 0x000069B9, + 15249: 0x000069CA, + 15250: 0x0000699A, + 15251: 0x000069CF, + 15252: 0x000069B3, + 15253: 0x00006993, + 15254: 0x000069AA, + 15255: 0x000069A1, + 15256: 0x0000699E, + 15257: 0x000069D9, + 15258: 0x00006997, + 15259: 0x00006990, + 15260: 0x000069C2, + 15261: 0x000069B5, + 15262: 0x000069A5, + 15263: 0x000069C6, + 15264: 0x00006B4A, + 15265: 0x00006B4D, + 15266: 0x00006B4B, + 15267: 0x00006B9E, + 15268: 0x00006B9F, + 15269: 0x00006BA0, + 15270: 0x00006BC3, + 15271: 0x00006BC4, + 15272: 0x00006BFE, + 15273: 0x00006ECE, + 15274: 0x00006EF5, + 15275: 0x00006EF1, + 15276: 0x00006F03, + 15277: 0x00006F25, + 15278: 0x00006EF8, + 15279: 0x00006F37, + 15280: 0x00006EFB, + 15281: 0x00006F2E, + 15282: 0x00006F09, + 15283: 0x00006F4E, + 15284: 0x00006F19, + 15285: 0x00006F1A, + 15286: 0x00006F27, + 15287: 0x00006F18, + 15288: 0x00006F3B, + 15289: 0x00006F12, + 15290: 0x00006EED, + 15291: 0x00006F0A, + 15292: 0x00006F36, + 15293: 0x00006F73, + 15294: 0x00006EF9, + 15295: 0x00006EEE, + 15296: 0x00006F2D, + 15297: 0x00006F40, + 15298: 0x00006F30, + 15299: 0x00006F3C, + 15300: 0x00006F35, + 15301: 0x00006EEB, + 15302: 0x00006F07, + 15303: 0x00006F0E, + 15304: 0x00006F43, + 15305: 0x00006F05, + 15306: 0x00006EFD, + 15307: 0x00006EF6, + 15308: 0x00006F39, + 15309: 0x00006F1C, + 15310: 0x00006EFC, + 15311: 0x00006F3A, + 15312: 0x00006F1F, + 15313: 0x00006F0D, + 15314: 0x00006F1E, + 15315: 0x00006F08, + 15316: 0x00006F21, + 15317: 0x00007187, + 15318: 0x00007190, + 15319: 0x00007189, + 15320: 0x00007180, + 15321: 0x00007185, + 15322: 0x00007182, + 15323: 0x0000718F, + 15324: 0x0000717B, + 15325: 0x00007186, + 15326: 0x00007181, + 15327: 0x00007197, + 15328: 0x00007244, + 15329: 0x00007253, + 15330: 0x00007297, + 15331: 0x00007295, + 15332: 0x00007293, + 15333: 0x00007343, + 15334: 0x0000734D, + 15335: 0x00007351, + 15336: 0x0000734C, + 15337: 0x00007462, + 15338: 0x00007473, + 15339: 0x00007471, + 15340: 0x00007475, + 15341: 0x00007472, + 15342: 0x00007467, + 15343: 0x0000746E, + 15344: 0x00007500, + 15345: 0x00007502, + 15346: 0x00007503, + 15347: 0x0000757D, + 15348: 0x00007590, + 15349: 0x00007616, + 15350: 0x00007608, + 15351: 0x0000760C, + 15352: 0x00007615, + 15353: 0x00007611, + 15354: 0x0000760A, + 15355: 0x00007614, + 15356: 0x000076B8, + 15357: 0x00007781, + 15358: 0x0000777C, + 15359: 0x00007785, + 15360: 0x00007782, + 15361: 0x0000776E, + 15362: 0x00007780, + 15363: 0x0000776F, + 15364: 0x0000777E, + 15365: 0x00007783, + 15366: 0x000078B2, + 15367: 0x000078AA, + 15368: 0x000078B4, + 15369: 0x000078AD, + 15370: 0x000078A8, + 15371: 0x0000787E, + 15372: 0x000078AB, + 15373: 0x0000789E, + 15374: 0x000078A5, + 15375: 0x000078A0, + 15376: 0x000078AC, + 15377: 0x000078A2, + 15378: 0x000078A4, + 15379: 0x00007998, + 15380: 0x0000798A, + 15381: 0x0000798B, + 15382: 0x00007996, + 15383: 0x00007995, + 15384: 0x00007994, + 15385: 0x00007993, + 15386: 0x00007997, + 15387: 0x00007988, + 15388: 0x00007992, + 15389: 0x00007990, + 15390: 0x00007A2B, + 15391: 0x00007A4A, + 15392: 0x00007A30, + 15393: 0x00007A2F, + 15394: 0x00007A28, + 15395: 0x00007A26, + 15396: 0x00007AA8, + 15397: 0x00007AAB, + 15398: 0x00007AAC, + 15399: 0x00007AEE, + 15400: 0x00007B88, + 15401: 0x00007B9C, + 15402: 0x00007B8A, + 15403: 0x00007B91, + 15404: 0x00007B90, + 15405: 0x00007B96, + 15406: 0x00007B8D, + 15407: 0x00007B8C, + 15408: 0x00007B9B, + 15409: 0x00007B8E, + 15410: 0x00007B85, + 15411: 0x00007B98, + 15412: 0x00005284, + 15413: 0x00007B99, + 15414: 0x00007BA4, + 15415: 0x00007B82, + 15416: 0x00007CBB, + 15417: 0x00007CBF, + 15418: 0x00007CBC, + 15419: 0x00007CBA, + 15420: 0x00007DA7, + 15421: 0x00007DB7, + 15422: 0x00007DC2, + 15423: 0x00007DA3, + 15424: 0x00007DAA, + 15425: 0x00007DC1, + 15426: 0x00007DC0, + 15427: 0x00007DC5, + 15428: 0x00007D9D, + 15429: 0x00007DCE, + 15430: 0x00007DC4, + 15431: 0x00007DC6, + 15432: 0x00007DCB, + 15433: 0x00007DCC, + 15434: 0x00007DAF, + 15435: 0x00007DB9, + 15436: 0x00007D96, + 15437: 0x00007DBC, + 15438: 0x00007D9F, + 15439: 0x00007DA6, + 15440: 0x00007DAE, + 15441: 0x00007DA9, + 15442: 0x00007DA1, + 15443: 0x00007DC9, + 15444: 0x00007F73, + 15445: 0x00007FE2, + 15446: 0x00007FE3, + 15447: 0x00007FE5, + 15448: 0x00007FDE, + 15449: 0x00008024, + 15450: 0x0000805D, + 15451: 0x0000805C, + 15452: 0x00008189, + 15453: 0x00008186, + 15454: 0x00008183, + 15455: 0x00008187, + 15456: 0x0000818D, + 15457: 0x0000818C, + 15458: 0x0000818B, + 15459: 0x00008215, + 15460: 0x00008497, + 15461: 0x000084A4, + 15462: 0x000084A1, + 15463: 0x0000849F, + 15464: 0x000084BA, + 15465: 0x000084CE, + 15466: 0x000084C2, + 15467: 0x000084AC, + 15468: 0x000084AE, + 15469: 0x000084AB, + 15470: 0x000084B9, + 15471: 0x000084B4, + 15472: 0x000084C1, + 15473: 0x000084CD, + 15474: 0x000084AA, + 15475: 0x0000849A, + 15476: 0x000084B1, + 15477: 0x000084D0, + 15478: 0x0000849D, + 15479: 0x000084A7, + 15480: 0x000084BB, + 15481: 0x000084A2, + 15482: 0x00008494, + 15483: 0x000084C7, + 15484: 0x000084CC, + 15485: 0x0000849B, + 15486: 0x000084A9, + 15487: 0x000084AF, + 15488: 0x000084A8, + 15489: 0x000084D6, + 15490: 0x00008498, + 15491: 0x000084B6, + 15492: 0x000084CF, + 15493: 0x000084A0, + 15494: 0x000084D7, + 15495: 0x000084D4, + 15496: 0x000084D2, + 15497: 0x000084DB, + 15498: 0x000084B0, + 15499: 0x00008491, + 15500: 0x00008661, + 15501: 0x00008733, + 15502: 0x00008723, + 15503: 0x00008728, + 15504: 0x0000876B, + 15505: 0x00008740, + 15506: 0x0000872E, + 15507: 0x0000871E, + 15508: 0x00008721, + 15509: 0x00008719, + 15510: 0x0000871B, + 15511: 0x00008743, + 15512: 0x0000872C, + 15513: 0x00008741, + 15514: 0x0000873E, + 15515: 0x00008746, + 15516: 0x00008720, + 15517: 0x00008732, + 15518: 0x0000872A, + 15519: 0x0000872D, + 15520: 0x0000873C, + 15521: 0x00008712, + 15522: 0x0000873A, + 15523: 0x00008731, + 15524: 0x00008735, + 15525: 0x00008742, + 15526: 0x00008726, + 15527: 0x00008727, + 15528: 0x00008738, + 15529: 0x00008724, + 15530: 0x0000871A, + 15531: 0x00008730, + 15532: 0x00008711, + 15533: 0x000088F7, + 15534: 0x000088E7, + 15535: 0x000088F1, + 15536: 0x000088F2, + 15537: 0x000088FA, + 15538: 0x000088FE, + 15539: 0x000088EE, + 15540: 0x000088FC, + 15541: 0x000088F6, + 15542: 0x000088FB, + 15543: 0x000088F0, + 15544: 0x000088EC, + 15545: 0x000088EB, + 15546: 0x0000899D, + 15547: 0x000089A1, + 15548: 0x0000899F, + 15549: 0x0000899E, + 15550: 0x000089E9, + 15551: 0x000089EB, + 15552: 0x000089E8, + 15553: 0x00008AAB, + 15554: 0x00008A99, + 15555: 0x00008A8B, + 15556: 0x00008A92, + 15557: 0x00008A8F, + 15558: 0x00008A96, + 15559: 0x00008C3D, + 15560: 0x00008C68, + 15561: 0x00008C69, + 15562: 0x00008CD5, + 15563: 0x00008CCF, + 15564: 0x00008CD7, + 15565: 0x00008D96, + 15566: 0x00008E09, + 15567: 0x00008E02, + 15568: 0x00008DFF, + 15569: 0x00008E0D, + 15570: 0x00008DFD, + 15571: 0x00008E0A, + 15572: 0x00008E03, + 15573: 0x00008E07, + 15574: 0x00008E06, + 15575: 0x00008E05, + 15576: 0x00008DFE, + 15577: 0x00008E00, + 15578: 0x00008E04, + 15579: 0x00008F10, + 15580: 0x00008F11, + 15581: 0x00008F0E, + 15582: 0x00008F0D, + 15583: 0x00009123, + 15584: 0x0000911C, + 15585: 0x00009120, + 15586: 0x00009122, + 15587: 0x0000911F, + 15588: 0x0000911D, + 15589: 0x0000911A, + 15590: 0x00009124, + 15591: 0x00009121, + 15592: 0x0000911B, + 15593: 0x0000917A, + 15594: 0x00009172, + 15595: 0x00009179, + 15596: 0x00009173, + 15597: 0x000092A5, + 15598: 0x000092A4, + 15599: 0x00009276, + 15600: 0x0000929B, + 15601: 0x0000927A, + 15602: 0x000092A0, + 15603: 0x00009294, + 15604: 0x000092AA, + 15605: 0x0000928D, + 15606: 0x000092A6, + 15607: 0x0000929A, + 15608: 0x000092AB, + 15609: 0x00009279, + 15610: 0x00009297, + 15611: 0x0000927F, + 15612: 0x000092A3, + 15613: 0x000092EE, + 15614: 0x0000928E, + 15615: 0x00009282, + 15616: 0x00009295, + 15617: 0x000092A2, + 15618: 0x0000927D, + 15619: 0x00009288, + 15620: 0x000092A1, + 15621: 0x0000928A, + 15622: 0x00009286, + 15623: 0x0000928C, + 15624: 0x00009299, + 15625: 0x000092A7, + 15626: 0x0000927E, + 15627: 0x00009287, + 15628: 0x000092A9, + 15629: 0x0000929D, + 15630: 0x0000928B, + 15631: 0x0000922D, + 15632: 0x0000969E, + 15633: 0x000096A1, + 15634: 0x000096FF, + 15635: 0x00009758, + 15636: 0x0000977D, + 15637: 0x0000977A, + 15638: 0x0000977E, + 15639: 0x00009783, + 15640: 0x00009780, + 15641: 0x00009782, + 15642: 0x0000977B, + 15643: 0x00009784, + 15644: 0x00009781, + 15645: 0x0000977F, + 15646: 0x000097CE, + 15647: 0x000097CD, + 15648: 0x00009816, + 15649: 0x000098AD, + 15650: 0x000098AE, + 15651: 0x00009902, + 15652: 0x00009900, + 15653: 0x00009907, + 15654: 0x0000999D, + 15655: 0x0000999C, + 15656: 0x000099C3, + 15657: 0x000099B9, + 15658: 0x000099BB, + 15659: 0x000099BA, + 15660: 0x000099C2, + 15661: 0x000099BD, + 15662: 0x000099C7, + 15663: 0x00009AB1, + 15664: 0x00009AE3, + 15665: 0x00009AE7, + 15666: 0x00009B3E, + 15667: 0x00009B3F, + 15668: 0x00009B60, + 15669: 0x00009B61, + 15670: 0x00009B5F, + 15671: 0x00009CF1, + 15672: 0x00009CF2, + 15673: 0x00009CF5, + 15674: 0x00009EA7, + 15675: 0x000050FF, + 15676: 0x00005103, + 15677: 0x00005130, + 15678: 0x000050F8, + 15679: 0x00005106, + 15680: 0x00005107, + 15681: 0x000050F6, + 15682: 0x000050FE, + 15683: 0x0000510B, + 15684: 0x0000510C, + 15685: 0x000050FD, + 15686: 0x0000510A, + 15687: 0x0000528B, + 15688: 0x0000528C, + 15689: 0x000052F1, + 15690: 0x000052EF, + 15691: 0x00005648, + 15692: 0x00005642, + 15693: 0x0000564C, + 15694: 0x00005635, + 15695: 0x00005641, + 15696: 0x0000564A, + 15697: 0x00005649, + 15698: 0x00005646, + 15699: 0x00005658, + 15700: 0x0000565A, + 15701: 0x00005640, + 15702: 0x00005633, + 15703: 0x0000563D, + 15704: 0x0000562C, + 15705: 0x0000563E, + 15706: 0x00005638, + 15707: 0x0000562A, + 15708: 0x0000563A, + 15709: 0x0000571A, + 15710: 0x000058AB, + 15711: 0x0000589D, + 15712: 0x000058B1, + 15713: 0x000058A0, + 15714: 0x000058A3, + 15715: 0x000058AF, + 15716: 0x000058AC, + 15717: 0x000058A5, + 15718: 0x000058A1, + 15719: 0x000058FF, + 15720: 0x00005AFF, + 15721: 0x00005AF4, + 15722: 0x00005AFD, + 15723: 0x00005AF7, + 15724: 0x00005AF6, + 15725: 0x00005B03, + 15726: 0x00005AF8, + 15727: 0x00005B02, + 15728: 0x00005AF9, + 15729: 0x00005B01, + 15730: 0x00005B07, + 15731: 0x00005B05, + 15732: 0x00005B0F, + 15733: 0x00005C67, + 15734: 0x00005D99, + 15735: 0x00005D97, + 15736: 0x00005D9F, + 15737: 0x00005D92, + 15738: 0x00005DA2, + 15739: 0x00005D93, + 15740: 0x00005D95, + 15741: 0x00005DA0, + 15742: 0x00005D9C, + 15743: 0x00005DA1, + 15744: 0x00005D9A, + 15745: 0x00005D9E, + 15746: 0x00005E69, + 15747: 0x00005E5D, + 15748: 0x00005E60, + 15749: 0x00005E5C, + 15750: 0x00007DF3, + 15751: 0x00005EDB, + 15752: 0x00005EDE, + 15753: 0x00005EE1, + 15754: 0x00005F49, + 15755: 0x00005FB2, + 15756: 0x0000618B, + 15757: 0x00006183, + 15758: 0x00006179, + 15759: 0x000061B1, + 15760: 0x000061B0, + 15761: 0x000061A2, + 15762: 0x00006189, + 15763: 0x0000619B, + 15764: 0x00006193, + 15765: 0x000061AF, + 15766: 0x000061AD, + 15767: 0x0000619F, + 15768: 0x00006192, + 15769: 0x000061AA, + 15770: 0x000061A1, + 15771: 0x0000618D, + 15772: 0x00006166, + 15773: 0x000061B3, + 15774: 0x0000622D, + 15775: 0x0000646E, + 15776: 0x00006470, + 15777: 0x00006496, + 15778: 0x000064A0, + 15779: 0x00006485, + 15780: 0x00006497, + 15781: 0x0000649C, + 15782: 0x0000648F, + 15783: 0x0000648B, + 15784: 0x0000648A, + 15785: 0x0000648C, + 15786: 0x000064A3, + 15787: 0x0000649F, + 15788: 0x00006468, + 15789: 0x000064B1, + 15790: 0x00006498, + 15791: 0x00006576, + 15792: 0x0000657A, + 15793: 0x00006579, + 15794: 0x0000657B, + 15795: 0x000065B2, + 15796: 0x000065B3, + 15797: 0x000066B5, + 15798: 0x000066B0, + 15799: 0x000066A9, + 15800: 0x000066B2, + 15801: 0x000066B7, + 15802: 0x000066AA, + 15803: 0x000066AF, + 15804: 0x00006A00, + 15805: 0x00006A06, + 15806: 0x00006A17, + 15807: 0x000069E5, + 15808: 0x000069F8, + 15809: 0x00006A15, + 15810: 0x000069F1, + 15811: 0x000069E4, + 15812: 0x00006A20, + 15813: 0x000069FF, + 15814: 0x000069EC, + 15815: 0x000069E2, + 15816: 0x00006A1B, + 15817: 0x00006A1D, + 15818: 0x000069FE, + 15819: 0x00006A27, + 15820: 0x000069F2, + 15821: 0x000069EE, + 15822: 0x00006A14, + 15823: 0x000069F7, + 15824: 0x000069E7, + 15825: 0x00006A40, + 15826: 0x00006A08, + 15827: 0x000069E6, + 15828: 0x000069FB, + 15829: 0x00006A0D, + 15830: 0x000069FC, + 15831: 0x000069EB, + 15832: 0x00006A09, + 15833: 0x00006A04, + 15834: 0x00006A18, + 15835: 0x00006A25, + 15836: 0x00006A0F, + 15837: 0x000069F6, + 15838: 0x00006A26, + 15839: 0x00006A07, + 15840: 0x000069F4, + 15841: 0x00006A16, + 15842: 0x00006B51, + 15843: 0x00006BA5, + 15844: 0x00006BA3, + 15845: 0x00006BA2, + 15846: 0x00006BA6, + 15847: 0x00006C01, + 15848: 0x00006C00, + 15849: 0x00006BFF, + 15850: 0x00006C02, + 15851: 0x00006F41, + 15852: 0x00006F26, + 15853: 0x00006F7E, + 15854: 0x00006F87, + 15855: 0x00006FC6, + 15856: 0x00006F92, + 15857: 0x00006F8D, + 15858: 0x00006F89, + 15859: 0x00006F8C, + 15860: 0x00006F62, + 15861: 0x00006F4F, + 15862: 0x00006F85, + 15863: 0x00006F5A, + 15864: 0x00006F96, + 15865: 0x00006F76, + 15866: 0x00006F6C, + 15867: 0x00006F82, + 15868: 0x00006F55, + 15869: 0x00006F72, + 15870: 0x00006F52, + 15871: 0x00006F50, + 15872: 0x00006F57, + 15873: 0x00006F94, + 15874: 0x00006F93, + 15875: 0x00006F5D, + 15876: 0x00006F00, + 15877: 0x00006F61, + 15878: 0x00006F6B, + 15879: 0x00006F7D, + 15880: 0x00006F67, + 15881: 0x00006F90, + 15882: 0x00006F53, + 15883: 0x00006F8B, + 15884: 0x00006F69, + 15885: 0x00006F7F, + 15886: 0x00006F95, + 15887: 0x00006F63, + 15888: 0x00006F77, + 15889: 0x00006F6A, + 15890: 0x00006F7B, + 15891: 0x000071B2, + 15892: 0x000071AF, + 15893: 0x0000719B, + 15894: 0x000071B0, + 15895: 0x000071A0, + 15896: 0x0000719A, + 15897: 0x000071A9, + 15898: 0x000071B5, + 15899: 0x0000719D, + 15900: 0x000071A5, + 15901: 0x0000719E, + 15902: 0x000071A4, + 15903: 0x000071A1, + 15904: 0x000071AA, + 15905: 0x0000719C, + 15906: 0x000071A7, + 15907: 0x000071B3, + 15908: 0x00007298, + 15909: 0x0000729A, + 15910: 0x00007358, + 15911: 0x00007352, + 15912: 0x0000735E, + 15913: 0x0000735F, + 15914: 0x00007360, + 15915: 0x0000735D, + 15916: 0x0000735B, + 15917: 0x00007361, + 15918: 0x0000735A, + 15919: 0x00007359, + 15920: 0x00007362, + 15921: 0x00007487, + 15922: 0x00007489, + 15923: 0x0000748A, + 15924: 0x00007486, + 15925: 0x00007481, + 15926: 0x0000747D, + 15927: 0x00007485, + 15928: 0x00007488, + 15929: 0x0000747C, + 15930: 0x00007479, + 15931: 0x00007508, + 15932: 0x00007507, + 15933: 0x0000757E, + 15934: 0x00007625, + 15935: 0x0000761E, + 15936: 0x00007619, + 15937: 0x0000761D, + 15938: 0x0000761C, + 15939: 0x00007623, + 15940: 0x0000761A, + 15941: 0x00007628, + 15942: 0x0000761B, + 15943: 0x0000769C, + 15944: 0x0000769D, + 15945: 0x0000769E, + 15946: 0x0000769B, + 15947: 0x0000778D, + 15948: 0x0000778F, + 15949: 0x00007789, + 15950: 0x00007788, + 15951: 0x000078CD, + 15952: 0x000078BB, + 15953: 0x000078CF, + 15954: 0x000078CC, + 15955: 0x000078D1, + 15956: 0x000078CE, + 15957: 0x000078D4, + 15958: 0x000078C8, + 15959: 0x000078C3, + 15960: 0x000078C4, + 15961: 0x000078C9, + 15962: 0x0000799A, + 15963: 0x000079A1, + 15964: 0x000079A0, + 15965: 0x0000799C, + 15966: 0x000079A2, + 15967: 0x0000799B, + 15968: 0x00006B76, + 15969: 0x00007A39, + 15970: 0x00007AB2, + 15971: 0x00007AB4, + 15972: 0x00007AB3, + 15973: 0x00007BB7, + 15974: 0x00007BCB, + 15975: 0x00007BBE, + 15976: 0x00007BAC, + 15977: 0x00007BCE, + 15978: 0x00007BAF, + 15979: 0x00007BB9, + 15980: 0x00007BCA, + 15981: 0x00007BB5, + 15982: 0x00007CC5, + 15983: 0x00007CC8, + 15984: 0x00007CCC, + 15985: 0x00007CCB, + 15986: 0x00007DF7, + 15987: 0x00007DDB, + 15988: 0x00007DEA, + 15989: 0x00007DE7, + 15990: 0x00007DD7, + 15991: 0x00007DE1, + 15992: 0x00007E03, + 15993: 0x00007DFA, + 15994: 0x00007DE6, + 15995: 0x00007DF6, + 15996: 0x00007DF1, + 15997: 0x00007DF0, + 15998: 0x00007DEE, + 15999: 0x00007DDF, + 16000: 0x00007F76, + 16001: 0x00007FAC, + 16002: 0x00007FB0, + 16003: 0x00007FAD, + 16004: 0x00007FED, + 16005: 0x00007FEB, + 16006: 0x00007FEA, + 16007: 0x00007FEC, + 16008: 0x00007FE6, + 16009: 0x00007FE8, + 16010: 0x00008064, + 16011: 0x00008067, + 16012: 0x000081A3, + 16013: 0x0000819F, + 16014: 0x0000819E, + 16015: 0x00008195, + 16016: 0x000081A2, + 16017: 0x00008199, + 16018: 0x00008197, + 16019: 0x00008216, + 16020: 0x0000824F, + 16021: 0x00008253, + 16022: 0x00008252, + 16023: 0x00008250, + 16024: 0x0000824E, + 16025: 0x00008251, + 16026: 0x00008524, + 16027: 0x0000853B, + 16028: 0x0000850F, + 16029: 0x00008500, + 16030: 0x00008529, + 16031: 0x0000850E, + 16032: 0x00008509, + 16033: 0x0000850D, + 16034: 0x0000851F, + 16035: 0x0000850A, + 16036: 0x00008527, + 16037: 0x0000851C, + 16038: 0x000084FB, + 16039: 0x0000852B, + 16040: 0x000084FA, + 16041: 0x00008508, + 16042: 0x0000850C, + 16043: 0x000084F4, + 16044: 0x0000852A, + 16045: 0x000084F2, + 16046: 0x00008515, + 16047: 0x000084F7, + 16048: 0x000084EB, + 16049: 0x000084F3, + 16050: 0x000084FC, + 16051: 0x00008512, + 16052: 0x000084EA, + 16053: 0x000084E9, + 16054: 0x00008516, + 16055: 0x000084FE, + 16056: 0x00008528, + 16057: 0x0000851D, + 16058: 0x0000852E, + 16059: 0x00008502, + 16060: 0x000084FD, + 16061: 0x0000851E, + 16062: 0x000084F6, + 16063: 0x00008531, + 16064: 0x00008526, + 16065: 0x000084E7, + 16066: 0x000084E8, + 16067: 0x000084F0, + 16068: 0x000084EF, + 16069: 0x000084F9, + 16070: 0x00008518, + 16071: 0x00008520, + 16072: 0x00008530, + 16073: 0x0000850B, + 16074: 0x00008519, + 16075: 0x0000852F, + 16076: 0x00008662, + 16077: 0x00008756, + 16078: 0x00008763, + 16079: 0x00008764, + 16080: 0x00008777, + 16081: 0x000087E1, + 16082: 0x00008773, + 16083: 0x00008758, + 16084: 0x00008754, + 16085: 0x0000875B, + 16086: 0x00008752, + 16087: 0x00008761, + 16088: 0x0000875A, + 16089: 0x00008751, + 16090: 0x0000875E, + 16091: 0x0000876D, + 16092: 0x0000876A, + 16093: 0x00008750, + 16094: 0x0000874E, + 16095: 0x0000875F, + 16096: 0x0000875D, + 16097: 0x0000876F, + 16098: 0x0000876C, + 16099: 0x0000877A, + 16100: 0x0000876E, + 16101: 0x0000875C, + 16102: 0x00008765, + 16103: 0x0000874F, + 16104: 0x0000877B, + 16105: 0x00008775, + 16106: 0x00008762, + 16107: 0x00008767, + 16108: 0x00008769, + 16109: 0x0000885A, + 16110: 0x00008905, + 16111: 0x0000890C, + 16112: 0x00008914, + 16113: 0x0000890B, + 16114: 0x00008917, + 16115: 0x00008918, + 16116: 0x00008919, + 16117: 0x00008906, + 16118: 0x00008916, + 16119: 0x00008911, + 16120: 0x0000890E, + 16121: 0x00008909, + 16122: 0x000089A2, + 16123: 0x000089A4, + 16124: 0x000089A3, + 16125: 0x000089ED, + 16126: 0x000089F0, + 16127: 0x000089EC, + 16128: 0x00008ACF, + 16129: 0x00008AC6, + 16130: 0x00008AB8, + 16131: 0x00008AD3, + 16132: 0x00008AD1, + 16133: 0x00008AD4, + 16134: 0x00008AD5, + 16135: 0x00008ABB, + 16136: 0x00008AD7, + 16137: 0x00008ABE, + 16138: 0x00008AC0, + 16139: 0x00008AC5, + 16140: 0x00008AD8, + 16141: 0x00008AC3, + 16142: 0x00008ABA, + 16143: 0x00008ABD, + 16144: 0x00008AD9, + 16145: 0x00008C3E, + 16146: 0x00008C4D, + 16147: 0x00008C8F, + 16148: 0x00008CE5, + 16149: 0x00008CDF, + 16150: 0x00008CD9, + 16151: 0x00008CE8, + 16152: 0x00008CDA, + 16153: 0x00008CDD, + 16154: 0x00008CE7, + 16155: 0x00008DA0, + 16156: 0x00008D9C, + 16157: 0x00008DA1, + 16158: 0x00008D9B, + 16159: 0x00008E20, + 16160: 0x00008E23, + 16161: 0x00008E25, + 16162: 0x00008E24, + 16163: 0x00008E2E, + 16164: 0x00008E15, + 16165: 0x00008E1B, + 16166: 0x00008E16, + 16167: 0x00008E11, + 16168: 0x00008E19, + 16169: 0x00008E26, + 16170: 0x00008E27, + 16171: 0x00008E14, + 16172: 0x00008E12, + 16173: 0x00008E18, + 16174: 0x00008E13, + 16175: 0x00008E1C, + 16176: 0x00008E17, + 16177: 0x00008E1A, + 16178: 0x00008F2C, + 16179: 0x00008F24, + 16180: 0x00008F18, + 16181: 0x00008F1A, + 16182: 0x00008F20, + 16183: 0x00008F23, + 16184: 0x00008F16, + 16185: 0x00008F17, + 16186: 0x00009073, + 16187: 0x00009070, + 16188: 0x0000906F, + 16189: 0x00009067, + 16190: 0x0000906B, + 16191: 0x0000912F, + 16192: 0x0000912B, + 16193: 0x00009129, + 16194: 0x0000912A, + 16195: 0x00009132, + 16196: 0x00009126, + 16197: 0x0000912E, + 16198: 0x00009185, + 16199: 0x00009186, + 16200: 0x0000918A, + 16201: 0x00009181, + 16202: 0x00009182, + 16203: 0x00009184, + 16204: 0x00009180, + 16205: 0x000092D0, + 16206: 0x000092C3, + 16207: 0x000092C4, + 16208: 0x000092C0, + 16209: 0x000092D9, + 16210: 0x000092B6, + 16211: 0x000092CF, + 16212: 0x000092F1, + 16213: 0x000092DF, + 16214: 0x000092D8, + 16215: 0x000092E9, + 16216: 0x000092D7, + 16217: 0x000092DD, + 16218: 0x000092CC, + 16219: 0x000092EF, + 16220: 0x000092C2, + 16221: 0x000092E8, + 16222: 0x000092CA, + 16223: 0x000092C8, + 16224: 0x000092CE, + 16225: 0x000092E6, + 16226: 0x000092CD, + 16227: 0x000092D5, + 16228: 0x000092C9, + 16229: 0x000092E0, + 16230: 0x000092DE, + 16231: 0x000092E7, + 16232: 0x000092D1, + 16233: 0x000092D3, + 16234: 0x000092B5, + 16235: 0x000092E1, + 16236: 0x000092C6, + 16237: 0x000092B4, + 16238: 0x0000957C, + 16239: 0x000095AC, + 16240: 0x000095AB, + 16241: 0x000095AE, + 16242: 0x000095B0, + 16243: 0x000096A4, + 16244: 0x000096A2, + 16245: 0x000096D3, + 16246: 0x00009705, + 16247: 0x00009708, + 16248: 0x00009702, + 16249: 0x0000975A, + 16250: 0x0000978A, + 16251: 0x0000978E, + 16252: 0x00009788, + 16253: 0x000097D0, + 16254: 0x000097CF, + 16255: 0x0000981E, + 16256: 0x0000981D, + 16257: 0x00009826, + 16258: 0x00009829, + 16259: 0x00009828, + 16260: 0x00009820, + 16261: 0x0000981B, + 16262: 0x00009827, + 16263: 0x000098B2, + 16264: 0x00009908, + 16265: 0x000098FA, + 16266: 0x00009911, + 16267: 0x00009914, + 16268: 0x00009916, + 16269: 0x00009917, + 16270: 0x00009915, + 16271: 0x000099DC, + 16272: 0x000099CD, + 16273: 0x000099CF, + 16274: 0x000099D3, + 16275: 0x000099D4, + 16276: 0x000099CE, + 16277: 0x000099C9, + 16278: 0x000099D6, + 16279: 0x000099D8, + 16280: 0x000099CB, + 16281: 0x000099D7, + 16282: 0x000099CC, + 16283: 0x00009AB3, + 16284: 0x00009AEC, + 16285: 0x00009AEB, + 16286: 0x00009AF3, + 16287: 0x00009AF2, + 16288: 0x00009AF1, + 16289: 0x00009B46, + 16290: 0x00009B43, + 16291: 0x00009B67, + 16292: 0x00009B74, + 16293: 0x00009B71, + 16294: 0x00009B66, + 16295: 0x00009B76, + 16296: 0x00009B75, + 16297: 0x00009B70, + 16298: 0x00009B68, + 16299: 0x00009B64, + 16300: 0x00009B6C, + 16301: 0x00009CFC, + 16302: 0x00009CFA, + 16303: 0x00009CFD, + 16304: 0x00009CFF, + 16305: 0x00009CF7, + 16306: 0x00009D07, + 16307: 0x00009D00, + 16308: 0x00009CF9, + 16309: 0x00009CFB, + 16310: 0x00009D08, + 16311: 0x00009D05, + 16312: 0x00009D04, + 16313: 0x00009E83, + 16314: 0x00009ED3, + 16315: 0x00009F0F, + 16316: 0x00009F10, + 16317: 0x0000511C, + 16318: 0x00005113, + 16319: 0x00005117, + 16320: 0x0000511A, + 16321: 0x00005111, + 16322: 0x000051DE, + 16323: 0x00005334, + 16324: 0x000053E1, + 16325: 0x00005670, + 16326: 0x00005660, + 16327: 0x0000566E, + 16328: 0x00005673, + 16329: 0x00005666, + 16330: 0x00005663, + 16331: 0x0000566D, + 16332: 0x00005672, + 16333: 0x0000565E, + 16334: 0x00005677, + 16335: 0x0000571C, + 16336: 0x0000571B, + 16337: 0x000058C8, + 16338: 0x000058BD, + 16339: 0x000058C9, + 16340: 0x000058BF, + 16341: 0x000058BA, + 16342: 0x000058C2, + 16343: 0x000058BC, + 16344: 0x000058C6, + 16345: 0x00005B17, + 16346: 0x00005B19, + 16347: 0x00005B1B, + 16348: 0x00005B21, + 16349: 0x00005B14, + 16350: 0x00005B13, + 16351: 0x00005B10, + 16352: 0x00005B16, + 16353: 0x00005B28, + 16354: 0x00005B1A, + 16355: 0x00005B20, + 16356: 0x00005B1E, + 16357: 0x00005BEF, + 16358: 0x00005DAC, + 16359: 0x00005DB1, + 16360: 0x00005DA9, + 16361: 0x00005DA7, + 16362: 0x00005DB5, + 16363: 0x00005DB0, + 16364: 0x00005DAE, + 16365: 0x00005DAA, + 16366: 0x00005DA8, + 16367: 0x00005DB2, + 16368: 0x00005DAD, + 16369: 0x00005DAF, + 16370: 0x00005DB4, + 16371: 0x00005E67, + 16372: 0x00005E68, + 16373: 0x00005E66, + 16374: 0x00005E6F, + 16375: 0x00005EE9, + 16376: 0x00005EE7, + 16377: 0x00005EE6, + 16378: 0x00005EE8, + 16379: 0x00005EE5, + 16380: 0x00005F4B, + 16381: 0x00005FBC, + 16382: 0x0000619D, + 16383: 0x000061A8, + 16384: 0x00006196, + 16385: 0x000061C5, + 16386: 0x000061B4, + 16387: 0x000061C6, + 16388: 0x000061C1, + 16389: 0x000061CC, + 16390: 0x000061BA, + 16391: 0x000061BF, + 16392: 0x000061B8, + 16393: 0x0000618C, + 16394: 0x000064D7, + 16395: 0x000064D6, + 16396: 0x000064D0, + 16397: 0x000064CF, + 16398: 0x000064C9, + 16399: 0x000064BD, + 16400: 0x00006489, + 16401: 0x000064C3, + 16402: 0x000064DB, + 16403: 0x000064F3, + 16404: 0x000064D9, + 16405: 0x00006533, + 16406: 0x0000657F, + 16407: 0x0000657C, + 16408: 0x000065A2, + 16409: 0x000066C8, + 16410: 0x000066BE, + 16411: 0x000066C0, + 16412: 0x000066CA, + 16413: 0x000066CB, + 16414: 0x000066CF, + 16415: 0x000066BD, + 16416: 0x000066BB, + 16417: 0x000066BA, + 16418: 0x000066CC, + 16419: 0x00006723, + 16420: 0x00006A34, + 16421: 0x00006A66, + 16422: 0x00006A49, + 16423: 0x00006A67, + 16424: 0x00006A32, + 16425: 0x00006A68, + 16426: 0x00006A3E, + 16427: 0x00006A5D, + 16428: 0x00006A6D, + 16429: 0x00006A76, + 16430: 0x00006A5B, + 16431: 0x00006A51, + 16432: 0x00006A28, + 16433: 0x00006A5A, + 16434: 0x00006A3B, + 16435: 0x00006A3F, + 16436: 0x00006A41, + 16437: 0x00006A6A, + 16438: 0x00006A64, + 16439: 0x00006A50, + 16440: 0x00006A4F, + 16441: 0x00006A54, + 16442: 0x00006A6F, + 16443: 0x00006A69, + 16444: 0x00006A60, + 16445: 0x00006A3C, + 16446: 0x00006A5E, + 16447: 0x00006A56, + 16448: 0x00006A55, + 16449: 0x00006A4D, + 16450: 0x00006A4E, + 16451: 0x00006A46, + 16452: 0x00006B55, + 16453: 0x00006B54, + 16454: 0x00006B56, + 16455: 0x00006BA7, + 16456: 0x00006BAA, + 16457: 0x00006BAB, + 16458: 0x00006BC8, + 16459: 0x00006BC7, + 16460: 0x00006C04, + 16461: 0x00006C03, + 16462: 0x00006C06, + 16463: 0x00006FAD, + 16464: 0x00006FCB, + 16465: 0x00006FA3, + 16466: 0x00006FC7, + 16467: 0x00006FBC, + 16468: 0x00006FCE, + 16469: 0x00006FC8, + 16470: 0x00006F5E, + 16471: 0x00006FC4, + 16472: 0x00006FBD, + 16473: 0x00006F9E, + 16474: 0x00006FCA, + 16475: 0x00006FA8, + 16476: 0x00007004, + 16477: 0x00006FA5, + 16478: 0x00006FAE, + 16479: 0x00006FBA, + 16480: 0x00006FAC, + 16481: 0x00006FAA, + 16482: 0x00006FCF, + 16483: 0x00006FBF, + 16484: 0x00006FB8, + 16485: 0x00006FA2, + 16486: 0x00006FC9, + 16487: 0x00006FAB, + 16488: 0x00006FCD, + 16489: 0x00006FAF, + 16490: 0x00006FB2, + 16491: 0x00006FB0, + 16492: 0x000071C5, + 16493: 0x000071C2, + 16494: 0x000071BF, + 16495: 0x000071B8, + 16496: 0x000071D6, + 16497: 0x000071C0, + 16498: 0x000071C1, + 16499: 0x000071CB, + 16500: 0x000071D4, + 16501: 0x000071CA, + 16502: 0x000071C7, + 16503: 0x000071CF, + 16504: 0x000071BD, + 16505: 0x000071D8, + 16506: 0x000071BC, + 16507: 0x000071C6, + 16508: 0x000071DA, + 16509: 0x000071DB, + 16510: 0x0000729D, + 16511: 0x0000729E, + 16512: 0x00007369, + 16513: 0x00007366, + 16514: 0x00007367, + 16515: 0x0000736C, + 16516: 0x00007365, + 16517: 0x0000736B, + 16518: 0x0000736A, + 16519: 0x0000747F, + 16520: 0x0000749A, + 16521: 0x000074A0, + 16522: 0x00007494, + 16523: 0x00007492, + 16524: 0x00007495, + 16525: 0x000074A1, + 16526: 0x0000750B, + 16527: 0x00007580, + 16528: 0x0000762F, + 16529: 0x0000762D, + 16530: 0x00007631, + 16531: 0x0000763D, + 16532: 0x00007633, + 16533: 0x0000763C, + 16534: 0x00007635, + 16535: 0x00007632, + 16536: 0x00007630, + 16537: 0x000076BB, + 16538: 0x000076E6, + 16539: 0x0000779A, + 16540: 0x0000779D, + 16541: 0x000077A1, + 16542: 0x0000779C, + 16543: 0x0000779B, + 16544: 0x000077A2, + 16545: 0x000077A3, + 16546: 0x00007795, + 16547: 0x00007799, + 16548: 0x00007797, + 16549: 0x000078DD, + 16550: 0x000078E9, + 16551: 0x000078E5, + 16552: 0x000078EA, + 16553: 0x000078DE, + 16554: 0x000078E3, + 16555: 0x000078DB, + 16556: 0x000078E1, + 16557: 0x000078E2, + 16558: 0x000078ED, + 16559: 0x000078DF, + 16560: 0x000078E0, + 16561: 0x000079A4, + 16562: 0x00007A44, + 16563: 0x00007A48, + 16564: 0x00007A47, + 16565: 0x00007AB6, + 16566: 0x00007AB8, + 16567: 0x00007AB5, + 16568: 0x00007AB1, + 16569: 0x00007AB7, + 16570: 0x00007BDE, + 16571: 0x00007BE3, + 16572: 0x00007BE7, + 16573: 0x00007BDD, + 16574: 0x00007BD5, + 16575: 0x00007BE5, + 16576: 0x00007BDA, + 16577: 0x00007BE8, + 16578: 0x00007BF9, + 16579: 0x00007BD4, + 16580: 0x00007BEA, + 16581: 0x00007BE2, + 16582: 0x00007BDC, + 16583: 0x00007BEB, + 16584: 0x00007BD8, + 16585: 0x00007BDF, + 16586: 0x00007CD2, + 16587: 0x00007CD4, + 16588: 0x00007CD7, + 16589: 0x00007CD0, + 16590: 0x00007CD1, + 16591: 0x00007E12, + 16592: 0x00007E21, + 16593: 0x00007E17, + 16594: 0x00007E0C, + 16595: 0x00007E1F, + 16596: 0x00007E20, + 16597: 0x00007E13, + 16598: 0x00007E0E, + 16599: 0x00007E1C, + 16600: 0x00007E15, + 16601: 0x00007E1A, + 16602: 0x00007E22, + 16603: 0x00007E0B, + 16604: 0x00007E0F, + 16605: 0x00007E16, + 16606: 0x00007E0D, + 16607: 0x00007E14, + 16608: 0x00007E25, + 16609: 0x00007E24, + 16610: 0x00007F43, + 16611: 0x00007F7B, + 16612: 0x00007F7C, + 16613: 0x00007F7A, + 16614: 0x00007FB1, + 16615: 0x00007FEF, + 16616: 0x0000802A, + 16617: 0x00008029, + 16618: 0x0000806C, + 16619: 0x000081B1, + 16620: 0x000081A6, + 16621: 0x000081AE, + 16622: 0x000081B9, + 16623: 0x000081B5, + 16624: 0x000081AB, + 16625: 0x000081B0, + 16626: 0x000081AC, + 16627: 0x000081B4, + 16628: 0x000081B2, + 16629: 0x000081B7, + 16630: 0x000081A7, + 16631: 0x000081F2, + 16632: 0x00008255, + 16633: 0x00008256, + 16634: 0x00008257, + 16635: 0x00008556, + 16636: 0x00008545, + 16637: 0x0000856B, + 16638: 0x0000854D, + 16639: 0x00008553, + 16640: 0x00008561, + 16641: 0x00008558, + 16642: 0x00008540, + 16643: 0x00008546, + 16644: 0x00008564, + 16645: 0x00008541, + 16646: 0x00008562, + 16647: 0x00008544, + 16648: 0x00008551, + 16649: 0x00008547, + 16650: 0x00008563, + 16651: 0x0000853E, + 16652: 0x0000855B, + 16653: 0x00008571, + 16654: 0x0000854E, + 16655: 0x0000856E, + 16656: 0x00008575, + 16657: 0x00008555, + 16658: 0x00008567, + 16659: 0x00008560, + 16660: 0x0000858C, + 16661: 0x00008566, + 16662: 0x0000855D, + 16663: 0x00008554, + 16664: 0x00008565, + 16665: 0x0000856C, + 16666: 0x00008663, + 16667: 0x00008665, + 16668: 0x00008664, + 16669: 0x0000879B, + 16670: 0x0000878F, + 16671: 0x00008797, + 16672: 0x00008793, + 16673: 0x00008792, + 16674: 0x00008788, + 16675: 0x00008781, + 16676: 0x00008796, + 16677: 0x00008798, + 16678: 0x00008779, + 16679: 0x00008787, + 16680: 0x000087A3, + 16681: 0x00008785, + 16682: 0x00008790, + 16683: 0x00008791, + 16684: 0x0000879D, + 16685: 0x00008784, + 16686: 0x00008794, + 16687: 0x0000879C, + 16688: 0x0000879A, + 16689: 0x00008789, + 16690: 0x0000891E, + 16691: 0x00008926, + 16692: 0x00008930, + 16693: 0x0000892D, + 16694: 0x0000892E, + 16695: 0x00008927, + 16696: 0x00008931, + 16697: 0x00008922, + 16698: 0x00008929, + 16699: 0x00008923, + 16700: 0x0000892F, + 16701: 0x0000892C, + 16702: 0x0000891F, + 16703: 0x000089F1, + 16704: 0x00008AE0, + 16705: 0x00008AE2, + 16706: 0x00008AF2, + 16707: 0x00008AF4, + 16708: 0x00008AF5, + 16709: 0x00008ADD, + 16710: 0x00008B14, + 16711: 0x00008AE4, + 16712: 0x00008ADF, + 16713: 0x00008AF0, + 16714: 0x00008AC8, + 16715: 0x00008ADE, + 16716: 0x00008AE1, + 16717: 0x00008AE8, + 16718: 0x00008AFF, + 16719: 0x00008AEF, + 16720: 0x00008AFB, + 16721: 0x00008C91, + 16722: 0x00008C92, + 16723: 0x00008C90, + 16724: 0x00008CF5, + 16725: 0x00008CEE, + 16726: 0x00008CF1, + 16727: 0x00008CF0, + 16728: 0x00008CF3, + 16729: 0x00008D6C, + 16730: 0x00008D6E, + 16731: 0x00008DA5, + 16732: 0x00008DA7, + 16733: 0x00008E33, + 16734: 0x00008E3E, + 16735: 0x00008E38, + 16736: 0x00008E40, + 16737: 0x00008E45, + 16738: 0x00008E36, + 16739: 0x00008E3C, + 16740: 0x00008E3D, + 16741: 0x00008E41, + 16742: 0x00008E30, + 16743: 0x00008E3F, + 16744: 0x00008EBD, + 16745: 0x00008F36, + 16746: 0x00008F2E, + 16747: 0x00008F35, + 16748: 0x00008F32, + 16749: 0x00008F39, + 16750: 0x00008F37, + 16751: 0x00008F34, + 16752: 0x00009076, + 16753: 0x00009079, + 16754: 0x0000907B, + 16755: 0x00009086, + 16756: 0x000090FA, + 16757: 0x00009133, + 16758: 0x00009135, + 16759: 0x00009136, + 16760: 0x00009193, + 16761: 0x00009190, + 16762: 0x00009191, + 16763: 0x0000918D, + 16764: 0x0000918F, + 16765: 0x00009327, + 16766: 0x0000931E, + 16767: 0x00009308, + 16768: 0x0000931F, + 16769: 0x00009306, + 16770: 0x0000930F, + 16771: 0x0000937A, + 16772: 0x00009338, + 16773: 0x0000933C, + 16774: 0x0000931B, + 16775: 0x00009323, + 16776: 0x00009312, + 16777: 0x00009301, + 16778: 0x00009346, + 16779: 0x0000932D, + 16780: 0x0000930E, + 16781: 0x0000930D, + 16782: 0x000092CB, + 16783: 0x0000931D, + 16784: 0x000092FA, + 16785: 0x00009325, + 16786: 0x00009313, + 16787: 0x000092F9, + 16788: 0x000092F7, + 16789: 0x00009334, + 16790: 0x00009302, + 16791: 0x00009324, + 16792: 0x000092FF, + 16793: 0x00009329, + 16794: 0x00009339, + 16795: 0x00009335, + 16796: 0x0000932A, + 16797: 0x00009314, + 16798: 0x0000930C, + 16799: 0x0000930B, + 16800: 0x000092FE, + 16801: 0x00009309, + 16802: 0x00009300, + 16803: 0x000092FB, + 16804: 0x00009316, + 16805: 0x000095BC, + 16806: 0x000095CD, + 16807: 0x000095BE, + 16808: 0x000095B9, + 16809: 0x000095BA, + 16810: 0x000095B6, + 16811: 0x000095BF, + 16812: 0x000095B5, + 16813: 0x000095BD, + 16814: 0x000096A9, + 16815: 0x000096D4, + 16816: 0x0000970B, + 16817: 0x00009712, + 16818: 0x00009710, + 16819: 0x00009799, + 16820: 0x00009797, + 16821: 0x00009794, + 16822: 0x000097F0, + 16823: 0x000097F8, + 16824: 0x00009835, + 16825: 0x0000982F, + 16826: 0x00009832, + 16827: 0x00009924, + 16828: 0x0000991F, + 16829: 0x00009927, + 16830: 0x00009929, + 16831: 0x0000999E, + 16832: 0x000099EE, + 16833: 0x000099EC, + 16834: 0x000099E5, + 16835: 0x000099E4, + 16836: 0x000099F0, + 16837: 0x000099E3, + 16838: 0x000099EA, + 16839: 0x000099E9, + 16840: 0x000099E7, + 16841: 0x00009AB9, + 16842: 0x00009ABF, + 16843: 0x00009AB4, + 16844: 0x00009ABB, + 16845: 0x00009AF6, + 16846: 0x00009AFA, + 16847: 0x00009AF9, + 16848: 0x00009AF7, + 16849: 0x00009B33, + 16850: 0x00009B80, + 16851: 0x00009B85, + 16852: 0x00009B87, + 16853: 0x00009B7C, + 16854: 0x00009B7E, + 16855: 0x00009B7B, + 16856: 0x00009B82, + 16857: 0x00009B93, + 16858: 0x00009B92, + 16859: 0x00009B90, + 16860: 0x00009B7A, + 16861: 0x00009B95, + 16862: 0x00009B7D, + 16863: 0x00009B88, + 16864: 0x00009D25, + 16865: 0x00009D17, + 16866: 0x00009D20, + 16867: 0x00009D1E, + 16868: 0x00009D14, + 16869: 0x00009D29, + 16870: 0x00009D1D, + 16871: 0x00009D18, + 16872: 0x00009D22, + 16873: 0x00009D10, + 16874: 0x00009D19, + 16875: 0x00009D1F, + 16876: 0x00009E88, + 16877: 0x00009E86, + 16878: 0x00009E87, + 16879: 0x00009EAE, + 16880: 0x00009EAD, + 16881: 0x00009ED5, + 16882: 0x00009ED6, + 16883: 0x00009EFA, + 16884: 0x00009F12, + 16885: 0x00009F3D, + 16886: 0x00005126, + 16887: 0x00005125, + 16888: 0x00005122, + 16889: 0x00005124, + 16890: 0x00005120, + 16891: 0x00005129, + 16892: 0x000052F4, + 16893: 0x00005693, + 16894: 0x0000568C, + 16895: 0x0000568D, + 16896: 0x00005686, + 16897: 0x00005684, + 16898: 0x00005683, + 16899: 0x0000567E, + 16900: 0x00005682, + 16901: 0x0000567F, + 16902: 0x00005681, + 16903: 0x000058D6, + 16904: 0x000058D4, + 16905: 0x000058CF, + 16906: 0x000058D2, + 16907: 0x00005B2D, + 16908: 0x00005B25, + 16909: 0x00005B32, + 16910: 0x00005B23, + 16911: 0x00005B2C, + 16912: 0x00005B27, + 16913: 0x00005B26, + 16914: 0x00005B2F, + 16915: 0x00005B2E, + 16916: 0x00005B7B, + 16917: 0x00005BF1, + 16918: 0x00005BF2, + 16919: 0x00005DB7, + 16920: 0x00005E6C, + 16921: 0x00005E6A, + 16922: 0x00005FBE, + 16923: 0x00005FBB, + 16924: 0x000061C3, + 16925: 0x000061B5, + 16926: 0x000061BC, + 16927: 0x000061E7, + 16928: 0x000061E0, + 16929: 0x000061E5, + 16930: 0x000061E4, + 16931: 0x000061E8, + 16932: 0x000061DE, + 16933: 0x000064EF, + 16934: 0x000064E9, + 16935: 0x000064E3, + 16936: 0x000064EB, + 16937: 0x000064E4, + 16938: 0x000064E8, + 16939: 0x00006581, + 16940: 0x00006580, + 16941: 0x000065B6, + 16942: 0x000065DA, + 16943: 0x000066D2, + 16944: 0x00006A8D, + 16945: 0x00006A96, + 16946: 0x00006A81, + 16947: 0x00006AA5, + 16948: 0x00006A89, + 16949: 0x00006A9F, + 16950: 0x00006A9B, + 16951: 0x00006AA1, + 16952: 0x00006A9E, + 16953: 0x00006A87, + 16954: 0x00006A93, + 16955: 0x00006A8E, + 16956: 0x00006A95, + 16957: 0x00006A83, + 16958: 0x00006AA8, + 16959: 0x00006AA4, + 16960: 0x00006A91, + 16961: 0x00006A7F, + 16962: 0x00006AA6, + 16963: 0x00006A9A, + 16964: 0x00006A85, + 16965: 0x00006A8C, + 16966: 0x00006A92, + 16967: 0x00006B5B, + 16968: 0x00006BAD, + 16969: 0x00006C09, + 16970: 0x00006FCC, + 16971: 0x00006FA9, + 16972: 0x00006FF4, + 16973: 0x00006FD4, + 16974: 0x00006FE3, + 16975: 0x00006FDC, + 16976: 0x00006FED, + 16977: 0x00006FE7, + 16978: 0x00006FE6, + 16979: 0x00006FDE, + 16980: 0x00006FF2, + 16981: 0x00006FDD, + 16982: 0x00006FE2, + 16983: 0x00006FE8, + 16984: 0x000071E1, + 16985: 0x000071F1, + 16986: 0x000071E8, + 16987: 0x000071F2, + 16988: 0x000071E4, + 16989: 0x000071F0, + 16990: 0x000071E2, + 16991: 0x00007373, + 16992: 0x0000736E, + 16993: 0x0000736F, + 16994: 0x00007497, + 16995: 0x000074B2, + 16996: 0x000074AB, + 16997: 0x00007490, + 16998: 0x000074AA, + 16999: 0x000074AD, + 17000: 0x000074B1, + 17001: 0x000074A5, + 17002: 0x000074AF, + 17003: 0x00007510, + 17004: 0x00007511, + 17005: 0x00007512, + 17006: 0x0000750F, + 17007: 0x00007584, + 17008: 0x00007643, + 17009: 0x00007648, + 17010: 0x00007649, + 17011: 0x00007647, + 17012: 0x000076A4, + 17013: 0x000076E9, + 17014: 0x000077B5, + 17015: 0x000077AB, + 17016: 0x000077B2, + 17017: 0x000077B7, + 17018: 0x000077B6, + 17019: 0x000077B4, + 17020: 0x000077B1, + 17021: 0x000077A8, + 17022: 0x000077F0, + 17023: 0x000078F3, + 17024: 0x000078FD, + 17025: 0x00007902, + 17026: 0x000078FB, + 17027: 0x000078FC, + 17028: 0x000078F2, + 17029: 0x00007905, + 17030: 0x000078F9, + 17031: 0x000078FE, + 17032: 0x00007904, + 17033: 0x000079AB, + 17034: 0x000079A8, + 17035: 0x00007A5C, + 17036: 0x00007A5B, + 17037: 0x00007A56, + 17038: 0x00007A58, + 17039: 0x00007A54, + 17040: 0x00007A5A, + 17041: 0x00007ABE, + 17042: 0x00007AC0, + 17043: 0x00007AC1, + 17044: 0x00007C05, + 17045: 0x00007C0F, + 17046: 0x00007BF2, + 17047: 0x00007C00, + 17048: 0x00007BFF, + 17049: 0x00007BFB, + 17050: 0x00007C0E, + 17051: 0x00007BF4, + 17052: 0x00007C0B, + 17053: 0x00007BF3, + 17054: 0x00007C02, + 17055: 0x00007C09, + 17056: 0x00007C03, + 17057: 0x00007C01, + 17058: 0x00007BF8, + 17059: 0x00007BFD, + 17060: 0x00007C06, + 17061: 0x00007BF0, + 17062: 0x00007BF1, + 17063: 0x00007C10, + 17064: 0x00007C0A, + 17065: 0x00007CE8, + 17066: 0x00007E2D, + 17067: 0x00007E3C, + 17068: 0x00007E42, + 17069: 0x00007E33, + 17070: 0x00009848, + 17071: 0x00007E38, + 17072: 0x00007E2A, + 17073: 0x00007E49, + 17074: 0x00007E40, + 17075: 0x00007E47, + 17076: 0x00007E29, + 17077: 0x00007E4C, + 17078: 0x00007E30, + 17079: 0x00007E3B, + 17080: 0x00007E36, + 17081: 0x00007E44, + 17082: 0x00007E3A, + 17083: 0x00007F45, + 17084: 0x00007F7F, + 17085: 0x00007F7E, + 17086: 0x00007F7D, + 17087: 0x00007FF4, + 17088: 0x00007FF2, + 17089: 0x0000802C, + 17090: 0x000081BB, + 17091: 0x000081C4, + 17092: 0x000081CC, + 17093: 0x000081CA, + 17094: 0x000081C5, + 17095: 0x000081C7, + 17096: 0x000081BC, + 17097: 0x000081E9, + 17098: 0x0000825B, + 17099: 0x0000825A, + 17100: 0x0000825C, + 17101: 0x00008583, + 17102: 0x00008580, + 17103: 0x0000858F, + 17104: 0x000085A7, + 17105: 0x00008595, + 17106: 0x000085A0, + 17107: 0x0000858B, + 17108: 0x000085A3, + 17109: 0x0000857B, + 17110: 0x000085A4, + 17111: 0x0000859A, + 17112: 0x0000859E, + 17113: 0x00008577, + 17114: 0x0000857C, + 17115: 0x00008589, + 17116: 0x000085A1, + 17117: 0x0000857A, + 17118: 0x00008578, + 17119: 0x00008557, + 17120: 0x0000858E, + 17121: 0x00008596, + 17122: 0x00008586, + 17123: 0x0000858D, + 17124: 0x00008599, + 17125: 0x0000859D, + 17126: 0x00008581, + 17127: 0x000085A2, + 17128: 0x00008582, + 17129: 0x00008588, + 17130: 0x00008585, + 17131: 0x00008579, + 17132: 0x00008576, + 17133: 0x00008598, + 17134: 0x00008590, + 17135: 0x0000859F, + 17136: 0x00008668, + 17137: 0x000087BE, + 17138: 0x000087AA, + 17139: 0x000087AD, + 17140: 0x000087C5, + 17141: 0x000087B0, + 17142: 0x000087AC, + 17143: 0x000087B9, + 17144: 0x000087B5, + 17145: 0x000087BC, + 17146: 0x000087AE, + 17147: 0x000087C9, + 17148: 0x000087C3, + 17149: 0x000087C2, + 17150: 0x000087CC, + 17151: 0x000087B7, + 17152: 0x000087AF, + 17153: 0x000087C4, + 17154: 0x000087CA, + 17155: 0x000087B4, + 17156: 0x000087B6, + 17157: 0x000087BF, + 17158: 0x000087B8, + 17159: 0x000087BD, + 17160: 0x000087DE, + 17161: 0x000087B2, + 17162: 0x00008935, + 17163: 0x00008933, + 17164: 0x0000893C, + 17165: 0x0000893E, + 17166: 0x00008941, + 17167: 0x00008952, + 17168: 0x00008937, + 17169: 0x00008942, + 17170: 0x000089AD, + 17171: 0x000089AF, + 17172: 0x000089AE, + 17173: 0x000089F2, + 17174: 0x000089F3, + 17175: 0x00008B1E, + 17176: 0x00008B18, + 17177: 0x00008B16, + 17178: 0x00008B11, + 17179: 0x00008B05, + 17180: 0x00008B0B, + 17181: 0x00008B22, + 17182: 0x00008B0F, + 17183: 0x00008B12, + 17184: 0x00008B15, + 17185: 0x00008B07, + 17186: 0x00008B0D, + 17187: 0x00008B08, + 17188: 0x00008B06, + 17189: 0x00008B1C, + 17190: 0x00008B13, + 17191: 0x00008B1A, + 17192: 0x00008C4F, + 17193: 0x00008C70, + 17194: 0x00008C72, + 17195: 0x00008C71, + 17196: 0x00008C6F, + 17197: 0x00008C95, + 17198: 0x00008C94, + 17199: 0x00008CF9, + 17200: 0x00008D6F, + 17201: 0x00008E4E, + 17202: 0x00008E4D, + 17203: 0x00008E53, + 17204: 0x00008E50, + 17205: 0x00008E4C, + 17206: 0x00008E47, + 17207: 0x00008F43, + 17208: 0x00008F40, + 17209: 0x00009085, + 17210: 0x0000907E, + 17211: 0x00009138, + 17212: 0x0000919A, + 17213: 0x000091A2, + 17214: 0x0000919B, + 17215: 0x00009199, + 17216: 0x0000919F, + 17217: 0x000091A1, + 17218: 0x0000919D, + 17219: 0x000091A0, + 17220: 0x000093A1, + 17221: 0x00009383, + 17222: 0x000093AF, + 17223: 0x00009364, + 17224: 0x00009356, + 17225: 0x00009347, + 17226: 0x0000937C, + 17227: 0x00009358, + 17228: 0x0000935C, + 17229: 0x00009376, + 17230: 0x00009349, + 17231: 0x00009350, + 17232: 0x00009351, + 17233: 0x00009360, + 17234: 0x0000936D, + 17235: 0x0000938F, + 17236: 0x0000934C, + 17237: 0x0000936A, + 17238: 0x00009379, + 17239: 0x00009357, + 17240: 0x00009355, + 17241: 0x00009352, + 17242: 0x0000934F, + 17243: 0x00009371, + 17244: 0x00009377, + 17245: 0x0000937B, + 17246: 0x00009361, + 17247: 0x0000935E, + 17248: 0x00009363, + 17249: 0x00009367, + 17250: 0x00009380, + 17251: 0x0000934E, + 17252: 0x00009359, + 17253: 0x000095C7, + 17254: 0x000095C0, + 17255: 0x000095C9, + 17256: 0x000095C3, + 17257: 0x000095C5, + 17258: 0x000095B7, + 17259: 0x000096AE, + 17260: 0x000096B0, + 17261: 0x000096AC, + 17262: 0x00009720, + 17263: 0x0000971F, + 17264: 0x00009718, + 17265: 0x0000971D, + 17266: 0x00009719, + 17267: 0x0000979A, + 17268: 0x000097A1, + 17269: 0x0000979C, + 17270: 0x0000979E, + 17271: 0x0000979D, + 17272: 0x000097D5, + 17273: 0x000097D4, + 17274: 0x000097F1, + 17275: 0x00009841, + 17276: 0x00009844, + 17277: 0x0000984A, + 17278: 0x00009849, + 17279: 0x00009845, + 17280: 0x00009843, + 17281: 0x00009925, + 17282: 0x0000992B, + 17283: 0x0000992C, + 17284: 0x0000992A, + 17285: 0x00009933, + 17286: 0x00009932, + 17287: 0x0000992F, + 17288: 0x0000992D, + 17289: 0x00009931, + 17290: 0x00009930, + 17291: 0x00009998, + 17292: 0x000099A3, + 17293: 0x000099A1, + 17294: 0x00009A02, + 17295: 0x000099FA, + 17296: 0x000099F4, + 17297: 0x000099F7, + 17298: 0x000099F9, + 17299: 0x000099F8, + 17300: 0x000099F6, + 17301: 0x000099FB, + 17302: 0x000099FD, + 17303: 0x000099FE, + 17304: 0x000099FC, + 17305: 0x00009A03, + 17306: 0x00009ABE, + 17307: 0x00009AFE, + 17308: 0x00009AFD, + 17309: 0x00009B01, + 17310: 0x00009AFC, + 17311: 0x00009B48, + 17312: 0x00009B9A, + 17313: 0x00009BA8, + 17314: 0x00009B9E, + 17315: 0x00009B9B, + 17316: 0x00009BA6, + 17317: 0x00009BA1, + 17318: 0x00009BA5, + 17319: 0x00009BA4, + 17320: 0x00009B86, + 17321: 0x00009BA2, + 17322: 0x00009BA0, + 17323: 0x00009BAF, + 17324: 0x00009D33, + 17325: 0x00009D41, + 17326: 0x00009D67, + 17327: 0x00009D36, + 17328: 0x00009D2E, + 17329: 0x00009D2F, + 17330: 0x00009D31, + 17331: 0x00009D38, + 17332: 0x00009D30, + 17333: 0x00009D45, + 17334: 0x00009D42, + 17335: 0x00009D43, + 17336: 0x00009D3E, + 17337: 0x00009D37, + 17338: 0x00009D40, + 17339: 0x00009D3D, + 17340: 0x00007FF5, + 17341: 0x00009D2D, + 17342: 0x00009E8A, + 17343: 0x00009E89, + 17344: 0x00009E8D, + 17345: 0x00009EB0, + 17346: 0x00009EC8, + 17347: 0x00009EDA, + 17348: 0x00009EFB, + 17349: 0x00009EFF, + 17350: 0x00009F24, + 17351: 0x00009F23, + 17352: 0x00009F22, + 17353: 0x00009F54, + 17354: 0x00009FA0, + 17355: 0x00005131, + 17356: 0x0000512D, + 17357: 0x0000512E, + 17358: 0x00005698, + 17359: 0x0000569C, + 17360: 0x00005697, + 17361: 0x0000569A, + 17362: 0x0000569D, + 17363: 0x00005699, + 17364: 0x00005970, + 17365: 0x00005B3C, + 17366: 0x00005C69, + 17367: 0x00005C6A, + 17368: 0x00005DC0, + 17369: 0x00005E6D, + 17370: 0x00005E6E, + 17371: 0x000061D8, + 17372: 0x000061DF, + 17373: 0x000061ED, + 17374: 0x000061EE, + 17375: 0x000061F1, + 17376: 0x000061EA, + 17377: 0x000061F0, + 17378: 0x000061EB, + 17379: 0x000061D6, + 17380: 0x000061E9, + 17381: 0x000064FF, + 17382: 0x00006504, + 17383: 0x000064FD, + 17384: 0x000064F8, + 17385: 0x00006501, + 17386: 0x00006503, + 17387: 0x000064FC, + 17388: 0x00006594, + 17389: 0x000065DB, + 17390: 0x000066DA, + 17391: 0x000066DB, + 17392: 0x000066D8, + 17393: 0x00006AC5, + 17394: 0x00006AB9, + 17395: 0x00006ABD, + 17396: 0x00006AE1, + 17397: 0x00006AC6, + 17398: 0x00006ABA, + 17399: 0x00006AB6, + 17400: 0x00006AB7, + 17401: 0x00006AC7, + 17402: 0x00006AB4, + 17403: 0x00006AAD, + 17404: 0x00006B5E, + 17405: 0x00006BC9, + 17406: 0x00006C0B, + 17407: 0x00007007, + 17408: 0x0000700C, + 17409: 0x0000700D, + 17410: 0x00007001, + 17411: 0x00007005, + 17412: 0x00007014, + 17413: 0x0000700E, + 17414: 0x00006FFF, + 17415: 0x00007000, + 17416: 0x00006FFB, + 17417: 0x00007026, + 17418: 0x00006FFC, + 17419: 0x00006FF7, + 17420: 0x0000700A, + 17421: 0x00007201, + 17422: 0x000071FF, + 17423: 0x000071F9, + 17424: 0x00007203, + 17425: 0x000071FD, + 17426: 0x00007376, + 17427: 0x000074B8, + 17428: 0x000074C0, + 17429: 0x000074B5, + 17430: 0x000074C1, + 17431: 0x000074BE, + 17432: 0x000074B6, + 17433: 0x000074BB, + 17434: 0x000074C2, + 17435: 0x00007514, + 17436: 0x00007513, + 17437: 0x0000765C, + 17438: 0x00007664, + 17439: 0x00007659, + 17440: 0x00007650, + 17441: 0x00007653, + 17442: 0x00007657, + 17443: 0x0000765A, + 17444: 0x000076A6, + 17445: 0x000076BD, + 17446: 0x000076EC, + 17447: 0x000077C2, + 17448: 0x000077BA, + 17449: 0x000078FF, + 17450: 0x0000790C, + 17451: 0x00007913, + 17452: 0x00007914, + 17453: 0x00007909, + 17454: 0x00007910, + 17455: 0x00007912, + 17456: 0x00007911, + 17457: 0x000079AD, + 17458: 0x000079AC, + 17459: 0x00007A5F, + 17460: 0x00007C1C, + 17461: 0x00007C29, + 17462: 0x00007C19, + 17463: 0x00007C20, + 17464: 0x00007C1F, + 17465: 0x00007C2D, + 17466: 0x00007C1D, + 17467: 0x00007C26, + 17468: 0x00007C28, + 17469: 0x00007C22, + 17470: 0x00007C25, + 17471: 0x00007C30, + 17472: 0x00007E5C, + 17473: 0x00007E50, + 17474: 0x00007E56, + 17475: 0x00007E63, + 17476: 0x00007E58, + 17477: 0x00007E62, + 17478: 0x00007E5F, + 17479: 0x00007E51, + 17480: 0x00007E60, + 17481: 0x00007E57, + 17482: 0x00007E53, + 17483: 0x00007FB5, + 17484: 0x00007FB3, + 17485: 0x00007FF7, + 17486: 0x00007FF8, + 17487: 0x00008075, + 17488: 0x000081D1, + 17489: 0x000081D2, + 17490: 0x000081D0, + 17491: 0x0000825F, + 17492: 0x0000825E, + 17493: 0x000085B4, + 17494: 0x000085C6, + 17495: 0x000085C0, + 17496: 0x000085C3, + 17497: 0x000085C2, + 17498: 0x000085B3, + 17499: 0x000085B5, + 17500: 0x000085BD, + 17501: 0x000085C7, + 17502: 0x000085C4, + 17503: 0x000085BF, + 17504: 0x000085CB, + 17505: 0x000085CE, + 17506: 0x000085C8, + 17507: 0x000085C5, + 17508: 0x000085B1, + 17509: 0x000085B6, + 17510: 0x000085D2, + 17511: 0x00008624, + 17512: 0x000085B8, + 17513: 0x000085B7, + 17514: 0x000085BE, + 17515: 0x00008669, + 17516: 0x000087E7, + 17517: 0x000087E6, + 17518: 0x000087E2, + 17519: 0x000087DB, + 17520: 0x000087EB, + 17521: 0x000087EA, + 17522: 0x000087E5, + 17523: 0x000087DF, + 17524: 0x000087F3, + 17525: 0x000087E4, + 17526: 0x000087D4, + 17527: 0x000087DC, + 17528: 0x000087D3, + 17529: 0x000087ED, + 17530: 0x000087D8, + 17531: 0x000087E3, + 17532: 0x000087A4, + 17533: 0x000087D7, + 17534: 0x000087D9, + 17535: 0x00008801, + 17536: 0x000087F4, + 17537: 0x000087E8, + 17538: 0x000087DD, + 17539: 0x00008953, + 17540: 0x0000894B, + 17541: 0x0000894F, + 17542: 0x0000894C, + 17543: 0x00008946, + 17544: 0x00008950, + 17545: 0x00008951, + 17546: 0x00008949, + 17547: 0x00008B2A, + 17548: 0x00008B27, + 17549: 0x00008B23, + 17550: 0x00008B33, + 17551: 0x00008B30, + 17552: 0x00008B35, + 17553: 0x00008B47, + 17554: 0x00008B2F, + 17555: 0x00008B3C, + 17556: 0x00008B3E, + 17557: 0x00008B31, + 17558: 0x00008B25, + 17559: 0x00008B37, + 17560: 0x00008B26, + 17561: 0x00008B36, + 17562: 0x00008B2E, + 17563: 0x00008B24, + 17564: 0x00008B3B, + 17565: 0x00008B3D, + 17566: 0x00008B3A, + 17567: 0x00008C42, + 17568: 0x00008C75, + 17569: 0x00008C99, + 17570: 0x00008C98, + 17571: 0x00008C97, + 17572: 0x00008CFE, + 17573: 0x00008D04, + 17574: 0x00008D02, + 17575: 0x00008D00, + 17576: 0x00008E5C, + 17577: 0x00008E62, + 17578: 0x00008E60, + 17579: 0x00008E57, + 17580: 0x00008E56, + 17581: 0x00008E5E, + 17582: 0x00008E65, + 17583: 0x00008E67, + 17584: 0x00008E5B, + 17585: 0x00008E5A, + 17586: 0x00008E61, + 17587: 0x00008E5D, + 17588: 0x00008E69, + 17589: 0x00008E54, + 17590: 0x00008F46, + 17591: 0x00008F47, + 17592: 0x00008F48, + 17593: 0x00008F4B, + 17594: 0x00009128, + 17595: 0x0000913A, + 17596: 0x0000913B, + 17597: 0x0000913E, + 17598: 0x000091A8, + 17599: 0x000091A5, + 17600: 0x000091A7, + 17601: 0x000091AF, + 17602: 0x000091AA, + 17603: 0x000093B5, + 17604: 0x0000938C, + 17605: 0x00009392, + 17606: 0x000093B7, + 17607: 0x0000939B, + 17608: 0x0000939D, + 17609: 0x00009389, + 17610: 0x000093A7, + 17611: 0x0000938E, + 17612: 0x000093AA, + 17613: 0x0000939E, + 17614: 0x000093A6, + 17615: 0x00009395, + 17616: 0x00009388, + 17617: 0x00009399, + 17618: 0x0000939F, + 17619: 0x0000938D, + 17620: 0x000093B1, + 17621: 0x00009391, + 17622: 0x000093B2, + 17623: 0x000093A4, + 17624: 0x000093A8, + 17625: 0x000093B4, + 17626: 0x000093A3, + 17627: 0x000093A5, + 17628: 0x000095D2, + 17629: 0x000095D3, + 17630: 0x000095D1, + 17631: 0x000096B3, + 17632: 0x000096D7, + 17633: 0x000096DA, + 17634: 0x00005DC2, + 17635: 0x000096DF, + 17636: 0x000096D8, + 17637: 0x000096DD, + 17638: 0x00009723, + 17639: 0x00009722, + 17640: 0x00009725, + 17641: 0x000097AC, + 17642: 0x000097AE, + 17643: 0x000097A8, + 17644: 0x000097AB, + 17645: 0x000097A4, + 17646: 0x000097AA, + 17647: 0x000097A2, + 17648: 0x000097A5, + 17649: 0x000097D7, + 17650: 0x000097D9, + 17651: 0x000097D6, + 17652: 0x000097D8, + 17653: 0x000097FA, + 17654: 0x00009850, + 17655: 0x00009851, + 17656: 0x00009852, + 17657: 0x000098B8, + 17658: 0x00009941, + 17659: 0x0000993C, + 17660: 0x0000993A, + 17661: 0x00009A0F, + 17662: 0x00009A0B, + 17663: 0x00009A09, + 17664: 0x00009A0D, + 17665: 0x00009A04, + 17666: 0x00009A11, + 17667: 0x00009A0A, + 17668: 0x00009A05, + 17669: 0x00009A07, + 17670: 0x00009A06, + 17671: 0x00009AC0, + 17672: 0x00009ADC, + 17673: 0x00009B08, + 17674: 0x00009B04, + 17675: 0x00009B05, + 17676: 0x00009B29, + 17677: 0x00009B35, + 17678: 0x00009B4A, + 17679: 0x00009B4C, + 17680: 0x00009B4B, + 17681: 0x00009BC7, + 17682: 0x00009BC6, + 17683: 0x00009BC3, + 17684: 0x00009BBF, + 17685: 0x00009BC1, + 17686: 0x00009BB5, + 17687: 0x00009BB8, + 17688: 0x00009BD3, + 17689: 0x00009BB6, + 17690: 0x00009BC4, + 17691: 0x00009BB9, + 17692: 0x00009BBD, + 17693: 0x00009D5C, + 17694: 0x00009D53, + 17695: 0x00009D4F, + 17696: 0x00009D4A, + 17697: 0x00009D5B, + 17698: 0x00009D4B, + 17699: 0x00009D59, + 17700: 0x00009D56, + 17701: 0x00009D4C, + 17702: 0x00009D57, + 17703: 0x00009D52, + 17704: 0x00009D54, + 17705: 0x00009D5F, + 17706: 0x00009D58, + 17707: 0x00009D5A, + 17708: 0x00009E8E, + 17709: 0x00009E8C, + 17710: 0x00009EDF, + 17711: 0x00009F01, + 17712: 0x00009F00, + 17713: 0x00009F16, + 17714: 0x00009F25, + 17715: 0x00009F2B, + 17716: 0x00009F2A, + 17717: 0x00009F29, + 17718: 0x00009F28, + 17719: 0x00009F4C, + 17720: 0x00009F55, + 17721: 0x00005134, + 17722: 0x00005135, + 17723: 0x00005296, + 17724: 0x000052F7, + 17725: 0x000053B4, + 17726: 0x000056AB, + 17727: 0x000056AD, + 17728: 0x000056A6, + 17729: 0x000056A7, + 17730: 0x000056AA, + 17731: 0x000056AC, + 17732: 0x000058DA, + 17733: 0x000058DD, + 17734: 0x000058DB, + 17735: 0x00005912, + 17736: 0x00005B3D, + 17737: 0x00005B3E, + 17738: 0x00005B3F, + 17739: 0x00005DC3, + 17740: 0x00005E70, + 17741: 0x00005FBF, + 17742: 0x000061FB, + 17743: 0x00006507, + 17744: 0x00006510, + 17745: 0x0000650D, + 17746: 0x00006509, + 17747: 0x0000650C, + 17748: 0x0000650E, + 17749: 0x00006584, + 17750: 0x000065DE, + 17751: 0x000065DD, + 17752: 0x000066DE, + 17753: 0x00006AE7, + 17754: 0x00006AE0, + 17755: 0x00006ACC, + 17756: 0x00006AD1, + 17757: 0x00006AD9, + 17758: 0x00006ACB, + 17759: 0x00006ADF, + 17760: 0x00006ADC, + 17761: 0x00006AD0, + 17762: 0x00006AEB, + 17763: 0x00006ACF, + 17764: 0x00006ACD, + 17765: 0x00006ADE, + 17766: 0x00006B60, + 17767: 0x00006BB0, + 17768: 0x00006C0C, + 17769: 0x00007019, + 17770: 0x00007027, + 17771: 0x00007020, + 17772: 0x00007016, + 17773: 0x0000702B, + 17774: 0x00007021, + 17775: 0x00007022, + 17776: 0x00007023, + 17777: 0x00007029, + 17778: 0x00007017, + 17779: 0x00007024, + 17780: 0x0000701C, + 17781: 0x0000702A, + 17782: 0x0000720C, + 17783: 0x0000720A, + 17784: 0x00007207, + 17785: 0x00007202, + 17786: 0x00007205, + 17787: 0x000072A5, + 17788: 0x000072A6, + 17789: 0x000072A4, + 17790: 0x000072A3, + 17791: 0x000072A1, + 17792: 0x000074CB, + 17793: 0x000074C5, + 17794: 0x000074B7, + 17795: 0x000074C3, + 17796: 0x00007516, + 17797: 0x00007660, + 17798: 0x000077C9, + 17799: 0x000077CA, + 17800: 0x000077C4, + 17801: 0x000077F1, + 17802: 0x0000791D, + 17803: 0x0000791B, + 17804: 0x00007921, + 17805: 0x0000791C, + 17806: 0x00007917, + 17807: 0x0000791E, + 17808: 0x000079B0, + 17809: 0x00007A67, + 17810: 0x00007A68, + 17811: 0x00007C33, + 17812: 0x00007C3C, + 17813: 0x00007C39, + 17814: 0x00007C2C, + 17815: 0x00007C3B, + 17816: 0x00007CEC, + 17817: 0x00007CEA, + 17818: 0x00007E76, + 17819: 0x00007E75, + 17820: 0x00007E78, + 17821: 0x00007E70, + 17822: 0x00007E77, + 17823: 0x00007E6F, + 17824: 0x00007E7A, + 17825: 0x00007E72, + 17826: 0x00007E74, + 17827: 0x00007E68, + 17828: 0x00007F4B, + 17829: 0x00007F4A, + 17830: 0x00007F83, + 17831: 0x00007F86, + 17832: 0x00007FB7, + 17833: 0x00007FFD, + 17834: 0x00007FFE, + 17835: 0x00008078, + 17836: 0x000081D7, + 17837: 0x000081D5, + 17838: 0x00008264, + 17839: 0x00008261, + 17840: 0x00008263, + 17841: 0x000085EB, + 17842: 0x000085F1, + 17843: 0x000085ED, + 17844: 0x000085D9, + 17845: 0x000085E1, + 17846: 0x000085E8, + 17847: 0x000085DA, + 17848: 0x000085D7, + 17849: 0x000085EC, + 17850: 0x000085F2, + 17851: 0x000085F8, + 17852: 0x000085D8, + 17853: 0x000085DF, + 17854: 0x000085E3, + 17855: 0x000085DC, + 17856: 0x000085D1, + 17857: 0x000085F0, + 17858: 0x000085E6, + 17859: 0x000085EF, + 17860: 0x000085DE, + 17861: 0x000085E2, + 17862: 0x00008800, + 17863: 0x000087FA, + 17864: 0x00008803, + 17865: 0x000087F6, + 17866: 0x000087F7, + 17867: 0x00008809, + 17868: 0x0000880C, + 17869: 0x0000880B, + 17870: 0x00008806, + 17871: 0x000087FC, + 17872: 0x00008808, + 17873: 0x000087FF, + 17874: 0x0000880A, + 17875: 0x00008802, + 17876: 0x00008962, + 17877: 0x0000895A, + 17878: 0x0000895B, + 17879: 0x00008957, + 17880: 0x00008961, + 17881: 0x0000895C, + 17882: 0x00008958, + 17883: 0x0000895D, + 17884: 0x00008959, + 17885: 0x00008988, + 17886: 0x000089B7, + 17887: 0x000089B6, + 17888: 0x000089F6, + 17889: 0x00008B50, + 17890: 0x00008B48, + 17891: 0x00008B4A, + 17892: 0x00008B40, + 17893: 0x00008B53, + 17894: 0x00008B56, + 17895: 0x00008B54, + 17896: 0x00008B4B, + 17897: 0x00008B55, + 17898: 0x00008B51, + 17899: 0x00008B42, + 17900: 0x00008B52, + 17901: 0x00008B57, + 17902: 0x00008C43, + 17903: 0x00008C77, + 17904: 0x00008C76, + 17905: 0x00008C9A, + 17906: 0x00008D06, + 17907: 0x00008D07, + 17908: 0x00008D09, + 17909: 0x00008DAC, + 17910: 0x00008DAA, + 17911: 0x00008DAD, + 17912: 0x00008DAB, + 17913: 0x00008E6D, + 17914: 0x00008E78, + 17915: 0x00008E73, + 17916: 0x00008E6A, + 17917: 0x00008E6F, + 17918: 0x00008E7B, + 17919: 0x00008EC2, + 17920: 0x00008F52, + 17921: 0x00008F51, + 17922: 0x00008F4F, + 17923: 0x00008F50, + 17924: 0x00008F53, + 17925: 0x00008FB4, + 17926: 0x00009140, + 17927: 0x0000913F, + 17928: 0x000091B0, + 17929: 0x000091AD, + 17930: 0x000093DE, + 17931: 0x000093C7, + 17932: 0x000093CF, + 17933: 0x000093C2, + 17934: 0x000093DA, + 17935: 0x000093D0, + 17936: 0x000093F9, + 17937: 0x000093EC, + 17938: 0x000093CC, + 17939: 0x000093D9, + 17940: 0x000093A9, + 17941: 0x000093E6, + 17942: 0x000093CA, + 17943: 0x000093D4, + 17944: 0x000093EE, + 17945: 0x000093E3, + 17946: 0x000093D5, + 17947: 0x000093C4, + 17948: 0x000093CE, + 17949: 0x000093C0, + 17950: 0x000093D2, + 17951: 0x000093E7, + 17952: 0x0000957D, + 17953: 0x000095DA, + 17954: 0x000095DB, + 17955: 0x000096E1, + 17956: 0x00009729, + 17957: 0x0000972B, + 17958: 0x0000972C, + 17959: 0x00009728, + 17960: 0x00009726, + 17961: 0x000097B3, + 17962: 0x000097B7, + 17963: 0x000097B6, + 17964: 0x000097DD, + 17965: 0x000097DE, + 17966: 0x000097DF, + 17967: 0x0000985C, + 17968: 0x00009859, + 17969: 0x0000985D, + 17970: 0x00009857, + 17971: 0x000098BF, + 17972: 0x000098BD, + 17973: 0x000098BB, + 17974: 0x000098BE, + 17975: 0x00009948, + 17976: 0x00009947, + 17977: 0x00009943, + 17978: 0x000099A6, + 17979: 0x000099A7, + 17980: 0x00009A1A, + 17981: 0x00009A15, + 17982: 0x00009A25, + 17983: 0x00009A1D, + 17984: 0x00009A24, + 17985: 0x00009A1B, + 17986: 0x00009A22, + 17987: 0x00009A20, + 17988: 0x00009A27, + 17989: 0x00009A23, + 17990: 0x00009A1E, + 17991: 0x00009A1C, + 17992: 0x00009A14, + 17993: 0x00009AC2, + 17994: 0x00009B0B, + 17995: 0x00009B0A, + 17996: 0x00009B0E, + 17997: 0x00009B0C, + 17998: 0x00009B37, + 17999: 0x00009BEA, + 18000: 0x00009BEB, + 18001: 0x00009BE0, + 18002: 0x00009BDE, + 18003: 0x00009BE4, + 18004: 0x00009BE6, + 18005: 0x00009BE2, + 18006: 0x00009BF0, + 18007: 0x00009BD4, + 18008: 0x00009BD7, + 18009: 0x00009BEC, + 18010: 0x00009BDC, + 18011: 0x00009BD9, + 18012: 0x00009BE5, + 18013: 0x00009BD5, + 18014: 0x00009BE1, + 18015: 0x00009BDA, + 18016: 0x00009D77, + 18017: 0x00009D81, + 18018: 0x00009D8A, + 18019: 0x00009D84, + 18020: 0x00009D88, + 18021: 0x00009D71, + 18022: 0x00009D80, + 18023: 0x00009D78, + 18024: 0x00009D86, + 18025: 0x00009D8B, + 18026: 0x00009D8C, + 18027: 0x00009D7D, + 18028: 0x00009D6B, + 18029: 0x00009D74, + 18030: 0x00009D75, + 18031: 0x00009D70, + 18032: 0x00009D69, + 18033: 0x00009D85, + 18034: 0x00009D73, + 18035: 0x00009D7B, + 18036: 0x00009D82, + 18037: 0x00009D6F, + 18038: 0x00009D79, + 18039: 0x00009D7F, + 18040: 0x00009D87, + 18041: 0x00009D68, + 18042: 0x00009E94, + 18043: 0x00009E91, + 18044: 0x00009EC0, + 18045: 0x00009EFC, + 18046: 0x00009F2D, + 18047: 0x00009F40, + 18048: 0x00009F41, + 18049: 0x00009F4D, + 18050: 0x00009F56, + 18051: 0x00009F57, + 18052: 0x00009F58, + 18053: 0x00005337, + 18054: 0x000056B2, + 18055: 0x000056B5, + 18056: 0x000056B3, + 18057: 0x000058E3, + 18058: 0x00005B45, + 18059: 0x00005DC6, + 18060: 0x00005DC7, + 18061: 0x00005EEE, + 18062: 0x00005EEF, + 18063: 0x00005FC0, + 18064: 0x00005FC1, + 18065: 0x000061F9, + 18066: 0x00006517, + 18067: 0x00006516, + 18068: 0x00006515, + 18069: 0x00006513, + 18070: 0x000065DF, + 18071: 0x000066E8, + 18072: 0x000066E3, + 18073: 0x000066E4, + 18074: 0x00006AF3, + 18075: 0x00006AF0, + 18076: 0x00006AEA, + 18077: 0x00006AE8, + 18078: 0x00006AF9, + 18079: 0x00006AF1, + 18080: 0x00006AEE, + 18081: 0x00006AEF, + 18082: 0x0000703C, + 18083: 0x00007035, + 18084: 0x0000702F, + 18085: 0x00007037, + 18086: 0x00007034, + 18087: 0x00007031, + 18088: 0x00007042, + 18089: 0x00007038, + 18090: 0x0000703F, + 18091: 0x0000703A, + 18092: 0x00007039, + 18093: 0x00007040, + 18094: 0x0000703B, + 18095: 0x00007033, + 18096: 0x00007041, + 18097: 0x00007213, + 18098: 0x00007214, + 18099: 0x000072A8, + 18100: 0x0000737D, + 18101: 0x0000737C, + 18102: 0x000074BA, + 18103: 0x000076AB, + 18104: 0x000076AA, + 18105: 0x000076BE, + 18106: 0x000076ED, + 18107: 0x000077CC, + 18108: 0x000077CE, + 18109: 0x000077CF, + 18110: 0x000077CD, + 18111: 0x000077F2, + 18112: 0x00007925, + 18113: 0x00007923, + 18114: 0x00007927, + 18115: 0x00007928, + 18116: 0x00007924, + 18117: 0x00007929, + 18118: 0x000079B2, + 18119: 0x00007A6E, + 18120: 0x00007A6C, + 18121: 0x00007A6D, + 18122: 0x00007AF7, + 18123: 0x00007C49, + 18124: 0x00007C48, + 18125: 0x00007C4A, + 18126: 0x00007C47, + 18127: 0x00007C45, + 18128: 0x00007CEE, + 18129: 0x00007E7B, + 18130: 0x00007E7E, + 18131: 0x00007E81, + 18132: 0x00007E80, + 18133: 0x00007FBA, + 18134: 0x00007FFF, + 18135: 0x00008079, + 18136: 0x000081DB, + 18137: 0x000081D9, + 18138: 0x0000820B, + 18139: 0x00008268, + 18140: 0x00008269, + 18141: 0x00008622, + 18142: 0x000085FF, + 18143: 0x00008601, + 18144: 0x000085FE, + 18145: 0x0000861B, + 18146: 0x00008600, + 18147: 0x000085F6, + 18148: 0x00008604, + 18149: 0x00008609, + 18150: 0x00008605, + 18151: 0x0000860C, + 18152: 0x000085FD, + 18153: 0x00008819, + 18154: 0x00008810, + 18155: 0x00008811, + 18156: 0x00008817, + 18157: 0x00008813, + 18158: 0x00008816, + 18159: 0x00008963, + 18160: 0x00008966, + 18161: 0x000089B9, + 18162: 0x000089F7, + 18163: 0x00008B60, + 18164: 0x00008B6A, + 18165: 0x00008B5D, + 18166: 0x00008B68, + 18167: 0x00008B63, + 18168: 0x00008B65, + 18169: 0x00008B67, + 18170: 0x00008B6D, + 18171: 0x00008DAE, + 18172: 0x00008E86, + 18173: 0x00008E88, + 18174: 0x00008E84, + 18175: 0x00008F59, + 18176: 0x00008F56, + 18177: 0x00008F57, + 18178: 0x00008F55, + 18179: 0x00008F58, + 18180: 0x00008F5A, + 18181: 0x0000908D, + 18182: 0x00009143, + 18183: 0x00009141, + 18184: 0x000091B7, + 18185: 0x000091B5, + 18186: 0x000091B2, + 18187: 0x000091B3, + 18188: 0x0000940B, + 18189: 0x00009413, + 18190: 0x000093FB, + 18191: 0x00009420, + 18192: 0x0000940F, + 18193: 0x00009414, + 18194: 0x000093FE, + 18195: 0x00009415, + 18196: 0x00009410, + 18197: 0x00009428, + 18198: 0x00009419, + 18199: 0x0000940D, + 18200: 0x000093F5, + 18201: 0x00009400, + 18202: 0x000093F7, + 18203: 0x00009407, + 18204: 0x0000940E, + 18205: 0x00009416, + 18206: 0x00009412, + 18207: 0x000093FA, + 18208: 0x00009409, + 18209: 0x000093F8, + 18210: 0x0000940A, + 18211: 0x000093FF, + 18212: 0x000093FC, + 18213: 0x0000940C, + 18214: 0x000093F6, + 18215: 0x00009411, + 18216: 0x00009406, + 18217: 0x000095DE, + 18218: 0x000095E0, + 18219: 0x000095DF, + 18220: 0x0000972E, + 18221: 0x0000972F, + 18222: 0x000097B9, + 18223: 0x000097BB, + 18224: 0x000097FD, + 18225: 0x000097FE, + 18226: 0x00009860, + 18227: 0x00009862, + 18228: 0x00009863, + 18229: 0x0000985F, + 18230: 0x000098C1, + 18231: 0x000098C2, + 18232: 0x00009950, + 18233: 0x0000994E, + 18234: 0x00009959, + 18235: 0x0000994C, + 18236: 0x0000994B, + 18237: 0x00009953, + 18238: 0x00009A32, + 18239: 0x00009A34, + 18240: 0x00009A31, + 18241: 0x00009A2C, + 18242: 0x00009A2A, + 18243: 0x00009A36, + 18244: 0x00009A29, + 18245: 0x00009A2E, + 18246: 0x00009A38, + 18247: 0x00009A2D, + 18248: 0x00009AC7, + 18249: 0x00009ACA, + 18250: 0x00009AC6, + 18251: 0x00009B10, + 18252: 0x00009B12, + 18253: 0x00009B11, + 18254: 0x00009C0B, + 18255: 0x00009C08, + 18256: 0x00009BF7, + 18257: 0x00009C05, + 18258: 0x00009C12, + 18259: 0x00009BF8, + 18260: 0x00009C40, + 18261: 0x00009C07, + 18262: 0x00009C0E, + 18263: 0x00009C06, + 18264: 0x00009C17, + 18265: 0x00009C14, + 18266: 0x00009C09, + 18267: 0x00009D9F, + 18268: 0x00009D99, + 18269: 0x00009DA4, + 18270: 0x00009D9D, + 18271: 0x00009D92, + 18272: 0x00009D98, + 18273: 0x00009D90, + 18274: 0x00009D9B, + 18275: 0x00009DA0, + 18276: 0x00009D94, + 18277: 0x00009D9C, + 18278: 0x00009DAA, + 18279: 0x00009D97, + 18280: 0x00009DA1, + 18281: 0x00009D9A, + 18282: 0x00009DA2, + 18283: 0x00009DA8, + 18284: 0x00009D9E, + 18285: 0x00009DA3, + 18286: 0x00009DBF, + 18287: 0x00009DA9, + 18288: 0x00009D96, + 18289: 0x00009DA6, + 18290: 0x00009DA7, + 18291: 0x00009E99, + 18292: 0x00009E9B, + 18293: 0x00009E9A, + 18294: 0x00009EE5, + 18295: 0x00009EE4, + 18296: 0x00009EE7, + 18297: 0x00009EE6, + 18298: 0x00009F30, + 18299: 0x00009F2E, + 18300: 0x00009F5B, + 18301: 0x00009F60, + 18302: 0x00009F5E, + 18303: 0x00009F5D, + 18304: 0x00009F59, + 18305: 0x00009F91, + 18306: 0x0000513A, + 18307: 0x00005139, + 18308: 0x00005298, + 18309: 0x00005297, + 18310: 0x000056C3, + 18311: 0x000056BD, + 18312: 0x000056BE, + 18313: 0x00005B48, + 18314: 0x00005B47, + 18315: 0x00005DCB, + 18316: 0x00005DCF, + 18317: 0x00005EF1, + 18318: 0x000061FD, + 18319: 0x0000651B, + 18320: 0x00006B02, + 18321: 0x00006AFC, + 18322: 0x00006B03, + 18323: 0x00006AF8, + 18324: 0x00006B00, + 18325: 0x00007043, + 18326: 0x00007044, + 18327: 0x0000704A, + 18328: 0x00007048, + 18329: 0x00007049, + 18330: 0x00007045, + 18331: 0x00007046, + 18332: 0x0000721D, + 18333: 0x0000721A, + 18334: 0x00007219, + 18335: 0x0000737E, + 18336: 0x00007517, + 18337: 0x0000766A, + 18338: 0x000077D0, + 18339: 0x0000792D, + 18340: 0x00007931, + 18341: 0x0000792F, + 18342: 0x00007C54, + 18343: 0x00007C53, + 18344: 0x00007CF2, + 18345: 0x00007E8A, + 18346: 0x00007E87, + 18347: 0x00007E88, + 18348: 0x00007E8B, + 18349: 0x00007E86, + 18350: 0x00007E8D, + 18351: 0x00007F4D, + 18352: 0x00007FBB, + 18353: 0x00008030, + 18354: 0x000081DD, + 18355: 0x00008618, + 18356: 0x0000862A, + 18357: 0x00008626, + 18358: 0x0000861F, + 18359: 0x00008623, + 18360: 0x0000861C, + 18361: 0x00008619, + 18362: 0x00008627, + 18363: 0x0000862E, + 18364: 0x00008621, + 18365: 0x00008620, + 18366: 0x00008629, + 18367: 0x0000861E, + 18368: 0x00008625, + 18369: 0x00008829, + 18370: 0x0000881D, + 18371: 0x0000881B, + 18372: 0x00008820, + 18373: 0x00008824, + 18374: 0x0000881C, + 18375: 0x0000882B, + 18376: 0x0000884A, + 18377: 0x0000896D, + 18378: 0x00008969, + 18379: 0x0000896E, + 18380: 0x0000896B, + 18381: 0x000089FA, + 18382: 0x00008B79, + 18383: 0x00008B78, + 18384: 0x00008B45, + 18385: 0x00008B7A, + 18386: 0x00008B7B, + 18387: 0x00008D10, + 18388: 0x00008D14, + 18389: 0x00008DAF, + 18390: 0x00008E8E, + 18391: 0x00008E8C, + 18392: 0x00008F5E, + 18393: 0x00008F5B, + 18394: 0x00008F5D, + 18395: 0x00009146, + 18396: 0x00009144, + 18397: 0x00009145, + 18398: 0x000091B9, + 18399: 0x0000943F, + 18400: 0x0000943B, + 18401: 0x00009436, + 18402: 0x00009429, + 18403: 0x0000943D, + 18404: 0x0000943C, + 18405: 0x00009430, + 18406: 0x00009439, + 18407: 0x0000942A, + 18408: 0x00009437, + 18409: 0x0000942C, + 18410: 0x00009440, + 18411: 0x00009431, + 18412: 0x000095E5, + 18413: 0x000095E4, + 18414: 0x000095E3, + 18415: 0x00009735, + 18416: 0x0000973A, + 18417: 0x000097BF, + 18418: 0x000097E1, + 18419: 0x00009864, + 18420: 0x000098C9, + 18421: 0x000098C6, + 18422: 0x000098C0, + 18423: 0x00009958, + 18424: 0x00009956, + 18425: 0x00009A39, + 18426: 0x00009A3D, + 18427: 0x00009A46, + 18428: 0x00009A44, + 18429: 0x00009A42, + 18430: 0x00009A41, + 18431: 0x00009A3A, + 18432: 0x00009A3F, + 18433: 0x00009ACD, + 18434: 0x00009B15, + 18435: 0x00009B17, + 18436: 0x00009B18, + 18437: 0x00009B16, + 18438: 0x00009B3A, + 18439: 0x00009B52, + 18440: 0x00009C2B, + 18441: 0x00009C1D, + 18442: 0x00009C1C, + 18443: 0x00009C2C, + 18444: 0x00009C23, + 18445: 0x00009C28, + 18446: 0x00009C29, + 18447: 0x00009C24, + 18448: 0x00009C21, + 18449: 0x00009DB7, + 18450: 0x00009DB6, + 18451: 0x00009DBC, + 18452: 0x00009DC1, + 18453: 0x00009DC7, + 18454: 0x00009DCA, + 18455: 0x00009DCF, + 18456: 0x00009DBE, + 18457: 0x00009DC5, + 18458: 0x00009DC3, + 18459: 0x00009DBB, + 18460: 0x00009DB5, + 18461: 0x00009DCE, + 18462: 0x00009DB9, + 18463: 0x00009DBA, + 18464: 0x00009DAC, + 18465: 0x00009DC8, + 18466: 0x00009DB1, + 18467: 0x00009DAD, + 18468: 0x00009DCC, + 18469: 0x00009DB3, + 18470: 0x00009DCD, + 18471: 0x00009DB2, + 18472: 0x00009E7A, + 18473: 0x00009E9C, + 18474: 0x00009EEB, + 18475: 0x00009EEE, + 18476: 0x00009EED, + 18477: 0x00009F1B, + 18478: 0x00009F18, + 18479: 0x00009F1A, + 18480: 0x00009F31, + 18481: 0x00009F4E, + 18482: 0x00009F65, + 18483: 0x00009F64, + 18484: 0x00009F92, + 18485: 0x00004EB9, + 18486: 0x000056C6, + 18487: 0x000056C5, + 18488: 0x000056CB, + 18489: 0x00005971, + 18490: 0x00005B4B, + 18491: 0x00005B4C, + 18492: 0x00005DD5, + 18493: 0x00005DD1, + 18494: 0x00005EF2, + 18495: 0x00006521, + 18496: 0x00006520, + 18497: 0x00006526, + 18498: 0x00006522, + 18499: 0x00006B0B, + 18500: 0x00006B08, + 18501: 0x00006B09, + 18502: 0x00006C0D, + 18503: 0x00007055, + 18504: 0x00007056, + 18505: 0x00007057, + 18506: 0x00007052, + 18507: 0x0000721E, + 18508: 0x0000721F, + 18509: 0x000072A9, + 18510: 0x0000737F, + 18511: 0x000074D8, + 18512: 0x000074D5, + 18513: 0x000074D9, + 18514: 0x000074D7, + 18515: 0x0000766D, + 18516: 0x000076AD, + 18517: 0x00007935, + 18518: 0x000079B4, + 18519: 0x00007A70, + 18520: 0x00007A71, + 18521: 0x00007C57, + 18522: 0x00007C5C, + 18523: 0x00007C59, + 18524: 0x00007C5B, + 18525: 0x00007C5A, + 18526: 0x00007CF4, + 18527: 0x00007CF1, + 18528: 0x00007E91, + 18529: 0x00007F4F, + 18530: 0x00007F87, + 18531: 0x000081DE, + 18532: 0x0000826B, + 18533: 0x00008634, + 18534: 0x00008635, + 18535: 0x00008633, + 18536: 0x0000862C, + 18537: 0x00008632, + 18538: 0x00008636, + 18539: 0x0000882C, + 18540: 0x00008828, + 18541: 0x00008826, + 18542: 0x0000882A, + 18543: 0x00008825, + 18544: 0x00008971, + 18545: 0x000089BF, + 18546: 0x000089BE, + 18547: 0x000089FB, + 18548: 0x00008B7E, + 18549: 0x00008B84, + 18550: 0x00008B82, + 18551: 0x00008B86, + 18552: 0x00008B85, + 18553: 0x00008B7F, + 18554: 0x00008D15, + 18555: 0x00008E95, + 18556: 0x00008E94, + 18557: 0x00008E9A, + 18558: 0x00008E92, + 18559: 0x00008E90, + 18560: 0x00008E96, + 18561: 0x00008E97, + 18562: 0x00008F60, + 18563: 0x00008F62, + 18564: 0x00009147, + 18565: 0x0000944C, + 18566: 0x00009450, + 18567: 0x0000944A, + 18568: 0x0000944B, + 18569: 0x0000944F, + 18570: 0x00009447, + 18571: 0x00009445, + 18572: 0x00009448, + 18573: 0x00009449, + 18574: 0x00009446, + 18575: 0x0000973F, + 18576: 0x000097E3, + 18577: 0x0000986A, + 18578: 0x00009869, + 18579: 0x000098CB, + 18580: 0x00009954, + 18581: 0x0000995B, + 18582: 0x00009A4E, + 18583: 0x00009A53, + 18584: 0x00009A54, + 18585: 0x00009A4C, + 18586: 0x00009A4F, + 18587: 0x00009A48, + 18588: 0x00009A4A, + 18589: 0x00009A49, + 18590: 0x00009A52, + 18591: 0x00009A50, + 18592: 0x00009AD0, + 18593: 0x00009B19, + 18594: 0x00009B2B, + 18595: 0x00009B3B, + 18596: 0x00009B56, + 18597: 0x00009B55, + 18598: 0x00009C46, + 18599: 0x00009C48, + 18600: 0x00009C3F, + 18601: 0x00009C44, + 18602: 0x00009C39, + 18603: 0x00009C33, + 18604: 0x00009C41, + 18605: 0x00009C3C, + 18606: 0x00009C37, + 18607: 0x00009C34, + 18608: 0x00009C32, + 18609: 0x00009C3D, + 18610: 0x00009C36, + 18611: 0x00009DDB, + 18612: 0x00009DD2, + 18613: 0x00009DDE, + 18614: 0x00009DDA, + 18615: 0x00009DCB, + 18616: 0x00009DD0, + 18617: 0x00009DDC, + 18618: 0x00009DD1, + 18619: 0x00009DDF, + 18620: 0x00009DE9, + 18621: 0x00009DD9, + 18622: 0x00009DD8, + 18623: 0x00009DD6, + 18624: 0x00009DF5, + 18625: 0x00009DD5, + 18626: 0x00009DDD, + 18627: 0x00009EB6, + 18628: 0x00009EF0, + 18629: 0x00009F35, + 18630: 0x00009F33, + 18631: 0x00009F32, + 18632: 0x00009F42, + 18633: 0x00009F6B, + 18634: 0x00009F95, + 18635: 0x00009FA2, + 18636: 0x0000513D, + 18637: 0x00005299, + 18638: 0x000058E8, + 18639: 0x000058E7, + 18640: 0x00005972, + 18641: 0x00005B4D, + 18642: 0x00005DD8, + 18643: 0x0000882F, + 18644: 0x00005F4F, + 18645: 0x00006201, + 18646: 0x00006203, + 18647: 0x00006204, + 18648: 0x00006529, + 18649: 0x00006525, + 18650: 0x00006596, + 18651: 0x000066EB, + 18652: 0x00006B11, + 18653: 0x00006B12, + 18654: 0x00006B0F, + 18655: 0x00006BCA, + 18656: 0x0000705B, + 18657: 0x0000705A, + 18658: 0x00007222, + 18659: 0x00007382, + 18660: 0x00007381, + 18661: 0x00007383, + 18662: 0x00007670, + 18663: 0x000077D4, + 18664: 0x00007C67, + 18665: 0x00007C66, + 18666: 0x00007E95, + 18667: 0x0000826C, + 18668: 0x0000863A, + 18669: 0x00008640, + 18670: 0x00008639, + 18671: 0x0000863C, + 18672: 0x00008631, + 18673: 0x0000863B, + 18674: 0x0000863E, + 18675: 0x00008830, + 18676: 0x00008832, + 18677: 0x0000882E, + 18678: 0x00008833, + 18679: 0x00008976, + 18680: 0x00008974, + 18681: 0x00008973, + 18682: 0x000089FE, + 18683: 0x00008B8C, + 18684: 0x00008B8E, + 18685: 0x00008B8B, + 18686: 0x00008B88, + 18687: 0x00008C45, + 18688: 0x00008D19, + 18689: 0x00008E98, + 18690: 0x00008F64, + 18691: 0x00008F63, + 18692: 0x000091BC, + 18693: 0x00009462, + 18694: 0x00009455, + 18695: 0x0000945D, + 18696: 0x00009457, + 18697: 0x0000945E, + 18698: 0x000097C4, + 18699: 0x000097C5, + 18700: 0x00009800, + 18701: 0x00009A56, + 18702: 0x00009A59, + 18703: 0x00009B1E, + 18704: 0x00009B1F, + 18705: 0x00009B20, + 18706: 0x00009C52, + 18707: 0x00009C58, + 18708: 0x00009C50, + 18709: 0x00009C4A, + 18710: 0x00009C4D, + 18711: 0x00009C4B, + 18712: 0x00009C55, + 18713: 0x00009C59, + 18714: 0x00009C4C, + 18715: 0x00009C4E, + 18716: 0x00009DFB, + 18717: 0x00009DF7, + 18718: 0x00009DEF, + 18719: 0x00009DE3, + 18720: 0x00009DEB, + 18721: 0x00009DF8, + 18722: 0x00009DE4, + 18723: 0x00009DF6, + 18724: 0x00009DE1, + 18725: 0x00009DEE, + 18726: 0x00009DE6, + 18727: 0x00009DF2, + 18728: 0x00009DF0, + 18729: 0x00009DE2, + 18730: 0x00009DEC, + 18731: 0x00009DF4, + 18732: 0x00009DF3, + 18733: 0x00009DE8, + 18734: 0x00009DED, + 18735: 0x00009EC2, + 18736: 0x00009ED0, + 18737: 0x00009EF2, + 18738: 0x00009EF3, + 18739: 0x00009F06, + 18740: 0x00009F1C, + 18741: 0x00009F38, + 18742: 0x00009F37, + 18743: 0x00009F36, + 18744: 0x00009F43, + 18745: 0x00009F4F, + 18746: 0x00009F71, + 18747: 0x00009F70, + 18748: 0x00009F6E, + 18749: 0x00009F6F, + 18750: 0x000056D3, + 18751: 0x000056CD, + 18752: 0x00005B4E, + 18753: 0x00005C6D, + 18754: 0x0000652D, + 18755: 0x000066ED, + 18756: 0x000066EE, + 18757: 0x00006B13, + 18758: 0x0000705F, + 18759: 0x00007061, + 18760: 0x0000705D, + 18761: 0x00007060, + 18762: 0x00007223, + 18763: 0x000074DB, + 18764: 0x000074E5, + 18765: 0x000077D5, + 18766: 0x00007938, + 18767: 0x000079B7, + 18768: 0x000079B6, + 18769: 0x00007C6A, + 18770: 0x00007E97, + 18771: 0x00007F89, + 18772: 0x0000826D, + 18773: 0x00008643, + 18774: 0x00008838, + 18775: 0x00008837, + 18776: 0x00008835, + 18777: 0x0000884B, + 18778: 0x00008B94, + 18779: 0x00008B95, + 18780: 0x00008E9E, + 18781: 0x00008E9F, + 18782: 0x00008EA0, + 18783: 0x00008E9D, + 18784: 0x000091BE, + 18785: 0x000091BD, + 18786: 0x000091C2, + 18787: 0x0000946B, + 18788: 0x00009468, + 18789: 0x00009469, + 18790: 0x000096E5, + 18791: 0x00009746, + 18792: 0x00009743, + 18793: 0x00009747, + 18794: 0x000097C7, + 18795: 0x000097E5, + 18796: 0x00009A5E, + 18797: 0x00009AD5, + 18798: 0x00009B59, + 18799: 0x00009C63, + 18800: 0x00009C67, + 18801: 0x00009C66, + 18802: 0x00009C62, + 18803: 0x00009C5E, + 18804: 0x00009C60, + 18805: 0x00009E02, + 18806: 0x00009DFE, + 18807: 0x00009E07, + 18808: 0x00009E03, + 18809: 0x00009E06, + 18810: 0x00009E05, + 18811: 0x00009E00, + 18812: 0x00009E01, + 18813: 0x00009E09, + 18814: 0x00009DFF, + 18815: 0x00009DFD, + 18816: 0x00009E04, + 18817: 0x00009EA0, + 18818: 0x00009F1E, + 18819: 0x00009F46, + 18820: 0x00009F74, + 18821: 0x00009F75, + 18822: 0x00009F76, + 18823: 0x000056D4, + 18824: 0x0000652E, + 18825: 0x000065B8, + 18826: 0x00006B18, + 18827: 0x00006B19, + 18828: 0x00006B17, + 18829: 0x00006B1A, + 18830: 0x00007062, + 18831: 0x00007226, + 18832: 0x000072AA, + 18833: 0x000077D8, + 18834: 0x000077D9, + 18835: 0x00007939, + 18836: 0x00007C69, + 18837: 0x00007C6B, + 18838: 0x00007CF6, + 18839: 0x00007E9A, + 18840: 0x00007E98, + 18841: 0x00007E9B, + 18842: 0x00007E99, + 18843: 0x000081E0, + 18844: 0x000081E1, + 18845: 0x00008646, + 18846: 0x00008647, + 18847: 0x00008648, + 18848: 0x00008979, + 18849: 0x0000897A, + 18850: 0x0000897C, + 18851: 0x0000897B, + 18852: 0x000089FF, + 18853: 0x00008B98, + 18854: 0x00008B99, + 18855: 0x00008EA5, + 18856: 0x00008EA4, + 18857: 0x00008EA3, + 18858: 0x0000946E, + 18859: 0x0000946D, + 18860: 0x0000946F, + 18861: 0x00009471, + 18862: 0x00009473, + 18863: 0x00009749, + 18864: 0x00009872, + 18865: 0x0000995F, + 18866: 0x00009C68, + 18867: 0x00009C6E, + 18868: 0x00009C6D, + 18869: 0x00009E0B, + 18870: 0x00009E0D, + 18871: 0x00009E10, + 18872: 0x00009E0F, + 18873: 0x00009E12, + 18874: 0x00009E11, + 18875: 0x00009EA1, + 18876: 0x00009EF5, + 18877: 0x00009F09, + 18878: 0x00009F47, + 18879: 0x00009F78, + 18880: 0x00009F7B, + 18881: 0x00009F7A, + 18882: 0x00009F79, + 18883: 0x0000571E, + 18884: 0x00007066, + 18885: 0x00007C6F, + 18886: 0x0000883C, + 18887: 0x00008DB2, + 18888: 0x00008EA6, + 18889: 0x000091C3, + 18890: 0x00009474, + 18891: 0x00009478, + 18892: 0x00009476, + 18893: 0x00009475, + 18894: 0x00009A60, + 18895: 0x00009C74, + 18896: 0x00009C73, + 18897: 0x00009C71, + 18898: 0x00009C75, + 18899: 0x00009E14, + 18900: 0x00009E13, + 18901: 0x00009EF6, + 18902: 0x00009F0A, + 18903: 0x00009FA4, + 18904: 0x00007068, + 18905: 0x00007065, + 18906: 0x00007CF7, + 18907: 0x0000866A, + 18908: 0x0000883E, + 18909: 0x0000883D, + 18910: 0x0000883F, + 18911: 0x00008B9E, + 18912: 0x00008C9C, + 18913: 0x00008EA9, + 18914: 0x00008EC9, + 18915: 0x0000974B, + 18916: 0x00009873, + 18917: 0x00009874, + 18918: 0x000098CC, + 18919: 0x00009961, + 18920: 0x000099AB, + 18921: 0x00009A64, + 18922: 0x00009A66, + 18923: 0x00009A67, + 18924: 0x00009B24, + 18925: 0x00009E15, + 18926: 0x00009E17, + 18927: 0x00009F48, + 18928: 0x00006207, + 18929: 0x00006B1E, + 18930: 0x00007227, + 18931: 0x0000864C, + 18932: 0x00008EA8, + 18933: 0x00009482, + 18934: 0x00009480, + 18935: 0x00009481, + 18936: 0x00009A69, + 18937: 0x00009A68, + 18938: 0x00009B2E, + 18939: 0x00009E19, + 18940: 0x00007229, + 18941: 0x0000864B, + 18942: 0x00008B9F, + 18943: 0x00009483, + 18944: 0x00009C79, + 18945: 0x00009EB7, + 18946: 0x00007675, + 18947: 0x00009A6B, + 18948: 0x00009C7A, + 18949: 0x00009E1D, + 18950: 0x00007069, + 18951: 0x0000706A, + 18952: 0x00009EA4, + 18953: 0x00009F7E, + 18954: 0x00009F49, + 18955: 0x00009F98, + 18956: 0x00007881, + 18957: 0x000092B9, + 18958: 0x000088CF, + 18959: 0x000058BB, + 18960: 0x00006052, + 18961: 0x00007CA7, + 18962: 0x00005AFA, + 18963: 0x00002554, + 18964: 0x00002566, + 18965: 0x00002557, + 18966: 0x00002560, + 18967: 0x0000256C, + 18968: 0x00002563, + 18969: 0x0000255A, + 18970: 0x00002569, + 18971: 0x0000255D, + 18972: 0x00002552, + 18973: 0x00002564, + 18974: 0x00002555, + 18975: 0x0000255E, + 18976: 0x0000256A, + 18977: 0x00002561, + 18978: 0x00002558, + 18979: 0x00002567, + 18980: 0x0000255B, + 18981: 0x00002553, + 18982: 0x00002565, + 18983: 0x00002556, + 18984: 0x0000255F, + 18985: 0x0000256B, + 18986: 0x00002562, + 18987: 0x00002559, + 18988: 0x00002568, + 18989: 0x0000255C, + 18990: 0x00002551, + 18991: 0x00002550, + 18992: 0x0000256D, + 18993: 0x0000256E, + 18994: 0x00002570, + 18995: 0x0000256F, + 18996: 0x0000FFED, + 18997: 0x00020547, + 18998: 0x000092DB, + 18999: 0x000205DF, + 19000: 0x00023FC5, + 19001: 0x0000854C, + 19002: 0x000042B5, + 19003: 0x000073EF, + 19004: 0x000051B5, + 19005: 0x00003649, + 19006: 0x00024942, + 19007: 0x000289E4, + 19008: 0x00009344, + 19009: 0x000219DB, + 19010: 0x000082EE, + 19011: 0x00023CC8, + 19012: 0x0000783C, + 19013: 0x00006744, + 19014: 0x000062DF, + 19015: 0x00024933, + 19016: 0x000289AA, + 19017: 0x000202A0, + 19018: 0x00026BB3, + 19019: 0x00021305, + 19020: 0x00004FAB, + 19021: 0x000224ED, + 19022: 0x00005008, + 19023: 0x00026D29, + 19024: 0x00027A84, + 19025: 0x00023600, + 19026: 0x00024AB1, + 19027: 0x00022513, + 19028: 0x00005029, + 19029: 0x0002037E, + 19030: 0x00005FA4, + 19031: 0x00020380, + 19032: 0x00020347, + 19033: 0x00006EDB, + 19034: 0x0002041F, + 19035: 0x0000507D, + 19036: 0x00005101, + 19037: 0x0000347A, + 19038: 0x0000510E, + 19039: 0x0000986C, + 19040: 0x00003743, + 19041: 0x00008416, + 19042: 0x000249A4, + 19043: 0x00020487, + 19044: 0x00005160, + 19045: 0x000233B4, + 19046: 0x0000516A, + 19047: 0x00020BFF, + 19048: 0x000220FC, + 19049: 0x000202E5, + 19050: 0x00022530, + 19051: 0x0002058E, + 19052: 0x00023233, + 19053: 0x00021983, + 19054: 0x00005B82, + 19055: 0x0000877D, + 19056: 0x000205B3, + 19057: 0x00023C99, + 19058: 0x000051B2, + 19059: 0x000051B8, + 19060: 0x00009D34, + 19061: 0x000051C9, + 19062: 0x000051CF, + 19063: 0x000051D1, + 19064: 0x00003CDC, + 19065: 0x000051D3, + 19066: 0x00024AA6, + 19067: 0x000051B3, + 19068: 0x000051E2, + 19069: 0x00005342, + 19070: 0x000051ED, + 19071: 0x000083CD, + 19072: 0x0000693E, + 19073: 0x0002372D, + 19074: 0x00005F7B, + 19075: 0x0000520B, + 19076: 0x00005226, + 19077: 0x0000523C, + 19078: 0x000052B5, + 19079: 0x00005257, + 19080: 0x00005294, + 19081: 0x000052B9, + 19082: 0x000052C5, + 19083: 0x00007C15, + 19084: 0x00008542, + 19085: 0x000052E0, + 19086: 0x0000860D, + 19087: 0x00026B13, + 19088: 0x00005305, + 19089: 0x00028ADE, + 19090: 0x00005549, + 19091: 0x00006ED9, + 19092: 0x00023F80, + 19093: 0x00020954, + 19094: 0x00023FEC, + 19095: 0x00005333, + 19096: 0x00005344, + 19097: 0x00020BE2, + 19098: 0x00006CCB, + 19099: 0x00021726, + 19100: 0x0000681B, + 19101: 0x000073D5, + 19102: 0x0000604A, + 19103: 0x00003EAA, + 19104: 0x000038CC, + 19105: 0x000216E8, + 19106: 0x000071DD, + 19107: 0x000044A2, + 19108: 0x0000536D, + 19109: 0x00005374, + 19110: 0x000286AB, + 19111: 0x0000537E, + 19112: 0x0000537F, + 19113: 0x00021596, + 19114: 0x00021613, + 19115: 0x000077E6, + 19116: 0x00005393, + 19117: 0x00028A9B, + 19118: 0x000053A0, + 19119: 0x000053AB, + 19120: 0x000053AE, + 19121: 0x000073A7, + 19122: 0x00025772, + 19123: 0x00003F59, + 19124: 0x0000739C, + 19125: 0x000053C1, + 19126: 0x000053C5, + 19127: 0x00006C49, + 19128: 0x00004E49, + 19129: 0x000057FE, + 19130: 0x000053D9, + 19131: 0x00003AAB, + 19132: 0x00020B8F, + 19133: 0x000053E0, + 19134: 0x00023FEB, + 19135: 0x00022DA3, + 19136: 0x000053F6, + 19137: 0x00020C77, + 19138: 0x00005413, + 19139: 0x00007079, + 19140: 0x0000552B, + 19141: 0x00006657, + 19142: 0x00006D5B, + 19143: 0x0000546D, + 19144: 0x00026B53, + 19145: 0x00020D74, + 19146: 0x0000555D, + 19147: 0x0000548F, + 19148: 0x000054A4, + 19149: 0x000047A6, + 19150: 0x0002170D, + 19151: 0x00020EDD, + 19152: 0x00003DB4, + 19153: 0x00020D4D, + 19154: 0x000289BC, + 19155: 0x00022698, + 19156: 0x00005547, + 19157: 0x00004CED, + 19158: 0x0000542F, + 19159: 0x00007417, + 19160: 0x00005586, + 19161: 0x000055A9, + 19162: 0x00005605, + 19163: 0x000218D7, + 19164: 0x0002403A, + 19165: 0x00004552, + 19166: 0x00024435, + 19167: 0x000066B3, + 19168: 0x000210B4, + 19169: 0x00005637, + 19170: 0x000066CD, + 19171: 0x0002328A, + 19172: 0x000066A4, + 19173: 0x000066AD, + 19174: 0x0000564D, + 19175: 0x0000564F, + 19176: 0x000078F1, + 19177: 0x000056F1, + 19178: 0x00009787, + 19179: 0x000053FE, + 19180: 0x00005700, + 19181: 0x000056EF, + 19182: 0x000056ED, + 19183: 0x00028B66, + 19184: 0x00003623, + 19185: 0x0002124F, + 19186: 0x00005746, + 19187: 0x000241A5, + 19188: 0x00006C6E, + 19189: 0x0000708B, + 19190: 0x00005742, + 19191: 0x000036B1, + 19192: 0x00026C7E, + 19193: 0x000057E6, + 19194: 0x00021416, + 19195: 0x00005803, + 19196: 0x00021454, + 19197: 0x00024363, + 19198: 0x00005826, + 19199: 0x00024BF5, + 19200: 0x0000585C, + 19201: 0x000058AA, + 19202: 0x00003561, + 19203: 0x000058E0, + 19204: 0x000058DC, + 19205: 0x0002123C, + 19206: 0x000058FB, + 19207: 0x00005BFF, + 19208: 0x00005743, + 19209: 0x0002A150, + 19210: 0x00024278, + 19211: 0x000093D3, + 19212: 0x000035A1, + 19213: 0x0000591F, + 19214: 0x000068A6, + 19215: 0x000036C3, + 19216: 0x00006E59, + 19217: 0x0002163E, + 19218: 0x00005A24, + 19219: 0x00005553, + 19220: 0x00021692, + 19221: 0x00008505, + 19222: 0x000059C9, + 19223: 0x00020D4E, + 19224: 0x00026C81, + 19225: 0x00026D2A, + 19226: 0x000217DC, + 19227: 0x000059D9, + 19228: 0x000217FB, + 19229: 0x000217B2, + 19230: 0x00026DA6, + 19231: 0x00006D71, + 19232: 0x00021828, + 19233: 0x000216D5, + 19234: 0x000059F9, + 19235: 0x00026E45, + 19236: 0x00005AAB, + 19237: 0x00005A63, + 19238: 0x000036E6, + 19239: 0x000249A9, + 19240: 0x00005A77, + 19241: 0x00003708, + 19242: 0x00005A96, + 19243: 0x00007465, + 19244: 0x00005AD3, + 19245: 0x00026FA1, + 19246: 0x00022554, + 19247: 0x00003D85, + 19248: 0x00021911, + 19249: 0x00003732, + 19250: 0x000216B8, + 19251: 0x00005E83, + 19252: 0x000052D0, + 19253: 0x00005B76, + 19254: 0x00006588, + 19255: 0x00005B7C, + 19256: 0x00027A0E, + 19257: 0x00004004, + 19258: 0x0000485D, + 19259: 0x00020204, + 19260: 0x00005BD5, + 19261: 0x00006160, + 19262: 0x00021A34, + 19263: 0x000259CC, + 19264: 0x000205A5, + 19265: 0x00005BF3, + 19266: 0x00005B9D, + 19267: 0x00004D10, + 19268: 0x00005C05, + 19269: 0x00021B44, + 19270: 0x00005C13, + 19271: 0x000073CE, + 19272: 0x00005C14, + 19273: 0x00021CA5, + 19274: 0x00026B28, + 19275: 0x00005C49, + 19276: 0x000048DD, + 19277: 0x00005C85, + 19278: 0x00005CE9, + 19279: 0x00005CEF, + 19280: 0x00005D8B, + 19281: 0x00021DF9, + 19282: 0x00021E37, + 19283: 0x00005D10, + 19284: 0x00005D18, + 19285: 0x00005D46, + 19286: 0x00021EA4, + 19287: 0x00005CBA, + 19288: 0x00005DD7, + 19289: 0x000082FC, + 19290: 0x0000382D, + 19291: 0x00024901, + 19292: 0x00022049, + 19293: 0x00022173, + 19294: 0x00008287, + 19295: 0x00003836, + 19296: 0x00003BC2, + 19297: 0x00005E2E, + 19298: 0x00006A8A, + 19299: 0x00005E75, + 19300: 0x00005E7A, + 19301: 0x000244BC, + 19302: 0x00020CD3, + 19303: 0x000053A6, + 19304: 0x00004EB7, + 19305: 0x00005ED0, + 19306: 0x000053A8, + 19307: 0x00021771, + 19308: 0x00005E09, + 19309: 0x00005EF4, + 19310: 0x00028482, + 19311: 0x00005EF9, + 19312: 0x00005EFB, + 19313: 0x000038A0, + 19314: 0x00005EFC, + 19315: 0x0000683E, + 19316: 0x0000941B, + 19317: 0x00005F0D, + 19318: 0x000201C1, + 19319: 0x0002F894, + 19320: 0x00003ADE, + 19321: 0x000048AE, + 19322: 0x0002133A, + 19323: 0x00005F3A, + 19324: 0x00026888, + 19325: 0x000223D0, + 19326: 0x00005F58, + 19327: 0x00022471, + 19328: 0x00005F63, + 19329: 0x000097BD, + 19330: 0x00026E6E, + 19331: 0x00005F72, + 19332: 0x00009340, + 19333: 0x00028A36, + 19334: 0x00005FA7, + 19335: 0x00005DB6, + 19336: 0x00003D5F, + 19337: 0x00025250, + 19338: 0x00021F6A, + 19339: 0x000270F8, + 19340: 0x00022668, + 19341: 0x000091D6, + 19342: 0x0002029E, + 19343: 0x00028A29, + 19344: 0x00006031, + 19345: 0x00006685, + 19346: 0x00021877, + 19347: 0x00003963, + 19348: 0x00003DC7, + 19349: 0x00003639, + 19350: 0x00005790, + 19351: 0x000227B4, + 19352: 0x00007971, + 19353: 0x00003E40, + 19354: 0x0000609E, + 19355: 0x000060A4, + 19356: 0x000060B3, + 19357: 0x00024982, + 19358: 0x0002498F, + 19359: 0x00027A53, + 19360: 0x000074A4, + 19361: 0x000050E1, + 19362: 0x00005AA0, + 19363: 0x00006164, + 19364: 0x00008424, + 19365: 0x00006142, + 19366: 0x0002F8A6, + 19367: 0x00026ED2, + 19368: 0x00006181, + 19369: 0x000051F4, + 19370: 0x00020656, + 19371: 0x00006187, + 19372: 0x00005BAA, + 19373: 0x00023FB7, + 19374: 0x0002285F, + 19375: 0x000061D3, + 19376: 0x00028B9D, + 19377: 0x0002995D, + 19378: 0x000061D0, + 19379: 0x00003932, + 19380: 0x00022980, + 19381: 0x000228C1, + 19382: 0x00006023, + 19383: 0x0000615C, + 19384: 0x0000651E, + 19385: 0x0000638B, + 19386: 0x00020118, + 19387: 0x000062C5, + 19388: 0x00021770, + 19389: 0x000062D5, + 19390: 0x00022E0D, + 19391: 0x0000636C, + 19392: 0x000249DF, + 19393: 0x00003A17, + 19394: 0x00006438, + 19395: 0x000063F8, + 19396: 0x0002138E, + 19397: 0x000217FC, + 19398: 0x00006490, + 19399: 0x00006F8A, + 19400: 0x00022E36, + 19401: 0x00009814, + 19402: 0x0002408C, + 19403: 0x0002571D, + 19404: 0x000064E1, + 19405: 0x000064E5, + 19406: 0x0000947B, + 19407: 0x00003A66, + 19408: 0x0000643A, + 19409: 0x00003A57, + 19410: 0x0000654D, + 19411: 0x00006F16, + 19412: 0x00024A28, + 19413: 0x00024A23, + 19414: 0x00006585, + 19415: 0x0000656D, + 19416: 0x0000655F, + 19417: 0x0002307E, + 19418: 0x000065B5, + 19419: 0x00024940, + 19420: 0x00004B37, + 19421: 0x000065D1, + 19422: 0x000040D8, + 19423: 0x00021829, + 19424: 0x000065E0, + 19425: 0x000065E3, + 19426: 0x00005FDF, + 19427: 0x00023400, + 19428: 0x00006618, + 19429: 0x000231F7, + 19430: 0x000231F8, + 19431: 0x00006644, + 19432: 0x000231A4, + 19433: 0x000231A5, + 19434: 0x0000664B, + 19435: 0x00020E75, + 19436: 0x00006667, + 19437: 0x000251E6, + 19438: 0x00006673, + 19439: 0x00006674, + 19440: 0x00021E3D, + 19441: 0x00023231, + 19442: 0x000285F4, + 19443: 0x000231C8, + 19444: 0x00025313, + 19445: 0x000077C5, + 19446: 0x000228F7, + 19447: 0x000099A4, + 19448: 0x00006702, + 19449: 0x0002439C, + 19450: 0x00024A21, + 19451: 0x00003B2B, + 19452: 0x000069FA, + 19453: 0x000237C2, + 19454: 0x0000675E, + 19455: 0x00006767, + 19456: 0x00006762, + 19457: 0x000241CD, + 19458: 0x000290ED, + 19459: 0x000067D7, + 19460: 0x000044E9, + 19461: 0x00006822, + 19462: 0x00006E50, + 19463: 0x0000923C, + 19464: 0x00006801, + 19465: 0x000233E6, + 19466: 0x00026DA0, + 19467: 0x0000685D, + 19468: 0x0002346F, + 19469: 0x000069E1, + 19470: 0x00006A0B, + 19471: 0x00028ADF, + 19472: 0x00006973, + 19473: 0x000068C3, + 19474: 0x000235CD, + 19475: 0x00006901, + 19476: 0x00006900, + 19477: 0x00003D32, + 19478: 0x00003A01, + 19479: 0x0002363C, + 19480: 0x00003B80, + 19481: 0x000067AC, + 19482: 0x00006961, + 19483: 0x00028A4A, + 19484: 0x000042FC, + 19485: 0x00006936, + 19486: 0x00006998, + 19487: 0x00003BA1, + 19488: 0x000203C9, + 19489: 0x00008363, + 19490: 0x00005090, + 19491: 0x000069F9, + 19492: 0x00023659, + 19493: 0x0002212A, + 19494: 0x00006A45, + 19495: 0x00023703, + 19496: 0x00006A9D, + 19497: 0x00003BF3, + 19498: 0x000067B1, + 19499: 0x00006AC8, + 19500: 0x0002919C, + 19501: 0x00003C0D, + 19502: 0x00006B1D, + 19503: 0x00020923, + 19504: 0x000060DE, + 19505: 0x00006B35, + 19506: 0x00006B74, + 19507: 0x000227CD, + 19508: 0x00006EB5, + 19509: 0x00023ADB, + 19510: 0x000203B5, + 19511: 0x00021958, + 19512: 0x00003740, + 19513: 0x00005421, + 19514: 0x00023B5A, + 19515: 0x00006BE1, + 19516: 0x00023EFC, + 19517: 0x00006BDC, + 19518: 0x00006C37, + 19519: 0x0002248B, + 19520: 0x000248F1, + 19521: 0x00026B51, + 19522: 0x00006C5A, + 19523: 0x00008226, + 19524: 0x00006C79, + 19525: 0x00023DBC, + 19526: 0x000044C5, + 19527: 0x00023DBD, + 19528: 0x000241A4, + 19529: 0x0002490C, + 19530: 0x00024900, + 19531: 0x00023CC9, + 19532: 0x000036E5, + 19533: 0x00003CEB, + 19534: 0x00020D32, + 19535: 0x00009B83, + 19536: 0x000231F9, + 19537: 0x00022491, + 19538: 0x00007F8F, + 19539: 0x00006837, + 19540: 0x00026D25, + 19541: 0x00026DA1, + 19542: 0x00026DEB, + 19543: 0x00006D96, + 19544: 0x00006D5C, + 19545: 0x00006E7C, + 19546: 0x00006F04, + 19547: 0x0002497F, + 19548: 0x00024085, + 19549: 0x00026E72, + 19550: 0x00008533, + 19551: 0x00026F74, + 19552: 0x000051C7, + 19553: 0x00006C9C, + 19554: 0x00006E1D, + 19555: 0x0000842E, + 19556: 0x00028B21, + 19557: 0x00006E2F, + 19558: 0x00023E2F, + 19559: 0x00007453, + 19560: 0x00023F82, + 19561: 0x000079CC, + 19562: 0x00006E4F, + 19563: 0x00005A91, + 19564: 0x0002304B, + 19565: 0x00006FF8, + 19566: 0x0000370D, + 19567: 0x00006F9D, + 19568: 0x00023E30, + 19569: 0x00006EFA, + 19570: 0x00021497, + 19571: 0x0002403D, + 19572: 0x00004555, + 19573: 0x000093F0, + 19574: 0x00006F44, + 19575: 0x00006F5C, + 19576: 0x00003D4E, + 19577: 0x00006F74, + 19578: 0x00029170, + 19579: 0x00003D3B, + 19580: 0x00006F9F, + 19581: 0x00024144, + 19582: 0x00006FD3, + 19583: 0x00024091, + 19584: 0x00024155, + 19585: 0x00024039, + 19586: 0x00023FF0, + 19587: 0x00023FB4, + 19588: 0x0002413F, + 19589: 0x000051DF, + 19590: 0x00024156, + 19591: 0x00024157, + 19592: 0x00024140, + 19593: 0x000261DD, + 19594: 0x0000704B, + 19595: 0x0000707E, + 19596: 0x000070A7, + 19597: 0x00007081, + 19598: 0x000070CC, + 19599: 0x000070D5, + 19600: 0x000070D6, + 19601: 0x000070DF, + 19602: 0x00004104, + 19603: 0x00003DE8, + 19604: 0x000071B4, + 19605: 0x00007196, + 19606: 0x00024277, + 19607: 0x0000712B, + 19608: 0x00007145, + 19609: 0x00005A88, + 19610: 0x0000714A, + 19611: 0x0000716E, + 19612: 0x00005C9C, + 19613: 0x00024365, + 19614: 0x0000714F, + 19615: 0x00009362, + 19616: 0x000242C1, + 19617: 0x0000712C, + 19618: 0x0002445A, + 19619: 0x00024A27, + 19620: 0x00024A22, + 19621: 0x000071BA, + 19622: 0x00028BE8, + 19623: 0x000070BD, + 19624: 0x0000720E, + 19625: 0x00009442, + 19626: 0x00007215, + 19627: 0x00005911, + 19628: 0x00009443, + 19629: 0x00007224, + 19630: 0x00009341, + 19631: 0x00025605, + 19632: 0x0000722E, + 19633: 0x00007240, + 19634: 0x00024974, + 19635: 0x000068BD, + 19636: 0x00007255, + 19637: 0x00007257, + 19638: 0x00003E55, + 19639: 0x00023044, + 19640: 0x0000680D, + 19641: 0x00006F3D, + 19642: 0x00007282, + 19643: 0x0000732A, + 19644: 0x0000732B, + 19645: 0x00024823, + 19646: 0x0002882B, + 19647: 0x000048ED, + 19648: 0x00028804, + 19649: 0x00007328, + 19650: 0x0000732E, + 19651: 0x000073CF, + 19652: 0x000073AA, + 19653: 0x00020C3A, + 19654: 0x00026A2E, + 19655: 0x000073C9, + 19656: 0x00007449, + 19657: 0x000241E2, + 19658: 0x000216E7, + 19659: 0x00024A24, + 19660: 0x00006623, + 19661: 0x000036C5, + 19662: 0x000249B7, + 19663: 0x0002498D, + 19664: 0x000249FB, + 19665: 0x000073F7, + 19666: 0x00007415, + 19667: 0x00006903, + 19668: 0x00024A26, + 19669: 0x00007439, + 19670: 0x000205C3, + 19671: 0x00003ED7, + 19672: 0x0000745C, + 19673: 0x000228AD, + 19674: 0x00007460, + 19675: 0x00028EB2, + 19676: 0x00007447, + 19677: 0x000073E4, + 19678: 0x00007476, + 19679: 0x000083B9, + 19680: 0x0000746C, + 19681: 0x00003730, + 19682: 0x00007474, + 19683: 0x000093F1, + 19684: 0x00006A2C, + 19685: 0x00007482, + 19686: 0x00004953, + 19687: 0x00024A8C, + 19688: 0x0002415F, + 19689: 0x00024A79, + 19690: 0x00028B8F, + 19691: 0x00005B46, + 19692: 0x00028C03, + 19693: 0x0002189E, + 19694: 0x000074C8, + 19695: 0x00021988, + 19696: 0x0000750E, + 19697: 0x000074E9, + 19698: 0x0000751E, + 19699: 0x00028ED9, + 19700: 0x00021A4B, + 19701: 0x00005BD7, + 19702: 0x00028EAC, + 19703: 0x00009385, + 19704: 0x0000754D, + 19705: 0x0000754A, + 19706: 0x00007567, + 19707: 0x0000756E, + 19708: 0x00024F82, + 19709: 0x00003F04, + 19710: 0x00024D13, + 19711: 0x0000758E, + 19712: 0x0000745D, + 19713: 0x0000759E, + 19714: 0x000075B4, + 19715: 0x00007602, + 19716: 0x0000762C, + 19717: 0x00007651, + 19718: 0x0000764F, + 19719: 0x0000766F, + 19720: 0x00007676, + 19721: 0x000263F5, + 19722: 0x00007690, + 19723: 0x000081EF, + 19724: 0x000037F8, + 19725: 0x00026911, + 19726: 0x0002690E, + 19727: 0x000076A1, + 19728: 0x000076A5, + 19729: 0x000076B7, + 19730: 0x000076CC, + 19731: 0x00026F9F, + 19732: 0x00008462, + 19733: 0x0002509D, + 19734: 0x0002517D, + 19735: 0x00021E1C, + 19736: 0x0000771E, + 19737: 0x00007726, + 19738: 0x00007740, + 19739: 0x000064AF, + 19740: 0x00025220, + 19741: 0x00007758, + 19742: 0x000232AC, + 19743: 0x000077AF, + 19744: 0x00028964, + 19745: 0x00028968, + 19746: 0x000216C1, + 19747: 0x000077F4, + 19748: 0x00007809, + 19749: 0x00021376, + 19750: 0x00024A12, + 19751: 0x000068CA, + 19752: 0x000078AF, + 19753: 0x000078C7, + 19754: 0x000078D3, + 19755: 0x000096A5, + 19756: 0x0000792E, + 19757: 0x000255E0, + 19758: 0x000078D7, + 19759: 0x00007934, + 19760: 0x000078B1, + 19761: 0x0002760C, + 19762: 0x00008FB8, + 19763: 0x00008884, + 19764: 0x00028B2B, + 19765: 0x00026083, + 19766: 0x0002261C, + 19767: 0x00007986, + 19768: 0x00008900, + 19769: 0x00006902, + 19770: 0x00007980, + 19771: 0x00025857, + 19772: 0x0000799D, + 19773: 0x00027B39, + 19774: 0x0000793C, + 19775: 0x000079A9, + 19776: 0x00006E2A, + 19777: 0x00027126, + 19778: 0x00003EA8, + 19779: 0x000079C6, + 19780: 0x0002910D, + 19781: 0x000079D4, +} + +const numEncodeTables = 8 + +// encodeX are the encoding tables from Unicode to Big5 code, +// sorted by decreasing length. +// encode0: 42633 entries for runes in [131105, 173738). +// encode1: 29004 entries for runes in [ 11904, 40908). +// encode2: 2176 entries for runes in [ 7870, 10046). +// encode3: 939 entries for runes in [ 167, 1106). +// encode4: 446 entries for runes in [ 65072, 65518). +// encode5: 432 entries for runes in [194597, 195029). +// encode6: 263 entries for runes in [ 63751, 64014). +// encode7: 1 entries for runes in [175615, 175616). + +const encode0Low, encode0High = 131105, 173738 + +var encode0 = [...]uint16{ + 131105 - 131105: 0x9C71, + 131134 - 131105: 0x9375, + 131142 - 131105: 0x9376, + 131150 - 131105: 0x9548, + 131176 - 131105: 0x8EC6, + 131206 - 131105: 0x8BC5, + 131207 - 131105: 0x8BFA, + 131210 - 131105: 0xC87C, + 131220 - 131105: 0x9AB4, + 131274 - 131105: 0x884E, + 131275 - 131105: 0x884B, + 131276 - 131105: 0xC87A, + 131277 - 131105: 0x8848, + 131281 - 131105: 0x8847, + 131310 - 131105: 0xA0F6, + 131340 - 131105: 0x8845, + 131342 - 131105: 0x8853, + 131352 - 131105: 0xFCAD, + 131492 - 131105: 0x8CF5, + 131497 - 131105: 0x8AAD, + 131499 - 131105: 0x9272, + 131521 - 131105: 0xFC47, + 131540 - 131105: 0x94DF, + 131570 - 131105: 0x9FD1, + 131588 - 131105: 0xFBCB, + 131596 - 131105: 0x927D, + 131604 - 131105: 0x98A4, + 131641 - 131105: 0x8CF9, + 131675 - 131105: 0x94E7, + 131700 - 131105: 0x90CB, + 131701 - 131105: 0x927B, + 131737 - 131105: 0x94D8, + 131742 - 131105: 0xFC5F, + 131744 - 131105: 0xFA54, + 131767 - 131105: 0x9AB5, + 131775 - 131105: 0x96DA, + 131776 - 131105: 0x9279, + 131813 - 131105: 0xFA74, + 131850 - 131105: 0x9275, + 131877 - 131105: 0x8DFB, + 131905 - 131105: 0x8A49, + 131909 - 131105: 0x92DF, + 131910 - 131105: 0x9B7C, + 131911 - 131105: 0xFA63, + 131966 - 131105: 0xFA60, + 131967 - 131105: 0x926D, + 131968 - 131105: 0xFA62, + 132000 - 131105: 0x9AB6, + 132007 - 131105: 0x976B, + 132021 - 131105: 0xFD6A, + 132041 - 131105: 0xFD54, + 132043 - 131105: 0x9273, + 132085 - 131105: 0x97D8, + 132092 - 131105: 0x9FBB, + 132115 - 131105: 0x9342, + 132116 - 131105: 0x9276, + 132127 - 131105: 0xFA65, + 132197 - 131105: 0x926C, + 132231 - 131105: 0xFA6E, + 132238 - 131105: 0x9EE0, + 132241 - 131105: 0x92C0, + 132242 - 131105: 0x92BF, + 132259 - 131105: 0x92BE, + 132311 - 131105: 0x9ABA, + 132348 - 131105: 0x8AB3, + 132350 - 131105: 0x9775, + 132423 - 131105: 0xFA40, + 132494 - 131105: 0xFA76, + 132517 - 131105: 0xFBD0, + 132531 - 131105: 0xFA7B, + 132547 - 131105: 0xFE6D, + 132554 - 131105: 0x9BB3, + 132560 - 131105: 0x89CC, + 132565 - 131105: 0x9ABE, + 132575 - 131105: 0xFA42, + 132576 - 131105: 0x92BC, + 132587 - 131105: 0x945C, + 132625 - 131105: 0x9BB5, + 132629 - 131105: 0x9ABF, + 132633 - 131105: 0x98A7, + 132634 - 131105: 0x97A4, + 132656 - 131105: 0x90FD, + 132694 - 131105: 0xFC7B, + 132726 - 131105: 0x9AC0, + 132878 - 131105: 0x92C3, + 132913 - 131105: 0x8AAA, + 132985 - 131105: 0x9BD0, + 133164 - 131105: 0x9550, + 133235 - 131105: 0x92C6, + 133333 - 131105: 0x98A6, + 133398 - 131105: 0x9546, + 133411 - 131105: 0xFD63, + 133460 - 131105: 0xFAC2, + 133497 - 131105: 0x9EC3, + 133607 - 131105: 0x89B2, + 133649 - 131105: 0x9C66, + 133712 - 131105: 0x9053, + 133743 - 131105: 0x8C62, + 133770 - 131105: 0x87A8, + 133812 - 131105: 0x97C1, + 133826 - 131105: 0x9AC4, + 133837 - 131105: 0x9AC5, + 133901 - 131105: 0x8EEF, + 134031 - 131105: 0xFAE9, + 134047 - 131105: 0x8D40, + 134056 - 131105: 0x9262, + 134057 - 131105: 0x8AF7, + 134079 - 131105: 0x9AC6, + 134086 - 131105: 0x92E1, + 134091 - 131105: 0x9AC9, + 134114 - 131105: 0xFAC6, + 134123 - 131105: 0x97A5, + 134139 - 131105: 0x9ACB, + 134143 - 131105: 0xFA72, + 134155 - 131105: 0x8A5E, + 134157 - 131105: 0x94E0, + 134176 - 131105: 0x92CC, + 134196 - 131105: 0x8AE5, + 134202 - 131105: 0xFE5C, + 134203 - 131105: 0x9ACC, + 134209 - 131105: 0x9DF9, + 134210 - 131105: 0x8A43, + 134211 - 131105: 0x8AA6, + 134227 - 131105: 0x9ACD, + 134245 - 131105: 0x9ACE, + 134263 - 131105: 0xFAEE, + 134264 - 131105: 0x9BCC, + 134268 - 131105: 0x9ACF, + 134285 - 131105: 0x9AD1, + 134294 - 131105: 0x9DFA, + 134300 - 131105: 0x9D7C, + 134325 - 131105: 0x9AD3, + 134328 - 131105: 0x97A6, + 134351 - 131105: 0x995F, + 134355 - 131105: 0xFBF6, + 134356 - 131105: 0x9FC5, + 134357 - 131105: 0x8A59, + 134358 - 131105: 0x8B6B, + 134365 - 131105: 0x9AD4, + 134381 - 131105: 0x9AD5, + 134399 - 131105: 0x97A2, + 134421 - 131105: 0x8A44, + 134440 - 131105: 0x9F4A, + 134449 - 131105: 0x90A1, + 134450 - 131105: 0xFDA4, + 134470 - 131105: 0x8A64, + 134471 - 131105: 0x8AF2, + 134472 - 131105: 0x8AF8, + 134473 - 131105: 0x9DD8, + 134476 - 131105: 0x94D6, + 134477 - 131105: 0xFAFE, + 134478 - 131105: 0xFBA7, + 134511 - 131105: 0x9AD6, + 134513 - 131105: 0x9F4D, + 134516 - 131105: 0xFAF6, + 134524 - 131105: 0x8A57, + 134526 - 131105: 0x8B43, + 134527 - 131105: 0x8B44, + 134550 - 131105: 0x8AB6, + 134556 - 131105: 0x8AC0, + 134567 - 131105: 0x9E54, + 134578 - 131105: 0x9AD7, + 134600 - 131105: 0x9AD8, + 134660 - 131105: 0x9ADC, + 134665 - 131105: 0x8ACA, + 134666 - 131105: 0x9EA8, + 134669 - 131105: 0x9263, + 134670 - 131105: 0x9ADD, + 134671 - 131105: 0x8B65, + 134672 - 131105: 0x8B6F, + 134673 - 131105: 0x8B7E, + 134678 - 131105: 0x8F43, + 134685 - 131105: 0x92D0, + 134732 - 131105: 0x8AF4, + 134765 - 131105: 0x9DBE, + 134771 - 131105: 0x9AE1, + 134773 - 131105: 0xFCDE, + 134774 - 131105: 0x9DFD, + 134775 - 131105: 0x8B66, + 134776 - 131105: 0x8B70, + 134777 - 131105: 0x8B75, + 134778 - 131105: 0x8AE4, + 134779 - 131105: 0x8BA4, + 134796 - 131105: 0x8AED, + 134806 - 131105: 0x8A5D, + 134808 - 131105: 0x8B48, + 134813 - 131105: 0x9DED, + 134818 - 131105: 0x9E40, + 134826 - 131105: 0x8AEF, + 134827 - 131105: 0x8AF6, + 134828 - 131105: 0x9E76, + 134838 - 131105: 0x9EE3, + 134871 - 131105: 0x9ADE, + 134872 - 131105: 0x8DFE, + 134877 - 131105: 0xFAFC, + 134904 - 131105: 0x9CB1, + 134905 - 131105: 0x9E77, + 134906 - 131105: 0x8B64, + 134907 - 131105: 0x8B67, + 134941 - 131105: 0x974B, + 134950 - 131105: 0x9653, + 134957 - 131105: 0x9AE0, + 134958 - 131105: 0x8B4A, + 134960 - 131105: 0x8AF1, + 134961 - 131105: 0x8AD7, + 134971 - 131105: 0xA0AB, + 134988 - 131105: 0x8AB5, + 135012 - 131105: 0x8A5F, + 135053 - 131105: 0x8AEE, + 135056 - 131105: 0x9ADF, + 135085 - 131105: 0x8AFE, + 135092 - 131105: 0x8A58, + 135093 - 131105: 0x8BA3, + 135094 - 131105: 0x8BA7, + 135100 - 131105: 0x9AE3, + 135135 - 131105: 0x9261, + 135146 - 131105: 0x9DD7, + 135147 - 131105: 0x9E7D, + 135148 - 131105: 0x9EA7, + 135149 - 131105: 0x9EAB, + 135188 - 131105: 0x9042, + 135197 - 131105: 0x8B79, + 135198 - 131105: 0x8B7A, + 135247 - 131105: 0x9AE6, + 135260 - 131105: 0x9AE5, + 135279 - 131105: 0x8A7E, + 135285 - 131105: 0x9E44, + 135286 - 131105: 0x9AE7, + 135287 - 131105: 0x8A7C, + 135288 - 131105: 0x8B71, + 135291 - 131105: 0x9AE9, + 135304 - 131105: 0x9AEA, + 135318 - 131105: 0x9AEB, + 135325 - 131105: 0x8ABD, + 135348 - 131105: 0xFB4E, + 135359 - 131105: 0x9AED, + 135360 - 131105: 0x8AF9, + 135361 - 131105: 0x9E63, + 135367 - 131105: 0x8B49, + 135368 - 131105: 0x8ACE, + 135369 - 131105: 0x8B6E, + 135375 - 131105: 0x8AE8, + 135379 - 131105: 0x9AEE, + 135396 - 131105: 0x92CE, + 135412 - 131105: 0x8A5A, + 135413 - 131105: 0x8B7B, + 135414 - 131105: 0x8B7C, + 135471 - 131105: 0x9AEF, + 135483 - 131105: 0x9AF0, + 135485 - 131105: 0x8AFA, + 135493 - 131105: 0x8941, + 135496 - 131105: 0x8B72, + 135503 - 131105: 0x8AF3, + 135552 - 131105: 0x8BA8, + 135559 - 131105: 0x9EAE, + 135641 - 131105: 0x9E72, + 135740 - 131105: 0xFB73, + 135759 - 131105: 0xFB5F, + 135804 - 131105: 0x90BA, + 135848 - 131105: 0x91FE, + 135849 - 131105: 0x9EF6, + 135856 - 131105: 0x97ED, + 135907 - 131105: 0x9AF3, + 135934 - 131105: 0xA0EE, + 135938 - 131105: 0x967C, + 135939 - 131105: 0x9345, + 135940 - 131105: 0x986E, + 135941 - 131105: 0xFA56, + 135990 - 131105: 0x9AF5, + 135994 - 131105: 0xFC4B, + 136053 - 131105: 0x9AF4, + 136054 - 131105: 0xFEDE, + 136078 - 131105: 0xFCB7, + 136088 - 131105: 0x97F1, + 136092 - 131105: 0x97C7, + 136133 - 131105: 0x9CCB, + 136134 - 131105: 0x9240, + 136173 - 131105: 0x9CE8, + 136190 - 131105: 0x91FD, + 136211 - 131105: 0x974E, + 136214 - 131105: 0xFB68, + 136228 - 131105: 0x976C, + 136255 - 131105: 0x8CC2, + 136274 - 131105: 0x97E8, + 136276 - 131105: 0xFB6A, + 136277 - 131105: 0x8B74, + 136330 - 131105: 0x8EE7, + 136343 - 131105: 0xFDC8, + 136374 - 131105: 0x9241, + 136424 - 131105: 0x96A1, + 136445 - 131105: 0x8EF3, + 136567 - 131105: 0x9AF7, + 136578 - 131105: 0x8FA6, + 136598 - 131105: 0xFAD6, + 136714 - 131105: 0x9CC7, + 136723 - 131105: 0xFAD7, + 136729 - 131105: 0x9AF8, + 136766 - 131105: 0xFBA1, + 136801 - 131105: 0x8EC5, + 136850 - 131105: 0xFBA4, + 136888 - 131105: 0xFBC2, + 136890 - 131105: 0x9AC1, + 136896 - 131105: 0x91FA, + 136897 - 131105: 0xFEDB, + 136898 - 131105: 0x97AB, + 136915 - 131105: 0x9147, + 136917 - 131105: 0xFBB1, + 136927 - 131105: 0x8FEA, + 136934 - 131105: 0x94D2, + 136935 - 131105: 0xFE61, + 136936 - 131105: 0xFACE, + 136954 - 131105: 0x92ED, + 136955 - 131105: 0x91F3, + 136956 - 131105: 0x93C6, + 136958 - 131105: 0x935A, + 136973 - 131105: 0xFAFB, + 136976 - 131105: 0x92EF, + 136998 - 131105: 0xFAC8, + 137018 - 131105: 0x9847, + 137019 - 131105: 0x9366, + 137020 - 131105: 0x9855, + 137047 - 131105: 0x96E6, + 137068 - 131105: 0x9F43, + 137069 - 131105: 0x9FAA, + 137070 - 131105: 0x94DA, + 137071 - 131105: 0x92EE, + 137072 - 131105: 0xFCAF, + 137073 - 131105: 0xFBFB, + 137075 - 131105: 0x8EF9, + 137076 - 131105: 0x91F6, + 137131 - 131105: 0x9364, + 137136 - 131105: 0x94F5, + 137137 - 131105: 0x9CB6, + 137138 - 131105: 0xFBAD, + 137139 - 131105: 0x984E, + 137140 - 131105: 0x8F44, + 137141 - 131105: 0x96FD, + 137155 - 131105: 0x9AF9, + 137159 - 131105: 0x9AFA, + 137177 - 131105: 0x9769, + 137178 - 131105: 0x95D4, + 137179 - 131105: 0x984B, + 137180 - 131105: 0xFBAA, + 137183 - 131105: 0x987C, + 137199 - 131105: 0x91EA, + 137205 - 131105: 0x9DAF, + 137206 - 131105: 0x9DC5, + 137208 - 131105: 0x91F1, + 137209 - 131105: 0x8EB1, + 137210 - 131105: 0x97A9, + 137211 - 131105: 0xFBAC, + 137212 - 131105: 0xFCB8, + 137248 - 131105: 0x9CB9, + 137256 - 131105: 0xFBB0, + 137257 - 131105: 0xFCD2, + 137258 - 131105: 0x93CB, + 137261 - 131105: 0x9AFD, + 137273 - 131105: 0x91F4, + 137274 - 131105: 0x8BAC, + 137275 - 131105: 0xA055, + 137280 - 131105: 0x9574, + 137285 - 131105: 0x95BE, + 137298 - 131105: 0x97AD, + 137310 - 131105: 0x8EE9, + 137313 - 131105: 0x92F8, + 137314 - 131105: 0x97BE, + 137315 - 131105: 0x916C, + 137316 - 131105: 0x94AA, + 137335 - 131105: 0xFC63, + 137339 - 131105: 0x9DC6, + 137347 - 131105: 0x97B5, + 137348 - 131105: 0x92B8, + 137349 - 131105: 0x91EF, + 137374 - 131105: 0xFEA6, + 137375 - 131105: 0x9760, + 137376 - 131105: 0x9358, + 137377 - 131105: 0x9576, + 137378 - 131105: 0x8FAC, + 137406 - 131105: 0x91EC, + 137407 - 131105: 0x97B4, + 137425 - 131105: 0x91F7, + 137430 - 131105: 0x974A, + 137431 - 131105: 0xFB49, + 137432 - 131105: 0x9578, + 137433 - 131105: 0x93BC, + 137466 - 131105: 0x91D6, + 137475 - 131105: 0x9355, + 137476 - 131105: 0x9356, + 137477 - 131105: 0x9851, + 137488 - 131105: 0x8FF8, + 137489 - 131105: 0xFBC0, + 137490 - 131105: 0x93F2, + 137493 - 131105: 0x90D0, + 137500 - 131105: 0x9C44, + 137506 - 131105: 0x9255, + 137511 - 131105: 0x9363, + 137531 - 131105: 0x91A5, + 137540 - 131105: 0xA0ED, + 137560 - 131105: 0xFD6B, + 137578 - 131105: 0x9AFE, + 137596 - 131105: 0x9351, + 137600 - 131105: 0x8C57, + 137603 - 131105: 0xFA78, + 137608 - 131105: 0xFEA8, + 137622 - 131105: 0x9350, + 137691 - 131105: 0xFA4C, + 137715 - 131105: 0x92F7, + 137773 - 131105: 0x9B40, + 137780 - 131105: 0xFBCE, + 137797 - 131105: 0x9B41, + 137803 - 131105: 0xFEAD, + 137827 - 131105: 0x8761, + 138052 - 131105: 0xFBD5, + 138177 - 131105: 0x8BC2, + 138178 - 131105: 0x9A7C, + 138282 - 131105: 0x9B42, + 138352 - 131105: 0x9B43, + 138402 - 131105: 0x9E79, + 138405 - 131105: 0xFBD9, + 138412 - 131105: 0x9B44, + 138566 - 131105: 0xA0A7, + 138579 - 131105: 0x877B, + 138590 - 131105: 0x876E, + 138640 - 131105: 0x9BF3, + 138678 - 131105: 0x8C79, + 138682 - 131105: 0x935E, + 138698 - 131105: 0x89CB, + 138705 - 131105: 0x9F53, + 138731 - 131105: 0x93D7, + 138745 - 131105: 0xFBE1, + 138780 - 131105: 0xFED0, + 138787 - 131105: 0x8CF1, + 138807 - 131105: 0xFBE2, + 138813 - 131105: 0xFCE3, + 138889 - 131105: 0x9074, + 138916 - 131105: 0xFBE6, + 138920 - 131105: 0x9BB7, + 138952 - 131105: 0x9B45, + 138965 - 131105: 0x9B47, + 139023 - 131105: 0x9F50, + 139029 - 131105: 0x9B48, + 139114 - 131105: 0xFC5B, + 139166 - 131105: 0x98A9, + 139169 - 131105: 0x9CFD, + 139240 - 131105: 0x884C, + 139333 - 131105: 0x9B4B, + 139337 - 131105: 0xFBEC, + 139390 - 131105: 0x8C69, + 139418 - 131105: 0x9BA8, + 139463 - 131105: 0x8AD5, + 139516 - 131105: 0xFA73, + 139562 - 131105: 0xFD59, + 139611 - 131105: 0x91A2, + 139635 - 131105: 0xFBED, + 139642 - 131105: 0x9CA9, + 139681 - 131105: 0x8AA8, + 139713 - 131105: 0x8D42, + 139715 - 131105: 0x9BC3, + 139784 - 131105: 0x8AE1, + 139900 - 131105: 0x9B4E, + 140065 - 131105: 0x95D0, + 140069 - 131105: 0x905F, + 140221 - 131105: 0x97EE, + 140240 - 131105: 0xFC4E, + 140247 - 131105: 0x9B4F, + 140282 - 131105: 0x9B50, + 140389 - 131105: 0x9EC6, + 140401 - 131105: 0xFC50, + 140427 - 131105: 0xFD73, + 140433 - 131105: 0xFDA7, + 140464 - 131105: 0x9DA2, + 140476 - 131105: 0x87D1, + 140481 - 131105: 0x87D3, + 140489 - 131105: 0x87D4, + 140492 - 131105: 0x87D5, + 140525 - 131105: 0xFA58, + 140563 - 131105: 0xFA5E, + 140571 - 131105: 0xA059, + 140592 - 131105: 0xFA75, + 140628 - 131105: 0xFBBE, + 140685 - 131105: 0x9CA2, + 140719 - 131105: 0x9370, + 140734 - 131105: 0x9371, + 140827 - 131105: 0x9377, + 140828 - 131105: 0xFEEF, + 140843 - 131105: 0x936D, + 140904 - 131105: 0xFC5D, + 140922 - 131105: 0x90B8, + 140950 - 131105: 0x8AFC, + 140952 - 131105: 0xFB41, + 141044 - 131105: 0x9E6B, + 141045 - 131105: 0x94E3, + 141046 - 131105: 0x8EE2, + 141074 - 131105: 0x8C7D, + 141076 - 131105: 0x8ED7, + 141083 - 131105: 0x9C4D, + 141087 - 131105: 0x96A3, + 141098 - 131105: 0x9B51, + 141173 - 131105: 0x8AC3, + 141185 - 131105: 0x96AA, + 141206 - 131105: 0x8CE2, + 141236 - 131105: 0xFC68, + 141237 - 131105: 0x8B6D, + 141261 - 131105: 0xFD67, + 141315 - 131105: 0x8AE9, + 141407 - 131105: 0xFCA1, + 141408 - 131105: 0x936C, + 141425 - 131105: 0x9B52, + 141485 - 131105: 0xFE70, + 141505 - 131105: 0xFCA8, + 141559 - 131105: 0xFCE9, + 141606 - 131105: 0x9CB4, + 141625 - 131105: 0x8AEA, + 141647 - 131105: 0x9B53, + 141671 - 131105: 0x9B55, + 141675 - 131105: 0x96AB, + 141696 - 131105: 0xFCA7, + 141715 - 131105: 0x9B56, + 141926 - 131105: 0x8ABC, + 142031 - 131105: 0x8ACB, + 142037 - 131105: 0x9B57, + 142054 - 131105: 0x89CD, + 142056 - 131105: 0x9B59, + 142094 - 131105: 0x9B5B, + 142114 - 131105: 0x93A5, + 142143 - 131105: 0x9B5D, + 142147 - 131105: 0x9E4F, + 142186 - 131105: 0x93A3, + 142282 - 131105: 0x8A7B, + 142286 - 131105: 0x8B42, + 142374 - 131105: 0x9750, + 142375 - 131105: 0x8FB3, + 142392 - 131105: 0x8A50, + 142412 - 131105: 0x9B60, + 142417 - 131105: 0x8B45, + 142421 - 131105: 0x8B46, + 142434 - 131105: 0x9DFE, + 142472 - 131105: 0x9B62, + 142491 - 131105: 0x937B, + 142497 - 131105: 0x93B1, + 142505 - 131105: 0x8A60, + 142514 - 131105: 0x8AD8, + 142519 - 131105: 0x9B63, + 142530 - 131105: 0x8A69, + 142534 - 131105: 0x8A47, + 142537 - 131105: 0x8ACC, + 142599 - 131105: 0x937C, + 142600 - 131105: 0x9B65, + 142610 - 131105: 0x9B66, + 142660 - 131105: 0x8A72, + 142668 - 131105: 0x8A7A, + 142695 - 131105: 0x93AF, + 142733 - 131105: 0x8AB0, + 142741 - 131105: 0x9B68, + 142752 - 131105: 0x9EA3, + 142755 - 131105: 0xFAEC, + 142756 - 131105: 0x8B77, + 142775 - 131105: 0x9B67, + 142830 - 131105: 0x8B59, + 142861 - 131105: 0xFCB1, + 142902 - 131105: 0xFCBB, + 142914 - 131105: 0x9B69, + 142968 - 131105: 0x93A8, + 142987 - 131105: 0x8AE0, + 143027 - 131105: 0x9E51, + 143087 - 131105: 0x8F5F, + 143220 - 131105: 0x9B6A, + 143308 - 131105: 0x9B6B, + 143331 - 131105: 0x97EC, + 143411 - 131105: 0x9B6C, + 143428 - 131105: 0xFE4E, + 143435 - 131105: 0xFDC2, + 143462 - 131105: 0x9B6D, + 143485 - 131105: 0x9167, + 143486 - 131105: 0xFCCC, + 143502 - 131105: 0x93B6, + 143543 - 131105: 0x90E4, + 143548 - 131105: 0x90E5, + 143578 - 131105: 0x9EF2, + 143619 - 131105: 0x93CA, + 143677 - 131105: 0x8BBC, + 143741 - 131105: 0x8F46, + 143746 - 131105: 0x93CF, + 143780 - 131105: 0xFCDB, + 143781 - 131105: 0xFCDC, + 143795 - 131105: 0x93C0, + 143816 - 131105: 0xFCE6, + 143817 - 131105: 0x96E7, + 143850 - 131105: 0x87A7, + 143863 - 131105: 0xFCD8, + 143864 - 131105: 0xFCD9, + 143865 - 131105: 0xFDA6, + 143887 - 131105: 0x93CE, + 143909 - 131105: 0x95F1, + 143919 - 131105: 0x9CE9, + 143921 - 131105: 0xFCE4, + 143922 - 131105: 0x94AF, + 143923 - 131105: 0xFA77, + 143924 - 131105: 0x93CC, + 143958 - 131105: 0x8CE1, + 143966 - 131105: 0x87A9, + 143970 - 131105: 0x905A, + 144001 - 131105: 0x8C54, + 144009 - 131105: 0x93BF, + 144010 - 131105: 0xFB51, + 144043 - 131105: 0x93B9, + 144044 - 131105: 0xFED7, + 144045 - 131105: 0x93B7, + 144082 - 131105: 0x93D9, + 144096 - 131105: 0x93BB, + 144097 - 131105: 0x93DA, + 144128 - 131105: 0x98A3, + 144138 - 131105: 0x90D1, + 144159 - 131105: 0x9B6E, + 144308 - 131105: 0xFA70, + 144332 - 131105: 0x9BEB, + 144350 - 131105: 0x9B6F, + 144358 - 131105: 0xFCFC, + 144372 - 131105: 0x8B40, + 144373 - 131105: 0xA07B, + 144377 - 131105: 0x8CA1, + 144378 - 131105: 0x97F7, + 144382 - 131105: 0x93E2, + 144384 - 131105: 0xFCD6, + 144447 - 131105: 0x9559, + 144464 - 131105: 0x93A6, + 144495 - 131105: 0xFD40, + 144498 - 131105: 0x935F, + 144613 - 131105: 0x97F2, + 144665 - 131105: 0x9C76, + 144688 - 131105: 0x8EF8, + 144721 - 131105: 0x8CEB, + 144730 - 131105: 0x8F47, + 144743 - 131105: 0x9B74, + 144789 - 131105: 0x92B4, + 144793 - 131105: 0x91ED, + 144796 - 131105: 0x96D2, + 144827 - 131105: 0x87D8, + 144845 - 131105: 0xFD46, + 144846 - 131105: 0x8F4F, + 144847 - 131105: 0x9549, + 144883 - 131105: 0x9B75, + 144896 - 131105: 0xFA5C, + 144919 - 131105: 0x8751, + 144922 - 131105: 0x9B79, + 144956 - 131105: 0xFD4B, + 144960 - 131105: 0x96D3, + 144985 - 131105: 0xFD58, + 144991 - 131105: 0x945F, + 145015 - 131105: 0xA0F5, + 145038 - 131105: 0x87C7, + 145054 - 131105: 0x877C, + 145062 - 131105: 0x9243, + 145069 - 131105: 0x97FA, + 145082 - 131105: 0x9DD9, + 145119 - 131105: 0x97F4, + 145134 - 131105: 0x924D, + 145155 - 131105: 0xFD5B, + 145174 - 131105: 0x9B7A, + 145184 - 131105: 0x9ED5, + 145197 - 131105: 0xFAAE, + 145199 - 131105: 0x9CC9, + 145215 - 131105: 0x9258, + 145254 - 131105: 0x8EC8, + 145281 - 131105: 0x94B4, + 145314 - 131105: 0x93E1, + 145340 - 131105: 0x93DF, + 145346 - 131105: 0xFCF0, + 145365 - 131105: 0x93EC, + 145366 - 131105: 0x97F6, + 145367 - 131105: 0x96CF, + 145466 - 131105: 0x93DE, + 145858 - 131105: 0x8ACF, + 146087 - 131105: 0x9BA2, + 146139 - 131105: 0xFD69, + 146158 - 131105: 0x9352, + 146170 - 131105: 0x98A2, + 146202 - 131105: 0x8CE7, + 146266 - 131105: 0xFD6E, + 146531 - 131105: 0x8CA4, + 146585 - 131105: 0xFA7C, + 146586 - 131105: 0x93FA, + 146587 - 131105: 0x907C, + 146613 - 131105: 0x8F67, + 146615 - 131105: 0x9DB7, + 146631 - 131105: 0xA0E9, + 146632 - 131105: 0xFA4E, + 146633 - 131105: 0xFDA1, + 146684 - 131105: 0x9E74, + 146685 - 131105: 0x9FBF, + 146686 - 131105: 0x9ECB, + 146687 - 131105: 0x9BB9, + 146752 - 131105: 0x9DD4, + 146779 - 131105: 0x97B9, + 146814 - 131105: 0x8EF1, + 146831 - 131105: 0x957B, + 146870 - 131105: 0x9ED2, + 146871 - 131105: 0x9753, + 146872 - 131105: 0x96A4, + 146873 - 131105: 0x8FBE, + 146874 - 131105: 0x94D9, + 146875 - 131105: 0x9058, + 146876 - 131105: 0xFD79, + 146877 - 131105: 0xFD7B, + 146915 - 131105: 0x8EDA, + 146936 - 131105: 0x8EFA, + 146950 - 131105: 0x8762, + 146961 - 131105: 0x9BA5, + 146988 - 131105: 0x9ED9, + 146989 - 131105: 0x97D4, + 146990 - 131105: 0x90BB, + 146991 - 131105: 0xFDBC, + 146992 - 131105: 0xFDC6, + 146993 - 131105: 0x9248, + 147001 - 131105: 0x92B5, + 147080 - 131105: 0x9DC1, + 147081 - 131105: 0x92B9, + 147082 - 131105: 0x92A6, + 147083 - 131105: 0x8F4B, + 147129 - 131105: 0x9BA6, + 147135 - 131105: 0x92B6, + 147159 - 131105: 0x8E40, + 147191 - 131105: 0x9ED8, + 147192 - 131105: 0x945E, + 147193 - 131105: 0x985F, + 147194 - 131105: 0x94CE, + 147195 - 131105: 0x924A, + 147196 - 131105: 0xFD70, + 147253 - 131105: 0x9467, + 147265 - 131105: 0x8DEC, + 147274 - 131105: 0x9BD8, + 147297 - 131105: 0x8763, + 147327 - 131105: 0x9448, + 147328 - 131105: 0xFAC1, + 147329 - 131105: 0x9CF7, + 147330 - 131105: 0xFDBE, + 147343 - 131105: 0x8FDA, + 147380 - 131105: 0xFDD9, + 147383 - 131105: 0xFC7E, + 147392 - 131105: 0x93F9, + 147397 - 131105: 0xFA43, + 147435 - 131105: 0xFAEB, + 147436 - 131105: 0xFAC3, + 147437 - 131105: 0x97D3, + 147438 - 131105: 0x95F9, + 147439 - 131105: 0x9C48, + 147440 - 131105: 0xFDD8, + 147473 - 131105: 0xA0D8, + 147513 - 131105: 0xFDD7, + 147514 - 131105: 0xFB4A, + 147515 - 131105: 0x9BAF, + 147516 - 131105: 0x944B, + 147517 - 131105: 0xFDC9, + 147543 - 131105: 0x8EAC, + 147589 - 131105: 0xFDB2, + 147595 - 131105: 0x925A, + 147596 - 131105: 0xFCBD, + 147597 - 131105: 0x92D9, + 147601 - 131105: 0xFDD5, + 147657 - 131105: 0x92DD, + 147681 - 131105: 0x9259, + 147692 - 131105: 0x8CF0, + 147716 - 131105: 0x96BA, + 147727 - 131105: 0x925B, + 147737 - 131105: 0x9BAB, + 147775 - 131105: 0xFDDA, + 147776 - 131105: 0xFDDE, + 147780 - 131105: 0xFDD3, + 147790 - 131105: 0x8C46, + 147797 - 131105: 0xFDD6, + 147798 - 131105: 0xFDDC, + 147799 - 131105: 0xFDDD, + 147804 - 131105: 0x90FE, + 147807 - 131105: 0xFEA1, + 147809 - 131105: 0x87A5, + 147831 - 131105: 0x8BAD, + 147834 - 131105: 0x9CD8, + 147875 - 131105: 0x9E6D, + 147876 - 131105: 0xFD7C, + 147877 - 131105: 0xFB61, + 147884 - 131105: 0x96F8, + 147893 - 131105: 0x96F0, + 147917 - 131105: 0xFCF4, + 147938 - 131105: 0xFE60, + 147964 - 131105: 0x9852, + 147995 - 131105: 0x964F, + 148043 - 131105: 0x916E, + 148054 - 131105: 0x986D, + 148057 - 131105: 0x9864, + 148086 - 131105: 0x9453, + 148087 - 131105: 0xFDEC, + 148088 - 131105: 0xFB78, + 148100 - 131105: 0x95BA, + 148115 - 131105: 0x985D, + 148117 - 131105: 0x92F9, + 148133 - 131105: 0x985A, + 148159 - 131105: 0x8750, + 148161 - 131105: 0xFDF6, + 148169 - 131105: 0x93D0, + 148170 - 131105: 0x9862, + 148206 - 131105: 0x9BAD, + 148218 - 131105: 0x974F, + 148237 - 131105: 0x9BAE, + 148250 - 131105: 0x9452, + 148276 - 131105: 0x9BB0, + 148296 - 131105: 0x91D2, + 148322 - 131105: 0x97EA, + 148323 - 131105: 0xFB6B, + 148324 - 131105: 0x91B1, + 148325 - 131105: 0xFDF3, + 148364 - 131105: 0x92CB, + 148374 - 131105: 0x9BB1, + 148380 - 131105: 0xFCEC, + 148413 - 131105: 0x986B, + 148417 - 131105: 0x9751, + 148457 - 131105: 0x9871, + 148458 - 131105: 0x95EF, + 148466 - 131105: 0x9EF3, + 148472 - 131105: 0x91E8, + 148484 - 131105: 0x9BBA, + 148533 - 131105: 0xFB4C, + 148534 - 131105: 0x926A, + 148570 - 131105: 0xFDF8, + 148571 - 131105: 0x9861, + 148595 - 131105: 0x91E7, + 148615 - 131105: 0x93ED, + 148616 - 131105: 0x9744, + 148665 - 131105: 0x91E1, + 148668 - 131105: 0xFBF5, + 148686 - 131105: 0x9869, + 148691 - 131105: 0x8A62, + 148694 - 131105: 0x9BBB, + 148741 - 131105: 0x8CA8, + 148769 - 131105: 0x9C55, + 148856 - 131105: 0x8E77, + 148936 - 131105: 0x8AB2, + 149016 - 131105: 0x9EBC, + 149034 - 131105: 0x93E6, + 149093 - 131105: 0x93A2, + 149108 - 131105: 0x9BBD, + 149143 - 131105: 0x94B3, + 149204 - 131105: 0x937D, + 149254 - 131105: 0x9E66, + 149285 - 131105: 0x9459, + 149295 - 131105: 0x9BBF, + 149391 - 131105: 0x9458, + 149472 - 131105: 0x9EA5, + 149522 - 131105: 0x9BC7, + 149539 - 131105: 0xFE54, + 149634 - 131105: 0x8E74, + 149737 - 131105: 0x8BD6, + 149744 - 131105: 0x94B6, + 149745 - 131105: 0xFD74, + 149746 - 131105: 0x98C0, + 149747 - 131105: 0x94A5, + 149755 - 131105: 0x9BC8, + 149759 - 131105: 0x95ED, + 149760 - 131105: 0xFD7E, + 149761 - 131105: 0xFBEB, + 149772 - 131105: 0xFD7D, + 149782 - 131105: 0x976F, + 149783 - 131105: 0x9461, + 149785 - 131105: 0x9FC1, + 149807 - 131105: 0x95D7, + 149811 - 131105: 0xFA52, + 149812 - 131105: 0x9C58, + 149822 - 131105: 0x9F68, + 149823 - 131105: 0x9BE7, + 149824 - 131105: 0xFCCE, + 149825 - 131105: 0x96E8, + 149826 - 131105: 0xFA49, + 149827 - 131105: 0x97A1, + 149858 - 131105: 0x954D, + 149859 - 131105: 0x9EF8, + 149876 - 131105: 0xFE49, + 149877 - 131105: 0x91CE, + 149878 - 131105: 0x9771, + 149883 - 131105: 0x8CCF, + 149887 - 131105: 0xFDB1, + 149890 - 131105: 0xFC6E, + 149896 - 131105: 0x9CF2, + 149897 - 131105: 0x93B8, + 149898 - 131105: 0x9043, + 149899 - 131105: 0x9759, + 149900 - 131105: 0x94D7, + 149901 - 131105: 0xFE66, + 149902 - 131105: 0x947D, + 149903 - 131105: 0xFC6F, + 149908 - 131105: 0x9246, + 149924 - 131105: 0xFA6D, + 149927 - 131105: 0x8EF7, + 149929 - 131105: 0xFBB7, + 149931 - 131105: 0x947C, + 149932 - 131105: 0x92CD, + 149933 - 131105: 0x97B2, + 149943 - 131105: 0xFE65, + 149944 - 131105: 0x967E, + 149945 - 131105: 0x9758, + 149946 - 131105: 0x9B77, + 149947 - 131105: 0x91CF, + 149957 - 131105: 0x94A4, + 149968 - 131105: 0x9CAD, + 149978 - 131105: 0x8BAB, + 149982 - 131105: 0x96D5, + 149983 - 131105: 0xFCB3, + 149987 - 131105: 0x93AE, + 149989 - 131105: 0x976D, + 149996 - 131105: 0x9446, + 149997 - 131105: 0x95F7, + 150006 - 131105: 0x9C46, + 150007 - 131105: 0x955B, + 150008 - 131105: 0x91D1, + 150009 - 131105: 0x94F4, + 150011 - 131105: 0xFE67, + 150030 - 131105: 0x92A5, + 150034 - 131105: 0xFEDF, + 150035 - 131105: 0x8CAB, + 150037 - 131105: 0x9BC9, + 150049 - 131105: 0xFCED, + 150050 - 131105: 0xFDFA, + 150051 - 131105: 0xFCC8, + 150052 - 131105: 0xFE62, + 150053 - 131105: 0x91FC, + 150054 - 131105: 0xFE6B, + 150055 - 131105: 0xFDF9, + 150056 - 131105: 0xFCC7, + 150057 - 131105: 0x914E, + 150058 - 131105: 0x9CB8, + 150078 - 131105: 0x9767, + 150082 - 131105: 0x95EE, + 150085 - 131105: 0x9BB2, + 150090 - 131105: 0x9460, + 150094 - 131105: 0x94A2, + 150095 - 131105: 0x9875, + 150096 - 131105: 0x97AC, + 150097 - 131105: 0x91D3, + 150109 - 131105: 0x987B, + 150117 - 131105: 0x8EEB, + 150118 - 131105: 0x976A, + 150119 - 131105: 0x965E, + 150129 - 131105: 0x97EB, + 150135 - 131105: 0x9FF9, + 150136 - 131105: 0x95F8, + 150137 - 131105: 0xFEA2, + 150138 - 131105: 0x8FE6, + 150156 - 131105: 0xFE7E, + 150163 - 131105: 0x9DA4, + 150164 - 131105: 0x9768, + 150165 - 131105: 0x8EEC, + 150166 - 131105: 0x94BD, + 150180 - 131105: 0x945B, + 150181 - 131105: 0x9CF6, + 150182 - 131105: 0xFAA7, + 150183 - 131105: 0x9BD9, + 150193 - 131105: 0xFA5D, + 150194 - 131105: 0x9656, + 150195 - 131105: 0x9762, + 150202 - 131105: 0x94BA, + 150203 - 131105: 0xA04F, + 150204 - 131105: 0x92D8, + 150208 - 131105: 0x9BCB, + 150215 - 131105: 0x94BB, + 150218 - 131105: 0x9D5F, + 150225 - 131105: 0x90CF, + 150239 - 131105: 0x9465, + 150242 - 131105: 0x9F4C, + 150249 - 131105: 0x90D8, + 150287 - 131105: 0x8D5B, + 150382 - 131105: 0x9EBE, + 150517 - 131105: 0xFB6D, + 150537 - 131105: 0x95CA, + 150686 - 131105: 0x9DC2, + 150687 - 131105: 0x97F8, + 150729 - 131105: 0x8FFC, + 150745 - 131105: 0x9473, + 150790 - 131105: 0x9474, + 150803 - 131105: 0xFEB7, + 150968 - 131105: 0x8A4B, + 151018 - 131105: 0x8A55, + 151019 - 131105: 0x8B69, + 151099 - 131105: 0x8ADC, + 151120 - 131105: 0x8B76, + 151205 - 131105: 0x9BCE, + 151207 - 131105: 0x8A68, + 151310 - 131105: 0xA0F8, + 151388 - 131105: 0x98DF, + 151426 - 131105: 0xFEB5, + 151430 - 131105: 0x9BCF, + 151447 - 131105: 0x96FB, + 151450 - 131105: 0x9BFB, + 151465 - 131105: 0x9ECE, + 151480 - 131105: 0x8EE5, + 151490 - 131105: 0x9E7B, + 151596 - 131105: 0x9BD2, + 151634 - 131105: 0x8AA5, + 151709 - 131105: 0xFECE, + 151851 - 131105: 0x8A45, + 151880 - 131105: 0x9DFC, + 151933 - 131105: 0xFECF, + 151934 - 131105: 0x8BA5, + 152013 - 131105: 0x8C4A, + 152035 - 131105: 0x8AEC, + 152038 - 131105: 0xFCE0, + 152039 - 131105: 0x94AD, + 152096 - 131105: 0xFED5, + 152097 - 131105: 0x94AC, + 152144 - 131105: 0xFC5A, + 152217 - 131105: 0x9BD6, + 152263 - 131105: 0x8A6F, + 152280 - 131105: 0x8BA9, + 152334 - 131105: 0x8E5F, + 152337 - 131105: 0x9DCB, + 152339 - 131105: 0xFCE7, + 152601 - 131105: 0x9BD7, + 152613 - 131105: 0x93C8, + 152623 - 131105: 0x91F0, + 152624 - 131105: 0x8FE0, + 152646 - 131105: 0x9BDB, + 152684 - 131105: 0x90ED, + 152686 - 131105: 0x9BDC, + 152730 - 131105: 0x8D53, + 152881 - 131105: 0xA0EC, + 152885 - 131105: 0x98FA, + 152895 - 131105: 0x9BE0, + 152923 - 131105: 0x93C7, + 152924 - 131105: 0x9249, + 152925 - 131105: 0x96E1, + 152926 - 131105: 0x9BE2, + 152930 - 131105: 0x9BE4, + 152933 - 131105: 0x8FE1, + 152934 - 131105: 0x9BE5, + 152961 - 131105: 0x94C0, + 152964 - 131105: 0x93C3, + 152975 - 131105: 0x93C5, + 153017 - 131105: 0x9079, + 153045 - 131105: 0x977B, + 153051 - 131105: 0x907E, + 153056 - 131105: 0xFEE6, + 153093 - 131105: 0xFE46, + 153141 - 131105: 0x9DB8, + 153169 - 131105: 0x9270, + 153219 - 131105: 0x95A8, + 153237 - 131105: 0x8CB0, + 153315 - 131105: 0x94C8, + 153334 - 131105: 0x98B9, + 153350 - 131105: 0x9140, + 153373 - 131105: 0xFCBE, + 153381 - 131105: 0x9157, + 153405 - 131105: 0x8BB2, + 153458 - 131105: 0xFADF, + 153543 - 131105: 0x9BE6, + 153567 - 131105: 0x9643, + 153568 - 131105: 0x8E44, + 153569 - 131105: 0x9C4F, + 153687 - 131105: 0xFEF4, + 153693 - 131105: 0x9BE8, + 153714 - 131105: 0x93DC, + 153800 - 131105: 0x966F, + 153822 - 131105: 0x87A1, + 153825 - 131105: 0x8E4A, + 153859 - 131105: 0x9BED, + 153926 - 131105: 0x92F6, + 153942 - 131105: 0x9DB9, + 154028 - 131105: 0x8E4E, + 154060 - 131105: 0xFBCF, + 154196 - 131105: 0x8760, + 154261 - 131105: 0x9EC2, + 154268 - 131105: 0x94E5, + 154286 - 131105: 0x9BF0, + 154287 - 131105: 0x94E4, + 154345 - 131105: 0x9551, + 154484 - 131105: 0x8BBB, + 154505 - 131105: 0x9BF1, + 154547 - 131105: 0x94F0, + 154548 - 131105: 0x8E64, + 154566 - 131105: 0x94EA, + 154596 - 131105: 0x8F61, + 154600 - 131105: 0x9B64, + 154625 - 131105: 0x8E5B, + 154630 - 131105: 0x9BF2, + 154657 - 131105: 0x9FBE, + 154698 - 131105: 0x9DC9, + 154725 - 131105: 0x8E6C, + 154769 - 131105: 0x8F73, + 154788 - 131105: 0x8CAF, + 154816 - 131105: 0x8F75, + 154817 - 131105: 0x8E71, + 154878 - 131105: 0x8E60, + 154912 - 131105: 0x8E6A, + 154928 - 131105: 0x8C4C, + 154947 - 131105: 0x9552, + 155033 - 131105: 0x87CF, + 155065 - 131105: 0x87C0, + 155150 - 131105: 0x9554, + 155209 - 131105: 0x8AD4, + 155265 - 131105: 0x9DBB, + 155266 - 131105: 0x9543, + 155267 - 131105: 0x92FE, + 155302 - 131105: 0x94F2, + 155324 - 131105: 0x94F1, + 155351 - 131105: 0xA0EA, + 155352 - 131105: 0x9DD2, + 155418 - 131105: 0xA0B1, + 155467 - 131105: 0x91F8, + 155617 - 131105: 0x9462, + 155618 - 131105: 0x9BA4, + 155681 - 131105: 0x877D, + 155689 - 131105: 0x8EAD, + 155720 - 131105: 0x9EAD, + 155748 - 131105: 0x96D0, + 155779 - 131105: 0xFEEE, + 155799 - 131105: 0x8AB4, + 155812 - 131105: 0x9757, + 155813 - 131105: 0x8A77, + 155906 - 131105: 0x9BF7, + 155937 - 131105: 0x8EB5, + 155993 - 131105: 0xA06D, + 155994 - 131105: 0x8EB6, + 155995 - 131105: 0x9756, + 155996 - 131105: 0x9540, + 156077 - 131105: 0xA0F3, + 156078 - 131105: 0x94BE, + 156082 - 131105: 0x9BFA, + 156125 - 131105: 0xFDDF, + 156248 - 131105: 0x9DBC, + 156257 - 131105: 0x94FE, + 156266 - 131105: 0x8BDB, + 156267 - 131105: 0xA0FE, + 156368 - 131105: 0x8EC0, + 156469 - 131105: 0x9F47, + 156491 - 131105: 0x8BDE, + 156492 - 131105: 0xA0FB, + 156497 - 131105: 0x8EC3, + 156606 - 131105: 0x9649, + 156661 - 131105: 0xFEC2, + 156664 - 131105: 0x954C, + 156674 - 131105: 0x9BFD, + 156688 - 131105: 0x90CC, + 156689 - 131105: 0x9C60, + 156690 - 131105: 0x954B, + 156746 - 131105: 0x9BFE, + 156777 - 131105: 0x9C70, + 156804 - 131105: 0x9C43, + 156808 - 131105: 0x9C47, + 156809 - 131105: 0x8ECC, + 156813 - 131105: 0x8E54, + 156824 - 131105: 0x8EE4, + 156946 - 131105: 0x9C49, + 157042 - 131105: 0x8B5E, + 157088 - 131105: 0x955E, + 157101 - 131105: 0x955C, + 157119 - 131105: 0x9C4B, + 157202 - 131105: 0x8BE1, + 157222 - 131105: 0x8ED9, + 157359 - 131105: 0x9DB4, + 157361 - 131105: 0x925F, + 157365 - 131105: 0x9C4C, + 157402 - 131105: 0x8AA1, + 157416 - 131105: 0x8EDB, + 157436 - 131105: 0x9C56, + 157462 - 131105: 0x8AA2, + 157505 - 131105: 0x9754, + 157593 - 131105: 0x9C5E, + 157619 - 131105: 0x9ED4, + 157620 - 131105: 0x9568, + 157644 - 131105: 0xA0C3, + 157724 - 131105: 0x8AE6, + 157766 - 131105: 0xA0F7, + 157790 - 131105: 0x9C61, + 157806 - 131105: 0x9C5F, + 157832 - 131105: 0xFC4D, + 157834 - 131105: 0x9E5B, + 157843 - 131105: 0x9E69, + 157895 - 131105: 0x9C63, + 157966 - 131105: 0xFEC7, + 157969 - 131105: 0xFEC6, + 157990 - 131105: 0x9C67, + 158009 - 131105: 0x9C69, + 158033 - 131105: 0x8BE2, + 158120 - 131105: 0x9165, + 158133 - 131105: 0x9CE7, + 158194 - 131105: 0x8A54, + 158202 - 131105: 0x9C6C, + 158253 - 131105: 0x9C6E, + 158254 - 131105: 0xFE5D, + 158260 - 131105: 0x9C73, + 158274 - 131105: 0x956A, + 158289 - 131105: 0x956D, + 158290 - 131105: 0x8EF0, + 158469 - 131105: 0x8F4D, + 158474 - 131105: 0x8EF6, + 158483 - 131105: 0xFABC, + 158485 - 131105: 0x8CD5, + 158499 - 131105: 0x875E, + 158504 - 131105: 0xFBDA, + 158544 - 131105: 0x8B4C, + 158545 - 131105: 0xFD75, + 158546 - 131105: 0x9BDD, + 158547 - 131105: 0xFAF5, + 158555 - 131105: 0x9C74, + 158581 - 131105: 0x9545, + 158594 - 131105: 0x96C6, + 158614 - 131105: 0x8F6A, + 158615 - 131105: 0x8F4E, + 158621 - 131105: 0x9C78, + 158643 - 131105: 0xFA55, + 158656 - 131105: 0x97E4, + 158711 - 131105: 0x9C41, + 158753 - 131105: 0x925C, + 158784 - 131105: 0x96FA, + 158785 - 131105: 0x8CF6, + 158790 - 131105: 0x8D4D, + 158846 - 131105: 0xFB66, + 158847 - 131105: 0x8E65, + 158848 - 131105: 0x9849, + 158849 - 131105: 0xFBA8, + 158850 - 131105: 0x9842, + 158884 - 131105: 0x9C7A, + 158903 - 131105: 0x97FB, + 158904 - 131105: 0x90CA, + 158909 - 131105: 0x9C5B, + 158912 - 131105: 0x974D, + 158915 - 131105: 0x8ED3, + 158929 - 131105: 0x9561, + 159010 - 131105: 0x9F4B, + 159011 - 131105: 0x9FB5, + 159012 - 131105: 0x93D2, + 159013 - 131105: 0xFDAA, + 159014 - 131105: 0x9840, + 159015 - 131105: 0x9146, + 159016 - 131105: 0x9867, + 159017 - 131105: 0xFA5A, + 159018 - 131105: 0xFBA9, + 159057 - 131105: 0x9841, + 159092 - 131105: 0x8CD3, + 159136 - 131105: 0xFCFD, + 159137 - 131105: 0xFDAB, + 159138 - 131105: 0x91BD, + 159139 - 131105: 0x8F4C, + 159140 - 131105: 0x96C9, + 159141 - 131105: 0x8F55, + 159142 - 131105: 0xFBAE, + 159143 - 131105: 0x956F, + 159150 - 131105: 0x9C7D, + 159196 - 131105: 0xA0F0, + 159210 - 131105: 0x946F, + 159211 - 131105: 0xFDAC, + 159216 - 131105: 0x96CB, + 159232 - 131105: 0x96CE, + 159237 - 131105: 0xA056, + 159239 - 131105: 0x9CE1, + 159250 - 131105: 0x96C4, + 159298 - 131105: 0x8F5E, + 159299 - 131105: 0x8F6C, + 159300 - 131105: 0x8EA3, + 159301 - 131105: 0xFBB3, + 159342 - 131105: 0xFC53, + 159346 - 131105: 0xFDB3, + 159351 - 131105: 0x8F6B, + 159364 - 131105: 0x96CA, + 159368 - 131105: 0x87CD, + 159371 - 131105: 0x8753, + 159385 - 131105: 0x8F79, + 159440 - 131105: 0x9E6F, + 159441 - 131105: 0xA0C5, + 159442 - 131105: 0xFC78, + 159443 - 131105: 0x8E42, + 159444 - 131105: 0x8F5A, + 159445 - 131105: 0x90C2, + 159446 - 131105: 0x8EA5, + 159447 - 131105: 0x9061, + 159526 - 131105: 0x924F, + 159603 - 131105: 0x9373, + 159604 - 131105: 0xFDB5, + 159647 - 131105: 0xFECC, + 159649 - 131105: 0xFBBD, + 159678 - 131105: 0x8CD6, + 159710 - 131105: 0x9843, + 159711 - 131105: 0x96C5, + 159758 - 131105: 0x89BC, + 159819 - 131105: 0x9CA3, + 159826 - 131105: 0x924B, + 159827 - 131105: 0x984A, + 159880 - 131105: 0x8FA4, + 159917 - 131105: 0xA0F1, + 159918 - 131105: 0x9EFB, + 159919 - 131105: 0x9CD2, + 159949 - 131105: 0x8FA7, + 159954 - 131105: 0x8754, + 159992 - 131105: 0xFC5C, + 160009 - 131105: 0x9845, + 160012 - 131105: 0x9046, + 160013 - 131105: 0x8CD1, + 160038 - 131105: 0xFEFA, + 160039 - 131105: 0x9560, + 160100 - 131105: 0x9F48, + 160101 - 131105: 0x9247, + 160117 - 131105: 0x90FB, + 160205 - 131105: 0x9CA4, + 160283 - 131105: 0x9571, + 160359 - 131105: 0x8745, + 160384 - 131105: 0x9CA6, + 160389 - 131105: 0x9CA7, + 160395 - 131105: 0x9CAA, + 160434 - 131105: 0x9ED3, + 160438 - 131105: 0x9E70, + 160486 - 131105: 0x9CAC, + 160594 - 131105: 0x8752, + 160666 - 131105: 0x8FAE, + 160767 - 131105: 0x8D50, + 160802 - 131105: 0x957D, + 160848 - 131105: 0x9CB0, + 160900 - 131105: 0x97B6, + 160902 - 131105: 0xA0BD, + 161140 - 131105: 0x8ADF, + 161187 - 131105: 0x9EAA, + 161248 - 131105: 0x8FBD, + 161252 - 131105: 0x8FBF, + 161277 - 131105: 0x9369, + 161278 - 131105: 0x9BA7, + 161287 - 131105: 0xC8A4, + 161292 - 131105: 0xFEEA, + 161330 - 131105: 0x9BE1, + 161337 - 131105: 0x8B41, + 161365 - 131105: 0x9DB6, + 161366 - 131105: 0xA0EB, + 161367 - 131105: 0x9BA3, + 161428 - 131105: 0x8BA1, + 161551 - 131105: 0x8FC8, + 161589 - 131105: 0x894C, + 161590 - 131105: 0x9860, + 161601 - 131105: 0x94C7, + 161630 - 131105: 0x8B58, + 161668 - 131105: 0x95AB, + 161669 - 131105: 0x95AA, + 161740 - 131105: 0x9CC3, + 161880 - 131105: 0x9CC4, + 161904 - 131105: 0x93D6, + 161949 - 131105: 0x9DAC, + 161970 - 131105: 0x8BE6, + 161992 - 131105: 0x8A71, + 162084 - 131105: 0x8FD1, + 162151 - 131105: 0x99D5, + 162170 - 131105: 0x90F4, + 162208 - 131105: 0x8AA3, + 162269 - 131105: 0x9CCE, + 162301 - 131105: 0x9CD4, + 162314 - 131105: 0x9CD5, + 162318 - 131105: 0xFBC8, + 162366 - 131105: 0x9DB3, + 162387 - 131105: 0xFC70, + 162393 - 131105: 0x8FD7, + 162425 - 131105: 0x9B73, + 162436 - 131105: 0xFA5B, + 162493 - 131105: 0x8FD2, + 162494 - 131105: 0x9064, + 162548 - 131105: 0x98B6, + 162566 - 131105: 0x9668, + 162571 - 131105: 0x9CD6, + 162584 - 131105: 0x98BD, + 162616 - 131105: 0x8FDC, + 162617 - 131105: 0xFEF6, + 162618 - 131105: 0x8FD9, + 162632 - 131105: 0x9541, + 162661 - 131105: 0x87CA, + 162799 - 131105: 0x876C, + 162804 - 131105: 0x97F3, + 162834 - 131105: 0x9BF8, + 162924 - 131105: 0x875A, + 162993 - 131105: 0x8748, + 163013 - 131105: 0x874A, + 163119 - 131105: 0x9E6C, + 163155 - 131105: 0x8FF2, + 163156 - 131105: 0x8FEE, + 163174 - 131105: 0x9CD7, + 163187 - 131105: 0x9E6E, + 163204 - 131105: 0x8A40, + 163215 - 131105: 0x8FEF, + 163224 - 131105: 0x8FF4, + 163261 - 131105: 0x8FF5, + 163292 - 131105: 0x95C2, + 163405 - 131105: 0x986A, + 163407 - 131105: 0x97CF, + 163630 - 131105: 0x9EE5, + 163833 - 131105: 0x9E7C, + 163842 - 131105: 0x9041, + 163849 - 131105: 0x9CDB, + 163870 - 131105: 0x9441, + 163875 - 131105: 0x9CE6, + 163876 - 131105: 0x9DB0, + 163912 - 131105: 0x9CEA, + 163971 - 131105: 0x9CED, + 163984 - 131105: 0x9CFA, + 164029 - 131105: 0x8B62, + 164030 - 131105: 0x8A4E, + 164072 - 131105: 0x9CCA, + 164073 - 131105: 0x8A66, + 164084 - 131105: 0x9CFB, + 164142 - 131105: 0x9CFC, + 164175 - 131105: 0x9CFE, + 164189 - 131105: 0x8A53, + 164207 - 131105: 0x9CE5, + 164233 - 131105: 0x9D40, + 164271 - 131105: 0x9D41, + 164284 - 131105: 0x9045, + 164359 - 131105: 0x8B73, + 164376 - 131105: 0x97CA, + 164378 - 131105: 0x9D42, + 164438 - 131105: 0x8A61, + 164476 - 131105: 0x8BAE, + 164507 - 131105: 0x8AD2, + 164557 - 131105: 0x8BA2, + 164578 - 131105: 0x9DF2, + 164614 - 131105: 0x9D43, + 164632 - 131105: 0x9CDF, + 164655 - 131105: 0x9D44, + 164666 - 131105: 0x8ECA, + 164709 - 131105: 0x904E, + 164717 - 131105: 0x8EB3, + 164733 - 131105: 0x9FF5, + 164746 - 131105: 0x9D45, + 164882 - 131105: 0x904F, + 164968 - 131105: 0x9D47, + 164972 - 131105: 0x89CA, + 164979 - 131105: 0x9CB5, + 164994 - 131105: 0xFBFE, + 165121 - 131105: 0x905E, + 165180 - 131105: 0x9063, + 165181 - 131105: 0x9057, + 165228 - 131105: 0x9066, + 165352 - 131105: 0x9BC0, + 165364 - 131105: 0xFCE5, + 165376 - 131105: 0x9162, + 165387 - 131105: 0x9067, + 165413 - 131105: 0x8FA1, + 165435 - 131105: 0x8FA2, + 165546 - 131105: 0x9D48, + 165547 - 131105: 0xFAD3, + 165554 - 131105: 0x8D4F, + 165564 - 131105: 0x905D, + 165592 - 131105: 0x90B9, + 165606 - 131105: 0x906B, + 165647 - 131105: 0x8C5C, + 165651 - 131105: 0x9069, + 165892 - 131105: 0xFE57, + 165931 - 131105: 0xFE55, + 166157 - 131105: 0x87A6, + 166195 - 131105: 0x9073, + 166216 - 131105: 0x9BEF, + 166217 - 131105: 0x9CF0, + 166230 - 131105: 0x9D4B, + 166244 - 131105: 0xFED9, + 166248 - 131105: 0xFEDA, + 166252 - 131105: 0x91E0, + 166253 - 131105: 0x8D43, + 166270 - 131105: 0x91D8, + 166281 - 131105: 0x9646, + 166312 - 131105: 0x9360, + 166314 - 131105: 0xFA53, + 166315 - 131105: 0x9CD3, + 166328 - 131105: 0x9D4E, + 166332 - 131105: 0xFB40, + 166336 - 131105: 0x8DE2, + 166364 - 131105: 0x9442, + 166366 - 131105: 0x9056, + 166369 - 131105: 0x9865, + 166371 - 131105: 0x8C6C, + 166372 - 131105: 0xFA4A, + 166375 - 131105: 0x9D50, + 166376 - 131105: 0x9D52, + 166393 - 131105: 0x95AF, + 166394 - 131105: 0x975A, + 166395 - 131105: 0x9349, + 166396 - 131105: 0x9747, + 166415 - 131105: 0xA0F4, + 166422 - 131105: 0x9778, + 166437 - 131105: 0x8FCF, + 166441 - 131105: 0xFC60, + 166450 - 131105: 0x8C4E, + 166454 - 131105: 0xFC56, + 166468 - 131105: 0x91DC, + 166469 - 131105: 0x9661, + 166470 - 131105: 0x92EC, + 166471 - 131105: 0x935D, + 166472 - 131105: 0x8EDE, + 166473 - 131105: 0x96FE, + 166474 - 131105: 0xFD4F, + 166475 - 131105: 0x95DE, + 166489 - 131105: 0x98B0, + 166490 - 131105: 0xA040, + 166529 - 131105: 0x97BD, + 166530 - 131105: 0x977D, + 166531 - 131105: 0x97F5, + 166554 - 131105: 0x9BAC, + 166555 - 131105: 0xFADA, + 166556 - 131105: 0x92C2, + 166592 - 131105: 0x97B1, + 166598 - 131105: 0x907B, + 166603 - 131105: 0x93FE, + 166604 - 131105: 0x947B, + 166606 - 131105: 0x9777, + 166622 - 131105: 0xFABE, + 166623 - 131105: 0xFD43, + 166624 - 131105: 0x90C6, + 166625 - 131105: 0x90A4, + 166626 - 131105: 0x90A8, + 166627 - 131105: 0x94A9, + 166629 - 131105: 0x90A9, + 166634 - 131105: 0x8C65, + 166652 - 131105: 0x95E0, + 166668 - 131105: 0x907D, + 166675 - 131105: 0x9265, + 166689 - 131105: 0xFDBA, + 166690 - 131105: 0x93C4, + 166699 - 131105: 0xFEED, + 166700 - 131105: 0x9DAB, + 166701 - 131105: 0xA0E3, + 166703 - 131105: 0x9648, + 166726 - 131105: 0x9D53, + 166732 - 131105: 0x8AA9, + 166734 - 131105: 0x9BC5, + 166736 - 131105: 0x965D, + 166755 - 131105: 0x975F, + 166756 - 131105: 0x965F, + 166757 - 131105: 0x966E, + 166758 - 131105: 0xFB5D, + 166764 - 131105: 0x9DB1, + 166799 - 131105: 0xFEA3, + 166809 - 131105: 0x9DB2, + 166812 - 131105: 0x95AE, + 166813 - 131105: 0xFCA3, + 166841 - 131105: 0x8769, + 166850 - 131105: 0xA0A2, + 166853 - 131105: 0x9655, + 166868 - 131105: 0x9D54, + 166871 - 131105: 0x9341, + 166873 - 131105: 0x95AD, + 166874 - 131105: 0x91D5, + 166887 - 131105: 0x977A, + 166888 - 131105: 0xFDFC, + 166889 - 131105: 0x8E47, + 166890 - 131105: 0x93FD, + 166891 - 131105: 0x90A5, + 166892 - 131105: 0x90AC, + 166901 - 131105: 0x95AC, + 166911 - 131105: 0x90AE, + 166915 - 131105: 0xFEA5, + 166921 - 131105: 0x9D56, + 166940 - 131105: 0x97E3, + 166941 - 131105: 0x95E2, + 166947 - 131105: 0x9466, + 166950 - 131105: 0x9647, + 166955 - 131105: 0x91B8, + 166960 - 131105: 0x9CEC, + 166969 - 131105: 0x90AD, + 166971 - 131105: 0x95E3, + 167114 - 131105: 0x8B4F, + 167117 - 131105: 0x8AE3, + 167122 - 131105: 0x8B4D, + 167220 - 131105: 0x95EA, + 167321 - 131105: 0x8B4E, + 167353 - 131105: 0x8CC1, + 167439 - 131105: 0x8BED, + 167478 - 131105: 0x91D9, + 167481 - 131105: 0xA0A4, + 167525 - 131105: 0x95F5, + 167526 - 131105: 0x95F4, + 167575 - 131105: 0x9FB3, + 167596 - 131105: 0xFEAF, + 167602 - 131105: 0xFE72, + 167603 - 131105: 0x927A, + 167641 - 131105: 0xFEAC, + 167655 - 131105: 0x95F3, + 167877 - 131105: 0x9D58, + 168057 - 131105: 0x8D46, + 168072 - 131105: 0x9372, + 168075 - 131105: 0x91C5, + 168083 - 131105: 0x9642, + 168111 - 131105: 0x90CD, + 168112 - 131105: 0x95FE, + 168113 - 131105: 0x9159, + 168128 - 131105: 0x9C65, + 168164 - 131105: 0x97CC, + 168165 - 131105: 0x90CE, + 168172 - 131105: 0x9D59, + 168173 - 131105: 0xFCF5, + 168205 - 131105: 0xFEFD, + 168208 - 131105: 0x9D5B, + 168252 - 131105: 0x9D5C, + 168269 - 131105: 0x937E, + 168283 - 131105: 0x98AC, + 168286 - 131105: 0x9D5E, + 168304 - 131105: 0xFDD0, + 168348 - 131105: 0xFD60, + 168360 - 131105: 0x9CCF, + 168405 - 131105: 0x90DD, + 168427 - 131105: 0x90E0, + 168989 - 131105: 0x90F3, + 168992 - 131105: 0x98B1, + 169011 - 131105: 0x90F0, + 169023 - 131105: 0x93BD, + 169032 - 131105: 0x95B7, + 169168 - 131105: 0x9F46, + 169177 - 131105: 0x8E4B, + 169178 - 131105: 0x9658, + 169189 - 131105: 0x8A4C, + 169191 - 131105: 0x9D63, + 169374 - 131105: 0x9ECF, + 169392 - 131105: 0x9D65, + 169400 - 131105: 0x9D66, + 169431 - 131105: 0x965A, + 169449 - 131105: 0x9D64, + 169460 - 131105: 0x8A6C, + 169760 - 131105: 0x8AD9, + 169778 - 131105: 0x9D67, + 169940 - 131105: 0x8A70, + 170000 - 131105: 0x8BF3, + 170071 - 131105: 0x9150, + 170148 - 131105: 0x9CC1, + 170193 - 131105: 0x9D68, + 170218 - 131105: 0x93A7, + 170225 - 131105: 0x9674, + 170234 - 131105: 0x8CFD, + 170243 - 131105: 0xA0EF, + 170245 - 131105: 0x9151, + 170287 - 131105: 0x96C1, + 170309 - 131105: 0x8777, + 170311 - 131105: 0x8C64, + 170312 - 131105: 0x9676, + 170313 - 131105: 0x9D69, + 170333 - 131105: 0xFCA4, + 170346 - 131105: 0x9D6A, + 170397 - 131105: 0x924E, + 170435 - 131105: 0x9D6B, + 170441 - 131105: 0x9BC1, + 170536 - 131105: 0x9D6C, + 170573 - 131105: 0x8A65, + 170757 - 131105: 0x915D, + 170766 - 131105: 0x9D6D, + 170965 - 131105: 0x915A, + 171123 - 131105: 0x8C42, + 171181 - 131105: 0x9CC0, + 171326 - 131105: 0x916A, + 171354 - 131105: 0x9D6E, + 171388 - 131105: 0x9EA6, + 171416 - 131105: 0x9DCD, + 171419 - 131105: 0x9D6F, + 171510 - 131105: 0x89BB, + 171526 - 131105: 0x9EF9, + 171565 - 131105: 0x96B4, + 171624 - 131105: 0x9172, + 171692 - 131105: 0x9EC8, + 171696 - 131105: 0x8771, + 171715 - 131105: 0x8B55, + 171768 - 131105: 0x9D71, + 171811 - 131105: 0x9D72, + 171824 - 131105: 0x9ECC, + 171959 - 131105: 0x9174, + 171998 - 131105: 0x9ED0, + 172052 - 131105: 0x905C, + 172167 - 131105: 0x8ED2, + 172217 - 131105: 0x91A8, + 172257 - 131105: 0x9177, + 172269 - 131105: 0x96BF, + 172275 - 131105: 0x96C0, + 172280 - 131105: 0x8FB1, + 172286 - 131105: 0x96B7, + 172295 - 131105: 0x8C55, + 172323 - 131105: 0x9178, + 172339 - 131105: 0x89BE, + 172340 - 131105: 0x917C, + 172368 - 131105: 0xFB77, + 172434 - 131105: 0x9175, + 172435 - 131105: 0x91A3, + 172459 - 131105: 0x9176, + 172468 - 131105: 0x96BE, + 172469 - 131105: 0x8D49, + 172511 - 131105: 0x9179, + 172533 - 131105: 0x96B6, + 172576 - 131105: 0x91A4, + 172595 - 131105: 0x91A6, + 172691 - 131105: 0x9D75, + 172703 - 131105: 0x9052, + 172722 - 131105: 0xA045, + 172724 - 131105: 0x91A9, + 172726 - 131105: 0x98AA, + 172730 - 131105: 0x8C5F, + 172733 - 131105: 0x8BAA, + 172767 - 131105: 0x9CDD, + 172799 - 131105: 0x9D77, + 172881 - 131105: 0x8756, + 172969 - 131105: 0x8940, + 173108 - 131105: 0x9EEC, + 173147 - 131105: 0x93AA, + 173510 - 131105: 0x9478, + 173515 - 131105: 0x9D7A, + 173569 - 131105: 0x8AC9, + 173618 - 131105: 0x8B4B, + 173642 - 131105: 0x9FEC, + 173659 - 131105: 0x8AE2, + 173737 - 131105: 0x9E75, +} + +const encode1Low, encode1High = 11904, 40908 + +var encode1 = [...]uint16{ + 11904 - 11904: 0xC8D6, + 11908 - 11904: 0xC8D7, + 11910 - 11904: 0xC8D8, + 11911 - 11904: 0xC8D9, + 11912 - 11904: 0xC8DA, + 11914 - 11904: 0xC8DB, + 11916 - 11904: 0xC8DC, + 11917 - 11904: 0xC8DD, + 11925 - 11904: 0xC8DE, + 11932 - 11904: 0xC8DF, + 11933 - 11904: 0xC8E0, + 11941 - 11904: 0xC8E1, + 11943 - 11904: 0xC8E2, + 11946 - 11904: 0xC8E3, + 11948 - 11904: 0xC8E4, + 11950 - 11904: 0xC8E5, + 11958 - 11904: 0xC8E6, + 11964 - 11904: 0xC8E7, + 11966 - 11904: 0xC8E8, + 11974 - 11904: 0xC8E9, + 11978 - 11904: 0xC8EA, + 11980 - 11904: 0xC8EB, + 11981 - 11904: 0xC8EC, + 11983 - 11904: 0xC8ED, + 11990 - 11904: 0xC8EE, + 11991 - 11904: 0xC8EF, + 11998 - 11904: 0xC8F0, + 12003 - 11904: 0xC8F1, + 12083 - 11904: 0xC6CD, + 12288 - 11904: 0xA140, + 12289 - 11904: 0xA142, + 12290 - 11904: 0xA143, + 12291 - 11904: 0xC6DE, + 12293 - 11904: 0xC6E0, + 12294 - 11904: 0xC6E1, + 12295 - 11904: 0xC6E2, + 12296 - 11904: 0xA171, + 12297 - 11904: 0xA172, + 12298 - 11904: 0xA16D, + 12299 - 11904: 0xA16E, + 12300 - 11904: 0xA175, + 12301 - 11904: 0xA176, + 12302 - 11904: 0xA179, + 12303 - 11904: 0xA17A, + 12304 - 11904: 0xA169, + 12305 - 11904: 0xA16A, + 12306 - 11904: 0xA245, + 12308 - 11904: 0xA165, + 12309 - 11904: 0xA166, + 12317 - 11904: 0xA1A9, + 12318 - 11904: 0xA1AA, + 12321 - 11904: 0xA2C3, + 12322 - 11904: 0xA2C4, + 12323 - 11904: 0xA2C5, + 12324 - 11904: 0xA2C6, + 12325 - 11904: 0xA2C7, + 12326 - 11904: 0xA2C8, + 12327 - 11904: 0xA2C9, + 12328 - 11904: 0xA2CA, + 12329 - 11904: 0xA2CB, + 12353 - 11904: 0xC6E7, + 12354 - 11904: 0xC6E8, + 12355 - 11904: 0xC6E9, + 12356 - 11904: 0xC6EA, + 12357 - 11904: 0xC6EB, + 12358 - 11904: 0xC6EC, + 12359 - 11904: 0xC6ED, + 12360 - 11904: 0xC6EE, + 12361 - 11904: 0xC6EF, + 12362 - 11904: 0xC6F0, + 12363 - 11904: 0xC6F1, + 12364 - 11904: 0xC6F2, + 12365 - 11904: 0xC6F3, + 12366 - 11904: 0xC6F4, + 12367 - 11904: 0xC6F5, + 12368 - 11904: 0xC6F6, + 12369 - 11904: 0xC6F7, + 12370 - 11904: 0xC6F8, + 12371 - 11904: 0xC6F9, + 12372 - 11904: 0xC6FA, + 12373 - 11904: 0xC6FB, + 12374 - 11904: 0xC6FC, + 12375 - 11904: 0xC6FD, + 12376 - 11904: 0xC6FE, + 12377 - 11904: 0xC740, + 12378 - 11904: 0xC741, + 12379 - 11904: 0xC742, + 12380 - 11904: 0xC743, + 12381 - 11904: 0xC744, + 12382 - 11904: 0xC745, + 12383 - 11904: 0xC746, + 12384 - 11904: 0xC747, + 12385 - 11904: 0xC748, + 12386 - 11904: 0xC749, + 12387 - 11904: 0xC74A, + 12388 - 11904: 0xC74B, + 12389 - 11904: 0xC74C, + 12390 - 11904: 0xC74D, + 12391 - 11904: 0xC74E, + 12392 - 11904: 0xC74F, + 12393 - 11904: 0xC750, + 12394 - 11904: 0xC751, + 12395 - 11904: 0xC752, + 12396 - 11904: 0xC753, + 12397 - 11904: 0xC754, + 12398 - 11904: 0xC755, + 12399 - 11904: 0xC756, + 12400 - 11904: 0xC757, + 12401 - 11904: 0xC758, + 12402 - 11904: 0xC759, + 12403 - 11904: 0xC75A, + 12404 - 11904: 0xC75B, + 12405 - 11904: 0xC75C, + 12406 - 11904: 0xC75D, + 12407 - 11904: 0xC75E, + 12408 - 11904: 0xC75F, + 12409 - 11904: 0xC760, + 12410 - 11904: 0xC761, + 12411 - 11904: 0xC762, + 12412 - 11904: 0xC763, + 12413 - 11904: 0xC764, + 12414 - 11904: 0xC765, + 12415 - 11904: 0xC766, + 12416 - 11904: 0xC767, + 12417 - 11904: 0xC768, + 12418 - 11904: 0xC769, + 12419 - 11904: 0xC76A, + 12420 - 11904: 0xC76B, + 12421 - 11904: 0xC76C, + 12422 - 11904: 0xC76D, + 12423 - 11904: 0xC76E, + 12424 - 11904: 0xC76F, + 12425 - 11904: 0xC770, + 12426 - 11904: 0xC771, + 12427 - 11904: 0xC772, + 12428 - 11904: 0xC773, + 12429 - 11904: 0xC774, + 12430 - 11904: 0xC775, + 12431 - 11904: 0xC776, + 12432 - 11904: 0xC777, + 12433 - 11904: 0xC778, + 12434 - 11904: 0xC779, + 12435 - 11904: 0xC77A, + 12443 - 11904: 0xC8D4, + 12444 - 11904: 0xC8D5, + 12445 - 11904: 0xC6DC, + 12446 - 11904: 0xC6DD, + 12449 - 11904: 0xC77B, + 12450 - 11904: 0xC77C, + 12451 - 11904: 0xC77D, + 12452 - 11904: 0xC77E, + 12453 - 11904: 0xC7A1, + 12454 - 11904: 0xC7A2, + 12455 - 11904: 0xC7A3, + 12456 - 11904: 0xC7A4, + 12457 - 11904: 0xC7A5, + 12458 - 11904: 0xC7A6, + 12459 - 11904: 0xC7A7, + 12460 - 11904: 0xC7A8, + 12461 - 11904: 0xC7A9, + 12462 - 11904: 0xC7AA, + 12463 - 11904: 0xC7AB, + 12464 - 11904: 0xC7AC, + 12465 - 11904: 0xC7AD, + 12466 - 11904: 0xC7AE, + 12467 - 11904: 0xC7AF, + 12468 - 11904: 0xC7B0, + 12469 - 11904: 0xC7B1, + 12470 - 11904: 0xC7B2, + 12471 - 11904: 0xC7B3, + 12472 - 11904: 0xC7B4, + 12473 - 11904: 0xC7B5, + 12474 - 11904: 0xC7B6, + 12475 - 11904: 0xC7B7, + 12476 - 11904: 0xC7B8, + 12477 - 11904: 0xC7B9, + 12478 - 11904: 0xC7BA, + 12479 - 11904: 0xC7BB, + 12480 - 11904: 0xC7BC, + 12481 - 11904: 0xC7BD, + 12482 - 11904: 0xC7BE, + 12483 - 11904: 0xC7BF, + 12484 - 11904: 0xC7C0, + 12485 - 11904: 0xC7C1, + 12486 - 11904: 0xC7C2, + 12487 - 11904: 0xC7C3, + 12488 - 11904: 0xC7C4, + 12489 - 11904: 0xC7C5, + 12490 - 11904: 0xC7C6, + 12491 - 11904: 0xC7C7, + 12492 - 11904: 0xC7C8, + 12493 - 11904: 0xC7C9, + 12494 - 11904: 0xC7CA, + 12495 - 11904: 0xC7CB, + 12496 - 11904: 0xC7CC, + 12497 - 11904: 0xC7CD, + 12498 - 11904: 0xC7CE, + 12499 - 11904: 0xC7CF, + 12500 - 11904: 0xC7D0, + 12501 - 11904: 0xC7D1, + 12502 - 11904: 0xC7D2, + 12503 - 11904: 0xC7D3, + 12504 - 11904: 0xC7D4, + 12505 - 11904: 0xC7D5, + 12506 - 11904: 0xC7D6, + 12507 - 11904: 0xC7D7, + 12508 - 11904: 0xC7D8, + 12509 - 11904: 0xC7D9, + 12510 - 11904: 0xC7DA, + 12511 - 11904: 0xC7DB, + 12512 - 11904: 0xC7DC, + 12513 - 11904: 0xC7DD, + 12514 - 11904: 0xC7DE, + 12515 - 11904: 0xC7DF, + 12516 - 11904: 0xC7E0, + 12517 - 11904: 0xC7E1, + 12518 - 11904: 0xC7E2, + 12519 - 11904: 0xC7E3, + 12520 - 11904: 0xC7E4, + 12521 - 11904: 0xC7E5, + 12522 - 11904: 0xC7E6, + 12523 - 11904: 0xC7E7, + 12524 - 11904: 0xC7E8, + 12525 - 11904: 0xC7E9, + 12526 - 11904: 0xC7EA, + 12527 - 11904: 0xC7EB, + 12528 - 11904: 0xC7EC, + 12529 - 11904: 0xC7ED, + 12530 - 11904: 0xC7EE, + 12531 - 11904: 0xC7EF, + 12532 - 11904: 0xC7F0, + 12533 - 11904: 0xC7F1, + 12534 - 11904: 0xC7F2, + 12540 - 11904: 0xC6E3, + 12541 - 11904: 0xC6DA, + 12542 - 11904: 0xC6DB, + 12549 - 11904: 0xA374, + 12550 - 11904: 0xA375, + 12551 - 11904: 0xA376, + 12552 - 11904: 0xA377, + 12553 - 11904: 0xA378, + 12554 - 11904: 0xA379, + 12555 - 11904: 0xA37A, + 12556 - 11904: 0xA37B, + 12557 - 11904: 0xA37C, + 12558 - 11904: 0xA37D, + 12559 - 11904: 0xA37E, + 12560 - 11904: 0xA3A1, + 12561 - 11904: 0xA3A2, + 12562 - 11904: 0xA3A3, + 12563 - 11904: 0xA3A4, + 12564 - 11904: 0xA3A5, + 12565 - 11904: 0xA3A6, + 12566 - 11904: 0xA3A7, + 12567 - 11904: 0xA3A8, + 12568 - 11904: 0xA3A9, + 12569 - 11904: 0xA3AA, + 12570 - 11904: 0xA3AB, + 12571 - 11904: 0xA3AC, + 12572 - 11904: 0xA3AD, + 12573 - 11904: 0xA3AE, + 12574 - 11904: 0xA3AF, + 12575 - 11904: 0xA3B0, + 12576 - 11904: 0xA3B1, + 12577 - 11904: 0xA3B2, + 12578 - 11904: 0xA3B3, + 12579 - 11904: 0xA3B4, + 12580 - 11904: 0xA3B5, + 12581 - 11904: 0xA3B6, + 12582 - 11904: 0xA3B7, + 12583 - 11904: 0xA3B8, + 12584 - 11904: 0xA3B9, + 12585 - 11904: 0xA3BA, + 12736 - 11904: 0x8840, + 12737 - 11904: 0x8841, + 12738 - 11904: 0x8842, + 12739 - 11904: 0x8843, + 12740 - 11904: 0x8844, + 12741 - 11904: 0x8846, + 12742 - 11904: 0x8849, + 12743 - 11904: 0x884A, + 12744 - 11904: 0x884D, + 12745 - 11904: 0x884F, + 12746 - 11904: 0x8850, + 12747 - 11904: 0x8851, + 12748 - 11904: 0x8852, + 12749 - 11904: 0x8854, + 12750 - 11904: 0x8855, + 12751 - 11904: 0xC879, + 12849 - 11904: 0xC8D1, + 12963 - 11904: 0xA1C0, + 13198 - 11904: 0xA255, + 13199 - 11904: 0xA256, + 13212 - 11904: 0xA250, + 13213 - 11904: 0xA251, + 13214 - 11904: 0xA252, + 13217 - 11904: 0xA254, + 13252 - 11904: 0xA257, + 13262 - 11904: 0xA253, + 13265 - 11904: 0xA1EB, + 13266 - 11904: 0xA1EA, + 13269 - 11904: 0xA24F, + 13365 - 11904: 0x9277, + 13376 - 11904: 0x96DF, + 13386 - 11904: 0x8CF4, + 13388 - 11904: 0x89D5, + 13412 - 11904: 0x93CD, + 13427 - 11904: 0x9BDF, + 13434 - 11904: 0xFA68, + 13437 - 11904: 0x89DA, + 13438 - 11904: 0x8F59, + 13459 - 11904: 0x89DB, + 13462 - 11904: 0x8F5D, + 13477 - 11904: 0x89DC, + 13487 - 11904: 0x96F7, + 13500 - 11904: 0x8ADA, + 13505 - 11904: 0x8BDC, + 13512 - 11904: 0x97DB, + 13535 - 11904: 0x9E53, + 13540 - 11904: 0x9DAA, + 13542 - 11904: 0x87BE, + 13563 - 11904: 0x9BEA, + 13574 - 11904: 0x8A6E, + 13630 - 11904: 0x8BC8, + 13649 - 11904: 0x89E8, + 13651 - 11904: 0x89EA, + 13657 - 11904: 0x8C4B, + 13665 - 11904: 0xFB70, + 13677 - 11904: 0x89ED, + 13680 - 11904: 0x94DD, + 13682 - 11904: 0x89EE, + 13687 - 11904: 0x9EB4, + 13688 - 11904: 0x8AD3, + 13700 - 11904: 0x92DB, + 13719 - 11904: 0x94DB, + 13720 - 11904: 0x89F9, + 13729 - 11904: 0xFB7A, + 13733 - 11904: 0x89FB, + 13741 - 11904: 0x9EFC, + 13759 - 11904: 0x89FC, + 13761 - 11904: 0x89BF, + 13765 - 11904: 0x89FE, + 13767 - 11904: 0x89E6, + 13770 - 11904: 0x9D46, + 13774 - 11904: 0x9DEE, + 13778 - 11904: 0xA07E, + 13782 - 11904: 0xA068, + 13787 - 11904: 0x98E9, + 13789 - 11904: 0x8B68, + 13809 - 11904: 0x8DFD, + 13810 - 11904: 0x8BBE, + 13811 - 11904: 0x9FD9, + 13819 - 11904: 0x8AEB, + 13822 - 11904: 0x9FD7, + 13833 - 11904: 0x8B6A, + 13848 - 11904: 0x9C5C, + 13850 - 11904: 0x8BB1, + 13859 - 11904: 0xFB5E, + 13861 - 11904: 0x8770, + 13869 - 11904: 0x9DF3, + 13877 - 11904: 0xA0D0, + 13881 - 11904: 0xFC66, + 13886 - 11904: 0x92E9, + 13895 - 11904: 0x9AEC, + 13896 - 11904: 0x8FAB, + 13897 - 11904: 0xFA48, + 13902 - 11904: 0x8E45, + 13919 - 11904: 0x9C6F, + 13921 - 11904: 0x8D5C, + 13946 - 11904: 0x9EDE, + 13953 - 11904: 0x89EF, + 13978 - 11904: 0x96E9, + 13989 - 11904: 0x9EBB, + 13994 - 11904: 0x94DE, + 13996 - 11904: 0x9EB8, + 14000 - 11904: 0x97BA, + 14001 - 11904: 0xFB65, + 14005 - 11904: 0x95D6, + 14009 - 11904: 0x9CBB, + 14012 - 11904: 0x97DA, + 14017 - 11904: 0x8F45, + 14019 - 11904: 0xFB7D, + 14020 - 11904: 0x9158, + 14021 - 11904: 0xFE64, + 14023 - 11904: 0x9856, + 14024 - 11904: 0x9B4D, + 14035 - 11904: 0x935B, + 14036 - 11904: 0x95C7, + 14038 - 11904: 0x97E7, + 14045 - 11904: 0x9359, + 14049 - 11904: 0x91F5, + 14050 - 11904: 0x97B8, + 14053 - 11904: 0xFDA2, + 14054 - 11904: 0xFBB6, + 14069 - 11904: 0x92FA, + 14081 - 11904: 0x9357, + 14083 - 11904: 0x8BA6, + 14088 - 11904: 0xFBB9, + 14090 - 11904: 0x97B0, + 14093 - 11904: 0xFDC4, + 14108 - 11904: 0x9CA1, + 14114 - 11904: 0x91F2, + 14115 - 11904: 0x91F9, + 14117 - 11904: 0x8FF1, + 14124 - 11904: 0x9745, + 14125 - 11904: 0x9853, + 14128 - 11904: 0xFE78, + 14130 - 11904: 0xFBC1, + 14131 - 11904: 0x9251, + 14138 - 11904: 0x9DAD, + 14144 - 11904: 0xFD6C, + 14147 - 11904: 0xFA6B, + 14178 - 11904: 0x9BC2, + 14191 - 11904: 0x9A7B, + 14231 - 11904: 0x8B60, + 14240 - 11904: 0x934B, + 14265 - 11904: 0x9ABD, + 14270 - 11904: 0x91B7, + 14294 - 11904: 0x8D4B, + 14322 - 11904: 0x95B4, + 14328 - 11904: 0xFEC5, + 14331 - 11904: 0x9EF0, + 14351 - 11904: 0x8D64, + 14361 - 11904: 0x9269, + 14368 - 11904: 0x8D67, + 14381 - 11904: 0xFBEA, + 14390 - 11904: 0xFBEF, + 14392 - 11904: 0x8D68, + 14435 - 11904: 0x93EB, + 14453 - 11904: 0x877A, + 14496 - 11904: 0xFC42, + 14531 - 11904: 0x9166, + 14540 - 11904: 0xFACD, + 14545 - 11904: 0x93DD, + 14548 - 11904: 0x8D52, + 14586 - 11904: 0x8BCC, + 14600 - 11904: 0x8D6D, + 14612 - 11904: 0x8D6E, + 14631 - 11904: 0x96A8, + 14642 - 11904: 0xFCA6, + 14655 - 11904: 0x8D6F, + 14669 - 11904: 0x8D70, + 14691 - 11904: 0xFC64, + 14712 - 11904: 0x8CF3, + 14720 - 11904: 0x9060, + 14729 - 11904: 0x8D74, + 14730 - 11904: 0x97C3, + 14738 - 11904: 0x8AD0, + 14745 - 11904: 0x9274, + 14747 - 11904: 0x9BBE, + 14753 - 11904: 0x9CC8, + 14756 - 11904: 0x9CBA, + 14776 - 11904: 0x8D78, + 14812 - 11904: 0x9EB9, + 14818 - 11904: 0x955A, + 14821 - 11904: 0x91B4, + 14828 - 11904: 0x8A48, + 14840 - 11904: 0x8D7D, + 14843 - 11904: 0x8A7D, + 14846 - 11904: 0x8AC2, + 14849 - 11904: 0xFD4A, + 14851 - 11904: 0x8DA1, + 14854 - 11904: 0x8AD1, + 14871 - 11904: 0xFCB4, + 14872 - 11904: 0x8B47, + 14889 - 11904: 0x93A4, + 14890 - 11904: 0x9EDA, + 14900 - 11904: 0x8A51, + 14923 - 11904: 0x8DA6, + 14930 - 11904: 0x9EC5, + 14935 - 11904: 0xFCC4, + 14940 - 11904: 0xA078, + 14942 - 11904: 0x94B5, + 14950 - 11904: 0xFCC2, + 14951 - 11904: 0x8A6B, + 14999 - 11904: 0x8DAB, + 15019 - 11904: 0xFAE8, + 15037 - 11904: 0x8DAD, + 15070 - 11904: 0xFC49, + 15072 - 11904: 0x93C1, + 15088 - 11904: 0x906F, + 15090 - 11904: 0x8DB0, + 15093 - 11904: 0x87A2, + 15099 - 11904: 0x947E, + 15118 - 11904: 0x90FA, + 15129 - 11904: 0x9479, + 15138 - 11904: 0x8DB2, + 15147 - 11904: 0xFCEE, + 15161 - 11904: 0x997B, + 15170 - 11904: 0x8DB4, + 15192 - 11904: 0x8DB7, + 15200 - 11904: 0x91B3, + 15217 - 11904: 0x8DBB, + 15218 - 11904: 0x8DBA, + 15227 - 11904: 0x8DBC, + 15228 - 11904: 0x9044, + 15232 - 11904: 0xFD4C, + 15253 - 11904: 0x874B, + 15254 - 11904: 0x93E4, + 15257 - 11904: 0x93E0, + 15265 - 11904: 0xFD53, + 15292 - 11904: 0x8DC3, + 15294 - 11904: 0x9BB8, + 15298 - 11904: 0xFBF0, + 15300 - 11904: 0x93E9, + 15319 - 11904: 0x93F6, + 15325 - 11904: 0x8DC5, + 15340 - 11904: 0x8DCA, + 15346 - 11904: 0x8DCC, + 15347 - 11904: 0xFD5D, + 15348 - 11904: 0x93B5, + 15373 - 11904: 0xFD61, + 15377 - 11904: 0x9CF8, + 15381 - 11904: 0x9252, + 15384 - 11904: 0xA0E8, + 15444 - 11904: 0x9CA5, + 15499 - 11904: 0x8C56, + 15563 - 11904: 0x8DD6, + 15565 - 11904: 0x97C0, + 15569 - 11904: 0xA0DE, + 15574 - 11904: 0x97D2, + 15580 - 11904: 0xFAA5, + 15595 - 11904: 0xFDA3, + 15599 - 11904: 0x8DDB, + 15634 - 11904: 0x8CEA, + 15635 - 11904: 0x8EAF, + 15645 - 11904: 0x91B5, + 15666 - 11904: 0xFD49, + 15675 - 11904: 0xFDD1, + 15686 - 11904: 0x8DEB, + 15692 - 11904: 0x97C6, + 15694 - 11904: 0xFDCE, + 15697 - 11904: 0x90FC, + 15711 - 11904: 0xFC59, + 15714 - 11904: 0x96D6, + 15721 - 11904: 0x97C5, + 15722 - 11904: 0x8DEF, + 15727 - 11904: 0x97D7, + 15733 - 11904: 0x8DF0, + 15741 - 11904: 0x96A6, + 15749 - 11904: 0xFBBF, + 15752 - 11904: 0x8CDF, + 15754 - 11904: 0x8DF3, + 15759 - 11904: 0x9449, + 15761 - 11904: 0x8DF5, + 15781 - 11904: 0x9872, + 15789 - 11904: 0x8E6B, + 15796 - 11904: 0xFAFD, + 15807 - 11904: 0x8F50, + 15814 - 11904: 0x9DCC, + 15815 - 11904: 0xFC65, + 15817 - 11904: 0x8C44, + 15820 - 11904: 0x996E, + 15821 - 11904: 0x94A1, + 15827 - 11904: 0x8F63, + 15835 - 11904: 0xA0DA, + 15847 - 11904: 0x9253, + 15848 - 11904: 0xFDE9, + 15851 - 11904: 0x9DB5, + 15859 - 11904: 0x9879, + 15860 - 11904: 0x876A, + 15863 - 11904: 0x9D5D, + 15868 - 11904: 0x8D63, + 15869 - 11904: 0x9669, + 15878 - 11904: 0x9F70, + 15936 - 11904: 0xFC6A, + 15939 - 11904: 0x8AC7, + 15944 - 11904: 0x89D7, + 15957 - 11904: 0xFE4D, + 15988 - 11904: 0x9EDD, + 16040 - 11904: 0xFEFB, + 16041 - 11904: 0x98BC, + 16042 - 11904: 0xFACC, + 16045 - 11904: 0x95B0, + 16049 - 11904: 0x9464, + 16056 - 11904: 0x936F, + 16063 - 11904: 0x94B9, + 16066 - 11904: 0x95EC, + 16071 - 11904: 0x91EE, + 16074 - 11904: 0x98C3, + 16076 - 11904: 0x95F6, + 16080 - 11904: 0x8FFD, + 16081 - 11904: 0x98C5, + 16086 - 11904: 0x9766, + 16087 - 11904: 0xFE6E, + 16090 - 11904: 0x97DD, + 16091 - 11904: 0x8CAA, + 16094 - 11904: 0x92D2, + 16097 - 11904: 0x9761, + 16098 - 11904: 0x98CB, + 16103 - 11904: 0x95F0, + 16105 - 11904: 0x975D, + 16107 - 11904: 0x91E3, + 16108 - 11904: 0x877E, + 16112 - 11904: 0x98CC, + 16115 - 11904: 0x9469, + 16116 - 11904: 0x98CD, + 16122 - 11904: 0x98CE, + 16124 - 11904: 0x95FC, + 16127 - 11904: 0x94A3, + 16128 - 11904: 0x9662, + 16132 - 11904: 0xFEB6, + 16134 - 11904: 0x9463, + 16135 - 11904: 0x8D47, + 16142 - 11904: 0x98D0, + 16211 - 11904: 0x98D1, + 16216 - 11904: 0x9475, + 16217 - 11904: 0xFAE0, + 16227 - 11904: 0x9472, + 16252 - 11904: 0x98D6, + 16275 - 11904: 0x8AF0, + 16320 - 11904: 0x98D9, + 16328 - 11904: 0x8D5A, + 16343 - 11904: 0x98DB, + 16348 - 11904: 0x98DD, + 16357 - 11904: 0x98A8, + 16365 - 11904: 0x8A6D, + 16377 - 11904: 0x8AFB, + 16378 - 11904: 0x8AAE, + 16388 - 11904: 0xFBC9, + 16393 - 11904: 0x8C5D, + 16413 - 11904: 0x98E4, + 16441 - 11904: 0x98E6, + 16453 - 11904: 0x98E8, + 16467 - 11904: 0x8A4D, + 16471 - 11904: 0x9257, + 16482 - 11904: 0x95DF, + 16485 - 11904: 0xA0AC, + 16490 - 11904: 0x98EB, + 16495 - 11904: 0x98EC, + 16497 - 11904: 0x8CC3, + 16552 - 11904: 0x98F4, + 16564 - 11904: 0x87D9, + 16571 - 11904: 0x8AB8, + 16575 - 11904: 0x9EE7, + 16584 - 11904: 0x94BC, + 16600 - 11904: 0xFCD1, + 16607 - 11904: 0x9CC6, + 16632 - 11904: 0x8D4A, + 16634 - 11904: 0x9E7E, + 16642 - 11904: 0x8D44, + 16643 - 11904: 0x98FE, + 16644 - 11904: 0xFDE8, + 16649 - 11904: 0x9940, + 16654 - 11904: 0x94C9, + 16689 - 11904: 0x87C6, + 16690 - 11904: 0x94D3, + 16743 - 11904: 0x9946, + 16748 - 11904: 0x90C0, + 16750 - 11904: 0x94D1, + 16764 - 11904: 0x8D4E, + 16767 - 11904: 0x9573, + 16769 - 11904: 0x87CE, + 16784 - 11904: 0x93C2, + 16818 - 11904: 0x9948, + 16836 - 11904: 0x994B, + 16842 - 11904: 0x8E55, + 16847 - 11904: 0x994E, + 16859 - 11904: 0x8EFE, + 16877 - 11904: 0x8D5F, + 16879 - 11904: 0x8E59, + 16889 - 11904: 0x94EC, + 16913 - 11904: 0x94EF, + 16931 - 11904: 0x8C60, + 16960 - 11904: 0x8F74, + 16992 - 11904: 0x9955, + 17002 - 11904: 0x9544, + 17014 - 11904: 0x8CCB, + 17018 - 11904: 0x9956, + 17036 - 11904: 0x9959, + 17044 - 11904: 0x995B, + 17058 - 11904: 0x8CC4, + 17077 - 11904: 0xFA45, + 17081 - 11904: 0x90B7, + 17084 - 11904: 0x9743, + 17140 - 11904: 0x95CD, + 17147 - 11904: 0x97C9, + 17148 - 11904: 0xFD50, + 17162 - 11904: 0x87AA, + 17195 - 11904: 0x8EB9, + 17262 - 11904: 0x95C6, + 17303 - 11904: 0x9967, + 17306 - 11904: 0x8CE3, + 17338 - 11904: 0x8AB9, + 17345 - 11904: 0x8DFC, + 17369 - 11904: 0x8A76, + 17375 - 11904: 0x9D51, + 17389 - 11904: 0x9973, + 17392 - 11904: 0x8740, + 17394 - 11904: 0x9D4F, + 17409 - 11904: 0x997A, + 17410 - 11904: 0x9564, + 17427 - 11904: 0x99A1, + 17445 - 11904: 0x99A5, + 17453 - 11904: 0x99A7, + 17530 - 11904: 0x8EED, + 17551 - 11904: 0x99AD, + 17553 - 11904: 0xC87E, + 17567 - 11904: 0x946E, + 17568 - 11904: 0x8F70, + 17570 - 11904: 0xFAD0, + 17584 - 11904: 0x99B3, + 17591 - 11904: 0xA053, + 17597 - 11904: 0x8D5E, + 17600 - 11904: 0x965C, + 17603 - 11904: 0x8CE0, + 17605 - 11904: 0xFD7A, + 17614 - 11904: 0x97FE, + 17629 - 11904: 0x92BD, + 17630 - 11904: 0x8D5D, + 17631 - 11904: 0x97FD, + 17633 - 11904: 0x87DB, + 17636 - 11904: 0x8F64, + 17641 - 11904: 0xFCF7, + 17642 - 11904: 0x9562, + 17643 - 11904: 0x97CD, + 17644 - 11904: 0x9E64, + 17652 - 11904: 0x924C, + 17667 - 11904: 0x8EC9, + 17668 - 11904: 0x99BC, + 17673 - 11904: 0x9DA5, + 17675 - 11904: 0x8F54, + 17686 - 11904: 0x8F7C, + 17691 - 11904: 0x8D55, + 17693 - 11904: 0x8EA2, + 17703 - 11904: 0x8F7A, + 17710 - 11904: 0x97AE, + 17715 - 11904: 0x96C8, + 17718 - 11904: 0x8CE4, + 17723 - 11904: 0x99C3, + 17725 - 11904: 0x90D6, + 17727 - 11904: 0x9CBE, + 17731 - 11904: 0x8F76, + 17745 - 11904: 0x9470, + 17746 - 11904: 0xFB4B, + 17749 - 11904: 0xFDCA, + 17752 - 11904: 0x8CEF, + 17756 - 11904: 0x8EC7, + 17761 - 11904: 0x8D54, + 17762 - 11904: 0xA0F9, + 17770 - 11904: 0x8FA9, + 17773 - 11904: 0x8D51, + 17783 - 11904: 0x99C7, + 17784 - 11904: 0x8744, + 17797 - 11904: 0x90D7, + 17830 - 11904: 0x8743, + 17843 - 11904: 0x8747, + 17882 - 11904: 0x8758, + 17897 - 11904: 0x9EDF, + 17898 - 11904: 0x8D59, + 17923 - 11904: 0x8742, + 17926 - 11904: 0x99CE, + 17935 - 11904: 0x8FBA, + 17941 - 11904: 0x8FEB, + 17943 - 11904: 0x99CF, + 18011 - 11904: 0x8FC2, + 18042 - 11904: 0x92C9, + 18048 - 11904: 0x97DC, + 18081 - 11904: 0x875D, + 18094 - 11904: 0x87CC, + 18107 - 11904: 0x8D45, + 18127 - 11904: 0x95B3, + 18128 - 11904: 0x9C79, + 18165 - 11904: 0x95B2, + 18167 - 11904: 0x8D4C, + 18195 - 11904: 0x8FDB, + 18200 - 11904: 0x9BE3, + 18230 - 11904: 0x874C, + 18244 - 11904: 0x874D, + 18254 - 11904: 0x9E7A, + 18255 - 11904: 0x8757, + 18300 - 11904: 0x9BEE, + 18328 - 11904: 0x99DE, + 18342 - 11904: 0xFAFA, + 18389 - 11904: 0x8A52, + 18413 - 11904: 0x99E1, + 18420 - 11904: 0x8A67, + 18432 - 11904: 0x8BB5, + 18443 - 11904: 0x8AAC, + 18487 - 11904: 0x99E9, + 18525 - 11904: 0xFBCA, + 18545 - 11904: 0x97DE, + 18587 - 11904: 0x95D1, + 18605 - 11904: 0x99F5, + 18606 - 11904: 0xFC4A, + 18640 - 11904: 0x9BA9, + 18653 - 11904: 0xFBDC, + 18669 - 11904: 0xFE56, + 18675 - 11904: 0x9EA4, + 18682 - 11904: 0x9D49, + 18694 - 11904: 0x95DB, + 18705 - 11904: 0x89C5, + 18718 - 11904: 0x99F8, + 18725 - 11904: 0x9664, + 18730 - 11904: 0x9055, + 18733 - 11904: 0x96D4, + 18735 - 11904: 0x87C4, + 18736 - 11904: 0x87AE, + 18741 - 11904: 0x977C, + 18748 - 11904: 0x964D, + 18750 - 11904: 0x97E1, + 18757 - 11904: 0x9A48, + 18769 - 11904: 0x9A49, + 18771 - 11904: 0xFE7D, + 18789 - 11904: 0x90AA, + 18794 - 11904: 0x9A50, + 18802 - 11904: 0x9347, + 18825 - 11904: 0x8ED8, + 18849 - 11904: 0x90C9, + 18855 - 11904: 0x9A55, + 18911 - 11904: 0x90BC, + 18917 - 11904: 0x9A58, + 18919 - 11904: 0x8BB8, + 18959 - 11904: 0x90D5, + 18973 - 11904: 0x9641, + 18980 - 11904: 0x9A5A, + 18997 - 11904: 0x9A5C, + 19094 - 11904: 0x97C2, + 19108 - 11904: 0x875C, + 19124 - 11904: 0x8ABB, + 19128 - 11904: 0x9BAA, + 19153 - 11904: 0x90F5, + 19172 - 11904: 0x9A60, + 19199 - 11904: 0x9145, + 19216 - 11904: 0x8C58, + 19225 - 11904: 0x9A63, + 19232 - 11904: 0x8C49, + 19244 - 11904: 0x8BB6, + 19255 - 11904: 0xFCCF, + 19311 - 11904: 0x966B, + 19312 - 11904: 0x9A6E, + 19314 - 11904: 0x914F, + 19323 - 11904: 0x9746, + 19326 - 11904: 0xA0E6, + 19342 - 11904: 0x92D7, + 19344 - 11904: 0x9675, + 19347 - 11904: 0x93D4, + 19350 - 11904: 0x91BB, + 19351 - 11904: 0x9679, + 19357 - 11904: 0x9A70, + 19389 - 11904: 0x9678, + 19390 - 11904: 0x91CD, + 19392 - 11904: 0x9C4A, + 19460 - 11904: 0xA06F, + 19463 - 11904: 0xA06A, + 19470 - 11904: 0x915F, + 19506 - 11904: 0x8741, + 19515 - 11904: 0x9FA5, + 19518 - 11904: 0x89BA, + 19520 - 11904: 0x874F, + 19527 - 11904: 0x874E, + 19543 - 11904: 0x8755, + 19547 - 11904: 0x9ECD, + 19565 - 11904: 0x9A79, + 19575 - 11904: 0x8CF2, + 19579 - 11904: 0x8D57, + 19581 - 11904: 0x9DCE, + 19585 - 11904: 0x8CD2, + 19589 - 11904: 0x8759, + 19620 - 11904: 0x9D73, + 19630 - 11904: 0x96B9, + 19632 - 11904: 0x96BC, + 19639 - 11904: 0x9CD1, + 19661 - 11904: 0x89B7, + 19681 - 11904: 0x9EEE, + 19682 - 11904: 0x8749, + 19693 - 11904: 0xFB43, + 19719 - 11904: 0x875B, + 19721 - 11904: 0x9EC9, + 19728 - 11904: 0xFBD3, + 19764 - 11904: 0x91AE, + 19830 - 11904: 0x8D58, + 19831 - 11904: 0x8746, + 19849 - 11904: 0x8D56, + 19857 - 11904: 0x9D78, + 19868 - 11904: 0x9D7B, + 19968 - 11904: 0xA440, + 19969 - 11904: 0xA442, + 19971 - 11904: 0xA443, + 19972 - 11904: 0x9EB3, + 19975 - 11904: 0xC945, + 19976 - 11904: 0xA456, + 19977 - 11904: 0xA454, + 19978 - 11904: 0xA457, + 19979 - 11904: 0xA455, + 19980 - 11904: 0xC946, + 19981 - 11904: 0xA4A3, + 19982 - 11904: 0xC94F, + 19983 - 11904: 0xC94D, + 19984 - 11904: 0xA4A2, + 19985 - 11904: 0xA4A1, + 19988 - 11904: 0xA542, + 19989 - 11904: 0xA541, + 19990 - 11904: 0xA540, + 19992 - 11904: 0xA543, + 19993 - 11904: 0xA4FE, + 19994 - 11904: 0x9EB2, + 19996 - 11904: 0x9DD6, + 19998 - 11904: 0xA5E0, + 19999 - 11904: 0xA5E1, + 20001 - 11904: 0x994F, + 20004 - 11904: 0x89CE, + 20006 - 11904: 0xA8C3, + 20008 - 11904: 0x8BC0, + 20010 - 11904: 0x9FC4, + 20011 - 11904: 0xA458, + 20012 - 11904: 0x8BD4, + 20013 - 11904: 0xA4A4, + 20014 - 11904: 0xC950, + 20015 - 11904: 0x8C72, + 20016 - 11904: 0xA4A5, + 20017 - 11904: 0xC963, + 20018 - 11904: 0xA6EA, + 20019 - 11904: 0xCBB1, + 20022 - 11904: 0xC6BF, + 20023 - 11904: 0x8BF9, + 20024 - 11904: 0xA459, + 20025 - 11904: 0xA4A6, + 20027 - 11904: 0xA544, + 20028 - 11904: 0xC964, + 20029 - 11904: 0x8946, + 20031 - 11904: 0xC6C0, + 20034 - 11904: 0xC940, + 20035 - 11904: 0xA444, + 20037 - 11904: 0xA45B, + 20039 - 11904: 0xC947, + 20040 - 11904: 0xA45C, + 20041 - 11904: 0xFAE5, + 20043 - 11904: 0xA4A7, + 20045 - 11904: 0xA545, + 20046 - 11904: 0xA547, + 20047 - 11904: 0xA546, + 20050 - 11904: 0xA5E2, + 20051 - 11904: 0xA5E3, + 20054 - 11904: 0xA8C4, + 20056 - 11904: 0xADBC, + 20057 - 11904: 0xA441, + 20058 - 11904: 0xC87B, + 20059 - 11904: 0x8BC6, + 20060 - 11904: 0xC941, + 20061 - 11904: 0xA445, + 20062 - 11904: 0xA45E, + 20063 - 11904: 0xA45D, + 20073 - 11904: 0xA5E4, + 20074 - 11904: 0x9C57, + 20083 - 11904: 0xA8C5, + 20088 - 11904: 0x9AFB, + 20094 - 11904: 0xB0AE, + 20095 - 11904: 0xD44B, + 20096 - 11904: 0x89D0, + 20097 - 11904: 0x89CF, + 20098 - 11904: 0xB6C3, + 20099 - 11904: 0xDCB1, + 20100 - 11904: 0xDCB2, + 20101 - 11904: 0xC6C1, + 20102 - 11904: 0xA446, + 20103 - 11904: 0x89D1, + 20104 - 11904: 0xA4A9, + 20105 - 11904: 0x89E2, + 20107 - 11904: 0xA8C6, + 20108 - 11904: 0xA447, + 20109 - 11904: 0xC948, + 20110 - 11904: 0xA45F, + 20113 - 11904: 0xA4AA, + 20114 - 11904: 0xA4AC, + 20115 - 11904: 0xC951, + 20116 - 11904: 0xA4AD, + 20117 - 11904: 0xA4AB, + 20120 - 11904: 0x927E, + 20121 - 11904: 0xA5E5, + 20122 - 11904: 0x9DBA, + 20123 - 11904: 0xA8C7, + 20126 - 11904: 0xA8C8, + 20127 - 11904: 0xAB45, + 20128 - 11904: 0xC6C2, + 20129 - 11904: 0xA460, + 20130 - 11904: 0xA4AE, + 20131 - 11904: 0x8C6F, + 20132 - 11904: 0xA5E6, + 20133 - 11904: 0xA5E8, + 20134 - 11904: 0xA5E7, + 20136 - 11904: 0xA6EB, + 20139 - 11904: 0xA8C9, + 20140 - 11904: 0xA8CA, + 20141 - 11904: 0xAB46, + 20142 - 11904: 0xAB47, + 20147 - 11904: 0xADBD, + 20150 - 11904: 0xDCB3, + 20151 - 11904: 0xFBF8, + 20153 - 11904: 0xF6D6, + 20154 - 11904: 0xA448, + 20155 - 11904: 0x8BC7, + 20156 - 11904: 0x926B, + 20159 - 11904: 0x89D2, + 20160 - 11904: 0xA4B0, + 20161 - 11904: 0xA4AF, + 20162 - 11904: 0xC952, + 20163 - 11904: 0xA4B1, + 20164 - 11904: 0xA4B7, + 20166 - 11904: 0xA4B2, + 20167 - 11904: 0xA4B3, + 20168 - 11904: 0xC954, + 20169 - 11904: 0xC953, + 20170 - 11904: 0xA4B5, + 20171 - 11904: 0xA4B6, + 20173 - 11904: 0xA4B4, + 20174 - 11904: 0x9FCF, + 20180 - 11904: 0xA54A, + 20181 - 11904: 0xA54B, + 20182 - 11904: 0xA54C, + 20183 - 11904: 0xA54D, + 20184 - 11904: 0xA549, + 20185 - 11904: 0xA550, + 20186 - 11904: 0xC96A, + 20188 - 11904: 0xC966, + 20189 - 11904: 0xC969, + 20190 - 11904: 0xA551, + 20191 - 11904: 0xA561, + 20193 - 11904: 0xC968, + 20195 - 11904: 0xA54E, + 20196 - 11904: 0xA54F, + 20197 - 11904: 0xA548, + 20200 - 11904: 0xC965, + 20201 - 11904: 0xC967, + 20202 - 11904: 0x9DA9, + 20203 - 11904: 0x89D3, + 20206 - 11904: 0x99E2, + 20208 - 11904: 0xA5F5, + 20209 - 11904: 0xC9B0, + 20210 - 11904: 0xA5F2, + 20211 - 11904: 0xA5F6, + 20212 - 11904: 0xC9BA, + 20213 - 11904: 0xC9AE, + 20214 - 11904: 0xA5F3, + 20215 - 11904: 0xC9B2, + 20216 - 11904: 0x9267, + 20219 - 11904: 0xA5F4, + 20221 - 11904: 0xA5F7, + 20223 - 11904: 0xA5E9, + 20224 - 11904: 0xC9B1, + 20225 - 11904: 0xA5F8, + 20226 - 11904: 0xC9B5, + 20227 - 11904: 0x92A4, + 20228 - 11904: 0xC9B9, + 20229 - 11904: 0xC9B6, + 20232 - 11904: 0xC9B3, + 20233 - 11904: 0xA5EA, + 20234 - 11904: 0xA5EC, + 20235 - 11904: 0xA5F9, + 20237 - 11904: 0xA5EE, + 20238 - 11904: 0xC9AB, + 20239 - 11904: 0xA5F1, + 20240 - 11904: 0xA5EF, + 20241 - 11904: 0xA5F0, + 20242 - 11904: 0xC9BB, + 20243 - 11904: 0xC9B8, + 20244 - 11904: 0xC9AF, + 20245 - 11904: 0xA5ED, + 20247 - 11904: 0x8C73, + 20248 - 11904: 0xC9AC, + 20249 - 11904: 0xA5EB, + 20250 - 11904: 0x894E, + 20253 - 11904: 0xC9B4, + 20258 - 11904: 0xC9B7, + 20264 - 11904: 0x894F, + 20265 - 11904: 0x9278, + 20268 - 11904: 0xC9AD, + 20269 - 11904: 0xCA66, + 20271 - 11904: 0xA742, + 20272 - 11904: 0xA6F4, + 20274 - 11904: 0x91B6, + 20275 - 11904: 0xCA67, + 20276 - 11904: 0xA6F1, + 20278 - 11904: 0xA744, + 20279 - 11904: 0x89D4, + 20280 - 11904: 0xA6F9, + 20281 - 11904: 0x9FD2, + 20282 - 11904: 0xA6F8, + 20283 - 11904: 0xCA5B, + 20284 - 11904: 0xA6FC, + 20285 - 11904: 0xA6F7, + 20286 - 11904: 0xCA60, + 20287 - 11904: 0xCA68, + 20289 - 11904: 0xCA64, + 20290 - 11904: 0x92A7, + 20291 - 11904: 0xA6FA, + 20293 - 11904: 0x95A2, + 20294 - 11904: 0xA6FD, + 20295 - 11904: 0xA6EE, + 20296 - 11904: 0xA747, + 20297 - 11904: 0xCA5D, + 20299 - 11904: 0x926E, + 20300 - 11904: 0xCBBD, + 20301 - 11904: 0xA6EC, + 20302 - 11904: 0xA743, + 20303 - 11904: 0xA6ED, + 20304 - 11904: 0xA6F5, + 20305 - 11904: 0xA6F6, + 20306 - 11904: 0xCA62, + 20307 - 11904: 0xCA5E, + 20308 - 11904: 0xA6FB, + 20309 - 11904: 0xA6F3, + 20310 - 11904: 0xCA5A, + 20311 - 11904: 0xA6EF, + 20312 - 11904: 0xCA65, + 20313 - 11904: 0xA745, + 20314 - 11904: 0xA748, + 20315 - 11904: 0xA6F2, + 20316 - 11904: 0xA740, + 20317 - 11904: 0xA746, + 20318 - 11904: 0xA6F0, + 20319 - 11904: 0xCA63, + 20320 - 11904: 0xA741, + 20321 - 11904: 0xCA69, + 20322 - 11904: 0xCA5C, + 20323 - 11904: 0xA6FE, + 20324 - 11904: 0xCA5F, + 20327 - 11904: 0xCA61, + 20329 - 11904: 0xA8D8, + 20330 - 11904: 0xCBBF, + 20331 - 11904: 0xCBCB, + 20332 - 11904: 0xA8D0, + 20334 - 11904: 0xCBCC, + 20335 - 11904: 0xA8CB, + 20336 - 11904: 0xA8D5, + 20338 - 11904: 0x96EA, + 20339 - 11904: 0xA8CE, + 20340 - 11904: 0xCBB9, + 20341 - 11904: 0xA8D6, + 20342 - 11904: 0xCBB8, + 20343 - 11904: 0xCBBC, + 20344 - 11904: 0xCBC3, + 20345 - 11904: 0xCBC1, + 20346 - 11904: 0xA8DE, + 20347 - 11904: 0xA8D9, + 20348 - 11904: 0xCBB3, + 20349 - 11904: 0xCBB5, + 20350 - 11904: 0xA8DB, + 20351 - 11904: 0xA8CF, + 20352 - 11904: 0xCBB6, + 20353 - 11904: 0xCBC2, + 20354 - 11904: 0xCBC9, + 20355 - 11904: 0xA8D4, + 20356 - 11904: 0xCBBB, + 20357 - 11904: 0xCBB4, + 20358 - 11904: 0xA8D3, + 20359 - 11904: 0xCBB7, + 20360 - 11904: 0xA8D7, + 20361 - 11904: 0xCBBA, + 20362 - 11904: 0x926F, + 20363 - 11904: 0xA8D2, + 20365 - 11904: 0xA8CD, + 20367 - 11904: 0xA8DC, + 20368 - 11904: 0xCBC4, + 20369 - 11904: 0xA8DD, + 20370 - 11904: 0xCBC8, + 20372 - 11904: 0xCBC6, + 20373 - 11904: 0xCBCA, + 20374 - 11904: 0xA8DA, + 20375 - 11904: 0xCBBE, + 20376 - 11904: 0xCBB2, + 20378 - 11904: 0xCBC0, + 20379 - 11904: 0xA8D1, + 20380 - 11904: 0xCBC5, + 20381 - 11904: 0xA8CC, + 20382 - 11904: 0xCBC7, + 20386 - 11904: 0x92A3, + 20392 - 11904: 0x8950, + 20395 - 11904: 0xFA57, + 20398 - 11904: 0xAB56, + 20399 - 11904: 0xAB4A, + 20400 - 11904: 0x9866, + 20402 - 11904: 0xCDE0, + 20403 - 11904: 0xCDE8, + 20404 - 11904: 0x8CF8, + 20405 - 11904: 0xAB49, + 20406 - 11904: 0xAB51, + 20407 - 11904: 0xAB5D, + 20409 - 11904: 0xCDEE, + 20410 - 11904: 0xCDEC, + 20411 - 11904: 0xCDE7, + 20413 - 11904: 0x89D6, + 20415 - 11904: 0xAB4B, + 20416 - 11904: 0xCDED, + 20417 - 11904: 0xCDE3, + 20418 - 11904: 0xAB59, + 20419 - 11904: 0xAB50, + 20420 - 11904: 0xAB58, + 20421 - 11904: 0xCDDE, + 20423 - 11904: 0xCDEA, + 20424 - 11904: 0x98B2, + 20425 - 11904: 0xCDE1, + 20426 - 11904: 0xAB54, + 20427 - 11904: 0xCDE2, + 20428 - 11904: 0x92AB, + 20429 - 11904: 0xCDDD, + 20430 - 11904: 0xAB5B, + 20431 - 11904: 0xAB4E, + 20432 - 11904: 0xAB57, + 20433 - 11904: 0xAB4D, + 20435 - 11904: 0xCDDF, + 20436 - 11904: 0xCDE4, + 20438 - 11904: 0xCDEB, + 20439 - 11904: 0xAB55, + 20440 - 11904: 0xAB52, + 20441 - 11904: 0xCDE6, + 20442 - 11904: 0xAB5A, + 20443 - 11904: 0xCDE9, + 20444 - 11904: 0xCDE5, + 20445 - 11904: 0xAB4F, + 20446 - 11904: 0xAB5C, + 20447 - 11904: 0xAB53, + 20448 - 11904: 0xAB4C, + 20449 - 11904: 0xAB48, + 20452 - 11904: 0x96DE, + 20453 - 11904: 0x92AC, + 20460 - 11904: 0xCDEF, + 20462 - 11904: 0xADD7, + 20463 - 11904: 0xADC1, + 20464 - 11904: 0x8C70, + 20465 - 11904: 0xADD1, + 20466 - 11904: 0x9F6E, + 20467 - 11904: 0xADD6, + 20468 - 11904: 0xD0D0, + 20469 - 11904: 0xD0CF, + 20470 - 11904: 0xD0D4, + 20471 - 11904: 0xD0D5, + 20472 - 11904: 0xADC4, + 20473 - 11904: 0x8EF2, + 20474 - 11904: 0xADCD, + 20477 - 11904: 0x9F6C, + 20478 - 11904: 0xADDA, + 20480 - 11904: 0xADCE, + 20483 - 11904: 0x89D8, + 20485 - 11904: 0xD0C9, + 20486 - 11904: 0xADC7, + 20487 - 11904: 0xD0CA, + 20488 - 11904: 0xFA59, + 20489 - 11904: 0xADDC, + 20491 - 11904: 0xADD3, + 20492 - 11904: 0xADBE, + 20493 - 11904: 0xADBF, + 20494 - 11904: 0xD0DD, + 20495 - 11904: 0xB0BF, + 20497 - 11904: 0xADCC, + 20498 - 11904: 0xADCB, + 20499 - 11904: 0xD0CB, + 20500 - 11904: 0xADCF, + 20501 - 11904: 0xD45B, + 20502 - 11904: 0xADC6, + 20503 - 11904: 0xD0D6, + 20504 - 11904: 0xADD5, + 20505 - 11904: 0xADD4, + 20506 - 11904: 0xADCA, + 20507 - 11904: 0xD0CE, + 20508 - 11904: 0xD0D7, + 20510 - 11904: 0xD0C8, + 20511 - 11904: 0xADC9, + 20512 - 11904: 0xD0D8, + 20513 - 11904: 0xADD2, + 20514 - 11904: 0xD0CC, + 20515 - 11904: 0xADC0, + 20517 - 11904: 0xADC3, + 20518 - 11904: 0xADC2, + 20519 - 11904: 0xD0D9, + 20520 - 11904: 0xADD0, + 20521 - 11904: 0xFA5F, + 20522 - 11904: 0xADD9, + 20523 - 11904: 0xADDB, + 20524 - 11904: 0xD0D3, + 20525 - 11904: 0xADD8, + 20526 - 11904: 0x92A8, + 20527 - 11904: 0xD0DB, + 20528 - 11904: 0xD0CD, + 20529 - 11904: 0xD0DC, + 20531 - 11904: 0xD0D1, + 20532 - 11904: 0x9163, + 20533 - 11904: 0xD0DA, + 20535 - 11904: 0xD0D2, + 20539 - 11904: 0x8C40, + 20540 - 11904: 0xADC8, + 20544 - 11904: 0xD463, + 20545 - 11904: 0xD457, + 20547 - 11904: 0xB0B3, + 20549 - 11904: 0xD45C, + 20550 - 11904: 0xD462, + 20551 - 11904: 0xB0B2, + 20552 - 11904: 0xD455, + 20553 - 11904: 0xB0B6, + 20554 - 11904: 0xD459, + 20555 - 11904: 0xD452, + 20556 - 11904: 0xB0B4, + 20557 - 11904: 0xD456, + 20558 - 11904: 0xB0B9, + 20559 - 11904: 0xB0BE, + 20561 - 11904: 0xD467, + 20563 - 11904: 0xD451, + 20565 - 11904: 0xB0BA, + 20566 - 11904: 0x9F73, + 20567 - 11904: 0xD466, + 20568 - 11904: 0x92AD, + 20570 - 11904: 0xB0B5, + 20571 - 11904: 0xD458, + 20572 - 11904: 0xB0B1, + 20573 - 11904: 0xD453, + 20574 - 11904: 0xD44F, + 20575 - 11904: 0xD45D, + 20576 - 11904: 0xD450, + 20577 - 11904: 0xD44E, + 20578 - 11904: 0xD45A, + 20579 - 11904: 0xD460, + 20580 - 11904: 0xD461, + 20581 - 11904: 0xB0B7, + 20582 - 11904: 0x9BE9, + 20584 - 11904: 0xD85B, + 20585 - 11904: 0xD45E, + 20586 - 11904: 0xD44D, + 20587 - 11904: 0xD45F, + 20588 - 11904: 0x92A9, + 20589 - 11904: 0xB0C1, + 20590 - 11904: 0xD464, + 20591 - 11904: 0xB0C0, + 20592 - 11904: 0xD44C, + 20594 - 11904: 0xD454, + 20595 - 11904: 0xD465, + 20596 - 11904: 0xB0BC, + 20597 - 11904: 0xB0BB, + 20598 - 11904: 0xB0B8, + 20599 - 11904: 0xB0BD, + 20602 - 11904: 0xB0AF, + 20605 - 11904: 0xFA66, + 20608 - 11904: 0xB3C8, + 20609 - 11904: 0x92AA, + 20610 - 11904: 0xD85E, + 20611 - 11904: 0xD857, + 20613 - 11904: 0xB3C5, + 20615 - 11904: 0xD85F, + 20616 - 11904: 0x89D9, + 20619 - 11904: 0xD855, + 20620 - 11904: 0xD858, + 20621 - 11904: 0xB3C4, + 20622 - 11904: 0xD859, + 20624 - 11904: 0xFD56, + 20625 - 11904: 0xB3C7, + 20626 - 11904: 0xD85D, + 20628 - 11904: 0xD853, + 20629 - 11904: 0xD852, + 20630 - 11904: 0xB3C9, + 20632 - 11904: 0xB3CA, + 20633 - 11904: 0xB3C6, + 20634 - 11904: 0xB3CB, + 20635 - 11904: 0xD851, + 20636 - 11904: 0xD85C, + 20637 - 11904: 0xD85A, + 20638 - 11904: 0xD854, + 20642 - 11904: 0xB3C3, + 20643 - 11904: 0xD856, + 20646 - 11904: 0x9FA8, + 20652 - 11904: 0xB6CA, + 20653 - 11904: 0xB6C4, + 20654 - 11904: 0xDCB7, + 20655 - 11904: 0xB6CD, + 20656 - 11904: 0xDCBD, + 20657 - 11904: 0xDCC0, + 20658 - 11904: 0xB6C6, + 20659 - 11904: 0xB6C7, + 20660 - 11904: 0xDCBA, + 20661 - 11904: 0xB6C5, + 20662 - 11904: 0xDCC3, + 20663 - 11904: 0xB6CB, + 20664 - 11904: 0xDCC4, + 20666 - 11904: 0xDCBF, + 20667 - 11904: 0xB6CC, + 20668 - 11904: 0x8C71, + 20669 - 11904: 0xDCB4, + 20670 - 11904: 0xB6C9, + 20671 - 11904: 0xDCB5, + 20673 - 11904: 0xDCBE, + 20674 - 11904: 0xDCBC, + 20676 - 11904: 0xDCB8, + 20677 - 11904: 0xB6C8, + 20678 - 11904: 0xDCB6, + 20679 - 11904: 0xB6CE, + 20680 - 11904: 0xDCBB, + 20681 - 11904: 0xDCC2, + 20682 - 11904: 0xDCB9, + 20683 - 11904: 0xDCC1, + 20685 - 11904: 0x92A1, + 20686 - 11904: 0xB9B6, + 20687 - 11904: 0xB9B3, + 20688 - 11904: 0x90E3, + 20689 - 11904: 0xB9B4, + 20691 - 11904: 0xE0F9, + 20692 - 11904: 0xE0F1, + 20693 - 11904: 0xB9B2, + 20694 - 11904: 0xB9AF, + 20695 - 11904: 0xE0F2, + 20697 - 11904: 0xA0A6, + 20698 - 11904: 0xB9B1, + 20699 - 11904: 0xE0F5, + 20701 - 11904: 0xE0F7, + 20703 - 11904: 0x94AB, + 20704 - 11904: 0xE0FE, + 20705 - 11904: 0xFC72, + 20707 - 11904: 0xE0FD, + 20708 - 11904: 0xE0F8, + 20709 - 11904: 0xB9AE, + 20710 - 11904: 0xE0F0, + 20711 - 11904: 0xB9AC, + 20712 - 11904: 0xE0F3, + 20713 - 11904: 0xB9B7, + 20714 - 11904: 0xE0F6, + 20716 - 11904: 0xE0FA, + 20717 - 11904: 0xB9B0, + 20718 - 11904: 0xB9AD, + 20719 - 11904: 0xE0FC, + 20720 - 11904: 0xE0FB, + 20721 - 11904: 0xB9B5, + 20723 - 11904: 0xE0F4, + 20724 - 11904: 0x97C4, + 20725 - 11904: 0xBBF8, + 20726 - 11904: 0xE4EC, + 20728 - 11904: 0xE4E9, + 20729 - 11904: 0xBBF9, + 20731 - 11904: 0xBBF7, + 20732 - 11904: 0x92AE, + 20733 - 11904: 0xE4F0, + 20734 - 11904: 0xE4ED, + 20735 - 11904: 0xE4E6, + 20736 - 11904: 0xBBF6, + 20737 - 11904: 0xFA67, + 20738 - 11904: 0xBBFA, + 20739 - 11904: 0xE4E7, + 20740 - 11904: 0xBBF5, + 20741 - 11904: 0xBBFD, + 20742 - 11904: 0xE4EA, + 20743 - 11904: 0xE4EB, + 20744 - 11904: 0xBBFB, + 20745 - 11904: 0xBBFC, + 20746 - 11904: 0xE4F1, + 20747 - 11904: 0xE4EE, + 20748 - 11904: 0xE4EF, + 20749 - 11904: 0x92A2, + 20750 - 11904: 0xFA69, + 20752 - 11904: 0xBEAA, + 20753 - 11904: 0xE8F8, + 20754 - 11904: 0xBEA7, + 20755 - 11904: 0xE8F5, + 20756 - 11904: 0xBEA9, + 20757 - 11904: 0xBEAB, + 20759 - 11904: 0xE8F6, + 20760 - 11904: 0xBEA8, + 20762 - 11904: 0xE8F7, + 20764 - 11904: 0xE8F4, + 20767 - 11904: 0xC076, + 20768 - 11904: 0xECBD, + 20769 - 11904: 0xC077, + 20770 - 11904: 0xECBB, + 20772 - 11904: 0xECBC, + 20773 - 11904: 0xECBA, + 20774 - 11904: 0xECB9, + 20777 - 11904: 0xECBE, + 20778 - 11904: 0xC075, + 20779 - 11904: 0x9268, + 20781 - 11904: 0xEFB8, + 20782 - 11904: 0xEFB9, + 20784 - 11904: 0xE4E8, + 20785 - 11904: 0xEFB7, + 20786 - 11904: 0xC078, + 20787 - 11904: 0xC35F, + 20788 - 11904: 0xF1EB, + 20789 - 11904: 0xF1EC, + 20791 - 11904: 0xC4D7, + 20792 - 11904: 0xC4D8, + 20793 - 11904: 0xF5C1, + 20794 - 11904: 0xF5C0, + 20795 - 11904: 0xC56C, + 20796 - 11904: 0xC56B, + 20797 - 11904: 0xF7D0, + 20799 - 11904: 0xA449, + 20800 - 11904: 0xA461, + 20801 - 11904: 0xA4B9, + 20803 - 11904: 0xA4B8, + 20804 - 11904: 0xA553, + 20805 - 11904: 0xA552, + 20806 - 11904: 0xA5FC, + 20807 - 11904: 0xA5FB, + 20808 - 11904: 0xA5FD, + 20809 - 11904: 0xA5FA, + 20811 - 11904: 0xA74A, + 20812 - 11904: 0xA749, + 20813 - 11904: 0xA74B, + 20818 - 11904: 0xA8E0, + 20820 - 11904: 0xA8DF, + 20821 - 11904: 0xA8E1, + 20822 - 11904: 0x8951, + 20823 - 11904: 0xAB5E, + 20825 - 11904: 0xA259, + 20826 - 11904: 0xD0DE, + 20827 - 11904: 0xA25A, + 20828 - 11904: 0xB0C2, + 20829 - 11904: 0xA25C, + 20830 - 11904: 0xA25B, + 20831 - 11904: 0xD860, + 20832 - 11904: 0xFA6F, + 20833 - 11904: 0xA25D, + 20834 - 11904: 0xB9B8, + 20835 - 11904: 0xA25E, + 20837 - 11904: 0xA44A, + 20839 - 11904: 0xA4BA, + 20840 - 11904: 0xA5FE, + 20841 - 11904: 0xA8E2, + 20842 - 11904: 0xFA71, + 20843 - 11904: 0xA44B, + 20844 - 11904: 0xA4BD, + 20845 - 11904: 0xA4BB, + 20846 - 11904: 0xA4BC, + 20849 - 11904: 0xA640, + 20852 - 11904: 0x8952, + 20853 - 11904: 0xA74C, + 20854 - 11904: 0xA8E4, + 20855 - 11904: 0xA8E3, + 20856 - 11904: 0xA8E5, + 20857 - 11904: 0x945A, + 20860 - 11904: 0xADDD, + 20864 - 11904: 0xBEAC, + 20866 - 11904: 0xC6C3, + 20870 - 11904: 0x89DD, + 20871 - 11904: 0xC94E, + 20872 - 11904: 0xC8A2, + 20873 - 11904: 0xA554, + 20874 - 11904: 0xA555, + 20877 - 11904: 0xA641, + 20879 - 11904: 0xCA6A, + 20881 - 11904: 0xAB60, + 20882 - 11904: 0xAB5F, + 20883 - 11904: 0xD0E0, + 20884 - 11904: 0xD0DF, + 20885 - 11904: 0xB0C3, + 20886 - 11904: 0xC6C4, + 20887 - 11904: 0xA4BE, + 20888 - 11904: 0xC955, + 20890 - 11904: 0x9E52, + 20892 - 11904: 0x8953, + 20894 - 11904: 0xCBCD, + 20896 - 11904: 0xAB61, + 20898 - 11904: 0xADE0, + 20900 - 11904: 0xADDE, + 20901 - 11904: 0xADDF, + 20903 - 11904: 0x9E55, + 20904 - 11904: 0x92BA, + 20906 - 11904: 0xBEAD, + 20907 - 11904: 0xC6C5, + 20908 - 11904: 0xA556, + 20910 - 11904: 0x8C5B, + 20912 - 11904: 0xA642, + 20913 - 11904: 0xC9BC, + 20914 - 11904: 0xFA7D, + 20915 - 11904: 0xFAA8, + 20916 - 11904: 0x9A68, + 20917 - 11904: 0xFA47, + 20918 - 11904: 0xA74D, + 20919 - 11904: 0xA74E, + 20920 - 11904: 0xFA7E, + 20921 - 11904: 0xCA6B, + 20924 - 11904: 0xCBCE, + 20925 - 11904: 0xA8E6, + 20926 - 11904: 0xCBCF, + 20931 - 11904: 0x92BB, + 20932 - 11904: 0xD0E2, + 20933 - 11904: 0xD0E3, + 20934 - 11904: 0xADE3, + 20935 - 11904: 0xFDB6, + 20936 - 11904: 0xD0E4, + 20937 - 11904: 0xFAA2, + 20938 - 11904: 0xD0E1, + 20939 - 11904: 0xADE4, + 20940 - 11904: 0xADE2, + 20941 - 11904: 0xADE1, + 20942 - 11904: 0xD0E5, + 20943 - 11904: 0xFAA3, + 20944 - 11904: 0xD468, + 20945 - 11904: 0xFAA4, + 20946 - 11904: 0x9BB4, + 20947 - 11904: 0xFAA6, + 20948 - 11904: 0xD861, + 20951 - 11904: 0xDCC5, + 20952 - 11904: 0xE140, + 20955 - 11904: 0x89DF, + 20956 - 11904: 0xBBFE, + 20957 - 11904: 0xBEAE, + 20958 - 11904: 0xE8F9, + 20959 - 11904: 0xFDDB, + 20960 - 11904: 0xA44C, + 20961 - 11904: 0xA45A, + 20962 - 11904: 0xFAA9, + 20964 - 11904: 0x8954, + 20973 - 11904: 0xFAAB, + 20976 - 11904: 0xB0C4, + 20977 - 11904: 0xB3CD, + 20979 - 11904: 0xB9B9, + 20980 - 11904: 0xFC7A, + 20981 - 11904: 0xC942, + 20982 - 11904: 0xA4BF, + 20984 - 11904: 0xA559, + 20985 - 11904: 0xA557, + 20986 - 11904: 0xA558, + 20988 - 11904: 0x89E0, + 20989 - 11904: 0xA8E7, + 20990 - 11904: 0x9F4F, + 20992 - 11904: 0xA44D, + 20993 - 11904: 0xA44E, + 20994 - 11904: 0xC87D, + 20995 - 11904: 0xA462, + 20997 - 11904: 0x89E1, + 20998 - 11904: 0xA4C0, + 20999 - 11904: 0xA4C1, + 21000 - 11904: 0xA4C2, + 21001 - 11904: 0xC9BE, + 21002 - 11904: 0xA55A, + 21003 - 11904: 0xFAB0, + 21004 - 11904: 0xC96B, + 21006 - 11904: 0xA646, + 21008 - 11904: 0xC9BF, + 21009 - 11904: 0xA644, + 21010 - 11904: 0xA645, + 21011 - 11904: 0xC9BD, + 21014 - 11904: 0xA647, + 21015 - 11904: 0xA643, + 21020 - 11904: 0xCA6C, + 21021 - 11904: 0xAAEC, + 21022 - 11904: 0xCA6D, + 21023 - 11904: 0x9FCD, + 21024 - 11904: 0xA0E7, + 21025 - 11904: 0xCA6E, + 21028 - 11904: 0xA750, + 21029 - 11904: 0xA74F, + 21030 - 11904: 0xFAB1, + 21031 - 11904: 0x89A6, + 21032 - 11904: 0xA753, + 21033 - 11904: 0xA751, + 21034 - 11904: 0xA752, + 21038 - 11904: 0xA8ED, + 21040 - 11904: 0xA8EC, + 21041 - 11904: 0xCBD4, + 21042 - 11904: 0xCBD1, + 21043 - 11904: 0xCBD2, + 21044 - 11904: 0x9EFA, + 21045 - 11904: 0xCBD0, + 21046 - 11904: 0xA8EE, + 21047 - 11904: 0xA8EA, + 21048 - 11904: 0xA8E9, + 21050 - 11904: 0xA8EB, + 21051 - 11904: 0xA8E8, + 21052 - 11904: 0xFAB2, + 21057 - 11904: 0xA8EF, + 21059 - 11904: 0xAB63, + 21060 - 11904: 0xCDF0, + 21062 - 11904: 0xCBD3, + 21063 - 11904: 0xAB68, + 21065 - 11904: 0xCDF1, + 21066 - 11904: 0xAB64, + 21067 - 11904: 0xAB67, + 21068 - 11904: 0xAB66, + 21069 - 11904: 0xAB65, + 21070 - 11904: 0xAB62, + 21071 - 11904: 0x87BC, + 21074 - 11904: 0xD0E8, + 21076 - 11904: 0xADE7, + 21077 - 11904: 0xD0EB, + 21078 - 11904: 0xADE5, + 21079 - 11904: 0xFAB4, + 21081 - 11904: 0x92C4, + 21082 - 11904: 0xD0E7, + 21083 - 11904: 0xADE8, + 21084 - 11904: 0xADE6, + 21085 - 11904: 0xADE9, + 21086 - 11904: 0xD0E9, + 21087 - 11904: 0xD0EA, + 21088 - 11904: 0x9F6F, + 21089 - 11904: 0xD0E6, + 21090 - 11904: 0xD0EC, + 21096 - 11904: 0x8BB0, + 21097 - 11904: 0xB3D1, + 21098 - 11904: 0xB0C5, + 21099 - 11904: 0xD469, + 21100 - 11904: 0xD46B, + 21101 - 11904: 0xD46A, + 21102 - 11904: 0xD46C, + 21103 - 11904: 0xB0C6, + 21106 - 11904: 0xB3CE, + 21107 - 11904: 0x9FAC, + 21108 - 11904: 0xB3CF, + 21109 - 11904: 0xB3D0, + 21111 - 11904: 0xB6D0, + 21112 - 11904: 0xDCC7, + 21113 - 11904: 0x89E3, + 21114 - 11904: 0xDCC6, + 21115 - 11904: 0xDCC8, + 21116 - 11904: 0xDCC9, + 21117 - 11904: 0xB6D1, + 21119 - 11904: 0xB6CF, + 21120 - 11904: 0xE141, + 21121 - 11904: 0xE142, + 21122 - 11904: 0xB9BB, + 21123 - 11904: 0xB9BA, + 21124 - 11904: 0xE35A, + 21127 - 11904: 0xBC40, + 21128 - 11904: 0xBC41, + 21129 - 11904: 0xBC42, + 21130 - 11904: 0xBC44, + 21131 - 11904: 0xE4F2, + 21132 - 11904: 0xE4F3, + 21133 - 11904: 0xBC43, + 21135 - 11904: 0x9BD3, + 21136 - 11904: 0x89E4, + 21137 - 11904: 0xBEAF, + 21139 - 11904: 0xBEB0, + 21140 - 11904: 0xFAB5, + 21142 - 11904: 0xF1ED, + 21143 - 11904: 0xF5C3, + 21144 - 11904: 0xF5C2, + 21145 - 11904: 0xF7D1, + 21146 - 11904: 0x9FD5, + 21147 - 11904: 0xA44F, + 21151 - 11904: 0xA55C, + 21152 - 11904: 0xA55B, + 21153 - 11904: 0x8955, + 21155 - 11904: 0xA648, + 21156 - 11904: 0x92C5, + 21158 - 11904: 0xC9C0, + 21160 - 11904: 0x8956, + 21161 - 11904: 0xA755, + 21162 - 11904: 0xA756, + 21163 - 11904: 0xA754, + 21164 - 11904: 0xA757, + 21165 - 11904: 0xCA6F, + 21166 - 11904: 0xCA70, + 21173 - 11904: 0xFAB3, + 21177 - 11904: 0xFAB6, + 21179 - 11904: 0xA8F1, + 21180 - 11904: 0xCBD5, + 21182 - 11904: 0xA8F0, + 21184 - 11904: 0xCDF2, + 21185 - 11904: 0xAB6C, + 21186 - 11904: 0xCDF3, + 21187 - 11904: 0xAB6B, + 21189 - 11904: 0xFAB7, + 21191 - 11904: 0xAB69, + 21193 - 11904: 0xAB6A, + 21196 - 11904: 0x9EDC, + 21197 - 11904: 0xD0ED, + 21200 - 11904: 0xFBC4, + 21201 - 11904: 0x9F71, + 21202 - 11904: 0xB0C7, + 21203 - 11904: 0xD46E, + 21205 - 11904: 0xB0CA, + 21206 - 11904: 0xD46D, + 21207 - 11904: 0xB1E5, + 21208 - 11904: 0xB0C9, + 21209 - 11904: 0xB0C8, + 21211 - 11904: 0xB3D4, + 21213 - 11904: 0xB3D3, + 21214 - 11904: 0xB3D2, + 21215 - 11904: 0xB6D2, + 21216 - 11904: 0xFABA, + 21217 - 11904: 0x92C7, + 21218 - 11904: 0xB6D5, + 21219 - 11904: 0xB6D6, + 21220 - 11904: 0xB6D4, + 21222 - 11904: 0xB6D3, + 21225 - 11904: 0xE143, + 21227 - 11904: 0xE144, + 21231 - 11904: 0xE4F5, + 21232 - 11904: 0xBC45, + 21233 - 11904: 0xE4F4, + 21235 - 11904: 0xBEB1, + 21236 - 11904: 0xECBF, + 21237 - 11904: 0xC079, + 21239 - 11904: 0xF1EE, + 21240 - 11904: 0xC455, + 21241 - 11904: 0xC6C6, + 21242 - 11904: 0xA463, + 21243 - 11904: 0xA4C3, + 21244 - 11904: 0xC956, + 21246 - 11904: 0xA4C4, + 21247 - 11904: 0xA4C5, + 21249 - 11904: 0x9A4C, + 21253 - 11904: 0xFABD, + 21254 - 11904: 0xA55E, + 21256 - 11904: 0xA649, + 21257 - 11904: 0xCA71, + 21258 - 11904: 0xCBD6, + 21259 - 11904: 0xCBD7, + 21261 - 11904: 0xAB6D, + 21262 - 11904: 0xD0EE, + 21263 - 11904: 0xB0CC, + 21264 - 11904: 0xB0CB, + 21265 - 11904: 0xD863, + 21266 - 11904: 0xD862, + 21269 - 11904: 0xA450, + 21270 - 11904: 0xA4C6, + 21271 - 11904: 0xA55F, + 21273 - 11904: 0xB0CD, + 21274 - 11904: 0xC943, + 21276 - 11904: 0xC96C, + 21277 - 11904: 0xA560, + 21279 - 11904: 0xC9C2, + 21280 - 11904: 0xA64B, + 21281 - 11904: 0xA64A, + 21282 - 11904: 0xC9C1, + 21283 - 11904: 0xA758, + 21284 - 11904: 0x8C68, + 21287 - 11904: 0x89E5, + 21290 - 11904: 0xADEA, + 21292 - 11904: 0x9F7D, + 21293 - 11904: 0xD46F, + 21295 - 11904: 0xB6D7, + 21296 - 11904: 0xE145, + 21297 - 11904: 0xB9BC, + 21298 - 11904: 0xA0A9, + 21299 - 11904: 0xFAC4, + 21300 - 11904: 0xE8FA, + 21303 - 11904: 0xF3FD, + 21304 - 11904: 0xC6C7, + 21305 - 11904: 0xA4C7, + 21307 - 11904: 0x8957, + 21308 - 11904: 0xCBD8, + 21309 - 11904: 0xCDF4, + 21310 - 11904: 0xB0D0, + 21311 - 11904: 0xB0CE, + 21312 - 11904: 0xB0CF, + 21313 - 11904: 0xA451, + 21314 - 11904: 0xFAAA, + 21315 - 11904: 0xA464, + 21316 - 11904: 0xFAC5, + 21317 - 11904: 0xA4CA, + 21319 - 11904: 0xA4C9, + 21320 - 11904: 0xA4C8, + 21321 - 11904: 0xA563, + 21322 - 11904: 0xA562, + 21324 - 11904: 0xC96D, + 21325 - 11904: 0xC9C3, + 21326 - 11904: 0x8958, + 21329 - 11904: 0xA8F5, + 21330 - 11904: 0xA8F2, + 21331 - 11904: 0xA8F4, + 21332 - 11904: 0xA8F3, + 21335 - 11904: 0xAB6E, + 21338 - 11904: 0xB3D5, + 21340 - 11904: 0xA452, + 21341 - 11904: 0x8BE3, + 21342 - 11904: 0xA4CB, + 21343 - 11904: 0x8B61, + 21344 - 11904: 0xA565, + 21345 - 11904: 0xA564, + 21347 - 11904: 0xCA72, + 21348 - 11904: 0x9AF1, + 21350 - 11904: 0xA8F6, + 21351 - 11904: 0x9EB7, + 21353 - 11904: 0xC6C8, + 21356 - 11904: 0xC957, + 21357 - 11904: 0xFAD1, + 21358 - 11904: 0xA567, + 21359 - 11904: 0xA566, + 21360 - 11904: 0xA64C, + 21361 - 11904: 0xA64D, + 21362 - 11904: 0xCA73, + 21363 - 11904: 0xA759, + 21364 - 11904: 0xFAD2, + 21365 - 11904: 0xA75A, + 21367 - 11904: 0xA8F7, + 21368 - 11904: 0xA8F8, + 21369 - 11904: 0xA8F9, + 21371 - 11904: 0xAB6F, + 21372 - 11904: 0xCDF5, + 21373 - 11904: 0x9EBA, + 21374 - 11904: 0xFAD4, + 21375 - 11904: 0xFAD5, + 21378 - 11904: 0xC944, + 21380 - 11904: 0xA4CC, + 21386 - 11904: 0xC9C4, + 21390 - 11904: 0xCA74, + 21391 - 11904: 0xCA75, + 21394 - 11904: 0xCBD9, + 21395 - 11904: 0xFAD9, + 21396 - 11904: 0xCBDA, + 21398 - 11904: 0xCDF7, + 21399 - 11904: 0xCDF6, + 21400 - 11904: 0xCDF9, + 21401 - 11904: 0xCDF8, + 21402 - 11904: 0xAB70, + 21404 - 11904: 0xD470, + 21405 - 11904: 0xADED, + 21406 - 11904: 0xD0EF, + 21407 - 11904: 0xADEC, + 21408 - 11904: 0xFADB, + 21410 - 11904: 0x9CE0, + 21412 - 11904: 0xD864, + 21413 - 11904: 0xB3D6, + 21414 - 11904: 0xFBF7, + 21415 - 11904: 0xD865, + 21416 - 11904: 0xFBFA, + 21417 - 11904: 0x89E7, + 21418 - 11904: 0xA07A, + 21419 - 11904: 0xFADC, + 21420 - 11904: 0xE146, + 21421 - 11904: 0xB9BD, + 21422 - 11904: 0xFADD, + 21424 - 11904: 0x89E9, + 21426 - 11904: 0xBC46, + 21428 - 11904: 0xF1EF, + 21430 - 11904: 0xC6C9, + 21433 - 11904: 0xC958, + 21435 - 11904: 0xA568, + 21441 - 11904: 0xFAE2, + 21442 - 11904: 0x89EB, + 21443 - 11904: 0xB0D1, + 21445 - 11904: 0xFAE3, + 21448 - 11904: 0xA453, + 21449 - 11904: 0xA465, + 21450 - 11904: 0xA4CE, + 21451 - 11904: 0xA4CD, + 21452 - 11904: 0x90C8, + 21453 - 11904: 0xA4CF, + 21456 - 11904: 0x92DA, + 21457 - 11904: 0x8959, + 21458 - 11904: 0x9CF5, + 21460 - 11904: 0xA8FB, + 21462 - 11904: 0xA8FA, + 21463 - 11904: 0xA8FC, + 21464 - 11904: 0x895A, + 21465 - 11904: 0xFAE7, + 21466 - 11904: 0x9FA2, + 21467 - 11904: 0xAB71, + 21471 - 11904: 0xADEE, + 21472 - 11904: 0xFAEA, + 21473 - 11904: 0xE8FB, + 21474 - 11904: 0xC24F, + 21475 - 11904: 0xA466, + 21476 - 11904: 0xA56A, + 21477 - 11904: 0xA579, + 21478 - 11904: 0xA574, + 21480 - 11904: 0xA56F, + 21481 - 11904: 0xA56E, + 21482 - 11904: 0xA575, + 21483 - 11904: 0xA573, + 21484 - 11904: 0xA56C, + 21485 - 11904: 0xA57A, + 21486 - 11904: 0xA56D, + 21487 - 11904: 0xA569, + 21488 - 11904: 0xA578, + 21489 - 11904: 0xA577, + 21490 - 11904: 0xA576, + 21491 - 11904: 0xA56B, + 21493 - 11904: 0xA572, + 21494 - 11904: 0xFAED, + 21495 - 11904: 0x8FAD, + 21496 - 11904: 0xA571, + 21499 - 11904: 0xA57B, + 21500 - 11904: 0xA570, + 21502 - 11904: 0xFB59, + 21505 - 11904: 0xA653, + 21507 - 11904: 0xA659, + 21508 - 11904: 0xA655, + 21510 - 11904: 0xA65B, + 21511 - 11904: 0xC9C5, + 21512 - 11904: 0xA658, + 21513 - 11904: 0xA64E, + 21514 - 11904: 0xA651, + 21515 - 11904: 0xA654, + 21516 - 11904: 0xA650, + 21517 - 11904: 0xA657, + 21518 - 11904: 0xA65A, + 21519 - 11904: 0xA64F, + 21520 - 11904: 0xA652, + 21521 - 11904: 0xA656, + 21522 - 11904: 0xA65C, + 21523 - 11904: 0xFAEF, + 21524 - 11904: 0x96EF, + 21526 - 11904: 0x9DEC, + 21528 - 11904: 0xCA7E, + 21529 - 11904: 0xCA7B, + 21530 - 11904: 0x9DCA, + 21531 - 11904: 0xA767, + 21532 - 11904: 0xCA7C, + 21533 - 11904: 0xA75B, + 21534 - 11904: 0xA75D, + 21535 - 11904: 0xA775, + 21536 - 11904: 0xA770, + 21537 - 11904: 0xFD6D, + 21539 - 11904: 0x89EC, + 21540 - 11904: 0xCAA5, + 21541 - 11904: 0xCA7D, + 21542 - 11904: 0xA75F, + 21543 - 11904: 0xA761, + 21544 - 11904: 0xCAA4, + 21545 - 11904: 0xA768, + 21546 - 11904: 0xCA78, + 21547 - 11904: 0xA774, + 21548 - 11904: 0xA776, + 21549 - 11904: 0xA75C, + 21550 - 11904: 0xA76D, + 21551 - 11904: 0xFB44, + 21552 - 11904: 0xCA76, + 21553 - 11904: 0xA773, + 21554 - 11904: 0x9DE2, + 21555 - 11904: 0xA764, + 21556 - 11904: 0x8C75, + 21557 - 11904: 0xA76E, + 21558 - 11904: 0xA76F, + 21559 - 11904: 0xCA77, + 21560 - 11904: 0xA76C, + 21561 - 11904: 0xA76A, + 21563 - 11904: 0xA76B, + 21564 - 11904: 0xA771, + 21565 - 11904: 0xCAA1, + 21566 - 11904: 0xA75E, + 21568 - 11904: 0xA772, + 21569 - 11904: 0xCAA3, + 21570 - 11904: 0xA766, + 21571 - 11904: 0xA763, + 21573 - 11904: 0xCA7A, + 21574 - 11904: 0xA762, + 21575 - 11904: 0xCAA6, + 21576 - 11904: 0xA765, + 21578 - 11904: 0xA769, + 21579 - 11904: 0x9EC0, + 21580 - 11904: 0x87C5, + 21581 - 11904: 0x9E56, + 21582 - 11904: 0xA760, + 21583 - 11904: 0xCAA2, + 21588 - 11904: 0xCA79, + 21600 - 11904: 0xCBEB, + 21601 - 11904: 0xCBEA, + 21602 - 11904: 0xA94F, + 21603 - 11904: 0xCBED, + 21604 - 11904: 0xCBEF, + 21605 - 11904: 0xCBE4, + 21606 - 11904: 0xCBE7, + 21607 - 11904: 0xCBEE, + 21608 - 11904: 0xA950, + 21609 - 11904: 0x9F79, + 21610 - 11904: 0x9AC7, + 21611 - 11904: 0xCBE1, + 21612 - 11904: 0xCBE5, + 21613 - 11904: 0xFAF4, + 21615 - 11904: 0xCBE9, + 21616 - 11904: 0xCE49, + 21617 - 11904: 0xA94B, + 21618 - 11904: 0xCE4D, + 21619 - 11904: 0xA8FD, + 21620 - 11904: 0xCBE6, + 21621 - 11904: 0xA8FE, + 21622 - 11904: 0xA94C, + 21623 - 11904: 0xA945, + 21624 - 11904: 0xA941, + 21626 - 11904: 0xCBE2, + 21627 - 11904: 0xA944, + 21628 - 11904: 0xA949, + 21629 - 11904: 0xA952, + 21630 - 11904: 0xCBE3, + 21631 - 11904: 0xCBDC, + 21632 - 11904: 0xA943, + 21633 - 11904: 0xCBDD, + 21634 - 11904: 0xCBDF, + 21636 - 11904: 0xA946, + 21637 - 11904: 0x98A1, + 21638 - 11904: 0xA948, + 21639 - 11904: 0xCBDB, + 21640 - 11904: 0xCBE0, + 21643 - 11904: 0xA951, + 21644 - 11904: 0xA94D, + 21645 - 11904: 0xCBE8, + 21646 - 11904: 0xA953, + 21647 - 11904: 0xFAF8, + 21648 - 11904: 0xA94A, + 21649 - 11904: 0xCBDE, + 21650 - 11904: 0xA947, + 21651 - 11904: 0x89F0, + 21652 - 11904: 0x9E47, + 21653 - 11904: 0xA942, + 21654 - 11904: 0xA940, + 21655 - 11904: 0x9DF7, + 21656 - 11904: 0xCBEC, + 21658 - 11904: 0xA94E, + 21660 - 11904: 0x9FD3, + 21662 - 11904: 0x9ACA, + 21664 - 11904: 0xCE48, + 21665 - 11904: 0xCDFB, + 21666 - 11904: 0xCE4B, + 21667 - 11904: 0x89F1, + 21668 - 11904: 0xFAF9, + 21669 - 11904: 0xCDFD, + 21670 - 11904: 0xAB78, + 21671 - 11904: 0xABA8, + 21672 - 11904: 0xAB74, + 21673 - 11904: 0xABA7, + 21674 - 11904: 0xAB7D, + 21675 - 11904: 0xABA4, + 21676 - 11904: 0xAB72, + 21677 - 11904: 0xCDFC, + 21678 - 11904: 0xCE43, + 21679 - 11904: 0xABA3, + 21680 - 11904: 0xCE4F, + 21681 - 11904: 0xABA5, + 21682 - 11904: 0x8E5A, + 21683 - 11904: 0xAB79, + 21684 - 11904: 0x89F2, + 21686 - 11904: 0xCE45, + 21687 - 11904: 0xCE42, + 21688 - 11904: 0xAB77, + 21689 - 11904: 0x89F3, + 21690 - 11904: 0xCDFA, + 21691 - 11904: 0xABA6, + 21692 - 11904: 0xCE4A, + 21693 - 11904: 0xAB7C, + 21694 - 11904: 0xCE4C, + 21695 - 11904: 0xABA9, + 21696 - 11904: 0xAB73, + 21697 - 11904: 0xAB7E, + 21698 - 11904: 0xAB7B, + 21699 - 11904: 0xCE40, + 21700 - 11904: 0xABA1, + 21701 - 11904: 0xCE46, + 21702 - 11904: 0xCE47, + 21703 - 11904: 0xAB7A, + 21704 - 11904: 0xABA2, + 21705 - 11904: 0xAB76, + 21707 - 11904: 0x925D, + 21708 - 11904: 0x8B51, + 21709 - 11904: 0x92E0, + 21710 - 11904: 0xAB75, + 21711 - 11904: 0xCDFE, + 21712 - 11904: 0x89F4, + 21718 - 11904: 0xCE44, + 21722 - 11904: 0x9FD4, + 21726 - 11904: 0xCE4E, + 21728 - 11904: 0xD144, + 21729 - 11904: 0xADFB, + 21730 - 11904: 0xD0F1, + 21731 - 11904: 0x8A79, + 21732 - 11904: 0xD0F6, + 21733 - 11904: 0xADF4, + 21734 - 11904: 0xAE40, + 21735 - 11904: 0xD0F4, + 21736 - 11904: 0xADEF, + 21737 - 11904: 0xADF9, + 21738 - 11904: 0xADFE, + 21739 - 11904: 0xD0FB, + 21741 - 11904: 0xADFA, + 21742 - 11904: 0xADFD, + 21743 - 11904: 0x89F5, + 21745 - 11904: 0xD0FE, + 21746 - 11904: 0xADF5, + 21747 - 11904: 0xD0F5, + 21751 - 11904: 0xD142, + 21752 - 11904: 0xD143, + 21754 - 11904: 0xADF7, + 21755 - 11904: 0xD141, + 21756 - 11904: 0xADF3, + 21757 - 11904: 0xAE43, + 21759 - 11904: 0xD0F8, + 21761 - 11904: 0xADF1, + 21762 - 11904: 0x97A7, + 21763 - 11904: 0xD146, + 21764 - 11904: 0xD0F9, + 21765 - 11904: 0xD0FD, + 21766 - 11904: 0xADF6, + 21767 - 11904: 0xAE42, + 21768 - 11904: 0xD0FA, + 21769 - 11904: 0xADFC, + 21770 - 11904: 0xD140, + 21771 - 11904: 0xD147, + 21772 - 11904: 0xD4A1, + 21773 - 11904: 0x93BA, + 21774 - 11904: 0xD145, + 21775 - 11904: 0xAE44, + 21776 - 11904: 0xADF0, + 21777 - 11904: 0xD0FC, + 21778 - 11904: 0xD0F3, + 21779 - 11904: 0x9E58, + 21780 - 11904: 0xADF8, + 21783 - 11904: 0xD0F2, + 21784 - 11904: 0x89F6, + 21786 - 11904: 0xD0F7, + 21790 - 11904: 0x9E57, + 21795 - 11904: 0x89F7, + 21797 - 11904: 0x8A41, + 21798 - 11904: 0xD0F0, + 21799 - 11904: 0xAE41, + 21800 - 11904: 0x89F8, + 21802 - 11904: 0xD477, + 21803 - 11904: 0xFAF1, + 21804 - 11904: 0xB0E4, + 21805 - 11904: 0xD4A7, + 21806 - 11904: 0xB0E2, + 21807 - 11904: 0xB0DF, + 21808 - 11904: 0xD47C, + 21809 - 11904: 0xB0DB, + 21810 - 11904: 0xD4A2, + 21811 - 11904: 0xB0E6, + 21812 - 11904: 0xD476, + 21813 - 11904: 0xD47B, + 21814 - 11904: 0xD47A, + 21815 - 11904: 0xADF2, + 21816 - 11904: 0xB0E1, + 21817 - 11904: 0xD4A5, + 21819 - 11904: 0xD4A8, + 21820 - 11904: 0xD473, + 21822 - 11904: 0xB3E8, + 21823 - 11904: 0x89FA, + 21824 - 11904: 0xD4A9, + 21825 - 11904: 0xB0E7, + 21827 - 11904: 0xB0D9, + 21828 - 11904: 0xB0D6, + 21829 - 11904: 0xD47E, + 21830 - 11904: 0xB0D3, + 21831 - 11904: 0xFB42, + 21832 - 11904: 0xD4A6, + 21833 - 11904: 0xFABF, + 21834 - 11904: 0xB0DA, + 21835 - 11904: 0xD4AA, + 21837 - 11904: 0xD474, + 21838 - 11904: 0xD4A4, + 21839 - 11904: 0xB0DD, + 21840 - 11904: 0xD475, + 21841 - 11904: 0xD478, + 21842 - 11904: 0xD47D, + 21843 - 11904: 0xFBA3, + 21845 - 11904: 0xB0DE, + 21846 - 11904: 0xB0DC, + 21847 - 11904: 0xB0E8, + 21852 - 11904: 0xB0E3, + 21853 - 11904: 0xFAF7, + 21854 - 11904: 0xB0D7, + 21855 - 11904: 0xB1D2, + 21857 - 11904: 0xB0D8, + 21858 - 11904: 0xD479, + 21859 - 11904: 0xB0E5, + 21860 - 11904: 0xB0E0, + 21861 - 11904: 0xD4A3, + 21862 - 11904: 0xB0D5, + 21865 - 11904: 0x9E4E, + 21866 - 11904: 0xB0D4, + 21867 - 11904: 0x94DC, + 21873 - 11904: 0x95DA, + 21874 - 11904: 0x9DF8, + 21875 - 11904: 0x9F6A, + 21877 - 11904: 0xD471, + 21878 - 11904: 0xD472, + 21879 - 11904: 0xD86A, + 21881 - 11904: 0x8AB7, + 21883 - 11904: 0xB3D7, + 21884 - 11904: 0xB3DA, + 21885 - 11904: 0xD875, + 21886 - 11904: 0xB3EE, + 21887 - 11904: 0xD878, + 21888 - 11904: 0xB3D8, + 21889 - 11904: 0xD871, + 21890 - 11904: 0xB3DE, + 21891 - 11904: 0xB3E4, + 21892 - 11904: 0xB5BD, + 21894 - 11904: 0xFB46, + 21895 - 11904: 0xB3E2, + 21896 - 11904: 0xD86E, + 21897 - 11904: 0xB3EF, + 21898 - 11904: 0xB3DB, + 21899 - 11904: 0xB3E3, + 21900 - 11904: 0xD876, + 21901 - 11904: 0xDCD7, + 21902 - 11904: 0xD87B, + 21903 - 11904: 0xD86F, + 21904 - 11904: 0x8A46, + 21905 - 11904: 0xD866, + 21906 - 11904: 0xD873, + 21907 - 11904: 0xD86D, + 21908 - 11904: 0xB3E1, + 21909 - 11904: 0xD879, + 21912 - 11904: 0xB3DD, + 21913 - 11904: 0xB3F1, + 21914 - 11904: 0xB3EA, + 21916 - 11904: 0xB3DF, + 21917 - 11904: 0xB3DC, + 21919 - 11904: 0xB3E7, + 21921 - 11904: 0xD87A, + 21922 - 11904: 0xD86C, + 21923 - 11904: 0xD872, + 21924 - 11904: 0xD874, + 21925 - 11904: 0xD868, + 21926 - 11904: 0xD877, + 21927 - 11904: 0xB3D9, + 21928 - 11904: 0xD867, + 21929 - 11904: 0xFB47, + 21930 - 11904: 0xB3E0, + 21931 - 11904: 0xB3F0, + 21932 - 11904: 0xB3EC, + 21933 - 11904: 0xD869, + 21934 - 11904: 0xB3E6, + 21936 - 11904: 0x9148, + 21937 - 11904: 0xB3ED, + 21938 - 11904: 0xB3E9, + 21939 - 11904: 0xB3E5, + 21940 - 11904: 0x92DE, + 21941 - 11904: 0xD870, + 21945 - 11904: 0x8B53, + 21946 - 11904: 0x9DF6, + 21947 - 11904: 0xB3EB, + 21948 - 11904: 0x9BDA, + 21951 - 11904: 0xDCD5, + 21952 - 11904: 0xDCD1, + 21953 - 11904: 0x9D7E, + 21954 - 11904: 0xDCE0, + 21955 - 11904: 0xDCCA, + 21956 - 11904: 0xDCD3, + 21957 - 11904: 0xB6E5, + 21958 - 11904: 0xB6E6, + 21959 - 11904: 0xB6DE, + 21960 - 11904: 0xDCDC, + 21961 - 11904: 0xB6E8, + 21962 - 11904: 0xDCCF, + 21963 - 11904: 0xDCCE, + 21964 - 11904: 0xDCCC, + 21965 - 11904: 0xDCDE, + 21966 - 11904: 0xB6DC, + 21967 - 11904: 0xDCD8, + 21968 - 11904: 0xDCCD, + 21969 - 11904: 0xB6DF, + 21970 - 11904: 0xDCD6, + 21971 - 11904: 0xB6DA, + 21972 - 11904: 0xDCD2, + 21973 - 11904: 0xDCD9, + 21974 - 11904: 0xDCDB, + 21975 - 11904: 0x89FD, + 21976 - 11904: 0x99E4, + 21977 - 11904: 0xDCDF, + 21978 - 11904: 0xB6E3, + 21979 - 11904: 0xDCCB, + 21980 - 11904: 0xB6DD, + 21981 - 11904: 0xDCD0, + 21982 - 11904: 0x9E43, + 21983 - 11904: 0xB6D8, + 21985 - 11904: 0xB6E4, + 21986 - 11904: 0xDCDA, + 21987 - 11904: 0xB6E0, + 21988 - 11904: 0xB6E1, + 21989 - 11904: 0xB6E7, + 21990 - 11904: 0xB6DB, + 21991 - 11904: 0xA25F, + 21992 - 11904: 0xB6D9, + 21993 - 11904: 0xDCD4, + 21994 - 11904: 0x9DE9, + 21996 - 11904: 0x8F52, + 21999 - 11904: 0xB6E2, + 22000 - 11904: 0x9DF5, + 22001 - 11904: 0x9DF0, + 22002 - 11904: 0xDCDD, + 22005 - 11904: 0x99E7, + 22006 - 11904: 0xB9CD, + 22007 - 11904: 0xB9C8, + 22009 - 11904: 0xE155, + 22010 - 11904: 0xE151, + 22011 - 11904: 0x8BBD, + 22012 - 11904: 0xE14B, + 22013 - 11904: 0xB9C2, + 22014 - 11904: 0xB9BE, + 22015 - 11904: 0xE154, + 22016 - 11904: 0xB9BF, + 22017 - 11904: 0xE14E, + 22018 - 11904: 0xE150, + 22020 - 11904: 0xE153, + 22021 - 11904: 0xFB48, + 22022 - 11904: 0xB9C4, + 22024 - 11904: 0xB9CB, + 22025 - 11904: 0xB9C5, + 22028 - 11904: 0xE149, + 22029 - 11904: 0xB9C6, + 22030 - 11904: 0xB9C7, + 22031 - 11904: 0xE14C, + 22032 - 11904: 0xB9CC, + 22033 - 11904: 0x9FB7, + 22034 - 11904: 0xE14A, + 22035 - 11904: 0xE14F, + 22036 - 11904: 0xB9C3, + 22037 - 11904: 0xE148, + 22038 - 11904: 0xB9C9, + 22039 - 11904: 0xB9C1, + 22043 - 11904: 0xB9C0, + 22044 - 11904: 0xE14D, + 22045 - 11904: 0xE152, + 22046 - 11904: 0x9DD0, + 22047 - 11904: 0xB9CA, + 22048 - 11904: 0x9FEB, + 22049 - 11904: 0x8DA9, + 22050 - 11904: 0x9DCF, + 22051 - 11904: 0x98E1, + 22053 - 11904: 0x9DE5, + 22055 - 11904: 0xE147, + 22057 - 11904: 0xBC4D, + 22058 - 11904: 0xE547, + 22060 - 11904: 0xE544, + 22061 - 11904: 0x9DC8, + 22062 - 11904: 0xBC47, + 22063 - 11904: 0xBC53, + 22064 - 11904: 0xBC54, + 22066 - 11904: 0xBC4A, + 22067 - 11904: 0xE542, + 22068 - 11904: 0xBC4C, + 22069 - 11904: 0xE4F9, + 22070 - 11904: 0xBC52, + 22071 - 11904: 0xFB4F, + 22072 - 11904: 0xE546, + 22073 - 11904: 0xBC49, + 22074 - 11904: 0xE548, + 22075 - 11904: 0xBC48, + 22077 - 11904: 0xE543, + 22078 - 11904: 0xE545, + 22079 - 11904: 0xBC4B, + 22080 - 11904: 0xE541, + 22081 - 11904: 0xE4FA, + 22082 - 11904: 0xE4F7, + 22083 - 11904: 0x9DEB, + 22085 - 11904: 0xD86B, + 22086 - 11904: 0xE4FD, + 22088 - 11904: 0xE4F6, + 22089 - 11904: 0xE4FC, + 22090 - 11904: 0xE4FB, + 22092 - 11904: 0xE4F8, + 22093 - 11904: 0xFB54, + 22094 - 11904: 0xBC4F, + 22095 - 11904: 0xFB55, + 22096 - 11904: 0x9AA2, + 22098 - 11904: 0x8AD6, + 22099 - 11904: 0xBC4E, + 22100 - 11904: 0x9A5F, + 22103 - 11904: 0xBC50, + 22104 - 11904: 0xE4FE, + 22105 - 11904: 0xBEB2, + 22106 - 11904: 0xE540, + 22109 - 11904: 0x9EF5, + 22110 - 11904: 0xE945, + 22112 - 11904: 0xE8FD, + 22113 - 11904: 0x8FB7, + 22114 - 11904: 0xBEBE, + 22115 - 11904: 0xE942, + 22116 - 11904: 0xBEB6, + 22117 - 11904: 0xBEBA, + 22118 - 11904: 0xE941, + 22120 - 11904: 0xBEB9, + 22121 - 11904: 0xBEB5, + 22122 - 11904: 0xBEB8, + 22123 - 11904: 0xBEB3, + 22124 - 11904: 0xBEBD, + 22125 - 11904: 0xE943, + 22126 - 11904: 0xE8FE, + 22127 - 11904: 0xBEBC, + 22128 - 11904: 0xE8FC, + 22129 - 11904: 0xBEBB, + 22130 - 11904: 0xE944, + 22131 - 11904: 0xE940, + 22132 - 11904: 0xBC51, + 22134 - 11904: 0xBEBF, + 22135 - 11904: 0xE946, + 22136 - 11904: 0xBEB7, + 22137 - 11904: 0xBEB4, + 22138 - 11904: 0x9AD2, + 22139 - 11904: 0x9E6A, + 22140 - 11904: 0x9EE8, + 22142 - 11904: 0xECC6, + 22143 - 11904: 0xECC8, + 22144 - 11904: 0xC07B, + 22145 - 11904: 0xECC9, + 22146 - 11904: 0xECC7, + 22147 - 11904: 0xECC5, + 22148 - 11904: 0xECC4, + 22149 - 11904: 0xC07D, + 22150 - 11904: 0xECC3, + 22151 - 11904: 0xC07E, + 22153 - 11904: 0x8BBF, + 22154 - 11904: 0x91C2, + 22155 - 11904: 0x9D62, + 22156 - 11904: 0xECC1, + 22157 - 11904: 0xECC2, + 22158 - 11904: 0xC07A, + 22159 - 11904: 0xC0A1, + 22160 - 11904: 0xC07C, + 22162 - 11904: 0x9260, + 22163 - 11904: 0xECC0, + 22165 - 11904: 0xC250, + 22167 - 11904: 0xEFBC, + 22168 - 11904: 0xEFBA, + 22169 - 11904: 0xEFBF, + 22170 - 11904: 0xEFBD, + 22172 - 11904: 0xEFBB, + 22173 - 11904: 0xEFBE, + 22174 - 11904: 0x925E, + 22175 - 11904: 0x91C1, + 22177 - 11904: 0x8AC5, + 22180 - 11904: 0x97A3, + 22181 - 11904: 0xC360, + 22182 - 11904: 0xF1F2, + 22183 - 11904: 0xF1F3, + 22184 - 11904: 0xC456, + 22186 - 11904: 0xF1F4, + 22187 - 11904: 0xF1F0, + 22188 - 11904: 0xF1F5, + 22189 - 11904: 0xF1F1, + 22190 - 11904: 0xC251, + 22191 - 11904: 0x8B6C, + 22193 - 11904: 0x8D7E, + 22194 - 11904: 0xF3FE, + 22195 - 11904: 0xF441, + 22196 - 11904: 0xC459, + 22197 - 11904: 0xF440, + 22198 - 11904: 0xC458, + 22199 - 11904: 0xC457, + 22201 - 11904: 0x9C54, + 22204 - 11904: 0xC45A, + 22205 - 11904: 0xF5C5, + 22206 - 11904: 0xF5C6, + 22207 - 11904: 0x9DBD, + 22208 - 11904: 0xC4DA, + 22209 - 11904: 0xC4D9, + 22210 - 11904: 0xC4DB, + 22211 - 11904: 0xF5C4, + 22213 - 11904: 0xF6D8, + 22214 - 11904: 0xF6D7, + 22216 - 11904: 0xC56D, + 22217 - 11904: 0xC56F, + 22218 - 11904: 0xC56E, + 22219 - 11904: 0xF6D9, + 22220 - 11904: 0xC5C8, + 22221 - 11904: 0xF8A6, + 22225 - 11904: 0xC5F1, + 22227 - 11904: 0xF8A5, + 22228 - 11904: 0xF8EE, + 22230 - 11904: 0x9CC5, + 22231 - 11904: 0xC949, + 22234 - 11904: 0xA57D, + 22235 - 11904: 0xA57C, + 22237 - 11904: 0xA65F, + 22238 - 11904: 0xA65E, + 22239 - 11904: 0xC9C7, + 22240 - 11904: 0xA65D, + 22241 - 11904: 0xC9C6, + 22242 - 11904: 0x895B, + 22244 - 11904: 0xA779, + 22245 - 11904: 0xCAA9, + 22247 - 11904: 0xCAA8, + 22250 - 11904: 0xA777, + 22251 - 11904: 0xA77A, + 22253 - 11904: 0xFB5C, + 22254 - 11904: 0xCAA7, + 22255 - 11904: 0xFB5B, + 22256 - 11904: 0xA778, + 22257 - 11904: 0xFB57, + 22263 - 11904: 0xCBF0, + 22265 - 11904: 0xCBF1, + 22266 - 11904: 0xA954, + 22267 - 11904: 0x8765, + 22269 - 11904: 0x98C7, + 22271 - 11904: 0xABAA, + 22272 - 11904: 0xFB5A, + 22273 - 11904: 0xD148, + 22274 - 11904: 0xD149, + 22275 - 11904: 0xAE45, + 22276 - 11904: 0xAE46, + 22279 - 11904: 0xD4AC, + 22280 - 11904: 0xB0E9, + 22281 - 11904: 0xB0EB, + 22282 - 11904: 0xD4AB, + 22283 - 11904: 0xB0EA, + 22284 - 11904: 0xD87C, + 22285 - 11904: 0xB3F2, + 22290 - 11904: 0xB6E9, + 22291 - 11904: 0xB6EA, + 22292 - 11904: 0xDCE1, + 22293 - 11904: 0x9CEE, + 22294 - 11904: 0xB9CF, + 22296 - 11904: 0xB9CE, + 22298 - 11904: 0xE549, + 22299 - 11904: 0xE948, + 22300 - 11904: 0xE947, + 22301 - 11904: 0x92E2, + 22302 - 11904: 0xF96B, + 22303 - 11904: 0xA467, + 22304 - 11904: 0xC959, + 22306 - 11904: 0xC96E, + 22307 - 11904: 0xC96F, + 22312 - 11904: 0xA662, + 22313 - 11904: 0xA666, + 22314 - 11904: 0xC9C9, + 22316 - 11904: 0xA664, + 22317 - 11904: 0xA663, + 22318 - 11904: 0xC9C8, + 22319 - 11904: 0xA665, + 22320 - 11904: 0xA661, + 22322 - 11904: 0x94A7, + 22323 - 11904: 0xA660, + 22324 - 11904: 0xC9CA, + 22331 - 11904: 0xA7A6, + 22333 - 11904: 0x8CCC, + 22334 - 11904: 0xA7A3, + 22335 - 11904: 0x9BD4, + 22336 - 11904: 0xA77D, + 22337 - 11904: 0xCAAA, + 22338 - 11904: 0xFB64, + 22339 - 11904: 0xFB76, + 22341 - 11904: 0xCAAB, + 22342 - 11904: 0xFB60, + 22343 - 11904: 0xA7A1, + 22345 - 11904: 0xCAAD, + 22346 - 11904: 0xA77B, + 22347 - 11904: 0xCAAE, + 22348 - 11904: 0xCAAC, + 22349 - 11904: 0xA77E, + 22350 - 11904: 0xA7A2, + 22351 - 11904: 0xA7A5, + 22352 - 11904: 0xA7A4, + 22353 - 11904: 0xA77C, + 22354 - 11904: 0xCAAF, + 22356 - 11904: 0x99E5, + 22359 - 11904: 0x9AC2, + 22363 - 11904: 0x91FB, + 22367 - 11904: 0xA073, + 22369 - 11904: 0xA959, + 22370 - 11904: 0xCBFE, + 22372 - 11904: 0xA95B, + 22374 - 11904: 0xA95A, + 22375 - 11904: 0x9F72, + 22376 - 11904: 0xCC40, + 22377 - 11904: 0xA958, + 22378 - 11904: 0xA957, + 22379 - 11904: 0xCBF5, + 22381 - 11904: 0xCBF4, + 22383 - 11904: 0xCBF2, + 22384 - 11904: 0xCBF7, + 22385 - 11904: 0xCBF6, + 22386 - 11904: 0xCBF3, + 22387 - 11904: 0xCBFC, + 22388 - 11904: 0xCBFD, + 22389 - 11904: 0xCBFA, + 22390 - 11904: 0xCBF8, + 22391 - 11904: 0xA956, + 22394 - 11904: 0x9FCC, + 22395 - 11904: 0xCBFB, + 22396 - 11904: 0xA95C, + 22397 - 11904: 0xCC41, + 22398 - 11904: 0x98A5, + 22399 - 11904: 0x92E8, + 22400 - 11904: 0xCBF9, + 22402 - 11904: 0xABAB, + 22403 - 11904: 0xA955, + 22408 - 11904: 0x9BBC, + 22410 - 11904: 0x96F3, + 22411 - 11904: 0xABAC, + 22412 - 11904: 0xCE54, + 22413 - 11904: 0x92E7, + 22415 - 11904: 0xCE5A, + 22416 - 11904: 0xFC67, + 22419 - 11904: 0xABB2, + 22420 - 11904: 0xCE58, + 22421 - 11904: 0xCE5E, + 22423 - 11904: 0xCE55, + 22424 - 11904: 0xCE59, + 22425 - 11904: 0xCE5B, + 22426 - 11904: 0xCE5D, + 22427 - 11904: 0xCE57, + 22428 - 11904: 0x8B7D, + 22429 - 11904: 0xCE56, + 22430 - 11904: 0xCE51, + 22431 - 11904: 0xCE52, + 22432 - 11904: 0xABAD, + 22433 - 11904: 0x9BF4, + 22434 - 11904: 0xABAF, + 22435 - 11904: 0xABAE, + 22436 - 11904: 0xCE53, + 22437 - 11904: 0xCE5C, + 22439 - 11904: 0x9EF7, + 22442 - 11904: 0x9EC1, + 22446 - 11904: 0xABB1, + 22451 - 11904: 0x87C3, + 22452 - 11904: 0x996F, + 22453 - 11904: 0xCE50, + 22454 - 11904: 0xD153, + 22456 - 11904: 0xD152, + 22457 - 11904: 0xD157, + 22458 - 11904: 0xD14E, + 22459 - 11904: 0x96F1, + 22460 - 11904: 0xD151, + 22461 - 11904: 0xD150, + 22462 - 11904: 0x8E41, + 22463 - 11904: 0xD154, + 22465 - 11904: 0xD158, + 22466 - 11904: 0xAE47, + 22467 - 11904: 0xAE4A, + 22468 - 11904: 0x954A, + 22470 - 11904: 0xD14F, + 22471 - 11904: 0xD155, + 22472 - 11904: 0x97E6, + 22475 - 11904: 0xAE49, + 22476 - 11904: 0xD14A, + 22478 - 11904: 0xABB0, + 22479 - 11904: 0xD4BA, + 22480 - 11904: 0xD156, + 22482 - 11904: 0xD14D, + 22484 - 11904: 0xAE48, + 22485 - 11904: 0xD14C, + 22487 - 11904: 0x96F5, + 22492 - 11904: 0xD4B1, + 22493 - 11904: 0x92E6, + 22494 - 11904: 0x9F42, + 22495 - 11904: 0xB0EC, + 22496 - 11904: 0xB0F0, + 22497 - 11904: 0xD4C1, + 22498 - 11904: 0xD4AF, + 22499 - 11904: 0xD4BD, + 22500 - 11904: 0xB0F1, + 22501 - 11904: 0xD4BF, + 22502 - 11904: 0xFB67, + 22503 - 11904: 0xD4C5, + 22505 - 11904: 0xD4C9, + 22508 - 11904: 0xD4C0, + 22509 - 11904: 0xD4B4, + 22510 - 11904: 0xD4BC, + 22511 - 11904: 0x99A9, + 22512 - 11904: 0xD4CA, + 22513 - 11904: 0xD4C8, + 22514 - 11904: 0xD4BE, + 22515 - 11904: 0xD4B9, + 22516 - 11904: 0xD4B2, + 22517 - 11904: 0xD8A6, + 22518 - 11904: 0xD4B0, + 22519 - 11904: 0xB0F5, + 22520 - 11904: 0xD4B7, + 22521 - 11904: 0xB0F6, + 22522 - 11904: 0xB0F2, + 22523 - 11904: 0xD4AD, + 22524 - 11904: 0xD4C3, + 22525 - 11904: 0xD4B5, + 22526 - 11904: 0xFAE6, + 22528 - 11904: 0xD4B3, + 22529 - 11904: 0xD4C6, + 22530 - 11904: 0xB0F3, + 22531 - 11904: 0xFB69, + 22532 - 11904: 0xD4CC, + 22533 - 11904: 0xB0ED, + 22534 - 11904: 0xB0EF, + 22535 - 11904: 0xD4BB, + 22536 - 11904: 0xD4B6, + 22537 - 11904: 0xAE4B, + 22538 - 11904: 0xB0EE, + 22539 - 11904: 0xD4B8, + 22540 - 11904: 0xD4C7, + 22541 - 11904: 0xD4CB, + 22542 - 11904: 0xD4C2, + 22544 - 11904: 0xD4C4, + 22546 - 11904: 0x97E5, + 22548 - 11904: 0xD4AE, + 22552 - 11904: 0x87C8, + 22553 - 11904: 0xD8A1, + 22555 - 11904: 0xD8AA, + 22556 - 11904: 0xD8A9, + 22557 - 11904: 0xB3FA, + 22558 - 11904: 0xD8A2, + 22560 - 11904: 0xB3FB, + 22561 - 11904: 0xB3F9, + 22562 - 11904: 0x967D, + 22563 - 11904: 0xD8A4, + 22564 - 11904: 0xB3F6, + 22565 - 11904: 0xD8A8, + 22566 - 11904: 0xFB6C, + 22567 - 11904: 0xD8A3, + 22568 - 11904: 0xD8A5, + 22569 - 11904: 0xD87D, + 22570 - 11904: 0xB3F4, + 22572 - 11904: 0xD8B2, + 22573 - 11904: 0xD8B1, + 22574 - 11904: 0xD8AE, + 22575 - 11904: 0xB3F3, + 22576 - 11904: 0xB3F7, + 22577 - 11904: 0xB3F8, + 22578 - 11904: 0xD14B, + 22579 - 11904: 0xD8AB, + 22580 - 11904: 0xB3F5, + 22581 - 11904: 0xB0F4, + 22582 - 11904: 0xD8AD, + 22583 - 11904: 0xD87E, + 22584 - 11904: 0xD8B0, + 22585 - 11904: 0xD8AF, + 22586 - 11904: 0x99A2, + 22587 - 11904: 0xD8B3, + 22589 - 11904: 0xDCEF, + 22591 - 11904: 0xD8AC, + 22592 - 11904: 0x9ABB, + 22596 - 11904: 0x9A65, + 22599 - 11904: 0x944E, + 22600 - 11904: 0xD8A7, + 22601 - 11904: 0xDCE7, + 22602 - 11904: 0xB6F4, + 22603 - 11904: 0xB6F7, + 22604 - 11904: 0xB6F2, + 22605 - 11904: 0xDCE6, + 22606 - 11904: 0xDCEA, + 22607 - 11904: 0xDCE5, + 22609 - 11904: 0xB6EC, + 22610 - 11904: 0xB6F6, + 22611 - 11904: 0xDCE2, + 22612 - 11904: 0xB6F0, + 22613 - 11904: 0xDCE9, + 22615 - 11904: 0xB6EE, + 22616 - 11904: 0xB6ED, + 22617 - 11904: 0xDCEC, + 22618 - 11904: 0xB6EF, + 22619 - 11904: 0xDCEE, + 22620 - 11904: 0xFB6E, + 22621 - 11904: 0xDCEB, + 22622 - 11904: 0xB6EB, + 22623 - 11904: 0x99DF, + 22626 - 11904: 0xB6F5, + 22627 - 11904: 0xDCF0, + 22628 - 11904: 0xDCE4, + 22629 - 11904: 0xDCED, + 22632 - 11904: 0xDCE3, + 22633 - 11904: 0x98E3, + 22635 - 11904: 0xB6F1, + 22636 - 11904: 0x9254, + 22637 - 11904: 0xB6F3, + 22639 - 11904: 0xDCE8, + 22641 - 11904: 0xDCF1, + 22642 - 11904: 0x967B, + 22643 - 11904: 0x8AAF, + 22644 - 11904: 0xE15D, + 22645 - 11904: 0xB9D0, + 22646 - 11904: 0xE163, + 22649 - 11904: 0xB9D5, + 22650 - 11904: 0xE15F, + 22651 - 11904: 0xE166, + 22652 - 11904: 0xE157, + 22653 - 11904: 0xB9D7, + 22654 - 11904: 0xB9D1, + 22655 - 11904: 0xE15C, + 22656 - 11904: 0xBC55, + 22657 - 11904: 0xE15B, + 22658 - 11904: 0xE164, + 22659 - 11904: 0xB9D2, + 22661 - 11904: 0xB9D6, + 22662 - 11904: 0xE15A, + 22663 - 11904: 0xE160, + 22664 - 11904: 0xE165, + 22665 - 11904: 0xE156, + 22666 - 11904: 0xB9D4, + 22667 - 11904: 0xE15E, + 22670 - 11904: 0xE162, + 22671 - 11904: 0xE168, + 22672 - 11904: 0xE158, + 22673 - 11904: 0xE161, + 22674 - 11904: 0x8C77, + 22675 - 11904: 0xB9D3, + 22676 - 11904: 0xE167, + 22678 - 11904: 0x87B0, + 22680 - 11904: 0xE159, + 22681 - 11904: 0x8BAF, + 22682 - 11904: 0x9EBD, + 22684 - 11904: 0xBC59, + 22685 - 11904: 0xE54B, + 22686 - 11904: 0xBC57, + 22687 - 11904: 0xBC56, + 22688 - 11904: 0xE54D, + 22689 - 11904: 0xE552, + 22691 - 11904: 0xE54E, + 22693 - 11904: 0xE551, + 22694 - 11904: 0xBC5C, + 22695 - 11904: 0x9EE6, + 22696 - 11904: 0xBEA5, + 22697 - 11904: 0xBC5B, + 22698 - 11904: 0xFB6F, + 22699 - 11904: 0xE54A, + 22700 - 11904: 0xE550, + 22702 - 11904: 0xBC5A, + 22703 - 11904: 0xE54F, + 22704 - 11904: 0x8EE1, + 22705 - 11904: 0xE54C, + 22707 - 11904: 0xBC58, + 22709 - 11904: 0x9B7D, + 22710 - 11904: 0x9C7E, + 22714 - 11904: 0xE94D, + 22715 - 11904: 0xF9D9, + 22716 - 11904: 0xE94F, + 22717 - 11904: 0xE94A, + 22718 - 11904: 0xBEC1, + 22719 - 11904: 0xE94C, + 22721 - 11904: 0xBEC0, + 22722 - 11904: 0xE94E, + 22725 - 11904: 0xBEC3, + 22726 - 11904: 0xE950, + 22727 - 11904: 0xBEC2, + 22728 - 11904: 0xE949, + 22729 - 11904: 0xE94B, + 22731 - 11904: 0x92EA, + 22734 - 11904: 0xC0A5, + 22735 - 11904: 0xECCC, + 22736 - 11904: 0x8C78, + 22737 - 11904: 0xC0A4, + 22738 - 11904: 0xECCD, + 22739 - 11904: 0xC0A3, + 22740 - 11904: 0xECCB, + 22741 - 11904: 0xC0A2, + 22742 - 11904: 0xECCA, + 22744 - 11904: 0xC253, + 22745 - 11904: 0xC252, + 22746 - 11904: 0xF1F6, + 22747 - 11904: 0xF1F8, + 22748 - 11904: 0xFB72, + 22749 - 11904: 0xF1F7, + 22750 - 11904: 0xC361, + 22751 - 11904: 0xC362, + 22752 - 11904: 0xFB71, + 22754 - 11904: 0xC363, + 22755 - 11904: 0xF442, + 22756 - 11904: 0xC45B, + 22759 - 11904: 0xF7D3, + 22760 - 11904: 0xF7D2, + 22761 - 11904: 0xC5F2, + 22763 - 11904: 0xA468, + 22764 - 11904: 0xA4D0, + 22767 - 11904: 0xA7A7, + 22768 - 11904: 0x895C, + 22770 - 11904: 0x98F0, + 22771 - 11904: 0x96F2, + 22772 - 11904: 0xCE5F, + 22777 - 11904: 0xB3FC, + 22778 - 11904: 0xB3FD, + 22779 - 11904: 0xFB74, + 22780 - 11904: 0xDCF2, + 22781 - 11904: 0xB9D8, + 22782 - 11904: 0xE169, + 22783 - 11904: 0xE553, + 22786 - 11904: 0x8BC1, + 22787 - 11904: 0xC95A, + 22788 - 11904: 0x895D, + 22789 - 11904: 0x89DE, + 22790 - 11904: 0xCAB0, + 22791 - 11904: 0x895E, + 22794 - 11904: 0xC6CA, + 22796 - 11904: 0xCC42, + 22797 - 11904: 0xCE60, + 22798 - 11904: 0xD159, + 22799 - 11904: 0xAE4C, + 22801 - 11904: 0xFE42, + 22802 - 11904: 0xF1F9, + 22804 - 11904: 0xC4DC, + 22805 - 11904: 0xA469, + 22806 - 11904: 0xA57E, + 22807 - 11904: 0xC970, + 22809 - 11904: 0xA667, + 22810 - 11904: 0xA668, + 22812 - 11904: 0xA95D, + 22813 - 11904: 0x8768, + 22815 - 11904: 0xFB7B, + 22816 - 11904: 0xB0F7, + 22818 - 11904: 0xB9DA, + 22820 - 11904: 0xB9DB, + 22821 - 11904: 0xB9D9, + 22823 - 11904: 0xA46A, + 22825 - 11904: 0xA4D1, + 22826 - 11904: 0xA4D3, + 22827 - 11904: 0xA4D2, + 22828 - 11904: 0xC95B, + 22829 - 11904: 0xA4D4, + 22830 - 11904: 0xA5A1, + 22831 - 11904: 0xC971, + 22833 - 11904: 0xA5A2, + 22834 - 11904: 0x895F, + 22836 - 11904: 0x8960, + 22839 - 11904: 0xA669, + 22840 - 11904: 0xA66A, + 22844 - 11904: 0xC9CB, + 22846 - 11904: 0xA7A8, + 22848 - 11904: 0xCAB1, + 22852 - 11904: 0xA961, + 22853 - 11904: 0xCC43, + 22855 - 11904: 0xA95F, + 22856 - 11904: 0xA960, + 22857 - 11904: 0xA95E, + 22858 - 11904: 0xD15A, + 22862 - 11904: 0xABB6, + 22863 - 11904: 0xABB5, + 22864 - 11904: 0xABB7, + 22865 - 11904: 0xABB4, + 22867 - 11904: 0xCE61, + 22868 - 11904: 0xA962, + 22869 - 11904: 0xABB3, + 22871 - 11904: 0xAE4D, + 22872 - 11904: 0xAE4E, + 22874 - 11904: 0xAE4F, + 22876 - 11904: 0xD4CD, + 22880 - 11904: 0xB3FE, + 22881 - 11904: 0xD8B4, + 22882 - 11904: 0xB0F8, + 22885 - 11904: 0x9BCD, + 22887 - 11904: 0xB6F8, + 22889 - 11904: 0xB9DD, + 22890 - 11904: 0xB9DC, + 22891 - 11904: 0xE16A, + 22893 - 11904: 0xBC5D, + 22894 - 11904: 0xBEC4, + 22896 - 11904: 0xEFC0, + 22897 - 11904: 0xF6DA, + 22898 - 11904: 0xF7D4, + 22899 - 11904: 0xA46B, + 22900 - 11904: 0xA5A3, + 22901 - 11904: 0x9DD3, + 22902 - 11904: 0xA5A4, + 22903 - 11904: 0xC9D1, + 22904 - 11904: 0xA66C, + 22905 - 11904: 0xA66F, + 22907 - 11904: 0xC9CF, + 22908 - 11904: 0xC9CD, + 22909 - 11904: 0xA66E, + 22910 - 11904: 0xC9D0, + 22911 - 11904: 0xC9D2, + 22912 - 11904: 0xC9CC, + 22913 - 11904: 0xA671, + 22914 - 11904: 0xA670, + 22915 - 11904: 0xA66D, + 22916 - 11904: 0xA66B, + 22917 - 11904: 0xC9CE, + 22921 - 11904: 0x984C, + 22922 - 11904: 0xA7B3, + 22925 - 11904: 0xA7B0, + 22926 - 11904: 0xCAB6, + 22927 - 11904: 0xCAB9, + 22928 - 11904: 0xCAB8, + 22930 - 11904: 0xA7AA, + 22931 - 11904: 0xA7B2, + 22932 - 11904: 0x9752, + 22934 - 11904: 0xA7AF, + 22935 - 11904: 0xCAB5, + 22936 - 11904: 0xCAB3, + 22937 - 11904: 0xA7AE, + 22938 - 11904: 0x95C3, + 22941 - 11904: 0xA7A9, + 22942 - 11904: 0xA7AC, + 22943 - 11904: 0x9BB6, + 22944 - 11904: 0xCAB4, + 22945 - 11904: 0xCABB, + 22946 - 11904: 0xCAB7, + 22947 - 11904: 0xA7AD, + 22948 - 11904: 0xA7B1, + 22949 - 11904: 0xA7B4, + 22950 - 11904: 0xCAB2, + 22951 - 11904: 0xCABA, + 22952 - 11904: 0xA7AB, + 22956 - 11904: 0x9AB9, + 22958 - 11904: 0xA967, + 22959 - 11904: 0xA96F, + 22960 - 11904: 0x97B3, + 22961 - 11904: 0xCC4F, + 22962 - 11904: 0xCC48, + 22963 - 11904: 0xA970, + 22964 - 11904: 0xCC53, + 22965 - 11904: 0xCC44, + 22966 - 11904: 0xCC4B, + 22967 - 11904: 0x9F74, + 22968 - 11904: 0x92F1, + 22969 - 11904: 0xA966, + 22970 - 11904: 0xCC45, + 22971 - 11904: 0xA964, + 22972 - 11904: 0xCC4C, + 22973 - 11904: 0xCC50, + 22974 - 11904: 0xA963, + 22975 - 11904: 0x8CFA, + 22976 - 11904: 0xCC51, + 22977 - 11904: 0xCC4A, + 22979 - 11904: 0xCC4D, + 22980 - 11904: 0x97DF, + 22981 - 11904: 0xA972, + 22982 - 11904: 0xA969, + 22983 - 11904: 0xCC54, + 22984 - 11904: 0xCC52, + 22985 - 11904: 0xFBA6, + 22986 - 11904: 0xA96E, + 22987 - 11904: 0xA96C, + 22988 - 11904: 0xCC49, + 22989 - 11904: 0xA96B, + 22990 - 11904: 0xCC47, + 22991 - 11904: 0xCC46, + 22992 - 11904: 0xA96A, + 22993 - 11904: 0xA968, + 22994 - 11904: 0xA971, + 22995 - 11904: 0xA96D, + 22996 - 11904: 0xA965, + 22998 - 11904: 0xCC4E, + 23000 - 11904: 0xABB9, + 23001 - 11904: 0xFBAB, + 23002 - 11904: 0xABC0, + 23003 - 11904: 0xCE6F, + 23004 - 11904: 0xABB8, + 23005 - 11904: 0xCE67, + 23006 - 11904: 0xCE63, + 23008 - 11904: 0xCE73, + 23009 - 11904: 0xCE62, + 23011 - 11904: 0xABBB, + 23012 - 11904: 0xCE6C, + 23013 - 11904: 0xABBE, + 23014 - 11904: 0xABC1, + 23016 - 11904: 0xABBC, + 23017 - 11904: 0xCE70, + 23018 - 11904: 0xABBF, + 23019 - 11904: 0x9877, + 23020 - 11904: 0xAE56, + 23021 - 11904: 0xCE76, + 23022 - 11904: 0xCE64, + 23023 - 11904: 0x9854, + 23024 - 11904: 0x95C5, + 23025 - 11904: 0xCE66, + 23026 - 11904: 0xCE6D, + 23027 - 11904: 0xCE71, + 23028 - 11904: 0xCE75, + 23029 - 11904: 0xCE72, + 23030 - 11904: 0xCE6B, + 23031 - 11904: 0xCE6E, + 23032 - 11904: 0x9D55, + 23033 - 11904: 0xFBB2, + 23034 - 11904: 0xCE68, + 23035 - 11904: 0xABC3, + 23036 - 11904: 0xCE6A, + 23037 - 11904: 0xCE69, + 23038 - 11904: 0xCE74, + 23039 - 11904: 0xABBA, + 23040 - 11904: 0xCE65, + 23041 - 11904: 0xABC2, + 23042 - 11904: 0x957E, + 23043 - 11904: 0xABBD, + 23049 - 11904: 0xAE5C, + 23050 - 11904: 0xD162, + 23051 - 11904: 0x9742, + 23052 - 11904: 0xAE5B, + 23053 - 11904: 0x94E6, + 23055 - 11904: 0xD160, + 23057 - 11904: 0xAE50, + 23058 - 11904: 0x92F5, + 23059 - 11904: 0xAE55, + 23061 - 11904: 0xD15F, + 23062 - 11904: 0xD15C, + 23063 - 11904: 0xD161, + 23064 - 11904: 0xAE51, + 23065 - 11904: 0xD15B, + 23066 - 11904: 0x8CC5, + 23067 - 11904: 0xAE54, + 23068 - 11904: 0xAE52, + 23070 - 11904: 0xD163, + 23071 - 11904: 0xAE53, + 23072 - 11904: 0xAE57, + 23073 - 11904: 0x92FD, + 23075 - 11904: 0xAE58, + 23076 - 11904: 0xFBA2, + 23077 - 11904: 0xAE5A, + 23079 - 11904: 0x9C51, + 23081 - 11904: 0xAE59, + 23082 - 11904: 0x94E9, + 23083 - 11904: 0x985C, + 23084 - 11904: 0x92F0, + 23085 - 11904: 0xD15D, + 23086 - 11904: 0xD15E, + 23091 - 11904: 0xD164, + 23093 - 11904: 0xD4D4, + 23094 - 11904: 0xB0F9, + 23095 - 11904: 0xD8C2, + 23096 - 11904: 0xD4D3, + 23097 - 11904: 0xD4E6, + 23100 - 11904: 0xB140, + 23101 - 11904: 0x944C, + 23102 - 11904: 0xD4E4, + 23104 - 11904: 0xB0FE, + 23105 - 11904: 0xB0FA, + 23106 - 11904: 0xD4ED, + 23107 - 11904: 0xD4DD, + 23108 - 11904: 0xD4E0, + 23109 - 11904: 0x916B, + 23110 - 11904: 0xB143, + 23111 - 11904: 0xD4EA, + 23112 - 11904: 0xD4E2, + 23113 - 11904: 0xB0FB, + 23114 - 11904: 0xB144, + 23116 - 11904: 0xD4E7, + 23117 - 11904: 0xD4E5, + 23120 - 11904: 0xD4D6, + 23121 - 11904: 0xD4EB, + 23122 - 11904: 0xD4DF, + 23123 - 11904: 0xD4DA, + 23124 - 11904: 0x8B78, + 23125 - 11904: 0xD4D0, + 23126 - 11904: 0xD4EC, + 23127 - 11904: 0xD4DC, + 23128 - 11904: 0xD4CF, + 23129 - 11904: 0x94E2, + 23130 - 11904: 0xB142, + 23131 - 11904: 0xD4E1, + 23132 - 11904: 0xD4EE, + 23133 - 11904: 0xD4DE, + 23134 - 11904: 0xD4D2, + 23135 - 11904: 0xD4D7, + 23136 - 11904: 0xD4CE, + 23137 - 11904: 0x984F, + 23138 - 11904: 0xB141, + 23139 - 11904: 0xFBB5, + 23140 - 11904: 0xD4DB, + 23141 - 11904: 0xD4D8, + 23142 - 11904: 0xB0FC, + 23143 - 11904: 0xD4D1, + 23144 - 11904: 0x9271, + 23145 - 11904: 0xD4E9, + 23146 - 11904: 0xB0FD, + 23147 - 11904: 0x9365, + 23148 - 11904: 0xD4D9, + 23149 - 11904: 0xD4D5, + 23150 - 11904: 0x985B, + 23152 - 11904: 0xD4E8, + 23153 - 11904: 0x9850, + 23159 - 11904: 0xFBB8, + 23160 - 11904: 0xD8BB, + 23161 - 11904: 0x97BC, + 23162 - 11904: 0xD8B8, + 23163 - 11904: 0xD8C9, + 23164 - 11904: 0xD8BD, + 23165 - 11904: 0xD8CA, + 23166 - 11904: 0x92F3, + 23167 - 11904: 0xB442, + 23169 - 11904: 0x9340, + 23170 - 11904: 0x984D, + 23171 - 11904: 0xD8C6, + 23172 - 11904: 0xD8C3, + 23174 - 11904: 0x9572, + 23176 - 11904: 0xFDEF, + 23178 - 11904: 0xD8C4, + 23179 - 11904: 0xD8C7, + 23180 - 11904: 0xD8CB, + 23182 - 11904: 0xD4E3, + 23183 - 11904: 0xD8CD, + 23184 - 11904: 0xDD47, + 23185 - 11904: 0xFDC1, + 23186 - 11904: 0xB443, + 23187 - 11904: 0xD8CE, + 23188 - 11904: 0xD8B6, + 23189 - 11904: 0xD8C0, + 23190 - 11904: 0xFBBA, + 23191 - 11904: 0xD8C5, + 23193 - 11904: 0x92EB, + 23194 - 11904: 0xB441, + 23195 - 11904: 0xB444, + 23196 - 11904: 0xD8CC, + 23197 - 11904: 0xD8CF, + 23198 - 11904: 0xD8BA, + 23199 - 11904: 0xD8B7, + 23200 - 11904: 0xFC73, + 23201 - 11904: 0x97B7, + 23202 - 11904: 0xD8B9, + 23204 - 11904: 0x876F, + 23205 - 11904: 0xD8BE, + 23206 - 11904: 0xD8BC, + 23207 - 11904: 0xB445, + 23209 - 11904: 0xD8C8, + 23211 - 11904: 0xFBB4, + 23212 - 11904: 0xD8BF, + 23214 - 11904: 0xD8C1, + 23215 - 11904: 0xD8B5, + 23216 - 11904: 0xDCFA, + 23217 - 11904: 0xDCF8, + 23218 - 11904: 0xB742, + 23219 - 11904: 0xB740, + 23220 - 11904: 0xDD43, + 23221 - 11904: 0xDCF9, + 23222 - 11904: 0xDD44, + 23223 - 11904: 0xDD40, + 23224 - 11904: 0xDCF7, + 23225 - 11904: 0xDD46, + 23226 - 11904: 0xDCF6, + 23227 - 11904: 0xDCFD, + 23228 - 11904: 0xB6FE, + 23229 - 11904: 0xB6FD, + 23230 - 11904: 0xB6FC, + 23231 - 11904: 0xDCFB, + 23232 - 11904: 0xDD41, + 23233 - 11904: 0xB6F9, + 23234 - 11904: 0xB741, + 23235 - 11904: 0x90A7, + 23236 - 11904: 0xDCF4, + 23238 - 11904: 0xDCFE, + 23239 - 11904: 0xDCF3, + 23240 - 11904: 0xDCFC, + 23241 - 11904: 0xB6FA, + 23242 - 11904: 0xDD42, + 23243 - 11904: 0xDCF5, + 23244 - 11904: 0xB6FB, + 23245 - 11904: 0xDD45, + 23246 - 11904: 0x9741, + 23247 - 11904: 0x92F4, + 23249 - 11904: 0x8772, + 23251 - 11904: 0xFBBC, + 23253 - 11904: 0xE16E, + 23254 - 11904: 0xB9E2, + 23255 - 11904: 0xB9E1, + 23256 - 11904: 0xB9E3, + 23257 - 11904: 0xE17A, + 23258 - 11904: 0xE170, + 23259 - 11904: 0xE176, + 23260 - 11904: 0xE16B, + 23261 - 11904: 0xE179, + 23262 - 11904: 0xE178, + 23263 - 11904: 0xE17C, + 23264 - 11904: 0xE175, + 23265 - 11904: 0xB9DE, + 23266 - 11904: 0xE174, + 23267 - 11904: 0xB9E4, + 23268 - 11904: 0x9577, + 23269 - 11904: 0xE16D, + 23270 - 11904: 0xB9DF, + 23272 - 11904: 0xE17B, + 23273 - 11904: 0xB9E0, + 23274 - 11904: 0xE16F, + 23275 - 11904: 0xE172, + 23276 - 11904: 0xE177, + 23277 - 11904: 0xE171, + 23278 - 11904: 0xE16C, + 23280 - 11904: 0x9EE2, + 23282 - 11904: 0x8F78, + 23283 - 11904: 0xE173, + 23284 - 11904: 0xE555, + 23285 - 11904: 0xBC61, + 23286 - 11904: 0xE558, + 23287 - 11904: 0xE557, + 23288 - 11904: 0xE55A, + 23289 - 11904: 0xE55C, + 23290 - 11904: 0xF9DC, + 23291 - 11904: 0xBC5F, + 23293 - 11904: 0xE556, + 23294 - 11904: 0x9672, + 23295 - 11904: 0xE554, + 23297 - 11904: 0xE55D, + 23298 - 11904: 0xE55B, + 23299 - 11904: 0xE559, + 23301 - 11904: 0xE55F, + 23303 - 11904: 0xE55E, + 23304 - 11904: 0xBC63, + 23305 - 11904: 0xBC5E, + 23307 - 11904: 0xBC60, + 23308 - 11904: 0xBC62, + 23309 - 11904: 0x9EB5, + 23311 - 11904: 0xE560, + 23312 - 11904: 0xE957, + 23313 - 11904: 0x964B, + 23315 - 11904: 0xE956, + 23316 - 11904: 0xE955, + 23317 - 11904: 0x8CAC, + 23318 - 11904: 0xE958, + 23319 - 11904: 0xE951, + 23321 - 11904: 0xE952, + 23322 - 11904: 0xE95A, + 23323 - 11904: 0xE953, + 23325 - 11904: 0xBEC5, + 23326 - 11904: 0xE95C, + 23327 - 11904: 0xA0FA, + 23328 - 11904: 0xE95B, + 23329 - 11904: 0xE954, + 23331 - 11904: 0xECD1, + 23332 - 11904: 0xC0A8, + 23333 - 11904: 0xECCF, + 23334 - 11904: 0xECD4, + 23335 - 11904: 0xECD3, + 23336 - 11904: 0xE959, + 23338 - 11904: 0xC0A7, + 23339 - 11904: 0x9575, + 23340 - 11904: 0xECD2, + 23341 - 11904: 0xECCE, + 23342 - 11904: 0xECD6, + 23343 - 11904: 0xECD5, + 23344 - 11904: 0xC0A6, + 23346 - 11904: 0xECD0, + 23348 - 11904: 0xBEC6, + 23352 - 11904: 0xC254, + 23356 - 11904: 0xEFC1, + 23357 - 11904: 0xF1FA, + 23358 - 11904: 0xF1FB, + 23359 - 11904: 0xF1FC, + 23360 - 11904: 0xC45C, + 23361 - 11904: 0x90DA, + 23363 - 11904: 0xC45D, + 23364 - 11904: 0x9367, + 23365 - 11904: 0xF443, + 23366 - 11904: 0xFEA4, + 23367 - 11904: 0xF5C8, + 23368 - 11904: 0xF5C7, + 23370 - 11904: 0x90DF, + 23371 - 11904: 0xF6DB, + 23372 - 11904: 0xF6DC, + 23373 - 11904: 0xF7D5, + 23374 - 11904: 0xF8A7, + 23375 - 11904: 0x9354, + 23376 - 11904: 0xA46C, + 23377 - 11904: 0xA46D, + 23379 - 11904: 0xA46E, + 23380 - 11904: 0xA4D5, + 23381 - 11904: 0xA5A5, + 23382 - 11904: 0xC9D3, + 23383 - 11904: 0xA672, + 23384 - 11904: 0xA673, + 23386 - 11904: 0xA7B7, + 23387 - 11904: 0xA7B8, + 23388 - 11904: 0xA7B6, + 23389 - 11904: 0xA7B5, + 23391 - 11904: 0xA973, + 23394 - 11904: 0xCC55, + 23395 - 11904: 0xA975, + 23396 - 11904: 0xA974, + 23397 - 11904: 0xCC56, + 23398 - 11904: 0x8961, + 23400 - 11904: 0x8BB4, + 23401 - 11904: 0xABC4, + 23403 - 11904: 0xAE5D, + 23404 - 11904: 0xD165, + 23405 - 11904: 0x9DC0, + 23406 - 11904: 0xD4F0, + 23408 - 11904: 0xB145, + 23409 - 11904: 0xB447, + 23410 - 11904: 0xD4EF, + 23411 - 11904: 0xB446, + 23412 - 11904: 0x8E48, + 23413 - 11904: 0xB9E5, + 23414 - 11904: 0xFBC5, + 23415 - 11904: 0xE17D, + 23416 - 11904: 0xBEC7, + 23418 - 11904: 0xC0A9, + 23419 - 11904: 0xECD7, + 23420 - 11904: 0xFBC7, + 23421 - 11904: 0xC45E, + 23423 - 11904: 0xC570, + 23424 - 11904: 0xC6CB, + 23425 - 11904: 0xC972, + 23426 - 11904: 0xFA79, + 23427 - 11904: 0xA5A6, + 23428 - 11904: 0xC973, + 23429 - 11904: 0xA676, + 23431 - 11904: 0xA674, + 23432 - 11904: 0xA675, + 23433 - 11904: 0xA677, + 23435 - 11904: 0xA7BA, + 23436 - 11904: 0xA7B9, + 23438 - 11904: 0xCABC, + 23439 - 11904: 0xA7BB, + 23440 - 11904: 0x9E67, + 23442 - 11904: 0xCABD, + 23443 - 11904: 0xCC57, + 23445 - 11904: 0xCC58, + 23446 - 11904: 0x8CD9, + 23447 - 11904: 0xA976, + 23448 - 11904: 0xA978, + 23449 - 11904: 0xA97A, + 23450 - 11904: 0xA977, + 23451 - 11904: 0xA97B, + 23452 - 11904: 0xA979, + 23453 - 11904: 0xFBD2, + 23454 - 11904: 0x8962, + 23455 - 11904: 0x8963, + 23458 - 11904: 0xABC8, + 23459 - 11904: 0xABC5, + 23460 - 11904: 0xABC7, + 23461 - 11904: 0xABC9, + 23462 - 11904: 0xABC6, + 23463 - 11904: 0xD166, + 23464 - 11904: 0xCE77, + 23466 - 11904: 0xFC7D, + 23468 - 11904: 0xD168, + 23469 - 11904: 0xD167, + 23470 - 11904: 0xAE63, + 23472 - 11904: 0xAE5F, + 23475 - 11904: 0xAE60, + 23476 - 11904: 0xAE62, + 23477 - 11904: 0xAE64, + 23478 - 11904: 0xAE61, + 23479 - 11904: 0x8773, + 23480 - 11904: 0xAE66, + 23481 - 11904: 0xAE65, + 23487 - 11904: 0xB14A, + 23488 - 11904: 0xD4F2, + 23489 - 11904: 0xD4F1, + 23490 - 11904: 0xB149, + 23491 - 11904: 0x9F6B, + 23492 - 11904: 0xB148, + 23493 - 11904: 0xB147, + 23494 - 11904: 0xB14B, + 23495 - 11904: 0xB146, + 23498 - 11904: 0xD8D5, + 23499 - 11904: 0xD8D2, + 23500 - 11904: 0xB449, + 23501 - 11904: 0xD8D1, + 23502 - 11904: 0xD8D6, + 23504 - 11904: 0xB44B, + 23505 - 11904: 0xD8D4, + 23506 - 11904: 0xB448, + 23507 - 11904: 0xB44A, + 23508 - 11904: 0xD8D3, + 23509 - 11904: 0xFBCC, + 23510 - 11904: 0xDD48, + 23511 - 11904: 0xFEAE, + 23512 - 11904: 0xDD49, + 23513 - 11904: 0xDD4A, + 23515 - 11904: 0x876D, + 23518 - 11904: 0xB9E6, + 23519 - 11904: 0xB9EE, + 23520 - 11904: 0xE17E, + 23521 - 11904: 0xB9E8, + 23522 - 11904: 0xB9EC, + 23523 - 11904: 0xE1A1, + 23524 - 11904: 0xB9ED, + 23525 - 11904: 0xB9E9, + 23526 - 11904: 0xB9EA, + 23527 - 11904: 0xB9E7, + 23528 - 11904: 0xB9EB, + 23529 - 11904: 0xBC66, + 23530 - 11904: 0xD8D0, + 23531 - 11904: 0xBC67, + 23532 - 11904: 0xBC65, + 23534 - 11904: 0xBC64, + 23535 - 11904: 0xE95D, + 23536 - 11904: 0xBEC8, + 23537 - 11904: 0xECD8, + 23538 - 11904: 0xECD9, + 23539 - 11904: 0xFBD1, + 23541 - 11904: 0xC364, + 23542 - 11904: 0xC45F, + 23544 - 11904: 0xA46F, + 23546 - 11904: 0xA678, + 23551 - 11904: 0xFB75, + 23553 - 11904: 0xABCA, + 23555 - 11904: 0xD169, + 23556 - 11904: 0xAE67, + 23557 - 11904: 0xFBD4, + 23559 - 11904: 0xB14E, + 23560 - 11904: 0xB14D, + 23561 - 11904: 0xB14C, + 23562 - 11904: 0xB44C, + 23563 - 11904: 0xB44D, + 23564 - 11904: 0xD8D7, + 23565 - 11904: 0xB9EF, + 23566 - 11904: 0xBEC9, + 23567 - 11904: 0xA470, + 23568 - 11904: 0xC95C, + 23569 - 11904: 0xA4D6, + 23570 - 11904: 0xC974, + 23571 - 11904: 0xFBD6, + 23572 - 11904: 0xFBD8, + 23573 - 11904: 0xC9D4, + 23574 - 11904: 0xA679, + 23578 - 11904: 0xA97C, + 23580 - 11904: 0x8B5D, + 23582 - 11904: 0x934C, + 23583 - 11904: 0xDD4B, + 23584 - 11904: 0x9AE2, + 23586 - 11904: 0xA471, + 23587 - 11904: 0x8BC9, + 23588 - 11904: 0xA4D7, + 23589 - 11904: 0xC9D5, + 23592 - 11904: 0xCABE, + 23594 - 11904: 0xCABF, + 23596 - 11904: 0xA7BC, + 23600 - 11904: 0xD8D8, + 23601 - 11904: 0xB44E, + 23603 - 11904: 0xDD4C, + 23607 - 11904: 0xC0AA, + 23608 - 11904: 0xA472, + 23609 - 11904: 0xA4A8, + 23610 - 11904: 0xA4D8, + 23611 - 11904: 0xC975, + 23612 - 11904: 0xA5A7, + 23614 - 11904: 0xA7C0, + 23615 - 11904: 0xA7BF, + 23616 - 11904: 0xA7BD, + 23617 - 11904: 0xA7BE, + 23620 - 11904: 0xCC59, + 23621 - 11904: 0xA97E, + 23622 - 11904: 0xA9A1, + 23623 - 11904: 0xCC5A, + 23624 - 11904: 0xA97D, + 23625 - 11904: 0xFBDB, + 23626 - 11904: 0x9FC9, + 23627 - 11904: 0xABCE, + 23628 - 11904: 0xCE78, + 23629 - 11904: 0xABCD, + 23630 - 11904: 0xABCB, + 23631 - 11904: 0xABCC, + 23632 - 11904: 0xAE6A, + 23633 - 11904: 0xAE68, + 23635 - 11904: 0x9F44, + 23636 - 11904: 0xD16B, + 23637 - 11904: 0xAE69, + 23638 - 11904: 0xD16A, + 23640 - 11904: 0xAE5E, + 23641 - 11904: 0xD4F3, + 23644 - 11904: 0xB150, + 23645 - 11904: 0xB151, + 23646 - 11904: 0x98ED, + 23648 - 11904: 0xB14F, + 23650 - 11904: 0xB9F0, + 23651 - 11904: 0xE1A2, + 23652 - 11904: 0xBC68, + 23653 - 11904: 0xBC69, + 23655 - 11904: 0xE561, + 23656 - 11904: 0xC0AB, + 23657 - 11904: 0xEFC2, + 23658 - 11904: 0xEFC3, + 23660 - 11904: 0xC4DD, + 23661 - 11904: 0xF8A8, + 23662 - 11904: 0xC94B, + 23663 - 11904: 0xA4D9, + 23665 - 11904: 0xA473, + 23667 - 11904: 0xC977, + 23668 - 11904: 0xC976, + 23672 - 11904: 0x8CE9, + 23673 - 11904: 0xA67A, + 23674 - 11904: 0xC9D7, + 23675 - 11904: 0xC9D8, + 23676 - 11904: 0xC9D6, + 23678 - 11904: 0xC9D9, + 23685 - 11904: 0xFBDD, + 23686 - 11904: 0xCAC7, + 23688 - 11904: 0xCAC2, + 23689 - 11904: 0xCAC4, + 23690 - 11904: 0xCAC6, + 23691 - 11904: 0xCAC3, + 23692 - 11904: 0xA7C4, + 23693 - 11904: 0xCAC0, + 23695 - 11904: 0xCAC1, + 23696 - 11904: 0xA7C1, + 23697 - 11904: 0xA7C2, + 23698 - 11904: 0xCAC5, + 23699 - 11904: 0xCAC8, + 23700 - 11904: 0xA7C3, + 23701 - 11904: 0xCAC9, + 23705 - 11904: 0x8DF2, + 23706 - 11904: 0x8964, + 23708 - 11904: 0xFDF2, + 23709 - 11904: 0xCC68, + 23710 - 11904: 0x934D, + 23711 - 11904: 0xCC62, + 23712 - 11904: 0xCC5D, + 23713 - 11904: 0xA9A3, + 23714 - 11904: 0xCC65, + 23715 - 11904: 0xCC63, + 23716 - 11904: 0xCC5C, + 23717 - 11904: 0xCC69, + 23718 - 11904: 0xCC6C, + 23719 - 11904: 0xCC67, + 23720 - 11904: 0xCC60, + 23721 - 11904: 0xA9A5, + 23722 - 11904: 0xCC66, + 23723 - 11904: 0xA9A6, + 23724 - 11904: 0xCC61, + 23725 - 11904: 0xCC64, + 23726 - 11904: 0xCC5B, + 23727 - 11904: 0xCC5F, + 23728 - 11904: 0xCC6B, + 23729 - 11904: 0xA9A7, + 23731 - 11904: 0xA9A8, + 23733 - 11904: 0xCC5E, + 23734 - 11904: 0xCC6A, + 23735 - 11904: 0xA9A2, + 23736 - 11904: 0xA9A4, + 23738 - 11904: 0xFBE7, + 23745 - 11904: 0xA0F2, + 23746 - 11904: 0x9868, + 23750 - 11904: 0xCEAB, + 23751 - 11904: 0xCEA4, + 23752 - 11904: 0xCEAA, + 23753 - 11904: 0xCEA3, + 23754 - 11904: 0xCEA5, + 23755 - 11904: 0xCE7D, + 23756 - 11904: 0xCE7B, + 23758 - 11904: 0xCEAC, + 23759 - 11904: 0xCEA9, + 23760 - 11904: 0xCE79, + 23761 - 11904: 0x9F58, + 23762 - 11904: 0xABD0, + 23763 - 11904: 0xCEA7, + 23764 - 11904: 0xCEA8, + 23765 - 11904: 0x8CE6, + 23766 - 11904: 0xCEA6, + 23767 - 11904: 0xCE7C, + 23768 - 11904: 0xCE7A, + 23769 - 11904: 0xABCF, + 23770 - 11904: 0xCEA2, + 23771 - 11904: 0xCE7E, + 23774 - 11904: 0xCEA1, + 23775 - 11904: 0xCEAD, + 23781 - 11904: 0x8D73, + 23784 - 11904: 0xAE6F, + 23785 - 11904: 0xFBDE, + 23786 - 11904: 0xAE6E, + 23788 - 11904: 0xD16C, + 23789 - 11904: 0xAE6B, + 23790 - 11904: 0xD16E, + 23791 - 11904: 0xFBDF, + 23792 - 11904: 0xAE70, + 23793 - 11904: 0xD16F, + 23796 - 11904: 0xAE73, + 23797 - 11904: 0x8C48, + 23798 - 11904: 0xAE71, + 23799 - 11904: 0xD170, + 23800 - 11904: 0xCEAE, + 23801 - 11904: 0xD172, + 23803 - 11904: 0xAE6D, + 23804 - 11904: 0x8774, + 23805 - 11904: 0xAE6C, + 23807 - 11904: 0xD16D, + 23808 - 11904: 0xD171, + 23809 - 11904: 0xAE72, + 23814 - 11904: 0xB153, + 23815 - 11904: 0xB152, + 23819 - 11904: 0xD4F5, + 23820 - 11904: 0xD4F9, + 23821 - 11904: 0xD4FB, + 23822 - 11904: 0xB154, + 23823 - 11904: 0xD4FE, + 23824 - 11904: 0xFBE3, + 23825 - 11904: 0xB158, + 23826 - 11904: 0xD541, + 23828 - 11904: 0xB15A, + 23829 - 11904: 0x8DA8, + 23830 - 11904: 0xB156, + 23831 - 11904: 0xB15E, + 23832 - 11904: 0xFBE4, + 23833 - 11904: 0xB15B, + 23834 - 11904: 0xD4F7, + 23835 - 11904: 0xB155, + 23837 - 11904: 0xD4F6, + 23838 - 11904: 0xD4F4, + 23839 - 11904: 0xD543, + 23840 - 11904: 0xD4F8, + 23842 - 11904: 0xB157, + 23843 - 11904: 0xD542, + 23844 - 11904: 0xB15C, + 23845 - 11904: 0xD4FD, + 23846 - 11904: 0xD4FC, + 23847 - 11904: 0xB15D, + 23848 - 11904: 0xD4FA, + 23849 - 11904: 0xB159, + 23852 - 11904: 0x9C75, + 23854 - 11904: 0xD544, + 23855 - 11904: 0x9878, + 23856 - 11904: 0xD540, + 23857 - 11904: 0xD8E7, + 23858 - 11904: 0xD8EE, + 23859 - 11904: 0xD8E3, + 23860 - 11904: 0xB451, + 23861 - 11904: 0xD8DF, + 23862 - 11904: 0xD8EF, + 23863 - 11904: 0xD8D9, + 23864 - 11904: 0xD8EC, + 23865 - 11904: 0xD8EA, + 23866 - 11904: 0xD8E4, + 23868 - 11904: 0xD8ED, + 23869 - 11904: 0xD8E6, + 23870 - 11904: 0x8D60, + 23871 - 11904: 0xD8DE, + 23872 - 11904: 0xD8F0, + 23873 - 11904: 0xD8DC, + 23874 - 11904: 0xD8E9, + 23875 - 11904: 0xD8DA, + 23877 - 11904: 0xD8F1, + 23878 - 11904: 0xFBE5, + 23879 - 11904: 0xB452, + 23880 - 11904: 0x8D61, + 23881 - 11904: 0xD8EB, + 23882 - 11904: 0xDD4F, + 23883 - 11904: 0xD8DD, + 23884 - 11904: 0xB44F, + 23886 - 11904: 0xD8E1, + 23888 - 11904: 0xB450, + 23889 - 11904: 0xD8E0, + 23890 - 11904: 0xD8E5, + 23893 - 11904: 0xD8E2, + 23894 - 11904: 0x8D62, + 23895 - 11904: 0xA0A1, + 23897 - 11904: 0xD8E8, + 23899 - 11904: 0x9C40, + 23902 - 11904: 0xDD53, + 23906 - 11904: 0xDD56, + 23907 - 11904: 0xDD4E, + 23909 - 11904: 0xDD50, + 23911 - 11904: 0xDD55, + 23912 - 11904: 0xDD54, + 23913 - 11904: 0xB743, + 23915 - 11904: 0xD8DB, + 23916 - 11904: 0xDD52, + 23919 - 11904: 0xB744, + 23920 - 11904: 0x98AD, + 23921 - 11904: 0xDD4D, + 23922 - 11904: 0xDD51, + 23924 - 11904: 0x9EEA, + 23927 - 11904: 0xE1A9, + 23928 - 11904: 0x8CEC, + 23929 - 11904: 0xE1B0, + 23930 - 11904: 0xE1A7, + 23931 - 11904: 0x8CD4, + 23932 - 11904: 0xE1AE, + 23933 - 11904: 0xE1A5, + 23934 - 11904: 0xE1AD, + 23935 - 11904: 0xE1B1, + 23936 - 11904: 0xE1A4, + 23937 - 11904: 0xE1A8, + 23938 - 11904: 0xE1A3, + 23940 - 11904: 0xB9F1, + 23941 - 11904: 0x9CEB, + 23942 - 11904: 0xE1A6, + 23943 - 11904: 0xB9F2, + 23944 - 11904: 0xE1AC, + 23945 - 11904: 0xE1AB, + 23946 - 11904: 0xE1AA, + 23947 - 11904: 0xFBE0, + 23949 - 11904: 0xE1AF, + 23950 - 11904: 0x9F51, + 23954 - 11904: 0xE565, + 23955 - 11904: 0xE567, + 23956 - 11904: 0xBC6B, + 23957 - 11904: 0xE568, + 23959 - 11904: 0xE563, + 23961 - 11904: 0xE562, + 23962 - 11904: 0xE56C, + 23964 - 11904: 0xE56A, + 23965 - 11904: 0xBC6A, + 23966 - 11904: 0xE56D, + 23967 - 11904: 0xE564, + 23968 - 11904: 0xE569, + 23969 - 11904: 0xE56B, + 23970 - 11904: 0xE566, + 23972 - 11904: 0x8D65, + 23975 - 11904: 0xE961, + 23976 - 11904: 0xE966, + 23977 - 11904: 0xE960, + 23978 - 11904: 0xE965, + 23979 - 11904: 0x9CF1, + 23980 - 11904: 0xE95E, + 23981 - 11904: 0xE968, + 23982 - 11904: 0xE964, + 23983 - 11904: 0xE969, + 23984 - 11904: 0xE963, + 23985 - 11904: 0xE95F, + 23986 - 11904: 0xE967, + 23988 - 11904: 0xE96A, + 23989 - 11904: 0xE962, + 23990 - 11904: 0xFC58, + 23991 - 11904: 0xECDA, + 23992 - 11904: 0xC0AF, + 23993 - 11904: 0x8D66, + 23994 - 11904: 0xC0AD, + 23996 - 11904: 0xC0AC, + 23997 - 11904: 0xC0AE, + 24000 - 11904: 0xEFC4, + 24001 - 11904: 0x9654, + 24002 - 11904: 0xF172, + 24003 - 11904: 0xF1FD, + 24006 - 11904: 0xF444, + 24007 - 11904: 0xF445, + 24009 - 11904: 0xC460, + 24011 - 11904: 0xF5C9, + 24013 - 11904: 0xC4DE, + 24015 - 11904: 0xF5CA, + 24017 - 11904: 0xF6DE, + 24018 - 11904: 0xC572, + 24020 - 11904: 0xC571, + 24021 - 11904: 0xF6DD, + 24022 - 11904: 0xC5C9, + 24023 - 11904: 0xFBE8, + 24024 - 11904: 0xF7D6, + 24027 - 11904: 0xC6CC, + 24029 - 11904: 0xA474, + 24030 - 11904: 0xA67B, + 24031 - 11904: 0xC9DA, + 24032 - 11904: 0xCACA, + 24033 - 11904: 0xA8B5, + 24034 - 11904: 0xB15F, + 24037 - 11904: 0xA475, + 24038 - 11904: 0xA5AA, + 24039 - 11904: 0xA5A9, + 24040 - 11904: 0xA5A8, + 24043 - 11904: 0xA7C5, + 24046 - 11904: 0xAE74, + 24048 - 11904: 0xDD57, + 24049 - 11904: 0xA476, + 24050 - 11904: 0xA477, + 24051 - 11904: 0xA478, + 24052 - 11904: 0xA4DA, + 24053 - 11904: 0x9FCE, + 24055 - 11904: 0xABD1, + 24057 - 11904: 0xCEAF, + 24061 - 11904: 0xB453, + 24062 - 11904: 0xA479, + 24063 - 11904: 0xC95D, + 24066 - 11904: 0xA5AB, + 24067 - 11904: 0xA5AC, + 24068 - 11904: 0xC978, + 24070 - 11904: 0xA67C, + 24073 - 11904: 0xFBFC, + 24074 - 11904: 0xCACB, + 24075 - 11904: 0x9AE4, + 24076 - 11904: 0xA7C6, + 24078 - 11904: 0xCACC, + 24081 - 11904: 0xA9AE, + 24082 - 11904: 0x9F75, + 24084 - 11904: 0xCC6E, + 24085 - 11904: 0xA9AC, + 24086 - 11904: 0xA9AB, + 24087 - 11904: 0xCC6D, + 24088 - 11904: 0xA9A9, + 24089 - 11904: 0xCC6F, + 24090 - 11904: 0xA9AA, + 24091 - 11904: 0xA9AD, + 24093 - 11904: 0xABD2, + 24095 - 11904: 0xABD4, + 24096 - 11904: 0xCEB3, + 24097 - 11904: 0xCEB0, + 24098 - 11904: 0xCEB1, + 24099 - 11904: 0xCEB2, + 24100 - 11904: 0xCEB4, + 24101 - 11904: 0xABD3, + 24104 - 11904: 0xD174, + 24105 - 11904: 0xD173, + 24107 - 11904: 0xAE76, + 24109 - 11904: 0xAE75, + 24110 - 11904: 0xFBF1, + 24115 - 11904: 0xB162, + 24116 - 11904: 0xD546, + 24118 - 11904: 0xB161, + 24119 - 11904: 0xB163, + 24120 - 11904: 0xB160, + 24125 - 11904: 0xB455, + 24126 - 11904: 0xD545, + 24128 - 11904: 0xB456, + 24129 - 11904: 0xD8F3, + 24130 - 11904: 0x8D69, + 24131 - 11904: 0xB457, + 24132 - 11904: 0xD8F2, + 24133 - 11904: 0xB454, + 24136 - 11904: 0x934F, + 24138 - 11904: 0xDD5A, + 24139 - 11904: 0xDD5C, + 24140 - 11904: 0xB745, + 24141 - 11904: 0xDD5B, + 24142 - 11904: 0xDD59, + 24143 - 11904: 0xDD58, + 24147 - 11904: 0xE1B4, + 24148 - 11904: 0xB9F7, + 24149 - 11904: 0xB9F5, + 24151 - 11904: 0xB9F6, + 24152 - 11904: 0xE1B2, + 24153 - 11904: 0xE1B3, + 24155 - 11904: 0xB9F3, + 24156 - 11904: 0xE571, + 24157 - 11904: 0xE56F, + 24158 - 11904: 0x934E, + 24159 - 11904: 0xBC6D, + 24160 - 11904: 0xE570, + 24161 - 11904: 0xBC6E, + 24162 - 11904: 0xBC6C, + 24163 - 11904: 0xB9F4, + 24166 - 11904: 0xE96D, + 24167 - 11904: 0xE96B, + 24168 - 11904: 0xE96C, + 24169 - 11904: 0xE56E, + 24170 - 11904: 0xECDC, + 24171 - 11904: 0xC0B0, + 24172 - 11904: 0xECDB, + 24173 - 11904: 0xEFC5, + 24174 - 11904: 0xEFC6, + 24175 - 11904: 0xE96E, + 24176 - 11904: 0xF1FE, + 24178 - 11904: 0xA47A, + 24179 - 11904: 0xA5AD, + 24180 - 11904: 0xA67E, + 24181 - 11904: 0xFBF3, + 24182 - 11904: 0xA67D, + 24184 - 11904: 0xA9AF, + 24185 - 11904: 0xB746, + 24186 - 11904: 0xFBF4, + 24187 - 11904: 0xA4DB, + 24188 - 11904: 0xA5AE, + 24189 - 11904: 0xABD5, + 24190 - 11904: 0xB458, + 24191 - 11904: 0xC6CE, + 24192 - 11904: 0xC979, + 24194 - 11904: 0xC97A, + 24195 - 11904: 0xFBC3, + 24196 - 11904: 0xC9DC, + 24198 - 11904: 0x8965, + 24199 - 11904: 0xA7C8, + 24200 - 11904: 0xCAD0, + 24201 - 11904: 0xCACE, + 24202 - 11904: 0xA7C9, + 24203 - 11904: 0xCACD, + 24204 - 11904: 0xCACF, + 24205 - 11904: 0xCAD1, + 24207 - 11904: 0xA7C7, + 24210 - 11904: 0x8C7A, + 24213 - 11904: 0xA9B3, + 24214 - 11904: 0xA9B4, + 24215 - 11904: 0xA9B1, + 24217 - 11904: 0x8C7B, + 24218 - 11904: 0xA9B0, + 24219 - 11904: 0xCEB8, + 24220 - 11904: 0xA9B2, + 24224 - 11904: 0xABD6, + 24226 - 11904: 0xCEB7, + 24227 - 11904: 0xCEB9, + 24228 - 11904: 0xCEB6, + 24229 - 11904: 0xCEBA, + 24230 - 11904: 0xABD7, + 24231 - 11904: 0xAE79, + 24232 - 11904: 0xD175, + 24234 - 11904: 0xD177, + 24235 - 11904: 0xAE77, + 24236 - 11904: 0xD178, + 24237 - 11904: 0xAE78, + 24238 - 11904: 0xD176, + 24240 - 11904: 0xCEB5, + 24241 - 11904: 0xD547, + 24242 - 11904: 0xD54A, + 24243 - 11904: 0xD54B, + 24244 - 11904: 0xD548, + 24245 - 11904: 0xB167, + 24246 - 11904: 0xB166, + 24247 - 11904: 0xB164, + 24248 - 11904: 0xB165, + 24249 - 11904: 0xD549, + 24253 - 11904: 0x8D6A, + 24254 - 11904: 0xB168, + 24257 - 11904: 0xB45A, + 24258 - 11904: 0xB45B, + 24260 - 11904: 0xB45C, + 24261 - 11904: 0xDD5D, + 24262 - 11904: 0xDD5F, + 24263 - 11904: 0xDD61, + 24264 - 11904: 0xB748, + 24265 - 11904: 0xB747, + 24266 - 11904: 0xB459, + 24267 - 11904: 0xDD60, + 24268 - 11904: 0xDD5E, + 24269 - 11904: 0x9353, + 24270 - 11904: 0xE1B8, + 24272 - 11904: 0xFBF9, + 24273 - 11904: 0xE1B6, + 24274 - 11904: 0xE1BC, + 24275 - 11904: 0xB9F8, + 24276 - 11904: 0xE1BD, + 24277 - 11904: 0xE1BA, + 24278 - 11904: 0xB9F9, + 24279 - 11904: 0xE1B7, + 24280 - 11904: 0xE1B5, + 24281 - 11904: 0xE1BB, + 24282 - 11904: 0xBC70, + 24283 - 11904: 0xE573, + 24284 - 11904: 0xE1B9, + 24285 - 11904: 0xBC72, + 24286 - 11904: 0xE574, + 24287 - 11904: 0xBC71, + 24288 - 11904: 0xBC74, + 24289 - 11904: 0xE575, + 24290 - 11904: 0xBC6F, + 24291 - 11904: 0xBC73, + 24293 - 11904: 0xE973, + 24294 - 11904: 0xE971, + 24295 - 11904: 0xE970, + 24296 - 11904: 0xE972, + 24297 - 11904: 0xE96F, + 24300 - 11904: 0xC366, + 24302 - 11904: 0xF446, + 24303 - 11904: 0xF447, + 24305 - 11904: 0xF5CB, + 24306 - 11904: 0xF6DF, + 24307 - 11904: 0xC655, + 24308 - 11904: 0xFBFD, + 24310 - 11904: 0xA9B5, + 24311 - 11904: 0xA7CA, + 24312 - 11904: 0x9059, + 24313 - 11904: 0xFC40, + 24314 - 11904: 0xABD8, + 24315 - 11904: 0xFC41, + 24316 - 11904: 0xFC43, + 24318 - 11904: 0xA47B, + 24319 - 11904: 0xA4DC, + 24321 - 11904: 0xA5AF, + 24322 - 11904: 0xC9DD, + 24324 - 11904: 0xA7CB, + 24325 - 11904: 0xCAD2, + 24327 - 11904: 0xCEBB, + 24328 - 11904: 0xABD9, + 24330 - 11904: 0xB9FA, + 24331 - 11904: 0xA47C, + 24332 - 11904: 0x9FD8, + 24333 - 11904: 0xFC46, + 24334 - 11904: 0x9362, + 24335 - 11904: 0xA6A1, + 24338 - 11904: 0xB749, + 24339 - 11904: 0xA47D, + 24340 - 11904: 0xA4DD, + 24341 - 11904: 0xA4DE, + 24343 - 11904: 0xA5B1, + 24344 - 11904: 0xA5B0, + 24346 - 11904: 0xC9DE, + 24347 - 11904: 0xA6A2, + 24349 - 11904: 0xCAD3, + 24351 - 11904: 0xA7CC, + 24354 - 11904: 0xCC71, + 24355 - 11904: 0xCC72, + 24356 - 11904: 0xCC73, + 24357 - 11904: 0x8D6B, + 24358 - 11904: 0xA9B6, + 24359 - 11904: 0xA9B7, + 24360 - 11904: 0xCC70, + 24361 - 11904: 0xA9B8, + 24365 - 11904: 0xABDA, + 24366 - 11904: 0xCEBC, + 24368 - 11904: 0xD17A, + 24369 - 11904: 0xAE7A, + 24371 - 11904: 0xD179, + 24373 - 11904: 0xB169, + 24374 - 11904: 0xD54C, + 24375 - 11904: 0xB16A, + 24376 - 11904: 0xD54D, + 24378 - 11904: 0xFC4C, + 24379 - 11904: 0x8CFE, + 24380 - 11904: 0xB45D, + 24384 - 11904: 0xDD62, + 24387 - 11904: 0xE1BF, + 24388 - 11904: 0xE1BE, + 24390 - 11904: 0xB9FB, + 24392 - 11904: 0xBC75, + 24393 - 11904: 0xE576, + 24394 - 11904: 0xBECA, + 24395 - 11904: 0xE974, + 24396 - 11904: 0xC0B1, + 24397 - 11904: 0x95B8, + 24398 - 11904: 0xC573, + 24399 - 11904: 0xF7D8, + 24400 - 11904: 0xC6D0, + 24401 - 11904: 0x8BCA, + 24404 - 11904: 0xCC74, + 24406 - 11904: 0xCEBD, + 24407 - 11904: 0xB16B, + 24408 - 11904: 0xFC4F, + 24409 - 11904: 0xB74A, + 24412 - 11904: 0x987A, + 24413 - 11904: 0xC255, + 24417 - 11904: 0xC6D1, + 24418 - 11904: 0xA7CE, + 24419 - 11904: 0xFC51, + 24420 - 11904: 0xA7CD, + 24421 - 11904: 0xABDB, + 24423 - 11904: 0xD17B, + 24425 - 11904: 0xB16D, + 24426 - 11904: 0xB343, + 24427 - 11904: 0xB16E, + 24428 - 11904: 0xB16C, + 24429 - 11904: 0xB45E, + 24431 - 11904: 0xE1C0, + 24432 - 11904: 0xB9FC, + 24433 - 11904: 0xBC76, + 24434 - 11904: 0xFC54, + 24435 - 11904: 0xC94C, + 24436 - 11904: 0xC9DF, + 24438 - 11904: 0xCAD5, + 24439 - 11904: 0xA7CF, + 24440 - 11904: 0xCAD4, + 24441 - 11904: 0xA7D0, + 24443 - 11904: 0xFAAF, + 24444 - 11904: 0xA9BC, + 24445 - 11904: 0xCC77, + 24446 - 11904: 0xCC76, + 24447 - 11904: 0xA9BB, + 24448 - 11904: 0xA9B9, + 24449 - 11904: 0xA9BA, + 24450 - 11904: 0xCC75, + 24451 - 11904: 0x8D6C, + 24453 - 11904: 0xABDD, + 24454 - 11904: 0xCEBE, + 24455 - 11904: 0xABE0, + 24456 - 11904: 0xABDC, + 24457 - 11904: 0xABE2, + 24458 - 11904: 0xABDE, + 24459 - 11904: 0xABDF, + 24460 - 11904: 0xABE1, + 24464 - 11904: 0xAE7D, + 24465 - 11904: 0xAE7C, + 24466 - 11904: 0xAE7B, + 24470 - 11904: 0xD54F, + 24471 - 11904: 0xB16F, + 24472 - 11904: 0xB172, + 24473 - 11904: 0xB170, + 24475 - 11904: 0xD54E, + 24476 - 11904: 0xB175, + 24478 - 11904: 0xB171, + 24479 - 11904: 0xD550, + 24480 - 11904: 0xB174, + 24481 - 11904: 0xB173, + 24484 - 11904: 0xFA61, + 24485 - 11904: 0xD8F6, + 24486 - 11904: 0xD8F5, + 24487 - 11904: 0xFC57, + 24488 - 11904: 0xB461, + 24489 - 11904: 0xB45F, + 24490 - 11904: 0xB460, + 24491 - 11904: 0xD8F7, + 24492 - 11904: 0xB74B, + 24493 - 11904: 0xDD64, + 24494 - 11904: 0xB74C, + 24495 - 11904: 0xDD63, + 24497 - 11904: 0x9B70, + 24498 - 11904: 0xE577, + 24501 - 11904: 0xBC78, + 24502 - 11904: 0xE1C1, + 24503 - 11904: 0xBC77, + 24505 - 11904: 0xB9FD, + 24506 - 11904: 0xA051, + 24507 - 11904: 0xECDE, + 24508 - 11904: 0xE975, + 24509 - 11904: 0xC0B2, + 24510 - 11904: 0xECDD, + 24511 - 11904: 0xF240, + 24512 - 11904: 0xF448, + 24513 - 11904: 0xF449, + 24514 - 11904: 0x8C7C, + 24515 - 11904: 0xA4DF, + 24516 - 11904: 0x8BCB, + 24517 - 11904: 0xA5B2, + 24521 - 11904: 0xC97B, + 24524 - 11904: 0xA7D2, + 24525 - 11904: 0xA7D4, + 24527 - 11904: 0xC9E2, + 24528 - 11904: 0xCAD8, + 24529 - 11904: 0xCAD7, + 24530 - 11904: 0xCAD6, + 24532 - 11904: 0xC9E1, + 24533 - 11904: 0xC9E0, + 24534 - 11904: 0xA6A4, + 24535 - 11904: 0xA7D3, + 24536 - 11904: 0xA7D1, + 24537 - 11904: 0xA6A3, + 24539 - 11904: 0x936E, + 24541 - 11904: 0xA9BD, + 24542 - 11904: 0xCC78, + 24543 - 11904: 0xFCD5, + 24544 - 11904: 0xA9BE, + 24545 - 11904: 0xCADD, + 24547 - 11904: 0xCADF, + 24548 - 11904: 0xCADE, + 24549 - 11904: 0xCC79, + 24552 - 11904: 0xCADA, + 24554 - 11904: 0xA7D8, + 24555 - 11904: 0xA7D6, + 24557 - 11904: 0xCAD9, + 24558 - 11904: 0xCADB, + 24559 - 11904: 0xCAE1, + 24561 - 11904: 0xA7D5, + 24563 - 11904: 0xCADC, + 24564 - 11904: 0xCAE5, + 24565 - 11904: 0xA9C0, + 24567 - 11904: 0xCAE2, + 24568 - 11904: 0xA7D7, + 24570 - 11904: 0xCAE0, + 24571 - 11904: 0xCAE3, + 24573 - 11904: 0xA9BF, + 24575 - 11904: 0xA9C1, + 24576 - 11904: 0xCAE4, + 24585 - 11904: 0xCCAF, + 24586 - 11904: 0xCCA2, + 24587 - 11904: 0xCC7E, + 24588 - 11904: 0xCCAE, + 24589 - 11904: 0xCCA9, + 24590 - 11904: 0xABE7, + 24591 - 11904: 0xA9C2, + 24592 - 11904: 0xCCAA, + 24593 - 11904: 0xCCAD, + 24594 - 11904: 0xABE3, + 24595 - 11904: 0xCCAC, + 24596 - 11904: 0xA9C3, + 24597 - 11904: 0xA9C8, + 24598 - 11904: 0xA9C6, + 24599 - 11904: 0xCCA3, + 24601 - 11904: 0xCC7C, + 24602 - 11904: 0xCCA5, + 24603 - 11904: 0xA9CD, + 24604 - 11904: 0xCCB0, + 24605 - 11904: 0xABE4, + 24606 - 11904: 0xCCA6, + 24608 - 11904: 0xABE5, + 24609 - 11904: 0xA9C9, + 24610 - 11904: 0xCCA8, + 24611 - 11904: 0xFCA9, + 24612 - 11904: 0xCECD, + 24613 - 11904: 0xABE6, + 24614 - 11904: 0xCC7B, + 24615 - 11904: 0xA9CA, + 24616 - 11904: 0xABE8, + 24617 - 11904: 0xA9CB, + 24618 - 11904: 0xA9C7, + 24619 - 11904: 0xA9CC, + 24620 - 11904: 0xCCA7, + 24621 - 11904: 0xCC7A, + 24622 - 11904: 0xCCAB, + 24623 - 11904: 0xA9C4, + 24625 - 11904: 0xFC61, + 24626 - 11904: 0xCC7D, + 24627 - 11904: 0xCCA4, + 24628 - 11904: 0xCCA1, + 24629 - 11904: 0xA9C5, + 24631 - 11904: 0xCEBF, + 24633 - 11904: 0xCEC0, + 24635 - 11904: 0x8966, + 24640 - 11904: 0xCECA, + 24641 - 11904: 0xD1A1, + 24642 - 11904: 0xCECB, + 24643 - 11904: 0xABEE, + 24644 - 11904: 0xCECE, + 24645 - 11904: 0xCEC4, + 24646 - 11904: 0xABED, + 24647 - 11904: 0xCEC6, + 24649 - 11904: 0xCEC7, + 24650 - 11904: 0xFACB, + 24652 - 11904: 0xCEC9, + 24653 - 11904: 0xABE9, + 24656 - 11904: 0xAEA3, + 24658 - 11904: 0xF9DA, + 24659 - 11904: 0xCEC5, + 24660 - 11904: 0xCEC1, + 24661 - 11904: 0xAEA4, + 24664 - 11904: 0xCECF, + 24665 - 11904: 0xAE7E, + 24666 - 11904: 0xD17D, + 24667 - 11904: 0xCEC8, + 24669 - 11904: 0xD17C, + 24670 - 11904: 0xCEC3, + 24671 - 11904: 0xCECC, + 24674 - 11904: 0xABEC, + 24675 - 11904: 0xAEA1, + 24676 - 11904: 0xABF2, + 24677 - 11904: 0xAEA2, + 24678 - 11904: 0xCED0, + 24679 - 11904: 0xD17E, + 24680 - 11904: 0xABEB, + 24681 - 11904: 0xAEA6, + 24682 - 11904: 0xABF1, + 24683 - 11904: 0xABF0, + 24684 - 11904: 0xABEF, + 24685 - 11904: 0xAEA5, + 24686 - 11904: 0xCED1, + 24687 - 11904: 0xAEA7, + 24688 - 11904: 0xABEA, + 24690 - 11904: 0xCEC2, + 24693 - 11904: 0x937A, + 24695 - 11904: 0xA0E0, + 24702 - 11904: 0x936B, + 24703 - 11904: 0xB176, + 24704 - 11904: 0xD1A4, + 24705 - 11904: 0xD1A6, + 24707 - 11904: 0xD1A8, + 24708 - 11904: 0xAEA8, + 24709 - 11904: 0xAEAE, + 24710 - 11904: 0xD553, + 24711 - 11904: 0xD1AC, + 24712 - 11904: 0xD1A3, + 24713 - 11904: 0xB178, + 24714 - 11904: 0xD551, + 24716 - 11904: 0xAEAD, + 24717 - 11904: 0xAEAB, + 24718 - 11904: 0xD1AE, + 24720 - 11904: 0xD552, + 24722 - 11904: 0xD1A5, + 24724 - 11904: 0xAEAC, + 24725 - 11904: 0xD1A9, + 24726 - 11904: 0xAEAF, + 24727 - 11904: 0xD1AB, + 24730 - 11904: 0xAEAA, + 24731 - 11904: 0xD1AA, + 24732 - 11904: 0xD1AD, + 24733 - 11904: 0xD1A7, + 24734 - 11904: 0xFC6B, + 24735 - 11904: 0xAEA9, + 24736 - 11904: 0xB179, + 24738 - 11904: 0xD1A2, + 24739 - 11904: 0xB177, + 24740 - 11904: 0xFC6C, + 24743 - 11904: 0x9468, + 24744 - 11904: 0xB17A, + 24752 - 11904: 0xD555, + 24753 - 11904: 0xD55E, + 24754 - 11904: 0xB464, + 24755 - 11904: 0xFC6D, + 24756 - 11904: 0xB17C, + 24757 - 11904: 0xB1A3, + 24758 - 11904: 0xB465, + 24759 - 11904: 0xD560, + 24760 - 11904: 0xB1AA, + 24761 - 11904: 0xD8F9, + 24762 - 11904: 0xD556, + 24763 - 11904: 0xB1A2, + 24764 - 11904: 0xB1A5, + 24765 - 11904: 0xB17E, + 24766 - 11904: 0xD554, + 24767 - 11904: 0xD562, + 24768 - 11904: 0xD565, + 24769 - 11904: 0xD949, + 24771 - 11904: 0xD563, + 24772 - 11904: 0xD8FD, + 24773 - 11904: 0xB1A1, + 24774 - 11904: 0xB1A8, + 24775 - 11904: 0xB1AC, + 24776 - 11904: 0xD55D, + 24777 - 11904: 0xD8F8, + 24778 - 11904: 0xD561, + 24779 - 11904: 0xB17B, + 24780 - 11904: 0xD8FA, + 24781 - 11904: 0xD564, + 24782 - 11904: 0xD8FC, + 24783 - 11904: 0xD559, + 24785 - 11904: 0xB462, + 24787 - 11904: 0xD557, + 24788 - 11904: 0xD558, + 24789 - 11904: 0xB1A7, + 24791 - 11904: 0x8D71, + 24792 - 11904: 0xB1A6, + 24793 - 11904: 0xD55B, + 24794 - 11904: 0xB1AB, + 24795 - 11904: 0xD55F, + 24796 - 11904: 0xB1A4, + 24797 - 11904: 0xD55C, + 24798 - 11904: 0xFD64, + 24799 - 11904: 0xB1A9, + 24800 - 11904: 0xB466, + 24801 - 11904: 0xB463, + 24802 - 11904: 0xD8FB, + 24803 - 11904: 0x99BA, + 24804 - 11904: 0xD55A, + 24806 - 11904: 0xB17D, + 24807 - 11904: 0x9AD0, + 24808 - 11904: 0x9A61, + 24809 - 11904: 0xA0E5, + 24816 - 11904: 0xB46B, + 24817 - 11904: 0xB46F, + 24818 - 11904: 0xD940, + 24819 - 11904: 0xB751, + 24820 - 11904: 0xB46D, + 24821 - 11904: 0xD944, + 24822 - 11904: 0xB471, + 24823 - 11904: 0xDD65, + 24824 - 11904: 0xD946, + 24825 - 11904: 0xB753, + 24826 - 11904: 0xB469, + 24827 - 11904: 0xB46C, + 24828 - 11904: 0xD947, + 24829 - 11904: 0xA05B, + 24830 - 11904: 0xD948, + 24831 - 11904: 0xD94E, + 24832 - 11904: 0xB473, + 24833 - 11904: 0xB754, + 24835 - 11904: 0xD94A, + 24836 - 11904: 0xD94F, + 24837 - 11904: 0xD943, + 24838 - 11904: 0xB75E, + 24839 - 11904: 0x96AC, + 24840 - 11904: 0xB755, + 24841 - 11904: 0xB472, + 24842 - 11904: 0xD941, + 24843 - 11904: 0xD950, + 24844 - 11904: 0x9740, + 24845 - 11904: 0xB75D, + 24846 - 11904: 0xB470, + 24847 - 11904: 0xB74E, + 24848 - 11904: 0xD94D, + 24850 - 11904: 0xB474, + 24851 - 11904: 0xD945, + 24852 - 11904: 0xD8FE, + 24853 - 11904: 0xB46A, + 24854 - 11904: 0xD942, + 24856 - 11904: 0xD94B, + 24857 - 11904: 0x9EF1, + 24858 - 11904: 0xB74D, + 24859 - 11904: 0xB752, + 24860 - 11904: 0xB467, + 24861 - 11904: 0xD94C, + 24863 - 11904: 0xB750, + 24866 - 11904: 0x8C4D, + 24867 - 11904: 0xB468, + 24871 - 11904: 0xB75C, + 24872 - 11904: 0xE1C3, + 24873 - 11904: 0xDD70, + 24875 - 11904: 0xDD68, + 24876 - 11904: 0xE1C2, + 24878 - 11904: 0xDD6C, + 24879 - 11904: 0xDD6E, + 24880 - 11904: 0x9F7E, + 24882 - 11904: 0xDD6B, + 24884 - 11904: 0xB75B, + 24886 - 11904: 0xDD6A, + 24887 - 11904: 0xB75F, + 24891 - 11904: 0xE1D2, + 24893 - 11904: 0x8D72, + 24894 - 11904: 0xB75A, + 24895 - 11904: 0xBA40, + 24896 - 11904: 0xDD71, + 24897 - 11904: 0xE1C4, + 24898 - 11904: 0xFC76, + 24900 - 11904: 0xB758, + 24901 - 11904: 0xDD69, + 24902 - 11904: 0xDD6D, + 24903 - 11904: 0xB9FE, + 24904 - 11904: 0xB74F, + 24905 - 11904: 0xDD66, + 24906 - 11904: 0xDD67, + 24907 - 11904: 0xBA41, + 24908 - 11904: 0xB757, + 24909 - 11904: 0xB759, + 24910 - 11904: 0xB756, + 24911 - 11904: 0xDD6F, + 24912 - 11904: 0x96A9, + 24914 - 11904: 0xE1C8, + 24915 - 11904: 0xE1C9, + 24916 - 11904: 0xE1CE, + 24917 - 11904: 0xBC7D, + 24918 - 11904: 0xE1D5, + 24920 - 11904: 0xBA47, + 24921 - 11904: 0xA06E, + 24922 - 11904: 0xBA46, + 24923 - 11904: 0xE1D0, + 24924 - 11904: 0xFCAA, + 24925 - 11904: 0xBC7C, + 24926 - 11904: 0xE1C5, + 24927 - 11904: 0xBA45, + 24928 - 11904: 0xFBCD, + 24929 - 11904: 0xE1D4, + 24930 - 11904: 0xBA43, + 24931 - 11904: 0xBA44, + 24932 - 11904: 0xFC74, + 24933 - 11904: 0xE1D1, + 24934 - 11904: 0xE5AA, + 24935 - 11904: 0xBC7A, + 24936 - 11904: 0xB46E, + 24938 - 11904: 0xE1D3, + 24939 - 11904: 0xBCA3, + 24940 - 11904: 0xE1CB, + 24942 - 11904: 0xBC7B, + 24943 - 11904: 0xA074, + 24944 - 11904: 0xBCA2, + 24945 - 11904: 0xE1C6, + 24946 - 11904: 0xE1CA, + 24947 - 11904: 0xE1C7, + 24948 - 11904: 0xE1CD, + 24949 - 11904: 0xBA48, + 24950 - 11904: 0xBC79, + 24951 - 11904: 0xBA42, + 24953 - 11904: 0xE57A, + 24954 - 11904: 0xE1CF, + 24956 - 11904: 0xBCA1, + 24957 - 11904: 0xA071, + 24958 - 11904: 0xBCA4, + 24960 - 11904: 0xE1CC, + 24961 - 11904: 0xFC79, + 24962 - 11904: 0xBC7E, + 24963 - 11904: 0xE579, + 24967 - 11904: 0xFC7C, + 24969 - 11904: 0xE57E, + 24970 - 11904: 0xBECE, + 24971 - 11904: 0xE578, + 24972 - 11904: 0xE9A3, + 24973 - 11904: 0xE5A9, + 24974 - 11904: 0xBCA8, + 24976 - 11904: 0xBCA6, + 24977 - 11904: 0xBECC, + 24978 - 11904: 0xE5A6, + 24979 - 11904: 0xE5A2, + 24980 - 11904: 0xBCAC, + 24981 - 11904: 0x9C50, + 24982 - 11904: 0xE978, + 24984 - 11904: 0x9379, + 24985 - 11904: 0x9378, + 24986 - 11904: 0xBCAA, + 24987 - 11904: 0xE5A1, + 24988 - 11904: 0xA0DD, + 24989 - 11904: 0xE976, + 24991 - 11904: 0xE5A5, + 24993 - 11904: 0xE5A8, + 24994 - 11904: 0xE57D, + 24996 - 11904: 0xBCAB, + 24999 - 11904: 0xBCA5, + 25000 - 11904: 0xE977, + 25001 - 11904: 0xBECD, + 25002 - 11904: 0xE5A7, + 25003 - 11904: 0xBCA7, + 25004 - 11904: 0xBCA9, + 25005 - 11904: 0xE5A4, + 25006 - 11904: 0xBCAD, + 25007 - 11904: 0xE5A3, + 25008 - 11904: 0xE57C, + 25009 - 11904: 0xE57B, + 25010 - 11904: 0xBECB, + 25011 - 11904: 0xE5AB, + 25012 - 11904: 0xE97A, + 25013 - 11904: 0xECE0, + 25014 - 11904: 0xBED0, + 25015 - 11904: 0x8D75, + 25016 - 11904: 0xE9A2, + 25017 - 11904: 0x8D76, + 25018 - 11904: 0xE97E, + 25020 - 11904: 0xECE1, + 25022 - 11904: 0xBED1, + 25023 - 11904: 0xE9A1, + 25024 - 11904: 0x9374, + 25025 - 11904: 0xE97C, + 25026 - 11904: 0xC0B4, + 25027 - 11904: 0xECDF, + 25029 - 11904: 0xE979, + 25030 - 11904: 0xE97B, + 25031 - 11904: 0xC0B5, + 25032 - 11904: 0xBED3, + 25033 - 11904: 0xC0B3, + 25034 - 11904: 0xBED2, + 25035 - 11904: 0xC0B7, + 25036 - 11904: 0xE97D, + 25037 - 11904: 0xBECF, + 25039 - 11904: 0x8D77, + 25040 - 11904: 0xFCA5, + 25043 - 11904: 0xFCA2, + 25046 - 11904: 0xEFCF, + 25048 - 11904: 0xEFC7, + 25050 - 11904: 0x90C3, + 25054 - 11904: 0xECE7, + 25055 - 11904: 0xEFC8, + 25056 - 11904: 0xECE3, + 25058 - 11904: 0xA079, + 25059 - 11904: 0xC256, + 25060 - 11904: 0xECE5, + 25061 - 11904: 0xECE4, + 25062 - 11904: 0xC0B6, + 25063 - 11904: 0xECE2, + 25064 - 11904: 0xECE6, + 25065 - 11904: 0xEFD0, + 25066 - 11904: 0xEFCC, + 25067 - 11904: 0xEFCE, + 25069 - 11904: 0xEFC9, + 25070 - 11904: 0xEFCA, + 25072 - 11904: 0xEFCD, + 25073 - 11904: 0xEFCB, + 25074 - 11904: 0xC367, + 25077 - 11904: 0xC36A, + 25078 - 11904: 0xC369, + 25079 - 11904: 0xC368, + 25080 - 11904: 0xC461, + 25081 - 11904: 0xF44A, + 25082 - 11904: 0xC462, + 25083 - 11904: 0xF241, + 25084 - 11904: 0xC4DF, + 25085 - 11904: 0xF5CC, + 25086 - 11904: 0xC4E0, + 25087 - 11904: 0xC574, + 25088 - 11904: 0xC5CA, + 25089 - 11904: 0xF7D9, + 25091 - 11904: 0xF7DA, + 25092 - 11904: 0xF7DB, + 25095 - 11904: 0xF9BA, + 25096 - 11904: 0xA4E0, + 25097 - 11904: 0xC97C, + 25098 - 11904: 0xA5B3, + 25100 - 11904: 0xA6A6, + 25101 - 11904: 0xA6A7, + 25102 - 11904: 0xA6A5, + 25104 - 11904: 0xA6A8, + 25105 - 11904: 0xA7DA, + 25106 - 11904: 0xA7D9, + 25108 - 11904: 0xCCB1, + 25109 - 11904: 0xA9CF, + 25110 - 11904: 0xA9CE, + 25113 - 11904: 0xD1AF, + 25114 - 11904: 0xB1AD, + 25115 - 11904: 0xB1AE, + 25119 - 11904: 0xB475, + 25120 - 11904: 0xDD72, + 25121 - 11904: 0xB760, + 25122 - 11904: 0xB761, + 25123 - 11904: 0xDD74, + 25124 - 11904: 0xDD76, + 25125 - 11904: 0xDD75, + 25127 - 11904: 0xE1D7, + 25129 - 11904: 0xE1D6, + 25130 - 11904: 0xBA49, + 25131 - 11904: 0xE1D8, + 25132 - 11904: 0x8D79, + 25133 - 11904: 0xE5AC, + 25134 - 11904: 0xBCAE, + 25136 - 11904: 0xBED4, + 25138 - 11904: 0xC0B8, + 25139 - 11904: 0xC257, + 25140 - 11904: 0xC0B9, + 25142 - 11904: 0xA4E1, + 25143 - 11904: 0x8BFC, + 25145 - 11904: 0xA076, + 25146 - 11904: 0xCAE6, + 25149 - 11904: 0xCCB2, + 25150 - 11904: 0xA9D1, + 25151 - 11904: 0xA9D0, + 25152 - 11904: 0xA9D2, + 25153 - 11904: 0xABF3, + 25154 - 11904: 0xCED2, + 25155 - 11904: 0xCED3, + 25158 - 11904: 0xD1B0, + 25159 - 11904: 0xAEB0, + 25160 - 11904: 0xB1AF, + 25161 - 11904: 0xB476, + 25162 - 11904: 0xD951, + 25163 - 11904: 0xA4E2, + 25164 - 11904: 0x8BCD, + 25165 - 11904: 0xA47E, + 25166 - 11904: 0xA4E3, + 25168 - 11904: 0xC97D, + 25169 - 11904: 0xA5B7, + 25170 - 11904: 0xA5B6, + 25171 - 11904: 0xA5B4, + 25172 - 11904: 0xA5B5, + 25176 - 11904: 0xA6AB, + 25177 - 11904: 0xC9E9, + 25178 - 11904: 0xC9EB, + 25179 - 11904: 0xA6AA, + 25180 - 11904: 0xC9E3, + 25182 - 11904: 0xC9E4, + 25184 - 11904: 0xC9EA, + 25185 - 11904: 0xC9E6, + 25186 - 11904: 0xC9E8, + 25187 - 11904: 0xA6A9, + 25188 - 11904: 0xC9E5, + 25189 - 11904: 0xC9EC, + 25190 - 11904: 0xC9E7, + 25192 - 11904: 0x9F5A, + 25197 - 11904: 0xA7E1, + 25198 - 11904: 0xA7EA, + 25199 - 11904: 0xA7E8, + 25200 - 11904: 0xCAF0, + 25201 - 11904: 0xCAED, + 25202 - 11904: 0xCAF5, + 25203 - 11904: 0xA7E6, + 25204 - 11904: 0xCAF6, + 25206 - 11904: 0xA7DF, + 25207 - 11904: 0xCAF3, + 25209 - 11904: 0xA7E5, + 25210 - 11904: 0xCAEF, + 25211 - 11904: 0xCAEE, + 25212 - 11904: 0xA7E3, + 25213 - 11904: 0xCAF4, + 25214 - 11904: 0xA7E4, + 25215 - 11904: 0xA9D3, + 25216 - 11904: 0xA7DE, + 25217 - 11904: 0xCAF1, + 25218 - 11904: 0x9FF4, + 25219 - 11904: 0xCAE7, + 25220 - 11904: 0xA7DB, + 25221 - 11904: 0x9FBA, + 25222 - 11904: 0xA7EE, + 25223 - 11904: 0xCAEC, + 25224 - 11904: 0xCAF2, + 25225 - 11904: 0xA7E0, + 25226 - 11904: 0xA7E2, + 25228 - 11904: 0xCAE8, + 25230 - 11904: 0xCAE9, + 25231 - 11904: 0xCAEA, + 25232 - 11904: 0x8D7A, + 25233 - 11904: 0xA7ED, + 25234 - 11904: 0xA7E7, + 25235 - 11904: 0xA7EC, + 25236 - 11904: 0xCAEB, + 25237 - 11904: 0xA7EB, + 25238 - 11904: 0xA7DD, + 25239 - 11904: 0xA7DC, + 25240 - 11904: 0xA7E9, + 25245 - 11904: 0x9E45, + 25252 - 11904: 0x93B0, + 25254 - 11904: 0xA075, + 25256 - 11904: 0xA9E1, + 25257 - 11904: 0xCCBE, + 25258 - 11904: 0xCCB7, + 25259 - 11904: 0xA9DC, + 25260 - 11904: 0xA9EF, + 25261 - 11904: 0xCCB3, + 25262 - 11904: 0xCCBA, + 25263 - 11904: 0xCCBC, + 25264 - 11904: 0xCCBF, + 25265 - 11904: 0xA9EA, + 25267 - 11904: 0xCCBB, + 25268 - 11904: 0xCCB4, + 25269 - 11904: 0xA9E8, + 25270 - 11904: 0xCCB8, + 25272 - 11904: 0xCCC0, + 25273 - 11904: 0xA9D9, + 25275 - 11904: 0xCCBD, + 25276 - 11904: 0xA9E3, + 25277 - 11904: 0xA9E2, + 25278 - 11904: 0xCCB6, + 25279 - 11904: 0xA9D7, + 25281 - 11904: 0x87DD, + 25282 - 11904: 0xA9D8, + 25283 - 11904: 0x9B46, + 25284 - 11904: 0xA9D6, + 25285 - 11904: 0xFCAE, + 25286 - 11904: 0xA9EE, + 25287 - 11904: 0xA9E6, + 25288 - 11904: 0xA9E0, + 25289 - 11904: 0xA9D4, + 25290 - 11904: 0xCCB9, + 25291 - 11904: 0xA9DF, + 25292 - 11904: 0xA9D5, + 25293 - 11904: 0xA9E7, + 25294 - 11904: 0xA9F0, + 25295 - 11904: 0xCED4, + 25296 - 11904: 0xA9E4, + 25297 - 11904: 0xCCB5, + 25298 - 11904: 0xA9DA, + 25299 - 11904: 0xA9DD, + 25300 - 11904: 0xA9DE, + 25301 - 11904: 0xFCB0, + 25302 - 11904: 0xA9EC, + 25303 - 11904: 0xA9ED, + 25304 - 11904: 0xA9EB, + 25305 - 11904: 0xA9E5, + 25306 - 11904: 0xA9E9, + 25307 - 11904: 0xA9DB, + 25308 - 11904: 0xABF4, + 25311 - 11904: 0xFA51, + 25317 - 11904: 0x8D7B, + 25323 - 11904: 0xCEDA, + 25324 - 11904: 0xAC41, + 25325 - 11904: 0xABF8, + 25326 - 11904: 0xABFA, + 25327 - 11904: 0xAC40, + 25328 - 11904: 0xCEE6, + 25329 - 11904: 0xABFD, + 25330 - 11904: 0xD1B1, + 25331 - 11904: 0xAEB1, + 25332 - 11904: 0xAC43, + 25333 - 11904: 0xCED7, + 25334 - 11904: 0xCEDF, + 25335 - 11904: 0xABFE, + 25336 - 11904: 0xCEDE, + 25337 - 11904: 0xCEDB, + 25338 - 11904: 0xCEE3, + 25339 - 11904: 0xCEE5, + 25340 - 11904: 0xABF7, + 25341 - 11904: 0xABFB, + 25342 - 11904: 0xAC42, + 25343 - 11904: 0xAEB3, + 25344 - 11904: 0xCEE0, + 25345 - 11904: 0xABF9, + 25346 - 11904: 0xAC45, + 25347 - 11904: 0xCED9, + 25351 - 11904: 0xABFC, + 25352 - 11904: 0xAEB2, + 25353 - 11904: 0xABF6, + 25355 - 11904: 0xCED6, + 25356 - 11904: 0xCEDD, + 25357 - 11904: 0xCED5, + 25358 - 11904: 0xCED8, + 25359 - 11904: 0xCEDC, + 25360 - 11904: 0xD1B2, + 25361 - 11904: 0xAC44, + 25363 - 11904: 0xCEE1, + 25364 - 11904: 0xCEE2, + 25365 - 11904: 0xCEE4, + 25366 - 11904: 0xABF5, + 25368 - 11904: 0x8D7C, + 25384 - 11904: 0xAEC1, + 25385 - 11904: 0xD1BE, + 25386 - 11904: 0xAEBF, + 25387 - 11904: 0xAEC0, + 25388 - 11904: 0xD1B4, + 25389 - 11904: 0xD1C4, + 25390 - 11904: 0x9ED6, + 25391 - 11904: 0xAEB6, + 25393 - 11904: 0x93AC, + 25394 - 11904: 0xD566, + 25395 - 11904: 0xD1C6, + 25396 - 11904: 0xD1C0, + 25397 - 11904: 0x9F5B, + 25398 - 11904: 0xD1B7, + 25399 - 11904: 0x93A9, + 25400 - 11904: 0xD1C9, + 25401 - 11904: 0xD1BA, + 25402 - 11904: 0xAEBC, + 25403 - 11904: 0xD57D, + 25404 - 11904: 0xD1BD, + 25405 - 11904: 0xAEBE, + 25406 - 11904: 0xAEB5, + 25408 - 11904: 0xD1CB, + 25409 - 11904: 0xD1BF, + 25410 - 11904: 0xAEB8, + 25411 - 11904: 0xD1B8, + 25412 - 11904: 0xD1B5, + 25413 - 11904: 0xD1B6, + 25414 - 11904: 0xAEB9, + 25415 - 11904: 0xD1C5, + 25416 - 11904: 0xD1CC, + 25417 - 11904: 0xAEBB, + 25418 - 11904: 0xD1BC, + 25419 - 11904: 0xD1BB, + 25420 - 11904: 0xAEC3, + 25421 - 11904: 0xAEC2, + 25422 - 11904: 0xAEB4, + 25423 - 11904: 0xAEBA, + 25424 - 11904: 0xAEBD, + 25425 - 11904: 0xD1C8, + 25428 - 11904: 0xD1C2, + 25429 - 11904: 0xAEB7, + 25430 - 11904: 0xD1B3, + 25431 - 11904: 0xD1CA, + 25432 - 11904: 0xD1C1, + 25433 - 11904: 0xD1C3, + 25434 - 11904: 0xD1C7, + 25444 - 11904: 0xA07C, + 25445 - 11904: 0xD567, + 25447 - 11904: 0xB1B7, + 25448 - 11904: 0xB1CB, + 25449 - 11904: 0xB1CA, + 25451 - 11904: 0xB1BF, + 25452 - 11904: 0xFCB2, + 25453 - 11904: 0xD579, + 25454 - 11904: 0xD575, + 25455 - 11904: 0xD572, + 25456 - 11904: 0xD5A6, + 25457 - 11904: 0xB1BA, + 25458 - 11904: 0xB1B2, + 25461 - 11904: 0xD577, + 25462 - 11904: 0xB4A8, + 25463 - 11904: 0xB1B6, + 25464 - 11904: 0xD5A1, + 25465 - 11904: 0x8AC1, + 25466 - 11904: 0xB1CC, + 25467 - 11904: 0xB1C9, + 25468 - 11904: 0xD57B, + 25469 - 11904: 0xD56A, + 25471 - 11904: 0x9FB4, + 25472 - 11904: 0xB1C8, + 25473 - 11904: 0xD5A3, + 25474 - 11904: 0xD569, + 25475 - 11904: 0xB1BD, + 25476 - 11904: 0xB1C1, + 25477 - 11904: 0xD5A2, + 25479 - 11904: 0xD573, + 25480 - 11904: 0xB1C2, + 25481 - 11904: 0xB1BC, + 25482 - 11904: 0xD568, + 25483 - 11904: 0xFCAC, + 25484 - 11904: 0xB478, + 25485 - 11904: 0xD5A5, + 25486 - 11904: 0xD571, + 25487 - 11904: 0xB1C7, + 25488 - 11904: 0xD574, + 25489 - 11904: 0xD5A4, + 25490 - 11904: 0xB1C6, + 25492 - 11904: 0xD952, + 25494 - 11904: 0xB1B3, + 25495 - 11904: 0xD56F, + 25496 - 11904: 0xB1B8, + 25497 - 11904: 0xB1C3, + 25499 - 11904: 0xB1BE, + 25500 - 11904: 0xD578, + 25501 - 11904: 0xD56E, + 25502 - 11904: 0xD56C, + 25503 - 11904: 0xD57E, + 25504 - 11904: 0xB1B0, + 25505 - 11904: 0xB1C4, + 25506 - 11904: 0xB1B4, + 25507 - 11904: 0xB477, + 25508 - 11904: 0xD57C, + 25509 - 11904: 0xB1B5, + 25511 - 11904: 0xB1B1, + 25512 - 11904: 0xB1C0, + 25513 - 11904: 0xB1BB, + 25514 - 11904: 0xB1B9, + 25515 - 11904: 0xD570, + 25516 - 11904: 0xB1C5, + 25517 - 11904: 0xD56D, + 25518 - 11904: 0xD57A, + 25519 - 11904: 0xD576, + 25520 - 11904: 0xD954, + 25521 - 11904: 0xD953, + 25529 - 11904: 0x9E4C, + 25533 - 11904: 0xD56B, + 25534 - 11904: 0xD964, + 25536 - 11904: 0xB47A, + 25537 - 11904: 0x8FC5, + 25538 - 11904: 0xD96A, + 25539 - 11904: 0xD959, + 25540 - 11904: 0xD967, + 25541 - 11904: 0xDD77, + 25542 - 11904: 0xB47D, + 25543 - 11904: 0xD96B, + 25544 - 11904: 0xD96E, + 25545 - 11904: 0xB47C, + 25546 - 11904: 0xD95C, + 25547 - 11904: 0xD96D, + 25548 - 11904: 0xD96C, + 25549 - 11904: 0xB47E, + 25550 - 11904: 0xD955, + 25551 - 11904: 0xB479, + 25552 - 11904: 0xB4A3, + 25553 - 11904: 0x93AD, + 25554 - 11904: 0xB4A1, + 25555 - 11904: 0xD969, + 25557 - 11904: 0xD95F, + 25558 - 11904: 0xB4A5, + 25559 - 11904: 0xD970, + 25560 - 11904: 0xD968, + 25561 - 11904: 0xD971, + 25562 - 11904: 0xB4AD, + 25563 - 11904: 0xB4AB, + 25564 - 11904: 0xD966, + 25565 - 11904: 0xD965, + 25566 - 11904: 0x9DC3, + 25567 - 11904: 0xD963, + 25568 - 11904: 0xD95D, + 25569 - 11904: 0xB4A4, + 25570 - 11904: 0x8DA2, + 25571 - 11904: 0xB4A2, + 25572 - 11904: 0xD1B9, + 25573 - 11904: 0xD956, + 25574 - 11904: 0x9D4A, + 25575 - 11904: 0xDDB7, + 25576 - 11904: 0xD957, + 25577 - 11904: 0xB47B, + 25578 - 11904: 0xB4AA, + 25579 - 11904: 0xDD79, + 25581 - 11904: 0xB4A6, + 25582 - 11904: 0xB4A7, + 25583 - 11904: 0xD958, + 25584 - 11904: 0xD96F, + 25585 - 11904: 0xDD78, + 25586 - 11904: 0xD960, + 25587 - 11904: 0xD95B, + 25588 - 11904: 0xB4A9, + 25589 - 11904: 0xD961, + 25590 - 11904: 0xD95E, + 25592 - 11904: 0xFCB6, + 25593 - 11904: 0xB4AE, + 25595 - 11904: 0x8DA3, + 25596 - 11904: 0x9E4B, + 25598 - 11904: 0x9E4D, + 25606 - 11904: 0xB770, + 25607 - 11904: 0x8DA4, + 25609 - 11904: 0xDD7C, + 25610 - 11904: 0xDDB1, + 25611 - 11904: 0xDDB6, + 25612 - 11904: 0xDDAA, + 25613 - 11904: 0xB76C, + 25614 - 11904: 0xDDBB, + 25615 - 11904: 0xB769, + 25616 - 11904: 0xDD7A, + 25618 - 11904: 0xDD7B, + 25619 - 11904: 0xB762, + 25620 - 11904: 0xB76B, + 25621 - 11904: 0xDDA4, + 25622 - 11904: 0xB76E, + 25623 - 11904: 0xB76F, + 25624 - 11904: 0xDDA5, + 25626 - 11904: 0xDDB2, + 25627 - 11904: 0xDDB8, + 25628 - 11904: 0xB76A, + 25630 - 11904: 0xB764, + 25631 - 11904: 0xDDA3, + 25632 - 11904: 0xDD7D, + 25633 - 11904: 0xDDBA, + 25634 - 11904: 0xDDA8, + 25635 - 11904: 0xDDA9, + 25636 - 11904: 0xDD7E, + 25637 - 11904: 0xDDB4, + 25638 - 11904: 0xDDAB, + 25639 - 11904: 0xDDB5, + 25640 - 11904: 0xDDAD, + 25642 - 11904: 0xB765, + 25643 - 11904: 0xE1D9, + 25644 - 11904: 0xB768, + 25645 - 11904: 0xB766, + 25646 - 11904: 0xDDB9, + 25647 - 11904: 0xDDB0, + 25648 - 11904: 0xDDAC, + 25650 - 11904: 0x8AFD, + 25651 - 11904: 0xDDA1, + 25652 - 11904: 0xBA53, + 25653 - 11904: 0xDDAF, + 25654 - 11904: 0xB76D, + 25655 - 11904: 0xDDA7, + 25656 - 11904: 0xFCB5, + 25657 - 11904: 0xDDA6, + 25658 - 11904: 0xFCC3, + 25659 - 11904: 0x93B2, + 25661 - 11904: 0xB767, + 25662 - 11904: 0xB763, + 25663 - 11904: 0xE1EE, + 25664 - 11904: 0xDDB3, + 25665 - 11904: 0xDDAE, + 25667 - 11904: 0xDDA2, + 25675 - 11904: 0xE1E9, + 25677 - 11904: 0xE1DA, + 25678 - 11904: 0xE1E5, + 25680 - 11904: 0xE1EC, + 25681 - 11904: 0xBA51, + 25682 - 11904: 0xB4AC, + 25683 - 11904: 0xE1EA, + 25684 - 11904: 0xBA4C, + 25688 - 11904: 0xBA4B, + 25689 - 11904: 0xE1F1, + 25690 - 11904: 0x8DA5, + 25691 - 11904: 0xE1DB, + 25692 - 11904: 0xE1E8, + 25693 - 11904: 0xE1DC, + 25694 - 11904: 0xE1E7, + 25695 - 11904: 0xBA4F, + 25696 - 11904: 0xE1EB, + 25697 - 11904: 0xD962, + 25701 - 11904: 0xE1F2, + 25702 - 11904: 0xE1E3, + 25703 - 11904: 0xBA52, + 25704 - 11904: 0xE5BA, + 25705 - 11904: 0xBCAF, + 25707 - 11904: 0xE1F0, + 25708 - 11904: 0xE1EF, + 25709 - 11904: 0xBA54, + 25710 - 11904: 0xE5AD, + 25711 - 11904: 0xBCB0, + 25712 - 11904: 0xE5AE, + 25713 - 11904: 0x93A1, + 25714 - 11904: 0xE1DF, + 25715 - 11904: 0xE1E0, + 25716 - 11904: 0xE1DD, + 25717 - 11904: 0xE1E2, + 25718 - 11904: 0xE1DE, + 25719 - 11904: 0xE1F3, + 25720 - 11904: 0xBA4E, + 25721 - 11904: 0xBCB1, + 25722 - 11904: 0xBA50, + 25723 - 11904: 0xBA55, + 25724 - 11904: 0x8AC6, + 25725 - 11904: 0xE1E1, + 25727 - 11904: 0xE1ED, + 25730 - 11904: 0xE1E6, + 25733 - 11904: 0xE5B1, + 25735 - 11904: 0xBA4A, + 25736 - 11904: 0xBCB4, + 25737 - 11904: 0xE9AA, + 25738 - 11904: 0xE5B6, + 25739 - 11904: 0xE5B5, + 25740 - 11904: 0xE5B7, + 25741 - 11904: 0x8A5B, + 25743 - 11904: 0xE5B4, + 25744 - 11904: 0xFCB9, + 25745 - 11904: 0x894D, + 25746 - 11904: 0xBCBB, + 25747 - 11904: 0xBCB8, + 25749 - 11904: 0xBCB9, + 25750 - 11904: 0xE5AF, + 25751 - 11904: 0xE5B2, + 25752 - 11904: 0xE5BC, + 25753 - 11904: 0xBCC1, + 25754 - 11904: 0xBCBF, + 25756 - 11904: 0xE5B3, + 25757 - 11904: 0xD95A, + 25758 - 11904: 0xBCB2, + 25759 - 11904: 0xE5B9, + 25760 - 11904: 0xE5B0, + 25762 - 11904: 0xBCC2, + 25763 - 11904: 0xE5B8, + 25764 - 11904: 0xBA4D, + 25765 - 11904: 0xBCB7, + 25766 - 11904: 0xE1E4, + 25769 - 11904: 0xBCBA, + 25771 - 11904: 0xBCBE, + 25772 - 11904: 0xBCC0, + 25773 - 11904: 0xBCBD, + 25774 - 11904: 0xBCBC, + 25775 - 11904: 0xFED4, + 25776 - 11904: 0xBCB6, + 25777 - 11904: 0xE5BB, + 25778 - 11904: 0xBCB3, + 25779 - 11904: 0xBCC3, + 25780 - 11904: 0x8A78, + 25782 - 11904: 0x93AB, + 25787 - 11904: 0xBED8, + 25788 - 11904: 0xBED9, + 25789 - 11904: 0xE9A9, + 25790 - 11904: 0xBEE2, + 25791 - 11904: 0xBEDF, + 25792 - 11904: 0x8DA7, + 25793 - 11904: 0xBED6, + 25794 - 11904: 0xBEDD, + 25795 - 11904: 0xE9AB, + 25796 - 11904: 0xBEDB, + 25797 - 11904: 0xBED5, + 25799 - 11904: 0xBEDC, + 25801 - 11904: 0xE9A8, + 25802 - 11904: 0xC0BB, + 25803 - 11904: 0xBED7, + 25805 - 11904: 0xBEDE, + 25806 - 11904: 0xC0BA, + 25807 - 11904: 0xE9A7, + 25808 - 11904: 0xE9A6, + 25810 - 11904: 0xBEE0, + 25811 - 11904: 0x9F45, + 25812 - 11904: 0xBEE1, + 25814 - 11904: 0xE9A5, + 25815 - 11904: 0xE9A4, + 25816 - 11904: 0xC0BC, + 25817 - 11904: 0xE9AE, + 25818 - 11904: 0xBEDA, + 25819 - 11904: 0xE9AC, + 25821 - 11904: 0x8A56, + 25824 - 11904: 0xC0BD, + 25825 - 11904: 0xFCBF, + 25826 - 11904: 0xC0C2, + 25827 - 11904: 0xECEA, + 25828 - 11904: 0xECEC, + 25829 - 11904: 0xFCC0, + 25830 - 11904: 0xC0BF, + 25831 - 11904: 0x8EE6, + 25832 - 11904: 0xECED, + 25833 - 11904: 0xECE9, + 25834 - 11904: 0x8AA4, + 25835 - 11904: 0xECEB, + 25836 - 11904: 0xC0C0, + 25837 - 11904: 0xC0C3, + 25839 - 11904: 0xECE8, + 25840 - 11904: 0xC0BE, + 25841 - 11904: 0xC0C1, + 25842 - 11904: 0xC259, + 25843 - 11904: 0xE9AD, + 25844 - 11904: 0xC258, + 25847 - 11904: 0xC25E, + 25848 - 11904: 0xEFD4, + 25850 - 11904: 0xC25C, + 25851 - 11904: 0xC25D, + 25852 - 11904: 0xEFD7, + 25853 - 11904: 0xEFD3, + 25854 - 11904: 0xC25A, + 25855 - 11904: 0xEFD1, + 25856 - 11904: 0xC36B, + 25857 - 11904: 0xEFD5, + 25859 - 11904: 0xEFD6, + 25860 - 11904: 0xEFD2, + 25862 - 11904: 0xC25B, + 25863 - 11904: 0xF242, + 25865 - 11904: 0xF245, + 25866 - 11904: 0x8943, + 25868 - 11904: 0xF246, + 25869 - 11904: 0xF244, + 25870 - 11904: 0xF247, + 25871 - 11904: 0xC36C, + 25872 - 11904: 0xF243, + 25873 - 11904: 0x93F3, + 25875 - 11904: 0xF44E, + 25876 - 11904: 0xC464, + 25877 - 11904: 0xF44D, + 25878 - 11904: 0xF44C, + 25879 - 11904: 0xF44B, + 25880 - 11904: 0xC463, + 25881 - 11904: 0xC465, + 25883 - 11904: 0xF5CD, + 25884 - 11904: 0xC4E2, + 25885 - 11904: 0xC4E1, + 25886 - 11904: 0xFCAB, + 25887 - 11904: 0x9EA2, + 25888 - 11904: 0xF6E1, + 25889 - 11904: 0xF6E0, + 25890 - 11904: 0xF6E3, + 25891 - 11904: 0xC5CB, + 25892 - 11904: 0xC575, + 25893 - 11904: 0xF7DD, + 25894 - 11904: 0xF6E2, + 25897 - 11904: 0xF7DC, + 25898 - 11904: 0xC5CD, + 25899 - 11904: 0xC5CC, + 25900 - 11904: 0xC5F3, + 25901 - 11904: 0xF8A9, + 25902 - 11904: 0xF8EF, + 25903 - 11904: 0xA4E4, + 25904 - 11904: 0x9DC7, + 25906 - 11904: 0xD972, + 25907 - 11904: 0xE9AF, + 25908 - 11904: 0xC6D2, + 25909 - 11904: 0x8BCE, + 25910 - 11904: 0xA6AC, + 25911 - 11904: 0xCAF7, + 25912 - 11904: 0xA7F1, + 25913 - 11904: 0xA7EF, + 25915 - 11904: 0xA7F0, + 25917 - 11904: 0xCCC1, + 25918 - 11904: 0xA9F1, + 25919 - 11904: 0xAC46, + 25921 - 11904: 0xCEE7, + 25923 - 11904: 0xCEE8, + 25925 - 11904: 0xAC47, + 25926 - 11904: 0xD1CE, + 25928 - 11904: 0xAEC4, + 25929 - 11904: 0xAEC5, + 25930 - 11904: 0xD1CD, + 25933 - 11904: 0xFCC5, + 25935 - 11904: 0xB1D3, + 25937 - 11904: 0xB1CF, + 25939 - 11904: 0xD5A7, + 25940 - 11904: 0xB1D6, + 25941 - 11904: 0xB1D5, + 25942 - 11904: 0xB1CE, + 25943 - 11904: 0xB1D1, + 25944 - 11904: 0xB1D4, + 25945 - 11904: 0xB1D0, + 25948 - 11904: 0xD976, + 25949 - 11904: 0xB1CD, + 25950 - 11904: 0xB4AF, + 25951 - 11904: 0xFCCB, + 25954 - 11904: 0xB4B1, + 25955 - 11904: 0xB4B2, + 25956 - 11904: 0xD975, + 25957 - 11904: 0xD978, + 25958 - 11904: 0xB4B0, + 25959 - 11904: 0xD973, + 25960 - 11904: 0xD977, + 25962 - 11904: 0xD974, + 25963 - 11904: 0x93B3, + 25964 - 11904: 0xB771, + 25965 - 11904: 0xFCCA, + 25967 - 11904: 0xDDBC, + 25970 - 11904: 0xBA56, + 25971 - 11904: 0xE1F4, + 25972 - 11904: 0xBEE3, + 25973 - 11904: 0xBCC4, + 25974 - 11904: 0xE5BD, + 25975 - 11904: 0xBCC5, + 25976 - 11904: 0xBCC6, + 25977 - 11904: 0xE5BF, + 25978 - 11904: 0xE5BE, + 25979 - 11904: 0xE5C0, + 25980 - 11904: 0xE9B1, + 25983 - 11904: 0xE9B0, + 25984 - 11904: 0xECEF, + 25985 - 11904: 0xECEE, + 25986 - 11904: 0xC0C4, + 25987 - 11904: 0xC0C5, + 25988 - 11904: 0xF248, + 25989 - 11904: 0xFCC9, + 25990 - 11904: 0x8DAC, + 25991 - 11904: 0xA4E5, + 25992 - 11904: 0xFBC6, + 25993 - 11904: 0x8967, + 25995 - 11904: 0x8C7E, + 25996 - 11904: 0xD979, + 26000 - 11904: 0xB4B4, + 26001 - 11904: 0xB4B3, + 26002 - 11904: 0xDDBD, + 26004 - 11904: 0xEFD8, + 26005 - 11904: 0xC4E3, + 26006 - 11904: 0xF7DE, + 26007 - 11904: 0xA4E6, + 26009 - 11904: 0xAEC6, + 26011 - 11904: 0xB1D8, + 26012 - 11904: 0xB1D7, + 26013 - 11904: 0xD97A, + 26014 - 11904: 0xD97B, + 26015 - 11904: 0xB772, + 26016 - 11904: 0xE1F5, + 26017 - 11904: 0xBA57, + 26018 - 11904: 0xE9B2, + 26020 - 11904: 0xA4E7, + 26021 - 11904: 0xA5B8, + 26023 - 11904: 0xA9F2, + 26024 - 11904: 0xCCC2, + 26026 - 11904: 0xCEE9, + 26027 - 11904: 0xAC48, + 26028 - 11904: 0xB1D9, + 26030 - 11904: 0xD97C, + 26031 - 11904: 0xB4B5, + 26032 - 11904: 0xB773, + 26034 - 11904: 0xE5C1, + 26035 - 11904: 0xE5C2, + 26037 - 11904: 0xFCCD, + 26038 - 11904: 0xECF0, + 26039 - 11904: 0xC25F, + 26040 - 11904: 0xF8F0, + 26041 - 11904: 0xA4E8, + 26043 - 11904: 0xCCC3, + 26044 - 11904: 0xA9F3, + 26045 - 11904: 0xAC49, + 26046 - 11904: 0x9CF3, + 26047 - 11904: 0xCEEA, + 26049 - 11904: 0xAEC7, + 26050 - 11904: 0xD1D2, + 26051 - 11904: 0xD1D0, + 26052 - 11904: 0xD1D1, + 26053 - 11904: 0xAEC8, + 26054 - 11904: 0xD1CF, + 26059 - 11904: 0xB1DB, + 26060 - 11904: 0xB1DC, + 26061 - 11904: 0xD5A8, + 26062 - 11904: 0xB1DD, + 26063 - 11904: 0xB1DA, + 26064 - 11904: 0xD97D, + 26065 - 11904: 0xFCD0, + 26066 - 11904: 0xD97E, + 26067 - 11904: 0xDDBE, + 26068 - 11904: 0x95BB, + 26070 - 11904: 0xBA59, + 26071 - 11904: 0xBA58, + 26074 - 11904: 0xECF1, + 26075 - 11904: 0xEFD9, + 26077 - 11904: 0xF24A, + 26078 - 11904: 0xF249, + 26079 - 11904: 0xF44F, + 26080 - 11904: 0xFCD3, + 26081 - 11904: 0xC95E, + 26082 - 11904: 0xAC4A, + 26083 - 11904: 0xFCD4, + 26085 - 11904: 0xA4E9, + 26086 - 11904: 0xA5B9, + 26088 - 11904: 0xA6AE, + 26089 - 11904: 0xA6AD, + 26092 - 11904: 0xA6AF, + 26093 - 11904: 0xA6B0, + 26094 - 11904: 0xC9EE, + 26095 - 11904: 0xC9ED, + 26096 - 11904: 0xCAF8, + 26097 - 11904: 0xA7F2, + 26098 - 11904: 0xCAFB, + 26099 - 11904: 0xCAFA, + 26100 - 11904: 0xCAF9, + 26101 - 11904: 0xCAFC, + 26106 - 11904: 0xA9F4, + 26107 - 11904: 0xCCC9, + 26108 - 11904: 0xCCC5, + 26109 - 11904: 0xCCCE, + 26111 - 11904: 0x8DAE, + 26112 - 11904: 0xA9FB, + 26114 - 11904: 0xA9F9, + 26115 - 11904: 0xCCCA, + 26116 - 11904: 0xCCC6, + 26117 - 11904: 0xCCCD, + 26118 - 11904: 0xA9F8, + 26119 - 11904: 0xAA40, + 26120 - 11904: 0xCCC8, + 26121 - 11904: 0xCCC4, + 26122 - 11904: 0xA9FE, + 26123 - 11904: 0xCCCB, + 26124 - 11904: 0xA9F7, + 26125 - 11904: 0xCCCC, + 26126 - 11904: 0xA9FA, + 26127 - 11904: 0xA9FC, + 26128 - 11904: 0xCCD0, + 26129 - 11904: 0xCCCF, + 26130 - 11904: 0xCCC7, + 26131 - 11904: 0xA9F6, + 26132 - 11904: 0xA9F5, + 26133 - 11904: 0xA9FD, + 26136 - 11904: 0xFCD7, + 26140 - 11904: 0xCEEF, + 26141 - 11904: 0xCEF5, + 26142 - 11904: 0x93DB, + 26143 - 11904: 0xAC50, + 26144 - 11904: 0xAC4D, + 26145 - 11904: 0xCEEC, + 26146 - 11904: 0xCEF1, + 26147 - 11904: 0xFE63, + 26148 - 11904: 0xAC53, + 26149 - 11904: 0xAC4B, + 26150 - 11904: 0xCEF0, + 26151 - 11904: 0xAC4E, + 26152 - 11904: 0xAC51, + 26155 - 11904: 0xCEF3, + 26157 - 11904: 0xAC4C, + 26158 - 11904: 0xCEF8, + 26159 - 11904: 0xAC4F, + 26160 - 11904: 0x93D5, + 26161 - 11904: 0xAC52, + 26162 - 11904: 0xCEED, + 26163 - 11904: 0xCEF2, + 26164 - 11904: 0xCEF6, + 26165 - 11904: 0xCEEE, + 26166 - 11904: 0xCEEB, + 26169 - 11904: 0xCEF7, + 26170 - 11904: 0xCEF4, + 26177 - 11904: 0xAED0, + 26178 - 11904: 0xAEC9, + 26179 - 11904: 0xAECC, + 26180 - 11904: 0xFCDA, + 26181 - 11904: 0xAECF, + 26183 - 11904: 0xD1D5, + 26184 - 11904: 0x9B71, + 26185 - 11904: 0xAECA, + 26186 - 11904: 0xD1D3, + 26187 - 11904: 0xFCDD, + 26188 - 11904: 0xAECE, + 26189 - 11904: 0x8764, + 26191 - 11904: 0xAECB, + 26193 - 11904: 0xD1D6, + 26194 - 11904: 0xAECD, + 26195 - 11904: 0x8DAF, + 26199 - 11904: 0xFAF2, + 26201 - 11904: 0xD5AC, + 26202 - 11904: 0xB1DF, + 26203 - 11904: 0xD5AB, + 26204 - 11904: 0xD5AD, + 26205 - 11904: 0xB1DE, + 26206 - 11904: 0xB1E3, + 26207 - 11904: 0xD1D4, + 26208 - 11904: 0x87B5, + 26209 - 11904: 0xD5AA, + 26210 - 11904: 0xD5AE, + 26211 - 11904: 0x93D8, + 26212 - 11904: 0xB1E0, + 26213 - 11904: 0xD5A9, + 26214 - 11904: 0xB1E2, + 26215 - 11904: 0xFCDF, + 26216 - 11904: 0xB1E1, + 26218 - 11904: 0xD9A7, + 26219 - 11904: 0x93D3, + 26220 - 11904: 0xD9A2, + 26222 - 11904: 0xB4B6, + 26223 - 11904: 0xB4BA, + 26224 - 11904: 0xB4B7, + 26225 - 11904: 0xD9A5, + 26226 - 11904: 0xD9A8, + 26227 - 11904: 0xFCE1, + 26228 - 11904: 0xFCE2, + 26230 - 11904: 0xB4B9, + 26231 - 11904: 0xB4BE, + 26232 - 11904: 0xDDC7, + 26233 - 11904: 0xD9A6, + 26234 - 11904: 0xB4BC, + 26235 - 11904: 0xD9A3, + 26236 - 11904: 0xD9A1, + 26237 - 11904: 0x8E76, + 26238 - 11904: 0xB4BD, + 26240 - 11904: 0xD9A4, + 26244 - 11904: 0xB779, + 26245 - 11904: 0xFC62, + 26246 - 11904: 0xDDBF, + 26247 - 11904: 0xB776, + 26248 - 11904: 0xB777, + 26249 - 11904: 0xB775, + 26250 - 11904: 0xDDC4, + 26251 - 11904: 0xDDC3, + 26252 - 11904: 0xDDC0, + 26253 - 11904: 0xB77B, + 26254 - 11904: 0x93D1, + 26256 - 11904: 0xDDC2, + 26257 - 11904: 0xB4BB, + 26258 - 11904: 0x8DB1, + 26260 - 11904: 0xDDC6, + 26261 - 11904: 0xDDC1, + 26262 - 11904: 0xB778, + 26263 - 11904: 0xB774, + 26264 - 11904: 0xB77A, + 26265 - 11904: 0xDDC5, + 26266 - 11904: 0x9859, + 26269 - 11904: 0xBA5C, + 26271 - 11904: 0xE1F8, + 26272 - 11904: 0xE1F7, + 26273 - 11904: 0xE1F6, + 26274 - 11904: 0xBA5A, + 26276 - 11904: 0xFB52, + 26280 - 11904: 0xBA5B, + 26281 - 11904: 0xE5C5, + 26282 - 11904: 0xE5C8, + 26283 - 11904: 0xBCC8, + 26285 - 11904: 0xFB53, + 26286 - 11904: 0xBCC7, + 26287 - 11904: 0xE5C9, + 26288 - 11904: 0xE5C4, + 26289 - 11904: 0xBCCA, + 26290 - 11904: 0xE5C6, + 26291 - 11904: 0xFB4D, + 26292 - 11904: 0xBCC9, + 26293 - 11904: 0xE5C3, + 26294 - 11904: 0x9CBF, + 26295 - 11904: 0xE5C7, + 26296 - 11904: 0xBEE9, + 26297 - 11904: 0xBEE6, + 26298 - 11904: 0xE9BB, + 26299 - 11904: 0xE9BA, + 26301 - 11904: 0xE9B9, + 26302 - 11904: 0xE9B4, + 26303 - 11904: 0x9B72, + 26304 - 11904: 0xE9B5, + 26308 - 11904: 0xBEE7, + 26310 - 11904: 0xBEE4, + 26311 - 11904: 0xBEE8, + 26312 - 11904: 0xE9B3, + 26313 - 11904: 0xBEE5, + 26314 - 11904: 0xE9B6, + 26315 - 11904: 0xE9B7, + 26316 - 11904: 0xE9BC, + 26317 - 11904: 0xFB50, + 26318 - 11904: 0x93BE, + 26319 - 11904: 0xE9B8, + 26322 - 11904: 0xECF2, + 26326 - 11904: 0xC0C7, + 26328 - 11904: 0xEFDC, + 26329 - 11904: 0xC0C6, + 26330 - 11904: 0xEFDA, + 26331 - 11904: 0xEFDB, + 26332 - 11904: 0xC260, + 26333 - 11904: 0xC36E, + 26334 - 11904: 0xF24B, + 26336 - 11904: 0xC36D, + 26339 - 11904: 0xF451, + 26340 - 11904: 0xF452, + 26342 - 11904: 0xC466, + 26343 - 11904: 0x8CDB, + 26344 - 11904: 0xF450, + 26345 - 11904: 0xC4E4, + 26347 - 11904: 0xF7DF, + 26348 - 11904: 0xC5CE, + 26349 - 11904: 0xF8AA, + 26350 - 11904: 0xF8AB, + 26352 - 11904: 0xA4EA, + 26353 - 11904: 0x9DF1, + 26354 - 11904: 0xA6B1, + 26355 - 11904: 0xA6B2, + 26356 - 11904: 0xA7F3, + 26358 - 11904: 0xCCD1, + 26359 - 11904: 0xAC54, + 26360 - 11904: 0xAED1, + 26361 - 11904: 0xB1E4, + 26364 - 11904: 0xB0D2, + 26366 - 11904: 0xB4BF, + 26367 - 11904: 0xB4C0, + 26368 - 11904: 0xB3CC, + 26369 - 11904: 0xD9A9, + 26370 - 11904: 0xFCEB, + 26371 - 11904: 0xB77C, + 26372 - 11904: 0xE1FA, + 26373 - 11904: 0xE1F9, + 26376 - 11904: 0xA4EB, + 26377 - 11904: 0xA6B3, + 26378 - 11904: 0xCCD2, + 26379 - 11904: 0xAA42, + 26380 - 11904: 0xA0BB, + 26381 - 11904: 0xAA41, + 26382 - 11904: 0x9B7E, + 26383 - 11904: 0xCEF9, + 26384 - 11904: 0xCEFA, + 26386 - 11904: 0xD1D7, + 26387 - 11904: 0xD1D8, + 26388 - 11904: 0xAED2, + 26389 - 11904: 0xAED3, + 26390 - 11904: 0x8DB3, + 26391 - 11904: 0xAED4, + 26392 - 11904: 0xD5AF, + 26393 - 11904: 0x8C52, + 26395 - 11904: 0xB1E6, + 26397 - 11904: 0xB4C2, + 26398 - 11904: 0x9AE8, + 26399 - 11904: 0xB4C1, + 26400 - 11904: 0xDDC8, + 26401 - 11904: 0xDF7A, + 26402 - 11904: 0xE1FB, + 26403 - 11904: 0xE9BD, + 26405 - 11904: 0x8EDC, + 26406 - 11904: 0xC261, + 26407 - 11904: 0xC467, + 26408 - 11904: 0xA4EC, + 26410 - 11904: 0xA5BC, + 26411 - 11904: 0xA5BD, + 26412 - 11904: 0xA5BB, + 26413 - 11904: 0xA5BE, + 26414 - 11904: 0xA5BA, + 26417 - 11904: 0xA6B6, + 26419 - 11904: 0xC9F6, + 26420 - 11904: 0xA6B5, + 26421 - 11904: 0xA6B7, + 26422 - 11904: 0x9CF9, + 26424 - 11904: 0xC9F1, + 26425 - 11904: 0xC9F0, + 26426 - 11904: 0xC9F3, + 26427 - 11904: 0xC9F2, + 26428 - 11904: 0xC9F5, + 26429 - 11904: 0xA6B4, + 26430 - 11904: 0xC9EF, + 26431 - 11904: 0xC9F4, + 26436 - 11904: 0xFA50, + 26437 - 11904: 0xCAFD, + 26438 - 11904: 0xA7FD, + 26439 - 11904: 0xCAFE, + 26440 - 11904: 0xCB43, + 26441 - 11904: 0xA7FC, + 26443 - 11904: 0xCB47, + 26444 - 11904: 0xCB42, + 26445 - 11904: 0xCB45, + 26446 - 11904: 0xA7F5, + 26447 - 11904: 0xA7F6, + 26448 - 11904: 0xA7F7, + 26449 - 11904: 0xA7F8, + 26451 - 11904: 0xA840, + 26453 - 11904: 0xCB41, + 26454 - 11904: 0xA7FA, + 26455 - 11904: 0xA841, + 26457 - 11904: 0xCB40, + 26458 - 11904: 0xCB46, + 26460 - 11904: 0xA7F9, + 26461 - 11904: 0xCB44, + 26462 - 11904: 0xFCF1, + 26463 - 11904: 0xA7F4, + 26464 - 11904: 0xA7FE, + 26465 - 11904: 0x98E7, + 26466 - 11904: 0xFCF3, + 26471 - 11904: 0xFCF2, + 26474 - 11904: 0xAA57, + 26475 - 11904: 0x8CCA, + 26476 - 11904: 0xCCD4, + 26477 - 11904: 0xAA43, + 26478 - 11904: 0x8775, + 26479 - 11904: 0xAA4D, + 26480 - 11904: 0xAA4E, + 26481 - 11904: 0xAA46, + 26482 - 11904: 0xAA58, + 26483 - 11904: 0xAA48, + 26484 - 11904: 0xCCDC, + 26485 - 11904: 0xAA53, + 26486 - 11904: 0xCCD7, + 26487 - 11904: 0xAA49, + 26488 - 11904: 0xCCE6, + 26489 - 11904: 0xCCE7, + 26490 - 11904: 0xCCDF, + 26491 - 11904: 0xCCD8, + 26492 - 11904: 0xAA56, + 26493 - 11904: 0xCCE4, + 26494 - 11904: 0xAA51, + 26495 - 11904: 0xAA4F, + 26497 - 11904: 0xCCE5, + 26498 - 11904: 0x87BA, + 26499 - 11904: 0xCCE3, + 26500 - 11904: 0xCCDB, + 26501 - 11904: 0xCCD3, + 26502 - 11904: 0xCCDA, + 26503 - 11904: 0xAA4A, + 26505 - 11904: 0xAA50, + 26507 - 11904: 0xAA44, + 26508 - 11904: 0xCCDE, + 26509 - 11904: 0xCCDD, + 26510 - 11904: 0xCCD5, + 26511 - 11904: 0x93E5, + 26512 - 11904: 0xAA52, + 26513 - 11904: 0xCCE1, + 26514 - 11904: 0xCCD6, + 26515 - 11904: 0xAA55, + 26516 - 11904: 0xCCE8, + 26517 - 11904: 0xAA45, + 26519 - 11904: 0xAA4C, + 26520 - 11904: 0xCCD9, + 26521 - 11904: 0xCCE2, + 26522 - 11904: 0xAA54, + 26524 - 11904: 0xAA47, + 26525 - 11904: 0xAA4B, + 26527 - 11904: 0xCCE0, + 26528 - 11904: 0x9A59, + 26532 - 11904: 0x8DB5, + 26540 - 11904: 0xFD4D, + 26542 - 11904: 0xCF5B, + 26543 - 11904: 0xAC5C, + 26544 - 11904: 0xAC69, + 26545 - 11904: 0xFD5E, + 26546 - 11904: 0xCF56, + 26547 - 11904: 0xCF4C, + 26548 - 11904: 0xAC62, + 26549 - 11904: 0xCF4A, + 26550 - 11904: 0xAC5B, + 26551 - 11904: 0xCF45, + 26552 - 11904: 0xAC65, + 26553 - 11904: 0xCF52, + 26554 - 11904: 0xCEFE, + 26555 - 11904: 0xCF41, + 26559 - 11904: 0x8F7D, + 26560 - 11904: 0xCF44, + 26561 - 11904: 0xCEFB, + 26562 - 11904: 0xCF51, + 26563 - 11904: 0xCF61, + 26564 - 11904: 0xAC60, + 26565 - 11904: 0xCF46, + 26566 - 11904: 0xCF58, + 26568 - 11904: 0xCEFD, + 26569 - 11904: 0xCF5F, + 26570 - 11904: 0xCF60, + 26571 - 11904: 0xCF63, + 26572 - 11904: 0xCF5A, + 26573 - 11904: 0xCF4B, + 26574 - 11904: 0xCF53, + 26575 - 11904: 0xAC66, + 26576 - 11904: 0xAC59, + 26577 - 11904: 0xAC61, + 26578 - 11904: 0xAC6D, + 26579 - 11904: 0xAC56, + 26580 - 11904: 0xAC58, + 26582 - 11904: 0x9547, + 26583 - 11904: 0xFCF6, + 26584 - 11904: 0xCF43, + 26585 - 11904: 0xAC6A, + 26586 - 11904: 0xAC63, + 26587 - 11904: 0xCF5D, + 26588 - 11904: 0xCF40, + 26589 - 11904: 0xAC6C, + 26590 - 11904: 0xAC67, + 26591 - 11904: 0xCF49, + 26594 - 11904: 0xAC6B, + 26595 - 11904: 0xCF50, + 26596 - 11904: 0xCF48, + 26597 - 11904: 0xAC64, + 26598 - 11904: 0xCF5C, + 26599 - 11904: 0xCF54, + 26601 - 11904: 0xAC5E, + 26602 - 11904: 0xCF62, + 26603 - 11904: 0xCF47, + 26604 - 11904: 0xAC5A, + 26605 - 11904: 0xCF59, + 26606 - 11904: 0xCF4F, + 26607 - 11904: 0xAC5F, + 26608 - 11904: 0xCF55, + 26609 - 11904: 0xAC57, + 26610 - 11904: 0xCEFC, + 26611 - 11904: 0xAC68, + 26612 - 11904: 0xAEE3, + 26613 - 11904: 0xAC5D, + 26614 - 11904: 0xCF4E, + 26615 - 11904: 0xCF4D, + 26616 - 11904: 0xCF42, + 26617 - 11904: 0x9250, + 26618 - 11904: 0xCF5E, + 26620 - 11904: 0xCF57, + 26622 - 11904: 0x8968, + 26623 - 11904: 0xAC55, + 26624 - 11904: 0x8DB6, + 26625 - 11904: 0xFCFB, + 26626 - 11904: 0xA07D, + 26627 - 11904: 0x98FC, + 26628 - 11904: 0x8969, + 26637 - 11904: 0xFE4F, + 26640 - 11904: 0x9256, + 26642 - 11904: 0xD1EC, + 26643 - 11904: 0xAEEA, + 26644 - 11904: 0xD1ED, + 26646 - 11904: 0xD1E1, + 26647 - 11904: 0xAEDF, + 26648 - 11904: 0xAEEB, + 26650 - 11904: 0xD1DA, + 26651 - 11904: 0xFAC9, + 26652 - 11904: 0xD1E3, + 26653 - 11904: 0xD1EB, + 26654 - 11904: 0x93E8, + 26655 - 11904: 0xD1D9, + 26656 - 11904: 0xD1F4, + 26657 - 11904: 0xAED5, + 26658 - 11904: 0xFCF8, + 26661 - 11904: 0xD1F3, + 26662 - 11904: 0xD1EE, + 26664 - 11904: 0xD1EF, + 26665 - 11904: 0xAEDD, + 26666 - 11904: 0xAEE8, + 26667 - 11904: 0xD1E5, + 26669 - 11904: 0xD1E6, + 26670 - 11904: 0xD1F0, + 26671 - 11904: 0xD1E7, + 26673 - 11904: 0xD1E2, + 26674 - 11904: 0xD1DC, + 26675 - 11904: 0xD1DD, + 26676 - 11904: 0xD1EA, + 26677 - 11904: 0xD1E4, + 26678 - 11904: 0x9CE3, + 26679 - 11904: 0xFDA9, + 26680 - 11904: 0xAED6, + 26681 - 11904: 0xAEDA, + 26682 - 11904: 0xD1F2, + 26683 - 11904: 0xD1DE, + 26684 - 11904: 0xAEE6, + 26685 - 11904: 0xAEE2, + 26686 - 11904: 0xFC44, + 26688 - 11904: 0xAEE5, + 26689 - 11904: 0xAEEC, + 26690 - 11904: 0xAEDB, + 26691 - 11904: 0xAEE7, + 26692 - 11904: 0xD1E9, + 26693 - 11904: 0xAEE9, + 26694 - 11904: 0xAED8, + 26695 - 11904: 0x9640, + 26696 - 11904: 0xAED7, + 26697 - 11904: 0xD1DB, + 26698 - 11904: 0x8DB8, + 26699 - 11904: 0xD1DF, + 26700 - 11904: 0xAEE0, + 26701 - 11904: 0xD1F1, + 26702 - 11904: 0xD1E8, + 26703 - 11904: 0xD1E0, + 26704 - 11904: 0xAEE4, + 26705 - 11904: 0xAEE1, + 26707 - 11904: 0xAED9, + 26708 - 11904: 0xAEDC, + 26709 - 11904: 0x9B4A, + 26710 - 11904: 0x8FB9, + 26717 - 11904: 0xFCFE, + 26725 - 11904: 0x896A, + 26731 - 11904: 0xD5C4, + 26733 - 11904: 0xD5B4, + 26734 - 11904: 0xD5B5, + 26735 - 11904: 0xD5B9, + 26737 - 11904: 0xD5C8, + 26738 - 11904: 0xD5C5, + 26740 - 11904: 0xD5BE, + 26741 - 11904: 0xD5BD, + 26742 - 11904: 0xB1ED, + 26743 - 11904: 0xD5C1, + 26744 - 11904: 0xD5D0, + 26745 - 11904: 0xD5B0, + 26747 - 11904: 0xD5D1, + 26748 - 11904: 0xD5C3, + 26749 - 11904: 0xD5D5, + 26750 - 11904: 0xD5C9, + 26751 - 11904: 0xB1EC, + 26752 - 11904: 0xD5C7, + 26753 - 11904: 0xB1E7, + 26754 - 11904: 0xB1FC, + 26755 - 11904: 0xB1F2, + 26756 - 11904: 0x8DB9, + 26757 - 11904: 0xB1F6, + 26758 - 11904: 0xB1F5, + 26759 - 11904: 0xD5B1, + 26760 - 11904: 0x917E, + 26761 - 11904: 0xD5CE, + 26762 - 11904: 0xD5D4, + 26763 - 11904: 0xD5CC, + 26764 - 11904: 0xD5D3, + 26767 - 11904: 0xD5C0, + 26768 - 11904: 0xD5B2, + 26769 - 11904: 0xD5D2, + 26770 - 11904: 0xD5C2, + 26771 - 11904: 0xB1EA, + 26772 - 11904: 0xB1F7, + 26774 - 11904: 0xD5CB, + 26775 - 11904: 0xB1F0, + 26776 - 11904: 0x93F4, + 26779 - 11904: 0xD5CA, + 26780 - 11904: 0xD5B3, + 26781 - 11904: 0xB1F8, + 26783 - 11904: 0xB1FA, + 26784 - 11904: 0xD5CD, + 26785 - 11904: 0xB1FB, + 26786 - 11904: 0xB1E9, + 26787 - 11904: 0xD5BA, + 26788 - 11904: 0xD5CF, + 26790 - 11904: 0xFB7C, + 26791 - 11904: 0xB1EF, + 26792 - 11904: 0xB1F9, + 26793 - 11904: 0xD5BC, + 26794 - 11904: 0xD5C6, + 26795 - 11904: 0xD5B7, + 26796 - 11904: 0xD5BB, + 26797 - 11904: 0xB1F4, + 26798 - 11904: 0xD5B6, + 26799 - 11904: 0xB1E8, + 26800 - 11904: 0xB1F1, + 26801 - 11904: 0xB1EE, + 26802 - 11904: 0xD5BF, + 26803 - 11904: 0xAEDE, + 26804 - 11904: 0xD9C0, + 26805 - 11904: 0xB1EB, + 26806 - 11904: 0x93E7, + 26809 - 11904: 0x97EF, + 26813 - 11904: 0xFE4A, + 26819 - 11904: 0xFD45, + 26820 - 11904: 0xB1F3, + 26821 - 11904: 0x96A5, + 26822 - 11904: 0xD9C3, + 26823 - 11904: 0xD9D9, + 26824 - 11904: 0xD9CE, + 26825 - 11904: 0xB4D6, + 26826 - 11904: 0xFEE0, + 26827 - 11904: 0xB4D1, + 26828 - 11904: 0xD9BD, + 26829 - 11904: 0xB4D2, + 26830 - 11904: 0xD9CD, + 26832 - 11904: 0xD9C6, + 26833 - 11904: 0xD9D3, + 26834 - 11904: 0xB4CE, + 26835 - 11904: 0xD9AB, + 26836 - 11904: 0xD9D5, + 26837 - 11904: 0xB4C4, + 26838 - 11904: 0xD9B3, + 26839 - 11904: 0xB4C7, + 26840 - 11904: 0xB4C6, + 26842 - 11904: 0xB4D7, + 26844 - 11904: 0xD9AD, + 26845 - 11904: 0xD9CF, + 26846 - 11904: 0xD9D0, + 26847 - 11904: 0xB4C9, + 26848 - 11904: 0xB4C5, + 26849 - 11904: 0xD9BB, + 26851 - 11904: 0xB4D0, + 26852 - 11904: 0xD9B6, + 26854 - 11904: 0xD9D1, + 26855 - 11904: 0xB4CC, + 26856 - 11904: 0xD9C9, + 26857 - 11904: 0xD9D6, + 26858 - 11904: 0xD9B0, + 26859 - 11904: 0xD9B5, + 26860 - 11904: 0xD9AF, + 26862 - 11904: 0xB4CB, + 26863 - 11904: 0xD9C2, + 26864 - 11904: 0xDDDE, + 26865 - 11904: 0xD9B1, + 26866 - 11904: 0xB4CF, + 26867 - 11904: 0xD9BA, + 26868 - 11904: 0xD9D2, + 26869 - 11904: 0xB4CA, + 26870 - 11904: 0xD9B7, + 26871 - 11904: 0xD9B4, + 26872 - 11904: 0xD9C5, + 26873 - 11904: 0xB4CD, + 26874 - 11904: 0xB4C3, + 26875 - 11904: 0xB4D9, + 26876 - 11904: 0xD9C8, + 26877 - 11904: 0xD9C7, + 26880 - 11904: 0xFD48, + 26881 - 11904: 0xFD47, + 26882 - 11904: 0xFEF2, + 26883 - 11904: 0xFE6A, + 26884 - 11904: 0xD9AC, + 26885 - 11904: 0xB4C8, + 26886 - 11904: 0xD9D4, + 26887 - 11904: 0xD9BC, + 26888 - 11904: 0xD9BE, + 26889 - 11904: 0x8DBD, + 26890 - 11904: 0xD9CB, + 26891 - 11904: 0xD9CA, + 26892 - 11904: 0xD9AA, + 26893 - 11904: 0xB4D3, + 26894 - 11904: 0xB4D5, + 26895 - 11904: 0xD9B2, + 26896 - 11904: 0xD9B9, + 26897 - 11904: 0xD9C1, + 26898 - 11904: 0xB4D4, + 26899 - 11904: 0xD9B8, + 26900 - 11904: 0xD9C4, + 26901 - 11904: 0xD9D7, + 26903 - 11904: 0xD9CC, + 26904 - 11904: 0x9BA1, + 26905 - 11904: 0x8CA2, + 26906 - 11904: 0x9AB7, + 26907 - 11904: 0x8EFC, + 26917 - 11904: 0xD9D8, + 26922 - 11904: 0xD9AE, + 26924 - 11904: 0x9FA1, + 26927 - 11904: 0xDDF2, + 26928 - 11904: 0xB7A6, + 26930 - 11904: 0xDDF0, + 26931 - 11904: 0xDDDB, + 26932 - 11904: 0xDDE0, + 26933 - 11904: 0xDDD9, + 26934 - 11904: 0xFD51, + 26935 - 11904: 0xDDEC, + 26936 - 11904: 0xDDCB, + 26937 - 11904: 0xDDD2, + 26939 - 11904: 0xDDEA, + 26940 - 11904: 0xDDF4, + 26941 - 11904: 0xDDDC, + 26942 - 11904: 0xFAAD, + 26943 - 11904: 0xDDCF, + 26944 - 11904: 0xDDE2, + 26945 - 11904: 0xDDE7, + 26946 - 11904: 0xDDD3, + 26947 - 11904: 0x8DBE, + 26948 - 11904: 0xDDE4, + 26949 - 11904: 0xDDD0, + 26950 - 11904: 0x89A4, + 26952 - 11904: 0xDDD7, + 26953 - 11904: 0xDDD8, + 26954 - 11904: 0xB7A8, + 26955 - 11904: 0xDDEB, + 26956 - 11904: 0xDDE9, + 26958 - 11904: 0xDDCC, + 26959 - 11904: 0xDDEE, + 26961 - 11904: 0xDDEF, + 26962 - 11904: 0xDDF1, + 26963 - 11904: 0xB7AC, + 26964 - 11904: 0xB7A4, + 26965 - 11904: 0x9AD9, + 26966 - 11904: 0xD5B8, + 26967 - 11904: 0xDDD4, + 26968 - 11904: 0xDDE6, + 26969 - 11904: 0xDDD5, + 26970 - 11904: 0xB7A1, + 26971 - 11904: 0xB7B1, + 26972 - 11904: 0xDDED, + 26973 - 11904: 0xB7AF, + 26974 - 11904: 0xB7AB, + 26975 - 11904: 0xDDCA, + 26976 - 11904: 0xB7A3, + 26977 - 11904: 0xFD4E, + 26978 - 11904: 0xDDCD, + 26979 - 11904: 0xB7B0, + 26980 - 11904: 0x8DC0, + 26981 - 11904: 0xDDDD, + 26982 - 11904: 0xDDC9, + 26983 - 11904: 0x97F0, + 26984 - 11904: 0xB7A9, + 26985 - 11904: 0xDDE1, + 26986 - 11904: 0xDDD1, + 26987 - 11904: 0xB7AA, + 26988 - 11904: 0xDDDA, + 26989 - 11904: 0xB77E, + 26990 - 11904: 0xB4D8, + 26991 - 11904: 0xDDE3, + 26992 - 11904: 0xD9BF, + 26993 - 11904: 0xDDCE, + 26994 - 11904: 0x93B4, + 26995 - 11904: 0xFD44, + 26996 - 11904: 0xDDE8, + 26997 - 11904: 0xB7A5, + 26998 - 11904: 0xDDE5, + 26999 - 11904: 0xB7A2, + 27000 - 11904: 0xDDDF, + 27001 - 11904: 0xB7AD, + 27002 - 11904: 0xDDD6, + 27003 - 11904: 0xDDF3, + 27008 - 11904: 0x9FA7, + 27010 - 11904: 0xB7A7, + 27011 - 11904: 0xDEC6, + 27013 - 11904: 0x8DC2, + 27014 - 11904: 0xB7AE, + 27018 - 11904: 0x99B6, + 27021 - 11904: 0xE24A, + 27022 - 11904: 0xE248, + 27024 - 11904: 0xE25E, + 27025 - 11904: 0xE246, + 27027 - 11904: 0xE258, + 27028 - 11904: 0xB77D, + 27029 - 11904: 0xBA5F, + 27030 - 11904: 0xE242, + 27031 - 11904: 0xE25D, + 27032 - 11904: 0xFD52, + 27033 - 11904: 0xE247, + 27034 - 11904: 0xE255, + 27035 - 11904: 0xBA64, + 27036 - 11904: 0xBA5D, + 27038 - 11904: 0xE25B, + 27039 - 11904: 0x8DC1, + 27040 - 11904: 0xE240, + 27041 - 11904: 0xE25A, + 27042 - 11904: 0x8E46, + 27043 - 11904: 0xBA6F, + 27044 - 11904: 0xE251, + 27045 - 11904: 0xE261, + 27046 - 11904: 0xBA6D, + 27047 - 11904: 0xE249, + 27048 - 11904: 0xBA5E, + 27049 - 11904: 0xE24B, + 27050 - 11904: 0xE259, + 27051 - 11904: 0xBA67, + 27052 - 11904: 0xE244, + 27053 - 11904: 0xBA6B, + 27054 - 11904: 0xBA61, + 27055 - 11904: 0xE24D, + 27056 - 11904: 0xE243, + 27057 - 11904: 0xE1FC, + 27058 - 11904: 0xA0D1, + 27059 - 11904: 0xE257, + 27060 - 11904: 0xBA68, + 27061 - 11904: 0xE260, + 27062 - 11904: 0xE1FD, + 27063 - 11904: 0xBA65, + 27065 - 11904: 0xE253, + 27067 - 11904: 0xBA66, + 27068 - 11904: 0xE245, + 27069 - 11904: 0xE250, + 27070 - 11904: 0xE24C, + 27071 - 11904: 0xE24E, + 27072 - 11904: 0x9FCA, + 27073 - 11904: 0xBA60, + 27074 - 11904: 0xE25F, + 27075 - 11904: 0xBA6E, + 27076 - 11904: 0xE24F, + 27078 - 11904: 0xE262, + 27081 - 11904: 0xE1FE, + 27082 - 11904: 0xE254, + 27083 - 11904: 0xBA63, + 27084 - 11904: 0xBA6C, + 27085 - 11904: 0xBA6A, + 27086 - 11904: 0xE241, + 27087 - 11904: 0xE256, + 27088 - 11904: 0xBA69, + 27089 - 11904: 0x92CF, + 27091 - 11904: 0xBA62, + 27092 - 11904: 0xE252, + 27093 - 11904: 0x9CF4, + 27094 - 11904: 0x8DC4, + 27097 - 11904: 0xE25C, + 27105 - 11904: 0xFD41, + 27106 - 11904: 0xE5D5, + 27108 - 11904: 0xE5D1, + 27109 - 11904: 0xE5CD, + 27110 - 11904: 0xE5E1, + 27111 - 11904: 0xE5DE, + 27112 - 11904: 0xBCCD, + 27113 - 11904: 0x9B4C, + 27115 - 11904: 0xE5E5, + 27116 - 11904: 0xE5D4, + 27117 - 11904: 0xBCD8, + 27118 - 11904: 0xE5DB, + 27121 - 11904: 0xE5D0, + 27122 - 11904: 0xE5DA, + 27123 - 11904: 0xBCD5, + 27124 - 11904: 0xE5EE, + 27126 - 11904: 0xE5EB, + 27127 - 11904: 0xE5DD, + 27128 - 11904: 0xE5CE, + 27129 - 11904: 0xFD57, + 27130 - 11904: 0xFCEF, + 27131 - 11904: 0xE5E2, + 27132 - 11904: 0xE5E4, + 27133 - 11904: 0xBCD1, + 27134 - 11904: 0xE5D8, + 27135 - 11904: 0xE5D3, + 27136 - 11904: 0xE5CA, + 27137 - 11904: 0xBCCE, + 27138 - 11904: 0xBCD6, + 27139 - 11904: 0x9CDE, + 27140 - 11904: 0xE5E7, + 27141 - 11904: 0xBCD7, + 27142 - 11904: 0xE5CB, + 27143 - 11904: 0xE5ED, + 27144 - 11904: 0xE5E0, + 27145 - 11904: 0xE5E6, + 27146 - 11904: 0xBCD4, + 27147 - 11904: 0xFD42, + 27148 - 11904: 0x986C, + 27149 - 11904: 0xE5E3, + 27151 - 11904: 0xE5EA, + 27153 - 11904: 0xBCD9, + 27155 - 11904: 0xBCD3, + 27156 - 11904: 0xE5DC, + 27157 - 11904: 0xE5CF, + 27158 - 11904: 0xE5EF, + 27159 - 11904: 0xE5CC, + 27160 - 11904: 0xE5E8, + 27161 - 11904: 0xBCD0, + 27162 - 11904: 0x97F9, + 27163 - 11904: 0xE5D6, + 27164 - 11904: 0x9558, + 27165 - 11904: 0xE5D7, + 27166 - 11904: 0xBCCF, + 27167 - 11904: 0xBCCC, + 27168 - 11904: 0xE5D2, + 27169 - 11904: 0xBCD2, + 27171 - 11904: 0xBCCB, + 27173 - 11904: 0xE5E9, + 27174 - 11904: 0xE5EC, + 27175 - 11904: 0xE5D9, + 27176 - 11904: 0xE9CA, + 27177 - 11904: 0x87B6, + 27179 - 11904: 0x985E, + 27180 - 11904: 0xFE7B, + 27181 - 11904: 0x94CD, + 27186 - 11904: 0xE9C2, + 27187 - 11904: 0x93EE, + 27188 - 11904: 0xE9BE, + 27189 - 11904: 0xBEF6, + 27192 - 11904: 0xBEEB, + 27193 - 11904: 0xBEF0, + 27194 - 11904: 0xBEEC, + 27195 - 11904: 0xE9CC, + 27196 - 11904: 0xE9D7, + 27197 - 11904: 0xBEEA, + 27198 - 11904: 0xE9C4, + 27199 - 11904: 0xE9CD, + 27200 - 11904: 0xE5DF, + 27201 - 11904: 0xE9CE, + 27203 - 11904: 0x8CA3, + 27204 - 11904: 0xBEF1, + 27205 - 11904: 0xFD5A, + 27206 - 11904: 0xE9DD, + 27207 - 11904: 0xBEF5, + 27208 - 11904: 0xBEF8, + 27209 - 11904: 0xE9C0, + 27211 - 11904: 0xBEF4, + 27212 - 11904: 0x93F5, + 27213 - 11904: 0xE9DB, + 27214 - 11904: 0xE9DC, + 27215 - 11904: 0xE9D2, + 27216 - 11904: 0xE9D1, + 27217 - 11904: 0xE9C9, + 27218 - 11904: 0x93EF, + 27219 - 11904: 0x8EEA, + 27220 - 11904: 0xE9D3, + 27221 - 11904: 0xE9DA, + 27222 - 11904: 0xE9D9, + 27223 - 11904: 0x8F5B, + 27224 - 11904: 0xBEEF, + 27225 - 11904: 0xBEED, + 27226 - 11904: 0xE9CB, + 27227 - 11904: 0xE9C8, + 27229 - 11904: 0xE9C5, + 27230 - 11904: 0xE9D8, + 27231 - 11904: 0xBEF7, + 27232 - 11904: 0xE9D6, + 27233 - 11904: 0xBEF3, + 27234 - 11904: 0xBEF2, + 27235 - 11904: 0x8C5E, + 27236 - 11904: 0xE9D0, + 27237 - 11904: 0x8DC6, + 27238 - 11904: 0xE9BF, + 27239 - 11904: 0xE9C1, + 27240 - 11904: 0xE9C3, + 27241 - 11904: 0xE9D5, + 27242 - 11904: 0xE9CF, + 27243 - 11904: 0xBEEE, + 27245 - 11904: 0xE9C6, + 27247 - 11904: 0xE9D4, + 27249 - 11904: 0x8DC8, + 27252 - 11904: 0x8DC7, + 27254 - 11904: 0xE9C7, + 27258 - 11904: 0x93F7, + 27262 - 11904: 0xC0CF, + 27263 - 11904: 0xED45, + 27264 - 11904: 0xC0C8, + 27265 - 11904: 0xECF5, + 27266 - 11904: 0x8DC9, + 27267 - 11904: 0xED41, + 27268 - 11904: 0xC0CA, + 27269 - 11904: 0xED48, + 27271 - 11904: 0xECFC, + 27273 - 11904: 0xECF7, + 27274 - 11904: 0xFBF2, + 27276 - 11904: 0xED49, + 27277 - 11904: 0xECF3, + 27278 - 11904: 0xECFE, + 27279 - 11904: 0x9670, + 27280 - 11904: 0xC0D1, + 27281 - 11904: 0xED44, + 27282 - 11904: 0xED4A, + 27283 - 11904: 0xECFD, + 27284 - 11904: 0xC0C9, + 27285 - 11904: 0xED40, + 27286 - 11904: 0xECF4, + 27287 - 11904: 0xC0D0, + 27289 - 11904: 0x8DCB, + 27290 - 11904: 0xED47, + 27291 - 11904: 0xECF9, + 27292 - 11904: 0xC0CC, + 27293 - 11904: 0xFD5C, + 27294 - 11904: 0xECFB, + 27295 - 11904: 0xECF8, + 27296 - 11904: 0xC0D2, + 27297 - 11904: 0xECFA, + 27298 - 11904: 0xC0CB, + 27299 - 11904: 0xC0CE, + 27300 - 11904: 0xED43, + 27301 - 11904: 0xECF6, + 27302 - 11904: 0xED46, + 27303 - 11904: 0x8F65, + 27304 - 11904: 0xED42, + 27307 - 11904: 0x8DCD, + 27308 - 11904: 0xC263, + 27309 - 11904: 0xEFE7, + 27310 - 11904: 0xC268, + 27311 - 11904: 0xC269, + 27313 - 11904: 0x9DA8, + 27314 - 11904: 0x94F9, + 27315 - 11904: 0xC262, + 27316 - 11904: 0xEFE6, + 27317 - 11904: 0x8DCE, + 27318 - 11904: 0xEFE3, + 27319 - 11904: 0xEFE4, + 27320 - 11904: 0xC266, + 27321 - 11904: 0xEFDE, + 27322 - 11904: 0xEFE2, + 27323 - 11904: 0xC265, + 27325 - 11904: 0xEFDF, + 27326 - 11904: 0x93EA, + 27330 - 11904: 0xC267, + 27331 - 11904: 0xC264, + 27333 - 11904: 0xEFDD, + 27334 - 11904: 0xEFE1, + 27335 - 11904: 0xEFE5, + 27336 - 11904: 0xFD5F, + 27337 - 11904: 0x93F0, + 27338 - 11904: 0x9FB6, + 27339 - 11904: 0xF251, + 27340 - 11904: 0xF24E, + 27341 - 11904: 0xF257, + 27343 - 11904: 0xF256, + 27344 - 11904: 0xF254, + 27345 - 11904: 0xF24F, + 27347 - 11904: 0xC372, + 27348 - 11904: 0x8DCF, + 27352 - 11904: 0x9763, + 27353 - 11904: 0xF250, + 27354 - 11904: 0xC371, + 27355 - 11904: 0xC0CD, + 27356 - 11904: 0xF253, + 27357 - 11904: 0xC370, + 27358 - 11904: 0xF258, + 27359 - 11904: 0xF252, + 27360 - 11904: 0xF24D, + 27361 - 11904: 0xEFE0, + 27365 - 11904: 0xC36F, + 27367 - 11904: 0xF24C, + 27368 - 11904: 0xF456, + 27370 - 11904: 0xF455, + 27371 - 11904: 0xF255, + 27372 - 11904: 0xC468, + 27374 - 11904: 0xF459, + 27375 - 11904: 0xF45A, + 27376 - 11904: 0xF454, + 27377 - 11904: 0xF458, + 27379 - 11904: 0xF453, + 27382 - 11904: 0x8DD0, + 27384 - 11904: 0xF5D1, + 27385 - 11904: 0xF457, + 27386 - 11904: 0xC4E7, + 27387 - 11904: 0xC4E5, + 27388 - 11904: 0xF5CF, + 27392 - 11904: 0xF5D2, + 27394 - 11904: 0xF5CE, + 27395 - 11904: 0xF5D0, + 27396 - 11904: 0xC4E6, + 27397 - 11904: 0x93F1, + 27400 - 11904: 0xF6E5, + 27401 - 11904: 0xF6E6, + 27402 - 11904: 0xC576, + 27403 - 11904: 0xF6E4, + 27407 - 11904: 0xF7E2, + 27408 - 11904: 0xC5CF, + 27409 - 11904: 0xF7E0, + 27410 - 11904: 0xF7E1, + 27411 - 11904: 0xF8AC, + 27414 - 11904: 0xC656, + 27415 - 11904: 0xF8F3, + 27416 - 11904: 0xF8F1, + 27417 - 11904: 0xF8F2, + 27418 - 11904: 0xF8F4, + 27421 - 11904: 0xFD62, + 27422 - 11904: 0xF9BB, + 27424 - 11904: 0xA4ED, + 27425 - 11904: 0xA6B8, + 27427 - 11904: 0xAA59, + 27429 - 11904: 0xCCE9, + 27432 - 11904: 0xCF64, + 27436 - 11904: 0xD1F5, + 27437 - 11904: 0xD1F7, + 27439 - 11904: 0xD1F6, + 27441 - 11904: 0xD1F8, + 27442 - 11904: 0xB1FD, + 27443 - 11904: 0xD5D7, + 27444 - 11904: 0xD1F9, + 27445 - 11904: 0xFD65, + 27446 - 11904: 0xD5D6, + 27447 - 11904: 0xD5D8, + 27448 - 11904: 0xD5D9, + 27449 - 11904: 0xD9DA, + 27450 - 11904: 0xB4DB, + 27451 - 11904: 0xD9DB, + 27452 - 11904: 0xD9DD, + 27453 - 11904: 0xB4DC, + 27454 - 11904: 0xB4DA, + 27455 - 11904: 0xD9DC, + 27457 - 11904: 0xDDFA, + 27458 - 11904: 0xDDF8, + 27459 - 11904: 0xDDF7, + 27461 - 11904: 0xDDF6, + 27462 - 11904: 0xDDF5, + 27463 - 11904: 0xB7B2, + 27464 - 11904: 0xDDF9, + 27465 - 11904: 0xBA70, + 27466 - 11904: 0xE263, + 27467 - 11904: 0xE265, + 27468 - 11904: 0xBA71, + 27469 - 11904: 0xE264, + 27470 - 11904: 0xBCDB, + 27472 - 11904: 0xBCDA, + 27473 - 11904: 0xE5F0, + 27474 - 11904: 0x9FDB, + 27476 - 11904: 0xE9DF, + 27477 - 11904: 0xE9DE, + 27478 - 11904: 0xE9E0, + 27479 - 11904: 0x93F8, + 27481 - 11904: 0xBEF9, + 27483 - 11904: 0xED4B, + 27484 - 11904: 0xC0D3, + 27486 - 11904: 0xEFE8, + 27487 - 11904: 0xC26A, + 27488 - 11904: 0xF259, + 27489 - 11904: 0xC577, + 27490 - 11904: 0xA4EE, + 27491 - 11904: 0xA5BF, + 27492 - 11904: 0xA6B9, + 27493 - 11904: 0xA842, + 27494 - 11904: 0xAA5A, + 27495 - 11904: 0xAA5B, + 27498 - 11904: 0xAC6E, + 27501 - 11904: 0xD1FA, + 27503 - 11904: 0x8BF7, + 27506 - 11904: 0xB7B3, + 27508 - 11904: 0xFD66, + 27510 - 11904: 0xE6D1, + 27511 - 11904: 0xBEFA, + 27512 - 11904: 0xC26B, + 27513 - 11904: 0xA4EF, + 27514 - 11904: 0x8BCF, + 27515 - 11904: 0xA6BA, + 27518 - 11904: 0xCCEB, + 27519 - 11904: 0xAA5C, + 27520 - 11904: 0xCCEA, + 27521 - 11904: 0x8DD1, + 27522 - 11904: 0xCF65, + 27523 - 11904: 0xAC6F, + 27524 - 11904: 0xCF66, + 27526 - 11904: 0xAC70, + 27528 - 11904: 0xD1FC, + 27529 - 11904: 0xAEEE, + 27530 - 11904: 0xAEED, + 27532 - 11904: 0xD5DE, + 27533 - 11904: 0xD5DC, + 27534 - 11904: 0xD5DD, + 27535 - 11904: 0xD5DB, + 27537 - 11904: 0xD5DA, + 27540 - 11904: 0xD9DE, + 27541 - 11904: 0xD9E1, + 27542 - 11904: 0xB4DE, + 27543 - 11904: 0xD9DF, + 27544 - 11904: 0xB4DD, + 27545 - 11904: 0xD9E0, + 27547 - 11904: 0xDDFB, + 27550 - 11904: 0xE266, + 27551 - 11904: 0xE267, + 27552 - 11904: 0xE268, + 27554 - 11904: 0xE5F3, + 27555 - 11904: 0xE5F2, + 27556 - 11904: 0xBCDC, + 27557 - 11904: 0xE5F1, + 27558 - 11904: 0xE5F4, + 27559 - 11904: 0xE9E1, + 27562 - 11904: 0xE9E2, + 27563 - 11904: 0xE9E3, + 27565 - 11904: 0xED4C, + 27566 - 11904: 0xC0D4, + 27567 - 11904: 0xC26C, + 27568 - 11904: 0xF25A, + 27570 - 11904: 0xC4E8, + 27571 - 11904: 0xC95F, + 27573 - 11904: 0xAC71, + 27574 - 11904: 0xCF67, + 27575 - 11904: 0xAEEF, + 27578 - 11904: 0xB1FE, + 27580 - 11904: 0xB4DF, + 27581 - 11904: 0xD9E2, + 27583 - 11904: 0xB7B5, + 27584 - 11904: 0xB7B4, + 27585 - 11904: 0x8DD2, + 27587 - 11904: 0xE269, + 27588 - 11904: 0xE26A, + 27589 - 11904: 0xBCDD, + 27590 - 11904: 0xBCDE, + 27591 - 11904: 0xE9E5, + 27592 - 11904: 0xE9E4, + 27593 - 11904: 0xEFE9, + 27594 - 11904: 0xF7E3, + 27595 - 11904: 0xA4F0, + 27596 - 11904: 0xC960, + 27597 - 11904: 0xA5C0, + 27599 - 11904: 0xA843, + 27600 - 11904: 0xCB48, + 27602 - 11904: 0xAC72, + 27603 - 11904: 0xB7B6, + 27604 - 11904: 0xA4F1, + 27606 - 11904: 0xCF68, + 27607 - 11904: 0xAC73, + 27608 - 11904: 0xCF69, + 27610 - 11904: 0xC0D5, + 27611 - 11904: 0xA4F2, + 27612 - 11904: 0xFD71, + 27614 - 11904: 0xCCEC, + 27616 - 11904: 0xCF6A, + 27617 - 11904: 0xFD6F, + 27618 - 11904: 0xD242, + 27619 - 11904: 0xD241, + 27620 - 11904: 0xD1FE, + 27622 - 11904: 0xD1FD, + 27623 - 11904: 0xD243, + 27624 - 11904: 0xD240, + 27626 - 11904: 0x8DD3, + 27627 - 11904: 0xB240, + 27628 - 11904: 0xB241, + 27631 - 11904: 0xB4E0, + 27632 - 11904: 0xD9E3, + 27634 - 11904: 0xD9E4, + 27635 - 11904: 0xD9E5, + 27639 - 11904: 0xDE41, + 27640 - 11904: 0xDE42, + 27641 - 11904: 0xDE40, + 27642 - 11904: 0x9FE7, + 27643 - 11904: 0xDDFD, + 27644 - 11904: 0xDDFE, + 27645 - 11904: 0xB7B7, + 27646 - 11904: 0xE26B, + 27647 - 11904: 0xE5F7, + 27648 - 11904: 0xE5F6, + 27649 - 11904: 0xE5F5, + 27650 - 11904: 0xE5F8, + 27651 - 11904: 0xE9E7, + 27652 - 11904: 0xE9E6, + 27653 - 11904: 0xBEFB, + 27654 - 11904: 0xE9E8, + 27656 - 11904: 0xC0D6, + 27657 - 11904: 0xED4D, + 27659 - 11904: 0xEFEA, + 27660 - 11904: 0xF25B, + 27661 - 11904: 0xF6E7, + 27663 - 11904: 0xA4F3, + 27664 - 11904: 0xA5C2, + 27665 - 11904: 0xA5C1, + 27667 - 11904: 0xAA5D, + 27668 - 11904: 0xC961, + 27669 - 11904: 0xC97E, + 27670 - 11904: 0xA6BB, + 27672 - 11904: 0xC9F7, + 27673 - 11904: 0xCB49, + 27674 - 11904: 0xCB4A, + 27675 - 11904: 0xAA5E, + 27676 - 11904: 0x90BD, + 27677 - 11904: 0xCCED, + 27679 - 11904: 0xAC74, + 27680 - 11904: 0xCF6B, + 27681 - 11904: 0xCF6C, + 27683 - 11904: 0xAEF0, + 27684 - 11904: 0xAEF4, + 27685 - 11904: 0xD244, + 27686 - 11904: 0xAEF3, + 27687 - 11904: 0xAEF1, + 27688 - 11904: 0xAEF2, + 27690 - 11904: 0xD5DF, + 27691 - 11904: 0xB242, + 27692 - 11904: 0xB4E3, + 27694 - 11904: 0xB4E1, + 27695 - 11904: 0xB4E2, + 27696 - 11904: 0xD9E6, + 27697 - 11904: 0x9FD0, + 27699 - 11904: 0xBA72, + 27700 - 11904: 0xA4F4, + 27701 - 11904: 0x8BD0, + 27702 - 11904: 0xC9A1, + 27703 - 11904: 0xFD72, + 27704 - 11904: 0xA5C3, + 27705 - 11904: 0x9CAE, + 27706 - 11904: 0x8BD1, + 27707 - 11904: 0xC9A4, + 27709 - 11904: 0x8ADB, + 27710 - 11904: 0xA5C6, + 27711 - 11904: 0xC9A3, + 27712 - 11904: 0xA5C5, + 27713 - 11904: 0xA5C4, + 27714 - 11904: 0xA844, + 27715 - 11904: 0xC9A2, + 27718 - 11904: 0xC9F8, + 27721 - 11904: 0xFAE4, + 27722 - 11904: 0xC9FC, + 27723 - 11904: 0xC9FE, + 27724 - 11904: 0xCA40, + 27725 - 11904: 0xA6C5, + 27726 - 11904: 0xA6C6, + 27727 - 11904: 0xC9FB, + 27728 - 11904: 0xA6C1, + 27730 - 11904: 0xC9F9, + 27732 - 11904: 0xC9FD, + 27733 - 11904: 0xA6C2, + 27735 - 11904: 0xA6BD, + 27736 - 11904: 0x95CE, + 27737 - 11904: 0xA6BE, + 27738 - 11904: 0xFD76, + 27739 - 11904: 0xA6C4, + 27740 - 11904: 0xC9FA, + 27741 - 11904: 0xA6BC, + 27742 - 11904: 0xA845, + 27743 - 11904: 0xA6BF, + 27744 - 11904: 0xA6C0, + 27745 - 11904: 0xA6C3, + 27749 - 11904: 0xCB5B, + 27750 - 11904: 0xCB59, + 27751 - 11904: 0xCB4C, + 27752 - 11904: 0xA851, + 27753 - 11904: 0xCB53, + 27754 - 11904: 0xA84C, + 27755 - 11904: 0xCB4D, + 27757 - 11904: 0xCB55, + 27758 - 11904: 0xFB62, + 27759 - 11904: 0xCB52, + 27760 - 11904: 0xA84F, + 27761 - 11904: 0xCB51, + 27762 - 11904: 0xA856, + 27763 - 11904: 0xCB5A, + 27764 - 11904: 0xA858, + 27765 - 11904: 0x8DD4, + 27766 - 11904: 0xA85A, + 27768 - 11904: 0xCB4B, + 27769 - 11904: 0xFD78, + 27770 - 11904: 0xA84D, + 27771 - 11904: 0xCB5C, + 27773 - 11904: 0xA854, + 27774 - 11904: 0xA857, + 27775 - 11904: 0x8EE3, + 27776 - 11904: 0xCD45, + 27777 - 11904: 0xA847, + 27778 - 11904: 0xA85E, + 27779 - 11904: 0xA855, + 27780 - 11904: 0xCB4E, + 27781 - 11904: 0xA84A, + 27782 - 11904: 0xA859, + 27783 - 11904: 0xCB56, + 27784 - 11904: 0xA848, + 27785 - 11904: 0xA849, + 27786 - 11904: 0xCD43, + 27787 - 11904: 0xCB4F, + 27788 - 11904: 0xA850, + 27789 - 11904: 0xA85B, + 27790 - 11904: 0xCB5D, + 27791 - 11904: 0xCB50, + 27792 - 11904: 0xA84E, + 27794 - 11904: 0xA853, + 27795 - 11904: 0xCCEE, + 27796 - 11904: 0xA85C, + 27797 - 11904: 0xCB57, + 27798 - 11904: 0xA852, + 27800 - 11904: 0xA85D, + 27801 - 11904: 0xA846, + 27802 - 11904: 0xCB54, + 27803 - 11904: 0xA84B, + 27804 - 11904: 0xFDB7, + 27805 - 11904: 0xCD44, + 27807 - 11904: 0x9076, + 27810 - 11904: 0x98C6, + 27818 - 11904: 0x8DD5, + 27819 - 11904: 0xAA6A, + 27820 - 11904: 0xAA7A, + 27821 - 11904: 0xCCF5, + 27822 - 11904: 0xAA71, + 27823 - 11904: 0x97D1, + 27824 - 11904: 0xCD4B, + 27825 - 11904: 0xAA62, + 27826 - 11904: 0x9EB6, + 27827 - 11904: 0xAA65, + 27828 - 11904: 0xCD42, + 27830 - 11904: 0xCCF3, + 27831 - 11904: 0xCCF7, + 27832 - 11904: 0xAA6D, + 27833 - 11904: 0xAA6F, + 27834 - 11904: 0xCCFA, + 27835 - 11904: 0xAA76, + 27836 - 11904: 0xAA68, + 27837 - 11904: 0xAA66, + 27838 - 11904: 0xAA67, + 27839 - 11904: 0xAA75, + 27840 - 11904: 0xCD47, + 27841 - 11904: 0xAA70, + 27842 - 11904: 0xCCF9, + 27843 - 11904: 0xCCFB, + 27844 - 11904: 0xAA6E, + 27845 - 11904: 0xAA73, + 27846 - 11904: 0xCCFC, + 27847 - 11904: 0xCD4A, + 27849 - 11904: 0xAC75, + 27850 - 11904: 0xAA79, + 27851 - 11904: 0xFAC7, + 27852 - 11904: 0xAA63, + 27853 - 11904: 0xCD49, + 27854 - 11904: 0xA042, + 27855 - 11904: 0xCD4D, + 27856 - 11904: 0xCCF8, + 27857 - 11904: 0xCD4F, + 27858 - 11904: 0xCD40, + 27859 - 11904: 0xAA6C, + 27860 - 11904: 0xCCF4, + 27861 - 11904: 0xAA6B, + 27862 - 11904: 0xAA7D, + 27863 - 11904: 0xAA72, + 27865 - 11904: 0xCCF2, + 27866 - 11904: 0xCF75, + 27867 - 11904: 0xAA78, + 27868 - 11904: 0xAA7C, + 27869 - 11904: 0xCD41, + 27870 - 11904: 0xCD46, + 27871 - 11904: 0x9873, + 27872 - 11904: 0xAA7E, + 27873 - 11904: 0xAA77, + 27874 - 11904: 0xAA69, + 27875 - 11904: 0xAA5F, + 27877 - 11904: 0xAA64, + 27879 - 11904: 0xCCF6, + 27880 - 11904: 0xAA60, + 27881 - 11904: 0xCD4E, + 27882 - 11904: 0x9FFC, + 27883 - 11904: 0xCCF0, + 27884 - 11904: 0xCCEF, + 27885 - 11904: 0xCCFD, + 27886 - 11904: 0xCCF1, + 27887 - 11904: 0xAA7B, + 27888 - 11904: 0xAEF5, + 27889 - 11904: 0xAA74, + 27890 - 11904: 0xCCFE, + 27891 - 11904: 0xAA61, + 27893 - 11904: 0xACA6, + 27897 - 11904: 0xCD4C, + 27903 - 11904: 0x8CA5, + 27904 - 11904: 0xCF7C, + 27905 - 11904: 0xCFA1, + 27906 - 11904: 0x8DD7, + 27907 - 11904: 0xCFA4, + 27908 - 11904: 0xCF77, + 27909 - 11904: 0x92FB, + 27910 - 11904: 0x8DD8, + 27911 - 11904: 0xCFA7, + 27912 - 11904: 0xCFAA, + 27913 - 11904: 0xCFAC, + 27914 - 11904: 0xCF74, + 27915 - 11904: 0xAC76, + 27916 - 11904: 0xAC7B, + 27917 - 11904: 0xD249, + 27918 - 11904: 0xACAD, + 27919 - 11904: 0xCFA5, + 27920 - 11904: 0xCFAD, + 27921 - 11904: 0xCF7B, + 27922 - 11904: 0xCF73, + 27926 - 11904: 0xD264, + 27927 - 11904: 0xAC7E, + 27928 - 11904: 0xCFA2, + 27929 - 11904: 0xCF78, + 27930 - 11904: 0xCF7A, + 27931 - 11904: 0xACA5, + 27933 - 11904: 0xCF7D, + 27934 - 11904: 0xAC7D, + 27935 - 11904: 0xCF70, + 27936 - 11904: 0xCFA8, + 27938 - 11904: 0xCFAB, + 27940 - 11904: 0x944F, + 27941 - 11904: 0xAC7A, + 27942 - 11904: 0x8DD9, + 27943 - 11904: 0xACA8, + 27944 - 11904: 0xCF6D, + 27945 - 11904: 0xACAA, + 27946 - 11904: 0xAC78, + 27947 - 11904: 0xACAE, + 27948 - 11904: 0xCFA9, + 27949 - 11904: 0xCF6F, + 27950 - 11904: 0xACAB, + 27951 - 11904: 0xD25E, + 27952 - 11904: 0xCD48, + 27953 - 11904: 0xAC7C, + 27954 - 11904: 0xAC77, + 27955 - 11904: 0xCF76, + 27956 - 11904: 0xCF6E, + 27957 - 11904: 0xACAC, + 27958 - 11904: 0xACA4, + 27959 - 11904: 0xCFA3, + 27960 - 11904: 0xACA9, + 27961 - 11904: 0xACA7, + 27962 - 11904: 0xCF79, + 27963 - 11904: 0xACA1, + 27964 - 11904: 0xCF71, + 27965 - 11904: 0xACA2, + 27966 - 11904: 0xACA3, + 27967 - 11904: 0xCF72, + 27968 - 11904: 0xCFA6, + 27969 - 11904: 0xAC79, + 27970 - 11904: 0xCF7E, + 27982 - 11904: 0x896B, + 27991 - 11904: 0x97CE, + 27992 - 11904: 0xD24C, + 27993 - 11904: 0xAEFD, + 27994 - 11904: 0xAF43, + 27995 - 11904: 0xFAF3, + 27996 - 11904: 0xFDAE, + 27998 - 11904: 0xD255, + 27999 - 11904: 0xD25B, + 28000 - 11904: 0xD257, + 28001 - 11904: 0xD24A, + 28002 - 11904: 0xD24D, + 28003 - 11904: 0xD246, + 28004 - 11904: 0xD247, + 28005 - 11904: 0xAF4A, + 28006 - 11904: 0xAEFA, + 28007 - 11904: 0xD256, + 28008 - 11904: 0xD25F, + 28009 - 11904: 0xAF45, + 28010 - 11904: 0xAEF6, + 28012 - 11904: 0xAF40, + 28013 - 11904: 0xD24E, + 28014 - 11904: 0xAF42, + 28015 - 11904: 0xD24F, + 28016 - 11904: 0xD259, + 28017 - 11904: 0xFBAF, + 28018 - 11904: 0x92B7, + 28020 - 11904: 0xAF44, + 28021 - 11904: 0xD268, + 28022 - 11904: 0xD248, + 28023 - 11904: 0xAEFC, + 28024 - 11904: 0xAEFB, + 28025 - 11904: 0xAF48, + 28026 - 11904: 0xD245, + 28027 - 11904: 0xD266, + 28028 - 11904: 0xD25A, + 28029 - 11904: 0xD267, + 28030 - 11904: 0xD261, + 28031 - 11904: 0xD253, + 28032 - 11904: 0xD262, + 28033 - 11904: 0x8DDA, + 28034 - 11904: 0xD25C, + 28035 - 11904: 0xD265, + 28036 - 11904: 0xD263, + 28037 - 11904: 0xAF49, + 28038 - 11904: 0xD254, + 28039 - 11904: 0xAEF9, + 28040 - 11904: 0xAEF8, + 28041 - 11904: 0xAF41, + 28042 - 11904: 0xAF47, + 28043 - 11904: 0xD260, + 28044 - 11904: 0xAF46, + 28045 - 11904: 0xD251, + 28046 - 11904: 0xB243, + 28047 - 11904: 0x9C5A, + 28048 - 11904: 0xD269, + 28049 - 11904: 0xD250, + 28050 - 11904: 0xD24B, + 28051 - 11904: 0xAEFE, + 28052 - 11904: 0xAF4B, + 28053 - 11904: 0xAEF7, + 28054 - 11904: 0xFDAD, + 28055 - 11904: 0xD258, + 28056 - 11904: 0xD25D, + 28068 - 11904: 0x8DDC, + 28069 - 11904: 0x9444, + 28074 - 11904: 0xB265, + 28075 - 11904: 0xD5E1, + 28076 - 11904: 0xD5E5, + 28078 - 11904: 0xB252, + 28079 - 11904: 0xB250, + 28081 - 11904: 0x8DDD, + 28082 - 11904: 0xB247, + 28083 - 11904: 0xD5E3, + 28084 - 11904: 0xD5E2, + 28085 - 11904: 0xB25B, + 28087 - 11904: 0xD5E8, + 28088 - 11904: 0xB255, + 28089 - 11904: 0xA0D6, + 28090 - 11904: 0xD5FA, + 28091 - 11904: 0xD647, + 28092 - 11904: 0xB244, + 28093 - 11904: 0xD5F7, + 28094 - 11904: 0xD5F0, + 28095 - 11904: 0xB267, + 28096 - 11904: 0xD5E0, + 28098 - 11904: 0xD5FC, + 28100 - 11904: 0xB264, + 28101 - 11904: 0xB258, + 28102 - 11904: 0xB263, + 28103 - 11904: 0xB24E, + 28104 - 11904: 0xD5EC, + 28105 - 11904: 0xD5FE, + 28106 - 11904: 0xD5F6, + 28107 - 11904: 0xB24F, + 28108 - 11904: 0xB249, + 28109 - 11904: 0xD645, + 28111 - 11904: 0xD5FD, + 28112 - 11904: 0xD640, + 28113 - 11904: 0xB251, + 28114 - 11904: 0xB259, + 28115 - 11904: 0xD642, + 28116 - 11904: 0xD5EA, + 28117 - 11904: 0xD5FB, + 28118 - 11904: 0xD5EF, + 28119 - 11904: 0xD644, + 28120 - 11904: 0xB25E, + 28121 - 11904: 0xB246, + 28122 - 11904: 0xB25C, + 28123 - 11904: 0xD5F4, + 28124 - 11904: 0xD5F2, + 28125 - 11904: 0xD5F3, + 28126 - 11904: 0xB253, + 28127 - 11904: 0xD5EE, + 28128 - 11904: 0xD5ED, + 28129 - 11904: 0xB248, + 28130 - 11904: 0xD5E7, + 28131 - 11904: 0xD646, + 28132 - 11904: 0xB24A, + 28133 - 11904: 0xD5F1, + 28134 - 11904: 0xB268, + 28136 - 11904: 0xB262, + 28137 - 11904: 0xD5E6, + 28138 - 11904: 0xB25F, + 28139 - 11904: 0xB25D, + 28140 - 11904: 0xB266, + 28141 - 11904: 0xD5F8, + 28142 - 11904: 0xB261, + 28143 - 11904: 0xD252, + 28144 - 11904: 0xD5F9, + 28145 - 11904: 0xB260, + 28146 - 11904: 0xD641, + 28147 - 11904: 0xB245, + 28148 - 11904: 0xD5F5, + 28149 - 11904: 0xB257, + 28150 - 11904: 0xD5E9, + 28151 - 11904: 0xB256, + 28153 - 11904: 0xB254, + 28154 - 11904: 0xB24C, + 28155 - 11904: 0xB24B, + 28156 - 11904: 0xD9E7, + 28157 - 11904: 0xD643, + 28158 - 11904: 0x8C41, + 28160 - 11904: 0xD5EB, + 28162 - 11904: 0x97D5, + 28163 - 11904: 0xD9FC, + 28164 - 11904: 0x944A, + 28165 - 11904: 0xB24D, + 28170 - 11904: 0x944D, + 28175 - 11904: 0x97CB, + 28181 - 11904: 0x8DDE, + 28184 - 11904: 0x8DDF, + 28185 - 11904: 0xB541, + 28186 - 11904: 0xB25A, + 28187 - 11904: 0xB4EE, + 28188 - 11904: 0xD9F6, + 28189 - 11904: 0xFDB8, + 28191 - 11904: 0xD9EA, + 28192 - 11904: 0xB4EB, + 28193 - 11904: 0xB4E7, + 28194 - 11904: 0xDA49, + 28195 - 11904: 0xB4ED, + 28196 - 11904: 0xB4F1, + 28197 - 11904: 0xB4EC, + 28198 - 11904: 0xB4F5, + 28199 - 11904: 0xDA4D, + 28200 - 11904: 0xDA44, + 28201 - 11904: 0x8DE0, + 28202 - 11904: 0xFEF9, + 28203 - 11904: 0xD9F1, + 28204 - 11904: 0xB4FA, + 28205 - 11904: 0xB4F4, + 28206 - 11904: 0xD9FD, + 28207 - 11904: 0xFDBB, + 28208 - 11904: 0xDA4A, + 28209 - 11904: 0xDA43, + 28210 - 11904: 0xB4E8, + 28211 - 11904: 0xD9F7, + 28212 - 11904: 0xB4F7, + 28213 - 11904: 0xDA55, + 28214 - 11904: 0xDA56, + 28216 - 11904: 0xB4E5, + 28217 - 11904: 0xDA48, + 28218 - 11904: 0xB4F9, + 28219 - 11904: 0xD9FB, + 28220 - 11904: 0xD9ED, + 28221 - 11904: 0xD9EE, + 28222 - 11904: 0xB4FD, + 28223 - 11904: 0xD9F2, + 28224 - 11904: 0xD9F9, + 28225 - 11904: 0xD9F3, + 28227 - 11904: 0xB4FB, + 28228 - 11904: 0xB544, + 28229 - 11904: 0xD9EF, + 28230 - 11904: 0xD9E8, + 28231 - 11904: 0xD9E9, + 28233 - 11904: 0xD9EB, + 28234 - 11904: 0xB4EA, + 28235 - 11904: 0xD9F8, + 28237 - 11904: 0xB4F8, + 28238 - 11904: 0xB542, + 28239 - 11904: 0xFDC0, + 28240 - 11904: 0xFCF9, + 28241 - 11904: 0xD9FA, + 28242 - 11904: 0xDA53, + 28243 - 11904: 0xDA4B, + 28244 - 11904: 0xB4E6, + 28245 - 11904: 0xDA51, + 28246 - 11904: 0xB4F2, + 28247 - 11904: 0x8CDD, + 28248 - 11904: 0xB4F0, + 28249 - 11904: 0xFB7E, + 28250 - 11904: 0xDA57, + 28251 - 11904: 0xB4EF, + 28252 - 11904: 0xDA41, + 28253 - 11904: 0xD9F4, + 28254 - 11904: 0xD9FE, + 28255 - 11904: 0xB547, + 28256 - 11904: 0xDA45, + 28257 - 11904: 0xDA42, + 28258 - 11904: 0xD9F0, + 28259 - 11904: 0xB543, + 28260 - 11904: 0xDA4F, + 28261 - 11904: 0xDA4C, + 28262 - 11904: 0xDA54, + 28263 - 11904: 0xB4E9, + 28264 - 11904: 0xDA40, + 28265 - 11904: 0xB546, + 28267 - 11904: 0xDA47, + 28270 - 11904: 0xB4F3, + 28271 - 11904: 0xB4F6, + 28273 - 11904: 0xDA46, + 28274 - 11904: 0xB545, + 28275 - 11904: 0xD9F5, + 28276 - 11904: 0xD5E4, + 28278 - 11904: 0x92B3, + 28279 - 11904: 0xDA50, + 28280 - 11904: 0xDA4E, + 28281 - 11904: 0xDA52, + 28284 - 11904: 0xFDAF, + 28294 - 11904: 0x8DE1, + 28296 - 11904: 0xD9EC, + 28297 - 11904: 0xB540, + 28299 - 11904: 0x95D3, + 28301 - 11904: 0xDE61, + 28302 - 11904: 0xDE60, + 28303 - 11904: 0xDE46, + 28304 - 11904: 0xB7BD, + 28306 - 11904: 0xDE5F, + 28307 - 11904: 0xDE49, + 28308 - 11904: 0xDE4A, + 28310 - 11904: 0xB7C7, + 28311 - 11904: 0xDE68, + 28312 - 11904: 0xB7C2, + 28313 - 11904: 0xDE5E, + 28314 - 11904: 0x89C1, + 28315 - 11904: 0xDE43, + 28316 - 11904: 0xB7C8, + 28317 - 11904: 0xB7BE, + 28318 - 11904: 0xDE52, + 28319 - 11904: 0xDE48, + 28320 - 11904: 0xDE4B, + 28321 - 11904: 0xDE63, + 28322 - 11904: 0xB7B8, + 28323 - 11904: 0xDE6A, + 28324 - 11904: 0xDE62, + 28325 - 11904: 0xB7C1, + 28326 - 11904: 0xDE57, + 28327 - 11904: 0xB7CC, + 28330 - 11904: 0xB7CB, + 28331 - 11904: 0xB7C5, + 28334 - 11904: 0xDE69, + 28335 - 11904: 0xB7B9, + 28336 - 11904: 0xDE55, + 28337 - 11904: 0xDE4C, + 28338 - 11904: 0xDE59, + 28339 - 11904: 0xDE65, + 28340 - 11904: 0xB7CD, + 28341 - 11904: 0xFD68, + 28342 - 11904: 0xB7BB, + 28343 - 11904: 0xDE54, + 28344 - 11904: 0x9CB7, + 28345 - 11904: 0xDE4D, + 28346 - 11904: 0xB7C4, + 28347 - 11904: 0x8DE3, + 28348 - 11904: 0xB7C3, + 28349 - 11904: 0xDE50, + 28350 - 11904: 0xDE5A, + 28351 - 11904: 0xDE64, + 28352 - 11904: 0xDE47, + 28353 - 11904: 0xDE51, + 28354 - 11904: 0xB7BC, + 28355 - 11904: 0xDE5B, + 28356 - 11904: 0xB7C9, + 28357 - 11904: 0xB7C0, + 28358 - 11904: 0xDE4E, + 28359 - 11904: 0xB7BF, + 28360 - 11904: 0xDE45, + 28361 - 11904: 0xDE53, + 28362 - 11904: 0xDE67, + 28363 - 11904: 0xB4FE, + 28364 - 11904: 0xBAB0, + 28365 - 11904: 0xDE56, + 28366 - 11904: 0xE26C, + 28367 - 11904: 0xDE58, + 28368 - 11904: 0xDE66, + 28369 - 11904: 0xB7C6, + 28370 - 11904: 0xDE4F, + 28371 - 11904: 0xB7BA, + 28372 - 11904: 0xB7CA, + 28373 - 11904: 0xBCF0, + 28374 - 11904: 0xDE44, + 28376 - 11904: 0xDE5D, + 28377 - 11904: 0xFAC0, + 28378 - 11904: 0x8DE5, + 28379 - 11904: 0xFA64, + 28380 - 11904: 0xDE5C, + 28381 - 11904: 0x8947, + 28386 - 11904: 0x8DE4, + 28392 - 11904: 0x8DE7, + 28393 - 11904: 0x8DE8, + 28395 - 11904: 0xE2AA, + 28396 - 11904: 0xBAAD, + 28397 - 11904: 0xE27D, + 28398 - 11904: 0xE2A4, + 28399 - 11904: 0xBAA2, + 28401 - 11904: 0xE26E, + 28402 - 11904: 0xBAAF, + 28404 - 11904: 0xBA77, + 28405 - 11904: 0xE26D, + 28406 - 11904: 0xE2B0, + 28407 - 11904: 0xBAB1, + 28408 - 11904: 0xE271, + 28409 - 11904: 0xE2A3, + 28410 - 11904: 0xFDC7, + 28411 - 11904: 0xE273, + 28412 - 11904: 0xE2B3, + 28413 - 11904: 0xE2AF, + 28414 - 11904: 0xBA75, + 28415 - 11904: 0xBAA1, + 28416 - 11904: 0xE653, + 28417 - 11904: 0xBAAE, + 28418 - 11904: 0xBA7D, + 28419 - 11904: 0xE26F, + 28420 - 11904: 0xFDB0, + 28421 - 11904: 0xE2AE, + 28422 - 11904: 0xBAA3, + 28423 - 11904: 0xE2AB, + 28424 - 11904: 0xE2B8, + 28425 - 11904: 0xE275, + 28426 - 11904: 0xE27E, + 28427 - 11904: 0x9445, + 28428 - 11904: 0x97D6, + 28429 - 11904: 0xE2B6, + 28430 - 11904: 0xE2AC, + 28431 - 11904: 0xBA7C, + 28434 - 11904: 0xE27C, + 28435 - 11904: 0xBA76, + 28436 - 11904: 0xBA74, + 28437 - 11904: 0xBAA8, + 28438 - 11904: 0xFCC6, + 28439 - 11904: 0x9844, + 28440 - 11904: 0xE27A, + 28441 - 11904: 0xE277, + 28442 - 11904: 0xE278, + 28444 - 11904: 0xE2B2, + 28446 - 11904: 0xE2B7, + 28447 - 11904: 0xE2B5, + 28448 - 11904: 0xBA7A, + 28449 - 11904: 0xE2B9, + 28450 - 11904: 0xBA7E, + 28451 - 11904: 0xBAA7, + 28452 - 11904: 0x8DE9, + 28453 - 11904: 0xE270, + 28454 - 11904: 0xE5FA, + 28455 - 11904: 0xE279, + 28457 - 11904: 0xBA78, + 28458 - 11904: 0xBAAC, + 28459 - 11904: 0xBAA9, + 28460 - 11904: 0xBA7B, + 28461 - 11904: 0xE2A5, + 28462 - 11904: 0xE274, + 28463 - 11904: 0xBAAA, + 28464 - 11904: 0xE2A7, + 28465 - 11904: 0xBAA4, + 28466 - 11904: 0xBAA6, + 28467 - 11904: 0xBA73, + 28468 - 11904: 0x8DEA, + 28469 - 11904: 0xE2A9, + 28470 - 11904: 0xE2A1, + 28471 - 11904: 0xE272, + 28472 - 11904: 0xBAA5, + 28473 - 11904: 0xE2B1, + 28474 - 11904: 0xE2B4, + 28475 - 11904: 0xE27B, + 28476 - 11904: 0xE2A8, + 28477 - 11904: 0xFE50, + 28478 - 11904: 0xBA79, + 28479 - 11904: 0xBCDF, + 28480 - 11904: 0xE2A6, + 28481 - 11904: 0xE5F9, + 28483 - 11904: 0xE2AD, + 28484 - 11904: 0xFDCC, + 28494 - 11904: 0xE276, + 28495 - 11904: 0xE644, + 28496 - 11904: 0xE64E, + 28497 - 11904: 0xBCE2, + 28498 - 11904: 0xE64D, + 28499 - 11904: 0xE659, + 28500 - 11904: 0xBCE4, + 28501 - 11904: 0xE64B, + 28502 - 11904: 0x9DA7, + 28503 - 11904: 0xE64F, + 28504 - 11904: 0xBCEF, + 28506 - 11904: 0xE646, + 28507 - 11904: 0xBCE7, + 28508 - 11904: 0xFDCD, + 28509 - 11904: 0xE652, + 28510 - 11904: 0xE9F0, + 28511 - 11904: 0xBCF3, + 28512 - 11904: 0xBCF2, + 28513 - 11904: 0xE654, + 28514 - 11904: 0xE643, + 28515 - 11904: 0xE65E, + 28516 - 11904: 0xBCED, + 28518 - 11904: 0xBCE3, + 28519 - 11904: 0xE657, + 28521 - 11904: 0xE65B, + 28522 - 11904: 0xE660, + 28523 - 11904: 0xE655, + 28524 - 11904: 0xE649, + 28525 - 11904: 0xBCE6, + 28526 - 11904: 0xBCE9, + 28527 - 11904: 0xBCF1, + 28528 - 11904: 0xBCEC, + 28530 - 11904: 0xE64C, + 28531 - 11904: 0xE2A2, + 28532 - 11904: 0xFDCF, + 28534 - 11904: 0xE648, + 28535 - 11904: 0xE65F, + 28536 - 11904: 0xBCE8, + 28537 - 11904: 0x95D2, + 28538 - 11904: 0xBCEB, + 28539 - 11904: 0xE661, + 28540 - 11904: 0xBCE0, + 28541 - 11904: 0xE656, + 28542 - 11904: 0xE5FB, + 28543 - 11904: 0xE65C, + 28544 - 11904: 0xC0DF, + 28545 - 11904: 0x8DED, + 28546 - 11904: 0xE64A, + 28548 - 11904: 0xBCE1, + 28549 - 11904: 0xE645, + 28550 - 11904: 0xBCE5, + 28551 - 11904: 0xE5FC, + 28552 - 11904: 0xBAAB, + 28553 - 11904: 0xE641, + 28554 - 11904: 0xFCBA, + 28555 - 11904: 0xE65A, + 28556 - 11904: 0xE642, + 28557 - 11904: 0xE640, + 28558 - 11904: 0xBCEA, + 28560 - 11904: 0xE658, + 28562 - 11904: 0xE5FE, + 28563 - 11904: 0xE651, + 28564 - 11904: 0xE650, + 28565 - 11904: 0xE65D, + 28566 - 11904: 0xE647, + 28567 - 11904: 0xBCEE, + 28573 - 11904: 0xFDC5, + 28574 - 11904: 0xE9F3, + 28575 - 11904: 0xFDD2, + 28576 - 11904: 0xBF49, + 28577 - 11904: 0xBEFE, + 28578 - 11904: 0xEA40, + 28579 - 11904: 0xE9EB, + 28580 - 11904: 0xBF41, + 28581 - 11904: 0xE9F7, + 28582 - 11904: 0xBF48, + 28583 - 11904: 0xBF43, + 28584 - 11904: 0xE9F5, + 28585 - 11904: 0xED4F, + 28586 - 11904: 0xE9FB, + 28587 - 11904: 0xEA42, + 28588 - 11904: 0xE9FA, + 28589 - 11904: 0xE9E9, + 28590 - 11904: 0xE9F8, + 28591 - 11904: 0xEA44, + 28592 - 11904: 0xEA46, + 28593 - 11904: 0xBEFD, + 28594 - 11904: 0xEA45, + 28595 - 11904: 0xBF44, + 28596 - 11904: 0xBF4A, + 28597 - 11904: 0x9CDC, + 28598 - 11904: 0xBF47, + 28600 - 11904: 0xE9FE, + 28601 - 11904: 0xBF46, + 28602 - 11904: 0xE9F9, + 28603 - 11904: 0x95CF, + 28604 - 11904: 0xE9ED, + 28605 - 11904: 0xE9F2, + 28606 - 11904: 0x8DEE, + 28607 - 11904: 0xE9FD, + 28608 - 11904: 0xBF45, + 28609 - 11904: 0xBF42, + 28610 - 11904: 0xBEFC, + 28611 - 11904: 0xBF40, + 28612 - 11904: 0xE9F1, + 28614 - 11904: 0xE5FD, + 28615 - 11904: 0xE9EC, + 28616 - 11904: 0xE9EF, + 28617 - 11904: 0xEA41, + 28618 - 11904: 0xE9F4, + 28619 - 11904: 0xE9EA, + 28620 - 11904: 0xED4E, + 28621 - 11904: 0xEA43, + 28622 - 11904: 0xE9EE, + 28623 - 11904: 0xE9FC, + 28627 - 11904: 0xFDD4, + 28628 - 11904: 0xED51, + 28629 - 11904: 0xC0E3, + 28632 - 11904: 0xC0D7, + 28633 - 11904: 0x96EC, + 28634 - 11904: 0x96EB, + 28635 - 11904: 0xC0DB, + 28636 - 11904: 0xED53, + 28637 - 11904: 0xED59, + 28638 - 11904: 0xED57, + 28639 - 11904: 0xC0D9, + 28640 - 11904: 0xC0DA, + 28641 - 11904: 0xC0E1, + 28642 - 11904: 0xED5A, + 28643 - 11904: 0xED52, + 28644 - 11904: 0xC0DC, + 28646 - 11904: 0xED56, + 28647 - 11904: 0xED55, + 28648 - 11904: 0xED5B, + 28649 - 11904: 0xC0E2, + 28651 - 11904: 0xC0DD, + 28652 - 11904: 0xC0E0, + 28653 - 11904: 0xED54, + 28654 - 11904: 0xC0E4, + 28655 - 11904: 0xC0DE, + 28656 - 11904: 0xC0E5, + 28657 - 11904: 0xC0D8, + 28658 - 11904: 0xED58, + 28660 - 11904: 0xED50, + 28662 - 11904: 0x90B6, + 28663 - 11904: 0xEFF7, + 28664 - 11904: 0xFDC3, + 28666 - 11904: 0xC271, + 28667 - 11904: 0xEFF4, + 28668 - 11904: 0xEFF6, + 28670 - 11904: 0xC26F, + 28671 - 11904: 0xEFF2, + 28672 - 11904: 0xEFF3, + 28673 - 11904: 0xEFEE, + 28675 - 11904: 0x98AB, + 28676 - 11904: 0xE9F6, + 28677 - 11904: 0xEFEF, + 28678 - 11904: 0xC270, + 28679 - 11904: 0xEFEB, + 28681 - 11904: 0xC26D, + 28682 - 11904: 0xEFF8, + 28683 - 11904: 0xC26E, + 28684 - 11904: 0xEFEC, + 28685 - 11904: 0xEFED, + 28686 - 11904: 0xEFF1, + 28687 - 11904: 0xC273, + 28689 - 11904: 0xC272, + 28692 - 11904: 0xEFF0, + 28693 - 11904: 0xC378, + 28694 - 11904: 0xF25F, + 28695 - 11904: 0xF265, + 28696 - 11904: 0xC379, + 28697 - 11904: 0xF25C, + 28698 - 11904: 0xC376, + 28699 - 11904: 0xC373, + 28700 - 11904: 0xF267, + 28701 - 11904: 0xC377, + 28702 - 11904: 0x96EE, + 28703 - 11904: 0xC374, + 28704 - 11904: 0xF25E, + 28705 - 11904: 0xF261, + 28706 - 11904: 0xF262, + 28707 - 11904: 0xF263, + 28708 - 11904: 0xF266, + 28710 - 11904: 0xEFF5, + 28711 - 11904: 0xF25D, + 28712 - 11904: 0xC375, + 28713 - 11904: 0xF264, + 28714 - 11904: 0xF268, + 28715 - 11904: 0xF260, + 28716 - 11904: 0x8DF4, + 28719 - 11904: 0xF45D, + 28720 - 11904: 0xC46A, + 28721 - 11904: 0xF460, + 28722 - 11904: 0xC46B, + 28723 - 11904: 0xF468, + 28724 - 11904: 0xF45F, + 28725 - 11904: 0xF45C, + 28727 - 11904: 0xF45E, + 28728 - 11904: 0xF462, + 28729 - 11904: 0xF465, + 28730 - 11904: 0xF464, + 28731 - 11904: 0xF467, + 28732 - 11904: 0xF45B, + 28734 - 11904: 0xC469, + 28735 - 11904: 0xF463, + 28736 - 11904: 0xF466, + 28737 - 11904: 0xF469, + 28738 - 11904: 0xF461, + 28739 - 11904: 0xF5D3, + 28740 - 11904: 0xF5D4, + 28741 - 11904: 0xF5D8, + 28742 - 11904: 0xF5D9, + 28744 - 11904: 0xF5D6, + 28745 - 11904: 0xF5D7, + 28746 - 11904: 0xF5D5, + 28747 - 11904: 0xFDE0, + 28748 - 11904: 0xC4E9, + 28749 - 11904: 0x8C67, + 28752 - 11904: 0x8DF6, + 28753 - 11904: 0xC578, + 28754 - 11904: 0xF6EB, + 28756 - 11904: 0x8DF7, + 28757 - 11904: 0xF6E8, + 28758 - 11904: 0xF6E9, + 28759 - 11904: 0xF6EA, + 28760 - 11904: 0xC579, + 28762 - 11904: 0xF7E5, + 28763 - 11904: 0xF7E4, + 28764 - 11904: 0x8FFA, + 28765 - 11904: 0xF8AF, + 28766 - 11904: 0xC5F4, + 28767 - 11904: 0xF8AD, + 28768 - 11904: 0xF8B0, + 28769 - 11904: 0xF8AE, + 28770 - 11904: 0xF8F5, + 28771 - 11904: 0xC657, + 28772 - 11904: 0xC665, + 28773 - 11904: 0xF9A3, + 28774 - 11904: 0xF96C, + 28775 - 11904: 0x97D0, + 28776 - 11904: 0xF9A2, + 28777 - 11904: 0xF9D0, + 28778 - 11904: 0xF9D1, + 28779 - 11904: 0xA4F5, + 28780 - 11904: 0x8BD2, + 28782 - 11904: 0x87DE, + 28783 - 11904: 0x8DF8, + 28784 - 11904: 0xA6C7, + 28785 - 11904: 0xCA41, + 28788 - 11904: 0xCB5E, + 28789 - 11904: 0x90D9, + 28790 - 11904: 0xA85F, + 28791 - 11904: 0x8C47, + 28792 - 11904: 0xA862, + 28793 - 11904: 0xFAF0, + 28794 - 11904: 0xCB5F, + 28796 - 11904: 0xA860, + 28797 - 11904: 0xA861, + 28798 - 11904: 0xFDE1, + 28799 - 11904: 0x8DF9, + 28801 - 11904: 0xFDE3, + 28802 - 11904: 0xCD58, + 28803 - 11904: 0xCD5A, + 28804 - 11904: 0xCD55, + 28805 - 11904: 0xCD52, + 28806 - 11904: 0xCD54, + 28809 - 11904: 0x8DFA, + 28810 - 11904: 0xAAA4, + 28811 - 11904: 0xFB63, + 28814 - 11904: 0xAAA2, + 28815 - 11904: 0x90A6, + 28817 - 11904: 0xCD56, + 28818 - 11904: 0xAAA3, + 28819 - 11904: 0xCD53, + 28820 - 11904: 0xCD50, + 28821 - 11904: 0xAAA1, + 28822 - 11904: 0xCD57, + 28824 - 11904: 0xCD51, + 28825 - 11904: 0xAAA5, + 28826 - 11904: 0xCD59, + 28831 - 11904: 0xCFAF, + 28832 - 11904: 0x9970, + 28833 - 11904: 0xCFB3, + 28835 - 11904: 0x91EB, + 28836 - 11904: 0xACB7, + 28837 - 11904: 0x9770, + 28838 - 11904: 0x986F, + 28839 - 11904: 0xFDE2, + 28841 - 11904: 0xCFB6, + 28843 - 11904: 0xACAF, + 28844 - 11904: 0xACB2, + 28845 - 11904: 0xACB4, + 28846 - 11904: 0xACB6, + 28847 - 11904: 0xACB3, + 28848 - 11904: 0xCFB2, + 28849 - 11904: 0xCFB1, + 28851 - 11904: 0xACB1, + 28852 - 11904: 0xCFB4, + 28853 - 11904: 0xCFB5, + 28855 - 11904: 0xCFAE, + 28856 - 11904: 0xACB5, + 28857 - 11904: 0x98F2, + 28858 - 11904: 0xACB0, + 28859 - 11904: 0x9AFC, + 28860 - 11904: 0x896C, + 28861 - 11904: 0xFDFD, + 28862 - 11904: 0xCFB0, + 28864 - 11904: 0x995E, + 28868 - 11904: 0x95BD, + 28869 - 11904: 0xD277, + 28870 - 11904: 0xD278, + 28871 - 11904: 0xD279, + 28872 - 11904: 0xAF50, + 28874 - 11904: 0xAF4C, + 28875 - 11904: 0xD26E, + 28876 - 11904: 0xFDE4, + 28877 - 11904: 0xD276, + 28878 - 11904: 0xD27B, + 28879 - 11904: 0xAF51, + 28880 - 11904: 0x91E6, + 28881 - 11904: 0xD26C, + 28882 - 11904: 0xD272, + 28883 - 11904: 0xD26B, + 28884 - 11904: 0xD275, + 28885 - 11904: 0xFDE5, + 28886 - 11904: 0xFDE6, + 28887 - 11904: 0xD271, + 28888 - 11904: 0xAF4D, + 28889 - 11904: 0xAF4F, + 28890 - 11904: 0xD27A, + 28892 - 11904: 0xD26A, + 28893 - 11904: 0xD26D, + 28894 - 11904: 0xD273, + 28895 - 11904: 0xFDE7, + 28896 - 11904: 0xD274, + 28897 - 11904: 0xD27C, + 28898 - 11904: 0xD270, + 28900 - 11904: 0xAF4E, + 28911 - 11904: 0xB26D, + 28912 - 11904: 0xD64E, + 28913 - 11904: 0x9454, + 28915 - 11904: 0xD650, + 28916 - 11904: 0xD64C, + 28917 - 11904: 0x99B8, + 28918 - 11904: 0xD658, + 28919 - 11904: 0xD64A, + 28920 - 11904: 0xD657, + 28921 - 11904: 0xB269, + 28922 - 11904: 0xD648, + 28923 - 11904: 0xDA5B, + 28924 - 11904: 0xD652, + 28925 - 11904: 0xB26C, + 28926 - 11904: 0x97E9, + 28927 - 11904: 0xD653, + 28928 - 11904: 0xD656, + 28930 - 11904: 0xD65A, + 28932 - 11904: 0xD64F, + 28933 - 11904: 0x9346, + 28934 - 11904: 0xD654, + 28937 - 11904: 0xB26A, + 28938 - 11904: 0xB26B, + 28939 - 11904: 0xD659, + 28940 - 11904: 0xD64D, + 28941 - 11904: 0xD649, + 28942 - 11904: 0xD65B, + 28944 - 11904: 0xD651, + 28947 - 11904: 0xD655, + 28951 - 11904: 0xD64B, + 28953 - 11904: 0xB548, + 28954 - 11904: 0xB549, + 28955 - 11904: 0xDA65, + 28956 - 11904: 0xB54F, + 28957 - 11904: 0x9863, + 28958 - 11904: 0xDA59, + 28959 - 11904: 0xDA62, + 28960 - 11904: 0xDA58, + 28961 - 11904: 0xB54C, + 28962 - 11904: 0xDA60, + 28963 - 11904: 0xDA5E, + 28965 - 11904: 0xDA5F, + 28966 - 11904: 0xB54A, + 28968 - 11904: 0xDA63, + 28969 - 11904: 0x95BC, + 28971 - 11904: 0xFDED, + 28972 - 11904: 0xFDF7, + 28974 - 11904: 0xDA5C, + 28975 - 11904: 0xDA5A, + 28976 - 11904: 0xB54B, + 28977 - 11904: 0xDA5D, + 28978 - 11904: 0xDA61, + 28979 - 11904: 0x9870, + 28980 - 11904: 0x96F6, + 28981 - 11904: 0x8EA9, + 28982 - 11904: 0xB54D, + 28986 - 11904: 0xDA64, + 28987 - 11904: 0x9451, + 28990 - 11904: 0x8E43, + 28992 - 11904: 0x8B5A, + 28993 - 11904: 0xDE70, + 28994 - 11904: 0xDE77, + 28995 - 11904: 0xDE79, + 28996 - 11904: 0xDEA1, + 28997 - 11904: 0xFDEE, + 28998 - 11904: 0xB7DA, + 28999 - 11904: 0xDE6B, + 29001 - 11904: 0xB7D2, + 29002 - 11904: 0xFDF0, + 29003 - 11904: 0xDE7A, + 29004 - 11904: 0xB7D7, + 29005 - 11904: 0xDEA2, + 29006 - 11904: 0xB7CE, + 29007 - 11904: 0xFDF4, + 29008 - 11904: 0xDE7D, + 29009 - 11904: 0x9BF5, + 29010 - 11904: 0xDE6D, + 29011 - 11904: 0xDE7E, + 29012 - 11904: 0xDE6C, + 29014 - 11904: 0xB7DC, + 29015 - 11904: 0x8CEE, + 29016 - 11904: 0xDE78, + 29017 - 11904: 0xB7CF, + 29018 - 11904: 0xDEA3, + 29020 - 11904: 0xB7D4, + 29021 - 11904: 0xDE71, + 29022 - 11904: 0xB7D9, + 29023 - 11904: 0xDE7C, + 29024 - 11904: 0xDE6F, + 29025 - 11904: 0xDE76, + 29026 - 11904: 0xDE72, + 29027 - 11904: 0xDE6E, + 29028 - 11904: 0xB7D1, + 29029 - 11904: 0xB7D8, + 29030 - 11904: 0xB7D6, + 29031 - 11904: 0xB7D3, + 29032 - 11904: 0xB7DB, + 29033 - 11904: 0xB7D0, + 29034 - 11904: 0xDE75, + 29035 - 11904: 0x977E, + 29036 - 11904: 0xB7D5, + 29038 - 11904: 0xFDF1, + 29040 - 11904: 0xDE7B, + 29041 - 11904: 0x9BD5, + 29042 - 11904: 0xDE73, + 29043 - 11904: 0x9AC3, + 29045 - 11904: 0x97C8, + 29046 - 11904: 0xA0DB, + 29047 - 11904: 0x91D0, + 29048 - 11904: 0xDE74, + 29050 - 11904: 0x9FE4, + 29051 - 11904: 0xE2C1, + 29052 - 11904: 0x8FDD, + 29053 - 11904: 0xBAB4, + 29054 - 11904: 0x91E9, + 29056 - 11904: 0xE2BD, + 29057 - 11904: 0xE2C3, + 29058 - 11904: 0xE2BF, + 29060 - 11904: 0xBAB6, + 29061 - 11904: 0xE2BE, + 29062 - 11904: 0xE2C2, + 29063 - 11904: 0xE2BA, + 29064 - 11904: 0x98E0, + 29065 - 11904: 0xE2BC, + 29066 - 11904: 0xBAB5, + 29068 - 11904: 0x92CA, + 29070 - 11904: 0x9857, + 29071 - 11904: 0xE2C0, + 29072 - 11904: 0xE2BB, + 29073 - 11904: 0x8C51, + 29074 - 11904: 0xBAB7, + 29076 - 11904: 0xBAB2, + 29078 - 11904: 0xFDEB, + 29079 - 11904: 0xE2C4, + 29080 - 11904: 0x9B49, + 29081 - 11904: 0xBAB3, + 29082 - 11904: 0xE667, + 29083 - 11904: 0xE664, + 29084 - 11904: 0xE670, + 29085 - 11904: 0xE66A, + 29086 - 11904: 0xE66C, + 29087 - 11904: 0xBCF4, + 29088 - 11904: 0xE666, + 29089 - 11904: 0xE66E, + 29090 - 11904: 0x9D76, + 29091 - 11904: 0x9EAF, + 29092 - 11904: 0xE66D, + 29093 - 11904: 0xE66B, + 29095 - 11904: 0xE671, + 29096 - 11904: 0xBCF7, + 29097 - 11904: 0xE668, + 29098 - 11904: 0xE66F, + 29100 - 11904: 0xBCF5, + 29101 - 11904: 0x9CCC, + 29103 - 11904: 0xE663, + 29104 - 11904: 0xE665, + 29105 - 11904: 0xBCF6, + 29106 - 11904: 0xE662, + 29107 - 11904: 0xE672, + 29108 - 11904: 0xFDEA, + 29109 - 11904: 0xE669, + 29111 - 11904: 0x8DF1, + 29112 - 11904: 0xEA4A, + 29113 - 11904: 0xBF51, + 29114 - 11904: 0xFDFB, + 29116 - 11904: 0xEA55, + 29117 - 11904: 0xEA53, + 29118 - 11904: 0xBF4B, + 29119 - 11904: 0xEA49, + 29120 - 11904: 0xEA4C, + 29121 - 11904: 0xEA4D, + 29122 - 11904: 0xEA48, + 29123 - 11904: 0xBF55, + 29124 - 11904: 0xBF56, + 29125 - 11904: 0xEA47, + 29126 - 11904: 0xEA56, + 29127 - 11904: 0xEA51, + 29128 - 11904: 0xBF4F, + 29129 - 11904: 0xBF4C, + 29130 - 11904: 0xEA50, + 29131 - 11904: 0xEA4E, + 29134 - 11904: 0xBF52, + 29135 - 11904: 0xEA52, + 29136 - 11904: 0xBF4D, + 29137 - 11904: 0x8E53, + 29138 - 11904: 0xBF4E, + 29140 - 11904: 0xEA4F, + 29141 - 11904: 0xBF50, + 29142 - 11904: 0xEA4B, + 29144 - 11904: 0xEA54, + 29145 - 11904: 0xBF53, + 29146 - 11904: 0xEA57, + 29147 - 11904: 0xEA58, + 29148 - 11904: 0xBF54, + 29149 - 11904: 0xFACF, + 29151 - 11904: 0xC0E7, + 29152 - 11904: 0xC0EE, + 29153 - 11904: 0xED5C, + 29154 - 11904: 0xED62, + 29156 - 11904: 0xED60, + 29157 - 11904: 0xC0EA, + 29158 - 11904: 0xC0E9, + 29159 - 11904: 0xC0E6, + 29160 - 11904: 0xED5E, + 29163 - 11904: 0x96F9, + 29164 - 11904: 0xC0EC, + 29165 - 11904: 0xC0EB, + 29166 - 11904: 0xC0E8, + 29168 - 11904: 0xED61, + 29169 - 11904: 0xED5D, + 29170 - 11904: 0xED5F, + 29172 - 11904: 0xC0ED, + 29173 - 11904: 0x98BF, + 29174 - 11904: 0x9E49, + 29176 - 11904: 0xC277, + 29177 - 11904: 0xEFFB, + 29179 - 11904: 0xC274, + 29180 - 11904: 0xC275, + 29181 - 11904: 0xEFFD, + 29182 - 11904: 0xC276, + 29183 - 11904: 0xEFFA, + 29184 - 11904: 0x8CA7, + 29185 - 11904: 0xEFF9, + 29186 - 11904: 0xF26C, + 29187 - 11904: 0xEFFC, + 29189 - 11904: 0xF26D, + 29190 - 11904: 0xC37A, + 29191 - 11904: 0xF26B, + 29193 - 11904: 0x9BCA, + 29194 - 11904: 0xF26A, + 29196 - 11904: 0xF269, + 29197 - 11904: 0xC37B, + 29198 - 11904: 0xFDFE, + 29199 - 11904: 0x92DC, + 29200 - 11904: 0xC46C, + 29203 - 11904: 0xF46A, + 29204 - 11904: 0xF46B, + 29205 - 11904: 0xFE41, + 29206 - 11904: 0x91CC, + 29207 - 11904: 0x91E2, + 29209 - 11904: 0xF5DC, + 29210 - 11904: 0xF5DB, + 29211 - 11904: 0xC4EA, + 29213 - 11904: 0xF5DA, + 29214 - 11904: 0xF6EC, + 29215 - 11904: 0xF6ED, + 29218 - 11904: 0xF7E6, + 29219 - 11904: 0xF8B1, + 29220 - 11904: 0xFE44, + 29221 - 11904: 0x875F, + 29222 - 11904: 0xF8F6, + 29223 - 11904: 0xF9BC, + 29224 - 11904: 0xC679, + 29225 - 11904: 0xF9C6, + 29226 - 11904: 0xA4F6, + 29227 - 11904: 0x8BD3, + 29228 - 11904: 0xAAA6, + 29229 - 11904: 0xAAA7, + 29230 - 11904: 0xFE47, + 29232 - 11904: 0xACB8, + 29237 - 11904: 0xC0EF, + 29238 - 11904: 0xA4F7, + 29240 - 11904: 0xAAA8, + 29241 - 11904: 0xAF52, + 29242 - 11904: 0xB7DD, + 29243 - 11904: 0xA4F8, + 29245 - 11904: 0xB26E, + 29246 - 11904: 0xBAB8, + 29247 - 11904: 0xC962, + 29248 - 11904: 0xFE48, + 29249 - 11904: 0xCFB7, + 29250 - 11904: 0xD27D, + 29252 - 11904: 0xE2C5, + 29254 - 11904: 0xC0F0, + 29255 - 11904: 0xA4F9, + 29256 - 11904: 0xAAA9, + 29257 - 11904: 0xCFB8, + 29258 - 11904: 0xCFB9, + 29259 - 11904: 0xDA66, + 29260 - 11904: 0xB550, + 29263 - 11904: 0xDEA4, + 29264 - 11904: 0xA0E4, + 29266 - 11904: 0xB7DE, + 29267 - 11904: 0xE2C6, + 29269 - 11904: 0xFE4B, + 29270 - 11904: 0xBCF8, + 29271 - 11904: 0xFE4C, + 29272 - 11904: 0xC37C, + 29273 - 11904: 0xA4FA, + 29274 - 11904: 0xDA67, + 29275 - 11904: 0xA4FB, + 29276 - 11904: 0x8DBF, + 29277 - 11904: 0xA6C9, + 29278 - 11904: 0xCA42, + 29279 - 11904: 0xA6C8, + 29280 - 11904: 0xA865, + 29281 - 11904: 0xA864, + 29282 - 11904: 0xA863, + 29283 - 11904: 0xCB60, + 29286 - 11904: 0x9E78, + 29287 - 11904: 0xAAAA, + 29289 - 11904: 0xAAAB, + 29290 - 11904: 0xCD5B, + 29292 - 11904: 0xCFBA, + 29294 - 11904: 0xCFBD, + 29295 - 11904: 0xACBA, + 29296 - 11904: 0xCFBB, + 29298 - 11904: 0xACB9, + 29299 - 11904: 0xCFBC, + 29300 - 11904: 0xACBB, + 29302 - 11904: 0xD2A2, + 29303 - 11904: 0xD2A1, + 29304 - 11904: 0xD27E, + 29305 - 11904: 0xAF53, + 29307 - 11904: 0xD65D, + 29308 - 11904: 0xD65E, + 29309 - 11904: 0xB26F, + 29310 - 11904: 0xD65C, + 29311 - 11904: 0xD65F, + 29312 - 11904: 0xB552, + 29313 - 11904: 0xB270, + 29314 - 11904: 0xFE51, + 29316 - 11904: 0xB551, + 29317 - 11904: 0xDA6B, + 29318 - 11904: 0xDA6A, + 29319 - 11904: 0x9456, + 29320 - 11904: 0xDA68, + 29321 - 11904: 0xDA69, + 29323 - 11904: 0xDA6C, + 29324 - 11904: 0xDEA6, + 29325 - 11904: 0xDEA5, + 29326 - 11904: 0xDEA9, + 29327 - 11904: 0x9D61, + 29328 - 11904: 0xDEA8, + 29329 - 11904: 0xDEA7, + 29330 - 11904: 0xBAB9, + 29331 - 11904: 0xE2C9, + 29332 - 11904: 0x9457, + 29333 - 11904: 0xE2C8, + 29334 - 11904: 0xBABA, + 29335 - 11904: 0xE2C7, + 29336 - 11904: 0xE673, + 29338 - 11904: 0xE674, + 29339 - 11904: 0xBCF9, + 29341 - 11904: 0xEA59, + 29342 - 11904: 0xEA5A, + 29343 - 11904: 0x9966, + 29345 - 11904: 0xF272, + 29346 - 11904: 0xC37D, + 29347 - 11904: 0xF271, + 29348 - 11904: 0xF270, + 29349 - 11904: 0xF26E, + 29350 - 11904: 0xF26F, + 29351 - 11904: 0xC4EB, + 29352 - 11904: 0xF46C, + 29353 - 11904: 0xF6EE, + 29354 - 11904: 0xF8F7, + 29356 - 11904: 0xA4FC, + 29357 - 11904: 0x8BD5, + 29358 - 11904: 0xC9A5, + 29359 - 11904: 0xA5C7, + 29360 - 11904: 0xC9A6, + 29362 - 11904: 0xA069, + 29364 - 11904: 0xCA43, + 29365 - 11904: 0xCA44, + 29370 - 11904: 0xCB66, + 29373 - 11904: 0xCB62, + 29375 - 11904: 0xCB61, + 29376 - 11904: 0xAAAC, + 29377 - 11904: 0xCB65, + 29378 - 11904: 0xA867, + 29379 - 11904: 0xCB63, + 29380 - 11904: 0xA866, + 29381 - 11904: 0xCB67, + 29382 - 11904: 0xCB64, + 29385 - 11904: 0xCD5F, + 29386 - 11904: 0xCFBE, + 29387 - 11904: 0xCD5D, + 29388 - 11904: 0xCD64, + 29389 - 11904: 0x98B4, + 29390 - 11904: 0xAAAD, + 29392 - 11904: 0xAAB0, + 29393 - 11904: 0xCD65, + 29394 - 11904: 0xCD61, + 29396 - 11904: 0xCD62, + 29398 - 11904: 0xCD5C, + 29399 - 11904: 0xAAAF, + 29400 - 11904: 0xCD5E, + 29401 - 11904: 0xAAAE, + 29402 - 11904: 0xCD63, + 29404 - 11904: 0xCD60, + 29407 - 11904: 0xCFC2, + 29408 - 11904: 0xACBD, + 29409 - 11904: 0xACBE, + 29410 - 11904: 0xA049, + 29411 - 11904: 0xCFC5, + 29412 - 11904: 0xCFBF, + 29414 - 11904: 0xCFC4, + 29416 - 11904: 0xCFC0, + 29417 - 11904: 0xACBC, + 29418 - 11904: 0xCFC3, + 29419 - 11904: 0xCFC1, + 29427 - 11904: 0xD2A8, + 29428 - 11904: 0xD2A5, + 29430 - 11904: 0xD2A7, + 29431 - 11904: 0xAF58, + 29432 - 11904: 0xAF57, + 29433 - 11904: 0xAF55, + 29434 - 11904: 0xD2A4, + 29435 - 11904: 0xD2A9, + 29436 - 11904: 0xAF54, + 29437 - 11904: 0xAF56, + 29438 - 11904: 0xD2A6, + 29439 - 11904: 0xD667, + 29440 - 11904: 0xD2A3, + 29441 - 11904: 0xD2AA, + 29442 - 11904: 0xA04C, + 29444 - 11904: 0x9E65, + 29447 - 11904: 0xD662, + 29448 - 11904: 0xD666, + 29450 - 11904: 0xD665, + 29451 - 11904: 0xDA6E, + 29452 - 11904: 0xDA79, + 29455 - 11904: 0xD668, + 29456 - 11904: 0x98B5, + 29457 - 11904: 0xD663, + 29458 - 11904: 0xDA6D, + 29459 - 11904: 0xB274, + 29462 - 11904: 0xB273, + 29463 - 11904: 0xD661, + 29464 - 11904: 0xD664, + 29465 - 11904: 0xB275, + 29467 - 11904: 0xB272, + 29468 - 11904: 0xB271, + 29469 - 11904: 0xD660, + 29470 - 11904: 0xD669, + 29474 - 11904: 0xDA70, + 29475 - 11904: 0xDA77, + 29477 - 11904: 0xB554, + 29478 - 11904: 0xDA76, + 29479 - 11904: 0xDA73, + 29480 - 11904: 0xFE58, + 29481 - 11904: 0xB556, + 29482 - 11904: 0xFE52, + 29483 - 11904: 0xFE53, + 29484 - 11904: 0xA065, + 29485 - 11904: 0xDA75, + 29486 - 11904: 0xFE59, + 29488 - 11904: 0xDA6F, + 29489 - 11904: 0xDA71, + 29490 - 11904: 0xDA74, + 29491 - 11904: 0xDA72, + 29492 - 11904: 0xB555, + 29493 - 11904: 0xDA78, + 29494 - 11904: 0xB553, + 29495 - 11904: 0xB7DF, + 29496 - 11904: 0x98B7, + 29497 - 11904: 0x98B8, + 29498 - 11904: 0xDEAD, + 29499 - 11904: 0xDEAC, + 29500 - 11904: 0xDEAA, + 29502 - 11904: 0xB7E2, + 29503 - 11904: 0xB7E1, + 29504 - 11904: 0xDEAE, + 29505 - 11904: 0x98BA, + 29506 - 11904: 0xDEAB, + 29507 - 11904: 0xE2CA, + 29508 - 11904: 0xBABB, + 29509 - 11904: 0xB7E0, + 29512 - 11904: 0x98BB, + 29513 - 11904: 0xDEB0, + 29514 - 11904: 0xDEAF, + 29516 - 11904: 0xE2CD, + 29517 - 11904: 0xE2CB, + 29518 - 11904: 0xBCFA, + 29519 - 11904: 0x9FBC, + 29520 - 11904: 0xBABC, + 29521 - 11904: 0xE2CC, + 29522 - 11904: 0xE676, + 29527 - 11904: 0xBCFB, + 29528 - 11904: 0xE675, + 29529 - 11904: 0xE67E, + 29530 - 11904: 0xE67D, + 29531 - 11904: 0xE67B, + 29533 - 11904: 0xE67A, + 29534 - 11904: 0xE677, + 29535 - 11904: 0xE678, + 29536 - 11904: 0xE679, + 29537 - 11904: 0xE67C, + 29538 - 11904: 0xE6A1, + 29541 - 11904: 0xEA5F, + 29542 - 11904: 0xEA5C, + 29543 - 11904: 0xEA5D, + 29544 - 11904: 0xBF57, + 29545 - 11904: 0xEA5B, + 29546 - 11904: 0xEA61, + 29547 - 11904: 0xEA60, + 29548 - 11904: 0xEA5E, + 29550 - 11904: 0xED64, + 29551 - 11904: 0xED65, + 29552 - 11904: 0xC0F1, + 29553 - 11904: 0xA04A, + 29554 - 11904: 0xC0F2, + 29555 - 11904: 0xED63, + 29556 - 11904: 0x9EC7, + 29557 - 11904: 0xC279, + 29558 - 11904: 0xEFFE, + 29559 - 11904: 0xC278, + 29560 - 11904: 0xC37E, + 29562 - 11904: 0xC3A1, + 29563 - 11904: 0xC46D, + 29564 - 11904: 0xF46E, + 29565 - 11904: 0xF46D, + 29566 - 11904: 0xF5DD, + 29567 - 11904: 0xF6EF, + 29568 - 11904: 0xC57A, + 29569 - 11904: 0xF7E8, + 29570 - 11904: 0xF7E7, + 29571 - 11904: 0xF7E9, + 29572 - 11904: 0xA5C8, + 29573 - 11904: 0xCFC6, + 29574 - 11904: 0xAF59, + 29575 - 11904: 0xB276, + 29576 - 11904: 0xD66A, + 29577 - 11904: 0xA5C9, + 29578 - 11904: 0xC9A7, + 29579 - 11904: 0xA4FD, + 29580 - 11904: 0x8CA9, + 29582 - 11904: 0xCA45, + 29583 - 11904: 0x98AE, + 29586 - 11904: 0xCB6C, + 29587 - 11904: 0xCB6A, + 29588 - 11904: 0xCB6B, + 29589 - 11904: 0xCB68, + 29590 - 11904: 0xA868, + 29591 - 11904: 0xCB69, + 29592 - 11904: 0x92D6, + 29596 - 11904: 0xFAE1, + 29597 - 11904: 0xCD6D, + 29598 - 11904: 0x91D4, + 29599 - 11904: 0xAAB3, + 29600 - 11904: 0xCD6B, + 29601 - 11904: 0xCD67, + 29602 - 11904: 0xCD6A, + 29604 - 11904: 0xCD66, + 29605 - 11904: 0xAAB5, + 29606 - 11904: 0xCD69, + 29607 - 11904: 0xFADE, + 29608 - 11904: 0xAAB2, + 29609 - 11904: 0xAAB1, + 29610 - 11904: 0xFE5B, + 29611 - 11904: 0xAAB4, + 29612 - 11904: 0xCD6C, + 29613 - 11904: 0xCD68, + 29618 - 11904: 0xACC2, + 29619 - 11904: 0xACC5, + 29620 - 11904: 0xCFCE, + 29621 - 11904: 0xCFCD, + 29622 - 11904: 0xCFCC, + 29623 - 11904: 0xACBF, + 29624 - 11904: 0xCFD5, + 29625 - 11904: 0xCFCB, + 29626 - 11904: 0x8C53, + 29627 - 11904: 0xACC1, + 29628 - 11904: 0xD2AF, + 29630 - 11904: 0xCFD2, + 29631 - 11904: 0xCFD0, + 29632 - 11904: 0xACC4, + 29634 - 11904: 0xCFC8, + 29635 - 11904: 0xCFD3, + 29636 - 11904: 0x87BF, + 29637 - 11904: 0xCFCA, + 29638 - 11904: 0xCFD4, + 29639 - 11904: 0xCFD1, + 29640 - 11904: 0xCFC9, + 29641 - 11904: 0xFE5E, + 29642 - 11904: 0xACC0, + 29643 - 11904: 0xCFD6, + 29644 - 11904: 0xCFC7, + 29645 - 11904: 0xACC3, + 29646 - 11904: 0xFBD7, + 29647 - 11904: 0xFE5A, + 29648 - 11904: 0x94C5, + 29650 - 11904: 0xD2B4, + 29651 - 11904: 0xD2AB, + 29652 - 11904: 0xD2B6, + 29653 - 11904: 0xFACA, + 29654 - 11904: 0xD2AE, + 29655 - 11904: 0xD2B9, + 29656 - 11904: 0xD2BA, + 29657 - 11904: 0xD2AC, + 29658 - 11904: 0xD2B8, + 29659 - 11904: 0xD2B5, + 29660 - 11904: 0xD2B3, + 29661 - 11904: 0xD2B7, + 29662 - 11904: 0xAF5F, + 29664 - 11904: 0xAF5D, + 29665 - 11904: 0x98C1, + 29666 - 11904: 0x975C, + 29667 - 11904: 0xD2B1, + 29668 - 11904: 0xFE74, + 29669 - 11904: 0xD2AD, + 29670 - 11904: 0x9773, + 29671 - 11904: 0xD2B0, + 29672 - 11904: 0xD2BB, + 29673 - 11904: 0xD2B2, + 29674 - 11904: 0xAF5E, + 29675 - 11904: 0xCFCF, + 29677 - 11904: 0xAF5A, + 29678 - 11904: 0xAF5C, + 29679 - 11904: 0xFA46, + 29683 - 11904: 0x9764, + 29684 - 11904: 0xD678, + 29685 - 11904: 0xD66D, + 29686 - 11904: 0xD66B, + 29687 - 11904: 0xFE68, + 29688 - 11904: 0xD66C, + 29689 - 11904: 0x964E, + 29690 - 11904: 0xD673, + 29691 - 11904: 0x9765, + 29692 - 11904: 0xD674, + 29693 - 11904: 0xD670, + 29694 - 11904: 0xB27B, + 29695 - 11904: 0xD675, + 29696 - 11904: 0xD672, + 29697 - 11904: 0xD66F, + 29698 - 11904: 0x8C5A, + 29699 - 11904: 0xB279, + 29700 - 11904: 0xD66E, + 29701 - 11904: 0xB277, + 29702 - 11904: 0xB27A, + 29703 - 11904: 0xD671, + 29704 - 11904: 0xD679, + 29705 - 11904: 0xAF5B, + 29706 - 11904: 0xB278, + 29707 - 11904: 0xD677, + 29708 - 11904: 0xD676, + 29709 - 11904: 0xB27C, + 29713 - 11904: 0x89A1, + 29714 - 11904: 0x95FA, + 29716 - 11904: 0x92D4, + 29717 - 11904: 0xFE69, + 29718 - 11904: 0xDA7E, + 29719 - 11904: 0xFB45, + 29721 - 11904: 0x98C8, + 29722 - 11904: 0xDAA1, + 29723 - 11904: 0xB560, + 29724 - 11904: 0x90EF, + 29725 - 11904: 0xDAA7, + 29726 - 11904: 0x98C9, + 29727 - 11904: 0x98CA, + 29728 - 11904: 0xDAA9, + 29729 - 11904: 0xDAA2, + 29730 - 11904: 0xB55A, + 29731 - 11904: 0xDAA6, + 29732 - 11904: 0xDAA5, + 29733 - 11904: 0xB55B, + 29734 - 11904: 0xB561, + 29736 - 11904: 0xB562, + 29737 - 11904: 0xDAA8, + 29738 - 11904: 0xB558, + 29739 - 11904: 0xDA7D, + 29740 - 11904: 0xDA7B, + 29741 - 11904: 0xDAA3, + 29742 - 11904: 0xDA7A, + 29743 - 11904: 0xB55F, + 29744 - 11904: 0xDA7C, + 29745 - 11904: 0xDAA4, + 29746 - 11904: 0xDAAA, + 29747 - 11904: 0xB559, + 29748 - 11904: 0xB55E, + 29749 - 11904: 0xB55C, + 29750 - 11904: 0xB55D, + 29751 - 11904: 0x946D, + 29752 - 11904: 0x94B7, + 29753 - 11904: 0xFE6C, + 29754 - 11904: 0xB557, + 29756 - 11904: 0x946B, + 29759 - 11904: 0xB7E9, + 29760 - 11904: 0xDEB7, + 29761 - 11904: 0xB7E8, + 29762 - 11904: 0xDEBB, + 29763 - 11904: 0x92FC, + 29764 - 11904: 0xDEB1, + 29765 - 11904: 0x95EB, + 29766 - 11904: 0xDEBC, + 29767 - 11904: 0xFE73, + 29768 - 11904: 0x976E, + 29769 - 11904: 0xFE5F, + 29770 - 11904: 0xDEB2, + 29771 - 11904: 0xDEB3, + 29772 - 11904: 0x87B8, + 29773 - 11904: 0xDEBD, + 29774 - 11904: 0xDEBA, + 29775 - 11904: 0xDEB8, + 29776 - 11904: 0xDEB9, + 29777 - 11904: 0xDEB5, + 29778 - 11904: 0xDEB4, + 29779 - 11904: 0xFDBD, + 29780 - 11904: 0xDEBE, + 29781 - 11904: 0xB7E5, + 29782 - 11904: 0x92D5, + 29783 - 11904: 0xDEB6, + 29785 - 11904: 0xB7EA, + 29786 - 11904: 0xB7E4, + 29787 - 11904: 0xB7EB, + 29788 - 11904: 0xFE6F, + 29789 - 11904: 0xFEB9, + 29790 - 11904: 0xB7E7, + 29791 - 11904: 0xB7E6, + 29792 - 11904: 0xFE71, + 29793 - 11904: 0x8778, + 29794 - 11904: 0xE2CE, + 29795 - 11904: 0xBABE, + 29796 - 11904: 0xBABD, + 29797 - 11904: 0xFBBB, + 29799 - 11904: 0xE2D3, + 29800 - 11904: 0xA0D5, + 29801 - 11904: 0xBCFC, + 29802 - 11904: 0xBABF, + 29803 - 11904: 0x95FB, + 29804 - 11904: 0xFE77, + 29805 - 11904: 0xBAC1, + 29806 - 11904: 0xE2D4, + 29807 - 11904: 0xB7E3, + 29808 - 11904: 0xBAC0, + 29809 - 11904: 0xE2D0, + 29810 - 11904: 0xE2D2, + 29811 - 11904: 0xE2CF, + 29812 - 11904: 0xFE79, + 29813 - 11904: 0xE2D1, + 29814 - 11904: 0xFE75, + 29817 - 11904: 0xE6AB, + 29818 - 11904: 0x945D, + 29820 - 11904: 0xE6AA, + 29821 - 11904: 0xE6A7, + 29822 - 11904: 0xBD40, + 29823 - 11904: 0xEA62, + 29824 - 11904: 0xBD41, + 29825 - 11904: 0xE6A6, + 29826 - 11904: 0xFE7C, + 29827 - 11904: 0xBCFE, + 29829 - 11904: 0xE6A8, + 29830 - 11904: 0xE6A5, + 29831 - 11904: 0xE6A2, + 29832 - 11904: 0xE6A9, + 29833 - 11904: 0xE6A3, + 29834 - 11904: 0xE6A4, + 29835 - 11904: 0xBCFD, + 29836 - 11904: 0x9344, + 29837 - 11904: 0x8EA6, + 29840 - 11904: 0xED69, + 29842 - 11904: 0xEA66, + 29844 - 11904: 0xEA65, + 29845 - 11904: 0xEA67, + 29847 - 11904: 0xED66, + 29848 - 11904: 0xBF5A, + 29849 - 11904: 0x92D3, + 29850 - 11904: 0xEA63, + 29851 - 11904: 0x94B8, + 29852 - 11904: 0xBF58, + 29853 - 11904: 0x8779, + 29854 - 11904: 0xBF5C, + 29855 - 11904: 0xBF5B, + 29856 - 11904: 0xEA64, + 29857 - 11904: 0xEA68, + 29859 - 11904: 0xBF59, + 29860 - 11904: 0xFC71, + 29861 - 11904: 0xED6D, + 29862 - 11904: 0xC0F5, + 29863 - 11904: 0xC27A, + 29864 - 11904: 0xC0F6, + 29865 - 11904: 0xC0F3, + 29866 - 11904: 0xED6A, + 29867 - 11904: 0xED68, + 29869 - 11904: 0xED6B, + 29871 - 11904: 0xED6E, + 29872 - 11904: 0xC0F4, + 29873 - 11904: 0xED6C, + 29874 - 11904: 0xED67, + 29876 - 11904: 0x975E, + 29877 - 11904: 0xF042, + 29878 - 11904: 0xF045, + 29879 - 11904: 0xF275, + 29880 - 11904: 0xF040, + 29881 - 11904: 0x8CAD, + 29882 - 11904: 0xF46F, + 29883 - 11904: 0xF046, + 29885 - 11904: 0xC3A2, + 29886 - 11904: 0xF044, + 29887 - 11904: 0xC27B, + 29888 - 11904: 0xF041, + 29889 - 11904: 0xF043, + 29890 - 11904: 0xF047, + 29891 - 11904: 0xF276, + 29893 - 11904: 0xF274, + 29894 - 11904: 0x87C1, + 29896 - 11904: 0xFEA7, + 29898 - 11904: 0xC3A3, + 29899 - 11904: 0xF273, + 29900 - 11904: 0x946A, + 29903 - 11904: 0xC46E, + 29904 - 11904: 0x93E3, + 29907 - 11904: 0x98CF, + 29908 - 11904: 0xC4ED, + 29909 - 11904: 0xF6F1, + 29910 - 11904: 0xC4EC, + 29911 - 11904: 0xF6F3, + 29912 - 11904: 0xF6F0, + 29913 - 11904: 0xF6F2, + 29914 - 11904: 0xC5D0, + 29915 - 11904: 0xF8B2, + 29916 - 11904: 0xA5CA, + 29917 - 11904: 0xCD6E, + 29918 - 11904: 0xD2BC, + 29919 - 11904: 0xD2BD, + 29920 - 11904: 0xB27D, + 29921 - 11904: 0xDEBF, + 29922 - 11904: 0xBF5D, + 29923 - 11904: 0xC3A4, + 29924 - 11904: 0xC57B, + 29925 - 11904: 0xF8B3, + 29926 - 11904: 0xA5CB, + 29927 - 11904: 0xA0D9, + 29928 - 11904: 0xCD6F, + 29929 - 11904: 0xFEAA, + 29932 - 11904: 0xCFD7, + 29934 - 11904: 0xCFD8, + 29936 - 11904: 0xA0BF, + 29937 - 11904: 0xA04D, + 29938 - 11904: 0xA0B8, + 29940 - 11904: 0xD2BE, + 29941 - 11904: 0xD2BF, + 29942 - 11904: 0xB27E, + 29943 - 11904: 0xB2A1, + 29944 - 11904: 0xA0CE, + 29947 - 11904: 0xDAAB, + 29949 - 11904: 0xDEC2, + 29950 - 11904: 0xDEC1, + 29951 - 11904: 0xDEC0, + 29952 - 11904: 0xE2D5, + 29954 - 11904: 0xE2D6, + 29955 - 11904: 0xE2D7, + 29956 - 11904: 0xBAC2, + 29957 - 11904: 0xA0B7, + 29959 - 11904: 0xE6AD, + 29960 - 11904: 0xE6AC, + 29963 - 11904: 0xEA69, + 29964 - 11904: 0xBF5E, + 29965 - 11904: 0xBF5F, + 29966 - 11904: 0xFEA9, + 29967 - 11904: 0xED72, + 29968 - 11904: 0xED6F, + 29969 - 11904: 0xED70, + 29970 - 11904: 0xED71, + 29971 - 11904: 0xF049, + 29972 - 11904: 0xF048, + 29973 - 11904: 0xC27C, + 29974 - 11904: 0xF277, + 29975 - 11904: 0xF5DE, + 29976 - 11904: 0xA5CC, + 29977 - 11904: 0x89C3, + 29978 - 11904: 0xACC6, + 29980 - 11904: 0xB2A2, + 29981 - 11904: 0xDEC3, + 29982 - 11904: 0xFEAB, + 29983 - 11904: 0xA5CD, + 29985 - 11904: 0xD2C0, + 29986 - 11904: 0xB2A3, + 29989 - 11904: 0xB563, + 29990 - 11904: 0xB564, + 29992 - 11904: 0xA5CE, + 29993 - 11904: 0xA5CF, + 29994 - 11904: 0xCA46, + 29995 - 11904: 0xA86A, + 29996 - 11904: 0xA869, + 29997 - 11904: 0xACC7, + 29998 - 11904: 0xCFD9, + 29999 - 11904: 0xDAAC, + 30000 - 11904: 0xA5D0, + 30001 - 11904: 0xA5D1, + 30002 - 11904: 0xA5D2, + 30003 - 11904: 0xA5D3, + 30004 - 11904: 0x9DF4, + 30005 - 11904: 0x896D, + 30007 - 11904: 0xA86B, + 30008 - 11904: 0xA86C, + 30009 - 11904: 0xCB6E, + 30010 - 11904: 0xCB6D, + 30011 - 11904: 0x9C7B, + 30013 - 11904: 0xAAB6, + 30014 - 11904: 0xCD72, + 30015 - 11904: 0xCD70, + 30016 - 11904: 0xCD71, + 30018 - 11904: 0x98D2, + 30022 - 11904: 0x9FA9, + 30023 - 11904: 0xCFDA, + 30024 - 11904: 0xCFDB, + 30026 - 11904: 0xFEB2, + 30027 - 11904: 0xACCB, + 30028 - 11904: 0xACC9, + 30029 - 11904: 0xFEB1, + 30030 - 11904: 0xACCA, + 30031 - 11904: 0xACC8, + 30033 - 11904: 0x97D9, + 30035 - 11904: 0xA0C4, + 30036 - 11904: 0xAF60, + 30037 - 11904: 0x9476, + 30041 - 11904: 0xAF64, + 30042 - 11904: 0xAF63, + 30043 - 11904: 0xD2C1, + 30044 - 11904: 0xAF62, + 30045 - 11904: 0xAF61, + 30047 - 11904: 0xD2C2, + 30048 - 11904: 0x9978, + 30050 - 11904: 0xB2A6, + 30051 - 11904: 0xD67B, + 30052 - 11904: 0xD67A, + 30053 - 11904: 0xB2A4, + 30054 - 11904: 0xB2A5, + 30055 - 11904: 0xFEB3, + 30058 - 11904: 0xB566, + 30059 - 11904: 0xB565, + 30060 - 11904: 0xDAAE, + 30061 - 11904: 0x98D3, + 30062 - 11904: 0xFEB4, + 30063 - 11904: 0xDAAD, + 30064 - 11904: 0xB2A7, + 30066 - 11904: 0x98D4, + 30070 - 11904: 0xB7ED, + 30071 - 11904: 0xDEC5, + 30072 - 11904: 0xB7EE, + 30073 - 11904: 0xDEC4, + 30074 - 11904: 0x9FB9, + 30077 - 11904: 0xE2D8, + 30078 - 11904: 0xE6AE, + 30079 - 11904: 0xBD42, + 30080 - 11904: 0xEA6A, + 30083 - 11904: 0x9471, + 30084 - 11904: 0xED73, + 30086 - 11904: 0xC3A6, + 30087 - 11904: 0xC3A5, + 30090 - 11904: 0xC57C, + 30091 - 11904: 0xA5D4, + 30092 - 11904: 0xCD73, + 30093 - 11904: 0x98D5, + 30094 - 11904: 0xFEB8, + 30095 - 11904: 0xB2A8, + 30096 - 11904: 0xE2D9, + 30097 - 11904: 0xBAC3, + 30098 - 11904: 0xC6D4, + 30100 - 11904: 0xCB6F, + 30101 - 11904: 0xCB70, + 30104 - 11904: 0xCD74, + 30105 - 11904: 0xAAB8, + 30106 - 11904: 0xAAB9, + 30109 - 11904: 0xAAB7, + 30110 - 11904: 0xFEBA, + 30114 - 11904: 0xACCF, + 30115 - 11904: 0xACD0, + 30116 - 11904: 0xACCD, + 30117 - 11904: 0xACCE, + 30119 - 11904: 0xCFDC, + 30122 - 11904: 0xCFDD, + 30123 - 11904: 0xACCC, + 30128 - 11904: 0xD2C3, + 30129 - 11904: 0x9E5C, + 30130 - 11904: 0xAF68, + 30131 - 11904: 0xAF69, + 30132 - 11904: 0xFEBB, + 30133 - 11904: 0xB2AB, + 30134 - 11904: 0xD2C9, + 30136 - 11904: 0xAF6E, + 30137 - 11904: 0xAF6C, + 30138 - 11904: 0xD2CA, + 30139 - 11904: 0xD2C5, + 30140 - 11904: 0xAF6B, + 30141 - 11904: 0xAF6A, + 30142 - 11904: 0xAF65, + 30143 - 11904: 0xD2C8, + 30144 - 11904: 0xD2C7, + 30145 - 11904: 0xD2C4, + 30146 - 11904: 0xAF6D, + 30147 - 11904: 0xA044, + 30148 - 11904: 0xD2C6, + 30149 - 11904: 0xAF66, + 30151 - 11904: 0xAF67, + 30152 - 11904: 0x98D7, + 30154 - 11904: 0xB2AC, + 30155 - 11904: 0xD6A1, + 30156 - 11904: 0xD6A2, + 30157 - 11904: 0xB2AD, + 30158 - 11904: 0xD67C, + 30159 - 11904: 0xD67E, + 30160 - 11904: 0xD6A4, + 30161 - 11904: 0xD6A3, + 30162 - 11904: 0xD67D, + 30164 - 11904: 0xB2A9, + 30165 - 11904: 0xB2AA, + 30167 - 11904: 0xDAB6, + 30168 - 11904: 0xB56B, + 30169 - 11904: 0xB56A, + 30170 - 11904: 0xDAB0, + 30171 - 11904: 0xB568, + 30172 - 11904: 0x98D8, + 30173 - 11904: 0xDAB3, + 30174 - 11904: 0xB56C, + 30175 - 11904: 0xDAB4, + 30176 - 11904: 0xB56D, + 30177 - 11904: 0xDAB1, + 30178 - 11904: 0xB567, + 30179 - 11904: 0xB569, + 30180 - 11904: 0xDAB5, + 30182 - 11904: 0xDAB2, + 30183 - 11904: 0xDAAF, + 30189 - 11904: 0xDED2, + 30191 - 11904: 0xDEC7, + 30192 - 11904: 0xB7F0, + 30193 - 11904: 0xB7F3, + 30194 - 11904: 0xB7F2, + 30195 - 11904: 0xB7F7, + 30196 - 11904: 0xB7F6, + 30197 - 11904: 0xDED3, + 30198 - 11904: 0xDED1, + 30199 - 11904: 0xDECA, + 30200 - 11904: 0xDECE, + 30201 - 11904: 0xDECD, + 30202 - 11904: 0xB7F4, + 30203 - 11904: 0xDED0, + 30204 - 11904: 0xDECC, + 30205 - 11904: 0xDED4, + 30206 - 11904: 0xDECB, + 30207 - 11904: 0xB7F5, + 30208 - 11904: 0xB7EF, + 30209 - 11904: 0xB7F1, + 30210 - 11904: 0xFEBC, + 30211 - 11904: 0xDEC9, + 30215 - 11904: 0x9FFE, + 30216 - 11904: 0xE2DB, + 30217 - 11904: 0xBAC7, + 30218 - 11904: 0xE2DF, + 30219 - 11904: 0xBAC6, + 30220 - 11904: 0xE2DC, + 30221 - 11904: 0xBAC5, + 30223 - 11904: 0xDEC8, + 30224 - 11904: 0xDECF, + 30225 - 11904: 0xE2DE, + 30227 - 11904: 0xBAC8, + 30228 - 11904: 0xE2E0, + 30229 - 11904: 0xE2DD, + 30230 - 11904: 0xE2DA, + 30233 - 11904: 0xE6B1, + 30234 - 11904: 0xE6B5, + 30235 - 11904: 0xE6B7, + 30236 - 11904: 0xE6B3, + 30237 - 11904: 0xE6B2, + 30238 - 11904: 0xE6B0, + 30239 - 11904: 0xBD45, + 30240 - 11904: 0xBD43, + 30241 - 11904: 0xBD48, + 30242 - 11904: 0xBD49, + 30243 - 11904: 0xE6B4, + 30244 - 11904: 0xBD46, + 30245 - 11904: 0xE6AF, + 30246 - 11904: 0xBD47, + 30247 - 11904: 0xBAC4, + 30248 - 11904: 0xE6B6, + 30249 - 11904: 0xBD44, + 30252 - 11904: 0xFEBD, + 30253 - 11904: 0xEA6C, + 30255 - 11904: 0xEA6B, + 30256 - 11904: 0xEA73, + 30257 - 11904: 0xEA6D, + 30258 - 11904: 0xEA72, + 30259 - 11904: 0xEA6F, + 30260 - 11904: 0xBF60, + 30261 - 11904: 0xEA71, + 30264 - 11904: 0xBF61, + 30266 - 11904: 0xBF62, + 30267 - 11904: 0x9DDD, + 30268 - 11904: 0xEA70, + 30269 - 11904: 0xEA6E, + 30272 - 11904: 0x9EE1, + 30274 - 11904: 0xC0F8, + 30275 - 11904: 0xED74, + 30278 - 11904: 0xC0F7, + 30279 - 11904: 0xED77, + 30280 - 11904: 0xED75, + 30281 - 11904: 0xED76, + 30284 - 11904: 0xC0F9, + 30285 - 11904: 0x98DA, + 30286 - 11904: 0x9DDF, + 30287 - 11904: 0xFEBF, + 30288 - 11904: 0xF04D, + 30289 - 11904: 0xFEBE, + 30290 - 11904: 0xC2A1, + 30291 - 11904: 0xF04E, + 30292 - 11904: 0x9EEB, + 30294 - 11904: 0xC27D, + 30295 - 11904: 0xF04F, + 30296 - 11904: 0xC27E, + 30297 - 11904: 0xF04C, + 30298 - 11904: 0xF050, + 30300 - 11904: 0xF04A, + 30303 - 11904: 0xC3A7, + 30304 - 11904: 0xF278, + 30305 - 11904: 0xC3A8, + 30306 - 11904: 0xC46F, + 30308 - 11904: 0xF04B, + 30309 - 11904: 0xC470, + 30310 - 11904: 0x9E59, + 30311 - 11904: 0xA05C, + 30313 - 11904: 0xC4EE, + 30314 - 11904: 0xF5DF, + 30316 - 11904: 0xC57E, + 30317 - 11904: 0xF6F4, + 30318 - 11904: 0xC57D, + 30319 - 11904: 0xFEC0, + 30320 - 11904: 0xF7EA, + 30321 - 11904: 0xC5F5, + 30322 - 11904: 0xC5F6, + 30323 - 11904: 0x9477, + 30324 - 11904: 0x98DC, + 30325 - 11904: 0xF9CC, + 30326 - 11904: 0xFEC1, + 30328 - 11904: 0xACD1, + 30329 - 11904: 0xCFDE, + 30330 - 11904: 0x98DE, + 30331 - 11904: 0xB56E, + 30332 - 11904: 0xB56F, + 30333 - 11904: 0xA5D5, + 30334 - 11904: 0xA6CA, + 30335 - 11904: 0xCA47, + 30337 - 11904: 0xCB71, + 30338 - 11904: 0xA86D, + 30340 - 11904: 0xAABA, + 30342 - 11904: 0xACD2, + 30343 - 11904: 0xACD3, + 30344 - 11904: 0xACD4, + 30345 - 11904: 0xD6A6, + 30346 - 11904: 0xD2CB, + 30347 - 11904: 0xAF6F, + 30350 - 11904: 0xB2AE, + 30351 - 11904: 0xD6A5, + 30352 - 11904: 0xFEC3, + 30354 - 11904: 0xDAB8, + 30355 - 11904: 0xB571, + 30357 - 11904: 0xDAB7, + 30358 - 11904: 0xB570, + 30361 - 11904: 0xDED5, + 30362 - 11904: 0xBD4A, + 30363 - 11904: 0xE6BB, + 30364 - 11904: 0xE6B8, + 30365 - 11904: 0xE6B9, + 30366 - 11904: 0xE6BA, + 30369 - 11904: 0xFEC8, + 30372 - 11904: 0xED78, + 30373 - 11904: 0xFEC9, + 30374 - 11904: 0xF051, + 30378 - 11904: 0xF471, + 30379 - 11904: 0xF470, + 30381 - 11904: 0xF6F5, + 30382 - 11904: 0xA5D6, + 30383 - 11904: 0xCD75, + 30384 - 11904: 0xAF70, + 30388 - 11904: 0xB572, + 30389 - 11904: 0xDED6, + 30391 - 11904: 0xFECA, + 30392 - 11904: 0xE2E1, + 30394 - 11904: 0xBD4B, + 30395 - 11904: 0xEA74, + 30397 - 11904: 0xF052, + 30398 - 11904: 0xF472, + 30399 - 11904: 0xA5D7, + 30402 - 11904: 0xAABB, + 30403 - 11904: 0xACD7, + 30404 - 11904: 0xCFDF, + 30405 - 11904: 0xACD8, + 30406 - 11904: 0xACD6, + 30408 - 11904: 0xACD5, + 30409 - 11904: 0xD2CC, + 30410 - 11904: 0xAF71, + 30412 - 11904: 0xFECB, + 30413 - 11904: 0xAF72, + 30414 - 11904: 0xAF73, + 30418 - 11904: 0xB2B0, + 30419 - 11904: 0xD6A7, + 30420 - 11904: 0xB2AF, + 30422 - 11904: 0x9FC2, + 30425 - 11904: 0x8C6B, + 30426 - 11904: 0xDAB9, + 30427 - 11904: 0xB2B1, + 30428 - 11904: 0xB573, + 30429 - 11904: 0xDED7, + 30430 - 11904: 0xB7F8, + 30431 - 11904: 0xB7F9, + 30433 - 11904: 0xBAC9, + 30435 - 11904: 0xBACA, + 30436 - 11904: 0xBD4C, + 30437 - 11904: 0xBF64, + 30438 - 11904: 0xEA75, + 30439 - 11904: 0xBF63, + 30441 - 11904: 0xED79, + 30442 - 11904: 0xC0FA, + 30444 - 11904: 0xF053, + 30445 - 11904: 0xF473, + 30446 - 11904: 0xA5D8, + 30447 - 11904: 0xA86E, + 30448 - 11904: 0xCD78, + 30449 - 11904: 0xCD77, + 30450 - 11904: 0xAABC, + 30451 - 11904: 0xCD76, + 30452 - 11904: 0xAABD, + 30453 - 11904: 0xCD79, + 30455 - 11904: 0xCFE5, + 30456 - 11904: 0xACDB, + 30457 - 11904: 0xACDA, + 30458 - 11904: 0xCFE7, + 30459 - 11904: 0xCFE6, + 30460 - 11904: 0xACDF, + 30462 - 11904: 0xACDE, + 30465 - 11904: 0xACD9, + 30467 - 11904: 0xCFE1, + 30468 - 11904: 0xCFE2, + 30469 - 11904: 0xCFE3, + 30471 - 11904: 0xACE0, + 30472 - 11904: 0xCFE0, + 30473 - 11904: 0xACDC, + 30474 - 11904: 0xCFE4, + 30475 - 11904: 0xACDD, + 30476 - 11904: 0x98C4, + 30478 - 11904: 0x94B0, + 30479 - 11904: 0x94B1, + 30480 - 11904: 0xD2CF, + 30481 - 11904: 0xD2D3, + 30482 - 11904: 0xD2D1, + 30483 - 11904: 0xD2D0, + 30485 - 11904: 0xD2D4, + 30489 - 11904: 0xD2D5, + 30490 - 11904: 0xD2D6, + 30491 - 11904: 0xD2CE, + 30493 - 11904: 0xD2CD, + 30494 - 11904: 0xFED1, + 30495 - 11904: 0xAF75, + 30496 - 11904: 0xAF76, + 30498 - 11904: 0xD2D7, + 30499 - 11904: 0xD2D2, + 30500 - 11904: 0xA0C1, + 30501 - 11904: 0xD6B0, + 30502 - 11904: 0xFED2, + 30503 - 11904: 0xD2D8, + 30504 - 11904: 0xAF77, + 30505 - 11904: 0xAF74, + 30507 - 11904: 0xA0CD, + 30509 - 11904: 0xD6AA, + 30511 - 11904: 0xD6A9, + 30513 - 11904: 0xD6AB, + 30514 - 11904: 0xD6AC, + 30515 - 11904: 0xD6AE, + 30516 - 11904: 0xD6AD, + 30517 - 11904: 0xD6B2, + 30518 - 11904: 0xB2B5, + 30519 - 11904: 0xB2B2, + 30520 - 11904: 0xB2B6, + 30521 - 11904: 0xD6A8, + 30522 - 11904: 0xB2B7, + 30523 - 11904: 0xD6B1, + 30524 - 11904: 0xB2B4, + 30525 - 11904: 0xD6AF, + 30526 - 11904: 0xB2B3, + 30528 - 11904: 0xFED3, + 30531 - 11904: 0x98E5, + 30532 - 11904: 0xDABC, + 30533 - 11904: 0xDABE, + 30534 - 11904: 0xDABA, + 30535 - 11904: 0xDABB, + 30538 - 11904: 0xDABF, + 30539 - 11904: 0xDAC1, + 30540 - 11904: 0xDAC2, + 30541 - 11904: 0xDABD, + 30542 - 11904: 0xDAC0, + 30543 - 11904: 0xB574, + 30546 - 11904: 0xDEDB, + 30548 - 11904: 0xDEE0, + 30549 - 11904: 0xDED8, + 30550 - 11904: 0xDEDC, + 30552 - 11904: 0xFED6, + 30553 - 11904: 0xDEE1, + 30554 - 11904: 0xDEDD, + 30555 - 11904: 0xB7FA, + 30556 - 11904: 0xB843, + 30558 - 11904: 0xB7FD, + 30559 - 11904: 0xDED9, + 30560 - 11904: 0xDEDA, + 30561 - 11904: 0xBACE, + 30562 - 11904: 0xB846, + 30563 - 11904: 0xB7FE, + 30565 - 11904: 0xB844, + 30566 - 11904: 0xB7FC, + 30567 - 11904: 0xDEDF, + 30568 - 11904: 0xB845, + 30569 - 11904: 0xDEDE, + 30570 - 11904: 0xB841, + 30571 - 11904: 0xB7FB, + 30572 - 11904: 0xB842, + 30573 - 11904: 0xDEE2, + 30574 - 11904: 0xE2E6, + 30575 - 11904: 0xE2E8, + 30578 - 11904: 0x91E4, + 30583 - 11904: 0x8FC7, + 30584 - 11904: 0x94AE, + 30585 - 11904: 0xB840, + 30586 - 11904: 0x8A4F, + 30587 - 11904: 0x94B2, + 30588 - 11904: 0xE2E3, + 30589 - 11904: 0xBACC, + 30590 - 11904: 0xE2E9, + 30591 - 11904: 0xBACD, + 30592 - 11904: 0xE2E7, + 30593 - 11904: 0xE2E2, + 30594 - 11904: 0xE2E5, + 30595 - 11904: 0xE2EA, + 30596 - 11904: 0xBACB, + 30597 - 11904: 0xE2E4, + 30599 - 11904: 0xBD4E, + 30600 - 11904: 0xE6BF, + 30601 - 11904: 0xE6BE, + 30603 - 11904: 0xBD51, + 30604 - 11904: 0xBD4F, + 30605 - 11904: 0xE6BC, + 30606 - 11904: 0xBD4D, + 30607 - 11904: 0xE6BD, + 30609 - 11904: 0xBD50, + 30611 - 11904: 0x8FD4, + 30613 - 11904: 0xEA7D, + 30615 - 11904: 0xEAA1, + 30616 - 11904: 0x98EA, + 30617 - 11904: 0xEA7E, + 30618 - 11904: 0xEA76, + 30619 - 11904: 0xEA7A, + 30620 - 11904: 0xEA79, + 30621 - 11904: 0xEA77, + 30622 - 11904: 0xBF66, + 30623 - 11904: 0xBF67, + 30624 - 11904: 0xBF65, + 30625 - 11904: 0xEA78, + 30626 - 11904: 0xEA7B, + 30627 - 11904: 0xEA7C, + 30629 - 11904: 0xBF68, + 30631 - 11904: 0xC140, + 30632 - 11904: 0xEDA3, + 30634 - 11904: 0xC0FC, + 30635 - 11904: 0xED7B, + 30636 - 11904: 0xC0FE, + 30637 - 11904: 0xC141, + 30639 - 11904: 0xFED8, + 30640 - 11904: 0xC0FD, + 30641 - 11904: 0xEDA2, + 30642 - 11904: 0xED7C, + 30643 - 11904: 0xC0FB, + 30644 - 11904: 0xEDA1, + 30645 - 11904: 0xED7A, + 30646 - 11904: 0xED7E, + 30647 - 11904: 0xED7D, + 30649 - 11904: 0x9DE0, + 30650 - 11904: 0xF055, + 30651 - 11904: 0xC2A4, + 30652 - 11904: 0xC2A5, + 30653 - 11904: 0xC2A2, + 30654 - 11904: 0x98EE, + 30655 - 11904: 0xC2A3, + 30658 - 11904: 0xF054, + 30659 - 11904: 0x95C4, + 30660 - 11904: 0xF27B, + 30661 - 11904: 0xFCE8, + 30663 - 11904: 0xC3A9, + 30665 - 11904: 0xF279, + 30666 - 11904: 0xF27A, + 30667 - 11904: 0x98EF, + 30668 - 11904: 0xF474, + 30669 - 11904: 0xF477, + 30670 - 11904: 0xF475, + 30671 - 11904: 0xF476, + 30672 - 11904: 0xF5E0, + 30675 - 11904: 0xC4EF, + 30676 - 11904: 0xF7EB, + 30677 - 11904: 0xF8B4, + 30679 - 11904: 0xC5F7, + 30680 - 11904: 0xF8F8, + 30681 - 11904: 0xF8F9, + 30682 - 11904: 0xC666, + 30683 - 11904: 0xA5D9, + 30684 - 11904: 0xACE1, + 30685 - 11904: 0x8C6E, + 30686 - 11904: 0xDAC3, + 30688 - 11904: 0xDEE3, + 30690 - 11904: 0xA5DA, + 30691 - 11904: 0xA86F, + 30693 - 11904: 0xAABE, + 30694 - 11904: 0xFAD8, + 30695 - 11904: 0xCFE8, + 30696 - 11904: 0xCFE9, + 30697 - 11904: 0xAF78, + 30700 - 11904: 0xDAC4, + 30701 - 11904: 0xB575, + 30702 - 11904: 0xB847, + 30703 - 11904: 0xC142, + 30704 - 11904: 0xEDA4, + 30705 - 11904: 0xF27C, + 30706 - 11904: 0xF478, + 30707 - 11904: 0xA5DB, + 30708 - 11904: 0xFEDC, + 30711 - 11904: 0xCDA1, + 30712 - 11904: 0xCD7A, + 30713 - 11904: 0xCD7C, + 30714 - 11904: 0xCD7E, + 30715 - 11904: 0xCD7D, + 30716 - 11904: 0xCD7B, + 30717 - 11904: 0xAABF, + 30718 - 11904: 0xA0AE, + 30722 - 11904: 0xACE2, + 30723 - 11904: 0xCFF2, + 30725 - 11904: 0xCFED, + 30726 - 11904: 0xCFEA, + 30728 - 11904: 0x9D4C, + 30729 - 11904: 0xFEDD, + 30732 - 11904: 0xACE4, + 30733 - 11904: 0xACE5, + 30734 - 11904: 0xCFF0, + 30735 - 11904: 0xCFEF, + 30736 - 11904: 0xCFEE, + 30737 - 11904: 0xCFEB, + 30738 - 11904: 0xCFEC, + 30739 - 11904: 0xCFF3, + 30740 - 11904: 0xACE3, + 30744 - 11904: 0x98F1, + 30748 - 11904: 0x98F3, + 30749 - 11904: 0xAF7C, + 30750 - 11904: 0x94C1, + 30751 - 11904: 0xAFA4, + 30752 - 11904: 0xAFA3, + 30753 - 11904: 0xD2E1, + 30754 - 11904: 0xD2DB, + 30755 - 11904: 0xD2D9, + 30757 - 11904: 0xAFA1, + 30758 - 11904: 0xD6B9, + 30759 - 11904: 0xAF7A, + 30760 - 11904: 0xD2DE, + 30761 - 11904: 0xD2E2, + 30762 - 11904: 0xD2E4, + 30763 - 11904: 0xD2E0, + 30764 - 11904: 0xD2DA, + 30765 - 11904: 0xAFA2, + 30766 - 11904: 0xD2DF, + 30767 - 11904: 0xD2DD, + 30768 - 11904: 0xAF79, + 30769 - 11904: 0xD2E5, + 30770 - 11904: 0xAFA5, + 30771 - 11904: 0xD2E3, + 30772 - 11904: 0xAF7D, + 30773 - 11904: 0xD2DC, + 30775 - 11904: 0xAF7E, + 30776 - 11904: 0xAF7B, + 30777 - 11904: 0x98F5, + 30780 - 11904: 0xFA4F, + 30781 - 11904: 0x96E2, + 30786 - 11904: 0x9450, + 30787 - 11904: 0xB2B9, + 30788 - 11904: 0x96A2, + 30789 - 11904: 0xD6BA, + 30791 - 11904: 0x98F6, + 30792 - 11904: 0xD6B3, + 30793 - 11904: 0xD6B5, + 30794 - 11904: 0xD6B7, + 30795 - 11904: 0x96E5, + 30796 - 11904: 0xD6B8, + 30797 - 11904: 0xD6B6, + 30798 - 11904: 0xB2BA, + 30800 - 11904: 0xD6BB, + 30801 - 11904: 0x98F7, + 30802 - 11904: 0xD6B4, + 30803 - 11904: 0xA046, + 30804 - 11904: 0x96E3, + 30812 - 11904: 0xDAC8, + 30813 - 11904: 0xB576, + 30814 - 11904: 0xDAD0, + 30816 - 11904: 0xDAC5, + 30818 - 11904: 0xDAD1, + 30820 - 11904: 0xDAC6, + 30821 - 11904: 0xDAC7, + 30822 - 11904: 0x98F8, + 30824 - 11904: 0xDACF, + 30825 - 11904: 0xDACE, + 30826 - 11904: 0xDACB, + 30827 - 11904: 0xB2B8, + 30828 - 11904: 0xB577, + 30829 - 11904: 0xDAC9, + 30830 - 11904: 0xDACC, + 30831 - 11904: 0xB578, + 30832 - 11904: 0xDACD, + 30833 - 11904: 0xDACA, + 30841 - 11904: 0xDEEE, + 30842 - 11904: 0x9EE4, + 30843 - 11904: 0xDEF2, + 30844 - 11904: 0xB84E, + 30846 - 11904: 0xE2F0, + 30847 - 11904: 0xB851, + 30848 - 11904: 0xDEF0, + 30849 - 11904: 0xF9D6, + 30851 - 11904: 0xDEED, + 30852 - 11904: 0xDEE8, + 30853 - 11904: 0xDEEA, + 30854 - 11904: 0xDEEB, + 30855 - 11904: 0xDEE4, + 30856 - 11904: 0x94C3, + 30857 - 11904: 0xB84D, + 30860 - 11904: 0xB84C, + 30861 - 11904: 0x94C2, + 30862 - 11904: 0xB848, + 30863 - 11904: 0xDEE7, + 30865 - 11904: 0xB84F, + 30867 - 11904: 0xB850, + 30868 - 11904: 0xDEE6, + 30869 - 11904: 0xDEE9, + 30870 - 11904: 0xDEF1, + 30871 - 11904: 0xB84A, + 30872 - 11904: 0xB84B, + 30873 - 11904: 0xDEEF, + 30874 - 11904: 0xDEE5, + 30878 - 11904: 0xE2F2, + 30879 - 11904: 0xBAD0, + 30880 - 11904: 0xE2F4, + 30881 - 11904: 0xDEEC, + 30882 - 11904: 0xE2F6, + 30883 - 11904: 0xBAD4, + 30884 - 11904: 0xE2F7, + 30885 - 11904: 0xE2F3, + 30887 - 11904: 0xBAD1, + 30888 - 11904: 0xE2EF, + 30889 - 11904: 0xBAD3, + 30890 - 11904: 0xE2EC, + 30891 - 11904: 0xE2F1, + 30892 - 11904: 0xE2F5, + 30893 - 11904: 0xE2EE, + 30895 - 11904: 0xFEE1, + 30896 - 11904: 0xB849, + 30897 - 11904: 0xFEE9, + 30898 - 11904: 0xE2EB, + 30899 - 11904: 0xBAD2, + 30900 - 11904: 0xE2ED, + 30902 - 11904: 0x96E4, + 30904 - 11904: 0x89AC, + 30905 - 11904: 0x96DB, + 30906 - 11904: 0xBD54, + 30907 - 11904: 0xE6C1, + 30908 - 11904: 0xBD58, + 30910 - 11904: 0xBD56, + 30913 - 11904: 0xBACF, + 30915 - 11904: 0xE6C8, + 30916 - 11904: 0xE6C9, + 30917 - 11904: 0xBD53, + 30919 - 11904: 0xFEE2, + 30920 - 11904: 0xE6C7, + 30921 - 11904: 0xE6CA, + 30922 - 11904: 0xBD55, + 30923 - 11904: 0xBD52, + 30924 - 11904: 0xE6C3, + 30925 - 11904: 0xE6C0, + 30926 - 11904: 0xE6C5, + 30927 - 11904: 0xE6C2, + 30928 - 11904: 0xBD59, + 30929 - 11904: 0xE6C4, + 30930 - 11904: 0x94C4, + 30931 - 11904: 0xFEE3, + 30932 - 11904: 0xE6C6, + 30933 - 11904: 0xBD57, + 30935 - 11904: 0xFEE7, + 30936 - 11904: 0x9FFB, + 30938 - 11904: 0xBF6A, + 30939 - 11904: 0xEAA8, + 30941 - 11904: 0xEAA2, + 30942 - 11904: 0xEAA6, + 30943 - 11904: 0xEAAC, + 30944 - 11904: 0xEAAD, + 30945 - 11904: 0xEAA9, + 30946 - 11904: 0xEAAA, + 30947 - 11904: 0xEAA7, + 30948 - 11904: 0x8C59, + 30949 - 11904: 0xEAA4, + 30951 - 11904: 0xBF6C, + 30952 - 11904: 0xBF69, + 30953 - 11904: 0xEAA3, + 30954 - 11904: 0xEAA5, + 30956 - 11904: 0xBF6B, + 30957 - 11904: 0xEAAB, + 30958 - 11904: 0x93C9, + 30959 - 11904: 0xC146, + 30960 - 11904: 0x94E8, + 30961 - 11904: 0xFB56, + 30962 - 11904: 0xEDAA, + 30963 - 11904: 0xEDA5, + 30964 - 11904: 0xC145, + 30965 - 11904: 0x90C5, + 30967 - 11904: 0xC143, + 30969 - 11904: 0xEDAC, + 30970 - 11904: 0xC144, + 30971 - 11904: 0xEDA8, + 30972 - 11904: 0xEDA9, + 30973 - 11904: 0xEDA6, + 30974 - 11904: 0xEDAD, + 30975 - 11904: 0xF056, + 30977 - 11904: 0xC147, + 30978 - 11904: 0xEDA7, + 30980 - 11904: 0xEDAE, + 30981 - 11904: 0xEDAB, + 30982 - 11904: 0xA0A8, + 30985 - 11904: 0xF05A, + 30988 - 11904: 0xF057, + 30990 - 11904: 0xC2A6, + 30992 - 11904: 0xF05B, + 30993 - 11904: 0xF05D, + 30994 - 11904: 0xF05C, + 30995 - 11904: 0xF058, + 30996 - 11904: 0xF059, + 30999 - 11904: 0xF2A3, + 31001 - 11904: 0xC3AA, + 31003 - 11904: 0xF27E, + 31004 - 11904: 0xF2A2, + 31005 - 11904: 0xF27D, + 31006 - 11904: 0xF2A4, + 31009 - 11904: 0xF2A1, + 31011 - 11904: 0xF47A, + 31012 - 11904: 0xF47D, + 31013 - 11904: 0xF479, + 31014 - 11904: 0xC471, + 31015 - 11904: 0xF47B, + 31016 - 11904: 0xF47C, + 31017 - 11904: 0xF47E, + 31018 - 11904: 0xC472, + 31019 - 11904: 0xC474, + 31020 - 11904: 0xC473, + 31021 - 11904: 0xF5E1, + 31022 - 11904: 0xFEE5, + 31023 - 11904: 0xF5E3, + 31025 - 11904: 0xF5E2, + 31026 - 11904: 0x98FD, + 31027 - 11904: 0x98FB, + 31028 - 11904: 0xFEE8, + 31029 - 11904: 0xF6F6, + 31030 - 11904: 0x8EBF, + 31032 - 11904: 0xF8B5, + 31033 - 11904: 0xF8FA, + 31034 - 11904: 0xA5DC, + 31035 - 11904: 0x8BD8, + 31036 - 11904: 0xFEF7, + 31037 - 11904: 0xCB72, + 31038 - 11904: 0xAAC0, + 31039 - 11904: 0xCDA3, + 31040 - 11904: 0xAAC1, + 31041 - 11904: 0xAAC2, + 31042 - 11904: 0xCDA2, + 31044 - 11904: 0xCFF8, + 31045 - 11904: 0xCFF7, + 31046 - 11904: 0xACE6, + 31047 - 11904: 0xACE9, + 31048 - 11904: 0xACE8, + 31049 - 11904: 0xACE7, + 31050 - 11904: 0xCFF4, + 31051 - 11904: 0xCFF6, + 31052 - 11904: 0xCFF5, + 31055 - 11904: 0xD2E8, + 31056 - 11904: 0xAFA7, + 31057 - 11904: 0xD2EC, + 31058 - 11904: 0xD2EB, + 31059 - 11904: 0xD2EA, + 31060 - 11904: 0xD2E6, + 31061 - 11904: 0xAFA6, + 31062 - 11904: 0xAFAA, + 31063 - 11904: 0xAFAD, + 31064 - 11904: 0x8F68, + 31065 - 11904: 0x94C6, + 31066 - 11904: 0xAFAE, + 31067 - 11904: 0xD2E7, + 31068 - 11904: 0xD2E9, + 31069 - 11904: 0xAFAC, + 31070 - 11904: 0xAFAB, + 31071 - 11904: 0xAFA9, + 31072 - 11904: 0xAFA8, + 31073 - 11904: 0xD6C2, + 31074 - 11904: 0x9DEA, + 31075 - 11904: 0xD6C0, + 31076 - 11904: 0xD6BC, + 31077 - 11904: 0xB2BB, + 31079 - 11904: 0xD6BD, + 31080 - 11904: 0xB2BC, + 31081 - 11904: 0xD6BE, + 31082 - 11904: 0xD6BF, + 31083 - 11904: 0xD6C1, + 31085 - 11904: 0xB2BD, + 31088 - 11904: 0xDAD5, + 31089 - 11904: 0xFC69, + 31090 - 11904: 0xDAD4, + 31091 - 11904: 0xDAD3, + 31092 - 11904: 0xDAD2, + 31097 - 11904: 0xDEF6, + 31098 - 11904: 0xB852, + 31100 - 11904: 0xDEF3, + 31101 - 11904: 0xDEF5, + 31102 - 11904: 0x9CDA, + 31103 - 11904: 0xB853, + 31104 - 11904: 0xFEF3, + 31105 - 11904: 0xB854, + 31106 - 11904: 0xDEF4, + 31107 - 11904: 0x9C72, + 31110 - 11904: 0xFEF0, + 31111 - 11904: 0x89C9, + 31112 - 11904: 0xE341, + 31114 - 11904: 0xE2F9, + 31115 - 11904: 0xE2FA, + 31117 - 11904: 0xBAD7, + 31118 - 11904: 0xBAD5, + 31119 - 11904: 0xBAD6, + 31120 - 11904: 0xE343, + 31121 - 11904: 0x9941, + 31122 - 11904: 0xE342, + 31123 - 11904: 0xE2FE, + 31124 - 11904: 0xE2FD, + 31125 - 11904: 0xE2FC, + 31126 - 11904: 0xE2FB, + 31127 - 11904: 0xE340, + 31128 - 11904: 0xE2F8, + 31129 - 11904: 0x9942, + 31130 - 11904: 0xE6CB, + 31131 - 11904: 0xE6D0, + 31132 - 11904: 0xE6CE, + 31133 - 11904: 0xFEF5, + 31135 - 11904: 0x91D7, + 31136 - 11904: 0xE6CD, + 31137 - 11904: 0xE6CC, + 31138 - 11904: 0xE6CF, + 31140 - 11904: 0xEAAE, + 31141 - 11904: 0x94CC, + 31142 - 11904: 0xBF6D, + 31143 - 11904: 0xC148, + 31144 - 11904: 0xEDB0, + 31145 - 11904: 0xFEF8, + 31146 - 11904: 0xC149, + 31147 - 11904: 0xEDAF, + 31148 - 11904: 0xF05F, + 31149 - 11904: 0xF05E, + 31150 - 11904: 0xC2A7, + 31152 - 11904: 0xF2A5, + 31153 - 11904: 0xC3AB, + 31154 - 11904: 0xF4A1, + 31155 - 11904: 0xC5A1, + 31156 - 11904: 0xF6F7, + 31158 - 11904: 0xF8B7, + 31159 - 11904: 0xF8B6, + 31160 - 11904: 0xC9A8, + 31161 - 11904: 0xACEA, + 31162 - 11904: 0xACEB, + 31163 - 11904: 0xD6C3, + 31165 - 11904: 0xB856, + 31166 - 11904: 0xA5DD, + 31167 - 11904: 0xA872, + 31168 - 11904: 0xA871, + 31169 - 11904: 0xA870, + 31172 - 11904: 0x97A8, + 31173 - 11904: 0xCDA4, + 31174 - 11904: 0xFEFC, + 31176 - 11904: 0xAAC4, + 31177 - 11904: 0xAAC3, + 31178 - 11904: 0x8CDE, + 31179 - 11904: 0xACEE, + 31180 - 11904: 0xFDBF, + 31181 - 11904: 0xCFFA, + 31182 - 11904: 0xCFFD, + 31183 - 11904: 0xCFFB, + 31184 - 11904: 0x87B3, + 31185 - 11904: 0xACEC, + 31186 - 11904: 0xACED, + 31188 - 11904: 0xFEFE, + 31189 - 11904: 0xCFF9, + 31190 - 11904: 0xCFFC, + 31192 - 11904: 0xAFB5, + 31196 - 11904: 0xD2F3, + 31197 - 11904: 0xD2F5, + 31198 - 11904: 0xD2F4, + 31199 - 11904: 0xAFB2, + 31200 - 11904: 0xD2EF, + 31202 - 11904: 0x96D1, + 31203 - 11904: 0xAFB0, + 31204 - 11904: 0xAFAF, + 31206 - 11904: 0xAFB3, + 31207 - 11904: 0xAFB1, + 31209 - 11904: 0xAFB4, + 31210 - 11904: 0xD2F2, + 31211 - 11904: 0xD2ED, + 31212 - 11904: 0xD2EE, + 31213 - 11904: 0xD2F1, + 31214 - 11904: 0xD2F0, + 31217 - 11904: 0x94D5, + 31220 - 11904: 0x94D0, + 31222 - 11904: 0xD6C6, + 31223 - 11904: 0xD6C7, + 31224 - 11904: 0xD6C5, + 31226 - 11904: 0xD6C4, + 31227 - 11904: 0xB2BE, + 31232 - 11904: 0xB57D, + 31234 - 11904: 0xDAD6, + 31235 - 11904: 0xDAD8, + 31236 - 11904: 0xDADA, + 31237 - 11904: 0xB57C, + 31238 - 11904: 0x9944, + 31240 - 11904: 0xB57A, + 31242 - 11904: 0xDAD7, + 31243 - 11904: 0xB57B, + 31244 - 11904: 0xDAD9, + 31245 - 11904: 0xB579, + 31248 - 11904: 0xDF41, + 31249 - 11904: 0xDEF7, + 31250 - 11904: 0xDEFA, + 31251 - 11904: 0xDEFE, + 31252 - 11904: 0xB85A, + 31253 - 11904: 0xDEFC, + 31255 - 11904: 0xDEFB, + 31256 - 11904: 0xDEF8, + 31257 - 11904: 0xDEF9, + 31258 - 11904: 0xB858, + 31259 - 11904: 0xDF40, + 31260 - 11904: 0xB857, + 31262 - 11904: 0xB85C, + 31263 - 11904: 0xB85B, + 31264 - 11904: 0xB859, + 31266 - 11904: 0xDEFD, + 31270 - 11904: 0xE349, + 31272 - 11904: 0xE348, + 31274 - 11904: 0x8C63, + 31275 - 11904: 0xE344, + 31276 - 11904: 0x87BB, + 31277 - 11904: 0xA0B3, + 31278 - 11904: 0xBAD8, + 31279 - 11904: 0xE347, + 31280 - 11904: 0xE346, + 31281 - 11904: 0xBAD9, + 31282 - 11904: 0x87B4, + 31287 - 11904: 0xBD5E, + 31289 - 11904: 0xE6D2, + 31290 - 11904: 0x94CF, + 31291 - 11904: 0xBD5F, + 31292 - 11904: 0xBD5B, + 31293 - 11904: 0xBD5D, + 31294 - 11904: 0x9FFA, + 31295 - 11904: 0xBD5A, + 31296 - 11904: 0xBD5C, + 31299 - 11904: 0x91E5, + 31300 - 11904: 0xEAAF, + 31301 - 11904: 0x9C6A, + 31302 - 11904: 0xBF70, + 31303 - 11904: 0xEAB1, + 31304 - 11904: 0xEAB0, + 31305 - 11904: 0x8E49, + 31306 - 11904: 0xE345, + 31307 - 11904: 0xBF72, + 31308 - 11904: 0xBF71, + 31309 - 11904: 0xBF6E, + 31310 - 11904: 0xBF6F, + 31316 - 11904: 0xEDB5, + 31318 - 11904: 0xEDB3, + 31319 - 11904: 0xC14A, + 31320 - 11904: 0xEDB4, + 31322 - 11904: 0xEDB6, + 31323 - 11904: 0xEDB2, + 31324 - 11904: 0xEDB1, + 31327 - 11904: 0xF060, + 31328 - 11904: 0xC2AA, + 31329 - 11904: 0xC2A8, + 31330 - 11904: 0xC2A9, + 31333 - 11904: 0x8E4C, + 31335 - 11904: 0xF2A6, + 31336 - 11904: 0xF2A7, + 31337 - 11904: 0xC3AD, + 31339 - 11904: 0xC3AC, + 31340 - 11904: 0xF4A3, + 31341 - 11904: 0xF4A4, + 31342 - 11904: 0xF4A2, + 31344 - 11904: 0xF6F8, + 31345 - 11904: 0xF6F9, + 31346 - 11904: 0x87C9, + 31348 - 11904: 0xA5DE, + 31349 - 11904: 0xCA48, + 31350 - 11904: 0xA873, + 31352 - 11904: 0xCDA5, + 31353 - 11904: 0xAAC6, + 31354 - 11904: 0xAAC5, + 31355 - 11904: 0xCDA6, + 31357 - 11904: 0x8E4D, + 31358 - 11904: 0xD040, + 31359 - 11904: 0xACEF, + 31360 - 11904: 0xCFFE, + 31361 - 11904: 0xACF0, + 31363 - 11904: 0x9A73, + 31364 - 11904: 0xAFB6, + 31365 - 11904: 0xD2F8, + 31366 - 11904: 0xD2F6, + 31367 - 11904: 0xD2FC, + 31368 - 11904: 0xAFB7, + 31369 - 11904: 0xD2F7, + 31370 - 11904: 0xD2FB, + 31371 - 11904: 0xD2F9, + 31372 - 11904: 0xD2FA, + 31375 - 11904: 0xD6C8, + 31376 - 11904: 0xD6CA, + 31377 - 11904: 0x9947, + 31378 - 11904: 0xB2BF, + 31379 - 11904: 0x8CB1, + 31380 - 11904: 0xD6C9, + 31381 - 11904: 0xB2C0, + 31382 - 11904: 0xB5A2, + 31383 - 11904: 0xB5A1, + 31384 - 11904: 0xB57E, + 31385 - 11904: 0xDADB, + 31390 - 11904: 0xDF44, + 31391 - 11904: 0xB85D, + 31392 - 11904: 0xB85E, + 31394 - 11904: 0xDF43, + 31395 - 11904: 0xDF42, + 31400 - 11904: 0xE34A, + 31401 - 11904: 0xBADB, + 31402 - 11904: 0xBADA, + 31403 - 11904: 0xE34B, + 31404 - 11904: 0xE34C, + 31406 - 11904: 0xBD61, + 31407 - 11904: 0xBD60, + 31408 - 11904: 0x8E50, + 31409 - 11904: 0xEAB5, + 31410 - 11904: 0xE6D3, + 31411 - 11904: 0xE6D5, + 31412 - 11904: 0xE6D4, + 31413 - 11904: 0xEAB4, + 31414 - 11904: 0xEAB2, + 31415 - 11904: 0xEAB6, + 31416 - 11904: 0xEAB3, + 31418 - 11904: 0xBF73, + 31419 - 11904: 0x8E4F, + 31420 - 11904: 0x9949, + 31422 - 11904: 0xEDB7, + 31423 - 11904: 0xC14B, + 31424 - 11904: 0xEDB8, + 31425 - 11904: 0xEDB9, + 31426 - 11904: 0x8E51, + 31427 - 11904: 0x8E52, + 31428 - 11904: 0xC2AB, + 31429 - 11904: 0xC2AC, + 31431 - 11904: 0xC475, + 31432 - 11904: 0x9AB2, + 31433 - 11904: 0x89A5, + 31434 - 11904: 0xC5D1, + 31435 - 11904: 0xA5DF, + 31439 - 11904: 0x994C, + 31441 - 11904: 0xD041, + 31443 - 11904: 0x9FF8, + 31448 - 11904: 0xD2FD, + 31449 - 11904: 0xAFB8, + 31450 - 11904: 0x8E56, + 31451 - 11904: 0x994D, + 31452 - 11904: 0x91CA, + 31453 - 11904: 0x8E57, + 31455 - 11904: 0xB3BA, + 31456 - 11904: 0xB3B9, + 31458 - 11904: 0x94E1, + 31459 - 11904: 0xB5A4, + 31460 - 11904: 0xDADD, + 31461 - 11904: 0xB5A3, + 31462 - 11904: 0xDADC, + 31463 - 11904: 0x9047, + 31465 - 11904: 0x8FD8, + 31466 - 11904: 0x8E58, + 31467 - 11904: 0xDF45, + 31469 - 11904: 0xBADC, + 31470 - 11904: 0xE34D, + 31471 - 11904: 0xBADD, + 31478 - 11904: 0xC476, + 31479 - 11904: 0xF4A5, + 31481 - 11904: 0xA6CB, + 31482 - 11904: 0xAAC7, + 31483 - 11904: 0xCDA7, + 31484 - 11904: 0x87A3, + 31485 - 11904: 0xACF2, + 31486 - 11904: 0x94EB, + 31487 - 11904: 0xACF1, + 31488 - 11904: 0xD042, + 31489 - 11904: 0xD043, + 31492 - 11904: 0xD340, + 31493 - 11904: 0xD342, + 31494 - 11904: 0xAFB9, + 31496 - 11904: 0xD344, + 31497 - 11904: 0xD347, + 31498 - 11904: 0xD345, + 31499 - 11904: 0x8E5C, + 31500 - 11904: 0x9553, + 31502 - 11904: 0xD346, + 31503 - 11904: 0xD343, + 31504 - 11904: 0xD2FE, + 31505 - 11904: 0xAFBA, + 31506 - 11904: 0xD348, + 31507 - 11904: 0xD341, + 31508 - 11904: 0x9FE5, + 31512 - 11904: 0xD6D3, + 31513 - 11904: 0xB2C6, + 31514 - 11904: 0xD6DC, + 31515 - 11904: 0xB2C3, + 31517 - 11904: 0xD6D5, + 31518 - 11904: 0xB2C7, + 31519 - 11904: 0x9F56, + 31520 - 11904: 0xB2C1, + 31522 - 11904: 0xD6D0, + 31523 - 11904: 0xD6DD, + 31524 - 11904: 0xD6D1, + 31525 - 11904: 0xD6CE, + 31526 - 11904: 0xB2C5, + 31527 - 11904: 0x954F, + 31528 - 11904: 0xB2C2, + 31529 - 11904: 0x8E5E, + 31530 - 11904: 0xD6D4, + 31531 - 11904: 0xD6D7, + 31532 - 11904: 0xB2C4, + 31533 - 11904: 0xD6D8, + 31534 - 11904: 0xB2C8, + 31535 - 11904: 0xD6D9, + 31536 - 11904: 0xD6CF, + 31537 - 11904: 0xD6D6, + 31538 - 11904: 0xD6DA, + 31539 - 11904: 0xD6D2, + 31540 - 11904: 0xD6CD, + 31541 - 11904: 0xD6CB, + 31544 - 11904: 0xD6DB, + 31545 - 11904: 0x996A, + 31547 - 11904: 0xDADF, + 31552 - 11904: 0xDAE4, + 31554 - 11904: 0x9C64, + 31555 - 11904: 0x9CD9, + 31556 - 11904: 0xDAE0, + 31557 - 11904: 0xDAE6, + 31558 - 11904: 0xB5A7, + 31559 - 11904: 0xD6CC, + 31560 - 11904: 0xDAE1, + 31561 - 11904: 0xB5A5, + 31562 - 11904: 0xDADE, + 31563 - 11904: 0xB5AC, + 31564 - 11904: 0xDAE2, + 31565 - 11904: 0xB5AB, + 31566 - 11904: 0xDAE3, + 31567 - 11904: 0xB5AD, + 31568 - 11904: 0xB5A8, + 31569 - 11904: 0xB5AE, + 31570 - 11904: 0xB5A9, + 31572 - 11904: 0xB5AA, + 31573 - 11904: 0x8E5D, + 31574 - 11904: 0xB5A6, + 31576 - 11904: 0xDAE5, + 31584 - 11904: 0xB861, + 31585 - 11904: 0xDF50, + 31586 - 11904: 0x9950, + 31587 - 11904: 0xDF53, + 31588 - 11904: 0xDF47, + 31589 - 11904: 0xDF4C, + 31590 - 11904: 0xDF46, + 31591 - 11904: 0xB863, + 31593 - 11904: 0xDF4A, + 31596 - 11904: 0x9951, + 31597 - 11904: 0xDF48, + 31598 - 11904: 0xB862, + 31599 - 11904: 0x8E62, + 31600 - 11904: 0xDF4F, + 31601 - 11904: 0xDF4E, + 31602 - 11904: 0xDF4B, + 31603 - 11904: 0xDF4D, + 31604 - 11904: 0xDF49, + 31605 - 11904: 0xBAE1, + 31606 - 11904: 0xDF52, + 31607 - 11904: 0xB85F, + 31608 - 11904: 0xDF51, + 31611 - 11904: 0x9952, + 31618 - 11904: 0xE35D, + 31620 - 11904: 0xBAE8, + 31621 - 11904: 0xE358, + 31623 - 11904: 0xBAE7, + 31624 - 11904: 0xE34E, + 31626 - 11904: 0xE350, + 31627 - 11904: 0xBAE0, + 31628 - 11904: 0xE355, + 31629 - 11904: 0xE354, + 31630 - 11904: 0xE357, + 31631 - 11904: 0xBAE5, + 31632 - 11904: 0xE352, + 31633 - 11904: 0xE351, + 31634 - 11904: 0x8E68, + 31636 - 11904: 0xBAE4, + 31637 - 11904: 0xBADF, + 31638 - 11904: 0xE353, + 31639 - 11904: 0xBAE2, + 31640 - 11904: 0xE359, + 31641 - 11904: 0xE35B, + 31643 - 11904: 0xE356, + 31644 - 11904: 0xE34F, + 31645 - 11904: 0xBAE3, + 31648 - 11904: 0xBD69, + 31649 - 11904: 0xBADE, + 31650 - 11904: 0x8E61, + 31651 - 11904: 0x9F59, + 31652 - 11904: 0xE35C, + 31660 - 11904: 0xE6D9, + 31661 - 11904: 0xBD62, + 31662 - 11904: 0x87D0, + 31663 - 11904: 0xE6DB, + 31665 - 11904: 0xBD63, + 31666 - 11904: 0x8BB3, + 31668 - 11904: 0xBD65, + 31669 - 11904: 0xE6DE, + 31671 - 11904: 0xE6D6, + 31672 - 11904: 0xBAE6, + 31673 - 11904: 0xE6DC, + 31678 - 11904: 0xE6D8, + 31680 - 11904: 0xB860, + 31681 - 11904: 0xBD68, + 31684 - 11904: 0xBD64, + 31685 - 11904: 0x87B9, + 31686 - 11904: 0xBD66, + 31687 - 11904: 0xBD67, + 31689 - 11904: 0xBF76, + 31690 - 11904: 0xE6DD, + 31691 - 11904: 0xE6D7, + 31692 - 11904: 0xBD6A, + 31694 - 11904: 0xE6DA, + 31695 - 11904: 0x9F5D, + 31696 - 11904: 0x8E66, + 31700 - 11904: 0xEAC0, + 31701 - 11904: 0xEABB, + 31704 - 11904: 0xEAC5, + 31705 - 11904: 0xBF74, + 31706 - 11904: 0xEABD, + 31707 - 11904: 0xBF78, + 31708 - 11904: 0xEAC3, + 31709 - 11904: 0xEABA, + 31710 - 11904: 0xEAB7, + 31711 - 11904: 0xEAC6, + 31712 - 11904: 0xC151, + 31713 - 11904: 0xBF79, + 31714 - 11904: 0xEAC2, + 31715 - 11904: 0xEAB8, + 31716 - 11904: 0xBF77, + 31717 - 11904: 0xEABC, + 31718 - 11904: 0xBF7B, + 31719 - 11904: 0xEAB9, + 31720 - 11904: 0xEABE, + 31721 - 11904: 0xBF7A, + 31722 - 11904: 0xEAC1, + 31723 - 11904: 0xEAC4, + 31724 - 11904: 0x8CB2, + 31728 - 11904: 0xEDCB, + 31729 - 11904: 0xEDCC, + 31730 - 11904: 0xEDBC, + 31731 - 11904: 0xEDC3, + 31732 - 11904: 0xEDC1, + 31735 - 11904: 0xC14F, + 31736 - 11904: 0xEDC8, + 31737 - 11904: 0xEABF, + 31738 - 11904: 0x8E6E, + 31739 - 11904: 0xEDBF, + 31740 - 11904: 0x9F64, + 31741 - 11904: 0xEDC9, + 31742 - 11904: 0xC14E, + 31743 - 11904: 0xEDBE, + 31744 - 11904: 0xEDBD, + 31745 - 11904: 0xEDC7, + 31746 - 11904: 0xEDC4, + 31747 - 11904: 0xEDC6, + 31749 - 11904: 0xEDBA, + 31750 - 11904: 0xEDCA, + 31751 - 11904: 0xC14C, + 31753 - 11904: 0xEDC5, + 31754 - 11904: 0xEDCE, + 31755 - 11904: 0xEDC2, + 31756 - 11904: 0xC150, + 31757 - 11904: 0xC14D, + 31758 - 11904: 0xEDC0, + 31759 - 11904: 0xEDBB, + 31760 - 11904: 0xEDCD, + 31761 - 11904: 0xBF75, + 31762 - 11904: 0x9953, + 31765 - 11904: 0xFAB8, + 31769 - 11904: 0xF063, + 31771 - 11904: 0x9954, + 31772 - 11904: 0xF061, + 31773 - 11904: 0xF067, + 31774 - 11904: 0xC2B0, + 31775 - 11904: 0xF065, + 31776 - 11904: 0xF064, + 31777 - 11904: 0xC2B2, + 31778 - 11904: 0xF06A, + 31779 - 11904: 0xC2B1, + 31781 - 11904: 0xF06B, + 31782 - 11904: 0xF068, + 31783 - 11904: 0xC2AE, + 31784 - 11904: 0xF069, + 31785 - 11904: 0xF062, + 31786 - 11904: 0xC2AF, + 31787 - 11904: 0xC2AD, + 31788 - 11904: 0xF2AB, + 31789 - 11904: 0xF066, + 31792 - 11904: 0xF06C, + 31795 - 11904: 0xF2A8, + 31797 - 11904: 0x8E70, + 31799 - 11904: 0xC3B2, + 31800 - 11904: 0xC3B0, + 31801 - 11904: 0xF2AA, + 31803 - 11904: 0xF2AC, + 31804 - 11904: 0xF2A9, + 31805 - 11904: 0xC3B1, + 31806 - 11904: 0xC3AE, + 31807 - 11904: 0xC3AF, + 31808 - 11904: 0xC3B3, + 31810 - 11904: 0x9F61, + 31811 - 11904: 0xC478, + 31812 - 11904: 0x8E72, + 31813 - 11904: 0xF4AA, + 31815 - 11904: 0xF4A9, + 31816 - 11904: 0xF4A7, + 31817 - 11904: 0xF4A6, + 31818 - 11904: 0xF4A8, + 31820 - 11904: 0xC477, + 31821 - 11904: 0xC479, + 31824 - 11904: 0xC4F0, + 31825 - 11904: 0xA06B, + 31827 - 11904: 0xF5E5, + 31828 - 11904: 0xF5E4, + 31830 - 11904: 0x9F40, + 31831 - 11904: 0xF6FA, + 31833 - 11904: 0xF6FC, + 31834 - 11904: 0xF6FE, + 31835 - 11904: 0xF6FD, + 31836 - 11904: 0xF6FB, + 31837 - 11904: 0x94ED, + 31839 - 11904: 0xC5A3, + 31840 - 11904: 0xC5A2, + 31843 - 11904: 0xC5D3, + 31844 - 11904: 0xC5D2, + 31845 - 11904: 0xC5D4, + 31846 - 11904: 0xF7ED, + 31847 - 11904: 0xF7EC, + 31849 - 11904: 0xF8FB, + 31850 - 11904: 0xF8B8, + 31851 - 11904: 0xF8FC, + 31852 - 11904: 0xC658, + 31853 - 11904: 0x94EE, + 31854 - 11904: 0xC659, + 31855 - 11904: 0xF96D, + 31856 - 11904: 0x9FBD, + 31858 - 11904: 0xC67E, + 31859 - 11904: 0xA6CC, + 31860 - 11904: 0x8E7B, + 31861 - 11904: 0xCDA8, + 31864 - 11904: 0xD045, + 31865 - 11904: 0xD046, + 31866 - 11904: 0xD044, + 31867 - 11904: 0x9957, + 31868 - 11904: 0x94F7, + 31869 - 11904: 0xACF3, + 31870 - 11904: 0x9F5F, + 31871 - 11904: 0xD047, + 31872 - 11904: 0xD048, + 31873 - 11904: 0xD049, + 31875 - 11904: 0x8E73, + 31876 - 11904: 0xD349, + 31877 - 11904: 0xD34F, + 31878 - 11904: 0x9F62, + 31880 - 11904: 0xD34D, + 31881 - 11904: 0xAFBB, + 31882 - 11904: 0xD34B, + 31884 - 11904: 0xD34C, + 31885 - 11904: 0xD34E, + 31886 - 11904: 0x94F6, + 31889 - 11904: 0xD34A, + 31890 - 11904: 0xB2C9, + 31892 - 11904: 0xD6DE, + 31893 - 11904: 0xB2CB, + 31894 - 11904: 0xD6E0, + 31895 - 11904: 0xB2CA, + 31896 - 11904: 0xD6DF, + 31900 - 11904: 0x9958, + 31902 - 11904: 0xDAE8, + 31903 - 11904: 0xB5AF, + 31905 - 11904: 0xDAEA, + 31906 - 11904: 0xDAE7, + 31907 - 11904: 0xD6E1, + 31909 - 11904: 0xB5B0, + 31910 - 11904: 0x8E75, + 31911 - 11904: 0xF9DB, + 31912 - 11904: 0xDAE9, + 31916 - 11904: 0x9072, + 31918 - 11904: 0x94F8, + 31919 - 11904: 0xDF56, + 31921 - 11904: 0xB864, + 31922 - 11904: 0xDF54, + 31923 - 11904: 0xB865, + 31924 - 11904: 0xDF55, + 31925 - 11904: 0xB866, + 31928 - 11904: 0x995A, + 31929 - 11904: 0xBAE9, + 31930 - 11904: 0xE361, + 31931 - 11904: 0xE35E, + 31932 - 11904: 0xE360, + 31933 - 11904: 0xBAEA, + 31934 - 11904: 0xBAEB, + 31935 - 11904: 0xE35F, + 31938 - 11904: 0xA0B0, + 31939 - 11904: 0x8CB3, + 31941 - 11904: 0xE6DF, + 31943 - 11904: 0x8E79, + 31944 - 11904: 0xE6E0, + 31945 - 11904: 0x8E78, + 31946 - 11904: 0xBD6B, + 31947 - 11904: 0xE6E2, + 31948 - 11904: 0xE6E1, + 31949 - 11904: 0x94F3, + 31950 - 11904: 0xA261, + 31952 - 11904: 0xEACA, + 31953 - 11904: 0xEACB, + 31954 - 11904: 0xEAC7, + 31955 - 11904: 0x98AF, + 31956 - 11904: 0xEAC8, + 31957 - 11904: 0xBF7C, + 31958 - 11904: 0xBF7D, + 31959 - 11904: 0xEAC9, + 31961 - 11904: 0xC157, + 31962 - 11904: 0xA0B2, + 31964 - 11904: 0xC153, + 31965 - 11904: 0xC158, + 31966 - 11904: 0xC154, + 31967 - 11904: 0xC156, + 31968 - 11904: 0xC152, + 31970 - 11904: 0xC155, + 31974 - 11904: 0x8E7A, + 31975 - 11904: 0xC2B3, + 31976 - 11904: 0xEDCF, + 31978 - 11904: 0xF2AE, + 31980 - 11904: 0xF2AD, + 31981 - 11904: 0x995C, + 31982 - 11904: 0xF4AB, + 31983 - 11904: 0xC47A, + 31984 - 11904: 0xC47B, + 31985 - 11904: 0xF741, + 31986 - 11904: 0xF5E6, + 31987 - 11904: 0x8E7C, + 31988 - 11904: 0xF740, + 31989 - 11904: 0x8E7D, + 31990 - 11904: 0xF8FD, + 31991 - 11904: 0xF9A4, + 31992 - 11904: 0xA6CD, + 31993 - 11904: 0x8BD9, + 31995 - 11904: 0xA874, + 31996 - 11904: 0x89A2, + 31997 - 11904: 0xCDA9, + 31998 - 11904: 0xAAC8, + 32000 - 11904: 0xACF6, + 32001 - 11904: 0xD04C, + 32002 - 11904: 0xACF4, + 32003 - 11904: 0xD04A, + 32004 - 11904: 0xACF9, + 32005 - 11904: 0xACF5, + 32006 - 11904: 0xACFA, + 32007 - 11904: 0xACF8, + 32008 - 11904: 0xD04B, + 32009 - 11904: 0xACF7, + 32010 - 11904: 0xAFBF, + 32011 - 11904: 0xAFBE, + 32012 - 11904: 0xD35A, + 32013 - 11904: 0xAFC7, + 32014 - 11904: 0xD353, + 32015 - 11904: 0xD359, + 32016 - 11904: 0xAFC3, + 32017 - 11904: 0xD352, + 32018 - 11904: 0xD358, + 32019 - 11904: 0xD356, + 32020 - 11904: 0xAFC2, + 32021 - 11904: 0xAFC4, + 32022 - 11904: 0xD355, + 32023 - 11904: 0xAFBD, + 32024 - 11904: 0xD354, + 32025 - 11904: 0xAFC8, + 32026 - 11904: 0xAFC5, + 32027 - 11904: 0xAFC9, + 32028 - 11904: 0xAFC6, + 32029 - 11904: 0xD351, + 32030 - 11904: 0xD350, + 32031 - 11904: 0xD357, + 32032 - 11904: 0xAFC0, + 32033 - 11904: 0xAFBC, + 32034 - 11904: 0xAFC1, + 32037 - 11904: 0x9ED7, + 32040 - 11904: 0xD6F0, + 32041 - 11904: 0xD6E9, + 32043 - 11904: 0xB5B5, + 32044 - 11904: 0xD6E8, + 32046 - 11904: 0xB2CF, + 32047 - 11904: 0xB2D6, + 32048 - 11904: 0xB2D3, + 32049 - 11904: 0xB2D9, + 32050 - 11904: 0xB2D8, + 32051 - 11904: 0xB2D4, + 32053 - 11904: 0xD6E2, + 32054 - 11904: 0xD6E5, + 32056 - 11904: 0xD6E4, + 32057 - 11904: 0xB2D0, + 32058 - 11904: 0xD6E6, + 32059 - 11904: 0xD6EF, + 32060 - 11904: 0xB2D1, + 32061 - 11904: 0xD6E3, + 32062 - 11904: 0xD6EC, + 32063 - 11904: 0xD6ED, + 32064 - 11904: 0xB2D2, + 32065 - 11904: 0xD6EA, + 32066 - 11904: 0xB2D7, + 32067 - 11904: 0xB2CD, + 32068 - 11904: 0xB2D5, + 32069 - 11904: 0xD6E7, + 32070 - 11904: 0xB2CC, + 32071 - 11904: 0xD6EB, + 32074 - 11904: 0xD6EE, + 32077 - 11904: 0xA0B6, + 32078 - 11904: 0xDAFB, + 32079 - 11904: 0xDAF2, + 32080 - 11904: 0xB5B2, + 32081 - 11904: 0xDAF9, + 32082 - 11904: 0xDAF6, + 32083 - 11904: 0xDAEE, + 32084 - 11904: 0xDAF7, + 32085 - 11904: 0xB5B4, + 32086 - 11904: 0xDAEF, + 32088 - 11904: 0xDAEB, + 32090 - 11904: 0x9E42, + 32091 - 11904: 0xB86C, + 32092 - 11904: 0xDAF4, + 32093 - 11904: 0x8EA4, + 32094 - 11904: 0xB5B1, + 32095 - 11904: 0xDAFA, + 32097 - 11904: 0xB5B8, + 32098 - 11904: 0xB5BA, + 32099 - 11904: 0xDAED, + 32102 - 11904: 0xB5B9, + 32103 - 11904: 0xDAF0, + 32104 - 11904: 0xB5B3, + 32105 - 11904: 0xDAF8, + 32106 - 11904: 0xDAF1, + 32107 - 11904: 0xDAF5, + 32109 - 11904: 0xDAF3, + 32110 - 11904: 0xB5B6, + 32111 - 11904: 0xDAEC, + 32112 - 11904: 0xB5BB, + 32113 - 11904: 0xB2CE, + 32114 - 11904: 0xB5B7, + 32115 - 11904: 0xB5BC, + 32121 - 11904: 0xB868, + 32122 - 11904: 0xDF5D, + 32123 - 11904: 0xDF5F, + 32124 - 11904: 0xDF61, + 32125 - 11904: 0xDF65, + 32127 - 11904: 0xDF5B, + 32128 - 11904: 0xDF59, + 32129 - 11904: 0xB86A, + 32131 - 11904: 0xDF60, + 32132 - 11904: 0xDF64, + 32133 - 11904: 0xDF5C, + 32134 - 11904: 0xDF58, + 32136 - 11904: 0xDF57, + 32137 - 11904: 0x8EA7, + 32139 - 11904: 0x8C76, + 32140 - 11904: 0xDF62, + 32141 - 11904: 0xDF5A, + 32142 - 11904: 0xDF5E, + 32143 - 11904: 0xB86B, + 32145 - 11904: 0xB869, + 32146 - 11904: 0xDF66, + 32147 - 11904: 0xB867, + 32148 - 11904: 0xDF63, + 32149 - 11904: 0x8767, + 32150 - 11904: 0xE372, + 32151 - 11904: 0x9542, + 32156 - 11904: 0xBAEE, + 32157 - 11904: 0xE36A, + 32158 - 11904: 0xBD78, + 32159 - 11904: 0xE374, + 32160 - 11904: 0xBAF1, + 32161 - 11904: 0xE378, + 32162 - 11904: 0xBAF7, + 32163 - 11904: 0xE365, + 32164 - 11904: 0x987D, + 32166 - 11904: 0xE375, + 32167 - 11904: 0xE362, + 32168 - 11904: 0x9755, + 32169 - 11904: 0xE377, + 32170 - 11904: 0xE366, + 32171 - 11904: 0x8EA8, + 32172 - 11904: 0xBAFE, + 32173 - 11904: 0xBAFB, + 32174 - 11904: 0xE376, + 32175 - 11904: 0xE370, + 32176 - 11904: 0xBAED, + 32177 - 11904: 0xBAF5, + 32178 - 11904: 0xBAF4, + 32179 - 11904: 0x8EAA, + 32180 - 11904: 0xBAF3, + 32181 - 11904: 0xBAF9, + 32183 - 11904: 0xE363, + 32184 - 11904: 0xBAFA, + 32185 - 11904: 0xE371, + 32186 - 11904: 0xBAF6, + 32187 - 11904: 0xBAEC, + 32188 - 11904: 0xE373, + 32189 - 11904: 0xBAEF, + 32190 - 11904: 0xBAF0, + 32191 - 11904: 0xBAF8, + 32192 - 11904: 0xE368, + 32193 - 11904: 0xE367, + 32194 - 11904: 0xE364, + 32196 - 11904: 0xE36C, + 32197 - 11904: 0xE369, + 32198 - 11904: 0xE36D, + 32199 - 11904: 0xBAFD, + 32201 - 11904: 0xE379, + 32202 - 11904: 0xBAF2, + 32203 - 11904: 0xE36E, + 32204 - 11904: 0xE36F, + 32205 - 11904: 0x89A3, + 32206 - 11904: 0xE36B, + 32207 - 11904: 0x9960, + 32208 - 11904: 0x9962, + 32210 - 11904: 0xBAFC, + 32211 - 11904: 0x94FC, + 32212 - 11904: 0x9961, + 32215 - 11904: 0xE6E7, + 32216 - 11904: 0xBD70, + 32217 - 11904: 0xBD79, + 32218 - 11904: 0xBD75, + 32219 - 11904: 0xE6E4, + 32220 - 11904: 0x94FA, + 32221 - 11904: 0xBD72, + 32222 - 11904: 0xBD76, + 32223 - 11904: 0xE6F0, + 32224 - 11904: 0xBD6C, + 32225 - 11904: 0xE6E8, + 32227 - 11904: 0xBD74, + 32228 - 11904: 0x8EAE, + 32229 - 11904: 0x8EB2, + 32230 - 11904: 0xE6EB, + 32231 - 11904: 0xE6E6, + 32232 - 11904: 0xBD73, + 32233 - 11904: 0xBD77, + 32234 - 11904: 0xE6E5, + 32236 - 11904: 0xBD71, + 32238 - 11904: 0xE6EF, + 32239 - 11904: 0xBD6E, + 32240 - 11904: 0xE6EE, + 32241 - 11904: 0xE6ED, + 32242 - 11904: 0xBD7A, + 32243 - 11904: 0xE572, + 32244 - 11904: 0xBD6D, + 32245 - 11904: 0x8EB0, + 32246 - 11904: 0xE6EC, + 32247 - 11904: 0xE6E3, + 32249 - 11904: 0xBD7B, + 32250 - 11904: 0xE6EA, + 32251 - 11904: 0xBD6F, + 32253 - 11904: 0x9963, + 32254 - 11904: 0x97AA, + 32259 - 11904: 0xE6E9, + 32263 - 11904: 0x94FB, + 32264 - 11904: 0xBFA2, + 32265 - 11904: 0xBFA7, + 32266 - 11904: 0xBF7E, + 32267 - 11904: 0xEAD8, + 32268 - 11904: 0xEACF, + 32269 - 11904: 0xEADB, + 32270 - 11904: 0xEAD3, + 32271 - 11904: 0xEAD9, + 32272 - 11904: 0xBFA8, + 32273 - 11904: 0xBFA1, + 32274 - 11904: 0xEACC, + 32275 - 11904: 0xEAD2, + 32276 - 11904: 0xEADC, + 32277 - 11904: 0xEAD5, + 32278 - 11904: 0xEADA, + 32279 - 11904: 0xEACE, + 32282 - 11904: 0xEAD6, + 32283 - 11904: 0xBFA3, + 32284 - 11904: 0xEAD4, + 32285 - 11904: 0xBFA6, + 32286 - 11904: 0xBFA5, + 32287 - 11904: 0xEAD0, + 32288 - 11904: 0xEAD1, + 32289 - 11904: 0xEACD, + 32290 - 11904: 0xEAD7, + 32291 - 11904: 0xBFA4, + 32292 - 11904: 0xEADE, + 32293 - 11904: 0xEADD, + 32295 - 11904: 0x8EBB, + 32297 - 11904: 0xEDDA, + 32298 - 11904: 0xEDD6, + 32299 - 11904: 0xC15F, + 32301 - 11904: 0xEDD0, + 32302 - 11904: 0xC159, + 32303 - 11904: 0xC169, + 32304 - 11904: 0xEDDC, + 32305 - 11904: 0xC161, + 32306 - 11904: 0xC15D, + 32307 - 11904: 0xEDD3, + 32308 - 11904: 0xC164, + 32309 - 11904: 0xC167, + 32310 - 11904: 0xEDDE, + 32311 - 11904: 0xC15C, + 32312 - 11904: 0xEDD5, + 32313 - 11904: 0xC165, + 32314 - 11904: 0xEDE0, + 32315 - 11904: 0xEDDD, + 32316 - 11904: 0xEDD1, + 32317 - 11904: 0xC160, + 32318 - 11904: 0xC15A, + 32319 - 11904: 0xC168, + 32320 - 11904: 0xEDD8, + 32321 - 11904: 0xC163, + 32322 - 11904: 0xEDD2, + 32323 - 11904: 0xC15E, + 32324 - 11904: 0xEDDF, + 32325 - 11904: 0xC162, + 32326 - 11904: 0xC15B, + 32327 - 11904: 0xEDD9, + 32328 - 11904: 0xC166, + 32329 - 11904: 0xEDD7, + 32332 - 11904: 0xEDDB, + 32336 - 11904: 0xF06E, + 32337 - 11904: 0xF074, + 32338 - 11904: 0xC2B9, + 32339 - 11904: 0xF077, + 32340 - 11904: 0xC2B4, + 32341 - 11904: 0xC2B5, + 32342 - 11904: 0xF06F, + 32343 - 11904: 0xF076, + 32344 - 11904: 0xF071, + 32345 - 11904: 0xC2BA, + 32346 - 11904: 0xC2B7, + 32347 - 11904: 0x8CDC, + 32348 - 11904: 0xF06D, + 32350 - 11904: 0xC2B6, + 32351 - 11904: 0xF073, + 32352 - 11904: 0xF075, + 32353 - 11904: 0xC2B8, + 32354 - 11904: 0xF072, + 32355 - 11904: 0xF070, + 32357 - 11904: 0x9876, + 32359 - 11904: 0x8EA1, + 32360 - 11904: 0xF2B8, + 32361 - 11904: 0xC3B7, + 32362 - 11904: 0xC3B8, + 32363 - 11904: 0xC3B4, + 32364 - 11904: 0x8CB4, + 32365 - 11904: 0xC3B5, + 32366 - 11904: 0x8EB7, + 32367 - 11904: 0xF2B4, + 32368 - 11904: 0xF2B2, + 32370 - 11904: 0xF2B6, + 32371 - 11904: 0xC3BA, + 32372 - 11904: 0xF2B7, + 32373 - 11904: 0xF2B0, + 32374 - 11904: 0xF2AF, + 32375 - 11904: 0xF2B3, + 32376 - 11904: 0xF2B1, + 32377 - 11904: 0xC3B6, + 32378 - 11904: 0xF2B5, + 32379 - 11904: 0xF4AC, + 32380 - 11904: 0xC47E, + 32381 - 11904: 0xC47D, + 32382 - 11904: 0xF4AD, + 32383 - 11904: 0x9DA6, + 32384 - 11904: 0xF4AF, + 32385 - 11904: 0xF4AE, + 32386 - 11904: 0xC4A1, + 32390 - 11904: 0xF5EB, + 32391 - 11904: 0xF5E8, + 32392 - 11904: 0xF5E9, + 32394 - 11904: 0xF5E7, + 32395 - 11904: 0xF5EA, + 32396 - 11904: 0xC4F2, + 32397 - 11904: 0xF5EC, + 32398 - 11904: 0x9EB0, + 32399 - 11904: 0xC4F1, + 32401 - 11904: 0xF742, + 32402 - 11904: 0x8EB8, + 32403 - 11904: 0xC5D5, + 32404 - 11904: 0xC5D7, + 32405 - 11904: 0xF7EE, + 32406 - 11904: 0xC5D6, + 32407 - 11904: 0xF8B9, + 32408 - 11904: 0xF940, + 32409 - 11904: 0xF942, + 32410 - 11904: 0xF8FE, + 32411 - 11904: 0xF941, + 32412 - 11904: 0xC66C, + 32415 - 11904: 0x9D70, + 32420 - 11904: 0x896E, + 32428 - 11904: 0x896F, + 32442 - 11904: 0x8970, + 32455 - 11904: 0x8971, + 32463 - 11904: 0x8972, + 32479 - 11904: 0x8973, + 32518 - 11904: 0x8974, + 32566 - 11904: 0xA6CE, + 32567 - 11904: 0x8975, + 32568 - 11904: 0xACFB, + 32569 - 11904: 0xD26F, + 32570 - 11904: 0xAFCA, + 32573 - 11904: 0xB2DA, + 32574 - 11904: 0xDAFC, + 32575 - 11904: 0xDAFD, + 32576 - 11904: 0x8EBC, + 32577 - 11904: 0x8EBD, + 32579 - 11904: 0xEADF, + 32580 - 11904: 0xC16A, + 32581 - 11904: 0xEDE1, + 32583 - 11904: 0x8EBE, + 32584 - 11904: 0xC2BB, + 32585 - 11904: 0x9DD1, + 32586 - 11904: 0xF2BA, + 32587 - 11904: 0xF2B9, + 32588 - 11904: 0xC4A2, + 32589 - 11904: 0xF5ED, + 32590 - 11904: 0x94FD, + 32591 - 11904: 0xF743, + 32592 - 11904: 0xC5F8, + 32593 - 11904: 0xCA49, + 32594 - 11904: 0x8BD7, + 32595 - 11904: 0x8BDA, + 32596 - 11904: 0xAAC9, + 32597 - 11904: 0xA875, + 32600 - 11904: 0xD04D, + 32603 - 11904: 0xD360, + 32604 - 11904: 0xD35B, + 32605 - 11904: 0xD35F, + 32606 - 11904: 0xD35D, + 32607 - 11904: 0xAFCB, + 32608 - 11904: 0xD35E, + 32609 - 11904: 0xD35C, + 32611 - 11904: 0xD6F1, + 32613 - 11904: 0xDAFE, + 32614 - 11904: 0xDB40, + 32615 - 11904: 0xDF69, + 32616 - 11904: 0xDF6A, + 32617 - 11904: 0xB86E, + 32618 - 11904: 0xB86F, + 32619 - 11904: 0xDF68, + 32620 - 11904: 0xDF6B, + 32621 - 11904: 0xDF67, + 32622 - 11904: 0xB86D, + 32624 - 11904: 0xBB40, + 32625 - 11904: 0xA0E2, + 32626 - 11904: 0xB870, + 32627 - 11904: 0xE37A, + 32629 - 11904: 0xBD7C, + 32630 - 11904: 0xE6F1, + 32631 - 11904: 0xBD7D, + 32632 - 11904: 0x9FE9, + 32633 - 11904: 0xBFA9, + 32634 - 11904: 0xEAE2, + 32635 - 11904: 0xEAE0, + 32636 - 11904: 0xEAE1, + 32637 - 11904: 0xEDE4, + 32638 - 11904: 0xEDE3, + 32639 - 11904: 0xEDE2, + 32643 - 11904: 0xF2BB, + 32645 - 11904: 0xC3B9, + 32646 - 11904: 0xF2BC, + 32647 - 11904: 0xF744, + 32648 - 11904: 0xC5F9, + 32649 - 11904: 0xF8BA, + 32650 - 11904: 0xA6CF, + 32651 - 11904: 0xAACB, + 32652 - 11904: 0xAACA, + 32653 - 11904: 0xD04F, + 32654 - 11904: 0xACFC, + 32655 - 11904: 0xFDA8, + 32657 - 11904: 0xD04E, + 32658 - 11904: 0xD362, + 32659 - 11904: 0x8AE7, + 32660 - 11904: 0xAFCC, + 32661 - 11904: 0xD6F2, + 32662 - 11904: 0xD361, + 32663 - 11904: 0x8EC2, + 32666 - 11904: 0xB2DC, + 32667 - 11904: 0xD6F5, + 32668 - 11904: 0xD6F3, + 32669 - 11904: 0xD6F4, + 32670 - 11904: 0xB2DB, + 32672 - 11904: 0xDB42, + 32673 - 11904: 0xDB43, + 32674 - 11904: 0xDB41, + 32675 - 11904: 0x8EC4, + 32676 - 11904: 0xB873, + 32677 - 11904: 0xDF6D, + 32678 - 11904: 0xDF6C, + 32679 - 11904: 0xDF6E, + 32680 - 11904: 0xB872, + 32681 - 11904: 0xB871, + 32684 - 11904: 0xE6F2, + 32685 - 11904: 0xE6F4, + 32686 - 11904: 0x9964, + 32687 - 11904: 0xBD7E, + 32688 - 11904: 0xE6F3, + 32689 - 11904: 0xEAE3, + 32690 - 11904: 0xBFAA, + 32691 - 11904: 0xF079, + 32692 - 11904: 0x9965, + 32693 - 11904: 0xF078, + 32694 - 11904: 0xC3BB, + 32695 - 11904: 0xF2BD, + 32696 - 11904: 0xC3BD, + 32697 - 11904: 0xC3BC, + 32698 - 11904: 0xF4B0, + 32699 - 11904: 0xF5EE, + 32700 - 11904: 0xC4F3, + 32701 - 11904: 0xA6D0, + 32702 - 11904: 0xD050, + 32703 - 11904: 0xACFD, + 32704 - 11904: 0xD365, + 32705 - 11904: 0xAFCE, + 32706 - 11904: 0xD364, + 32707 - 11904: 0xD363, + 32709 - 11904: 0xAFCD, + 32711 - 11904: 0xD6FB, + 32713 - 11904: 0xD6FD, + 32714 - 11904: 0xD6F6, + 32715 - 11904: 0xD6F7, + 32716 - 11904: 0xB2DD, + 32717 - 11904: 0xD6F8, + 32718 - 11904: 0xB2DE, + 32719 - 11904: 0xD6FC, + 32720 - 11904: 0xD6F9, + 32721 - 11904: 0xD6FA, + 32722 - 11904: 0xB2DF, + 32724 - 11904: 0xB5BE, + 32725 - 11904: 0xB5BF, + 32727 - 11904: 0xDB44, + 32731 - 11904: 0xDF6F, + 32732 - 11904: 0xDF70, + 32733 - 11904: 0x954E, + 32734 - 11904: 0xE37E, + 32735 - 11904: 0xBB43, + 32736 - 11904: 0xBB41, + 32737 - 11904: 0xBB42, + 32738 - 11904: 0xE37B, + 32739 - 11904: 0xE37C, + 32741 - 11904: 0xE37D, + 32742 - 11904: 0xE6F9, + 32743 - 11904: 0x98B3, + 32744 - 11904: 0xE6FA, + 32745 - 11904: 0xBDA1, + 32746 - 11904: 0xE6F7, + 32747 - 11904: 0xE6F6, + 32748 - 11904: 0xE6F8, + 32749 - 11904: 0xE6F5, + 32750 - 11904: 0xBFAD, + 32751 - 11904: 0xEAE4, + 32752 - 11904: 0xBFAB, + 32753 - 11904: 0xBFAC, + 32754 - 11904: 0xEDE6, + 32755 - 11904: 0xC16B, + 32756 - 11904: 0xEDE5, + 32757 - 11904: 0xEFA8, + 32759 - 11904: 0xF07A, + 32760 - 11904: 0xF07B, + 32761 - 11904: 0xC2BC, + 32762 - 11904: 0x8ECB, + 32763 - 11904: 0xC2BD, + 32764 - 11904: 0xC16C, + 32765 - 11904: 0xF2BE, + 32766 - 11904: 0xF2BF, + 32767 - 11904: 0xF4B1, + 32768 - 11904: 0xC4A3, + 32769 - 11904: 0xA6D1, + 32770 - 11904: 0x8BDF, + 32771 - 11904: 0xA6D2, + 32772 - 11904: 0xACFE, + 32773 - 11904: 0xAACC, + 32774 - 11904: 0xAFCF, + 32775 - 11904: 0xD051, + 32776 - 11904: 0x8ECE, + 32779 - 11904: 0xB5C0, + 32780 - 11904: 0xA6D3, + 32781 - 11904: 0xAD41, + 32782 - 11904: 0xD052, + 32783 - 11904: 0xD053, + 32784 - 11904: 0xAD40, + 32785 - 11904: 0xAD42, + 32786 - 11904: 0xA6D4, + 32788 - 11904: 0xD054, + 32789 - 11904: 0xAFD1, + 32790 - 11904: 0xD366, + 32791 - 11904: 0xAFD3, + 32792 - 11904: 0xAFD0, + 32793 - 11904: 0xAFD2, + 32795 - 11904: 0xD741, + 32796 - 11904: 0xB2E0, + 32797 - 11904: 0x8ECF, + 32798 - 11904: 0xD740, + 32799 - 11904: 0xD6FE, + 32800 - 11904: 0x9968, + 32801 - 11904: 0xDF71, + 32804 - 11904: 0xE3A1, + 32805 - 11904: 0x9969, + 32806 - 11904: 0xBDA2, + 32808 - 11904: 0xBFAE, + 32809 - 11904: 0xEAE6, + 32810 - 11904: 0xEAE5, + 32812 - 11904: 0xEDE7, + 32814 - 11904: 0x996B, + 32815 - 11904: 0x8ED1, + 32816 - 11904: 0xF5EF, + 32817 - 11904: 0x996C, + 32819 - 11904: 0xA6D5, + 32820 - 11904: 0xCB73, + 32821 - 11904: 0xCDAA, + 32822 - 11904: 0xAD43, + 32823 - 11904: 0xD055, + 32825 - 11904: 0xD368, + 32827 - 11904: 0x8ED4, + 32828 - 11904: 0x8ED5, + 32829 - 11904: 0xAFD4, + 32830 - 11904: 0xD367, + 32831 - 11904: 0xAFD5, + 32835 - 11904: 0xD743, + 32838 - 11904: 0xB2E2, + 32839 - 11904: 0xD742, + 32840 - 11904: 0xD744, + 32842 - 11904: 0xB2E1, + 32847 - 11904: 0xDB46, + 32848 - 11904: 0xDB47, + 32849 - 11904: 0xDB45, + 32850 - 11904: 0xB5C1, + 32852 - 11904: 0x996D, + 32854 - 11904: 0xB874, + 32856 - 11904: 0xB875, + 32858 - 11904: 0xBB45, + 32859 - 11904: 0xA0BE, + 32860 - 11904: 0xE3A3, + 32861 - 11904: 0xE3A2, + 32862 - 11904: 0xBB44, + 32865 - 11904: 0x8ED6, + 32866 - 11904: 0xA0BC, + 32867 - 11904: 0xA0B5, + 32868 - 11904: 0xE6FB, + 32870 - 11904: 0xA0B4, + 32871 - 11904: 0xE6FC, + 32876 - 11904: 0xEAE7, + 32879 - 11904: 0xC170, + 32880 - 11904: 0xC16F, + 32881 - 11904: 0xC16D, + 32882 - 11904: 0xC16E, + 32883 - 11904: 0xC171, + 32885 - 11904: 0xF07C, + 32886 - 11904: 0xC2BF, + 32887 - 11904: 0xC2BE, + 32888 - 11904: 0xF2C0, + 32889 - 11904: 0xF4B2, + 32893 - 11904: 0xC5A5, + 32894 - 11904: 0xC5A4, + 32895 - 11904: 0xA6D6, + 32896 - 11904: 0x8BE0, + 32898 - 11904: 0xD1FB, + 32900 - 11904: 0xB877, + 32901 - 11904: 0xB5C2, + 32902 - 11904: 0xB876, + 32903 - 11904: 0xBB46, + 32905 - 11904: 0xA6D7, + 32906 - 11904: 0xC9A9, + 32907 - 11904: 0xA6D8, + 32908 - 11904: 0xA6D9, + 32911 - 11904: 0xCDAB, + 32912 - 11904: 0xCB76, + 32914 - 11904: 0xCB77, + 32915 - 11904: 0xA877, + 32917 - 11904: 0xCB74, + 32918 - 11904: 0xA876, + 32920 - 11904: 0xA879, + 32921 - 11904: 0xCB75, + 32922 - 11904: 0xA87B, + 32923 - 11904: 0xA87A, + 32924 - 11904: 0xCB78, + 32925 - 11904: 0xA878, + 32927 - 11904: 0x89B5, + 32929 - 11904: 0xAAD1, + 32930 - 11904: 0xAACF, + 32931 - 11904: 0xCDAD, + 32933 - 11904: 0xAACE, + 32935 - 11904: 0x8EDD, + 32937 - 11904: 0xAAD3, + 32938 - 11904: 0xAAD5, + 32939 - 11904: 0xAAD2, + 32941 - 11904: 0xCDB0, + 32942 - 11904: 0xCDAC, + 32943 - 11904: 0xAAD6, + 32945 - 11904: 0xAAD0, + 32946 - 11904: 0xA87C, + 32948 - 11904: 0xAAD4, + 32949 - 11904: 0xCDAF, + 32950 - 11904: 0x9E5D, + 32951 - 11904: 0x9971, + 32952 - 11904: 0xCDAE, + 32954 - 11904: 0xAACD, + 32956 - 11904: 0x89AE, + 32957 - 11904: 0x9DE8, + 32962 - 11904: 0xD05B, + 32963 - 11904: 0xAD47, + 32964 - 11904: 0xAD48, + 32965 - 11904: 0xD05D, + 32966 - 11904: 0x9565, + 32967 - 11904: 0xD057, + 32968 - 11904: 0xD05A, + 32969 - 11904: 0xD063, + 32970 - 11904: 0xD061, + 32972 - 11904: 0xAD49, + 32973 - 11904: 0xD067, + 32974 - 11904: 0xAD4C, + 32975 - 11904: 0xD064, + 32976 - 11904: 0xD05C, + 32977 - 11904: 0xD059, + 32980 - 11904: 0xDB49, + 32981 - 11904: 0xD062, + 32982 - 11904: 0xAD44, + 32983 - 11904: 0xD065, + 32984 - 11904: 0xD056, + 32985 - 11904: 0xD05F, + 32986 - 11904: 0xAD46, + 32987 - 11904: 0xAD4B, + 32988 - 11904: 0xD060, + 32989 - 11904: 0xAD4F, + 32990 - 11904: 0xAD4D, + 32992 - 11904: 0xD058, + 32993 - 11904: 0xAD4A, + 32995 - 11904: 0xD05E, + 32996 - 11904: 0xAD4E, + 32997 - 11904: 0xAD45, + 32998 - 11904: 0xD066, + 33001 - 11904: 0x9972, + 33004 - 11904: 0x8B5C, + 33005 - 11904: 0xAFDA, + 33007 - 11904: 0xAFE3, + 33008 - 11904: 0xAFD8, + 33009 - 11904: 0xAFD6, + 33010 - 11904: 0xD36A, + 33011 - 11904: 0xAFDE, + 33012 - 11904: 0xAFDB, + 33013 - 11904: 0xD36C, + 33014 - 11904: 0x89B1, + 33016 - 11904: 0xAFDD, + 33017 - 11904: 0xD36B, + 33018 - 11904: 0xD369, + 33019 - 11904: 0xD36E, + 33020 - 11904: 0xAFE2, + 33021 - 11904: 0xAFE0, + 33022 - 11904: 0xDB48, + 33024 - 11904: 0xD36F, + 33025 - 11904: 0xD36D, + 33026 - 11904: 0xAFD7, + 33027 - 11904: 0xA0C0, + 33029 - 11904: 0xAFD9, + 33030 - 11904: 0xAFDC, + 33031 - 11904: 0x8EDF, + 33032 - 11904: 0xAFDF, + 33033 - 11904: 0x9566, + 33034 - 11904: 0xAFE1, + 33036 - 11904: 0x9974, + 33038 - 11904: 0x9976, + 33042 - 11904: 0x9977, + 33044 - 11904: 0x9979, + 33045 - 11904: 0xD74E, + 33046 - 11904: 0xB2E4, + 33047 - 11904: 0x9DDA, + 33048 - 11904: 0xD745, + 33049 - 11904: 0xD747, + 33050 - 11904: 0x8EE0, + 33051 - 11904: 0xD748, + 33053 - 11904: 0xD750, + 33054 - 11904: 0xD74C, + 33055 - 11904: 0xD74A, + 33057 - 11904: 0xD74D, + 33058 - 11904: 0xD751, + 33059 - 11904: 0xB2E5, + 33060 - 11904: 0xB2E9, + 33061 - 11904: 0xD746, + 33063 - 11904: 0xD74F, + 33065 - 11904: 0xB2E7, + 33066 - 11904: 0x935C, + 33067 - 11904: 0xB2E6, + 33068 - 11904: 0xD74B, + 33069 - 11904: 0xD749, + 33071 - 11904: 0xB2E3, + 33072 - 11904: 0xB2E8, + 33074 - 11904: 0x9DE6, + 33076 - 11904: 0x8B5F, + 33079 - 11904: 0x9563, + 33081 - 11904: 0xB5C8, + 33082 - 11904: 0xDB51, + 33085 - 11904: 0xDB4F, + 33086 - 11904: 0xB5CA, + 33090 - 11904: 0x9567, + 33091 - 11904: 0xDB4A, + 33092 - 11904: 0xDFA1, + 33094 - 11904: 0xB5C9, + 33095 - 11904: 0xDB4E, + 33096 - 11904: 0x9DE3, + 33098 - 11904: 0xDB4B, + 33099 - 11904: 0xB5C5, + 33100 - 11904: 0xB5CB, + 33101 - 11904: 0xDB50, + 33102 - 11904: 0xB5C7, + 33103 - 11904: 0xDB4D, + 33104 - 11904: 0xBB47, + 33105 - 11904: 0xB5C6, + 33106 - 11904: 0xDB4C, + 33107 - 11904: 0xB5CC, + 33108 - 11904: 0xB5C4, + 33109 - 11904: 0xB5C3, + 33110 - 11904: 0x997C, + 33113 - 11904: 0x997D, + 33114 - 11904: 0x997E, + 33115 - 11904: 0xDF77, + 33116 - 11904: 0xDF75, + 33118 - 11904: 0xDF7B, + 33120 - 11904: 0xDF73, + 33121 - 11904: 0xDFA2, + 33122 - 11904: 0xDF78, + 33124 - 11904: 0xDF72, + 33125 - 11904: 0xB87B, + 33126 - 11904: 0xB8A3, + 33127 - 11904: 0xDF7D, + 33129 - 11904: 0xDF76, + 33131 - 11904: 0xB87E, + 33132 - 11904: 0x8CFB, + 33133 - 11904: 0x8B5B, + 33134 - 11904: 0xB87C, + 33135 - 11904: 0xDF7E, + 33136 - 11904: 0xB879, + 33137 - 11904: 0xB878, + 33138 - 11904: 0xDF79, + 33139 - 11904: 0xB87D, + 33140 - 11904: 0xB5CD, + 33142 - 11904: 0xDF7C, + 33143 - 11904: 0xDF74, + 33144 - 11904: 0xB87A, + 33145 - 11904: 0xB8A1, + 33146 - 11904: 0xB8A2, + 33148 - 11904: 0x99A3, + 33151 - 11904: 0xBB4C, + 33152 - 11904: 0xBB48, + 33154 - 11904: 0xBB4D, + 33155 - 11904: 0xE3A6, + 33156 - 11904: 0x99A4, + 33158 - 11904: 0xE3A5, + 33159 - 11904: 0xE3A7, + 33160 - 11904: 0xBB4A, + 33161 - 11904: 0xE3A4, + 33162 - 11904: 0xBB4B, + 33163 - 11904: 0xE3AA, + 33164 - 11904: 0xE3A9, + 33165 - 11904: 0xE3A8, + 33167 - 11904: 0xBB49, + 33171 - 11904: 0x99A6, + 33173 - 11904: 0xE741, + 33175 - 11904: 0xE744, + 33176 - 11904: 0xBDA8, + 33177 - 11904: 0xE743, + 33178 - 11904: 0xBDA7, + 33179 - 11904: 0xBDA3, + 33180 - 11904: 0xBDA4, + 33181 - 11904: 0xBDA5, + 33182 - 11904: 0xE740, + 33183 - 11904: 0xE6FE, + 33184 - 11904: 0xBDA6, + 33186 - 11904: 0xE742, + 33187 - 11904: 0xE6FD, + 33189 - 11904: 0x99A8, + 33190 - 11904: 0xEAE9, + 33191 - 11904: 0xEAF3, + 33192 - 11904: 0xBFB1, + 33193 - 11904: 0xBFB0, + 33194 - 11904: 0x8ABE, + 33195 - 11904: 0xEAED, + 33196 - 11904: 0xEAEF, + 33198 - 11904: 0xEAEA, + 33200 - 11904: 0xEAEE, + 33201 - 11904: 0xEAE8, + 33202 - 11904: 0xEAF1, + 33203 - 11904: 0xBFAF, + 33204 - 11904: 0xEAF0, + 33205 - 11904: 0xEAEC, + 33206 - 11904: 0x9E61, + 33207 - 11904: 0xEAF2, + 33209 - 11904: 0xEAEB, + 33210 - 11904: 0xC174, + 33211 - 11904: 0xEDE8, + 33212 - 11904: 0xEDEE, + 33213 - 11904: 0xC178, + 33214 - 11904: 0xC17A, + 33215 - 11904: 0xC177, + 33216 - 11904: 0xC176, + 33217 - 11904: 0x99AA, + 33218 - 11904: 0xC175, + 33219 - 11904: 0xC173, + 33220 - 11904: 0xEDE9, + 33221 - 11904: 0xEDEC, + 33222 - 11904: 0xC172, + 33223 - 11904: 0xEDED, + 33224 - 11904: 0xA0C8, + 33225 - 11904: 0xC179, + 33226 - 11904: 0xEDEB, + 33228 - 11904: 0xEDEA, + 33229 - 11904: 0xC2C0, + 33231 - 11904: 0xC2C1, + 33232 - 11904: 0xF0A1, + 33233 - 11904: 0xF07D, + 33234 - 11904: 0xF07E, + 33237 - 11904: 0xF2C2, + 33239 - 11904: 0xF2C1, + 33240 - 11904: 0xC3BE, + 33241 - 11904: 0xF4B4, + 33242 - 11904: 0xC4A4, + 33243 - 11904: 0xF4B3, + 33245 - 11904: 0xF5F0, + 33246 - 11904: 0xF745, + 33247 - 11904: 0xC5A6, + 33248 - 11904: 0xF943, + 33249 - 11904: 0xF944, + 33250 - 11904: 0xC5D8, + 33251 - 11904: 0xA6DA, + 33252 - 11904: 0x99AB, + 33253 - 11904: 0xAAD7, + 33254 - 11904: 0xDB52, + 33255 - 11904: 0xBB4E, + 33256 - 11904: 0xC17B, + 33257 - 11904: 0xEDEF, + 33258 - 11904: 0xA6DB, + 33260 - 11904: 0xAFE5, + 33261 - 11904: 0xAFE4, + 33262 - 11904: 0xDB53, + 33263 - 11904: 0xFEC4, + 33266 - 11904: 0xEAF4, + 33267 - 11904: 0xA6DC, + 33268 - 11904: 0xAD50, + 33270 - 11904: 0x98C2, + 33271 - 11904: 0xDB54, + 33272 - 11904: 0xDB55, + 33273 - 11904: 0xDB56, + 33274 - 11904: 0xBB4F, + 33275 - 11904: 0xBFB2, + 33276 - 11904: 0xA6DD, + 33278 - 11904: 0xAAD8, + 33279 - 11904: 0xD068, + 33280 - 11904: 0xAFE6, + 33281 - 11904: 0xD370, + 33282 - 11904: 0xB2EA, + 33284 - 11904: 0xDB57, + 33285 - 11904: 0xB8A4, + 33287 - 11904: 0xBB50, + 33288 - 11904: 0xBFB3, + 33289 - 11904: 0xC17C, + 33290 - 11904: 0xC2C2, + 33291 - 11904: 0xF4B5, + 33292 - 11904: 0xA6DE, + 33293 - 11904: 0xAAD9, + 33296 - 11904: 0xAFE7, + 33297 - 11904: 0xD752, + 33298 - 11904: 0xB5CE, + 33300 - 11904: 0xBB51, + 33301 - 11904: 0xE3AB, + 33302 - 11904: 0xE745, + 33304 - 11904: 0x8EE8, + 33306 - 11904: 0xA0BA, + 33307 - 11904: 0xA6DF, + 33308 - 11904: 0xB5CF, + 33309 - 11904: 0xDFA3, + 33310 - 11904: 0xBB52, + 33311 - 11904: 0xA6E0, + 33312 - 11904: 0xCDB1, + 33313 - 11904: 0xD069, + 33314 - 11904: 0xAD51, + 33317 - 11904: 0xD372, + 33318 - 11904: 0xFD77, + 33320 - 11904: 0xAFEA, + 33321 - 11904: 0x8EEE, + 33322 - 11904: 0xAFE8, + 33323 - 11904: 0xAFE9, + 33324 - 11904: 0xAFEB, + 33325 - 11904: 0x9EBF, + 33327 - 11904: 0xD371, + 33330 - 11904: 0xD757, + 33331 - 11904: 0xD754, + 33332 - 11904: 0xD756, + 33333 - 11904: 0xB2EB, + 33334 - 11904: 0xB2ED, + 33335 - 11904: 0xB2EC, + 33336 - 11904: 0xD753, + 33337 - 11904: 0xB2EE, + 33338 - 11904: 0xD755, + 33340 - 11904: 0xDB58, + 33341 - 11904: 0xDB59, + 33342 - 11904: 0x89C2, + 33343 - 11904: 0xDB5A, + 33344 - 11904: 0xDFA6, + 33346 - 11904: 0xDFA7, + 33348 - 11904: 0xDFA5, + 33349 - 11904: 0xDFA8, + 33351 - 11904: 0xB8A5, + 33353 - 11904: 0xDFA4, + 33355 - 11904: 0xBB53, + 33358 - 11904: 0xE74A, + 33359 - 11904: 0xE746, + 33360 - 11904: 0xE749, + 33361 - 11904: 0xE74B, + 33362 - 11904: 0xE748, + 33363 - 11904: 0xE747, + 33364 - 11904: 0x99AC, + 33365 - 11904: 0xEAF5, + 33366 - 11904: 0xEAF6, + 33367 - 11904: 0xEAF7, + 33368 - 11904: 0xBFB4, + 33369 - 11904: 0xBFB5, + 33370 - 11904: 0xEDF1, + 33371 - 11904: 0xEDF0, + 33372 - 11904: 0xEDF2, + 33374 - 11904: 0xF0A3, + 33375 - 11904: 0xF0A2, + 33377 - 11904: 0xF2C4, + 33378 - 11904: 0x956B, + 33379 - 11904: 0xF2C5, + 33380 - 11904: 0xF2C3, + 33381 - 11904: 0x956C, + 33382 - 11904: 0xC4A5, + 33384 - 11904: 0xF4B6, + 33385 - 11904: 0xF4B7, + 33387 - 11904: 0xF746, + 33388 - 11904: 0xF7EF, + 33389 - 11904: 0xF8BB, + 33390 - 11904: 0xA6E1, + 33391 - 11904: 0xA87D, + 33393 - 11904: 0xC17D, + 33394 - 11904: 0xA6E2, + 33396 - 11904: 0xD758, + 33397 - 11904: 0xDB5B, + 33398 - 11904: 0x99AF, + 33399 - 11904: 0xC641, + 33400 - 11904: 0xCA4A, + 33401 - 11904: 0x994A, + 33402 - 11904: 0x8976, + 33403 - 11904: 0x8F48, + 33404 - 11904: 0xCA4B, + 33405 - 11904: 0xCA4D, + 33406 - 11904: 0xA6E3, + 33407 - 11904: 0xCA4E, + 33408 - 11904: 0xCA4C, + 33411 - 11904: 0xCBA2, + 33412 - 11904: 0xCBA3, + 33413 - 11904: 0xCB7B, + 33415 - 11904: 0xFBEE, + 33418 - 11904: 0xCBA1, + 33419 - 11904: 0xA8A1, + 33421 - 11904: 0xA8A2, + 33422 - 11904: 0xCB7C, + 33423 - 11904: 0xCB7A, + 33424 - 11904: 0xCB79, + 33425 - 11904: 0xCB7D, + 33426 - 11904: 0xA87E, + 33427 - 11904: 0xCB7E, + 33428 - 11904: 0xD06A, + 33432 - 11904: 0xCDB6, + 33433 - 11904: 0xAADC, + 33434 - 11904: 0xCDB5, + 33435 - 11904: 0xCDB7, + 33437 - 11904: 0xAADB, + 33438 - 11904: 0xCDBC, + 33439 - 11904: 0xAADF, + 33440 - 11904: 0xCDB2, + 33441 - 11904: 0xCDC0, + 33442 - 11904: 0xCDC6, + 33443 - 11904: 0xAAE6, + 33444 - 11904: 0xCDC3, + 33445 - 11904: 0xAAE3, + 33446 - 11904: 0x99AE, + 33447 - 11904: 0xCDB9, + 33448 - 11904: 0xCDBF, + 33449 - 11904: 0xCDC1, + 33450 - 11904: 0x8EFB, + 33451 - 11904: 0xCDB4, + 33452 - 11904: 0xAAE2, + 33453 - 11904: 0xAADD, + 33454 - 11904: 0xCDBA, + 33455 - 11904: 0xAAE4, + 33456 - 11904: 0xAAE7, + 33457 - 11904: 0xAAE1, + 33459 - 11904: 0xAADA, + 33460 - 11904: 0xCDBE, + 33461 - 11904: 0xCDB8, + 33462 - 11904: 0xCDC5, + 33463 - 11904: 0xAAE9, + 33464 - 11904: 0xAAE5, + 33465 - 11904: 0xAAE0, + 33466 - 11904: 0xCDBD, + 33467 - 11904: 0xAFEC, + 33468 - 11904: 0xCDBB, + 33469 - 11904: 0xAADE, + 33470 - 11904: 0xAAE8, + 33471 - 11904: 0x8CD0, + 33472 - 11904: 0xCDB3, + 33474 - 11904: 0xCDC2, + 33475 - 11904: 0xCDC4, + 33476 - 11904: 0x8B52, + 33482 - 11904: 0x99B0, + 33487 - 11904: 0x8977, + 33488 - 11904: 0x8F41, + 33489 - 11904: 0xAD62, + 33490 - 11904: 0xAD5C, + 33491 - 11904: 0xAD64, + 33492 - 11904: 0xAD61, + 33493 - 11904: 0xD071, + 33494 - 11904: 0xD074, + 33495 - 11904: 0xAD5D, + 33496 - 11904: 0x99B1, + 33497 - 11904: 0xD06B, + 33499 - 11904: 0xAD56, + 33500 - 11904: 0xAD60, + 33502 - 11904: 0xAD63, + 33503 - 11904: 0xAD65, + 33504 - 11904: 0xD0A2, + 33505 - 11904: 0xD077, + 33506 - 11904: 0x8F49, + 33507 - 11904: 0xAD55, + 33508 - 11904: 0xD0A1, + 33509 - 11904: 0xAD59, + 33510 - 11904: 0xAD57, + 33511 - 11904: 0xAD52, + 33512 - 11904: 0xD06F, + 33514 - 11904: 0xD07E, + 33515 - 11904: 0xD073, + 33516 - 11904: 0xD076, + 33517 - 11904: 0xD0A5, + 33518 - 11904: 0xFA4D, + 33519 - 11904: 0xAD66, + 33520 - 11904: 0xD07D, + 33521 - 11904: 0xAD5E, + 33522 - 11904: 0xD078, + 33523 - 11904: 0xD0A4, + 33524 - 11904: 0xD075, + 33525 - 11904: 0xD079, + 33526 - 11904: 0xD07C, + 33527 - 11904: 0x9DE4, + 33528 - 11904: 0x8CB5, + 33529 - 11904: 0xD06D, + 33530 - 11904: 0xD0A3, + 33531 - 11904: 0xD07B, + 33532 - 11904: 0xFBE9, + 33533 - 11904: 0x9B54, + 33534 - 11904: 0xD06C, + 33535 - 11904: 0x99B2, + 33536 - 11904: 0xD070, + 33537 - 11904: 0xAD5F, + 33538 - 11904: 0xAD5A, + 33539 - 11904: 0xAD53, + 33540 - 11904: 0xAD58, + 33541 - 11904: 0xAD54, + 33542 - 11904: 0xAD67, + 33543 - 11904: 0xD06E, + 33544 - 11904: 0xD3A5, + 33545 - 11904: 0xAD5B, + 33547 - 11904: 0x9E68, + 33548 - 11904: 0xD07A, + 33549 - 11904: 0xCE41, + 33558 - 11904: 0xD3A8, + 33559 - 11904: 0xAFFA, + 33560 - 11904: 0x8F4A, + 33561 - 11904: 0xD376, + 33562 - 11904: 0x8F42, + 33563 - 11904: 0xD3A3, + 33564 - 11904: 0xD37D, + 33565 - 11904: 0x8F51, + 33566 - 11904: 0xD3B2, + 33568 - 11904: 0xD3AA, + 33570 - 11904: 0xD37E, + 33572 - 11904: 0xD3A9, + 33573 - 11904: 0xD378, + 33574 - 11904: 0xD37C, + 33575 - 11904: 0xD3B5, + 33576 - 11904: 0xAFFD, + 33577 - 11904: 0xD3AD, + 33578 - 11904: 0xD3A4, + 33579 - 11904: 0xAFED, + 33580 - 11904: 0xD3B3, + 33581 - 11904: 0xD374, + 33583 - 11904: 0xD3AC, + 33585 - 11904: 0xAFFC, + 33586 - 11904: 0xAFF7, + 33587 - 11904: 0xD373, + 33588 - 11904: 0xAFF5, + 33589 - 11904: 0xAFF4, + 33590 - 11904: 0xAFF9, + 33591 - 11904: 0xD3AB, + 33592 - 11904: 0xAFF1, + 33593 - 11904: 0xAFF8, + 33594 - 11904: 0xD072, + 33595 - 11904: 0xDB5C, + 33596 - 11904: 0xD3A6, + 33597 - 11904: 0x9846, + 33599 - 11904: 0xD37A, + 33600 - 11904: 0xAFFB, + 33601 - 11904: 0xD37B, + 33602 - 11904: 0xD3A1, + 33603 - 11904: 0xAFFE, + 33604 - 11904: 0xD375, + 33605 - 11904: 0xD3AF, + 33607 - 11904: 0xD3AE, + 33608 - 11904: 0xD3B6, + 33609 - 11904: 0xAFF3, + 33610 - 11904: 0xAFF0, + 33611 - 11904: 0xD3B4, + 33612 - 11904: 0xD3B0, + 33613 - 11904: 0xD3A7, + 33614 - 11904: 0xD3A2, + 33615 - 11904: 0xAFF6, + 33616 - 11904: 0xAFF2, + 33617 - 11904: 0xD377, + 33618 - 11904: 0xAFEE, + 33619 - 11904: 0xD3B1, + 33620 - 11904: 0xAFEF, + 33622 - 11904: 0xD379, + 33623 - 11904: 0x99B4, + 33634 - 11904: 0x8EF5, + 33635 - 11904: 0xFD55, + 33638 - 11904: 0x9CCD, + 33647 - 11904: 0x8978, + 33651 - 11904: 0xD75E, + 33652 - 11904: 0xD760, + 33653 - 11904: 0xD765, + 33654 - 11904: 0xD779, + 33655 - 11904: 0xB2FC, + 33656 - 11904: 0xB2F2, + 33658 - 11904: 0xD75D, + 33659 - 11904: 0xB2FD, + 33660 - 11904: 0xB2FE, + 33661 - 11904: 0xD768, + 33662 - 11904: 0xD76F, + 33663 - 11904: 0xD775, + 33665 - 11904: 0xD762, + 33667 - 11904: 0xD769, + 33669 - 11904: 0x8F53, + 33670 - 11904: 0xB340, + 33671 - 11904: 0xD777, + 33672 - 11904: 0xD772, + 33673 - 11904: 0xB2FA, + 33674 - 11904: 0xB2F8, + 33675 - 11904: 0xD76E, + 33676 - 11904: 0xD76A, + 33677 - 11904: 0xD75C, + 33678 - 11904: 0xB2EF, + 33679 - 11904: 0xD761, + 33680 - 11904: 0xD759, + 33681 - 11904: 0x8F6F, + 33682 - 11904: 0xB2F7, + 33683 - 11904: 0xB2F9, + 33684 - 11904: 0xD766, + 33685 - 11904: 0xD763, + 33686 - 11904: 0xB2F4, + 33687 - 11904: 0xD773, + 33688 - 11904: 0xB2F1, + 33689 - 11904: 0xD764, + 33690 - 11904: 0xD77A, + 33691 - 11904: 0xD76C, + 33692 - 11904: 0x8E63, + 33693 - 11904: 0xD76B, + 33694 - 11904: 0xB2F0, + 33696 - 11904: 0xB2FB, + 33698 - 11904: 0xB2F3, + 33699 - 11904: 0xD75A, + 33700 - 11904: 0xD75F, + 33701 - 11904: 0xD770, + 33702 - 11904: 0xD776, + 33703 - 11904: 0xB341, + 33704 - 11904: 0xD75B, + 33705 - 11904: 0xD767, + 33706 - 11904: 0xD76D, + 33707 - 11904: 0xB2F6, + 33708 - 11904: 0x8F56, + 33710 - 11904: 0xD778, + 33711 - 11904: 0xD771, + 33712 - 11904: 0xD774, + 33721 - 11904: 0xFE76, + 33725 - 11904: 0xB2F5, + 33726 - 11904: 0x9FC6, + 33727 - 11904: 0xDB6C, + 33728 - 11904: 0xDB60, + 33729 - 11904: 0xB5D7, + 33730 - 11904: 0xDB7D, + 33731 - 11904: 0xDBA7, + 33732 - 11904: 0xDBAA, + 33733 - 11904: 0xB5D5, + 33734 - 11904: 0xDB68, + 33735 - 11904: 0xDBA3, + 33736 - 11904: 0xDB69, + 33737 - 11904: 0xDB77, + 33738 - 11904: 0xB5E2, + 33739 - 11904: 0xDB73, + 33740 - 11904: 0xB5DF, + 33741 - 11904: 0xFAAC, + 33742 - 11904: 0xDB74, + 33743 - 11904: 0xDB5D, + 33745 - 11904: 0xDBA4, + 33747 - 11904: 0x8F58, + 33748 - 11904: 0xB5E8, + 33749 - 11904: 0xDBA1, + 33750 - 11904: 0xDB75, + 33751 - 11904: 0xDBAC, + 33752 - 11904: 0xDB70, + 33753 - 11904: 0xDFC8, + 33755 - 11904: 0xDBAF, + 33756 - 11904: 0xB5E6, + 33757 - 11904: 0xDB6E, + 33758 - 11904: 0xDB7A, + 33759 - 11904: 0xB5E9, + 33760 - 11904: 0xB5D4, + 33761 - 11904: 0xDB72, + 33762 - 11904: 0xDBAD, + 33763 - 11904: 0xDB6B, + 33764 - 11904: 0xDB64, + 33765 - 11904: 0xDB6F, + 33767 - 11904: 0xDB63, + 33768 - 11904: 0xDB61, + 33769 - 11904: 0xB5D0, + 33770 - 11904: 0xDBA5, + 33771 - 11904: 0xDB6A, + 33772 - 11904: 0xDBA8, + 33773 - 11904: 0x9848, + 33774 - 11904: 0xDBA9, + 33775 - 11904: 0xB5D8, + 33776 - 11904: 0xB5DD, + 33777 - 11904: 0xB5D9, + 33778 - 11904: 0xB5E1, + 33779 - 11904: 0xDB7E, + 33780 - 11904: 0xB5DA, + 33781 - 11904: 0xDB76, + 33782 - 11904: 0xDB66, + 33784 - 11904: 0xB5D2, + 33785 - 11904: 0xDB5E, + 33786 - 11904: 0xDBA2, + 33787 - 11904: 0xDBAB, + 33788 - 11904: 0xDB65, + 33789 - 11904: 0xB5E0, + 33790 - 11904: 0xDBB0, + 33791 - 11904: 0xDB71, + 33793 - 11904: 0xDB6D, + 33795 - 11904: 0xB5D1, + 33796 - 11904: 0xB5E5, + 33797 - 11904: 0x99B7, + 33798 - 11904: 0xDB7C, + 33799 - 11904: 0xB5E7, + 33801 - 11904: 0xDB78, + 33802 - 11904: 0xB5DC, + 33803 - 11904: 0xB5D6, + 33804 - 11904: 0xB5DE, + 33805 - 11904: 0xB5D3, + 33806 - 11904: 0xB5E4, + 33807 - 11904: 0xDB79, + 33808 - 11904: 0xDB67, + 33809 - 11904: 0xDB7B, + 33810 - 11904: 0xDB62, + 33811 - 11904: 0xDBA6, + 33812 - 11904: 0x9665, + 33814 - 11904: 0xFA6C, + 33816 - 11904: 0x9DE7, + 33819 - 11904: 0xDBAE, + 33820 - 11904: 0x9E62, + 33824 - 11904: 0x96CC, + 33825 - 11904: 0x8E67, + 33827 - 11904: 0xDB5F, + 33828 - 11904: 0xFC75, + 33830 - 11904: 0x987E, + 33833 - 11904: 0xDFC7, + 33835 - 11904: 0xDFDD, + 33836 - 11904: 0xB855, + 33837 - 11904: 0xDFCC, + 33838 - 11904: 0xFDB9, + 33839 - 11904: 0xDFCA, + 33840 - 11904: 0xDFB5, + 33841 - 11904: 0xB8A9, + 33842 - 11904: 0xDFC5, + 33843 - 11904: 0xDFD9, + 33844 - 11904: 0xDFC1, + 33845 - 11904: 0xB8B1, + 33846 - 11904: 0xDFD8, + 33847 - 11904: 0xDFBF, + 33848 - 11904: 0xB5E3, + 33849 - 11904: 0xDFCF, + 33850 - 11904: 0xDFC0, + 33851 - 11904: 0xDFD6, + 33852 - 11904: 0xB8B0, + 33853 - 11904: 0xB8A8, + 33854 - 11904: 0x97FC, + 33855 - 11904: 0xDFAA, + 33856 - 11904: 0xDFB2, + 33858 - 11904: 0xDFCB, + 33859 - 11904: 0xDFC3, + 33860 - 11904: 0xDFDC, + 33861 - 11904: 0xDFC6, + 33862 - 11904: 0xB8B6, + 33863 - 11904: 0xDFD7, + 33864 - 11904: 0x98F9, + 33865 - 11904: 0xB8AD, + 33866 - 11904: 0x8F66, + 33867 - 11904: 0xDFC9, + 33868 - 11904: 0xDFD1, + 33869 - 11904: 0xDFB6, + 33870 - 11904: 0xDFD0, + 33872 - 11904: 0xDFE1, + 33873 - 11904: 0xDFB1, + 33874 - 11904: 0xDFD2, + 33875 - 11904: 0x956E, + 33876 - 11904: 0xDFDF, + 33877 - 11904: 0x9245, + 33878 - 11904: 0xDFAB, + 33879 - 11904: 0xB5DB, + 33880 - 11904: 0x8F60, + 33881 - 11904: 0xDFB9, + 33882 - 11904: 0xDFB8, + 33883 - 11904: 0xB8AF, + 33884 - 11904: 0x9ED1, + 33885 - 11904: 0xDFBC, + 33886 - 11904: 0xDFBE, + 33887 - 11904: 0xDFCD, + 33888 - 11904: 0xDFDE, + 33889 - 11904: 0xB8B2, + 33890 - 11904: 0xFECD, + 33891 - 11904: 0xB8B3, + 33892 - 11904: 0x99B9, + 33893 - 11904: 0xDFB0, + 33894 - 11904: 0xB8AB, + 33895 - 11904: 0xDFB4, + 33896 - 11904: 0xDFDA, + 33897 - 11904: 0xB8B4, + 33899 - 11904: 0xB8AC, + 33900 - 11904: 0xB8AE, + 33901 - 11904: 0xB8B5, + 33902 - 11904: 0xDFE0, + 33903 - 11904: 0xDFD3, + 33904 - 11904: 0xDFCE, + 33905 - 11904: 0x8F62, + 33906 - 11904: 0x974C, + 33907 - 11904: 0xDFBB, + 33908 - 11904: 0xDFBA, + 33909 - 11904: 0xB8AA, + 33910 - 11904: 0xDFAC, + 33911 - 11904: 0xB8A7, + 33912 - 11904: 0xDFC4, + 33913 - 11904: 0xDFAD, + 33914 - 11904: 0xDFC2, + 33917 - 11904: 0xDFB7, + 33918 - 11904: 0xDFDB, + 33919 - 11904: 0x91C7, + 33920 - 11904: 0x955F, + 33922 - 11904: 0xB8A6, + 33924 - 11904: 0x87AB, + 33926 - 11904: 0xDFB3, + 33928 - 11904: 0x99BB, + 33933 - 11904: 0xDFAF, + 33934 - 11904: 0xDFD5, + 33935 - 11904: 0xDFAE, + 33936 - 11904: 0xBB60, + 33937 - 11904: 0xE3D3, + 33938 - 11904: 0x8E6D, + 33939 - 11904: 0x8F71, + 33940 - 11904: 0xE3C2, + 33942 - 11904: 0x94CB, + 33943 - 11904: 0xE3AC, + 33944 - 11904: 0xE3CA, + 33945 - 11904: 0xBB58, + 33946 - 11904: 0xE3BB, + 33947 - 11904: 0xE3C5, + 33948 - 11904: 0xBB5B, + 33949 - 11904: 0xE3BE, + 33950 - 11904: 0xBB59, + 33951 - 11904: 0xE3AF, + 33952 - 11904: 0xE3CD, + 33953 - 11904: 0xE3AE, + 33954 - 11904: 0xE3C1, + 33955 - 11904: 0x95B1, + 33956 - 11904: 0xE3AD, + 33959 - 11904: 0xE3BF, + 33960 - 11904: 0xE3C8, + 33961 - 11904: 0xE3C6, + 33962 - 11904: 0xE3BA, + 33963 - 11904: 0xE3B5, + 33964 - 11904: 0xE3B3, + 33965 - 11904: 0x9AF2, + 33966 - 11904: 0xE3B4, + 33967 - 11904: 0xE3C7, + 33968 - 11904: 0xE3D2, + 33969 - 11904: 0xE3BC, + 33970 - 11904: 0xBB5A, + 33972 - 11904: 0xE3B7, + 33974 - 11904: 0xE3CB, + 33976 - 11904: 0xBB5D, + 33977 - 11904: 0xE3B6, + 33978 - 11904: 0xE3B0, + 33979 - 11904: 0xE3C0, + 33980 - 11904: 0xBB61, + 33981 - 11904: 0x96C3, + 33982 - 11904: 0x99BD, + 33983 - 11904: 0xBB55, + 33984 - 11904: 0xBB5E, + 33985 - 11904: 0xE3B8, + 33986 - 11904: 0xE3B2, + 33988 - 11904: 0xBB57, + 33989 - 11904: 0xDFD4, + 33990 - 11904: 0xBB56, + 33991 - 11904: 0xE3C3, + 33993 - 11904: 0xBB54, + 33994 - 11904: 0xBB63, + 33995 - 11904: 0xBB5C, + 33996 - 11904: 0xE3C4, + 33997 - 11904: 0xE3B9, + 33998 - 11904: 0xE3B1, + 33999 - 11904: 0xE3CC, + 34000 - 11904: 0xE3BD, + 34001 - 11904: 0xBB62, + 34002 - 11904: 0xE3D0, + 34003 - 11904: 0xBB5F, + 34004 - 11904: 0xE3CF, + 34006 - 11904: 0xE3C9, + 34007 - 11904: 0xE3CE, + 34010 - 11904: 0xA0CF, + 34011 - 11904: 0xE3D1, + 34014 - 11904: 0x8F6D, + 34017 - 11904: 0x99BE, + 34018 - 11904: 0x8EF4, + 34020 - 11904: 0x8F72, + 34021 - 11904: 0x95E4, + 34023 - 11904: 0xE773, + 34024 - 11904: 0xE774, + 34025 - 11904: 0xE767, + 34026 - 11904: 0xE766, + 34027 - 11904: 0xE762, + 34028 - 11904: 0xBDB4, + 34030 - 11904: 0xBDAC, + 34031 - 11904: 0xE776, + 34032 - 11904: 0xE775, + 34033 - 11904: 0xDFA9, + 34034 - 11904: 0xE75F, + 34035 - 11904: 0xE763, + 34036 - 11904: 0xE75D, + 34038 - 11904: 0xE770, + 34039 - 11904: 0xE761, + 34040 - 11904: 0x99BF, + 34041 - 11904: 0xE777, + 34042 - 11904: 0xE75A, + 34043 - 11904: 0xE758, + 34044 - 11904: 0xE764, + 34045 - 11904: 0xE76E, + 34046 - 11904: 0xE769, + 34047 - 11904: 0xBDB6, + 34048 - 11904: 0xE74F, + 34050 - 11904: 0xE76D, + 34051 - 11904: 0x9244, + 34052 - 11904: 0x87D7, + 34053 - 11904: 0xFBA5, + 34054 - 11904: 0xBDB7, + 34055 - 11904: 0xDFBD, + 34056 - 11904: 0xE75B, + 34057 - 11904: 0xE752, + 34058 - 11904: 0xE755, + 34059 - 11904: 0xE77B, + 34060 - 11904: 0xE75C, + 34061 - 11904: 0xE753, + 34062 - 11904: 0xE751, + 34063 - 11904: 0xE74E, + 34064 - 11904: 0x99C0, + 34065 - 11904: 0xBDB0, + 34066 - 11904: 0xE765, + 34067 - 11904: 0xBDAF, + 34068 - 11904: 0xBDB3, + 34069 - 11904: 0xE760, + 34070 - 11904: 0xE768, + 34071 - 11904: 0xBDA9, + 34072 - 11904: 0xE778, + 34073 - 11904: 0xE77C, + 34074 - 11904: 0xBDAB, + 34076 - 11904: 0xE757, + 34077 - 11904: 0xE76B, + 34078 - 11904: 0xE76F, + 34079 - 11904: 0xE754, + 34080 - 11904: 0xE779, + 34081 - 11904: 0xBDB2, + 34083 - 11904: 0xBDB1, + 34084 - 11904: 0xE74C, + 34085 - 11904: 0xBDB5, + 34086 - 11904: 0xE772, + 34087 - 11904: 0xE756, + 34088 - 11904: 0xE76A, + 34089 - 11904: 0xE750, + 34090 - 11904: 0xE75E, + 34091 - 11904: 0xE759, + 34092 - 11904: 0xBDAD, + 34093 - 11904: 0xBDAE, + 34094 - 11904: 0xE76C, + 34095 - 11904: 0xE77D, + 34096 - 11904: 0xE77A, + 34097 - 11904: 0xE771, + 34099 - 11904: 0xFDB4, + 34100 - 11904: 0x8F77, + 34104 - 11904: 0x99C1, + 34107 - 11904: 0xE74D, + 34109 - 11904: 0xBDAA, + 34110 - 11904: 0xEB49, + 34112 - 11904: 0xEB40, + 34113 - 11904: 0xEB43, + 34114 - 11904: 0xFAB9, + 34115 - 11904: 0xBFBB, + 34116 - 11904: 0xEB45, + 34117 - 11904: 0xEAF9, + 34118 - 11904: 0xEB41, + 34119 - 11904: 0xEB47, + 34120 - 11904: 0xBFB8, + 34121 - 11904: 0xBFBC, + 34122 - 11904: 0xBFB6, + 34123 - 11904: 0x8F40, + 34124 - 11904: 0xFA44, + 34125 - 11904: 0xEAFB, + 34126 - 11904: 0xEB4C, + 34129 - 11904: 0xEB46, + 34130 - 11904: 0x99C2, + 34131 - 11904: 0xEAFC, + 34132 - 11904: 0xEB55, + 34133 - 11904: 0xEB4F, + 34134 - 11904: 0xEAF8, + 34135 - 11904: 0xEE46, + 34136 - 11904: 0xEAFE, + 34137 - 11904: 0xBFB7, + 34138 - 11904: 0x8F5C, + 34139 - 11904: 0xEB4A, + 34141 - 11904: 0xEB54, + 34142 - 11904: 0xBFBF, + 34143 - 11904: 0x8CBD, + 34144 - 11904: 0xEB51, + 34145 - 11904: 0xEAFD, + 34146 - 11904: 0xEB44, + 34147 - 11904: 0xEB48, + 34148 - 11904: 0xEB42, + 34149 - 11904: 0xEB56, + 34150 - 11904: 0xEB53, + 34151 - 11904: 0xEB50, + 34152 - 11904: 0xBFB9, + 34153 - 11904: 0xBFBA, + 34154 - 11904: 0xBFBE, + 34155 - 11904: 0xEAFA, + 34156 - 11904: 0xEB57, + 34157 - 11904: 0xBFBD, + 34158 - 11904: 0xEB4D, + 34159 - 11904: 0x99C4, + 34160 - 11904: 0x99C5, + 34161 - 11904: 0xEB4B, + 34163 - 11904: 0x8F7B, + 34165 - 11904: 0xEB4E, + 34166 - 11904: 0xEE53, + 34167 - 11904: 0xEE40, + 34168 - 11904: 0xEE45, + 34169 - 11904: 0xEE52, + 34170 - 11904: 0xEE44, + 34171 - 11904: 0xEDFB, + 34172 - 11904: 0xEE41, + 34174 - 11904: 0xC1A2, + 34176 - 11904: 0xEDF4, + 34177 - 11904: 0xEE4D, + 34178 - 11904: 0xEE4F, + 34179 - 11904: 0xEDF3, + 34180 - 11904: 0xC1A1, + 34181 - 11904: 0xEE51, + 34182 - 11904: 0xEE49, + 34183 - 11904: 0xC1A8, + 34184 - 11904: 0xEE50, + 34185 - 11904: 0xEE42, + 34186 - 11904: 0xC1AA, + 34187 - 11904: 0xEDF9, + 34188 - 11904: 0xEB52, + 34189 - 11904: 0xEE4A, + 34190 - 11904: 0xEE47, + 34191 - 11904: 0xEDF5, + 34192 - 11904: 0xEE55, + 34193 - 11904: 0xC1A4, + 34195 - 11904: 0x8776, + 34196 - 11904: 0xC1A5, + 34197 - 11904: 0xEDF7, + 34198 - 11904: 0xEE48, + 34199 - 11904: 0x8CB6, + 34200 - 11904: 0xEE54, + 34201 - 11904: 0xEE4B, + 34202 - 11904: 0xEDFD, + 34203 - 11904: 0xC1A7, + 34204 - 11904: 0xC1A3, + 34205 - 11904: 0xEE4C, + 34206 - 11904: 0xEDFE, + 34207 - 11904: 0xEE56, + 34208 - 11904: 0xEDF8, + 34209 - 11904: 0xEE43, + 34210 - 11904: 0xEE4E, + 34211 - 11904: 0xEDFA, + 34212 - 11904: 0xEDFC, + 34214 - 11904: 0xC2CB, + 34215 - 11904: 0xEDF6, + 34216 - 11904: 0xC1A9, + 34217 - 11904: 0xC2C4, + 34218 - 11904: 0xC17E, + 34223 - 11904: 0xC1A6, + 34224 - 11904: 0xC2C8, + 34225 - 11904: 0xF0B3, + 34227 - 11904: 0xF0A9, + 34228 - 11904: 0xF0A4, + 34229 - 11904: 0xF0AA, + 34230 - 11904: 0xF0B4, + 34231 - 11904: 0xF0B8, + 34232 - 11904: 0xF0B7, + 34233 - 11904: 0xC2CA, + 34234 - 11904: 0xC2C9, + 34237 - 11904: 0xF0AB, + 34238 - 11904: 0xF0B9, + 34239 - 11904: 0xF0AE, + 34240 - 11904: 0xF0A6, + 34241 - 11904: 0x8FA3, + 34242 - 11904: 0xF0A8, + 34243 - 11904: 0xF0A7, + 34244 - 11904: 0xF0AD, + 34245 - 11904: 0xF0B2, + 34246 - 11904: 0xF0A5, + 34247 - 11904: 0xF0AC, + 34248 - 11904: 0xF0B1, + 34249 - 11904: 0xC2C7, + 34251 - 11904: 0xF0AF, + 34253 - 11904: 0xC2C5, + 34254 - 11904: 0xF0B0, + 34255 - 11904: 0xC2C3, + 34256 - 11904: 0xC2C6, + 34257 - 11904: 0xF2D5, + 34258 - 11904: 0xF0B5, + 34261 - 11904: 0xC3C2, + 34262 - 11904: 0x8CCE, + 34263 - 11904: 0xF2CD, + 34264 - 11904: 0xF2D1, + 34265 - 11904: 0xF2C9, + 34266 - 11904: 0xF2CC, + 34268 - 11904: 0xF2D4, + 34269 - 11904: 0xC3C0, + 34270 - 11904: 0xF2D9, + 34271 - 11904: 0xF2D2, + 34272 - 11904: 0x99C6, + 34273 - 11904: 0xF2CA, + 34274 - 11904: 0xF2DA, + 34275 - 11904: 0xF2D3, + 34276 - 11904: 0xC3C3, + 34277 - 11904: 0xC3C4, + 34278 - 11904: 0xF2D7, + 34280 - 11904: 0xF2CB, + 34281 - 11904: 0xC3BF, + 34282 - 11904: 0xC3C1, + 34283 - 11904: 0xF2C6, + 34284 - 11904: 0xF2CE, + 34285 - 11904: 0xF2C8, + 34286 - 11904: 0x96CD, + 34287 - 11904: 0xF2D8, + 34288 - 11904: 0xF2D6, + 34289 - 11904: 0xF2C7, + 34290 - 11904: 0xF2CF, + 34294 - 11904: 0xF4BE, + 34295 - 11904: 0xC3C5, + 34296 - 11904: 0xF2D0, + 34297 - 11904: 0xC4A7, + 34298 - 11904: 0xC4A9, + 34299 - 11904: 0xC4A6, + 34300 - 11904: 0x96C7, + 34301 - 11904: 0xF4C3, + 34302 - 11904: 0xF4BB, + 34303 - 11904: 0xF4B9, + 34304 - 11904: 0xF4BD, + 34305 - 11904: 0xF4BA, + 34306 - 11904: 0x8FA5, + 34308 - 11904: 0xF4BF, + 34309 - 11904: 0xF4C1, + 34310 - 11904: 0xC4AA, + 34311 - 11904: 0xC4AC, + 34313 - 11904: 0xF4C0, + 34314 - 11904: 0xC4AD, + 34315 - 11904: 0xC4AB, + 34316 - 11904: 0xF4C2, + 34317 - 11904: 0xFABB, + 34319 - 11904: 0x8C61, + 34320 - 11904: 0x9570, + 34321 - 11904: 0xC4A8, + 34323 - 11904: 0x87AF, + 34324 - 11904: 0x9368, + 34326 - 11904: 0x8F7E, + 34327 - 11904: 0xC4F4, + 34328 - 11904: 0xF5F1, + 34329 - 11904: 0xF5F7, + 34330 - 11904: 0xC4F6, + 34331 - 11904: 0xF4BC, + 34332 - 11904: 0xF5F6, + 34334 - 11904: 0xF5FD, + 34335 - 11904: 0xF5F4, + 34336 - 11904: 0xF5FB, + 34337 - 11904: 0xF5FA, + 34338 - 11904: 0xF4B8, + 34339 - 11904: 0xF5F5, + 34340 - 11904: 0xF0B6, + 34341 - 11904: 0xF5FE, + 34342 - 11904: 0xF5F3, + 34343 - 11904: 0xF5F8, + 34344 - 11904: 0x8FAA, + 34345 - 11904: 0xF5FC, + 34346 - 11904: 0xF5F2, + 34348 - 11904: 0xF74A, + 34349 - 11904: 0xC4F5, + 34350 - 11904: 0xF5F9, + 34351 - 11904: 0xA050, + 34353 - 11904: 0xF7F4, + 34354 - 11904: 0xF74B, + 34355 - 11904: 0xF749, + 34356 - 11904: 0xF747, + 34357 - 11904: 0xF748, + 34358 - 11904: 0xF74C, + 34360 - 11904: 0xC5D9, + 34361 - 11904: 0xF7F2, + 34362 - 11904: 0xF7F0, + 34363 - 11904: 0xF7F5, + 34364 - 11904: 0xF7F3, + 34366 - 11904: 0xF7F6, + 34367 - 11904: 0xC5DA, + 34368 - 11904: 0xF7F1, + 34370 - 11904: 0x90D3, + 34371 - 11904: 0xF8BC, + 34373 - 11904: 0x9556, + 34374 - 11904: 0xF945, + 34375 - 11904: 0xF946, + 34376 - 11904: 0xF947, + 34379 - 11904: 0xF9C7, + 34380 - 11904: 0xF9BD, + 34381 - 11904: 0xCA4F, + 34382 - 11904: 0xAAEA, + 34384 - 11904: 0xAD68, + 34386 - 11904: 0xD3B8, + 34387 - 11904: 0xD3B7, + 34388 - 11904: 0xB040, + 34389 - 11904: 0xB342, + 34390 - 11904: 0xD77C, + 34393 - 11904: 0xD77B, + 34395 - 11904: 0xB5EA, + 34396 - 11904: 0xB8B8, + 34398 - 11904: 0xB8B7, + 34399 - 11904: 0xB8B9, + 34401 - 11904: 0xE3D4, + 34402 - 11904: 0xE77E, + 34403 - 11904: 0xEB58, + 34404 - 11904: 0xEB5A, + 34405 - 11904: 0xEB59, + 34407 - 11904: 0xC1AB, + 34408 - 11904: 0xEE57, + 34409 - 11904: 0xF0BA, + 34410 - 11904: 0xF9A5, + 34411 - 11904: 0xA6E4, + 34412 - 11904: 0x8FB8, + 34413 - 11904: 0xCDC9, + 34414 - 11904: 0xCDCA, + 34415 - 11904: 0xCDC8, + 34416 - 11904: 0xCDC7, + 34417 - 11904: 0xAAEB, + 34418 - 11904: 0x99C8, + 34419 - 11904: 0xD0A9, + 34420 - 11904: 0xD0A7, + 34423 - 11904: 0xD0A6, + 34425 - 11904: 0xAD69, + 34426 - 11904: 0xAD6B, + 34427 - 11904: 0xAD6A, + 34428 - 11904: 0xD0A8, + 34430 - 11904: 0x8FAF, + 34437 - 11904: 0xD3C4, + 34438 - 11904: 0xD3C1, + 34439 - 11904: 0xD3BF, + 34442 - 11904: 0xB041, + 34443 - 11904: 0xD3C2, + 34444 - 11904: 0xB046, + 34445 - 11904: 0xD3BC, + 34446 - 11904: 0xD3CB, + 34448 - 11904: 0xD3CD, + 34449 - 11904: 0xD3BD, + 34450 - 11904: 0x99C9, + 34451 - 11904: 0xB043, + 34452 - 11904: 0xD3CE, + 34453 - 11904: 0xD3C9, + 34454 - 11904: 0xD3BB, + 34455 - 11904: 0xD3C0, + 34456 - 11904: 0xD3CA, + 34457 - 11904: 0xD3C6, + 34458 - 11904: 0xD3C3, + 34460 - 11904: 0xB048, + 34461 - 11904: 0xD3CC, + 34462 - 11904: 0xD3BE, + 34464 - 11904: 0x9579, + 34465 - 11904: 0xD3C7, + 34466 - 11904: 0xD3B9, + 34467 - 11904: 0xB047, + 34468 - 11904: 0xB044, + 34469 - 11904: 0xD3C5, + 34471 - 11904: 0xD3C8, + 34472 - 11904: 0xD3BA, + 34473 - 11904: 0xB045, + 34474 - 11904: 0xB042, + 34477 - 11904: 0x9F49, + 34479 - 11904: 0xB34C, + 34480 - 11904: 0xD7A5, + 34481 - 11904: 0xB34B, + 34482 - 11904: 0x99CA, + 34483 - 11904: 0xD7A8, + 34484 - 11904: 0xD7AB, + 34485 - 11904: 0xB348, + 34486 - 11904: 0xB346, + 34487 - 11904: 0xD77E, + 34488 - 11904: 0xD7A9, + 34489 - 11904: 0xD7A7, + 34490 - 11904: 0xD7A4, + 34491 - 11904: 0xD7AC, + 34492 - 11904: 0xD7AD, + 34493 - 11904: 0xD7AF, + 34494 - 11904: 0xD7B0, + 34495 - 11904: 0xD77D, + 34496 - 11904: 0xB345, + 34497 - 11904: 0xD7A2, + 34498 - 11904: 0xD7A1, + 34499 - 11904: 0xD7AE, + 34500 - 11904: 0xB347, + 34501 - 11904: 0xD7A3, + 34502 - 11904: 0xB349, + 34503 - 11904: 0xB344, + 34504 - 11904: 0xD7A6, + 34505 - 11904: 0xB34D, + 34507 - 11904: 0xB34A, + 34508 - 11904: 0xD7AA, + 34512 - 11904: 0xB5F1, + 34513 - 11904: 0xDBBF, + 34515 - 11904: 0xDBB4, + 34516 - 11904: 0xB5EE, + 34518 - 11904: 0xDFE7, + 34519 - 11904: 0xDBBD, + 34520 - 11904: 0xDBB1, + 34521 - 11904: 0xB5EC, + 34522 - 11904: 0xDBB6, + 34523 - 11904: 0xB5EF, + 34524 - 11904: 0xDBBA, + 34525 - 11904: 0xDBB8, + 34526 - 11904: 0xB5F2, + 34527 - 11904: 0xB5EB, + 34530 - 11904: 0xDBB2, + 34531 - 11904: 0xDBB5, + 34532 - 11904: 0xB5F0, + 34534 - 11904: 0xDBB3, + 34536 - 11904: 0xDBBE, + 34537 - 11904: 0xDBBC, + 34538 - 11904: 0xDBB7, + 34539 - 11904: 0xDBB9, + 34540 - 11904: 0xDBBB, + 34541 - 11904: 0xB5ED, + 34543 - 11904: 0x99CB, + 34549 - 11904: 0xDFE8, + 34550 - 11904: 0xDFEE, + 34551 - 11904: 0xDFE4, + 34552 - 11904: 0xDFEA, + 34553 - 11904: 0xB8BA, + 34554 - 11904: 0xDFE6, + 34555 - 11904: 0xB8C0, + 34558 - 11904: 0xB8BF, + 34560 - 11904: 0xB8BE, + 34561 - 11904: 0xDFED, + 34562 - 11904: 0xB8C1, + 34563 - 11904: 0xB8C2, + 34564 - 11904: 0xDFE3, + 34565 - 11904: 0xDFF0, + 34566 - 11904: 0xB8C3, + 34567 - 11904: 0xB8BD, + 34568 - 11904: 0xB8BC, + 34569 - 11904: 0xDFEC, + 34570 - 11904: 0xB8C4, + 34571 - 11904: 0xDFE2, + 34572 - 11904: 0xDFE5, + 34573 - 11904: 0xDFEF, + 34574 - 11904: 0xDFEB, + 34577 - 11904: 0xE3F4, + 34578 - 11904: 0xE3E9, + 34579 - 11904: 0xB8BB, + 34584 - 11904: 0xBB6A, + 34585 - 11904: 0xE3DD, + 34586 - 11904: 0xE3F2, + 34587 - 11904: 0xE3DE, + 34588 - 11904: 0xBB65, + 34590 - 11904: 0xE3DB, + 34592 - 11904: 0xE3E4, + 34593 - 11904: 0xE3DC, + 34594 - 11904: 0xBB67, + 34595 - 11904: 0xE3D6, + 34596 - 11904: 0xE3F1, + 34597 - 11904: 0xBB68, + 34598 - 11904: 0xE3EE, + 34599 - 11904: 0xE3EF, + 34600 - 11904: 0xE3D7, + 34601 - 11904: 0xBB6D, + 34602 - 11904: 0xE3E6, + 34604 - 11904: 0xE3E0, + 34605 - 11904: 0xE3E7, + 34606 - 11904: 0xE3DA, + 34608 - 11904: 0xE3F3, + 34609 - 11904: 0xE3EB, + 34610 - 11904: 0xE3E5, + 34611 - 11904: 0xE3D5, + 34612 - 11904: 0xBB69, + 34613 - 11904: 0xE3EC, + 34615 - 11904: 0xBB6C, + 34616 - 11904: 0xE3F0, + 34618 - 11904: 0xE3EA, + 34619 - 11904: 0xBB66, + 34620 - 11904: 0xE3E8, + 34622 - 11904: 0xE3E2, + 34623 - 11904: 0xBB64, + 34624 - 11904: 0xE3D9, + 34625 - 11904: 0xE3E1, + 34626 - 11904: 0xE3ED, + 34627 - 11904: 0xE3DF, + 34630 - 11904: 0xE3E3, + 34636 - 11904: 0xBDC1, + 34637 - 11904: 0xDFE9, + 34638 - 11904: 0xE7B2, + 34639 - 11904: 0xE7BB, + 34640 - 11904: 0xE7B1, + 34641 - 11904: 0xE7AD, + 34642 - 11904: 0xE7AA, + 34643 - 11904: 0xBDC2, + 34644 - 11904: 0xE7A8, + 34645 - 11904: 0xBB6B, + 34646 - 11904: 0xE7A1, + 34647 - 11904: 0xBDC0, + 34648 - 11904: 0xE7A7, + 34649 - 11904: 0xBDBF, + 34650 - 11904: 0xE7AC, + 34651 - 11904: 0xE7A9, + 34652 - 11904: 0xE7B9, + 34653 - 11904: 0xE7B4, + 34654 - 11904: 0xE7AE, + 34655 - 11904: 0xE7B3, + 34656 - 11904: 0xBDBB, + 34657 - 11904: 0xE7AB, + 34658 - 11904: 0xE7BE, + 34659 - 11904: 0xE7A2, + 34660 - 11904: 0xE7A3, + 34661 - 11904: 0xE7BA, + 34662 - 11904: 0xBDBC, + 34663 - 11904: 0xE7BF, + 34664 - 11904: 0xBDBE, + 34665 - 11904: 0xE7C0, + 34666 - 11904: 0xE7B0, + 34667 - 11904: 0xE3D8, + 34668 - 11904: 0xE7B6, + 34669 - 11904: 0xE7AF, + 34670 - 11904: 0xE7B8, + 34671 - 11904: 0xE7B5, + 34672 - 11904: 0x9DD5, + 34673 - 11904: 0x8FB0, + 34675 - 11904: 0xE7A6, + 34676 - 11904: 0xBDB9, + 34677 - 11904: 0xE7BD, + 34678 - 11904: 0xBDBA, + 34679 - 11904: 0xE7A4, + 34680 - 11904: 0xBDBD, + 34681 - 11904: 0xEB64, + 34682 - 11904: 0xE7B7, + 34683 - 11904: 0xE7BC, + 34685 - 11904: 0xFA7A, + 34689 - 11904: 0xEB61, + 34690 - 11904: 0xBDB8, + 34691 - 11904: 0xBFC0, + 34692 - 11904: 0xEB6B, + 34693 - 11904: 0xEB67, + 34694 - 11904: 0x9E5F, + 34695 - 11904: 0xEB65, + 34696 - 11904: 0xEB60, + 34697 - 11904: 0xEB6F, + 34699 - 11904: 0x99CD, + 34700 - 11904: 0xA0C9, + 34701 - 11904: 0xBFC4, + 34703 - 11904: 0xEB5C, + 34704 - 11904: 0xEB68, + 34705 - 11904: 0xEB69, + 34706 - 11904: 0xEB5F, + 34707 - 11904: 0xEB5E, + 34708 - 11904: 0xEB6C, + 34710 - 11904: 0xEB62, + 34711 - 11904: 0xEB5D, + 34712 - 11904: 0xEB63, + 34714 - 11904: 0xEB6E, + 34715 - 11904: 0xEB5B, + 34716 - 11904: 0xEB6D, + 34717 - 11904: 0xEB6A, + 34718 - 11904: 0xBFC2, + 34719 - 11904: 0xBFC1, + 34722 - 11904: 0xBFC3, + 34723 - 11904: 0xEB66, + 34724 - 11904: 0xF0CB, + 34725 - 11904: 0x9ADB, + 34729 - 11904: 0xA0C6, + 34730 - 11904: 0xEE59, + 34731 - 11904: 0xC1B1, + 34732 - 11904: 0xEE5D, + 34733 - 11904: 0xEE5A, + 34734 - 11904: 0xEE61, + 34735 - 11904: 0xEE67, + 34736 - 11904: 0xEE5C, + 34737 - 11904: 0x8FB4, + 34738 - 11904: 0xEE70, + 34739 - 11904: 0xC1AE, + 34740 - 11904: 0xEE6A, + 34741 - 11904: 0xEE5F, + 34742 - 11904: 0xEE6B, + 34743 - 11904: 0xEE66, + 34744 - 11904: 0xEE6D, + 34745 - 11904: 0xEE5E, + 34746 - 11904: 0xC1B3, + 34747 - 11904: 0xC1B2, + 34748 - 11904: 0xEE60, + 34749 - 11904: 0xEE6E, + 34750 - 11904: 0xEE58, + 34751 - 11904: 0xEE6C, + 34752 - 11904: 0xC1AC, + 34753 - 11904: 0xA0D7, + 34754 - 11904: 0xEE64, + 34755 - 11904: 0xEE63, + 34756 - 11904: 0xEE68, + 34757 - 11904: 0xEE5B, + 34758 - 11904: 0xC1B0, + 34760 - 11904: 0xC1B4, + 34761 - 11904: 0xEE62, + 34762 - 11904: 0xEE69, + 34763 - 11904: 0xC1B5, + 34764 - 11904: 0xEE65, + 34766 - 11904: 0xA0C7, + 34769 - 11904: 0xC1AD, + 34770 - 11904: 0xC1AF, + 34771 - 11904: 0xF0C7, + 34772 - 11904: 0xF0C5, + 34774 - 11904: 0xA043, + 34775 - 11904: 0xF0CC, + 34776 - 11904: 0xF0C9, + 34777 - 11904: 0xF0CD, + 34778 - 11904: 0x8FB5, + 34779 - 11904: 0xF0BE, + 34780 - 11904: 0xF0C6, + 34781 - 11904: 0xF0D1, + 34782 - 11904: 0xEE6F, + 34783 - 11904: 0xF0C2, + 34784 - 11904: 0xC2CF, + 34785 - 11904: 0xE7A5, + 34786 - 11904: 0xF0BD, + 34787 - 11904: 0xF0CA, + 34788 - 11904: 0xF0C4, + 34789 - 11904: 0xF0C1, + 34790 - 11904: 0xF0BC, + 34791 - 11904: 0xF0BB, + 34792 - 11904: 0xF0D0, + 34794 - 11904: 0xF0C0, + 34795 - 11904: 0xF0BF, + 34796 - 11904: 0xC2CD, + 34797 - 11904: 0xF0C8, + 34798 - 11904: 0x8FB2, + 34799 - 11904: 0xC2CC, + 34802 - 11904: 0xC2CE, + 34803 - 11904: 0xF0C3, + 34804 - 11904: 0xF0CF, + 34805 - 11904: 0xA061, + 34806 - 11904: 0xF2DE, + 34807 - 11904: 0xF2DF, + 34809 - 11904: 0xC3C9, + 34810 - 11904: 0xF2DC, + 34811 - 11904: 0xC3C6, + 34812 - 11904: 0xF2E4, + 34814 - 11904: 0xC3CA, + 34815 - 11904: 0xF2E6, + 34816 - 11904: 0xF2DB, + 34817 - 11904: 0xF0CE, + 34818 - 11904: 0xF2E8, + 34819 - 11904: 0xF2DD, + 34820 - 11904: 0x9E5E, + 34821 - 11904: 0xC3C7, + 34822 - 11904: 0xF2E3, + 34824 - 11904: 0xF2E5, + 34825 - 11904: 0xF2E0, + 34826 - 11904: 0xF2E7, + 34827 - 11904: 0xF2E2, + 34828 - 11904: 0xF2E1, + 34829 - 11904: 0xC3C8, + 34831 - 11904: 0xA063, + 34832 - 11904: 0xF4C5, + 34833 - 11904: 0xF4C6, + 34835 - 11904: 0xF4C8, + 34836 - 11904: 0xC4AE, + 34837 - 11904: 0xC4AF, + 34838 - 11904: 0xF4C9, + 34839 - 11904: 0xF4C7, + 34840 - 11904: 0x9FE8, + 34841 - 11904: 0xF4C4, + 34843 - 11904: 0xF642, + 34844 - 11904: 0xF645, + 34845 - 11904: 0xF641, + 34847 - 11904: 0xC4FA, + 34848 - 11904: 0xF643, + 34849 - 11904: 0xC4F9, + 34850 - 11904: 0xC4F8, + 34851 - 11904: 0xC4F7, + 34852 - 11904: 0xF644, + 34853 - 11904: 0xF751, + 34854 - 11904: 0xF74F, + 34855 - 11904: 0x9CB2, + 34856 - 11904: 0xF74E, + 34857 - 11904: 0xF640, + 34858 - 11904: 0xF750, + 34859 - 11904: 0xF646, + 34860 - 11904: 0xF74D, + 34861 - 11904: 0x957C, + 34862 - 11904: 0xF7F9, + 34863 - 11904: 0xF7D7, + 34864 - 11904: 0xF7F7, + 34865 - 11904: 0xC5DB, + 34866 - 11904: 0xF7F8, + 34867 - 11904: 0xF7FA, + 34869 - 11904: 0xF8BF, + 34870 - 11904: 0xC5FA, + 34871 - 11904: 0xF8BE, + 34872 - 11904: 0xF8BD, + 34873 - 11904: 0xC5FB, + 34875 - 11904: 0xC65A, + 34876 - 11904: 0xF96E, + 34877 - 11904: 0xF9A7, + 34878 - 11904: 0xF9A6, + 34879 - 11904: 0xF9A8, + 34880 - 11904: 0xA6E5, + 34881 - 11904: 0xD0AA, + 34882 - 11904: 0x9FC7, + 34883 - 11904: 0xD3CF, + 34884 - 11904: 0xD3D0, + 34885 - 11904: 0x8FBB, + 34886 - 11904: 0x8FBC, + 34888 - 11904: 0xDBC0, + 34890 - 11904: 0xF647, + 34891 - 11904: 0xF8C0, + 34892 - 11904: 0xA6E6, + 34893 - 11904: 0xAD6C, + 34894 - 11904: 0xD0AB, + 34895 - 11904: 0x8FEC, + 34898 - 11904: 0xD7B1, + 34899 - 11904: 0xB34E, + 34901 - 11904: 0xDBC2, + 34902 - 11904: 0xDBC1, + 34903 - 11904: 0xB5F3, + 34905 - 11904: 0xB8C5, + 34906 - 11904: 0xE7C1, + 34907 - 11904: 0xBDC3, + 34909 - 11904: 0xBDC4, + 34910 - 11904: 0x8FC0, + 34912 - 11904: 0x936A, + 34913 - 11904: 0xBFC5, + 34914 - 11904: 0xC5FC, + 34915 - 11904: 0xA6E7, + 34916 - 11904: 0x8BE4, + 34917 - 11904: 0x9C7C, + 34919 - 11904: 0xD0AC, + 34920 - 11904: 0xAAED, + 34921 - 11904: 0xD0AE, + 34922 - 11904: 0xD0AD, + 34923 - 11904: 0xAD6D, + 34925 - 11904: 0xD3D1, + 34926 - 11904: 0x95A1, + 34927 - 11904: 0xD3D8, + 34928 - 11904: 0xB049, + 34929 - 11904: 0xD3D6, + 34930 - 11904: 0xD3D4, + 34932 - 11904: 0xD3DB, + 34933 - 11904: 0xD3D2, + 34934 - 11904: 0xD3D3, + 34935 - 11904: 0xB04A, + 34937 - 11904: 0xB04E, + 34940 - 11904: 0xD3DC, + 34941 - 11904: 0xB04D, + 34942 - 11904: 0xD3DA, + 34943 - 11904: 0xD3D7, + 34944 - 11904: 0xD3D5, + 34945 - 11904: 0xB04B, + 34946 - 11904: 0xB04C, + 34947 - 11904: 0xD3D9, + 34948 - 11904: 0xFEEC, + 34951 - 11904: 0x95A3, + 34952 - 11904: 0xB350, + 34953 - 11904: 0xD7B2, + 34955 - 11904: 0xB355, + 34956 - 11904: 0xD7C2, + 34957 - 11904: 0xB354, + 34958 - 11904: 0xD7C4, + 34959 - 11904: 0x8C45, + 34960 - 11904: 0x8CB8, + 34961 - 11904: 0xD7B8, + 34962 - 11904: 0xB352, + 34963 - 11904: 0xD7C3, + 34965 - 11904: 0xD7B3, + 34966 - 11904: 0xB353, + 34967 - 11904: 0xD7BF, + 34968 - 11904: 0xD7BB, + 34969 - 11904: 0xD7BD, + 34970 - 11904: 0xD7B7, + 34971 - 11904: 0xD7BE, + 34972 - 11904: 0x8FC1, + 34973 - 11904: 0x87B7, + 34974 - 11904: 0xB34F, + 34975 - 11904: 0xD7BA, + 34976 - 11904: 0xA052, + 34977 - 11904: 0xD7B9, + 34978 - 11904: 0xD7B5, + 34980 - 11904: 0xD7C0, + 34983 - 11904: 0xD7BC, + 34984 - 11904: 0xD7B4, + 34986 - 11904: 0xD7B6, + 34987 - 11904: 0xB351, + 34988 - 11904: 0xD7C1, + 34990 - 11904: 0x99D0, + 34993 - 11904: 0xB5F6, + 34994 - 11904: 0xDBCD, + 34996 - 11904: 0x8FC3, + 34997 - 11904: 0x8FC4, + 34998 - 11904: 0xDBC9, + 34999 - 11904: 0xDBCB, + 35000 - 11904: 0xDBC6, + 35001 - 11904: 0xDBC5, + 35002 - 11904: 0xDBC3, + 35004 - 11904: 0xDBCA, + 35005 - 11904: 0xDBCC, + 35006 - 11904: 0xDBC8, + 35007 - 11904: 0x95A4, + 35008 - 11904: 0xDBC7, + 35009 - 11904: 0xB5F4, + 35010 - 11904: 0xB5F5, + 35013 - 11904: 0x8FC6, + 35015 - 11904: 0x9E60, + 35017 - 11904: 0xDBCF, + 35018 - 11904: 0xB8CD, + 35019 - 11904: 0xDFF2, + 35020 - 11904: 0xDFF8, + 35021 - 11904: 0xDFF3, + 35022 - 11904: 0xDFF4, + 35023 - 11904: 0xF9D8, + 35024 - 11904: 0xDFF9, + 35026 - 11904: 0xB8CF, + 35028 - 11904: 0xB8C7, + 35029 - 11904: 0xB8CE, + 35030 - 11904: 0xDFF1, + 35031 - 11904: 0xDBC4, + 35032 - 11904: 0xB8CA, + 35033 - 11904: 0xB8C8, + 35034 - 11904: 0xDFF7, + 35035 - 11904: 0xDFF6, + 35036 - 11904: 0xB8C9, + 35037 - 11904: 0xB8CB, + 35038 - 11904: 0xDFF5, + 35039 - 11904: 0xB8C6, + 35041 - 11904: 0xB8CC, + 35046 - 11904: 0x95A5, + 35047 - 11904: 0xE3F6, + 35048 - 11904: 0xBB74, + 35051 - 11904: 0xE442, + 35052 - 11904: 0xE441, + 35054 - 11904: 0xE3FB, + 35055 - 11904: 0xBB76, + 35056 - 11904: 0xE440, + 35057 - 11904: 0xE3F7, + 35058 - 11904: 0xE3F8, + 35059 - 11904: 0xBB6E, + 35060 - 11904: 0xBB70, + 35061 - 11904: 0x9CB3, + 35062 - 11904: 0xE3FD, + 35063 - 11904: 0xE3F5, + 35064 - 11904: 0xBB72, + 35065 - 11904: 0xBB71, + 35066 - 11904: 0xE3F9, + 35067 - 11904: 0xE3FE, + 35068 - 11904: 0xE3FC, + 35069 - 11904: 0xBB73, + 35070 - 11904: 0xE3FA, + 35071 - 11904: 0x99D1, + 35072 - 11904: 0xFEF1, + 35073 - 11904: 0xDBCE, + 35074 - 11904: 0xBB6F, + 35077 - 11904: 0xE7C2, + 35078 - 11904: 0xE7C9, + 35079 - 11904: 0xBDC6, + 35081 - 11904: 0xE7CD, + 35082 - 11904: 0xBDCA, + 35083 - 11904: 0xE7C5, + 35084 - 11904: 0xE7C3, + 35086 - 11904: 0xE7CC, + 35088 - 11904: 0xBDC5, + 35089 - 11904: 0xE7CB, + 35090 - 11904: 0xBDC7, + 35091 - 11904: 0xBDC8, + 35092 - 11904: 0xE7C4, + 35093 - 11904: 0xBDC9, + 35094 - 11904: 0xE7CA, + 35095 - 11904: 0xE7C6, + 35096 - 11904: 0xE7C7, + 35097 - 11904: 0xE7C8, + 35098 - 11904: 0xBB75, + 35102 - 11904: 0xEB70, + 35103 - 11904: 0xEB7C, + 35105 - 11904: 0xBFCA, + 35106 - 11904: 0xEB77, + 35107 - 11904: 0xEB79, + 35108 - 11904: 0x99D2, + 35109 - 11904: 0xBFC8, + 35110 - 11904: 0xEB71, + 35111 - 11904: 0xEB75, + 35113 - 11904: 0xEB78, + 35114 - 11904: 0xBFC6, + 35115 - 11904: 0xBFC9, + 35116 - 11904: 0xEB7B, + 35117 - 11904: 0xEB73, + 35118 - 11904: 0xEB74, + 35119 - 11904: 0xEB7A, + 35120 - 11904: 0xEB72, + 35121 - 11904: 0xEB76, + 35122 - 11904: 0xBFC7, + 35123 - 11904: 0xEE72, + 35125 - 11904: 0xEE71, + 35126 - 11904: 0xC1B7, + 35127 - 11904: 0xEE77, + 35128 - 11904: 0xC1B9, + 35131 - 11904: 0xC1B6, + 35132 - 11904: 0xEE73, + 35133 - 11904: 0xC1BA, + 35134 - 11904: 0xEE74, + 35137 - 11904: 0xEE75, + 35138 - 11904: 0xEE78, + 35139 - 11904: 0x9CC2, + 35140 - 11904: 0xC1B8, + 35142 - 11904: 0xF0D6, + 35143 - 11904: 0x99D3, + 35145 - 11904: 0xF0D9, + 35147 - 11904: 0xF0D3, + 35148 - 11904: 0xF0D5, + 35149 - 11904: 0x95A7, + 35151 - 11904: 0xF0D4, + 35152 - 11904: 0xF0D7, + 35153 - 11904: 0xF0D8, + 35154 - 11904: 0xEE76, + 35155 - 11904: 0xF0D2, + 35156 - 11904: 0x95A9, + 35158 - 11904: 0xC3CD, + 35159 - 11904: 0xF2EC, + 35160 - 11904: 0xF2EF, + 35161 - 11904: 0xF2F1, + 35162 - 11904: 0xF2EA, + 35163 - 11904: 0xF2EB, + 35164 - 11904: 0xF2EE, + 35165 - 11904: 0xF2F0, + 35166 - 11904: 0xC3CE, + 35167 - 11904: 0xC3CC, + 35168 - 11904: 0xC3CB, + 35169 - 11904: 0xF2ED, + 35170 - 11904: 0xF2E9, + 35171 - 11904: 0xF4CA, + 35172 - 11904: 0xC4B0, + 35173 - 11904: 0x95A6, + 35174 - 11904: 0xF4CB, + 35177 - 11904: 0xF649, + 35178 - 11904: 0xC4FB, + 35179 - 11904: 0xF64B, + 35180 - 11904: 0xC4FC, + 35181 - 11904: 0xF648, + 35182 - 11904: 0xF64A, + 35183 - 11904: 0xC5A8, + 35185 - 11904: 0xF752, + 35186 - 11904: 0xC5A7, + 35187 - 11904: 0xF7FD, + 35188 - 11904: 0xF7FC, + 35190 - 11904: 0xF7FB, + 35191 - 11904: 0x9C5D, + 35193 - 11904: 0xF948, + 35194 - 11904: 0xF949, + 35195 - 11904: 0xF94B, + 35196 - 11904: 0xF94A, + 35198 - 11904: 0xCA50, + 35199 - 11904: 0xA6E8, + 35200 - 11904: 0x98E2, + 35201 - 11904: 0xAD6E, + 35202 - 11904: 0xD7C5, + 35203 - 11904: 0xB5F7, + 35205 - 11904: 0xDFFA, + 35206 - 11904: 0xC2D0, + 35207 - 11904: 0x8FC9, + 35208 - 11904: 0xF2F2, + 35209 - 11904: 0xA0C2, + 35210 - 11904: 0x8FCA, + 35211 - 11904: 0xA8A3, + 35215 - 11904: 0xB357, + 35217 - 11904: 0x99D4, + 35219 - 11904: 0xB356, + 35220 - 11904: 0xA0B9, + 35221 - 11904: 0xDBD0, + 35222 - 11904: 0xB5F8, + 35223 - 11904: 0xDBD2, + 35224 - 11904: 0xDBD1, + 35227 - 11904: 0xDFFB, + 35228 - 11904: 0xB8D0, + 35229 - 11904: 0xE443, + 35230 - 11904: 0xE446, + 35231 - 11904: 0xE445, + 35233 - 11904: 0xE444, + 35234 - 11904: 0xE7CE, + 35235 - 11904: 0xE7D0, + 35236 - 11904: 0xE7CF, + 35237 - 11904: 0x9B58, + 35238 - 11904: 0xBFCC, + 35239 - 11904: 0x8FCD, + 35241 - 11904: 0xA0D4, + 35242 - 11904: 0xBFCB, + 35244 - 11904: 0xC1BB, + 35245 - 11904: 0xEE79, + 35246 - 11904: 0xEE7B, + 35247 - 11904: 0xEE7A, + 35250 - 11904: 0xC2D1, + 35254 - 11904: 0xF2F4, + 35255 - 11904: 0xF2F3, + 35257 - 11904: 0xF4CC, + 35258 - 11904: 0xC4B1, + 35260 - 11904: 0x8FCE, + 35261 - 11904: 0xC4FD, + 35262 - 11904: 0xF754, + 35263 - 11904: 0xF753, + 35264 - 11904: 0xC65B, + 35265 - 11904: 0x8BE5, + 35270 - 11904: 0x8979, + 35282 - 11904: 0xA8A4, + 35283 - 11904: 0xD0AF, + 35284 - 11904: 0xAD6F, + 35285 - 11904: 0xD7C8, + 35286 - 11904: 0xD7C6, + 35289 - 11904: 0xD7C7, + 35290 - 11904: 0xDBD4, + 35291 - 11904: 0xDBD5, + 35292 - 11904: 0xE043, + 35293 - 11904: 0xDBD3, + 35295 - 11904: 0xDFFC, + 35296 - 11904: 0xE041, + 35297 - 11904: 0xE040, + 35298 - 11904: 0xE042, + 35299 - 11904: 0xB8D1, + 35300 - 11904: 0xDFFE, + 35301 - 11904: 0xDFFD, + 35302 - 11904: 0xE044, + 35303 - 11904: 0x8FD0, + 35304 - 11904: 0xE449, + 35305 - 11904: 0xE447, + 35307 - 11904: 0xE448, + 35308 - 11904: 0xE7D3, + 35309 - 11904: 0xE7D1, + 35312 - 11904: 0xE7D2, + 35313 - 11904: 0xEB7D, + 35314 - 11904: 0xEE7C, + 35315 - 11904: 0xEE7D, + 35316 - 11904: 0xC2D2, + 35318 - 11904: 0xF2F5, + 35319 - 11904: 0xF4CD, + 35320 - 11904: 0xC4B2, + 35322 - 11904: 0xF64C, + 35323 - 11904: 0xF755, + 35324 - 11904: 0xC5A9, + 35326 - 11904: 0xF7FE, + 35327 - 11904: 0xF94C, + 35328 - 11904: 0xA8A5, + 35330 - 11904: 0xAD71, + 35331 - 11904: 0xAD72, + 35332 - 11904: 0xD0B0, + 35335 - 11904: 0xD0B1, + 35336 - 11904: 0xAD70, + 35338 - 11904: 0xB054, + 35340 - 11904: 0xB052, + 35342 - 11904: 0xB051, + 35343 - 11904: 0xB058, + 35344 - 11904: 0xB050, + 35345 - 11904: 0xB059, + 35346 - 11904: 0xD3DD, + 35347 - 11904: 0xB056, + 35349 - 11904: 0xB053, + 35350 - 11904: 0xB057, + 35351 - 11904: 0xB055, + 35352 - 11904: 0xB04F, + 35355 - 11904: 0xB35F, + 35356 - 11904: 0x95B6, + 35357 - 11904: 0xB359, + 35358 - 11904: 0xD7CC, + 35359 - 11904: 0xB35E, + 35362 - 11904: 0xB360, + 35363 - 11904: 0xB35A, + 35365 - 11904: 0xB35B, + 35367 - 11904: 0xD7CA, + 35369 - 11904: 0x99D6, + 35370 - 11904: 0xB358, + 35371 - 11904: 0x95E5, + 35372 - 11904: 0xD7CB, + 35373 - 11904: 0xB35D, + 35376 - 11904: 0xD7C9, + 35377 - 11904: 0xB35C, + 35380 - 11904: 0xB644, + 35382 - 11904: 0xB646, + 35384 - 11904: 0x99D7, + 35385 - 11904: 0xDBD8, + 35386 - 11904: 0xB645, + 35387 - 11904: 0xB5F9, + 35388 - 11904: 0xB5FD, + 35389 - 11904: 0x95B5, + 35390 - 11904: 0xB8E4, + 35391 - 11904: 0xE049, + 35392 - 11904: 0xDBDA, + 35393 - 11904: 0xB5FE, + 35396 - 11904: 0xDBDD, + 35397 - 11904: 0xDBDE, + 35398 - 11904: 0xB643, + 35400 - 11904: 0xDBE0, + 35401 - 11904: 0xA0CA, + 35402 - 11904: 0xDBE2, + 35404 - 11904: 0xDBE3, + 35405 - 11904: 0xDBD7, + 35406 - 11904: 0xDBD6, + 35407 - 11904: 0xDBE4, + 35408 - 11904: 0xB642, + 35409 - 11904: 0xDBE1, + 35410 - 11904: 0xDBDF, + 35412 - 11904: 0xB640, + 35413 - 11904: 0xB5FB, + 35414 - 11904: 0xB647, + 35415 - 11904: 0xDBDB, + 35416 - 11904: 0xDBDC, + 35417 - 11904: 0xDBD9, + 35419 - 11904: 0xB641, + 35422 - 11904: 0xB5FC, + 35424 - 11904: 0xB5FA, + 35425 - 11904: 0xE048, + 35426 - 11904: 0xB8DF, + 35427 - 11904: 0xB8DA, + 35430 - 11904: 0xB8D5, + 35431 - 11904: 0x9FFD, + 35432 - 11904: 0xB8E5, + 35433 - 11904: 0xB8D6, + 35435 - 11904: 0xB8D2, + 35436 - 11904: 0xB8E1, + 35437 - 11904: 0xB8DE, + 35438 - 11904: 0xB8E0, + 35440 - 11904: 0xB8D7, + 35441 - 11904: 0xB8DC, + 35442 - 11904: 0xB8D3, + 35443 - 11904: 0xB8D4, + 35444 - 11904: 0xE050, + 35445 - 11904: 0xE04D, + 35446 - 11904: 0xE045, + 35447 - 11904: 0xE04A, + 35449 - 11904: 0xB8E2, + 35450 - 11904: 0xE051, + 35451 - 11904: 0xB8E3, + 35452 - 11904: 0xB8D9, + 35454 - 11904: 0xA058, + 35455 - 11904: 0xE047, + 35457 - 11904: 0xE04F, + 35458 - 11904: 0xE04B, + 35459 - 11904: 0xE04E, + 35460 - 11904: 0xE04C, + 35461 - 11904: 0xB8DD, + 35462 - 11904: 0xE046, + 35463 - 11904: 0xB8D8, + 35467 - 11904: 0xE44C, + 35468 - 11904: 0xBB78, + 35469 - 11904: 0xBB7B, + 35471 - 11904: 0xE44E, + 35472 - 11904: 0x8FD6, + 35473 - 11904: 0xBBA5, + 35474 - 11904: 0xE44D, + 35475 - 11904: 0xBB7D, + 35476 - 11904: 0x99D8, + 35477 - 11904: 0xBDCF, + 35478 - 11904: 0xE44F, + 35480 - 11904: 0xBBA4, + 35481 - 11904: 0xE44B, + 35482 - 11904: 0xBBA6, + 35484 - 11904: 0x8FD3, + 35486 - 11904: 0xBB79, + 35488 - 11904: 0xB8DB, + 35489 - 11904: 0xBB7C, + 35491 - 11904: 0xBB7A, + 35492 - 11904: 0xBB7E, + 35493 - 11904: 0xBBA2, + 35494 - 11904: 0xBB77, + 35495 - 11904: 0xBBA7, + 35496 - 11904: 0xBBA3, + 35497 - 11904: 0x8FE5, + 35498 - 11904: 0xBBA1, + 35499 - 11904: 0xE44A, + 35503 - 11904: 0x8FE9, + 35504 - 11904: 0xBDD6, + 35506 - 11904: 0xBDD2, + 35508 - 11904: 0x99D9, + 35510 - 11904: 0xBDD9, + 35512 - 11904: 0xE7D6, + 35513 - 11904: 0xBDDA, + 35514 - 11904: 0xE7E2, + 35515 - 11904: 0xE7DB, + 35516 - 11904: 0xBDCB, + 35517 - 11904: 0xE7E3, + 35518 - 11904: 0xE7DD, + 35519 - 11904: 0xBDD5, + 35520 - 11904: 0xE7DE, + 35522 - 11904: 0xBDD4, + 35523 - 11904: 0xE7E1, + 35524 - 11904: 0xBDCE, + 35525 - 11904: 0xE7DF, + 35526 - 11904: 0xE7D5, + 35527 - 11904: 0xBDCD, + 35528 - 11904: 0xEBAA, + 35529 - 11904: 0xBDD3, + 35531 - 11904: 0xBDD0, + 35532 - 11904: 0x8CF7, + 35533 - 11904: 0xBDD8, + 35535 - 11904: 0xE7D4, + 35537 - 11904: 0xE7D8, + 35538 - 11904: 0xBDCC, + 35539 - 11904: 0xE7D7, + 35540 - 11904: 0xE7D9, + 35541 - 11904: 0xE7DA, + 35542 - 11904: 0xBDD7, + 35543 - 11904: 0xE7DC, + 35544 - 11904: 0xE7E0, + 35545 - 11904: 0xE7E4, + 35546 - 11904: 0x927C, + 35547 - 11904: 0xBDDB, + 35548 - 11904: 0xBFD2, + 35549 - 11904: 0xEBA5, + 35550 - 11904: 0xEBAB, + 35551 - 11904: 0xEBA8, + 35552 - 11904: 0xEB7E, + 35553 - 11904: 0xEBAC, + 35554 - 11904: 0xEBA1, + 35556 - 11904: 0xEBA7, + 35558 - 11904: 0xBFCD, + 35559 - 11904: 0xBFD3, + 35560 - 11904: 0xEBAD, + 35562 - 11904: 0x9C45, + 35563 - 11904: 0xBFCF, + 35565 - 11904: 0xBFD9, + 35566 - 11904: 0xBFD4, + 35567 - 11904: 0xEBAF, + 35568 - 11904: 0xEBA9, + 35569 - 11904: 0xBFD0, + 35570 - 11904: 0xEBA2, + 35571 - 11904: 0xBFDA, + 35572 - 11904: 0xEBA3, + 35573 - 11904: 0xEBA4, + 35574 - 11904: 0xBFDB, + 35575 - 11904: 0xBFD8, + 35576 - 11904: 0xBDD1, + 35577 - 11904: 0x8CE8, + 35578 - 11904: 0xBFCE, + 35579 - 11904: 0xEBB0, + 35580 - 11904: 0xBFDC, + 35582 - 11904: 0xBFD5, + 35583 - 11904: 0xEBAE, + 35584 - 11904: 0xBFD1, + 35585 - 11904: 0xBFD6, + 35586 - 11904: 0xBFD7, + 35588 - 11904: 0xC1C3, + 35589 - 11904: 0xEEA4, + 35590 - 11904: 0xEEAD, + 35591 - 11904: 0xEEAA, + 35592 - 11904: 0xEEAC, + 35594 - 11904: 0xC1C0, + 35595 - 11904: 0xEEA5, + 35596 - 11904: 0x8FDE, + 35597 - 11904: 0xEEAB, + 35598 - 11904: 0xC1BC, + 35599 - 11904: 0xEEA7, + 35600 - 11904: 0xC1C4, + 35601 - 11904: 0xEEA3, + 35602 - 11904: 0xEEA8, + 35603 - 11904: 0xEEAF, + 35604 - 11904: 0xEBA6, + 35605 - 11904: 0xEEA9, + 35606 - 11904: 0xEEA2, + 35607 - 11904: 0xC1BD, + 35608 - 11904: 0xEEA1, + 35609 - 11904: 0xC1BE, + 35610 - 11904: 0xEEB0, + 35611 - 11904: 0xC1BF, + 35612 - 11904: 0xEEAE, + 35613 - 11904: 0xC1C2, + 35614 - 11904: 0xEE7E, + 35615 - 11904: 0x8FDF, + 35616 - 11904: 0xC1C1, + 35618 - 11904: 0xEEA6, + 35619 - 11904: 0xF0DC, + 35620 - 11904: 0xF0EA, + 35621 - 11904: 0xF0E5, + 35622 - 11904: 0xF0E7, + 35623 - 11904: 0xF0DB, + 35624 - 11904: 0xC2D3, + 35626 - 11904: 0xF0DA, + 35627 - 11904: 0xC2D6, + 35628 - 11904: 0xC2D5, + 35629 - 11904: 0xA04B, + 35630 - 11904: 0xF0E9, + 35631 - 11904: 0xF0E1, + 35632 - 11904: 0xF0DE, + 35633 - 11904: 0xF0E4, + 35635 - 11904: 0xF0DD, + 35637 - 11904: 0xF0DF, + 35638 - 11904: 0xF0E8, + 35639 - 11904: 0xF0E6, + 35641 - 11904: 0xC2D4, + 35642 - 11904: 0xF0ED, + 35643 - 11904: 0xF0EB, + 35644 - 11904: 0xF0E2, + 35645 - 11904: 0xF0EC, + 35646 - 11904: 0xF0E3, + 35647 - 11904: 0x8FE2, + 35648 - 11904: 0xF2F9, + 35649 - 11904: 0xC3CF, + 35650 - 11904: 0xF341, + 35651 - 11904: 0xA0CC, + 35653 - 11904: 0xF64F, + 35654 - 11904: 0xC3D6, + 35655 - 11904: 0xF0E0, + 35656 - 11904: 0xF2F7, + 35657 - 11904: 0xC3D2, + 35658 - 11904: 0xF2F8, + 35659 - 11904: 0xF2FD, + 35660 - 11904: 0x8FE3, + 35661 - 11904: 0x8FE4, + 35662 - 11904: 0xC3D4, + 35663 - 11904: 0xC3D5, + 35664 - 11904: 0xF2F6, + 35665 - 11904: 0xF340, + 35666 - 11904: 0xF342, + 35667 - 11904: 0xF2FA, + 35668 - 11904: 0xF2FC, + 35669 - 11904: 0xF2FE, + 35670 - 11904: 0xF2FB, + 35671 - 11904: 0xF343, + 35672 - 11904: 0xC3D1, + 35673 - 11904: 0xC3D7, + 35674 - 11904: 0xC3D3, + 35676 - 11904: 0xC3D0, + 35677 - 11904: 0xF4D0, + 35678 - 11904: 0x9BC4, + 35679 - 11904: 0xC4B7, + 35680 - 11904: 0xF4CE, + 35682 - 11904: 0x9BFC, + 35683 - 11904: 0xF4D2, + 35685 - 11904: 0xF4D3, + 35686 - 11904: 0xC4B5, + 35687 - 11904: 0xF4D4, + 35688 - 11904: 0xF4D1, + 35689 - 11904: 0x964C, + 35690 - 11904: 0xF4CF, + 35691 - 11904: 0xC4B8, + 35692 - 11904: 0xC4B4, + 35693 - 11904: 0xF4D5, + 35695 - 11904: 0xC4B6, + 35696 - 11904: 0xC4B3, + 35700 - 11904: 0xC4FE, + 35703 - 11904: 0xC540, + 35704 - 11904: 0xF64E, + 35705 - 11904: 0xF64D, + 35706 - 11904: 0xF650, + 35707 - 11904: 0xF651, + 35709 - 11904: 0xC541, + 35710 - 11904: 0xF756, + 35711 - 11904: 0xF75B, + 35712 - 11904: 0xC5AA, + 35713 - 11904: 0x9AF6, + 35714 - 11904: 0xF758, + 35715 - 11904: 0x8CAE, + 35716 - 11904: 0xF757, + 35717 - 11904: 0xF75A, + 35718 - 11904: 0xF759, + 35720 - 11904: 0xF843, + 35722 - 11904: 0xC5DC, + 35723 - 11904: 0xF842, + 35724 - 11904: 0xF840, + 35726 - 11904: 0xF841, + 35727 - 11904: 0x87CB, + 35728 - 11904: 0x8FE7, + 35730 - 11904: 0xC5FE, + 35731 - 11904: 0xC5FD, + 35732 - 11904: 0xF8C1, + 35733 - 11904: 0xF8C2, + 35734 - 11904: 0xC640, + 35736 - 11904: 0xF94D, + 35737 - 11904: 0xF94E, + 35738 - 11904: 0xC667, + 35739 - 11904: 0x8FE8, + 35740 - 11904: 0xC66D, + 35742 - 11904: 0xF9A9, + 35743 - 11904: 0xF9C8, + 35744 - 11904: 0x8BE7, + 35774 - 11904: 0x897A, + 35810 - 11904: 0x897B, + 35895 - 11904: 0xA8A6, + 35897 - 11904: 0xD7CD, + 35899 - 11904: 0xD7CE, + 35900 - 11904: 0xE052, + 35901 - 11904: 0xE450, + 35902 - 11904: 0xE7E5, + 35903 - 11904: 0xC1C6, + 35905 - 11904: 0xC1C5, + 35906 - 11904: 0xF0EE, + 35907 - 11904: 0xF344, + 35909 - 11904: 0xF844, + 35910 - 11904: 0xA8A7, + 35911 - 11904: 0xD3DE, + 35912 - 11904: 0xB05A, + 35913 - 11904: 0xB361, + 35914 - 11904: 0xE054, + 35915 - 11904: 0xE053, + 35916 - 11904: 0xBDDC, + 35917 - 11904: 0xE7E6, + 35918 - 11904: 0xBDDD, + 35919 - 11904: 0xEEB1, + 35920 - 11904: 0xC2D7, + 35921 - 11904: 0x99DA, + 35924 - 11904: 0xC676, + 35925 - 11904: 0xA8A8, + 35926 - 11904: 0xCDCB, + 35927 - 11904: 0xD3DF, + 35930 - 11904: 0xB362, + 35932 - 11904: 0xD7CF, + 35933 - 11904: 0xD7D0, + 35935 - 11904: 0xDBE5, + 35937 - 11904: 0xB648, + 35938 - 11904: 0xB8E6, + 35940 - 11904: 0xE056, + 35941 - 11904: 0xE055, + 35942 - 11904: 0xE057, + 35944 - 11904: 0xE451, + 35945 - 11904: 0xE452, + 35946 - 11904: 0xBBA8, + 35947 - 11904: 0xBFDD, + 35948 - 11904: 0xBDDE, + 35949 - 11904: 0xBFDE, + 35951 - 11904: 0xEEB5, + 35952 - 11904: 0xEEB2, + 35953 - 11904: 0xEEB4, + 35954 - 11904: 0xEEB3, + 35955 - 11904: 0xC1C7, + 35957 - 11904: 0xF0EF, + 35958 - 11904: 0xF346, + 35959 - 11904: 0xF345, + 35960 - 11904: 0xCBA4, + 35961 - 11904: 0xB05C, + 35962 - 11904: 0xB05B, + 35963 - 11904: 0xD3E0, + 35965 - 11904: 0xD7D1, + 35968 - 11904: 0xDBE7, + 35969 - 11904: 0xDBE6, + 35970 - 11904: 0xB649, + 35972 - 11904: 0xE059, + 35973 - 11904: 0xE05A, + 35974 - 11904: 0xE058, + 35977 - 11904: 0xB8E8, + 35978 - 11904: 0xB8E7, + 35980 - 11904: 0xBBAA, + 35981 - 11904: 0xBBA9, + 35983 - 11904: 0xE7E7, + 35984 - 11904: 0xEBB3, + 35985 - 11904: 0xEBB1, + 35986 - 11904: 0xEBB2, + 35987 - 11904: 0xBFDF, + 35988 - 11904: 0xEEB7, + 35989 - 11904: 0xEEB6, + 35991 - 11904: 0xF0F2, + 35992 - 11904: 0xF0F1, + 35993 - 11904: 0xF0F0, + 35994 - 11904: 0xF347, + 35995 - 11904: 0x8FED, + 35996 - 11904: 0xF9AA, + 35997 - 11904: 0xA8A9, + 35998 - 11904: 0xAD73, + 35999 - 11904: 0x95C0, + 36000 - 11904: 0xAD74, + 36001 - 11904: 0xB05D, + 36002 - 11904: 0xB05E, + 36003 - 11904: 0xD3E2, + 36004 - 11904: 0xD3E1, + 36005 - 11904: 0xD7D2, + 36007 - 11904: 0xB368, + 36008 - 11904: 0xB366, + 36009 - 11904: 0xB363, + 36010 - 11904: 0xB367, + 36011 - 11904: 0xB365, + 36012 - 11904: 0xB364, + 36013 - 11904: 0xA0CB, + 36015 - 11904: 0xB64A, + 36016 - 11904: 0xDBEA, + 36018 - 11904: 0xB8ED, + 36019 - 11904: 0xB64C, + 36020 - 11904: 0xB651, + 36021 - 11904: 0xDBEC, + 36022 - 11904: 0xB653, + 36023 - 11904: 0xB652, + 36024 - 11904: 0xB655, + 36025 - 11904: 0xDBEB, + 36026 - 11904: 0xDBE8, + 36027 - 11904: 0xB64F, + 36028 - 11904: 0xB64B, + 36029 - 11904: 0xB64D, + 36030 - 11904: 0xDBE9, + 36031 - 11904: 0xB654, + 36032 - 11904: 0xB650, + 36033 - 11904: 0xB64E, + 36034 - 11904: 0xB8EF, + 36035 - 11904: 0xB8EE, + 36036 - 11904: 0xB8EC, + 36037 - 11904: 0xB8F0, + 36039 - 11904: 0xB8EA, + 36040 - 11904: 0xB8EB, + 36042 - 11904: 0xB8E9, + 36044 - 11904: 0xE05B, + 36045 - 11904: 0x9E48, + 36047 - 11904: 0xE454, + 36049 - 11904: 0xBBAC, + 36050 - 11904: 0xBBAD, + 36051 - 11904: 0xBBAB, + 36052 - 11904: 0x99DB, + 36053 - 11904: 0xE453, + 36054 - 11904: 0x8FF3, + 36055 - 11904: 0xE455, + 36057 - 11904: 0xE7EA, + 36058 - 11904: 0xE7EC, + 36059 - 11904: 0x8FF9, + 36060 - 11904: 0xBDE7, + 36061 - 11904: 0xE7ED, + 36062 - 11904: 0xBDE0, + 36063 - 11904: 0xE7E9, + 36064 - 11904: 0xBDDF, + 36065 - 11904: 0xBDE9, + 36066 - 11904: 0xBDE5, + 36067 - 11904: 0xBDE6, + 36068 - 11904: 0xBDE2, + 36069 - 11904: 0xE7E8, + 36070 - 11904: 0xBDE1, + 36071 - 11904: 0xE7EE, + 36072 - 11904: 0xE7EB, + 36073 - 11904: 0x95C1, + 36074 - 11904: 0xBDE8, + 36075 - 11904: 0xA04E, + 36076 - 11904: 0xBDE3, + 36077 - 11904: 0xBDE4, + 36078 - 11904: 0xEBB5, + 36080 - 11904: 0xEBB7, + 36081 - 11904: 0xEBB6, + 36082 - 11904: 0x99DC, + 36083 - 11904: 0xEBB8, + 36084 - 11904: 0xBFE0, + 36085 - 11904: 0xEBB4, + 36087 - 11904: 0xA064, + 36088 - 11904: 0xC1CB, + 36089 - 11904: 0xEEB8, + 36090 - 11904: 0xC1C8, + 36091 - 11904: 0xC1CC, + 36092 - 11904: 0xC1CA, + 36093 - 11904: 0xC1C9, + 36094 - 11904: 0xF0F3, + 36096 - 11904: 0xF0F6, + 36098 - 11904: 0xF0F5, + 36099 - 11904: 0x8FF7, + 36100 - 11904: 0xF0F4, + 36101 - 11904: 0xC2D8, + 36102 - 11904: 0xF348, + 36103 - 11904: 0xF349, + 36104 - 11904: 0xC3D8, + 36105 - 11904: 0xF34A, + 36106 - 11904: 0xC3D9, + 36107 - 11904: 0x89B0, + 36108 - 11904: 0xA048, + 36109 - 11904: 0xC4BA, + 36111 - 11904: 0xC4B9, + 36112 - 11904: 0xF652, + 36113 - 11904: 0x8FFB, + 36114 - 11904: 0x8FF6, + 36115 - 11904: 0xC542, + 36116 - 11904: 0xF653, + 36117 - 11904: 0xF75C, + 36118 - 11904: 0xC5AB, + 36119 - 11904: 0xC5AC, + 36120 - 11904: 0x9DDC, + 36121 - 11904: 0xF845, + 36123 - 11904: 0xC642, + 36124 - 11904: 0x99DD, + 36125 - 11904: 0x8BE8, + 36196 - 11904: 0xA8AA, + 36198 - 11904: 0xB36A, + 36199 - 11904: 0xB369, + 36200 - 11904: 0xE05C, + 36201 - 11904: 0xE05D, + 36203 - 11904: 0xBBAE, + 36204 - 11904: 0xEBB9, + 36205 - 11904: 0xBDEA, + 36206 - 11904: 0xEBBA, + 36207 - 11904: 0xEEB9, + 36208 - 11904: 0xA8AB, + 36210 - 11904: 0xD0B2, + 36211 - 11904: 0xAD76, + 36212 - 11904: 0xAD75, + 36214 - 11904: 0xD3E3, + 36215 - 11904: 0xB05F, + 36216 - 11904: 0xD3E4, + 36217 - 11904: 0xD7D5, + 36218 - 11904: 0x92C1, + 36219 - 11904: 0xD7D4, + 36221 - 11904: 0xD7D3, + 36224 - 11904: 0xDBEE, + 36225 - 11904: 0xB658, + 36226 - 11904: 0x9FD6, + 36228 - 11904: 0xDBED, + 36229 - 11904: 0xB657, + 36233 - 11904: 0xDBEF, + 36234 - 11904: 0xB656, + 36236 - 11904: 0xE05F, + 36237 - 11904: 0xE062, + 36238 - 11904: 0xE060, + 36239 - 11904: 0xE061, + 36240 - 11904: 0xE065, + 36241 - 11904: 0xE05E, + 36242 - 11904: 0xE066, + 36243 - 11904: 0xE063, + 36244 - 11904: 0xE064, + 36245 - 11904: 0xBBB0, + 36246 - 11904: 0xE456, + 36249 - 11904: 0xBBAF, + 36251 - 11904: 0xE7F2, + 36252 - 11904: 0xE7F0, + 36255 - 11904: 0xBDEB, + 36256 - 11904: 0xE7EF, + 36257 - 11904: 0xE7F1, + 36259 - 11904: 0xBDEC, + 36261 - 11904: 0xEBBB, + 36262 - 11904: 0xA0D2, + 36263 - 11904: 0xEBBC, + 36264 - 11904: 0xC1CD, + 36265 - 11904: 0x9040, + 36266 - 11904: 0xF34C, + 36267 - 11904: 0xF34E, + 36268 - 11904: 0xF34B, + 36269 - 11904: 0xF34D, + 36270 - 11904: 0xF4D6, + 36271 - 11904: 0xF654, + 36274 - 11904: 0xF96F, + 36275 - 11904: 0xA8AC, + 36276 - 11904: 0xAD77, + 36277 - 11904: 0xD3E5, + 36278 - 11904: 0xD3E7, + 36279 - 11904: 0xD3E6, + 36281 - 11904: 0xD7D8, + 36282 - 11904: 0xB36C, + 36284 - 11904: 0xD7D6, + 36286 - 11904: 0xB36B, + 36287 - 11904: 0xD7D9, + 36288 - 11904: 0x8AC4, + 36289 - 11904: 0xD7DA, + 36290 - 11904: 0xD7D7, + 36291 - 11904: 0x99E0, + 36293 - 11904: 0xDBFB, + 36294 - 11904: 0xB660, + 36295 - 11904: 0xDBF3, + 36296 - 11904: 0xDBF9, + 36299 - 11904: 0xB65B, + 36300 - 11904: 0xB65E, + 36301 - 11904: 0xDBF2, + 36302 - 11904: 0xB659, + 36303 - 11904: 0xDBF6, + 36304 - 11904: 0xE06C, + 36305 - 11904: 0xB65D, + 36307 - 11904: 0xDBF1, + 36308 - 11904: 0x9FF0, + 36309 - 11904: 0xDBF7, + 36310 - 11904: 0xDBF4, + 36311 - 11904: 0xDBFA, + 36312 - 11904: 0xDBF0, + 36313 - 11904: 0xDBF8, + 36314 - 11904: 0xB65C, + 36315 - 11904: 0xB65F, + 36316 - 11904: 0xDBF5, + 36317 - 11904: 0xB65A, + 36319 - 11904: 0xB8F2, + 36320 - 11904: 0xE068, + 36321 - 11904: 0xB8F1, + 36322 - 11904: 0xE06F, + 36323 - 11904: 0xE06E, + 36324 - 11904: 0xB8F8, + 36326 - 11904: 0xB8F9, + 36327 - 11904: 0xE070, + 36328 - 11904: 0xB8F3, + 36329 - 11904: 0xE06D, + 36330 - 11904: 0xB8F7, + 36331 - 11904: 0xE072, + 36332 - 11904: 0xE069, + 36334 - 11904: 0xE06B, + 36335 - 11904: 0xB8F4, + 36336 - 11904: 0xE067, + 36337 - 11904: 0xE06A, + 36338 - 11904: 0xE071, + 36339 - 11904: 0xB8F5, + 36340 - 11904: 0xE073, + 36346 - 11904: 0xB8F6, + 36348 - 11904: 0xBBB1, + 36349 - 11904: 0xE45B, + 36350 - 11904: 0xE461, + 36351 - 11904: 0xE459, + 36352 - 11904: 0xE462, + 36353 - 11904: 0x9FF3, + 36354 - 11904: 0xE458, + 36355 - 11904: 0xE45D, + 36356 - 11904: 0xE463, + 36357 - 11904: 0xE460, + 36358 - 11904: 0xE45F, + 36359 - 11904: 0xE45E, + 36361 - 11904: 0xE457, + 36362 - 11904: 0xE45C, + 36365 - 11904: 0xE45A, + 36366 - 11904: 0x9DBF, + 36367 - 11904: 0xBDF1, + 36368 - 11904: 0xBDEE, + 36369 - 11904: 0xE7FB, + 36370 - 11904: 0xE841, + 36371 - 11904: 0xE843, + 36372 - 11904: 0xE840, + 36373 - 11904: 0xE7F8, + 36374 - 11904: 0xE7FA, + 36375 - 11904: 0xE845, + 36376 - 11904: 0xE842, + 36377 - 11904: 0xE7FC, + 36378 - 11904: 0xE846, + 36379 - 11904: 0xE7F9, + 36380 - 11904: 0xE844, + 36381 - 11904: 0xBDEF, + 36382 - 11904: 0xBDF5, + 36383 - 11904: 0xBDF3, + 36384 - 11904: 0xE7F3, + 36385 - 11904: 0xBDF4, + 36386 - 11904: 0xBDF0, + 36387 - 11904: 0xE7F4, + 36388 - 11904: 0xE7F6, + 36389 - 11904: 0xE7F5, + 36390 - 11904: 0xE7FD, + 36391 - 11904: 0xE7FE, + 36392 - 11904: 0x9FF6, + 36393 - 11904: 0xBDF2, + 36394 - 11904: 0x95C8, + 36395 - 11904: 0xBDED, + 36397 - 11904: 0x9E5A, + 36398 - 11904: 0xE7F7, + 36400 - 11904: 0xEBC6, + 36401 - 11904: 0xBFE2, + 36403 - 11904: 0xEBBD, + 36404 - 11904: 0xBFE3, + 36405 - 11904: 0xBFE6, + 36406 - 11904: 0xEBC2, + 36408 - 11904: 0xEBBF, + 36409 - 11904: 0xBFE5, + 36410 - 11904: 0x99E3, + 36412 - 11904: 0xEBC3, + 36413 - 11904: 0xEBC4, + 36414 - 11904: 0xEBBE, + 36415 - 11904: 0xEBC7, + 36416 - 11904: 0xEBC0, + 36417 - 11904: 0xEBC5, + 36418 - 11904: 0xBFE4, + 36420 - 11904: 0xBFE1, + 36421 - 11904: 0xEBC1, + 36422 - 11904: 0x8A4A, + 36423 - 11904: 0xEEBF, + 36424 - 11904: 0xC1D0, + 36425 - 11904: 0xC1CE, + 36426 - 11904: 0xC1D1, + 36427 - 11904: 0xC1CF, + 36428 - 11904: 0xEEBE, + 36429 - 11904: 0xEEBB, + 36430 - 11904: 0xEEBA, + 36431 - 11904: 0x9FF1, + 36432 - 11904: 0xEEBD, + 36435 - 11904: 0xEEBC, + 36436 - 11904: 0xF145, + 36437 - 11904: 0xC2DE, + 36438 - 11904: 0xF0FB, + 36439 - 11904: 0xF0FA, + 36441 - 11904: 0xC2D9, + 36442 - 11904: 0xF141, + 36443 - 11904: 0xF140, + 36444 - 11904: 0xF0F7, + 36445 - 11904: 0xF143, + 36446 - 11904: 0xF0FC, + 36447 - 11904: 0xC2DD, + 36448 - 11904: 0xF0F9, + 36449 - 11904: 0xF142, + 36450 - 11904: 0xF0F8, + 36451 - 11904: 0xC2DA, + 36452 - 11904: 0xC2DC, + 36453 - 11904: 0xF0FD, + 36454 - 11904: 0xC2DB, + 36455 - 11904: 0xF0FE, + 36456 - 11904: 0x8AA7, + 36457 - 11904: 0xF144, + 36458 - 11904: 0xF352, + 36460 - 11904: 0xC3DE, + 36461 - 11904: 0xF34F, + 36463 - 11904: 0xF353, + 36465 - 11904: 0x99E6, + 36466 - 11904: 0xC3DB, + 36467 - 11904: 0xF351, + 36468 - 11904: 0xC3E0, + 36469 - 11904: 0x9FF7, + 36470 - 11904: 0xC3DD, + 36471 - 11904: 0x9FED, + 36472 - 11904: 0xF350, + 36474 - 11904: 0xC3DF, + 36475 - 11904: 0xF354, + 36476 - 11904: 0xC3DA, + 36478 - 11904: 0x8A5C, + 36480 - 11904: 0x9DAE, + 36481 - 11904: 0xC4BC, + 36482 - 11904: 0xC4BE, + 36484 - 11904: 0xF4D9, + 36485 - 11904: 0xC4BD, + 36486 - 11904: 0xF4D7, + 36487 - 11904: 0xC3DC, + 36488 - 11904: 0xF4D8, + 36489 - 11904: 0xC4BB, + 36490 - 11904: 0xC543, + 36491 - 11904: 0xC545, + 36492 - 11904: 0xF656, + 36493 - 11904: 0xC544, + 36494 - 11904: 0xF655, + 36496 - 11904: 0xF761, + 36497 - 11904: 0xC5AD, + 36498 - 11904: 0xF760, + 36499 - 11904: 0xC5AE, + 36500 - 11904: 0xF75E, + 36501 - 11904: 0xF75D, + 36502 - 11904: 0xF762, + 36503 - 11904: 0xF763, + 36504 - 11904: 0xF846, + 36506 - 11904: 0xF75F, + 36509 - 11904: 0xF8C6, + 36510 - 11904: 0xF8C3, + 36511 - 11904: 0xF8C4, + 36512 - 11904: 0xF8C5, + 36513 - 11904: 0xC65C, + 36515 - 11904: 0xF951, + 36516 - 11904: 0xF950, + 36517 - 11904: 0xF94F, + 36518 - 11904: 0xF970, + 36519 - 11904: 0x95C9, + 36520 - 11904: 0xF9BE, + 36521 - 11904: 0xF9AB, + 36522 - 11904: 0xC66E, + 36523 - 11904: 0xA8AD, + 36524 - 11904: 0xB060, + 36525 - 11904: 0x9048, + 36528 - 11904: 0x99E8, + 36530 - 11904: 0xB8FA, + 36534 - 11904: 0x9049, + 36537 - 11904: 0x8CBA, + 36538 - 11904: 0xBDF6, + 36540 - 11904: 0x90B1, + 36541 - 11904: 0xEBC8, + 36544 - 11904: 0xC2DF, + 36546 - 11904: 0xF355, + 36547 - 11904: 0x904A, + 36553 - 11904: 0xF9AC, + 36554 - 11904: 0xA8AE, + 36555 - 11904: 0xAAEE, + 36556 - 11904: 0xAD79, + 36557 - 11904: 0xAD78, + 36558 - 11904: 0x99EA, + 36559 - 11904: 0xB063, + 36561 - 11904: 0xD3E8, + 36562 - 11904: 0xB061, + 36563 - 11904: 0xD3E9, + 36564 - 11904: 0xB062, + 36567 - 11904: 0xD7DF, + 36568 - 11904: 0xD7DB, + 36570 - 11904: 0x9BD1, + 36571 - 11904: 0xB36D, + 36572 - 11904: 0xD7DE, + 36573 - 11904: 0xD7DD, + 36574 - 11904: 0xD7DC, + 36575 - 11904: 0xB36E, + 36576 - 11904: 0xD7E0, + 36577 - 11904: 0xD7E1, + 36578 - 11904: 0x99EB, + 36580 - 11904: 0x99EC, + 36581 - 11904: 0xDC43, + 36582 - 11904: 0xDC41, + 36583 - 11904: 0xDC45, + 36584 - 11904: 0xDC46, + 36585 - 11904: 0xDC4C, + 36587 - 11904: 0xDC48, + 36588 - 11904: 0xDC4A, + 36589 - 11904: 0x99ED, + 36590 - 11904: 0xDC42, + 36591 - 11904: 0xDBFC, + 36593 - 11904: 0xDC49, + 36594 - 11904: 0x99EE, + 36596 - 11904: 0xDC4B, + 36597 - 11904: 0xDC44, + 36598 - 11904: 0xDC47, + 36599 - 11904: 0xDBFD, + 36600 - 11904: 0xB662, + 36601 - 11904: 0xDC40, + 36602 - 11904: 0xDBFE, + 36603 - 11904: 0xB661, + 36604 - 11904: 0xB663, + 36606 - 11904: 0xB8FD, + 36607 - 11904: 0xE075, + 36608 - 11904: 0xE077, + 36609 - 11904: 0xE076, + 36610 - 11904: 0xE07B, + 36611 - 11904: 0xB8FB, + 36613 - 11904: 0xE078, + 36614 - 11904: 0xE074, + 36615 - 11904: 0xE079, + 36616 - 11904: 0xE07A, + 36617 - 11904: 0xB8FC, + 36618 - 11904: 0xB8FE, + 36619 - 11904: 0xE07C, + 36621 - 11904: 0xE467, + 36622 - 11904: 0xE466, + 36624 - 11904: 0xE464, + 36625 - 11904: 0xE465, + 36626 - 11904: 0xBBB3, + 36627 - 11904: 0xBBB5, + 36628 - 11904: 0xBBB2, + 36629 - 11904: 0xBBB4, + 36630 - 11904: 0xE84D, + 36631 - 11904: 0xE84E, + 36632 - 11904: 0xE849, + 36633 - 11904: 0x904C, + 36634 - 11904: 0xE84A, + 36635 - 11904: 0xBDF8, + 36636 - 11904: 0xBDFD, + 36637 - 11904: 0xBDF7, + 36638 - 11904: 0xBDFE, + 36639 - 11904: 0xBDF9, + 36640 - 11904: 0xE84B, + 36643 - 11904: 0xE84C, + 36644 - 11904: 0xE848, + 36645 - 11904: 0xBE40, + 36646 - 11904: 0xBDFB, + 36649 - 11904: 0xBDFA, + 36650 - 11904: 0xBDFC, + 36652 - 11904: 0xE847, + 36653 - 11904: 0x904D, + 36654 - 11904: 0xEBCA, + 36655 - 11904: 0xBFE8, + 36656 - 11904: 0x95CB, + 36658 - 11904: 0xEBCC, + 36659 - 11904: 0xBFEA, + 36660 - 11904: 0xEBCF, + 36661 - 11904: 0xEBCB, + 36662 - 11904: 0xEBC9, + 36663 - 11904: 0xEBCE, + 36664 - 11904: 0xBFE9, + 36665 - 11904: 0xEBCD, + 36667 - 11904: 0xBFE7, + 36670 - 11904: 0xC1D3, + 36671 - 11904: 0xC1D6, + 36672 - 11904: 0xEEC1, + 36673 - 11904: 0x97E2, + 36674 - 11904: 0xC1D4, + 36675 - 11904: 0xEEC0, + 36676 - 11904: 0xC1D2, + 36677 - 11904: 0xC1D5, + 36678 - 11904: 0xF146, + 36679 - 11904: 0xF147, + 36680 - 11904: 0xF148, + 36681 - 11904: 0xC2E0, + 36682 - 11904: 0x95CC, + 36683 - 11904: 0xF149, + 36685 - 11904: 0xC2E1, + 36686 - 11904: 0xC3E2, + 36687 - 11904: 0xF358, + 36688 - 11904: 0xF359, + 36689 - 11904: 0xF357, + 36690 - 11904: 0xF356, + 36691 - 11904: 0xF35A, + 36692 - 11904: 0xC3E1, + 36693 - 11904: 0xF4DD, + 36694 - 11904: 0xF4DB, + 36695 - 11904: 0xF4DC, + 36696 - 11904: 0xF4DE, + 36697 - 11904: 0xF4DA, + 36698 - 11904: 0xF4DF, + 36699 - 11904: 0xF658, + 36700 - 11904: 0x9F78, + 36701 - 11904: 0xF659, + 36702 - 11904: 0xF657, + 36703 - 11904: 0xC546, + 36704 - 11904: 0xF764, + 36705 - 11904: 0xC5AF, + 36706 - 11904: 0xF765, + 36707 - 11904: 0xF848, + 36708 - 11904: 0xF847, + 36710 - 11904: 0x897C, + 36711 - 11904: 0x897D, + 36718 - 11904: 0x897E, + 36755 - 11904: 0x995D, + 36763 - 11904: 0xA8AF, + 36764 - 11904: 0xB664, + 36767 - 11904: 0xB940, + 36768 - 11904: 0x9B5A, + 36771 - 11904: 0xBBB6, + 36773 - 11904: 0x9050, + 36774 - 11904: 0xBFEC, + 36775 - 11904: 0x8C4F, + 36776 - 11904: 0xBFEB, + 36781 - 11904: 0xC3E3, + 36782 - 11904: 0xC47C, + 36783 - 11904: 0xC547, + 36784 - 11904: 0xA8B0, + 36785 - 11904: 0xB064, + 36786 - 11904: 0xB941, + 36787 - 11904: 0x9054, + 36788 - 11904: 0xF35B, + 36789 - 11904: 0xC6D6, + 36790 - 11904: 0x9AA8, + 36791 - 11904: 0x99EF, + 36792 - 11904: 0xFEEB, + 36793 - 11904: 0x9DA3, + 36794 - 11904: 0x9DA1, + 36795 - 11904: 0x9943, + 36796 - 11904: 0x9945, + 36798 - 11904: 0x9D7D, + 36799 - 11904: 0xCBA6, + 36801 - 11904: 0x99F0, + 36802 - 11904: 0xA8B1, + 36804 - 11904: 0xA8B4, + 36805 - 11904: 0xA8B3, + 36806 - 11904: 0xA8B2, + 36809 - 11904: 0xCBA5, + 36810 - 11904: 0x99F1, + 36811 - 11904: 0xCDCD, + 36812 - 11904: 0x99F2, + 36813 - 11904: 0xCDCF, + 36814 - 11904: 0xAAEF, + 36815 - 11904: 0x8CBC, + 36816 - 11904: 0x9D60, + 36817 - 11904: 0xAAF1, + 36818 - 11904: 0xCDCC, + 36819 - 11904: 0xCDCE, + 36820 - 11904: 0xAAF0, + 36821 - 11904: 0xCDD1, + 36822 - 11904: 0xCDD0, + 36823 - 11904: 0xCDD2, + 36826 - 11904: 0xA0A3, + 36832 - 11904: 0xD0B6, + 36833 - 11904: 0xD0B4, + 36834 - 11904: 0xAD7C, + 36835 - 11904: 0xD0B3, + 36836 - 11904: 0xADA3, + 36837 - 11904: 0xAD7E, + 36838 - 11904: 0xAD7B, + 36840 - 11904: 0xADA4, + 36842 - 11904: 0xAD7D, + 36843 - 11904: 0xADA2, + 36845 - 11904: 0xADA1, + 36846 - 11904: 0xD0B5, + 36848 - 11904: 0xAD7A, + 36852 - 11904: 0xB06A, + 36853 - 11904: 0xD3EB, + 36854 - 11904: 0xD3F1, + 36855 - 11904: 0xB067, + 36856 - 11904: 0xB06E, + 36857 - 11904: 0x905B, + 36858 - 11904: 0xB069, + 36859 - 11904: 0xD3EE, + 36860 - 11904: 0xD3F0, + 36861 - 11904: 0xB06C, + 36862 - 11904: 0xD3EA, + 36863 - 11904: 0xD3ED, + 36864 - 11904: 0xB068, + 36865 - 11904: 0xB065, + 36866 - 11904: 0xD3EC, + 36867 - 11904: 0xB06B, + 36868 - 11904: 0xD3EF, + 36869 - 11904: 0xB06D, + 36870 - 11904: 0xB066, + 36872 - 11904: 0x9EDB, + 36875 - 11904: 0xD7E3, + 36876 - 11904: 0xD7E6, + 36877 - 11904: 0xB370, + 36879 - 11904: 0xB37A, + 36880 - 11904: 0xB376, + 36881 - 11904: 0xD7E4, + 36882 - 11904: 0x9D79, + 36884 - 11904: 0xB37E, + 36885 - 11904: 0xB377, + 36886 - 11904: 0xB37C, + 36887 - 11904: 0xB372, + 36889 - 11904: 0xB36F, + 36890 - 11904: 0xB371, + 36891 - 11904: 0xB37D, + 36892 - 11904: 0xD7E5, + 36893 - 11904: 0xB375, + 36894 - 11904: 0xB378, + 36895 - 11904: 0xB374, + 36896 - 11904: 0xB379, + 36897 - 11904: 0xD7E7, + 36898 - 11904: 0xB37B, + 36899 - 11904: 0xB373, + 36900 - 11904: 0xD7E2, + 36909 - 11904: 0xDC4D, + 36910 - 11904: 0xB665, + 36911 - 11904: 0xDC4F, + 36913 - 11904: 0xB667, + 36914 - 11904: 0xB669, + 36915 - 11904: 0x99F3, + 36916 - 11904: 0xDC4E, + 36917 - 11904: 0xB666, + 36918 - 11904: 0xB66A, + 36919 - 11904: 0x9062, + 36920 - 11904: 0xB668, + 36924 - 11904: 0xB947, + 36925 - 11904: 0xE0A3, + 36926 - 11904: 0xB94F, + 36927 - 11904: 0xE07E, + 36929 - 11904: 0xB950, + 36930 - 11904: 0xB945, + 36932 - 11904: 0xE0A1, + 36934 - 11904: 0x87BD, + 36935 - 11904: 0xB94A, + 36937 - 11904: 0xE0A2, + 36938 - 11904: 0xB943, + 36939 - 11904: 0xB942, + 36940 - 11904: 0x9F55, + 36941 - 11904: 0xB94D, + 36942 - 11904: 0xB94C, + 36943 - 11904: 0xB94B, + 36944 - 11904: 0xB949, + 36945 - 11904: 0xB94E, + 36946 - 11904: 0xE07D, + 36947 - 11904: 0xB944, + 36948 - 11904: 0xB946, + 36949 - 11904: 0xB948, + 36950 - 11904: 0x9BF9, + 36952 - 11904: 0xBBB8, + 36953 - 11904: 0xBBBB, + 36955 - 11904: 0xBBBF, + 36956 - 11904: 0xBBB9, + 36957 - 11904: 0xBBBE, + 36958 - 11904: 0xBBBC, + 36960 - 11904: 0xBBB7, + 36961 - 11904: 0x9065, + 36962 - 11904: 0xBBBD, + 36963 - 11904: 0xBBBA, + 36964 - 11904: 0x96E0, + 36967 - 11904: 0xE852, + 36968 - 11904: 0xBE43, + 36969 - 11904: 0xBE41, + 36971 - 11904: 0xE853, + 36972 - 11904: 0x98BE, + 36973 - 11904: 0xBE44, + 36974 - 11904: 0xBE42, + 36975 - 11904: 0xE851, + 36976 - 11904: 0xE850, + 36978 - 11904: 0xBFF0, + 36979 - 11904: 0xE84F, + 36980 - 11904: 0xBFEE, + 36981 - 11904: 0xBFED, + 36982 - 11904: 0xEBD0, + 36983 - 11904: 0xBE45, + 36984 - 11904: 0xBFEF, + 36985 - 11904: 0xEBD1, + 36986 - 11904: 0xBFF2, + 36987 - 11904: 0xEBD2, + 36988 - 11904: 0xBFF1, + 36989 - 11904: 0xC1D8, + 36990 - 11904: 0xEEC3, + 36991 - 11904: 0xC1D7, + 36992 - 11904: 0xC1DC, + 36993 - 11904: 0xC1DA, + 36994 - 11904: 0xC1DB, + 36995 - 11904: 0xC2E3, + 36996 - 11904: 0xC1D9, + 36997 - 11904: 0xEEC2, + 36998 - 11904: 0xEBD3, + 36999 - 11904: 0xC2E2, + 37000 - 11904: 0xC2E4, + 37002 - 11904: 0xC3E4, + 37003 - 11904: 0xC3E5, + 37005 - 11904: 0xF4E0, + 37007 - 11904: 0xC5DE, + 37008 - 11904: 0xC5DD, + 37009 - 11904: 0xA8B6, + 37012 - 11904: 0xCA55, + 37013 - 11904: 0xB06F, + 37015 - 11904: 0xCA52, + 37016 - 11904: 0xCA53, + 37017 - 11904: 0xCA51, + 37019 - 11904: 0xCA54, + 37022 - 11904: 0xCBAA, + 37023 - 11904: 0xCBA7, + 37024 - 11904: 0xCBAC, + 37025 - 11904: 0xCBA8, + 37026 - 11904: 0xA8B7, + 37027 - 11904: 0xA8BA, + 37029 - 11904: 0xCBA9, + 37030 - 11904: 0xA8B9, + 37031 - 11904: 0xCBAB, + 37032 - 11904: 0x9068, + 37034 - 11904: 0xA8B8, + 37038 - 11904: 0x906C, + 37039 - 11904: 0xCDD5, + 37040 - 11904: 0xCDD7, + 37041 - 11904: 0xAAF4, + 37042 - 11904: 0xCDD3, + 37043 - 11904: 0xCDD6, + 37044 - 11904: 0xCDD4, + 37045 - 11904: 0xAAF2, + 37046 - 11904: 0xAAF5, + 37048 - 11904: 0xAAF3, + 37051 - 11904: 0x95D8, + 37053 - 11904: 0xD0B8, + 37054 - 11904: 0xD0BC, + 37055 - 11904: 0xD0B9, + 37057 - 11904: 0xADA7, + 37059 - 11904: 0xADA8, + 37060 - 11904: 0x906A, + 37061 - 11904: 0xD0BB, + 37063 - 11904: 0xD0BD, + 37064 - 11904: 0xD0BF, + 37066 - 11904: 0xADA5, + 37067 - 11904: 0xD0BE, + 37070 - 11904: 0xADA6, + 37076 - 11904: 0xD7EE, + 37077 - 11904: 0xD0BA, + 37078 - 11904: 0xD3F2, + 37079 - 11904: 0xD3FB, + 37080 - 11904: 0xD3F9, + 37081 - 11904: 0xD3F4, + 37082 - 11904: 0xD3F5, + 37083 - 11904: 0xD3FA, + 37084 - 11904: 0xD3FC, + 37085 - 11904: 0xB071, + 37087 - 11904: 0xD3F7, + 37088 - 11904: 0xD3F3, + 37089 - 11904: 0xB070, + 37090 - 11904: 0xB072, + 37091 - 11904: 0xD3F6, + 37092 - 11904: 0xD3FD, + 37093 - 11904: 0xD3F8, + 37096 - 11904: 0xB3A1, + 37097 - 11904: 0xD7F1, + 37098 - 11904: 0xD7E9, + 37099 - 11904: 0xD7EF, + 37100 - 11904: 0xD7F0, + 37101 - 11904: 0xB3A2, + 37103 - 11904: 0xD7E8, + 37104 - 11904: 0xD7EA, + 37105 - 11904: 0xD0B7, + 37106 - 11904: 0xD7EC, + 37107 - 11904: 0xD7ED, + 37108 - 11904: 0xD7EB, + 37109 - 11904: 0xB66C, + 37113 - 11904: 0xDC56, + 37114 - 11904: 0xEBD4, + 37115 - 11904: 0xDC57, + 37116 - 11904: 0xDC54, + 37117 - 11904: 0xB3A3, + 37118 - 11904: 0xB66E, + 37119 - 11904: 0xDC53, + 37120 - 11904: 0xDC59, + 37121 - 11904: 0xDC58, + 37122 - 11904: 0xB66B, + 37123 - 11904: 0xDC5C, + 37124 - 11904: 0xDC52, + 37125 - 11904: 0xDC5B, + 37126 - 11904: 0xDC50, + 37127 - 11904: 0xDC5A, + 37128 - 11904: 0xDC55, + 37129 - 11904: 0xB66D, + 37131 - 11904: 0xE0AA, + 37133 - 11904: 0xE0A5, + 37134 - 11904: 0xE0AB, + 37135 - 11904: 0xE0A6, + 37136 - 11904: 0xE0A4, + 37137 - 11904: 0xE0A7, + 37138 - 11904: 0xB951, + 37140 - 11904: 0xE0A9, + 37142 - 11904: 0xE0A8, + 37143 - 11904: 0xB952, + 37144 - 11904: 0xBBC1, + 37145 - 11904: 0xBBC0, + 37146 - 11904: 0xE46E, + 37147 - 11904: 0xE471, + 37148 - 11904: 0xE469, + 37149 - 11904: 0xE46D, + 37150 - 11904: 0xBBC2, + 37151 - 11904: 0xE46C, + 37152 - 11904: 0xE46A, + 37153 - 11904: 0xE470, + 37154 - 11904: 0xE46B, + 37155 - 11904: 0xE468, + 37156 - 11904: 0xE46F, + 37158 - 11904: 0xE859, + 37159 - 11904: 0xBE48, + 37160 - 11904: 0xF14A, + 37161 - 11904: 0xE856, + 37162 - 11904: 0xE857, + 37163 - 11904: 0xE855, + 37164 - 11904: 0xDC51, + 37165 - 11904: 0xBE47, + 37166 - 11904: 0xE85A, + 37167 - 11904: 0xE854, + 37168 - 11904: 0xBE46, + 37169 - 11904: 0xBE49, + 37170 - 11904: 0xE858, + 37171 - 11904: 0xEBD5, + 37172 - 11904: 0xBFF3, + 37173 - 11904: 0xEBD6, + 37174 - 11904: 0xEBD7, + 37176 - 11904: 0xEEC4, + 37177 - 11904: 0xC1DD, + 37178 - 11904: 0xF14B, + 37179 - 11904: 0xF14C, + 37182 - 11904: 0xF14D, + 37183 - 11904: 0xF35D, + 37184 - 11904: 0xF35C, + 37185 - 11904: 0xF4E2, + 37187 - 11904: 0xF4E1, + 37188 - 11904: 0xF65B, + 37189 - 11904: 0xF65C, + 37190 - 11904: 0xF65A, + 37191 - 11904: 0xF766, + 37192 - 11904: 0xC5B0, + 37193 - 11904: 0xA8BB, + 37194 - 11904: 0xADAA, + 37195 - 11904: 0xADA9, + 37196 - 11904: 0xB075, + 37197 - 11904: 0xB074, + 37198 - 11904: 0xD440, + 37199 - 11904: 0xD441, + 37200 - 11904: 0xD3FE, + 37201 - 11904: 0x9FB2, + 37202 - 11904: 0xB073, + 37203 - 11904: 0xD7F5, + 37205 - 11904: 0xD7F6, + 37206 - 11904: 0xD7F2, + 37207 - 11904: 0xB3A4, + 37208 - 11904: 0xD7F3, + 37209 - 11904: 0x9FAE, + 37210 - 11904: 0xD7F4, + 37212 - 11904: 0x9FB0, + 37214 - 11904: 0x89AD, + 37215 - 11904: 0xDC5F, + 37216 - 11904: 0xDC61, + 37217 - 11904: 0xDC5D, + 37218 - 11904: 0xDC60, + 37219 - 11904: 0xB66F, + 37220 - 11904: 0xDC5E, + 37221 - 11904: 0xB670, + 37223 - 11904: 0x906E, + 37224 - 11904: 0xDD73, + 37225 - 11904: 0xB955, + 37226 - 11904: 0xB954, + 37228 - 11904: 0xB953, + 37230 - 11904: 0xE0AC, + 37231 - 11904: 0xE0AD, + 37232 - 11904: 0x9E71, + 37234 - 11904: 0xE473, + 37235 - 11904: 0xE475, + 37236 - 11904: 0xBBC6, + 37237 - 11904: 0xBBC3, + 37238 - 11904: 0x9E4A, + 37239 - 11904: 0xBBC5, + 37240 - 11904: 0xBBC4, + 37241 - 11904: 0xE474, + 37242 - 11904: 0xE472, + 37244 - 11904: 0x9FDC, + 37248 - 11904: 0xE861, + 37249 - 11904: 0xE85E, + 37250 - 11904: 0xE85F, + 37251 - 11904: 0xBE4D, + 37252 - 11904: 0xE860, + 37253 - 11904: 0xE85B, + 37254 - 11904: 0xE85C, + 37255 - 11904: 0xBE4A, + 37257 - 11904: 0xBE4B, + 37258 - 11904: 0xE85D, + 37259 - 11904: 0xBE4C, + 37260 - 11904: 0x89AB, + 37261 - 11904: 0xEBDB, + 37262 - 11904: 0x9FB8, + 37263 - 11904: 0xEBDC, + 37264 - 11904: 0xEBD9, + 37265 - 11904: 0xEBDA, + 37266 - 11904: 0xBFF4, + 37267 - 11904: 0xEBD8, + 37273 - 11904: 0xEEC8, + 37274 - 11904: 0xEEC5, + 37275 - 11904: 0xEEC7, + 37276 - 11904: 0xC1E0, + 37277 - 11904: 0xEECB, + 37278 - 11904: 0xC1DF, + 37279 - 11904: 0xEEC9, + 37280 - 11904: 0xEECC, + 37281 - 11904: 0xEECA, + 37282 - 11904: 0xEEC6, + 37283 - 11904: 0xC1DE, + 37285 - 11904: 0xF14F, + 37287 - 11904: 0xF150, + 37288 - 11904: 0xF14E, + 37289 - 11904: 0x9070, + 37290 - 11904: 0xF152, + 37291 - 11904: 0xC2E5, + 37292 - 11904: 0xC2E6, + 37293 - 11904: 0xF35F, + 37294 - 11904: 0xC3E7, + 37295 - 11904: 0xF151, + 37296 - 11904: 0xF35E, + 37297 - 11904: 0xC3E6, + 37298 - 11904: 0xF4E5, + 37299 - 11904: 0xF4E6, + 37300 - 11904: 0xC4BF, + 37301 - 11904: 0xF4E4, + 37302 - 11904: 0x8B63, + 37303 - 11904: 0xF4E3, + 37305 - 11904: 0xF65D, + 37306 - 11904: 0xC548, + 37307 - 11904: 0x95DC, + 37308 - 11904: 0xF849, + 37309 - 11904: 0xF8C8, + 37310 - 11904: 0xF8C7, + 37312 - 11904: 0xC643, + 37313 - 11904: 0xC65D, + 37314 - 11904: 0xF8C9, + 37315 - 11904: 0xF971, + 37316 - 11904: 0x9071, + 37317 - 11904: 0xC66F, + 37318 - 11904: 0xA8BC, + 37319 - 11904: 0xAAF6, + 37321 - 11904: 0xB956, + 37323 - 11904: 0xC4C0, + 37324 - 11904: 0xA8BD, + 37325 - 11904: 0xADAB, + 37326 - 11904: 0xB3A5, + 37327 - 11904: 0xB671, + 37328 - 11904: 0xC2E7, + 37329 - 11904: 0xAAF7, + 37331 - 11904: 0xD0C1, + 37332 - 11904: 0xD0C0, + 37333 - 11904: 0xD442, + 37334 - 11904: 0xFC5E, + 37335 - 11904: 0xB078, + 37336 - 11904: 0xB076, + 37337 - 11904: 0xB07A, + 37338 - 11904: 0xD444, + 37340 - 11904: 0xB079, + 37341 - 11904: 0xB077, + 37343 - 11904: 0x8949, + 37346 - 11904: 0xD443, + 37347 - 11904: 0xB3A8, + 37348 - 11904: 0xD7FC, + 37349 - 11904: 0x965B, + 37350 - 11904: 0xB3A7, + 37351 - 11904: 0xB3A9, + 37352 - 11904: 0xD842, + 37353 - 11904: 0xB3AB, + 37354 - 11904: 0xD7FE, + 37355 - 11904: 0xD840, + 37356 - 11904: 0xD7F7, + 37357 - 11904: 0xB3AA, + 37358 - 11904: 0xD843, + 37361 - 11904: 0xD7F9, + 37363 - 11904: 0xD7FA, + 37364 - 11904: 0xD7F8, + 37365 - 11904: 0xB3A6, + 37366 - 11904: 0x8C50, + 37367 - 11904: 0xD841, + 37368 - 11904: 0xD7FB, + 37369 - 11904: 0xD7FD, + 37370 - 11904: 0x94A6, + 37373 - 11904: 0xDC6D, + 37374 - 11904: 0x8FD5, + 37375 - 11904: 0xDC6C, + 37376 - 11904: 0xDC6A, + 37377 - 11904: 0xDC62, + 37378 - 11904: 0xDC71, + 37379 - 11904: 0xDC65, + 37380 - 11904: 0xDC6F, + 37381 - 11904: 0xDC76, + 37382 - 11904: 0xDC6E, + 37383 - 11904: 0xB679, + 37384 - 11904: 0x9E73, + 37385 - 11904: 0xB675, + 37386 - 11904: 0xDC63, + 37388 - 11904: 0xDC69, + 37389 - 11904: 0xB677, + 37390 - 11904: 0x9075, + 37391 - 11904: 0xDC68, + 37392 - 11904: 0xB678, + 37393 - 11904: 0xB67A, + 37394 - 11904: 0xDC6B, + 37395 - 11904: 0x99F7, + 37396 - 11904: 0xB672, + 37397 - 11904: 0xB673, + 37398 - 11904: 0xDC77, + 37399 - 11904: 0xDC75, + 37400 - 11904: 0x87B2, + 37401 - 11904: 0xDC74, + 37402 - 11904: 0xDC66, + 37404 - 11904: 0xDC72, + 37406 - 11904: 0xB676, + 37409 - 11904: 0x8CBF, + 37411 - 11904: 0xB674, + 37412 - 11904: 0xDC73, + 37413 - 11904: 0xDC64, + 37414 - 11904: 0xDC67, + 37415 - 11904: 0xDC70, + 37416 - 11904: 0x99F9, + 37418 - 11904: 0x9663, + 37419 - 11904: 0x95B9, + 37421 - 11904: 0xE4BA, + 37422 - 11904: 0xE0B7, + 37424 - 11904: 0xE0B0, + 37425 - 11904: 0xE0C3, + 37426 - 11904: 0xE0CC, + 37427 - 11904: 0xE0B3, + 37428 - 11904: 0xB961, + 37429 - 11904: 0x94D4, + 37430 - 11904: 0xE0C0, + 37431 - 11904: 0xB957, + 37432 - 11904: 0xB959, + 37433 - 11904: 0xB965, + 37434 - 11904: 0xE0B1, + 37436 - 11904: 0xFCFA, + 37437 - 11904: 0xB95A, + 37438 - 11904: 0xB95C, + 37439 - 11904: 0xB966, + 37440 - 11904: 0xB95B, + 37441 - 11904: 0x9077, + 37444 - 11904: 0x90AB, + 37445 - 11904: 0xB964, + 37446 - 11904: 0xE0B9, + 37448 - 11904: 0xE0AE, + 37449 - 11904: 0xB962, + 37450 - 11904: 0xE0B8, + 37451 - 11904: 0xB95E, + 37452 - 11904: 0xE0CA, + 37453 - 11904: 0xB963, + 37454 - 11904: 0xE0C8, + 37455 - 11904: 0xE0BC, + 37456 - 11904: 0xE0C6, + 37457 - 11904: 0xB960, + 37458 - 11904: 0xE0AF, + 37459 - 11904: 0xE0C9, + 37460 - 11904: 0xE0C4, + 37461 - 11904: 0x9D4D, + 37462 - 11904: 0xE0CB, + 37463 - 11904: 0xB958, + 37464 - 11904: 0x99FA, + 37466 - 11904: 0xB967, + 37467 - 11904: 0xB95D, + 37469 - 11904: 0x92E3, + 37470 - 11904: 0xE0B5, + 37471 - 11904: 0x97BB, + 37472 - 11904: 0xE0BD, + 37473 - 11904: 0xE0C1, + 37474 - 11904: 0x9078, + 37475 - 11904: 0xE0C5, + 37476 - 11904: 0xB95F, + 37477 - 11904: 0xE0B4, + 37478 - 11904: 0xE0B2, + 37479 - 11904: 0xE0BE, + 37483 - 11904: 0x99FB, + 37484 - 11904: 0xE0BB, + 37485 - 11904: 0xE0BA, + 37486 - 11904: 0x97E0, + 37487 - 11904: 0xE0BF, + 37488 - 11904: 0xE0C2, + 37490 - 11904: 0xE0C7, + 37494 - 11904: 0xE478, + 37495 - 11904: 0x96DC, + 37496 - 11904: 0xBBC7, + 37497 - 11904: 0xE4A4, + 37498 - 11904: 0xE47A, + 37499 - 11904: 0xBBCC, + 37500 - 11904: 0xBBD0, + 37501 - 11904: 0xE4AD, + 37502 - 11904: 0xE4B5, + 37503 - 11904: 0xE4A6, + 37504 - 11904: 0xBBC8, + 37505 - 11904: 0x9CA8, + 37506 - 11904: 0xE4AA, + 37507 - 11904: 0xE0B6, + 37508 - 11904: 0x9772, + 37509 - 11904: 0xBBC9, + 37510 - 11904: 0xE4B1, + 37511 - 11904: 0xE4B6, + 37512 - 11904: 0xE4AE, + 37513 - 11904: 0x9440, + 37514 - 11904: 0xE4B0, + 37515 - 11904: 0xE4B9, + 37516 - 11904: 0xE4B2, + 37517 - 11904: 0xE47E, + 37518 - 11904: 0xE4A9, + 37519 - 11904: 0x92F2, + 37521 - 11904: 0xBBD1, + 37523 - 11904: 0xBBCD, + 37524 - 11904: 0xE47C, + 37525 - 11904: 0xE4AB, + 37526 - 11904: 0xBBCB, + 37527 - 11904: 0xE4A5, + 37528 - 11904: 0xBBCA, + 37529 - 11904: 0xE4B3, + 37530 - 11904: 0xE4A2, + 37531 - 11904: 0xE479, + 37532 - 11904: 0xBBCE, + 37533 - 11904: 0xE4B8, + 37536 - 11904: 0xE47B, + 37537 - 11904: 0xE4AF, + 37538 - 11904: 0xE4AC, + 37539 - 11904: 0xE4A7, + 37540 - 11904: 0xE477, + 37541 - 11904: 0xE476, + 37542 - 11904: 0xE4A1, + 37543 - 11904: 0xE4B4, + 37544 - 11904: 0xBBCF, + 37545 - 11904: 0xE4B7, + 37546 - 11904: 0xE47D, + 37547 - 11904: 0xE4A3, + 37548 - 11904: 0xBE52, + 37550 - 11904: 0x99FD, + 37553 - 11904: 0x99FC, + 37554 - 11904: 0xBE5A, + 37555 - 11904: 0xBE55, + 37556 - 11904: 0xE8A4, + 37557 - 11904: 0xE8A1, + 37558 - 11904: 0xE867, + 37559 - 11904: 0xBE50, + 37561 - 11904: 0xF9D7, + 37562 - 11904: 0x964A, + 37563 - 11904: 0xBE4F, + 37564 - 11904: 0xBE56, + 37566 - 11904: 0x96D8, + 37567 - 11904: 0x99FE, + 37568 - 11904: 0xE865, + 37569 - 11904: 0xBE54, + 37570 - 11904: 0xE871, + 37571 - 11904: 0xE863, + 37572 - 11904: 0xE864, + 37573 - 11904: 0xBE4E, + 37574 - 11904: 0xE8A3, + 37575 - 11904: 0xBE58, + 37576 - 11904: 0xE874, + 37577 - 11904: 0xE879, + 37578 - 11904: 0xE873, + 37579 - 11904: 0xEBEE, + 37580 - 11904: 0xE86F, + 37581 - 11904: 0xE877, + 37582 - 11904: 0xE875, + 37583 - 11904: 0xE868, + 37584 - 11904: 0xE862, + 37585 - 11904: 0xE87D, + 37586 - 11904: 0xBE57, + 37587 - 11904: 0xE87E, + 37588 - 11904: 0x904B, + 37589 - 11904: 0xE878, + 37591 - 11904: 0xE86D, + 37592 - 11904: 0xE86B, + 37593 - 11904: 0xE866, + 37595 - 11904: 0xFA41, + 37597 - 11904: 0xE86E, + 37598 - 11904: 0xE87B, + 37599 - 11904: 0xE86A, + 37600 - 11904: 0xE87A, + 37601 - 11904: 0xE8A2, + 37603 - 11904: 0x9A40, + 37604 - 11904: 0xBE53, + 37605 - 11904: 0x975B, + 37606 - 11904: 0xE876, + 37607 - 11904: 0xE87C, + 37608 - 11904: 0xE872, + 37609 - 11904: 0xE86C, + 37610 - 11904: 0xBE51, + 37611 - 11904: 0x9A41, + 37612 - 11904: 0x91DD, + 37614 - 11904: 0xE4A8, + 37615 - 11904: 0xE870, + 37616 - 11904: 0xBE59, + 37617 - 11904: 0xE869, + 37618 - 11904: 0x93FC, + 37619 - 11904: 0x9A42, + 37620 - 11904: 0x9A43, + 37622 - 11904: 0x9659, + 37623 - 11904: 0xEBF4, + 37624 - 11904: 0xBFF7, + 37625 - 11904: 0xEBF3, + 37626 - 11904: 0xEBF0, + 37627 - 11904: 0xEC44, + 37628 - 11904: 0xBFFB, + 37629 - 11904: 0x9A44, + 37630 - 11904: 0xEC41, + 37631 - 11904: 0xEBF8, + 37632 - 11904: 0xEC43, + 37633 - 11904: 0xEBE9, + 37634 - 11904: 0xEBF6, + 37635 - 11904: 0x9051, + 37636 - 11904: 0xBFFD, + 37638 - 11904: 0xEBE1, + 37639 - 11904: 0x94BF, + 37640 - 11904: 0xEBDF, + 37641 - 11904: 0xEC42, + 37643 - 11904: 0xEC40, + 37644 - 11904: 0xEBFE, + 37645 - 11904: 0xEBED, + 37646 - 11904: 0xEBEC, + 37647 - 11904: 0xEBE2, + 37648 - 11904: 0xC040, + 37650 - 11904: 0xEBE8, + 37651 - 11904: 0xEBF2, + 37652 - 11904: 0xEBFD, + 37653 - 11904: 0xC043, + 37654 - 11904: 0xEC45, + 37656 - 11904: 0xC1E8, + 37657 - 11904: 0xC045, + 37658 - 11904: 0xBFFE, + 37659 - 11904: 0xEBE6, + 37661 - 11904: 0xEBEF, + 37662 - 11904: 0xEBDE, + 37663 - 11904: 0xEBE0, + 37664 - 11904: 0xBFF5, + 37665 - 11904: 0xC042, + 37666 - 11904: 0xBFFA, + 37667 - 11904: 0xEBE7, + 37668 - 11904: 0xEBF7, + 37669 - 11904: 0xEBF1, + 37670 - 11904: 0xC041, + 37671 - 11904: 0xEBDD, + 37672 - 11904: 0xC1E3, + 37673 - 11904: 0xEBF9, + 37674 - 11904: 0xEBFC, + 37675 - 11904: 0xBFFC, + 37676 - 11904: 0x90A2, + 37677 - 11904: 0xEBEB, + 37678 - 11904: 0xC044, + 37679 - 11904: 0xBFF9, + 37680 - 11904: 0x9CAB, + 37681 - 11904: 0x9776, + 37683 - 11904: 0xBFF8, + 37684 - 11904: 0xEBF5, + 37685 - 11904: 0xEBFB, + 37686 - 11904: 0xBFF6, + 37688 - 11904: 0xEBE4, + 37689 - 11904: 0xEBFA, + 37692 - 11904: 0xEBE5, + 37696 - 11904: 0xFC55, + 37697 - 11904: 0xFE45, + 37698 - 11904: 0x94A8, + 37699 - 11904: 0x9A45, + 37700 - 11904: 0xFA4B, + 37701 - 11904: 0x9DE1, + 37702 - 11904: 0xEBEA, + 37703 - 11904: 0xEED2, + 37704 - 11904: 0x96D9, + 37705 - 11904: 0xEED7, + 37706 - 11904: 0xC1E5, + 37707 - 11904: 0xC1E7, + 37708 - 11904: 0xEEDD, + 37709 - 11904: 0xC1E1, + 37710 - 11904: 0xEEEC, + 37711 - 11904: 0xEEE3, + 37712 - 11904: 0xEED8, + 37713 - 11904: 0xEED9, + 37714 - 11904: 0xEEE2, + 37716 - 11904: 0xC1EE, + 37717 - 11904: 0xEEE1, + 37718 - 11904: 0xEED1, + 37719 - 11904: 0xEEE0, + 37720 - 11904: 0xEED4, + 37721 - 11904: 0xEEED, + 37722 - 11904: 0xC1ED, + 37723 - 11904: 0xC1EB, + 37724 - 11904: 0xEED5, + 37726 - 11904: 0xEEE8, + 37727 - 11904: 0x9774, + 37728 - 11904: 0xEEDA, + 37729 - 11904: 0xEEE7, + 37730 - 11904: 0xFDF5, + 37731 - 11904: 0xEEE9, + 37732 - 11904: 0xEED0, + 37733 - 11904: 0xC1E6, + 37734 - 11904: 0x92E5, + 37735 - 11904: 0xEEEA, + 37736 - 11904: 0x9645, + 37737 - 11904: 0x91DA, + 37738 - 11904: 0xEEDE, + 37739 - 11904: 0x90A3, + 37740 - 11904: 0xC1EA, + 37741 - 11904: 0xEEDB, + 37742 - 11904: 0xA05F, + 37744 - 11904: 0xC1EC, + 37745 - 11904: 0xEEE4, + 37747 - 11904: 0x90AF, + 37748 - 11904: 0x97BF, + 37749 - 11904: 0xC1E4, + 37750 - 11904: 0xEED6, + 37751 - 11904: 0xEEE5, + 37752 - 11904: 0x914C, + 37753 - 11904: 0xEEDF, + 37754 - 11904: 0xEBE3, + 37755 - 11904: 0xEEE6, + 37756 - 11904: 0xEED3, + 37757 - 11904: 0x967A, + 37758 - 11904: 0xC1E9, + 37760 - 11904: 0xEEEB, + 37761 - 11904: 0x91DE, + 37762 - 11904: 0xC1E2, + 37763 - 11904: 0xEECE, + 37764 - 11904: 0x9A46, + 37765 - 11904: 0xFEB0, + 37766 - 11904: 0x9779, + 37767 - 11904: 0x946C, + 37768 - 11904: 0xF160, + 37769 - 11904: 0xF159, + 37770 - 11904: 0xC2E9, + 37772 - 11904: 0xF154, + 37773 - 11904: 0xF163, + 37774 - 11904: 0xF15B, + 37775 - 11904: 0xEEDC, + 37776 - 11904: 0x9858, + 37777 - 11904: 0xF165, + 37778 - 11904: 0xF155, + 37780 - 11904: 0xC2E8, + 37781 - 11904: 0xF15F, + 37782 - 11904: 0xC2EA, + 37783 - 11904: 0xC2F2, + 37784 - 11904: 0xC2F0, + 37785 - 11904: 0xF161, + 37786 - 11904: 0xC2F1, + 37787 - 11904: 0xF157, + 37788 - 11904: 0x9266, + 37789 - 11904: 0xF158, + 37790 - 11904: 0xF15D, + 37791 - 11904: 0xF162, + 37792 - 11904: 0x93FB, + 37793 - 11904: 0xEECD, + 37794 - 11904: 0xC2EB, + 37795 - 11904: 0xF16A, + 37796 - 11904: 0xF167, + 37797 - 11904: 0xF16B, + 37798 - 11904: 0xF15E, + 37799 - 11904: 0xF15A, + 37800 - 11904: 0xF168, + 37801 - 11904: 0xF36A, + 37802 - 11904: 0xF15C, + 37804 - 11904: 0xC2EE, + 37805 - 11904: 0x9A47, + 37806 - 11904: 0xC2ED, + 37807 - 11904: 0xEECF, + 37808 - 11904: 0xC2EF, + 37809 - 11904: 0xF164, + 37810 - 11904: 0xF166, + 37811 - 11904: 0xC2EC, + 37812 - 11904: 0xF169, + 37813 - 11904: 0xF153, + 37815 - 11904: 0xF156, + 37816 - 11904: 0x9749, + 37819 - 11904: 0x9748, + 37821 - 11904: 0x934A, + 37823 - 11904: 0x9CE2, + 37824 - 11904: 0xF373, + 37826 - 11904: 0xF363, + 37827 - 11904: 0xC3EB, + 37828 - 11904: 0xF371, + 37830 - 11904: 0x9264, + 37831 - 11904: 0xF361, + 37832 - 11904: 0xC3EC, + 37834 - 11904: 0xF36C, + 37835 - 11904: 0x91DF, + 37836 - 11904: 0xF368, + 37837 - 11904: 0xC3F1, + 37838 - 11904: 0xF372, + 37839 - 11904: 0xF362, + 37840 - 11904: 0xF365, + 37841 - 11904: 0xC3E9, + 37842 - 11904: 0xF374, + 37843 - 11904: 0xFB79, + 37844 - 11904: 0xF36D, + 37845 - 11904: 0xF370, + 37846 - 11904: 0xC3EF, + 37847 - 11904: 0xC3F4, + 37848 - 11904: 0xC3F2, + 37849 - 11904: 0xF369, + 37850 - 11904: 0xF364, + 37851 - 11904: 0x96D7, + 37852 - 11904: 0xC3ED, + 37853 - 11904: 0xC3EE, + 37854 - 11904: 0xF360, + 37855 - 11904: 0xC3EA, + 37856 - 11904: 0x9343, + 37857 - 11904: 0xC3E8, + 37858 - 11904: 0xC3F0, + 37859 - 11904: 0xF36F, + 37860 - 11904: 0xC3F3, + 37862 - 11904: 0xF36B, + 37863 - 11904: 0xF375, + 37864 - 11904: 0xC3F5, + 37868 - 11904: 0xF367, + 37870 - 11904: 0xF36E, + 37872 - 11904: 0xFDCB, + 37873 - 11904: 0xFE7A, + 37875 - 11904: 0x91DB, + 37876 - 11904: 0x8C6A, + 37877 - 11904: 0xF4F3, + 37878 - 11904: 0xF542, + 37879 - 11904: 0xF4F5, + 37880 - 11904: 0xF4FC, + 37881 - 11904: 0xF366, + 37882 - 11904: 0xF4FA, + 37883 - 11904: 0xF4E9, + 37884 - 11904: 0xF540, + 37885 - 11904: 0xC4C3, + 37886 - 11904: 0xF4ED, + 37887 - 11904: 0xF4FE, + 37888 - 11904: 0xF4F4, + 37889 - 11904: 0x97AF, + 37891 - 11904: 0xC4C2, + 37892 - 11904: 0x95DD, + 37894 - 11904: 0xF544, + 37895 - 11904: 0xF4F6, + 37896 - 11904: 0x9348, + 37897 - 11904: 0xF4FB, + 37898 - 11904: 0xF4FD, + 37899 - 11904: 0xF4E7, + 37900 - 11904: 0xF541, + 37901 - 11904: 0xF4F2, + 37902 - 11904: 0xF4F7, + 37903 - 11904: 0xF4EB, + 37904 - 11904: 0xF4EF, + 37905 - 11904: 0xF543, + 37906 - 11904: 0xF4F9, + 37907 - 11904: 0xF4E8, + 37908 - 11904: 0xF4EC, + 37909 - 11904: 0xF4EE, + 37910 - 11904: 0xF4F8, + 37911 - 11904: 0x9A4B, + 37912 - 11904: 0xC4C1, + 37913 - 11904: 0xF4F1, + 37915 - 11904: 0xFC45, + 37917 - 11904: 0x9A4D, + 37920 - 11904: 0xF4EA, + 37924 - 11904: 0x91BC, + 37925 - 11904: 0x90E2, + 37926 - 11904: 0x90B4, + 37927 - 11904: 0x95E1, + 37928 - 11904: 0xF4F0, + 37929 - 11904: 0xF661, + 37930 - 11904: 0xF666, + 37931 - 11904: 0xC54F, + 37932 - 11904: 0xF668, + 37933 - 11904: 0x9A4E, + 37934 - 11904: 0xC549, + 37935 - 11904: 0x87AD, + 37936 - 11904: 0xF664, + 37937 - 11904: 0xF66A, + 37938 - 11904: 0xC54E, + 37939 - 11904: 0xC54A, + 37941 - 11904: 0xC54B, + 37942 - 11904: 0xF660, + 37943 - 11904: 0xF667, + 37944 - 11904: 0xC54D, + 37945 - 11904: 0xF665, + 37946 - 11904: 0xC54C, + 37947 - 11904: 0xF65F, + 37948 - 11904: 0xF663, + 37949 - 11904: 0xF662, + 37950 - 11904: 0x9A4F, + 37951 - 11904: 0xF65E, + 37952 - 11904: 0xF669, + 37954 - 11904: 0xFE40, + 37955 - 11904: 0xFE43, + 37956 - 11904: 0xC5B1, + 37957 - 11904: 0xF76D, + 37958 - 11904: 0xF770, + 37959 - 11904: 0xF76C, + 37960 - 11904: 0xF76E, + 37961 - 11904: 0xF76F, + 37962 - 11904: 0xF769, + 37963 - 11904: 0xF76A, + 37964 - 11904: 0xF767, + 37965 - 11904: 0x96DD, + 37967 - 11904: 0xF76B, + 37968 - 11904: 0xF768, + 37969 - 11904: 0xC5B2, + 37970 - 11904: 0xC5B3, + 37972 - 11904: 0x9A51, + 37973 - 11904: 0xF84B, + 37975 - 11904: 0xF84D, + 37976 - 11904: 0x96A7, + 37979 - 11904: 0x90B0, + 37981 - 11904: 0xF84C, + 37982 - 11904: 0xF84E, + 37984 - 11904: 0xC5E0, + 37986 - 11904: 0xF84A, + 37987 - 11904: 0xC5DF, + 37988 - 11904: 0xC5E1, + 37989 - 11904: 0x9C4E, + 37991 - 11904: 0x9443, + 37992 - 11904: 0xF8CB, + 37993 - 11904: 0xF8CC, + 37994 - 11904: 0xC644, + 37995 - 11904: 0xF8CA, + 37996 - 11904: 0x8EBA, + 37997 - 11904: 0xF953, + 37998 - 11904: 0xF952, + 37999 - 11904: 0xF954, + 38000 - 11904: 0xC65F, + 38001 - 11904: 0xF955, + 38002 - 11904: 0xC65E, + 38003 - 11904: 0xF956, + 38004 - 11904: 0xF972, + 38005 - 11904: 0xF975, + 38006 - 11904: 0xF974, + 38007 - 11904: 0xC668, + 38008 - 11904: 0xF973, + 38009 - 11904: 0x9A52, + 38011 - 11904: 0xFCC1, + 38012 - 11904: 0xC672, + 38013 - 11904: 0xC670, + 38014 - 11904: 0xC671, + 38015 - 11904: 0xC677, + 38016 - 11904: 0xF9C0, + 38017 - 11904: 0xF9C1, + 38018 - 11904: 0xF9BF, + 38019 - 11904: 0xF9C9, + 38021 - 11904: 0x8BE9, + 38047 - 11904: 0x9CAF, + 38050 - 11904: 0x8BFD, + 38081 - 11904: 0x9ABC, + 38083 - 11904: 0x9AB8, + 38108 - 11904: 0x9AAE, + 38134 - 11904: 0x9AA7, + 38189 - 11904: 0x9A53, + 38215 - 11904: 0x9D74, + 38263 - 11904: 0xAAF8, + 38264 - 11904: 0x8BEA, + 38266 - 11904: 0xD844, + 38267 - 11904: 0xDC78, + 38268 - 11904: 0xE8A5, + 38269 - 11904: 0xF376, + 38271 - 11904: 0x8BEB, + 38272 - 11904: 0xAAF9, + 38274 - 11904: 0xADAC, + 38275 - 11904: 0xB07B, + 38277 - 11904: 0x90B2, + 38278 - 11904: 0xD845, + 38280 - 11904: 0xD846, + 38281 - 11904: 0xB3AC, + 38283 - 11904: 0xB67D, + 38284 - 11904: 0xDC7A, + 38285 - 11904: 0xDC79, + 38286 - 11904: 0xB6A3, + 38287 - 11904: 0xB67C, + 38288 - 11904: 0xDC7B, + 38289 - 11904: 0xB67E, + 38290 - 11904: 0xB6A2, + 38291 - 11904: 0xB6A1, + 38292 - 11904: 0xB67B, + 38294 - 11904: 0x95E9, + 38295 - 11904: 0x95E8, + 38296 - 11904: 0xB968, + 38297 - 11904: 0x95E6, + 38299 - 11904: 0xE0D0, + 38300 - 11904: 0xE0CE, + 38302 - 11904: 0xE0CF, + 38303 - 11904: 0xE0CD, + 38304 - 11904: 0x90B5, + 38305 - 11904: 0xBBD2, + 38306 - 11904: 0x9A54, + 38307 - 11904: 0xBBD5, + 38308 - 11904: 0xBBD7, + 38309 - 11904: 0xBBD6, + 38310 - 11904: 0x90B3, + 38311 - 11904: 0x95E7, + 38312 - 11904: 0xBBD3, + 38313 - 11904: 0xBBD4, + 38314 - 11904: 0x8B50, + 38315 - 11904: 0xE8A7, + 38316 - 11904: 0xE8A6, + 38317 - 11904: 0xBE5B, + 38318 - 11904: 0xE8A8, + 38320 - 11904: 0xE8A9, + 38321 - 11904: 0xBE5C, + 38325 - 11904: 0xEC4D, + 38326 - 11904: 0xEC4B, + 38327 - 11904: 0xEEF3, + 38329 - 11904: 0xEC49, + 38330 - 11904: 0xEC4A, + 38331 - 11904: 0xC046, + 38332 - 11904: 0xEC46, + 38333 - 11904: 0xEC4E, + 38334 - 11904: 0xEC48, + 38335 - 11904: 0xEC4C, + 38336 - 11904: 0xEEEF, + 38339 - 11904: 0xEEF1, + 38341 - 11904: 0xEEF2, + 38342 - 11904: 0xC1F3, + 38343 - 11904: 0xEEEE, + 38344 - 11904: 0xC1F2, + 38345 - 11904: 0xEEF0, + 38346 - 11904: 0xC1EF, + 38347 - 11904: 0xC1F0, + 38348 - 11904: 0xC1F1, + 38349 - 11904: 0xEC47, + 38352 - 11904: 0xC2F5, + 38353 - 11904: 0xF16E, + 38354 - 11904: 0xF16C, + 38355 - 11904: 0xF16D, + 38356 - 11904: 0xC2F3, + 38357 - 11904: 0xC2F6, + 38358 - 11904: 0xC2F4, + 38362 - 11904: 0xF377, + 38363 - 11904: 0xF378, + 38364 - 11904: 0xC3F6, + 38366 - 11904: 0xF545, + 38367 - 11904: 0xF547, + 38368 - 11904: 0xF546, + 38369 - 11904: 0xC4C4, + 38370 - 11904: 0xC550, + 38371 - 11904: 0xF66D, + 38372 - 11904: 0xF66C, + 38373 - 11904: 0xF66B, + 38376 - 11904: 0x8BEC, + 38388 - 11904: 0x9A56, + 38428 - 11904: 0xAAFA, + 38429 - 11904: 0x8BFB, + 38430 - 11904: 0xC9AA, + 38432 - 11904: 0xCA58, + 38433 - 11904: 0xA6E9, + 38434 - 11904: 0xCA56, + 38435 - 11904: 0xCA59, + 38436 - 11904: 0xCA57, + 38440 - 11904: 0xCBAE, + 38442 - 11904: 0xA8C1, + 38444 - 11904: 0xA8C2, + 38445 - 11904: 0xCBB0, + 38446 - 11904: 0xA8BF, + 38447 - 11904: 0xCBAF, + 38448 - 11904: 0xCBAD, + 38449 - 11904: 0xA8C0, + 38450 - 11904: 0xA8BE, + 38451 - 11904: 0x9A57, + 38456 - 11904: 0xA0AA, + 38457 - 11904: 0xCDD8, + 38458 - 11904: 0xCDDB, + 38459 - 11904: 0xAAFD, + 38460 - 11904: 0xCDDA, + 38461 - 11904: 0xCDD9, + 38463 - 11904: 0xAAFC, + 38464 - 11904: 0xAAFB, + 38465 - 11904: 0x9FA6, + 38466 - 11904: 0xAB40, + 38467 - 11904: 0xCDDC, + 38468 - 11904: 0xAAFE, + 38469 - 11904: 0x99CC, + 38474 - 11904: 0xD0C6, + 38475 - 11904: 0xADAE, + 38476 - 11904: 0xADAF, + 38477 - 11904: 0xADB0, + 38478 - 11904: 0xD0C7, + 38479 - 11904: 0xD0C3, + 38480 - 11904: 0xADAD, + 38481 - 11904: 0xD0C4, + 38483 - 11904: 0xD0C5, + 38484 - 11904: 0xD0C2, + 38486 - 11904: 0x9C59, + 38488 - 11904: 0xB0A4, + 38491 - 11904: 0xB0A1, + 38492 - 11904: 0xD445, + 38493 - 11904: 0xB0A2, + 38494 - 11904: 0xB0A5, + 38495 - 11904: 0xD446, + 38497 - 11904: 0xB07E, + 38498 - 11904: 0xB07C, + 38499 - 11904: 0xB07D, + 38500 - 11904: 0xB0A3, + 38505 - 11904: 0x99B5, + 38506 - 11904: 0xB3AD, + 38507 - 11904: 0xD849, + 38508 - 11904: 0xB3B5, + 38509 - 11904: 0xD848, + 38511 - 11904: 0xD84B, + 38512 - 11904: 0xB3B1, + 38513 - 11904: 0xD84A, + 38514 - 11904: 0xB6AB, + 38515 - 11904: 0xB3AF, + 38516 - 11904: 0xB3B2, + 38517 - 11904: 0xB3AE, + 38518 - 11904: 0xB3B3, + 38519 - 11904: 0xB3B4, + 38520 - 11904: 0xB3B0, + 38523 - 11904: 0x90BE, + 38524 - 11904: 0xD847, + 38525 - 11904: 0xB6A7, + 38526 - 11904: 0xDC7D, + 38528 - 11904: 0xDCA3, + 38529 - 11904: 0x9FAF, + 38531 - 11904: 0xDCA2, + 38532 - 11904: 0xB6AC, + 38533 - 11904: 0xB6A8, + 38534 - 11904: 0xB6A9, + 38535 - 11904: 0xDC7C, + 38536 - 11904: 0xDC7E, + 38537 - 11904: 0xDCA1, + 38538 - 11904: 0xB6A4, + 38539 - 11904: 0xB6A6, + 38541 - 11904: 0xB6AA, + 38542 - 11904: 0xB6A5, + 38543 - 11904: 0x95F2, + 38545 - 11904: 0xE0D3, + 38546 - 11904: 0xE0D1, + 38547 - 11904: 0xE0D2, + 38548 - 11904: 0xB96A, + 38549 - 11904: 0xB96B, + 38550 - 11904: 0x90BF, + 38551 - 11904: 0xE0D4, + 38552 - 11904: 0xB969, + 38553 - 11904: 0xBBD8, + 38555 - 11904: 0xBBDA, + 38556 - 11904: 0xBBD9, + 38558 - 11904: 0xE4BB, + 38561 - 11904: 0xE4BC, + 38562 - 11904: 0xE8AB, + 38563 - 11904: 0x90C1, + 38564 - 11904: 0xE8AA, + 38565 - 11904: 0xFEE4, + 38567 - 11904: 0xC047, + 38568 - 11904: 0xC048, + 38569 - 11904: 0xEC4F, + 38570 - 11904: 0xC049, + 38572 - 11904: 0xEEF6, + 38574 - 11904: 0xEEF4, + 38576 - 11904: 0xEEF5, + 38577 - 11904: 0xC1F4, + 38579 - 11904: 0xF16F, + 38580 - 11904: 0xC3F7, + 38582 - 11904: 0xC6D7, + 38584 - 11904: 0xC1F5, + 38585 - 11904: 0xAB41, + 38587 - 11904: 0xB0A6, + 38588 - 11904: 0xD447, + 38589 - 11904: 0x90C7, + 38591 - 11904: 0xD84C, + 38592 - 11904: 0xB3B6, + 38593 - 11904: 0xB6AD, + 38594 - 11904: 0xDCA4, + 38595 - 11904: 0xDCA6, + 38596 - 11904: 0xB6AF, + 38597 - 11904: 0xB6AE, + 38598 - 11904: 0xB6B0, + 38599 - 11904: 0xB6B1, + 38600 - 11904: 0xDCA5, + 38601 - 11904: 0xB96E, + 38602 - 11904: 0xB96F, + 38603 - 11904: 0xB96D, + 38604 - 11904: 0xBBDB, + 38605 - 11904: 0xB96C, + 38606 - 11904: 0xE0D5, + 38610 - 11904: 0xBBDC, + 38611 - 11904: 0xE8AC, + 38612 - 11904: 0xEC50, + 38613 - 11904: 0xC04A, + 38614 - 11904: 0xC1F6, + 38615 - 11904: 0xF170, + 38616 - 11904: 0xF174, + 38617 - 11904: 0xC2F9, + 38618 - 11904: 0xF171, + 38619 - 11904: 0xC2FA, + 38620 - 11904: 0xC2F8, + 38621 - 11904: 0xF175, + 38622 - 11904: 0xC2FB, + 38623 - 11904: 0xF173, + 38625 - 11904: 0xF379, + 38626 - 11904: 0xC2F7, + 38627 - 11904: 0xC3F8, + 38629 - 11904: 0xF8CD, + 38632 - 11904: 0xAB42, + 38633 - 11904: 0xB3B8, + 38634 - 11904: 0xB3B7, + 38639 - 11904: 0xB6B2, + 38640 - 11904: 0xDCA8, + 38641 - 11904: 0xDCA7, + 38642 - 11904: 0xB6B3, + 38644 - 11904: 0x92E4, + 38645 - 11904: 0xE0D9, + 38646 - 11904: 0xB973, + 38647 - 11904: 0xB970, + 38648 - 11904: 0xE0D8, + 38649 - 11904: 0xB972, + 38650 - 11904: 0xE0D6, + 38651 - 11904: 0xB971, + 38653 - 11904: 0xE0D7, + 38655 - 11904: 0xE4BD, + 38656 - 11904: 0xBBDD, + 38658 - 11904: 0xE8AF, + 38659 - 11904: 0x9F52, + 38660 - 11904: 0xBE5D, + 38661 - 11904: 0xE8AD, + 38662 - 11904: 0xBE5E, + 38663 - 11904: 0xBE5F, + 38664 - 11904: 0xE8AE, + 38665 - 11904: 0xBE60, + 38667 - 11904: 0xEC51, + 38669 - 11904: 0xC04E, + 38670 - 11904: 0xC04B, + 38671 - 11904: 0xC050, + 38672 - 11904: 0xEC53, + 38673 - 11904: 0xC04C, + 38674 - 11904: 0xEC52, + 38675 - 11904: 0xC04F, + 38678 - 11904: 0xC04D, + 38680 - 11904: 0xEEF9, + 38681 - 11904: 0xEEFB, + 38683 - 11904: 0x90DB, + 38684 - 11904: 0xC1F7, + 38685 - 11904: 0xEEFA, + 38686 - 11904: 0xC1F8, + 38687 - 11904: 0xEEF8, + 38688 - 11904: 0xEEF7, + 38689 - 11904: 0xA066, + 38690 - 11904: 0xF177, + 38691 - 11904: 0xF176, + 38692 - 11904: 0xC2FC, + 38693 - 11904: 0xF178, + 38694 - 11904: 0xF37E, + 38695 - 11904: 0xC3FA, + 38696 - 11904: 0xF37D, + 38697 - 11904: 0xF37A, + 38698 - 11904: 0xC3F9, + 38699 - 11904: 0xF37B, + 38700 - 11904: 0xF37C, + 38702 - 11904: 0xF548, + 38703 - 11904: 0xF549, + 38704 - 11904: 0xC4C5, + 38705 - 11904: 0x90D2, + 38706 - 11904: 0xC553, + 38708 - 11904: 0x876B, + 38709 - 11904: 0xF66E, + 38710 - 11904: 0x90D4, + 38712 - 11904: 0xC551, + 38713 - 11904: 0xC552, + 38714 - 11904: 0xF66F, + 38717 - 11904: 0xC5B4, + 38718 - 11904: 0xC5B5, + 38719 - 11904: 0xF771, + 38720 - 11904: 0x9A5B, + 38721 - 11904: 0x95FD, + 38722 - 11904: 0xC645, + 38723 - 11904: 0xF8CF, + 38724 - 11904: 0xC647, + 38726 - 11904: 0xF8CE, + 38727 - 11904: 0xF8D0, + 38728 - 11904: 0xC646, + 38729 - 11904: 0xF957, + 38730 - 11904: 0x87B1, + 38731 - 11904: 0xF9AD, + 38737 - 11904: 0x8BC4, + 38738 - 11904: 0xAB43, + 38741 - 11904: 0x8C66, + 38742 - 11904: 0xB974, + 38743 - 11904: 0x90DE, + 38744 - 11904: 0xE4BE, + 38746 - 11904: 0xE8B0, + 38747 - 11904: 0xC051, + 38748 - 11904: 0xC052, + 38749 - 11904: 0x9CE4, + 38750 - 11904: 0xAB44, + 38751 - 11904: 0x90E1, + 38752 - 11904: 0xBE61, + 38753 - 11904: 0xC3FB, + 38754 - 11904: 0xADB1, + 38758 - 11904: 0xC053, + 38760 - 11904: 0xC5E2, + 38761 - 11904: 0xADB2, + 38762 - 11904: 0xD84D, + 38764 - 11904: 0xDCA9, + 38765 - 11904: 0x9E46, + 38766 - 11904: 0xDCAB, + 38768 - 11904: 0xDCAA, + 38769 - 11904: 0x9651, + 38770 - 11904: 0xE0DD, + 38771 - 11904: 0xE0DA, + 38772 - 11904: 0xB975, + 38774 - 11904: 0xB976, + 38775 - 11904: 0xE0DB, + 38776 - 11904: 0xE0DC, + 38778 - 11904: 0xE4C0, + 38779 - 11904: 0xE4C5, + 38780 - 11904: 0xBBDE, + 38781 - 11904: 0xE4BF, + 38782 - 11904: 0xE4C1, + 38783 - 11904: 0xE4C8, + 38784 - 11904: 0xE4C3, + 38785 - 11904: 0xE4C7, + 38786 - 11904: 0xE4C4, + 38787 - 11904: 0xE4C2, + 38788 - 11904: 0xE4C6, + 38789 - 11904: 0xBBDF, + 38791 - 11904: 0xFB58, + 38792 - 11904: 0xE8B3, + 38793 - 11904: 0x90E6, + 38794 - 11904: 0xE8B1, + 38795 - 11904: 0xBE63, + 38797 - 11904: 0xBE62, + 38798 - 11904: 0xE8B2, + 38799 - 11904: 0xBE64, + 38804 - 11904: 0xEC56, + 38807 - 11904: 0xEC55, + 38808 - 11904: 0xC054, + 38809 - 11904: 0xEC54, + 38810 - 11904: 0xEEFC, + 38811 - 11904: 0x9650, + 38812 - 11904: 0xEEFE, + 38813 - 11904: 0xEF41, + 38814 - 11904: 0xEF40, + 38815 - 11904: 0x90E7, + 38816 - 11904: 0xC1F9, + 38817 - 11904: 0xEEFD, + 38818 - 11904: 0xF1A1, + 38819 - 11904: 0xC2FD, + 38820 - 11904: 0xF17D, + 38821 - 11904: 0xF1A2, + 38822 - 11904: 0xC2FE, + 38824 - 11904: 0xF17B, + 38826 - 11904: 0xF17E, + 38827 - 11904: 0xF17C, + 38828 - 11904: 0xF179, + 38829 - 11904: 0xC340, + 38830 - 11904: 0xF17A, + 38833 - 11904: 0x90E8, + 38834 - 11904: 0x9A5D, + 38835 - 11904: 0xF3A1, + 38836 - 11904: 0x9F7A, + 38838 - 11904: 0xF3A3, + 38839 - 11904: 0xF3A2, + 38840 - 11904: 0x9B5C, + 38841 - 11904: 0xF54A, + 38842 - 11904: 0x9F7C, + 38843 - 11904: 0xF54B, + 38845 - 11904: 0xFC52, + 38846 - 11904: 0x90E9, + 38847 - 11904: 0xF670, + 38848 - 11904: 0x90EA, + 38849 - 11904: 0xC5B7, + 38850 - 11904: 0x9A5E, + 38851 - 11904: 0xC5B6, + 38852 - 11904: 0xF84F, + 38853 - 11904: 0xF850, + 38854 - 11904: 0xC648, + 38855 - 11904: 0xF8D1, + 38856 - 11904: 0x9F76, + 38857 - 11904: 0xC669, + 38859 - 11904: 0xADB3, + 38860 - 11904: 0xB6B4, + 38861 - 11904: 0xE4CA, + 38862 - 11904: 0xE4C9, + 38863 - 11904: 0xE8B5, + 38864 - 11904: 0xE8B4, + 38866 - 11904: 0x90EB, + 38867 - 11904: 0xC1FA, + 38868 - 11904: 0xEF43, + 38869 - 11904: 0xEF42, + 38870 - 11904: 0xF1A5, + 38871 - 11904: 0xF1A3, + 38872 - 11904: 0xF1A6, + 38873 - 11904: 0xF1A4, + 38876 - 11904: 0xC3FC, + 38877 - 11904: 0xF3A4, + 38878 - 11904: 0xF3A5, + 38879 - 11904: 0xF3A6, + 38880 - 11904: 0x90EC, + 38881 - 11904: 0xF671, + 38883 - 11904: 0xF772, + 38885 - 11904: 0xF8D2, + 38886 - 11904: 0x8BEE, + 38893 - 11904: 0xADB4, + 38894 - 11904: 0x90EE, + 38896 - 11904: 0xEC57, + 38897 - 11904: 0xEF44, + 38898 - 11904: 0x91C6, + 38899 - 11904: 0xADB5, + 38901 - 11904: 0x90F2, + 38902 - 11904: 0xBBE0, + 38904 - 11904: 0xEC58, + 38905 - 11904: 0xC341, + 38906 - 11904: 0xF1A7, + 38907 - 11904: 0xC3FD, + 38909 - 11904: 0xF54C, + 38910 - 11904: 0xF54D, + 38911 - 11904: 0xC554, + 38912 - 11904: 0xF851, + 38913 - 11904: 0xADB6, + 38914 - 11904: 0xB3BB, + 38915 - 11904: 0xB3BC, + 38916 - 11904: 0xD84E, + 38917 - 11904: 0xB6B5, + 38918 - 11904: 0xB6B6, + 38919 - 11904: 0xDCAC, + 38920 - 11904: 0xB6B7, + 38922 - 11904: 0xB97A, + 38924 - 11904: 0xB97C, + 38925 - 11904: 0xE0DF, + 38926 - 11904: 0xE0E0, + 38927 - 11904: 0xE0DE, + 38928 - 11904: 0xB977, + 38929 - 11904: 0xB978, + 38930 - 11904: 0xB97B, + 38931 - 11904: 0xB979, + 38932 - 11904: 0xFCBC, + 38933 - 11904: 0x8A74, + 38934 - 11904: 0xE4CB, + 38935 - 11904: 0xBBE1, + 38936 - 11904: 0xBBE2, + 38939 - 11904: 0xE8BC, + 38940 - 11904: 0xBE67, + 38941 - 11904: 0xE8B7, + 38942 - 11904: 0xE8B6, + 38943 - 11904: 0x9657, + 38944 - 11904: 0xE8BB, + 38945 - 11904: 0xBE65, + 38947 - 11904: 0x9CEF, + 38948 - 11904: 0xC05B, + 38950 - 11904: 0xE8B8, + 38951 - 11904: 0xE8BD, + 38952 - 11904: 0xE8BA, + 38953 - 11904: 0xE8B9, + 38955 - 11904: 0xBE66, + 38957 - 11904: 0xC059, + 38958 - 11904: 0x9FDF, + 38959 - 11904: 0xEC5A, + 38960 - 11904: 0xC055, + 38962 - 11904: 0xEC5B, + 38963 - 11904: 0x90F7, + 38964 - 11904: 0x90F6, + 38965 - 11904: 0xEC59, + 38967 - 11904: 0xC058, + 38968 - 11904: 0xC056, + 38969 - 11904: 0xC05A, + 38971 - 11904: 0xC057, + 38977 - 11904: 0xEF45, + 38979 - 11904: 0xEF4A, + 38980 - 11904: 0xEF46, + 38981 - 11904: 0xEF49, + 38982 - 11904: 0xC1FB, + 38983 - 11904: 0x9B5E, + 38984 - 11904: 0xEDD4, + 38985 - 11904: 0xEF48, + 38986 - 11904: 0xEF47, + 38987 - 11904: 0x90F8, + 38988 - 11904: 0xC344, + 38989 - 11904: 0xC342, + 38990 - 11904: 0xC345, + 38991 - 11904: 0xC343, + 38992 - 11904: 0xF1A8, + 38993 - 11904: 0xF1A9, + 38994 - 11904: 0xF1AA, + 38995 - 11904: 0xC346, + 38998 - 11904: 0x8CFC, + 38999 - 11904: 0xF3AA, + 39000 - 11904: 0xC440, + 39001 - 11904: 0xF3A8, + 39003 - 11904: 0xC441, + 39004 - 11904: 0xF3A7, + 39005 - 11904: 0xF3A9, + 39006 - 11904: 0xC3FE, + 39007 - 11904: 0xF551, + 39008 - 11904: 0xF54E, + 39010 - 11904: 0xF54F, + 39011 - 11904: 0xF550, + 39012 - 11904: 0xF672, + 39013 - 11904: 0xC556, + 39014 - 11904: 0x90F9, + 39015 - 11904: 0xC555, + 39016 - 11904: 0x8CC9, + 39017 - 11904: 0xF774, + 39018 - 11904: 0xF773, + 39019 - 11904: 0xC5B8, + 39020 - 11904: 0xFA6A, + 39023 - 11904: 0xC5E3, + 39024 - 11904: 0xC649, + 39025 - 11904: 0xC660, + 39026 - 11904: 0xF958, + 39027 - 11904: 0xF9AE, + 39028 - 11904: 0xF9AF, + 39029 - 11904: 0x8BEF, + 39080 - 11904: 0xADB7, + 39081 - 11904: 0xDCAD, + 39084 - 11904: 0xE0E1, + 39085 - 11904: 0xE4CC, + 39086 - 11904: 0xE4CD, + 39087 - 11904: 0xBBE3, + 39089 - 11904: 0xBBE4, + 39090 - 11904: 0xE8BE, + 39091 - 11904: 0xBE68, + 39092 - 11904: 0x9FE0, + 39094 - 11904: 0xC1FC, + 39095 - 11904: 0x9142, + 39096 - 11904: 0xF1AB, + 39097 - 11904: 0x9A62, + 39098 - 11904: 0xC347, + 39099 - 11904: 0xF3AD, + 39100 - 11904: 0xC442, + 39101 - 11904: 0xF3AC, + 39102 - 11904: 0xF3AE, + 39103 - 11904: 0xF3AB, + 39104 - 11904: 0xF675, + 39105 - 11904: 0xF552, + 39106 - 11904: 0xF553, + 39107 - 11904: 0x9569, + 39108 - 11904: 0xC4C6, + 39110 - 11904: 0xF674, + 39111 - 11904: 0x9144, + 39112 - 11904: 0x9143, + 39113 - 11904: 0xF673, + 39114 - 11904: 0x9141, + 39115 - 11904: 0xF775, + 39116 - 11904: 0xF9B0, + 39118 - 11904: 0x8BF0, + 39131 - 11904: 0xADB8, + 39132 - 11904: 0x9660, + 39134 - 11904: 0x8BF1, + 39135 - 11904: 0xADB9, + 39136 - 11904: 0x99F6, + 39137 - 11904: 0x9149, + 39138 - 11904: 0xB0A7, + 39139 - 11904: 0xD448, + 39141 - 11904: 0xD84F, + 39142 - 11904: 0x914A, + 39143 - 11904: 0xB6B8, + 39145 - 11904: 0xB6BB, + 39146 - 11904: 0xB6B9, + 39147 - 11904: 0xDCAE, + 39148 - 11904: 0x914B, + 39149 - 11904: 0xB6BD, + 39151 - 11904: 0xB6BA, + 39153 - 11904: 0x9A64, + 39154 - 11904: 0xB6BC, + 39156 - 11904: 0xB97E, + 39157 - 11904: 0x8ABF, + 39158 - 11904: 0xE0E2, + 39161 - 11904: 0xE0E3, + 39162 - 11904: 0xE8C0, + 39164 - 11904: 0xB97D, + 39165 - 11904: 0xB9A1, + 39166 - 11904: 0xB9A2, + 39168 - 11904: 0xE4CF, + 39170 - 11904: 0xE4CE, + 39171 - 11904: 0xBBE5, + 39173 - 11904: 0xBBE6, + 39175 - 11904: 0xE4D0, + 39176 - 11904: 0xE8BF, + 39177 - 11904: 0xBBE8, + 39178 - 11904: 0xBE69, + 39180 - 11904: 0xBBE7, + 39182 - 11904: 0x9A66, + 39184 - 11904: 0xC05C, + 39185 - 11904: 0xE8C1, + 39186 - 11904: 0xBE6B, + 39187 - 11904: 0xBE6A, + 39188 - 11904: 0xE8C2, + 39189 - 11904: 0xE8C5, + 39190 - 11904: 0xE8C3, + 39191 - 11904: 0xE8C4, + 39192 - 11904: 0xBE6C, + 39193 - 11904: 0x9A67, + 39194 - 11904: 0xC061, + 39195 - 11904: 0xC05F, + 39196 - 11904: 0x9A69, + 39198 - 11904: 0xC05E, + 39199 - 11904: 0xEC5D, + 39201 - 11904: 0xC060, + 39204 - 11904: 0xEC5C, + 39205 - 11904: 0xEF4B, + 39207 - 11904: 0xEC5E, + 39208 - 11904: 0xC05D, + 39209 - 11904: 0xEC5F, + 39210 - 11904: 0xEF4E, + 39211 - 11904: 0xEF4C, + 39212 - 11904: 0xEF4D, + 39213 - 11904: 0xEF52, + 39214 - 11904: 0xC34B, + 39215 - 11904: 0xEF51, + 39216 - 11904: 0xEF54, + 39217 - 11904: 0xEF53, + 39218 - 11904: 0xEF50, + 39219 - 11904: 0xEF4F, + 39221 - 11904: 0xC1FD, + 39223 - 11904: 0x9A6A, + 39224 - 11904: 0x9652, + 39225 - 11904: 0x914D, + 39226 - 11904: 0xF1AE, + 39227 - 11904: 0x9666, + 39228 - 11904: 0xF1AD, + 39229 - 11904: 0xC34A, + 39230 - 11904: 0xC348, + 39231 - 11904: 0xC349, + 39232 - 11904: 0x9F7B, + 39233 - 11904: 0xF1AC, + 39234 - 11904: 0x9A6B, + 39235 - 11904: 0xF3B1, + 39237 - 11904: 0xC443, + 39239 - 11904: 0xF3B0, + 39240 - 11904: 0xF3AF, + 39241 - 11904: 0xC444, + 39242 - 11904: 0xA06C, + 39243 - 11904: 0xF558, + 39244 - 11904: 0xF557, + 39245 - 11904: 0x9667, + 39246 - 11904: 0xF555, + 39248 - 11904: 0xF554, + 39249 - 11904: 0xC4C8, + 39250 - 11904: 0xC4C7, + 39251 - 11904: 0xF559, + 39252 - 11904: 0xF776, + 39253 - 11904: 0xC5B9, + 39254 - 11904: 0xF677, + 39255 - 11904: 0xC557, + 39256 - 11904: 0xF676, + 39257 - 11904: 0xF556, + 39259 - 11904: 0xF777, + 39260 - 11904: 0xC5E4, + 39261 - 11904: 0x9A6C, + 39262 - 11904: 0xC661, + 39263 - 11904: 0xF959, + 39265 - 11904: 0xF9B1, + 39266 - 11904: 0x9A6D, + 39267 - 11904: 0x8BF2, + 39318 - 11904: 0xADBA, + 39319 - 11904: 0xD850, + 39320 - 11904: 0xEF55, + 39321 - 11904: 0xADBB, + 39323 - 11904: 0x966A, + 39324 - 11904: 0xE4D2, + 39325 - 11904: 0xE4D1, + 39326 - 11904: 0xEC60, + 39329 - 11904: 0xEF57, + 39331 - 11904: 0xEF56, + 39332 - 11904: 0xFCEA, + 39333 - 11904: 0xC34C, + 39334 - 11904: 0xF3B2, + 39335 - 11904: 0xF3B3, + 39336 - 11904: 0xC4C9, + 39338 - 11904: 0x966C, + 39339 - 11904: 0xF9B2, + 39340 - 11904: 0xB0A8, + 39341 - 11904: 0xB6BF, + 39342 - 11904: 0xB6BE, + 39343 - 11904: 0xE0E4, + 39344 - 11904: 0xE0E6, + 39345 - 11904: 0xB9A4, + 39346 - 11904: 0xE0E5, + 39347 - 11904: 0xB9A3, + 39348 - 11904: 0xB9A5, + 39349 - 11904: 0xE0E7, + 39352 - 11904: 0x91C4, + 39353 - 11904: 0xE4D4, + 39354 - 11904: 0xE4D6, + 39355 - 11904: 0xE4D5, + 39356 - 11904: 0x9677, + 39357 - 11904: 0xE4D8, + 39361 - 11904: 0xBBE9, + 39362 - 11904: 0xE4D7, + 39363 - 11904: 0xE4D3, + 39364 - 11904: 0x99F4, + 39365 - 11904: 0x9A6F, + 39367 - 11904: 0xE4D9, + 39369 - 11904: 0xE8CC, + 39371 - 11904: 0xE8CF, + 39372 - 11904: 0xE8D1, + 39373 - 11904: 0xE8C7, + 39374 - 11904: 0xE8CB, + 39375 - 11904: 0xE8C8, + 39376 - 11904: 0xBE6E, + 39377 - 11904: 0xBE71, + 39378 - 11904: 0xBE73, + 39379 - 11904: 0xE8C9, + 39380 - 11904: 0xE8CA, + 39381 - 11904: 0xBE72, + 39382 - 11904: 0xE8CD, + 39383 - 11904: 0xE8D0, + 39384 - 11904: 0xE8CE, + 39385 - 11904: 0xBE74, + 39386 - 11904: 0x9FAB, + 39387 - 11904: 0xBE70, + 39388 - 11904: 0xE8C6, + 39389 - 11904: 0xBE6D, + 39391 - 11904: 0xBE6F, + 39392 - 11904: 0x8CBE, + 39393 - 11904: 0x8EC1, + 39394 - 11904: 0xC063, + 39395 - 11904: 0xEC66, + 39396 - 11904: 0xEC64, + 39397 - 11904: 0xEC63, + 39398 - 11904: 0x9555, + 39399 - 11904: 0xEC69, + 39401 - 11904: 0xEC68, + 39402 - 11904: 0xEC67, + 39404 - 11904: 0xEC62, + 39405 - 11904: 0xC062, + 39406 - 11904: 0xEC61, + 39408 - 11904: 0xEC65, + 39409 - 11904: 0xC064, + 39412 - 11904: 0xEF5A, + 39413 - 11904: 0x9152, + 39414 - 11904: 0xEF5E, + 39415 - 11904: 0xEF5B, + 39416 - 11904: 0xEF5D, + 39417 - 11904: 0xEF5C, + 39418 - 11904: 0xEF59, + 39419 - 11904: 0xEF5F, + 39420 - 11904: 0xEF62, + 39421 - 11904: 0xEF60, + 39422 - 11904: 0xEF61, + 39423 - 11904: 0xC240, + 39425 - 11904: 0xC1FE, + 39426 - 11904: 0xEF58, + 39427 - 11904: 0xEF63, + 39428 - 11904: 0xF1B3, + 39429 - 11904: 0xF1B6, + 39430 - 11904: 0xF1B8, + 39431 - 11904: 0xF1B7, + 39433 - 11904: 0xF1B1, + 39434 - 11904: 0xF1B5, + 39435 - 11904: 0xF1B0, + 39436 - 11904: 0x9153, + 39437 - 11904: 0xF1B2, + 39438 - 11904: 0xC34D, + 39439 - 11904: 0xF1AF, + 39440 - 11904: 0x9155, + 39441 - 11904: 0xF1B4, + 39444 - 11904: 0xF3C0, + 39445 - 11904: 0xF3B5, + 39446 - 11904: 0xC445, + 39449 - 11904: 0xC446, + 39450 - 11904: 0xF3B4, + 39451 - 11904: 0xF3B9, + 39452 - 11904: 0xF3BF, + 39453 - 11904: 0xF3B7, + 39454 - 11904: 0xF3BE, + 39455 - 11904: 0x955D, + 39456 - 11904: 0xF3BB, + 39457 - 11904: 0x9671, + 39458 - 11904: 0xF3BA, + 39459 - 11904: 0xF3BD, + 39460 - 11904: 0xF3B8, + 39461 - 11904: 0xF3B6, + 39462 - 11904: 0x9C6D, + 39463 - 11904: 0xF3BC, + 39465 - 11904: 0xF560, + 39466 - 11904: 0xF55E, + 39467 - 11904: 0xC4CA, + 39468 - 11904: 0xF55D, + 39469 - 11904: 0xF563, + 39470 - 11904: 0xF561, + 39471 - 11904: 0x9673, + 39472 - 11904: 0xC4CB, + 39473 - 11904: 0xF55C, + 39474 - 11904: 0xF55A, + 39476 - 11904: 0xF55B, + 39477 - 11904: 0xC4CD, + 39478 - 11904: 0xF55F, + 39479 - 11904: 0xC4CC, + 39480 - 11904: 0xF562, + 39481 - 11904: 0xF678, + 39482 - 11904: 0xF67E, + 39483 - 11904: 0x9154, + 39484 - 11904: 0x9A71, + 39485 - 11904: 0xF679, + 39486 - 11904: 0xC55B, + 39487 - 11904: 0xF6A1, + 39488 - 11904: 0xC55A, + 39489 - 11904: 0xF67D, + 39490 - 11904: 0xF67C, + 39491 - 11904: 0xC559, + 39492 - 11904: 0xF67B, + 39493 - 11904: 0xC558, + 39494 - 11904: 0xF67A, + 39496 - 11904: 0xF77D, + 39497 - 11904: 0xF7A1, + 39498 - 11904: 0xF77E, + 39500 - 11904: 0xF77B, + 39501 - 11904: 0xC5BB, + 39502 - 11904: 0xF778, + 39503 - 11904: 0xF77C, + 39504 - 11904: 0xF7A3, + 39506 - 11904: 0xF7A2, + 39507 - 11904: 0xF779, + 39508 - 11904: 0xF77A, + 39509 - 11904: 0xC5BA, + 39510 - 11904: 0xF852, + 39511 - 11904: 0xC5E7, + 39512 - 11904: 0x9156, + 39513 - 11904: 0xF853, + 39514 - 11904: 0xC5E5, + 39515 - 11904: 0xC5E6, + 39516 - 11904: 0x966D, + 39518 - 11904: 0xF8D3, + 39519 - 11904: 0xC64A, + 39520 - 11904: 0xF976, + 39522 - 11904: 0xC66A, + 39523 - 11904: 0x9557, + 39524 - 11904: 0xF9B3, + 39525 - 11904: 0xC66B, + 39526 - 11904: 0xF9B4, + 39527 - 11904: 0xF9B5, + 39528 - 11904: 0xF9C3, + 39529 - 11904: 0xF9C2, + 39530 - 11904: 0xC67A, + 39531 - 11904: 0xF9CD, + 39532 - 11904: 0x89C6, + 39567 - 11904: 0x89C7, + 39592 - 11904: 0xB0A9, + 39595 - 11904: 0xE0E9, + 39597 - 11904: 0xE0E8, + 39599 - 11904: 0xBBEA, + 39600 - 11904: 0xBBEB, + 39601 - 11904: 0xE4DA, + 39602 - 11904: 0x8A6A, + 39603 - 11904: 0xE8D2, + 39604 - 11904: 0xEC6C, + 39606 - 11904: 0x8B57, + 39607 - 11904: 0xBE75, + 39608 - 11904: 0xC065, + 39609 - 11904: 0xEC6A, + 39610 - 11904: 0x9FE1, + 39611 - 11904: 0xEC6D, + 39612 - 11904: 0xC066, + 39613 - 11904: 0x9B5F, + 39614 - 11904: 0xEF64, + 39615 - 11904: 0xEC6B, + 39616 - 11904: 0xF1B9, + 39617 - 11904: 0xC34E, + 39618 - 11904: 0xF3C1, + 39622 - 11904: 0xF566, + 39623 - 11904: 0xF564, + 39626 - 11904: 0xF565, + 39629 - 11904: 0xF6A2, + 39631 - 11904: 0xC55C, + 39632 - 11904: 0xF7A4, + 39633 - 11904: 0xC5EA, + 39634 - 11904: 0xC5BC, + 39635 - 11904: 0xC5E8, + 39636 - 11904: 0xC5E9, + 39637 - 11904: 0xF8D4, + 39638 - 11904: 0xC662, + 39639 - 11904: 0xA05D, + 39640 - 11904: 0xB0AA, + 39644 - 11904: 0xF1BA, + 39647 - 11904: 0xD449, + 39648 - 11904: 0x915B, + 39649 - 11904: 0xB9A6, + 39650 - 11904: 0x915C, + 39651 - 11904: 0xE4DB, + 39654 - 11904: 0xBBEC, + 39655 - 11904: 0xE4DC, + 39659 - 11904: 0xE8D4, + 39660 - 11904: 0xE8D3, + 39661 - 11904: 0xC068, + 39662 - 11904: 0xBE76, + 39663 - 11904: 0xBE77, + 39665 - 11904: 0xE8D7, + 39666 - 11904: 0xE8D6, + 39667 - 11904: 0xE8D5, + 39668 - 11904: 0x915E, + 39670 - 11904: 0xEC6E, + 39671 - 11904: 0xEC71, + 39673 - 11904: 0xEC70, + 39674 - 11904: 0xEC6F, + 39675 - 11904: 0xC067, + 39676 - 11904: 0xEF68, + 39677 - 11904: 0xEF66, + 39678 - 11904: 0xEF65, + 39679 - 11904: 0x9F5C, + 39681 - 11904: 0xEF67, + 39682 - 11904: 0x9F57, + 39683 - 11904: 0xC34F, + 39684 - 11904: 0xF1BC, + 39685 - 11904: 0xF1BD, + 39686 - 11904: 0xC350, + 39688 - 11904: 0xF1BB, + 39689 - 11904: 0x9F65, + 39690 - 11904: 0xF3C3, + 39691 - 11904: 0xF3C2, + 39692 - 11904: 0xF3C5, + 39693 - 11904: 0xC447, + 39694 - 11904: 0xF3C4, + 39695 - 11904: 0x9A72, + 39696 - 11904: 0xF567, + 39697 - 11904: 0xF569, + 39698 - 11904: 0xF568, + 39700 - 11904: 0x9160, + 39701 - 11904: 0xF6A3, + 39702 - 11904: 0xF6A6, + 39703 - 11904: 0xF6A4, + 39704 - 11904: 0xF6A5, + 39705 - 11904: 0xF7A5, + 39706 - 11904: 0xC5BD, + 39710 - 11904: 0xF854, + 39711 - 11904: 0xF855, + 39712 - 11904: 0xF856, + 39714 - 11904: 0xC64B, + 39715 - 11904: 0xC663, + 39716 - 11904: 0xF9B6, + 39717 - 11904: 0xB0AB, + 39719 - 11904: 0xBE78, + 39720 - 11904: 0xC069, + 39721 - 11904: 0xF1BE, + 39722 - 11904: 0x9F5E, + 39723 - 11904: 0xF7A6, + 39725 - 11904: 0x9161, + 39726 - 11904: 0xF9C4, + 39727 - 11904: 0xD44A, + 39729 - 11904: 0xC67B, + 39730 - 11904: 0xB0AC, + 39731 - 11904: 0xEC72, + 39732 - 11904: 0x9164, + 39733 - 11904: 0xF1BF, + 39735 - 11904: 0xF3C6, + 39737 - 11904: 0x9F41, + 39738 - 11904: 0xF6A7, + 39739 - 11904: 0xF7A7, + 39740 - 11904: 0xB0AD, + 39742 - 11904: 0xE4DD, + 39743 - 11904: 0xE4DE, + 39744 - 11904: 0x9169, + 39745 - 11904: 0xBBED, + 39746 - 11904: 0xBBEE, + 39747 - 11904: 0xE8D9, + 39748 - 11904: 0xBE7A, + 39749 - 11904: 0xBE79, + 39750 - 11904: 0xE8D8, + 39752 - 11904: 0xEF69, + 39754 - 11904: 0xF1C0, + 39755 - 11904: 0xF1C2, + 39756 - 11904: 0xF1C1, + 39757 - 11904: 0xC353, + 39758 - 11904: 0xC352, + 39759 - 11904: 0xC351, + 39760 - 11904: 0x9168, + 39761 - 11904: 0xC55E, + 39762 - 11904: 0xF6A8, + 39764 - 11904: 0xC55D, + 39765 - 11904: 0xF7A9, + 39766 - 11904: 0xF7A8, + 39768 - 11904: 0xC64C, + 39769 - 11904: 0xF8D5, + 39770 - 11904: 0xB3BD, + 39771 - 11904: 0xE0EA, + 39775 - 11904: 0xE4E1, + 39776 - 11904: 0xE4DF, + 39777 - 11904: 0xE4E0, + 39780 - 11904: 0xE8E2, + 39782 - 11904: 0xE8DD, + 39783 - 11904: 0xE8DA, + 39784 - 11904: 0xE8E1, + 39785 - 11904: 0x9A74, + 39788 - 11904: 0xE8E3, + 39791 - 11904: 0xBE7C, + 39792 - 11904: 0xE8E0, + 39793 - 11904: 0xE8DC, + 39796 - 11904: 0xE8DB, + 39797 - 11904: 0xE8DF, + 39798 - 11904: 0xE8DE, + 39799 - 11904: 0xBE7B, + 39802 - 11904: 0xEC7D, + 39803 - 11904: 0xEC78, + 39804 - 11904: 0xEC76, + 39805 - 11904: 0xECA1, + 39806 - 11904: 0xEC77, + 39807 - 11904: 0x96B2, + 39808 - 11904: 0xEC73, + 39809 - 11904: 0x9A75, + 39810 - 11904: 0xEC79, + 39811 - 11904: 0xFDA5, + 39813 - 11904: 0xEC74, + 39814 - 11904: 0xEF72, + 39815 - 11904: 0xEC75, + 39816 - 11904: 0xECA2, + 39819 - 11904: 0x9EE9, + 39821 - 11904: 0x8BBA, + 39822 - 11904: 0x916D, + 39823 - 11904: 0xA060, + 39824 - 11904: 0xEC7C, + 39825 - 11904: 0xC06A, + 39826 - 11904: 0xEC7B, + 39827 - 11904: 0xEC7A, + 39829 - 11904: 0xEC7E, + 39831 - 11904: 0x9FDE, + 39834 - 11904: 0xEF6A, + 39835 - 11904: 0xEF6D, + 39837 - 11904: 0x9FC3, + 39838 - 11904: 0xEF6C, + 39839 - 11904: 0x96B5, + 39840 - 11904: 0xEF74, + 39841 - 11904: 0xEF6F, + 39842 - 11904: 0xEF73, + 39844 - 11904: 0xEF71, + 39845 - 11904: 0xEF70, + 39846 - 11904: 0xEF6E, + 39848 - 11904: 0xEF6B, + 39850 - 11904: 0xC243, + 39851 - 11904: 0xC242, + 39853 - 11904: 0xC244, + 39854 - 11904: 0xC241, + 39855 - 11904: 0xEF75, + 39856 - 11904: 0xA067, + 39861 - 11904: 0xF1C8, + 39862 - 11904: 0xF1CB, + 39864 - 11904: 0xF1C9, + 39865 - 11904: 0xF1CD, + 39869 - 11904: 0xF1CE, + 39871 - 11904: 0xF1C6, + 39872 - 11904: 0xC358, + 39873 - 11904: 0xF1C7, + 39875 - 11904: 0xF1C5, + 39876 - 11904: 0xF1CC, + 39878 - 11904: 0xF1C4, + 39879 - 11904: 0xF1C3, + 39880 - 11904: 0xC357, + 39881 - 11904: 0xC355, + 39882 - 11904: 0xC354, + 39887 - 11904: 0x96B3, + 39891 - 11904: 0xF1CA, + 39892 - 11904: 0xF3CF, + 39893 - 11904: 0xF3D5, + 39894 - 11904: 0xC44A, + 39895 - 11904: 0xF3D0, + 39897 - 11904: 0xF3D3, + 39898 - 11904: 0xF3D7, + 39899 - 11904: 0xC44B, + 39900 - 11904: 0xF3D2, + 39901 - 11904: 0x9A76, + 39902 - 11904: 0xF3CA, + 39904 - 11904: 0xF3C9, + 39905 - 11904: 0xF3D6, + 39906 - 11904: 0xF3CD, + 39908 - 11904: 0xF3CB, + 39909 - 11904: 0xF3D4, + 39910 - 11904: 0xF3CC, + 39911 - 11904: 0xC449, + 39912 - 11904: 0xC448, + 39913 - 11904: 0x95D5, + 39914 - 11904: 0xF3C7, + 39915 - 11904: 0xF3C8, + 39916 - 11904: 0xF3D1, + 39917 - 11904: 0x9ECA, + 39920 - 11904: 0xF3CE, + 39921 - 11904: 0x9A77, + 39924 - 11904: 0x9A78, + 39927 - 11904: 0xF56C, + 39928 - 11904: 0xF56F, + 39933 - 11904: 0xC356, + 39935 - 11904: 0x9170, + 39938 - 11904: 0x916F, + 39941 - 11904: 0xF56D, + 39942 - 11904: 0xF573, + 39943 - 11904: 0xF571, + 39944 - 11904: 0xF56B, + 39945 - 11904: 0xF576, + 39946 - 11904: 0x9FA3, + 39947 - 11904: 0xF56A, + 39948 - 11904: 0x9171, + 39949 - 11904: 0xC4CF, + 39950 - 11904: 0xF572, + 39952 - 11904: 0x96B1, + 39954 - 11904: 0xF56E, + 39955 - 11904: 0xC4CE, + 39956 - 11904: 0xF575, + 39957 - 11904: 0x9F63, + 39959 - 11904: 0xF574, + 39963 - 11904: 0x9F67, + 39964 - 11904: 0xF6AB, + 39965 - 11904: 0xF6AA, + 39967 - 11904: 0x8BB9, + 39968 - 11904: 0x9A7A, + 39969 - 11904: 0xF6B1, + 39971 - 11904: 0xF6AD, + 39972 - 11904: 0xF6B0, + 39973 - 11904: 0xC560, + 39974 - 11904: 0x8B56, + 39976 - 11904: 0xF6AE, + 39977 - 11904: 0xF6AF, + 39979 - 11904: 0xF6A9, + 39980 - 11904: 0xF6AC, + 39981 - 11904: 0xC55F, + 39983 - 11904: 0x9ADA, + 39985 - 11904: 0xC5BF, + 39986 - 11904: 0xF7B4, + 39987 - 11904: 0xF7AF, + 39988 - 11904: 0xF7B3, + 39989 - 11904: 0x96B0, + 39990 - 11904: 0xF7B6, + 39991 - 11904: 0xF7B2, + 39993 - 11904: 0xF7AE, + 39994 - 11904: 0x9A7E, + 39995 - 11904: 0xC5C1, + 39996 - 11904: 0xF7B1, + 39997 - 11904: 0xF7B5, + 39998 - 11904: 0xC5C0, + 39999 - 11904: 0xF7AC, + 40000 - 11904: 0xF570, + 40001 - 11904: 0xF7B0, + 40004 - 11904: 0xF7AD, + 40005 - 11904: 0x9DDE, + 40006 - 11904: 0xF7AA, + 40008 - 11904: 0xF7AB, + 40009 - 11904: 0xC5BE, + 40010 - 11904: 0xF85A, + 40011 - 11904: 0xF85C, + 40012 - 11904: 0xF85F, + 40013 - 11904: 0xF85B, + 40014 - 11904: 0xF860, + 40015 - 11904: 0x96AD, + 40016 - 11904: 0xF859, + 40018 - 11904: 0xF857, + 40019 - 11904: 0x96AE, + 40020 - 11904: 0xC5EB, + 40021 - 11904: 0xF85D, + 40022 - 11904: 0xC5ED, + 40023 - 11904: 0xC5EC, + 40024 - 11904: 0xF858, + 40025 - 11904: 0xF85E, + 40029 - 11904: 0x9EA1, + 40030 - 11904: 0xF8DA, + 40031 - 11904: 0xC64D, + 40032 - 11904: 0xF8DB, + 40034 - 11904: 0xF8D9, + 40035 - 11904: 0xF8D6, + 40038 - 11904: 0xF8D8, + 40039 - 11904: 0xF8D7, + 40040 - 11904: 0xF95A, + 40045 - 11904: 0xF95C, + 40046 - 11904: 0xF95B, + 40049 - 11904: 0xF979, + 40050 - 11904: 0x9E50, + 40051 - 11904: 0xF978, + 40052 - 11904: 0xF977, + 40053 - 11904: 0xF97A, + 40055 - 11904: 0xC673, + 40056 - 11904: 0xC674, + 40057 - 11904: 0xF9CA, + 40058 - 11904: 0xF9CE, + 40059 - 11904: 0x96AF, + 40060 - 11904: 0x8BF4, + 40165 - 11904: 0xB3BE, + 40166 - 11904: 0xDCAF, + 40167 - 11904: 0xE0ED, + 40169 - 11904: 0xB9A7, + 40170 - 11904: 0xE0EB, + 40173 - 11904: 0xE0EC, + 40177 - 11904: 0xE4E2, + 40178 - 11904: 0xE4E3, + 40179 - 11904: 0xBBF1, + 40180 - 11904: 0xBBEF, + 40181 - 11904: 0xE4E4, + 40182 - 11904: 0xBBF0, + 40183 - 11904: 0xE8E8, + 40185 - 11904: 0xE8EB, + 40186 - 11904: 0xE8E5, + 40187 - 11904: 0xE8EC, + 40188 - 11904: 0xE8E4, + 40189 - 11904: 0xE8E6, + 40191 - 11904: 0xE8E7, + 40192 - 11904: 0xE8EA, + 40194 - 11904: 0x9FA4, + 40195 - 11904: 0xBEA1, + 40196 - 11904: 0xE8EF, + 40197 - 11904: 0xE8EE, + 40198 - 11904: 0xBE7D, + 40199 - 11904: 0xE8E9, + 40200 - 11904: 0xE8ED, + 40201 - 11904: 0xBE7E, + 40204 - 11904: 0x96BD, + 40208 - 11904: 0xECAC, + 40210 - 11904: 0xC06F, + 40212 - 11904: 0xECA7, + 40213 - 11904: 0xC06B, + 40214 - 11904: 0x96F4, + 40215 - 11904: 0xECA4, + 40216 - 11904: 0xECAA, + 40217 - 11904: 0xECAD, + 40219 - 11904: 0xC070, + 40221 - 11904: 0xECA9, + 40222 - 11904: 0xECA6, + 40223 - 11904: 0xECAE, + 40224 - 11904: 0xECA5, + 40225 - 11904: 0x96B8, + 40226 - 11904: 0xECAB, + 40227 - 11904: 0xC06C, + 40229 - 11904: 0xECA3, + 40230 - 11904: 0xC06D, + 40232 - 11904: 0xC06E, + 40233 - 11904: 0xECA8, + 40237 - 11904: 0xEFA9, + 40238 - 11904: 0xEF7A, + 40239 - 11904: 0xEF7B, + 40240 - 11904: 0xEF7E, + 40241 - 11904: 0xEF7C, + 40243 - 11904: 0xEF76, + 40244 - 11904: 0xFAA1, + 40246 - 11904: 0xEF79, + 40247 - 11904: 0xEFA5, + 40248 - 11904: 0xEF7D, + 40249 - 11904: 0x91A7, + 40251 - 11904: 0xC245, + 40253 - 11904: 0xEFA7, + 40254 - 11904: 0xEFA4, + 40255 - 11904: 0xC246, + 40256 - 11904: 0xEFA6, + 40257 - 11904: 0xEF77, + 40258 - 11904: 0xEFA2, + 40259 - 11904: 0xEFA3, + 40260 - 11904: 0xA05E, + 40261 - 11904: 0xEFA1, + 40265 - 11904: 0x9A7D, + 40266 - 11904: 0xF1D2, + 40267 - 11904: 0xF1D4, + 40268 - 11904: 0xF1D7, + 40270 - 11904: 0x8948, + 40271 - 11904: 0xF1D1, + 40272 - 11904: 0x9EB1, + 40273 - 11904: 0xC359, + 40274 - 11904: 0xF1D9, + 40275 - 11904: 0xF1D0, + 40276 - 11904: 0xF1DA, + 40278 - 11904: 0xF1D6, + 40279 - 11904: 0xF1D8, + 40280 - 11904: 0xF1DC, + 40281 - 11904: 0xF1D5, + 40282 - 11904: 0xF1DD, + 40283 - 11904: 0xF1D3, + 40284 - 11904: 0xF1CF, + 40285 - 11904: 0xC35A, + 40286 - 11904: 0x9DDB, + 40287 - 11904: 0xF1DB, + 40288 - 11904: 0xC35B, + 40289 - 11904: 0xC44D, + 40295 - 11904: 0xEF78, + 40296 - 11904: 0xF3F1, + 40297 - 11904: 0xF3E8, + 40298 - 11904: 0xC44F, + 40299 - 11904: 0xF3E4, + 40300 - 11904: 0xC450, + 40301 - 11904: 0x95BF, + 40302 - 11904: 0x8A73, + 40303 - 11904: 0xF3ED, + 40304 - 11904: 0xF3E7, + 40305 - 11904: 0xF3DD, + 40306 - 11904: 0xC44E, + 40307 - 11904: 0xF3EA, + 40308 - 11904: 0xF3E5, + 40309 - 11904: 0xF3E6, + 40311 - 11904: 0xF3D8, + 40312 - 11904: 0xF3DF, + 40313 - 11904: 0xF3EE, + 40315 - 11904: 0xF3EB, + 40316 - 11904: 0x9EFE, + 40317 - 11904: 0xF3E3, + 40318 - 11904: 0x917A, + 40319 - 11904: 0xF3EF, + 40320 - 11904: 0xF3DE, + 40321 - 11904: 0xF3D9, + 40322 - 11904: 0xF3EC, + 40323 - 11904: 0x917B, + 40324 - 11904: 0xF3DB, + 40325 - 11904: 0xF3E9, + 40326 - 11904: 0xF3E0, + 40327 - 11904: 0xF3F0, + 40328 - 11904: 0xF3DC, + 40329 - 11904: 0xC44C, + 40330 - 11904: 0xF3DA, + 40331 - 11904: 0xF3E1, + 40332 - 11904: 0xF3E2, + 40336 - 11904: 0xF57D, + 40338 - 11904: 0xF57B, + 40339 - 11904: 0x9AA3, + 40340 - 11904: 0xF5A2, + 40342 - 11904: 0xF5AE, + 40343 - 11904: 0xF5A5, + 40344 - 11904: 0xF57C, + 40345 - 11904: 0xF578, + 40346 - 11904: 0xF5A7, + 40347 - 11904: 0xF57E, + 40348 - 11904: 0xF5A3, + 40349 - 11904: 0xF57A, + 40350 - 11904: 0xF5AA, + 40351 - 11904: 0xF577, + 40352 - 11904: 0xF5A1, + 40353 - 11904: 0xF5A6, + 40354 - 11904: 0xF5A8, + 40355 - 11904: 0xF5AB, + 40356 - 11904: 0xF579, + 40357 - 11904: 0x96C2, + 40358 - 11904: 0xF5AF, + 40359 - 11904: 0xF5B0, + 40360 - 11904: 0xF5A9, + 40361 - 11904: 0xF5AD, + 40362 - 11904: 0xF5A4, + 40363 - 11904: 0x9F77, + 40364 - 11904: 0xF6C1, + 40365 - 11904: 0xF6C4, + 40367 - 11904: 0xC561, + 40369 - 11904: 0xF6C3, + 40370 - 11904: 0xF6C8, + 40371 - 11904: 0xF6C6, + 40372 - 11904: 0xC562, + 40373 - 11904: 0xF6BD, + 40374 - 11904: 0xF6B3, + 40375 - 11904: 0xF6B2, + 40376 - 11904: 0xC564, + 40377 - 11904: 0xF6BF, + 40378 - 11904: 0xF6C0, + 40379 - 11904: 0xF6BC, + 40380 - 11904: 0xF6B4, + 40381 - 11904: 0x9AA4, + 40382 - 11904: 0xF6B9, + 40383 - 11904: 0xF5AC, + 40384 - 11904: 0x9AA5, + 40385 - 11904: 0xF6B5, + 40386 - 11904: 0xC563, + 40387 - 11904: 0xF6BB, + 40388 - 11904: 0x91A1, + 40389 - 11904: 0xF6BA, + 40391 - 11904: 0xF6B6, + 40392 - 11904: 0xF6C2, + 40393 - 11904: 0x89B8, + 40394 - 11904: 0xF6B7, + 40395 - 11904: 0xF7BB, + 40396 - 11904: 0xF6C5, + 40397 - 11904: 0xF6C7, + 40398 - 11904: 0xF6BE, + 40399 - 11904: 0xF6B8, + 40400 - 11904: 0xF7BC, + 40401 - 11904: 0xF7BE, + 40402 - 11904: 0xF7B8, + 40403 - 11904: 0xC5C2, + 40404 - 11904: 0x9173, + 40405 - 11904: 0xF7C5, + 40406 - 11904: 0xF7C3, + 40407 - 11904: 0xC5C3, + 40408 - 11904: 0xF7C2, + 40409 - 11904: 0xF7C1, + 40410 - 11904: 0xF7BA, + 40411 - 11904: 0xF7B7, + 40412 - 11904: 0xF7BD, + 40413 - 11904: 0xF7C6, + 40414 - 11904: 0xF7B9, + 40415 - 11904: 0xF7BF, + 40417 - 11904: 0xF869, + 40418 - 11904: 0xF86E, + 40419 - 11904: 0xF864, + 40420 - 11904: 0xF867, + 40421 - 11904: 0xC5EE, + 40422 - 11904: 0xF86B, + 40424 - 11904: 0xF872, + 40425 - 11904: 0xF7C0, + 40427 - 11904: 0xF865, + 40428 - 11904: 0xF86F, + 40429 - 11904: 0xF873, + 40430 - 11904: 0xF86A, + 40431 - 11904: 0xF863, + 40432 - 11904: 0xF86D, + 40434 - 11904: 0xF86C, + 40435 - 11904: 0xF871, + 40436 - 11904: 0xF870, + 40437 - 11904: 0xF7C4, + 40438 - 11904: 0xF868, + 40439 - 11904: 0xF862, + 40440 - 11904: 0xF866, + 40441 - 11904: 0xC64E, + 40442 - 11904: 0xC64F, + 40443 - 11904: 0xF861, + 40444 - 11904: 0x9AA6, + 40445 - 11904: 0xF8E6, + 40446 - 11904: 0xF8DD, + 40447 - 11904: 0xF8E5, + 40448 - 11904: 0xF8E2, + 40449 - 11904: 0xF8E3, + 40450 - 11904: 0xF8DC, + 40451 - 11904: 0xF8DF, + 40452 - 11904: 0xF8E7, + 40453 - 11904: 0xF8E1, + 40454 - 11904: 0xF8E0, + 40455 - 11904: 0xF8DE, + 40457 - 11904: 0xF8E4, + 40458 - 11904: 0x89BD, + 40459 - 11904: 0xF95D, + 40460 - 11904: 0x89B9, + 40461 - 11904: 0xF95E, + 40462 - 11904: 0x917D, + 40463 - 11904: 0xF960, + 40464 - 11904: 0xF95F, + 40465 - 11904: 0xF962, + 40466 - 11904: 0xF961, + 40467 - 11904: 0xF97C, + 40468 - 11904: 0xF97B, + 40469 - 11904: 0xF9B7, + 40471 - 11904: 0xF9B8, + 40472 - 11904: 0x96BB, + 40473 - 11904: 0xF9C5, + 40474 - 11904: 0xC678, + 40475 - 11904: 0xC67C, + 40476 - 11904: 0x9FF2, + 40477 - 11904: 0xF9CF, + 40478 - 11904: 0xC67D, + 40479 - 11904: 0x8BF5, + 40565 - 11904: 0xB3BF, + 40569 - 11904: 0xC4D0, + 40570 - 11904: 0xF6C9, + 40571 - 11904: 0x9AA9, + 40572 - 11904: 0xC650, + 40573 - 11904: 0xC651, + 40575 - 11904: 0xB3C0, + 40576 - 11904: 0xE0EE, + 40577 - 11904: 0x9F54, + 40578 - 11904: 0xB9A8, + 40579 - 11904: 0xE8F0, + 40580 - 11904: 0x9FE3, + 40581 - 11904: 0x9EED, + 40582 - 11904: 0xECB0, + 40583 - 11904: 0xECB1, + 40584 - 11904: 0xECAF, + 40585 - 11904: 0xEFAB, + 40586 - 11904: 0xEFAA, + 40587 - 11904: 0xC247, + 40588 - 11904: 0xF1DF, + 40589 - 11904: 0xEFAC, + 40590 - 11904: 0xF1DE, + 40592 - 11904: 0x91AA, + 40593 - 11904: 0xF3F3, + 40594 - 11904: 0xC451, + 40595 - 11904: 0xC453, + 40596 - 11904: 0xF3F2, + 40597 - 11904: 0x91AB, + 40598 - 11904: 0xA070, + 40599 - 11904: 0xC452, + 40600 - 11904: 0x9F6D, + 40601 - 11904: 0xF5B1, + 40602 - 11904: 0xF5B3, + 40603 - 11904: 0xF5B2, + 40604 - 11904: 0xF6CA, + 40605 - 11904: 0xC565, + 40606 - 11904: 0x91AC, + 40607 - 11904: 0xC5EF, + 40608 - 11904: 0xF8E8, + 40609 - 11904: 0xF963, + 40610 - 11904: 0x91AD, + 40612 - 11904: 0xF9D2, + 40613 - 11904: 0xB3C1, + 40614 - 11904: 0xA0FD, + 40615 - 11904: 0xE4E5, + 40616 - 11904: 0x9FE2, + 40617 - 11904: 0xBEA2, + 40618 - 11904: 0x91AF, + 40619 - 11904: 0x9E41, + 40620 - 11904: 0x9AAA, + 40621 - 11904: 0xECB3, + 40622 - 11904: 0xECB2, + 40623 - 11904: 0x91B0, + 40624 - 11904: 0xEFAD, + 40625 - 11904: 0x9AAB, + 40628 - 11904: 0xC454, + 40629 - 11904: 0xC4D1, + 40630 - 11904: 0xF7C7, + 40631 - 11904: 0xF9CB, + 40635 - 11904: 0xB3C2, + 40636 - 11904: 0xBBF2, + 40637 - 11904: 0x9AAC, + 40638 - 11904: 0xBEA3, + 40639 - 11904: 0x9A4A, + 40640 - 11904: 0xF3F4, + 40641 - 11904: 0x91B2, + 40642 - 11904: 0xF874, + 40643 - 11904: 0xB6C0, + 40644 - 11904: 0x8BF6, + 40646 - 11904: 0x9AAD, + 40647 - 11904: 0x89B6, + 40648 - 11904: 0xEFAE, + 40652 - 11904: 0xC664, + 40653 - 11904: 0xB6C1, + 40654 - 11904: 0xBEA4, + 40655 - 11904: 0xC248, + 40656 - 11904: 0xF875, + 40657 - 11904: 0xB6C2, + 40659 - 11904: 0xE8F1, + 40660 - 11904: 0xC072, + 40661 - 11904: 0xECB4, + 40662 - 11904: 0xECB5, + 40664 - 11904: 0xC071, + 40666 - 11904: 0xEFAF, + 40667 - 11904: 0xC24C, + 40668 - 11904: 0xC24A, + 40669 - 11904: 0xC24B, + 40670 - 11904: 0xC249, + 40671 - 11904: 0xF1E0, + 40672 - 11904: 0xC35C, + 40674 - 11904: 0x9AAF, + 40676 - 11904: 0xF5B5, + 40677 - 11904: 0xF5B4, + 40678 - 11904: 0xF5B7, + 40679 - 11904: 0xF5B6, + 40680 - 11904: 0xC4D2, + 40683 - 11904: 0xF6CB, + 40685 - 11904: 0xF6CD, + 40686 - 11904: 0xF6CC, + 40687 - 11904: 0xC566, + 40688 - 11904: 0xF7C8, + 40689 - 11904: 0x9AB0, + 40690 - 11904: 0xF876, + 40691 - 11904: 0xF877, + 40692 - 11904: 0xC5F0, + 40693 - 11904: 0xF964, + 40694 - 11904: 0xF97D, + 40695 - 11904: 0xC675, + 40696 - 11904: 0x9AB1, + 40697 - 11904: 0xDCB0, + 40698 - 11904: 0xECB6, + 40699 - 11904: 0xEFB0, + 40700 - 11904: 0xF3F5, + 40701 - 11904: 0xE0EF, + 40702 - 11904: 0x9AA1, + 40703 - 11904: 0xEFB1, + 40704 - 11904: 0xF1E2, + 40705 - 11904: 0xF1E1, + 40706 - 11904: 0x91B9, + 40710 - 11904: 0xF878, + 40711 - 11904: 0xC652, + 40712 - 11904: 0x91BA, + 40713 - 11904: 0xF965, + 40714 - 11904: 0xF97E, + 40718 - 11904: 0xB9A9, + 40719 - 11904: 0xE8F2, + 40720 - 11904: 0xE8F3, + 40722 - 11904: 0xECB7, + 40723 - 11904: 0xB9AA, + 40725 - 11904: 0xC35D, + 40726 - 11904: 0xF1E3, + 40727 - 11904: 0x9F66, + 40728 - 11904: 0xF6CF, + 40729 - 11904: 0xC567, + 40730 - 11904: 0xF6D0, + 40731 - 11904: 0xF6CE, + 40732 - 11904: 0xF879, + 40734 - 11904: 0xF8E9, + 40736 - 11904: 0xB9AB, + 40738 - 11904: 0xEFB4, + 40739 - 11904: 0xEFB3, + 40740 - 11904: 0xEFB2, + 40741 - 11904: 0xF1E4, + 40742 - 11904: 0xA041, + 40743 - 11904: 0x8BB7, + 40744 - 11904: 0xF1E8, + 40745 - 11904: 0xF1E7, + 40746 - 11904: 0xF1E6, + 40747 - 11904: 0xF1E5, + 40748 - 11904: 0xC35E, + 40749 - 11904: 0xF3F6, + 40750 - 11904: 0xF5B9, + 40751 - 11904: 0xC4D3, + 40752 - 11904: 0xF5B8, + 40753 - 11904: 0xF6D1, + 40754 - 11904: 0xF7CB, + 40755 - 11904: 0xF7CA, + 40756 - 11904: 0xC5C4, + 40757 - 11904: 0xF7C9, + 40758 - 11904: 0xF87C, + 40759 - 11904: 0xF87B, + 40760 - 11904: 0xF87A, + 40761 - 11904: 0x91C0, + 40763 - 11904: 0xBBF3, + 40765 - 11904: 0xECB8, + 40766 - 11904: 0xC24D, + 40768 - 11904: 0xF3F7, + 40769 - 11904: 0xF3F8, + 40770 - 11904: 0xF7CC, + 40771 - 11904: 0xF87D, + 40772 - 11904: 0x9AB3, + 40773 - 11904: 0x91C3, + 40774 - 11904: 0xF8EA, + 40775 - 11904: 0xF966, + 40776 - 11904: 0xF9B9, + 40777 - 11904: 0xF9D4, + 40778 - 11904: 0xBBF4, + 40779 - 11904: 0xC24E, + 40780 - 11904: 0xF1E9, + 40781 - 11904: 0xF3F9, + 40782 - 11904: 0xF6D2, + 40783 - 11904: 0xF87E, + 40784 - 11904: 0xA0FC, + 40786 - 11904: 0xBEA6, + 40787 - 11904: 0x9FEE, + 40788 - 11904: 0xEFB5, + 40789 - 11904: 0xF1EA, + 40790 - 11904: 0xF3FA, + 40791 - 11904: 0xF3FB, + 40792 - 11904: 0xF3FC, + 40793 - 11904: 0xF5BE, + 40794 - 11904: 0x9F69, + 40795 - 11904: 0xF5BA, + 40796 - 11904: 0xC568, + 40797 - 11904: 0xF5BD, + 40798 - 11904: 0xF5BC, + 40799 - 11904: 0xC4D4, + 40800 - 11904: 0xF5BB, + 40801 - 11904: 0xC4D6, + 40802 - 11904: 0x91C8, + 40803 - 11904: 0xC4D5, + 40804 - 11904: 0xF6D4, + 40805 - 11904: 0xF6D3, + 40806 - 11904: 0xC569, + 40807 - 11904: 0xC56A, + 40809 - 11904: 0x91C9, + 40810 - 11904: 0xC5C6, + 40811 - 11904: 0xF7CD, + 40812 - 11904: 0xC5C5, + 40814 - 11904: 0xF8A3, + 40815 - 11904: 0xF8A4, + 40816 - 11904: 0xF8A2, + 40817 - 11904: 0xF8A1, + 40818 - 11904: 0xC654, + 40820 - 11904: 0xF8EB, + 40821 - 11904: 0xF8EC, + 40822 - 11904: 0xF8ED, + 40823 - 11904: 0xC653, + 40824 - 11904: 0xF967, + 40825 - 11904: 0xF96A, + 40826 - 11904: 0xF969, + 40827 - 11904: 0xF968, + 40830 - 11904: 0xF9D3, + 40831 - 11904: 0x8DE6, + 40845 - 11904: 0xC073, + 40846 - 11904: 0x91CB, + 40848 - 11904: 0xC365, + 40849 - 11904: 0xF5BF, + 40850 - 11904: 0xF6D5, + 40852 - 11904: 0xC5C7, + 40853 - 11904: 0xF7CE, + 40854 - 11904: 0x87AC, + 40855 - 11904: 0x87A4, + 40856 - 11904: 0xF9D5, + 40857 - 11904: 0x89C8, + 40860 - 11904: 0xC074, + 40863 - 11904: 0x8DAA, + 40864 - 11904: 0xEFB6, + 40866 - 11904: 0xF7CF, + 40868 - 11904: 0xF9A1, + 40869 - 11904: 0x9FDD, + 40870 - 11904: 0x8C43, + 40871 - 11904: 0x8C6D, + 40872 - 11904: 0x8C74, + 40873 - 11904: 0x8CB7, + 40874 - 11904: 0x8CB9, + 40875 - 11904: 0x8CBB, + 40876 - 11904: 0x8CC0, + 40877 - 11904: 0x8CD7, + 40878 - 11904: 0x8CD8, + 40879 - 11904: 0x8CDA, + 40880 - 11904: 0xC8A1, + 40881 - 11904: 0xC8A3, + 40882 - 11904: 0x8CED, + 40883 - 11904: 0x8D48, + 40903 - 11904: 0x87C2, + 40904 - 11904: 0x87D2, + 40905 - 11904: 0x87D6, + 40906 - 11904: 0x87DA, + 40907 - 11904: 0x87DF, +} + +const encode2Low, encode2High = 7870, 10046 + +var encode2 = [...]uint16{ + 7870 - 7870: 0x8863, + 7871 - 7870: 0x88A4, + 7872 - 7870: 0x8865, + 7873 - 7870: 0x88A6, + 8211 - 7870: 0xA156, + 8212 - 7870: 0xA158, + 8216 - 7870: 0xA1A5, + 8217 - 7870: 0xA1A6, + 8220 - 7870: 0xA1A7, + 8221 - 7870: 0xA1A8, + 8229 - 7870: 0xA14C, + 8230 - 7870: 0xA14B, + 8231 - 7870: 0xA145, + 8242 - 7870: 0xA1AC, + 8245 - 7870: 0xA1AB, + 8251 - 7870: 0xA1B0, + 8364 - 7870: 0xA3E1, + 8451 - 7870: 0xA24A, + 8453 - 7870: 0xA1C1, + 8457 - 7870: 0xA24B, + 8470 - 7870: 0xC8D2, + 8481 - 7870: 0xC8D3, + 8544 - 7870: 0xA2B9, + 8545 - 7870: 0xA2BA, + 8546 - 7870: 0xA2BB, + 8547 - 7870: 0xA2BC, + 8548 - 7870: 0xA2BD, + 8549 - 7870: 0xA2BE, + 8550 - 7870: 0xA2BF, + 8551 - 7870: 0xA2C0, + 8552 - 7870: 0xA2C1, + 8553 - 7870: 0xA2C2, + 8560 - 7870: 0xC6B5, + 8561 - 7870: 0xC6B6, + 8562 - 7870: 0xC6B7, + 8563 - 7870: 0xC6B8, + 8564 - 7870: 0xC6B9, + 8565 - 7870: 0xC6BA, + 8566 - 7870: 0xC6BB, + 8567 - 7870: 0xC6BC, + 8568 - 7870: 0xC6BD, + 8569 - 7870: 0xC6BE, + 8592 - 7870: 0xA1F6, + 8593 - 7870: 0xA1F4, + 8594 - 7870: 0xA1F7, + 8595 - 7870: 0xA1F5, + 8598 - 7870: 0xA1F8, + 8599 - 7870: 0xA1F9, + 8600 - 7870: 0xA1FB, + 8601 - 7870: 0xA1FA, + 8632 - 7870: 0xC877, + 8633 - 7870: 0xC878, + 8679 - 7870: 0xC876, + 8725 - 7870: 0xA241, + 8730 - 7870: 0xA1D4, + 8734 - 7870: 0xA1DB, + 8735 - 7870: 0xA1E8, + 8736 - 7870: 0xA1E7, + 8739 - 7870: 0xA1FD, + 8741 - 7870: 0xA1FC, + 8745 - 7870: 0xA1E4, + 8746 - 7870: 0xA1E5, + 8747 - 7870: 0xA1EC, + 8750 - 7870: 0xA1ED, + 8756 - 7870: 0xA1EF, + 8757 - 7870: 0xA1EE, + 8786 - 7870: 0xA1DC, + 8800 - 7870: 0xA1DA, + 8801 - 7870: 0xA1DD, + 8806 - 7870: 0xA1D8, + 8807 - 7870: 0xA1D9, + 8853 - 7870: 0xA1F2, + 8857 - 7870: 0xA1F3, + 8869 - 7870: 0xA1E6, + 8895 - 7870: 0xA1E9, + 9178 - 7870: 0x88A9, + 9179 - 7870: 0x88AA, + 9216 - 7870: 0xA3C0, + 9217 - 7870: 0xA3C1, + 9218 - 7870: 0xA3C2, + 9219 - 7870: 0xA3C3, + 9220 - 7870: 0xA3C4, + 9221 - 7870: 0xA3C5, + 9222 - 7870: 0xA3C6, + 9223 - 7870: 0xA3C7, + 9224 - 7870: 0xA3C8, + 9225 - 7870: 0xA3C9, + 9226 - 7870: 0xA3CA, + 9227 - 7870: 0xA3CB, + 9228 - 7870: 0xA3CC, + 9229 - 7870: 0xA3CD, + 9230 - 7870: 0xA3CE, + 9231 - 7870: 0xA3CF, + 9232 - 7870: 0xA3D0, + 9233 - 7870: 0xA3D1, + 9234 - 7870: 0xA3D2, + 9235 - 7870: 0xA3D3, + 9236 - 7870: 0xA3D4, + 9237 - 7870: 0xA3D5, + 9238 - 7870: 0xA3D6, + 9239 - 7870: 0xA3D7, + 9240 - 7870: 0xA3D8, + 9241 - 7870: 0xA3D9, + 9242 - 7870: 0xA3DA, + 9243 - 7870: 0xA3DB, + 9244 - 7870: 0xA3DC, + 9245 - 7870: 0xA3DD, + 9246 - 7870: 0xA3DE, + 9247 - 7870: 0xA3DF, + 9249 - 7870: 0xA3E0, + 9312 - 7870: 0xC6A1, + 9313 - 7870: 0xC6A2, + 9314 - 7870: 0xC6A3, + 9315 - 7870: 0xC6A4, + 9316 - 7870: 0xC6A5, + 9317 - 7870: 0xC6A6, + 9318 - 7870: 0xC6A7, + 9319 - 7870: 0xC6A8, + 9320 - 7870: 0xC6A9, + 9321 - 7870: 0xC6AA, + 9332 - 7870: 0xC6AB, + 9333 - 7870: 0xC6AC, + 9334 - 7870: 0xC6AD, + 9335 - 7870: 0xC6AE, + 9336 - 7870: 0xC6AF, + 9337 - 7870: 0xC6B0, + 9338 - 7870: 0xC6B1, + 9339 - 7870: 0xC6B2, + 9340 - 7870: 0xC6B3, + 9341 - 7870: 0xC6B4, + 9472 - 7870: 0xA277, + 9474 - 7870: 0xA278, + 9484 - 7870: 0xA27A, + 9488 - 7870: 0xA27B, + 9492 - 7870: 0xA27C, + 9496 - 7870: 0xA27D, + 9500 - 7870: 0xA275, + 9508 - 7870: 0xA274, + 9516 - 7870: 0xA273, + 9524 - 7870: 0xA272, + 9532 - 7870: 0xA271, + 9552 - 7870: 0xF9F9, + 9553 - 7870: 0xF9F8, + 9554 - 7870: 0xF9E6, + 9555 - 7870: 0xF9EF, + 9556 - 7870: 0xF9DD, + 9557 - 7870: 0xF9E8, + 9558 - 7870: 0xF9F1, + 9559 - 7870: 0xF9DF, + 9560 - 7870: 0xF9EC, + 9561 - 7870: 0xF9F5, + 9562 - 7870: 0xF9E3, + 9563 - 7870: 0xF9EE, + 9564 - 7870: 0xF9F7, + 9565 - 7870: 0xF9E5, + 9566 - 7870: 0xF9E9, + 9567 - 7870: 0xF9F2, + 9568 - 7870: 0xF9E0, + 9569 - 7870: 0xF9EB, + 9570 - 7870: 0xF9F4, + 9571 - 7870: 0xF9E2, + 9572 - 7870: 0xF9E7, + 9573 - 7870: 0xF9F0, + 9574 - 7870: 0xF9DE, + 9575 - 7870: 0xF9ED, + 9576 - 7870: 0xF9F6, + 9577 - 7870: 0xF9E4, + 9578 - 7870: 0xF9EA, + 9579 - 7870: 0xF9F3, + 9580 - 7870: 0xF9E1, + 9581 - 7870: 0xF9FA, + 9582 - 7870: 0xF9FB, + 9583 - 7870: 0xF9FD, + 9584 - 7870: 0xF9FC, + 9585 - 7870: 0xA2AC, + 9586 - 7870: 0xA2AD, + 9587 - 7870: 0xA2AE, + 9588 - 7870: 0xA15A, + 9601 - 7870: 0xA262, + 9602 - 7870: 0xA263, + 9603 - 7870: 0xA264, + 9604 - 7870: 0xA265, + 9605 - 7870: 0xA266, + 9606 - 7870: 0xA267, + 9607 - 7870: 0xA268, + 9608 - 7870: 0xA269, + 9609 - 7870: 0xA270, + 9610 - 7870: 0xA26F, + 9611 - 7870: 0xA26E, + 9612 - 7870: 0xA26D, + 9613 - 7870: 0xA26C, + 9614 - 7870: 0xA26B, + 9615 - 7870: 0xA26A, + 9620 - 7870: 0xA276, + 9621 - 7870: 0xA279, + 9632 - 7870: 0xA1BD, + 9633 - 7870: 0xA1BC, + 9650 - 7870: 0xA1B6, + 9651 - 7870: 0xA1B5, + 9660 - 7870: 0xA1BF, + 9661 - 7870: 0xA1BE, + 9670 - 7870: 0xA1BB, + 9671 - 7870: 0xA1BA, + 9675 - 7870: 0xA1B3, + 9678 - 7870: 0xA1B7, + 9679 - 7870: 0xA1B4, + 9698 - 7870: 0xA2A8, + 9699 - 7870: 0xA2A9, + 9700 - 7870: 0xA2AB, + 9701 - 7870: 0xA2AA, + 9733 - 7870: 0xA1B9, + 9734 - 7870: 0xA1B8, + 9792 - 7870: 0xA1F0, + 9794 - 7870: 0xA1F1, + 10045 - 7870: 0xC6E6, +} + +const encode3Low, encode3High = 167, 1106 + +var encode3 = [...]uint16{ + 167 - 167: 0xA1B1, + 168 - 167: 0xC6D8, + 175 - 167: 0xA1C2, + 176 - 167: 0xA258, + 177 - 167: 0xA1D3, + 183 - 167: 0xA150, + 192 - 167: 0x8859, + 193 - 167: 0x8857, + 200 - 167: 0x885D, + 201 - 167: 0x885B, + 202 - 167: 0x8866, + 210 - 167: 0x8861, + 211 - 167: 0x885F, + 215 - 167: 0xA1D1, + 224 - 167: 0x886A, + 225 - 167: 0x8868, + 232 - 167: 0x886F, + 233 - 167: 0x886D, + 234 - 167: 0x88A7, + 236 - 167: 0x8873, + 237 - 167: 0x8871, + 242 - 167: 0x8877, + 243 - 167: 0x8875, + 247 - 167: 0xA1D2, + 248 - 167: 0xC8FB, + 249 - 167: 0x887B, + 250 - 167: 0x8879, + 252 - 167: 0x88A2, + 256 - 167: 0x8856, + 257 - 167: 0x8867, + 274 - 167: 0x885A, + 275 - 167: 0x886C, + 282 - 167: 0x885C, + 283 - 167: 0x886E, + 299 - 167: 0x8870, + 331 - 167: 0xC8FC, + 332 - 167: 0x885E, + 333 - 167: 0x8874, + 339 - 167: 0xC8FA, + 363 - 167: 0x8878, + 461 - 167: 0x8858, + 462 - 167: 0x8869, + 464 - 167: 0x8872, + 465 - 167: 0x8860, + 466 - 167: 0x8876, + 468 - 167: 0x887A, + 470 - 167: 0x887C, + 472 - 167: 0x887D, + 474 - 167: 0x887E, + 476 - 167: 0x88A1, + 592 - 167: 0xC8F6, + 593 - 167: 0x886B, + 596 - 167: 0xC8F8, + 603 - 167: 0xC8F7, + 609 - 167: 0x88A8, + 618 - 167: 0xC8FE, + 629 - 167: 0xC8F9, + 643 - 167: 0xC8F5, + 650 - 167: 0xC8FD, + 710 - 167: 0xC6D9, + 711 - 167: 0xA3BE, + 713 - 167: 0xA3BC, + 714 - 167: 0xA3BD, + 715 - 167: 0xA3BF, + 717 - 167: 0xA1C5, + 729 - 167: 0xA3BB, + 913 - 167: 0xA344, + 914 - 167: 0xA345, + 915 - 167: 0xA346, + 916 - 167: 0xA347, + 917 - 167: 0xA348, + 918 - 167: 0xA349, + 919 - 167: 0xA34A, + 920 - 167: 0xA34B, + 921 - 167: 0xA34C, + 922 - 167: 0xA34D, + 923 - 167: 0xA34E, + 924 - 167: 0xA34F, + 925 - 167: 0xA350, + 926 - 167: 0xA351, + 927 - 167: 0xA352, + 928 - 167: 0xA353, + 929 - 167: 0xA354, + 931 - 167: 0xA355, + 932 - 167: 0xA356, + 933 - 167: 0xA357, + 934 - 167: 0xA358, + 935 - 167: 0xA359, + 936 - 167: 0xA35A, + 937 - 167: 0xA35B, + 945 - 167: 0xA35C, + 946 - 167: 0xA35D, + 947 - 167: 0xA35E, + 948 - 167: 0xA35F, + 949 - 167: 0xA360, + 950 - 167: 0xA361, + 951 - 167: 0xA362, + 952 - 167: 0xA363, + 953 - 167: 0xA364, + 954 - 167: 0xA365, + 955 - 167: 0xA366, + 956 - 167: 0xA367, + 957 - 167: 0xA368, + 958 - 167: 0xA369, + 959 - 167: 0xA36A, + 960 - 167: 0xA36B, + 961 - 167: 0xA36C, + 963 - 167: 0xA36D, + 964 - 167: 0xA36E, + 965 - 167: 0xA36F, + 966 - 167: 0xA370, + 967 - 167: 0xA371, + 968 - 167: 0xA372, + 969 - 167: 0xA373, + 1025 - 167: 0xC7F9, + 1040 - 167: 0xC7F3, + 1041 - 167: 0xC7F4, + 1042 - 167: 0xC7F5, + 1043 - 167: 0xC7F6, + 1044 - 167: 0xC7F7, + 1045 - 167: 0xC7F8, + 1046 - 167: 0xC7FA, + 1047 - 167: 0xC7FB, + 1048 - 167: 0xC7FC, + 1049 - 167: 0xC7FD, + 1050 - 167: 0xC7FE, + 1051 - 167: 0xC840, + 1052 - 167: 0xC841, + 1053 - 167: 0xC842, + 1054 - 167: 0xC843, + 1055 - 167: 0xC844, + 1056 - 167: 0xC845, + 1057 - 167: 0xC846, + 1058 - 167: 0xC847, + 1059 - 167: 0xC848, + 1060 - 167: 0xC849, + 1061 - 167: 0xC84A, + 1062 - 167: 0xC84B, + 1063 - 167: 0xC84C, + 1064 - 167: 0xC84D, + 1065 - 167: 0xC84E, + 1066 - 167: 0xC84F, + 1067 - 167: 0xC850, + 1068 - 167: 0xC851, + 1069 - 167: 0xC852, + 1070 - 167: 0xC853, + 1071 - 167: 0xC854, + 1072 - 167: 0xC855, + 1073 - 167: 0xC856, + 1074 - 167: 0xC857, + 1075 - 167: 0xC858, + 1076 - 167: 0xC859, + 1077 - 167: 0xC85A, + 1078 - 167: 0xC85C, + 1079 - 167: 0xC85D, + 1080 - 167: 0xC85E, + 1081 - 167: 0xC85F, + 1082 - 167: 0xC860, + 1083 - 167: 0xC861, + 1084 - 167: 0xC862, + 1085 - 167: 0xC863, + 1086 - 167: 0xC864, + 1087 - 167: 0xC865, + 1088 - 167: 0xC866, + 1089 - 167: 0xC867, + 1090 - 167: 0xC868, + 1091 - 167: 0xC869, + 1092 - 167: 0xC86A, + 1093 - 167: 0xC86B, + 1094 - 167: 0xC86C, + 1095 - 167: 0xC86D, + 1096 - 167: 0xC86E, + 1097 - 167: 0xC86F, + 1098 - 167: 0xC870, + 1099 - 167: 0xC871, + 1100 - 167: 0xC872, + 1101 - 167: 0xC873, + 1102 - 167: 0xC874, + 1103 - 167: 0xC875, + 1105 - 167: 0xC85B, +} + +const encode4Low, encode4High = 65072, 65518 + +var encode4 = [...]uint16{ + 65072 - 65072: 0xA14A, + 65073 - 65072: 0xA157, + 65075 - 65072: 0xA159, + 65076 - 65072: 0xA15B, + 65077 - 65072: 0xA15F, + 65078 - 65072: 0xA160, + 65079 - 65072: 0xA163, + 65080 - 65072: 0xA164, + 65081 - 65072: 0xA167, + 65082 - 65072: 0xA168, + 65083 - 65072: 0xA16B, + 65084 - 65072: 0xA16C, + 65085 - 65072: 0xA16F, + 65086 - 65072: 0xA170, + 65087 - 65072: 0xA173, + 65088 - 65072: 0xA174, + 65089 - 65072: 0xA177, + 65090 - 65072: 0xA178, + 65091 - 65072: 0xA17B, + 65092 - 65072: 0xA17C, + 65097 - 65072: 0xA1C6, + 65098 - 65072: 0xA1C7, + 65099 - 65072: 0xA1CA, + 65100 - 65072: 0xA1CB, + 65101 - 65072: 0xA1C8, + 65102 - 65072: 0xA1C9, + 65103 - 65072: 0xA15C, + 65104 - 65072: 0xA14D, + 65105 - 65072: 0xA14E, + 65106 - 65072: 0xA14F, + 65108 - 65072: 0xA151, + 65109 - 65072: 0xA152, + 65110 - 65072: 0xA153, + 65111 - 65072: 0xA154, + 65113 - 65072: 0xA17D, + 65114 - 65072: 0xA17E, + 65115 - 65072: 0xA1A1, + 65116 - 65072: 0xA1A2, + 65117 - 65072: 0xA1A3, + 65118 - 65072: 0xA1A4, + 65119 - 65072: 0xA1CC, + 65120 - 65072: 0xA1CD, + 65121 - 65072: 0xA1CE, + 65122 - 65072: 0xA1DE, + 65123 - 65072: 0xA1DF, + 65124 - 65072: 0xA1E0, + 65125 - 65072: 0xA1E1, + 65126 - 65072: 0xA1E2, + 65128 - 65072: 0xA242, + 65129 - 65072: 0xA24C, + 65130 - 65072: 0xA24D, + 65131 - 65072: 0xA24E, + 65281 - 65072: 0xA149, + 65282 - 65072: 0xC8D0, + 65283 - 65072: 0xA1AD, + 65284 - 65072: 0xA243, + 65285 - 65072: 0xA248, + 65286 - 65072: 0xA1AE, + 65287 - 65072: 0xC8CF, + 65288 - 65072: 0xA15D, + 65289 - 65072: 0xA15E, + 65290 - 65072: 0xA1AF, + 65291 - 65072: 0xA1CF, + 65292 - 65072: 0xA141, + 65293 - 65072: 0xA1D0, + 65294 - 65072: 0xA144, + 65295 - 65072: 0xA1FE, + 65296 - 65072: 0xA2AF, + 65297 - 65072: 0xA2B0, + 65298 - 65072: 0xA2B1, + 65299 - 65072: 0xA2B2, + 65300 - 65072: 0xA2B3, + 65301 - 65072: 0xA2B4, + 65302 - 65072: 0xA2B5, + 65303 - 65072: 0xA2B6, + 65304 - 65072: 0xA2B7, + 65305 - 65072: 0xA2B8, + 65306 - 65072: 0xA147, + 65307 - 65072: 0xA146, + 65308 - 65072: 0xA1D5, + 65309 - 65072: 0xA1D7, + 65310 - 65072: 0xA1D6, + 65311 - 65072: 0xA148, + 65312 - 65072: 0xA249, + 65313 - 65072: 0xA2CF, + 65314 - 65072: 0xA2D0, + 65315 - 65072: 0xA2D1, + 65316 - 65072: 0xA2D2, + 65317 - 65072: 0xA2D3, + 65318 - 65072: 0xA2D4, + 65319 - 65072: 0xA2D5, + 65320 - 65072: 0xA2D6, + 65321 - 65072: 0xA2D7, + 65322 - 65072: 0xA2D8, + 65323 - 65072: 0xA2D9, + 65324 - 65072: 0xA2DA, + 65325 - 65072: 0xA2DB, + 65326 - 65072: 0xA2DC, + 65327 - 65072: 0xA2DD, + 65328 - 65072: 0xA2DE, + 65329 - 65072: 0xA2DF, + 65330 - 65072: 0xA2E0, + 65331 - 65072: 0xA2E1, + 65332 - 65072: 0xA2E2, + 65333 - 65072: 0xA2E3, + 65334 - 65072: 0xA2E4, + 65335 - 65072: 0xA2E5, + 65336 - 65072: 0xA2E6, + 65337 - 65072: 0xA2E7, + 65338 - 65072: 0xA2E8, + 65339 - 65072: 0xC6E4, + 65340 - 65072: 0xA240, + 65341 - 65072: 0xC6E5, + 65343 - 65072: 0xA1C4, + 65345 - 65072: 0xA2E9, + 65346 - 65072: 0xA2EA, + 65347 - 65072: 0xA2EB, + 65348 - 65072: 0xA2EC, + 65349 - 65072: 0xA2ED, + 65350 - 65072: 0xA2EE, + 65351 - 65072: 0xA2EF, + 65352 - 65072: 0xA2F0, + 65353 - 65072: 0xA2F1, + 65354 - 65072: 0xA2F2, + 65355 - 65072: 0xA2F3, + 65356 - 65072: 0xA2F4, + 65357 - 65072: 0xA2F5, + 65358 - 65072: 0xA2F6, + 65359 - 65072: 0xA2F7, + 65360 - 65072: 0xA2F8, + 65361 - 65072: 0xA2F9, + 65362 - 65072: 0xA2FA, + 65363 - 65072: 0xA2FB, + 65364 - 65072: 0xA2FC, + 65365 - 65072: 0xA2FD, + 65366 - 65072: 0xA2FE, + 65367 - 65072: 0xA340, + 65368 - 65072: 0xA341, + 65369 - 65072: 0xA342, + 65370 - 65072: 0xA343, + 65371 - 65072: 0xA161, + 65372 - 65072: 0xA155, + 65373 - 65072: 0xA162, + 65374 - 65072: 0xA1E3, + 65504 - 65072: 0xA246, + 65505 - 65072: 0xA247, + 65506 - 65072: 0xC8CD, + 65507 - 65072: 0xA1C3, + 65508 - 65072: 0xC8CE, + 65509 - 65072: 0xA244, + 65517 - 65072: 0xF9FE, +} + +const encode5Low, encode5High = 194597, 195029 + +var encode5 = [...]uint16{ + 194597 - 194597: 0x9874, + 194619 - 194597: 0x9AC8, + 194624 - 194597: 0xA047, + 194680 - 194597: 0x8BC3, + 194708 - 194597: 0xFC48, + 194726 - 194597: 0xFC77, + 194765 - 194597: 0x9C52, + 194964 - 194597: 0x8EFD, + 194994 - 194597: 0x8FA8, + 195004 - 194597: 0x957A, + 195028 - 194597: 0x8FF0, +} + +const encode6Low, encode6High = 63751, 64014 + +var encode6 = [...]uint16{ + 63751 - 63751: 0x8BF8, + 64012 - 63751: 0xC94A, + 64013 - 63751: 0xDDFC, +} + +const encode7Low, encode7High = 175615, 175616 + +var encode7 = [...]uint16{ + 175615 - 175615: 0x87DC, +} diff --git a/vendor/golang.org/x/text/encoding/unicode/override.go b/vendor/golang.org/x/text/encoding/unicode/override.go new file mode 100644 index 0000000000..35d62fcc99 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/unicode/override.go @@ -0,0 +1,82 @@ +// 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 unicode + +import ( + "golang.org/x/text/transform" +) + +// BOMOverride returns a new decoder transformer that is identical to fallback, +// except that the presence of a Byte Order Mark at the start of the input +// causes it to switch to the corresponding Unicode decoding. It will only +// consider BOMs for UTF-8, UTF-16BE, and UTF-16LE. +// +// This differs from using ExpectBOM by allowing a BOM to switch to UTF-8, not +// just UTF-16 variants, and allowing falling back to any encoding scheme. +// +// This technique is recommended by the W3C for use in HTML 5: "For +// compatibility with deployed content, the byte order mark (also known as BOM) +// is considered more authoritative than anything else." +// http://www.w3.org/TR/encoding/#specification-hooks +// +// Using BOMOverride is mostly intended for use cases where the first characters +// of a fallback encoding are known to not be a BOM, for example, for valid HTML +// and most encodings. +func BOMOverride(fallback transform.Transformer) transform.Transformer { + // TODO: possibly allow a variadic argument of unicode encodings to allow + // specifying details of which fallbacks are supported as well as + // specifying the details of the implementations. This would also allow for + // support for UTF-32, which should not be supported by default. + return &bomOverride{fallback: fallback} +} + +type bomOverride struct { + fallback transform.Transformer + current transform.Transformer +} + +func (d *bomOverride) Reset() { + d.current = nil + d.fallback.Reset() +} + +var ( + // TODO: we could use decode functions here, instead of allocating a new + // decoder on every NewDecoder as IgnoreBOM decoders can be stateless. + utf16le = UTF16(LittleEndian, IgnoreBOM) + utf16be = UTF16(BigEndian, IgnoreBOM) +) + +const utf8BOM = "\ufeff" + +func (d *bomOverride) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + if d.current != nil { + return d.current.Transform(dst, src, atEOF) + } + if len(src) < 3 && !atEOF { + return 0, 0, transform.ErrShortSrc + } + d.current = d.fallback + bomSize := 0 + if len(src) >= 2 { + if src[0] == 0xFF && src[1] == 0xFE { + d.current = utf16le.NewDecoder() + bomSize = 2 + } else if src[0] == 0xFE && src[1] == 0xFF { + d.current = utf16be.NewDecoder() + bomSize = 2 + } else if len(src) >= 3 && + src[0] == utf8BOM[0] && + src[1] == utf8BOM[1] && + src[2] == utf8BOM[2] { + d.current = transform.Nop + bomSize = 3 + } + } + if bomSize < len(src) { + nDst, nSrc, err = d.current.Transform(dst, src[bomSize:], atEOF) + } + return nDst, nSrc + bomSize, err +} diff --git a/vendor/golang.org/x/text/encoding/unicode/unicode.go b/vendor/golang.org/x/text/encoding/unicode/unicode.go new file mode 100644 index 0000000000..5798a3beda --- /dev/null +++ b/vendor/golang.org/x/text/encoding/unicode/unicode.go @@ -0,0 +1,431 @@ +// Copyright 2013 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 unicode provides Unicode encodings such as UTF-16. +package unicode // import "golang.org/x/text/encoding/unicode" + +import ( + "errors" + "unicode/utf16" + "unicode/utf8" + + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/internal" + "golang.org/x/text/encoding/internal/identifier" + "golang.org/x/text/internal/utf8internal" + "golang.org/x/text/runes" + "golang.org/x/text/transform" +) + +// TODO: I think the Transformers really should return errors on unmatched +// surrogate pairs and odd numbers of bytes. This is not required by RFC 2781, +// which leaves it open, but is suggested by WhatWG. It will allow for all error +// modes as defined by WhatWG: fatal, HTML and Replacement. This would require +// the introduction of some kind of error type for conveying the erroneous code +// point. + +// TODO: +// - Define UTF-32? + +// UTF8 is the UTF-8 encoding. +var UTF8 encoding.Encoding = utf8enc + +var utf8enc = &internal.Encoding{ + &internal.SimpleEncoding{utf8Decoder{}, runes.ReplaceIllFormed()}, + "UTF-8", + identifier.UTF8, +} + +type utf8Decoder struct{ transform.NopResetter } + +func (utf8Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + var pSrc int // point from which to start copy in src + var accept utf8internal.AcceptRange + + // The decoder can only make the input larger, not smaller. + n := len(src) + if len(dst) < n { + err = transform.ErrShortDst + n = len(dst) + atEOF = false + } + for nSrc < n { + c := src[nSrc] + if c < utf8.RuneSelf { + nSrc++ + continue + } + first := utf8internal.First[c] + size := int(first & utf8internal.SizeMask) + if first == utf8internal.FirstInvalid { + goto handleInvalid // invalid starter byte + } + accept = utf8internal.AcceptRanges[first>>utf8internal.AcceptShift] + if nSrc+size > n { + if !atEOF { + // We may stop earlier than necessary here if the short sequence + // has invalid bytes. Not checking for this simplifies the code + // and may avoid duplicate computations in certain conditions. + if err == nil { + err = transform.ErrShortSrc + } + break + } + // Determine the maximal subpart of an ill-formed subsequence. + switch { + case nSrc+1 >= n || src[nSrc+1] < accept.Lo || accept.Hi < src[nSrc+1]: + size = 1 + case nSrc+2 >= n || src[nSrc+2] < utf8internal.LoCB || utf8internal.HiCB < src[nSrc+2]: + size = 2 + default: + size = 3 // As we are short, the maximum is 3. + } + goto handleInvalid + } + if c = src[nSrc+1]; c < accept.Lo || accept.Hi < c { + size = 1 + goto handleInvalid // invalid continuation byte + } else if size == 2 { + } else if c = src[nSrc+2]; c < utf8internal.LoCB || utf8internal.HiCB < c { + size = 2 + goto handleInvalid // invalid continuation byte + } else if size == 3 { + } else if c = src[nSrc+3]; c < utf8internal.LoCB || utf8internal.HiCB < c { + size = 3 + goto handleInvalid // invalid continuation byte + } + nSrc += size + continue + + handleInvalid: + // Copy the scanned input so far. + nDst += copy(dst[nDst:], src[pSrc:nSrc]) + + // Append RuneError to the destination. + const runeError = "\ufffd" + if nDst+len(runeError) > len(dst) { + return nDst, nSrc, transform.ErrShortDst + } + nDst += copy(dst[nDst:], runeError) + + // Skip the maximal subpart of an ill-formed subsequence according to + // the W3C standard way instead of the Go way. This Transform is + // probably the only place in the text repo where it is warranted. + nSrc += size + pSrc = nSrc + + // Recompute the maximum source length. + if sz := len(dst) - nDst; sz < len(src)-nSrc { + err = transform.ErrShortDst + n = nSrc + sz + atEOF = false + } + } + return nDst + copy(dst[nDst:], src[pSrc:nSrc]), nSrc, err +} + +// UTF16 returns a UTF-16 Encoding for the given default endianness and byte +// order mark (BOM) policy. +// +// When decoding from UTF-16 to UTF-8, if the BOMPolicy is IgnoreBOM then +// neither BOMs U+FEFF nor noncharacters U+FFFE in the input stream will affect +// the endianness used for decoding, and will instead be output as their +// standard UTF-8 encodings: "\xef\xbb\xbf" and "\xef\xbf\xbe". If the BOMPolicy +// is UseBOM or ExpectBOM a staring BOM is not written to the UTF-8 output. +// Instead, it overrides the default endianness e for the remainder of the +// transformation. Any subsequent BOMs U+FEFF or noncharacters U+FFFE will not +// affect the endianness used, and will instead be output as their standard +// UTF-8 encodings. For UseBOM, if there is no starting BOM, it will proceed +// with the default Endianness. For ExpectBOM, in that case, the transformation +// will return early with an ErrMissingBOM error. +// +// When encoding from UTF-8 to UTF-16, a BOM will be inserted at the start of +// the output if the BOMPolicy is UseBOM or ExpectBOM. Otherwise, a BOM will not +// be inserted. The UTF-8 input does not need to contain a BOM. +// +// There is no concept of a 'native' endianness. If the UTF-16 data is produced +// and consumed in a greater context that implies a certain endianness, use +// IgnoreBOM. Otherwise, use ExpectBOM and always produce and consume a BOM. +// +// In the language of http://www.unicode.org/faq/utf_bom.html#bom10, IgnoreBOM +// corresponds to "Where the precise type of the data stream is known... the +// BOM should not be used" and ExpectBOM corresponds to "A particular +// protocol... may require use of the BOM". +func UTF16(e Endianness, b BOMPolicy) encoding.Encoding { + return utf16Encoding{config{e, b}, mibValue[e][b&bomMask]} +} + +// mibValue maps Endianness and BOMPolicy settings to MIB constants. Note that +// some configurations map to the same MIB identifier. RFC 2781 has requirements +// and recommendations. Some of the "configurations" are merely recommendations, +// so multiple configurations could match. +var mibValue = map[Endianness][numBOMValues]identifier.MIB{ + BigEndian: [numBOMValues]identifier.MIB{ + IgnoreBOM: identifier.UTF16BE, + UseBOM: identifier.UTF16, // BigEnding default is preferred by RFC 2781. + // TODO: acceptBOM | strictBOM would map to UTF16BE as well. + }, + LittleEndian: [numBOMValues]identifier.MIB{ + IgnoreBOM: identifier.UTF16LE, + UseBOM: identifier.UTF16, // LittleEndian default is allowed and preferred on Windows. + // TODO: acceptBOM | strictBOM would map to UTF16LE as well. + }, + // ExpectBOM is not widely used and has no valid MIB identifier. +} + +// All lists a configuration for each IANA-defined UTF-16 variant. +var All = []encoding.Encoding{ + UTF8, + UTF16(BigEndian, UseBOM), + UTF16(BigEndian, IgnoreBOM), + UTF16(LittleEndian, IgnoreBOM), +} + +// BOMPolicy is a UTF-16 encoding's byte order mark policy. +type BOMPolicy uint8 + +const ( + writeBOM BOMPolicy = 0x01 + acceptBOM BOMPolicy = 0x02 + requireBOM BOMPolicy = 0x04 + bomMask BOMPolicy = 0x07 + + // HACK: numBOMValues == 8 triggers a bug in the 1.4 compiler (cannot have a + // map of an array of length 8 of a type that is also used as a key or value + // in another map). See golang.org/issue/11354. + // TODO: consider changing this value back to 8 if the use of 1.4.* has + // been minimized. + numBOMValues = 8 + 1 + + // IgnoreBOM means to ignore any byte order marks. + IgnoreBOM BOMPolicy = 0 + // Common and RFC 2781-compliant interpretation for UTF-16BE/LE. + + // UseBOM means that the UTF-16 form may start with a byte order mark, which + // will be used to override the default encoding. + UseBOM BOMPolicy = writeBOM | acceptBOM + // Common and RFC 2781-compliant interpretation for UTF-16. + + // ExpectBOM means that the UTF-16 form must start with a byte order mark, + // which will be used to override the default encoding. + ExpectBOM BOMPolicy = writeBOM | acceptBOM | requireBOM + // Used in Java as Unicode (not to be confused with Java's UTF-16) and + // ICU's UTF-16,version=1. Not compliant with RFC 2781. + + // TODO (maybe): strictBOM: BOM must match Endianness. This would allow: + // - UTF-16(B|L)E,version=1: writeBOM | acceptBOM | requireBOM | strictBOM + // (UnicodeBig and UnicodeLittle in Java) + // - RFC 2781-compliant, but less common interpretation for UTF-16(B|L)E: + // acceptBOM | strictBOM (e.g. assigned to CheckBOM). + // This addition would be consistent with supporting ExpectBOM. +) + +// Endianness is a UTF-16 encoding's default endianness. +type Endianness bool + +const ( + // BigEndian is UTF-16BE. + BigEndian Endianness = false + // LittleEndian is UTF-16LE. + LittleEndian Endianness = true +) + +// ErrMissingBOM means that decoding UTF-16 input with ExpectBOM did not find a +// starting byte order mark. +var ErrMissingBOM = errors.New("encoding: missing byte order mark") + +type utf16Encoding struct { + config + mib identifier.MIB +} + +type config struct { + endianness Endianness + bomPolicy BOMPolicy +} + +func (u utf16Encoding) NewDecoder() *encoding.Decoder { + return &encoding.Decoder{Transformer: &utf16Decoder{ + initial: u.config, + current: u.config, + }} +} + +func (u utf16Encoding) NewEncoder() *encoding.Encoder { + return &encoding.Encoder{Transformer: &utf16Encoder{ + endianness: u.endianness, + initialBOMPolicy: u.bomPolicy, + currentBOMPolicy: u.bomPolicy, + }} +} + +func (u utf16Encoding) ID() (mib identifier.MIB, other string) { + return u.mib, "" +} + +func (u utf16Encoding) String() string { + e, b := "B", "" + if u.endianness == LittleEndian { + e = "L" + } + switch u.bomPolicy { + case ExpectBOM: + b = "Expect" + case UseBOM: + b = "Use" + case IgnoreBOM: + b = "Ignore" + } + return "UTF-16" + e + "E (" + b + " BOM)" +} + +type utf16Decoder struct { + initial config + current config +} + +func (u *utf16Decoder) Reset() { + u.current = u.initial +} + +func (u *utf16Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + if u.current.bomPolicy&acceptBOM != 0 { + if len(src) < 2 { + return 0, 0, transform.ErrShortSrc + } + switch { + case src[0] == 0xfe && src[1] == 0xff: + u.current.endianness = BigEndian + nSrc = 2 + case src[0] == 0xff && src[1] == 0xfe: + u.current.endianness = LittleEndian + nSrc = 2 + default: + if u.current.bomPolicy&requireBOM != 0 { + return 0, 0, ErrMissingBOM + } + } + u.current.bomPolicy = IgnoreBOM + } + + var r rune + var dSize, sSize int + for nSrc < len(src) { + if nSrc+1 < len(src) { + x := uint16(src[nSrc+0])<<8 | uint16(src[nSrc+1]) + if u.current.endianness == LittleEndian { + x = x>>8 | x<<8 + } + r, sSize = rune(x), 2 + if utf16.IsSurrogate(r) { + if nSrc+3 < len(src) { + x = uint16(src[nSrc+2])<<8 | uint16(src[nSrc+3]) + if u.current.endianness == LittleEndian { + x = x>>8 | x<<8 + } + // Save for next iteration if it is not a high surrogate. + if isHighSurrogate(rune(x)) { + r, sSize = utf16.DecodeRune(r, rune(x)), 4 + } + } else if !atEOF { + err = transform.ErrShortSrc + break + } + } + if dSize = utf8.RuneLen(r); dSize < 0 { + r, dSize = utf8.RuneError, 3 + } + } else if atEOF { + // Single trailing byte. + r, dSize, sSize = utf8.RuneError, 3, 1 + } else { + err = transform.ErrShortSrc + break + } + if nDst+dSize > len(dst) { + err = transform.ErrShortDst + break + } + nDst += utf8.EncodeRune(dst[nDst:], r) + nSrc += sSize + } + return nDst, nSrc, err +} + +func isHighSurrogate(r rune) bool { + return 0xDC00 <= r && r <= 0xDFFF +} + +type utf16Encoder struct { + endianness Endianness + initialBOMPolicy BOMPolicy + currentBOMPolicy BOMPolicy +} + +func (u *utf16Encoder) Reset() { + u.currentBOMPolicy = u.initialBOMPolicy +} + +func (u *utf16Encoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + if u.currentBOMPolicy&writeBOM != 0 { + if len(dst) < 2 { + return 0, 0, transform.ErrShortDst + } + dst[0], dst[1] = 0xfe, 0xff + u.currentBOMPolicy = IgnoreBOM + nDst = 2 + } + + r, size := rune(0), 0 + for nSrc < len(src) { + r = rune(src[nSrc]) + + // Decode a 1-byte rune. + if r < utf8.RuneSelf { + size = 1 + + } else { + // Decode a multi-byte rune. + r, size = utf8.DecodeRune(src[nSrc:]) + if size == 1 { + // All valid runes of size 1 (those below utf8.RuneSelf) were + // handled above. We have invalid UTF-8 or we haven't seen the + // full character yet. + if !atEOF && !utf8.FullRune(src[nSrc:]) { + err = transform.ErrShortSrc + break + } + } + } + + if r <= 0xffff { + if nDst+2 > len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst+0] = uint8(r >> 8) + dst[nDst+1] = uint8(r) + nDst += 2 + } else { + if nDst+4 > len(dst) { + err = transform.ErrShortDst + break + } + r1, r2 := utf16.EncodeRune(r) + dst[nDst+0] = uint8(r1 >> 8) + dst[nDst+1] = uint8(r1) + dst[nDst+2] = uint8(r2 >> 8) + dst[nDst+3] = uint8(r2) + nDst += 4 + } + nSrc += size + } + + if u.endianness == LittleEndian { + for i := 0; i < nDst; i += 2 { + dst[i], dst[i+1] = dst[i+1], dst[i] + } + } + return nDst, nSrc, err +} diff --git a/vendor/golang.org/x/text/encoding/unicode/unicode_test.go b/vendor/golang.org/x/text/encoding/unicode/unicode_test.go new file mode 100644 index 0000000000..2bc9615698 --- /dev/null +++ b/vendor/golang.org/x/text/encoding/unicode/unicode_test.go @@ -0,0 +1,178 @@ +// 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 unicode + +import ( + "testing" + + "golang.org/x/text/transform" +) + +func TestUTF8Decoder(t *testing.T) { + testCases := []struct { + desc string + src string + notEOF bool // the inverse of atEOF + sizeDst int + want string + nSrc int + err error + }{{ + desc: "empty string, empty dest buffer", + }, { + desc: "empty string", + sizeDst: 8, + }, { + desc: "empty string, streaming", + notEOF: true, + sizeDst: 8, + }, { + desc: "ascii", + src: "abcde", + sizeDst: 8, + want: "abcde", + nSrc: 5, + }, { + desc: "ascii and error", + src: "ab\x80de", + sizeDst: 7, + want: "ab\ufffdde", + nSrc: 5, + }, { + desc: "valid two-byte sequence", + src: "a\u0300bc", + sizeDst: 7, + want: "a\u0300bc", + nSrc: 5, + }, { + desc: "valid three-byte sequence", + src: "a\u0300中", + sizeDst: 7, + want: "a\u0300中", + nSrc: 6, + }, { + desc: "valid four-byte sequence", + src: "a中\U00016F50", + sizeDst: 8, + want: "a中\U00016F50", + nSrc: 8, + }, { + desc: "short source buffer", + src: "abc\xf0\x90", + notEOF: true, + sizeDst: 10, + want: "abc", + nSrc: 3, + err: transform.ErrShortSrc, + }, { + // We don't check for the maximal subpart of an ill-formed subsequence + // at the end of an open segment. + desc: "complete invalid that looks like short at end", + src: "abc\xf0\x80", + notEOF: true, + sizeDst: 10, + want: "abc", // instead of "abc\ufffd\ufffd", + nSrc: 3, + err: transform.ErrShortSrc, + }, { + desc: "incomplete sequence at end", + src: "a\x80bc\xf0\x90", + sizeDst: 9, + want: "a\ufffdbc\ufffd", + nSrc: 6, + }, { + desc: "invalid second byte", + src: "abc\xf0dddd", + sizeDst: 10, + want: "abc\ufffddddd", + nSrc: 8, + }, { + desc: "invalid second byte at end", + src: "abc\xf0d", + sizeDst: 10, + want: "abc\ufffdd", + nSrc: 5, + }, { + desc: "invalid third byte", + src: "a\u0300bc\xf0\x90dddd", + sizeDst: 12, + want: "a\u0300bc\ufffddddd", + nSrc: 11, + }, { + desc: "invalid third byte at end", + src: "a\u0300bc\xf0\x90d", + sizeDst: 12, + want: "a\u0300bc\ufffdd", + nSrc: 8, + }, { + desc: "invalid fourth byte, tight buffer", + src: "a\u0300bc\xf0\x90\x80d", + sizeDst: 9, + want: "a\u0300bc\ufffdd", + nSrc: 9, + }, { + desc: "invalid fourth byte at end", + src: "a\u0300bc\xf0\x90\x80", + sizeDst: 8, + want: "a\u0300bc\ufffd", + nSrc: 8, + }, { + desc: "invalid fourth byte and short four byte sequence", + src: "a\u0300bc\xf0\x90\x80\xf0\x90\x80", + notEOF: true, + sizeDst: 20, + want: "a\u0300bc\ufffd", + nSrc: 8, + err: transform.ErrShortSrc, + }, { + desc: "valid four-byte sequence overflowing short buffer", + src: "a\u0300bc\xf0\x90\x80\x80", + notEOF: true, + sizeDst: 8, + want: "a\u0300bc", + nSrc: 5, + err: transform.ErrShortDst, + }, { + desc: "invalid fourth byte at end short, but short dst", + src: "a\u0300bc\xf0\x90\x80\xf0\x90\x80", + notEOF: true, + sizeDst: 8, + // More bytes would fit in the buffer, but this seems to require a more + // complicated and slower algorithm. + want: "a\u0300bc", // instead of "a\u0300bc" + nSrc: 5, + err: transform.ErrShortDst, + }, { + desc: "short dst for error", + src: "abc\x80", + notEOF: true, + sizeDst: 5, + want: "abc", + nSrc: 3, + err: transform.ErrShortDst, + }, { + desc: "adjusting short dst buffer", + src: "abc\x80ef", + notEOF: true, + sizeDst: 6, + want: "abc\ufffd", + nSrc: 4, + err: transform.ErrShortDst, + }} + tr := UTF8.NewDecoder() + for i, tc := range testCases { + b := make([]byte, tc.sizeDst) + nDst, nSrc, err := tr.Transform(b, []byte(tc.src), !tc.notEOF) + if err != tc.err { + t.Errorf("%d:%s: error was %v; want %v", i, tc.desc, err, tc.err) + } + if got := string(b[:nDst]); got != tc.want { + t.Errorf("%d:%s: result was %q: want %q", i, tc.desc, got, tc.want) + } + if nSrc != tc.nSrc { + t.Errorf("%d:%s: nSrc was %d; want %d", i, tc.desc, nSrc, tc.nSrc) + } + } +} diff --git a/vendor/golang.org/x/text/gen.go b/vendor/golang.org/x/text/gen.go new file mode 100644 index 0000000000..6a977e266f --- /dev/null +++ b/vendor/golang.org/x/text/gen.go @@ -0,0 +1,177 @@ +// 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 ignore + +// gen runs go generate on Unicode- and CLDR-related package in the text +// repositories, taking into account dependencies and versions. +package main + +import ( + "bytes" + "flag" + "fmt" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "sync" + "unicode" + + "golang.org/x/text/internal/gen" +) + +var ( + verbose = flag.Bool("v", false, "verbose output") + force = flag.Bool("force", false, "ignore failing dependencies") + excludeList = flag.String("exclude", "", + "comma-separated list of packages to exclude") + + // The user can specify a selection of packages to build on the command line. + args []string +) + +func exclude(pkg string) bool { + if len(args) > 0 { + return !contains(args, pkg) + } + return contains(strings.Split(*excludeList, ","), pkg) +} + +// TODO: +// - Better version handling. +// - Generate tables for the core unicode package? +// - Add generation for encodings. This requires some retooling here and there. +// - Running repo-wide "long" tests. + +var vprintf = fmt.Printf + +func main() { + gen.Init() + args = flag.Args() + if !*verbose { + // Set vprintf to a no-op. + vprintf = func(string, ...interface{}) (int, error) { return 0, nil } + } + + // TODO: create temporary cache directory to load files and create and set + // a "cache" option if the user did not specify the UNICODE_DIR environment + // variable. This will prevent duplicate downloads and also will enable long + // tests, which really need to be run after each generated package. + + if gen.UnicodeVersion() != unicode.Version { + fmt.Printf("Requested Unicode version %s; core unicode version is %s.\n", + gen.UnicodeVersion, + unicode.Version) + // TODO: use collate to compare. Simple comparison will work, though, + // until Unicode reaches version 10. To avoid circular dependencies, we + // could use the NumericWeighter without using package collate using a + // trivial Weighter implementation. + if gen.UnicodeVersion() < unicode.Version && !*force { + os.Exit(2) + } + } + var ( + cldr = generate("unicode/cldr") + language = generate("language", cldr) + internal = generate("internal", language) + norm = generate("unicode/norm") + rangetable = generate("unicode/rangetable") + cases = generate("cases", norm, language, rangetable) + width = generate("width") + bidi = generate("unicode/bidi", norm, rangetable) + _ = generate("secure/precis", norm, rangetable, cases, width, bidi) + _ = generate("encoding/htmlindex", language) + _ = generate("currency", cldr, language, internal) + _ = generate("internal/number", cldr, language, internal) + _ = generate("language/display", cldr, language) + _ = generate("collate", norm, cldr, language, rangetable) + _ = generate("search", norm, cldr, language, rangetable) + ) + all.Wait() + + if hasErrors { + fmt.Println("FAIL") + os.Exit(1) + } + vprintf("SUCCESS\n") +} + +var ( + all sync.WaitGroup + hasErrors bool +) + +type dependency struct { + sync.WaitGroup + hasErrors bool +} + +func generate(pkg string, deps ...*dependency) *dependency { + var wg dependency + if exclude(pkg) { + return &wg + } + wg.Add(1) + all.Add(1) + go func() { + defer wg.Done() + defer all.Done() + // Wait for dependencies to finish. + for _, d := range deps { + d.Wait() + if d.hasErrors && !*force { + fmt.Printf("--- ABORT: %s\n", pkg) + wg.hasErrors = true + return + } + } + vprintf("=== GENERATE %s\n", pkg) + args := []string{"generate"} + if *verbose { + args = append(args, "-v") + } + args = append(args, "./"+pkg) + cmd := exec.Command(filepath.Join(runtime.GOROOT(), "bin", "go"), args...) + w := &bytes.Buffer{} + cmd.Stderr = w + cmd.Stdout = w + if err := cmd.Run(); err != nil { + fmt.Printf("--- FAIL: %s:\n\t%v\n\tError: %v\n", pkg, indent(w), err) + hasErrors = true + wg.hasErrors = true + return + } + + vprintf("=== TEST %s\n", pkg) + args[0] = "test" + cmd = exec.Command(filepath.Join(runtime.GOROOT(), "bin", "go"), args...) + wt := &bytes.Buffer{} + cmd.Stderr = wt + cmd.Stdout = wt + if err := cmd.Run(); err != nil { + fmt.Printf("--- FAIL: %s:\n\t%v\n\tError: %v\n", pkg, indent(wt), err) + hasErrors = true + wg.hasErrors = true + return + } + vprintf("--- SUCCESS: %s\n\t%v\n", pkg, indent(w)) + fmt.Print(wt.String()) + }() + return &wg +} + +func contains(a []string, s string) bool { + for _, e := range a { + if s == e { + return true + } + } + return false +} + +func indent(b *bytes.Buffer) string { + return strings.Replace(strings.TrimSpace(b.String()), "\n", "\n\t", -1) +} diff --git a/vendor/golang.org/x/text/internal/colltab/colltab.go b/vendor/golang.org/x/text/internal/colltab/colltab.go new file mode 100644 index 0000000000..02f22477ec --- /dev/null +++ b/vendor/golang.org/x/text/internal/colltab/colltab.go @@ -0,0 +1,105 @@ +// 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 colltab contains functionality related to collation tables. +// It is only to be used by the collate and search packages. +package colltab // import "golang.org/x/text/internal/colltab" + +import ( + "sort" + + "golang.org/x/text/language" +) + +// MatchLang finds the index of t in tags, using a matching algorithm used for +// collation and search. tags[0] must be language.Und, the remaining tags should +// be sorted alphabetically. +// +// Language matching for collation and search is different from the matching +// defined by language.Matcher: the (inferred) base language must be an exact +// match for the relevant fields. For example, "gsw" should not match "de". +// Also the parent relation is different, as a parent may have a different +// script. So usually the parent of zh-Hant is und, whereas for MatchLang it is +// zh. +func MatchLang(t language.Tag, tags []language.Tag) int { + // Canonicalize the values, including collapsing macro languages. + t, _ = language.All.Canonicalize(t) + + base, conf := t.Base() + // Estimate the base language, but only use high-confidence values. + if conf < language.High { + // The root locale supports "search" and "standard". We assume that any + // implementation will only use one of both. + return 0 + } + + // Maximize base and script and normalize the tag. + if _, s, r := t.Raw(); (r != language.Region{}) { + p, _ := language.Raw.Compose(base, s, r) + // Taking the parent forces the script to be maximized. + p = p.Parent() + // Add back region and extensions. + t, _ = language.Raw.Compose(p, r, t.Extensions()) + } else { + // Set the maximized base language. + t, _ = language.Raw.Compose(base, s, t.Extensions()) + } + + // Find start index of the language tag. + start := 1 + sort.Search(len(tags)-1, func(i int) bool { + b, _, _ := tags[i+1].Raw() + return base.String() <= b.String() + }) + if start < len(tags) { + if b, _, _ := tags[start].Raw(); b != base { + return 0 + } + } + + // Besides the base language, script and region, only the collation type and + // the custom variant defined in the 'u' extension are used to distinguish a + // locale. + // Strip all variants and extensions and add back the custom variant. + tdef, _ := language.Raw.Compose(t.Raw()) + tdef, _ = tdef.SetTypeForKey("va", t.TypeForKey("va")) + + // First search for a specialized collation type, if present. + try := []language.Tag{tdef} + if co := t.TypeForKey("co"); co != "" { + tco, _ := tdef.SetTypeForKey("co", co) + try = []language.Tag{tco, tdef} + } + + for _, tx := range try { + for ; tx != language.Und; tx = parent(tx) { + for i, t := range tags[start:] { + if b, _, _ := t.Raw(); b != base { + break + } + if tx == t { + return start + i + } + } + } + } + return 0 +} + +// parent computes the structural parent. This means inheritance may change +// script. So, unlike the CLDR parent, parent(zh-Hant) == zh. +func parent(t language.Tag) language.Tag { + if t.TypeForKey("va") != "" { + t, _ = t.SetTypeForKey("va", "") + return t + } + result := language.Und + if b, s, r := t.Raw(); (r != language.Region{}) { + result, _ = language.Raw.Compose(b, s, t.Extensions()) + } else if (s != language.Script{}) { + result, _ = language.Raw.Compose(b, t.Extensions()) + } else if (b != language.Base{}) { + result, _ = language.Raw.Compose(t.Extensions()) + } + return result +} diff --git a/vendor/golang.org/x/text/internal/colltab/colltab_test.go b/vendor/golang.org/x/text/internal/colltab/colltab_test.go new file mode 100644 index 0000000000..177ec7b1dc --- /dev/null +++ b/vendor/golang.org/x/text/internal/colltab/colltab_test.go @@ -0,0 +1,56 @@ +package colltab + +import ( + "testing" + + "golang.org/x/text/language" +) + +func TestMatchLang(t *testing.T) { + tags := []language.Tag{ + 0: language.Und, + 1: language.MustParse("bs"), + 2: language.German, + 3: language.English, + 4: language.AmericanEnglish, + 5: language.MustParse("en-US-u-va-posix"), + 6: language.Portuguese, + 7: language.Serbian, + 8: language.MustParse("sr-Latn"), + 9: language.Chinese, + 10: language.SimplifiedChinese, // Cannot match. + 11: language.TraditionalChinese, + } + for i, tc := range []struct { + x int + t language.Tag + }{ + {0, language.Und}, + {0, language.Persian}, // Default to first element when no match. + {3, language.English}, + {4, language.AmericanEnglish}, + {5, language.MustParse("en-US-u-va-posix")}, // Ext. variant match. + {4, language.MustParse("en-US-u-va-noposix")}, // Ext. variant mismatch. + {3, language.MustParse("en-UK-u-va-noposix")}, // Ext. variant mismatch. + {7, language.Serbian}, + {0, language.Croatian}, // Don't match to close language! + {0, language.MustParse("gsw")}, // Don't match to close language! + {1, language.MustParse("bs-Cyrl")}, // Odd, but correct. + {1, language.MustParse("bs-Latn")}, // Estimated script drops. + {8, language.MustParse("sr-Latn")}, + {9, language.Chinese}, + {10, language.SimplifiedChinese}, // Default script drops. + {11, language.TraditionalChinese}, + {11, language.MustParse("und-TW")}, // Infer script and language. + {11, language.MustParse("und-HK")}, // Infer script and language. + {6, language.MustParse("und-BR")}, // Infer script and language. + {6, language.MustParse("und-PT")}, // Infer script and language. + {2, language.MustParse("und-Latn-DE")}, // Infer language. + {0, language.MustParse("und-Jpan-BR")}, // Infers "ja", so no match. + {0, language.MustParse("zu")}, // No match past index. + } { + if x := MatchLang(tc.t, tags); x != tc.x { + t.Errorf("%d: MatchLang(%q, tags) = %d; want %d", i, tc.t, x, tc.x) + } + } +} diff --git a/vendor/golang.org/x/text/internal/colltab/contract.go b/vendor/golang.org/x/text/internal/colltab/contract.go new file mode 100644 index 0000000000..54b9795d40 --- /dev/null +++ b/vendor/golang.org/x/text/internal/colltab/contract.go @@ -0,0 +1,145 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package colltab + +import "unicode/utf8" + +// For a description of contractTrieSet, see text/collate/build/contract.go. + +type contractTrieSet []struct{ l, h, n, i uint8 } + +// ctScanner is used to match a trie to an input sequence. +// A contraction may match a non-contiguous sequence of bytes in an input string. +// For example, if there is a contraction for <a, combining_ring>, it should match +// the sequence <a, combining_cedilla, combining_ring>, as combining_cedilla does +// not block combining_ring. +// ctScanner does not automatically skip over non-blocking non-starters, but rather +// retains the state of the last match and leaves it up to the user to continue +// the match at the appropriate points. +type ctScanner struct { + states contractTrieSet + s []byte + n int + index int + pindex int + done bool +} + +type ctScannerString struct { + states contractTrieSet + s string + n int + index int + pindex int + done bool +} + +func (t contractTrieSet) scanner(index, n int, b []byte) ctScanner { + return ctScanner{s: b, states: t[index:], n: n} +} + +func (t contractTrieSet) scannerString(index, n int, str string) ctScannerString { + return ctScannerString{s: str, states: t[index:], n: n} +} + +// result returns the offset i and bytes consumed p so far. If no suffix +// matched, i and p will be 0. +func (s *ctScanner) result() (i, p int) { + return s.index, s.pindex +} + +func (s *ctScannerString) result() (i, p int) { + return s.index, s.pindex +} + +const ( + final = 0 + noIndex = 0xFF +) + +// scan matches the longest suffix at the current location in the input +// and returns the number of bytes consumed. +func (s *ctScanner) scan(p int) int { + pr := p // the p at the rune start + str := s.s + states, n := s.states, s.n + for i := 0; i < n && p < len(str); { + e := states[i] + c := str[p] + // TODO: a significant number of contractions are of a form that + // cannot match discontiguous UTF-8 in a normalized string. We could let + // a negative value of e.n mean that we can set s.done = true and avoid + // the need for additional matches. + if c >= e.l { + if e.l == c { + p++ + if e.i != noIndex { + s.index = int(e.i) + s.pindex = p + } + if e.n != final { + i, states, n = 0, states[int(e.h)+n:], int(e.n) + if p >= len(str) || utf8.RuneStart(str[p]) { + s.states, s.n, pr = states, n, p + } + } else { + s.done = true + return p + } + continue + } else if e.n == final && c <= e.h { + p++ + s.done = true + s.index = int(c-e.l) + int(e.i) + s.pindex = p + return p + } + } + i++ + } + return pr +} + +// scan is a verbatim copy of ctScanner.scan. +func (s *ctScannerString) scan(p int) int { + pr := p // the p at the rune start + str := s.s + states, n := s.states, s.n + for i := 0; i < n && p < len(str); { + e := states[i] + c := str[p] + // TODO: a significant number of contractions are of a form that + // cannot match discontiguous UTF-8 in a normalized string. We could let + // a negative value of e.n mean that we can set s.done = true and avoid + // the need for additional matches. + if c >= e.l { + if e.l == c { + p++ + if e.i != noIndex { + s.index = int(e.i) + s.pindex = p + } + if e.n != final { + i, states, n = 0, states[int(e.h)+n:], int(e.n) + if p >= len(str) || utf8.RuneStart(str[p]) { + s.states, s.n, pr = states, n, p + } + } else { + s.done = true + return p + } + continue + } else if e.n == final && c <= e.h { + p++ + s.done = true + s.index = int(c-e.l) + int(e.i) + s.pindex = p + return p + } + } + i++ + } + return pr +} diff --git a/vendor/golang.org/x/text/internal/colltab/contract_test.go b/vendor/golang.org/x/text/internal/colltab/contract_test.go new file mode 100644 index 0000000000..c37c020ecf --- /dev/null +++ b/vendor/golang.org/x/text/internal/colltab/contract_test.go @@ -0,0 +1,135 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package colltab + +import ( + "testing" +) + +type lookupStrings struct { + str string + offset int + n int // bytes consumed from input +} + +var lookupTests = []struct { + lookup []lookupStrings + n int + tries contractTrieSet +}{ + { + []lookupStrings{ + {"abc", 1, 3}, + {"a", 0, 0}, + {"b", 0, 0}, + {"c", 0, 0}, + {"d", 0, 0}, + }, + 1, + contractTrieSet{ + {'a', 0, 1, 0xFF}, + {'b', 0, 1, 0xFF}, + {'c', 'c', 0, 1}, + }, + }, + { + []lookupStrings{ + {"abc", 1, 3}, + {"abd", 2, 3}, + {"abe", 3, 3}, + {"a", 0, 0}, + {"ab", 0, 0}, + {"d", 0, 0}, + {"f", 0, 0}, + }, + 1, + contractTrieSet{ + {'a', 0, 1, 0xFF}, + {'b', 0, 1, 0xFF}, + {'c', 'e', 0, 1}, + }, + }, + { + []lookupStrings{ + {"abc", 1, 3}, + {"ab", 2, 2}, + {"a", 3, 1}, + {"abcd", 1, 3}, + {"abe", 2, 2}, + }, + 1, + contractTrieSet{ + {'a', 0, 1, 3}, + {'b', 0, 1, 2}, + {'c', 'c', 0, 1}, + }, + }, + { + []lookupStrings{ + {"abc", 1, 3}, + {"abd", 2, 3}, + {"ab", 3, 2}, + {"ac", 4, 2}, + {"a", 5, 1}, + {"b", 6, 1}, + {"ba", 6, 1}, + }, + 2, + contractTrieSet{ + {'b', 'b', 0, 6}, + {'a', 0, 2, 5}, + {'c', 'c', 0, 4}, + {'b', 0, 1, 3}, + {'c', 'd', 0, 1}, + }, + }, + { + []lookupStrings{ + {"bcde", 2, 4}, + {"bc", 7, 2}, + {"ab", 6, 2}, + {"bcd", 5, 3}, + {"abcd", 1, 4}, + {"abc", 4, 3}, + {"bcdf", 3, 4}, + }, + 2, + contractTrieSet{ + {'b', 3, 1, 0xFF}, + {'a', 0, 1, 0xFF}, + {'b', 0, 1, 6}, + {'c', 0, 1, 4}, + {'d', 'd', 0, 1}, + {'c', 0, 1, 7}, + {'d', 0, 1, 5}, + {'e', 'f', 0, 2}, + }, + }, +} + +func lookup(c *contractTrieSet, nnode int, s []uint8) (i, n int) { + scan := c.scanner(0, nnode, s) + scan.scan(0) + return scan.result() +} + +func TestLookupContraction(t *testing.T) { + for i, tt := range lookupTests { + cts := contractTrieSet(tt.tries) + for j, lu := range tt.lookup { + str := lu.str + for _, s := range []string{str, str + "X"} { + const msg = "%d:%d: %s of %q %v; want %v" + offset, n := lookup(&cts, tt.n, []byte(s)) + if offset != lu.offset { + t.Errorf(msg, i, j, "offset", s, offset, lu.offset) + } + if n != lu.n { + t.Errorf(msg, i, j, "bytes consumed", s, n, len(str)) + } + } + } + } +} diff --git a/vendor/golang.org/x/text/internal/colltab/iter.go b/vendor/golang.org/x/text/internal/colltab/iter.go new file mode 100644 index 0000000000..2e40a88ed6 --- /dev/null +++ b/vendor/golang.org/x/text/internal/colltab/iter.go @@ -0,0 +1,179 @@ +// 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 colltab + +import ( + "golang.org/x/text/collate/colltab" +) + +// An Iter incrementally converts chunks of the input text to collation +// elements, while ensuring that the collation elements are in normalized order +// (that is, they are in the order as if the input text were normalized first). +type Iter struct { + Weighter colltab.Weighter + Elems []colltab.Elem + // N is the number of elements in Elems that will not be reordered on + // subsequent iterations, N <= len(Elems). + N int + + bytes []byte + str string + // Because the Elems buffer may contain collation elements that are needed + // for look-ahead, we need two positions in the text (bytes or str): one for + // the end position in the text for the current iteration and one for the + // start of the next call to appendNext. + pEnd int // end position in text corresponding to N. + pNext int // pEnd <= pNext. +} + +// Reset sets the position in the current input text to p and discards any +// results obtained so far. +func (i *Iter) Reset(p int) { + i.Elems = i.Elems[:0] + i.N = 0 + i.pEnd = p + i.pNext = p +} + +// Len returns the length of the input text. +func (i *Iter) Len() int { + if i.bytes != nil { + return len(i.bytes) + } + return len(i.str) +} + +// Discard removes the collation elements up to N. +func (i *Iter) Discard() { + // TODO: change this such that only modifiers following starters will have + // to be copied. + i.Elems = i.Elems[:copy(i.Elems, i.Elems[i.N:])] + i.N = 0 +} + +// End returns the end position of the input text for which Next has returned +// results. +func (i *Iter) End() int { + return i.pEnd +} + +// SetInput resets i to input s. +func (i *Iter) SetInput(s []byte) { + i.bytes = s + i.str = "" + i.Reset(0) +} + +// SetInputString resets i to input s. +func (i *Iter) SetInputString(s string) { + i.str = s + i.bytes = nil + i.Reset(0) +} + +func (i *Iter) done() bool { + return i.pNext >= len(i.str) && i.pNext >= len(i.bytes) +} + +func (i *Iter) appendNext() bool { + if i.done() { + return false + } + var sz int + if i.bytes == nil { + i.Elems, sz = i.Weighter.AppendNextString(i.Elems, i.str[i.pNext:]) + } else { + i.Elems, sz = i.Weighter.AppendNext(i.Elems, i.bytes[i.pNext:]) + } + i.pNext += sz + return true +} + +// Next appends Elems to the internal array. On each iteration, it will either +// add starters or modifiers. In the majority of cases, an Elem with a primary +// value > 0 will have a CCC of 0. The CCC values of collation elements are also +// used to detect if the input string was not normalized and to adjust the +// result accordingly. +func (i *Iter) Next() bool { + if i.N == len(i.Elems) && !i.appendNext() { + return false + } + + // Check if the current segment starts with a starter. + prevCCC := i.Elems[len(i.Elems)-1].CCC() + if prevCCC == 0 { + i.N = len(i.Elems) + i.pEnd = i.pNext + return true + } else if i.Elems[i.N].CCC() == 0 { + // set i.N to only cover part of i.Elems for which prevCCC == 0 and + // use rest for the next call to next. + for i.N++; i.N < len(i.Elems) && i.Elems[i.N].CCC() == 0; i.N++ { + } + i.pEnd = i.pNext + return true + } + + // The current (partial) segment starts with modifiers. We need to collect + // all successive modifiers to ensure that they are normalized. + for { + p := len(i.Elems) + i.pEnd = i.pNext + if !i.appendNext() { + break + } + + if ccc := i.Elems[p].CCC(); ccc == 0 || len(i.Elems)-i.N > maxCombiningCharacters { + // Leave the starter for the next iteration. This ensures that we + // do not return sequences of collation elements that cross two + // segments. + // + // TODO: handle large number of combining characters by fully + // normalizing the input segment before iteration. This ensures + // results are consistent across the text repo. + i.N = p + return true + } else if ccc < prevCCC { + i.doNorm(p, ccc) // should be rare, never occurs for NFD and FCC. + } else { + prevCCC = ccc + } + } + + done := len(i.Elems) != i.N + i.N = len(i.Elems) + return done +} + +// nextNoNorm is the same as next, but does not "normalize" the collation +// elements. +func (i *Iter) nextNoNorm() bool { + // TODO: remove this function. Using this instead of next does not seem + // to improve performance in any significant way. We retain this until + // later for evaluation purposes. + if i.done() { + return false + } + i.appendNext() + i.N = len(i.Elems) + return true +} + +const maxCombiningCharacters = 30 + +// doNorm reorders the collation elements in i.Elems. +// It assumes that blocks of collation elements added with appendNext +// either start and end with the same CCC or start with CCC == 0. +// This allows for a single insertion point for the entire block. +// The correctness of this assumption is verified in builder.go. +func (i *Iter) doNorm(p int, ccc uint8) { + n := len(i.Elems) + k := p + for p--; p > i.N && ccc < i.Elems[p-1].CCC(); p-- { + } + i.Elems = append(i.Elems, i.Elems[p:k]...) + copy(i.Elems[p:], i.Elems[k:]) + i.Elems = i.Elems[:n] +} diff --git a/vendor/golang.org/x/text/internal/colltab/iter_test.go b/vendor/golang.org/x/text/internal/colltab/iter_test.go new file mode 100644 index 0000000000..05164ab7a8 --- /dev/null +++ b/vendor/golang.org/x/text/internal/colltab/iter_test.go @@ -0,0 +1,77 @@ +// 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 colltab + +import ( + "testing" + + "golang.org/x/text/collate/colltab" +) + +const ( + defaultSecondary = 0x20 +) + +func makeCE(w []int) colltab.Elem { + ce, err := colltab.MakeElem(w[0], w[1], w[2], uint8(w[3])) + if err != nil { + panic(err) + } + return ce +} + +func TestDoNorm(t *testing.T) { + const div = -1 // The insertion point of the next block. + tests := []struct { + in, out []int + }{{ + in: []int{4, div, 3}, + out: []int{3, 4}, + }, { + in: []int{4, div, 3, 3, 3}, + out: []int{3, 3, 3, 4}, + }, { + in: []int{0, 4, div, 3}, + out: []int{0, 3, 4}, + }, { + in: []int{0, 0, 4, 5, div, 3, 3}, + out: []int{0, 0, 3, 3, 4, 5}, + }, { + in: []int{0, 0, 1, 4, 5, div, 3, 3}, + out: []int{0, 0, 1, 3, 3, 4, 5}, + }, { + in: []int{0, 0, 1, 4, 5, div, 4, 4}, + out: []int{0, 0, 1, 4, 4, 4, 5}, + }, + } + for j, tt := range tests { + i := Iter{} + var w, p int + for k, cc := range tt.in { + + if cc == div { + w = 100 + p = k + continue + } + i.Elems = append(i.Elems, makeCE([]int{w, defaultSecondary, 2, cc})) + } + i.doNorm(p, i.Elems[p].CCC()) + if len(i.Elems) != len(tt.out) { + t.Errorf("%d: length was %d; want %d", j, len(i.Elems), len(tt.out)) + } + prevCCC := uint8(0) + for k, ce := range i.Elems { + if int(ce.CCC()) != tt.out[k] { + t.Errorf("%d:%d: unexpected CCC. Was %d; want %d", j, k, ce.CCC(), tt.out[k]) + } + if k > 0 && ce.CCC() == prevCCC && i.Elems[k-1].Primary() > ce.Primary() { + t.Errorf("%d:%d: normalization crossed across CCC boundary.", j, k) + } + } + } + + // Combining rune overflow is tested in search/pattern_test.go. +} diff --git a/vendor/golang.org/x/text/internal/format/format.go b/vendor/golang.org/x/text/internal/format/format.go new file mode 100644 index 0000000000..c70bc0fe27 --- /dev/null +++ b/vendor/golang.org/x/text/internal/format/format.go @@ -0,0 +1,43 @@ +// 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 format contains types for defining language-specific formatting of +// values. +// +// This package is internal now, but will eventually be exposed after the API +// settles. +package format // import "golang.org/x/text/internal/format" + +import ( + "fmt" + + "golang.org/x/text/language" +) + +// State represents the printer state passed to custom formatters. It provides +// access to the fmt.State interface and the sentence and language-related +// context. +type State interface { + fmt.State + + // Language reports the requested language in which to render a message. + Language() language.Tag + + // TODO: more info: + // - sentence context + // - user preferences, like measurement systems + // - options +} + +// A Statement is a Var or an Expression. +type Statement interface { + statement() +} + +// A String a literal string format. +type String string + +func (String) statement() {} + +// TODO: Select, Var, Case, StatementSequence diff --git a/vendor/golang.org/x/text/internal/format/plural/plural.go b/vendor/golang.org/x/text/internal/format/plural/plural.go new file mode 100644 index 0000000000..524d6aaff4 --- /dev/null +++ b/vendor/golang.org/x/text/internal/format/plural/plural.go @@ -0,0 +1,38 @@ +// Copyright 2016 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 plural defines the grammatical plural feature. +// +// The definitions in this package are based on the plural rule handling defined +// in CLDR. See +// http://unicode.org/reports/tr35/tr35-numbers.html#Language_Plural_Rules for +// details. +package plural + +import "golang.org/x/text/internal/format" + +// Form defines a plural form. The meaning of plural forms, as well as which +// forms are supported, vary per language. Each language must at least support +// the form "other". +type Form byte + +const ( + Other Form = iota + Zero + One + Two + Few + Many +) + +// Interface is implemented by values that have a plural feature. +type Interface interface { + // PluralForm reports the plural form of a value, depending on the + // language declared by the given state. + PluralForm(s format.State) Form +} + +// TODO +// - Select function +// - Definition for message package. diff --git a/vendor/golang.org/x/text/internal/gen.go b/vendor/golang.org/x/text/internal/gen.go new file mode 100644 index 0000000000..1d678af574 --- /dev/null +++ b/vendor/golang.org/x/text/internal/gen.go @@ -0,0 +1,52 @@ +// 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 ignore + +package main + +import ( + "log" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/language" + "golang.org/x/text/unicode/cldr" +) + +func main() { + r := gen.OpenCLDRCoreZip() + defer r.Close() + + d := &cldr.Decoder{} + data, err := d.DecodeZip(r) + if err != nil { + log.Fatalf("DecodeZip: %v", err) + } + + w := gen.NewCodeWriter() + defer w.WriteGoFile("tables.go", "internal") + + // Create parents table. + parents := make([]uint16, language.NumCompactTags) + for _, loc := range data.Locales() { + tag := language.MustParse(loc) + index, ok := language.CompactIndex(tag) + if !ok { + continue + } + parentIndex := 0 // und + for p := tag.Parent(); p != language.Und; p = p.Parent() { + if x, ok := language.CompactIndex(p); ok { + parentIndex = x + break + } + } + parents[index] = uint16(parentIndex) + } + + w.WriteComment(` + Parent maps a compact index of a tag to the compact index of the parent of + this tag.`) + w.WriteVar("Parent", parents) +} diff --git a/vendor/golang.org/x/text/internal/gen/code.go b/vendor/golang.org/x/text/internal/gen/code.go new file mode 100644 index 0000000000..2453308806 --- /dev/null +++ b/vendor/golang.org/x/text/internal/gen/code.go @@ -0,0 +1,338 @@ +// 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 gen + +import ( + "bytes" + "encoding/gob" + "fmt" + "hash" + "hash/fnv" + "io" + "log" + "os" + "reflect" + "strings" + "unicode" + "unicode/utf8" +) + +// This file contains utilities for generating code. + +// TODO: other write methods like: +// - slices, maps, types, etc. + +// CodeWriter is a utility for writing structured code. It computes the content +// hash and size of written content. It ensures there are newlines between +// written code blocks. +type CodeWriter struct { + buf bytes.Buffer + Size int + Hash hash.Hash32 // content hash + gob *gob.Encoder + // For comments we skip the usual one-line separator if they are followed by + // a code block. + skipSep bool +} + +func (w *CodeWriter) Write(p []byte) (n int, err error) { + return w.buf.Write(p) +} + +// NewCodeWriter returns a new CodeWriter. +func NewCodeWriter() *CodeWriter { + h := fnv.New32() + return &CodeWriter{Hash: h, gob: gob.NewEncoder(h)} +} + +// WriteGoFile appends the buffer with the total size of all created structures +// and writes it as a Go file to the the given file with the given package name. +func (w *CodeWriter) WriteGoFile(filename, pkg string) { + f, err := os.Create(filename) + if err != nil { + log.Fatalf("Could not create file %s: %v", filename, err) + } + defer f.Close() + if _, err = w.WriteGo(f, pkg); err != nil { + log.Fatalf("Error writing file %s: %v", filename, err) + } +} + +// WriteGo appends the buffer with the total size of all created structures and +// writes it as a Go file to the the given writer with the given package name. +func (w *CodeWriter) WriteGo(out io.Writer, pkg string) (n int, err error) { + sz := w.Size + w.WriteComment("Total table size %d bytes (%dKiB); checksum: %X\n", sz, sz/1024, w.Hash.Sum32()) + defer w.buf.Reset() + return WriteGo(out, pkg, w.buf.Bytes()) +} + +func (w *CodeWriter) printf(f string, x ...interface{}) { + fmt.Fprintf(w, f, x...) +} + +func (w *CodeWriter) insertSep() { + if w.skipSep { + w.skipSep = false + return + } + // Use at least two newlines to ensure a blank space between the previous + // block. WriteGoFile will remove extraneous newlines. + w.printf("\n\n") +} + +// WriteComment writes a comment block. All line starts are prefixed with "//". +// Initial empty lines are gobbled. The indentation for the first line is +// stripped from consecutive lines. +func (w *CodeWriter) WriteComment(comment string, args ...interface{}) { + s := fmt.Sprintf(comment, args...) + s = strings.Trim(s, "\n") + + // Use at least two newlines to ensure a blank space between the previous + // block. WriteGoFile will remove extraneous newlines. + w.printf("\n\n// ") + w.skipSep = true + + // strip first indent level. + sep := "\n" + for ; len(s) > 0 && (s[0] == '\t' || s[0] == ' '); s = s[1:] { + sep += s[:1] + } + + strings.NewReplacer(sep, "\n// ", "\n", "\n// ").WriteString(w, s) + + w.printf("\n") +} + +func (w *CodeWriter) writeSizeInfo(size int) { + w.printf("// Size: %d bytes\n", size) +} + +// WriteConst writes a constant of the given name and value. +func (w *CodeWriter) WriteConst(name string, x interface{}) { + w.insertSep() + v := reflect.ValueOf(x) + + switch v.Type().Kind() { + case reflect.String: + // See golang.org/issue/13145. + const arbitraryCutoff = 16 + if v.Len() > arbitraryCutoff { + w.printf("var %s %s = ", name, typeName(x)) + } else { + w.printf("const %s %s = ", name, typeName(x)) + } + w.WriteString(v.String()) + w.printf("\n") + default: + w.printf("const %s = %#v\n", name, x) + } +} + +// WriteVar writes a variable of the given name and value. +func (w *CodeWriter) WriteVar(name string, x interface{}) { + w.insertSep() + v := reflect.ValueOf(x) + oldSize := w.Size + sz := int(v.Type().Size()) + w.Size += sz + + switch v.Type().Kind() { + case reflect.String: + w.printf("var %s %s = ", name, typeName(x)) + w.WriteString(v.String()) + case reflect.Struct: + w.gob.Encode(x) + fallthrough + case reflect.Slice, reflect.Array: + w.printf("var %s = ", name) + w.writeValue(v) + w.writeSizeInfo(w.Size - oldSize) + default: + w.printf("var %s %s = ", name, typeName(x)) + w.gob.Encode(x) + w.writeValue(v) + w.writeSizeInfo(w.Size - oldSize) + } + w.printf("\n") +} + +func (w *CodeWriter) writeValue(v reflect.Value) { + x := v.Interface() + switch v.Kind() { + case reflect.String: + w.WriteString(v.String()) + case reflect.Array: + // Don't double count: callers of WriteArray count on the size being + // added, so we need to discount it here. + w.Size -= int(v.Type().Size()) + w.writeSlice(x, true) + case reflect.Slice: + w.writeSlice(x, false) + case reflect.Struct: + w.printf("%s{\n", typeName(v.Interface())) + t := v.Type() + for i := 0; i < v.NumField(); i++ { + w.printf("%s: ", t.Field(i).Name) + w.writeValue(v.Field(i)) + w.printf(",\n") + } + w.printf("}") + default: + w.printf("%#v", x) + } +} + +// WriteString writes a string literal. +func (w *CodeWriter) WriteString(s string) { + io.WriteString(w.Hash, s) // content hash + w.Size += len(s) + + const maxInline = 40 + if len(s) <= maxInline { + w.printf("%q", s) + return + } + + // We will render the string as a multi-line string. + const maxWidth = 80 - 4 - len(`"`) - len(`" +`) + + // When starting on its own line, go fmt indents line 2+ an extra level. + n, max := maxWidth, maxWidth-4 + + // Print "" +\n, if a string does not start on its own line. + b := w.buf.Bytes() + if p := len(bytes.TrimRight(b, " \t")); p > 0 && b[p-1] != '\n' { + w.printf("\"\" + // Size: %d bytes\n", len(s)) + n, max = maxWidth, maxWidth + } + + w.printf(`"`) + + for sz, p := 0, 0; p < len(s); { + var r rune + r, sz = utf8.DecodeRuneInString(s[p:]) + out := s[p : p+sz] + chars := 1 + if !unicode.IsPrint(r) || r == utf8.RuneError { + switch sz { + case 1: + out = fmt.Sprintf("\\x%02x", s[p]) + case 2, 3: + out = fmt.Sprintf("\\u%04x", r) + case 4: + out = fmt.Sprintf("\\U%08x", r) + } + chars = len(out) + } + if n -= chars; n < 0 { + w.printf("\" +\n\"") + n = max - len(out) + } + w.printf("%s", out) + p += sz + } + w.printf(`"`) +} + +// WriteSlice writes a slice value. +func (w *CodeWriter) WriteSlice(x interface{}) { + w.writeSlice(x, false) +} + +// WriteArray writes an array value. +func (w *CodeWriter) WriteArray(x interface{}) { + w.writeSlice(x, true) +} + +func (w *CodeWriter) writeSlice(x interface{}, isArray bool) { + v := reflect.ValueOf(x) + w.gob.Encode(v.Len()) + w.Size += v.Len() * int(v.Type().Elem().Size()) + name := typeName(x) + if isArray { + name = fmt.Sprintf("[%d]%s", v.Len(), name[strings.Index(name, "]")+1:]) + } + if isArray { + w.printf("%s{\n", name) + } else { + w.printf("%s{ // %d elements\n", name, v.Len()) + } + + switch kind := v.Type().Elem().Kind(); kind { + case reflect.String: + for _, s := range x.([]string) { + w.WriteString(s) + w.printf(",\n") + } + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + // nLine and nBlock are the number of elements per line and block. + nLine, nBlock, format := 8, 64, "%d," + switch kind { + case reflect.Uint8: + format = "%#02x," + case reflect.Uint16: + format = "%#04x," + case reflect.Uint32: + nLine, nBlock, format = 4, 32, "%#08x," + case reflect.Uint, reflect.Uint64: + nLine, nBlock, format = 4, 32, "%#016x," + case reflect.Int8: + nLine = 16 + } + n := nLine + for i := 0; i < v.Len(); i++ { + if i%nBlock == 0 && v.Len() > nBlock { + w.printf("// Entry %X - %X\n", i, i+nBlock-1) + } + x := v.Index(i).Interface() + w.gob.Encode(x) + w.printf(format, x) + if n--; n == 0 { + n = nLine + w.printf("\n") + } + } + w.printf("\n") + case reflect.Struct: + zero := reflect.Zero(v.Type().Elem()).Interface() + for i := 0; i < v.Len(); i++ { + x := v.Index(i).Interface() + w.gob.EncodeValue(v) + if !reflect.DeepEqual(zero, x) { + line := fmt.Sprintf("%#v,\n", x) + line = line[strings.IndexByte(line, '{'):] + w.printf("%d: ", i) + w.printf(line) + } + } + case reflect.Array: + for i := 0; i < v.Len(); i++ { + w.printf("%d: %#v,\n", i, v.Index(i).Interface()) + } + default: + panic("gen: slice elem type not supported") + } + w.printf("}") +} + +// WriteType writes a definition of the type of the given value and returns the +// type name. +func (w *CodeWriter) WriteType(x interface{}) string { + t := reflect.TypeOf(x) + w.printf("type %s struct {\n", t.Name()) + for i := 0; i < t.NumField(); i++ { + w.printf("\t%s %s\n", t.Field(i).Name, t.Field(i).Type) + } + w.printf("}\n") + return t.Name() +} + +// typeName returns the name of the go type of x. +func typeName(x interface{}) string { + t := reflect.ValueOf(x).Type() + return strings.Replace(fmt.Sprint(t), "main.", "", 1) +} diff --git a/vendor/golang.org/x/text/internal/gen/gen.go b/vendor/golang.org/x/text/internal/gen/gen.go new file mode 100644 index 0000000000..dfaa278a10 --- /dev/null +++ b/vendor/golang.org/x/text/internal/gen/gen.go @@ -0,0 +1,226 @@ +// 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 gen contains common code for the various code generation tools in the +// text repository. Its usage ensures consistency between tools. +// +// This package defines command line flags that are common to most generation +// tools. The flags allow for specifying specific Unicode and CLDR versions +// in the public Unicode data repository (http://www.unicode.org/Public). +// +// A local Unicode data mirror can be set through the flag -local or the +// environment variable UNICODE_DIR. The former takes precedence. The local +// directory should follow the same structure as the public repository. +// +// IANA data can also optionally be mirrored by putting it in the iana directory +// rooted at the top of the local mirror. Beware, though, that IANA data is not +// versioned. So it is up to the developer to use the right version. +package gen // import "golang.org/x/text/internal/gen" + +import ( + "bytes" + "flag" + "fmt" + "go/format" + "io" + "io/ioutil" + "log" + "net/http" + "os" + "path" + "path/filepath" + "unicode" + + "golang.org/x/text/unicode/cldr" +) + +var ( + url = flag.String("url", + "http://www.unicode.org/Public", + "URL of Unicode database directory") + iana = flag.String("iana", + "http://www.iana.org", + "URL of the IANA repository") + unicodeVersion = flag.String("unicode", + getEnv("UNICODE_VERSION", unicode.Version), + "unicode version to use") + cldrVersion = flag.String("cldr", + getEnv("CLDR_VERSION", cldr.Version), + "cldr version to use") + // Allow an environment variable to specify the local directory. + // go generate doesn't allow specifying arguments; this is a useful + // alternative to specifying a local mirror. + localDir = flag.String("local", + os.Getenv("UNICODE_DIR"), + "directory containing local data files; for debugging only.") +) + +func getEnv(name, def string) string { + if v := os.Getenv(name); v != "" { + return v + } + return def +} + +// Init performs common initialization for a gen command. It parses the flags +// and sets up the standard logging parameters. +func Init() { + log.SetPrefix("") + log.SetFlags(log.Lshortfile) + flag.Parse() +} + +const header = `// This file was generated by go generate; DO NOT EDIT + +package %s + +` + +// UnicodeVersion reports the requested Unicode version. +func UnicodeVersion() string { + return *unicodeVersion +} + +// UnicodeVersion reports the requested CLDR version. +func CLDRVersion() string { + return *cldrVersion +} + +// IsLocal reports whether the user specified a local directory. +func IsLocal() bool { + return *localDir != "" +} + +// OpenUCDFile opens the requested UCD file. The file is specified relative to +// the public Unicode root directory. It will call log.Fatal if there are any +// errors. +func OpenUCDFile(file string) io.ReadCloser { + return openUnicode(path.Join(*unicodeVersion, "ucd", file)) +} + +// OpenCLDRCoreZip opens the CLDR core zip file. It will call log.Fatal if there +// are any errors. +func OpenCLDRCoreZip() io.ReadCloser { + return OpenUnicodeFile("cldr", *cldrVersion, "core.zip") +} + +// OpenUnicodeFile opens the requested file of the requested category from the +// root of the Unicode data archive. The file is specified relative to the +// public Unicode root directory. If version is "", it will use the default +// Unicode version. It will call log.Fatal if there are any errors. +func OpenUnicodeFile(category, version, file string) io.ReadCloser { + if version == "" { + version = UnicodeVersion() + } + return openUnicode(path.Join(category, version, file)) +} + +// OpenIANAFile opens the requested IANA file. The file is specified relative +// to the IANA root, which is typically either http://www.iana.org or the +// iana directory in the local mirror. It will call log.Fatal if there are any +// errors. +func OpenIANAFile(path string) io.ReadCloser { + return Open(*iana, "iana", path) +} + +// Open opens subdir/path if a local directory is specified and the file exists, +// where subdir is a directory relative to the local root, or fetches it from +// urlRoot/path otherwise. It will call log.Fatal if there are any errors. +func Open(urlRoot, subdir, path string) io.ReadCloser { + if *localDir != "" { + path = filepath.FromSlash(path) + if f, err := os.Open(filepath.Join(*localDir, subdir, path)); err == nil { + return f + } + } + return get(urlRoot, path) +} + +func openUnicode(path string) io.ReadCloser { + if *localDir != "" { + path = filepath.FromSlash(path) + f, err := os.Open(filepath.Join(*localDir, path)) + if err != nil { + log.Fatal(err) + } + return f + } + return get(*url, path) +} + +func get(root, path string) io.ReadCloser { + url := root + "/" + path + fmt.Printf("Fetching %s...", url) + defer fmt.Println(" done.") + resp, err := http.Get(url) + if err != nil { + log.Fatalf("HTTP GET: %v", err) + } + if resp.StatusCode != 200 { + log.Fatalf("Bad GET status for %q: %q", url, resp.Status) + } + return resp.Body +} + +// TODO: use Write*Version in all applicable packages. + +// WriteUnicodeVersion writes a constant for the Unicode version from which the +// tables are generated. +func WriteUnicodeVersion(w io.Writer) { + fmt.Fprintf(w, "// UnicodeVersion is the Unicode version from which the tables in this package are derived.\n") + fmt.Fprintf(w, "const UnicodeVersion = %q\n\n", UnicodeVersion()) +} + +// WriteCLDRVersion writes a constant for the CLDR version from which the +// tables are generated. +func WriteCLDRVersion(w io.Writer) { + fmt.Fprintf(w, "// CLDRVersion is the CLDR version from which the tables in this package are derived.\n") + fmt.Fprintf(w, "const CLDRVersion = %q\n\n", CLDRVersion()) +} + +// WriteGoFile prepends a standard file comment and package statement to the +// given bytes, applies gofmt, and writes them to a file with the given name. +// It will call log.Fatal if there are any errors. +func WriteGoFile(filename, pkg string, b []byte) { + w, err := os.Create(filename) + if err != nil { + log.Fatalf("Could not create file %s: %v", filename, err) + } + defer w.Close() + if _, err = WriteGo(w, pkg, b); err != nil { + log.Fatalf("Error writing file %s: %v", filename, err) + } +} + +// WriteGo prepends a standard file comment and package statement to the given +// bytes, applies gofmt, and writes them to w. +func WriteGo(w io.Writer, pkg string, b []byte) (n int, err error) { + src := []byte(fmt.Sprintf(header, pkg)) + src = append(src, b...) + formatted, err := format.Source(src) + if err != nil { + // Print the generated code even in case of an error so that the + // returned error can be meaningfully interpreted. + n, _ = w.Write(src) + return n, err + } + return w.Write(formatted) +} + +// Repackage rewrites a Go file from belonging to package main to belonging to +// the given package. +func Repackage(inFile, outFile, pkg string) { + src, err := ioutil.ReadFile(inFile) + if err != nil { + log.Fatalf("reading %s: %v", inFile, err) + } + const toDelete = "package main\n\n" + i := bytes.Index(src, []byte(toDelete)) + if i < 0 { + log.Fatalf("Could not find %q in %s.", toDelete, inFile) + } + w := &bytes.Buffer{} + w.Write(src[i+len(toDelete):]) + WriteGoFile(outFile, pkg, w.Bytes()) +} diff --git a/vendor/golang.org/x/text/internal/gen_test.go b/vendor/golang.org/x/text/internal/gen_test.go new file mode 100644 index 0000000000..a2e1981ae2 --- /dev/null +++ b/vendor/golang.org/x/text/internal/gen_test.go @@ -0,0 +1,38 @@ +// 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 internal + +import ( + "testing" + + "golang.org/x/text/language" +) + +func TestParents(t *testing.T) { + testCases := []struct { + tag, parent string + }{ + {"af", "und"}, + {"en", "und"}, + {"en-001", "en"}, + {"en-AU", "en-001"}, + {"en-US", "en"}, + {"en-US-u-va-posix", "en-US"}, + {"ca-ES-valencia", "ca-ES"}, + } + for _, tc := range testCases { + tag, ok := language.CompactIndex(language.MustParse(tc.tag)) + if !ok { + t.Fatalf("Could not get index of flag %s", tc.tag) + } + want, ok := language.CompactIndex(language.MustParse(tc.parent)) + if !ok { + t.Fatalf("Could not get index of parent %s of tag %s", tc.parent, tc.tag) + } + if got := int(Parent[tag]); got != want { + t.Errorf("Parent[%s] = %d; want %d (%s)", tc.tag, got, want, tc.parent) + } + } +} diff --git a/vendor/golang.org/x/text/internal/internal.go b/vendor/golang.org/x/text/internal/internal.go new file mode 100644 index 0000000000..eac832850d --- /dev/null +++ b/vendor/golang.org/x/text/internal/internal.go @@ -0,0 +1,51 @@ +// 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. + +//go:generate go run gen.go + +// Package internal contains non-exported functionality that are used by +// packages in the text repository. +package internal // import "golang.org/x/text/internal" + +import ( + "sort" + + "golang.org/x/text/language" +) + +// SortTags sorts tags in place. +func SortTags(tags []language.Tag) { + sort.Sort(sorter(tags)) +} + +type sorter []language.Tag + +func (s sorter) Len() int { + return len(s) +} + +func (s sorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s sorter) Less(i, j int) bool { + return s[i].String() < s[j].String() +} + +// UniqueTags sorts and filters duplicate tags in place and returns a slice with +// only unique tags. +func UniqueTags(tags []language.Tag) []language.Tag { + if len(tags) <= 1 { + return tags + } + SortTags(tags) + k := 0 + for i := 1; i < len(tags); i++ { + if tags[k].String() < tags[i].String() { + k++ + tags[k] = tags[i] + } + } + return tags[:k+1] +} diff --git a/vendor/golang.org/x/text/internal/internal_test.go b/vendor/golang.org/x/text/internal/internal_test.go new file mode 100644 index 0000000000..ce1b9a3827 --- /dev/null +++ b/vendor/golang.org/x/text/internal/internal_test.go @@ -0,0 +1,38 @@ +// 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 internal + +import ( + "fmt" + "strings" + "testing" + + "golang.org/x/text/language" +) + +func TestUnique(t *testing.T) { + testCases := []struct { + in, want string + }{ + {"", "[]"}, + {"en", "[en]"}, + {"en en", "[en]"}, + {"en en en", "[en]"}, + {"en-u-cu-eur en", "[en en-u-cu-eur]"}, + {"nl en", "[en nl]"}, + {"pt-Pt pt", "[pt pt-PT]"}, + } + for _, tc := range testCases { + tags := []language.Tag{} + for _, s := range strings.Split(tc.in, " ") { + if s != "" { + tags = append(tags, language.MustParse(s)) + } + } + if got := fmt.Sprint(UniqueTags(tags)); got != tc.want { + t.Errorf("Unique(%s) = %s; want %s", tc.in, got, tc.want) + } + } +} diff --git a/vendor/golang.org/x/text/internal/match.go b/vendor/golang.org/x/text/internal/match.go new file mode 100644 index 0000000000..03190b9095 --- /dev/null +++ b/vendor/golang.org/x/text/internal/match.go @@ -0,0 +1,65 @@ +// 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 internal + +// This file contains matchers that implement CLDR inheritance. +// +// See http://unicode.org/reports/tr35/#Locale_Inheritance. +// +// Some of the inheritance described in this document is already handled by +// the cldr package. + +import ( + "golang.org/x/text/language" +) + +// TODO: consider if (some of the) matching algorithm needs to be public after +// getting some feel about what is generic and what is specific. + +// NewInheritanceMatcher returns a matcher that matches based on the inheritance +// chain. +// +// The matcher uses canonicalization and the parent relationship to find a +// match. The resulting match will always be either Und or a language with the +// same language and script as the requested language. It will not match +// languages for which there is understood to be mutual or one-directional +// intelligibility. +// +// A Match will indicate an Exact match if the language matches after +// canonicalization and High if the matched tag is a parent. +func NewInheritanceMatcher(t []language.Tag) language.Matcher { + tags := make(inheritanceMatcher) + for i, tag := range t { + ct, err := language.All.Canonicalize(tag) + if err != nil { + ct = tag + } + tags[ct] = i + } + return tags +} + +type inheritanceMatcher map[language.Tag]int + +func (m inheritanceMatcher) Match(want ...language.Tag) (language.Tag, int, language.Confidence) { + for _, t := range want { + ct, err := language.All.Canonicalize(t) + if err != nil { + ct = t + } + conf := language.Exact + for { + if index, ok := m[ct]; ok { + return ct, index, conf + } + if ct == language.Und { + break + } + ct = ct.Parent() + conf = language.High + } + } + return language.Und, 0, language.No +} diff --git a/vendor/golang.org/x/text/internal/match_test.go b/vendor/golang.org/x/text/internal/match_test.go new file mode 100644 index 0000000000..8a3fe65729 --- /dev/null +++ b/vendor/golang.org/x/text/internal/match_test.go @@ -0,0 +1,56 @@ +// 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 internal + +import ( + "strings" + "testing" + + "golang.org/x/text/language" +) + +func TestInheritanceMatcher(t *testing.T) { + for i, tt := range []struct { + haveTags string + wantTags string + match string + conf language.Confidence + }{ + {"und,en,en-US", "en-US", "en-US", language.Exact}, // most specific match + {"zh-Hant,zh", "zh-TW", "zh-Hant", language.High}, // zh-TW implies Hant. + {"und,zh", "zh-TW", "und", language.High}, // zh-TW does not match zh. + {"zh", "zh-TW", "und", language.No}, // zh-TW does not match zh. + {"iw,en,nl", "he", "he", language.Exact}, // matches after canonicalization + {"he,en,nl", "iw", "he", language.Exact}, // matches after canonicalization + // Prefer first match over more specific match for various reasons: + // a) consistency of user interface is more important than an exact match, + // b) _if_ und is specified, it should be considered a correct and useful match, + // Note that a call to this Match will almost always be with a single tag. + {"und,en,en-US", "he,en-US", "und", language.High}, + } { + have := parseTags(tt.haveTags) + m := NewInheritanceMatcher(have) + tag, index, conf := m.Match(parseTags(tt.wantTags)...) + want := language.Raw.Make(tt.match) + if tag != want { + t.Errorf("%d:tag: got %q; want %q", i, tag, want) + } + if conf != language.No { + if got, _ := language.All.Canonicalize(have[index]); got != want { + t.Errorf("%d:index: got %q; want %q ", i, got, want) + } + } + if conf != tt.conf { + t.Errorf("%d:conf: got %v; want %v", i, conf, tt.conf) + } + } +} + +func parseTags(list string) (out []language.Tag) { + for _, s := range strings.Split(list, ",") { + out = append(out, language.Raw.Make(strings.TrimSpace(s))) + } + return out +} diff --git a/vendor/golang.org/x/text/internal/number/common.go b/vendor/golang.org/x/text/internal/number/common.go new file mode 100644 index 0000000000..a29abe4939 --- /dev/null +++ b/vendor/golang.org/x/text/internal/number/common.go @@ -0,0 +1,92 @@ +// This file was generated by go generate; DO NOT EDIT + +package number + +import ( + "unicode/utf8" + + "golang.org/x/text/internal/format/plural" +) + +// A system identifies a CLDR numbering system. +type system byte + +type systemData struct { + id system + digitSize byte // number of UTF-8 bytes per digit + zero [utf8.UTFMax]byte // UTF-8 sequence of zero digit. +} + +// A SymbolType identifies a symbol of a specific kind. +type SymbolType int + +const ( + SymDecimal SymbolType = iota + SymGroup + SymList + SymPercentSign + SymPlusSign + SymMinusSign + SymExponential + SymSuperscriptingExponent + SymPerMille + SymInfinity + SymNan + SymTimeSeparator + + NumSymbolTypes +) + +type altSymData struct { + compactTag uint16 + system system + symIndex byte +} + +var countMap = map[string]plural.Form{ + "other": plural.Other, + "zero": plural.Zero, + "one": plural.One, + "two": plural.Two, + "few": plural.Few, + "many": plural.Many, +} + +type pluralCheck struct { + // category: + // 3..7: opID + // 0..2: category + cat byte + setID byte +} + +// opID identifies the type of operand in the plural rule, being i, n or f. +// (v, w, and t are treated as filters in our implementation.) +type opID byte + +const ( + opMod opID = 0x1 // is '%' used? + opNotEqual opID = 0x2 // using "!=" to compare + opI opID = 0 << 2 // integers after taking the absolute value + opN opID = 1 << 2 // full number (must be integer) + opF opID = 2 << 2 // fraction + opV opID = 3 << 2 // number of visible digits + opW opID = 4 << 2 // number of visible digits without trailing zeros + opBretonM opID = 5 << 2 // hard-wired rule for Breton + opItalian800 opID = 6 << 2 // hard-wired rule for Italian + opAzerbaijan00s opID = 7 << 2 // hard-wired rule for Azerbaijan +) +const ( + // Use this plural form to indicate the next rule needs to match as well. + // The last condition in the list will have the correct plural form. + andNext = 0x7 + formMask = 0x7 + + opShift = 3 + + // numN indicates the maximum integer, or maximum mod value, for which we + // have inclusion masks. + numN = 100 + // The common denominator of the modulo that is taken. + maxMod = 100 +) diff --git a/vendor/golang.org/x/text/internal/number/data_test.go b/vendor/golang.org/x/text/internal/number/data_test.go new file mode 100644 index 0000000000..27a174a856 --- /dev/null +++ b/vendor/golang.org/x/text/internal/number/data_test.go @@ -0,0 +1,196 @@ +// This file was generated by go generate; DO NOT EDIT + +package number + +import "golang.org/x/text/internal/format/plural" + +type pluralTest struct { + locales string + form plural.Form + integer []string + decimal []string +} + +var ordinalTests = []pluralTest{ // 61 elements + 0: {locales: "af am ar bg bs ce cs da de dsb el es et eu fa fi fy gl he hr hsb id in is iw ja km kn ko ky lt lv ml mn my nb nl pa pl prg pt root ru sh si sk sl sr sw ta te th tr ur uz zh zu", form: 0x0, integer: []string{"0~15", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 1: {locales: "sv", form: 0x2, integer: []string{"1", "2", "21", "22", "31", "32", "41", "42", "51", "52", "61", "62", "71", "72", "81", "82", "101", "1001"}, decimal: []string(nil)}, + 2: {locales: "sv", form: 0x0, integer: []string{"0", "3~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 3: {locales: "fil fr hy lo mo ms ro tl vi", form: 0x2, integer: []string{"1"}, decimal: []string(nil)}, + 4: {locales: "fil fr hy lo mo ms ro tl vi", form: 0x0, integer: []string{"0", "2~16", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 5: {locales: "ga", form: 0x2, integer: []string{"1"}, decimal: []string(nil)}, + 6: {locales: "ga", form: 0x0, integer: []string{"0", "2~16", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 7: {locales: "hu", form: 0x2, integer: []string{"1", "5"}, decimal: []string(nil)}, + 8: {locales: "hu", form: 0x0, integer: []string{"0", "2~4", "6~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 9: {locales: "ne", form: 0x2, integer: []string{"1~4"}, decimal: []string(nil)}, + 10: {locales: "ne", form: 0x0, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 11: {locales: "be", form: 0x4, integer: []string{"2", "3", "22", "23", "32", "33", "42", "43", "52", "53", "62", "63", "72", "73", "82", "83", "102", "1002"}, decimal: []string(nil)}, + 12: {locales: "be", form: 0x0, integer: []string{"0", "1", "4~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 13: {locales: "uk", form: 0x4, integer: []string{"3", "23", "33", "43", "53", "63", "73", "83", "103", "1003"}, decimal: []string(nil)}, + 14: {locales: "uk", form: 0x0, integer: []string{"0~2", "4~16", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 15: {locales: "kk", form: 0x5, integer: []string{"6", "9", "10", "16", "19", "20", "26", "29", "30", "36", "39", "40", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 16: {locales: "kk", form: 0x0, integer: []string{"0~5", "7", "8", "11~15", "17", "18", "21", "101", "1001"}, decimal: []string(nil)}, + 17: {locales: "it", form: 0x5, integer: []string{"8", "11", "80", "800"}, decimal: []string(nil)}, + 18: {locales: "it", form: 0x0, integer: []string{"0~7", "9", "10", "12~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 19: {locales: "ka", form: 0x2, integer: []string{"1"}, decimal: []string(nil)}, + 20: {locales: "ka", form: 0x5, integer: []string{"0", "2~16", "102", "1002"}, decimal: []string(nil)}, + 21: {locales: "ka", form: 0x0, integer: []string{"21~36", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 22: {locales: "sq", form: 0x2, integer: []string{"1"}, decimal: []string(nil)}, + 23: {locales: "sq", form: 0x5, integer: []string{"4", "24", "34", "44", "54", "64", "74", "84", "104", "1004"}, decimal: []string(nil)}, + 24: {locales: "sq", form: 0x0, integer: []string{"0", "2", "3", "5~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 25: {locales: "en", form: 0x2, integer: []string{"1", "21", "31", "41", "51", "61", "71", "81", "101", "1001"}, decimal: []string(nil)}, + 26: {locales: "en", form: 0x3, integer: []string{"2", "22", "32", "42", "52", "62", "72", "82", "102", "1002"}, decimal: []string(nil)}, + 27: {locales: "en", form: 0x4, integer: []string{"3", "23", "33", "43", "53", "63", "73", "83", "103", "1003"}, decimal: []string(nil)}, + 28: {locales: "en", form: 0x0, integer: []string{"0", "4~18", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 29: {locales: "mr", form: 0x2, integer: []string{"1"}, decimal: []string(nil)}, + 30: {locales: "mr", form: 0x3, integer: []string{"2", "3"}, decimal: []string(nil)}, + 31: {locales: "mr", form: 0x4, integer: []string{"4"}, decimal: []string(nil)}, + 32: {locales: "mr", form: 0x0, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 33: {locales: "ca", form: 0x2, integer: []string{"1", "3"}, decimal: []string(nil)}, + 34: {locales: "ca", form: 0x3, integer: []string{"2"}, decimal: []string(nil)}, + 35: {locales: "ca", form: 0x4, integer: []string{"4"}, decimal: []string(nil)}, + 36: {locales: "ca", form: 0x0, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 37: {locales: "mk", form: 0x2, integer: []string{"1", "21", "31", "41", "51", "61", "71", "81", "101", "1001"}, decimal: []string(nil)}, + 38: {locales: "mk", form: 0x3, integer: []string{"2", "22", "32", "42", "52", "62", "72", "82", "102", "1002"}, decimal: []string(nil)}, + 39: {locales: "mk", form: 0x5, integer: []string{"7", "8", "27", "28", "37", "38", "47", "48", "57", "58", "67", "68", "77", "78", "87", "88", "107", "1007"}, decimal: []string(nil)}, + 40: {locales: "mk", form: 0x0, integer: []string{"0", "3~6", "9~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 41: {locales: "az", form: 0x2, integer: []string{"1", "2", "5", "7", "8", "11", "12", "15", "17", "18", "20~22", "25", "101", "1001"}, decimal: []string(nil)}, + 42: {locales: "az", form: 0x4, integer: []string{"3", "4", "13", "14", "23", "24", "33", "34", "43", "44", "53", "54", "63", "64", "73", "74", "100", "1003"}, decimal: []string(nil)}, + 43: {locales: "az", form: 0x5, integer: []string{"0", "6", "16", "26", "36", "40", "46", "56", "106", "1006"}, decimal: []string(nil)}, + 44: {locales: "az", form: 0x0, integer: []string{"9", "10", "19", "29", "30", "39", "49", "59", "69", "79", "109", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 45: {locales: "gu hi", form: 0x2, integer: []string{"1"}, decimal: []string(nil)}, + 46: {locales: "gu hi", form: 0x3, integer: []string{"2", "3"}, decimal: []string(nil)}, + 47: {locales: "gu hi", form: 0x4, integer: []string{"4"}, decimal: []string(nil)}, + 48: {locales: "gu hi", form: 0x5, integer: []string{"6"}, decimal: []string(nil)}, + 49: {locales: "gu hi", form: 0x0, integer: []string{"0", "5", "7~20", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 50: {locales: "as bn", form: 0x2, integer: []string{"1", "5", "7~10"}, decimal: []string(nil)}, + 51: {locales: "as bn", form: 0x3, integer: []string{"2", "3"}, decimal: []string(nil)}, + 52: {locales: "as bn", form: 0x4, integer: []string{"4"}, decimal: []string(nil)}, + 53: {locales: "as bn", form: 0x5, integer: []string{"6"}, decimal: []string(nil)}, + 54: {locales: "as bn", form: 0x0, integer: []string{"0", "11~25", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 55: {locales: "cy", form: 0x1, integer: []string{"0", "7~9"}, decimal: []string(nil)}, + 56: {locales: "cy", form: 0x2, integer: []string{"1"}, decimal: []string(nil)}, + 57: {locales: "cy", form: 0x3, integer: []string{"2"}, decimal: []string(nil)}, + 58: {locales: "cy", form: 0x4, integer: []string{"3", "4"}, decimal: []string(nil)}, + 59: {locales: "cy", form: 0x5, integer: []string{"5", "6"}, decimal: []string(nil)}, + 60: {locales: "cy", form: 0x0, integer: []string{"10~25", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, +} // Size: 4416 bytes + +var cardinalTests = []pluralTest{ // 115 elements + 0: {locales: "bm bo dz id ig ii in ja jbo jv jw kde kea km ko lkt lo ms my nqo root sah ses sg th to vi wo yo zh", form: 0x0, integer: []string{"0~15", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 1: {locales: "am as bn fa gu hi kn mr zu", form: 0x2, integer: []string{"0", "1"}, decimal: []string{"0.0~1.0", "0.00~0.04"}}, + 2: {locales: "am as bn fa gu hi kn mr zu", form: 0x0, integer: []string{"2~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"1.1~2.6", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 3: {locales: "ff fr hy kab", form: 0x2, integer: []string{"0", "1"}, decimal: []string{"0.0~1.5"}}, + 4: {locales: "ff fr hy kab", form: 0x0, integer: []string{"2~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"2.0~3.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 5: {locales: "ast ca de en et fi fy gl it ji nl sv sw ur yi", form: 0x2, integer: []string{"1"}, decimal: []string(nil)}, + 6: {locales: "ast ca de en et fi fy gl it ji nl sv sw ur yi", form: 0x0, integer: []string{"0", "2~16", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 7: {locales: "si", form: 0x2, integer: []string{"0", "1"}, decimal: []string{"0.0", "0.1", "1.0", "0.00", "0.01", "1.00", "0.000", "0.001", "1.000", "0.0000", "0.0001", "1.0000"}}, + 8: {locales: "si", form: 0x0, integer: []string{"2~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.2~0.9", "1.1~1.8", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 9: {locales: "ak bh guw ln mg nso pa ti wa", form: 0x2, integer: []string{"0", "1"}, decimal: []string{"0.0", "1.0", "0.00", "1.00", "0.000", "1.000", "0.0000", "1.0000"}}, + 10: {locales: "ak bh guw ln mg nso pa ti wa", form: 0x0, integer: []string{"2~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.1~0.9", "1.1~1.7", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 11: {locales: "tzm", form: 0x2, integer: []string{"0", "1", "11~24"}, decimal: []string{"0.0", "1.0", "11.0", "12.0", "13.0", "14.0", "15.0", "16.0", "17.0", "18.0", "19.0", "20.0", "21.0", "22.0", "23.0", "24.0"}}, + 12: {locales: "tzm", form: 0x0, integer: []string{"2~10", "100~106", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.1~0.9", "1.1~1.7", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 13: {locales: "pt", form: 0x2, integer: []string{"0", "1"}, decimal: []string{"0.0", "1.0", "0.00", "1.00", "0.000", "1.000", "0.0000", "1.0000"}}, + 14: {locales: "pt", form: 0x0, integer: []string{"2~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.1~0.9", "1.1~1.7", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 15: {locales: "af asa az bem bez bg brx ce cgg chr ckb dv ee el eo es eu fo fur gsw ha haw hu jgo jmc ka kaj kcg kk kkj kl ks ksb ku ky lb lg mas mgo ml mn nah nb nd ne nn nnh no nr ny nyn om or os pap ps rm rof rwk saq sdh seh sn so sq ss ssy st syr ta te teo tig tk tn tr ts ug uz ve vo vun wae xh xog", form: 0x2, integer: []string{"1"}, decimal: []string{"1.0", "1.00", "1.000", "1.0000"}}, + 16: {locales: "af asa az bem bez bg brx ce cgg chr ckb dv ee el eo es eu fo fur gsw ha haw hu jgo jmc ka kaj kcg kk kkj kl ks ksb ku ky lb lg mas mgo ml mn nah nb nd ne nn nnh no nr ny nyn om or os pap ps rm rof rwk saq sdh seh sn so sq ss ssy st syr ta te teo tig tk tn tr ts ug uz ve vo vun wae xh xog", form: 0x0, integer: []string{"0", "2~16", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0~0.9", "1.1~1.6", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 17: {locales: "pt_PT", form: 0x2, integer: []string{"1"}, decimal: []string(nil)}, + 18: {locales: "pt_PT", form: 0x0, integer: []string{"0", "2~16", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 19: {locales: "da", form: 0x2, integer: []string{"1"}, decimal: []string{"0.1~1.6"}}, + 20: {locales: "da", form: 0x0, integer: []string{"0", "2~16", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0", "2.0~3.4", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 21: {locales: "is", form: 0x2, integer: []string{"1", "21", "31", "41", "51", "61", "71", "81", "101", "1001"}, decimal: []string{"0.1~1.6", "10.1", "100.1", "1000.1"}}, + 22: {locales: "is", form: 0x0, integer: []string{"0", "2~16", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0", "2.0", "3.0", "4.0", "5.0", "6.0", "7.0", "8.0", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 23: {locales: "mk", form: 0x2, integer: []string{"1", "11", "21", "31", "41", "51", "61", "71", "101", "1001"}, decimal: []string{"0.1", "1.1", "2.1", "3.1", "4.1", "5.1", "6.1", "7.1", "10.1", "100.1", "1000.1"}}, + 24: {locales: "mk", form: 0x0, integer: []string{"0", "2~10", "12~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0", "0.2~1.0", "1.2~1.7", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 25: {locales: "fil tl", form: 0x2, integer: []string{"0~3", "5", "7", "8", "10~13", "15", "17", "18", "20", "21", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0~0.3", "0.5", "0.7", "0.8", "1.0~1.3", "1.5", "1.7", "1.8", "2.0", "2.1", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 26: {locales: "fil tl", form: 0x0, integer: []string{"4", "6", "9", "14", "16", "19", "24", "26", "104", "1004"}, decimal: []string{"0.4", "0.6", "0.9", "1.4", "1.6", "1.9", "2.4", "2.6", "10.4", "100.4", "1000.4"}}, + 27: {locales: "lv prg", form: 0x1, integer: []string{"0", "10~20", "30", "40", "50", "60", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0", "10.0", "11.0", "12.0", "13.0", "14.0", "15.0", "16.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 28: {locales: "lv prg", form: 0x2, integer: []string{"1", "21", "31", "41", "51", "61", "71", "81", "101", "1001"}, decimal: []string{"0.1", "1.0", "1.1", "2.1", "3.1", "4.1", "5.1", "6.1", "7.1", "10.1", "100.1", "1000.1"}}, + 29: {locales: "lv prg", form: 0x0, integer: []string{"2~9", "22~29", "102", "1002"}, decimal: []string{"0.2~0.9", "1.2~1.9", "10.2", "100.2", "1000.2"}}, + 30: {locales: "lag", form: 0x1, integer: []string{"0"}, decimal: []string{"0.0", "0.00", "0.000", "0.0000"}}, + 31: {locales: "lag", form: 0x2, integer: []string{"1"}, decimal: []string{"0.1~1.6"}}, + 32: {locales: "lag", form: 0x0, integer: []string{"2~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"2.0~3.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 33: {locales: "ksh", form: 0x1, integer: []string{"0"}, decimal: []string{"0.0", "0.00", "0.000", "0.0000"}}, + 34: {locales: "ksh", form: 0x2, integer: []string{"1"}, decimal: []string{"1.0", "1.00", "1.000", "1.0000"}}, + 35: {locales: "ksh", form: 0x0, integer: []string{"2~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.1~0.9", "1.1~1.7", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 36: {locales: "iu kw naq se sma smi smj smn sms", form: 0x2, integer: []string{"1"}, decimal: []string{"1.0", "1.00", "1.000", "1.0000"}}, + 37: {locales: "iu kw naq se sma smi smj smn sms", form: 0x3, integer: []string{"2"}, decimal: []string{"2.0", "2.00", "2.000", "2.0000"}}, + 38: {locales: "iu kw naq se sma smi smj smn sms", form: 0x0, integer: []string{"0", "3~17", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0~0.9", "1.1~1.6", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 39: {locales: "shi", form: 0x2, integer: []string{"0", "1"}, decimal: []string{"0.0~1.0", "0.00~0.04"}}, + 40: {locales: "shi", form: 0x4, integer: []string{"2~10"}, decimal: []string{"2.0", "3.0", "4.0", "5.0", "6.0", "7.0", "8.0", "9.0", "10.0", "2.00", "3.00", "4.00", "5.00", "6.00", "7.00", "8.00"}}, + 41: {locales: "shi", form: 0x0, integer: []string{"11~26", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"1.1~1.9", "2.1~2.7", "10.1", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 42: {locales: "mo ro", form: 0x2, integer: []string{"1"}, decimal: []string(nil)}, + 43: {locales: "mo ro", form: 0x4, integer: []string{"0", "2~16", "101", "1001"}, decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 44: {locales: "mo ro", form: 0x0, integer: []string{"20~35", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 45: {locales: "bs hr sh sr", form: 0x2, integer: []string{"1", "21", "31", "41", "51", "61", "71", "81", "101", "1001"}, decimal: []string{"0.1", "1.1", "2.1", "3.1", "4.1", "5.1", "6.1", "7.1", "10.1", "100.1", "1000.1"}}, + 46: {locales: "bs hr sh sr", form: 0x4, integer: []string{"2~4", "22~24", "32~34", "42~44", "52~54", "62", "102", "1002"}, decimal: []string{"0.2~0.4", "1.2~1.4", "2.2~2.4", "3.2~3.4", "4.2~4.4", "5.2", "10.2", "100.2", "1000.2"}}, + 47: {locales: "bs hr sh sr", form: 0x0, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0", "0.5~1.0", "1.5~2.0", "2.5~2.7", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 48: {locales: "gd", form: 0x2, integer: []string{"1", "11"}, decimal: []string{"1.0", "11.0", "1.00", "11.00", "1.000", "11.000", "1.0000"}}, + 49: {locales: "gd", form: 0x3, integer: []string{"2", "12"}, decimal: []string{"2.0", "12.0", "2.00", "12.00", "2.000", "12.000", "2.0000"}}, + 50: {locales: "gd", form: 0x4, integer: []string{"3~10", "13~19"}, decimal: []string{"3.0", "4.0", "5.0", "6.0", "7.0", "8.0", "9.0", "10.0", "13.0", "14.0", "15.0", "16.0", "17.0", "18.0", "19.0", "3.00"}}, + 51: {locales: "gd", form: 0x0, integer: []string{"0", "20~34", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0~0.9", "1.1~1.6", "10.1", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 52: {locales: "sl", form: 0x2, integer: []string{"1", "101", "201", "301", "401", "501", "601", "701", "1001"}, decimal: []string(nil)}, + 53: {locales: "sl", form: 0x3, integer: []string{"2", "102", "202", "302", "402", "502", "602", "702", "1002"}, decimal: []string(nil)}, + 54: {locales: "sl", form: 0x4, integer: []string{"3", "4", "103", "104", "203", "204", "303", "304", "403", "404", "503", "504", "603", "604", "703", "704", "1003"}, decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 55: {locales: "sl", form: 0x0, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 56: {locales: "dsb hsb", form: 0x2, integer: []string{"1", "101", "201", "301", "401", "501", "601", "701", "1001"}, decimal: []string{"0.1", "1.1", "2.1", "3.1", "4.1", "5.1", "6.1", "7.1", "10.1", "100.1", "1000.1"}}, + 57: {locales: "dsb hsb", form: 0x3, integer: []string{"2", "102", "202", "302", "402", "502", "602", "702", "1002"}, decimal: []string{"0.2", "1.2", "2.2", "3.2", "4.2", "5.2", "6.2", "7.2", "10.2", "100.2", "1000.2"}}, + 58: {locales: "dsb hsb", form: 0x4, integer: []string{"3", "4", "103", "104", "203", "204", "303", "304", "403", "404", "503", "504", "603", "604", "703", "704", "1003"}, decimal: []string{"0.3", "0.4", "1.3", "1.4", "2.3", "2.4", "3.3", "3.4", "4.3", "4.4", "5.3", "5.4", "6.3", "6.4", "7.3", "7.4", "10.3", "100.3", "1000.3"}}, + 59: {locales: "dsb hsb", form: 0x0, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0", "0.5~1.0", "1.5~2.0", "2.5~2.7", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 60: {locales: "he iw", form: 0x2, integer: []string{"1"}, decimal: []string(nil)}, + 61: {locales: "he iw", form: 0x3, integer: []string{"2"}, decimal: []string(nil)}, + 62: {locales: "he iw", form: 0x5, integer: []string{"20", "30", "40", "50", "60", "70", "80", "90", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 63: {locales: "he iw", form: 0x0, integer: []string{"0", "3~17", "101", "1001"}, decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 64: {locales: "cs sk", form: 0x2, integer: []string{"1"}, decimal: []string(nil)}, + 65: {locales: "cs sk", form: 0x4, integer: []string{"2~4"}, decimal: []string(nil)}, + 66: {locales: "cs sk", form: 0x5, integer: []string(nil), decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 67: {locales: "cs sk", form: 0x0, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 68: {locales: "pl", form: 0x2, integer: []string{"1"}, decimal: []string(nil)}, + 69: {locales: "pl", form: 0x4, integer: []string{"2~4", "22~24", "32~34", "42~44", "52~54", "62", "102", "1002"}, decimal: []string(nil)}, + 70: {locales: "pl", form: 0x5, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 71: {locales: "pl", form: 0x0, integer: []string(nil), decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 72: {locales: "be", form: 0x2, integer: []string{"1", "21", "31", "41", "51", "61", "71", "81", "101", "1001"}, decimal: []string{"1.0", "21.0", "31.0", "41.0", "51.0", "61.0", "71.0", "81.0", "101.0", "1001.0"}}, + 73: {locales: "be", form: 0x4, integer: []string{"2~4", "22~24", "32~34", "42~44", "52~54", "62", "102", "1002"}, decimal: []string{"2.0", "3.0", "4.0", "22.0", "23.0", "24.0", "32.0", "33.0", "102.0", "1002.0"}}, + 74: {locales: "be", form: 0x5, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0", "5.0", "6.0", "7.0", "8.0", "9.0", "10.0", "11.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 75: {locales: "be", form: 0x0, integer: []string(nil), decimal: []string{"0.1~0.9", "1.1~1.7", "10.1", "100.1", "1000.1"}}, + 76: {locales: "lt", form: 0x2, integer: []string{"1", "21", "31", "41", "51", "61", "71", "81", "101", "1001"}, decimal: []string{"1.0", "21.0", "31.0", "41.0", "51.0", "61.0", "71.0", "81.0", "101.0", "1001.0"}}, + 77: {locales: "lt", form: 0x4, integer: []string{"2~9", "22~29", "102", "1002"}, decimal: []string{"2.0", "3.0", "4.0", "5.0", "6.0", "7.0", "8.0", "9.0", "22.0", "102.0", "1002.0"}}, + 78: {locales: "lt", form: 0x5, integer: []string(nil), decimal: []string{"0.1~0.9", "1.1~1.7", "10.1", "100.1", "1000.1"}}, + 79: {locales: "lt", form: 0x0, integer: []string{"0", "10~20", "30", "40", "50", "60", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0", "10.0", "11.0", "12.0", "13.0", "14.0", "15.0", "16.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 80: {locales: "mt", form: 0x2, integer: []string{"1"}, decimal: []string{"1.0", "1.00", "1.000", "1.0000"}}, + 81: {locales: "mt", form: 0x4, integer: []string{"0", "2~10", "102~107", "1002"}, decimal: []string{"0.0", "2.0", "3.0", "4.0", "5.0", "6.0", "7.0", "8.0", "10.0", "102.0", "1002.0"}}, + 82: {locales: "mt", form: 0x5, integer: []string{"11~19", "111~117", "1011"}, decimal: []string{"11.0", "12.0", "13.0", "14.0", "15.0", "16.0", "17.0", "18.0", "111.0", "1011.0"}}, + 83: {locales: "mt", form: 0x0, integer: []string{"20~35", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.1~0.9", "1.1~1.7", "10.1", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 84: {locales: "ru uk", form: 0x2, integer: []string{"1", "21", "31", "41", "51", "61", "71", "81", "101", "1001"}, decimal: []string(nil)}, + 85: {locales: "ru uk", form: 0x4, integer: []string{"2~4", "22~24", "32~34", "42~44", "52~54", "62", "102", "1002"}, decimal: []string(nil)}, + 86: {locales: "ru uk", form: 0x5, integer: []string{"0", "5~19", "100", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 87: {locales: "ru uk", form: 0x0, integer: []string(nil), decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 88: {locales: "br", form: 0x2, integer: []string{"1", "21", "31", "41", "51", "61", "81", "101", "1001"}, decimal: []string{"1.0", "21.0", "31.0", "41.0", "51.0", "61.0", "81.0", "101.0", "1001.0"}}, + 89: {locales: "br", form: 0x3, integer: []string{"2", "22", "32", "42", "52", "62", "82", "102", "1002"}, decimal: []string{"2.0", "22.0", "32.0", "42.0", "52.0", "62.0", "82.0", "102.0", "1002.0"}}, + 90: {locales: "br", form: 0x4, integer: []string{"3", "4", "9", "23", "24", "29", "33", "34", "39", "43", "44", "49", "103", "1003"}, decimal: []string{"3.0", "4.0", "9.0", "23.0", "24.0", "29.0", "33.0", "34.0", "103.0", "1003.0"}}, + 91: {locales: "br", form: 0x5, integer: []string{"1000000"}, decimal: []string{"1000000.0", "1000000.00", "1000000.000"}}, + 92: {locales: "br", form: 0x0, integer: []string{"0", "5~8", "10~20", "100", "1000", "10000", "100000"}, decimal: []string{"0.0~0.9", "1.1~1.6", "10.0", "100.0", "1000.0", "10000.0", "100000.0"}}, + 93: {locales: "ga", form: 0x2, integer: []string{"1"}, decimal: []string{"1.0", "1.00", "1.000", "1.0000"}}, + 94: {locales: "ga", form: 0x3, integer: []string{"2"}, decimal: []string{"2.0", "2.00", "2.000", "2.0000"}}, + 95: {locales: "ga", form: 0x4, integer: []string{"3~6"}, decimal: []string{"3.0", "4.0", "5.0", "6.0", "3.00", "4.00", "5.00", "6.00", "3.000", "4.000", "5.000", "6.000", "3.0000", "4.0000", "5.0000", "6.0000"}}, + 96: {locales: "ga", form: 0x5, integer: []string{"7~10"}, decimal: []string{"7.0", "8.0", "9.0", "10.0", "7.00", "8.00", "9.00", "10.00", "7.000", "8.000", "9.000", "10.000", "7.0000", "8.0000", "9.0000", "10.0000"}}, + 97: {locales: "ga", form: 0x0, integer: []string{"0", "11~25", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.0~0.9", "1.1~1.6", "10.1", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 98: {locales: "gv", form: 0x2, integer: []string{"1", "11", "21", "31", "41", "51", "61", "71", "101", "1001"}, decimal: []string(nil)}, + 99: {locales: "gv", form: 0x3, integer: []string{"2", "12", "22", "32", "42", "52", "62", "72", "102", "1002"}, decimal: []string(nil)}, + 100: {locales: "gv", form: 0x4, integer: []string{"0", "20", "40", "60", "80", "100", "120", "140", "1000", "10000", "100000", "1000000"}, decimal: []string(nil)}, + 101: {locales: "gv", form: 0x5, integer: []string(nil), decimal: []string{"0.0~1.5", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 102: {locales: "gv", form: 0x0, integer: []string{"3~10", "13~19", "23", "103", "1003"}, decimal: []string(nil)}, + 103: {locales: "ar", form: 0x1, integer: []string{"0"}, decimal: []string{"0.0", "0.00", "0.000", "0.0000"}}, + 104: {locales: "ar", form: 0x2, integer: []string{"1"}, decimal: []string{"1.0", "1.00", "1.000", "1.0000"}}, + 105: {locales: "ar", form: 0x3, integer: []string{"2"}, decimal: []string{"2.0", "2.00", "2.000", "2.0000"}}, + 106: {locales: "ar", form: 0x4, integer: []string{"3~10", "103~110", "1003"}, decimal: []string{"3.0", "4.0", "5.0", "6.0", "7.0", "8.0", "9.0", "10.0", "103.0", "1003.0"}}, + 107: {locales: "ar", form: 0x5, integer: []string{"11~26", "111", "1011"}, decimal: []string{"11.0", "12.0", "13.0", "14.0", "15.0", "16.0", "17.0", "18.0", "111.0", "1011.0"}}, + 108: {locales: "ar", form: 0x0, integer: []string{"100~102", "200~202", "300~302", "400~402", "500~502", "600", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.1~0.9", "1.1~1.7", "10.1", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, + 109: {locales: "cy", form: 0x1, integer: []string{"0"}, decimal: []string{"0.0", "0.00", "0.000", "0.0000"}}, + 110: {locales: "cy", form: 0x2, integer: []string{"1"}, decimal: []string{"1.0", "1.00", "1.000", "1.0000"}}, + 111: {locales: "cy", form: 0x3, integer: []string{"2"}, decimal: []string{"2.0", "2.00", "2.000", "2.0000"}}, + 112: {locales: "cy", form: 0x4, integer: []string{"3"}, decimal: []string{"3.0", "3.00", "3.000", "3.0000"}}, + 113: {locales: "cy", form: 0x5, integer: []string{"6"}, decimal: []string{"6.0", "6.00", "6.000", "6.0000"}}, + 114: {locales: "cy", form: 0x0, integer: []string{"4", "5", "7~20", "100", "1000", "10000", "100000", "1000000"}, decimal: []string{"0.1~0.9", "1.1~1.7", "10.0", "100.0", "1000.0", "10000.0", "100000.0", "1000000.0"}}, +} // Size: 8304 bytes + +// Total table size 12720 bytes (12KiB); checksum: 1392DFA5 diff --git a/vendor/golang.org/x/text/internal/number/gen.go b/vendor/golang.org/x/text/internal/number/gen.go new file mode 100644 index 0000000000..05ae6623a5 --- /dev/null +++ b/vendor/golang.org/x/text/internal/number/gen.go @@ -0,0 +1,347 @@ +// Copyright 2016 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 ( + "flag" + "fmt" + "log" + "reflect" + "strings" + "unicode/utf8" + + "golang.org/x/text/internal" + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/stringset" + "golang.org/x/text/language" + "golang.org/x/text/unicode/cldr" +) + +var ( + test = flag.Bool("test", false, + "test existing tables; can be used to compare web data with package data.") + outputFile = flag.String("output", "tables.go", "output file") + outputTestFile = flag.String("testoutput", "data_test.go", "output file") + + draft = flag.String("draft", + "contributed", + `Minimal draft requirements (approved, contributed, provisional, unconfirmed).`) +) + +func main() { + gen.Init() + + const pkg = "number" + + gen.Repackage("gen_common.go", "common.go", pkg) + // Read the CLDR zip file. + r := gen.OpenCLDRCoreZip() + defer r.Close() + + d := &cldr.Decoder{} + d.SetDirFilter("supplemental", "main") + d.SetSectionFilter("numbers", "numberingSystem", "plurals") + data, err := d.DecodeZip(r) + if err != nil { + log.Fatalf("DecodeZip: %v", err) + } + + w := gen.NewCodeWriter() + defer w.WriteGoFile(*outputFile, pkg) + + fmt.Fprintln(w, `import "golang.org/x/text/internal/stringset"`) + + gen.WriteCLDRVersion(w) + + genNumSystem(w, data) + genSymbols(w, data) + genPlurals(w, data) + + w = gen.NewCodeWriter() + defer w.WriteGoFile(*outputTestFile, pkg) + + fmt.Fprintln(w, `import "golang.org/x/text/internal/format/plural"`) + + genPluralsTests(w, data) +} + +var systemMap = map[string]system{"latn": 0} + +func getNumberSystem(str string) system { + ns, ok := systemMap[str] + if !ok { + log.Fatalf("No index for numbering system %q", str) + } + return ns +} + +func genNumSystem(w *gen.CodeWriter, data *cldr.CLDR) { + numSysData := []systemData{ + {digitSize: 1, zero: [4]byte{'0'}}, + } + + for _, ns := range data.Supplemental().NumberingSystems.NumberingSystem { + if len(ns.Digits) == 0 { + continue + } + switch ns.Id { + case "latn": + // hard-wired + continue + case "hanidec": + // non-consecutive digits: treat as "algorithmic" + continue + } + + zero, sz := utf8.DecodeRuneInString(ns.Digits) + if ns.Digits[sz-1]+9 > 0xBF { // 1011 1111: highest continuation byte + log.Fatalf("Last byte of zero value overflows for %s", ns.Id) + } + + i := rune(0) + for _, r := range ns.Digits { + // Verify that we can do simple math on the UTF-8 byte sequence + // of zero to get the digit. + if zero+i != r { + // Runes not consecutive. + log.Fatalf("Digit %d of %s (%U) is not offset correctly from zero value", i, ns.Id, r) + } + i++ + } + var x [utf8.UTFMax]byte + utf8.EncodeRune(x[:], zero) + id := system(len(numSysData)) + systemMap[ns.Id] = id + numSysData = append(numSysData, systemData{ + id: id, + digitSize: byte(sz), + zero: x, + }) + } + w.WriteVar("numSysData", numSysData) + + algoID := system(len(numSysData)) + fmt.Fprintln(w, "const (") + for _, ns := range data.Supplemental().NumberingSystems.NumberingSystem { + id, ok := systemMap[ns.Id] + if !ok { + id = algoID + systemMap[ns.Id] = id + algoID++ + } + fmt.Fprintf(w, "num%s = %#x\n", strings.Title(ns.Id), id) + } + fmt.Fprintln(w, "numNumberSystems") + fmt.Fprintln(w, ")") + + fmt.Fprintln(w, "var systemMap = map[string]system{") + for _, ns := range data.Supplemental().NumberingSystems.NumberingSystem { + fmt.Fprintf(w, "%q: num%s,\n", ns.Id, strings.Title(ns.Id)) + w.Size += len(ns.Id) + 16 + 1 // very coarse approximation + } + fmt.Fprintln(w, "}") +} + +func genSymbols(w *gen.CodeWriter, data *cldr.CLDR) { + d, err := cldr.ParseDraft(*draft) + if err != nil { + log.Fatalf("invalid draft level: %v", err) + } + + nNumberSystems := system(len(systemMap)) + + type symbols [NumSymbolTypes]string + + type key struct { + tag int // from language.CompactIndex + system system + } + symbolMap := map[key]*symbols{} + + defaults := map[int]system{} + + for _, lang := range data.Locales() { + ldml := data.RawLDML(lang) + if ldml.Numbers == nil { + continue + } + langIndex, ok := language.CompactIndex(language.MustParse(lang)) + if !ok { + log.Fatalf("No compact index for language %s", lang) + } + if d := ldml.Numbers.DefaultNumberingSystem; len(d) > 0 { + defaults[langIndex] = getNumberSystem(d[0].Data()) + } + + syms := cldr.MakeSlice(&ldml.Numbers.Symbols) + syms.SelectDraft(d) + + for _, sym := range ldml.Numbers.Symbols { + if sym.NumberSystem == "" { + // This is just linking the default of root to "latn". + continue + } + symbolMap[key{langIndex, getNumberSystem(sym.NumberSystem)}] = &symbols{ + SymDecimal: getFirst("decimal", sym.Decimal), + SymGroup: getFirst("group", sym.Group), + SymList: getFirst("list", sym.List), + SymPercentSign: getFirst("percentSign", sym.PercentSign), + SymPlusSign: getFirst("plusSign", sym.PlusSign), + SymMinusSign: getFirst("minusSign", sym.MinusSign), + SymExponential: getFirst("exponential", sym.Exponential), + SymSuperscriptingExponent: getFirst("superscriptingExponent", sym.SuperscriptingExponent), + SymPerMille: getFirst("perMille", sym.PerMille), + SymInfinity: getFirst("infinity", sym.Infinity), + SymNan: getFirst("nan", sym.Nan), + SymTimeSeparator: getFirst("timeSeparator", sym.TimeSeparator), + } + } + } + + // Expand all values. + for k, syms := range symbolMap { + for t := SymDecimal; t < NumSymbolTypes; t++ { + p := k.tag + for syms[t] == "" { + p = int(internal.Parent[p]) + if pSyms, ok := symbolMap[key{p, k.system}]; ok && (*pSyms)[t] != "" { + syms[t] = (*pSyms)[t] + break + } + if p == 0 /* und */ { + // Default to root, latn. + syms[t] = (*symbolMap[key{}])[t] + } + } + } + } + + // Unique the symbol sets and write the string data. + m := map[symbols]int{} + sb := stringset.NewBuilder() + + symIndex := [][NumSymbolTypes]byte{} + + for ns := system(0); ns < nNumberSystems; ns++ { + for _, l := range data.Locales() { + langIndex, _ := language.CompactIndex(language.MustParse(l)) + s := symbolMap[key{langIndex, ns}] + if s == nil { + continue + } + if _, ok := m[*s]; !ok { + m[*s] = len(symIndex) + sb.Add(s[:]...) + var x [NumSymbolTypes]byte + for i := SymDecimal; i < NumSymbolTypes; i++ { + x[i] = byte(sb.Index((*s)[i])) + } + symIndex = append(symIndex, x) + } + } + } + w.WriteVar("symIndex", symIndex) + w.WriteVar("symData", sb.Set()) + + // resolveSymbolIndex gets the index from the closest matching locale, + // including the locale itself. + resolveSymbolIndex := func(langIndex int, ns system) byte { + for { + if sym := symbolMap[key{langIndex, ns}]; sym != nil { + return byte(m[*sym]) + } + if langIndex == 0 { + return 0 // und, latn + } + langIndex = int(internal.Parent[langIndex]) + } + } + + // Create an index with the symbols for each locale for the latn numbering + // system. If this is not the default, or the only one, for a locale, we + // will overwrite the value later. + var langToDefaults [language.NumCompactTags]byte + for _, l := range data.Locales() { + langIndex, _ := language.CompactIndex(language.MustParse(l)) + langToDefaults[langIndex] = resolveSymbolIndex(langIndex, 0) + } + + // Delete redundant entries. + for _, l := range data.Locales() { + langIndex, _ := language.CompactIndex(language.MustParse(l)) + def := defaults[langIndex] + syms := symbolMap[key{langIndex, def}] + if syms == nil { + continue + } + for ns := system(0); ns < nNumberSystems; ns++ { + if ns == def { + continue + } + if altSyms, ok := symbolMap[key{langIndex, ns}]; ok && *altSyms == *syms { + delete(symbolMap, key{langIndex, ns}) + } + } + } + + // Create a sorted list of alternatives per language. This will only need to + // be referenced if a user specified an alternative numbering system. + var langToAlt []altSymData + for _, l := range data.Locales() { + langIndex, _ := language.CompactIndex(language.MustParse(l)) + start := len(langToAlt) + if start > 0x7F { + log.Fatal("Number of alternative assignments > 0x7F") + } + // Create the entry for the default value. + def := defaults[langIndex] + langToAlt = append(langToAlt, altSymData{ + compactTag: uint16(langIndex), + system: def, + symIndex: resolveSymbolIndex(langIndex, def), + }) + + for ns := system(0); ns < nNumberSystems; ns++ { + if def == ns { + continue + } + if sym := symbolMap[key{langIndex, ns}]; sym != nil { + langToAlt = append(langToAlt, altSymData{ + compactTag: uint16(langIndex), + system: ns, + symIndex: resolveSymbolIndex(langIndex, ns), + }) + } + } + if def == 0 && len(langToAlt) == start+1 { + // No additional data: erase the entry. + langToAlt = langToAlt[:start] + } else { + // Overwrite the entry in langToDefaults. + langToDefaults[langIndex] = 0x80 | byte(start) + } + } + w.WriteComment(` +langToDefaults maps a compact language index to the default numbering system +and default symbol set`) + w.WriteVar("langToDefaults", langToDefaults) + + w.WriteComment(` +langToAlt is a list of numbering system and symbol set pairs, sorted and +marked by compact language index.`) + w.WriteVar("langToAlt", langToAlt) +} + +func getFirst(name string, x interface{}) string { + v := reflect.ValueOf(x) + if v.Len() == 0 { + return "" + } else if v.Len() > 1 { + log.Fatalf("Multiple values of %q within single symbol not supported.", name) + } + return v.Index(0).MethodByName("Data").Call(nil)[0].String() +} diff --git a/vendor/golang.org/x/text/internal/number/gen_common.go b/vendor/golang.org/x/text/internal/number/gen_common.go new file mode 100644 index 0000000000..b0c71c5eb4 --- /dev/null +++ b/vendor/golang.org/x/text/internal/number/gen_common.go @@ -0,0 +1,96 @@ +// Copyright 2016 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 ( + "unicode/utf8" + + "golang.org/x/text/internal/format/plural" +) + +// A system identifies a CLDR numbering system. +type system byte + +type systemData struct { + id system + digitSize byte // number of UTF-8 bytes per digit + zero [utf8.UTFMax]byte // UTF-8 sequence of zero digit. +} + +// A SymbolType identifies a symbol of a specific kind. +type SymbolType int + +const ( + SymDecimal SymbolType = iota + SymGroup + SymList + SymPercentSign + SymPlusSign + SymMinusSign + SymExponential + SymSuperscriptingExponent + SymPerMille + SymInfinity + SymNan + SymTimeSeparator + + NumSymbolTypes +) + +type altSymData struct { + compactTag uint16 + system system + symIndex byte +} + +var countMap = map[string]plural.Form{ + "other": plural.Other, + "zero": plural.Zero, + "one": plural.One, + "two": plural.Two, + "few": plural.Few, + "many": plural.Many, +} + +type pluralCheck struct { + // category: + // 3..7: opID + // 0..2: category + cat byte + setID byte +} + +// opID identifies the type of operand in the plural rule, being i, n or f. +// (v, w, and t are treated as filters in our implementation.) +type opID byte + +const ( + opMod opID = 0x1 // is '%' used? + opNotEqual opID = 0x2 // using "!=" to compare + opI opID = 0 << 2 // integers after taking the absolute value + opN opID = 1 << 2 // full number (must be integer) + opF opID = 2 << 2 // fraction + opV opID = 3 << 2 // number of visible digits + opW opID = 4 << 2 // number of visible digits without trailing zeros + opBretonM opID = 5 << 2 // hard-wired rule for Breton + opItalian800 opID = 6 << 2 // hard-wired rule for Italian + opAzerbaijan00s opID = 7 << 2 // hard-wired rule for Azerbaijan +) +const ( + // Use this plural form to indicate the next rule needs to match as well. + // The last condition in the list will have the correct plural form. + andNext = 0x7 + formMask = 0x7 + + opShift = 3 + + // numN indicates the maximum integer, or maximum mod value, for which we + // have inclusion masks. + numN = 100 + // The common denominator of the modulo that is taken. + maxMod = 100 +) diff --git a/vendor/golang.org/x/text/internal/number/gen_plural.go b/vendor/golang.org/x/text/internal/number/gen_plural.go new file mode 100644 index 0000000000..05a6722493 --- /dev/null +++ b/vendor/golang.org/x/text/internal/number/gen_plural.go @@ -0,0 +1,471 @@ +// Copyright 2016 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 + +// This file generates data for the CLDR plural rules, as defined in +// http://unicode.org/reports/tr35/tr35-numbers.html#Language_Plural_Rules +// +// We assume a slightly simplified grammar: +// +// condition = and_condition ('or' and_condition)* samples +// and_condition = relation ('and' relation)* +// relation = expr ('=' | '!=') range_list +// expr = operand ('%' '10' '0'* )? +// operand = 'n' | 'i' | 'f' | 't' | 'v' | 'w' +// range_list = (range | value) (',' range_list)* +// range = value'..'value +// value = digit+ +// digit = 0|1|2|3|4|5|6|7|8|9 +// +// samples = ('@integer' sampleList)? +// ('@decimal' sampleList)? +// sampleList = sampleRange (',' sampleRange)* (',' ('…'|'...'))? +// sampleRange = decimalValue ('~' decimalValue)? +// decimalValue = value ('.' value)? +// +// Symbol Value +// n absolute value of the source number (integer and decimals). +// i integer digits of n. +// v number of visible fraction digits in n, with trailing zeros. +// w number of visible fraction digits in n, without trailing zeros. +// f visible fractional digits in n, with trailing zeros. +// t visible fractional digits in n, without trailing zeros. +// +// The algorithm for which the data is generated is based on the following +// observations +// +// - the number of different sets of numbers which the plural rules use to +// test inclusion is limited, +// - most numbers that are tested on are < 100 +// +// This allows us to define a bitmap for each number < 100 where a bit i +// indicates whether this number is included in some defined set i. +// The function matchPlural in plural.go defines how we can subsequently use +// this data to determine inclusion. +// +// There are a few languages for which this doesn't work. For one Italian and +// Azerbaijan, which both test against numbers > 100 for ordinals and Breton, +// which considers whether numbers are multiples of hundreds. The model here +// could be extended to handle Italian and Azerbaijan fairly easily (by +// considering the numbers 100, 200, 300, ..., 800, 900 in addition to the first +// 100), but for now it seems easier to just hard-code these cases. + +import ( + "bufio" + "bytes" + "fmt" + "log" + "strconv" + "strings" + + "golang.org/x/text/internal" + "golang.org/x/text/internal/format/plural" + "golang.org/x/text/internal/gen" + "golang.org/x/text/language" + "golang.org/x/text/unicode/cldr" +) + +type pluralTest struct { + locales string // space-separated list of locales for this test + form plural.Form + integer []string // Entries of the form \d+ or \d+~\d+ + decimal []string // Entries of the form \f+ or \f+ +~\f+, where f is \d+\.\d+ +} + +func genPluralsTests(w *gen.CodeWriter, data *cldr.CLDR) { + w.WriteType(pluralTest{}) + + for _, plurals := range data.Supplemental().Plurals { + if plurals.Type == "" { + // The empty type is reserved for plural ranges. + continue + } + tests := []pluralTest{} + + for _, pRules := range plurals.PluralRules { + for _, rule := range pRules.PluralRule { + test := pluralTest{ + locales: pRules.Locales, + form: countMap[rule.Count], + } + scan := bufio.NewScanner(strings.NewReader(rule.Data())) + scan.Split(splitTokens) + var p *[]string + for scan.Scan() { + switch t := scan.Text(); t { + case "@integer": + p = &test.integer + case "@decimal": + p = &test.decimal + case ",", "…": + default: + if p != nil { + *p = append(*p, t) + } + } + } + tests = append(tests, test) + } + } + w.WriteVar(plurals.Type+"Tests", tests) + } +} + +func genPlurals(w *gen.CodeWriter, data *cldr.CLDR) { + for _, plurals := range data.Supplemental().Plurals { + if plurals.Type == "" { + continue + } + // Initialize setMap and inclusionMasks. They are already populated with + // a few entries to serve as an example and to assign nice numbers to + // common cases. + + // setMap contains sets of numbers represented by boolean arrays where + // a true value for element i means that the number i is included. + setMap := map[[numN]bool]int{ + // The above init func adds an entry for including all numbers. + [numN]bool{1: true}: 1, // fix {1} to a nice value + [numN]bool{2: true}: 2, // fix {2} to a nice value + [numN]bool{0: true}: 3, // fix {0} to a nice value + } + + // inclusionMasks contains bit masks for every number under numN to + // indicate in which set the number is included. Bit 1 << x will be set + // if it is included in set x. + inclusionMasks := [numN]uint64{ + // Note: these entries are not complete: more bits will be set along the way. + 0: 1 << 3, + 1: 1 << 1, + 2: 1 << 2, + } + + // Create set {0..99}. We will assign this set the identifier 0. + var all [numN]bool + for i := range all { + // Mark number i as being included in the set (which has identifier 0). + inclusionMasks[i] |= 1 << 0 + // Mark number i as included in the set. + all[i] = true + } + // Register the identifier for the set. + setMap[all] = 0 + + rules := []pluralCheck{} + index := []byte{0} + langMap := map[int]byte{0: 0} // From compact language index to index + + for _, pRules := range plurals.PluralRules { + // Parse the rules. + var conds []orCondition + for _, rule := range pRules.PluralRule { + form := countMap[rule.Count] + conds = parsePluralCondition(conds, rule.Data(), form) + } + // Encode the rules. + for _, c := range conds { + // If an or condition only has filters, we create an entry for + // this filter and the set that contains all values. + empty := true + for _, b := range c.used { + empty = empty && !b + } + if empty { + rules = append(rules, pluralCheck{ + cat: byte(opMod<<opShift) | byte(c.form), + setID: 0, // all values + }) + continue + } + // We have some entries with values. + for i, set := range c.set { + if !c.used[i] { + continue + } + index, ok := setMap[set] + if !ok { + index = len(setMap) + setMap[set] = index + for i := range inclusionMasks { + if set[i] { + inclusionMasks[i] |= 1 << uint64(index) + } + } + } + rules = append(rules, pluralCheck{ + cat: byte(i<<opShift | andNext), + setID: byte(index), + }) + } + // Now set the last entry to the plural form the rule matches. + rules[len(rules)-1].cat &^= formMask + rules[len(rules)-1].cat |= byte(c.form) + } + // Point the relevant locales to the created entries. + for _, loc := range strings.Split(pRules.Locales, " ") { + if strings.TrimSpace(loc) == "" { + continue + } + lang, ok := language.CompactIndex(language.MustParse(loc)) + if !ok { + log.Printf("No compact index for locale %q", loc) + } + langMap[lang] = byte(len(index) - 1) + } + index = append(index, byte(len(rules))) + } + w.WriteVar(plurals.Type+"Rules", rules) + w.WriteVar(plurals.Type+"Index", index) + // Expand the values. + langToIndex := make([]byte, language.NumCompactTags) + for i := range langToIndex { + for p := i; ; p = int(internal.Parent[p]) { + if x, ok := langMap[p]; ok { + langToIndex[i] = x + break + } + } + } + w.WriteVar(plurals.Type+"LangToIndex", langToIndex) + // Need to convert array to slice because of golang.org/issue/7651. + // This will allow tables to be dropped when unused. This is especially + // relevant for the ordinal data, which I suspect won't be used as much. + w.WriteVar(plurals.Type+"InclusionMasks", inclusionMasks[:]) + + if len(rules) > 0xFF { + log.Fatalf("Too many entries for rules: %#x", len(rules)) + } + if len(index) > 0xFF { + log.Fatalf("Too many entries for index: %#x", len(index)) + } + if len(setMap) > 64 { // maximum number of bits. + log.Fatalf("Too many entries for setMap: %d", len(setMap)) + } + w.WriteComment( + "Slots used for %s: %X of 0xFF rules; %X of 0xFF indexes; %d of 64 sets", + plurals.Type, len(rules), len(index), len(setMap)) + // Prevent comment from attaching to the next entry. + fmt.Fprint(w, "\n\n") + } +} + +type orCondition struct { + original string // for debugging + + form plural.Form + used [32]bool + set [32][numN]bool +} + +func (o *orCondition) add(op opID, mod int, v []int) (ok bool) { + ok = true + for _, x := range v { + if x >= maxMod { + ok = false + break + } + } + for i := 0; i < numN; i++ { + m := i + if mod != 0 { + m = i % mod + } + if !intIn(m, v) { + o.set[op][i] = false + } + } + if ok { + o.used[op] = true + } + return ok +} + +func intIn(x int, a []int) bool { + for _, y := range a { + if x == y { + return true + } + } + return false +} + +var operandIndex = map[string]opID{ + "i": opI, + "n": opN, + "f": opF, + "v": opV, + "w": opW, +} + +// parsePluralCondition parses the condition of a single pluralRule and appends +// the resulting or conditions to conds. +// +// Example rules: +// // Category "one" in English: only allow 1 with no visible fraction +// i = 1 and v = 0 @integer 1 +// +// // Category "few" in Czech: all numbers with visible fractions +// v != 0 @decimal ... +// +// // Category "zero" in Latvian: all multiples of 10 or the numbers 11-19 or +// // numbers with a fraction 11..19 and no trailing zeros. +// n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19 @integer ... +// +// @integer and @decimal are followed by examples and are not relevant for the +// rule itself. The are used here to signal the termination of the rule. +func parsePluralCondition(conds []orCondition, s string, f plural.Form) []orCondition { + scan := bufio.NewScanner(strings.NewReader(s)) + scan.Split(splitTokens) + for { + cond := orCondition{original: s, form: f} + // Set all numbers to be allowed for all number classes and restrict + // from here on. + for i := range cond.set { + for j := range cond.set[i] { + cond.set[i][j] = true + } + } + andLoop: + for { + var token string + scan.Scan() // Must exist. + switch class := scan.Text(); class { + case "t": + class = "w" // equal to w for t == 0 + fallthrough + case "n", "i", "f", "v", "w": + op := scanToken(scan) + opCode := operandIndex[class] + mod := 0 + if op == "%" { + opCode |= opMod + + switch v := scanUint(scan); v { + case 10, 100: + mod = v + case 1000: + // A more general solution would be to allow checking + // against multiples of 100 and include entries for the + // numbers 100..900 in the inclusion masks. At the + // moment this would only help Azerbaijan and Italian. + + // Italian doesn't use '%', so this must be Azerbaijan. + cond.used[opAzerbaijan00s] = true + return append(conds, cond) + + case 1000000: + cond.used[opBretonM] = true + return append(conds, cond) + + default: + log.Fatalf("Modulo value not supported %d", v) + } + op = scanToken(scan) + } + if op != "=" && op != "!=" { + log.Fatalf("Unexpected op %q", op) + } + if op == "!=" { + opCode |= opNotEqual + } + a := []int{} + v := scanUint(scan) + if class == "w" && v != 0 { + log.Fatalf("Must compare against zero for operand type %q", class) + } + token = scanToken(scan) + for { + switch token { + case "..": + end := scanUint(scan) + for ; v <= end; v++ { + a = append(a, v) + } + token = scanToken(scan) + default: // ",", "or", "and", "@..." + a = append(a, v) + } + if token != "," { + break + } + v = scanUint(scan) + token = scanToken(scan) + } + if !cond.add(opCode, mod, a) { + // Detected large numbers. As we ruled out Azerbaijan, this + // must be the many rule for Italian ordinals. + cond.set[opItalian800] = cond.set[opN] + cond.used[opItalian800] = true + } + + case "@integer", "@decimal": // "other" entry: tests only. + return conds + default: + log.Fatalf("Unexpected operand class %q (%s)", class, s) + } + switch token { + case "or": + conds = append(conds, cond) + break andLoop + case "@integer", "@decimal": // examples + // There is always an example in practice, so we always terminate here. + if err := scan.Err(); err != nil { + log.Fatal(err) + } + return append(conds, cond) + case "and": + // keep accumulating + default: + log.Fatalf("Unexpected token %q", token) + } + } + } +} + +func scanToken(scan *bufio.Scanner) string { + scan.Scan() + return scan.Text() +} + +func scanUint(scan *bufio.Scanner) int { + scan.Scan() + val, err := strconv.ParseUint(scan.Text(), 10, 32) + if err != nil { + log.Fatal(err) + } + return int(val) +} + +// splitTokens can be used with bufio.Scanner to tokenize CLDR plural rules. +func splitTokens(data []byte, atEOF bool) (advance int, token []byte, err error) { + condTokens := [][]byte{ + []byte(".."), + []byte(","), + []byte("!="), + []byte("="), + } + advance, token, err = bufio.ScanWords(data, atEOF) + for _, t := range condTokens { + if len(t) >= len(token) { + continue + } + switch p := bytes.Index(token, t); { + case p == -1: + case p == 0: + advance = len(t) + token = token[:len(t)] + return advance - len(token) + len(t), token[:len(t)], err + case p < advance: + // Don't split when "=" overlaps "!=". + if t[0] == '=' && token[p-1] == '!' { + continue + } + advance = p + token = token[:p] + } + } + return advance, token, err +} diff --git a/vendor/golang.org/x/text/internal/number/number.go b/vendor/golang.org/x/text/internal/number/number.go new file mode 100644 index 0000000000..c331d02ddb --- /dev/null +++ b/vendor/golang.org/x/text/internal/number/number.go @@ -0,0 +1,137 @@ +// Copyright 2016 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. + +//go:generate go run gen.go gen_common.go gen_plural.go + +// Package number contains tools and data for formatting numbers. +package number + +import ( + "unicode/utf8" + + "golang.org/x/text/internal" + "golang.org/x/text/language" +) + +// Info holds number formatting configuration data. +type Info struct { + system systemData // numbering system information + symIndex byte // index to symbols +} + +// InfoFromLangID returns a Info for the given compact language identifier and +// numbering system identifier. If system is the empty string, the default +// numbering system will be taken for that language. +func InfoFromLangID(compactIndex int, numberSystem string) Info { + p := langToDefaults[compactIndex] + // Lookup the entry for the language. + pSymIndex := byte(0) // Default: Latin, default symbols + system, ok := systemMap[numberSystem] + if !ok { + // Take the value for the default numbering system. This is by far the + // most common case as an alternative numbering system is hardly used. + if p&0x80 == 0 { + pSymIndex = p + } else { + // Take the first entry from the alternatives list. + data := langToAlt[p&^0x80] + pSymIndex = data.symIndex + system = data.system + } + } else { + langIndex := compactIndex + ns := system + outerLoop: + for { + if p&0x80 == 0 { + if ns == 0 { + // The index directly points to the symbol data. + pSymIndex = p + break + } + // Move to the parent and retry. + langIndex = int(internal.Parent[langIndex]) + } + // The index points to a list of symbol data indexes. + for _, e := range langToAlt[p&^0x80:] { + if int(e.compactTag) != langIndex { + if langIndex == 0 { + // The CLDR root defines full symbol information for all + // numbering systems (even though mostly by means of + // aliases). This means that we will never fall back to + // the default of the language. Also, the loop is + // guaranteed to terminate as a consequence. + ns = numLatn + // Fall back to Latin and start from the original + // language. See + // http://unicode.org/reports/tr35/#Locale_Inheritance. + langIndex = compactIndex + } else { + // Fall back to parent. + langIndex = int(internal.Parent[langIndex]) + } + break + } + if e.system == ns { + pSymIndex = e.symIndex + break outerLoop + } + } + } + } + if int(system) >= len(numSysData) { // algorithmic + // Will generate ASCII digits in case the user inadvertently calls + // WriteDigit or Digit on it. + d := numSysData[0] + d.id = system + return Info{ + system: d, + symIndex: pSymIndex, + } + } + return Info{ + system: numSysData[system], + symIndex: pSymIndex, + } +} + +// InfoFromTag returns a Info for the given language tag. +func InfoFromTag(t language.Tag) Info { + for { + if index, ok := language.CompactIndex(t); ok { + return InfoFromLangID(index, t.TypeForKey("nu")) + } + t = t.Parent() + } +} + +// IsDecimal reports if the numbering system can convert decimal to native +// symbols one-to-one. +func (n Info) IsDecimal() bool { + return int(n.system.id) < len(numSysData) +} + +// WriteDigit writes the UTF-8 sequence for n corresponding to the given ASCII +// digit to dst and reports the number of bytes written. dst must be large +// enough to hold the rune (can be up to utf8.UTFMax bytes). +func (n Info) WriteDigit(dst []byte, asciiDigit rune) int { + copy(dst, n.system.zero[:n.system.digitSize]) + dst[n.system.digitSize-1] += byte(asciiDigit - '0') + return int(n.system.digitSize) +} + +// Digit returns the digit for the numbering system for the corresponding ASCII +// value. For example, ni.Digit('3') could return '三'. Note that the argument +// is the rune constant '3', which equals 51, not the integer constant 3. +func (n Info) Digit(asciiDigit rune) rune { + var x [utf8.UTFMax]byte + n.WriteDigit(x[:], asciiDigit) + r, _ := utf8.DecodeRune(x[:]) + return r +} + +// Symbol returns the string for the given symbol type. +func (n Info) Symbol(t SymbolType) string { + return symData.Elem(int(symIndex[n.symIndex][t])) +} diff --git a/vendor/golang.org/x/text/internal/number/number_test.go b/vendor/golang.org/x/text/internal/number/number_test.go new file mode 100644 index 0000000000..596a959b9e --- /dev/null +++ b/vendor/golang.org/x/text/internal/number/number_test.go @@ -0,0 +1,61 @@ +// Copyright 2016 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 number + +import ( + "testing" + + "golang.org/x/text/language" +) + +func TestInfo(t *testing.T) { + testCases := []struct { + lang string + sym SymbolType + wantSym string + wantNine rune + }{ + {"und", SymDecimal, ".", '9'}, + {"de", SymGroup, ".", '9'}, + {"de-BE", SymGroup, ".", '9'}, // inherits from de (no number data in CLDR) + {"de-BE-oxendict", SymGroup, ".", '9'}, // inherits from de (no compact index) + + // U+096F DEVANAGARI DIGIT NINE ('९') + {"de-BE-u-nu-deva", SymGroup, ".", '\u096f'}, // miss -> latn -> de + {"de-Cyrl-BE", SymGroup, ",", '9'}, // inherits from root + {"de-CH", SymGroup, "'", '9'}, // overrides values in de + {"de-CH-oxendict", SymGroup, "'", '9'}, // inherits from de-CH (no compact index) + {"de-CH-u-nu-deva", SymGroup, "'", '\u096f'}, // miss -> latn -> de-CH + + {"pa", SymExponential, "E", '9'}, + + // "×۱۰^" -> U+00d7 U+06f1 U+06f0^" + // U+06F0 EXTENDED ARABIC-INDIC DIGIT ZERO + // U+06F1 EXTENDED ARABIC-INDIC DIGIT ONE + // U+06F9 EXTENDED ARABIC-INDIC DIGIT NINE + {"pa-u-nu-arabext", SymExponential, "\u00d7\u06f1\u06f0^", '\u06f9'}, + + // "གྲངས་མེད" - > U+0f42 U+0fb2 U+0f44 U+0f66 U+0f0b U+0f58 U+0f7a U+0f51 + // Examples: + // U+0F29 TIBETAN DIGIT NINE (༩) + {"dz", SymInfinity, "\u0f42\u0fb2\u0f44\u0f66\u0f0b\u0f58\u0f7a\u0f51", '\u0f29'}, // defaults to tibt + {"dz-u-nu-latn", SymInfinity, "∞", '9'}, // select alternative + {"dz-u-nu-tibt", SymInfinity, "\u0f42\u0fb2\u0f44\u0f66\u0f0b\u0f58\u0f7a\u0f51", '\u0f29'}, + {"en-u-nu-tibt", SymInfinity, "∞", '\u0f29'}, + + // algorithmic number systems fall back to ASCII if Digits is used. + {"en-u-nu-hanidec", SymPlusSign, "+", '9'}, + {"en-u-nu-roman", SymPlusSign, "+", '9'}, + } + for _, tc := range testCases { + info := InfoFromTag(language.MustParse(tc.lang)) + if got := info.Symbol(tc.sym); got != tc.wantSym { + t.Errorf("%s:%v:sym: got %q; want %q", tc.lang, tc.sym, got, tc.wantSym) + } + if got := info.Digit('9'); got != tc.wantNine { + t.Errorf("%s:%v:nine: got %q; want %q", tc.lang, tc.sym, got, tc.wantNine) + } + } +} diff --git a/vendor/golang.org/x/text/internal/number/pattern.go b/vendor/golang.org/x/text/internal/number/pattern.go new file mode 100644 index 0000000000..2714b73181 --- /dev/null +++ b/vendor/golang.org/x/text/internal/number/pattern.go @@ -0,0 +1,386 @@ +// 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 number + +import ( + "errors" + "unicode/utf8" +) + +// This file contains a parser for the CLDR number patterns as described in +// http://unicode.org/reports/tr35/tr35-numbers.html#Number_Format_Patterns. +// +// The following BNF is derived from this standard. +// +// pattern := subpattern (';' subpattern)? +// subpattern := affix? number exponent? affix? +// number := decimal | sigDigits +// decimal := '#'* '0'* ('.' fraction)? | '#' | '0' +// fraction := '0'* '#'* +// sigDigits := '#'* '@' '@'* '#'* +// exponent := 'E' '+'? '0'* '0' +// padSpec := '*' \L +// +// Notes: +// - An affix pattern may contain any runes, but runes with special meaning +// should be escaped. +// - Sequences of digits, '#', and '@' in decimal and sigDigits may have +// interstitial commas. + +// TODO: replace special characters in affixes (-, +, ¤) with control codes. + +// Format holds information for formatting numbers. It is designed to hold +// information from CLDR number patterns. +// +// This pattern is precompiled for all patterns for all languages. Even though +// the number of patterns is not very large, we want to keep this small. +// +// This type is only intended for internal use. +type Format struct { + // TODO: this struct can be packed a lot better than it is now. Should be + // possible to make it 32 bytes. + + Affix string // includes prefix and suffix. First byte is prefix length. + Offset uint16 // Offset into Affix for prefix and suffix + NegOffset uint16 // Offset into Affix for negative prefix and suffix or 0. + + Multiplier uint32 + RoundIncrement uint32 // Use Min*Digits to determine scale + PadRune rune + + FormatWidth uint16 + + GroupingSize [2]uint8 + Flags FormatFlag + + // Number of digits. + MinIntegerDigits uint8 + MaxIntegerDigits uint8 + MinFractionDigits uint8 + MaxFractionDigits uint8 + MinSignificantDigits uint8 + MaxSignificantDigits uint8 + MinExponentDigits uint8 +} + +// A FormatFlag is a bit mask for the flag field of a Format. +type FormatFlag uint8 + +const ( + AlwaysSign FormatFlag = 1 << iota + AlwaysExpSign + AlwaysDecimalSeparator + ParenthesisForNegative // Common pattern. Saves space. + + PadAfterNumber + PadAfterAffix + + PadBeforePrefix = 0 // Default + PadAfterPrefix = PadAfterAffix + PadBeforeSuffix = PadAfterNumber + PadAfterSuffix = PadAfterNumber | PadAfterAffix + PadMask = PadAfterNumber | PadAfterAffix +) + +type parser struct { + *Format + + leadingSharps int + + pos int + err error + doNotTerminate bool + groupingCount uint + hasGroup bool + buf []byte +} + +func (p *parser) setError(err error) { + if p.err == nil { + p.err = err + } +} + +func (p *parser) updateGrouping() { + if p.hasGroup && p.groupingCount < 255 { + p.GroupingSize[1] = p.GroupingSize[0] + p.GroupingSize[0] = uint8(p.groupingCount) + } + p.groupingCount = 0 + p.hasGroup = true +} + +var ( + // TODO: more sensible and localizeable error messages. + errMultiplePadSpecifiers = errors.New("format: pattern has multiple pad specifiers") + errInvalidPadSpecifier = errors.New("format: invalid pad specifier") + errInvalidQuote = errors.New("format: invalid quote") + errAffixTooLarge = errors.New("format: prefix or suffix exceeds maximum UTF-8 length of 256 bytes") + errDuplicatePercentSign = errors.New("format: duplicate percent sign") + errDuplicatePermilleSign = errors.New("format: duplicate permille sign") + errUnexpectedEnd = errors.New("format: unexpected end of pattern") +) + +// ParsePattern extracts formatting information from a CLDR number pattern. +// +// See http://unicode.org/reports/tr35/tr35-numbers.html#Number_Format_Patterns. +func ParsePattern(s string) (f *Format, err error) { + p := parser{Format: &Format{}} + + s = p.parseSubPattern(s) + + if s != "" { + // Parse negative sub pattern. + if s[0] != ';' { + p.setError(errors.New("format: error parsing first sub pattern")) + return nil, p.err + } + neg := parser{Format: &Format{}} // just for extracting the affixes. + s = neg.parseSubPattern(s[len(";"):]) + p.NegOffset = uint16(len(p.buf)) + p.buf = append(p.buf, neg.buf...) + } + if s != "" { + p.setError(errors.New("format: spurious characters at end of pattern")) + } + if p.err != nil { + return nil, p.err + } + if affix := string(p.buf); affix == "\x00\x00" || affix == "\x00\x00\x00\x00" { + // No prefix or suffixes. + p.NegOffset = 0 + } else { + p.Affix = affix + } + return p.Format, nil +} + +func (p *parser) parseSubPattern(s string) string { + s = p.parsePad(s, PadBeforePrefix) + s = p.parseAffix(s) + s = p.parsePad(s, PadAfterPrefix) + + s = p.parse(p.number, s) + + s = p.parsePad(s, PadBeforeSuffix) + s = p.parseAffix(s) + s = p.parsePad(s, PadAfterSuffix) + return s +} + +func (p *parser) parsePad(s string, f FormatFlag) (tail string) { + if len(s) >= 2 && s[0] == '*' { + r, sz := utf8.DecodeRuneInString(s[1:]) + if p.PadRune != 0 { + p.err = errMultiplePadSpecifiers + } else { + p.Flags |= f + p.PadRune = r + } + return s[1+sz:] + } + return s +} + +func (p *parser) parseAffix(s string) string { + x := len(p.buf) + p.buf = append(p.buf, 0) // placeholder for affix length + + s = p.parse(p.affix, s) + + n := len(p.buf) - x - 1 + if n > 0xFF { + p.setError(errAffixTooLarge) + } + p.buf[x] = uint8(n) + return s +} + +// state implements a state transition. It returns the new state. A state +// function may set an error on the parser or may simply return on an incorrect +// token and let the next phase fail. +type state func(r rune) state + +// parse repeatedly applies a state function on the given string until a +// termination condition is reached. +func (p *parser) parse(fn state, s string) (tail string) { + for i, r := range s { + p.doNotTerminate = false + if fn = fn(r); fn == nil || p.err != nil { + return s[i:] + } + p.FormatWidth++ + } + if p.doNotTerminate { + p.setError(errUnexpectedEnd) + } + return "" +} + +func (p *parser) affix(r rune) state { + switch r { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '#', '@', '.', '*', ',', ';': + return nil + case '\'': + return p.escape + case '%': + if p.Multiplier != 0 { + p.setError(errDuplicatePercentSign) + } + p.Multiplier = 100 + case '\u2030': // ‰ Per mille + if p.Multiplier != 0 { + p.setError(errDuplicatePermilleSign) + } + p.Multiplier = 1000 + // TODO: handle currency somehow: ¤, ¤¤, ¤¤¤, ¤¤¤¤ + } + p.buf = append(p.buf, string(r)...) + return p.affix +} + +func (p *parser) escape(r rune) state { + switch r { + case '\'': + return p.affix + default: + p.buf = append(p.buf, string(r)...) + } + return p.escape +} + +// number parses a number. The BNF says the integer part should always have +// a '0', but that does not appear to be the case according to the rest of the +// documentation. We will allow having only '#' numbers. +func (p *parser) number(r rune) state { + switch r { + case '#': + p.groupingCount++ + p.leadingSharps++ + case '@': + p.groupingCount++ + p.leadingSharps = 0 + return p.sigDigits(r) + case ',': + if p.leadingSharps == 0 { // no leading commas + return nil + } + p.updateGrouping() + case 'E': + p.MaxIntegerDigits = uint8(p.leadingSharps) + return p.exponent + case '.': // allow ".##" etc. + p.updateGrouping() + return p.fraction + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + return p.integer(r) + default: + return nil + } + return p.number +} + +func (p *parser) integer(r rune) state { + if !('0' <= r && r <= '9') { + var next state + switch r { + case 'E': + if p.leadingSharps > 0 { + p.MaxIntegerDigits = uint8(p.leadingSharps) + p.MinIntegerDigits + } + next = p.exponent + case '.': + next = p.fraction + } + p.updateGrouping() + return next + } + p.RoundIncrement = p.RoundIncrement*10 + uint32(r-'0') + p.groupingCount++ + p.MinIntegerDigits++ + return p.integer +} + +func (p *parser) sigDigits(r rune) state { + switch r { + case '@': + p.groupingCount++ + p.MaxSignificantDigits++ + p.MinSignificantDigits++ + case '#': + return p.sigDigitsFinal(r) + case 'E': + p.updateGrouping() + return p.normalizeSigDigitsWithExponent() + default: + p.updateGrouping() + return nil + } + return p.sigDigits +} + +func (p *parser) sigDigitsFinal(r rune) state { + switch r { + case '#': + p.groupingCount++ + p.MaxSignificantDigits++ + case 'E': + p.updateGrouping() + return p.normalizeSigDigitsWithExponent() + default: + p.updateGrouping() + return nil + } + return p.sigDigitsFinal +} + +func (p *parser) normalizeSigDigitsWithExponent() state { + p.MinIntegerDigits, p.MaxIntegerDigits = 1, 1 + p.MinFractionDigits = p.MinSignificantDigits - 1 + p.MaxFractionDigits = p.MaxSignificantDigits - 1 + p.MinSignificantDigits, p.MaxSignificantDigits = 0, 0 + return p.exponent +} + +func (p *parser) fraction(r rune) state { + switch r { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + p.RoundIncrement = p.RoundIncrement*10 + uint32(r-'0') + p.MinFractionDigits++ + p.MaxFractionDigits++ + case '#': + p.MaxFractionDigits++ + case 'E': + if p.leadingSharps > 0 { + p.MaxIntegerDigits = uint8(p.leadingSharps) + p.MinIntegerDigits + } + return p.exponent + default: + return nil + } + return p.fraction +} + +func (p *parser) exponent(r rune) state { + switch r { + case '+': + // Set mode and check it wasn't already set. + if p.Flags&AlwaysExpSign != 0 || p.MinExponentDigits > 0 { + break + } + p.Flags |= AlwaysExpSign + p.doNotTerminate = true + return p.exponent + case '0': + p.MinExponentDigits++ + return p.exponent + } + // termination condition + if p.MinExponentDigits == 0 { + p.setError(errors.New("format: need at least one digit")) + } + return nil +} diff --git a/vendor/golang.org/x/text/internal/number/pattern_test.go b/vendor/golang.org/x/text/internal/number/pattern_test.go new file mode 100644 index 0000000000..f2ad55db1e --- /dev/null +++ b/vendor/golang.org/x/text/internal/number/pattern_test.go @@ -0,0 +1,300 @@ +// 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 number + +import ( + "reflect" + "testing" + "unsafe" +) + +var testCases = []struct { + pat string + want *Format +}{{ + "#", + &Format{ + FormatWidth: 1, + // TODO: Should MinIntegerDigits be 1? + }, +}, { + "0", + &Format{ + FormatWidth: 1, + MinIntegerDigits: 1, + }, +}, { + "0000", + &Format{ + FormatWidth: 4, + MinIntegerDigits: 4, + }, +}, { + ".#", + &Format{ + FormatWidth: 2, + MaxFractionDigits: 1, + }, +}, { + "#0.###", + &Format{ + FormatWidth: 6, + MinIntegerDigits: 1, + MaxFractionDigits: 3, + }, +}, { + "#0.######", + &Format{ + FormatWidth: 9, + MinIntegerDigits: 1, + MaxFractionDigits: 6, + }, +}, { + "#,##0.###", + &Format{ + FormatWidth: 9, + GroupingSize: [2]uint8{3, 0}, + MinIntegerDigits: 1, + MaxFractionDigits: 3, + }, +}, { + "#,##,##0.###", + &Format{ + FormatWidth: 12, + GroupingSize: [2]uint8{3, 2}, + MinIntegerDigits: 1, + MaxFractionDigits: 3, + }, +}, { + // Ignore additional separators. + "#,####,##,##0.###", + &Format{ + FormatWidth: 17, + GroupingSize: [2]uint8{3, 2}, + MinIntegerDigits: 1, + MaxFractionDigits: 3, + }, +}, { + "#E0", + &Format{ + FormatWidth: 3, + MaxIntegerDigits: 1, + MinExponentDigits: 1, + }, +}, { + "0E0", + &Format{ + FormatWidth: 3, + MinIntegerDigits: 1, + MinExponentDigits: 1, + }, +}, { + "##00.0#E0", + &Format{ + FormatWidth: 9, + MinIntegerDigits: 2, + MaxIntegerDigits: 4, + MinFractionDigits: 1, + MaxFractionDigits: 2, + MinExponentDigits: 1, + }, +}, { + "#00.0E+0", + &Format{ + FormatWidth: 8, + Flags: AlwaysExpSign, + MinIntegerDigits: 2, + MaxIntegerDigits: 3, + MinFractionDigits: 1, + MaxFractionDigits: 1, + MinExponentDigits: 1, + }, +}, { + "0.0E++0", + nil, +}, { + "#0E+", + nil, +}, { + // significant digits + "@", + &Format{ + FormatWidth: 1, + MinSignificantDigits: 1, + MaxSignificantDigits: 1, + }, +}, { + // significant digits + "@@@@", + &Format{ + FormatWidth: 4, + MinSignificantDigits: 4, + MaxSignificantDigits: 4, + }, +}, { + "@###", + &Format{ + FormatWidth: 4, + MinSignificantDigits: 1, + MaxSignificantDigits: 4, + }, +}, { + // Exponents in significant digits mode gets normalized. + "@@E0", + &Format{ + FormatWidth: 4, + MinIntegerDigits: 1, + MaxIntegerDigits: 1, + MinFractionDigits: 1, + MaxFractionDigits: 1, + MinExponentDigits: 1, + }, +}, { + "@###E00", + &Format{ + FormatWidth: 7, + MinIntegerDigits: 1, + MaxIntegerDigits: 1, + MinFractionDigits: 0, + MaxFractionDigits: 3, + MinExponentDigits: 2, + }, +}, { + // The significant digits mode does not allow fractions. + "@###.#E0", + nil, +}, { + //alternative negative pattern + "#0.###;(#0.###)", + &Format{ + Affix: "\x00\x00\x01(\x01)", + NegOffset: 2, + FormatWidth: 6, + MinIntegerDigits: 1, + MaxFractionDigits: 3, + }, +}, { + // Rounding increments + "1.05", + &Format{ + RoundIncrement: 105, + FormatWidth: 4, + MinIntegerDigits: 1, + MinFractionDigits: 2, + MaxFractionDigits: 2, + }, +}, { + "0.0%", + &Format{ + Affix: "\x00\x01%", + Multiplier: 100, + FormatWidth: 4, + MinIntegerDigits: 1, + MinFractionDigits: 1, + MaxFractionDigits: 1, + }, +}, { + "0.0‰", + &Format{ + Affix: "\x00\x03‰", + Multiplier: 1000, + FormatWidth: 4, + MinIntegerDigits: 1, + MinFractionDigits: 1, + MaxFractionDigits: 1, + }, +}, { + "#,##0.00¤", + &Format{ + Affix: "\x00\x02¤", + FormatWidth: 9, + GroupingSize: [2]uint8{3, 0}, + MinIntegerDigits: 1, + MinFractionDigits: 2, + MaxFractionDigits: 2, + }, +}, { + "#,##0.00 ¤;(#,##0.00 ¤)", + &Format{Affix: "\x00\x04\u00a0¤\x01(\x05\u00a0¤)", + NegOffset: 6, + Multiplier: 0, + FormatWidth: 10, + GroupingSize: [2]uint8{3, 0}, + MinIntegerDigits: 1, + MinFractionDigits: 2, + MaxFractionDigits: 2, + }, +}, { + // padding + "*x#", + &Format{ + PadRune: 'x', + FormatWidth: 1, + }, +}, { + // padding + "#*x", + &Format{ + PadRune: 'x', + FormatWidth: 1, + Flags: PadBeforeSuffix, + }, +}, { + "*xpre#suf", + &Format{ + Affix: "\x03pre\x03suf", + PadRune: 'x', + FormatWidth: 7, + }, +}, { + "pre*x#suf", + &Format{ + Affix: "\x03pre\x03suf", + PadRune: 'x', + FormatWidth: 7, + Flags: PadAfterPrefix, + }, +}, { + "pre#*xsuf", + &Format{ + Affix: "\x03pre\x03suf", + PadRune: 'x', + FormatWidth: 7, + Flags: PadBeforeSuffix, + }, +}, { + "pre#suf*x", + &Format{ + Affix: "\x03pre\x03suf", + PadRune: 'x', + FormatWidth: 7, + Flags: PadAfterSuffix, + }, +}, { + // no duplicate padding + "*xpre#suf*x", nil, +}, { + // no duplicate padding + "*xpre#suf*x", nil, +}} + +func TestParsePattern(t *testing.T) { + for i, tc := range testCases { + f, err := ParsePattern(tc.pat) + if !reflect.DeepEqual(f, tc.want) { + t.Errorf("%d:%s:\ngot %#v;\nwant %#v", i, tc.pat, f, tc.want) + } + if got, want := err != nil, tc.want == nil; got != want { + t.Errorf("%d:%s:error: got %v; want %v", i, tc.pat, err, want) + } + } +} + +func TestPatternSize(t *testing.T) { + if sz := unsafe.Sizeof(Format{}); sz > 48 { + t.Errorf("got %d; want 48", sz) + } + +} diff --git a/vendor/golang.org/x/text/internal/number/plural.go b/vendor/golang.org/x/text/internal/number/plural.go new file mode 100644 index 0000000000..5714e1128e --- /dev/null +++ b/vendor/golang.org/x/text/internal/number/plural.go @@ -0,0 +1,119 @@ +// Copyright 2016 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 number + +import "golang.org/x/text/internal/format/plural" + +type pluralRules struct { + rules []pluralCheck + index []byte + langToIndex []byte + inclusionMasks []uint64 +} + +var ( + ordinalData = pluralRules{ + ordinalRules, + ordinalIndex, + ordinalLangToIndex, + ordinalInclusionMasks[:], + } + cardinalData = pluralRules{ + cardinalRules, + cardinalIndex, + cardinalLangToIndex, + cardinalInclusionMasks[:], + } +) + +// See gen_plural.go for an explanation of the algorithm. + +func matchPlural(p *pluralRules, index int, n, f, v int) plural.Form { + nMask := p.inclusionMasks[n%maxMod] + // Compute the fMask inline in the rules below, as it is relatively rare. + // fMask := p.inclusionMasks[f%maxMod] + vMask := p.inclusionMasks[v%maxMod] + + // Do the matching + offset := p.langToIndex[index] + rules := p.rules[p.index[offset]:p.index[offset+1]] + for i := 0; i < len(rules); i++ { + rule := rules[i] + setBit := uint64(1 << rule.setID) + var skip bool + switch op := opID(rule.cat >> opShift); op { + case opI: // i = x + skip = n >= numN || nMask&setBit == 0 + + case opI | opNotEqual: // i != x + skip = n < numN && nMask&setBit != 0 + + case opI | opMod: // i % m = x + skip = nMask&setBit == 0 + + case opI | opMod | opNotEqual: // i % m != x + skip = nMask&setBit != 0 + + case opN: // n = x + skip = f != 0 || n >= numN || nMask&setBit == 0 + + case opN | opNotEqual: // n != x + skip = f == 0 && n < numN && nMask&setBit != 0 + + case opN | opMod: // n % m = x + skip = f != 0 || nMask&setBit == 0 + + case opN | opMod | opNotEqual: // n % m != x + skip = f == 0 && nMask&setBit != 0 + + case opF: // f = x + skip = f >= numN || p.inclusionMasks[f%maxMod]&setBit == 0 + + case opF | opNotEqual: // f != x + skip = f < numN && p.inclusionMasks[f%maxMod]&setBit != 0 + + case opF | opMod: // f % m = x + skip = p.inclusionMasks[f%maxMod]&setBit == 0 + + case opF | opMod | opNotEqual: // f % m != x + skip = p.inclusionMasks[f%maxMod]&setBit != 0 + + case opV: // v = x + skip = v < numN && vMask&setBit == 0 + + case opV | opNotEqual: // v != x + skip = v < numN && vMask&setBit != 0 + + case opW: // w == 0 + skip = f != 0 + + case opW | opNotEqual: // w != 0 + skip = f == 0 + + // Hard-wired rules that cannot be handled by our algorithm. + + case opBretonM: + skip = f != 0 || n == 0 || n%1000000 != 0 + + case opAzerbaijan00s: + // 100,200,300,400,500,600,700,800,900 + skip = n == 0 || n >= 1000 || n%100 != 0 + + case opItalian800: + skip = (f != 0 || n >= numN || nMask&setBit == 0) && n != 800 + } + if skip { + // advance over AND entries. + for ; i < len(rules) && rules[i].cat&formMask == andNext; i++ { + } + continue + } + // return if we have a final entry. + if cat := rule.cat & formMask; cat != andNext { + return plural.Form(cat) + } + } + return plural.Other +} diff --git a/vendor/golang.org/x/text/internal/number/plural_test.go b/vendor/golang.org/x/text/internal/number/plural_test.go new file mode 100644 index 0000000000..3383d8c3d9 --- /dev/null +++ b/vendor/golang.org/x/text/internal/number/plural_test.go @@ -0,0 +1,110 @@ +// Copyright 2016 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 number + +import ( + "strconv" + "strings" + "testing" + + "golang.org/x/text/language" +) + +func TestOrdinal(t *testing.T) { + testPlurals(t, &ordinalData, ordinalTests) +} + +func TestCardinal(t *testing.T) { + testPlurals(t, &cardinalData, cardinalTests) +} + +func testPlurals(t *testing.T, p *pluralRules, testCases []pluralTest) { + for _, tc := range testCases { + for _, loc := range strings.Split(tc.locales, " ") { + langIndex, _ := language.CompactIndex(language.MustParse(loc)) + // Test integers + for _, s := range tc.integer { + a := strings.Split(s, "~") + from := parseUint(t, a[0]) + to := from + if len(a) > 1 { + to = parseUint(t, a[1]) + } + for n := from; n <= to; n++ { + if f := matchPlural(p, langIndex, n, 0, 0); f != tc.form { + t.Errorf("%s:int(%d) = %v; want %v", loc, n, f, tc.form) + } + } + } + // Test decimals + for _, s := range tc.decimal { + a := strings.Split(s, "~") + from, scale := parseFixedPoint(t, a[0]) + to := from + if len(a) > 1 { + var toScale int + if to, toScale = parseFixedPoint(t, a[1]); toScale != scale { + t.Fatalf("%s:%s: non-matching scales %d versus %d", loc, s, scale, toScale) + } + } + m := 1 + for i := 0; i < scale; i++ { + m *= 10 + } + for n := from; n <= to; n++ { + if f := matchPlural(p, langIndex, n/m, n%m, scale); f != tc.form { + t.Errorf("%[1]s:dec(%[2]d.%0[4]*[3]d) = %[5]v; want %[6]v", loc, n/m, n%m, scale, f, tc.form) + } + } + } + } + } +} + +func parseUint(t *testing.T, s string) int { + val, err := strconv.ParseUint(s, 10, 32) + if err != nil { + t.Fatal(err) + } + return int(val) +} + +func parseFixedPoint(t *testing.T, s string) (val, scale int) { + p := strings.Index(s, ".") + s = strings.Replace(s, ".", "", 1) + v, err := strconv.ParseUint(s, 10, 32) + if err != nil { + t.Fatal(err) + } + return int(v), len(s) - p +} + +func BenchmarkPluralSimpleCases(b *testing.B) { + p := &cardinalData + en, _ := language.CompactIndex(language.English) + zh, _ := language.CompactIndex(language.Chinese) + for i := 0; i < b.N; i++ { + matchPlural(p, en, 0, 0, 0) // 0 + matchPlural(p, en, 1, 0, 0) // 1 + matchPlural(p, en, 2, 12, 3) // 2.120 + matchPlural(p, zh, 0, 0, 0) // 0 + matchPlural(p, zh, 1, 0, 0) // 1 + matchPlural(p, zh, 2, 12, 3) // 2.120 + } +} + +func BenchmarkPluralComplexCases(b *testing.B) { + p := &cardinalData + ar, _ := language.CompactIndex(language.Arabic) + lv, _ := language.CompactIndex(language.Latvian) + for i := 0; i < b.N; i++ { + matchPlural(p, lv, 0, 19, 2) // 0.19 + matchPlural(p, lv, 11, 0, 3) // 11.000 + matchPlural(p, lv, 100, 123, 4) // 0.1230 + matchPlural(p, ar, 0, 0, 0) // 0 + matchPlural(p, ar, 110, 0, 0) // 110 + matchPlural(p, ar, 99, 99, 2) // 99.99 + } +} diff --git a/vendor/golang.org/x/text/internal/number/tables.go b/vendor/golang.org/x/text/internal/number/tables.go new file mode 100644 index 0000000000..a189c76f30 --- /dev/null +++ b/vendor/golang.org/x/text/internal/number/tables.go @@ -0,0 +1,1031 @@ +// This file was generated by go generate; DO NOT EDIT + +package number + +import "golang.org/x/text/internal/stringset" + +// CLDRVersion is the CLDR version from which the tables in this package are derived. +const CLDRVersion = "28" + +var numSysData = []systemData{ // 55 elements + 0: {id: 0x0, digitSize: 0x1, zero: [4]uint8{0x30, 0x0, 0x0, 0x0}}, + 1: {id: 0x1, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x9c, 0xb0}}, + 2: {id: 0x2, digitSize: 0x2, zero: [4]uint8{0xd9, 0xa0, 0x0, 0x0}}, + 3: {id: 0x3, digitSize: 0x2, zero: [4]uint8{0xdb, 0xb0, 0x0, 0x0}}, + 4: {id: 0x4, digitSize: 0x3, zero: [4]uint8{0xe1, 0xad, 0x90, 0x0}}, + 5: {id: 0x5, digitSize: 0x3, zero: [4]uint8{0xe0, 0xa7, 0xa6, 0x0}}, + 6: {id: 0x6, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x81, 0xa6}}, + 7: {id: 0x7, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x84, 0xb6}}, + 8: {id: 0x8, digitSize: 0x3, zero: [4]uint8{0xea, 0xa9, 0x90, 0x0}}, + 9: {id: 0x9, digitSize: 0x3, zero: [4]uint8{0xe0, 0xa5, 0xa6, 0x0}}, + 10: {id: 0xa, digitSize: 0x3, zero: [4]uint8{0xef, 0xbc, 0x90, 0x0}}, + 11: {id: 0xb, digitSize: 0x3, zero: [4]uint8{0xe0, 0xab, 0xa6, 0x0}}, + 12: {id: 0xc, digitSize: 0x3, zero: [4]uint8{0xe0, 0xa9, 0xa6, 0x0}}, + 13: {id: 0xd, digitSize: 0x4, zero: [4]uint8{0xf0, 0x96, 0xad, 0x90}}, + 14: {id: 0xe, digitSize: 0x3, zero: [4]uint8{0xea, 0xa7, 0x90, 0x0}}, + 15: {id: 0xf, digitSize: 0x3, zero: [4]uint8{0xea, 0xa4, 0x80, 0x0}}, + 16: {id: 0x10, digitSize: 0x3, zero: [4]uint8{0xe1, 0x9f, 0xa0, 0x0}}, + 17: {id: 0x11, digitSize: 0x3, zero: [4]uint8{0xe0, 0xb3, 0xa6, 0x0}}, + 18: {id: 0x12, digitSize: 0x3, zero: [4]uint8{0xe1, 0xaa, 0x80, 0x0}}, + 19: {id: 0x13, digitSize: 0x3, zero: [4]uint8{0xe1, 0xaa, 0x90, 0x0}}, + 20: {id: 0x14, digitSize: 0x3, zero: [4]uint8{0xe0, 0xbb, 0x90, 0x0}}, + 21: {id: 0x15, digitSize: 0x3, zero: [4]uint8{0xe1, 0xb1, 0x80, 0x0}}, + 22: {id: 0x16, digitSize: 0x3, zero: [4]uint8{0xe1, 0xa5, 0x86, 0x0}}, + 23: {id: 0x17, digitSize: 0x4, zero: [4]uint8{0xf0, 0x9d, 0x9f, 0x8e}}, + 24: {id: 0x18, digitSize: 0x4, zero: [4]uint8{0xf0, 0x9d, 0x9f, 0x98}}, + 25: {id: 0x19, digitSize: 0x4, zero: [4]uint8{0xf0, 0x9d, 0x9f, 0xb6}}, + 26: {id: 0x1a, digitSize: 0x4, zero: [4]uint8{0xf0, 0x9d, 0x9f, 0xac}}, + 27: {id: 0x1b, digitSize: 0x4, zero: [4]uint8{0xf0, 0x9d, 0x9f, 0xa2}}, + 28: {id: 0x1c, digitSize: 0x3, zero: [4]uint8{0xe0, 0xb5, 0xa6, 0x0}}, + 29: {id: 0x1d, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x99, 0x90}}, + 30: {id: 0x1e, digitSize: 0x3, zero: [4]uint8{0xe1, 0xa0, 0x90, 0x0}}, + 31: {id: 0x1f, digitSize: 0x4, zero: [4]uint8{0xf0, 0x96, 0xa9, 0xa0}}, + 32: {id: 0x20, digitSize: 0x3, zero: [4]uint8{0xea, 0xaf, 0xb0, 0x0}}, + 33: {id: 0x21, digitSize: 0x3, zero: [4]uint8{0xe1, 0x81, 0x80, 0x0}}, + 34: {id: 0x22, digitSize: 0x3, zero: [4]uint8{0xe1, 0x82, 0x90, 0x0}}, + 35: {id: 0x23, digitSize: 0x3, zero: [4]uint8{0xea, 0xa7, 0xb0, 0x0}}, + 36: {id: 0x24, digitSize: 0x2, zero: [4]uint8{0xdf, 0x80, 0x0, 0x0}}, + 37: {id: 0x25, digitSize: 0x3, zero: [4]uint8{0xe1, 0xb1, 0x90, 0x0}}, + 38: {id: 0x26, digitSize: 0x3, zero: [4]uint8{0xe0, 0xad, 0xa6, 0x0}}, + 39: {id: 0x27, digitSize: 0x4, zero: [4]uint8{0xf0, 0x90, 0x92, 0xa0}}, + 40: {id: 0x28, digitSize: 0x3, zero: [4]uint8{0xea, 0xa3, 0x90, 0x0}}, + 41: {id: 0x29, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x87, 0x90}}, + 42: {id: 0x2a, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x8b, 0xb0}}, + 43: {id: 0x2b, digitSize: 0x3, zero: [4]uint8{0xe0, 0xb7, 0xa6, 0x0}}, + 44: {id: 0x2c, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x83, 0xb0}}, + 45: {id: 0x2d, digitSize: 0x3, zero: [4]uint8{0xe1, 0xae, 0xb0, 0x0}}, + 46: {id: 0x2e, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x9b, 0x80}}, + 47: {id: 0x2f, digitSize: 0x3, zero: [4]uint8{0xe1, 0xa7, 0x90, 0x0}}, + 48: {id: 0x30, digitSize: 0x3, zero: [4]uint8{0xe0, 0xaf, 0xa6, 0x0}}, + 49: {id: 0x31, digitSize: 0x3, zero: [4]uint8{0xe0, 0xb1, 0xa6, 0x0}}, + 50: {id: 0x32, digitSize: 0x3, zero: [4]uint8{0xe0, 0xb9, 0x90, 0x0}}, + 51: {id: 0x33, digitSize: 0x3, zero: [4]uint8{0xe0, 0xbc, 0xa0, 0x0}}, + 52: {id: 0x34, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0x93, 0x90}}, + 53: {id: 0x35, digitSize: 0x3, zero: [4]uint8{0xea, 0x98, 0xa0, 0x0}}, + 54: {id: 0x36, digitSize: 0x4, zero: [4]uint8{0xf0, 0x91, 0xa3, 0xa0}}, +} // Size: 354 bytes + +const ( + numAhom = 0x1 + numArab = 0x2 + numArabext = 0x3 + numArmn = 0x37 + numArmnlow = 0x38 + numBali = 0x4 + numBeng = 0x5 + numBrah = 0x6 + numCakm = 0x7 + numCham = 0x8 + numCyrl = 0x39 + numDeva = 0x9 + numEthi = 0x3a + numFullwide = 0xa + numGeor = 0x3b + numGrek = 0x3c + numGreklow = 0x3d + numGujr = 0xb + numGuru = 0xc + numHanidays = 0x3e + numHanidec = 0x3f + numHans = 0x40 + numHansfin = 0x41 + numHant = 0x42 + numHantfin = 0x43 + numHebr = 0x44 + numHmng = 0xd + numJava = 0xe + numJpan = 0x45 + numJpanfin = 0x46 + numKali = 0xf + numKhmr = 0x10 + numKnda = 0x11 + numLana = 0x12 + numLanatham = 0x13 + numLaoo = 0x14 + numLatn = 0x0 + numLepc = 0x15 + numLimb = 0x16 + numMathbold = 0x17 + numMathdbl = 0x18 + numMathmono = 0x19 + numMathsanb = 0x1a + numMathsans = 0x1b + numMlym = 0x1c + numModi = 0x1d + numMong = 0x1e + numMroo = 0x1f + numMtei = 0x20 + numMymr = 0x21 + numMymrshan = 0x22 + numMymrtlng = 0x23 + numNkoo = 0x24 + numOlck = 0x25 + numOrya = 0x26 + numOsma = 0x27 + numRoman = 0x47 + numRomanlow = 0x48 + numSaur = 0x28 + numShrd = 0x29 + numSind = 0x2a + numSinh = 0x2b + numSora = 0x2c + numSund = 0x2d + numTakr = 0x2e + numTalu = 0x2f + numTaml = 0x49 + numTamldec = 0x30 + numTelu = 0x31 + numThai = 0x32 + numTibt = 0x33 + numTirh = 0x34 + numVaii = 0x35 + numWara = 0x36 + numNumberSystems +) + +var systemMap = map[string]system{ + "ahom": numAhom, + "arab": numArab, + "arabext": numArabext, + "armn": numArmn, + "armnlow": numArmnlow, + "bali": numBali, + "beng": numBeng, + "brah": numBrah, + "cakm": numCakm, + "cham": numCham, + "cyrl": numCyrl, + "deva": numDeva, + "ethi": numEthi, + "fullwide": numFullwide, + "geor": numGeor, + "grek": numGrek, + "greklow": numGreklow, + "gujr": numGujr, + "guru": numGuru, + "hanidays": numHanidays, + "hanidec": numHanidec, + "hans": numHans, + "hansfin": numHansfin, + "hant": numHant, + "hantfin": numHantfin, + "hebr": numHebr, + "hmng": numHmng, + "java": numJava, + "jpan": numJpan, + "jpanfin": numJpanfin, + "kali": numKali, + "khmr": numKhmr, + "knda": numKnda, + "lana": numLana, + "lanatham": numLanatham, + "laoo": numLaoo, + "latn": numLatn, + "lepc": numLepc, + "limb": numLimb, + "mathbold": numMathbold, + "mathdbl": numMathdbl, + "mathmono": numMathmono, + "mathsanb": numMathsanb, + "mathsans": numMathsans, + "mlym": numMlym, + "modi": numModi, + "mong": numMong, + "mroo": numMroo, + "mtei": numMtei, + "mymr": numMymr, + "mymrshan": numMymrshan, + "mymrtlng": numMymrtlng, + "nkoo": numNkoo, + "olck": numOlck, + "orya": numOrya, + "osma": numOsma, + "roman": numRoman, + "romanlow": numRomanlow, + "saur": numSaur, + "shrd": numShrd, + "sind": numSind, + "sinh": numSinh, + "sora": numSora, + "sund": numSund, + "takr": numTakr, + "talu": numTalu, + "taml": numTaml, + "tamldec": numTamldec, + "telu": numTelu, + "thai": numThai, + "tibt": numTibt, + "tirh": numTirh, + "vaii": numVaii, + "wara": numWara, +} + +var symIndex = [][12]uint8{ // 68 elements + 0: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 1: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 2: [12]uint8{0x0, 0x1, 0x2, 0xd, 0xe, 0xf, 0x6, 0x7, 0x8, 0x9, 0x10, 0xb}, + 3: [12]uint8{0x1, 0x0, 0x2, 0xd, 0xe, 0xf, 0x6, 0x7, 0x8, 0x9, 0x10, 0xb}, + 4: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x11, 0xb}, + 5: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 6: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0x0}, + 7: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x0, 0x8, 0x9, 0xa, 0xb}, + 8: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x12, 0xb}, + 9: [12]uint8{0x0, 0x1, 0x2, 0xd, 0xe, 0xf, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 10: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x13, 0x8, 0x9, 0xa, 0xb}, + 11: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0x0}, + 12: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x14, 0x8, 0x9, 0xa, 0xb}, + 13: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x14, 0x8, 0x9, 0xa, 0xb}, + 14: [12]uint8{0x0, 0x15, 0x2, 0x3, 0x4, 0x5, 0x6, 0x14, 0x8, 0x9, 0xa, 0xb}, + 15: [12]uint8{0x0, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 16: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x16, 0xb}, + 17: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x17, 0x7, 0x8, 0x9, 0xa, 0xb}, + 18: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x17, 0x7, 0x8, 0x9, 0xa, 0xb}, + 19: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x18, 0x7, 0x8, 0x9, 0xa, 0xb}, + 20: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x19, 0x1a, 0xa, 0xb}, + 21: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x1b, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 22: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x1b, 0x18, 0x7, 0x8, 0x9, 0xa, 0xb}, + 23: [12]uint8{0x0, 0x1, 0x2, 0x3, 0xe, 0x1c, 0x6, 0x7, 0x8, 0x9, 0x1d, 0xb}, + 24: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x1b, 0x6, 0x7, 0x8, 0x9, 0x1e, 0x0}, + 25: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x1b, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 26: [12]uint8{0x0, 0x1f, 0x2, 0x3, 0x4, 0x1b, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 27: [12]uint8{0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 28: [12]uint8{0x0, 0x15, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 29: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x20, 0xb}, + 30: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x18, 0x14, 0x8, 0x9, 0x21, 0xb}, + 31: [12]uint8{0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x6, 0x7, 0x8, 0x22, 0xa, 0xb}, + 32: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x1b, 0x18, 0x7, 0x8, 0x9, 0x21, 0xb}, + 33: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x23, 0xb}, + 34: [12]uint8{0x1, 0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x24, 0xb}, + 35: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x25, 0xb}, + 36: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x26, 0xb}, + 37: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x1b, 0x6, 0x7, 0x8, 0x9, 0xa, 0x0}, + 38: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x27, 0xb}, + 39: [12]uint8{0x1, 0x0, 0x2, 0x3, 0xe, 0x1c, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 40: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x28, 0xb}, + 41: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x1b, 0x18, 0x14, 0x8, 0x9, 0x21, 0xb}, + 42: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0x0}, + 43: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x29, 0xb}, + 44: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x2a, 0xb}, + 45: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x2b, 0xb}, + 46: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x2c, 0x7, 0x8, 0x9, 0xa, 0xb}, + 47: [12]uint8{0x1, 0xc, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x2d, 0xb}, + 48: [12]uint8{0x1, 0x1f, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 49: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x2e, 0xb}, + 50: [12]uint8{0x2f, 0x30, 0x31, 0xd, 0x32, 0x33, 0x34, 0x7, 0x35, 0x9, 0xa, 0xb}, + 51: [12]uint8{0x2f, 0x30, 0x31, 0xd, 0x32, 0x33, 0x34, 0x7, 0x35, 0x9, 0x36, 0xb}, + 52: [12]uint8{0x2f, 0x30, 0x31, 0xd, 0x32, 0x37, 0x34, 0x7, 0x35, 0x9, 0xa, 0xb}, + 53: [12]uint8{0x2f, 0xc, 0x31, 0xd, 0x4, 0x1b, 0x34, 0x7, 0x35, 0x9, 0xa, 0x0}, + 54: [12]uint8{0x2f, 0x30, 0x31, 0xd, 0x38, 0x39, 0x3a, 0x7, 0x35, 0x9, 0xa, 0x2f}, + 55: [12]uint8{0x2f, 0x30, 0x31, 0xd, 0x38, 0x1c, 0x3a, 0x7, 0x35, 0x9, 0x1d, 0xb}, + 56: [12]uint8{0x2f, 0x30, 0x31, 0xd, 0xe, 0x1c, 0x3a, 0x7, 0x35, 0x9, 0xa, 0x2f}, + 57: [12]uint8{0x1, 0xc, 0x31, 0xd, 0x4, 0x1b, 0x3a, 0x7, 0x35, 0x9, 0xa, 0x0}, + 58: [12]uint8{0x2f, 0x1, 0x31, 0xd, 0x4, 0x5, 0x3a, 0x7, 0x35, 0x9, 0xa, 0x2f}, + 59: [12]uint8{0x2f, 0x30, 0x31, 0xd, 0x38, 0x37, 0x3a, 0x7, 0x35, 0x9, 0xa, 0xb}, + 60: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x38, 0x39, 0x3b, 0x7, 0x8, 0x9, 0x3c, 0x2f}, + 61: [12]uint8{0x2f, 0x30, 0x31, 0xd, 0x4, 0x5, 0x3a, 0x7, 0x35, 0x9, 0x2d, 0x2f}, + 62: [12]uint8{0x2f, 0x30, 0x31, 0xd, 0x4, 0x5, 0x3a, 0x7, 0x35, 0x9, 0xa, 0x2f}, + 63: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x3d, 0xb}, + 64: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x3e, 0xb}, + 65: [12]uint8{0x0, 0x1, 0x3f, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb}, + 66: [12]uint8{0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x40, 0xb}, + 67: [12]uint8{0x0, 0x1, 0x41, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x42, 0x43, 0xb}, +} // Size: 840 bytes + +var symData = stringset.Set{ + Data: "" + // Size: 560 bytes + ".,;%+-E׉∞NaN:\u00a0٪\u200e+\u200e-ليس\u00a0رقمًاNDТерхьаш\u00a0дацx·'mn" + + "ne×10^0/00INF−\u200e−ناعددepäluku’არ\u00a0არის\u00a0რიცხვი¤¤¤?сан\u00a0э" + + "месບໍ່\u200bແມ່ນ\u200bໂຕ\u200bເລກnav\u00a0skaitlisဂဏန်းမဟုတ်သောННне" + + "\u00a0числоepilohosan\u00a0dälTFЕhaqiqiy\u00a0son\u00a0emas非數值٫٬؛\u200f+" + + "\u200f-اس؉ليس\u00a0رقم\u200f−\u200e+\u200e\u200e-\u200e×۱۰^قیہ\u00a0عدد" + + "\u00a0نہیںসংখ্যা\u00a0নাസംഖ്യയല്ല၊ཨང་མེན་དང་གྲངས་མེདཨང་མད", + Index: []uint16{ // 69 elements + // Entry 0 - 3F + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0009, 0x000c, 0x000f, 0x0012, 0x0013, 0x0015, 0x0017, 0x001b, + 0x001f, 0x0031, 0x0033, 0x0049, 0x004a, 0x004c, 0x004d, 0x0050, + 0x0051, 0x0056, 0x005a, 0x005d, 0x0060, 0x0066, 0x0070, 0x0078, + 0x007b, 0x00a3, 0x00a9, 0x00aa, 0x00ba, 0x00e7, 0x00f4, 0x011b, + 0x011f, 0x012f, 0x0136, 0x013f, 0x0141, 0x0143, 0x0155, 0x015e, + 0x0160, 0x0162, 0x0164, 0x0168, 0x016c, 0x0170, 0x0172, 0x0180, + 0x0186, 0x018d, 0x0194, 0x019b, 0x019d, 0x01b3, 0x01cd, 0x01e8, + // Entry 40 - 7F + 0x01eb, 0x0200, 0x0209, 0x0221, 0x0230, + }, +} // Size: 738 bytes + +// langToDefaults maps a compact language index to the default numbering system +// and default symbol set +var langToDefaults = [742]uint8{ + // Entry 0 - 3F + 0x80, 0x05, 0x14, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x83, 0x02, 0x02, 0x02, + 0x02, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, + 0x02, 0x85, 0x00, 0x00, 0x00, 0x86, 0x04, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x01, 0x01, 0x06, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, + // Entry 40 - 7F + 0x00, 0x89, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x8d, + 0x01, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x08, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x8f, 0x09, 0x09, 0x91, 0x01, + 0x01, 0x01, 0x93, 0x0a, 0x0b, 0x0b, 0x0b, 0x00, + 0x00, 0x0c, 0x0d, 0x0c, 0x0e, 0x0c, 0x0e, 0x0c, + 0x0f, 0x0f, 0x0c, 0x0c, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x95, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, + // Entry 80 - BF + 0x11, 0x11, 0x11, 0x00, 0x00, 0x05, 0x00, 0x00, + 0x00, 0x0c, 0x12, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x00, 0x0b, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry C0 - FF + 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x11, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x15, 0x15, 0x05, 0x00, + 0x00, 0x05, 0x05, 0x05, 0x05, 0x01, 0x00, 0x00, + 0x05, 0x05, 0x05, 0x05, 0x00, 0x00, 0x05, 0x00, + // Entry 100 - 13F + 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00, + 0x05, 0x05, 0x16, 0x16, 0x05, 0x05, 0x01, 0x01, + 0x97, 0x17, 0x17, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x18, 0x18, 0x00, 0x00, 0x19, 0x19, 0x19, 0x9a, + 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x0f, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + // Entry 140 - 17F + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, 0x05, + 0x05, 0x05, 0x00, 0x00, 0x9d, 0x00, 0x05, 0x05, + 0x1a, 0x1a, 0x1a, 0x1a, 0xa0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1b, 0x1b, 0x00, 0x00, 0x05, 0x05, 0x05, + 0x0c, 0x0c, 0x01, 0x01, 0x05, 0x05, 0x0b, 0x0b, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x05, 0x1c, + // Entry 180 - 1BF + 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, + 0x00, 0x00, 0x00, 0x1d, 0x1d, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0f, + 0x0f, 0x00, 0x00, 0x01, 0x01, 0x05, 0x05, 0x1e, + 0x1e, 0x00, 0x00, 0x05, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa2, 0x1f, 0x00, 0x00, + 0x01, 0x01, 0x20, 0x20, 0x00, 0x00, 0x00, 0x21, + 0x21, 0x00, 0x00, 0x05, 0x05, 0x00, 0x00, 0x00, + // Entry 1C0 - 1FF + 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x22, 0x22, + 0xa4, 0x00, 0x00, 0x16, 0x16, 0x05, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x23, 0x23, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x05, 0x05, + 0x00, 0x00, 0x05, 0x05, 0xa6, 0x00, 0x00, 0x00, + 0xa8, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x05, 0xa9, 0x24, 0xab, 0x00, 0x00, 0x00, + 0x00, 0xac, 0x25, 0x25, 0x00, 0x00, 0xaf, 0x00, + // Entry 200 - 23F + 0x00, 0xb0, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x01, 0x01, 0x15, 0x15, 0x05, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x26, 0x26, + 0xb2, 0xb4, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x01, 0x01, 0xb6, 0x27, 0x05, 0x01, 0x05, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x05, + 0x00, 0x00, 0x1a, 0x1a, 0x05, 0x05, 0x05, 0x05, + // Entry 240 - 27F + 0x05, 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x28, + 0x28, 0x28, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x29, 0x29, + 0x29, 0x05, 0x05, 0x0f, 0x0f, 0x05, 0x05, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x2a, 0x2a, 0x01, 0x01, + 0x11, 0x11, 0x00, 0x00, 0x00, 0x2b, 0x2b, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, + // Entry 280 - 2BF + 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x00, 0x00, + 0x00, 0xb8, 0x20, 0x20, 0x20, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x2c, 0x2c, 0x00, 0x2d, 0x2d, + 0x05, 0x05, 0x05, 0x00, 0x0f, 0x0f, 0x01, 0x01, + 0x00, 0x00, 0x2e, 0x2e, 0xbb, 0xbd, 0x1b, 0xbe, + 0xc0, 0x27, 0xc2, 0x01, 0x2f, 0x2f, 0x00, 0x00, + // Entry 2C0 - 2FF + 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x31, 0x31, 0x31, 0x31, 0x00, 0x00, +} // Size: 742 bytes + +// langToAlt is a list of numbering system and symbol set pairs, sorted and +// marked by compact language index. +var langToAlt = []altSymData{ // 68 elements + 1: {compactTag: 0x0, system: 0x2, symIndex: 0x32}, + 2: {compactTag: 0x0, system: 0x3, symIndex: 0x36}, + 3: {compactTag: 0xc, system: 0x2, symIndex: 0x33}, + 4: {compactTag: 0xc, system: 0x0, symIndex: 0x2}, + 5: {compactTag: 0x29, system: 0x5, symIndex: 0x0}, + 6: {compactTag: 0x2d, system: 0x0, symIndex: 0x4}, + 7: {compactTag: 0x2d, system: 0x2, symIndex: 0x32}, + 8: {compactTag: 0x2d, system: 0x3, symIndex: 0x36}, + 9: {compactTag: 0x41, system: 0x5, symIndex: 0x3f}, + 10: {compactTag: 0x41, system: 0x0, symIndex: 0x0}, + 11: {compactTag: 0x44, system: 0x0, symIndex: 0x0}, + 12: {compactTag: 0x44, system: 0x33, symIndex: 0x42}, + 13: {compactTag: 0x47, system: 0x0, symIndex: 0x1}, + 14: {compactTag: 0x47, system: 0x2, symIndex: 0x32}, + 15: {compactTag: 0x5b, system: 0x2, symIndex: 0x32}, + 16: {compactTag: 0x5b, system: 0x0, symIndex: 0x9}, + 17: {compactTag: 0x5e, system: 0x0, symIndex: 0x1}, + 18: {compactTag: 0x5e, system: 0x2, symIndex: 0x32}, + 19: {compactTag: 0x62, system: 0x0, symIndex: 0xa}, + 20: {compactTag: 0x62, system: 0x2, symIndex: 0x32}, + 21: {compactTag: 0x79, system: 0x33, symIndex: 0x43}, + 22: {compactTag: 0x79, system: 0x0, symIndex: 0x0}, + 23: {compactTag: 0x110, system: 0x3, symIndex: 0x37}, + 24: {compactTag: 0x110, system: 0x0, symIndex: 0x17}, + 25: {compactTag: 0x110, system: 0x2, symIndex: 0x32}, + 26: {compactTag: 0x11f, system: 0x0, symIndex: 0x1}, + 27: {compactTag: 0x11f, system: 0x2, symIndex: 0x34}, + 28: {compactTag: 0x11f, system: 0x3, symIndex: 0x38}, + 29: {compactTag: 0x154, system: 0x0, symIndex: 0x0}, + 30: {compactTag: 0x154, system: 0x2, symIndex: 0x32}, + 31: {compactTag: 0x154, system: 0x3, symIndex: 0x36}, + 32: {compactTag: 0x15c, system: 0x0, symIndex: 0x0}, + 33: {compactTag: 0x15c, system: 0x2, symIndex: 0x32}, + 34: {compactTag: 0x1ac, system: 0x3, symIndex: 0x36}, + 35: {compactTag: 0x1ac, system: 0x0, symIndex: 0x1f}, + 36: {compactTag: 0x1c8, system: 0x3, symIndex: 0x36}, + 37: {compactTag: 0x1c8, system: 0x0, symIndex: 0x0}, + 38: {compactTag: 0x1e4, system: 0x0, symIndex: 0x0}, + 39: {compactTag: 0x1e4, system: 0x1c, symIndex: 0x40}, + 40: {compactTag: 0x1e8, system: 0x9, symIndex: 0x0}, + 41: {compactTag: 0x1f2, system: 0x21, symIndex: 0x41}, + 42: {compactTag: 0x1f2, system: 0x0, symIndex: 0x24}, + 43: {compactTag: 0x1f4, system: 0x3, symIndex: 0x36}, + 44: {compactTag: 0x1f9, system: 0x0, symIndex: 0x25}, + 45: {compactTag: 0x1f9, system: 0x2, symIndex: 0x35}, + 46: {compactTag: 0x1f9, system: 0x3, symIndex: 0x39}, + 47: {compactTag: 0x1fe, system: 0x9, symIndex: 0x0}, + 48: {compactTag: 0x201, system: 0x0, symIndex: 0x5}, + 49: {compactTag: 0x201, system: 0x2, symIndex: 0x32}, + 50: {compactTag: 0x220, system: 0x0, symIndex: 0x0}, + 51: {compactTag: 0x220, system: 0x3, symIndex: 0x3a}, + 52: {compactTag: 0x221, system: 0x3, symIndex: 0x36}, + 53: {compactTag: 0x221, system: 0x0, symIndex: 0x1b}, + 54: {compactTag: 0x22a, system: 0x3, symIndex: 0x36}, + 55: {compactTag: 0x22a, system: 0x0, symIndex: 0x27}, + 56: {compactTag: 0x289, system: 0x0, symIndex: 0x20}, + 57: {compactTag: 0x289, system: 0x2, symIndex: 0x34}, + 58: {compactTag: 0x289, system: 0x3, symIndex: 0x3b}, + 59: {compactTag: 0x2b4, system: 0x0, symIndex: 0x1b}, + 60: {compactTag: 0x2b4, system: 0x3, symIndex: 0x3c}, + 61: {compactTag: 0x2b5, system: 0x3, symIndex: 0x3c}, + 62: {compactTag: 0x2b7, system: 0x0, symIndex: 0x2f}, + 63: {compactTag: 0x2b7, system: 0x3, symIndex: 0x3d}, + 64: {compactTag: 0x2b8, system: 0x3, symIndex: 0x36}, + 65: {compactTag: 0x2b8, system: 0x0, symIndex: 0x27}, + 66: {compactTag: 0x2ba, system: 0x0, symIndex: 0x1}, + 67: {compactTag: 0x2ba, system: 0x3, symIndex: 0x3e}, +} // Size: 296 bytes + +var ordinalRules = []pluralCheck{ // 59 elements + 0: {cat: 0x2f, setID: 0x4}, + 1: {cat: 0x3a, setID: 0x5}, + 2: {cat: 0x22, setID: 0x1}, + 3: {cat: 0x22, setID: 0x1}, + 4: {cat: 0x22, setID: 0x6}, + 5: {cat: 0x22, setID: 0x7}, + 6: {cat: 0x2f, setID: 0x8}, + 7: {cat: 0x3c, setID: 0x9}, + 8: {cat: 0x2f, setID: 0xa}, + 9: {cat: 0x3c, setID: 0xb}, + 10: {cat: 0x2d, setID: 0xc}, + 11: {cat: 0x2d, setID: 0xd}, + 12: {cat: 0x2f, setID: 0xe}, + 13: {cat: 0x35, setID: 0x3}, + 14: {cat: 0xc5, setID: 0xf}, + 15: {cat: 0x2, setID: 0x1}, + 16: {cat: 0x5, setID: 0x3}, + 17: {cat: 0xd, setID: 0x10}, + 18: {cat: 0x22, setID: 0x1}, + 19: {cat: 0x2f, setID: 0x11}, + 20: {cat: 0x3d, setID: 0x12}, + 21: {cat: 0x2f, setID: 0x13}, + 22: {cat: 0x3a, setID: 0x14}, + 23: {cat: 0x2f, setID: 0x15}, + 24: {cat: 0x3b, setID: 0x16}, + 25: {cat: 0x2f, setID: 0xa}, + 26: {cat: 0x3c, setID: 0xb}, + 27: {cat: 0x22, setID: 0x1}, + 28: {cat: 0x23, setID: 0x17}, + 29: {cat: 0x24, setID: 0x18}, + 30: {cat: 0x22, setID: 0x19}, + 31: {cat: 0x23, setID: 0x2}, + 32: {cat: 0x24, setID: 0x18}, + 33: {cat: 0xf, setID: 0x13}, + 34: {cat: 0x1a, setID: 0x14}, + 35: {cat: 0xf, setID: 0x15}, + 36: {cat: 0x1b, setID: 0x16}, + 37: {cat: 0xf, setID: 0x1a}, + 38: {cat: 0x1d, setID: 0x1b}, + 39: {cat: 0xa, setID: 0x1c}, + 40: {cat: 0xa, setID: 0x1d}, + 41: {cat: 0xc, setID: 0x1e}, + 42: {cat: 0xe4, setID: 0x0}, + 43: {cat: 0x5, setID: 0x3}, + 44: {cat: 0xd, setID: 0xc}, + 45: {cat: 0xd, setID: 0x1f}, + 46: {cat: 0x22, setID: 0x1}, + 47: {cat: 0x23, setID: 0x17}, + 48: {cat: 0x24, setID: 0x18}, + 49: {cat: 0x25, setID: 0x20}, + 50: {cat: 0x22, setID: 0x21}, + 51: {cat: 0x23, setID: 0x17}, + 52: {cat: 0x24, setID: 0x18}, + 53: {cat: 0x25, setID: 0x20}, + 54: {cat: 0x21, setID: 0x22}, + 55: {cat: 0x22, setID: 0x1}, + 56: {cat: 0x23, setID: 0x2}, + 57: {cat: 0x24, setID: 0x23}, + 58: {cat: 0x25, setID: 0x24}, +} // Size: 142 bytes + +var ordinalIndex = []uint8{ // 21 elements + 0x00, 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x08, + 0x0a, 0x0e, 0x0f, 0x12, 0x15, 0x1b, 0x1e, 0x21, + 0x27, 0x2e, 0x32, 0x36, 0x3b, +} // Size: 45 bytes + +var ordinalLangToIndex = []uint8{ // 742 elements + // Entry 0 - 3F + 0x00, 0x0e, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x06, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 40 - 7F + 0x00, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x13, 0x13, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 80 - BF + 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + // Entry C0 - FF + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 100 - 13F + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + // Entry 140 - 17F + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x04, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, + // Entry 180 - 1BF + 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 1C0 - 1FF + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x0d, 0x0d, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, + // Entry 200 - 23F + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, + // Entry 240 - 27F + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, + 0x0b, 0x0b, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 280 - 2BF + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 2C0 - 2FF + 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +} // Size: 766 bytes + +var ordinalInclusionMasks = []uint64{ // 100 elements + // Entry 0 - 1F + 0x0000000400004009, 0x00000002120800d3, 0x0000000010a10195, 0x0000000842810581, + 0x0000000841030081, 0x0000001210010041, 0x0000001100011001, 0x0000000614010001, + 0x0000000614018001, 0x0000000600012001, 0x0000000200014001, 0x0000000010198031, + 0x0000000010610331, 0x0000000040010f01, 0x0000000040070001, 0x0000000010010001, + 0x0000000000011001, 0x000000001c010001, 0x000000001c010001, 0x0000000000012001, + 0x0000000020014001, 0x0000000010080011, 0x0000000010200111, 0x0000000040000501, + 0x0000000040020001, 0x0000000010000001, 0x0000000000001001, 0x0000000014000001, + 0x0000000014000001, 0x0000000000002001, 0x0000000000004001, 0x0000000010080011, + // Entry 20 - 3F + 0x0000000010200111, 0x0000000040000501, 0x0000000040020001, 0x0000000010000001, + 0x0000000000001001, 0x0000000014000001, 0x0000000014000001, 0x0000000000002001, + 0x0000000080014001, 0x0000000010080011, 0x0000000010200111, 0x0000000040000501, + 0x0000000040020001, 0x0000000010000001, 0x0000000000001001, 0x0000000014000001, + 0x0000000014000001, 0x0000000000002001, 0x0000000020004001, 0x0000000010080011, + 0x0000000010200111, 0x0000000040000501, 0x0000000040020001, 0x0000000010000001, + 0x0000000000001001, 0x0000000014000001, 0x0000000014000001, 0x0000000000002001, + 0x0000000080014001, 0x0000000010080011, 0x0000000010200111, 0x0000000040000501, + // Entry 40 - 5F + 0x0000000040020001, 0x0000000010000001, 0x0000000000001001, 0x0000000014000001, + 0x0000000014000001, 0x0000000000002001, 0x0000000020004001, 0x0000000010080011, + 0x0000000010200111, 0x0000000040000501, 0x0000000040020001, 0x0000000010000001, + 0x0000000000001001, 0x0000000014000001, 0x0000000014000001, 0x0000000000002001, + 0x000000002001c001, 0x0000000010080011, 0x0000000010200111, 0x0000000040000501, + 0x0000000040020001, 0x0000000010000001, 0x0000000000001001, 0x0000000014000001, + 0x0000000014000001, 0x0000000000002001, 0x0000000080004001, 0x0000000010080011, + 0x0000000010200111, 0x0000000040000501, 0x0000000040020001, 0x0000000010000001, + // Entry 60 - 7F + 0x0000000000001001, 0x0000000014000001, 0x0000000014000001, 0x0000000000002001, +} // Size: 824 bytes + +// Slots used for ordinal: 3B of 0xFF rules; 15 of 0xFF indexes; 37 of 64 sets + +var cardinalRules = []pluralCheck{ // 169 elements + 0: {cat: 0x2, setID: 0x3}, + 1: {cat: 0x22, setID: 0x1}, + 2: {cat: 0x2, setID: 0x4}, + 3: {cat: 0x7, setID: 0x1}, + 4: {cat: 0x62, setID: 0x3}, + 5: {cat: 0x22, setID: 0x4}, + 6: {cat: 0x7, setID: 0x3}, + 7: {cat: 0x42, setID: 0x1}, + 8: {cat: 0x22, setID: 0x4}, + 9: {cat: 0x22, setID: 0x4}, + 10: {cat: 0x22, setID: 0x5}, + 11: {cat: 0x27, setID: 0x6}, + 12: {cat: 0x32, setID: 0x2}, + 13: {cat: 0x22, setID: 0x1}, + 14: {cat: 0x27, setID: 0x1}, + 15: {cat: 0x62, setID: 0x3}, + 16: {cat: 0x22, setID: 0x1}, + 17: {cat: 0x7, setID: 0x4}, + 18: {cat: 0x92, setID: 0x3}, + 19: {cat: 0xf, setID: 0x7}, + 20: {cat: 0x1f, setID: 0x8}, + 21: {cat: 0x82, setID: 0x3}, + 22: {cat: 0x92, setID: 0x3}, + 23: {cat: 0xf, setID: 0x7}, + 24: {cat: 0x62, setID: 0x3}, + 25: {cat: 0x4a, setID: 0x7}, + 26: {cat: 0x7, setID: 0x9}, + 27: {cat: 0x62, setID: 0x3}, + 28: {cat: 0x1f, setID: 0xa}, + 29: {cat: 0x62, setID: 0x3}, + 30: {cat: 0x5f, setID: 0xa}, + 31: {cat: 0x72, setID: 0x3}, + 32: {cat: 0x29, setID: 0xb}, + 33: {cat: 0x29, setID: 0xc}, + 34: {cat: 0x4f, setID: 0xc}, + 35: {cat: 0x61, setID: 0x2}, + 36: {cat: 0x2f, setID: 0x7}, + 37: {cat: 0x3a, setID: 0x8}, + 38: {cat: 0x4f, setID: 0x7}, + 39: {cat: 0x5f, setID: 0x8}, + 40: {cat: 0x62, setID: 0x2}, + 41: {cat: 0x4f, setID: 0x7}, + 42: {cat: 0x72, setID: 0x2}, + 43: {cat: 0x21, setID: 0x3}, + 44: {cat: 0x7, setID: 0x4}, + 45: {cat: 0x32, setID: 0x3}, + 46: {cat: 0x21, setID: 0x3}, + 47: {cat: 0x22, setID: 0x1}, + 48: {cat: 0x22, setID: 0x1}, + 49: {cat: 0x23, setID: 0x2}, + 50: {cat: 0x2, setID: 0x3}, + 51: {cat: 0x22, setID: 0x1}, + 52: {cat: 0x24, setID: 0xd}, + 53: {cat: 0x7, setID: 0x1}, + 54: {cat: 0x62, setID: 0x3}, + 55: {cat: 0x74, setID: 0x3}, + 56: {cat: 0x24, setID: 0x3}, + 57: {cat: 0x2f, setID: 0xe}, + 58: {cat: 0x34, setID: 0x1}, + 59: {cat: 0xf, setID: 0x7}, + 60: {cat: 0x1f, setID: 0x8}, + 61: {cat: 0x62, setID: 0x3}, + 62: {cat: 0x4f, setID: 0x7}, + 63: {cat: 0x5a, setID: 0x8}, + 64: {cat: 0xf, setID: 0xf}, + 65: {cat: 0x1f, setID: 0x10}, + 66: {cat: 0x64, setID: 0x3}, + 67: {cat: 0x4f, setID: 0xf}, + 68: {cat: 0x5c, setID: 0x10}, + 69: {cat: 0x22, setID: 0x11}, + 70: {cat: 0x23, setID: 0x12}, + 71: {cat: 0x24, setID: 0x13}, + 72: {cat: 0xf, setID: 0x1}, + 73: {cat: 0x62, setID: 0x3}, + 74: {cat: 0xf, setID: 0x2}, + 75: {cat: 0x63, setID: 0x3}, + 76: {cat: 0xf, setID: 0x14}, + 77: {cat: 0x64, setID: 0x3}, + 78: {cat: 0x74, setID: 0x3}, + 79: {cat: 0xf, setID: 0x1}, + 80: {cat: 0x62, setID: 0x3}, + 81: {cat: 0x4a, setID: 0x1}, + 82: {cat: 0xf, setID: 0x2}, + 83: {cat: 0x63, setID: 0x3}, + 84: {cat: 0x4b, setID: 0x2}, + 85: {cat: 0xf, setID: 0x14}, + 86: {cat: 0x64, setID: 0x3}, + 87: {cat: 0x4c, setID: 0x14}, + 88: {cat: 0x7, setID: 0x1}, + 89: {cat: 0x62, setID: 0x3}, + 90: {cat: 0x7, setID: 0x2}, + 91: {cat: 0x63, setID: 0x3}, + 92: {cat: 0x2f, setID: 0xb}, + 93: {cat: 0x37, setID: 0x15}, + 94: {cat: 0x65, setID: 0x3}, + 95: {cat: 0x7, setID: 0x1}, + 96: {cat: 0x62, setID: 0x3}, + 97: {cat: 0x7, setID: 0x16}, + 98: {cat: 0x64, setID: 0x3}, + 99: {cat: 0x75, setID: 0x3}, + 100: {cat: 0x7, setID: 0x1}, + 101: {cat: 0x62, setID: 0x3}, + 102: {cat: 0xf, setID: 0xf}, + 103: {cat: 0x1f, setID: 0x10}, + 104: {cat: 0x64, setID: 0x3}, + 105: {cat: 0xf, setID: 0x17}, + 106: {cat: 0x17, setID: 0x1}, + 107: {cat: 0x65, setID: 0x3}, + 108: {cat: 0xf, setID: 0x18}, + 109: {cat: 0x65, setID: 0x3}, + 110: {cat: 0xf, setID: 0x10}, + 111: {cat: 0x65, setID: 0x3}, + 112: {cat: 0x2f, setID: 0x7}, + 113: {cat: 0x3a, setID: 0x8}, + 114: {cat: 0x2f, setID: 0xf}, + 115: {cat: 0x3c, setID: 0x10}, + 116: {cat: 0x2d, setID: 0xb}, + 117: {cat: 0x2d, setID: 0x18}, + 118: {cat: 0x2d, setID: 0x19}, + 119: {cat: 0x2f, setID: 0x7}, + 120: {cat: 0x3a, setID: 0xc}, + 121: {cat: 0x2f, setID: 0x1a}, + 122: {cat: 0x3c, setID: 0xc}, + 123: {cat: 0x55, setID: 0x3}, + 124: {cat: 0x22, setID: 0x1}, + 125: {cat: 0x24, setID: 0x3}, + 126: {cat: 0x2c, setID: 0xd}, + 127: {cat: 0x2d, setID: 0xc}, + 128: {cat: 0xf, setID: 0x7}, + 129: {cat: 0x1f, setID: 0x8}, + 130: {cat: 0x62, setID: 0x3}, + 131: {cat: 0xf, setID: 0xf}, + 132: {cat: 0x1f, setID: 0x10}, + 133: {cat: 0x64, setID: 0x3}, + 134: {cat: 0xf, setID: 0xb}, + 135: {cat: 0x65, setID: 0x3}, + 136: {cat: 0xf, setID: 0x18}, + 137: {cat: 0x65, setID: 0x3}, + 138: {cat: 0xf, setID: 0x19}, + 139: {cat: 0x65, setID: 0x3}, + 140: {cat: 0x2f, setID: 0x7}, + 141: {cat: 0x3a, setID: 0x1b}, + 142: {cat: 0x2f, setID: 0x1c}, + 143: {cat: 0x3b, setID: 0x1d}, + 144: {cat: 0x2f, setID: 0x1e}, + 145: {cat: 0x3c, setID: 0x1f}, + 146: {cat: 0x37, setID: 0x3}, + 147: {cat: 0xa5, setID: 0x0}, + 148: {cat: 0x22, setID: 0x1}, + 149: {cat: 0x23, setID: 0x2}, + 150: {cat: 0x24, setID: 0x20}, + 151: {cat: 0x25, setID: 0x21}, + 152: {cat: 0xf, setID: 0x7}, + 153: {cat: 0x62, setID: 0x3}, + 154: {cat: 0xf, setID: 0x1c}, + 155: {cat: 0x63, setID: 0x3}, + 156: {cat: 0xf, setID: 0x22}, + 157: {cat: 0x64, setID: 0x3}, + 158: {cat: 0x75, setID: 0x3}, + 159: {cat: 0x21, setID: 0x3}, + 160: {cat: 0x22, setID: 0x1}, + 161: {cat: 0x23, setID: 0x2}, + 162: {cat: 0x2c, setID: 0x23}, + 163: {cat: 0x2d, setID: 0x5}, + 164: {cat: 0x21, setID: 0x3}, + 165: {cat: 0x22, setID: 0x1}, + 166: {cat: 0x23, setID: 0x2}, + 167: {cat: 0x24, setID: 0x24}, + 168: {cat: 0x25, setID: 0x25}, +} // Size: 362 bytes + +var cardinalIndex = []uint8{ // 37 elements + 0x00, 0x00, 0x02, 0x03, 0x05, 0x08, 0x09, 0x0b, + 0x0d, 0x0e, 0x10, 0x13, 0x17, 0x1a, 0x20, 0x2b, + 0x2e, 0x30, 0x32, 0x35, 0x3b, 0x45, 0x48, 0x4f, + 0x58, 0x5f, 0x64, 0x70, 0x77, 0x7c, 0x80, 0x8c, + 0x94, 0x98, 0x9f, 0xa4, 0xa9, +} // Size: 61 bytes + +var cardinalLangToIndex = []uint8{ // 742 elements + // Entry 0 - 3F + 0x00, 0x03, 0x03, 0x08, 0x08, 0x08, 0x00, 0x00, + 0x05, 0x05, 0x01, 0x01, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x01, 0x01, 0x08, 0x08, 0x03, 0x03, 0x08, + 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x1b, 0x1b, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x05, 0x00, + // Entry 40 - 7F + 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x1f, + 0x1f, 0x08, 0x08, 0x14, 0x00, 0x00, 0x14, 0x14, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x19, 0x19, + 0x00, 0x00, 0x23, 0x23, 0x0a, 0x0a, 0x0a, 0x00, + 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x00, 0x00, 0x17, 0x17, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, + // Entry 80 - BF + 0x08, 0x08, 0x08, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + // Entry C0 - FF + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + // Entry 100 - 13F + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x03, 0x03, 0x08, 0x08, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x03, 0x03, 0x0d, 0x0d, 0x08, 0x08, 0x08, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + // Entry 140 - 17F + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x08, 0x08, + 0x03, 0x03, 0x20, 0x20, 0x15, 0x15, 0x03, 0x03, + 0x08, 0x08, 0x08, 0x08, 0x01, 0x01, 0x05, 0x00, + 0x00, 0x21, 0x21, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x18, 0x18, 0x01, 0x01, 0x14, 0x14, 0x14, + 0x17, 0x17, 0x08, 0x08, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0b, 0x0b, 0x03, 0x03, + // Entry 180 - 1BF + 0x03, 0x03, 0x11, 0x00, 0x00, 0x00, 0x08, 0x08, + 0x08, 0x08, 0x00, 0x08, 0x08, 0x02, 0x02, 0x08, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, + 0x00, 0x00, 0x10, 0x10, 0x08, 0x11, 0x11, 0x08, + 0x08, 0x0f, 0x0f, 0x08, 0x08, 0x08, 0x08, 0x00, + // Entry 1C0 - 1FF + 0x00, 0x05, 0x05, 0x05, 0x05, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x0e, 0x08, 0x08, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x00, 0x00, + 0x08, 0x08, 0x0c, 0x0c, 0x08, 0x08, 0x08, 0x08, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x1d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, + 0x11, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + // Entry 200 - 23F + 0x08, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x00, 0x08, 0x05, 0x00, 0x00, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x05, 0x00, 0x00, 0x05, 0x05, 0x08, 0x1a, 0x1a, + 0x0e, 0x0e, 0x08, 0x08, 0x07, 0x09, 0x07, 0x09, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x13, 0x13, + // Entry 240 - 27F + 0x13, 0x08, 0x08, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, + 0x08, 0x08, 0x00, 0x00, 0x08, 0x11, 0x11, 0x11, + 0x11, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x12, + 0x00, 0x00, 0x12, 0x12, 0x04, 0x04, 0x19, 0x19, + 0x16, 0x16, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x14, 0x14, 0x14, 0x14, 0x14, + // Entry 280 - 2BF + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x08, 0x08, + 0x08, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x05, + 0x05, 0x05, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, + 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x06, 0x06, + 0x08, 0x08, 0x1e, 0x1e, 0x03, 0x03, 0x03, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, + // Entry 2C0 - 2FF + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x08, + 0x08, 0x08, 0x05, 0x08, 0x08, 0x00, 0x08, 0x08, + 0x08, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, +} // Size: 766 bytes + +var cardinalInclusionMasks = []uint64{ // 100 elements + // Entry 0 - 1F + 0x0000000400a00859, 0x0000000000a242d3, 0x000000001464e245, 0x000000194478e201, + 0x000000094478e401, 0x0000000905286001, 0x0000002905286401, 0x0000000a05286001, + 0x0000000a05286001, 0x0000000a45286401, 0x0000000a80a86801, 0x000000008a8251a1, + 0x00000000b605d021, 0x00000000c609d021, 0x00000000c609d421, 0x0000000085085021, + 0x0000000085085421, 0x0000000085085021, 0x0000000085085021, 0x00000000c5085421, + 0x0000000400800821, 0x00000000008000a1, 0x0000000014008021, 0x0000000044008021, + 0x0000000044008421, 0x0000000005000021, 0x0000000005000421, 0x0000000005000021, + 0x0000000005000021, 0x0000000045000421, 0x0000000000800821, 0x00000000008000a1, + // Entry 20 - 3F + 0x0000000014008021, 0x0000000044008021, 0x0000000044008421, 0x0000000005000021, + 0x0000000005000421, 0x0000000005000021, 0x0000000005000021, 0x0000000045000421, + 0x0000000400800821, 0x00000000008000a1, 0x0000000014008021, 0x0000000044008021, + 0x0000000044008421, 0x0000000005000021, 0x0000000005000421, 0x0000000005000021, + 0x0000000005000021, 0x0000000045000421, 0x0000000000800821, 0x00000000008000a1, + 0x0000000014008021, 0x0000000044008021, 0x0000000044008421, 0x0000000005000021, + 0x0000000005000421, 0x0000000005000021, 0x0000000005000021, 0x0000000045000421, + 0x0000000400800821, 0x00000000008000a1, 0x0000000014008021, 0x0000000044008021, + // Entry 40 - 5F + 0x0000000044008421, 0x0000000005000021, 0x0000000005000421, 0x0000000005000021, + 0x0000000005000021, 0x0000000045000421, 0x0000000080800821, 0x00000000888000a1, + 0x00000000b4008021, 0x00000000c4008021, 0x00000000c4008421, 0x0000000085000021, + 0x0000000085000421, 0x0000000085000021, 0x0000000085000021, 0x00000000c5000421, + 0x0000000400800821, 0x00000000008000a1, 0x0000000014008021, 0x0000000044008021, + 0x0000000044008421, 0x0000000005000021, 0x0000000005000421, 0x0000000005000021, + 0x0000000005000021, 0x0000000045000421, 0x0000000080800821, 0x00000000888000a1, + 0x00000000b4008021, 0x00000000c4008021, 0x00000000c4008421, 0x0000000085000021, + // Entry 60 - 7F + 0x0000000085000421, 0x0000000085000021, 0x0000000085000021, 0x00000000c5000421, +} // Size: 824 bytes + +// Slots used for cardinal: A9 of 0xFF rules; 25 of 0xFF indexes; 38 of 64 sets + +// Total table size 8382 bytes (8KiB); checksum: 40D079A4 diff --git a/vendor/golang.org/x/text/internal/number/tables_test.go b/vendor/golang.org/x/text/internal/number/tables_test.go new file mode 100644 index 0000000000..054e23d264 --- /dev/null +++ b/vendor/golang.org/x/text/internal/number/tables_test.go @@ -0,0 +1,125 @@ +// Copyright 2016 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 number + +import ( + "flag" + "log" + "reflect" + "testing" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/testtext" + "golang.org/x/text/language" + "golang.org/x/text/unicode/cldr" +) + +var draft = flag.String("draft", + "contributed", + `Minimal draft requirements (approved, contributed, provisional, unconfirmed).`) + +func TestNumberSystems(t *testing.T) { + testtext.SkipIfNotLong(t) + + r := gen.OpenCLDRCoreZip() + defer r.Close() + + d := &cldr.Decoder{} + d.SetDirFilter("supplemental") + d.SetSectionFilter("numberingSystem") + data, err := d.DecodeZip(r) + if err != nil { + t.Fatalf("DecodeZip: %v", err) + } + + for _, ns := range data.Supplemental().NumberingSystems.NumberingSystem { + n := systemMap[ns.Id] + if int(n) >= len(numSysData) { + continue + } + info := InfoFromLangID(0, ns.Id) + val := '0' + for _, rWant := range ns.Digits { + if rGot := info.Digit(val); rGot != rWant { + t.Errorf("%s:%d: got %U; want %U", ns.Id, val, rGot, rWant) + } + val++ + } + } +} + +func TestSymbols(t *testing.T) { + testtext.SkipIfNotLong(t) + + draft, err := cldr.ParseDraft(*draft) + if err != nil { + log.Fatalf("invalid draft level: %v", err) + } + + r := gen.OpenCLDRCoreZip() + defer r.Close() + + d := &cldr.Decoder{} + d.SetDirFilter("main") + d.SetSectionFilter("numbers") + data, err := d.DecodeZip(r) + if err != nil { + t.Fatalf("DecodeZip: %v", err) + } + + for _, lang := range data.Locales() { + ldml := data.RawLDML(lang) + if ldml.Numbers == nil { + continue + } + langIndex, ok := language.CompactIndex(language.MustParse(lang)) + if !ok { + t.Fatalf("No compact index for language %s", lang) + } + + syms := cldr.MakeSlice(&ldml.Numbers.Symbols) + syms.SelectDraft(draft) + + for _, sym := range ldml.Numbers.Symbols { + if sym.NumberSystem == "" { + continue + } + testCases := []struct { + name string + st SymbolType + x interface{} + }{ + {"Decimal", SymDecimal, sym.Decimal}, + {"Group", SymGroup, sym.Group}, + {"List", SymList, sym.List}, + {"PercentSign", SymPercentSign, sym.PercentSign}, + {"PlusSign", SymPlusSign, sym.PlusSign}, + {"MinusSign", SymMinusSign, sym.MinusSign}, + {"Exponential", SymExponential, sym.Exponential}, + {"SuperscriptingExponent", SymSuperscriptingExponent, sym.SuperscriptingExponent}, + {"PerMille", SymPerMille, sym.PerMille}, + {"Infinity", SymInfinity, sym.Infinity}, + {"NaN", SymNan, sym.Nan}, + {"TimeSeparator", SymTimeSeparator, sym.TimeSeparator}, + } + info := InfoFromLangID(langIndex, sym.NumberSystem) + for _, tc := range testCases { + // Extract the wanted value. + v := reflect.ValueOf(tc.x) + if v.Len() == 0 { + return + } + if v.Len() > 1 { + t.Fatalf("Multiple values of %q within single symbol not supported.", tc.name) + } + want := v.Index(0).MethodByName("Data").Call(nil)[0].String() + got := info.Symbol(tc.st) + if got != want { + t.Errorf("%s:%s:%s: got %q; want %q", lang, sym.NumberSystem, tc.name, got, want) + } + } + } + } +} diff --git a/vendor/golang.org/x/text/internal/stringset/set.go b/vendor/golang.org/x/text/internal/stringset/set.go new file mode 100644 index 0000000000..bb2fffbc75 --- /dev/null +++ b/vendor/golang.org/x/text/internal/stringset/set.go @@ -0,0 +1,86 @@ +// Copyright 2016 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 stringset provides a way to represent a collection of strings +// compactly. +package stringset + +import "sort" + +// A Set holds a collection of strings that can be looked up by an index number. +type Set struct { + // These fields are exported to allow for code generation. + + Data string + Index []uint16 +} + +// Elem returns the string with index i. It panics if i is out of range. +func (s *Set) Elem(i int) string { + return s.Data[s.Index[i]:s.Index[i+1]] +} + +// Len returns the number of strings in the set. +func (s *Set) Len() int { + return len(s.Index) - 1 +} + +// Search returns the index of the given string or -1 if it is not in the set. +// The Set must have been created with strings in sorted order. +func Search(s *Set, str string) int { + // TODO: optimize this if it gets used a lot. + n := len(s.Index) - 1 + p := sort.Search(n, func(i int) bool { + return s.Elem(i) >= str + }) + if p == n || str != s.Elem(p) { + return -1 + } + return p +} + +// A Builder constructs Sets. +type Builder struct { + set Set + index map[string]int +} + +// NewBuilder returns a new and initialized Builder. +func NewBuilder() *Builder { + return &Builder{ + set: Set{ + Index: []uint16{0}, + }, + index: map[string]int{}, + } +} + +// Set creates the set created so far. +func (b *Builder) Set() Set { + return b.set +} + +// Index returns the index for the given string, which must have been added +// before. +func (b *Builder) Index(s string) int { + return b.index[s] +} + +// Add adds a string to the index. Strings that are added by a single Add will +// be stored together, unless they match an existing string. +func (b *Builder) Add(ss ...string) { + // First check if the string already exists. + for _, s := range ss { + if _, ok := b.index[s]; ok { + continue + } + b.index[s] = len(b.set.Index) - 1 + b.set.Data += s + x := len(b.set.Data) + if x > 0xFFFF { + panic("Index too > 0xFFFF") + } + b.set.Index = append(b.set.Index, uint16(x)) + } +} diff --git a/vendor/golang.org/x/text/internal/stringset/set_test.go b/vendor/golang.org/x/text/internal/stringset/set_test.go new file mode 100644 index 0000000000..97b9e58be3 --- /dev/null +++ b/vendor/golang.org/x/text/internal/stringset/set_test.go @@ -0,0 +1,53 @@ +// Copyright 2016 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 stringset + +import "testing" + +func TestStringSet(t *testing.T) { + testCases := [][]string{ + {""}, + {"∫"}, + {"a", "b", "c"}, + {"", "a", "bb", "ccc"}, + {" ", "aaa", "bb", "c"}, + } + test := func(tc int, b *Builder) { + set := b.Set() + if set.Len() != len(testCases[tc]) { + t.Errorf("%d:Len() = %d; want %d", tc, set.Len(), len(testCases[tc])) + } + for i, s := range testCases[tc] { + if x := b.Index(s); x != i { + t.Errorf("%d:Index(%q) = %d; want %d", tc, s, x, i) + } + if p := Search(&set, s); p != i { + t.Errorf("%d:Search(%q) = %d; want %d", tc, s, p, i) + } + if set.Elem(i) != s { + t.Errorf("%d:Elem(%d) = %s; want %s", tc, i, set.Elem(i), s) + } + } + if p := Search(&set, "apple"); p != -1 { + t.Errorf(`%d:Search("apple") = %d; want -1`, tc, p) + } + } + for i, tc := range testCases { + b := NewBuilder() + for _, s := range tc { + b.Add(s) + } + b.Add(tc...) + test(i, b) + } + for i, tc := range testCases { + b := NewBuilder() + b.Add(tc...) + for _, s := range tc { + b.Add(s) + } + test(i, b) + } +} diff --git a/vendor/golang.org/x/text/internal/tables.go b/vendor/golang.org/x/text/internal/tables.go new file mode 100644 index 0000000000..02504b6576 --- /dev/null +++ b/vendor/golang.org/x/text/internal/tables.go @@ -0,0 +1,115 @@ +// This file was generated by go generate; DO NOT EDIT + +package internal + +// Parent maps a compact index of a tag to the compact index of the parent of +// this tag. +var Parent = []uint16{ // 742 elements + // Entry 0 - 3F + 0x0000, 0x0052, 0x00e3, 0x0000, 0x0003, 0x0003, 0x0000, 0x0006, + 0x0000, 0x0008, 0x0000, 0x000a, 0x0000, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x0000, 0x0029, 0x0000, 0x002b, 0x0000, 0x002d, 0x0000, + 0x0000, 0x0030, 0x002f, 0x002f, 0x0000, 0x0034, 0x0000, 0x0036, + 0x0000, 0x0038, 0x0000, 0x003a, 0x0000, 0x003c, 0x0000, 0x0000, + // Entry 40 - 7F + 0x003f, 0x0000, 0x0041, 0x0041, 0x0000, 0x0044, 0x0044, 0x0000, + 0x0047, 0x0000, 0x0049, 0x0000, 0x0000, 0x004c, 0x004b, 0x004b, + 0x0000, 0x0050, 0x0050, 0x0050, 0x0050, 0x0000, 0x0055, 0x0000, + 0x0057, 0x0000, 0x0059, 0x0000, 0x005b, 0x005b, 0x0000, 0x005e, + 0x0000, 0x0060, 0x0000, 0x0062, 0x0000, 0x0064, 0x0064, 0x0000, + 0x0067, 0x0000, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, + 0x0000, 0x0070, 0x0000, 0x0072, 0x0000, 0x0074, 0x0000, 0x0000, + 0x0077, 0x0000, 0x0079, 0x0000, 0x007b, 0x0000, 0x007d, 0x007d, + // Entry 80 - BF + 0x0000, 0x0080, 0x0080, 0x0000, 0x0083, 0x0084, 0x0084, 0x0084, + 0x0083, 0x0085, 0x0084, 0x0084, 0x0084, 0x0083, 0x0084, 0x0084, + 0x0084, 0x0084, 0x0084, 0x0084, 0x0085, 0x0084, 0x0084, 0x0084, + 0x0084, 0x0085, 0x0084, 0x0085, 0x0084, 0x0084, 0x0085, 0x0084, + 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, + 0x0083, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, + 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, + 0x0084, 0x0084, 0x0083, 0x0084, 0x0083, 0x0084, 0x0084, 0x0084, + // Entry C0 - FF + 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0085, 0x0084, 0x0084, + 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0083, 0x0084, 0x0084, + 0x0084, 0x0084, 0x0084, 0x0085, 0x0084, 0x0084, 0x0085, 0x0084, + 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, + 0x0084, 0x0084, 0x0083, 0x0083, 0x0084, 0x0084, 0x0083, 0x0084, + 0x0084, 0x0084, 0x0084, 0x0084, 0x0000, 0x00ec, 0x0000, 0x00ee, + 0x00ee, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, + 0x00ee, 0x00f0, 0x00ee, 0x00ee, 0x00f0, 0x00f0, 0x00ee, 0x00f0, + // Entry 100 - 13F + 0x00f0, 0x00f0, 0x00f0, 0x00ee, 0x00f0, 0x00f0, 0x00f0, 0x00f0, + 0x00f0, 0x00f0, 0x0000, 0x010a, 0x0000, 0x010c, 0x0000, 0x010e, + 0x0000, 0x0110, 0x0110, 0x0000, 0x0113, 0x0113, 0x0113, 0x0113, + 0x0000, 0x0118, 0x0000, 0x011a, 0x0000, 0x011c, 0x011c, 0x0000, + 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, + 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, + 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, + 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, + // Entry 140 - 17F + 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, + 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x0000, 0x014e, + 0x0000, 0x0150, 0x0000, 0x0152, 0x0000, 0x0154, 0x0000, 0x0156, + 0x0000, 0x0158, 0x0158, 0x0158, 0x0000, 0x015c, 0x0000, 0x0000, + 0x015f, 0x0000, 0x0161, 0x0000, 0x0163, 0x0163, 0x0163, 0x0000, + 0x0167, 0x0000, 0x0169, 0x0000, 0x016b, 0x0000, 0x016d, 0x016d, + 0x0000, 0x0170, 0x0000, 0x0172, 0x0000, 0x0174, 0x0000, 0x0176, + 0x0000, 0x0178, 0x0000, 0x017a, 0x0000, 0x017c, 0x0000, 0x017e, + // Entry 180 - 1BF + 0x017e, 0x017e, 0x0000, 0x0000, 0x0183, 0x0000, 0x0000, 0x0186, + 0x0000, 0x0188, 0x0000, 0x0000, 0x018b, 0x0000, 0x018d, 0x0000, + 0x0000, 0x0190, 0x0000, 0x0000, 0x0193, 0x0000, 0x0195, 0x0000, + 0x0197, 0x0000, 0x0199, 0x0000, 0x019b, 0x0000, 0x019d, 0x0000, + 0x019f, 0x0000, 0x01a1, 0x0000, 0x01a3, 0x0000, 0x01a5, 0x0000, + 0x01a7, 0x01a7, 0x0000, 0x01aa, 0x0000, 0x01ac, 0x0000, 0x01ae, + 0x0000, 0x01b0, 0x0000, 0x01b2, 0x0000, 0x0000, 0x01b5, 0x0000, + 0x01b7, 0x0000, 0x01b9, 0x0000, 0x01bb, 0x0000, 0x01bd, 0x0000, + // Entry 1C0 - 1FF + 0x01bf, 0x0000, 0x01c1, 0x01c1, 0x01c1, 0x01c1, 0x0000, 0x01c6, + 0x0000, 0x01c8, 0x01c8, 0x0000, 0x01cb, 0x0000, 0x01cd, 0x0000, + 0x01cf, 0x0000, 0x01d1, 0x0000, 0x01d3, 0x0000, 0x01d5, 0x01d5, + 0x0000, 0x01d8, 0x0000, 0x01da, 0x0000, 0x01dc, 0x0000, 0x01de, + 0x0000, 0x01e0, 0x0000, 0x01e2, 0x0000, 0x01e4, 0x0000, 0x01e6, + 0x0000, 0x01e8, 0x0000, 0x01ea, 0x01ea, 0x01ea, 0x0000, 0x01ee, + 0x0000, 0x01f0, 0x0000, 0x01f2, 0x0000, 0x01f4, 0x0000, 0x0000, + 0x01f7, 0x0000, 0x01f9, 0x01f9, 0x0000, 0x01fc, 0x0000, 0x01fe, + // Entry 200 - 23F + 0x01fe, 0x0000, 0x0201, 0x0201, 0x0201, 0x0201, 0x0201, 0x0201, + 0x0201, 0x0000, 0x0209, 0x0000, 0x020b, 0x0000, 0x020d, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0213, 0x0000, 0x0000, 0x0216, + 0x0000, 0x0218, 0x0218, 0x0000, 0x021b, 0x0000, 0x021d, 0x021d, + 0x0000, 0x0000, 0x0221, 0x0220, 0x0220, 0x0000, 0x0000, 0x0226, + 0x0000, 0x0228, 0x0000, 0x022a, 0x0000, 0x0233, 0x022c, 0x0233, + 0x0233, 0x0233, 0x0233, 0x022c, 0x0233, 0x0233, 0x0000, 0x0236, + 0x0236, 0x0236, 0x0000, 0x023a, 0x0000, 0x023c, 0x0000, 0x023e, + // Entry 240 - 27F + 0x023e, 0x0000, 0x0241, 0x0000, 0x0243, 0x0243, 0x0243, 0x0243, + 0x0243, 0x0243, 0x0000, 0x024a, 0x0000, 0x024c, 0x0000, 0x024e, + 0x0000, 0x0250, 0x0000, 0x0252, 0x0000, 0x0000, 0x0255, 0x0255, + 0x0255, 0x0000, 0x0259, 0x0000, 0x025b, 0x0000, 0x025d, 0x0000, + 0x0000, 0x0260, 0x025f, 0x025f, 0x0000, 0x0264, 0x0000, 0x0266, + 0x0000, 0x0268, 0x0000, 0x0000, 0x0000, 0x0000, 0x026d, 0x0000, + 0x0000, 0x0270, 0x0000, 0x0272, 0x0272, 0x0272, 0x0272, 0x0000, + 0x0277, 0x0277, 0x0277, 0x0000, 0x027b, 0x027b, 0x027b, 0x027b, + // Entry 280 - 2BF + 0x027b, 0x0000, 0x0281, 0x0281, 0x0281, 0x0281, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0289, 0x0289, 0x0289, 0x0000, 0x028d, 0x028d, + 0x028d, 0x028d, 0x0000, 0x0000, 0x0293, 0x0293, 0x0293, 0x0293, + 0x0000, 0x0298, 0x0000, 0x029a, 0x029a, 0x0000, 0x029d, 0x0000, + 0x029f, 0x029f, 0x0000, 0x0000, 0x02a3, 0x0000, 0x0000, 0x02a6, + 0x0000, 0x02a8, 0x02a8, 0x0000, 0x0000, 0x02ac, 0x0000, 0x02ae, + 0x0000, 0x02b0, 0x0000, 0x02b2, 0x0000, 0x02b4, 0x02b4, 0x0000, + 0x0000, 0x02b8, 0x0000, 0x02ba, 0x02b7, 0x02b7, 0x0000, 0x0000, + // Entry 2C0 - 2FF + 0x02bf, 0x02be, 0x02be, 0x0000, 0x0000, 0x02c4, 0x0000, 0x02c6, + 0x0000, 0x02c8, 0x0000, 0x0000, 0x02cb, 0x0000, 0x0000, 0x0000, + 0x02cf, 0x0000, 0x02d1, 0x0000, 0x02d3, 0x0000, 0x02d5, 0x02d5, + 0x0000, 0x02d8, 0x0000, 0x02da, 0x02da, 0x02da, 0x02da, 0x02da, + 0x0000, 0x02e0, 0x02e1, 0x02e0, 0x0000, 0x02e4, +} // Size: 1508 bytes + +// Total table size 1508 bytes (1KiB); checksum: BABB1D86 diff --git a/vendor/golang.org/x/text/internal/tag/tag.go b/vendor/golang.org/x/text/internal/tag/tag.go new file mode 100644 index 0000000000..b5d348891d --- /dev/null +++ b/vendor/golang.org/x/text/internal/tag/tag.go @@ -0,0 +1,100 @@ +// 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 tag contains functionality handling tags and related data. +package tag // import "golang.org/x/text/internal/tag" + +import "sort" + +// An Index converts tags to a compact numeric value. +// +// All elements are of size 4. Tags may be up to 4 bytes long. Excess bytes can +// be used to store additional information about the tag. +type Index string + +// Elem returns the element data at the given index. +func (s Index) Elem(x int) string { + return string(s[x*4 : x*4+4]) +} + +// Index reports the index of the given key or -1 if it could not be found. +// Only the first len(key) bytes from the start of the 4-byte entries will be +// considered for the search and the first match in Index will be returned. +func (s Index) Index(key []byte) int { + n := len(key) + // search the index of the first entry with an equal or higher value than + // key in s. + index := sort.Search(len(s)/4, func(i int) bool { + return cmp(s[i*4:i*4+n], key) != -1 + }) + i := index * 4 + if cmp(s[i:i+len(key)], key) != 0 { + return -1 + } + return index +} + +// Next finds the next occurrence of key after index x, which must have been +// obtained from a call to Index using the same key. It returns x+1 or -1. +func (s Index) Next(key []byte, x int) int { + if x++; x*4 < len(s) && cmp(s[x*4:x*4+len(key)], key) == 0 { + return x + } + return -1 +} + +// cmp returns an integer comparing a and b lexicographically. +func cmp(a Index, b []byte) int { + n := len(a) + if len(b) < n { + n = len(b) + } + for i, c := range b[:n] { + switch { + case a[i] > c: + return 1 + case a[i] < c: + return -1 + } + } + switch { + case len(a) < len(b): + return -1 + case len(a) > len(b): + return 1 + } + return 0 +} + +// Compare returns an integer comparing a and b lexicographically. +func Compare(a string, b []byte) int { + return cmp(Index(a), b) +} + +// FixCase reformats b to the same pattern of cases as form. +// If returns false if string b is malformed. +func FixCase(form string, b []byte) bool { + if len(form) != len(b) { + return false + } + for i, c := range b { + if form[i] <= 'Z' { + if c >= 'a' { + c -= 'z' - 'Z' + } + if c < 'A' || 'Z' < c { + return false + } + } else { + if c <= 'Z' { + c += 'z' - 'Z' + } + if c < 'a' || 'z' < c { + return false + } + } + b[i] = c + } + return true +} diff --git a/vendor/golang.org/x/text/internal/tag/tag_test.go b/vendor/golang.org/x/text/internal/tag/tag_test.go new file mode 100644 index 0000000000..da174a24c4 --- /dev/null +++ b/vendor/golang.org/x/text/internal/tag/tag_test.go @@ -0,0 +1,67 @@ +// 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 tag + +import ( + "strings" + "testing" +) + +var strdata = []string{ + "aa ", + "aaa ", + "aaaa", + "aaab", + "aab ", + "ab ", + "ba ", + "xxxx", + "\xff\xff\xff\xff", +} + +var testCases = map[string]int{ + "a": 0, + "aa": 0, + "aaa": 1, + "aa ": 0, + "aaaa": 2, + "aaab": 3, + "b": 6, + "ba": 6, + " ": -1, + "aaax": -1, + "bbbb": -1, + "zzzz": -1, +} + +func TestIndex(t *testing.T) { + index := Index(strings.Join(strdata, "")) + for k, v := range testCases { + if i := index.Index([]byte(k)); i != v { + t.Errorf("%s: got %d; want %d", k, i, v) + } + } +} + +func TestFixCase(t *testing.T) { + tests := []string{ + "aaaa", "AbCD", "abcd", + "Zzzz", "AbCD", "Abcd", + "Zzzz", "AbC", "", + "XXX", "ab ", "", + "XXX", "usd", "USD", + "cmn", "AB ", "", + "gsw", "CMN", "cmn", + } + for tc := tests; len(tc) > 0; tc = tc[3:] { + b := []byte(tc[1]) + if !FixCase(tc[0], b) { + b = nil + } + if string(b) != tc[2] { + t.Errorf("FixCase(%q, %q) = %q; want %q", tc[0], tc[1], b, tc[2]) + } + } +} diff --git a/vendor/golang.org/x/text/internal/testtext/codesize.go b/vendor/golang.org/x/text/internal/testtext/codesize.go new file mode 100644 index 0000000000..5fc5eaec7d --- /dev/null +++ b/vendor/golang.org/x/text/internal/testtext/codesize.go @@ -0,0 +1,53 @@ +// 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 testtext + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "runtime" +) + +// CodeSize builds the given code sample and returns the binary size or en error +// if an error occurred. The code sample typically will look like this: +// package main +// import "golang.org/x/text/somepackage" +// func main() { +// somepackage.Func() // reference Func to cause it to be linked in. +// } +// See dict_test.go in the display package for an example. +func CodeSize(s string) (int, error) { + // Write the file. + tmpdir, err := ioutil.TempDir(os.TempDir(), "testtext") + if err != nil { + return 0, fmt.Errorf("testtext: failed to create tmpdir: %v", err) + } + defer os.RemoveAll(tmpdir) + filename := filepath.Join(tmpdir, "main.go") + if err := ioutil.WriteFile(filename, []byte(s), 0644); err != nil { + return 0, fmt.Errorf("testtext: failed to write main.go: %v", err) + } + + // Build the binary. + w := &bytes.Buffer{} + cmd := exec.Command(filepath.Join(runtime.GOROOT(), "bin", "go"), "build", "-o", "main") + cmd.Dir = tmpdir + cmd.Stderr = w + cmd.Stdout = w + if err := cmd.Run(); err != nil { + return 0, fmt.Errorf("testtext: failed to execute command: %v\nmain.go:\n%vErrors:%s", err, s, w) + } + + // Determine the size. + fi, err := os.Stat(filepath.Join(tmpdir, "main")) + if err != nil { + return 0, fmt.Errorf("testtext: failed to get file info: %v", err) + } + return int(fi.Size()), nil +} diff --git a/vendor/golang.org/x/text/internal/testtext/flag.go b/vendor/golang.org/x/text/internal/testtext/flag.go new file mode 100644 index 0000000000..1884f34dd0 --- /dev/null +++ b/vendor/golang.org/x/text/internal/testtext/flag.go @@ -0,0 +1,22 @@ +// 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 testtext + +import ( + "flag" + "testing" + + "golang.org/x/text/internal/gen" +) + +var long = flag.Bool("long", false, + "run tests that require fetching data online") + +// SkipIfNotLong returns whether long tests should be performed. +func SkipIfNotLong(t *testing.T) { + if !gen.IsLocal() && !*long { + t.Skip("skipping test to prevent downloading; to run use -long or use -local or UNICODE_DIR to specify a local source") + } +} diff --git a/vendor/golang.org/x/text/internal/testtext/text.go b/vendor/golang.org/x/text/internal/testtext/text.go new file mode 100644 index 0000000000..ce40d7e777 --- /dev/null +++ b/vendor/golang.org/x/text/internal/testtext/text.go @@ -0,0 +1,105 @@ +// 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 testtext contains test data that is of common use to the text +// repository. +package testtext // import "golang.org/x/text/internal/testtext" + +const ( + + // ASCII is an ASCII string containing all letters in the English alphabet. + ASCII = "The quick brown fox jumps over the lazy dog. " + + "The quick brown fox jumps over the lazy dog. " + + "The quick brown fox jumps over the lazy dog. " + + "The quick brown fox jumps over the lazy dog. " + + "The quick brown fox jumps over the lazy dog. " + + "The quick brown fox jumps over the lazy dog. " + + "The quick brown fox jumps over the lazy dog. " + + "The quick brown fox jumps over the lazy dog. " + + "The quick brown fox jumps over the lazy dog. " + + "The quick brown fox jumps over the lazy dog. " + + // Vietnamese is a snippet from http://creativecommons.org/licenses/by-sa/3.0/vn/ + Vietnamese = `Với các điều kiện sau: Ghi nhận công của tác giả. +Nếu bạn sử dụng, chuyển đổi, hoặc xây dựng dự án từ +nội dung được chia sẻ này, bạn phải áp dụng giấy phép này hoặc +một giấy phép khác có các điều khoản tương tự như giấy phép này +cho dự án của bạn. Hiểu rằng: Miễn — Bất kỳ các điều kiện nào +trên đây cũng có thể được miễn bỏ nếu bạn được sự cho phép của +người sở hữu bản quyền. Phạm vi công chúng — Khi tác phẩm hoặc +bất kỳ chương nào của tác phẩm đã trong vùng dành cho công +chúng theo quy định của pháp luật thì tình trạng của nó không +bị ảnh hưởng bởi giấy phép trong bất kỳ trường hợp nào.` + + // Russian is a snippet from http://creativecommons.org/licenses/by-sa/1.0/deed.ru + Russian = `При обязательном соблюдении следующих условий: +Attribution — Вы должны атрибутировать произведение (указывать +автора и источник) в порядке, предусмотренном автором или +лицензиаром (но только так, чтобы никоим образом не подразумевалось, +что они поддерживают вас или использование вами данного произведения). +Υπό τις ακόλουθες προϋποθέσεις:` + + // Greek is a snippet from http://creativecommons.org/licenses/by-sa/3.0/gr/ + Greek = `Αναφορά Δημιουργού — Θα πρέπει να κάνετε την αναφορά στο έργο με τον +τρόπο που έχει οριστεί από το δημιουργό ή το χορηγούντο την άδεια +(χωρίς όμως να εννοείται με οποιονδήποτε τρόπο ότι εγκρίνουν εσάς ή +τη χρήση του έργου από εσάς). Παρόμοια Διανομή — Εάν αλλοιώσετε, +τροποποιήσετε ή δημιουργήσετε περαιτέρω βασισμένοι στο έργο θα +μπορείτε να διανέμετε το έργο που θα προκύψει μόνο με την ίδια ή +παρόμοια άδεια.` + + // Arabic is a snippet from http://creativecommons.org/licenses/by-sa/3.0/deed.ar + Arabic = `بموجب الشروط التالية نسب المصنف — يجب عليك أن +تنسب العمل بالطريقة التي تحددها المؤلف أو المرخص (ولكن ليس بأي حال من +الأحوال أن توحي وتقترح بتحول أو استخدامك للعمل). +المشاركة على قدم المساواة — إذا كنت يعدل ، والتغيير ، أو الاستفادة +من هذا العمل ، قد ينتج عن توزيع العمل إلا في ظل تشابه او تطابق فى واحد +لهذا الترخيص.` + + // Hebrew is a snippet from http://creativecommons.org/licenses/by-sa/1.0/il/ + Hebrew = `בכפוף לתנאים הבאים: ייחוס — עליך לייחס את היצירה (לתת קרדיט) באופן +המצויין על-ידי היוצר או מעניק הרישיון (אך לא בשום אופן המרמז על כך +שהם תומכים בך או בשימוש שלך ביצירה). שיתוף זהה — אם תחליט/י לשנות, +לעבד או ליצור יצירה נגזרת בהסתמך על יצירה זו, תוכל/י להפיץ את יצירתך +החדשה רק תחת אותו הרישיון או רישיון דומה לרישיון זה.` + + TwoByteUTF8 = Russian + Greek + Arabic + Hebrew + + // Thai is a snippet from http://creativecommons.org/licenses/by-sa/3.0/th/ + Thai = `ภายใต้เงื่อนไข ดังต่อไปนี้ : แสดงที่มา — คุณต้องแสดงที่ +มาของงานดังกล่าว ตามรูปแบบที่ผู้สร้างสรรค์หรือผู้อนุญาตกำหนด (แต่ +ไม่ใช่ในลักษณะที่ว่า พวกเขาสนับสนุนคุณหรือสนับสนุนการที่ +คุณนำงานไปใช้) อนุญาตแบบเดียวกัน — หากคุณดัดแปลง เปลี่ยนรูป หรื +อต่อเติมงานนี้ คุณต้องใช้สัญญาอนุญาตแบบเดียวกันหรือแบบที่เหมื +อนกับสัญญาอนุญาตที่ใช้กับงานนี้เท่านั้น` + + ThreeByteUTF8 = Thai + + // Japanese is a snippet from http://creativecommons.org/licenses/by-sa/2.0/jp/ + Japanese = `あなたの従うべき条件は以下の通りです。 +表示 — あなたは原著作者のクレジットを表示しなければなりません。 +継承 — もしあなたがこの作品を改変、変形または加工した場合、 +あなたはその結果生じた作品をこの作品と同一の許諾条件の下でのみ +頒布することができます。` + + // Chinese is a snippet from http://creativecommons.org/licenses/by-sa/2.5/cn/ + Chinese = `您可以自由: 复制、发行、展览、表演、放映、 +广播或通过信息网络传播本作品 创作演绎作品 +对本作品进行商业性使用 惟须遵守下列条件: +署名 — 您必须按照作者或者许可人指定的方式对作品进行署名。 +相同方式共享 — 如果您改变、转换本作品或者以本作品为基础进行创作, +您只能采用与本协议相同的许可协议发布基于本作品的演绎作品。` + + // Korean is a snippet from http://creativecommons.org/licenses/by-sa/2.0/kr/ + Korean = `다음과 같은 조건을 따라야 합니다: 저작자표시 +— 저작자나 이용허락자가 정한 방법으로 저작물의 +원저작자를 표시하여야 합니다(그러나 원저작자가 이용자나 이용자의 +이용을 보증하거나 추천한다는 의미로 표시해서는 안됩니다). +동일조건변경허락 — 이 저작물을 이용하여 만든 이차적 저작물에는 본 +라이선스와 동일한 라이선스를 적용해야 합니다.` + + CJK = Chinese + Japanese + Korean + + All = ASCII + Vietnamese + TwoByteUTF8 + ThreeByteUTF8 + CJK +) diff --git a/vendor/golang.org/x/text/internal/triegen/compact.go b/vendor/golang.org/x/text/internal/triegen/compact.go new file mode 100644 index 0000000000..397b975c1b --- /dev/null +++ b/vendor/golang.org/x/text/internal/triegen/compact.go @@ -0,0 +1,58 @@ +// 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 triegen + +// This file defines Compacter and its implementations. + +import "io" + +// A Compacter generates an alternative, more space-efficient way to store a +// trie value block. A trie value block holds all possible values for the last +// byte of a UTF-8 encoded rune. Excluding ASCII characters, a trie value block +// always has 64 values, as a UTF-8 encoding ends with a byte in [0x80, 0xC0). +type Compacter interface { + // Size returns whether the Compacter could encode the given block as well + // as its size in case it can. len(v) is always 64. + Size(v []uint64) (sz int, ok bool) + + // Store stores the block using the Compacter's compression method. + // It returns a handle with which the block can be retrieved. + // len(v) is always 64. + Store(v []uint64) uint32 + + // Print writes the data structures associated to the given store to w. + Print(w io.Writer) error + + // Handler returns the name of a function that gets called during trie + // lookup for blocks generated by the Compacter. The function should be of + // the form func (n uint32, b byte) uint64, where n is the index returned by + // the Compacter's Store method and b is the last byte of the UTF-8 + // encoding, where 0x80 <= b < 0xC0, for which to do the lookup in the + // block. + Handler() string +} + +// simpleCompacter is the default Compacter used by builder. It implements a +// normal trie block. +type simpleCompacter builder + +func (b *simpleCompacter) Size([]uint64) (sz int, ok bool) { + return blockSize * b.ValueSize, true +} + +func (b *simpleCompacter) Store(v []uint64) uint32 { + h := uint32(len(b.ValueBlocks) - blockOffset) + b.ValueBlocks = append(b.ValueBlocks, v) + return h +} + +func (b *simpleCompacter) Print(io.Writer) error { + // Structures are printed in print.go. + return nil +} + +func (b *simpleCompacter) Handler() string { + panic("Handler should be special-cased for this Compacter") +} diff --git a/vendor/golang.org/x/text/internal/triegen/data_test.go b/vendor/golang.org/x/text/internal/triegen/data_test.go new file mode 100644 index 0000000000..91de547a55 --- /dev/null +++ b/vendor/golang.org/x/text/internal/triegen/data_test.go @@ -0,0 +1,875 @@ +// This file is generated with "go test -tags generate". DO NOT EDIT! +// +build !generate + +package triegen_test + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *randTrie) lookup(s []byte) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return randValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := randIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := randIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = randIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := randIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = randIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = randIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *randTrie) lookupUnsafe(s []byte) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return randValues[c0] + } + i := randIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = randIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = randIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *randTrie) lookupString(s string) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return randValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := randIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := randIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = randIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := randIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = randIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = randIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *randTrie) lookupStringUnsafe(s string) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return randValues[c0] + } + i := randIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = randIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = randIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// randTrie. Total size: 9280 bytes (9.06 KiB). Checksum: 6debd324a8debb8f. +type randTrie struct{} + +func newRandTrie(i int) *randTrie { + return &randTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *randTrie) lookupValue(n uint32, b byte) uint8 { + switch { + default: + return uint8(randValues[n<<6+uint32(b)]) + } +} + +// randValues: 56 blocks, 3584 entries, 3584 bytes +// The third block is the zero block. +var randValues = [3584]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc9: 0x0001, + // Block 0x4, offset 0x100 + 0x100: 0x0001, + // Block 0x5, offset 0x140 + 0x155: 0x0001, + // Block 0x6, offset 0x180 + 0x196: 0x0001, + // Block 0x7, offset 0x1c0 + 0x1ef: 0x0001, + // Block 0x8, offset 0x200 + 0x206: 0x0001, + // Block 0x9, offset 0x240 + 0x258: 0x0001, + // Block 0xa, offset 0x280 + 0x288: 0x0001, + // Block 0xb, offset 0x2c0 + 0x2f2: 0x0001, + // Block 0xc, offset 0x300 + 0x304: 0x0001, + // Block 0xd, offset 0x340 + 0x34b: 0x0001, + // Block 0xe, offset 0x380 + 0x3ba: 0x0001, + // Block 0xf, offset 0x3c0 + 0x3f5: 0x0001, + // Block 0x10, offset 0x400 + 0x41d: 0x0001, + // Block 0x11, offset 0x440 + 0x442: 0x0001, + // Block 0x12, offset 0x480 + 0x4bb: 0x0001, + // Block 0x13, offset 0x4c0 + 0x4e9: 0x0001, + // Block 0x14, offset 0x500 + 0x53e: 0x0001, + // Block 0x15, offset 0x540 + 0x55f: 0x0001, + // Block 0x16, offset 0x580 + 0x5b7: 0x0001, + // Block 0x17, offset 0x5c0 + 0x5d9: 0x0001, + // Block 0x18, offset 0x600 + 0x60e: 0x0001, + // Block 0x19, offset 0x640 + 0x652: 0x0001, + // Block 0x1a, offset 0x680 + 0x68f: 0x0001, + // Block 0x1b, offset 0x6c0 + 0x6dc: 0x0001, + // Block 0x1c, offset 0x700 + 0x703: 0x0001, + // Block 0x1d, offset 0x740 + 0x741: 0x0001, + // Block 0x1e, offset 0x780 + 0x79b: 0x0001, + // Block 0x1f, offset 0x7c0 + 0x7f1: 0x0001, + // Block 0x20, offset 0x800 + 0x833: 0x0001, + // Block 0x21, offset 0x840 + 0x853: 0x0001, + // Block 0x22, offset 0x880 + 0x8a2: 0x0001, + // Block 0x23, offset 0x8c0 + 0x8f8: 0x0001, + // Block 0x24, offset 0x900 + 0x917: 0x0001, + // Block 0x25, offset 0x940 + 0x945: 0x0001, + // Block 0x26, offset 0x980 + 0x99e: 0x0001, + // Block 0x27, offset 0x9c0 + 0x9fd: 0x0001, + // Block 0x28, offset 0xa00 + 0xa0d: 0x0001, + // Block 0x29, offset 0xa40 + 0xa66: 0x0001, + // Block 0x2a, offset 0xa80 + 0xaab: 0x0001, + // Block 0x2b, offset 0xac0 + 0xaea: 0x0001, + // Block 0x2c, offset 0xb00 + 0xb2d: 0x0001, + // Block 0x2d, offset 0xb40 + 0xb54: 0x0001, + // Block 0x2e, offset 0xb80 + 0xb90: 0x0001, + // Block 0x2f, offset 0xbc0 + 0xbe5: 0x0001, + // Block 0x30, offset 0xc00 + 0xc28: 0x0001, + // Block 0x31, offset 0xc40 + 0xc7c: 0x0001, + // Block 0x32, offset 0xc80 + 0xcbf: 0x0001, + // Block 0x33, offset 0xcc0 + 0xcc7: 0x0001, + // Block 0x34, offset 0xd00 + 0xd34: 0x0001, + // Block 0x35, offset 0xd40 + 0xd61: 0x0001, + // Block 0x36, offset 0xd80 + 0xdb9: 0x0001, + // Block 0x37, offset 0xdc0 + 0xdda: 0x0001, +} + +// randIndex: 89 blocks, 5696 entries, 5696 bytes +// Block 0 is the zero block. +var randIndex = [5696]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xe1: 0x02, 0xe3: 0x03, 0xe4: 0x04, + 0xea: 0x05, 0xeb: 0x06, 0xec: 0x07, + 0xf0: 0x10, 0xf1: 0x24, 0xf2: 0x3d, 0xf3: 0x4f, 0xf4: 0x56, + // Block 0x4, offset 0x100 + 0x107: 0x01, + // Block 0x5, offset 0x140 + 0x16c: 0x02, + // Block 0x6, offset 0x180 + 0x19c: 0x03, + 0x1ae: 0x04, + // Block 0x7, offset 0x1c0 + 0x1d8: 0x05, + 0x1f7: 0x06, + // Block 0x8, offset 0x200 + 0x20c: 0x07, + // Block 0x9, offset 0x240 + 0x24a: 0x08, + // Block 0xa, offset 0x280 + 0x2b6: 0x09, + // Block 0xb, offset 0x2c0 + 0x2d5: 0x0a, + // Block 0xc, offset 0x300 + 0x31a: 0x0b, + // Block 0xd, offset 0x340 + 0x373: 0x0c, + // Block 0xe, offset 0x380 + 0x38b: 0x0d, + // Block 0xf, offset 0x3c0 + 0x3f0: 0x0e, + // Block 0x10, offset 0x400 + 0x433: 0x0f, + // Block 0x11, offset 0x440 + 0x45d: 0x10, + // Block 0x12, offset 0x480 + 0x491: 0x08, 0x494: 0x09, 0x497: 0x0a, + 0x49b: 0x0b, 0x49c: 0x0c, + 0x4a1: 0x0d, + 0x4ad: 0x0e, + 0x4ba: 0x0f, + // Block 0x13, offset 0x4c0 + 0x4c1: 0x11, + // Block 0x14, offset 0x500 + 0x531: 0x12, + // Block 0x15, offset 0x540 + 0x546: 0x13, + // Block 0x16, offset 0x580 + 0x5ab: 0x14, + // Block 0x17, offset 0x5c0 + 0x5d4: 0x11, + 0x5fe: 0x11, + // Block 0x18, offset 0x600 + 0x618: 0x0a, + // Block 0x19, offset 0x640 + 0x65b: 0x15, + // Block 0x1a, offset 0x680 + 0x6a0: 0x16, + // Block 0x1b, offset 0x6c0 + 0x6d2: 0x17, + 0x6f6: 0x18, + // Block 0x1c, offset 0x700 + 0x711: 0x19, + // Block 0x1d, offset 0x740 + 0x768: 0x1a, + // Block 0x1e, offset 0x780 + 0x783: 0x1b, + // Block 0x1f, offset 0x7c0 + 0x7f9: 0x1c, + // Block 0x20, offset 0x800 + 0x831: 0x1d, + // Block 0x21, offset 0x840 + 0x85e: 0x1e, + // Block 0x22, offset 0x880 + 0x898: 0x1f, + // Block 0x23, offset 0x8c0 + 0x8c7: 0x18, + 0x8d5: 0x14, + 0x8f7: 0x20, + 0x8fe: 0x1f, + // Block 0x24, offset 0x900 + 0x905: 0x21, + // Block 0x25, offset 0x940 + 0x966: 0x03, + // Block 0x26, offset 0x980 + 0x981: 0x07, 0x983: 0x11, + 0x989: 0x12, 0x98a: 0x13, 0x98e: 0x14, 0x98f: 0x15, + 0x992: 0x16, 0x995: 0x17, 0x996: 0x18, + 0x998: 0x19, 0x999: 0x1a, 0x99b: 0x1b, 0x99f: 0x1c, + 0x9a3: 0x1d, + 0x9ad: 0x1e, 0x9af: 0x1f, + 0x9b0: 0x20, 0x9b1: 0x21, + 0x9b8: 0x22, 0x9bd: 0x23, + // Block 0x27, offset 0x9c0 + 0x9cd: 0x22, + // Block 0x28, offset 0xa00 + 0xa0c: 0x08, + // Block 0x29, offset 0xa40 + 0xa6f: 0x1c, + // Block 0x2a, offset 0xa80 + 0xa90: 0x1a, + 0xaaf: 0x23, + // Block 0x2b, offset 0xac0 + 0xae3: 0x19, + 0xae8: 0x24, + 0xafc: 0x25, + // Block 0x2c, offset 0xb00 + 0xb13: 0x26, + // Block 0x2d, offset 0xb40 + 0xb67: 0x1c, + // Block 0x2e, offset 0xb80 + 0xb8f: 0x0b, + // Block 0x2f, offset 0xbc0 + 0xbcb: 0x27, + 0xbe7: 0x26, + // Block 0x30, offset 0xc00 + 0xc34: 0x16, + // Block 0x31, offset 0xc40 + 0xc62: 0x03, + // Block 0x32, offset 0xc80 + 0xcbb: 0x12, + // Block 0x33, offset 0xcc0 + 0xcdf: 0x09, + // Block 0x34, offset 0xd00 + 0xd34: 0x0a, + // Block 0x35, offset 0xd40 + 0xd41: 0x1e, + // Block 0x36, offset 0xd80 + 0xd83: 0x28, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x15, + // Block 0x38, offset 0xe00 + 0xe1a: 0x15, + // Block 0x39, offset 0xe40 + 0xe65: 0x29, + // Block 0x3a, offset 0xe80 + 0xe86: 0x1f, + // Block 0x3b, offset 0xec0 + 0xeec: 0x18, + // Block 0x3c, offset 0xf00 + 0xf28: 0x2a, + // Block 0x3d, offset 0xf40 + 0xf53: 0x08, + // Block 0x3e, offset 0xf80 + 0xfa2: 0x2b, + 0xfaa: 0x17, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x25, 0xfc2: 0x26, + 0xfc9: 0x27, 0xfcd: 0x28, 0xfce: 0x29, + 0xfd5: 0x2a, + 0xfd8: 0x2b, 0xfd9: 0x2c, 0xfdf: 0x2d, + 0xfe1: 0x2e, 0xfe2: 0x2f, 0xfe3: 0x30, 0xfe6: 0x31, + 0xfe9: 0x32, 0xfec: 0x33, 0xfed: 0x34, 0xfef: 0x35, + 0xff1: 0x36, 0xff2: 0x37, 0xff3: 0x38, 0xff4: 0x39, + 0xffa: 0x3a, 0xffc: 0x3b, 0xffe: 0x3c, + // Block 0x40, offset 0x1000 + 0x102c: 0x2c, + // Block 0x41, offset 0x1040 + 0x1074: 0x2c, + // Block 0x42, offset 0x1080 + 0x108c: 0x08, + 0x10a0: 0x2d, + // Block 0x43, offset 0x10c0 + 0x10e8: 0x10, + // Block 0x44, offset 0x1100 + 0x110f: 0x13, + // Block 0x45, offset 0x1140 + 0x114b: 0x2e, + // Block 0x46, offset 0x1180 + 0x118b: 0x23, + 0x119d: 0x0c, + // Block 0x47, offset 0x11c0 + 0x11c3: 0x12, + 0x11f9: 0x0f, + // Block 0x48, offset 0x1200 + 0x121e: 0x1b, + // Block 0x49, offset 0x1240 + 0x1270: 0x2f, + // Block 0x4a, offset 0x1280 + 0x128a: 0x1b, + 0x12a7: 0x02, + // Block 0x4b, offset 0x12c0 + 0x12fb: 0x14, + // Block 0x4c, offset 0x1300 + 0x1333: 0x30, + // Block 0x4d, offset 0x1340 + 0x134d: 0x31, + // Block 0x4e, offset 0x1380 + 0x138e: 0x15, + // Block 0x4f, offset 0x13c0 + 0x13f4: 0x32, + // Block 0x50, offset 0x1400 + 0x141b: 0x33, + // Block 0x51, offset 0x1440 + 0x1448: 0x3e, 0x1449: 0x3f, 0x144a: 0x40, 0x144f: 0x41, + 0x1459: 0x42, 0x145c: 0x43, 0x145e: 0x44, 0x145f: 0x45, + 0x1468: 0x46, 0x1469: 0x47, 0x146c: 0x48, 0x146d: 0x49, 0x146e: 0x4a, + 0x1472: 0x4b, 0x1473: 0x4c, + 0x1479: 0x4d, 0x147b: 0x4e, + // Block 0x52, offset 0x1480 + 0x1480: 0x34, + 0x1499: 0x11, + 0x14b6: 0x2c, + // Block 0x53, offset 0x14c0 + 0x14e4: 0x0d, + // Block 0x54, offset 0x1500 + 0x1527: 0x08, + // Block 0x55, offset 0x1540 + 0x1555: 0x2b, + // Block 0x56, offset 0x1580 + 0x15b2: 0x35, + // Block 0x57, offset 0x15c0 + 0x15f2: 0x1c, 0x15f4: 0x29, + // Block 0x58, offset 0x1600 + 0x1600: 0x50, 0x1603: 0x51, + 0x1608: 0x52, 0x160a: 0x53, 0x160d: 0x54, 0x160e: 0x55, +} + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *multiTrie) lookup(s []byte) (v uint64, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return t.ascii[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := t.utf8Start[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := t.utf8Start[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = multiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := t.utf8Start[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = multiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = multiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *multiTrie) lookupUnsafe(s []byte) uint64 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return t.ascii[c0] + } + i := t.utf8Start[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = multiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = multiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *multiTrie) lookupString(s string) (v uint64, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return t.ascii[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := t.utf8Start[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := t.utf8Start[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = multiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := t.utf8Start[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = multiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = multiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *multiTrie) lookupStringUnsafe(s string) uint64 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return t.ascii[c0] + } + i := t.utf8Start[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = multiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = multiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// multiTrie. Total size: 18250 bytes (17.82 KiB). Checksum: a69a609d8696aa5e. +type multiTrie struct { + ascii []uint64 // index for ASCII bytes + utf8Start []uint8 // index for UTF-8 bytes >= 0xC0 +} + +func newMultiTrie(i int) *multiTrie { + h := multiTrieHandles[i] + return &multiTrie{multiValues[uint32(h.ascii)<<6:], multiIndex[uint32(h.multi)<<6:]} +} + +type multiTrieHandle struct { + ascii, multi uint8 +} + +// multiTrieHandles: 5 handles, 10 bytes +var multiTrieHandles = [5]multiTrieHandle{ + {0, 0}, // 8c1e77823143d35c: all + {0, 23}, // 8fb58ff8243b45b0: ASCII only + {0, 23}, // 8fb58ff8243b45b0: ASCII only 2 + {0, 24}, // 2ccc43994f11046f: BMP only + {30, 25}, // ce448591bdcb4733: No BMP +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *multiTrie) lookupValue(n uint32, b byte) uint64 { + switch { + default: + return uint64(multiValues[n<<6+uint32(b)]) + } +} + +// multiValues: 32 blocks, 2048 entries, 16384 bytes +// The third block is the zero block. +var multiValues = [2048]uint64{ + // Block 0x0, offset 0x0 + 0x03: 0x6e361699800b9fb8, 0x04: 0x52d3935a34f6f0b, 0x05: 0x2948319393e7ef10, + 0x07: 0x20f03b006704f663, 0x08: 0x6c15c0732bb2495f, 0x09: 0xe54e2c59d953551, + 0x0f: 0x33d8a825807d8037, 0x10: 0x6ecd93cb12168b92, 0x11: 0x6a81c9c0ce86e884, + 0x1f: 0xa03e77aac8be79b, 0x20: 0x28591d0e7e486efa, 0x21: 0x716fa3bc398dec8, + 0x3f: 0x4fd3bcfa72bce8b0, + // Block 0x1, offset 0x40 + 0x40: 0x3cbaef3db8ba5f12, 0x41: 0x2d262347c1f56357, + 0x7f: 0x782caa2d25a418a9, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x6bbd1f937b1ff5d2, 0xc1: 0x732e23088d2eb8a4, + // Block 0x4, offset 0x100 + 0x13f: 0x56f8c4c82f5962dc, + // Block 0x5, offset 0x140 + 0x140: 0x57dc4544729a5da2, 0x141: 0x2f62f9cd307ffa0d, + // Block 0x6, offset 0x180 + 0x1bf: 0x7bf4d0ebf302a088, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x1f0d67f249e59931, 0x1c1: 0x3011def73aa550c7, + // Block 0x8, offset 0x200 + 0x23f: 0x5de81c1dff6bf29d, + // Block 0x9, offset 0x240 + 0x240: 0x752c035737b825e8, 0x241: 0x1e793399081e3bb3, + // Block 0xa, offset 0x280 + 0x2bf: 0x6a28f01979cbf059, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x373a4b0f2cbd4c74, 0x2c1: 0x4fd2c288683b767c, + // Block 0xc, offset 0x300 + 0x33f: 0x5a10ffa9e29184fb, + // Block 0xd, offset 0x340 + 0x340: 0x700f9bdb53fff6a5, 0x341: 0xcde93df0427eb79, + // Block 0xe, offset 0x380 + 0x3bf: 0x74071288fff39c76, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x481fc2f510e5268a, 0x3c1: 0x7565c28164204849, + // Block 0x10, offset 0x400 + 0x43f: 0x5676a62fd49c6bec, + // Block 0x11, offset 0x440 + 0x440: 0x2f2d15776cbafc6b, 0x441: 0x4c55e8dc0ff11a3f, + // Block 0x12, offset 0x480 + 0x4bf: 0x69d6f0fe711fafc9, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x33181de28cfb062d, 0x4c1: 0x2ef3adc6bb2f2d02, + // Block 0x14, offset 0x500 + 0x53f: 0xe03b31814c95f8b, + // Block 0x15, offset 0x540 + 0x540: 0x3bf6dc9a1c115603, 0x541: 0x6984ec9b7f51f7fc, + // Block 0x16, offset 0x580 + 0x5bf: 0x3c02ea92fb168559, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x1badfe42e7629494, 0x5c1: 0x6dc4a554005f7645, + // Block 0x18, offset 0x600 + 0x63f: 0x3bb2ed2a72748f4b, + // Block 0x19, offset 0x640 + 0x640: 0x291354cd6767ec10, 0x641: 0x2c3a4715e3c070d6, + // Block 0x1a, offset 0x680 + 0x6bf: 0x352711cfb7236418, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x3a59d34fb8bceda, 0x6c1: 0x5e90d8ebedd64fa1, + // Block 0x1c, offset 0x700 + 0x73f: 0x7191a77b28d23110, + // Block 0x1d, offset 0x740 + 0x740: 0x4ca7f0c1623423d8, 0x741: 0x4f7156d996e2d0de, + // Block 0x1e, offset 0x780 + // Block 0x1f, offset 0x7c0 +} + +// multiIndex: 29 blocks, 1856 entries, 1856 bytes +// Block 0 is the zero block. +var multiIndex = [1856]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x02, 0xc4: 0x03, 0xc7: 0x04, + 0xc8: 0x05, 0xcf: 0x06, + 0xd0: 0x07, + 0xdf: 0x08, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe7: 0x07, + 0xe8: 0x08, 0xef: 0x09, + 0xf0: 0x0e, 0xf1: 0x11, 0xf2: 0x13, 0xf3: 0x15, 0xf4: 0x17, + // Block 0x4, offset 0x100 + 0x120: 0x09, + 0x13f: 0x0a, + // Block 0x5, offset 0x140 + 0x140: 0x0b, + 0x17f: 0x0c, + // Block 0x6, offset 0x180 + 0x180: 0x0d, + // Block 0x7, offset 0x1c0 + 0x1ff: 0x0e, + // Block 0x8, offset 0x200 + 0x200: 0x0f, + // Block 0x9, offset 0x240 + 0x27f: 0x10, + // Block 0xa, offset 0x280 + 0x280: 0x11, + // Block 0xb, offset 0x2c0 + 0x2ff: 0x12, + // Block 0xc, offset 0x300 + 0x300: 0x13, + // Block 0xd, offset 0x340 + 0x37f: 0x14, + // Block 0xe, offset 0x380 + 0x380: 0x15, + // Block 0xf, offset 0x3c0 + 0x3ff: 0x16, + // Block 0x10, offset 0x400 + 0x410: 0x0a, + 0x41f: 0x0b, + 0x420: 0x0c, + 0x43f: 0x0d, + // Block 0x11, offset 0x440 + 0x440: 0x17, + // Block 0x12, offset 0x480 + 0x4bf: 0x18, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x0f, + 0x4ff: 0x10, + // Block 0x14, offset 0x500 + 0x500: 0x19, + // Block 0x15, offset 0x540 + 0x540: 0x12, + // Block 0x16, offset 0x580 + 0x5bf: 0x1a, + // Block 0x17, offset 0x5c0 + 0x5ff: 0x14, + // Block 0x18, offset 0x600 + 0x600: 0x1b, + // Block 0x19, offset 0x640 + 0x640: 0x16, + // Block 0x1a, offset 0x680 + // Block 0x1b, offset 0x6c0 + 0x6c2: 0x01, 0x6c3: 0x02, 0x6c4: 0x03, 0x6c7: 0x04, + 0x6c8: 0x05, 0x6cf: 0x06, + 0x6d0: 0x07, + 0x6df: 0x08, + 0x6e0: 0x02, 0x6e1: 0x03, 0x6e2: 0x04, 0x6e3: 0x05, 0x6e4: 0x06, 0x6e7: 0x07, + 0x6e8: 0x08, 0x6ef: 0x09, + // Block 0x1c, offset 0x700 + 0x730: 0x0e, 0x731: 0x11, 0x732: 0x13, 0x733: 0x15, 0x734: 0x17, +} diff --git a/vendor/golang.org/x/text/internal/triegen/example_compact_test.go b/vendor/golang.org/x/text/internal/triegen/example_compact_test.go new file mode 100644 index 0000000000..7cf604ca47 --- /dev/null +++ b/vendor/golang.org/x/text/internal/triegen/example_compact_test.go @@ -0,0 +1,71 @@ +// 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 triegen_test + +import ( + "fmt" + "io" + "io/ioutil" + + "golang.org/x/text/internal/triegen" +) + +func ExampleCompacter() { + t := triegen.NewTrie("root") + for r := rune(0); r < 10000; r += 64 { + t.Insert(r, 0x9015BADA55^uint64(r)) + } + sz, _ := t.Gen(ioutil.Discard) + + fmt.Printf("Size normal: %5d\n", sz) + + var c myCompacter + sz, _ = t.Gen(ioutil.Discard, triegen.Compact(&c)) + + fmt.Printf("Size compacted: %5d\n", sz) + + // Output: + // Size normal: 81344 + // Size compacted: 3224 +} + +// A myCompacter accepts a block if only the first value is given. +type myCompacter []uint64 + +func (c *myCompacter) Size(values []uint64) (sz int, ok bool) { + for _, v := range values[1:] { + if v != 0 { + return 0, false + } + } + return 8, true // the size of a uint64 +} + +func (c *myCompacter) Store(v []uint64) uint32 { + x := uint32(len(*c)) + *c = append(*c, v[0]) + return x +} + +func (c *myCompacter) Print(w io.Writer) error { + fmt.Fprintln(w, "var firstValue = []uint64{") + for _, v := range *c { + fmt.Fprintf(w, "\t%#x,\n", v) + } + fmt.Fprintln(w, "}") + return nil +} + +func (c *myCompacter) Handler() string { + return "getFirstValue" + + // Where getFirstValue is included along with the generated code: + // func getFirstValue(n uint32, b byte) uint64 { + // if b == 0x80 { // the first continuation byte + // return firstValue[n] + // } + // return 0 + // } +} diff --git a/vendor/golang.org/x/text/internal/triegen/example_test.go b/vendor/golang.org/x/text/internal/triegen/example_test.go new file mode 100644 index 0000000000..557a152e70 --- /dev/null +++ b/vendor/golang.org/x/text/internal/triegen/example_test.go @@ -0,0 +1,148 @@ +// 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 triegen_test + +import ( + "fmt" + "io/ioutil" + "math/rand" + "unicode" + + "golang.org/x/text/internal/triegen" +) + +const seed = 0x12345 + +var genWriter = ioutil.Discard + +func randomRunes() map[rune]uint8 { + rnd := rand.New(rand.NewSource(seed)) + m := map[rune]uint8{} + for len(m) < 100 { + // Only set our random rune if it is a valid Unicode code point. + if r := rune(rnd.Int31n(unicode.MaxRune + 1)); []rune(string(r))[0] == r { + m[r] = 1 + } + } + return m +} + +// Example_build shows how to build a simple trie. It assigns the value 1 to +// 100 random runes generated by randomRunes. +func Example_build() { + t := triegen.NewTrie("rand") + + for r, _ := range randomRunes() { + t.Insert(r, 1) + } + sz, err := t.Gen(genWriter) + + fmt.Printf("Trie size: %d bytes\n", sz) + fmt.Printf("Error: %v\n", err) + + // Output: + // Trie size: 9280 bytes + // Error: <nil> +} + +// Example_lookup demonstrates how to use the trie generated by Example_build. +func Example_lookup() { + trie := newRandTrie(0) + + // The same set of runes used by Example_build. + runes := randomRunes() + + // Verify the right value is returned for all runes. + for r := rune(0); r <= unicode.MaxRune; r++ { + // Note that the return type of lookup is uint8. + if v, _ := trie.lookupString(string(r)); v != runes[r] { + fmt.Println("FAILURE") + return + } + } + fmt.Println("SUCCESS") + + // Output: + // SUCCESS +} + +// runeValues generates some random values for a set of interesting runes. +func runeValues() map[rune]uint64 { + rnd := rand.New(rand.NewSource(seed)) + m := map[rune]uint64{} + for p := 4; p <= unicode.MaxRune; p <<= 1 { + for d := -1; d <= 1; d++ { + m[rune(p+d)] = uint64(rnd.Int63()) + } + } + return m +} + +// ExampleGen_build demonstrates the creation of multiple tries sharing common +// blocks. ExampleGen_lookup demonstrates how to use the generated tries. +func ExampleGen_build() { + var tries []*triegen.Trie + + rv := runeValues() + for _, c := range []struct { + include func(rune) bool + name string + }{ + {func(r rune) bool { return true }, "all"}, + {func(r rune) bool { return r < 0x80 }, "ASCII only"}, + {func(r rune) bool { return r < 0x80 }, "ASCII only 2"}, + {func(r rune) bool { return r <= 0xFFFF }, "BMP only"}, + {func(r rune) bool { return r > 0xFFFF }, "No BMP"}, + } { + t := triegen.NewTrie(c.name) + tries = append(tries, t) + + for r, v := range rv { + if c.include(r) { + t.Insert(r, v) + } + } + } + sz, err := triegen.Gen(genWriter, "multi", tries) + + fmt.Printf("Trie size: %d bytes\n", sz) + fmt.Printf("Error: %v\n", err) + + // Output: + // Trie size: 18250 bytes + // Error: <nil> +} + +// ExampleGen_lookup shows how to look up values in the trie generated by +// ExampleGen_build. +func ExampleGen_lookup() { + rv := runeValues() + for i, include := range []func(rune) bool{ + func(r rune) bool { return true }, // all + func(r rune) bool { return r < 0x80 }, // ASCII only + func(r rune) bool { return r < 0x80 }, // ASCII only 2 + func(r rune) bool { return r <= 0xFFFF }, // BMP only + func(r rune) bool { return r > 0xFFFF }, // No BMP + } { + t := newMultiTrie(i) + + for r := rune(0); r <= unicode.MaxRune; r++ { + x := uint64(0) + if include(r) { + x = rv[r] + } + // As we convert from a valid rune, we know it is safe to use + // lookupStringUnsafe. + if v := t.lookupStringUnsafe(string(r)); x != v { + fmt.Println("FAILURE") + return + } + } + } + fmt.Println("SUCCESS") + + // Output: + // SUCCESS +} diff --git a/vendor/golang.org/x/text/internal/triegen/gen_test.go b/vendor/golang.org/x/text/internal/triegen/gen_test.go new file mode 100644 index 0000000000..831627d7a0 --- /dev/null +++ b/vendor/golang.org/x/text/internal/triegen/gen_test.go @@ -0,0 +1,68 @@ +// 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 generate + +package triegen_test + +// The code in this file generates captures and writes the tries generated in +// the examples to data_test.go. To invoke it, run: +// go test -tags=generate +// +// Making the generation code a "test" allows us to link in the necessary test +// code. + +import ( + "log" + "os" + "os/exec" +) + +func init() { + const tmpfile = "tmpout" + const dstfile = "data_test.go" + + f, err := os.Create(tmpfile) + if err != nil { + log.Fatalf("Could not create output file: %v", err) + } + defer os.Remove(tmpfile) + defer f.Close() + + // We exit before this function returns, regardless of success or failure, + // so there's no need to save (and later restore) the existing genWriter + // value. + genWriter = f + + f.Write([]byte(header)) + + Example_build() + ExampleGen_build() + + if err := exec.Command("gofmt", "-w", tmpfile).Run(); err != nil { + log.Fatal(err) + } + os.Remove(dstfile) + os.Rename(tmpfile, dstfile) + + os.Exit(0) +} + +const header = `// This file is generated with "go test -tags generate". DO NOT EDIT! +// +build !generate + +package triegen_test +` + +// Stubs for generated tries. These are needed as we exclude data_test.go if +// the generate flag is set. This will clearly make the tests fail, but that +// is okay. It allows us to bootstrap. + +type trie struct{} + +func (t *trie) lookupString(string) (uint8, int) { return 0, 1 } +func (t *trie) lookupStringUnsafe(string) uint64 { return 0 } + +func newRandTrie(i int) *trie { return &trie{} } +func newMultiTrie(i int) *trie { return &trie{} } diff --git a/vendor/golang.org/x/text/internal/triegen/print.go b/vendor/golang.org/x/text/internal/triegen/print.go new file mode 100644 index 0000000000..8d9f120bcd --- /dev/null +++ b/vendor/golang.org/x/text/internal/triegen/print.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 triegen + +import ( + "bytes" + "fmt" + "io" + "strings" + "text/template" +) + +// print writes all the data structures as well as the code necessary to use the +// trie to w. +func (b *builder) print(w io.Writer) error { + b.Stats.NValueEntries = len(b.ValueBlocks) * blockSize + b.Stats.NValueBytes = len(b.ValueBlocks) * blockSize * b.ValueSize + b.Stats.NIndexEntries = len(b.IndexBlocks) * blockSize + b.Stats.NIndexBytes = len(b.IndexBlocks) * blockSize * b.IndexSize + b.Stats.NHandleBytes = len(b.Trie) * 2 * b.IndexSize + + // If we only have one root trie, all starter blocks are at position 0 and + // we can access the arrays directly. + if len(b.Trie) == 1 { + // At this point we cannot refer to the generated tables directly. + b.ASCIIBlock = b.Name + "Values" + b.StarterBlock = b.Name + "Index" + } else { + // Otherwise we need to have explicit starter indexes in the trie + // structure. + b.ASCIIBlock = "t.ascii" + b.StarterBlock = "t.utf8Start" + } + + b.SourceType = "[]byte" + if err := lookupGen.Execute(w, b); err != nil { + return err + } + + b.SourceType = "string" + if err := lookupGen.Execute(w, b); err != nil { + return err + } + + if err := trieGen.Execute(w, b); err != nil { + return err + } + + for _, c := range b.Compactions { + if err := c.c.Print(w); err != nil { + return err + } + } + + return nil +} + +func printValues(n int, values []uint64) string { + w := &bytes.Buffer{} + boff := n * blockSize + fmt.Fprintf(w, "\t// Block %#x, offset %#x", n, boff) + var newline bool + for i, v := range values { + if i%6 == 0 { + newline = true + } + if v != 0 { + if newline { + fmt.Fprintf(w, "\n") + newline = false + } + fmt.Fprintf(w, "\t%#02x:%#04x, ", boff+i, v) + } + } + return w.String() +} + +func printIndex(b *builder, nr int, n *node) string { + w := &bytes.Buffer{} + boff := nr * blockSize + fmt.Fprintf(w, "\t// Block %#x, offset %#x", nr, boff) + var newline bool + for i, c := range n.children { + if i%8 == 0 { + newline = true + } + if c != nil { + v := b.Compactions[c.index.compaction].Offset + uint32(c.index.index) + if v != 0 { + if newline { + fmt.Fprintf(w, "\n") + newline = false + } + fmt.Fprintf(w, "\t%#02x:%#02x, ", boff+i, v) + } + } + } + return w.String() +} + +var ( + trieGen = template.Must(template.New("trie").Funcs(template.FuncMap{ + "printValues": printValues, + "printIndex": printIndex, + "title": strings.Title, + "dec": func(x int) int { return x - 1 }, + "psize": func(n int) string { + return fmt.Sprintf("%d bytes (%.2f KiB)", n, float64(n)/1024) + }, + }).Parse(trieTemplate)) + lookupGen = template.Must(template.New("lookup").Parse(lookupTemplate)) +) + +// TODO: consider the return type of lookup. It could be uint64, even if the +// internal value type is smaller. We will have to verify this with the +// performance of unicode/norm, which is very sensitive to such changes. +const trieTemplate = `{{$b := .}}{{$multi := gt (len .Trie) 1}} +// {{.Name}}Trie. Total size: {{psize .Size}}. Checksum: {{printf "%08x" .Checksum}}. +type {{.Name}}Trie struct { {{if $multi}} + ascii []{{.ValueType}} // index for ASCII bytes + utf8Start []{{.IndexType}} // index for UTF-8 bytes >= 0xC0 +{{end}}} + +func new{{title .Name}}Trie(i int) *{{.Name}}Trie { {{if $multi}} + h := {{.Name}}TrieHandles[i] + return &{{.Name}}Trie{ {{.Name}}Values[uint32(h.ascii)<<6:], {{.Name}}Index[uint32(h.multi)<<6:] } +} + +type {{.Name}}TrieHandle struct { + ascii, multi {{.IndexType}} +} + +// {{.Name}}TrieHandles: {{len .Trie}} handles, {{.Stats.NHandleBytes}} bytes +var {{.Name}}TrieHandles = [{{len .Trie}}]{{.Name}}TrieHandle{ +{{range .Trie}} { {{.ASCIIIndex}}, {{.StarterIndex}} }, // {{printf "%08x" .Checksum}}: {{.Name}} +{{end}}}{{else}} + return &{{.Name}}Trie{} +} +{{end}} +// lookupValue determines the type of block n and looks up the value for b. +func (t *{{.Name}}Trie) lookupValue(n uint32, b byte) {{.ValueType}}{{$last := dec (len .Compactions)}} { + switch { {{range $i, $c := .Compactions}} + {{if eq $i $last}}default{{else}}case n < {{$c.Cutoff}}{{end}}:{{if ne $i 0}} + n -= {{$c.Offset}}{{end}} + return {{print $b.ValueType}}({{$c.Handler}}){{end}} + } +} + +// {{.Name}}Values: {{len .ValueBlocks}} blocks, {{.Stats.NValueEntries}} entries, {{.Stats.NValueBytes}} bytes +// The third block is the zero block. +var {{.Name}}Values = [{{.Stats.NValueEntries}}]{{.ValueType}} { +{{range $i, $v := .ValueBlocks}}{{printValues $i $v}} +{{end}}} + +// {{.Name}}Index: {{len .IndexBlocks}} blocks, {{.Stats.NIndexEntries}} entries, {{.Stats.NIndexBytes}} bytes +// Block 0 is the zero block. +var {{.Name}}Index = [{{.Stats.NIndexEntries}}]{{.IndexType}} { +{{range $i, $v := .IndexBlocks}}{{printIndex $b $i $v}} +{{end}}} +` + +// TODO: consider allowing zero-length strings after evaluating performance with +// unicode/norm. +const lookupTemplate = ` +// lookup{{if eq .SourceType "string"}}String{{end}} returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *{{.Name}}Trie) lookup{{if eq .SourceType "string"}}String{{end}}(s {{.SourceType}}) (v {{.ValueType}}, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return {{.ASCIIBlock}}[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := {{.StarterBlock}}[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := {{.StarterBlock}}[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = {{.Name}}Index[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := {{.StarterBlock}}[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = {{.Name}}Index[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = {{.Name}}Index[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookup{{if eq .SourceType "string"}}String{{end}}Unsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *{{.Name}}Trie) lookup{{if eq .SourceType "string"}}String{{end}}Unsafe(s {{.SourceType}}) {{.ValueType}} { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return {{.ASCIIBlock}}[c0] + } + i := {{.StarterBlock}}[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = {{.Name}}Index[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = {{.Name}}Index[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} +` diff --git a/vendor/golang.org/x/text/internal/triegen/triegen.go b/vendor/golang.org/x/text/internal/triegen/triegen.go new file mode 100644 index 0000000000..adb0108124 --- /dev/null +++ b/vendor/golang.org/x/text/internal/triegen/triegen.go @@ -0,0 +1,494 @@ +// 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 triegen implements a code generator for a trie for associating +// unsigned integer values with UTF-8 encoded runes. +// +// Many of the go.text packages use tries for storing per-rune information. A +// trie is especially useful if many of the runes have the same value. If this +// is the case, many blocks can be expected to be shared allowing for +// information on many runes to be stored in little space. +// +// As most of the lookups are done directly on []byte slices, the tries use the +// UTF-8 bytes directly for the lookup. This saves a conversion from UTF-8 to +// runes and contributes a little bit to better performance. It also naturally +// provides a fast path for ASCII. +// +// Space is also an issue. There are many code points defined in Unicode and as +// a result tables can get quite large. So every byte counts. The triegen +// package automatically chooses the smallest integer values to represent the +// tables. Compacters allow further compression of the trie by allowing for +// alternative representations of individual trie blocks. +// +// triegen allows generating multiple tries as a single structure. This is +// useful when, for example, one wants to generate tries for several languages +// that have a lot of values in common. Some existing libraries for +// internationalization store all per-language data as a dynamically loadable +// chunk. The go.text packages are designed with the assumption that the user +// typically wants to compile in support for all supported languages, in line +// with the approach common to Go to create a single standalone binary. The +// multi-root trie approach can give significant storage savings in this +// scenario. +// +// triegen generates both tables and code. The code is optimized to use the +// automatically chosen data types. The following code is generated for a Trie +// or multiple Tries named "foo": +// - type fooTrie +// The trie type. +// +// - func newFooTrie(x int) *fooTrie +// Trie constructor, where x is the index of the trie passed to Gen. +// +// - func (t *fooTrie) lookup(s []byte) (v uintX, sz int) +// The lookup method, where uintX is automatically chosen. +// +// - func lookupString, lookupUnsafe and lookupStringUnsafe +// Variants of the above. +// +// - var fooValues and fooIndex and any tables generated by Compacters. +// The core trie data. +// +// - var fooTrieHandles +// Indexes of starter blocks in case of multiple trie roots. +// +// It is recommended that users test the generated trie by checking the returned +// value for every rune. Such exhaustive tests are possible as the the number of +// runes in Unicode is limited. +package triegen // import "golang.org/x/text/internal/triegen" + +// TODO: Arguably, the internally optimized data types would not have to be +// exposed in the generated API. We could also investigate not generating the +// code, but using it through a package. We would have to investigate the impact +// on performance of making such change, though. For packages like unicode/norm, +// small changes like this could tank performance. + +import ( + "encoding/binary" + "fmt" + "hash/crc64" + "io" + "log" + "unicode/utf8" +) + +// builder builds a set of tries for associating values with runes. The set of +// tries can share common index and value blocks. +type builder struct { + Name string + + // ValueType is the type of the trie values looked up. + ValueType string + + // ValueSize is the byte size of the ValueType. + ValueSize int + + // IndexType is the type of trie index values used for all UTF-8 bytes of + // a rune except the last one. + IndexType string + + // IndexSize is the byte size of the IndexType. + IndexSize int + + // SourceType is used when generating the lookup functions. If the user + // requests StringSupport, all lookup functions will be generated for + // string input as well. + SourceType string + + Trie []*Trie + + IndexBlocks []*node + ValueBlocks [][]uint64 + Compactions []compaction + Checksum uint64 + + ASCIIBlock string + StarterBlock string + + indexBlockIdx map[uint64]int + valueBlockIdx map[uint64]nodeIndex + asciiBlockIdx map[uint64]int + + // Stats are used to fill out the template. + Stats struct { + NValueEntries int + NValueBytes int + NIndexEntries int + NIndexBytes int + NHandleBytes int + } + + err error +} + +// A nodeIndex encodes the index of a node, which is defined by the compaction +// which stores it and an index within the compaction. For internal nodes, the +// compaction is always 0. +type nodeIndex struct { + compaction int + index int +} + +// compaction keeps track of stats used for the compaction. +type compaction struct { + c Compacter + blocks []*node + maxHandle uint32 + totalSize int + + // Used by template-based generator and thus exported. + Cutoff uint32 + Offset uint32 + Handler string +} + +func (b *builder) setError(err error) { + if b.err == nil { + b.err = err + } +} + +// An Option can be passed to Gen. +type Option func(b *builder) error + +// Compact configures the trie generator to use the given Compacter. +func Compact(c Compacter) Option { + return func(b *builder) error { + b.Compactions = append(b.Compactions, compaction{ + c: c, + Handler: c.Handler() + "(n, b)"}) + return nil + } +} + +// Gen writes Go code for a shared trie lookup structure to w for the given +// Tries. The generated trie type will be called nameTrie. newNameTrie(x) will +// return the *nameTrie for tries[x]. A value can be looked up by using one of +// the various lookup methods defined on nameTrie. It returns the table size of +// the generated trie. +func Gen(w io.Writer, name string, tries []*Trie, opts ...Option) (sz int, err error) { + // The index contains two dummy blocks, followed by the zero block. The zero + // block is at offset 0x80, so that the offset for the zero block for + // continuation bytes is 0. + b := &builder{ + Name: name, + Trie: tries, + IndexBlocks: []*node{{}, {}, {}}, + Compactions: []compaction{{ + Handler: name + "Values[n<<6+uint32(b)]", + }}, + // The 0 key in indexBlockIdx and valueBlockIdx is the hash of the zero + // block. + indexBlockIdx: map[uint64]int{0: 0}, + valueBlockIdx: map[uint64]nodeIndex{0: {}}, + asciiBlockIdx: map[uint64]int{}, + } + b.Compactions[0].c = (*simpleCompacter)(b) + + for _, f := range opts { + if err := f(b); err != nil { + return 0, err + } + } + b.build() + if b.err != nil { + return 0, b.err + } + if err = b.print(w); err != nil { + return 0, err + } + return b.Size(), nil +} + +// A Trie represents a single root node of a trie. A builder may build several +// overlapping tries at once. +type Trie struct { + root *node + + hiddenTrie +} + +// hiddenTrie contains values we want to be visible to the template generator, +// but hidden from the API documentation. +type hiddenTrie struct { + Name string + Checksum uint64 + ASCIIIndex int + StarterIndex int +} + +// NewTrie returns a new trie root. +func NewTrie(name string) *Trie { + return &Trie{ + &node{ + children: make([]*node, blockSize), + values: make([]uint64, utf8.RuneSelf), + }, + hiddenTrie{Name: name}, + } +} + +// Gen is a convenience wrapper around the Gen func passing t as the only trie +// and uses the name passed to NewTrie. It returns the size of the generated +// tables. +func (t *Trie) Gen(w io.Writer, opts ...Option) (sz int, err error) { + return Gen(w, t.Name, []*Trie{t}, opts...) +} + +// node is a node of the intermediate trie structure. +type node struct { + // children holds this node's children. It is always of length 64. + // A child node may be nil. + children []*node + + // values contains the values of this node. If it is non-nil, this node is + // either a root or leaf node: + // For root nodes, len(values) == 128 and it maps the bytes in [0x00, 0x7F]. + // For leaf nodes, len(values) == 64 and it maps the bytes in [0x80, 0xBF]. + values []uint64 + + index nodeIndex +} + +// Insert associates value with the given rune. Insert will panic if a non-zero +// value is passed for an invalid rune. +func (t *Trie) Insert(r rune, value uint64) { + if value == 0 { + return + } + s := string(r) + if []rune(s)[0] != r && value != 0 { + // Note: The UCD tables will always assign what amounts to a zero value + // to a surrogate. Allowing a zero value for an illegal rune allows + // users to iterate over [0..MaxRune] without having to explicitly + // exclude surrogates, which would be tedious. + panic(fmt.Sprintf("triegen: non-zero value for invalid rune %U", r)) + } + if len(s) == 1 { + // It is a root node value (ASCII). + t.root.values[s[0]] = value + return + } + + n := t.root + for ; len(s) > 1; s = s[1:] { + if n.children == nil { + n.children = make([]*node, blockSize) + } + p := s[0] % blockSize + c := n.children[p] + if c == nil { + c = &node{} + n.children[p] = c + } + if len(s) > 2 && c.values != nil { + log.Fatalf("triegen: insert(%U): found internal node with values", r) + } + n = c + } + if n.values == nil { + n.values = make([]uint64, blockSize) + } + if n.children != nil { + log.Fatalf("triegen: insert(%U): found leaf node that also has child nodes", r) + } + n.values[s[0]-0x80] = value +} + +// Size returns the number of bytes the generated trie will take to store. It +// needs to be exported as it is used in the templates. +func (b *builder) Size() int { + // Index blocks. + sz := len(b.IndexBlocks) * blockSize * b.IndexSize + + // Skip the first compaction, which represents the normal value blocks, as + // its totalSize does not account for the ASCII blocks, which are managed + // separately. + sz += len(b.ValueBlocks) * blockSize * b.ValueSize + for _, c := range b.Compactions[1:] { + sz += c.totalSize + } + + // TODO: this computation does not account for the fixed overhead of a using + // a compaction, either code or data. As for data, though, the typical + // overhead of data is in the order of bytes (2 bytes for cases). Further, + // the savings of using a compaction should anyway be substantial for it to + // be worth it. + + // For multi-root tries, we also need to account for the handles. + if len(b.Trie) > 1 { + sz += 2 * b.IndexSize * len(b.Trie) + } + return sz +} + +func (b *builder) build() { + // Compute the sizes of the values. + var vmax uint64 + for _, t := range b.Trie { + vmax = maxValue(t.root, vmax) + } + b.ValueType, b.ValueSize = getIntType(vmax) + + // Compute all block allocations. + // TODO: first compute the ASCII blocks for all tries and then the other + // nodes. ASCII blocks are more restricted in placement, as they require two + // blocks to be placed consecutively. Processing them first may improve + // sharing (at least one zero block can be expected to be saved.) + for _, t := range b.Trie { + b.Checksum += b.buildTrie(t) + } + + // Compute the offsets for all the Compacters. + offset := uint32(0) + for i := range b.Compactions { + c := &b.Compactions[i] + c.Offset = offset + offset += c.maxHandle + 1 + c.Cutoff = offset + } + + // Compute the sizes of indexes. + // TODO: different byte positions could have different sizes. So far we have + // not found a case where this is beneficial. + imax := uint64(b.Compactions[len(b.Compactions)-1].Cutoff) + for _, ib := range b.IndexBlocks { + if x := uint64(ib.index.index); x > imax { + imax = x + } + } + b.IndexType, b.IndexSize = getIntType(imax) +} + +func maxValue(n *node, max uint64) uint64 { + if n == nil { + return max + } + for _, c := range n.children { + max = maxValue(c, max) + } + for _, v := range n.values { + if max < v { + max = v + } + } + return max +} + +func getIntType(v uint64) (string, int) { + switch { + case v < 1<<8: + return "uint8", 1 + case v < 1<<16: + return "uint16", 2 + case v < 1<<32: + return "uint32", 4 + } + return "uint64", 8 +} + +const ( + blockSize = 64 + + // Subtract two blocks to offset 0x80, the first continuation byte. + blockOffset = 2 + + // Subtract three blocks to offset 0xC0, the first non-ASCII starter. + rootBlockOffset = 3 +) + +var crcTable = crc64.MakeTable(crc64.ISO) + +func (b *builder) buildTrie(t *Trie) uint64 { + n := t.root + + // Get the ASCII offset. For the first trie, the ASCII block will be at + // position 0. + hasher := crc64.New(crcTable) + binary.Write(hasher, binary.BigEndian, n.values) + hash := hasher.Sum64() + + v, ok := b.asciiBlockIdx[hash] + if !ok { + v = len(b.ValueBlocks) + b.asciiBlockIdx[hash] = v + + b.ValueBlocks = append(b.ValueBlocks, n.values[:blockSize], n.values[blockSize:]) + if v == 0 { + // Add the zero block at position 2 so that it will be assigned a + // zero reference in the lookup blocks. + // TODO: always do this? This would allow us to remove a check from + // the trie lookup, but at the expense of extra space. Analyze + // performance for unicode/norm. + b.ValueBlocks = append(b.ValueBlocks, make([]uint64, blockSize)) + } + } + t.ASCIIIndex = v + + // Compute remaining offsets. + t.Checksum = b.computeOffsets(n, true) + // We already subtracted the normal blockOffset from the index. Subtract the + // difference for starter bytes. + t.StarterIndex = n.index.index - (rootBlockOffset - blockOffset) + return t.Checksum +} + +func (b *builder) computeOffsets(n *node, root bool) uint64 { + // For the first trie, the root lookup block will be at position 3, which is + // the offset for UTF-8 non-ASCII starter bytes. + first := len(b.IndexBlocks) == rootBlockOffset + if first { + b.IndexBlocks = append(b.IndexBlocks, n) + } + + // We special-case the cases where all values recursively are 0. This allows + // for the use of a zero block to which all such values can be directed. + hash := uint64(0) + if n.children != nil || n.values != nil { + hasher := crc64.New(crcTable) + for _, c := range n.children { + var v uint64 + if c != nil { + v = b.computeOffsets(c, false) + } + binary.Write(hasher, binary.BigEndian, v) + } + binary.Write(hasher, binary.BigEndian, n.values) + hash = hasher.Sum64() + } + + if first { + b.indexBlockIdx[hash] = rootBlockOffset - blockOffset + } + + // Compacters don't apply to internal nodes. + if n.children != nil { + v, ok := b.indexBlockIdx[hash] + if !ok { + v = len(b.IndexBlocks) - blockOffset + b.IndexBlocks = append(b.IndexBlocks, n) + b.indexBlockIdx[hash] = v + } + n.index = nodeIndex{0, v} + } else { + h, ok := b.valueBlockIdx[hash] + if !ok { + bestI, bestSize := 0, blockSize*b.ValueSize + for i, c := range b.Compactions[1:] { + if sz, ok := c.c.Size(n.values); ok && bestSize > sz { + bestI, bestSize = i+1, sz + } + } + c := &b.Compactions[bestI] + c.totalSize += bestSize + v := c.c.Store(n.values) + if c.maxHandle < v { + c.maxHandle = v + } + h = nodeIndex{bestI, int(v)} + b.valueBlockIdx[hash] = h + } + n.index = h + } + return hash +} diff --git a/vendor/golang.org/x/text/internal/ucd/example_test.go b/vendor/golang.org/x/text/internal/ucd/example_test.go new file mode 100644 index 0000000000..338a50d1c9 --- /dev/null +++ b/vendor/golang.org/x/text/internal/ucd/example_test.go @@ -0,0 +1,81 @@ +// 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 ucd_test + +import ( + "fmt" + "strings" + + "golang.org/x/text/internal/ucd" +) + +func Example() { + // Read rune-by-rune from UnicodeData. + var count int + p := ucd.New(strings.NewReader(unicodeData)) + for p.Next() { + count++ + if lower := p.Runes(ucd.SimpleLowercaseMapping); lower != nil { + fmt.Printf("lower(%U) -> %U\n", p.Rune(0), lower[0]) + } + } + if err := p.Err(); err != nil { + fmt.Println(err) + } + fmt.Println("Number of runes visited:", count) + + // Read raw ranges from Scripts. + p = ucd.New(strings.NewReader(scripts), ucd.KeepRanges) + for p.Next() { + start, end := p.Range(0) + fmt.Printf("%04X..%04X: %s\n", start, end, p.String(1)) + } + if err := p.Err(); err != nil { + fmt.Println(err) + } + + // Output: + // lower(U+00C0) -> U+00E0 + // lower(U+00C1) -> U+00E1 + // lower(U+00C2) -> U+00E2 + // lower(U+00C3) -> U+00E3 + // lower(U+00C4) -> U+00E4 + // Number of runes visited: 6594 + // 0000..001F: Common + // 0020..0020: Common + // 0021..0023: Common + // 0024..0024: Common +} + +// Excerpt from UnicodeData.txt +const unicodeData = ` +00B9;SUPERSCRIPT ONE;No;0;EN;<super> 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;; +00BA;MASCULINE ORDINAL INDICATOR;Lo;0;L;<super> 006F;;;;N;;;;; +00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;;;; +00BC;VULGAR FRACTION ONE QUARTER;No;0;ON;<fraction> 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;; +00BD;VULGAR FRACTION ONE HALF;No;0;ON;<fraction> 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;; +00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON;<fraction> 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;; +00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;; +00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0; +00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1; +00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2; +00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3; +00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4; + +# A legacy rune range. +3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;; +4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;; +` + +// Excerpt from Scripts.txt +const scripts = ` +# Property: Script +# ================================================ + +0000..001F ; Common # Cc [32] <control-0000>..<control-001F> +0020 ; Common # Zs SPACE +0021..0023 ; Common # Po [3] EXCLAMATION MARK..NUMBER SIGN +0024 ; Common # Sc DOLLAR SIGN +` diff --git a/vendor/golang.org/x/text/internal/ucd/ucd.go b/vendor/golang.org/x/text/internal/ucd/ucd.go new file mode 100644 index 0000000000..2b0d1a1c16 --- /dev/null +++ b/vendor/golang.org/x/text/internal/ucd/ucd.go @@ -0,0 +1,363 @@ +// 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 ucd provides a parser for Unicode Character Database files, the +// format of which is defined in http://www.unicode.org/reports/tr44/. See +// http://www.unicode.org/Public/UCD/latest/ucd/ for example files. +// +// It currently does not support substitutions of missing fields. +package ucd // import "golang.org/x/text/internal/ucd" + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "io" + "log" + "regexp" + "strconv" + "strings" +) + +// UnicodeData.txt fields. +const ( + CodePoint = iota + Name + GeneralCategory + CanonicalCombiningClass + BidiClass + DecompMapping + DecimalValue + DigitValue + NumericValue + BidiMirrored + Unicode1Name + ISOComment + SimpleUppercaseMapping + SimpleLowercaseMapping + SimpleTitlecaseMapping +) + +// Parse calls f for each entry in the given reader of a UCD file. It will close +// the reader upon return. It will call log.Fatal if any error occurred. +// +// This implements the most common usage pattern of using Parser. +func Parse(r io.ReadCloser, f func(p *Parser)) { + defer r.Close() + + p := New(r) + for p.Next() { + f(p) + } + if err := p.Err(); err != nil { + r.Close() // os.Exit will cause defers not to be called. + log.Fatal(err) + } +} + +// An Option is used to configure a Parser. +type Option func(p *Parser) + +func keepRanges(p *Parser) { + p.keepRanges = true +} + +var ( + // KeepRanges prevents the expansion of ranges. The raw ranges can be + // obtained by calling Range(0) on the parser. + KeepRanges Option = keepRanges +) + +// The Part option register a handler for lines starting with a '@'. The text +// after a '@' is available as the first field. Comments are handled as usual. +func Part(f func(p *Parser)) Option { + return func(p *Parser) { + p.partHandler = f + } +} + +// A Parser parses Unicode Character Database (UCD) files. +type Parser struct { + scanner *bufio.Scanner + + keepRanges bool // Don't expand rune ranges in field 0. + + err error + comment []byte + field [][]byte + // parsedRange is needed in case Range(0) is called more than once for one + // field. In some cases this requires scanning ahead. + parsedRange bool + rangeStart, rangeEnd rune + + partHandler func(p *Parser) +} + +func (p *Parser) setError(err error) { + if p.err == nil { + p.err = err + } +} + +func (p *Parser) getField(i int) []byte { + if i >= len(p.field) { + p.setError(fmt.Errorf("ucd: index of field %d out of bounds", i)) + return nil + } + return p.field[i] +} + +// Err returns a non-nil error if any error occurred during parsing. +func (p *Parser) Err() error { + return p.err +} + +// New returns a Parser for the given Reader. +func New(r io.Reader, o ...Option) *Parser { + p := &Parser{ + scanner: bufio.NewScanner(r), + } + for _, f := range o { + f(p) + } + return p +} + +// Next parses the next line in the file. It returns true if a line was parsed +// and false if it reached the end of the file. +func (p *Parser) Next() bool { + if !p.keepRanges && p.rangeStart < p.rangeEnd { + p.rangeStart++ + return true + } + p.comment = nil + p.field = p.field[:0] + p.parsedRange = false + + for p.scanner.Scan() { + b := p.scanner.Bytes() + if len(b) == 0 || b[0] == '#' { + continue + } + + // Parse line + if i := bytes.IndexByte(b, '#'); i != -1 { + p.comment = bytes.TrimSpace(b[i+1:]) + b = b[:i] + } + if b[0] == '@' { + if p.partHandler != nil { + p.field = append(p.field, bytes.TrimSpace(b[1:])) + p.partHandler(p) + p.field = p.field[:0] + } + p.comment = nil + continue + } + for { + i := bytes.IndexByte(b, ';') + if i == -1 { + p.field = append(p.field, bytes.TrimSpace(b)) + break + } + p.field = append(p.field, bytes.TrimSpace(b[:i])) + b = b[i+1:] + } + if !p.keepRanges { + p.rangeStart, p.rangeEnd = p.getRange(0) + } + return true + } + p.setError(p.scanner.Err()) + return false +} + +func parseRune(b []byte) (rune, error) { + if len(b) > 2 && b[0] == 'U' && b[1] == '+' { + b = b[2:] + } + x, err := strconv.ParseUint(string(b), 16, 32) + return rune(x), err +} + +func (p *Parser) parseRune(b []byte) rune { + x, err := parseRune(b) + p.setError(err) + return x +} + +// Rune parses and returns field i as a rune. +func (p *Parser) Rune(i int) rune { + if i > 0 || p.keepRanges { + return p.parseRune(p.getField(i)) + } + return p.rangeStart +} + +// Runes interprets and returns field i as a sequence of runes. +func (p *Parser) Runes(i int) (runes []rune) { + add := func(b []byte) { + if b = bytes.TrimSpace(b); len(b) > 0 { + runes = append(runes, p.parseRune(b)) + } + } + for b := p.getField(i); ; { + i := bytes.IndexByte(b, ' ') + if i == -1 { + add(b) + break + } + add(b[:i]) + b = b[i+1:] + } + return +} + +var ( + errIncorrectLegacyRange = errors.New("ucd: unmatched <* First>") + + // reRange matches one line of a legacy rune range. + reRange = regexp.MustCompile("^([0-9A-F]*);<([^,]*), ([^>]*)>(.*)$") +) + +// Range parses and returns field i as a rune range. A range is inclusive at +// both ends. If the field only has one rune, first and last will be identical. +// It supports the legacy format for ranges used in UnicodeData.txt. +func (p *Parser) Range(i int) (first, last rune) { + if !p.keepRanges { + return p.rangeStart, p.rangeStart + } + return p.getRange(i) +} + +func (p *Parser) getRange(i int) (first, last rune) { + b := p.getField(i) + if k := bytes.Index(b, []byte("..")); k != -1 { + return p.parseRune(b[:k]), p.parseRune(b[k+2:]) + } + // The first field may not be a rune, in which case we may ignore any error + // and set the range as 0..0. + x, err := parseRune(b) + if err != nil { + // Disable range parsing henceforth. This ensures that an error will be + // returned if the user subsequently will try to parse this field as + // a Rune. + p.keepRanges = true + } + // Special case for UnicodeData that was retained for backwards compatibility. + if i == 0 && len(p.field) > 1 && bytes.HasSuffix(p.field[1], []byte("First>")) { + if p.parsedRange { + return p.rangeStart, p.rangeEnd + } + mf := reRange.FindStringSubmatch(p.scanner.Text()) + if mf == nil || !p.scanner.Scan() { + p.setError(errIncorrectLegacyRange) + return x, x + } + // Using Bytes would be more efficient here, but Text is a lot easier + // and this is not a frequent case. + ml := reRange.FindStringSubmatch(p.scanner.Text()) + if ml == nil || mf[2] != ml[2] || ml[3] != "Last" || mf[4] != ml[4] { + p.setError(errIncorrectLegacyRange) + return x, x + } + p.rangeStart, p.rangeEnd = x, p.parseRune(p.scanner.Bytes()[:len(ml[1])]) + p.parsedRange = true + return p.rangeStart, p.rangeEnd + } + return x, x +} + +// bools recognizes all valid UCD boolean values. +var bools = map[string]bool{ + "": false, + "N": false, + "No": false, + "F": false, + "False": false, + "Y": true, + "Yes": true, + "T": true, + "True": true, +} + +// Bool parses and returns field i as a boolean value. +func (p *Parser) Bool(i int) bool { + b := p.getField(i) + for s, v := range bools { + if bstrEq(b, s) { + return v + } + } + p.setError(strconv.ErrSyntax) + return false +} + +// Int parses and returns field i as an integer value. +func (p *Parser) Int(i int) int { + x, err := strconv.ParseInt(string(p.getField(i)), 10, 64) + p.setError(err) + return int(x) +} + +// Uint parses and returns field i as an unsigned integer value. +func (p *Parser) Uint(i int) uint { + x, err := strconv.ParseUint(string(p.getField(i)), 10, 64) + p.setError(err) + return uint(x) +} + +// Float parses and returns field i as a decimal value. +func (p *Parser) Float(i int) float64 { + x, err := strconv.ParseFloat(string(p.getField(i)), 64) + p.setError(err) + return x +} + +// String parses and returns field i as a string value. +func (p *Parser) String(i int) string { + return string(p.getField(i)) +} + +// Strings parses and returns field i as a space-separated list of strings. +func (p *Parser) Strings(i int) []string { + ss := strings.Split(string(p.getField(i)), " ") + for i, s := range ss { + ss[i] = strings.TrimSpace(s) + } + return ss +} + +// Comment returns the comments for the current line. +func (p *Parser) Comment() string { + return string(p.comment) +} + +var errUndefinedEnum = errors.New("ucd: undefined enum value") + +// Enum interprets and returns field i as a value that must be one of the values +// in enum. +func (p *Parser) Enum(i int, enum ...string) string { + b := p.getField(i) + for _, s := range enum { + if bstrEq(b, s) { + return s + } + } + p.setError(errUndefinedEnum) + return "" +} + +func bstrEq(b []byte, s string) bool { + if len(b) != len(s) { + return false + } + for i, c := range b { + if c != s[i] { + return false + } + } + return true +} diff --git a/vendor/golang.org/x/text/internal/ucd/ucd_test.go b/vendor/golang.org/x/text/internal/ucd/ucd_test.go new file mode 100644 index 0000000000..11a6542e41 --- /dev/null +++ b/vendor/golang.org/x/text/internal/ucd/ucd_test.go @@ -0,0 +1,105 @@ +package ucd + +import ( + "strings" + "testing" +) + +const file = ` +# Comments should be skipped +# rune; bool; uint; int; float; runes; # Y +0..0005; Y; 0; 2; -5.25 ; 0 1 2 3 4 5; +6..0007; Yes ; 6; 1; -4.25 ; 0006 0007; +8; T ; 8 ; 0 ;-3.25 ;;# T +9; True ;9 ; -1;-2.25 ; 0009; + +# more comments to be ignored +@Part0 + +A; N; 10 ; -2; -1.25; ;# N +B; No; 11 ; -3; -0.25; +C; False;12; -4; 0.75; +D; ;13;-5;1.75; + +@Part1 # Another part. +# We test part comments get removed by not commenting the the next line. +E..10FFFF; F; 14 ; -6; 2.75; +` + +var want = []struct { + start, end rune +}{ + {0x00, 0x05}, + {0x06, 0x07}, + {0x08, 0x08}, + {0x09, 0x09}, + {0x0A, 0x0A}, + {0x0B, 0x0B}, + {0x0C, 0x0C}, + {0x0D, 0x0D}, + {0x0E, 0x10FFFF}, +} + +func TestGetters(t *testing.T) { + parts := [][2]string{ + {"Part0", ""}, + {"Part1", "Another part."}, + } + handler := func(p *Parser) { + if len(parts) == 0 { + t.Error("Part handler invoked too many times.") + return + } + want := parts[0] + parts = parts[1:] + if got0, got1 := p.String(0), p.Comment(); got0 != want[0] || got1 != want[1] { + t.Errorf(`part: got %q, %q; want %q"`, got0, got1, want) + } + } + + p := New(strings.NewReader(file), KeepRanges, Part(handler)) + for i := 0; p.Next(); i++ { + start, end := p.Range(0) + w := want[i] + if start != w.start || end != w.end { + t.Fatalf("%d:Range(0); got %#x..%#x; want %#x..%#x", i, start, end, w.start, w.end) + } + if w.start == w.end && p.Rune(0) != w.start { + t.Errorf("%d:Range(0).start: got %U; want %U", i, p.Rune(0), w.start) + } + if got, want := p.Bool(1), w.start <= 9; got != want { + t.Errorf("%d:Bool(1): got %v; want %v", i, got, want) + } + if got := p.Rune(4); got != 0 || p.Err() == nil { + t.Errorf("%d:Rune(%q): got no error; want error", i, p.String(1)) + } + p.err = nil + if got := p.Uint(2); rune(got) != start { + t.Errorf("%d:Uint(2): got %v; want %v", i, got, start) + } + if got, want := p.Int(3), 2-i; got != want { + t.Errorf("%d:Int(3): got %v; want %v", i, got, want) + } + if got, want := p.Float(4), -5.25+float64(i); got != want { + t.Errorf("%d:Int(3): got %v; want %v", i, got, want) + } + if got := p.Runes(5); got == nil { + if p.String(5) != "" { + t.Errorf("%d:Runes(5): expected non-empty list", i) + } + } else { + if got[0] != start || got[len(got)-1] != end { + t.Errorf("%d:Runes(5): got %#x; want %#x..%#x", i, got, start, end) + } + } + if got := p.Comment(); got != "" && got != p.String(1) { + t.Errorf("%d:Comment(): got %v; want %v", i, got, p.String(1)) + } + } + if err := p.Err(); err != nil { + t.Errorf("Parser error: %v", err) + } + if len(parts) != 0 { + t.Errorf("expected %d more invocations of part handler", len(parts)) + } +} diff --git a/vendor/golang.org/x/text/internal/utf8internal/utf8internal.go b/vendor/golang.org/x/text/internal/utf8internal/utf8internal.go new file mode 100644 index 0000000000..575cea8707 --- /dev/null +++ b/vendor/golang.org/x/text/internal/utf8internal/utf8internal.go @@ -0,0 +1,87 @@ +// 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 utf8internal contains low-level utf8-related constants, tables, etc. +// that are used internally by the text package. +package utf8internal + +// The default lowest and highest continuation byte. +const ( + LoCB = 0x80 // 1000 0000 + HiCB = 0xBF // 1011 1111 +) + +// Constants related to getting information of first bytes of UTF-8 sequences. +const ( + // ASCII identifies a UTF-8 byte as ASCII. + ASCII = as + + // FirstInvalid indicates a byte is invalid as a first byte of a UTF-8 + // sequence. + FirstInvalid = xx + + // SizeMask is a mask for the size bits. Use use x&SizeMask to get the size. + SizeMask = 7 + + // AcceptShift is the right-shift count for the first byte info byte to get + // the index into the AcceptRanges table. See AcceptRanges. + AcceptShift = 4 + + // The names of these constants are chosen to give nice alignment in the + // table below. The first nibble is an index into acceptRanges or F for + // special one-byte cases. The second nibble is the Rune length or the + // Status for the special one-byte case. + xx = 0xF1 // invalid: size 1 + as = 0xF0 // ASCII: size 1 + s1 = 0x02 // accept 0, size 2 + s2 = 0x13 // accept 1, size 3 + s3 = 0x03 // accept 0, size 3 + s4 = 0x23 // accept 2, size 3 + s5 = 0x34 // accept 3, size 4 + s6 = 0x04 // accept 0, size 4 + s7 = 0x44 // accept 4, size 4 +) + +// First is information about the first byte in a UTF-8 sequence. +var First = [256]uint8{ + // 1 2 3 4 5 6 7 8 9 A B C D E F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x00-0x0F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x10-0x1F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x20-0x2F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x30-0x3F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x40-0x4F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x50-0x5F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x60-0x6F + as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x70-0x7F + // 1 2 3 4 5 6 7 8 9 A B C D E F + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0x80-0x8F + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0x90-0x9F + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xA0-0xAF + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xB0-0xBF + xx, xx, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, // 0xC0-0xCF + s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, // 0xD0-0xDF + s2, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s4, s3, s3, // 0xE0-0xEF + s5, s6, s6, s6, s7, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xF0-0xFF +} + +// AcceptRange gives the range of valid values for the second byte in a UTF-8 +// sequence for any value for First that is not ASCII or FirstInvalid. +type AcceptRange struct { + Lo uint8 // lowest value for second byte. + Hi uint8 // highest value for second byte. +} + +// AcceptRanges is a slice of AcceptRange values. For a given byte sequence b +// +// AcceptRanges[First[b[0]]>>AcceptShift] +// +// will give the value of AcceptRange for the multi-byte UTF-8 sequence starting +// at b[0]. +var AcceptRanges = [...]AcceptRange{ + 0: {LoCB, HiCB}, + 1: {0xA0, HiCB}, + 2: {LoCB, 0x9F}, + 3: {0x90, HiCB}, + 4: {LoCB, 0x8F}, +} diff --git a/vendor/golang.org/x/text/language/Makefile b/vendor/golang.org/x/text/language/Makefile new file mode 100644 index 0000000000..79f005784f --- /dev/null +++ b/vendor/golang.org/x/text/language/Makefile @@ -0,0 +1,16 @@ +# Copyright 2013 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. + +CLEANFILES+=maketables + +maketables: maketables.go + go build $^ + +tables: maketables + ./maketables > tables.go + gofmt -w -s tables.go + +# Build (but do not run) maketables during testing, +# just to make sure it still compiles. +testshort: maketables diff --git a/vendor/golang.org/x/text/language/common.go b/vendor/golang.org/x/text/language/common.go new file mode 100644 index 0000000000..a255bb0a50 --- /dev/null +++ b/vendor/golang.org/x/text/language/common.go @@ -0,0 +1,16 @@ +// This file was generated by go generate; DO NOT EDIT + +package language + +// This file contains code common to the maketables.go and the package code. + +// langAliasType is the type of an alias in langAliasMap. +type langAliasType int8 + +const ( + langDeprecated langAliasType = iota + langMacro + langLegacy + + langAliasTypeUnknown langAliasType = -1 +) diff --git a/vendor/golang.org/x/text/language/coverage.go b/vendor/golang.org/x/text/language/coverage.go new file mode 100644 index 0000000000..101fd23c1d --- /dev/null +++ b/vendor/golang.org/x/text/language/coverage.go @@ -0,0 +1,197 @@ +// 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 language + +import ( + "fmt" + "sort" +) + +// The Coverage interface is used to define the level of coverage of an +// internationalization service. Note that not all types are supported by all +// services. As lists may be generated on the fly, it is recommended that users +// of a Coverage cache the results. +type Coverage interface { + // Tags returns the list of supported tags. + Tags() []Tag + + // BaseLanguages returns the list of supported base languages. + BaseLanguages() []Base + + // Scripts returns the list of supported scripts. + Scripts() []Script + + // Regions returns the list of supported regions. + Regions() []Region +} + +var ( + // Supported defines a Coverage that lists all supported subtags. Tags + // always returns nil. + Supported Coverage = allSubtags{} +) + +// TODO: +// - Support Variants, numbering systems. +// - CLDR coverage levels. +// - Set of common tags defined in this package. + +type allSubtags struct{} + +// Regions returns the list of supported regions. As all regions are in a +// consecutive range, it simply returns a slice of numbers in increasing order. +// The "undefined" region is not returned. +func (s allSubtags) Regions() []Region { + reg := make([]Region, numRegions) + for i := range reg { + reg[i] = Region{regionID(i + 1)} + } + return reg +} + +// Scripts returns the list of supported scripts. As all scripts are in a +// consecutive range, it simply returns a slice of numbers in increasing order. +// The "undefined" script is not returned. +func (s allSubtags) Scripts() []Script { + scr := make([]Script, numScripts) + for i := range scr { + scr[i] = Script{scriptID(i + 1)} + } + return scr +} + +// BaseLanguages returns the list of all supported base languages. It generates +// the list by traversing the internal structures. +func (s allSubtags) BaseLanguages() []Base { + base := make([]Base, 0, numLanguages) + for i := 0; i < langNoIndexOffset; i++ { + // We included "und" already for the value 0. + if i != nonCanonicalUnd { + base = append(base, Base{langID(i)}) + } + } + i := langNoIndexOffset + for _, v := range langNoIndex { + for k := 0; k < 8; k++ { + if v&1 == 1 { + base = append(base, Base{langID(i)}) + } + v >>= 1 + i++ + } + } + return base +} + +// Tags always returns nil. +func (s allSubtags) Tags() []Tag { + return nil +} + +// coverage is used used by NewCoverage which is used as a convenient way for +// creating Coverage implementations for partially defined data. Very often a +// package will only need to define a subset of slices. coverage provides a +// convenient way to do this. Moreover, packages using NewCoverage, instead of +// their own implementation, will not break if later new slice types are added. +type coverage struct { + tags func() []Tag + bases func() []Base + scripts func() []Script + regions func() []Region +} + +func (s *coverage) Tags() []Tag { + if s.tags == nil { + return nil + } + return s.tags() +} + +// bases implements sort.Interface and is used to sort base languages. +type bases []Base + +func (b bases) Len() int { + return len(b) +} + +func (b bases) Swap(i, j int) { + b[i], b[j] = b[j], b[i] +} + +func (b bases) Less(i, j int) bool { + return b[i].langID < b[j].langID +} + +// BaseLanguages returns the result from calling s.bases if it is specified or +// otherwise derives the set of supported base languages from tags. +func (s *coverage) BaseLanguages() []Base { + if s.bases == nil { + tags := s.Tags() + if len(tags) == 0 { + return nil + } + a := make([]Base, len(tags)) + for i, t := range tags { + a[i] = Base{langID(t.lang)} + } + sort.Sort(bases(a)) + k := 0 + for i := 1; i < len(a); i++ { + if a[k] != a[i] { + k++ + a[k] = a[i] + } + } + return a[:k+1] + } + return s.bases() +} + +func (s *coverage) Scripts() []Script { + if s.scripts == nil { + return nil + } + return s.scripts() +} + +func (s *coverage) Regions() []Region { + if s.regions == nil { + return nil + } + return s.regions() +} + +// NewCoverage returns a Coverage for the given lists. It is typically used by +// packages providing internationalization services to define their level of +// coverage. A list may be of type []T or func() []T, where T is either Tag, +// Base, Script or Region. The returned Coverage derives the value for Bases +// from Tags if no func or slice for []Base is specified. For other unspecified +// types the returned Coverage will return nil for the respective methods. +func NewCoverage(list ...interface{}) Coverage { + s := &coverage{} + for _, x := range list { + switch v := x.(type) { + case func() []Base: + s.bases = v + case func() []Script: + s.scripts = v + case func() []Region: + s.regions = v + case func() []Tag: + s.tags = v + case []Base: + s.bases = func() []Base { return v } + case []Script: + s.scripts = func() []Script { return v } + case []Region: + s.regions = func() []Region { return v } + case []Tag: + s.tags = func() []Tag { return v } + default: + panic(fmt.Sprintf("language: unsupported set type %T", v)) + } + } + return s +} diff --git a/vendor/golang.org/x/text/language/coverage_test.go b/vendor/golang.org/x/text/language/coverage_test.go new file mode 100644 index 0000000000..8e08e5ca4c --- /dev/null +++ b/vendor/golang.org/x/text/language/coverage_test.go @@ -0,0 +1,154 @@ +// 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 language + +import ( + "fmt" + "reflect" + "testing" +) + +func TestSupported(t *testing.T) { + // To prove the results are correct for a type, we test that the number of + // results is identical to the number of results on record, that all results + // are distinct and that all results are valid. + tests := map[string]int{ + "BaseLanguages": numLanguages, + "Scripts": numScripts, + "Regions": numRegions, + "Tags": 0, + } + sup := reflect.ValueOf(Supported) + for name, num := range tests { + v := sup.MethodByName(name).Call(nil)[0] + if n := v.Len(); n != num { + t.Errorf("len(%s()) was %d; want %d", name, n, num) + } + dup := make(map[string]bool) + for i := 0; i < v.Len(); i++ { + x := v.Index(i).Interface() + // An invalid value will either cause a crash or result in a + // duplicate when passed to Sprint. + s := fmt.Sprint(x) + if dup[s] { + t.Errorf("%s: duplicate entry %q", name, s) + } + dup[s] = true + } + if len(dup) != v.Len() { + t.Errorf("%s: # unique entries was %d; want %d", name, len(dup), v.Len()) + } + } +} + +func TestNewCoverage(t *testing.T) { + bases := []Base{Base{0}, Base{3}, Base{7}} + scripts := []Script{Script{11}, Script{17}, Script{23}} + regions := []Region{Region{101}, Region{103}, Region{107}} + tags := []Tag{Make("pt"), Make("en"), Make("en-GB"), Make("en-US"), Make("pt-PT")} + fbases := func() []Base { return bases } + fscripts := func() []Script { return scripts } + fregions := func() []Region { return regions } + ftags := func() []Tag { return tags } + + tests := []struct { + desc string + list []interface{} + bases []Base + scripts []Script + regions []Region + tags []Tag + }{ + { + desc: "empty", + }, + { + desc: "bases", + list: []interface{}{bases}, + bases: bases, + }, + { + desc: "scripts", + list: []interface{}{scripts}, + scripts: scripts, + }, + { + desc: "regions", + list: []interface{}{regions}, + regions: regions, + }, + { + desc: "bases derives from tags", + list: []interface{}{tags}, + bases: []Base{Base{_en}, Base{_pt}}, + tags: tags, + }, + { + desc: "tags and bases", + list: []interface{}{tags, bases}, + bases: bases, + tags: tags, + }, + { + desc: "fully specified", + list: []interface{}{tags, bases, scripts, regions}, + bases: bases, + scripts: scripts, + regions: regions, + tags: tags, + }, + { + desc: "bases func", + list: []interface{}{fbases}, + bases: bases, + }, + { + desc: "scripts func", + list: []interface{}{fscripts}, + scripts: scripts, + }, + { + desc: "regions func", + list: []interface{}{fregions}, + regions: regions, + }, + { + desc: "tags func", + list: []interface{}{ftags}, + bases: []Base{Base{_en}, Base{_pt}}, + tags: tags, + }, + { + desc: "tags and bases", + list: []interface{}{ftags, fbases}, + bases: bases, + tags: tags, + }, + { + desc: "fully specified", + list: []interface{}{ftags, fbases, fscripts, fregions}, + bases: bases, + scripts: scripts, + regions: regions, + tags: tags, + }, + } + + for i, tt := range tests { + l := NewCoverage(tt.list...) + if a := l.BaseLanguages(); !reflect.DeepEqual(a, tt.bases) { + t.Errorf("%d:%s: BaseLanguages was %v; want %v", i, tt.desc, a, tt.bases) + } + if a := l.Scripts(); !reflect.DeepEqual(a, tt.scripts) { + t.Errorf("%d:%s: Scripts was %v; want %v", i, tt.desc, a, tt.scripts) + } + if a := l.Regions(); !reflect.DeepEqual(a, tt.regions) { + t.Errorf("%d:%s: Regions was %v; want %v", i, tt.desc, a, tt.regions) + } + if a := l.Tags(); !reflect.DeepEqual(a, tt.tags) { + t.Errorf("%d:%s: Tags was %v; want %v", i, tt.desc, a, tt.tags) + } + } +} diff --git a/vendor/golang.org/x/text/language/data_test.go b/vendor/golang.org/x/text/language/data_test.go new file mode 100644 index 0000000000..738df46783 --- /dev/null +++ b/vendor/golang.org/x/text/language/data_test.go @@ -0,0 +1,416 @@ +// Copyright 2013 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 language + +type matchTest struct { + comment string + supported string + test []struct{ match, desired string } +} + +var matchTests = []matchTest{ + { + "basics", + "fr, en-GB, en", + []struct{ match, desired string }{ + {"en-GB", "en-GB"}, + {"en", "en-US"}, + {"fr", "fr-FR"}, + {"fr", "ja-JP"}, + }, + }, + { + "script fallbacks", + "zh-CN, zh-TW, iw", + []struct{ match, desired string }{ + {"zh-TW", "zh-Hant"}, + {"zh-CN", "zh"}, + {"zh-CN", "zh-Hans-CN"}, + {"zh-TW", "zh-Hant-HK"}, + {"iw", "he-IT"}, + }, + }, + { + "language-specific script fallbacks 1", + "en, sr, nl", + []struct{ match, desired string }{ + {"sr", "sr-Latn"}, + {"en", "sh"}, + {"en", "hr"}, + {"en", "bs"}, + {"en", "nl-Cyrl"}, + }, + }, + { + "language-specific script fallbacks 2", + "en, sh", + []struct{ match, desired string }{ + {"sh", "sr"}, + {"sh", "sr-Cyrl"}, + {"sh", "hr"}, + }, + }, + { + "both deprecated and not", + "fil, tl, iw, he", + []struct{ match, desired string }{ + {"he", "he-IT"}, + {"he", "he"}, + {"iw", "iw"}, + {"fil", "fil-IT"}, + {"fil", "fil"}, + {"tl", "tl"}, + }, + }, + { + "nearby languages", + "en, fil, ro, nn", + []struct{ match, desired string }{ + {"fil", "tl"}, + {"ro", "mo"}, + {"nn", "nb"}, + {"en", "ja"}, // make sure default works + }, + }, + { + "nearby languages: Nynorsk to Bokmål", + "en, nb", + []struct{ match, desired string }{ + {"nb", "nn"}, + }, + }, + { + "nearby languages: Danish does not match nn", + "en, nn", + []struct{ match, desired string }{ + {"en", "da"}, + }, + }, + { + "nearby languages: Danish matches no", + "en, no", + []struct{ match, desired string }{ + {"no", "da"}, + }, + }, + { + "nearby languages: Danish matches nb", + "en, nb", + []struct{ match, desired string }{ + {"nb", "da"}, + }, + }, + { + "prefer matching languages over language variants.", + "nn, en-GB", + []struct{ match, desired string }{ + {"en-GB", "no, en-US"}, + {"en-GB", "nb, en-US"}, + }, + }, + { + "deprecated version is closer than same language with other differences", + "nl, he, en-GB", + []struct{ match, desired string }{ + {"he", "iw, en-US"}, + }, + }, + { + "macro equivalent is closer than same language with other differences", + "nl, zh, en-GB, no", + []struct{ match, desired string }{ + {"zh", "cmn, en-US"}, + {"no", "nb, en-US"}, + }, + }, + { + "legacy equivalent is closer than same language with other differences", + "nl, fil, en-GB", + []struct{ match, desired string }{ + {"fil", "tl, en-US"}, + }, + }, + { + "exact over equivalent", + "en, ro, mo, ro-MD", + []struct{ match, desired string }{ + {"ro", "ro"}, + {"mo", "mo"}, + {"ro-MD", "ro-MD"}, + }, + }, + { + "maximization of legacy", + "sr-Cyrl, sr-Latn, ro, ro-MD", + []struct{ match, desired string }{ + {"sr-Latn", "sh"}, + {"ro-MD", "mo"}, + }, + }, + { + "empty", + "", + []struct{ match, desired string }{ + {"und", "fr"}, + {"und", "en"}, + }, + }, + { + "private use subtags", + "fr, en-GB, x-bork, es-ES, es-419", + []struct{ match, desired string }{ + {"fr", "x-piglatin"}, + {"x-bork", "x-bork"}, + }, + }, + { + "grandfathered codes", + "fr, i-klingon, en-Latn-US", + []struct{ match, desired string }{ + {"en-Latn-US", "en-GB-oed"}, + {"tlh", "i-klingon"}, + }, + }, + { + "exact match", + "fr, en-GB, ja, es-ES, es-MX", + []struct{ match, desired string }{ + {"ja", "ja, de"}, + }, + }, + { + "simple variant match", + "fr, en-GB, ja, es-ES, es-MX", + []struct{ match, desired string }{ + // Intentionally avoiding a perfect-match or two candidates for variant matches. + {"en-GB", "de, en-US"}, + // Fall back. + {"fr", "de, zh"}, + }, + }, + { + "best match for traditional Chinese", + // Scenario: An application that only supports Simplified Chinese (and some + // other languages), but does not support Traditional Chinese. zh-Hans-CN + // could be replaced with zh-CN, zh, or zh-Hans, it wouldn't make much of + // a difference. + "fr, zh-Hans-CN, en-US", + []struct{ match, desired string }{ + {"zh-Hans-CN", "zh-TW"}, + {"zh-Hans-CN", "zh-Hant"}, + // One can avoid a zh-Hant to zh-Hans match by including a second language + // preference which is a better match. + {"en-US", "zh-TW, en"}, + {"en-US", "zh-Hant-CN, en"}, + {"zh-Hans-CN", "zh-Hans, en"}, + }, + }, + // More specific region and script tie-breakers. + { + "more specific script should win in case regions are identical", + "af, af-Latn, af-Arab", + []struct{ match, desired string }{ + {"af", "af"}, + {"af", "af-ZA"}, + {"af-Latn", "af-Latn-ZA"}, + {"af-Latn", "af-Latn"}, + }, + }, + { + "more specific region should win", + "nl, nl-NL, nl-BE", + []struct{ match, desired string }{ + {"nl", "nl"}, + {"nl", "nl-Latn"}, + {"nl-NL", "nl-Latn-NL"}, + {"nl-NL", "nl-NL"}, + }, + }, + { + "more specific region wins over more specific script", + "nl, nl-Latn, nl-NL, nl-BE", + []struct{ match, desired string }{ + {"nl", "nl"}, + {"nl-Latn", "nl-Latn"}, + {"nl-NL", "nl-NL"}, + {"nl-NL", "nl-Latn-NL"}, + }, + }, + // Region distance tie-breakers. + { + "region distance Portuguese", + "pt, pt-PT", + []struct{ match, desired string }{ + {"pt-PT", "pt-ES"}, + }, + }, + { + "region distance French", + "en, fr, fr-CA, fr-CH", + []struct{ match, desired string }{ + {"fr-CA", "fr-US"}, + }, + }, + { + "region distance German", + "de-AT, de-DE, de-CH", + []struct{ match, desired string }{ + {"de-DE", "de"}, + }, + }, + { + "en-AU is closer to en-GB than to en (which is en-US)", + "en, en-GB, es-ES, es-419", + []struct{ match, desired string }{ + {"en-GB", "en-AU"}, + {"es-419", "es-MX"}, + {"es-ES", "es-PT"}, + }, + }, + // Test exceptions with "und". + // When the undefined language doesn't match anything in the list, return the default, as usual. + // max("und") = "en-Latn-US", and since matching is based on maximized tags, the undefined + // language would normally match English. But that would produce the counterintuitive results. + // Matching "und" to "it,en" would be "en" matching "en" to "it,und" would be "und". + // To avoid this max("und") is defined as "und" + { + "undefined", + "it, fr", + []struct{ match, desired string }{ + {"it", "und"}, + }, + }, + { + "und does not match en", + "it, en", + []struct{ match, desired string }{ + {"it", "und"}, + }, + }, + { + "undefined in priority list", + "it, und", + []struct{ match, desired string }{ + {"und", "und"}, + {"it", "en"}, + }, + }, + // Undefined scripts and regions. + { + "undefined", + "it, fr, zh", + []struct{ match, desired string }{ + {"fr", "und-FR"}, + {"zh", "und-CN"}, + {"zh", "und-Hans"}, + {"zh", "und-Hant"}, + {"it", "und-Latn"}, + }, + }, + // Early termination conditions: do not consider all desired strings if + // a match is good enough. + { + "match on maximized tag", + "fr, en-GB, ja, es-ES, es-MX", + []struct{ match, desired string }{ + // ja-JP matches ja on likely subtags, and it's listed first, + // thus it wins over the second preference en-GB. + {"ja", "ja-JP, en-GB"}, + {"ja", "ja-Jpan-JP, en-GB"}, + }, + }, + { + "pick best maximized tag", + "ja, ja-Jpan-US, ja-JP, en, ru", + []struct{ match, desired string }{ + {"ja", "ja-Jpan, ru"}, + {"ja-JP", "ja-JP, ru"}, + {"ja-Jpan-US", "ja-US, ru"}, + }, + }, + { + "termination: pick best maximized match", + "ja, ja-Jpan, ja-JP, en, ru", + []struct{ match, desired string }{ + {"ja-JP", "ja-Jpan-JP, ru"}, + {"ja-Jpan", "ja-Jpan, ru"}, + }, + }, + { + "no match on maximized", + "en, de, fr, ja", + []struct{ match, desired string }{ + // de maximizes to de-DE. + // Pick the exact match for the secondary language instead. + {"fr", "de-CH, fr"}, + }, + }, + + // Test that the CLDR parent relations are correctly preserved by the matcher. + // These matches may change for different CLDR versions. + { + "parent relation preserved", + "en, en-US, en-GB, es, es-419, pt, pt-BR, pt-PT, zh, zh-Hant, zh-Hant-HK", + []struct{ match, desired string }{ + {"en-GB", "en-150"}, + {"en-GB", "en-AU"}, + {"en-GB", "en-BE"}, + {"en-GB", "en-GG"}, + {"en-GB", "en-GI"}, + {"en-GB", "en-HK"}, + {"en-GB", "en-IE"}, + {"en-GB", "en-IM"}, + {"en-GB", "en-IN"}, + {"en-GB", "en-JE"}, + {"en-GB", "en-MT"}, + {"en-GB", "en-NZ"}, + {"en-GB", "en-PK"}, + {"en-GB", "en-SG"}, + {"en-GB", "en-DE"}, + {"en-GB", "en-MT"}, + {"es-419", "es-AR"}, + {"es-419", "es-BO"}, + {"es-419", "es-CL"}, + {"es-419", "es-CO"}, + {"es-419", "es-CR"}, + {"es-419", "es-CU"}, + {"es-419", "es-DO"}, + {"es-419", "es-EC"}, + {"es-419", "es-GT"}, + {"es-419", "es-HN"}, + {"es-419", "es-MX"}, + {"es-419", "es-NI"}, + {"es-419", "es-PA"}, + {"es-419", "es-PE"}, + {"es-419", "es-PR"}, + {"es-419", "es-PY"}, + {"es-419", "es-SV"}, + {"es-419", "es-US"}, + {"es-419", "es-UY"}, + {"es-419", "es-VE"}, + {"pt-PT", "pt-AO"}, + {"pt-PT", "pt-CV"}, + {"pt-PT", "pt-GW"}, + {"pt-PT", "pt-MO"}, + {"pt-PT", "pt-MZ"}, + {"pt-PT", "pt-ST"}, + {"pt-PT", "pt-TL"}, + // TODO for CLDR 24+ + // - en-001 + // - {"zh-Hant-HK", "zh-Hant-MO"}, + }, + }, + // Options and variants are inherited from user-defined settings. + { + "preserve Unicode extension", + "en, de, sl-nedis", + []struct{ match, desired string }{ + {"de-u-co-phonebk", "de-FR-u-co-phonebk"}, + {"sl-nedis-u-cu-eur", "sl-nedis-u-cu-eur"}, + {"sl-nedis-u-cu-eur", "sl-u-cu-eur"}, + {"sl-nedis-u-cu-eur", "sl-HR-nedis-u-cu-eur"}, + }, + }, +} diff --git a/vendor/golang.org/x/text/language/display/dict.go b/vendor/golang.org/x/text/language/display/dict.go new file mode 100644 index 0000000000..52c11a9321 --- /dev/null +++ b/vendor/golang.org/x/text/language/display/dict.go @@ -0,0 +1,92 @@ +// 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 display + +// This file contains sets of data for specific languages. Users can use these +// to create smaller collections of supported languages and reduce total table +// size. + +// The variable names defined here correspond to those in package language. + +var ( + Afrikaans *Dictionary = &af // af + Amharic *Dictionary = &am // am + Arabic *Dictionary = &ar // ar + ModernStandardArabic *Dictionary = Arabic // ar-001 + Azerbaijani *Dictionary = &az // az + Bulgarian *Dictionary = &bg // bg + Bengali *Dictionary = &bn // bn + Catalan *Dictionary = &ca // ca + Czech *Dictionary = &cs // cs + Danish *Dictionary = &da // da + German *Dictionary = &de // de + Greek *Dictionary = &el // el + English *Dictionary = &en // en + AmericanEnglish *Dictionary = English // en-US + BritishEnglish *Dictionary = English // en-GB + Spanish *Dictionary = &es // es + EuropeanSpanish *Dictionary = Spanish // es-ES + LatinAmericanSpanish *Dictionary = Spanish // es-419 + Estonian *Dictionary = &et // et + Persian *Dictionary = &fa // fa + Finnish *Dictionary = &fi // fi + Filipino *Dictionary = &fil // fil + French *Dictionary = &fr // fr + Gujarati *Dictionary = &gu // gu + Hebrew *Dictionary = &he // he + Hindi *Dictionary = &hi // hi + Croatian *Dictionary = &hr // hr + Hungarian *Dictionary = &hu // hu + Armenian *Dictionary = &hy // hy + Indonesian *Dictionary = &id // id + Icelandic *Dictionary = &is // is + Italian *Dictionary = &it // it + Japanese *Dictionary = &ja // ja + Georgian *Dictionary = &ka // ka + Kazakh *Dictionary = &kk // kk + Khmer *Dictionary = &km // km + Kannada *Dictionary = &kn // kn + Korean *Dictionary = &ko // ko + Kirghiz *Dictionary = &ky // ky + Lao *Dictionary = &lo // lo + Lithuanian *Dictionary = < // lt + Latvian *Dictionary = &lv // lv + Macedonian *Dictionary = &mk // mk + Malayalam *Dictionary = &ml // ml + Mongolian *Dictionary = &mn // mn + Marathi *Dictionary = &mr // mr + Malay *Dictionary = &ms // ms + Burmese *Dictionary = &my // my + Nepali *Dictionary = &ne // ne + Dutch *Dictionary = &nl // nl + Norwegian *Dictionary = &no // no + Punjabi *Dictionary = &pa // pa + Polish *Dictionary = &pl // pl + Portuguese *Dictionary = &pt // pt + BrazilianPortuguese *Dictionary = Portuguese // pt-BR + EuropeanPortuguese *Dictionary = &ptPT // pt-PT + Romanian *Dictionary = &ro // ro + Russian *Dictionary = &ru // ru + Sinhala *Dictionary = &si // si + Slovak *Dictionary = &sk // sk + Slovenian *Dictionary = &sl // sl + Albanian *Dictionary = &sq // sq + Serbian *Dictionary = &sr // sr + SerbianLatin *Dictionary = &srLatn // sr + Swedish *Dictionary = &sv // sv + Swahili *Dictionary = &sw // sw + Tamil *Dictionary = &ta // ta + Telugu *Dictionary = &te // te + Thai *Dictionary = &th // th + Turkish *Dictionary = &tr // tr + Ukrainian *Dictionary = &uk // uk + Urdu *Dictionary = &ur // ur + Uzbek *Dictionary = &uz // uz + Vietnamese *Dictionary = &vi // vi + Chinese *Dictionary = &zh // zh + SimplifiedChinese *Dictionary = Chinese // zh-Hans + TraditionalChinese *Dictionary = &zhHant // zh-Hant + Zulu *Dictionary = &zu // zu +) diff --git a/vendor/golang.org/x/text/language/display/dict_test.go b/vendor/golang.org/x/text/language/display/dict_test.go new file mode 100644 index 0000000000..f0b1f78319 --- /dev/null +++ b/vendor/golang.org/x/text/language/display/dict_test.go @@ -0,0 +1,39 @@ +// 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 display + +import ( + "fmt" + "testing" + + "golang.org/x/text/internal/testtext" +) + +func TestLinking(t *testing.T) { + base := getSize(t, `display.Tags(language.English).Name(language.English)`) + compact := getSize(t, `display.English.Languages().Name(language.English)`) + + if d := base - compact; d < 1.5*1024*1024 { + t.Errorf("size(base)-size(compact) was %d; want > 1.5MB", base, compact) + } +} + +func getSize(t *testing.T, main string) int { + size, err := testtext.CodeSize(fmt.Sprintf(body, main)) + if err != nil { + t.Skipf("skipping link size test; binary size could not be determined: %v", err) + } + return size +} + +const body = `package main +import ( + "golang.org/x/text/language" + "golang.org/x/text/language/display" +) +func main() { + %s +} +` diff --git a/vendor/golang.org/x/text/language/display/display.go b/vendor/golang.org/x/text/language/display/display.go new file mode 100644 index 0000000000..738afa496c --- /dev/null +++ b/vendor/golang.org/x/text/language/display/display.go @@ -0,0 +1,343 @@ +// 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. + +//go:generate go run maketables.go -output tables.go + +// Package display provides display names for languages, scripts and regions in +// a requested language. +// +// The data is based on CLDR's localeDisplayNames. It includes the names of the +// draft level "contributed" or "approved". The resulting tables are quite +// large. The display package is designed so that users can reduce the linked-in +// table sizes by cherry picking the languages one wishes to support. There is a +// Dictionary defined for a selected set of common languages for this purpose. +package display // import "golang.org/x/text/language/display" + +import ( + "strings" + + "golang.org/x/text/language" +) + +/* +TODO: +All fairly low priority at the moment: + - Include alternative and variants as an option (using func options). + - Option for returning the empty string for undefined values. + - Support variants, currencies, time zones, option names and other data + provided in CLDR. + - Do various optimizations: + - Reduce size of offset tables. + - Consider compressing infrequently used languages and decompress on demand. +*/ + +// A Namer is used to get the name for a given value, such as a Tag, Language, +// Script or Region. +type Namer interface { + // Name returns a display string for the given value. A Namer returns an + // empty string for values it does not support. A Namer may support naming + // an unspecified value. For example, when getting the name for a region for + // a tag that does not have a defined Region, it may return the name for an + // unknown region. It is up to the user to filter calls to Name for values + // for which one does not want to have a name string. + Name(x interface{}) string +} + +var ( + // Supported lists the languages for which names are defined. + Supported language.Coverage + + // The set of all possible values for which names are defined. Note that not + // all Namer implementations will cover all the values of a given type. + // A Namer will return the empty string for unsupported values. + Values language.Coverage + + matcher language.Matcher +) + +func init() { + tags := make([]language.Tag, numSupported) + s := supported + for i := range tags { + p := strings.IndexByte(s, '|') + tags[i] = language.Raw.Make(s[:p]) + s = s[p+1:] + } + matcher = language.NewMatcher(tags) + Supported = language.NewCoverage(tags) + + Values = language.NewCoverage(langTagSet.Tags, supportedScripts, supportedRegions) +} + +// Languages returns a Namer for naming languages. It returns nil if there is no +// data for the given tag. The type passed to Name must be either language.Base +// or language.Tag. Note that the result may differ between passing a tag or its +// base language. For example, for English, passing "nl-BE" would return Flemish +// whereas passing "nl" returns "Dutch". +func Languages(t language.Tag) Namer { + if _, index, conf := matcher.Match(t); conf != language.No { + return languageNamer(index) + } + return nil +} + +type languageNamer int + +func (n languageNamer) name(i int) string { + return lookup(langHeaders[:], int(n), i) +} + +// Name implements the Namer interface for language names. +func (n languageNamer) Name(x interface{}) string { + return nameLanguage(n, x) +} + +// nonEmptyIndex walks up the parent chain until a non-empty header is found. +// It returns -1 if no index could be found. +func nonEmptyIndex(h []header, index int) int { + for ; index != -1 && h[index].data == ""; index = int(parents[index]) { + } + return index +} + +// Scripts returns a Namer for naming scripts. It returns nil if there is no +// data for the given tag. The type passed to Name must be either a +// language.Script or a language.Tag. It will not attempt to infer a script for +// tags with an unspecified script. +func Scripts(t language.Tag) Namer { + if _, index, conf := matcher.Match(t); conf != language.No { + if index = nonEmptyIndex(scriptHeaders[:], index); index != -1 { + return scriptNamer(index) + } + } + return nil +} + +type scriptNamer int + +func (n scriptNamer) name(i int) string { + return lookup(scriptHeaders[:], int(n), i) +} + +// Name implements the Namer interface for script names. +func (n scriptNamer) Name(x interface{}) string { + return nameScript(n, x) +} + +// Regions returns a Namer for naming regions. It returns nil if there is no +// data for the given tag. The type passed to Name must be either a +// language.Region or a language.Tag. It will not attempt to infer a region for +// tags with an unspecified region. +func Regions(t language.Tag) Namer { + if _, index, conf := matcher.Match(t); conf != language.No { + if index = nonEmptyIndex(regionHeaders[:], index); index != -1 { + return regionNamer(index) + } + } + return nil +} + +type regionNamer int + +func (n regionNamer) name(i int) string { + return lookup(regionHeaders[:], int(n), i) +} + +// Name implements the Namer interface for region names. +func (n regionNamer) Name(x interface{}) string { + return nameRegion(n, x) +} + +// Tags returns a Namer for giving a full description of a tag. The names of +// scripts and regions that are not already implied by the language name will +// in appended within parentheses. It returns nil if there is not data for the +// given tag. The type passed to Name must be a tag. +func Tags(t language.Tag) Namer { + if _, index, conf := matcher.Match(t); conf != language.No { + return tagNamer(index) + } + return nil +} + +type tagNamer int + +// Name implements the Namer interface for tag names. +func (n tagNamer) Name(x interface{}) string { + return nameTag(languageNamer(n), scriptNamer(n), regionNamer(n), x) +} + +// lookup finds the name for an entry in a global table, traversing the +// inheritance hierarchy if needed. +func lookup(table []header, dict, want int) string { + for dict != -1 { + if s := table[dict].name(want); s != "" { + return s + } + dict = int(parents[dict]) + } + return "" +} + +// A Dictionary holds a collection of Namers for a single language. One can +// reduce the amount of data linked in to a binary by only referencing +// Dictionaries for the languages one needs to support instead of using the +// generic Namer factories. +type Dictionary struct { + parent *Dictionary + lang header + script header + region header +} + +// Tags returns a Namer for giving a full description of a tag. The names of +// scripts and regions that are not already implied by the language name will +// in appended within parentheses. It returns nil if there is not data for the +// given tag. The type passed to Name must be a tag. +func (d *Dictionary) Tags() Namer { + return dictTags{d} +} + +type dictTags struct { + d *Dictionary +} + +// Name implements the Namer interface for tag names. +func (n dictTags) Name(x interface{}) string { + return nameTag(dictLanguages{n.d}, dictScripts{n.d}, dictRegions{n.d}, x) +} + +// Languages returns a Namer for naming languages. It returns nil if there is no +// data for the given tag. The type passed to Name must be either language.Base +// or language.Tag. Note that the result may differ between passing a tag or its +// base language. For example, for English, passing "nl-BE" would return Flemish +// whereas passing "nl" returns "Dutch". +func (d *Dictionary) Languages() Namer { + return dictLanguages{d} +} + +type dictLanguages struct { + d *Dictionary +} + +func (n dictLanguages) name(i int) string { + for d := n.d; d != nil; d = d.parent { + if s := d.lang.name(i); s != "" { + return s + } + } + return "" +} + +// Name implements the Namer interface for language names. +func (n dictLanguages) Name(x interface{}) string { + return nameLanguage(n, x) +} + +// Scripts returns a Namer for naming scripts. It returns nil if there is no +// data for the given tag. The type passed to Name must be either a +// language.Script or a language.Tag. It will not attempt to infer a script for +// tags with an unspecified script. +func (d *Dictionary) Scripts() Namer { + return dictScripts{d} +} + +type dictScripts struct { + d *Dictionary +} + +func (n dictScripts) name(i int) string { + for d := n.d; d != nil; d = d.parent { + if s := d.script.name(i); s != "" { + return s + } + } + return "" +} + +// Name implements the Namer interface for script names. +func (n dictScripts) Name(x interface{}) string { + return nameScript(n, x) +} + +// Regions returns a Namer for naming regions. It returns nil if there is no +// data for the given tag. The type passed to Name must be either a +// language.Region or a language.Tag. It will not attempt to infer a region for +// tags with an unspecified region. +func (d *Dictionary) Regions() Namer { + return dictRegions{d} +} + +type dictRegions struct { + d *Dictionary +} + +func (n dictRegions) name(i int) string { + for d := n.d; d != nil; d = d.parent { + if s := d.region.name(i); s != "" { + return s + } + } + return "" +} + +// Name implements the Namer interface for region names. +func (n dictRegions) Name(x interface{}) string { + return nameRegion(n, x) +} + +// A SelfNamer implements a Namer that returns the name of language in this same +// language. It provides a very compact mechanism to provide a comprehensive +// list of languages to users in their native language. +type SelfNamer struct { + // Supported defines the values supported by this Namer. + Supported language.Coverage +} + +var ( + // Self is a shared instance of a SelfNamer. + Self *SelfNamer = &self + + self = SelfNamer{language.NewCoverage(selfTagSet.Tags)} +) + +// Name returns the name of a given language tag in the language identified by +// this tag. It supports both the language.Base and language.Tag types. +func (n SelfNamer) Name(x interface{}) string { + t, _ := language.All.Compose(x) + base, scr, reg := t.Raw() + baseScript := language.Script{} + if (scr == language.Script{} && reg != language.Region{}) { + // For looking up in the self dictionary, we need to select the + // maximized script. This is even the case if the script isn't + // specified. + s1, _ := t.Script() + if baseScript = getScript(base); baseScript != s1 { + scr = s1 + } + } + + i, scr, reg := selfTagSet.index(base, scr, reg) + if i == -1 { + return "" + } + + // Only return the display name if the script matches the expected script. + if (scr != language.Script{}) { + if (baseScript == language.Script{}) { + baseScript = getScript(base) + } + if baseScript != scr { + return "" + } + } + + return selfHeaders[0].name(i) +} + +// getScript returns the maximized script for a base language. +func getScript(b language.Base) language.Script { + tag, _ := language.Raw.Compose(b) + scr, _ := tag.Script() + return scr +} diff --git a/vendor/golang.org/x/text/language/display/display_test.go b/vendor/golang.org/x/text/language/display/display_test.go new file mode 100644 index 0000000000..3edbca4435 --- /dev/null +++ b/vendor/golang.org/x/text/language/display/display_test.go @@ -0,0 +1,632 @@ +// 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 display + +import ( + "fmt" + "reflect" + "testing" + "unicode" + + "golang.org/x/text/language" +) + +// TODO: test that tables are properly dropped by the linker for various use +// cases. + +var ( + firstLang2aa = language.MustParseBase("aa") + lastLang2zu = language.MustParseBase("zu") + firstLang3ace = language.MustParseBase("ace") + lastLang3zza = language.MustParseBase("zza") + firstTagAr001 = language.MustParse("ar-001") + lastTagZhHant = language.MustParse("zh-Hant") +) + +// TestValues tests that for all languages, regions, and scripts in Values, at +// least one language has a name defined for it by checking it exists in +// English, which is assumed to be the most comprehensive. It is also tested +// that a Namer returns "" for unsupported values. +func TestValues(t *testing.T) { + type testcase struct { + kind string + n Namer + } + // checkDefined checks that a value exists in a Namer. + checkDefined := func(x interface{}, namers []testcase) { + for _, n := range namers { + if n.n.Name(x) == "" { + // As of version 28 there is no data for az-Arab in English, + // although there is useful data in other languages. + if x.(fmt.Stringer).String() == "az-Arab" { + continue + } + t.Errorf("%s.Name(%s): supported but no result", n.kind, x) + } + } + } + // checkUnsupported checks that a value does not exist in a Namer. + checkUnsupported := func(x interface{}, namers []testcase) { + for _, n := range namers { + if got := n.n.Name(x); got != "" { + t.Fatalf("%s.Name(%s): unsupported tag gave non-empty result: %q", n.kind, x, got) + } + } + } + + tags := map[language.Tag]bool{} + namers := []testcase{ + {"Languages(en)", Languages(language.English)}, + {"Tags(en)", Tags(language.English)}, + {"English.Languages()", English.Languages()}, + {"English.Tags()", English.Tags()}, + } + for _, tag := range Values.Tags() { + checkDefined(tag, namers) + tags[tag] = true + } + for _, base := range language.Supported.BaseLanguages() { + tag, _ := language.All.Compose(base) + if !tags[tag] { + checkUnsupported(tag, namers) + } + } + + regions := map[language.Region]bool{} + namers = []testcase{ + {"Regions(en)", Regions(language.English)}, + {"English.Regions()", English.Regions()}, + } + for _, r := range Values.Regions() { + checkDefined(r, namers) + regions[r] = true + } + for _, r := range language.Supported.Regions() { + if r = r.Canonicalize(); !regions[r] { + checkUnsupported(r, namers) + } + } + + scripts := map[language.Script]bool{} + namers = []testcase{ + {"Scripts(en)", Scripts(language.English)}, + {"English.Scripts()", English.Scripts()}, + } + for _, s := range Values.Scripts() { + checkDefined(s, namers) + scripts[s] = true + } + for _, s := range language.Supported.Scripts() { + // Canonicalize the script. + tag, _ := language.DeprecatedScript.Compose(s) + if _, s, _ = tag.Raw(); !scripts[s] { + checkUnsupported(s, namers) + } + } +} + +// TestSupported tests that we have at least some Namers for languages that we +// claim to support. To test the claims in the documentation, it also verifies +// that if a Namer is returned, it will have at least some data. +func TestSupported(t *testing.T) { + supportedTags := Supported.Tags() + if len(supportedTags) != numSupported { + t.Errorf("number of supported was %d; want %d", len(supportedTags), numSupported) + } + + namerFuncs := []struct { + kind string + fn func(language.Tag) Namer + }{ + {"Tags", Tags}, + {"Languages", Languages}, + {"Regions", Regions}, + {"Scripts", Scripts}, + } + + // Verify that we have at least one Namer for all tags we claim to support. + tags := make(map[language.Tag]bool) + for _, tag := range supportedTags { + // Test we have at least one Namer for this supported Tag. + found := false + for _, kind := range namerFuncs { + if defined(t, kind.kind, kind.fn(tag), tag) { + found = true + } + } + if !found { + t.Errorf("%s: supported, but no data available", tag) + } + if tags[tag] { + t.Errorf("%s: included in Supported.Tags more than once", tag) + } + tags[tag] = true + } + + // Verify that we have no Namers for tags we don't claim to support. + for _, base := range language.Supported.BaseLanguages() { + tag, _ := language.All.Compose(base) + // Skip tags that are supported after matching. + if _, _, conf := matcher.Match(tag); conf != language.No { + continue + } + // Test there are no Namers for this tag. + for _, kind := range namerFuncs { + if defined(t, kind.kind, kind.fn(tag), tag) { + t.Errorf("%[1]s(%[2]s) returns a Namer, but %[2]s is not in the set of supported Tags.", kind.kind, tag) + } + } + } +} + +// defined reports whether n is a proper Namer, which means it is non-nil and +// must have at least one non-empty value. +func defined(t *testing.T, kind string, n Namer, tag language.Tag) bool { + if n == nil { + return false + } + switch kind { + case "Tags": + for _, t := range Values.Tags() { + if n.Name(t) != "" { + return true + } + } + case "Languages": + for _, t := range Values.BaseLanguages() { + if n.Name(t) != "" { + return true + } + } + case "Regions": + for _, t := range Values.Regions() { + if n.Name(t) != "" { + return true + } + } + case "Scripts": + for _, t := range Values.Scripts() { + if n.Name(t) != "" { + return true + } + } + } + t.Errorf("%s(%s) returns non-nil Namer without content", kind, tag) + return false +} + +func TestCoverage(t *testing.T) { + en := language.English + tests := []struct { + n Namer + x interface{} + }{ + {Languages(en), Values.Tags()}, + {Scripts(en), Values.Scripts()}, + {Regions(en), Values.Regions()}, + } + for i, tt := range tests { + uniq := make(map[string]interface{}) + + v := reflect.ValueOf(tt.x) + for j := 0; j < v.Len(); j++ { + x := v.Index(j).Interface() + // As of version 28 there is no data for az-Arab in English, + // although there is useful data in other languages. + if x.(fmt.Stringer).String() == "az-Arab" { + continue + } + s := tt.n.Name(x) + if s == "" { + t.Errorf("%d:%d:%s: missing content", i, j, x) + } else if uniq[s] != nil { + t.Errorf("%d:%d:%s: identical return value %q for %v and %v", i, j, x, s, x, uniq[s]) + } + uniq[s] = x + } + } +} + +// TestUpdate tests whether dictionary entries for certain languages need to be +// updated. For some languages, some of the headers may be empty or they may be +// identical to the parent. This code detects if such entries need to be updated +// after a table update. +func TestUpdate(t *testing.T) { + tests := []struct { + d *Dictionary + tag string + }{ + {ModernStandardArabic, "ar-001"}, + {AmericanEnglish, "en-US"}, + {EuropeanSpanish, "es-ES"}, + {BrazilianPortuguese, "pt-BR"}, + {SimplifiedChinese, "zh-Hans"}, + } + + for _, tt := range tests { + _, i, _ := matcher.Match(language.MustParse(tt.tag)) + if !reflect.DeepEqual(tt.d.lang, langHeaders[i]) { + t.Errorf("%s: lang table update needed", tt.tag) + } + if !reflect.DeepEqual(tt.d.script, scriptHeaders[i]) { + t.Errorf("%s: script table update needed", tt.tag) + } + if !reflect.DeepEqual(tt.d.region, regionHeaders[i]) { + t.Errorf("%s: region table update needed", tt.tag) + } + } +} + +func TestIndex(t *testing.T) { + notIn := []string{"aa", "xx", "zz", "aaa", "xxx", "zzz", "Aaaa", "Xxxx", "Zzzz"} + tests := []tagIndex{ + { + "", + "", + "", + }, + { + "bb", + "", + "", + }, + { + "", + "bbb", + "", + }, + { + "", + "", + "Bbbb", + }, + { + "bb", + "bbb", + "Bbbb", + }, + { + "bbccddyy", + "bbbcccdddyyy", + "BbbbCcccDdddYyyy", + }, + } + for i, tt := range tests { + // Create the test set from the tagIndex. + cnt := 0 + for sz := 2; sz <= 4; sz++ { + a := tt[sz-2] + for j := 0; j < len(a); j += sz { + s := a[j : j+sz] + if idx := tt.index(s); idx != cnt { + t.Errorf("%d:%s: index was %d; want %d", i, s, idx, cnt) + } + cnt++ + } + } + if n := tt.len(); n != cnt { + t.Errorf("%d: len was %d; want %d", i, n, cnt) + } + for _, x := range notIn { + if idx := tt.index(x); idx != -1 { + t.Errorf("%d:%s: index was %d; want -1", i, x, idx) + } + } + } +} + +func TestTag(t *testing.T) { + tests := []struct { + dict string + tag string + name string + }{ + {"agq", "sr", ""}, // sr is in Value.Languages(), but is not supported by agq. + {"nl", "nl", "Nederlands"}, + {"nl", "nl-BE", "Vlaams"}, + {"en", "en", "English"}, + {"en", "en-GB", "British English"}, + {"en", "en-US", "American English"}, // American English in CLDR 24+ + {"ru", "ru", "русский"}, + {"ru", "ru-RU", "русский (Россия)"}, + {"ru", "ru-Cyrl", "русский (кириллица)"}, + {"en", lastLang2zu.String(), "Zulu"}, + {"en", firstLang2aa.String(), "Afar"}, + {"en", lastLang3zza.String(), "Zaza"}, + {"en", firstLang3ace.String(), "Achinese"}, + {"en", firstTagAr001.String(), "Modern Standard Arabic"}, + {"en", lastTagZhHant.String(), "Traditional Chinese"}, + {"en", "aaa", ""}, + {"en", "zzj", ""}, + // If full tag doesn't match, try without script or region. + {"en", "aa-Hans", "Afar (Simplified Han)"}, + {"en", "af-Arab", "Afrikaans (Arabic)"}, + {"en", "zu-Cyrl", "Zulu (Cyrillic)"}, + {"en", "aa-GB", "Afar (United Kingdom)"}, + {"en", "af-NA", "Afrikaans (Namibia)"}, + {"en", "zu-BR", "Zulu (Brazil)"}, + // Correct inheritance and language selection. + {"zh", "zh-TW", "中文 (台湾)"}, + {"zh", "zh-Hant-TW", "繁体中文 (台湾)"}, + {"zh-Hant", "zh-TW", "中文 (台灣)"}, + {"zh-Hant", "zh-Hant-TW", "繁體中文 (台灣)"}, + // Some rather arbitrary interpretations for Serbian. This is arguably + // correct and consistent with the way zh-[Hant-]TW is handled. It will + // also give results more in line with the expectations if users + // explicitly use "sh". + {"sr-Latn", "sr-ME", "srpski (Crna Gora)"}, + {"sr-Latn", "sr-Latn-ME", "Srpskohrvatski (Crna Gora)"}, + // Double script and region + {"nl", "en-Cyrl-BE", "Engels (Cyrillisch, België)"}, + // Canonical equivalents. + {"ro", "ro-MD", "moldovenească"}, + {"ro", "mo", "moldovenească"}, + } + for i, tt := range tests { + d := Tags(language.MustParse(tt.dict)) + if n := d.Name(language.Raw.MustParse(tt.tag)); n != tt.name { + // There are inconsistencies w.r.t. capitalization in the tests + // due to CLDR's update procedure which treats modern and other + // languages differently. + // See http://unicode.org/cldr/trac/ticket/8051. + // TODO: use language capitalization to sanitize the strings. + t.Errorf("%d:%s:%s: was %q; want %q", i, tt.dict, tt.tag, n, tt.name) + } + } +} + +func TestLanguage(t *testing.T) { + tests := []struct { + dict string + tag string + name string + }{ + {"agq", "sr", ""}, // sr is in Value.Languages(), but is not supported by agq. + {"nl", "nl", "Nederlands"}, + {"nl", "nl-BE", "Vlaams"}, + {"en", "pt", "Portuguese"}, + {"en", "pt-PT", "European Portuguese"}, + {"en", "pt-BR", "Brazilian Portuguese"}, + {"en", "en", "English"}, + {"en", "en-GB", "British English"}, + {"en", "en-US", "American English"}, // American English in CLDR 24+ + {"en", lastLang2zu.String(), "Zulu"}, + {"en", firstLang2aa.String(), "Afar"}, + {"en", lastLang3zza.String(), "Zaza"}, + {"en", firstLang3ace.String(), "Achinese"}, + {"en", firstTagAr001.String(), "Modern Standard Arabic"}, + {"en", lastTagZhHant.String(), "Traditional Chinese"}, + {"en", "aaa", ""}, + {"en", "zzj", ""}, + // If full tag doesn't match, try without script or region. + {"en", "aa-Hans", "Afar"}, + {"en", "af-Arab", "Afrikaans"}, + {"en", "zu-Cyrl", "Zulu"}, + {"en", "aa-GB", "Afar"}, + {"en", "af-NA", "Afrikaans"}, + {"en", "zu-BR", "Zulu"}, + {"agq", "zh-Hant", ""}, + // Canonical equivalents. + {"ro", "ro-MD", "moldovenească"}, + {"ro", "mo", "moldovenească"}, + {"en", "sh", "Serbo-Croatian"}, + {"en", "sr-Latn", "Serbo-Croatian"}, + {"en", "sr", "Serbian"}, + {"en", "sr-ME", "Serbian"}, + {"en", "sr-Latn-ME", "Serbo-Croatian"}, // See comments in TestTag. + } + for i, tt := range tests { + d := Languages(language.Raw.MustParse(tt.dict)) + if n := d.Name(language.Raw.MustParse(tt.tag)); n != tt.name { + t.Errorf("%d:%s:%s: was %q; want %q", i, tt.dict, tt.tag, n, tt.name) + } + if len(tt.tag) <= 3 { + if n := d.Name(language.MustParseBase(tt.tag)); n != tt.name { + t.Errorf("%d:%s:base(%s): was %q; want %q", i, tt.dict, tt.tag, n, tt.name) + } + } + } +} + +func TestScript(t *testing.T) { + tests := []struct { + dict string + scr string + name string + }{ + {"nl", "Arab", "Arabisch"}, + {"en", "Arab", "Arabic"}, + {"en", "Zzzz", "Unknown Script"}, + {"zh-Hant", "Hang", "韓文字"}, + {"zh-Hant-HK", "Hang", "韓文字母"}, + {"zh", "Arab", "阿拉伯文"}, + {"zh-Hans-HK", "Arab", "阿拉伯文"}, // same as zh + {"zh-Hant", "Arab", "阿拉伯文"}, + {"zh-Hant-HK", "Arab", "阿拉伯文"}, // same as zh + // Canonicalized form + {"en", "Qaai", "Inherited"}, // deprecated script, now is Zinh + {"en", "sh", "Unknown Script"}, // sh canonicalizes to sr-Latn + {"en", "en", "Unknown Script"}, + // Don't introduce scripts with canonicalization. + {"en", "sh", "Unknown Script"}, // sh canonicalizes to sr-Latn + } + for i, tt := range tests { + d := Scripts(language.MustParse(tt.dict)) + var x interface{} + if unicode.IsUpper(rune(tt.scr[0])) { + x = language.MustParseScript(tt.scr) + tag, _ := language.Raw.Compose(x) + if n := d.Name(tag); n != tt.name { + t.Errorf("%d:%s:%s: was %q; want %q", i, tt.dict, tt.scr, n, tt.name) + } + } else { + x = language.Raw.MustParse(tt.scr) + } + if n := d.Name(x); n != tt.name { + t.Errorf("%d:%s:%s: was %q; want %q", i, tt.dict, tt.scr, n, tt.name) + } + } +} + +func TestRegion(t *testing.T) { + tests := []struct { + dict string + reg string + name string + }{ + {"nl", "NL", "Nederland"}, + {"en", "US", "United States"}, + {"en", "ZZ", "Unknown Region"}, + {"en", "UM", "U.S. Outlying Islands"}, + {"en-GB", "UM", "U.S. Outlying Islands"}, + {"en-GB", "NL", "Netherlands"}, + // Canonical equivalents + {"en", "UK", "United Kingdom"}, + // No region + {"en", "pt", "Unknown Region"}, + {"en", "und", "Unknown Region"}, + // Don't introduce regions with canonicalization. + {"en", "mo", "Unknown Region"}, + } + for i, tt := range tests { + d := Regions(language.MustParse(tt.dict)) + var x interface{} + if unicode.IsUpper(rune(tt.reg[0])) { + // Region + x = language.MustParseRegion(tt.reg) + tag, _ := language.Raw.Compose(x) + if n := d.Name(tag); n != tt.name { + t.Errorf("%d:%s:%s: was %q; want %q", i, tt.dict, tt.reg, n, tt.name) + } + } else { + // Tag + x = language.Raw.MustParse(tt.reg) + } + if n := d.Name(x); n != tt.name { + t.Errorf("%d:%s:%s: was %q; want %q", i, tt.dict, tt.reg, n, tt.name) + } + } +} + +func TestSelf(t *testing.T) { + tests := []struct { + tag string + name string + }{ + {"nl", "Nederlands"}, + {"nl-BE", "Vlaams"}, + {"en-GB", "British English"}, + {lastLang2zu.String(), "isiZulu"}, + {firstLang2aa.String(), ""}, // not defined + {lastLang3zza.String(), ""}, // not defined + {firstLang3ace.String(), ""}, // not defined + {firstTagAr001.String(), "العربية الرسمية الحديثة"}, + {"ar", "العربية"}, + {lastTagZhHant.String(), "繁體中文"}, + {"aaa", ""}, + {"zzj", ""}, + // Drop entries that are not in the requested script, even if there is + // an entry for the language. + {"aa-Hans", ""}, + {"af-Arab", ""}, + {"zu-Cyrl", ""}, + // Append the country name in the language of the matching language. + {"af-NA", "Afrikaans"}, + {"zh", "中文"}, + // zh-TW should match zh-Hant instead of zh! + {"zh-TW", "繁體中文"}, + {"zh-Hant", "繁體中文"}, + {"zh-Hans", "简体中文"}, + {"zh-Hant-TW", "繁體中文"}, + {"zh-Hans-TW", "简体中文"}, + // Take the entry for sr which has the matching script. + // TODO: Capitalization changed as of CLDR 26, but change seems + // arbitrary. Revisit capitalization with revision 27. See + // http://unicode.org/cldr/trac/ticket/8051. + {"sr", "српски"}, + // TODO: sr-ME should show up as Serbian or Montenegrin, not Serbo- + // Croatian. This is an artifact of the current algorithm, which is the + // way it is to have the preferred behavior for other languages such as + // Chinese. We can hardwire this case in the table generator or package + // code, but we first check if CLDR can be updated. + // {"sr-ME", "Srpski"}, // Is Srpskohrvatski + {"sr-Latn-ME", "Srpskohrvatski"}, + {"sr-Cyrl-ME", "српски"}, + {"sr-NL", "српски"}, + // Canonical equivalents. + {"ro-MD", "moldovenească"}, + {"mo", "moldovenească"}, + // NOTE: kk is defined, but in Cyrillic script. For China, Arab is the + // dominant script. We do not have data for kk-Arab and we chose to not + // fall back in such cases. + {"kk-CN", ""}, + } + for i, tt := range tests { + d := Self + if n := d.Name(language.Raw.MustParse(tt.tag)); n != tt.name { + t.Errorf("%d:%s: was %q; want %q", i, tt.tag, n, tt.name) + } + } +} + +func TestDictionaryLang(t *testing.T) { + tests := []struct { + d *Dictionary + tag string + name string + }{ + {English, "en", "English"}, + {Portuguese, "af", "africâner"}, + {EuropeanPortuguese, "af", "africânder"}, + {English, "nl-BE", "Flemish"}, + } + for i, test := range tests { + tag := language.MustParse(test.tag) + if got := test.d.Tags().Name(tag); got != test.name { + t.Errorf("%d:%v: got %s; want %s", i, tag, got, test.name) + } + if base, _ := language.Compose(tag.Base()); base == tag { + if got := test.d.Languages().Name(base); got != test.name { + t.Errorf("%d:%v: got %s; want %s", i, tag, got, test.name) + } + } + } +} + +func TestDictionaryRegion(t *testing.T) { + tests := []struct { + d *Dictionary + region string + name string + }{ + {English, "FR", "France"}, + {Portuguese, "009", "Oceania"}, + {EuropeanPortuguese, "009", "Oceânia"}, + } + for i, test := range tests { + tag := language.MustParseRegion(test.region) + if got := test.d.Regions().Name(tag); got != test.name { + t.Errorf("%d:%v: got %s; want %s", i, tag, got, test.name) + } + } +} + +func TestDictionaryScript(t *testing.T) { + tests := []struct { + d *Dictionary + script string + name string + }{ + {English, "Cyrl", "Cyrillic"}, + {Portuguese, "Gujr", "gujerati"}, + {EuropeanPortuguese, "Gujr", "guzerate"}, + } + for i, test := range tests { + tag := language.MustParseScript(test.script) + if got := test.d.Scripts().Name(tag); got != test.name { + t.Errorf("%d:%v: got %s; want %s", i, tag, got, test.name) + } + } +} diff --git a/vendor/golang.org/x/text/language/display/examples_test.go b/vendor/golang.org/x/text/language/display/examples_test.go new file mode 100644 index 0000000000..f392f2109d --- /dev/null +++ b/vendor/golang.org/x/text/language/display/examples_test.go @@ -0,0 +1,98 @@ +// 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 display_test + +import ( + "fmt" + + "golang.org/x/text/language" + "golang.org/x/text/language/display" +) + +func ExampleNamer() { + supported := []string{ + "en-US", "en-GB", "ja", "zh", "zh-Hans", "zh-Hant", "pt", "pt-PT", "ko", "ar", "el", "ru", "uk", "pa", + } + + en := display.English.Languages() + + for _, s := range supported { + t := language.MustParse(s) + fmt.Printf("%-20s (%s)\n", en.Name(t), display.Self.Name(t)) + } + + // Output: + // American English (American English) + // British English (British English) + // Japanese (日本語) + // Chinese (中文) + // Simplified Chinese (简体中文) + // Traditional Chinese (繁體中文) + // Portuguese (português) + // European Portuguese (português europeu) + // Korean (한국어) + // Arabic (العربية) + // Greek (Ελληνικά) + // Russian (русский) + // Ukrainian (українська) + // Punjabi (ਪੰਜਾਬੀ) +} + +func ExampleTags() { + n := display.Tags(language.English) + fmt.Println(n.Name(language.Make("nl"))) + fmt.Println(n.Name(language.Make("nl-BE"))) + fmt.Println(n.Name(language.Make("nl-CW"))) + fmt.Println(n.Name(language.Make("nl-Arab"))) + fmt.Println(n.Name(language.Make("nl-Cyrl-RU"))) + + // Output: + // Dutch + // Flemish + // Dutch (Curaçao) + // Dutch (Arabic) + // Dutch (Cyrillic, Russia) +} + +// ExampleDictionary shows how to reduce the amount of data linked into your +// binary by only using the predefined Dictionary variables of the languages you +// wish to support. +func ExampleDictionary() { + tags := []language.Tag{ + language.English, + language.German, + language.Japanese, + language.Russian, + } + dicts := []*display.Dictionary{ + display.English, + display.German, + display.Japanese, + display.Russian, + } + + m := language.NewMatcher(tags) + + getDict := func(t language.Tag) *display.Dictionary { + _, i, confidence := m.Match(t) + // Skip this check if you want to support a fall-back language, which + // will be the first one passed to NewMatcher. + if confidence == language.No { + return nil + } + return dicts[i] + } + + // The matcher will match Swiss German to German. + n := getDict(language.Make("gsw")).Languages() + fmt.Println(n.Name(language.German)) + fmt.Println(n.Name(language.Make("de-CH"))) + fmt.Println(n.Name(language.Make("gsw"))) + + // Output: + // Deutsch + // Schweizer Hochdeutsch + // Schweizerdeutsch +} diff --git a/vendor/golang.org/x/text/language/display/lookup.go b/vendor/golang.org/x/text/language/display/lookup.go new file mode 100644 index 0000000000..794098ad7f --- /dev/null +++ b/vendor/golang.org/x/text/language/display/lookup.go @@ -0,0 +1,238 @@ +// 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 display + +// This file contains common lookup code that is shared between the various +// implementations of Namer and Dictionaries. + +import ( + "fmt" + "sort" + "strings" + + "golang.org/x/text/language" +) + +type namer interface { + // name gets the string for the given index. It should walk the + // inheritance chain if a value is not present in the base index. + name(idx int) string +} + +func nameLanguage(n namer, x interface{}) string { + t, _ := language.All.Compose(x) + i, _, _ := langTagSet.index(t.Raw()) + return n.name(i) +} + +func nameScript(n namer, x interface{}) string { + t, _ := language.DeprecatedScript.Compose(x) + _, s, _ := t.Raw() + return n.name(scriptIndex.index(s.String())) +} + +func nameRegion(n namer, x interface{}) string { + t, _ := language.DeprecatedRegion.Compose(x) + _, _, r := t.Raw() + return n.name(regionIndex.index(r.String())) +} + +func nameTag(langN, scrN, regN namer, x interface{}) string { + t, ok := x.(language.Tag) + if !ok { + return "" + } + const form = language.All &^ language.SuppressScript + if c, err := form.Canonicalize(t); err == nil { + t = c + } + i, scr, reg := langTagSet.index(t.Raw()) + if i == -1 { + return "" + } + + str := langN.name(i) + if hasS, hasR := (scr != language.Script{}), (reg != language.Region{}); hasS || hasR { + ss, sr := "", "" + if hasS { + ss = scrN.name(scriptIndex.index(scr.String())) + } + if hasR { + sr = regN.name(regionIndex.index(reg.String())) + } + // TODO: use patterns in CLDR or at least confirm they are the same for + // all languages. + if ss != "" && sr != "" { + return fmt.Sprintf("%s (%s, %s)", str, ss, sr) + } + if ss != "" || sr != "" { + return fmt.Sprintf("%s (%s%s)", str, ss, sr) + } + } + return str +} + +// header contains the data and indexes for a single namer. +// data contains a series of strings concatenated into one. index contains the +// offsets for a string in data. For example, consider a header that defines +// strings for the languages de, el, en, fi, and nl: +// +// header{ +// data: "GermanGreekEnglishDutch", +// index: []uint16{ 0, 6, 11, 18, 18, 23 }, +// } +// +// For a language with index i, the string is defined by +// data[index[i]:index[i+1]]. So the number of elements in index is always one +// greater than the number of languages for which header defines a value. +// A string for a language may be empty, which means the name is undefined. In +// the above example, the name for fi (Finnish) is undefined. +type header struct { + data string + index []uint16 +} + +// name looks up the name for a tag in the dictionary, given its index. +func (h *header) name(i int) string { + if 0 <= i && i < len(h.index)-1 { + return h.data[h.index[i]:h.index[i+1]] + } + return "" +} + +// tagSet is used to find the index of a language in a set of tags. +type tagSet struct { + single tagIndex + long []string +} + +var ( + langTagSet = tagSet{ + single: langIndex, + long: langTagsLong, + } + + // selfTagSet is used for indexing the language strings in their own + // language. + selfTagSet = tagSet{ + single: selfIndex, + long: selfTagsLong, + } + + zzzz = language.MustParseScript("Zzzz") + zz = language.MustParseRegion("ZZ") +) + +// index returns the index of the tag for the given base, script and region or +// its parent if the tag is not available. If the match is for a parent entry, +// the excess script and region are returned. +func (ts *tagSet) index(base language.Base, scr language.Script, reg language.Region) (int, language.Script, language.Region) { + lang := base.String() + index := -1 + if (scr != language.Script{} || reg != language.Region{}) { + if scr == zzzz { + scr = language.Script{} + } + if reg == zz { + reg = language.Region{} + } + + i := sort.SearchStrings(ts.long, lang) + // All entries have either a script or a region and not both. + scrStr, regStr := scr.String(), reg.String() + for ; i < len(ts.long) && strings.HasPrefix(ts.long[i], lang); i++ { + if s := ts.long[i][len(lang)+1:]; s == scrStr { + scr = language.Script{} + index = i + ts.single.len() + break + } else if s == regStr { + reg = language.Region{} + index = i + ts.single.len() + break + } + } + } + if index == -1 { + index = ts.single.index(lang) + } + return index, scr, reg +} + +func (ts *tagSet) Tags() []language.Tag { + tags := make([]language.Tag, 0, ts.single.len()+len(ts.long)) + ts.single.keys(func(s string) { + tags = append(tags, language.Raw.MustParse(s)) + }) + for _, s := range ts.long { + tags = append(tags, language.Raw.MustParse(s)) + } + return tags +} + +func supportedScripts() []language.Script { + scr := make([]language.Script, 0, scriptIndex.len()) + scriptIndex.keys(func(s string) { + scr = append(scr, language.MustParseScript(s)) + }) + return scr +} + +func supportedRegions() []language.Region { + reg := make([]language.Region, 0, regionIndex.len()) + regionIndex.keys(func(s string) { + reg = append(reg, language.MustParseRegion(s)) + }) + return reg +} + +// tagIndex holds a concatenated lists of subtags of length 2 to 4, one string +// for each length, which can be used in combination with binary search to get +// the index associated with a tag. +// For example, a tagIndex{ +// "arenesfrruzh", // 6 2-byte tags. +// "barwae", // 2 3-byte tags. +// "", +// } +// would mean that the 2-byte tag "fr" had an index of 3, and the 3-byte tag +// "wae" had an index of 7. +type tagIndex [3]string + +func (t *tagIndex) index(s string) int { + sz := len(s) + if sz < 2 || 4 < sz { + return -1 + } + a := t[sz-2] + index := sort.Search(len(a)/sz, func(i int) bool { + p := i * sz + return a[p:p+sz] >= s + }) + p := index * sz + if end := p + sz; end > len(a) || a[p:end] != s { + return -1 + } + // Add the number of tags for smaller sizes. + for i := 0; i < sz-2; i++ { + index += len(t[i]) / (i + 2) + } + return index +} + +// len returns the number of tags that are contained in the tagIndex. +func (t *tagIndex) len() (n int) { + for i, s := range t { + n += len(s) / (i + 2) + } + return n +} + +// keys calls f for each tag. +func (t *tagIndex) keys(f func(key string)) { + for i, s := range *t { + for ; s != ""; s = s[i+2:] { + f(s[:i+2]) + } + } +} diff --git a/vendor/golang.org/x/text/language/display/maketables.go b/vendor/golang.org/x/text/language/display/maketables.go new file mode 100644 index 0000000000..3fcd9c87dd --- /dev/null +++ b/vendor/golang.org/x/text/language/display/maketables.go @@ -0,0 +1,596 @@ +// 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 + +// Generator for display name tables. + +package main + +import ( + "bytes" + "flag" + "fmt" + "log" + "reflect" + "sort" + "strings" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/language" + "golang.org/x/text/unicode/cldr" +) + +var ( + test = flag.Bool("test", false, + "test existing tables; can be used to compare web data with package data.") + outputFile = flag.String("output", "tables.go", "output file") + + stats = flag.Bool("stats", false, "prints statistics to stderr") + + short = flag.Bool("short", false, `Use "short" alternatives, when available.`) + draft = flag.String("draft", + "contributed", + `Minimal draft requirements (approved, contributed, provisional, unconfirmed).`) + pkg = flag.String("package", + "display", + "the name of the package in which the generated file is to be included") + + tags = newTagSet("tags", + []language.Tag{}, + "space-separated list of tags to include or empty for all") + dict = newTagSet("dict", + dictTags(), + "space-separated list or tags for which to include a Dictionary. "+ + `"" means the common list from go.text/language.`) +) + +func dictTags() (tag []language.Tag) { + // TODO: replace with language.Common.Tags() once supported. + const str = "af am ar ar-001 az bg bn ca cs da de el en en-US en-GB " + + "es es-ES es-419 et fa fi fil fr fr-CA gu he hi hr hu hy id is it ja " + + "ka kk km kn ko ky lo lt lv mk ml mn mr ms my ne nl no pa pl pt pt-BR " + + "pt-PT ro ru si sk sl sq sr sr-Latn sv sw ta te th tr uk ur uz vi " + + "zh zh-Hans zh-Hant zu" + + for _, s := range strings.Split(str, " ") { + tag = append(tag, language.MustParse(s)) + } + return tag +} + +func main() { + gen.Init() + + // Read the CLDR zip file. + r := gen.OpenCLDRCoreZip() + defer r.Close() + + d := &cldr.Decoder{} + d.SetDirFilter("main", "supplemental") + d.SetSectionFilter("localeDisplayNames") + data, err := d.DecodeZip(r) + if err != nil { + log.Fatalf("DecodeZip: %v", err) + } + + w := gen.NewCodeWriter() + defer w.WriteGoFile(*outputFile, "display") + + gen.WriteCLDRVersion(w) + + b := builder{ + w: w, + data: data, + group: make(map[string]*group), + } + b.generate() +} + +const tagForm = language.All + +// tagSet is used to parse command line flags of tags. It implements the +// flag.Value interface. +type tagSet map[language.Tag]bool + +func newTagSet(name string, tags []language.Tag, usage string) tagSet { + f := tagSet(make(map[language.Tag]bool)) + for _, t := range tags { + f[t] = true + } + flag.Var(f, name, usage) + return f +} + +// String implements the String method of the flag.Value interface. +func (f tagSet) String() string { + tags := []string{} + for t := range f { + tags = append(tags, t.String()) + } + sort.Strings(tags) + return strings.Join(tags, " ") +} + +// Set implements Set from the flag.Value interface. +func (f tagSet) Set(s string) error { + if s != "" { + for _, s := range strings.Split(s, " ") { + if s != "" { + tag, err := tagForm.Parse(s) + if err != nil { + return err + } + f[tag] = true + } + } + } + return nil +} + +func (f tagSet) contains(t language.Tag) bool { + if len(f) == 0 { + return true + } + return f[t] +} + +// builder is used to create all tables with display name information. +type builder struct { + w *gen.CodeWriter + + data *cldr.CLDR + + fromLocs []string + + // destination tags for the current locale. + toTags []string + toTagIndex map[string]int + + // list of supported tags + supported []language.Tag + + // key-value pairs per group + group map[string]*group + + // statistics + sizeIndex int // total size of all indexes of headers + sizeData int // total size of all data of headers + totalSize int +} + +type group struct { + // Maps from a given language to the Namer data for this language. + lang map[language.Tag]keyValues + headers []header + + toTags []string + threeStart int + fourPlusStart int +} + +// set sets the typ to the name for locale loc. +func (g *group) set(t language.Tag, typ, name string) { + kv := g.lang[t] + if kv == nil { + kv = make(keyValues) + g.lang[t] = kv + } + if kv[typ] == "" { + kv[typ] = name + } +} + +type keyValues map[string]string + +type header struct { + tag language.Tag + data string + index []uint16 +} + +var versionInfo = `// Version is deprecated. Use CLDRVersion. +const Version = %#v + +` + +var self = language.MustParse("mul") + +// generate builds and writes all tables. +func (b *builder) generate() { + fmt.Fprintf(b.w, versionInfo, cldr.Version) + + b.filter() + b.setData("lang", func(g *group, loc language.Tag, ldn *cldr.LocaleDisplayNames) { + if ldn.Languages != nil { + for _, v := range ldn.Languages.Language { + tag := tagForm.MustParse(v.Type) + if tags.contains(tag) { + g.set(loc, tag.String(), v.Data()) + } + } + } + }) + b.setData("script", func(g *group, loc language.Tag, ldn *cldr.LocaleDisplayNames) { + if ldn.Scripts != nil { + for _, v := range ldn.Scripts.Script { + code := language.MustParseScript(v.Type) + if code.IsPrivateUse() { // Qaaa..Qabx + // TODO: data currently appears to be very meager. + // Reconsider if we have data for English. + if loc == language.English { + log.Fatal("Consider including data for private use scripts.") + } + continue + } + g.set(loc, code.String(), v.Data()) + } + } + }) + b.setData("region", func(g *group, loc language.Tag, ldn *cldr.LocaleDisplayNames) { + if ldn.Territories != nil { + for _, v := range ldn.Territories.Territory { + g.set(loc, language.MustParseRegion(v.Type).String(), v.Data()) + } + } + }) + + b.makeSupported() + + b.writeParents() + + b.writeGroup("lang") + b.writeGroup("script") + b.writeGroup("region") + + b.w.WriteConst("numSupported", len(b.supported)) + buf := bytes.Buffer{} + for _, tag := range b.supported { + fmt.Fprint(&buf, tag.String(), "|") + } + b.w.WriteConst("supported", buf.String()) + + b.writeDictionaries() + + b.supported = []language.Tag{self} + + // Compute the names of locales in their own language. Some of these names + // may be specified in their parent locales. We iterate the maximum depth + // of the parent three times to match successive parents of tags until a + // possible match is found. + for i := 0; i < 4; i++ { + b.setData("self", func(g *group, tag language.Tag, ldn *cldr.LocaleDisplayNames) { + parent := tag + if b, s, r := tag.Raw(); i > 0 && (s != language.Script{} && r == language.Region{}) { + parent, _ = language.Raw.Compose(b) + } + if ldn.Languages != nil { + for _, v := range ldn.Languages.Language { + key := tagForm.MustParse(v.Type) + saved := key + if key == parent { + g.set(self, tag.String(), v.Data()) + } + for k := 0; k < i; k++ { + key = key.Parent() + } + if key == tag { + g.set(self, saved.String(), v.Data()) // set does not overwrite a value. + } + } + } + }) + } + + b.writeGroup("self") +} + +func (b *builder) setData(name string, f func(*group, language.Tag, *cldr.LocaleDisplayNames)) { + b.sizeIndex = 0 + b.sizeData = 0 + b.toTags = nil + b.fromLocs = nil + b.toTagIndex = make(map[string]int) + + g := b.group[name] + if g == nil { + g = &group{lang: make(map[language.Tag]keyValues)} + b.group[name] = g + } + for _, loc := range b.data.Locales() { + // We use RawLDML instead of LDML as we are managing our own inheritance + // in this implementation. + ldml := b.data.RawLDML(loc) + + // We do not support the POSIX variant (it is not a supported BCP 47 + // variant). This locale also doesn't happen to contain any data, so + // we'll skip it by checking for this. + tag, err := tagForm.Parse(loc) + if err != nil { + if ldml.LocaleDisplayNames != nil { + log.Fatalf("setData: %v", err) + } + continue + } + if ldml.LocaleDisplayNames != nil && tags.contains(tag) { + f(g, tag, ldml.LocaleDisplayNames) + } + } +} + +func (b *builder) filter() { + filter := func(s *cldr.Slice) { + if *short { + s.SelectOnePerGroup("alt", []string{"short", ""}) + } else { + s.SelectOnePerGroup("alt", []string{"stand-alone", ""}) + } + d, err := cldr.ParseDraft(*draft) + if err != nil { + log.Fatalf("filter: %v", err) + } + s.SelectDraft(d) + } + for _, loc := range b.data.Locales() { + if ldn := b.data.RawLDML(loc).LocaleDisplayNames; ldn != nil { + if ldn.Languages != nil { + s := cldr.MakeSlice(&ldn.Languages.Language) + if filter(&s); len(ldn.Languages.Language) == 0 { + ldn.Languages = nil + } + } + if ldn.Scripts != nil { + s := cldr.MakeSlice(&ldn.Scripts.Script) + if filter(&s); len(ldn.Scripts.Script) == 0 { + ldn.Scripts = nil + } + } + if ldn.Territories != nil { + s := cldr.MakeSlice(&ldn.Territories.Territory) + if filter(&s); len(ldn.Territories.Territory) == 0 { + ldn.Territories = nil + } + } + } + } +} + +// makeSupported creates a list of all supported locales. +func (b *builder) makeSupported() { + // tags across groups + for _, g := range b.group { + for t, _ := range g.lang { + b.supported = append(b.supported, t) + } + } + b.supported = b.supported[:unique(tagsSorter(b.supported))] + +} + +type tagsSorter []language.Tag + +func (a tagsSorter) Len() int { return len(a) } +func (a tagsSorter) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a tagsSorter) Less(i, j int) bool { return a[i].String() < a[j].String() } + +func (b *builder) writeGroup(name string) { + g := b.group[name] + + for _, kv := range g.lang { + for t, _ := range kv { + g.toTags = append(g.toTags, t) + } + } + g.toTags = g.toTags[:unique(tagsBySize(g.toTags))] + + // Allocate header per supported value. + g.headers = make([]header, len(b.supported)) + for i, sup := range b.supported { + kv, ok := g.lang[sup] + if !ok { + g.headers[i].tag = sup + continue + } + data := []byte{} + index := make([]uint16, len(g.toTags), len(g.toTags)+1) + for j, t := range g.toTags { + index[j] = uint16(len(data)) + data = append(data, kv[t]...) + } + index = append(index, uint16(len(data))) + + // Trim the tail of the index. + // TODO: indexes can be reduced in size quite a bit more. + n := len(index) + for ; n >= 2 && index[n-2] == index[n-1]; n-- { + } + index = index[:n] + + // Workaround for a bug in CLDR 26. + // See http://unicode.org/cldr/trac/ticket/8042. + if cldr.Version == "26" && sup.String() == "hsb" { + data = bytes.Replace(data, []byte{'"'}, nil, 1) + } + g.headers[i] = header{sup, string(data), index} + } + g.writeTable(b.w, name) +} + +type tagsBySize []string + +func (l tagsBySize) Len() int { return len(l) } +func (l tagsBySize) Swap(i, j int) { l[i], l[j] = l[j], l[i] } +func (l tagsBySize) Less(i, j int) bool { + a, b := l[i], l[j] + // Sort single-tag entries based on size first. Otherwise alphabetic. + if len(a) != len(b) && (len(a) <= 4 || len(b) <= 4) { + return len(a) < len(b) + } + return a < b +} + +// parentIndices returns slice a of len(tags) where tags[a[i]] is the parent +// of tags[i]. +func parentIndices(tags []language.Tag) []int16 { + index := make(map[language.Tag]int16) + for i, t := range tags { + index[t] = int16(i) + } + + // Construct default parents. + parents := make([]int16, len(tags)) + for i, t := range tags { + parents[i] = -1 + for t = t.Parent(); t != language.Und; t = t.Parent() { + if j, ok := index[t]; ok { + parents[i] = j + break + } + } + } + return parents +} + +func (b *builder) writeParents() { + parents := parentIndices(b.supported) + fmt.Fprintf(b.w, "var parents = ") + b.w.WriteArray(parents) +} + +// writeKeys writes keys to a special index used by the display package. +// tags are assumed to be sorted by length. +func writeKeys(w *gen.CodeWriter, name string, keys []string) { + w.Size += int(3 * reflect.TypeOf("").Size()) + w.WriteComment("Number of keys: %d", len(keys)) + fmt.Fprintf(w, "var (\n\t%sIndex = tagIndex{\n", name) + for i := 2; i <= 4; i++ { + sub := []string{} + for _, t := range keys { + if len(t) != i { + break + } + sub = append(sub, t) + } + s := strings.Join(sub, "") + w.WriteString(s) + fmt.Fprintf(w, ",\n") + keys = keys[len(sub):] + } + fmt.Fprintln(w, "\t}") + if len(keys) > 0 { + w.Size += int(reflect.TypeOf([]string{}).Size()) + fmt.Fprintf(w, "\t%sTagsLong = ", name) + w.WriteSlice(keys) + } + fmt.Fprintln(w, ")\n") +} + +// identifier creates an identifier from the given tag. +func identifier(t language.Tag) string { + return strings.Replace(t.String(), "-", "", -1) +} + +func (h *header) writeEntry(w *gen.CodeWriter, name string) { + if len(dict) > 0 && dict.contains(h.tag) { + fmt.Fprintf(w, "\t{ // %s\n", h.tag) + fmt.Fprintf(w, "\t\t%[1]s%[2]sStr,\n\t\t%[1]s%[2]sIdx,\n", identifier(h.tag), name) + fmt.Fprintln(w, "\t},") + } else if len(h.data) == 0 { + fmt.Fprintln(w, "\t\t{}, //", h.tag) + } else { + fmt.Fprintf(w, "\t{ // %s\n", h.tag) + w.WriteString(h.data) + fmt.Fprintln(w, ",") + w.WriteSlice(h.index) + fmt.Fprintln(w, ",\n\t},") + } +} + +// write the data for the given header as single entries. The size for this data +// was already accounted for in writeEntry. +func (h *header) writeSingle(w *gen.CodeWriter, name string) { + if len(dict) > 0 && dict.contains(h.tag) { + tag := identifier(h.tag) + w.WriteConst(tag+name+"Str", h.data) + + // Note that we create a slice instead of an array. If we use an array + // we need to refer to it as a[:] in other tables, which will cause the + // array to always be included by the linker. See Issue 7651. + w.WriteVar(tag+name+"Idx", h.index) + } +} + +// WriteTable writes an entry for a single Namer. +func (g *group) writeTable(w *gen.CodeWriter, name string) { + start := w.Size + writeKeys(w, name, g.toTags) + w.Size += len(g.headers) * int(reflect.ValueOf(g.headers[0]).Type().Size()) + + fmt.Fprintf(w, "var %sHeaders = [%d]header{\n", name, len(g.headers)) + + title := strings.Title(name) + for _, h := range g.headers { + h.writeEntry(w, title) + } + fmt.Fprintln(w, "}\n") + + for _, h := range g.headers { + h.writeSingle(w, title) + } + n := w.Size - start + fmt.Fprintf(w, "// Total size for %s: %d bytes (%d KB)\n\n", name, n, n/1000) +} + +func (b *builder) writeDictionaries() { + fmt.Fprintln(b.w, "// Dictionary entries of frequent languages") + fmt.Fprintln(b.w, "var (") + parents := parentIndices(b.supported) + + for i, t := range b.supported { + if dict.contains(t) { + ident := identifier(t) + fmt.Fprintf(b.w, "\t%s = Dictionary{ // %s\n", ident, t) + if p := parents[i]; p == -1 { + fmt.Fprintln(b.w, "\t\tnil,") + } else { + fmt.Fprintf(b.w, "\t\t&%s,\n", identifier(b.supported[p])) + } + fmt.Fprintf(b.w, "\t\theader{%[1]sLangStr, %[1]sLangIdx},\n", ident) + fmt.Fprintf(b.w, "\t\theader{%[1]sScriptStr, %[1]sScriptIdx},\n", ident) + fmt.Fprintf(b.w, "\t\theader{%[1]sRegionStr, %[1]sRegionIdx},\n", ident) + fmt.Fprintln(b.w, "\t}") + } + } + fmt.Fprintln(b.w, ")") + + var s string + var a []uint16 + sz := reflect.TypeOf(s).Size() + sz += reflect.TypeOf(a).Size() + sz *= 3 + sz += reflect.TypeOf(&a).Size() + n := int(sz) * len(dict) + fmt.Fprintf(b.w, "// Total size for %d entries: %d bytes (%d KB)\n\n", len(dict), n, n/1000) + + b.w.Size += n +} + +// unique sorts the given lists and removes duplicate entries by swapping them +// past position k, where k is the number of unique values. It returns k. +func unique(a sort.Interface) int { + if a.Len() == 0 { + return 0 + } + sort.Sort(a) + k := 1 + for i := 1; i < a.Len(); i++ { + if a.Less(k-1, i) { + if k != i { + a.Swap(k, i) + } + k++ + } + } + return k +} diff --git a/vendor/golang.org/x/text/language/display/tables.go b/vendor/golang.org/x/text/language/display/tables.go new file mode 100644 index 0000000000..d67f517bca --- /dev/null +++ b/vendor/golang.org/x/text/language/display/tables.go @@ -0,0 +1,44965 @@ +// This file was generated by go generate; DO NOT EDIT + +package display + +// CLDRVersion is the CLDR version from which the tables in this package are derived. +const CLDRVersion = "28" + +// Version is deprecated. Use CLDRVersion. +const Version = "28" + +var parents = [218]int16{ + // Entry 0 - 3F + -1, -1, -1, -1, -1, 4, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 18, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 33, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 43, -1, -1, + 47, 48, 48, -1, -1, -1, -1, 54, + -1, -1, -1, -1, -1, 60, 60, -1, + // Entry 40 - 7F + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + // Entry 80 - BF + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 154, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 167, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 183, -1, 185, -1, -1, -1, -1, -1, + // Entry C0 - FF + -1, -1, -1, -1, -1, -1, -1, 198, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 211, -1, -1, -1, + 215, -1, +} + +// Number of keys: 609 +var ( + langIndex = tagIndex{ + "aaabaeafakamanarasavayazbabebgbibmbnbobrbscacechcocrcscucvcydadedvdzeeel" + + "eneoeseteufafffifjfofrfygagdglgngugvhahehihohrhthuhyhziaidieigiiikio" + + "isitiujajvkakgkikjkkklkmknkokrkskukvkwkylalblglilnloltlulvmgmhmimkml" + + "mnmrmsmtmynandnengnlnnnonrnvnyocojomorospapiplpsptqurmrnrorurwsascsd" + + "sesgsiskslsmsnsosqsrssstsusvswtatetgthtitktntotrtstttyugukuruzvevivo" + + "wawoxhyiyozazhzu", + "aceachadaadyaebafhagqainakkakzalealnaltanganparcarnaroarparqarwaryarzasa" + + "aseastavkawabalbanbarbasbaxbbcbbjbejbembewbezbfdbfqbgnbhobikbinbjnbk" + + "mblabpybqibrabrhbrxbssbuabugbumbynbyvcadcarcaycchcebcggchbchgchkchmc" + + "hnchochpchrchyckbcopcpscrhcsbdakdardavdeldendgrdindjedoidsbdtpduadum" + + "dyodyudzgebuefieglegyekaelxenmesuewoextfanfilfitfonfrcfrmfrofrpfrrfr" + + "sfurgaagaggangaygbagbzgezgilglkgmhgohgomgongorgotgrbgrcgswgucgurguzg" + + "wihaihakhawhifhilhithmnhsbhsnhupibaibbiloinhizhjamjbojgojmcjprjrbjut" + + "kaakabkackajkamkawkbdkblkcgkdekeakenkfokgpkhakhokhqkhwkiukkjklnkmbko" + + "ikokkoskpekrckrikrjkrlkruksbksfkshkumkutladlaglahlamlezlfnlijlivlktl" + + "molollozlrcltglualuilunluolusluylzhlzzmadmafmagmaimakmanmasmdemdfmdr" + + "menmermfemgamghmgomicminmncmnimohmosmrjmuamulmusmwlmwrmwvmyemyvmznna" + + "nnapnaqndsnewnianiunjonmgnnhnognonnovnqonsonusnwcnymnynnyonziosaotap" + + "agpalpampappaupcdpdcpdtpeopflphnpmspntponprgproqucqugrajraprarrgnrif" + + "rofromrtmruerugruprwksadsahsamsaqsassatsazsbasbpscnscosdcsdhseesehse" + + "iselsessgasgsshishnshusidslislysmasmjsmnsmssnksogsrnsrrssystqsuksuss" + + "uxswbswcsycsyrszltcytemteotertettigtivtkltkrtlhtlitlytmhtogtpitrutrv" + + "tsdtsittttumtvltwqtyvtzmudmugaumbundvaivecvepvlsvmfvotvrovunwaewalwa" + + "rwaswbpwuuxalxmfxogyaoyapyavybbyrlyuezapzblzeazenzghzunzxxzza", + "", + } + langTagsLong = []string{ // 22 elements + "ar-001", + "az-Arab", + "de-AT", + "de-CH", + "en-AU", + "en-CA", + "en-GB", + "en-US", + "es-419", + "es-ES", + "es-MX", + "fa-AF", + "fr-CA", + "fr-CH", + "nds-NL", + "nl-BE", + "pt-BR", + "pt-PT", + "ro-MD", + "sr-Latn", + "zh-Hans", + "zh-Hant", + } +) + +var langHeaders = [218]header{ + { // af + afLangStr, + afLangIdx, + }, + { // agq + "AkanÀmalìÀlabìBɛ̀làlusànBùugɨlìaBɨ̀ŋgalìChɛ̂Dzamɛ̀Gɨ̀lêʔKɨŋgeleSɨ̀kpanìs" + + "KpɛɛshìaKɨ̀fàlàŋsiKɨtsɔŋkaŋEndìHɔŋgalìaÈndònɛshìaEgbòÈtalìaDzàkpànêD" + + "zàbvànêKɨmɛ̀kùulîaMàlaeBùumɛsɛ̀Nɛ̀kpalìDɔ̂sKpuwndzabìKpɔlìsKpotùwgîi" + + "LùmanyìaLushìaLùwandàSòmalìSuedìsTamìTàeTʉʉkìsÙkɛlɛnìaUudùwVìyɛtnàmê" + + "YulùbaChàenêZulùAghem", + []uint16{ // 188 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000b, 0x000b, + 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0020, 0x002b, + 0x002b, 0x002b, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, + 0x0037, 0x0037, 0x0037, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, + 0x0045, 0x0045, 0x0045, 0x0045, 0x004f, 0x0058, 0x0058, 0x0064, + 0x0064, 0x0064, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x007e, + 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, 0x008b, + 0x008b, 0x0090, 0x0090, 0x0090, 0x0090, 0x009b, 0x009b, 0x009b, + // Entry 40 - 7F + 0x009b, 0x00a9, 0x00a9, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00b6, 0x00b6, 0x00c1, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, + 0x00cc, 0x00cc, 0x00d4, 0x00d4, 0x00dc, 0x00dc, 0x00dc, 0x00dc, + 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, + 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, + 0x00dc, 0x00dc, 0x00dc, 0x00e2, 0x00e2, 0x00ee, 0x00ee, 0x00ee, + 0x00f9, 0x00f9, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, + 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x010a, 0x010a, 0x0112, + // Entry 80 - BF + 0x0112, 0x011d, 0x011d, 0x011d, 0x011d, 0x0127, 0x012e, 0x0137, + 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, + 0x0137, 0x0137, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, + 0x0146, 0x0146, 0x014b, 0x014b, 0x014b, 0x014f, 0x014f, 0x014f, + 0x014f, 0x014f, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0164, + 0x016a, 0x016a, 0x016a, 0x0177, 0x0177, 0x0177, 0x0177, 0x0177, + 0x0177, 0x017e, 0x017e, 0x0186, 0x018b, 0x018b, 0x018b, 0x018b, + 0x018b, 0x018b, 0x018b, 0x0190, + }, + }, + { // ak + "AkanAmarikArabikBelarus kasaBɔlgeria kasaBengali kasaKyɛk kasaGyaamanGre" + + "ek kasaBorɔfoSpain kasaPɛɛhyia kasaFrɛnkyeHausaHindiHangri kasaIndon" + + "ihyia kasaIgboItaly kasaGyapan kasaGyabanis kasaKambodia kasaKorea k" + + "asaMalay kasaBɛɛmis kasaNɛpal kasaDɛɛkyePungyabi kasaPɔland kasaPɔɔt" + + "ugal kasaRomenia kasaRahyia kasaRewanda kasaSomalia kasaSweden kasaT" + + "amil kasaTaeland kasaTɛɛki kasaUkren kasaUrdu kasaViɛtnam kasaYoruba" + + "Kyaena kasaZulu", + []uint16{ // 181 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000a, 0x000a, + 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x001c, 0x002a, + 0x002a, 0x002a, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0047, 0x0047, 0x0047, 0x0047, 0x0051, 0x0058, 0x0058, 0x0062, + 0x0062, 0x0062, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0078, + 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x007d, + 0x007d, 0x0082, 0x0082, 0x0082, 0x0082, 0x008d, 0x008d, 0x008d, + // Entry 40 - 7F + 0x008d, 0x009c, 0x009c, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, + 0x00aa, 0x00aa, 0x00b5, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, + 0x00c2, 0x00c2, 0x00cf, 0x00cf, 0x00d9, 0x00d9, 0x00d9, 0x00d9, + 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, + 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, + 0x00d9, 0x00d9, 0x00d9, 0x00e3, 0x00e3, 0x00f0, 0x00f0, 0x00f0, + 0x00fb, 0x00fb, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, + 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, 0x0110, 0x0110, 0x011c, + // Entry 80 - BF + 0x011c, 0x012b, 0x012b, 0x012b, 0x012b, 0x0137, 0x0142, 0x014e, + 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, + 0x014e, 0x014e, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, + 0x0165, 0x0165, 0x016f, 0x016f, 0x016f, 0x017b, 0x017b, 0x017b, + 0x017b, 0x017b, 0x0187, 0x0187, 0x0187, 0x0187, 0x0187, 0x0191, + 0x019a, 0x019a, 0x019a, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01ad, 0x01ad, 0x01b8, 0x01bc, + }, + }, + { // am + amLangStr, + amLangIdx, + }, + { // ar + arLangStr, + arLangIdx, + }, + { // ar-EG + "الدنماركية", + []uint16{ // 32 elements + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0014, + }, + }, + { // as + "অসমীয়া", + []uint16{ // 10 elements + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0015, + }, + }, + { // asa + "KiakanKiamhariKiarabuKibelarusiKibulgariaKibanglaKichekiKijerumaniKigiri" + + "kiKiingeredhaKihithpaniaKiajemiKifaranthaKihauthaKihindiKihungariKii" + + "ndonethiaKiigboKiitaliaanoKijapaniKijavaKikambodiaKikoreaKimalesiaKi" + + "burmaKinepaliKiholandhiKipunjabiKipolandiKirenoKiromaniaKiruthiKinya" + + "randwaKithomaliKithwidiKitamilKitailandiKiturukiKiukraniaKiurduKivie" + + "tinamuKiyorubaKichinaKidhuluKipare", + []uint16{ // 205 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x0029, + 0x0029, 0x0029, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, + 0x0031, 0x0031, 0x0031, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, + 0x0042, 0x0042, 0x0042, 0x0042, 0x004a, 0x0055, 0x0055, 0x0060, + 0x0060, 0x0060, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x0071, + 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0079, + 0x0079, 0x0080, 0x0080, 0x0080, 0x0080, 0x0089, 0x0089, 0x0089, + // Entry 40 - 7F + 0x0089, 0x0095, 0x0095, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, + 0x00a6, 0x00a6, 0x00ae, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, + 0x00b4, 0x00b4, 0x00be, 0x00be, 0x00c5, 0x00c5, 0x00c5, 0x00c5, + 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, + 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, + 0x00c5, 0x00c5, 0x00c5, 0x00ce, 0x00ce, 0x00d5, 0x00d5, 0x00d5, + 0x00dd, 0x00dd, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, + 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00f0, 0x00f0, 0x00f9, + // Entry 80 - BF + 0x00f9, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x0108, 0x010f, 0x011a, + 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, + 0x011a, 0x011a, 0x0123, 0x0123, 0x0123, 0x0123, 0x0123, 0x0123, + 0x012b, 0x012b, 0x0132, 0x0132, 0x0132, 0x013c, 0x013c, 0x013c, + 0x013c, 0x013c, 0x0144, 0x0144, 0x0144, 0x0144, 0x0144, 0x014d, + 0x0153, 0x0153, 0x0153, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, + 0x015e, 0x0166, 0x0166, 0x016d, 0x0174, 0x0174, 0x0174, 0x0174, + 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, + // Entry C0 - FF + 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, + 0x0174, 0x0174, 0x0174, 0x0174, 0x017a, + }, + }, + { // ast + "afarabkhazianuavestanínafrikaansakanamháricuaragonésárabeasamésaváricuay" + + "maraazerbaixanubashkirbielorrusubúlgarubislamabambarabengalíntibetan" + + "ubretónbosniucatalánchechenuchamorrocorsucreechecueslávicu eclesiást" + + "icuchuvashgalésdanésalemándivehidzongkhaewegrieguinglésesperantoespa" + + "ñolestoniuvascupersafulahfinlandésfixanuferoésfrancésfrisón occiden" + + "talirlandésgaélicu escocésgalleguguaraníguyaratímanésḥausahebréuhind" + + "ihiri motucroatahaitianuhúngaruarmeniuhererointerlinguaindonesiuinte" + + "rlingueigboyi de Sichuáninupiaqidoislandésitalianuinuktitutxaponésxa" + + "vanésxeorxanukongokikuyukuanyamakazaquistanínkalaallisutḥemercanarés" + + "coreanukanuricachemiréscurdukomicórnicukirguistanínllatínluxemburgué" + + "sgandalimburguéslingalalaosianulituanuluba-katangaletónmalgaxemarsha" + + "llésmaorímacedoniumalayalammongolmarathimalayumaltésbirmanunaurundeb" + + "ele del nortenepalésndonganeerlandésnoruegu Nynorsknoruegu Bokmålnde" + + "bele del surnavajonyanjaoccitanuojibwaoromooriyaoséticupunyabípalipo" + + "lacupashtuportuguésquechuaromancherundirumanurusukinyarwandasánscrit" + + "usardusindhisami del nortesangocingaléseslovacueslovenusamoanushonas" + + "omalínalbanuserbiuswatisotho del sursondanéssuecusuaḥilitamiltelugut" + + "axiquistaníntailandéstigrinyaturcomanutswanatonganuturcutsongatártar" + + "utahitianuuigurucraínurduuzbequistanínvendavietnamínvolapükvalónwolo" + + "fxhosayiddishyorubazhuangchinuzulúachinésacoliadangmeadygheárabe de " + + "Túnezafrihiliaghemainuacadianualabamaaleutgheg d’Albaniaaltai del su" + + "ringlés antiguuangikaaraméumapuchearaonaarapahoárabe d’Arxeliaarawak" + + "árabe de Marruecosárabe d’Exiptuasullingua de signos americanaastur" + + "ianukotavaawadhibaluchibalinésbávarubasaabamunbatak tobaghomalabejab" + + "embabetawibenabafutbadagabalochi occidentalbhojpuribikolbinibanjarko" + + "msiksikabishnupriyabakhtiaribrajbrahuibodoakooseburiatbuginésbulubli" + + "nmedumbacaddocaribecayugaatsamcebuanuchigachibchachagataichuukésmari" + + "xíriga chinookchoctawchipewyanucheroquicheyennekurdu centralcópticuc" + + "apiznonturcu de Crimeakashubianudakotadargwataitadelawareslavedogrib" + + "dinkazarmadogribaxu sorbiudusun centraldualaneerlandés mediujola-fon" + + "yidyuladazagaembúefikemilianuexipciu antiguuekajukelamitainglés medi" + + "uyupik centralewondoestremeñufangfilipínfinlandés de Tornedalenfonfr" + + "ancés cajunfrancés mediufrancés antiguuarpitanufrisón del nortefrisó" + + "n orientalfriulianugagagauzchinu gangayogbayadari zoroastrianugeezgi" + + "lbertésgilakialtualemán mediualtualemán antiguugoan konkanigondigoro" + + "ntalogóticugrebogriegu antiguualemán de Suizawayuufrafragusiigwichʼi" + + "nhaidachinu hakkahawaianuhindi de Fijihiligaynonhititahmongaltu sorb" + + "iuchinu xianghupaibanibibioilokoingushingrianuinglés criollu xamaica" + + "nulojbanngombamachamexudeo-persaxudeo-árabejutlandéskara-kalpakkabil" + + "eñukachinjjukambakawikabardianukanembutyapmakondecabuverdianukenyang" + + "korokaingangkhasikhotanéskoyra chiinikhowarkirmanjkikakokalenjinkimb" + + "undukomi-permyakkonkanikosraeanukpellekarachay-balkarkriokinaray-aka" + + "relianukurukhshambalabafiacolonianukumykkutenailadinolangilahndalamb" + + "alezghianulingua franca novaligurianulivonianulakotalombardumongoloz" + + "iluri del nortelatgalianuluba-lulualuisenolundaluomizoluyiachinu lli" + + "terariulazmadurésmafamagahimaithilimakasarmandingomasáimabamokshaman" + + "darmendemerumorisyenírlandés mediumakhuwa-meettometa’micmacminangkab" + + "aumanchúmanipurimohawkmossimari occidentalmundangmúltiples llingüesc" + + "reekmirandésmarwarimentawaimyeneerzyamazanderanichinu min nannapolit" + + "anunamabaxu alemánnewariniasniueanuao nagakwasiongiemboonnogainorueg" + + "u antiguunovialn’kosotho del nortenuernewari clásicunyamwezinyankole" + + "nyoronzimaOsageturcu otomanupangasinanpahlavipampangapapiamentopalau" + + "anupícarualemán de Pennsylvaniaplautdietschpersa antiguualemán palat" + + "inufeniciupiamontéspónticupohnpeianuprusianuprovenzal antiguukʼicheʼ" + + "quichua del altiplanu de Chimborazorajasthanínrapanuirarotonganuroma" + + "ñolrifianuromboromanírotumanurusynrovianaaromanianurwasandavéssakha" + + "araméu samaritanusamburusasaksantalisaurashtrangambaysangusicilianus" + + "cotssardu sassarésKurdu del sursénecasenaseriselkupkoyraboro senniir" + + "landés antiguusamogitianutachelhitshanárabe chadianusidamobaxu siles" + + "ianuselayaréssami del surlule samiinari samiskolt samisoninkesogdian" + + "usranan tongoserersahofrisón de Saterlandsukumasususumeriucomorianus" + + "wahili del Congusiriacu clásicusiriacusilesianutulutimnetesoterenate" + + "tumtigretivtokelautsakhurklingontlingittalixíntamashektonga nyasatok" + + " pisinturoyotarokotsakoniutsimshiantati musulmántumbukatuvalutasawaq" + + "tuvinianutamazight del Atles centraludmurtugaríticuumbundurootvaiven" + + "ecianuvepsiuflamencu occidentalfranconianu del Mainvóticuvorovunjowa" + + "lserwolayttawaraywashowarlpirichinu wucalmucomingrelianusogayaoyapés" + + "yangbenyembanheengatucantonészapotecasimbólicu Blisszeelandészenagat" + + "amazight estándar de Marruecoszuniensin conteníu llingüísticuzazaára" + + "be estándar modernualemán d’Austriaaltualemán de Suizainglés d’Austr" + + "aliainglés de Canadáinglés de Gran Bretañainglés d’Estaos Xuníosespa" + + "ñol d’América Llatinaespañol européuespañol de Méxicufrancés de Can" + + "adáfrancés de Suizabaxu saxónflamencuportugués del Brasilportugués e" + + "uropéumoldavuserbo-croatachinu simplificáuchinu tradicional", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000e, 0x0018, 0x0021, 0x0025, 0x002e, 0x0037, + 0x003d, 0x0044, 0x004c, 0x0052, 0x005d, 0x0064, 0x006e, 0x0076, + 0x007d, 0x0084, 0x008d, 0x0095, 0x009c, 0x00a2, 0x00aa, 0x00b2, + 0x00ba, 0x00bf, 0x00c3, 0x00c8, 0x00df, 0x00e6, 0x00ec, 0x00f2, + 0x00f9, 0x00ff, 0x0107, 0x010a, 0x0110, 0x0117, 0x0120, 0x0128, + 0x012f, 0x0134, 0x0139, 0x013e, 0x0148, 0x014e, 0x0155, 0x015d, + 0x016f, 0x0178, 0x0189, 0x0190, 0x0198, 0x01a1, 0x01a7, 0x01ae, + 0x01b5, 0x01ba, 0x01c3, 0x01c9, 0x01d1, 0x01d9, 0x01e0, 0x01e6, + // Entry 40 - 7F + 0x01f1, 0x01fa, 0x0205, 0x0209, 0x0217, 0x021e, 0x0221, 0x022a, + 0x0232, 0x023b, 0x0243, 0x024b, 0x0253, 0x0258, 0x025e, 0x0266, + 0x0274, 0x027f, 0x0286, 0x028e, 0x0295, 0x029b, 0x02a6, 0x02ab, + 0x02af, 0x02b7, 0x02c4, 0x02cb, 0x02d8, 0x02dd, 0x02e8, 0x02ef, + 0x02f7, 0x02fe, 0x030a, 0x0310, 0x0317, 0x0322, 0x0328, 0x0331, + 0x033a, 0x0340, 0x0347, 0x034d, 0x0354, 0x035b, 0x0360, 0x0371, + 0x0379, 0x037f, 0x038a, 0x0399, 0x03a8, 0x03b7, 0x03bd, 0x03c3, + 0x03cb, 0x03d1, 0x03d6, 0x03db, 0x03e3, 0x03eb, 0x03ef, 0x03f5, + // Entry 80 - BF + 0x03fb, 0x0405, 0x040c, 0x0414, 0x0419, 0x041f, 0x0423, 0x042e, + 0x0438, 0x043d, 0x0443, 0x0451, 0x0456, 0x045f, 0x0467, 0x046f, + 0x0476, 0x047b, 0x0483, 0x0489, 0x048f, 0x0494, 0x04a1, 0x04aa, + 0x04af, 0x04b8, 0x04bd, 0x04c3, 0x04d1, 0x04db, 0x04e3, 0x04ec, + 0x04f2, 0x04f9, 0x04fe, 0x0504, 0x050c, 0x0515, 0x051a, 0x0521, + 0x0525, 0x0533, 0x0538, 0x0542, 0x054a, 0x0550, 0x0555, 0x055a, + 0x0561, 0x0567, 0x056d, 0x0572, 0x0577, 0x057f, 0x0584, 0x058b, + 0x0591, 0x05a1, 0x05a9, 0x05ae, 0x05b2, 0x05ba, 0x05c1, 0x05c6, + // Entry C0 - FF + 0x05d6, 0x05e3, 0x05f2, 0x05f8, 0x05ff, 0x0606, 0x060c, 0x0613, + 0x0625, 0x062b, 0x063e, 0x064f, 0x0652, 0x066d, 0x0676, 0x067c, + 0x0682, 0x0689, 0x0691, 0x0698, 0x069d, 0x06a2, 0x06ac, 0x06b3, + 0x06b7, 0x06bc, 0x06c2, 0x06c6, 0x06cb, 0x06d1, 0x06e3, 0x06eb, + 0x06f0, 0x06f4, 0x06fa, 0x06fd, 0x0704, 0x070f, 0x0718, 0x071c, + 0x0722, 0x0726, 0x072c, 0x0732, 0x073a, 0x073e, 0x0742, 0x0749, + 0x074e, 0x0754, 0x075a, 0x075f, 0x0766, 0x076b, 0x0772, 0x077a, + 0x0782, 0x0786, 0x0795, 0x079c, 0x07a6, 0x07ae, 0x07b6, 0x07c3, + // Entry 100 - 13F + 0x07cb, 0x07d3, 0x07e2, 0x07ec, 0x07f2, 0x07f8, 0x07fd, 0x0805, + 0x080a, 0x0810, 0x0815, 0x081a, 0x081f, 0x082a, 0x0837, 0x083c, + 0x084d, 0x0857, 0x085c, 0x0862, 0x0867, 0x086b, 0x0873, 0x0882, + 0x0888, 0x088f, 0x089c, 0x08a9, 0x08af, 0x08b9, 0x08bd, 0x08c5, + 0x08dd, 0x08e0, 0x08ee, 0x08fc, 0x090c, 0x0914, 0x0925, 0x0935, + 0x093e, 0x0940, 0x0946, 0x094f, 0x0953, 0x0958, 0x0969, 0x096d, + 0x0977, 0x097d, 0x098e, 0x09a1, 0x09ad, 0x09b2, 0x09bb, 0x09c2, + 0x09c7, 0x09d5, 0x09e5, 0x09ea, 0x09f0, 0x09f5, 0x09fe, 0x0a03, + // Entry 140 - 17F + 0x0a0e, 0x0a16, 0x0a23, 0x0a2d, 0x0a33, 0x0a38, 0x0a43, 0x0a4e, + 0x0a52, 0x0a56, 0x0a5c, 0x0a61, 0x0a67, 0x0a6f, 0x0a88, 0x0a8e, + 0x0a94, 0x0a9b, 0x0aa6, 0x0ab2, 0x0abc, 0x0ac7, 0x0ad0, 0x0ad6, + 0x0ad9, 0x0ade, 0x0ae2, 0x0aec, 0x0af3, 0x0af7, 0x0afe, 0x0b0a, + 0x0b11, 0x0b15, 0x0b1d, 0x0b22, 0x0b2b, 0x0b37, 0x0b3d, 0x0b46, + 0x0b4a, 0x0b52, 0x0b5a, 0x0b66, 0x0b6d, 0x0b76, 0x0b7c, 0x0b8b, + 0x0b8f, 0x0b98, 0x0ba1, 0x0ba7, 0x0baf, 0x0bb4, 0x0bbd, 0x0bc2, + 0x0bc9, 0x0bcf, 0x0bd4, 0x0bda, 0x0bdf, 0x0be8, 0x0bfa, 0x0c03, + // Entry 180 - 1BF + 0x0c0c, 0x0c12, 0x0c1a, 0x0c1f, 0x0c23, 0x0c31, 0x0c3b, 0x0c45, + 0x0c4c, 0x0c51, 0x0c54, 0x0c58, 0x0c5d, 0x0c6d, 0x0c70, 0x0c78, + 0x0c7c, 0x0c82, 0x0c8a, 0x0c91, 0x0c99, 0x0c9f, 0x0ca3, 0x0ca9, + 0x0caf, 0x0cb4, 0x0cb8, 0x0cc0, 0x0cd0, 0x0cde, 0x0ce5, 0x0ceb, + 0x0cf6, 0x0cfd, 0x0d05, 0x0d0b, 0x0d10, 0x0d1f, 0x0d26, 0x0d3a, + 0x0d3f, 0x0d48, 0x0d4f, 0x0d57, 0x0d5c, 0x0d61, 0x0d6c, 0x0d79, + 0x0d83, 0x0d87, 0x0d93, 0x0d99, 0x0d9d, 0x0da4, 0x0dab, 0x0db1, + 0x0dba, 0x0dbf, 0x0dce, 0x0dd4, 0x0dda, 0x0de9, 0x0ded, 0x0dfc, + // Entry 1C0 - 1FF + 0x0e04, 0x0e0c, 0x0e11, 0x0e16, 0x0e1b, 0x0e28, 0x0e32, 0x0e39, + 0x0e41, 0x0e4b, 0x0e53, 0x0e5a, 0x0e71, 0x0e7d, 0x0e8a, 0x0e9a, + 0x0ea1, 0x0eab, 0x0eb3, 0x0ebd, 0x0ec5, 0x0ed6, 0x0edf, 0x0f02, + 0x0f0e, 0x0f15, 0x0f20, 0x0f28, 0x0f2f, 0x0f34, 0x0f3b, 0x0f43, + 0x0f48, 0x0f4f, 0x0f59, 0x0f5c, 0x0f65, 0x0f6a, 0x0f7c, 0x0f83, + 0x0f88, 0x0f8f, 0x0f99, 0x0fa0, 0x0fa5, 0x0fae, 0x0fb3, 0x0fc2, + 0x0fcf, 0x0fd6, 0x0fda, 0x0fde, 0x0fe4, 0x0ff3, 0x1004, 0x100f, + 0x1018, 0x101c, 0x102b, 0x1031, 0x103f, 0x1049, 0x1055, 0x105e, + // Entry 200 - 23F + 0x1068, 0x1072, 0x1079, 0x1081, 0x108d, 0x1092, 0x1096, 0x10aa, + 0x10b0, 0x10b4, 0x10bb, 0x10c4, 0x10d5, 0x10e5, 0x10ec, 0x10f5, + 0x10f9, 0x10fe, 0x1102, 0x1108, 0x110d, 0x1112, 0x1115, 0x111c, + 0x1123, 0x112a, 0x1131, 0x1139, 0x1141, 0x114c, 0x1155, 0x115b, + 0x1161, 0x1169, 0x1172, 0x1180, 0x1187, 0x118d, 0x1194, 0x119d, + 0x11b8, 0x11be, 0x11c8, 0x11cf, 0x11d3, 0x11d6, 0x11df, 0x11e5, + 0x11f8, 0x120c, 0x1213, 0x1217, 0x121c, 0x1222, 0x122a, 0x122f, + 0x1234, 0x123c, 0x1244, 0x124b, 0x1256, 0x125a, 0x125d, 0x1263, + // Entry 240 - 27F + 0x126a, 0x126f, 0x1278, 0x1281, 0x1289, 0x1299, 0x12a3, 0x12a9, + 0x12c9, 0x12cd, 0x12eb, 0x12ef, 0x1307, 0x1307, 0x131a, 0x132e, + 0x1343, 0x1355, 0x136d, 0x1387, 0x13a4, 0x13b5, 0x13c8, 0x13c8, + 0x13db, 0x13ec, 0x13f7, 0x13ff, 0x1414, 0x1427, 0x142e, 0x143a, + 0x144c, 0x145d, + }, + }, + { // az + azLangStr, + azLangIdx, + }, + { // az-Cyrl + "азәрбајҹан дилиалман дилиинҝилис дилииспан дилифрансыз дилииталјан дилиј" + + "апон дилипортугал дилирус диличин дили", + []uint16{ // 180 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x001d, 0x001d, 0x001d, 0x001d, + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, + 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0047, 0x0047, 0x005a, + 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x0071, + 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, + 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, + // Entry 40 - 7F + 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, + 0x0088, 0x0088, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, + 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, + 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, + 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, + 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, + 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, + 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, + // Entry 80 - BF + 0x009b, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00c3, 0x00c3, + 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, + 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, + 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, + 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, + 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, + 0x00c3, 0x00c3, 0x00c3, 0x00d2, + }, + }, + { // bas + "Hɔp u akanHɔp u amhārìkHɔp u arâbHɔp u bièlòrûsHɔp u bûlgârHɔp u bɛŋgàli" + + "Hɔp u cɛ̂kHɔp u jamânHɔp u gri ᷇kyàHɔp u ŋgisìHɔp u panyāHɔp u pɛrsì" + + "àHɔp u pulàsiHɔp u ɓausaHɔp u hindìHɔp u hɔŋgrìiHɔp u indònesìàHɔp " + + "u iɓòHɔp u italìàHɔp u yapànHɔp u yavàHɔp u kmɛ̂rHɔp u kɔrēàHɔp u ma" + + "kɛ᷆Hɔp u birmànHɔp u nepa᷆lHɔp u nlɛ̀ndiHɔp u pɛnjàbiHɔp u pɔlɔ̄nàHɔ" + + "p u pɔtɔ̄kìHɔp u rùmanìàHɔp u ruslàndHɔp u ruāndàHɔp u somàlîHɔp u s" + + "uɛ᷆dHɔp u tamu᷆lHɔp u tâyHɔp u tûrkHɔp u ukrǎnìàHɔp u urdùHɔp u vyɛ̄" + + "dnàmHɔp u yorūbàHɔp u kinàHɔp u zulùƁàsàa", + []uint16{ // 213 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000b, 0x001b, 0x001b, + 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0039, 0x0048, + 0x0048, 0x0048, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, + 0x0059, 0x0059, 0x0059, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0073, 0x0073, 0x0073, 0x0073, 0x0085, 0x0093, 0x0093, 0x00a0, + 0x00a0, 0x00a0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00be, + 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00cb, + 0x00cb, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00e9, 0x00e9, 0x00e9, + // Entry 40 - 7F + 0x00e9, 0x00fc, 0x00fc, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, + 0x0117, 0x0117, 0x0124, 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, + 0x0130, 0x0130, 0x013e, 0x013e, 0x014d, 0x014d, 0x014d, 0x014d, + 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, + 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, + 0x014d, 0x014d, 0x014d, 0x015c, 0x015c, 0x016a, 0x016a, 0x016a, + 0x0179, 0x0179, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, + 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0199, 0x0199, 0x01ab, + // Entry 80 - BF + 0x01ab, 0x01bd, 0x01bd, 0x01bd, 0x01bd, 0x01ce, 0x01dd, 0x01ec, + 0x01ec, 0x01ec, 0x01ec, 0x01ec, 0x01ec, 0x01ec, 0x01ec, 0x01ec, + 0x01ec, 0x01ec, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, + 0x020a, 0x020a, 0x0219, 0x0219, 0x0219, 0x0224, 0x0224, 0x0224, + 0x0224, 0x0224, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0241, + 0x024d, 0x024d, 0x024d, 0x025f, 0x025f, 0x025f, 0x025f, 0x025f, + 0x025f, 0x026e, 0x026e, 0x027a, 0x0286, 0x0286, 0x0286, 0x0286, + 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, + // Entry C0 - FF + 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, + 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, 0x0286, + 0x0286, 0x0286, 0x0286, 0x0286, 0x028e, + }, + }, + { // be + "абхазскаяафрыкаансаканамхарскаяарагонскаяарабскаяасамскаяаварскаяаймараа" + + "зербайджанскаябашкірскаябеларускаябалгарскаябамбарабенгальскаятыбец" + + "каябрэтонскаябаснійскаякаталанскаячачэнскаякарсіканскаячэшскаячуваш" + + "скаявалійскаядацкаянямецкаядзонгкхаэвегрэчаскаяанглійскаяэсперантаі" + + "спанскаяэстонскаябаскскаяфарсіфінскаяфіджыйскаяфарэрскаяфранцузская" + + "фрызскаяірландскаяшатландская гэльскаягалісійскаягуаранігуджарацімэ" + + "нскаяхаўсаіўрытхіндзіхарвацкаягаіцянскаявенгерскаяармянскаяінтэрлін" + + "гваінданезійскаяінтэрлінгвеігбаСычуань Іісландскаяітальянскаяінукты" + + "тутяпонскаяяванскаягрузінскаякікуюказахскаягрэнландскаякхмерскаякан" + + "адакарэйскаякашмірскаякурдскаякорнскаякіргізскаялацінскаялюксембург" + + "скаягандалінгалалаоскаялітоўскаялуба-катангалатышскаямалагасійскаям" + + "аарымакедонскаямалаяламмангольскаямаратхімалайскаямальтыйскаябірман" + + "скаяпаўночная ндэбеленепальскаягаландскаянарвежская (нюнорск)нарвеж" + + "ская (букмал)правансальскаяаромаорыяпанджабіпольскаяпуштупартугальс" + + "каякечуарэтараманскаярундзірумынскаярускаякіньяруандасанскрытсіндхі" + + "паўночнасаамскаясангасінгальскаяславацкаяславенскаяшонасамалійскаяа" + + "лбанскаясербскаясундскаяшведскаясуахілітамільскаятэлугутаджыкскаята" + + "йскаятыгрыньятуркменскаятанганскаятурэцкаятатарскаяуйгурскаяукраінс" + + "каяурдуузбекскаяв’етнамскаявалофкосаідышёрубакітайскаязулуадыгейска" + + "яагемакадзкаяалеуцкаястараанглійскаяарамейскаямапучэасуастурыйскаяб" + + "ембабеназаходняя белуджскаябодабурацкаячыгачэрокіцэнтральнакурдская" + + "копцкаятайтазарманіжнелужыцкаядуаладыёла-фон’іэмбустараэгіпецкаятаг" + + "альскаястарафранцузскаягагаузскаястарагрэцкаяшвейцарская нямецкаягу" + + "сіігавайскаяверхнелужыцкаянгомбэмачамэкабільскаякамбамакондэкабувер" + + "дзьянукойра чыінікаленджынкомі-пярмяцкаяконканішамбалабафіялангалак" + + "отапаўночны лурылуалуямасаімерумаўрыкійскаямакуа-меетаметамагаўкска" + + "ямундангмазандэранскаянаманіжненямецкаяквасіанконуэрньянколекічэром" + + "барваякуцкаясамбурусангупаўднёвакурдскаясенакойрабара сеннітачалхіт" + + "паўднёвасаамскаялуле-саамскаяінары-саамскаяколта-саамскаясуахілі Ко" + + "нгатэсоклінгонтасавакмовы тамазігхтаўневядомая моваваівуньёвальбіры" + + "согастандартны мараканскі тамазігхтняма моўнага матэрыялусучасная с" + + "тандартная арабскаянямецкая (аўстр.)нямецкая (швейц.)англійская (аў" + + "страл.)англійская (канад.)англійская (ЗША)іспанская (лацінаамер.)іс" + + "панская (еўрап.)іспанская (мексікан.)французская (канад.)французска" + + "я (швейц.)ніжнесаксонскаяфламандскаяпартугальская (бразіл.)партугал" + + "ьская (еўрап.)малдаўскаясербска-харвацкаяспрошчаная кітайскаятрадыц" + + "ыйная кітайская", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0012, 0x0012, 0x0024, 0x002c, 0x003e, 0x0052, + 0x0062, 0x0072, 0x0082, 0x008e, 0x00ac, 0x00c0, 0x00d4, 0x00e8, + 0x00e8, 0x00f6, 0x010c, 0x011c, 0x0130, 0x0144, 0x015a, 0x016c, + 0x016c, 0x0184, 0x0184, 0x0192, 0x0192, 0x01a4, 0x01b6, 0x01c2, + 0x01d2, 0x01d2, 0x01e2, 0x01e8, 0x01fa, 0x020e, 0x0220, 0x0232, + 0x0244, 0x0254, 0x025e, 0x025e, 0x026c, 0x0280, 0x0292, 0x02a8, + 0x02b8, 0x02cc, 0x02f3, 0x0309, 0x0317, 0x0329, 0x0337, 0x0341, + 0x034b, 0x0357, 0x0357, 0x0369, 0x037d, 0x0391, 0x03a3, 0x03a3, + // Entry 40 - 7F + 0x03b9, 0x03d3, 0x03e9, 0x03f1, 0x0402, 0x0402, 0x0402, 0x0416, + 0x042c, 0x043e, 0x044e, 0x045e, 0x0472, 0x0472, 0x047c, 0x047c, + 0x048e, 0x04a6, 0x04b8, 0x04c4, 0x04d6, 0x04d6, 0x04ea, 0x04fa, + 0x04fa, 0x050a, 0x051e, 0x0530, 0x054c, 0x0556, 0x0556, 0x0564, + 0x0572, 0x0584, 0x059b, 0x05ad, 0x05c7, 0x05c7, 0x05d1, 0x05e7, + 0x05f7, 0x060d, 0x061b, 0x062d, 0x0643, 0x0657, 0x0657, 0x0678, + 0x068c, 0x068c, 0x06a0, 0x06c5, 0x06e8, 0x06e8, 0x06e8, 0x06e8, + 0x0704, 0x0704, 0x070e, 0x0716, 0x0716, 0x0726, 0x0726, 0x0736, + // Entry 80 - BF + 0x0740, 0x075a, 0x0764, 0x077e, 0x078a, 0x079c, 0x07a8, 0x07be, + 0x07ce, 0x07ce, 0x07da, 0x07fa, 0x0804, 0x081a, 0x082c, 0x0840, + 0x0840, 0x0848, 0x085e, 0x0870, 0x0880, 0x0880, 0x0880, 0x0890, + 0x08a0, 0x08ae, 0x08c2, 0x08ce, 0x08e2, 0x08f0, 0x0900, 0x0916, + 0x0916, 0x092a, 0x093a, 0x093a, 0x094c, 0x094c, 0x095e, 0x0972, + 0x097a, 0x098c, 0x098c, 0x09a3, 0x09a3, 0x09a3, 0x09ad, 0x09b5, + 0x09bd, 0x09c7, 0x09c7, 0x09d9, 0x09e1, 0x09e1, 0x09e1, 0x09e1, + 0x09f5, 0x09f5, 0x09f5, 0x09fd, 0x09fd, 0x0a0d, 0x0a0d, 0x0a1d, + // Entry C0 - FF + 0x0a1d, 0x0a1d, 0x0a3b, 0x0a3b, 0x0a4f, 0x0a5b, 0x0a5b, 0x0a5b, + 0x0a5b, 0x0a5b, 0x0a5b, 0x0a5b, 0x0a61, 0x0a61, 0x0a77, 0x0a77, + 0x0a77, 0x0a77, 0x0a77, 0x0a77, 0x0a77, 0x0a77, 0x0a77, 0x0a77, + 0x0a77, 0x0a81, 0x0a81, 0x0a89, 0x0a89, 0x0a89, 0x0aae, 0x0aae, + 0x0aae, 0x0aae, 0x0aae, 0x0aae, 0x0aae, 0x0aae, 0x0aae, 0x0aae, + 0x0aae, 0x0ab6, 0x0ab6, 0x0ac6, 0x0ac6, 0x0ac6, 0x0ac6, 0x0ac6, + 0x0ac6, 0x0ac6, 0x0ac6, 0x0ac6, 0x0ac6, 0x0ace, 0x0ace, 0x0ace, + 0x0ace, 0x0ace, 0x0ace, 0x0ace, 0x0ace, 0x0ada, 0x0ada, 0x0afe, + // Entry 100 - 13F + 0x0b0c, 0x0b0c, 0x0b0c, 0x0b0c, 0x0b0c, 0x0b0c, 0x0b16, 0x0b16, + 0x0b16, 0x0b16, 0x0b16, 0x0b20, 0x0b20, 0x0b3a, 0x0b3a, 0x0b44, + 0x0b44, 0x0b5a, 0x0b5a, 0x0b5a, 0x0b62, 0x0b62, 0x0b62, 0x0b7e, + 0x0b7e, 0x0b7e, 0x0b7e, 0x0b7e, 0x0b7e, 0x0b7e, 0x0b7e, 0x0b92, + 0x0b92, 0x0b92, 0x0b92, 0x0b92, 0x0bb2, 0x0bb2, 0x0bb2, 0x0bb2, + 0x0bb2, 0x0bb2, 0x0bc6, 0x0bc6, 0x0bc6, 0x0bc6, 0x0bc6, 0x0bc6, + 0x0bc6, 0x0bc6, 0x0bc6, 0x0bc6, 0x0bc6, 0x0bc6, 0x0bc6, 0x0bc6, + 0x0bc6, 0x0bde, 0x0c05, 0x0c05, 0x0c05, 0x0c0f, 0x0c0f, 0x0c0f, + // Entry 140 - 17F + 0x0c0f, 0x0c21, 0x0c21, 0x0c21, 0x0c21, 0x0c21, 0x0c3d, 0x0c3d, + 0x0c3d, 0x0c3d, 0x0c3d, 0x0c3d, 0x0c3d, 0x0c3d, 0x0c3d, 0x0c3d, + 0x0c49, 0x0c55, 0x0c55, 0x0c55, 0x0c55, 0x0c55, 0x0c69, 0x0c69, + 0x0c69, 0x0c73, 0x0c73, 0x0c73, 0x0c73, 0x0c73, 0x0c81, 0x0c9b, + 0x0c9b, 0x0c9b, 0x0c9b, 0x0c9b, 0x0c9b, 0x0cb0, 0x0cb0, 0x0cb0, + 0x0cb0, 0x0cc2, 0x0cc2, 0x0cdd, 0x0ceb, 0x0ceb, 0x0ceb, 0x0ceb, + 0x0ceb, 0x0ceb, 0x0ceb, 0x0ceb, 0x0cf9, 0x0d03, 0x0d03, 0x0d03, + 0x0d03, 0x0d03, 0x0d0d, 0x0d0d, 0x0d0d, 0x0d0d, 0x0d0d, 0x0d0d, + // Entry 180 - 1BF + 0x0d0d, 0x0d19, 0x0d19, 0x0d19, 0x0d19, 0x0d32, 0x0d32, 0x0d32, + 0x0d32, 0x0d32, 0x0d38, 0x0d38, 0x0d3e, 0x0d3e, 0x0d3e, 0x0d3e, + 0x0d3e, 0x0d3e, 0x0d3e, 0x0d3e, 0x0d3e, 0x0d48, 0x0d48, 0x0d48, + 0x0d48, 0x0d48, 0x0d50, 0x0d68, 0x0d68, 0x0d7d, 0x0d85, 0x0d85, + 0x0d85, 0x0d85, 0x0d85, 0x0d99, 0x0d99, 0x0d99, 0x0da7, 0x0da7, + 0x0da7, 0x0da7, 0x0da7, 0x0da7, 0x0da7, 0x0da7, 0x0dc3, 0x0dc3, + 0x0dc3, 0x0dcb, 0x0de5, 0x0de5, 0x0de5, 0x0de5, 0x0de5, 0x0df1, + 0x0df1, 0x0df1, 0x0df1, 0x0df1, 0x0df7, 0x0df7, 0x0dff, 0x0dff, + // Entry 1C0 - 1FF + 0x0dff, 0x0e0f, 0x0e0f, 0x0e0f, 0x0e0f, 0x0e0f, 0x0e0f, 0x0e0f, + 0x0e0f, 0x0e0f, 0x0e0f, 0x0e0f, 0x0e0f, 0x0e0f, 0x0e0f, 0x0e0f, + 0x0e0f, 0x0e0f, 0x0e0f, 0x0e0f, 0x0e0f, 0x0e0f, 0x0e17, 0x0e17, + 0x0e17, 0x0e17, 0x0e17, 0x0e17, 0x0e17, 0x0e21, 0x0e21, 0x0e21, + 0x0e21, 0x0e21, 0x0e21, 0x0e27, 0x0e27, 0x0e35, 0x0e35, 0x0e43, + 0x0e43, 0x0e43, 0x0e43, 0x0e43, 0x0e4d, 0x0e4d, 0x0e4d, 0x0e4d, + 0x0e6d, 0x0e6d, 0x0e75, 0x0e75, 0x0e75, 0x0e92, 0x0e92, 0x0e92, + 0x0ea2, 0x0ea2, 0x0ea2, 0x0ea2, 0x0ea2, 0x0ea2, 0x0ec2, 0x0edb, + // Entry 200 - 23F + 0x0ef6, 0x0f11, 0x0f11, 0x0f11, 0x0f11, 0x0f11, 0x0f11, 0x0f11, + 0x0f11, 0x0f11, 0x0f11, 0x0f11, 0x0f2a, 0x0f2a, 0x0f2a, 0x0f2a, + 0x0f2a, 0x0f2a, 0x0f32, 0x0f32, 0x0f32, 0x0f32, 0x0f32, 0x0f32, + 0x0f32, 0x0f40, 0x0f40, 0x0f40, 0x0f40, 0x0f40, 0x0f40, 0x0f40, + 0x0f40, 0x0f40, 0x0f40, 0x0f40, 0x0f40, 0x0f40, 0x0f4e, 0x0f4e, + 0x0f6d, 0x0f6d, 0x0f6d, 0x0f6d, 0x0f88, 0x0f8e, 0x0f8e, 0x0f8e, + 0x0f8e, 0x0f8e, 0x0f8e, 0x0f8e, 0x0f98, 0x0f98, 0x0f98, 0x0f98, + 0x0f98, 0x0fa8, 0x0fa8, 0x0fa8, 0x0fa8, 0x0fb0, 0x0fb0, 0x0fb0, + // Entry 240 - 27F + 0x0fb0, 0x0fb0, 0x0fb0, 0x0fb0, 0x0fb0, 0x0fb0, 0x0fb0, 0x0fb0, + 0x0fec, 0x0fec, 0x1016, 0x1016, 0x104e, 0x104e, 0x106c, 0x108a, + 0x10b0, 0x10d2, 0x10d2, 0x10ef, 0x1119, 0x1139, 0x115f, 0x115f, + 0x1183, 0x11a7, 0x11c5, 0x11db, 0x1205, 0x122d, 0x1241, 0x1262, + 0x1289, 0x12b2, + }, + }, + { // bem + "Ichi AkanIchi AmhariIchi ArabIchi BelarusIchi BulgarianiIchi BengaliIchi" + + " ChekiIchi JemaniIchi GrikiIchi SunguIchi SpanishiIchi PesiaIchi Fre" + + "nchiIchi HausaIchi HinduIchi HangarianIchi IndonesianiIchi IboIchi I" + + "talianiIchi JapanisiIchi JavanisiIchi KhmerIchi KorianiIchi Maleshan" + + "iIchi BurmaIchi NepaliIchi DachiIchi PunjabiIchi PolishiIchi Potogis" + + "iIchi RomanianiIchi RusianiIchi RwandaIchi SomaliaIchi SwideniIchi T" + + "amilIchi ThaiIchi TakishiIchi UkranianiIchi UruduIchi VietinamuIchi " + + "YorubaIchi ChainisiIchi ZuluIchibemba", + []uint16{ // 218 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0014, 0x0014, + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0029, 0x0038, + 0x0038, 0x0038, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, + 0x0044, 0x0044, 0x0044, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, + 0x0059, 0x0059, 0x0059, 0x0059, 0x0063, 0x006d, 0x006d, 0x007a, + 0x007a, 0x007a, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0090, + 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x009a, + 0x009a, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00b2, 0x00b2, 0x00b2, + // Entry 40 - 7F + 0x00b2, 0x00c2, 0x00c2, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, + 0x00d7, 0x00d7, 0x00e4, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, + 0x00f1, 0x00f1, 0x00fb, 0x00fb, 0x0107, 0x0107, 0x0107, 0x0107, + 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, + 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, + 0x0107, 0x0107, 0x0107, 0x0115, 0x0115, 0x011f, 0x011f, 0x011f, + 0x012a, 0x012a, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0140, 0x0140, 0x014c, + // Entry 80 - BF + 0x014c, 0x0159, 0x0159, 0x0159, 0x0159, 0x0167, 0x0173, 0x017e, + 0x017e, 0x017e, 0x017e, 0x017e, 0x017e, 0x017e, 0x017e, 0x017e, + 0x017e, 0x017e, 0x018a, 0x018a, 0x018a, 0x018a, 0x018a, 0x018a, + 0x0196, 0x0196, 0x01a0, 0x01a0, 0x01a0, 0x01a9, 0x01a9, 0x01a9, + 0x01a9, 0x01a9, 0x01b5, 0x01b5, 0x01b5, 0x01b5, 0x01b5, 0x01c3, + 0x01cd, 0x01cd, 0x01cd, 0x01db, 0x01db, 0x01db, 0x01db, 0x01db, + 0x01db, 0x01e6, 0x01e6, 0x01f3, 0x01fc, 0x01fc, 0x01fc, 0x01fc, + 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, + // Entry C0 - FF + 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, + 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, + 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, + 0x01fc, 0x0205, + }, + }, + { // bez + "HiakanHiamhariHiharabuHibelarusiHibulgariaHibanglaHichekiHijerumaniHigir" + + "ikiHiingerezaHihispaniaHiajemiHifaransaHihausaHihindiHihungariHiindo" + + "nesiaHiiboHiitalianoHijapaniHijavaHikambodiaHikoreaHimalesiaHiburmaH" + + "inepaliHiholanziHipunjabiHipolandiHilenoHilomaniaHilusiHinyarwandaHi" + + "somaliHiswidiHitamilHitailandHitulukiHiukraniaHiurduHivietinamuHiyor" + + "ubaHichinaHizuluHibena", + []uint16{ // 220 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, + 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0020, 0x002a, + 0x002a, 0x002a, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, + 0x0043, 0x0043, 0x0043, 0x0043, 0x004b, 0x0055, 0x0055, 0x005f, + 0x005f, 0x005f, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x006f, + 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0076, + 0x0076, 0x007d, 0x007d, 0x007d, 0x007d, 0x0086, 0x0086, 0x0086, + // Entry 40 - 7F + 0x0086, 0x0091, 0x0091, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, + 0x00a0, 0x00a0, 0x00a8, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00b8, 0x00b8, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00c8, 0x00c8, 0x00cf, 0x00cf, 0x00cf, + 0x00d7, 0x00d7, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, + 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e9, 0x00e9, 0x00f2, + // Entry 80 - BF + 0x00f2, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x0101, 0x0107, 0x0112, + 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, + 0x0112, 0x0112, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, + 0x0121, 0x0121, 0x0128, 0x0128, 0x0128, 0x0131, 0x0131, 0x0131, + 0x0131, 0x0131, 0x0139, 0x0139, 0x0139, 0x0139, 0x0139, 0x0142, + 0x0148, 0x0148, 0x0148, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, + 0x0153, 0x015b, 0x015b, 0x0162, 0x0168, 0x0168, 0x0168, 0x0168, + 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, + // Entry C0 - FF + 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, + 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, + 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, + 0x0168, 0x0168, 0x0168, 0x016e, + }, + }, + { // bg + bgLangStr, + bgLangIdx, + }, + { // bm + "akankanamarikikanlarabukanbiyelorisikanbuligarikanbamanakanbɛngalikancɛk" + + "ikanalimaɲikangɛrɛsikanangilɛkanesipaɲolkanperisanikantubabukanawusa" + + "kaninidikanoŋirikanƐndonezikanigibokanitalikanzapɔnekanjavanekankamb" + + "ojikankorekanmalɛzikanbirimanikannepalekanolandekanpɛnijabikanpolone" + + "kanpɔritigalikanrumanikanirisikanruwandakansomalikansuwɛdikantamulik" + + "antayikanturikikanukɛrɛnikanurudukanwiyɛtinamukanyorubakansiniwakanz" + + "ulukan", + []uint16{ // 181 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0011, 0x0011, + 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x0027, 0x0032, + 0x0032, 0x003b, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, + 0x0046, 0x0046, 0x0046, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, + 0x0059, 0x0059, 0x0059, 0x0059, 0x0064, 0x006e, 0x006e, 0x007a, + 0x007a, 0x007a, 0x0085, 0x0085, 0x0085, 0x0085, 0x0085, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x0096, + 0x0096, 0x009e, 0x009e, 0x009e, 0x009e, 0x00a7, 0x00a7, 0x00a7, + // Entry 40 - 7F + 0x00a7, 0x00b3, 0x00b3, 0x00bb, 0x00bb, 0x00bb, 0x00bb, 0x00bb, + 0x00c3, 0x00c3, 0x00cd, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, + 0x00d6, 0x00d6, 0x00e0, 0x00e0, 0x00e7, 0x00e7, 0x00e7, 0x00e7, + 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, + 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, + 0x00e7, 0x00e7, 0x00e7, 0x00f1, 0x00f1, 0x00fc, 0x00fc, 0x00fc, + 0x0105, 0x0105, 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, + 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, 0x011a, 0x011a, 0x0123, + // Entry 80 - BF + 0x0123, 0x0131, 0x0131, 0x0131, 0x0131, 0x013a, 0x0142, 0x014c, + 0x014c, 0x014c, 0x014c, 0x014c, 0x014c, 0x014c, 0x014c, 0x014c, + 0x014c, 0x014c, 0x0155, 0x0155, 0x0155, 0x0155, 0x0155, 0x0155, + 0x015f, 0x015f, 0x0168, 0x0168, 0x0168, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, 0x0184, + 0x018c, 0x018c, 0x018c, 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, + 0x019a, 0x01a3, 0x01a3, 0x01ac, 0x01b3, + }, + }, + { // bn + bnLangStr, + bnLangIdx, + }, + { // bo + "བོད་སྐད་རྫོང་ཁདབྱིན་ཇིའི་སྐད།ཧིན་དིཉི་ཧོང་སྐད་ནེ་པ་ལིཨུ་རུ་སུ་སྐད་རྒྱ་སྐ" + + "ད་ཟ་ཟའ་སྐད།དབྱིན་ཇིའི་སྐད། (ཁེ་ན་ཌ་)དབྱིན་ཇིའི་སྐད། (དབྱིན་ལན་)དབྱ" + + "ིན་ཇིའི་སྐད། (ཨ་རི་)", + []uint16{ // 596 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x002a, 0x002a, 0x002a, 0x0057, 0x0057, 0x0057, + 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0057, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, + // Entry 40 - 7F + 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, + 0x0069, 0x0069, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, + 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, + 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, + 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, + 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, + 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, + 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, + // Entry 80 - BF + 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, 0x00c6, 0x00c6, + 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, + 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, + 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, + 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, + 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, + 0x00c6, 0x00c6, 0x00c6, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + // Entry C0 - FF + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + // Entry 100 - 13F + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + // Entry 140 - 17F + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + // Entry 180 - 1BF + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + // Entry 1C0 - 1FF + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + // Entry 200 - 23F + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + // Entry 240 - 27F + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, + 0x00f9, 0x013e, 0x0189, 0x01c8, + }, + }, + {}, // bo-IN + { // br + "afarabkhazegavestegafrikaansakanamharegaragonegarabegasamegavaraymaraaze" + + "rbaidjanegbachkirbelarusegbulgaregbislamabambarabengalitibetanegbrez" + + "honegbosnegkatalanegtchetchenegchamorrukorsegkritchekegslavoneg iliz" + + "tchouvatchkembraegdanegalamanegdivehidzongkhaewegresianegsaoznegespe" + + "rantegspagnolegestonegeuskaregpersegfinnegfidjiegfaeroeggallegfrizeg" + + " ar Cʼhornôgiwerzhonegskoseggalizegguaranigujaratimanaveghaousahebra" + + "eghindihiri motukroateghaitieghungaregarmenianeghererointerlinguaind" + + "onezeginterlingueigboyieg Sichuaninupiaqidoislandegitalianeginuktitu" + + "tjapanegjavanegjorjianegkongokikuyukwanyamakazakkhmerkanaregkoreaneg" + + "kanourikashmirikurdegkerneveuregkirgizlatinluksembourgeggandalimbour" + + "geglingalalaoseglituanegluba-katangalatviegmalgachegmarshallmaorimak" + + "edonegmalayalammongolegmarathimalaysegmaltegbirmanegnauruegndebele a" + + "n Norzhnepalegndonganederlandegnorvegeg nynorsknorvegeg bokmålndebel" + + "e ar Sunavacʼhonyanjaokitanegojibwaoriyaosetegpunjabipalipolonegpach" + + "toportugalegkechuaegromañchegrundiroumanegrusianegkinyarwandasanskri" + + "tegsardegsindhisámi an Norzhsangosinghalegslovakegslovenegsamoanshon" + + "asomalialbanegserbegswatisotho ar Susundanegsvedegswahilitamilegtelo" + + "ugoutadjikthaitigrignaturkmenegtswanatongaturkegtsongatatartahitiane" + + "gouigouregukrainegourdououzbekegvendavietnamegvolapükwallonegwolofxh" + + "osayiddishyoroubazhuangsinaegzoulouegachinegacoliadangmeadygeiegarab" + + "eg Tuniziaafrihiliaghemainouegakadegalabamaegaleouteggegegaltaieg ar" + + " Suhensaoznegangikaarameegaraoukanegaraonaarapahoarabeg Aljeriaarawa" + + "kegarabeg Marokoarabeg Egiptasuyezh sinoù Amerikaasturianegawadhibal" + + "outchibalinegbavariegbasaabedawiegbembabenabaloutchi ar Cʼhornôgbhoj" + + "puribikolbinibrajbrahwegbodoakoosebouriatbugiblincaddokaribegatsamce" + + "buanochibchamariegchoktawchipewyancherokeecheyennekurdeg soranikopte" + + "gturkeg Krimeakachoubegdakotadargwadelawaredogribdinkadogriizelsorab" + + "egnederlandeg krenndyulaembuefikhenegiptegekajukelamegkrennsaoznegew" + + "ondofangfilipinegfinneg traoñienn an Tornefongalleg cajunkrenncʼhall" + + "eghencʼhallegarpitanegfrizeg an Norzhfrizeg ar Reterfrioulaneggagaga" + + "ouzegsinaeg Gangayogbayagezeggilbertegkrennalamaneg uhelhenalamaneg " + + "uhelgorontalogoteggrebohencʼhresianegalamaneg Suishaidasinaeg Hakkah" + + "awaieghiligaynonhmonguhelsorabegsinaeg Xianhupaibanibibioingouchegkr" + + "eoleg Jamaikayuzev-persegyuzev-arabegkarakalpakkabilegkachinkambakab" + + "ardegkabuverdianukhasikhotanegkimbundukonkanikosraekpellekaratchay-b" + + "alkarkareliegkurukhkolunegkutenailadinolahndalambalezgilingua franca" + + " novaliguriegmongoloziluba-lulualuisenolundaluolushailuyiasinaeg len" + + "negelmagahimaithilimasaimokshamandarmendemorisegkrenniwerzhonegmanch" + + "oumanipurimohawkmarieg ar Cʼhornôgyezhoù liesmuskogimirandegerzasina" + + "eg Min Nannapolitanegalamaneg izelnewariniasniueaoegnogayhennorsegno" + + "vialsotho an Norzhnewari klaselnyamwezinyankolenyoroosageturkeg otom" + + "anpangasinanpahlavipampangapapiamentopalaupikardegalamaneg Pennsylva" + + "niahenbersegfenikianegpiemontegpontegpohnpeihenbruseghenbrovañsegkic" + + "huaeg Chimborazorajasthanirapanuirarotongaromagnolegromboromaniegaro" + + "umanegrwasandaweyakoutegarameeg ar Samaritanedsasaksantalisikiliegsk" + + "otegsasaresegheniwerzhonegtachelitegshanarabeg Tchadsidamosámi ar Su" + + "sámi Luleåsámi Inarisámi Skoltsoninkesogdiegserersumeregkomoregswahi" + + "li Kongosirieg klaselsiriegsileziegtoulouegterenotetumtigreanegtivto" + + "kelauklingontinglittamachegnyasa tongatok pisinturoyoegtsimshiantumb" + + "ukatuvalutouvatamazigteg Kreizatlasoudmourtegougaritegumbunduyezh di" + + "anavvaiveneziegvepsegflandrezeg ar c’hornôgvotyakegvoroegwalserwalam" + + "owaraywashosinaeg WukalmoukmegrelegyaoyapegkantonegzapotegBlisszelan" + + "degzenagatamacheg Maroko standartzunidiyezharabeg modernalamaneg Aos" + + "triaalamaneg uhel Suissaozneg Aostraliasaozneg Kanadasaozneg Breizh-" + + "Veursaozneg Amerikaspagnoleg Amerika latinspagnoleg Europaspagnoleg " + + "Mecʼhikogalleg Kanadagalleg Suissaksoneg izelflandrezegportugaleg Br" + + "azilportugaleg Europamoldovegserb-kroategsinaeg eeunaetsinaeg hengou" + + "nel", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000c, 0x0013, 0x001c, 0x0020, 0x0027, 0x002f, + 0x0035, 0x003b, 0x003f, 0x0045, 0x0052, 0x0059, 0x0062, 0x006a, + 0x0071, 0x0078, 0x007f, 0x0088, 0x0091, 0x0097, 0x00a0, 0x00ab, + 0x00b3, 0x00b9, 0x00bc, 0x00c3, 0x00d0, 0x00da, 0x00e2, 0x00e7, + 0x00ef, 0x00f5, 0x00fd, 0x0100, 0x0109, 0x0110, 0x011a, 0x0123, + 0x012a, 0x0132, 0x0138, 0x0138, 0x013e, 0x0145, 0x014c, 0x0152, + 0x0166, 0x0170, 0x0176, 0x017d, 0x0184, 0x018c, 0x0193, 0x0199, + 0x01a0, 0x01a5, 0x01ae, 0x01b5, 0x01bc, 0x01c4, 0x01ce, 0x01d4, + // Entry 40 - 7F + 0x01df, 0x01e8, 0x01f3, 0x01f7, 0x0203, 0x020a, 0x020d, 0x0215, + 0x021e, 0x0227, 0x022e, 0x0235, 0x023e, 0x0243, 0x0249, 0x0251, + 0x0256, 0x0256, 0x025b, 0x0262, 0x026a, 0x0271, 0x0279, 0x027f, + 0x027f, 0x028a, 0x0290, 0x0295, 0x02a2, 0x02a7, 0x02b1, 0x02b8, + 0x02be, 0x02c6, 0x02d2, 0x02d9, 0x02e2, 0x02ea, 0x02ef, 0x02f8, + 0x0301, 0x0309, 0x0310, 0x0318, 0x031e, 0x0326, 0x032d, 0x033d, + 0x0344, 0x034a, 0x0355, 0x0365, 0x0375, 0x0382, 0x038b, 0x0391, + 0x0399, 0x039f, 0x039f, 0x03a4, 0x03aa, 0x03b1, 0x03b5, 0x03bc, + // Entry 80 - BF + 0x03c2, 0x03cc, 0x03d4, 0x03de, 0x03e3, 0x03eb, 0x03f3, 0x03fe, + 0x0408, 0x040e, 0x0414, 0x0422, 0x0427, 0x0430, 0x0438, 0x0440, + 0x0446, 0x044b, 0x0451, 0x0458, 0x045e, 0x0463, 0x046e, 0x0476, + 0x047c, 0x0483, 0x048a, 0x0492, 0x0498, 0x049c, 0x04a4, 0x04ad, + 0x04b3, 0x04b8, 0x04be, 0x04c4, 0x04c9, 0x04d3, 0x04dc, 0x04e4, + 0x04ea, 0x04f2, 0x04f7, 0x0500, 0x0508, 0x0510, 0x0515, 0x051a, + 0x0521, 0x0528, 0x052e, 0x0534, 0x053c, 0x0543, 0x0548, 0x054f, + 0x0557, 0x0565, 0x056d, 0x0572, 0x0579, 0x057f, 0x0588, 0x0590, + // Entry C0 - FF + 0x0595, 0x05a2, 0x05ac, 0x05b2, 0x05b9, 0x05c3, 0x05c9, 0x05d0, + 0x05de, 0x05e6, 0x05f3, 0x05ff, 0x0602, 0x0615, 0x061f, 0x061f, + 0x0625, 0x062e, 0x0635, 0x063d, 0x0642, 0x0642, 0x0642, 0x0642, + 0x064a, 0x064f, 0x064f, 0x0653, 0x0653, 0x0653, 0x066a, 0x0672, + 0x0677, 0x067b, 0x067b, 0x067b, 0x067b, 0x067b, 0x067b, 0x067f, + 0x0686, 0x068a, 0x0690, 0x0697, 0x069b, 0x069b, 0x069f, 0x069f, + 0x06a4, 0x06ab, 0x06ab, 0x06b0, 0x06b7, 0x06b7, 0x06be, 0x06be, + 0x06be, 0x06c4, 0x06c4, 0x06cb, 0x06d4, 0x06dc, 0x06e4, 0x06f1, + // Entry 100 - 13F + 0x06f7, 0x06f7, 0x0704, 0x070d, 0x0713, 0x0719, 0x0719, 0x0721, + 0x0721, 0x0727, 0x072c, 0x072c, 0x0731, 0x073c, 0x073c, 0x073c, + 0x074d, 0x074d, 0x0752, 0x0752, 0x0756, 0x075a, 0x075a, 0x0764, + 0x076a, 0x0770, 0x077c, 0x077c, 0x0782, 0x0782, 0x0786, 0x078f, + 0x07a9, 0x07ac, 0x07b8, 0x07c6, 0x07d2, 0x07db, 0x07ea, 0x07f9, + 0x0803, 0x0805, 0x080e, 0x0818, 0x081c, 0x0821, 0x0821, 0x0826, + 0x082f, 0x082f, 0x0841, 0x0851, 0x0851, 0x0851, 0x085a, 0x085f, + 0x0864, 0x0873, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0885, + // Entry 140 - 17F + 0x0891, 0x0898, 0x0898, 0x08a2, 0x08a2, 0x08a7, 0x08b2, 0x08bd, + 0x08c1, 0x08c5, 0x08cb, 0x08cb, 0x08d4, 0x08d4, 0x08e3, 0x08e3, + 0x08e3, 0x08e3, 0x08ef, 0x08fb, 0x08fb, 0x0905, 0x090c, 0x0912, + 0x0912, 0x0917, 0x0917, 0x091f, 0x091f, 0x091f, 0x091f, 0x092b, + 0x092b, 0x092b, 0x092b, 0x0930, 0x0938, 0x0938, 0x0938, 0x0938, + 0x0938, 0x0938, 0x0940, 0x0940, 0x0947, 0x094d, 0x0953, 0x0963, + 0x0963, 0x0963, 0x096b, 0x0971, 0x0971, 0x0971, 0x0978, 0x0978, + 0x097f, 0x0985, 0x0985, 0x098b, 0x0990, 0x0995, 0x09a7, 0x09af, + // Entry 180 - 1BF + 0x09af, 0x09af, 0x09af, 0x09b4, 0x09b8, 0x09b8, 0x09b8, 0x09c2, + 0x09c9, 0x09ce, 0x09d1, 0x09d7, 0x09dc, 0x09eb, 0x09eb, 0x09eb, + 0x09eb, 0x09f1, 0x09f9, 0x09f9, 0x09f9, 0x09fe, 0x09fe, 0x0a04, + 0x0a0a, 0x0a0f, 0x0a0f, 0x0a16, 0x0a25, 0x0a25, 0x0a25, 0x0a25, + 0x0a25, 0x0a2c, 0x0a34, 0x0a3a, 0x0a3a, 0x0a4e, 0x0a4e, 0x0a5a, + 0x0a61, 0x0a69, 0x0a69, 0x0a69, 0x0a69, 0x0a6d, 0x0a6d, 0x0a7b, + 0x0a86, 0x0a86, 0x0a93, 0x0a99, 0x0a9d, 0x0aa1, 0x0aa5, 0x0aa5, + 0x0aa5, 0x0aaa, 0x0ab3, 0x0ab9, 0x0ab9, 0x0ac7, 0x0ac7, 0x0ad4, + // Entry 1C0 - 1FF + 0x0adc, 0x0ae4, 0x0ae9, 0x0ae9, 0x0aee, 0x0afb, 0x0b05, 0x0b0c, + 0x0b14, 0x0b1e, 0x0b23, 0x0b2b, 0x0b40, 0x0b40, 0x0b49, 0x0b49, + 0x0b53, 0x0b5c, 0x0b62, 0x0b69, 0x0b72, 0x0b7f, 0x0b7f, 0x0b92, + 0x0b9c, 0x0ba3, 0x0bac, 0x0bb6, 0x0bb6, 0x0bbb, 0x0bc3, 0x0bc3, + 0x0bc3, 0x0bc3, 0x0bcc, 0x0bcf, 0x0bd6, 0x0bde, 0x0bf4, 0x0bf4, + 0x0bf9, 0x0c00, 0x0c00, 0x0c00, 0x0c00, 0x0c08, 0x0c0e, 0x0c17, + 0x0c17, 0x0c17, 0x0c17, 0x0c17, 0x0c17, 0x0c17, 0x0c24, 0x0c24, + 0x0c2e, 0x0c32, 0x0c3e, 0x0c44, 0x0c44, 0x0c44, 0x0c4f, 0x0c5b, + // Entry 200 - 23F + 0x0c66, 0x0c71, 0x0c78, 0x0c7f, 0x0c7f, 0x0c84, 0x0c84, 0x0c84, + 0x0c84, 0x0c84, 0x0c8b, 0x0c92, 0x0c9f, 0x0cac, 0x0cb2, 0x0cba, + 0x0cc2, 0x0cc2, 0x0cc2, 0x0cc8, 0x0ccd, 0x0cd6, 0x0cd9, 0x0ce0, + 0x0ce0, 0x0ce7, 0x0cee, 0x0cee, 0x0cf6, 0x0d01, 0x0d0a, 0x0d12, + 0x0d12, 0x0d12, 0x0d1b, 0x0d1b, 0x0d22, 0x0d28, 0x0d28, 0x0d2d, + 0x0d42, 0x0d4c, 0x0d55, 0x0d5c, 0x0d67, 0x0d6a, 0x0d72, 0x0d78, + 0x0d91, 0x0d91, 0x0d99, 0x0d9f, 0x0d9f, 0x0da5, 0x0dab, 0x0db0, + 0x0db5, 0x0db5, 0x0dbe, 0x0dc5, 0x0dcd, 0x0dcd, 0x0dd0, 0x0dd5, + // Entry 240 - 27F + 0x0dd5, 0x0dd5, 0x0dd5, 0x0ddd, 0x0de4, 0x0de9, 0x0df1, 0x0df7, + 0x0e0f, 0x0e13, 0x0e19, 0x0e19, 0x0e26, 0x0e26, 0x0e36, 0x0e48, + 0x0e59, 0x0e67, 0x0e7a, 0x0e89, 0x0ea0, 0x0eb0, 0x0ec3, 0x0ec3, + 0x0ed0, 0x0edb, 0x0ee8, 0x0ef2, 0x0f03, 0x0f14, 0x0f1c, 0x0f28, + 0x0f36, 0x0f46, + }, + }, + { // brx + "अब्खाज़ियन्अवस्तन्अफ्रीकीअकनअम्हारिक्आर्गोनीअरबीअसामीअवारिक्आयमाराअज़रबै" + + "जानीबशख़िर्बैलोरूसियन्बल्गैरियन्बिस्लामाबांबाराबंगलातिब्बतीब्रटोंब" + + "ोस्नियाईकातालान्चेचेन्चामोरोकोर्सीकन्क्रीचेक्चर्च स्लाविक्चुवाश्वै" + + "ल्श्डैनीश्ज़र्मनदीवेहीभुटानीएवेग्रीकअंग्रेज़ीएस्पेरान्तोस्पैनिशऐस्" + + "टोनियन्बास्क्फार्सीफुलाह्फिनिश्फ़ीजीफिरोज़ीफ्रांसीसीपश्चीमी फ्रीज़" + + "ियन्आईरिशस्कॉट्स् गैलिक्गैलिशियन्गुआरानीगुजरातीमैंक्सहउसाहिब्रुहिं" + + "दीहीरी मोटुक्रोएशन्हाईशीयन्हंगैरीयन्अरमेनियन्हेरेरोईन्टरलिंग्वाइन्" + + "डोनेशियन्ईन्टरलिंग्वेईग्बोसीचुआन् यीइनुपियाक़्ईडोआईस्लैंडिक्ईटालिय" + + "न्इनूक्टीटूत्जापानीजावानीसजॉर्जियन्कॉंगोकिकुयुकुआनयामाक़ज़ाख़्कलाल" + + "ीसुतख्मेरकन्नड्कोरीयन्कनुरीकश्मिरीकुर्दीकोमीकौर्नवॉलीकिरग़ीज़्लैटी" + + "न्लुक्समबुर्गीगांडालींबुर्गीलिंगालालाओसीयन्लिथुआनियन्लुबा कटांगाला" + + "टवियन् (लैट्टीश)मालागासीमार्शलीमाओरीमैसेडोनियन्मलयालममोंगोलियनमराठ" + + "ीमलायमालटीज़्बर्मीनाऊरूउत्तर न्दबेलेनेपालीन्डोंगाडच्नॉर्वेजियन् नी" + + "नॉर्स्क्नोर्वेगी बोकमालदक्षिणी न्दबेलेनावाहोन्यानजाओक्सीतानओहीबवाओ" + + "रोमो (अफ़ान)उड़ियाओस्सेटीपंजाबीपालीपोलिशपख़्तुपुर्तगालीक्वेचुआरेह्" + + "टो-रोमान्सकिरून्दीरूमानीयन्रुसीकिन्यारुआण्डासंस्कृत्सार्दीनीसिंधीउ" + + "त्तरी सामीसांग्रोसींहालास्लोवाक्स्लोवेनियन्सामोअनशोनासोमालीआल्बेनि" + + "यन्सर्बियन्स्वाटिसुन्दानीस्वीडिशस्वाहिलीतमिळतेलुगुताजिक्थाईतिग्रीन" + + "्यातुर्कमेनत्स्वानाटॉंगातुर्कीसोंगाटाटर्टाहिटिउईग़ुरयूक्रेनियन्ऊर्" + + "दुउज़बेक्वेंडावियेतनामीवोलापोकवालुनवोलोफख़ोसायीद्दीशयोरूबाज़ुआंगची" + + "नीज़ुलूअचेहनीअकोलीअडांगमेअडीगेअफ्रीहीलीऐनूअकाडिनीअलुटपुरानी अंग्रे" + + "ज़ीअंगीकाअरामाईकअरापाहोअरावाकअवधीबलूचीबालिनीबास्क़्बेजाबेंबाभोजपुर" + + "ीबिकोल्बिनीसीकसीकाब्रजबड़ोबुरियातबुगीनीब्लीनकाद्दौकारीब्आत्समचेबुआ" + + "नोचीबचाचगताईचुकेसेमारीचीनूक् जार्गन्चौक्टोचिपेवियान्चीरोकीशायान्कॉ" + + "प्टीक्तुर्की क्रिमियाकाशुबियान्डकौटादर्गवादलावार्स्लेव्डोगरीब्डींग" + + "काडोगरीसोर्बियन्डुआलामध्य डचद्युआलाएफीक्प्राचीन मिस्रीएकाजुकएलामीम" + + "ध्य अंग्रेज़ीएवौंडोफाँग्फिलिपिनोफोनमध्य फ्रांसीसीपुरानी फ्रांसीसीउ" + + "त्तरी फ्रीज़ियन्पूर्वी फ्रीज़ियन्फ्रीउलीअन्गागायोग्बायागीज़्गीलबर्" + + "टीमध्य उच्चस्तरी जर्मनपुरानी उच्चस्तरी जर्मनगाँडीगोरंटालोगॉथिकग्रे" + + "बोप्राचीन यूनानीस्वीस जर्मनग्वीचलीनहईडाहवाईअनहीलीगैनोनहीत्तीह्मौंग" + + "ऊपरी सौर्बियनहूपाईबान्ईलोकोईंगुषलोजबानयहुदी फ़ारसीयहुदी अरबीकारा क" + + "लपककाबील्कचीन्जुकंबाकावीकबार्डी भाषात्याप्कोरोख़ासीख़ोतानीकींबुंडु" + + "कोंकणीकोस्राईयन्क्पेलेकराचय् बलकार्करेलियन्कुरुख़्कुमीक्कुतेनाईलाड" + + "़ीनोलाह्डांलांबालेज़गीयानमोंगोलोज़ीलुबा लुलुआलुईसेनोलुंडालुओलुशाईम" + + "ादुरीमघीमैथीलीमक्सरमांडींगोमसाईमोक्षामंदारमेंदेमध्य आईरीश भाषामीकम" + + "ाकमिनंगकाबाउमांचुमणीपुरीमोहोकमोस्सीक्रीकमीरांडीमारवाड़ीऐर्ज़ियानेआ" + + "पोलिटननीजी स्तरिय जर्मननेवारीनियासनियुइआननोगाईपुरानी नॉर्स्न्गकोपु" + + "रानी नेवारीन्यामवेज़ीन्यानकोलेन्यौरोन्ज़ीमाओसेजतुर्की ओटोमानपांगास" + + "ीननपहलवीपंपंगापापीआमेन्तोपालाऊपुरानी फ़ारसीफीनीसीपोहनपीपुरानी प्रो" + + "वाँसालराजस्थानीरापानुईरारोटोंगारुमानीआरोमानीसंडावेयकुट्समारीती आरा" + + "माईक़सासकसंतालीसीसीलीअनस्कॉटसेलकुपपुरानी आईरीशशानसीदामोपश्चीमी साम" + + "ीलुले सामीईनारी सामीस्कोल्ट् सामीसोनिंगकेसोगडीयनस्रनान् टॉंगोसेरेर" + + "सुकुमासुसुसुमेरिअनपारंपरीक सिरिआकसिरिआकतीमनेतेरेनोतेतुमटीग्रेटीव्ट" + + "ोकेलौक्लींगदनट्लिंगीततमाशेकन्यासा टॉंगातोक पिसीनत्सीमशीआन्टुँबुकाट" + + "ुवालुटुवीउड़मुर्तउगारितीउंबुंडुरुटवाईवोटीकवालामोवारयवाशोकालमीकयाओय" + + "ापीज़ज़ापोतेकब्लीस चिन्हज़ेनागाज़ुनीरिक्तज़ाज़ाजर्मन (ऑस्ट्रिया)उच" + + "्च स्तरिय स्वीस जर्मनअंग्रेज़ी (ऑस्ट्रेलिया का)अंग्रेज़ी (कनाडाई)अ" + + "ंग्रेजी (ब्रिटिश)अंग्रेज़ी (अमरिकी)लैटिन अमरिकी स्पैनिशईवेरियाई स्" + + "पैनिशफ्रांसीसी (कनाडाई)फ्रांसीसी (स्वीस)फ्लेमीमोल्डेवियन्सर्बो-क्र" + + "ोएशन्चीनी (सरलीकृत)चीनी (पारम्परिक)", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0021, 0x0036, 0x004b, 0x0054, 0x006f, 0x0084, + 0x0090, 0x009f, 0x00b4, 0x00c6, 0x00e4, 0x00f9, 0x011a, 0x0138, + 0x0150, 0x0165, 0x0174, 0x0189, 0x019b, 0x01b6, 0x01ce, 0x01e0, + 0x01f2, 0x020d, 0x0219, 0x0225, 0x024a, 0x025c, 0x026e, 0x0280, + 0x0292, 0x02a4, 0x02b6, 0x02bf, 0x02ce, 0x02e9, 0x030a, 0x031f, + 0x033d, 0x034f, 0x0361, 0x0373, 0x0385, 0x0394, 0x03a9, 0x03c4, + 0x03f8, 0x0407, 0x0432, 0x044d, 0x0462, 0x0477, 0x0489, 0x0495, + 0x04a7, 0x04b6, 0x04cf, 0x04e7, 0x04ff, 0x051a, 0x0535, 0x0547, + // Entry 40 - 7F + 0x056b, 0x058f, 0x05b3, 0x05c2, 0x05de, 0x05fc, 0x0605, 0x0626, + 0x063e, 0x065f, 0x0671, 0x0686, 0x06a1, 0x06b0, 0x06c2, 0x06da, + 0x06f2, 0x070a, 0x0719, 0x072b, 0x0740, 0x074f, 0x0764, 0x0776, + 0x0782, 0x079d, 0x07b8, 0x07ca, 0x07ee, 0x07fd, 0x0818, 0x082d, + 0x0845, 0x0863, 0x0882, 0x08b2, 0x08ca, 0x08df, 0x08ee, 0x090f, + 0x0921, 0x093c, 0x094b, 0x0957, 0x096f, 0x097e, 0x098d, 0x09b2, + 0x09c4, 0x09d9, 0x09e2, 0x0a22, 0x0a4d, 0x0a78, 0x0a8a, 0x0a9f, + 0x0ab7, 0x0ac9, 0x0aea, 0x0afc, 0x0b11, 0x0b23, 0x0b2f, 0x0b3e, + // Entry 80 - BF + 0x0b50, 0x0b6b, 0x0b80, 0x0ba8, 0x0bc0, 0x0bdb, 0x0be7, 0x0c0e, + 0x0c26, 0x0c3e, 0x0c4d, 0x0c6c, 0x0c81, 0x0c96, 0x0cae, 0x0ccf, + 0x0ce1, 0x0ced, 0x0cff, 0x0d1d, 0x0d35, 0x0d47, 0x0d47, 0x0d5f, + 0x0d74, 0x0d8c, 0x0d98, 0x0daa, 0x0dbc, 0x0dc5, 0x0de3, 0x0dfb, + 0x0e13, 0x0e22, 0x0e34, 0x0e43, 0x0e52, 0x0e64, 0x0e76, 0x0e97, + 0x0ea6, 0x0ebb, 0x0eca, 0x0ee5, 0x0efa, 0x0f09, 0x0f18, 0x0f27, + 0x0f3c, 0x0f4e, 0x0f60, 0x0f6c, 0x0f7b, 0x0f8d, 0x0f9c, 0x0fb1, + 0x0fc0, 0x0fc0, 0x0fdb, 0x0fdb, 0x0fe4, 0x0ff9, 0x0ff9, 0x1005, + // Entry C0 - FF + 0x1005, 0x1005, 0x1033, 0x1045, 0x105a, 0x105a, 0x105a, 0x106f, + 0x106f, 0x1081, 0x1081, 0x1081, 0x1081, 0x1081, 0x1081, 0x1081, + 0x108d, 0x109c, 0x10ae, 0x10ae, 0x10c3, 0x10c3, 0x10c3, 0x10c3, + 0x10cf, 0x10de, 0x10de, 0x10de, 0x10de, 0x10de, 0x10de, 0x10f3, + 0x1105, 0x1111, 0x1111, 0x1111, 0x1126, 0x1126, 0x1126, 0x1132, + 0x1132, 0x113e, 0x113e, 0x1153, 0x1165, 0x1165, 0x1174, 0x1174, + 0x1186, 0x1198, 0x1198, 0x11a7, 0x11bc, 0x11bc, 0x11cb, 0x11da, + 0x11ec, 0x11f8, 0x1220, 0x1232, 0x1250, 0x1262, 0x1274, 0x1274, + // Entry 100 - 13F + 0x128c, 0x128c, 0x12b7, 0x12d5, 0x12e4, 0x12f6, 0x12f6, 0x130b, + 0x131d, 0x1332, 0x1344, 0x1344, 0x1353, 0x136e, 0x136e, 0x137d, + 0x1390, 0x1390, 0x13a5, 0x13a5, 0x13a5, 0x13b4, 0x13b4, 0x13dc, + 0x13ee, 0x13fd, 0x1425, 0x1425, 0x1437, 0x1437, 0x1446, 0x145e, + 0x145e, 0x1467, 0x1467, 0x148f, 0x14bd, 0x14bd, 0x14ee, 0x151f, + 0x153d, 0x1543, 0x1543, 0x1543, 0x154f, 0x1561, 0x1561, 0x1570, + 0x1588, 0x1588, 0x15c0, 0x15fe, 0x15fe, 0x160d, 0x1625, 0x1634, + 0x1646, 0x166e, 0x168d, 0x168d, 0x168d, 0x168d, 0x16a5, 0x16b1, + // Entry 140 - 17F + 0x16b1, 0x16c3, 0x16c3, 0x16de, 0x16f0, 0x1702, 0x1727, 0x1727, + 0x1733, 0x1742, 0x1742, 0x1751, 0x1760, 0x1760, 0x1760, 0x1772, + 0x1772, 0x1772, 0x1794, 0x17b0, 0x17b0, 0x17c9, 0x17db, 0x17ea, + 0x17f0, 0x17fc, 0x1808, 0x182a, 0x182a, 0x183c, 0x183c, 0x183c, + 0x183c, 0x1848, 0x1848, 0x1857, 0x186c, 0x186c, 0x186c, 0x186c, + 0x186c, 0x186c, 0x1884, 0x1884, 0x1896, 0x18b4, 0x18c6, 0x18eb, + 0x18eb, 0x18eb, 0x1903, 0x1918, 0x1918, 0x1918, 0x1918, 0x192a, + 0x193f, 0x1954, 0x1954, 0x1969, 0x1978, 0x1993, 0x1993, 0x1993, + // Entry 180 - 1BF + 0x1993, 0x1993, 0x1993, 0x19a2, 0x19b1, 0x19b1, 0x19b1, 0x19cd, + 0x19e2, 0x19f1, 0x19fa, 0x1a09, 0x1a09, 0x1a09, 0x1a09, 0x1a1b, + 0x1a1b, 0x1a24, 0x1a36, 0x1a45, 0x1a5d, 0x1a69, 0x1a69, 0x1a7b, + 0x1a8a, 0x1a99, 0x1a99, 0x1a99, 0x1ac2, 0x1ac2, 0x1ac2, 0x1ad4, + 0x1af2, 0x1b01, 0x1b16, 0x1b25, 0x1b37, 0x1b37, 0x1b37, 0x1b37, + 0x1b46, 0x1b5b, 0x1b73, 0x1b73, 0x1b73, 0x1b8b, 0x1b8b, 0x1b8b, + 0x1ba6, 0x1ba6, 0x1bd5, 0x1be7, 0x1bf6, 0x1c0b, 0x1c0b, 0x1c0b, + 0x1c0b, 0x1c1a, 0x1c3f, 0x1c3f, 0x1c4e, 0x1c4e, 0x1c4e, 0x1c73, + // Entry 1C0 - 1FF + 0x1c91, 0x1cac, 0x1cbe, 0x1cd3, 0x1cdf, 0x1d04, 0x1d1f, 0x1d2e, + 0x1d40, 0x1d61, 0x1d70, 0x1d70, 0x1d70, 0x1d70, 0x1d95, 0x1d95, + 0x1da7, 0x1da7, 0x1da7, 0x1db9, 0x1db9, 0x1dea, 0x1dea, 0x1dea, + 0x1e05, 0x1e1a, 0x1e35, 0x1e35, 0x1e35, 0x1e35, 0x1e47, 0x1e47, + 0x1e47, 0x1e47, 0x1e5c, 0x1e5c, 0x1e6e, 0x1e7d, 0x1eab, 0x1eab, + 0x1eb7, 0x1ec9, 0x1ec9, 0x1ec9, 0x1ec9, 0x1ee1, 0x1ef0, 0x1ef0, + 0x1ef0, 0x1ef0, 0x1ef0, 0x1ef0, 0x1f02, 0x1f02, 0x1f24, 0x1f24, + 0x1f24, 0x1f2d, 0x1f2d, 0x1f3f, 0x1f3f, 0x1f3f, 0x1f61, 0x1f7a, + // Entry 200 - 23F + 0x1f96, 0x1fbb, 0x1fd3, 0x1fe8, 0x200d, 0x201c, 0x201c, 0x201c, + 0x202e, 0x203a, 0x2052, 0x2052, 0x2052, 0x207d, 0x208f, 0x208f, + 0x208f, 0x209e, 0x209e, 0x20b0, 0x20bf, 0x20d1, 0x20dd, 0x20ef, + 0x20ef, 0x2107, 0x211f, 0x211f, 0x2131, 0x2153, 0x216c, 0x216c, + 0x216c, 0x216c, 0x218a, 0x218a, 0x219f, 0x21b1, 0x21b1, 0x21bd, + 0x21bd, 0x21d5, 0x21ea, 0x21ff, 0x2208, 0x2211, 0x2211, 0x2211, + 0x2211, 0x2211, 0x2220, 0x2220, 0x2220, 0x2220, 0x2232, 0x223e, + 0x224a, 0x224a, 0x224a, 0x225c, 0x225c, 0x225c, 0x2265, 0x2277, + // Entry 240 - 27F + 0x2277, 0x2277, 0x2277, 0x2277, 0x228f, 0x22ae, 0x22ae, 0x22c3, + 0x22c3, 0x22d2, 0x22e1, 0x22f3, 0x22f3, 0x22f3, 0x2320, 0x235f, + 0x23a5, 0x23d5, 0x2405, 0x2435, 0x246d, 0x249b, 0x249b, 0x249b, + 0x24cb, 0x24f8, 0x24f8, 0x250a, 0x250a, 0x250a, 0x252b, 0x2553, + 0x2577, 0x25a1, + }, + }, + { // bs + "afarskiabhazijskiavestanskiafrikanerskiakanamharskiaragonežanskiarapskia" + + "semijskiavarskiajmaraazerbejdžanskibaškirskibjeloruskibugarskibislam" + + "abambarabengalskitibetanskibretonskibosanskikatalonskičečenskičamoro" + + "korzikanskikričeškistaroslovenskičuvaškivelškidanskinjemačkidivehijs" + + "kidžongaevegrčkiengleskiesperantošpanskiestonskibaskijskiperzijskifu" + + "lahfinskifidžijskifarskifrancuskifrizijskiirskiškotski galskigalskig" + + "varanigudžaratimankshausahebrejskihindihiri motuhrvatskihaićanskimađ" + + "arskijermenskihererointerlingvaindonezijskiinterlingveigbosičuan jii" + + "nupiakidoislandskiitalijanskiinuktitutjapanskijavanskigruzijskikongo" + + "kikujukuanjamakazačkikalalisutskikmerskikanadakorejskikanurikašmirik" + + "urdskikomikorniškikirgiskilatinskiluksemburškigandalimburgišlingalal" + + "aoškilitvanskiluba-katangaletonskimalagazijskimaršalskimaorskimakedo" + + "nskimalajalammongolskimaratimalajskimalteškiburmanskinaurusjeverni n" + + "debelenepalskindongaholandskinorveški njorsknorveški bokmaljužni nde" + + "belenavahonjanjaprovansalskiojibvaoromoorijskiosetskipandžabskipalip" + + "oljskipaštunskiportugalskikvenčareto-romanskirundirumunskiruskikinja" + + "rvandasanskritsardinijskisindisjeverni samisangosingaleskislovačkisl" + + "ovenačkisamoanskišonasomalskialbanskisrpskisvatisesotosundanskišveds" + + "kisvahilitamilskitelugutadžičkitajlandskitigrinjaturkmenskitsvanaton" + + "ganskiturskitsongatatarskitahićanskiujgurskiukrajinskiurduuzbečkiven" + + "davijetnamskivolapükvalunvolofkosajidišjorubanskizuangkineskizuluači" + + "neskiakoliadangmejskiadigejskiafrihiliaghemainuakadijskialjutjužni a" + + "ltaistaroengleskiangikaarmajskiaraukanskiarapahoaravakasuasturijskia" + + "vadhibalučibalinezijskibasabejabembabenazapadni belučkibojpuribikolb" + + "inisiksikabrajbodoburiatbuginežanskiiblinkadokaripskiatsamcebuanočig" + + "ačibčačagataičukeskimaričinukskičoktavskičipvijanskičirokičejenskiso" + + "ranski kurdskikoptskikrimeanski turskikašubijanskidakotadargvataitad" + + "elaverslavskidogribdinkazarmadogridonjolužičkosrpskidualasrednji hol" + + "andskijola-fonyiđulaembuefikskistaroegipatskiekajukelamitskisrednji " + + "engleskievondofangfilipinskifonsrednji francuskistarofrancuskisevern" + + "o-frizijskiistočni frizijskifriulijskigagagauškigajogbajadžizgilbert" + + "škisrednji visoki nemačkistaronemačkigondigorontalogotskigrebostaro" + + "grčkišvajcarski njemačkigusiihaidahavajskihiligajnonhititehmonggornj" + + "olužičkosrpskihupaibanilokoingušetskilojbanngombamachamejudeo-persij" + + "skijudeo-arapskikara-kalpaškikabilekačinžjukambakavikabardijskitjapm" + + "akondezelenortskikorokasikotanizijskikoyra chiinikalenjinkimbundukom" + + "i-permjačkikonkanikosreanskikpelekaračaj-balkarkarelijskikurukhshamb" + + "alabafiakumikkutenailadinolangilandalambalezgianlakotamongolozisjeve" + + "rni luriluba-lulualuisenolundaluolušailuyiamadureškimagahimaitilimak" + + "asarmandingomasaimokšamandarmendemerumauricijski kreolskisrednji irs" + + "kimakhuwa-meettometa’mikmakminangkabaumančumanipurimahavskimosimunda" + + "ngviše jezikakriškimirandeškimarvarierzijamazanderanskineapolitanski" + + "namaniski nemačkinevariniasniueankwasionogaistari norskinkoseverni s" + + "otonuerklasični nevarinjamvezinjankolenjoronzimaosageotomanski tursk" + + "ipangasinskipahlavipampangapapiamentopalauanskistaropersijskifeničan" + + "skiponpejskistaroprovansalskikičerađastanirapanuirarotonganromboroma" + + "niaromanijskiruasandavejakutsamaritanski aramejskisamburusasaksantal" + + "isangusicilijanskiškotskijužnokurdskisenaselkapkojraboro senistaroir" + + "skitahelhitšansidamojužni samilule samiinari samiskoltski jeziksonin" + + "kesodžijenskisrananski tongoserersukumasususumerskikongoanski swahil" + + "iklasični sirijskisirijskitimnetesoterenotetumtigretivtokelauklingon" + + "skitlingittamašeknjasa tongatok pisintsimšiantumbukatuvalutasavaktuv" + + "inijskimarokanski tamazigtudmurtugaritskiumbundurunvaivotskivunjoval" + + "amovarejvašovarlpirikalmiksogajaojapeškizapotečkiblisimbolizenagasta" + + "ndardni marokanski tamazigtzunibez lingvističkog sadržajazazamoderni" + + " standardni arapskiaustrijski njemačkigornjonjemački (švicarski)aust" + + "ralski engleskikanadski engleskibritanski engleskiamerički engleskil" + + "atinoamerički španskievropski španskimeksički španskikanadski francu" + + "skišvajcarski francuskiniskosaksonskiflamanskimoldavskisrpskohrvatsk" + + "ikineski (pojednostavljeni)kineski (tradicionalni)", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0007, 0x0011, 0x001b, 0x0027, 0x002b, 0x0033, 0x0041, + 0x0048, 0x0051, 0x0058, 0x005e, 0x006d, 0x0077, 0x0081, 0x0089, + 0x0090, 0x0097, 0x00a0, 0x00aa, 0x00b3, 0x00bb, 0x00c5, 0x00cf, + 0x00d6, 0x00e1, 0x00e4, 0x00eb, 0x00f9, 0x0102, 0x0109, 0x010f, + 0x0118, 0x0122, 0x0129, 0x012c, 0x0132, 0x013a, 0x0143, 0x014b, + 0x0153, 0x015c, 0x0165, 0x016a, 0x0170, 0x017a, 0x0180, 0x0189, + 0x0192, 0x0197, 0x01a6, 0x01ac, 0x01b3, 0x01bd, 0x01c2, 0x01c7, + 0x01d0, 0x01d5, 0x01de, 0x01e6, 0x01f0, 0x01f9, 0x0202, 0x0208, + // Entry 40 - 7F + 0x0213, 0x021f, 0x022a, 0x022e, 0x0238, 0x023f, 0x0242, 0x024b, + 0x0256, 0x025f, 0x0267, 0x026f, 0x0278, 0x027d, 0x0283, 0x028b, + 0x0293, 0x029f, 0x02a6, 0x02ac, 0x02b4, 0x02ba, 0x02c2, 0x02c9, + 0x02cd, 0x02d6, 0x02de, 0x02e6, 0x02f3, 0x02f8, 0x0302, 0x0309, + 0x0310, 0x0319, 0x0325, 0x032d, 0x0339, 0x0343, 0x034a, 0x0354, + 0x035d, 0x0366, 0x036c, 0x0374, 0x037d, 0x0386, 0x038b, 0x039b, + 0x03a3, 0x03a9, 0x03b2, 0x03c2, 0x03d2, 0x03e0, 0x03e6, 0x03ec, + 0x03f8, 0x03fe, 0x0403, 0x040a, 0x0411, 0x041c, 0x0420, 0x0427, + // Entry 80 - BF + 0x0431, 0x043c, 0x0443, 0x0450, 0x0455, 0x045d, 0x0462, 0x046d, + 0x0475, 0x0480, 0x0485, 0x0492, 0x0497, 0x04a1, 0x04aa, 0x04b5, + 0x04be, 0x04c3, 0x04cb, 0x04d3, 0x04d9, 0x04de, 0x04e4, 0x04ed, + 0x04f5, 0x04fc, 0x0504, 0x050a, 0x0514, 0x051e, 0x0526, 0x0530, + 0x0536, 0x053f, 0x0545, 0x054b, 0x0553, 0x055e, 0x0566, 0x0570, + 0x0574, 0x057c, 0x0581, 0x058c, 0x0594, 0x0599, 0x059e, 0x05a2, + 0x05a8, 0x05b2, 0x05b7, 0x05be, 0x05c2, 0x05cb, 0x05d0, 0x05db, + 0x05e4, 0x05e4, 0x05ec, 0x05f1, 0x05f5, 0x05fe, 0x05fe, 0x0603, + // Entry C0 - FF + 0x0603, 0x060f, 0x061c, 0x0622, 0x062a, 0x0634, 0x0634, 0x063b, + 0x063b, 0x0641, 0x0641, 0x0641, 0x0644, 0x0644, 0x064e, 0x064e, + 0x0654, 0x065b, 0x0667, 0x0667, 0x066b, 0x066b, 0x066b, 0x066b, + 0x066f, 0x0674, 0x0674, 0x0678, 0x0678, 0x0678, 0x0688, 0x068f, + 0x0694, 0x0698, 0x0698, 0x0698, 0x069f, 0x069f, 0x069f, 0x06a3, + 0x06a3, 0x06a7, 0x06a7, 0x06ad, 0x06bb, 0x06bb, 0x06bf, 0x06bf, + 0x06c3, 0x06cb, 0x06cb, 0x06d0, 0x06d7, 0x06dc, 0x06e3, 0x06eb, + 0x06f3, 0x06f7, 0x0700, 0x070a, 0x0716, 0x071d, 0x0726, 0x0736, + // Entry 100 - 13F + 0x073d, 0x073d, 0x074e, 0x075b, 0x0761, 0x0767, 0x076c, 0x0773, + 0x077a, 0x0780, 0x0785, 0x078a, 0x078f, 0x07a3, 0x07a3, 0x07a8, + 0x07b9, 0x07c3, 0x07c8, 0x07c8, 0x07cc, 0x07d3, 0x07d3, 0x07e1, + 0x07e7, 0x07f0, 0x0800, 0x0800, 0x0806, 0x0806, 0x080a, 0x0814, + 0x0814, 0x0817, 0x0817, 0x0828, 0x0836, 0x0836, 0x0847, 0x0859, + 0x0863, 0x0865, 0x086e, 0x086e, 0x0872, 0x0877, 0x0877, 0x087c, + 0x0887, 0x0887, 0x089e, 0x08ab, 0x08ab, 0x08b0, 0x08b9, 0x08bf, + 0x08c4, 0x08cf, 0x08e4, 0x08e4, 0x08e4, 0x08e9, 0x08e9, 0x08ee, + // Entry 140 - 17F + 0x08ee, 0x08f6, 0x08f6, 0x0900, 0x0906, 0x090b, 0x0920, 0x0920, + 0x0924, 0x0928, 0x0928, 0x092d, 0x0938, 0x0938, 0x0938, 0x093e, + 0x0944, 0x094b, 0x095a, 0x0967, 0x0967, 0x0975, 0x097b, 0x0981, + 0x0985, 0x098a, 0x098e, 0x0999, 0x0999, 0x099d, 0x09a4, 0x09af, + 0x09af, 0x09b3, 0x09b3, 0x09b7, 0x09c3, 0x09cf, 0x09cf, 0x09cf, + 0x09cf, 0x09d7, 0x09df, 0x09ee, 0x09f5, 0x09ff, 0x0a04, 0x0a13, + 0x0a13, 0x0a13, 0x0a1d, 0x0a23, 0x0a2b, 0x0a30, 0x0a30, 0x0a35, + 0x0a3c, 0x0a42, 0x0a47, 0x0a4c, 0x0a51, 0x0a58, 0x0a58, 0x0a58, + // Entry 180 - 1BF + 0x0a58, 0x0a5e, 0x0a5e, 0x0a63, 0x0a67, 0x0a74, 0x0a74, 0x0a7e, + 0x0a85, 0x0a8a, 0x0a8d, 0x0a93, 0x0a98, 0x0a98, 0x0a98, 0x0aa2, + 0x0aa2, 0x0aa8, 0x0aaf, 0x0ab6, 0x0abe, 0x0ac3, 0x0ac3, 0x0ac9, + 0x0acf, 0x0ad4, 0x0ad8, 0x0aec, 0x0af9, 0x0b07, 0x0b0e, 0x0b14, + 0x0b1f, 0x0b25, 0x0b2d, 0x0b35, 0x0b39, 0x0b39, 0x0b40, 0x0b4c, + 0x0b53, 0x0b5e, 0x0b65, 0x0b65, 0x0b65, 0x0b6b, 0x0b78, 0x0b78, + 0x0b85, 0x0b89, 0x0b97, 0x0b9d, 0x0ba1, 0x0ba7, 0x0ba7, 0x0bad, + 0x0bad, 0x0bb2, 0x0bbe, 0x0bbe, 0x0bc1, 0x0bcd, 0x0bd1, 0x0be1, + // Entry 1C0 - 1FF + 0x0be9, 0x0bf1, 0x0bf6, 0x0bfb, 0x0c00, 0x0c10, 0x0c1b, 0x0c22, + 0x0c2a, 0x0c34, 0x0c3e, 0x0c3e, 0x0c3e, 0x0c3e, 0x0c4c, 0x0c4c, + 0x0c57, 0x0c57, 0x0c57, 0x0c60, 0x0c60, 0x0c71, 0x0c76, 0x0c76, + 0x0c80, 0x0c87, 0x0c91, 0x0c91, 0x0c91, 0x0c96, 0x0c9c, 0x0c9c, + 0x0c9c, 0x0c9c, 0x0ca7, 0x0caa, 0x0cb1, 0x0cb6, 0x0ccc, 0x0cd3, + 0x0cd8, 0x0cdf, 0x0cdf, 0x0cdf, 0x0ce4, 0x0cf0, 0x0cf8, 0x0cf8, + 0x0d05, 0x0d05, 0x0d09, 0x0d09, 0x0d0f, 0x0d1d, 0x0d27, 0x0d27, + 0x0d2f, 0x0d33, 0x0d33, 0x0d39, 0x0d39, 0x0d39, 0x0d44, 0x0d4d, + // Entry 200 - 23F + 0x0d57, 0x0d65, 0x0d6c, 0x0d78, 0x0d87, 0x0d8c, 0x0d8c, 0x0d8c, + 0x0d92, 0x0d96, 0x0d9e, 0x0d9e, 0x0db0, 0x0dc2, 0x0dca, 0x0dca, + 0x0dca, 0x0dcf, 0x0dd3, 0x0dd9, 0x0dde, 0x0de3, 0x0de6, 0x0ded, + 0x0ded, 0x0df7, 0x0dfe, 0x0dfe, 0x0e06, 0x0e11, 0x0e1a, 0x0e1a, + 0x0e1a, 0x0e1a, 0x0e23, 0x0e23, 0x0e2a, 0x0e30, 0x0e37, 0x0e41, + 0x0e54, 0x0e5a, 0x0e63, 0x0e6a, 0x0e6d, 0x0e70, 0x0e70, 0x0e70, + 0x0e70, 0x0e70, 0x0e76, 0x0e76, 0x0e7b, 0x0e7b, 0x0e81, 0x0e86, + 0x0e8b, 0x0e93, 0x0e93, 0x0e99, 0x0e99, 0x0e9d, 0x0ea0, 0x0ea8, + // Entry 240 - 27F + 0x0ea8, 0x0ea8, 0x0ea8, 0x0ea8, 0x0eb2, 0x0ebc, 0x0ebc, 0x0ec2, + 0x0ee0, 0x0ee4, 0x0f00, 0x0f04, 0x0f1e, 0x0f1e, 0x0f32, 0x0f4e, + 0x0f61, 0x0f72, 0x0f84, 0x0f96, 0x0fae, 0x0fbf, 0x0fd1, 0x0fd1, + 0x0fe3, 0x0ff8, 0x1006, 0x100f, 0x100f, 0x100f, 0x1018, 0x1026, + 0x1040, 0x1057, + }, + }, + { // bs-Cyrl + "афарскиабказијскиавестанскиафриканерскиаканамхарскиарагонежанскиарапскиа" + + "семијскиаварскиајмараазербејџанскибашкирбелорускибугарскибисламабам" + + "барабенгласкитибетанскибретонскибосанскикаталонскичеченскичаморокор" + + "зиканскикричешкистарословенскичувашкивелшкиданскинемачкидивехијскиџ" + + "онгаевегрчкиенглескиесперантошпанскиестонскибаскијскиперсијскифулах" + + "финскифиджијскифарскифранцускифризијскиирскишкотски галскигалскигва" + + "ранигуџаратиманксхаусахебрејскихиндихири мотухрватскихаитскимађарск" + + "ијерменскихерероинтерлингваиндонежанскимеђујезичкиигбосичуан јиунуп" + + "иакидоисландскииталијанскиинуктитутјапанскијаванскигрузијскиконгоки" + + "кујукуањамакозачкикалалисуткмерскиканадакорејскиканурикашмирскикурд" + + "скикомикорнишкикиргискилатинскилуксембуршкигандалимбургишлингалалао" + + "скилитванскилуба-катангалетонскималагасијскимаршалскимаорскимакедон" + + "скималајаламмонголскимаратималајскимелтешкибурманскинаурусеверни нд" + + "ебеленепалскиндонгахоландскинорвешки њорскнорвешки бокмалјужни ндеб" + + "еленавахоњањапровансалскиојибваоромооријскиосетскипанџабскипалипољс" + + "кипаштунскипортугалскиквенчарето-романскирундирумунскирускикинјаруа" + + "ндасанскритсардињаскисиндисеверни самисангосингалескисловачкисловен" + + "ачкисамоанскишонасомалскиалбанскисрпскисватисесотосунданскишведскис" + + "вахилитамилскителугутађиктајландскитигрињатуркменскитсванатонгатурс" + + "китсонгататарскитахићанскиујгурскиукрајинскиурдуузбечкивендавијетна" + + "мскиволапуквалунволофксхосајидишјорубажуангкинескизулуачинескиаколи" + + "адангмејскиадигејскиафрихилиаинуакадијскиаљутјужни алтаистароенглес" + + "киангикаармајскиароканијскиарапахоаравакастуријскиавадхибалучибалин" + + "езијскибасабејабембабојпурибиколбинисисикабрајбуриатбугинежанскибли" + + "нкадокарипскиатсамскицебуаночибчачагатаичукескимаричинукскичоктавск" + + "ичипвијанскичерокичејенскикоптскикримеански турскикашубијанскидакот" + + "адаргваделаверславскидогрибдинкадогриниски сорбијанскидуаласредњи х" + + "оландскиђулаефикскистароегипатскиекајукеламитскисредњи енглескиевон" + + "дофангтагалогфонсредњи францускистарофранцускисеверно-фризијскиисто" + + "чни фризијскифриулијскигагајогбајаџизгилбертшкисредњи високи немачк" + + "истаронемачкигондигоронталоготскигребостарогрчкишвајцарски немачкиг" + + "вич’инхаидахавајскихилигајнонхититехмонггорњи сорбијскихупаибанилок" + + "оингвишкилојбанјудео-персијскијудео-арапскикара-калпашкикабилекачин" + + "ђукамбакавикабардијскитјапкорокасикотанешкикимбундуконканикосреанск" + + "икпелекарачај-балкаркарелијскикурукхкумиккутенаиладиноландаламбалез" + + "гианмонголозилуба-лулуалуисенолундалуолушаимадурешкимагахимаитилима" + + "касармандингомасаимокшамандармендесредњи ирскимикмакминангкабауманч" + + "уманипуримахавскимосивише језикакришкимирандешкимарвариерзијанеапол" + + "итанскиниски немачкиневариниасниуеанногаистари норскин’косеверни со" + + "токласични неварињамвезињанколењоронзимаосагеотомански турскипангас" + + "инскипахлавипампангапапиаментопалауанскистароперсијскифеничанскипон" + + "пејскистаропровансалскирађастанирапануираротонганроманиароманијскис" + + "андавејакутсамаритански арамејскисасаксанталисицилијанскишкотскисел" + + "капстароирскишансидамојужни самилуле самиинари самисколтски језиксо" + + "нинкесоџијенскисранански тонгосерерсукумасусусумерскикоморскикласич" + + "ни сиријскисиријскитимнетеренотетумтигретивтокелауклингонскитлингит" + + "тамашекњаса тонгаток писинтсимшиантумбукатувалутувинијскиудмуртугар" + + "итскиумбундурутваивотскиваламоварајвашокалмикјаојапешкикантонскизап" + + "отечкиблисимболизенагазунибез лингвистичког садржајазазаАустријски " + + "немачкиШвајцарски високи немачкиАустралијски енглескиКанадски енгле" + + "скиБритански енглескиСАД енглескиЛатино-амерички шпанскиИберијски ш" + + "панскиКанадски францускиШвајцарски францускифламанскиБразилски порт" + + "угалскиИберијски португалскимолдавскисрпскохрватскикинески (поједно" + + "стављен)кинески (традиционални)", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000e, 0x0022, 0x0036, 0x004e, 0x0056, 0x0066, 0x0080, + 0x008e, 0x00a0, 0x00ae, 0x00ba, 0x00d4, 0x00e0, 0x00f2, 0x0102, + 0x0110, 0x011e, 0x0130, 0x0144, 0x0156, 0x0166, 0x017a, 0x018a, + 0x0196, 0x01ac, 0x01b2, 0x01bc, 0x01d8, 0x01e6, 0x01f2, 0x01fe, + 0x020c, 0x0220, 0x022a, 0x0230, 0x023a, 0x024a, 0x025c, 0x026a, + 0x027a, 0x028c, 0x029e, 0x02a8, 0x02b4, 0x02c6, 0x02d2, 0x02e4, + 0x02f6, 0x0300, 0x031b, 0x0327, 0x0335, 0x0345, 0x034f, 0x0359, + 0x036b, 0x0375, 0x0386, 0x0396, 0x03a4, 0x03b4, 0x03c6, 0x03d2, + // Entry 40 - 7F + 0x03e8, 0x0400, 0x0416, 0x041e, 0x042f, 0x043d, 0x0443, 0x0455, + 0x046b, 0x047d, 0x048d, 0x049d, 0x04af, 0x04b9, 0x04c5, 0x04d3, + 0x04e1, 0x04f3, 0x0501, 0x050d, 0x051d, 0x0529, 0x053b, 0x0549, + 0x0551, 0x0561, 0x0571, 0x0581, 0x0599, 0x05a3, 0x05b5, 0x05c3, + 0x05cf, 0x05e1, 0x05f8, 0x0608, 0x0620, 0x0632, 0x0640, 0x0654, + 0x0666, 0x0678, 0x0684, 0x0694, 0x06a4, 0x06b6, 0x06c0, 0x06dd, + 0x06ed, 0x06f9, 0x070b, 0x0726, 0x0743, 0x075c, 0x0768, 0x0770, + 0x0788, 0x0794, 0x079e, 0x07ac, 0x07ba, 0x07cc, 0x07d4, 0x07e0, + // Entry 80 - BF + 0x07f2, 0x0808, 0x0814, 0x082d, 0x0837, 0x0847, 0x0851, 0x0867, + 0x0877, 0x088b, 0x0895, 0x08ac, 0x08b6, 0x08ca, 0x08da, 0x08ee, + 0x0900, 0x0908, 0x0918, 0x0928, 0x0934, 0x093e, 0x094a, 0x095c, + 0x096a, 0x0978, 0x0988, 0x0994, 0x099e, 0x09b2, 0x09c0, 0x09d4, + 0x09e0, 0x09ea, 0x09f6, 0x0a02, 0x0a12, 0x0a26, 0x0a36, 0x0a4a, + 0x0a52, 0x0a60, 0x0a6a, 0x0a80, 0x0a8e, 0x0a98, 0x0aa2, 0x0aae, + 0x0ab8, 0x0ac4, 0x0ace, 0x0adc, 0x0ae4, 0x0af4, 0x0afe, 0x0b14, + 0x0b26, 0x0b26, 0x0b36, 0x0b36, 0x0b3e, 0x0b50, 0x0b50, 0x0b58, + // Entry C0 - FF + 0x0b58, 0x0b6d, 0x0b87, 0x0b93, 0x0ba3, 0x0bb9, 0x0bb9, 0x0bc7, + 0x0bc7, 0x0bd3, 0x0bd3, 0x0bd3, 0x0bd3, 0x0bd3, 0x0be7, 0x0be7, + 0x0bf3, 0x0bff, 0x0c17, 0x0c17, 0x0c1f, 0x0c1f, 0x0c1f, 0x0c1f, + 0x0c27, 0x0c31, 0x0c31, 0x0c31, 0x0c31, 0x0c31, 0x0c31, 0x0c3f, + 0x0c49, 0x0c51, 0x0c51, 0x0c51, 0x0c5d, 0x0c5d, 0x0c5d, 0x0c65, + 0x0c65, 0x0c65, 0x0c65, 0x0c71, 0x0c89, 0x0c89, 0x0c91, 0x0c91, + 0x0c99, 0x0ca9, 0x0ca9, 0x0cb9, 0x0cc7, 0x0cc7, 0x0cd1, 0x0cdf, + 0x0ced, 0x0cf5, 0x0d05, 0x0d17, 0x0d2d, 0x0d39, 0x0d49, 0x0d49, + // Entry 100 - 13F + 0x0d57, 0x0d57, 0x0d78, 0x0d90, 0x0d9c, 0x0da8, 0x0da8, 0x0db6, + 0x0dc4, 0x0dd0, 0x0dda, 0x0dda, 0x0de4, 0x0e05, 0x0e05, 0x0e0f, + 0x0e2e, 0x0e2e, 0x0e36, 0x0e36, 0x0e36, 0x0e44, 0x0e44, 0x0e60, + 0x0e6c, 0x0e7e, 0x0e9b, 0x0e9b, 0x0ea7, 0x0ea7, 0x0eaf, 0x0ebd, + 0x0ebd, 0x0ec3, 0x0ec3, 0x0ee2, 0x0efe, 0x0efe, 0x0f1f, 0x0f40, + 0x0f54, 0x0f58, 0x0f58, 0x0f58, 0x0f60, 0x0f6a, 0x0f6a, 0x0f70, + 0x0f84, 0x0f84, 0x0fac, 0x0fc4, 0x0fc4, 0x0fce, 0x0fe0, 0x0fec, + 0x0ff6, 0x100a, 0x102d, 0x102d, 0x102d, 0x102d, 0x103c, 0x1046, + // Entry 140 - 17F + 0x1046, 0x1056, 0x1056, 0x106a, 0x1076, 0x1080, 0x109d, 0x109d, + 0x10a5, 0x10ad, 0x10ad, 0x10b7, 0x10c7, 0x10c7, 0x10c7, 0x10d3, + 0x10d3, 0x10d3, 0x10f0, 0x1109, 0x1109, 0x1122, 0x112e, 0x1138, + 0x113c, 0x1146, 0x114e, 0x1164, 0x1164, 0x116c, 0x116c, 0x116c, + 0x116c, 0x1174, 0x1174, 0x117c, 0x118e, 0x118e, 0x118e, 0x118e, + 0x118e, 0x118e, 0x119e, 0x119e, 0x11ac, 0x11c0, 0x11ca, 0x11e5, + 0x11e5, 0x11e5, 0x11f9, 0x1205, 0x1205, 0x1205, 0x1205, 0x120f, + 0x121d, 0x1229, 0x1229, 0x1233, 0x123d, 0x124b, 0x124b, 0x124b, + // Entry 180 - 1BF + 0x124b, 0x124b, 0x124b, 0x1255, 0x125d, 0x125d, 0x125d, 0x1270, + 0x127e, 0x1288, 0x128e, 0x1298, 0x1298, 0x1298, 0x1298, 0x12aa, + 0x12aa, 0x12b6, 0x12c4, 0x12d2, 0x12e2, 0x12ec, 0x12ec, 0x12f6, + 0x1302, 0x130c, 0x130c, 0x130c, 0x1323, 0x1323, 0x1323, 0x132f, + 0x1345, 0x134f, 0x135f, 0x136f, 0x1377, 0x1377, 0x1377, 0x138c, + 0x1398, 0x13ac, 0x13ba, 0x13ba, 0x13ba, 0x13c6, 0x13c6, 0x13c6, + 0x13e0, 0x13e0, 0x13f9, 0x1405, 0x140d, 0x1419, 0x1419, 0x1419, + 0x1419, 0x1423, 0x143a, 0x143a, 0x1443, 0x145a, 0x145a, 0x1477, + // Entry 1C0 - 1FF + 0x1485, 0x1493, 0x149b, 0x14a5, 0x14af, 0x14ce, 0x14e4, 0x14f2, + 0x1502, 0x1516, 0x152a, 0x152a, 0x152a, 0x152a, 0x1546, 0x1546, + 0x155a, 0x155a, 0x155a, 0x156c, 0x156c, 0x158e, 0x158e, 0x158e, + 0x15a0, 0x15ae, 0x15c2, 0x15c2, 0x15c2, 0x15c2, 0x15ce, 0x15ce, + 0x15ce, 0x15ce, 0x15e4, 0x15e4, 0x15f2, 0x15fc, 0x1627, 0x1627, + 0x1631, 0x163f, 0x163f, 0x163f, 0x163f, 0x1657, 0x1665, 0x1665, + 0x1665, 0x1665, 0x1665, 0x1665, 0x1671, 0x1671, 0x1685, 0x1685, + 0x1685, 0x168b, 0x168b, 0x1697, 0x1697, 0x1697, 0x16aa, 0x16bb, + // Entry 200 - 23F + 0x16ce, 0x16e9, 0x16f7, 0x170b, 0x1728, 0x1732, 0x1732, 0x1732, + 0x173e, 0x1746, 0x1756, 0x1766, 0x1766, 0x1787, 0x1797, 0x1797, + 0x1797, 0x17a1, 0x17a1, 0x17ad, 0x17b7, 0x17c1, 0x17c7, 0x17d5, + 0x17d5, 0x17e9, 0x17f7, 0x17f7, 0x1805, 0x1818, 0x1829, 0x1829, + 0x1829, 0x1829, 0x1839, 0x1839, 0x1847, 0x1853, 0x1853, 0x1867, + 0x1867, 0x1873, 0x1885, 0x1893, 0x1899, 0x189f, 0x189f, 0x189f, + 0x189f, 0x189f, 0x18ab, 0x18ab, 0x18ab, 0x18ab, 0x18b7, 0x18c1, + 0x18c9, 0x18c9, 0x18c9, 0x18d5, 0x18d5, 0x18d5, 0x18db, 0x18e9, + // Entry 240 - 27F + 0x18e9, 0x18e9, 0x18e9, 0x18fb, 0x190d, 0x1921, 0x1921, 0x192d, + 0x192d, 0x1935, 0x1967, 0x196f, 0x196f, 0x196f, 0x1992, 0x19c2, + 0x19eb, 0x1a0c, 0x1a2f, 0x1a46, 0x1a72, 0x1a93, 0x1a93, 0x1a93, + 0x1ab6, 0x1add, 0x1add, 0x1aef, 0x1b18, 0x1b41, 0x1b53, 0x1b6f, + 0x1b9c, 0x1bc7, + }, + }, + { // ca + caLangStr, + caLangIdx, + }, + { // ce + "абхазхойнафрикаансаканамхаройнӀаьрбийнассамийназербайджанийнбашкирийнбел" + + "орусийнболгарийнбамбарабенгалийнтибетхойнбретонийнбоснийнкаталонийн" + + "нохчийнкорсиканийнчехийнчувашийнваллийндатхойннемцойндзонг-кээвегре" + + "кийнингалсанэсперантоиспанхойнэстонийнбаскийнгӀажарийнфиннийнфиджиф" + + "арерийнфранцузийнмалхбузен-фризийнирландхойнгалисийнгуаранигуджарат" + + "имэнийнхаусажугтийнхиндихорватийнгаитийнвенгрийнэрмалойниндонезихой" + + "нигбосычуаньисландхойнитальянийнинуктитутяпонийняванийнгуьржийнкику" + + "йюказахийнгренландхойнкхмерийнканнадакорейнкашмирикурдийнкорнуоллий" + + "нгӀиргӀизойнлатинанлюксембургхойнгандалингалалаоссийнлитвахойнлуба-" + + "катангалатышийнмалагасийнмаоримакедонхойнмалаяламмонголийнмаратхима" + + "лайнмальтойнбирманийнкъилбаседа ндебелинепалхойнголландхойннорвегий" + + "н нюнорскнорвегийн букмолоромоорипанджабиполякийнпуштупортугалихойн" + + "кечуароманшийнрундирумынийноьрсийнкиньяруандасанскритсиндхикъилбасе" + + "да саамийнсангосингалхойнсловакийнсловенийншонасомалиалбанойнсербий" + + "нсунданхойншведийнсуахилитамилхойнтелугутаджикийнтайнтигриньятуркме" + + "нийнтонганийнтуркойнгӀезалойнуйгурийнукраинийнурдуузбекийнвьетнамхо" + + "йнволофкосайорубакитайнзулуагхӀемарауканхойнасубембабенамалхбузен-б" + + "елуджийнбодочигачерокиюккъерчу курдийнтаитазармасорбийндуаладьола-ф" + + "оньиэмбуфилиппинийнгагаузийншвейцарин немцойнгусиигавайнлакхара сер" + + "бийннгомбамачамекабилийнкамбамакондекабувердьянукойра чииникаленджи" + + "нкоми-пермякийнконканишамбалабафиалангилакотакъилбаседа лурилуо (Ке" + + "ни а, Танзани а)лухьямасаимерумаврикин креолийнмакуа-мееттометамоха" + + "укмундангмазандеранхойннамалахара германхойнквасионконуэрньянколеки" + + "черомборуандасамбурусангусенакойраборо сеннитахелхитсаамийн (къилба" + + ")луле-саамийнинари-саамийнскольт-саамийнсуахили (Конго)тесотасавакта" + + "мазигхтийнбоьвзуш боцу моттваивунджоварлпирисогамороккон стандартан" + + " тамазигхтийнметтан чулацам боцушХӀинца болу стандартан Ӏаьрбийнавст" + + "рин немцойншвейцарин лакхара немцойнАвстралин ингалсанканадан ингал" + + "санбританин ингалсанамерикан ингалсанлатинан американ испанхойневро" + + "пан испанхойнмексикан испанхойнканадан французийншвейцарин французи" + + "йнлахара саксонийнфламандийнбразилин португалихойневропан португали" + + "хойнмолдавийнатта китайнламастан китайн", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0012, 0x0012, 0x0024, 0x002c, 0x003c, 0x003c, + 0x004c, 0x005c, 0x005c, 0x005c, 0x0078, 0x008a, 0x009e, 0x00b0, + 0x00b0, 0x00be, 0x00d0, 0x00e2, 0x00f4, 0x0102, 0x0116, 0x0124, + 0x0124, 0x013a, 0x013a, 0x0146, 0x0146, 0x0156, 0x0164, 0x0172, + 0x0180, 0x0180, 0x018f, 0x0195, 0x01a3, 0x01b3, 0x01c5, 0x01d7, + 0x01e7, 0x01f5, 0x0207, 0x0207, 0x0215, 0x021f, 0x022f, 0x0243, + 0x0264, 0x0278, 0x0278, 0x0288, 0x0296, 0x02a8, 0x02b4, 0x02be, + 0x02cc, 0x02d6, 0x02d6, 0x02e8, 0x02f6, 0x0306, 0x0316, 0x0316, + // Entry 40 - 7F + 0x0316, 0x032e, 0x032e, 0x0336, 0x0344, 0x0344, 0x0344, 0x0358, + 0x036c, 0x037e, 0x038c, 0x039a, 0x03aa, 0x03aa, 0x03b6, 0x03b6, + 0x03c6, 0x03de, 0x03ee, 0x03fc, 0x0408, 0x0408, 0x0416, 0x0424, + 0x0424, 0x043a, 0x0450, 0x045e, 0x047a, 0x0484, 0x0484, 0x0492, + 0x04a2, 0x04b4, 0x04cb, 0x04db, 0x04ef, 0x04ef, 0x04f9, 0x050f, + 0x051f, 0x0531, 0x053f, 0x054b, 0x055b, 0x056d, 0x056d, 0x0590, + 0x05a2, 0x05a2, 0x05b8, 0x05d9, 0x05f8, 0x05f8, 0x05f8, 0x05f8, + 0x05f8, 0x05f8, 0x0602, 0x0608, 0x0608, 0x0618, 0x0618, 0x0628, + // Entry 80 - BF + 0x0632, 0x064c, 0x0656, 0x0668, 0x0672, 0x0682, 0x0690, 0x06a6, + 0x06b6, 0x06b6, 0x06c2, 0x06e5, 0x06ef, 0x0703, 0x0715, 0x0727, + 0x0727, 0x072f, 0x073b, 0x074b, 0x0759, 0x0759, 0x0759, 0x076d, + 0x077b, 0x0789, 0x079b, 0x07a7, 0x07b9, 0x07c1, 0x07d1, 0x07e5, + 0x07e5, 0x07f7, 0x0805, 0x0805, 0x0817, 0x0817, 0x0827, 0x0839, + 0x0841, 0x0851, 0x0851, 0x0867, 0x0867, 0x0867, 0x0871, 0x0879, + 0x0879, 0x0885, 0x0885, 0x0891, 0x0899, 0x0899, 0x0899, 0x0899, + 0x0899, 0x0899, 0x0899, 0x08a5, 0x08a5, 0x08a5, 0x08a5, 0x08a5, + // Entry C0 - FF + 0x08a5, 0x08a5, 0x08a5, 0x08a5, 0x08a5, 0x08bb, 0x08bb, 0x08bb, + 0x08bb, 0x08bb, 0x08bb, 0x08bb, 0x08c1, 0x08c1, 0x08c1, 0x08c1, + 0x08c1, 0x08c1, 0x08c1, 0x08c1, 0x08c1, 0x08c1, 0x08c1, 0x08c1, + 0x08c1, 0x08cb, 0x08cb, 0x08d3, 0x08d3, 0x08d3, 0x08f8, 0x08f8, + 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, + 0x08f8, 0x0900, 0x0900, 0x0900, 0x0900, 0x0900, 0x0900, 0x0900, + 0x0900, 0x0900, 0x0900, 0x0900, 0x0900, 0x0908, 0x0908, 0x0908, + 0x0908, 0x0908, 0x0908, 0x0908, 0x0908, 0x0914, 0x0914, 0x0933, + // Entry 100 - 13F + 0x0933, 0x0933, 0x0933, 0x0933, 0x0933, 0x0933, 0x093d, 0x093d, + 0x093d, 0x093d, 0x093d, 0x0947, 0x0947, 0x0955, 0x0955, 0x095f, + 0x095f, 0x0974, 0x0974, 0x0974, 0x097c, 0x097c, 0x097c, 0x097c, + 0x097c, 0x097c, 0x097c, 0x097c, 0x097c, 0x097c, 0x097c, 0x0992, + 0x0992, 0x0992, 0x0992, 0x0992, 0x0992, 0x0992, 0x0992, 0x0992, + 0x0992, 0x0992, 0x09a4, 0x09a4, 0x09a4, 0x09a4, 0x09a4, 0x09a4, + 0x09a4, 0x09a4, 0x09a4, 0x09a4, 0x09a4, 0x09a4, 0x09a4, 0x09a4, + 0x09a4, 0x09a4, 0x09c5, 0x09c5, 0x09c5, 0x09cf, 0x09cf, 0x09cf, + // Entry 140 - 17F + 0x09cf, 0x09db, 0x09db, 0x09db, 0x09db, 0x09db, 0x09f8, 0x09f8, + 0x09f8, 0x09f8, 0x09f8, 0x09f8, 0x09f8, 0x09f8, 0x09f8, 0x09f8, + 0x0a04, 0x0a10, 0x0a10, 0x0a10, 0x0a10, 0x0a10, 0x0a20, 0x0a20, + 0x0a20, 0x0a2a, 0x0a2a, 0x0a2a, 0x0a2a, 0x0a2a, 0x0a38, 0x0a50, + 0x0a50, 0x0a50, 0x0a50, 0x0a50, 0x0a50, 0x0a65, 0x0a65, 0x0a65, + 0x0a65, 0x0a77, 0x0a77, 0x0a92, 0x0aa0, 0x0aa0, 0x0aa0, 0x0aa0, + 0x0aa0, 0x0aa0, 0x0aa0, 0x0aa0, 0x0aae, 0x0ab8, 0x0ab8, 0x0ab8, + 0x0ab8, 0x0ab8, 0x0ac2, 0x0ac2, 0x0ac2, 0x0ac2, 0x0ac2, 0x0ac2, + // Entry 180 - 1BF + 0x0ac2, 0x0ace, 0x0ace, 0x0ace, 0x0ace, 0x0aeb, 0x0aeb, 0x0aeb, + 0x0aeb, 0x0aeb, 0x0b12, 0x0b12, 0x0b1c, 0x0b1c, 0x0b1c, 0x0b1c, + 0x0b1c, 0x0b1c, 0x0b1c, 0x0b1c, 0x0b1c, 0x0b26, 0x0b26, 0x0b26, + 0x0b26, 0x0b26, 0x0b2e, 0x0b4f, 0x0b4f, 0x0b66, 0x0b6e, 0x0b6e, + 0x0b6e, 0x0b6e, 0x0b6e, 0x0b7a, 0x0b7a, 0x0b7a, 0x0b88, 0x0b88, + 0x0b88, 0x0b88, 0x0b88, 0x0b88, 0x0b88, 0x0b88, 0x0ba4, 0x0ba4, + 0x0ba4, 0x0bac, 0x0bcd, 0x0bcd, 0x0bcd, 0x0bcd, 0x0bcd, 0x0bd9, + 0x0bd9, 0x0bd9, 0x0bd9, 0x0bd9, 0x0bdf, 0x0bdf, 0x0be7, 0x0be7, + // Entry 1C0 - 1FF + 0x0be7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, + 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, + 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bf7, 0x0bff, 0x0bff, + 0x0bff, 0x0bff, 0x0bff, 0x0bff, 0x0bff, 0x0c09, 0x0c09, 0x0c09, + 0x0c09, 0x0c09, 0x0c09, 0x0c15, 0x0c15, 0x0c15, 0x0c15, 0x0c23, + 0x0c23, 0x0c23, 0x0c23, 0x0c23, 0x0c2d, 0x0c2d, 0x0c2d, 0x0c2d, + 0x0c2d, 0x0c2d, 0x0c35, 0x0c35, 0x0c35, 0x0c52, 0x0c52, 0x0c52, + 0x0c62, 0x0c62, 0x0c62, 0x0c62, 0x0c62, 0x0c62, 0x0c7f, 0x0c96, + // Entry 200 - 23F + 0x0caf, 0x0cca, 0x0cca, 0x0cca, 0x0cca, 0x0cca, 0x0cca, 0x0cca, + 0x0cca, 0x0cca, 0x0cca, 0x0cca, 0x0ce5, 0x0ce5, 0x0ce5, 0x0ce5, + 0x0ce5, 0x0ce5, 0x0ced, 0x0ced, 0x0ced, 0x0ced, 0x0ced, 0x0ced, + 0x0ced, 0x0ced, 0x0ced, 0x0ced, 0x0ced, 0x0ced, 0x0ced, 0x0ced, + 0x0ced, 0x0ced, 0x0ced, 0x0ced, 0x0ced, 0x0ced, 0x0cfb, 0x0cfb, + 0x0d13, 0x0d13, 0x0d13, 0x0d13, 0x0d33, 0x0d39, 0x0d39, 0x0d39, + 0x0d39, 0x0d39, 0x0d39, 0x0d39, 0x0d45, 0x0d45, 0x0d45, 0x0d45, + 0x0d45, 0x0d55, 0x0d55, 0x0d55, 0x0d55, 0x0d5d, 0x0d5d, 0x0d5d, + // Entry 240 - 27F + 0x0d5d, 0x0d5d, 0x0d5d, 0x0d5d, 0x0d5d, 0x0d5d, 0x0d5d, 0x0d5d, + 0x0d9b, 0x0d9b, 0x0dc1, 0x0dc1, 0x0dfc, 0x0dfc, 0x0e19, 0x0e49, + 0x0e6c, 0x0e8b, 0x0eac, 0x0ecd, 0x0eff, 0x0f20, 0x0f43, 0x0f43, + 0x0f66, 0x0f8d, 0x0fac, 0x0fc0, 0x0feb, 0x1014, 0x1026, 0x1026, + 0x103b, 0x1058, + }, + }, + { // cgg + "OrukaniOrumarikiOruharabuOruberarusiOruburugariyaOrubengariOruceekiOrugi" + + "rimaaniOruguriikiOrungyerezaOrusupaaniOrupaasiyaOrufaransaOruhausaOr" + + "uhindiOruhangareOruindoneziaOruiboOruyitareOrujapaaniOrujavaOrukambo" + + "diyaOrukoreyaOrumalesiyaOruburumaOrunepaliOrudaakiOrupungyabiOrupoor" + + "iOrupocugoOruromaniaOrurrashaOrunyarwandaOrusomaariOruswidiOrutamiri" + + "OrutailandiOrukurukiOrukurainiOru-UruduOruviyetinaamuOruyorubaOrucha" + + "inaOruzuruRukiga", + []uint16{ // 246 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0010, 0x0010, + 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0024, 0x0031, + 0x0031, 0x0031, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, + 0x003b, 0x003b, 0x003b, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, + 0x004f, 0x004f, 0x004f, 0x004f, 0x0059, 0x0064, 0x0064, 0x006e, + 0x006e, 0x006e, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0082, + 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x008a, + 0x008a, 0x0092, 0x0092, 0x0092, 0x0092, 0x009c, 0x009c, 0x009c, + // Entry 40 - 7F + 0x009c, 0x00a8, 0x00a8, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00b7, 0x00b7, 0x00c1, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, + 0x00c8, 0x00c8, 0x00d4, 0x00d4, 0x00dd, 0x00dd, 0x00dd, 0x00dd, + 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, + 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, + 0x00dd, 0x00dd, 0x00dd, 0x00e8, 0x00e8, 0x00f1, 0x00f1, 0x00f1, + 0x00fa, 0x00fa, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, + 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x010d, 0x010d, 0x0115, + // Entry 80 - BF + 0x0115, 0x011e, 0x011e, 0x011e, 0x011e, 0x0128, 0x0131, 0x013d, + 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, + 0x013d, 0x013d, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, + 0x014f, 0x014f, 0x0158, 0x0158, 0x0158, 0x0163, 0x0163, 0x0163, + 0x0163, 0x0163, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x0176, + 0x017f, 0x017f, 0x017f, 0x018d, 0x018d, 0x018d, 0x018d, 0x018d, + 0x018d, 0x0196, 0x0196, 0x019f, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + // Entry C0 - FF + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01ac, + }, + }, + { // chr + "ᎠᏂᏓᏥᎩᎵᏏᏍᏆᏂᎦᎸᏥᎬᏩᎵᏲᏥᎢᏣᏩᏂᏏᏉᏧᎦᎵᏲᏂᎢᏓᎶᏂᎨᎦᏳᎦᎠᏣᏗᏣᎳᎩᎼᎻᎦᎠᎫᏌᏏᏂᎦᏄᏬᎵᏍᏛᎾ ᎦᏬᏂᎯᏍᏗ", + []uint16{ // 557 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x0015, 0x0015, 0x001e, + 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0027, + 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, + 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, + // Entry 40 - 7F + 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, + 0x0039, 0x0039, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + // Entry 80 - BF + 0x0045, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x005a, 0x005a, + 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, + 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, + 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, + 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, + 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, + 0x005a, 0x005a, 0x005a, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + // Entry C0 - FF + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, + 0x006f, 0x006f, 0x006f, 0x0078, 0x0078, 0x0081, 0x0081, 0x0081, + // Entry 100 - 13F + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + // Entry 140 - 17F + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + // Entry 180 - 1BF + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, + 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, + 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, + 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, + // Entry 1C0 - 1FF + 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, + 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, + 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, + 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, + 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, + 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, + 0x0093, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, + 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, + // Entry 200 - 23F + 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, + 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, + 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, + 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, + 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, + 0x009c, 0x009c, 0x009c, 0x009c, 0x00c1, + }, + }, + { // ckb + "ئەمهەرینجیعەرەبیئاسامیئازەربایجانیبێلاڕووسیبۆلگاریبەنگلادێشیبرێتونیبۆسنی" + + "كاتالۆنیچەكیوێلزیدانماركیئاڵمانییۆنانیئینگلیزیئێسپیرانتۆئیسپانیئیست" + + "ۆنیباسکیفارسیفینلەندیفەرانسیفریسیی ڕۆژاوائیرلەندیگالیسیگووارانیگوجا" + + "راتیهیبرێهیندیكرواتیهەنگاری (مەجاری)ئەرمەنیئێەندونیزیئیسلەندیئیتالی" + + "ژاپۆنیجاڤانیگۆرجستانیکوردیكرگیزیلاتینیلينگالالاویلیتوانیلێتۆنیماكێد" + + "ۆنیمەنگۆلیماراتینیپالیهۆڵەندیئۆرییاپەنجابیپۆڵۆنیایی (لەهستانی)پەشتو" + + "وپورتوگالیڕۆمانیڕووسیسانسکريتسيندیسینهەلیسلۆڤاكیسلۆڤێنیسۆمالیئاڵبان" + + "یسەربیسودانیسویدیتامیلیتەلۆگویتاجیکیتایلەندیتیگرینیایتورکمانیتورکیئ" + + "ويخووریئۆكراینیئۆردووئوزبەکیڤیەتنامیچینیزولوکوردیی ناوەندیمازەندەرا" + + "نیکوردیی باشووریسامی باشووریزمانی نەناسراوئازەربایجانی باشووریئینگل" + + "یزیی ئۆسترالیاییئینگلیزیی کەنەداییئینگلیزیی بریتانیاییئینگلیزیی ئەم" + + "ەریکاییپورتوگاڵی برازیلپورتوگاڵی (پورتوگاڵ)", + []uint16{ // 606 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0014, 0x0014, + 0x0020, 0x002c, 0x002c, 0x002c, 0x0044, 0x0044, 0x0056, 0x0064, + 0x0064, 0x0064, 0x0078, 0x0078, 0x0086, 0x0090, 0x00a0, 0x00a0, + 0x00a0, 0x00a0, 0x00a0, 0x00a8, 0x00a8, 0x00a8, 0x00b2, 0x00c2, + 0x00d0, 0x00d0, 0x00d0, 0x00d0, 0x00dc, 0x00ec, 0x0100, 0x010e, + 0x011c, 0x0126, 0x0130, 0x0130, 0x0140, 0x0140, 0x0140, 0x014e, + 0x0167, 0x0177, 0x0177, 0x0183, 0x0193, 0x01a3, 0x01a3, 0x01a3, + 0x01ad, 0x01b7, 0x01b7, 0x01c3, 0x01c3, 0x01e0, 0x01ee, 0x01ee, + // Entry 40 - 7F + 0x01ee, 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, 0x0212, + 0x021e, 0x021e, 0x022a, 0x0236, 0x0248, 0x0248, 0x0248, 0x0248, + 0x0248, 0x0248, 0x0248, 0x0248, 0x0248, 0x0248, 0x0248, 0x0252, + 0x0252, 0x0252, 0x025e, 0x026a, 0x026a, 0x026a, 0x026a, 0x0278, + 0x0280, 0x028e, 0x028e, 0x029a, 0x029a, 0x029a, 0x029a, 0x02aa, + 0x02aa, 0x02b8, 0x02c4, 0x02c4, 0x02c4, 0x02c4, 0x02c4, 0x02c4, + 0x02d0, 0x02d0, 0x02de, 0x02de, 0x02de, 0x02de, 0x02de, 0x02de, + 0x02de, 0x02de, 0x02de, 0x02ea, 0x02ea, 0x02f8, 0x02f8, 0x031d, + // Entry 80 - BF + 0x0329, 0x033b, 0x033b, 0x033b, 0x033b, 0x0347, 0x0351, 0x0351, + 0x0361, 0x0361, 0x036b, 0x036b, 0x036b, 0x0379, 0x0387, 0x0395, + 0x0395, 0x0395, 0x03a1, 0x03af, 0x03b9, 0x03b9, 0x03b9, 0x03c5, + 0x03cf, 0x03cf, 0x03db, 0x03e9, 0x03f5, 0x0405, 0x0417, 0x0427, + 0x0427, 0x0427, 0x0431, 0x0431, 0x0431, 0x0431, 0x0441, 0x0451, + 0x045d, 0x046b, 0x046b, 0x047b, 0x047b, 0x047b, 0x047b, 0x047b, + 0x047b, 0x047b, 0x047b, 0x0483, 0x048b, 0x048b, 0x048b, 0x048b, + 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, + // Entry C0 - FF + 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, + 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, + 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, + 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, + 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, + 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, + 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, + 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, 0x04a6, + // Entry 100 - 13F + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + // Entry 140 - 17F + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + // Entry 180 - 1BF + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, + 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04a6, 0x04bc, 0x04bc, + 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, + 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, + // Entry 1C0 - 1FF + 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, + 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, + 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, + 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, + 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, + 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, 0x04bc, + 0x04d7, 0x04d7, 0x04d7, 0x04d7, 0x04d7, 0x04d7, 0x04d7, 0x04d7, + 0x04d7, 0x04d7, 0x04d7, 0x04d7, 0x04d7, 0x04d7, 0x04ee, 0x04ee, + // Entry 200 - 23F + 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, + 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, + 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, + 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, + 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x04ee, + 0x04ee, 0x04ee, 0x04ee, 0x04ee, 0x0509, 0x0509, 0x0509, 0x0509, + 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, + 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, + // Entry 240 - 27F + 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, + 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0530, 0x0530, 0x0530, + 0x0559, 0x057c, 0x05a3, 0x05ca, 0x05ca, 0x05ca, 0x05ca, 0x05ca, + 0x05ca, 0x05ca, 0x05ca, 0x05ca, 0x05e9, 0x060e, + }, + }, + { // cs + csLangStr, + csLangIdx, + }, + { // cy + "AffaregAbchasegAfestanegAffricânegAcanegAmharegAragonegArabegAsamegAfare" + + "gAymaregAserbaijanegBashcortegBelarwsegBwlgaregBislamaBambaregBengal" + + "egTibetegLlydawegBosniegCatalanegTsietsienegTsiamorroCorsegCriTsiece" + + "gHen SlafonegTshwfashegCymraegDanegAlmaenegDifehiDzongkhaEweGroegSae" + + "snegEsperantoSbaenegEstonegBasgegPersegFfwlaFfinnegFfijïegFfaröegFfr" + + "angegFfriseg y GorllewinGwyddelegGaeleg yr AlbanGalisiegGuaraníGwjar" + + "atiManawegHawsaHebraegHindiCroategCreol HaitiHwngaregArmenegHereroIn" + + "terlinguaIndonesegInterlingueIgboNwoswInwpiacegIslandegEidalegInwcti" + + "twtJapaneegJafanaegGeorgegCongoKikuyuCasachegKalaallisutChmeregKanna" + + "daCoreegCanwriCashmiregCwrdegComiCernywegCirgisegLladinLwcsembwrgegG" + + "andaLimbwrgegLingalaLaoegLithwanegLuba-KatangaLatfiegMalagasegMarsia" + + "legMaoriMacedonegMalayalamMongolegMarathiMaleiegMaltegByrmanegNawrŵe" + + "gNdebele GogleddolNepalegNdongaIseldiregNorwyeg NynorskNorwyeg Bokmå" + + "lNdebele DeheuolNafahoNianjaOcsitanegOjibwaOromoOriyaOsetegPwnjabegP" + + "aliPwylegPashtoPortiwgeegQuechuaRománshRwndiRwmanegRwsegCiniarŵandeg" + + "SansgritSardegSindhiSami GogleddolSangoSinhalegSlofacegSlofenegSamöe" + + "gShonaSomalegAlbanegSerbegSwatiSesothegSwndanegSwedegSwahiliTamilegT" + + "eluguTajicegThaiTigrinyaTwrcmenegTswanaTongegTyrcegTsongaegTataregUi" + + "ghurWcreinegWrdwWsbecegFendegFietnamegWalwnegWoloffXhosaIddew-Almaen" + + "egIorwbaTsieineegSwlwAcehnegAcoliAdangmegCircaseg GorllewinolArabeg " + + "TunisiaAffrihiliAghemegAinŵegAcadegAlabamäegAlewtegGhegeg AlbaniaAlt" + + "äeg DeheuolHen SaesnegAngikaAramaegArawcanegAraonaegArapahoArabeg A" + + "lgeriaArawacegArabeg MorocoArabeg yr AifftAswIaith Arwyddion America" + + "AstwrianegAwadhiBalwtsiBalïegBasâegBamwmegBejäegBembegBenaBaffwtegBa" + + "dagaBalochi GorllewinolComegSiksikaBrahuiBodoAcwsegBwriategBwlwCadoC" + + "aribegAtsamegTsigaMariegSioctoTsierocîCheyenneCwrdeg SoraniCoptegTyr" + + "ceg y CrimeaDacotaegDargwaTaitaDincaZarmaegDogriSorbeg IsafDiwalegIs" + + "eldireg CanolJola-FonyiEmbwHen EifftegElamegSaesneg CanolEwondoExtre" + + "maduregFfilipinegFfinneg TornedalFfrangeg CajwnFfrangeg CanolHen Ffr" + + "angegArpitanegFfriseg y GogleddFfriseg y DwyrainFfriwlegGagauzGaioGb" + + "aiaDareg y ZoroastriaidGilbertegUchel Almaeneg CanolHen Uchel Almaen" + + "egGothegHen RoegAlmaeneg y SwistirGusiiHaidaHawäiegHethegHmongegSorb" + + "eg UchafIbanegIbibioIlocanegIngwsiegNgombaMatsiameIddew-BersiegIddew" + + "-ArabegCara-CalpacegCabilegCambaCircaseg DwyreiniolTyapegMacondegCab" + + "oferdianegCàsegKoyra ChiiniChowaregKalenjinKomi-PermyakConcaniCarele" + + "gShambalaBaffiaCwlenegCwmicegIddew-SbaenegLangiLahndaLambaLezghegLak" + + "otaLombardegMongoLoziLuri GogleddolLatgalegLwndaLŵoLwshaiegLwyiaMadw" + + "regMagahiMaithiliMacasaregMandingoMasaiMocsiaMandaregMendegMêrwMoris" + + "yenGwyddeleg CanolMakhuwa-MeettoMetaMicmacegManshwManipwriMohocegMos" + + "iMari GorllewinolMundangmwy nag un iaithMirandegMarwariMasanderaniNa" + + "pliegNamaIsel AlmaenegNewaegAo NagaKwasioHen NorsegN’KoSotho Gogledd" + + "olNŵeregHen NewariNiamweziNiancoleNioroNzimegOsagegTyrceg OtomanPang" + + "asinegPahlafiPampangaPicardegAlmaeneg PensylfaniaHen BersiegAlmaeneg" + + " PalatinPhoenicegPiedmontegPontegPohnpeianegPrwsegHen BrofensalegK’i" + + "che’RajasthanegRapanŵiRaratongegRomboRomaniRotumanegAromanegRwaSandä" + + "wegAramaeg SamariaSambŵrwSasacegSantaliNgambeiegSangwSisilegSgotegSa" + + "sareseg SardiniaCwrdeg DeheuolSenecaSenaSeriSelcypegKoyraboro SenniH" + + "en WyddelegSamogitegTachelhitArabeg ChadSidamoIs-silesiegSami Deheuo" + + "lSami LwleSami InariSami ScoltSonincegSogdegSereregFfriseg Saterland" + + "SwcwmaSwsŵegSwmeregComoregSwahili’r CongoHen SyriegSyriegSilesiegTul" + + "uTimnegTesoTerenaTetumegTigregTifegTocelawegTsakhuregKlingonLlingitT" + + "alyshegTamashecegTok PisinTarokoTsaconegTwmbwcaTwfalwegTasawaqTamase" + + "it Canolbarth MorocoFotiacegWgaritegUmbunduy GwraiddFaiegFenisegFeps" + + "Fflemeg GorllewinolFotegFunjoWalseregWalamoWinarayegWashoWarlpiriCal" + + "mycegSogaIembaegCantoneegZapotecegBlisssymbolsZêlandegTamaseit Safon" + + "olZuniDim cynnwys ieithyddolZazäegArabeg Modern SafonolAserbaijaneg " + + "DeheuolAlmaeneg AwstriaAlmaeneg Safonol y SwistirSaesneg AwstraliaSa" + + "esneg CanadaSaesneg PrydainSaesneg AmericaSbaeneg America LadinSbaen" + + "eg EwropSbaeneg MecsicoFfrangeg CanadaFfrangeg y SwistirSacsoneg Ise" + + "lFflemegPortiwgeeg BrasilPortiwgeeg EwropMoldofegSerbo-CroategTsiein" + + "eeg SymledigTsieineeg Traddodiadol", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0007, 0x000f, 0x0018, 0x0023, 0x0029, 0x0030, 0x0038, + 0x003e, 0x0044, 0x004a, 0x0051, 0x005d, 0x0067, 0x0070, 0x0078, + 0x007f, 0x0087, 0x008f, 0x0096, 0x009e, 0x00a5, 0x00ae, 0x00b9, + 0x00c2, 0x00c8, 0x00cb, 0x00d2, 0x00de, 0x00e8, 0x00ef, 0x00f4, + 0x00fc, 0x0102, 0x010a, 0x010d, 0x0112, 0x0119, 0x0122, 0x0129, + 0x0130, 0x0136, 0x013c, 0x0141, 0x0148, 0x0150, 0x0158, 0x0160, + 0x0173, 0x017c, 0x018b, 0x0193, 0x019b, 0x01a3, 0x01aa, 0x01af, + 0x01b6, 0x01bb, 0x01bb, 0x01c2, 0x01cd, 0x01d5, 0x01dc, 0x01e2, + // Entry 40 - 7F + 0x01ed, 0x01f6, 0x0201, 0x0205, 0x020a, 0x0213, 0x0213, 0x021b, + 0x0222, 0x022b, 0x0233, 0x023b, 0x0242, 0x0247, 0x024d, 0x024d, + 0x0255, 0x0260, 0x0267, 0x026e, 0x0274, 0x027a, 0x0283, 0x0289, + 0x028d, 0x0295, 0x029d, 0x02a3, 0x02af, 0x02b4, 0x02bd, 0x02c4, + 0x02c9, 0x02d2, 0x02de, 0x02e5, 0x02ee, 0x02f7, 0x02fc, 0x0305, + 0x030e, 0x0316, 0x031d, 0x0324, 0x032a, 0x0332, 0x033a, 0x034b, + 0x0352, 0x0358, 0x0361, 0x0370, 0x037f, 0x038e, 0x0394, 0x039a, + 0x03a3, 0x03a9, 0x03ae, 0x03b3, 0x03b9, 0x03c1, 0x03c5, 0x03cb, + // Entry 80 - BF + 0x03d1, 0x03db, 0x03e2, 0x03ea, 0x03ef, 0x03f6, 0x03fb, 0x0408, + 0x0410, 0x0416, 0x041c, 0x042a, 0x042f, 0x0437, 0x043f, 0x0447, + 0x044e, 0x0453, 0x045a, 0x0461, 0x0467, 0x046c, 0x0474, 0x047c, + 0x0482, 0x0489, 0x0490, 0x0496, 0x049d, 0x04a1, 0x04a9, 0x04b2, + 0x04b8, 0x04be, 0x04c4, 0x04cc, 0x04d3, 0x04d3, 0x04d9, 0x04e1, + 0x04e5, 0x04ec, 0x04f2, 0x04fb, 0x04fb, 0x0502, 0x0508, 0x050d, + 0x051b, 0x0521, 0x0521, 0x052a, 0x052e, 0x0535, 0x053a, 0x0542, + 0x0556, 0x0564, 0x056d, 0x0574, 0x057b, 0x0581, 0x058b, 0x0592, + // Entry C0 - FF + 0x05a0, 0x05af, 0x05ba, 0x05c0, 0x05c7, 0x05d0, 0x05d8, 0x05df, + 0x05ed, 0x05f5, 0x0602, 0x0611, 0x0614, 0x062b, 0x0635, 0x0635, + 0x063b, 0x0642, 0x0649, 0x0649, 0x0650, 0x0657, 0x0657, 0x0657, + 0x065e, 0x0664, 0x0664, 0x0668, 0x0670, 0x0676, 0x0689, 0x0689, + 0x0689, 0x0689, 0x0689, 0x068e, 0x0695, 0x0695, 0x0695, 0x0695, + 0x069b, 0x069f, 0x06a5, 0x06ad, 0x06ad, 0x06b1, 0x06b1, 0x06b1, + 0x06b5, 0x06bc, 0x06bc, 0x06c3, 0x06c3, 0x06c8, 0x06c8, 0x06c8, + 0x06c8, 0x06ce, 0x06ce, 0x06d4, 0x06d4, 0x06dd, 0x06e5, 0x06f2, + // Entry 100 - 13F + 0x06f8, 0x06f8, 0x0707, 0x0707, 0x070f, 0x0715, 0x071a, 0x071a, + 0x071a, 0x071a, 0x071f, 0x0726, 0x072b, 0x0736, 0x0736, 0x073d, + 0x074c, 0x0756, 0x0756, 0x0756, 0x075a, 0x075a, 0x075a, 0x0765, + 0x0765, 0x076b, 0x0778, 0x0778, 0x077e, 0x078a, 0x078a, 0x0794, + 0x07a4, 0x07a4, 0x07b2, 0x07c0, 0x07cc, 0x07d5, 0x07e6, 0x07f7, + 0x07ff, 0x07ff, 0x0805, 0x0805, 0x0809, 0x080e, 0x0822, 0x0822, + 0x082b, 0x082b, 0x083f, 0x0851, 0x0851, 0x0851, 0x0851, 0x0857, + 0x0857, 0x085f, 0x0871, 0x0871, 0x0871, 0x0876, 0x0876, 0x087b, + // Entry 140 - 17F + 0x087b, 0x0883, 0x0883, 0x0883, 0x0889, 0x0890, 0x089c, 0x089c, + 0x089c, 0x08a2, 0x08a8, 0x08b0, 0x08b8, 0x08b8, 0x08b8, 0x08b8, + 0x08be, 0x08c6, 0x08d3, 0x08df, 0x08df, 0x08ec, 0x08f3, 0x08f3, + 0x08f3, 0x08f8, 0x08f8, 0x090b, 0x090b, 0x0911, 0x0919, 0x0926, + 0x0926, 0x0926, 0x0926, 0x092c, 0x092c, 0x0938, 0x0940, 0x0940, + 0x0940, 0x0948, 0x0948, 0x0954, 0x095b, 0x095b, 0x095b, 0x095b, + 0x095b, 0x095b, 0x0962, 0x0962, 0x096a, 0x0970, 0x0977, 0x097e, + 0x097e, 0x098b, 0x0990, 0x0996, 0x099b, 0x09a2, 0x09a2, 0x09a2, + // Entry 180 - 1BF + 0x09a2, 0x09a8, 0x09b1, 0x09b6, 0x09ba, 0x09c8, 0x09d0, 0x09d0, + 0x09d0, 0x09d5, 0x09d9, 0x09e1, 0x09e6, 0x09e6, 0x09e6, 0x09ed, + 0x09ed, 0x09f3, 0x09fb, 0x0a04, 0x0a0c, 0x0a11, 0x0a11, 0x0a17, + 0x0a1f, 0x0a25, 0x0a2a, 0x0a32, 0x0a41, 0x0a4f, 0x0a53, 0x0a5b, + 0x0a5b, 0x0a61, 0x0a69, 0x0a70, 0x0a74, 0x0a84, 0x0a8b, 0x0a9b, + 0x0a9b, 0x0aa3, 0x0aaa, 0x0aaa, 0x0aaa, 0x0aaa, 0x0ab5, 0x0ab5, + 0x0abc, 0x0ac0, 0x0acd, 0x0ad3, 0x0ad3, 0x0ad3, 0x0ada, 0x0ae0, + 0x0ae0, 0x0ae0, 0x0aea, 0x0aea, 0x0af0, 0x0aff, 0x0b06, 0x0b10, + // Entry 1C0 - 1FF + 0x0b18, 0x0b20, 0x0b25, 0x0b2b, 0x0b31, 0x0b3e, 0x0b48, 0x0b4f, + 0x0b57, 0x0b57, 0x0b57, 0x0b5f, 0x0b73, 0x0b73, 0x0b7e, 0x0b8e, + 0x0b97, 0x0ba1, 0x0ba7, 0x0bb2, 0x0bb8, 0x0bc7, 0x0bd2, 0x0bd2, + 0x0bdd, 0x0be5, 0x0bef, 0x0bef, 0x0bef, 0x0bf4, 0x0bfa, 0x0c03, + 0x0c03, 0x0c03, 0x0c0b, 0x0c0e, 0x0c17, 0x0c17, 0x0c26, 0x0c2e, + 0x0c35, 0x0c3c, 0x0c3c, 0x0c45, 0x0c4a, 0x0c51, 0x0c57, 0x0c69, + 0x0c77, 0x0c7d, 0x0c81, 0x0c85, 0x0c8d, 0x0c9c, 0x0ca8, 0x0cb1, + 0x0cba, 0x0cba, 0x0cc5, 0x0ccb, 0x0cd6, 0x0cd6, 0x0ce2, 0x0ceb, + // Entry 200 - 23F + 0x0cf5, 0x0cff, 0x0d07, 0x0d0d, 0x0d0d, 0x0d14, 0x0d14, 0x0d25, + 0x0d2b, 0x0d32, 0x0d39, 0x0d40, 0x0d51, 0x0d5b, 0x0d61, 0x0d69, + 0x0d6d, 0x0d73, 0x0d77, 0x0d7d, 0x0d84, 0x0d8a, 0x0d8f, 0x0d98, + 0x0da1, 0x0da8, 0x0daf, 0x0db7, 0x0dc1, 0x0dc1, 0x0dca, 0x0dca, + 0x0dd0, 0x0dd8, 0x0dd8, 0x0dd8, 0x0ddf, 0x0de7, 0x0dee, 0x0dee, + 0x0e08, 0x0e10, 0x0e18, 0x0e1f, 0x0e28, 0x0e2d, 0x0e34, 0x0e38, + 0x0e4b, 0x0e4b, 0x0e50, 0x0e50, 0x0e55, 0x0e5d, 0x0e63, 0x0e6c, + 0x0e71, 0x0e79, 0x0e79, 0x0e81, 0x0e81, 0x0e85, 0x0e85, 0x0e85, + // Entry 240 - 27F + 0x0e85, 0x0e8c, 0x0e8c, 0x0e95, 0x0e9e, 0x0eaa, 0x0eb3, 0x0eb3, + 0x0ec3, 0x0ec7, 0x0edd, 0x0ee4, 0x0ef9, 0x0f0d, 0x0f1d, 0x0f37, + 0x0f48, 0x0f56, 0x0f65, 0x0f74, 0x0f89, 0x0f96, 0x0fa5, 0x0fa5, + 0x0fb4, 0x0fc6, 0x0fd3, 0x0fda, 0x0feb, 0x0ffb, 0x1003, 0x1010, + 0x1022, 0x1038, + }, + }, + { // da + daLangStr, + daLangIdx, + }, + { // dav + "KiakanKiamhariKiarabuKibelarusiKibulgariaKibanglaKicheckiKijerumaniKigir" + + "ikiKingerezaKihispaniaKiajemiKifaransaKihausaKihindiKihungariKiindon" + + "esiaKiigboKiitalianoKijapaniKijavaKikambodiaKikoreaKimalesiaKiburmaK" + + "inepaliKiholanziKipunjabiKipolandiKirenoKiromaniaKirusiKinyarwandaKi" + + "somaliKiswidiKitamilKitailandiKiturukiKiukraniaKiurduKivietinamuKiyo" + + "rubaKichinaKizuluKitaita", + []uint16{ // 263 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x0029, + 0x0029, 0x0029, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, + 0x0031, 0x0031, 0x0031, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, + 0x0043, 0x0043, 0x0043, 0x0043, 0x004b, 0x0054, 0x0054, 0x005e, + 0x005e, 0x005e, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0075, + 0x0075, 0x007c, 0x007c, 0x007c, 0x007c, 0x0085, 0x0085, 0x0085, + // Entry 40 - 7F + 0x0085, 0x0090, 0x0090, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, + 0x00a0, 0x00a0, 0x00a8, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00b8, 0x00b8, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00c8, 0x00c8, 0x00cf, 0x00cf, 0x00cf, + 0x00d7, 0x00d7, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, + 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e9, 0x00e9, 0x00f2, + // Entry 80 - BF + 0x00f2, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x0101, 0x0107, 0x0112, + 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, + 0x0112, 0x0112, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, + 0x0121, 0x0121, 0x0128, 0x0128, 0x0128, 0x0132, 0x0132, 0x0132, + 0x0132, 0x0132, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, 0x0143, + 0x0149, 0x0149, 0x0149, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, + 0x0154, 0x015c, 0x015c, 0x0163, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry C0 - FF + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry 100 - 13F + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0170, + }, + }, + { // de + deLangStr, + deLangIdx, + }, + { // de-CH + "WeissrussischAltpreussisch", + []uint16{ // 469 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + // Entry 40 - 7F + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + // Entry 80 - BF + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + // Entry C0 - FF + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + // Entry 100 - 13F + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + // Entry 140 - 17F + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + // Entry 180 - 1BF + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + // Entry 1C0 - 1FF + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x001a, + }, + }, + { // dje + "Akan senniAmhaarik senniLaaraw senniBelaruus senniBulagaari senniBengali" + + " senniCek senniAlmaŋ senniGrek senniInglisi senniEspaaɲe senniFarsi " + + "senniFransee senniHawsance senniInduu senniHungaari senniIndoneesi s" + + "enniIboo senniItaali senniJaponee senniJavanee senniKmeer senniKoree" + + " senniMaleezi senniBurme senniNeepal senniHolandee senniPunjaabi sen" + + "niiPolonee senniPortugee senniRumaani senniRuusi senniRwanda senniSo" + + "maali senniSuweede senniTamil senniTaailandu senniTurku senniUkreen " + + "senniUrdu senniVietnaam senniYorbance senniSinuwa senniZulu senniZar" + + "maciine", + []uint16{ // 268 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0018, 0x0018, + 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0032, 0x0041, + 0x0041, 0x0041, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, + 0x004e, 0x004e, 0x004e, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0063, 0x0063, 0x0063, 0x0063, 0x006d, 0x007a, 0x007a, 0x0088, + 0x0088, 0x0088, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x00a0, + 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00ae, + 0x00ae, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00c7, 0x00c7, 0x00c7, + // Entry 40 - 7F + 0x00c7, 0x00d6, 0x00d6, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, + 0x00ec, 0x00ec, 0x00f9, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, + 0x0106, 0x0106, 0x0111, 0x0111, 0x011c, 0x011c, 0x011c, 0x011c, + 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, + 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, + 0x011c, 0x011c, 0x011c, 0x0129, 0x0129, 0x0134, 0x0134, 0x0134, + 0x0140, 0x0140, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, + 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x015d, 0x015d, 0x016a, + // Entry 80 - BF + 0x016a, 0x0178, 0x0178, 0x0178, 0x0178, 0x0185, 0x0190, 0x019c, + 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, + 0x019c, 0x019c, 0x01a9, 0x01a9, 0x01a9, 0x01a9, 0x01a9, 0x01a9, + 0x01b6, 0x01b6, 0x01c1, 0x01c1, 0x01c1, 0x01d0, 0x01d0, 0x01d0, + 0x01d0, 0x01d0, 0x01db, 0x01db, 0x01db, 0x01db, 0x01db, 0x01e7, + 0x01f1, 0x01f1, 0x01f1, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, + 0x01ff, 0x020d, 0x020d, 0x0219, 0x0223, 0x0223, 0x0223, 0x0223, + 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, + // Entry C0 - FF + 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, + 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, + 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, + 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, + 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, + 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, + 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, + 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, + // Entry 100 - 13F + 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, 0x0223, + 0x0223, 0x0223, 0x0223, 0x022d, + }, + }, + { // dsb + "afaršćinaabchazšćinaafrikansakanšćinaamharšćinaaragonšćinaarabšćinaasamš" + + "ćinaawaršćinaaymaršćinaazerbajdžanšćinabaškiršćinaběłorušćinabulgar" + + "šćinabislamšćinabambarabengalšćinatibetšćinabretonšćinabosnišćinaka" + + "tanlanšćinačamoršćinakorsišćinakričešćinawalizišćinadanšćinanimšćina" + + "divehidzongkhaewegrichišćinaengelšćinaesperantošpańšćinaestišćinabas" + + "kišćinapersišćinafinšćinafidžišćinaferejšćinafrancojšćinafrizišćinai" + + "ršćinašotišćinagalicišćinaguaranigudžaratšćinamanšćinahausahebrejšći" + + "nahindišćinachorwatšćinahaitišćinahungoršćinaarmeńšćinainterlinguain" + + "donešćinaigbosichuan yiinupiakidoislandšćinaitalšćinainuitšćinajapań" + + "šćinajavašćinageorgišćinakikuyukazachšćinagrönlandšćinakambodžanšći" + + "nakannadšćinakorejańšćinakašmiršćinakurdišćinakornišćinakirgišćinała" + + "tyńšćinaluxemburgšćinagandšćinalimburšćinalingalalaošćinalitawšćinal" + + "uba-katangaletišćinamalgašćinamaorišćinamakedońšćinamalajamšćinamong" + + "olšćinamaratišćinamalajšćinamaltašćinaburmašćinanaurušćinapódpołnocn" + + "e ndebelenepalšćinanižozemšćinanorwegske nynorsknorwegske bokmålnava" + + "hookcitanšćinaoromoorojišćinapandžabšćinapólšćinapaštunšćinaportugal" + + "šćinakečuaretoromańšćinakirundišćinarumunšćinarušćinakinjarwandasan" + + "skritsardinšćinasindšćinalapšćinasangosingalšćinasłowakšćinasłowjeńš" + + "ćinasamošćinašonšćinasomališćinaalbanšćinaserbišćinasiswatipódpołdn" + + "jowa sotšćina (Sesotho)sundanšćinašwedšćinaswahilišćinatamilšćinatel" + + "ugšćinatadžikišćinathailandšćinatigrinjaturkmeńšćinatswanatonganšćin" + + "aturkojšćinatsongatataršćinatahitišćinaujguršćinaukrainšćinaurdušćin" + + "ausbekšćinavietnamšćinavolapükwalonšćinawolofxhosajidišćinajorubšćin" + + "azhuangchinšćinazuluaghemanglosaksojšćinaarawkašćinapareasturšćinabe" + + "mbabenabodobugišćinachigachoctawšćinacherokeesoranitaitazarmadolnose" + + "rbšćinadualajola-fonyiembufilipinšćinagagauzšćinagotišćinašwicarska " + + "nimšćinagusiihawaiišćinagórnoserbšćinangombamachamekabylšćinakambama" + + "kondekapverdšćinakoyra chiinikalenjinkomi-permyakkonkanišambalabafia" + + "langilakotšćinaluoluhyamasaišćinamerumauriciska kreolšćinamakhuwa-me" + + "ettometa’mohawkšćinamundangkriknamadolnonimšćinakwasion’konuernyanko" + + "leprusčinakʼicheʼromborwasamburusangusicilianišćinasenakoyra sennita" + + "šelhitpódpołdnjowa samišćinalule-samišćinainari-samišćinaskolt-sami" + + "šćinasaterfrizišćinakongojska swahilišćinatesotasawaqcentralnoatlas" + + "ki tamazightnjeznata rěcvaivunjosogastandardny marokkański tamazight" + + "žedno rěcne wopśimjeśemoderna wusokoarabšćinaawstriska nimšćinašwic" + + "arska wusokonimšćinaawstralska engelšćinakanadiska engelšćinabritisk" + + "a engelšćinaameriska engelšćinałatyńskoamerikańska špańšćinaeuropejs" + + "ka špańšćinamexikańska špańšćinakanadiska francojšćinašwicarska fran" + + "cojšćinaflamšćinabrazilska portugalšćinaeuropejska portugalšćinamold" + + "awišćinaserbochorwatšćinachinšćina (zjadnorjona)chinšćina (tradicion" + + "alna)", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000b, 0x0018, 0x0018, 0x0020, 0x002b, 0x0037, 0x0044, + 0x004f, 0x005a, 0x0065, 0x0071, 0x0084, 0x0092, 0x00a1, 0x00ae, + 0x00bb, 0x00c2, 0x00cf, 0x00db, 0x00e8, 0x00f4, 0x0103, 0x0103, + 0x0110, 0x011c, 0x011f, 0x0129, 0x0129, 0x0129, 0x0136, 0x0140, + 0x014a, 0x0150, 0x0158, 0x015b, 0x0168, 0x0174, 0x017d, 0x018a, + 0x0195, 0x01a1, 0x01ad, 0x01ad, 0x01b7, 0x01c4, 0x01d0, 0x01de, + 0x01ea, 0x01f3, 0x01ff, 0x020c, 0x0213, 0x0223, 0x022d, 0x0232, + 0x023f, 0x024b, 0x024b, 0x0259, 0x0265, 0x0272, 0x027f, 0x027f, + // Entry 40 - 7F + 0x028a, 0x0297, 0x0297, 0x029b, 0x02a5, 0x02ac, 0x02af, 0x02bc, + 0x02c7, 0x02d3, 0x02e0, 0x02eb, 0x02f8, 0x02f8, 0x02fe, 0x02fe, + 0x030b, 0x031b, 0x032c, 0x0339, 0x0348, 0x0348, 0x0356, 0x0362, + 0x0362, 0x036e, 0x037a, 0x0388, 0x0398, 0x03a3, 0x03b0, 0x03b7, + 0x03c1, 0x03cd, 0x03d9, 0x03e4, 0x03f0, 0x03f0, 0x03fc, 0x040b, + 0x0419, 0x0426, 0x0433, 0x043f, 0x044b, 0x0457, 0x0463, 0x0478, + 0x0484, 0x0484, 0x0493, 0x04a4, 0x04b5, 0x04b5, 0x04bb, 0x04bb, + 0x04c9, 0x04c9, 0x04ce, 0x04da, 0x04da, 0x04e9, 0x04e9, 0x04f4, + // Entry 80 - BF + 0x0502, 0x0511, 0x0517, 0x0528, 0x0536, 0x0542, 0x054b, 0x0556, + 0x055e, 0x056b, 0x0576, 0x0580, 0x0585, 0x0592, 0x05a0, 0x05b0, + 0x05bb, 0x05c6, 0x05d3, 0x05df, 0x05eb, 0x05f2, 0x0615, 0x0622, + 0x062e, 0x063c, 0x0648, 0x0654, 0x0663, 0x0672, 0x067a, 0x0689, + 0x068f, 0x069c, 0x06a9, 0x06af, 0x06bb, 0x06c8, 0x06d4, 0x06e1, + 0x06ec, 0x06f8, 0x06f8, 0x0706, 0x070e, 0x071a, 0x071f, 0x0724, + 0x072f, 0x073b, 0x0741, 0x074c, 0x0750, 0x0750, 0x0750, 0x0750, + 0x0750, 0x0750, 0x0750, 0x0755, 0x0755, 0x0755, 0x0755, 0x0755, + // Entry C0 - FF + 0x0755, 0x0755, 0x0767, 0x0767, 0x0767, 0x0774, 0x0774, 0x0774, + 0x0774, 0x0774, 0x0774, 0x0774, 0x0778, 0x0778, 0x0784, 0x0784, + 0x0784, 0x0784, 0x0784, 0x0784, 0x0784, 0x0784, 0x0784, 0x0784, + 0x0784, 0x0789, 0x0789, 0x078d, 0x078d, 0x078d, 0x078d, 0x078d, + 0x078d, 0x078d, 0x078d, 0x078d, 0x078d, 0x078d, 0x078d, 0x078d, + 0x078d, 0x0791, 0x0791, 0x0791, 0x079c, 0x079c, 0x079c, 0x079c, + 0x079c, 0x079c, 0x079c, 0x079c, 0x079c, 0x07a1, 0x07a1, 0x07a1, + 0x07a1, 0x07a1, 0x07a1, 0x07af, 0x07af, 0x07b7, 0x07b7, 0x07bd, + // Entry 100 - 13F + 0x07bd, 0x07bd, 0x07bd, 0x07bd, 0x07bd, 0x07bd, 0x07c2, 0x07c2, + 0x07c2, 0x07c2, 0x07c2, 0x07c7, 0x07c7, 0x07d7, 0x07d7, 0x07dc, + 0x07dc, 0x07e6, 0x07e6, 0x07e6, 0x07ea, 0x07ea, 0x07ea, 0x07ea, + 0x07ea, 0x07ea, 0x07ea, 0x07ea, 0x07ea, 0x07ea, 0x07ea, 0x07f8, + 0x07f8, 0x07f8, 0x07f8, 0x07f8, 0x07f8, 0x07f8, 0x07f8, 0x07f8, + 0x07f8, 0x07f8, 0x0805, 0x0805, 0x0805, 0x0805, 0x0805, 0x0805, + 0x0805, 0x0805, 0x0805, 0x0805, 0x0805, 0x0805, 0x0805, 0x0810, + 0x0810, 0x0810, 0x0825, 0x0825, 0x0825, 0x082a, 0x082a, 0x082a, + // Entry 140 - 17F + 0x082a, 0x0837, 0x0837, 0x0837, 0x0837, 0x0837, 0x0848, 0x0848, + 0x0848, 0x0848, 0x0848, 0x0848, 0x0848, 0x0848, 0x0848, 0x0848, + 0x084e, 0x0855, 0x0855, 0x0855, 0x0855, 0x0855, 0x0861, 0x0861, + 0x0861, 0x0866, 0x0866, 0x0866, 0x0866, 0x0866, 0x086d, 0x087b, + 0x087b, 0x087b, 0x087b, 0x087b, 0x087b, 0x0887, 0x0887, 0x0887, + 0x0887, 0x088f, 0x088f, 0x089b, 0x08a2, 0x08a2, 0x08a2, 0x08a2, + 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08aa, 0x08af, 0x08af, 0x08af, + 0x08af, 0x08af, 0x08b4, 0x08b4, 0x08b4, 0x08b4, 0x08b4, 0x08b4, + // Entry 180 - 1BF + 0x08b4, 0x08c0, 0x08c0, 0x08c0, 0x08c0, 0x08c0, 0x08c0, 0x08c0, + 0x08c0, 0x08c0, 0x08c3, 0x08c3, 0x08c8, 0x08c8, 0x08c8, 0x08c8, + 0x08c8, 0x08c8, 0x08c8, 0x08c8, 0x08c8, 0x08d4, 0x08d4, 0x08d4, + 0x08d4, 0x08d4, 0x08d8, 0x08ef, 0x08ef, 0x08fd, 0x0904, 0x0904, + 0x0904, 0x0904, 0x0904, 0x0911, 0x0911, 0x0911, 0x0918, 0x0918, + 0x091c, 0x091c, 0x091c, 0x091c, 0x091c, 0x091c, 0x091c, 0x091c, + 0x091c, 0x0920, 0x092f, 0x092f, 0x092f, 0x092f, 0x092f, 0x0935, + 0x0935, 0x0935, 0x0935, 0x0935, 0x093b, 0x093b, 0x093f, 0x093f, + // Entry 1C0 - 1FF + 0x093f, 0x0947, 0x0947, 0x0947, 0x0947, 0x0947, 0x0947, 0x0947, + 0x0947, 0x0947, 0x0947, 0x0947, 0x0947, 0x0947, 0x0947, 0x0947, + 0x0947, 0x0947, 0x0947, 0x0947, 0x0950, 0x0950, 0x0959, 0x0959, + 0x0959, 0x0959, 0x0959, 0x0959, 0x0959, 0x095e, 0x095e, 0x095e, + 0x095e, 0x095e, 0x095e, 0x0961, 0x0961, 0x0961, 0x0961, 0x0968, + 0x0968, 0x0968, 0x0968, 0x0968, 0x096d, 0x097d, 0x097d, 0x097d, + 0x097d, 0x097d, 0x0981, 0x0981, 0x0981, 0x098c, 0x098c, 0x098c, + 0x0995, 0x0995, 0x0995, 0x0995, 0x0995, 0x0995, 0x09af, 0x09bf, + // Entry 200 - 23F + 0x09d0, 0x09e1, 0x09e1, 0x09e1, 0x09e1, 0x09e1, 0x09e1, 0x09f2, + 0x09f2, 0x09f2, 0x09f2, 0x09f2, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, + 0x0a0a, 0x0a0a, 0x0a0e, 0x0a0e, 0x0a0e, 0x0a0e, 0x0a0e, 0x0a0e, + 0x0a0e, 0x0a0e, 0x0a0e, 0x0a0e, 0x0a0e, 0x0a0e, 0x0a0e, 0x0a0e, + 0x0a0e, 0x0a0e, 0x0a0e, 0x0a0e, 0x0a0e, 0x0a0e, 0x0a15, 0x0a15, + 0x0a2f, 0x0a2f, 0x0a2f, 0x0a2f, 0x0a3c, 0x0a3f, 0x0a3f, 0x0a3f, + 0x0a3f, 0x0a3f, 0x0a3f, 0x0a3f, 0x0a44, 0x0a44, 0x0a44, 0x0a44, + 0x0a44, 0x0a44, 0x0a44, 0x0a44, 0x0a44, 0x0a48, 0x0a48, 0x0a48, + // Entry 240 - 27F + 0x0a48, 0x0a48, 0x0a48, 0x0a48, 0x0a48, 0x0a48, 0x0a48, 0x0a48, + 0x0a69, 0x0a69, 0x0a83, 0x0a83, 0x0a9c, 0x0a9c, 0x0ab0, 0x0acb, + 0x0ae2, 0x0af8, 0x0b0d, 0x0b22, 0x0b46, 0x0b5e, 0x0b77, 0x0b77, + 0x0b8f, 0x0ba8, 0x0ba8, 0x0bb3, 0x0bcc, 0x0be6, 0x0bf4, 0x0c07, + 0x0c20, 0x0c3b, + }, + }, + { // dua + "duálá", + []uint16{ // 272 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 80 - BF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry C0 - FF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 100 - 13F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, + }, + }, + { // dyo + "akanamharikarabbelarusbulgaaribengalisekalmangreekangleespañolpersanfran" + + "sehausaenduongruaindoneesiigboitaliensaponeesavaneekmeerkoreemaleesi" + + "birmaninepaleesneerlandepenjabipoloneesportugeesrumeenrusruandasomal" + + "isueditamiltayturkiukrainurduvietnamyorubasinuasulujoola", + []uint16{ // 274 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000b, 0x000b, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x0016, 0x001e, + 0x001e, 0x001e, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, + 0x0025, 0x0025, 0x0025, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x002d, 0x002d, 0x002d, 0x002d, 0x0032, 0x0037, 0x0037, 0x003f, + 0x003f, 0x003f, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x004b, + 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x0050, + 0x0050, 0x0054, 0x0054, 0x0054, 0x0054, 0x005a, 0x005a, 0x005a, + // Entry 40 - 7F + 0x005a, 0x0063, 0x0063, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, + 0x006e, 0x006e, 0x0075, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, + 0x007c, 0x007c, 0x0081, 0x0081, 0x0086, 0x0086, 0x0086, 0x0086, + 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, + 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, 0x0086, + 0x0086, 0x0086, 0x0086, 0x008d, 0x008d, 0x0094, 0x0094, 0x0094, + 0x009c, 0x009c, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, + 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00ac, 0x00ac, 0x00b4, + // Entry 80 - BF + 0x00b4, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00c3, 0x00c6, 0x00cc, + 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, + 0x00cc, 0x00cc, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, + 0x00d7, 0x00d7, 0x00dc, 0x00dc, 0x00dc, 0x00df, 0x00df, 0x00df, + 0x00df, 0x00df, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00ea, + 0x00ee, 0x00ee, 0x00ee, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, + 0x00f5, 0x00fb, 0x00fb, 0x0100, 0x0104, 0x0104, 0x0104, 0x0104, + 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, + // Entry C0 - FF + 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, + 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, + 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, + 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, + 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, + 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, + 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, + 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, + // Entry 100 - 13F + 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, + 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, + 0x0104, 0x0109, + }, + }, + { // dz + "ཨ་ཕར་ཁཨཱབ་ཁ་ཟི་ཡ་ཁཨཕ་རི་ཀཱནས་ཁཨམ་ཧ་རིཀ་ཁཨེ་ར་བིཀ་ཁཨ་ས་མིས་ཁཨ་ཛར་བྷའི་ཇཱན" + + "་ཁབེལ་ཨ་རུས་ཁབཱལ་གེ་རི་ཡཱན་ཁབངྒ་ལ་ཁབོད་ཁབྷོས་ནི་ཡཱན་ཁཀེ་ཊ་ལཱན་ཁཅེཀ" + + "་ཁཝེལཤ་ཁཌེ་ནིཤ་ཁཇཱར་མཱན་ཁདི་བེ་ཧི་ཁརྫོང་ཁགྲིཀ་ཁཨིང་ལིཤ་ཁཨེས་པ་རཱན་" + + "ཏོ་ཁཨིས་པེ་ནིཤ་ཁཨེས་ཊོ་ནི་ཡཱན་ཁབཱསཀ་ཁཔར་ཤི་ཡཱན་ཁཕི་ནིཤ་ཁཕི་ཇི་ཡཱན་" + + "ཁཕཱ་རོ་ཨིས་ཁཕྲནཅ་ཁནུབ་ཕྼི་སི་ཡན་ཁཨཱའི་རིཤ་ཁགལ་ཨིས་ཨི་ཡན་ཁགུ་ཝ་ར་ནི" + + "་ཁགུ་ཇ་ར་ཏི་ཁཧཝ་ས་ཁཧེ་བྲུ་ཁཧིན་དི་ཁཀྲོ་ཨེ་ཤི་ཡཱན་ཁཧེ་ཏི་ཡཱན་ཁཧཱང་ག" + + "ྷ་རི་ཡཱན་ཁཨར་མི་ནི་ཡཱན་ཁཨིན་ཌོ་ནེ་ཤི་ཡཱན་ཁཨིག་བོ་ཁཨ་ཡིས་ལེན་ཌིཀ་ཁཨ" + + "ི་ཊ་ལི་ཡཱན་ཁཇཱ་པཱ་ནིས་ཁཇཱ་བ་ནིས་ཁཇཽ་ཇི་ཡཱན་ཁཀ་ཛགས་ཁཁེ་མེར་ཁཀ་ན་ཌ་ཁ" + + "ཀོ་རི་ཡཱན་ཁཀཱཤ་མི་རི་ཁཀར་ཌིཤ་ཁཀིར་གིས་ཁལེ་ཊིན་ཁལག་ཛམ་བོརྒ་ཁལཱ་ཝོས་" + + "ཁལི་ཐུ་ཝེ་ནི་ཡཱན་ཁལཊ་བི་ཡཱན་ཁམ་ལ་ག་སི་ཁམ་ཨོ་རི་ཁམ་སེ་ཌོ་ནི་ཡཱན་ཁམ་" + + "ལ་ཡ་ལམ་ཁམ་ར་ཐི་ཁམ་ལེ་ཁམཱལ་ཊ་ཁབར་མིས་ཁནེ་པཱལི་ཁཌཆ་ཁནོར་ཝེ་ཇི་ཡཱན་ནོ" + + "རསཀ་ཁནོར་ཝེ་ཇི་ཡཱན་བོཀ་མཱལ་ཁཨོ་རི་ཡ་ཁཔཱན་ཇ་བི་ཁཔོ་ལིཤ་ཁཔཱཤ་ཏོ་ཁཔོར" + + "་ཅུ་གིས་ཁཀྭེ་ཆུ་ཨ་ཁརོ་མེ་ནིཤ་ཁརོ་མེ་ནི་ཡཱན་ཁཨུ་རུ་སུའི་ཁསཾསྐྲྀཏ་ཁས" + + "ིན་དཱི་ཁསིང་ཧ་ལ་ཁསུ་ལོ་བཱཀ་ཁསུ་ལོ་བི་ནི་ཡཱན་ཁསོ་མ་ལི་ཁཨཱལ་བེ་ནི་ཡཱ" + + "ན་ཁསཱར་བྷི་ཡཱན་ཁསཱུན་ད་ནིས་ཁསུའི་ཌིཤ་ཁསྭཱ་ཧི་ལི་ཁཏ་མིལ་ཁཏེ་ལུ་གུ་ཁ" + + "ཏ་ཇིཀ་ཁཐཱའི་ཁཏིག་རི་ཉ་ཁཊཱརཀ་མེན་ཁཊོང་གྷན་ཁཊཱར་ཀིཤ་ཁཊ་ཊར་ཁཝི་གུར་ཁཡ" + + "ུ་ཀེ་རེ་ནི་ཡཱན་ཁཨུར་དུ་ཁཨུས་བེཀ་ཁབེཊ་ནཱ་མིས་ཁཝོ་ལོཕ་ཁཞོ་ས་ཁཡོ་རུ་བ" + + "་ཁརྒྱ་མི་ཁཟུ་ལུ་ཁད་ཀོ་ཏ་ཁཕི་ལི་པི་ནོ་ཁསུ་ཡིས་ཇཱར་མཱན་ཁཧ་ཝ་ཡིའི་ཁཀ་" + + "ཆིན་ཁཀོ་རོ་ཁམན་ཇུ་ཁཤཱན་ཁཁ་ངོ་མ་ཤེསཔསྐད་རིག་ནང་དོན་མེདཔཨཱོས་ཊྲི་ཡཱན" + + "་ཇཱར་མཱན་ཁསུ་ཡིས་གི་མཐོ་སའི་ཇཱར་མཱན་ཁཨཱོས་ཊྲེ་ལི་ཡཱན་ཨིང་ལིཤ་ཁཀེ་ན" + + "་ཌི་ཡཱན་ཨིང་ལིཤ་ཁབྲི་ཊིཤ་ཨིང་ལིཤ་ཁཡུ་ཨེས་ཨིང་ལིཤ་ཁལེ་ཊིན་ཨ་མེ་རི་ཀ" + + "ཱན་གི་ཨིས་པེ་ནིཤ་ཁཡུ་རོབ་ཀྱི་ཨིས་པེ་ནིཤ་ཁཀེ་ན་ཌི་ཡཱན་ཕྲནཅ་ཁསུ་ཡིས་" + + "ཕྲནཅ་ཁཕྷེལེ་མིཤ་ཁབྲ་ཛི་ལི་ཡཱན་པོར་ཅུ་གིས་ཁཨི་བེ་རི་ཡཱན་པོར་ཅུ་གིས་" + + "ཁརྒྱ་མི་ཁ་འཇམ་སངམསྔ་དུས་ཀྱི་རྒྱ་མི་ཁ", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0012, 0x0036, 0x0036, 0x005a, 0x005a, 0x0078, 0x0078, + 0x0096, 0x00b1, 0x00b1, 0x00b1, 0x00de, 0x00de, 0x00ff, 0x012c, + 0x012c, 0x012c, 0x0141, 0x0150, 0x0150, 0x0177, 0x0195, 0x0195, + 0x0195, 0x0195, 0x0195, 0x01a4, 0x01a4, 0x01a4, 0x01b6, 0x01ce, + 0x01e9, 0x0207, 0x0219, 0x0219, 0x022b, 0x0246, 0x0270, 0x0294, + 0x02c1, 0x02d3, 0x02f4, 0x02f4, 0x030c, 0x032d, 0x034e, 0x0360, + 0x038d, 0x03ab, 0x03ab, 0x03d5, 0x03f6, 0x0417, 0x0417, 0x0429, + 0x0441, 0x0459, 0x0459, 0x0486, 0x04a7, 0x04d4, 0x04fe, 0x04fe, + // Entry 40 - 7F + 0x04fe, 0x0534, 0x0534, 0x054c, 0x054c, 0x054c, 0x054c, 0x0579, + 0x05a0, 0x05a0, 0x05c1, 0x05df, 0x0600, 0x0600, 0x0600, 0x0600, + 0x0615, 0x0615, 0x062d, 0x0642, 0x0663, 0x0663, 0x0684, 0x069c, + 0x069c, 0x069c, 0x06b7, 0x06cf, 0x06f3, 0x06f3, 0x06f3, 0x06f3, + 0x070b, 0x073e, 0x073e, 0x075f, 0x077d, 0x077d, 0x0798, 0x07c8, + 0x07e6, 0x07e6, 0x07fe, 0x0810, 0x0825, 0x083d, 0x083d, 0x083d, + 0x0858, 0x0858, 0x0864, 0x08a3, 0x08e8, 0x08e8, 0x08e8, 0x08e8, + 0x08e8, 0x08e8, 0x08e8, 0x0903, 0x0903, 0x0921, 0x0921, 0x0939, + // Entry 80 - BF + 0x0951, 0x0975, 0x0993, 0x09b4, 0x09b4, 0x09de, 0x0a02, 0x0a02, + 0x0a1d, 0x0a1d, 0x0a38, 0x0a38, 0x0a38, 0x0a53, 0x0a74, 0x0aa7, + 0x0aa7, 0x0aa7, 0x0ac2, 0x0aef, 0x0b16, 0x0b16, 0x0b16, 0x0b3a, + 0x0b58, 0x0b79, 0x0b8e, 0x0bac, 0x0bc1, 0x0bd3, 0x0bf1, 0x0c0f, + 0x0c0f, 0x0c2a, 0x0c45, 0x0c45, 0x0c57, 0x0c57, 0x0c6f, 0x0ca2, + 0x0cba, 0x0cd5, 0x0cd5, 0x0cf9, 0x0cf9, 0x0cf9, 0x0d11, 0x0d23, + 0x0d23, 0x0d3e, 0x0d3e, 0x0d56, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, + 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, + // Entry C0 - FF + 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, + 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, + 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, + 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, + 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, + 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, + 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, + 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, + // Entry 100 - 13F + 0x0d6b, 0x0d6b, 0x0d6b, 0x0d6b, 0x0d83, 0x0d83, 0x0d83, 0x0d83, + 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, + 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, + 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0d83, 0x0daa, + 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, + 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, + 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, 0x0daa, + 0x0daa, 0x0daa, 0x0dda, 0x0dda, 0x0dda, 0x0dda, 0x0dda, 0x0dda, + // Entry 140 - 17F + 0x0dda, 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, + 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, + 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0df8, 0x0e0d, + 0x0e0d, 0x0e0d, 0x0e0d, 0x0e0d, 0x0e0d, 0x0e0d, 0x0e0d, 0x0e0d, + 0x0e0d, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, + 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, + 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, + 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, + // Entry 180 - 1BF + 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, + 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, + 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, + 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, 0x0e22, + 0x0e22, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, + 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, + 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, + 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, + // Entry 1C0 - 1FF + 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, + 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, + 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, + 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, + 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, + 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, + 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e37, + 0x0e37, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, + // Entry 200 - 23F + 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, + 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, + 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, + 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, + 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e46, + 0x0e46, 0x0e46, 0x0e46, 0x0e46, 0x0e67, 0x0e67, 0x0e67, 0x0e67, + 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, + 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, + // Entry 240 - 27F + 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, 0x0e67, + 0x0e67, 0x0e67, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ee2, 0x0f33, + 0x0f7e, 0x0fbd, 0x0ff0, 0x1020, 0x1086, 0x10cb, 0x10cb, 0x10cb, + 0x1101, 0x1128, 0x1128, 0x1149, 0x1194, 0x11df, 0x11df, 0x11df, + 0x120f, 0x1248, + }, + }, + { // ebu + "KĩakanKĩamhariKĩarabuKĩmbelarusiKĩbulgariaKĩbanglaKĩchekiKĩnjeremaniKĩng" + + "rikiKĩthunguKĩhispaniaKĩanjemiKĩfaransaKĩhausaKĩhindĩKĩhungariKĩindo" + + "nesiaKĩigboKĩitalianoKĩnjapaniKĩjavaKĩkambodiaKĩkoreaKĩmalesiaKĩburm" + + "aKĩnepaliKĩholanziKĩpunjabiKĩpolandiKĩrenoKĩromaniaKĩrusiKĩnyarwanda" + + "KĩsomaliKĩswidiKĩtamilKĩtailandiKĩturukiKĩukraniaKĩurduKĩvietinamuKĩ" + + "yorubaKĩchinaKĩzuluKĩembu", + []uint16{ // 277 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0010, 0x0010, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0024, 0x002f, + 0x002f, 0x002f, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, + 0x0038, 0x0038, 0x0038, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x004c, 0x004c, 0x004c, 0x004c, 0x0055, 0x005e, 0x005e, 0x0069, + 0x0069, 0x0069, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x007c, + 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x0084, + 0x0084, 0x008d, 0x008d, 0x008d, 0x008d, 0x0097, 0x0097, 0x0097, + // Entry 40 - 7F + 0x0097, 0x00a3, 0x00a3, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, + 0x00b5, 0x00b5, 0x00bf, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, + 0x00c6, 0x00c6, 0x00d1, 0x00d1, 0x00d9, 0x00d9, 0x00d9, 0x00d9, + 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, + 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, + 0x00d9, 0x00d9, 0x00d9, 0x00e3, 0x00e3, 0x00eb, 0x00eb, 0x00eb, + 0x00f4, 0x00f4, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x00fe, + 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x0108, 0x0108, 0x0112, + // Entry 80 - BF + 0x0112, 0x0119, 0x0119, 0x0119, 0x0119, 0x0123, 0x012a, 0x0136, + 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, + 0x0136, 0x0136, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, + 0x0147, 0x0147, 0x014f, 0x014f, 0x014f, 0x015a, 0x015a, 0x015a, + 0x015a, 0x015a, 0x0163, 0x0163, 0x0163, 0x0163, 0x0163, 0x016d, + 0x0174, 0x0174, 0x0174, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0189, 0x0189, 0x0191, 0x0198, 0x0198, 0x0198, 0x0198, + 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, + // Entry C0 - FF + 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, + 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, + 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, + 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, + 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, + 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, + 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, + 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, + // Entry 100 - 13F + 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, + 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, + 0x0198, 0x0198, 0x0198, 0x0198, 0x019f, + }, + }, + { // ee + "abkhaziagbeafrikaangbeblugbeamhariagbeArabiagbeassamegbeaymargbeazerbaij" + + "angbebelarusiagbebulgariagbebambaragbeBengaligbetibetagbebretongbebo" + + "sniagbekatalagbetsɛkgbewalesgbedenmarkgbeGermaniagbedivehgbedzongkha" + + "gbeEʋegbegrisigbeYevugbeesperantogbeSpanishgbeestoniagbebasqugbepers" + + "iagbefinlanɖgbefidzigbeFransegbeirelanɖgbegalatagbeguarangbegujarati" + + "hausagbehebrigbeHindigbekroatiagbehaitigbehungarigbearmeniagbeIndone" + + "siagbeigbogbeicelanɖgbeItaliagbeJapangbedzavangbegɔgiagbekazakhstang" + + "bekhmergbekannadagbeKoreagbekashmirgbekurdiagbekirghistangbelatinlak" + + "sembɔggbelingalalaogbelithuaniagbelatviagbemalagasegbemaorgbemakedon" + + "iagbemalayagbemongoliagbemarathiagbemalaygbemaltagbeburmagbedziehe n" + + "debelegbenepalgbeHollandgbenɔweigbe ninɔsknɔweigbe bokmålnyanjagbeor" + + "iyagbeossetiagbepundzabgbePolishgbepashtogbePortuguesegbekwetsuagber" + + "omanshgberundigberomaniagbeRussiagberuwandagbesanskrigbesindhgbedzie" + + "he samigbesangogbesinhalgbeslovakiagbesloveniagbesamoagbeshonagbesom" + + "aliagbealbaniagbeserbiagbeswatgbeanyiehe sothogbeswedengbeswahilitam" + + "ilgbetelegugbetadzikistangbeThailandgbetigrinyagbetɛkmengbetswanagbe" + + "tongagbeTurkishgbetsongagbetahitigbeuighurgbeukraingbeurdugbeuzbekis" + + "tangbevendagbevietnamgbewolofgbexhosagbeyorubagbeChinagbezulugbeaghe" + + "mgbeasagbebembagbebenagbebodogbeembugbeefigbefilipingbeswizerlanɖtɔw" + + "o ƒe germaniagbehawaigbecape verdegbelahndagbeluyiagbegbegbɔgblɔ sɔg" + + "bɔwodziehe sothogberombogberwagbesakagbekomorogbetetumgbetok pisigbe" + + "gbegbɔgblɔ manyawalsegbecantongbegbegbɔgblɔ manɔmeeGermaniagbe (Aust" + + "ria)Germaniagbe (Switzerland)Yevugbe (Australia)Yevugbe (Canada)Yevu" + + "gbe (Britain)Yevugbe (America)Spanishgbe (Latin America)Spanishgbe (" + + "Europe)Spanishgbe (Mexico)Fransegbe (Canada)Fransegbe (Switzerland)F" + + "lemishgbePortuguesegbe (Brazil)Portuguesegbe (Europe)serbo-croatiagb" + + "etsainagbeblema tsainagbe", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x000b, 0x000b, 0x0016, 0x001c, 0x0026, 0x0026, + 0x002f, 0x0038, 0x0038, 0x0040, 0x004d, 0x004d, 0x0059, 0x0064, + 0x0064, 0x006e, 0x0078, 0x0081, 0x008a, 0x0093, 0x009c, 0x009c, + 0x009c, 0x009c, 0x009c, 0x00a4, 0x00a4, 0x00a4, 0x00ac, 0x00b6, + 0x00c1, 0x00c9, 0x00d4, 0x00db, 0x00e3, 0x00ea, 0x00f6, 0x0100, + 0x010a, 0x0112, 0x011b, 0x011b, 0x0126, 0x012e, 0x012e, 0x0137, + 0x0137, 0x0142, 0x0142, 0x014b, 0x0154, 0x015c, 0x015c, 0x0164, + 0x016c, 0x0174, 0x0174, 0x017e, 0x0186, 0x0190, 0x019a, 0x019a, + // Entry 40 - 7F + 0x019a, 0x01a6, 0x01a6, 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01b8, + 0x01c1, 0x01c1, 0x01c9, 0x01d2, 0x01db, 0x01db, 0x01db, 0x01db, + 0x01e8, 0x01e8, 0x01f0, 0x01fa, 0x0202, 0x0202, 0x020c, 0x0215, + 0x0215, 0x0215, 0x0222, 0x0227, 0x0234, 0x0234, 0x0234, 0x023b, + 0x0241, 0x024d, 0x024d, 0x0256, 0x0261, 0x0261, 0x0268, 0x0274, + 0x027d, 0x0288, 0x0293, 0x029b, 0x02a3, 0x02ab, 0x02ab, 0x02bc, + 0x02c4, 0x02c4, 0x02ce, 0x02df, 0x02f0, 0x02f0, 0x02f0, 0x02f9, + 0x02f9, 0x02f9, 0x02f9, 0x0301, 0x030b, 0x0315, 0x0315, 0x031e, + // Entry 80 - BF + 0x0327, 0x0334, 0x033e, 0x0348, 0x0350, 0x035a, 0x0363, 0x036d, + 0x0377, 0x0377, 0x037f, 0x038d, 0x0395, 0x039e, 0x03a9, 0x03b4, + 0x03bc, 0x03c4, 0x03ce, 0x03d8, 0x03e1, 0x03e8, 0x03f8, 0x03f8, + 0x0401, 0x0408, 0x0410, 0x0419, 0x0427, 0x0432, 0x043d, 0x0447, + 0x0450, 0x0458, 0x0462, 0x046b, 0x046b, 0x0474, 0x047d, 0x0486, + 0x048d, 0x049a, 0x04a2, 0x04ac, 0x04ac, 0x04ac, 0x04b4, 0x04bc, + 0x04bc, 0x04c5, 0x04c5, 0x04cd, 0x04d4, 0x04d4, 0x04d4, 0x04d4, + 0x04d4, 0x04d4, 0x04d4, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, + // Entry C0 - FF + 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, + 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04e2, 0x04e2, 0x04e2, 0x04e2, + 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, 0x04e2, + 0x04e2, 0x04ea, 0x04ea, 0x04f1, 0x04f1, 0x04f1, 0x04f1, 0x04f1, + 0x04f1, 0x04f1, 0x04f1, 0x04f1, 0x04f1, 0x04f1, 0x04f1, 0x04f1, + 0x04f1, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, + 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, + 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, + // Entry 100 - 13F + 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, + 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, + 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04ff, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x050f, + 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, + 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, + 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, 0x050f, + 0x050f, 0x050f, 0x052f, 0x052f, 0x052f, 0x052f, 0x052f, 0x052f, + // Entry 140 - 17F + 0x052f, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, + 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, + 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, + 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0537, 0x0544, + 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, + 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, + 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, 0x0544, + 0x0544, 0x0544, 0x0544, 0x054d, 0x054d, 0x054d, 0x054d, 0x054d, + // Entry 180 - 1BF + 0x054d, 0x054d, 0x054d, 0x054d, 0x054d, 0x054d, 0x054d, 0x054d, + 0x054d, 0x054d, 0x054d, 0x054d, 0x0555, 0x0555, 0x0555, 0x0555, + 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, + 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, + 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, 0x0555, 0x056b, + 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, + 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, + 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x057a, 0x057a, 0x057a, + // Entry 1C0 - 1FF + 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, + 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, + 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, + 0x057a, 0x057a, 0x057a, 0x057a, 0x057a, 0x0582, 0x0582, 0x0582, + 0x0582, 0x0582, 0x0582, 0x0588, 0x0588, 0x058f, 0x058f, 0x058f, + 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, + 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, + 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, + // Entry 200 - 23F + 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, 0x058f, + 0x058f, 0x058f, 0x058f, 0x0598, 0x0598, 0x0598, 0x0598, 0x0598, + 0x0598, 0x0598, 0x0598, 0x0598, 0x05a0, 0x05a0, 0x05a0, 0x05a0, + 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05ab, 0x05ab, + 0x05ab, 0x05ab, 0x05ab, 0x05ab, 0x05ab, 0x05ab, 0x05ab, 0x05ab, + 0x05ab, 0x05ab, 0x05ab, 0x05ab, 0x05bd, 0x05bd, 0x05bd, 0x05bd, + 0x05bd, 0x05bd, 0x05bd, 0x05bd, 0x05bd, 0x05c5, 0x05c5, 0x05c5, + 0x05c5, 0x05c5, 0x05c5, 0x05c5, 0x05c5, 0x05c5, 0x05c5, 0x05c5, + // Entry 240 - 27F + 0x05c5, 0x05c5, 0x05c5, 0x05ce, 0x05ce, 0x05ce, 0x05ce, 0x05ce, + 0x05ce, 0x05ce, 0x05e3, 0x05e3, 0x05e3, 0x05e3, 0x05f8, 0x0611, + 0x0624, 0x0634, 0x0645, 0x0656, 0x0670, 0x0683, 0x0696, 0x0696, + 0x06a8, 0x06bf, 0x06bf, 0x06c9, 0x06df, 0x06f5, 0x06f5, 0x0705, + 0x070e, 0x071d, + }, + }, + { // el + elLangStr, + elLangIdx, + }, + { // en + enLangStr, + enLangIdx, + }, + { // en-AU + "BamumUnited States EnglishMoldovan", + []uint16{ // 607 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 80 - BF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry C0 - FF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + // Entry 100 - 13F + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + // Entry 140 - 17F + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + // Entry 180 - 1BF + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + // Entry 1C0 - 1FF + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + // Entry 200 - 23F + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + // Entry 240 - 27F + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, + 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, 0x0022, + }, + }, + { // en-GB + enGBLangStr, + enGBLangIdx, + }, + { // eo + "afaraabĥazaafrikansatwamharaarabaasamaajmaraazerbajĝanabaŝkirabelorusabu" + + "lgarabislamobengalatibetabretonabosniakatalunakorsikaĉeĥakimradanage" + + "rmanamahladzonkogrekaanglaesperantohispanaestonaeŭskapersafinnafiĝia" + + "feroafrancafrisairlandagaelagalegagvaraniaguĝaratahaŭsahebreahindakr" + + "oatahaitia kreolahungaraarmenainterlingvaoindoneziaokcidentaloeskima" + + "islandaitalainuitajapanajavakartvelakazaĥagronlandakmerakanarakoreak" + + "aŝmirakurdakirgizalatinoluksemburgalingalalaŭalitovalatvamalagasamao" + + "riamakedonamalajalamamongolamaratamalajamaltabirmanauranepalanederla" + + "ndanovnorvegadannorvegaokcitanaoromaorijopanĝabapolapaŝtoaportugalak" + + "eĉuaromanĉaburundarumanarusaruandasanskritosindasangoasinhalaslovaka" + + "slovenasamoaŝonasomalaalbanaserbasvaziasotasundasvedasvahilatamilate" + + "luguataĝikatajatigrajaturkmenacvanatongaaturkacongatataraujguraukrai" + + "naurduouzbekavjetnamavolapukovolofaksosajidajorubaĝuangaĉinazuluaibi" + + "bioefikafilipinahavajaklingonanekonata lingvonelingvaĵobrazilportuga" + + "laeŭropportugalaserbo-Kroataĉina simpligitaĉina tradicia", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0005, 0x000c, 0x000c, 0x0015, 0x0017, 0x001d, 0x001d, + 0x0022, 0x0027, 0x0027, 0x002d, 0x0039, 0x0041, 0x0049, 0x0050, + 0x0057, 0x0057, 0x005e, 0x0064, 0x006b, 0x0071, 0x0079, 0x0079, + 0x0079, 0x0080, 0x0080, 0x0086, 0x0086, 0x0086, 0x008b, 0x008f, + 0x0096, 0x009b, 0x00a1, 0x00a1, 0x00a6, 0x00ab, 0x00b4, 0x00bb, + 0x00c1, 0x00c7, 0x00cc, 0x00cc, 0x00d1, 0x00d7, 0x00dc, 0x00e2, + 0x00e7, 0x00ee, 0x00f3, 0x00f9, 0x0101, 0x010a, 0x010a, 0x0110, + 0x0116, 0x011b, 0x011b, 0x0121, 0x012e, 0x0135, 0x013b, 0x013b, + // Entry 40 - 7F + 0x0147, 0x0150, 0x015b, 0x015b, 0x015b, 0x0161, 0x0161, 0x0168, + 0x016d, 0x0173, 0x0179, 0x017d, 0x0185, 0x0185, 0x0185, 0x0185, + 0x018c, 0x0195, 0x019a, 0x01a0, 0x01a5, 0x01a5, 0x01ad, 0x01b2, + 0x01b2, 0x01b2, 0x01b9, 0x01bf, 0x01ca, 0x01ca, 0x01ca, 0x01d1, + 0x01d6, 0x01dc, 0x01dc, 0x01e1, 0x01e9, 0x01e9, 0x01ef, 0x01f7, + 0x0201, 0x0208, 0x020e, 0x0214, 0x0219, 0x021e, 0x0223, 0x0223, + 0x0229, 0x0229, 0x0233, 0x023d, 0x0247, 0x0247, 0x0247, 0x0247, + 0x024f, 0x024f, 0x0254, 0x0259, 0x0259, 0x0261, 0x0261, 0x0265, + // Entry 80 - BF + 0x026c, 0x0275, 0x027b, 0x0283, 0x028a, 0x0290, 0x0294, 0x029a, + 0x02a3, 0x02a3, 0x02a8, 0x02a8, 0x02ae, 0x02b5, 0x02bc, 0x02c3, + 0x02c8, 0x02cd, 0x02d3, 0x02d9, 0x02de, 0x02e4, 0x02e8, 0x02ed, + 0x02f2, 0x02f9, 0x02ff, 0x0306, 0x030d, 0x0311, 0x0318, 0x0320, + 0x0325, 0x032b, 0x0330, 0x0335, 0x033b, 0x033b, 0x0341, 0x0348, + 0x034d, 0x0353, 0x0353, 0x035b, 0x0363, 0x0363, 0x0369, 0x036e, + 0x0372, 0x0378, 0x037f, 0x0384, 0x0389, 0x0389, 0x0389, 0x0389, + 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, + // Entry C0 - FF + 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, + 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, + 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, + 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, + 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, + 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, + 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, + 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, + // Entry 100 - 13F + 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, + 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, + 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0394, 0x0394, 0x0394, + 0x0394, 0x0394, 0x0394, 0x0394, 0x0394, 0x0394, 0x0394, 0x039c, + 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, + 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, + 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, + 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, + // Entry 140 - 17F + 0x039c, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + // Entry 180 - 1BF + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + // Entry 1C0 - 1FF + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + // Entry 200 - 23F + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, 0x03a2, + 0x03a2, 0x03aa, 0x03aa, 0x03aa, 0x03aa, 0x03aa, 0x03aa, 0x03aa, + 0x03aa, 0x03aa, 0x03aa, 0x03aa, 0x03aa, 0x03aa, 0x03aa, 0x03aa, + 0x03aa, 0x03aa, 0x03aa, 0x03aa, 0x03b9, 0x03b9, 0x03b9, 0x03b9, + 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, + 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, + // Entry 240 - 27F + 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, 0x03b9, + 0x03b9, 0x03b9, 0x03c4, 0x03c4, 0x03c4, 0x03c4, 0x03c4, 0x03c4, + 0x03c4, 0x03c4, 0x03c4, 0x03c4, 0x03c4, 0x03c4, 0x03c4, 0x03c4, + 0x03c4, 0x03c4, 0x03c4, 0x03c4, 0x03d3, 0x03e2, 0x03e2, 0x03ee, + 0x03fe, 0x040c, + }, + }, + { // es + esLangStr, + esLangIdx, + }, + { // es-419 + es419LangStr, + es419LangIdx, + }, + {}, // es-CL + { // es-MX + "bashkir", + []uint16{ // 14 elements + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, + }, + }, + { // et + etLangStr, + etLangIdx, + }, + { // eu + "abkhazeraafrikaansaakaneraamhareraarabieraassameraaimaraazerbaijanerabas" + + "hkirrerabielorrusierabulgarierabambarerabengaleratibeterabretoierabo" + + "snierakatalanakorsikeratxekieragaleseradanieraalemanadivehieradzongk" + + "haeweeragrezieraingelesaesperantoaespainieraestonieraeuskarapersiera" + + "finlandierafijierafaroerafrantsesafrisieragaelikoaeskoziako gaelikoa" + + "galizieraguaranieragujarateramanxerahausahebreerahindiakroazierahait" + + "ierahungarieraarmenieraInterlinguaindonesierainterlingueigboerasichu" + + "an yiaislandieraitalierainuiterajaponierajaverageorgieraKikongoakiku" + + "yuerakazakherakalaallisuterakhemererakannaderakoreerakashmirerakurdu" + + "erakornubierakirgizeralatinaluxenburgeraganderalingalalaoseralituani" + + "eraluba-katangeraletonieramalagasyeramaorieramazedonieramalayalamera" + + "mongolieramaratheramalaysieramalteraburmatarraiparraldeko ndebeleera" + + "nepaleranederlanderanynorsk norvegierabokmala (Norvegia)nyanjaOkzita" + + "nieraoromoeraoriyeraosetierapunjaberapolonierapaxtueraportugesaquech" + + "ueraerromantxerarundieraerrumanieraerrusierakinyaruandasanskritoasin" + + "dhiaiparraldeko samierasangoerasinhalaeslovakieraeslovenierasamoeras" + + "honerasomalieraalbanieraserbieraswatierahegoaldeko sothoerasundanera" + + "suedieraswahilitamileratelugueratajikistanerathailandieratigriñeratu" + + "rkmenieratswaneratongeraturkieratsongeratatareratahitierauigurrerauk" + + "raineraurduauzbekeravenderavietnamerawoloferaxhoseraJiddishayorubera" + + "txinerazulueraAcholieraaghemeramaputxeaasuabemberabenerabodoerachige" + + "ratxerokierasoranierataiterazarmerabehe-sorabieradualerafonyi jolera" + + "embuaefikeratagalogaGagagauzeraalemana (Suitza)gusiierahawaiieragoi-" + + "sorabierangombamachamerakabilerakamberamakonderaCabo Verdeko kreolak" + + "oyra chiinierakalenjinerakomi-permyakerakonkanierashambalerabafieral" + + "angieralakoteraLozieraLuba-lulualuoeraluhyeramasaieramerueraMauritan" + + "iako kreoleramakhuwa-meettoerameteramohawkeramudangerahizkuntza anit" + + "zaknamerakwasieran’koerapedieranuereraankolerak’iche’raromboerarwaer" + + "asamburuerasanguerasenerakoyraboro senniatachelhitahegoaldeko samier" + + "aLule samieraInari samieraSkolt samieraKongoko swahiliatesoeratetuma" + + "Klingoneratok pisinaTumbukeratasawaqaMaroko erdialdeko tamazightahiz" + + "kuntza ezezagunavaieravunjoasogeratamazight estandarraez dago eduki " + + "linguistikorikarabiera moderno estandarraaleman garaia (Suitza)ingel" + + "esa (AEB)espainiera (Europa)flandrieraportugesa (Europa)serbokroazie" + + "ratxinera soilduatxinera tradizionala", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0009, 0x0009, 0x0013, 0x001a, 0x0022, 0x0022, + 0x002a, 0x0032, 0x0032, 0x0038, 0x0045, 0x0050, 0x005d, 0x0067, + 0x0067, 0x0070, 0x0079, 0x0081, 0x008a, 0x0092, 0x009a, 0x009a, + 0x009a, 0x00a3, 0x00a3, 0x00ab, 0x00ab, 0x00ab, 0x00b3, 0x00ba, + 0x00c1, 0x00ca, 0x00d2, 0x00d8, 0x00e0, 0x00e8, 0x00f2, 0x00fc, + 0x0105, 0x010c, 0x0114, 0x0114, 0x011f, 0x0126, 0x012d, 0x0136, + 0x013e, 0x0146, 0x0158, 0x0161, 0x016b, 0x0175, 0x017c, 0x0181, + 0x0189, 0x018f, 0x018f, 0x0198, 0x01a0, 0x01aa, 0x01b3, 0x01b3, + // Entry 40 - 7F + 0x01be, 0x01c9, 0x01d4, 0x01db, 0x01e6, 0x01e6, 0x01e6, 0x01f0, + 0x01f8, 0x0200, 0x0209, 0x020f, 0x0218, 0x0220, 0x0229, 0x0229, + 0x0232, 0x0240, 0x0249, 0x0252, 0x0259, 0x0259, 0x0263, 0x026b, + 0x026b, 0x0275, 0x027e, 0x0284, 0x0290, 0x0297, 0x0297, 0x029e, + 0x02a5, 0x02af, 0x02bd, 0x02c6, 0x02d1, 0x02d1, 0x02d9, 0x02e4, + 0x02f0, 0x02fa, 0x0303, 0x030d, 0x0314, 0x031e, 0x031e, 0x0334, + 0x033c, 0x033c, 0x0348, 0x035a, 0x036c, 0x036c, 0x036c, 0x0372, + 0x037d, 0x037d, 0x0385, 0x038c, 0x0394, 0x039d, 0x039d, 0x03a6, + // Entry 80 - BF + 0x03ae, 0x03b7, 0x03c0, 0x03cc, 0x03d4, 0x03df, 0x03e8, 0x03f3, + 0x03fd, 0x03fd, 0x0404, 0x0417, 0x041f, 0x0426, 0x0431, 0x043c, + 0x0443, 0x044a, 0x0453, 0x045c, 0x0464, 0x046c, 0x047f, 0x0488, + 0x0490, 0x0497, 0x049f, 0x04a8, 0x04b5, 0x04c1, 0x04cb, 0x04d6, + 0x04de, 0x04e5, 0x04ed, 0x04f5, 0x04fd, 0x0506, 0x050f, 0x0518, + 0x051d, 0x0525, 0x052c, 0x0536, 0x0536, 0x0536, 0x053e, 0x0545, + 0x054d, 0x0555, 0x0555, 0x055c, 0x0563, 0x0563, 0x056c, 0x056c, + 0x056c, 0x056c, 0x056c, 0x0574, 0x0574, 0x0574, 0x0574, 0x0574, + // Entry C0 - FF + 0x0574, 0x0574, 0x0574, 0x0574, 0x0574, 0x057c, 0x057c, 0x057c, + 0x057c, 0x057c, 0x057c, 0x057c, 0x0580, 0x0580, 0x0580, 0x0580, + 0x0580, 0x0580, 0x0580, 0x0580, 0x0580, 0x0580, 0x0580, 0x0580, + 0x0580, 0x0587, 0x0587, 0x058d, 0x058d, 0x058d, 0x058d, 0x058d, + 0x058d, 0x058d, 0x058d, 0x058d, 0x058d, 0x058d, 0x058d, 0x058d, + 0x058d, 0x0594, 0x0594, 0x0594, 0x0594, 0x0594, 0x0594, 0x0594, + 0x0594, 0x0594, 0x0594, 0x0594, 0x0594, 0x059b, 0x059b, 0x059b, + 0x059b, 0x059b, 0x059b, 0x059b, 0x059b, 0x05a5, 0x05a5, 0x05ae, + // Entry 100 - 13F + 0x05ae, 0x05ae, 0x05ae, 0x05ae, 0x05ae, 0x05ae, 0x05b5, 0x05b5, + 0x05b5, 0x05b5, 0x05b5, 0x05bc, 0x05bc, 0x05ca, 0x05ca, 0x05d1, + 0x05d1, 0x05dd, 0x05dd, 0x05dd, 0x05e2, 0x05e9, 0x05e9, 0x05e9, + 0x05e9, 0x05e9, 0x05e9, 0x05e9, 0x05e9, 0x05e9, 0x05e9, 0x05f1, + 0x05f1, 0x05f1, 0x05f1, 0x05f1, 0x05f1, 0x05f1, 0x05f1, 0x05f1, + 0x05f1, 0x05f3, 0x05fc, 0x05fc, 0x05fc, 0x05fc, 0x05fc, 0x05fc, + 0x05fc, 0x05fc, 0x05fc, 0x05fc, 0x05fc, 0x05fc, 0x05fc, 0x05fc, + 0x05fc, 0x05fc, 0x060c, 0x060c, 0x060c, 0x0614, 0x0614, 0x0614, + // Entry 140 - 17F + 0x0614, 0x061d, 0x061d, 0x061d, 0x061d, 0x061d, 0x062a, 0x062a, + 0x062a, 0x062a, 0x062a, 0x062a, 0x062a, 0x062a, 0x062a, 0x062a, + 0x0630, 0x0639, 0x0639, 0x0639, 0x0639, 0x0639, 0x0641, 0x0641, + 0x0641, 0x0648, 0x0648, 0x0648, 0x0648, 0x0648, 0x0651, 0x0664, + 0x0664, 0x0664, 0x0664, 0x0664, 0x0664, 0x0673, 0x0673, 0x0673, + 0x0673, 0x067e, 0x067e, 0x068d, 0x0697, 0x0697, 0x0697, 0x0697, + 0x0697, 0x0697, 0x0697, 0x0697, 0x06a1, 0x06a8, 0x06a8, 0x06a8, + 0x06a8, 0x06a8, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, 0x06b0, + // Entry 180 - 1BF + 0x06b0, 0x06b8, 0x06b8, 0x06b8, 0x06bf, 0x06bf, 0x06bf, 0x06c9, + 0x06c9, 0x06c9, 0x06cf, 0x06cf, 0x06d6, 0x06d6, 0x06d6, 0x06d6, + 0x06d6, 0x06d6, 0x06d6, 0x06d6, 0x06d6, 0x06de, 0x06de, 0x06de, + 0x06de, 0x06de, 0x06e5, 0x06fa, 0x06fa, 0x070b, 0x0711, 0x0711, + 0x0711, 0x0711, 0x0711, 0x071a, 0x071a, 0x071a, 0x0723, 0x0734, + 0x0734, 0x0734, 0x0734, 0x0734, 0x0734, 0x0734, 0x0734, 0x0734, + 0x0734, 0x073a, 0x073a, 0x073a, 0x073a, 0x073a, 0x073a, 0x0742, + 0x0742, 0x0742, 0x0742, 0x0742, 0x074b, 0x0752, 0x0759, 0x0759, + // Entry 1C0 - 1FF + 0x0759, 0x0761, 0x0761, 0x0761, 0x0761, 0x0761, 0x0761, 0x0761, + 0x0761, 0x0761, 0x0761, 0x0761, 0x0761, 0x0761, 0x0761, 0x0761, + 0x0761, 0x0761, 0x0761, 0x0761, 0x0761, 0x0761, 0x076e, 0x076e, + 0x076e, 0x076e, 0x076e, 0x076e, 0x076e, 0x0776, 0x0776, 0x0776, + 0x0776, 0x0776, 0x0776, 0x077c, 0x077c, 0x077c, 0x077c, 0x0786, + 0x0786, 0x0786, 0x0786, 0x0786, 0x078e, 0x078e, 0x078e, 0x078e, + 0x078e, 0x078e, 0x0794, 0x0794, 0x0794, 0x07a4, 0x07a4, 0x07a4, + 0x07ae, 0x07ae, 0x07ae, 0x07ae, 0x07ae, 0x07ae, 0x07c0, 0x07cc, + // Entry 200 - 23F + 0x07d9, 0x07e6, 0x07e6, 0x07e6, 0x07e6, 0x07e6, 0x07e6, 0x07e6, + 0x07e6, 0x07e6, 0x07e6, 0x07e6, 0x07f6, 0x07f6, 0x07f6, 0x07f6, + 0x07f6, 0x07f6, 0x07fd, 0x07fd, 0x0803, 0x0803, 0x0803, 0x0803, + 0x0803, 0x080d, 0x080d, 0x080d, 0x080d, 0x080d, 0x0817, 0x0817, + 0x0817, 0x0817, 0x0817, 0x0817, 0x0820, 0x0820, 0x0828, 0x0828, + 0x0844, 0x0844, 0x0844, 0x0844, 0x0857, 0x085d, 0x085d, 0x085d, + 0x085d, 0x085d, 0x085d, 0x085d, 0x0863, 0x0863, 0x0863, 0x0863, + 0x0863, 0x0863, 0x0863, 0x0863, 0x0863, 0x0869, 0x0869, 0x0869, + // Entry 240 - 27F + 0x0869, 0x0869, 0x0869, 0x0869, 0x0869, 0x0869, 0x0869, 0x0869, + 0x087d, 0x087d, 0x0899, 0x0899, 0x08b4, 0x08b4, 0x08b4, 0x08ca, + 0x08ca, 0x08ca, 0x08ca, 0x08d8, 0x08d8, 0x08eb, 0x08eb, 0x08eb, + 0x08eb, 0x08eb, 0x08eb, 0x08f5, 0x08f5, 0x0907, 0x0907, 0x0915, + 0x0924, 0x0938, + }, + }, + { // ewo + "Ǹkɔ́bɔ akánǸkɔ́bɔ amáriaǸkɔ́bɔ arábiaǸkɔ́bɔ belarúsianǸkɔ́bɔ buləgárianǸ" + + "kɔ́bɔ bɛngalíǸkɔ́bɔ tsɛ́gǸkɔ́bɔ ndzámanǸkɔ́bɔ gəlɛ́gǸkɔ́bɔ éngəlísǹk" + + "ɔ́bɔ kpənyáǹkɔ́bɔ fɛ́rəsianǸkɔ́bɔ fulɛnsíǸkɔ́bɔ aúsáǸkɔ́bɔ hindíǸkɔ" + + "́bɔ ungáríanǸkɔ́bɔ ɛndonésianǸkɔ́bɔ ibóǸkɔ́bɔ etáliɛnǸkɔ́bɔ hapɔ́nǸ" + + "kɔ́bɔ havanísǸkɔ́bɔ kəmɛ́rǸkɔ́bɔ koréanǸkɔ́bɔ malɛ́sianǸkɔ́bɔ birəmá" + + "nǹkɔ́bɔ nefálianǸkɔ́bɔ nɛrəlándíaǹkɔ́bɔ funəhábiaǹkɔ́bɔ fólisǹkɔ́bɔ " + + "fɔtugɛ́sńkɔ́bɔ románíaǹkɔ́bɔ rúsianǹkɔ́bɔ ruwandáǹkɔ́bɔ somáliaǹkɔ́b" + + "ɔ suwɛ́dǹkɔ́bɔ tamílǹkɔ́bɔ táilanǹkɔ́bɔ túrəkiǹkɔ́bɔ ukeléniaǹkɔ́bɔ" + + " urudúǹkɔ́bɔ hiɛdənámǹkɔ́bɔ yorúbaǸkɔ́bɔ tsainísǹkɔ́bɔ zulúewondo", + []uint16{ // 285 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0022, 0x0022, + 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x004a, 0x0061, + 0x0061, 0x0061, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, + 0x0075, 0x0075, 0x0075, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, + 0x009a, 0x009a, 0x009a, 0x009a, 0x00ae, 0x00c3, 0x00c3, 0x00d6, + 0x00d6, 0x00d6, 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x0101, + 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0112, + 0x0112, 0x0123, 0x0123, 0x0123, 0x0123, 0x0138, 0x0138, 0x0138, + // Entry 40 - 7F + 0x0138, 0x014f, 0x014f, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, + 0x0172, 0x0172, 0x0185, 0x0198, 0x0198, 0x0198, 0x0198, 0x0198, + 0x0198, 0x0198, 0x01ac, 0x01ac, 0x01be, 0x01be, 0x01be, 0x01be, + 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, + 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, 0x01be, + 0x01be, 0x01be, 0x01be, 0x01d4, 0x01d4, 0x01e8, 0x01e8, 0x01e8, + 0x01fc, 0x01fc, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, + 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x022b, 0x022b, 0x023c, + // Entry 80 - BF + 0x023c, 0x0252, 0x0252, 0x0252, 0x0252, 0x0266, 0x0278, 0x028b, + 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, + 0x028b, 0x028b, 0x029e, 0x029e, 0x029e, 0x029e, 0x029e, 0x029e, + 0x02b1, 0x02b1, 0x02c2, 0x02c2, 0x02c2, 0x02d4, 0x02d4, 0x02d4, + 0x02d4, 0x02d4, 0x02e7, 0x02e7, 0x02e7, 0x02e7, 0x02e7, 0x02fb, + 0x030c, 0x030c, 0x030c, 0x0322, 0x0322, 0x0322, 0x0322, 0x0322, + 0x0322, 0x0334, 0x0334, 0x0347, 0x0357, 0x0357, 0x0357, 0x0357, + 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, + // Entry C0 - FF + 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, + 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, + 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, + 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, + 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, + 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, + 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, + 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, + // Entry 100 - 13F + 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, + 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, + 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, 0x0357, + 0x0357, 0x0357, 0x0357, 0x0357, 0x035d, + }, + }, + { // fa + faLangStr, + faLangIdx, + }, + { // fa-AF + "هسپانویفنلندیآیرلندیکروشیاییاندونیزیاییآیسلندیایتالویجاپانیکوریاییقرغزیم" + + "غلینیپالیهالندینارویژیپولندیپرتگالیسویدنیتاجکی", + []uint16{ // 157 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x001a, 0x001a, 0x001a, 0x001a, + 0x001a, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, + // Entry 40 - 7F + 0x0038, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x005c, + 0x006a, 0x006a, 0x0076, 0x0076, 0x0076, 0x0076, 0x0076, 0x0076, + 0x0076, 0x0076, 0x0076, 0x0076, 0x0084, 0x0084, 0x0084, 0x0084, + 0x0084, 0x0084, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, + 0x00a2, 0x00a2, 0x00ae, 0x00ae, 0x00bc, 0x00bc, 0x00bc, 0x00bc, + 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00c8, + // Entry 80 - BF + 0x00c8, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, + 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, + 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, + 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00ec, + }, + }, + { // ff + "AkaanAmarikAarabeereBelaruuseBulgariireBengaliCekkereDocceereGerkeEngele" + + "ereEspañolPerseerePulaarFarayseereHawsaŋkooreHinndiHongariireEndones" + + "iireIgibooreItaliyeereSaponeereSawaneereKemeereKoreereMalayeereBurme" + + "eseNepaaleereDacceerePunjabeerePoloneerePurtugeereRomaneereRiisRuwaa" + + "nndeereSomaliiSweedeereTamilTaayTurkeereUkereneereUrduWiyetnameereYo" + + "rrubaaSinuwaareSuluŋkoore", + []uint16{ // 181 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, 0x000b, 0x000b, + 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x001d, 0x0027, + 0x0027, 0x0027, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x003d, 0x003d, 0x003d, 0x003d, 0x0042, 0x004b, 0x004b, 0x0053, + 0x0053, 0x0053, 0x005b, 0x0061, 0x0061, 0x0061, 0x0061, 0x006b, + 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x0077, + 0x0077, 0x007d, 0x007d, 0x007d, 0x007d, 0x0087, 0x0087, 0x0087, + // Entry 40 - 7F + 0x0087, 0x0092, 0x0092, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, + 0x00a4, 0x00a4, 0x00ad, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, + 0x00b6, 0x00b6, 0x00bd, 0x00bd, 0x00c4, 0x00c4, 0x00c4, 0x00c4, + 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00c4, + 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00c4, + 0x00c4, 0x00c4, 0x00c4, 0x00cd, 0x00cd, 0x00d5, 0x00d5, 0x00d5, + 0x00df, 0x00df, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, + 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00f1, 0x00f1, 0x00fa, + // Entry 80 - BF + 0x00fa, 0x0104, 0x0104, 0x0104, 0x0104, 0x010d, 0x0111, 0x011d, + 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, + 0x011d, 0x011d, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, + 0x012d, 0x012d, 0x0132, 0x0132, 0x0132, 0x0136, 0x0136, 0x0136, + 0x0136, 0x0136, 0x013e, 0x013e, 0x013e, 0x013e, 0x013e, 0x0148, + 0x014c, 0x014c, 0x014c, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, + 0x0158, 0x0160, 0x0160, 0x0169, 0x0174, + }, + }, + { // fi + fiLangStr, + fiLangIdx, + }, + { // fil + filLangStr, + filLangIdx, + }, + { // fo + "abkhasisktafrikaansakanamharisktarabisktassamesisktaymaraaserbajdsjanskt" + + "bashkirhvitarussisktbulgarsktbambarabengalskttibetsktbretonsktbosnis" + + "ktkatalanitjetjensktkorsikansktkekkisktchuvashwalisisktdanskttýsktdi" + + "vehidzongkhaewegriksktensktesperantospansktestisktbaskisktpersisktfi" + + "nsktfijimálføroysktfransktvestur frísisktírsktskotskt gælisktgalisis" + + "ktguaranigujaratimanxhausahebraiskthindikroatiskthaitisktungarsktarm" + + "ensktinterlinguaindonesisktinterlingueigbosichuan yiíslendsktitalskt" + + "inuktitutjapansktjavansktgeorgisktkikuyukazakhkalaallisutkhmerkannad" + + "akoreansktkashmirikurdisktcornisktkyrgyzlatínluksemborgsktgandalinga" + + "lalaosktlitavisktluba-katangalettisktmalagassisktmaorimakedónsktmala" + + "yalammongolsktmarathimalaiisktmaltisktburmesisktnorður ndebelenepals" + + "kthálendsktnýnorsktnorskt bókmálnyanjaoccitanoromooriyaossetisktpunj" + + "abipólsktpashtoportugiskisktquechuaretoromansktrundirumensktrussiskt" + + "kinyarwandasanskritsindhinorður sámisktsangosingalesisktslovakisktsl" + + "ovensktsamoisktshonasomalisktalbansktserbisktswatisktsesothosundanes" + + "isktsvensktswahilitamilskttelugutajiktailendskttigrinyaturkmenskttsw" + + "anatongansktturkiskttsongatatartahitisktuyghurukrainskturduusbekiskt" + + "vendavjetnamesisktwolofxhosajiddisktyorubakinesisktsuluaghemmapuchea" + + "subembabenavestur balochibodobakossichigacherokeemiðkurdiskttaitasar" + + "malágt sorbiandualajola-fonyiembuefikfilipinisktgagauztýskt (Sveis)g" + + "usiihawaiiansktovara sorbianngombamachamekabylekambamakondegrønhøvda" + + "oyggjarsktkoyra chiinikalenjinkomi-permyakkonkanishambalabafialangil" + + "ahndalakotanorður luriluoluyiamasaimerumorisyenmakhuwa-meettometaʼmo" + + "hawkmundangmazanderaninamalágt týsktkwasionʼkonuernyankolekʼicheʼrom" + + "borwasamburusangusuður kurdisktsenakoyraboro sennitachelhitsuður sám" + + "isktlule sámisktinari samiskolt sámisktshimaorékongo svahilitesotetu" + + "mklingonskttok pisintasawaqmiðatlasfjøll tamazightókent málvaivunjow" + + "arlpirisogakantonesísktvanligt marokanskt tamazighteinki málsligt in" + + "nihaldhøgt týskt (Sveis)lágt saksisktflamsktportugiskiskt (Brasilia)" + + "portugiskiskt (Evropa)moldavisktserbokroatiskteinkult kinesisktvanli" + + "gt kinesiskt", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x000a, 0x000a, 0x0013, 0x0017, 0x0020, 0x0020, + 0x0028, 0x0033, 0x0033, 0x0039, 0x0048, 0x004f, 0x005c, 0x0065, + 0x0065, 0x006c, 0x0075, 0x007d, 0x0086, 0x008e, 0x0096, 0x00a0, + 0x00a0, 0x00ab, 0x00ab, 0x00b3, 0x00b3, 0x00ba, 0x00c3, 0x00c9, + 0x00cf, 0x00d5, 0x00dd, 0x00e0, 0x00e7, 0x00ec, 0x00f5, 0x00fc, + 0x0103, 0x010b, 0x0113, 0x0113, 0x0119, 0x0121, 0x012a, 0x0131, + 0x0141, 0x0147, 0x0157, 0x0160, 0x0167, 0x016f, 0x0173, 0x0178, + 0x0181, 0x0186, 0x0186, 0x018f, 0x0197, 0x019f, 0x01a7, 0x01a7, + // Entry 40 - 7F + 0x01b2, 0x01bd, 0x01c8, 0x01cc, 0x01d6, 0x01d6, 0x01d6, 0x01e0, + 0x01e7, 0x01f0, 0x01f8, 0x0200, 0x0209, 0x0209, 0x020f, 0x020f, + 0x0215, 0x0220, 0x0225, 0x022c, 0x0235, 0x0235, 0x023d, 0x0245, + 0x0245, 0x024d, 0x0253, 0x0259, 0x0266, 0x026b, 0x026b, 0x0272, + 0x0278, 0x0281, 0x028d, 0x0295, 0x02a1, 0x02a1, 0x02a6, 0x02b1, + 0x02ba, 0x02c3, 0x02ca, 0x02d3, 0x02db, 0x02e5, 0x02e5, 0x02f4, + 0x02fc, 0x02fc, 0x0306, 0x030f, 0x031e, 0x031e, 0x031e, 0x0324, + 0x032b, 0x032b, 0x0330, 0x0335, 0x033e, 0x0345, 0x0345, 0x034c, + // Entry 80 - BF + 0x0352, 0x035f, 0x0366, 0x0372, 0x0377, 0x037f, 0x0387, 0x0392, + 0x039a, 0x039a, 0x03a0, 0x03b0, 0x03b5, 0x03c1, 0x03cb, 0x03d4, + 0x03dc, 0x03e1, 0x03ea, 0x03f2, 0x03fa, 0x0402, 0x0409, 0x0415, + 0x041c, 0x0423, 0x042b, 0x0431, 0x0436, 0x0440, 0x0448, 0x0452, + 0x0458, 0x0461, 0x0469, 0x046f, 0x0474, 0x047d, 0x0483, 0x048c, + 0x0490, 0x0499, 0x049e, 0x04ab, 0x04ab, 0x04ab, 0x04b0, 0x04b5, + 0x04bd, 0x04c3, 0x04c3, 0x04cc, 0x04d0, 0x04d0, 0x04d0, 0x04d0, + 0x04d0, 0x04d0, 0x04d0, 0x04d5, 0x04d5, 0x04d5, 0x04d5, 0x04d5, + // Entry C0 - FF + 0x04d5, 0x04d5, 0x04d5, 0x04d5, 0x04d5, 0x04dc, 0x04dc, 0x04dc, + 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04df, 0x04df, 0x04df, 0x04df, + 0x04df, 0x04df, 0x04df, 0x04df, 0x04df, 0x04df, 0x04df, 0x04df, + 0x04df, 0x04e4, 0x04e4, 0x04e8, 0x04e8, 0x04e8, 0x04f6, 0x04f6, + 0x04f6, 0x04f6, 0x04f6, 0x04f6, 0x04f6, 0x04f6, 0x04f6, 0x04f6, + 0x04f6, 0x04fa, 0x0501, 0x0501, 0x0501, 0x0501, 0x0501, 0x0501, + 0x0501, 0x0501, 0x0501, 0x0501, 0x0501, 0x0506, 0x0506, 0x0506, + 0x0506, 0x0506, 0x0506, 0x0506, 0x0506, 0x050e, 0x050e, 0x051a, + // Entry 100 - 13F + 0x051a, 0x051a, 0x051a, 0x051a, 0x051a, 0x051a, 0x051f, 0x051f, + 0x051f, 0x051f, 0x051f, 0x0524, 0x0524, 0x0531, 0x0531, 0x0536, + 0x0536, 0x0540, 0x0540, 0x0540, 0x0544, 0x0548, 0x0548, 0x0548, + 0x0548, 0x0548, 0x0548, 0x0548, 0x0548, 0x0548, 0x0548, 0x0553, + 0x0553, 0x0553, 0x0553, 0x0553, 0x0553, 0x0553, 0x0553, 0x0553, + 0x0553, 0x0553, 0x0559, 0x0559, 0x0559, 0x0559, 0x0559, 0x0559, + 0x0559, 0x0559, 0x0559, 0x0559, 0x0559, 0x0559, 0x0559, 0x0559, + 0x0559, 0x0559, 0x0567, 0x0567, 0x0567, 0x056c, 0x056c, 0x056c, + // Entry 140 - 17F + 0x056c, 0x0577, 0x0577, 0x0577, 0x0577, 0x0577, 0x0584, 0x0584, + 0x0584, 0x0584, 0x0584, 0x0584, 0x0584, 0x0584, 0x0584, 0x0584, + 0x058a, 0x0591, 0x0591, 0x0591, 0x0591, 0x0591, 0x0597, 0x0597, + 0x0597, 0x059c, 0x059c, 0x059c, 0x059c, 0x059c, 0x05a3, 0x05b8, + 0x05b8, 0x05b8, 0x05b8, 0x05b8, 0x05b8, 0x05c4, 0x05c4, 0x05c4, + 0x05c4, 0x05cc, 0x05cc, 0x05d8, 0x05df, 0x05df, 0x05df, 0x05df, + 0x05df, 0x05df, 0x05df, 0x05df, 0x05e7, 0x05ec, 0x05ec, 0x05ec, + 0x05ec, 0x05ec, 0x05f1, 0x05f7, 0x05f7, 0x05f7, 0x05f7, 0x05f7, + // Entry 180 - 1BF + 0x05f7, 0x05fd, 0x05fd, 0x05fd, 0x05fd, 0x0609, 0x0609, 0x0609, + 0x0609, 0x0609, 0x060c, 0x060c, 0x0611, 0x0611, 0x0611, 0x0611, + 0x0611, 0x0611, 0x0611, 0x0611, 0x0611, 0x0616, 0x0616, 0x0616, + 0x0616, 0x0616, 0x061a, 0x0622, 0x0622, 0x0630, 0x0636, 0x0636, + 0x0636, 0x0636, 0x0636, 0x063c, 0x063c, 0x063c, 0x0643, 0x0643, + 0x0643, 0x0643, 0x0643, 0x0643, 0x0643, 0x0643, 0x064e, 0x064e, + 0x064e, 0x0652, 0x065e, 0x065e, 0x065e, 0x065e, 0x065e, 0x0664, + 0x0664, 0x0664, 0x0664, 0x0664, 0x0669, 0x0669, 0x066d, 0x066d, + // Entry 1C0 - 1FF + 0x066d, 0x0675, 0x0675, 0x0675, 0x0675, 0x0675, 0x0675, 0x0675, + 0x0675, 0x0675, 0x0675, 0x0675, 0x0675, 0x0675, 0x0675, 0x0675, + 0x0675, 0x0675, 0x0675, 0x0675, 0x0675, 0x0675, 0x067e, 0x067e, + 0x067e, 0x067e, 0x067e, 0x067e, 0x067e, 0x0683, 0x0683, 0x0683, + 0x0683, 0x0683, 0x0683, 0x0686, 0x0686, 0x0686, 0x0686, 0x068d, + 0x068d, 0x068d, 0x068d, 0x068d, 0x0692, 0x0692, 0x0692, 0x0692, + 0x06a1, 0x06a1, 0x06a5, 0x06a5, 0x06a5, 0x06b4, 0x06b4, 0x06b4, + 0x06bd, 0x06bd, 0x06bd, 0x06bd, 0x06bd, 0x06bd, 0x06cc, 0x06d9, + // Entry 200 - 23F + 0x06e3, 0x06f1, 0x06f1, 0x06f1, 0x06f1, 0x06f1, 0x06f1, 0x06f1, + 0x06f1, 0x06f1, 0x06f1, 0x06fa, 0x0707, 0x0707, 0x0707, 0x0707, + 0x0707, 0x0707, 0x070b, 0x070b, 0x0710, 0x0710, 0x0710, 0x0710, + 0x0710, 0x071a, 0x071a, 0x071a, 0x071a, 0x071a, 0x0723, 0x0723, + 0x0723, 0x0723, 0x0723, 0x0723, 0x0723, 0x0723, 0x072a, 0x072a, + 0x0743, 0x0743, 0x0743, 0x0743, 0x074e, 0x0751, 0x0751, 0x0751, + 0x0751, 0x0751, 0x0751, 0x0751, 0x0756, 0x0756, 0x0756, 0x0756, + 0x0756, 0x075e, 0x075e, 0x075e, 0x075e, 0x0762, 0x0762, 0x0762, + // Entry 240 - 27F + 0x0762, 0x0762, 0x0762, 0x076f, 0x076f, 0x076f, 0x076f, 0x076f, + 0x078b, 0x078b, 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07b7, + 0x07b7, 0x07b7, 0x07b7, 0x07b7, 0x07b7, 0x07b7, 0x07b7, 0x07b7, + 0x07b7, 0x07b7, 0x07c5, 0x07cc, 0x07e4, 0x07fa, 0x0804, 0x0812, + 0x0823, 0x0834, + }, + }, + { // fr + frLangStr, + frLangIdx, + }, + { // fr-CA + frCALangStr, + frCALangIdx, + }, + { // fr-CH + "kurde méridional", + []uint16{ // 497 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 80 - BF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry C0 - FF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 100 - 13F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 140 - 17F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 180 - 1BF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 1C0 - 1FF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0011, + }, + }, + { // fur + "afarabcazianavestanafrikaansamaricaragonêsarapassamêsavaraymaràazerbaija" + + "nibielorùsbulgarbengalêstibetanbretonbosniaccatalancecenchamorrocors" + + "creececsclâf de glesiegalêsdanêstodescgrêcinglêsesperantospagnûlesto" + + "nbascpersianfulahfinlandêsfizianfaroêsfrancêsfrisiangaelic irlandêsg" + + "aelic scozêsgalizianguaranìgujaratimanxebraichindicravuathaitianongj" + + "arêsarmenindonesianigboinupiaqidoislandêstalianinuktitutgjaponêsgjeo" + + "rgjiankazackalaallisutkhmerkannadacoreancurdcornualiêslatinlussembur" + + "ghêslimburghêslingalalaolituanletonmalagasymaorimacedonmalayalammong" + + "ulmarathimalêsmaltêsndebele setentrionâlnepalêsolandêsnorvegjês nyno" + + "rsknorvegjês bokmålnavajoocitanoriyaoseticpunjabipolacpashtoportughê" + + "squechuarumançromenrussanscritsardegnûlsindhisami setentrionâlsangos" + + "inalêsslovacslovensamoansomalalbanêsserpswatisotho meridionâlsundanê" + + "ssvedêsswahilitamiltelegutagicthaiturcmenturctartartahitianuigurucra" + + "inurduuzbecvendavietnamitevalonwolofxhosayiddishyorubacinêszuluvieri" + + " inglêsaramaicasturiancopticsclâfvieri egjizianfilipinvieri francêsf" + + "urlangoticvieri grêcladinlenghis multiplismirandêsnapoletanbas todes" + + "cvieri norvegjêssotho setentrionâlturc otomanpapiamentovieri persian" + + "vieri provenzâlsicilianscozêsvieri irlandêssumerictetumindeterminade" + + "todesc de Austriealt todesc de Svuizareinglês australianinglês canad" + + "êsinglês britanicingles merecanspagnûl de Americhe Latinespagnûl ib" + + "ericfrancês dal Canadefrancês de Svuizareflamantportughês brasilianp" + + "ortughês ibericmoldâfcinês semplificâtcinês tradizionâl", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000c, 0x0013, 0x001c, 0x001c, 0x0022, 0x002b, + 0x002f, 0x0037, 0x003b, 0x0042, 0x004d, 0x004d, 0x0056, 0x005c, + 0x005c, 0x005c, 0x0065, 0x006c, 0x0072, 0x0079, 0x0080, 0x0085, + 0x008d, 0x0091, 0x0095, 0x0098, 0x00a8, 0x00a8, 0x00ae, 0x00b4, + 0x00ba, 0x00ba, 0x00ba, 0x00ba, 0x00bf, 0x00c6, 0x00cf, 0x00d7, + 0x00dc, 0x00e0, 0x00e7, 0x00ec, 0x00f6, 0x00fc, 0x0103, 0x010b, + 0x0112, 0x0122, 0x0130, 0x0138, 0x0140, 0x0148, 0x014c, 0x014c, + 0x0152, 0x0157, 0x0157, 0x015e, 0x0165, 0x016e, 0x0173, 0x0173, + // Entry 40 - 7F + 0x0173, 0x017d, 0x017d, 0x0181, 0x0181, 0x0188, 0x018b, 0x0194, + 0x019a, 0x01a3, 0x01ac, 0x01ac, 0x01b6, 0x01b6, 0x01b6, 0x01b6, + 0x01bb, 0x01c6, 0x01cb, 0x01d2, 0x01d8, 0x01d8, 0x01d8, 0x01dc, + 0x01dc, 0x01e7, 0x01e7, 0x01ec, 0x01fa, 0x01fa, 0x0205, 0x020c, + 0x020f, 0x0215, 0x0215, 0x021a, 0x0222, 0x0222, 0x0227, 0x022e, + 0x0237, 0x023d, 0x0244, 0x024a, 0x0251, 0x0251, 0x0251, 0x0266, + 0x026e, 0x026e, 0x0276, 0x0288, 0x029a, 0x029a, 0x02a0, 0x02a0, + 0x02a6, 0x02a6, 0x02a6, 0x02ab, 0x02b1, 0x02b8, 0x02b8, 0x02bd, + // Entry 80 - BF + 0x02c3, 0x02cd, 0x02d4, 0x02db, 0x02db, 0x02e0, 0x02e3, 0x02e3, + 0x02eb, 0x02f5, 0x02fb, 0x030d, 0x0312, 0x031a, 0x0320, 0x0326, + 0x032c, 0x032c, 0x0331, 0x0339, 0x033d, 0x0342, 0x0353, 0x035c, + 0x0363, 0x036a, 0x036f, 0x0375, 0x037a, 0x037e, 0x037e, 0x0385, + 0x0385, 0x0385, 0x0389, 0x0389, 0x038f, 0x0397, 0x039c, 0x03a2, + 0x03a6, 0x03ab, 0x03b0, 0x03ba, 0x03ba, 0x03bf, 0x03c4, 0x03c9, + 0x03d0, 0x03d6, 0x03d6, 0x03dc, 0x03e0, 0x03e0, 0x03e0, 0x03e0, + 0x03e0, 0x03e0, 0x03e0, 0x03e0, 0x03e0, 0x03e0, 0x03e0, 0x03e0, + // Entry C0 - FF + 0x03e0, 0x03e0, 0x03ed, 0x03ed, 0x03f4, 0x03f4, 0x03f4, 0x03f4, + 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03f4, 0x03fc, 0x03fc, + 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, + 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, + 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, + 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, + 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, + 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, 0x03fc, + // Entry 100 - 13F + 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, 0x0402, + 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, + 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0416, + 0x0416, 0x0416, 0x0416, 0x0416, 0x0416, 0x0416, 0x0416, 0x041d, + 0x041d, 0x041d, 0x041d, 0x041d, 0x042b, 0x042b, 0x042b, 0x042b, + 0x0431, 0x0431, 0x0431, 0x0431, 0x0431, 0x0431, 0x0431, 0x0431, + 0x0431, 0x0431, 0x0431, 0x0431, 0x0431, 0x0431, 0x0431, 0x0436, + 0x0436, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, + // Entry 140 - 17F + 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, + 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, + 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, + 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, + 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, + 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, + 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, 0x0441, + 0x0441, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, + // Entry 180 - 1BF + 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, + 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, + 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, + 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, + 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, 0x0457, + 0x0457, 0x0460, 0x0460, 0x0460, 0x0460, 0x0460, 0x0460, 0x0460, + 0x0469, 0x0469, 0x0473, 0x0473, 0x0473, 0x0473, 0x0473, 0x0473, + 0x0473, 0x0473, 0x0483, 0x0483, 0x0483, 0x0496, 0x0496, 0x0496, + // Entry 1C0 - 1FF + 0x0496, 0x0496, 0x0496, 0x0496, 0x0496, 0x04a1, 0x04a1, 0x04a1, + 0x04a1, 0x04ab, 0x04ab, 0x04ab, 0x04ab, 0x04ab, 0x04b8, 0x04b8, + 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04c8, 0x04c8, 0x04c8, + 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, + 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, + 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04c8, 0x04d0, 0x04d7, 0x04d7, + 0x04d7, 0x04d7, 0x04d7, 0x04d7, 0x04d7, 0x04d7, 0x04e6, 0x04e6, + 0x04e6, 0x04e6, 0x04e6, 0x04e6, 0x04e6, 0x04e6, 0x04e6, 0x04e6, + // Entry 200 - 23F + 0x04e6, 0x04e6, 0x04e6, 0x04e6, 0x04e6, 0x04e6, 0x04e6, 0x04e6, + 0x04e6, 0x04e6, 0x04ed, 0x04ed, 0x04ed, 0x04ed, 0x04ed, 0x04ed, + 0x04ed, 0x04ed, 0x04ed, 0x04ed, 0x04f2, 0x04f2, 0x04f2, 0x04f2, + 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04f2, + 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04f2, + 0x04f2, 0x04f2, 0x04f2, 0x04f2, 0x04ff, 0x04ff, 0x04ff, 0x04ff, + 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, + 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, + // Entry 240 - 27F + 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, + 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x04ff, 0x0510, 0x0526, + 0x0538, 0x0548, 0x0558, 0x0566, 0x0581, 0x0590, 0x0590, 0x0590, + 0x05a3, 0x05b7, 0x05b7, 0x05be, 0x05d2, 0x05e3, 0x05ea, 0x05ea, + 0x05fd, 0x0610, + }, + }, + { // fy + "AfarAbchazyskAvestyskAfrikaanskAkanAmhaarskAragoneeskArabyskAssameeskAva" + + "ryskAymaraAzerbeidzjaanskBasjkierskWyt-RussyskBulgaarskBislamaBambar" + + "aBengaalskTibetaanskBretonskBosnyskKatalaanskTsjetsjeenskChamorroKor" + + "sikaanskCreeTsjechyskKerkslavyskTsjoevasjyskWelskDeenskDútskDivehiDz" + + "ongkhaEweGryksIngelskEsperantoSpaanskEstlânskBaskyskPerzyskFulahFins" + + "kFijyskFaeröerskFrânskWest-FryskIerskSchotsk GaelicGalisyskGuaraníGu" + + "jaratiManksHausaHebreeuwskHindiHiri MotuKroatyskHaïtiaanskHongaarskA" + + "rmeenskHereroInterlinguaYndonezyskInterlingueIgboSichuan YiInupiaqId" + + "oYslânsItaliaanskInuktitutJapansJavaanskGeorgyskKongoKikuyuKuanyamaK" + + "azachsGrienlânsKhmerKannadaKoreaanskKanuriKasjmiriKoerdyskKomiCornis" + + "hKirgizyskLatynLuxemburgsGandaLimburgsLingalaLaotiaanskLitouwsLuba-K" + + "atangaLetlânsMalagasyskMarshalleesMaoriMacedonyskMalayalamMongoolsMa" + + "rathiMaleisMalteesBirmeesNauruaanskNoard-NdbeleNepaleesNdongaNederlâ" + + "nskNoors - NynorskNoors - BokmålSûd-NdbeleNavajoNyanjaOccitaanskOjib" + + "waOromoOdiaOssetyskPunjabiPaliPoalskPasjtoePortugeeskQuechuaReto-Rom" + + "aanskKirundiRoemeenskRussyskKinyarwandaSanskrietSardinyskSindhiNoard" + + "-SamyskSangoSingaleesSlowaaksSloveenskSamoaanskShonaSomalyskAlbanees" + + "kServyskSwaziSûd-SothoSoendaneeskZweedsSwahiliTamilTeluguTadzjieksTh" + + "aisTigrinyaTurkmeensTswanaTongaanskTurksTsongaTataarsTahityskOeigoer" + + "sOekraïensUrduOezbeeksVendaVietnameesVolapükWaalsWolofXhosaJiddyskYo" + + "rubaZhuangSineeskZuluAtjeeskAkoliAdangmeAdygheAfrihiliAghemAinuAkkad" + + "yskAleutSûd-AltaïskâldingelskAngikaArameeskAraukaanskArapahoArawakAs" + + "uAsturyskAwadhiBaloetsjyskBalineeskBasaBamounGhomala’BejaBembaBenaBa" + + "futBhojpuriBikolBiniKomSiksikaBrajBodoAkooseBuriatBugineeskBuluBlinM" + + "edumbaKaddoKaribyskCayugaAtsamCebuanoChigaChibchaChagataiChuukeeskMa" + + "riChinook-jargonChoctawChipewyanCherokeeCheyenneSoranîKoptyskKrim-Ta" + + "taarskKasjoebyskDakotaDargwaTaitaDelawareSlaveDogribDinkaZarmaDogriN" + + "edersorbyskDualaMiddelnederlânskJola-FonyiDyulaDazagaEmbuEfikAldegyp" + + "tyskEkajukElamityskMiddelingelskEwondoFangFilipynskFonMiddelfrânskAl" + + "dfrânskNoard-FryskEast-FryskFriulyskGaGayoGbayaGeezGilberteeskMiddel" + + "heechdútskAlsheechdútskGondiGorontaloGothyskGreboAldgryksSwitsers Dú" + + "tskGusiiGwichʼinHaidaHawaïaanskHiligaynonHettityskHmongOppersorbyskH" + + "upaIbanIbibioIlokoIngoesjLojbanNgombaMachameJudeo-PerzyskJudeo-Araby" + + "skKarakalpaksKabyleKachinJjuKambaKawiKabardyskKanembuTyapMakondeKaap" + + "verdysk CreoolsKoroKhasiKhotaneeskKoyra ChiiniKakoKalenjinKimbunduKo" + + "nkaniKosraeaanskKpelleKarachay-BalkarKarelyskKurukhShambalaBafiaKöls" + + "chKoemuksKutenaiLadinoLangiLahndaLambaLezgyskLakotaMongoLoziLuba-Lul" + + "uaLuisenoLundaLuoLushaiLuyiaMadureesMafaMagahiMaithiliMakassaarsMand" + + "ingoMasaiMabaMokshaMandarMendeMeruMorisyenMiddeliersMakhuwa-MeettoMe" + + "ta’Mi’kmaqMinangkabauMantsjoeManipoeriMohawkMossiMundangMeardere tal" + + "enCreekMirandeesMarwariMyeneErzjaNapolitaanskNamaLaagduitsNewariNias" + + "NiueaanskNgumbaNgiemboonNogaiAldnoarskN’koNoard-SothoNuerKlassiek Ne" + + "wariNyamweziNyankoleNyoroNzimaOsageOttomaansk-TurksPangasinanPahlavi" + + "PampangaPapiamentsPalauaanskAldperzyskFoenisyskPohnpeiaanskAldproven" + + "çaalsRajasthaniRapanuiRarotonganRomboRomaniAromaniaanskRwaSandaweJa" + + "koetsSamaritaansk-ArameeskSamburuSasakSantaliNgambaySanguSiciliaansk" + + "SchotsSenecaSenaSelkupKoyraboro SenniAldyrskTashelhiytShanTsjadysk A" + + "rabyskSidamoSûd-SamyskLule SamiInari SamiSkolt SamiSoninkeSogdyskSra" + + "nantongoSererSahoSukumaSoesoeSoemeryskShimaoreCongo SwahiliKlassiek " + + "SyryskSyryskTimneTesoTerenoTetunTigreTivTokelausKlingonTlingitTamash" + + "ekNyasa TongaTok PisinTarokoTsimshianToemboekaTuvaluaanskTasawaqTuvi" + + "nyskTamazight (Sintraal-Marokko)OedmoertsOegarityskUmbunduRootVaiVot" + + "yskVunjoWalserWalamoWarayWashoKalmykSogaYaoYapeesYangbenYembaKantone" + + "eskZapotecBlissymbolenZenagaStandert Marokkaanske TamazightZuniGjin " + + "linguïstyske ynhâldZazaModern standert ArabyskEastenryks DútskSwitse" + + "rsk HeechdútskAustralysk IngelskKanadeesk IngelskBritsk IngelskAmeri" + + "kaansk IngelskLatynsk-Amerikaansk SpaanskEuropeesk SpaanskMeksikaans" + + "k SpaanskKanadeesk FrânskSwitserse FrânskVlaamsBrazyljaansk Portugee" + + "sEuropees PortugeesMoldavyskServokroatyskFerienfâldich SineeskTradis" + + "joneel Sineesk", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000d, 0x0015, 0x001f, 0x0023, 0x002b, 0x0035, + 0x003c, 0x0045, 0x004c, 0x0052, 0x0061, 0x006b, 0x0076, 0x007f, + 0x0086, 0x008d, 0x0096, 0x00a0, 0x00a8, 0x00af, 0x00b9, 0x00c5, + 0x00cd, 0x00d8, 0x00dc, 0x00e5, 0x00f0, 0x00fc, 0x0101, 0x0107, + 0x010d, 0x0113, 0x011b, 0x011e, 0x0123, 0x012a, 0x0133, 0x013a, + 0x0143, 0x014a, 0x0151, 0x0156, 0x015b, 0x0161, 0x016b, 0x0172, + 0x017c, 0x0181, 0x018f, 0x0197, 0x019f, 0x01a7, 0x01ac, 0x01b1, + 0x01bb, 0x01c0, 0x01c9, 0x01d1, 0x01dc, 0x01e5, 0x01ed, 0x01f3, + // Entry 40 - 7F + 0x01fe, 0x0208, 0x0213, 0x0217, 0x0221, 0x0228, 0x022b, 0x0232, + 0x023c, 0x0245, 0x024b, 0x0253, 0x025b, 0x0260, 0x0266, 0x026e, + 0x0275, 0x027f, 0x0284, 0x028b, 0x0294, 0x029a, 0x02a2, 0x02aa, + 0x02ae, 0x02b5, 0x02be, 0x02c3, 0x02cd, 0x02d2, 0x02da, 0x02e1, + 0x02eb, 0x02f2, 0x02fe, 0x0306, 0x0310, 0x031b, 0x0320, 0x032a, + 0x0333, 0x033b, 0x0342, 0x0348, 0x034f, 0x0356, 0x0360, 0x036c, + 0x0374, 0x037a, 0x0385, 0x0394, 0x03a3, 0x03ae, 0x03b4, 0x03ba, + 0x03c4, 0x03ca, 0x03cf, 0x03d3, 0x03db, 0x03e2, 0x03e6, 0x03ec, + // Entry 80 - BF + 0x03f3, 0x03fd, 0x0404, 0x0411, 0x0418, 0x0421, 0x0428, 0x0433, + 0x043c, 0x0445, 0x044b, 0x0457, 0x045c, 0x0465, 0x046d, 0x0476, + 0x047f, 0x0484, 0x048c, 0x0495, 0x049c, 0x04a1, 0x04ab, 0x04b6, + 0x04bc, 0x04c3, 0x04c8, 0x04ce, 0x04d7, 0x04dc, 0x04e4, 0x04ed, + 0x04f3, 0x04fc, 0x0501, 0x0507, 0x050e, 0x0516, 0x051e, 0x0528, + 0x052c, 0x0534, 0x0539, 0x0543, 0x054b, 0x0550, 0x0555, 0x055a, + 0x0561, 0x0567, 0x056d, 0x0574, 0x0578, 0x057f, 0x0584, 0x058b, + 0x0591, 0x0591, 0x0599, 0x059e, 0x05a2, 0x05aa, 0x05aa, 0x05af, + // Entry C0 - FF + 0x05af, 0x05bc, 0x05c7, 0x05cd, 0x05d5, 0x05df, 0x05df, 0x05e6, + 0x05e6, 0x05ec, 0x05ec, 0x05ec, 0x05ef, 0x05ef, 0x05f7, 0x05f7, + 0x05fd, 0x0608, 0x0611, 0x0611, 0x0615, 0x061b, 0x061b, 0x0625, + 0x0629, 0x062e, 0x062e, 0x0632, 0x0637, 0x0637, 0x0637, 0x063f, + 0x0644, 0x0648, 0x0648, 0x064b, 0x0652, 0x0652, 0x0652, 0x0656, + 0x0656, 0x065a, 0x0660, 0x0666, 0x066f, 0x0673, 0x0677, 0x067e, + 0x0683, 0x068b, 0x0691, 0x0696, 0x069d, 0x06a2, 0x06a9, 0x06b1, + 0x06ba, 0x06be, 0x06cc, 0x06d3, 0x06dc, 0x06e4, 0x06ec, 0x06f3, + // Entry 100 - 13F + 0x06fa, 0x06fa, 0x0707, 0x0711, 0x0717, 0x071d, 0x0722, 0x072a, + 0x072f, 0x0735, 0x073a, 0x073f, 0x0744, 0x0750, 0x0750, 0x0755, + 0x0766, 0x0770, 0x0775, 0x077b, 0x077f, 0x0783, 0x0783, 0x078e, + 0x0794, 0x079d, 0x07aa, 0x07aa, 0x07b0, 0x07b0, 0x07b4, 0x07bd, + 0x07bd, 0x07c0, 0x07c0, 0x07cd, 0x07d7, 0x07d7, 0x07e2, 0x07ec, + 0x07f4, 0x07f6, 0x07f6, 0x07f6, 0x07fa, 0x07ff, 0x07ff, 0x0803, + 0x080e, 0x080e, 0x081f, 0x082d, 0x082d, 0x0832, 0x083b, 0x0842, + 0x0847, 0x084f, 0x085e, 0x085e, 0x085e, 0x0863, 0x086c, 0x0871, + // Entry 140 - 17F + 0x0871, 0x087c, 0x087c, 0x0886, 0x088f, 0x0894, 0x08a0, 0x08a0, + 0x08a4, 0x08a8, 0x08ae, 0x08b3, 0x08ba, 0x08ba, 0x08ba, 0x08c0, + 0x08c6, 0x08cd, 0x08da, 0x08e7, 0x08e7, 0x08f2, 0x08f8, 0x08fe, + 0x0901, 0x0906, 0x090a, 0x0913, 0x091a, 0x091e, 0x0925, 0x0938, + 0x0938, 0x093c, 0x093c, 0x0941, 0x094b, 0x0957, 0x0957, 0x0957, + 0x095b, 0x0963, 0x096b, 0x096b, 0x0972, 0x097d, 0x0983, 0x0992, + 0x0992, 0x0992, 0x099a, 0x09a0, 0x09a8, 0x09ad, 0x09b4, 0x09bb, + 0x09c2, 0x09c8, 0x09cd, 0x09d3, 0x09d8, 0x09df, 0x09df, 0x09df, + // Entry 180 - 1BF + 0x09df, 0x09e5, 0x09e5, 0x09ea, 0x09ee, 0x09ee, 0x09ee, 0x09f8, + 0x09ff, 0x0a04, 0x0a07, 0x0a0d, 0x0a12, 0x0a12, 0x0a12, 0x0a1a, + 0x0a1e, 0x0a24, 0x0a2c, 0x0a36, 0x0a3e, 0x0a43, 0x0a47, 0x0a4d, + 0x0a53, 0x0a58, 0x0a5c, 0x0a64, 0x0a6e, 0x0a7c, 0x0a83, 0x0a8c, + 0x0a97, 0x0a9f, 0x0aa8, 0x0aae, 0x0ab3, 0x0ab3, 0x0aba, 0x0ac8, + 0x0acd, 0x0ad6, 0x0add, 0x0add, 0x0ae2, 0x0ae7, 0x0ae7, 0x0ae7, + 0x0af3, 0x0af7, 0x0b00, 0x0b06, 0x0b0a, 0x0b13, 0x0b13, 0x0b19, + 0x0b22, 0x0b27, 0x0b30, 0x0b30, 0x0b36, 0x0b41, 0x0b45, 0x0b54, + // Entry 1C0 - 1FF + 0x0b5c, 0x0b64, 0x0b69, 0x0b6e, 0x0b73, 0x0b83, 0x0b8d, 0x0b94, + 0x0b9c, 0x0ba6, 0x0bb0, 0x0bb0, 0x0bb0, 0x0bb0, 0x0bba, 0x0bba, + 0x0bc3, 0x0bc3, 0x0bc3, 0x0bcf, 0x0bcf, 0x0bde, 0x0bde, 0x0bde, + 0x0be8, 0x0bef, 0x0bf9, 0x0bf9, 0x0bf9, 0x0bfe, 0x0c04, 0x0c04, + 0x0c04, 0x0c04, 0x0c10, 0x0c13, 0x0c1a, 0x0c21, 0x0c36, 0x0c3d, + 0x0c42, 0x0c49, 0x0c49, 0x0c50, 0x0c55, 0x0c60, 0x0c66, 0x0c66, + 0x0c66, 0x0c6c, 0x0c70, 0x0c70, 0x0c76, 0x0c85, 0x0c8c, 0x0c8c, + 0x0c96, 0x0c9a, 0x0caa, 0x0cb0, 0x0cb0, 0x0cb0, 0x0cbb, 0x0cc4, + // Entry 200 - 23F + 0x0cce, 0x0cd8, 0x0cdf, 0x0ce6, 0x0cf1, 0x0cf6, 0x0cfa, 0x0cfa, + 0x0d00, 0x0d06, 0x0d0f, 0x0d17, 0x0d24, 0x0d33, 0x0d39, 0x0d39, + 0x0d39, 0x0d3e, 0x0d42, 0x0d48, 0x0d4d, 0x0d52, 0x0d55, 0x0d5d, + 0x0d5d, 0x0d64, 0x0d6b, 0x0d6b, 0x0d73, 0x0d7e, 0x0d87, 0x0d87, + 0x0d8d, 0x0d8d, 0x0d96, 0x0d96, 0x0d9f, 0x0daa, 0x0db1, 0x0db9, + 0x0dd5, 0x0dde, 0x0de8, 0x0def, 0x0df3, 0x0df6, 0x0df6, 0x0df6, + 0x0df6, 0x0df6, 0x0dfc, 0x0dfc, 0x0e01, 0x0e07, 0x0e0d, 0x0e12, + 0x0e17, 0x0e17, 0x0e17, 0x0e1d, 0x0e1d, 0x0e21, 0x0e24, 0x0e2a, + // Entry 240 - 27F + 0x0e31, 0x0e36, 0x0e36, 0x0e40, 0x0e47, 0x0e53, 0x0e53, 0x0e59, + 0x0e78, 0x0e7c, 0x0e96, 0x0e9a, 0x0eb1, 0x0eb1, 0x0ec2, 0x0ed7, + 0x0ee9, 0x0efa, 0x0f08, 0x0f1b, 0x0f36, 0x0f47, 0x0f5a, 0x0f5a, + 0x0f6b, 0x0f7c, 0x0f7c, 0x0f82, 0x0f98, 0x0faa, 0x0fb3, 0x0fc0, + 0x0fd6, 0x0fea, + }, + }, + { // ga + "AfáirisAbcáisisAivéistisAfracáinisAcáinisAmáirisAragóinisAraibisAsaimisA" + + "váirisAidhmirisAsarbaiseáinisBaiscírisBealarúisisBulgáirisBioslaimis" + + "BeangáilisTibéidisBriotáinisBoisnisCatalóinisSeisnisSeamóirisCorsaic" + + "isCraísSeicisSlavais na hEaglaiseSuvaisisBreatnaisDanmhairgisGearmái" + + "nisDivéihisSeoinicisGréigisBéarlaEsperantoSpáinnisEastóinisBascaisPe" + + "irsisFuláinisFionlainnisFidsisFaróisFraincisFreaslainnis IartharachG" + + "aeilgeGaeilge na hAlbanGailísisGuaráinisGúisearáitisManainnisHásaisE" + + "abhraisHiondúisMotúis HíríCróitisCriól HáítíochUngáirisAirméinisHeir" + + "éirisInterlinguaIndinéisisInterlingueÍogbóisIniúipiaicisIdoÍoslainn" + + "isIodáilisIonúitisSeapáinisIáivisSeoirsisCongóisCiocúisCuainiáimisCa" + + "saicisKalaallisutCiméirisCannadaisCóiréisCanúirisCaismírisCoirdisCoi" + + "misCoirnisCirgisisLaidinLucsambuirgisLugandaisLiongáilisLaoisisLiotu" + + "áinisLúba-CataingisLaitvisMalagáisisMairsillisMaoraisMacadóinisMail" + + "éalaimisMongóilisMaraitisMalaeisMáltaisBurmaisNárúisNdeibéilis an T" + + "uaiscirtNeipeailisNdongaisOllainnisNua-IoruaisIoruais BokmålNdeibéil" + + "is an DeiscirtNavachóisSiséivisOcsatáinisÓisibisOraimisOirísisOiséit" + + "isPuinseáibisPáilisPolainnisPaistisPortaingéilisCeatsuaisRómainisRúi" + + "ndisRómáinisRúisisCiniaruaindisSanscraitSairdínisSindisSáimis Thuaid" + + "hSangóisSiolóinisSlóvaicisSlóivéinisSamóisSeoinisSomáilisAlbáinisSei" + + "rbisSuaisisSeasóitisSundaisSualainnisSvahaílisTamailisTeileagúisTáid" + + "sícisTéalainnisTigrinisTuircméinisSuáinisTongaisTuircisSongaisTatair" + + "isTaihítisUigiúirisÚcráinisUrdúisÚisbéiceastáinisVeindisVítneaimisVo" + + "lapükVallúnaisVolaifisCóisisGiúdaisIarúibisSiuáingisSínisSúlúisAidhn" + + "iúisAcáidisSean-BhéarlaAramaisMapúitsisAstúirisBailísBaváirisBeimbis" + + "BuiriáitisBuiginisSeabúáinisMairisSeiricisCoptaisCaisiúibisZarmaisSo" + + "rbais ÍochtarachMeán-OllainnisSean-ÉigiptisMeán-BhéarlaFilipínisMeán" + + "-FhraincisSean-FhraincisFreaslainnis an TuaiscirtFriúilisAetóipisMeá" + + "n-Ard-GhearmáinisSean-Ard-GhearmáinisSean-GhréigisGearmáinis Eilvéis" + + "eachUaúisHaicéisHaváisHiondúis FhidsíHilgeanóinisHitisMongaisSorbais" + + " UachtarachHúipisIbibisIongúisIútlainnisCara-ChalpáisConcáinisCairéi" + + "lisCurúicisLaidínisPuinseáibis IartharachLiogúirisLiovóinisLombairdi" + + "sMeindisMeán-GhaeilgeManapúirisMóháicisMairis IartharachMioraindéisM" + + "armhairisGearmáinis ÍochtarachNíobhaisSean-LochlainnisSútúis an Tuai" + + "scirtSean-PheirsisPrúisisRomainisArómáinisSachaisAramais ShamárachSa" + + "ntáilisSicilisAlbainisSean-GhaeilgeSáimis LuleSogdánaisSuiméirisSvah" + + "aílis an ChongóSiricisSiléisisKlingonUdmairtisTeanga AnaithnidVeinéi" + + "sisPléimeannais IartharachCailmícisCantainisSéalainnisZúinisGan ábha" + + "r teangeolaíochAraibis ChaighdeánachGearmáinis OstarachArd-Ghearmáin" + + "is EilvéiseachBéarla AstrálachBéarla CeanadachBéarla BriotanachBéarl" + + "a MeiriceánachSpáinnis Mheiriceá LaidinighSpáinnis EorpachSpáinnis M" + + "heicsiceachFraincis CheanadachFraincis EilvéiseachSacsainis Íochtara" + + "chPléimeannaisPortaingéilis na BrasaílePortaingéilis IbéarachMoldáiv" + + "isSeirbea-ChróitisSínis ShimplitheSínis Thraidisiúnta", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0008, 0x0011, 0x001b, 0x0026, 0x002e, 0x0036, 0x0040, + 0x0047, 0x004e, 0x0056, 0x005f, 0x006e, 0x0078, 0x0084, 0x008e, + 0x0098, 0x0098, 0x00a3, 0x00ac, 0x00b7, 0x00be, 0x00c9, 0x00d0, + 0x00da, 0x00e3, 0x00e9, 0x00ef, 0x0103, 0x010b, 0x0114, 0x011f, + 0x012a, 0x0133, 0x013c, 0x013c, 0x0144, 0x014b, 0x0154, 0x015d, + 0x0167, 0x016e, 0x0175, 0x017e, 0x0189, 0x018f, 0x0196, 0x019e, + 0x01b5, 0x01bc, 0x01cd, 0x01d6, 0x01e0, 0x01ee, 0x01f7, 0x01fe, + 0x0206, 0x020f, 0x021d, 0x0225, 0x0237, 0x0240, 0x024a, 0x0254, + // Entry 40 - 7F + 0x025f, 0x026a, 0x0275, 0x027e, 0x027e, 0x028b, 0x028e, 0x0299, + 0x02a2, 0x02ab, 0x02b5, 0x02bc, 0x02c4, 0x02cc, 0x02d4, 0x02e0, + 0x02e8, 0x02f3, 0x02fc, 0x0305, 0x030e, 0x0317, 0x0321, 0x0328, + 0x032e, 0x0335, 0x033d, 0x0343, 0x0350, 0x0359, 0x0359, 0x0364, + 0x036b, 0x0376, 0x0385, 0x038c, 0x0397, 0x03a1, 0x03a8, 0x03b3, + 0x03c0, 0x03ca, 0x03d2, 0x03d9, 0x03e1, 0x03e8, 0x03f0, 0x0408, + 0x0412, 0x041a, 0x0423, 0x042e, 0x043d, 0x0454, 0x045e, 0x0467, + 0x0472, 0x047a, 0x0481, 0x0489, 0x0492, 0x049e, 0x04a5, 0x04ae, + // Entry 80 - BF + 0x04b5, 0x04c3, 0x04cc, 0x04d5, 0x04dd, 0x04e7, 0x04ee, 0x04fb, + 0x0504, 0x050e, 0x0514, 0x0523, 0x052b, 0x0535, 0x053f, 0x054b, + 0x0552, 0x0559, 0x0562, 0x056b, 0x0572, 0x0579, 0x0583, 0x058a, + 0x0594, 0x059e, 0x05a6, 0x05b1, 0x05bc, 0x05c7, 0x05cf, 0x05db, + 0x05e3, 0x05ea, 0x05f1, 0x05f8, 0x0600, 0x0609, 0x0613, 0x061d, + 0x0624, 0x0637, 0x063e, 0x0649, 0x0651, 0x065b, 0x0663, 0x066a, + 0x0672, 0x067b, 0x0685, 0x068b, 0x0693, 0x0693, 0x0693, 0x0693, + 0x0693, 0x0693, 0x0693, 0x0693, 0x069d, 0x06a5, 0x06a5, 0x06a5, + // Entry C0 - FF + 0x06a5, 0x06a5, 0x06b2, 0x06b2, 0x06b9, 0x06c3, 0x06c3, 0x06c3, + 0x06c3, 0x06c3, 0x06c3, 0x06c3, 0x06c3, 0x06c3, 0x06cc, 0x06cc, + 0x06cc, 0x06cc, 0x06d3, 0x06dc, 0x06dc, 0x06dc, 0x06dc, 0x06dc, + 0x06dc, 0x06e3, 0x06e3, 0x06e3, 0x06e3, 0x06e3, 0x06e3, 0x06e3, + 0x06e3, 0x06e3, 0x06e3, 0x06e3, 0x06e3, 0x06e3, 0x06e3, 0x06e3, + 0x06e3, 0x06e3, 0x06e3, 0x06ee, 0x06f6, 0x06f6, 0x06f6, 0x06f6, + 0x06f6, 0x06f6, 0x06f6, 0x06f6, 0x0702, 0x0702, 0x0702, 0x0702, + 0x0702, 0x0708, 0x0708, 0x0708, 0x0708, 0x0710, 0x0710, 0x0710, + // Entry 100 - 13F + 0x0717, 0x0717, 0x0717, 0x0722, 0x0722, 0x0722, 0x0722, 0x0722, + 0x0722, 0x0722, 0x0722, 0x0729, 0x0729, 0x073c, 0x073c, 0x073c, + 0x074b, 0x074b, 0x074b, 0x074b, 0x074b, 0x074b, 0x074b, 0x0759, + 0x0759, 0x0759, 0x0767, 0x0767, 0x0767, 0x0767, 0x0767, 0x0771, + 0x0771, 0x0771, 0x0771, 0x0780, 0x078e, 0x078e, 0x07a7, 0x07a7, + 0x07b0, 0x07b0, 0x07b0, 0x07b0, 0x07b0, 0x07b0, 0x07b0, 0x07b9, + 0x07b9, 0x07b9, 0x07cf, 0x07e4, 0x07e4, 0x07e4, 0x07e4, 0x07e4, + 0x07e4, 0x07f2, 0x080a, 0x0810, 0x0810, 0x0810, 0x0810, 0x0810, + // Entry 140 - 17F + 0x0818, 0x081f, 0x0830, 0x083d, 0x0842, 0x0849, 0x085b, 0x085b, + 0x0862, 0x0862, 0x0868, 0x0868, 0x0870, 0x0870, 0x0870, 0x0870, + 0x0870, 0x0870, 0x0870, 0x0870, 0x087b, 0x0889, 0x0889, 0x0889, + 0x0889, 0x0889, 0x0889, 0x0889, 0x0889, 0x0889, 0x0889, 0x0889, + 0x0889, 0x0889, 0x0889, 0x0889, 0x0889, 0x0889, 0x0889, 0x0889, + 0x0889, 0x0889, 0x0889, 0x0889, 0x0893, 0x0893, 0x0893, 0x0893, + 0x0893, 0x0893, 0x089d, 0x08a6, 0x08a6, 0x08a6, 0x08a6, 0x08a6, + 0x08a6, 0x08af, 0x08af, 0x08c6, 0x08c6, 0x08c6, 0x08c6, 0x08d0, + // Entry 180 - 1BF + 0x08da, 0x08da, 0x08e4, 0x08e4, 0x08e4, 0x08e4, 0x08e4, 0x08e4, + 0x08e4, 0x08e4, 0x08e4, 0x08e4, 0x08e4, 0x08e4, 0x08e4, 0x08e4, + 0x08e4, 0x08e4, 0x08e4, 0x08e4, 0x08e4, 0x08e4, 0x08e4, 0x08e4, + 0x08e4, 0x08eb, 0x08eb, 0x08eb, 0x08f9, 0x08f9, 0x08f9, 0x08f9, + 0x08f9, 0x08f9, 0x0904, 0x090e, 0x090e, 0x091f, 0x091f, 0x091f, + 0x091f, 0x092b, 0x0935, 0x0935, 0x0935, 0x0935, 0x0935, 0x0935, + 0x0935, 0x0935, 0x094c, 0x094c, 0x094c, 0x0955, 0x0955, 0x0955, + 0x0955, 0x0955, 0x0965, 0x0965, 0x0965, 0x097a, 0x097a, 0x097a, + // Entry 1C0 - 1FF + 0x097a, 0x097a, 0x097a, 0x097a, 0x097a, 0x097a, 0x097a, 0x097a, + 0x097a, 0x097a, 0x097a, 0x097a, 0x097a, 0x097a, 0x0987, 0x0987, + 0x0987, 0x0987, 0x0987, 0x0987, 0x098f, 0x098f, 0x098f, 0x098f, + 0x098f, 0x098f, 0x098f, 0x098f, 0x098f, 0x098f, 0x0997, 0x0997, + 0x0997, 0x0997, 0x09a2, 0x09a2, 0x09a2, 0x09a9, 0x09bb, 0x09bb, + 0x09bb, 0x09c5, 0x09c5, 0x09c5, 0x09c5, 0x09cc, 0x09d4, 0x09d4, + 0x09d4, 0x09d4, 0x09d4, 0x09d4, 0x09d4, 0x09d4, 0x09e1, 0x09e1, + 0x09e1, 0x09e1, 0x09e1, 0x09e1, 0x09e1, 0x09e1, 0x09e1, 0x09ed, + // Entry 200 - 23F + 0x09ed, 0x09ed, 0x09ed, 0x09f7, 0x09f7, 0x09f7, 0x09f7, 0x09f7, + 0x09f7, 0x09f7, 0x0a01, 0x0a01, 0x0a16, 0x0a16, 0x0a1d, 0x0a26, + 0x0a26, 0x0a26, 0x0a26, 0x0a26, 0x0a26, 0x0a26, 0x0a26, 0x0a26, + 0x0a26, 0x0a2d, 0x0a2d, 0x0a2d, 0x0a2d, 0x0a2d, 0x0a2d, 0x0a2d, + 0x0a2d, 0x0a2d, 0x0a2d, 0x0a2d, 0x0a2d, 0x0a2d, 0x0a2d, 0x0a2d, + 0x0a2d, 0x0a36, 0x0a36, 0x0a36, 0x0a46, 0x0a46, 0x0a50, 0x0a50, + 0x0a68, 0x0a68, 0x0a68, 0x0a68, 0x0a68, 0x0a68, 0x0a68, 0x0a68, + 0x0a68, 0x0a68, 0x0a68, 0x0a72, 0x0a72, 0x0a72, 0x0a72, 0x0a72, + // Entry 240 - 27F + 0x0a72, 0x0a72, 0x0a72, 0x0a7b, 0x0a7b, 0x0a7b, 0x0a86, 0x0a86, + 0x0a86, 0x0a8d, 0x0aa6, 0x0aa6, 0x0abc, 0x0abc, 0x0ad0, 0x0aed, + 0x0aff, 0x0b10, 0x0b22, 0x0b37, 0x0b55, 0x0b66, 0x0b7c, 0x0b7c, + 0x0b8f, 0x0ba4, 0x0bb9, 0x0bc6, 0x0be1, 0x0bf9, 0x0c03, 0x0c14, + 0x0c25, 0x0c3a, + }, + }, + { // gd + "AfarAbchasaisAvestanaisAfraganaisAkanAmtharaisAragonaisArabaisAsamaisAva" + + "raisAymaraAsarbaideànaisBashkirBealaruisisBulgaraisBislamaBambaraBea" + + "ngailisTibeitisBreatnaisBosnaisCatalanaisDeideanaisChamorroCorsaisCr" + + "eeSeacaisSlàbhais na h-EaglaiseChuvashCuimrisDanmhairgisGearmailtisD" + + "ivehiDzongkhaEweGreugaisBeurlaEsperantoSpàinntisEastoinisBasgaisPeir" + + "sisFulahFionnlannaisFìdisFàrothaisFraingisFrìoslannais ShiarachGaeil" + + "geGàidhligGailìsisGuaraníGujaratiGaelgHausaEabhraHindisHiri MotuCròt" + + "haisisCrìtheol HaidhtiUngairisAirmeinisHereroInterlinguaInnd-InnsisI" + + "nterlingueIgboYi SichuanInupiaqIdoInnis TìlisEadailtisInuktitutSeapa" + + "naisDeàbhanaisCairtbheilisKongoKikuyuKuanyamaCasachaisKalaallisutCmè" + + "arKannadaCoirèanaisKanuriCaismirisCùrdaisKomiCòrnaisCìorgasaisLaidea" + + "nnLugsamburgaisGandaCànan LimburgLingalaLàthoLiotuainisLuba-KatangaL" + + "aitbheisMalagasaisMarshallaisMāoriMasadonaisMalayalamMongolaisMarath" + + "iMalaidhisMaltaisBurmaisNabhruNdebele ThuathachNeapàlaisNdongaDuitsi" + + "sNynorsk na NirribhidhBokmål na NirribhidhNdebele DheasachNavajoChic" + + "hewaOgsatanaisOjibwaOromoOdiaOsseticPanjabiPaliPòlainnisPashtoPortag" + + "ailisCeatsuaRumainsKirundiRomàinisRuisisKinyarwandaSanskritSàrdaisSi" + + "ndhiSàmais ThuathachSangoSinhalaSlòbhacaisSlòbhainisSamothaisShonaSo" + + "màilisAlbàinisSèirbisSwatiLeasotach DheasachCànan SundaSuainisKiswah" + + "iliTaimilisTeluguTaidigisTàidhTigrinyaTurcmanaisTswanaTongaisTurcais" + + "TsongaTataraisCànan TahitiÙigiuraisUcràinisÙrduUsbagaisVendaBhiet-Na" + + "maisVolapükWalloonWolofXhosaIùdhaisIorubaZhuangSìnisZuluBasa AcèhAco" + + "liAdangmeAdygheArabais ThuiniseachAfrihiliAghemAinuAcadaisAlabamaAle" + + "utaisAlbàinis GhegeachSeann-BheurlaAngikaAramaisMapucheAraonaArapaho" + + "Arabais AildireachArawakArabais MhorocachArabais ÈipheiteachAsuCainn" + + "t-shanais na h-AimeireagaAstùraisKotavaAwadhiBaluchìCànan BaliBasaaB" + + "amunBatak TobaGhomalaBejaBembaBetawiBenaBafutBadagaBalochi ShiarachB" + + "hojpuriBikolBiniBanjarKomSiksikaBishnupriyaBakhtiariBrajBrahuiBodoAk" + + "ooseBuriatCànan nam BugisBuluBlinMedumbaCaddoCaribCayugaAtsamCebuano" + + "ChigaChibchaChagataiCànan ChuukMariChinuk WawaChoctawChipewyanCherok" + + "eeCheyenneCùrdais SoranîCoptaisCapiznonTurcais ChriomachCaisiubaisDa" + + "kotaDargwaTaitaDelawareSlaveyDogribDinkaZarmaDogriSòrbais Ìochdarach" + + "Dusun MheadhanachDualaMeadhan-DhuitsisJola-FonyiDyulaDazagaEmbuEfikÈ" + + "ipheitis ÀrsaidhEkajukElamaisMeadhan-BheurlaYupik MheadhanachEwondoC" + + "ànan na h-ExtremaduraFangFilipinisMeänkieliFonFraingis nan CajunMea" + + "dhan-FhraingisSeann-FhraingisArpitanFrìoslannais ThuathachFrìoslanna" + + "is EarachFriùilisGaGagauzGanGayoGbayaDari ZoroastrachGe’ezCiribeasai" + + "sGilakiMeadhan-Àrd-GearmailtisSeann-Àrd-GearmailtisKonkani GoaGondiG" + + "orontaloGotaisGreboGreugais ÀrsaidhGearmailtis EilbheiseachWayuuFraf" + + "raGusiiGwichʼinHaidaHakkaCànan Hawai’iHindis FhìditheachHiligaynonCà" + + "nan HetHmongSòrbais UachdarachXiangHupaIbanIbibioIlokoIngushBeurla C" + + "rìtheolach DiameugaLojbanNgombaMachamePeirsis IùdhachArabais Iùdhach" + + "Kara-KalpakKabyleKachinJjuKambaKawiKanembuTyapMakondeKabuverdianuKen" + + "yangKoroKaingangKhasiCànan KhotanKoyra ChiiniKhowarKirmanjkiKakoKale" + + "njinKimbunduKomi-PermyakKonkaniKpelleKarachay-BalkarKrioKinaray-aKur" + + "ukhShambalaBafiaKumykKutenaiLadinoLangiLahndaLambaLingua Franca Nova" + + "LiogùraisLakhótaLombardaisMongoLoziLuri ThuathachLuba-LuluaLuiseñoLu" + + "ndaLuoMizoLuyiaSìnis an LitreachaisLazCànan MadhuraMafaMagahiMaithil" + + "iMakasarMandingoMaasaiMabaMokshaMandarMendeMeruMorisyenMeadhan-Ghaei" + + "lgeMakhuwa-MeettoMeta’Mi’kmaqMinangkabauManchuManipuriMohawkMossiMar" + + "i ShiarachMundangIomadh cànanCreekMarwariMentawaiMyeneErzyaMazandera" + + "niMin NanNamaGearmailtis ÌochdarachNewariNiasCànan NiueAo NagaKwasio" + + "NgiemboonNogaiSeann-LochlannaisNovialN’KoLeasotais ThuathachNuerNewa" + + "ri ChlasaigeachNyamweziNyankoleNyoroNzimaOsageTurcais OtomanachPanga" + + "sinanPahlaviPampangaPapiamentoPalabhaisPicardGearmailtis Phennsylvan" + + "iaPlautdietschSeann-PheirsisPhenicisPiedmonteseCànan PohnpeiPruisisS" + + "eann-PhrovençalK’iche’Quichua Àrd-tìr ChimborazoRajasthaniRapa NuiCà" + + "nan RarotongaRomagnolRomboRomanaisRusynRovianaRwaSandaweSachaisArama" + + "is ShamaritanachSamburuSasakSantaliSaurashtraNgambaySanguSisilisAlba" + + "isSassareseCùrdais DheasachSenecaSenaSeriSelkupKoyraboro SenniSeann-" + + "GhaeilgeTachelhitShanArabais SeàdachSidamoSelayarSàmais DheasachSàma" + + "is LuleSàmais InariSàmais SkoltSoninkeSranan TongoSererSahoSukumaSus" + + "uCànan SumerComoraisKiswahili na CongoSuraidheac ChlasaigeachSuraidh" + + "eacTuluTimneTesoTerênaTetumTigreTivTokelauTsakhurKlingonTlingitTalys" + + "hTamashekNyasa TongaTok PisinTuroyoTarokoTsimshianTatiTumbukaTubhalu" + + "TasawaqCànan TuvaTamazight Meadhan na h-AtlasUdmurtUmbunduRootVaiVep" + + "sFlannrais SiarachVõroVunjoGearmailtis WallisWolayttaWarayWashoWarlp" + + "iriWuKalmykSogaYaoCànan YapYangbenYembaNheengatuCantonaisZapotecComh" + + "arran BlissCànan ZeelandZenagaTamazight Stannardach MorocoZuñiSusbai" + + "nt nach eil ’na chànanZazakiNuadh-Arabais StannardachGearmailtis na " + + "h-OstaireÀrd-Ghearmailtis na h-EilbheiseBeurla AstràiliaBeurla Chana" + + "daBeurla BhreatainnBeurla na h-AimeireagaSpàinntis na h-Aimeireaga L" + + "aidinneachSpàinntis EòrpachSpàinntis MheagsagachFraingis ChanadaFrai" + + "ngis EilbheiseachSagsannais ÌochdarachFlannraisPortagailis Bhraisile" + + "achPortagailis EòrpachMoldobhaisSèirb-ChròthaisisSìnis ShimplichteSì" + + "nis Thradaiseanta", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000d, 0x0017, 0x0021, 0x0025, 0x002e, 0x0037, + 0x003e, 0x0045, 0x004c, 0x0052, 0x0061, 0x0068, 0x0073, 0x007c, + 0x0083, 0x008a, 0x0094, 0x009c, 0x00a5, 0x00ac, 0x00b6, 0x00c0, + 0x00c8, 0x00cf, 0x00d3, 0x00da, 0x00f1, 0x00f8, 0x00ff, 0x010a, + 0x0115, 0x011b, 0x0123, 0x0126, 0x012e, 0x0134, 0x013d, 0x0147, + 0x0150, 0x0157, 0x015e, 0x0163, 0x016f, 0x0175, 0x017f, 0x0187, + 0x019d, 0x01a4, 0x01ad, 0x01b6, 0x01be, 0x01c6, 0x01cb, 0x01d0, + 0x01d6, 0x01dc, 0x01e5, 0x01f0, 0x0201, 0x0209, 0x0212, 0x0218, + // Entry 40 - 7F + 0x0223, 0x022e, 0x0239, 0x023d, 0x0247, 0x024e, 0x0251, 0x025d, + 0x0266, 0x026f, 0x0278, 0x0283, 0x028f, 0x0294, 0x029a, 0x02a2, + 0x02ab, 0x02b6, 0x02bc, 0x02c3, 0x02ce, 0x02d4, 0x02dd, 0x02e5, + 0x02e9, 0x02f1, 0x02fc, 0x0304, 0x0311, 0x0316, 0x0324, 0x032b, + 0x0331, 0x033b, 0x0347, 0x0350, 0x035a, 0x0365, 0x036b, 0x0375, + 0x037e, 0x0387, 0x038e, 0x0397, 0x039e, 0x03a5, 0x03ab, 0x03bc, + 0x03c6, 0x03cc, 0x03d3, 0x03e8, 0x03fd, 0x040d, 0x0413, 0x041b, + 0x0425, 0x042b, 0x0430, 0x0434, 0x043b, 0x0442, 0x0446, 0x0450, + // Entry 80 - BF + 0x0456, 0x0461, 0x0468, 0x046f, 0x0476, 0x047f, 0x0485, 0x0490, + 0x0498, 0x04a0, 0x04a6, 0x04b7, 0x04bc, 0x04c3, 0x04ce, 0x04d9, + 0x04e2, 0x04e7, 0x04f0, 0x04f9, 0x0501, 0x0506, 0x0518, 0x0524, + 0x052b, 0x0534, 0x053c, 0x0542, 0x054a, 0x0550, 0x0558, 0x0562, + 0x0568, 0x056f, 0x0576, 0x057c, 0x0584, 0x0591, 0x059b, 0x05a4, + 0x05a9, 0x05b1, 0x05b6, 0x05c2, 0x05ca, 0x05d1, 0x05d6, 0x05db, + 0x05e3, 0x05e9, 0x05ef, 0x05f5, 0x05f9, 0x0603, 0x0608, 0x060f, + 0x0615, 0x0628, 0x0630, 0x0635, 0x0639, 0x0640, 0x0647, 0x064f, + // Entry C0 - FF + 0x0661, 0x0661, 0x066e, 0x0674, 0x067b, 0x0682, 0x0688, 0x068f, + 0x06a1, 0x06a7, 0x06b8, 0x06cc, 0x06cf, 0x06ed, 0x06f6, 0x06fc, + 0x0702, 0x070a, 0x0715, 0x0715, 0x071a, 0x071f, 0x0729, 0x0730, + 0x0734, 0x0739, 0x073f, 0x0743, 0x0748, 0x074e, 0x075e, 0x0766, + 0x076b, 0x076f, 0x0775, 0x0778, 0x077f, 0x078a, 0x0793, 0x0797, + 0x079d, 0x07a1, 0x07a7, 0x07ad, 0x07bd, 0x07c1, 0x07c5, 0x07cc, + 0x07d1, 0x07d6, 0x07dc, 0x07e1, 0x07e8, 0x07ed, 0x07f4, 0x07fc, + 0x0808, 0x080c, 0x0817, 0x081e, 0x0827, 0x082f, 0x0837, 0x0847, + // Entry 100 - 13F + 0x084e, 0x0856, 0x0867, 0x0871, 0x0877, 0x087d, 0x0882, 0x088a, + 0x0890, 0x0896, 0x089b, 0x08a0, 0x08a5, 0x08b9, 0x08ca, 0x08cf, + 0x08df, 0x08e9, 0x08ee, 0x08f4, 0x08f8, 0x08fc, 0x08fc, 0x090f, + 0x0915, 0x091c, 0x092b, 0x093c, 0x0942, 0x0959, 0x095d, 0x0966, + 0x0970, 0x0973, 0x0985, 0x0996, 0x09a5, 0x09ac, 0x09c3, 0x09d7, + 0x09e0, 0x09e2, 0x09e8, 0x09eb, 0x09ef, 0x09f4, 0x0a04, 0x0a0b, + 0x0a16, 0x0a1c, 0x0a34, 0x0a4a, 0x0a55, 0x0a5a, 0x0a63, 0x0a69, + 0x0a6e, 0x0a7f, 0x0a97, 0x0a9c, 0x0aa2, 0x0aa7, 0x0ab0, 0x0ab5, + // Entry 140 - 17F + 0x0aba, 0x0aca, 0x0add, 0x0ae7, 0x0af1, 0x0af6, 0x0b09, 0x0b0e, + 0x0b12, 0x0b16, 0x0b1c, 0x0b21, 0x0b27, 0x0b27, 0x0b43, 0x0b49, + 0x0b4f, 0x0b56, 0x0b66, 0x0b76, 0x0b76, 0x0b81, 0x0b87, 0x0b8d, + 0x0b90, 0x0b95, 0x0b99, 0x0b99, 0x0ba0, 0x0ba4, 0x0bab, 0x0bb7, + 0x0bbe, 0x0bc2, 0x0bca, 0x0bcf, 0x0bdc, 0x0be8, 0x0bee, 0x0bf7, + 0x0bfb, 0x0c03, 0x0c0b, 0x0c17, 0x0c1e, 0x0c1e, 0x0c24, 0x0c33, + 0x0c37, 0x0c40, 0x0c40, 0x0c46, 0x0c4e, 0x0c53, 0x0c53, 0x0c58, + 0x0c5f, 0x0c65, 0x0c6a, 0x0c70, 0x0c75, 0x0c75, 0x0c87, 0x0c91, + // Entry 180 - 1BF + 0x0c91, 0x0c99, 0x0ca3, 0x0ca8, 0x0cac, 0x0cba, 0x0cba, 0x0cc4, + 0x0ccc, 0x0cd1, 0x0cd4, 0x0cd8, 0x0cdd, 0x0cf2, 0x0cf5, 0x0d03, + 0x0d07, 0x0d0d, 0x0d15, 0x0d1c, 0x0d24, 0x0d2a, 0x0d2e, 0x0d34, + 0x0d3a, 0x0d3f, 0x0d43, 0x0d4b, 0x0d5b, 0x0d69, 0x0d70, 0x0d79, + 0x0d84, 0x0d8a, 0x0d92, 0x0d98, 0x0d9d, 0x0daa, 0x0db1, 0x0dbe, + 0x0dc3, 0x0dc3, 0x0dca, 0x0dd2, 0x0dd7, 0x0ddc, 0x0de7, 0x0dee, + 0x0dee, 0x0df2, 0x0e09, 0x0e0f, 0x0e13, 0x0e1e, 0x0e25, 0x0e2b, + 0x0e34, 0x0e39, 0x0e4a, 0x0e50, 0x0e56, 0x0e69, 0x0e6d, 0x0e80, + // Entry 1C0 - 1FF + 0x0e88, 0x0e90, 0x0e95, 0x0e9a, 0x0e9f, 0x0eb0, 0x0eba, 0x0ec1, + 0x0ec9, 0x0ed3, 0x0edc, 0x0ee2, 0x0efb, 0x0f07, 0x0f15, 0x0f15, + 0x0f1d, 0x0f28, 0x0f28, 0x0f36, 0x0f3d, 0x0f4e, 0x0f59, 0x0f75, + 0x0f7f, 0x0f87, 0x0f97, 0x0f9f, 0x0f9f, 0x0fa4, 0x0fac, 0x0fac, + 0x0fb1, 0x0fb8, 0x0fb8, 0x0fbb, 0x0fc2, 0x0fc9, 0x0fde, 0x0fe5, + 0x0fea, 0x0ff1, 0x0ffb, 0x1002, 0x1007, 0x100e, 0x1014, 0x101d, + 0x102e, 0x1034, 0x1038, 0x103c, 0x1042, 0x1051, 0x105f, 0x105f, + 0x1068, 0x106c, 0x107c, 0x1082, 0x1082, 0x1089, 0x1099, 0x10a5, + // Entry 200 - 23F + 0x10b2, 0x10bf, 0x10c6, 0x10c6, 0x10d2, 0x10d7, 0x10db, 0x10db, + 0x10e1, 0x10e5, 0x10f1, 0x10f9, 0x110b, 0x1122, 0x112c, 0x112c, + 0x1130, 0x1135, 0x1139, 0x1140, 0x1145, 0x114a, 0x114d, 0x1154, + 0x115b, 0x1162, 0x1169, 0x116f, 0x1177, 0x1182, 0x118b, 0x1191, + 0x1197, 0x1197, 0x11a0, 0x11a4, 0x11ab, 0x11b2, 0x11b9, 0x11c4, + 0x11e0, 0x11e6, 0x11e6, 0x11ed, 0x11f1, 0x11f4, 0x11f4, 0x11f8, + 0x1209, 0x1209, 0x1209, 0x120e, 0x1213, 0x1225, 0x122d, 0x1232, + 0x1237, 0x123f, 0x1241, 0x1247, 0x1247, 0x124b, 0x124e, 0x1258, + // Entry 240 - 27F + 0x125f, 0x1264, 0x126d, 0x1276, 0x127d, 0x128c, 0x129a, 0x12a0, + 0x12bc, 0x12c1, 0x12e0, 0x12e6, 0x12ff, 0x12ff, 0x1317, 0x1337, + 0x1348, 0x1356, 0x1367, 0x137d, 0x13a3, 0x13b6, 0x13cc, 0x13cc, + 0x13dc, 0x13f1, 0x1407, 0x1410, 0x1428, 0x143c, 0x1446, 0x1459, + 0x146b, 0x147f, + }, + }, + { // gl + "abkhazoafrikaansakánamáricoaragonésárabeassamésaimaráacerbaixanobaskirbi" + + "elorrusobúlgarobmbengalítibetanobretónbosniocatalánChechenocorsochec" + + "oeslavo eclesiásticoChuvashgalésdinamarquésalemándivehidzongkhaewégr" + + "egoinglésesperantoespañolestonianoéuscaropersafinésfixianofaroésfran" + + "césfrisónirlandésgaélico escocésgalegoguaraníguxaratianomanxhausaheb" + + "reohindicroatahaitianohúngaroarmeniointerlinguaindonesioiboyi sichua" + + "nésislandésitalianoiuxaponésxavanésxeorxianokongokikuyucasacoklcambo" + + "dianokannadacoreanocachemirkurdokwquirguizlatínluxemburguésgandaling" + + "alalaotianolituanoluba-Katangaletónmalgaxemaorímacedoniomalabarmongo" + + "lmarathimalaiomaltésbirmanondebele do nortenepalíholandésnoruegués n" + + "ynorsknoruegués bokmalchewaoccitanooromooriyaosetiopunjabipolacopaxt" + + "únportuguésquechuaromancherundiromanésrusoruandéssánscritosindhisam" + + "i do nortesangocingaléseslovacoeslovenosamoanoshonasomalíalbanésserb" + + "ioswatisesotosondanéssuecoswahilitamiltelugutaxicotailandéstigriñatu" + + "rcomanotswanatonganésturcoxitsongatártarotahitianouigurucraínourdúuz" + + "becovendavietnamitawólofxhosayiddishiorubachinészulúacoliagqarameoma" + + "pucheasuasturianobembabezBaluchi occidentalbrxkigacheroquicurdo sora" + + "nítaitazarmadsbdualajola-fonyiembuibibioexipcio antigofilipinogagaga" + + "uzgrego antigoalemán suízogusiihawaianohsbngombamapachekabilekambama" + + "kondecaboverdianokoyra Chiiniklnkomi permiokonkanishambalabafiaLangi" + + "LakotaloziLurí do norteluba-lulualuoluyiamasaimerucrioulo mauritanom" + + "ghmgomohawkmundangvarias linguasMazandaranínaqBaixo alemánnmgnqoseso" + + "tho sa leboanusnyankolequichéromborwksaqsbpKurdo meridionalsenasesta" + + "chelhitsmasmjsmnsmsswctesotetúnklingontok pisintumbukatwqtzmLingua d" + + "escoñecidavaivunjoWarlpirisogatamazight de Marrocos estándarsen cont" + + "ido lingüísticoárabe estándar modernoalemán de austriaalto alemán su" + + "ízoinglés australianoinglés canadianoinglés británicoinglés dos Est" + + "ados Unidosespañol latinoamericanocastelánespañol de Méxicofrancés c" + + "anadianofrancés suízoBaixo saxónflamencoportugués brasileiroportugué" + + "s europeoserbocroatachinés simplificadochinés tradicional", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x0007, 0x0010, 0x0015, 0x001d, 0x0026, + 0x002c, 0x0034, 0x0034, 0x003b, 0x0046, 0x004c, 0x0056, 0x005e, + 0x005e, 0x0060, 0x0068, 0x0070, 0x0077, 0x007d, 0x0085, 0x008d, + 0x008d, 0x0092, 0x0092, 0x0097, 0x00ab, 0x00b2, 0x00b8, 0x00c4, + 0x00cb, 0x00d1, 0x00d9, 0x00dd, 0x00e2, 0x00e9, 0x00f2, 0x00fa, + 0x0103, 0x010b, 0x0110, 0x0110, 0x0116, 0x011d, 0x0124, 0x012c, + 0x0133, 0x013c, 0x014d, 0x0153, 0x015b, 0x0166, 0x016a, 0x016f, + 0x0175, 0x017a, 0x017a, 0x0180, 0x0188, 0x0190, 0x0197, 0x0197, + // Entry 40 - 7F + 0x01a2, 0x01ab, 0x01ab, 0x01ae, 0x01bb, 0x01bb, 0x01bb, 0x01c4, + 0x01cc, 0x01ce, 0x01d6, 0x01de, 0x01e7, 0x01ec, 0x01f2, 0x01f2, + 0x01f8, 0x01fa, 0x0204, 0x020b, 0x0212, 0x0212, 0x021a, 0x021f, + 0x021f, 0x0221, 0x0229, 0x022f, 0x023c, 0x0241, 0x0241, 0x0248, + 0x0250, 0x0257, 0x0263, 0x0269, 0x0270, 0x0270, 0x0276, 0x027f, + 0x0286, 0x028c, 0x0293, 0x0299, 0x02a0, 0x02a7, 0x02a7, 0x02b7, + 0x02be, 0x02be, 0x02c7, 0x02d9, 0x02ea, 0x02ea, 0x02ea, 0x02ef, + 0x02f7, 0x02f7, 0x02fc, 0x0301, 0x0307, 0x030e, 0x030e, 0x0314, + // Entry 80 - BF + 0x031b, 0x0325, 0x032c, 0x0334, 0x0339, 0x0341, 0x0345, 0x034d, + 0x0357, 0x0357, 0x035d, 0x036a, 0x036f, 0x0378, 0x0380, 0x0388, + 0x038f, 0x0394, 0x039b, 0x03a3, 0x03a9, 0x03ae, 0x03b4, 0x03bd, + 0x03c2, 0x03c9, 0x03ce, 0x03d4, 0x03da, 0x03e4, 0x03ec, 0x03f5, + 0x03fb, 0x0404, 0x0409, 0x0411, 0x0419, 0x0422, 0x0427, 0x042f, + 0x0434, 0x043a, 0x043f, 0x0449, 0x0449, 0x0449, 0x044f, 0x0454, + 0x045b, 0x0461, 0x0461, 0x0468, 0x046d, 0x046d, 0x0472, 0x0472, + 0x0472, 0x0472, 0x0472, 0x0475, 0x0475, 0x0475, 0x0475, 0x0475, + // Entry C0 - FF + 0x0475, 0x0475, 0x0475, 0x0475, 0x047b, 0x0482, 0x0482, 0x0482, + 0x0482, 0x0482, 0x0482, 0x0482, 0x0485, 0x0485, 0x048e, 0x048e, + 0x048e, 0x048e, 0x048e, 0x048e, 0x048e, 0x048e, 0x048e, 0x048e, + 0x048e, 0x0493, 0x0493, 0x0496, 0x0496, 0x0496, 0x04a8, 0x04a8, + 0x04a8, 0x04a8, 0x04a8, 0x04a8, 0x04a8, 0x04a8, 0x04a8, 0x04a8, + 0x04a8, 0x04ab, 0x04ab, 0x04ab, 0x04ab, 0x04ab, 0x04ab, 0x04ab, + 0x04ab, 0x04ab, 0x04ab, 0x04ab, 0x04ab, 0x04af, 0x04af, 0x04af, + 0x04af, 0x04af, 0x04af, 0x04af, 0x04af, 0x04b7, 0x04b7, 0x04c4, + // Entry 100 - 13F + 0x04c4, 0x04c4, 0x04c4, 0x04c4, 0x04c4, 0x04c4, 0x04c9, 0x04c9, + 0x04c9, 0x04c9, 0x04c9, 0x04ce, 0x04ce, 0x04d1, 0x04d1, 0x04d6, + 0x04d6, 0x04e0, 0x04e0, 0x04e0, 0x04e4, 0x04ea, 0x04ea, 0x04f8, + 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x04f8, 0x0500, + 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, 0x0500, + 0x0500, 0x0502, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, + 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, + 0x0508, 0x0514, 0x0522, 0x0522, 0x0522, 0x0527, 0x0527, 0x0527, + // Entry 140 - 17F + 0x0527, 0x052f, 0x052f, 0x052f, 0x052f, 0x052f, 0x0532, 0x0532, + 0x0532, 0x0532, 0x0532, 0x0532, 0x0532, 0x0532, 0x0532, 0x0532, + 0x0538, 0x053f, 0x053f, 0x053f, 0x053f, 0x053f, 0x0545, 0x0545, + 0x0545, 0x054a, 0x054a, 0x054a, 0x054a, 0x054a, 0x0551, 0x055d, + 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x0569, 0x0569, 0x0569, + 0x0569, 0x056c, 0x056c, 0x0577, 0x057e, 0x057e, 0x057e, 0x057e, + 0x057e, 0x057e, 0x057e, 0x057e, 0x0586, 0x058b, 0x058b, 0x058b, + 0x058b, 0x058b, 0x0590, 0x0590, 0x0590, 0x0590, 0x0590, 0x0590, + // Entry 180 - 1BF + 0x0590, 0x0596, 0x0596, 0x0596, 0x059a, 0x05a8, 0x05a8, 0x05b2, + 0x05b2, 0x05b2, 0x05b5, 0x05b5, 0x05ba, 0x05ba, 0x05ba, 0x05ba, + 0x05ba, 0x05ba, 0x05ba, 0x05ba, 0x05ba, 0x05bf, 0x05bf, 0x05bf, + 0x05bf, 0x05bf, 0x05c3, 0x05d4, 0x05d4, 0x05d7, 0x05da, 0x05da, + 0x05da, 0x05da, 0x05da, 0x05e0, 0x05e0, 0x05e0, 0x05e7, 0x05f5, + 0x05f5, 0x05f5, 0x05f5, 0x05f5, 0x05f5, 0x05f5, 0x0601, 0x0601, + 0x0601, 0x0604, 0x0611, 0x0611, 0x0611, 0x0611, 0x0611, 0x0614, + 0x0614, 0x0614, 0x0614, 0x0614, 0x0617, 0x0627, 0x062a, 0x062a, + // Entry 1C0 - 1FF + 0x062a, 0x0632, 0x0632, 0x0632, 0x0632, 0x0632, 0x0632, 0x0632, + 0x0632, 0x0632, 0x0632, 0x0632, 0x0632, 0x0632, 0x0632, 0x0632, + 0x0632, 0x0632, 0x0632, 0x0632, 0x0632, 0x0632, 0x0639, 0x0639, + 0x0639, 0x0639, 0x0639, 0x0639, 0x0639, 0x063e, 0x063e, 0x063e, + 0x063e, 0x063e, 0x063e, 0x0641, 0x0641, 0x0641, 0x0641, 0x0644, + 0x0644, 0x0644, 0x0644, 0x0644, 0x0647, 0x0647, 0x0647, 0x0647, + 0x0657, 0x0657, 0x065b, 0x065b, 0x065b, 0x065e, 0x065e, 0x065e, + 0x0667, 0x0667, 0x0667, 0x0667, 0x0667, 0x0667, 0x066a, 0x066d, + // Entry 200 - 23F + 0x0670, 0x0673, 0x0673, 0x0673, 0x0673, 0x0673, 0x0673, 0x0673, + 0x0673, 0x0673, 0x0673, 0x0673, 0x0676, 0x0676, 0x0676, 0x0676, + 0x0676, 0x0676, 0x067a, 0x067a, 0x0680, 0x0680, 0x0680, 0x0680, + 0x0680, 0x0687, 0x0687, 0x0687, 0x0687, 0x0687, 0x0690, 0x0690, + 0x0690, 0x0690, 0x0690, 0x0690, 0x0697, 0x0697, 0x069a, 0x069a, + 0x069d, 0x069d, 0x069d, 0x069d, 0x06b0, 0x06b3, 0x06b3, 0x06b3, + 0x06b3, 0x06b3, 0x06b3, 0x06b3, 0x06b8, 0x06b8, 0x06b8, 0x06b8, + 0x06b8, 0x06c0, 0x06c0, 0x06c0, 0x06c0, 0x06c4, 0x06c4, 0x06c4, + // Entry 240 - 27F + 0x06c4, 0x06c4, 0x06c4, 0x06c4, 0x06c4, 0x06c4, 0x06c4, 0x06c4, + 0x06e3, 0x06e3, 0x06fc, 0x06fc, 0x0714, 0x0714, 0x0726, 0x0739, + 0x074c, 0x075d, 0x076f, 0x0789, 0x07a1, 0x07aa, 0x07bd, 0x07bd, + 0x07cf, 0x07de, 0x07ea, 0x07f2, 0x0807, 0x0819, 0x0819, 0x0824, + 0x0838, 0x084b, + }, + }, + { // gsw + "AfarAbchasischAvestischAfrikaansAkanAmharischAragonesischArabischAssames" + + "ischAwarischAymaraAserbaidschanischBaschkirischWiissrussischBulgaari" + + "schBislamaBambaraBengalischTibeetischBrötoonischBosnischKatalaanisch" + + "TschetscheenischChamorroKorsischCreeTschechischChileslawischTschuwas" + + "chischWalisischTänischTüütschMalediivischDschongkhaEweGriechischÄngl" + + "ischEschperantoSchpanischEestnischBaskischPersischFulFinnischFidschi" + + "anischFäröischFranzösischFriesischIirischSchottisch-GäälischGalizisc" + + "hGuaraniGujaratiManx-GäälischHaussaHebräischHindiHiri-MotuKroazischH" + + "aitischUngarischArmenischHereroInterlinguaIndonesischInterlingueIgbo" + + "Sezuanischs YiInupiakIdoIisländischItaliänischInukitutJapanischJavan" + + "ischGeorgischKongolesischKikuyu-SchpraachKwanyamaKasachischGröönländ" + + "ischKambodschanischKannadaKoreaanischKanuri-SchpraachKaschmirischKur" + + "dischKomi-SchpraachKornischKirgiisischLatiinLuxemburgischGanda-Schpr" + + "aachLimburgischLingalaLaozischLitauischLubaLettischMadagassischMarsc" + + "hallesischMaoriMazedonischMalayalamMongolischMarathiMalaiischMaltesi" + + "schBirmanischNauruischNord-Ndebele-SchpraachNepalesischNdongaNiderlä" + + "ndischNorwegisch NynorskNorwegisch BokmålSüüd-Ndebele-SchpraachNavaj" + + "o-SchpraachChewa-SchpraachOkzitanischOjibwa-SchpraachOromoOrijaOssez" + + "ischPandschabischPaliPolnischPaschtuPortugiisischQuechuaRätoromanisc" + + "hRundi-SchpraachRumänischRussischRuandischSanschkritSardischSindhiNo" + + "rd-SamischSangoSinghalesischSlowakischSlowenischSamoanischSchhonaSom" + + "aliAlbanischSerbischSwaziSüüd-Sotho-SchpraachSundanesischSchwedischS" + + "uaheliTamilischTeluguTadschikischThailändischTigrinjaTurkmenischTswa" + + "na-SchpraachTongaischTürkischTsongaTatarischTahitischUigurischUkrain" + + "ischUrduUsbekischVenda-SchpraachVietnamesischVolapükWallonischWolofX" + + "hosaJiddischYorubaZhuangChineesischZuluAcehAcholiAdangmeAdygaiAfrihi" + + "liAinuAkkadischAleutischSüüd-AltaischAltänglischAngikaAramääischArau" + + "kanischArapahoArawakAschturianischAwadhiBelutschischBalinesischBasaa" + + "BedauyeBembaBhodschpuriBikolischBiniBlackfoot-SchpraachBraj-BhakhaBu" + + "rjatischBugineesischBlinCaddoKariibischAtsamCebuanoTschibtschaTschag" + + "ataischTrukesischTscheremissischChinookChoctawChipewyanCherokeeCheye" + + "nneKoptischKrimtatarischKaschubischTakotaTargiinischDelaware-Schpraa" + + "chSlaveyTogribTinkaTogriNidersorbischTualaMittelniderländischTiulaEf" + + "ikischAltägyptischEkajukElamischMittelänglischEwondoPangwe-Schpraach" + + "FilipinoFonMittelfranzösischAltfranzösischNordfriesischOschtfriesisc" + + "hFriulischGaGayoGbayaGeezGilbertesischMittelhochtüütschAlthochtüütsc" + + "hGondiMongondouGotischGreboAltgriechischSchwiizertüütschKutchinischH" + + "aidaHawaiianischHiligaynonischHethitischMiaoObersorbischHupaIbanisch" + + "IlokanoInguschischLojbanischJüüdisch-PersischJüüdisch-ArabischKaraka" + + "lpakischKabylischKachin-SchpraachJjuKambaKawiKabardinischTyapKoroKha" + + "sischSakischKimbundu-SchpraachKonkaniKosraeanischKpelle-SchpraachKar" + + "atschaiisch-BalkarischKarelischOraon-SchpraachKumükischKutenai-Schpr" + + "aachLadinoLahndanischLambanischLesgischMongoRotse-SchpraachLuba-Lulu" + + "aLuiseno-SchpraachLunda-SchpraachLuo-SchpraachLushai-SchpraachMadure" + + "sischKhottaMaithiliMakassarischManding-SchpraachMassai-SchpraachMoks" + + "chamordwinischMandaresischMende-SchpraachMittelirischMicmac-Schpraac" + + "hMinangkabau-SchpraachMandschurischMeithei-SchpraachMohawk-Schpraach" + + "Mossi-SchpraachMehrschpraachigMuskogee-SchpraachMirandesischMarwaris" + + "chErzyaNeapolitanischNidertüütschNewarischNias-SchpraachNiue-Schpraa" + + "chNogaischAltnordischN’KoNord-Sotho-SchpraachAlt-NewariNyamwezi-Schp" + + "raachNyankoleNyoroNzimaOsage-SchpraachOsmanischPangasinanischMittelp" + + "ersischPampanggan-SchpraachPapiamentoPalauAltpersischPhönikischPonap" + + "eanischAltprovenzalischRajasthaniOschterinsel-SchpraachRarotonganisc" + + "hZigüünerschpraachAromunischSandawe-SchpraachJakutischSamaritanischS" + + "asakSantaliSizilianischSchottischSelkupischAltirischSchan-SchpraachS" + + "idamoSüüd-SamischLule-SamischInari-SamischSkolt-SamischSoninke-Schpr" + + "aachSogdischSrananischSerer-SchpraachSukuma-SchpraachSusuSumerischAl" + + "tsyrischSyrischTemneTereno-SchpraachTetum-SchpraachTigreTiv-Schpraac" + + "hTokelauanischKlingonischTlingit-SchpraachTamaseqTsonga-SchpraachNeu" + + "melanesischTsimshian-SchpraachTumbuka-SchpraachElliceanischTuwinisch" + + "UdmurtischUgaritischMbundu-SchpraachRootVai-SchpraachWotischWalamo-S" + + "chpraachWarayWasho-SchpraachKalmückischYao-SchpraachYapesischZapotek" + + "ischBliss-SymboolZenagaZuni-SchpraachKän schpraachliche InhaltZazaÖs" + + "chtriichischs TüütschSchwiizer HochtüütschAuschtralischs ÄnglischKan" + + "adischs ÄnglischBritischs ÄnglischAmerikanischs ÄnglischLatiinamerik" + + "anischs SchpanischIbeerischs SchpanischKanadischs FranzösischSchwiiz" + + "er FranzösischFläämischBrasilianischs PortugiisischIberischs Portugi" + + "isischMoldawischSerbo-KroatischVeräifachts ChineesischTradizionells " + + "Chineesisch", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000e, 0x0017, 0x0020, 0x0024, 0x002d, 0x0039, + 0x0041, 0x004c, 0x0054, 0x005a, 0x006b, 0x0077, 0x0084, 0x008f, + 0x0096, 0x009d, 0x00a7, 0x00b1, 0x00bd, 0x00c5, 0x00d1, 0x00e1, + 0x00e9, 0x00f1, 0x00f5, 0x0100, 0x010d, 0x011b, 0x0124, 0x012c, + 0x0135, 0x0141, 0x014b, 0x014e, 0x0158, 0x0161, 0x016c, 0x0176, + 0x017f, 0x0187, 0x018f, 0x0192, 0x019a, 0x01a7, 0x01b1, 0x01bd, + 0x01c6, 0x01cd, 0x01e2, 0x01eb, 0x01f2, 0x01fa, 0x0209, 0x020f, + 0x0219, 0x021e, 0x0227, 0x0230, 0x0238, 0x0241, 0x024a, 0x0250, + // Entry 40 - 7F + 0x025b, 0x0266, 0x0271, 0x0275, 0x0283, 0x028a, 0x028d, 0x0299, + 0x02a5, 0x02ad, 0x02b6, 0x02bf, 0x02c8, 0x02d4, 0x02e4, 0x02ec, + 0x02f6, 0x0306, 0x0315, 0x031c, 0x0327, 0x0337, 0x0343, 0x034b, + 0x0359, 0x0361, 0x036c, 0x0372, 0x037f, 0x038e, 0x0399, 0x03a0, + 0x03a8, 0x03b1, 0x03b5, 0x03bd, 0x03c9, 0x03d8, 0x03dd, 0x03e8, + 0x03f1, 0x03fb, 0x0402, 0x040b, 0x0415, 0x041f, 0x0428, 0x043e, + 0x0449, 0x044f, 0x045d, 0x046f, 0x0481, 0x0499, 0x04a9, 0x04b8, + 0x04c3, 0x04d3, 0x04d8, 0x04dd, 0x04e6, 0x04f3, 0x04f7, 0x04ff, + // Entry 80 - BF + 0x0506, 0x0513, 0x051a, 0x0528, 0x0537, 0x0541, 0x0549, 0x0552, + 0x055c, 0x0564, 0x056a, 0x0576, 0x057b, 0x0588, 0x0592, 0x059c, + 0x05a6, 0x05ad, 0x05b3, 0x05bc, 0x05c4, 0x05c9, 0x05df, 0x05eb, + 0x05f5, 0x05fc, 0x0605, 0x060b, 0x0617, 0x0624, 0x062c, 0x0637, + 0x0647, 0x0650, 0x0659, 0x065f, 0x0668, 0x0671, 0x067a, 0x0684, + 0x0688, 0x0691, 0x06a0, 0x06ad, 0x06b5, 0x06bf, 0x06c4, 0x06c9, + 0x06d1, 0x06d7, 0x06dd, 0x06e8, 0x06ec, 0x06f0, 0x06f6, 0x06fd, + 0x0703, 0x0703, 0x070b, 0x070b, 0x070f, 0x0718, 0x0718, 0x0721, + // Entry C0 - FF + 0x0721, 0x0730, 0x073c, 0x0742, 0x074e, 0x0759, 0x0759, 0x0760, + 0x0760, 0x0766, 0x0766, 0x0766, 0x0766, 0x0766, 0x0774, 0x0774, + 0x077a, 0x0786, 0x0791, 0x0791, 0x0796, 0x0796, 0x0796, 0x0796, + 0x079d, 0x07a2, 0x07a2, 0x07a2, 0x07a2, 0x07a2, 0x07a2, 0x07ad, + 0x07b6, 0x07ba, 0x07ba, 0x07ba, 0x07cd, 0x07cd, 0x07cd, 0x07d8, + 0x07d8, 0x07d8, 0x07d8, 0x07e2, 0x07ee, 0x07ee, 0x07f2, 0x07f2, + 0x07f7, 0x0801, 0x0801, 0x0806, 0x080d, 0x080d, 0x0818, 0x0825, + 0x082f, 0x083e, 0x0845, 0x084c, 0x0855, 0x085d, 0x0865, 0x0865, + // Entry 100 - 13F + 0x086d, 0x086d, 0x087a, 0x0885, 0x088b, 0x0896, 0x0896, 0x08a8, + 0x08ae, 0x08b4, 0x08b9, 0x08b9, 0x08be, 0x08cb, 0x08cb, 0x08d0, + 0x08e4, 0x08e4, 0x08e9, 0x08e9, 0x08e9, 0x08f1, 0x08f1, 0x08fe, + 0x0904, 0x090c, 0x091b, 0x091b, 0x0921, 0x0921, 0x0931, 0x0939, + 0x0939, 0x093c, 0x093c, 0x094e, 0x095d, 0x095d, 0x096a, 0x0978, + 0x0981, 0x0983, 0x0983, 0x0983, 0x0987, 0x098c, 0x098c, 0x0990, + 0x099d, 0x099d, 0x09b0, 0x09c0, 0x09c0, 0x09c5, 0x09ce, 0x09d5, + 0x09da, 0x09e7, 0x09f9, 0x09f9, 0x09f9, 0x09f9, 0x0a04, 0x0a09, + // Entry 140 - 17F + 0x0a09, 0x0a15, 0x0a15, 0x0a23, 0x0a2d, 0x0a31, 0x0a3d, 0x0a3d, + 0x0a41, 0x0a49, 0x0a49, 0x0a50, 0x0a5b, 0x0a5b, 0x0a5b, 0x0a65, + 0x0a65, 0x0a65, 0x0a78, 0x0a8b, 0x0a8b, 0x0a99, 0x0aa2, 0x0ab2, + 0x0ab5, 0x0aba, 0x0abe, 0x0aca, 0x0aca, 0x0ace, 0x0ace, 0x0ace, + 0x0ace, 0x0ad2, 0x0ad2, 0x0ada, 0x0ae1, 0x0ae1, 0x0ae1, 0x0ae1, + 0x0ae1, 0x0ae1, 0x0af3, 0x0af3, 0x0afa, 0x0b06, 0x0b16, 0x0b2f, + 0x0b2f, 0x0b2f, 0x0b38, 0x0b47, 0x0b47, 0x0b47, 0x0b47, 0x0b51, + 0x0b62, 0x0b68, 0x0b68, 0x0b73, 0x0b7d, 0x0b85, 0x0b85, 0x0b85, + // Entry 180 - 1BF + 0x0b85, 0x0b85, 0x0b85, 0x0b8a, 0x0b99, 0x0b99, 0x0b99, 0x0ba3, + 0x0bb4, 0x0bc3, 0x0bd0, 0x0be0, 0x0be0, 0x0be0, 0x0be0, 0x0beb, + 0x0beb, 0x0bf1, 0x0bf9, 0x0c05, 0x0c16, 0x0c26, 0x0c26, 0x0c38, + 0x0c44, 0x0c53, 0x0c53, 0x0c53, 0x0c5f, 0x0c5f, 0x0c5f, 0x0c6f, + 0x0c84, 0x0c91, 0x0ca2, 0x0cb2, 0x0cc1, 0x0cc1, 0x0cc1, 0x0cd0, + 0x0ce2, 0x0cee, 0x0cf8, 0x0cf8, 0x0cf8, 0x0cfd, 0x0cfd, 0x0cfd, + 0x0d0b, 0x0d0b, 0x0d19, 0x0d22, 0x0d30, 0x0d3e, 0x0d3e, 0x0d3e, + 0x0d3e, 0x0d46, 0x0d51, 0x0d51, 0x0d57, 0x0d6b, 0x0d6b, 0x0d75, + // Entry 1C0 - 1FF + 0x0d87, 0x0d8f, 0x0d94, 0x0d99, 0x0da8, 0x0db1, 0x0dbf, 0x0dcd, + 0x0de1, 0x0deb, 0x0df0, 0x0df0, 0x0df0, 0x0df0, 0x0dfb, 0x0dfb, + 0x0e06, 0x0e06, 0x0e06, 0x0e12, 0x0e12, 0x0e22, 0x0e22, 0x0e22, + 0x0e2c, 0x0e42, 0x0e50, 0x0e50, 0x0e50, 0x0e50, 0x0e63, 0x0e63, + 0x0e63, 0x0e63, 0x0e6d, 0x0e6d, 0x0e7e, 0x0e87, 0x0e94, 0x0e94, + 0x0e99, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0eac, 0x0eb6, 0x0eb6, + 0x0eb6, 0x0eb6, 0x0eb6, 0x0eb6, 0x0ec0, 0x0ec0, 0x0ec9, 0x0ec9, + 0x0ec9, 0x0ed8, 0x0ed8, 0x0ede, 0x0ede, 0x0ede, 0x0eec, 0x0ef8, + // Entry 200 - 23F + 0x0f05, 0x0f12, 0x0f23, 0x0f2b, 0x0f35, 0x0f44, 0x0f44, 0x0f44, + 0x0f54, 0x0f58, 0x0f61, 0x0f61, 0x0f61, 0x0f6b, 0x0f72, 0x0f72, + 0x0f72, 0x0f77, 0x0f77, 0x0f87, 0x0f96, 0x0f9b, 0x0fa8, 0x0fb5, + 0x0fb5, 0x0fc0, 0x0fd1, 0x0fd1, 0x0fd8, 0x0fe8, 0x0ff6, 0x0ff6, + 0x0ff6, 0x0ff6, 0x1009, 0x1009, 0x101a, 0x1026, 0x1026, 0x102f, + 0x102f, 0x1039, 0x1043, 0x1053, 0x1057, 0x1064, 0x1064, 0x1064, + 0x1064, 0x1064, 0x106b, 0x106b, 0x106b, 0x106b, 0x107b, 0x1080, + 0x108f, 0x108f, 0x108f, 0x109b, 0x109b, 0x109b, 0x10a8, 0x10b1, + // Entry 240 - 27F + 0x10b1, 0x10b1, 0x10b1, 0x10b1, 0x10bc, 0x10c9, 0x10c9, 0x10cf, + 0x10cf, 0x10dd, 0x10f7, 0x10fb, 0x10fb, 0x10fb, 0x1115, 0x112c, + 0x1144, 0x1158, 0x116b, 0x1182, 0x11a0, 0x11b5, 0x11b5, 0x11b5, + 0x11cc, 0x11e2, 0x11e2, 0x11ed, 0x1209, 0x1220, 0x122a, 0x1239, + 0x1251, 0x126a, + }, + }, + { // gu + guLangStr, + guLangIdx, + }, + { // guz + "KiakanKiamhariKiarabuKibelarusiKibulgariaKibanglaKicheckiKijerumaniKigir" + + "ikiKingerezaKihispaniaKiajemiKifaransaKihausaKihindiKihungariKiindon" + + "esiaKiigboKiitalianoKijapaniKijavaKikambodiaKikoreaKimalesiaKiburmaK" + + "inepaliKiholanziKipunjabiKipolandiKirenoKiromaniaKirusiKinyarwandaKi" + + "somaliKiswidiKitamilKitailandiKiturukiKiukraniaKiurduKivietinamuKiyo" + + "rubaKichinaKizuluEkegusii", + []uint16{ // 318 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x0029, + 0x0029, 0x0029, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, + 0x0031, 0x0031, 0x0031, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, + 0x0043, 0x0043, 0x0043, 0x0043, 0x004b, 0x0054, 0x0054, 0x005e, + 0x005e, 0x005e, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0075, + 0x0075, 0x007c, 0x007c, 0x007c, 0x007c, 0x0085, 0x0085, 0x0085, + // Entry 40 - 7F + 0x0085, 0x0090, 0x0090, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, + 0x00a0, 0x00a0, 0x00a8, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00b8, 0x00b8, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00c8, 0x00c8, 0x00cf, 0x00cf, 0x00cf, + 0x00d7, 0x00d7, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, + 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e9, 0x00e9, 0x00f2, + // Entry 80 - BF + 0x00f2, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x0101, 0x0107, 0x0112, + 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, + 0x0112, 0x0112, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, + 0x0121, 0x0121, 0x0128, 0x0128, 0x0128, 0x0132, 0x0132, 0x0132, + 0x0132, 0x0132, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, 0x0143, + 0x0149, 0x0149, 0x0149, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, + 0x0154, 0x015c, 0x015c, 0x0163, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry C0 - FF + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry 100 - 13F + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0171, + }, + }, + { // gv + "Gaelg", + []uint16{ // 55 elements + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, + }, + }, + { // ha + "AkanAmharikLarabciBelarusanciBulgaranciBengaliHarshen CakJamusanciGirkan" + + "ciTuranciIspaniyanciParisanciFaransanciHausaHarshen HindiHarshen Hun" + + "gariHarshen IndunusiyaInyamuranciItaliyanciJapananciJabananciHarshen" + + " KimarHarshen KoreyaHarshen MalaiBurmanciNepaliHolanciPunjabiHarshen" + + " PolanHarshen PortugalRomaniyanciRashanciKiniyaruwandaSomaliHarshen " + + "SuwedanTamilThaiHarshen TurkiyyaHarshen YukurenHarshen UrduHarshen B" + + "iyetinamYarbanciHarshen SinHarshen Zulu", + []uint16{ // 181 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000b, 0x000b, + 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x001d, 0x0027, + 0x0027, 0x0027, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, + 0x0042, 0x0042, 0x0042, 0x0042, 0x004a, 0x0051, 0x0051, 0x005c, + 0x005c, 0x005c, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x006f, + 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x0074, + 0x0074, 0x0081, 0x0081, 0x0081, 0x0081, 0x0090, 0x0090, 0x0090, + // Entry 40 - 7F + 0x0090, 0x00a2, 0x00a2, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, + 0x00b7, 0x00b7, 0x00c0, 0x00c9, 0x00c9, 0x00c9, 0x00c9, 0x00c9, + 0x00c9, 0x00c9, 0x00d6, 0x00d6, 0x00e4, 0x00e4, 0x00e4, 0x00e4, + 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, + 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, + 0x00e4, 0x00e4, 0x00e4, 0x00f1, 0x00f1, 0x00f9, 0x00f9, 0x00f9, + 0x00ff, 0x00ff, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, + 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x010d, 0x010d, 0x011a, + // Entry 80 - BF + 0x011a, 0x012a, 0x012a, 0x012a, 0x012a, 0x0135, 0x013d, 0x014a, + 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, + 0x014a, 0x014a, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, 0x0150, + 0x015f, 0x015f, 0x0164, 0x0164, 0x0164, 0x0168, 0x0168, 0x0168, + 0x0168, 0x0168, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, 0x0187, + 0x0193, 0x0193, 0x0193, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, + 0x01a4, 0x01ac, 0x01ac, 0x01b7, 0x01c3, + }, + }, + { // haw + "ʻAlapiaWaleKenemakaKelemāniaHelenePelekāniaPanioloPīkīPalaniʻAilikiHeber" + + "aʻĪkāliaKepanīKōleaLākinaMāoriHōlaniPukikīLūkiaKāmoaKuekeneTongaPola" + + "polaWiekanamaPākēKuikilani KelemāniaʻŌlelo HawaiʻiʻIke ʻole ‘ia a kū" + + "pono ʻole paha ka ʻōleloPelekāne Nū HōlaniPelekāne KanakāPelekānia P" + + "ekekānePelekānia ʻAmelikaPalani KanakāKuikilaniPukikī PalakilaPākē H" + + "oʻomaʻalahi ʻiaPākē Kuʻuna", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x000c, 0x0014, + 0x001e, 0x001e, 0x001e, 0x001e, 0x0024, 0x002e, 0x002e, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003b, 0x003b, 0x0041, + 0x0041, 0x0049, 0x0049, 0x0049, 0x0049, 0x0049, 0x0049, 0x0049, + 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, + // Entry 40 - 7F + 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, + 0x0059, 0x0059, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, + 0x0060, 0x0060, 0x0060, 0x0060, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, + 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x006d, 0x0073, 0x0073, + 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, + 0x0073, 0x0073, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, + 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, + // Entry 80 - BF + 0x007a, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0087, 0x0087, + 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, + 0x008d, 0x008d, 0x008d, 0x008d, 0x008d, 0x008d, 0x008d, 0x008d, + 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, + 0x0094, 0x0099, 0x0099, 0x0099, 0x0099, 0x00a1, 0x00a1, 0x00a1, + 0x00a1, 0x00a1, 0x00a1, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, + 0x00aa, 0x00aa, 0x00aa, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + // Entry C0 - FF + 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + // Entry 100 - 13F + 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + 0x00b0, 0x00b0, 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00c4, + // Entry 140 - 17F + 0x00c4, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + // Entry 180 - 1BF + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + // Entry 1C0 - 1FF + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + // Entry 200 - 23F + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00d5, + 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x0107, 0x0107, 0x0107, 0x0107, + 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, + 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, + // Entry 240 - 27F + 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, + 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, + 0x011c, 0x012d, 0x0141, 0x0155, 0x0155, 0x0155, 0x0155, 0x0155, + 0x0163, 0x016c, 0x016c, 0x016c, 0x017c, 0x017c, 0x017c, 0x017c, + 0x0196, 0x01a4, + }, + }, + { // he + heLangStr, + heLangIdx, + }, + { // hi + hiLangStr, + hiLangIdx, + }, + { // hr + hrLangStr, + hrLangIdx, + }, + { // hsb + "afaršćinaabchazišćinaafrikaanšćinaakanšćinaamharšćinaaragonšćinaarabšćin" + + "aasamšćinaawaršćinaaymaršćinaazerbajdźanšćinabaškiršćinaběłorušćinab" + + "ołharšćinabislamšćinabambarabengalšćinatibetšćinabretonšćinabosnišći" + + "nakatalanšćinačamoršćinakorsišćinakričěšćinawalizišćinadanšćinaněmči" + + "nadivehidzongkhaewegrjekšćinajendźelšćinaesperantošpanišćinaestišćin" + + "abaskišćinapersišćinafinšćinafidźišćinafäröšćinafrancošćinafrizišćin" + + "airšćinašotiska gelšćinagalicišćinaguaranigujaratimanšćinahausahebre" + + "jšćinahindišćinachorwatšćinahaitišćinamadźaršćinaarmenšćinainterling" + + "uaindonešćinaigbosichuan yiinupiakidoislandšćinaitalšćinainuitšćinaj" + + "apanšćinajavašćinageorgišćinakikuyukazachšćinagröndlandšćinakhmeršći" + + "nakannadšćinakorejšćinakašmiršćinakurdišćinakornišćinakirgišćinałaćo" + + "nšćinaluxemburgšćinagandšćinalimburšćinalingalalaošćinalitawšćinalub" + + "a-katangaletišćinamalagassišćinamaoršćinamakedonšćinamalajamšćinamon" + + "golšćinamaratišćinamalajšćinamaltašćinaburmašćinanaurušćinasewjero-n" + + "debelenepalšćinanižozemšćinanorwegšćina (nynorsk)norwegšćina (bokmål" + + ")navahookcitanšćinaoromoorijšćinapandźabšćinapólšćinapaštunšćinaport" + + "ugalšćinakečuaretoromanšćinakirundišćinarumunšćinarušćinakinjarwanda" + + "sanskritsardinšćinasindhišćinasewjerosamišćinasangosinghalšćinasłowa" + + "kšćinasłowjenšćinasamoašćinašonašćinasomališćinaalbanšćinaserbišćina" + + "siswatijužnosotšćina (Sesotho)sundanezišćinašwedšćinasuahelšćinatami" + + "lšćinatelugutadźikšćinathailandšćinatigrinšćinaturkmenšćinatswanaton" + + "gašćinaturkowšćinatsongatataršćinatahitišćinaujguršćinaukrainšćinaur" + + "dušćinauzbekšćinavietnamšćinavolapükwalonšćinawolofxhosajidišćinajor" + + "ubašćinazhuangchinšćinazulušćinaaghemšćinaanglosakšćinaarawkanšćinap" + + "areasturšćinabembabenabodobuginezišćinachigachoctawšćinacherokeesora" + + "nitaitazarmadelnjoserbšćinadualajola-fonyiembufilipinšćinagagauzišći" + + "nagotšćinašwicarska němčinagusiihawaiišćinahornjoserbšćinangombamach" + + "amekabylšćinakambamakondekapverdšćinakoyra chiinikalenjinpermska kom" + + "išćinakonkanišambalabafialangilakotaluoluhyamasaišćinamerumauriciska" + + " kreolšćinamakhuwa-meettometa’mohawkšćinamundangkriknamadelnjoněmčin" + + "akwasion’konuernyankoleprušćinakʼicheʼromborwasamburusangusicilšćina" + + "senakoyra sennitašelhitjužnosamišćinalule-samišćinainari-samišćinask" + + "olt-samišćinasaterfrizišćinakongoska suahelšćinatesotasawaqtamazight" + + " (srjedźny Marokko)njeznata rěčvaivunjosogatamazightžadyn rěčny wobs" + + "ahmoderna wysokoarabšćinaawstriska němčinašwicarska wysokoněmčinaaws" + + "tralska jendźelšćinakanadiska jendźelšćinabritiska jendźelšćinaameri" + + "ska jendźelšćinałaćonskoameriska španišćinaeuropska španišćinamexisk" + + "a španišćinakanadiska francošćinašwicarska francošćinaflamšćinabrazi" + + "lska portugalšćinaeuropska portugalšćinamoldawšćinaserbochorwatšćina" + + "chinšćina (zjednorjena)chinšćina (tradicionalna)", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000b, 0x0019, 0x0019, 0x0028, 0x0033, 0x003f, 0x004c, + 0x0057, 0x0062, 0x006d, 0x0079, 0x008c, 0x009a, 0x00a9, 0x00b7, + 0x00c4, 0x00cb, 0x00d8, 0x00e4, 0x00f1, 0x00fd, 0x010b, 0x010b, + 0x0118, 0x0124, 0x0127, 0x0132, 0x0132, 0x0132, 0x013f, 0x0149, + 0x0152, 0x0158, 0x0160, 0x0163, 0x016f, 0x017e, 0x0187, 0x0194, + 0x019f, 0x01ab, 0x01b7, 0x01b7, 0x01c1, 0x01ce, 0x01db, 0x01e8, + 0x01f4, 0x01fd, 0x0210, 0x021d, 0x0224, 0x022c, 0x0236, 0x023b, + 0x0248, 0x0254, 0x0254, 0x0262, 0x026e, 0x027c, 0x0288, 0x0288, + // Entry 40 - 7F + 0x0293, 0x02a0, 0x02a0, 0x02a4, 0x02ae, 0x02b5, 0x02b8, 0x02c5, + 0x02d0, 0x02dc, 0x02e8, 0x02f3, 0x0300, 0x0300, 0x0306, 0x0306, + 0x0313, 0x0324, 0x0330, 0x033d, 0x0349, 0x0349, 0x0357, 0x0363, + 0x0363, 0x036f, 0x037b, 0x0389, 0x0399, 0x03a4, 0x03b1, 0x03b8, + 0x03c2, 0x03ce, 0x03da, 0x03e5, 0x03f5, 0x03f5, 0x0400, 0x040e, + 0x041c, 0x0429, 0x0436, 0x0442, 0x044e, 0x045a, 0x0466, 0x0475, + 0x0481, 0x0481, 0x0490, 0x04a7, 0x04be, 0x04be, 0x04c4, 0x04c4, + 0x04d2, 0x04d2, 0x04d7, 0x04e2, 0x04e2, 0x04f1, 0x04f1, 0x04fc, + // Entry 80 - BF + 0x050a, 0x0519, 0x051f, 0x052f, 0x053d, 0x0549, 0x0552, 0x055d, + 0x0565, 0x0572, 0x057f, 0x0591, 0x0596, 0x05a4, 0x05b2, 0x05c1, + 0x05cd, 0x05d9, 0x05e6, 0x05f2, 0x05fe, 0x0605, 0x061f, 0x062f, + 0x063b, 0x0648, 0x0654, 0x065a, 0x0668, 0x0677, 0x0684, 0x0692, + 0x0698, 0x06a4, 0x06b1, 0x06b7, 0x06c3, 0x06d0, 0x06dc, 0x06e9, + 0x06f4, 0x0700, 0x0700, 0x070e, 0x0716, 0x0722, 0x0727, 0x072c, + 0x0737, 0x0744, 0x074a, 0x0755, 0x0760, 0x0760, 0x0760, 0x0760, + 0x0760, 0x0760, 0x0760, 0x076c, 0x076c, 0x076c, 0x076c, 0x076c, + // Entry C0 - FF + 0x076c, 0x076c, 0x077b, 0x077b, 0x077b, 0x0789, 0x0789, 0x0789, + 0x0789, 0x0789, 0x0789, 0x0789, 0x078d, 0x078d, 0x0799, 0x0799, + 0x0799, 0x0799, 0x0799, 0x0799, 0x0799, 0x0799, 0x0799, 0x0799, + 0x0799, 0x079e, 0x079e, 0x07a2, 0x07a2, 0x07a2, 0x07a2, 0x07a2, + 0x07a2, 0x07a2, 0x07a2, 0x07a2, 0x07a2, 0x07a2, 0x07a2, 0x07a2, + 0x07a2, 0x07a6, 0x07a6, 0x07a6, 0x07b5, 0x07b5, 0x07b5, 0x07b5, + 0x07b5, 0x07b5, 0x07b5, 0x07b5, 0x07b5, 0x07ba, 0x07ba, 0x07ba, + 0x07ba, 0x07ba, 0x07ba, 0x07c8, 0x07c8, 0x07d0, 0x07d0, 0x07d6, + // Entry 100 - 13F + 0x07d6, 0x07d6, 0x07d6, 0x07d6, 0x07d6, 0x07d6, 0x07db, 0x07db, + 0x07db, 0x07db, 0x07db, 0x07e0, 0x07e0, 0x07f1, 0x07f1, 0x07f6, + 0x07f6, 0x0800, 0x0800, 0x0800, 0x0804, 0x0804, 0x0804, 0x0804, + 0x0804, 0x0804, 0x0804, 0x0804, 0x0804, 0x0804, 0x0804, 0x0812, + 0x0812, 0x0812, 0x0812, 0x0812, 0x0812, 0x0812, 0x0812, 0x0812, + 0x0812, 0x0812, 0x0820, 0x0820, 0x0820, 0x0820, 0x0820, 0x0820, + 0x0820, 0x0820, 0x0820, 0x0820, 0x0820, 0x0820, 0x0820, 0x082a, + 0x082a, 0x082a, 0x083e, 0x083e, 0x083e, 0x0843, 0x0843, 0x0843, + // Entry 140 - 17F + 0x0843, 0x0850, 0x0850, 0x0850, 0x0850, 0x0850, 0x0861, 0x0861, + 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, + 0x0867, 0x086e, 0x086e, 0x086e, 0x086e, 0x086e, 0x087a, 0x087a, + 0x087a, 0x087f, 0x087f, 0x087f, 0x087f, 0x087f, 0x0886, 0x0894, + 0x0894, 0x0894, 0x0894, 0x0894, 0x0894, 0x08a0, 0x08a0, 0x08a0, + 0x08a0, 0x08a8, 0x08a8, 0x08bb, 0x08c2, 0x08c2, 0x08c2, 0x08c2, + 0x08c2, 0x08c2, 0x08c2, 0x08c2, 0x08ca, 0x08cf, 0x08cf, 0x08cf, + 0x08cf, 0x08cf, 0x08d4, 0x08d4, 0x08d4, 0x08d4, 0x08d4, 0x08d4, + // Entry 180 - 1BF + 0x08d4, 0x08da, 0x08da, 0x08da, 0x08da, 0x08da, 0x08da, 0x08da, + 0x08da, 0x08da, 0x08dd, 0x08dd, 0x08e2, 0x08e2, 0x08e2, 0x08e2, + 0x08e2, 0x08e2, 0x08e2, 0x08e2, 0x08e2, 0x08ee, 0x08ee, 0x08ee, + 0x08ee, 0x08ee, 0x08f2, 0x0909, 0x0909, 0x0917, 0x091e, 0x091e, + 0x091e, 0x091e, 0x091e, 0x092b, 0x092b, 0x092b, 0x0932, 0x0932, + 0x0936, 0x0936, 0x0936, 0x0936, 0x0936, 0x0936, 0x0936, 0x0936, + 0x0936, 0x093a, 0x0949, 0x0949, 0x0949, 0x0949, 0x0949, 0x094f, + 0x094f, 0x094f, 0x094f, 0x094f, 0x0955, 0x0955, 0x0959, 0x0959, + // Entry 1C0 - 1FF + 0x0959, 0x0961, 0x0961, 0x0961, 0x0961, 0x0961, 0x0961, 0x0961, + 0x0961, 0x0961, 0x0961, 0x0961, 0x0961, 0x0961, 0x0961, 0x0961, + 0x0961, 0x0961, 0x0961, 0x0961, 0x096b, 0x096b, 0x0974, 0x0974, + 0x0974, 0x0974, 0x0974, 0x0974, 0x0974, 0x0979, 0x0979, 0x0979, + 0x0979, 0x0979, 0x0979, 0x097c, 0x097c, 0x097c, 0x097c, 0x0983, + 0x0983, 0x0983, 0x0983, 0x0983, 0x0988, 0x0994, 0x0994, 0x0994, + 0x0994, 0x0994, 0x0998, 0x0998, 0x0998, 0x09a3, 0x09a3, 0x09a3, + 0x09ac, 0x09ac, 0x09ac, 0x09ac, 0x09ac, 0x09ac, 0x09bd, 0x09cd, + // Entry 200 - 23F + 0x09de, 0x09ef, 0x09ef, 0x09ef, 0x09ef, 0x09ef, 0x09ef, 0x0a00, + 0x0a00, 0x0a00, 0x0a00, 0x0a00, 0x0a16, 0x0a16, 0x0a16, 0x0a16, + 0x0a16, 0x0a16, 0x0a1a, 0x0a1a, 0x0a1a, 0x0a1a, 0x0a1a, 0x0a1a, + 0x0a1a, 0x0a1a, 0x0a1a, 0x0a1a, 0x0a1a, 0x0a1a, 0x0a1a, 0x0a1a, + 0x0a1a, 0x0a1a, 0x0a1a, 0x0a1a, 0x0a1a, 0x0a1a, 0x0a21, 0x0a21, + 0x0a3e, 0x0a3e, 0x0a3e, 0x0a3e, 0x0a4c, 0x0a4f, 0x0a4f, 0x0a4f, + 0x0a4f, 0x0a4f, 0x0a4f, 0x0a4f, 0x0a54, 0x0a54, 0x0a54, 0x0a54, + 0x0a54, 0x0a54, 0x0a54, 0x0a54, 0x0a54, 0x0a58, 0x0a58, 0x0a58, + // Entry 240 - 27F + 0x0a58, 0x0a58, 0x0a58, 0x0a58, 0x0a58, 0x0a58, 0x0a58, 0x0a58, + 0x0a61, 0x0a61, 0x0a76, 0x0a76, 0x0a8f, 0x0a8f, 0x0aa2, 0x0abc, + 0x0ad6, 0x0aef, 0x0b07, 0x0b1f, 0x0b3f, 0x0b55, 0x0b6a, 0x0b6a, + 0x0b81, 0x0b99, 0x0b99, 0x0ba4, 0x0bbd, 0x0bd5, 0x0be2, 0x0bf5, + 0x0c0e, 0x0c29, + }, + }, + { // hu + huLangStr, + huLangIdx, + }, + { // hy + hyLangStr, + hyLangIdx, + }, + { // id + idLangStr, + idLangIdx, + }, + { // ig + "AkanAmariikịArabiikịBelaruusuBọlụgarịaBengaliCheekịJamaanGiriikịOyiboPan" + + "yaPeshanFụrenchAwụsaHindiMagịyaIndonisiaIgboItaloJapaneseJavaKeme, E" + + "titiKoriaMaleyiMịanmaNepaliDọọchPunjabiPoliishiPotokiRumeniaRọshanRụ" + + "wandaSomaliSụwidiishiTamụlụTaịTọkiishiUkureenịUruduViyetịnaamụYoruba" + + "MandarịịnịZulu", + []uint16{ // 181 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000e, 0x000e, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0021, 0x0030, + 0x0030, 0x0030, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, + 0x0037, 0x0037, 0x0037, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, + 0x0045, 0x0045, 0x0045, 0x0045, 0x004e, 0x0053, 0x0053, 0x0058, + 0x0058, 0x0058, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x0067, + 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x006e, + 0x006e, 0x0073, 0x0073, 0x0073, 0x0073, 0x007b, 0x007b, 0x007b, + // Entry 40 - 7F + 0x007b, 0x0084, 0x0084, 0x0088, 0x0088, 0x0088, 0x0088, 0x0088, + 0x008d, 0x008d, 0x0095, 0x0099, 0x0099, 0x0099, 0x0099, 0x0099, + 0x0099, 0x0099, 0x00a4, 0x00a4, 0x00a9, 0x00a9, 0x00a9, 0x00a9, + 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, + 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, + 0x00a9, 0x00a9, 0x00a9, 0x00af, 0x00af, 0x00b7, 0x00b7, 0x00b7, + 0x00bd, 0x00bd, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, + 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00cd, 0x00cd, 0x00d5, + // Entry 80 - BF + 0x00d5, 0x00db, 0x00db, 0x00db, 0x00db, 0x00e2, 0x00ea, 0x00f3, + 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, + 0x00f3, 0x00f3, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, + 0x0105, 0x0105, 0x010f, 0x010f, 0x010f, 0x0114, 0x0114, 0x0114, + 0x0114, 0x0114, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x0128, + 0x012d, 0x012d, 0x012d, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, + 0x013c, 0x0142, 0x0142, 0x0152, 0x0156, + }, + }, + { // ii + "ꄓꇩꉙꑱꇩꉙꑭꀠꑸꉙꃔꇩꉙꆈꌠꉙꑴꄊꆺꉙꏝꀪꉙꁍꄨꑸꉙꊉꇩꉙꍏꇩꉙꅉꀋꌠꅇꂷꀠꑟꁍꄨꑸꉙꈝꐯꍏꇩꉙꀎꋏꍏꇩꉙ", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0012, 0x0012, 0x001e, + 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x0027, + 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, + 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, + // Entry 40 - 7F + 0x0027, 0x0027, 0x0027, 0x0027, 0x0030, 0x0030, 0x0030, 0x0030, + 0x003c, 0x003c, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + // Entry 80 - BF + 0x0045, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x005a, 0x005a, + 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, + 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, + 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, + 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, + 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, + 0x005a, 0x005a, 0x005a, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + // Entry C0 - FF + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + // Entry 100 - 13F + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + // Entry 140 - 17F + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + // Entry 180 - 1BF + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + // Entry 1C0 - 1FF + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + // Entry 200 - 23F + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0072, 0x0072, 0x0072, 0x0072, + 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, + 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, + // Entry 240 - 27F + 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, + 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, + 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, + 0x0072, 0x0072, 0x0072, 0x0072, 0x0084, 0x0084, 0x0084, 0x0084, + 0x0093, 0x00a2, + }, + }, + { // is + isLangStr, + isLangIdx, + }, + { // it + itLangStr, + itLangIdx, + }, + { // ja + jaLangStr, + jaLangIdx, + }, + { // jgo + "AlâbɛNjámanŊgɛlɛ̂kAŋgɛlúshiFɛlánciShinwâNdaꞌacú-pʉɔ yi pɛ́ ká kɛ́ jí", + []uint16{ // 557 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x000e, 0x000e, 0x000e, 0x000e, 0x0019, 0x0025, 0x0025, 0x0025, + 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x002e, + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + // Entry 40 - 7F + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + // Entry 80 - BF + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + // Entry C0 - FF + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + // Entry 100 - 13F + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + // Entry 140 - 17F + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + // Entry 180 - 1BF + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + // Entry 1C0 - 1FF + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + // Entry 200 - 23F + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x005c, + }, + }, + { // jmc + "KiakanyiKiamharyiKyiarabuKyibelarusiKyibulgaryiaKyibanglaKyicheckiKyijer" + + "umaniKyigirikiKyingerezaKyihispaniaKyiajemiKyifaransaKyihausaKyihind" + + "iKyihungariKyiindonesiaKyiigboKyiitalianoKyijapaniKyijavaKyikambodia" + + "KyikoreaKyimalesiaKyiburmaKyinepaliKyiholanziKyipunjabiKyipolandiKyi" + + "renoKyiromaniaKyirusiKyinyarwandaKyisomalyiKyiswidiKyitamilKyitailan" + + "diKyiturukyiKyiukraniaKyiurduKyivietinamuKyiyorubaKyichinaKyizuluKim" + + "achame", + []uint16{ // 338 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0011, 0x0011, + 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0024, 0x0030, + 0x0030, 0x0030, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, + 0x0039, 0x0039, 0x0039, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, + 0x004d, 0x004d, 0x004d, 0x004d, 0x0056, 0x0060, 0x0060, 0x006b, + 0x006b, 0x006b, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x007d, + 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x0085, + 0x0085, 0x008d, 0x008d, 0x008d, 0x008d, 0x0097, 0x0097, 0x0097, + // Entry 40 - 7F + 0x0097, 0x00a3, 0x00a3, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, + 0x00b5, 0x00b5, 0x00be, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, + 0x00c5, 0x00c5, 0x00d0, 0x00d0, 0x00d8, 0x00d8, 0x00d8, 0x00d8, + 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, + 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, + 0x00d8, 0x00d8, 0x00d8, 0x00e2, 0x00e2, 0x00ea, 0x00ea, 0x00ea, + 0x00f3, 0x00f3, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, + 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x0107, 0x0107, 0x0111, + // Entry 80 - BF + 0x0111, 0x0118, 0x0118, 0x0118, 0x0118, 0x0122, 0x0129, 0x0135, + 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, + 0x0135, 0x0135, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, + 0x0147, 0x0147, 0x014f, 0x014f, 0x014f, 0x015a, 0x015a, 0x015a, + 0x015a, 0x015a, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x016e, + 0x0175, 0x0175, 0x0175, 0x0181, 0x0181, 0x0181, 0x0181, 0x0181, + 0x0181, 0x018a, 0x018a, 0x0192, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + // Entry C0 - FF + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + // Entry 100 - 13F + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + // Entry 140 - 17F + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x01a2, + }, + }, + { // ka + kaLangStr, + kaLangIdx, + }, + { // kab + "TakanitTamahrictTaɛrabtTabilarusitTabulgaritTabengalitTačikitTalmantTagr" + + "ikitTaglizitTaspenyulitTafarisitTafransistTahwasitTahenditTahungarit" + + "TandunisitTigbutTaṭalyanitTajapunitTajavanitTakemritTakuritTamalawit" + + "TaburmisitTanipalitTadučitTapunjabitTapulunitTapurtugalitTarumanitTa" + + "rusitTaruwanditTaṣumalitTaswiditTaṭamulitTaṭaylunditTaṭurkitTukranit" + + "TurdutTabyiṭnamitTayurubitTacinwat, TamundarintTazulutTaqbaylit", + []uint16{ // 343 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0010, 0x0010, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0023, 0x002d, + 0x002d, 0x002d, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, + 0x0037, 0x0037, 0x0037, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, + 0x0046, 0x0046, 0x0046, 0x0046, 0x004e, 0x0056, 0x0056, 0x0061, + 0x0061, 0x0061, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x0074, + 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x0074, 0x007c, + 0x007c, 0x0084, 0x0084, 0x0084, 0x0084, 0x008e, 0x008e, 0x008e, + // Entry 40 - 7F + 0x008e, 0x0098, 0x0098, 0x009e, 0x009e, 0x009e, 0x009e, 0x009e, + 0x00aa, 0x00aa, 0x00b3, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, + 0x00bc, 0x00bc, 0x00c4, 0x00c4, 0x00cb, 0x00cb, 0x00cb, 0x00cb, + 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, + 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, + 0x00cb, 0x00cb, 0x00cb, 0x00d4, 0x00d4, 0x00de, 0x00de, 0x00de, + 0x00e7, 0x00e7, 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00ef, + 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00f9, 0x00f9, 0x0102, + // Entry 80 - BF + 0x0102, 0x010e, 0x010e, 0x010e, 0x010e, 0x0117, 0x011e, 0x0128, + 0x0128, 0x0128, 0x0128, 0x0128, 0x0128, 0x0128, 0x0128, 0x0128, + 0x0128, 0x0128, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, 0x0133, + 0x013b, 0x013b, 0x0146, 0x0146, 0x0146, 0x0153, 0x0153, 0x0153, + 0x0153, 0x0153, 0x015d, 0x015d, 0x015d, 0x015d, 0x015d, 0x0165, + 0x016b, 0x016b, 0x016b, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, + 0x0178, 0x0181, 0x0181, 0x0196, 0x019d, 0x019d, 0x019d, 0x019d, + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + // Entry C0 - FF + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + // Entry 100 - 13F + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + // Entry 140 - 17F + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x01a6, + }, + }, + { // kam + "KiakanKiamhariKiarabuKibelarusiKibulgariaKibanglaKicheckiKijerumaniKigir" + + "ikiKingerezaKihispaniaKiajemiKifaransaKihausaKihindiKihungariKiindon" + + "esiaKiigboKiitalianoKijapaniKijavaKikambodiaKikoreaKimalesiaKiburmaK" + + "inepaliKiholanziKipunjabiKipolandiKirenoKiromaniaKirusiKinyarwandaKi" + + "somaliKiswidiKitamilKitailandiKiturukiKiukraniaKiurduKivietinamuKiyo" + + "rubaKichinaKizuluKikamba", + []uint16{ // 346 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x0029, + 0x0029, 0x0029, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, + 0x0031, 0x0031, 0x0031, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, + 0x0043, 0x0043, 0x0043, 0x0043, 0x004b, 0x0054, 0x0054, 0x005e, + 0x005e, 0x005e, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0075, + 0x0075, 0x007c, 0x007c, 0x007c, 0x007c, 0x0085, 0x0085, 0x0085, + // Entry 40 - 7F + 0x0085, 0x0090, 0x0090, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, + 0x00a0, 0x00a0, 0x00a8, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00b8, 0x00b8, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00c8, 0x00c8, 0x00cf, 0x00cf, 0x00cf, + 0x00d7, 0x00d7, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, + 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e9, 0x00e9, 0x00f2, + // Entry 80 - BF + 0x00f2, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x0101, 0x0107, 0x0112, + 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, + 0x0112, 0x0112, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, + 0x0121, 0x0121, 0x0128, 0x0128, 0x0128, 0x0132, 0x0132, 0x0132, + 0x0132, 0x0132, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, 0x0143, + 0x0149, 0x0149, 0x0149, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, + 0x0154, 0x015c, 0x015c, 0x0163, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry C0 - FF + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry 100 - 13F + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry 140 - 17F + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0170, + }, + }, + { // kde + "ChakanChamhaliChalabuChibelalusiChibulgaliaChibanglaChichechiChidyeluman" + + "iChigilichiChiingelezaChihispaniaChiajemiChifalansaChihausaChihindiC" + + "hihungaliChiiongonesiaChiigboChiitalianoChidyapaniChidyavaChikambodi" + + "aChikoleaChimalesiaChibulmaChinepaliChiholanziChipunjabiChipolandiCh" + + "ilenoChilomaniaChilusiChinyalwandaChisomaliChiswidiChitamilChitailan" + + "diChituluchiChiuklaniaChiulduChivietinamuChiyolubaChichinaChizuluChi" + + "makonde", + []uint16{ // 351 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0020, 0x002b, + 0x002b, 0x002b, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, + 0x0034, 0x0034, 0x0034, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, + 0x0049, 0x0049, 0x0049, 0x0049, 0x0053, 0x005e, 0x005e, 0x0069, + 0x0069, 0x0069, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x007b, + 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x0083, + 0x0083, 0x008b, 0x008b, 0x008b, 0x008b, 0x0095, 0x0095, 0x0095, + // Entry 40 - 7F + 0x0095, 0x00a2, 0x00a2, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, + 0x00b4, 0x00b4, 0x00be, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, + 0x00c6, 0x00c6, 0x00d1, 0x00d1, 0x00d9, 0x00d9, 0x00d9, 0x00d9, + 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, + 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, + 0x00d9, 0x00d9, 0x00d9, 0x00e3, 0x00e3, 0x00eb, 0x00eb, 0x00eb, + 0x00f4, 0x00f4, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x00fe, + 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x0108, 0x0108, 0x0112, + // Entry 80 - BF + 0x0112, 0x0119, 0x0119, 0x0119, 0x0119, 0x0123, 0x012a, 0x0136, + 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, + 0x0136, 0x0136, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, + 0x0147, 0x0147, 0x014f, 0x014f, 0x014f, 0x015a, 0x015a, 0x015a, + 0x015a, 0x015a, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x016e, + 0x0175, 0x0175, 0x0175, 0x0181, 0x0181, 0x0181, 0x0181, 0x0181, + 0x0181, 0x018a, 0x018a, 0x0192, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + // Entry C0 - FF + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + // Entry 100 - 13F + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + // Entry 140 - 17F + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x01a3, + }, + }, + { // kea + "abkaziuafrikanerakanamarikuarabiasamesaimaraazerbaijanubaxkirbielorusubú" + + "lgarubambarabengalitibetanubretãubosniukatalãutxetxenukórsikutxekutx" + + "uvaxigalesdinamarkesalimãudzonkaevegreguinglessperantuspanholstonian" + + "ubaskupersafinlandesfijianufaroesfransesfrisiu osidentalirlandesgale" + + "guguaranigujaratimanksauzaebraikuindikroataaitianuúngaruarméniuindon" + + "éziuibonuosuislandesitalianuinuktitutjaponesjavanesjorjianukikuiuka" + + "zakgroenlandeskmerkanareskorianukaxmirakurdukórnikukirgizlatinluxemb" + + "urgeslugandalausianulituanesletãumalgaximaorimasedoniumalaialammarat" + + "imalaiumaltesbirmanesnepalesolandesnorueges nynorsknorueges bokmålor" + + "omooriyapandjabipulakupaxtopurtugeskexuaromanxirumenurusukiniaruanda" + + "sanskritusindisingalesslovakusloveniusomalialbanessérviusundanessuek" + + "usuaílitamiltelugutajiktailandestigriniaturkmenutonganesturkutatarui" + + "gurukranianuurduuzbekivietnamitauolofkozaiorubaxineszuluaghemaraukan" + + "uasubembabenabodoxigaxerokikurdu sentraltaitazarmasórbiu baxudualajo" + + "la-fonyiembufilipinugagauzalimãu di Suisagusiiavaianusórbiu altuñomb" + + "amatxamekabilakambakabuverdianukoira txiinikalenjinkomi-permiakkonka" + + "nibafiakuaziokitxekoiraboro seniinari samisuaíli kongolestamazait di" + + " Atlas Sentrallingua diskonxedusem konteudo linguistikuarabi mudernu" + + "alimãu austriakualtu alimãu suisuingles australianuingles kanadianui" + + "ngles britanikuingles merkanuspanhol latinu-merkanuspanhol europeusp" + + "anhol mexikanufranses kanadianufranses suisuflamengupurtuges brazile" + + "rupurtuges europeuxines simplifikaduxines tradisional", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x0007, 0x0010, 0x0014, 0x001b, 0x001b, + 0x0020, 0x0026, 0x0026, 0x002c, 0x0037, 0x003d, 0x0046, 0x004e, + 0x004e, 0x0055, 0x005c, 0x0064, 0x006b, 0x0071, 0x0079, 0x0081, + 0x0081, 0x0089, 0x0089, 0x008e, 0x008e, 0x0095, 0x009a, 0x00a4, + 0x00ab, 0x00ab, 0x00b1, 0x00b4, 0x00b9, 0x00bf, 0x00c7, 0x00ce, + 0x00d6, 0x00db, 0x00e0, 0x00e0, 0x00e9, 0x00f0, 0x00f6, 0x00fd, + 0x010d, 0x0115, 0x0115, 0x011b, 0x0122, 0x012a, 0x012f, 0x0133, + 0x013a, 0x013e, 0x013e, 0x0144, 0x014b, 0x0152, 0x015a, 0x015a, + // Entry 40 - 7F + 0x015a, 0x0164, 0x0164, 0x0167, 0x016c, 0x016c, 0x016c, 0x0174, + 0x017c, 0x0185, 0x018c, 0x0193, 0x019b, 0x019b, 0x01a1, 0x01a1, + 0x01a6, 0x01b1, 0x01b5, 0x01bc, 0x01c3, 0x01c3, 0x01ca, 0x01cf, + 0x01cf, 0x01d7, 0x01dd, 0x01e2, 0x01ed, 0x01f4, 0x01f4, 0x01f4, + 0x01fc, 0x0204, 0x0204, 0x020a, 0x0211, 0x0211, 0x0216, 0x021f, + 0x0228, 0x0228, 0x022e, 0x0234, 0x023a, 0x0242, 0x0242, 0x0242, + 0x0249, 0x0249, 0x0250, 0x0260, 0x0270, 0x0270, 0x0270, 0x0270, + 0x0270, 0x0270, 0x0275, 0x027a, 0x027a, 0x0282, 0x0282, 0x0288, + // Entry 80 - BF + 0x028d, 0x0295, 0x029a, 0x02a1, 0x02a1, 0x02a7, 0x02ab, 0x02b6, + 0x02bf, 0x02bf, 0x02c4, 0x02c4, 0x02c4, 0x02cc, 0x02d3, 0x02db, + 0x02db, 0x02db, 0x02e1, 0x02e8, 0x02ef, 0x02ef, 0x02ef, 0x02f7, + 0x02fc, 0x0303, 0x0308, 0x030e, 0x0313, 0x031c, 0x0324, 0x032c, + 0x032c, 0x0334, 0x0339, 0x0339, 0x033e, 0x033e, 0x0343, 0x034c, + 0x0350, 0x0356, 0x0356, 0x0360, 0x0360, 0x0360, 0x0365, 0x0369, + 0x0369, 0x036f, 0x036f, 0x0374, 0x0378, 0x0378, 0x0378, 0x0378, + 0x0378, 0x0378, 0x0378, 0x037d, 0x037d, 0x037d, 0x037d, 0x037d, + // Entry C0 - FF + 0x037d, 0x037d, 0x037d, 0x037d, 0x037d, 0x0385, 0x0385, 0x0385, + 0x0385, 0x0385, 0x0385, 0x0385, 0x0388, 0x0388, 0x0388, 0x0388, + 0x0388, 0x0388, 0x0388, 0x0388, 0x0388, 0x0388, 0x0388, 0x0388, + 0x0388, 0x038d, 0x038d, 0x0391, 0x0391, 0x0391, 0x0391, 0x0391, + 0x0391, 0x0391, 0x0391, 0x0391, 0x0391, 0x0391, 0x0391, 0x0391, + 0x0391, 0x0395, 0x0395, 0x0395, 0x0395, 0x0395, 0x0395, 0x0395, + 0x0395, 0x0395, 0x0395, 0x0395, 0x0395, 0x0399, 0x0399, 0x0399, + 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x039f, 0x039f, 0x03ac, + // Entry 100 - 13F + 0x03ac, 0x03ac, 0x03ac, 0x03ac, 0x03ac, 0x03ac, 0x03b1, 0x03b1, + 0x03b1, 0x03b1, 0x03b1, 0x03b6, 0x03b6, 0x03c2, 0x03c2, 0x03c7, + 0x03c7, 0x03d1, 0x03d1, 0x03d1, 0x03d5, 0x03d5, 0x03d5, 0x03d5, + 0x03d5, 0x03d5, 0x03d5, 0x03d5, 0x03d5, 0x03d5, 0x03d5, 0x03dd, + 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, 0x03dd, + 0x03dd, 0x03dd, 0x03e3, 0x03e3, 0x03e3, 0x03e3, 0x03e3, 0x03e3, + 0x03e3, 0x03e3, 0x03e3, 0x03e3, 0x03e3, 0x03e3, 0x03e3, 0x03e3, + 0x03e3, 0x03e3, 0x03f3, 0x03f3, 0x03f3, 0x03f8, 0x03f8, 0x03f8, + // Entry 140 - 17F + 0x03f8, 0x03ff, 0x03ff, 0x03ff, 0x03ff, 0x03ff, 0x040b, 0x040b, + 0x040b, 0x040b, 0x040b, 0x040b, 0x040b, 0x040b, 0x040b, 0x040b, + 0x0411, 0x0418, 0x0418, 0x0418, 0x0418, 0x0418, 0x041e, 0x041e, + 0x041e, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x042f, + 0x042f, 0x042f, 0x042f, 0x042f, 0x042f, 0x043b, 0x043b, 0x043b, + 0x043b, 0x0443, 0x0443, 0x044f, 0x0456, 0x0456, 0x0456, 0x0456, + 0x0456, 0x0456, 0x0456, 0x0456, 0x0456, 0x045b, 0x045b, 0x045b, + 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, + // Entry 180 - 1BF + 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, + 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, + 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, + 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, + 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, + 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, + 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x0461, + 0x0461, 0x0461, 0x0461, 0x0461, 0x0461, 0x0461, 0x0461, 0x0461, + // Entry 1C0 - 1FF + 0x0461, 0x0461, 0x0461, 0x0461, 0x0461, 0x0461, 0x0461, 0x0461, + 0x0461, 0x0461, 0x0461, 0x0461, 0x0461, 0x0461, 0x0461, 0x0461, + 0x0461, 0x0461, 0x0461, 0x0461, 0x0461, 0x0461, 0x0466, 0x0466, + 0x0466, 0x0466, 0x0466, 0x0466, 0x0466, 0x0466, 0x0466, 0x0466, + 0x0466, 0x0466, 0x0466, 0x0466, 0x0466, 0x0466, 0x0466, 0x0466, + 0x0466, 0x0466, 0x0466, 0x0466, 0x0466, 0x0466, 0x0466, 0x0466, + 0x0466, 0x0466, 0x0466, 0x0466, 0x0466, 0x0474, 0x0474, 0x0474, + 0x0474, 0x0474, 0x0474, 0x0474, 0x0474, 0x0474, 0x0474, 0x0474, + // Entry 200 - 23F + 0x047e, 0x047e, 0x047e, 0x047e, 0x047e, 0x047e, 0x047e, 0x047e, + 0x047e, 0x047e, 0x047e, 0x047e, 0x048e, 0x048e, 0x048e, 0x048e, + 0x048e, 0x048e, 0x048e, 0x048e, 0x048e, 0x048e, 0x048e, 0x048e, + 0x048e, 0x048e, 0x048e, 0x048e, 0x048e, 0x048e, 0x048e, 0x048e, + 0x048e, 0x048e, 0x048e, 0x048e, 0x048e, 0x048e, 0x048e, 0x048e, + 0x04a7, 0x04a7, 0x04a7, 0x04a7, 0x04b8, 0x04b8, 0x04b8, 0x04b8, + 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, + 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, + // Entry 240 - 27F + 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, 0x04b8, + 0x04b8, 0x04b8, 0x04d0, 0x04d0, 0x04dd, 0x04dd, 0x04ee, 0x0500, + 0x0512, 0x0522, 0x0532, 0x0540, 0x0556, 0x0565, 0x0575, 0x0575, + 0x0586, 0x0593, 0x0593, 0x059b, 0x05ad, 0x05bd, 0x05bd, 0x05bd, + 0x05cf, 0x05e0, + }, + }, + { // khq + "Akan senniAmhaarik senniLaaraw senniBelaruus senniBulagaari senniBengali" + + " senniCek senniAlmaŋ senniGrek senniInglisi senniEspaaɲe senniFarsi " + + "senniFransee senniHawsance senniInduu senniHungaari senniIndoneesi s" + + "enniIboo senniItaali senniJaponee senniJavanee senniKmeer senni, Gam" + + "e hereKoree senniMaleezi senniBurme senniNeepal senniHolandee senniP" + + "unjaabi senniiPolonee senniPortugee senniRumaani senniRuusi senniRwa" + + "nda senniSomaali senniSuweede senniTamil senniTaailandu senniTurku s" + + "enniUkreen senniUrdu senniVietnaam senniYorbance senniSinuwa senni, " + + "MandareŋJulu senniKoyra ciini", + []uint16{ // 358 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0018, 0x0018, + 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0032, 0x0041, + 0x0041, 0x0041, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, + 0x004e, 0x004e, 0x004e, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0063, 0x0063, 0x0063, 0x0063, 0x006d, 0x007a, 0x007a, 0x0088, + 0x0088, 0x0088, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x00a0, + 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00ae, + 0x00ae, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00c7, 0x00c7, 0x00c7, + // Entry 40 - 7F + 0x00c7, 0x00d6, 0x00d6, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, + 0x00ec, 0x00ec, 0x00f9, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, + 0x0106, 0x0106, 0x011c, 0x011c, 0x0127, 0x0127, 0x0127, 0x0127, + 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, + 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, + 0x0127, 0x0127, 0x0127, 0x0134, 0x0134, 0x013f, 0x013f, 0x013f, + 0x014b, 0x014b, 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, + 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, 0x0168, 0x0168, 0x0175, + // Entry 80 - BF + 0x0175, 0x0183, 0x0183, 0x0183, 0x0183, 0x0190, 0x019b, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, + 0x01c1, 0x01c1, 0x01cc, 0x01cc, 0x01cc, 0x01db, 0x01db, 0x01db, + 0x01db, 0x01db, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01f2, + 0x01fc, 0x01fc, 0x01fc, 0x020a, 0x020a, 0x020a, 0x020a, 0x020a, + 0x020a, 0x0218, 0x0218, 0x022f, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + // Entry C0 - FF + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + // Entry 100 - 13F + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + // Entry 140 - 17F + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0244, + }, + }, + { // ki + "KiakanKiamhariKĩarabuKibelarusiKibulgariaKibanglaKicheckiKĩnjeremaniKigi" + + "rikiGĩthungũKihispaniaKiajemiKĩbaranjaKihausaKĩhĩndĩKihungariKiindon" + + "esiaKiigboKĩtalianoKĩnjabaniKijavaGikuyuKikambodiaKikoreaKimalesiaKi" + + "burmaKinepaliKiholanziKipunjabiKipolandiKirenoKiromaniaKĩraciaKinyar" + + "wandaKĩcumarĩKiswidiKitamilKitailandiKiturukiKiukraniaKiurduKivietin" + + "amuKiyorubaKĩcainaKizulu", + []uint16{ // 181 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, + 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0020, 0x002a, + 0x002a, 0x002a, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, + 0x0046, 0x0046, 0x0046, 0x0046, 0x004e, 0x0058, 0x0058, 0x0062, + 0x0062, 0x0062, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0073, + 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x007a, + 0x007a, 0x0084, 0x0084, 0x0084, 0x0084, 0x008d, 0x008d, 0x008d, + // Entry 40 - 7F + 0x008d, 0x0098, 0x0098, 0x009e, 0x009e, 0x009e, 0x009e, 0x009e, + 0x00a8, 0x00a8, 0x00b2, 0x00b8, 0x00b8, 0x00b8, 0x00be, 0x00be, + 0x00be, 0x00be, 0x00c8, 0x00c8, 0x00cf, 0x00cf, 0x00cf, 0x00cf, + 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, + 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, 0x00cf, + 0x00cf, 0x00cf, 0x00cf, 0x00d8, 0x00d8, 0x00df, 0x00df, 0x00df, + 0x00e7, 0x00e7, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, + 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00f9, 0x00f9, 0x0102, + // Entry 80 - BF + 0x0102, 0x0108, 0x0108, 0x0108, 0x0108, 0x0111, 0x0119, 0x0124, + 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, + 0x0124, 0x0124, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x0135, 0x0135, 0x013c, 0x013c, 0x013c, 0x0146, 0x0146, 0x0146, + 0x0146, 0x0146, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x0157, + 0x015d, 0x015d, 0x015d, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, + 0x0168, 0x0170, 0x0170, 0x0178, 0x017e, + }, + }, + { // kk + kkLangStr, + kkLangIdx, + }, + { // kkj + "yamannumbu buykakɔ", + []uint16{ // 361 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + // Entry 40 - 7F + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + // Entry 80 - BF + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + // Entry C0 - FF + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + // Entry 100 - 13F + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + // Entry 140 - 17F + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x0013, + }, + }, + { // kl + "kalaallisut", + []uint16{ // 82 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x000b, + }, + }, + { // kln + "kutitab Akakutitab Amariekkutitab Arabukkutitab Belarusakutitab Bulgaria" + + "kutitab Bengalikutitab Chekkutitab Chermanikutitab Greecekutitab Uin" + + "geresakutitab Espianikkutitab Persiakutitab Kifaransakutitab Hausaku" + + "titab Maindiikkutitab Hangarikutitab Indonesiakutitab Igbokutitab Ta" + + "lianekkutitap Japankutitap Javanesekutitab Kher nebo Kwenkutitab Kor" + + "eakutitab Malaykutitab Burmakutitab Nepalikutitab Boakutitab Punjabk" + + "utitap Polandkutitab Portugalkutitab Romaniekkutitab Russiakutitab K" + + "inyarwandakutitab Somaliekkutitab Swedenkutitab Tamilkutitab Thailan" + + "dkutitab Turkeykutitab Ukrainekutitab Urdukutitab Vietnamkutitab Yor" + + "ubakutitab Chinakutitab ZuluKalenjin", + []uint16{ // 362 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000b, 0x001a, 0x001a, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0038, 0x0048, + 0x0048, 0x0048, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0057, 0x0057, 0x0057, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0073, 0x0073, 0x0073, 0x0073, 0x0081, 0x0092, 0x0092, 0x00a2, + 0x00a2, 0x00a2, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00c1, + 0x00c1, 0x00c1, 0x00c1, 0x00c1, 0x00c1, 0x00c1, 0x00c1, 0x00ce, + 0x00ce, 0x00de, 0x00de, 0x00de, 0x00de, 0x00ed, 0x00ed, 0x00ed, + // Entry 40 - 7F + 0x00ed, 0x00fe, 0x00fe, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, + 0x011a, 0x011a, 0x0127, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, + 0x0137, 0x0137, 0x014d, 0x014d, 0x015a, 0x015a, 0x015a, 0x015a, + 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, + 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, + 0x015a, 0x015a, 0x015a, 0x0167, 0x0167, 0x0174, 0x0174, 0x0174, + 0x0182, 0x0182, 0x018d, 0x018d, 0x018d, 0x018d, 0x018d, 0x018d, + 0x018d, 0x018d, 0x018d, 0x018d, 0x018d, 0x019b, 0x019b, 0x01a9, + // Entry 80 - BF + 0x01a9, 0x01b9, 0x01b9, 0x01b9, 0x01b9, 0x01c9, 0x01d7, 0x01ea, + 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, + 0x01ea, 0x01ea, 0x01fa, 0x01fa, 0x01fa, 0x01fa, 0x01fa, 0x01fa, + 0x0208, 0x0208, 0x0215, 0x0215, 0x0215, 0x0225, 0x0225, 0x0225, + 0x0225, 0x0225, 0x0233, 0x0233, 0x0233, 0x0233, 0x0233, 0x0242, + 0x024e, 0x024e, 0x024e, 0x025d, 0x025d, 0x025d, 0x025d, 0x025d, + 0x025d, 0x026b, 0x026b, 0x0278, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + // Entry C0 - FF + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + // Entry 100 - 13F + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + // Entry 140 - 17F + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x028c, + }, + }, + { // km + kmLangStr, + kmLangIdx, + }, + { // kn + knLangStr, + knLangIdx, + }, + { // ko + koLangStr, + koLangIdx, + }, + { // kok + "अफारअबखेज़ियनअफ्रिकान्सत्विअमहारिक्अरेबिक्असामीऐमराअज़रबैजानीबष्किरबैलोर" + + "ुसियन्बल्गेरियनबिसलमाबंगालीतिबेतियनब्रेटनकटलानकोर्शियनज़ेक्वेळ्ष्ड" + + "ानिषजर्मनभूटानीग्रीक्आंग्लइस्परान्टोस्पानिषइस्टोनियन्बास्कपर्षियन्" + + "फिन्निष्फिजीफेरोस्फ्रेन्चफ्रिशियन्ऐरिषस्काटस् गेलिक्गेलीशियनगौरानी" + + "गुजरातीहौसाहेब्रुहिन्दीक्रोयेषियन्हंगेरियन्आर्मीनियन्इन्टरलिंग्वाइ" + + "न्डोनेषियनइन्टरलिंग्इनूपेयाक्आईस्लान्डिकइटालियनइन्युकट्टजापनीस्जाव" + + "नीस्जार्जियन्कज़ख्ग्रीनलान्डिककंबोडियनकन्नडाकोरियन्कश्मीरीकुर्दिषक" + + "िर्गिज़लाटिनलिंगालालाओतियन्लिथुआनियन्लाट्वियन् (लेट्टिष्)मलागसीमाओ" + + "रीमसीडोनियन्मळियाळममंगोलियन्मराठीमलयमालतीस्बर्मीज़्नौरोनेपाळीडच्नो" + + "र्वेजियनओसिटान्ओरोमो (अफान)ओरियापंजाबीपोलिषपाष्टो (पुष्टो)पोर्चुगी" + + "ज़्क्वेच्वारहटो-रोमान्स्किरुन्दीरोमानियन्रष्यन्किन्यार्वान्डासंस्क" + + "ृतसिंधीसांग्रोसिन्हलीस्स्लोवाकस्लोवेनियन्समोनशोनासोमाळीआल्बेनियन्स" + + "ेर्बियन्सिस्वातीसेसोथोसुंदनीसस्वीदीषस्वाहिलीतमिळतेलुगूतजिकथाईतिग्र" + + "िन्यातुर्कमनसेत्स्वानातोंगातुर्किषत्सोगातटारउधूरयुक्रेनियन्उर्दूउज" + + "़बेकवियत्नामीज़ओलापुकउलोफ़झ़ौसाइद्दिष्यूरुबाझ्हुन्गचीनीस्जुलूतगालो" + + "गकोंकणीमोल्डावियन्सेर्बो-क्रोयेषियन्", + []uint16{ // 608 elements + // Entry 0 - 3F + 0x0000, 0x000c, 0x0027, 0x0027, 0x0045, 0x0051, 0x0069, 0x0069, + 0x007e, 0x008d, 0x008d, 0x0099, 0x00b7, 0x00c9, 0x00ea, 0x0105, + 0x0117, 0x0117, 0x0129, 0x0141, 0x0153, 0x0153, 0x0162, 0x0162, + 0x0162, 0x017a, 0x017a, 0x0189, 0x0189, 0x0189, 0x019b, 0x01aa, + 0x01b9, 0x01b9, 0x01cb, 0x01cb, 0x01dd, 0x01ec, 0x020a, 0x021f, + 0x023d, 0x024c, 0x0264, 0x0264, 0x027c, 0x0288, 0x029a, 0x02af, + 0x02ca, 0x02d6, 0x02fe, 0x0316, 0x0328, 0x033d, 0x033d, 0x0349, + 0x035b, 0x036d, 0x036d, 0x038e, 0x038e, 0x03a9, 0x03c7, 0x03c7, + // Entry 40 - 7F + 0x03eb, 0x040c, 0x042a, 0x042a, 0x042a, 0x0445, 0x0445, 0x0466, + 0x047b, 0x0496, 0x04ab, 0x04c0, 0x04db, 0x04db, 0x04db, 0x04db, + 0x04ea, 0x050e, 0x0526, 0x0538, 0x054d, 0x054d, 0x0562, 0x0577, + 0x0577, 0x0577, 0x058f, 0x059e, 0x059e, 0x059e, 0x059e, 0x05b3, + 0x05cb, 0x05e9, 0x05e9, 0x061f, 0x0631, 0x0631, 0x0640, 0x065e, + 0x0673, 0x068e, 0x069d, 0x06a6, 0x06bb, 0x06d3, 0x06df, 0x06df, + 0x06f1, 0x06f1, 0x06fa, 0x06fa, 0x0718, 0x0718, 0x0718, 0x0718, + 0x072d, 0x072d, 0x074b, 0x075a, 0x075a, 0x076c, 0x076c, 0x077b, + // Entry 80 - BF + 0x07a2, 0x07c3, 0x07db, 0x0800, 0x0818, 0x0833, 0x0845, 0x086f, + 0x0884, 0x0884, 0x0893, 0x0893, 0x08a8, 0x08c3, 0x08d8, 0x08f9, + 0x0905, 0x0911, 0x0923, 0x0941, 0x095c, 0x0974, 0x0986, 0x099b, + 0x09b0, 0x09c8, 0x09d4, 0x09e6, 0x09f2, 0x09fb, 0x0a19, 0x0a2e, + 0x0a4c, 0x0a5b, 0x0a70, 0x0a82, 0x0a8e, 0x0a8e, 0x0a9a, 0x0abb, + 0x0aca, 0x0adc, 0x0adc, 0x0afd, 0x0b0f, 0x0b0f, 0x0b1e, 0x0b2d, + 0x0b42, 0x0b54, 0x0b69, 0x0b7b, 0x0b87, 0x0b87, 0x0b87, 0x0b87, + 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, + // Entry C0 - FF + 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, + 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, + 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, + 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, + 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, + 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, + 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, + 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, + // Entry 100 - 13F + 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, + 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, + 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, + 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b87, 0x0b99, + 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, + 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, + 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, + 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, + // Entry 140 - 17F + 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, + 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, + 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, + 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, + 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0b99, + 0x0b99, 0x0b99, 0x0b99, 0x0b99, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + // Entry 180 - 1BF + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + // Entry 1C0 - 1FF + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + // Entry 200 - 23F + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + // Entry 240 - 27F + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, + 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bab, 0x0bcc, 0x0c00, + }, + }, + { // ks + "اَفاراَبخازِیاناَویستَناَفریٖکانٛزاَکاناَمہاریاَراگونیعربیاسٲمۍاَوارِکای" + + "مارااَزَربیجانیبَشکیٖربیلَروٗشیَنبینابِسلامابَمبارابَنٛگٲلۍتِبتیبری" + + "ٹَنبوسنِیَنکَتلانچیچَنکَموروکارسِکَنکریچیٚکچٔرچ سلاوِکچُواشویٚلشڈین" + + "ِشجٔرمَندِویہیزونٛگکھاایٖویوٗنٲنیاَنٛگیٖزۍایٚسپَرینٹوسپینِشایٚسٹونی" + + "َنباسکفارسیفُلاہفِنِشفِجیَنفَروسفریٚنچمغربی فرِشیَناَیرِشسکوٹِش گیے" + + "لِکگیلِشِیَنگُوارَنیگُجرٲتیمینٛکسہاوساعبرٲنۍہِندیہِری موتوٗکروشِیَن" + + "ہیتِیاںہَنٛگیریَناَرمینیَنہیٚریٖرواِنٹَرلِنٛگوااِنڈونیشیااِنٹَر لِن" + + "ٛنگویےاِگبوسِچوان یٖیاِنُپِیاکاِڈوآیِسلینڈِکاِٹیلیَناِنُکتِتوٗجاپٲن" + + "ۍجَوَنیٖزجارجِیَنکونٛگوکِکُیوٗکُوانیاماکازَخکَلالِسُتخَمیرکَنَڑکوری" + + "َنکَنوٗریکٲشُرکُردِشکومیکورنِشکِرگِزلاتیٖنیلُکھزیمبورگِشگاندالِمبٔر" + + "گِشلِنگالالاولِتھوانِیَنلوُبا کَتَنٛگالَتوِیَنمَلاگَسیمارشَلیٖزماور" + + "یمیکَڈونیَنمٔلیالَممَنٛگولیمَرٲٹھۍمَلَےمَلتیٖسبٔمیٖزناورُشُمال ڈَبی" + + "لنیٚپٲلۍڈونٛگاڈَچناروییَن نَے نورسکناروییَن بوکمالجنوب ڈیٚبیلنَواجو" + + "نِیَنجااوکسیٖٹَناوجِبوااوٚرومواوٚرِیااوٚسیٚٹِکپَنجٲبۍپالیپالِشپَشتو" + + "ٗپُرتَگیٖزکُویشُوارومانشرُندیرومٲنیروٗسیکِنیاوِنداسَنسکرٕتسراڈیٖنیس" + + "ِندیشُمٲلی سَمیسَنگوسِنہالاسلووَکسلووینیَنسَمواَنشوناسومٲلیالبانِیَ" + + "نسٔربِیَنسواتیجنوبی ستھوسَنڈَنیٖزسویٖڈِشسواہِلیتَمِلتیلگوٗتاجِکتھاے" + + "ٹِگرِنیاتُرکمینسواناٹونٛگاتُرکِشژونٛگاتَتارتاہیشِیَنیوٗکرینیٲییاُرد" + + "وٗاُزبیکوینداوِیَتنَمیٖزوولَپُکوَلوٗنوولوفکھوسایِدِشیورُبازُہانٛگچی" + + "ٖنیزُلوٗاَچَےنیٖزاَکولیاَدَنٛگمیےاَدَیٖگیےاَفرِہِلیاینوٗاَکادِیَناَ" + + "لویتیجنوٗبی اَلتاییپرون اَنٛگریٖزیاَنٛگِکااَرَمیکایرو کونِیَناَراپا" + + "ہواَراوَکایسٹوٗریَناَوَدیبَلوٗچیبالِنیٖزباسابیجابیٚمبابوجپوٗریبِکول" + + "بِنیسِکسِکابرٛجبُرِیَتبَگنیٖزبٕلِنکاڈوکارِباتسَمسیباونوچیٖبچاچھَگتا" + + "ےچُکیٖزماریچِنوٗک جارگَنچوکتَوشیپویانچیٚروکیشییونکاپٹِککرٕمیٖن تُرک" + + "یکَشوٗبِیَنڈکوٹادَرگواڈیٚلوییَرسلیوڈاگرِبڈِنکاڈوگریبوٚنِم ساربِیَند" + + "ُوالاوَستی پُرتُگالیڈِیوٗلاایٚفِکقدیٖمی مِصریایٚکاجُکایٚلامایِٹوَسط" + + "ی اَنٛگریٖزۍایٚوونڈوفینٛگفِلِپیٖنوفونوسطی فریٚنچپرون فریٚنچشُمٲلی ف" + + "رِشیَنمشرِقی فرِشیَنفروٗلِیَنگاگیےیوگبایاگیٖزگِلبٔرٹیٖزوَسطی ہاے جٔ" + + "رمَنپرون ہاے جٔرمَنگوندیگورینٹیلوگوتھِکگرِبوقدیٖم یوٗنٲنیسٕوِس جٔرم" + + "َنگُوِچ اِنہَیداہوایِیَنہِلیٖگینَنہِتایِتہمونٛگہیٚرِم ساربِیَنہُپاا" + + "ِباناِلوکواِنٛگُشلوجبانجوڈیو فارسیجوڈیو عربیکارا کَلپَککَبایِلکاچِن" + + "جُوٗکامباکَویکَبارڈِیَنتَیَپکوروکھاسیکھوتَنیٖزکِمبُندوٗکونکَنیکوسری" + + "یَنکَپیلیکراچیے بَلکارکَریلِیَنکُرُکھکُمِککُتینَےلیڈِنولَہَندالَمبا" + + "لیزگِیَنمونٛگولوزیلوٗبا لوٗلُوالویِسینولُندالُوولُسہاےمَدُریٖزمَگاے" + + "میتَھلیمَکَسارمَندِنٛگومَساےموکشامَندَرمیندیےوَستی ایرِشمِکمیکمِنَن" + + "ٛگکَباومانٛچوٗمَنیپوٗریموہاکموسیواریاہ زبانکریٖکمِراندیٖزمارواڑیایٚ" + + "رزِیانیٖپالیٹَنبوٚنِم جٔرمَننیٚوارینِیاسنِیویَننوگاےپرون نارسیایٚن " + + "کوشمالی ستھوکلاسِکَل نیوارینِیَمویٚزینِیَنکولنِیورونَظیٖمااوٚسیجاوٹ" + + "ومَن تُرکِشپَنٛگاسِنَنپَہلَویپَمپَنٛگاپَپِیامیٚنٹوپَلااُواںپرون فار" + + "سیفونیٖشیَنپانپیٚیَنپرون پروویٚنچَلراجِستھٲنۍرَپانویرَروٹونٛگَنرومَ" + + "نیاَرومانیسَندَویےیاکُتسَمارِتَن اَرامیکسَسَکسَنتالیسِچِلِیَنسکاٹسس" + + "یٚلکُپپرون ایرِششانسِداموجنوٗبی سَمیلولیے سَمیاِناری سَمیسکولٹ سَمی" + + "سونِنکیےسوگڈِیَنسرٛانَن ٹونٛگوسیٚریرسُکُماسُسوٗسُمیریَنسیٖریٲییٹِمن" + + "یےٹیٚریٚنوٹیٹَمٹاےگریےتیٖوٹوکیٖلاوکِلِنگونٹِلِنگِتتاماشیکنیاسا ٹونٛ" + + "گاٹاک پِسِنژھِمشِیانتُمبُکاتُوالوٗتُویٖنیَناُدمُرتاُگارتِکیُمبُندوٗ" + + "روٗٹواےووتِکوالامووَریےواشوکالمِکیاویَپیٖززَپوتیٚکزیناگازوٗنیکانٛہہ" + + " تہِ لِسانیاتی مواد نہٕزازاآسٹرِیَن جٔرمَنسٕوِس ہاےجٔرمَنآسٹریلیَن ا" + + "َنٛگریٖزۍکینَڈِیٲیی اَنٛگریٖزۍبَرطانوی اَنٛگریٖزۍیوٗ ایٚس اَنٛگریٖز" + + "ۍلیٹٕن امریٖکی سپینِشلِبیریَن سپینِشکَنیڈیَن فریٚنچسٕوٕس فریٚنچفلیٚ" + + "مِشبرازیٖلی پُتَگیٖزلِبیریَن پُرتَگیٖزمولداوِیَنسیٚربو کروشِیَنسیٚو" + + "د چیٖنیرِوٲجی چیٖنی", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000a, 0x001e, 0x002e, 0x0044, 0x004e, 0x005c, 0x006c, + 0x0074, 0x007e, 0x008c, 0x0098, 0x00ae, 0x00bc, 0x00d2, 0x00da, + 0x00e8, 0x00f6, 0x0106, 0x0110, 0x011c, 0x012c, 0x0138, 0x0142, + 0x014e, 0x015e, 0x0164, 0x016c, 0x0181, 0x018b, 0x0195, 0x019f, + 0x01ab, 0x01b7, 0x01c7, 0x01cf, 0x01dd, 0x01ef, 0x0205, 0x0211, + 0x0225, 0x022d, 0x0237, 0x0241, 0x024b, 0x0257, 0x0261, 0x026d, + 0x0286, 0x0292, 0x02ab, 0x02bd, 0x02cd, 0x02db, 0x02e7, 0x02f1, + 0x02fd, 0x0307, 0x031a, 0x032a, 0x0338, 0x034c, 0x035e, 0x036e, + // Entry 40 - 7F + 0x0388, 0x039c, 0x03bb, 0x03c5, 0x03d8, 0x03ea, 0x03f2, 0x0406, + 0x0416, 0x042a, 0x0436, 0x0446, 0x0456, 0x0462, 0x0470, 0x0482, + 0x048c, 0x049e, 0x04a8, 0x04b2, 0x04be, 0x04cc, 0x04d6, 0x04e2, + 0x04ea, 0x04f6, 0x0502, 0x0510, 0x052a, 0x0534, 0x0546, 0x0554, + 0x055a, 0x0570, 0x058b, 0x059b, 0x05ab, 0x05bd, 0x05c7, 0x05db, + 0x05eb, 0x05fb, 0x0609, 0x0613, 0x0621, 0x062d, 0x0637, 0x064c, + 0x065a, 0x0666, 0x066c, 0x068e, 0x06ab, 0x06c0, 0x06cc, 0x06da, + 0x06ec, 0x06fa, 0x0708, 0x0716, 0x0728, 0x0736, 0x073e, 0x0748, + // Entry 80 - BF + 0x0754, 0x0766, 0x0776, 0x0782, 0x078c, 0x0798, 0x07a2, 0x07b6, + 0x07c6, 0x07d6, 0x07e0, 0x07f5, 0x07ff, 0x080d, 0x0819, 0x082b, + 0x0839, 0x0841, 0x084d, 0x085f, 0x086f, 0x0879, 0x088c, 0x089e, + 0x08ac, 0x08ba, 0x08c4, 0x08d0, 0x08da, 0x08e2, 0x08f2, 0x0900, + 0x090a, 0x0916, 0x0922, 0x092e, 0x0938, 0x094a, 0x094a, 0x0960, + 0x096c, 0x0978, 0x0982, 0x0998, 0x09a6, 0x09b2, 0x09bc, 0x09c6, + 0x09d0, 0x09dc, 0x09ea, 0x09f4, 0x09fe, 0x0a10, 0x0a1c, 0x0a30, + 0x0a42, 0x0a42, 0x0a54, 0x0a54, 0x0a5e, 0x0a70, 0x0a70, 0x0a7e, + // Entry C0 - FF + 0x0a7e, 0x0a99, 0x0ab6, 0x0ac6, 0x0ad4, 0x0aeb, 0x0aeb, 0x0afb, + 0x0afb, 0x0b09, 0x0b09, 0x0b09, 0x0b09, 0x0b09, 0x0b1d, 0x0b1d, + 0x0b29, 0x0b37, 0x0b47, 0x0b47, 0x0b4f, 0x0b4f, 0x0b4f, 0x0b4f, + 0x0b57, 0x0b63, 0x0b63, 0x0b63, 0x0b63, 0x0b63, 0x0b63, 0x0b73, + 0x0b7d, 0x0b85, 0x0b85, 0x0b85, 0x0b93, 0x0b93, 0x0b93, 0x0b9b, + 0x0b9b, 0x0b9b, 0x0b9b, 0x0ba9, 0x0bb7, 0x0bb7, 0x0bc1, 0x0bc1, + 0x0bc9, 0x0bd3, 0x0bd3, 0x0bdd, 0x0beb, 0x0beb, 0x0bf7, 0x0c05, + 0x0c11, 0x0c19, 0x0c32, 0x0c3e, 0x0c4c, 0x0c5a, 0x0c64, 0x0c64, + // Entry 100 - 13F + 0x0c70, 0x0c70, 0x0c89, 0x0c9d, 0x0ca7, 0x0cb3, 0x0cb3, 0x0cc5, + 0x0ccd, 0x0cd9, 0x0ce3, 0x0ce3, 0x0ced, 0x0d0a, 0x0d0a, 0x0d16, + 0x0d33, 0x0d33, 0x0d41, 0x0d41, 0x0d41, 0x0d4d, 0x0d4d, 0x0d64, + 0x0d74, 0x0d88, 0x0da7, 0x0da7, 0x0db7, 0x0db7, 0x0dc1, 0x0dd3, + 0x0dd3, 0x0dd9, 0x0dd9, 0x0dee, 0x0e03, 0x0e03, 0x0e1e, 0x0e39, + 0x0e4b, 0x0e4f, 0x0e4f, 0x0e4f, 0x0e59, 0x0e63, 0x0e63, 0x0e6b, + 0x0e7f, 0x0e7f, 0x0e9d, 0x0eb9, 0x0eb9, 0x0ec3, 0x0ed5, 0x0ee1, + 0x0eeb, 0x0f04, 0x0f1b, 0x0f1b, 0x0f1b, 0x0f1b, 0x0f2c, 0x0f36, + // Entry 140 - 17F + 0x0f36, 0x0f46, 0x0f46, 0x0f5a, 0x0f68, 0x0f74, 0x0f91, 0x0f91, + 0x0f99, 0x0fa3, 0x0fa3, 0x0faf, 0x0fbd, 0x0fbd, 0x0fbd, 0x0fc9, + 0x0fc9, 0x0fc9, 0x0fde, 0x0ff1, 0x0ff1, 0x1006, 0x1014, 0x101e, + 0x1026, 0x1030, 0x1038, 0x104c, 0x104c, 0x1056, 0x1056, 0x1056, + 0x1056, 0x105e, 0x105e, 0x1068, 0x107a, 0x107a, 0x107a, 0x107a, + 0x107a, 0x107a, 0x108c, 0x108c, 0x109a, 0x10aa, 0x10b6, 0x10cf, + 0x10cf, 0x10cf, 0x10e1, 0x10ed, 0x10ed, 0x10ed, 0x10ed, 0x10f7, + 0x1105, 0x1111, 0x1111, 0x111f, 0x1129, 0x1139, 0x1139, 0x1139, + // Entry 180 - 1BF + 0x1139, 0x1139, 0x1139, 0x1145, 0x114d, 0x114d, 0x114d, 0x1166, + 0x1176, 0x1180, 0x1188, 0x1194, 0x1194, 0x1194, 0x1194, 0x11a4, + 0x11a4, 0x11ae, 0x11bc, 0x11ca, 0x11dc, 0x11e6, 0x11e6, 0x11f0, + 0x11fc, 0x1208, 0x1208, 0x1208, 0x121d, 0x121d, 0x121d, 0x1229, + 0x1241, 0x124f, 0x1261, 0x126b, 0x1273, 0x1273, 0x1273, 0x1288, + 0x1292, 0x12a4, 0x12b2, 0x12b2, 0x12b2, 0x12c2, 0x12c2, 0x12c2, + 0x12d6, 0x12d6, 0x12ef, 0x12fd, 0x1307, 0x1315, 0x1315, 0x1315, + 0x1315, 0x131f, 0x1332, 0x1332, 0x133f, 0x1352, 0x1352, 0x136f, + // Entry 1C0 - 1FF + 0x1383, 0x1393, 0x139f, 0x13ad, 0x13b9, 0x13d4, 0x13ea, 0x13f8, + 0x140a, 0x1422, 0x1434, 0x1434, 0x1434, 0x1434, 0x1447, 0x1447, + 0x1459, 0x1459, 0x1459, 0x146b, 0x146b, 0x1488, 0x1488, 0x1488, + 0x149c, 0x14aa, 0x14c0, 0x14c0, 0x14c0, 0x14c0, 0x14cc, 0x14cc, + 0x14cc, 0x14cc, 0x14dc, 0x14dc, 0x14ec, 0x14f6, 0x1517, 0x1517, + 0x1521, 0x152f, 0x152f, 0x152f, 0x152f, 0x1541, 0x154b, 0x154b, + 0x154b, 0x154b, 0x154b, 0x154b, 0x1559, 0x1559, 0x156c, 0x156c, + 0x156c, 0x1572, 0x1572, 0x157e, 0x157e, 0x157e, 0x1593, 0x15a6, + // Entry 200 - 23F + 0x15bb, 0x15ce, 0x15de, 0x15ee, 0x1609, 0x1615, 0x1615, 0x1615, + 0x1621, 0x162b, 0x163b, 0x163b, 0x163b, 0x163b, 0x164b, 0x164b, + 0x164b, 0x1657, 0x1657, 0x1667, 0x1671, 0x167f, 0x1687, 0x1697, + 0x1697, 0x16a7, 0x16b7, 0x16b7, 0x16c5, 0x16dc, 0x16ed, 0x16ed, + 0x16ed, 0x16ed, 0x16ff, 0x16ff, 0x170d, 0x171b, 0x171b, 0x172d, + 0x172d, 0x173b, 0x174b, 0x175d, 0x1765, 0x176b, 0x176b, 0x176b, + 0x176b, 0x176b, 0x1775, 0x1775, 0x1775, 0x1775, 0x1781, 0x178b, + 0x1793, 0x1793, 0x1793, 0x179f, 0x179f, 0x179f, 0x17a5, 0x17b1, + // Entry 240 - 27F + 0x17b1, 0x17b1, 0x17b1, 0x17b1, 0x17c1, 0x17c1, 0x17c1, 0x17cd, + 0x17cd, 0x17d7, 0x180d, 0x1815, 0x1815, 0x1815, 0x1832, 0x184f, + 0x1876, 0x189f, 0x18c4, 0x18e8, 0x190e, 0x192b, 0x192b, 0x192b, + 0x1948, 0x195f, 0x195f, 0x196d, 0x198e, 0x19b1, 0x19c5, 0x19e2, + 0x19f7, 0x1a0e, + }, + }, + { // ksb + "KiakanKiamhaliKialabuKibelaausiKibulgaliaKibanglaKicheckiKijeumaniKigiik" + + "iKiingeezaKihispaniaKiajemiKifalansaKihausaKihindiKihungaiKiindonesi" + + "aKiigboKiitalianoKijapaniKijavaKikambodiaKikoleaKimalesiaKibulmaKine" + + "paliKiholanziKipunjabiKipolandiKilenoKiomaniaKilusiKinyalwandaKisoma" + + "liKiswidiKitamilKitailandiKituukiKiuklaniaKiulduKivietinamuKiyolubaK" + + "ichinaKizuluKishambaa", + []uint16{ // 373 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x0029, + 0x0029, 0x0029, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, + 0x0031, 0x0031, 0x0031, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, + 0x0042, 0x0042, 0x0042, 0x0042, 0x0049, 0x0052, 0x0052, 0x005c, + 0x005c, 0x005c, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x006c, + 0x006c, 0x006c, 0x006c, 0x006c, 0x006c, 0x006c, 0x006c, 0x0073, + 0x0073, 0x007a, 0x007a, 0x007a, 0x007a, 0x0082, 0x0082, 0x0082, + // Entry 40 - 7F + 0x0082, 0x008d, 0x008d, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, + 0x009d, 0x009d, 0x00a5, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, + 0x00ab, 0x00ab, 0x00b5, 0x00b5, 0x00bc, 0x00bc, 0x00bc, 0x00bc, + 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, + 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, + 0x00bc, 0x00bc, 0x00bc, 0x00c5, 0x00c5, 0x00cc, 0x00cc, 0x00cc, + 0x00d4, 0x00d4, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, + 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00e6, 0x00e6, 0x00ef, + // Entry 80 - BF + 0x00ef, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00fd, 0x0103, 0x010e, + 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, + 0x010e, 0x010e, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, + 0x011d, 0x011d, 0x0124, 0x0124, 0x0124, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x013e, + 0x0144, 0x0144, 0x0144, 0x014f, 0x014f, 0x014f, 0x014f, 0x014f, + 0x014f, 0x0157, 0x0157, 0x015e, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + // Entry C0 - FF + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + // Entry 100 - 13F + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + // Entry 140 - 17F + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x0164, 0x016d, + }, + }, + { // ksf + "riakanriamarikriarabribɛlɔrísribulgaríribɛngáliricɛ́kridjɛrmanrigrɛ́krii" + + "ngɛrísrikpanyáripɛrsánripɛrɛsǝ́rikaksariíndíriɔngrɔáriindonɛsíriigbo" + + "riitalyɛ́nrijapɔ́ŋrijawanɛ́rikmɛrrikɔrɛɛ́rimalaíribirmánrinepalɛ́riɔ" + + "lándɛ́ripɛnjabíripɔlɔ́nripɔrtugɛ́rirɔmánrirísrirwandarisomalíriswɛ́d" + + "ǝritamúlritaíriturkriukrɛ́nriurdúriwyɛtnámriyúubaricinɔárizúlurikpa", + []uint16{ // 374 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, + 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0020, 0x002a, + 0x002a, 0x002a, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, + 0x0047, 0x0047, 0x0047, 0x0047, 0x0050, 0x005b, 0x005b, 0x0064, + 0x0064, 0x0064, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x007b, + 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x0082, + 0x0082, 0x008a, 0x008a, 0x008a, 0x008a, 0x0095, 0x0095, 0x0095, + // Entry 40 - 7F + 0x0095, 0x00a1, 0x00a1, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, + 0x00b3, 0x00b3, 0x00be, 0x00c9, 0x00c9, 0x00c9, 0x00c9, 0x00c9, + 0x00c9, 0x00c9, 0x00d0, 0x00d0, 0x00dc, 0x00dc, 0x00dc, 0x00dc, + 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, + 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, + 0x00dc, 0x00dc, 0x00dc, 0x00e4, 0x00e4, 0x00ed, 0x00ed, 0x00ed, + 0x00f8, 0x00f8, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, + 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0110, 0x0110, 0x011b, + // Entry 80 - BF + 0x011b, 0x0128, 0x0128, 0x0128, 0x0128, 0x0131, 0x0137, 0x013f, + 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, + 0x013f, 0x013f, 0x0148, 0x0148, 0x0148, 0x0148, 0x0148, 0x0148, + 0x0153, 0x0153, 0x015b, 0x015b, 0x015b, 0x0161, 0x0161, 0x0161, + 0x0161, 0x0161, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0171, + 0x0178, 0x0178, 0x0178, 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, + 0x0183, 0x018b, 0x018b, 0x0194, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + // Entry C0 - FF + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + // Entry 100 - 13F + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + // Entry 140 - 17F + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, + 0x019b, 0x019b, 0x019b, 0x019b, 0x019b, 0x01a0, + }, + }, + { // ksh + "AfahreschAbchahseschAvästahneschAfrikaansAkahneschAmhahreschArrajonehses" + + "chArahbeschAßamehseschAvahreschAimahreschAsserbaidschahneschBaschkih" + + "reschWiißrußeschBulljaareschBambaraBängjaaleschTibehteschBettohnesch" + + "BoßneschKattalahneschKorseschTschäscheschKerscheßlahweschTschowasche" + + "schWallihseschDähneschDeutschDivehjeschButahneschEweJrihscheschÄngle" + + "schEsperantoSchpahneschÄßneschBaskeschPärseschFinneschFidscheschFärr" + + "öereschFranzüüseschWäßfriiseschIereschJalliizeschJuwaraaneschGutsch" + + "arateschHaußaHebräjeschHindiKrowateschHa’iiteschUnjarreschArmeenesch" + + "IndoneeseschIgboIdoIßländeschEtalljäneschInuktitutJapaaneschJavahnes" + + "chJe’orjeschKassakeschKhmerKannadaKorrejaaneschKaschmiereschKurdesch" + + "KirjihseschLateijneschLuxemborjeschLingjallaLahooteschLittoueschLätt" + + "eschMadajaßkeschMaahoriMazedooneschMallajalamMongjoleschMarraateschM" + + "allaijeschMalteeseschBurmesseschNood-NdebeleNepallesseschHolländesch" + + "Neu-NorrweejeschNorrweejesch BokmålSchi-SchewaOriijaOßeeteschPanscha" + + "abeschPollneschPaschtuuneschPochtojeseschKättschowaRätoromaaneschK-R" + + "undeschRumäneschRußßeschKinja-RuandeschSanskritSinndiNood-Lappländes" + + "chSangjoSingjaleeseschẞlovakeschẞloveeneschSammohaneschSchi-SchonaSo" + + "maaleschAlbaaneschSärbeschSi-SwateschSöd-SootoSindaneeseschSchweedes" + + "chSuaheeleschTamiileschTelluujuTadschiikeschTailändeschTijrenejaanes" + + "chTörkmeeneschSe-ZwaaneschTongjaaneschTörkeschXi-ZongjaneschTattaare" + + "schTahiteschUj’juuerschUkraineschUrdu/HindiUßbeekeschWendaVijätnamme" + + "eseschWoloffIsi-KhoosaJoruubaSchineeseschSuuluAschenehseschTonehsesc" + + "h ArahbeschAfrehihleschAkahdeschAle’uhteschAhl ÄngleschAljehresch Ar" + + "ahbeschMarokahnesch ArahbeschÄjiptesch ArahbeschPareAmärrekahnesche " + + "BlendeschprohchAstuhrejahneschBeluhtscheschBalinehseschBaireschBemba" + + "BenaBischnuprejahneschBrajeschBrahuijeschBoddoBurejahteschBujinehses" + + "chKopteschKaschuhbeschNiddersorbeschMeddelnehderlängschDassajahnesch" + + "EmbuEfikEmilijahneschAhl ÄjipteschMeddelängleschZätrahl-JupikfilSchw" + + "itzerdütschHauajaaneschEngjuscheschIngjrijahneschJamaikahnesch-Ängle" + + "schLodschbahnJühdesch-PärseschJüteschKapvärdeschKölschde Landa-Schpr" + + "oocheLuyjanesch-ongerscheidlijje Schprooche-Nood-SootoKiromboJackute" + + "schKommooreschTetumschTook Pisin-onbikannte-Schprooch-WalserdütschKa" + + "nton-Schineeseschkein SchproochSchtandatt ArahbeschSödasserbaidschah" + + "neschDeutsch uß ÖßterichDeutsch uß de SchweijzÄnglesch uß Außtraalij" + + "eÄnglesch uß KanadaÄnglesch uß JruußbrettannijeAmärrekaanesch Ängles" + + "chSchpaanesch uß Latting-AmmärrikaSchpahnesch en SchpahnejeSchpahnes" + + "ch en MäxikohFranzüüsesch uß KanadaFranzüüsesch uß de SchweijzFlämes" + + "chBrasilljaanesch PochtojeseschPochtojesesch uß PochtojallSärbokowat" + + "eschSchineesesch en de eijfacher SchreffSchineesesch en de tradizjon" + + "älle Schreff", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0009, 0x0014, 0x0021, 0x002a, 0x0033, 0x003d, 0x004b, + 0x0054, 0x0060, 0x0069, 0x0073, 0x0086, 0x0093, 0x00a0, 0x00ac, + 0x00ac, 0x00b3, 0x00c0, 0x00ca, 0x00d5, 0x00de, 0x00eb, 0x00eb, + 0x00eb, 0x00f3, 0x00f3, 0x0100, 0x0111, 0x011f, 0x012a, 0x0133, + 0x013a, 0x0144, 0x014e, 0x0151, 0x015c, 0x0165, 0x016e, 0x0179, + 0x0182, 0x018a, 0x0193, 0x0193, 0x019b, 0x01a5, 0x01b2, 0x01c0, + 0x01ce, 0x01d5, 0x01d5, 0x01e0, 0x01ec, 0x01fa, 0x01fa, 0x0200, + 0x020b, 0x0210, 0x0210, 0x021a, 0x0226, 0x0230, 0x023a, 0x023a, + // Entry 40 - 7F + 0x023a, 0x0246, 0x0246, 0x024a, 0x024a, 0x024a, 0x024d, 0x0259, + 0x0266, 0x026f, 0x0279, 0x0283, 0x028f, 0x028f, 0x028f, 0x028f, + 0x0299, 0x0299, 0x029e, 0x02a5, 0x02b2, 0x02b2, 0x02bf, 0x02c7, + 0x02c7, 0x02c7, 0x02d2, 0x02dd, 0x02ea, 0x02ea, 0x02ea, 0x02f3, + 0x02fd, 0x0307, 0x0307, 0x0310, 0x031d, 0x031d, 0x0324, 0x0330, + 0x033a, 0x0345, 0x0350, 0x035b, 0x0366, 0x0371, 0x0371, 0x037d, + 0x038a, 0x038a, 0x0396, 0x03a6, 0x03ba, 0x03ba, 0x03ba, 0x03c5, + 0x03c5, 0x03c5, 0x03c5, 0x03cb, 0x03d5, 0x03e2, 0x03e2, 0x03eb, + // Entry 80 - BF + 0x03f8, 0x0405, 0x0410, 0x041f, 0x0429, 0x0433, 0x043d, 0x044c, + 0x0454, 0x0454, 0x045a, 0x046c, 0x0472, 0x0480, 0x048c, 0x0499, + 0x04a5, 0x04b0, 0x04ba, 0x04c4, 0x04cd, 0x04d8, 0x04e2, 0x04ef, + 0x04fa, 0x0505, 0x050f, 0x0517, 0x0524, 0x0530, 0x053f, 0x054c, + 0x0558, 0x0564, 0x056d, 0x057b, 0x0586, 0x058f, 0x059c, 0x05a6, + 0x05b0, 0x05bb, 0x05c0, 0x05d1, 0x05d1, 0x05d1, 0x05d7, 0x05e1, + 0x05e1, 0x05e8, 0x05e8, 0x05f4, 0x05f9, 0x0606, 0x0606, 0x0606, + 0x0606, 0x061a, 0x0626, 0x0626, 0x0626, 0x062f, 0x062f, 0x063c, + // Entry C0 - FF + 0x063c, 0x063c, 0x0649, 0x0649, 0x0649, 0x0649, 0x0649, 0x0649, + 0x065d, 0x065d, 0x0673, 0x0687, 0x068b, 0x06ab, 0x06ba, 0x06ba, + 0x06ba, 0x06c7, 0x06d3, 0x06db, 0x06db, 0x06db, 0x06db, 0x06db, + 0x06db, 0x06e0, 0x06e0, 0x06e4, 0x06e4, 0x06e4, 0x06e4, 0x06e4, + 0x06e4, 0x06e4, 0x06e4, 0x06e4, 0x06e4, 0x06f6, 0x06f6, 0x06fe, + 0x0709, 0x070e, 0x070e, 0x071a, 0x0726, 0x0726, 0x0726, 0x0726, + 0x0726, 0x0726, 0x0726, 0x0726, 0x0726, 0x0726, 0x0726, 0x0726, + 0x0726, 0x0726, 0x0726, 0x0726, 0x0726, 0x0726, 0x0726, 0x0726, + // Entry 100 - 13F + 0x072e, 0x072e, 0x072e, 0x073a, 0x073a, 0x073a, 0x073a, 0x073a, + 0x073a, 0x073a, 0x073a, 0x073a, 0x073a, 0x0748, 0x0748, 0x0748, + 0x075c, 0x075c, 0x075c, 0x0769, 0x076d, 0x0771, 0x077e, 0x078c, + 0x078c, 0x078c, 0x079b, 0x07a9, 0x07a9, 0x07a9, 0x07a9, 0x07ac, + 0x07ac, 0x07ac, 0x07ac, 0x07ac, 0x07ac, 0x07ac, 0x07ac, 0x07ac, + 0x07ac, 0x07ac, 0x07ac, 0x07ac, 0x07ac, 0x07ac, 0x07ac, 0x07ac, + 0x07ac, 0x07ac, 0x07ac, 0x07ac, 0x07ac, 0x07ac, 0x07ac, 0x07ac, + 0x07ac, 0x07ac, 0x07bc, 0x07bc, 0x07bc, 0x07bc, 0x07bc, 0x07bc, + // Entry 140 - 17F + 0x07bc, 0x07c8, 0x07c8, 0x07c8, 0x07c8, 0x07c8, 0x07c8, 0x07c8, + 0x07c8, 0x07c8, 0x07c8, 0x07c8, 0x07d4, 0x07e2, 0x07f9, 0x0803, + 0x0803, 0x0803, 0x0816, 0x0816, 0x081e, 0x081e, 0x081e, 0x081e, + 0x081e, 0x081e, 0x081e, 0x081e, 0x081e, 0x081e, 0x081e, 0x082a, + 0x082a, 0x082a, 0x082a, 0x082a, 0x082a, 0x082a, 0x082a, 0x082a, + 0x082a, 0x082a, 0x082a, 0x082a, 0x082a, 0x082a, 0x082a, 0x082a, + 0x082a, 0x082a, 0x082a, 0x082a, 0x082a, 0x082a, 0x0831, 0x0831, + 0x0831, 0x0831, 0x0831, 0x0844, 0x0844, 0x0844, 0x0844, 0x0844, + // Entry 180 - 1BF + 0x0844, 0x0844, 0x0844, 0x0844, 0x0844, 0x0844, 0x0844, 0x0844, + 0x0844, 0x0844, 0x0844, 0x0844, 0x084e, 0x084e, 0x084e, 0x084e, + 0x084e, 0x084e, 0x084e, 0x084e, 0x084e, 0x084e, 0x084e, 0x084e, + 0x084e, 0x084e, 0x084e, 0x084e, 0x084e, 0x084e, 0x084e, 0x084e, + 0x084e, 0x084e, 0x084e, 0x084e, 0x084e, 0x084e, 0x084e, 0x086b, + 0x086b, 0x086b, 0x086b, 0x086b, 0x086b, 0x086b, 0x086b, 0x086b, + 0x086b, 0x086b, 0x086b, 0x086b, 0x086b, 0x086b, 0x086b, 0x086b, + 0x086b, 0x086b, 0x086b, 0x086b, 0x086b, 0x0875, 0x0875, 0x0875, + // Entry 1C0 - 1FF + 0x0875, 0x0875, 0x0875, 0x0875, 0x0875, 0x0875, 0x0875, 0x0875, + 0x0875, 0x0875, 0x0875, 0x0875, 0x0875, 0x0875, 0x0875, 0x0875, + 0x0875, 0x0875, 0x0875, 0x0875, 0x0875, 0x0875, 0x0875, 0x0875, + 0x0875, 0x0875, 0x0875, 0x0875, 0x0875, 0x087c, 0x087c, 0x087c, + 0x087c, 0x087c, 0x087c, 0x087c, 0x087c, 0x0886, 0x0886, 0x0886, + 0x0886, 0x0886, 0x0886, 0x0886, 0x0886, 0x0886, 0x0886, 0x0886, + 0x0886, 0x0886, 0x0886, 0x0886, 0x0886, 0x0886, 0x0886, 0x0886, + 0x0886, 0x0886, 0x0886, 0x0886, 0x0886, 0x0886, 0x0886, 0x0886, + // Entry 200 - 23F + 0x0886, 0x0886, 0x0886, 0x0886, 0x0886, 0x0886, 0x0886, 0x0886, + 0x0886, 0x0886, 0x0886, 0x0891, 0x0891, 0x0891, 0x0891, 0x0891, + 0x0891, 0x0891, 0x0891, 0x0891, 0x0899, 0x0899, 0x0899, 0x0899, + 0x0899, 0x0899, 0x0899, 0x0899, 0x0899, 0x0899, 0x08a3, 0x08a3, + 0x08a3, 0x08a3, 0x08a3, 0x08a3, 0x08a3, 0x08a3, 0x08a3, 0x08a3, + 0x08a3, 0x08a3, 0x08a3, 0x08a3, 0x08b9, 0x08b9, 0x08b9, 0x08b9, + 0x08b9, 0x08b9, 0x08b9, 0x08b9, 0x08b9, 0x08c6, 0x08c6, 0x08c6, + 0x08c6, 0x08c6, 0x08c6, 0x08c6, 0x08c6, 0x08c6, 0x08c6, 0x08c6, + // Entry 240 - 27F + 0x08c6, 0x08c6, 0x08c6, 0x08d9, 0x08d9, 0x08d9, 0x08d9, 0x08d9, + 0x08d9, 0x08d9, 0x08e7, 0x08e7, 0x08fb, 0x0912, 0x0928, 0x093f, + 0x0959, 0x096d, 0x098c, 0x09a5, 0x09c7, 0x09e0, 0x09f7, 0x09f7, + 0x0a10, 0x0a2e, 0x0a2e, 0x0a37, 0x0a54, 0x0a70, 0x0a70, 0x0a7f, + 0x0aa3, 0x0acc, + }, + }, + { // kw + "kernewek", + []uint16{ // 90 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0008, + }, + }, + { // ky + kyLangStr, + kyLangIdx, + }, + { // lag + "KɨakáaniKɨmʉháariKɨaráabuKɨberalúusiKɨbulugáriaKɨbangálaKɨchéekiKɨjerʉmá" + + "aniKɨgiríkiKɨɨngeréesaKɨhispániaKɨajéemiKɨfaráansaKɨhaúusaKɨhíindiKɨ" + + "hungáriKɨɨndonésiaKiígiboKɨtaliáanoKɨjapáaniKɨjáavaKɨkambódiaKɨkoréa" + + "KɨmelésiaKɨbáamaKɨnepáaliKɨholáanziKɨpúnjabiKɨpólandiKɨréenoKɨromaní" + + "aKɨrúusiKɨnyarwáandaKɨsómáaliKɨswíidiKɨtamíiliKɨtáilandiKɨturúukiKɨu" + + "kɨraníaKɨúrduKɨvietináamuKɨyorúubaKɨchíinaKɨzúuluKɨlaangi", + []uint16{ // 379 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0016, 0x0016, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x002d, 0x003a, + 0x003a, 0x003a, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0045, 0x0045, 0x0045, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, + 0x005d, 0x005d, 0x005d, 0x005d, 0x0067, 0x0075, 0x0075, 0x0081, + 0x0081, 0x0081, 0x008b, 0x008b, 0x008b, 0x008b, 0x008b, 0x0097, + 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, 0x00a1, + 0x00a1, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00b6, 0x00b6, 0x00b6, + // Entry 40 - 7F + 0x00b6, 0x00c4, 0x00c4, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, + 0x00d8, 0x00d8, 0x00e3, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, + 0x00ec, 0x00ec, 0x00f8, 0x00f8, 0x0101, 0x0101, 0x0101, 0x0101, + 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, + 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, + 0x0101, 0x0101, 0x0101, 0x010c, 0x010c, 0x0115, 0x0115, 0x0115, + 0x0120, 0x0120, 0x012c, 0x012c, 0x012c, 0x012c, 0x012c, 0x012c, + 0x012c, 0x012c, 0x012c, 0x012c, 0x012c, 0x0137, 0x0137, 0x0142, + // Entry 80 - BF + 0x0142, 0x014b, 0x014b, 0x014b, 0x014b, 0x0156, 0x015f, 0x016d, + 0x016d, 0x016d, 0x016d, 0x016d, 0x016d, 0x016d, 0x016d, 0x016d, + 0x016d, 0x016d, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, 0x0179, + 0x0183, 0x0183, 0x018e, 0x018e, 0x018e, 0x019a, 0x019a, 0x019a, + 0x019a, 0x019a, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01b2, + 0x01ba, 0x01ba, 0x01ba, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, + 0x01c8, 0x01d3, 0x01d3, 0x01dd, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + // Entry C0 - FF + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + // Entry 100 - 13F + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + // Entry 140 - 17F + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01ef, + }, + }, + { // lb + "AfarAbchaseschAvesteschAfrikaansAkanAmhareschAragoneseschArabeschAssames" + + "eschAwareschAymaraAserbaidschaneschBaschkireschWäissrusseschBulgares" + + "chBislamaBambara-SproochBengaleschTibeteschBretoneschBosneschKatalan" + + "eschTschetscheneschChamorro-SproochKorseschCreeTschecheschKierchesla" + + "weschTschuwascheschWaliseschDäneschDäitschMaldiveschBhutaneschEwe-Sp" + + "roochGriicheschEngleschEsperantoSpueneschEstneschBaskeschPerseschFul" + + "FinneschFidschianeschFäröeschFranséischWestfrieseschIreschSchottesch" + + "t GälleschGalizeschGuaraniGujaratiManxHausaHebräeschHindiHiri-MotuKr" + + "oateschHaitianeschUngareschArmeneschHerero-SproochInterlinguaIndones" + + "eschInterlingueIgbo-SproochSichuan YiInupiakIdo-SproochIslänneschIta" + + "lieneschInukitutJapaneschJavaneschGeorgeschKongoleseschKikuyu-Sprooc" + + "hKwanyamaKasacheschGrönlänneschKambodschaneschKannadaKoreaneschKanur" + + "i-SproochKaschmireschKurdeschKomi-SproochKorneschKirgiseschLatäinLët" + + "zebuergeschGanda-SproochLimburgeschLingalaLaoteschLitaueschLuba-Kata" + + "ngaLetteschMalagassi-SproochMarschalleseschMaoriMazedoneschMalayalam" + + "MongoleschMarathiMalaieschMalteseschBirmaneschNaurueschNord-Ndebele-" + + "SproochNepaleseschNdongaHollänneschNorwegesch NynorskNorwegesch Bokm" + + "ålSüd-Ndebele-SproochNavajoNyanja-SproochOkzitaneschOjibwa-SproochO" + + "romoOrijaOsseteschPandschabeschPaliPolneschPaschtuPortugiseschQuechu" + + "aRätoromaneschRundi-SproochRumäneschRusseschRuandeschSanskritSardesc" + + "hSindhiNordsameschSangoSinghaleseschSlowakeschSloweneschSamoaneschSh" + + "onaSomaliAlbaneschSerbeschSwaziSüd-Sotho-SproochSundaneseschSchwedes" + + "chSuaheliTamileschTeluguTadschikeschThailänneschTigrinjaTurkmeneschT" + + "swana-SproochTongaeschTierkeschTsongaTatareschTahiteschUigureschUkra" + + "ineschUrduUsbekeschVenda-SproochVietnameseschVolapükWallouneschWolof" + + "XhosaJiddeschYorubaZhuangChineseschZuluAceh-SproochAcholi-SproochAda" + + "ngmeAdygéieschTunesescht ArabeschAfrihiliAghemAinu-SproochAkkadeschA" + + "labamaAleuteschGegeschSüd-AlaeschAlengleschAngikaAramäeschMapudungun" + + "AraonaArapaho-SproochAlgerescht ArabeschArawak-SproochMarokkanescht " + + "ArabeschEgyptescht ArabeschAsu (Tanzania)Amerikanesch ZeechesproochA" + + "sturianeschKotavaAwadhiBelutscheschBalineseschBaireschBasaa-SproochB" + + "amunBatak TobaGhomálá’BedauyeBemba-SproochBetawiBenaBafutBadagaBhods" + + "chpuriBikol-SproochBini-SproochBanjareseschKomBlackfoot-SproochBishn" + + "upriyaBachtiareschBraj-BhakhaBrahuiBodoAkooseBurjateschBugineseschBu" + + "luBlinMedumbaCaddoKaribeschCayugaAtsamCebuanoKigaChibcha-SproochTsch" + + "agataeschTrukeseschMariChinookChoctawChipewyanCherokeeCheyenneSorani" + + "KopteschCapiznonKrimtatareschKaschubeschDakota-SproochDargineschTait" + + "aDelaware-SproochSlaveDogribDinka-SproochZarmaDogriNiddersorbeschZen" + + "tral-DusunDualaMëttelhollänneschJola-FonyiDyula-SproochDazagaKiembuE" + + "fikEmilianeschEgypteschEkajukElameschMëttelengleschYup’ikEwondoExtre" + + "madureschPangwe-SproochFilipinoMeänkieliFon-SproochCajunMëttelfransé" + + "ischAlfranséischFrankoprovenzaleschNordfrieseschOstfrieseschFriulesc" + + "hGa-SproochGagauseschGan-ChineseschGayoGbaya-SproochZoroastrianescht" + + " DariGeezGilberteseschGilakiMëttelhéichdäitschAlhéichdäitschGoan-Kon" + + "kaniGondi-SproochMongondouGoteschGrebo-SproochAlgriicheschSchwäizerd" + + "äitschWayuuFarefareGusii-SproochKutchin-SproochHaida-SproochHakka-C" + + "hineseschHawaieschFidschi-HindiHiligaynon-SproochHethiteschMiao-Spro" + + "ochUewersorbeschXiang-ChineseschHupaIbanIbibioIlokano-SproochIngusch" + + "eschIschoreschJamaikanesch-KreoleschLojbanNgombaMachameJiddesch-Pers" + + "eschJiddesch-ArabeschJüteschKarakalpakeschKabyleschKachin-SproochJju" + + "KambaKawiKabardineschKanembuTyapMakondeKabuverdianuKenyangKoroKainga" + + "ngKhasi-SproochSakeschKoyra ChiiniKhowarKirmanjkiKakoKalenjinKimbund" + + "u-SproochKomi-PermiakKonkaniKosraeaneschKpelle-SproochKaratschaiesch" + + "-BalkareschKrioKinaray-aKareleschOraon-SproochShambalaBafiaKölschKum" + + "ükeschKutenai-SproochLadinoLangiLahndaLamba-SproochLesgeschLingua F" + + "ranca NovaLigureschLiveschLakota-SproochLombardeschMongoRotse-Sprooc" + + "hLettgalleschLuba-LuluaLuiseno-SproochLunda-SproochLuo-SproochLushai" + + "-SproochOlulujiaKlassescht ChineseschLasesch SproochMadureseschMafaK" + + "hottaMaithiliMakassareschManding-SproochMassai-SproochMabaMokshaMand" + + "areseschMende-SproochMeru-SproochMorisyenMëttelireschMakhuwa-MeettoM" + + "eta’Micmac-SproochMinangkabau-SproochMandschureschMeithei-SproochMoh" + + "awk-SproochMossi-SproochWest-MariMundangMéisproochegMuskogee-Sprooch" + + "MirandeseschMarwariMentawaiMyeneErsja-MordwineschMazandaraniMin-Nan-" + + "ChineseschNeapolitaneschNamaNidderdäitschNewariNias-SproochNiue-Spro" + + "ochAo NagaKwasioNgiemboonNogaiAlnordeschNovialN’KoNord-Sotho-Sprooch" + + "NuerAl-NewariNyamwezi-SproochNyankoleNyoroNzimaOsage-SproochOsmanesc" + + "hPangasinan-SproochMëttelperseschPampanggan-SproochPapiamentoPalauPi" + + "cardeschPennsylvaniadäitschPlattdäitschAlperseschPfälzesch DäitschPh" + + "önikeschPiemonteseschPonteschPonapeaneschPreiseschAlprovenzaleschQu" + + "iché-SproochKichwa (Chimborazo-Gebidder)RajasthaniOuschterinsel-Spro" + + "ochRarotonganeschRomagnolTarifitRomboRomaniRotumaneschRussineschRovi" + + "anaAromuneschRwaSandawe-SproochJakuteschSamaritaneschSamburuSasakSan" + + "taliSaurashtraNgambaySanguSizilianeschSchotteschSassareseschSenecaSe" + + "naSeriSelkupeschKoyra SenniAlireschSamogiteschTaschelhitSchan-Sprooc" + + "hTschadesch-ArabeschSidamoNidderschleseschSelayarSüdsameschLule-Lapp" + + "eschInari-LappeschSkolt-LappeschSoninke-SproochSogdeschSrananeschSer" + + "er-SproochSahoSaterfrieseschSukuma-SproochSusuSumereschKomoreschKong" + + "o-SwahiliAlsyreschSyreschSchleseschTuluTemneTesoTereno-SproochTetum-" + + "SproochTigreTiv-SproochTokelauaneschTsachureschKlingoneschTlingit-Sp" + + "roochTaleschTamaseqTsonga-SproochNeimelaneseschTuroyoSeediqTsakonesc" + + "hTsimshian-SproochTateschTumbuka-SproochElliceaneschTasawaqTuwinesch" + + "Mëttlert-Atlas-TamazightUdmurteschUgariteschMbundu-SproochRootVai-Sp" + + "roochVenezeschWepseschWestflämeschMainfränkeschWoteschVoroVunjoWalli" + + "serdäitschWalamo-SproochWarayWasho-SproochWu-ChineseschKalmückeschMi" + + "ngrelesch SproochSogaYao-SproochYapeseschYangbenYembaNheengatuKanton" + + "eseschZapotekeschBliss-SymbolerSeelänneschZenagaMarokkanescht Standa" + + "rd-TamazightZuni-SproochKeng SproochinhalterZazaModernt Héicharabesc" + + "hÉisträichescht DäitschSchwäizer HéichdäitschAustralescht EngleschKa" + + "nadescht EngleschBritescht EngleschAmerikanescht EngleschLatäinameri" + + "kanescht SpueneschEuropäescht SpueneschMexikanescht SpueneschKanades" + + "cht FranséischSchwäizer FranséischFlämeschBrasilianescht Portugisesc" + + "hEuropäescht PortugiseschMoldaweschSerbo-KroateschChinesesch (verein" + + "facht)Chinesesch (traditionell)", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000e, 0x0017, 0x0020, 0x0024, 0x002d, 0x0039, + 0x0041, 0x004c, 0x0054, 0x005a, 0x006b, 0x0077, 0x0085, 0x008f, + 0x0096, 0x00a5, 0x00af, 0x00b8, 0x00c2, 0x00ca, 0x00d5, 0x00e4, + 0x00f4, 0x00fc, 0x0100, 0x010b, 0x011a, 0x0128, 0x0131, 0x0139, + 0x0141, 0x014b, 0x0155, 0x0160, 0x016a, 0x0172, 0x017b, 0x0184, + 0x018c, 0x0194, 0x019c, 0x019f, 0x01a7, 0x01b4, 0x01be, 0x01c9, + 0x01d6, 0x01dc, 0x01f1, 0x01fa, 0x0201, 0x0209, 0x020d, 0x0212, + 0x021c, 0x0221, 0x022a, 0x0233, 0x023e, 0x0247, 0x0250, 0x025e, + // Entry 40 - 7F + 0x0269, 0x0274, 0x027f, 0x028b, 0x0295, 0x029c, 0x02a7, 0x02b2, + 0x02bd, 0x02c5, 0x02ce, 0x02d7, 0x02e0, 0x02ec, 0x02fa, 0x0302, + 0x030c, 0x031a, 0x0329, 0x0330, 0x033a, 0x0348, 0x0354, 0x035c, + 0x0368, 0x0370, 0x037a, 0x0381, 0x0390, 0x039d, 0x03a8, 0x03af, + 0x03b7, 0x03c0, 0x03cc, 0x03d4, 0x03e5, 0x03f4, 0x03f9, 0x0404, + 0x040d, 0x0417, 0x041e, 0x0427, 0x0431, 0x043b, 0x0444, 0x0458, + 0x0463, 0x0469, 0x0475, 0x0487, 0x0499, 0x04ad, 0x04b3, 0x04c1, + 0x04cc, 0x04da, 0x04df, 0x04e4, 0x04ed, 0x04fa, 0x04fe, 0x0506, + // Entry 80 - BF + 0x050d, 0x0519, 0x0520, 0x052e, 0x053b, 0x0545, 0x054d, 0x0556, + 0x055e, 0x0566, 0x056c, 0x0577, 0x057c, 0x0589, 0x0593, 0x059d, + 0x05a7, 0x05ac, 0x05b2, 0x05bb, 0x05c3, 0x05c8, 0x05da, 0x05e6, + 0x05f0, 0x05f7, 0x0600, 0x0606, 0x0612, 0x061f, 0x0627, 0x0632, + 0x0640, 0x0649, 0x0652, 0x0658, 0x0661, 0x066a, 0x0673, 0x067d, + 0x0681, 0x068a, 0x0697, 0x06a4, 0x06ac, 0x06b7, 0x06bc, 0x06c1, + 0x06c9, 0x06cf, 0x06d5, 0x06df, 0x06e3, 0x06ef, 0x06fd, 0x0704, + 0x070f, 0x0722, 0x072a, 0x072f, 0x073b, 0x0744, 0x074b, 0x0754, + // Entry C0 - FF + 0x075b, 0x0767, 0x0771, 0x0777, 0x0781, 0x078b, 0x0791, 0x07a0, + 0x07b3, 0x07c1, 0x07d7, 0x07ea, 0x07f8, 0x0812, 0x081e, 0x0824, + 0x082a, 0x0836, 0x0841, 0x0849, 0x0856, 0x085b, 0x0865, 0x0871, + 0x0878, 0x0885, 0x088b, 0x088f, 0x0894, 0x089a, 0x089a, 0x08a5, + 0x08b2, 0x08be, 0x08ca, 0x08cd, 0x08de, 0x08e9, 0x08f5, 0x0900, + 0x0906, 0x090a, 0x0910, 0x091a, 0x0925, 0x0929, 0x092d, 0x0934, + 0x0939, 0x0942, 0x0948, 0x094d, 0x0954, 0x0958, 0x0967, 0x0974, + 0x097e, 0x0982, 0x0989, 0x0990, 0x0999, 0x09a1, 0x09a9, 0x09af, + // Entry 100 - 13F + 0x09b7, 0x09bf, 0x09cc, 0x09d7, 0x09e5, 0x09ef, 0x09f4, 0x0a04, + 0x0a09, 0x0a0f, 0x0a1c, 0x0a21, 0x0a26, 0x0a34, 0x0a41, 0x0a46, + 0x0a59, 0x0a63, 0x0a70, 0x0a76, 0x0a7c, 0x0a80, 0x0a8b, 0x0a94, + 0x0a9a, 0x0aa2, 0x0ab1, 0x0ab9, 0x0abf, 0x0acd, 0x0adb, 0x0ae3, + 0x0aed, 0x0af8, 0x0afd, 0x0b0f, 0x0b1c, 0x0b2f, 0x0b3c, 0x0b48, + 0x0b51, 0x0b5b, 0x0b65, 0x0b73, 0x0b77, 0x0b84, 0x0b99, 0x0b9d, + 0x0baa, 0x0bb0, 0x0bc5, 0x0bd5, 0x0be1, 0x0bee, 0x0bf7, 0x0bfe, + 0x0c0b, 0x0c17, 0x0c29, 0x0c2e, 0x0c36, 0x0c43, 0x0c52, 0x0c5f, + // Entry 140 - 17F + 0x0c6f, 0x0c78, 0x0c85, 0x0c97, 0x0ca1, 0x0cad, 0x0cba, 0x0cca, + 0x0cce, 0x0cd2, 0x0cd8, 0x0ce7, 0x0cf2, 0x0cfc, 0x0d12, 0x0d18, + 0x0d1e, 0x0d25, 0x0d36, 0x0d47, 0x0d4f, 0x0d5d, 0x0d66, 0x0d74, + 0x0d77, 0x0d7c, 0x0d80, 0x0d8c, 0x0d93, 0x0d97, 0x0d9e, 0x0daa, + 0x0db1, 0x0db5, 0x0dbd, 0x0dca, 0x0dd1, 0x0ddd, 0x0de3, 0x0dec, + 0x0df0, 0x0df8, 0x0e08, 0x0e14, 0x0e1b, 0x0e27, 0x0e35, 0x0e4e, + 0x0e52, 0x0e5b, 0x0e64, 0x0e71, 0x0e79, 0x0e7e, 0x0e85, 0x0e8f, + 0x0e9e, 0x0ea4, 0x0ea9, 0x0eaf, 0x0ebc, 0x0ec4, 0x0ed6, 0x0edf, + // Entry 180 - 1BF + 0x0ee6, 0x0ef4, 0x0eff, 0x0f04, 0x0f11, 0x0f11, 0x0f1d, 0x0f27, + 0x0f36, 0x0f43, 0x0f4e, 0x0f5c, 0x0f64, 0x0f79, 0x0f88, 0x0f93, + 0x0f97, 0x0f9d, 0x0fa5, 0x0fb1, 0x0fc0, 0x0fce, 0x0fd2, 0x0fd8, + 0x0fe4, 0x0ff1, 0x0ffd, 0x1005, 0x1012, 0x1020, 0x1027, 0x1035, + 0x1048, 0x1055, 0x1064, 0x1072, 0x107f, 0x1088, 0x108f, 0x109c, + 0x10ac, 0x10b8, 0x10bf, 0x10c7, 0x10cc, 0x10dd, 0x10e8, 0x10fa, + 0x1108, 0x110c, 0x111a, 0x1120, 0x112c, 0x1138, 0x113f, 0x1145, + 0x114e, 0x1153, 0x115d, 0x1163, 0x1169, 0x117b, 0x117f, 0x1188, + // Entry 1C0 - 1FF + 0x1198, 0x11a0, 0x11a5, 0x11aa, 0x11b7, 0x11c0, 0x11d2, 0x11e1, + 0x11f3, 0x11fd, 0x1202, 0x120c, 0x1220, 0x122d, 0x1237, 0x124a, + 0x1255, 0x1262, 0x126a, 0x1276, 0x127f, 0x128e, 0x129d, 0x12b9, + 0x12c3, 0x12d8, 0x12e6, 0x12ee, 0x12f5, 0x12fa, 0x1300, 0x130b, + 0x1315, 0x131c, 0x1326, 0x1329, 0x1338, 0x1341, 0x134e, 0x1355, + 0x135a, 0x1361, 0x136b, 0x1372, 0x1377, 0x1383, 0x138d, 0x1399, + 0x1399, 0x139f, 0x13a3, 0x13a7, 0x13b1, 0x13bc, 0x13c4, 0x13cf, + 0x13d9, 0x13e6, 0x13f9, 0x13ff, 0x140f, 0x1416, 0x1421, 0x142e, + // Entry 200 - 23F + 0x143c, 0x144a, 0x1459, 0x1461, 0x146b, 0x1478, 0x147c, 0x148a, + 0x1498, 0x149c, 0x14a5, 0x14ae, 0x14bb, 0x14c4, 0x14cb, 0x14d5, + 0x14d9, 0x14de, 0x14e2, 0x14f0, 0x14fd, 0x1502, 0x150d, 0x151a, + 0x1525, 0x1530, 0x153f, 0x1546, 0x154d, 0x155b, 0x1569, 0x156f, + 0x1575, 0x157f, 0x1590, 0x1597, 0x15a6, 0x15b2, 0x15b9, 0x15c2, + 0x15db, 0x15e5, 0x15ef, 0x15fd, 0x1601, 0x160c, 0x1615, 0x161d, + 0x162a, 0x1638, 0x163f, 0x1643, 0x1648, 0x1658, 0x1666, 0x166b, + 0x1678, 0x1678, 0x1685, 0x1691, 0x16a4, 0x16a8, 0x16b3, 0x16bc, + // Entry 240 - 27F + 0x16c3, 0x16c8, 0x16d1, 0x16dd, 0x16e8, 0x16f6, 0x1702, 0x1708, + 0x1728, 0x1734, 0x1748, 0x174c, 0x1762, 0x1762, 0x177b, 0x1794, + 0x17a9, 0x17bc, 0x17ce, 0x17e4, 0x1802, 0x1818, 0x182e, 0x182e, + 0x1844, 0x185a, 0x185a, 0x1863, 0x187e, 0x1897, 0x18a1, 0x18b0, + 0x18c8, 0x18e1, + }, + }, + { // lg + "Lu-akaaniLu-amharikiLuwarabuLubelarusiLubulugariyaLubengaliLuceekeLudaak" + + "iLugereeki/LuyonaaniLungerezaLusipanyaLuperusiLufalansaLuhawuzaLuhin" + + "duLuhangareLuyindonezyaLuyiboLuyitaleLujapaniLunnajjavaLukmeLukoreya" + + "LugandaLumalayiLubbamaLunepaliLuholandiLupunjabiLupolandiLupotugiizi" + + "LulomaniyaLulasaLunarwandaLusomaliyaLuswideniLutamiiruLuttaayiLutake" + + "LuyukurayineLu-uruduLuvyetinaamuLuyorubaLucayinaLuzzulu", + []uint16{ // 181 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0014, 0x0014, + 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x0026, 0x0032, + 0x0032, 0x0032, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, + 0x003b, 0x003b, 0x003b, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, + 0x0049, 0x0049, 0x0049, 0x0049, 0x005c, 0x0065, 0x0065, 0x006e, + 0x006e, 0x006e, 0x0076, 0x0076, 0x0076, 0x0076, 0x0076, 0x007f, + 0x007f, 0x007f, 0x007f, 0x007f, 0x007f, 0x007f, 0x007f, 0x0087, + 0x0087, 0x008e, 0x008e, 0x008e, 0x008e, 0x0097, 0x0097, 0x0097, + // Entry 40 - 7F + 0x0097, 0x00a3, 0x00a3, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, + 0x00b1, 0x00b1, 0x00b9, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, + 0x00c3, 0x00c3, 0x00c8, 0x00c8, 0x00d0, 0x00d0, 0x00d0, 0x00d0, + 0x00d0, 0x00d0, 0x00d0, 0x00d0, 0x00d0, 0x00d7, 0x00d7, 0x00d7, + 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d7, + 0x00d7, 0x00d7, 0x00d7, 0x00df, 0x00df, 0x00e6, 0x00e6, 0x00e6, + 0x00ee, 0x00ee, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, + 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x0100, 0x0100, 0x0109, + // Entry 80 - BF + 0x0109, 0x0114, 0x0114, 0x0114, 0x0114, 0x011e, 0x0124, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, + 0x0141, 0x0141, 0x014a, 0x014a, 0x014a, 0x0152, 0x0152, 0x0152, + 0x0152, 0x0152, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0164, + 0x016c, 0x016c, 0x016c, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, + 0x0178, 0x0180, 0x0180, 0x0188, 0x018f, + }, + }, + { // lkt + "Abkhaz IyápiAvestan IyápiAfrikaans IyápiAmharic IyápiArab IyápiAssamese " + + "IyápiAvaric IyápiAzerbaijani IyápiBashkir IyápiBelarus IyápiBulgar I" + + "yápiBengali IyápiTibetan IyápiBosnia IyápiCatalan IyápiChechen Iyápi" + + "Maštíŋča Oyáte IyápiCzech IyápiChuvash IyápiWales IyápiDane IyápiIyá" + + "šiča IyápiGreece IyápiWašíčuiyapiEsperanto IyápiSpayóla IyápiEstoni" + + "a IyápiBasque IyápiPersian IyápiFinnish IyápiFiji IyápiFaroese Iyápi" + + "Wašíču Ikčéka IyápiIrish IyápiGalician IyápiGuarani IyápiGujarati Iy" + + "ápiHausa IyápiHebrew IyápiHindi IyápiCroatian IyápiHaiti IyápiHunga" + + "ry IyápiArmenia IyápiIndonesia IyápiIgbo IyápiIceland IyápiItalia Iy" + + "ápiKisúŋla IyápiJava IyápiGeoria IyápiKazakh IyápiKhmer IyápiKannad" + + "a IyápiKorea IyápiKashmir IyápiKurd IyápiKirghiz IyápiLatin IyápiLux" + + "embourg IyápiLao IyápiLithuania IyápiltLatvia IyápiMalagasy IyápiMao" + + "ri IyápiMacedonia IyápiMalayalam IyápiMarathi IyápiMalay IyápiMaltes" + + "e IyápiBurmese IyápiNepal IyápiDutch IyápiŠináglegleǧa IyápiȞaȟátȟuŋ" + + "waŋ IyápiOriya IyápiPunjabi IyápiPolish IyápiPashto IyápiPortuguese " + + "IyápiQuechua IyápiRomansh IyápiRomanian IyápiRussia IyápiSanskrit Iy" + + "ápiSindhi IyápiSinhala IyápiSlovak IyápiSlovenian IyápiSomali Iyápi" + + "Albanian IyápiSerbia IyápiSundanese IyápiSwedish IyápiSwahili IyápiT" + + "amil IyápiTelugu IyápiTajik IyápiThai IyápiTigrinya IyápiTurkmen Iyá" + + "piTongan IyápiTurkish IyápiTatar IyápiUyghur IyápiUkrain IyápiUrdu I" + + "yápiUzbek IyápiVietnamese IyápiWolof IyápiXhosa IyápiYoruba IyápiPȟe" + + "čhókaŋ Háŋska IyápiZulu IyápiAdyghe IyápiItóǧata Altai IyápiMaȟpíya" + + " Tȟó IyápiBaluchi IyápiBamun IyápiBeja IyápiBuriat IyápiMari IyápiCh" + + "erokee IyápiŠahíyela IyápiCoptic IyápiCrimean Turkish IyápiDakȟótiya" + + "piDargwa IyápiDogri IyápiFilipino IyápiGbaya IyápiHawaiian IyápiIngu" + + "sh IyápiKara-Kalpak IyápiKabardian IyápiLahnda IyápiLakȟólʼiyapiMizo" + + " IyápiNamipuri IyápiComonian IyápiTukté iyápi tȟaŋíŋ šniZaza IyápiŠa" + + "gláša WašíčuiyapiMílahaŋska WašíčuiyapiWiyóȟpeyata Spayóla IyápiSpay" + + "ólaȟča IyápiFlemish IyápiPȟečhókaŋ Háŋska Iyápi IkčékaPȟečhókaŋ Háŋ" + + "ska Iyápi Ȟče", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x000d, 0x001b, 0x002b, 0x002b, 0x0039, 0x0039, + 0x0044, 0x0053, 0x0060, 0x0060, 0x0072, 0x0080, 0x008e, 0x009b, + 0x009b, 0x009b, 0x00a9, 0x00b7, 0x00b7, 0x00c4, 0x00d2, 0x00e0, + 0x00e0, 0x00e0, 0x00fa, 0x0106, 0x0106, 0x0114, 0x0120, 0x012b, + 0x013c, 0x013c, 0x013c, 0x013c, 0x0149, 0x0157, 0x0167, 0x0176, + 0x0184, 0x0191, 0x019f, 0x019f, 0x01ad, 0x01b8, 0x01c6, 0x01df, + 0x01df, 0x01eb, 0x01eb, 0x01fa, 0x0208, 0x0217, 0x0217, 0x0223, + 0x0230, 0x023c, 0x023c, 0x024b, 0x0257, 0x0265, 0x0273, 0x0273, + // Entry 40 - 7F + 0x0273, 0x0283, 0x0283, 0x028e, 0x028e, 0x028e, 0x028e, 0x029c, + 0x02a9, 0x02a9, 0x02b9, 0x02c4, 0x02d1, 0x02d1, 0x02d1, 0x02d1, + 0x02de, 0x02de, 0x02ea, 0x02f8, 0x0304, 0x0304, 0x0312, 0x031d, + 0x031d, 0x031d, 0x032b, 0x0337, 0x0348, 0x0348, 0x0348, 0x0348, + 0x0352, 0x0364, 0x0364, 0x0371, 0x0380, 0x0380, 0x038c, 0x039c, + 0x03ac, 0x03ac, 0x03ba, 0x03c6, 0x03d4, 0x03e2, 0x03e2, 0x03e2, + 0x03ee, 0x03ee, 0x03fa, 0x03fa, 0x03fa, 0x03fa, 0x0410, 0x0410, + 0x0410, 0x0428, 0x0428, 0x0434, 0x0434, 0x0442, 0x0442, 0x044f, + // Entry 80 - BF + 0x045c, 0x046d, 0x047b, 0x0489, 0x0489, 0x0498, 0x04a5, 0x04a5, + 0x04b4, 0x04b4, 0x04c1, 0x04c1, 0x04c1, 0x04cf, 0x04dc, 0x04ec, + 0x04ec, 0x04ec, 0x04f9, 0x0508, 0x0515, 0x0515, 0x0515, 0x0525, + 0x0533, 0x0541, 0x054d, 0x055a, 0x0566, 0x0571, 0x0580, 0x058e, + 0x058e, 0x059b, 0x05a9, 0x05a9, 0x05b5, 0x05b5, 0x05c2, 0x05cf, + 0x05da, 0x05e6, 0x05e6, 0x05f7, 0x05f7, 0x05f7, 0x0603, 0x060f, + 0x060f, 0x061c, 0x061c, 0x0639, 0x0644, 0x0644, 0x0644, 0x0644, + 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, + // Entry C0 - FF + 0x0651, 0x0667, 0x0667, 0x0667, 0x0667, 0x0667, 0x0667, 0x067d, + 0x067d, 0x067d, 0x067d, 0x067d, 0x067d, 0x067d, 0x067d, 0x067d, + 0x067d, 0x068b, 0x068b, 0x068b, 0x068b, 0x0697, 0x0697, 0x0697, + 0x06a2, 0x06a2, 0x06a2, 0x06a2, 0x06a2, 0x06a2, 0x06a2, 0x06a2, + 0x06a2, 0x06a2, 0x06a2, 0x06a2, 0x06a2, 0x06a2, 0x06a2, 0x06a2, + 0x06a2, 0x06a2, 0x06a2, 0x06af, 0x06af, 0x06af, 0x06af, 0x06af, + 0x06af, 0x06af, 0x06af, 0x06af, 0x06af, 0x06af, 0x06af, 0x06af, + 0x06af, 0x06ba, 0x06ba, 0x06ba, 0x06ba, 0x06c9, 0x06da, 0x06da, + // Entry 100 - 13F + 0x06e7, 0x06e7, 0x06fd, 0x06fd, 0x070a, 0x0717, 0x0717, 0x0717, + 0x0717, 0x0717, 0x0717, 0x0717, 0x0723, 0x0723, 0x0723, 0x0723, + 0x0723, 0x0723, 0x0723, 0x0723, 0x0723, 0x0723, 0x0723, 0x0723, + 0x0723, 0x0723, 0x0723, 0x0723, 0x0723, 0x0723, 0x0723, 0x0732, + 0x0732, 0x0732, 0x0732, 0x0732, 0x0732, 0x0732, 0x0732, 0x0732, + 0x0732, 0x0732, 0x0732, 0x0732, 0x0732, 0x073e, 0x073e, 0x073e, + 0x073e, 0x073e, 0x073e, 0x073e, 0x073e, 0x073e, 0x073e, 0x073e, + 0x073e, 0x073e, 0x073e, 0x073e, 0x073e, 0x073e, 0x073e, 0x073e, + // Entry 140 - 17F + 0x073e, 0x074d, 0x074d, 0x074d, 0x074d, 0x074d, 0x074d, 0x074d, + 0x074d, 0x074d, 0x074d, 0x074d, 0x075a, 0x075a, 0x075a, 0x075a, + 0x075a, 0x075a, 0x075a, 0x075a, 0x075a, 0x076c, 0x076c, 0x076c, + 0x076c, 0x076c, 0x076c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, + 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, + 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, + 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, 0x077c, + 0x077c, 0x077c, 0x077c, 0x0789, 0x0789, 0x0789, 0x0789, 0x0789, + // Entry 180 - 1BF + 0x0789, 0x0798, 0x0798, 0x0798, 0x0798, 0x0798, 0x0798, 0x0798, + 0x0798, 0x0798, 0x0798, 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a3, + 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a3, + 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a3, + 0x07a3, 0x07a3, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, + 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, + 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, + 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, + // Entry 1C0 - 1FF + 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, + 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, + 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, + 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, + 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, + 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, + 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, + 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, + // Entry 200 - 23F + 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, 0x07b2, + 0x07b2, 0x07b2, 0x07b2, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, + 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, + 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, + 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, + 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07de, 0x07de, 0x07de, 0x07de, + 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, + 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, + // Entry 240 - 27F + 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, 0x07de, + 0x07de, 0x07de, 0x07de, 0x07e9, 0x07e9, 0x07e9, 0x07e9, 0x07e9, + 0x07e9, 0x07e9, 0x0802, 0x081d, 0x083a, 0x084e, 0x084e, 0x084e, + 0x084e, 0x084e, 0x084e, 0x085c, 0x085c, 0x085c, 0x085c, 0x085c, + 0x0882, 0x08a5, + }, + }, + { // ln + "akanliamarikilialabolibyelorisílibiligalilibengalilitshekɛlialemáligelek" + + "ilingɛlɛ́salisipanyelipelésanɛlifalansɛ́hausalihindiliongililindonez" + + "iigbolitalianolizapɔlizavalikambodzalikoreyalingálalimalezilibilimál" + + "inepalɛlifalamálipendzabilipolonɛlipulutugɛ́siliromanilirisíkinyarwa" + + "ndalisomalilisuwedɛlitamulilitayelitilikilikrɛniliurduliviyetinámiyo" + + "rubalisinwazulu", + []uint16{ // 181 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000d, 0x000d, + 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0020, 0x002a, + 0x002a, 0x002a, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, + 0x0033, 0x0033, 0x0033, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x0044, 0x0044, 0x0044, 0x0044, 0x004c, 0x0059, 0x0059, 0x0062, + 0x0062, 0x0062, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x007a, + 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007f, + 0x007f, 0x0086, 0x0086, 0x0086, 0x0086, 0x008e, 0x008e, 0x008e, + // Entry 40 - 7F + 0x008e, 0x0097, 0x0097, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, + 0x00a4, 0x00a4, 0x00ab, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, + 0x00b1, 0x00b1, 0x00bb, 0x00bb, 0x00c3, 0x00c3, 0x00c3, 0x00c3, + 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00cb, + 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, + 0x00cb, 0x00cb, 0x00cb, 0x00d3, 0x00d3, 0x00dc, 0x00dc, 0x00dc, + 0x00e5, 0x00e5, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, + 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00f8, 0x00f8, 0x0101, + // Entry 80 - BF + 0x0101, 0x0110, 0x0110, 0x0110, 0x0110, 0x0118, 0x011f, 0x012a, + 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, + 0x012a, 0x012a, 0x0132, 0x0132, 0x0132, 0x0132, 0x0132, 0x0132, + 0x013b, 0x013b, 0x0143, 0x0143, 0x0143, 0x0149, 0x0149, 0x0149, + 0x0149, 0x0149, 0x0151, 0x0151, 0x0151, 0x0151, 0x0151, 0x0159, + 0x015f, 0x015f, 0x015f, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x0172, 0x0172, 0x0179, 0x017d, + }, + }, + { // lo + loLangStr, + loLangIdx, + }, + { // lrc + "آذأربایئجانیآفریکانسآکانأمھأریأرأڤیآسامیآذأربایئجانی ھارگەباشکیریبئلاروٙ" + + "سیبولغاریبامبارابأنگالیتأبأتیبئرئتونبوسنیاییکاتالانچئچئنیکوریسکانچو" + + "اشیڤئلزیدانمارکیآلمانیزوٙنگخائڤئیوٙنانیئینگیلیسیئسپئرانتوئسپانیاییئ" + + "ستونیاییباسکیفارسیفأنلاندیفیجیفاروٙسیفآرانسئ ئیفئریسی أفتونئشینئیرل" + + "أندیگالیسیگوٙآرانیگوجأراتیمانکسھائوساعئبریھئنیکوروڤاتیھاییتیمأجاریأ" + + "رمأنیأندونئزیاییئیگبوسی چوان ییئیسلأندیئیتالیاییئینوکتیتوٙتجاپوٙنیج" + + "اڤئ ییگورجیکیکیوٙقأزاقکالالیسوٙتخئمئرکانادکورئ ییکأشمیریکوردی کورما" + + "نجیکورنیشقئرقیزیلاتینلوٙکزامبوٙرگیگاندالینگالالاولیتوڤانیاییلوٙبا ک" + + "اتانگالاتوڤیاییمالاگاشیمائوریمأقدوٙنیمالایامموغولیمأراتیمالاییمالتی" + + "بئرمئ یینئدئبئلئ شومالینئپالیھولأندینورڤئجی نینورسکنورڤئجی بوٙکمالئ" + + "وروموٙئوریاپأنجابیلأھئستانیپأشتوٙپورتئغالیکوچوٙارومانشراندیرومانیای" + + "یروٙسیکینیاروآنداسانسکئریتسئندیسامی شومالیسانگوسینھالائسلوڤاکیئسلوڤ" + + "ئنیاییشوناسوٙمالیآلبانیسئربیسوٙدانیسوٙئدیسأڤاحیلیتامیلتئلئگوتاجیکیت" + + "ایلأندیتیگرینیاتورکأمأنیتوٙنگانتورکیتاتارئویغوٙرئوکراینیئوردوٙئوزبأ" + + "کیڤییئتنامیڤولوفخوٙسایوروباچینیزولوآقئمماپوٙچئآسوٙبیمابئنابألوٙچی أ" + + "قتوٙنئشینبودوچیگاچوروٙکیکوردی سوٙرانیتایتازارماسوربی ھاریدوٙالاجولا" + + " فوٙنییئمبوفیلیپینیگاگائوزآلمانی سوٙئیسیگوٙسیھاڤاییسوربی ڤارونئگوٙمب" + + "اماچامئکابیلئکامباماکوٙندئکاباردینوکی یورا چینیکالئجینکومی پئرمیاکک" + + "وٙنکانیشامبالابافیالانگیلاکوٙتالۊری شومالیلوٙلوٙئیاماساییمئروموٙریس" + + "یماخوڤا میتومئتاٛموٙھاڤکموٙندانگمازأندأرانیناماآلمانی ھاریکئڤاسیوٙن" + + "ئکوٙنیوٙئرنیان کوٙلئکیچیرومبورئڤاسامبوٙروٙسانگوٙکوردی ھارگەسئناکیار" + + "ابورو سئنیتاچئلھیتسامی ھارگەلۉلئ سامیئیناری سامیئسکولت سامیسأڤاحیلی" + + " کونگوتئسوتاساڤاقتامازیغ مینجاییزوٙن نادیارڤایڤوٙنجوٙڤارلپیریسوٙگاتا" + + "مازیغ مأراکئشیبی نئشوٙعروی مدرنآذأری ھارگەآلمانی ئوتریشیآلمانی سوٙی" + + "یسیئینگیلیسی ئوستارالیاییئینگیلیسی کاناداییئینگیلیسی بئریتانیاییئین" + + "گیلیسی ئمریکاییئسپانیایی ئمریکا لاتینئسپانیایی ئوروٙپائسپانیایی مئک" + + "زیکفآرانسئ ئی کانادافآرانسئ ئی سوٙییسآلمانی ھارگە جافئلاماندیپورتئغ" + + "الی بئرئزیلپورتئغالی ئوروٙپاییرومانیایی مولداڤیچینی سادە بیەچینی سو" + + "نأتی", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0018, 0x0018, 0x0028, 0x0030, 0x003c, 0x003c, + 0x0046, 0x0050, 0x0050, 0x0050, 0x0073, 0x0081, 0x0093, 0x00a1, + 0x00a1, 0x00af, 0x00bd, 0x00c9, 0x00d7, 0x00e7, 0x00f5, 0x0101, + 0x0101, 0x0111, 0x0111, 0x0111, 0x0111, 0x011b, 0x0125, 0x0135, + 0x0141, 0x0141, 0x014f, 0x0155, 0x0163, 0x0175, 0x0187, 0x0199, + 0x01ab, 0x01b5, 0x01bf, 0x01bf, 0x01cf, 0x01d7, 0x01e5, 0x01f8, + 0x0217, 0x0227, 0x0227, 0x0233, 0x0243, 0x0253, 0x025d, 0x0269, + 0x0273, 0x027b, 0x027b, 0x028b, 0x0297, 0x02a3, 0x02af, 0x02af, + // Entry 40 - 7F + 0x02af, 0x02c5, 0x02c5, 0x02cf, 0x02e1, 0x02e1, 0x02e1, 0x02f1, + 0x0303, 0x0319, 0x0327, 0x0334, 0x033e, 0x033e, 0x034a, 0x034a, + 0x0354, 0x0368, 0x0372, 0x037c, 0x0389, 0x0389, 0x0397, 0x03b2, + 0x03b2, 0x03be, 0x03cc, 0x03d6, 0x03f0, 0x03fa, 0x03fa, 0x0408, + 0x040e, 0x0424, 0x043d, 0x044f, 0x045f, 0x045f, 0x046b, 0x047b, + 0x0489, 0x0495, 0x04a1, 0x04ad, 0x04b7, 0x04c6, 0x04c6, 0x04e3, + 0x04ef, 0x04ef, 0x04fd, 0x051a, 0x0537, 0x0537, 0x0537, 0x0537, + 0x0537, 0x0537, 0x0545, 0x054f, 0x054f, 0x055d, 0x055d, 0x056f, + // Entry 80 - BF + 0x057b, 0x058d, 0x0599, 0x05a5, 0x05af, 0x05c1, 0x05cb, 0x05e1, + 0x05f3, 0x05f3, 0x05fd, 0x0612, 0x061c, 0x062a, 0x063a, 0x0650, + 0x0650, 0x0658, 0x0666, 0x0672, 0x067c, 0x067c, 0x067c, 0x068a, + 0x0696, 0x06a6, 0x06b0, 0x06bc, 0x06c8, 0x06d8, 0x06e8, 0x06fa, + 0x06fa, 0x0708, 0x0712, 0x0712, 0x071c, 0x071c, 0x072a, 0x073a, + 0x0746, 0x0754, 0x0754, 0x0766, 0x0766, 0x0766, 0x0770, 0x077a, + 0x077a, 0x0786, 0x0786, 0x078e, 0x0796, 0x0796, 0x0796, 0x0796, + 0x0796, 0x0796, 0x0796, 0x079e, 0x079e, 0x079e, 0x079e, 0x079e, + // Entry C0 - FF + 0x079e, 0x079e, 0x079e, 0x079e, 0x079e, 0x07ac, 0x07ac, 0x07ac, + 0x07ac, 0x07ac, 0x07ac, 0x07ac, 0x07b4, 0x07b4, 0x07b4, 0x07b4, + 0x07b4, 0x07b4, 0x07b4, 0x07b4, 0x07b4, 0x07b4, 0x07b4, 0x07b4, + 0x07b4, 0x07bc, 0x07bc, 0x07c4, 0x07c4, 0x07c4, 0x07e7, 0x07e7, + 0x07e7, 0x07e7, 0x07e7, 0x07e7, 0x07e7, 0x07e7, 0x07e7, 0x07e7, + 0x07e7, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ef, + 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07ef, 0x07f7, 0x07f7, 0x07f7, + 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x07f7, 0x0805, 0x0805, 0x081e, + // Entry 100 - 13F + 0x081e, 0x081e, 0x081e, 0x081e, 0x081e, 0x081e, 0x0828, 0x0828, + 0x0828, 0x0828, 0x0828, 0x0832, 0x0832, 0x0845, 0x0845, 0x0851, + 0x0851, 0x0866, 0x0866, 0x0866, 0x086e, 0x086e, 0x086e, 0x086e, + 0x086e, 0x086e, 0x086e, 0x086e, 0x086e, 0x086e, 0x086e, 0x087e, + 0x087e, 0x087e, 0x087e, 0x087e, 0x087e, 0x087e, 0x087e, 0x087e, + 0x087e, 0x087e, 0x088c, 0x088c, 0x088c, 0x088c, 0x088c, 0x088c, + 0x088c, 0x088c, 0x088c, 0x088c, 0x088c, 0x088c, 0x088c, 0x088c, + 0x088c, 0x088c, 0x08a7, 0x08a7, 0x08a7, 0x08b1, 0x08b1, 0x08b1, + // Entry 140 - 17F + 0x08b1, 0x08bd, 0x08bd, 0x08bd, 0x08bd, 0x08bd, 0x08d0, 0x08d0, + 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, + 0x08e0, 0x08ec, 0x08ec, 0x08ec, 0x08ec, 0x08ec, 0x08f8, 0x08f8, + 0x08f8, 0x0902, 0x0902, 0x0902, 0x0902, 0x0902, 0x0912, 0x0924, + 0x0924, 0x0924, 0x0924, 0x0924, 0x0924, 0x093a, 0x093a, 0x093a, + 0x093a, 0x0948, 0x0948, 0x095f, 0x096f, 0x096f, 0x096f, 0x096f, + 0x096f, 0x096f, 0x096f, 0x096f, 0x097d, 0x0987, 0x0987, 0x0987, + 0x0987, 0x0987, 0x0991, 0x0991, 0x0991, 0x0991, 0x0991, 0x0991, + // Entry 180 - 1BF + 0x0991, 0x099f, 0x099f, 0x099f, 0x099f, 0x09b4, 0x09b4, 0x09b4, + 0x09b4, 0x09b4, 0x09ba, 0x09ba, 0x09c6, 0x09c6, 0x09c6, 0x09c6, + 0x09c6, 0x09c6, 0x09c6, 0x09c6, 0x09c6, 0x09d2, 0x09d2, 0x09d2, + 0x09d2, 0x09d2, 0x09da, 0x09e8, 0x09e8, 0x09fd, 0x0a07, 0x0a07, + 0x0a07, 0x0a07, 0x0a07, 0x0a15, 0x0a15, 0x0a15, 0x0a25, 0x0a25, + 0x0a25, 0x0a25, 0x0a25, 0x0a25, 0x0a25, 0x0a25, 0x0a3b, 0x0a3b, + 0x0a3b, 0x0a43, 0x0a58, 0x0a58, 0x0a58, 0x0a58, 0x0a58, 0x0a68, + 0x0a68, 0x0a68, 0x0a68, 0x0a68, 0x0a72, 0x0a72, 0x0a7e, 0x0a7e, + // Entry 1C0 - 1FF + 0x0a7e, 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a91, + 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a91, + 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a91, 0x0a99, 0x0a99, + 0x0a99, 0x0a99, 0x0a99, 0x0a99, 0x0a99, 0x0aa3, 0x0aa3, 0x0aa3, + 0x0aa3, 0x0aa3, 0x0aa3, 0x0aab, 0x0aab, 0x0aab, 0x0aab, 0x0abd, + 0x0abd, 0x0abd, 0x0abd, 0x0abd, 0x0ac9, 0x0ac9, 0x0ac9, 0x0ac9, + 0x0ade, 0x0ade, 0x0ae6, 0x0ae6, 0x0ae6, 0x0b01, 0x0b01, 0x0b01, + 0x0b11, 0x0b11, 0x0b11, 0x0b11, 0x0b11, 0x0b11, 0x0b24, 0x0b35, + // Entry 200 - 23F + 0x0b4a, 0x0b5f, 0x0b5f, 0x0b5f, 0x0b5f, 0x0b5f, 0x0b5f, 0x0b5f, + 0x0b5f, 0x0b5f, 0x0b5f, 0x0b5f, 0x0b7a, 0x0b7a, 0x0b7a, 0x0b7a, + 0x0b7a, 0x0b7a, 0x0b82, 0x0b82, 0x0b82, 0x0b82, 0x0b82, 0x0b82, + 0x0b82, 0x0b82, 0x0b82, 0x0b82, 0x0b82, 0x0b82, 0x0b82, 0x0b82, + 0x0b82, 0x0b82, 0x0b82, 0x0b82, 0x0b82, 0x0b82, 0x0b90, 0x0b90, + 0x0bad, 0x0bad, 0x0bad, 0x0bad, 0x0bc2, 0x0bc8, 0x0bc8, 0x0bc8, + 0x0bc8, 0x0bc8, 0x0bc8, 0x0bc8, 0x0bd6, 0x0bd6, 0x0bd6, 0x0bd6, + 0x0bd6, 0x0be6, 0x0be6, 0x0be6, 0x0be6, 0x0bf0, 0x0bf0, 0x0bf0, + // Entry 240 - 27F + 0x0bf0, 0x0bf0, 0x0bf0, 0x0bf0, 0x0bf0, 0x0bf0, 0x0bf0, 0x0bf0, + 0x0c0f, 0x0c0f, 0x0c1e, 0x0c1e, 0x0c2f, 0x0c44, 0x0c5f, 0x0c7a, + 0x0ca5, 0x0cc8, 0x0cf1, 0x0d14, 0x0d3e, 0x0d5f, 0x0d7e, 0x0d7e, + 0x0d9e, 0x0dbe, 0x0dda, 0x0dec, 0x0e0d, 0x0e32, 0x0e53, 0x0e53, + 0x0e6b, 0x0e80, + }, + }, + { // lt + ltLangStr, + ltLangIdx, + }, + { // lu + "LiakanLiamharikiArabiBelarusiBulegariBengaliTshekiLizelumaniGilikiLingel" + + "esaLihispaniaMpepajemiMfwàlànsaHausaHindiHongiliLindoneziaIgboLitali" + + "LiyapaniJavaLikoreyaTshilubaLimalezianepaliolandiLipunjabiMpoloniMpu" + + "tulugɛsiLiromaniLirisikinyarwandaLisomaliLisuwidiMtamuiliNtailandiNt" + + "ulukiNkraniUrduLiviyetinamuNyorubashinɛNzulu", + []uint16{ // 181 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0010, 0x0010, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001d, 0x0025, + 0x0025, 0x0025, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, + 0x002c, 0x002c, 0x002c, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x003c, 0x003c, 0x003c, 0x003c, 0x0042, 0x004b, 0x004b, 0x0055, + 0x0055, 0x0055, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x0069, + 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x006e, + 0x006e, 0x0073, 0x0073, 0x0073, 0x0073, 0x007a, 0x007a, 0x007a, + // Entry 40 - 7F + 0x007a, 0x0084, 0x0084, 0x0088, 0x0088, 0x0088, 0x0088, 0x0088, + 0x008e, 0x008e, 0x0096, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, + 0x009a, 0x009a, 0x009a, 0x009a, 0x00a2, 0x00a2, 0x00a2, 0x00a2, + 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, + 0x00a2, 0x00a2, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, + 0x00aa, 0x00aa, 0x00aa, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, + 0x00b9, 0x00b9, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00c8, 0x00c8, 0x00cf, + // Entry 80 - BF + 0x00cf, 0x00db, 0x00db, 0x00db, 0x00db, 0x00e3, 0x00e9, 0x00f4, + 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, + 0x00f4, 0x00f4, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, + 0x0104, 0x0104, 0x010c, 0x010c, 0x010c, 0x0115, 0x0115, 0x0115, + 0x0115, 0x0115, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x0122, + 0x0126, 0x0126, 0x0126, 0x0132, 0x0132, 0x0132, 0x0132, 0x0132, + 0x0132, 0x0139, 0x0139, 0x013f, 0x0144, + }, + }, + { // luo + "KiakanKiamhariKiarabuKibelarusiKibulgariaKibanglaKicheckiKijerumaniKigir" + + "ikiKingerezaKihispaniaKiajemiKifaransaKihausaKihindiKihungariKiindon" + + "esiaKiigboKiitalianoKijapaniKijavaKikambodiaKikoreaKimalesiaKiburmaK" + + "inepaliKiholanziKipunjabiKipolandiKirenoKiromaniaKirusiKinyarwandaKi" + + "somaliKiswidiKitamilKitailandiKiturukiKiukraniaKiurduKivietinamuKiyo" + + "rubaKichinaKizuluDholuo", + []uint16{ // 395 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x0029, + 0x0029, 0x0029, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, + 0x0031, 0x0031, 0x0031, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, + 0x0043, 0x0043, 0x0043, 0x0043, 0x004b, 0x0054, 0x0054, 0x005e, + 0x005e, 0x005e, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0075, + 0x0075, 0x007c, 0x007c, 0x007c, 0x007c, 0x0085, 0x0085, 0x0085, + // Entry 40 - 7F + 0x0085, 0x0090, 0x0090, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, + 0x00a0, 0x00a0, 0x00a8, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00b8, 0x00b8, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00c8, 0x00c8, 0x00cf, 0x00cf, 0x00cf, + 0x00d7, 0x00d7, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, + 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e9, 0x00e9, 0x00f2, + // Entry 80 - BF + 0x00f2, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x0101, 0x0107, 0x0112, + 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, + 0x0112, 0x0112, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, + 0x0121, 0x0121, 0x0128, 0x0128, 0x0128, 0x0132, 0x0132, 0x0132, + 0x0132, 0x0132, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, 0x0143, + 0x0149, 0x0149, 0x0149, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, + 0x0154, 0x015c, 0x015c, 0x0163, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry C0 - FF + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry 100 - 13F + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry 140 - 17F + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry 180 - 1BF + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x016f, + }, + }, + { // luy + "KiakanKiamhariKiarabuKibelarusiKibulgariaKibanglaKicheckiKijerumaniKigir" + + "ikiLusunguKihispaniaKiajemiKifaransaKihausaLuhindiKihungariKiindones" + + "iaKiigboKiitalianoKijapaniKijavaKikambodiaKikoreaKimalesiaKiburmaKin" + + "epaliKiholanziKipunjabiKipolandiKirenoKiromaniaKirusiKinyarwandaKiso" + + "maliKiswidiKitamilKitailandiKiturukiKiukraniaKiurduKivietinamuKiyoru" + + "baKichinaKizuluLuluhia", + []uint16{ // 397 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x0029, + 0x0029, 0x0029, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, + 0x0031, 0x0031, 0x0031, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, + 0x0043, 0x0043, 0x0043, 0x0043, 0x004b, 0x0052, 0x0052, 0x005c, + 0x005c, 0x005c, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x006c, + 0x006c, 0x006c, 0x006c, 0x006c, 0x006c, 0x006c, 0x006c, 0x0073, + 0x0073, 0x007a, 0x007a, 0x007a, 0x007a, 0x0083, 0x0083, 0x0083, + // Entry 40 - 7F + 0x0083, 0x008e, 0x008e, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, + 0x009e, 0x009e, 0x00a6, 0x00ac, 0x00ac, 0x00ac, 0x00ac, 0x00ac, + 0x00ac, 0x00ac, 0x00b6, 0x00b6, 0x00bd, 0x00bd, 0x00bd, 0x00bd, + 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, + 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, 0x00bd, + 0x00bd, 0x00bd, 0x00bd, 0x00c6, 0x00c6, 0x00cd, 0x00cd, 0x00cd, + 0x00d5, 0x00d5, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00e7, 0x00e7, 0x00f0, + // Entry 80 - BF + 0x00f0, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00ff, 0x0105, 0x0110, + 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, + 0x0110, 0x0110, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, + 0x011f, 0x011f, 0x0126, 0x0126, 0x0126, 0x0130, 0x0130, 0x0130, + 0x0130, 0x0130, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0141, + 0x0147, 0x0147, 0x0147, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, + 0x0152, 0x015a, 0x015a, 0x0161, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + // Entry C0 - FF + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + // Entry 100 - 13F + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + // Entry 140 - 17F + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + // Entry 180 - 1BF + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x016e, + }, + }, + { // lv + lvLangStr, + lvLangIdx, + }, + { // mas + "nkʉtʉ́k ɔ́ɔ̄ lAkannkʉtʉ́k ɔ́ɔ̄ lAmharinkʉtʉ́k ɔ́ɔ̄ lmarabunkʉtʉ́k ɔ́ɔ̄ l" + + "Belarusinkʉtʉ́k ɔ́ɔ̄ lBulgarialnkʉtʉ́k ɔ́ɔ̄ lBengalinkʉtʉ́k ɔ́ɔ̄ lch" + + "ekinkʉtʉ́k ɔ́ɔ̄ ljerumaninkʉtʉ́k ɔ́ɔ̄ lgirikinkʉtʉ́k ɔ́ɔ̄ nkɨ́resank" + + "ʉtʉ́k ɔ́ɔ̄ lspaniankʉtʉ́k ɔ́ɔ̄ lpersiankʉtʉ́k ɔ́ɔ̄ faransankʉtʉ́k ɔ" + + "́ɔ̄ hausankʉtʉ́k ɔ́ɔ̄ lmoindinkʉtʉ́k ɔ́ɔ̄ lhungarinkʉtʉ́k ɔ́ɔ̄ Indo" + + "nesiankʉtʉ́k ɔ́ɔ̄ Igbonkʉtʉ́k ɔ́ɔ̄ ltaliannkʉtʉ́k ɔ́ɔ̄ japaninkʉtʉ́k" + + " ɔ́ɔ̄ ljanankʉtʉ́k ɔ́ɔ̄ lkambodiankʉtʉ́k ɔ́ɔ̄ lkoreankʉtʉ́k ɔ́ɔ̄ mal" + + "aynkʉtʉ́k ɔ́ɔ̄ lBurmankʉtʉ́k ɔ́ɔ̄ lnepalinkʉtʉ́k ɔ́ɔ̄ lduchinkʉtʉ́k " + + "ɔ́ɔ̄ lpunjabinkʉtʉ́k ɔ́ɔ̄ lpolandnkʉtʉ́k ɔ́ɔ̄ lportuguesenkʉtʉ́k ɔ́" + + "ɔ̄ lromaniankʉtʉ́k ɔ́ɔ̄ lrusinkʉtʉ́k ɔ́ɔ̄ lruwandankʉtʉ́k ɔ́ɔ̄ lchu" + + "marinkʉtʉ́k ɔ́ɔ̄ lswidinkʉtʉ́k ɔ́ɔ̄ ltamilnkʉtʉ́k ɔ́ɔ̄ ltainkʉtʉ́k ɔ" + + "́ɔ̄ lturukinkʉtʉ́k ɔ́ɔ̄ lkraniankʉtʉ́k ɔ́ɔ̄ lurdunkʉtʉ́k ɔ́ɔ̄ lviet" + + "inamunkʉtʉ́k ɔ́ɔ̄ lyorubankʉtʉ́k ɔ́ɔ̄ lchinankʉtʉ́k ɔ́ɔ̄ lzuluMaa", + []uint16{ // 406 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0019, 0x0034, 0x0034, + 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x006c, 0x0089, + 0x0089, 0x0089, 0x00a6, 0x00a6, 0x00a6, 0x00a6, 0x00a6, 0x00a6, + 0x00a6, 0x00a6, 0x00a6, 0x00c0, 0x00c0, 0x00c0, 0x00c0, 0x00c0, + 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00f8, 0x0116, 0x0116, 0x0131, + 0x0131, 0x0131, 0x014c, 0x014c, 0x014c, 0x014c, 0x014c, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0180, + 0x0180, 0x019b, 0x019b, 0x019b, 0x019b, 0x01b7, 0x01b7, 0x01b7, + // Entry 40 - 7F + 0x01b7, 0x01d4, 0x01d4, 0x01ec, 0x01ec, 0x01ec, 0x01ec, 0x01ec, + 0x0207, 0x0207, 0x0221, 0x023a, 0x023a, 0x023a, 0x023a, 0x023a, + 0x023a, 0x023a, 0x0257, 0x0257, 0x0271, 0x0271, 0x0271, 0x0271, + 0x0271, 0x0271, 0x0271, 0x0271, 0x0271, 0x0271, 0x0271, 0x0271, + 0x0271, 0x0271, 0x0271, 0x0271, 0x0271, 0x0271, 0x0271, 0x0271, + 0x0271, 0x0271, 0x0271, 0x028a, 0x028a, 0x02a4, 0x02a4, 0x02a4, + 0x02bf, 0x02bf, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, + 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02d9, 0x02f5, 0x02f5, 0x0310, + // Entry 80 - BF + 0x0310, 0x032f, 0x032f, 0x032f, 0x032f, 0x034b, 0x0364, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, 0x039c, + 0x03b6, 0x03b6, 0x03d0, 0x03d0, 0x03d0, 0x03e8, 0x03e8, 0x03e8, + 0x03e8, 0x03e8, 0x0403, 0x0403, 0x0403, 0x0403, 0x0403, 0x041e, + 0x0437, 0x0437, 0x0437, 0x0455, 0x0455, 0x0455, 0x0455, 0x0455, + 0x0455, 0x0470, 0x0470, 0x048a, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + // Entry C0 - FF + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + // Entry 100 - 13F + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + // Entry 140 - 17F + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + // Entry 180 - 1BF + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04a6, + }, + }, + { // mer + "KĩakaniKĩamarĩkiKĩarabuKĩbelarusiKĩbulugĩriaKĩbangiraKĩchekiKĩnjamanĩKĩn" + + "girikiKĩngerethaKĩspĩniKĩpasiaKĩfuransiKĩhausaKĩhĩndiKĩhangarĩKĩindo" + + "nesiaKĩigboKĩitalĩKĩjapaniKĩjavaKĩkambodiaKĩkoreaKĩmalesiaKĩburmaKĩn" + + "epaliKĩholandiKĩpunjabuKĩpolandiKĩpochogoKĩromaniaKĩrashiaKĩrwandaKĩ" + + "somaliKĩswideniKĩtamiluKĩthailandiKĩtakĩKĩukirĩniKĩurduKĩvietinamuKĩ" + + "yorubaKĩchinaKĩzuluKĩmĩrũ", + []uint16{ // 411 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0013, 0x0013, + 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x001b, 0x0026, 0x0033, + 0x0033, 0x0033, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, 0x003d, + 0x003d, 0x003d, 0x003d, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0050, 0x0050, 0x0050, 0x0050, 0x005a, 0x0065, 0x0065, 0x006e, + 0x006e, 0x006e, 0x0076, 0x0076, 0x0076, 0x0076, 0x0076, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0088, + 0x0088, 0x0091, 0x0091, 0x0091, 0x0091, 0x009c, 0x009c, 0x009c, + // Entry 40 - 7F + 0x009c, 0x00a8, 0x00a8, 0x00af, 0x00af, 0x00af, 0x00af, 0x00af, + 0x00b8, 0x00b8, 0x00c1, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, + 0x00c8, 0x00c8, 0x00d3, 0x00d3, 0x00db, 0x00db, 0x00db, 0x00db, + 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, + 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, + 0x00db, 0x00db, 0x00db, 0x00e5, 0x00e5, 0x00ed, 0x00ed, 0x00ed, + 0x00f6, 0x00f6, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x010a, 0x010a, 0x0114, + // Entry 80 - BF + 0x0114, 0x011e, 0x011e, 0x011e, 0x011e, 0x0128, 0x0131, 0x013a, + 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, + 0x013a, 0x013a, 0x0143, 0x0143, 0x0143, 0x0143, 0x0143, 0x0143, + 0x014d, 0x014d, 0x0156, 0x0156, 0x0156, 0x0162, 0x0162, 0x0162, + 0x0162, 0x0162, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, 0x0175, + 0x017c, 0x017c, 0x017c, 0x0188, 0x0188, 0x0188, 0x0188, 0x0188, + 0x0188, 0x0191, 0x0191, 0x0199, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + // Entry C0 - FF + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + // Entry 100 - 13F + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + // Entry 140 - 17F + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + // Entry 180 - 1BF + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01a0, 0x01a0, 0x01a9, + }, + }, + { // mfe + "akanamarikarabbielorisbilgarbengalitchekalmangrekangleespagnolpersanfran" + + "sehaoussahindihongrwaindonezienigboitalienzaponezavanekhmer, santral" + + "koreenmalebirmannepaleolandepenjabipoloneportigerouminrisrwandasomal" + + "iswedwatamoulthaïtirkikrenienourdouvietnamienyorubasinwa, mandarinzo" + + "uloukreol morisien", + []uint16{ // 412 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000a, 0x000a, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x0016, 0x001c, + 0x001c, 0x001c, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, + 0x0023, 0x0023, 0x0023, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x002d, 0x002d, 0x002d, 0x002d, 0x0031, 0x0036, 0x0036, 0x003e, + 0x003e, 0x003e, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x004a, + 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x0051, + 0x0051, 0x0056, 0x0056, 0x0056, 0x0056, 0x005d, 0x005d, 0x005d, + // Entry 40 - 7F + 0x005d, 0x0067, 0x0067, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, + 0x0072, 0x0072, 0x0078, 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, + 0x007e, 0x007e, 0x008c, 0x008c, 0x0092, 0x0092, 0x0092, 0x0092, + 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, + 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, + 0x0092, 0x0092, 0x0092, 0x0096, 0x0096, 0x009c, 0x009c, 0x009c, + 0x00a2, 0x00a2, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, + 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00af, 0x00af, 0x00b5, + // Entry 80 - BF + 0x00b5, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00c2, 0x00c5, 0x00cb, + 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, + 0x00cb, 0x00cb, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, + 0x00d7, 0x00d7, 0x00dd, 0x00dd, 0x00dd, 0x00e2, 0x00e2, 0x00e2, + 0x00e2, 0x00e2, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00ee, + 0x00f4, 0x00f4, 0x00f4, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x00fe, + 0x00fe, 0x0104, 0x0104, 0x0113, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + // Entry C0 - FF + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + // Entry 100 - 13F + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + // Entry 140 - 17F + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + // Entry 180 - 1BF + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0127, + }, + }, + { // mg + "AkanAmharikaAraboBielorosyBiolgaraBengaliTsekyAlemaninaGrikaAnglisyEspan" + + "iolaPersaFrantsayhaoussahindihongroàIndonezianinaigboItalianinaJapon" + + "eyJavaneykhmerKoreaninaMalagasyMalayBirmanaNepaleHolandeyPenjabiPolo" + + "neyPortiogeyRomanianinaRosianinaRoandeSomalianinaSoisaTamoilaTaioane" + + "yTiorkaOkrainianinaOrdòVietnamianinaYôrobàSinoa, MandarinZolò", + []uint16{ // 181 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000c, 0x000c, + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x001a, 0x0022, + 0x0022, 0x0022, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, + 0x0029, 0x0029, 0x0029, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x0037, 0x0037, 0x0037, 0x0037, 0x003c, 0x0043, 0x0043, 0x004c, + 0x004c, 0x004c, 0x0051, 0x0051, 0x0051, 0x0051, 0x0051, 0x0059, + 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0059, 0x0060, + 0x0060, 0x0065, 0x0065, 0x0065, 0x0065, 0x006d, 0x006d, 0x006d, + // Entry 40 - 7F + 0x006d, 0x007a, 0x007a, 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, + 0x0088, 0x0088, 0x008f, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, + 0x0096, 0x0096, 0x009b, 0x009b, 0x00a4, 0x00a4, 0x00a4, 0x00a4, + 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00a4, + 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00ac, 0x00ac, 0x00ac, 0x00ac, + 0x00ac, 0x00ac, 0x00ac, 0x00b1, 0x00b1, 0x00b8, 0x00b8, 0x00b8, + 0x00be, 0x00be, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, + 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00cd, 0x00cd, 0x00d4, + // Entry 80 - BF + 0x00d4, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00e8, 0x00f1, 0x00f7, + 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, + 0x00f7, 0x00f7, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, + 0x0107, 0x0107, 0x010e, 0x010e, 0x010e, 0x0116, 0x0116, 0x0116, + 0x0116, 0x0116, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x0128, + 0x012d, 0x012d, 0x012d, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, + 0x013a, 0x0142, 0x0142, 0x0151, 0x0156, + }, + }, + { // mgh + "IkanImhariIarabuIbelausiIbulgariaIbanglaIchekiIjerimaniIgirikiIngilishiI" + + "hispaniolaIajemiIfaransaIhausaIhindiIhungariIgboItalianoIjapaniIjava" + + "IkambodiaIkoreaImalesiaIburmaInepaliIholanziIpunjabiIpolandiNrenoIro" + + "maniaIrisiInyarandaIsomaliIswidiItamilItailandiIturukiIukranIhurduIv" + + "yetinamuIyorubaIchinaIzuluMakua", + []uint16{ // 414 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000a, 0x000a, + 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0018, 0x0021, + 0x0021, 0x0021, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x0037, 0x0037, 0x0037, 0x0037, 0x003e, 0x0047, 0x0047, 0x0052, + 0x0052, 0x0052, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0060, + 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0066, + 0x0066, 0x006c, 0x006c, 0x006c, 0x006c, 0x0074, 0x0074, 0x0074, + // Entry 40 - 7F + 0x0074, 0x0074, 0x0074, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, + 0x0080, 0x0080, 0x0087, 0x008c, 0x008c, 0x008c, 0x008c, 0x008c, + 0x008c, 0x008c, 0x0095, 0x0095, 0x009b, 0x009b, 0x009b, 0x009b, + 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, + 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, + 0x009b, 0x009b, 0x009b, 0x00a3, 0x00a3, 0x00a9, 0x00a9, 0x00a9, + 0x00b0, 0x00b0, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, + 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00c0, 0x00c0, 0x00c8, + // Entry 80 - BF + 0x00c8, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00d5, 0x00da, 0x00e3, + 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, + 0x00e3, 0x00e3, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, + 0x00f0, 0x00f0, 0x00f6, 0x00f6, 0x00f6, 0x00ff, 0x00ff, 0x00ff, + 0x00ff, 0x00ff, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x010c, + 0x0112, 0x0112, 0x0112, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, + 0x011c, 0x0123, 0x0123, 0x0129, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + // Entry C0 - FF + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + // Entry 100 - 13F + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + // Entry 140 - 17F + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + // Entry 180 - 1BF + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x0133, + }, + }, + { // mgo + "metaʼngam tisɔʼ", + []uint16{ // 557 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 80 - BF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry C0 - FF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 100 - 13F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 140 - 17F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 180 - 1BF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + // Entry 1C0 - 1FF + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + // Entry 200 - 23F + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0012, + }, + }, + { // mk + mkLangStr, + mkLangIdx, + }, + { // ml + mlLangStr, + mlLangIdx, + }, + { // mn + mnLangStr, + mnLangIdx, + }, + { // mr + mrLangStr, + mrLangIdx, + }, + { // ms + msLangStr, + msLangIdx, + }, + { // mt + "AfarAbkażjanAvestanAfrikansAkanAmħarikuAragoneseGħarbiAssameseAvarikAjma" + + "raAżerbajġaniBaxkirBelarussuBulgaruBislamaBambaraBengaliTibetjanBren" + + "tonBosnijanKatalanĊeċenĊamorroKorsikuKrijĊekSlaviku tal-KnisjaĊuvaxW" + + "elxDaniżĠermaniżDiveħiDżongkaEweGriegIngliżEsperantoSpanjolEstonjanB" + + "askPersjanFulaħFinlandiżFiġiFawriżFranċiżFriżjanIrlandiżGalliku Skoċ" + + "ċiżGallegjanGwaraniGuġaratiManksĦawsaEbrajkĦindiĦiri MotuKroatHaiti" + + "anUngeriżArmenjanĦereroInterlinguaIndoneżjanInterlingueIgboSichuan Y" + + "iInupjakIdoIżlandiżTaljanInukitutĠappuniżĠavaniżĠorġjanKongoKikujuKu" + + "anyamaKażakKalallisutKmerKannadaKorejanKanuriKaxmiriKurdiżKomiKornik" + + "uKirgiżLatinLetżburgiżGandaLimburgishLingaljanLaoLitwanjanLuba-Katan" + + "gaLatvjanMalagażiMarxallMaoriMaċedonjanMalajalamMongoljanMaratiMalaj" + + "anMaltiBurmiżNawuruNdebele, ta’ FuqNepaliżNdongaOlandiżNinorsk Norve" + + "ġiżBokmahal NorveġiżNdebele, t’IsfelNavaħoĊiċewa; NjanġaOċċitanOġib" + + "waOromo (Afan)OrijaOssettikuPunġabiPaliPollakkPaxtunPortugiżKeċwaRet" + + "o-RomanzRundiRumenRussuKinjarwandaSanskritSardinjanSindiSami ta’ Fuq" + + "SangoSinħaliżSlovakkSlovenSamojanXonaSomaliAlbaniżSerbSwatiSoto, t’I" + + "sfelSundaniżSvediżSwaħiliTamilTeluguTaġikTajlandiżTigrinjaTurkmeniZw" + + "anaTonganTorkTsongaTatarTaħitjanWigurUkranjanUrduUżbekVendaVjetnamiż" + + "VolapukWalloonWolofĦożaJiddixJorubaŻwangĊiniżŻuluAċiniżAkoliAdangmeA" + + "dygheAfriħiliAjnuAkkadjenAleutIngliż, AntikAngikaAramajkArawkanjanAr" + + "apaħoArawakAsturianAwadħiBaluċiBaliniżBasaBejaBembaBojpuriBikolBiniS" + + "iksikaBrajBurjatBuginiżBlinKaddoKaribAtsamSibwanoĊibċaĊagatajĊukeseM" + + "ariĠargon taċ-ĊinukĊostawĊipewjanĊerokijXajennKoptikuCrimean Turkish" + + "; Crimean TatarKashubianDakotaDargwaDelawerjanSlavDogribDinkaDogriLo" + + "wer SorbianDwalaOlandiż, MedjevaliDjulaEfikEġizzjan (Antik)EkajukEla" + + "mitIngliż, MedjevaliEwondoFangFilippinoFonFranċiż, MedjevaliFranċiż," + + " AntikFrijuljanGaGajoGbajaGeezGilbertjanĠermaniku, Medjevali PulitĠe" + + "rmaniku, Antik PulitGondiGorontaloGotikuĠerboGrieg, AntikGwiċinĦajda" + + "ĦawajjanHiligaynonĦittitĦmongUpper SorbianĦupaIbanIlokoIngushLojban" + + "Lhudi-PersjanLhudi-GħarbiKara-KalpakKabuljanKaċinKambaKawiKabardianK" + + "asiKotaniżKimbunduKonkaniKosrejanKpelleKarachay-BalkarKuruskKumikuKu" + + "tenajLadinoLandaLambaLeżgjanMongoLożiLuba-LuluwaLuwisinużLundaLuwaLu" + + "xajMaduriżMagaħiMajtiliMakasarMandingwanMasajMokshaMandarMendeIrland" + + "iż, MedjevaliMikmekMinangkabawManċurjanManipuriMoħakMossiLingwi Dive" + + "rsiKriekMirandiżMarwariErzyaNeapolitanĠermaniż Komuni; Sassonu Komun" + + "iNewariNijasNijuwejanNogaiSkandinav, AntikSoto, ta’ FuqClassical New" + + "ariNjamweżiNyankoleNjoroNżimaOsaġjanTork (Imperu Ottoman)Pangasinjan" + + "PaħlaviPampamgaPapjamentoPalawjanPersjan AntikFeniċjuPonpejanProvenz" + + "al, AntikRaġastaniRapanwiRarotonganiŻingaruAromanijanSandaweJakutSam" + + "ritanSaskaSantaliSkoċċiżSelkupIrlandiż, AntikXanSidamoSouthern SamiL" + + "ule SamiInari SamiSkolt SamiSoninkeSogdienSererSukumaSusuSumerjanSir" + + "janTimneTerenoTetumTigreTivTokelauKlingonTlingitTamaxekTonga (Njasa)" + + "Tok PisinZimxjanTumbukaTuvaluTuvinjanUdmurtUgaritikuUmbunduGħerqVaiV" + + "otikWalamoWarajWaxoKalmykJaoJapeseŻapotekŻenagaŻuniGħarbi Standard M" + + "odernIngliż AwstraljanIngliż BrittanikuIngliż AmerikanFranċiż Kanadi" + + "żFranċiż ŻvizzeruMoldavjanSerbo-KroatĊiniż Simplifikat", + []uint16{ // 609 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000d, 0x0014, 0x001c, 0x0020, 0x0029, 0x0032, + 0x0039, 0x0041, 0x0047, 0x004d, 0x005a, 0x0060, 0x0069, 0x0070, + 0x0077, 0x007e, 0x0085, 0x008d, 0x0094, 0x009c, 0x00a3, 0x00aa, + 0x00b2, 0x00b9, 0x00bd, 0x00c1, 0x00d3, 0x00d9, 0x00dd, 0x00e3, + 0x00ed, 0x00f4, 0x00fc, 0x00ff, 0x0104, 0x010b, 0x0114, 0x011b, + 0x0123, 0x0127, 0x012e, 0x0134, 0x013e, 0x0143, 0x014a, 0x0153, + 0x015b, 0x0164, 0x0176, 0x017f, 0x0186, 0x018f, 0x0194, 0x019a, + 0x01a0, 0x01a6, 0x01b0, 0x01b5, 0x01bc, 0x01c4, 0x01cc, 0x01d3, + // Entry 40 - 7F + 0x01de, 0x01e9, 0x01f4, 0x01f8, 0x0202, 0x0209, 0x020c, 0x0216, + 0x021c, 0x0224, 0x022e, 0x0237, 0x0240, 0x0245, 0x024b, 0x0253, + 0x0259, 0x0263, 0x0267, 0x026e, 0x0275, 0x027b, 0x0282, 0x0289, + 0x028d, 0x0294, 0x029b, 0x02a0, 0x02ac, 0x02b1, 0x02bb, 0x02c4, + 0x02c7, 0x02d0, 0x02dc, 0x02e3, 0x02ec, 0x02f3, 0x02f8, 0x0303, + 0x030c, 0x0315, 0x031b, 0x0322, 0x0327, 0x032e, 0x0334, 0x0346, + 0x034e, 0x0354, 0x035c, 0x036e, 0x0381, 0x0393, 0x039a, 0x03ab, + 0x03b4, 0x03bb, 0x03c7, 0x03cc, 0x03d5, 0x03dd, 0x03e1, 0x03e8, + // Entry 80 - BF + 0x03ee, 0x03f7, 0x03fd, 0x0408, 0x040d, 0x0412, 0x0417, 0x0422, + 0x042a, 0x0433, 0x0438, 0x0446, 0x044b, 0x0455, 0x045c, 0x0462, + 0x0469, 0x046d, 0x0473, 0x047b, 0x047f, 0x0484, 0x0493, 0x049c, + 0x04a3, 0x04ab, 0x04b0, 0x04b6, 0x04bc, 0x04c6, 0x04ce, 0x04d6, + 0x04db, 0x04e1, 0x04e5, 0x04eb, 0x04f0, 0x04f9, 0x04fe, 0x0506, + 0x050a, 0x0510, 0x0515, 0x051f, 0x0526, 0x052d, 0x0532, 0x0538, + 0x053e, 0x0544, 0x054a, 0x0551, 0x0556, 0x055e, 0x0563, 0x056a, + 0x0570, 0x0570, 0x0579, 0x0579, 0x057d, 0x0585, 0x0585, 0x058a, + // Entry C0 - FF + 0x058a, 0x058a, 0x0598, 0x059e, 0x05a5, 0x05af, 0x05af, 0x05b7, + 0x05b7, 0x05bd, 0x05bd, 0x05bd, 0x05bd, 0x05bd, 0x05c5, 0x05c5, + 0x05cc, 0x05d3, 0x05db, 0x05db, 0x05df, 0x05df, 0x05df, 0x05df, + 0x05e3, 0x05e8, 0x05e8, 0x05e8, 0x05e8, 0x05e8, 0x05e8, 0x05ef, + 0x05f4, 0x05f8, 0x05f8, 0x05f8, 0x05ff, 0x05ff, 0x05ff, 0x0603, + 0x0603, 0x0603, 0x0603, 0x0609, 0x0611, 0x0611, 0x0615, 0x0615, + 0x061a, 0x061f, 0x061f, 0x0624, 0x062b, 0x062b, 0x0632, 0x063a, + 0x0641, 0x0645, 0x0658, 0x065f, 0x0668, 0x0670, 0x0676, 0x0676, + // Entry 100 - 13F + 0x067d, 0x067d, 0x069b, 0x06a4, 0x06aa, 0x06b0, 0x06b0, 0x06ba, + 0x06be, 0x06c4, 0x06c9, 0x06c9, 0x06ce, 0x06db, 0x06db, 0x06e0, + 0x06f3, 0x06f3, 0x06f8, 0x06f8, 0x06f8, 0x06fc, 0x06fc, 0x070d, + 0x0713, 0x0719, 0x072b, 0x072b, 0x0731, 0x0731, 0x0735, 0x073e, + 0x073e, 0x0741, 0x0741, 0x0755, 0x0765, 0x0765, 0x0765, 0x0765, + 0x076e, 0x0770, 0x0770, 0x0770, 0x0774, 0x0779, 0x0779, 0x077d, + 0x0787, 0x0787, 0x07a2, 0x07b9, 0x07b9, 0x07be, 0x07c7, 0x07cd, + 0x07d3, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07e6, 0x07ec, + // Entry 140 - 17F + 0x07ec, 0x07f5, 0x07f5, 0x07ff, 0x0806, 0x080c, 0x0819, 0x0819, + 0x081e, 0x0822, 0x0822, 0x0827, 0x082d, 0x082d, 0x082d, 0x0833, + 0x0833, 0x0833, 0x0840, 0x084d, 0x084d, 0x0858, 0x0860, 0x0866, + 0x0866, 0x086b, 0x086f, 0x0878, 0x0878, 0x0878, 0x0878, 0x0878, + 0x0878, 0x0878, 0x0878, 0x087c, 0x0884, 0x0884, 0x0884, 0x0884, + 0x0884, 0x0884, 0x088c, 0x088c, 0x0893, 0x089b, 0x08a1, 0x08b0, + 0x08b0, 0x08b0, 0x08b0, 0x08b6, 0x08b6, 0x08b6, 0x08b6, 0x08bc, + 0x08c3, 0x08c9, 0x08c9, 0x08ce, 0x08d3, 0x08db, 0x08db, 0x08db, + // Entry 180 - 1BF + 0x08db, 0x08db, 0x08db, 0x08e0, 0x08e5, 0x08e5, 0x08e5, 0x08f0, + 0x08fa, 0x08ff, 0x0903, 0x0908, 0x0908, 0x0908, 0x0908, 0x0910, + 0x0910, 0x0917, 0x091e, 0x0925, 0x092f, 0x0934, 0x0934, 0x093a, + 0x0940, 0x0945, 0x0945, 0x0945, 0x0959, 0x0959, 0x0959, 0x095f, + 0x096a, 0x0974, 0x097c, 0x0982, 0x0987, 0x0987, 0x0987, 0x0995, + 0x099a, 0x09a3, 0x09aa, 0x09aa, 0x09aa, 0x09af, 0x09af, 0x09af, + 0x09b9, 0x09b9, 0x09da, 0x09e0, 0x09e5, 0x09ee, 0x09ee, 0x09ee, + 0x09ee, 0x09f3, 0x0a03, 0x0a03, 0x0a03, 0x0a12, 0x0a12, 0x0a22, + // Entry 1C0 - 1FF + 0x0a2b, 0x0a33, 0x0a38, 0x0a3e, 0x0a46, 0x0a5b, 0x0a66, 0x0a6e, + 0x0a76, 0x0a80, 0x0a88, 0x0a88, 0x0a88, 0x0a88, 0x0a95, 0x0a95, + 0x0a9d, 0x0a9d, 0x0a9d, 0x0aa5, 0x0aa5, 0x0ab5, 0x0ab5, 0x0ab5, + 0x0abf, 0x0ac6, 0x0ad1, 0x0ad1, 0x0ad1, 0x0ad1, 0x0ad9, 0x0ad9, + 0x0ad9, 0x0ad9, 0x0ae3, 0x0ae3, 0x0aea, 0x0aef, 0x0af7, 0x0af7, + 0x0afc, 0x0b03, 0x0b03, 0x0b03, 0x0b03, 0x0b03, 0x0b0d, 0x0b0d, + 0x0b0d, 0x0b0d, 0x0b0d, 0x0b0d, 0x0b13, 0x0b13, 0x0b23, 0x0b23, + 0x0b23, 0x0b26, 0x0b26, 0x0b2c, 0x0b2c, 0x0b2c, 0x0b39, 0x0b42, + // Entry 200 - 23F + 0x0b4c, 0x0b56, 0x0b5d, 0x0b64, 0x0b64, 0x0b69, 0x0b69, 0x0b69, + 0x0b6f, 0x0b73, 0x0b7b, 0x0b7b, 0x0b7b, 0x0b7b, 0x0b81, 0x0b81, + 0x0b81, 0x0b86, 0x0b86, 0x0b8c, 0x0b91, 0x0b96, 0x0b99, 0x0ba0, + 0x0ba0, 0x0ba7, 0x0bae, 0x0bae, 0x0bb5, 0x0bc2, 0x0bcb, 0x0bcb, + 0x0bcb, 0x0bcb, 0x0bd2, 0x0bd2, 0x0bd9, 0x0bdf, 0x0bdf, 0x0be7, + 0x0be7, 0x0bed, 0x0bf6, 0x0bfd, 0x0c03, 0x0c06, 0x0c06, 0x0c06, + 0x0c06, 0x0c06, 0x0c0b, 0x0c0b, 0x0c0b, 0x0c0b, 0x0c11, 0x0c16, + 0x0c1a, 0x0c1a, 0x0c1a, 0x0c20, 0x0c20, 0x0c20, 0x0c23, 0x0c29, + // Entry 240 - 27F + 0x0c29, 0x0c29, 0x0c29, 0x0c29, 0x0c31, 0x0c31, 0x0c31, 0x0c38, + 0x0c38, 0x0c3d, 0x0c3d, 0x0c3d, 0x0c54, 0x0c54, 0x0c54, 0x0c54, + 0x0c66, 0x0c66, 0x0c78, 0x0c88, 0x0c88, 0x0c88, 0x0c88, 0x0c88, + 0x0c9a, 0x0cad, 0x0cad, 0x0cad, 0x0cad, 0x0cad, 0x0cb6, 0x0cc1, + 0x0cd4, + }, + }, + { // mua + "akaŋamharikarabiyabelarussiyabulgariabengaliasyekyagermaŋgrekzah Anglofo" + + "ŋEspaniyaPersiazah sǝr Franssǝhaussahindihungariyaindonesiyaigboita" + + "liyazah sǝr JapoŋjavaniyakmerkoreamalasiyabirmaniaNepaliyazah sǝr ma" + + " kasǝŋPǝnjabiPoloniyaZah sǝr PortugalRomaniyaRussiyaZah sǝr RwandaSo" + + "maliyaSwediaTamulthTurkUkrainiaUrduVietnamiyaYorubazah SyiŋZuluMUNDA" + + "Ŋ", + []uint16{ // 423 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, 0x000c, 0x000c, + 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x001e, 0x0026, + 0x0026, 0x0026, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, + 0x003b, 0x003b, 0x003b, 0x003b, 0x003f, 0x004c, 0x004c, 0x0054, + 0x0054, 0x0054, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x006b, + 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x0071, + 0x0071, 0x0076, 0x0076, 0x0076, 0x0076, 0x007f, 0x007f, 0x007f, + // Entry 40 - 7F + 0x007f, 0x0089, 0x0089, 0x008d, 0x008d, 0x008d, 0x008d, 0x008d, + 0x0094, 0x0094, 0x00a3, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, + 0x00ab, 0x00ab, 0x00af, 0x00af, 0x00b4, 0x00b4, 0x00b4, 0x00b4, + 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, + 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, + 0x00b4, 0x00b4, 0x00b4, 0x00bc, 0x00bc, 0x00c4, 0x00c4, 0x00c4, + 0x00cc, 0x00cc, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, + 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00e7, 0x00e7, 0x00ef, + // Entry 80 - BF + 0x00ef, 0x0100, 0x0100, 0x0100, 0x0100, 0x0108, 0x010f, 0x011e, + 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, + 0x011e, 0x011e, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, + 0x012c, 0x012c, 0x0131, 0x0131, 0x0131, 0x0133, 0x0133, 0x0133, + 0x0133, 0x0133, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x013f, + 0x0143, 0x0143, 0x0143, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, + 0x014d, 0x0153, 0x0153, 0x015c, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + // Entry C0 - FF + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + // Entry 100 - 13F + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + // Entry 140 - 17F + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + // Entry 180 - 1BF + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0160, 0x0167, + }, + }, + { // my + myLangStr, + myLangIdx, + }, + { // mzn + "آبخازیآفریکانسآکانامهریعربیآسامیآذری ِترکیباشقیریبلاروسیبلغاریبامباراییب" + + "نگالیتبتیبرِتونیبوسنیاییکاتالونیچچنیکورسیکانچکیچوواشیولزیدانمارکیآل" + + "مانیدزونگخااوه\u200cیییونانیانگلیسیاسپرانتوایسپانیولیاستونیاییباسکی" + + "فارسیفینیشفیجیاییفاروییفرانسویغربی فیریزیایریشگالیکگورانیگجراتیمانک" + + "سهوساعبریهندیکرواتیهائتیاییمجاریارمنیاندونزیاییایگبوسیچوئان ییایسلن" + + "دیایتالیاییانوکتیتوتجاپونیجاواییگرجیکیکویوقزاقیکالائلیسوتخمریکانّاد" + + "اکُره\u200cییکشمیریکوردیکورنیشقرقیزیلاتینلوکزامبورگیگاندالینگالالائ" + + "وییلتونیاییلوبا-کاتانگالاتویاییمالاگاسیمائوریمقدونیمالایالاممغولیما" + + "راتیمالاییمالتیبرمه\u200cییشمالی ندبلهنپالیهلندینروژی نینورسکنروژی " + + "بوکمالاورومواوریاپنجابیلهستونیپشتوپرتغالیقوئچوئارومانشروندیرومانیای" + + "یروسیکنیاروآنداییسانسکریتسندیشمالی سامیسانگوسینهالااسلواکیاسلوونیای" + + "یشوناسومالیاییآلبانیاییصربیسوندانسیسوئدیسواحیلیتامیلیتلوگوییتاجیکیت" + + "اییتیگرینیاییترکمونیتونگانیترکیتاتاریئوغوریاوکراینیاردوازبکیویتنامی" + + "وولفیخوسایوروباچینیزولوآقمماپوچهآسوبمباییبناییغربی بلوچیبدوییچیگاچر" + + "وکیاییمیونی کوردیتایتازارماییپایین صربیدوئالاییجولا-فونیامبوفیلیپین" + + "وگاگائوزیسوییس آلمانیگوسیهاواییاییبالایی صربینگومباماچامهقبایلیکامب" + + "اییماکوندهکیپ وُردیکویرا چیینیکالنجینکومی-پرمیاککونکانیشامبالابافیا" + + "ییلانگیلاکوتاشمالی لُریلوئولوییاماساییمِروییموریسینماخوئا-میتومِتاء" + + "موهاکموندانگمازرونیناماپایین آلمانیکوئاسیونئکونوئرنیانکولهکئیچه" + + "\u200cئیرومبوروآییسامبوروسانگووجنوبی کردیسِناییکویرابورا سنیتاچلهیتج" + + "نوبی سامیلوله سامیایناری سامیسکولت سامیکنگو سواحیلیتسوییتاساواقیمیو" + + "نی اطلس تامزیقینشناسی\u200cیه زوونواییوونجوییوالرپیریسوگامراکش ِاست" + + "اندارد ِتامازیقتیاین زوون بشناسی\u200cیه نیّهمدرن استاندارد عربیجنو" + + "بی آذری ترکیاتریش ِآلمانیسوییس ِآلمانیاسترالیای ِانگلیسیکانادای ِان" + + "گلیسیبریتیش انگلیسیامریکن انگلیسیجنوبی آمریکای ِایسپانیولیاروپای ِا" + + "یسپانیولیمکزیک ِایسپانیولیکانادای ِفرانسویسوییس ِفرانسویپایین ساکسو" + + "نیفلمیشبرزیل ِپرتغالیاروپای ِپرتغالیمولداویساده چینیسنتی چینی", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x000c, 0x000c, 0x001c, 0x0024, 0x002e, 0x002e, + 0x0036, 0x0040, 0x0040, 0x0040, 0x0053, 0x0061, 0x006f, 0x007b, + 0x007b, 0x008d, 0x0099, 0x00a1, 0x00af, 0x00bf, 0x00cf, 0x00d7, + 0x00d7, 0x00e7, 0x00e7, 0x00ed, 0x00ed, 0x00f9, 0x0101, 0x0111, + 0x011d, 0x011d, 0x012b, 0x0138, 0x0144, 0x0152, 0x0162, 0x0176, + 0x0188, 0x0192, 0x019c, 0x019c, 0x01a6, 0x01b4, 0x01c0, 0x01ce, + 0x01e3, 0x01ed, 0x01ed, 0x01f7, 0x0203, 0x020f, 0x0219, 0x0221, + 0x0229, 0x0231, 0x0231, 0x023d, 0x024d, 0x0257, 0x0261, 0x0261, + // Entry 40 - 7F + 0x0261, 0x0275, 0x0275, 0x027f, 0x0292, 0x0292, 0x0292, 0x02a0, + 0x02b2, 0x02c4, 0x02d0, 0x02dc, 0x02e4, 0x02e4, 0x02f0, 0x02f0, + 0x02fa, 0x030e, 0x0316, 0x0324, 0x0333, 0x0333, 0x033f, 0x0349, + 0x0349, 0x0355, 0x0361, 0x036b, 0x0381, 0x038b, 0x038b, 0x0399, + 0x03a5, 0x03b5, 0x03cc, 0x03dc, 0x03ec, 0x03ec, 0x03f8, 0x0404, + 0x0416, 0x0420, 0x042c, 0x0438, 0x0442, 0x0451, 0x0451, 0x0466, + 0x0470, 0x0470, 0x047a, 0x0493, 0x04aa, 0x04aa, 0x04aa, 0x04aa, + 0x04aa, 0x04aa, 0x04b6, 0x04c0, 0x04c0, 0x04cc, 0x04cc, 0x04da, + // Entry 80 - BF + 0x04e2, 0x04f0, 0x04fe, 0x050a, 0x0514, 0x0526, 0x052e, 0x0546, + 0x0556, 0x0556, 0x055e, 0x0571, 0x057b, 0x0589, 0x0597, 0x05ab, + 0x05ab, 0x05b3, 0x05c5, 0x05d7, 0x05df, 0x05df, 0x05df, 0x05ef, + 0x05f9, 0x0607, 0x0613, 0x0621, 0x062d, 0x0635, 0x0649, 0x0657, + 0x0657, 0x0665, 0x066d, 0x066d, 0x0679, 0x0679, 0x0685, 0x0695, + 0x069d, 0x06a7, 0x06a7, 0x06b5, 0x06b5, 0x06b5, 0x06bf, 0x06c7, + 0x06c7, 0x06d3, 0x06d3, 0x06db, 0x06e3, 0x06e3, 0x06e3, 0x06e3, + 0x06e3, 0x06e3, 0x06e3, 0x06e9, 0x06e9, 0x06e9, 0x06e9, 0x06e9, + // Entry C0 - FF + 0x06e9, 0x06e9, 0x06e9, 0x06e9, 0x06e9, 0x06f5, 0x06f5, 0x06f5, + 0x06f5, 0x06f5, 0x06f5, 0x06f5, 0x06fb, 0x06fb, 0x06fb, 0x06fb, + 0x06fb, 0x06fb, 0x06fb, 0x06fb, 0x06fb, 0x06fb, 0x06fb, 0x06fb, + 0x06fb, 0x0707, 0x0707, 0x0711, 0x0711, 0x0711, 0x0724, 0x0724, + 0x0724, 0x0724, 0x0724, 0x0724, 0x0724, 0x0724, 0x0724, 0x0724, + 0x0724, 0x072e, 0x072e, 0x072e, 0x072e, 0x072e, 0x072e, 0x072e, + 0x072e, 0x072e, 0x072e, 0x072e, 0x072e, 0x0736, 0x0736, 0x0736, + 0x0736, 0x0736, 0x0736, 0x0736, 0x0736, 0x0746, 0x0746, 0x075b, + // Entry 100 - 13F + 0x075b, 0x075b, 0x075b, 0x075b, 0x075b, 0x075b, 0x0765, 0x0765, + 0x0765, 0x0765, 0x0765, 0x0773, 0x0773, 0x0786, 0x0786, 0x0796, + 0x0796, 0x07a7, 0x07a7, 0x07a7, 0x07af, 0x07af, 0x07af, 0x07af, + 0x07af, 0x07af, 0x07af, 0x07af, 0x07af, 0x07af, 0x07af, 0x07bf, + 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, 0x07bf, + 0x07bf, 0x07bf, 0x07cf, 0x07cf, 0x07cf, 0x07cf, 0x07cf, 0x07cf, + 0x07cf, 0x07cf, 0x07cf, 0x07cf, 0x07cf, 0x07cf, 0x07cf, 0x07cf, + 0x07cf, 0x07cf, 0x07e6, 0x07e6, 0x07e6, 0x07ee, 0x07ee, 0x07ee, + // Entry 140 - 17F + 0x07ee, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0815, 0x0815, + 0x0815, 0x0815, 0x0815, 0x0815, 0x0815, 0x0815, 0x0815, 0x0815, + 0x0821, 0x082d, 0x082d, 0x082d, 0x082d, 0x082d, 0x0839, 0x0839, + 0x0839, 0x0847, 0x0847, 0x0847, 0x0847, 0x0847, 0x0855, 0x0866, + 0x0866, 0x0866, 0x0866, 0x0866, 0x0866, 0x087b, 0x087b, 0x087b, + 0x087b, 0x0889, 0x0889, 0x089e, 0x08ac, 0x08ac, 0x08ac, 0x08ac, + 0x08ac, 0x08ac, 0x08ac, 0x08ac, 0x08ba, 0x08c8, 0x08c8, 0x08c8, + 0x08c8, 0x08c8, 0x08d2, 0x08d2, 0x08d2, 0x08d2, 0x08d2, 0x08d2, + // Entry 180 - 1BF + 0x08d2, 0x08de, 0x08de, 0x08de, 0x08de, 0x08f1, 0x08f1, 0x08f1, + 0x08f1, 0x08f1, 0x08f9, 0x08f9, 0x0903, 0x0903, 0x0903, 0x0903, + 0x0903, 0x0903, 0x0903, 0x0903, 0x0903, 0x090f, 0x090f, 0x090f, + 0x090f, 0x090f, 0x091b, 0x0929, 0x0929, 0x093e, 0x0948, 0x0948, + 0x0948, 0x0948, 0x0948, 0x0952, 0x0952, 0x0952, 0x0960, 0x0960, + 0x0960, 0x0960, 0x0960, 0x0960, 0x0960, 0x0960, 0x096e, 0x096e, + 0x096e, 0x0976, 0x098d, 0x098d, 0x098d, 0x098d, 0x098d, 0x099b, + 0x099b, 0x099b, 0x099b, 0x099b, 0x09a3, 0x09a3, 0x09ab, 0x09ab, + // Entry 1C0 - 1FF + 0x09ab, 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09bb, + 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09bb, + 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09bb, 0x09cc, 0x09cc, + 0x09cc, 0x09cc, 0x09cc, 0x09cc, 0x09cc, 0x09d6, 0x09d6, 0x09d6, + 0x09d6, 0x09d6, 0x09d6, 0x09e0, 0x09e0, 0x09e0, 0x09e0, 0x09ee, + 0x09ee, 0x09ee, 0x09ee, 0x09ee, 0x09fa, 0x09fa, 0x09fa, 0x09fa, + 0x0a0d, 0x0a0d, 0x0a19, 0x0a19, 0x0a19, 0x0a32, 0x0a32, 0x0a32, + 0x0a40, 0x0a40, 0x0a40, 0x0a40, 0x0a40, 0x0a40, 0x0a53, 0x0a64, + // Entry 200 - 23F + 0x0a79, 0x0a8c, 0x0a8c, 0x0a8c, 0x0a8c, 0x0a8c, 0x0a8c, 0x0a8c, + 0x0a8c, 0x0a8c, 0x0a8c, 0x0a8c, 0x0aa3, 0x0aa3, 0x0aa3, 0x0aa3, + 0x0aa3, 0x0aa3, 0x0aad, 0x0aad, 0x0aad, 0x0aad, 0x0aad, 0x0aad, + 0x0aad, 0x0aad, 0x0aad, 0x0aad, 0x0aad, 0x0aad, 0x0aad, 0x0aad, + 0x0aad, 0x0aad, 0x0aad, 0x0aad, 0x0aad, 0x0aad, 0x0abd, 0x0abd, + 0x0adf, 0x0adf, 0x0adf, 0x0adf, 0x0afb, 0x0b03, 0x0b03, 0x0b03, + 0x0b03, 0x0b03, 0x0b03, 0x0b03, 0x0b11, 0x0b11, 0x0b11, 0x0b11, + 0x0b11, 0x0b21, 0x0b21, 0x0b21, 0x0b21, 0x0b29, 0x0b29, 0x0b29, + // Entry 240 - 27F + 0x0b29, 0x0b29, 0x0b29, 0x0b29, 0x0b29, 0x0b29, 0x0b29, 0x0b29, + 0x0b5d, 0x0b5d, 0x0b89, 0x0b89, 0x0bad, 0x0bc9, 0x0be2, 0x0bfb, + 0x0c1e, 0x0c3d, 0x0c58, 0x0c73, 0x0ca3, 0x0cc6, 0x0ce7, 0x0ce7, + 0x0d06, 0x0d21, 0x0d3a, 0x0d44, 0x0d5f, 0x0d7c, 0x0d8a, 0x0d8a, + 0x0d9b, 0x0dac, + }, + }, + { // naq + "AkangowabAmharicgowabArabiǁî gowabBelarusanǁî gowabBulgariaǁî gowabBenga" + + "liǁî gowabCzechǁî gowabDuitsXriksEngelsSpaansPersiaǁî gowabFransHaus" + + "agowabHindigowabHungariaǁî gowabIndonesiaǁî gowabIgbogowabItaliansJa" + + "paneesJavaneseKhmerǁî gowab, CentralKoreaǁî gowabMalayǁî gowabBurmes" + + "ǁî gowabNepalǁî gowabHollandsPunjabigowabPoleǁî gowabPortugeesRoman" + + "iaǁî gowabRussiaǁî gowabRwandaǁî gowabSomaliǁî gowabSwedeǁî gowabTam" + + "ilǁî gowabThaiǁî gowabTurkeǁî gowabUkrainiaǁî gowabUrduǁî gowabVietn" + + "amǁî gowabYorubabChineesǁî gowab, MandarinniZulubKhoekhoegowab", + []uint16{ // 434 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0015, 0x0015, + 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0037, 0x0049, + 0x0049, 0x0049, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, + 0x005a, 0x005a, 0x005a, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, + 0x006e, 0x006e, 0x006e, 0x006e, 0x0073, 0x0079, 0x0079, 0x007f, + 0x007f, 0x007f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x0094, + 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x0094, 0x009e, + 0x009e, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00ba, 0x00ba, 0x00ba, + // Entry 40 - 7F + 0x00ba, 0x00cd, 0x00cd, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, + 0x00de, 0x00de, 0x00e6, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, + 0x00ee, 0x00ee, 0x0106, 0x0106, 0x0115, 0x0115, 0x0115, 0x0115, + 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, + 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, + 0x0115, 0x0115, 0x0115, 0x0124, 0x0124, 0x0134, 0x0134, 0x0134, + 0x0143, 0x0143, 0x014b, 0x014b, 0x014b, 0x014b, 0x014b, 0x014b, + 0x014b, 0x014b, 0x014b, 0x014b, 0x014b, 0x0157, 0x0157, 0x0165, + // Entry 80 - BF + 0x0165, 0x016e, 0x016e, 0x016e, 0x016e, 0x017f, 0x018f, 0x019f, + 0x019f, 0x019f, 0x019f, 0x019f, 0x019f, 0x019f, 0x019f, 0x019f, + 0x019f, 0x019f, 0x01af, 0x01af, 0x01af, 0x01af, 0x01af, 0x01af, + 0x01be, 0x01be, 0x01cd, 0x01cd, 0x01cd, 0x01db, 0x01db, 0x01db, + 0x01db, 0x01db, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01fc, + 0x020a, 0x020a, 0x020a, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, + 0x021b, 0x0222, 0x0222, 0x023f, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + // Entry C0 - FF + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + // Entry 100 - 13F + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + // Entry 140 - 17F + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + // Entry 180 - 1BF + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, 0x0244, + 0x0244, 0x0251, + }, + }, + { // nd + "isi-Akhaniisi-Amaharikhiisi-Alabhuisi-Bhelarashiyaniisi-Bulgariaisi-Bhen" + + "galiisi-Czechisi-Jalimaniisi-Gilikiisi-Ngisiisi-Sipeyiniisi-Pheshiya" + + "niisi-Fulentshiisi-Hausaisi-Hindiisi-Hangariisi-Indonesiaisi-Igboisi" + + "-Italianoisi-Japhaniisi-Javaisi-Khambodiyaisi-Koriyaisi-Malayiisi-Bu" + + "rmaisiNdebeleisi-Nepaliisi-Dutchisi-Phunjabiisi-Pholoshiisi-Potukezi" + + "isi-Romaniisi-Rashiyaisi-Ruwandaisi-Somaliisi-Swidishiisi-Thamilisi-" + + "Thayiisi-Thekishiisi-Ukrainisi-Uduisi-Vietnameseisi-Yorubhaisi-China" + + "isi-Zulu", + []uint16{ // 181 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0018, 0x0018, + 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0034, 0x0040, + 0x0040, 0x0040, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, + 0x004c, 0x004c, 0x004c, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, + 0x0061, 0x0061, 0x0061, 0x0061, 0x006b, 0x0074, 0x0074, 0x0080, + 0x0080, 0x0080, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x009b, + 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x009b, 0x00a4, + 0x00a4, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00b8, 0x00b8, 0x00b8, + // Entry 40 - 7F + 0x00b8, 0x00c5, 0x00c5, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, + 0x00d9, 0x00d9, 0x00e4, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, + 0x00ec, 0x00ec, 0x00fa, 0x00fa, 0x0104, 0x0104, 0x0104, 0x0104, + 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, + 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, + 0x0104, 0x0104, 0x0104, 0x010e, 0x010e, 0x0117, 0x0117, 0x0121, + 0x012b, 0x012b, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0140, 0x0140, 0x014c, + // Entry 80 - BF + 0x014c, 0x0158, 0x0158, 0x0158, 0x0158, 0x0162, 0x016d, 0x0178, + 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, + 0x0178, 0x0178, 0x0182, 0x0182, 0x0182, 0x0182, 0x0182, 0x0182, + 0x018e, 0x018e, 0x0198, 0x0198, 0x0198, 0x01a1, 0x01a1, 0x01a1, + 0x01a1, 0x01a1, 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01b7, + 0x01be, 0x01be, 0x01be, 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, + 0x01cc, 0x01d7, 0x01d7, 0x01e0, 0x01e8, + }, + }, + { // ne + neLangStr, + neLangIdx, + }, + { // nl + nlLangStr, + nlLangIdx, + }, + { // nmg + "Kiɛl akanKiɛl amariaKiɛl b’árabeKiɛl belarussieKiɛl bulgariaKiɛl bengali" + + "aKiɛl bó tchɛkJámanKiɛl bó grɛkNgɛ̄lɛ̄nPaŋáKiɛl pɛrsiaFalaKiɛl máwús" + + "áKiɛl b’indienKiɛl b’ɔ́ngroisKiɛl indonesieKiɛl ikboKiɛl italiaKiɛl" + + " bó japonɛ̌Kiɛl bó javanɛ̌Kiɛl bó mɛrKiɛl koréKiɛl Malɛ̌siāKiɛl birm" + + "aniaKiɛl nepalKiɛl bóllandaisKiɛl pɛndjabiKiɛl pɔlɔŋeKiɛl bó pɔ̄rtug" + + "ɛ̂Kiɛl bó rumɛ̂nKiɛl russiaKiɛl rwandāKiɛl somaliāKiɛl bó suedoisKi" + + "ɛl tamulKiɛl thaïKiɛl bó turkKiɛl b’ukrɛ̄nienKiɛl úrduKiɛl viɛtnamY" + + "orúbâKiɛl bó chinoisZulu", + []uint16{ // 181 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0016, 0x0016, + 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0036, 0x0044, + 0x0044, 0x0044, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, + 0x0052, 0x0052, 0x0052, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, + 0x0068, 0x0068, 0x0068, 0x0068, 0x0077, 0x0083, 0x0083, 0x0089, + 0x0089, 0x0089, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, 0x009a, + 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x00a9, + 0x00a9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00cd, 0x00cd, 0x00cd, + // Entry 40 - 7F + 0x00cd, 0x00dc, 0x00dc, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, + 0x00f2, 0x00f2, 0x0105, 0x0118, 0x0118, 0x0118, 0x0118, 0x0118, + 0x0118, 0x0118, 0x0126, 0x0126, 0x0131, 0x0131, 0x0131, 0x0131, + 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, + 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, + 0x0131, 0x0131, 0x0131, 0x0142, 0x0142, 0x0150, 0x0150, 0x0150, + 0x015b, 0x015b, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x017b, 0x017b, 0x018a, + // Entry 80 - BF + 0x018a, 0x01a1, 0x01a1, 0x01a1, 0x01a1, 0x01b3, 0x01bf, 0x01cc, + 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, + 0x01cc, 0x01cc, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01eb, 0x01eb, 0x01f6, 0x01f6, 0x01f6, 0x0201, 0x0201, 0x0201, + 0x0201, 0x0201, 0x020f, 0x020f, 0x020f, 0x020f, 0x020f, 0x0224, + 0x022f, 0x022f, 0x022f, 0x023d, 0x023d, 0x023d, 0x023d, 0x023d, + 0x023d, 0x0245, 0x0245, 0x0256, 0x025a, + }, + }, + { // nn + "afarabkhasiskavestiskafrikaansakanamhariskaragonskarabiskassamiskavarisk" + + "aymaraaserbajdsjanskbasjkirskkviterussiskbulgarskbislamabambarabenga" + + "litibetanskbretonskbosniskkatalansktsjetsjenskchamorrokorsikanskcree" + + "tsjekkiskkyrkjeslavisktsjuvanskwalisiskdansktyskdivehidzongkhaewegre" + + "skengelskesperantospanskestiskbaskiskpersiskfulanifinskfijianskfærøy" + + "skfranskvestfrisiskirskskotsk-gæliskgaliciskguaranigujaratimanxhausa" + + "hebraiskhindihiri motukroatiskhaitiskungarskarmenskhererointerlingua" + + "indonesiskinterlingueibosichuan-yiinupiakidoislandskitalienskinuktit" + + "utjapanskjavanesiskgeorgiskkikongokikuyukuanyamakasakhiskkalaallisut" + + "; grønlandskkhmerkannadakoreanskkanurikasjmirikurdiskkomikorniskkirg" + + "isisklatinluxemburgskgandalimburgisklingalalaotisklitauiskluba-katan" + + "galatviskmadagassiskmarshallesiskmaorimakedonskmalayalammongolskmara" + + "thimalayiskmaltesiskburmesisknaurunord-ndebelenepalskndonganederland" + + "sknynorskbokmålsør-ndebelenavajonyanjaoksitanskojibwaoromooriyaosset" + + "iskpanjabipalipolskpashtoportugisiskquechuaretoromanskrundirumenskru" + + "ssiskkinjarwandasanskritsardinsksindhinordsamisksangosingalesiskslov" + + "akiskslovensksamoanskshonasomalialbanskserbiskswatisørsothosundanesi" + + "sksvenskswahilitamiltelugutatsjikiskthaitigrinjaturkmensktswanatonga" + + " (Tonga-øyane)tyrkisktsongatatarisktahitiskuiguriskukrainskurduusbek" + + "iskvendavietnamesiskvolapykvallonskwolofxhosajiddiskjorubazhuangkine" + + "siskzuluachinesiskacoliadangmeadygheafrihiliaghemainuakkadiskaleutis" + + "ksør-altaigammalengelskangikaarameiskaraukanskarapahoarawakasu (Tanz" + + "ania)asturiskawadhibaluchibalinesiskbasabejabembabena (Tanzania)bhoj" + + "puribikolbinisiksikabrajbodoburjatiskbuginesiskblincaddokaribiskatsa" + + "mcebuanskchibchachagataichuukesiskmarichinookchoctawchipewianskchero" + + "keecheyennekoptiskkrimtatariskkasjubiskdakotadargwadelawareslavejdog" + + "ribdinkazarmadogrilågsorbiskdualamellumnederlandskjola-fonyidyulakie" + + "mbuefikgammalegyptiskekajukelamittiskmellomengelskewondofangfilippin" + + "skfonmellomfranskgammalfransknordfrisiskaustfrisiskfriulianskgagayog" + + "bayageskiribatiskmellomhøgtyskgammalhøgtyskgondigorontalogotiskgrebo" + + "gammalgresksveitsertyskgwichinhaidahawaiiskhiligaynonhettittiskhmong" + + "høgsorbiskhupaibanilokoingusjisklojbanjødepersiskjødearabiskkarakalp" + + "akiskkabylskkachinjjukambakawikabardisktyapkapverdiskkorokhasikhotan" + + "esiskkimbundukonkanikosraeanskkpellekarachay-balkarkarelskkurukhbafi" + + "akumykkutenailadinsklahndalambalezghianmongoloziluba-lulualuisenolun" + + "daluolushaimaduresiskmagahimaithilimakasarmandingomasaimokshamandarm" + + "endemellomirskmicmacminangkabaumandsjumanipurimohawkmossimundangflei" + + "re språkcreekmirandesiskmarwarierzyanapolitansklågtysknewariniasniue" + + "anskkwasionogaigammalnorskn’konordsothonuerklassisk newarisknyamwezi" + + "nyankolenyoronzimaosageottomansk tyrkiskpangasinanpahlavipampangapap" + + "iamentopalauiskgammalpersiskfønikiskponapiskgammalprovençalskrajasth" + + "anirapanuirarotonganskromboromaniaromanskrwasandawejakutsksamaritans" + + "k arameisksasaksantalisangusicilianskskotskselkupiskgammalirskshansi" + + "damosørsamisklulesamiskenaresamiskskoltesamisksoninkesogdisksranan t" + + "ongoserersukumasususumeriskshimaoreklassisk syrisksyrisktemneterenot" + + "etumtigrétivitokelauklingontlingittamasjektonga (Nyasa)tok pisintsim" + + "shiantumbukatuvalutasawaqtuviniskudmurtugaritiskumbundurotvaivotiskw" + + "alamowaraywashokalmykyaoyapesiskyangbenkantonesiskzapotecblissymbolz" + + "enagazuniutan språkleg innhaldzazaausterriksk tysksveitsisk høgtyska" + + "ustralisk engelskkanadisk engelskbritisk engelskengelsk (amerikansk)" + + "latinamerikansk spanskiberisk spanskkanadisk fransksveitsisk franskf" + + "lamskbrasiliansk portugisiskeuropeisk portugisiskmoldaviskserbokroat" + + "iskforenkla kinesisktradisjonell kinesisk", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000d, 0x0015, 0x001e, 0x0022, 0x002a, 0x0032, + 0x0039, 0x0041, 0x0048, 0x004e, 0x005c, 0x0065, 0x0071, 0x0079, + 0x0080, 0x0087, 0x008e, 0x0097, 0x009f, 0x00a6, 0x00af, 0x00ba, + 0x00c2, 0x00cc, 0x00d0, 0x00d9, 0x00e6, 0x00ef, 0x00f7, 0x00fc, + 0x0100, 0x0106, 0x010e, 0x0111, 0x0116, 0x011d, 0x0126, 0x012c, + 0x0132, 0x0139, 0x0140, 0x0146, 0x014b, 0x0153, 0x015c, 0x0162, + 0x016d, 0x0171, 0x017f, 0x0187, 0x018e, 0x0196, 0x019a, 0x019f, + 0x01a7, 0x01ac, 0x01b5, 0x01bd, 0x01c4, 0x01cb, 0x01d2, 0x01d8, + // Entry 40 - 7F + 0x01e3, 0x01ed, 0x01f8, 0x01fb, 0x0205, 0x020c, 0x020f, 0x0217, + 0x0220, 0x0229, 0x0230, 0x023a, 0x0242, 0x0249, 0x024f, 0x0257, + 0x0260, 0x0278, 0x027d, 0x0284, 0x028c, 0x0292, 0x029a, 0x02a1, + 0x02a5, 0x02ac, 0x02b5, 0x02ba, 0x02c5, 0x02ca, 0x02d4, 0x02db, + 0x02e2, 0x02ea, 0x02f6, 0x02fd, 0x0308, 0x0315, 0x031a, 0x0323, + 0x032c, 0x0334, 0x033b, 0x0343, 0x034c, 0x0355, 0x035a, 0x0366, + 0x036d, 0x0373, 0x037e, 0x0385, 0x038c, 0x0398, 0x039e, 0x03a4, + 0x03ad, 0x03b3, 0x03b8, 0x03bd, 0x03c5, 0x03cc, 0x03d0, 0x03d5, + // Entry 80 - BF + 0x03db, 0x03e6, 0x03ed, 0x03f8, 0x03fd, 0x0404, 0x040b, 0x0416, + 0x041e, 0x0426, 0x042c, 0x0436, 0x043b, 0x0446, 0x044f, 0x0457, + 0x045f, 0x0464, 0x046a, 0x0471, 0x0478, 0x047d, 0x0486, 0x0491, + 0x0497, 0x049e, 0x04a3, 0x04a9, 0x04b3, 0x04b7, 0x04bf, 0x04c8, + 0x04ce, 0x04e2, 0x04e9, 0x04ef, 0x04f7, 0x04ff, 0x0507, 0x050f, + 0x0513, 0x051b, 0x0520, 0x052c, 0x0533, 0x053b, 0x0540, 0x0545, + 0x054c, 0x0552, 0x0558, 0x0560, 0x0564, 0x056e, 0x0573, 0x057a, + 0x0580, 0x0580, 0x0588, 0x058d, 0x0591, 0x0599, 0x0599, 0x05a1, + // Entry C0 - FF + 0x05a1, 0x05ab, 0x05b8, 0x05be, 0x05c6, 0x05cf, 0x05cf, 0x05d6, + 0x05d6, 0x05dc, 0x05dc, 0x05dc, 0x05ea, 0x05ea, 0x05f2, 0x05f2, + 0x05f8, 0x05ff, 0x0609, 0x0609, 0x060d, 0x060d, 0x060d, 0x060d, + 0x0611, 0x0616, 0x0616, 0x0625, 0x0625, 0x0625, 0x0625, 0x062d, + 0x0632, 0x0636, 0x0636, 0x0636, 0x063d, 0x063d, 0x063d, 0x0641, + 0x0641, 0x0645, 0x0645, 0x064e, 0x0658, 0x0658, 0x065c, 0x065c, + 0x0661, 0x0669, 0x0669, 0x066e, 0x0676, 0x0676, 0x067d, 0x0685, + 0x068f, 0x0693, 0x069a, 0x06a1, 0x06ac, 0x06b4, 0x06bc, 0x06bc, + // Entry 100 - 13F + 0x06c3, 0x06c3, 0x06cf, 0x06d8, 0x06de, 0x06e4, 0x06e4, 0x06ec, + 0x06f2, 0x06f8, 0x06fd, 0x0702, 0x0707, 0x0712, 0x0712, 0x0717, + 0x0728, 0x0732, 0x0737, 0x0737, 0x073d, 0x0741, 0x0741, 0x074f, + 0x0755, 0x075f, 0x076c, 0x076c, 0x0772, 0x0772, 0x0776, 0x0780, + 0x0780, 0x0783, 0x0783, 0x078f, 0x079b, 0x079b, 0x07a6, 0x07b1, + 0x07bb, 0x07bd, 0x07bd, 0x07bd, 0x07c1, 0x07c6, 0x07c6, 0x07c9, + 0x07d3, 0x07d3, 0x07e1, 0x07ef, 0x07ef, 0x07f4, 0x07fd, 0x0803, + 0x0808, 0x0813, 0x081f, 0x081f, 0x081f, 0x081f, 0x0826, 0x082b, + // Entry 140 - 17F + 0x082b, 0x0833, 0x0833, 0x083d, 0x0847, 0x084c, 0x0857, 0x0857, + 0x085b, 0x085f, 0x085f, 0x0864, 0x086d, 0x086d, 0x086d, 0x0873, + 0x0873, 0x0873, 0x087f, 0x088b, 0x088b, 0x0898, 0x089f, 0x08a5, + 0x08a8, 0x08ad, 0x08b1, 0x08ba, 0x08ba, 0x08be, 0x08be, 0x08c8, + 0x08c8, 0x08cc, 0x08cc, 0x08d1, 0x08dc, 0x08dc, 0x08dc, 0x08dc, + 0x08dc, 0x08dc, 0x08e4, 0x08e4, 0x08eb, 0x08f5, 0x08fb, 0x090a, + 0x090a, 0x090a, 0x0911, 0x0917, 0x0917, 0x091c, 0x091c, 0x0921, + 0x0928, 0x092f, 0x092f, 0x0935, 0x093a, 0x0942, 0x0942, 0x0942, + // Entry 180 - 1BF + 0x0942, 0x0942, 0x0942, 0x0947, 0x094b, 0x094b, 0x094b, 0x0955, + 0x095c, 0x0961, 0x0964, 0x096a, 0x096a, 0x096a, 0x096a, 0x0974, + 0x0974, 0x097a, 0x0982, 0x0989, 0x0991, 0x0996, 0x0996, 0x099c, + 0x09a2, 0x09a7, 0x09a7, 0x09a7, 0x09b1, 0x09b1, 0x09b1, 0x09b7, + 0x09c2, 0x09c9, 0x09d1, 0x09d7, 0x09dc, 0x09dc, 0x09e3, 0x09f0, + 0x09f5, 0x0a00, 0x0a07, 0x0a07, 0x0a07, 0x0a0c, 0x0a0c, 0x0a0c, + 0x0a17, 0x0a17, 0x0a1f, 0x0a25, 0x0a29, 0x0a31, 0x0a31, 0x0a37, + 0x0a37, 0x0a3c, 0x0a47, 0x0a47, 0x0a4d, 0x0a56, 0x0a5a, 0x0a6b, + // Entry 1C0 - 1FF + 0x0a73, 0x0a7b, 0x0a80, 0x0a85, 0x0a8a, 0x0a9b, 0x0aa5, 0x0aac, + 0x0ab4, 0x0abe, 0x0ac6, 0x0ac6, 0x0ac6, 0x0ac6, 0x0ad3, 0x0ad3, + 0x0adc, 0x0adc, 0x0adc, 0x0ae4, 0x0ae4, 0x0af6, 0x0af6, 0x0af6, + 0x0b00, 0x0b07, 0x0b13, 0x0b13, 0x0b13, 0x0b18, 0x0b1e, 0x0b1e, + 0x0b1e, 0x0b1e, 0x0b26, 0x0b29, 0x0b30, 0x0b37, 0x0b4b, 0x0b4b, + 0x0b50, 0x0b57, 0x0b57, 0x0b57, 0x0b5c, 0x0b66, 0x0b6c, 0x0b6c, + 0x0b6c, 0x0b6c, 0x0b6c, 0x0b6c, 0x0b75, 0x0b75, 0x0b7f, 0x0b7f, + 0x0b7f, 0x0b83, 0x0b83, 0x0b89, 0x0b89, 0x0b89, 0x0b93, 0x0b9d, + // Entry 200 - 23F + 0x0ba8, 0x0bb4, 0x0bbb, 0x0bc2, 0x0bce, 0x0bd3, 0x0bd3, 0x0bd3, + 0x0bd9, 0x0bdd, 0x0be5, 0x0bed, 0x0bed, 0x0bfc, 0x0c02, 0x0c02, + 0x0c02, 0x0c07, 0x0c07, 0x0c0d, 0x0c12, 0x0c18, 0x0c1c, 0x0c23, + 0x0c23, 0x0c2a, 0x0c31, 0x0c31, 0x0c39, 0x0c46, 0x0c4f, 0x0c4f, + 0x0c4f, 0x0c4f, 0x0c58, 0x0c58, 0x0c5f, 0x0c65, 0x0c6c, 0x0c74, + 0x0c74, 0x0c7a, 0x0c83, 0x0c8a, 0x0c8d, 0x0c90, 0x0c90, 0x0c90, + 0x0c90, 0x0c90, 0x0c96, 0x0c96, 0x0c96, 0x0c96, 0x0c9c, 0x0ca1, + 0x0ca6, 0x0ca6, 0x0ca6, 0x0cac, 0x0cac, 0x0cac, 0x0caf, 0x0cb7, + // Entry 240 - 27F + 0x0cbe, 0x0cbe, 0x0cbe, 0x0cc9, 0x0cd0, 0x0cda, 0x0cda, 0x0ce0, + 0x0ce0, 0x0ce4, 0x0cfa, 0x0cfe, 0x0cfe, 0x0cfe, 0x0d0e, 0x0d20, + 0x0d32, 0x0d42, 0x0d51, 0x0d65, 0x0d7b, 0x0d89, 0x0d89, 0x0d89, + 0x0d98, 0x0da8, 0x0da8, 0x0dae, 0x0dc5, 0x0dda, 0x0de3, 0x0df0, + 0x0e01, 0x0e16, + }, + }, + { // nnh + "nzǎmɔ̂ɔnngilísèShwóŋò menkesaŋfelaŋséeShwóŋò pʉa mbasǎShwóŋò pamomShwóŋò" + + " pʉa nzsekàʼaShwóŋò pafudShwóŋò pʉ̀a njinikomShwóŋò pakɔsiShwóŋò mbu" + + "luShwóŋò ngáŋtÿɔʼShwóŋò pʉa YɔɔnmendiShwóŋò pʉa shÿó BɛgtùaShwóŋò ng" + + "iembɔɔnShwóŋò pʉa shÿó MbafìaShwóŋò Tsaŋ", + []uint16{ // 578 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0028, 0x0028, 0x0028, 0x0028, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + // Entry 40 - 7F + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + // Entry 80 - BF + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + // Entry C0 - FF + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0032, 0x0047, 0x0056, 0x0056, 0x006f, + 0x006f, 0x006f, 0x006f, 0x006f, 0x007e, 0x007e, 0x007e, 0x007e, + 0x007e, 0x007e, 0x007e, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, + 0x0097, 0x0097, 0x00a8, 0x00a8, 0x00a8, 0x00b7, 0x00b7, 0x00ce, + 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, + 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, + // Entry 100 - 13F + 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, + 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, + 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, + 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00e8, 0x00e8, 0x00e8, 0x00e8, + 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, + 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, + 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, + 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, + // Entry 140 - 17F + 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, + 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, + 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, + 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, + 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, + 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, + 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, + 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, + // Entry 180 - 1BF + 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, + 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, + 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, + 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, + 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, + 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, + 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, + 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + // Entry 1C0 - 1FF + 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + // Entry 200 - 23F + 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + // Entry 240 - 27F + 0x0138, 0x0147, + }, + }, + { // no + noLangStr, + noLangIdx, + }, + { // nus + "Thok aka̱niThok bunyniThok JalabniThok bäläruthaThok bälga̱a̱rianiThok b" + + "ängaliThok cikThok jarmaniThok girikniThok liŋli̱thniThok i̱thpaani" + + "aniThok perthianiThok pɔrɔthaniThok ɣowthaniThok ɣändiniThok ɣänga̱a" + + "̱riɛniThok indunithianiThok i̱gboniThok i̱talianiThok japanniThok j" + + "abanithniThok kameeriThok kurianiThok mayɛyniThok bormi̱thniThok nap" + + "alniThok da̱cThok puɔnjabaniThok pölicniThok puɔtigaliThok ji̱ römTh" + + "ok ra̱ciaaniThok ruaandaniThok thomaalianiThok i̱thwidicniThok tamil" + + "niThok tayniThok turkicniThok ukeraaniniThok udoniThok betnaamniThok" + + " yurubaniThok caynaThok dhuluniThok Nath", + []uint16{ // 447 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x0017, 0x0017, + 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0033, 0x0048, + 0x0048, 0x0048, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, + 0x0055, 0x0055, 0x0055, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, + 0x0069, 0x0069, 0x0069, 0x0069, 0x0075, 0x0086, 0x0086, 0x0098, + 0x0098, 0x0098, 0x00a6, 0x00a6, 0x00a6, 0x00a6, 0x00a6, 0x00b6, + 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00c4, + 0x00c4, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00e9, 0x00e9, 0x00e9, + // Entry 40 - 7F + 0x00e9, 0x00fa, 0x00fa, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, + 0x0116, 0x0116, 0x0122, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, + 0x0131, 0x0131, 0x013d, 0x013d, 0x0149, 0x0149, 0x0149, 0x0149, + 0x0149, 0x0149, 0x0149, 0x0149, 0x0149, 0x0149, 0x0149, 0x0149, + 0x0149, 0x0149, 0x0149, 0x0149, 0x0149, 0x0149, 0x0149, 0x0149, + 0x0149, 0x0149, 0x0149, 0x0156, 0x0156, 0x0166, 0x0166, 0x0166, + 0x0172, 0x0172, 0x017c, 0x017c, 0x017c, 0x017c, 0x017c, 0x017c, + 0x017c, 0x017c, 0x017c, 0x017c, 0x017c, 0x018c, 0x018c, 0x0199, + // Entry 80 - BF + 0x0199, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01b6, 0x01c5, 0x01d3, + 0x01d3, 0x01d3, 0x01d3, 0x01d3, 0x01d3, 0x01d3, 0x01d3, 0x01d3, + 0x01d3, 0x01d3, 0x01e3, 0x01e3, 0x01e3, 0x01e3, 0x01e3, 0x01e3, + 0x01f4, 0x01f4, 0x0200, 0x0200, 0x0200, 0x020a, 0x020a, 0x020a, + 0x020a, 0x020a, 0x0217, 0x0217, 0x0217, 0x0217, 0x0217, 0x0226, + 0x0230, 0x0230, 0x0230, 0x023e, 0x023e, 0x023e, 0x023e, 0x023e, + 0x023e, 0x024b, 0x024b, 0x0255, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + // Entry C0 - FF + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + // Entry 100 - 13F + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + // Entry 140 - 17F + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + // Entry 180 - 1BF + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, + 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x0261, 0x026a, + }, + }, + { // nyn + "OrukaniOrumarikiOruharabuOruberarusiOruburugariyaOrubengariOruceekiOrugi" + + "rimaaniOruguriikiOrungyerezaOrusupaaniOrupaasiyaOrufaransaOruhausaOr" + + "uhindiOruhangareOruindoneziaOruiboOruyitareOrujapaaniOrujavaOrukambo" + + "diyaOrukoreyaOrumalesiyaOruburumaOrunepaliOrudaakiOrupungyabiOrupoor" + + "iOrupocugoOruromaniaOrurrashaOrunyarwandaOrusomaariOruswidiOrutamiri" + + "OrutailandiOrukurukiOrukurainiOru-UruduOruviyetinaamuOruyorubaOrucha" + + "inaOruzuruRunyankore", + []uint16{ // 450 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0010, 0x0010, + 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0024, 0x0031, + 0x0031, 0x0031, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, + 0x003b, 0x003b, 0x003b, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, + 0x004f, 0x004f, 0x004f, 0x004f, 0x0059, 0x0064, 0x0064, 0x006e, + 0x006e, 0x006e, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0082, + 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x008a, + 0x008a, 0x0092, 0x0092, 0x0092, 0x0092, 0x009c, 0x009c, 0x009c, + // Entry 40 - 7F + 0x009c, 0x00a8, 0x00a8, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00b7, 0x00b7, 0x00c1, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, + 0x00c8, 0x00c8, 0x00d4, 0x00d4, 0x00dd, 0x00dd, 0x00dd, 0x00dd, + 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, + 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, + 0x00dd, 0x00dd, 0x00dd, 0x00e8, 0x00e8, 0x00f1, 0x00f1, 0x00f1, + 0x00fa, 0x00fa, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, + 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x010d, 0x010d, 0x0115, + // Entry 80 - BF + 0x0115, 0x011e, 0x011e, 0x011e, 0x011e, 0x0128, 0x0131, 0x013d, + 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, + 0x013d, 0x013d, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, + 0x014f, 0x014f, 0x0158, 0x0158, 0x0158, 0x0163, 0x0163, 0x0163, + 0x0163, 0x0163, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x0176, + 0x017f, 0x017f, 0x017f, 0x018d, 0x018d, 0x018d, 0x018d, 0x018d, + 0x018d, 0x0196, 0x0196, 0x019f, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + // Entry C0 - FF + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + // Entry 100 - 13F + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + // Entry 140 - 17F + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + // Entry 180 - 1BF + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + // Entry 1C0 - 1FF + 0x01a6, 0x01b0, + }, + }, + { // om + "AfrikootaAfaan SidaamaaArabiffaaAfaan AzerbaijaniAfaan BelarusiaAfaan Bu" + + "lgariyaAfaan BaangladeshiAfaan BosniyaaAfaan KatalaaAfaan CzechWelis" + + "hiffaaAfaan DeenmaarkAfaan JarmaniiAfaan GiriikiIngliffaAfaan Espera" + + "ntooAfaan IspeenAfaan IstooniyaAfaan BaskuuAfaan PersiaAfaan Fiilaan" + + "diAfaan FaroeseAfaan FaransaayiiAfaan FirisiyaaniAfaan AyirishiiScot" + + "s GaelicAfaan GalishiiAfaan GuaraniAfaan GujaratiAfaan HebrewAfaan H" + + "indiiAfaan CroatianAfaan HangaariInterlinguaAfaan IndoneziyaAyiislan" + + "diffaaAfaan XaaliyaaniAfaan JapaniiAfaan JavaAfaan GeorgianAfaan Kan" + + "nadaAfaan KoreaAfaan LaatiniAfaan LiituniyaaAfaan LativiyaaAfaan Mac" + + "edooniyaaMalayaalamiffaaAfaan MaratiiMalaayiffaaAfaan MaltesiiAfaan " + + "NepaliiAfaan DachiiAfaan NorwegianAfaan NorweyiiAfaan OccitOromooAfa" + + "an PunjabiiAfaan PolandiiAfaan PorchugaalAfaan RomaniyaaAfaan Rushiy" + + "aaAfaan SinhaleseAfaan SlovakAfaan IslovaniyaaAfaan AlbaniyaaAfaan S" + + "erbiyaAfaan SudaaniiAfaan SuwidiinSuwahiliiAfaan TamiliiAfaan Telugu" + + "Afaan TayiiAfaan TigireeLammii TurkiiAfaan TurkiiAfaan UkreeniiAfaan" + + " UrduAfaan UzbekAfaan VeetinamAfaan XhosaChineseAfaan ZuuluAfaan Fil" + + "ippiniiAfaan KilingonAfaan Portugali (Braazil)Afaan Protuguese", + []uint16{ // 606 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0009, 0x0017, 0x0017, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0031, 0x0031, 0x0040, 0x004f, + 0x004f, 0x004f, 0x0061, 0x0061, 0x0061, 0x006f, 0x007c, 0x007c, + 0x007c, 0x007c, 0x007c, 0x0087, 0x0087, 0x0087, 0x0092, 0x00a1, + 0x00af, 0x00af, 0x00af, 0x00af, 0x00bc, 0x00c4, 0x00d4, 0x00e0, + 0x00ef, 0x00fb, 0x0107, 0x0107, 0x0116, 0x0116, 0x0123, 0x0134, + 0x0145, 0x0154, 0x0160, 0x016e, 0x017b, 0x0189, 0x0189, 0x0189, + 0x0195, 0x01a1, 0x01a1, 0x01af, 0x01af, 0x01bd, 0x01bd, 0x01bd, + // Entry 40 - 7F + 0x01c8, 0x01d8, 0x01d8, 0x01d8, 0x01d8, 0x01d8, 0x01d8, 0x01e6, + 0x01f6, 0x01f6, 0x0203, 0x020d, 0x021b, 0x021b, 0x021b, 0x021b, + 0x021b, 0x021b, 0x021b, 0x0228, 0x0233, 0x0233, 0x0233, 0x0233, + 0x0233, 0x0233, 0x0233, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, + 0x0240, 0x0250, 0x0250, 0x025f, 0x025f, 0x025f, 0x025f, 0x0271, + 0x0280, 0x0280, 0x028d, 0x0298, 0x02a6, 0x02a6, 0x02a6, 0x02a6, + 0x02b3, 0x02b3, 0x02bf, 0x02ce, 0x02dc, 0x02dc, 0x02dc, 0x02dc, + 0x02e7, 0x02e7, 0x02ed, 0x02ed, 0x02ed, 0x02fb, 0x02fb, 0x0309, + // Entry 80 - BF + 0x0309, 0x0319, 0x0319, 0x0319, 0x0319, 0x0328, 0x0336, 0x0336, + 0x0336, 0x0336, 0x0336, 0x0336, 0x0336, 0x0345, 0x0351, 0x0362, + 0x0362, 0x0362, 0x0362, 0x0371, 0x037e, 0x037e, 0x037e, 0x038c, + 0x039a, 0x03a3, 0x03b0, 0x03bc, 0x03bc, 0x03c7, 0x03d4, 0x03e1, + 0x03e1, 0x03e1, 0x03ed, 0x03ed, 0x03ed, 0x03ed, 0x03ed, 0x03fb, + 0x0405, 0x0410, 0x0410, 0x041e, 0x041e, 0x041e, 0x041e, 0x0429, + 0x0429, 0x0429, 0x0429, 0x0430, 0x043b, 0x043b, 0x043b, 0x043b, + 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, + // Entry C0 - FF + 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, + 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, + 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, + 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, + 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, + 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, + 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, + 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, + // Entry 100 - 13F + 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, + 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, + 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, + 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x043b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + // Entry 140 - 17F + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + // Entry 180 - 1BF + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + // Entry 1C0 - 1FF + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + // Entry 200 - 23F + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, 0x044b, + 0x044b, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, + 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, + 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, + 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, + 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, + // Entry 240 - 27F + 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, + 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, + 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, + 0x0459, 0x0459, 0x0459, 0x0459, 0x0472, 0x0482, + }, + }, + { // or + "ଅଫାର୍ଆବ୍ଖାଜିଆନ୍ଅବେସ୍ତନଆଫ୍ରିକାନସ୍ଅକନ୍ଆମହାରକିଆର୍ଗୋନୀଆରବିକ୍ଆସାମୀଆଭାରିକ୍ଆୟମା" + + "ରାଆଜେରବାଇଜାନିବଶଖିର୍ବେଲାରୁଷିଆନ୍ବୁଲଗେରିଆନ୍ବିସଲାମାବାମ୍ବାରାବଙ୍ଗାଳୀତିବେ" + + "ତାନ୍ବ୍ରେଟନ୍କାଟଲାନ୍କାଟାଲାନ୍ଚେଚନ୍ଚାମୋରୋକୋର୍ସିକାନ୍କ୍ରୀଚେକ୍ଚର୍ଚ୍ଚ ସ୍ଲା" + + "ଭିକ୍ଚୁଭାଶ୍ୱେଲ୍ସଡାନ୍ନିସ୍ଜର୍ମାନ୍ଡିଭେହୀଭୂଟାନୀଇୱେଗ୍ରୀକ୍ଇଂରାଜୀଏସ୍ପାରେଣ୍" + + "ଟୋସ୍ପାନିସ୍ଏସ୍ତୋନିଆନ୍ବାସ୍କ୍ୱିପର୍ସିଆନ୍ଫୁଲାହଫିନ୍ନିସ୍ଫିଜିଫାରୋଏସେଫ୍ରେଞ୍" + + "ଚପଶ୍ଚିମ ଫ୍ରିସିୟନ୍ଇରିସ୍ସ୍କଟିସ୍ ଗାଏଲିକ୍ଗାଲସିଆନ୍ଗୁଆରାନୀଗୁଜୁରାଟୀମାଁକ୍ସ" + + "ହୌସାହେବ୍ର୍ୟୁହିନ୍ଦୀହିରି ମୋଟୁକ୍ରୋଆଟିଆନ୍ହୈତାୟିନ୍ହଙ୍ଗେରିଆନ୍ଆର୍ମେନିଆନ୍ହ" + + "େରେରୋଇର୍ଣ୍ଟଲିଙ୍ଗୁଆଇଣ୍ଡୋନେସିଆନ୍ଇର୍ଣ୍ଟରଲିଙ୍ଗୁଇଇଗ୍ବୋସିଚୁଆନ୍ ୟୀଇନୁପିୟା" + + "କ୍ଇଡୋଆଇସଲାଣ୍ଡିକ୍ଇଟାଲିଆନ୍ଇନକୀଟୁତ୍ଜାପାନୀଜ୍ଜାଭାନୀଜ୍ଜର୍ଜିଆନ୍କଙ୍ଗୋକୀକୁୟ" + + "ୁକ୍ୱାନ୍ୟାମ୍କାଜାକ୍ଗ୍ରୀନଲାଣ୍ଡିକ୍ଖ୍ମେର୍କନ୍ନଡକୋରିଆନ୍କନୁରୀକାଶ୍ମିରୀକୁର୍ଦ" + + "୍ଦିଶ୍କୋମିକୋର୍ନିସ୍କିରଗିଜ୍ଲାଟିନ୍ଲକ୍ସେମବର୍ଗିସ୍ଗନ୍ଦାଲିମ୍ବୁର୍ଗିସ୍ଲିଙ୍ଗା" + + "ଲାଲାଓଲିଥୁଆନିଆନ୍ଲ୍ୟୁବା-କାଟାଙ୍ଗାଲାଟଭିଆନ୍ମାଲାଗାସୀମାର୍ଶାଲୀଜ୍ମାଓରୀମାକଡୋ" + + "ନିଆନ୍ମାଲାୟଲମ୍ମଙ୍ଗୋଲିଆନ୍ମରାଠୀମାଲୟମାଲଟୀଜ୍ବର୍ମୀଜ୍ନାଉରୁଉତ୍ତର ନେଡବେଲେନେ" + + "ପାଳୀଡୋଙ୍ଗାଡଚ୍ନରୱେଜିଆନ୍ ନିୟୋର୍ସ୍କନରୱେଜିଆନ୍ ବୋକମଲ୍ଦକ୍ଷିଣ ନେଡବେଲେନାଭା" + + "ଜୋନିୟାଞ୍ଜଓସିଟାନ୍ଓଜିୱାଓରୋମୋଓଡ଼ିଆଓସେଟିକ୍ପଞ୍ଜାବୀପାଲିପୋଲିଶ୍ପାସ୍ତୋପର୍ତ୍" + + "ତୁଗ୍ରୀଜ୍କ୍ୱେଚୁଆରେହେଟୋ-ରୋମାନ୍ସରୁଣ୍ଡିରୋମାନିଆନ୍ରଷିଆନ୍କିନ୍ୟାରୱାଣ୍ଡାସଂସ" + + "୍କୃତସର୍ଦିନିଆନ୍ସିନ୍ଧୀଉତ୍ତର ସାମିସାଙ୍ଗୋସିଂହଳସ୍ଲୋଭାକ୍ସ୍ଲୋଭେନିଆନ୍ସାମୋଆନ" + + "୍ଶୋନାସୋମାଲିଆଆଲବାନିଆନ୍ସର୍ବିଆନ୍ସ୍ବାତୀସେସୋଥୋସୁଦାନୀଜ୍ସ୍ୱେଡିସ୍ସ୍ୱାହିଲ୍ତ" + + "ାମିଲ୍ତେଲୁଗୁତାଜିକ୍ଥାଇଟ୍ରିଗିନିଆତୁର୍କମେନ୍ସେସ୍ବାନାଟୋଙ୍ଗାତୁର୍କିସ୍ସୋଂଗାତ" + + "ାତାର୍ତାହିତିଆନ୍ୟୁଘୁର୍ୟୁକ୍ରାନିଆନ୍ଉର୍ଦ୍ଦୁଉଜବେକ୍ଭେଣ୍ଡାଭିଏତନାମିଜ୍ବୋଲାପୁ" + + "କୱାଲୁନ୍ୱୋଲଫ୍ଖୋସାୟିଡିସ୍ୟୋରୁବାଜୁଆଙ୍ଗଚାଇନୀଜ୍ଜୁଲୁଆଚାଇନୀଜ୍ଆକୋଲିଆଦାଙ୍ଗେମ" + + "୍ଅଦ୍ୟଘେଆଫ୍ରିହିଲିଆଇନୁଆକାଡିଆନ୍ଆଲେଇଟୁଦକ୍ଷିଣ ଆଲ୍ଟାଇପୁରୁଣା ଇଁରାଜୀଅଁଗୀକା" + + "ଆରାମାଇକ୍ଆରାଉକାନିଆନ୍ଆରାପାହୋଆରୱକଆଷ୍ଟୁରିଆନ୍ଆୱାଧିବାଲୁଚିବାଲିନୀଜ୍ବାସାବେଜ" + + "ାବେମ୍ବାଭୋଜପୁରୀବିକୋଲ୍ବିନିବିକ୍ସିକାବ୍ରାଜ୍ବୁରିଆଟ୍ବୁଗୀନୀଜ୍ବ୍ଲିନ୍କାଡୋକାର" + + "ିବ୍ଆତ୍ସମ୍ସୀବୁଆନୋଚିବ୍ଚାଛଗତାଇଚୁକୀସେମାରୀଚିନୁକ୍ ଜାରଗାଁନ୍ଚୋଟୱାଚିପେୱାନ୍ଚ" + + "େରୋକୀଚେଚେନାକପ୍ଟିକ୍କ୍ରୀମିନ୍ ତୁର୍କୀସ୍କାଶୁବିଆନ୍ଡାକୋଟାଡାରାଗ୍ୱାଡେଲାୱେର୍" + + "ସ୍ଲେଭ୍ଡୋଗ୍ରିବ୍ଦିଙ୍କାଡୋଗ୍ରୀନିଚଳା ସର୍ବିଆନ୍ଡୁଆନାମଧ୍ୟ ପର୍ତ୍ତୁଗାଲୀଡୁଆଲା" + + "ଏଫିକ୍ପ୍ରାଚୀନ୍ ମିଶିରିଏକାଜୁକ୍ଏଲାମାଇଟ୍ମଧ୍ୟ ଇଁରାଜୀଇୱୋଣ୍ଡୋଫାଙ୍ଗଫିଲିପିନୋ" + + "ଫନ୍ମଧ୍ୟ ଫ୍ରେଞ୍ଚପୁରୁଣା ଫ୍ରେଞ୍ଚଉତ୍ତର ଫ୍ରିସିୟାନ୍ପୂର୍ବ ଫ୍ରିସିୟାନ୍ଫ୍ରିୟ" + + "ୁଲୀୟାନ୍ଗାଗାୟୋଗବାୟାଗୀଜ୍ଜିବ୍ରାଟୀଜ୍ମିଡିଲ୍ ହାଇ ଜର୍ମାନ୍ପୁରୁଣା ହାଇ ଜର୍ମା" + + "ନ୍ଗୋଣ୍ଡିଗୋରୋଣ୍ଟାଲୋଗୋଥିକ୍ଗ୍ରେବୋପ୍ରାଚୀନ୍ ୟୁନାନୀସ୍ବିସ୍ ଜର୍ମାନ୍ସ୍ବିଚ୍ " + + "ଇନ୍ହାଇଡାହାୱାଇନ୍ହିଲିଗୈନନ୍ହିତୀତେହଁଙ୍ଗଉପର ସର୍ବିଆନ୍ହୁପାଇବାନ୍ଇଲୋକୋଇଁଙ୍ଗ" + + "ୁଶ୍ଲୋଜବାନ୍ଜୁଡେଓ-ପର୍ସିଆନ୍ଜୁଡେଓ-ଆରବୀକ୍କାରା-କଲ୍ପକ୍କବାଇଲ୍କଚିନ୍ଜ୍ଜୁକମ୍ବ" + + "ାକାୱିକାବାର୍ଡିଆନ୍ତ୍ୟାପ୍କୋରୋଖାସୀଖୋତାନୀଜ୍କିମ୍ବୁଣ୍ଡୁକୋନକାନୀକୋସରୈନ୍କୈପେ" + + "ଲେକରାଚୟ-ବଲ୍କାରକାରେଲିୟାନ୍କୁରୁଖକୁମୀକ୍କୁତେନାଉଲାଦିନୋଲାହାଣ୍ଡାଲାମ୍ବାଲେଜଗ" + + "ିୟାନ୍ମଙ୍ଗୋଲୋଜିଲୁବା-ଲୁଲୁଆଲୁଇସେନୋଲୁଣ୍ଡାଲୁଓଲୁସାଉମାଦୁରୀସ୍ମାଗାହୀମୈଥିଳୀମ" + + "କାସର୍ମାଣ୍ଡିଙ୍ଗୋମାସାଇମୋକ୍ଷମନ୍ଦାରମେଣ୍ଡେମଧ୍ୟ ଇରିଶ୍ମିକମୌକ୍ମିନାଙ୍ଗାବାଉମ" + + "ାଞ୍ଚୁମଣିପୁରୀମୋହୌକମୋସିବିବିଧ ଭାଷାମାନକ୍ରୀକ୍ମିରାଣ୍ଡିଜ୍ମାରୱାରୀଏର୍ଜୟାନୀପ" + + "ୋଲିଟାନ୍ଲୋ ଜର୍ମାନ୍ନେୱାରୀନୀୟାସ୍ନିୟୁଆନ୍ନୋଗାଇପୁରୁଣା ନର୍ସଏନ୍କୋଉତ୍ତରୀ ସୋ" + + "ଥୋପାରମ୍ପରିକ ନେୱାରୀନ୍ୟାମୱେଜୀନ୍ୟାନକୋଲ୍ନ୍ୟାରୋଞ୍ଜିମାୱୌସେଜ୍ଓଟ୍ଟୋମନ୍ ତୁର" + + "୍କିସ୍ପାଙ୍ଗାସିନିଆନ୍ପାହ୍ଲାଭିପାମ୍ପାଙ୍ଗାପାପିୟାମିଣ୍ଟୋପାଲାଉଆନ୍ପୁରୁଣା ପର୍" + + "ସିଆନ୍ଫୋନେସିଆନ୍ପୋହପିଏନ୍ପୁରୁଣା ପ୍ରେଭେନେସିଆଲ୍ରାଜସ୍ଥାନୀରାପାନୁଇରାରୋତୋଙ୍" + + "ଗନ୍ରୋମାନିଆରୋମାନିଆନ୍ସଣ୍ଡାୱେୟାକୁଟ୍ସାମୌରିଟନ୍ ଆରମାଇକ୍ସାସାକ୍ସାନ୍ତାଳିସିଶ" + + "ିଲିଆନ୍ସ୍କଟସ୍ସେଲ୍କପ୍ପୁରୁଣା ଇରିଶ୍ଶାନ୍ସିଦାମୋଦକ୍ଷିଣ ସାମିଲୁଲେ ସାମିଇନାରୀ" + + " ସାମିସ୍କୋଲ୍ଟ ସାମୀସୋନିଙ୍କେସୋଗଡିଏନ୍ଶାରାନା ଟୋଙ୍ଗୋଶେରେର୍ସୁକୁମାଶୁଶୁସୁମେରି" + + "ଆନ୍କ୍ଲାସିକାଲ୍ ସିରିକ୍ସିରିକ୍ତିମନେତେରେନୋତେତୁମ୍ଟାଇଗ୍ରେତୀଭ୍ଟୋକେଲାଉକ୍ଲିଙ" + + "୍ଗନ୍ତ୍ଲିଙ୍ଗିଟ୍ତାମାଶେକ୍ନ୍ୟାସା ଟୋଙ୍ଗୋଟୋକ୍ ପିସିନ୍ତିସିମିସିଆନ୍ଟୁମ୍ବୁକାତ" + + "ୁଭାଲୁତୁଭିନିଆନ୍ଉଦମୂର୍ତ୍ତୟୁଗୋରଟିକ୍ଉମ୍ବୁଣ୍ଡୁମୂଳଭାଇଭୋଟିକ୍ୱାଲମୋୱାରୈୱାସୋ" + + "କାଲ୍ମୀକ୍ୟାଓୟାପୀସ୍ଜାପୋଟେକ୍ବ୍ଲିସିମ୍ବଲସ୍ଜେନାଗାଜୁନୀକୌଣସି ଲିଙ୍ଗୁଇଷ୍ଟ ସା" + + "ମଗ୍ରୀ ନାହିଁଜାଜାଅଷ୍ଟ୍ରିଆନ୍ ଜର୍ମାନସ୍ବିସ୍ ହାଇ ଜର୍ମାନ୍ଅଷ୍ଟ୍ରେଲିଆନ୍ ଇଁର" + + "ାଜୀକାନାଡିଆନ୍ ଇଁରାଜୀବ୍ରିଟିଶ୍ ଇଁରାଜୀୟୁ.ଏସ୍. ଇଁରାଜୀଲାଟିନ୍ ଆମେରିକାନ୍ ସ" + + "୍ପାନିଶ୍ଲେବେରିଆନ୍ ସ୍ପାନିଶ୍କାନାଡିଆନ୍ ଫ୍ରେଞ୍ଚସ୍ବିସ୍ ଫ୍ରେଞ୍ଚ୍ଫ୍ଲେମିଶ୍ବ" + + "୍ରାଜିଲିଆନ୍ ପର୍ତ୍ତୁଗୀଜ୍ଲେବେରିଆନ୍ ପର୍ତ୍ତୁଗୀଜ୍ମୋଲଡୋଭିଆନ୍ସର୍ବୋ-କ୍ରୋଆଟି" + + "ଆନ୍ସରଳିକରଣ ଚାଇନୀଜ୍ପାରମ୍ପରିକ ଚାଇନୀଜ୍", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000f, 0x002d, 0x0042, 0x0060, 0x006c, 0x0081, 0x0096, + 0x00a8, 0x00b7, 0x00cc, 0x00de, 0x00ff, 0x0111, 0x0132, 0x0150, + 0x0165, 0x017d, 0x0192, 0x01aa, 0x01bf, 0x01d4, 0x01ec, 0x01fb, + 0x020d, 0x022b, 0x0237, 0x0243, 0x026e, 0x0280, 0x028f, 0x02a7, + 0x02bc, 0x02ce, 0x02e0, 0x02e9, 0x02fb, 0x030d, 0x032e, 0x0346, + 0x0364, 0x037c, 0x0394, 0x03a3, 0x03bb, 0x03c7, 0x03dc, 0x03f1, + 0x041f, 0x042e, 0x0459, 0x0471, 0x0486, 0x049e, 0x04b0, 0x04bc, + 0x04d4, 0x04e6, 0x04ff, 0x051d, 0x0535, 0x0553, 0x0571, 0x0583, + // Entry 40 - 7F + 0x05aa, 0x05ce, 0x05f8, 0x0607, 0x0623, 0x063e, 0x0647, 0x0668, + 0x0680, 0x0698, 0x06b0, 0x06c8, 0x06e0, 0x06ef, 0x0701, 0x071f, + 0x0731, 0x0758, 0x076a, 0x0779, 0x078e, 0x079d, 0x07b5, 0x07d3, + 0x07df, 0x07f7, 0x080c, 0x081e, 0x0845, 0x0854, 0x0878, 0x0890, + 0x0899, 0x08b7, 0x08e2, 0x08fa, 0x0912, 0x0930, 0x093f, 0x095d, + 0x0975, 0x0993, 0x09a2, 0x09ae, 0x09c3, 0x09d8, 0x09e7, 0x0a0c, + 0x0a1e, 0x0a30, 0x0a39, 0x0a70, 0x0a9e, 0x0ac6, 0x0ad8, 0x0aed, + 0x0b02, 0x0b11, 0x0b20, 0x0b2f, 0x0b44, 0x0b59, 0x0b65, 0x0b77, + // Entry 80 - BF + 0x0b89, 0x0bb0, 0x0bc5, 0x0bed, 0x0bff, 0x0c1a, 0x0c2c, 0x0c53, + 0x0c68, 0x0c86, 0x0c98, 0x0cb4, 0x0cc6, 0x0cd5, 0x0ced, 0x0d0e, + 0x0d23, 0x0d2f, 0x0d44, 0x0d5f, 0x0d77, 0x0d89, 0x0d9b, 0x0db3, + 0x0dcb, 0x0de3, 0x0df5, 0x0e07, 0x0e19, 0x0e22, 0x0e3d, 0x0e58, + 0x0e70, 0x0e82, 0x0e9a, 0x0ea9, 0x0ebb, 0x0ed6, 0x0ee8, 0x0f09, + 0x0f1e, 0x0f30, 0x0f42, 0x0f60, 0x0f75, 0x0f87, 0x0f96, 0x0fa2, + 0x0fb4, 0x0fc6, 0x0fd8, 0x0fed, 0x0ff9, 0x1011, 0x1020, 0x103b, + 0x104d, 0x104d, 0x1068, 0x1068, 0x1074, 0x108c, 0x108c, 0x109e, + // Entry C0 - FF + 0x109e, 0x10c3, 0x10e8, 0x10fa, 0x1112, 0x1133, 0x1133, 0x1148, + 0x1148, 0x1154, 0x1154, 0x1154, 0x1154, 0x1154, 0x1172, 0x1172, + 0x1181, 0x1193, 0x11ab, 0x11ab, 0x11b7, 0x11b7, 0x11b7, 0x11b7, + 0x11c3, 0x11d5, 0x11d5, 0x11d5, 0x11d5, 0x11d5, 0x11d5, 0x11ea, + 0x11fc, 0x1208, 0x1208, 0x1208, 0x1220, 0x1220, 0x1220, 0x1232, + 0x1232, 0x1232, 0x1232, 0x1247, 0x125f, 0x125f, 0x1271, 0x1271, + 0x127d, 0x128f, 0x128f, 0x12a1, 0x12b6, 0x12b6, 0x12c8, 0x12d7, + 0x12e9, 0x12f5, 0x1320, 0x132f, 0x1347, 0x1359, 0x136b, 0x136b, + // Entry 100 - 13F + 0x1380, 0x1380, 0x13b1, 0x13cc, 0x13de, 0x13f6, 0x13f6, 0x140e, + 0x1420, 0x1438, 0x144a, 0x144a, 0x145c, 0x1484, 0x1484, 0x1493, + 0x14c1, 0x14c1, 0x14d0, 0x14d0, 0x14d0, 0x14df, 0x14df, 0x150a, + 0x151f, 0x1537, 0x1556, 0x1556, 0x156b, 0x156b, 0x157a, 0x1592, + 0x1592, 0x159b, 0x159b, 0x15bd, 0x15e5, 0x15e5, 0x1613, 0x1641, + 0x1665, 0x166b, 0x166b, 0x166b, 0x1677, 0x1686, 0x1686, 0x1692, + 0x16b0, 0x16b0, 0x16e2, 0x1714, 0x1714, 0x1726, 0x1744, 0x1756, + 0x1768, 0x1793, 0x17bb, 0x17bb, 0x17bb, 0x17bb, 0x17d7, 0x17e6, + // Entry 140 - 17F + 0x17e6, 0x17fb, 0x17fb, 0x1816, 0x1828, 0x1837, 0x1859, 0x1859, + 0x1865, 0x1874, 0x1874, 0x1883, 0x189b, 0x189b, 0x189b, 0x18b0, + 0x18b0, 0x18b0, 0x18d8, 0x18fa, 0x18fa, 0x1919, 0x192b, 0x193a, + 0x1946, 0x1955, 0x1961, 0x1982, 0x1982, 0x1994, 0x1994, 0x1994, + 0x1994, 0x19a0, 0x19a0, 0x19ac, 0x19c4, 0x19c4, 0x19c4, 0x19c4, + 0x19c4, 0x19c4, 0x19e2, 0x19e2, 0x19f7, 0x1a0c, 0x1a1e, 0x1a40, + 0x1a40, 0x1a40, 0x1a5e, 0x1a6d, 0x1a6d, 0x1a6d, 0x1a6d, 0x1a7f, + 0x1a94, 0x1aa6, 0x1aa6, 0x1abe, 0x1ad0, 0x1aeb, 0x1aeb, 0x1aeb, + // Entry 180 - 1BF + 0x1aeb, 0x1aeb, 0x1aeb, 0x1afa, 0x1b06, 0x1b06, 0x1b06, 0x1b22, + 0x1b37, 0x1b49, 0x1b52, 0x1b61, 0x1b61, 0x1b61, 0x1b61, 0x1b79, + 0x1b79, 0x1b8b, 0x1b9d, 0x1baf, 0x1bcd, 0x1bdc, 0x1bdc, 0x1beb, + 0x1bfd, 0x1c0f, 0x1c0f, 0x1c0f, 0x1c2b, 0x1c2b, 0x1c2b, 0x1c40, + 0x1c61, 0x1c73, 0x1c88, 0x1c97, 0x1ca3, 0x1ca3, 0x1ca3, 0x1cc8, + 0x1cda, 0x1cf8, 0x1d0d, 0x1d0d, 0x1d0d, 0x1d1f, 0x1d1f, 0x1d1f, + 0x1d3d, 0x1d3d, 0x1d59, 0x1d6b, 0x1d7d, 0x1d92, 0x1d92, 0x1d92, + 0x1d92, 0x1da1, 0x1dc0, 0x1dc0, 0x1dcf, 0x1dee, 0x1dee, 0x1e1c, + // Entry 1C0 - 1FF + 0x1e37, 0x1e52, 0x1e64, 0x1e76, 0x1e88, 0x1eb9, 0x1ee0, 0x1ef8, + 0x1f16, 0x1f3a, 0x1f52, 0x1f52, 0x1f52, 0x1f52, 0x1f7d, 0x1f7d, + 0x1f98, 0x1f98, 0x1f98, 0x1fb0, 0x1fb0, 0x1fea, 0x1fea, 0x1fea, + 0x2005, 0x201a, 0x203b, 0x203b, 0x203b, 0x203b, 0x204d, 0x204d, + 0x204d, 0x204d, 0x206b, 0x206b, 0x2080, 0x2092, 0x20c3, 0x20c3, + 0x20d5, 0x20ed, 0x20ed, 0x20ed, 0x20ed, 0x2108, 0x211a, 0x211a, + 0x211a, 0x211a, 0x211a, 0x211a, 0x212f, 0x212f, 0x2151, 0x2151, + 0x2151, 0x215d, 0x215d, 0x216f, 0x216f, 0x216f, 0x218e, 0x21a7, + // Entry 200 - 23F + 0x21c3, 0x21e5, 0x21fd, 0x2215, 0x223a, 0x224c, 0x224c, 0x224c, + 0x225e, 0x226a, 0x2285, 0x2285, 0x2285, 0x22b6, 0x22c8, 0x22c8, + 0x22c8, 0x22d7, 0x22d7, 0x22e9, 0x22fb, 0x2310, 0x231c, 0x2331, + 0x2331, 0x234c, 0x236a, 0x236a, 0x2382, 0x23a7, 0x23c6, 0x23c6, + 0x23c6, 0x23c6, 0x23e7, 0x23e7, 0x23ff, 0x2411, 0x2411, 0x242c, + 0x242c, 0x2447, 0x2462, 0x247d, 0x2486, 0x248f, 0x248f, 0x248f, + 0x248f, 0x248f, 0x24a1, 0x24a1, 0x24a1, 0x24a1, 0x24b0, 0x24bc, + 0x24c8, 0x24c8, 0x24c8, 0x24e0, 0x24e0, 0x24e0, 0x24e9, 0x24fb, + // Entry 240 - 27F + 0x24fb, 0x24fb, 0x24fb, 0x24fb, 0x2513, 0x2537, 0x2537, 0x2549, + 0x2549, 0x2555, 0x25a9, 0x25b5, 0x25b5, 0x25b5, 0x25e6, 0x2618, + 0x264f, 0x267d, 0x26a8, 0x26cc, 0x2713, 0x2747, 0x2747, 0x2747, + 0x2778, 0x27a3, 0x27a3, 0x27bb, 0x27fe, 0x283b, 0x2859, 0x2887, + 0x28b2, 0x28e3, + }, + }, + { // os + "абхазагавестӕафрикаансараббагавайрагтӕтӕйрагбашкирагболгайрагбосниагката" + + "лайнагцӕцӕйнагчехагчувашагданиагнемыцагбердзейнаганглисагесперантои" + + "спайнагестойнагбаскагперсайнагфиннагфиджифарерагфранцагирландиагуир" + + "агхорватагвенгериагсомихагиталиагяпойнаггуырдзиагкурдаглатинагмӕчъи" + + "дониронпортугалиагуырыссагкитайагадыгейаграгон англисагбурятагкопта" + + "грагон египтагфилиппинаграгон францаграгон бердзейнагмӕхъӕлонкӕсгон" + + "бӕлхъӕронхъуымыхъхъаглекъагцигайнагнӕзонгӕ ӕвзагавстралиаг немыцагш" + + "вйецариаг немыцагавстралиаг англисагканадӕйаг англисагбритайнаг анг" + + "лисагамерикаг англисаглатинаг америкаг англисагевропӕйаг англисагка" + + "надӕйаг францагшвейцариаг францагбразилиаг португалиагевропӕйаг пол" + + "тугалиагӕнцонгонд китайагтрадицион китайаг", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x000e, 0x001a, 0x002c, 0x002c, 0x002c, 0x002c, + 0x003a, 0x003a, 0x0048, 0x0048, 0x0058, 0x0068, 0x0068, 0x007a, + 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x0088, 0x009c, 0x00ac, + 0x00ac, 0x00ac, 0x00ac, 0x00b6, 0x00b6, 0x00c4, 0x00c4, 0x00d0, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00f2, 0x0102, 0x0114, 0x0124, + 0x0134, 0x0140, 0x0152, 0x0152, 0x015e, 0x0168, 0x0176, 0x0184, + 0x0184, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, 0x0196, + 0x01a0, 0x01a0, 0x01a0, 0x01b0, 0x01b0, 0x01c2, 0x01d0, 0x01d0, + // Entry 40 - 7F + 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, + 0x01de, 0x01de, 0x01ec, 0x01ec, 0x01fe, 0x01fe, 0x01fe, 0x01fe, + 0x01fe, 0x01fe, 0x01fe, 0x01fe, 0x01fe, 0x01fe, 0x01fe, 0x020a, + 0x020a, 0x020a, 0x020a, 0x0218, 0x0218, 0x0218, 0x0218, 0x0218, + 0x0218, 0x0218, 0x0218, 0x0218, 0x0218, 0x0218, 0x0218, 0x0228, + 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, + 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, + 0x0228, 0x0228, 0x0228, 0x0228, 0x0230, 0x0230, 0x0230, 0x0230, + // Entry 80 - BF + 0x0230, 0x0246, 0x0246, 0x0246, 0x0246, 0x0246, 0x0256, 0x0256, + 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, + 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, + 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, + 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, + 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, + 0x0256, 0x0256, 0x0256, 0x0264, 0x0264, 0x0264, 0x0264, 0x0264, + 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, + // Entry C0 - FF + 0x0274, 0x0274, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, + 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, + 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, + 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, + 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, 0x028f, + 0x028f, 0x028f, 0x028f, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, + 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, + 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, + // Entry 100 - 13F + 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, + 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, + 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02c2, + 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02d6, + 0x02d6, 0x02d6, 0x02d6, 0x02d6, 0x02ef, 0x02ef, 0x02ef, 0x02ef, + 0x02ef, 0x02ef, 0x02ef, 0x02ef, 0x02ef, 0x02ef, 0x02ef, 0x02ef, + 0x02ef, 0x02ef, 0x02ef, 0x02ef, 0x02ef, 0x02ef, 0x02ef, 0x02ef, + 0x02ef, 0x030e, 0x030e, 0x030e, 0x030e, 0x030e, 0x030e, 0x030e, + // Entry 140 - 17F + 0x030e, 0x030e, 0x030e, 0x030e, 0x030e, 0x030e, 0x030e, 0x030e, + 0x030e, 0x030e, 0x030e, 0x030e, 0x031e, 0x031e, 0x031e, 0x031e, + 0x031e, 0x031e, 0x031e, 0x031e, 0x031e, 0x031e, 0x031e, 0x031e, + 0x031e, 0x031e, 0x031e, 0x032a, 0x032a, 0x032a, 0x032a, 0x032a, + 0x032a, 0x032a, 0x032a, 0x032a, 0x032a, 0x032a, 0x032a, 0x032a, + 0x032a, 0x032a, 0x032a, 0x032a, 0x032a, 0x032a, 0x032a, 0x033c, + 0x033c, 0x033c, 0x033c, 0x033c, 0x033c, 0x033c, 0x033c, 0x0354, + 0x0354, 0x0354, 0x0354, 0x0354, 0x0354, 0x0360, 0x0360, 0x0360, + // Entry 180 - 1BF + 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, + 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, + 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, + 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, + 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, + 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, + 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, + 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, + // Entry 1C0 - 1FF + 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, + 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, + 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, + 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0370, 0x0370, + 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, + 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, + 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, + 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, + // Entry 200 - 23F + 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, + 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, + 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, + 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, + 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, + 0x0370, 0x0370, 0x0370, 0x0370, 0x0389, 0x0389, 0x0389, 0x0389, + 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, + 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, + // Entry 240 - 27F + 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, + 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x0389, 0x03ac, 0x03cf, + 0x03f4, 0x0417, 0x043a, 0x045b, 0x048b, 0x04ae, 0x04ae, 0x04ae, + 0x04cf, 0x04f2, 0x04f2, 0x04f2, 0x051b, 0x0544, 0x0544, 0x0544, + 0x0565, 0x0586, + }, + }, + { // pa + paLangStr, + paLangIdx, + }, + { // pa-Arab + "پنجابی", + []uint16{ // 126 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, + }, + }, + { // pl + plLangStr, + plLangIdx, + }, + { // prg + "prūsiskan", + []uint16{ // 469 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 80 - BF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry C0 - FF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 100 - 13F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 140 - 17F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 180 - 1BF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 1C0 - 1FF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, + }, + }, + { // ps + "امهاريعربيآساميبېلاروسيبلغاريبوسنيالمانيیونانيانګلیسيحبشيباسکيفارسيفینلن" + + "ډيفرانسويعبريهنديارمنيایټالويجاپانیکرديلاتینيملغاسيمقدونيمغوليملایا" + + "هالېنډيپولنډيپښتوپورتګاليروسيسنسکریټالبانيسویډنیتاجکترکمنيتاتارازبک" + + "يچینيبلوڅي", + []uint16{ // 210 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, + 0x0014, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x002e, 0x003a, + 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x0044, 0x0044, 0x0044, + 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, + 0x0050, 0x0050, 0x0050, 0x0050, 0x005c, 0x006a, 0x006a, 0x006a, + 0x0072, 0x007c, 0x0086, 0x0086, 0x0094, 0x0094, 0x0094, 0x00a2, + 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00a2, + 0x00aa, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00b2, 0x00bc, 0x00bc, + // Entry 40 - 7F + 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, + 0x00ca, 0x00ca, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, + 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00d6, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, + 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00f6, 0x00f6, 0x00f6, 0x0102, + 0x0102, 0x010c, 0x010c, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, + 0x0116, 0x0116, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, + 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0130, + // Entry 80 - BF + 0x0138, 0x0148, 0x0148, 0x0148, 0x0148, 0x0148, 0x0150, 0x0150, + 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, + 0x015e, 0x015e, 0x015e, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, + 0x0176, 0x0176, 0x0176, 0x0176, 0x017e, 0x017e, 0x017e, 0x018a, + 0x018a, 0x018a, 0x018a, 0x018a, 0x0194, 0x0194, 0x0194, 0x0194, + 0x0194, 0x019e, 0x019e, 0x019e, 0x019e, 0x019e, 0x019e, 0x019e, + 0x019e, 0x019e, 0x019e, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + // Entry C0 - FF + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, 0x01a6, + 0x01a6, 0x01b0, + }, + }, + { // pt + ptLangStr, + ptLangIdx, + }, + { // pt-PT + ptPTLangStr, + ptPTLangIdx, + }, + { // qu + "Afrikaans SimiAmarico SimiArabe SimiAsames SimiAzerbaiyano SimiBaskir Si" + + "miBielorruso SimiBulgaro SimiBangla SimiTibetano SimiBreton SimiBosn" + + "io SimiCatalan SimiCorso SimiCheco SimiGales SimiDanes SimiAleman Si" + + "miDivehi SimiGriego SimiIngles SimiEspañol SimiEstonio SimiEuskera S" + + "imiPersa SimiFulah SimiFines SimiFeroes SimiFrances SimiFrison SimiI" + + "rlandes SimiGaelico Escoces SimiGallego SimiGujarati SimiHausa SimiH" + + "ebreo SimiHindi SimiCroata SimiHaitiano Criollo SimiHungaro SimiArme" + + "nio SimiIndonesio SimiIgbo SimiYi SimiIslandes SimiItaliano SimiInuk" + + "titut SimiJapones SimiGeorgiano SimiKazajo SimiGroenlandes SimiKhmer" + + " SimiKannada SimiCoreano SimiKirghiz SimiLuxemburgues SimiLao SimiLi" + + "tuano SimiLeton SimiMaori SimiMacedonio SimiMalayalam SimiMongol Sim" + + "iMarathi SimiMalayo SimiMaltes SimiNepali SimiNeerlandes SimiNoruego" + + " SimiOccitano SimiOdia SimiPunyabi SimiPolaco SimiPashto SimiPortugu" + + "es SimiRunasimiRomanche SimiRumano SimiRuso SimiKinyarwanda SimiSans" + + "crito SimiSindhi SimiChincha Sami SimiCingales SimiEslovaco SimiEslo" + + "veno SimiAlbanes SimiSerbio SimiSueco SimiSuajili SimiTamil SimiTelu" + + "gu SimiTayiko SimiTailandes SimiTigriña SimiTurcomano SimiSetsuana S" + + "imiTurco SimiTartaro SimiUigur SimiUcraniano SimiUrdu SimiUzbeko Sim" + + "iVietnamita SimiWolof SimiIsixhosa SimiYoruba SimiChino SimiIsizulu " + + "SimiMapuche SimiCheroqui SimiChawpi Kurdo SimiBajo Sorbio SimiFilipi" + + "no SimiAlsaciano SimiHmong Daw SimiAlto Sorbio SimiKonkani SimiMohaw" + + "k SimiSesotho Sa Leboa SimiPapiamento SimiKʼicheʼ SimiSakha SimiQull" + + "a Sami SimiSami Lule SimiSami Inari SimiSami Skolt SimiSiriaco Simi", + []uint16{ // 527 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000e, 0x000e, 0x001a, 0x001a, + 0x0024, 0x002f, 0x002f, 0x002f, 0x003f, 0x004a, 0x0059, 0x0065, + 0x0065, 0x0065, 0x0070, 0x007d, 0x0088, 0x0093, 0x009f, 0x009f, + 0x009f, 0x00a9, 0x00a9, 0x00b3, 0x00b3, 0x00b3, 0x00bd, 0x00c7, + 0x00d2, 0x00dd, 0x00dd, 0x00dd, 0x00e8, 0x00f3, 0x00f3, 0x0100, + 0x010c, 0x0118, 0x0122, 0x012c, 0x0136, 0x0136, 0x0141, 0x014d, + 0x0158, 0x0165, 0x0179, 0x0185, 0x0185, 0x0192, 0x0192, 0x019c, + 0x01a7, 0x01b1, 0x01b1, 0x01bc, 0x01d1, 0x01dd, 0x01e9, 0x01e9, + // Entry 40 - 7F + 0x01e9, 0x01f7, 0x01f7, 0x0200, 0x0207, 0x0207, 0x0207, 0x0214, + 0x0221, 0x022f, 0x023b, 0x023b, 0x0249, 0x0249, 0x0249, 0x0249, + 0x0254, 0x0264, 0x026e, 0x027a, 0x0286, 0x0286, 0x0286, 0x0286, + 0x0286, 0x0286, 0x0292, 0x0292, 0x02a3, 0x02a3, 0x02a3, 0x02a3, + 0x02ab, 0x02b7, 0x02b7, 0x02c1, 0x02c1, 0x02c1, 0x02cb, 0x02d9, + 0x02e7, 0x02f2, 0x02fe, 0x0309, 0x0314, 0x0314, 0x0314, 0x0314, + 0x031f, 0x031f, 0x032e, 0x032e, 0x033a, 0x033a, 0x033a, 0x033a, + 0x0347, 0x0347, 0x0347, 0x0350, 0x0350, 0x035c, 0x035c, 0x0367, + // Entry 80 - BF + 0x0372, 0x0380, 0x0388, 0x0395, 0x0395, 0x03a0, 0x03a9, 0x03b9, + 0x03c7, 0x03c7, 0x03d2, 0x03e3, 0x03e3, 0x03f0, 0x03fd, 0x040a, + 0x040a, 0x040a, 0x040a, 0x0416, 0x0421, 0x0421, 0x0421, 0x0421, + 0x042b, 0x0437, 0x0441, 0x044c, 0x0457, 0x0465, 0x0472, 0x0480, + 0x048d, 0x048d, 0x0497, 0x0497, 0x04a3, 0x04a3, 0x04ad, 0x04bb, + 0x04c4, 0x04cf, 0x04cf, 0x04de, 0x04de, 0x04de, 0x04e8, 0x04f5, + 0x04f5, 0x0500, 0x0500, 0x050a, 0x0516, 0x0516, 0x0516, 0x0516, + 0x0516, 0x0516, 0x0516, 0x0516, 0x0516, 0x0516, 0x0516, 0x0516, + // Entry C0 - FF + 0x0516, 0x0516, 0x0516, 0x0516, 0x0516, 0x0522, 0x0522, 0x0522, + 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, + 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, + 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, + 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, + 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, + 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, + 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x052f, 0x052f, 0x0540, + // Entry 100 - 13F + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0550, 0x0550, 0x0550, + 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, + 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x0550, 0x055d, + 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, + 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, + 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, + 0x055d, 0x055d, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, + // Entry 140 - 17F + 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x0579, 0x0589, 0x0589, + 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, + 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, + 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, + 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, 0x0589, + 0x0589, 0x0589, 0x0589, 0x0589, 0x0595, 0x0595, 0x0595, 0x0595, + 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, + 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, + // Entry 180 - 1BF + 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, + 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, + 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, + 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, 0x0595, + 0x0595, 0x0595, 0x0595, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, + 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, + 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, + 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05a0, 0x05b5, 0x05b5, 0x05b5, + // Entry 1C0 - 1FF + 0x05b5, 0x05b5, 0x05b5, 0x05b5, 0x05b5, 0x05b5, 0x05b5, 0x05b5, + 0x05b5, 0x05c4, 0x05c4, 0x05c4, 0x05c4, 0x05c4, 0x05c4, 0x05c4, + 0x05c4, 0x05c4, 0x05c4, 0x05c4, 0x05c4, 0x05c4, 0x05d2, 0x05d2, + 0x05d2, 0x05d2, 0x05d2, 0x05d2, 0x05d2, 0x05d2, 0x05d2, 0x05d2, + 0x05d2, 0x05d2, 0x05d2, 0x05d2, 0x05d2, 0x05dc, 0x05dc, 0x05dc, + 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, + 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, + 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05eb, 0x05f9, + // Entry 200 - 23F + 0x0608, 0x0617, 0x0617, 0x0617, 0x0617, 0x0617, 0x0617, 0x0617, + 0x0617, 0x0617, 0x0617, 0x0617, 0x0617, 0x0617, 0x0623, + }, + }, + { // rm + "afarabchasianavesticafrikaansakanamaricaragonaisarabassamiavaricaymaraas" + + "erbeidschanicbaschkirbielorussbulgarbislamabambarabengaltibetanbreto" + + "nbosniaccatalantschetschenchamorrocorscreetschecslav da baselgiatsch" + + "uvaschkimricdanaistudestgmaledivicdzongkhaewegrecenglaisesperantospa" + + "gnolestonbascpersianfulahfinlandaisfidschianferraisfranzosfrisirland" + + "aisgaelic scotgalicianguaranigujaratimanxhaussaebraichindihiri motuc" + + "roathaitianungaraisarmenhererointerlinguaindonaisinterlingueigbosich" + + "uan yiinupiakidoislandaistalianinuktitutgiapunaisjavanaisgeorgiankon" + + "gokikuyukuanyamacasacgrönlandaiscambodschankannadacoreankanurikashmi" + + "ricurdkomicornickirghislatinluxemburgaisgandalimburgaislingalalaotli" + + "tuanluba-katangalettonmalagassimarschallaismaorimacedonmalayalammong" + + "olicmarathimalaicmaltaisbirmannaurundebele dal nordnepalaisndongaoll" + + "andaisnorvegiais nynorsknorvegais bokmålndebele dal sidnavajonyanjao" + + "ccitanojibwaoromooriyaosseticpunjabipalipolacpaschtoportugaisquechua" + + "rumantschrundirumenrusskinyarwandasanscritsardsindhisami dal nordsan" + + "gosingalaisslovacslovensamoanshonasomalialbanaisserbswazisotho dal s" + + "idsundanaissvedaissuahilitamiltelugutadjiktailandaistigrinyaturkment" + + "swanatongatirctsongatatartahitianuiguricucranaisurduusbecvendavietna" + + "maisvolapukvallonwolofxhosajiddicyorubazhuangchinaiszuluacehacoliand" + + "angmeadygaiafrihiliainuaccadicaleuticaltaic dal sidenglais veglangik" + + "aarameicaraucanicarapahoarawakasturianawadhibelutschibalinaisbasaabe" + + "dschabembabhojpuribikolbinisiksikabrajburiatbugiblincaddocaribicatsa" + + "mcebuanochibchatschagataicchuukaismaripatuà chinookchoctawchipewyanc" + + "herokeecheyennecoptictirc crimeankaschubicdakotadargwadelawareslavey" + + "dogribdinkadogribass sorbdualaollandais mesaundiulaefikegipzian vegl" + + "ekajukelamiticenglais mesaunewondofangfilippinofonfranzos mesaunfran" + + "zos veglfris dal nordfris da l’ostfriulangagayogbayageezgilbertaistu" + + "destg mesaunvegl tudestg da scrittiragondigorontalogoticgrebogrec ve" + + "gltudestg svizzergwichʼinhaidahawaianhiligaynonettitichmongaut sorbh" + + "upaibanilocanoingushlojbangiudaic-persiangiudaic-arabkarakalpakkabyl" + + "ekachinjjukambakawikabardictyapkorokhasikhotanaiskimbundukonkanikosr" + + "aeankpellekarachay-balkarcareliankurukhkumukkutenailadinolahndalamba" + + "lezghianlomongoloziluba-lulualuisenolundaluolushaimaduraismagahimait" + + "hilimakassarmandingomasaimokshamandarmendeirlandais mesaunmicmacmina" + + "ngkabaumanchumanipurimohawkmossiplurilingcreekmirandaismarwarierzyan" + + "eapolitanbass tudestgnewariniasniuenogainordic vegln’kosotho dal nor" + + "dnewari classicnyamwezinyankolenyoronzimaosagetirc ottomanpangasinan" + + "pahlavipampangapapiamentopalaupersian veglfenizianponapeanprovenzal " + + "veglrajasthanirapanuirarotongaromaniaromunicsandawejakutarameic sama" + + "ritansasaksantalisicilianscotselkupirlandais veglshansidamosami dal " + + "sidsami lulesami inarisami skoltsoninkesogdiansranan tongoserersukum" + + "asususumericsiric classicsirictemneterenotetumtigretivtokelauklingon" + + "ictlingittamasheqlingua tsongatok pisintsimshiantumbukatuvalutuvinia" + + "nudmurtugariticmbundulinguas betg determinadasvaivoticwalamowaraywas" + + "hokalmukyaoyapaiszapotecsimbols da Blisszenagazuninagins cuntegns li" + + "nguisticszazatudestg austriacenglais australianenglais canadaisengla" + + "is britannicenglais americanspagnol latinamericanspagnol ibericfranz" + + "os canadaisfranzos svizzerflamportugais brasilianportugais iberianmo" + + "ldavserbo-croatchinais simplifitgàchinais tradiziunal", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000d, 0x0014, 0x001d, 0x0021, 0x0027, 0x0030, + 0x0034, 0x003a, 0x0040, 0x0046, 0x0055, 0x005d, 0x0066, 0x006c, + 0x0073, 0x007a, 0x0080, 0x0087, 0x008d, 0x0094, 0x009b, 0x00a6, + 0x00ae, 0x00b2, 0x00b6, 0x00bc, 0x00cc, 0x00d6, 0x00dc, 0x00e2, + 0x00e9, 0x00f2, 0x00fa, 0x00fd, 0x0101, 0x0108, 0x0111, 0x0118, + 0x011d, 0x0121, 0x0128, 0x012d, 0x0137, 0x0140, 0x0147, 0x014e, + 0x0152, 0x015b, 0x0166, 0x016e, 0x0175, 0x017d, 0x0181, 0x0187, + 0x018d, 0x0192, 0x019b, 0x01a0, 0x01a7, 0x01af, 0x01b4, 0x01ba, + // Entry 40 - 7F + 0x01c5, 0x01cd, 0x01d8, 0x01dc, 0x01e6, 0x01ed, 0x01f0, 0x01f9, + 0x01ff, 0x0208, 0x0211, 0x0219, 0x0221, 0x0226, 0x022c, 0x0234, + 0x0239, 0x0245, 0x0250, 0x0257, 0x025d, 0x0263, 0x026b, 0x026f, + 0x0273, 0x0279, 0x0280, 0x0285, 0x0291, 0x0296, 0x02a0, 0x02a7, + 0x02ab, 0x02b1, 0x02bd, 0x02c3, 0x02cc, 0x02d8, 0x02dd, 0x02e4, + 0x02ed, 0x02f5, 0x02fc, 0x0302, 0x0309, 0x030f, 0x0314, 0x0324, + 0x032c, 0x0332, 0x033b, 0x034d, 0x035e, 0x036d, 0x0373, 0x0379, + 0x0380, 0x0386, 0x038b, 0x0390, 0x0397, 0x039e, 0x03a2, 0x03a7, + // Entry 80 - BF + 0x03ae, 0x03b7, 0x03be, 0x03c7, 0x03cc, 0x03d1, 0x03d5, 0x03e0, + 0x03e8, 0x03ec, 0x03f2, 0x03ff, 0x0404, 0x040d, 0x0413, 0x0419, + 0x041f, 0x0424, 0x042a, 0x0432, 0x0436, 0x043b, 0x0448, 0x0451, + 0x0458, 0x045f, 0x0464, 0x046a, 0x0470, 0x047a, 0x0482, 0x0489, + 0x048f, 0x0494, 0x0498, 0x049e, 0x04a3, 0x04ab, 0x04b2, 0x04ba, + 0x04be, 0x04c3, 0x04c8, 0x04d2, 0x04d9, 0x04df, 0x04e4, 0x04e9, + 0x04ef, 0x04f5, 0x04fb, 0x0502, 0x0506, 0x050a, 0x050f, 0x0517, + 0x051d, 0x051d, 0x0525, 0x0525, 0x0529, 0x0530, 0x0530, 0x0537, + // Entry C0 - FF + 0x0537, 0x0545, 0x0551, 0x0557, 0x055e, 0x0567, 0x0567, 0x056e, + 0x056e, 0x0574, 0x0574, 0x0574, 0x0574, 0x0574, 0x057c, 0x057c, + 0x0582, 0x058b, 0x0593, 0x0593, 0x0598, 0x0598, 0x0598, 0x0598, + 0x059f, 0x05a4, 0x05a4, 0x05a4, 0x05a4, 0x05a4, 0x05a4, 0x05ac, + 0x05b1, 0x05b5, 0x05b5, 0x05b5, 0x05bc, 0x05bc, 0x05bc, 0x05c0, + 0x05c0, 0x05c0, 0x05c0, 0x05c6, 0x05ca, 0x05ca, 0x05ce, 0x05ce, + 0x05d3, 0x05da, 0x05da, 0x05df, 0x05e6, 0x05e6, 0x05ed, 0x05f8, + 0x0600, 0x0604, 0x0612, 0x0619, 0x0622, 0x062a, 0x0632, 0x0632, + // Entry 100 - 13F + 0x0638, 0x0638, 0x0644, 0x064d, 0x0653, 0x0659, 0x0659, 0x0661, + 0x0667, 0x066d, 0x0672, 0x0672, 0x0677, 0x0680, 0x0680, 0x0685, + 0x0695, 0x0695, 0x069a, 0x069a, 0x069a, 0x069e, 0x069e, 0x06ab, + 0x06b1, 0x06b9, 0x06c7, 0x06c7, 0x06cd, 0x06cd, 0x06d1, 0x06da, + 0x06da, 0x06dd, 0x06dd, 0x06eb, 0x06f7, 0x06f7, 0x0704, 0x0713, + 0x071a, 0x071c, 0x071c, 0x071c, 0x0720, 0x0725, 0x0725, 0x0729, + 0x0733, 0x0733, 0x0741, 0x075a, 0x075a, 0x075f, 0x0768, 0x076d, + 0x0772, 0x077b, 0x078a, 0x078a, 0x078a, 0x078a, 0x0793, 0x0798, + // Entry 140 - 17F + 0x0798, 0x079f, 0x079f, 0x07a9, 0x07b0, 0x07b5, 0x07bd, 0x07bd, + 0x07c1, 0x07c5, 0x07c5, 0x07cc, 0x07d2, 0x07d2, 0x07d2, 0x07d8, + 0x07d8, 0x07d8, 0x07e7, 0x07f3, 0x07f3, 0x07fd, 0x0803, 0x0809, + 0x080c, 0x0811, 0x0815, 0x081d, 0x081d, 0x0821, 0x0821, 0x0821, + 0x0821, 0x0825, 0x0825, 0x082a, 0x0833, 0x0833, 0x0833, 0x0833, + 0x0833, 0x0833, 0x083b, 0x083b, 0x0842, 0x084a, 0x0850, 0x085f, + 0x085f, 0x085f, 0x0867, 0x086d, 0x086d, 0x086d, 0x086d, 0x0872, + 0x0879, 0x087f, 0x087f, 0x0885, 0x088a, 0x0892, 0x0892, 0x0892, + // Entry 180 - 1BF + 0x0892, 0x0892, 0x0892, 0x0899, 0x089d, 0x089d, 0x089d, 0x08a7, + 0x08ae, 0x08b3, 0x08b6, 0x08bc, 0x08bc, 0x08bc, 0x08bc, 0x08c4, + 0x08c4, 0x08ca, 0x08d2, 0x08da, 0x08e2, 0x08e7, 0x08e7, 0x08ed, + 0x08f3, 0x08f8, 0x08f8, 0x08f8, 0x0908, 0x0908, 0x0908, 0x090e, + 0x0919, 0x091f, 0x0927, 0x092d, 0x0932, 0x0932, 0x0932, 0x093b, + 0x0940, 0x0949, 0x0950, 0x0950, 0x0950, 0x0955, 0x0955, 0x0955, + 0x095f, 0x095f, 0x096b, 0x0971, 0x0975, 0x0979, 0x0979, 0x0979, + 0x0979, 0x097e, 0x0989, 0x0989, 0x098f, 0x099d, 0x099d, 0x09ab, + // Entry 1C0 - 1FF + 0x09b3, 0x09bb, 0x09c0, 0x09c5, 0x09ca, 0x09d6, 0x09e0, 0x09e7, + 0x09ef, 0x09f9, 0x09fe, 0x09fe, 0x09fe, 0x09fe, 0x0a0a, 0x0a0a, + 0x0a12, 0x0a12, 0x0a12, 0x0a1a, 0x0a1a, 0x0a28, 0x0a28, 0x0a28, + 0x0a32, 0x0a39, 0x0a42, 0x0a42, 0x0a42, 0x0a42, 0x0a48, 0x0a48, + 0x0a48, 0x0a48, 0x0a50, 0x0a50, 0x0a57, 0x0a5c, 0x0a6d, 0x0a6d, + 0x0a72, 0x0a79, 0x0a79, 0x0a79, 0x0a79, 0x0a81, 0x0a85, 0x0a85, + 0x0a85, 0x0a85, 0x0a85, 0x0a85, 0x0a8b, 0x0a8b, 0x0a99, 0x0a99, + 0x0a99, 0x0a9d, 0x0a9d, 0x0aa3, 0x0aa3, 0x0aa3, 0x0aaf, 0x0ab8, + // Entry 200 - 23F + 0x0ac2, 0x0acc, 0x0ad3, 0x0ada, 0x0ae6, 0x0aeb, 0x0aeb, 0x0aeb, + 0x0af1, 0x0af5, 0x0afc, 0x0afc, 0x0afc, 0x0b09, 0x0b0e, 0x0b0e, + 0x0b0e, 0x0b13, 0x0b13, 0x0b19, 0x0b1e, 0x0b23, 0x0b26, 0x0b2d, + 0x0b2d, 0x0b36, 0x0b3d, 0x0b3d, 0x0b45, 0x0b52, 0x0b5b, 0x0b5b, + 0x0b5b, 0x0b5b, 0x0b64, 0x0b64, 0x0b6b, 0x0b71, 0x0b71, 0x0b79, + 0x0b79, 0x0b7f, 0x0b87, 0x0b8d, 0x0ba6, 0x0ba9, 0x0ba9, 0x0ba9, + 0x0ba9, 0x0ba9, 0x0bae, 0x0bae, 0x0bae, 0x0bae, 0x0bb4, 0x0bb9, + 0x0bbe, 0x0bbe, 0x0bbe, 0x0bc4, 0x0bc4, 0x0bc4, 0x0bc7, 0x0bcd, + // Entry 240 - 27F + 0x0bcd, 0x0bcd, 0x0bcd, 0x0bcd, 0x0bd4, 0x0be4, 0x0be4, 0x0bea, + 0x0bea, 0x0bee, 0x0c09, 0x0c0d, 0x0c0d, 0x0c0d, 0x0c1d, 0x0c1d, + 0x0c2f, 0x0c3f, 0x0c50, 0x0c60, 0x0c75, 0x0c83, 0x0c83, 0x0c83, + 0x0c93, 0x0ca2, 0x0ca2, 0x0ca6, 0x0cb9, 0x0cca, 0x0cd0, 0x0cdb, + 0x0cef, 0x0d02, + }, + }, + { // rn + "IgikaniIkimuharikiIcarabuIkibelarusiyaIkinyabuligariyaIkibengaliIgicekeI" + + "kidageIkigerekiIcongerezaIcesipanyoloIgiperisiIgifaransaIgihawusaIgi" + + "hindiIkinyahongiriyaIkinyendoziyaIkiguboIgitaliyaniIkiyapaniIkinyeja" + + "vaIgikambodiyaIkinyakoreyaIkinyamaleziyaIkinyabirimaniyaIkinepaliIgi" + + "holandiIgipunjabiIkinyapolonyeIgiporutugariIkirundiIkinyarumaniyaIki" + + "rusiyaIkinyarwandaIgisomaliIgisuweduwaIgitamiliIkinyatayilandiIgitur" + + "ukiyaIkinyayukereniInyeyuruduIkinyaviyetinamuIkiyorubaIgishinwaIkizu" + + "lu", + []uint16{ // 181 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0012, 0x0012, + 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0026, 0x0036, + 0x0036, 0x0036, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, + 0x004e, 0x004e, 0x004e, 0x004e, 0x0057, 0x0061, 0x0061, 0x006d, + 0x006d, 0x006d, 0x0076, 0x0076, 0x0076, 0x0076, 0x0076, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0089, + 0x0089, 0x0091, 0x0091, 0x0091, 0x0091, 0x00a0, 0x00a0, 0x00a0, + // Entry 40 - 7F + 0x00a0, 0x00ad, 0x00ad, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, + 0x00bf, 0x00bf, 0x00c8, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, + 0x00d2, 0x00d2, 0x00de, 0x00de, 0x00ea, 0x00ea, 0x00ea, 0x00ea, + 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, + 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, + 0x00ea, 0x00ea, 0x00ea, 0x00f8, 0x00f8, 0x0108, 0x0108, 0x0108, + 0x0111, 0x0111, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x0125, 0x0125, 0x0132, + // Entry 80 - BF + 0x0132, 0x013f, 0x013f, 0x013f, 0x0147, 0x0155, 0x015e, 0x016a, + 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, + 0x016a, 0x016a, 0x0173, 0x0173, 0x0173, 0x0173, 0x0173, 0x0173, + 0x017e, 0x017e, 0x0187, 0x0187, 0x0187, 0x0196, 0x0196, 0x0196, + 0x0196, 0x0196, 0x01a1, 0x01a1, 0x01a1, 0x01a1, 0x01a1, 0x01af, + 0x01b9, 0x01b9, 0x01b9, 0x01c9, 0x01c9, 0x01c9, 0x01c9, 0x01c9, + 0x01c9, 0x01d2, 0x01d2, 0x01db, 0x01e2, + }, + }, + { // ro + roLangStr, + roLangIdx, + }, + { // rof + "KiakaniKiamhariKiarabuKibelarusiKibulgariaKibanglaKicheckiKijerumaniKigi" + + "rikiKiingerezaKihispaniaKiajemiKyifaransaKihausaKihindiKihungariKiin" + + "donesiaKiigboKiitalianoKijapaniKijavaKikambodiaKikoreaKimalesiaKibur" + + "maKinepaliKiholanziKipunjabiKipolandiKirenoKiromaniaKirusiKinyarwand" + + "aKisomaliKiswidiKitamilKitailandiKiturukiKiukraniaKiurduKivietinamuK" + + "iyorubaKichinaKizuluKihorombo", + []uint16{ // 478 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x000f, 0x000f, + 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0020, 0x002a, + 0x002a, 0x002a, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, + 0x0044, 0x0044, 0x0044, 0x0044, 0x004c, 0x0056, 0x0056, 0x0060, + 0x0060, 0x0060, 0x0067, 0x0067, 0x0067, 0x0067, 0x0067, 0x0071, + 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0078, + 0x0078, 0x007f, 0x007f, 0x007f, 0x007f, 0x0088, 0x0088, 0x0088, + // Entry 40 - 7F + 0x0088, 0x0093, 0x0093, 0x0099, 0x0099, 0x0099, 0x0099, 0x0099, + 0x00a3, 0x00a3, 0x00ab, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, + 0x00b1, 0x00b1, 0x00bb, 0x00bb, 0x00c2, 0x00c2, 0x00c2, 0x00c2, + 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, + 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, + 0x00c2, 0x00c2, 0x00c2, 0x00cb, 0x00cb, 0x00d2, 0x00d2, 0x00d2, + 0x00da, 0x00da, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, + 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00ec, 0x00ec, 0x00f5, + // Entry 80 - BF + 0x00f5, 0x00fb, 0x00fb, 0x00fb, 0x00fb, 0x0104, 0x010a, 0x0115, + 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, + 0x0115, 0x0115, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, 0x011d, + 0x0124, 0x0124, 0x012b, 0x012b, 0x012b, 0x0135, 0x0135, 0x0135, + 0x0135, 0x0135, 0x013d, 0x013d, 0x013d, 0x013d, 0x013d, 0x0146, + 0x014c, 0x014c, 0x014c, 0x0157, 0x0157, 0x0157, 0x0157, 0x0157, + 0x0157, 0x015f, 0x015f, 0x0166, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + // Entry C0 - FF + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + // Entry 100 - 13F + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + // Entry 140 - 17F + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + // Entry 180 - 1BF + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + // Entry 1C0 - 1FF + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x0175, + }, + }, + { // ru + ruLangStr, + ruLangIdx, + }, + { // rw + "IkinyafurikaneriInyetuwiInyamuharikiIcyarabuIcyasamiziInyazeribayijaniIk" + + "ibelarusiyaUrunyabuligariyaIkibengaliInyebiritoniInyebosiniyaIgikata" + + "laniIgicekeIkigaluwaIkidaninwaIkidageIkigerekiIcyongerezaIcyesiperan" + + "toIcyesipanyoloIcyesitoniyaIkibasikiInyeperisiIgifinilandeInyefaroyi" + + "ziIgifaransaIgifiriziyaniIkirilandiIkigaluwa cy’IgisweduwaIkigalisiy" + + "aInyaguwaraniInyegujaratiIgiheburayoIgihindiIgikorowasiyaIgihongiriy" + + "aIkinyarumeniyaUrurimi GahuzamiryangoIkinyendoziyaUruhuzandimiIgisil" + + "andeIgitaliyaniIkiyapaniInyejavaInyejeworujiyaIgikambodiyaIgikanadaI" + + "gikoreyaInyekuridishiInkerigiziIkilatiniIlingalaIkilawotiyaniIkilitu" + + "waniyaIkinyaletoviyaniIkimasedoniyaniIkimalayalamiIkimongoliIkimarat" + + "iIkimalayiIkimalitezeIkinepaliIkinerilandeInyenoruveji (Nyonorusiki)" + + "IkinoruvejiInyogusitaniInyoriyaIgipunjabiIgipoloneImpashitoIgiporutu" + + "galiIkinyarumaniyaIkirusiyaKinyarwandaIgisansikiriIgisindiInyesimpal" + + "ezeIgisilovakiIkinyasiloveniyaIgisomaliIcyalubaniyaIgiseribeInyeseso" + + "toInyesudaniIgisuweduwaIgiswahiliIgitamiliIgiteluguIgitayiInyatigiri" + + "nyaInyeturukimeniIgiturukiyaIkiwiguriIkinyayukereniInyeyuruduInyeyuz" + + "ubekiIkinyaviyetinamuInyehawusaInyeyidishiInyezuluIkinyafilipineInye" + + "kilingoniInyeporutigali (Brezili)Inyeporutigali (Igiporutigali)Inyes" + + "eribiya na Korowasiya", + []uint16{ // 608 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0018, 0x0024, 0x0024, + 0x002c, 0x0036, 0x0036, 0x0036, 0x0046, 0x0046, 0x0053, 0x0063, + 0x0063, 0x0063, 0x006d, 0x006d, 0x0079, 0x0085, 0x0090, 0x0090, + 0x0090, 0x0090, 0x0090, 0x0097, 0x0097, 0x0097, 0x00a0, 0x00aa, + 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00ba, 0x00c5, 0x00d2, 0x00df, + 0x00eb, 0x00f4, 0x00fe, 0x00fe, 0x010a, 0x010a, 0x0116, 0x0120, + 0x012d, 0x0137, 0x0150, 0x015b, 0x0167, 0x0173, 0x0173, 0x0173, + 0x017e, 0x0186, 0x0186, 0x0193, 0x0193, 0x019f, 0x01ad, 0x01ad, + // Entry 40 - 7F + 0x01c3, 0x01d0, 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01e6, + 0x01f1, 0x01f1, 0x01fa, 0x0202, 0x0210, 0x0210, 0x0210, 0x0210, + 0x0210, 0x0210, 0x021c, 0x0225, 0x022e, 0x022e, 0x022e, 0x023b, + 0x023b, 0x023b, 0x0245, 0x024e, 0x024e, 0x024e, 0x024e, 0x0256, + 0x0263, 0x0270, 0x0270, 0x0280, 0x0280, 0x0280, 0x0280, 0x028f, + 0x029c, 0x02a6, 0x02af, 0x02b8, 0x02c3, 0x02c3, 0x02c3, 0x02c3, + 0x02cc, 0x02cc, 0x02d8, 0x02f2, 0x02fd, 0x02fd, 0x02fd, 0x02fd, + 0x0309, 0x0309, 0x0309, 0x0311, 0x0311, 0x031b, 0x031b, 0x0324, + // Entry 80 - BF + 0x032d, 0x033a, 0x033a, 0x033a, 0x033a, 0x0348, 0x0351, 0x035c, + 0x0368, 0x0368, 0x0370, 0x0370, 0x0370, 0x037d, 0x0388, 0x0398, + 0x0398, 0x0398, 0x03a1, 0x03ad, 0x03b6, 0x03b6, 0x03c0, 0x03ca, + 0x03d5, 0x03df, 0x03e8, 0x03f1, 0x03f1, 0x03f8, 0x0405, 0x0413, + 0x0413, 0x0413, 0x041e, 0x041e, 0x041e, 0x041e, 0x0427, 0x0435, + 0x043f, 0x044b, 0x044b, 0x045b, 0x045b, 0x045b, 0x045b, 0x0465, + 0x0470, 0x0470, 0x0470, 0x0470, 0x0478, 0x0478, 0x0478, 0x0478, + 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, + // Entry C0 - FF + 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, + 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, + 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, + 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, + 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, + 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, + 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, + 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, + // Entry 100 - 13F + 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, + 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, + 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, + 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0478, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + // Entry 140 - 17F + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + // Entry 180 - 1BF + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + // Entry 1C0 - 1FF + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + // Entry 200 - 23F + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, 0x0486, + 0x0486, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, + 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, + 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, + 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, + 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, + // Entry 240 - 27F + 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, + 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, + 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, 0x0493, + 0x0493, 0x0493, 0x0493, 0x0493, 0x04ab, 0x04c9, 0x04c9, 0x04e3, + }, + }, + { // rwk + "KiakanyiKiamharyiKyiarabuKyibelarusiKyibulgaryiaKyibanglaKyicheckiKyijer" + + "umaniKyigirikiKyingerezaKyihispaniaKyiajemiKyifaransaKyihausaKyihind" + + "iKyihungariKyiindonesiaKyiigboKyiitalianoKyijapaniKyijavaKyikambodia" + + "KyikoreaKyimalesiaKyiburmaKyinepaliKyiholanziKyipunjabiKyipolandiKyi" + + "renoKyiromaniaKyirusiKyinyarwandaKyisomalyiKyiswidiKyitamilKyitailan" + + "diKyiturukyiKyiukraniaKyiurduKyivietinamuKyiyorubaKyichinaKyizuluKir" + + "uwa", + []uint16{ // 484 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0011, 0x0011, + 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0024, 0x0030, + 0x0030, 0x0030, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, + 0x0039, 0x0039, 0x0039, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, + 0x004d, 0x004d, 0x004d, 0x004d, 0x0056, 0x0060, 0x0060, 0x006b, + 0x006b, 0x006b, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x007d, + 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x0085, + 0x0085, 0x008d, 0x008d, 0x008d, 0x008d, 0x0097, 0x0097, 0x0097, + // Entry 40 - 7F + 0x0097, 0x00a3, 0x00a3, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, + 0x00b5, 0x00b5, 0x00be, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, + 0x00c5, 0x00c5, 0x00d0, 0x00d0, 0x00d8, 0x00d8, 0x00d8, 0x00d8, + 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, + 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, + 0x00d8, 0x00d8, 0x00d8, 0x00e2, 0x00e2, 0x00ea, 0x00ea, 0x00ea, + 0x00f3, 0x00f3, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, + 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x0107, 0x0107, 0x0111, + // Entry 80 - BF + 0x0111, 0x0118, 0x0118, 0x0118, 0x0118, 0x0122, 0x0129, 0x0135, + 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, + 0x0135, 0x0135, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, + 0x0147, 0x0147, 0x014f, 0x014f, 0x014f, 0x015a, 0x015a, 0x015a, + 0x015a, 0x015a, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x016e, + 0x0175, 0x0175, 0x0175, 0x0181, 0x0181, 0x0181, 0x0181, 0x0181, + 0x0181, 0x018a, 0x018a, 0x0192, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + // Entry C0 - FF + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + // Entry 100 - 13F + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + // Entry 140 - 17F + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + // Entry 180 - 1BF + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + // Entry 1C0 - 1FF + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x019f, + }, + }, + { // sah + "АбхаастыыАппырыкааныстыыАраабтыыАдьырбайдьаанныыБөлөрүүстүүБулҕаардыыБен" + + "галлыыТибиэттииБосныйалыыКаталаанныыЧиэскэйдииДаатскайдыыНиэмэстииГ" + + "ириэктииАҥылычаанныыЫспаанныыЭстиэнийэлииПиэрсийэлииПииннииПырансуу" + + "стууБэҥгиэрдииЭрмээннииЫтаалыйалыыДьоппуоннууГурусууннууХаһаахтыыКэ" + + "риэйдииКыргыстыыЛатыынныыМоҕуоллууНьыпааллыыПандьаабтыыПортугааллыы" + + "РумыынныыНууччалыыСловаактыыАлбаанскайдыыТамыллыыТөлүгүлүүТадьыыкты" + + "ыУйгуурдууУкрайыыньыстыыҮзбиэктииКытайдыыЗуулулууПилипиинниисаха ты" + + "ла", + []uint16{ // 486 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0012, 0x0012, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0060, 0x0060, 0x0076, 0x008a, + 0x008a, 0x008a, 0x009c, 0x00ae, 0x00ae, 0x00c2, 0x00d8, 0x00d8, + 0x00d8, 0x00d8, 0x00d8, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x0102, + 0x0114, 0x0114, 0x0114, 0x0114, 0x0126, 0x013e, 0x013e, 0x0150, + 0x0168, 0x0168, 0x017e, 0x017e, 0x018c, 0x018c, 0x018c, 0x01a4, + 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, + 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01b8, 0x01ca, 0x01ca, + // Entry 40 - 7F + 0x01ca, 0x01ca, 0x01ca, 0x01ca, 0x01ca, 0x01ca, 0x01ca, 0x01ca, + 0x01e0, 0x01e0, 0x01f6, 0x01f6, 0x020c, 0x020c, 0x020c, 0x020c, + 0x021e, 0x021e, 0x021e, 0x021e, 0x0230, 0x0230, 0x0230, 0x0230, + 0x0230, 0x0230, 0x0242, 0x0254, 0x0254, 0x0254, 0x0254, 0x0254, + 0x0254, 0x0254, 0x0254, 0x0254, 0x0254, 0x0254, 0x0254, 0x0254, + 0x0254, 0x0266, 0x0266, 0x0266, 0x0266, 0x0266, 0x0266, 0x0266, + 0x027a, 0x027a, 0x027a, 0x027a, 0x027a, 0x027a, 0x027a, 0x027a, + 0x027a, 0x027a, 0x027a, 0x027a, 0x027a, 0x0290, 0x0290, 0x0290, + // Entry 80 - BF + 0x0290, 0x02a8, 0x02a8, 0x02a8, 0x02a8, 0x02ba, 0x02cc, 0x02cc, + 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02e0, 0x02e0, + 0x02e0, 0x02e0, 0x02e0, 0x02fa, 0x02fa, 0x02fa, 0x02fa, 0x02fa, + 0x02fa, 0x02fa, 0x030a, 0x031c, 0x0330, 0x0330, 0x0330, 0x0330, + 0x0330, 0x0330, 0x0330, 0x0330, 0x0330, 0x0330, 0x0342, 0x035e, + 0x035e, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, 0x0370, + 0x0370, 0x0370, 0x0370, 0x0380, 0x0390, 0x0390, 0x0390, 0x0390, + 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, + // Entry C0 - FF + 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, + 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, + 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, + 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, + 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, + 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, + 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, + 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, + // Entry 100 - 13F + 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, + 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, + 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, + 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x0390, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + // Entry 140 - 17F + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + // Entry 180 - 1BF + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + // Entry 1C0 - 1FF + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, + 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03a6, 0x03b7, + }, + }, + { // saq + "KiakanKiamhariKiarabuKibelarusiKibulgariaKibanglaKicheckiKijerumaniKigir" + + "ikiKingerezaKihispaniaKiajemiKifaransaKihausaKihindiKihungariKiindon" + + "esiaKiigboKiitalianoKijapaniKijavaKikambodiaKikoreaKimalesiaKiburmaK" + + "inepaliKiholanziKipunjabiKipolandiKirenoKiromaniaKirusiKinyarwandaKi" + + "somaliKiswidiKitamilKitailandiKiturukiKiukraniaKiurduKivietinamuKiyo" + + "rubaKichinaKizuluKisampur", + []uint16{ // 488 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x0029, + 0x0029, 0x0029, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, + 0x0031, 0x0031, 0x0031, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, + 0x0043, 0x0043, 0x0043, 0x0043, 0x004b, 0x0054, 0x0054, 0x005e, + 0x005e, 0x005e, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0075, + 0x0075, 0x007c, 0x007c, 0x007c, 0x007c, 0x0085, 0x0085, 0x0085, + // Entry 40 - 7F + 0x0085, 0x0090, 0x0090, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, + 0x00a0, 0x00a0, 0x00a8, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00b8, 0x00b8, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00c8, 0x00c8, 0x00cf, 0x00cf, 0x00cf, + 0x00d7, 0x00d7, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, + 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e9, 0x00e9, 0x00f2, + // Entry 80 - BF + 0x00f2, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x0101, 0x0107, 0x0112, + 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, + 0x0112, 0x0112, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, + 0x0121, 0x0121, 0x0128, 0x0128, 0x0128, 0x0132, 0x0132, 0x0132, + 0x0132, 0x0132, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, 0x0143, + 0x0149, 0x0149, 0x0149, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, + 0x0154, 0x015c, 0x015c, 0x0163, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry C0 - FF + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry 100 - 13F + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry 140 - 17F + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry 180 - 1BF + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry 1C0 - 1FF + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0171, + }, + }, + { // sbp + "IshiyakaniIshiyamuhaliIshiyalabuIshibelalusiIshibulugaliaIshibangilaIshi" + + "shekiIshijelumaniIshigilikiIshingelesaIshihisipaniyaIshiajemiIshifal" + + "ansaIshihawusaIshihindiIshihungaliIshihindonesiaIshihigiboIshihitali" + + "yanoIshijapaniIshijavaIshikambodiaIshikoleyaIshimalesiyaIshibulumaIs" + + "hinepaliIshiholansiIshipunjabiIshipolandiIshilenoIshilomaniyaIshilus" + + "iIshinyalwandaIshisomaliIshiswidiIshitamiliIshitayilandiIshitulukiIs" + + "hiyukilaniyaIshiwuludiIshivietinamuIshiyolubaIshishinaIshisuluIshisa" + + "ngu", + []uint16{ // 493 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0016, 0x0016, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x002c, 0x0039, + 0x0039, 0x0039, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, + 0x0044, 0x0044, 0x0044, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, + 0x0059, 0x0059, 0x0059, 0x0059, 0x0063, 0x006e, 0x006e, 0x007c, + 0x007c, 0x007c, 0x0085, 0x0085, 0x0085, 0x0085, 0x0085, 0x0090, + 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x009a, + 0x009a, 0x00a3, 0x00a3, 0x00a3, 0x00a3, 0x00ae, 0x00ae, 0x00ae, + // Entry 40 - 7F + 0x00ae, 0x00bc, 0x00bc, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, + 0x00d4, 0x00d4, 0x00de, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, + 0x00e6, 0x00e6, 0x00f2, 0x00f2, 0x00fc, 0x00fc, 0x00fc, 0x00fc, + 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, + 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, + 0x00fc, 0x00fc, 0x00fc, 0x0108, 0x0108, 0x0112, 0x0112, 0x0112, + 0x011c, 0x011c, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, + 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0132, 0x0132, 0x013d, + // Entry 80 - BF + 0x013d, 0x0145, 0x0145, 0x0145, 0x0145, 0x0151, 0x0159, 0x0166, + 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, + 0x0166, 0x0166, 0x0170, 0x0170, 0x0170, 0x0170, 0x0170, 0x0170, + 0x0179, 0x0179, 0x0183, 0x0183, 0x0183, 0x0190, 0x0190, 0x0190, + 0x0190, 0x0190, 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, 0x01a8, + 0x01b2, 0x01b2, 0x01b2, 0x01bf, 0x01bf, 0x01bf, 0x01bf, 0x01bf, + 0x01bf, 0x01c9, 0x01c9, 0x01d2, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + // Entry C0 - FF + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + // Entry 100 - 13F + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + // Entry 140 - 17F + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + // Entry 180 - 1BF + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + // Entry 1C0 - 1FF + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, 0x01da, + 0x01da, 0x01da, 0x01da, 0x01da, 0x01e3, + }, + }, + { // se + "afrikánsagiellaaragoniagiellaarábagiellavilges-ruoššagiellabulgáriagiell" + + "abengalgiellatibetagiellabretonagiellabosniagiellakatalánagiellacors" + + "icagiellačeahkagiellakymragielladánskkagielladuiskkagielladivehigiel" + + "ladzongkhagiellagreikkagiellaeaŋgalsgiellaspánskkagiellaesttegiellap" + + "ersijagiellasuomagiellafidjigiellafearagiellafránskkagiellaoarjifrii" + + "sagiellaiirragiellagujaratagiellamanksgiellahaussagiellahindigiellak" + + "roátiagiellahaitigiellaungárgiellaarmeenagiellaindonesiagiellaislánd" + + "dagiellaitáliagiellajapánagiellajavagiellageorgiagiellakazakgiellaka" + + "mbodiagiellakoreagiellakurdigiellakomigiellakornagiellaláhtengiellal" + + "uxemburggagiellalaogiellaliettuvagiellalátviagiellamaorigiellamakedo" + + "niagiellamongoliagiellamaltagiellaburmagiellanepaligiellahollánddagi" + + "ellaođđadárogiellagirjedárogiellaoksitánagiellapanjabigiellapolskkag" + + "iellaportugálagiellaromanšgiellaromániagiellaruoššagiellasardigiella" + + "davvisámegiellaslovákiagiellaslovenagiellasamoagiellaalbánagiellaser" + + "biagiellaruoŧagiellaŧaigielladurkagiellatahitigiellaukrainagiellaurd" + + "ugiellavietnamgiellavallonagiellakiinnágiellaacehgiellaboares eaŋgal" + + "asgiellaasturiagiellamarigiellafilippiinnagiellahawaiigiellagárjilgi" + + "ellamokšagiellaersagiellasisiliagiellaselkupagiellalullisámegiellaju" + + "levsámegiellaanárašgiellanuortalašgiellashimaorigiellaudmurtagiellad" + + "ovdameahttun giellakantongiellaserbokroatiagiellaálki kiinágiellaárb" + + "evirolaš kiinnágiella", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0010, 0x0010, 0x001e, + 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x003f, 0x004e, + 0x004e, 0x004e, 0x005a, 0x0066, 0x0073, 0x007f, 0x008e, 0x008e, + 0x008e, 0x009b, 0x009b, 0x00a8, 0x00a8, 0x00a8, 0x00b3, 0x00c1, + 0x00ce, 0x00da, 0x00e8, 0x00e8, 0x00f5, 0x0103, 0x0103, 0x0112, + 0x011d, 0x011d, 0x012a, 0x012a, 0x0135, 0x0140, 0x014b, 0x015a, + 0x016b, 0x0176, 0x0176, 0x0176, 0x0176, 0x0184, 0x018f, 0x019b, + 0x019b, 0x01a6, 0x01a6, 0x01b4, 0x01bf, 0x01cb, 0x01d8, 0x01d8, + // Entry 40 - 7F + 0x01d8, 0x01e7, 0x01e7, 0x01e7, 0x01e7, 0x01e7, 0x01e7, 0x01f6, + 0x0203, 0x0203, 0x0210, 0x021a, 0x0227, 0x0227, 0x0227, 0x0227, + 0x0232, 0x0232, 0x0240, 0x0240, 0x024b, 0x024b, 0x024b, 0x0256, + 0x0260, 0x026b, 0x026b, 0x0278, 0x0289, 0x0289, 0x0289, 0x0289, + 0x0292, 0x02a0, 0x02a0, 0x02ad, 0x02ad, 0x02ad, 0x02b8, 0x02c7, + 0x02c7, 0x02d5, 0x02d5, 0x02d5, 0x02e0, 0x02eb, 0x02eb, 0x02eb, + 0x02f7, 0x02f7, 0x0307, 0x0318, 0x0328, 0x0328, 0x0328, 0x0328, + 0x0337, 0x0337, 0x0337, 0x0337, 0x0337, 0x0344, 0x0344, 0x0351, + // Entry 80 - BF + 0x0351, 0x0361, 0x0361, 0x036e, 0x036e, 0x037c, 0x038a, 0x038a, + 0x038a, 0x0395, 0x0395, 0x03a5, 0x03a5, 0x03a5, 0x03b4, 0x03c1, + 0x03cc, 0x03cc, 0x03cc, 0x03d9, 0x03e5, 0x03e5, 0x03e5, 0x03e5, + 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03f1, 0x03fb, 0x03fb, 0x03fb, + 0x03fb, 0x03fb, 0x0406, 0x0406, 0x0406, 0x0412, 0x0412, 0x041f, + 0x0429, 0x0429, 0x0429, 0x0436, 0x0436, 0x0443, 0x0443, 0x0443, + 0x0443, 0x0443, 0x0443, 0x0450, 0x0450, 0x045a, 0x045a, 0x045a, + 0x045a, 0x045a, 0x045a, 0x045a, 0x045a, 0x045a, 0x045a, 0x045a, + // Entry C0 - FF + 0x045a, 0x045a, 0x0470, 0x0470, 0x0470, 0x0470, 0x0470, 0x0470, + 0x0470, 0x0470, 0x0470, 0x0470, 0x0470, 0x0470, 0x047d, 0x047d, + 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, + 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, + 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, + 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, + 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, 0x047d, + 0x047d, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, + // Entry 100 - 13F + 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, + 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, + 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, + 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0487, 0x0498, + 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, + 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, + 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, + 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, 0x0498, + // Entry 140 - 17F + 0x0498, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, + 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, + 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, + 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, + 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, + 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, 0x04a4, + 0x04a4, 0x04a4, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, + 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, + // Entry 180 - 1BF + 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, + 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, + 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04b1, 0x04bd, + 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, + 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, + 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04bd, 0x04c7, 0x04c7, 0x04c7, + 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, + 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, + // Entry 1C0 - 1FF + 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, + 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, + 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, + 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, + 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, + 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04d4, 0x04d4, 0x04d4, + 0x04d4, 0x04d4, 0x04d4, 0x04d4, 0x04e1, 0x04e1, 0x04e1, 0x04e1, + 0x04e1, 0x04e1, 0x04e1, 0x04e1, 0x04e1, 0x04e1, 0x04f1, 0x0501, + // Entry 200 - 23F + 0x050f, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, + 0x051f, 0x051f, 0x051f, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, + 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, + 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, + 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, 0x052d, + 0x052d, 0x053a, 0x053a, 0x053a, 0x054e, 0x054e, 0x054e, 0x054e, + 0x054e, 0x054e, 0x054e, 0x054e, 0x054e, 0x054e, 0x054e, 0x054e, + 0x054e, 0x054e, 0x054e, 0x054e, 0x054e, 0x054e, 0x054e, 0x054e, + // Entry 240 - 27F + 0x054e, 0x054e, 0x054e, 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, + 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, + 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, + 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, 0x055a, 0x056c, + 0x057e, 0x0599, + }, + }, + { // se-FI + "vilgesruoššagiellabengalagiellafižigiellaarmenagiellakazakhgiellakamboža" + + "giellanepalagiellapanjabagiellathaigiellavietnamagiellaačehgiellakom" + + "oragiellastandárda arábagiellanuortariikkalaš duiskkagiellašveicalaš" + + " duiskkagiellaaustrálialaš eaŋgalsgiellakanádalaš eaŋgalsgiellabriht" + + "talaš eaŋgalsgiellaamerihkálaš eaŋgalsgiellalatiinna-amerihkalaš spá" + + "nskkagiellaespánjalaš spánskkagiellameksikolaš spánskkagiellakanádal" + + "aš fránskkagiellašveicalaš fránskkagiellabelgialaš hollánddagiellabr" + + "asilialaš portugálagiellaportugálalaš portugálagiellamoldávialaš rom" + + "ániagiellaálkes kiinnágiella", + []uint16{ // 609 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0014, 0x0014, + 0x0014, 0x0014, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, + 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, + 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, + 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x002c, 0x002c, 0x002c, + 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, + 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x0038, 0x0038, + // Entry 40 - 7F + 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, + 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, + 0x0044, 0x0044, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, + 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, + 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, + 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, + 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, + 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x006b, 0x006b, 0x006b, + // Entry 80 - BF + 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, + 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, + 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, + 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x0075, 0x0075, 0x0075, + 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, + 0x0075, 0x0075, 0x0075, 0x0083, 0x0083, 0x0083, 0x0083, 0x0083, + 0x0083, 0x0083, 0x0083, 0x0083, 0x0083, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + // Entry C0 - FF + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + // Entry 100 - 13F + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + // Entry 140 - 17F + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + // Entry 180 - 1BF + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + // Entry 1C0 - 1FF + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + // Entry 200 - 23F + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, + 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, + 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, + 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, + 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, + 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, + 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, + // Entry 240 - 27F + 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, + 0x009a, 0x009a, 0x009a, 0x009a, 0x00b1, 0x00b1, 0x00cf, 0x00e8, + 0x0105, 0x011f, 0x0139, 0x0155, 0x017a, 0x0196, 0x01b1, 0x01b1, + 0x01cc, 0x01e7, 0x01e7, 0x0202, 0x021f, 0x023e, 0x025a, 0x025a, + 0x026e, + }, + }, + { // seh + "akanamáricoárabebielo-russobúlgarobengalitchecoalemãogregoinglêsespanhol" + + "persafrancêshausahindihúngaroindonésioiboitalianojaponêsjavanêscmerc" + + "oreanomalaiobirmanêsnepalêsholandêspanjabipolonêsportuguêsromenoruss" + + "okinyarwandasomalisuecotâmiltailandêsturcoucranianourduvietnamitaior" + + "ubáchinêszulusena", + []uint16{ // 499 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000c, 0x000c, + 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x001d, 0x0025, + 0x0025, 0x0025, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, + 0x002c, 0x002c, 0x002c, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0039, 0x0039, 0x0039, 0x0039, 0x003e, 0x0045, 0x0045, 0x004d, + 0x004d, 0x004d, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x005a, + 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005f, + 0x005f, 0x0064, 0x0064, 0x0064, 0x0064, 0x006c, 0x006c, 0x006c, + // Entry 40 - 7F + 0x006c, 0x0076, 0x0076, 0x0079, 0x0079, 0x0079, 0x0079, 0x0079, + 0x0081, 0x0081, 0x0089, 0x0091, 0x0091, 0x0091, 0x0091, 0x0091, + 0x0091, 0x0091, 0x0095, 0x0095, 0x009c, 0x009c, 0x009c, 0x009c, + 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, + 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, + 0x009c, 0x009c, 0x009c, 0x00a2, 0x00a2, 0x00ab, 0x00ab, 0x00ab, + 0x00b3, 0x00b3, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, + 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00bc, 0x00c3, 0x00c3, 0x00cb, + // Entry 80 - BF + 0x00cb, 0x00d5, 0x00d5, 0x00d5, 0x00d5, 0x00db, 0x00e0, 0x00eb, + 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, + 0x00eb, 0x00eb, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, + 0x00f6, 0x00f6, 0x00fc, 0x00fc, 0x00fc, 0x0106, 0x0106, 0x0106, + 0x0106, 0x0106, 0x010b, 0x010b, 0x010b, 0x010b, 0x010b, 0x0114, + 0x0118, 0x0118, 0x0118, 0x0122, 0x0122, 0x0122, 0x0122, 0x0122, + 0x0122, 0x0129, 0x0129, 0x0130, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + // Entry C0 - FF + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + // Entry 100 - 13F + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + // Entry 140 - 17F + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + // Entry 180 - 1BF + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + // Entry 1C0 - 1FF + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x0138, + }, + }, + { // ses + "Akan senniAmhaarik senniLaaraw senniBelaruus senniBulagaari senniBengali" + + " senniCek senniAlmaŋ senniGrek senniInglisi senniEspaaɲe senniFarsi " + + "senniFransee senniHawsance senniInduu senniHungaari senniIndoneesi s" + + "enniIboo senniItaali senniJaponee senniJavanee senniKmeer senniKoree" + + " senniMaleezi senniBurme senniNeepal senniHolandee senniPunjaabi sen" + + "niiPolonee senniPortugee senniRumaani senniRuusi senniRwanda senniSo" + + "maali senniSuweede senniTamil senniTaailandu senniTurku senniUkreen " + + "senniUrdu senniVietnaam senniYorbance senniSinuwa senni, MandareŋZul" + + "u senniKoyraboro senni", + []uint16{ // 502 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0018, 0x0018, + 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0032, 0x0041, + 0x0041, 0x0041, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, + 0x004e, 0x004e, 0x004e, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0063, 0x0063, 0x0063, 0x0063, 0x006d, 0x007a, 0x007a, 0x0088, + 0x0088, 0x0088, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x00a0, + 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00ae, + 0x00ae, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00c7, 0x00c7, 0x00c7, + // Entry 40 - 7F + 0x00c7, 0x00d6, 0x00d6, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, + 0x00ec, 0x00ec, 0x00f9, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, + 0x0106, 0x0106, 0x0111, 0x0111, 0x011c, 0x011c, 0x011c, 0x011c, + 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, + 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, + 0x011c, 0x011c, 0x011c, 0x0129, 0x0129, 0x0134, 0x0134, 0x0134, + 0x0140, 0x0140, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, + 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x015d, 0x015d, 0x016a, + // Entry 80 - BF + 0x016a, 0x0178, 0x0178, 0x0178, 0x0178, 0x0185, 0x0190, 0x019c, + 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, + 0x019c, 0x019c, 0x01a9, 0x01a9, 0x01a9, 0x01a9, 0x01a9, 0x01a9, + 0x01b6, 0x01b6, 0x01c1, 0x01c1, 0x01c1, 0x01d0, 0x01d0, 0x01d0, + 0x01d0, 0x01d0, 0x01db, 0x01db, 0x01db, 0x01db, 0x01db, 0x01e7, + 0x01f1, 0x01f1, 0x01f1, 0x01ff, 0x01ff, 0x01ff, 0x01ff, 0x01ff, + 0x01ff, 0x020d, 0x020d, 0x0224, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + // Entry C0 - FF + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + // Entry 100 - 13F + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + // Entry 140 - 17F + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + // Entry 180 - 1BF + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + // Entry 1C0 - 1FF + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, + 0x022e, 0x022e, 0x022e, 0x022e, 0x022e, 0x023d, + }, + }, + { // sg + "AkâanAmarîkiArâboBielörûsiBulugäriBengäliTyêkiZâmaniGerêkiAnglëeEspanyöl" + + "FarsîFarânziHaüsäHîndiHongruäaEnndonezïiÏgböÊnndeZaponëeZavanëeKmêre" + + "KoreyëenMalëeMiamära, BirimäniNepalëeHolandëePenzäbïPolonëePortugëe," + + " PûraRumëenRûsiRuandäaSängöSomalïiSueduäaTämûliThâiTûrûkuUkrêniÛrduV" + + "ietnämYorubaShinuäaZûlu", + []uint16{ // 181 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, + 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x001f, 0x0028, + 0x0028, 0x0028, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0030, 0x0030, 0x0030, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x003d, 0x003d, 0x003d, 0x003d, 0x0044, 0x004b, 0x004b, 0x0054, + 0x0054, 0x0054, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x0062, + 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0069, + 0x0069, 0x006f, 0x006f, 0x006f, 0x006f, 0x0078, 0x0078, 0x0078, + // Entry 40 - 7F + 0x0078, 0x0083, 0x0083, 0x0089, 0x0089, 0x0089, 0x0089, 0x0089, + 0x008f, 0x008f, 0x0097, 0x009f, 0x009f, 0x009f, 0x009f, 0x009f, + 0x009f, 0x009f, 0x00a5, 0x00a5, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00ae, 0x00b4, 0x00b4, 0x00c7, 0x00c7, 0x00c7, + 0x00cf, 0x00cf, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, + 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00e1, 0x00e1, 0x00e9, + // Entry 80 - BF + 0x00e9, 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x0100, 0x0105, 0x010d, + 0x010d, 0x010d, 0x010d, 0x010d, 0x0114, 0x0114, 0x0114, 0x0114, + 0x0114, 0x0114, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, + 0x0124, 0x0124, 0x012c, 0x012c, 0x012c, 0x0131, 0x0131, 0x0131, + 0x0131, 0x0131, 0x0139, 0x0139, 0x0139, 0x0139, 0x0139, 0x0140, + 0x0145, 0x0145, 0x0145, 0x014d, 0x014d, 0x014d, 0x014d, 0x014d, + 0x014d, 0x0153, 0x0153, 0x015b, 0x0160, + }, + }, + { // shi + "ⵜⴰⴽⴰⵏⵜⵜⴰⵎⵀⴰⵔⵉⵜⵜⴰⵄⵔⴰⴱⵜⵜⴰⴱⵉⵍⴰⵔⵓⵙⵜⵜⴰⴱⵍⵖⴰⵔⵉⵜⵜⴰⴱⵏⵖⴰⵍⵉⵜⵜⴰⵜⵛⵉⴽⵉⵜⵜⴰⵍⵉⵎⴰⵏⵜⵜⴰⴳⵔⵉⴳⵉ" + + "ⵜⵜⴰⵏⴳⵍⵉⵣⵜⵜⴰⵙⴱⵏⵢⵓⵍⵉⵜⵜⴰⴼⵓⵔⵙⵉⵜⵜⴰⴼⵔⴰⵏⵙⵉⵙⵜⵜⴰⵀⴰⵡⵙⴰⵜⵜⴰⵀⵉⵏⴷⵉⵜⵜⴰⵀⵏⵖⴰⵔⵉⵜⵜⴰⵏⴷ" + + "ⵓⵏⵉⵙⵉⵜⵜⵉⴳⴱⵓⵜⵜⴰⵟⴰⵍⵢⴰⵏⵜⵜⴰⵊⴰⴱⴱⵓⵏⵉⵜⵜⴰⵊⴰⴼⴰⵏⵉⵜⵜⴰⵅⵎⵉⵔⵜⵜⴰⴽⵓⵔⵉⵜⵜⴰⵎⴰⵍⴰⵡⵉⵜⵜⴰⴱ" + + "ⵉⵔⵎⴰⵏⵉⵜⵜⴰⵏⵉⴱⴰⵍⵉⵜⵜⴰⵀⵓⵍⴰⵏⴷⵉⵜⵜⴰⴱⵏⵊⴰⴱⵉⵜⵜⴰⴱⵓⵍⵓⵏⵉⵜⵜⴰⴱⵕⵟⵇⵉⵣⵜⵜⴰⵔⵓⵎⴰⵏⵉⵜⵜⴰⵔⵓ" + + "ⵙⵉⵜⵜⴰⵔⵓⵡⴰⵏⴷⵉⵜⵜⴰⵙⵓⵎⴰⵍⵉⵜⵜⴰⵙⵡⵉⴷⵉⵜⵜⴰⵜⴰⵎⵉⵍⵜⵜⴰⵜⴰⵢⵍⴰⵏⴷⵉⵜⵜⴰⵜⵓⵔⴽⵉⵜⵜⵓⴽⵔⴰⵏⵉⵜⵜ" + + "ⵓⵔⴷⵓⵜⵜⴰⴼⵉⵜⵏⴰⵎⵉⵜⵜⴰⵢⵔⵓⴱⴰⵜⵜⴰⵛⵉⵏⵡⵉⵜⵜⴰⵣⵓⵍⵓⵜⵜⴰⵛⵍⵃⵉⵜ", + []uint16{ // 505 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x002a, 0x002a, + 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x005d, 0x0078, + 0x0078, 0x0078, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, + 0x0093, 0x0093, 0x0093, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, + 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00db, 0x00f3, 0x00f3, 0x0111, + 0x0111, 0x0111, 0x0129, 0x0129, 0x0129, 0x0129, 0x0129, 0x0147, + 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x015f, + 0x015f, 0x0177, 0x0177, 0x0177, 0x0177, 0x0192, 0x0192, 0x0192, + // Entry 40 - 7F + 0x0192, 0x01b0, 0x01b0, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, + 0x01dd, 0x01dd, 0x01fb, 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, + 0x0216, 0x0216, 0x022b, 0x022b, 0x0240, 0x0240, 0x0240, 0x0240, + 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, + 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, + 0x0240, 0x0240, 0x0240, 0x025b, 0x025b, 0x0279, 0x0279, 0x0279, + 0x0294, 0x0294, 0x02b2, 0x02b2, 0x02b2, 0x02b2, 0x02b2, 0x02b2, + 0x02b2, 0x02b2, 0x02b2, 0x02b2, 0x02b2, 0x02cd, 0x02cd, 0x02e8, + // Entry 80 - BF + 0x02e8, 0x0303, 0x0303, 0x0303, 0x0303, 0x031e, 0x0333, 0x0351, + 0x0351, 0x0351, 0x0351, 0x0351, 0x0351, 0x0351, 0x0351, 0x0351, + 0x0351, 0x0351, 0x036c, 0x036c, 0x036c, 0x036c, 0x036c, 0x036c, + 0x0384, 0x0384, 0x039c, 0x039c, 0x039c, 0x03bd, 0x03bd, 0x03bd, + 0x03bd, 0x03bd, 0x03d5, 0x03d5, 0x03d5, 0x03d5, 0x03d5, 0x03ed, + 0x03ff, 0x03ff, 0x03ff, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, + 0x041d, 0x0435, 0x0435, 0x044d, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + // Entry C0 - FF + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + // Entry 100 - 13F + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + // Entry 140 - 17F + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + // Entry 180 - 1BF + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + // Entry 1C0 - 1FF + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0477, + }, + }, + { // shi-Latn + "TakantTamharitTaɛrabtTabilarustTablɣaritTabnɣalitTatcikitTalimantTagrigi" + + "tTangliztTasbnyulitTafursitTafransistTahawsatTahinditTahnɣaritTandun" + + "isitTigbutTaṭalyantTajabbunitTajavanitTaxmirtTakuritTamalawitTabirma" + + "nitTanibalitTahulanditTabnjabitTabulunitTabṛṭqiztTarumanitTarusitTar" + + "uwanditTasumalitTaswiditTatamiltTataylanditTaturkitTukranitTurdutTaf" + + "itnamitTayrubatTacinwitTazulutTashelḥiyt", + []uint16{ // 505 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, + 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0020, 0x002a, + 0x002a, 0x002a, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, + 0x0034, 0x0034, 0x0034, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x0044, 0x0044, 0x0044, 0x0044, 0x004c, 0x0054, 0x0054, 0x005e, + 0x005e, 0x005e, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0070, + 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0078, + 0x0078, 0x0080, 0x0080, 0x0080, 0x0080, 0x008a, 0x008a, 0x008a, + // Entry 40 - 7F + 0x008a, 0x0094, 0x0094, 0x009a, 0x009a, 0x009a, 0x009a, 0x009a, + 0x00a5, 0x00a5, 0x00af, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, + 0x00b8, 0x00b8, 0x00bf, 0x00bf, 0x00c6, 0x00c6, 0x00c6, 0x00c6, + 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, + 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, + 0x00c6, 0x00c6, 0x00c6, 0x00cf, 0x00cf, 0x00d9, 0x00d9, 0x00d9, + 0x00e2, 0x00e2, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, + 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00ec, 0x00f5, 0x00f5, 0x00fe, + // Entry 80 - BF + 0x00fe, 0x010b, 0x010b, 0x010b, 0x010b, 0x0114, 0x011b, 0x0125, + 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, 0x0125, + 0x0125, 0x0125, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x0136, 0x0136, 0x013e, 0x013e, 0x013e, 0x0149, 0x0149, 0x0149, + 0x0149, 0x0149, 0x0151, 0x0151, 0x0151, 0x0151, 0x0151, 0x0159, + 0x015f, 0x015f, 0x015f, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0171, 0x0171, 0x0179, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + // Entry C0 - FF + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + // Entry 100 - 13F + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + // Entry 140 - 17F + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + // Entry 180 - 1BF + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + // Entry 1C0 - 1FF + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x018c, + }, + }, + { // si + siLangStr, + siLangIdx, + }, + { // sk + skLangStr, + skLangIdx, + }, + { // sl + slLangStr, + slLangIdx, + }, + { // smn + "arabiakielâvielgisruošâkielâbulgariakielâtšeekikielâkirkkoslaavitanskaki" + + "elâsaksakielâkreikakielâengâlâskielâespanjakielâeestikielâsuomâkielâ" + + "ranskakielâiirikielâhepreakielâkroatiakielâuŋgarkielâarmeniakielâisl" + + "andkielâitaliakielâjaapaankielâkurdikielâkomikielâläättinkielâlatvia" + + "kielâmaorikielâmakedoniakielâmongoliakielâneepaalkielâhollandkielâtá" + + "rukielâ nynorsktárukielâpuolakielâportugalkielâromaniakielâruošâkiel" + + "âsanskritkielâtavesämikielâsloveniakielâserbiakielâruotâkielâturkki" + + "kielâukrainakielâvietnamkielâkiinakielâainukielâmarikielâtoovláškrei" + + "kakielâmokšâkielâviestârmarikielâtoovláštárukielâroomaankielâmaadâsä" + + "mikielâjuulevsämikielâanarâškielânuorttâlâškielâudmurtkielâvepsäkiel" + + "âkantonkiinakielâNuorttâriijkâ saksakielâAustralia engâlâskielâKana" + + "da engâlâskielâoovtâkiärdánis kiinakielâärbivuáválâš kiinakielâ", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x0020, 0x002e, + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x003b, 0x0047, 0x0047, 0x0047, 0x0053, + 0x005e, 0x005e, 0x005e, 0x005e, 0x006a, 0x0079, 0x0079, 0x0086, + 0x0091, 0x0091, 0x0091, 0x0091, 0x009d, 0x009d, 0x009d, 0x00a9, + 0x00a9, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, 0x00b3, + 0x00bf, 0x00bf, 0x00bf, 0x00cc, 0x00cc, 0x00d8, 0x00e5, 0x00e5, + // Entry 40 - 7F + 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00f1, + 0x00fd, 0x00fd, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, + 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x0115, + 0x011f, 0x011f, 0x011f, 0x012e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x013a, 0x013a, 0x013a, 0x0145, 0x0154, + 0x0154, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, + 0x016f, 0x016f, 0x017c, 0x018f, 0x019a, 0x019a, 0x019a, 0x019a, + 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, 0x019a, 0x01a5, + // Entry 80 - BF + 0x01a5, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01c0, 0x01cd, 0x01cd, + 0x01db, 0x01db, 0x01db, 0x01ea, 0x01ea, 0x01ea, 0x01ea, 0x01f8, + 0x01f8, 0x01f8, 0x01f8, 0x01f8, 0x0204, 0x0204, 0x0204, 0x0204, + 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, 0x0210, + 0x0210, 0x0210, 0x021c, 0x021c, 0x021c, 0x021c, 0x021c, 0x0229, + 0x0229, 0x0229, 0x0229, 0x0236, 0x0236, 0x0236, 0x0236, 0x0236, + 0x0236, 0x0236, 0x0236, 0x0241, 0x0241, 0x0241, 0x0241, 0x0241, + 0x0241, 0x0241, 0x0241, 0x0241, 0x024b, 0x024b, 0x024b, 0x024b, + // Entry C0 - FF + 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, + 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, + 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, + 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, + 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, + 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, + 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, 0x024b, + 0x024b, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, + // Entry 100 - 13F + 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, + 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, + 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, + 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, + 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, + 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, + 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, + 0x0255, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, + // Entry 140 - 17F + 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, + 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, + 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, + 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, + 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, + 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, + 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, + 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, + // Entry 180 - 1BF + 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, + 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, + 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x0277, + 0x0277, 0x0277, 0x0277, 0x0277, 0x0277, 0x0277, 0x0277, 0x0277, + 0x0277, 0x0277, 0x0277, 0x0277, 0x0277, 0x0289, 0x0289, 0x0289, + 0x0289, 0x0289, 0x0289, 0x0289, 0x0289, 0x0289, 0x0289, 0x0289, + 0x0289, 0x0289, 0x0289, 0x0289, 0x0289, 0x0289, 0x0289, 0x0289, + 0x0289, 0x0289, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, + // Entry 1C0 - 1FF + 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, + 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, + 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, + 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x029d, 0x02aa, 0x02aa, + 0x02aa, 0x02aa, 0x02aa, 0x02aa, 0x02aa, 0x02aa, 0x02aa, 0x02aa, + 0x02aa, 0x02aa, 0x02aa, 0x02aa, 0x02aa, 0x02aa, 0x02aa, 0x02aa, + 0x02aa, 0x02aa, 0x02aa, 0x02aa, 0x02aa, 0x02aa, 0x02aa, 0x02aa, + 0x02aa, 0x02aa, 0x02aa, 0x02aa, 0x02aa, 0x02aa, 0x02bb, 0x02cc, + // Entry 200 - 23F + 0x02da, 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, + 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, + 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, + 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, + 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, 0x02ed, + 0x02ed, 0x02f9, 0x02f9, 0x02f9, 0x02f9, 0x02f9, 0x02f9, 0x0305, + 0x0305, 0x0305, 0x0305, 0x0305, 0x0305, 0x0305, 0x0305, 0x0305, + 0x0305, 0x0305, 0x0305, 0x0305, 0x0305, 0x0305, 0x0305, 0x0305, + // Entry 240 - 27F + 0x0305, 0x0305, 0x0305, 0x0316, 0x0316, 0x0316, 0x0316, 0x0316, + 0x0316, 0x0316, 0x0316, 0x0316, 0x0316, 0x0316, 0x0331, 0x0331, + 0x034a, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, + 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, 0x0360, + 0x037d, 0x039a, + }, + }, + { // sn + "chiAkanichiAmaricchiArabuchiBelarusichiBulgarianchiBengalichiCzechchiJer" + + "imanichiGreekChirunguchiSpanishchiPeshiyachiFurenchichiHausachiHindi" + + "chiHungarichiIndonesiachiIgbochiTarianachiJapanichiJavachiKhemachiKo" + + "riachiMalaychiBurmachiNepalichiDutchchiPunjabichiPolishchiPutukezich" + + "iRomanianchiRashiyachiRwandachiShonachiSomalichiSwedishchiTamilchiTh" + + "aichiTurkishchiUkreniachiUrduchiVietnamchiYorubachiChinesechiZulu", + []uint16{ // 181 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0011, 0x0011, + 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0024, 0x0030, + 0x0030, 0x0030, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, + 0x003a, 0x003a, 0x003a, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, + 0x004d, 0x004d, 0x004d, 0x004d, 0x0055, 0x005d, 0x005d, 0x0067, + 0x0067, 0x0067, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x007c, + 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x0084, + 0x0084, 0x008c, 0x008c, 0x008c, 0x008c, 0x0096, 0x0096, 0x0096, + // Entry 40 - 7F + 0x0096, 0x00a2, 0x00a2, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, + 0x00b3, 0x00b3, 0x00bc, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, + 0x00c3, 0x00c3, 0x00cb, 0x00cb, 0x00d3, 0x00d3, 0x00d3, 0x00d3, + 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, + 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, + 0x00d3, 0x00d3, 0x00d3, 0x00db, 0x00db, 0x00e3, 0x00e3, 0x00e3, + 0x00ec, 0x00ec, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, + 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00fe, 0x00fe, 0x0107, + // Entry 80 - BF + 0x0107, 0x0112, 0x0112, 0x0112, 0x0112, 0x011d, 0x0127, 0x0130, + 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, + 0x0130, 0x0138, 0x0141, 0x0141, 0x0141, 0x0141, 0x0141, 0x0141, + 0x014b, 0x014b, 0x0153, 0x0153, 0x0153, 0x015a, 0x015a, 0x015a, + 0x015a, 0x015a, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x016e, + 0x0175, 0x0175, 0x0175, 0x017f, 0x017f, 0x017f, 0x017f, 0x017f, + 0x017f, 0x0188, 0x0188, 0x0192, 0x0199, + }, + }, + { // so + "AkanAxmaariCarabiBeleruusiyaanBulgeeriyaanBangaaliJeegJarmalGiriikIngiri" + + "isiIsbaanishFaarisiFaransiisFiriisiyan GalbeedHawsaHindiHangariyaanI" + + "ndunuusiyaanIgboTalyaaniJabbaaniisJafaaniisKamboodhianKuuriyaanMalaa" + + "yBurmeseNebaaliHolandaysBunjaabiBoolishBoortaqiisRomankaRuushRwandaS" + + "oomaaliSwiidhisTamiilTaaylandaysTurkishYukreeniyaanUrduuFiitnaamaysY" + + "oruubaJayniisZuulu", + []uint16{ // 181 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x000b, 0x000b, + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x001e, 0x002a, + 0x002a, 0x002a, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, 0x0032, + 0x0032, 0x0032, 0x0032, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x003c, 0x003c, 0x003c, 0x003c, 0x0042, 0x004b, 0x004b, 0x0054, + 0x0054, 0x0054, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x0064, + 0x0076, 0x0076, 0x0076, 0x0076, 0x0076, 0x0076, 0x0076, 0x007b, + 0x007b, 0x0080, 0x0080, 0x0080, 0x0080, 0x008b, 0x008b, 0x008b, + // Entry 40 - 7F + 0x008b, 0x0098, 0x0098, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, + 0x00a4, 0x00a4, 0x00ae, 0x00b7, 0x00b7, 0x00b7, 0x00b7, 0x00b7, + 0x00b7, 0x00b7, 0x00c2, 0x00c2, 0x00cb, 0x00cb, 0x00cb, 0x00cb, + 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, + 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, 0x00cb, + 0x00cb, 0x00cb, 0x00cb, 0x00d1, 0x00d1, 0x00d8, 0x00d8, 0x00d8, + 0x00df, 0x00df, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, + 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00f0, 0x00f0, 0x00f7, + // Entry 80 - BF + 0x00f7, 0x0101, 0x0101, 0x0101, 0x0101, 0x0108, 0x010d, 0x0113, + 0x0113, 0x0113, 0x0113, 0x0113, 0x0113, 0x0113, 0x0113, 0x0113, + 0x0113, 0x0113, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, 0x011b, + 0x0123, 0x0123, 0x0129, 0x0129, 0x0129, 0x0134, 0x0134, 0x0134, + 0x0134, 0x0134, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x0147, + 0x014c, 0x014c, 0x014c, 0x0157, 0x0157, 0x0157, 0x0157, 0x0157, + 0x0157, 0x015e, 0x015e, 0x0165, 0x016a, + }, + }, + { // sq + sqLangStr, + sqLangIdx, + }, + { // sr + srLangStr, + srLangIdx, + }, + { // sr-Latn + srLatnLangStr, + srLatnLangIdx, + }, + { // sv + svLangStr, + svLangIdx, + }, + { // sv-FI + "kirgiziska", + []uint16{ // 91 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x000a, + }, + }, + { // sw + swLangStr, + swLangIdx, + }, + { // sw-CD + "KiakanKibanglaKicheckiKingerezaKiswahili ya Kongo", + []uint16{ // 525 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, + 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + // Entry 40 - 7F + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + // Entry 80 - BF + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + // Entry C0 - FF + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + // Entry 100 - 13F + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + // Entry 140 - 17F + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + // Entry 180 - 1BF + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + // Entry 1C0 - 1FF + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + // Entry 200 - 23F + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x0031, + }, + }, + { // ta + taLangStr, + taLangIdx, + }, + { // te + teLangStr, + teLangIdx, + }, + { // teo + "KiakanKiamhariKiarabuKibelarusiKibulgariaKibanglaKicheckiKijerumaniKigir" + + "ikiKingerezaKihispaniaKiajemiKifaransaKihausaKihindiKihungariKiindon" + + "esiaKiigboKiitalianoKijapaniKijavaKikambodiaKikoreaKimalesiaKiburmaK" + + "inepaliKiholanziKipunjabiKipolandiKirenoKiromaniaKirusiKinyarwandaKi" + + "somaliKiswidiKitamilKitailandiKiturukiKiukraniaKiurduKivietinamuKiyo" + + "rubaKichinaKizuluKiteso", + []uint16{ // 531 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000e, 0x000e, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x0029, + 0x0029, 0x0029, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, + 0x0031, 0x0031, 0x0031, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, + 0x0043, 0x0043, 0x0043, 0x0043, 0x004b, 0x0054, 0x0054, 0x005e, + 0x005e, 0x005e, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x006e, + 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x006e, 0x0075, + 0x0075, 0x007c, 0x007c, 0x007c, 0x007c, 0x0085, 0x0085, 0x0085, + // Entry 40 - 7F + 0x0085, 0x0090, 0x0090, 0x0096, 0x0096, 0x0096, 0x0096, 0x0096, + 0x00a0, 0x00a0, 0x00a8, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00b8, 0x00b8, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00bf, 0x00c8, 0x00c8, 0x00cf, 0x00cf, 0x00cf, + 0x00d7, 0x00d7, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, + 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e9, 0x00e9, 0x00f2, + // Entry 80 - BF + 0x00f2, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x0101, 0x0107, 0x0112, + 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, + 0x0112, 0x0112, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, + 0x0121, 0x0121, 0x0128, 0x0128, 0x0128, 0x0132, 0x0132, 0x0132, + 0x0132, 0x0132, 0x013a, 0x013a, 0x013a, 0x013a, 0x013a, 0x0143, + 0x0149, 0x0149, 0x0149, 0x0154, 0x0154, 0x0154, 0x0154, 0x0154, + 0x0154, 0x015c, 0x015c, 0x0163, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry C0 - FF + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry 100 - 13F + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry 140 - 17F + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry 180 - 1BF + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry 1C0 - 1FF + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry 200 - 23F + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + 0x0169, 0x0169, 0x016f, + }, + }, + { // th + thLangStr, + thLangIdx, + }, + { // ti + "አፍሪቃንሰኛትዊአምሐረኛዓረበኛአዜርባይጃንኛቤላራሻኛቡልጋሪኛበንጋሊኛብሬቶንቦስኒያንካታላንቼክኛወልሽዴኒሽጀርመንግሪከኛእ" + + "ንግሊዝኛኤስፐራንቶስፓኒሽኤስቶኒአንባስክኛፐርሲያኛፊኒሽፋሮኛፈረንሳይኛፍሪሰኛአይሪሽእስኮትስ ጌልክኛጋለቪኛጓራ" + + "ኒጉጃራቲኛዕብራስጥሕንደኛክሮሽያንኛሀንጋሪኛኢንቴር ቋንቋእንዶኑሲኛአይስላንደኛጣሊያንኛጃፓንኛጃቫንኛጊዮርጊያኛ" + + "ካማደኛኮሪያኛኩርድሽኪሩጋዚላቲንኛሊቱአኒየንላቲቪያንማክዶኒኛማላያላምኛማራቲኛማላይኛማልቲስኛኔፖሊኛደችኖርዌይኛ" + + " (ናይ ኝኖርስክ)ኖርዌጂያንኦኪታንኛኦሪያፑንጃቢኛፖሊሽፓሽቶፖርቱጋሊኛሮማኒያንራሽኛስንሃልኛስሎቨክኛስቁቪኛአልቤኒ" + + "ኛሰርቢኛሰሴቶሱዳንኛስዊድንኛሰዋሂሊኛታሚልኛተሉጉኛታይኛትግርኛናይ ቱርኪ ሰብዓይ (ቱርካዊ)ቱርከኛዩክረኒኛኡር" + + "ዱኛኡዝበክኛቪትናምኛዞሳኛዪዲሽዙሉኛታጋሎገኛክሊንግኦንኛፖርቱጋልኛ (ናይ ብራዚል)ፖርቱጋልኛ (ናይ ፖርቱጋል)" + + "ሰርቦ- ክሮዊታን", + []uint16{ // 608 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0015, 0x001b, 0x002a, 0x002a, + 0x0036, 0x0036, 0x0036, 0x0036, 0x004e, 0x004e, 0x005d, 0x006c, + 0x006c, 0x006c, 0x007b, 0x007b, 0x0087, 0x0096, 0x00a2, 0x00a2, + 0x00a2, 0x00a2, 0x00a2, 0x00ab, 0x00ab, 0x00ab, 0x00b4, 0x00bd, + 0x00c9, 0x00c9, 0x00c9, 0x00c9, 0x00d5, 0x00e7, 0x00f9, 0x0105, + 0x0117, 0x0123, 0x0132, 0x0132, 0x013b, 0x013b, 0x0144, 0x0156, + 0x0162, 0x016e, 0x018a, 0x0196, 0x019f, 0x01ae, 0x01ae, 0x01ae, + 0x01bd, 0x01c9, 0x01c9, 0x01db, 0x01db, 0x01ea, 0x01ea, 0x01ea, + // Entry 40 - 7F + 0x0200, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0212, 0x0227, + 0x0236, 0x0236, 0x0242, 0x024e, 0x0260, 0x0260, 0x0260, 0x0260, + 0x0260, 0x0260, 0x0260, 0x026c, 0x0278, 0x0278, 0x0278, 0x0284, + 0x0284, 0x0284, 0x0290, 0x029c, 0x029c, 0x029c, 0x029c, 0x029c, + 0x029c, 0x02ae, 0x02ae, 0x02bd, 0x02bd, 0x02bd, 0x02bd, 0x02cc, + 0x02de, 0x02de, 0x02ea, 0x02f6, 0x0305, 0x0305, 0x0305, 0x0305, + 0x0311, 0x0311, 0x0317, 0x033f, 0x0351, 0x0351, 0x0351, 0x0351, + 0x0360, 0x0360, 0x0360, 0x0369, 0x0369, 0x0378, 0x0378, 0x0381, + // Entry 80 - BF + 0x038a, 0x039c, 0x039c, 0x039c, 0x039c, 0x03ab, 0x03b4, 0x03b4, + 0x03b4, 0x03b4, 0x03b4, 0x03b4, 0x03b4, 0x03c3, 0x03d2, 0x03de, + 0x03de, 0x03de, 0x03de, 0x03ed, 0x03f9, 0x03f9, 0x0402, 0x040e, + 0x041d, 0x042c, 0x0438, 0x0444, 0x0444, 0x044d, 0x0459, 0x0485, + 0x0485, 0x0485, 0x0491, 0x0491, 0x0491, 0x0491, 0x0491, 0x04a0, + 0x04ac, 0x04bb, 0x04bb, 0x04ca, 0x04ca, 0x04ca, 0x04ca, 0x04d3, + 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04e5, 0x04e5, 0x04e5, 0x04e5, + 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, + // Entry C0 - FF + 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, + 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, + 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, + 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, + 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, + 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, + 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, + 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, + // Entry 100 - 13F + 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, + 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, + 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, + 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04e5, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + // Entry 140 - 17F + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + // Entry 180 - 1BF + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + // Entry 1C0 - 1FF + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + // Entry 200 - 23F + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, 0x04f4, + 0x04f4, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, + 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, + 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, + 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, + 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, + // Entry 240 - 27F + 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, + 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, + 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, + 0x0509, 0x0509, 0x0509, 0x0509, 0x0531, 0x055c, 0x055c, 0x0576, + }, + }, + { // to + "lea fakaʻafālalea fakaʻapakasialea fakaʻavesitanilea fakaʻafilikanalea f" + + "akaʻakanilea fakaʻamelikilea fakaʻalakonilea fakaʻalepealea fakaʻasa" + + "mialea fakaʻavalikilea fakaʻaimalalea fakaʻasapaisanilea fakapasikil" + + "ilea fakapelalusilea fakapulukalialea fakapisilamalea fakapamipalale" + + "a fakapengikalilea fakatipetilea fakapeletonilea fakaposinialea faka" + + "katalanilea fakaseselea fakakamololea fakakōsikalea fakakelīlea faka" + + "sekilea fakasilavia-fakasiasilea fakasuvasalea fakauēlesilea fakaten" + + "imaʻakelea fakasiamanelea fakativehilea fakaputenilea fakaʻeuelea fa" + + "kakalisilea fakapālangilea fakaʻesipulanitolea fakasipēnisilea fakaʻ" + + "esitōnialea fakapāsikilea fakapēsialea fakafulālea fakafinilanilea f" + + "akafisilea fakafaloelea fakafalanisēlea fakafilisia-hihifolea fakaʻa" + + "elanilea fakakaelikilea fakakalisialea fakakualanilea fakakutalatile" + + "a fakamangikīlea fakahausalea fakahepelūlea fakahinitīlea fakahili-m" + + "otulea fakakuloisialea fakahaitilea fakahungakalialea fakaʻāmenialea" + + " fakahelelolea fakavahaʻalealea fakaʻinitōnesialea fakavahaʻalingikē" + + "lea fakaʻikipōlea fakasisiuani-īlea fakaʻinupiakilea fakaʻitolea fak" + + "aʻaisilanilea fakaʻītalilea fakaʻinuketitutilea fakasiapanilea fakas" + + "avalea fakaseōsialea fakakongikōlea fakakikuiulea fakakuaniamalea fa" + + "kakasakilea fakakalaʻalisutilea fakakamipōtialea fakakanatalea fakak" + + "ōlealea fakakanulilea fakakāsimilalea fakakulitīlea fakakomilea fak" + + "akoniualilea fakakīsisilea fakalatinalea fakalakisimipekilea fakakan" + + "italea fakalimipūlikilea lingikalalea fakalaulea fakalituanialea fak" + + "alupa-katangalea fakalativialea fakamalakasilea fakamāsololea fakama" + + "ulilea fakamasitōnialea fakaʻinitia-malāialamilea fakamongokōlialea " + + "fakamalatilea fakamaleilea fakamalitalea fakapemalea fakanaululea fa" + + "kanetepele-tokelaulea fakanepalilea fakanetongikālea fakahōlanilea f" + + "akanoauē-ninosikilea fakanouaē-pokimalilea fakanetepele-tongalea fak" + + "anavaholea fakanianisalea fakaʻokitanelea fakaʻosipiuālea fakaʻolomo" + + "lea fakaʻinitia-ʻolāealea fakaʻosetikilea fakapūnusapilea fakapālile" + + "a fakapolanilea fakapasitōlea fakapotukalilea fakakuetisalea fakalai" + + "to-lomēnialea fakaluanitilea fakalōmenialea fakalūsialea fakakiniāua" + + "nitalea fakasanisukulitilea fakasaletīnialea fakasīnitilea fakasami-" + + "tokelaulea fakasangikōlea fakasingihalalea fakasolāvakilea fakasolov" + + "enialea fakahaʻamoalea fakasionalea fakasomalilea fakaʻalapēnialea f" + + "akasēpialea fakasuatilea fakasoto-tongalea fakasunitālea fakasuēteni" + + "lea fakasuahililea fakatamililea fakaʻinitia-telukulea fakatāsikilea" + + " fakatailanilea fakatikilinialea fakatēkimenilea suanalea fakatongal" + + "ea fakatoakelea fakatisongalea fakatatalelea fakatahitilea fakaʻuikū" + + "lilea fakaʻūkalaʻinelea fakaʻūtūlea fakaʻusipekilea fakavenitālea fa" + + "kavietinamilea fakavolapikilea fakaʻualonialea fakaʻuolofolea fakatō" + + "salea fakaītisilea fakaʻiōlupalea fakasuangilea fakasiainalea fakasu" + + "lulea fakaʻatisēlea fakaʻakolilea fakaʻatangimēlea fakaʻatikēlea fak" + + "aʻalepea-tunīsialea fakaʻafilihililea fakaʻakihemilea fakaʻainulea f" + + "akaʻakatialea fakaʻalapamalea fakaʻaleutilea fakaʻalapēnia-kekilea f" + + "akaʻalitai-tongalea fakapālangi-motuʻalea fakaʻangikalea fakaʻalāmit" + + "ilea fakamapuselea fakaʻalaonalea fakaʻalapaholea fakaʻalepea-ʻaisil" + + "ialea fakaʻalauakilea fakaʻalepea-molokolea fakaʻalepea-ʻisipitelea " + + "fakaʻasulea fakaʻilonga-ʻamelikalea fakaʻasitūlialea fakakotavalea f" + + "akaʻauatilea fakapalusilea fakapalilea fakapavālialea fakapasaʻalea " + + "fakapamunilea fakatōpe-pētekilea fakakomalalea fakapesalea fakapēmip" + + "alea fakapetavilea fakapenalea fakapafutilea fakapatakalea fakapalus" + + "i-hihifolea fakaposipulilea fakapikolilea fakapinilea fakapanisalile" + + "a fakakomelea fakasikesikālea fakapisinupilialea fakapakitiālilea fa" + + "kapalailea fakapalahuilea fakapōtolea fakaʻakōselea fakapuliatilea f" + + "akapukisilea fakapululea fakapilinilea fakametūmipalea fakakatolea f" + + "akakalipalea fakakaiukalea fakaʻatisamilea fakasepuanolea fakakikale" + + "a fakasīpisalea fakasakatāilea fakatūkelea fakamalīlea fakasinuki-ta" + + "kotelea fakasokitaulea fakasipeuianilea fakaselokīlea fakaseienelea " + + "fakakūtisi-lolotolea fakakopitikalea fakakapisenolea fakatoake-kilim" + + "ealea fakakasiupialea fakatakotalea fakatalakuālea fakataitalea faka" + + "telaualelea fakasilavelea fakatōkelipilea fakatingikālea fakatisāmal" + + "ea fakatokililea fakasōpia-hifolea fakatusuni-lolotolea fakatualalea" + + " fakahōlani-lotolotolea fakaiola-fonīlea fakatiulalea fakatasakalea " + + "fakaʻemipūlea fakaʻefikilea fakaʻemilialea fakaʻisipitemuʻalea fakaʻ" + + "ekaiukilea fakaʻelamitelea fakapālangi-lotolotolea fakaiūpiki-loloto" + + "lea fakaʻeuōnitolea fakaʻekisitematulalea fakafangilea fakafilipaini" + + "lea fakafinilani-tōnetalelea fakafōngilea fakafalanisē-kasunilea fak" + + "afalanisē-lotolotolea fakafalanisē-motuʻalea fakaʻāpitanolea fakafil" + + "isia-tokelaulea fakafilisia-hahakelea fakafulilānilea fakakālea faka" + + "kakausilea fakasiaina-kanilea fakakaiolea fakakapaialea fakateli-sol" + + "oasitelialea fakasiʻisilea fakakilipasilea fakakilakilea fakasiamane" + + "-hake-lotolotolea fakasiamane-hake-motuʻalea fakakonikanī-koanilea f" + + "akakonitīlea fakakolonitalolea fakakotikalea fakakēpolea fakakalisim" + + "uʻalea fakasiamane-suisilanilea fakaʻuaiūlea fakafalefalelea fakakus" + + "īlea fakaʻuīsinilea fakahaitalea fakasiaina-hakalea fakahauaiʻilea " + + "fakahinitī-fisilea fakahilikainonilea fakahititelea fakamōngilea fak" + + "asōpia-hakelea fakasiaina-siangilea fakahupalea fakaʻipanilea fakaʻi" + + "pipiolea fakaʻilokolea fakaʻingusilea fakaʻingilianilea fakapālangi-" + + "samaikalea fakalosipanilea fakanikōmipalea fakamasamelea fakaʻiuteo-" + + "pēsialea fakaʻiuteo-ʻalepealea fakaʻiutilanilea fakakala-kalipakilea" + + " fakakapilelea fakakasinilea fakasisūlea fakakamipalea fakakavilea f" + + "akakapālitialea fakakanēmipulea fakatiapilea fakamakōnitelea fakakap" + + "uvelitianulea fakakeniangilea fakakololea fakakaingangilea fakakāsil" + + "ea fakakōtanilea fakakoila-sīnilea fakakoualilea fakakilimanisikīlea" + + " fakakakolea fakakalenisinilea fakakimipūnitulea fakakomi-pelemiakil" + + "ea fakakonikanīlea fakakosilaelea fakakepelelea fakakalate-palakilil" + + "ea fakakiliolea fakakinaraiālea fakakalelialea fakakulukilea fakasia" + + "mipalalea fakapafialea fakakolongialea fakakumikilea fakakutenailea " + + "fakalatinolea fakalangilea fakalānitalea fakalamipālea fakalesikiale" + + "a fakakavakava-foʻoulea fakalikulialea fakalivonialea fakalakotalea " + + "fakalomipātilea fakamongikōlea fakalosilea fakaluli-tokelaulea fakal" + + "atakalelea fakalupa-lulualea fakaluisenolea fakalunitālea fakaluolea" + + " fakamisolea fakaluīalea fakasiaina-faʻutohilea fakalasulea fakamatu" + + "lalea fakamafalea fakamakahilea fakamaitililea fakamakasalilea fakam" + + "anitīngikolea fakamasailea fakamapalea fakamokisiālea fakamanetalile" + + "a fakamenetīlea fakamelulea fakamolisienilea fakaʻaelani-lotolotolea" + + " fakamakūa-meʻetolea fakametalea fakamikemakilea fakaminangikapaulea" + + " fakamanisūlea fakamanipulilea fakamohaukilea fakamosilea fakamali-h" + + "ihifolea fakamunitangilea tuifiolea fakakilekilea fakamilanitēsilea " + + "fakamaliwalilea fakamenitauailea fakamienelea fakaʻelisialea fakamas" + + "anitelanilea fakasiaina-mininanilea fakanapoletanolea fakanamalea fa" + + "kasiamane-hifolea fakaneualilea fakaniasilea fakaniuēlea fakaʻaonasa" + + "lea fakakuasiolea fakangiemipōnilea fakanokailea fakanoauē-motuʻalea" + + " fakanovialelea fakanikōlea fakasoto-tokelaulea fakanuelilea fakaneu" + + "ali-motuʻalea fakaniamiuesilea fakanianikolelea fakaniololea fakanes" + + "imalea fakaʻosēselea fakatoake-ʻotomanilea fakapangasinanilea fakapā" + + "lavilea fakapamipangalea fakapapiamēnitolea fakapalaulea fakapikātil" + + "ea fakasiamane-penisilivanialea fakasiamane-lafalafalea fakapēsia-mo" + + "tuʻalea fakasiamane-palatinelea fakafoinikialea fakapiemonitelea fak" + + "aponitikilea fakaponapēlea fakapulūsialea fakapolovenisi-motuʻalea f" + + "akakīsēlea fakakuitisa-simipolasolea fakalasasitanilea fakalapanuile" + + "a fakalalotongalea fakalomaniololea fakalifilea fakalomipōlea fakalo" + + "manilea fakalotumalea fakalusinilea fakalovianalea fakaʻalomanialea " + + "fakaluālea fakasanitauelea fakasakalea fakasamalitani-ʻalāmitilea fa" + + "kasamipululea fakasasakilea fakasanitalilea fakasaulasitilālea fakan" + + "gāmipailea fakasangulea fakasisīlialea fakasikotilanilea fakasaletīn" + + "ia-sasalesulea faka-tonga ‘o Ketesilea fakasenekalea fakasenalea fak" + + "aselilea fakaselikupilea fakakoilapolo-senilea fakaʻaelani-motuʻalea" + + " fakasamositialea fakataselihitilea fakasianilea fakaʻalepea-sātilea" + + " fakasitamolea fakasilesia-hifolea fakaselaiālea fakasami-tongalea f" + + "akasami-lulelea fakasami-ʻinalilea fakasami-sikolitalea fakasoninekē" + + "lea fakasokitianalea fakasuranane-tongikōlea fakasēlēlelea fakasahol" + + "ea fakafilisia-satēlanilea fakasukumalea fakasusūlea fakasumelialea " + + "fakakomololea fakasuahili-kongikōlea fakasuliāiā-muʻalea fakasuliāiā" + + "lea fakasilesialea fakatululea fakatimenēlea fakatesolea fakatelenol" + + "ea fakatetumulea fakatikilēlea fakativilea fakatokelaulea fakasākuli" + + "lea fakakilingonilea fakatilingikītelea fakatalisilea fakatamasiekil" + + "ea fakaniasa-tongalea fakatoki-pisinilea fakatuloiolea fakatalokolea" + + " fakasakōnialea fakatisīmisianilea fakatati-moselemilea fakatumepuka" + + "lea fakatūvalulea fakatasauakilea fakatuvīnialea fakatamasaiti-ʻatil" + + "asi-lolotolea fakaʻutimulitilea fakaʻūkalitilea fakaʻumipūnitulea fa" + + "kaʻilonga-tefitolea fakavailea fakavenēsialea fakavepisilea fakavela" + + "mingi-hihifolea fakafalanikoni-lolotolea fakavotikilea fakavōlolea f" + + "akavūnisolea fakaʻualiselilea fakaʻuolaitalea fakaʻualailea fakaʻuas" + + "iōlea fakaʻuālipililea fakasiaina-uūlea fakakalimikilea fakamingilel" + + "ialea fakasokalea fakaʻiaolea fakaʻiapilea fakaʻiangipenilea fakaʻiē" + + "mipalea fakaneʻēngatūlea fakakuangitongilea fakasapotekilea fakaʻilo" + + "nga-pilisilea fakasēlanilea fakasenakalea fakatamasaiti-molokolea fa" + + "kasuniʻikai ha lealea fakasāsālea fakaʻalepea (māmani)lea fakasiaman" + + "e-ʻaositulialea fakasiamane-hake-suisilanilea fakapālangi-ʻaositelēl" + + "ialea fakapālangi-kānatalea fakapilitānialea fakapālangi-ʻamelikalea" + + " fakasipēnisi lātini-ʻamelikalea fakasipēnisi-‘iulopelea fakasipēnis" + + "i-mekisikoulea fakafalanisē-kānatalea fakafalanisē-suisilanilea faka" + + "sakisoni-hifolea fakahōlani-pelesiumelea fakapotukali-palāsililea fa" + + "kapotukali-ʻiulopelea fakamolitāvialea fakakuloisia-sēpialea fakasia" + + "ina-fakafaingofualea fakasiaina-tukufakaholo", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0010, 0x0022, 0x0035, 0x0048, 0x0057, 0x0068, 0x0079, + 0x0089, 0x0099, 0x00aa, 0x00ba, 0x00ce, 0x00de, 0x00ee, 0x00ff, + 0x010f, 0x011f, 0x0130, 0x013e, 0x014e, 0x015d, 0x016d, 0x0179, + 0x0187, 0x0196, 0x01a3, 0x01af, 0x01c8, 0x01d6, 0x01e5, 0x01f8, + 0x0207, 0x0215, 0x0223, 0x0230, 0x023e, 0x024e, 0x0263, 0x0274, + 0x0287, 0x0296, 0x02a4, 0x02b1, 0x02c1, 0x02cd, 0x02da, 0x02eb, + 0x0301, 0x0311, 0x0320, 0x032f, 0x033e, 0x034e, 0x035e, 0x036b, + 0x037a, 0x0389, 0x039a, 0x03aa, 0x03b7, 0x03c9, 0x03da, 0x03e8, + // Entry 40 - 7F + 0x03fa, 0x040f, 0x0426, 0x0436, 0x0449, 0x045b, 0x0468, 0x047a, + 0x048a, 0x049f, 0x04ae, 0x04ba, 0x04c9, 0x04d9, 0x04e7, 0x04f7, + 0x0505, 0x051a, 0x052c, 0x053a, 0x0548, 0x0556, 0x0567, 0x0576, + 0x0582, 0x0592, 0x05a1, 0x05af, 0x05c3, 0x05d1, 0x05e4, 0x05f1, + 0x05fc, 0x060c, 0x0620, 0x062f, 0x063f, 0x064e, 0x065b, 0x066d, + 0x0689, 0x069c, 0x06aa, 0x06b7, 0x06c5, 0x06d1, 0x06de, 0x06f6, + 0x0704, 0x0716, 0x0725, 0x073c, 0x0753, 0x0769, 0x0777, 0x0786, + 0x0797, 0x07a9, 0x07b8, 0x07d1, 0x07e2, 0x07f3, 0x0800, 0x080e, + // Entry 80 - BF + 0x081d, 0x082d, 0x083c, 0x0852, 0x0861, 0x0871, 0x087f, 0x0893, + 0x08a7, 0x08b9, 0x08c8, 0x08dc, 0x08ec, 0x08fd, 0x090e, 0x091f, + 0x092f, 0x093c, 0x094a, 0x095d, 0x096b, 0x0978, 0x098a, 0x0999, + 0x09a9, 0x09b8, 0x09c6, 0x09dd, 0x09ec, 0x09fb, 0x0a0c, 0x0a1d, + 0x0a26, 0x0a33, 0x0a40, 0x0a4f, 0x0a5d, 0x0a6b, 0x0a7c, 0x0a91, + 0x0aa0, 0x0ab1, 0x0ac0, 0x0ad1, 0x0ae1, 0x0af2, 0x0b02, 0x0b0f, + 0x0b1d, 0x0b2e, 0x0b3c, 0x0b4a, 0x0b56, 0x0b66, 0x0b75, 0x0b88, + 0x0b98, 0x0bb1, 0x0bc4, 0x0bd5, 0x0be3, 0x0bf3, 0x0c04, 0x0c14, + // Entry C0 - FF + 0x0c2c, 0x0c42, 0x0c5a, 0x0c6a, 0x0c7c, 0x0c8a, 0x0c9a, 0x0cab, + 0x0cc5, 0x0cd6, 0x0ced, 0x0d07, 0x0d14, 0x0d2e, 0x0d41, 0x0d4f, + 0x0d5e, 0x0d6c, 0x0d78, 0x0d88, 0x0d97, 0x0da5, 0x0dba, 0x0dc8, + 0x0dd4, 0x0de3, 0x0df1, 0x0dfd, 0x0e0b, 0x0e19, 0x0e2e, 0x0e3e, + 0x0e4c, 0x0e58, 0x0e68, 0x0e74, 0x0e85, 0x0e98, 0x0eaa, 0x0eb7, + 0x0ec6, 0x0ed3, 0x0ee3, 0x0ef2, 0x0f00, 0x0f0c, 0x0f1a, 0x0f2b, + 0x0f37, 0x0f45, 0x0f53, 0x0f64, 0x0f73, 0x0f7f, 0x0f8e, 0x0f9e, + 0x0fab, 0x0fb8, 0x0fcd, 0x0fdc, 0x0fed, 0x0ffc, 0x100a, 0x1020, + // Entry 100 - 13F + 0x1030, 0x1040, 0x1055, 0x1065, 0x1073, 0x1083, 0x1090, 0x10a0, + 0x10ae, 0x10bf, 0x10cf, 0x10de, 0x10ec, 0x10ff, 0x1114, 0x1121, + 0x1139, 0x114b, 0x1158, 0x1166, 0x1176, 0x1185, 0x1195, 0x11ab, + 0x11bc, 0x11cd, 0x11e6, 0x11fc, 0x120e, 0x1225, 0x1232, 0x1243, + 0x125d, 0x126b, 0x1283, 0x129d, 0x12b6, 0x12c8, 0x12df, 0x12f5, + 0x1306, 0x1311, 0x1320, 0x1333, 0x133f, 0x134d, 0x1366, 0x1375, + 0x1385, 0x1393, 0x13b0, 0x13cc, 0x13e3, 0x13f2, 0x1404, 0x1412, + 0x141f, 0x1432, 0x144b, 0x145a, 0x146a, 0x1477, 0x1488, 0x1495, + // Entry 140 - 17F + 0x14a8, 0x14b8, 0x14cc, 0x14df, 0x14ed, 0x14fb, 0x150e, 0x1523, + 0x152f, 0x153e, 0x154e, 0x155d, 0x156d, 0x1580, 0x1598, 0x15a8, + 0x15b9, 0x15c7, 0x15dd, 0x15f5, 0x1607, 0x161c, 0x162a, 0x1638, + 0x1645, 0x1653, 0x165f, 0x1671, 0x1682, 0x168f, 0x16a0, 0x16b5, + 0x16c5, 0x16d1, 0x16e2, 0x16ef, 0x16fe, 0x1711, 0x171f, 0x1734, + 0x1740, 0x1752, 0x1765, 0x177b, 0x178c, 0x179b, 0x17a9, 0x17c0, + 0x17cd, 0x17de, 0x17ed, 0x17fb, 0x180c, 0x1819, 0x1829, 0x1837, + 0x1846, 0x1854, 0x1861, 0x1870, 0x187f, 0x188e, 0x18a5, 0x18b4, + // Entry 180 - 1BF + 0x18c3, 0x18d1, 0x18e2, 0x18f2, 0x18fe, 0x1912, 0x1922, 0x1934, + 0x1943, 0x1952, 0x195d, 0x1969, 0x1976, 0x198e, 0x199a, 0x19a8, + 0x19b4, 0x19c2, 0x19d1, 0x19e1, 0x19f5, 0x1a02, 0x1a0e, 0x1a1e, + 0x1a2e, 0x1a3d, 0x1a49, 0x1a5a, 0x1a73, 0x1a89, 0x1a95, 0x1aa5, + 0x1ab9, 0x1ac8, 0x1ad8, 0x1ae7, 0x1af3, 0x1b06, 0x1b17, 0x1b21, + 0x1b2f, 0x1b42, 0x1b52, 0x1b63, 0x1b70, 0x1b80, 0x1b94, 0x1bab, + 0x1bbd, 0x1bc9, 0x1bdd, 0x1beb, 0x1bf8, 0x1c05, 0x1c15, 0x1c23, + 0x1c36, 0x1c43, 0x1c59, 0x1c68, 0x1c75, 0x1c89, 0x1c96, 0x1cac, + // Entry 1C0 - 1FF + 0x1cbd, 0x1cce, 0x1cdb, 0x1ce9, 0x1cf9, 0x1d10, 0x1d23, 0x1d32, + 0x1d43, 0x1d57, 0x1d64, 0x1d73, 0x1d90, 0x1da8, 0x1dbe, 0x1dd6, + 0x1de6, 0x1df7, 0x1e07, 0x1e16, 0x1e26, 0x1e40, 0x1e4e, 0x1e68, + 0x1e7a, 0x1e89, 0x1e9a, 0x1eab, 0x1eb7, 0x1ec6, 0x1ed4, 0x1ee2, + 0x1ef0, 0x1eff, 0x1f11, 0x1f1d, 0x1f2d, 0x1f39, 0x1f56, 0x1f66, + 0x1f74, 0x1f84, 0x1f98, 0x1fa9, 0x1fb6, 0x1fc6, 0x1fd8, 0x1ff3, + 0x200d, 0x201b, 0x2027, 0x2033, 0x2043, 0x2059, 0x2071, 0x2082, + 0x2094, 0x20a1, 0x20b7, 0x20c5, 0x20d9, 0x20e8, 0x20fa, 0x210b, + // Entry 200 - 23F + 0x211f, 0x2134, 0x2145, 0x2156, 0x216f, 0x217f, 0x218b, 0x21a4, + 0x21b2, 0x21bf, 0x21ce, 0x21dc, 0x21f4, 0x220b, 0x221c, 0x222b, + 0x2237, 0x2246, 0x2252, 0x2260, 0x226e, 0x227d, 0x2289, 0x2298, + 0x22a7, 0x22b8, 0x22cc, 0x22da, 0x22eb, 0x22fe, 0x2311, 0x231f, + 0x232d, 0x233d, 0x2351, 0x2366, 0x2376, 0x2385, 0x2395, 0x23a5, + 0x23c7, 0x23da, 0x23ec, 0x2400, 0x2417, 0x2422, 0x2432, 0x2440, + 0x2458, 0x2471, 0x247f, 0x248c, 0x249b, 0x24ad, 0x24be, 0x24cd, + 0x24dd, 0x24f0, 0x2502, 0x2512, 0x2524, 0x2530, 0x253d, 0x254b, + // Entry 240 - 27F + 0x255e, 0x256f, 0x2583, 0x2596, 0x25a6, 0x25bd, 0x25cc, 0x25da, + 0x25f2, 0x25fe, 0x260b, 0x2619, 0x2633, 0x2633, 0x264e, 0x266c, + 0x268b, 0x26a3, 0x26b5, 0x26cf, 0x26f2, 0x270d, 0x2728, 0x2728, + 0x2741, 0x275c, 0x2771, 0x278a, 0x27a4, 0x27bd, 0x27cf, 0x27e6, + 0x2802, 0x281d, + }, + }, + { // tr + trLangStr, + trLangIdx, + }, + { // twq + "Akan senniAmhaarik senniLaaraw senniBelaruus senniBulagaari senniBengali" + + " senniCek senniAlmaŋ senniGrek senniInglisi senniEspaaɲe senniFarsi " + + "senniFransee senniHawsance senniInduu senniHungaari senniIndoneesi s" + + "enniIboo senniItaali senniJaponee senniJavanee senniKmeer senni, Gam" + + "e hereKoree senniMaleezi senniBurme senniNeepal senniHolandee senniP" + + "unjaabi senniiPolonee senniPortugee senniRumaani senniRuusi senniRwa" + + "nda senniSomaali senniSuweede senniTamil senniTaailandu senniTurku s" + + "enniUkreen senniUrdu senniVietnaam senniYorbance senniSinuwa senni, " + + "MandareŋZulu senniTasawaq senni", + []uint16{ // 551 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x0018, 0x0018, + 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0032, 0x0041, + 0x0041, 0x0041, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, + 0x004e, 0x004e, 0x004e, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0063, 0x0063, 0x0063, 0x0063, 0x006d, 0x007a, 0x007a, 0x0088, + 0x0088, 0x0088, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x00a0, + 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00ae, + 0x00ae, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00c7, 0x00c7, 0x00c7, + // Entry 40 - 7F + 0x00c7, 0x00d6, 0x00d6, 0x00e0, 0x00e0, 0x00e0, 0x00e0, 0x00e0, + 0x00ec, 0x00ec, 0x00f9, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, + 0x0106, 0x0106, 0x011c, 0x011c, 0x0127, 0x0127, 0x0127, 0x0127, + 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, + 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, 0x0127, + 0x0127, 0x0127, 0x0127, 0x0134, 0x0134, 0x013f, 0x013f, 0x013f, + 0x014b, 0x014b, 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, + 0x0159, 0x0159, 0x0159, 0x0159, 0x0159, 0x0168, 0x0168, 0x0175, + // Entry 80 - BF + 0x0175, 0x0183, 0x0183, 0x0183, 0x0183, 0x0190, 0x019b, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, + 0x01c1, 0x01c1, 0x01cc, 0x01cc, 0x01cc, 0x01db, 0x01db, 0x01db, + 0x01db, 0x01db, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01f2, + 0x01fc, 0x01fc, 0x01fc, 0x020a, 0x020a, 0x020a, 0x020a, 0x020a, + 0x020a, 0x0218, 0x0218, 0x022f, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + // Entry C0 - FF + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + // Entry 100 - 13F + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + // Entry 140 - 17F + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + // Entry 180 - 1BF + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + // Entry 1C0 - 1FF + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + // Entry 200 - 23F + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0239, 0x0246, + }, + }, + { // tzm + "TakanitTamharitTaεrabtTabilarusitTabelɣaritTabinɣalitTačiktTalmanitTayun" + + "anitTanglizttasbelyunitTafarisitTafṛansistTahawsatTahinditTahenɣarit" + + "TindunisitTigbutTaṭalyantTajappunitTajavanitTaxmert ,TalammastTakuri" + + "tTamalizitTaburmanitTanippalitTahulanḍitTabenjabitTappulunitTaburtuɣ" + + "alitTaṛumanitTarusitTarwanditTaṣumalitTaswiditTatamiltTaṭaytTaturkit" + + "TukranitTurdutTaviṭnamitTayurubatTacinwit,MandarintazulutTamaziɣt n " + + "laṭlaṣ", + []uint16{ // 553 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x000f, 0x000f, + 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0022, 0x002d, + 0x002d, 0x002d, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, + 0x0038, 0x0038, 0x0038, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, + 0x0047, 0x0047, 0x0047, 0x0047, 0x0050, 0x0058, 0x0058, 0x0063, + 0x0063, 0x0063, 0x006c, 0x006c, 0x006c, 0x006c, 0x006c, 0x0078, + 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0080, + 0x0080, 0x0088, 0x0088, 0x0088, 0x0088, 0x0093, 0x0093, 0x0093, + // Entry 40 - 7F + 0x0093, 0x009d, 0x009d, 0x00a3, 0x00a3, 0x00a3, 0x00a3, 0x00a3, + 0x00ae, 0x00ae, 0x00b8, 0x00c1, 0x00c1, 0x00c1, 0x00c1, 0x00c1, + 0x00c1, 0x00c1, 0x00d3, 0x00d3, 0x00da, 0x00da, 0x00da, 0x00da, + 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, + 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, + 0x00da, 0x00da, 0x00da, 0x00e3, 0x00e3, 0x00ed, 0x00ed, 0x00ed, + 0x00f7, 0x00f7, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, + 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, 0x010d, 0x010d, 0x0117, + // Entry 80 - BF + 0x0117, 0x0124, 0x0124, 0x0124, 0x0124, 0x012f, 0x0136, 0x013f, + 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, + 0x013f, 0x013f, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, + 0x0152, 0x0152, 0x015a, 0x015a, 0x015a, 0x0162, 0x0162, 0x0162, + 0x0162, 0x0162, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, 0x0172, + 0x0178, 0x0178, 0x0178, 0x0184, 0x0184, 0x0184, 0x0184, 0x0184, + 0x0184, 0x018d, 0x018d, 0x019e, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + // Entry C0 - FF + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + // Entry 100 - 13F + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + // Entry 140 - 17F + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + // Entry 180 - 1BF + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + // Entry 1C0 - 1FF + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + // Entry 200 - 23F + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01a5, + 0x01bb, + }, + }, + { // ug + "ئافارچەئابخازچەئاۋېستاچەئافرىكانچەئاكانچەئامخاراچەئاراگونچەئەرەبچەئاسسام" + + "چەئاۋارچەئايماراچەئەزەرىچەباشقىرتچەبېلارۇسچەبۇلغارچەبىسلاماچەبامبار" + + "اچەبېنگالچەتىبەتچەبىرېتونچەبوسنىيەچەكاتالانچەچېچىنچەچامورروچەكورساچ" + + "ەكرىچەچېخچەقەدىمكى سلاۋيانچەچۇۋاشچەۋېلشچەدانىشچەگېرمانچەدىۋەخىچەبۇت" + + "انچەئېۋېچەگىرېكچەئىنگلىزچەدۇنيا تىلىئىسپانچەئېستونچەباسكىچەپارسچەفۇ" + + "لاچەفىنچەفىجىچەفائېروچەفىرانسۇزچەغەربى فىرىزيەچەئىرېلاندچەسكوتچەگال" + + "ىتسىيانچەگۇئارانىچەگۇجاراتچەمانچەخائۇساچەئىبرانىچەھىندىچەھىرى موتۇچ" + + "ەخورۋاتچەھايتىچەماجارچەئەرمەنچەخېرېروچەئارىلىق تىلھىندونېزىيەچەئىنت" + + "ىرلىڭچەئىبوچەيىچە (سىچۈەن)ئىنۇپىكچەئىدوچەئىسلاندچەئىتاليانچەئىنۇكتى" + + "تۇتچەياپونچەياۋاچەگىرۇزىنچەكونگوچەكىكۇيۇچەكىۋانياماچەقازاقچەگىرېنلا" + + "ندچەكىخمېرچەكانناداچەكورېيەچەكانۇرىچەكەشمىرچەكۇردچەكومىچەكورنىشچەقى" + + "رغىزچەلاتىنچەلىيۇكسېمبۇرگچەگانداچەلىمبۇرگچەلىنگالاچەلائوسچەلىتۋاچەل" + + "ۇبا-كاتانگاچەلاتۋىيەچەماداغاسقارچەمارشالچەماۋرىچەماكېدونچەمالايامچە" + + "موڭغۇلچەماراتچەمالايچەمالتاچەبىرماچەناۋرۇچەشىمالى ندەبەلەچەنېپالچەن" + + "دونگاچەگوللاندىيەچەيېڭى نورۋېگچەنورۋىگىيە بوكمالچەجەنۇبى ندەبەلەچەن" + + "اۋاخوچەنيانجاچەئوكسىتانچەئوجىبۋاچەئوروموچەئورىياچەئوسسېتچەچەپەنجابچ" + + "ەپالىچەپولەكچەپۇشتۇچەپورتۇگالچەكېچياچەرومانىشچەرۇندىچەرۇمىنىيەچەرۇس" + + "چەرىۋانداچەسانسكرىتچەساردىنىيەچەسىندىچەشىمالى سامىچەسانگوچەسىنگالچە" + + "سىلوۋاكچەسىلوۋېنىيەچەساموئاچەشوناچەسومالىچەئالبانچەسېربچەسىۋاتىچەجە" + + "نۇبى سوتوچەسۇنداچەشۋېدچەسىۋالىچەتامىلچەتېلۇگۇچەتاجىكچەتايلاندچەتىگر" + + "ىنياچەتۈركمەنچەسىۋاناچەتوڭانچەتۈركچەسونگاچەتاتارچەتاختىچەئۇيغۇرچەئۇ" + + "كرائىنچەئوردوچەئۆزبېكچەۋېنداچەۋىيېتنامچەۋولاپۇكچەۋاللۇنچەۋولوفچەخوس" + + "اچەيىددىشچەيورۇباچەجۇاڭچەخەنچەزۇلۇچەئاتجېچەئاچولىچەئاداڭمېچەئادىگېي" + + "چەئافرىخىلىچەئاگەمچەئاينۇچەئاككادچەئالېيۇتچەجەنۇبى ئالتاي تىللىرىقە" + + "دىمكى ئىنگلىزچەئانگىكاچەئارامۇچەماپۇچەئاراپاخوچەئاراۋاكچەئاسۇچەئاست" + + "ۇرىيەچەئاۋادىچەبېلۇجىچەبالىچەباساچەبامۇنچەگومالاچەبېجاچەبېمباچەبېنا" + + "چەبافۇتچەبوجپۇرىچەبىكولچەبىنىچەكومچەسىكسىكاچەبىراجچەبودوچەئاكۇسچەبۇ" + + "رىياتچەبۇگىچەبۇلۇچەبىلىنچەمېدۇمباچەكاددوچەكارىبچەكايۇگاچەئاتسامچەسې" + + "بۇچەچىگاچەچىبچاچەچاغاتايچەچۇكچەمارىچەچىنۇك-ژارگونچەچوكتاۋچەچىپېۋيان" + + "چەچېروكىچەچېيېنچەسورانى كۇردچەكوپتىكچەقىرىم تۈركچەكاسزۇبىچەداكوتاچە" + + "دارگىۋاچەتايتاچەدېلاۋارېچەسلاۋچەدوگرىبچەدىنكاچەزارماچەدوگرىچەتوۋەن " + + "سېربچەدۇئالاچەئوتتۇرا گوللاندىيەچەجولاچەدىيۇلاچەدازاگاچەئېمبۇچەئېفى" + + "كچەقەدىمكى مىسىرچەئېكاجۇكچەئېلامىتچەئوتتۇرا ئەسىر ئىنگلىزچەئېۋوندوچ" + + "ەفاڭچەفىلىپپىنچەفونچەئوتتۇرا ئەسىر فىرانسۇزچەقەدىمكى فىرانسۇزچەشىما" + + "لى فىرىزيەچەشەرقى فىرىزيەچەفىرىئۇلىچەگاچەگايوچەگىباياچەگىزچەگىلبېرت" + + "چەئوتتۇرا ئەسىر ئېگىزلىك گېرمانچەقەدىمكى ئېگىزلىك گېرمانچەگوندىچەگو" + + "رونتالوچەگوتچەگرېبوچەقەدىمكى گىرېكچەگېرمانچە شىۋىتسارىيەگۇسىچەگىۋىچ" + + "ىنچەھەيدەچەھاۋايچەخىلىگاينونچەخىتتىتچەمۆڭچەيۇقىرىقى سېربچەخۇپاچەئىب" + + "انچەئىبىبىئوچەئىلوكانوچەئىنگۇشچەلوجبانچەنگومباچەماچامچەئىبرانى پارس" + + "چەئىبرانى ئەرەبچەقارا-قالپاقچەكابىلېچەكاچىنچەجۇچەكامباچەكاۋىچەكابار" + + "دەيچەكانېمبۇچەتياپچەماكوندېچەكابۇۋېردىيانچەكوروچەكاسىچەخوتەنچەكويرا" + + " چىنىچەكاكوچەكالېنجىنچەكىمبۇندۇچەكونكانىچەكوسرايېچەكىپەللېچەقاراچاي-" + + "بالقارچەكارەلچەكۇرۇكچەشامبالاچەبافىياچەكولىشچەقۇمۇقچەكۇتەنايچەلادىن" + + "وچەلانگىچەلانداچەلامباچەلېزگىنچەمونگوچەلوزىچەلۇبا-لۇئاچەلۇيسېنگوچەل" + + "ۇنداچەلۇئوچەمىزوچەلۇياچەمادۇرېسچەمافاچەماگاخىچەمايتىلىچەماكاسارچەما" + + "ندىنگوچەماسايچەماباچەموكشاچەماندارچەمېندېچەمېرۇچەمورىسيېنچەئوتتۇرا " + + "ئەسىر ئىرېلاندچەماكۇۋاچەمېتاچە’مىكماكچەمىناڭكابائۇچەمانجۇچەمانىپۇرى" + + "چەموخوكچەموسسىچەمۇنداڭچەكۆپ تىللاركىرىكچەمىراندېسچەمارۋارىچەميېنېچە" + + "ئېرزاچەناپولىچەناماچەتۆۋەن گېرمانچەنېۋارىچەنىئاسچەنيۇئېچەكۋاسىيوچەن" + + "گېمبۇنچەنوغايچەقەدىمكى نورۋېگچەنىكوچەشىمالى سوتوچەمۇئېرچەنېۋارچەنيا" + + "مۋېزىچەنىيانكولېچەنىئوروچەنىزەماچەئوساگېلارچەئوسمان تۈركچەپانگاسىنا" + + "نچەپەھلەۋىچەپامپانگاچەپاپىيامەنتۇچەپالاۋچەقەدىمكى پارىسچەفىنىكىيەچە" + + "پوناپېئانچەقەدىمكى پروۋېنچالچەراجاستانچەراپانىيچەرومبوچەسىگانچەئارو" + + "مانچەرىۋاچەسانداۋېچەياقۇتچەسامارىتانچەسامبۇرۇچەساساكچەسانتالىچەنگام" + + "بايچەسانگۇچەسىتسىلىيەچەشوتلاندىيەچەسېكنېكاچەسېناچەسېلكاپچەشەرقىي سو" + + "ڭخايچەقەدىمكى ئىرېلاندچەشىلخاچەشانچەچاد ئەرەبچەسىداموچەجەنۇبى سامى " + + "تىللىرىلۇلې سامىچەئىنارى سامىچەسىكولت سامىچەسونىنكەچەسوغدىچەسىرانان" + + "-توڭوچەسېرېرچەساخوچەسۇكۇماچەسۇسۇچەسۈمەرچەكومورىچەكونگو سىۋالىچەكلاسس" + + "ىك سۈرىيەچەسۈرىيەچەتېمنېچەتېسوچەتېرېناچەتېتۇمچەتىگرېچەتىۋچەتوكېلاۋچ" + + "ەكىلىنگونچەتىلىنگىتچەتاماشېكچەنياسا توڭانچەتوك-پىسىنچەتوروكوچەسىمشي" + + "انچەتۇمبۇكاچەتۇۋالۇچەشىمالىي سوڭخايچەتوۋاچەمەركىزى ئاتلاس تاماچاگىت" + + "ئۇدمۇرتچەئۇگارىتىكچەئۇمبۇندۇچەغول تىلۋايچەۋوتېچەۋۇنجوچەۋالسېرچەۋولا" + + "يتاچەۋارايچەۋاشوچەقالماقچەسوگاچەياۋچەياپچەياڭبەنچەيېمباچەگۇاڭدوڭچەز" + + "اپوتېكچەبىلىس بەلگىلىرىزېناگاچەئۆلچەملىك ماراكەش تامازىتچەزۇنىچەتىل" + + " مەزمۇنى يوقزازاچەھازىرقى زامان ئۆلچەملىك ئەرەبچەئاۋستىرىيە گېرمانچە" + + "شىۋىتسارىيە ئېگىزلىك گېرمانچەئاۋسترالىيە ئىنگلىزچەكانادا ئىنگلىزچەئ" + + "ەنگلىيە ئىنگلىزچەئامېرىكا ئىنگلىزچەلاتىن ئامېرىكا ئىسپانچەياۋروپا ئ" + + "ىسپانچەمېكسىكا ئىسپانچەكانادا فىرانسۇزچەشىۋىتسارىيە فىرانسۇزچەبىراز" + + "ىلىيە پورتۇگالچەياۋروپا پورتۇگالچەسېرب-كرودىيەچەئاددىي خەنچەمۇرەككە" + + "پ خەنچە", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000e, 0x001e, 0x0030, 0x0044, 0x0052, 0x0064, 0x0076, + 0x0084, 0x0094, 0x00a2, 0x00b4, 0x00c4, 0x00d6, 0x00e8, 0x00f8, + 0x010a, 0x011c, 0x012c, 0x013a, 0x014c, 0x015e, 0x0170, 0x017e, + 0x0190, 0x019e, 0x01a8, 0x01b2, 0x01d3, 0x01e1, 0x01ed, 0x01fb, + 0x020b, 0x021b, 0x0229, 0x0235, 0x0243, 0x0255, 0x0268, 0x0278, + 0x0288, 0x0296, 0x02a2, 0x02ae, 0x02b8, 0x02c4, 0x02d4, 0x02e8, + 0x0305, 0x0319, 0x0325, 0x033d, 0x0351, 0x0363, 0x036d, 0x037d, + 0x038f, 0x039d, 0x03b2, 0x03c2, 0x03d0, 0x03de, 0x03ee, 0x03fe, + // Entry 40 - 7F + 0x0413, 0x042d, 0x0443, 0x044f, 0x0466, 0x0478, 0x0484, 0x0496, + 0x04aa, 0x04c2, 0x04d0, 0x04dc, 0x04ee, 0x04fc, 0x050c, 0x0522, + 0x0530, 0x0546, 0x0556, 0x0568, 0x0578, 0x0588, 0x0598, 0x05a4, + 0x05b0, 0x05c0, 0x05d0, 0x05de, 0x05fa, 0x0608, 0x061a, 0x062c, + 0x063a, 0x0648, 0x0663, 0x0675, 0x068d, 0x069d, 0x06ab, 0x06bd, + 0x06cf, 0x06df, 0x06ed, 0x06fb, 0x0709, 0x0717, 0x0725, 0x0744, + 0x0752, 0x0762, 0x077a, 0x0793, 0x07b6, 0x07d5, 0x07e5, 0x07f5, + 0x0809, 0x081b, 0x082b, 0x083b, 0x084f, 0x085f, 0x086b, 0x0879, + // Entry 80 - BF + 0x0887, 0x089b, 0x08a9, 0x08bb, 0x08c9, 0x08dd, 0x08e7, 0x08f9, + 0x090d, 0x0923, 0x0931, 0x094a, 0x0958, 0x0968, 0x097a, 0x0992, + 0x09a2, 0x09ae, 0x09be, 0x09ce, 0x09da, 0x09ea, 0x0a03, 0x0a11, + 0x0a1d, 0x0a2d, 0x0a3b, 0x0a4b, 0x0a59, 0x0a6b, 0x0a7f, 0x0a91, + 0x0aa1, 0x0aaf, 0x0abb, 0x0ac9, 0x0ad7, 0x0ae5, 0x0af5, 0x0b09, + 0x0b17, 0x0b27, 0x0b35, 0x0b49, 0x0b5b, 0x0b6b, 0x0b79, 0x0b85, + 0x0b95, 0x0ba5, 0x0bb1, 0x0bbb, 0x0bc7, 0x0bd5, 0x0be5, 0x0bf7, + 0x0c09, 0x0c09, 0x0c1f, 0x0c2d, 0x0c3b, 0x0c4b, 0x0c4b, 0x0c5d, + // Entry C0 - FF + 0x0c5d, 0x0c85, 0x0ca6, 0x0cb8, 0x0cc8, 0x0cd4, 0x0cd4, 0x0ce8, + 0x0ce8, 0x0cfa, 0x0cfa, 0x0cfa, 0x0d06, 0x0d06, 0x0d1c, 0x0d1c, + 0x0d2c, 0x0d3c, 0x0d48, 0x0d48, 0x0d54, 0x0d62, 0x0d62, 0x0d72, + 0x0d7e, 0x0d8c, 0x0d8c, 0x0d98, 0x0da6, 0x0da6, 0x0da6, 0x0db8, + 0x0dc6, 0x0dd2, 0x0dd2, 0x0ddc, 0x0dee, 0x0dee, 0x0dee, 0x0dfc, + 0x0dfc, 0x0e08, 0x0e16, 0x0e28, 0x0e34, 0x0e40, 0x0e4e, 0x0e60, + 0x0e6e, 0x0e7c, 0x0e8c, 0x0e9c, 0x0ea8, 0x0eb4, 0x0ec2, 0x0ed4, + 0x0ede, 0x0eea, 0x0f05, 0x0f15, 0x0f29, 0x0f39, 0x0f47, 0x0f60, + // Entry 100 - 13F + 0x0f70, 0x0f70, 0x0f87, 0x0f99, 0x0fa9, 0x0fbb, 0x0fc9, 0x0fdd, + 0x0fe9, 0x0ff9, 0x1007, 0x1015, 0x1023, 0x103a, 0x103a, 0x104a, + 0x1071, 0x107d, 0x108d, 0x109d, 0x10ab, 0x10b9, 0x10b9, 0x10d6, + 0x10e8, 0x10fa, 0x1126, 0x1126, 0x1138, 0x1138, 0x1142, 0x1156, + 0x1156, 0x1160, 0x1160, 0x118e, 0x11b1, 0x11b1, 0x11d0, 0x11ed, + 0x1201, 0x1209, 0x1209, 0x1209, 0x1215, 0x1225, 0x1225, 0x122f, + 0x1241, 0x1241, 0x127c, 0x12ac, 0x12ac, 0x12ba, 0x12d0, 0x12da, + 0x12e8, 0x1305, 0x132c, 0x132c, 0x132c, 0x1338, 0x134a, 0x1358, + // Entry 140 - 17F + 0x1358, 0x1366, 0x1366, 0x137e, 0x138e, 0x1398, 0x13b5, 0x13b5, + 0x13c1, 0x13cf, 0x13e3, 0x13f7, 0x1407, 0x1407, 0x1407, 0x1417, + 0x1427, 0x1435, 0x1450, 0x146d, 0x146d, 0x1486, 0x1496, 0x14a4, + 0x14ac, 0x14ba, 0x14c6, 0x14da, 0x14ec, 0x14f8, 0x150a, 0x1526, + 0x1526, 0x1532, 0x1532, 0x153e, 0x154c, 0x1563, 0x1563, 0x1563, + 0x156f, 0x1583, 0x1597, 0x1597, 0x15a9, 0x15bb, 0x15cd, 0x15ec, + 0x15ec, 0x15ec, 0x15fa, 0x1608, 0x161a, 0x162a, 0x1638, 0x1646, + 0x1658, 0x1668, 0x1676, 0x1684, 0x1692, 0x16a2, 0x16a2, 0x16a2, + // Entry 180 - 1BF + 0x16a2, 0x16a2, 0x16a2, 0x16b0, 0x16bc, 0x16bc, 0x16bc, 0x16d1, + 0x16e5, 0x16f3, 0x16ff, 0x170b, 0x1717, 0x1717, 0x1717, 0x1729, + 0x1735, 0x1745, 0x1757, 0x1769, 0x177d, 0x178b, 0x1797, 0x17a5, + 0x17b5, 0x17c3, 0x17cf, 0x17e3, 0x1811, 0x1821, 0x1830, 0x1840, + 0x185a, 0x1868, 0x187c, 0x188a, 0x1898, 0x1898, 0x18a8, 0x18bb, + 0x18c9, 0x18dd, 0x18ef, 0x18ef, 0x18fd, 0x190b, 0x190b, 0x190b, + 0x191b, 0x1927, 0x1942, 0x1952, 0x1960, 0x196e, 0x196e, 0x1980, + 0x1992, 0x19a0, 0x19bf, 0x19bf, 0x19cb, 0x19e4, 0x19f2, 0x1a00, + // Entry 1C0 - 1FF + 0x1a14, 0x1a2a, 0x1a3a, 0x1a4a, 0x1a60, 0x1a79, 0x1a91, 0x1aa3, + 0x1ab7, 0x1ad1, 0x1adf, 0x1adf, 0x1adf, 0x1adf, 0x1afc, 0x1afc, + 0x1b10, 0x1b10, 0x1b10, 0x1b26, 0x1b26, 0x1b4b, 0x1b4b, 0x1b4b, + 0x1b5f, 0x1b71, 0x1b71, 0x1b71, 0x1b71, 0x1b7f, 0x1b8d, 0x1b8d, + 0x1b8d, 0x1b8d, 0x1b9f, 0x1bab, 0x1bbd, 0x1bcb, 0x1be1, 0x1bf3, + 0x1c01, 0x1c13, 0x1c13, 0x1c25, 0x1c33, 0x1c49, 0x1c61, 0x1c61, + 0x1c61, 0x1c73, 0x1c7f, 0x1c7f, 0x1c8f, 0x1cac, 0x1ccf, 0x1ccf, + 0x1cdd, 0x1ce7, 0x1cfc, 0x1d0c, 0x1d0c, 0x1d0c, 0x1d30, 0x1d45, + // Entry 200 - 23F + 0x1d5e, 0x1d77, 0x1d89, 0x1d97, 0x1db2, 0x1dc0, 0x1dcc, 0x1dcc, + 0x1ddc, 0x1de8, 0x1df6, 0x1e06, 0x1e21, 0x1e40, 0x1e50, 0x1e50, + 0x1e50, 0x1e5e, 0x1e6a, 0x1e7a, 0x1e88, 0x1e96, 0x1ea0, 0x1eb2, + 0x1eb2, 0x1ec6, 0x1eda, 0x1eda, 0x1eec, 0x1f05, 0x1f1a, 0x1f1a, + 0x1f2a, 0x1f2a, 0x1f3c, 0x1f3c, 0x1f4e, 0x1f5e, 0x1f7d, 0x1f89, + 0x1fb7, 0x1fc9, 0x1fdf, 0x1ff3, 0x2000, 0x200a, 0x200a, 0x200a, + 0x200a, 0x200a, 0x2016, 0x2016, 0x2024, 0x2034, 0x2046, 0x2054, + 0x2060, 0x2060, 0x2060, 0x2070, 0x2070, 0x207c, 0x2086, 0x2090, + // Entry 240 - 27F + 0x20a0, 0x20ae, 0x20ae, 0x20c0, 0x20d2, 0x20ef, 0x20ef, 0x20ff, + 0x2133, 0x213f, 0x215b, 0x2167, 0x21a2, 0x21a2, 0x21c7, 0x21ff, + 0x2228, 0x2247, 0x226a, 0x228d, 0x22b9, 0x22d8, 0x22f7, 0x22f7, + 0x2318, 0x2343, 0x2343, 0x2343, 0x236c, 0x238f, 0x238f, 0x23aa, + 0x23c1, 0x23dc, + }, + }, + { // uk + ukLangStr, + ukLangIdx, + }, + { // ur + urLangStr, + urLangIdx, + }, + { // ur-IN + "افریقیکارسیکائیکنڑکردلٹويایزرمہمعیاری مراقشی تمازیقیجدید معیاری عربیآسان" + + " چینی", + []uint16{ // 609 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, + 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, + 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, + 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, + 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, + // Entry 40 - 7F + 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, + 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, + 0x001e, 0x001e, 0x001e, 0x0024, 0x0024, 0x0024, 0x0024, 0x002a, + 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, + 0x002a, 0x002a, 0x002a, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + // Entry 80 - BF + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + // Entry C0 - FF + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + // Entry 100 - 13F + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + // Entry 140 - 17F + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + // Entry 180 - 1BF + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + // Entry 1C0 - 1FF + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + // Entry 200 - 23F + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + // Entry 240 - 27F + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0084, 0x0084, 0x0084, 0x0084, + 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, + 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, + 0x0095, + }, + }, + { // uz + uzLangStr, + uzLangIdx, + }, + { // uz-Arab + "دریپشتواوزبیک", + []uint16{ // 170 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + // Entry 40 - 7F + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + // Entry 80 - BF + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x001a, + }, + }, + { // uz-Cyrl + "АбхазчаАфриканчаАмхарчаАрабчаАссамчаОзарбайжончаБеларусчаБолгарчаБенгалч" + + "аТибетчаБосниячаКаталанчаЧехчаУэлсчаДаниячаОлмончаГрекчаИнглизчаЭсп" + + "ерантоИспанчаЭстончаБаскчаФорсчаФинчаФижичаФарэрчаФранцузчаҒарбий ф" + + "ризианчаИрландчаГалицийчаГуараниГужаратиХаусаИбронийҲиндчаХорватчаГ" + + "аитианчаВенгрчаАрманчаИндонезиячаИгбоИсландчаИталянчаЯпончаЯванчаГр" + + "узинчаҚозоқчаХмерчаКаннадаКорейсчаКашмирчаКурдчаҚирғизчаЛотинчаЛюкс" + + "ембургчаЛаоЛитвачаЛатишчаМалагасиМаориМакедончаМалайаламМаратиМалай" + + "чаМальтачаБирманчаНепалчаГолландчаНорвегча НинорскНорвегча БокмалОр" + + "ияПанжобчаПолякчаПуштуПортугалчаКвечуаРоманчаРуминчаРусчаСанскритча" + + "СиндхиСинхалаСловакчаСловенчаСомаличаАлбанчаСербчаСунданчаШведчаСуа" + + "хилиТамилчаТелугуТожикчаТайчаТигриньяТуркманчаТонгочаТуркчаТатарчаУ" + + "йғурчаУкраинчаУрдуЎзбекВьетнамчаВолофчаХосаЙорубаХитойчаЗулуФилипин" + + "оШвейцария немисчасиГавайчаНомаълум тилСтандарт Марокаш ТамазитТил " + + "таркиби йўқЛотин Америка испанчасиФламандча", + []uint16{ // 604 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x000e, 0x000e, 0x0020, 0x0020, 0x002e, 0x002e, + 0x003a, 0x0048, 0x0048, 0x0048, 0x0060, 0x0060, 0x0072, 0x0082, + 0x0082, 0x0082, 0x0092, 0x00a0, 0x00a0, 0x00b0, 0x00c2, 0x00c2, + 0x00c2, 0x00c2, 0x00c2, 0x00cc, 0x00cc, 0x00cc, 0x00d8, 0x00e6, + 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x0100, 0x0110, 0x0122, 0x0130, + 0x013e, 0x014a, 0x0156, 0x0156, 0x0160, 0x016c, 0x017a, 0x018c, + 0x01ab, 0x01bb, 0x01bb, 0x01cd, 0x01db, 0x01eb, 0x01eb, 0x01f5, + 0x0203, 0x020f, 0x020f, 0x021f, 0x0231, 0x023f, 0x024d, 0x024d, + // Entry 40 - 7F + 0x024d, 0x0263, 0x0263, 0x026b, 0x026b, 0x026b, 0x026b, 0x027b, + 0x028b, 0x028b, 0x0297, 0x02a3, 0x02b3, 0x02b3, 0x02b3, 0x02b3, + 0x02c1, 0x02c1, 0x02cd, 0x02db, 0x02eb, 0x02eb, 0x02fb, 0x0307, + 0x0307, 0x0307, 0x0317, 0x0325, 0x033d, 0x033d, 0x033d, 0x033d, + 0x0343, 0x0351, 0x0351, 0x035f, 0x036f, 0x036f, 0x0379, 0x038b, + 0x039d, 0x039d, 0x03a9, 0x03b7, 0x03c7, 0x03d7, 0x03d7, 0x03d7, + 0x03e5, 0x03e5, 0x03f7, 0x0416, 0x0433, 0x0433, 0x0433, 0x0433, + 0x0433, 0x0433, 0x0433, 0x043b, 0x043b, 0x044b, 0x044b, 0x0459, + // Entry 80 - BF + 0x0463, 0x0477, 0x0483, 0x0491, 0x0491, 0x049f, 0x04a9, 0x04a9, + 0x04bd, 0x04bd, 0x04c9, 0x04c9, 0x04c9, 0x04d7, 0x04e7, 0x04f7, + 0x04f7, 0x04f7, 0x0507, 0x0515, 0x0521, 0x0521, 0x0521, 0x0531, + 0x053d, 0x054b, 0x0559, 0x0565, 0x0573, 0x057d, 0x058d, 0x059f, + 0x059f, 0x05ad, 0x05b9, 0x05b9, 0x05c7, 0x05c7, 0x05d5, 0x05e5, + 0x05ed, 0x05f7, 0x05f7, 0x0609, 0x0609, 0x0609, 0x0617, 0x061f, + 0x061f, 0x062b, 0x062b, 0x0639, 0x0641, 0x0641, 0x0641, 0x0641, + 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, + // Entry C0 - FF + 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, + 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, + 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, + 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, + 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, + 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, + 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, + 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, + // Entry 100 - 13F + 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, + 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, + 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, + 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0651, + 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, + 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, + 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, 0x0651, + 0x0651, 0x0651, 0x0676, 0x0676, 0x0676, 0x0676, 0x0676, 0x0676, + // Entry 140 - 17F + 0x0676, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + // Entry 180 - 1BF + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + // Entry 1C0 - 1FF + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + // Entry 200 - 23F + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, 0x0684, + 0x0684, 0x0684, 0x0684, 0x0684, 0x069b, 0x069b, 0x069b, 0x069b, + 0x069b, 0x069b, 0x069b, 0x069b, 0x069b, 0x069b, 0x069b, 0x069b, + 0x069b, 0x069b, 0x069b, 0x069b, 0x069b, 0x069b, 0x069b, 0x069b, + // Entry 240 - 27F + 0x069b, 0x069b, 0x069b, 0x069b, 0x069b, 0x069b, 0x069b, 0x069b, + 0x06c9, 0x06c9, 0x06e5, 0x06e5, 0x06e5, 0x06e5, 0x06e5, 0x06e5, + 0x06e5, 0x06e5, 0x06e5, 0x06e5, 0x0711, 0x0711, 0x0711, 0x0711, + 0x0711, 0x0711, 0x0711, 0x0723, + }, + }, + { // vai + "ꕉꕪꘋꕉꕆꕌꔸꕞꕌꖝꔆꕞꖩꔻꗂꔠꗸꘋꗩꕭꔷꗿꗡꕧꕮꔧꗥꗷꘋꕶꕱꕐꘊꔧꗨꗡꔻꘂꘋꗱꘋꔻꕌꖙꕢꔦꔺꖽꔟꗸꘋꔤꖆꕇꔻꘂꘋꔤꕼꔤꕚꔷꘂꘋꕧꕐꕇꔧꕧꕙꕇꔧ" + + "ꕃꘈꗢꖏꔸꘂꘋꕮꔒꔀꗩꕆꔻꕇꕐꔷꗍꔿꖛꕨꔬꗁꔒꔻꕶꕿꕃꔤꖄꕆꕇꘂꘋꗐꖺꔻꘂꘋꕟꖙꕡꖇꕮꔷꖬꔨꗵꘋꕚꕆꔷꕚꔤꗋꕃꖳꖴꔓꕇꘂꘋꖺꖦꔲꕩꕯ" + + "ꕆꔧꖎꖄꕑꕦꕇꔧꖮꖨꕙꔤ", + []uint16{ // 558 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0015, 0x0015, + 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x002a, 0x0036, + 0x0036, 0x0036, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, + 0x003f, 0x003f, 0x003f, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x004e, 0x004e, 0x004e, 0x004e, 0x0057, 0x005d, 0x005d, 0x0066, + 0x0066, 0x0066, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x007e, + 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, 0x0087, + 0x0087, 0x008d, 0x008d, 0x008d, 0x008d, 0x0099, 0x0099, 0x0099, + // Entry 40 - 7F + 0x0099, 0x00ab, 0x00ab, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, + 0x00c0, 0x00c0, 0x00cc, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, + 0x00d8, 0x00d8, 0x00e1, 0x00e1, 0x00ed, 0x00ed, 0x00ed, 0x00ed, + 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ed, + 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ed, 0x00ed, + 0x00ed, 0x00ed, 0x00ed, 0x00f6, 0x00f6, 0x00ff, 0x00ff, 0x00ff, + 0x0108, 0x0108, 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, + 0x010e, 0x010e, 0x010e, 0x010e, 0x010e, 0x0117, 0x0117, 0x0120, + // Entry 80 - BF + 0x0120, 0x012c, 0x012c, 0x012c, 0x012c, 0x013b, 0x014a, 0x0153, + 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, 0x0153, + 0x0153, 0x0153, 0x015c, 0x015c, 0x015c, 0x015c, 0x015c, 0x015c, + 0x0168, 0x0168, 0x0171, 0x0171, 0x0171, 0x0177, 0x0177, 0x0177, + 0x0177, 0x0177, 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, 0x018f, + 0x0195, 0x0195, 0x0195, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, + 0x01a4, 0x01ad, 0x01ad, 0x01b6, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + // Entry C0 - FF + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + // Entry 100 - 13F + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + // Entry 140 - 17F + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + // Entry 180 - 1BF + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + // Entry 1C0 - 1FF + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + // Entry 200 - 23F + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01c2, + }, + }, + { // vai-Latn + "AkaŋAmiháriLahabuBhelarusaŋBhɔgerɛŋBhɛŋgáliChɛJamáĩHɛlɛŋPooPanyɛĩPɛɛsiyɛ" + + "ŋFɛŋsiHawusaHíiŋdiHɔŋgérɛŋÍndonisiyɛŋÍgboItáliyɛŋJapaníĩJavaníĩKimɛ" + + "ɛ̃ tɛKoríyɛŋMaléeeBhɛmísiNipaliDɔchiPuŋjabhiPɔ́lésiPotokíiRomíniyɛŋ" + + "RɔshiyɛŋRawundaSomáliSúwídɛŋTamíliTáiTɔ́kiYukureniyɛŋƆduViyamíĩYórób" + + "haChaniĩZúluVai", + []uint16{ // 558 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, 0x000d, 0x000d, + 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x001e, 0x0029, + 0x0029, 0x0029, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, + 0x0034, 0x0034, 0x0034, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, + 0x003f, 0x003f, 0x003f, 0x003f, 0x0047, 0x004a, 0x004a, 0x0052, + 0x0052, 0x0052, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x0065, + 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x006b, + 0x006b, 0x0073, 0x0073, 0x0073, 0x0073, 0x0080, 0x0080, 0x0080, + // Entry 40 - 7F + 0x0080, 0x008e, 0x008e, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, + 0x009e, 0x009e, 0x00a7, 0x00b0, 0x00b0, 0x00b0, 0x00b0, 0x00b0, + 0x00b0, 0x00b0, 0x00bd, 0x00bd, 0x00c7, 0x00c7, 0x00c7, 0x00c7, + 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, + 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, + 0x00c7, 0x00c7, 0x00c7, 0x00ce, 0x00ce, 0x00d7, 0x00d7, 0x00d7, + 0x00dd, 0x00dd, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, + 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00ec, 0x00ec, 0x00f6, + // Entry 80 - BF + 0x00f6, 0x00fe, 0x00fe, 0x00fe, 0x00fe, 0x010a, 0x0115, 0x011c, + 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, 0x011c, + 0x011c, 0x011c, 0x0123, 0x0123, 0x0123, 0x0123, 0x0123, 0x0123, + 0x012e, 0x012e, 0x0135, 0x0135, 0x0135, 0x0139, 0x0139, 0x0139, + 0x0139, 0x0139, 0x0140, 0x0140, 0x0140, 0x0140, 0x0140, 0x014d, + 0x0151, 0x0151, 0x0151, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, + 0x015a, 0x0163, 0x0163, 0x016a, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + // Entry C0 - FF + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + // Entry 100 - 13F + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + // Entry 140 - 17F + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + // Entry 180 - 1BF + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + // Entry 1C0 - 1FF + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + // Entry 200 - 23F + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, + 0x016f, 0x016f, 0x016f, 0x016f, 0x016f, 0x0172, + }, + }, + { // vi + viLangStr, + viLangIdx, + }, + { // vun + "KiakanyiKiamharyiKyiarabuKyibelarusiKyibulgaryiaKyibanglaKyicheckiKyijer" + + "umaniKyigirikiKyingerezaKyihispaniaKyiajemiKyifaransaKyihausaKyihind" + + "iKyihungariKyiindonesiaKyiigboKyiitalianoKyijapaniKyijavaKyikambodia" + + "KyikoreaKyimalesiaKyiburmaKyinepaliKyiholanziKyipunjabiKyipolandiKyi" + + "renoKyiromaniaKyirusiKyinyarwandaKyisomalyiKyiswidiKyitamilKyitailan" + + "diKyiturukyiKyiukraniaKyiurduKyivietinamuKyiyorubaKyichinaKyizuluKyi" + + "vunjo", + []uint16{ // 565 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0011, 0x0011, + 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x0024, 0x0030, + 0x0030, 0x0030, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, 0x0039, + 0x0039, 0x0039, 0x0039, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, + 0x004d, 0x004d, 0x004d, 0x004d, 0x0056, 0x0060, 0x0060, 0x006b, + 0x006b, 0x006b, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x007d, + 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x007d, 0x0085, + 0x0085, 0x008d, 0x008d, 0x008d, 0x008d, 0x0097, 0x0097, 0x0097, + // Entry 40 - 7F + 0x0097, 0x00a3, 0x00a3, 0x00aa, 0x00aa, 0x00aa, 0x00aa, 0x00aa, + 0x00b5, 0x00b5, 0x00be, 0x00c5, 0x00c5, 0x00c5, 0x00c5, 0x00c5, + 0x00c5, 0x00c5, 0x00d0, 0x00d0, 0x00d8, 0x00d8, 0x00d8, 0x00d8, + 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, + 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, + 0x00d8, 0x00d8, 0x00d8, 0x00e2, 0x00e2, 0x00ea, 0x00ea, 0x00ea, + 0x00f3, 0x00f3, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, + 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x00fd, 0x0107, 0x0107, 0x0111, + // Entry 80 - BF + 0x0111, 0x0118, 0x0118, 0x0118, 0x0118, 0x0122, 0x0129, 0x0135, + 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, 0x0135, + 0x0135, 0x0135, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, + 0x0147, 0x0147, 0x014f, 0x014f, 0x014f, 0x015a, 0x015a, 0x015a, + 0x015a, 0x015a, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x016e, + 0x0175, 0x0175, 0x0175, 0x0181, 0x0181, 0x0181, 0x0181, 0x0181, + 0x0181, 0x018a, 0x018a, 0x0192, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + // Entry C0 - FF + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + // Entry 100 - 13F + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + // Entry 140 - 17F + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + // Entry 180 - 1BF + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + // Entry 1C0 - 1FF + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + // Entry 200 - 23F + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x0199, 0x0199, 0x01a1, + }, + }, + { // wae + "AbčasišAfrikánsAmharišArabišAssamesišAymaraSerbaidšanišWísrussišBulgariš" + + "BengališTibetišBosnišKatalanišTšečišWalisišDänišTitšMalediwišButaniš" + + "GričišEnglišSchpanišEstnišBaskišPersišFinišFidšianišWälšIrišGalizišG" + + "uaraniGujaratiHausaHebräišHindiKroatišHaitianišUngarišArmenišIndones" + + "išIgboIisländišItalienišJapanišGeorgišKazačišKambodšanišKannadaKorea" + + "nišKašmirišKurdišKirgisišLatinišLuxemburgišLingalaLaotišLitauišLetti" + + "šMalagásiMaoriMazedonišMalayalamMongolišMarathiMalaíšMaltesišBurmes" + + "išNordndebeleNepalesišHoländišNorwegiš NynorskNorwegiš BokmålNyanjaO" + + "riyaOsétišPandšabišPolnišPaštuPortugisišQuečuaRätromanišRundiRumäniš" + + "RusišRuandišSanskritSindhiNordsamišSangoSingalesišSlowakišSlowenišSa" + + "moanišShonaSomališAlbanišSerbišSwaziSüdsothoSundanesišSchwedišSuahel" + + "išTamilišTeluguTadšikišThailändišTigrinjaTurkmenišTswanaTongaTürkišT" + + "songaTaitišUigurišUkrainišUrduUsbekišVendaVietnamesišWolofXhosaYorub" + + "aChinesišZuluEfikFilipinišHawaíanišNordsothoJakutišTetumNiwmelanesiš" + + "Unbekannti SchpračWalserÖštričišes TitšSchwizer HočtitšAuštrališes E" + + "nglišKanadišes EnglišBritišes EnglišAmerikanišes EnglišLatiamerikani" + + "šes SchpanišIberišes SchpanišKanadišes WälšSchwizer WälšFlämišBrasi" + + "lianišes PortugisišIberišes PortugisišVereifačts ChinesišTraditionel" + + "ls Chinesiš", + []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0009, 0x0009, 0x0012, 0x0012, 0x001a, 0x001a, + 0x0021, 0x002b, 0x002b, 0x0031, 0x003f, 0x003f, 0x004a, 0x0053, + 0x0053, 0x0053, 0x005c, 0x0064, 0x0064, 0x006b, 0x0075, 0x0075, + 0x0075, 0x0075, 0x0075, 0x007e, 0x007e, 0x007e, 0x0086, 0x008d, + 0x0092, 0x009c, 0x00a4, 0x00a4, 0x00ac, 0x00b3, 0x00b3, 0x00bc, + 0x00c3, 0x00ca, 0x00d1, 0x00d1, 0x00d7, 0x00e2, 0x00e2, 0x00e8, + 0x00e8, 0x00ed, 0x00ed, 0x00f5, 0x00fc, 0x0104, 0x0104, 0x0109, + 0x0112, 0x0117, 0x0117, 0x011f, 0x0129, 0x0131, 0x0139, 0x0139, + // Entry 40 - 7F + 0x0139, 0x0143, 0x0143, 0x0147, 0x0147, 0x0147, 0x0147, 0x0152, + 0x015c, 0x015c, 0x0164, 0x0164, 0x016c, 0x016c, 0x016c, 0x016c, + 0x0175, 0x0175, 0x0182, 0x0189, 0x0192, 0x0192, 0x019c, 0x01a3, + 0x01a3, 0x01a3, 0x01ac, 0x01b4, 0x01c0, 0x01c0, 0x01c0, 0x01c7, + 0x01ce, 0x01d6, 0x01d6, 0x01dd, 0x01e6, 0x01e6, 0x01eb, 0x01f5, + 0x01fe, 0x0207, 0x020e, 0x0216, 0x021f, 0x0228, 0x0228, 0x0233, + 0x023d, 0x023d, 0x0247, 0x0258, 0x0269, 0x0269, 0x0269, 0x026f, + 0x026f, 0x026f, 0x026f, 0x0274, 0x027c, 0x0287, 0x0287, 0x028e, + // Entry 80 - BF + 0x0294, 0x029f, 0x02a6, 0x02b2, 0x02b7, 0x02c0, 0x02c6, 0x02ce, + 0x02d6, 0x02d6, 0x02dc, 0x02e6, 0x02eb, 0x02f6, 0x02ff, 0x0308, + 0x0311, 0x0316, 0x031e, 0x0326, 0x032d, 0x0332, 0x033b, 0x0346, + 0x034f, 0x0358, 0x0360, 0x0366, 0x0370, 0x037c, 0x0384, 0x038e, + 0x0394, 0x0399, 0x03a1, 0x03a7, 0x03a7, 0x03ae, 0x03b6, 0x03bf, + 0x03c3, 0x03cb, 0x03d0, 0x03dc, 0x03dc, 0x03dc, 0x03e1, 0x03e6, + 0x03e6, 0x03ec, 0x03ec, 0x03f5, 0x03f9, 0x03f9, 0x03f9, 0x03f9, + 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, + // Entry C0 - FF + 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, + 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, + 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, + 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, + 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, + 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, + 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, + 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, + // Entry 100 - 13F + 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, + 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, + 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03f9, 0x03fd, 0x03fd, 0x03fd, + 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x03fd, 0x0407, + 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, + 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, + 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, + 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, 0x0407, + // Entry 140 - 17F + 0x0407, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, + 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, + 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, + 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, + 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, + 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, + 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, + 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, + // Entry 180 - 1BF + 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, + 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, + 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, + 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, + 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, + 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, + 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, + 0x0412, 0x0412, 0x0412, 0x0412, 0x0412, 0x041b, 0x041b, 0x041b, + // Entry 1C0 - 1FF + 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, + 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, + 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, + 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, + 0x041b, 0x041b, 0x041b, 0x041b, 0x041b, 0x0423, 0x0423, 0x0423, + 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, + 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, + 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, + // Entry 200 - 23F + 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, + 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, 0x0423, + 0x0423, 0x0423, 0x0423, 0x0423, 0x0428, 0x0428, 0x0428, 0x0428, + 0x0428, 0x0428, 0x0428, 0x0428, 0x0428, 0x0428, 0x0435, 0x0435, + 0x0435, 0x0435, 0x0435, 0x0435, 0x0435, 0x0435, 0x0435, 0x0435, + 0x0435, 0x0435, 0x0435, 0x0435, 0x0448, 0x0448, 0x0448, 0x0448, + 0x0448, 0x0448, 0x0448, 0x0448, 0x0448, 0x044e, 0x044e, 0x044e, + 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, + // Entry 240 - 27F + 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, + 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, 0x044e, 0x0462, 0x0474, + 0x0489, 0x049b, 0x04ac, 0x04c1, 0x04dc, 0x04ef, 0x04ef, 0x04ef, + 0x0500, 0x050f, 0x050f, 0x0517, 0x0531, 0x0546, 0x0546, 0x0546, + 0x055b, 0x0572, + }, + }, + { // xog + "OluakaaniOluamharikiOluwarabuOlubelarusiOlubulugariyaOlubengaliOluceekeO" + + "ludaakiOluyonaaniOlungerezaOlusipanyaOluperusiOlufalansaOluhawuzaOlu" + + "hinduOluhangareOluyindonezyaOluyiboOluyitaleOlujapaniOlunnajjavaOluk" + + "meOlukoreyaOlumalayiOlubbamaOlunepaliOluholandiOlupunjabiOlupolandiO" + + "lupotugiiziOlulomaniyaOlulasaOlunarwandaOlusomaliyaOluswideniOlutami" + + "iruOluttaayiOlutakeOluyukurayineOlu-uruduOluvyetinaamuOluyorubaOluca" + + "yinaOluzzuluOlusoga", + []uint16{ // 574 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0014, 0x0014, + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0028, 0x0035, + 0x0035, 0x0035, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, + 0x003f, 0x003f, 0x003f, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, + 0x004f, 0x004f, 0x004f, 0x004f, 0x0059, 0x0063, 0x0063, 0x006d, + 0x006d, 0x006d, 0x0076, 0x0076, 0x0076, 0x0076, 0x0076, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0089, + 0x0089, 0x0091, 0x0091, 0x0091, 0x0091, 0x009b, 0x009b, 0x009b, + // Entry 40 - 7F + 0x009b, 0x00a8, 0x00a8, 0x00af, 0x00af, 0x00af, 0x00af, 0x00af, + 0x00b8, 0x00b8, 0x00c1, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, + 0x00cc, 0x00cc, 0x00d2, 0x00d2, 0x00db, 0x00db, 0x00db, 0x00db, + 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, + 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, + 0x00db, 0x00db, 0x00db, 0x00e4, 0x00e4, 0x00ec, 0x00ec, 0x00ec, + 0x00f5, 0x00f5, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, + 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x0109, 0x0109, 0x0113, + // Entry 80 - BF + 0x0113, 0x011f, 0x011f, 0x011f, 0x011f, 0x012a, 0x0131, 0x013c, + 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, + 0x013c, 0x013c, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, + 0x0151, 0x0151, 0x015b, 0x015b, 0x015b, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x016b, 0x016b, 0x016b, 0x016b, 0x016b, 0x0178, + 0x0181, 0x0181, 0x0181, 0x018e, 0x018e, 0x018e, 0x018e, 0x018e, + 0x018e, 0x0197, 0x0197, 0x01a0, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + // Entry C0 - FF + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + // Entry 100 - 13F + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + // Entry 140 - 17F + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + // Entry 180 - 1BF + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + // Entry 1C0 - 1FF + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + // Entry 200 - 23F + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, + 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x01af, + }, + }, + { // yav + "akánɛamalíképakaspielúsebulgálɛpengálɛ́ɛcɛ́kɛ́ɛŋndiámanyavánɛíŋgilísénu" + + "ɛspanyɔ́lɛnupɛ́lisɛfeleŋsípakasíndíɔ́ŋgɛíndonísiɛíboitáliɛndiámanyá" + + "vanɛkímɛɛkolíemáliɛbímanɛnunipálɛnilándɛnupunsapíɛ́nupolonɛ́ɛnupɔlit" + + "ukɛ́ɛnulumɛ́ŋɛnulúsenuluándɛ́ɛnusomalíɛnusuetuanutámulenutáyɛnutúluk" + + "enukeleniɛ́ŋɛnulutúnufiɛtnamíɛŋnuyolúpasinúɛnusulúnuasue", + []uint16{ // 577 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x000f, 0x000f, + 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x001e, 0x0027, + 0x0027, 0x0027, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, + 0x0034, 0x0034, 0x0034, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x004a, 0x004a, 0x004a, 0x004a, 0x0052, 0x005e, 0x005e, 0x006e, + 0x006e, 0x006e, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x0083, + 0x0083, 0x0083, 0x0083, 0x0083, 0x0083, 0x0083, 0x0083, 0x0088, + 0x0088, 0x008e, 0x008e, 0x008e, 0x008e, 0x0097, 0x0097, 0x0097, + // Entry 40 - 7F + 0x0097, 0x00a3, 0x00a3, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, + 0x00af, 0x00af, 0x00b7, 0x00bf, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00bf, 0x00bf, 0x00c7, 0x00c7, 0x00cd, 0x00cd, 0x00cd, 0x00cd, + 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, + 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, + 0x00cd, 0x00cd, 0x00cd, 0x00d4, 0x00d4, 0x00dc, 0x00dc, 0x00dc, + 0x00e6, 0x00e6, 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00ef, + 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00ef, 0x00fd, 0x00fd, 0x010a, + // Entry 80 - BF + 0x010a, 0x011a, 0x011a, 0x011a, 0x011a, 0x0127, 0x012e, 0x013c, + 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, + 0x013c, 0x013c, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, + 0x014f, 0x014f, 0x0158, 0x0158, 0x0158, 0x0160, 0x0160, 0x0160, + 0x0160, 0x0160, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0179, + 0x0180, 0x0180, 0x0180, 0x0190, 0x0190, 0x0190, 0x0190, 0x0190, + 0x0190, 0x0199, 0x0199, 0x01a0, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + // Entry C0 - FF + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + // Entry 100 - 13F + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + // Entry 140 - 17F + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + // Entry 180 - 1BF + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + // Entry 1C0 - 1FF + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + // Entry 200 - 23F + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + // Entry 240 - 27F + 0x01ad, + }, + }, + { // yi + "אַפֿאַראַפֿריקאַנסאַמהאַרישאַראַגאנישאַראַבישאַסאַמישאַזערביידזשאַנישבעל" + + "אַרוסישבולגאַרישבענגאַלישטיבעטישברעטאנישבאסנישקאַטאַלאנישטשעכישקלוי" + + "סטער־סלאַווישוועלשישדענישדײַטשגריכישענגלישעספּעראַנטאשפּאַנישעסטישב" + + "אַסקישפּערסישפֿינישפֿידזשיפֿאַראישפֿראַנצויזישמערב־פֿריזישאירישסקאט" + + "יש געלישגאַלישישמאַנקסהאַוסאַהעברעאישהינדיקראאַטישאונגערישאַרמענישא" + + "ינדאנעזישאידאאיסלאַנדישאיטאַליענישיאַפּאַנישיאַוואַנעזישגרוזינישקאַ" + + "זאַכישכמערקאַנאַדאַקארעאישקורדישקארנישקירגיזישלאטיינישלוקסעמבורגישל" + + "אַאליטווישלעטישמאַארישמאַקעדאנישמאַלאַיאַלאַםמאנגאלישמאַלטעזישבירמא" + + "ַנישנעפּאַלישהאלענדישנײַ־נארוועגישנארוועגישאקסיטאַנישאסעטישפּוילישפ" + + "ּאַשטאָפּארטוגעזישרומענישרוסישסאַנסקריטסאַרדישסינדהינארדסאַמישסינהא" + + "ַלישסלאוואַקישסלאווענישסאַמאאַניששאנאַסאמאַלישאַלבאַנישסערביששוועדי" + + "שסוואַהילישטאַמילטורקמענישטאָטערישאוקראַאינישאורדואוזבעקישוויעטנאַמ" + + "עזישוואלאַפּוקייִדישכינעזישזולואַקאַדישאַלט ענגלישאַראַמישבאַלינעזי" + + "שבײַערישסעבואַנישקרים־טערקישקאַשובישאונטער־סארבישזשאלא־פֿאנימיטל ענ" + + "גלישפֿיליפּינאאַלט־פֿראַנצויזישדרום־פֿריזישמזרח־פֿריזישמיטל הויכדוי" + + "טשאַלט־ הויכדויטשגאטישאוראַלט־גריכישפידזשי הינדיאייבער־סארבישלאזשבא" + + "ָןיידיש־פערסישלאַדינאליווישמיזאנאַפּאליטַנישנידערדײַטשאַלט פּערסישפ" + + "ּרייסישרוסינישסיציליאַנישסקאטסאַלט־אירישאונטער שלעזישslyסומערישקאמא" + + "רישקאנגא־סוואַהיליששלעזישטיגרעאומבאַוואוסטע שפּראַךמערב פֿלעמישפֿלע" + + "מישסערבא־קראאַטיש", + []uint16{ // 608 elements + // Entry 0 - 3F + 0x0000, 0x000e, 0x000e, 0x000e, 0x0024, 0x0024, 0x0036, 0x004a, + 0x005a, 0x006a, 0x006a, 0x006a, 0x008a, 0x008a, 0x009e, 0x00b0, + 0x00b0, 0x00b0, 0x00c2, 0x00d0, 0x00e0, 0x00ec, 0x0102, 0x0102, + 0x0102, 0x0102, 0x0102, 0x010e, 0x0130, 0x0130, 0x013e, 0x0148, + 0x0152, 0x0152, 0x0152, 0x0152, 0x015e, 0x016a, 0x0180, 0x0190, + 0x019a, 0x01a8, 0x01b6, 0x01b6, 0x01c2, 0x01d0, 0x01e0, 0x01f8, + 0x0210, 0x021a, 0x0231, 0x0241, 0x0241, 0x0241, 0x024d, 0x025b, + 0x026b, 0x0275, 0x0275, 0x0285, 0x0285, 0x0295, 0x02a5, 0x02a5, + // Entry 40 - 7F + 0x02a5, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02c1, 0x02d5, + 0x02eb, 0x02eb, 0x02ff, 0x0317, 0x0327, 0x0327, 0x0327, 0x0327, + 0x0339, 0x0339, 0x0341, 0x0353, 0x0361, 0x0361, 0x0361, 0x036d, + 0x036d, 0x0379, 0x0389, 0x0399, 0x03b1, 0x03b1, 0x03b1, 0x03b1, + 0x03b9, 0x03c7, 0x03c7, 0x03d1, 0x03d1, 0x03d1, 0x03df, 0x03f3, + 0x040d, 0x041d, 0x041d, 0x041d, 0x042f, 0x0441, 0x0441, 0x0441, + 0x0453, 0x0453, 0x0463, 0x047d, 0x048f, 0x048f, 0x048f, 0x048f, + 0x04a3, 0x04a3, 0x04a3, 0x04a3, 0x04af, 0x04af, 0x04af, 0x04bd, + // Entry 80 - BF + 0x04cd, 0x04e3, 0x04e3, 0x04e3, 0x04e3, 0x04f1, 0x04fb, 0x04fb, + 0x050d, 0x051b, 0x0527, 0x053b, 0x053b, 0x054d, 0x0561, 0x0573, + 0x0587, 0x0591, 0x05a1, 0x05b3, 0x05bf, 0x05bf, 0x05bf, 0x05bf, + 0x05cd, 0x05e1, 0x05ed, 0x05ed, 0x05ed, 0x05ed, 0x05ed, 0x05ff, + 0x05ff, 0x05ff, 0x05ff, 0x05ff, 0x060f, 0x060f, 0x060f, 0x0625, + 0x062f, 0x063f, 0x063f, 0x0659, 0x066d, 0x066d, 0x066d, 0x066d, + 0x0679, 0x0679, 0x0679, 0x0687, 0x068f, 0x068f, 0x068f, 0x068f, + 0x068f, 0x068f, 0x068f, 0x068f, 0x068f, 0x069f, 0x069f, 0x069f, + // Entry C0 - FF + 0x069f, 0x069f, 0x06b4, 0x06b4, 0x06c4, 0x06c4, 0x06c4, 0x06c4, + 0x06c4, 0x06c4, 0x06c4, 0x06c4, 0x06c4, 0x06c4, 0x06c4, 0x06c4, + 0x06c4, 0x06c4, 0x06d8, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, + 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, + 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, + 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06e6, + 0x06e6, 0x06e6, 0x06e6, 0x06e6, 0x06f8, 0x06f8, 0x06f8, 0x06f8, + 0x06f8, 0x06f8, 0x06f8, 0x06f8, 0x06f8, 0x06f8, 0x06f8, 0x06f8, + // Entry 100 - 13F + 0x06f8, 0x06f8, 0x070e, 0x071e, 0x071e, 0x071e, 0x071e, 0x071e, + 0x071e, 0x071e, 0x071e, 0x071e, 0x071e, 0x0738, 0x0738, 0x0738, + 0x0738, 0x074e, 0x074e, 0x074e, 0x074e, 0x074e, 0x074e, 0x074e, + 0x074e, 0x074e, 0x0763, 0x0763, 0x0763, 0x0763, 0x0763, 0x0777, + 0x0777, 0x0777, 0x0777, 0x0777, 0x0799, 0x0799, 0x07b1, 0x07c9, + 0x07c9, 0x07c9, 0x07c9, 0x07c9, 0x07c9, 0x07c9, 0x07c9, 0x07c9, + 0x07c9, 0x07c9, 0x07e4, 0x0801, 0x0801, 0x0801, 0x0801, 0x080b, + 0x080b, 0x0827, 0x0827, 0x0827, 0x0827, 0x0827, 0x0827, 0x0827, + // Entry 140 - 17F + 0x0827, 0x0827, 0x083e, 0x083e, 0x083e, 0x083e, 0x0858, 0x0858, + 0x0858, 0x0858, 0x0858, 0x0858, 0x0858, 0x0858, 0x0858, 0x0868, + 0x0868, 0x0868, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, + 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, + 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, + 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, + 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, 0x0880, + 0x0880, 0x088e, 0x088e, 0x088e, 0x088e, 0x088e, 0x088e, 0x088e, + // Entry 180 - 1BF + 0x089a, 0x089a, 0x089a, 0x089a, 0x089a, 0x089a, 0x089a, 0x089a, + 0x089a, 0x089a, 0x089a, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, + 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, + 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, + 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, + 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, 0x08a2, + 0x08bc, 0x08bc, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, + 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, + // Entry 1C0 - 1FF + 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, + 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08e7, 0x08e7, + 0x08e7, 0x08e7, 0x08e7, 0x08e7, 0x08f7, 0x08f7, 0x08f7, 0x08f7, + 0x08f7, 0x08f7, 0x08f7, 0x08f7, 0x08f7, 0x08f7, 0x08f7, 0x08f7, + 0x0905, 0x0905, 0x0905, 0x0905, 0x0905, 0x0905, 0x0905, 0x0905, + 0x0905, 0x0905, 0x0905, 0x0905, 0x0905, 0x091b, 0x0925, 0x0925, + 0x0925, 0x0925, 0x0925, 0x0925, 0x0925, 0x0925, 0x0939, 0x0939, + 0x0939, 0x0939, 0x0939, 0x0939, 0x0952, 0x0955, 0x0955, 0x0955, + // Entry 200 - 23F + 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, + 0x0955, 0x0955, 0x0963, 0x0971, 0x0991, 0x0991, 0x0991, 0x099d, + 0x099d, 0x099d, 0x099d, 0x099d, 0x099d, 0x09a7, 0x09a7, 0x09a7, + 0x09a7, 0x09a7, 0x09a7, 0x09a7, 0x09a7, 0x09a7, 0x09a7, 0x09a7, + 0x09a7, 0x09a7, 0x09a7, 0x09a7, 0x09a7, 0x09a7, 0x09a7, 0x09a7, + 0x09a7, 0x09a7, 0x09a7, 0x09a7, 0x09d0, 0x09d0, 0x09d0, 0x09d0, + 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, + 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, + // Entry 240 - 27F + 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, + 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, + 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, 0x09e7, + 0x09e7, 0x09e7, 0x09e7, 0x09f5, 0x09f5, 0x09f5, 0x09f5, 0x0a11, + }, + }, + { // yo + "Èdè AfrikaniÈdè AkaniÈdè AmarikiÈdè ArabikiTi AssamÈdè AzerbaijaniÈdè Be" + + "larusiÈdè BugariaÈdè BengaliÈdè BretoniÈdè BosniaÈdè CatalaÈdè seeki" + + "Èdè WelshiÈdè Ilẹ̀ DenmarkÈdè Ilẹ̀ GemaniÈdè GirikiÈdè Gẹ̀ẹ́sìÈdè E" + + "sperantoÈdè SipanisiÈdè EstoniaÈdè BaskiÈdè PasiaÈdè FinisiÈdè Faroe" + + "siÈdè FaranséÈdè FrisiaÈdè IrelandÈdè Gaelik ti Ilu ScotlandÈdè Gali" + + "ciaÈdè GuaraniÈdè GujaratiÈdè HausaÈdè HeberuÈdè HindiÈdè KroatiaÈdè" + + " HungariaÈdè Ile ArmeniaÈdè pipoÈdè IndonasiaIru ÈdèÈdè IboÈdè Icela" + + "ndicÈdè ItalianiÈdè JapanisiÈdè JavanasiÈdè GeorgiaÈdè kameriÈdè Kan" + + "nadaÈdè KoriaÈdè LatiniÈdè LithuaniaÈdè LatvianuÈdè MacedoniaÈdè mar" + + "athiÈdè MalayaÈdè MaltaÈdè BumiisiÈdè NepaliÈdè DukiÈdè NorwayÈdè Oc" + + "citaniÈdè PunjabiÈdè Ilẹ̀ PolandiÈdè PọtugiÈdè RomaniaÈdè ̣RọọsiaÈdè" + + " RuwandaÈdè awon ara IndoÈdè SindhiÈdè SinhaleseÈdè SlovakiÈdè Slove" + + "niaÈdè ara SomaliaÈdè AlbaniaÈdè SerbiaÈdè SesotoÈdè SudaniÈdè Suwid" + + "iisiÈdè SwahiliÈdè TamiliÈdè TeluguÈdè TaiÈdè TigrinyaÈdè TurkmenÈdè" + + " TọọkisiÈdè UkaniaÈdè UduÈdè UzbekÈdè JetinamuÈdè XhosaÈdè YiddishiÈ" + + "dè YorùbáÈdè MandariÈdè ṢuluÈdè TagalogiÈdè KlingoniÈdè Serbo-Croati" + + "ani", + []uint16{ // 608 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000e, 0x0019, 0x0026, 0x0026, + 0x0033, 0x003b, 0x003b, 0x003b, 0x004c, 0x004c, 0x005a, 0x0067, + 0x0067, 0x0067, 0x0074, 0x0074, 0x0081, 0x008d, 0x0099, 0x0099, + 0x0099, 0x0099, 0x0099, 0x00a4, 0x00a4, 0x00a4, 0x00b0, 0x00c5, + 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00e5, 0x00f9, 0x0108, 0x0116, + 0x0123, 0x012e, 0x0139, 0x0139, 0x0145, 0x0145, 0x0152, 0x0160, + 0x016c, 0x0179, 0x0195, 0x01a2, 0x01af, 0x01bd, 0x01bd, 0x01c8, + 0x01d4, 0x01df, 0x01df, 0x01ec, 0x01ec, 0x01fa, 0x020b, 0x020b, + // Entry 40 - 7F + 0x0215, 0x0224, 0x022d, 0x0236, 0x0236, 0x0236, 0x0236, 0x0245, + 0x0253, 0x0253, 0x0261, 0x026f, 0x027c, 0x027c, 0x027c, 0x027c, + 0x027c, 0x027c, 0x0288, 0x0295, 0x02a0, 0x02a0, 0x02a0, 0x02a0, + 0x02a0, 0x02a0, 0x02a0, 0x02ac, 0x02ac, 0x02ac, 0x02ac, 0x02ac, + 0x02ac, 0x02bb, 0x02bb, 0x02c9, 0x02c9, 0x02c9, 0x02c9, 0x02d8, + 0x02d8, 0x02d8, 0x02e5, 0x02f1, 0x02fc, 0x0309, 0x0309, 0x0309, + 0x0315, 0x0315, 0x031f, 0x031f, 0x032b, 0x032b, 0x032b, 0x032b, + 0x0339, 0x0339, 0x0339, 0x0339, 0x0339, 0x0346, 0x0346, 0x035b, + // Entry 80 - BF + 0x035b, 0x0369, 0x0369, 0x0369, 0x0369, 0x0376, 0x0388, 0x0395, + 0x03a8, 0x03a8, 0x03b4, 0x03b4, 0x03b4, 0x03c3, 0x03d0, 0x03de, + 0x03de, 0x03de, 0x03ef, 0x03fc, 0x0408, 0x0408, 0x0414, 0x0420, + 0x042f, 0x043c, 0x0448, 0x0454, 0x0454, 0x045d, 0x046b, 0x0478, + 0x0478, 0x0478, 0x0489, 0x0489, 0x0489, 0x0489, 0x0489, 0x0495, + 0x049e, 0x04a9, 0x04a9, 0x04b7, 0x04b7, 0x04b7, 0x04b7, 0x04c2, + 0x04d0, 0x04de, 0x04de, 0x04eb, 0x04f7, 0x04f7, 0x04f7, 0x04f7, + 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, + // Entry C0 - FF + 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, + 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, + 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, + 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, + 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, + 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, + 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, + 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, + // Entry 100 - 13F + 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, + 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, + 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, + 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x04f7, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + // Entry 140 - 17F + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + // Entry 180 - 1BF + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + // Entry 1C0 - 1FF + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + // Entry 200 - 23F + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, 0x0505, + 0x0505, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, + 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, + 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, + 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, + 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, + // Entry 240 - 27F + 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, + 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, + 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, + 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0513, 0x0528, + }, + }, + { // yo-BJ + "Èdè AfrikaniÈdè AkaniÈdè AmarikiÈdè ArabikiTi AssamÈdè AzerbaijaniÈdè Be" + + "larusiÈdè BugariaÈdè BengaliÈdè BretoniÈdè BosniaÈdè CatalaÈdè seeki" + + "Èdè WelshiÈdè Ilɛ̀ DenmarkÈdè Ilɛ̀ GemaniÈdè GirikiÈdè Gɛ̀ɛ́sìÈdè E" + + "sperantoÈdè SipanisiÈdè EstoniaÈdè BaskiÈdè PasiaÈdè FinisiÈdè Faroe" + + "siÈdè FaranséÈdè FrisiaÈdè IrelandÈdè Gaelik ti Ilu ScotlandÈdè Gali" + + "ciaÈdè GuaraniÈdè GujaratiÈdè HausaÈdè HeberuÈdè HindiÈdè KroatiaÈdè" + + " HungariaÈdè Ile ArmeniaÈdè pipoÈdè IndonasiaIru ÈdèÈdè IboÈdè Icela" + + "ndicÈdè ItalianiÈdè JapanisiÈdè JavanasiÈdè GeorgiaÈdè kameriÈdè Kan" + + "nadaÈdè KoriaÈdè LatiniÈdè LithuaniaÈdè LatvianuÈdè MacedoniaÈdè mar" + + "athiÈdè MalayaÈdè MaltaÈdè BumiisiÈdè NepaliÈdè DukiÈdè NorwayÈdè Oc" + + "citaniÈdè PunjabiÈdè Ilɛ̀ PolandiÈdè PɔtugiÈdè RomaniaÈdè ̣RɔɔsiaÈdè" + + " RuwandaÈdè awon ara IndoÈdè SindhiÈdè SinhaleseÈdè SlovakiÈdè Slove" + + "niaÈdè ara SomaliaÈdè AlbaniaÈdè SerbiaÈdè SesotoÈdè SudaniÈdè Suwid" + + "iisiÈdè SwahiliÈdè TamiliÈdè TeluguÈdè TaiÈdè TigrinyaÈdè TurkmenÈdè" + + " TɔɔkisiÈdè UkaniaÈdè UduÈdè UzbekÈdè JetinamuÈdè XhosaÈdè YiddishiÈ" + + "dè YorùbáÈdè MandariÈdè ShuluÈdè TagalogiÈdè KlingoniÈdè Serbo-Croat" + + "iani", + []uint16{ // 608 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000e, 0x0019, 0x0026, 0x0026, + 0x0033, 0x003b, 0x003b, 0x003b, 0x004c, 0x004c, 0x005a, 0x0067, + 0x0067, 0x0067, 0x0074, 0x0074, 0x0081, 0x008d, 0x0099, 0x0099, + 0x0099, 0x0099, 0x0099, 0x00a4, 0x00a4, 0x00a4, 0x00b0, 0x00c4, + 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00e3, 0x00f5, 0x0104, 0x0112, + 0x011f, 0x012a, 0x0135, 0x0135, 0x0141, 0x0141, 0x014e, 0x015c, + 0x0168, 0x0175, 0x0191, 0x019e, 0x01ab, 0x01b9, 0x01b9, 0x01c4, + 0x01d0, 0x01db, 0x01db, 0x01e8, 0x01e8, 0x01f6, 0x0207, 0x0207, + // Entry 40 - 7F + 0x0211, 0x0220, 0x0229, 0x0232, 0x0232, 0x0232, 0x0232, 0x0241, + 0x024f, 0x024f, 0x025d, 0x026b, 0x0278, 0x0278, 0x0278, 0x0278, + 0x0278, 0x0278, 0x0284, 0x0291, 0x029c, 0x029c, 0x029c, 0x029c, + 0x029c, 0x029c, 0x029c, 0x02a8, 0x02a8, 0x02a8, 0x02a8, 0x02a8, + 0x02a8, 0x02b7, 0x02b7, 0x02c5, 0x02c5, 0x02c5, 0x02c5, 0x02d4, + 0x02d4, 0x02d4, 0x02e1, 0x02ed, 0x02f8, 0x0305, 0x0305, 0x0305, + 0x0311, 0x0311, 0x031b, 0x031b, 0x0327, 0x0327, 0x0327, 0x0327, + 0x0335, 0x0335, 0x0335, 0x0335, 0x0335, 0x0342, 0x0342, 0x0356, + // Entry 80 - BF + 0x0356, 0x0363, 0x0363, 0x0363, 0x0363, 0x0370, 0x0380, 0x038d, + 0x03a0, 0x03a0, 0x03ac, 0x03ac, 0x03ac, 0x03bb, 0x03c8, 0x03d6, + 0x03d6, 0x03d6, 0x03e7, 0x03f4, 0x0400, 0x0400, 0x040c, 0x0418, + 0x0427, 0x0434, 0x0440, 0x044c, 0x044c, 0x0455, 0x0463, 0x0470, + 0x0470, 0x0470, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x048b, + 0x0494, 0x049f, 0x049f, 0x04ad, 0x04ad, 0x04ad, 0x04ad, 0x04b8, + 0x04c6, 0x04d4, 0x04d4, 0x04e1, 0x04ec, 0x04ec, 0x04ec, 0x04ec, + 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, + // Entry C0 - FF + 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, + 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, + 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, + 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, + 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, + 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, + 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, + 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, + // Entry 100 - 13F + 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, + 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, + 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, + 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04ec, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + // Entry 140 - 17F + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + // Entry 180 - 1BF + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + // Entry 1C0 - 1FF + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + // Entry 200 - 23F + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, + 0x04fa, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, + 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, + 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, + 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, + 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, + // Entry 240 - 27F + 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, + 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, + 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, + 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x0508, 0x051d, + }, + }, + { // zgh + "ⵜⴰⴽⴰⵏⵜⵜⴰⵎⵀⴰⵔⵉⵜⵜⴰⵄⵔⴰⴱⵜⵜⴰⴱⵉⵍⴰⵔⵓⵙⵜⵜⴰⴱⵍⵖⴰⵔⵉⵜⵜⴰⴱⵏⵖⴰⵍⵉⵜⵜⴰⵜⵛⵉⴽⵉⵜⵜⴰⵍⵉⵎⴰⵏⵜⵜⴰⴳⵔⵉⴳⵉ" + + "ⵜⵜⴰⵏⴳⵍⵉⵣⵜⵜⴰⵙⴱⵏⵢⵓⵍⵉⵜⵜⴰⴼⵓⵔⵙⵉⵜⵜⴰⴼⵔⴰⵏⵙⵉⵙⵜⵜⴰⵀⴰⵡⵙⴰⵜⵜⴰⵀⵉⵏⴷⵉⵜⵜⴰⵀⵏⵖⴰⵔⵉⵜⵜⴰⵏⴷ" + + "ⵓⵏⵉⵙⵉⵜⵜⵉⴳⴱⵓⵜⵜⴰⵟⴰⵍⵢⴰⵏⵜⵜⴰⵊⴰⴱⴱⵓⵏⵉⵜⵜⴰⵊⴰⴱⴰⵏⵉⵜⵜⴰⵅⵎⵉⵔⵜⵜⴰⴽⵓⵔⵉⵜⵜⴰⵎⴰⵍⴰⵡⵉⵜⵜⴰⴱ" + + "ⵉⵔⵎⴰⵏⵉⵜⵜⴰⵏⵉⴱⴰⵍⵉⵜⵜⴰⵀⵓⵍⴰⵏⴷⵉⵜⵜⴰⴱⵏⵊⴰⴱⵉⵜⵜⴰⴱⵓⵍⵓⵏⵉⵜⵜⴰⴱⵕⵟⵇⵉⵣⵜⵜⴰⵔⵓⵎⴰⵏⵉⵜⵜⴰⵔⵓ" + + "ⵙⵉⵜⵜⴰⵔⵓⵡⴰⵏⴷⵉⵜⵜⴰⵙⵓⵎⴰⵍⵉⵜⵜⴰⵙⵡⵉⴷⵉⵜⵜⴰⵜⴰⵎⵉⵍⵜⵜⴰⵜⴰⵢⵍⴰⵏⴷⵉⵜⵜⴰⵜⵓⵔⴽⵉⵜⵜⵓⴽⵔⴰⵏⵉⵜⵜ" + + "ⵓⵔⴷⵓⵜⵜⴰⴱⵉⵜⵏⴰⵎⵉⵜⵜⴰⵢⵔⵓⴱⴰⵜⵜⴰⵛⵉⵏⵡⵉⵜⵜⴰⵣⵓⵍⵓⵜⵜⴰⵎⴰⵣⵉⵖⵜ", + []uint16{ // 585 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x002a, 0x002a, + 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x003f, 0x005d, 0x0078, + 0x0078, 0x0078, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, 0x0093, + 0x0093, 0x0093, 0x0093, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, + 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00db, 0x00f3, 0x00f3, 0x0111, + 0x0111, 0x0111, 0x0129, 0x0129, 0x0129, 0x0129, 0x0129, 0x0147, + 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x015f, + 0x015f, 0x0177, 0x0177, 0x0177, 0x0177, 0x0192, 0x0192, 0x0192, + // Entry 40 - 7F + 0x0192, 0x01b0, 0x01b0, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, + 0x01dd, 0x01dd, 0x01fb, 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, + 0x0216, 0x0216, 0x022b, 0x022b, 0x0240, 0x0240, 0x0240, 0x0240, + 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, + 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, 0x0240, + 0x0240, 0x0240, 0x0240, 0x025b, 0x025b, 0x0279, 0x0279, 0x0279, + 0x0294, 0x0294, 0x02b2, 0x02b2, 0x02b2, 0x02b2, 0x02b2, 0x02b2, + 0x02b2, 0x02b2, 0x02b2, 0x02b2, 0x02b2, 0x02cd, 0x02cd, 0x02e8, + // Entry 80 - BF + 0x02e8, 0x0303, 0x0303, 0x0303, 0x0303, 0x031e, 0x0333, 0x0351, + 0x0351, 0x0351, 0x0351, 0x0351, 0x0351, 0x0351, 0x0351, 0x0351, + 0x0351, 0x0351, 0x036c, 0x036c, 0x036c, 0x036c, 0x036c, 0x036c, + 0x0384, 0x0384, 0x039c, 0x039c, 0x039c, 0x03bd, 0x03bd, 0x03bd, + 0x03bd, 0x03bd, 0x03d5, 0x03d5, 0x03d5, 0x03d5, 0x03d5, 0x03ed, + 0x03ff, 0x03ff, 0x03ff, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, + 0x041d, 0x0435, 0x0435, 0x044d, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + // Entry C0 - FF + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + // Entry 100 - 13F + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + // Entry 140 - 17F + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + // Entry 180 - 1BF + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + // Entry 1C0 - 1FF + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + // Entry 200 - 23F + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + // Entry 240 - 27F + 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, 0x0462, + 0x047a, + }, + }, + { // zh + zhLangStr, + zhLangIdx, + }, + { // zh-Hant + zhHantLangStr, + zhHantLangIdx, + }, + { // zh-Hant-HK + "阿塞拜疆文巴什基爾文布里多尼文波斯尼亞文加泰隆尼亞文世界語加里西亞文克羅地亞文意大利文格魯吉亞文坎納達文老撾文馬拉加斯文馬拉雅拉姆文馬耳他文奧里" + + "雅文盧旺達文信德語斯洛文尼亞文修納文索馬里文泰米爾文湯加文烏爾都文瑞士德文毛里裘斯克里奧爾文西非書面語言(N’ko)伊納里薩米文剛果" + + "史瓦希里文瓦爾皮里文摩洛哥標準塔馬齊格特文南阿塞拜疆文奧地利德文瑞士德語澳洲英文加拿大英文英國英文美國英文拉丁美洲西班牙文歐洲西班牙" + + "文墨西哥西班牙文加拿大法文瑞士法文荷蘭低地德文巴西葡萄牙語歐洲葡萄牙文摩爾多瓦羅馬尼亞文", + []uint16{ // 607 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x000f, 0x001e, 0x001e, 0x001e, + 0x001e, 0x001e, 0x001e, 0x001e, 0x002d, 0x003c, 0x004e, 0x004e, + 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, + 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x004e, 0x0057, 0x0057, + 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0057, 0x0057, 0x0057, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, + // Entry 40 - 7F + 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0090, 0x0090, 0x0090, 0x0090, + 0x0090, 0x0090, 0x0090, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, + 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, + 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00b4, 0x00b4, 0x00b4, 0x00b4, + 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00d2, 0x00d2, 0x00d2, 0x00d2, + 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, 0x00d2, + 0x00d2, 0x00d2, 0x00d2, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + // Entry 80 - BF + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00ea, + 0x00ea, 0x00ea, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x00f3, 0x0105, + 0x0105, 0x010e, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, 0x011a, + 0x011a, 0x011a, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, + 0x0126, 0x012f, 0x012f, 0x012f, 0x012f, 0x012f, 0x012f, 0x012f, + 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, + 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, + 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, + // Entry C0 - FF + 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, + 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, + 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, + 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, + 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, + 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, + 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, + 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, + // Entry 100 - 13F + 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, + 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, + 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, + 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, + 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, + 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, + 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, 0x013b, + 0x013b, 0x013b, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, + // Entry 140 - 17F + 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, + 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, + 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, + 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, + 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, + 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, + 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, + 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, + // Entry 180 - 1BF + 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, + 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, + 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, + 0x0147, 0x0147, 0x0147, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, + 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, + 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, + 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, + 0x0162, 0x0162, 0x0162, 0x0162, 0x0180, 0x0180, 0x0180, 0x0180, + // Entry 1C0 - 1FF + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + // Entry 200 - 23F + 0x0192, 0x0192, 0x0192, 0x0192, 0x0192, 0x0192, 0x0192, 0x0192, + 0x0192, 0x0192, 0x0192, 0x0192, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01a7, + 0x01a7, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, + // Entry 240 - 27F + 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, 0x01b6, + 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01e9, 0x01f8, 0x0204, + 0x0210, 0x021f, 0x022b, 0x0237, 0x024f, 0x0261, 0x0276, 0x0276, + 0x0285, 0x0291, 0x02a3, 0x02a3, 0x02b5, 0x02c7, 0x02e2, + }, + }, + { // zu + zuLangStr, + zuLangIdx, + }, +} + +var afLangStr string = "" + // Size: 2000 bytes + "AbkasiesAfrikaansAkanAmhariesArabiesAssameesAymaraAzerbeidjansBaskirBelo" + + "-RussiesBulgaarsBambaraBengaalsTibettaansBretonsBosniesKatalaansTsjetsje" + + "nKorsikaansTsjeggiesChuvashWalliesDeensDuitsDivehiDzongkhaEweGrieksEngel" + + "sEsperantoSpaansEstniesBaskiesPersiesFinsFidjiaansFaroeesFransWes-FriesI" + + "ersSkotse GalliesGalisiesGuaraniGoedjaratiManxHausaHebreeusHindiKroaties" + + "HaïtiaansHongaarsArmeensInterlinguaIndonesiesIgboSichuan YiYslandsItalia" + + "ansInnuïtiesJapanneesJavaansGeorgiesKongoleesKikuyuKazaksKalaallisutKhme" + + "rKannadaKoreaansKasjmirsKoerdiesKorniesKirgisiesLatynLuxemburgsGandaLing" + + "aalsLaoLitausLuba-KatangaLettiesMalgassiesMaoriMasedoniesMalabaarsMongoo" + + "lsMarathiMaleisMalteesBirmaansNoord-NdebeleNepaleesNederlandsNoorweegse " + + "NynorskNoorse BokmålSuid-NdebeleNyanjaOksitaansOromoOriyaOssetiesPandjab" + + "iPoolsPasjtoPortugeesQuechuaReto-RomaansRundiRoemeensRussiesRwandeesSans" + + "kritSindhiNoord-SamiSangoSinhalaSlowaaksSloweensSamoaansShonaSomaliesAlb" + + "aneesSerwiesSwaziSuid-SothoSundaneesSweedsSwahiliTamilTeloegoeTadzjieksT" + + "haiTigrinyaTurkmeensTswanaTongaansTurksTsongaTataarsTahitiesUighurOekraï" + + "ensOerdoeOezbeeksVendaViëtnameesWolofXhosaJiddisjYorubaSjineesZoeloeAkol" + + "iAghemArameesMapucheAsuBembaBenaWes-BalochiBodoSjigaCherokeesSorani Koer" + + "diesTaitaZarmaLae SorbiesDualaJola-FonyiEmbuEfikAntieke EgiptiesFilippyn" + + "sGaaGagauzGotiesAntieke GrieksSwitserse DuitsGusiiHawaiiesHoog-SorbiesNg" + + "ombaMachameKabyleKambaMakondeKabuverdianuKoyra ChiiniKalenjinKomi-Permya" + + "ksKonkaniShambalaBafiaLangiLakotaLoziNoord-LuriLuba-LuluaLuoLuyiaMasaiMe" + + "ruMorisjenMakhuwa-MeettoMeta’MohawkMundangVeelvuldige taleMasanderaniNam" + + "aLae DuitsKwasioN’KoNoord-SothoNuerNyankoleK’iche’RomboRwaSamburuSanguSu" + + "id-KoerdiesSenaKoyraboro SenniTachelhitSuid-SamiLule SamiInari SamiSkolt" + + " SamiSwahili (Kongo)TesoTetumKlingonTok PisinToemboekaTasawaqSentraal At" + + "las TamazightOnbekende of ongeldige taalVaiVunjoWarlpiriSogaStandaard Ma" + + "rokkaanse TamazightGeen linguistiese inhoudModerne Standaard ArabiesSwit" + + "serse hoog-DuitsNedersaksiesVlaamsMoldawies" + +var afLangIdx = []uint16{ // 607 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0008, 0x0008, 0x0011, 0x0015, 0x001d, 0x001d, + 0x0024, 0x002c, 0x002c, 0x0032, 0x003e, 0x0044, 0x0050, 0x0058, + 0x0058, 0x005f, 0x0067, 0x0071, 0x0078, 0x007f, 0x0088, 0x0091, + 0x0091, 0x009b, 0x009b, 0x00a4, 0x00a4, 0x00ab, 0x00b2, 0x00b7, + 0x00bc, 0x00c2, 0x00ca, 0x00cd, 0x00d3, 0x00d9, 0x00e2, 0x00e8, + 0x00ef, 0x00f6, 0x00fd, 0x00fd, 0x0101, 0x010a, 0x0111, 0x0116, + 0x011f, 0x0123, 0x0131, 0x0139, 0x0140, 0x014a, 0x014e, 0x0153, + 0x015b, 0x0160, 0x0160, 0x0168, 0x0172, 0x017a, 0x0181, 0x0181, + // Entry 40 - 7F + 0x018c, 0x0196, 0x0196, 0x019a, 0x01a4, 0x01a4, 0x01a4, 0x01ab, + 0x01b4, 0x01be, 0x01c7, 0x01ce, 0x01d6, 0x01df, 0x01e5, 0x01e5, + 0x01eb, 0x01f6, 0x01fb, 0x0202, 0x020a, 0x020a, 0x0212, 0x021a, + 0x021a, 0x0221, 0x022a, 0x022f, 0x0239, 0x023e, 0x023e, 0x0246, + 0x0249, 0x024f, 0x025b, 0x0262, 0x026c, 0x026c, 0x0271, 0x027b, + 0x0284, 0x028c, 0x0293, 0x0299, 0x02a0, 0x02a8, 0x02a8, 0x02b5, + 0x02bd, 0x02bd, 0x02c7, 0x02d9, 0x02e7, 0x02f3, 0x02f3, 0x02f9, + 0x0302, 0x0302, 0x0307, 0x030c, 0x0314, 0x031c, 0x031c, 0x0321, + // Entry 80 - BF + 0x0327, 0x0330, 0x0337, 0x0343, 0x0348, 0x0350, 0x0357, 0x035f, + 0x0367, 0x0367, 0x036d, 0x0377, 0x037c, 0x0383, 0x038b, 0x0393, + 0x039b, 0x03a0, 0x03a8, 0x03b0, 0x03b7, 0x03bc, 0x03c6, 0x03cf, + 0x03d5, 0x03dc, 0x03e1, 0x03e9, 0x03f2, 0x03f6, 0x03fe, 0x0407, + 0x040d, 0x0415, 0x041a, 0x0420, 0x0427, 0x042f, 0x0435, 0x043f, + 0x0445, 0x044d, 0x0452, 0x045d, 0x045d, 0x045d, 0x0462, 0x0467, + 0x046e, 0x0474, 0x0474, 0x047b, 0x0481, 0x0481, 0x0486, 0x0486, + 0x0486, 0x0486, 0x0486, 0x048b, 0x048b, 0x048b, 0x048b, 0x048b, + // Entry C0 - FF + 0x048b, 0x048b, 0x048b, 0x048b, 0x0492, 0x0499, 0x0499, 0x0499, + 0x0499, 0x0499, 0x0499, 0x0499, 0x049c, 0x049c, 0x049c, 0x049c, + 0x049c, 0x049c, 0x049c, 0x049c, 0x049c, 0x049c, 0x049c, 0x049c, + 0x049c, 0x04a1, 0x04a1, 0x04a5, 0x04a5, 0x04a5, 0x04b0, 0x04b0, + 0x04b0, 0x04b0, 0x04b0, 0x04b0, 0x04b0, 0x04b0, 0x04b0, 0x04b0, + 0x04b0, 0x04b4, 0x04b4, 0x04b4, 0x04b4, 0x04b4, 0x04b4, 0x04b4, + 0x04b4, 0x04b4, 0x04b4, 0x04b4, 0x04b4, 0x04b9, 0x04b9, 0x04b9, + 0x04b9, 0x04b9, 0x04b9, 0x04b9, 0x04b9, 0x04c2, 0x04c2, 0x04d1, + // Entry 100 - 13F + 0x04d1, 0x04d1, 0x04d1, 0x04d1, 0x04d1, 0x04d1, 0x04d6, 0x04d6, + 0x04d6, 0x04d6, 0x04d6, 0x04db, 0x04db, 0x04e6, 0x04e6, 0x04eb, + 0x04eb, 0x04f5, 0x04f5, 0x04f5, 0x04f9, 0x04fd, 0x04fd, 0x050d, + 0x050d, 0x050d, 0x050d, 0x050d, 0x050d, 0x050d, 0x050d, 0x0516, + 0x0516, 0x0516, 0x0516, 0x0516, 0x0516, 0x0516, 0x0516, 0x0516, + 0x0516, 0x0519, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, + 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x051f, 0x0525, + 0x0525, 0x0533, 0x0542, 0x0542, 0x0542, 0x0547, 0x0547, 0x0547, + // Entry 140 - 17F + 0x0547, 0x054f, 0x054f, 0x054f, 0x054f, 0x054f, 0x055b, 0x055b, + 0x055b, 0x055b, 0x055b, 0x055b, 0x055b, 0x055b, 0x055b, 0x055b, + 0x0561, 0x0568, 0x0568, 0x0568, 0x0568, 0x0568, 0x056e, 0x056e, + 0x056e, 0x0573, 0x0573, 0x0573, 0x0573, 0x0573, 0x057a, 0x0586, + 0x0586, 0x0586, 0x0586, 0x0586, 0x0586, 0x0592, 0x0592, 0x0592, + 0x0592, 0x059a, 0x059a, 0x05a7, 0x05ae, 0x05ae, 0x05ae, 0x05ae, + 0x05ae, 0x05ae, 0x05ae, 0x05ae, 0x05b6, 0x05bb, 0x05bb, 0x05bb, + 0x05bb, 0x05bb, 0x05c0, 0x05c0, 0x05c0, 0x05c0, 0x05c0, 0x05c0, + // Entry 180 - 1BF + 0x05c0, 0x05c6, 0x05c6, 0x05c6, 0x05ca, 0x05d4, 0x05d4, 0x05de, + 0x05de, 0x05de, 0x05e1, 0x05e1, 0x05e6, 0x05e6, 0x05e6, 0x05e6, + 0x05e6, 0x05e6, 0x05e6, 0x05e6, 0x05e6, 0x05eb, 0x05eb, 0x05eb, + 0x05eb, 0x05eb, 0x05ef, 0x05f7, 0x05f7, 0x0605, 0x060c, 0x060c, + 0x060c, 0x060c, 0x060c, 0x0612, 0x0612, 0x0612, 0x0619, 0x0629, + 0x0629, 0x0629, 0x0629, 0x0629, 0x0629, 0x0629, 0x0634, 0x0634, + 0x0634, 0x0638, 0x0641, 0x0641, 0x0641, 0x0641, 0x0641, 0x0647, + 0x0647, 0x0647, 0x0647, 0x0647, 0x064d, 0x0658, 0x065c, 0x065c, + // Entry 1C0 - 1FF + 0x065c, 0x0664, 0x0664, 0x0664, 0x0664, 0x0664, 0x0664, 0x0664, + 0x0664, 0x0664, 0x0664, 0x0664, 0x0664, 0x0664, 0x0664, 0x0664, + 0x0664, 0x0664, 0x0664, 0x0664, 0x0664, 0x0664, 0x066f, 0x066f, + 0x066f, 0x066f, 0x066f, 0x066f, 0x066f, 0x0674, 0x0674, 0x0674, + 0x0674, 0x0674, 0x0674, 0x0677, 0x0677, 0x0677, 0x0677, 0x067e, + 0x067e, 0x067e, 0x067e, 0x067e, 0x0683, 0x0683, 0x0683, 0x0683, + 0x0690, 0x0690, 0x0694, 0x0694, 0x0694, 0x06a3, 0x06a3, 0x06a3, + 0x06ac, 0x06ac, 0x06ac, 0x06ac, 0x06ac, 0x06ac, 0x06b5, 0x06be, + // Entry 200 - 23F + 0x06c8, 0x06d2, 0x06d2, 0x06d2, 0x06d2, 0x06d2, 0x06d2, 0x06d2, + 0x06d2, 0x06d2, 0x06d2, 0x06d2, 0x06e1, 0x06e1, 0x06e1, 0x06e1, + 0x06e1, 0x06e1, 0x06e5, 0x06e5, 0x06ea, 0x06ea, 0x06ea, 0x06ea, + 0x06ea, 0x06f1, 0x06f1, 0x06f1, 0x06f1, 0x06f1, 0x06fa, 0x06fa, + 0x06fa, 0x06fa, 0x06fa, 0x06fa, 0x0703, 0x0703, 0x070a, 0x070a, + 0x0722, 0x0722, 0x0722, 0x0722, 0x073d, 0x0740, 0x0740, 0x0740, + 0x0740, 0x0740, 0x0740, 0x0740, 0x0745, 0x0745, 0x0745, 0x0745, + 0x0745, 0x074d, 0x074d, 0x074d, 0x074d, 0x0751, 0x0751, 0x0751, + // Entry 240 - 27F + 0x0751, 0x0751, 0x0751, 0x0751, 0x0751, 0x0751, 0x0751, 0x0751, + 0x0770, 0x0770, 0x0788, 0x0788, 0x07a1, 0x07a1, 0x07a1, 0x07b5, + 0x07b5, 0x07b5, 0x07b5, 0x07b5, 0x07b5, 0x07b5, 0x07b5, 0x07b5, + 0x07b5, 0x07b5, 0x07c1, 0x07c7, 0x07c7, 0x07c7, 0x07d0, +} // Size: 1238 bytes + +var amLangStr string = "" + // Size: 5352 bytes + "አፋርኛአብሐዚኛአቬስታንአፍሪካንኛአካንኛአማርኛአራጎንስዓረብኛአሳሜዛዊአቫሪክአያማርኛአዘርባጃንኛባስኪርኛቤላራሻኛቡልጋሪ" + + "ኛቢስላምኛባምባርኛቤንጋሊኛቲቤታንኛብሬቶንኛቦስኒያንኛካታላንኛችችንቻሞሮኮርሲካኛክሪቼክኛቸርች ስላቪክቹቫሽወልሽዴኒሽ" + + "ጀርመንዲቬህድዞንግኻኛኢዊግሪክኛእንግሊዝኛኤስፐራንቶስፓንሽኛኢስቶኒያንኛባስክኛፐርሺያኛፊኒሽፊጂኛፋሮኛፈረንሳይኛየምዕ" + + "ራብ ፍሪስኛአይሪሽእስኮትስ ጌልክኛጋሊሺያጓራኒኛጉጃርቲኛማንክስኛሃውሳኛዕብራስጥሒንዱኛክሮሽያንኛሃይትኛሀንጋሪኛአርመ" + + "ናዊኢንቴርሊንጓኢንዶኔዥኛእንተርሊንግወኢግቦኛሲቹንዪኛእኑፒያቅኛአይስላንድኛጣሊያንኛእኑክቲቱትኛጃፓንኛጃቫንኛጆርጂያን" + + "ኮንጎኛኪኩዩካዛክኛካላሊሱትኛክመርኛ ማእከላዊካናዳኛኮሪያኛካሽሚርኛኩርድሽኛኮርኒሽኪርጊዝኛላቲንኛሉክዘምበርገርኛጋንዳ" + + "ኛሊንጋላኛላውስኛሉቴንያንኛሉባ ካታንጋላትቪያንማላጋስኛማዮሪኛማሴዶንኛማላያላምኛሞንጎላዊኛማራቲኛማላይኛማልቲስኛቡርማ" + + "ኛናኡሩሰሜን ንዴብሌኔፓሊኛደችየኖርዌይ ናይኖርስክየኖርዌይ ቦክማልንያንጃኦኪታንኛኦሮሞኛኦሪያኛኦሴቲክፑንጃብኛፖሊሽኛ" + + "ፓሽቶኛፖርቹጋልኛኵቿኛሮማንሽሩንዲኛሮማኒያንራሽያኛኪንያርዋንድኛሳንስክሪትኛሲንድሂኛሰሜናዊ ሳሚሳንጎኛሲንሃልኛስሎቫክ" + + "ኛስሎቪኛሳሞአኛሾናኛሱማልኛልቤኒኛሰርቢኛስዋቲኛሶዞኛሱዳንኛስዊድንኛስዋሂሊኛታሚልኛተሉጉኛታጂኪኛታይኛትግርኛቱርክመንኛ" + + "ጽዋናዊኛቶንጋኛቱርክኛጾንጋኛታታርኛታሂታንኛኡዊግሁርኛዩክሬንኛኡርዱኛኡዝቤክኛቬንዳቪትናምኛቮላፑክኛዎሎፍኛዞሳኛይዲሽኛ" + + "ዮሩባዊኛዡዋንግኛቻይንኛዙሉኛአቻይንኛአኮሊኛአዳንግሜአድይግሄአፍሪሂሊአገምአይኑአካዲያንአላባማአልዩትአንጊካአራማይክማ" + + "ፑቼአራኦናአራፓሆየአልጄሪያ ዓረብኛአራዋክአሱየአሜሪካ የምልክት ቋንቋአውስትሪያንአዋድሂባሉቺባሊኔስባቫሪያንባሳባሙን" + + "ባታካ ቶባቤጃቤምባቤታዊቤናባፉትባዳጋየምዕራብ ባሎቺቦጁሪቢኮልቢኒባንጃርቢሹንፑሪያባክህቲያሪብራጅብራሁዪቦዶአኮስቡሪያ" + + "ትቡጊኔዝቡሉብሊንካዶካሪብካዩጋአትሳምካቡዋኖቺጋኛቺብቻቻጋታይቹክስቺኑክ ጃርጎንቾክታዋቺፔውያንቼሮኬኛችዬኔየሶራኒ ኩር" + + "ድኛኮፕቲክካፒዝኖንክሪሚያን ተርኪሽዳኮታዳርግዋታይታኛዳላዌርዶግሪብዲንካዛርማኛዶግሪየታችኛው ሰርቢያንኛሴንተራል ዱሰ" + + "ንዱዋላኛጆላ ፎንያኛድዩላዳዛጋኢቦኛኤፊክየጥንታዊ ግብጽኛሴንተራል ዩፒክፊሊፒንኛካጁን ፍሬንችአርፒታንጋጋጉዝኛግዕዝኛ" + + "የጥንታዊ ግሪክየስዊዝ ጀርመንጉስሊኛሃዊያኛየላይኛው ሶርቢያንኛንጎባኛማቻሜኛካብይልካምባማኮንዴካቡቨርዲያኑኮይራ ቺኒ" + + "ካለንጂንኮሚ ፔርምያክኮካኒሻምባላባፊያኮሎኝያንላንጊላኮታሎዚኛሰሜናዊ ሉሪሉባ-ሉሏሉኦሉዪያማሳይሜሩሞሪሲየኛማኩዋ ሜቶ" + + "ሜታሞሃውክሙንዳንግክሪክማዛንደራኒናማየታችኛው ጀርመንኦ ናጋክዋሲዮንኮሰሜናዊ ሶቶኑዌርክላሲክ ኔዋሪኒያንኮልኛኪቼቺም" + + "ቦራዞ ሃይላንድ ኩቹዋሮምቦአሮማንያንርዋሳምቡሩሳንጉደቡባዊ ኩዲሽሴናኮይራቦሮ ሴኒታቼልሂትቻዲያን ዓረብኛሲዳምኛደቡባ" + + "ዊ ሳሚሉሌ ሳሚኢናሪ ሳሚስኮልት ሳሚኮሞሪያንኮንጎ ስዋሂሊክላሲክ ኔይራቴሶቴተምትግረክሊንጎንኛቶክ ፒሲንቱምቡካታሳዋ" + + "ቅመካከለኛ አትላስ ታማዚግትያልታወቀ ቋንቋቫይቩንጆዋርልፒሪሶጋካንቶኒዝብሊስይምቦልስመደበኛ የሞሮኮ ታማዚግትቋንቋዊ" + + " ይዘት አይደለምዘመናዊ መደበኛ ዓረብኛየኦስትሪያ ጀርመንየስዊዝ ከፍተኛ ጀርመንኛየአውስትራሊያ እንግሊዝኛየካናዳ እን" + + "ግሊዝኛየብሪቲሽ እንግሊዝኛየአሜሪካ እንግሊዝኛየላቲን አሜሪካ ስፓኒሽየአውሮፓ ስፓንሽኛየሜክሲኮ ስፓንሽኛየካናዳ ፈ" + + "ረንሳይኛየስዊዝ ፈረንሳይኛየታችኛው ሳክሰንፍሌሚሽየብራዚል ፖርቹጋልኛየአውሮፓ ፖርቹጋልኛሞልዳቫዊናቀለል ያለ ቻይን" + + "ኛባህላዊ ቻይንኛ" + +var amLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000c, 0x001b, 0x002a, 0x003c, 0x0048, 0x0054, 0x0063, + 0x006f, 0x007e, 0x008a, 0x0099, 0x00ae, 0x00bd, 0x00cc, 0x00db, + 0x00ea, 0x00f9, 0x0108, 0x0117, 0x0126, 0x0138, 0x0147, 0x0150, + 0x0159, 0x0168, 0x016e, 0x0177, 0x018d, 0x0196, 0x019f, 0x01a8, + 0x01b4, 0x01bd, 0x01cf, 0x01d5, 0x01e1, 0x01f3, 0x0205, 0x0214, + 0x0229, 0x0235, 0x0244, 0x0244, 0x024d, 0x0256, 0x025f, 0x0271, + 0x028d, 0x0299, 0x02b5, 0x02c1, 0x02cd, 0x02dc, 0x02eb, 0x02f7, + 0x0306, 0x0312, 0x0312, 0x0324, 0x0330, 0x033f, 0x034e, 0x034e, + // Entry 40 - 7F + 0x0363, 0x0375, 0x038d, 0x0399, 0x03a8, 0x03ba, 0x03ba, 0x03cf, + 0x03de, 0x03f3, 0x03ff, 0x040b, 0x041a, 0x0426, 0x042f, 0x042f, + 0x043b, 0x044d, 0x0469, 0x0475, 0x0481, 0x0481, 0x0490, 0x049f, + 0x049f, 0x04ab, 0x04ba, 0x04c6, 0x04e1, 0x04ed, 0x04ed, 0x04fc, + 0x0508, 0x051a, 0x052d, 0x053c, 0x054b, 0x054b, 0x0557, 0x0566, + 0x0578, 0x058a, 0x0596, 0x05a2, 0x05b1, 0x05bd, 0x05c6, 0x05dc, + 0x05e8, 0x05e8, 0x05ee, 0x0610, 0x062c, 0x062c, 0x062c, 0x0638, + 0x0647, 0x0647, 0x0653, 0x065f, 0x066b, 0x067a, 0x067a, 0x0686, + // Entry 80 - BF + 0x0692, 0x06a4, 0x06ad, 0x06b9, 0x06c5, 0x06d4, 0x06e0, 0x06f8, + 0x070d, 0x070d, 0x071c, 0x072f, 0x073b, 0x074a, 0x0759, 0x0765, + 0x0771, 0x077a, 0x0786, 0x0792, 0x079e, 0x07aa, 0x07b3, 0x07bf, + 0x07ce, 0x07dd, 0x07e9, 0x07f5, 0x0801, 0x080a, 0x0816, 0x0828, + 0x0837, 0x0843, 0x084f, 0x085b, 0x0867, 0x0876, 0x0888, 0x0897, + 0x08a3, 0x08b2, 0x08bb, 0x08ca, 0x08d9, 0x08d9, 0x08e5, 0x08ee, + 0x08fa, 0x0909, 0x0918, 0x0924, 0x092d, 0x093c, 0x0948, 0x0957, + 0x0966, 0x0966, 0x0975, 0x097e, 0x0987, 0x0996, 0x09a2, 0x09ae, + // Entry C0 - FF + 0x09ae, 0x09ae, 0x09ae, 0x09ba, 0x09c9, 0x09d2, 0x09de, 0x09ea, + 0x0a09, 0x0a15, 0x0a15, 0x0a15, 0x0a1b, 0x0a44, 0x0a59, 0x0a59, + 0x0a65, 0x0a6e, 0x0a7a, 0x0a89, 0x0a8f, 0x0a98, 0x0aa8, 0x0aa8, + 0x0aae, 0x0ab7, 0x0ac0, 0x0ac6, 0x0acf, 0x0ad8, 0x0af1, 0x0afa, + 0x0b03, 0x0b09, 0x0b15, 0x0b15, 0x0b15, 0x0b27, 0x0b39, 0x0b42, + 0x0b4e, 0x0b54, 0x0b5d, 0x0b69, 0x0b75, 0x0b7b, 0x0b84, 0x0b84, + 0x0b8a, 0x0b93, 0x0b9c, 0x0ba8, 0x0bb4, 0x0bbd, 0x0bc6, 0x0bd2, + 0x0bdb, 0x0bdb, 0x0bf1, 0x0bfd, 0x0c0c, 0x0c18, 0x0c21, 0x0c3a, + // Entry 100 - 13F + 0x0c46, 0x0c55, 0x0c71, 0x0c71, 0x0c7a, 0x0c86, 0x0c92, 0x0c9e, + 0x0c9e, 0x0caa, 0x0cb3, 0x0cbf, 0x0cc8, 0x0cea, 0x0d03, 0x0d0f, + 0x0d0f, 0x0d22, 0x0d2b, 0x0d34, 0x0d3d, 0x0d46, 0x0d46, 0x0d62, + 0x0d62, 0x0d62, 0x0d62, 0x0d7b, 0x0d7b, 0x0d7b, 0x0d7b, 0x0d8a, + 0x0d8a, 0x0d8a, 0x0da0, 0x0da0, 0x0da0, 0x0daf, 0x0daf, 0x0daf, + 0x0daf, 0x0db2, 0x0dbe, 0x0dbe, 0x0dbe, 0x0dbe, 0x0dbe, 0x0dca, + 0x0dca, 0x0dca, 0x0dca, 0x0dca, 0x0dca, 0x0dca, 0x0dca, 0x0dca, + 0x0dca, 0x0de3, 0x0dfc, 0x0dfc, 0x0dfc, 0x0e08, 0x0e08, 0x0e08, + // Entry 140 - 17F + 0x0e08, 0x0e14, 0x0e14, 0x0e14, 0x0e14, 0x0e14, 0x0e36, 0x0e36, + 0x0e36, 0x0e36, 0x0e36, 0x0e36, 0x0e36, 0x0e36, 0x0e36, 0x0e36, + 0x0e42, 0x0e4e, 0x0e4e, 0x0e4e, 0x0e4e, 0x0e4e, 0x0e5a, 0x0e5a, + 0x0e5a, 0x0e63, 0x0e63, 0x0e63, 0x0e63, 0x0e63, 0x0e6f, 0x0e84, + 0x0e84, 0x0e84, 0x0e84, 0x0e84, 0x0e84, 0x0e94, 0x0e94, 0x0e94, + 0x0e94, 0x0ea3, 0x0ea3, 0x0eb9, 0x0ec2, 0x0ec2, 0x0ec2, 0x0ec2, + 0x0ec2, 0x0ec2, 0x0ec2, 0x0ec2, 0x0ece, 0x0ed7, 0x0ee6, 0x0ee6, + 0x0ee6, 0x0ee6, 0x0eef, 0x0eef, 0x0eef, 0x0eef, 0x0eef, 0x0eef, + // Entry 180 - 1BF + 0x0eef, 0x0ef8, 0x0ef8, 0x0ef8, 0x0f01, 0x0f14, 0x0f14, 0x0f21, + 0x0f21, 0x0f21, 0x0f27, 0x0f27, 0x0f30, 0x0f30, 0x0f30, 0x0f30, + 0x0f30, 0x0f30, 0x0f30, 0x0f30, 0x0f30, 0x0f39, 0x0f39, 0x0f39, + 0x0f39, 0x0f39, 0x0f3f, 0x0f4e, 0x0f4e, 0x0f5e, 0x0f64, 0x0f64, + 0x0f64, 0x0f64, 0x0f64, 0x0f70, 0x0f70, 0x0f70, 0x0f7f, 0x0f7f, + 0x0f88, 0x0f88, 0x0f88, 0x0f88, 0x0f88, 0x0f88, 0x0f9a, 0x0f9a, + 0x0f9a, 0x0fa0, 0x0fbc, 0x0fbc, 0x0fbc, 0x0fbc, 0x0fc6, 0x0fd2, + 0x0fd2, 0x0fd2, 0x0fd2, 0x0fd2, 0x0fd8, 0x0feb, 0x0ff4, 0x100a, + // Entry 1C0 - 1FF + 0x100a, 0x101c, 0x101c, 0x101c, 0x101c, 0x101c, 0x101c, 0x101c, + 0x101c, 0x101c, 0x101c, 0x101c, 0x101c, 0x101c, 0x101c, 0x101c, + 0x101c, 0x101c, 0x101c, 0x101c, 0x101c, 0x101c, 0x1022, 0x104b, + 0x104b, 0x104b, 0x104b, 0x104b, 0x104b, 0x1054, 0x1054, 0x1054, + 0x1054, 0x1054, 0x1066, 0x106c, 0x106c, 0x106c, 0x106c, 0x1078, + 0x1078, 0x1078, 0x1078, 0x1078, 0x1081, 0x1081, 0x1081, 0x1081, + 0x1097, 0x1097, 0x109d, 0x109d, 0x109d, 0x10b3, 0x10b3, 0x10b3, + 0x10c2, 0x10c2, 0x10db, 0x10e7, 0x10e7, 0x10e7, 0x10fa, 0x1107, + // Entry 200 - 23F + 0x1117, 0x112a, 0x112a, 0x112a, 0x112a, 0x112a, 0x112a, 0x112a, + 0x112a, 0x112a, 0x112a, 0x1139, 0x114f, 0x1165, 0x1165, 0x1165, + 0x1165, 0x1165, 0x116b, 0x116b, 0x1174, 0x117d, 0x117d, 0x117d, + 0x117d, 0x118f, 0x118f, 0x118f, 0x118f, 0x118f, 0x119f, 0x119f, + 0x119f, 0x119f, 0x119f, 0x119f, 0x11ab, 0x11ab, 0x11b7, 0x11b7, + 0x11e3, 0x11e3, 0x11e3, 0x11e3, 0x11fc, 0x1202, 0x1202, 0x1202, + 0x1202, 0x1202, 0x1202, 0x1202, 0x120b, 0x120b, 0x120b, 0x120b, + 0x120b, 0x121a, 0x121a, 0x121a, 0x121a, 0x1220, 0x1220, 0x1220, + // Entry 240 - 27F + 0x1220, 0x1220, 0x1220, 0x122f, 0x122f, 0x1247, 0x1247, 0x1247, + 0x1270, 0x1270, 0x1296, 0x1296, 0x12bc, 0x12bc, 0x12db, 0x1304, + 0x132f, 0x134e, 0x1370, 0x1392, 0x13b8, 0x13d7, 0x13f6, 0x13f6, + 0x1415, 0x1434, 0x1450, 0x145c, 0x147e, 0x14a0, 0x14b2, 0x14b2, + 0x14cf, 0x14e8, +} // Size: 1244 bytes + +var arLangStr string = "" + // Size: 9700 bytes + "الأفاريةالأبخازيةالأفستيةالأفريقانيةالأكانيةالأمهريةالأراغونيةالعربيةالأ" + + "ساميةالأواريةالأيماراالأذربيجانيةالباشكيريةالبيلاروسيةالبلغاريةالبيسلام" + + "يةالبامباراالبنغاليةالتبتيةالبريتونيةالبوسنيةالكتالانيةالشيشانيةالتشامو" + + "روالكورسيكيةالكرىالتشيكيةسلافية كنسيةالتشوفاشيالولزيةالدانماركيةالألمان" + + "يةالمالديفيةالزونخايةالإيوياليونانيةالإنجليزيةالإسبرانتوالإسبانيةالإستو" + + "نيةلغة الباسكالفارسيةالفلةالفنلنديةالفيجيةالفارويزالفرنسيةالفريزيانالأي" + + "رلنديةالغيلية الأسكتلنديةالجاليكيةالجوارانيالغوجاراتيةالمنكيةالهوساالعب" + + "ريةالهنديةالهيري موتوالكرواتيةالهايتيةالهنغاريةالأرمينيةالهيريرواللّغة " + + "الوسيطةالإندونيسيةالإنترلينجالإيجبوالسيتشيون ييالإينبياكالإيدوالأيسلاند" + + "يةالإيطاليةالإينكتيتتاليابانيةالجاويةالجورجيةالكونغوالكيكيوالكيونياماال" + + "كازاخستانيةالكالاليستالخميريةالكاناداالكوريةالكانيوريالكشميريةالكرديةال" + + "كوميالكورنيةالقرغيزيةاللاتينيةاللوكسمبرجيةالجانداالليمبرجيشيةاللينجالاا" + + "للاويةاللتوانيةاللبا-كاتانجااللاتفيةالمالاجاشيةالمارشاليةالماوريةالمقدو" + + "نيةالماليالامالمنغوليةالماراثيلغة الملايوالمالطيةالبورميةالنوروالنديبيل" + + " الشماليالنيباليةالندونجاالهولنديةالنينورسك النرويجيالبوكمالية النرويجية" + + "النديبيل الجنوبيالنافاجوالنيانجاالأوكيتانيةالأوجيبواالأوروموالأوريياالأ" + + "وسيتيكالبنجابيةالباليةالبولنديةالبشتونيةالبرتغاليةالكويتشواالرومانشيةال" + + "رنديالرومانيةالروسيةالكينياروانداالسنسكريتيةالسردينيةالسنديةالسامي الشم" + + "اليالسانجوالسنهاليةالسلوفاكيةالسلوفانيةالساموائيةالشوناالصوماليةالألبان" + + "يةالصربيةالسواتيالسوتو الجنوبيةالسوندانيةالسويديةالسواحليةالتاميليةالتي" + + "لجوالطاجيكيةالتايلانديةالتغرينيةالتركمانيةالتسوانيةالتونغيةالتركيةالسون" + + "جاالتتاريةالتاهيتيةالأغوريةالأوكرانيةالأرديةالأوزبكيةالفينداالفيتناميةل" + + "غة الفولابوكالولونيةالولوفالخوسااليديشيةاليوروبيةالزهيونجالصينيةالزولوا" + + "لأتشينيزيةالأكوليةالأدانجميةالأديغةالأفريهيليةالأغمالآينويةالأكاديةالأل" + + "يوتيةالألطائية الجنوبيةالإنجليزية القديمةالأنجيكاالآراميةالأروكانيةالأر" + + "اباهوالأراواكيةالآسوالأستريةالأواديةالبلوشيةاللغة الباليةالباسابامنلغة " + + "الغومالاالبيجاالبيمبابينالغة البافوتالبلوشية الغربيةالبهوجبوريةالبيكولي" + + "ةالبينيةلغة الكومالسيكسيكيةالبراجيةالبودوأكوسالبرياتيةالبجينيزيةلغة الب" + + "ولوالبلينيةلغة الميدومباالكادوالكاريبيةالكايوجيةالأتسامالسيبونيةتشيغاال" + + "تشيبشاالتشاجاتايالتشكيزيةالماريالشينوك جارجونالشوكتوالشيباوايانالشيروكي" + + "الشايانالسورانية الكرديةالقبطيةلغة تتار القرمالكاشبايانالداكوتاالدارجوا" + + "تيتاالديلويرالسلافيةالدوجريبالدنكاالزارميةالدوجريةالصربية السفلىالديولا" + + "الهولندية الوسطىجولا فونياالدايلاالقرعانيةإمبوالإفيكالمصرية القديمةالإك" + + "اجكالإمايتالإنجليزية الوسطىالإيوندوالفانجالفلبينيةالفونالفرنسية الوسطىا" + + "لفرنسية القديمةالفريزينية الشماليةالفريزينية الشرقيةالفريلايانالجاالغاغ" + + "وزالجايوالجبياالجعزيةلغة أهل جبل طارقالألمانية العليا الوسطىالألمانية ا" + + "لعليا القديمةالجنديالجورونتالوالقوطيةالجريبواليونانية القديمةالألمانية " + + "السويسريةالغيزيةغوتشنالهيدالغة أهل الهاوايالهيليجينونالحثيةالهمونجيةالص" + + "ربية العلياالهباالإيبانالإيبيبيويةالإيلوكوالإنجوشيةاللوجباننغومباالماتش" + + "اميةالفارسية اليهوديةالعربية اليهوديةالكارا-كالباكالقبيليةالكاتشينالجوا" + + "لكامباالكويالكاباردايانكانمبوالتايابيةماكوندهكابوفيرديانوالكوروالكازيةا" + + "لخوتانيزكويرا تشينيكالينجينالكيمبندوكومي-بيرماياكالكونكانيةالكوسراينالك" + + "بيلالكاراتشاي-بالكارالكاريليةالكوروخشامبالالغة البافيالغة الكولونيانالق" + + "موقيةالكتيناياللادينولانجياللاهندااللامباالليزجيةلاكوتامنغولىاللوزياللر" + + "ية الشماليةاللبا-لؤلؤاللوسينواللوندااللوالميزولغة اللوياالمادريزالماجاا" + + "لمايثيليالماكاسارالماندينغالماسايماباالموكشاالماندارالميندالميروالمورسي" + + "انيةالأيرلندية الوسطىماخاوا-ميتوميتاالميكماكيونيةالمينانجكاباوالمانشوال" + + "مانيبوريةالموهوكالموسيمندنجلغات متعددةالكريكالميرانديزالمارواريةالأرزية" + + "المازندرانيةاللغة النابوليةلغة الناماالألمانية السفلىالنواريةالنياسالني" + + "ويكواسيولغة النجيمبونالنوجايالنورس القديمأنكوالسوتو الشماليةالنويرالنوا" + + "رية التقليديةالنيامويزيالنيانكولالنيوروالنزيماالأوساجالتركية العثمانيةا" + + "لبانجاسينانالبهلويةالبامبانجاالبابيامينتوالبالوانالفارسية القديمةالفيني" + + "قيةالبوهنبيايانالبروفانسية القديمةكيشيالراجاسثانيةالرابانيالراروتونجاني" + + "الرومبوغجريالأرومانيانالرواالسانداويالساخيةالآرامية السامريةسامبوروالسا" + + "ساكالسانتالينامبيسانغوالصقليةالأسكتلنديةالكردية الجنوبيةالسنيكاسيناالسي" + + "لكبكويرابورو سينيالأيرلندية القديمةتشلحيتالشانيةالعربية التشاديةالسيدام" + + "والسامي الجنوبياللول ساميالإيناري ساميالسكولت ساميالسونينكالسوجدينالسرا" + + "نان تونجوالسررلغة الساهوالسوكوماالسوسوالسوماريةالقمريةالكونغو السواحلية" + + "سريانية تقليديةالسريانيةالتيمنتيسوالتيرينوالتيتمالتغريةالتيفالتوكيلاوال" + + "كلينجونالتلينغيتيةالتاماشيكتونجا - نياساالتوك بيسينلغة التاروكوالتسيمشي" + + "انالتامبوكاالتوفالوتاساواقالتوفيةالأمازيغية وسط الأطلسالأدمرتاليجاريتيك" + + "الأمبندوالجذرالفايالفوتيكالفونجوالوالسرالولاياتاالوارايالواشووارلبيريال" + + "كالميكالسوغاالياواليابيزيانجبنيمباالكَنْتُونيةالزابوتيكرموز المعايير ال" + + "أساسيةالزيناجاالتمازيغية المغربية القياسيةالزونيةبدون محتوى لغويزازاالع" + + "ربية الرسمية الحديثةالألمانية النمساويةالألمانية العليا السويسريةالإنجل" + + "يزية الأستراليةالإنجليزية الكنديةالإنجليزية البريطانيةالإنجليزية الأمري" + + "كيةالإسبانية أمريكا اللاتينيةالإسبانية الأوروبيةالإسبانية المكسيكيةالفر" + + "نسية الكنديةالفرنسية السويسريةالسكسونية السفلىالفلمنكيةالبرتغالية البرا" + + "زيليةالبرتغالية الأوروبيةالمولدوفيةصربية-كرواتيةالصينية المبسطةالصينية " + + "التقليدية" + +var arLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0010, 0x0022, 0x0032, 0x0048, 0x0058, 0x0068, 0x007c, + 0x008a, 0x009a, 0x00aa, 0x00ba, 0x00d2, 0x00e6, 0x00fc, 0x010e, + 0x0122, 0x0134, 0x0146, 0x0154, 0x0168, 0x0178, 0x018c, 0x019e, + 0x01b0, 0x01c4, 0x01ce, 0x01de, 0x01f5, 0x0207, 0x0215, 0x022b, + 0x023d, 0x0251, 0x0263, 0x026f, 0x0281, 0x0295, 0x02a9, 0x02bb, + 0x02cd, 0x02e0, 0x02f0, 0x02fa, 0x030c, 0x031a, 0x032a, 0x033a, + 0x034c, 0x0360, 0x0385, 0x0397, 0x03a9, 0x03bf, 0x03cd, 0x03d9, + 0x03e7, 0x03f5, 0x040a, 0x041c, 0x042c, 0x043e, 0x0450, 0x0460, + // Entry 40 - 7F + 0x047b, 0x0491, 0x04a5, 0x04b3, 0x04ca, 0x04dc, 0x04e8, 0x04fe, + 0x0510, 0x0524, 0x0536, 0x0544, 0x0554, 0x0562, 0x0570, 0x0584, + 0x059e, 0x05b2, 0x05c2, 0x05d2, 0x05e0, 0x05f2, 0x0604, 0x0612, + 0x061e, 0x062e, 0x0640, 0x0652, 0x066a, 0x0678, 0x0690, 0x06a2, + 0x06b0, 0x06c2, 0x06db, 0x06eb, 0x0701, 0x0715, 0x0725, 0x0737, + 0x074b, 0x075d, 0x076d, 0x0782, 0x0792, 0x07a2, 0x07ae, 0x07cd, + 0x07df, 0x07ef, 0x0801, 0x0824, 0x084b, 0x086a, 0x087a, 0x088a, + 0x08a0, 0x08b2, 0x08c2, 0x08d2, 0x08e4, 0x08f6, 0x0904, 0x0916, + // Entry 80 - BF + 0x0928, 0x093c, 0x094e, 0x0962, 0x096e, 0x0980, 0x098e, 0x09a8, + 0x09be, 0x09d0, 0x09de, 0x09f9, 0x0a07, 0x0a19, 0x0a2d, 0x0a41, + 0x0a55, 0x0a61, 0x0a73, 0x0a85, 0x0a93, 0x0aa1, 0x0abe, 0x0ad2, + 0x0ae2, 0x0af4, 0x0b06, 0x0b14, 0x0b26, 0x0b3c, 0x0b4e, 0x0b62, + 0x0b74, 0x0b84, 0x0b92, 0x0ba0, 0x0bb0, 0x0bc2, 0x0bd2, 0x0be6, + 0x0bf4, 0x0c06, 0x0c14, 0x0c28, 0x0c41, 0x0c51, 0x0c5d, 0x0c69, + 0x0c79, 0x0c8b, 0x0c9b, 0x0ca9, 0x0cb5, 0x0ccb, 0x0cdb, 0x0cef, + 0x0cfd, 0x0cfd, 0x0d13, 0x0d1d, 0x0d2d, 0x0d3d, 0x0d3d, 0x0d4f, + // Entry C0 - FF + 0x0d4f, 0x0d72, 0x0d95, 0x0da5, 0x0db5, 0x0dc9, 0x0dc9, 0x0ddb, + 0x0ddb, 0x0def, 0x0def, 0x0def, 0x0df9, 0x0df9, 0x0e09, 0x0e09, + 0x0e19, 0x0e29, 0x0e42, 0x0e42, 0x0e4e, 0x0e56, 0x0e56, 0x0e6d, + 0x0e79, 0x0e87, 0x0e87, 0x0e8f, 0x0ea4, 0x0ea4, 0x0ec3, 0x0ed9, + 0x0eeb, 0x0ef9, 0x0ef9, 0x0f0a, 0x0f1e, 0x0f1e, 0x0f1e, 0x0f2e, + 0x0f2e, 0x0f3a, 0x0f42, 0x0f54, 0x0f68, 0x0f7b, 0x0f8b, 0x0fa4, + 0x0fb0, 0x0fc2, 0x0fd4, 0x0fe2, 0x0ff4, 0x0ffe, 0x100e, 0x1022, + 0x1034, 0x1040, 0x105b, 0x1069, 0x107f, 0x108f, 0x109d, 0x10be, + // Entry 100 - 13F + 0x10cc, 0x10cc, 0x10e6, 0x10fa, 0x110a, 0x111a, 0x1122, 0x1132, + 0x1142, 0x1152, 0x115e, 0x116e, 0x117e, 0x1199, 0x1199, 0x11a7, + 0x11c6, 0x11d9, 0x11e7, 0x11f9, 0x1201, 0x120d, 0x120d, 0x122a, + 0x1238, 0x1246, 0x1267, 0x1267, 0x1277, 0x1277, 0x1283, 0x1295, + 0x1295, 0x129f, 0x129f, 0x12bc, 0x12db, 0x12db, 0x1300, 0x1323, + 0x1337, 0x133f, 0x134d, 0x134d, 0x1359, 0x1365, 0x1365, 0x1373, + 0x1390, 0x1390, 0x13bc, 0x13ea, 0x13ea, 0x13f6, 0x140c, 0x141a, + 0x1428, 0x1449, 0x146e, 0x146e, 0x146e, 0x147c, 0x1486, 0x1492, + // Entry 140 - 17F + 0x1492, 0x14ae, 0x14ae, 0x14c4, 0x14d0, 0x14e2, 0x14fd, 0x14fd, + 0x1507, 0x1515, 0x152b, 0x153b, 0x154d, 0x154d, 0x154d, 0x155d, + 0x1569, 0x157d, 0x159e, 0x15bd, 0x15bd, 0x15d6, 0x15e6, 0x15f6, + 0x15fe, 0x160c, 0x1616, 0x162e, 0x163a, 0x164c, 0x165a, 0x1672, + 0x1672, 0x167e, 0x167e, 0x168c, 0x169e, 0x16b3, 0x16b3, 0x16b3, + 0x16b3, 0x16c3, 0x16d5, 0x16ee, 0x1702, 0x1714, 0x1720, 0x1741, + 0x1741, 0x1741, 0x1753, 0x1761, 0x176f, 0x1784, 0x179f, 0x17af, + 0x17bf, 0x17cf, 0x17d9, 0x17e9, 0x17f7, 0x1807, 0x1807, 0x1807, + // Entry 180 - 1BF + 0x1807, 0x1813, 0x1813, 0x181f, 0x182b, 0x1848, 0x1848, 0x185b, + 0x186b, 0x1879, 0x1881, 0x188d, 0x18a0, 0x18a0, 0x18a0, 0x18b0, + 0x18b0, 0x18bc, 0x18ce, 0x18e0, 0x18f2, 0x1900, 0x1908, 0x1916, + 0x1926, 0x1932, 0x193e, 0x1954, 0x1975, 0x198a, 0x1992, 0x19ac, + 0x19c6, 0x19d4, 0x19ea, 0x19f8, 0x1a04, 0x1a04, 0x1a0e, 0x1a23, + 0x1a2f, 0x1a43, 0x1a57, 0x1a57, 0x1a57, 0x1a65, 0x1a7d, 0x1a7d, + 0x1a9a, 0x1aad, 0x1acc, 0x1adc, 0x1ae8, 0x1af4, 0x1af4, 0x1b00, + 0x1b19, 0x1b27, 0x1b40, 0x1b40, 0x1b48, 0x1b65, 0x1b71, 0x1b94, + // Entry 1C0 - 1FF + 0x1ba8, 0x1bba, 0x1bc8, 0x1bd6, 0x1be4, 0x1c05, 0x1c1d, 0x1c2d, + 0x1c41, 0x1c59, 0x1c69, 0x1c69, 0x1c69, 0x1c69, 0x1c88, 0x1c88, + 0x1c9a, 0x1c9a, 0x1c9a, 0x1cb2, 0x1cb2, 0x1cd7, 0x1cdf, 0x1cdf, + 0x1cf7, 0x1d07, 0x1d21, 0x1d21, 0x1d21, 0x1d2f, 0x1d37, 0x1d37, + 0x1d37, 0x1d37, 0x1d4d, 0x1d57, 0x1d69, 0x1d77, 0x1d98, 0x1da6, + 0x1db4, 0x1dc6, 0x1dc6, 0x1dd0, 0x1dda, 0x1de8, 0x1dfe, 0x1dfe, + 0x1e1d, 0x1e2b, 0x1e33, 0x1e33, 0x1e41, 0x1e5c, 0x1e7f, 0x1e7f, + 0x1e8b, 0x1e99, 0x1eb8, 0x1ec8, 0x1ec8, 0x1ec8, 0x1ee3, 0x1ef6, + // Entry 200 - 23F + 0x1f0f, 0x1f26, 0x1f36, 0x1f46, 0x1f61, 0x1f6b, 0x1f7e, 0x1f7e, + 0x1f8e, 0x1f9a, 0x1fac, 0x1fba, 0x1fdb, 0x1ff8, 0x200a, 0x200a, + 0x200a, 0x2016, 0x201e, 0x202e, 0x203a, 0x2048, 0x2052, 0x2064, + 0x2064, 0x2076, 0x208c, 0x208c, 0x209e, 0x20b5, 0x20ca, 0x20ca, + 0x20e1, 0x20e1, 0x20f5, 0x20f5, 0x2107, 0x2117, 0x2125, 0x2133, + 0x215b, 0x2169, 0x217d, 0x218d, 0x2197, 0x21a1, 0x21a1, 0x21a1, + 0x21a1, 0x21a1, 0x21af, 0x21af, 0x21bd, 0x21cb, 0x21dd, 0x21eb, + 0x21f7, 0x2207, 0x2207, 0x2217, 0x2217, 0x2223, 0x222d, 0x223b, + // Entry 240 - 27F + 0x2247, 0x224f, 0x224f, 0x2267, 0x2279, 0x22a3, 0x22a3, 0x22b3, + 0x22e9, 0x22f7, 0x2313, 0x231b, 0x2347, 0x2347, 0x236c, 0x239e, + 0x23c7, 0x23ea, 0x2413, 0x243a, 0x246c, 0x2491, 0x24b6, 0x24b6, + 0x24d5, 0x24f8, 0x2517, 0x2529, 0x2552, 0x2579, 0x258d, 0x25a6, + 0x25c3, 0x25e4, +} // Size: 1244 bytes + +var azLangStr string = "" + // Size: 3706 bytes + "afarcaabxazavestancaafrikaansakancaamhararagoncaərəbassamavarikcəaymarca" + + "azərbaycan dilibaşqırdbelarusbolqarbislamabambarabenqaltibetBretoncabosn" + + "iakkatalançeçençamorokorsikakri diliçexkilsə slavçuvaşuelsdanimarkaalman" + + "divehdzonqaeveyunaningilisesperantoispanestonbaskfarsfulafinficifarerfra" + + "nsızqərbi frizirlandskot gaelikqalisianquaraniqucaratmankshausaivrithind" + + "ihiri motuxorvathaitimacarerməniHererinterlinguaindonezinterlingueiqbosi" + + "çuan yiinupiaqidoislanditalyaninuktitutyaponyavagürcükonqokikuyukuanyam" + + "aqazaxkalaallisutkxmerkannadakoreyakanurkaşmirkürdkomikornqırğızlatınlük" + + "semburqqandalimburqişlinqalalaoslitvaluba-katanqalatışmalaqasmarşalmaori" + + "makedonmalayalammonqolmaratimalaymaltabirmanauruşimali ndebelenepalnqonk" + + "ahollandnünorsk norveçbokmal norveçcənub ndebelenavayonyancaoksitancaoci" + + "bvaoromooriyaosetikpəncabpalipolyakpuştuportuqalkeçuaretoromanrundirumın" + + "ruskinyarvandasanskritsardinsindhişimali samisanqosinhalslovakslovensamo" + + "aşonasomalialbanserbsvatiSesotoisveçsuahilitamilteluqutaciktaytiqrintürk" + + "mənsvanatonqatürksonqatatartaxitiuyğurukraynaurduözbəkvendavyetnamvolapü" + + "kvalunvolofxosaYahudiyorubajuənqçinzuluakinakoliadangmeadugeafrihiliaqhe" + + "maynucaakadiancaaleutcacənub altayqədimi ingiliscəangikəaramikaraukancaa" + + "rapahoaravakçaasuasturicəavadicəbalucbalincəbasabejabembabenaqərbi bəluc" + + "bxoçpuribikolcabinisiksikəbrajbodoburyatbuginbilincəkadokaribatsamcakebu" + + "anoçiqaçibçəçağatayçukizmariçinuk ləhçəsiçoktauçipevyançirokiçeyensorani" + + " kürdkoptkrım türkçəkaşubyandakotadarqvataitadelaverslaveydoqribdinkazar" + + "madoqriaşağı sorbdualaortacaq hollandcadioladyulaembuefikqədimi misireka" + + "cukelamitortacaq ingiliscəevondofangfilippinfonortacaq fransızcaqədimi f" + + "ransızcaşimal frisfriulqaqaqauzqayoqabayaqezqilbert giliortacaq yüksək a" + + "lmancaqədimi almancaqondiqorontalogotçaqreboqədimi yunancaİsveçrə almanc" + + "asıqusiqviçinhaydahavayhiliqaynonhittitmonqyuxarı sorbhupaibanilokoinquş" + + "loğbannqombamaçamjudo-farscajude-ərəbcəqara-qalpaqkabilekaçincajukambaka" + + "vikabardcatiyapmakondkabuverdiankoroxazixotankoyra çiinikalencinkimbundu" + + "komi-permyakkonkankosreyankpelleqaraçay-balkarkarelyankuruxşambalabafiak" + + "umukkutenayladinlangilaxndalambaləzqilakotamonqolozişimali luriluba-lulu" + + "aluysenolundaluolushaycaluyiamadurizmaqahimaitilimakasarməndinqomasaymok" + + "şamandarmendemerumorisienortacaq irlandcamaxuva-meettometa’mikmakminanq" + + "kabanmançumanipürimohavkmosimundanqdigər dillərkrikmirandmaruarierzyamaz" + + "andaranneapolitalnamaaşağı almancanevarinyasniyuankvasionoqayqədimi nors" + + "canqoşimal sotonuernyamvezinyankolniyoronizimaosageosmanpanqasinanpaxlav" + + "ipampanqapapyamentopalayancaqədimi farscafoyenikponpeyanqədimi provensia" + + "lcakiçeracastanrapanurarotonqanromboromanaromancaruasandaveyakutsamarita" + + "nsamburusasaksantalsanqusisiliskotscənubi kürdsenaselkupkoyraboro senniq" + + "ədimi irlandcataçelitşansidamocənubi samilule samiinari samiskoltsonink" + + "esoqdiyensranan tonqoserer diliisukumasususumeryanKonqo suahilicəsisirya" + + "ktimnetesoterenotetumtiqretivtokelayklinqontlinqittamaşekniyasa tongatok" + + " pisinsimşyantumbukatuvalutasavaqtuvinyanMərkəzi Atlas tamazicəsiudmurtu" + + "qaritikumbundurutvaivotikvunyovalamovarayvaşoValpirikalmıqcasoqayaoyapiz" + + "zapotekblisimbolszenaqatamazizunidil məzmunu yoxdurzazaModern Standart Ə" + + "rəbcəcənubi azərbaycanAvstriya almancasıİsveçrə yüksək almancasıAvstrali" + + "ya ingiliscəsiKanada ingiliscəsiBritaniya ingiliscəsiAmerika ingiliscəsi" + + "Latın Amerikası ispancasıKastiliya ispancasıMeksika ispancasıKanada fran" + + "sızcasıİsveçrə fransızcasıaşağı saksonflamandBraziliya portuqalcasıPortu" + + "qaliya portuqalcasımoldavserb-xorvatcasadələşmiş çinənənəvi çin" + +var azLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0006, 0x000b, 0x0014, 0x001d, 0x0023, 0x0028, 0x0030, + 0x0036, 0x003b, 0x0044, 0x004b, 0x005b, 0x0064, 0x006b, 0x0071, + 0x0078, 0x007f, 0x0085, 0x008a, 0x0092, 0x0099, 0x00a0, 0x00a7, + 0x00ae, 0x00b5, 0x00bd, 0x00c1, 0x00cc, 0x00d3, 0x00d7, 0x00e0, + 0x00e5, 0x00ea, 0x00f0, 0x00f3, 0x00f8, 0x00ff, 0x0108, 0x010d, + 0x0112, 0x0116, 0x011a, 0x011e, 0x0121, 0x0125, 0x012a, 0x0132, + 0x013d, 0x0143, 0x014e, 0x0156, 0x015d, 0x0164, 0x0169, 0x016e, + 0x0173, 0x0178, 0x0181, 0x0187, 0x018c, 0x0191, 0x0198, 0x019d, + // Entry 40 - 7F + 0x01a8, 0x01af, 0x01ba, 0x01be, 0x01c8, 0x01cf, 0x01d2, 0x01d8, + 0x01df, 0x01e8, 0x01ed, 0x01f1, 0x01f8, 0x01fd, 0x0203, 0x020b, + 0x0210, 0x021b, 0x0220, 0x0227, 0x022d, 0x0232, 0x0239, 0x023e, + 0x0242, 0x0246, 0x024f, 0x0255, 0x0260, 0x0265, 0x026f, 0x0276, + 0x027a, 0x027f, 0x028b, 0x0292, 0x0299, 0x02a0, 0x02a5, 0x02ac, + 0x02b5, 0x02bb, 0x02c1, 0x02c6, 0x02cb, 0x02d0, 0x02d5, 0x02e4, + 0x02e9, 0x02ef, 0x02f6, 0x0306, 0x0314, 0x0322, 0x0328, 0x032e, + 0x0337, 0x033d, 0x0342, 0x0347, 0x034d, 0x0354, 0x0358, 0x035e, + // Entry 80 - BF + 0x0364, 0x036c, 0x0372, 0x037b, 0x0380, 0x0386, 0x0389, 0x0394, + 0x039c, 0x03a2, 0x03a8, 0x03b4, 0x03b9, 0x03bf, 0x03c5, 0x03cb, + 0x03d0, 0x03d5, 0x03db, 0x03e0, 0x03e4, 0x03e9, 0x03ef, 0x03ef, + 0x03f5, 0x03fc, 0x0401, 0x0407, 0x040c, 0x040f, 0x0415, 0x041e, + 0x0423, 0x0428, 0x042d, 0x0432, 0x0437, 0x043d, 0x0443, 0x044a, + 0x044e, 0x0455, 0x045a, 0x0461, 0x0469, 0x046e, 0x0473, 0x0477, + 0x047d, 0x0483, 0x0489, 0x048d, 0x0491, 0x0495, 0x049a, 0x04a1, + 0x04a6, 0x04a6, 0x04ae, 0x04b3, 0x04b9, 0x04c2, 0x04c2, 0x04c9, + // Entry C0 - FF + 0x04c9, 0x04d5, 0x04e7, 0x04ee, 0x04f4, 0x04fd, 0x04fd, 0x0504, + 0x0504, 0x050d, 0x050d, 0x050d, 0x0510, 0x0510, 0x0519, 0x0519, + 0x0521, 0x0526, 0x052e, 0x052e, 0x0532, 0x0532, 0x0532, 0x0532, + 0x0536, 0x053b, 0x053b, 0x053f, 0x053f, 0x053f, 0x054c, 0x0555, + 0x055c, 0x0560, 0x0560, 0x0560, 0x0568, 0x0568, 0x0568, 0x056c, + 0x056c, 0x0570, 0x0570, 0x0576, 0x057b, 0x057b, 0x0583, 0x0583, + 0x0587, 0x058c, 0x058c, 0x0593, 0x059a, 0x059f, 0x05a7, 0x05b0, + 0x05b6, 0x05ba, 0x05cb, 0x05d2, 0x05db, 0x05e2, 0x05e8, 0x05f4, + // Entry 100 - 13F + 0x05f8, 0x05f8, 0x0607, 0x0610, 0x0616, 0x061c, 0x0621, 0x0628, + 0x062e, 0x0634, 0x0639, 0x063e, 0x0643, 0x0650, 0x0650, 0x0655, + 0x0666, 0x066b, 0x0670, 0x0670, 0x0674, 0x0678, 0x0678, 0x0685, + 0x068b, 0x0691, 0x06a3, 0x06a3, 0x06a9, 0x06a9, 0x06ad, 0x06b5, + 0x06b5, 0x06b8, 0x06b8, 0x06ca, 0x06dc, 0x06dc, 0x06e7, 0x06e7, + 0x06ec, 0x06ee, 0x06f4, 0x06f4, 0x06f8, 0x06fe, 0x06fe, 0x0701, + 0x070d, 0x070d, 0x0725, 0x0734, 0x0734, 0x0739, 0x0742, 0x0748, + 0x074d, 0x075c, 0x0771, 0x0771, 0x0771, 0x0775, 0x077c, 0x0781, + // Entry 140 - 17F + 0x0781, 0x0786, 0x0786, 0x0790, 0x0796, 0x079a, 0x07a6, 0x07a6, + 0x07aa, 0x07ae, 0x07ae, 0x07b3, 0x07b9, 0x07b9, 0x07b9, 0x07c0, + 0x07c6, 0x07cc, 0x07d7, 0x07e5, 0x07e5, 0x07f0, 0x07f6, 0x07fe, + 0x0800, 0x0805, 0x0809, 0x0811, 0x0811, 0x0816, 0x081c, 0x0827, + 0x0827, 0x082b, 0x082b, 0x082f, 0x0834, 0x0840, 0x0840, 0x0840, + 0x0840, 0x0848, 0x0850, 0x085c, 0x0862, 0x086a, 0x0870, 0x087f, + 0x087f, 0x087f, 0x0887, 0x088c, 0x0894, 0x0899, 0x0899, 0x089e, + 0x08a5, 0x08aa, 0x08af, 0x08b5, 0x08ba, 0x08c0, 0x08c0, 0x08c0, + // Entry 180 - 1BF + 0x08c0, 0x08c6, 0x08c6, 0x08cb, 0x08cf, 0x08db, 0x08db, 0x08e5, + 0x08ec, 0x08f1, 0x08f4, 0x08fc, 0x0901, 0x0901, 0x0901, 0x0908, + 0x0908, 0x090e, 0x0915, 0x091c, 0x0925, 0x092a, 0x092a, 0x0930, + 0x0936, 0x093b, 0x093f, 0x0947, 0x0957, 0x0964, 0x096b, 0x0971, + 0x097c, 0x0982, 0x098b, 0x0991, 0x0995, 0x0995, 0x099c, 0x09aa, + 0x09ae, 0x09b4, 0x09bb, 0x09bb, 0x09bb, 0x09c0, 0x09ca, 0x09ca, + 0x09d4, 0x09d8, 0x09e8, 0x09ee, 0x09f2, 0x09f8, 0x09f8, 0x09fe, + 0x09fe, 0x0a03, 0x0a11, 0x0a11, 0x0a14, 0x0a1f, 0x0a23, 0x0a23, + // Entry 1C0 - 1FF + 0x0a2b, 0x0a32, 0x0a38, 0x0a3e, 0x0a43, 0x0a48, 0x0a52, 0x0a59, + 0x0a61, 0x0a6b, 0x0a74, 0x0a74, 0x0a74, 0x0a74, 0x0a82, 0x0a82, + 0x0a89, 0x0a89, 0x0a89, 0x0a91, 0x0a91, 0x0aa5, 0x0aaa, 0x0aaa, + 0x0ab2, 0x0ab8, 0x0ac2, 0x0ac2, 0x0ac2, 0x0ac7, 0x0acc, 0x0acc, + 0x0acc, 0x0acc, 0x0ad4, 0x0ad7, 0x0ade, 0x0ae3, 0x0aec, 0x0af3, + 0x0af8, 0x0afe, 0x0afe, 0x0afe, 0x0b03, 0x0b09, 0x0b0e, 0x0b0e, + 0x0b1b, 0x0b1b, 0x0b1f, 0x0b1f, 0x0b25, 0x0b34, 0x0b44, 0x0b44, + 0x0b4c, 0x0b50, 0x0b50, 0x0b56, 0x0b56, 0x0b56, 0x0b62, 0x0b6b, + // Entry 200 - 23F + 0x0b75, 0x0b7a, 0x0b81, 0x0b89, 0x0b95, 0x0ba0, 0x0ba0, 0x0ba0, + 0x0ba6, 0x0baa, 0x0bb2, 0x0bb2, 0x0bc4, 0x0bc4, 0x0bca, 0x0bca, + 0x0bca, 0x0bcf, 0x0bd3, 0x0bd9, 0x0bde, 0x0be3, 0x0be6, 0x0bed, + 0x0bed, 0x0bf4, 0x0bfb, 0x0bfb, 0x0c03, 0x0c0f, 0x0c18, 0x0c18, + 0x0c18, 0x0c18, 0x0c20, 0x0c20, 0x0c27, 0x0c2d, 0x0c34, 0x0c3c, + 0x0c57, 0x0c5d, 0x0c65, 0x0c6c, 0x0c6f, 0x0c72, 0x0c72, 0x0c72, + 0x0c72, 0x0c72, 0x0c77, 0x0c77, 0x0c7c, 0x0c7c, 0x0c82, 0x0c87, + 0x0c8c, 0x0c93, 0x0c93, 0x0c9c, 0x0c9c, 0x0ca0, 0x0ca3, 0x0ca8, + // Entry 240 - 27F + 0x0ca8, 0x0ca8, 0x0ca8, 0x0ca8, 0x0caf, 0x0cb9, 0x0cb9, 0x0cbf, + 0x0cc5, 0x0cc9, 0x0cdc, 0x0ce0, 0x0cf9, 0x0d0c, 0x0d1f, 0x0d3d, + 0x0d54, 0x0d67, 0x0d7d, 0x0d91, 0x0dad, 0x0dc1, 0x0dd3, 0x0dd3, + 0x0de7, 0x0dff, 0x0e0e, 0x0e15, 0x0e2c, 0x0e45, 0x0e4b, 0x0e58, + 0x0e6b, 0x0e7a, +} // Size: 1244 bytes + +var bgLangStr string = "" + // Size: 7628 bytes + "афарабхазкиавестскиафрикаансаканамхарскиарагонскиарабскиасамскиаварскиай" + + "мараазербайджанскибашкирскибеларускибългарскибисламабамбарабенгалскитиб" + + "етскибретонскибосненскикаталонскичеченскичаморокорсиканскикриичешкицърк" + + "овно славянскичувашкиуелскидатскинемскидивехидзонхаевегръцкианглийскиес" + + "перантоиспанскиестонскибаскиперсийскифулафинскифиджийскифарьорскифренск" + + "ифризийскиирландскишотландски галскигалисийскигуаранигуджаратиманкскиха" + + "узаивритхиндихири мотухърватскихаитянскиунгарскиарменскихерероинтерлинг" + + "ваиндонезийскиоксиденталигбосъчуански иинупиакидоисландскииталианскиину" + + "ктитутяпонскияванскигрузинскиконгоанскикикуюкванямаказахскигренландскик" + + "хмерскиканнадакорейскиканурикашмирскикюрдскиКомикорнуолскикиргизкилатин" + + "скилюксембургскигандалимбургскилингалалаоскилитовскилуба катангалатвийс" + + "кималгашкимаршалеземаорскимакедонскималаяламмонголскимаратималайскималт" + + "ийскибирманскинаурусеверен ндебеленепалскиндонганидерландскинорвежки (н" + + "юношк)норвежки (букмол)южен ндебеленавахочинянджаокситанскиоджибваоромо" + + "орияосетскипенджабскипалиполскипущупортугалскикечуаретороманскирундирум" + + "ънскирускикиняруандасанкскритскисардинскисиндхисеверносаамскисангосинха" + + "лскисловашкисловенскисамоанскишонасомалийскиалбанскисръбскисуазисесутос" + + "унданскишведскисуахилитамилскителугутаджикскитайскитигринятуркменскитсв" + + "анатонгатурскитсонгататарскитаитянскиуйгурскиукраинскиурдуузбекскивенда" + + "виетнамскиволапюквалонскиволофксосаидишйорубазуангкитайскизулускиачинск" + + "иаколиадангмеадигеафрихилиагемайнуакадскиалеутскиюжноалтайскистароангли" + + "йскиангикаарамейскимапучеарапахоаравакасуастурскиавадибалучибалинейскиб" + + "асабеябембабеназападен балочибожпурибиколскибинисиксикабраджбодобурятск" + + "ибугинскибиленскикаддокарибскиатсамсебуаночигачибчачагатайчуукмарийскиж" + + "аргон чинуукчокточиипувскичерокичейенскикюрдски (централен)коптскикримс" + + "котатарскикашубскидакотскидаргватаитаделауерслейвидогрибдинкаджермадогр" + + "идолнолужишкидуаласредновековен холандскидиоладиулаембуефикегипетскиека" + + "жукеламитскисредновековен английскиевондофангфилипинскифонсредновековен" + + " френскистарофренскисеверен фризскиизточен фризскифриулианскигагагаузкиг" + + "айогбаягиизгилбертскисредновековен немскистаровисоконемскигондигоронтал" + + "оготическигребодревногръцкишвейцарски немскигусиигвичинхайдахавайскихил" + + "игайнонхитскихмонггорнолужишкихупаибанилокоингушетскилоджбаннгомбамачам" + + "ееврейско-персийскиеврейско-арабскикаракалпашкикабилскикачинскижжикамба" + + "кавикабардиантуапмакондекабовердианскикорокхасикотскикойра чииникалендж" + + "инкимбундукоми-пермяцкиконканикосраенкпелекарачай-балкарскикарелскикуру" + + "кшамбалабафиякумикскикутенайладинолангилахндаламбалезгинскилакотамонгол" + + "озисеверен лурилуба-лулуалуисеньолундалуолушаилуямадурскимагахимайтхили" + + "макасармандингомасайскимокшамандармендемеруморисиенсредновековен ирланд" + + "скимакуа метометамикмакминангбауманчжурскиманипуримохоукмосимундангмног" + + "оезичникрикмирандийскимарвариерзиамазандараннеаполитанскинамадолнонемск" + + "иневарскиниасниуеанквасионогаистаронорвежскинкосеверен сотонуеркласичес" + + "ки невариниамвезинианколенуоронзимаоседжиотомански турскипангасинанпехл" + + "евийскипампангапапиаментупалауанстароперсийскифиникийскипохнпеианпрован" + + "салскикичераджастанскирапа нуирапотонганромбоцигански езикарумънскирвас" + + "андвеякутскисамаритански арамейскисамбурусасаксанталисангусицилианскишо" + + "тландскиюжнокюрдскисенаселкупкойраборо сенистароирландскиташелхитшансид" + + "амоюжносаамскилуле-саамскиинари-саамскисколт-саамскисонинкесогдийскисра" + + "нан тонгосерерсукумасусушумерскикоморскиконгоански суахиликласически си" + + "рийскисирийскитемнетесотеренотетумтигретивтокелайскиклингонтлингиттамаш" + + "екнианса тонгаток писинцимшианскитумбукатувалуанскитасавактувинскицентр" + + "алноатласки тамазигтудмуртскиугаритскиумбундуроотваивотиквунджоваламова" + + "райуашовалпирикалмиксогаяояпезекантонскизапотекблис символизенагастанда" + + "ртен марокански тамазигтзунибез лингвистично съдържаниезазасъвременен с" + + "тандартен арабскианглийски (САЩ)долносаксонскифламандскимолдовскисърбох" + + "ърватски" + +var bgLangIdx = []uint16{ // 608 elements + // Entry 0 - 3F + 0x0000, 0x0008, 0x0016, 0x0026, 0x0038, 0x0040, 0x0050, 0x0062, + 0x0070, 0x007e, 0x008c, 0x0098, 0x00b4, 0x00c6, 0x00d8, 0x00ea, + 0x00f8, 0x0106, 0x0118, 0x0128, 0x013a, 0x014c, 0x0160, 0x0170, + 0x017c, 0x0192, 0x019a, 0x01a4, 0x01c7, 0x01d5, 0x01e1, 0x01ed, + 0x01f9, 0x0205, 0x0211, 0x0217, 0x0223, 0x0235, 0x0247, 0x0257, + 0x0267, 0x0271, 0x0283, 0x028b, 0x0297, 0x02a9, 0x02bb, 0x02c9, + 0x02db, 0x02ed, 0x030e, 0x0322, 0x0330, 0x0342, 0x0350, 0x035a, + 0x0364, 0x036e, 0x037f, 0x0391, 0x03a3, 0x03b3, 0x03c3, 0x03cf, + // Entry 40 - 7F + 0x03e5, 0x03fd, 0x0411, 0x0419, 0x042e, 0x043c, 0x0442, 0x0454, + 0x0468, 0x047a, 0x0488, 0x0496, 0x04a8, 0x04bc, 0x04c6, 0x04d4, + 0x04e4, 0x04fa, 0x050a, 0x0518, 0x0528, 0x0534, 0x0546, 0x0554, + 0x055c, 0x0570, 0x0580, 0x0590, 0x05aa, 0x05b4, 0x05c8, 0x05d6, + 0x05e2, 0x05f2, 0x0609, 0x061b, 0x062b, 0x063d, 0x064b, 0x065f, + 0x066f, 0x0681, 0x068d, 0x069d, 0x06af, 0x06c1, 0x06cb, 0x06e8, + 0x06f8, 0x0704, 0x071c, 0x073b, 0x075a, 0x0771, 0x077d, 0x078d, + 0x07a1, 0x07af, 0x07b9, 0x07c1, 0x07cf, 0x07e3, 0x07eb, 0x07f7, + // Entry 80 - BF + 0x07ff, 0x0815, 0x081f, 0x0837, 0x0841, 0x0851, 0x085b, 0x086f, + 0x0887, 0x0899, 0x08a5, 0x08c1, 0x08cb, 0x08dd, 0x08ed, 0x08ff, + 0x0911, 0x0919, 0x092d, 0x093d, 0x094b, 0x0955, 0x0961, 0x0973, + 0x0981, 0x098f, 0x099f, 0x09ab, 0x09bd, 0x09c9, 0x09d7, 0x09eb, + 0x09f7, 0x0a01, 0x0a0d, 0x0a19, 0x0a29, 0x0a3b, 0x0a4b, 0x0a5d, + 0x0a65, 0x0a75, 0x0a7f, 0x0a93, 0x0aa1, 0x0ab1, 0x0abb, 0x0ac5, + 0x0acd, 0x0ad9, 0x0ae3, 0x0af3, 0x0b01, 0x0b0f, 0x0b19, 0x0b27, + 0x0b31, 0x0b31, 0x0b41, 0x0b49, 0x0b51, 0x0b5f, 0x0b5f, 0x0b6f, + // Entry C0 - FF + 0x0b6f, 0x0b87, 0x0ba3, 0x0baf, 0x0bc1, 0x0bcd, 0x0bcd, 0x0bdb, + 0x0bdb, 0x0be7, 0x0be7, 0x0be7, 0x0bed, 0x0bed, 0x0bfd, 0x0bfd, + 0x0c07, 0x0c13, 0x0c27, 0x0c27, 0x0c2f, 0x0c2f, 0x0c2f, 0x0c2f, + 0x0c35, 0x0c3f, 0x0c3f, 0x0c47, 0x0c47, 0x0c47, 0x0c62, 0x0c70, + 0x0c80, 0x0c88, 0x0c88, 0x0c88, 0x0c96, 0x0c96, 0x0c96, 0x0ca0, + 0x0ca0, 0x0ca8, 0x0ca8, 0x0cb8, 0x0cc8, 0x0cc8, 0x0cd8, 0x0cd8, + 0x0ce2, 0x0cf2, 0x0cf2, 0x0cfc, 0x0d0a, 0x0d12, 0x0d1c, 0x0d2a, + 0x0d32, 0x0d42, 0x0d5b, 0x0d65, 0x0d77, 0x0d83, 0x0d93, 0x0db6, + // Entry 100 - 13F + 0x0dc4, 0x0dc4, 0x0de2, 0x0df2, 0x0e02, 0x0e0e, 0x0e18, 0x0e26, + 0x0e32, 0x0e3e, 0x0e48, 0x0e54, 0x0e5e, 0x0e76, 0x0e76, 0x0e80, + 0x0ead, 0x0eb7, 0x0ec1, 0x0ec1, 0x0ec9, 0x0ed1, 0x0ed1, 0x0ee3, + 0x0eef, 0x0f01, 0x0f2e, 0x0f2e, 0x0f3a, 0x0f3a, 0x0f42, 0x0f56, + 0x0f56, 0x0f5c, 0x0f5c, 0x0f85, 0x0f9d, 0x0f9d, 0x0fba, 0x0fd7, + 0x0fed, 0x0ff1, 0x1001, 0x1001, 0x1009, 0x1011, 0x1011, 0x1019, + 0x102d, 0x102d, 0x1054, 0x1076, 0x1076, 0x1080, 0x1092, 0x10a4, + 0x10ae, 0x10c6, 0x10e7, 0x10e7, 0x10e7, 0x10f1, 0x10fd, 0x1107, + // Entry 140 - 17F + 0x1107, 0x1117, 0x1117, 0x112b, 0x1137, 0x1141, 0x1159, 0x1159, + 0x1161, 0x1169, 0x1169, 0x1173, 0x1187, 0x1187, 0x1187, 0x1195, + 0x11a1, 0x11ad, 0x11d0, 0x11ef, 0x11ef, 0x1207, 0x1217, 0x1227, + 0x122d, 0x1237, 0x123f, 0x1251, 0x1251, 0x1259, 0x1267, 0x1283, + 0x1283, 0x128b, 0x128b, 0x1295, 0x12a1, 0x12b6, 0x12b6, 0x12b6, + 0x12b6, 0x12c8, 0x12d8, 0x12f1, 0x12ff, 0x130d, 0x1317, 0x1338, + 0x1338, 0x1338, 0x1348, 0x1352, 0x1360, 0x136a, 0x136a, 0x137a, + 0x1388, 0x1394, 0x139e, 0x13aa, 0x13b4, 0x13c6, 0x13c6, 0x13c6, + // Entry 180 - 1BF + 0x13c6, 0x13d2, 0x13d2, 0x13dc, 0x13e4, 0x13fb, 0x13fb, 0x140e, + 0x141e, 0x1428, 0x142e, 0x1438, 0x143e, 0x143e, 0x143e, 0x144e, + 0x144e, 0x145a, 0x146a, 0x1478, 0x1488, 0x1498, 0x1498, 0x14a2, + 0x14ae, 0x14b8, 0x14c0, 0x14d0, 0x14fd, 0x1510, 0x1518, 0x1524, + 0x1536, 0x154a, 0x155a, 0x1566, 0x156e, 0x156e, 0x157c, 0x1592, + 0x159a, 0x15b0, 0x15be, 0x15be, 0x15be, 0x15c8, 0x15dc, 0x15dc, + 0x15f6, 0x15fe, 0x1614, 0x1624, 0x162c, 0x1638, 0x1638, 0x1644, + 0x1644, 0x164e, 0x166a, 0x166a, 0x1670, 0x1687, 0x168f, 0x16b0, + // Entry 1C0 - 1FF + 0x16c0, 0x16d0, 0x16da, 0x16e4, 0x16f0, 0x170f, 0x1723, 0x1739, + 0x1749, 0x175d, 0x176b, 0x176b, 0x176b, 0x176b, 0x1787, 0x1787, + 0x179b, 0x179b, 0x179b, 0x17ad, 0x17ad, 0x17c5, 0x17cd, 0x17cd, + 0x17e5, 0x17f4, 0x1808, 0x1808, 0x1808, 0x1812, 0x182b, 0x182b, + 0x182b, 0x182b, 0x183d, 0x1843, 0x184f, 0x185d, 0x1888, 0x1896, + 0x18a0, 0x18ae, 0x18ae, 0x18ae, 0x18b8, 0x18ce, 0x18e2, 0x18e2, + 0x18f8, 0x18f8, 0x1900, 0x1900, 0x190c, 0x1927, 0x1943, 0x1943, + 0x1953, 0x1959, 0x1959, 0x1965, 0x1965, 0x1965, 0x197b, 0x1992, + // Entry 200 - 23F + 0x19ab, 0x19c4, 0x19d2, 0x19e4, 0x19fb, 0x1a05, 0x1a05, 0x1a05, + 0x1a11, 0x1a19, 0x1a29, 0x1a39, 0x1a5c, 0x1a81, 0x1a91, 0x1a91, + 0x1a91, 0x1a9b, 0x1aa3, 0x1aaf, 0x1ab9, 0x1ac3, 0x1ac9, 0x1add, + 0x1add, 0x1aeb, 0x1af9, 0x1af9, 0x1b07, 0x1b1e, 0x1b2f, 0x1b2f, + 0x1b2f, 0x1b2f, 0x1b43, 0x1b43, 0x1b51, 0x1b67, 0x1b75, 0x1b85, + 0x1bb6, 0x1bc8, 0x1bda, 0x1be8, 0x1bf0, 0x1bf6, 0x1bf6, 0x1bf6, + 0x1bf6, 0x1bf6, 0x1c00, 0x1c00, 0x1c0c, 0x1c0c, 0x1c18, 0x1c22, + 0x1c2a, 0x1c38, 0x1c38, 0x1c44, 0x1c44, 0x1c4c, 0x1c50, 0x1c5a, + // Entry 240 - 27F + 0x1c5a, 0x1c5a, 0x1c5a, 0x1c6c, 0x1c7a, 0x1c91, 0x1c91, 0x1c9d, + 0x1cd7, 0x1cdf, 0x1d13, 0x1d1b, 0x1d53, 0x1d53, 0x1d53, 0x1d53, + 0x1d53, 0x1d53, 0x1d53, 0x1d6e, 0x1d6e, 0x1d6e, 0x1d6e, 0x1d6e, + 0x1d6e, 0x1d6e, 0x1d8a, 0x1d9e, 0x1d9e, 0x1d9e, 0x1db0, 0x1dcc, +} // Size: 1240 bytes + +var bnLangStr string = "" + // Size: 11932 bytes + "আফারআবখাজিয়ানআবেস্তীয়আফ্রিকান্সআকানআমহারিকআর্গোনিজআরবীআসামিআভেরিকআয়মা" + + "রাআজারবাইজানীবাশকিরবেলারুশিয়বুলগেরিয়বিসলামাবামবারাবাংলাতিব্বতিব্রেটন" + + "বসনীয়ানকাতালানচেচেনচামোরোকর্সিকানক্রিচেকচার্চ স্লাভিকচুবাসওয়েলশডেনিশ" + + "জার্মানদিবেহিজোঙ্গাইউয়িগ্রিকইংরেজিএস্পেরান্তোস্প্যানিশএস্তোনীয়বাস্কফ" + + "ার্সিফুলাহ্ফিনিশফিজিআনফারোসফরাসিপশ্চিম ফ্রিসিআনআইরিশস্কটস-গ্যেলিকগ্যাল" + + "িশিয়গুয়ারানিগুজরাটিম্যাঙ্কসহাউসাহিব্রুহিন্দিহিরি মোতুক্রোয়েশীয়হাইত" + + "িয়ানহাঙ্গেরীয়আর্মেনিয়হেরেরোইন্টারলিঙ্গুয়াইন্দোনেশীয়ইন্টারলিঙ্গইগ্" + + "\u200cবোসিচুয়ান য়িইনুপিয়াকইডোআইসল্যান্ডীয়ইতালীয়ইনুক্টিটুটজাপানিজাভা" + + "নিজজর্জিয়ানকঙ্গোকিকুয়ুকোয়ানিয়ামাকাজাখক্যালাল্লিসুটখমেরকান্নাড়ীকোর" + + "িয়ানকানুরিকাশ্মীরীকুর্দিশকোমিকর্ণিশকির্গিজলাটিনলুক্সেমবার্গীয়গান্ডাল" + + "িম্বুর্গিশলিঙ্গালালাওলিথুয়েনীয়লুবা-কাটাঙ্গালাত্\u200cভীয়মালাগাসিমার" + + "্শালিজমাওরিম্যাসিডোনীয়মালায়ালামমঙ্গোলিয়মারাঠিমালয়মল্টিয়বর্মিনাউরু" + + "উত্তর এন্দেবিলিনেপালীএন্দোঙ্গাডাচনরওয়েজীয়ান নিনর্স্কনরওয়েজিয়ান বোক" + + "মালদক্ষিণ এনডেবেলেনাভাজোনায়াঞ্জাঅক্সিটানওজিবওয়াঅরোমোওড়িয়াওসেটিকপাঞ" + + "্জাবীপালিপোলিশপাশ্তুপর্তুগীজকেচুয়ারোমান্সরুন্দিরোমানীয়রুশকিনয়ারোয়া" + + "ন্ডাসংষ্কৃতসার্ডিনিয়ানসিন্ধিউত্তরাঞ্চলীয় সামিসাঙ্গোসিংহলীস্লোভাকস্লো" + + "ভেনীয়সামোয়ানশোনাসোমালীআলবেনীয়সার্বীয়সোয়াতিদক্ষিন সোথোসুন্দানীসুইড" + + "িশসোয়াহিলিতামিলতেলেগুতাজিকথাইতিগরিনিয়াতুর্কমেনীসোয়ানাটোঙ্গানতুর্কীস" + + "ঙ্গাতাতারতাহিতিয়ানউইঘুরইউক্রেনীয়উর্দুউজবেকীয়ভেন্ডাভিয়েতনামীভোলাপুক" + + "ওয়ালুনউওলোফজোসায়িদ্দিশইওরুবাঝু্য়াঙচীনাজুলুঅ্যাচাইনিজআকোলিঅদাগ্মেআদে" + + "গেআফ্রিহিলিএঘেমআইনুআক্কাদিয়ানআলেউতদক্ষিন আলতাইপ্রাচীন ইংরেজীআঙ্গিকাআর" + + "ামাইকমাপুচিআরাপাহোআরাওয়াকআসুআস্তুরিয়আওয়াধিবেলুচীবালিনীয়বাসাবেজাবেম" + + "্বাবেনাপশ্চিম বালোচিভোজপুরিবিকোলবিনিসিকসিকাব্রাজবোড়োবুরিয়াতবুগিনিব্ল" + + "িনক্যাডোক্যারিবআত্সামচেবুয়ানোচিগাচিবচাচাগাতাইচুকিমারিচিনুক জার্গনচকটো" + + "ওচিপেওয়ানচেরোকীশাইয়েনসোরানি কুর্দিশকপটিকক্রিমিয়ান তুর্কিকাশুবিয়ানড" + + "াকোটাদার্গওয়াতাইতাডেলাওয়েরস্ল্যাভদোগ্রীবডিংকাজার্মাডোগরিনিম্নতর সোর্" + + "বিয়ানদুয়ালামধ্য ডাচজলা-ফনীডিউলাএম্বুএফিকপ্রাচীন মিশরীয়ইকাজুকএলামাইট" + + "মধ্য ইংরেজিইওন্ডোফ্যাঙ্গফিলিপিনোফনমধ্য ফরাসিপ্রাচীন ফরাসিউত্তরাঞ্চলীয়" + + " ফ্রিসিয়ানপূর্ব ফ্রিসিয়ফ্রিউলিয়ানগাগাগাউজগায়োবায়াগীজগিলবার্টিজমধ্য-" + + "উচ্চ জার্মানিপ্রাচীন উচ্চ জার্মানিগোন্ডিগোরোন্তালোগথিকগ্রেবোপ্রাচীন গ্" + + "রীকসুইস জার্মানগুসীগওইচ্’ইনহাইডাহাওয়াইয়ানহিলিগ্যায়নোনহিট্টিটহ্" + + "\u200cমোঙউচ্চ সোর্বিয়ানহুপাইবানইলোকোইঙ্গুশলোজবানগোম্বামাকামেজুদেও ফার্স" + + "িজুদেও আরবিকারা-কাল্পাককাবাইলেকাচিনঅজ্জুকাম্বাকাউইকাবার্ডিয়ানটাইয়াপম" + + "াকোন্দেকাবুভারদিয়ানুকোরোখাশিখোটানিজকোয়রা চীনিকালেনজিনকিম্বুন্দুকমি-প" + + "ারমিআককোঙ্কানিকোস্রাইনক্\u200cপেল্লেকারচে-বাল্কারকারেলিয়ানকুরুখশাম্বা" + + "লাবাফিয়াকুমিককুটেনাইলাডিনোলাঙ্গিলান্ডালাম্বালেজঘিয়ানলাকোটামোঙ্গোলোজি" + + "উত্তর লুরিলুবা-লুলুয়ালুইসেনোলুন্ডালুয়োলুশাইলুইয়ামাদুরেসেমাগাহিমৈথিল" + + "িম্যাকাসারম্যান্ডিঙ্গোমাসাইমোকশাম্যাণ্ডারমেন্ডেমেরুমরিসিয়ানমধ্য আইরিশ" + + "মাখুয়া-মেত্তোমেটামিকম্যাকমিনাঙ্গ্\u200cকাবাউমাঞ্চুমণিপুরীমোহাওকমসিমুদ" + + "াঙ্গবহুগুণিতক ভাষাসমূহক্রিকমিরান্ডিজমারোয়ারিএরজিয়ামাজানদেরানিনেয়াপো" + + "লিটাননামানিম্ন জার্মানিনেওয়ারিনিয়াসনিউয়ানকোয়াসিওনোগাইপ্রাচীন নর্সএ" + + "ন’কোউত্তরাঞ্চলীয় সোথোনুয়ারপ্রাচীন নেওয়ারীন্যায়ামওয়েজিন্যায়াঙ্কোল" + + "েন্যোরোএন্.জিমাওসেজঅটোমান তুর্কিপাঙ্গাসিনানপাহ্লাভিপাম্পাঙ্গাপাপিয়ামে" + + "ন্টোপালায়ুয়ানপ্রাচীন ফার্সিফোনিশীয়ানপোহ্নপেইয়ানপ্রাচীন প্রোভেনসালক" + + "ি‘চেরাজস্থানীরাপানুইরারোটোংগানরম্বোরোমানিআরমেনিয়ানরাওয়াস্যান্ডাওয়েই" + + "য়াকুটসামারিটান আরামিকসামবুরুসাসাকসাঁওতালিসাঙ্গুসিসিলিয়ানস্কটসদক্ষিণ " + + "কুর্দিশসেনাসেল্কুপকোয়রাবেনো সেন্নীপ্রাচীন আইরিশতাচেলহিতশানসিডামোদক্ষি" + + "ণাঞ্চলীয় সামিলুলে সামিইনারি সামিস্কোল্ট সামিসোনিঙ্কেসোগডিয়ানস্রানান " + + "টোঙ্গোসেরেরসুকুমাসুসুসুমেরীয়কঙ্গো সোয়াহিলিপ্রাচীন সিরিওসিরিয়াকটাইম্" + + "নেতেসোতেরেনোতেতুমটাইগ্রেটিভটোকেলাউক্লিঙ্গনত্লিঙ্গিটতামাশেকনায়াসা টোঙ্" + + "গাটোক পিসিনসিমশিয়ানতুম্বুকাটুভালুতাসাওয়াকটুভিনিয়ানসেন্ট্রাল আটলাস ত" + + "ামাজিগাতউডমুর্টউগারিটিকউম্বুন্দুমূলভাইভোটিকভুঞ্জোওয়ালামোওয়ারেওয়াশোও" + + "য়ার্লপিরিকাল্মইকসোগাইয়াওইয়াপেসেজাপোটেকচিত্র ভাষাজেনাগাআদর্শ মরক্কোন" + + " তামাজিগাতজুনিভাষাভিত্তিক বিষয়বস্তু নেইজাজাআধুনিক আদর্শ আরবীঅস্ট্রিয়ান" + + " জার্মানসুইস হাই জার্মানঅস্ট্রেলীয় ইংরেজিকানাডীয় ইংরেজিব্রিটিশ ইংরেজিআ" + + "মেরিকার ইংরেজিল্যাটিন আমেরিকান স্প্যানিশইউরোপীয় স্প্যানিশম্যাক্সিকান " + + "স্প্যানিশকানাডীয় ফরাসিসুইস ফরাসিলো স্যাক্সনফ্লেমিশব্রাজিলের পর্তুগীজই" + + "উরোপের পর্তুগীজমলদাভিয়সার্বো-ক্রোয়েশিয়সরলীকৃত চীনাঐতিহ্যবাহি চীনা" + +var bnLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000c, 0x002a, 0x0045, 0x0063, 0x006f, 0x0084, 0x009c, + 0x00a8, 0x00b7, 0x00c9, 0x00de, 0x00ff, 0x0111, 0x012f, 0x014a, + 0x015f, 0x0174, 0x0183, 0x0198, 0x01aa, 0x01c2, 0x01d7, 0x01e6, + 0x01f8, 0x0210, 0x021c, 0x0225, 0x024a, 0x0259, 0x026b, 0x027a, + 0x028f, 0x02a1, 0x02b3, 0x02c2, 0x02d1, 0x02e3, 0x0304, 0x031f, + 0x033a, 0x0349, 0x035b, 0x036d, 0x037c, 0x038e, 0x039d, 0x03ac, + 0x03d7, 0x03e6, 0x040b, 0x0429, 0x0444, 0x0459, 0x0471, 0x0480, + 0x0492, 0x04a4, 0x04bd, 0x04de, 0x04f9, 0x0517, 0x0532, 0x0544, + // Entry 40 - 7F + 0x0571, 0x0592, 0x05b3, 0x05c5, 0x05e7, 0x0602, 0x060b, 0x0632, + 0x0647, 0x0665, 0x0677, 0x068c, 0x06a7, 0x06b6, 0x06cb, 0x06ef, + 0x06fe, 0x0725, 0x0731, 0x074c, 0x0764, 0x0776, 0x078e, 0x07a3, + 0x07af, 0x07c1, 0x07d6, 0x07e5, 0x0812, 0x0824, 0x0845, 0x085d, + 0x0866, 0x0887, 0x08ac, 0x08c7, 0x08df, 0x08fa, 0x0909, 0x092d, + 0x094b, 0x0966, 0x0978, 0x0987, 0x099c, 0x09ab, 0x09ba, 0x09e5, + 0x09f7, 0x0a12, 0x0a1b, 0x0a58, 0x0a8f, 0x0aba, 0x0acc, 0x0ae7, + 0x0aff, 0x0b17, 0x0b26, 0x0b3b, 0x0b4d, 0x0b65, 0x0b71, 0x0b80, + // Entry 80 - BF + 0x0b92, 0x0baa, 0x0bbf, 0x0bd4, 0x0be6, 0x0bfe, 0x0c07, 0x0c34, + 0x0c49, 0x0c6d, 0x0c7f, 0x0cb3, 0x0cc5, 0x0cd7, 0x0cec, 0x0d0a, + 0x0d22, 0x0d2e, 0x0d40, 0x0d58, 0x0d70, 0x0d85, 0x0da4, 0x0dbc, + 0x0dce, 0x0de9, 0x0df8, 0x0e0a, 0x0e19, 0x0e22, 0x0e40, 0x0e5b, + 0x0e70, 0x0e85, 0x0e97, 0x0ea6, 0x0eb5, 0x0ed3, 0x0ee2, 0x0f00, + 0x0f0f, 0x0f27, 0x0f39, 0x0f57, 0x0f6c, 0x0f81, 0x0f90, 0x0f9c, + 0x0fb4, 0x0fc6, 0x0fdb, 0x0fe7, 0x0ff3, 0x1011, 0x1020, 0x1035, + 0x1044, 0x1044, 0x105f, 0x106b, 0x1077, 0x1098, 0x1098, 0x10a7, + // Entry C0 - FF + 0x10a7, 0x10c9, 0x10f1, 0x1106, 0x111b, 0x112d, 0x112d, 0x1142, + 0x1142, 0x115a, 0x115a, 0x115a, 0x1163, 0x1163, 0x117e, 0x117e, + 0x1193, 0x11a5, 0x11bd, 0x11bd, 0x11c9, 0x11c9, 0x11c9, 0x11c9, + 0x11d5, 0x11e7, 0x11e7, 0x11f3, 0x11f3, 0x11f3, 0x1218, 0x122d, + 0x123c, 0x1248, 0x1248, 0x1248, 0x125d, 0x125d, 0x125d, 0x126c, + 0x126c, 0x127b, 0x127b, 0x1293, 0x12a5, 0x12a5, 0x12b4, 0x12b4, + 0x12c6, 0x12db, 0x12db, 0x12ed, 0x1308, 0x1314, 0x1323, 0x1338, + 0x1344, 0x1350, 0x1372, 0x1381, 0x139c, 0x13ae, 0x13c3, 0x13eb, + // Entry 100 - 13F + 0x13fa, 0x13fa, 0x142b, 0x1449, 0x145b, 0x1476, 0x1485, 0x14a0, + 0x14b5, 0x14ca, 0x14d9, 0x14eb, 0x14fa, 0x152e, 0x152e, 0x1543, + 0x1559, 0x156c, 0x157b, 0x157b, 0x158a, 0x1596, 0x1596, 0x15c1, + 0x15d3, 0x15e8, 0x1607, 0x1607, 0x1619, 0x1619, 0x162e, 0x1646, + 0x1646, 0x164c, 0x164c, 0x1668, 0x168d, 0x168d, 0x16d3, 0x16fb, + 0x171c, 0x1722, 0x1734, 0x1734, 0x1743, 0x1752, 0x1752, 0x175b, + 0x1779, 0x1779, 0x17ab, 0x17e6, 0x17e6, 0x17f8, 0x1816, 0x1822, + 0x1834, 0x1859, 0x187b, 0x187b, 0x187b, 0x1887, 0x189f, 0x18ae, + // Entry 140 - 17F + 0x18ae, 0x18cf, 0x18cf, 0x18f6, 0x190b, 0x191d, 0x1948, 0x1948, + 0x1954, 0x1960, 0x1960, 0x196f, 0x1981, 0x1981, 0x1981, 0x1993, + 0x19a5, 0x19b7, 0x19d9, 0x19f5, 0x19f5, 0x1a17, 0x1a2c, 0x1a3b, + 0x1a4a, 0x1a5c, 0x1a68, 0x1a8c, 0x1a8c, 0x1aa1, 0x1ab9, 0x1ae3, + 0x1ae3, 0x1aef, 0x1aef, 0x1afb, 0x1b10, 0x1b2f, 0x1b2f, 0x1b2f, + 0x1b2f, 0x1b47, 0x1b65, 0x1b84, 0x1b9c, 0x1bb4, 0x1bcf, 0x1bf4, + 0x1bf4, 0x1bf4, 0x1c12, 0x1c21, 0x1c39, 0x1c4e, 0x1c4e, 0x1c5d, + 0x1c72, 0x1c84, 0x1c96, 0x1ca8, 0x1cba, 0x1cd5, 0x1cd5, 0x1cd5, + // Entry 180 - 1BF + 0x1cd5, 0x1ce7, 0x1ce7, 0x1cf9, 0x1d05, 0x1d21, 0x1d21, 0x1d43, + 0x1d58, 0x1d6a, 0x1d79, 0x1d88, 0x1d9a, 0x1d9a, 0x1d9a, 0x1db2, + 0x1db2, 0x1dc4, 0x1dd6, 0x1df1, 0x1e15, 0x1e24, 0x1e24, 0x1e33, + 0x1e4e, 0x1e60, 0x1e6c, 0x1e87, 0x1ea3, 0x1ecb, 0x1ed7, 0x1eef, + 0x1f19, 0x1f2b, 0x1f40, 0x1f52, 0x1f5b, 0x1f5b, 0x1f70, 0x1fa4, + 0x1fb3, 0x1fce, 0x1fe9, 0x1fe9, 0x1fe9, 0x1ffe, 0x201f, 0x201f, + 0x2043, 0x204f, 0x2077, 0x208f, 0x20a1, 0x20b6, 0x20b6, 0x20ce, + 0x20ce, 0x20dd, 0x20ff, 0x20ff, 0x210e, 0x2142, 0x2154, 0x2182, + // Entry 1C0 - 1FF + 0x21ac, 0x21d3, 0x21e5, 0x21fb, 0x2207, 0x222c, 0x224d, 0x2265, + 0x2283, 0x22aa, 0x22cb, 0x22cb, 0x22cb, 0x22cb, 0x22f3, 0x22f3, + 0x2311, 0x2311, 0x2311, 0x2335, 0x2335, 0x2369, 0x2378, 0x2378, + 0x2393, 0x23a8, 0x23c6, 0x23c6, 0x23c6, 0x23d5, 0x23e7, 0x23e7, + 0x23e7, 0x23e7, 0x2405, 0x2417, 0x243b, 0x2450, 0x247e, 0x2493, + 0x24a2, 0x24ba, 0x24ba, 0x24ba, 0x24cc, 0x24ea, 0x24f9, 0x24f9, + 0x2521, 0x2521, 0x252d, 0x252d, 0x2542, 0x2573, 0x2598, 0x2598, + 0x25b0, 0x25b9, 0x25b9, 0x25cb, 0x25cb, 0x25cb, 0x2602, 0x261b, + // Entry 200 - 23F + 0x2637, 0x2659, 0x2671, 0x268c, 0x26b4, 0x26c3, 0x26c3, 0x26c3, + 0x26d5, 0x26e1, 0x26f9, 0x26f9, 0x2724, 0x2749, 0x2761, 0x2761, + 0x2761, 0x2776, 0x2782, 0x2794, 0x27a3, 0x27b8, 0x27c1, 0x27d6, + 0x27d6, 0x27ee, 0x2809, 0x2809, 0x281e, 0x2846, 0x285f, 0x285f, + 0x285f, 0x285f, 0x287a, 0x287a, 0x2892, 0x28a4, 0x28bf, 0x28dd, + 0x2924, 0x2939, 0x2951, 0x296c, 0x2975, 0x297e, 0x297e, 0x297e, + 0x297e, 0x297e, 0x298d, 0x298d, 0x299f, 0x299f, 0x29b7, 0x29c9, + 0x29db, 0x29fc, 0x29fc, 0x2a11, 0x2a11, 0x2a1d, 0x2a2c, 0x2a44, + // Entry 240 - 27F + 0x2a44, 0x2a44, 0x2a44, 0x2a44, 0x2a59, 0x2a75, 0x2a75, 0x2a87, + 0x2ac8, 0x2ad4, 0x2b1e, 0x2b2a, 0x2b59, 0x2b59, 0x2b90, 0x2bbc, + 0x2bf0, 0x2c1b, 0x2c43, 0x2c6e, 0x2cb8, 0x2cec, 0x2d29, 0x2d29, + 0x2d51, 0x2d6d, 0x2d8c, 0x2da1, 0x2dd5, 0x2e03, 0x2e1b, 0x2e4f, + 0x2e71, 0x2e9c, +} // Size: 1244 bytes + +var caLangStr string = "" + // Size: 4535 bytes + "àfarabkhazavèsticafrikaansàkanamhàricaragonèsàrabassamèsàvaraimaraazerba" + + "idjanèsbaixkirbielorúsbúlgarbislamabambarabengalítibetàbretóbosniàcatalà" + + "txetxèchamorrocorscreetxeceslau eclesiàstictxuvaixgal·lèsdanèsalemanydiv" + + "ehidzongkaewegrecanglèsesperantoespanyolestoniàbascpersafulfinèsfijiàfer" + + "oèsfrancèsfrisó occidentalirlandèsgaèlic escocèsgallecguaranígujaratiman" + + "xhaussahebreuhindihiri motucroathaitiàhongarèsarmenihererointerlinguaind" + + "onesiinterlingueigboyi sichuaninupiakidoislandèsitaliàinuktitutjaponèsja" + + "vanèsgeorgiàkongokikuiukuanyamakazakhgrenlandèskhmerkannadacoreàkanurica" + + "ixmirikurdkomicòrnickirguísllatíluxemburguèsgandalimburguèslingalalaosià" + + "lituàluba katangaletómalgaixmarshallèsmaorimacedonimalaiàlammongolmarath" + + "imalaimaltèsbirmànauruàndebele septentrionalnepalèsndonganeerlandèsnorue" + + "c nynorsknoruec bokmålndebele meridionalnavahonyanjaoccitàojibwaoromoori" + + "yaossetapanjabipalipolonèspaixtuportuguèsquítxuaretoromànicrundiromanèsr" + + "usruandèssànscritsardsindhisami septentrionalsangosingalèseslovaceslovès" + + "amoàshonasomalialbanèsserbiswazisotho meridionalsundanèssuecsuahilitàmil" + + "telugutadjiktailandèstigrinyaturcmansetswanatongalèsturctsongatàtartahit" + + "iàuigurucraïnèsurdúuzbekvendavietnamitavolapükvalówòlofxosajiddischiorub" + + "azhuangxinèszuluatjehacoliadangmeadiguéafrihiliaghemainuaccadialabamaale" + + "utaalbanès gegaltaic meridionalanglès anticangikaarameuaraucàaraonaarapa" + + "hoarauacàrab egipciparellengua de signes americanaasturiàawadhibalutxiba" + + "linèsbavarèsbasabamunghomalabejabembabenabafutbadagabalutxi occidentalbh" + + "ojpuribicolbinikomblackfootbrajbrahuibodoakooseburiatbuguisekibilinmedum" + + "bacaddocaribcayugaatsamcebuàchigatxibtxatxagataichuukmaripidgin chinookc" + + "hoctawchipewyancherokeexeiennekurd soranicoptetàtar de Crimeacaixubidako" + + "tadarguàtaitadelawareslaveydogribdinkazarmadogribaix sòrabdoualaneerland" + + "ès mitjàdiolajuladazagaembuefikemiliàegipci anticekajukelamitaanglès mi" + + "tjàewondoextremenyfangfilipífonfrancès mitjàfrancès anticfrisó septentri" + + "onalfrisó orientalfriülàgagagaúsxinès gangayogbayagueezgilbertèsgilakial" + + "t alemany mitjàalt alemany anticconcani de Goagondigorontalogòticgrebogr" + + "ec anticalemany suíswayúgusígwichinhaidaxinès hakkahawaiàhindi de Fijihi" + + "ligainonhititahmongalt sòrabxinès xianghupaibanibibioilocàingúixcrioll a" + + "nglès de Jamaicalojbanngombamachamejudeopersajudeoàrabkarakalpakcabilenc" + + "katxinjjukambakawikabardíkanembutyapmakondecrioll capverdiàkenyangkoroka" + + "ingàkhasikhotanèskoyra chiinikakokalenjinkimbundukomi-permiackonkanikosr" + + "aeàkpellekaratxaikriocareliàkurukhshambalabafiacologniankúmikkutenailadí" + + "langipanjabi occidentallambalesguiàlígurlakotallombardmongoloziluri sept" + + "entrionalluba-lulualuisenyolundaluomizoluyiaxinès clàssiclazmadurèsmafam" + + "agahimaithilimakassarmandingamassaimabamordovià moksamandarmendemerumaur" + + "iciàgaèlic irlandès mitjàmakhuwa-mettometa’micmacminangkabaumanxúmanipur" + + "ímohawkmorémari occidentalmundangllengües vàriescreekmirandèsmarwarimye" + + "nemordovià erzamazanderanixinès min del sudnapolitànamabaix alemanynewar" + + "iniasniueàbissiongiemboonnogainòrdic anticnovialn’Kosotho septentrionaln" + + "uernewari clàssicnyamwesinyankolenyoronzemaosageturc otomàpangasipahlavi" + + "pampangapapiamentopalauàpicardalemany pennsilvaniàpersa anticalemany pal" + + "atífenicipiemontèsgrec pònticponapeàprovençal anticquitxérajasthanirapan" + + "uirarotongàromanyèsromboromaníaromanèsrwosandaweiacutarameu samaritàsamb" + + "urusasaksantalingambaysangusiciliàescocèssard sasserèskurd meridionalsen" + + "ecasenaselkupsonghai orientalirlandès antictaixelhitxanàrab txadiàsidamo" + + "sami meridionalsami lulesami d’Inarisami skoltsoninkesogdiàsrananserersa" + + "hosukumasusúsumericomoriàsuahili del Congosiríac clàssicsiríacsilesiàtem" + + "netesoterenatetuntigretivtokelauèstsakhurklingoniàtlingittalixamazictong" + + "atok pisintarokotsimshiàtat meridionaltumbukatuvaluàtasawaqtuviniàamazic" + + " del Marroc centraludmurtugaríticumbunduarrelvaivènetvepseflamenc occide" + + "ntalvòticvunjowalserametowaraywashowarlpirixinès wucalmucmingreliàsogaya" + + "oyapeàyangbenyembacantonèszapotecasímbols Blisszelandèszenagaamazic està" + + "ndard marroquízunisense contingut lingüísticzazaàrab estàndard modernale" + + "many austríacalt alemany suísanglès australiàanglès canadencanglès brità" + + "nicanglès americàespanyol hispanoamericàespanyol europeuespanyol de Mèxi" + + "cfrancès canadencfrancès suísbaix saxóflamencportuguès del Brasilportugu" + + "ès de Portugalmoldauserbocroatxinès simplificatxinès tradicional" + +var caLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0005, 0x000b, 0x0013, 0x001c, 0x0021, 0x0029, 0x0032, + 0x0037, 0x003f, 0x0044, 0x004a, 0x0058, 0x005f, 0x0068, 0x006f, + 0x0076, 0x007d, 0x0085, 0x008c, 0x0092, 0x0099, 0x00a0, 0x00a7, + 0x00af, 0x00b3, 0x00b7, 0x00bb, 0x00cd, 0x00d4, 0x00dd, 0x00e3, + 0x00ea, 0x00f0, 0x00f7, 0x00fa, 0x00fe, 0x0105, 0x010e, 0x0116, + 0x011e, 0x0122, 0x0127, 0x012a, 0x0130, 0x0136, 0x013d, 0x0145, + 0x0156, 0x015f, 0x016f, 0x0175, 0x017d, 0x0185, 0x0189, 0x018f, + 0x0195, 0x019a, 0x01a3, 0x01a8, 0x01af, 0x01b8, 0x01be, 0x01c4, + // Entry 40 - 7F + 0x01cf, 0x01d7, 0x01e2, 0x01e6, 0x01f0, 0x01f7, 0x01fa, 0x0203, + 0x020a, 0x0213, 0x021b, 0x0223, 0x022b, 0x0230, 0x0236, 0x023e, + 0x0244, 0x024f, 0x0254, 0x025b, 0x0261, 0x0267, 0x026f, 0x0273, + 0x0277, 0x027e, 0x0286, 0x028c, 0x0299, 0x029e, 0x02a9, 0x02b0, + 0x02b7, 0x02bd, 0x02c9, 0x02ce, 0x02d5, 0x02e0, 0x02e5, 0x02ed, + 0x02f7, 0x02fd, 0x0304, 0x0309, 0x0310, 0x0316, 0x031d, 0x0332, + 0x033a, 0x0340, 0x034b, 0x0359, 0x0367, 0x0379, 0x037f, 0x0385, + 0x038c, 0x0392, 0x0397, 0x039c, 0x03a2, 0x03a9, 0x03ad, 0x03b5, + // Entry 80 - BF + 0x03bb, 0x03c5, 0x03cd, 0x03d9, 0x03de, 0x03e6, 0x03e9, 0x03f1, + 0x03fa, 0x03fe, 0x0404, 0x0416, 0x041b, 0x0424, 0x042b, 0x0432, + 0x0438, 0x043d, 0x0443, 0x044b, 0x0450, 0x0455, 0x0465, 0x046e, + 0x0472, 0x0479, 0x047f, 0x0485, 0x048b, 0x0495, 0x049d, 0x04a4, + 0x04ac, 0x04b5, 0x04b9, 0x04bf, 0x04c5, 0x04cd, 0x04d2, 0x04dc, + 0x04e1, 0x04e6, 0x04eb, 0x04f5, 0x04fd, 0x0502, 0x0508, 0x050c, + 0x0514, 0x051a, 0x0520, 0x0526, 0x052a, 0x052f, 0x0534, 0x053b, + 0x0542, 0x0542, 0x054a, 0x054f, 0x0553, 0x0559, 0x0560, 0x0566, + // Entry C0 - FF + 0x0572, 0x0583, 0x0590, 0x0596, 0x059c, 0x05a3, 0x05a9, 0x05b0, + 0x05b0, 0x05b6, 0x05b6, 0x05c2, 0x05c6, 0x05e1, 0x05e9, 0x05e9, + 0x05ef, 0x05f6, 0x05fe, 0x0606, 0x060a, 0x060f, 0x060f, 0x0616, + 0x061a, 0x061f, 0x061f, 0x0623, 0x0628, 0x062e, 0x0640, 0x0648, + 0x064d, 0x0651, 0x0651, 0x0654, 0x065d, 0x065d, 0x065d, 0x0661, + 0x0667, 0x066b, 0x0671, 0x0677, 0x067c, 0x0680, 0x0685, 0x068c, + 0x0691, 0x0696, 0x069c, 0x06a1, 0x06a7, 0x06ac, 0x06b3, 0x06bb, + 0x06c0, 0x06c4, 0x06d2, 0x06d9, 0x06e2, 0x06ea, 0x06f1, 0x06fc, + // Entry 100 - 13F + 0x0701, 0x0701, 0x0711, 0x0718, 0x071e, 0x0725, 0x072a, 0x0732, + 0x0738, 0x073e, 0x0743, 0x0748, 0x074d, 0x0758, 0x0758, 0x075e, + 0x0770, 0x0775, 0x0779, 0x077f, 0x0783, 0x0787, 0x078e, 0x079a, + 0x07a0, 0x07a7, 0x07b5, 0x07b5, 0x07bb, 0x07c4, 0x07c8, 0x07cf, + 0x07cf, 0x07d2, 0x07d2, 0x07e1, 0x07ef, 0x07ef, 0x0803, 0x0812, + 0x081a, 0x081c, 0x0823, 0x082d, 0x0831, 0x0836, 0x0836, 0x083b, + 0x0845, 0x084b, 0x085d, 0x086e, 0x087c, 0x0881, 0x088a, 0x0890, + 0x0895, 0x089f, 0x08ac, 0x08b1, 0x08b1, 0x08b6, 0x08bd, 0x08c2, + // Entry 140 - 17F + 0x08ce, 0x08d5, 0x08e2, 0x08ec, 0x08f2, 0x08f7, 0x0901, 0x090d, + 0x0911, 0x0915, 0x091b, 0x0921, 0x0928, 0x0928, 0x0941, 0x0947, + 0x094d, 0x0954, 0x095e, 0x0968, 0x0968, 0x0972, 0x097a, 0x0980, + 0x0983, 0x0988, 0x098c, 0x0994, 0x099b, 0x099f, 0x09a6, 0x09b7, + 0x09be, 0x09c2, 0x09c9, 0x09ce, 0x09d7, 0x09e3, 0x09e3, 0x09e3, + 0x09e7, 0x09ef, 0x09f7, 0x0a03, 0x0a0a, 0x0a12, 0x0a18, 0x0a20, + 0x0a24, 0x0a24, 0x0a2c, 0x0a32, 0x0a3a, 0x0a3f, 0x0a48, 0x0a4e, + 0x0a55, 0x0a5a, 0x0a5f, 0x0a71, 0x0a76, 0x0a7e, 0x0a7e, 0x0a84, + // Entry 180 - 1BF + 0x0a84, 0x0a8a, 0x0a92, 0x0a97, 0x0a9b, 0x0aad, 0x0aad, 0x0ab7, + 0x0abf, 0x0ac4, 0x0ac7, 0x0acb, 0x0ad0, 0x0adf, 0x0ae2, 0x0aea, + 0x0aee, 0x0af4, 0x0afc, 0x0b04, 0x0b0c, 0x0b12, 0x0b16, 0x0b25, + 0x0b2b, 0x0b30, 0x0b34, 0x0b3d, 0x0b55, 0x0b62, 0x0b69, 0x0b6f, + 0x0b7a, 0x0b80, 0x0b89, 0x0b8f, 0x0b94, 0x0ba3, 0x0baa, 0x0bbb, + 0x0bc0, 0x0bc9, 0x0bd0, 0x0bd0, 0x0bd5, 0x0be3, 0x0bee, 0x0c00, + 0x0c09, 0x0c0d, 0x0c19, 0x0c1f, 0x0c23, 0x0c29, 0x0c29, 0x0c2f, + 0x0c38, 0x0c3d, 0x0c4a, 0x0c50, 0x0c56, 0x0c69, 0x0c6d, 0x0c7c, + // Entry 1C0 - 1FF + 0x0c84, 0x0c8c, 0x0c91, 0x0c96, 0x0c9b, 0x0ca6, 0x0cad, 0x0cb4, + 0x0cbc, 0x0cc6, 0x0ccd, 0x0cd3, 0x0ce8, 0x0ce8, 0x0cf3, 0x0d02, + 0x0d08, 0x0d12, 0x0d1e, 0x0d26, 0x0d26, 0x0d36, 0x0d3d, 0x0d3d, + 0x0d47, 0x0d4e, 0x0d58, 0x0d61, 0x0d61, 0x0d66, 0x0d6d, 0x0d6d, + 0x0d6d, 0x0d6d, 0x0d76, 0x0d79, 0x0d80, 0x0d85, 0x0d95, 0x0d9c, + 0x0da1, 0x0da8, 0x0da8, 0x0daf, 0x0db4, 0x0dbc, 0x0dc4, 0x0dd2, + 0x0de1, 0x0de7, 0x0deb, 0x0deb, 0x0df1, 0x0e01, 0x0e10, 0x0e10, + 0x0e19, 0x0e1c, 0x0e29, 0x0e2f, 0x0e2f, 0x0e2f, 0x0e3e, 0x0e47, + // Entry 200 - 23F + 0x0e55, 0x0e5f, 0x0e66, 0x0e6d, 0x0e73, 0x0e78, 0x0e7c, 0x0e7c, + 0x0e82, 0x0e87, 0x0e8d, 0x0e95, 0x0ea6, 0x0eb6, 0x0ebd, 0x0ec5, + 0x0ec5, 0x0eca, 0x0ece, 0x0ed4, 0x0ed9, 0x0ede, 0x0ee1, 0x0eeb, + 0x0ef2, 0x0efc, 0x0f03, 0x0f08, 0x0f0e, 0x0f13, 0x0f1c, 0x0f1c, + 0x0f22, 0x0f22, 0x0f2b, 0x0f39, 0x0f40, 0x0f48, 0x0f4f, 0x0f57, + 0x0f70, 0x0f76, 0x0f7f, 0x0f86, 0x0f8b, 0x0f8e, 0x0f94, 0x0f99, + 0x0fab, 0x0fab, 0x0fb1, 0x0fb1, 0x0fb6, 0x0fbc, 0x0fc1, 0x0fc6, + 0x0fcb, 0x0fd3, 0x0fdc, 0x0fe2, 0x0fec, 0x0ff0, 0x0ff3, 0x0ff9, + // Entry 240 - 27F + 0x1000, 0x1005, 0x1005, 0x100e, 0x1016, 0x1024, 0x102d, 0x1033, + 0x104e, 0x1052, 0x106e, 0x1072, 0x1089, 0x1089, 0x109a, 0x10ab, + 0x10bd, 0x10cd, 0x10de, 0x10ee, 0x1106, 0x1116, 0x1128, 0x1128, + 0x1139, 0x1147, 0x1151, 0x1158, 0x116d, 0x1183, 0x1189, 0x1193, + 0x11a5, 0x11b7, +} // Size: 1244 bytes + +var csLangStr string = "" + // Size: 7315 bytes + "afarštinaabcházštinaavestánštinaafrikánštinaakanštinaamharštinaaragonšti" + + "naarabštinaásámštinaavarštinaajmarštinaázerbájdžánštinabaškirštinaběloru" + + "štinabulharštinabislamštinabambarštinabengálštinatibetštinabretonštinab" + + "osenštinakatalánštinačečenštinačamorokorsičtinakríjštinačeštinastaroslov" + + "ěnštinačuvaštinavelštinadánštinaněmčinamaledivštinadzongkäeweštinařečti" + + "naangličtinaesperantošpanělštinaestonštinabaskičtinaperštinafulbštinafin" + + "štinafidžijštinafaerštinafrancouzštinafríštinairštinaskotská gaelštinag" + + "alicijštinaguaranštinagudžarátštinamanštinahauštinahebrejštinahindštinah" + + "iri motuchorvatštinahaitštinamaďarštinaarménštinahererštinainterlinguain" + + "donéštinainterlingueigboštinaiština (sečuánská)inupiakštinaidoislandštin" + + "aitalštinainuktitutštinajaponštinajavánštinagruzínštinakonžštinakikujšti" + + "nakuaňamštinakazaštinagrónštinakhmérštinakannadštinakorejštinakanurikašm" + + "írštinakurdštinakomijštinakornštinakyrgyzštinalatinalucemburštinagandšt" + + "inalimburštinalingalštinalaoštinalitevštinalubu-katanžštinalotyštinamalg" + + "aštinamaršálštinamaorštinamakedonštinamalajálamštinamongolštinamaráthšti" + + "namalajštinamaltštinabarmštinanaurštinandebele (Zimbabwe)nepálštinandond" + + "štinanizozemštinanorština (nynorsk)norština (bokmål)ndebele (Jižní Afri" + + "ka)navažštinaňandžštinaokcitánštinaodžibvejštinaoromštinaurijštinaosetšt" + + "inapaňdžábštinapálípolštinapaštštinaportugalštinakečuánštinarétorománšti" + + "nakirundštinarumunštinaruštinakiňarwandštinasanskrtsardštinasindhštinasá" + + "mština (severní)sangštinasinhálštinaslovenštinaslovinštinasamojštinašonš" + + "tinasomálštinaalbánštinasrbštinasiswatštinasotština (jižní)sundštinašvéd" + + "štinasvahilštinatamilštinatelugštinatádžičtinathajštinatigrinijštinatur" + + "kmenštinasetswanštinatongánštinaturečtinatsongatatarštinatahitštinaujgur" + + "štinaukrajinštinaurdštinauzbečtinavendavietnamštinavolapükvalonštinawol" + + "ofštinaxhoštinajidišjorubštinačuangštinačínštinazuluštinaacehštinaakolšt" + + "inaadangmeadygejštinaarabština (tuniská)afrihiliaghemainštinaakkadštinaa" + + "labamštinaaleutštinaalbánština (Gheg)altajština (jižní)staroangličtinaan" + + "gikaaramejštinaaraukánštinaaraonštinaarapažštinaarabština (alžírská)araw" + + "acké jazykyarabština (marocká)arabština (egyptská)asuznaková řeč (americ" + + "ká)asturštinakotavaawadhštinabalúčštinabalijštinabavorštinabasabamunbata" + + "k tobaghomalabedžabembštinabatavštinabenabafutbadagštinabalúčština (zápa" + + "dní)bhojpurštinabikolštinabinibandžarštinakomsiksikabišnuprijskomanipurš" + + "tinabachtijárštinabradžštinabrahujštinabodoštinaakooseburjatštinabugišti" + + "nabulublinštinamedumbacaddokaribštinakajugštinaatsamcebuánštinakigačibča" + + "čagatajštinačukštinamarijštinačinuk pidžinčoktštinačipevajštinačerokézš" + + "tinačejenštinakurdština (sorání)koptštinakapiznonštinaturečtina (krymská" + + ")kašubštinadakotštinadargštinataitadelawarštinaslejvština (athabaský jaz" + + "yk)dogribdinkštinazarmštinadogarštinadolnolužická srbštinakadazandusunšt" + + "inadualštinaholandština (středověká)jola-fonyidjuladazagaembuefikštinaem" + + "ilijštinaegyptština staráekajukelamitštinaangličtina (středověká)jupikšt" + + "ina (středoaljašská)ewondoextremadurštinafangfilipínštinafinština (torne" + + "dalská)fonštinafrancouzština (kajunská)francouzština (středověká)francou" + + "zština (stará)franko-provensálštinafríština (severní)fríština (východní)" + + "furlanštinagaštinagagauzštinačínština (dialekty Gan)gayogbajadaríjština " + + "(zoroastrijská)geezkiribatštinagilačtinahornoněmčina (středověká)hornoně" + + "mčina (stará)konkánština (Goa)góndštinagorontalogótštinagrebostarořečtin" + + "aněmčina (Švýcarsko)wayúuštinafrafragusiigwichʼinhaidštinačínština (dial" + + "ekty Hakka)havajštinahindština (Fidži)hiligajnonštinachetitštinahmongšti" + + "nahornolužická srbštinačínština (dialekty Xiang)hupaibanštinaibibioiloká" + + "nštinainguštinaingrijštinajamajská kreolštinalojbanngombamašamejudeoperš" + + "tinajudeoarabštinajutštinakarakalpačtinakabylštinakačijštinajjukambština" + + "kawikabardinštinakanembutyapmakondekapverdštinakenyangkorokaingangkhásíc" + + "hotánštinakoyra chiinichovarštinazazakštinakakokalendžinkimbundštinakomi" + + "-permjačtinakonkánštinakosrajštinakpellekaračajevo-balkarštinakriokinara" + + "j-akarelštinakuruchštinašambalabafiakolínštinakumyčtinakutenajštinaladin" + + "štinalangilahndštinalambštinalezginštinalingua franca novaligurštinaliv" + + "onštinalakotštinalombardštinamongštinalozštinalúrština (severní)latgalšt" + + "inaluba-luluaštinaluiseňolundštinaluoštinamizoštinaluhjačínština (klasic" + + "ká)lazštinamadurštinamafamagahijštinamaithilištinamakasarštinamandingšti" + + "namasajštinamabamokšanštinamandarmendemerumauricijská kreolštinairština " + + "(středověká)makhuwa-meettometa’micmacminangkabaumandžuštinamanipurštinam" + + "ohawkštinamosimarijština (západní)mundangsložené (víceřádkové) jazykykrí" + + "kštinamirandštinamárvárštinamentavajštinamyeneerzjanštinamázandaránština" + + "čínština (dialekty Minnan)neapolštinanamaštinadolnoněmčinanévárštinania" + + "sniueštinaao (jazyky Nágálandu)kwasiongiemboonnogajštinanorština histori" + + "ckánovialn’kosotština (severní)nuerštinanewarština (klasická)ňamwežština" + + "ňankolštinaňorštinanzimaosageturečtina (osmanská)pangasinanštinapahlavš" + + "tinapapangaupapiamentopalauštinapicardštinaněmčina (pensylvánská)němčina" + + " (plautdietsch)staroperštinafalčtinaféničtinapiemonštinapontštinapohnpei" + + "štinapruštinaprovensálštinakičékečuánština (chimborazo)rádžastánštinara" + + "panujštinararotongánštinaromaňolštinarífštinaromboromštinarotumanštinaru" + + "sínštinarovianštinaarumunštinarwasandawštinajakutštinasamarštinasamburus" + + "asakštinasantálštinasaurášterštinangambaysangoštinasicilštinaskotštinasa" + + "ssarštinakurdština (jižní)senecasenaserištinaselkupštinakoyraboro sennii" + + "rština (stará)žemaitštinatachelhitšanštinaarabština (čadská)sidamoněmčin" + + "a (slezská)selajarštinasámština (jižní)sámština (lulejská)sámština (inar" + + "ijská)sámština (skoltská)sonikštinasogdštinasranan tongosererštinasahofr" + + "íština (saterlandská)sukumasususumerštinakomorštinasvahilština (Kongo)s" + + "yrština (klasická)syrštinaslezštinatuluštinatemnetesoterenotetumštinatig" + + "rejštinativštinatokelauštinacachurštinaklingonštinatlingittalyštinatamaš" + + "ektonžština (nyasa)tok pisinturojštinatarokotsakonštinatsimšijské jazyky" + + "tatštinatumbukštinatuvalštinatasawaqtuvinštinatamazight (střední Maroko)" + + "udmurtštinaugaritštinaumbundukořenvaibenátštinavepštinavlámština (západn" + + "í)němčina (mohansko-franské dialekty)votštinavõruštinavunjoněmčina (wal" + + "ser)wolajtštinawarajštinawaštinawarlpiričínština (dialekty Wu)kalmyčtina" + + "mingrelštinasogštinajaoštinajapštinajangbenštinayembanheengatukantonštin" + + "azapotéčtinabliss systémzélandštinazenagatamazight (standardní marocký)z" + + "unijštinažádný jazykový obsahzazaarabština (moderní standardní)němčina s" + + "tandardní (Švýcarsko)angličtina (USA)španělština (Evropa)dolnosaštinavlá" + + "mštinaportugalština (Evropa)moldavštinasrbochorvatštinačínština (zjednod" + + "ušená)" + +var csLangIdx = []uint16{ // 609 elements + // Entry 0 - 3F + 0x0000, 0x000a, 0x0017, 0x0025, 0x0033, 0x003d, 0x0048, 0x0054, + 0x005e, 0x006a, 0x0074, 0x007f, 0x0094, 0x00a1, 0x00ae, 0x00ba, + 0x00c6, 0x00d2, 0x00df, 0x00ea, 0x00f6, 0x0101, 0x010f, 0x011c, + 0x0123, 0x012e, 0x0139, 0x0142, 0x0154, 0x015f, 0x0168, 0x0172, + 0x017b, 0x0188, 0x0190, 0x0199, 0x01a2, 0x01ad, 0x01b6, 0x01c4, + 0x01cf, 0x01da, 0x01e3, 0x01ed, 0x01f6, 0x0203, 0x020d, 0x021b, + 0x0225, 0x022d, 0x0240, 0x024d, 0x0259, 0x0269, 0x0272, 0x027b, + 0x0287, 0x0291, 0x029a, 0x02a7, 0x02b1, 0x02bd, 0x02c9, 0x02d4, + // Entry 40 - 7F + 0x02df, 0x02ec, 0x02f7, 0x0301, 0x0317, 0x0324, 0x0327, 0x0333, + 0x033d, 0x034c, 0x0357, 0x0363, 0x0370, 0x037b, 0x0386, 0x0393, + 0x039d, 0x03a8, 0x03b4, 0x03c0, 0x03cb, 0x03d1, 0x03df, 0x03e9, + 0x03f4, 0x03fe, 0x040a, 0x0410, 0x041e, 0x0428, 0x0434, 0x0440, + 0x0449, 0x0454, 0x0466, 0x0470, 0x047b, 0x0489, 0x0493, 0x04a0, + 0x04b0, 0x04bc, 0x04c9, 0x04d4, 0x04de, 0x04e8, 0x04f2, 0x0504, + 0x0510, 0x051b, 0x0528, 0x053b, 0x054e, 0x0566, 0x0572, 0x057f, + 0x058d, 0x059c, 0x05a6, 0x05b0, 0x05ba, 0x05ca, 0x05d0, 0x05d9, + // Entry 80 - BF + 0x05e4, 0x05f2, 0x0600, 0x0611, 0x061d, 0x0628, 0x0630, 0x0640, + 0x0647, 0x0651, 0x065c, 0x0671, 0x067b, 0x0688, 0x0694, 0x06a0, + 0x06ab, 0x06b5, 0x06c1, 0x06cd, 0x06d6, 0x06e2, 0x06f5, 0x06ff, + 0x070b, 0x0717, 0x0722, 0x072d, 0x073a, 0x0744, 0x0752, 0x075f, + 0x076c, 0x0779, 0x0783, 0x0789, 0x0794, 0x079f, 0x07aa, 0x07b7, + 0x07c0, 0x07ca, 0x07cf, 0x07dc, 0x07e4, 0x07ef, 0x07fa, 0x0803, + 0x0809, 0x0814, 0x0820, 0x082b, 0x0835, 0x083f, 0x0849, 0x0850, + 0x085c, 0x0871, 0x0879, 0x087e, 0x0887, 0x0892, 0x089e, 0x08a9, + // Entry C0 - FF + 0x08bc, 0x08d1, 0x08e1, 0x08e7, 0x08f3, 0x0901, 0x090c, 0x0919, + 0x0931, 0x0941, 0x0956, 0x096c, 0x096f, 0x0989, 0x0994, 0x099a, + 0x09a5, 0x09b2, 0x09bd, 0x09c8, 0x09cc, 0x09d1, 0x09db, 0x09e2, + 0x09e8, 0x09f2, 0x09fd, 0x0a01, 0x0a06, 0x0a11, 0x0a2a, 0x0a37, + 0x0a42, 0x0a46, 0x0a54, 0x0a57, 0x0a5e, 0x0a78, 0x0a88, 0x0a94, + 0x0aa0, 0x0aaa, 0x0ab0, 0x0abc, 0x0ac6, 0x0aca, 0x0ad4, 0x0adb, + 0x0ae0, 0x0aeb, 0x0af6, 0x0afb, 0x0b08, 0x0b0c, 0x0b13, 0x0b21, + 0x0b2b, 0x0b36, 0x0b44, 0x0b4f, 0x0b5d, 0x0b6c, 0x0b78, 0x0b8d, + // Entry 100 - 13F + 0x0b97, 0x0ba5, 0x0bba, 0x0bc6, 0x0bd1, 0x0bdb, 0x0be0, 0x0bed, + 0x0c0b, 0x0c11, 0x0c1b, 0x0c25, 0x0c30, 0x0c48, 0x0c5a, 0x0c64, + 0x0c80, 0x0c8a, 0x0c8f, 0x0c95, 0x0c99, 0x0ca3, 0x0caf, 0x0cc1, + 0x0cc7, 0x0cd3, 0x0cee, 0x0d0d, 0x0d13, 0x0d23, 0x0d27, 0x0d35, + 0x0d4d, 0x0d56, 0x0d70, 0x0d8e, 0x0da5, 0x0dbc, 0x0dd1, 0x0de8, + 0x0df4, 0x0dfc, 0x0e08, 0x0e22, 0x0e26, 0x0e2b, 0x0e48, 0x0e4c, + 0x0e59, 0x0e63, 0x0e81, 0x0e98, 0x0eab, 0x0eb6, 0x0ebf, 0x0ec9, + 0x0ece, 0x0edc, 0x0ef3, 0x0eff, 0x0f05, 0x0f0a, 0x0f13, 0x0f1d, + // Entry 140 - 17F + 0x0f39, 0x0f44, 0x0f57, 0x0f67, 0x0f73, 0x0f7e, 0x0f96, 0x0fb2, + 0x0fb6, 0x0fc0, 0x0fc6, 0x0fd3, 0x0fdd, 0x0fe9, 0x0ffe, 0x1004, + 0x100a, 0x1011, 0x101f, 0x102e, 0x1037, 0x1046, 0x1051, 0x105d, + 0x1060, 0x106a, 0x106e, 0x107c, 0x1083, 0x1087, 0x108e, 0x109b, + 0x10a2, 0x10a6, 0x10ae, 0x10b5, 0x10c2, 0x10ce, 0x10da, 0x10e5, + 0x10e9, 0x10f3, 0x1100, 0x1111, 0x111e, 0x112a, 0x1130, 0x1148, + 0x114c, 0x1155, 0x1160, 0x116c, 0x1174, 0x1179, 0x1185, 0x118f, + 0x119c, 0x11a7, 0x11ac, 0x11b7, 0x11c1, 0x11cd, 0x11df, 0x11ea, + // Entry 180 - 1BF + 0x11f5, 0x1200, 0x120d, 0x1217, 0x1220, 0x1235, 0x1241, 0x1251, + 0x1259, 0x1263, 0x126c, 0x1276, 0x127b, 0x1292, 0x129b, 0x12a6, + 0x12aa, 0x12b7, 0x12c5, 0x12d2, 0x12df, 0x12ea, 0x12ee, 0x12fb, + 0x1301, 0x1306, 0x130a, 0x1322, 0x133a, 0x1348, 0x134f, 0x1355, + 0x1360, 0x136d, 0x137a, 0x1386, 0x138a, 0x13a1, 0x13a8, 0x13ca, + 0x13d5, 0x13e1, 0x13ef, 0x13fd, 0x1402, 0x140e, 0x1420, 0x143d, + 0x1449, 0x1453, 0x1461, 0x146e, 0x1472, 0x147c, 0x1493, 0x1499, + 0x14a2, 0x14ad, 0x14c2, 0x14c8, 0x14ce, 0x14e2, 0x14ec, 0x1503, + // Entry 1C0 - 1FF + 0x1511, 0x151e, 0x1528, 0x152d, 0x1532, 0x1548, 0x1558, 0x1564, + 0x156c, 0x1576, 0x1581, 0x158d, 0x15a7, 0x15bf, 0x15cd, 0x15d6, + 0x15e1, 0x15ed, 0x15f7, 0x1604, 0x160d, 0x161d, 0x1623, 0x163e, + 0x1650, 0x165d, 0x166e, 0x167c, 0x1686, 0x168b, 0x1694, 0x16a1, + 0x16ad, 0x16b9, 0x16c5, 0x16c8, 0x16d4, 0x16df, 0x16ea, 0x16f1, + 0x16fc, 0x1709, 0x171a, 0x1721, 0x172c, 0x1737, 0x1741, 0x174d, + 0x1761, 0x1767, 0x176b, 0x1775, 0x1781, 0x1790, 0x17a1, 0x17ae, + 0x17b7, 0x17c1, 0x17d6, 0x17dc, 0x17f0, 0x17fd, 0x1811, 0x1827, + // Entry 200 - 23F + 0x183e, 0x1854, 0x185f, 0x1869, 0x1875, 0x1880, 0x1884, 0x189e, + 0x18a4, 0x18a8, 0x18b3, 0x18be, 0x18d2, 0x18e7, 0x18f0, 0x18fa, + 0x1904, 0x1909, 0x190d, 0x1913, 0x191e, 0x192a, 0x1933, 0x1940, + 0x194c, 0x1959, 0x1960, 0x196a, 0x1972, 0x1985, 0x198e, 0x1999, + 0x199f, 0x19ab, 0x19be, 0x19c7, 0x19d3, 0x19de, 0x19e5, 0x19f0, + 0x1a0c, 0x1a18, 0x1a24, 0x1a2b, 0x1a31, 0x1a34, 0x1a40, 0x1a49, + 0x1a60, 0x1a86, 0x1a8f, 0x1a9a, 0x1a9f, 0x1ab1, 0x1abd, 0x1ac8, + 0x1ad0, 0x1ad8, 0x1af1, 0x1afc, 0x1b09, 0x1b12, 0x1b1b, 0x1b24, + // Entry 240 - 27F + 0x1b31, 0x1b36, 0x1b3f, 0x1b4b, 0x1b58, 0x1b65, 0x1b72, 0x1b78, + 0x1b98, 0x1ba3, 0x1bbb, 0x1bbf, 0x1be0, 0x1be0, 0x1be0, 0x1c03, + 0x1c03, 0x1c03, 0x1c03, 0x1c14, 0x1c14, 0x1c2b, 0x1c2b, 0x1c2b, + 0x1c2b, 0x1c2b, 0x1c38, 0x1c43, 0x1c43, 0x1c5a, 0x1c66, 0x1c77, + 0x1c93, +} // Size: 1242 bytes + +var daLangStr string = "" + // Size: 4019 bytes + "afarabkhasiskavestanafrikaansakanamhariskaragonesiskarabiskassamesiskava" + + "riskaymaraaserbajdsjanskbashkirhviderussiskbulgarskbislamabambarabengali" + + "tibetanskbretonskbosniskcatalansktjetjenskchamorrokorsikanskcreetjekkisk" + + "kirkeslaviskchuvashwalisiskdansktyskdivehidzongkhaewegræskengelskesperan" + + "tospanskestiskbaskiskpersiskfulahfinskfijianskfærøskfranskfrisiskirsksko" + + "tsk gæliskgaliciskguaranigujaratimanxhausahebraiskhindihirimotukroatiskh" + + "aitiskungarskarmenskhererointerlinguaindonesiskinterlingueigbosichuan yi" + + "inupiaqidoislandskitalienskinuktitutjapanskjavanesiskgeorgiskkongokikuyu" + + "kuanyamakasakhiskgrønlandskkhmerkannadakoreanskkanurikashmirikurdiskkomi" + + "corniskkirgisisklatinluxembourgskgandalimburgsklingalalaolitauiskluba-Ka" + + "tangalettiskmalagassiskmarshallesemaorimakedonskmalayalammongolskmarathi" + + "skmalaymaltesiskburmesisknaurunordndebelenepalesiskndongahollandsknynors" + + "knorsk bokmålsydndebelenavajonyanjaoccitanskojibwaoromooriyaossetiskpunj" + + "abipalipolskpashtoportugisiskquechuarætoromanskrundirumænskrussiskkinyar" + + "wandasanskritsardinsksindhinordsamisksangosingalesiskslovakiskslovensksa" + + "moanskshonasomaliskalbanskserbiskswatisydsothosundanesisksvenskswahilita" + + "milsktelugutajikthaitigrinyaturkmensktswanatongansktyrkisktsongatatarisk" + + "tahitianskuyguriskukrainskurduusbekiskvendavietnamesiskvolapykvallonskwo" + + "lofxhosajiddischyorubazhuangkinesiskzuluachinesiskacoliadangmeadygheafri" + + "hiliaghemainuakkadiskaleutisksydaltaiskoldengelskangikaaramæiskmapuchear" + + "apahoarawakasuasturiskawadhibaluchibalinesiskbasabamunghomalabejabembabe" + + "nabafutvestbaluchibhojpuribikolbinikomsiksikabrajbodobakossiburiatiskbug" + + "inesiskbulublinmedumbacaddocaribiskcayugaatsamcebuanochigachibchachagata" + + "ichuukesemarichinookchoctawchipewyancherokeecheyennesoranikoptiskkrim ty" + + "rkiskkasjubiskdakotadargwataitadelawareathapaskiskdogribdinkazarmadogrin" + + "edersorbiskdualamiddelhollandskjola-fonyidyuladazagakiembuefikoldegyptis" + + "kekajukelamitiskmiddelengelskewondofangfilippinskfonmiddelfranskoldfrans" + + "knordfrisiskøstfrisiskfriuliangagagauziskgayogbayageezgilbertesiskmiddel" + + "højtyskoldhøjtyskgondigorontalogotiskgrebooldgræskschweizertyskgusiigwic" + + "hinhaidahawaiianskhiligaynonhittitiskhmongøvresorbiskhupaibanibibioiloko" + + "ingushlojbanngombamachamejødisk-persiskjødisk-arabiskkarakalpakiskkabyli" + + "skkachinjjukambakawikabardiankanembutyapmakondekapverdiskkorokhasikhotan" + + "esiskkoyra-chiinikakokalenjinkimbundukomi-permjakiskkonkanikosraeankpell" + + "ekaratjai-balkarkarelskkurukhshambalabafiakölschkymykkutenajladinolangil" + + "ahndalambalezghianlakotamongolozinordluriluba-Lulualuisenolundaluolushai" + + "luyanamaduresemafamagahimaithilimakasarmandingomasaimabamokshamandarmend" + + "emerumorisyenmiddelirskmakhuwa-meettometamicmacminangkabaumanchumanipuri" + + "mohawkmossimundangflere sprogcreekmirandesiskmarwarimyeneerzyamazeniskne" + + "apolitansknamanedertysknewariniasniueankwasiongiemboonnogaioldislandskn-" + + "konordsothonuerklassisk newarisknyamwezinyankolenyoro sprognzimaosageosm" + + "annisk-tyrkiskpangasinanpahlavipampangapapiamentopalauanskoldpersiskføni" + + "kiskponapeoldprovencalskquichérajasthanirapanuirarotonganromboromaniarum" + + "ænskrwasandaweyakutsamaritansksamburusasaksantalingambaysangusiciliansk" + + "skotsksydkurdisksenecasenaselkupiskkoyraboro sennioldirsktachelhitshantc" + + "hadisk-arabisksidamosydsamisklulesamiskenaresamiskskoltesamisksoninkesog" + + "diansksranan tongoserersahosukumasususumeriskshimaorecongolesisk swahili" + + "klassisk syrisksyrisktemnetesoterenotetumtigretivitokelauklingontlingitt" + + "amasheknyasa tongansktok pisintarokotsimshisktumbukatuvalutasawaqtuvinia" + + "ncentralmarokkansk tamazightudmurtugaristiskumbundurotvaivotiskvunjowals" + + "ertyskwalamowaraywashowalbirikalmyksogayaoyapeseyangbenyembakantonesiskz" + + "apotecblissymbolerzenagatamazightzuniintet sprogligt indholdzazamoderne " + + "standardarabisksydaserbajdsjanskøstrigsk tyskschweizerhøjtyskaustralsk e" + + "ngelskcanadisk engelskbritisk engelskamerikansk engelsklatinamerikansk s" + + "panskeuropæisk spanskmexicansk spanskcanadisk franskschweizisk franskfla" + + "mskbrasiliansk portugisiskeuropæisk portugisiskmoldoviskserbokroatiskfor" + + "enklet kinesisktraditionelt kinesisk" + +var daLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000d, 0x0014, 0x001d, 0x0021, 0x0029, 0x0034, + 0x003b, 0x0045, 0x004c, 0x0052, 0x0060, 0x0067, 0x0073, 0x007b, + 0x0082, 0x0089, 0x0090, 0x0099, 0x00a1, 0x00a8, 0x00b1, 0x00ba, + 0x00c2, 0x00cc, 0x00d0, 0x00d8, 0x00e4, 0x00eb, 0x00f3, 0x00f8, + 0x00fc, 0x0102, 0x010a, 0x010d, 0x0113, 0x011a, 0x0123, 0x0129, + 0x012f, 0x0136, 0x013d, 0x0142, 0x0147, 0x014f, 0x0157, 0x015d, + 0x0164, 0x0168, 0x0176, 0x017e, 0x0185, 0x018d, 0x0191, 0x0196, + 0x019e, 0x01a3, 0x01ab, 0x01b3, 0x01ba, 0x01c1, 0x01c8, 0x01ce, + // Entry 40 - 7F + 0x01d9, 0x01e3, 0x01ee, 0x01f2, 0x01fc, 0x0203, 0x0206, 0x020e, + 0x0217, 0x0220, 0x0227, 0x0231, 0x0239, 0x023e, 0x0244, 0x024c, + 0x0255, 0x0260, 0x0265, 0x026c, 0x0274, 0x027a, 0x0282, 0x0289, + 0x028d, 0x0294, 0x029d, 0x02a2, 0x02ae, 0x02b3, 0x02bc, 0x02c3, + 0x02c6, 0x02ce, 0x02da, 0x02e1, 0x02ec, 0x02f7, 0x02fc, 0x0305, + 0x030e, 0x0316, 0x031f, 0x0324, 0x032d, 0x0336, 0x033b, 0x0346, + 0x0350, 0x0356, 0x035f, 0x0366, 0x0373, 0x037d, 0x0383, 0x0389, + 0x0392, 0x0398, 0x039d, 0x03a2, 0x03aa, 0x03b1, 0x03b5, 0x03ba, + // Entry 80 - BF + 0x03c0, 0x03cb, 0x03d2, 0x03de, 0x03e3, 0x03eb, 0x03f2, 0x03fd, + 0x0405, 0x040d, 0x0413, 0x041d, 0x0422, 0x042d, 0x0436, 0x043e, + 0x0446, 0x044b, 0x0453, 0x045a, 0x0461, 0x0466, 0x046e, 0x0479, + 0x047f, 0x0486, 0x048d, 0x0493, 0x0498, 0x049c, 0x04a4, 0x04ad, + 0x04b3, 0x04bb, 0x04c2, 0x04c8, 0x04d0, 0x04da, 0x04e2, 0x04ea, + 0x04ee, 0x04f6, 0x04fb, 0x0507, 0x050e, 0x0516, 0x051b, 0x0520, + 0x0528, 0x052e, 0x0534, 0x053c, 0x0540, 0x054a, 0x054f, 0x0556, + 0x055c, 0x055c, 0x0564, 0x0569, 0x056d, 0x0575, 0x0575, 0x057d, + // Entry C0 - FF + 0x057d, 0x0587, 0x0591, 0x0597, 0x05a0, 0x05a7, 0x05a7, 0x05ae, + 0x05ae, 0x05b4, 0x05b4, 0x05b4, 0x05b7, 0x05b7, 0x05bf, 0x05bf, + 0x05c5, 0x05cc, 0x05d6, 0x05d6, 0x05da, 0x05df, 0x05df, 0x05e6, + 0x05ea, 0x05ef, 0x05ef, 0x05f3, 0x05f8, 0x05f8, 0x0603, 0x060b, + 0x0610, 0x0614, 0x0614, 0x0617, 0x061e, 0x061e, 0x061e, 0x0622, + 0x0622, 0x0626, 0x062d, 0x0636, 0x0640, 0x0644, 0x0648, 0x064f, + 0x0654, 0x065c, 0x0662, 0x0667, 0x066e, 0x0673, 0x067a, 0x0682, + 0x068a, 0x068e, 0x0695, 0x069c, 0x06a5, 0x06ad, 0x06b5, 0x06bb, + // Entry 100 - 13F + 0x06c2, 0x06c2, 0x06ce, 0x06d7, 0x06dd, 0x06e3, 0x06e8, 0x06f0, + 0x06fb, 0x0701, 0x0706, 0x070b, 0x0710, 0x071c, 0x071c, 0x0721, + 0x0730, 0x073a, 0x073f, 0x0745, 0x074b, 0x074f, 0x074f, 0x075a, + 0x0760, 0x0769, 0x0776, 0x0776, 0x077c, 0x077c, 0x0780, 0x078a, + 0x078a, 0x078d, 0x078d, 0x0799, 0x07a2, 0x07a2, 0x07ad, 0x07b8, + 0x07c0, 0x07c2, 0x07cb, 0x07cb, 0x07cf, 0x07d4, 0x07d4, 0x07d8, + 0x07e4, 0x07e4, 0x07f2, 0x07fd, 0x07fd, 0x0802, 0x080b, 0x0811, + 0x0816, 0x081f, 0x082c, 0x082c, 0x082c, 0x0831, 0x0838, 0x083d, + // Entry 140 - 17F + 0x083d, 0x0847, 0x0847, 0x0851, 0x085a, 0x085f, 0x086b, 0x086b, + 0x086f, 0x0873, 0x0879, 0x087e, 0x0884, 0x0884, 0x0884, 0x088a, + 0x0890, 0x0897, 0x08a6, 0x08b5, 0x08b5, 0x08c2, 0x08ca, 0x08d0, + 0x08d3, 0x08d8, 0x08dc, 0x08e5, 0x08ec, 0x08f0, 0x08f7, 0x0901, + 0x0901, 0x0905, 0x0905, 0x090a, 0x0915, 0x0921, 0x0921, 0x0921, + 0x0925, 0x092d, 0x0935, 0x0944, 0x094b, 0x0953, 0x0959, 0x0968, + 0x0968, 0x0968, 0x096f, 0x0975, 0x097d, 0x0982, 0x0989, 0x098e, + 0x0995, 0x099b, 0x09a0, 0x09a6, 0x09ab, 0x09b3, 0x09b3, 0x09b3, + // Entry 180 - 1BF + 0x09b3, 0x09b9, 0x09b9, 0x09be, 0x09c2, 0x09ca, 0x09ca, 0x09d4, + 0x09db, 0x09e0, 0x09e3, 0x09e9, 0x09ef, 0x09ef, 0x09ef, 0x09f7, + 0x09fb, 0x0a01, 0x0a09, 0x0a10, 0x0a18, 0x0a1d, 0x0a21, 0x0a27, + 0x0a2d, 0x0a32, 0x0a36, 0x0a3e, 0x0a48, 0x0a56, 0x0a5a, 0x0a60, + 0x0a6b, 0x0a71, 0x0a79, 0x0a7f, 0x0a84, 0x0a84, 0x0a8b, 0x0a96, + 0x0a9b, 0x0aa6, 0x0aad, 0x0aad, 0x0ab2, 0x0ab7, 0x0abf, 0x0abf, + 0x0acb, 0x0acf, 0x0ad8, 0x0ade, 0x0ae2, 0x0ae8, 0x0ae8, 0x0aee, + 0x0af7, 0x0afc, 0x0b07, 0x0b07, 0x0b0b, 0x0b14, 0x0b18, 0x0b29, + // Entry 1C0 - 1FF + 0x0b31, 0x0b39, 0x0b44, 0x0b49, 0x0b4e, 0x0b5f, 0x0b69, 0x0b70, + 0x0b78, 0x0b82, 0x0b8b, 0x0b8b, 0x0b8b, 0x0b8b, 0x0b95, 0x0b95, + 0x0b9e, 0x0b9e, 0x0b9e, 0x0ba4, 0x0ba4, 0x0bb2, 0x0bb9, 0x0bb9, + 0x0bc3, 0x0bca, 0x0bd4, 0x0bd4, 0x0bd4, 0x0bd9, 0x0bdf, 0x0bdf, + 0x0bdf, 0x0bdf, 0x0be8, 0x0beb, 0x0bf2, 0x0bf7, 0x0c02, 0x0c09, + 0x0c0e, 0x0c15, 0x0c15, 0x0c1c, 0x0c21, 0x0c2b, 0x0c31, 0x0c31, + 0x0c3b, 0x0c41, 0x0c45, 0x0c45, 0x0c4e, 0x0c5d, 0x0c64, 0x0c64, + 0x0c6d, 0x0c71, 0x0c81, 0x0c87, 0x0c87, 0x0c87, 0x0c90, 0x0c9a, + // Entry 200 - 23F + 0x0ca5, 0x0cb1, 0x0cb8, 0x0cc1, 0x0ccd, 0x0cd2, 0x0cd6, 0x0cd6, + 0x0cdc, 0x0ce0, 0x0ce8, 0x0cf0, 0x0d03, 0x0d12, 0x0d18, 0x0d18, + 0x0d18, 0x0d1d, 0x0d21, 0x0d27, 0x0d2c, 0x0d31, 0x0d35, 0x0d3c, + 0x0d3c, 0x0d43, 0x0d4a, 0x0d4a, 0x0d52, 0x0d60, 0x0d69, 0x0d69, + 0x0d6f, 0x0d6f, 0x0d78, 0x0d78, 0x0d7f, 0x0d85, 0x0d8c, 0x0d94, + 0x0daf, 0x0db5, 0x0dbf, 0x0dc6, 0x0dc9, 0x0dcc, 0x0dcc, 0x0dcc, + 0x0dcc, 0x0dcc, 0x0dd2, 0x0dd2, 0x0dd7, 0x0de1, 0x0de7, 0x0dec, + 0x0df1, 0x0df8, 0x0df8, 0x0dfe, 0x0dfe, 0x0e02, 0x0e05, 0x0e0b, + // Entry 240 - 27F + 0x0e12, 0x0e17, 0x0e17, 0x0e22, 0x0e29, 0x0e35, 0x0e35, 0x0e3b, + 0x0e44, 0x0e48, 0x0e5f, 0x0e63, 0x0e7a, 0x0e8b, 0x0e99, 0x0eaa, + 0x0ebb, 0x0ecb, 0x0eda, 0x0eec, 0x0f02, 0x0f13, 0x0f23, 0x0f23, + 0x0f32, 0x0f43, 0x0f43, 0x0f49, 0x0f60, 0x0f76, 0x0f7f, 0x0f8c, + 0x0f9e, 0x0fb3, +} // Size: 1244 bytes + +var deLangStr string = "" + // Size: 6195 bytes + "AfarAbchasischAvestischAfrikaansAkanAmharischAragonesischArabischAssames" + + "ischAwarischAymaraAserbaidschanischBaschkirischWeißrussischBulgarischBis" + + "lamaBambaraBengalischTibetischBretonischBosnischKatalanischTschetschenis" + + "chChamorro-SpracheKorsischCreeTschechischKirchenslawischTschuwaschischWa" + + "lisischDänischDeutschMaledivischDzongkhaEweGriechischEnglischEsperantoSp" + + "anischEstnischBaskischPersischFulFinnischFidschiFäröischFranzösischWestf" + + "riesischIrischSchottisches GälischGalizischGuaraniGujaratiManxHaussaHebr" + + "äischHindiHiri-MotuKroatischHaiti-KreolischUngarischArmenischHerero-Spr" + + "acheInterlinguaIndonesischInterlingueIgboYiInupiakIdo-SpracheIsländischI" + + "talienischInuktitutJapanischJavanischGeorgischKongolesischKikuyuKwanyama" + + "KasachischGrönländischKhmerKannadaKoreanischKanuri-SpracheKaschmiriKurdi" + + "schKomi-SpracheKornischKirgisischLateinLuxemburgischGandaLimburgischLing" + + "alaLaotischLitauischLuba-KatangaLettischMadagassischMarschallesischMaori" + + "MazedonischMalayalamMongolischMarathiMalaiischMaltesischBirmanischNaurui" + + "schNord-NdebeleNepalesischNdongaNiederländischNorwegisch NynorskNorwegis" + + "ch BokmålSüd-Ndebele-SpracheNavajoNyanja-SpracheOkzitanischOjibwa-Sprach" + + "eOromoOriyaOssetischPunjabiPaliPolnischPaschtuPortugiesischQuechuaRätoro" + + "manischRundiRumänischRussischKinyarwandaSanskritSardischSindhiNordsamisc" + + "hSangoSinghalesischSlowakischSlowenischSamoanischShonaSomaliAlbanischSer" + + "bischSwaziSüd-Sotho-SpracheSundanesischSchwedischSuaheliTamilTeluguTadsc" + + "hikischThailändischTigrinyaTurkmenischTswana-SpracheTongaischTürkischTso" + + "ngaTatarischTahitischUigurischUkrainischUrduUsbekischVenda-SpracheVietna" + + "mesischVolapükWallonischWolofXhosaJiddischYorubaZhuangChinesischZuluAceh" + + "-SpracheAcholi-SpracheAdangmeAdygeischTunesisches ArabischAfrihiliAghemA" + + "inu-SpracheAkkadischAlabamaAleutischGegischSüd-AltaischAltenglischAngika" + + "AramäischMapudungunAraonaArapaho-SpracheAlgerisches ArabischArawak-Sprac" + + "heMarokkanisches ArabischÄgyptisches ArabischPareAmerikanische Gebärdens" + + "pracheAsturianischKotavaAwadhiBelutschischBalinesischBairischBasaa-Sprac" + + "heBamunBatak TobaGhomalaBedauyeBembaBetawiBenaBafutBadagaWestliches Belu" + + "tschiBhodschpuriBikol-SpracheBini-SpracheBanjaresischKomBlackfoot-Sprach" + + "eBishnupriyaBachtiarischBraj-BhakhaBrahuiBodoAkooseBurjatischBuginesisch" + + "BuluBlinMedumbaCaddoKaribischCayugaAtsamCebuanoRukigaChibcha-SpracheTsch" + + "agataischTrukesischTscheremissischChinookChoctawChipewyanCherokeeCheyenn" + + "eZentralkurdischKoptischCapiznonKrimtatarischKaschubischDakota-SpracheDa" + + "rginischTaitaDelaware-SpracheSlaveDogribDinka-SpracheZarmaDogriNiedersor" + + "bischZentral-DusunDualaMittelniederländischDiolaDyula-SpracheDazagaEmbuE" + + "fikEmilianischÄgyptischEkajukElamischMittelenglischZentral-Alaska-YupikE" + + "wondoExtremadurischPangwe-SpracheFilipinoMeänkieliFon-SpracheCajunMittel" + + "französischAltfranzösischFrankoprovenzalischNordfriesischOstfriesischFri" + + "ulischGa-SpracheGagausischGanGayoGbaya-SpracheGabriGeezGilbertesischGila" + + "kiMittelhochdeutschAlthochdeutschGoa-KonkaniGondi-SpracheMongondouGotisc" + + "hGrebo-SpracheAltgriechischSchweizerdeutschWayúuFarefareGusiiKutchin-Spr" + + "acheHaida-SpracheHakkaHawaiischFidschi-HindiHiligaynon-SpracheHethitisch" + + "Miao-SpracheObersorbischXiangHupaIbanIbibioIlokano-SpracheInguschischIsc" + + "horischJamaikanisch-kreolische SpracheLojbanNgombaMachameJüdisch-Persisc" + + "hJüdisch-ArabischJütischKarakalpakischKabylischKachin-SpracheJjuKambaKaw" + + "iKabardinischKanembuTyapMakondeKabuverdianuKenyangKoroKaingangKhasi-Spra" + + "cheSakischKoyra ChiiniKhowarKirmanjkiKakoKalenjinKimbundu-SpracheKomi-Pe" + + "rmjakischKonkaniKosraeanischKpelle-SpracheKaratschaiisch-BalkarischKrioK" + + "inaray-aKarelischOraon-SpracheShambalaBafiaKölschKumükischKutenai-Sprach" + + "eLadinoLangiLahndaLamba-SpracheLesgischLingua Franca NovaLigurischLivisc" + + "hLakotaLombardischMongoRotse-SpracheNördliches LuriLettgallischLuba-Lulu" + + "aLuiseno-SpracheLunda-SpracheLuo-SpracheLushai-SpracheLuhyaKlassisches C" + + "hinesischLasischMaduresischMafaKhottaMaithiliMakassarischManding-Sprache" + + "MassaiMabaMokshaMandaresischMende-SpracheMeruMorisyenMittelirischMakhuwa" + + "-MeettoMeta’Micmac-SpracheMinangkabau-SpracheMandschurischMeithei-Sprach" + + "eMohawkMossi-SpracheBergmariMundangMehrsprachigMuskogee-SpracheMirandesi" + + "schMarwariMentawaiMyeneErsja-MordwinischMasanderanischMin NanNeapolitani" + + "schNamaNiederdeutschNewariNias-SpracheNiue-SpracheAo-NagaKwasioNgiemboon" + + "NogaiAltnordischNovialN’KoNord-Sotho-SpracheNuerAlt-NewariNyamwezi-Sprac" + + "heNyankoleNyoroNzimaOsage-SpracheOsmanischPangasinan-SpracheMittelpersis" + + "chPampanggan-SprachePapiamentoPalauPicardischPennsylvaniadeutschPlautdie" + + "tschAltpersischPfälzischPhönikischPiemontesischPontischPonapeanischAltpr" + + "eußischAltprovenzalischK’iche’Chimborazo Hochland-QuechuaRajasthaniOster" + + "insel-SpracheRarotonganischRomagnolTarifitRomboRomaniRotumanischRussinis" + + "chRovianaAromunischRwaSandawe-SpracheJakutischSamaritanischSamburuSasakS" + + "antaliSaurashtraNgambaySanguSizilianischSchottischSassarischSüdkurdischS" + + "enecaSenaSeriSelkupischKoyra SenniAltirischSamogitischTaschelhitSchan-Sp" + + "racheTschadisch-ArabischSidamoSchlesischSelayarSüdsamischLule-SamischIna" + + "ri-SamischSkolt-SamischSoninke-SpracheSogdischSrananischSerer-SpracheSah" + + "oSaterfriesischSukuma-SpracheSusuSumerischKomorischKongo-SuaheliAltsyris" + + "chSyrischSchlesisch (Polen)TuluTemneTesoTereno-SpracheTetum-SpracheTigre" + + "Tiv-SpracheTokelauanischTsachurischKlingonischTlingit-SpracheTalischTama" + + "seqTsonga-SpracheNeumelanesischTuroyoTarokoTsakonischTsimshian-SpracheTa" + + "tischTumbuka-SpracheElliceanischTasawaqTuwinischZentralatlas-TamazightUd" + + "murtischUgaritischMbundu-SpracheRootVaiVenetischWepsischWestflämischMain" + + "fränkischWotischVõroVunjoWalser-DialekteWalamo-SpracheWarayWasho-Sprache" + + "WarlpiriWuKalmückischMingrelischSogaYao-SpracheYapesischYangbenYembaNhee" + + "ngatuKantonesischZapotekischBliss-SymboleSeeländischZenagaTamazightZuni-" + + "SpracheKeine SprachinhalteZazaModernes HocharabischÖsterreichisches Deut" + + "schSchweizer HochdeutschAustralisches EnglischKanadisches EnglischBritis" + + "ches EnglischAmerikanisches EnglischLateinamerikanisches SpanischEuropäi" + + "sches SpanischMexikanisches SpanischKanadisches FranzösischSchweizer Fra" + + "nzösischNiedersächsischFlämischBrasilianisches PortugiesischEuropäisches" + + " PortugiesischMoldauischSerbo-KroatischChinesisch (vereinfacht)Chinesisc" + + "h (traditionell)" + +var deLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000e, 0x0017, 0x0020, 0x0024, 0x002d, 0x0039, + 0x0041, 0x004c, 0x0054, 0x005a, 0x006b, 0x0077, 0x0084, 0x008e, + 0x0095, 0x009c, 0x00a6, 0x00af, 0x00b9, 0x00c1, 0x00cc, 0x00db, + 0x00eb, 0x00f3, 0x00f7, 0x0102, 0x0111, 0x011f, 0x0128, 0x0130, + 0x0137, 0x0142, 0x014a, 0x014d, 0x0157, 0x015f, 0x0168, 0x0170, + 0x0178, 0x0180, 0x0188, 0x018b, 0x0193, 0x019a, 0x01a4, 0x01b0, + 0x01bd, 0x01c3, 0x01d8, 0x01e1, 0x01e8, 0x01f0, 0x01f4, 0x01fa, + 0x0204, 0x0209, 0x0212, 0x021b, 0x022a, 0x0233, 0x023c, 0x024a, + // Entry 40 - 7F + 0x0255, 0x0260, 0x026b, 0x026f, 0x0271, 0x0278, 0x0283, 0x028e, + 0x0299, 0x02a2, 0x02ab, 0x02b4, 0x02bd, 0x02c9, 0x02cf, 0x02d7, + 0x02e1, 0x02ef, 0x02f4, 0x02fb, 0x0305, 0x0313, 0x031c, 0x0324, + 0x0330, 0x0338, 0x0342, 0x0348, 0x0355, 0x035a, 0x0365, 0x036c, + 0x0374, 0x037d, 0x0389, 0x0391, 0x039d, 0x03ac, 0x03b1, 0x03bc, + 0x03c5, 0x03cf, 0x03d6, 0x03df, 0x03e9, 0x03f3, 0x03fc, 0x0408, + 0x0413, 0x0419, 0x0428, 0x043a, 0x044c, 0x0460, 0x0466, 0x0474, + 0x047f, 0x048d, 0x0492, 0x0497, 0x04a0, 0x04a7, 0x04ab, 0x04b3, + // Entry 80 - BF + 0x04ba, 0x04c7, 0x04ce, 0x04dc, 0x04e1, 0x04eb, 0x04f3, 0x04fe, + 0x0506, 0x050e, 0x0514, 0x051f, 0x0524, 0x0531, 0x053b, 0x0545, + 0x054f, 0x0554, 0x055a, 0x0563, 0x056b, 0x0570, 0x0582, 0x058e, + 0x0598, 0x059f, 0x05a4, 0x05aa, 0x05b6, 0x05c3, 0x05cb, 0x05d6, + 0x05e4, 0x05ed, 0x05f6, 0x05fc, 0x0605, 0x060e, 0x0617, 0x0621, + 0x0625, 0x062e, 0x063b, 0x0648, 0x0650, 0x065a, 0x065f, 0x0664, + 0x066c, 0x0672, 0x0678, 0x0682, 0x0686, 0x0692, 0x06a0, 0x06a7, + 0x06b0, 0x06c4, 0x06cc, 0x06d1, 0x06dd, 0x06e6, 0x06ed, 0x06f6, + // Entry C0 - FF + 0x06fd, 0x070a, 0x0715, 0x071b, 0x0725, 0x072f, 0x0735, 0x0744, + 0x0758, 0x0766, 0x077d, 0x0792, 0x0796, 0x07b4, 0x07c0, 0x07c6, + 0x07cc, 0x07d8, 0x07e3, 0x07eb, 0x07f8, 0x07fd, 0x0807, 0x080e, + 0x0815, 0x081a, 0x0820, 0x0824, 0x0829, 0x082f, 0x0843, 0x084e, + 0x085b, 0x0867, 0x0873, 0x0876, 0x0887, 0x0892, 0x089e, 0x08a9, + 0x08af, 0x08b3, 0x08b9, 0x08c3, 0x08ce, 0x08d2, 0x08d6, 0x08dd, + 0x08e2, 0x08eb, 0x08f1, 0x08f6, 0x08fd, 0x0903, 0x0912, 0x091f, + 0x0929, 0x0938, 0x093f, 0x0946, 0x094f, 0x0957, 0x095f, 0x096e, + // Entry 100 - 13F + 0x0976, 0x097e, 0x098b, 0x0996, 0x09a4, 0x09ae, 0x09b3, 0x09c3, + 0x09c8, 0x09ce, 0x09db, 0x09e0, 0x09e5, 0x09f3, 0x0a00, 0x0a05, + 0x0a1a, 0x0a1f, 0x0a2c, 0x0a32, 0x0a36, 0x0a3a, 0x0a45, 0x0a4f, + 0x0a55, 0x0a5d, 0x0a6b, 0x0a7f, 0x0a85, 0x0a93, 0x0aa1, 0x0aa9, + 0x0ab3, 0x0abe, 0x0ac3, 0x0ad5, 0x0ae4, 0x0af7, 0x0b04, 0x0b10, + 0x0b19, 0x0b23, 0x0b2d, 0x0b30, 0x0b34, 0x0b41, 0x0b46, 0x0b4a, + 0x0b57, 0x0b5d, 0x0b6e, 0x0b7c, 0x0b87, 0x0b94, 0x0b9d, 0x0ba4, + 0x0bb1, 0x0bbe, 0x0bce, 0x0bd4, 0x0bdc, 0x0be1, 0x0bf0, 0x0bfd, + // Entry 140 - 17F + 0x0c02, 0x0c0b, 0x0c18, 0x0c2a, 0x0c34, 0x0c40, 0x0c4c, 0x0c51, + 0x0c55, 0x0c59, 0x0c5f, 0x0c6e, 0x0c79, 0x0c83, 0x0ca2, 0x0ca8, + 0x0cae, 0x0cb5, 0x0cc6, 0x0cd7, 0x0cdf, 0x0ced, 0x0cf6, 0x0d04, + 0x0d07, 0x0d0c, 0x0d10, 0x0d1c, 0x0d23, 0x0d27, 0x0d2e, 0x0d3a, + 0x0d41, 0x0d45, 0x0d4d, 0x0d5a, 0x0d61, 0x0d6d, 0x0d73, 0x0d7c, + 0x0d80, 0x0d88, 0x0d98, 0x0da8, 0x0daf, 0x0dbb, 0x0dc9, 0x0de2, + 0x0de6, 0x0def, 0x0df8, 0x0e05, 0x0e0d, 0x0e12, 0x0e19, 0x0e23, + 0x0e32, 0x0e38, 0x0e3d, 0x0e43, 0x0e50, 0x0e58, 0x0e6a, 0x0e73, + // Entry 180 - 1BF + 0x0e7a, 0x0e80, 0x0e8b, 0x0e90, 0x0e9d, 0x0ead, 0x0eb9, 0x0ec3, + 0x0ed2, 0x0edf, 0x0eea, 0x0ef8, 0x0efd, 0x0f13, 0x0f1a, 0x0f25, + 0x0f29, 0x0f2f, 0x0f37, 0x0f43, 0x0f52, 0x0f58, 0x0f5c, 0x0f62, + 0x0f6e, 0x0f7b, 0x0f7f, 0x0f87, 0x0f93, 0x0fa1, 0x0fa8, 0x0fb6, + 0x0fc9, 0x0fd6, 0x0fe5, 0x0feb, 0x0ff8, 0x1000, 0x1007, 0x1013, + 0x1023, 0x102f, 0x1036, 0x103e, 0x1043, 0x1054, 0x1062, 0x1069, + 0x1077, 0x107b, 0x1088, 0x108e, 0x109a, 0x10a6, 0x10ad, 0x10b3, + 0x10bc, 0x10c1, 0x10cc, 0x10d2, 0x10d8, 0x10ea, 0x10ee, 0x10f8, + // Entry 1C0 - 1FF + 0x1108, 0x1110, 0x1115, 0x111a, 0x1127, 0x1130, 0x1142, 0x1150, + 0x1162, 0x116c, 0x1171, 0x117b, 0x118e, 0x119a, 0x11a5, 0x11af, + 0x11ba, 0x11c7, 0x11cf, 0x11db, 0x11e8, 0x11f8, 0x1203, 0x121e, + 0x1228, 0x123a, 0x1248, 0x1250, 0x1257, 0x125c, 0x1262, 0x126d, + 0x1277, 0x127e, 0x1288, 0x128b, 0x129a, 0x12a3, 0x12b0, 0x12b7, + 0x12bc, 0x12c3, 0x12cd, 0x12d4, 0x12d9, 0x12e5, 0x12ef, 0x12f9, + 0x1305, 0x130b, 0x130f, 0x1313, 0x131d, 0x1328, 0x1331, 0x133c, + 0x1346, 0x1353, 0x1366, 0x136c, 0x1376, 0x137d, 0x1388, 0x1394, + // Entry 200 - 23F + 0x13a1, 0x13ae, 0x13bd, 0x13c5, 0x13cf, 0x13dc, 0x13e0, 0x13ee, + 0x13fc, 0x1400, 0x1409, 0x1412, 0x141f, 0x1429, 0x1430, 0x1442, + 0x1446, 0x144b, 0x144f, 0x145d, 0x146a, 0x146f, 0x147a, 0x1487, + 0x1492, 0x149d, 0x14ac, 0x14b3, 0x14ba, 0x14c8, 0x14d6, 0x14dc, + 0x14e2, 0x14ec, 0x14fd, 0x1504, 0x1513, 0x151f, 0x1526, 0x152f, + 0x1545, 0x154f, 0x1559, 0x1567, 0x156b, 0x156e, 0x1577, 0x157f, + 0x158c, 0x159a, 0x15a1, 0x15a6, 0x15ab, 0x15ba, 0x15c8, 0x15cd, + 0x15da, 0x15e2, 0x15e4, 0x15f0, 0x15fb, 0x15ff, 0x160a, 0x1613, + // Entry 240 - 27F + 0x161a, 0x161f, 0x1628, 0x1634, 0x163f, 0x164c, 0x1658, 0x165e, + 0x1667, 0x1673, 0x1686, 0x168a, 0x169f, 0x169f, 0x16b8, 0x16cd, + 0x16e3, 0x16f7, 0x170a, 0x1721, 0x173e, 0x1754, 0x176a, 0x176a, + 0x1782, 0x1798, 0x17a8, 0x17b1, 0x17ce, 0x17e9, 0x17f3, 0x1802, + 0x181a, 0x1833, +} // Size: 1244 bytes + +var elLangStr string = "" + // Size: 8953 bytes + "ΑφάρΑμπχαζικάΑβεστάνΑφρικάανςΑκάνΑμαρικάΑραγκονικάΑραβικάΑσαμεζικάΆβαρικ" + + "ΑϊμάραΑζερμπαϊτζανικάΜπασκίρΛευκορωσικάΒουλγαρικάΜπισλάμαΜπαμπάραΜπενγκ" + + "άλιΘιβετιανάΒρετονικάΒοσνιακάΚαταλανικάΤσετσενικάΚαμόρροΚορσικανικάΚριΤ" + + "σεχικάΕκκλησιαστικά ΣλαβικάΤσουβασικάΟυαλικάΔανικάΓερμανικάΝτιβέχιΝτζόν" + + "γκχαΓιΕλληνικάΑγγλικάΕσπεράντοΙσπανικάΕσθονικάΒασκικάΠερσικάΦουλάχΦινλα" + + "νδικάΦίτζιΦαρόεΓαλλικάΔυτικά ΦριζιανάΙρλανδικάΣκωτικά ΚελτικάΓαλικιανάΓ" + + "κουαρανίΓκουγιαράτιΜανξΧάουσαΕβραϊκάΧίντιΧίρι ΜότουΚροατικάΑϊτιανάΟυγγρ" + + "ικάΑρμενικάΧερέροΙντερλίνγκουαΙνδονησιακάΙντερλίνγκουεΊγκμποΣικουάν ΓιΙ" + + "νουπιάκΊντοΙσλανδικάΙταλικάΙνουκτιτούτΙαπωνικάΙαβανεζικάΓεωργιανάΚονγκό" + + "ΚικούγιουΚουανιγιάμαΚαζακικάΚαλαάλισουτΚαμποτζιανάΚανάνταΚορεατικάΚανού" + + "ριΚασμίριΚουρδικάΚόμιΚόρνιςΚυργιζικάΛατινικάΛουξεμβουργιανάΓκάνταΛιμβου" + + "ργιανάΛινγκάλαΛαοθιανάΛιθουανικάΛούμπα-ΚατάνγκαΛετονικάΜαλαγάσιΜάρσαλΜά" + + "οριΣλαβομακεδονικάΜαλαγιαλάμΜογγολικάΜαράθιΜαλάιΜαλτεζικάΒιρμανικάΝαούρ" + + "ουΝτεμπέλε ΒορράΝεπάλιΝτόνγκαΟλλανδικάΝορβηγικά ΝινόρσκΝορβηγικά Μποκμά" + + "λΝτεμπέλε ΝότουΝάβαχοΝιάντζαΟκσιτανικάΟζιβίγουαΟρόμοΟρίγιαΟσετικάΠαντζα" + + "πικάΠάλιΠολωνικάΠάστοΠορτογαλικάΚετσούαΡομανικάΡούντιΡουμανικάΡωσικάΚιν" + + "ιαρβάνταΣανσκριτικάΣαρδινικάΣίντιΒόρεια ΣάμιΣάνγκοΣινχαλεζικάΣλοβακικάΣ" + + "λοβενικάΣαμόανΣχόναΣομάλιΑλβανικάΣερβικάΣουάτιΝότια ΣόθοΣουνδανικάΣουηδ" + + "ικάΣουαχίλιΤαμίλΤελούγκουΤατζίκΤαϊλανδικάΤιγκρίνυαΤουρκμενικάΤσιγουάναΤ" + + "ονγκανικάΤουρκικάΤσόνγκαΤατάρΤαϊτιανάΟυιγουρικάΟυκρανικάΟυρντούΟυζμπεκι" + + "κάΒένδαΒιετναμικάΒόλαπικΓουαλούνΓουόλοφΖόσαΓίντιςΓιορούμπαΖουάνγκΚινεζι" + + "κάΖουλούΑχινίζΑκολίΑντάνγκμεΑντιγκέαΑφριχίλιΑγκέμΑϊνούΑκάντιανΑλούτΝότι" + + "α ΑλαταϊκάΠαλαιά ΑγγλικάΑνγκικάΑραμαϊκάΑρουκάνιανΑράπαχοΑραγουάκΆσουΑστ" + + "ουριανάΑγουαντίΜπαλούτσιΜπαλινίζΜπάσαΜπαμούνΓκομάλαΜπέζαΜπέμπαΜπέναΜπαφ" + + "ούτΔυτικά ΜπαλοχικάΜποζπούριΜπικόλΜπίνιΚομΣικσίκαΜπρατζΜπόντοΑκόσιΜπουρ" + + "ιάτΜπουγκίζΜπουλούΜπλινΜεντούμπαΚάντοΚαρίμπΚαγιούγκαΑτσάμΚεμπουάνοΤσίγκ" + + "αΤσίμπτσαΤσαγκατάιΤσουκίζιΜάριΙδιωματικά ΣινούκΤσοκτάουΤσίπιουανΤσερόκι" + + "ΣεγιένΚουρδικά ΣοράνιΚοπτικάΤουρκικά ΚριμαίαςΚασούμπιανΝτακόταΝτάργκουα" + + "ΤάιταΝτέλαγουερΣλαβικάΝτόγκριμπΝτίνκαΖάρμαΝτόγκριΓλώσσα Κάτω ΛουσατίαςΝ" + + "τουάλαΜέσα ΟλλανδικάΤζόλα-ΦόνιΝτογιούλαΝταζάγκαΈμπουΕφίκΑρχαία Αιγυπτια" + + "κάΕκατζούκΕλαμάιτΜέσα ΑγγλικάΕγουόντοΦανγκΦιλιππινεζικάΦονΜέσα ΓαλλικάΠ" + + "αλαιά ΓαλλικάΒόρεια ΦριζιανάΑνατολικά ΦριζιανάΦριούλιανΓκαΓκαγκάουζΓκάγ" + + "ιοΓκμπάγιαΓκιζΓκιλμπερτίζΜέσα Άνω ΓερμανικάΠαλαιά Άνω ΓερμανικάΓκόντιΓκ" + + "οροντάλοΓοτθικάΓκρίμποΑρχαία ΕλληνικάΓερμανικά ΕλβετίαςΓκούσιΓκουίτσινΧ" + + "άινταΧαβανεζικάΧιλιγκαγιόνΧιτίτεΧμονγκΓλώσσα Άνω ΛουσατίαςΧούπαΙμπάνΙμπ" + + "ίμπιοΙλόκοΙνγκούςΛόζμπανΝγκόμπαΜάχαμεΙουδαϊκά-ΠερσικάΙουδαϊκά-ΑραβικάΚά" + + "ρα-ΚαλπάκΚαμπίλεΚατσίνΤζουΚάμπαΚάουιΚαμπαρντιανάΚανέμπουΤουάπΜακόντεΓλώ" + + "σσα του Πράσινου ΑκρωτηρίουΚόροΚάσιΚοτανικάΚόιρα ΤσίνιΚάκοΚαλεντζίνΚιμπ" + + "ούντουΚόμι-ΠερμιάκΚονκάνιΚοσραενικάΚπέλεΚαρατσάι-ΜπαλκάρΚαρελιακάΚουρού" + + "χΣάμπαλαΜπάφιαΚολωνικάΚουμγιούκΚουτενάιΛαδίνοΛάνγκιΛάχδαΛάμπαΛαζγκιάνΛα" + + "κόταΜόνγκοΛόζιΒόρεια ΛούριΛούμπα-ΛουλούαΛουισένοΛούνταΛούοΛουσάιΛουχίαΜ" + + "αντουρίζΜάφαΜαγκάχιΜαϊτχίλιΜακαζάρΜαντίνγκοΜασάιΜάμπαΜόκσαΜανδάρΜέντεΜε" + + "ρούΜορίσιενΜέσα ΙρλανδικάΜακούβα-ΜέτοΜετάΜικμάκΜινανγκαμπάουΜαντσούΜανι" + + "πούριΜοχόκΜόσιΜουντάνγκΠολλαπλές γλώσσεςΚρικΜιραντεζικάΜαργουάριΜιένεΈρ" + + "ζυαΜαζαντεράνιΝαπολιτανικάΝάμαΚάτω ΓερμανικάΝεγουάριΝίαςΝιούεανΚβάσιοΝγ" + + "κιεμπούνΝογκάιΠαλαιά ΝορβηγικάΝ’ΚοΒόρεια ΣόθοΝουέρΚλασικά ΝεουάριΝιαμγο" + + "υέζιΝιανκόλεΝιόροΝζίμαΟσάζΟθωμανικά ΤουρκικάΠανγκασινάνΠαχλάβιΠαμπάνγκα" + + "ΠαπιαμέντοΠαλάουανΑρχαία ΠερσικάΦοινικικάΠοχπέιανΠαλαιά ΠροβενσιάλΚισέΡ" + + "αζασθάνιΡαπανούιΡαροτονγκάνΡόμποΡομανίΑρομανικάΡουάΣαντάγουεΓιακούτΣαμα" + + "ρίτικα ΑραμαϊκάΣαμπούρουΣασάκΣαντάλιΝγκαμπέιΣάνγκουΣικελιανάΣκωτικάΝότι" + + "α ΚουρδικάΣένεκαΣέναΣελκούπΚοϊραμπόρο ΣένιΠαλαιά ΙρλανδικάΤασελχίτΣανΑρ" + + "αβικά του ΤσαντΣιντάμοΝότια ΣάμιΛούλε ΣάμιΙνάρι ΣάμιΣκολτ ΣάμιΣονίνκεΣο" + + "γκντιένΣρανάρ ΤόνγκοΣερέρΣάχοΣουκούμαΣούσουΣουμερικάΚομόρριαΚονγκό Σουα" + + "χίλιΚλασικά ΣυριακάΣυριακάΤίμνεΤέσοΤερένοΤέτουμΤίγκρεΤιβΤοκελάουΚλίνγκο" + + "νΤλίνγκιτΤαμασέκΝιάσα ΤόνγκαΤοκ ΠισίνΤαρόκοΤσίμσιανΤουμπούκαΤουβαλούΤασ" + + "αβάκΤουβίνιανΤαμαζίτ Κεντρικού ΜαρόκοΟυντμούρτΟυγκαρίτικΟυμπούντουΡουτΒ" + + "άιΒότικΒούντζοΒάλσερΓουάλαμοΓουάρειΓουασόΓουαρλπίριΚαλμίκΣόγκαΓιάοΓιαπί" + + "ζΓιανγκμπένΓιέμπαΚαντονέζικαΖάποτεκΣύμβολα BlissΖενάγκαΤυπικά Ταμαζίγκτ" + + " ΜαρόκουΖούνιΧωρίς γλωσσολογικό περιεχόμενοΖάζαΣύγχρονα Τυπικά ΑραβικάΓε" + + "ρμανικά ΑυστρίαςΆνω Γερμανικά ΕλβετίαςΑγγλικά ΑυστραλίαςΑγγλικά ΚαναδάΑ" + + "γγλικά Ηνωμένου ΒασιλείουΑγγλικά ΑμερικήςΙσπανικά Λατινικής ΑμερικήςΙσπ" + + "ανικά ΕυρώπηςΙσπανικά ΜεξικούΓαλλικά ΚαναδάΓαλλικά ΕλβετίαςΚάτω Γερμανι" + + "κά ΟλλανδίαςΦλαμανδικάΠορτογαλικά ΒραζιλίαςΠορτογαλικά ΕυρώπηςΜολδαβικά" + + "ΣερβοκροατικάΑπλοποιημένα ΚινεζικάΠαραδοσιακά Κινεζικά" + +var elLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0008, 0x001a, 0x0028, 0x003a, 0x0042, 0x0050, 0x0064, + 0x0072, 0x0084, 0x0090, 0x009c, 0x00ba, 0x00c8, 0x00de, 0x00f2, + 0x0102, 0x0112, 0x0124, 0x0136, 0x0148, 0x0158, 0x016c, 0x0180, + 0x018e, 0x01a4, 0x01aa, 0x01b8, 0x01e1, 0x01f5, 0x0203, 0x020f, + 0x0221, 0x022f, 0x0241, 0x0245, 0x0255, 0x0263, 0x0275, 0x0285, + 0x0295, 0x02a3, 0x02b1, 0x02bd, 0x02d1, 0x02db, 0x02e5, 0x02f3, + 0x0310, 0x0322, 0x033f, 0x0351, 0x0363, 0x0379, 0x0381, 0x038d, + 0x039b, 0x03a5, 0x03b8, 0x03c8, 0x03d6, 0x03e6, 0x03f6, 0x0402, + // Entry 40 - 7F + 0x041c, 0x0432, 0x044c, 0x0458, 0x046b, 0x047b, 0x0483, 0x0495, + 0x04a3, 0x04b9, 0x04c9, 0x04dd, 0x04ef, 0x04fb, 0x050d, 0x0523, + 0x0533, 0x0549, 0x055f, 0x056d, 0x057f, 0x058d, 0x059b, 0x05ab, + 0x05b3, 0x05bf, 0x05d1, 0x05e1, 0x05ff, 0x060b, 0x0623, 0x0633, + 0x0643, 0x0657, 0x0674, 0x0684, 0x0694, 0x06a0, 0x06aa, 0x06c8, + 0x06dc, 0x06ee, 0x06fa, 0x0704, 0x0716, 0x0728, 0x0736, 0x0751, + 0x075d, 0x076b, 0x077d, 0x079e, 0x07bf, 0x07da, 0x07e6, 0x07f4, + 0x0808, 0x081a, 0x0824, 0x0830, 0x083e, 0x0852, 0x085a, 0x086a, + // Entry 80 - BF + 0x0874, 0x088a, 0x0898, 0x08a8, 0x08b4, 0x08c6, 0x08d2, 0x08e8, + 0x08fe, 0x0910, 0x091a, 0x092f, 0x093b, 0x0951, 0x0963, 0x0975, + 0x0981, 0x098b, 0x0997, 0x09a7, 0x09b5, 0x09c1, 0x09d4, 0x09e8, + 0x09f8, 0x0a08, 0x0a12, 0x0a24, 0x0a30, 0x0a44, 0x0a56, 0x0a6c, + 0x0a7e, 0x0a92, 0x0aa2, 0x0ab0, 0x0aba, 0x0aca, 0x0ade, 0x0af0, + 0x0afe, 0x0b12, 0x0b1c, 0x0b30, 0x0b3e, 0x0b4e, 0x0b5c, 0x0b64, + 0x0b70, 0x0b82, 0x0b90, 0x0ba0, 0x0bac, 0x0bb8, 0x0bc2, 0x0bd4, + 0x0be4, 0x0be4, 0x0bf4, 0x0bfe, 0x0c08, 0x0c18, 0x0c18, 0x0c22, + // Entry C0 - FF + 0x0c22, 0x0c3d, 0x0c58, 0x0c66, 0x0c76, 0x0c8a, 0x0c8a, 0x0c98, + 0x0c98, 0x0ca8, 0x0ca8, 0x0ca8, 0x0cb0, 0x0cb0, 0x0cc4, 0x0cc4, + 0x0cd4, 0x0ce6, 0x0cf6, 0x0cf6, 0x0d00, 0x0d0e, 0x0d0e, 0x0d1c, + 0x0d26, 0x0d32, 0x0d32, 0x0d3c, 0x0d4a, 0x0d4a, 0x0d69, 0x0d7b, + 0x0d87, 0x0d91, 0x0d91, 0x0d97, 0x0da5, 0x0da5, 0x0da5, 0x0db1, + 0x0db1, 0x0dbd, 0x0dc7, 0x0dd7, 0x0de7, 0x0df5, 0x0dff, 0x0e11, + 0x0e1b, 0x0e27, 0x0e39, 0x0e43, 0x0e55, 0x0e61, 0x0e71, 0x0e83, + 0x0e93, 0x0e9b, 0x0ebc, 0x0ecc, 0x0ede, 0x0eec, 0x0ef8, 0x0f15, + // Entry 100 - 13F + 0x0f23, 0x0f23, 0x0f44, 0x0f58, 0x0f66, 0x0f78, 0x0f82, 0x0f96, + 0x0fa4, 0x0fb6, 0x0fc2, 0x0fcc, 0x0fda, 0x1002, 0x1002, 0x1010, + 0x102b, 0x103e, 0x1050, 0x1060, 0x106a, 0x1072, 0x1072, 0x1093, + 0x10a3, 0x10b1, 0x10c8, 0x10c8, 0x10d8, 0x10d8, 0x10e2, 0x10fc, + 0x10fc, 0x1102, 0x1102, 0x1119, 0x1134, 0x1134, 0x1151, 0x1174, + 0x1186, 0x118c, 0x119e, 0x119e, 0x11aa, 0x11ba, 0x11ba, 0x11c2, + 0x11d8, 0x11d8, 0x11fa, 0x1220, 0x1220, 0x122c, 0x1240, 0x124e, + 0x125c, 0x1279, 0x129c, 0x129c, 0x129c, 0x12a8, 0x12ba, 0x12c6, + // Entry 140 - 17F + 0x12c6, 0x12da, 0x12da, 0x12f0, 0x12fc, 0x1308, 0x132e, 0x132e, + 0x1338, 0x1342, 0x1352, 0x135c, 0x136a, 0x136a, 0x136a, 0x1378, + 0x1386, 0x1392, 0x13b1, 0x13d0, 0x13d0, 0x13e5, 0x13f3, 0x13ff, + 0x1407, 0x1411, 0x141b, 0x1433, 0x1443, 0x144d, 0x145b, 0x1494, + 0x1494, 0x149c, 0x149c, 0x14a4, 0x14b4, 0x14c9, 0x14c9, 0x14c9, + 0x14d1, 0x14e3, 0x14f7, 0x150e, 0x151c, 0x1530, 0x153a, 0x1559, + 0x1559, 0x1559, 0x156b, 0x1579, 0x1587, 0x1593, 0x15a3, 0x15b5, + 0x15c5, 0x15d1, 0x15dd, 0x15e7, 0x15f1, 0x1601, 0x1601, 0x1601, + // Entry 180 - 1BF + 0x1601, 0x160d, 0x160d, 0x1619, 0x1621, 0x1638, 0x1638, 0x1653, + 0x1663, 0x166f, 0x1677, 0x1683, 0x168f, 0x168f, 0x168f, 0x16a1, + 0x16a9, 0x16b7, 0x16c7, 0x16d5, 0x16e7, 0x16f1, 0x16fb, 0x1705, + 0x1711, 0x171b, 0x1725, 0x1735, 0x1750, 0x1767, 0x176f, 0x177b, + 0x1795, 0x17a3, 0x17b5, 0x17bf, 0x17c7, 0x17c7, 0x17d9, 0x17fa, + 0x1802, 0x1818, 0x182a, 0x182a, 0x1834, 0x183e, 0x1854, 0x1854, + 0x186c, 0x1874, 0x188f, 0x189f, 0x18a7, 0x18b5, 0x18b5, 0x18c1, + 0x18d5, 0x18e1, 0x1900, 0x1900, 0x1909, 0x191e, 0x1928, 0x1945, + // Entry 1C0 - 1FF + 0x1959, 0x1969, 0x1973, 0x197d, 0x1985, 0x19a8, 0x19be, 0x19cc, + 0x19de, 0x19f2, 0x1a02, 0x1a02, 0x1a02, 0x1a02, 0x1a1d, 0x1a1d, + 0x1a2f, 0x1a2f, 0x1a2f, 0x1a3f, 0x1a3f, 0x1a60, 0x1a68, 0x1a68, + 0x1a7a, 0x1a8a, 0x1aa0, 0x1aa0, 0x1aa0, 0x1aaa, 0x1ab6, 0x1ab6, + 0x1ab6, 0x1ab6, 0x1ac8, 0x1ad0, 0x1ae2, 0x1af0, 0x1b15, 0x1b27, + 0x1b31, 0x1b3f, 0x1b3f, 0x1b4f, 0x1b5d, 0x1b6f, 0x1b7d, 0x1b7d, + 0x1b98, 0x1ba4, 0x1bac, 0x1bac, 0x1bba, 0x1bd7, 0x1bf6, 0x1bf6, + 0x1c06, 0x1c0c, 0x1c2c, 0x1c3a, 0x1c3a, 0x1c3a, 0x1c4d, 0x1c60, + // Entry 200 - 23F + 0x1c73, 0x1c86, 0x1c94, 0x1ca6, 0x1cbf, 0x1cc9, 0x1cd1, 0x1cd1, + 0x1ce1, 0x1ced, 0x1cff, 0x1d0f, 0x1d2c, 0x1d49, 0x1d57, 0x1d57, + 0x1d57, 0x1d61, 0x1d69, 0x1d75, 0x1d81, 0x1d8d, 0x1d93, 0x1da3, + 0x1da3, 0x1db3, 0x1dc3, 0x1dc3, 0x1dd1, 0x1de8, 0x1df9, 0x1df9, + 0x1e05, 0x1e05, 0x1e15, 0x1e15, 0x1e27, 0x1e37, 0x1e45, 0x1e57, + 0x1e85, 0x1e97, 0x1eab, 0x1ebf, 0x1ec7, 0x1ecd, 0x1ecd, 0x1ecd, + 0x1ecd, 0x1ecd, 0x1ed7, 0x1ed7, 0x1ee5, 0x1ef1, 0x1f01, 0x1f0f, + 0x1f1b, 0x1f2f, 0x1f2f, 0x1f3b, 0x1f3b, 0x1f45, 0x1f4d, 0x1f59, + // Entry 240 - 27F + 0x1f6d, 0x1f79, 0x1f79, 0x1f8f, 0x1f9d, 0x1fb1, 0x1fb1, 0x1fbf, + 0x1fed, 0x1ff7, 0x2031, 0x2039, 0x2065, 0x2065, 0x2088, 0x20b2, + 0x20d5, 0x20f0, 0x2122, 0x2141, 0x2175, 0x2194, 0x21b3, 0x21b3, + 0x21ce, 0x21ed, 0x221b, 0x222f, 0x2258, 0x227d, 0x228f, 0x22a9, + 0x22d2, 0x22f9, +} // Size: 1244 bytes + +var enLangStr string = "" + // Size: 4897 bytes + "AfarAbkhazianAvestanAfrikaansAkanAmharicAragoneseArabicAssameseAvaricAym" + + "araAzerbaijaniBashkirBelarusianBulgarianBislamaBambaraBengaliTibetanBret" + + "onBosnianCatalanChechenChamorroCorsicanCreeCzechChurch SlavicChuvashWels" + + "hDanishGermanDivehiDzongkhaEweGreekEnglishEsperantoSpanishEstonianBasque" + + "PersianFulahFinnishFijianFaroeseFrenchWestern FrisianIrishScottish Gaeli" + + "cGalicianGuaraniGujaratiManxHausaHebrewHindiHiri MotuCroatianHaitian Cre" + + "oleHungarianArmenianHereroInterlinguaIndonesianInterlingueIgboSichuan Yi" + + "InupiaqIdoIcelandicItalianInuktitutJapaneseJavaneseGeorgianKongoKikuyuKu" + + "anyamaKazakhKalaallisutKhmerKannadaKoreanKanuriKashmiriKurdishKomiCornis" + + "hKyrgyzLatinLuxembourgishGandaLimburgishLingalaLaoLithuanianLuba-Katanga" + + "LatvianMalagasyMarshalleseMaoriMacedonianMalayalamMongolianMarathiMalayM" + + "alteseBurmeseNauruNorth NdebeleNepaliNdongaDutchNorwegian NynorskNorwegi" + + "an BokmålSouth NdebeleNavajoNyanjaOccitanOjibwaOromoOriyaOsseticPunjabiP" + + "aliPolishPashtoPortugueseQuechuaRomanshRundiRomanianRussianKinyarwandaSa" + + "nskritSardinianSindhiNorthern SamiSangoSinhalaSlovakSlovenianSamoanShona" + + "SomaliAlbanianSerbianSwatiSouthern SothoSundaneseSwedishSwahiliTamilTelu" + + "guTajikThaiTigrinyaTurkmenTswanaTonganTurkishTsongaTatarTahitianUyghurUk" + + "rainianUrduUzbekVendaVietnameseVolapükWalloonWolofXhosaYiddishYorubaZhua" + + "ngChineseZuluAchineseAcoliAdangmeAdygheTunisian ArabicAfrihiliAghemAinuA" + + "kkadianAlabamaAleutGheg AlbanianSouthern AltaiOld EnglishAngikaAramaicMa" + + "pucheAraonaArapahoAlgerian ArabicArawakMoroccan ArabicEgyptian ArabicAsu" + + "American Sign LanguageAsturianKotavaAwadhiBaluchiBalineseBavarianBasaaBa" + + "munBatak TobaGhomalaBejaBembaBetawiBenaBafutBadagaWestern BalochiBhojpur" + + "iBikolBiniBanjarKomSiksikaBishnupriyaBakhtiariBrajBrahuiBodoAkooseBuriat" + + "BugineseBuluBlinMedumbaCaddoCaribCayugaAtsamCebuanoChigaChibchaChagataiC" + + "huukeseMariChinook JargonChoctawChipewyanCherokeeCheyenneCentral Kurdish" + + "CopticCapiznonCrimean TurkishKashubianDakotaDargwaTaitaDelawareSlaveDogr" + + "ibDinkaZarmaDogriLower SorbianCentral DusunDualaMiddle DutchJola-FonyiDy" + + "ulaDazagaEmbuEfikEmilianAncient EgyptianEkajukElamiteMiddle EnglishCentr" + + "al YupikEwondoExtremaduranFangFilipinoTornedalen FinnishFonCajun FrenchM" + + "iddle FrenchOld FrenchArpitanNorthern FrisianEastern FrisianFriulianGaGa" + + "gauzGan ChineseGayoGbayaZoroastrian DariGeezGilberteseGilakiMiddle High " + + "GermanOld High GermanGoan KonkaniGondiGorontaloGothicGreboAncient GreekS" + + "wiss GermanWayuuFrafraGusiiGwichʼinHaidaHakka ChineseHawaiianFiji HindiH" + + "iligaynonHittiteHmongUpper SorbianXiang ChineseHupaIbanIbibioIlokoIngush" + + "IngrianJamaican Creole EnglishLojbanNgombaMachameJudeo-PersianJudeo-Arab" + + "icJutishKara-KalpakKabyleKachinJjuKambaKawiKabardianKanembuTyapMakondeKa" + + "buverdianuKenyangKoroKaingangKhasiKhotaneseKoyra ChiiniKhowarKirmanjkiKa" + + "koKalenjinKimbunduKomi-PermyakKonkaniKosraeanKpelleKarachay-BalkarKrioKi" + + "naray-aKarelianKurukhShambalaBafiaColognianKumykKutenaiLadinoLangiLahnda" + + "LambaLezghianLingua Franca NovaLigurianLivonianLakotaLombardMongoLoziNor" + + "thern LuriLatgalianLuba-LuluaLuisenoLundaLuoMizoLuyiaLiterary ChineseLaz" + + "MadureseMafaMagahiMaithiliMakasarMandingoMasaiMabaMokshaMandarMendeMeruM" + + "orisyenMiddle IrishMakhuwa-MeettoMetaʼMicmacMinangkabauManchuManipuriMoh" + + "awkMossiWestern MariMundangMultiple LanguagesCreekMirandeseMarwariMentaw" + + "aiMyeneErzyaMazanderaniMin Nan ChineseNeapolitanNamaLow GermanNewariNias" + + "NiueanAo NagaKwasioNgiemboonNogaiOld NorseNovialN’KoNorthern SothoNuerCl" + + "assical NewariNyamweziNyankoleNyoroNzimaOsageOttoman TurkishPangasinanPa" + + "hlaviPampangaPapiamentoPalauanPicardPennsylvania GermanPlautdietschOld P" + + "ersianPalatine GermanPhoenicianPiedmontesePonticPohnpeianPrussianOld Pro" + + "vençalKʼicheʼChimborazo Highland QuichuaRajasthaniRapanuiRarotonganRomag" + + "nolRiffianRomboRomanyRotumanRusynRovianaAromanianRwaSandaweSakhaSamarita" + + "n AramaicSamburuSasakSantaliSaurashtraNgambaySanguSicilianScotsSassarese" + + " SardinianSouthern KurdishSenecaSenaSeriSelkupKoyraboro SenniOld IrishSa" + + "mogitianTachelhitShanChadian ArabicSidamoLower SilesianSelayarSouthern S" + + "amiLule SamiInari SamiSkolt SamiSoninkeSogdienSranan TongoSererSahoSater" + + "land FrisianSukumaSusuSumerianComorianCongo SwahiliClassical SyriacSyria" + + "cSilesianTuluTimneTesoTerenoTetumTigreTivTokelauTsakhurKlingonTlingitTal" + + "yshTamashekNyasa TongaTok PisinTuroyoTarokoTsakonianTsimshianMuslim TatT" + + "umbukaTuvaluTasawaqTuvinianCentral Atlas TamazightUdmurtUgariticUmbunduR" + + "ootVaiVenetianVepsWest FlemishMain-FranconianVoticVõroVunjoWalserWolaytt" + + "aWarayWashoWarlpiriWu ChineseKalmykMingrelianSogaYaoYapeseYangbenYembaNh" + + "eengatuCantoneseZapotecBlissymbolsZeelandicZenagaStandard Moroccan Tamaz" + + "ightZuniNo linguistic contentZazaModern Standard ArabicAustrian GermanSw" + + "iss High GermanAustralian EnglishCanadian EnglishBritish EnglishAmerican" + + " EnglishLatin American SpanishEuropean SpanishMexican SpanishDariCanadia" + + "n FrenchSwiss FrenchLow SaxonFlemishBrazilian PortugueseEuropean Portugu" + + "eseMoldavianSerbo-CroatianSimplified ChineseTraditional Chinese" + +var enLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000d, 0x0014, 0x001d, 0x0021, 0x0028, 0x0031, + 0x0037, 0x003f, 0x0045, 0x004b, 0x0056, 0x005d, 0x0067, 0x0070, + 0x0077, 0x007e, 0x0085, 0x008c, 0x0092, 0x0099, 0x00a0, 0x00a7, + 0x00af, 0x00b7, 0x00bb, 0x00c0, 0x00cd, 0x00d4, 0x00d9, 0x00df, + 0x00e5, 0x00eb, 0x00f3, 0x00f6, 0x00fb, 0x0102, 0x010b, 0x0112, + 0x011a, 0x0120, 0x0127, 0x012c, 0x0133, 0x0139, 0x0140, 0x0146, + 0x0155, 0x015a, 0x0169, 0x0171, 0x0178, 0x0180, 0x0184, 0x0189, + 0x018f, 0x0194, 0x019d, 0x01a5, 0x01b3, 0x01bc, 0x01c4, 0x01ca, + // Entry 40 - 7F + 0x01d5, 0x01df, 0x01ea, 0x01ee, 0x01f8, 0x01ff, 0x0202, 0x020b, + 0x0212, 0x021b, 0x0223, 0x022b, 0x0233, 0x0238, 0x023e, 0x0246, + 0x024c, 0x0257, 0x025c, 0x0263, 0x0269, 0x026f, 0x0277, 0x027e, + 0x0282, 0x0289, 0x028f, 0x0294, 0x02a1, 0x02a6, 0x02b0, 0x02b7, + 0x02ba, 0x02c4, 0x02d0, 0x02d7, 0x02df, 0x02ea, 0x02ef, 0x02f9, + 0x0302, 0x030b, 0x0312, 0x0317, 0x031e, 0x0325, 0x032a, 0x0337, + 0x033d, 0x0343, 0x0348, 0x0359, 0x036a, 0x0377, 0x037d, 0x0383, + 0x038a, 0x0390, 0x0395, 0x039a, 0x03a1, 0x03a8, 0x03ac, 0x03b2, + // Entry 80 - BF + 0x03b8, 0x03c2, 0x03c9, 0x03d0, 0x03d5, 0x03dd, 0x03e4, 0x03ef, + 0x03f7, 0x0400, 0x0406, 0x0413, 0x0418, 0x041f, 0x0425, 0x042e, + 0x0434, 0x0439, 0x043f, 0x0447, 0x044e, 0x0453, 0x0461, 0x046a, + 0x0471, 0x0478, 0x047d, 0x0483, 0x0488, 0x048c, 0x0494, 0x049b, + 0x04a1, 0x04a7, 0x04ae, 0x04b4, 0x04b9, 0x04c1, 0x04c7, 0x04d0, + 0x04d4, 0x04d9, 0x04de, 0x04e8, 0x04f0, 0x04f7, 0x04fc, 0x0501, + 0x0508, 0x050e, 0x0514, 0x051b, 0x051f, 0x0527, 0x052c, 0x0533, + 0x0539, 0x0548, 0x0550, 0x0555, 0x0559, 0x0561, 0x0568, 0x056d, + // Entry C0 - FF + 0x057a, 0x0588, 0x0593, 0x0599, 0x05a0, 0x05a7, 0x05ad, 0x05b4, + 0x05c3, 0x05c9, 0x05d8, 0x05e7, 0x05ea, 0x0600, 0x0608, 0x060e, + 0x0614, 0x061b, 0x0623, 0x062b, 0x0630, 0x0635, 0x063f, 0x0646, + 0x064a, 0x064f, 0x0655, 0x0659, 0x065e, 0x0664, 0x0673, 0x067b, + 0x0680, 0x0684, 0x068a, 0x068d, 0x0694, 0x069f, 0x06a8, 0x06ac, + 0x06b2, 0x06b6, 0x06bc, 0x06c2, 0x06ca, 0x06ce, 0x06d2, 0x06d9, + 0x06de, 0x06e3, 0x06e9, 0x06ee, 0x06f5, 0x06fa, 0x0701, 0x0709, + 0x0711, 0x0715, 0x0723, 0x072a, 0x0733, 0x073b, 0x0743, 0x0752, + // Entry 100 - 13F + 0x0758, 0x0760, 0x076f, 0x0778, 0x077e, 0x0784, 0x0789, 0x0791, + 0x0796, 0x079c, 0x07a1, 0x07a6, 0x07ab, 0x07b8, 0x07c5, 0x07ca, + 0x07d6, 0x07e0, 0x07e5, 0x07eb, 0x07ef, 0x07f3, 0x07fa, 0x080a, + 0x0810, 0x0817, 0x0825, 0x0832, 0x0838, 0x0844, 0x0848, 0x0850, + 0x0862, 0x0865, 0x0871, 0x087e, 0x0888, 0x088f, 0x089f, 0x08ae, + 0x08b6, 0x08b8, 0x08be, 0x08c9, 0x08cd, 0x08d2, 0x08e2, 0x08e6, + 0x08f0, 0x08f6, 0x0908, 0x0917, 0x0923, 0x0928, 0x0931, 0x0937, + 0x093c, 0x0949, 0x0955, 0x095a, 0x0960, 0x0965, 0x096e, 0x0973, + // Entry 140 - 17F + 0x0980, 0x0988, 0x0992, 0x099c, 0x09a3, 0x09a8, 0x09b5, 0x09c2, + 0x09c6, 0x09ca, 0x09d0, 0x09d5, 0x09db, 0x09e2, 0x09f9, 0x09ff, + 0x0a05, 0x0a0c, 0x0a19, 0x0a25, 0x0a2b, 0x0a36, 0x0a3c, 0x0a42, + 0x0a45, 0x0a4a, 0x0a4e, 0x0a57, 0x0a5e, 0x0a62, 0x0a69, 0x0a75, + 0x0a7c, 0x0a80, 0x0a88, 0x0a8d, 0x0a96, 0x0aa2, 0x0aa8, 0x0ab1, + 0x0ab5, 0x0abd, 0x0ac5, 0x0ad1, 0x0ad8, 0x0ae0, 0x0ae6, 0x0af5, + 0x0af9, 0x0b02, 0x0b0a, 0x0b10, 0x0b18, 0x0b1d, 0x0b26, 0x0b2b, + 0x0b32, 0x0b38, 0x0b3d, 0x0b43, 0x0b48, 0x0b50, 0x0b62, 0x0b6a, + // Entry 180 - 1BF + 0x0b72, 0x0b78, 0x0b7f, 0x0b84, 0x0b88, 0x0b95, 0x0b9e, 0x0ba8, + 0x0baf, 0x0bb4, 0x0bb7, 0x0bbb, 0x0bc0, 0x0bd0, 0x0bd3, 0x0bdb, + 0x0bdf, 0x0be5, 0x0bed, 0x0bf4, 0x0bfc, 0x0c01, 0x0c05, 0x0c0b, + 0x0c11, 0x0c16, 0x0c1a, 0x0c22, 0x0c2e, 0x0c3c, 0x0c42, 0x0c48, + 0x0c53, 0x0c59, 0x0c61, 0x0c67, 0x0c6c, 0x0c78, 0x0c7f, 0x0c91, + 0x0c96, 0x0c9f, 0x0ca6, 0x0cae, 0x0cb3, 0x0cb8, 0x0cc3, 0x0cd2, + 0x0cdc, 0x0ce0, 0x0cea, 0x0cf0, 0x0cf4, 0x0cfa, 0x0d01, 0x0d07, + 0x0d10, 0x0d15, 0x0d1e, 0x0d24, 0x0d2a, 0x0d38, 0x0d3c, 0x0d4c, + // Entry 1C0 - 1FF + 0x0d54, 0x0d5c, 0x0d61, 0x0d66, 0x0d6b, 0x0d7a, 0x0d84, 0x0d8b, + 0x0d93, 0x0d9d, 0x0da4, 0x0daa, 0x0dbd, 0x0dc9, 0x0dd4, 0x0de3, + 0x0ded, 0x0df8, 0x0dfe, 0x0e07, 0x0e0f, 0x0e1d, 0x0e26, 0x0e41, + 0x0e4b, 0x0e52, 0x0e5c, 0x0e64, 0x0e6b, 0x0e70, 0x0e76, 0x0e7d, + 0x0e82, 0x0e89, 0x0e92, 0x0e95, 0x0e9c, 0x0ea1, 0x0eb2, 0x0eb9, + 0x0ebe, 0x0ec5, 0x0ecf, 0x0ed6, 0x0edb, 0x0ee3, 0x0ee8, 0x0efb, + 0x0f0b, 0x0f11, 0x0f15, 0x0f19, 0x0f1f, 0x0f2e, 0x0f37, 0x0f41, + 0x0f4a, 0x0f4e, 0x0f5c, 0x0f62, 0x0f70, 0x0f77, 0x0f84, 0x0f8d, + // Entry 200 - 23F + 0x0f97, 0x0fa1, 0x0fa8, 0x0faf, 0x0fbb, 0x0fc0, 0x0fc4, 0x0fd5, + 0x0fdb, 0x0fdf, 0x0fe7, 0x0fef, 0x0ffc, 0x100c, 0x1012, 0x101a, + 0x101e, 0x1023, 0x1027, 0x102d, 0x1032, 0x1037, 0x103a, 0x1041, + 0x1048, 0x104f, 0x1056, 0x105c, 0x1064, 0x106f, 0x1078, 0x107e, + 0x1084, 0x108d, 0x1096, 0x10a0, 0x10a7, 0x10ad, 0x10b4, 0x10bc, + 0x10d3, 0x10d9, 0x10e1, 0x10e8, 0x10ec, 0x10ef, 0x10f7, 0x10fb, + 0x1107, 0x1116, 0x111b, 0x1120, 0x1125, 0x112b, 0x1133, 0x1138, + 0x113d, 0x1145, 0x114f, 0x1155, 0x115f, 0x1163, 0x1166, 0x116c, + // Entry 240 - 27F + 0x1173, 0x1178, 0x1181, 0x118a, 0x1191, 0x119c, 0x11a5, 0x11ab, + 0x11c6, 0x11ca, 0x11df, 0x11e3, 0x11f9, 0x11f9, 0x1208, 0x1219, + 0x122b, 0x123b, 0x124a, 0x125a, 0x1270, 0x1280, 0x128f, 0x1293, + 0x12a2, 0x12ae, 0x12b7, 0x12be, 0x12d2, 0x12e5, 0x12ee, 0x12fc, + 0x130e, 0x1321, +} // Size: 1244 bytes + +const enGBLangStr string = "West Low German" + +var enGBLangIdx = []uint16{ // 603 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 80 - BF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry C0 - FF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 100 - 13F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 140 - 17F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 180 - 1BF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 1C0 - 1FF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 200 - 23F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 240 - 27F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x000f, +} // Size: 1230 bytes + +var esLangStr string = "" + // Size: 4253 bytes + "afarabjasioavésticoafrikáansakanamáricoaragonésárabeasamésavaraimaraazer" + + "baiyanobaskirbielorrusobúlgarobislamabambarabengalítibetanobretónbosnioc" + + "atalánchechenochamorrocorsocreechecoeslavo eclesiásticochuvasiogalésdané" + + "salemándivehidzongkhaewégriegoinglésesperantoespañolestonioeuskerapersaf" + + "ulafinésfiyianoferoésfrancésfrisón occidentalirlandésgaélico escocésgall" + + "egoguaranígujaratimanéshausahebreohindihiri motucroatahaitianohúngaroarm" + + "eniohererointerlinguaindonesiointerlingueigboyi de Sichuáninupiaqidoisla" + + "ndésitalianoinuktitutjaponésjavanésgeorgianokongokikuyukuanyamakazajogro" + + "enlandésjemercanaréscoreanokanuricachemirokurdokomicórnicokirguíslatínlu" + + "xemburguésgandalimburguéslingalalaosianolituanoluba-katangaletónmalgache" + + "marshalésmaorímacedoniomalayalammongolmaratímalayomaltésbirmanonauruanon" + + "debele septentrionalnepalíndonganeerlandésnoruego nynorsknoruego bokmaln" + + "debele meridionalnavajonyanjaoccitanoojibwaoromooriyaoséticopanyabípalip" + + "olacopastúnportuguésquechuaretorrománicokiroundirumanorusokinyarwandasán" + + "scritosardosindhisami septentrionalsangocingaléseslovacoeslovenosamoanos" + + "honasomalíalbanésserbiosiswatisesotho meridionalsundanéssuecosuajilitami" + + "ltelugutayikotailandéstigriñaturcomanosetchwanatonganoturcotsongatártaro" + + "tahitianouigurucranianourduuzbekovendavietnamitavolapükvalónwolofxhosayí" + + "dishyorubazhuangchinozulúacehnésacoliadangmeadigeoafrihiliaghemainuacadi" + + "oaleutianoaltái meridionalinglés antiguoangikaarameomapuchearapahoarahua" + + "coasuasturianoavadhibaluchibalinésbasabamunghomalabejabembabenabafutbalu" + + "chi occidentalbhojpuribicolbinikomsiksikabrajbodoakooseburiatbuginésbulu" + + "blinmedumbacaddocaribecayugaatsamcebuanochigachibchachagatáitrukésmaríje" + + "rga chinukchoctawchipewyancheroquicheyenekurdo soranicoptotártaro de Cri" + + "meacasubiodakotadargvataitadelawareslavedogribdinkazarmadogribajo sorbio" + + "dualaneerlandés medievaljola-fonyidiuladazagaembuefikegipcio antiguoekaj" + + "ukelamitainglés medievalewondofangfilipinofonfrancés medievalfrancés ant" + + "iguofrisón septentrionalfrisón orientalfriulanogagagauzogayogbayageezgil" + + "bertésalemán de la alta edad mediaalemán de la alta edad antiguagondigor" + + "ontalogóticogrebogriego antiguoalemán suizogusiikutchinhaidahawaianohili" + + "gaynonhititahmongalto sorbiohupaibanibibioilocanoingushlojbanngombamacha" + + "mejudeo-persajudeo-árabekarakalpakocabilakachinjjukambakawikabardianokan" + + "embutyapmakondecriollo caboverdianokorokhasikotanéskoyra chiinikakokalen" + + "jinkimbundukomi permiokonkaníkosraeanokpellekarachay-balkarcareliokurukh" + + "shambalabafiakölschkumykkutenailadinolangilahndalambalezgianolakotamongo" + + "lozilorí septentrionalluba-lulualuiseñolundaluolushailuyiamadurésmafamag" + + "ahimaithilimacasarmandingomasáimabamokshamandarmendemerucriollo mauricia" + + "noirlandés medievalmakhuwa-meettometa’micmacminangkabaumanchúmanipurimoh" + + "awkmossimundanglenguas múltiplescreekmirandésmarwarimyeneerzyamazandaran" + + "ínapolitanonamabajo alemánnewariniasniueanokwasiongiemboonnogainórdico " + + "antiguon’kosotho septentrionalnuernewari clásiconyamwezinyankolenyoronzi" + + "maosageturco otomanopangasinánpahlavipampangapapiamentopalauanopersa ant" + + "iguofeniciopohnpeianoprovenzal antiguoquichérajasthanirapanuirarotongano" + + "romboromaníarrumanorwasandawesakhaarameo samaritanosamburusasaksantaling" + + "ambaysangusicilianoescocéskurdo meridionalsenecasenaselkupkoyraboro senn" + + "iirlandés antiguotashelhitshanárabe chadianosidamosami meridionalsami lu" + + "lesami inarisami skoltsoninkésogdianosranan tongoserersahosukumasususume" + + "riocomorensesuajili del Congosiríaco clásicosiriacotemnetesoterenotetúnt" + + "igrétivtokelauanoklingontlingittamashektonga del Nyasatok pisintarokotsi" + + "mshianotumbukatuvaluanotasawaqtuvinianotamazight del Marruecos Centralud" + + "murtugaríticoumbunduraízvaivóticovunjowalserwalamowaraywashowarlpirikalm" + + "yksogayaoyapésyangbenyembacantonészapotecosímbolos Blisszenagatamazight " + + "estándar marroquízunisin contenido lingüísticozazakiárabe estándar moder" + + "noalemán austríacoalto alemán suizoinglés australianoinglés canadiensein" + + "glés británicoinglés estadounidenseespañol latinoamericanoespañol de Esp" + + "añaespañol de Méxicofrancés canadiensefrancés suizoflamencoportugués de " + + "Brasilportugués de Portugalmoldavoserbocroatachino simplificadochino tra" + + "dicional" + +var esLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000b, 0x0014, 0x001e, 0x0022, 0x002a, 0x0033, + 0x0039, 0x0040, 0x0044, 0x004a, 0x0055, 0x005b, 0x0065, 0x006d, + 0x0074, 0x007b, 0x0083, 0x008b, 0x0092, 0x0098, 0x00a0, 0x00a8, + 0x00b0, 0x00b5, 0x00b9, 0x00be, 0x00d2, 0x00da, 0x00e0, 0x00e6, + 0x00ed, 0x00f3, 0x00fb, 0x00ff, 0x0105, 0x010c, 0x0115, 0x011d, + 0x0124, 0x012b, 0x0130, 0x0134, 0x013a, 0x0141, 0x0148, 0x0150, + 0x0162, 0x016b, 0x017c, 0x0183, 0x018b, 0x0193, 0x0199, 0x019e, + 0x01a4, 0x01a9, 0x01b2, 0x01b8, 0x01c0, 0x01c8, 0x01cf, 0x01d5, + // Entry 40 - 7F + 0x01e0, 0x01e9, 0x01f4, 0x01f8, 0x0206, 0x020d, 0x0210, 0x0219, + 0x0221, 0x022a, 0x0232, 0x023a, 0x0243, 0x0248, 0x024e, 0x0256, + 0x025c, 0x0268, 0x026d, 0x0275, 0x027c, 0x0282, 0x028b, 0x0290, + 0x0294, 0x029c, 0x02a4, 0x02aa, 0x02b7, 0x02bc, 0x02c7, 0x02ce, + 0x02d6, 0x02dd, 0x02e9, 0x02ef, 0x02f7, 0x0301, 0x0307, 0x0310, + 0x0319, 0x031f, 0x0326, 0x032c, 0x0333, 0x033a, 0x0342, 0x0357, + 0x035e, 0x0364, 0x036f, 0x037e, 0x038c, 0x039e, 0x03a4, 0x03aa, + 0x03b2, 0x03b8, 0x03bd, 0x03c2, 0x03ca, 0x03d2, 0x03d6, 0x03dc, + // Entry 80 - BF + 0x03e3, 0x03ed, 0x03f4, 0x0402, 0x040a, 0x0410, 0x0414, 0x041f, + 0x0429, 0x042e, 0x0434, 0x0446, 0x044b, 0x0454, 0x045c, 0x0464, + 0x046b, 0x0470, 0x0477, 0x047f, 0x0485, 0x048c, 0x049e, 0x04a7, + 0x04ac, 0x04b3, 0x04b8, 0x04be, 0x04c4, 0x04ce, 0x04d6, 0x04df, + 0x04e8, 0x04ef, 0x04f4, 0x04fa, 0x0502, 0x050b, 0x0510, 0x0519, + 0x051d, 0x0523, 0x0528, 0x0532, 0x053a, 0x0540, 0x0545, 0x054a, + 0x0551, 0x0557, 0x055d, 0x0562, 0x0567, 0x056f, 0x0574, 0x057b, + 0x0581, 0x0581, 0x0589, 0x058e, 0x0592, 0x0598, 0x0598, 0x05a1, + // Entry C0 - FF + 0x05a1, 0x05b2, 0x05c1, 0x05c7, 0x05cd, 0x05d4, 0x05d4, 0x05db, + 0x05db, 0x05e3, 0x05e3, 0x05e3, 0x05e6, 0x05e6, 0x05ef, 0x05ef, + 0x05f5, 0x05fc, 0x0604, 0x0604, 0x0608, 0x060d, 0x060d, 0x0614, + 0x0618, 0x061d, 0x061d, 0x0621, 0x0626, 0x0626, 0x0638, 0x0640, + 0x0645, 0x0649, 0x0649, 0x064c, 0x0653, 0x0653, 0x0653, 0x0657, + 0x0657, 0x065b, 0x0661, 0x0667, 0x066f, 0x0673, 0x0677, 0x067e, + 0x0683, 0x0689, 0x068f, 0x0694, 0x069b, 0x06a0, 0x06a7, 0x06b0, + 0x06b7, 0x06bc, 0x06c8, 0x06cf, 0x06d8, 0x06e0, 0x06e7, 0x06f3, + // Entry 100 - 13F + 0x06f8, 0x06f8, 0x070a, 0x0711, 0x0717, 0x071d, 0x0722, 0x072a, + 0x072f, 0x0735, 0x073a, 0x073f, 0x0744, 0x074f, 0x074f, 0x0754, + 0x0768, 0x0772, 0x0777, 0x077d, 0x0781, 0x0785, 0x0785, 0x0794, + 0x079a, 0x07a1, 0x07b1, 0x07b1, 0x07b7, 0x07b7, 0x07bb, 0x07c3, + 0x07c3, 0x07c6, 0x07c6, 0x07d7, 0x07e7, 0x07e7, 0x07fc, 0x080c, + 0x0814, 0x0816, 0x081d, 0x081d, 0x0821, 0x0826, 0x0826, 0x082a, + 0x0834, 0x0834, 0x0851, 0x0870, 0x0870, 0x0875, 0x087e, 0x0885, + 0x088a, 0x0898, 0x08a5, 0x08a5, 0x08a5, 0x08aa, 0x08b1, 0x08b6, + // Entry 140 - 17F + 0x08b6, 0x08be, 0x08be, 0x08c8, 0x08ce, 0x08d3, 0x08de, 0x08de, + 0x08e2, 0x08e6, 0x08ec, 0x08f3, 0x08f9, 0x08f9, 0x08f9, 0x08ff, + 0x0905, 0x090c, 0x0917, 0x0923, 0x0923, 0x092e, 0x0934, 0x093a, + 0x093d, 0x0942, 0x0946, 0x0950, 0x0957, 0x095b, 0x0962, 0x0976, + 0x0976, 0x097a, 0x097a, 0x097f, 0x0987, 0x0993, 0x0993, 0x0993, + 0x0997, 0x099f, 0x09a7, 0x09b2, 0x09ba, 0x09c3, 0x09c9, 0x09d8, + 0x09d8, 0x09d8, 0x09df, 0x09e5, 0x09ed, 0x09f2, 0x09f9, 0x09fe, + 0x0a05, 0x0a0b, 0x0a10, 0x0a16, 0x0a1b, 0x0a23, 0x0a23, 0x0a23, + // Entry 180 - 1BF + 0x0a23, 0x0a29, 0x0a29, 0x0a2e, 0x0a32, 0x0a45, 0x0a45, 0x0a4f, + 0x0a57, 0x0a5c, 0x0a5f, 0x0a65, 0x0a6a, 0x0a6a, 0x0a6a, 0x0a72, + 0x0a76, 0x0a7c, 0x0a84, 0x0a8b, 0x0a93, 0x0a99, 0x0a9d, 0x0aa3, + 0x0aa9, 0x0aae, 0x0ab2, 0x0ac4, 0x0ad6, 0x0ae4, 0x0aeb, 0x0af1, + 0x0afc, 0x0b03, 0x0b0b, 0x0b11, 0x0b16, 0x0b16, 0x0b1d, 0x0b2f, + 0x0b34, 0x0b3d, 0x0b44, 0x0b44, 0x0b49, 0x0b4e, 0x0b5a, 0x0b5a, + 0x0b64, 0x0b68, 0x0b74, 0x0b7a, 0x0b7e, 0x0b85, 0x0b85, 0x0b8b, + 0x0b94, 0x0b99, 0x0ba9, 0x0ba9, 0x0baf, 0x0bc2, 0x0bc6, 0x0bd5, + // Entry 1C0 - 1FF + 0x0bdd, 0x0be5, 0x0bea, 0x0bef, 0x0bf4, 0x0c01, 0x0c0c, 0x0c13, + 0x0c1b, 0x0c25, 0x0c2d, 0x0c2d, 0x0c2d, 0x0c2d, 0x0c3a, 0x0c3a, + 0x0c41, 0x0c41, 0x0c41, 0x0c4b, 0x0c4b, 0x0c5c, 0x0c63, 0x0c63, + 0x0c6d, 0x0c74, 0x0c7f, 0x0c7f, 0x0c7f, 0x0c84, 0x0c8b, 0x0c8b, + 0x0c8b, 0x0c8b, 0x0c93, 0x0c96, 0x0c9d, 0x0ca2, 0x0cb3, 0x0cba, + 0x0cbf, 0x0cc6, 0x0cc6, 0x0ccd, 0x0cd2, 0x0cdb, 0x0ce3, 0x0ce3, + 0x0cf3, 0x0cf9, 0x0cfd, 0x0cfd, 0x0d03, 0x0d12, 0x0d23, 0x0d23, + 0x0d2c, 0x0d30, 0x0d3f, 0x0d45, 0x0d45, 0x0d45, 0x0d54, 0x0d5d, + // Entry 200 - 23F + 0x0d67, 0x0d71, 0x0d79, 0x0d81, 0x0d8d, 0x0d92, 0x0d96, 0x0d96, + 0x0d9c, 0x0da0, 0x0da7, 0x0db0, 0x0dc1, 0x0dd2, 0x0dd9, 0x0dd9, + 0x0dd9, 0x0dde, 0x0de2, 0x0de8, 0x0dee, 0x0df4, 0x0df7, 0x0e01, + 0x0e01, 0x0e08, 0x0e0f, 0x0e0f, 0x0e17, 0x0e26, 0x0e2f, 0x0e2f, + 0x0e35, 0x0e35, 0x0e3f, 0x0e3f, 0x0e46, 0x0e4f, 0x0e56, 0x0e5f, + 0x0e7e, 0x0e84, 0x0e8e, 0x0e95, 0x0e9a, 0x0e9d, 0x0e9d, 0x0e9d, + 0x0e9d, 0x0e9d, 0x0ea4, 0x0ea4, 0x0ea9, 0x0eaf, 0x0eb5, 0x0eba, + 0x0ebf, 0x0ec7, 0x0ec7, 0x0ecd, 0x0ecd, 0x0ed1, 0x0ed4, 0x0eda, + // Entry 240 - 27F + 0x0ee1, 0x0ee6, 0x0ee6, 0x0eef, 0x0ef7, 0x0f06, 0x0f06, 0x0f0c, + 0x0f29, 0x0f2d, 0x0f48, 0x0f4e, 0x0f66, 0x0f66, 0x0f78, 0x0f8a, + 0x0f9d, 0x0faf, 0x0fc1, 0x0fd7, 0x0fef, 0x1002, 0x1015, 0x1015, + 0x1028, 0x1036, 0x1036, 0x103e, 0x1052, 0x1068, 0x106f, 0x107a, + 0x108c, 0x109d, +} // Size: 1244 bytes + +var es419LangStr string = "vascoswahililuoswahili del Congovai" + +var es419LangIdx = []uint16{ // 558 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + // Entry 40 - 7F + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + // Entry 80 - BF + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + // Entry C0 - FF + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + // Entry 100 - 13F + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + // Entry 140 - 17F + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + // Entry 180 - 1BF + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + // Entry 1C0 - 1FF + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + // Entry 200 - 23F + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0023, +} // Size: 1140 bytes + +var etLangStr string = "" + // Size: 4576 bytes + "afariabhaasiavestaafrikaaniakaniamhariaragoniaraabiaassamiavaariaimaraas" + + "erbaidžaanibaškiirivalgevenebulgaariabislamabambarabengalitiibetibretoon" + + "ibosniakatalaanitšetšeenitšamorrokorsikakriitšehhikirikuslaavitšuvašikõm" + + "ritaanisaksamaldiividzongkhaevekreekaingliseesperantohispaaniaeestibaski" + + "pärsiafulasoomefidžifääriprantsuseläänefriisiiirigaeligaleegiguaraniigud" + + "žaratimänksihausaheebreahindihirimotuhorvaadihaitiungariarmeeniahereroi" + + "nterlinguaindoneesiainterlingueiboSichuani jiiinjupiakiidoislandiitaalia" + + "inuktitutijaapanijaavagruusiakongokikujukvanjamakasahhigröönikhmeerikann" + + "adakoreakanurikašmiirikurdikomikornikirgiisiladinaletseburgigandalimburg" + + "ilingalalaoleedulubalätimalagassimaršallimaoorimakedooniamalajalamimongo" + + "limarathimalaimaltabirmanaurupõhjandebelenepalindongahollandiuusnorranor" + + "ra bokmållõunandebelenavahonjandžaprovansiodžibveioromooriaosseedipandža" + + "bipaalipoolapuštuportugaliketšuaromanširundirumeeniaveneruandasanskritis" + + "ardisindhipõhjasaamisangosingalislovakisloveenisamoašonasomaalialbaanias" + + "erbiasvaasilõunasothosundarootsisuahiilitamilitelugutadžikitaitigrinjatü" + + "rkmeenitsvanatongatürgitsongatataritahitiuiguuriukrainaurduusbekivendavi" + + "etnamivolapükivalloonivolofikoosajidišijorubatšuangihiinasuuluatšehiatšo" + + "liadangmeadõgeeTuneesia araabiaafrihiliaghemiainuakadialabamaaleuudigeeg" + + "ialtaivanaingliseangikaarameamapudunguniaraonaarapahoAlžeeria araabiaara" + + "vakiMaroko araabiaEgiptuse araabiaasuAmeerika viipekeelastuuriaavadhibel" + + "utšibalibaieribasabamunibatakighomalabedžabembabetavibenabafutibadagalää" + + "nebelutšibhodžpuribikoliedobandžarikomi (Aafrika)mustjalaindiaanibišnupr" + + "ijabahtiaribradžibrahuibodoakooseburjaadibugibulubilinimedumbakadokariib" + + "ikajukaatsamisebutšigatšibtšatšagataitšuugimaritšinuki žargoontšoktotšip" + + "evaitšerokiišaieenisoranikoptikapisnonikrimmitatarikašuubisiuudargidavid" + + "adelavarisleividogribidinkazarmadogrialamsorbikeskdusunidualakeskholland" + + "ifonjidjuladazaembuefikiemiiliaegiptuseekadžukieelamikeskinglisekeskjupi" + + "kievondoestremenjufangifilipiinimeäfonicajun’ikeskprantsusevanaprantsuse" + + "frankoprovansipõhjafriisiidafriisifriuuligaagagauusikanigajogbajaetioopi" + + "akiribatigilakikeskülemsaksavanaülemsaksagondigorontalogootigrebovanakre" + + "ekašveitsisaksavajuufarefaregusiigvitšinihaidahavaiFidži hindihiligainon" + + "ihetihmongiülemsorbisjangihupaibaniibibioilokoingušiisuriJamaica kreoolk" + + "eelložbanngombamatšamejuudipärsiajuudiaraabiajüütikarakalpakikabiilikatš" + + "inijjukambakaavikabardi-tšerkessikanembutjapimakondekabuverdianukorokain" + + "gangikhasisakakoyra chiinikhovarikõrmandžkikakokalendžinimbundupermikomi" + + "konkanikosraekpellekaratšai-balkaarikriokinaraiakarjalakuruhhišambalabaf" + + "iakölnikumõkikutenailadiinolangilahndalambalesgiliguuriliivilakotalombar" + + "dimongolozipõhjalurilatgalilulualuisenjolundaluolušeiluhjaklassikaline h" + + "iinalazimaduramafamagahimaithilimakassarimalinkemasaimabamokšamandarimen" + + "demeruMauritiuse kreoolkeelkeskiirimakhuwa-meettometamikmakiminangkabaum" + + "andžumanipurimohoogimoremäemarimundangimitu keeltmaskogimirandamarvarime" + + "ntaveimjeneersamazandaraanilõunamininapolinamaalamsaksanevariniasiniueao" + + "kwasiongiembooninogaivanapõhjalanoviaalnkoopedinuerivananevarinjamvesink" + + "olenjoronzimaoseidžiosmanitürgipangasinanipahlavipampangapapiamentobelau" + + "pikardiPennsylvania saksamennoniidisaksavanapärsiaPfalzifoiniikiapiemont" + + "epontosepoonpeipreisivanaprovansikitšeradžastanirapanuirarotongaromanjar" + + "iifirombomustlaskeelrotumarussiinirovianaaromuunirvaasandavejakuudiSamaa" + + "ria arameasamburusasakisantalisauraštrangambaisangusitsiiliašotilõunakur" + + "disenekasenaserisölkupikoyraboro sennivanaiirižemaidišilhašaniTšaadi ara" + + "abiasidamoalamsileesiaselajarilõunasaamiLule saamiInari saamikoltasaamis" + + "oninkesogdisrananisererisahosaterfriisisukumasususumerikomooriKongo suah" + + "iilivanasüüriasüüriasileesiatulutemnetesoterenotetumitigreetivitokelauts" + + "ahhiklingonitlingititalõšitamašekitšitongauusmelaneesiaturojotarokotsako" + + "oniatšimšilõunataaditumbukatuvalutaswaqitõvatamasiktiudmurdiugaritiumbun" + + "durootvaivenetivepsalääneflaamiMaini frangivadjavõruvundžowalserivolaita" + + "varaivašovarlpiriuukalmõkimegrelisogajaojapiyangbenijembanjengatukantoni" + + "sapoteegiBlissi sümbolidzeelandizenagatamasikti (Maroko)sunjimittekeelel" + + "inezazaaraabia (tänapäevane)Austria saksaŠveitsi ülemsaksaAustraalia ing" + + "liseKanada ingliseBriti ingliseAmeerika ingliseLadina-Ameerika hispaania" + + "Euroopa hispaaniaMehhiko hispaaniaKanada prantsuseŠveitsi prantsuseHolla" + + "ndi alamsaksaflaamiBrasiilia portugaliEuroopa portugalimoldovaserbia-hor" + + "vaadihiina (lihtsustatud)hiina (traditsiooniline)" + +var etLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0005, 0x000c, 0x0012, 0x001b, 0x0020, 0x0026, 0x002d, + 0x0034, 0x003a, 0x0040, 0x0046, 0x0054, 0x005d, 0x0066, 0x006f, + 0x0076, 0x007d, 0x0084, 0x008b, 0x0093, 0x0099, 0x00a2, 0x00ad, + 0x00b6, 0x00bd, 0x00c1, 0x00c8, 0x00d4, 0x00dd, 0x00e3, 0x00e8, + 0x00ed, 0x00f5, 0x00fd, 0x0100, 0x0106, 0x010d, 0x0116, 0x011f, + 0x0124, 0x0129, 0x0130, 0x0134, 0x0139, 0x013f, 0x0146, 0x014f, + 0x015c, 0x0160, 0x0165, 0x016c, 0x0174, 0x017e, 0x0185, 0x018a, + 0x0191, 0x0196, 0x019e, 0x01a6, 0x01ab, 0x01b1, 0x01b9, 0x01bf, + // Entry 40 - 7F + 0x01ca, 0x01d4, 0x01df, 0x01e2, 0x01ee, 0x01f7, 0x01fa, 0x0201, + 0x0208, 0x0212, 0x0219, 0x021e, 0x0225, 0x022a, 0x0230, 0x0238, + 0x023f, 0x0247, 0x024e, 0x0255, 0x025a, 0x0260, 0x0269, 0x026e, + 0x0272, 0x0277, 0x027f, 0x0285, 0x028f, 0x0294, 0x029c, 0x02a3, + 0x02a6, 0x02ab, 0x02af, 0x02b4, 0x02bd, 0x02c6, 0x02cc, 0x02d6, + 0x02e0, 0x02e7, 0x02ee, 0x02f3, 0x02f8, 0x02fd, 0x0302, 0x030f, + 0x0315, 0x031b, 0x0323, 0x032b, 0x0338, 0x0345, 0x034b, 0x0353, + 0x035b, 0x0364, 0x0369, 0x036d, 0x0374, 0x037d, 0x0382, 0x0387, + // Entry 80 - BF + 0x038d, 0x0396, 0x039d, 0x03a5, 0x03aa, 0x03b2, 0x03b6, 0x03bc, + 0x03c5, 0x03ca, 0x03d0, 0x03db, 0x03e0, 0x03e7, 0x03ee, 0x03f6, + 0x03fb, 0x0400, 0x0407, 0x040f, 0x0415, 0x041b, 0x0426, 0x042b, + 0x0431, 0x0439, 0x043f, 0x0445, 0x044d, 0x0450, 0x0458, 0x0462, + 0x0468, 0x046d, 0x0473, 0x0479, 0x047f, 0x0485, 0x048c, 0x0493, + 0x0497, 0x049d, 0x04a2, 0x04aa, 0x04b3, 0x04bb, 0x04c1, 0x04c6, + 0x04cd, 0x04d3, 0x04db, 0x04e0, 0x04e5, 0x04ec, 0x04f3, 0x04fa, + 0x0501, 0x0511, 0x0519, 0x051f, 0x0523, 0x0528, 0x052f, 0x0536, + // Entry C0 - FF + 0x053b, 0x0540, 0x054b, 0x0551, 0x0557, 0x0562, 0x0568, 0x056f, + 0x0580, 0x0587, 0x0595, 0x05a5, 0x05a8, 0x05ba, 0x05c2, 0x05c2, + 0x05c8, 0x05d0, 0x05d4, 0x05da, 0x05de, 0x05e4, 0x05ea, 0x05f1, + 0x05f7, 0x05fc, 0x0602, 0x0606, 0x060c, 0x0612, 0x0621, 0x062b, + 0x0631, 0x0634, 0x063d, 0x064b, 0x065b, 0x0666, 0x066e, 0x0675, + 0x067b, 0x067f, 0x0685, 0x068d, 0x0691, 0x0695, 0x069b, 0x06a2, + 0x06a6, 0x06ad, 0x06b3, 0x06b9, 0x06bd, 0x06c3, 0x06cc, 0x06d5, + 0x06dc, 0x06e0, 0x06f1, 0x06f8, 0x0701, 0x070a, 0x0712, 0x0718, + // Entry 100 - 13F + 0x071d, 0x0726, 0x0732, 0x073a, 0x073e, 0x0743, 0x0749, 0x0751, + 0x0757, 0x075e, 0x0763, 0x0768, 0x076d, 0x0776, 0x0780, 0x0785, + 0x0791, 0x0796, 0x079b, 0x079f, 0x07a3, 0x07a8, 0x07af, 0x07b7, + 0x07c0, 0x07c6, 0x07d1, 0x07db, 0x07e1, 0x07eb, 0x07f0, 0x07f9, + 0x07fd, 0x0801, 0x080a, 0x0817, 0x0824, 0x0832, 0x083e, 0x0847, + 0x084e, 0x0851, 0x0859, 0x085d, 0x0861, 0x0866, 0x0866, 0x086e, + 0x0876, 0x087c, 0x088a, 0x0898, 0x0898, 0x089d, 0x08a6, 0x08ab, + 0x08b0, 0x08ba, 0x08c7, 0x08cc, 0x08d4, 0x08d9, 0x08e2, 0x08e7, + // Entry 140 - 17F + 0x08e7, 0x08ec, 0x08f8, 0x0903, 0x0907, 0x090d, 0x0917, 0x091d, + 0x0921, 0x0926, 0x092c, 0x0931, 0x0938, 0x093d, 0x094f, 0x0956, + 0x095c, 0x0964, 0x0970, 0x097c, 0x0983, 0x098e, 0x0995, 0x099d, + 0x09a0, 0x09a5, 0x09aa, 0x09bc, 0x09c3, 0x09c8, 0x09cf, 0x09db, + 0x09db, 0x09df, 0x09e8, 0x09ed, 0x09f1, 0x09fd, 0x0a04, 0x0a10, + 0x0a14, 0x0a1f, 0x0a25, 0x0a2e, 0x0a35, 0x0a3b, 0x0a41, 0x0a53, + 0x0a57, 0x0a5f, 0x0a66, 0x0a6d, 0x0a75, 0x0a7a, 0x0a80, 0x0a87, + 0x0a8e, 0x0a95, 0x0a9a, 0x0aa0, 0x0aa5, 0x0aaa, 0x0aaa, 0x0ab1, + // Entry 180 - 1BF + 0x0ab6, 0x0abc, 0x0ac4, 0x0ac9, 0x0acd, 0x0ad7, 0x0ade, 0x0ae3, + 0x0aeb, 0x0af0, 0x0af3, 0x0af9, 0x0afe, 0x0b10, 0x0b14, 0x0b1a, + 0x0b1e, 0x0b24, 0x0b2c, 0x0b35, 0x0b3c, 0x0b41, 0x0b45, 0x0b4b, + 0x0b52, 0x0b57, 0x0b5b, 0x0b70, 0x0b78, 0x0b86, 0x0b8a, 0x0b91, + 0x0b9c, 0x0ba3, 0x0bab, 0x0bb2, 0x0bb6, 0x0bbe, 0x0bc6, 0x0bd0, + 0x0bd7, 0x0bde, 0x0be5, 0x0bed, 0x0bf2, 0x0bf6, 0x0c02, 0x0c0c, + 0x0c12, 0x0c16, 0x0c1f, 0x0c25, 0x0c2a, 0x0c2e, 0x0c30, 0x0c36, + 0x0c40, 0x0c45, 0x0c51, 0x0c58, 0x0c5c, 0x0c60, 0x0c65, 0x0c6f, + // Entry 1C0 - 1FF + 0x0c77, 0x0c7c, 0x0c81, 0x0c86, 0x0c8e, 0x0c9a, 0x0ca5, 0x0cac, + 0x0cb4, 0x0cbe, 0x0cc3, 0x0cca, 0x0cdc, 0x0ceb, 0x0cf6, 0x0cfc, + 0x0d05, 0x0d0d, 0x0d14, 0x0d1b, 0x0d21, 0x0d2d, 0x0d33, 0x0d33, + 0x0d3e, 0x0d45, 0x0d4e, 0x0d55, 0x0d5a, 0x0d5f, 0x0d6a, 0x0d70, + 0x0d78, 0x0d7f, 0x0d87, 0x0d8b, 0x0d92, 0x0d99, 0x0da8, 0x0daf, + 0x0db5, 0x0dbc, 0x0dc6, 0x0dcd, 0x0dd2, 0x0ddb, 0x0de0, 0x0de0, + 0x0deb, 0x0df1, 0x0df5, 0x0df9, 0x0e01, 0x0e10, 0x0e18, 0x0e20, + 0x0e26, 0x0e2b, 0x0e3a, 0x0e40, 0x0e4c, 0x0e54, 0x0e5f, 0x0e69, + // Entry 200 - 23F + 0x0e74, 0x0e7e, 0x0e85, 0x0e8a, 0x0e91, 0x0e97, 0x0e9b, 0x0ea6, + 0x0eac, 0x0eb0, 0x0eb6, 0x0ebd, 0x0ecb, 0x0ed7, 0x0edf, 0x0ee7, + 0x0eeb, 0x0ef0, 0x0ef4, 0x0efa, 0x0f00, 0x0f06, 0x0f0a, 0x0f11, + 0x0f17, 0x0f1f, 0x0f27, 0x0f2f, 0x0f38, 0x0f41, 0x0f4e, 0x0f54, + 0x0f5a, 0x0f63, 0x0f6b, 0x0f76, 0x0f7d, 0x0f83, 0x0f8a, 0x0f8f, + 0x0f98, 0x0f9f, 0x0fa6, 0x0fad, 0x0fb1, 0x0fb4, 0x0fba, 0x0fbf, + 0x0fcc, 0x0fd8, 0x0fdd, 0x0fe2, 0x0fe9, 0x0ff0, 0x0ff7, 0x0ffc, + 0x1001, 0x1009, 0x100b, 0x1013, 0x101a, 0x101e, 0x1021, 0x1025, + // Entry 240 - 27F + 0x102d, 0x1032, 0x103a, 0x1041, 0x104a, 0x105a, 0x1062, 0x1068, + 0x107a, 0x107f, 0x108d, 0x1091, 0x10a8, 0x10a8, 0x10b5, 0x10c8, + 0x10da, 0x10e8, 0x10f5, 0x1105, 0x111e, 0x112f, 0x1140, 0x1140, + 0x1150, 0x1162, 0x1174, 0x117a, 0x118d, 0x119e, 0x11a5, 0x11b4, + 0x11c8, 0x11e0, +} // Size: 1244 bytes + +var faLangStr string = "" + // Size: 7705 bytes + "آفاریآبخازیاوستاییآفریکانسآکانامهریآراگونیعربیآسامیآواریآیماراییترکی آذر" + + "بایجانیباشغیریبلاروسیبلغاریبیسلامابامباراییبنگالیتبتیبرتونبوسنیاییکاتال" + + "انچچنیچاموروییکورسیکریاییچکیاسلاوی کلیساییچوواشیولزیدانمارکیآلمانیمالدی" + + "ویجونخاییاوه\u200cاییونانیانگلیسیاسپرانتواسپانیاییاستونیاییباسکیفارسیفو" + + "لاییفنلاندیفیجیاییفاروییفرانسویفریزی غربیایرلندیگیلی اسکاتلندیگالیسیایی" + + "گوارانیگجراتیمانیهوسیاییعبریهندیموتویی هیریکرواتهائیتیاییمجاریارمنیهریر" + + "وییمیان\u200cزباناندونزیاییاکسیدنتالایگبویییی سیچواناینوپیکایدوایسلندیا" + + "یتالیاییاینوکتیتوتژاپنیجاوه\u200cایگرجیکنگوییکیکویوییکوانیاماقزاقیگرینل" + + "ندیخمریکاناراکره\u200cایکانوریاییکشمیریکردیکومیاییکرنوالیقرقیزیلاتینلوگ" + + "زامبورگیگانداییلیمبورگیلینگالالائوسیلیتوانیاییلوبایی‐کاتانگالتونیاییمال" + + "اگاسیاییمارشالیمائوریاییمقدونیمالایالامیمغولیمراتیمالاییمالتیبرمه\u200c" + + "اینائوروییانده\u200cبله\u200cای شمالینپالیاندونگاییهلندینروژی نی\u200cن" + + "ُشکنروژی بوک\u200cمُلانده\u200cبله\u200cای جنوبیناواهویینیانجاییاوکیتای" + + "یاوجیبواییاوروموییاوریه\u200cایآسیپنجابیپالیلهستانیپشتوپرتغالیکچواییروم" + + "انشروندیاییرومانیاییروسیکینیاروانداییسانسکریتساردینیاییسندیسامی شمالیسا" + + "نگوسینهالیاسلواکیاسلوونیاییساموآییشوناییسومالیاییآلبانیاییصربیسوازیاییس" + + "وتویی جنوبیسونداییسوئدیسواحلیتامیلیتلوگوییتاجیکیتایلندیتیگرینیاییترکمنی" + + "تسواناییتونگاییترکی استانبولیتسونگاییتاتاریتاهیتیاییاویغوریاوکراینیاردو" + + "ازبکیونداییویتنامیولاپوکوالونیولوفیخوسایییدییوروباییچوانگیچینیزولوییآچئ" + + "یآچولیاییآدانگمه\u200cایآدیجیاییعربی تونسیآفریهیلیآگیمآینوییاکدیآلاباما" + + "ییآلئوتیآلتایی جنوبیانگلیسی باستانآنگیکاآرامیماپوچه\u200cایآراپاهوییعرب" + + "ی الجزایریآراواکیعربی مراکشیعربی مصریآسوآستوریبلوچیبالیاییباواریاییباسا" + + "ییبمونیبجاییبمباییبناییبلوچی غربیبوجپوریبیکولیبینیلری بختیاریبراجبراهوی" + + "یبودوییبوریاتیبوگیاییبلینکادوییکاریبیسبوییچیگاچیبچاجغتاییچوکیماریاییچوک" + + "توییچیپه\u200cویه\u200cایچروکیاییشایانیکردی سورانیقبطیترکی کریمهکاشوبید" + + "اکوتاییدارقینیتایتادلاواریدوگریبدینکاییزرمادوگریصُربی سفلیدوآلاییهلندی " + + "میانهدیولا فونیدایولاییامبوافیکیمصری کهناکاجوکعیلامیانگلیسی میانهاواندو" + + "فانکیفیلیپینیفونیفرانسوی کادینفرانسوی میانهفرانسوی باستانفریزی شمالیفری" + + "زی شرقیفریولیاییگاییگاگائوزیاییگایوییگبایاییدری زرتشتیگی\u200cئزیگیلبرت" + + "یگیلکیآلمانی معیار میانهآلمانی علیای باستانگوندیگورونتالوگوتیگریبویییون" + + "انی کهنآلمانی سوئیسیگوسیگویچ اینهایداییهاوائیاییهندی فیجیاییهیلی\u200cگ" + + "اینونیهیتیهمونگصُربی علیاهوپاآیبنایلوکوییاینگوشیلوجباننگومباماچامه" + + "\u200cایفارسی یهودیعربی یهودیقره\u200cقالپاقیقبایلیکاچینیجوکامباییکاویای" + + "یکاباردینیتیاپیماکوندهکابووردیانوکوروخاسیاییختنیکوجراچینیکهوارکرمانجیکا" + + "لنجینکیمبوندوییکومی پرمیاککنکانیکپله\u200cایقره\u200cچایی‐بالکاریکوروخی" + + "شامبالابافیاییکومیکیکوتنیلادینولانگیلاهندالامبالزگیلاکوتامونگوییلوزیایی" + + "لری شمالیلوبایی‐لولوالویسنولونداییلوئوییلوشه\u200cایلویاچینی ادبیمادورا" + + "ییماگاهیاییمایدیلیماکاسارماندینگوییماساییمکشاییماندارمنده\u200cایمروییم" + + "وریسینایرلندی میانهماکوا متومتاییمیکماکیمینانگ\u200cکابوییمانچوییمیته" + + "\u200cایموهاکیماسیاییماندانگیچندین زبانکریکیمارواریارزیاییمازندرانیناپلی" + + "ناماییآلمانی سفلینواریایینیاسینیوییکوازیونغایینرس باستاننکوسوتویی شمالی" + + "نویرنواریایی کلاسیکنیام\u200cوزیایینیانکوله\u200cاینیورویینزیماییاوسیجی" + + "ترکی عثمانیپانگاسینانیپهلویپامپانگاییپاپیامنتوپالائوییآلمانی پنسیلوانیا" + + "ییفارسی باستانفنیقیپانپییپروسیپرووانسی باستانکیچه\u200cراجستانیراپانویی" + + "راروتونگاییرومبوییرومانوییآرومانیرواییسانداوه\u200cاییاقوتیآرامی سامریس" + + "امبوروساساکیسانتالیسانگوییسیسیلیاسکاتلندیکردی جنوبیسناسلکوپیکویرابورا س" + + "نیایرلندی باستانتاچل\u200cهیتشانیعربی چادیسیداموییسیلزیایی سفلیسامی جنو" + + "بیلوله سامیایناری سامیاسکولت سامیسونینکه\u200cایسغدیتاکی\u200cتاکیسریری" + + "سوکوماییسوسوییسومریکوموریسواحلی کنگوییسریانی کلاسیکسریانیسیلزیاییتمنه" + + "\u200cایتسوییترنوتتومیتیگره\u200cایتیویکلینگونتلین\u200cگیتیتاماشقیتونگا" + + "یی نیاساتوک\u200cپیسینیتسیم\u200cشیانیتومبوکاییتووالوییتسواکیتوواییآماز" + + "یغی اطلس مرکزیاودمورتیاوگاریتیامبوندوییریشهویاییوتیونجووالاموواراییواشو" + + "ییوارلپیریقلموقیسوگایییائویییاپیکانتونیزاپوتکیزناگاآمازیغی معیار مراکشز" + + "ونیاییبدون محتوای زبانیزازاییعربی رسمیترکی آذری جنوبیآلمانی اتریشآلمانی" + + " معیار سوئیسانگلیسی استرالیاانگلیسی کاناداانگلیسی بریتانیاانگلیسی امریکا" + + "اسپانیایی امریکای لاتیناسپانیایی اروپااسپانیایی مکزیکدریفرانسوی کاناداف" + + "رانسوی سوئیسساکسونی سفلیفلمنگیپرتغالی برزیلپرتغالی اروپامولداویاییصرب و" + + " کرواتیچینی ساده\u200cشدهچینی سنتی" + +var faLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000a, 0x0016, 0x0024, 0x0034, 0x003c, 0x0046, 0x0054, + 0x005c, 0x0066, 0x0070, 0x0080, 0x009d, 0x00ab, 0x00b9, 0x00c5, + 0x00d3, 0x00e5, 0x00f1, 0x00f9, 0x0103, 0x0113, 0x0121, 0x0129, + 0x0139, 0x0143, 0x014f, 0x0155, 0x0170, 0x017c, 0x0184, 0x0194, + 0x01a0, 0x01ae, 0x01bc, 0x01c9, 0x01d5, 0x01e3, 0x01f3, 0x0205, + 0x0217, 0x0221, 0x022b, 0x0237, 0x0245, 0x0253, 0x025f, 0x026d, + 0x0280, 0x028e, 0x02a9, 0x02bb, 0x02c9, 0x02d5, 0x02dd, 0x02eb, + 0x02f3, 0x02fb, 0x0310, 0x031a, 0x032c, 0x0336, 0x0340, 0x034e, + // Entry 40 - 7F + 0x0361, 0x0375, 0x0387, 0x0395, 0x03a6, 0x03b4, 0x03bc, 0x03ca, + 0x03dc, 0x03f0, 0x03fa, 0x0409, 0x0411, 0x041d, 0x042d, 0x043d, + 0x0447, 0x0457, 0x045f, 0x046b, 0x0478, 0x048a, 0x0496, 0x049e, + 0x04ac, 0x04ba, 0x04c6, 0x04d0, 0x04e6, 0x04f4, 0x0504, 0x0512, + 0x051e, 0x0532, 0x054f, 0x055f, 0x0575, 0x0583, 0x0595, 0x05a1, + 0x05b5, 0x05bf, 0x05c9, 0x05d5, 0x05df, 0x05ee, 0x05fe, 0x0621, + 0x062b, 0x063d, 0x0647, 0x0661, 0x067b, 0x069e, 0x06ae, 0x06be, + 0x06ce, 0x06e0, 0x06f0, 0x0701, 0x0707, 0x0713, 0x071b, 0x0729, + // Entry 80 - BF + 0x0731, 0x073f, 0x074b, 0x0757, 0x0767, 0x0779, 0x0781, 0x079b, + 0x07ab, 0x07bf, 0x07c7, 0x07da, 0x07e4, 0x07f2, 0x0800, 0x0814, + 0x0822, 0x082e, 0x0840, 0x0852, 0x085a, 0x086a, 0x0881, 0x088f, + 0x0899, 0x08a5, 0x08b1, 0x08bf, 0x08cb, 0x08d9, 0x08ed, 0x08f9, + 0x0909, 0x0917, 0x0932, 0x0942, 0x094e, 0x0960, 0x096e, 0x097e, + 0x0986, 0x0990, 0x099c, 0x09aa, 0x09b6, 0x09c2, 0x09cc, 0x09d8, + 0x09de, 0x09ee, 0x09fa, 0x0a02, 0x0a0e, 0x0a16, 0x0a26, 0x0a3b, + 0x0a4b, 0x0a5e, 0x0a6e, 0x0a76, 0x0a82, 0x0a8a, 0x0a9c, 0x0aa8, + // Entry C0 - FF + 0x0aa8, 0x0abf, 0x0ada, 0x0ae6, 0x0af0, 0x0b03, 0x0b03, 0x0b15, + 0x0b2e, 0x0b3c, 0x0b51, 0x0b62, 0x0b68, 0x0b68, 0x0b74, 0x0b74, + 0x0b74, 0x0b7e, 0x0b8c, 0x0b9e, 0x0baa, 0x0bb4, 0x0bb4, 0x0bb4, + 0x0bbe, 0x0bca, 0x0bca, 0x0bd4, 0x0bd4, 0x0bd4, 0x0be7, 0x0bf5, + 0x0c01, 0x0c09, 0x0c09, 0x0c09, 0x0c09, 0x0c09, 0x0c1e, 0x0c26, + 0x0c34, 0x0c40, 0x0c40, 0x0c4e, 0x0c5c, 0x0c5c, 0x0c64, 0x0c64, + 0x0c70, 0x0c7c, 0x0c7c, 0x0c7c, 0x0c86, 0x0c8e, 0x0c98, 0x0ca4, + 0x0cac, 0x0cba, 0x0cba, 0x0cc8, 0x0ce0, 0x0cf0, 0x0cfc, 0x0d11, + // Entry 100 - 13F + 0x0d19, 0x0d19, 0x0d2c, 0x0d38, 0x0d48, 0x0d56, 0x0d60, 0x0d6e, + 0x0d6e, 0x0d7a, 0x0d88, 0x0d90, 0x0d9a, 0x0dad, 0x0dad, 0x0dbb, + 0x0dd0, 0x0de3, 0x0df3, 0x0df3, 0x0dfb, 0x0e05, 0x0e05, 0x0e14, + 0x0e20, 0x0e2c, 0x0e45, 0x0e45, 0x0e51, 0x0e51, 0x0e5b, 0x0e6b, + 0x0e6b, 0x0e73, 0x0e8c, 0x0ea5, 0x0ec0, 0x0ec0, 0x0ed5, 0x0ee8, + 0x0efa, 0x0f02, 0x0f18, 0x0f18, 0x0f24, 0x0f32, 0x0f45, 0x0f52, + 0x0f60, 0x0f6a, 0x0f8c, 0x0fb0, 0x0fb0, 0x0fba, 0x0fcc, 0x0fd4, + 0x0fe2, 0x0ff5, 0x100e, 0x100e, 0x100e, 0x1016, 0x1025, 0x1033, + // Entry 140 - 17F + 0x1033, 0x1045, 0x105c, 0x1075, 0x107d, 0x1087, 0x109a, 0x109a, + 0x10a2, 0x10aa, 0x10aa, 0x10ba, 0x10c8, 0x10c8, 0x10c8, 0x10d4, + 0x10e0, 0x10f3, 0x1108, 0x111b, 0x111b, 0x1132, 0x113e, 0x114a, + 0x114e, 0x115c, 0x116a, 0x117c, 0x117c, 0x1186, 0x1194, 0x11aa, + 0x11aa, 0x11b2, 0x11b2, 0x11c0, 0x11c8, 0x11da, 0x11e4, 0x11f2, + 0x11f2, 0x1200, 0x1214, 0x1229, 0x1235, 0x1235, 0x1244, 0x1266, + 0x1266, 0x1266, 0x1266, 0x1272, 0x1280, 0x128e, 0x128e, 0x129a, + 0x12a4, 0x12b0, 0x12ba, 0x12c6, 0x12d0, 0x12d8, 0x12d8, 0x12d8, + // Entry 180 - 1BF + 0x12d8, 0x12e4, 0x12e4, 0x12f2, 0x1300, 0x1311, 0x1311, 0x132a, + 0x1336, 0x1344, 0x1350, 0x135f, 0x1367, 0x1378, 0x1378, 0x1388, + 0x1388, 0x139a, 0x13a8, 0x13b6, 0x13ca, 0x13d6, 0x13d6, 0x13e2, + 0x13ee, 0x13fd, 0x1407, 0x1415, 0x142e, 0x143f, 0x1449, 0x1457, + 0x1472, 0x1480, 0x148f, 0x149b, 0x14a9, 0x14a9, 0x14b9, 0x14cc, + 0x14d6, 0x14d6, 0x14e4, 0x14e4, 0x14e4, 0x14f2, 0x1504, 0x1504, + 0x150e, 0x151a, 0x152f, 0x153f, 0x1549, 0x1553, 0x1553, 0x155f, + 0x155f, 0x1569, 0x157c, 0x157c, 0x1582, 0x1599, 0x15a1, 0x15be, + // Entry 1C0 - 1FF + 0x15d5, 0x15ec, 0x15fa, 0x1608, 0x1614, 0x1629, 0x163f, 0x1649, + 0x165d, 0x166f, 0x167f, 0x167f, 0x16a4, 0x16a4, 0x16bb, 0x16bb, + 0x16c5, 0x16c5, 0x16c5, 0x16d1, 0x16db, 0x16f8, 0x1703, 0x1703, + 0x1713, 0x1723, 0x1739, 0x1739, 0x1739, 0x1747, 0x1757, 0x1757, + 0x1757, 0x1757, 0x1765, 0x176f, 0x1784, 0x1790, 0x17a5, 0x17b3, + 0x17bf, 0x17cd, 0x17cd, 0x17cd, 0x17db, 0x17e7, 0x17f9, 0x17f9, + 0x180c, 0x180c, 0x1812, 0x1812, 0x181e, 0x1837, 0x1852, 0x1852, + 0x1863, 0x186b, 0x187c, 0x188c, 0x18a5, 0x18a5, 0x18b8, 0x18c9, + // Entry 200 - 23F + 0x18de, 0x18f3, 0x1908, 0x1910, 0x1923, 0x192d, 0x192d, 0x192d, + 0x193d, 0x1949, 0x1953, 0x195f, 0x1978, 0x1991, 0x199d, 0x19ad, + 0x19ad, 0x19bc, 0x19c6, 0x19ce, 0x19d8, 0x19e9, 0x19f1, 0x19f1, + 0x19f1, 0x19ff, 0x1a12, 0x1a12, 0x1a20, 0x1a39, 0x1a4e, 0x1a4e, + 0x1a4e, 0x1a4e, 0x1a63, 0x1a63, 0x1a75, 0x1a85, 0x1a91, 0x1a9d, + 0x1abf, 0x1acf, 0x1adf, 0x1af1, 0x1af9, 0x1b03, 0x1b03, 0x1b03, + 0x1b03, 0x1b03, 0x1b09, 0x1b09, 0x1b11, 0x1b11, 0x1b1d, 0x1b29, + 0x1b35, 0x1b45, 0x1b45, 0x1b51, 0x1b51, 0x1b5d, 0x1b69, 0x1b71, + // Entry 240 - 27F + 0x1b71, 0x1b71, 0x1b71, 0x1b7f, 0x1b8d, 0x1b8d, 0x1b8d, 0x1b97, + 0x1bbb, 0x1bc9, 0x1be9, 0x1bf5, 0x1c06, 0x1c22, 0x1c39, 0x1c5b, + 0x1c7a, 0x1c95, 0x1cb4, 0x1ccf, 0x1cfb, 0x1d18, 0x1d35, 0x1d3b, + 0x1d56, 0x1d6f, 0x1d86, 0x1d92, 0x1dab, 0x1dc4, 0x1dd8, 0x1dee, + 0x1e08, 0x1e19, +} // Size: 1244 bytes + +var fiLangStr string = "" + // Size: 4703 bytes + "afarabhaasiavestaafrikaansakanamharaaragoniaarabiaassamiavaariaimaraazer" + + "ibaškiirivalkovenäjäbulgariabislamabambarabengalitiibetbretonibosniakata" + + "laanitšetšeenitšamorrokorsikacreetšekkikirkkoslaavitšuvassikymritanskasa" + + "ksadivehidzongkhaewekreikkaenglantiesperantoespanjavirobaskifarsifulanis" + + "uomifidžifääriranskalänsifriisiiirigaeligaliciaguaranigudžaratimanksihau" + + "sahepreahindihiri-motukroatiahaitiunkariarmeniahererointerlinguaindonesi" + + "ainterlingueigbosichuanin-yiinupiaqidoislantiitaliainuktitutjapanijaavag" + + "eorgiakongokikujukuanjamakazakkikalaallisutkhmerkannadakoreakanurikašmir" + + "ikurdikomikornikirgiisilatinaluxemburggandalimburglingalalaoliettuakatan" + + "ganlubalatviamalagassimarshallmaorimakedoniamalajalammongolimarathimalai" + + "jimaltaburmanaurupohjois-ndebelenepalindongahollantinorjan nynorsknorjan" + + " bokmåletelä-ndebelenavajonjandžaoksitaaniodžibwaoromoorijaosseettipandž" + + "abipaalipuolapaštuportugaliketšuaretoromaanirundiromaniavenäjäruandasans" + + "kritsardisindhipohjoissaamesangosinhalaslovakkisloveenisamoašonasomalial" + + "baniaserbiaswazieteläsothosundaruotsiswahilitamilitelugutadžikkithaitigr" + + "injaturkmeenitswanatongaturkkitsongatataaritahitiuiguuriukrainaurduuzbek" + + "kivendavietnamvolapükvalloniwolofxhosajiddišjorubazhuangkiinazuluatšehat" + + "šoliadangmeadygetunisianarabiaafrihiliaghemainuakkadialabamaaleuttigega" + + "ltaimuinaisenglantiangikavaltakunnanarameamapudungunaraonaarapahoalgeria" + + "narabiaarawakmarokonarabiaegyptinarabiaasuamerikkalainen viittomakielias" + + "turiakotavaawadhibelutšibalibaijeribasaabamumbatak-tobaghomalabedžabemba" + + "betawibenafutbadagalänsibelutšibhodžpuribikolbinibanjarkomsiksikabišnupr" + + "iabahtiaribradžbrahuibodokooseburjaattibugibulubilinmedumbacaddokaribica" + + "yugaatsamcebuanokigatšibtšatšagataichuukmarichinook-jargonchoctawchipewy" + + "ancherokeecheyennesoranikopticapiznonkrimintataarikašubidakotadargitaita" + + "delawareslevidogribdinkadjermadogrialasorbidusundualakeskihollantijola-f" + + "onyidjuladazagaembuefikemiliamuinaisegyptiekajukelamikeskienglantialaska" + + "njupikewondoextremadurafangfilipinomeänkielifoncajunkeskiranskamuinaisra" + + "nskaarpitaanipohjoisfriisiitäfriisifriuligagagauzigan-kiinagajogbajazoro" + + "astrialaisdarige’ezkiribatigilakikeskiyläsaksamuinaisyläsaksagoankonkani" + + "gondigorontalogoottigrebomuinaiskreikkasveitsinsaksawayuufrafragusiigwit" + + "šinhaidahakka-kiinahavaijifidžinhindihiligainoheettihmongyläsorbixiang-" + + "kiinahupaibanibibioilokoinguušiinkeroinenjamaikankreolienglantilojbanngo" + + "mbamachamejuutalaispersiajuutalaisarabiajuuttikarakalpakkikabyylikatšinj" + + "jukambakavikabardikanembutyapmakondekapverdenkreolikenyangnorsunluuranni" + + "konkorokaingangkhasikhotanikoyra chiinikhowarkirmanjkikakokalenjinkimbun" + + "dukomipermjakkikonkanikosraekpellekaratšai-balkaarikriokinaray-akarjalak" + + "urukhshambalabafiakölschkumykkikutenailadinolangolahndalambalezgilingua " + + "franca novaliguuriliivilakotalombardimongolozipohjoislurilatgalliluluanl" + + "ubaluiseñolundaluolusailuhyaklassinen kiinalazimaduramafamagahimaithilim" + + "akassarmandingomaasaimabamokšamandarmendemerumorisyenkeski-iirimakua-mee" + + "ttometa’micmacminangkabaumantšumanipurimohawkmossivuorimarimundangmonia " + + "kieliäcreekmirandeesimarwarimentawaimyeneersämazandaranimin nan -kiinana" + + "polinamaalasaksanewariniasniueao nagakwasiongiemboonnogaimuinaisnorjanov" + + "ialn’kopohjoissothonuerklassinen newarinyamwezinyankolenyoronzimaosageos" + + "manipangasinanpahlavipampangapapiamentupalaupicardipennsylvaniansaksapla" + + "utdietschmuinaispersiapfaltsifoinikiapiemontepontoksenkreikkapohnpeimuin" + + "aispreussimuinaisprovensaalikʼicheʼchimborazonylänköketšuaradžastanirapa" + + "nuirarotongaromagnolitarifitromboromanirotumaruteenirovianaaromaniarwasa" + + "ndawejakuuttisamarianarameasamburusasaksantalisauraštringambaysangusisil" + + "iaskottisassarinsardieteläkurdisenecasenaseriselkuppikoyraboro sennimuin" + + "aisiirisamogiittitašelhitshantšadinarabiasidamosleesiansaksaselayaretelä" + + "saameluulajansaameinarinsaamekoltansaamesoninkesogdisrananserersahosater" + + "landinfriisisukumasususumerikomorikingwanamuinaissyyriasyyriasleesiatulu" + + "temnetesoterenotetumtigretivtokelautsahuriklingontlingittališitamašekmal" + + "awintongatok-pisinturojotarokotsakoniatsimšitatitumbukatuvalutasawaqtuva" + + "keskiatlaksentamazightudmurttiugaritmbundujuurivaivenetsiavepsälänsiflaa" + + "mimaininfrankkivatjavõrovunjowalserwolaittawaraywashowarlpiriwu-kiinakal" + + "mukkimingrelisogajaojapiyangbenyembañeengatúkantoninkiinazapoteekkibliss" + + "kieliseelantizenagavakioitu tamazightzuniei kielellistä sisältöäzazaylei" + + "sarabiaitävallansaksasveitsinyläsaksaaustralianenglantikanadanenglantibr" + + "itannianenglantiamerikanenglantiamerikanespanjaeuroopanespanjameksikones" + + "panjakanadanranskasveitsinranskaalankomaidenalasaksaflaamibrasilianportu" + + "galieuroopanportugalimoldovaserbokroaattiyksinkertaistettu kiinaperintei" + + "nen kiina" + +var fiLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000b, 0x0011, 0x001a, 0x001e, 0x0024, 0x002c, + 0x0032, 0x0038, 0x003e, 0x0044, 0x0049, 0x0052, 0x005f, 0x0067, + 0x006e, 0x0075, 0x007c, 0x0082, 0x0089, 0x008f, 0x0098, 0x00a3, + 0x00ac, 0x00b3, 0x00b7, 0x00be, 0x00ca, 0x00d3, 0x00d8, 0x00de, + 0x00e3, 0x00e9, 0x00f1, 0x00f4, 0x00fb, 0x0103, 0x010c, 0x0113, + 0x0117, 0x011c, 0x0121, 0x0127, 0x012c, 0x0132, 0x0139, 0x013f, + 0x014b, 0x014f, 0x0154, 0x015b, 0x0162, 0x016c, 0x0172, 0x0177, + 0x017d, 0x0182, 0x018b, 0x0192, 0x0197, 0x019d, 0x01a4, 0x01aa, + // Entry 40 - 7F + 0x01b5, 0x01be, 0x01c9, 0x01cd, 0x01d9, 0x01e0, 0x01e3, 0x01ea, + 0x01f0, 0x01f9, 0x01ff, 0x0204, 0x020b, 0x0210, 0x0216, 0x021e, + 0x0225, 0x0230, 0x0235, 0x023c, 0x0241, 0x0247, 0x024f, 0x0254, + 0x0258, 0x025d, 0x0265, 0x026b, 0x0274, 0x0279, 0x0280, 0x0287, + 0x028a, 0x0291, 0x029d, 0x02a3, 0x02ac, 0x02b4, 0x02b9, 0x02c2, + 0x02cb, 0x02d2, 0x02d9, 0x02e0, 0x02e5, 0x02ea, 0x02ef, 0x02fe, + 0x0304, 0x030a, 0x0312, 0x0320, 0x032e, 0x033c, 0x0342, 0x034a, + 0x0353, 0x035b, 0x0360, 0x0365, 0x036d, 0x0376, 0x037b, 0x0380, + // Entry 80 - BF + 0x0386, 0x038f, 0x0396, 0x03a1, 0x03a6, 0x03ad, 0x03b5, 0x03bb, + 0x03c3, 0x03c8, 0x03ce, 0x03da, 0x03df, 0x03e6, 0x03ee, 0x03f6, + 0x03fb, 0x0400, 0x0406, 0x040d, 0x0413, 0x0418, 0x0423, 0x0428, + 0x042e, 0x0435, 0x043b, 0x0441, 0x044a, 0x044e, 0x0456, 0x045f, + 0x0465, 0x046a, 0x0470, 0x0476, 0x047d, 0x0483, 0x048a, 0x0491, + 0x0495, 0x049c, 0x04a1, 0x04a8, 0x04b0, 0x04b7, 0x04bc, 0x04c1, + 0x04c8, 0x04ce, 0x04d4, 0x04d9, 0x04dd, 0x04e3, 0x04ea, 0x04f1, + 0x04f6, 0x0504, 0x050c, 0x0511, 0x0515, 0x051b, 0x0522, 0x0529, + // Entry C0 - FF + 0x052c, 0x0531, 0x0540, 0x0546, 0x0557, 0x0561, 0x0567, 0x056e, + 0x057c, 0x0582, 0x058f, 0x059c, 0x059f, 0x05bb, 0x05c2, 0x05c8, + 0x05ce, 0x05d6, 0x05da, 0x05e1, 0x05e6, 0x05eb, 0x05f5, 0x05fc, + 0x0602, 0x0607, 0x060d, 0x0611, 0x0614, 0x061a, 0x0628, 0x0632, + 0x0637, 0x063b, 0x0641, 0x0644, 0x064b, 0x0655, 0x065d, 0x0663, + 0x0669, 0x066d, 0x0672, 0x067b, 0x067f, 0x0683, 0x0688, 0x068f, + 0x0694, 0x069a, 0x06a0, 0x06a5, 0x06ac, 0x06b0, 0x06b9, 0x06c2, + 0x06c7, 0x06cb, 0x06d9, 0x06e0, 0x06e9, 0x06f1, 0x06f9, 0x06ff, + // Entry 100 - 13F + 0x0704, 0x070c, 0x0719, 0x0720, 0x0726, 0x072b, 0x0730, 0x0738, + 0x073d, 0x0743, 0x0748, 0x074e, 0x0753, 0x075b, 0x0760, 0x0765, + 0x0772, 0x077c, 0x0781, 0x0787, 0x078b, 0x078f, 0x0795, 0x07a2, + 0x07a8, 0x07ad, 0x07ba, 0x07c6, 0x07cc, 0x07d7, 0x07db, 0x07e3, + 0x07ed, 0x07f0, 0x07f5, 0x0800, 0x080d, 0x0816, 0x0823, 0x082d, + 0x0833, 0x0835, 0x083c, 0x0845, 0x0849, 0x084e, 0x0860, 0x0867, + 0x086f, 0x0875, 0x0883, 0x0893, 0x089e, 0x08a3, 0x08ac, 0x08b2, + 0x08b7, 0x08c5, 0x08d2, 0x08d7, 0x08dd, 0x08e2, 0x08ea, 0x08ef, + // Entry 140 - 17F + 0x08fa, 0x0901, 0x090d, 0x0916, 0x091c, 0x0921, 0x092a, 0x0935, + 0x0939, 0x093d, 0x0943, 0x0948, 0x0950, 0x095a, 0x0970, 0x0976, + 0x097c, 0x0983, 0x0992, 0x09a1, 0x09a7, 0x09b3, 0x09ba, 0x09c1, + 0x09c4, 0x09c9, 0x09cd, 0x09d4, 0x09db, 0x09df, 0x09e6, 0x09f5, + 0x09fc, 0x0a11, 0x0a19, 0x0a1e, 0x0a25, 0x0a31, 0x0a37, 0x0a40, + 0x0a44, 0x0a4c, 0x0a54, 0x0a61, 0x0a68, 0x0a6e, 0x0a74, 0x0a86, + 0x0a8a, 0x0a93, 0x0a9a, 0x0aa0, 0x0aa8, 0x0aad, 0x0ab4, 0x0abb, + 0x0ac2, 0x0ac8, 0x0acd, 0x0ad3, 0x0ad8, 0x0add, 0x0aef, 0x0af6, + // Entry 180 - 1BF + 0x0afb, 0x0b01, 0x0b09, 0x0b0e, 0x0b12, 0x0b1d, 0x0b25, 0x0b2f, + 0x0b37, 0x0b3c, 0x0b3f, 0x0b44, 0x0b49, 0x0b58, 0x0b5c, 0x0b62, + 0x0b66, 0x0b6c, 0x0b74, 0x0b7c, 0x0b84, 0x0b8a, 0x0b8e, 0x0b94, + 0x0b9a, 0x0b9f, 0x0ba3, 0x0bab, 0x0bb5, 0x0bc1, 0x0bc8, 0x0bce, + 0x0bd9, 0x0be0, 0x0be8, 0x0bee, 0x0bf3, 0x0bfc, 0x0c03, 0x0c10, + 0x0c15, 0x0c1f, 0x0c26, 0x0c2e, 0x0c33, 0x0c38, 0x0c43, 0x0c51, + 0x0c57, 0x0c5b, 0x0c63, 0x0c69, 0x0c6d, 0x0c71, 0x0c78, 0x0c7e, + 0x0c87, 0x0c8c, 0x0c98, 0x0c9e, 0x0ca4, 0x0cb0, 0x0cb4, 0x0cc4, + // Entry 1C0 - 1FF + 0x0ccc, 0x0cd4, 0x0cd9, 0x0cde, 0x0ce3, 0x0ce9, 0x0cf3, 0x0cfa, + 0x0d02, 0x0d0c, 0x0d11, 0x0d18, 0x0d2a, 0x0d36, 0x0d43, 0x0d4a, + 0x0d52, 0x0d5a, 0x0d6a, 0x0d71, 0x0d7f, 0x0d91, 0x0d9a, 0x0db4, + 0x0dbf, 0x0dc6, 0x0dcf, 0x0dd8, 0x0ddf, 0x0de4, 0x0dea, 0x0df0, + 0x0df7, 0x0dfe, 0x0e06, 0x0e09, 0x0e10, 0x0e18, 0x0e26, 0x0e2d, + 0x0e32, 0x0e39, 0x0e43, 0x0e4a, 0x0e4f, 0x0e56, 0x0e5c, 0x0e69, + 0x0e74, 0x0e7a, 0x0e7e, 0x0e82, 0x0e8a, 0x0e99, 0x0ea4, 0x0eae, + 0x0eb7, 0x0ebb, 0x0ec8, 0x0ece, 0x0edb, 0x0ee2, 0x0eed, 0x0efa, + // Entry 200 - 23F + 0x0f05, 0x0f10, 0x0f17, 0x0f1c, 0x0f22, 0x0f27, 0x0f2b, 0x0f3c, + 0x0f42, 0x0f46, 0x0f4c, 0x0f52, 0x0f5a, 0x0f67, 0x0f6d, 0x0f74, + 0x0f78, 0x0f7d, 0x0f81, 0x0f87, 0x0f8c, 0x0f91, 0x0f94, 0x0f9b, + 0x0fa2, 0x0fa9, 0x0fb0, 0x0fb7, 0x0fbf, 0x0fcb, 0x0fd4, 0x0fda, + 0x0fe0, 0x0fe8, 0x0fef, 0x0ff3, 0x0ffa, 0x1000, 0x1007, 0x100b, + 0x1021, 0x1029, 0x102f, 0x1035, 0x103a, 0x103d, 0x1045, 0x104b, + 0x1057, 0x1064, 0x1069, 0x106e, 0x1073, 0x1079, 0x1081, 0x1086, + 0x108b, 0x1093, 0x109b, 0x10a3, 0x10ab, 0x10af, 0x10b2, 0x10b6, + // Entry 240 - 27F + 0x10bd, 0x10c2, 0x10cc, 0x10d9, 0x10e3, 0x10ed, 0x10f5, 0x10fb, + 0x110d, 0x1111, 0x112c, 0x1130, 0x113b, 0x113b, 0x114a, 0x115b, + 0x116d, 0x117c, 0x118e, 0x119e, 0x11ad, 0x11bc, 0x11cb, 0x11cb, + 0x11d8, 0x11e6, 0x11fa, 0x1200, 0x1212, 0x1223, 0x122a, 0x1237, + 0x124e, 0x125f, +} // Size: 1244 bytes + +var filLangStr string = "" + // Size: 2154 bytes + "AbkhazianAfrikaansAkanAmharicArabeAssameseAymaraAzerbaijaniBashkirBelaru" + + "sianBulgarianBambaraBengaliTibetanBretonBosnianCatalanChechenCorsicanCze" + + "chChuvashWelshDanishGermanDivehiDzongkhaEweGreekInglesEsperantoEspanyolE" + + "stonianBasquePersianFinnishFijianFaroeseFrenchKanlurang FrisianIrishScot" + + "s GaelicGalicianGuaraniGujaratiManxHausaHebrewHindiCroatianHaitianHungar" + + "ianArmenianInterlinguaIndonesianInterlingueIgboSichuan YiIcelandicItalia" + + "nInuktitutJapaneseJavaneseGeorgianKongoKikuyuKazakhKalaallisutKhmerKanna" + + "daKoreanKashmiriKurdishCornishKirghizLatinLuxembourgishGandaLingalaLaoLi" + + "thuanianLuba-KatangaLatvianMalagasyMaoriMacedonianMalayalamMongolianMara" + + "thiMalayMalteseBurmeseHilagang NdebeleNepaliDutchNorwegian NynorskNorweg" + + "ian BokmalNyanjaOccitanOromoOriyaOsseticPunjabiPolishPashtoPortugesQuech" + + "uaRomanshRundiRomanianRussianKinyarwandaSanskritSindhiHilagang SamiSango" + + "SinhalaSlovakSlovenianSamoanShonaSomaliAlbanianSerbianSwatiSouthern Soth" + + "oSundaneseSwedishSwahiliTamilTeluguTajikThaiTigrinyaTurkmenTswanaTonganT" + + "urkishTsongaTatarTahitianUyghurUkranianUrduUzbekVendaVietnameseWolofXhos" + + "aYiddishYorubaChineseZuluAcoliAghemMapucheAsuBembaBenaKanlurang BalochiB" + + "odoChigaCherokeeCentral KurdishTaitaZarmaLower SorbianDualaJola-FonyiEmb" + + "uEfikFilipinoGaGagauzSwiss GermanGusiiHawaiianUpper SorbianNgombaMachame" + + "KabyleKambaMakondeKabuverdianuKoyra ChiiniKalenjinKomi-PermyakKonkaniSha" + + "mbalaBafiaLangiLakotaLoziHilagang LuriLuba-LuluaLuoLuyiaMasaiMeruMorisye" + + "nMakhuwa-MeettoMeta’MohawkMundangMazanderaniNamaLow GermanKwasioN’KoNort" + + "hern SothoNuerNyankoleKʼicheʼRomboRwaSamburuSanguKatimugang KurdishSenaK" + + "oyraboro SenniTachelhitKatimugang SamiLule SamiInari SamiSkolt SamiComor" + + "ianSwahili (Congo)TesoTetumKlingonTok PisinTumbukaTasawaqTamazight ng Gi" + + "tnang AtlasHindi Kilalang WikaVaiVunjoWarlpiriSogaCantoneseStandard Moro" + + "ccan TamazightWalang nilalaman na ukol sa wikaModernong Karaniwang Arabe" + + "Austrian GermanSwiss High GermanIngles ng AustralyaIngles sa CanadaIngle" + + "s ng BritishIngles (US)Latin American na EspanyolEuropean SpanishEspanyo" + + "l ng MehikoCanadian FrenchSwiss FrenchLow SaxonFlemishPortuges ng Brasil" + + "European PortugueseMoldavianSerbo-CroatianSimplified Chinese" + +var filLangIdx = []uint16{ // 609 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0009, 0x0009, 0x0012, 0x0016, 0x001d, 0x001d, + 0x0022, 0x002a, 0x002a, 0x0030, 0x003b, 0x0042, 0x004c, 0x0055, + 0x0055, 0x005c, 0x0063, 0x006a, 0x0070, 0x0077, 0x007e, 0x0085, + 0x0085, 0x008d, 0x008d, 0x0092, 0x0092, 0x0099, 0x009e, 0x00a4, + 0x00aa, 0x00b0, 0x00b8, 0x00bb, 0x00c0, 0x00c6, 0x00cf, 0x00d7, + 0x00df, 0x00e5, 0x00ec, 0x00ec, 0x00f3, 0x00f9, 0x0100, 0x0106, + 0x0117, 0x011c, 0x0128, 0x0130, 0x0137, 0x013f, 0x0143, 0x0148, + 0x014e, 0x0153, 0x0153, 0x015b, 0x0162, 0x016b, 0x0173, 0x0173, + // Entry 40 - 7F + 0x017e, 0x0188, 0x0193, 0x0197, 0x01a1, 0x01a1, 0x01a1, 0x01aa, + 0x01b1, 0x01ba, 0x01c2, 0x01ca, 0x01d2, 0x01d7, 0x01dd, 0x01dd, + 0x01e3, 0x01ee, 0x01f3, 0x01fa, 0x0200, 0x0200, 0x0208, 0x020f, + 0x020f, 0x0216, 0x021d, 0x0222, 0x022f, 0x0234, 0x0234, 0x023b, + 0x023e, 0x0248, 0x0254, 0x025b, 0x0263, 0x0263, 0x0268, 0x0272, + 0x027b, 0x0284, 0x028b, 0x0290, 0x0297, 0x029e, 0x029e, 0x02ae, + 0x02b4, 0x02b4, 0x02b9, 0x02ca, 0x02da, 0x02da, 0x02da, 0x02e0, + 0x02e7, 0x02e7, 0x02ec, 0x02f1, 0x02f8, 0x02ff, 0x02ff, 0x0305, + // Entry 80 - BF + 0x030b, 0x0313, 0x031a, 0x0321, 0x0326, 0x032e, 0x0335, 0x0340, + 0x0348, 0x0348, 0x034e, 0x035b, 0x0360, 0x0367, 0x036d, 0x0376, + 0x037c, 0x0381, 0x0387, 0x038f, 0x0396, 0x039b, 0x03a9, 0x03b2, + 0x03b9, 0x03c0, 0x03c5, 0x03cb, 0x03d0, 0x03d4, 0x03dc, 0x03e3, + 0x03e9, 0x03ef, 0x03f6, 0x03fc, 0x0401, 0x0409, 0x040f, 0x0417, + 0x041b, 0x0420, 0x0425, 0x042f, 0x042f, 0x042f, 0x0434, 0x0439, + 0x0440, 0x0446, 0x0446, 0x044d, 0x0451, 0x0451, 0x0456, 0x0456, + 0x0456, 0x0456, 0x0456, 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, + // Entry C0 - FF + 0x045b, 0x045b, 0x045b, 0x045b, 0x045b, 0x0462, 0x0462, 0x0462, + 0x0462, 0x0462, 0x0462, 0x0462, 0x0465, 0x0465, 0x0465, 0x0465, + 0x0465, 0x0465, 0x0465, 0x0465, 0x0465, 0x0465, 0x0465, 0x0465, + 0x0465, 0x046a, 0x046a, 0x046e, 0x046e, 0x046e, 0x047f, 0x047f, + 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, 0x047f, + 0x047f, 0x0483, 0x0483, 0x0483, 0x0483, 0x0483, 0x0483, 0x0483, + 0x0483, 0x0483, 0x0483, 0x0483, 0x0483, 0x0488, 0x0488, 0x0488, + 0x0488, 0x0488, 0x0488, 0x0488, 0x0488, 0x0490, 0x0490, 0x049f, + // Entry 100 - 13F + 0x049f, 0x049f, 0x049f, 0x049f, 0x049f, 0x049f, 0x04a4, 0x04a4, + 0x04a4, 0x04a4, 0x04a4, 0x04a9, 0x04a9, 0x04b6, 0x04b6, 0x04bb, + 0x04bb, 0x04c5, 0x04c5, 0x04c5, 0x04c9, 0x04cd, 0x04cd, 0x04cd, + 0x04cd, 0x04cd, 0x04cd, 0x04cd, 0x04cd, 0x04cd, 0x04cd, 0x04d5, + 0x04d5, 0x04d5, 0x04d5, 0x04d5, 0x04d5, 0x04d5, 0x04d5, 0x04d5, + 0x04d5, 0x04d7, 0x04dd, 0x04dd, 0x04dd, 0x04dd, 0x04dd, 0x04dd, + 0x04dd, 0x04dd, 0x04dd, 0x04dd, 0x04dd, 0x04dd, 0x04dd, 0x04dd, + 0x04dd, 0x04dd, 0x04e9, 0x04e9, 0x04e9, 0x04ee, 0x04ee, 0x04ee, + // Entry 140 - 17F + 0x04ee, 0x04f6, 0x04f6, 0x04f6, 0x04f6, 0x04f6, 0x0503, 0x0503, + 0x0503, 0x0503, 0x0503, 0x0503, 0x0503, 0x0503, 0x0503, 0x0503, + 0x0509, 0x0510, 0x0510, 0x0510, 0x0510, 0x0510, 0x0516, 0x0516, + 0x0516, 0x051b, 0x051b, 0x051b, 0x051b, 0x051b, 0x0522, 0x052e, + 0x052e, 0x052e, 0x052e, 0x052e, 0x052e, 0x053a, 0x053a, 0x053a, + 0x053a, 0x0542, 0x0542, 0x054e, 0x0555, 0x0555, 0x0555, 0x0555, + 0x0555, 0x0555, 0x0555, 0x0555, 0x055d, 0x0562, 0x0562, 0x0562, + 0x0562, 0x0562, 0x0567, 0x0567, 0x0567, 0x0567, 0x0567, 0x0567, + // Entry 180 - 1BF + 0x0567, 0x056d, 0x056d, 0x056d, 0x0571, 0x057e, 0x057e, 0x0588, + 0x0588, 0x0588, 0x058b, 0x058b, 0x0590, 0x0590, 0x0590, 0x0590, + 0x0590, 0x0590, 0x0590, 0x0590, 0x0590, 0x0595, 0x0595, 0x0595, + 0x0595, 0x0595, 0x0599, 0x05a1, 0x05a1, 0x05af, 0x05b6, 0x05b6, + 0x05b6, 0x05b6, 0x05b6, 0x05bc, 0x05bc, 0x05bc, 0x05c3, 0x05c3, + 0x05c3, 0x05c3, 0x05c3, 0x05c3, 0x05c3, 0x05c3, 0x05ce, 0x05ce, + 0x05ce, 0x05d2, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05dc, 0x05e2, + 0x05e2, 0x05e2, 0x05e2, 0x05e2, 0x05e8, 0x05f6, 0x05fa, 0x05fa, + // Entry 1C0 - 1FF + 0x05fa, 0x0602, 0x0602, 0x0602, 0x0602, 0x0602, 0x0602, 0x0602, + 0x0602, 0x0602, 0x0602, 0x0602, 0x0602, 0x0602, 0x0602, 0x0602, + 0x0602, 0x0602, 0x0602, 0x0602, 0x0602, 0x0602, 0x060b, 0x060b, + 0x060b, 0x060b, 0x060b, 0x060b, 0x060b, 0x0610, 0x0610, 0x0610, + 0x0610, 0x0610, 0x0610, 0x0613, 0x0613, 0x0613, 0x0613, 0x061a, + 0x061a, 0x061a, 0x061a, 0x061a, 0x061f, 0x061f, 0x061f, 0x061f, + 0x0631, 0x0631, 0x0635, 0x0635, 0x0635, 0x0644, 0x0644, 0x0644, + 0x064d, 0x064d, 0x064d, 0x064d, 0x064d, 0x064d, 0x065c, 0x0665, + // Entry 200 - 23F + 0x066f, 0x0679, 0x0679, 0x0679, 0x0679, 0x0679, 0x0679, 0x0679, + 0x0679, 0x0679, 0x0679, 0x0681, 0x0690, 0x0690, 0x0690, 0x0690, + 0x0690, 0x0690, 0x0694, 0x0694, 0x0699, 0x0699, 0x0699, 0x0699, + 0x0699, 0x06a0, 0x06a0, 0x06a0, 0x06a0, 0x06a0, 0x06a9, 0x06a9, + 0x06a9, 0x06a9, 0x06a9, 0x06a9, 0x06b0, 0x06b0, 0x06b7, 0x06b7, + 0x06d1, 0x06d1, 0x06d1, 0x06d1, 0x06e4, 0x06e7, 0x06e7, 0x06e7, + 0x06e7, 0x06e7, 0x06e7, 0x06e7, 0x06ec, 0x06ec, 0x06ec, 0x06ec, + 0x06ec, 0x06f4, 0x06f4, 0x06f4, 0x06f4, 0x06f8, 0x06f8, 0x06f8, + // Entry 240 - 27F + 0x06f8, 0x06f8, 0x06f8, 0x0701, 0x0701, 0x0701, 0x0701, 0x0701, + 0x071c, 0x071c, 0x073c, 0x073c, 0x0756, 0x0756, 0x0765, 0x0776, + 0x0789, 0x0799, 0x07aa, 0x07b5, 0x07cf, 0x07df, 0x07f1, 0x07f1, + 0x0800, 0x080c, 0x0815, 0x081c, 0x082e, 0x0841, 0x084a, 0x0858, + 0x086a, +} // Size: 1242 bytes + +var frLangStr string = "" + // Size: 4218 bytes + "afarabkhazeavestiqueafrikaansakanamhariquearagonaisarabeassamaisavarayma" + + "raazéribachkirbiélorussebulgarebichelamarbambarabengalitibétainbretonbos" + + "niaquecatalantchétchènechamorrocorsecreetchèqueslavon d’églisetchouvache" + + "galloisdanoisallemandmaldiviendzongkhaéwégrecanglaisespérantoespagnolest" + + "onienbasquepersanpeulfinnoisfidjienféroïenfrançaisfrison occidentalirlan" + + "daisgaélique écossaisgalicienguaranigujaratimanxhaoussahébreuhindihiri m" + + "otucroatecréole haïtienhongroisarménienhérérointerlinguaindonésieninterl" + + "ingueigboyi du Sichuaninupiaqidoislandaisitalieninuktitutjaponaisjavanai" + + "sgéorgienkongokikuyukuanyamakazakhgroenlandaiskhmerkannadacoréenkanourik" + + "ashmirikurdekomicorniquekirghizelatinluxembourgeoisgandalimbourgeoisling" + + "alalaolituanienluba-katangalettonmalgachemarshallmaorimacédonienmalayala" + + "mmongolmarathemalaismaltaisbirmannauruanndébélé du Nordnépalaisndonganée" + + "rlandaisnorvégien nynorsknorvégien bokmålndébélé du Sudnavahonyanjaoccit" + + "anojibwaoromooriyaossètependjabipalipolonaispachtoportugaisquechuaromanc" + + "heroundiroumainrusserwandasanskritsardesindhisami du Nordsanghocinghalai" + + "sslovaqueslovènesamoanshonasomalialbanaisserbeswatisesothosoundanaissuéd" + + "oisswahilitamoultélougoutadjikthaïtigrignaturkmènetswanatonguienturctson" + + "gatatartahitienouïghourukrainienourdououzbekvendavietnamienvolapukwallon" + + "wolofxhosayiddishyorubazhuangchinoiszoulouacehacoliadangmeadyghéenafrihi" + + "liaghemaïnouakkadienaléoutealtaï du Sudancien anglaisangikaaraméenmapuch" + + "earapahoarawakassouasturienawadhibaloutchibalinaisbassabamounghomalabedj" + + "abembabénabafutbaloutchi occidentalbhojpuribikolbinikomsiksikabrajbodoak" + + "oosebouriatebugibouloublinmedumbacaddocaribecayugaatsamcebuanokigachibch" + + "atchaghataïchuukmarijargon chinookchoctawchipewyancherokeecheyennesorani" + + "copteturc de Criméekachoubedakotadargwataitadelawareslaveydogribdinkazar" + + "madogribas-sorabedoualamoyen néerlandaisdiola-fognydiouladazagaembouefik" + + "égyptien ancienekajukélamitemoyen anglaiséwondofangfilipinofonmoyen fra" + + "nçaisancien françaisfranco-provençalfrison du Nordfrison orientalfrioula" + + "ngagagaouzegayogbayaguèzegilbertaismoyen haut-allemandancien haut allema" + + "ndgondigorontalogotiquegrebogrec anciensuisse allemandgusiigwichʼinhaida" + + "hawaïenhiligaynonhittitehmonghaut-sorabehupaibanibibioilokanoingoucheloj" + + "banngombamachamejudéo-persanjudéo-arabekarakalpakkabylekachinjjukambakaw" + + "ikabardinkanemboutyapmakondecapverdienkorokhasikhotanaiskoyra chiinikako" + + "kalenjinkiMboundoukomi-permiakkonkanikusaienkpellékaratchaï balkarcaréli" + + "enkurukhchambalabafiafrancique ripuairekoumykkutenailadinolangilahndalam" + + "balezghienlakotamongolozilori du Nordluba-lulualuisenolundaluolushaiolul" + + "uyiamaduraismafamagahimaithilimakassarmandinguemasaimabamoksamandarmendé" + + "meroucréole mauricienmoyen irlandaismakhuwa-meettométa’micmacminangkabau" + + "mandchoumanipurimohawkmorémundangmultilinguecreekmirandaismarwarîmyènèer" + + "zyamazandéraninapolitainnamabas-allemandnewariniasniuékwasiongiemboonnog" + + "aïvieux norroisn’kosotho du Nordnuernewarî classiquenyamwezinyankolényor" + + "onzemaosageturc ottomanpangasinanpahlavipampanganpapiamentopalaupersan a" + + "ncienphénicienpohnpeiprovençal ancienk’iche’rajasthanirapanuirarotongien" + + "rombotziganevalaquerwasandaweiakoutearaméen samaritainsamburusasaksantal" + + "ngambaysangusicilienécossaiskurde du Sudsenecasenaselkoupekoyraboro senn" + + "iancien irlandaischleuhshanarabe tchadiensidamosami du Sudsami de Lulesa" + + "mi d’Inarisami skoltsoninkésogdiensranan tongosérèresahosukumasoussousum" + + "ériencomorienswahili du Congosyriaque classiquesyriaquetemnetesoterenot" + + "etumtigrétivtokelauklingontlingittamacheqtonga nyasatok pisintarokotsims" + + "hiantumbukatuvalutasawaqtouvatamazightoudmourteougaritiqueumbunduracinev" + + "aïvotevunjowalserwalamowaraywashowarlpirikalmouksogayaoyapoisyangbenyemb" + + "acantonaiszapotèquesymboles Blisszenagaamazighe standard marocainzunisan" + + "s contenu linguistiquezazakiarabe standard moderneallemand autrichienall" + + "emand suisseanglais australienanglais canadienanglais britanniqueanglais" + + " américainespagnol latino-américainespagnol européenespagnol mexicainfra" + + "nçais canadienfrançais suissebas-saxon néerlandaisflamandportugais brési" + + "lienportugais européenmoldaveserbo-croatechinois simplifiéchinois tradit" + + "ionnel" + +var frLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000b, 0x0014, 0x001d, 0x0021, 0x002a, 0x0033, + 0x0038, 0x0040, 0x0044, 0x004a, 0x0050, 0x0057, 0x0062, 0x0069, + 0x0073, 0x007a, 0x0081, 0x008a, 0x0090, 0x0099, 0x00a0, 0x00ac, + 0x00b4, 0x00b9, 0x00bd, 0x00c5, 0x00d7, 0x00e1, 0x00e8, 0x00ee, + 0x00f6, 0x00ff, 0x0107, 0x010c, 0x0110, 0x0117, 0x0121, 0x0129, + 0x0131, 0x0137, 0x013d, 0x0141, 0x0148, 0x014f, 0x0158, 0x0161, + 0x0172, 0x017b, 0x018e, 0x0196, 0x019d, 0x01a5, 0x01a9, 0x01b0, + 0x01b7, 0x01bc, 0x01c5, 0x01cb, 0x01db, 0x01e3, 0x01ec, 0x01f4, + // Entry 40 - 7F + 0x01ff, 0x020a, 0x0215, 0x0219, 0x0226, 0x022d, 0x0230, 0x0239, + 0x0240, 0x0249, 0x0251, 0x0259, 0x0262, 0x0267, 0x026d, 0x0275, + 0x027b, 0x0287, 0x028c, 0x0293, 0x029a, 0x02a1, 0x02a9, 0x02ae, + 0x02b2, 0x02ba, 0x02c2, 0x02c7, 0x02d5, 0x02da, 0x02e6, 0x02ed, + 0x02f0, 0x02f9, 0x0305, 0x030b, 0x0313, 0x031b, 0x0320, 0x032b, + 0x0334, 0x033a, 0x0341, 0x0347, 0x034e, 0x0354, 0x035b, 0x036d, + 0x0376, 0x037c, 0x0388, 0x039a, 0x03ac, 0x03bd, 0x03c3, 0x03c9, + 0x03d0, 0x03d6, 0x03db, 0x03e0, 0x03e7, 0x03ef, 0x03f3, 0x03fb, + // Entry 80 - BF + 0x0401, 0x040a, 0x0411, 0x0419, 0x041f, 0x0426, 0x042b, 0x0431, + 0x0439, 0x043e, 0x0444, 0x0450, 0x0456, 0x0460, 0x0468, 0x0470, + 0x0476, 0x047b, 0x0481, 0x0489, 0x048e, 0x0493, 0x049a, 0x04a4, + 0x04ac, 0x04b3, 0x04b9, 0x04c2, 0x04c8, 0x04cd, 0x04d5, 0x04de, + 0x04e4, 0x04ec, 0x04f0, 0x04f6, 0x04fb, 0x0503, 0x050c, 0x0515, + 0x051b, 0x0521, 0x0526, 0x0530, 0x0537, 0x053d, 0x0542, 0x0547, + 0x054e, 0x0554, 0x055a, 0x0561, 0x0567, 0x056b, 0x0570, 0x0577, + 0x0580, 0x0580, 0x0588, 0x058d, 0x0593, 0x059b, 0x059b, 0x05a3, + // Entry C0 - FF + 0x05a3, 0x05b0, 0x05be, 0x05c4, 0x05cc, 0x05d3, 0x05d3, 0x05da, + 0x05da, 0x05e0, 0x05e0, 0x05e0, 0x05e5, 0x05e5, 0x05ed, 0x05ed, + 0x05f3, 0x05fc, 0x0604, 0x0604, 0x0609, 0x060f, 0x060f, 0x0616, + 0x061b, 0x0620, 0x0620, 0x0625, 0x062a, 0x062a, 0x063e, 0x0646, + 0x064b, 0x064f, 0x064f, 0x0652, 0x0659, 0x0659, 0x0659, 0x065d, + 0x065d, 0x0661, 0x0667, 0x066f, 0x0673, 0x0679, 0x067d, 0x0684, + 0x0689, 0x068f, 0x0695, 0x069a, 0x06a1, 0x06a5, 0x06ac, 0x06b7, + 0x06bc, 0x06c0, 0x06ce, 0x06d5, 0x06de, 0x06e6, 0x06ee, 0x06f4, + // Entry 100 - 13F + 0x06f9, 0x06f9, 0x0708, 0x0710, 0x0716, 0x071c, 0x0721, 0x0729, + 0x072f, 0x0735, 0x073a, 0x073f, 0x0744, 0x074e, 0x074e, 0x0754, + 0x0766, 0x0771, 0x0777, 0x077d, 0x0782, 0x0786, 0x0786, 0x0796, + 0x079c, 0x07a4, 0x07b1, 0x07b1, 0x07b8, 0x07b8, 0x07bc, 0x07c4, + 0x07c4, 0x07c7, 0x07c7, 0x07d6, 0x07e6, 0x07f7, 0x0805, 0x0814, + 0x081c, 0x081e, 0x0826, 0x0826, 0x082a, 0x082f, 0x082f, 0x0835, + 0x083f, 0x083f, 0x0852, 0x0866, 0x0866, 0x086b, 0x0874, 0x087b, + 0x0880, 0x088b, 0x089a, 0x089a, 0x089a, 0x089f, 0x08a8, 0x08ad, + // Entry 140 - 17F + 0x08ad, 0x08b5, 0x08b5, 0x08bf, 0x08c6, 0x08cb, 0x08d6, 0x08d6, + 0x08da, 0x08de, 0x08e4, 0x08eb, 0x08f3, 0x08f3, 0x08f3, 0x08f9, + 0x08ff, 0x0906, 0x0913, 0x091f, 0x091f, 0x0929, 0x092f, 0x0935, + 0x0938, 0x093d, 0x0941, 0x0949, 0x0951, 0x0955, 0x095c, 0x0966, + 0x0966, 0x096a, 0x096a, 0x096f, 0x0978, 0x0984, 0x0984, 0x0984, + 0x0988, 0x0990, 0x099a, 0x09a6, 0x09ad, 0x09b4, 0x09bb, 0x09cc, + 0x09cc, 0x09cc, 0x09d5, 0x09db, 0x09e3, 0x09e8, 0x09fa, 0x0a00, + 0x0a07, 0x0a0d, 0x0a12, 0x0a18, 0x0a1d, 0x0a25, 0x0a25, 0x0a25, + // Entry 180 - 1BF + 0x0a25, 0x0a2b, 0x0a2b, 0x0a30, 0x0a34, 0x0a40, 0x0a40, 0x0a4a, + 0x0a51, 0x0a56, 0x0a59, 0x0a5f, 0x0a67, 0x0a67, 0x0a67, 0x0a6f, + 0x0a73, 0x0a79, 0x0a81, 0x0a89, 0x0a92, 0x0a97, 0x0a9b, 0x0aa0, + 0x0aa6, 0x0aac, 0x0ab1, 0x0ac2, 0x0ad1, 0x0adf, 0x0ae7, 0x0aed, + 0x0af8, 0x0b00, 0x0b08, 0x0b0e, 0x0b13, 0x0b13, 0x0b1a, 0x0b25, + 0x0b2a, 0x0b33, 0x0b3b, 0x0b3b, 0x0b42, 0x0b47, 0x0b53, 0x0b53, + 0x0b5d, 0x0b61, 0x0b6d, 0x0b73, 0x0b77, 0x0b7c, 0x0b7c, 0x0b82, + 0x0b8b, 0x0b91, 0x0b9e, 0x0b9e, 0x0ba4, 0x0bb1, 0x0bb5, 0x0bc6, + // Entry 1C0 - 1FF + 0x0bce, 0x0bd7, 0x0bdc, 0x0be1, 0x0be6, 0x0bf2, 0x0bfc, 0x0c03, + 0x0c0c, 0x0c16, 0x0c1b, 0x0c1b, 0x0c1b, 0x0c1b, 0x0c28, 0x0c28, + 0x0c32, 0x0c32, 0x0c32, 0x0c39, 0x0c39, 0x0c4a, 0x0c55, 0x0c55, + 0x0c5f, 0x0c66, 0x0c71, 0x0c71, 0x0c71, 0x0c76, 0x0c7d, 0x0c7d, + 0x0c7d, 0x0c7d, 0x0c84, 0x0c87, 0x0c8e, 0x0c95, 0x0ca8, 0x0caf, + 0x0cb4, 0x0cba, 0x0cba, 0x0cc1, 0x0cc6, 0x0cce, 0x0cd7, 0x0cd7, + 0x0ce3, 0x0ce9, 0x0ced, 0x0ced, 0x0cf5, 0x0d04, 0x0d14, 0x0d14, + 0x0d1a, 0x0d1e, 0x0d2c, 0x0d32, 0x0d32, 0x0d32, 0x0d3d, 0x0d49, + // Entry 200 - 23F + 0x0d57, 0x0d61, 0x0d69, 0x0d70, 0x0d7c, 0x0d84, 0x0d88, 0x0d88, + 0x0d8e, 0x0d95, 0x0d9e, 0x0da6, 0x0db6, 0x0dc8, 0x0dd0, 0x0dd0, + 0x0dd0, 0x0dd5, 0x0dd9, 0x0ddf, 0x0de4, 0x0dea, 0x0ded, 0x0df4, + 0x0df4, 0x0dfb, 0x0e02, 0x0e02, 0x0e0a, 0x0e15, 0x0e1e, 0x0e1e, + 0x0e24, 0x0e24, 0x0e2d, 0x0e2d, 0x0e34, 0x0e3a, 0x0e41, 0x0e46, + 0x0e4f, 0x0e58, 0x0e63, 0x0e6a, 0x0e70, 0x0e74, 0x0e74, 0x0e74, + 0x0e74, 0x0e74, 0x0e78, 0x0e78, 0x0e7d, 0x0e83, 0x0e89, 0x0e8e, + 0x0e93, 0x0e9b, 0x0e9b, 0x0ea2, 0x0ea2, 0x0ea6, 0x0ea9, 0x0eaf, + // Entry 240 - 27F + 0x0eb6, 0x0ebb, 0x0ebb, 0x0ec4, 0x0ece, 0x0edc, 0x0edc, 0x0ee2, + 0x0efc, 0x0f00, 0x0f19, 0x0f1f, 0x0f35, 0x0f35, 0x0f48, 0x0f57, + 0x0f69, 0x0f79, 0x0f8c, 0x0f9e, 0x0fb8, 0x0fca, 0x0fdb, 0x0fdb, + 0x0fed, 0x0ffd, 0x1013, 0x101a, 0x102e, 0x1041, 0x1048, 0x1054, + 0x1066, 0x107a, +} // Size: 1244 bytes + +var frCALangStr string = "araukanluoMeta’bas allemand" + +var frCALangIdx = []uint16{ // 435 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 80 - BF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry C0 - FF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + // Entry 100 - 13F + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + // Entry 140 - 17F + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + // Entry 180 - 1BF + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x001d, +} // Size: 894 bytes + +var guLangStr string = "" + // Size: 11388 bytes + "અફારઅબખાજિયનઅવેસ્તનઆફ્રિકન્સઅકાનએમ્હારિકઅર્ગોનીઝઅરબીઆસામીઅવેરિકઆયમારાઅઝર" + + "બૈજાનીબશ્કીરબેલારુશિયનબલ્ગેરિયનબિસ્લામાબામ્બારાબંગાળીતિબેટીયનબ્રેટોનબો" + + "સ્નિયનકતલાનચેચનકેમોરોકોર્સિકનક્રીચેકચર્ચ સ્લાવિકચૂવાશવેલ્શડેનિશજર્મનદિ" + + "વેહીડ્ઝોંગ્ખાઈવગ્રીકઅંગ્રેજીએસ્પેરાન્ટોસ્પેનિશએસ્ટોનિયનબાસ્કફારસીફુલાહ" + + "ફિનિશફિજીયનફોરિસ્તફ્રેન્ચપશ્ચિમી ફ્રિસિયનઆઇરિશસ્કોટ્સ ગેલિકગેલિશિયનગુઆ" + + "રાનીગુજરાતીમાંક્સહૌસાહીબ્રુહિન્દીહિરી મોટૂક્રોએશિયનહૈતીયનહંગેરિયનઆર્મે" + + "નિયનહેરેરોઇંટરલિંગુઆઇન્ડોનેશિયનઇંટરલિંગઇગ્બોસિચુઆન યીઇનુપિયાકઇડૌઆઇસલેન" + + "્ડિકઇટાલિયનઇનુકિટૂટજાપાનીઝજાવાનીસજ્યોર્જિઅનકોંગોકિકુયૂક્વાન્યામાકઝાખકલ" + + "ાલ્લિસુતખ્મેરકન્નડકોરિયનકનુરીકાશ્મીરીકુર્દિશકોમીકોર્નિશકિર્ગીઝલેટિનલક્" + + "ઝેમબર્ગિશગાંડાલિંબૂર્ગિશલિંગાલાલાઓથિયનલિથુનિયનલ્યૂબા કટાંગાલાતવિયનમલાગ" + + "સીમાર્શલીઝમાઓરીમેસેડોનિયનમલયાલમમોંગોલિયનમરાઠીમલયમાલ્ટિઝબર્મીઝનાઉરૂઉત્ત" + + "ર દેબેલનેપાળીડોન્ગાડચનૉર્વેજીયન નાયનૉર્સ્કનોર્વેજીયન બોકમાલદક્ષિણ દેબે" + + "લનાવાજોન્યાન્જાઓક્સિટનઓઝિંબ્વાઓરોમોઉડિયાઓસ્સેટિકપંજાબીપાલીપોલીશપશ્તોપો" + + "ર્ટુગીઝક્વેચુઆરોમાન્શરૂન્દીરોમાનિયનરશિયનકિન્યારવાન્ડાસંસ્કૃતસાર્દિનિયન" + + "સિંધીઉત્તરીય સામીસાંગોસિંહાલીસ્લોવૅકસ્લોવેનિયનસામોનશોનાસોમાલીઅલ્બેનિયન" + + "સર્બિયનસ્વાતીસદર્ન સોથોસંડેનીઝસ્વીડિશસ્વાહિલીતમિલતેલુગુતાજીકથાઈટાઇગ્રિ" + + "નિયાતુર્કમેનત્સ્વાનાટોંગાનટર્કીશસોંગાતતારતાહિતિયનઉઇગુરયુક્રેનિયનઉર્દૂઉ" + + "ઝ્બેકવેન્દાવિયેતનામીસવોલાપુકવાલૂનવોલોફખોસાયિદ્દિશયોરૂબાઝુઆગચાઇનીઝઝુલુઅ" + + "ચીનીએકોલીઅદાંગ્મીઅદિઘેઅફ્રિહિલીઅઘેમઐનુઅક્કાદીયાનઅલેઉતદક્ષિણ અલ્તાઇજુની" + + " અંગ્રેજીઅંગીકાઅર્માઇકમેપુચેઅરાપાહોઆલ્જેરિયન અરબીઅરાવકમોરોક્કન અરબીઈજિપ્" + + "શિયન અરબીઅસુઅસ્તુરિયનઅવધીબલૂચીબાલિનીસબસાબેજાબેમ્બાબેનાપશ્ચિમી બાલોચીભો" + + "જપુરીબિકોલબિનીસિક્સિકાબિષ્નુપ્રિયાવ્રજબ્રાહુઈબોડોબુરિયાતબગિનીસબ્લિનકડ્" + + "ડોકરિબઅત્સમસિબુઆનોચિગાચિબ્ચાછગાતાઇચૂકીસેમારીચિનૂક જાર્ગનચોક્તૌશિપેવ્યા" + + "નશેરોકીશેયેન્નસેન્ટ્રલ કુર્દિશકોપ્ટિકક્રિમિયન તુર્કીકાશુબિયનદાકોતાદાર્" + + "ગવાતૈતાદેલેવેરસ્લેવડોગ્રિબદિન્કાઝર્માડોગ્રીનિમ્ન સોર્બિયનદુઆલામધ્ય ડચજ" + + "ોલા-ફોન્યીડ્યુલાઍમ્બુએફિકપ્રાચીન ઇજીપ્શિયનએકાજુકએલામાઇટમિડિલ અંગ્રેજીઇ" + + "વોન્ડોફેંગફિલિપિનોફોનમિડિલ ફ્રેંચજૂની ફ્રેંચનોર્ધર્ન ફ્રિશિયનપૂર્વ ફ્ર" + + "િશિયનફ્રિયુલિયાનGaગાગાઝગાયોબાયાઝોરોસ્ટ્રિઅન દારીગીઝજિલ્બરટીઝમધ્ય હાઇ જ" + + "ર્મનજૂની હાઇ જર્મનગોઅન કોંકણીગોંડીગોરોન્તાલોગોથિકગ્રેબોપ્રાચીન ગ્રીકસ્" + + "વિસ જર્મનગુસીગ્વિચ’ઇનહૈડાહાવાઇયનફીજી હિંદીહિલિગેનોનહિટ્ટિતેમોંગઅપ્પર સ" + + "ોર્બિયનહૂપાઇબાનઇલોકોઇંગુશલોજ્બાનનગોમ્બામકામેજુદેઓ-પર્શિયનજુદેઓ-અરબીકાર" + + "ા-કલ્પકકબાઇલકાચિનજ્જુકમ્બાકાવીકબાર્ડિયનત્યાપમકોન્ડેકાબુવર્ડિઆનુકોરોખાસ" + + "ીખોતાનીસકોયરા ચિનિકલેજિનકિમ્બન્દુકોમી-પર્મ્યાકકોંકણીકોસરિયનક્પેલ્લેકરા" + + "ચય-બલ્કારકરેલિયનકુરૂખશમ્બાલાબફિયાકુમીકકુતેનાઇલાદીનોલંગીલાહન્ડાલામ્બાલે" + + "ઝધીયનલિંગ્વા ફેન્કા નોવાલાકોટામોગોલોઝીઉત્તરીય લુરીલ્યૂબા-લુલુઆલુઇસેનોલ" + + "ુન્ડાલ્યુઓલુશાઇલુઈયામાદુરીસમગહીમૈથિલીમકાસરમન્ડિન્ગોમસાઇમોક્ષમંડારમેન્ડ" + + "ેમેરુમોરીસ્યેનમિડિલ આઇરિશમાખુવા-મીટ્ટુમેતામિકમેકમિનાંગ્કાબાઉમાન્ચુમણિપ" + + "ુરીમોહૌકમોસ્સીપશ્ચિમી મારીમુનડાન્ગબહુવિધ ભાષાક્રિકમિરાંડીમારવાડીએર્ઝયા" + + "મઝાન્દેરાનીનેપોલિટાનનમાલો જર્મનનેવાડીનિયાસનિયુઆનક્વાસિઓનોગાઇજૂની નોર્સ" + + "એન’કોઉતરી સોથોનુએરપરંપરાગત નેવારીન્યામવેઝીન્યાનકોલન્યોરોન્ઝિમાઓસેજઓટોમ" + + "ાન તુર્કિશપંગાસીનાનપહલવીપમ્પાન્ગાપાપિયામેન્ટોપલાઉઆનજૂની ફારસીફોનિશિયનપ" + + "ોહપિએનજુની પ્રોવેન્સલકિચેરાજસ્થાનીરાપાનુઇરારોટોંગનરોમ્બોરોમાનીઅરોમેનિય" + + "નરવાસોંડવેયાકૂતસામરિટાન અરેમિકસમ્બુરુસાસાકસંતાલીસાંગુસિસિલિયાનસ્કોટ્સસ" + + "ર્ઘન કુર્દીશસેનાસેલ્કપકોયરાબોરો સેન્નીજૂની આયરિશતેશીલહિટશેનસિદામોદક્ષિ" + + "ણ સામીલ્યુલ સામીઇનારી સામીસ્કોલ્ટ સામીસોનિન્કેસોગ્ડિએનસ્રાનન ટોન્ગોસેર" + + "ેરસુકુમાસુસુસુમેરિયનકોમોરિયનકોંગો સ્વાહિલીપરંપરાગત સિરિએકસિરિએકતુલુટિમ" + + "્નેતેસોતેરેનોતેતુમટાઇગ્રેતિવતોકેલાઉક્લિન્ગોનલિંગિતતામાશેખન્યાસા ટોન્ગા" + + "ટોક પિસિનસિમ્શિયનમુસ્લિમ તાટતુમ્બુકાતુવાલુતસાવાકટુવીનિયનસેન્ટ્રલ ઍટ્લસ" + + " તામાઝિગ્ટઉદમુર્તયુગેરિટિકઉમ્બુન્ડૂમૂલવાઇવોટિકવુન્જોવલામોવારેવાશોવાર્લ્પ" + + "ીરીકાલ્મિકસોગાયાઓયાપીસકેંટોનીઝઝેપોટેકબ્લિસિમ્બોલ્સઝેનાગાપ્રમાણભૂત મોરો" + + "ક્કન તામાઝિગ્ટઝૂનીકોઇ ભાષાશાસ્ત્રીય સામગ્રી નથીઝાઝામોડર્ન સ્ટાન્ડર્ડ અ" + + "રબીઓસ્ટ્રિઅન જર્મનસ્વિસ હાય જર્મનઓસ્ટ્રેલિયન અંગ્રેજીકેનેડિયન અંગ્રેજી" + + "બ્રિટિશ અંગ્રેજીઅમેરિકન અંગ્રેજીલેટિન અમેરિકન સ્પેનિશયુરોપિયન સ્પેનિશમ" + + "ેક્સિકન સ્પેનિશકેનેડિયન ફ્રેંચસ્વિસ ફ્રેંચલો સેક્સોનફ્લેમિશબ્રાઝિલીયન " + + "પોર્ટુગીઝયુરોપિયન પોર્ટુગીઝમોલડાવિયનસર્બો-ક્રોએશિયનસરળીકૃત ચાઇનીઝપારંપ" + + "રિક ચાઇનીઝ" + +var guLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000c, 0x0024, 0x0039, 0x0054, 0x0060, 0x0078, 0x0090, + 0x009c, 0x00ab, 0x00bd, 0x00cf, 0x00ea, 0x00fc, 0x011a, 0x0135, + 0x014d, 0x0165, 0x0177, 0x018f, 0x01a4, 0x01bc, 0x01cb, 0x01d7, + 0x01e9, 0x0201, 0x020d, 0x0216, 0x0238, 0x0247, 0x0256, 0x0265, + 0x0274, 0x0286, 0x02a1, 0x02a7, 0x02b6, 0x02ce, 0x02ef, 0x0304, + 0x031f, 0x032e, 0x033d, 0x034c, 0x035b, 0x036d, 0x0382, 0x0397, + 0x03c5, 0x03d4, 0x03f9, 0x0411, 0x0426, 0x043b, 0x044d, 0x0459, + 0x046b, 0x047d, 0x0496, 0x04b1, 0x04c3, 0x04db, 0x04f6, 0x0508, + // Entry 40 - 7F + 0x0526, 0x0547, 0x055f, 0x056e, 0x0587, 0x059f, 0x05a8, 0x05c6, + 0x05db, 0x05f3, 0x0608, 0x061d, 0x063b, 0x064a, 0x065c, 0x067a, + 0x0686, 0x06a4, 0x06b3, 0x06c2, 0x06d4, 0x06e3, 0x06fb, 0x0710, + 0x071c, 0x0731, 0x0746, 0x0755, 0x0779, 0x0788, 0x07a6, 0x07bb, + 0x07d0, 0x07e8, 0x080d, 0x0822, 0x0834, 0x084c, 0x085b, 0x0879, + 0x088b, 0x08a6, 0x08b5, 0x08be, 0x08d3, 0x08e5, 0x08f4, 0x0913, + 0x0925, 0x0937, 0x093d, 0x097a, 0x09ab, 0x09cd, 0x09df, 0x09f7, + 0x0a0c, 0x0a24, 0x0a33, 0x0a42, 0x0a5a, 0x0a6c, 0x0a78, 0x0a87, + // Entry 80 - BF + 0x0a96, 0x0ab1, 0x0ac6, 0x0adb, 0x0aed, 0x0b05, 0x0b14, 0x0b3b, + 0x0b50, 0x0b6e, 0x0b7d, 0x0b9f, 0x0bae, 0x0bc3, 0x0bd8, 0x0bf6, + 0x0c05, 0x0c11, 0x0c23, 0x0c3e, 0x0c53, 0x0c65, 0x0c81, 0x0c96, + 0x0cab, 0x0cc3, 0x0ccf, 0x0ce1, 0x0cf0, 0x0cf9, 0x0d1a, 0x0d32, + 0x0d4a, 0x0d5c, 0x0d6e, 0x0d7d, 0x0d89, 0x0da1, 0x0db0, 0x0dce, + 0x0ddd, 0x0def, 0x0e01, 0x0e1f, 0x0e34, 0x0e43, 0x0e52, 0x0e5e, + 0x0e73, 0x0e85, 0x0e91, 0x0ea3, 0x0eaf, 0x0ebe, 0x0ecd, 0x0ee5, + 0x0ef4, 0x0ef4, 0x0f0f, 0x0f1b, 0x0f24, 0x0f42, 0x0f42, 0x0f51, + // Entry C0 - FF + 0x0f51, 0x0f76, 0x0f9b, 0x0fad, 0x0fc2, 0x0fd4, 0x0fd4, 0x0fe9, + 0x1011, 0x1020, 0x1045, 0x106d, 0x1076, 0x1076, 0x1091, 0x1091, + 0x109d, 0x10ac, 0x10c1, 0x10c1, 0x10ca, 0x10ca, 0x10ca, 0x10ca, + 0x10d6, 0x10e8, 0x10e8, 0x10f4, 0x10f4, 0x10f4, 0x111c, 0x1131, + 0x1140, 0x114c, 0x114c, 0x114c, 0x1164, 0x1188, 0x1188, 0x1194, + 0x11a9, 0x11b5, 0x11b5, 0x11ca, 0x11dc, 0x11dc, 0x11eb, 0x11eb, + 0x11fa, 0x1206, 0x1206, 0x1215, 0x122a, 0x1236, 0x1248, 0x125a, + 0x126c, 0x1278, 0x129a, 0x12ac, 0x12c7, 0x12d9, 0x12ee, 0x131c, + // Entry 100 - 13F + 0x1331, 0x1331, 0x135c, 0x1374, 0x1386, 0x139b, 0x13a7, 0x13bc, + 0x13cb, 0x13e0, 0x13f2, 0x1401, 0x1413, 0x143b, 0x143b, 0x144a, + 0x145d, 0x147c, 0x148e, 0x148e, 0x149d, 0x14a9, 0x14a9, 0x14da, + 0x14ec, 0x1501, 0x1529, 0x1529, 0x153e, 0x153e, 0x154a, 0x1562, + 0x1562, 0x156b, 0x156b, 0x158d, 0x15ac, 0x15ac, 0x15dd, 0x1605, + 0x1626, 0x1628, 0x1637, 0x1637, 0x1643, 0x164f, 0x1680, 0x1689, + 0x16a4, 0x16a4, 0x16ca, 0x16f0, 0x170f, 0x171e, 0x173c, 0x174b, + 0x175d, 0x1782, 0x17a1, 0x17a1, 0x17a1, 0x17ad, 0x17c5, 0x17d1, + // Entry 140 - 17F + 0x17d1, 0x17e6, 0x1802, 0x181d, 0x1835, 0x1841, 0x1869, 0x1869, + 0x1875, 0x1881, 0x1881, 0x1890, 0x189f, 0x189f, 0x189f, 0x18b4, + 0x18c9, 0x18d8, 0x18fd, 0x1919, 0x1919, 0x1935, 0x1944, 0x1953, + 0x195f, 0x196e, 0x197a, 0x1995, 0x1995, 0x19a4, 0x19b9, 0x19dd, + 0x19dd, 0x19e9, 0x19e9, 0x19f5, 0x1a0a, 0x1a26, 0x1a26, 0x1a26, + 0x1a26, 0x1a38, 0x1a53, 0x1a78, 0x1a8a, 0x1a9f, 0x1ab7, 0x1ad9, + 0x1ad9, 0x1ad9, 0x1aee, 0x1afd, 0x1b12, 0x1b21, 0x1b21, 0x1b30, + 0x1b45, 0x1b57, 0x1b63, 0x1b78, 0x1b8a, 0x1b9f, 0x1bd4, 0x1bd4, + // Entry 180 - 1BF + 0x1bd4, 0x1be6, 0x1be6, 0x1bf2, 0x1bfe, 0x1c20, 0x1c20, 0x1c42, + 0x1c57, 0x1c69, 0x1c78, 0x1c87, 0x1c96, 0x1c96, 0x1c96, 0x1cab, + 0x1cab, 0x1cb7, 0x1cc9, 0x1cd8, 0x1cf3, 0x1cff, 0x1cff, 0x1d0e, + 0x1d1d, 0x1d2f, 0x1d3b, 0x1d56, 0x1d75, 0x1d9a, 0x1da6, 0x1db8, + 0x1ddc, 0x1dee, 0x1e03, 0x1e12, 0x1e24, 0x1e46, 0x1e5e, 0x1e7d, + 0x1e8c, 0x1ea1, 0x1eb6, 0x1eb6, 0x1eb6, 0x1ec8, 0x1ee9, 0x1ee9, + 0x1f04, 0x1f0d, 0x1f23, 0x1f35, 0x1f44, 0x1f56, 0x1f56, 0x1f6b, + 0x1f6b, 0x1f7a, 0x1f96, 0x1f96, 0x1fa5, 0x1fbe, 0x1fca, 0x1ff5, + // Entry 1C0 - 1FF + 0x2010, 0x2028, 0x203a, 0x204c, 0x2058, 0x2080, 0x209b, 0x20aa, + 0x20c5, 0x20e9, 0x20fb, 0x20fb, 0x20fb, 0x20fb, 0x2117, 0x2117, + 0x212f, 0x212f, 0x212f, 0x2144, 0x2144, 0x216f, 0x217b, 0x217b, + 0x2196, 0x21ab, 0x21c6, 0x21c6, 0x21c6, 0x21d8, 0x21ea, 0x21ea, + 0x21ea, 0x21ea, 0x2205, 0x220e, 0x2220, 0x222f, 0x225a, 0x226f, + 0x227e, 0x2290, 0x2290, 0x2290, 0x229f, 0x22ba, 0x22cf, 0x22cf, + 0x22f4, 0x22f4, 0x2300, 0x2300, 0x2312, 0x2340, 0x235c, 0x235c, + 0x2374, 0x237d, 0x237d, 0x238f, 0x238f, 0x238f, 0x23ae, 0x23ca, + // Entry 200 - 23F + 0x23e6, 0x2408, 0x2420, 0x2438, 0x245d, 0x246c, 0x246c, 0x246c, + 0x247e, 0x248a, 0x24a2, 0x24ba, 0x24e2, 0x250d, 0x251f, 0x251f, + 0x252b, 0x253d, 0x2549, 0x255b, 0x256a, 0x257f, 0x2588, 0x259d, + 0x259d, 0x25b8, 0x25ca, 0x25ca, 0x25df, 0x2604, 0x261d, 0x261d, + 0x261d, 0x261d, 0x2635, 0x2654, 0x266c, 0x267e, 0x2690, 0x26a8, + 0x26ec, 0x2701, 0x271c, 0x2737, 0x2740, 0x2749, 0x2749, 0x2749, + 0x2749, 0x2749, 0x2758, 0x2758, 0x276a, 0x276a, 0x2779, 0x2785, + 0x2791, 0x27af, 0x27af, 0x27c4, 0x27c4, 0x27d0, 0x27d9, 0x27e8, + // Entry 240 - 27F + 0x27e8, 0x27e8, 0x27e8, 0x2800, 0x2815, 0x283c, 0x283c, 0x284e, + 0x289e, 0x28aa, 0x28fb, 0x2907, 0x2945, 0x2945, 0x2970, 0x2999, + 0x29d3, 0x2a04, 0x2a32, 0x2a60, 0x2a9b, 0x2ac9, 0x2af7, 0x2af7, + 0x2b22, 0x2b44, 0x2b60, 0x2b75, 0x2baf, 0x2be3, 0x2bfe, 0x2c29, + 0x2c51, 0x2c7c, +} // Size: 1244 bytes + +var heLangStr string = "" + // Size: 7130 bytes + "אפאריתאבחזיתאבסטןאפריקאנסאקאןאמהריתאראגוניתערביתאסאמיתאבאריתאיימאריתאזרי" + + "תבשקיריתבלארוסיתבולגריתביסלמהבמבארהבנגליתטיבטיתברטוניתבוסניתקטלאניתצ׳צ׳" + + "ניתצ׳מורוקורסיקניתקריצ׳כיתסלאבית כנסייתית עתיקהצ׳ובאשולשיתדניתגרמניתדיב" + + "הידזונקהאווהיווניתאנגליתאספרנטוספרדיתאסטוניתבסקיתפרסיתפולהפיניתפיג׳יתפא" + + "רואזיתצרפתיתפריזיתאיריתגאלית סקוטיתגליציאניתגוארניגוג׳ראטיתמאניתהאוסהעב" + + "ריתהינדיהארי מוטוקרואטיתהאיטיתהונגריתארמניתהררו\u200fאינטרלינגואהאינדונ" + + "זיתאינטרלינגהאיגבוסיצ׳ואן ייאינופיאקאידואיסלנדיתאיטלקיתאינוקטיטוטיפניתי" + + "אווניתגאורגיתקונגוקיקויוקואניאמהקזחיתקאלאליסוטיתקמריתקנאדהקוריאניתקאנור" + + "יקשמיריתכורדיתקומיקורניתקירגיזיתלטיניתלוקסמבורגיתגאנדהלימבורגישלינגלהלא" + + "יתליטאיתלובה-קטנגהלטביתמלגשיתמרשאלסמאוריתמקדוניתמלאיאלםמונגוליתמרטהימלא" + + "יתמלטיתבורמזיתנאוריתצפון נדבלהנפאליתנדונגההולנדיתנורווגית חדשהנורווגית " + + "ספרותיתדרום נדבלהנבחוניאנג׳האוקסיטניתאוג׳יבווהאורומואוריהאוסטיתפנג׳אבית" + + "פאליפולניתפאשטופורטוגליתקצ׳ואהרומאנשקירונדירומניתרוסיתקינירואנדהסנסקריט" + + "סרדיניתסינדהיתלאפית צפוניתסנגוסינהלהסלובקיתסלובניתסמואיתשונהסומליתאלבני" + + "תסרביתסיסוואטיססות׳וסונדניתשוודיתסווהיליתטמיליתטלוגוטג׳יקיתתאיתטיגרינאי" + + "תטורקמניתטוניסיהטונגןטורקיתטסונגהטטריתטהיטיתאויגהוראוקראיניתאורדואוזבקי" + + "תוונדהויאטנמית\u200fוולאפיקוואלוןג׳ולוףקסוסהיידישיורובהז׳ואנגסיניתזולוא" + + "כינזיתאקוליאדנמהאדיגיתאפריהיליאהייםאינואכדיתאלאוטאלטאי דרומיתאנגלית עתי" + + "קהאנג׳יקהארמיתאראוקניתארפהוארוואקאסואסטוריתאוואדיתבאלוצ׳יבלינזיתבווארית" + + "בסאאבאקסגומלבז׳הבמבהבנהבאפוטבוג׳פוריביקולביניקוםסיקסיקהבראג׳בודואקוסהבו" + + "ריאטבוגינזיתבולובליןמדומבהקאדוקאריבקאיוגהאטסםקבואנוצ׳יגהצ׳יבצ׳הצ׳אגאטאי" + + "צ׳וקסהמאריניב צ׳ינוקצ׳וקטאוצ׳יפוויאןצ׳רוקישאייןכורדית סוראניתקופטיתטטרי" + + "ת של קריםקשוביאןדקוטהדרגווהטאיטהדלאוורסלאביתדוגריבדינקהזארמהדוגריסורבית" + + " נמוכהדואלההולנדית תיכונההולה-פוניידיולהדזאנגהאמבואפיקמצרית עתיקהאקיוקעי" + + "למיתאנגלית תיכונהאוונדופנגפיליפיניתפוןצרפתית תיכונהצרפתית עתיקהפריזית צ" + + "פוניתפריזיאן מזרחיתפריוליתגאגגאוזיתגאיוגבאיהגעזגילברטזיתגרמנית בינונית-" + + "גבוההגרמנית עתיקה גבוההגונדיגורונטאלוגותיתגרבויוונית עתיקהגרמנית שוויצר" + + "יתגוסיגוויצ׳יןהאידההוואיתהיליגאינוןחיתיתמונגסורבית גבוהההופהאיבאןאיביבי" + + "ואילוקואינגושיתלויבאןנגומהמצ׳אמהפרסית יהודיתערבית יהודיתקארא-קלפאקקבילה" + + "קצ׳יןג׳יוקמבהקאוויקברדיתקנמבוטיאפמקונדהקאבוורדיאנוקורוקאסיקוטאנזיתקוירה" + + " צ׳יניקאקוקאלנג׳יןקימבונדוקומי-פרמיאקיתקונקאניקוסראיאןקפלהקראצ׳י-בלקרקאר" + + "ליתקורוקשמבאלהבאפיהקולוניאןקומיקקוטנאילדינולאנגילנדהלמבהלזגיתלקוטהמונגו" + + "לוזילובה, לולואהלואיסנולונדהלואולושאילויהמדורסהמאפאמאגאהיתמאיטיליתמקסאר" + + "מנדינגומאסאיתמאבאמוקשהמנדארמנדהמרומוריסייןאירית תיכונהמקואה-מיטומטאמיקמ" + + "קמיננגקבאומנצ׳ומניפוריתמוהוקמוסימונדאנגמספר שפותקריקמירנדזיתמרווארימאיי" + + "ןארזיהנפוליטניתנאמהגרמנית תחתיתנוואריניאסניואיאןקוואסיונגיאמבוןנוגאי" + + "\u200fנורדית עתיקהנ׳קוסוטו הצפוניתנוארנווארית קלאסיתניאמווזיניאנקולהניור" + + "ונזימהאוסג׳הטורקית עותומניתפנגסינאןפלאביפמפאניהפפיאמנטופלוואןפרסית עתיק" + + "הפניקיתפונפיאןפרובנסאל עתיקהקיצ׳הראג׳סטןרפאנויררוטונגאןרומבורומאניתארומ" + + "ניתרוואסנדאווהסאחהארמית שומרוניתסמבורוססאקסאנטלינגמבאיסאנגוסיציליאניתסק" + + "וטיתכורדית דרומיתסנקהסנהסלקופקויראבורו סניאירית עתיקהטצ׳להיטשאןערבית צ׳" + + "אדיתסידמוסאמי דרומיתלולה סאמיאינארי סאמיסקולט סאמיסונינקהסוגדיאןסרנאן ט" + + "ונגוסררסאהוסוקומהסוסושומריתסווהילי קונגולטזיתסירית קלאסיתסוריתטימנהטסוט" + + "רנוטטוםטיגריתטיבטוקלאוקלינגוןטלינגיטטמאשקניאסה טונגהטוק פיסיןטרוקוטסימש" + + "יאןטומבוקהטובאלוטסוואקטוביניתטמזייט של מרכז מרוקואודמורטאוגריתיתאומבונד" + + "ורוטואיווטיקוונג׳ווואלסרוולאמוווראיוואשווורלפיריקלמיקסוגהיאויאפזיתיאנגב" + + "ןימבהקנטונזיתזאפוטקבליסימבולסזנאגהתמזיע׳ת מרוקאית תקניתזוניללא תוכן לשו" + + "ניזאזאערבית ספרותיתגרמנית אוסטריתגרמנית שוויצרית (גבוהה)אנגלית אוסטרלית" + + "אנגלית קנדיתאנגלית בריטיתאנגלית אמריקאיתספרדית לטינו־אמריקאיתספרדית איר" + + "ופאיתספרדית מקסיקניתצרפתית קנדיתצרפתית שוויצריתסקסונית תחתיתפלמיתפורטוג" + + "לית ברזילאיתפורטוגלית אירופאיתמולדביתסרבו-קרואטיתסינית מפושטתסינית מסור" + + "תית" + +var heLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000c, 0x0018, 0x0022, 0x0032, 0x003a, 0x0046, 0x0056, + 0x0060, 0x006c, 0x0078, 0x0088, 0x0092, 0x00a0, 0x00b0, 0x00be, + 0x00ca, 0x00d6, 0x00e2, 0x00ee, 0x00fc, 0x0108, 0x0116, 0x0124, + 0x0130, 0x0142, 0x0148, 0x0152, 0x017a, 0x0186, 0x0190, 0x0198, + 0x01a4, 0x01ae, 0x01ba, 0x01c2, 0x01ce, 0x01da, 0x01e8, 0x01f4, + 0x0202, 0x020c, 0x0216, 0x021e, 0x0228, 0x0234, 0x0244, 0x0250, + 0x025c, 0x0266, 0x027d, 0x028f, 0x029b, 0x02ad, 0x02b7, 0x02c1, + 0x02cb, 0x02d5, 0x02e6, 0x02f4, 0x0300, 0x030e, 0x031a, 0x0322, + // Entry 40 - 7F + 0x033d, 0x034f, 0x0363, 0x036d, 0x0380, 0x0390, 0x0398, 0x03a8, + 0x03b6, 0x03ca, 0x03d4, 0x03e2, 0x03f0, 0x03fa, 0x0406, 0x0416, + 0x0420, 0x0436, 0x0440, 0x044a, 0x045a, 0x0466, 0x0474, 0x0480, + 0x0488, 0x0494, 0x04a4, 0x04b0, 0x04c6, 0x04d0, 0x04e2, 0x04ee, + 0x04f6, 0x0502, 0x0515, 0x051f, 0x052b, 0x0537, 0x0543, 0x0551, + 0x055f, 0x056f, 0x0579, 0x0583, 0x058d, 0x059b, 0x05a7, 0x05ba, + 0x05c6, 0x05d2, 0x05e0, 0x05f9, 0x0618, 0x062b, 0x0633, 0x0641, + 0x0653, 0x0665, 0x0671, 0x067b, 0x0687, 0x0697, 0x069f, 0x06ab, + // Entry 80 - BF + 0x06b5, 0x06c7, 0x06d3, 0x06df, 0x06ed, 0x06f9, 0x0703, 0x0717, + 0x0725, 0x0733, 0x0741, 0x0758, 0x0760, 0x076c, 0x077a, 0x0788, + 0x0794, 0x079c, 0x07a8, 0x07b4, 0x07be, 0x07ce, 0x07da, 0x07e8, + 0x07f4, 0x0804, 0x0810, 0x081a, 0x0828, 0x0830, 0x0842, 0x0852, + 0x0860, 0x086a, 0x0876, 0x0882, 0x088c, 0x0898, 0x08a6, 0x08b8, + 0x08c2, 0x08d0, 0x08da, 0x08ea, 0x08fb, 0x0907, 0x0913, 0x091d, + 0x0927, 0x0933, 0x093f, 0x0949, 0x0951, 0x095f, 0x0969, 0x0973, + 0x097f, 0x097f, 0x098f, 0x0999, 0x09a1, 0x09ab, 0x09ab, 0x09b5, + // Entry C0 - FF + 0x09b5, 0x09cc, 0x09e3, 0x09f1, 0x09fb, 0x0a0b, 0x0a0b, 0x0a15, + 0x0a15, 0x0a21, 0x0a21, 0x0a21, 0x0a27, 0x0a27, 0x0a35, 0x0a35, + 0x0a43, 0x0a51, 0x0a5f, 0x0a6d, 0x0a75, 0x0a7d, 0x0a7d, 0x0a85, + 0x0a8d, 0x0a95, 0x0a95, 0x0a9b, 0x0aa5, 0x0aa5, 0x0aa5, 0x0ab5, + 0x0abf, 0x0ac7, 0x0ac7, 0x0acd, 0x0adb, 0x0adb, 0x0adb, 0x0ae5, + 0x0ae5, 0x0aed, 0x0af7, 0x0b03, 0x0b13, 0x0b1b, 0x0b23, 0x0b2f, + 0x0b37, 0x0b41, 0x0b4d, 0x0b55, 0x0b61, 0x0b6b, 0x0b79, 0x0b89, + 0x0b95, 0x0b9d, 0x0bb0, 0x0bbe, 0x0bd0, 0x0bdc, 0x0be6, 0x0c01, + // Entry 100 - 13F + 0x0c0d, 0x0c0d, 0x0c25, 0x0c33, 0x0c3d, 0x0c49, 0x0c53, 0x0c5f, + 0x0c6b, 0x0c77, 0x0c81, 0x0c8b, 0x0c95, 0x0cac, 0x0cac, 0x0cb6, + 0x0cd1, 0x0ce4, 0x0cee, 0x0cfa, 0x0d02, 0x0d0a, 0x0d0a, 0x0d1f, + 0x0d29, 0x0d35, 0x0d4e, 0x0d4e, 0x0d5a, 0x0d5a, 0x0d60, 0x0d72, + 0x0d72, 0x0d78, 0x0d78, 0x0d91, 0x0da8, 0x0da8, 0x0dc1, 0x0ddc, + 0x0dea, 0x0dee, 0x0dfc, 0x0dfc, 0x0e04, 0x0e0e, 0x0e0e, 0x0e14, + 0x0e26, 0x0e26, 0x0e4c, 0x0e6e, 0x0e6e, 0x0e78, 0x0e8a, 0x0e94, + 0x0e9c, 0x0eb3, 0x0ed0, 0x0ed0, 0x0ed0, 0x0ed8, 0x0ee8, 0x0ef2, + // Entry 140 - 17F + 0x0ef2, 0x0efe, 0x0efe, 0x0f12, 0x0f1c, 0x0f24, 0x0f3b, 0x0f3b, + 0x0f43, 0x0f4d, 0x0f5b, 0x0f67, 0x0f77, 0x0f77, 0x0f77, 0x0f83, + 0x0f8d, 0x0f99, 0x0fb0, 0x0fc7, 0x0fc7, 0x0fda, 0x0fe4, 0x0fee, + 0x0ff6, 0x0ffe, 0x1008, 0x1014, 0x101e, 0x1026, 0x1032, 0x1048, + 0x1048, 0x1050, 0x1050, 0x1058, 0x1068, 0x107d, 0x107d, 0x107d, + 0x1085, 0x1095, 0x10a5, 0x10be, 0x10cc, 0x10dc, 0x10e4, 0x10f9, + 0x10f9, 0x10f9, 0x1105, 0x110f, 0x111b, 0x1125, 0x1135, 0x113f, + 0x114b, 0x1155, 0x115f, 0x1167, 0x116f, 0x1179, 0x1179, 0x1179, + // Entry 180 - 1BF + 0x1179, 0x1183, 0x1183, 0x118d, 0x1195, 0x1195, 0x1195, 0x11ab, + 0x11b9, 0x11c3, 0x11cb, 0x11d5, 0x11dd, 0x11dd, 0x11dd, 0x11e9, + 0x11f1, 0x11ff, 0x120f, 0x1219, 0x1227, 0x1233, 0x123b, 0x1245, + 0x124f, 0x1257, 0x125d, 0x126d, 0x1284, 0x1297, 0x129d, 0x12a7, + 0x12b9, 0x12c3, 0x12d3, 0x12dd, 0x12e5, 0x12e5, 0x12f3, 0x1304, + 0x130c, 0x131c, 0x132a, 0x132a, 0x1334, 0x133e, 0x133e, 0x133e, + 0x1350, 0x1358, 0x136f, 0x137b, 0x1383, 0x1391, 0x1391, 0x139f, + 0x13af, 0x13b9, 0x13d3, 0x13d3, 0x13db, 0x13f2, 0x13fa, 0x1415, + // Entry 1C0 - 1FF + 0x1425, 0x1435, 0x143f, 0x1449, 0x1455, 0x1472, 0x1482, 0x148c, + 0x149a, 0x14aa, 0x14b6, 0x14b6, 0x14b6, 0x14b6, 0x14cb, 0x14cb, + 0x14d7, 0x14d7, 0x14d7, 0x14e5, 0x14e5, 0x1500, 0x150a, 0x150a, + 0x1518, 0x1524, 0x1536, 0x1536, 0x1536, 0x1540, 0x154e, 0x154e, + 0x154e, 0x154e, 0x155c, 0x1564, 0x1572, 0x157a, 0x1595, 0x15a1, + 0x15a9, 0x15b5, 0x15b5, 0x15c1, 0x15cb, 0x15df, 0x15eb, 0x15eb, + 0x1604, 0x160c, 0x1612, 0x1612, 0x161c, 0x1635, 0x164a, 0x164a, + 0x1658, 0x165e, 0x1675, 0x167f, 0x167f, 0x167f, 0x1694, 0x16a5, + // Entry 200 - 23F + 0x16ba, 0x16cd, 0x16db, 0x16e9, 0x16fe, 0x1704, 0x170c, 0x170c, + 0x1718, 0x1720, 0x172c, 0x172c, 0x174f, 0x1766, 0x1770, 0x1770, + 0x1770, 0x177a, 0x1780, 0x1788, 0x1790, 0x179c, 0x17a2, 0x17ae, + 0x17ae, 0x17bc, 0x17ca, 0x17ca, 0x17d4, 0x17e9, 0x17fa, 0x17fa, + 0x1804, 0x1804, 0x1814, 0x1814, 0x1822, 0x182e, 0x183a, 0x1848, + 0x186d, 0x187b, 0x188b, 0x189b, 0x18a1, 0x18a7, 0x18a7, 0x18a7, + 0x18a7, 0x18a7, 0x18b1, 0x18b1, 0x18bd, 0x18c9, 0x18d5, 0x18df, + 0x18e9, 0x18f9, 0x18f9, 0x1903, 0x1903, 0x190b, 0x1911, 0x191d, + // Entry 240 - 27F + 0x1929, 0x1931, 0x1931, 0x1941, 0x194d, 0x1961, 0x1961, 0x196b, + 0x1993, 0x199b, 0x19b5, 0x19bd, 0x19d6, 0x19d6, 0x19f1, 0x1a1b, + 0x1a38, 0x1a4f, 0x1a68, 0x1a85, 0x1aae, 0x1acb, 0x1ae8, 0x1ae8, + 0x1aff, 0x1b1c, 0x1b35, 0x1b3f, 0x1b62, 0x1b85, 0x1b93, 0x1baa, + 0x1bc1, 0x1bda, +} // Size: 1244 bytes + +var hiLangStr string = "" + // Size: 11180 bytes + "अफ़ारअब्ख़ाज़ियनअवस्ताईअफ़्रीकीअकनअम्हेरीअर्गोनीअरबीअसमियाअवेरिकआयमाराअज" + + "़रबैजानीबशख़िरबेलारूसीबुल्गारियाईबिस्लामाबाम्बाराबंगालीतिब्बतीब्रेटनबो" + + "स्नियाईकातालानचेचनकमोरोकोर्सीकनक्रीचेकचर्च साल्विकचूवाशवेल्शडेनिशजर्मन" + + "दिवेहीज़ोन्गखाईवेयूनानीअंग्रेज़ीएस्पेरेंतोस्पेनीएस्टोनियाईबास्कफ़ारसीफ" + + "ुलाहफ़िनिशफ़ीजीफ़ैरोइज़फ़्रेंचपश्चिमी फ़्रिसियाईआइरिशस्काट्स् गायेलिक्" + + "गैलिशियनगुआरानीगुजरातीमैंक्सहौसाहिब्रूहिन्दीहिरी मोटूक्रोएशियाईहैतियाई" + + "हंगेरियाईआर्मेनियाईहरैरोईन्टरलिंगुआइंडोनेशियाईईन्टरलिंगुइईग्बोसिचुआन य" + + "ीइनुपियाक्इडौआइसलैंडिकइतालवीइनूकीटूत्जापानीजावानीज़जॉर्जियाईकोंगोकिकुय" + + "ूक्वान्यामाकज़ाख़कलालीसुतखमेरकन्नड़कोरियाईकनुरीकश्मीरीकुर्दिशकोमीकोर्न" + + "िशकिर्गीज़लैटिनलग्ज़मबर्गीगांडालिंबर्गिशलिंगालालाओलिथुआनियाईल्यूबा-कटा" + + "ंगालातवियाईमालागासीमार्शलीज़माओरीमैसिडोनियाईमलयालममंगोलीयाईमराठीमलयमाल" + + "्टीज़बर्मीज़नाउरूउत्तरी देबेलनेपालीडोन्गाडचनॉर्वेजियाई नॉयनॉर्स्कनॉर्व" + + "ेजियाई बोकमालदक्षिण देबेलनावाजोन्यानजाओसीटानओजिब्वाओरोमोउड़ियाओस्सेटिक" + + "पंजाबीपालीपोलिशपश्तोपुर्तगालीक्वेचुआरोमान्शरुन्दीरोमानियाईरूसीकिन्यारव" + + "ांडासंस्कृतसार्दिनियनसिंधीनॉर्दन सामीसांगोसिंहलीस्लोवाकस्लोवेनियाईसामो" + + "नशोणासोमालीअल्बानियाईसर्बियाईस्वातीसेसोथोसुंडानीस्वीडिशस्वाहिलीतमिलतेल" + + "ुगूताजिकथाईतिग्रीन्यातुर्कमेनसेत्स्वानाटोंगनतुर्कीसोंगातातारताहितियनवि" + + "घुरयूक्रेनियाईउर्दूउज़्बेकवेन्दावियतनामीवोलापुकवाल्लूनवोलोफ़ख़ोसायेहुद" + + "ीयोरूबाज़ुआंगचीनीज़ुलूअचाइनीसअकोलीअदान्गमेअदिघेअफ्रिहिलीअग्हेमऐनूअक्का" + + "दीअलेउतदक्षिणी अल्ताईपुरानी अंग्रेज़ीअंगिकाऐरेमेकमापूचेअराफाओअरावकअसुअ" + + "स्तुरियनअवधीबलूचीबालिनीसबसाबेजाबेम्बाबेनापश्चिमी बलोचीभोजपुरीबिकोलबिनी" + + "सिक्सिकाब्रजबोडोबुरियातबगिनीसब्लिनकैड्डोकैरिबअत्समसिबुआनोशिगाचिब्चाछगा" + + "ताईचूकीसमारीचिनूक जारगॉनचोक्तौशिपेव्यानशेरोकीशेयेन्नसोरानी कुर्दिशकॉप्" + + "टिकक्रीमीन तुर्कीकाशुबियनदाकोतादार्गवातैताडिलैवेयरस्लेवडोग्रिबदिन्काझा" + + "र्माडोग्रीनिचला सॉर्बियनदुआलामध्य पुर्तगालीजोला-फोंईड्युलाएम्बुएफिकप्र" + + "ाचीन मिस्रीएकाजुकएलामाइटमध्यकालीन अंग्रेज़ीइवोन्डोफैन्गफ़िलिपीनोफॉनमध्" + + "यकालीन फ़्रांसीसीपुरातन फ़्रांसीसीउत्तरी फ्रीसीयनपूर्वी फ्रीसीयनफ्रीयु" + + "लीयानगागागौज़गायोग्बायागीज़गिल्बरतीसमध्यकालीन हाइ जर्मनपुरातन हाइ जर्म" + + "नगाँडीगोरोन्तालोगॉथिकग्रेबोप्राचीन यूनानीस्विस जर्मनगुसीग्विच’इनहैडाहव" + + "ाईहिलिगेननहिताइतह्मॉंगऊपरी सॉर्बियनहूपाइबानइलोकोइंगुशलोज्बाननगोंबामैकह" + + "ैमेजुदेओ-पर्शियनजुदेओ-अरेबिककारा-कल्पककबाइलकाचिनज्जुकम्बाकावीकबार्डियन" + + "त्यापमैकोंडकाबुवेर्दियानुकोरोखासीखोतानीसकोयरा चीनीकलेंजिनकिम्बन्दुकोमी" + + "-पर्मयाककोंकणीकोसरैनक्पेल्लैकराचय-बल्कारकरेलियनकुरूखशम्बालाबफिआकुमीककुते" + + "नाईलादीनोलांगिलाह्न्डालाम्बालेज़्घीयनलैकोटामोंगोलोज़ीउत्तरी लूरील्यूबा" + + "-लुलुआलुइसेनोलुन्डाल्युओलुशाईल्युईआमादुरीसमगाहीमैथिलीमकासरमन्डिन्गोमसाईम" + + "ोक्षमंधारमेन्डेमेरुमोरीस्येनमध्यकाल आइरिशमैखुवा-मीट्टोमेटामिकमैकमिनांग" + + "्काबाउमन्चुमणिपूरीमोहौकमोस्सीमुंडैंगविविध भाषाएँक्रीकमिरांडीमारवाड़ीएर" + + "्ज़यामाज़न्देरानीनीपोलिटननामानिचला जर्मननेवाड़ीनियासनियुआनक्वासिओनोगाई" + + "पुराना नॉर्सएन्कोउत्तरी सोथोनुएरपारम्परिक नेवारीन्यामवेज़ीन्यानकोलन्यो" + + "रोन्ज़ीमाओसेजओटोमान तुर्किशपंगासीनानपाह्लावीपाम्पान्गापापियामेन्टोपलोउ" + + "आनपुरानी फारसीफोएनिशियनपोह्नपिएनपुरानी प्रोवेन्सलकिशराजस्थानीरापानुईरा" + + "रोतोंगनरोम्बोरोमानीअरोमानियनरवासन्डावेयाकूतसामैरिटन अरैमिकसैम्बुरुसासा" + + "कसंतालीसैंगुसिसिलियनस्कॉट्सदक्षिणी कार्डिशसेनासेल्कपकोयराबोरो सेन्नीपु" + + "रानी आइरिशतैचेल्हितशैनसिदामोदक्षिण सामील्युल सामीइनारी सामीस्कोल्ट साम" + + "ीसोनिन्केसोग्डिएनस्रानान टॉन्गोसेरेरसुकुमासुसुसुमेरियनकांगो स्वाहिलीक्" + + "लासिकल सिरिएकसिरिएकटिम्नेटेसोतेरेनोतेतुमटाइग्रेतिवतोकेलाऊक्लिंगनत्लिंग" + + "िततामाशेकन्यासा टोन्गाटोक पिसिनत्सिमीशियनतम्बूकातुवालुटासवाकतुवीनियनमध" + + "्य एटलस तमाज़ितउदमुर्तयुगैरिटिकउम्बुन्डुरूटवाईवॉटिकवुंजोवलामोवारैवाशोव" + + "ॉल्पेरीकाल्मिकसोगायाओयापीसकैंटोनीज़ज़ेपोटेकब्लिसिम्बॉल्सज़ेनान्गामानक " + + "मोरक्कन तामाज़ाइटज़ूनीकोई भाषा सामग्री नहींज़ाज़ाआधुनिक मानक अरबीऑस्ट्" + + "रियाई जर्मनस्विस उच्च जर्मनऑस्ट्रेलियाई अंग्रेज़ीकनाडाई अंग्रेज़ीब्रिट" + + "िश अंग्रेज़ीअमेरिकी अंग्रेज़ीलैटिन अमेरिकी स्पेनीयूरोपीय स्पेनिशमैक्सि" + + "कन स्पेनिशकनाडाई फ़्रेंचस्विस फ़्रेंचनिचली सैक्सनफ़्लेमिशब्राज़ीली पुर" + + "्तगालीयूरोपीय पुर्तगालीमोलडावियनसेर्बो-क्रोएशन्सरलीकृत चीनीपारंपरिक ची" + + "नी" + +var hiLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000f, 0x0030, 0x0045, 0x005d, 0x0066, 0x007b, 0x0090, + 0x009c, 0x00ae, 0x00c0, 0x00d2, 0x00f0, 0x0102, 0x011a, 0x013b, + 0x0153, 0x016b, 0x017d, 0x0192, 0x01a4, 0x01bf, 0x01d4, 0x01e0, + 0x01ef, 0x0207, 0x0213, 0x021c, 0x023e, 0x024d, 0x025c, 0x026b, + 0x027a, 0x028c, 0x02a4, 0x02ad, 0x02bf, 0x02da, 0x02f8, 0x030a, + 0x0328, 0x0337, 0x0349, 0x0358, 0x036a, 0x0379, 0x0391, 0x03a6, + 0x03da, 0x03e9, 0x041a, 0x0432, 0x0447, 0x045c, 0x046e, 0x047a, + 0x048c, 0x049e, 0x04b7, 0x04d5, 0x04ea, 0x0505, 0x0523, 0x0532, + // Entry 40 - 7F + 0x0553, 0x0574, 0x0595, 0x05a4, 0x05bd, 0x05d8, 0x05e1, 0x05fc, + 0x060e, 0x0629, 0x063b, 0x0653, 0x066e, 0x067d, 0x068f, 0x06ad, + 0x06bf, 0x06d7, 0x06e3, 0x06f5, 0x070a, 0x0719, 0x072e, 0x0743, + 0x074f, 0x0764, 0x077c, 0x078b, 0x07ac, 0x07bb, 0x07d6, 0x07eb, + 0x07f4, 0x0812, 0x0837, 0x084f, 0x0867, 0x0882, 0x0891, 0x08b2, + 0x08c4, 0x08df, 0x08ee, 0x08f7, 0x090f, 0x0924, 0x0933, 0x0955, + 0x0967, 0x0979, 0x097f, 0x09bf, 0x09f3, 0x0a15, 0x0a27, 0x0a3c, + 0x0a4e, 0x0a63, 0x0a72, 0x0a84, 0x0a9c, 0x0aae, 0x0aba, 0x0ac9, + // Entry 80 - BF + 0x0ad8, 0x0af3, 0x0b08, 0x0b1d, 0x0b2f, 0x0b4a, 0x0b56, 0x0b7a, + 0x0b8f, 0x0bad, 0x0bbc, 0x0bdb, 0x0bea, 0x0bfc, 0x0c11, 0x0c32, + 0x0c41, 0x0c4d, 0x0c5f, 0x0c7d, 0x0c95, 0x0ca7, 0x0cb9, 0x0cce, + 0x0ce3, 0x0cfb, 0x0d07, 0x0d19, 0x0d28, 0x0d31, 0x0d4f, 0x0d67, + 0x0d85, 0x0d94, 0x0da6, 0x0db5, 0x0dc4, 0x0ddc, 0x0deb, 0x0e0c, + 0x0e1b, 0x0e30, 0x0e42, 0x0e5a, 0x0e6f, 0x0e84, 0x0e96, 0x0ea5, + 0x0eb7, 0x0ec9, 0x0edb, 0x0ee7, 0x0ef6, 0x0f0b, 0x0f1a, 0x0f32, + 0x0f41, 0x0f41, 0x0f5c, 0x0f6e, 0x0f77, 0x0f8c, 0x0f8c, 0x0f9b, + // Entry C0 - FF + 0x0f9b, 0x0fc3, 0x0ff1, 0x1003, 0x1015, 0x1027, 0x1027, 0x1039, + 0x1039, 0x1048, 0x1048, 0x1048, 0x1051, 0x1051, 0x106c, 0x106c, + 0x1078, 0x1087, 0x109c, 0x109c, 0x10a5, 0x10a5, 0x10a5, 0x10a5, + 0x10b1, 0x10c3, 0x10c3, 0x10cf, 0x10cf, 0x10cf, 0x10f4, 0x1109, + 0x1118, 0x1124, 0x1124, 0x1124, 0x113c, 0x113c, 0x113c, 0x1148, + 0x1148, 0x1154, 0x1154, 0x1169, 0x117b, 0x117b, 0x118a, 0x118a, + 0x119c, 0x11ab, 0x11ab, 0x11ba, 0x11cf, 0x11db, 0x11ed, 0x11ff, + 0x120e, 0x121a, 0x123c, 0x124e, 0x1269, 0x127b, 0x1290, 0x12b8, + // Entry 100 - 13F + 0x12cd, 0x12cd, 0x12f5, 0x130d, 0x131f, 0x1334, 0x1340, 0x1358, + 0x1367, 0x137c, 0x138e, 0x13a0, 0x13b2, 0x13da, 0x13da, 0x13e9, + 0x1411, 0x142a, 0x143c, 0x143c, 0x144b, 0x1457, 0x1457, 0x147f, + 0x1491, 0x14a6, 0x14dd, 0x14dd, 0x14f2, 0x14f2, 0x1501, 0x151c, + 0x151c, 0x1525, 0x1525, 0x155f, 0x1590, 0x1590, 0x15bb, 0x15e6, + 0x1607, 0x160d, 0x161f, 0x161f, 0x162b, 0x163d, 0x163d, 0x1649, + 0x1664, 0x1664, 0x1699, 0x16c5, 0x16c5, 0x16d4, 0x16f2, 0x1701, + 0x1713, 0x173b, 0x175a, 0x175a, 0x175a, 0x1766, 0x177e, 0x178a, + // Entry 140 - 17F + 0x178a, 0x1796, 0x1796, 0x17ae, 0x17c0, 0x17d2, 0x17f7, 0x17f7, + 0x1803, 0x180f, 0x180f, 0x181e, 0x182d, 0x182d, 0x182d, 0x1842, + 0x1854, 0x1869, 0x188e, 0x18b0, 0x18b0, 0x18cc, 0x18db, 0x18ea, + 0x18f6, 0x1905, 0x1911, 0x192c, 0x192c, 0x193b, 0x194d, 0x1977, + 0x1977, 0x1983, 0x1983, 0x198f, 0x19a4, 0x19c0, 0x19c0, 0x19c0, + 0x19c0, 0x19d5, 0x19f0, 0x1a12, 0x1a24, 0x1a36, 0x1a4e, 0x1a70, + 0x1a70, 0x1a70, 0x1a85, 0x1a94, 0x1aa9, 0x1ab5, 0x1ab5, 0x1ac4, + 0x1ad9, 0x1aeb, 0x1afa, 0x1b12, 0x1b24, 0x1b3f, 0x1b3f, 0x1b3f, + // Entry 180 - 1BF + 0x1b3f, 0x1b51, 0x1b51, 0x1b60, 0x1b6f, 0x1b8e, 0x1b8e, 0x1bb0, + 0x1bc5, 0x1bd7, 0x1be6, 0x1bf5, 0x1c07, 0x1c07, 0x1c07, 0x1c1c, + 0x1c1c, 0x1c2b, 0x1c3d, 0x1c4c, 0x1c67, 0x1c73, 0x1c73, 0x1c82, + 0x1c91, 0x1ca3, 0x1caf, 0x1cca, 0x1cef, 0x1d14, 0x1d20, 0x1d32, + 0x1d56, 0x1d65, 0x1d7a, 0x1d89, 0x1d9b, 0x1d9b, 0x1db0, 0x1dd2, + 0x1de1, 0x1df6, 0x1e0e, 0x1e0e, 0x1e0e, 0x1e23, 0x1e47, 0x1e47, + 0x1e5f, 0x1e6b, 0x1e8a, 0x1e9f, 0x1eae, 0x1ec0, 0x1ec0, 0x1ed5, + 0x1ed5, 0x1ee4, 0x1f06, 0x1f06, 0x1f15, 0x1f34, 0x1f40, 0x1f6e, + // Entry 1C0 - 1FF + 0x1f8c, 0x1fa4, 0x1fb6, 0x1fcb, 0x1fd7, 0x1fff, 0x201a, 0x2032, + 0x2050, 0x2074, 0x2086, 0x2086, 0x2086, 0x2086, 0x20a8, 0x20a8, + 0x20c3, 0x20c3, 0x20c3, 0x20de, 0x20de, 0x210f, 0x2118, 0x2118, + 0x2133, 0x2148, 0x2163, 0x2163, 0x2163, 0x2175, 0x2187, 0x2187, + 0x2187, 0x2187, 0x21a2, 0x21ab, 0x21c0, 0x21cf, 0x21fa, 0x2212, + 0x2221, 0x2233, 0x2233, 0x2233, 0x2242, 0x225a, 0x226f, 0x226f, + 0x229a, 0x229a, 0x22a6, 0x22a6, 0x22b8, 0x22e6, 0x2308, 0x2308, + 0x2323, 0x232c, 0x232c, 0x233e, 0x233e, 0x233e, 0x235d, 0x2379, + // Entry 200 - 23F + 0x2395, 0x23b7, 0x23cf, 0x23e7, 0x240f, 0x241e, 0x241e, 0x241e, + 0x2430, 0x243c, 0x2454, 0x2454, 0x247c, 0x24a7, 0x24b9, 0x24b9, + 0x24b9, 0x24cb, 0x24d7, 0x24e9, 0x24f8, 0x250d, 0x2516, 0x252b, + 0x252b, 0x2540, 0x2558, 0x2558, 0x256d, 0x2592, 0x25ab, 0x25ab, + 0x25ab, 0x25ab, 0x25c9, 0x25c9, 0x25de, 0x25f0, 0x2602, 0x261a, + 0x2649, 0x265e, 0x2679, 0x2694, 0x269d, 0x26a6, 0x26a6, 0x26a6, + 0x26a6, 0x26a6, 0x26b5, 0x26b5, 0x26c4, 0x26c4, 0x26d3, 0x26df, + 0x26eb, 0x2703, 0x2703, 0x2718, 0x2718, 0x2724, 0x272d, 0x273c, + // Entry 240 - 27F + 0x273c, 0x273c, 0x273c, 0x2757, 0x276f, 0x2796, 0x2796, 0x27b1, + 0x27ef, 0x27fe, 0x2837, 0x2849, 0x2875, 0x2875, 0x28a3, 0x28cf, + 0x290f, 0x293d, 0x296e, 0x299f, 0x29d7, 0x2a02, 0x2a30, 0x2a30, + 0x2a58, 0x2a7d, 0x2a9f, 0x2ab7, 0x2aee, 0x2b1f, 0x2b3a, 0x2b65, + 0x2b87, 0x2bac, +} // Size: 1244 bytes + +var hrLangStr string = "" + // Size: 4466 bytes + "afarskiabhaskiavestanafrikaansakanskiamharskiaragonskiarapskiasamskiavar" + + "skiaymaraazerbajdžanskibaškirskibjeloruskibugarskibislamabambarabengalsk" + + "itibetanskibretonskibosanskikatalonskičečenskichamorrokorzičkicreečeškic" + + "rkvenoslavenskichuvashvelškidanskinjemačkidivehidzongkhaewegrčkiengleski" + + "esperantošpanjolskiestonskibaskijskiperzijskifulahfinskifidžijskiferojsk" + + "ifrancuskizapadnofrizijskiirskiškotski-galskigalicijskiguaranigudžaratsk" + + "imanskihausahebrejskihindskihiri motuhrvatskikreolskimađarskiarmenskiher" + + "erointerlinguaindonezijskiinterliguaigbosichuan yiinupiaqidoislandskital" + + "ijanskiinuktitutjapanskijavanskigruzijskikongokikuyukuanyamakazaškikalaa" + + "llisutkmerskikannadskikorejskikanurikašmirskikurdskikomikornskikirgiškil" + + "atinskiluksemburškigandalimburgishlingalalaoskilitavskiluba-katangalatvi" + + "jskimalgaškimaršalskimaorskimakedonskimalajalamskimongolskimarathskimala" + + "jskimalteškiburmanskinaurusjeverni ndebelenepalskindonganizozemskinovono" + + "rveškiknjiževni norveškijužni ndebelenavajonyanjaokcitanskiojibwaoromski" + + "orijskiosetskipandžapskipalipoljskipaštuportugalskikečuaromanšrundirumun" + + "jskiruskikinyarwandasanskrtskisardskisindhijužni samisangosinhaleškislov" + + "ačkislovenskisamoanskishonasomalskialbanskisrpskisvatisesotskisundanskiš" + + "vedskisvahilitamilskitelugutadžičkitajlandskitigrinjaturkmenskicvanatong" + + "anskiturskitsongatatarskitahićanskiujgurskiukrajinskiurdskiuzbečkivendav" + + "ijetnamskivolapükvalonskiwolofxhosajidišjorubazhuangkineskizuluachinesea" + + "coliadangmeadigejskiafrihiliaghemainuakkadianaleutskijužni altaistaroeng" + + "leskiangikaaramejskiaraukanskiarapahoarawakasuasturijskiawadhibaluchibal" + + "inezijskibasabamunskighomalabejabembabenabafutzapadnobaludžijskibhojpuri" + + "bikolbinikomsiksikabrajbodoakooseburiatbuginskibulublinmedumbacaddokarip" + + "skicayugaatsamcebuanochigachibchachagataichuukesemarichinook žargonchoct" + + "awchipewyančerokičejenskisoranski kurdskikoptskikrimski turskikašupskida" + + "kota jezikdargwataitadelavarskislavedogribdinkazarmadogrilužičkosrpskidu" + + "alanizozemski, srednjijola-fonyidyuladazagaembuefikstaroegipatskiekajuke" + + "lamitskiengleski, srednjiewondofangfilipinofonfrancuski, srednjistarofra" + + "ncuskisjevernofrizijskiistočnofrizijskifriulskigagagauskigayogbayastaroe" + + "tiopskigilbertskinjemački, srednji visokistaronjemački, visokigondigoron" + + "talogothicgrebostarogrčkišvicarski njemačkigusiigwich’inhaidihavajskihil" + + "igaynonhetitskihmonggornjolužičkihupaibanibibioilokoingušetskilojbanngom" + + "bamachamejudejsko-perzijskijudejsko-arapskikara-kalpakkabilskikachinkaje" + + "kambakawikabardiankanembutyapmakondezelenortskikorokhasikhotanesekoyra c" + + "hiinikakokalenjinkimbundukomski ili permskikonkaninaurskikpellekarachay-" + + "balkarkarelijskikuruškishambalabafiakelnskikumykkutenailadinolangilahnda" + + "lambalezgiškilakotamongolozisjevernolurskiluba-lulualuisenolundaluolusha" + + "iluyiamadurskimafamagahimaithilimakasarmandingomasajskimabamokshamandarm" + + "endemerumauricijski kreolskiirski, srednjimakhuwa-meettometa’micmacminan" + + "gkabaumandžurskimanipurskimohawkmossimundangviše jezikacreekmirandskimar" + + "warimyenemordvinskimazanderanskinapolitanskinamadonjonjemačkinewariniasn" + + "iujskikwasiongiemboonnogajskistaronorveškin’kosjeverni sothonuerklasični" + + " newarinyamwezinyankolenyoronzimaosageturski - otomanskipangasinanpahlav" + + "ipampangapapiamentopalauanskistaroperzijskifeničkipohnpeianstaroprovansa" + + "lskikičerajasthanirapa nuirarotonškiromboromskiaromunskirwasandawejakuts" + + "kisamarijanski aramejskisamburusasaksantalingambaysangusicilijskiškotski" + + "južnokurdskisenecasenaselkupskikoyraboro sennistaroirskitachelhitshančad" + + "ski arapskisidamosjeverni samilule samiinari samiskolt samisoninkesogdie" + + "nsranan tongoserersahosukumasususumerskikomorskikongoanski swahiliklasič" + + "ni sirskisirijskitemnetesoterenotetumtigriškitivtokelaunskiklingonskitli" + + "ngittamasheknyasa tongatok pisintarokotsimshiantumbukatuvaluanskitasawaq" + + "tuvinianmarokanski tamazightudmurtskiugaritskiumbundukorijenskivaivoticv" + + "unjowalserwalamowaraywashowarlpirikalmyksogayaojapskiyangbenyembakantons" + + "kizapotecblissymbolszenagastandardni marokanski tamazightzunibez jezično" + + "g sadržajazazakimoderni standardni arapskijužnoazerbajdžanskiaustrijski " + + "njemačkigornjonjemački (švicarski)australski engleskikanadski engleskibr" + + "itanski engleskiamerički engleskilatinoamerički španjolskieuropski španj" + + "olskimeksički španjolskikanadski francuskišvicarski francuskidonjosakson" + + "skiflamanskibrazilski portugalskieuropski portugalskimoldavskisrpsko-hrv" + + "atskikineski (pojednostavljeni)kineski (tradicionalni)" + +var hrLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0007, 0x000e, 0x0015, 0x001e, 0x0025, 0x002d, 0x0036, + 0x003d, 0x0044, 0x004b, 0x0051, 0x0060, 0x006a, 0x0074, 0x007c, + 0x0083, 0x008a, 0x0093, 0x009d, 0x00a6, 0x00ae, 0x00b8, 0x00c2, + 0x00ca, 0x00d3, 0x00d7, 0x00de, 0x00ee, 0x00f5, 0x00fc, 0x0102, + 0x010b, 0x0111, 0x0119, 0x011c, 0x0122, 0x012a, 0x0133, 0x013e, + 0x0146, 0x014f, 0x0158, 0x015d, 0x0163, 0x016d, 0x0175, 0x017e, + 0x018e, 0x0193, 0x01a2, 0x01ac, 0x01b3, 0x01bf, 0x01c5, 0x01ca, + 0x01d3, 0x01da, 0x01e3, 0x01eb, 0x01f3, 0x01fc, 0x0204, 0x020a, + // Entry 40 - 7F + 0x0215, 0x0221, 0x022b, 0x022f, 0x0239, 0x0240, 0x0243, 0x024c, + 0x0256, 0x025f, 0x0267, 0x026f, 0x0278, 0x027d, 0x0283, 0x028b, + 0x0293, 0x029e, 0x02a5, 0x02ae, 0x02b6, 0x02bc, 0x02c6, 0x02cd, + 0x02d1, 0x02d8, 0x02e1, 0x02e9, 0x02f6, 0x02fb, 0x0305, 0x030c, + 0x0312, 0x031a, 0x0326, 0x032f, 0x0338, 0x0342, 0x0349, 0x0353, + 0x035f, 0x0368, 0x0371, 0x0379, 0x0382, 0x038b, 0x0390, 0x03a0, + 0x03a8, 0x03ae, 0x03b8, 0x03c5, 0x03d9, 0x03e7, 0x03ed, 0x03f3, + 0x03fd, 0x0403, 0x040a, 0x0411, 0x0418, 0x0423, 0x0427, 0x042e, + // Entry 80 - BF + 0x0434, 0x043f, 0x0445, 0x044c, 0x0451, 0x045a, 0x045f, 0x046a, + 0x0474, 0x047b, 0x0481, 0x048c, 0x0491, 0x049c, 0x04a5, 0x04ae, + 0x04b7, 0x04bc, 0x04c4, 0x04cc, 0x04d2, 0x04d7, 0x04df, 0x04e8, + 0x04f0, 0x04f7, 0x04ff, 0x0505, 0x050f, 0x0519, 0x0521, 0x052b, + 0x0530, 0x0539, 0x053f, 0x0545, 0x054d, 0x0558, 0x0560, 0x056a, + 0x0570, 0x0578, 0x057d, 0x0588, 0x0590, 0x0598, 0x059d, 0x05a2, + 0x05a8, 0x05ae, 0x05b4, 0x05bb, 0x05bf, 0x05c7, 0x05cc, 0x05d3, + 0x05dc, 0x05dc, 0x05e4, 0x05e9, 0x05ed, 0x05f5, 0x05f5, 0x05fd, + // Entry C0 - FF + 0x05fd, 0x0609, 0x0616, 0x061c, 0x0625, 0x062f, 0x062f, 0x0636, + 0x0636, 0x063c, 0x063c, 0x063c, 0x063f, 0x063f, 0x0649, 0x0649, + 0x064f, 0x0656, 0x0662, 0x0662, 0x0666, 0x066e, 0x066e, 0x0675, + 0x0679, 0x067e, 0x067e, 0x0682, 0x0687, 0x0687, 0x069a, 0x06a2, + 0x06a7, 0x06ab, 0x06ab, 0x06ae, 0x06b5, 0x06b5, 0x06b5, 0x06b9, + 0x06b9, 0x06bd, 0x06c3, 0x06c9, 0x06d1, 0x06d5, 0x06d9, 0x06e0, + 0x06e5, 0x06ed, 0x06f3, 0x06f8, 0x06ff, 0x0704, 0x070b, 0x0713, + 0x071b, 0x071f, 0x072e, 0x0735, 0x073e, 0x0745, 0x074e, 0x075e, + // Entry 100 - 13F + 0x0765, 0x0765, 0x0773, 0x077c, 0x0788, 0x078e, 0x0793, 0x079d, + 0x07a2, 0x07a8, 0x07ad, 0x07b2, 0x07b7, 0x07c6, 0x07c6, 0x07cb, + 0x07de, 0x07e8, 0x07ed, 0x07f3, 0x07f7, 0x07fb, 0x07fb, 0x0809, + 0x080f, 0x0818, 0x0829, 0x0829, 0x082f, 0x082f, 0x0833, 0x083b, + 0x083b, 0x083e, 0x083e, 0x0850, 0x085e, 0x085e, 0x086f, 0x0880, + 0x0888, 0x088a, 0x0892, 0x0892, 0x0896, 0x089b, 0x089b, 0x08a8, + 0x08b2, 0x08b2, 0x08cb, 0x08e1, 0x08e1, 0x08e6, 0x08ef, 0x08f5, + 0x08fa, 0x0905, 0x0919, 0x0919, 0x0919, 0x091e, 0x0928, 0x092d, + // Entry 140 - 17F + 0x092d, 0x0935, 0x0935, 0x093f, 0x0947, 0x094c, 0x095b, 0x095b, + 0x095f, 0x0963, 0x0969, 0x096e, 0x0979, 0x0979, 0x0979, 0x097f, + 0x0985, 0x098c, 0x099e, 0x09ae, 0x09ae, 0x09b9, 0x09c1, 0x09c7, + 0x09cb, 0x09d0, 0x09d4, 0x09dd, 0x09e4, 0x09e8, 0x09ef, 0x09fa, + 0x09fa, 0x09fe, 0x09fe, 0x0a03, 0x0a0c, 0x0a18, 0x0a18, 0x0a18, + 0x0a1c, 0x0a24, 0x0a2c, 0x0a3e, 0x0a45, 0x0a4c, 0x0a52, 0x0a61, + 0x0a61, 0x0a61, 0x0a6b, 0x0a73, 0x0a7b, 0x0a80, 0x0a87, 0x0a8c, + 0x0a93, 0x0a99, 0x0a9e, 0x0aa4, 0x0aa9, 0x0ab2, 0x0ab2, 0x0ab2, + // Entry 180 - 1BF + 0x0ab2, 0x0ab8, 0x0ab8, 0x0abd, 0x0ac1, 0x0acf, 0x0acf, 0x0ad9, + 0x0ae0, 0x0ae5, 0x0ae8, 0x0aee, 0x0af3, 0x0af3, 0x0af3, 0x0afb, + 0x0aff, 0x0b05, 0x0b0d, 0x0b14, 0x0b1c, 0x0b24, 0x0b28, 0x0b2e, + 0x0b34, 0x0b39, 0x0b3d, 0x0b51, 0x0b5f, 0x0b6d, 0x0b74, 0x0b7a, + 0x0b85, 0x0b90, 0x0b9a, 0x0ba0, 0x0ba5, 0x0ba5, 0x0bac, 0x0bb8, + 0x0bbd, 0x0bc6, 0x0bcd, 0x0bcd, 0x0bd2, 0x0bdc, 0x0be9, 0x0be9, + 0x0bf5, 0x0bf9, 0x0c07, 0x0c0d, 0x0c11, 0x0c18, 0x0c18, 0x0c1e, + 0x0c27, 0x0c2f, 0x0c3d, 0x0c3d, 0x0c43, 0x0c51, 0x0c55, 0x0c65, + // Entry 1C0 - 1FF + 0x0c6d, 0x0c75, 0x0c7a, 0x0c7f, 0x0c84, 0x0c96, 0x0ca0, 0x0ca7, + 0x0caf, 0x0cb9, 0x0cc3, 0x0cc3, 0x0cc3, 0x0cc3, 0x0cd1, 0x0cd1, + 0x0cd9, 0x0cd9, 0x0cd9, 0x0ce2, 0x0ce2, 0x0cf3, 0x0cf8, 0x0cf8, + 0x0d02, 0x0d0a, 0x0d15, 0x0d15, 0x0d15, 0x0d1a, 0x0d20, 0x0d20, + 0x0d20, 0x0d20, 0x0d29, 0x0d2c, 0x0d33, 0x0d3b, 0x0d51, 0x0d58, + 0x0d5d, 0x0d64, 0x0d64, 0x0d6b, 0x0d70, 0x0d7a, 0x0d82, 0x0d82, + 0x0d8f, 0x0d95, 0x0d99, 0x0d99, 0x0da2, 0x0db1, 0x0dbb, 0x0dbb, + 0x0dc4, 0x0dc8, 0x0dd7, 0x0ddd, 0x0ddd, 0x0ddd, 0x0dea, 0x0df3, + // Entry 200 - 23F + 0x0dfd, 0x0e07, 0x0e0e, 0x0e15, 0x0e21, 0x0e26, 0x0e2a, 0x0e2a, + 0x0e30, 0x0e34, 0x0e3c, 0x0e44, 0x0e56, 0x0e66, 0x0e6e, 0x0e6e, + 0x0e6e, 0x0e73, 0x0e77, 0x0e7d, 0x0e82, 0x0e8b, 0x0e8e, 0x0e99, + 0x0e99, 0x0ea3, 0x0eaa, 0x0eaa, 0x0eb2, 0x0ebd, 0x0ec6, 0x0ec6, + 0x0ecc, 0x0ecc, 0x0ed5, 0x0ed5, 0x0edc, 0x0ee7, 0x0eee, 0x0ef6, + 0x0f0a, 0x0f13, 0x0f1c, 0x0f23, 0x0f2d, 0x0f30, 0x0f30, 0x0f30, + 0x0f30, 0x0f30, 0x0f35, 0x0f35, 0x0f3a, 0x0f40, 0x0f46, 0x0f4b, + 0x0f50, 0x0f58, 0x0f58, 0x0f5e, 0x0f5e, 0x0f62, 0x0f65, 0x0f6b, + // Entry 240 - 27F + 0x0f72, 0x0f77, 0x0f77, 0x0f80, 0x0f87, 0x0f92, 0x0f92, 0x0f98, + 0x0fb7, 0x0fbb, 0x0fd2, 0x0fd8, 0x0ff2, 0x1007, 0x101b, 0x1037, + 0x104a, 0x105b, 0x106d, 0x107f, 0x109a, 0x10ae, 0x10c3, 0x10c3, + 0x10d5, 0x10e9, 0x10f7, 0x1100, 0x1115, 0x1129, 0x1132, 0x1141, + 0x115b, 0x1172, +} // Size: 1244 bytes + +var huLangStr string = "" + // Size: 3938 bytes + "afarabházavesztánafrikaansakanamharaaragonézarabasszámiavarajmaraazerbaj" + + "dzsánibaskírbeloruszbolgárbislamabambarabengálitibetibretonbosnyákkatalá" + + "ncsecsencsamorókorzikaikrícsehegyházi szlávcsuvaswalesidánnémetdivehibut" + + "ánievegörögangoleszperantóspanyolésztbaszkperzsafulanifinnfidzsiferöeri" + + "franciafrízírskót gaelgalíciaiguaranigudzsaratiman-szigetihauszahéberhin" + + "dihiri motuhorváthaitimagyarörményhererointerlingvaindonézinterlingueigb" + + "ószecsuán jiinupiakidóizlandiolaszinuktitutjapánjávaigrúzkongokikujukua" + + "nyamakazahgrönlandikambodzsaikannadakoreaikanurikásmírikurdkomikornikirg" + + "izlatinluxemburgigandalimburgilingalalaoszilitvánluba-katangalettmálgasm" + + "arshallimaorimacedónmalajálammongolmarathimalájmáltaiburmainauruiészaki " + + "ndebelenepálindongahollandnorvég nynorsknorvég bokmaldéli ndebelenavahón" + + "yanjaokszitánojibvaoromóiorijaoszétpandzsábipalilengyelpastuportugálkecs" + + "uaréto-románkirundirománoroszkiruandaszanszkritszardíniaiszindhiészaki s" + + "zámiszangószingalézszlovákszlovénszamoaisonaszomáliaialbánszerbsziszuati" + + "szeszotószundanézsvédszuahélitamiltelugutadzsikthaitigrinjatürkménszecsu" + + "ánitongatörökcongatatártahitiujgurukránurduüzbégvendavietnamivolapükval" + + "lonvolofhoszajiddisjorubazsuangkínaizuluachinézakoliadangmeadygheafrihil" + + "iagemainuakkádaleutdél-altajióangolangikaarámiaraucaniarapahoaravakasuas" + + "ztúrawádibalucsibalinézbaszabamungomalabedzsabembabenabafutnyugati belud" + + "zsbodzspuribikolbinikomsiksikabrajbodokosziburjátbuginézbulublinmedumbac" + + "addokaribkajugaatszamcebuikigacsibcsacsagatájcsukézmaricsinuk zsargoncso" + + "któcsipevécserokicsejenszoráni kurdkoptkrími tatárkasubdakotadargvataita" + + "delavárszlevidogribdinkazarmadogrialsó szorbdualaközép hollandjola-fonyi" + + "diuladazagaembuefikóegyiptomiekadzsukelamitközép angolevondofangfilippín" + + "ófonközép franciaófranciaészaki frízkeleti frízfriuligagagauzgajogbajag" + + "eezikiribatiközép felső németófelső németgondigorontalogótgrebóógörögsvá" + + "jci németgusziigvicsinhaidahawaiihiligajnonhittitehmongfelső szorbhupaib" + + "anibibióilokóinguslojbanngombamachamezsidó-perzsazsidó-arabkara-kalpakka" + + "bijekacsinjjukambakawikabardikanembutyapmakondekabuverdianukorokaszikota" + + "nézkojra-csínikakókalendzsinkimbundukomi-permjákkonkanikosreikpellekarac" + + "sáj-balkárkarelaikuruhsambalabafiakölschkumükkutenailadinolangilahndalam" + + "balezglakotamongóloziészaki luriluba-lulualuisenolundaluolushailujiamadu" + + "raimafamagahimaithilimakaszarmandingómasaimabamoksánmandarmendemerumauri" + + "tiusi kreolközép írmakua-metómeta’mikmakminangkabaumandzsumanipurimohawk" + + "moszimundangtöbbszörös nyelvekkríkmirandézmarvarimyeneerzjánymázanderáni" + + "nápolyinamaalsónémetnevariniasniuingumbangiemboonnogajóskandinávn’kóésza" + + "ki szotónuerklasszikus newarinyamvézinyankolenyorónzimaosageottomán törö" + + "kpangaszinanpahlavipampanganpapiamentópalauióperzsafőniciaipohnpeióprová" + + "nszikicseradzsasztánirapanuirarotongairomboromaarománrwoszandavejakutsza" + + "maritánus arámiszamburusasakszantálingambayszanguszicíliaiskótdél-kurdsz" + + "enekaszenaszölkupkojra-szennióírtachelhitsancsádi arabszidamódéli számil" + + "ule számiinar samikoltta lappszoninkesogdienszranai tongószererszahószuk" + + "umaszuszusumércomoreikongói szuahéliklasszikus szírszíriaitemneteszótere" + + "nótetumtigrétivtokelauiklingontlingittamaseknyasa tongatok pisintarokócs" + + "imsiánitumbukatuvaluszaváktuvaiközép-marokkói tamazigtudmurtugaritiumbun" + + "duősivaivotjákvunjowalservalamovaraóvasówarlpirikalmükszogajaójapijangbe" + + "njembakantonizapotékBliss jelképrendszerzenagamarokkói tamazightzunininc" + + "s nyelvészeti tartalomzazamodern szabányos arabosztrák németsvájci felné" + + "metausztrál angolkanadai angolbrit angolamerikai angollatin-amerikai spa" + + "nyoleurópai spanyolspanyol (mexikói)kanadai franciasvájci franciaalsószá" + + "szflamandbrazíliai portugáleurópai portugálmoldvaiszerbhorvátegyszerűsít" + + "ett kínaihagyományos kínai" + +var huLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000a, 0x0013, 0x001c, 0x0020, 0x0026, 0x002f, + 0x0033, 0x003b, 0x003f, 0x0045, 0x0053, 0x005a, 0x0062, 0x0069, + 0x0070, 0x0077, 0x007f, 0x0085, 0x008b, 0x0093, 0x009b, 0x00a2, + 0x00aa, 0x00b2, 0x00b6, 0x00ba, 0x00c9, 0x00cf, 0x00d5, 0x00d9, + 0x00df, 0x00e5, 0x00ec, 0x00ef, 0x00f6, 0x00fb, 0x0106, 0x010d, + 0x0112, 0x0117, 0x011d, 0x0123, 0x0127, 0x012d, 0x0135, 0x013c, + 0x0141, 0x0144, 0x014e, 0x0157, 0x015e, 0x0168, 0x0173, 0x0179, + 0x017f, 0x0184, 0x018d, 0x0194, 0x0199, 0x019f, 0x01a7, 0x01ad, + // Entry 40 - 7F + 0x01b8, 0x01c0, 0x01cb, 0x01d0, 0x01dc, 0x01e3, 0x01e7, 0x01ee, + 0x01f3, 0x01fc, 0x0202, 0x0208, 0x020d, 0x0212, 0x0218, 0x0220, + 0x0225, 0x022f, 0x0239, 0x0240, 0x0246, 0x024c, 0x0255, 0x0259, + 0x025d, 0x0262, 0x0268, 0x026d, 0x0277, 0x027c, 0x0284, 0x028b, + 0x0291, 0x0298, 0x02a4, 0x02a8, 0x02af, 0x02b8, 0x02bd, 0x02c5, + 0x02cf, 0x02d5, 0x02dc, 0x02e2, 0x02e9, 0x02ef, 0x02f5, 0x0304, + 0x030b, 0x0311, 0x0318, 0x0327, 0x0335, 0x0342, 0x0349, 0x034f, + 0x0358, 0x035e, 0x0365, 0x036a, 0x0370, 0x037a, 0x037e, 0x0385, + // Entry 80 - BF + 0x038a, 0x0393, 0x0399, 0x03a5, 0x03ac, 0x03b2, 0x03b7, 0x03bf, + 0x03c9, 0x03d4, 0x03db, 0x03e9, 0x03f0, 0x03fa, 0x0402, 0x040a, + 0x0411, 0x0415, 0x041f, 0x0425, 0x042a, 0x0433, 0x043c, 0x0446, + 0x044b, 0x0454, 0x0459, 0x045f, 0x0466, 0x046a, 0x0472, 0x047b, + 0x0485, 0x048a, 0x0491, 0x0496, 0x049c, 0x04a2, 0x04a7, 0x04ad, + 0x04b1, 0x04b8, 0x04bd, 0x04c5, 0x04cd, 0x04d3, 0x04d8, 0x04dd, + 0x04e3, 0x04e9, 0x04ef, 0x04f5, 0x04f9, 0x0501, 0x0506, 0x050d, + 0x0513, 0x0513, 0x051b, 0x051f, 0x0523, 0x0529, 0x0529, 0x052e, + // Entry C0 - FF + 0x052e, 0x0539, 0x0540, 0x0546, 0x054c, 0x0554, 0x0554, 0x055b, + 0x055b, 0x0561, 0x0561, 0x0561, 0x0564, 0x0564, 0x056b, 0x056b, + 0x0571, 0x0578, 0x0580, 0x0580, 0x0585, 0x058a, 0x058a, 0x0590, + 0x0596, 0x059b, 0x059b, 0x059f, 0x05a4, 0x05a4, 0x05b3, 0x05bc, + 0x05c1, 0x05c5, 0x05c5, 0x05c8, 0x05cf, 0x05cf, 0x05cf, 0x05d3, + 0x05d3, 0x05d7, 0x05dc, 0x05e3, 0x05eb, 0x05ef, 0x05f3, 0x05fa, + 0x05ff, 0x0604, 0x060a, 0x0610, 0x0615, 0x0619, 0x0620, 0x0629, + 0x0630, 0x0634, 0x0642, 0x0649, 0x0651, 0x0658, 0x065e, 0x066b, + // Entry 100 - 13F + 0x066f, 0x066f, 0x067c, 0x0681, 0x0687, 0x068d, 0x0692, 0x069a, + 0x06a0, 0x06a6, 0x06ab, 0x06b0, 0x06b5, 0x06c0, 0x06c0, 0x06c5, + 0x06d4, 0x06de, 0x06e3, 0x06e9, 0x06ed, 0x06f1, 0x06f1, 0x06fc, + 0x0704, 0x070a, 0x0717, 0x0717, 0x071d, 0x071d, 0x0721, 0x072c, + 0x072c, 0x072f, 0x072f, 0x073e, 0x0747, 0x0747, 0x0754, 0x0760, + 0x0766, 0x0768, 0x076e, 0x076e, 0x0772, 0x0777, 0x0777, 0x077b, + 0x0784, 0x0784, 0x0799, 0x07a8, 0x07a8, 0x07ad, 0x07b6, 0x07ba, + 0x07c0, 0x07c9, 0x07d7, 0x07d7, 0x07d7, 0x07dd, 0x07e4, 0x07e9, + // Entry 140 - 17F + 0x07e9, 0x07ef, 0x07ef, 0x07f9, 0x0800, 0x0805, 0x0811, 0x0811, + 0x0815, 0x0819, 0x0820, 0x0826, 0x082b, 0x082b, 0x082b, 0x0831, + 0x0837, 0x083e, 0x084b, 0x0856, 0x0856, 0x0861, 0x0867, 0x086d, + 0x0870, 0x0875, 0x0879, 0x0880, 0x0887, 0x088b, 0x0892, 0x089e, + 0x089e, 0x08a2, 0x08a2, 0x08a7, 0x08af, 0x08bb, 0x08bb, 0x08bb, + 0x08c0, 0x08ca, 0x08d2, 0x08df, 0x08e6, 0x08ec, 0x08f2, 0x0903, + 0x0903, 0x0903, 0x090a, 0x090f, 0x0916, 0x091b, 0x0922, 0x0928, + 0x092f, 0x0935, 0x093a, 0x0940, 0x0945, 0x0949, 0x0949, 0x0949, + // Entry 180 - 1BF + 0x0949, 0x094f, 0x094f, 0x0955, 0x0959, 0x0965, 0x0965, 0x096f, + 0x0976, 0x097b, 0x097e, 0x0984, 0x0989, 0x0989, 0x0989, 0x0990, + 0x0994, 0x099a, 0x09a2, 0x09aa, 0x09b3, 0x09b8, 0x09bc, 0x09c3, + 0x09c9, 0x09ce, 0x09d2, 0x09e2, 0x09ed, 0x09f8, 0x09ff, 0x0a05, + 0x0a10, 0x0a17, 0x0a1f, 0x0a25, 0x0a2a, 0x0a2a, 0x0a31, 0x0a46, + 0x0a4b, 0x0a54, 0x0a5b, 0x0a5b, 0x0a60, 0x0a68, 0x0a75, 0x0a75, + 0x0a7d, 0x0a81, 0x0a8c, 0x0a92, 0x0a96, 0x0a9a, 0x0a9a, 0x0aa0, + 0x0aa9, 0x0aae, 0x0aba, 0x0aba, 0x0ac1, 0x0acf, 0x0ad3, 0x0ae4, + // Entry 1C0 - 1FF + 0x0aed, 0x0af5, 0x0afb, 0x0b00, 0x0b05, 0x0b15, 0x0b20, 0x0b27, + 0x0b30, 0x0b3b, 0x0b41, 0x0b41, 0x0b41, 0x0b41, 0x0b49, 0x0b49, + 0x0b52, 0x0b52, 0x0b52, 0x0b59, 0x0b59, 0x0b65, 0x0b6a, 0x0b6a, + 0x0b77, 0x0b7e, 0x0b88, 0x0b88, 0x0b88, 0x0b8d, 0x0b91, 0x0b91, + 0x0b91, 0x0b91, 0x0b98, 0x0b9b, 0x0ba3, 0x0ba8, 0x0bbc, 0x0bc4, + 0x0bc9, 0x0bd2, 0x0bd2, 0x0bd9, 0x0bdf, 0x0be9, 0x0bee, 0x0bee, + 0x0bf7, 0x0bfe, 0x0c03, 0x0c03, 0x0c0b, 0x0c17, 0x0c1c, 0x0c1c, + 0x0c25, 0x0c28, 0x0c33, 0x0c3b, 0x0c3b, 0x0c3b, 0x0c47, 0x0c52, + // Entry 200 - 23F + 0x0c5b, 0x0c66, 0x0c6e, 0x0c75, 0x0c83, 0x0c89, 0x0c8f, 0x0c8f, + 0x0c96, 0x0c9c, 0x0ca2, 0x0ca9, 0x0cba, 0x0cca, 0x0cd2, 0x0cd2, + 0x0cd2, 0x0cd7, 0x0cdd, 0x0ce4, 0x0ce9, 0x0cef, 0x0cf2, 0x0cfa, + 0x0cfa, 0x0d01, 0x0d08, 0x0d08, 0x0d0f, 0x0d1a, 0x0d23, 0x0d23, + 0x0d2a, 0x0d2a, 0x0d34, 0x0d34, 0x0d3b, 0x0d41, 0x0d48, 0x0d4d, + 0x0d67, 0x0d6d, 0x0d74, 0x0d7b, 0x0d7f, 0x0d82, 0x0d82, 0x0d82, + 0x0d82, 0x0d82, 0x0d89, 0x0d89, 0x0d8e, 0x0d94, 0x0d9a, 0x0da0, + 0x0da5, 0x0dad, 0x0dad, 0x0db4, 0x0db4, 0x0db9, 0x0dbd, 0x0dc1, + // Entry 240 - 27F + 0x0dc8, 0x0dcd, 0x0dcd, 0x0dd4, 0x0ddc, 0x0df1, 0x0df1, 0x0df7, + 0x0e0a, 0x0e0e, 0x0e29, 0x0e2d, 0x0e43, 0x0e43, 0x0e52, 0x0e63, + 0x0e72, 0x0e7f, 0x0e89, 0x0e97, 0x0ead, 0x0ebd, 0x0ecf, 0x0ecf, + 0x0ede, 0x0eed, 0x0ef8, 0x0eff, 0x0f13, 0x0f25, 0x0f2c, 0x0f38, + 0x0f4f, 0x0f62, +} // Size: 1244 bytes + +var hyLangStr string = "" + // Size: 6740 bytes + "աֆարերենաբխազերենաֆրիկաանսաքաներենամհարերենարաբերենասամերենադրբեջաներենբ" + + "աշկիրերենբելառուսերենբուլղարերենբամբարաբենգալերենտիբեթերենբրետոներենբոս" + + "նիերենկատալաներենչեչեներենկորսիկերենչեխերենչուվաշերենուելսերենդանիերենգ" + + "երմաներենջոնգքհաէվեհունարենանգլերենէսպերանտոիսպաներենէստոներենբասկերենպ" + + "արսկերենֆիններենֆիջիերենֆարյորերենֆրանսերենարևմտյան ֆրիզերենիռլանդերենգ" + + "ալիսերենգուարանիգուջարաթիմեներենհաուսաեբրայերենհինդիխորվաթերենհաիթերենհ" + + "ունգարերենհայերենինդոնեզերենիգբոսիխուան յիիսլանդերենիտալերենինուկտիտուտ" + + "ճապոներենճավայերենվրացերենկիկույուղազախերենկալաալիսուտքմերերենկաննադակո" + + "րեերենքաշմիրերենքրդերենկոռներենղրղզերենլատիներենլյուքսեմբուրգերենգանդալ" + + "ինգալալաոսերենլիտվերենլուբա-կատանգալատվիերենմալագասերենմաորիմակեդոներեն" + + "մալայալամմոնղոլերենմարաթիմալայերենմալթերենբիրմայերենհյուսիսային նդեբելե" + + "նեպալերենհոլանդերեննորվեգերեն նյունորսկնորվեգերեն բուկմոլակվիտաներենօջի" + + "բվաօրոմոօրիյաօսերենփենջաբերենպալիլեհերենփուշթուպորտուգալերենքեչուառոման" + + "շերենռունդիռումիներենռուսերենքինյարվանդասանսկրիտսինդհիհյուսիսային սամիս" + + "անգոսինհալերենսլովակերենսլովեներենշոնասոմալիերենալբաներենսերբերենհյուսի" + + "սային սոտոսունդաներենշվեդերենսուահիլիթամիլերենթելուգուտաջիկերենթայերենթ" + + "իգրինիաթուրքմեներենցվանատոնգերենթուրքերենցոնգաթաթարերենթաիտերենույղուրե" + + "րենուկրաիներենուրդուուզբեկերենվենդավիետնամերենվոլապյուկվալոներենվոլոֆքս" + + "ոզաիդիշյորուբաժուանգչինարենզուլուսերենաչեհերենակոլերենադանգմերենադիղերե" + + "նթունիսական արաբերենաղեմայներենաքքադերենհին անգլերենարամեերենմապուչիալժ" + + "իրական արաբերենեգիպտական արաբերենասուամերիկյան ժեստերի լեզուաստուրերենբ" + + "եմբաբենաարևմտյան բելոչիբոդոաքուզերենկաբուաներենչիգաշերոկիսորանի (քրդերե" + + "ն)ղպտերենղրիմյան թուրքերենթաիթազարմաստորին սորբիերենդուալաջոլա-ֆոնյիէմբ" + + "ուէֆիկերենհին եգիպտերենֆիլիպիներենտորնադելեն ֆիններենֆոներենհին ֆրանսեր" + + "ենարևելյան ֆրիզերենֆրիուլիերենգաերենգագաուզերենզրադաշտական դարիհին բարձ" + + "ր գերմաներենգոթերենհին հունարենշվեյցարական գերմաներենվայուգուսիհավայիեր" + + "ենվերին սորբիերենսյան չինարեննգոմբամաշամեկաբիլերենկամբատիապմակոնդեկուբա" + + "վերդիանուկոյրա չինիկալենջինկոմի-պերմյակկոնկանիշամբալաբաֆիալանգիլակոտահյ" + + "ուսիսային լուրիերենլուոլույամասաիմերումորիսյենմաքուա-մետտոմետամոհավքարև" + + "մտյան մարիերենմունդանգմազանդարաներեննամակվասիոհին նորվեգերեննկոնուերնյա" + + "նկոլեօսեյջիօսմաներենպանգասինաներենպահլավերենպանպանգաերենպապիամենտոպալաո" + + "ւերենպիկարդերենփենսիլվանական գերմաներենպլատագերմաներենհին պարսկերենպալա" + + "նտինների գերմաներենփյունիկերենպիեմոնտերենպոնտիկերենպոնպեերենպրուսերենհի" + + "ն պրովենսիալկիչեռաջաստաներենռապանուիռարոտոնգանռոմանիոլերենռիֆերենռոմբոռ" + + "ոմաներենռոտումանռուսիներենռովիանաարոմաներենռվասամբուրուսանգուհարավային " + + "քրդերենսենակոյրաբորո սեննիհին իռլանդերենտաշելհիթհարավային սամիլուլե սամ" + + "իինարի սամիսկոլտ սամիկոնգոյի սուահիլիտուլուտիմնետեսոտերենոթեթումտիգրետի" + + "վերենտոկելաուցախուրտլինգիտթալիշերենտամաշեկտոկ փիսինտուրոյոտարոկոցակոներ" + + "ենցիմշյանտումբուկաթուվալուերենտասավաքտուվերենկենտրոնատլասյան թամազիխտու" + + "դմուրտերենուգարիտերենումբունդուռուտերենվաիվենետիկերենվեպսկերենարևմտյան " + + "ֆլամադերենվոդերենվորովունջովալսերենվոլայտավարայերենվաշովարլպիրիվու չինա" + + "րենսոգայաոյապսկերենյանգբենյեմբաերենսապոտեկերենզեյլանդերենզենագաստանդարտ" + + " մարոկական թամազիղտզունիերենառանց լեզվային բովանդակությանզազաերենժամանակ" + + "ակից ստանդարտ արաբերենավստրիական գերմաներենշվեյցարական բարձր գերմաներեն" + + "ավստրալիական անգլերենկանադական անգլերենբրիտանական անգլերենամերիկյան անգ" + + "լերենլատինաամերիկյան իսպաներենեվրոպական իսպաներենմեքսիկական իսպաներենկա" + + "նադական ֆրանսերենշվեյցարական ֆրանսերենֆլամանդերենբրազիլական պորտուգալեր" + + "ենեվրոպական պորտուգալերենմոլդովերենպարզեցված չինարենավանդական չինարեն" + +var hyLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0010, 0x0022, 0x0022, 0x0034, 0x0044, 0x0056, 0x0056, + 0x0066, 0x0076, 0x0076, 0x0076, 0x008e, 0x00a2, 0x00ba, 0x00d0, + 0x00d0, 0x00de, 0x00f2, 0x0104, 0x0118, 0x012a, 0x0140, 0x0152, + 0x0152, 0x0166, 0x0166, 0x0174, 0x0174, 0x0188, 0x019a, 0x01aa, + 0x01be, 0x01be, 0x01cc, 0x01d2, 0x01e2, 0x01f2, 0x0204, 0x0216, + 0x0228, 0x0238, 0x024a, 0x024a, 0x025a, 0x026a, 0x027e, 0x0290, + 0x02b1, 0x02c5, 0x02c5, 0x02d7, 0x02e7, 0x02f9, 0x0307, 0x0313, + 0x0325, 0x032f, 0x032f, 0x0343, 0x0353, 0x0369, 0x0377, 0x0377, + // Entry 40 - 7F + 0x0377, 0x038d, 0x038d, 0x0395, 0x03a8, 0x03a8, 0x03a8, 0x03bc, + 0x03cc, 0x03e2, 0x03f4, 0x0406, 0x0416, 0x0416, 0x0426, 0x0426, + 0x0438, 0x044e, 0x045e, 0x046c, 0x047c, 0x047c, 0x0490, 0x049e, + 0x049e, 0x04ae, 0x04be, 0x04d0, 0x04f2, 0x04fc, 0x04fc, 0x050a, + 0x051a, 0x052a, 0x0543, 0x0555, 0x056b, 0x056b, 0x0575, 0x058b, + 0x059d, 0x05b1, 0x05bd, 0x05cf, 0x05df, 0x05f3, 0x05f3, 0x0618, + 0x062a, 0x062a, 0x063e, 0x0665, 0x0688, 0x0688, 0x0688, 0x0688, + 0x069e, 0x06aa, 0x06b4, 0x06be, 0x06ca, 0x06de, 0x06e6, 0x06f4, + // Entry 80 - BF + 0x0702, 0x071c, 0x0728, 0x073c, 0x0748, 0x075c, 0x076c, 0x0782, + 0x0792, 0x0792, 0x079e, 0x07bd, 0x07c7, 0x07db, 0x07ef, 0x0803, + 0x0803, 0x080b, 0x081f, 0x0831, 0x0841, 0x0841, 0x0860, 0x0876, + 0x0886, 0x0896, 0x08a8, 0x08b8, 0x08ca, 0x08d8, 0x08e8, 0x0900, + 0x090a, 0x091a, 0x092c, 0x0936, 0x0948, 0x0958, 0x096e, 0x0984, + 0x0990, 0x09a4, 0x09ae, 0x09c4, 0x09d6, 0x09e8, 0x09f2, 0x09fc, + 0x0a04, 0x0a12, 0x0a1e, 0x0a2c, 0x0a42, 0x0a52, 0x0a62, 0x0a76, + 0x0a86, 0x0aab, 0x0aab, 0x0ab3, 0x0ac1, 0x0ad3, 0x0ad3, 0x0ad3, + // Entry C0 - FF + 0x0ad3, 0x0ad3, 0x0aea, 0x0aea, 0x0afc, 0x0b0a, 0x0b0a, 0x0b0a, + 0x0b2d, 0x0b2d, 0x0b2d, 0x0b50, 0x0b58, 0x0b84, 0x0b98, 0x0b98, + 0x0b98, 0x0b98, 0x0b98, 0x0b98, 0x0b98, 0x0b98, 0x0b98, 0x0b98, + 0x0b98, 0x0ba2, 0x0ba2, 0x0baa, 0x0baa, 0x0baa, 0x0bc7, 0x0bc7, + 0x0bc7, 0x0bc7, 0x0bc7, 0x0bc7, 0x0bc7, 0x0bc7, 0x0bc7, 0x0bc7, + 0x0bc7, 0x0bcf, 0x0be1, 0x0be1, 0x0be1, 0x0be1, 0x0be1, 0x0be1, + 0x0be1, 0x0be1, 0x0be1, 0x0be1, 0x0bf7, 0x0bff, 0x0bff, 0x0bff, + 0x0bff, 0x0bff, 0x0bff, 0x0bff, 0x0bff, 0x0c0b, 0x0c0b, 0x0c28, + // Entry 100 - 13F + 0x0c36, 0x0c36, 0x0c57, 0x0c57, 0x0c57, 0x0c57, 0x0c61, 0x0c61, + 0x0c61, 0x0c61, 0x0c61, 0x0c6b, 0x0c6b, 0x0c8a, 0x0c8a, 0x0c96, + 0x0c96, 0x0ca9, 0x0ca9, 0x0ca9, 0x0cb3, 0x0cc3, 0x0cc3, 0x0cdc, + 0x0cdc, 0x0cdc, 0x0cdc, 0x0cdc, 0x0cdc, 0x0cdc, 0x0cdc, 0x0cf2, + 0x0d17, 0x0d25, 0x0d25, 0x0d25, 0x0d3e, 0x0d3e, 0x0d3e, 0x0d5f, + 0x0d75, 0x0d81, 0x0d97, 0x0d97, 0x0d97, 0x0d97, 0x0db6, 0x0db6, + 0x0db6, 0x0db6, 0x0db6, 0x0ddc, 0x0ddc, 0x0ddc, 0x0ddc, 0x0dea, + 0x0dea, 0x0e01, 0x0e2c, 0x0e36, 0x0e36, 0x0e40, 0x0e40, 0x0e40, + // Entry 140 - 17F + 0x0e40, 0x0e54, 0x0e54, 0x0e54, 0x0e54, 0x0e54, 0x0e71, 0x0e88, + 0x0e88, 0x0e88, 0x0e88, 0x0e88, 0x0e88, 0x0e88, 0x0e88, 0x0e88, + 0x0e94, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0ea0, 0x0eb2, 0x0eb2, + 0x0eb2, 0x0ebc, 0x0ebc, 0x0ebc, 0x0ebc, 0x0ec4, 0x0ed2, 0x0eee, + 0x0eee, 0x0eee, 0x0eee, 0x0eee, 0x0eee, 0x0f01, 0x0f01, 0x0f01, + 0x0f01, 0x0f11, 0x0f11, 0x0f28, 0x0f36, 0x0f36, 0x0f36, 0x0f36, + 0x0f36, 0x0f36, 0x0f36, 0x0f36, 0x0f44, 0x0f4e, 0x0f4e, 0x0f4e, + 0x0f4e, 0x0f4e, 0x0f58, 0x0f58, 0x0f58, 0x0f58, 0x0f58, 0x0f58, + // Entry 180 - 1BF + 0x0f58, 0x0f64, 0x0f64, 0x0f64, 0x0f64, 0x0f8d, 0x0f8d, 0x0f8d, + 0x0f8d, 0x0f8d, 0x0f95, 0x0f95, 0x0f9f, 0x0f9f, 0x0f9f, 0x0f9f, + 0x0f9f, 0x0f9f, 0x0f9f, 0x0f9f, 0x0f9f, 0x0fa9, 0x0fa9, 0x0fa9, + 0x0fa9, 0x0fa9, 0x0fb3, 0x0fc3, 0x0fc3, 0x0fda, 0x0fe2, 0x0fe2, + 0x0fe2, 0x0fe2, 0x0fe2, 0x0fee, 0x0fee, 0x100f, 0x101f, 0x101f, + 0x101f, 0x101f, 0x101f, 0x101f, 0x101f, 0x101f, 0x103b, 0x103b, + 0x103b, 0x1043, 0x1043, 0x1043, 0x1043, 0x1043, 0x1043, 0x104f, + 0x104f, 0x104f, 0x106a, 0x106a, 0x1070, 0x1070, 0x107a, 0x107a, + // Entry 1C0 - 1FF + 0x107a, 0x108a, 0x108a, 0x108a, 0x1096, 0x10a8, 0x10c4, 0x10d8, + 0x10f0, 0x1104, 0x1118, 0x112c, 0x115b, 0x1179, 0x1192, 0x11bf, + 0x11d5, 0x11eb, 0x11ff, 0x1211, 0x1223, 0x123e, 0x1246, 0x1246, + 0x125e, 0x126e, 0x1282, 0x129a, 0x12a8, 0x12b2, 0x12c4, 0x12d4, + 0x12e8, 0x12f6, 0x130a, 0x1310, 0x1310, 0x1310, 0x1310, 0x1322, + 0x1322, 0x1322, 0x1322, 0x1322, 0x132e, 0x132e, 0x132e, 0x132e, + 0x134f, 0x134f, 0x1357, 0x1357, 0x1357, 0x1374, 0x138f, 0x138f, + 0x139f, 0x139f, 0x139f, 0x139f, 0x139f, 0x139f, 0x13ba, 0x13cd, + // Entry 200 - 23F + 0x13e0, 0x13f3, 0x13f3, 0x13f3, 0x13f3, 0x13f3, 0x13f3, 0x13f3, + 0x13f3, 0x13f3, 0x13f3, 0x13f3, 0x1412, 0x1412, 0x1412, 0x1412, + 0x141e, 0x1428, 0x1430, 0x143c, 0x1448, 0x1452, 0x1460, 0x1470, + 0x147c, 0x147c, 0x148a, 0x149c, 0x14aa, 0x14aa, 0x14bb, 0x14c9, + 0x14d5, 0x14e7, 0x14f5, 0x14f5, 0x1507, 0x151f, 0x152d, 0x153d, + 0x156c, 0x1584, 0x159a, 0x15ae, 0x15be, 0x15c4, 0x15da, 0x15ec, + 0x1611, 0x1611, 0x161f, 0x1627, 0x1633, 0x1643, 0x1651, 0x1663, + 0x166b, 0x167b, 0x1690, 0x1690, 0x1690, 0x1698, 0x169e, 0x16b0, + // Entry 240 - 27F + 0x16be, 0x16d0, 0x16d0, 0x16d0, 0x16e6, 0x16e6, 0x16fc, 0x1708, + 0x173c, 0x174e, 0x1786, 0x1796, 0x17ce, 0x17ce, 0x17f7, 0x182d, + 0x1856, 0x1879, 0x189e, 0x18c1, 0x18f2, 0x1917, 0x193e, 0x193e, + 0x1963, 0x198c, 0x198c, 0x19a2, 0x19d1, 0x19fe, 0x1a12, 0x1a12, + 0x1a33, 0x1a54, +} // Size: 1244 bytes + +var idLangStr string = "" + // Size: 3949 bytes + "AfarAbkhazAvestaAfrikaansAkanAmharikAragonArabAssamAvarAymaraAzerbaijanB" + + "ashkirBelarusiaBulgariaBislamaBambaraBengaliTibetBretonBosniaKatalanChec" + + "henChamorroKorsikaKreeCheskaBahasa Gereja SlavoniaChuvashWelshDanskJerma" + + "nDivehiDzongkhaEweYunaniInggrisEsperantoSpanyolEstiBaskPersiaFulaSuomiFi" + + "jiFaroPrancisFrisia BaratIrlandiaGaelik SkotlandiaGalisiaGuaraniGujarati" + + "ManxHausaIbraniHindiHiri MotuKroasiaHaitiHungariaArmeniaHereroInterlingu" + + "aIndonesiaInterlingueIgboSichuan YiInupiakIdoIslandiaItaliaInuktitutJepa" + + "ngJawaGeorgiaKongoKikuyuKuanyamaKazakhKalaallisutKhmerKannadaKoreaKanuri" + + "KashmirKurdiKomiKornishKirgizLatinLuksemburgGandaLimburgiaLingalaLaoLitu" + + "aviLuba-KatangaLatviMalagasiMarshallMaoriMakedoniaMalayalamMongoliaMarat" + + "hiMelayuMaltaMyanmarNauruNdebele UtaraNepaliNdongaBelandaNynorsk Norwegi" + + "aBokmål NorwegiaNdebele SelatanNavajoNyanjaOsitaniaOjibwaOromoOriyaOsset" + + "iaPunjabiPaliPolskiPashtoPortugisQuechuaReto-RomanRundiRumaniaRusiaKinya" + + "rwandaSanskertaSardiniaSindhiSami UtaraSangoSinhalaSlovakSlovenSamoaShon" + + "aSomaliAlbaniaSerbSwatiSotho SelatanSundaSwediaSwahiliTamilTeluguTajikTh" + + "aiTigrinyaTurkmenTswanaTongaTurkiTsongaTatarTahitiUyghurUkrainaUrduUzbek" + + "VendaVietnamVolapukWalloonWolofXhosaYiddishYorubaZhuangChinaZuluAcehAcol" + + "iAdangmeAdygeiArab TunisiaAfrihiliAghemAinuAkkadiaAlabamaAleutAltai Sela" + + "tanInggris KunoAngikaAramAraukanArapahoArab AlgeriaArawakArab MarokoArab" + + " MesirAsuBahasa Isyarat AmerikaAsturAwadhiBaluchiBaliBavariaBasaBamunBat" + + "ak TobaGhomalaBejaBembaBetawiBenaBafutBalochi BaratBhojpuriBikolBiniBanj" + + "arKomSiksikaBrajBodoAkooseBuriatBugisBuluBlinMedumbaKadoKaribCayugaAtsam" + + "SebuanoKigaChibchaChagataiChuukeMariJargon ChinookKoktawChipewyanCheroke" + + "eCheyenneKurdi SoraniKoptikTatar KrimeaKashubiaDakotaDargwaTaitaDelaware" + + "SlaveDogribDinkaZarmaDogriSorbia RendahDualaBelanda TengahJola-FonyiDyul" + + "aDazagaEmbuEfikMesir KunoEkajukElamInggris Abad PertengahanEwondoFangFil" + + "ipinoFonPrancis Abad PertengahanPrancis KunoArpitanFrisia UtaraFrisia Ti" + + "murFriuliGaGagauzGayoGbayaGeezGilbertGilakiJerman Abad PertengahanJerman" + + " KunoGondiGorontaloGothikGreboYunani KunoJerman (Swiss)GusiiGwich’inHaid" + + "aHawaiiHindi FijiHiligaynonHititHmongSorbia AtasHupaIbanIbibioIlokoIngus" + + "hetiaLojbanNgombaMachameIbrani-PersiaIbrani-ArabKara-KalpakKabyleKachinJ" + + "juKambaKawiKabardiKanembuTyapMakondeKabuverdianuKenyangKoroKhasiKhotanKo" + + "yra ChiiniKakoKalenjinKimbunduKomi-PermyakKonkaniKosreKpelleKarachai Bal" + + "karKrioKareliaKurukShambalaBafiaDialek KolschKumykKutenaiLadinoLangiLahn" + + "daLambaLezghiaLiguriaLakotaMongoLoziLuri UtaraLuba-LuluaLuisenoLundaLuoM" + + "izoLuyiaLazMaduraMafaMagahiMaithiliMakasarMandingoMasaiMabaMokshaMandarM" + + "endeMeruMorisienIrlandia Abad PertengahanMakhuwa-Meettometa’MikmakMinang" + + "kabauManchuriaManipuriMohawkMossiMundangBeberapa BahasaBahasa MuskogeeMi" + + "randaMarwariMentawaiMyeneEryzaMazanderaniNeapolitanNamaJerman RendahNewa" + + "riNiasNiueaKwasioNgiemboonNogaiNorse KunoN’KoSotho UtaraNuerNewari Klasi" + + "kNyamweziNyankoleNyoroNzimaOsageTurki OsmaniPangasinaPahleviPampangaPapi" + + "amentoPalauJerman PennsylvaniaPersia KunoFunisiaPohnpeiaProvencal LamaKʼ" + + "icheʼRajasthaniRapanuiRarotongaRomboRomaniRotumaMakedo-RumaniaRwaSandawe" + + "SakhaAram SamariaSamburuSasakSantaliNgambaiSanguSisiliaSkotlandiaKurdi S" + + "elatanSenecaSenaSeriSelkupKoyraboro SenniIrlandia KunoTachelhitShanArab " + + "SuwaSidamoSilesia BawahSelayarSami SelatanLule SamiInari SamiSkolt SamiS" + + "oninkeSogdienSranan TongoSererSahoSukumaSusuSumeriaKomoriaKongo SwahiliS" + + "uriah KlasikSuriahSilesiaTuluTimneTesoTerenoTetunTigreTivTokelauKlingonT" + + "lingitTamashekNyasa TongaTok PisinTuroyoTarokoTsimshiaTat MuslimTumbukaT" + + "uvaluTasawaqTuviniaTamazight Maroko TengahUdmurtUgaritUmbunduRootVaiVene" + + "siaVotiaVunjoWalserWalamoWaraiWashoWarlpiriKalmukSogaYaoYapoisYangbenYem" + + "baKantonZapotekBlissymbolZenagaTamazight Maroko StandarZuniTidak ada kon" + + "ten linguistikZazaArab Standar ModernJerman Tinggi (Swiss)Spanyol Amerik" + + "a LatinSpanyol (Eropa)Spanyol MeksikoPortugis (Eropa)MoldaviaSerbo-Kroas" + + "iaChina (Aksara Sederhana)China (Aksara Tradisional)" + +var idLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000a, 0x0010, 0x0019, 0x001d, 0x0024, 0x002a, + 0x002e, 0x0033, 0x0037, 0x003d, 0x0047, 0x004e, 0x0057, 0x005f, + 0x0066, 0x006d, 0x0074, 0x0079, 0x007f, 0x0085, 0x008c, 0x0093, + 0x009b, 0x00a2, 0x00a6, 0x00ac, 0x00c2, 0x00c9, 0x00ce, 0x00d3, + 0x00d9, 0x00df, 0x00e7, 0x00ea, 0x00f0, 0x00f7, 0x0100, 0x0107, + 0x010b, 0x010f, 0x0115, 0x0119, 0x011e, 0x0122, 0x0126, 0x012d, + 0x0139, 0x0141, 0x0152, 0x0159, 0x0160, 0x0168, 0x016c, 0x0171, + 0x0177, 0x017c, 0x0185, 0x018c, 0x0191, 0x0199, 0x01a0, 0x01a6, + // Entry 40 - 7F + 0x01b1, 0x01ba, 0x01c5, 0x01c9, 0x01d3, 0x01da, 0x01dd, 0x01e5, + 0x01eb, 0x01f4, 0x01fa, 0x01fe, 0x0205, 0x020a, 0x0210, 0x0218, + 0x021e, 0x0229, 0x022e, 0x0235, 0x023a, 0x0240, 0x0247, 0x024c, + 0x0250, 0x0257, 0x025d, 0x0262, 0x026c, 0x0271, 0x027a, 0x0281, + 0x0284, 0x028b, 0x0297, 0x029c, 0x02a4, 0x02ac, 0x02b1, 0x02ba, + 0x02c3, 0x02cb, 0x02d2, 0x02d8, 0x02dd, 0x02e4, 0x02e9, 0x02f6, + 0x02fc, 0x0302, 0x0309, 0x0319, 0x0329, 0x0338, 0x033e, 0x0344, + 0x034c, 0x0352, 0x0357, 0x035c, 0x0363, 0x036a, 0x036e, 0x0374, + // Entry 80 - BF + 0x037a, 0x0382, 0x0389, 0x0393, 0x0398, 0x039f, 0x03a4, 0x03af, + 0x03b8, 0x03c0, 0x03c6, 0x03d0, 0x03d5, 0x03dc, 0x03e2, 0x03e8, + 0x03ed, 0x03f2, 0x03f8, 0x03ff, 0x0403, 0x0408, 0x0415, 0x041a, + 0x0420, 0x0427, 0x042c, 0x0432, 0x0437, 0x043b, 0x0443, 0x044a, + 0x0450, 0x0455, 0x045a, 0x0460, 0x0465, 0x046b, 0x0471, 0x0478, + 0x047c, 0x0481, 0x0486, 0x048d, 0x0494, 0x049b, 0x04a0, 0x04a5, + 0x04ac, 0x04b2, 0x04b8, 0x04bd, 0x04c1, 0x04c5, 0x04ca, 0x04d1, + 0x04d7, 0x04e3, 0x04eb, 0x04f0, 0x04f4, 0x04fb, 0x0502, 0x0507, + // Entry C0 - FF + 0x0507, 0x0514, 0x0520, 0x0526, 0x052a, 0x0531, 0x0531, 0x0538, + 0x0544, 0x054a, 0x0555, 0x055f, 0x0562, 0x0578, 0x057d, 0x057d, + 0x0583, 0x058a, 0x058e, 0x0595, 0x0599, 0x059e, 0x05a8, 0x05af, + 0x05b3, 0x05b8, 0x05be, 0x05c2, 0x05c7, 0x05c7, 0x05d4, 0x05dc, + 0x05e1, 0x05e5, 0x05eb, 0x05ee, 0x05f5, 0x05f5, 0x05f5, 0x05f9, + 0x05f9, 0x05fd, 0x0603, 0x0609, 0x060e, 0x0612, 0x0616, 0x061d, + 0x0621, 0x0626, 0x062c, 0x0631, 0x0638, 0x063c, 0x0643, 0x064b, + 0x0651, 0x0655, 0x0663, 0x0669, 0x0672, 0x067a, 0x0682, 0x068e, + // Entry 100 - 13F + 0x0694, 0x0694, 0x06a0, 0x06a8, 0x06ae, 0x06b4, 0x06b9, 0x06c1, + 0x06c6, 0x06cc, 0x06d1, 0x06d6, 0x06db, 0x06e8, 0x06e8, 0x06ed, + 0x06fb, 0x0705, 0x070a, 0x0710, 0x0714, 0x0718, 0x0718, 0x0722, + 0x0728, 0x072c, 0x0744, 0x0744, 0x074a, 0x074a, 0x074e, 0x0756, + 0x0756, 0x0759, 0x0759, 0x0771, 0x077d, 0x0784, 0x0790, 0x079c, + 0x07a2, 0x07a4, 0x07aa, 0x07aa, 0x07ae, 0x07b3, 0x07b3, 0x07b7, + 0x07be, 0x07c4, 0x07db, 0x07e6, 0x07e6, 0x07eb, 0x07f4, 0x07fa, + 0x07ff, 0x080a, 0x0818, 0x0818, 0x0818, 0x081d, 0x0827, 0x082c, + // Entry 140 - 17F + 0x082c, 0x0832, 0x083c, 0x0846, 0x084b, 0x0850, 0x085b, 0x085b, + 0x085f, 0x0863, 0x0869, 0x086e, 0x0878, 0x0878, 0x0878, 0x087e, + 0x0884, 0x088b, 0x0898, 0x08a3, 0x08a3, 0x08ae, 0x08b4, 0x08ba, + 0x08bd, 0x08c2, 0x08c6, 0x08cd, 0x08d4, 0x08d8, 0x08df, 0x08eb, + 0x08f2, 0x08f6, 0x08f6, 0x08fb, 0x0901, 0x090d, 0x090d, 0x090d, + 0x0911, 0x0919, 0x0921, 0x092d, 0x0934, 0x0939, 0x093f, 0x094e, + 0x0952, 0x0952, 0x0959, 0x095e, 0x0966, 0x096b, 0x0978, 0x097d, + 0x0984, 0x098a, 0x098f, 0x0995, 0x099a, 0x09a1, 0x09a1, 0x09a8, + // Entry 180 - 1BF + 0x09a8, 0x09ae, 0x09ae, 0x09b3, 0x09b7, 0x09c1, 0x09c1, 0x09cb, + 0x09d2, 0x09d7, 0x09da, 0x09de, 0x09e3, 0x09e3, 0x09e6, 0x09ec, + 0x09f0, 0x09f6, 0x09fe, 0x0a05, 0x0a0d, 0x0a12, 0x0a16, 0x0a1c, + 0x0a22, 0x0a27, 0x0a2b, 0x0a33, 0x0a4c, 0x0a5a, 0x0a61, 0x0a67, + 0x0a72, 0x0a7b, 0x0a83, 0x0a89, 0x0a8e, 0x0a8e, 0x0a95, 0x0aa4, + 0x0ab3, 0x0aba, 0x0ac1, 0x0ac9, 0x0ace, 0x0ad3, 0x0ade, 0x0ade, + 0x0ae8, 0x0aec, 0x0af9, 0x0aff, 0x0b03, 0x0b08, 0x0b08, 0x0b0e, + 0x0b17, 0x0b1c, 0x0b26, 0x0b26, 0x0b2c, 0x0b37, 0x0b3b, 0x0b48, + // Entry 1C0 - 1FF + 0x0b50, 0x0b58, 0x0b5d, 0x0b62, 0x0b67, 0x0b73, 0x0b7c, 0x0b83, + 0x0b8b, 0x0b95, 0x0b9a, 0x0b9a, 0x0bad, 0x0bad, 0x0bb8, 0x0bb8, + 0x0bbf, 0x0bbf, 0x0bbf, 0x0bc7, 0x0bc7, 0x0bd5, 0x0bde, 0x0bde, + 0x0be8, 0x0bef, 0x0bf8, 0x0bf8, 0x0bf8, 0x0bfd, 0x0c03, 0x0c09, + 0x0c09, 0x0c09, 0x0c17, 0x0c1a, 0x0c21, 0x0c26, 0x0c32, 0x0c39, + 0x0c3e, 0x0c45, 0x0c45, 0x0c4c, 0x0c51, 0x0c58, 0x0c62, 0x0c62, + 0x0c6f, 0x0c75, 0x0c79, 0x0c7d, 0x0c83, 0x0c92, 0x0c9f, 0x0c9f, + 0x0ca8, 0x0cac, 0x0cb5, 0x0cbb, 0x0cc8, 0x0ccf, 0x0cdb, 0x0ce4, + // Entry 200 - 23F + 0x0cee, 0x0cf8, 0x0cff, 0x0d06, 0x0d12, 0x0d17, 0x0d1b, 0x0d1b, + 0x0d21, 0x0d25, 0x0d2c, 0x0d33, 0x0d40, 0x0d4d, 0x0d53, 0x0d5a, + 0x0d5e, 0x0d63, 0x0d67, 0x0d6d, 0x0d72, 0x0d77, 0x0d7a, 0x0d81, + 0x0d81, 0x0d88, 0x0d8f, 0x0d8f, 0x0d97, 0x0da2, 0x0dab, 0x0db1, + 0x0db7, 0x0db7, 0x0dbf, 0x0dc9, 0x0dd0, 0x0dd6, 0x0ddd, 0x0de4, + 0x0dfb, 0x0e01, 0x0e07, 0x0e0e, 0x0e12, 0x0e15, 0x0e1c, 0x0e1c, + 0x0e1c, 0x0e1c, 0x0e21, 0x0e21, 0x0e26, 0x0e2c, 0x0e32, 0x0e37, + 0x0e3c, 0x0e44, 0x0e44, 0x0e4a, 0x0e4a, 0x0e4e, 0x0e51, 0x0e57, + // Entry 240 - 27F + 0x0e5e, 0x0e63, 0x0e63, 0x0e69, 0x0e70, 0x0e7a, 0x0e7a, 0x0e80, + 0x0e98, 0x0e9c, 0x0eb7, 0x0ebb, 0x0ece, 0x0ece, 0x0ece, 0x0ee3, + 0x0ee3, 0x0ee3, 0x0ee3, 0x0ee3, 0x0ef8, 0x0f07, 0x0f16, 0x0f16, + 0x0f16, 0x0f16, 0x0f16, 0x0f16, 0x0f16, 0x0f26, 0x0f2e, 0x0f3b, + 0x0f53, 0x0f6d, +} // Size: 1244 bytes + +var isLangStr string = "" + // Size: 4301 bytes + "abkasískaavestískaafríkanskaakanamharískaaragonskaarabískaassamskaavarís" + + "kaaímaraaserskabaskírhvítrússneskabúlgarskabíslamabambarabengalskatíbesk" + + "abretónskabosnískakatalónskatsjetsjenskakamorrókorsískakrítékkneskakirkj" + + "uslavneskasjúvasvelskadanskaþýskadívehídsongkaewegrískaenskaesperantóspæ" + + "nskaeistneskabaskneskapersneskafúlafinnskafídjeyskafæreyskafranskavestur" + + "frísneskaírskaskosk gelískagalíanskagvaranígújaratímanskahásahebreskahin" + + "díhírímótúkróatískahaítískaungverskaarmenskahereróalþjóðatungaindónesísk" + + "ainterlingveígbósísúanjíínúpíakídóíslenskaítalskainúktitútjapanskajavans" + + "kageorgískakongóskakíkújúkúanjamakasakskagrænlenskakmerkannadakóreskakan" + + "úríkasmírskakúrdískakomískakornbreskakirgiskalatínalúxemborgískagandali" + + "mbúrgískalingalalaólitháískalúbakatangalettneskamalagasískamarshallskama" + + "orímakedónskamalajalammongólskamaratímalaískamaltneskaburmneskanárúskano" + + "rður-ndebelenepalskandongahollenskanýnorskanorskt bókmálsuðurndebelenava" + + "hónjanja; sísjeva; sjevaoksítanískaojibvaoromoóríaossetískapúnjabípalípó" + + "lskapastúportúgalskakvesjúarómanskarúndírúmenskarússneskakínjarvandasans" + + "krítsardínskasindínorðursamískasangósingalískaslóvakískaslóvenskasamóska" + + "shonasómalskaalbanskaserbneskasvatísuðursótósúndanskasænskasvahílítamíls" + + "katelúgútadsjikskataílenskatígrinjatúrkmenskatsúanatongverskatyrkneskats" + + "ongatatarskatahítískaúígúrúkraínskaúrdúúsbekskavendavíetnamskavallónskav" + + "olofsósajiddískajórúbasúangkínverskasúlúakkískaacoliadangmeadýgeafríhílí" + + "aghemakkadískaaleúskafornenskaarameískaarákanískaarapahóaravakskaasuastú" + + "rískaavadíbalúkíbalískabasabejabembabenavesturbalotsíbojpúríbíkolbínísik" + + "sikabraíbódóbúríatbúgískablínkaddókaríbamálkebúanókígasíbsjasjagataísjúk" + + "ískamarísínúksjoktásípevískaCherokee-málsjeyensorani-kúrdískakoptískakr" + + "ímtyrkneskakasúbískadakótadargvataítadelaverslavneskadogríbdinkazarmado" + + "grílágsorbneskadúalamiðhollenskajola-fonyidjúlaembuefíkfornegypskaekajúk" + + "elamítmiðenskaevondófangfilippseyskafónmiðfranskafornfranskanorðurfrísne" + + "skaausturfrísneskafríúlskagagagásgajógbajagísgilberskamiðháþýskafornháþý" + + "skagondígorontalógotneskagerbóforngrískasvissnesk þýskagusiigvísínhaídah" + + "avaískahíligaínonhettitískahmonghásorbneskahúpaíbanílokóingúslojbanngomb" + + "amasjámegyðingapersneskagyðingaarabískakarakalpakkabílekasínkambakavíkab" + + "ardískamakondegrænhöfðeyskakasíkotaskakoyra chiinikalenjinkimbúndúkómí-p" + + "ermyakkonkaníkosraskakpellekarasaíbalkarkúrúksjambalabafíakúmíkkútenaíla" + + "dínskalangílandalambalesgískalakótamongólozinorðurlúríluba-lulualúisenól" + + "úndalúólúsaíluyiamadúrskamagahímaítílímakasarmandingómasaímoksamandarme" + + "ndemerúmáritískamiðírskamakhuwa-meettometa’mikmakmínangkabámansjúmanípúr" + + "ímóhískamossímundangmargvísleg málkríkmarvaríersjamasanderanínapólískan" + + "amalágþýska; lágsaxneskanevaríníasníveskakwasionógaínorrænan’konorðursót" + + "ónúernjamvesínyankolenjórónsímaósagetyrkneska, ottómanpangasínmálpalaví" + + "pampangapapíamentópaláskafornpersneskafönikískaponpeiskafornpróvensalska" + + "kicherajastanírapanúírarótongskarombóromanírúasandavejakútsamversk arame" + + "ískasambúrúsasaksantalísangúsikileyskaskoskasuðurkúrdískasenaselkúpkoír" + + "aboró-sennífornírskatachelhitsjansídamósuðursamískalúlesamískaenaresamís" + + "kaskoltesamískasóninkesogdíenserersúkúmasúsúsúmerskaKongó-svahílíklassís" + + "k sýrlenskasýrlenskatímnetesóterenótetúmtígretívtókeláskaklingonskatling" + + "ittamasjektongverska (nyasa)tokpisintsimsískatúmbúkatúvalúskatasawaqtúví" + + "nskatamazightúdmúrtúgarítískaúmbúndúrótvaívotískavunjóvalamóvaraívasjóva" + + "rlpirikalmúkskasógajaójapískasapótekblisstáknsenagastaðlað marokkóskt ta" + + "mazightsúníekkert tungumálaefnistöðluð nútímaarabískaausturrísk þýskasvi" + + "ssnesk háþýskaáströlsk enskakanadísk enskabresk enskabandarísk enskarómö" + + "nsk-amerísk spænskaevrópsk spænskamexíkósk spænskakanadísk franskasvissn" + + "esk franskalágsaxneskaflæmskabrasílísk portúgalskaevrópsk portúgalskamol" + + "dóvskaserbókróatískakínverska (einfölduð)kínverska (hefðbundin)" + +var isLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x000a, 0x0014, 0x001f, 0x0023, 0x002d, 0x0036, + 0x003f, 0x0047, 0x0050, 0x0057, 0x005e, 0x0065, 0x0074, 0x007e, + 0x0086, 0x008d, 0x0096, 0x009e, 0x00a8, 0x00b1, 0x00bc, 0x00c8, + 0x00d0, 0x00d9, 0x00dd, 0x00e7, 0x00f6, 0x00fd, 0x0103, 0x0109, + 0x0110, 0x0118, 0x011f, 0x0122, 0x0129, 0x012e, 0x0138, 0x0140, + 0x0149, 0x0152, 0x015b, 0x0160, 0x0167, 0x0171, 0x017a, 0x0181, + 0x0191, 0x0197, 0x01a5, 0x01af, 0x01b7, 0x01c1, 0x01c7, 0x01cc, + 0x01d4, 0x01da, 0x01e6, 0x01f1, 0x01fb, 0x0204, 0x020c, 0x0213, + // Entry 40 - 7F + 0x0222, 0x022f, 0x023a, 0x0240, 0x024b, 0x0255, 0x025a, 0x0263, + 0x026b, 0x0276, 0x027e, 0x0286, 0x0290, 0x0299, 0x02a2, 0x02ab, + 0x02b3, 0x02be, 0x02c2, 0x02c9, 0x02d1, 0x02d9, 0x02e3, 0x02ed, + 0x02f5, 0x02ff, 0x0307, 0x030e, 0x031d, 0x0322, 0x032f, 0x0336, + 0x033a, 0x0345, 0x0351, 0x035a, 0x0366, 0x0371, 0x0377, 0x0382, + 0x038b, 0x0395, 0x039c, 0x03a5, 0x03ae, 0x03b7, 0x03c0, 0x03cf, + 0x03d7, 0x03dd, 0x03e6, 0x03ef, 0x03fe, 0x040b, 0x0412, 0x0429, + 0x0436, 0x043c, 0x0441, 0x0447, 0x0451, 0x045a, 0x045f, 0x0466, + // Entry 80 - BF + 0x046c, 0x0478, 0x0480, 0x0489, 0x0490, 0x0499, 0x04a3, 0x04af, + 0x04b8, 0x04c2, 0x04c8, 0x04d7, 0x04dd, 0x04e8, 0x04f4, 0x04fe, + 0x0506, 0x050b, 0x0514, 0x051c, 0x0525, 0x052b, 0x0537, 0x0541, + 0x0548, 0x0551, 0x055a, 0x0562, 0x056c, 0x0576, 0x057f, 0x058a, + 0x0591, 0x059b, 0x05a4, 0x05aa, 0x05b2, 0x05bd, 0x05c5, 0x05d0, + 0x05d6, 0x05df, 0x05e4, 0x05ef, 0x05ef, 0x05f9, 0x05fe, 0x0603, + 0x060c, 0x0614, 0x061a, 0x0624, 0x062a, 0x0632, 0x0637, 0x063e, + 0x0644, 0x0644, 0x064f, 0x0654, 0x0654, 0x065e, 0x065e, 0x0666, + // Entry C0 - FF + 0x0666, 0x0666, 0x066f, 0x066f, 0x0679, 0x0685, 0x0685, 0x068d, + 0x068d, 0x0696, 0x0696, 0x0696, 0x0699, 0x0699, 0x06a4, 0x06a4, + 0x06aa, 0x06b2, 0x06ba, 0x06ba, 0x06be, 0x06be, 0x06be, 0x06be, + 0x06c2, 0x06c7, 0x06c7, 0x06cb, 0x06cb, 0x06cb, 0x06d9, 0x06e2, + 0x06e8, 0x06ee, 0x06ee, 0x06ee, 0x06f5, 0x06f5, 0x06f5, 0x06fa, + 0x06fa, 0x0700, 0x0700, 0x0708, 0x0711, 0x0711, 0x0716, 0x0716, + 0x071c, 0x0727, 0x0727, 0x0727, 0x0730, 0x0735, 0x073c, 0x0745, + 0x074f, 0x0754, 0x075b, 0x0762, 0x076d, 0x077a, 0x0780, 0x0791, + // Entry 100 - 13F + 0x079a, 0x079a, 0x07a8, 0x07b3, 0x07ba, 0x07c0, 0x07c6, 0x07cd, + 0x07d6, 0x07dd, 0x07e2, 0x07e7, 0x07ed, 0x07fa, 0x07fa, 0x0800, + 0x080d, 0x0817, 0x081d, 0x081d, 0x0821, 0x0826, 0x0826, 0x0831, + 0x0838, 0x083f, 0x0848, 0x0848, 0x084f, 0x084f, 0x0853, 0x085f, + 0x085f, 0x0863, 0x0863, 0x086e, 0x0879, 0x0879, 0x088a, 0x089a, + 0x08a4, 0x08a6, 0x08ac, 0x08ac, 0x08b1, 0x08b6, 0x08b6, 0x08ba, + 0x08c3, 0x08c3, 0x08d1, 0x08df, 0x08df, 0x08e5, 0x08ef, 0x08f7, + 0x08fd, 0x0908, 0x0919, 0x0919, 0x0919, 0x091e, 0x0926, 0x092c, + // Entry 140 - 17F + 0x092c, 0x0935, 0x0935, 0x0941, 0x094c, 0x0951, 0x095d, 0x095d, + 0x0962, 0x0967, 0x0967, 0x096e, 0x0974, 0x0974, 0x0974, 0x097a, + 0x0980, 0x0988, 0x0999, 0x09aa, 0x09aa, 0x09b4, 0x09bb, 0x09c1, + 0x09c1, 0x09c6, 0x09cb, 0x09d6, 0x09d6, 0x09d6, 0x09dd, 0x09ed, + 0x09ed, 0x09ed, 0x09ed, 0x09f2, 0x09f9, 0x0a05, 0x0a05, 0x0a05, + 0x0a05, 0x0a0d, 0x0a17, 0x0a25, 0x0a2d, 0x0a35, 0x0a3b, 0x0a49, + 0x0a49, 0x0a49, 0x0a49, 0x0a50, 0x0a58, 0x0a5e, 0x0a5e, 0x0a65, + 0x0a6e, 0x0a77, 0x0a7d, 0x0a82, 0x0a87, 0x0a90, 0x0a90, 0x0a90, + // Entry 180 - 1BF + 0x0a90, 0x0a97, 0x0a97, 0x0a9d, 0x0aa1, 0x0aae, 0x0aae, 0x0ab8, + 0x0ac1, 0x0ac7, 0x0acc, 0x0ad3, 0x0ad8, 0x0ad8, 0x0ad8, 0x0ae1, + 0x0ae1, 0x0ae8, 0x0af2, 0x0af9, 0x0b02, 0x0b08, 0x0b08, 0x0b0d, + 0x0b13, 0x0b18, 0x0b1d, 0x0b28, 0x0b32, 0x0b40, 0x0b47, 0x0b4d, + 0x0b59, 0x0b60, 0x0b6b, 0x0b74, 0x0b7a, 0x0b7a, 0x0b81, 0x0b91, + 0x0b96, 0x0b96, 0x0b9e, 0x0b9e, 0x0b9e, 0x0ba3, 0x0baf, 0x0baf, + 0x0bba, 0x0bbe, 0x0bd7, 0x0bde, 0x0be3, 0x0beb, 0x0beb, 0x0bf1, + 0x0bf1, 0x0bf8, 0x0c00, 0x0c00, 0x0c06, 0x0c13, 0x0c18, 0x0c18, + // Entry 1C0 - 1FF + 0x0c21, 0x0c29, 0x0c30, 0x0c36, 0x0c3c, 0x0c4f, 0x0c5c, 0x0c63, + 0x0c6b, 0x0c77, 0x0c7f, 0x0c7f, 0x0c7f, 0x0c7f, 0x0c8c, 0x0c8c, + 0x0c97, 0x0c97, 0x0c97, 0x0ca0, 0x0ca0, 0x0cb1, 0x0cb6, 0x0cb6, + 0x0cc0, 0x0cc9, 0x0cd5, 0x0cd5, 0x0cd5, 0x0cdb, 0x0ce2, 0x0ce2, + 0x0ce2, 0x0ce2, 0x0ce2, 0x0ce6, 0x0ced, 0x0cf3, 0x0d06, 0x0d0f, + 0x0d14, 0x0d1c, 0x0d1c, 0x0d1c, 0x0d22, 0x0d2c, 0x0d32, 0x0d32, + 0x0d42, 0x0d42, 0x0d46, 0x0d46, 0x0d4d, 0x0d5f, 0x0d69, 0x0d69, + 0x0d72, 0x0d76, 0x0d76, 0x0d7e, 0x0d7e, 0x0d7e, 0x0d8c, 0x0d99, + // Entry 200 - 23F + 0x0da6, 0x0db4, 0x0dbc, 0x0dc4, 0x0dc4, 0x0dc9, 0x0dc9, 0x0dc9, + 0x0dd1, 0x0dd7, 0x0de0, 0x0de0, 0x0df0, 0x0e04, 0x0e0e, 0x0e0e, + 0x0e0e, 0x0e14, 0x0e19, 0x0e20, 0x0e26, 0x0e2c, 0x0e30, 0x0e3b, + 0x0e3b, 0x0e45, 0x0e4c, 0x0e4c, 0x0e54, 0x0e66, 0x0e6e, 0x0e6e, + 0x0e6e, 0x0e6e, 0x0e78, 0x0e78, 0x0e81, 0x0e8c, 0x0e93, 0x0e9d, + 0x0ea6, 0x0eae, 0x0ebb, 0x0ec5, 0x0ec9, 0x0ecd, 0x0ecd, 0x0ecd, + 0x0ecd, 0x0ecd, 0x0ed5, 0x0ed5, 0x0edb, 0x0edb, 0x0ee2, 0x0ee8, + 0x0eee, 0x0ef6, 0x0ef6, 0x0f00, 0x0f00, 0x0f05, 0x0f09, 0x0f11, + // Entry 240 - 27F + 0x0f11, 0x0f11, 0x0f11, 0x0f11, 0x0f19, 0x0f23, 0x0f23, 0x0f29, + 0x0f48, 0x0f4e, 0x0f63, 0x0f63, 0x0f7f, 0x0f7f, 0x0f92, 0x0fa6, + 0x0fb6, 0x0fc5, 0x0fd0, 0x0fe0, 0x0ffb, 0x100c, 0x101f, 0x101f, + 0x1030, 0x1041, 0x104d, 0x1055, 0x106d, 0x1082, 0x108c, 0x109d, + 0x10b5, 0x10cd, +} // Size: 1244 bytes + +var itLangStr string = "" + // Size: 4988 bytes + "afarabcasoavestanafrikaansakanamaricoaragonesearaboassameseavaroaymaraaz" + + "erbaigianobaschirobielorussobulgarobislamabambarabengalesetibetanobreton" + + "ebosniacocatalanocecenochamorrocorsocreececoslavo della Chiesaciuvasciog" + + "allesedanesetedescodivehidzongkhaewegrecoingleseesperantospagnoloestoneb" + + "ascopersianofulahfinlandesefigianofaroesefrancesefrisone occidentaleirla" + + "ndesegaelico scozzesegalizianoguaranígujaratimannesehausaebraicohindihir" + + "i motucroatohaitianoungheresearmenohererointerlinguaindonesianointerling" + + "ueigbosichuan yiinupiakidoislandeseitalianoinuktitutgiapponesegiavaneseg" + + "eorgianokongokikuyukuanyamakazakogroenlandesekhmerkannadacoreanokanurika" + + "shmiricurdokomicornicochirghisolatinolussemburghesegandalimburgeselingal" + + "alaolituanoluba-katangalettonemalgasciomarshallesemaorimacedonemalayalam" + + "mongolomarathimalesemaltesebirmanonaurundebele del nordnepalesendongaola" + + "ndesenorvegese nynorsknorvegese bokmålndebele del sudnavajonyanjaoccitan" + + "oojibwaoromooriyaosseticopunjabipalipolaccopashtoportoghesequechuaromanc" + + "iorundirumenorussokinyarwandasanscritosardosindhisami del nordsangosinga" + + "leseslovaccoslovenosamoanoshonasomaloalbaneseserboswatisotho del sudsund" + + "anesesvedeseswahilitamiltelugutagicothaitigrinoturcomannotswanatonganotu" + + "rcotsongatatarotaitianouiguroucrainourduusbecovendavietnamitavolapükvall" + + "onewolofxhosayiddishyorubazhuangcinesezuluaccineseacioliadangmeadygheara" + + "bo tunisinoafrihiliaghemainuaccadoalabamaaleutoalbanese ghegoaltai merid" + + "ionaleinglese anticoangikaaramaicoaraucanoaraonaarapahoarabo algerinoaru" + + "acoarabo marocchinoarabo egizianoasulingua dei segni americanaasturianok" + + "otavaawadhibelucibalinesebavaresebasabamunbatak tobaghomalabegiawembabet" + + "awibenabafutbadagabeluci occidentalebhojpuribicolbinibanjarkomsiksikabis" + + "hnupriyabakhtiaribrajbrahuibodoakooseburiatbugibulublinmedumbacaddocarib" + + "icocayugaatsamcebuanochigachibchaciagataicochuukesemarigergo chinookchoc" + + "tawchipewyancherokeecheyennecurdo soranicoptocapiznonturco crimeokashubi" + + "andakotadargwataitadelawareslavedogribdincazarmadogribasso sorabodusun c" + + "entraledualaolandese mediojola-fonydiuladazagaembuefikemilianoegiziano a" + + "nticoekajukaelamiticoinglese medioyupik centraleewondoestremegnofangfili" + + "ppinofinlandese del Tornedalenfonfrancese cajunfrancese mediofrancese an" + + "ticofrancoprovenzalefrisone settentrionalefrisone orientalefriulanogagag" + + "auzogangayogbayadari zoroastrianogeezgilbertesegilakitedesco medio altot" + + "edesco antico altokonkani goanogondigorontalogoticogerbogreco anticotede" + + "sco svizzerowayuugusiigwichʼinhaidahakkahawaianohindi figianohiligaynahi" + + "ttitehmongalto soraboxianghupaibanibibioilocanoingushingricocreolo giama" + + "icanolojbanngamambomachamegiudeo persianogiudeo arabojutlandicokara-kalp" + + "akcabilokachinkaikambakawikabardiakanembutyapmakondecapoverdianokorokain" + + "gangkhasikhotanesekoyra chiinikhowarkirmanjkikakokalenjinkimbundupermiac" + + "okonkanikosraeankpellekarachay-Balkarcarelianokurukhshambalabafiacolonie" + + "sekumykkutenaigiudeo-spagnololangilahndalambalezghianLingua Franca Noval" + + "igurelivonelakotalombardololo bantuloziluri settentrionaleletgalloluba-l" + + "ulualuisenolundaluolushailuyiacinese classicolazmaduresemafamagahimaithi" + + "limakasarmandingomasaimabamokshamandarmendemerucreolo maurizianoirlandes" + + "e mediomakhuwa-meettometa’micmacmenangkabaumanchumanipurimohawkmossimari" + + " occidentalemundangmultilinguacreekmirandesemarwarimentawaimyeneerzyamaz" + + "andaranimin nannapoletanonamabasso tedesconewariniasniueaokwasiongiemboo" + + "nnogainorse anticonovialn’kosotho del nordnuernewari classiconyamwezinya" + + "nkolenyoronzimaosageturco ottomanopangasinanpahlavipampangapapiamentopal" + + "aupiccardotedesco della Pennsylvaniapersiano anticotedesco palatinofenic" + + "iopiemonteseponticoponapeprussianoprovenzale anticok’iche’quechua dell’a" + + "ltopiano del Chimborazorajasthanirapanuirarotongaromagnolotarifitromboro" + + "manirotumanorutenorovianaarumenorwasandaweyakutaramaico samaritanosambur" + + "usasaksantalisaurashtrangambaysangusicilianoscozzesesassaresecurdo merid" + + "ionalesenecasenaseriselkupkoyraboro senniirlandese anticosamogiticotashe" + + "lhitshanchadian arabicsidamotedesco slesianoselayarsami del sudsami di L" + + "ulesami di Inarisami skoltsoninkesogdianosranan tongoserersahosaterfries" + + "ischsukumasususumerocomorianocongo swahilisiriaco classicosiriacoslesian" + + "otulutemnetesoterenotetumtigretivtokelautsakhurklingontlingittalisciotam" + + "asheknyasa del Tongatok pisinturoyotarokozaconicotsimshiantat islamicotu" + + "mbukatuvalutasawaqtuviniantamazightudmurtugariticombundurootvaivenetovep" + + "sofiammingo occidentalevotovõrovunjowalserwalamowaraywashowarlpiriwukalm" + + "ykmengreliosogayao (bantu)yapeseyangbenyembanheengatucantonesezapotecbli" + + "ssymbolzelandesezenagatamazight del Marocco standardzuninessun contenuto" + + " linguisticozazaarabo moderno standardtedesco austriacoalto tedesco sviz" + + "zeroinglese australianoinglese canadeseinglese britannicoinglese america" + + "nospagnolo latinoamericanospagnolo europeospagnolo messicanofrancese can" + + "adesefrancese svizzerobasso tedesco olandesefiammingoportoghese brasilia" + + "noportoghese europeomoldavoserbo-croatocinese semplificatocinese tradizi" + + "onale" + +var itLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000a, 0x0011, 0x001a, 0x001e, 0x0025, 0x002e, + 0x0033, 0x003b, 0x0040, 0x0046, 0x0052, 0x005a, 0x0064, 0x006b, + 0x0072, 0x0079, 0x0082, 0x008a, 0x0091, 0x0099, 0x00a1, 0x00a7, + 0x00af, 0x00b4, 0x00b8, 0x00bc, 0x00ce, 0x00d7, 0x00de, 0x00e4, + 0x00eb, 0x00f1, 0x00f9, 0x00fc, 0x0101, 0x0108, 0x0111, 0x0119, + 0x011f, 0x0124, 0x012c, 0x0131, 0x013b, 0x0142, 0x0149, 0x0151, + 0x0164, 0x016d, 0x017d, 0x0186, 0x018e, 0x0196, 0x019d, 0x01a2, + 0x01a9, 0x01ae, 0x01b7, 0x01bd, 0x01c5, 0x01ce, 0x01d4, 0x01da, + // Entry 40 - 7F + 0x01e5, 0x01f0, 0x01fb, 0x01ff, 0x0209, 0x0210, 0x0213, 0x021c, + 0x0224, 0x022d, 0x0237, 0x0240, 0x0249, 0x024e, 0x0254, 0x025c, + 0x0262, 0x026e, 0x0273, 0x027a, 0x0281, 0x0287, 0x028f, 0x0294, + 0x0298, 0x029f, 0x02a8, 0x02ae, 0x02bc, 0x02c1, 0x02cb, 0x02d2, + 0x02d5, 0x02dc, 0x02e8, 0x02ef, 0x02f8, 0x0303, 0x0308, 0x0310, + 0x0319, 0x0320, 0x0327, 0x032d, 0x0334, 0x033b, 0x0340, 0x0350, + 0x0358, 0x035e, 0x0366, 0x0377, 0x0388, 0x0397, 0x039d, 0x03a3, + 0x03ab, 0x03b1, 0x03b6, 0x03bb, 0x03c3, 0x03ca, 0x03ce, 0x03d5, + // Entry 80 - BF + 0x03db, 0x03e5, 0x03ec, 0x03f4, 0x03f9, 0x03ff, 0x0404, 0x040f, + 0x0418, 0x041d, 0x0423, 0x0430, 0x0435, 0x043e, 0x0446, 0x044d, + 0x0454, 0x0459, 0x045f, 0x0467, 0x046c, 0x0471, 0x047e, 0x0487, + 0x048e, 0x0495, 0x049a, 0x04a0, 0x04a6, 0x04aa, 0x04b1, 0x04bb, + 0x04c1, 0x04c8, 0x04cd, 0x04d3, 0x04d9, 0x04e1, 0x04e7, 0x04ee, + 0x04f2, 0x04f8, 0x04fd, 0x0507, 0x050f, 0x0516, 0x051b, 0x0520, + 0x0527, 0x052d, 0x0533, 0x0539, 0x053d, 0x0545, 0x054b, 0x0552, + 0x0558, 0x0566, 0x056e, 0x0573, 0x0577, 0x057d, 0x0584, 0x058a, + // Entry C0 - FF + 0x0598, 0x05a9, 0x05b7, 0x05bd, 0x05c5, 0x05cd, 0x05d3, 0x05da, + 0x05e8, 0x05ee, 0x05fe, 0x060c, 0x060f, 0x0629, 0x0632, 0x0638, + 0x063e, 0x0644, 0x064c, 0x0654, 0x0658, 0x065d, 0x0667, 0x066e, + 0x0673, 0x0678, 0x067e, 0x0682, 0x0687, 0x068d, 0x069f, 0x06a7, + 0x06ac, 0x06b0, 0x06b6, 0x06b9, 0x06c0, 0x06cb, 0x06d4, 0x06d8, + 0x06de, 0x06e2, 0x06e8, 0x06ee, 0x06f2, 0x06f6, 0x06fa, 0x0701, + 0x0706, 0x070e, 0x0714, 0x0719, 0x0720, 0x0725, 0x072c, 0x0736, + 0x073e, 0x0742, 0x074f, 0x0756, 0x075f, 0x0767, 0x076f, 0x077b, + // Entry 100 - 13F + 0x0780, 0x0788, 0x0794, 0x079d, 0x07a3, 0x07a9, 0x07ae, 0x07b6, + 0x07bb, 0x07c1, 0x07c6, 0x07cb, 0x07d0, 0x07dc, 0x07ea, 0x07ef, + 0x07fd, 0x0806, 0x080b, 0x0811, 0x0815, 0x0819, 0x0821, 0x0830, + 0x0837, 0x0840, 0x084d, 0x085b, 0x0861, 0x086b, 0x086f, 0x0878, + 0x0891, 0x0894, 0x08a2, 0x08b0, 0x08bf, 0x08cf, 0x08e5, 0x08f6, + 0x08fe, 0x0900, 0x0907, 0x090a, 0x090e, 0x0913, 0x0924, 0x0928, + 0x0932, 0x0938, 0x094a, 0x095d, 0x096a, 0x096f, 0x0978, 0x097e, + 0x0983, 0x098f, 0x099f, 0x09a4, 0x09a4, 0x09a9, 0x09b2, 0x09b7, + // Entry 140 - 17F + 0x09bc, 0x09c4, 0x09d1, 0x09da, 0x09e1, 0x09e6, 0x09f1, 0x09f6, + 0x09fa, 0x09fe, 0x0a04, 0x0a0b, 0x0a11, 0x0a18, 0x0a29, 0x0a2f, + 0x0a37, 0x0a3e, 0x0a4d, 0x0a59, 0x0a63, 0x0a6e, 0x0a74, 0x0a7a, + 0x0a7d, 0x0a82, 0x0a86, 0x0a8e, 0x0a95, 0x0a99, 0x0aa0, 0x0aac, + 0x0aac, 0x0ab0, 0x0ab8, 0x0abd, 0x0ac6, 0x0ad2, 0x0ad8, 0x0ae1, + 0x0ae5, 0x0aed, 0x0af5, 0x0afd, 0x0b04, 0x0b0c, 0x0b12, 0x0b21, + 0x0b21, 0x0b21, 0x0b2a, 0x0b30, 0x0b38, 0x0b3d, 0x0b46, 0x0b4b, + 0x0b52, 0x0b61, 0x0b66, 0x0b6c, 0x0b71, 0x0b79, 0x0b8b, 0x0b91, + // Entry 180 - 1BF + 0x0b97, 0x0b9d, 0x0ba5, 0x0baf, 0x0bb3, 0x0bc6, 0x0bce, 0x0bd8, + 0x0bdf, 0x0be4, 0x0be7, 0x0bed, 0x0bf2, 0x0c01, 0x0c04, 0x0c0c, + 0x0c10, 0x0c16, 0x0c1e, 0x0c25, 0x0c2d, 0x0c32, 0x0c36, 0x0c3c, + 0x0c42, 0x0c47, 0x0c4b, 0x0c5c, 0x0c6b, 0x0c79, 0x0c80, 0x0c86, + 0x0c91, 0x0c97, 0x0c9f, 0x0ca5, 0x0caa, 0x0cba, 0x0cc1, 0x0ccc, + 0x0cd1, 0x0cda, 0x0ce1, 0x0ce9, 0x0cee, 0x0cf3, 0x0cfe, 0x0d05, + 0x0d0f, 0x0d13, 0x0d20, 0x0d26, 0x0d2a, 0x0d2e, 0x0d30, 0x0d36, + 0x0d3f, 0x0d44, 0x0d50, 0x0d56, 0x0d5c, 0x0d6a, 0x0d6e, 0x0d7d, + // Entry 1C0 - 1FF + 0x0d85, 0x0d8d, 0x0d92, 0x0d97, 0x0d9c, 0x0daa, 0x0db4, 0x0dbb, + 0x0dc3, 0x0dcd, 0x0dd2, 0x0dda, 0x0df4, 0x0df4, 0x0e03, 0x0e13, + 0x0e1a, 0x0e24, 0x0e2b, 0x0e31, 0x0e3a, 0x0e4b, 0x0e56, 0x0e7d, + 0x0e87, 0x0e8e, 0x0e97, 0x0ea0, 0x0ea7, 0x0eac, 0x0eb2, 0x0eba, + 0x0ec0, 0x0ec7, 0x0ece, 0x0ed1, 0x0ed8, 0x0edd, 0x0ef0, 0x0ef7, + 0x0efc, 0x0f03, 0x0f0d, 0x0f14, 0x0f19, 0x0f22, 0x0f2a, 0x0f33, + 0x0f44, 0x0f4a, 0x0f4e, 0x0f52, 0x0f58, 0x0f67, 0x0f77, 0x0f81, + 0x0f8a, 0x0f8e, 0x0f9c, 0x0fa2, 0x0fb2, 0x0fb9, 0x0fc5, 0x0fd1, + // Entry 200 - 23F + 0x0fde, 0x0fe8, 0x0fef, 0x0ff7, 0x1003, 0x1008, 0x100c, 0x101a, + 0x1020, 0x1024, 0x102a, 0x1033, 0x1040, 0x1050, 0x1057, 0x105f, + 0x1063, 0x1068, 0x106c, 0x1072, 0x1077, 0x107c, 0x107f, 0x1086, + 0x108d, 0x1094, 0x109b, 0x10a3, 0x10ab, 0x10ba, 0x10c3, 0x10c9, + 0x10cf, 0x10d7, 0x10e0, 0x10ec, 0x10f3, 0x10f9, 0x1100, 0x1108, + 0x1111, 0x1117, 0x1120, 0x1126, 0x112a, 0x112d, 0x1133, 0x1138, + 0x114d, 0x114d, 0x1151, 0x1156, 0x115b, 0x1161, 0x1167, 0x116c, + 0x1171, 0x1179, 0x117b, 0x1181, 0x118a, 0x118e, 0x1199, 0x119f, + // Entry 240 - 27F + 0x11a6, 0x11ab, 0x11b4, 0x11bd, 0x11c4, 0x11ce, 0x11d7, 0x11dd, + 0x11fb, 0x11ff, 0x121b, 0x121f, 0x1235, 0x1235, 0x1246, 0x125b, + 0x126e, 0x127e, 0x1290, 0x12a1, 0x12b9, 0x12c9, 0x12db, 0x12db, + 0x12ec, 0x12fd, 0x1313, 0x131c, 0x1331, 0x1343, 0x134a, 0x1356, + 0x1369, 0x137c, +} // Size: 1244 bytes + +var jaLangStr string = "" + // Size: 10000 bytes + "アファル語アブハズ語アヴェスタ語アフリカーンス語アカン語アムハラ語アラゴン語アラビア語アッサム語アヴァル語アイマラ語アゼルバイジャン語バシキール" + + "語ベラルーシ語ブルガリア語ビスラマ語バンバラ語ベンガル語チベット語ブルトン語ボスニア語カタロニア語チェチェン語チャモロ語コルシカ語クリー語チ" + + "ェコ語教会スラブ語チュヴァシ語ウェールズ語デンマーク語ドイツ語ディベヒ語ゾンカ語エウェ語ギリシャ語英語エスペラント語スペイン語エストニア語バ" + + "スク語ペルシア語フラニ語フィンランド語フィジー語フェロー語フランス語西フリジア語アイルランド語スコットランド・ゲール語ガリシア語グアラニー語" + + "グジャラート語マン島語ハウサ語ヘブライ語ヒンディー語ヒリモツ語クロアチア語ハイチ語ハンガリー語アルメニア語ヘレロ語インターリングアインドネシ" + + "ア語インターリングイボ語四川イ語イヌピアック語イド語アイスランド語イタリア語イヌクウティトット語日本語ジャワ語ジョージア語コンゴ語キクユ語ク" + + "ワニャマ語カザフ語グリーンランド語クメール語カンナダ語韓国語カヌリ語カシミール語クルド語コミ語コーンウォール語キルギス語ラテン語ルクセンブル" + + "ク語ガンダ語リンブルフ語リンガラ語ラオ語リトアニア語ルバ・カタンガ語ラトビア語マダガスカル語マーシャル語マオリ語マケドニア語マラヤーラム語モ" + + "ンゴル語マラーティー語マレー語マルタ語ビルマ語ナウル語北ンデベレ語ネパール語ンドンガ語オランダ語ノルウェー語(ニーノシュク)ノルウェー語(ブ" + + "ークモール)南ンデベレ語ナバホ語ニャンジャ語オック語オジブウェー語オロモ語オリヤー語オセット語パンジャブ語パーリ語ポーランド語パシュトゥー語" + + "ポルトガル語ケチュア語ロマンシュ語ルンディ語ルーマニア語ロシア語ルワンダ語サンスクリット語サルデーニャ語シンド語北サーミ語サンゴ語シンハラ語" + + "スロバキア語スロベニア語サモア語ショナ語ソマリ語アルバニア語セルビア語スワジ語南部ソト語スンダ語スウェーデン語スワヒリ語タミル語テルグ語タジ" + + "ク語タイ語ティグリニア語トルクメン語ツワナ語トンガ語トルコ語ツォンガ語タタール語タヒチ語ウイグル語ウクライナ語ウルドゥー語ウズベク語ベンダ語" + + "ベトナム語ヴォラピュク語ワロン語ウォロフ語コサ語イディッシュ語ヨルバ語チワン語中国語ズールー語アチェ語アチョリ語アダングメ語アディゲ語チュニ" + + "ジア・アラビア語アフリヒリ語アゲム語アイヌ語アッカド語アラバマ語アレウト語ゲグ・アルバニア語南アルタイ語古英語アンギカ語アラム語アラウカン語" + + "アラオナ語アラパホー語アルジェリア・アラビア語アラワク語モロッコ・アラビア語エジプト・アラビア語アス語アメリカ手話アストゥリアス語コタヴァア" + + "ワディー語バルーチー語バリ語バイエルン・オーストリア語バサ語バムン語トバ・バタク語ゴーマラ語ベジャ語ベンバ語ベタウィ語ベナ語バフット語バダガ" + + "語西バローチー語ボージュプリー語ビコル語ビニ語バンジャル語コム語シクシカ語ビシュヌプリヤ・マニプリ語バフティヤーリー語ブラジ語ブラフイ語ボド" + + "語アコース語ブリヤート語ブギ語ブル語ビリン語メドゥンバ語カドー語カリブ語カユーガ語チャワイ語セブアノ語チガ語チブチャ語チャガタイ語チューク語" + + "マリ語チヌーク混成語チョクトー語チペワイアン語チェロキー語シャイアン語クルド語(ソラニー)コプト語カピス語クリミア・タタール語カシューブ語ダ" + + "コタ語ダルガン語タイタ語デラウェア語スレイビー語ドグリブ語ディンカ語ザルマ語ドーグリー語低ソルビア語中央ドゥスン語ドゥアラ語中世オランダ語ジ" + + "ョラ=フォニィ語ジュラ語ダザガ語エンブ語エフィク語エミリア語古代エジプト語エカジュク語エラム語中英語中央アラスカ・ユピック語エウォンド語エス" + + "トレマドゥーラ語ファング語フィリピノ語トルネダール・フィンランド語フォン語ケイジャン・フランス語中期フランス語古フランス語アルピタン語北フリ" + + "ジア語東フリジア語フリウリ語ガ語ガガウズ語贛語ガヨ語バヤ語ダリー語(ゾロアスター教)ゲエズ語キリバス語ギラキ語中高ドイツ語古高ドイツ語ゴア・" + + "コンカニ語ゴーンディー語ゴロンタロ語ゴート語グレボ語古代ギリシャ語スイスドイツ語ワユ語フラフラ語グシイ語グウィッチン語ハイダ語客家語ハワイ語" + + "フィジー・ヒンディー語ヒリガイノン語ヒッタイト語フモン語上ソルビア語湘語アタパスカ語イバン語イビビオ語イロカノ語イングーシ語イングリア語ジャ" + + "マイカ・クレオール語ロジバン語ンゴンバ語マチャメ語ユダヤ・ペルシア語ユダヤ・アラビア語ユトランド語カラカルパク語カビル語カチン語カジェ語カン" + + "バ語カウィ語カバルド語カネンブ語カタブ語マコンデ語カーボベルデ・クレオール語ニャン語コロ語カインガング語カシ語コータン語コイラ・チーニ語コワ" + + "ール語キルマンジュキ語カコ語カレンジン語キンブンド語コミ・ペルミャク語コンカニ語コスラエ語クペレ語カラチャイ語クリオ語キナライア語カレリア語" + + "クルク語サンバー語バフィア語ケルン語クムク語クテナイ語ラディノ語ランギ語ラフンダー語ランバ語レズギ語リングア・フランカ・ノバリグリア語リヴォ" + + "ニア語ラコタ語ロンバルド語モンゴ語ロジ語北ロル語ラトガリア語ルバ・ルルア語ルイセーニョ語ルンダ語ルオ語ルシャイ語ルヒヤ語漢文ラズ語マドゥラ語" + + "マファ語マガヒー語マイティリー語マカッサル語マンディンゴ語マサイ語マバ語モクシャ語マンダル語メンデ語メル語モーリシャス・クレオール語中期アイ" + + "ルランド語マクア・ミート語メタ語ミクマク語ミナンカバウ語満州語マニプリ語モーホーク語モシ語山地マリ語ムンダン語複数言語クリーク語ミランダ語マ" + + "ールワーリー語メンタワイ語ミエネ語エルジャ語マーザンダラーン語閩南語ナポリ語ナマ語低地ドイツ語ネワール語ニアス語ニウーエイ語アオ・ナガ語クワ" + + "シオ語ンジエムブーン語ノガイ語古ノルド語ノヴィアルンコ語北部ソト語ヌエル語古典ネワール語ニャムウェジ語ニャンコレ語ニョロ語ンゼマ語オセージ語" + + "オスマントルコ語パンガシナン語パフラヴィー語パンパンガ語パピアメント語パラオ語ピカルディ語ペンシルベニア・ドイツ語メノナイト低地ドイツ語古代" + + "ペルシア語プファルツ語フェニキア語ピエモンテ語ポントス・ギリシャ語ポンペイ語プロシア語古期プロバンス語キチェ語チンボラソ高地ケチュア語ラージ" + + "ャスターン語ラパヌイ語ラロトンガ語ロマーニャ語リーフ語ロンボ語ロマーニー語ロツマ語ルシン語ロヴィアナ語アルーマニア語ルワ語サンダウェ語ヤクー" + + "ト語サマリア・アラム語サンブル語ササク語サンターリー語サウラーシュトラ語ンガムバイ語サング語シチリア語スコットランド語サッサリ・サルデーニャ" + + "語南部クルド語セネカ語セナ語セリ語セリクプ語コイラボロ・センニ語古期アイルランド語サモギティア語)タシルハイト語シャン語チャド・アラビア語シ" + + "ダモ語低シレジア語スラヤール語南サーミ語ルレ・サーミ語イナリ・サーミ語スコルト・サーミ語ソニンケ語ソグド語スリナム語セレル語サホ語ザーターフ" + + "リジア語スクマ語スス語シュメール語コモロ語コンゴ・スワヒリ語古典シリア語シリア語シレジア語トゥル語テムネ語テソ語テレーノ語テトゥン語ティグレ" + + "語ティブ語トケラウ語ツァフル語クリンゴン語トリンギット語タリシュ語タマシェク語トンガ語(ニアサ)トク・ピシン語トゥロヨ語タロコ語ツァコン語チ" + + "ムシュ語ムスリム・タタール語トゥンブカ語ツバル語タサワク語トゥヴァ語中央アトラス・タマジクト語ウドムルト語ウガリト語ムブンドゥ語ルートヴァイ" + + "語ヴェネト語ヴェプス語西フラマン語マインフランク語ヴォート語ヴォロ語ヴンジョ語ヴァリス語ウォライタ語ワライ語ワショ語ワルピリ語呉語カルムイク" + + "語メグレル語ソガ語ヤオ語ヤップ語ヤンベン語イエンバ語ニェエンガトゥ語広東語サポテカ語ブリスシンボルゼーラント語ゼナガ語タマージク語(モロッコ" + + "公用語)ズニ語言語的内容なしザザ語現代標準アラビア語標準ドイツ語 (スイス)オーストラリア英語カナダ英語イギリス英語アメリカ英語スペイン語 " + + "(イベリア半島)フレミッシュ語ポルトガル語 (イベリア半島)モルダビア語セルボ・クロアチア語簡体中国語繁体中国語" + +var jaLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000f, 0x001e, 0x0030, 0x0048, 0x0054, 0x0063, 0x0072, + 0x0081, 0x0090, 0x009f, 0x00ae, 0x00c9, 0x00db, 0x00ed, 0x00ff, + 0x010e, 0x011d, 0x012c, 0x013b, 0x014a, 0x0159, 0x016b, 0x017d, + 0x018c, 0x019b, 0x01a7, 0x01b3, 0x01c5, 0x01d7, 0x01e9, 0x01fb, + 0x0207, 0x0216, 0x0222, 0x022e, 0x023d, 0x0243, 0x0258, 0x0267, + 0x0279, 0x0285, 0x0294, 0x02a0, 0x02b5, 0x02c4, 0x02d3, 0x02e2, + 0x02f4, 0x0309, 0x032d, 0x033c, 0x034e, 0x0363, 0x036f, 0x037b, + 0x038a, 0x039c, 0x03ab, 0x03bd, 0x03c9, 0x03db, 0x03ed, 0x03f9, + // Entry 40 - 7F + 0x0411, 0x0426, 0x043b, 0x0444, 0x0450, 0x0465, 0x046e, 0x0483, + 0x0492, 0x04b0, 0x04b9, 0x04c5, 0x04d7, 0x04e3, 0x04ef, 0x0501, + 0x050d, 0x0525, 0x0534, 0x0543, 0x054c, 0x0558, 0x056a, 0x0576, + 0x057f, 0x0597, 0x05a6, 0x05b2, 0x05ca, 0x05d6, 0x05e8, 0x05f7, + 0x0600, 0x0612, 0x062a, 0x0639, 0x064e, 0x0660, 0x066c, 0x067e, + 0x0693, 0x06a2, 0x06b7, 0x06c3, 0x06cf, 0x06db, 0x06e7, 0x06f9, + 0x0708, 0x0717, 0x0726, 0x074c, 0x0772, 0x0784, 0x0790, 0x07a2, + 0x07ae, 0x07c3, 0x07cf, 0x07de, 0x07ed, 0x07ff, 0x080b, 0x081d, + // Entry 80 - BF + 0x0832, 0x0844, 0x0853, 0x0865, 0x0874, 0x0886, 0x0892, 0x08a1, + 0x08b9, 0x08ce, 0x08da, 0x08e9, 0x08f5, 0x0904, 0x0916, 0x0928, + 0x0934, 0x0940, 0x094c, 0x095e, 0x096d, 0x0979, 0x0988, 0x0994, + 0x09a9, 0x09b8, 0x09c4, 0x09d0, 0x09dc, 0x09e5, 0x09fa, 0x0a0c, + 0x0a18, 0x0a24, 0x0a30, 0x0a3f, 0x0a4e, 0x0a5a, 0x0a69, 0x0a7b, + 0x0a8d, 0x0a9c, 0x0aa8, 0x0ab7, 0x0acc, 0x0ad8, 0x0ae7, 0x0af0, + 0x0b05, 0x0b11, 0x0b1d, 0x0b26, 0x0b35, 0x0b41, 0x0b50, 0x0b62, + 0x0b71, 0x0b92, 0x0ba4, 0x0bb0, 0x0bbc, 0x0bcb, 0x0bda, 0x0be9, + // Entry C0 - FF + 0x0c04, 0x0c16, 0x0c1f, 0x0c2e, 0x0c3a, 0x0c4c, 0x0c5b, 0x0c6d, + 0x0c91, 0x0ca0, 0x0cbe, 0x0cdc, 0x0ce5, 0x0cf7, 0x0d0f, 0x0d1b, + 0x0d2d, 0x0d3f, 0x0d48, 0x0d6f, 0x0d78, 0x0d84, 0x0d99, 0x0da8, + 0x0db4, 0x0dc0, 0x0dcf, 0x0dd8, 0x0de7, 0x0df3, 0x0e08, 0x0e20, + 0x0e2c, 0x0e35, 0x0e47, 0x0e50, 0x0e5f, 0x0e86, 0x0ea1, 0x0ead, + 0x0ebc, 0x0ec5, 0x0ed4, 0x0ee6, 0x0eef, 0x0ef8, 0x0f04, 0x0f16, + 0x0f22, 0x0f2e, 0x0f3d, 0x0f4c, 0x0f5b, 0x0f64, 0x0f73, 0x0f85, + 0x0f94, 0x0f9d, 0x0fb2, 0x0fc4, 0x0fd9, 0x0feb, 0x0ffd, 0x1017, + // Entry 100 - 13F + 0x1023, 0x102f, 0x104d, 0x105f, 0x106b, 0x107a, 0x1086, 0x1098, + 0x10aa, 0x10b9, 0x10c8, 0x10d4, 0x10e6, 0x10f8, 0x110d, 0x111c, + 0x1131, 0x114c, 0x1158, 0x1164, 0x1170, 0x117f, 0x118e, 0x11a3, + 0x11b5, 0x11c1, 0x11ca, 0x11ee, 0x1200, 0x121e, 0x122d, 0x123f, + 0x1269, 0x1275, 0x1296, 0x12ab, 0x12bd, 0x12cf, 0x12e1, 0x12f3, + 0x1302, 0x1308, 0x1317, 0x131d, 0x1326, 0x132f, 0x1352, 0x135e, + 0x136d, 0x1379, 0x138b, 0x139d, 0x13b5, 0x13ca, 0x13dc, 0x13e8, + 0x13f4, 0x1409, 0x141e, 0x1427, 0x1436, 0x1442, 0x1457, 0x1463, + // Entry 140 - 17F + 0x146c, 0x1478, 0x1499, 0x14ae, 0x14c0, 0x14cc, 0x14de, 0x14e4, + 0x14f6, 0x1502, 0x1511, 0x1520, 0x1532, 0x1544, 0x1568, 0x1577, + 0x1586, 0x1595, 0x15b0, 0x15cb, 0x15dd, 0x15f2, 0x15fe, 0x160a, + 0x1616, 0x1622, 0x162e, 0x163d, 0x164c, 0x1658, 0x1667, 0x168e, + 0x169a, 0x16a3, 0x16b8, 0x16c1, 0x16d0, 0x16e8, 0x16f7, 0x170f, + 0x1718, 0x172a, 0x173c, 0x1757, 0x1766, 0x1775, 0x1781, 0x1793, + 0x179f, 0x17b1, 0x17c0, 0x17cc, 0x17db, 0x17ea, 0x17f6, 0x1802, + 0x1811, 0x1820, 0x182c, 0x183e, 0x184a, 0x1856, 0x187a, 0x1889, + // Entry 180 - 1BF + 0x189b, 0x18a7, 0x18b9, 0x18c5, 0x18ce, 0x18da, 0x18ec, 0x1901, + 0x1916, 0x1922, 0x192b, 0x193a, 0x1946, 0x194c, 0x1955, 0x1964, + 0x1970, 0x197f, 0x1994, 0x19a6, 0x19bb, 0x19c7, 0x19d0, 0x19df, + 0x19ee, 0x19fa, 0x1a03, 0x1a2a, 0x1a45, 0x1a5d, 0x1a66, 0x1a75, + 0x1a8a, 0x1a93, 0x1aa2, 0x1ab4, 0x1abd, 0x1acc, 0x1adb, 0x1ae7, + 0x1af6, 0x1b05, 0x1b1d, 0x1b2f, 0x1b3b, 0x1b4a, 0x1b65, 0x1b6e, + 0x1b7a, 0x1b83, 0x1b95, 0x1ba4, 0x1bb0, 0x1bc2, 0x1bd4, 0x1be3, + 0x1bfb, 0x1c07, 0x1c16, 0x1c25, 0x1c2e, 0x1c3d, 0x1c49, 0x1c5e, + // Entry 1C0 - 1FF + 0x1c73, 0x1c85, 0x1c91, 0x1c9d, 0x1cac, 0x1cc4, 0x1cd9, 0x1cee, + 0x1d00, 0x1d15, 0x1d21, 0x1d33, 0x1d57, 0x1d78, 0x1d8d, 0x1d9f, + 0x1db1, 0x1dc3, 0x1de1, 0x1df0, 0x1dff, 0x1e17, 0x1e23, 0x1e47, + 0x1e62, 0x1e71, 0x1e83, 0x1e95, 0x1ea1, 0x1ead, 0x1ebf, 0x1ecb, + 0x1ed7, 0x1ee9, 0x1efe, 0x1f07, 0x1f19, 0x1f28, 0x1f43, 0x1f52, + 0x1f5e, 0x1f73, 0x1f8e, 0x1fa0, 0x1fac, 0x1fbb, 0x1fd3, 0x1ff7, + 0x2009, 0x2015, 0x201e, 0x2027, 0x2036, 0x2054, 0x206f, 0x2085, + 0x209a, 0x20a6, 0x20c1, 0x20cd, 0x20df, 0x20f1, 0x2100, 0x2115, + // Entry 200 - 23F + 0x212d, 0x2148, 0x2157, 0x2163, 0x2172, 0x217e, 0x2187, 0x21a2, + 0x21ae, 0x21b7, 0x21c9, 0x21d5, 0x21f0, 0x2202, 0x220e, 0x221d, + 0x2229, 0x2235, 0x223e, 0x224d, 0x225c, 0x226b, 0x2277, 0x2286, + 0x2295, 0x22a7, 0x22bc, 0x22cb, 0x22dd, 0x22f4, 0x2309, 0x2318, + 0x2324, 0x2333, 0x2342, 0x2360, 0x2372, 0x237e, 0x238d, 0x239c, + 0x23c3, 0x23d5, 0x23e4, 0x23f6, 0x23ff, 0x240b, 0x241a, 0x2429, + 0x243b, 0x2453, 0x2462, 0x246e, 0x247d, 0x248c, 0x249e, 0x24aa, + 0x24b6, 0x24c5, 0x24cb, 0x24dd, 0x24ec, 0x24f5, 0x24fe, 0x250a, + // Entry 240 - 27F + 0x2519, 0x2528, 0x2540, 0x2549, 0x2558, 0x256d, 0x257f, 0x258b, + 0x25b4, 0x25bd, 0x25d2, 0x25db, 0x25f6, 0x25f6, 0x25f6, 0x2614, + 0x262f, 0x263e, 0x2650, 0x2662, 0x2662, 0x2686, 0x2686, 0x2686, + 0x2686, 0x2686, 0x2686, 0x269b, 0x269b, 0x26c2, 0x26d4, 0x26f2, + 0x2701, 0x2710, +} // Size: 1244 bytes + +var kaLangStr string = "" + // Size: 10123 bytes + "აფარიაფხაზურიავესტურიაფრიკაანსიაკანიამჰარულიარაგონულიარაბულიასამურიაიმარ" + + "ააზერბაიჯანულიბაშკირულიბელორუსულიბულგარულიბამბარაბენგალურიტიბეტურიბრეტ" + + "ონულიბოსნიურიკატალანურიჩეჩნურიკორსიკულიკრიჩეხურისაეკლესიო სლავურიჩუვაშ" + + "ურიუელსურიდანიურიგერმანულიდივეჰიძონგკხაევებერძნულიინგლისურიესპერანტოეს" + + "პანურიესტონურიბასკურისპარსულიფინურიფიჯიფარერულიფრანგულიდასავლეთფრიზიულ" + + "იირლანდიურიშოტლანდიური გელურიგალისიურიგუარანიგუჯარათიმენურიჰაუსაებრაულ" + + "იჰინდიხორვატულიჰაიტიურიუნგრულისომხურიინტერლინგუალურიინდონეზიურიინტერლი" + + "ნგიიგბოსიჩუანის იიდოისლანდიურიიტალიურიინუკტიტუტიიაპონურიიავურიქართულიკ" + + "ონგოკიკუიუყაზახურიდასავლეთ გრენლანდიურიქმერულიკანადაკორეულიკანურიქაშმი" + + "რულიქურთულიკომიკორნულიყირგიზულილათინურილუქსემბურგულიგანდალიმბურგულილინ" + + "გალალაოსურილიტვურილუბა-კატანგალატვიურიმალაგასიურიმაორიმაკედონურიმალაია" + + "ლამურიმონღოლურიმარათჰიმალაიურიმალტურიბირმულინაურუჩრდილოეთ ნდებელენეპალ" + + "ურინიდერლანდურინორვეგიული ნიუნორსკინორვეგიული ბუკმოლინავახონიანჯაოქსიტ" + + "ანურიოჯიბვეორომოორიაოსურიპენჯაბურიპალიპოლონურიპუშტუპორტუგალიურიკეჩუარე" + + "ტორომანულირუნდირუმინულირუსულიკინიარუანდასანსკრიტისარდინიულისინდჰურიჩრდ" + + "ილოეთ საამურისანგოსინჰალურისლოვაკურისლოვენურისამოაშონასომალიურიალბანურ" + + "ისერბულისამხრეთ სოთოს ენასუნდურიშვედურისუაჰილიტამილურიტელუგუტაჯიკურიტა" + + "ითიგრინიათურქმენულიტსვანატონგანურითურქულითათრულიუიღურულიუკრაინულიურდუუ" + + "ზბეკურივიეტნამურივოლოფურიქჰოსაიდიშიიორუბაჩინურიზულუაჩეხურიაჩოლიადანგმე" + + "ადიღეურიაღემიაინუურიაქადურიალეუტურისამხრეთ ალთაურიძველი ინგლისურიანგიკ" + + "აარამეულიმაპუდუნგუნიარაპაჰოარავაკიასუასტურიულიავადიბელუჯიბალინურიბასაბ" + + "ამუნიბეჯაბემბაბენადასავლეთ ბელუჯიბოჯპურიბრაჯიბოდობურიატულიბილინიკაიუგა" + + "ჩიგაჩიბჩამარიულიჩეროკისორანი ქურთულიკოპტურიყირიმულ-თურქულიკაშუბურიდაკო" + + "ტადარგუულიტაიტადელავარულიდოგრიბიდინკაზარმადოგრიქვემოსორბულიდუალადიოლად" + + "იულაემბუეფიკიძველეგვიპტურიევონდოფილიპინურიფონიძველი ფრანგულიჩრდილოფრიზ" + + "იულიაღმოსავლეთფრიზიულიფრიულურიგაგაუზურიგბაიაგეეზიძველი ზემოგერმანულიგო" + + "ნდიგოთურიძველი ბერძნულიშვეიცარიული გერმანულიგუსიიჰავაიურიხეთური ენაზემ" + + "ოსორბულიიბანიიბიბიოინგუშურილოჟბანინგომბაკიმაშამიიუდეო-სპარსულიიუდეო-არ" + + "აბულიყარაყალფახურიკაბილურიკაჩინიკამბაყაბარდოულიმაკონდეკაბუვერდიანუკოირ" + + "ა-ჩიინიკალენჯინიკიმბუნდუკომი-პერმიაკულიკონკანიკპელეყარაჩაულ-ბალყარულიკ" + + "არელიურიკურუქიშამბალაბაფიაყუმუხურიკუტენაილადინოლანგილანდალამბალეზგიური" + + "ლაკოტამონგოლოზიჩრდილოეთ ლურილუისენიოლუნდალუომიზოლუჰიამაფამაგაჰიმაითილი" + + "მასაიმაბამოქშამენდემერუმორისიენიმაქუვა-მეეტომეტა’ ენამანჯურიულიმანიპურ" + + "იმოჰაუკურიმუნდანგიკრიკიმირანდულიმარვარიმიენეერზიამაზანდერანულინეაპოლიტ" + + "ანურინამაქვემოგერმანულინევარიკვასიონოღაურიძველსკანდინავიურინკონუერიკლა" + + "სიკური ნევარულინიამვეზინიანკოლენიორონზიმაფალაურიძველი სპარსულიფინიკიურ" + + "იძველი პროვანსულიკიჩერაჯასთანირაპანუირაროტონგულირომბობოშურირუაიაკუტური" + + "სამარიულ-არამეულისამბურუსანგუსიცილიურისამხრეთ ქურთულისენეკასენასელკუპუ" + + "რიკოირაბორო-სენიძველი ირლანდიურიშილჰაშანიჩადური არაბულისამხრეთ საამური" + + "ლულე-საამურიინარი-საამურისკოლტ-საამურიშუმერულიკომორულიკონგოს სუაჰილიკლ" + + "ასიკური სირიულისირიულიტესოთიგრეკლინგონიტასავაქიტუვაცენტრალური მოროკოს " + + "ტამაზიგხტიუდმურტულიუგარითულიუცნობი ენავაივუნჯოველაითავალპირიყალმუხურის" + + "ოგაკანტონურიბლისსიმბოლოებიზენაგასტანდარტული მაროკოული ტამაზიგხტილინგვი" + + "სტური შიგთავსი არ არისზაზაკითანამედროვე სტანდარტული არაბულიავსტრიული გ" + + "ერმანულიშვეიცარიული ზემოგერმანულიავსტრალიური ინგლისურიკანადური ინგლისუ" + + "რიბრიტანული ინგლისურიამერიკული ინგლისურილათინურ ამერიკული ესპანურიევრო" + + "პული ესპანურიმექსიკური ესპანურიკანადური ფრანგულიშვეიცარიული ფრანგულიქვ" + + "ემოსაქსონურიფლამანდიურიბრაზილიური პორტუგალიურიევროპული პორტუგალიურიმოლ" + + "დავურისერბულ-ხორვატულიგამარტივებული ჩინურიტრადიციული ჩინური" + +var kaLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000f, 0x0027, 0x003f, 0x005d, 0x006c, 0x0084, 0x009f, + 0x00b4, 0x00c9, 0x00c9, 0x00db, 0x0102, 0x011d, 0x013b, 0x0156, + 0x0156, 0x016b, 0x0186, 0x019e, 0x01b9, 0x01d1, 0x01ef, 0x0204, + 0x0204, 0x021f, 0x0228, 0x023a, 0x026b, 0x0283, 0x0298, 0x02ad, + 0x02c8, 0x02da, 0x02ef, 0x02f8, 0x0310, 0x032b, 0x0346, 0x035e, + 0x0376, 0x038b, 0x03a3, 0x03a3, 0x03b5, 0x03c1, 0x03d9, 0x03f1, + 0x0421, 0x043f, 0x0473, 0x048e, 0x04a3, 0x04bb, 0x04cd, 0x04dc, + 0x04f1, 0x0500, 0x0500, 0x051b, 0x0533, 0x0548, 0x055d, 0x055d, + // Entry 40 - 7F + 0x058a, 0x05ab, 0x05c9, 0x05d5, 0x05f1, 0x05f1, 0x05fa, 0x0618, + 0x0630, 0x064e, 0x0666, 0x0678, 0x068d, 0x069c, 0x06ae, 0x06ae, + 0x06c6, 0x0703, 0x0718, 0x072a, 0x073f, 0x0751, 0x076c, 0x0781, + 0x078d, 0x07a2, 0x07bd, 0x07d5, 0x07fc, 0x080b, 0x0829, 0x083e, + 0x0853, 0x0868, 0x088a, 0x08a2, 0x08c3, 0x08c3, 0x08d2, 0x08f0, + 0x0914, 0x092f, 0x0944, 0x095c, 0x0971, 0x0986, 0x0995, 0x09c3, + 0x09db, 0x09db, 0x09ff, 0x0a39, 0x0a6d, 0x0a6d, 0x0a7f, 0x0a91, + 0x0aaf, 0x0ac1, 0x0ad0, 0x0adc, 0x0aeb, 0x0b06, 0x0b12, 0x0b2a, + // Entry 80 - BF + 0x0b39, 0x0b5d, 0x0b6c, 0x0b90, 0x0b9f, 0x0bb7, 0x0bc9, 0x0bea, + 0x0c05, 0x0c23, 0x0c3b, 0x0c69, 0x0c78, 0x0c93, 0x0cae, 0x0cc9, + 0x0cd8, 0x0ce4, 0x0cff, 0x0d17, 0x0d2c, 0x0d2c, 0x0d5b, 0x0d70, + 0x0d85, 0x0d9a, 0x0db2, 0x0dc4, 0x0ddc, 0x0de5, 0x0dfd, 0x0e1b, + 0x0e2d, 0x0e48, 0x0e5d, 0x0e5d, 0x0e72, 0x0e72, 0x0e8a, 0x0ea5, + 0x0eb1, 0x0ec9, 0x0ec9, 0x0ee7, 0x0ee7, 0x0ee7, 0x0eff, 0x0f0e, + 0x0f1d, 0x0f2f, 0x0f2f, 0x0f41, 0x0f4d, 0x0f62, 0x0f71, 0x0f86, + 0x0f9e, 0x0f9e, 0x0f9e, 0x0fad, 0x0fc2, 0x0fd7, 0x0fd7, 0x0fef, + // Entry C0 - FF + 0x0fef, 0x101a, 0x1045, 0x1057, 0x106f, 0x1090, 0x1090, 0x10a5, + 0x10a5, 0x10ba, 0x10ba, 0x10ba, 0x10c3, 0x10c3, 0x10de, 0x10de, + 0x10ed, 0x10ff, 0x1117, 0x1117, 0x1123, 0x1135, 0x1135, 0x1135, + 0x1141, 0x1150, 0x1150, 0x115c, 0x115c, 0x115c, 0x1187, 0x119c, + 0x119c, 0x119c, 0x119c, 0x119c, 0x119c, 0x119c, 0x119c, 0x11ab, + 0x11ab, 0x11b7, 0x11b7, 0x11d2, 0x11d2, 0x11d2, 0x11e4, 0x11e4, + 0x11e4, 0x11e4, 0x11f6, 0x11f6, 0x11f6, 0x1202, 0x1211, 0x1211, + 0x1211, 0x1226, 0x1226, 0x1226, 0x1226, 0x1238, 0x1238, 0x1260, + // Entry 100 - 13F + 0x1275, 0x1275, 0x12a0, 0x12b8, 0x12ca, 0x12e2, 0x12f1, 0x130f, + 0x130f, 0x1324, 0x1333, 0x1342, 0x1351, 0x1375, 0x1375, 0x1384, + 0x1384, 0x1393, 0x13a2, 0x13a2, 0x13ae, 0x13bd, 0x13bd, 0x13e4, + 0x13e4, 0x13e4, 0x13e4, 0x13e4, 0x13f6, 0x13f6, 0x13f6, 0x1414, + 0x1414, 0x1420, 0x1420, 0x1420, 0x1448, 0x1448, 0x1472, 0x14a8, + 0x14c0, 0x14c0, 0x14db, 0x14db, 0x14db, 0x14ea, 0x14ea, 0x14f9, + 0x14f9, 0x14f9, 0x14f9, 0x1530, 0x1530, 0x153f, 0x153f, 0x1551, + 0x1551, 0x1579, 0x15b6, 0x15b6, 0x15b6, 0x15c5, 0x15c5, 0x15c5, + // Entry 140 - 17F + 0x15c5, 0x15dd, 0x15dd, 0x15dd, 0x15f9, 0x15f9, 0x161a, 0x161a, + 0x161a, 0x1629, 0x163b, 0x163b, 0x1653, 0x1653, 0x1653, 0x1668, + 0x167a, 0x1692, 0x16ba, 0x16df, 0x16df, 0x1706, 0x171e, 0x1730, + 0x1730, 0x173f, 0x173f, 0x175d, 0x175d, 0x175d, 0x1772, 0x1796, + 0x1796, 0x1796, 0x1796, 0x1796, 0x1796, 0x17b5, 0x17b5, 0x17b5, + 0x17b5, 0x17d0, 0x17e8, 0x1813, 0x1828, 0x1828, 0x1837, 0x186b, + 0x186b, 0x186b, 0x1886, 0x1898, 0x18ad, 0x18bc, 0x18bc, 0x18d4, + 0x18e9, 0x18fb, 0x190a, 0x1919, 0x1928, 0x1940, 0x1940, 0x1940, + // Entry 180 - 1BF + 0x1940, 0x1952, 0x1952, 0x1961, 0x196d, 0x1992, 0x1992, 0x1992, + 0x19aa, 0x19b9, 0x19c2, 0x19ce, 0x19dd, 0x19dd, 0x19dd, 0x19dd, + 0x19e9, 0x19fb, 0x1a10, 0x1a10, 0x1a10, 0x1a1f, 0x1a2b, 0x1a3a, + 0x1a3a, 0x1a49, 0x1a55, 0x1a70, 0x1a70, 0x1a92, 0x1aab, 0x1aab, + 0x1aab, 0x1ac9, 0x1ae1, 0x1afc, 0x1afc, 0x1afc, 0x1b14, 0x1b14, + 0x1b23, 0x1b3e, 0x1b53, 0x1b53, 0x1b62, 0x1b71, 0x1b98, 0x1b98, + 0x1bbf, 0x1bcb, 0x1bf5, 0x1c07, 0x1c07, 0x1c07, 0x1c07, 0x1c19, + 0x1c19, 0x1c2e, 0x1c61, 0x1c61, 0x1c6a, 0x1c6a, 0x1c79, 0x1cad, + // Entry 1C0 - 1FF + 0x1cc5, 0x1cdd, 0x1cec, 0x1cfb, 0x1cfb, 0x1cfb, 0x1cfb, 0x1d10, + 0x1d10, 0x1d10, 0x1d10, 0x1d10, 0x1d10, 0x1d10, 0x1d38, 0x1d38, + 0x1d53, 0x1d53, 0x1d53, 0x1d53, 0x1d53, 0x1d81, 0x1d8d, 0x1d8d, + 0x1da8, 0x1dbd, 0x1dde, 0x1dde, 0x1dde, 0x1ded, 0x1dff, 0x1dff, + 0x1dff, 0x1dff, 0x1dff, 0x1e08, 0x1e08, 0x1e20, 0x1e51, 0x1e66, + 0x1e66, 0x1e66, 0x1e66, 0x1e66, 0x1e75, 0x1e90, 0x1e90, 0x1e90, + 0x1ebb, 0x1ecd, 0x1ed9, 0x1ed9, 0x1ef4, 0x1f1c, 0x1f4a, 0x1f4a, + 0x1f59, 0x1f65, 0x1f8d, 0x1f8d, 0x1f8d, 0x1f8d, 0x1fb8, 0x1fda, + // Entry 200 - 23F + 0x1fff, 0x2024, 0x2024, 0x2024, 0x2024, 0x2024, 0x2024, 0x2024, + 0x2024, 0x2024, 0x203c, 0x2054, 0x207c, 0x20ad, 0x20c2, 0x20c2, + 0x20c2, 0x20c2, 0x20ce, 0x20ce, 0x20ce, 0x20dd, 0x20dd, 0x20dd, + 0x20dd, 0x20f5, 0x20f5, 0x20f5, 0x20f5, 0x20f5, 0x20f5, 0x20f5, + 0x20f5, 0x20f5, 0x20f5, 0x20f5, 0x20f5, 0x20f5, 0x210d, 0x2119, + 0x216c, 0x2187, 0x21a2, 0x21a2, 0x21be, 0x21c7, 0x21c7, 0x21c7, + 0x21c7, 0x21c7, 0x21c7, 0x21c7, 0x21d6, 0x21d6, 0x21eb, 0x21eb, + 0x21eb, 0x2200, 0x2200, 0x221b, 0x221b, 0x2227, 0x2227, 0x2227, + // Entry 240 - 27F + 0x2227, 0x2227, 0x2227, 0x2242, 0x2242, 0x226c, 0x226c, 0x227e, + 0x22da, 0x22da, 0x2328, 0x233a, 0x2393, 0x2393, 0x23ca, 0x2413, + 0x2450, 0x2484, 0x24bb, 0x24f2, 0x253c, 0x256d, 0x25a1, 0x25a1, + 0x25d2, 0x260c, 0x2636, 0x2657, 0x269a, 0x26d7, 0x26f2, 0x2720, + 0x275a, 0x278b, +} // Size: 1244 bytes + +var kkLangStr string = "" + // Size: 5518 bytes + "абхаз тіліафрикаанс тіліакан тіліамхар тіліараб тіліассам тіліәзірбайжан" + + " тілібашқұрт тілібеларусь тіліболгар тілібамбара тілібенгал тілітибет ті" + + "лібретон тілібосния тілікаталан тілішешен тілікорсика тілічех тілічуваш" + + " тіліваллий тілідат тілінеміс тілідзонг-кэ тіліэве тілігрек тіліағылшын " + + "тіліэсперанто тіліиспан тіліэстон тілібаск тіліпарсы тіліфин тіліфиджи " + + "тіліфарер тіліфранцуз тілібатыс фриз тіліирланд тілігалисия тілігуарани" + + " тілігуджарати тілімэнс тіліхауса тіліиврит тіліхинди тіліхорват тілігаи" + + "ти тілівенгр тіліармян тіліиндонезия тіліигбо тілісычуан и тіліисланд т" + + "іліитальян тіліинуктитут тіліжапон тіліява тілігрузин тілікикуйю тіліқа" + + "зақ тілікалаалисут тілікхмер тіліканнада тілікәріс тілікашмир тілікүрд " + + "тілікорн тіліқырғыз тілілатын тілілюксембург тіліганда тілілингала тілі" + + "лаос тілілитва тілілуба-катанга тілілатыш тілімалагаси тілімаори тіліма" + + "кедон тілімалаялам тілімоңғол тілімаратхи тілімалай тілімальта тілібирм" + + "а тілісолтүстік ндебеле тілінепал тілінидерланд тілінорвегиялық нюнорск" + + " тілінорвегиялық букмол тіліоромо тіліория тіліпенджаб тіліполяк тіліпуш" + + "ту тіліпортугал тілікечуа тіліроманш тілірунди тілірумын тіліорыс тілік" + + "иньяруанда тілісанскрит тілісиндхи тілісолтүстік саам тілісанго тілісин" + + "гал тілісловак тілісловен тілішона тілісомали тіліалбан тілісерб тілішв" + + "ед тілісуахили тілітамил тілітелугу тілітәжік тілітай тілітигринья тілі" + + "түрікмен тілітонган тілітүрік тілітатар тіліұйғыр тіліукраин тіліурду т" + + "іліөзбек тілівьетнам тіліволоф тілікхоса тілійоруба тіліқытай тілізулу " + + "тіліагхем тілімапуче тіліасу тілібемба тілібена тілібатыс балучи тілібо" + + "до тілікига тілічероки тілісорани тілітаита тілізарма тілітөменгі лужиц" + + "а тілідуала тілідиола тіліембу тіліфилиппин тілігагауз тілішвейцариялық" + + " неміс тілігусии тілігавайи тіліжоғарғы лужица тілінгомба тілімачаме тіл" + + "ікабил тілікамба тілімаконде тілікабувердиана тілікойра чини тілікаленж" + + "ин тілікоми-пермяк тіліконкани тілішамбала тілібафиа тіліланги тілілако" + + "та тілісолтүстік люри тілілуо тілілухиа тілімасай тілімеру тіліморисиен" + + " тілімакуа-меетто тілімета тілімогавк тілімунданг тілімазандеран тілінам" + + "а тілітөменгі неміс тіліквасио тілінко тілінуэр тілінианколе тілікиче т" + + "іліромбо тіліруа тілісамбуру тілісангу тіліоңтүстік күрд тілісена тілік" + + "ойраборо сенни тіліташелхит тіліоңтүстік саам тілілуле саам тіліинари с" + + "аам тілісколт саамконго суахили тілітесо тілітасавак тіліорталық атлас " + + "тамасагихт тілібелгісіз тілвай тілівунджо тілівальбири тілісога тілімар" + + "окколық стандартты тамазигхт тілітілдік мазмұны жоққазіргі стандартты а" + + "раб тіліавстриялық неміс тілішвейцариялық жоғарғы неміс тіліавстралиялы" + + "қ ағылшын тіліканадалық ағылшын тілібританиялық ағылшын тіліамерикандық" + + " ағылшын тілілатын американдық испан тіліибериялық испан тілімексикалық " + + "испан тіліканадалық француз тілішвейцариялық француз тілітөменгі саксон" + + " тіліфламанд тілібразилиялық португал тіліеуропалық португал тілімолдова" + + "н тіліжеңілдетілген қытай тілідәстүрлі қытай тілі" + +var kkLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0013, 0x0013, 0x002e, 0x003f, 0x0052, 0x0052, + 0x0063, 0x0076, 0x0076, 0x0076, 0x0093, 0x00aa, 0x00c3, 0x00d8, + 0x00d8, 0x00ef, 0x0104, 0x0117, 0x012c, 0x0141, 0x0158, 0x016b, + 0x016b, 0x0182, 0x0182, 0x0191, 0x0191, 0x01a4, 0x01b9, 0x01c8, + 0x01db, 0x01db, 0x01f3, 0x0202, 0x0213, 0x022a, 0x0245, 0x0258, + 0x026b, 0x027c, 0x028f, 0x028f, 0x029e, 0x02b1, 0x02c4, 0x02db, + 0x02f7, 0x030c, 0x030c, 0x0323, 0x033a, 0x0355, 0x0366, 0x0379, + 0x038c, 0x039f, 0x039f, 0x03b4, 0x03c7, 0x03da, 0x03ed, 0x03ed, + // Entry 40 - 7F + 0x03ed, 0x0408, 0x0408, 0x0419, 0x0431, 0x0431, 0x0431, 0x0446, + 0x045d, 0x0478, 0x048b, 0x049a, 0x04af, 0x04af, 0x04c4, 0x04c4, + 0x04d7, 0x04f4, 0x0507, 0x051e, 0x0531, 0x0531, 0x0546, 0x0557, + 0x0557, 0x0568, 0x057d, 0x0590, 0x05ad, 0x05c0, 0x05c0, 0x05d7, + 0x05e8, 0x05fb, 0x061b, 0x062e, 0x0647, 0x0647, 0x065a, 0x0671, + 0x068a, 0x069f, 0x06b6, 0x06c9, 0x06de, 0x06f1, 0x06f1, 0x071b, + 0x072e, 0x072e, 0x0749, 0x0777, 0x07a3, 0x07a3, 0x07a3, 0x07a3, + 0x07a3, 0x07a3, 0x07b6, 0x07c7, 0x07c7, 0x07de, 0x07de, 0x07f1, + // Entry 80 - BF + 0x0804, 0x081d, 0x0830, 0x0845, 0x0858, 0x086b, 0x087c, 0x089b, + 0x08b4, 0x08b4, 0x08c9, 0x08ed, 0x0900, 0x0915, 0x092a, 0x093f, + 0x093f, 0x0950, 0x0965, 0x0978, 0x0989, 0x0989, 0x0989, 0x0989, + 0x099a, 0x09b1, 0x09c4, 0x09d9, 0x09ec, 0x09fb, 0x0a14, 0x0a2d, + 0x0a2d, 0x0a42, 0x0a55, 0x0a55, 0x0a68, 0x0a68, 0x0a7b, 0x0a90, + 0x0aa1, 0x0ab4, 0x0ab4, 0x0acb, 0x0acb, 0x0acb, 0x0ade, 0x0af1, + 0x0af1, 0x0b06, 0x0b06, 0x0b19, 0x0b2a, 0x0b2a, 0x0b2a, 0x0b2a, + 0x0b2a, 0x0b2a, 0x0b2a, 0x0b3d, 0x0b3d, 0x0b3d, 0x0b3d, 0x0b3d, + // Entry C0 - FF + 0x0b3d, 0x0b3d, 0x0b3d, 0x0b3d, 0x0b3d, 0x0b52, 0x0b52, 0x0b52, + 0x0b52, 0x0b52, 0x0b52, 0x0b52, 0x0b61, 0x0b61, 0x0b61, 0x0b61, + 0x0b61, 0x0b61, 0x0b61, 0x0b61, 0x0b61, 0x0b61, 0x0b61, 0x0b61, + 0x0b61, 0x0b74, 0x0b74, 0x0b85, 0x0b85, 0x0b85, 0x0ba5, 0x0ba5, + 0x0ba5, 0x0ba5, 0x0ba5, 0x0ba5, 0x0ba5, 0x0ba5, 0x0ba5, 0x0ba5, + 0x0ba5, 0x0bb6, 0x0bb6, 0x0bb6, 0x0bb6, 0x0bb6, 0x0bb6, 0x0bb6, + 0x0bb6, 0x0bb6, 0x0bb6, 0x0bb6, 0x0bb6, 0x0bc7, 0x0bc7, 0x0bc7, + 0x0bc7, 0x0bc7, 0x0bc7, 0x0bc7, 0x0bc7, 0x0bdc, 0x0bdc, 0x0bf1, + // Entry 100 - 13F + 0x0bf1, 0x0bf1, 0x0bf1, 0x0bf1, 0x0bf1, 0x0bf1, 0x0c04, 0x0c04, + 0x0c04, 0x0c04, 0x0c04, 0x0c17, 0x0c17, 0x0c3b, 0x0c3b, 0x0c4e, + 0x0c4e, 0x0c61, 0x0c61, 0x0c61, 0x0c72, 0x0c72, 0x0c72, 0x0c72, + 0x0c72, 0x0c72, 0x0c72, 0x0c72, 0x0c72, 0x0c72, 0x0c72, 0x0c8b, + 0x0c8b, 0x0c8b, 0x0c8b, 0x0c8b, 0x0c8b, 0x0c8b, 0x0c8b, 0x0c8b, + 0x0c8b, 0x0c8b, 0x0ca0, 0x0ca0, 0x0ca0, 0x0ca0, 0x0ca0, 0x0ca0, + 0x0ca0, 0x0ca0, 0x0ca0, 0x0ca0, 0x0ca0, 0x0ca0, 0x0ca0, 0x0ca0, + 0x0ca0, 0x0ca0, 0x0ccc, 0x0ccc, 0x0ccc, 0x0cdf, 0x0cdf, 0x0cdf, + // Entry 140 - 17F + 0x0cdf, 0x0cf4, 0x0cf4, 0x0cf4, 0x0cf4, 0x0cf4, 0x0d18, 0x0d18, + 0x0d18, 0x0d18, 0x0d18, 0x0d18, 0x0d18, 0x0d18, 0x0d18, 0x0d18, + 0x0d2d, 0x0d42, 0x0d42, 0x0d42, 0x0d42, 0x0d42, 0x0d55, 0x0d55, + 0x0d55, 0x0d68, 0x0d68, 0x0d68, 0x0d68, 0x0d68, 0x0d7f, 0x0da0, + 0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0da0, 0x0dbc, 0x0dbc, 0x0dbc, + 0x0dbc, 0x0dd5, 0x0dd5, 0x0df3, 0x0e0a, 0x0e0a, 0x0e0a, 0x0e0a, + 0x0e0a, 0x0e0a, 0x0e0a, 0x0e0a, 0x0e21, 0x0e34, 0x0e34, 0x0e34, + 0x0e34, 0x0e34, 0x0e47, 0x0e47, 0x0e47, 0x0e47, 0x0e47, 0x0e47, + // Entry 180 - 1BF + 0x0e47, 0x0e5c, 0x0e5c, 0x0e5c, 0x0e5c, 0x0e80, 0x0e80, 0x0e80, + 0x0e80, 0x0e80, 0x0e8f, 0x0e8f, 0x0ea2, 0x0ea2, 0x0ea2, 0x0ea2, + 0x0ea2, 0x0ea2, 0x0ea2, 0x0ea2, 0x0ea2, 0x0eb5, 0x0eb5, 0x0eb5, + 0x0eb5, 0x0eb5, 0x0ec6, 0x0edf, 0x0edf, 0x0eff, 0x0f10, 0x0f10, + 0x0f10, 0x0f10, 0x0f10, 0x0f25, 0x0f25, 0x0f25, 0x0f3c, 0x0f3c, + 0x0f3c, 0x0f3c, 0x0f3c, 0x0f3c, 0x0f3c, 0x0f3c, 0x0f59, 0x0f59, + 0x0f59, 0x0f6a, 0x0f8c, 0x0f8c, 0x0f8c, 0x0f8c, 0x0f8c, 0x0fa1, + 0x0fa1, 0x0fa1, 0x0fa1, 0x0fa1, 0x0fb0, 0x0fb0, 0x0fc1, 0x0fc1, + // Entry 1C0 - 1FF + 0x0fc1, 0x0fda, 0x0fda, 0x0fda, 0x0fda, 0x0fda, 0x0fda, 0x0fda, + 0x0fda, 0x0fda, 0x0fda, 0x0fda, 0x0fda, 0x0fda, 0x0fda, 0x0fda, + 0x0fda, 0x0fda, 0x0fda, 0x0fda, 0x0fda, 0x0fda, 0x0feb, 0x0feb, + 0x0feb, 0x0feb, 0x0feb, 0x0feb, 0x0feb, 0x0ffe, 0x0ffe, 0x0ffe, + 0x0ffe, 0x0ffe, 0x0ffe, 0x100d, 0x100d, 0x100d, 0x100d, 0x1024, + 0x1024, 0x1024, 0x1024, 0x1024, 0x1037, 0x1037, 0x1037, 0x1037, + 0x1059, 0x1059, 0x106a, 0x106a, 0x106a, 0x1090, 0x1090, 0x1090, + 0x10a9, 0x10a9, 0x10a9, 0x10a9, 0x10a9, 0x10a9, 0x10cb, 0x10e5, + // Entry 200 - 23F + 0x1101, 0x1114, 0x1114, 0x1114, 0x1114, 0x1114, 0x1114, 0x1114, + 0x1114, 0x1114, 0x1114, 0x1114, 0x1136, 0x1136, 0x1136, 0x1136, + 0x1136, 0x1136, 0x1147, 0x1147, 0x1147, 0x1147, 0x1147, 0x1147, + 0x1147, 0x1147, 0x1147, 0x1147, 0x1147, 0x1147, 0x1147, 0x1147, + 0x1147, 0x1147, 0x1147, 0x1147, 0x1147, 0x1147, 0x115e, 0x115e, + 0x1195, 0x1195, 0x1195, 0x1195, 0x11ac, 0x11bb, 0x11bb, 0x11bb, + 0x11bb, 0x11bb, 0x11bb, 0x11bb, 0x11d0, 0x11d0, 0x11d0, 0x11d0, + 0x11d0, 0x11e9, 0x11e9, 0x11e9, 0x11e9, 0x11fa, 0x11fa, 0x11fa, + // Entry 240 - 27F + 0x11fa, 0x11fa, 0x11fa, 0x11fa, 0x11fa, 0x11fa, 0x11fa, 0x11fa, + 0x123f, 0x123f, 0x1261, 0x1261, 0x1296, 0x1296, 0x12be, 0x12f9, + 0x1329, 0x1353, 0x1381, 0x13af, 0x13e4, 0x140a, 0x1432, 0x1432, + 0x145c, 0x148c, 0x14b0, 0x14c7, 0x14f7, 0x1523, 0x153c, 0x153c, + 0x156a, 0x158e, +} // Size: 1244 bytes + +var kmLangStr string = "" + // Size: 5497 bytes + "ភាសាអាហ្វារអាប់ខាហ៊្សានភាសាអាវែស្តង់អាហ្វ្រិកានអាកានអាមហារីចភាសាអារ៉ាហ្គ" + + "ោនអារ៉ាប់អាសាមីសភាសាអីម៉ារ៉ាអាហ៊្សែរបែហ្សង់បែស្កឺបេឡារុស្សប៊ុលហ្ការីបា" + + "ម្បារាបង់ក្លាដែសទីបេប្រីស្តុនបូស្នីកាតាឡានឈីឆេនកូស៊ីខានឆេកឈូវ៉ាសវេលដាណ" + + "ឺម៉ាកអាល្លឺម៉ង់ដុងខាអ៊ីវក្រិចអង់គ្លេសអេស្ពេរ៉ាន់តូអេស្ប៉ាញអេស្តូនីបាស្" + + "កេភឺសៀនហ្វាំងឡង់ហ៊្វីជីហ្វារូសបារាំងហ្វ្រីស៊ានខាងលិចអៀរឡង់ភាសាហ្កែលិគ " + + "(gd)ហ្គាលីស្យានហ្គូរ៉ានីហ្កុយ៉ារាទីមេនហូសាអ៊ីស្រាអែលហិណ្ឌីក្រូអាតហៃទីហុង" + + "គ្រីអារមេនីឥណ្ឌូណេស៊ីអ៊ីកបូស៊ីឈាន់យីអ៊ីស្លង់អ៊ីតាលីអ៊ីនុកទីទុតជប៉ុនជ្វ" + + "ាហ្សក\u200bហ្ស៊ីគីគូយូកាហ្សាក់ស្តង់់កាឡាលលីស៊ុតខ្មែរកន្នដកូរ៉េកាស្មៀរឃ" + + "ឺដកូនីសគៀរហ្គីស្តង់ឡាតំាងលុចហ្សំបួរហ្គាន់ដាលីនកាឡាឡាវលីទុយអានីលូបាកាតា" + + "នហ្គាឡាតវីម៉ាឡាហ្គាស៊ីម៉ោរីម៉ាសេដូនីមលយាល័មម៉ុងហ្គោលីម៉ារ៉ាធីម៉ាឡេស៊ីម" + + "៉ាល់តាភូមានេបេលេខាងជើងនេប៉ាល់ហុល្លង់ន័រវែស នីនូសន័រវែស បុកម៉ាល់អូរ៉ូម៉" + + "ូអូរីយ៉ាបឹនជាពិប៉ូឡូញបាស្តូព័រទុយហ្កាល់កេទជួអារ៉ូម៉ង់រូន្ឌីរូម៉ានីរុស្" + + "ស៊ីគិនយ៉ាវ៉ាន់ដាសំស្ក្រឹតស៊ីនឌីសាមីខាងជើងសានហ្គោស្រីលង្កាស្លូវ៉ាគីស្លូ" + + "វ៉ានីភាសាសាមូអាសូណាសូម៉ាលីអាល់បានីស៊ែបស៊ូដង់ស៊ុយអែដស្វាហ៊ីលីតាមីលតេលុគ" + + "ុតាដហ្សីគីស្តង់ថៃទីរិនយាទួគមេនីស្តង់តុងហ្គោទួរគីតាតាអ៊ុយហ្គឺរអ៊ុយក្រែន" + + "អ៊ូរឌូអ៊ូហ្សបេគីស្តង់វៀតណាមវូឡុហ្វឃសាភាសាយីឌីហ្សយរូបាភាសាចួងចិនសូលូអាហ" + + "្គីមម៉ាពូឈីអាស៊ូបេមបាបេណាបាឡូជីខាងលិចបូដូឈីហ្គាឆេរូគីខឺដកណ្តាលតៃតាហ្សា" + + "ម៉ាសូប៊ីក្រោមឌូអាឡាចូឡាហ៊្វុនយីអេមប៊ូហ្វីលីពីនកាគូសអាល្លឺម៉ង (ស្វីស)ហ្" + + "គូស៊ីហាវៃសូប៊ីលើងុំបាម៉ាឆាំកាប៊ីឡេកាំបាម៉ាកូនដេកាប៊ូវឺឌៀនូគុយរ៉ាឈីនីកា" + + "លែនជីនគូមីភឹមយ៉ាគគុនកានីសាមបាឡាបាហ្វៀឡានហ្គីឡាកូតាលូរីខាងជើងលូអូលូយ៉ាម" + + "៉ាសៃមេរូម៉ូរីស៊ីនម៉ាកគូវ៉ាមីតូមេតាម៊ូហាគមុនដាងម៉ាហ្សានដឺរេនីណាម៉ាអាល្ល" + + "ឺម៉ង់ក្រោមក្វាស្យូនគោនូអ័រណានកូលេគីចឈីរុមបូរ៉្វាសាមបូរូសានហ្គូអម្បូរឃឺ" + + "ដខាងត្បូងស៊ីណាគុយរ៉ាបូរ៉ុស៊ីនីតាឈីលហ៊ីតសាមីខាងត្បូងលូលីសាមីអ៊ីណារីសាម៉" + + "ីស្កុលសាមីកុងហ្គោស្វាហ៊ីលីតេសូតាសាវ៉ាក់តាម៉ាសាយអាត្លាសកណ្តាលភាសាមិនស្គ" + + "ាល់វៃវុនចូវ៉ារីប៉ារីសូហ្គាម៉ារ៉ុកគ្មាន\u200bទិន្នន័យ\u200bភាសាអារ៉ាប់ផ" + + "្លូវការអេស្ប៉ាញ (អ៊ឺរ៉ុប)ហ្សាក់ស្យុងក្រោមផ្លាមីសព័រទុយហ្គាល់ (អឺរ៉ុប)ម" + + "៉ុលដាវីចិន\u200bអក្សរ\u200bកាត់ចិន\u200bអក្សរ\u200bពេញ" + +var kmLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0021, 0x0045, 0x006c, 0x008d, 0x009c, 0x00b4, 0x00de, + 0x00f3, 0x0108, 0x0108, 0x012c, 0x0159, 0x016b, 0x0186, 0x01a4, + 0x01a4, 0x01bc, 0x01da, 0x01e6, 0x0201, 0x0213, 0x0228, 0x0237, + 0x0237, 0x024f, 0x024f, 0x0258, 0x0258, 0x026a, 0x0273, 0x028b, + 0x02a9, 0x02a9, 0x02b8, 0x02c4, 0x02d3, 0x02eb, 0x0312, 0x032a, + 0x0342, 0x0354, 0x0363, 0x0363, 0x037e, 0x0393, 0x03a8, 0x03ba, + 0x03ea, 0x03fc, 0x0422, 0x0443, 0x045e, 0x047f, 0x0488, 0x0494, + 0x04b2, 0x04c4, 0x04c4, 0x04d9, 0x04e5, 0x04fa, 0x050f, 0x050f, + // Entry 40 - 7F + 0x050f, 0x052d, 0x052d, 0x053f, 0x055a, 0x055a, 0x055a, 0x0572, + 0x0587, 0x05a8, 0x05b7, 0x05c3, 0x05e1, 0x05e1, 0x05f3, 0x05f3, + 0x061d, 0x063e, 0x064d, 0x065c, 0x066b, 0x066b, 0x0680, 0x0689, + 0x0689, 0x0698, 0x06bc, 0x06ce, 0x06ec, 0x0704, 0x0704, 0x0719, + 0x0722, 0x073d, 0x0764, 0x0773, 0x0797, 0x0797, 0x07a6, 0x07c1, + 0x07d6, 0x07f4, 0x080c, 0x0824, 0x0839, 0x0845, 0x0845, 0x0869, + 0x087e, 0x087e, 0x0893, 0x08b5, 0x08e0, 0x08e0, 0x08e0, 0x08e0, + 0x08e0, 0x08e0, 0x08f8, 0x090d, 0x090d, 0x0922, 0x0922, 0x0934, + // Entry 80 - BF + 0x0946, 0x096a, 0x097f, 0x0994, 0x09a6, 0x09bb, 0x09d0, 0x09f7, + 0x0a12, 0x0a12, 0x0a24, 0x0a42, 0x0a57, 0x0a72, 0x0a8d, 0x0aa8, + 0x0ac6, 0x0ad2, 0x0ae7, 0x0aff, 0x0b0b, 0x0b0b, 0x0b0b, 0x0b1d, + 0x0b32, 0x0b4d, 0x0b5c, 0x0b6e, 0x0b98, 0x0b9e, 0x0bb3, 0x0bd7, + 0x0bd7, 0x0bec, 0x0bfb, 0x0bfb, 0x0c07, 0x0c07, 0x0c22, 0x0c3d, + 0x0c4f, 0x0c7c, 0x0c7c, 0x0c8e, 0x0c8e, 0x0c8e, 0x0ca3, 0x0cac, + 0x0ccd, 0x0cdc, 0x0cf1, 0x0cfa, 0x0d06, 0x0d06, 0x0d06, 0x0d06, + 0x0d06, 0x0d06, 0x0d06, 0x0d1b, 0x0d1b, 0x0d1b, 0x0d1b, 0x0d1b, + // Entry C0 - FF + 0x0d1b, 0x0d1b, 0x0d1b, 0x0d1b, 0x0d1b, 0x0d30, 0x0d30, 0x0d30, + 0x0d30, 0x0d30, 0x0d30, 0x0d30, 0x0d3f, 0x0d3f, 0x0d3f, 0x0d3f, + 0x0d3f, 0x0d3f, 0x0d3f, 0x0d3f, 0x0d3f, 0x0d3f, 0x0d3f, 0x0d3f, + 0x0d3f, 0x0d4e, 0x0d4e, 0x0d5a, 0x0d5a, 0x0d5a, 0x0d7e, 0x0d7e, + 0x0d7e, 0x0d7e, 0x0d7e, 0x0d7e, 0x0d7e, 0x0d7e, 0x0d7e, 0x0d7e, + 0x0d7e, 0x0d8a, 0x0d8a, 0x0d8a, 0x0d8a, 0x0d8a, 0x0d8a, 0x0d8a, + 0x0d8a, 0x0d8a, 0x0d8a, 0x0d8a, 0x0d8a, 0x0d9c, 0x0d9c, 0x0d9c, + 0x0d9c, 0x0d9c, 0x0d9c, 0x0d9c, 0x0d9c, 0x0dae, 0x0dae, 0x0dc9, + // Entry 100 - 13F + 0x0dc9, 0x0dc9, 0x0dc9, 0x0dc9, 0x0dc9, 0x0dc9, 0x0dd5, 0x0dd5, + 0x0dd5, 0x0dd5, 0x0dd5, 0x0dea, 0x0dea, 0x0e08, 0x0e08, 0x0e1a, + 0x0e1a, 0x0e3e, 0x0e3e, 0x0e3e, 0x0e50, 0x0e50, 0x0e50, 0x0e50, + 0x0e50, 0x0e50, 0x0e50, 0x0e50, 0x0e50, 0x0e50, 0x0e50, 0x0e6b, + 0x0e6b, 0x0e6b, 0x0e6b, 0x0e6b, 0x0e6b, 0x0e6b, 0x0e6b, 0x0e6b, + 0x0e6b, 0x0e6b, 0x0e7a, 0x0e7a, 0x0e7a, 0x0e7a, 0x0e7a, 0x0e7a, + 0x0e7a, 0x0e7a, 0x0e7a, 0x0e7a, 0x0e7a, 0x0e7a, 0x0e7a, 0x0e7a, + 0x0e7a, 0x0e7a, 0x0ea7, 0x0ea7, 0x0ea7, 0x0ebc, 0x0ebc, 0x0ebc, + // Entry 140 - 17F + 0x0ebc, 0x0ec8, 0x0ec8, 0x0ec8, 0x0ec8, 0x0ec8, 0x0edd, 0x0edd, + 0x0edd, 0x0edd, 0x0edd, 0x0edd, 0x0edd, 0x0edd, 0x0edd, 0x0edd, + 0x0eec, 0x0efe, 0x0efe, 0x0efe, 0x0efe, 0x0efe, 0x0f13, 0x0f13, + 0x0f13, 0x0f22, 0x0f22, 0x0f22, 0x0f22, 0x0f22, 0x0f3a, 0x0f5b, + 0x0f5b, 0x0f5b, 0x0f5b, 0x0f5b, 0x0f5b, 0x0f79, 0x0f79, 0x0f79, + 0x0f79, 0x0f91, 0x0f91, 0x0fb2, 0x0fc7, 0x0fc7, 0x0fc7, 0x0fc7, + 0x0fc7, 0x0fc7, 0x0fc7, 0x0fc7, 0x0fdc, 0x0fee, 0x0fee, 0x0fee, + 0x0fee, 0x0fee, 0x1003, 0x1003, 0x1003, 0x1003, 0x1003, 0x1003, + // Entry 180 - 1BF + 0x1003, 0x1015, 0x1015, 0x1015, 0x1015, 0x1033, 0x1033, 0x1033, + 0x1033, 0x1033, 0x103f, 0x103f, 0x104e, 0x104e, 0x104e, 0x104e, + 0x104e, 0x104e, 0x104e, 0x104e, 0x104e, 0x105d, 0x105d, 0x105d, + 0x105d, 0x105d, 0x1069, 0x1084, 0x1084, 0x10ab, 0x10b7, 0x10b7, + 0x10b7, 0x10b7, 0x10b7, 0x10c9, 0x10c9, 0x10c9, 0x10db, 0x10db, + 0x10db, 0x10db, 0x10db, 0x10db, 0x10db, 0x10db, 0x1105, 0x1105, + 0x1105, 0x1114, 0x1141, 0x1141, 0x1141, 0x1141, 0x1141, 0x1159, + 0x1159, 0x1159, 0x1159, 0x1159, 0x1162, 0x1162, 0x1171, 0x1171, + // Entry 1C0 - 1FF + 0x1171, 0x1186, 0x1186, 0x1186, 0x1186, 0x1186, 0x1186, 0x1186, + 0x1186, 0x1186, 0x1186, 0x1186, 0x1186, 0x1186, 0x1186, 0x1186, + 0x1186, 0x1186, 0x1186, 0x1186, 0x1186, 0x1186, 0x1195, 0x1195, + 0x1195, 0x1195, 0x1195, 0x1195, 0x1195, 0x11a4, 0x11a4, 0x11a4, + 0x11a4, 0x11a4, 0x11a4, 0x11b3, 0x11b3, 0x11b3, 0x11b3, 0x11c8, + 0x11c8, 0x11c8, 0x11c8, 0x11c8, 0x11dd, 0x11dd, 0x11dd, 0x11dd, + 0x1210, 0x1210, 0x121f, 0x121f, 0x121f, 0x124f, 0x124f, 0x124f, + 0x126a, 0x126a, 0x126a, 0x126a, 0x126a, 0x126a, 0x128e, 0x12a6, + // Entry 200 - 23F + 0x12ca, 0x12e5, 0x12e5, 0x12e5, 0x12e5, 0x12e5, 0x12e5, 0x12e5, + 0x12e5, 0x12e5, 0x12e5, 0x12e5, 0x1315, 0x1315, 0x1315, 0x1315, + 0x1315, 0x1315, 0x1321, 0x1321, 0x1321, 0x1321, 0x1321, 0x1321, + 0x1321, 0x1321, 0x1321, 0x1321, 0x1321, 0x1321, 0x1321, 0x1321, + 0x1321, 0x1321, 0x1321, 0x1321, 0x1321, 0x1321, 0x133c, 0x133c, + 0x137b, 0x137b, 0x137b, 0x137b, 0x13a2, 0x13a8, 0x13a8, 0x13a8, + 0x13a8, 0x13a8, 0x13a8, 0x13a8, 0x13b7, 0x13b7, 0x13b7, 0x13b7, + 0x13b7, 0x13d5, 0x13d5, 0x13d5, 0x13d5, 0x13e7, 0x13e7, 0x13e7, + // Entry 240 - 27F + 0x13e7, 0x13e7, 0x13e7, 0x13e7, 0x13e7, 0x13e7, 0x13e7, 0x13e7, + 0x13fc, 0x13fc, 0x1435, 0x1435, 0x1462, 0x1462, 0x1462, 0x1462, + 0x1462, 0x1462, 0x1462, 0x1462, 0x1462, 0x1492, 0x1492, 0x1492, + 0x1492, 0x1492, 0x14c2, 0x14d7, 0x14d7, 0x1510, 0x1528, 0x1528, + 0x1552, 0x1579, +} // Size: 1244 bytes + +var knLangStr string = "" + // Size: 11656 bytes + "ಅಫಾರ್ಅಬ್ಖಾಜಿಯನ್ಅವೆಸ್ಟನ್ಆಫ್ರಿಕಾನ್ಸ್ಅಕಾನ್ಅಂಹರಿಕ್ಅರಗೊನೀಸ್ಅರೇಬಿಕ್ಅಸ್ಸಾಮೀಸ್ಅವ" + + "ರಿಕ್ಅಯ್ಮಾರಾಅಜೆರ್ಬೈಜಾನಿಬಶ್ಕಿರ್ಬೆಲರೂಸಿಯನ್ಬಲ್ಗೇರಿಯನ್ಬಿಸ್ಲಾಮಾಬಂಬಾರಾಬೆಂಗಾಲಿ" + + "ಟಿಬೇಟಿಯನ್ಬ್ರೆಟನ್ಬೋಸ್ನಿಯನ್ಕೆಟಲಾನ್ಚೆಚನ್ಕಮೊರೊಕೋರ್ಸಿಕನ್ಕ್ರೀಜೆಕ್ಚರ್ಚ್ ಸ್ಲಾವ" + + "ಿಕ್ಚುವಾಶ್ವೆಲ್ಶ್ಡ್ಯಾನಿಶ್ಜರ್ಮನ್ದಿವೆಹಿಜೋಂಗ್\u200cಖಾಈವ್ಗ್ರೀಕ್ಇಂಗ್ಲೀಷ್ಎಸ್ಪೆ" + + "ರಾಂಟೊಸ್ಪ್ಯಾನಿಷ್ಎಸ್ಟೊನಿಯನ್ಬಾಸ್ಕ್ಪರ್ಶಿಯನ್ಫುಲಾಹ್ಫಿನ್ನಿಶ್ಫಿಜಿಯನ್ಫರೋಸಿಫ್ರೆಂ" + + "ಚ್ಪಶ್ಚಿಮ ಫ್ರಿಸಿಯನ್ಐರಿಷ್ಸ್ಕಾಟಿಶ್ ಗ್ಯಾಲಿಕ್ಗ್ಯಾಲಿಶಿಯನ್ಗೌರಾನಿಗುಜರಾತಿಮ್ಯಾಂಕ" + + "್ಸ್ಹೌಸಾಹೀಬ್ರ್ಯೂಹಿಂದಿಹಿರಿ ಮೊಟುಕ್ರೊಯೇಶಿಯನ್ಹೈತಿಯನ್ಹಂಗೇರಿಯನ್ಅರ್ಮೇನಿಯನ್ಹೆರೆ" + + "ರೊಇಂಟರ್\u200cಲಿಂಗ್ವಾಇಂಡೋನೇಶಿಯನ್ಇಂಟರ್ಲಿಂಗ್ಇಗ್ಬೊಸಿಚುಅನ್ ಯಿಇನುಪಿಯಾಕ್ಇಡೊಐಸ" + + "್ಲಾಂಡಿಕ್ಇಟಾಲಿಯನ್ಇನುಕ್ಟಿಟುಟ್ಜಾಪನೀಸ್ಜಾವಾನೀಸ್ಜಾರ್ಜಿಯನ್ಕೊಂಗೊಕಿಕುಯುಕ್ವಾನ್" + + "\u200cಯಾಮಾಕಝಕ್ಕಲಾಲ್ಲಿಸುಟ್ಖಮೇರ್ಕನ್ನಡಕೊರಿಯನ್ಕನುರಿಕಾಶ್ಮೀರಿಕುರ್ದಿಷ್ಕೋಮಿಕೋರ್ನ" + + "ಿಷ್ಕಿರ್ಗಿಜ್ಲ್ಯಾಟಿನ್ಲಕ್ಸಂಬರ್ಗ್ಗಾಂಡಾಲಿಂಬರ್ಗಿಶ್ಲಿಂಗಾಲಲಾವೋಲಿಥುವೇನಿಯನ್ಲೂಬಾ-" + + "ಕಟಾಂಗಾಲಟ್ವಿಯನ್ಮಲಗಾಸಿಮಾರ್ಶಲ್ಲೀಸ್ಮಾವೋರಿಮೆಸಿಡೋನಿಯನ್ಮಲಯಾಳಂಮಂಗೋಲಿಯನ್ಮರಾಠಿಮಲ" + + "ಯ್ಮಾಲ್ಟೀಸ್ಬರ್ಮೀಸ್ನೌರುಉತ್ತರ ದೆಬೆಲೆನೇಪಾಳಿಡೋಂಗಾಡಚ್ನಾರ್ವೆಜಿಯನ್ ನೈನೊಸ್ಕ್ನಾರ" + + "್ವೆಜಿಯನ್ ಬೊಕ್ಮಲ್ದಕ್ಷಿಣ ದೆಬೆಲೆನವಾಜೊನ್ಯಾಂಜಾಒಸಿಟನ್ಒಜಿಬ್ವಾಓರೊಮೋಒರಿಯಾಒಸ್ಸೆಟ" + + "ಿಕ್ಪಂಜಾಬಿಪಾಲಿಪೋಲಿಶ್ಪಾಷ್ಟೋಪೋರ್ಚುಗೀಸ್ಕ್ವೆಚುವಾರೊಮಾನ್ಷ್ರುಂಡಿರೊಮೇನಿಯನ್ರಷ್ಯನ" + + "್ಕೀನ್ಯಾರುವಾಂಡಾಸಂಸ್ಕೃತಸರ್ಡೀನಿಯನ್ಸಿಂಧಿಉತ್ತರ ಸಾಮಿಸಾಂಗೋಸಿಂಹಳಸ್ಲೋವಾಕ್ಸ್ಲೋವೇ" + + "ನಿಯನ್ಸಮೋವನ್ಶೋನಾಸೊಮಾಲಿಅಲ್ಬೇನಿಯನ್ಸರ್ಬಿಯನ್ಸ್ವಾತಿದಕ್ಷಿಣ ಸೋಥೋಸುಂಡಾನೀಸ್ಸ್ವೀಡ" + + "ಿಷ್ಸ್ವಹಿಲಿತಮಿಳುತೆಲುಗುತಾಜಿಕ್ಥಾಯ್ಟಿಗ್ರಿನ್ಯಾಟರ್ಕ್\u200cಮೆನ್ಸ್ವಾನಾಟೋಂಗನ್ಟರ" + + "್ಕಿಶ್ಸೋಂಗಾಟಾಟರ್ತಹಿತಿಯನ್ಉಯಿಘರ್ಉಕ್ರೈನಿಯನ್ಉರ್ದುಉಜ್ಬೇಕ್ವೆಂಡಾವಿಯೇಟ್ನಾಮೀಸ್ವೋ" + + "ಲಾಪುಕ್ವಾಲೂನ್ವೋಲೋಫ್ಕ್ಸೋಸಯಡ್ಡಿಶ್ಯೊರುಬಾಝೂವಾಂಗ್ಚೈನೀಸ್ಜುಲುಅಛಿನೀಸ್ಅಕೋಲಿಅಡಂಗ್" + + "\u200cಮೆಅಡೈಘೆಆಫ್ರಿಹಿಲಿಅಘೆಮ್ಐನುಅಕ್ಕಾಡಿಯನ್ಅಲೆಯುಟ್ದಕ್ಷಿಣ ಅಲ್ಟಾಯ್ಪ್ರಾಚೀನ ಇಂಗ" + + "್ಲೀಷ್ಆಂಗಿಕಾಅರಾಮಿಕ್ಮಪುಚೆಅರಪಾಹೋಅರಾವಾಕ್ಅಸುಆಸ್ಟುರಿಯನ್ಅವಧಿಬಲೂಚಿಬಲಿನೀಸ್ಬಸಾಬೇ" + + "ಜಾಬೆಂಬಾಬೆನಪಶ್ಚಿಮ ಬಲೊಚಿಭೋಜಪುರಿಬಿಕೊಲ್ಬಿನಿಸಿಕ್ಸಿಕಾಬ್ರಾಜ್ಬೋಡೊಬುರಿಯಟ್ಬುಗಿನೀ" + + "ಸ್ಬ್ಲಿನ್ಕ್ಯಾಡ್ಡೋಕಾರಿಬ್ಅಟ್ಸಮ್ಸೆಬುಆನೋಚಿಗಾಚಿಬ್ಚಾಚಗಟಾಯ್ಚೂಕಿಸೆಮಾರಿಚಿನೂಕ್ ಜಾ" + + "ರ್ಗೋನ್ಚೋಕ್ಟಾವ್ಚಿಪೆವ್ಯಾನ್ಚೆರೋಕೀಚೀಯೆನ್ನೇಸೊರಾನಿ ಕುರ್ದಿಷ್ಕೊಪ್ಟಿಕ್ಕ್ರಿಮೀಯನ್" + + " ಟರ್ಕಿಷ್ಕಶುಬಿಯನ್ಡಕೋಟದರ್ಗ್ವಾಟೈಟಡೆಲಾವೇರ್ಸ್ಲೇವ್ಡೋಗ್ರಿಬ್ಡಿಂಕಾಜರ್ಮಾಡೋಗ್ರಿಲೋವರ" + + "್ ಸೋರ್ಬಿಯನ್ಡುವಾಲಾಮಧ್ಯ ಡಚ್ಜೊಲ-ಫೊನ್ಯಿಡ್ಯೂಲಾಎಂಬುಎಫಿಕ್ಪ್ರಾಚೀನ ಈಜಿಪ್ಟಿಯನ್ಎಕ" + + "ಾಜುಕ್ಎಲಾಮೈಟ್ಮಧ್ಯ ಇಂಗ್ಲೀಷ್ಇವಾಂಡೋಫೆಂಗ್ಫಿಲಿಪಿನೊಫೋನ್ಮಧ್ಯ ಫ್ರೆಂಚ್ಪ್ರಾಚೀನ ಫ್" + + "ರೆಂಚ್ಉತ್ತರ ಫ್ರಿಸಿಯನ್ಪೂರ್ವ ಫ್ರಿಸಿಯನ್ಫ್ರಿಯುಲಿಯನ್ಗಗಗೌಜ್ಗಾಯೋಗ್ಬಾಯಾಗೀಝ್ಗಿಲ್" + + "ಬರ್ಟೀಸ್ಮಧ್ಯ ಹೈ ಜರ್ಮನ್ಪ್ರಾಚೀನ ಹೈ ಜರ್ಮನ್ಗೊಂಡಿಗೊರೊಂಟಾಲೋಗೋಥಿಕ್ಗ್ರೇಬೋಪ್ರಾಚೀ" + + "ನ ಗ್ರೀಕ್ಸ್ವಿಸ್ ಜರ್ಮನ್ಗುಸಿಗ್ವಿಚ್\u200cಇನ್ಹೈಡಾಹವಾಯಿಯನ್ಹಿಲಿಗೇನನ್ಹಿಟ್ಟಿಟೆಮ" + + "ೋಂಗ್ಅಪ್ಪರ್ ಸರ್ಬಿಯನ್ಹೂಪಾಇಬಾನ್ಇಲ್ಲಿಕೋಇಂಗುಷ್ಲೊಜ್ಬಾನ್ನೊಂಬಾಮ್ಯಕಮೆಜೂಡಿಯೋ-ಪರ್" + + "ಶಿಯನ್ಜೂಡಿಯೋ-ಅರೇಬಿಕ್ಕಾರಾ-ಕಲ್ಪಾಕ್ಕಬೈಲ್ಕಚಿನ್ಜ್ಜುಕಂಬಾಕಾವಿಕಬರ್ಡಿಯನ್ಟ್ಯಾಪ್ಮ್" + + "ಯಾಕೊಂಡ್ಕಬುವೆರ್ಡಿಯನುಕೋರೋಖಾಸಿಖೋಟಾನೀಸ್ಕೊಯ್ರ ಚೀನಿಕಲೆಂಜಿನ್ಕಿಂಬುಂಡುಕೊಮಿ-ಪರ್ಮ" + + "್ಯಕ್ಕೊಂಕಣಿಕೊಸರಿಯನ್ಕಪೆಲ್ಲೆಕರಚಯ್-ಬಲ್ಕಾರ್ಕರೇಲಿಯನ್ಕುರುಖ್ಶಂಬಲಬಫಿಯಕುಮೈಕ್ಕುಟೇ" + + "ನಾಯ್ಕಾಡಿನೋಲಾಂಗಿಲಹಂಡಾಲಂಬಾಲೆಜ್ಘಿಯನ್ಲಕೊಟಮೊಂಗೋಲೋಝಿಲುಬ-ಲುಲಾಲೂಯಿಸೆನೋಲುಂಡಾಲುವ" + + "ೋಲುಶಾಯ್ಲುಯಿಯಮದುರೀಸ್ಮಗಾಹಿಮೈಥಿಲಿಮಕಾಸರ್ಮಂಡಿಂಗೊಮಸಾಯ್ಮೋಕ್ಷಮಂದಾರ್ಮೆಂಡೆಮೆರುಮೊ" + + "ರಿಸನ್ಮಧ್ಯ ಐರಿಷ್ಮ್ಯಖುವಾ- ಮೀಟ್ಟೊಮೆಟಾಮಿಕ್\u200cಮ್ಯಾಕ್ಮಿನಂಗ್\u200cಕಬಾವುಮಂಚ" + + "ುಮಣಿಪುರಿಮೊಹಾವ್ಕ್ಮೊಸ್ಸಿಮುಂಡಂಗ್ಬಹುಸಂಖ್ಯೆಯ ಭಾಷೆಗಳುಕ್ರೀಕ್ಕಿರಾಂಡೀಸ್ಮಾರ್ವಾಡಿ" + + "ಎರ್\u200cಝ್ಯಾನಿಯಾಪೊಲಿಟನ್ನಮಲೋ ಜರ್ಮನ್ನೇವಾರೀನಿಯಾಸ್ನಿಯುವನ್ಖ್ವಾಸಿಯೊನೊಗಾಯ್ಪ್" + + "ರಾಚೀನ ನೋರ್ಸ್ಎನ್\u200cಕೋಉತ್ತರ ಸೋಥೋನೂಯರ್ಶಾಸ್ತ್ರೀಯ ನೇವಾರಿನ್ಯಾಮ್\u200cವೆಂಜ" + + "ಿನ್ಯಾನ್\u200cಕೋಲೆನ್ಯೋರೋಜೀಮಾಓಸಾಜ್ಒಟ್ಟೋಮನ್ ತುರ್ಕಿಷ್ಪಂಗಾಸಿನನ್ಪಹ್ಲವಿಪಂಪಾಂಗ" + + "ಾಪಾಪಿಯಮೆಂಟೋಪಲುಆನ್ಪ್ರಾಚೀನ ಪರ್ಶಿಯನ್ಫೀನಿಷಿಯನ್ಪೋನ್\u200c\u200cಪಿಯನ್ಪ್ರಾಚೀನ" + + " ಪ್ರೊವೆನ್ಶಿಯಲ್ಕಿಷೆರಾಜಾಸ್ಥಾನಿರಾಪಾನುಯಿರಾರೋಟೊಂಗನ್ರೊಂಬೊರೋಮಾನಿಅರೋಮಾನಿಯನ್ರುವಸಂ" + + "ಡಾವೇಯಾಕುಟ್ಸಮರಿಟನ್ ಅರಾಮಿಕ್ಸಂಬುರುಸಸಾಕ್ಸಂತಾಲಿಸಂಗುಸಿಸಿಲಿಯನ್ಸ್ಕೋಟ್ಸ್ದಕ್ಷಿಣ " + + "ಕುರ್ದಿಶ್ಸೆನಸೆಲ್ಕಪ್ಕೊಯ್ರಬೊರೊ ಸೆನ್ನಿಪ್ರಾಚೀನ ಐರಿಷ್ಟಷೆಲ್\u200dಹಿಟ್ಶಾನ್ಸಿಡಾ" + + "ಮೋದಕ್ಷಿಣ ಸಾಮಿಲೂಲ್ ಸಾಮಿಇನರಿ ಸಾಮಿಸ್ಕೋಟ್ ಸಾಮಿಸೋನಿಂಕೆಸೋಗ್ಡಿಏನ್ಸ್ರಾನನ್ ಟೋಂಗ" + + "ೋಸೇರೇರ್ಸುಕುಮಾಸುಸುಸುಮೇರಿಯನ್ಕಾಂಗೊ ಸ್ವಹಿಲಿಶಾಸ್ತ್ರೀಯ ಸಿರಿಯಕ್ಸಿರಿಯಕ್ಟಿಮ್ನೆಟ" + + "ೆಸೊಟೆರೆನೋಟೇಟಮ್ಟೈಗ್ರೆಟಿವ್ಟೊಕೆಲಾವ್ಕ್ಲಿಂಗನ್ಟ್ಲಿಂಗಿಟ್ಟಮಾಷೆಕ್ನ್ಯಾಸಾ ಟೋಂಗಾಟೋ" + + "ಕ್ ಪಿಸಿನ್ಸಿಂಶಿಯನ್ತುಂಬುಕಾಟುವಾಲುಟಸವಕ್ಟುವಿನಿಯನ್ಮಧ್ಯ ಅಟ್ಲಾಸ್ ಟಮಜೈಟ್ಉಡ್" + + "\u200cಮುರ್ಟ್ಉಗಾರಿಟಿಕ್ಉಂಬುಂಡುರೂಟ್ವಾಯಿವೋಟಿಕ್ವುಂಜೊವಲಾಮೋವರಾಯ್ವಾಷೋವಾರ್ಲ್" + + "\u200cಪಿರಿಕಲ್\u200cಮೈಕ್ಸೊಗಯಾಓಯಪೀಸೆಝೋಪೊಟೆಕ್ಬ್ಲಿಸ್\u200cಸಿಂಬಲ್ಸ್ಝೆನಾಗಾಸ್ಟ್" + + "ಯಾಂಡರ್ಡ್ ಮೊರೊಕ್ಕನ್ ಟಮಜೈಟ್ಝೂನಿಯಾವುದೇ ಭಾಷಾಸಂಬಂಧಿ ವಿಷಯವಿಲ್ಲಜಾಝಾಆಧುನಿಕ ಪ್ರ" + + "ಮಾಣಿತ ಅರೇಬಿಕ್ಆಸ್ಟ್ರಿಯನ್ ಜರ್ಮನ್ಸ್ವಿಸ್ ಹೈ ಜರ್ಮನ್ಆಸ್ಟ್ರೇಲಿಯನ್ ಇಂಗ್ಲೀಷ್ಕೆನ" + + "ೆಡಿಯನ್ ಇಂಗ್ಲೀಷ್ಬ್ರಿಟಿಷ್ ಇಂಗ್ಲೀಷ್ಅಮೆರಿಕನ್ ಇಂಗ್ಲೀಷ್ಲ್ಯಾಟಿನ್ ಅಮೇರಿಕನ್ ಸ್ಪ" + + "್ಯಾನಿಶ್ಯುರೋಪಿಯನ್ ಸ್ಪ್ಯಾನಿಷ್ಮೆಕ್ಸಿಕನ್ ಸ್ಪ್ಯಾನಿಷ್ಕೆನೆಡಿಯನ್ ಫ್ರೆಂಚ್ಸ್ವಿಸ್" + + " ಫ್ರೆಂಚ್ಫ್ಲೆಮಿಷ್ಬ್ರೆಜಿಲಿಯನ್ ಪೋರ್ಚುಗೀಸ್ಯೂರೋಪಿಯನ್ ಪೋರ್ಚುಗೀಸ್ಮೊಲ್ಡೆವಿಯನ್ಸರ್" + + "ಬೋ-ಕ್ರೊಯೇಶಿಯನ್ಸರಳೀಕೃತ ಚೈನೀಸ್ಸಾಂಪ್ರದಾಯಿಕ ಚೈನೀಸ್" + +var knLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000f, 0x002d, 0x0045, 0x0066, 0x0075, 0x008a, 0x00a2, + 0x00b7, 0x00d2, 0x00e4, 0x00f9, 0x011a, 0x012f, 0x014d, 0x016b, + 0x0183, 0x0195, 0x01aa, 0x01c5, 0x01da, 0x01f5, 0x020a, 0x0219, + 0x0228, 0x0243, 0x024f, 0x025b, 0x0283, 0x0295, 0x02a7, 0x02bf, + 0x02d1, 0x02e3, 0x02fb, 0x0304, 0x0316, 0x032e, 0x034c, 0x036a, + 0x0388, 0x039a, 0x03b2, 0x03c4, 0x03dc, 0x03f1, 0x0400, 0x0415, + 0x0443, 0x0452, 0x0483, 0x04a4, 0x04b6, 0x04cb, 0x04e6, 0x04f2, + 0x050a, 0x0519, 0x0532, 0x0553, 0x0568, 0x0583, 0x05a1, 0x05b3, + // Entry 40 - 7F + 0x05da, 0x05fb, 0x0619, 0x0628, 0x0644, 0x065f, 0x0668, 0x0686, + 0x069e, 0x06bf, 0x06d4, 0x06ec, 0x0707, 0x0716, 0x0728, 0x0749, + 0x0755, 0x0776, 0x0785, 0x0794, 0x07a9, 0x07b8, 0x07d0, 0x07e8, + 0x07f4, 0x080c, 0x0824, 0x083c, 0x085a, 0x0869, 0x0887, 0x0899, + 0x08a5, 0x08c6, 0x08e5, 0x08fd, 0x090f, 0x0930, 0x0942, 0x0963, + 0x0975, 0x0990, 0x099f, 0x09ab, 0x09c3, 0x09d8, 0x09e4, 0x0a06, + 0x0a18, 0x0a27, 0x0a30, 0x0a6a, 0x0aa1, 0x0ac6, 0x0ad5, 0x0aea, + 0x0afc, 0x0b11, 0x0b20, 0x0b2f, 0x0b4a, 0x0b5c, 0x0b68, 0x0b7a, + // Entry 80 - BF + 0x0b8c, 0x0baa, 0x0bc2, 0x0bda, 0x0be9, 0x0c04, 0x0c16, 0x0c3d, + 0x0c52, 0x0c70, 0x0c7f, 0x0c9b, 0x0caa, 0x0cb9, 0x0cd1, 0x0cf2, + 0x0d04, 0x0d10, 0x0d22, 0x0d40, 0x0d58, 0x0d6a, 0x0d89, 0x0da4, + 0x0dbc, 0x0dd1, 0x0de0, 0x0df2, 0x0e04, 0x0e10, 0x0e2e, 0x0e4c, + 0x0e5e, 0x0e70, 0x0e85, 0x0e94, 0x0ea3, 0x0ebb, 0x0ecd, 0x0eeb, + 0x0efa, 0x0f0f, 0x0f1e, 0x0f42, 0x0f5a, 0x0f6c, 0x0f7e, 0x0f8d, + 0x0fa2, 0x0fb4, 0x0fc9, 0x0fdb, 0x0fe7, 0x0ffc, 0x100b, 0x1023, + 0x1032, 0x1032, 0x104d, 0x105c, 0x1065, 0x1083, 0x1083, 0x1098, + // Entry C0 - FF + 0x1098, 0x10c0, 0x10ee, 0x1100, 0x1115, 0x1124, 0x1124, 0x1136, + 0x1136, 0x114b, 0x114b, 0x114b, 0x1154, 0x1154, 0x1172, 0x1172, + 0x117e, 0x118d, 0x11a2, 0x11a2, 0x11ab, 0x11ab, 0x11ab, 0x11ab, + 0x11b7, 0x11c6, 0x11c6, 0x11cf, 0x11cf, 0x11cf, 0x11f1, 0x1206, + 0x1218, 0x1224, 0x1224, 0x1224, 0x123c, 0x123c, 0x123c, 0x124e, + 0x124e, 0x125a, 0x125a, 0x126f, 0x1287, 0x1287, 0x1299, 0x1299, + 0x12b1, 0x12c3, 0x12c3, 0x12d5, 0x12ea, 0x12f6, 0x1308, 0x131a, + 0x132c, 0x1338, 0x1363, 0x137b, 0x1399, 0x13ab, 0x13c3, 0x13ee, + // Entry 100 - 13F + 0x1406, 0x1406, 0x1437, 0x144f, 0x145b, 0x1470, 0x1479, 0x1491, + 0x14a3, 0x14bb, 0x14ca, 0x14d9, 0x14eb, 0x1516, 0x1516, 0x1528, + 0x153e, 0x155a, 0x156c, 0x156c, 0x1578, 0x1587, 0x1587, 0x15bb, + 0x15d0, 0x15e5, 0x160a, 0x160a, 0x161c, 0x161c, 0x162b, 0x1643, + 0x1643, 0x164f, 0x164f, 0x1671, 0x169c, 0x169c, 0x16c7, 0x16f2, + 0x1713, 0x1716, 0x1725, 0x1725, 0x1731, 0x1743, 0x1743, 0x174f, + 0x1770, 0x1770, 0x1796, 0x17c5, 0x17c5, 0x17d4, 0x17ef, 0x1801, + 0x1813, 0x183b, 0x1860, 0x1860, 0x1860, 0x186c, 0x188a, 0x1896, + // Entry 140 - 17F + 0x1896, 0x18ae, 0x18ae, 0x18c9, 0x18e1, 0x18f0, 0x191b, 0x191b, + 0x1927, 0x1936, 0x1936, 0x194b, 0x195d, 0x195d, 0x195d, 0x1975, + 0x1984, 0x1996, 0x19c1, 0x19e9, 0x19e9, 0x1a0b, 0x1a1a, 0x1a29, + 0x1a35, 0x1a41, 0x1a4d, 0x1a68, 0x1a68, 0x1a7a, 0x1a95, 0x1ab9, + 0x1ab9, 0x1ac5, 0x1ac5, 0x1ad1, 0x1ae9, 0x1b05, 0x1b05, 0x1b05, + 0x1b05, 0x1b1d, 0x1b35, 0x1b5a, 0x1b6c, 0x1b84, 0x1b99, 0x1bbe, + 0x1bbe, 0x1bbe, 0x1bd6, 0x1be8, 0x1bf4, 0x1c00, 0x1c00, 0x1c12, + 0x1c2a, 0x1c3c, 0x1c4b, 0x1c5a, 0x1c66, 0x1c81, 0x1c81, 0x1c81, + // Entry 180 - 1BF + 0x1c81, 0x1c8d, 0x1c8d, 0x1c9c, 0x1ca8, 0x1ca8, 0x1ca8, 0x1cbe, + 0x1cd6, 0x1ce5, 0x1cf1, 0x1d03, 0x1d12, 0x1d12, 0x1d12, 0x1d27, + 0x1d27, 0x1d36, 0x1d48, 0x1d5a, 0x1d6f, 0x1d7e, 0x1d7e, 0x1d8d, + 0x1d9f, 0x1dae, 0x1dba, 0x1dcf, 0x1deb, 0x1e14, 0x1e20, 0x1e41, + 0x1e65, 0x1e71, 0x1e86, 0x1e9e, 0x1eb0, 0x1eb0, 0x1ec5, 0x1ef9, + 0x1f0b, 0x1f26, 0x1f3e, 0x1f3e, 0x1f3e, 0x1f56, 0x1f56, 0x1f56, + 0x1f77, 0x1f7d, 0x1f96, 0x1fa8, 0x1fba, 0x1fcf, 0x1fcf, 0x1fe7, + 0x1fe7, 0x1ff9, 0x2021, 0x2021, 0x2033, 0x204f, 0x205e, 0x208c, + // Entry 1C0 - 1FF + 0x20b0, 0x20d1, 0x20e3, 0x20ef, 0x20fe, 0x212f, 0x214a, 0x215c, + 0x2171, 0x218f, 0x21a1, 0x21a1, 0x21a1, 0x21a1, 0x21cf, 0x21cf, + 0x21ea, 0x21ea, 0x21ea, 0x220b, 0x220b, 0x2248, 0x2254, 0x2254, + 0x2272, 0x228a, 0x22a8, 0x22a8, 0x22a8, 0x22b7, 0x22c9, 0x22c9, + 0x22c9, 0x22c9, 0x22e7, 0x22f0, 0x2302, 0x2314, 0x233f, 0x2351, + 0x2360, 0x2372, 0x2372, 0x2372, 0x237e, 0x2399, 0x23b1, 0x23b1, + 0x23dc, 0x23dc, 0x23e5, 0x23e5, 0x23fa, 0x2428, 0x244d, 0x244d, + 0x246b, 0x2477, 0x2477, 0x2489, 0x2489, 0x2489, 0x24a8, 0x24c1, + // Entry 200 - 23F + 0x24da, 0x24f9, 0x250e, 0x2529, 0x254e, 0x2560, 0x2560, 0x2560, + 0x2572, 0x257e, 0x2599, 0x2599, 0x25be, 0x25ef, 0x2604, 0x2604, + 0x2604, 0x2616, 0x2622, 0x2634, 0x2643, 0x2655, 0x2661, 0x2679, + 0x2679, 0x2691, 0x26ac, 0x26ac, 0x26c1, 0x26e3, 0x2702, 0x2702, + 0x2702, 0x2702, 0x271a, 0x271a, 0x272f, 0x2741, 0x2750, 0x276b, + 0x27a0, 0x27be, 0x27d9, 0x27ee, 0x27fa, 0x2806, 0x2806, 0x2806, + 0x2806, 0x2806, 0x2818, 0x2818, 0x2827, 0x2827, 0x2836, 0x2845, + 0x2851, 0x2872, 0x2872, 0x288a, 0x288a, 0x2893, 0x289c, 0x28ab, + // Entry 240 - 27F + 0x28ab, 0x28ab, 0x28ab, 0x28ab, 0x28c3, 0x28f0, 0x28f0, 0x2902, + 0x2955, 0x2961, 0x29ae, 0x29ba, 0x29fb, 0x29fb, 0x2a2c, 0x2a58, + 0x2a95, 0x2ac9, 0x2afa, 0x2b2b, 0x2b7b, 0x2bb5, 0x2bef, 0x2bef, + 0x2c20, 0x2c48, 0x2c48, 0x2c60, 0x2ca0, 0x2cda, 0x2cfb, 0x2d2c, + 0x2d54, 0x2d88, +} // Size: 1244 bytes + +var koLangStr string = "" + // Size: 7007 bytes + "아파르어압카즈어아베스타어아프리칸스어아칸어암하라어아라곤어아랍어아삼어아바릭어아이마라어아제르바이잔어바슈키르어벨라루스어불가리아어비슬라마어" + + "밤바라어벵골어티베트어브르타뉴어보스니아어카탈로니아어체첸어차모로어코르시카어크리어체코어교회 슬라브어추바시어웨일스어덴마크어독일어디베히" + + "어종카어에웨어그리스어영어에스페란토어스페인어에스토니아어바스크어페르시아어풀라어핀란드어피지어페로어프랑스어서프리지아어아일랜드어스코틀랜" + + "드 게일어갈리시아어과라니어구자라트어맹크스어하우사어히브리어힌디어히리 모투어크로아티아어아이티어헝가리어아르메니아어헤레로어인테르링구아" + + " (국제보조어협회)인도네시아어인테르링구에이그보어쓰촨 이어이누피아크어이도어아이슬란드어이탈리아어이눅티투트어일본어자바어조지아어콩고어키쿠" + + "유어쿠안야마어카자흐어그린란드어캄보디아어칸나다어한국어칸누리어카슈미르어쿠르드어코미어콘월어키르기스어라틴어룩셈부르크어간다어림버거어링갈" + + "라어라오어리투아니아어루바-카탄가어라트비아어말라가시어마셜제도어마오리어마케도니아어말라얄람어몽고어마라티어말레이어몰타어버마어나우루어북" + + "부 은데벨레어네팔어느동가어네덜란드어노르웨이어(니노르스크)노르웨이어(보크말)남부 은데벨레어나바호어니안자어; 치츄어; 츄어오크어오" + + "지브웨이어오로모어오리야어오세트어펀잡어팔리어폴란드어파슈토어포르투갈어케추아어로만시어룬디어루마니아어러시아어르완다어산스크리트어사르디니" + + "아어신디어북부 사미어산고어스리랑카어슬로바키아어슬로베니아어사모아어쇼나어소말리아어알바니아어세르비아어시스와티어소토어 (남부)순다어스" + + "웨덴어스와힐리어타밀어텔루구어타지크어태국어티그리냐어투르크멘어세츠와나어통가어터키어총가어타타르어타히티어위구르어우크라이나어우르두어우즈" + + "베크어벤다어베트남어볼라퓌크어왈론어월로프어코사어이디시어요루바어주앙어중국어줄루어아체어아콜리어아당메어아닥헤어튀니지 아랍어아프리히리어" + + "아그햄어아이누어아카드어알류트어남부 알타이어고대 영어앙가어아람어아라우칸어아라파호어알제리 아랍어아라와크어모로코 아랍어이집트 아랍어" + + "아수어아스투리아어아와히어발루치어발리어바사어바문어고말라어베자어벰바어베나어바푸트어서부 발로치어호즈푸리어비콜어비니어콤어식시카어브라지" + + "어브라후이어보도어아쿠즈어부리아타부기어불루어브린어메둠바어카도어카리브어카유가어앗삼어세부아노어치가어치브차어차가타이어추크어마리어치누크" + + "어와 영어 프랑스어의 혼성어촉토어치페우얀체로키어샤이엔어소라니 쿠르드어콥트어크리민 터키어; 크리민 타타르어카슈비아어다코타어다르그" + + "와어타이타어델라웨어어슬라브어도그리브어딩카어자르마어도그리어저지 소르비아어두알라어중세 네덜란드어졸라 포니어드율라어다장가어엠부어이픽" + + "어이집트어 (고대)이카죽어엘람어영어, 중세이원도어팡그어필리핀어폰어중세 프랑스어고대 프랑스어북부 프리슬란드어동부 프리슬란드어프리" + + "우리안어가어가가우스어가요어그바야어조로아스터 다리어게이즈어키리바시어길라키어중세 고지 독일어고대 고지 독일어고아 콘칸어곤디어고론탈" + + "로어고트어게르보어그리스어, 고대독일어(스위스)구시어그위친어하이다어하와이어피지 힌디어헤리가뇬어하타이트어히몸어고지 소르비아어후파어" + + "이반어이비비오어이로코어인귀시어로반어응곰바어마차메어유대-페르시아어유대-아라비아어카라칼파크어커바일어카친어까꼬토끄어캄바어카위어카바르" + + "디어카넴부어티얍어마콘데어크리올어코로어카시어호탄어코이라 친니어코와르어카코어칼렌진어킴분두어코미페르먀크어코카니어코스라이엔어크펠레어카" + + "라챠이-발카르어카렐리야어쿠르크어샴발라어바피아어콜로그니안어쿠믹어쿠테네어라디노어랑기어라한다어람바어레즈기안어링구아 프랑카 노바라코타" + + "어몽구어로지어북부 루리어루바-룰루아어루이세노어룬다어루오어루샤이어루야어마두라어마파어마가히마이틸리마카사어만딩고어마사이어마바어모크샤" + + "어만다르어멘데어메루어모리스얀어아일랜드어, 중세마크후와-메토어메타어미크맥어미낭카바우만주어마니푸리어모호크어모시어서부 마리어문당어다" + + "중 언어크리크어미란데어마르와리어미예네어엘즈야어마잔데라니어나폴리어나마어저지 독일어네와르어니아스어니웨언어크와시오어느기엠본어노가이어" + + "노르웨이, 고대응코어소토어 (북부)누에르어네와르어 (고전)니암웨지어니안콜어뉴로어느지마어오세이지어터키어, 오스만판가시난어팔레비어" + + "팜팡가어파피아먼토어파라우안어고대 페르시아어페니키아어폰틱어폼페이어고대 프로방스어키체어라자스탄어라파뉴이라로통가어롬보어집시어루신어아" + + "로마니아어르와어산다웨어야큐트어사마리아 아랍어삼부루어사사크어산탈리어느감바이어상구어시칠리아어스코틀랜드어남부 쿠르드어세네카어세나어셀" + + "쿠프어코이야보로 세니어아일랜드, 고대타셸히트어샨어차디언 아라비아어시다모어남부 사미어룰레 사미어이나리 사미어스콜트 사미어소닌케어" + + "소그디엔어스라난 통가어세레르어사호어수쿠마족어수수어수메르어코모로어콩고 스와힐리어시리아어 (고전)시리아어팀니어테조어테레노어테툼어티" + + "그레어티비어토켈라우제도어차후르어클링온어틀링깃족어탈리쉬어타마섹어통가어 (니아살랜드)토크 피신어타로코어트심시안어툼부카어투발루어타사" + + "와크어투비니안어중앙 모로코 타마지트어우드말트어유가리틱어윤번두어어근바이어보틱어분조어월저어와라모어와라이어와쇼어왈피리어칼미크어소가어" + + "야오족어얍페세어양본어옘바어사포테크어블리스 심볼제나가어표준 모로코 타마지트어주니어언어 관련 내용 없음자자어현대 표준 아랍어고지 " + + "독일어(스위스)영어(호주)플라망어몰도바어세르비아-크로아티아어" + +var koLangIdx = []uint16{ // 608 elements + // Entry 0 - 3F + 0x0000, 0x000c, 0x0018, 0x0027, 0x0039, 0x0042, 0x004e, 0x005a, + 0x0063, 0x006c, 0x0078, 0x0087, 0x009c, 0x00ab, 0x00ba, 0x00c9, + 0x00d8, 0x00e4, 0x00ed, 0x00f9, 0x0108, 0x0117, 0x0129, 0x0132, + 0x013e, 0x014d, 0x0156, 0x015f, 0x0172, 0x017e, 0x018a, 0x0196, + 0x019f, 0x01ab, 0x01b4, 0x01bd, 0x01c9, 0x01cf, 0x01e1, 0x01ed, + 0x01ff, 0x020b, 0x021a, 0x0223, 0x022f, 0x0238, 0x0241, 0x024d, + 0x025f, 0x026e, 0x0287, 0x0296, 0x02a2, 0x02b1, 0x02bd, 0x02c9, + 0x02d5, 0x02de, 0x02ee, 0x0300, 0x030c, 0x0318, 0x032a, 0x0336, + // Entry 40 - 7F + 0x0360, 0x0372, 0x0384, 0x0390, 0x039d, 0x03af, 0x03b8, 0x03ca, + 0x03d9, 0x03eb, 0x03f4, 0x03fd, 0x0409, 0x0412, 0x041e, 0x042d, + 0x0439, 0x0448, 0x0457, 0x0463, 0x046c, 0x0478, 0x0487, 0x0493, + 0x049c, 0x04a5, 0x04b4, 0x04bd, 0x04cf, 0x04d8, 0x04e4, 0x04f0, + 0x04f9, 0x050b, 0x051e, 0x052d, 0x053c, 0x054b, 0x0557, 0x0569, + 0x0578, 0x0581, 0x058d, 0x0599, 0x05a2, 0x05ab, 0x05b7, 0x05cd, + 0x05d6, 0x05e2, 0x05f1, 0x0611, 0x062b, 0x0641, 0x064d, 0x066c, + 0x0675, 0x0687, 0x0693, 0x069f, 0x06ab, 0x06b4, 0x06bd, 0x06c9, + // Entry 80 - BF + 0x06d5, 0x06e4, 0x06f0, 0x06fc, 0x0705, 0x0714, 0x0720, 0x072c, + 0x073e, 0x0750, 0x0759, 0x0769, 0x0772, 0x0781, 0x0793, 0x07a5, + 0x07b1, 0x07ba, 0x07c9, 0x07d8, 0x07e7, 0x07f6, 0x0808, 0x0811, + 0x081d, 0x082c, 0x0835, 0x0841, 0x084d, 0x0856, 0x0865, 0x0874, + 0x0883, 0x088c, 0x0895, 0x089e, 0x08aa, 0x08b6, 0x08c2, 0x08d4, + 0x08e0, 0x08ef, 0x08f8, 0x0904, 0x0913, 0x091c, 0x0928, 0x0931, + 0x093d, 0x0949, 0x0952, 0x095b, 0x0964, 0x096d, 0x0979, 0x0985, + 0x0991, 0x09a4, 0x09b6, 0x09c2, 0x09ce, 0x09da, 0x09da, 0x09e6, + // Entry C0 - FF + 0x09e6, 0x09f9, 0x0a06, 0x0a0f, 0x0a18, 0x0a27, 0x0a27, 0x0a36, + 0x0a49, 0x0a58, 0x0a6b, 0x0a7e, 0x0a87, 0x0a87, 0x0a99, 0x0a99, + 0x0aa5, 0x0ab1, 0x0aba, 0x0aba, 0x0ac3, 0x0acc, 0x0acc, 0x0ad8, + 0x0ae1, 0x0aea, 0x0aea, 0x0af3, 0x0aff, 0x0aff, 0x0b12, 0x0b21, + 0x0b2a, 0x0b33, 0x0b33, 0x0b39, 0x0b45, 0x0b45, 0x0b45, 0x0b51, + 0x0b60, 0x0b69, 0x0b75, 0x0b81, 0x0b8a, 0x0b93, 0x0b9c, 0x0ba8, + 0x0bb1, 0x0bbd, 0x0bc9, 0x0bd2, 0x0be1, 0x0bea, 0x0bf6, 0x0c05, + 0x0c0e, 0x0c17, 0x0c47, 0x0c50, 0x0c5c, 0x0c68, 0x0c74, 0x0c8a, + // Entry 100 - 13F + 0x0c93, 0x0c93, 0x0cbe, 0x0ccd, 0x0cd9, 0x0ce8, 0x0cf4, 0x0d03, + 0x0d0f, 0x0d1e, 0x0d27, 0x0d33, 0x0d3f, 0x0d55, 0x0d55, 0x0d61, + 0x0d77, 0x0d87, 0x0d93, 0x0d9f, 0x0da8, 0x0db1, 0x0db1, 0x0dc6, + 0x0dd2, 0x0ddb, 0x0de9, 0x0de9, 0x0df5, 0x0df5, 0x0dfe, 0x0e0a, + 0x0e0a, 0x0e10, 0x0e10, 0x0e23, 0x0e36, 0x0e36, 0x0e4f, 0x0e68, + 0x0e7a, 0x0e80, 0x0e8f, 0x0e8f, 0x0e98, 0x0ea4, 0x0ebd, 0x0ec9, + 0x0ed8, 0x0ee4, 0x0efb, 0x0f12, 0x0f22, 0x0f2b, 0x0f3a, 0x0f43, + 0x0f4f, 0x0f63, 0x0f77, 0x0f77, 0x0f77, 0x0f80, 0x0f8c, 0x0f98, + // Entry 140 - 17F + 0x0f98, 0x0fa4, 0x0fb4, 0x0fc3, 0x0fd2, 0x0fdb, 0x0ff1, 0x0ff1, + 0x0ffa, 0x1003, 0x1012, 0x101e, 0x102a, 0x102a, 0x102a, 0x1033, + 0x103f, 0x104b, 0x1061, 0x1077, 0x1077, 0x1089, 0x1095, 0x109e, + 0x10ad, 0x10b6, 0x10bf, 0x10ce, 0x10da, 0x10e3, 0x10ef, 0x10fb, + 0x10fb, 0x1104, 0x1104, 0x110d, 0x1116, 0x1129, 0x1135, 0x1135, + 0x113e, 0x114a, 0x1156, 0x116b, 0x1177, 0x1189, 0x1195, 0x11ae, + 0x11ae, 0x11ae, 0x11bd, 0x11c9, 0x11d5, 0x11e1, 0x11f3, 0x11fc, + 0x1208, 0x1214, 0x121d, 0x1229, 0x1232, 0x1241, 0x125b, 0x125b, + // Entry 180 - 1BF + 0x125b, 0x1267, 0x1267, 0x1270, 0x1279, 0x1289, 0x1289, 0x129c, + 0x12ab, 0x12b4, 0x12bd, 0x12c9, 0x12d2, 0x12d2, 0x12d2, 0x12de, + 0x12e7, 0x12f0, 0x12fc, 0x1308, 0x1314, 0x1320, 0x1329, 0x1335, + 0x1341, 0x134a, 0x1353, 0x1362, 0x1379, 0x138f, 0x1398, 0x13a4, + 0x13b3, 0x13bc, 0x13cb, 0x13d7, 0x13e0, 0x13f0, 0x13f9, 0x1406, + 0x1412, 0x141e, 0x142d, 0x142d, 0x1439, 0x1445, 0x1457, 0x1457, + 0x1463, 0x146c, 0x147c, 0x1488, 0x1494, 0x14a0, 0x14a0, 0x14af, + 0x14be, 0x14ca, 0x14de, 0x14de, 0x14e7, 0x14f9, 0x1505, 0x151a, + // Entry 1C0 - 1FF + 0x1529, 0x1535, 0x153e, 0x154a, 0x1559, 0x156d, 0x157c, 0x1588, + 0x1594, 0x15a6, 0x15b5, 0x15b5, 0x15b5, 0x15b5, 0x15cb, 0x15cb, + 0x15da, 0x15da, 0x15e3, 0x15ef, 0x15ef, 0x1605, 0x160e, 0x160e, + 0x161d, 0x1629, 0x1638, 0x1638, 0x1638, 0x1641, 0x164a, 0x164a, + 0x1653, 0x1653, 0x1665, 0x166e, 0x167a, 0x1686, 0x169c, 0x16a8, + 0x16b4, 0x16c0, 0x16c0, 0x16cf, 0x16d8, 0x16e7, 0x16f9, 0x16f9, + 0x170c, 0x1718, 0x1721, 0x1721, 0x172d, 0x1746, 0x175a, 0x175a, + 0x1769, 0x176f, 0x1788, 0x1794, 0x1794, 0x1794, 0x17a4, 0x17b4, + // Entry 200 - 23F + 0x17c7, 0x17da, 0x17e6, 0x17f5, 0x1808, 0x1814, 0x181d, 0x181d, + 0x182c, 0x1835, 0x1841, 0x184d, 0x1863, 0x1878, 0x1884, 0x1884, + 0x1884, 0x188d, 0x1896, 0x18a2, 0x18ab, 0x18b7, 0x18c0, 0x18d5, + 0x18e1, 0x18ed, 0x18fc, 0x1908, 0x1914, 0x192f, 0x193f, 0x193f, + 0x194b, 0x194b, 0x195a, 0x195a, 0x1966, 0x1972, 0x1981, 0x1990, + 0x19b0, 0x19bf, 0x19ce, 0x19da, 0x19e0, 0x19e9, 0x19e9, 0x19e9, + 0x19e9, 0x19e9, 0x19f2, 0x19f2, 0x19fb, 0x1a04, 0x1a10, 0x1a1c, + 0x1a25, 0x1a31, 0x1a31, 0x1a3d, 0x1a3d, 0x1a46, 0x1a52, 0x1a5e, + // Entry 240 - 27F + 0x1a67, 0x1a70, 0x1a70, 0x1a70, 0x1a7f, 0x1a8f, 0x1a8f, 0x1a9b, + 0x1abb, 0x1ac4, 0x1adf, 0x1ae8, 0x1aff, 0x1aff, 0x1aff, 0x1b1a, + 0x1b28, 0x1b28, 0x1b28, 0x1b28, 0x1b28, 0x1b28, 0x1b28, 0x1b28, + 0x1b28, 0x1b28, 0x1b28, 0x1b34, 0x1b34, 0x1b34, 0x1b40, 0x1b5f, +} // Size: 1240 bytes + +var kyLangStr string = "" + // Size: 3906 bytes + "абхазчаафрикаанчааканчаамхарчаарабчаассамчаазербайжанчабашкырчабеларусча" + + "болгарчабамбарадабангладешчетибетчебретончобоснийчекаталанчачеченчекорс" + + "иканчачехчечувашчауелшчедатчанемисчежонгучаэбечегрекчеанглисчеэсперанто" + + "испанчаэстончобаскчафарсчафинчефижичефароэчефранцузчабатыш фризчеирланд" + + "чагалисиячагуарашгужаратчаманксычахаусачаивриттехиндичехорватчагаитичем" + + "ажарчаармянчаиндонезчеигбочоносучаисландчаиталиянчаинуктитуттаяпончожав" + + "анизчегрузинчекикуйичеказакчакалаалисутчакмерчеканнадачакорейчекашмирче" + + "курдчакорнишчекыргызчалатынчалюксембургчагандачалингалачалаочолитовчолу" + + "ба-катангачалатышчамалагасчамаоричемакедончомалайаламчамоңголчомаратиче" + + "малайчамалтизчебурмачатүндүк ндыбелченепалчаголландчанорвежче (Нинорск)" + + "норвежче (Букмал)оромочоориячапунжабичеполякчапашточопортугалчакечуачар" + + "оманшчарундичерумынчаорусчаруандачасанскритчесиндхичетүндүк самичесанго" + + "чосингалачасловакчасловенчешоначасомаличеалбанчасербчесесотосунданчашве" + + "дчесуахиличетамилчетелугучатажикчетайчатигриниачатүркмөнчөтонгачатүркчө" + + "татарчауйгурчаукраинчеурдучаөзбекчевьетнамчауолофчокосачаидишчейорубача" + + "кытайчазулучаагемчемапучедеасучабембачабеначачыгыш балучичебододочигача" + + "черокичесорани курдтаитачазамрачатөмөнкү сорбианчадуалачажола-фоничеэмб" + + "учафилипиногагаузчанемисче (Швейцария)гусичегавайчажогорку сорбианчанго" + + "мбачамачамечекабылчакамбачамакондечекабувердичекойра чиничекаленжичеком" + + "и-пермякчаконканичешамабалачабафиячалангичелакотачатүндүк луричелуочолу" + + "хиячамасайчамеручаморисианчамакуачаметөчөмохаукчамундангчамазандераниче" + + "намачатөмөнкү немисчеквасиочонкочонуерченыйанколчокичечеромбочоруачасам" + + "буручасангучатүштүк курдчасеначакойраборо сенничеташелитчетүштүк саамич" + + "елөлө саамичеинари саамическолт саамичеконго суахаличетесочоклингончота" + + "сабакчаборбордук Атлас тамазитчебелгисиз тилдевайичевунжочоворлпиричесо" + + "гачамарокко тамазигт адабий тилиндетилдик мазмун жоказыркы адабий араб " + + "тилиндеиспанча (Европа)төмөнкү саксончофламандчапортугалча (Европа)молд" + + "ованчасерб-хорваткытайча (жөнөкөйлөштүрүлгөн)кытайча (салттуу)" + +var kyLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x000e, 0x000e, 0x0022, 0x002e, 0x003c, 0x003c, + 0x0048, 0x0056, 0x0056, 0x0056, 0x006e, 0x007e, 0x0090, 0x00a0, + 0x00a0, 0x00b2, 0x00c8, 0x00d6, 0x00e6, 0x00f6, 0x0108, 0x0116, + 0x0116, 0x012a, 0x012a, 0x0134, 0x0134, 0x0142, 0x014e, 0x0158, + 0x0166, 0x0166, 0x0174, 0x017e, 0x018a, 0x019a, 0x01ac, 0x01ba, + 0x01c8, 0x01d4, 0x01e0, 0x01e0, 0x01ea, 0x01f6, 0x0204, 0x0216, + 0x022d, 0x023d, 0x023d, 0x024f, 0x025b, 0x026d, 0x027d, 0x028b, + 0x0299, 0x02a7, 0x02a7, 0x02b7, 0x02c5, 0x02d3, 0x02e1, 0x02e1, + // Entry 40 - 7F + 0x02e1, 0x02f3, 0x02f3, 0x02ff, 0x030b, 0x030b, 0x030b, 0x031b, + 0x032d, 0x0343, 0x034f, 0x0361, 0x0371, 0x0371, 0x0381, 0x0381, + 0x038f, 0x03a7, 0x03b3, 0x03c5, 0x03d3, 0x03d3, 0x03e3, 0x03ef, + 0x03ef, 0x03ff, 0x040f, 0x041d, 0x0435, 0x0443, 0x0443, 0x0455, + 0x045f, 0x046d, 0x0488, 0x0496, 0x04a8, 0x04a8, 0x04b6, 0x04c8, + 0x04de, 0x04ee, 0x04fe, 0x050c, 0x051c, 0x052a, 0x052a, 0x0547, + 0x0555, 0x0555, 0x0567, 0x0588, 0x05a7, 0x05a7, 0x05a7, 0x05a7, + 0x05a7, 0x05a7, 0x05b5, 0x05c1, 0x05c1, 0x05d3, 0x05d3, 0x05e1, + // Entry 80 - BF + 0x05ef, 0x0603, 0x0611, 0x0621, 0x062f, 0x063d, 0x0649, 0x0659, + 0x066d, 0x066d, 0x067d, 0x0696, 0x06a4, 0x06b6, 0x06c6, 0x06d6, + 0x06d6, 0x06e2, 0x06f2, 0x0700, 0x070c, 0x070c, 0x0718, 0x0728, + 0x0734, 0x0746, 0x0754, 0x0764, 0x0772, 0x077c, 0x0790, 0x07a2, + 0x07a2, 0x07b0, 0x07bc, 0x07bc, 0x07ca, 0x07ca, 0x07d8, 0x07e8, + 0x07f4, 0x0802, 0x0802, 0x0814, 0x0814, 0x0814, 0x0822, 0x082e, + 0x083a, 0x084a, 0x084a, 0x0858, 0x0864, 0x0864, 0x0864, 0x0864, + 0x0864, 0x0864, 0x0864, 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, + // Entry C0 - FF + 0x0870, 0x0870, 0x0870, 0x0870, 0x0870, 0x0880, 0x0880, 0x0880, + 0x0880, 0x0880, 0x0880, 0x0880, 0x088a, 0x088a, 0x088a, 0x088a, + 0x088a, 0x088a, 0x088a, 0x088a, 0x088a, 0x088a, 0x088a, 0x088a, + 0x088a, 0x0898, 0x0898, 0x08a4, 0x08a4, 0x08a4, 0x08bf, 0x08bf, + 0x08bf, 0x08bf, 0x08bf, 0x08bf, 0x08bf, 0x08bf, 0x08bf, 0x08bf, + 0x08bf, 0x08cb, 0x08cb, 0x08cb, 0x08cb, 0x08cb, 0x08cb, 0x08cb, + 0x08cb, 0x08cb, 0x08cb, 0x08cb, 0x08cb, 0x08d7, 0x08d7, 0x08d7, + 0x08d7, 0x08d7, 0x08d7, 0x08d7, 0x08d7, 0x08e7, 0x08e7, 0x08fc, + // Entry 100 - 13F + 0x08fc, 0x08fc, 0x08fc, 0x08fc, 0x08fc, 0x08fc, 0x090a, 0x090a, + 0x090a, 0x090a, 0x090a, 0x0918, 0x0918, 0x0939, 0x0939, 0x0947, + 0x0947, 0x095c, 0x095c, 0x095c, 0x0968, 0x0968, 0x0968, 0x0968, + 0x0968, 0x0968, 0x0968, 0x0968, 0x0968, 0x0968, 0x0968, 0x0978, + 0x0978, 0x0978, 0x0978, 0x0978, 0x0978, 0x0978, 0x0978, 0x0978, + 0x0978, 0x0978, 0x0988, 0x0988, 0x0988, 0x0988, 0x0988, 0x0988, + 0x0988, 0x0988, 0x0988, 0x0988, 0x0988, 0x0988, 0x0988, 0x0988, + 0x0988, 0x0988, 0x09ab, 0x09ab, 0x09ab, 0x09b7, 0x09b7, 0x09b7, + // Entry 140 - 17F + 0x09b7, 0x09c5, 0x09c5, 0x09c5, 0x09c5, 0x09c5, 0x09e6, 0x09e6, + 0x09e6, 0x09e6, 0x09e6, 0x09e6, 0x09e6, 0x09e6, 0x09e6, 0x09e6, + 0x09f6, 0x0a06, 0x0a06, 0x0a06, 0x0a06, 0x0a06, 0x0a14, 0x0a14, + 0x0a14, 0x0a22, 0x0a22, 0x0a22, 0x0a22, 0x0a22, 0x0a34, 0x0a4a, + 0x0a4a, 0x0a4a, 0x0a4a, 0x0a4a, 0x0a4a, 0x0a61, 0x0a61, 0x0a61, + 0x0a61, 0x0a73, 0x0a73, 0x0a8c, 0x0a9e, 0x0a9e, 0x0a9e, 0x0a9e, + 0x0a9e, 0x0a9e, 0x0a9e, 0x0a9e, 0x0ab2, 0x0ac0, 0x0ac0, 0x0ac0, + 0x0ac0, 0x0ac0, 0x0ace, 0x0ace, 0x0ace, 0x0ace, 0x0ace, 0x0ace, + // Entry 180 - 1BF + 0x0ace, 0x0ade, 0x0ade, 0x0ade, 0x0ade, 0x0af7, 0x0af7, 0x0af7, + 0x0af7, 0x0af7, 0x0b01, 0x0b01, 0x0b0f, 0x0b0f, 0x0b0f, 0x0b0f, + 0x0b0f, 0x0b0f, 0x0b0f, 0x0b0f, 0x0b0f, 0x0b1d, 0x0b1d, 0x0b1d, + 0x0b1d, 0x0b1d, 0x0b29, 0x0b3d, 0x0b3d, 0x0b4b, 0x0b57, 0x0b57, + 0x0b57, 0x0b57, 0x0b57, 0x0b67, 0x0b67, 0x0b67, 0x0b79, 0x0b79, + 0x0b79, 0x0b79, 0x0b79, 0x0b79, 0x0b79, 0x0b79, 0x0b93, 0x0b93, + 0x0b93, 0x0b9f, 0x0bbc, 0x0bbc, 0x0bbc, 0x0bbc, 0x0bbc, 0x0bcc, + 0x0bcc, 0x0bcc, 0x0bcc, 0x0bcc, 0x0bd6, 0x0bd6, 0x0be2, 0x0be2, + // Entry 1C0 - 1FF + 0x0be2, 0x0bf6, 0x0bf6, 0x0bf6, 0x0bf6, 0x0bf6, 0x0bf6, 0x0bf6, + 0x0bf6, 0x0bf6, 0x0bf6, 0x0bf6, 0x0bf6, 0x0bf6, 0x0bf6, 0x0bf6, + 0x0bf6, 0x0bf6, 0x0bf6, 0x0bf6, 0x0bf6, 0x0bf6, 0x0c02, 0x0c02, + 0x0c02, 0x0c02, 0x0c02, 0x0c02, 0x0c02, 0x0c10, 0x0c10, 0x0c10, + 0x0c10, 0x0c10, 0x0c10, 0x0c1a, 0x0c1a, 0x0c1a, 0x0c1a, 0x0c2c, + 0x0c2c, 0x0c2c, 0x0c2c, 0x0c2c, 0x0c3a, 0x0c3a, 0x0c3a, 0x0c3a, + 0x0c53, 0x0c53, 0x0c5f, 0x0c5f, 0x0c5f, 0x0c80, 0x0c80, 0x0c80, + 0x0c92, 0x0c92, 0x0c92, 0x0c92, 0x0c92, 0x0c92, 0x0cad, 0x0cc4, + // Entry 200 - 23F + 0x0cdd, 0x0cf6, 0x0cf6, 0x0cf6, 0x0cf6, 0x0cf6, 0x0cf6, 0x0cf6, + 0x0cf6, 0x0cf6, 0x0cf6, 0x0cf6, 0x0d13, 0x0d13, 0x0d13, 0x0d13, + 0x0d13, 0x0d13, 0x0d1f, 0x0d1f, 0x0d1f, 0x0d1f, 0x0d1f, 0x0d1f, + 0x0d1f, 0x0d31, 0x0d31, 0x0d31, 0x0d31, 0x0d31, 0x0d31, 0x0d31, + 0x0d31, 0x0d31, 0x0d31, 0x0d31, 0x0d31, 0x0d31, 0x0d43, 0x0d43, + 0x0d73, 0x0d73, 0x0d73, 0x0d73, 0x0d8e, 0x0d9a, 0x0d9a, 0x0d9a, + 0x0d9a, 0x0d9a, 0x0d9a, 0x0d9a, 0x0da8, 0x0da8, 0x0da8, 0x0da8, + 0x0da8, 0x0dbc, 0x0dbc, 0x0dbc, 0x0dbc, 0x0dc8, 0x0dc8, 0x0dc8, + // Entry 240 - 27F + 0x0dc8, 0x0dc8, 0x0dc8, 0x0dc8, 0x0dc8, 0x0dc8, 0x0dc8, 0x0dc8, + 0x0e03, 0x0e03, 0x0e23, 0x0e23, 0x0e54, 0x0e54, 0x0e54, 0x0e54, + 0x0e54, 0x0e54, 0x0e54, 0x0e54, 0x0e54, 0x0e71, 0x0e71, 0x0e71, + 0x0e71, 0x0e71, 0x0e90, 0x0ea2, 0x0ea2, 0x0ec5, 0x0ed9, 0x0eee, + 0x0f23, 0x0f42, +} // Size: 1244 bytes + +var loLangStr string = "" + // Size: 10775 bytes + "ອະຟາແອບຄາຊຽນອາເວັສແຕນອາຟຣິການອາການອຳຮາຣິກອາຣາໂກເນັດອາຣັບອັສຊາມີສອາວາຣິກອ" + + "າຍມາລາອາເຊີໄບຈານິບາຣກີເບລາຣັສຊຽນບັງກາຣຽນບິສລະມາບາມບາຣາເບັງກາລີທິເບທັນເ" + + "ບຣຕັນບອສນຽນຄາຕາລານຊີເຄນຊາມໍໂຣຄໍຊິກາຄີເຊກໂບດສລາວິກຊູວາຊເວວແດນິຊເຢຍລະມັນ" + + "ດີວີຮີດີຊອງຄາອິວາກຣີກອັງກິດເອສປາຍສະແປນນິຊເອສໂຕນຽນບັສກີເປີຊຽນຟູລາຟິນນິຊ" + + "ຟິຈຽນຟາໂຣສຝຣັ່ງຟຣິຊຽນ ຕາເວັນຕົກໄອຣິສສະກັອດເກລິກກາລິຊຽນກົວຣານີກູຈາຣາຕິແ" + + "ມງຊ໌ເຮົາຊາຮີບຣິວຮິນດິຮິຣິໂມຕູໂຄຣເອທຽນໄຮຕຽນຮັງກາຣຽນອາເມນຽນເຮິຮິໂຣອິນເຕີ" + + "ລິງລົວອິນໂດເນຊຽນອິນເຕີລິງກຣີອິກໂບເຊສວຍຢີອິນນູປຽກອີໂດໄອສແລນດິກອິຕາລຽນອິ" + + "ນນຸກຕິຕັດຍີ່ປຸ່ນຈາແວນີສຈໍຈຽນຄອງໂກຄິຄູຢຸກວນຍາມາຄາຊັກກຣີນແລນລິດຂະເໝນຄັນນ" + + "າດາເກົາຫລີຄານຸລິຄາສເມຍຣິເຄີດິສໂຄມິຄໍນິຊເກຍກີສລາຕິນລັກເຊມບວກກິຊແກນດາລິມ" + + "ເບີກີຊລິງກາລາລາວລິທົວນຽນລູບາ-ຄາຕັງກາລັດວຽນມາລາກາສຊີມາຊານເລັດມາວຣິແມັກເ" + + "ຊໂດນຽນມາເລອາລຳມອງໂກເລຍມາຣາທີມາເລມອລທີສມຽນມານາຢູລູເອັນເດເບເລເໜືອເນປາລີເ" + + "ອັນດອງກາດັຊນໍເວຈຽນ ນີນອກນໍເວຈຽນ ບັອກມອລນີບີລີໃຕ້ນາວາໂຈນານຈາອັອກຊີຕານໂອ" + + "ຈິບວາໂອໂຣໂມໂອຣິຢາອອດເຊຕິກປັນຈາບີປາລີໂປລິຊປາສໂຕປອກຕຸຍກິສຄີຊົວໂຣແມນຊ໌ຣຸນ" + + "ດິໂຣແມນຽນລັດເຊຍຄິນຢາວານດາສັນສະກຣິດສາດີນຽນສິນທິຊາມິເໜືອແຊງໂກສິນຫາລາສະໂລ" + + "ແວັກສະໂລເວນຽນຊາມົວໂຊນາໂຊມາລີອານບານຽນເຊີບຽນຊຣາຕິໂຊໂທໃຕ້ຊຸນແດນນີສສະວີດິຊ" + + "ຊວາຮີລິທາມິລເຕລູກູທາຈິກໄທຕິກຣິນຢາເທີກເມັນເຕສະວານາທອງການເທີຄິຊເຕຊອງກາທາ" + + "ທາຕາຮີຕຽນອຸຍເຄີຢູເຄຣນຽນອູຣດູອຸສເບກເວນດາຫວຽດນາມໂວລາພັກວໍລູມວໍລອບໂຮຊາຢິວ" + + "ໂຢຣູບາຊວາງຈີນຊູລູແອັກຊີເນັສອາໂຄລີອາແດງມີເອດີຮິແອຟີຮີລີອາເຮັມໄອນູອັກກາດ" + + "ຽມອາເລີດອານໄຕໃຕ້ອັງກິດໂບຮານແອນຈີກາອາລາມິກອາຣົວຄານຽນອາຣາປາໂຮອາຣາແວກອາຊູ" + + "ອັສຕູຮຽນອາວາຮິບາລູຊີບາລີເນັດບາຊາບາມຸນໂຄມາລາບີເຈເບັມບາບີນາບາຟັດບາໂລຈີ ພ" + + "າກຕາເວັນຕົກໂບພູຣິບີຄອນບີນີກົມຊິກຊິກາບຣາໂບດູອາຄຸດບູຣຽດບູຈີເນັດບູລູບລິນເ" + + "ມດູມບາແຄດໂດຄາຣິບຄາຢູກາອາດແຊມຊີບູໂນຊີກາຊິບຊາຊາກາໄຕຊູເກດມາຣິຊີນຸກຈາກອນຊອ" + + "ກຕິວຊີພິວຢານຊີໂຣກີຊີເຢນນີໂຊຣານິ ເຄີດິຊຄອບຕິກຄຣີເມນເຕີຄິຊກາຊູບຽນດາໂກຕາດ" + + "າກວາໄຕຕາເດລາວາຊີເລັບໂດກຣິບດິນກາຊາມາດອກຣີຊໍບຽນຕໍ່ກວ່າດົວລາດັກກາງໂຈລາ-ຟອ" + + "ນຢີດູລາດາຊາກາເອັມບູອີຟິກອີຢິບບູຮານອີກາຈັກອີລາໄມອັງກິດກາງອີວອນດູແຟງຟີລິ" + + "ປີໂນຟອນຟຮັ່ງເສດກາງຟຮັ່ງເສດໂບຮານຟຣີຊຽນເໜືອຟຣີຊຽນຕາເວັນອອກຟຣີລຽນກາກາກາອຸ" + + "ຊກາໂຢບາຍາກີກິນເບີເທັດເຢຍລະມັນສູງກາງເຢຍລະມັນສູງໂບຮານກອນດີໂກຣອນຕາໂຣກອດຮິ" + + "ກກຣີໂບແອນຊຽນກຣີກສະວິສ ເຈີແມນກູຊິວິດອິນໄຮດາຮາໄວອຽນຮິຣິໄກນອນຮິດໄຕມອງຊໍບຽ" + + "ນ ທາງຕອນເໜືອຮູປາໄອບານໄອໄບໄບໂອໄອໂລໂກອິນກັຊໂລບບັນງອມບາມາແຊມຈູແດວ-ເພີຊຽນຈ" + + "ູແດວ-ອາລາບິກກາຣາ-ການປາກກາໄບລ໌ກາຊິນຈຣູກາມບາກະວີກາບາດຽນຄາແນມບູຕີບມາຄອນເດ" + + "ຄາເວີເດຍນູໂຄໂລຄາສິໂຄຕັນຄອຍຣາ ຊິນີຄາໂກຄາເລັນຈິນຄິມບັນດູໂຄມີ-ເພີມຢັກກອນກ" + + "ານີຄູສໄລກາແປຣກາຣາໄຊ-ບານກາກາເຣລຽນກູຣູກຊຳບາລ້າບາເຟຍໂຄລອກນຽນຄູມີກຄູເທໄນລາ" + + "ດີໂນແລນກິລານດາແລມບາລີຊຽນລາໂກຕາແມັງໂກ້ໂລຊິລູຣິ ທາງຕອນເໜືອລູບາ-ລູລົວລູເຊ" + + "ໂນລຸນດາລົວລູໄຊລູໄຍມາດູລາມາຟາມາກາຮິໄມທີລິມາກາຊາຣມັນດິງກາມາໄຊມາບາມອກຊາມາ" + + "ນດາຣເມນເດເມຣູມໍຣິສເຢນໄອລິດກາງມາຄູວາ-ມີດໂຕເມທາມິກແມກທີແນງກາບູແມນຈູມານີພ" + + "ູຣິໂມຫາມອສຊີມັນດັງຫລາຍພາສາຄຣິກມີລັນດາມາວາຣິມໍຢິນເອີຍາມາແຊນເດີລັງນາໂປລີ" + + "ນາມາເຢຍລະມັນ ຕອນໄຕ້ນີວາຣິນີ່ອັດນີ່ອູກວາຊີໂອຈີ່ມບູນນໍໄກນໍໂບຮານເອັນໂກໂຊໂ" + + "ທເໜືອເນີເນວາດັ້ງເດີມນາມວີຊິນານຄອນໂນໂຣນິມາໂອແຊກຕູກີອອດໂຕມັນປານກາຊີມານພາ" + + "ລາວີປາມປານກາປາມເປຍເມັນໂທປາລົວອານເປີເຊຍໂບຮານຟີນີເຊຍພອນເພໂປວອງຊານໂບຮານKʼ" + + "icheʼຣາຈັສທານິຣາປານຸຍຣາໂຣທອນການຣົມໂບໂຣເມນີອາໂຣມານຽນອາຣວາຊັນດາວຊາກາສາມາຣິ" + + "ແຕນ-ຊຳບູຣູຊາຊັກຊານທາລິກຳເບຊານກູຊີຊິລີນສກອດພາກໄຕ້ ຂອງ ກູດິດຊີນາເຊນຄັບໂຄ" + + "ຍຣາໂບໂຣ ເຊນນິອີຣິຊເກົ່າທາເຊວຫິດໄທໃຫ່ຍອາລັບ-ຊາດຊິດາໂມຊາມິໃຕ້ລຸນຊາມິອີນາ" + + "ຣິຊາມິສກອດຊາມິໂຊນິນກີຊອກດິນສຣານນານຕອນໂກເຊເລີຊາໂຮຊູຄູມ້າຊູຊູຊູເມີເລຍໂຄໂ" + + "ນຣຽນຄອງໂກ ຊວາຮີລິຊີເລຍແບບດັ້ງເດີມຊີເລຍທີມເນເຕໂຊເຕເລໂນເຕຕູມໄທກຣີຕີວໂຕເກ" + + "ເລົາຄຣິງກອນທລີງກິດທາມາກເຊກນາຍອາຊາຕອງກາທອກພີຊິນຕາໂລໂກຊີມຊີແອນຕຳບູກາຕູວາ" + + "ລູຕາຊາວັກຕູວີນຽນອັດລາສ ທາມາຊີກ ກາງອຸດມັດຢູກາລິກອຳບັນດູລູດໄວໂວຕິກວັນໂຈວ" + + "າເຊີວາລາໂມວາເລວາໂຊວາຣພິຣິການມິກໂຊກາເຢົ້າຢັບແຍງເບນແຢມບາກວາງຕຸ້ງຊາໂປແຕບສ" + + "ັນຍາລັກບລີຊິມເຊນາກາໂມຣັອກແຄນ ທາມາຊີກ ມາດຕະຖານຊູນີບໍ່ມີເນື້ອຫາພາສາຊາຊາອ" + + "າຣາບິກມາດຕະຖານສະໄໝໃໝ່ເຢຍລະມັນ (ໂອສຕຣິດ)ສະວິສ ໄຮ ເຈີແມນອັງກິດ (ໂອດສະຕາລ" + + "ີ)ອັງກິດ (ບຣິດທິຊ)ອັງກິດ (ອາເມລິກັນ)ລາຕິນ ອາເມຣິກັນ ສະແປນນິຊສະເປັນ ຢຸໂ" + + "ຣບເມັກຊິກັນ ສະແປນນິຊຟລັງ(ການາດາ)ຊາຊອນ ຕອນໄຕຟລີມິຊປອກຕຸຍກິສ ບະເລຊີ່ນປອກ" + + "ຕຸຍກິສ ຢຸໂຣບໂມດາວຽນເຊີໂບ-ໂກເຊຍຈີນແບບຮຽບງ່າຍຈີນແບບດັ້ງເດີມ" + +var loLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000c, 0x0024, 0x003f, 0x0057, 0x0066, 0x007b, 0x0099, + 0x00a8, 0x00c0, 0x00d5, 0x00ea, 0x010b, 0x011a, 0x0138, 0x0150, + 0x0165, 0x017a, 0x0192, 0x01a7, 0x01b9, 0x01cb, 0x01e0, 0x01ef, + 0x0201, 0x0213, 0x0219, 0x0222, 0x023d, 0x024c, 0x0255, 0x0264, + 0x027c, 0x028e, 0x02a3, 0x02af, 0x02bb, 0x02cd, 0x02df, 0x02f7, + 0x030f, 0x031e, 0x0330, 0x033c, 0x034e, 0x035d, 0x036c, 0x037b, + 0x03a9, 0x03b8, 0x03d9, 0x03ee, 0x0403, 0x041b, 0x042a, 0x043c, + 0x044e, 0x045d, 0x0475, 0x048d, 0x049c, 0x04b4, 0x04c9, 0x04de, + // Entry 40 - 7F + 0x0502, 0x0520, 0x0544, 0x0553, 0x0568, 0x0580, 0x058c, 0x05a7, + 0x05bc, 0x05dd, 0x05f2, 0x0607, 0x0616, 0x0625, 0x0637, 0x064c, + 0x065b, 0x0679, 0x0688, 0x069d, 0x06b2, 0x06c4, 0x06dc, 0x06ee, + 0x06fa, 0x0709, 0x071b, 0x072a, 0x074e, 0x075d, 0x0778, 0x078d, + 0x0796, 0x07ae, 0x07d0, 0x07e2, 0x07fd, 0x0818, 0x0827, 0x0848, + 0x0860, 0x0878, 0x088a, 0x0896, 0x08a8, 0x08b7, 0x08c9, 0x08f3, + 0x0905, 0x0920, 0x0929, 0x094e, 0x0979, 0x0994, 0x09a6, 0x09b5, + 0x09d0, 0x09e5, 0x09f7, 0x0a09, 0x0a21, 0x0a36, 0x0a42, 0x0a51, + // Entry 80 - BF + 0x0a60, 0x0a7b, 0x0a8a, 0x0a9f, 0x0aae, 0x0ac3, 0x0ad5, 0x0af3, + 0x0b0e, 0x0b23, 0x0b32, 0x0b4a, 0x0b59, 0x0b6e, 0x0b86, 0x0ba1, + 0x0bb0, 0x0bbc, 0x0bce, 0x0be6, 0x0bf8, 0x0c07, 0x0c1c, 0x0c37, + 0x0c4c, 0x0c61, 0x0c70, 0x0c82, 0x0c91, 0x0c97, 0x0caf, 0x0cc7, + 0x0cdf, 0x0cf1, 0x0d03, 0x0d18, 0x0d24, 0x0d39, 0x0d4b, 0x0d63, + 0x0d72, 0x0d84, 0x0d93, 0x0da8, 0x0dbd, 0x0dcc, 0x0ddb, 0x0de7, + 0x0df0, 0x0e02, 0x0e0e, 0x0e17, 0x0e23, 0x0e41, 0x0e53, 0x0e68, + 0x0e7a, 0x0e7a, 0x0e92, 0x0ea4, 0x0eb0, 0x0ec8, 0x0ec8, 0x0eda, + // Entry C0 - FF + 0x0eda, 0x0ef2, 0x0f13, 0x0f28, 0x0f3d, 0x0f5b, 0x0f5b, 0x0f73, + 0x0f73, 0x0f88, 0x0f88, 0x0f88, 0x0f94, 0x0f94, 0x0fac, 0x0fac, + 0x0fbe, 0x0fd0, 0x0fe8, 0x0fe8, 0x0ff4, 0x1003, 0x1003, 0x1015, + 0x1021, 0x1033, 0x1033, 0x103f, 0x104e, 0x104e, 0x1085, 0x1097, + 0x10a6, 0x10b2, 0x10b2, 0x10bb, 0x10d0, 0x10d0, 0x10d0, 0x10d9, + 0x10d9, 0x10e5, 0x10f4, 0x1103, 0x111b, 0x1127, 0x1133, 0x1148, + 0x1157, 0x1166, 0x1178, 0x118a, 0x119c, 0x11a8, 0x11b7, 0x11c9, + 0x11d8, 0x11e4, 0x1202, 0x1214, 0x122c, 0x123e, 0x1253, 0x1278, + // Entry 100 - 13F + 0x128a, 0x128a, 0x12ae, 0x12c3, 0x12d5, 0x12e4, 0x12f0, 0x1302, + 0x1314, 0x1326, 0x1335, 0x1341, 0x1350, 0x1374, 0x1374, 0x1383, + 0x1395, 0x13b1, 0x13bd, 0x13cf, 0x13e1, 0x13f0, 0x13f0, 0x140e, + 0x1423, 0x1435, 0x1450, 0x1450, 0x1465, 0x1465, 0x146e, 0x1486, + 0x1486, 0x148f, 0x148f, 0x14b0, 0x14d7, 0x14d7, 0x14f5, 0x1522, + 0x1534, 0x153a, 0x154f, 0x154f, 0x155b, 0x1567, 0x1567, 0x156d, + 0x158b, 0x158b, 0x15b5, 0x15e5, 0x15e5, 0x15f4, 0x160f, 0x1621, + 0x1630, 0x164e, 0x1670, 0x1670, 0x1670, 0x167c, 0x168e, 0x169a, + // Entry 140 - 17F + 0x169a, 0x16af, 0x16af, 0x16ca, 0x16d9, 0x16e2, 0x1710, 0x1710, + 0x171c, 0x172b, 0x1743, 0x1755, 0x1767, 0x1767, 0x1767, 0x1779, + 0x1788, 0x1797, 0x17b9, 0x17de, 0x17de, 0x17fd, 0x180f, 0x181e, + 0x1827, 0x1836, 0x1842, 0x1857, 0x186c, 0x1875, 0x188a, 0x18a8, + 0x18a8, 0x18b4, 0x18b4, 0x18c0, 0x18cf, 0x18eb, 0x18eb, 0x18eb, + 0x18f7, 0x1912, 0x192a, 0x194c, 0x1961, 0x1970, 0x197f, 0x19a1, + 0x19a1, 0x19a1, 0x19b6, 0x19c5, 0x19da, 0x19e9, 0x1a01, 0x1a10, + 0x1a22, 0x1a34, 0x1a43, 0x1a52, 0x1a61, 0x1a70, 0x1a70, 0x1a70, + // Entry 180 - 1BF + 0x1a70, 0x1a82, 0x1a82, 0x1a97, 0x1aa3, 0x1ace, 0x1ace, 0x1aea, + 0x1afc, 0x1b0b, 0x1b14, 0x1b20, 0x1b2c, 0x1b2c, 0x1b2c, 0x1b3e, + 0x1b4a, 0x1b5c, 0x1b6e, 0x1b83, 0x1b9b, 0x1ba7, 0x1bb3, 0x1bc2, + 0x1bd4, 0x1be3, 0x1bef, 0x1c07, 0x1c1f, 0x1c41, 0x1c4d, 0x1c5f, + 0x1c7a, 0x1c89, 0x1ca1, 0x1cad, 0x1cbc, 0x1cbc, 0x1cce, 0x1ce6, + 0x1cf2, 0x1d07, 0x1d19, 0x1d19, 0x1d28, 0x1d37, 0x1d58, 0x1d58, + 0x1d6a, 0x1d76, 0x1da1, 0x1db3, 0x1dc5, 0x1dd4, 0x1dd4, 0x1de9, + 0x1dfe, 0x1e0a, 0x1e1f, 0x1e1f, 0x1e31, 0x1e49, 0x1e52, 0x1e76, + // Entry 1C0 - 1FF + 0x1e8b, 0x1e9d, 0x1ea9, 0x1eb5, 0x1ec4, 0x1ee8, 0x1f06, 0x1f18, + 0x1f30, 0x1f54, 0x1f6c, 0x1f6c, 0x1f6c, 0x1f6c, 0x1f8d, 0x1f8d, + 0x1fa2, 0x1fa2, 0x1fa2, 0x1fb1, 0x1fb1, 0x1fd8, 0x1fe1, 0x1fe1, + 0x1ffc, 0x2011, 0x202f, 0x202f, 0x202f, 0x203e, 0x2050, 0x2050, + 0x2050, 0x2050, 0x206b, 0x207a, 0x208c, 0x2098, 0x20b4, 0x20c6, + 0x20d5, 0x20ea, 0x20ea, 0x20f6, 0x2105, 0x211a, 0x2126, 0x2126, + 0x2152, 0x2152, 0x215e, 0x215e, 0x2170, 0x219b, 0x21b9, 0x21b9, + 0x21d1, 0x21e3, 0x21fc, 0x220e, 0x220e, 0x220e, 0x2223, 0x2238, + // Entry 200 - 23F + 0x2256, 0x226e, 0x2283, 0x2295, 0x22b9, 0x22c8, 0x22d4, 0x22d4, + 0x22e9, 0x22f5, 0x230d, 0x2322, 0x2347, 0x2377, 0x2386, 0x2386, + 0x2386, 0x2395, 0x23a1, 0x23b3, 0x23c2, 0x23d1, 0x23da, 0x23f2, + 0x23f2, 0x2407, 0x241c, 0x241c, 0x2434, 0x2458, 0x2470, 0x2470, + 0x2482, 0x2482, 0x249a, 0x249a, 0x24ac, 0x24be, 0x24d3, 0x24e8, + 0x251a, 0x252c, 0x2541, 0x2556, 0x255f, 0x2565, 0x2565, 0x2565, + 0x2565, 0x2565, 0x2574, 0x2574, 0x2583, 0x2592, 0x25a4, 0x25b0, + 0x25bc, 0x25d1, 0x25d1, 0x25e3, 0x25e3, 0x25ef, 0x25fe, 0x2607, + // Entry 240 - 27F + 0x2619, 0x2628, 0x2628, 0x2640, 0x2655, 0x267f, 0x267f, 0x2691, + 0x26db, 0x26e7, 0x2717, 0x2723, 0x2765, 0x2765, 0x2795, 0x27be, + 0x27ee, 0x27ee, 0x2818, 0x2848, 0x288c, 0x28ae, 0x28e2, 0x28e2, + 0x2902, 0x2902, 0x2921, 0x2933, 0x2967, 0x2992, 0x29a7, 0x29c6, + 0x29ed, 0x2a17, +} // Size: 1244 bytes + +var ltLangStr string = "" + // Size: 5831 bytes + "afarųabchazųavestųafrikanųakanųamharųaragonesųarabųasamųavarikųaimarųaze" + + "rbaidžaniečiųbaškirųbaltarusiųbulgarųbislamabambarųbengalųtibetiečiųbret" + + "onųbosniųkatalonųčečėnųčamorųkorsikiečiųkryčekųbažnytinė slavųčiuvašųval" + + "ųdanųvokiečiųdivehibotijųeviųgraikųanglųesperantoispanųestųbaskųpersųfu" + + "lahųsuomiųfidžiųfarerųprancūzųvakarų fryzųairiųškotų (gėlų)galisųgvarani" + + "ųgudžaratųmeniečiųhausųhebrajųhindihiri motukroatųHaičiovengrųarmėnųher" + + "erointerlingvaindoneziečiųinterkalbaigbųsičuan jiinupiakidoislandųitalųi" + + "nukitutjaponųjaviečiųgruzinųKongokikujųkuaniamakazachųkalalisutkhmerųkan" + + "adųkorėjiečiųkanurikašmyrųkurdųkomikornųkirgizųlotynųliuksemburgiečiųgan" + + "dalimburgišngalųlaosiečiųlietuviųluba katangalatviųmalagasųMaršalo Salųm" + + "aoriųmakedonųmalajaliųmongolųmaratųmalajiečiųmaltiečiųbirmiečiųnaurųšiau" + + "rės ndebelųnepaliečiųndongųolandųnaujoji norvegųNorvegijos rašytinė – bū" + + "kmolųpietų ndebelenavajųnianjaočitarųojibvaoromųorijųosetinųpendžabųpali" + + "lenkųpuštūnųportugalųkečujųretoromanųrundirumunųrusųkinjaruandųsanskrita" + + "ssardiniečiųsindųšiaurės samiųsangosinhalųslovakųslovėnųsamoašonųsomalie" + + "čiųalbanųserbųsvatipietų sesutosundųšvedųsuahiliųtamilųtelugųtadžikųtaj" + + "ųtigrajųturkmėnųtsvanatonganųturkųtsongatotoriųtaitiečiųuigūrųukrainieč" + + "iųurdųuzbekųvendavietnamiečiųvolapiukvalonųvolofųkosųjidišjorubųchuangki" + + "nųzulųačinezųakoliųadangmųadygėjųTuniso arabųafrihiliaghemųainųakadianųa" + + "labamiečiųaleutųalbanų kalbos gegų tarmėpietų Altajaussenoji anglųangikų" + + "aramaikųmapudungunųaraonųarapahųAlžyro arabųaravakųMaroko arabųEgipto ar" + + "abųasuAmerikos ženklų kalbaasturianųkotavaavadhibalučibalinezųbavarųbasų" + + "bamunųbatak tobaghomalųbėjųbembųbetavibenųbafutųbadagavakarų beludžiųbau" + + "čpuribikolųbinibandžarųkomųsiksikaBišnuprijosbakhtiaribrajųbrahujųbodoa" + + "kūsųburiatųbuginezųbulublinmedumbųkadokaribųkaijūgųatsamųcebuanųčigųčibč" + + "ačagatųčukesųmaričinuk žargonasčoktaučipvėjųčerokiųčajenųsoranių kurdųko" + + "ptųcapiznonKrymo turkųkašubųdakotųdargvataitųdelaveroslavedogribųdinkųza" + + "rmųdogrižemutinių sorbųcentrinio DusunodualųVidurio Vokietijosdžiola-fon" + + "idyulųdazagųembuefikitalų kalbos Emilijos tarmėsenovės egiptiečiųekajuke" + + "lamitųVidurio Anglijoscentrinės Aliaskos jupikųevondoispanų kalbos Ekstr" + + "emadūros tarmėfangfilipiniečiųsuomių kalbos Tornedalio tarmėfonkadžunų p" + + "rancūzųVidurio Prancūzijossenoji prancūzųArpitanošiaurinių fryzųrytų fry" + + "zųfrulangagagaūzųkinų kalbos dziangsi tarmėgajogbajazoroastrų darigyzkir" + + "ibatigilakiVidurio Aukštosios VokietijosSenoji Aukštosios VokietijosGoa " + + "konkaniųgondigorontalogotųgrebosenovės graikųŠveicarijos vokiečiųvajųfra" + + "fragusigvičinohaidokinų kalbos hakų tarmėhavajiečiųFidžio hindihiligaino" + + "nhititųhmongaukštutinių sorbųkinų kalbos hunano tarmėhupaibanibibioiloko" + + "ingušųingrųJamaikos kreolų anglųloibanngombųmačamųjudėjų persųjudėjų ara" + + "bųdanų kalbos jutų tarmėkarakalpakųkebailųkačinjukembųkavikabardinųkanem" + + "bųtyapmakondųŽaliojo Kyšulio kreolųkenyangkorokaingangkasikotanezųkojra " + + "činikhovarųkirmanjkikakokalenjinųkimbundukomių-permiųkonkaniųkosreanųkp" + + "elekaračiajų balkarijoskriokinaray-akarelųkurukšambalųbafųkolognųkumikųk" + + "utenailadinolangilandalambalezginųnaujoji frankų kalbaligūrųlyviųlakotųl" + + "ombardųmongolozišiaurės lurilatgaliųluba lulualuisenolundaluomizolujakla" + + "sikinė kinųlazmadurezųmafųmagahimaithilimakasaromandingomasajųmabųmokšam" + + "andarmendemerųmorisijųVidurio Airijosmakua-maetometamikmakminankabumanču" + + "manipurimohokmosivakarų marimundangųkelios kalboskrykųmirandezųmarvarime" + + "ntavaimjenųerzyjųmazenderaniųkinų kalbos pietų minų tarmėneapoliečiųnama" + + "Žemutinės Vokietijosnevariniasniuenųao nagakvasiųngiembūnųnogųnorsunovi" + + "alenkošiaurės sothųnuerųklasikinė nevariniamveziniankolųnioronzimaosageo" + + "smanų turkųpangasinanpahlavipampangapapiementopalaupikardųPensilvanijos " + + "vokiečiųvokiečių kalbos žemaičių tarmėsenoji persųvokiečių kalbos Pfalco" + + " tarmėfinikiečiųitalų kalbos Pjemonto tarmėPontoPonapėsprūsųsenovės prov" + + "ansalųkičiųČimboraso aukštumų kečujųradžastanorapanuirarotonganitalų kal" + + "bos Romanijos tarmėrifųromboromųrotumanųrusinųRovianosaromaniųruasandavi" + + "jakutųsamarėjų aramiųsambūrųsasaksantalisauraštrųngambajųsangųsiciliečių" + + "škotųsasaresų sardinųpietų kurdųsenecųsenųseriselkupkojraboro senisenoj" + + "i airiųžemaičiųtachelhitųšanchadian arabųsidamosileziečių žemaičiųselaja" + + "rųpietų samiųLulėjo samiųInario samiųSkolto samiųsoninkesogdiensranan to" + + "ngosererųsahoSaterlendo fryzųsukumasusušumerųKomorųKongo suahiliųklasiki" + + "nė siriečiųsirųsileziečiųtulųtimnetesoterenotetumtigretivtokelautsakurųk" + + "lingonųtlingittalyšųtamašekniasa tongostok pisinturoyotarokotsakonųtsimš" + + "ianmusulmonų tatųtumbukųtuvalutasavakųtuviųCentrinio Maroko tamazitųudmu" + + "rtųugariticumbundurūtvaivenetųvepsųvakarų flamandųpagrindinė frankonųvot" + + "ikvõrovunjovalserųvalamovaraivašovalrpirikinų kalbos vu tarmėkalmukųmegr" + + "elųsogųjaojapezųjangbenųjembųnjengatukinų kalbos Kantono tarmėzapotekų„B" + + "liss“ simboliųzelandųzenagastandartinė Maroko tamazigtųzuninėra kalbinio" + + " turiniozazašiuolaikinė standartinė arabųAustrijos vokiečiųŠveicarijos a" + + "ukštutinė vokiečiųAustralijos anglųKanados anglųDidžiosios Britanijos an" + + "glųJungtinių Valstijų anglųLotynų Amerikos ispanųEuropos ispanųMeksikos " + + "ispanųKanados prancūzųŠveicarijos prancūzųŽemutinės Saksonijos (Nyderlan" + + "dai)flamandųBrazilijos portugalųEuropos portugalųmoldavųserbų-kroatųsupa" + + "prastintoji kinųtradicinė kinų" + +var ltLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0006, 0x000e, 0x0015, 0x001e, 0x0024, 0x002b, 0x0035, + 0x003b, 0x0041, 0x0049, 0x0050, 0x0063, 0x006c, 0x0077, 0x007f, + 0x0086, 0x008e, 0x0096, 0x00a2, 0x00aa, 0x00b1, 0x00ba, 0x00c4, + 0x00cc, 0x00d9, 0x00dc, 0x00e2, 0x00f4, 0x00fe, 0x0103, 0x0108, + 0x0112, 0x0118, 0x011f, 0x0124, 0x012b, 0x0131, 0x013a, 0x0141, + 0x0146, 0x014c, 0x0152, 0x0159, 0x0160, 0x0168, 0x016f, 0x0179, + 0x0187, 0x018d, 0x019d, 0x01a4, 0x01ad, 0x01b8, 0x01c2, 0x01c8, + 0x01d0, 0x01d5, 0x01de, 0x01e5, 0x01ec, 0x01f3, 0x01fb, 0x0201, + // Entry 40 - 7F + 0x020c, 0x021a, 0x0224, 0x0229, 0x0233, 0x023a, 0x023d, 0x0245, + 0x024b, 0x0253, 0x025a, 0x0264, 0x026c, 0x0271, 0x0278, 0x0280, + 0x0288, 0x0291, 0x0298, 0x029f, 0x02ac, 0x02b2, 0x02bb, 0x02c1, + 0x02c5, 0x02cb, 0x02d3, 0x02da, 0x02ec, 0x02f1, 0x02fb, 0x0301, + 0x030c, 0x0315, 0x0321, 0x0328, 0x0331, 0x033f, 0x0346, 0x034f, + 0x0359, 0x0361, 0x0368, 0x0374, 0x037f, 0x038a, 0x0390, 0x03a2, + 0x03ae, 0x03b5, 0x03bc, 0x03cc, 0x03ef, 0x03fd, 0x0404, 0x040a, + 0x0413, 0x0419, 0x041f, 0x0425, 0x042d, 0x0437, 0x043b, 0x0441, + // Entry 80 - BF + 0x044b, 0x0455, 0x045d, 0x0468, 0x046d, 0x0474, 0x0479, 0x0485, + 0x048f, 0x049c, 0x04a2, 0x04b2, 0x04b7, 0x04bf, 0x04c7, 0x04d0, + 0x04d5, 0x04db, 0x04e7, 0x04ee, 0x04f4, 0x04f9, 0x0506, 0x050c, + 0x0513, 0x051c, 0x0523, 0x052a, 0x0533, 0x0538, 0x0540, 0x054a, + 0x0550, 0x0558, 0x055e, 0x0564, 0x056c, 0x0577, 0x057f, 0x058c, + 0x0591, 0x0598, 0x059d, 0x05ab, 0x05b3, 0x05ba, 0x05c1, 0x05c6, + 0x05cc, 0x05d3, 0x05d9, 0x05de, 0x05e3, 0x05ec, 0x05f3, 0x05fb, + 0x0604, 0x0611, 0x0619, 0x0620, 0x0625, 0x062e, 0x063b, 0x0642, + // Entry C0 - FF + 0x065d, 0x066c, 0x0679, 0x0680, 0x0689, 0x0695, 0x069c, 0x06a4, + 0x06b2, 0x06ba, 0x06c7, 0x06d4, 0x06d7, 0x06ee, 0x06f8, 0x06fe, + 0x0704, 0x070b, 0x0714, 0x071b, 0x0720, 0x0727, 0x0731, 0x0739, + 0x073f, 0x0745, 0x074b, 0x0750, 0x0757, 0x075d, 0x076f, 0x0778, + 0x077f, 0x0783, 0x078d, 0x0792, 0x0799, 0x07a5, 0x07ae, 0x07b4, + 0x07bc, 0x07c0, 0x07c7, 0x07cf, 0x07d8, 0x07dc, 0x07e0, 0x07e8, + 0x07ec, 0x07f3, 0x07fc, 0x0803, 0x080b, 0x0811, 0x0818, 0x0820, + 0x0828, 0x082c, 0x083c, 0x0843, 0x084d, 0x0856, 0x085e, 0x086d, + // Entry 100 - 13F + 0x0873, 0x087b, 0x0887, 0x088f, 0x0896, 0x089c, 0x08a2, 0x08aa, + 0x08af, 0x08b7, 0x08bd, 0x08c3, 0x08c8, 0x08da, 0x08ea, 0x08f0, + 0x0902, 0x090e, 0x0914, 0x091b, 0x091f, 0x0923, 0x0940, 0x0955, + 0x095b, 0x0963, 0x0973, 0x098e, 0x0994, 0x09b8, 0x09bc, 0x09ca, + 0x09ea, 0x09ed, 0x0a01, 0x0a15, 0x0a26, 0x0a2e, 0x0a40, 0x0a4c, + 0x0a52, 0x0a54, 0x0a5d, 0x0a79, 0x0a7d, 0x0a82, 0x0a91, 0x0a94, + 0x0a9c, 0x0aa2, 0x0ac0, 0x0add, 0x0aea, 0x0aef, 0x0af8, 0x0afd, + 0x0b02, 0x0b12, 0x0b29, 0x0b2e, 0x0b34, 0x0b38, 0x0b40, 0x0b45, + // Entry 140 - 17F + 0x0b5e, 0x0b6a, 0x0b77, 0x0b81, 0x0b88, 0x0b8d, 0x0ba1, 0x0bbb, + 0x0bbf, 0x0bc3, 0x0bc9, 0x0bce, 0x0bd6, 0x0bdc, 0x0bf3, 0x0bf9, + 0x0c00, 0x0c08, 0x0c17, 0x0c26, 0x0c3f, 0x0c4b, 0x0c53, 0x0c59, + 0x0c5b, 0x0c61, 0x0c65, 0x0c6f, 0x0c77, 0x0c7b, 0x0c83, 0x0c9c, + 0x0ca3, 0x0ca7, 0x0caf, 0x0cb3, 0x0cbc, 0x0cc7, 0x0ccf, 0x0cd8, + 0x0cdc, 0x0ce6, 0x0cee, 0x0cfc, 0x0d05, 0x0d0e, 0x0d13, 0x0d29, + 0x0d2d, 0x0d36, 0x0d3d, 0x0d42, 0x0d4b, 0x0d50, 0x0d58, 0x0d5f, + 0x0d66, 0x0d6c, 0x0d71, 0x0d76, 0x0d7b, 0x0d83, 0x0d98, 0x0da0, + // Entry 180 - 1BF + 0x0da6, 0x0dad, 0x0db6, 0x0dbb, 0x0dbf, 0x0dcd, 0x0dd6, 0x0de0, + 0x0de7, 0x0dec, 0x0def, 0x0df3, 0x0df7, 0x0e07, 0x0e0a, 0x0e13, + 0x0e18, 0x0e1e, 0x0e26, 0x0e2e, 0x0e36, 0x0e3d, 0x0e42, 0x0e48, + 0x0e4e, 0x0e53, 0x0e58, 0x0e61, 0x0e70, 0x0e7b, 0x0e7f, 0x0e85, + 0x0e8e, 0x0e94, 0x0e9c, 0x0ea1, 0x0ea5, 0x0eb1, 0x0eba, 0x0ec7, + 0x0ecd, 0x0ed7, 0x0ede, 0x0ee6, 0x0eec, 0x0ef3, 0x0f00, 0x0f20, + 0x0f2d, 0x0f31, 0x0f47, 0x0f4d, 0x0f51, 0x0f58, 0x0f5f, 0x0f66, + 0x0f71, 0x0f76, 0x0f7b, 0x0f81, 0x0f85, 0x0f95, 0x0f9b, 0x0fac, + // Entry 1C0 - 1FF + 0x0fb4, 0x0fbd, 0x0fc2, 0x0fc7, 0x0fcc, 0x0fda, 0x0fe4, 0x0feb, + 0x0ff3, 0x0ffd, 0x1002, 0x100a, 0x1022, 0x1046, 0x1053, 0x1072, + 0x107e, 0x109b, 0x10a0, 0x10a8, 0x10af, 0x10c3, 0x10ca, 0x10e8, + 0x10f3, 0x10fa, 0x1104, 0x1122, 0x1127, 0x112c, 0x1131, 0x113a, + 0x1141, 0x1149, 0x1152, 0x1155, 0x115c, 0x1163, 0x1175, 0x117e, + 0x1183, 0x118a, 0x1195, 0x119e, 0x11a4, 0x11b0, 0x11b7, 0x11c9, + 0x11d6, 0x11dd, 0x11e2, 0x11e6, 0x11ec, 0x11fa, 0x1207, 0x1212, + 0x121d, 0x1221, 0x122f, 0x1235, 0x124d, 0x1256, 0x1263, 0x1271, + // Entry 200 - 23F + 0x127e, 0x128b, 0x1292, 0x1299, 0x12a5, 0x12ac, 0x12b0, 0x12c1, + 0x12c7, 0x12cb, 0x12d3, 0x12da, 0x12e9, 0x12fe, 0x1303, 0x130f, + 0x1314, 0x1319, 0x131d, 0x1323, 0x1328, 0x132d, 0x1330, 0x1337, + 0x133f, 0x1348, 0x134f, 0x1357, 0x135f, 0x136b, 0x1374, 0x137a, + 0x1380, 0x1388, 0x1391, 0x13a1, 0x13a9, 0x13af, 0x13b8, 0x13be, + 0x13d8, 0x13e0, 0x13e8, 0x13ef, 0x13f3, 0x13f6, 0x13fd, 0x1403, + 0x1414, 0x1429, 0x142e, 0x1433, 0x1438, 0x1440, 0x1446, 0x144b, + 0x1450, 0x1458, 0x146e, 0x1476, 0x147e, 0x1483, 0x1486, 0x148d, + // Entry 240 - 27F + 0x1496, 0x149c, 0x14a4, 0x14bf, 0x14c8, 0x14dd, 0x14e5, 0x14eb, + 0x1509, 0x150d, 0x1523, 0x1527, 0x1548, 0x1548, 0x155c, 0x1580, + 0x1592, 0x15a0, 0x15bd, 0x15d8, 0x15f0, 0x15ff, 0x160f, 0x160f, + 0x1621, 0x1638, 0x165c, 0x1665, 0x167a, 0x168c, 0x1694, 0x16a2, + 0x16b7, 0x16c7, +} // Size: 1244 bytes + +var lvLangStr string = "" + // Size: 4332 bytes + "afāruabhāzuavestaafrikanduakanuamharuaragoniešuarābuasamiešuavāruaimarua" + + "zerbaidžāņubaškīrubaltkrievubulgārubišlamābambarubengāļutibetiešubretoņu" + + "bosniešukatalāņučečenučamorrukorsikāņukrīčehubaznīcslāvučuvašuvelsiešudā" + + "ņuvācumaldīviešudzongkeevugrieķuangļuesperantospāņuigauņubaskupersiešuf" + + "ulusomufidžiešufērufrančurietumfrīzuīrugēlugalisiešugvaranugudžaratumeni" + + "ešuhausuivritshindihirimotuhorvātuhaitiešuungāruarmēņuhereruinterlingvai" + + "ndonēziešuinterlingveigboSičuaņas jiinupiakuidoīslandiešuitāļuinuītujapā" + + "ņujaviešugruzīnukongukikujukvaņamukazahugrenlandiešukhmerukannadukoreji" + + "ešukanurukašmiriešukurdukomiešukorniešukirgīzulatīņuluksemburgiešugandul" + + "imburgiešulingalalaosiešulietuviešulubakatangalatviešumalagasumāršaliešu" + + "maorumaķedoniešumalajalumongoļumaratumalajiešumaltiešubirmiešunauruiešuz" + + "iemeļndebelunepāliešundonguholandiešujaunnorvēģunorvēģu bukmolsdienvidnd" + + "ebelunavahučičevaoksitāņuodžibvuoromuorijuosetīnupandžabupālipoļupuštupo" + + "rtugāļukečvuretoromāņurundurumāņukrievukiņaruandasanskritssardīniešusind" + + "huziemeļsāmusangosingāļuslovākuslovēņusamoāņušonusomāļualbāņuserbusvatud" + + "ienvidsotusundaniešuzviedrusvahilitamilutelugutadžikutajutigrinjaturkmēņ" + + "ucvanutongiešuturkucongutatārutaitiešuuiguruukraiņuurduuzbekuvenduvjetna" + + "miešuvolapiksvaloņuvolofukhosujidišsjorubudžuanuķīniešuzuluačinuačoluada" + + "ngmuadiguafrihiliaghemuainuakadiešualeutudienvidaltajiešusenangļuangikaa" + + "ramiešuaraukāņuarapahuaravakuasuastūriešuavadhubeludžubaliešubasubamumug" + + "omalubedžubembubenabafuturietumbeludžubhodžpūrubikolubinukomusiksikubrad" + + "žiešubodonkosiburjatubugubulubilinumedumbukadukarībukajugaatsamusebuāņu" + + "kigačibčudžagatajsčūkumariešučinuku žargonsčoktavučipevaianučirokušejenu" + + "kurdu (Sorani)koptuKrimas tatārukašubudakotudargutaitudelavērusleivudogr" + + "ibudinkuzarmudogrulejassorbudualuvidusholandiešudiola-fonjīdiūludazukjem" + + "buefikuēģiptiešuekadžukuelamiešuvidusangļuevondufangufilipīniešufonuvidu" + + "sfrančusenfrančuziemeļfrīzuaustrumfrīzufriūlugagagauzugajogbajugēzukirib" + + "atiešuvidusaugšvācusenaugšvācugondu valodasgorontalugotugrebosengrieķuŠv" + + "eices vācugusiikučinuhaiduhavajiešuhiligainonuhetuhmonguaugšsorbuhupuiba" + + "nuibibioilokuingušuložbansjgomačamujūdpersiešujūdarābukarakalpakukabiluk" + + "ačinukadžikambukāvikabardiešukaņembukatabumakondekaboverdiešukorukhasuho" + + "taniešukoiračiinīkakokalendžīnukimbundukomiešu-permiešukonkanukosrājiešu" + + "kpellukaračaju un balkārukarēļukuruhušambalubafijuĶelnes vācukumikukuten" + + "ajuladinolangilandulambulezgīnulakotumongulozuziemeļlurulubalulvaluisenu" + + "lunduluolušejuluhjumaduriešumafumagahiešumaithilimakasarumandingumasajum" + + "abumokšumandarumendumeruMaurīcijas kreoluvidusīrumakua-meettomgomikmakum" + + "inangkabavumandžūrumanipūrumohaukumosumundanguvairākas valodaskrīkumiran" + + "diešumarvarumjenuerzjumazanderāņuneapoliešunamalejasvācunevarunjasuniuāņ" + + "ukvasiongjembūnunogajusennorvēģunkoziemeļsotunueruklasiskā nevaruņamvezu" + + "ņankoluņorunzemuvažāžuturku osmaņupangasinanupehlevipampanganupapjament" + + "opalaviešusenpersufeniķiešuponapiešusenprovansiešukičeradžastāņurapanuju" + + "rarotongiešurombočigānuaromūnuruandasandavujakutusamārijas aramiešusambu" + + "rusasakusantalungambejusangusicīliešuskotudienvidkurdusenekusenuselkupuk" + + "oiraboro sennisenīrušilhušanuČadas arābusidamudienvidsāmuLuleo sāmuInari" + + " sāmuskoltsāmusoninkusogdiešusranantogoserērusahosukumususušumerukomoruK" + + "ongo svahiliklasiskā sīriešusīriešutemnutesoterenotetumutigrutivutokelav" + + "iešuklingoņutlinkitutuaregunjasas tongutokpisinstarokocimšiāņutumbukutuv" + + "aliešutasavakutuviešuCentrālmarokas tamazītsudmurtuugaritiešuumbundusakn" + + "evajuvotuvundžoVallisas vācuvalamuvarajuvašovarlpirīkalmikusogujaojapieš" + + "ujanbaņujembukantoniešusapotekublissimbolikazenagustandarta marokāņu ber" + + "beruzunjubez lingvistiska saturazazakimūsdienu standarta arābudienvidaze" + + "rbaidžāņuAustrijas vācuŠveices augšvācuAustrālijas angļuKanādas angļuLie" + + "lbritānijas angļuASV angļuLatīņamerikas spāņuEiropas spāņuMeksikas spāņu" + + "Kanādas frančuŠveices frančulejassakšuflāmuBrazīlijas portugāļuEiropas p" + + "ortugāļumoldāvuserbu-horvātuķīniešu vienkāršotāķīniešu tradicionālā" + +var lvLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0006, 0x000d, 0x0013, 0x001c, 0x0021, 0x0027, 0x0032, + 0x0038, 0x0041, 0x0047, 0x004d, 0x005c, 0x0065, 0x006f, 0x0077, + 0x0080, 0x0087, 0x0090, 0x009a, 0x00a2, 0x00ab, 0x00b5, 0x00bd, + 0x00c5, 0x00d0, 0x00d4, 0x00d9, 0x00e6, 0x00ee, 0x00f7, 0x00fd, + 0x0102, 0x010e, 0x0115, 0x0118, 0x011f, 0x0125, 0x012e, 0x0135, + 0x013c, 0x0141, 0x014a, 0x014e, 0x0152, 0x015c, 0x0161, 0x0168, + 0x0174, 0x0178, 0x017d, 0x0187, 0x018e, 0x0198, 0x01a0, 0x01a5, + 0x01ab, 0x01b0, 0x01b8, 0x01c0, 0x01c9, 0x01d0, 0x01d8, 0x01de, + // Entry 40 - 7F + 0x01e9, 0x01f6, 0x0201, 0x0205, 0x0212, 0x021a, 0x021d, 0x0229, + 0x0230, 0x0237, 0x023f, 0x0247, 0x024f, 0x0254, 0x025a, 0x0262, + 0x0268, 0x0275, 0x027b, 0x0282, 0x028c, 0x0292, 0x029e, 0x02a3, + 0x02ab, 0x02b4, 0x02bc, 0x02c4, 0x02d3, 0x02d8, 0x02e4, 0x02eb, + 0x02f4, 0x02ff, 0x030a, 0x0313, 0x031b, 0x0328, 0x032d, 0x033a, + 0x0342, 0x034a, 0x0350, 0x035a, 0x0363, 0x036c, 0x0376, 0x0384, + 0x038f, 0x0395, 0x03a0, 0x03ad, 0x03be, 0x03cc, 0x03d2, 0x03da, + 0x03e4, 0x03ec, 0x03f1, 0x03f6, 0x03fe, 0x0407, 0x040c, 0x0411, + // Entry 80 - BF + 0x0417, 0x0422, 0x0428, 0x0434, 0x0439, 0x0441, 0x0447, 0x0452, + 0x045b, 0x0467, 0x046d, 0x0479, 0x047e, 0x0487, 0x048f, 0x0498, + 0x04a1, 0x04a6, 0x04ae, 0x04b6, 0x04bb, 0x04c0, 0x04cb, 0x04d6, + 0x04dd, 0x04e4, 0x04ea, 0x04f0, 0x04f8, 0x04fc, 0x0504, 0x050e, + 0x0513, 0x051c, 0x0521, 0x0526, 0x052d, 0x0536, 0x053c, 0x0544, + 0x0548, 0x054e, 0x0553, 0x055f, 0x0567, 0x056e, 0x0574, 0x0579, + 0x0580, 0x0586, 0x058d, 0x0597, 0x059b, 0x05a1, 0x05a7, 0x05ae, + 0x05b3, 0x05b3, 0x05bb, 0x05c1, 0x05c5, 0x05ce, 0x05ce, 0x05d4, + // Entry C0 - FF + 0x05d4, 0x05e5, 0x05ee, 0x05f4, 0x05fd, 0x0607, 0x0607, 0x060e, + 0x060e, 0x0615, 0x0615, 0x0615, 0x0618, 0x0618, 0x0623, 0x0623, + 0x0629, 0x0631, 0x0639, 0x0639, 0x063d, 0x0643, 0x0643, 0x0649, + 0x064f, 0x0654, 0x0654, 0x0658, 0x065e, 0x065e, 0x066c, 0x0677, + 0x067d, 0x0681, 0x0681, 0x0685, 0x068c, 0x068c, 0x068c, 0x0697, + 0x0697, 0x069b, 0x06a0, 0x06a7, 0x06ab, 0x06af, 0x06b5, 0x06bc, + 0x06c0, 0x06c7, 0x06cd, 0x06d3, 0x06dc, 0x06e0, 0x06e7, 0x06f1, + 0x06f7, 0x06ff, 0x070f, 0x0717, 0x0722, 0x0729, 0x0730, 0x073e, + // Entry 100 - 13F + 0x0743, 0x0743, 0x0751, 0x0758, 0x075e, 0x0763, 0x0768, 0x0771, + 0x0777, 0x077e, 0x0783, 0x0788, 0x078d, 0x0797, 0x0797, 0x079c, + 0x07ac, 0x07b8, 0x07be, 0x07c2, 0x07c8, 0x07cd, 0x07cd, 0x07d9, + 0x07e2, 0x07eb, 0x07f6, 0x07f6, 0x07fc, 0x07fc, 0x0801, 0x080e, + 0x080e, 0x0812, 0x0812, 0x081e, 0x0828, 0x0828, 0x0835, 0x0842, + 0x0849, 0x084b, 0x0852, 0x0852, 0x0856, 0x085b, 0x085b, 0x0860, + 0x086c, 0x086c, 0x087b, 0x0888, 0x0888, 0x0895, 0x089e, 0x08a2, + 0x08a7, 0x08b1, 0x08bf, 0x08bf, 0x08bf, 0x08c4, 0x08cb, 0x08d0, + // Entry 140 - 17F + 0x08d0, 0x08da, 0x08da, 0x08e5, 0x08e9, 0x08ef, 0x08f9, 0x08f9, + 0x08fd, 0x0902, 0x0908, 0x090d, 0x0914, 0x0914, 0x0914, 0x091c, + 0x091f, 0x0926, 0x0933, 0x093d, 0x093d, 0x0948, 0x094e, 0x0955, + 0x095b, 0x0960, 0x0965, 0x0970, 0x0978, 0x097e, 0x0985, 0x0992, + 0x0992, 0x0996, 0x0996, 0x099b, 0x09a5, 0x09b1, 0x09b1, 0x09b1, + 0x09b5, 0x09c1, 0x09c9, 0x09db, 0x09e2, 0x09ee, 0x09f4, 0x0a09, + 0x0a09, 0x0a09, 0x0a11, 0x0a17, 0x0a1f, 0x0a25, 0x0a32, 0x0a38, + 0x0a40, 0x0a46, 0x0a4b, 0x0a50, 0x0a55, 0x0a5d, 0x0a5d, 0x0a5d, + // Entry 180 - 1BF + 0x0a5d, 0x0a63, 0x0a63, 0x0a68, 0x0a6c, 0x0a77, 0x0a77, 0x0a80, + 0x0a87, 0x0a8c, 0x0a8f, 0x0a96, 0x0a9b, 0x0a9b, 0x0a9b, 0x0aa5, + 0x0aa9, 0x0ab3, 0x0abb, 0x0ac3, 0x0acb, 0x0ad1, 0x0ad5, 0x0adb, + 0x0ae2, 0x0ae7, 0x0aeb, 0x0afd, 0x0b06, 0x0b12, 0x0b15, 0x0b1c, + 0x0b28, 0x0b32, 0x0b3b, 0x0b42, 0x0b46, 0x0b46, 0x0b4e, 0x0b5f, + 0x0b65, 0x0b70, 0x0b77, 0x0b77, 0x0b7c, 0x0b81, 0x0b8e, 0x0b8e, + 0x0b99, 0x0b9d, 0x0ba7, 0x0bad, 0x0bb2, 0x0bba, 0x0bba, 0x0bc0, + 0x0bca, 0x0bd0, 0x0bdc, 0x0bdc, 0x0bdf, 0x0bea, 0x0bef, 0x0bff, + // Entry 1C0 - 1FF + 0x0c07, 0x0c0f, 0x0c14, 0x0c19, 0x0c22, 0x0c2f, 0x0c3a, 0x0c41, + 0x0c4b, 0x0c55, 0x0c5f, 0x0c5f, 0x0c5f, 0x0c5f, 0x0c67, 0x0c67, + 0x0c72, 0x0c72, 0x0c72, 0x0c7c, 0x0c7c, 0x0c8b, 0x0c90, 0x0c90, + 0x0c9d, 0x0ca5, 0x0cb2, 0x0cb2, 0x0cb2, 0x0cb7, 0x0cbf, 0x0cbf, + 0x0cbf, 0x0cbf, 0x0cc7, 0x0ccd, 0x0cd4, 0x0cda, 0x0cee, 0x0cf5, + 0x0cfb, 0x0d02, 0x0d02, 0x0d0a, 0x0d0f, 0x0d1a, 0x0d1f, 0x0d1f, + 0x0d2b, 0x0d31, 0x0d35, 0x0d35, 0x0d3c, 0x0d4b, 0x0d52, 0x0d52, + 0x0d58, 0x0d5d, 0x0d6a, 0x0d70, 0x0d70, 0x0d70, 0x0d7c, 0x0d87, + // Entry 200 - 23F + 0x0d92, 0x0d9c, 0x0da3, 0x0dac, 0x0db6, 0x0dbd, 0x0dc1, 0x0dc1, + 0x0dc7, 0x0dcb, 0x0dd2, 0x0dd8, 0x0de5, 0x0df8, 0x0e01, 0x0e01, + 0x0e01, 0x0e06, 0x0e0a, 0x0e10, 0x0e16, 0x0e1b, 0x0e1f, 0x0e2b, + 0x0e2b, 0x0e34, 0x0e3c, 0x0e3c, 0x0e43, 0x0e4f, 0x0e58, 0x0e58, + 0x0e5e, 0x0e5e, 0x0e69, 0x0e69, 0x0e70, 0x0e7a, 0x0e82, 0x0e8a, + 0x0ea3, 0x0eaa, 0x0eb5, 0x0ebc, 0x0ec1, 0x0ec5, 0x0ec5, 0x0ec5, + 0x0ec5, 0x0ec5, 0x0ec9, 0x0ec9, 0x0ed0, 0x0ede, 0x0ee4, 0x0eea, + 0x0eef, 0x0ef8, 0x0ef8, 0x0eff, 0x0eff, 0x0f03, 0x0f06, 0x0f0e, + // Entry 240 - 27F + 0x0f16, 0x0f1b, 0x0f1b, 0x0f26, 0x0f2e, 0x0f3b, 0x0f3b, 0x0f41, + 0x0f5d, 0x0f62, 0x0f79, 0x0f7f, 0x0f99, 0x0faf, 0x0fbe, 0x0fd1, + 0x0fe4, 0x0ff3, 0x1009, 0x1013, 0x102a, 0x1039, 0x1049, 0x1049, + 0x1059, 0x1069, 0x1074, 0x107a, 0x1091, 0x10a4, 0x10ac, 0x10ba, + 0x10d3, 0x10ec, +} // Size: 1244 bytes + +var mkLangStr string = "" + // Size: 10127 bytes + "афарскиапхаскиавестанскиафрикансаканскиамхарскиарагонскиарапскиасамскиав" + + "арскиајмарскиазербејџанскибашкирскибелорускибугарскибисламабамбарабенга" + + "лскитибетскибретонскибосанскикаталонскичеченскичаморскикорзиканскикриче" + + "шкицрковнословенскичувашкивелшкиданскигерманскидивехиѕонгкаевегрчкиангл" + + "искиесперантошпанскиестонскибаскискиперсискифулафинскифиџискифарскифран" + + "цускизападнофризискиирскишкотски гелскигалицискигваранскигуџаратиманксх" + + "аусахебрејскихиндихири мотухрватскихаитскиунгарскиерменскихерероинтерли" + + "нгваиндонезискиокциденталигбосичуан јиинупијачкиидоисландскииталијански" + + "инуктитутјапонскијаванскигрузискиконгокикујуквањамаказакстанскикалалису" + + "ткмерскиканнадакорејскиканурикашмирскикурдскикомикорнскикиргистанскилат" + + "инскилуксембуршкигандалимбуршкилингалалаошкилитванскилуба-катангалатвис" + + "кималгашкимаршалскимаорскимакедонскималајаламмонголскимаратималајскимал" + + "тешкибурманскинауруанскисеверен ндебеленепалскиндонгахоландскинорвешки " + + "нинорскнорвешки букмолјужен ндебеленавахоњанџаокситанскиоџибваоромоориј" + + "аосетскипенџапскипалиполскипаштунскипортугалскикечуанскиретороманскирун" + + "дироманскирускируандасанскритсардинскисиндисевернолапонскисангосинхалск" + + "исловачкисловенечкисамоанскишонасомалискиалбанскисрпскисватисесотосундс" + + "кишведскисвахилитамилскителугутаџикистанскитајландскитигрињатуркменскиц" + + "ванатонганскитурскицонгататарскитахитскиујгурскиукраинскиурдуузбекистан" + + "скивендавиетнамскиволапиквалонскиволофскикосајидишјорупскиџуаншкикинеск" + + "изулуачешкиаколиадангмеадигејскитуниски арапскиафрихилиагемскиајнуакадс" + + "киалабамскиалеутскигешки албанскијужноалтајскистароанглискиангикаарамеј" + + "скимапучкиараонаарапахоалжирски арапскиаравачкимарокански арапскиегипет" + + "ски арапскиасуамерикански знаковен јазикастурскикотаваавадибелуџискибал" + + "искибаварскибасабамунскитобагомалабеџабембабетавскибенабафутбадагазапад" + + "ен балочибоџпурибиколскибинибанџарскикомсиксикабишнупријабахтијарскибра" + + "јбрахујскибодоакосебурјатскибугискибулубиленскимедумбакадокарипскикајуг" + + "аацамсебуанскичигачибчачагатајскичучкимарискичинучки жаргончоктавскичип" + + "евјанскичерокискичејенскицентрален курдскикоптскикапизнонкримскотурскик" + + "ашупскидакотадаргватаитаделаверслејвидогрипскидинказармадогридолнолужич" + + "кидусунскидуаласреднохоландскијола-фоњиџуладазагаембуефикемилијанскиста" + + "роегипетскиекаџукеламскисредноанглискицентралнојупичкиевондоекстремадур" + + "скифангфилипинскитурнедаленски финскифонкаџунски францускисреднофранцус" + + "кистарофранцускифранкопровансалскисевернофризискиисточнофризискифурланс" + + "кигагагаускигангајогбајазороастриски даригизгилбертанскигиланскисредног" + + "орногерманскистарогорногерманскигоански конканигондигоронталоготскигреб" + + "остарогрчкишвајцарски германскигвахирофарефарегусигвичинскихајдахакахав" + + "ајскифиџиски хиндихилигајнонскихетитскихмонггорнолужичкисјангхупаибаниб" + + "ибиоилоканскиингушкиижорскијамајски креолскиложбаннгомбамачамееврејскоп" + + "ерсискиеврејскоарапскијитскикаракалпачкикабилскикачинскикаџекамбакавика" + + "бардинскиканембутјапмакондекабувердианукењангкорокаинганшкикасихотански" + + "којра чииниковарскизазакикакокаленџинкимбундукоми-пермјачкиконканикозре" + + "јскикпелекарачаевско-балкарскикриокинарајскикарелскикурухшамбалабафијак" + + "олоњскикумичкикутенајскиладинолангиландаламбалезгинскилингва франка нов" + + "алигурскиливонскилакотскиломбардскимонголозисевернолурискилатгалскилуба" + + "-лулуалујсењскилундалуомизолујакнижевен кинескиласкимадурскимафамагахима" + + "итилимакасарскимандингомасајскимабамокшанскимандарскимендемеруморисјенс" + + "редноирскимакува-митометамикмакминангкабауманџурскиманипуримохавскимоси" + + "западномарискимундангповеќе јазицикрикмирандскимарваримјенеерзјанскимаз" + + "ендеранскијужноминскинеаполскинамадолногерманскиневарскинијасниуејскиао" + + "квазионгиембунногајскистаронордискиновијалнкосеверен сотонуеркласичен н" + + "еварскињамвезињанколењоронзимаосашкиотомански турскипангасинанскисредно" + + "персискипампангапапијаментопалауанскипикардскипенсилваниски германскиме" + + "нонитски долногерманскистароперсискифалечкогерманскифеникискипиемонтски" + + "понтскипонпејскипрускистаропровансалскикичекичванскираџастанскирапанујс" + + "кираротонганскиромањолскирифскиромборомскиротуманскирусинскировијанскив" + + "лашкируасандавејакутскисамарјански арамејскисамбурусасачкисанталисаураш" + + "трангембејсангусицилијанскишкотски германскисасарски сардинскијужнокурд" + + "скисенекасенасериселкупскикојраборо сенистароирскисамогитскитачелхитшан" + + "чадски арапскисидамодолношлезискиселајарскијужнолапонскилулски лапонски" + + "инарски лапонскисколтски лапонскисонинкезогдијанскисрански тонгосерерса" + + "хозатерландски фризискисукумасусусумерскикоморијанскиконгоански свахили" + + "класичен сирискисирискишлезискитулутимнетесотеренотетумтигретивтокелауа" + + "нскицахурскиклингонскитлингитталишкитамашекњаса тонгаток писинтуројотар" + + "окоцаконскицимшијанскитатскитумбукатувалуанскитазавактуванскицентрално " + + "марокански тамазитскиудмуртскиугаритскиумбундукоренвајвенетскивепшкизап" + + "аднофламанскимајнскофранконскивотскивирувунџовалсерволамоварајскивашову" + + "калмичкимегрелскисогајаојапскијенгбенјембањенгатукантонскизапотечкиблис" + + "симболизеландскизенагастандарден марокански тамазигтскизунибез лингвист" + + "ичка содржиназазалитературен арапскибритански англискиамерикански англи" + + "скишпански (во Европа)француски (во Канада)португалски (во Европа)молда" + + "вскисрпскохрватскипоедноставен кинескитрадиционален кинески" + +var mkLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000e, 0x001c, 0x0030, 0x0040, 0x004e, 0x005e, 0x0070, + 0x007e, 0x008c, 0x009a, 0x00aa, 0x00c4, 0x00d6, 0x00e8, 0x00f8, + 0x0106, 0x0114, 0x0126, 0x0136, 0x0148, 0x0158, 0x016c, 0x017c, + 0x018c, 0x01a2, 0x01a8, 0x01b2, 0x01d2, 0x01e0, 0x01ec, 0x01f8, + 0x020a, 0x0216, 0x0222, 0x0228, 0x0232, 0x0242, 0x0254, 0x0262, + 0x0272, 0x0282, 0x0292, 0x029a, 0x02a6, 0x02b4, 0x02c0, 0x02d2, + 0x02f0, 0x02fa, 0x0315, 0x0327, 0x0339, 0x0349, 0x0353, 0x035d, + 0x036f, 0x0379, 0x038a, 0x039a, 0x03a8, 0x03b8, 0x03c8, 0x03d4, + // Entry 40 - 7F + 0x03ea, 0x0400, 0x0414, 0x041c, 0x042d, 0x0441, 0x0447, 0x0459, + 0x046f, 0x0481, 0x0491, 0x04a1, 0x04b1, 0x04bb, 0x04c7, 0x04d5, + 0x04ed, 0x04ff, 0x050d, 0x051b, 0x052b, 0x0537, 0x0549, 0x0557, + 0x055f, 0x056d, 0x0585, 0x0595, 0x05ad, 0x05b7, 0x05c9, 0x05d7, + 0x05e3, 0x05f5, 0x060c, 0x061c, 0x062c, 0x063e, 0x064c, 0x0660, + 0x0672, 0x0684, 0x0690, 0x06a0, 0x06b0, 0x06c2, 0x06d6, 0x06f3, + 0x0703, 0x070f, 0x0721, 0x0740, 0x075d, 0x0776, 0x0782, 0x078c, + 0x07a0, 0x07ac, 0x07b6, 0x07c0, 0x07ce, 0x07e0, 0x07e8, 0x07f4, + // Entry 80 - BF + 0x0806, 0x081c, 0x082e, 0x0846, 0x0850, 0x0860, 0x086a, 0x0876, + 0x0886, 0x0898, 0x08a2, 0x08c0, 0x08ca, 0x08dc, 0x08ec, 0x0900, + 0x0912, 0x091a, 0x092c, 0x093c, 0x0948, 0x0952, 0x095e, 0x096c, + 0x097a, 0x0988, 0x0998, 0x09a4, 0x09be, 0x09d2, 0x09e0, 0x09f4, + 0x09fe, 0x0a10, 0x0a1c, 0x0a26, 0x0a36, 0x0a46, 0x0a56, 0x0a68, + 0x0a70, 0x0a8a, 0x0a94, 0x0aa8, 0x0ab6, 0x0ac6, 0x0ad6, 0x0ade, + 0x0ae8, 0x0af8, 0x0b06, 0x0b14, 0x0b1c, 0x0b28, 0x0b32, 0x0b40, + 0x0b52, 0x0b6f, 0x0b7f, 0x0b8d, 0x0b95, 0x0ba3, 0x0bb5, 0x0bc5, + // Entry C0 - FF + 0x0be0, 0x0bfa, 0x0c14, 0x0c20, 0x0c32, 0x0c40, 0x0c4c, 0x0c5a, + 0x0c79, 0x0c89, 0x0cac, 0x0ccd, 0x0cd3, 0x0d05, 0x0d15, 0x0d21, + 0x0d2b, 0x0d3d, 0x0d4b, 0x0d5b, 0x0d63, 0x0d73, 0x0d7b, 0x0d87, + 0x0d8f, 0x0d99, 0x0da9, 0x0db1, 0x0dbb, 0x0dc7, 0x0de2, 0x0df0, + 0x0e00, 0x0e08, 0x0e1a, 0x0e20, 0x0e2e, 0x0e42, 0x0e58, 0x0e60, + 0x0e72, 0x0e7a, 0x0e84, 0x0e96, 0x0ea4, 0x0eac, 0x0ebc, 0x0eca, + 0x0ed2, 0x0ee2, 0x0eee, 0x0ef6, 0x0f08, 0x0f10, 0x0f1a, 0x0f2e, + 0x0f38, 0x0f46, 0x0f61, 0x0f73, 0x0f89, 0x0f9b, 0x0fab, 0x0fcc, + // Entry 100 - 13F + 0x0fda, 0x0fea, 0x1004, 0x1014, 0x1020, 0x102c, 0x1036, 0x1044, + 0x1050, 0x1062, 0x106c, 0x1076, 0x1080, 0x1098, 0x10a8, 0x10b2, + 0x10d0, 0x10e1, 0x10e9, 0x10f5, 0x10fd, 0x1105, 0x111b, 0x1137, + 0x1143, 0x1151, 0x116d, 0x118d, 0x1199, 0x11b5, 0x11bd, 0x11d1, + 0x11f8, 0x11fe, 0x1221, 0x123f, 0x125b, 0x127f, 0x129d, 0x12bb, + 0x12cd, 0x12d1, 0x12e1, 0x12e7, 0x12ef, 0x12f9, 0x131a, 0x1320, + 0x1338, 0x1348, 0x1370, 0x1396, 0x13b3, 0x13bd, 0x13cf, 0x13db, + 0x13e5, 0x13f9, 0x1420, 0x142e, 0x143e, 0x1446, 0x1458, 0x1462, + // Entry 140 - 17F + 0x146a, 0x147a, 0x1493, 0x14ad, 0x14bd, 0x14c7, 0x14df, 0x14e9, + 0x14f1, 0x14f9, 0x1505, 0x1517, 0x1525, 0x1533, 0x1554, 0x1560, + 0x156c, 0x1578, 0x1598, 0x15b6, 0x15c2, 0x15da, 0x15ea, 0x15fa, + 0x1602, 0x160c, 0x1614, 0x162a, 0x1638, 0x1640, 0x164e, 0x1666, + 0x1672, 0x167a, 0x168e, 0x1696, 0x16a6, 0x16bb, 0x16cb, 0x16d7, + 0x16df, 0x16ef, 0x16ff, 0x171a, 0x1728, 0x173a, 0x1744, 0x176d, + 0x1775, 0x1789, 0x1799, 0x17a3, 0x17b1, 0x17bd, 0x17cd, 0x17db, + 0x17ef, 0x17fb, 0x1805, 0x180f, 0x1819, 0x182b, 0x184d, 0x185d, + // Entry 180 - 1BF + 0x186d, 0x187d, 0x1891, 0x189b, 0x18a3, 0x18bf, 0x18d1, 0x18e4, + 0x18f6, 0x1900, 0x1906, 0x190e, 0x1916, 0x1935, 0x193f, 0x194f, + 0x1957, 0x1963, 0x1971, 0x1985, 0x1995, 0x19a5, 0x19ad, 0x19bf, + 0x19d1, 0x19db, 0x19e3, 0x19f3, 0x1a09, 0x1a1e, 0x1a26, 0x1a32, + 0x1a48, 0x1a5a, 0x1a6a, 0x1a7a, 0x1a82, 0x1a9e, 0x1aac, 0x1ac5, + 0x1acd, 0x1adf, 0x1aed, 0x1aed, 0x1af7, 0x1b09, 0x1b23, 0x1b39, + 0x1b4b, 0x1b53, 0x1b6f, 0x1b7f, 0x1b89, 0x1b99, 0x1b9d, 0x1ba9, + 0x1bb9, 0x1bc9, 0x1be3, 0x1bf1, 0x1bf7, 0x1c0e, 0x1c16, 0x1c37, + // Entry 1C0 - 1FF + 0x1c45, 0x1c53, 0x1c5b, 0x1c65, 0x1c71, 0x1c90, 0x1caa, 0x1cc6, + 0x1cd6, 0x1cec, 0x1d00, 0x1d12, 0x1d3f, 0x1d70, 0x1d8a, 0x1daa, + 0x1dbc, 0x1dd0, 0x1dde, 0x1df0, 0x1dfc, 0x1e1e, 0x1e26, 0x1e38, + 0x1e4e, 0x1e62, 0x1e7c, 0x1e90, 0x1e9c, 0x1ea6, 0x1eb2, 0x1ec6, + 0x1ed6, 0x1eea, 0x1ef6, 0x1efc, 0x1f0a, 0x1f1a, 0x1f43, 0x1f51, + 0x1f5f, 0x1f6d, 0x1f7f, 0x1f8d, 0x1f97, 0x1faf, 0x1fd0, 0x1ff3, + 0x200b, 0x2017, 0x201f, 0x2027, 0x2039, 0x2054, 0x2068, 0x207c, + 0x208c, 0x2092, 0x20ad, 0x20b9, 0x20d3, 0x20e7, 0x2101, 0x211e, + // Entry 200 - 23F + 0x213d, 0x215e, 0x216c, 0x2182, 0x219b, 0x21a5, 0x21ad, 0x21d6, + 0x21e2, 0x21ea, 0x21fa, 0x2212, 0x2235, 0x2254, 0x2262, 0x2272, + 0x227a, 0x2284, 0x228c, 0x2298, 0x22a2, 0x22ac, 0x22b2, 0x22ca, + 0x22da, 0x22ee, 0x22fc, 0x230a, 0x2318, 0x232b, 0x233c, 0x2348, + 0x2354, 0x2364, 0x237a, 0x2386, 0x2394, 0x23aa, 0x23b8, 0x23c8, + 0x2404, 0x2416, 0x2428, 0x2436, 0x2440, 0x2446, 0x2456, 0x2462, + 0x2482, 0x24a4, 0x24b0, 0x24b8, 0x24c2, 0x24ce, 0x24da, 0x24ea, + 0x24f2, 0x24f2, 0x24f6, 0x2506, 0x2518, 0x2520, 0x2526, 0x2532, + // Entry 240 - 27F + 0x2540, 0x254a, 0x2558, 0x256a, 0x257c, 0x2592, 0x25a4, 0x25b0, + 0x25f0, 0x25f8, 0x2628, 0x2630, 0x2655, 0x2655, 0x2655, 0x2655, + 0x2655, 0x2655, 0x2678, 0x269f, 0x269f, 0x26c1, 0x26c1, 0x26c1, + 0x26e7, 0x26e7, 0x26e7, 0x26e7, 0x26e7, 0x2711, 0x2723, 0x273f, + 0x2766, 0x278f, +} // Size: 1244 bytes + +var mlLangStr string = "" + // Size: 11903 bytes + "അഫാർഅബ്\u200cഖാസിയൻഅവസ്റ്റാൻആഫ്രിക്കാൻസ്അകാൻ\u200cഅംഹാരിക്അരഗോണീസ്അറബിക്" + + "ആസ്സാമീസ്അവാരിക്അയ്മാറഅസർബൈജാനിബഷ്ഖിർബെലാറുഷ്യൻബൾഗേറിയൻബിസ്\u200cലാമബം" + + "ബാറബംഗാളിടിബറ്റൻബ്രെട്ടൺബോസ്നിയൻകറ്റാലാൻചെചൻകമോറോകോർസിക്കൻക്രീചെക്ക്ചർ" + + "ച്ച് സ്ലാവിക്ചുവാഷ്വെൽഷ്ഡാനിഷ്ജർമ്മൻദിവെഹിസോങ്കഇവ്ഗ്രീക്ക്ഇംഗ്ലീഷ്എസ്" + + "\u200cപരാന്റോസ്\u200cപാനിഷ്എസ്റ്റോണിയൻബാസ്\u200cക്പേർഷ്യൻഫുലഫിന്നിഷ്ഫിജി" + + "യൻഫാറോസ്ഫ്രഞ്ച്പശ്ചിമ ഫ്രിഷിയൻഐറിഷ്സ്കോട്ടിഷ് ഗൈലിക്ഗലീഷ്യൻഗ്വരനീഗുജറാ" + + "ത്തിമാൻസ്ഹൗസഹീബ്രുഹിന്ദിഹിരി മോതുക്രൊയേഷ്യൻഹെയ്\u200cതിയൻഹംഗേറിയൻഅർമേന" + + "ിയൻഹെരേരൊഇന്റർലിൻ\u200cഗ്വാഇൻഡോനേഷ്യൻഇന്റർലിംഗ്വഇഗ്ബോഷുവാൻയിഇനുപിയാക്ഇ" + + "ഡോഐസ്\u200cലാൻഡിക്ഇറ്റാലിയൻഇനുക്റ്റിറ്റട്ട്ജാപ്പനീസ്ജാവാനീസ്ജോർജിയൻകോം" + + "ഗോകികൂയുക്വാന്യമകസാഖ്കലാല്ലിസട്ട്ഖമെർകന്നഡകൊറിയൻകനൂറികാശ്\u200cമീരികുർ" + + "ദ്ദിഷ്കോമികോർണിഷ്കിർഗിസ്ലാറ്റിൻലക്\u200cസംബർഗിഷ്ഗാണ്ടലിംബർഗിഷ്ലിംഗാലലാ" + + "വോലിത്വാനിയൻലുബ-കറ്റംഗലാറ്റ്വിയൻമലഗാസിമാർഷല്ലീസ്മവോറിമാസിഡോണിയൻമലയാളംമ" + + "ംഗോളിയൻമറാത്തിമലെയ്മാൾട്ടീസ്ബർമീസ്നൗറുനോർത്ത് ഡെബിൾനേപ്പാളിഡോങ്കഡച്ച്ന" + + "ോർവീജിയൻ നൈനോർക്\u200cസ്നോർവീജിയൻ ബുക്\u200cമൽദക്ഷിണ നെഡിബിൾനവാഹൊന്യൻജ" + + "ഓക്\u200cസിറ്റൻഓജിബ്വാഒറോമോഒഡിയഒസ്സെറ്റിക്പഞ്ചാബിപാലിപോളിഷ്പഷ്തുപോർച്ച" + + "ുഗീസ്ക്വെച്ചുവറൊമാഞ്ച്റുണ്ടിറൊമാനിയൻറഷ്യൻകിന്യാർവാണ്ടസംസ്\u200cകൃതംസർഡ" + + "ിനിയാൻസിന്ധിവടക്കൻ സമിസാംഗോസിംഹളസ്ലോവാക്സ്ലോവേനിയൻസമോവൻഷോണസോമാലിഅൽബേനി" + + "യൻസെർബിയൻസ്വാറ്റിതെക്കൻ സോതോസുണ്ടാനീസ്സ്വീഡിഷ്സ്വാഹിലിതമിഴ്തെലുങ്ക്താജ" + + "ിക്തായ്ടൈഗ്രിന്യതുർക്\u200cമെൻത്സ്വാനടോംഗൻടർക്കിഷ്ത്സോംഗടാട്ടർതാഹിതിയൻ" + + "ഉയ്ഘുർഉക്രേനിയൻഉറുദുഉസ്\u200cബെക്ക്വെന്ദവിയറ്റ്നാമീസ്വോളാപുക്വല്ലൂൺവൊള" + + "ോഫ്ഖോസയിദ്ദിഷ്യൊറൂബാസ്വാംഗ്ചൈനീസ്സുലുഅചിനീസ്അകോലിഅഡാങ്ഗമിഅഡൈഗേആഫ്രിഹില" + + "ിആഘേംഅയിനുഅക്കാഡിയൻഅലൈട്ട്തെക്കൻ അൾത്തായിപഴയ ഇംഗ്ലീഷ്ആൻഗികഅരമായഭാഷമാപു" + + "ചിഅരപാഹോഅറാവക്ആസുഓസ്\u200cട്രിയൻഅവധിബലൂചിബാലിനീസ്ബസബാമുൻഘോമാലബേജബേംബബെ" + + "നാബാഫട്ട്പശ്ചിമ ബലൂചിഭോജ്\u200cപൂരിബികോൽബിനികോംസിക്സികബ്രജ്ബോഡോഅക്കൂസ്" + + "ബുറിയത്ത്ബുഗിനീസ്ബുളുബ്ലിൻമെഡുംബകാഡോകാരിബ്കയൂഗഅറ്റ്സാംസെബുവാനോചിഗചിബ്ച" + + "ചഗതൈചൂകീസ്മാരിചിനൂഗ്-ജാർഗൺചോക്റ്റാവ്ചിപേവ്യൻഷെരോക്കിചിയേന്നേസൊറാനി കുർ" + + "ദിഷ്കോപ്റ്റിക്ക്രിമിയൻ ടർക്കിഷ്കാഷുബിയാൻഡകോട്ടഡർഗ്വാതൈതദലവാരെസ്ലേവ്ഡോഗ" + + "്രിബ്ദിൻകസാർമ്മഡോഗ്രിലോവർ സോർബിയൻദ്വാലമദ്ധ്യ ഡച്ച്യോല-ഫോന്യിദ്വൈലഡാസാഗ" + + "എംബുഎഫിക്പ്രാചീന ഈജിപ്ഷ്യൻഎകാജുക്എലാമൈറ്റ്മദ്ധ്യ ഇംഗ്ലീഷ്എവോൻഡോഫങ്ഫിലി" + + "പ്പിനോഫോൻമദ്ധ്യ ഫ്രഞ്ച്പഴയ ഫ്രഞ്ച്നോർത്തേൻ ഫ്രിഷ്യൻഈസ്റ്റേൺ ഫ്രിഷ്യൻഫ്" + + "രിയുലിയാൻഗാഗാഗൂസ്ഗയൊഗബ്യഗീസ്ഗിൽബർസേമദ്ധ്യ ഉച്ച ജർമൻപ്രാചീന ഉച്ച ജർമൻഗോ" + + "ണ്ഡിഗൊറോൻറാലോഗോഥിക്ക്ഗ്രബൊപുരാതന യവന ഭാഷസ്വിസ് ജർമ്മൻഗുസീഗ്വിച്ച് ഇൻഹൈ" + + "ഡഹവായിയൻഹിലിഗയ്നോൺഹിറ്റൈറ്റേമോങ്അപ്പർ സോർബിയൻഹൂപഇബാൻഇബീബിയോഇലോകോഇംഗ്വി" + + "ഷ്ലോജ്ബാൻഗോമ്പമചേംജൂഡിയോ-പേർഷ്യൻജൂഡിയോ-അറബിക്കര-കാൽപ്പക്കബൈൽകാചിൻജ്ജുക" + + "ംബകാവികബർഡിയാൻകനെംബുട്യാപ്മക്കോണ്ടെകബുവെർദിയാനുകോറോഘാസിഘോറ്റാനേസേകൊയ്റ" + + " ചീനികക്കോകലെഞ്ഞിൻക്ലിംഗൻകോമി-പെർമ്യാക്ക്കൊങ്കണികൊസറേയൻകപെല്ലേകരചൈ-ബാൽകർ" + + "കരീലിയൻകുരുഖ്ഷംഭാളഭാഫിയകൊളോഞ്ഞിയൻകുമൈക്കുതേനൈലാഡിനോലാംഗിലഹ്\u200cൻഡലംബ" + + "ലഹ്ഗിയാൻലഗോത്തമോങ്കോലൊസിവടക്കൻ ലൂറിലൂബ-ലുലുവലൂയിസെനോലുൻഡലുവോമിസോലുയിയമ" + + "ദുരേസേമാഫമഗാഹിമൈഥിലിമകാസർമണ്ഡിൻഗോമസായ്മാബമോക്ഷമണ്ഡാർമെൻഡെമേരുമൊറിസിൻമദ" + + "്ധ്യ ഐറിഷ്മാഖുവാ-മീത്തോമേത്താമിക്മാക്മിനാങ്കബൗമൻചുമണിപ്പൂരിമോഹാക്മൊസ്സ" + + "ിമുന്ദാംഗ്പലഭാഷകൾക്രീക്ക്മിരാൻറസേമർവാരിമയീൻഏഴ്സ്യമസന്ററാനിനെപ്പോളിറ്റാ" + + "ൻനാമലോ ജർമൻനേവാരിനിയാസ്ന്യുവാൻക്വാസിയോഗീംബൂൺനോഗൈപഴയ പേർഷ്യൻഇൻകോനോർത്തേ" + + "ൻ സോതോനുവേർക്ലാസിക്കൽ നേവാരിന്യാംവേസിന്യാൻകോൾന്യോറോസിമഒസേജ്ഓട്ടോമൻ തുർ" + + "ക്കിഷ്പങ്കാസിനൻപാഹ്ലവിപാംപൻഗപാപിയാമെൻറൊപലാവുൻപ്രാചീന പേർഷ്യൻഫീനിഷ്യൻപൊ" + + "ൻപിയൻപ്രൊവൻഷ്ൽക്വിച്ചെരാജസ്ഥാനിരാപനൂയിരാരോടോങ്കൻറോംബോറോമനിആരോമാനിയൻറുവ" + + "ാസാൻഡവേസാഖസമരിയാക്കാരുടെ അരമായസംബുരുസസാക്സന്താലിഗംബായ്സംഗുസിസിലിയൻസ്കോ" + + "ട്സ്തെക്കൻ കുർദ്ദിഷ്സെനേകസേനസെൽകപ്കൊയ്റാബൊറോ സെന്നിപ്രാചീന ഐറിഷ്താച്ചല" + + "ിറ്റ്ഷാൻചാഡ് അറബിസിഡാമോതെക്കൻ സാമിലൂലീ സമിഇനാരി സാമിസ്കോൾട്ട് സമിസോണിൻ" + + "കെസോജിഡിയൻശ്രാനൻ ഡോങ്കോസെറർസാഹോസുകുമസുസുസുമേരിയൻകൊമോറിയൻകോംഗോ സ്വാഹിലി" + + "പുരാതന സുറിയാനിഭാഷസുറിയാനിടിംനേടെസോടെറേനോടെറ്റുംടൈഗ്രിടിവ്ടൊക്കേലൗക്ലി" + + "ംഗോൺലിംഗ്വിറ്റ്ടമഷേക്ന്യാസാ ഡോങ്കടോക് പിസിൻതരോക്കോസിംഷ്യൻടുംബുകതുവാലുട" + + "സവാക്ക്തുവിനിയൻമധ്യ അറ്റ്\u200cലസ് ടമാസൈറ്റ്ഉഡ്മുർട്ട്ഉഗറിട്ടിക്ഉംബുന്" + + "ദുമൂലഭാഷവൈവോട്ടിക്വുഞ്ജോവാൾസർവലമൊവാരേയ്വാഷൊവാൾപ്പിരികൽമൈക്സോഗോയാവോയെപ്" + + "പീസ്യാംഗ്ബെൻയംബകാന്റണീസ്സാപ്പോടെക്ബ്ലിസ്സിംബൽസ്സെനഗമൊറോക്കൻ സാധാരണ താമ" + + "സൈറ്റ്സുനിഭാഷാപരമായ ഉള്ളടക്കമൊന്നുമില്ലസാസാആധുനിക സ്റ്റാൻഡേർഡ് അറബിക്ഓ" + + "സ്\u200cട്രിയൻ ജർമൻസ്വിസ് ഹൈ ജർമൻഓസ്\u200cട്രേലിയൻ ഇംഗ്ലീഷ്കനേഡിയൻ ഇംഗ" + + "്ലീഷ്ബ്രിട്ടീഷ് ഇംഗ്ലീഷ്അമേരിക്കൻ ഇംഗ്ലീഷ്ലാറ്റിൻ അമേരിക്കൻ സ്\u200cപാ" + + "നിഷ്യൂറോപ്യൻ സ്\u200cപാനിഷ്മെക്സിക്കൻ സ്പാനിഷ്കനേഡിയൻ ഫ്രഞ്ച്സ്വിസ് ഫ്" + + "രഞ്ച്ലോ സാക്സൺഫ്ലമിഷ്ബ്രസീലിയൻ പോർച്ചുഗീസ്യൂറോപ്യൻ പോർച്ചുഗീസ്മോൾഡാവിയ" + + "ൻസെർബോ-ക്രൊയേഷ്യൻ" + +var mlLangIdx = []uint16{ // 608 elements + // Entry 0 - 3F + 0x0000, 0x000c, 0x002a, 0x0045, 0x0069, 0x0078, 0x0090, 0x00a8, + 0x00ba, 0x00d5, 0x00ea, 0x00fc, 0x0117, 0x0129, 0x0147, 0x015f, + 0x0177, 0x0186, 0x0198, 0x01ad, 0x01c5, 0x01dd, 0x01f5, 0x0201, + 0x0210, 0x022b, 0x0237, 0x0249, 0x0274, 0x0286, 0x0295, 0x02a7, + 0x02b9, 0x02cb, 0x02da, 0x02e3, 0x02fb, 0x0313, 0x0334, 0x034f, + 0x0370, 0x0385, 0x039a, 0x03a3, 0x03bb, 0x03cd, 0x03df, 0x03f4, + 0x041f, 0x042e, 0x045f, 0x0474, 0x0486, 0x04a1, 0x04b0, 0x04b9, + 0x04cb, 0x04dd, 0x04f6, 0x0514, 0x052f, 0x0547, 0x055f, 0x0571, + // Entry 40 - 7F + 0x0598, 0x05b6, 0x05d7, 0x05e6, 0x05fb, 0x0616, 0x061f, 0x0640, + 0x065b, 0x068b, 0x06a6, 0x06be, 0x06d3, 0x06e2, 0x06f4, 0x070c, + 0x071b, 0x073f, 0x074b, 0x075a, 0x076c, 0x077b, 0x0796, 0x07b1, + 0x07bd, 0x07d2, 0x07e7, 0x07fc, 0x0820, 0x082f, 0x084a, 0x085c, + 0x0868, 0x0886, 0x08a2, 0x08c0, 0x08d2, 0x08f0, 0x08ff, 0x091d, + 0x092f, 0x0947, 0x095c, 0x096b, 0x0986, 0x0998, 0x09a4, 0x09c9, + 0x09e1, 0x09f0, 0x09ff, 0x0a39, 0x0a6a, 0x0a92, 0x0aa1, 0x0ab0, + 0x0ace, 0x0ae3, 0x0af2, 0x0afe, 0x0b1f, 0x0b34, 0x0b40, 0x0b52, + // Entry 80 - BF + 0x0b61, 0x0b82, 0x0b9d, 0x0bb5, 0x0bc7, 0x0bdf, 0x0bee, 0x0c12, + 0x0c2d, 0x0c48, 0x0c5a, 0x0c76, 0x0c85, 0x0c94, 0x0cac, 0x0cca, + 0x0cd9, 0x0ce2, 0x0cf4, 0x0d0c, 0x0d21, 0x0d39, 0x0d58, 0x0d76, + 0x0d8e, 0x0da6, 0x0db5, 0x0dcd, 0x0ddf, 0x0deb, 0x0e06, 0x0e21, + 0x0e36, 0x0e45, 0x0e5d, 0x0e6f, 0x0e81, 0x0e99, 0x0eab, 0x0ec6, + 0x0ed5, 0x0ef3, 0x0f02, 0x0f29, 0x0f41, 0x0f53, 0x0f65, 0x0f6e, + 0x0f86, 0x0f98, 0x0fad, 0x0fbf, 0x0fcb, 0x0fe0, 0x0fef, 0x1007, + 0x1016, 0x1016, 0x1031, 0x103d, 0x104c, 0x1067, 0x1067, 0x107c, + // Entry C0 - FF + 0x107c, 0x10a7, 0x10c9, 0x10d8, 0x10f0, 0x1102, 0x1102, 0x1114, + 0x1114, 0x1126, 0x1126, 0x1126, 0x112f, 0x112f, 0x114d, 0x114d, + 0x1159, 0x1168, 0x1180, 0x1180, 0x1186, 0x1195, 0x1195, 0x11a4, + 0x11ad, 0x11b9, 0x11b9, 0x11c5, 0x11da, 0x11da, 0x11fc, 0x1217, + 0x1226, 0x1232, 0x1232, 0x123b, 0x1250, 0x1250, 0x1250, 0x125f, + 0x125f, 0x126b, 0x1280, 0x129b, 0x12b3, 0x12bf, 0x12ce, 0x12e0, + 0x12ec, 0x12fe, 0x130a, 0x1322, 0x133a, 0x1343, 0x1352, 0x135e, + 0x1370, 0x137c, 0x139e, 0x13bc, 0x13d4, 0x13ec, 0x1404, 0x142c, + // Entry 100 - 13F + 0x144a, 0x144a, 0x147b, 0x1496, 0x14a8, 0x14ba, 0x14c3, 0x14d5, + 0x14e7, 0x14ff, 0x150b, 0x151d, 0x152f, 0x1551, 0x1551, 0x1560, + 0x1582, 0x159e, 0x15ad, 0x15bc, 0x15c8, 0x15d7, 0x15d7, 0x1608, + 0x161d, 0x1638, 0x1663, 0x1663, 0x1675, 0x1675, 0x167e, 0x169c, + 0x169c, 0x16a5, 0x16a5, 0x16cd, 0x16ec, 0x16ec, 0x171d, 0x174e, + 0x176f, 0x1775, 0x1787, 0x1787, 0x1790, 0x179c, 0x179c, 0x17a8, + 0x17bd, 0x17bd, 0x17e9, 0x1818, 0x1818, 0x182a, 0x1845, 0x185d, + 0x186c, 0x1892, 0x18b7, 0x18b7, 0x18b7, 0x18c3, 0x18e2, 0x18eb, + // Entry 140 - 17F + 0x18eb, 0x1900, 0x1900, 0x191e, 0x193c, 0x1948, 0x196d, 0x196d, + 0x1976, 0x1982, 0x1997, 0x19a6, 0x19be, 0x19be, 0x19be, 0x19d3, + 0x19e2, 0x19ee, 0x1a16, 0x1a3b, 0x1a3b, 0x1a5a, 0x1a66, 0x1a75, + 0x1a81, 0x1a8a, 0x1a96, 0x1aae, 0x1ac0, 0x1ad2, 0x1aed, 0x1b11, + 0x1b11, 0x1b1d, 0x1b1d, 0x1b29, 0x1b47, 0x1b63, 0x1b63, 0x1b63, + 0x1b72, 0x1b8a, 0x1b9f, 0x1bcd, 0x1be2, 0x1bf7, 0x1c0c, 0x1c28, + 0x1c28, 0x1c28, 0x1c3d, 0x1c4f, 0x1c5e, 0x1c6d, 0x1c8b, 0x1c9d, + 0x1caf, 0x1cc1, 0x1cd0, 0x1ce2, 0x1ceb, 0x1d03, 0x1d03, 0x1d03, + // Entry 180 - 1BF + 0x1d03, 0x1d15, 0x1d15, 0x1d27, 0x1d33, 0x1d52, 0x1d52, 0x1d6b, + 0x1d83, 0x1d8f, 0x1d9b, 0x1da7, 0x1db6, 0x1db6, 0x1db6, 0x1dcb, + 0x1dd4, 0x1de3, 0x1df5, 0x1e04, 0x1e1c, 0x1e2b, 0x1e34, 0x1e43, + 0x1e55, 0x1e64, 0x1e70, 0x1e85, 0x1ea7, 0x1ecc, 0x1ede, 0x1ef6, + 0x1f11, 0x1f1d, 0x1f38, 0x1f4a, 0x1f5c, 0x1f5c, 0x1f77, 0x1f8c, + 0x1fa4, 0x1fbc, 0x1fce, 0x1fce, 0x1fda, 0x1fec, 0x2007, 0x2007, + 0x202e, 0x2037, 0x204a, 0x205c, 0x206e, 0x2083, 0x2083, 0x209b, + 0x20ad, 0x20b9, 0x20d8, 0x20d8, 0x20e4, 0x2109, 0x2118, 0x2149, + // Entry 1C0 - 1FF + 0x2164, 0x217c, 0x218e, 0x2197, 0x21a6, 0x21d7, 0x21f2, 0x2207, + 0x2219, 0x223a, 0x224c, 0x224c, 0x224c, 0x224c, 0x2277, 0x2277, + 0x228f, 0x228f, 0x228f, 0x22a4, 0x22a4, 0x22bf, 0x22d7, 0x22d7, + 0x22f2, 0x2307, 0x2325, 0x2325, 0x2325, 0x2334, 0x2343, 0x2343, + 0x2343, 0x2343, 0x235e, 0x236a, 0x237c, 0x2385, 0x23bf, 0x23d1, + 0x23e0, 0x23f5, 0x23f5, 0x2407, 0x2413, 0x242b, 0x2443, 0x2443, + 0x2471, 0x2480, 0x2489, 0x2489, 0x249b, 0x24cc, 0x24f1, 0x24f1, + 0x2512, 0x251b, 0x2534, 0x2546, 0x2546, 0x2546, 0x2565, 0x257b, + // Entry 200 - 23F + 0x2597, 0x25bc, 0x25d1, 0x25e9, 0x260e, 0x261a, 0x2626, 0x2626, + 0x2635, 0x2641, 0x2659, 0x2671, 0x2699, 0x26cd, 0x26e5, 0x26e5, + 0x26e5, 0x26f4, 0x2700, 0x2712, 0x2727, 0x2739, 0x2745, 0x275d, + 0x275d, 0x2775, 0x2796, 0x2796, 0x27a8, 0x27ca, 0x27e6, 0x27e6, + 0x27fb, 0x27fb, 0x2810, 0x2810, 0x2822, 0x2834, 0x284c, 0x2864, + 0x28a8, 0x28c6, 0x28e4, 0x28fc, 0x290e, 0x2914, 0x2914, 0x2914, + 0x2914, 0x2914, 0x292c, 0x292c, 0x293e, 0x294d, 0x2959, 0x296b, + 0x2977, 0x2992, 0x2992, 0x29a4, 0x29a4, 0x29b0, 0x29bc, 0x29d4, + // Entry 240 - 27F + 0x29ec, 0x29f5, 0x29f5, 0x2a10, 0x2a2e, 0x2a55, 0x2a55, 0x2a61, + 0x2aa8, 0x2ab4, 0x2b09, 0x2b15, 0x2b5f, 0x2b5f, 0x2b8a, 0x2bb0, + 0x2bed, 0x2c1b, 0x2c52, 0x2c86, 0x2cd3, 0x2d07, 0x2d3e, 0x2d3e, + 0x2d69, 0x2d91, 0x2daa, 0x2dbf, 0x2dfc, 0x2e36, 0x2e51, 0x2e7f, +} // Size: 1240 bytes + +var mnLangStr string = "" + // Size: 3152 bytes + "абхазафрикаканамхарарабассамазербайжанбашкирбеларусьболгарбамбарабенгалт" + + "өвдбретонбосникаталанкорсикчехуэлсданигерманжонхаэвэгреканглиэсперантои" + + "спаниэстонибаскперсфинляндфижифарерфранцбаруун фризынирландшотланд келт" + + "галикгуаранигужаратиманксхаусаеврейхиндихорватгаитиунгарарменинтерлингв" + + "оиндонезинэгдмэл хэлигбошичуан еиисландиталиинуктитутяпонявагүржкикуюүх" + + "асагкалалисуткамбожканнадасолонгоскашмиркүрдкорныкиргизлатинлюксембургг" + + "андалингалалаослитвалуба-катангалатвималагасимаоримакедонмалайламмонгол" + + "маратималаймалтибирмхойд ндебелебалбаголланднорвегийн нинорскнорвегийн " + + "букмолфранцын окситаноромоорияпанжабпольшпаштопортугалкечуароманшрундир" + + "умынороскинярвандасанскритсиндхихойд самисангосинхаласловаксловеншонасо" + + "малиалбанисербсунданшведсвахилитамилтэлүгүтажиктайтигринатуркментонгату" + + "рктатаруйгарукрайнурдуузбеквьетнамволофхосаиддишёрубахятадзулуагеммапүч" + + "иасубембабенабодочигачирокисорани күрдтайтазармаловер-сорбидуалажола-фо" + + "ниэмбуфилиппингагузшвейцари германгузыхавайдээд сорбингомбамачамэкабиле" + + "камбамакондекабүвердианукойра чиникаленжинкоми-пермякконканишамбалабафи" + + "алангилакоталуолуяамасаймеруморисенмакува-митометамохаукмундангнамакваз" + + "ионконуернянколекичеромборвасамбүрүсангүсенакёраборо сенитачелхитөмнөд " + + "самилюле самиинари самисколт самиконго свахилитэсотасавактөв атласын та" + + "мазайттодорхойгүй хэлвайвунжосогатамазитхэл зүйн агуулга байхгүйстандар" + + "т арабавстри германшвейцари дээр германавстрали англиканад англибритани" + + "йн англиамерикийн англилатин америкийн испаниевропын испанимексикийн ис" + + "паниканад францшвейцари францфламандпортугал (бразил)европын португалмо" + + "лдавхялбаршуулсан хятадуламжлалт хятад" + +var mnLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x000a, 0x000a, 0x0014, 0x001c, 0x0026, 0x0026, + 0x002e, 0x0038, 0x0038, 0x0038, 0x004c, 0x0058, 0x0068, 0x0074, + 0x0074, 0x0082, 0x008e, 0x0096, 0x00a2, 0x00ac, 0x00ba, 0x00ba, + 0x00ba, 0x00c6, 0x00c6, 0x00cc, 0x00cc, 0x00cc, 0x00d4, 0x00dc, + 0x00e8, 0x00e8, 0x00f2, 0x00f8, 0x0100, 0x010a, 0x011c, 0x0128, + 0x0134, 0x013c, 0x0144, 0x0144, 0x0152, 0x015a, 0x0164, 0x016e, + 0x0187, 0x0193, 0x01aa, 0x01b4, 0x01c2, 0x01d2, 0x01dc, 0x01e6, + 0x01f0, 0x01fa, 0x01fa, 0x0206, 0x0210, 0x021a, 0x0224, 0x0224, + // Entry 40 - 7F + 0x023a, 0x024a, 0x025f, 0x0267, 0x0278, 0x0278, 0x0278, 0x0284, + 0x028e, 0x02a0, 0x02a8, 0x02ae, 0x02b6, 0x02b6, 0x02c2, 0x02c2, + 0x02cc, 0x02de, 0x02ea, 0x02f8, 0x0308, 0x0308, 0x0314, 0x031c, + 0x031c, 0x0326, 0x0332, 0x033c, 0x0350, 0x035a, 0x035a, 0x0368, + 0x0370, 0x037a, 0x0391, 0x039b, 0x03ab, 0x03ab, 0x03b5, 0x03c3, + 0x03d3, 0x03df, 0x03eb, 0x03f5, 0x03ff, 0x0407, 0x0407, 0x041e, + 0x0428, 0x0428, 0x0436, 0x0457, 0x0476, 0x0476, 0x0476, 0x0476, + 0x0493, 0x0493, 0x049d, 0x04a5, 0x04a5, 0x04b1, 0x04b1, 0x04bb, + // Entry 80 - BF + 0x04c5, 0x04d5, 0x04df, 0x04eb, 0x04f5, 0x04ff, 0x0507, 0x051b, + 0x052b, 0x052b, 0x0537, 0x0548, 0x0552, 0x0560, 0x056c, 0x0578, + 0x0578, 0x0580, 0x058c, 0x0598, 0x05a0, 0x05a0, 0x05a0, 0x05ac, + 0x05b4, 0x05c2, 0x05cc, 0x05d8, 0x05e2, 0x05e8, 0x05f6, 0x0604, + 0x0604, 0x060e, 0x0616, 0x0616, 0x0620, 0x0620, 0x062a, 0x0636, + 0x063e, 0x0648, 0x0648, 0x0656, 0x0656, 0x0656, 0x0660, 0x0668, + 0x0672, 0x067c, 0x067c, 0x0686, 0x068e, 0x068e, 0x068e, 0x068e, + 0x068e, 0x068e, 0x068e, 0x0696, 0x0696, 0x0696, 0x0696, 0x0696, + // Entry C0 - FF + 0x0696, 0x0696, 0x0696, 0x0696, 0x0696, 0x06a2, 0x06a2, 0x06a2, + 0x06a2, 0x06a2, 0x06a2, 0x06a2, 0x06a8, 0x06a8, 0x06a8, 0x06a8, + 0x06a8, 0x06a8, 0x06a8, 0x06a8, 0x06a8, 0x06a8, 0x06a8, 0x06a8, + 0x06a8, 0x06b2, 0x06b2, 0x06ba, 0x06ba, 0x06ba, 0x06ba, 0x06ba, + 0x06ba, 0x06ba, 0x06ba, 0x06ba, 0x06ba, 0x06ba, 0x06ba, 0x06ba, + 0x06ba, 0x06c2, 0x06c2, 0x06c2, 0x06c2, 0x06c2, 0x06c2, 0x06c2, + 0x06c2, 0x06c2, 0x06c2, 0x06c2, 0x06c2, 0x06ca, 0x06ca, 0x06ca, + 0x06ca, 0x06ca, 0x06ca, 0x06ca, 0x06ca, 0x06d6, 0x06d6, 0x06eb, + // Entry 100 - 13F + 0x06eb, 0x06eb, 0x06eb, 0x06eb, 0x06eb, 0x06eb, 0x06f5, 0x06f5, + 0x06f5, 0x06f5, 0x06f5, 0x06ff, 0x06ff, 0x0714, 0x0714, 0x071e, + 0x071e, 0x072f, 0x072f, 0x072f, 0x0737, 0x0737, 0x0737, 0x0737, + 0x0737, 0x0737, 0x0737, 0x0737, 0x0737, 0x0737, 0x0737, 0x0747, + 0x0747, 0x0747, 0x0747, 0x0747, 0x0747, 0x0747, 0x0747, 0x0747, + 0x0747, 0x0747, 0x0751, 0x0751, 0x0751, 0x0751, 0x0751, 0x0751, + 0x0751, 0x0751, 0x0751, 0x0751, 0x0751, 0x0751, 0x0751, 0x0751, + 0x0751, 0x0751, 0x076e, 0x076e, 0x076e, 0x0776, 0x0776, 0x0776, + // Entry 140 - 17F + 0x0776, 0x0780, 0x0780, 0x0780, 0x0780, 0x0780, 0x0793, 0x0793, + 0x0793, 0x0793, 0x0793, 0x0793, 0x0793, 0x0793, 0x0793, 0x0793, + 0x079f, 0x07ab, 0x07ab, 0x07ab, 0x07ab, 0x07ab, 0x07b7, 0x07b7, + 0x07b7, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07cf, 0x07e7, + 0x07e7, 0x07e7, 0x07e7, 0x07e7, 0x07e7, 0x07fa, 0x07fa, 0x07fa, + 0x07fa, 0x080a, 0x080a, 0x081f, 0x082d, 0x082d, 0x082d, 0x082d, + 0x082d, 0x082d, 0x082d, 0x082d, 0x083b, 0x0845, 0x0845, 0x0845, + 0x0845, 0x0845, 0x084f, 0x084f, 0x084f, 0x084f, 0x084f, 0x084f, + // Entry 180 - 1BF + 0x084f, 0x085b, 0x085b, 0x085b, 0x085b, 0x085b, 0x085b, 0x085b, + 0x085b, 0x085b, 0x0861, 0x0861, 0x0869, 0x0869, 0x0869, 0x0869, + 0x0869, 0x0869, 0x0869, 0x0869, 0x0869, 0x0873, 0x0873, 0x0873, + 0x0873, 0x0873, 0x087b, 0x0889, 0x0889, 0x089e, 0x08a6, 0x08a6, + 0x08a6, 0x08a6, 0x08a6, 0x08b2, 0x08b2, 0x08b2, 0x08c0, 0x08c0, + 0x08c0, 0x08c0, 0x08c0, 0x08c0, 0x08c0, 0x08c0, 0x08c0, 0x08c0, + 0x08c0, 0x08c8, 0x08c8, 0x08c8, 0x08c8, 0x08c8, 0x08c8, 0x08d4, + 0x08d4, 0x08d4, 0x08d4, 0x08d4, 0x08da, 0x08da, 0x08e2, 0x08e2, + // Entry 1C0 - 1FF + 0x08e2, 0x08f0, 0x08f0, 0x08f0, 0x08f0, 0x08f0, 0x08f0, 0x08f0, + 0x08f0, 0x08f0, 0x08f0, 0x08f0, 0x08f0, 0x08f0, 0x08f0, 0x08f0, + 0x08f0, 0x08f0, 0x08f0, 0x08f0, 0x08f0, 0x08f0, 0x08f8, 0x08f8, + 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x08f8, 0x0902, 0x0902, 0x0902, + 0x0902, 0x0902, 0x0902, 0x0908, 0x0908, 0x0908, 0x0908, 0x0916, + 0x0916, 0x0916, 0x0916, 0x0916, 0x0920, 0x0920, 0x0920, 0x0920, + 0x0920, 0x0920, 0x0928, 0x0928, 0x0928, 0x0941, 0x0941, 0x0941, + 0x0951, 0x0951, 0x0951, 0x0951, 0x0951, 0x0951, 0x0964, 0x0975, + // Entry 200 - 23F + 0x0988, 0x099b, 0x099b, 0x099b, 0x099b, 0x099b, 0x099b, 0x099b, + 0x099b, 0x099b, 0x099b, 0x099b, 0x09b4, 0x09b4, 0x09b4, 0x09b4, + 0x09b4, 0x09b4, 0x09bc, 0x09bc, 0x09bc, 0x09bc, 0x09bc, 0x09bc, + 0x09bc, 0x09bc, 0x09bc, 0x09bc, 0x09bc, 0x09bc, 0x09bc, 0x09bc, + 0x09bc, 0x09bc, 0x09bc, 0x09bc, 0x09bc, 0x09bc, 0x09ca, 0x09ca, + 0x09f0, 0x09f0, 0x09f0, 0x09f0, 0x0a0d, 0x0a13, 0x0a13, 0x0a13, + 0x0a13, 0x0a13, 0x0a13, 0x0a13, 0x0a1d, 0x0a1d, 0x0a1d, 0x0a1d, + 0x0a1d, 0x0a1d, 0x0a1d, 0x0a1d, 0x0a1d, 0x0a25, 0x0a25, 0x0a25, + // Entry 240 - 27F + 0x0a25, 0x0a25, 0x0a25, 0x0a25, 0x0a25, 0x0a25, 0x0a25, 0x0a25, + 0x0a33, 0x0a33, 0x0a60, 0x0a60, 0x0a79, 0x0a79, 0x0a92, 0x0ab8, + 0x0ad3, 0x0ae8, 0x0b05, 0x0b22, 0x0b4c, 0x0b67, 0x0b86, 0x0b86, + 0x0b9b, 0x0bb6, 0x0bb6, 0x0bc4, 0x0be3, 0x0c02, 0x0c0e, 0x0c0e, + 0x0c33, 0x0c50, +} // Size: 1244 bytes + +var mrLangStr string = "" + // Size: 11013 bytes + "अफारअबखेजियनअवेस्तनअफ्रिकान्सअकानअम्हारिकअर्गोनीजअरबीआसामीअ\u200dॅव्हेरि" + + "कऐमराअझरबैजानीबष्किरबेलारुशियनबल्गेरियनबिस्लामाबाम्बाराबंगालीतिबेटीब्र" + + "ेतॉनबोस्नियनकातालानचेचेनकॅमोरोकॉर्सिकनक्रीझेकचर्च स्लाव्हिकचूवाशवेल्शड" + + "ॅनिशजर्मनदिवेहीझोंगखाएवेग्रीकइंग्रजीएस्परान्टोस्पॅनिशइस्टोनियनबास्कफार" + + "सीफुलाहफिन्निशफिजियनफरोइजफ्रेंचपश्चिमी फ्रिशियनआयरिशस्कॉट्स गेलिकगॅलिश" + + "ियनगुआरनीगुजरातीमांक्सहौसाहिब्रूहिंदीहिरी मॉटूक्रोएशियनहैतीयनहंगेरियनआ" + + "र्मेनियनहरेरोइंटरलिंग्वाइंडोनेशियनइन्टरलिंगईग्बोसिचुआन यीइनूपियाकइडौआई" + + "सलँडिकइटालियनइनुकिटुट्जपानीजावानीजजॉर्जियनकाँगोकिकुयूक्वान्यामाकझाककला" + + "ल्लिसतख्मेरकन्नडकोरियनकनुरीकाश्मीरीकुर्दिशकोमीकोर्निशकिरगीझलॅटिनलक्झें" + + "बर्गिशगांडालिंबूर्गिशलिंगालालाओलिथुआनियनल्यूबा-कटांगालात्व्हियनमलागसीम" + + "ार्शलीजमाओरीमॅसेडोनियनमल्याळममंगोलियनमराठीमलयमाल्टिज्बर्मीनउरूउत्तर दे" + + "बेलीनेपाळीडोंगाडचनॉर्वेजियन न्योर्स्कनॉर्वेजियन बोकमालदक्षिणात्य देबेल" + + "ीनावाजोन्यान्जाऑक्सितानओजिब्वाओरोमोउडियाओस्सेटिकपंजाबीपालीपोलिशपश्तोपो" + + "र्तुगीजक्वेचुआरोमान्शरुन्दीरोमानियनरशियनकिन्यार्वान्डासंस्कृतसर्दिनियन" + + "सिंधीउत्तरी सामीसांगोसिंहलास्लोव्हाकस्लोव्हेनियनसामोअनशोनासोमालीअल्बान" + + "ियनसर्बियनस्वातीसेसोथोसुंदानीजस्वीडिशस्वाहिलीतामिळतेलगूताजिकथाईतिग्रिन" + + "्यातुर्कमेनत्स्वानाटोंगनतुर्कीसोंगातातरताहितीयनउइगुरयुक्रेनियनउर्दूउझ्" + + "बेकव्हेंदाव्हिएतनामीओलापुकवालूनवोलोफखोसायिद्दिशयोरुबाझुआंगचीनीझुलूअचीन" + + "ीअकोलीअडांग्मेअडिघेअफ्रिहिलीअघेमऐनूअक्कादिआनअलेउतदक्षिणात्य अल्ताईपुरा" + + "तन इंग्रजीअंगिकाअ\u200dॅरेमाइकमापुचीअराफाओअरावकअसुअस्तुरियनअवधीबलुचीबा" + + "लिनीसबसाबेजाबेम्बाबेनापश्चिमी बालोचीभोजपुरीबिकोलबिनीसिक्सिकाब्रजबोडोबु" + + "रियातबगिनीसब्लिनकॅड्डोकॅरिबअत्समसिबुआनोकिगाचिब्चाछगाताईचूकीसेमारीचिनूक" + + " जारगॉनचोक्तौशिपेव्यानचेरोकीशेयेन्नमध्य कुर्दिशकॉप्टिकक्राइमीन तुर्कीकाश" + + "ुबियनदाकोतादार्गवातायताडेलॅवेयरस्लाव्हडोग्रिबदिन्काझार्माडोगरीलोअर सोर" + + "्बियनदुआलामिडल डचजोला-फोंयीड्युलाएम्बूएफिकप्राचीन इजिप्शियनएकाजुकएलामा" + + "इटमिडल इंग्रजीइवोन्डोफँगफिलिपिनोफॉनमिडल फ्रेंचपुरातन फ्रेंचउत्तरी फ्रि" + + "शियनपौर्वात्य फ्रिशियनफ्रियुलियानGaगागाउझगायोबायागीझजिल्बरटीजमिडल हाय " + + "जर्मनपुरातन हाइ जर्मनगाँडीगोरोन्तालोगॉथिकग्रेबोप्राचीन ग्रीकस्विस जर्म" + + "नगसीग्विच’इनहैडाहवाईयनहिलीगेनॉनहिट्टितेमाँगअप्पर सॉर्बियनहूपाइबानइलोको" + + "इंगुशलोज्बानगोम्बामशामेजुदेओ-फारसीजुदेओ-अरबीकारा-कल्पककबाइलकाचिनज्जुका" + + "म्बाकावीकबार्डियनत्यापमाकोन्देकाबवर्दियानुकोरोखासीखोतानीसकोयरा चीनीकाल" + + "ेंजीनकिम्बन्दुकोमी-परम्याककोंकणीकोसरियनक्पेल्लेकराचय-बाल्करकरेलियनकुरू" + + "खशांबालाबाफियाकुमीककुतेनाईलादीनोलांगीलाह्न्डालाम्बालेझ्घीयनलाकोटामोंगो" + + "लोझिउत्तरी ल्युरीलुबा-लुलुआलुइसेनोलुन्डाल्युओलुशाईल्युइयामादुरीसमगहीमै" + + "थिलीमकस्सरमन्डिन्गोमसाईमोक्षमंडारमेन्डेमेरूमोरिस्येनमिडल आयरिशमाखुव्हा" + + "-मीट्टोमीटामिकमॅकमिनांग्काबाउमान्चुमणिपुरीमोहॉकमोस्सीमुंडांगएकविध भाषाक्" + + "रीकमिरांडिज्मारवाडीएर्झ्यामाझानदेरानीनेपोलिटाननामालो जर्मननेवारीनियासन" + + "ियुआनक्वासिओनोगाईपुरातन नॉर्सएन्कोउत्तरी सोथोनुएरअभिजात नेवारीन्यामवेझ" + + "ीन्यानकोलन्योरोन्झिमाओसेजओटोमान तुर्किशपंगासीनानपहलवीपाम्पान्गापापियाम" + + "ेन्टोपालाउआनपुरातन फारसीफोनिशियनपोह्नपियनपुरातन प्रोव्हेन्सलकीशेइराजस्" + + "थानीरापानुईरारोटोंगनरोम्बोरोमानीअरोमानियनरव्हासँडवेयाकूतसामरिटान अरॅमि" + + "कसांबुरूसासाकसंतालीसांगुसिसिलियनस्कॉट्सदक्षिणी कुर्दिशसेनासेल्कपकोयराब" + + "ोरो सेन्नीपुरातन आयरिशताशेल्हिटशॅनसिदामोदक्षिणात्य सामील्युल सामीइनारी" + + " सामीस्कोल्ट सामीसोनिन्केसोग्डिएनस्रानान टॉन्गोसेरेरसुकुमासुसुसुमेरियनको" + + "मोरियनकाँगो स्वाहिलीअभिजात सिरियाकसिरियाकटिम्नेतेसोतेरेनोतेतुमटाइग्रेत" + + "िवटोकेलाऊक्लिंगोनलिंगिततामाशेकन्यासा टोन्गाटोक पिसिनसिम्शियनतुम्बुकाटु" + + "वालुतासाव्हाकटुवीनियनमध्य ऍटलास तॅमॅझायटउदमुर्तयुगॅरिटिकउम्बुन्डुरूटवा" + + "ईवॉटिकवुंजोवलामोवारेवाशोवार्लपिरीकाल्मिकसोगायाओयापीसकँटोनीजझेपोटेकब्लि" + + "सिम्बॉल्सझेनान्गाप्रमाण मोरोक्कन तॅमॅझायटझुनीभाषावैज्ञानिक सामग्री नाह" + + "ीझाझाआधुनिक प्रमाणित अरबीऑस्ट्रियन जर्मनस्विस हाय जर्मनऑस्ट्रेलियन इंग" + + "्रजीकॅनडियन इंग्रजीब्रिटिश इंग्रजीअमेरिकन इंग्रजीलॅटिन अमेरिकन स्पॅनिश" + + "युरोपियन स्पॅनिशमेक्सिकन स्पॅनिशकॅनडियन फ्रेंचस्विस फ्रेंचलो सॅक्सनफ्ल" + + "ेमिशब्राझिलियन पोर्तुगीजयुरोपियन पोर्तुगीजमोल्डाव्हियनसर्बो-क्रोएशियनस" + + "रलीकृत चीनीपारंपारिक चीनी" + +var mrLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000c, 0x0024, 0x0039, 0x0057, 0x0063, 0x007b, 0x0093, + 0x009f, 0x00ae, 0x00cc, 0x00d8, 0x00f3, 0x0105, 0x0123, 0x013e, + 0x0156, 0x016e, 0x0180, 0x0192, 0x01a7, 0x01bf, 0x01d4, 0x01e3, + 0x01f5, 0x020d, 0x0219, 0x0222, 0x024a, 0x0259, 0x0268, 0x0277, + 0x0286, 0x0298, 0x02aa, 0x02b3, 0x02c2, 0x02d7, 0x02f5, 0x030a, + 0x0325, 0x0334, 0x0343, 0x0352, 0x0367, 0x0379, 0x0388, 0x039a, + 0x03c8, 0x03d7, 0x03fc, 0x0414, 0x0426, 0x043b, 0x044d, 0x0459, + 0x046b, 0x047a, 0x0493, 0x04ae, 0x04c0, 0x04d8, 0x04f3, 0x0502, + // Entry 40 - 7F + 0x0523, 0x0541, 0x055c, 0x056b, 0x0584, 0x059c, 0x05a5, 0x05bd, + 0x05d2, 0x05ed, 0x05fc, 0x0611, 0x0629, 0x0638, 0x064a, 0x0668, + 0x0674, 0x068f, 0x069e, 0x06ad, 0x06bf, 0x06ce, 0x06e6, 0x06fb, + 0x0707, 0x071c, 0x072e, 0x073d, 0x0761, 0x0770, 0x078e, 0x07a3, + 0x07ac, 0x07c7, 0x07ec, 0x080a, 0x081c, 0x0834, 0x0843, 0x0861, + 0x0876, 0x088e, 0x089d, 0x08a6, 0x08be, 0x08cd, 0x08d9, 0x08fb, + 0x090d, 0x091c, 0x0922, 0x095c, 0x098d, 0x09be, 0x09d0, 0x09e8, + 0x0a00, 0x0a15, 0x0a24, 0x0a33, 0x0a4b, 0x0a5d, 0x0a69, 0x0a78, + // Entry 80 - BF + 0x0a87, 0x0aa2, 0x0ab7, 0x0acc, 0x0ade, 0x0af6, 0x0b05, 0x0b2f, + 0x0b44, 0x0b5f, 0x0b6e, 0x0b8d, 0x0b9c, 0x0bae, 0x0bc9, 0x0bed, + 0x0bff, 0x0c0b, 0x0c1d, 0x0c38, 0x0c4d, 0x0c5f, 0x0c71, 0x0c89, + 0x0c9e, 0x0cb6, 0x0cc5, 0x0cd4, 0x0ce3, 0x0cec, 0x0d0a, 0x0d22, + 0x0d3a, 0x0d49, 0x0d5b, 0x0d6a, 0x0d76, 0x0d8e, 0x0d9d, 0x0dbb, + 0x0dca, 0x0ddc, 0x0df1, 0x0e0f, 0x0e21, 0x0e30, 0x0e3f, 0x0e4b, + 0x0e60, 0x0e72, 0x0e81, 0x0e8d, 0x0e99, 0x0ea8, 0x0eb7, 0x0ecf, + 0x0ede, 0x0ede, 0x0ef9, 0x0f05, 0x0f0e, 0x0f29, 0x0f29, 0x0f38, + // Entry C0 - FF + 0x0f38, 0x0f69, 0x0f91, 0x0fa3, 0x0fbe, 0x0fd0, 0x0fd0, 0x0fe2, + 0x0fe2, 0x0ff1, 0x0ff1, 0x0ff1, 0x0ffa, 0x0ffa, 0x1015, 0x1015, + 0x1021, 0x1030, 0x1045, 0x1045, 0x104e, 0x104e, 0x104e, 0x104e, + 0x105a, 0x106c, 0x106c, 0x1078, 0x1078, 0x1078, 0x10a0, 0x10b5, + 0x10c4, 0x10d0, 0x10d0, 0x10d0, 0x10e8, 0x10e8, 0x10e8, 0x10f4, + 0x10f4, 0x1100, 0x1100, 0x1115, 0x1127, 0x1127, 0x1136, 0x1136, + 0x1148, 0x1157, 0x1157, 0x1166, 0x117b, 0x1187, 0x1199, 0x11ab, + 0x11bd, 0x11c9, 0x11eb, 0x11fd, 0x1218, 0x122a, 0x123f, 0x1261, + // Entry 100 - 13F + 0x1276, 0x1276, 0x12a1, 0x12b9, 0x12cb, 0x12e0, 0x12ef, 0x1307, + 0x131c, 0x1331, 0x1343, 0x1355, 0x1364, 0x1389, 0x1389, 0x1398, + 0x13ab, 0x13c7, 0x13d9, 0x13d9, 0x13e8, 0x13f4, 0x13f4, 0x1425, + 0x1437, 0x144c, 0x146e, 0x146e, 0x1483, 0x1483, 0x148c, 0x14a4, + 0x14a4, 0x14ad, 0x14ad, 0x14cc, 0x14f1, 0x14f1, 0x151c, 0x1550, + 0x1571, 0x1573, 0x1585, 0x1585, 0x1591, 0x159d, 0x159d, 0x15a6, + 0x15c1, 0x15c1, 0x15e7, 0x1613, 0x1613, 0x1622, 0x1640, 0x164f, + 0x1661, 0x1686, 0x16a5, 0x16a5, 0x16a5, 0x16ae, 0x16c6, 0x16d2, + // Entry 140 - 17F + 0x16d2, 0x16e4, 0x16e4, 0x16ff, 0x1717, 0x1723, 0x174b, 0x174b, + 0x1757, 0x1763, 0x1763, 0x1772, 0x1781, 0x1781, 0x1781, 0x1796, + 0x17a8, 0x17b7, 0x17d6, 0x17f2, 0x17f2, 0x180e, 0x181d, 0x182c, + 0x1838, 0x184a, 0x1856, 0x1871, 0x1871, 0x1880, 0x1898, 0x18bc, + 0x18bc, 0x18c8, 0x18c8, 0x18d4, 0x18e9, 0x1905, 0x1905, 0x1905, + 0x1905, 0x191d, 0x1938, 0x195a, 0x196c, 0x1981, 0x1999, 0x19bb, + 0x19bb, 0x19bb, 0x19d0, 0x19df, 0x19f4, 0x1a06, 0x1a06, 0x1a15, + 0x1a2a, 0x1a3c, 0x1a4b, 0x1a63, 0x1a75, 0x1a8d, 0x1a8d, 0x1a8d, + // Entry 180 - 1BF + 0x1a8d, 0x1a9f, 0x1a9f, 0x1aae, 0x1aba, 0x1adf, 0x1adf, 0x1afb, + 0x1b10, 0x1b22, 0x1b31, 0x1b40, 0x1b55, 0x1b55, 0x1b55, 0x1b6a, + 0x1b6a, 0x1b76, 0x1b88, 0x1b9a, 0x1bb5, 0x1bc1, 0x1bc1, 0x1bd0, + 0x1bdf, 0x1bf1, 0x1bfd, 0x1c18, 0x1c34, 0x1c5f, 0x1c6b, 0x1c7d, + 0x1ca1, 0x1cb3, 0x1cc8, 0x1cd7, 0x1ce9, 0x1ce9, 0x1cfe, 0x1d1a, + 0x1d29, 0x1d44, 0x1d59, 0x1d59, 0x1d59, 0x1d6e, 0x1d8f, 0x1d8f, + 0x1daa, 0x1db6, 0x1dcc, 0x1dde, 0x1ded, 0x1dff, 0x1dff, 0x1e14, + 0x1e14, 0x1e23, 0x1e45, 0x1e45, 0x1e54, 0x1e73, 0x1e7f, 0x1ea4, + // Entry 1C0 - 1FF + 0x1ebf, 0x1ed7, 0x1ee9, 0x1efb, 0x1f07, 0x1f2f, 0x1f4a, 0x1f59, + 0x1f77, 0x1f9b, 0x1fb0, 0x1fb0, 0x1fb0, 0x1fb0, 0x1fd2, 0x1fd2, + 0x1fea, 0x1fea, 0x1fea, 0x2005, 0x2005, 0x203c, 0x204b, 0x204b, + 0x2066, 0x207b, 0x2096, 0x2096, 0x2096, 0x20a8, 0x20ba, 0x20ba, + 0x20ba, 0x20ba, 0x20d5, 0x20e4, 0x20f3, 0x2102, 0x212d, 0x2142, + 0x2151, 0x2163, 0x2163, 0x2163, 0x2172, 0x218a, 0x219f, 0x219f, + 0x21ca, 0x21ca, 0x21d6, 0x21d6, 0x21e8, 0x2216, 0x2238, 0x2238, + 0x2253, 0x225c, 0x225c, 0x226e, 0x226e, 0x226e, 0x2299, 0x22b5, + // Entry 200 - 23F + 0x22d1, 0x22f3, 0x230b, 0x2323, 0x234b, 0x235a, 0x235a, 0x235a, + 0x236c, 0x2378, 0x2390, 0x23a8, 0x23d0, 0x23f8, 0x240d, 0x240d, + 0x240d, 0x241f, 0x242b, 0x243d, 0x244c, 0x2461, 0x246a, 0x247f, + 0x247f, 0x2497, 0x24a9, 0x24a9, 0x24be, 0x24e3, 0x24fc, 0x24fc, + 0x24fc, 0x24fc, 0x2514, 0x2514, 0x252c, 0x253e, 0x2559, 0x2571, + 0x25a6, 0x25bb, 0x25d6, 0x25f1, 0x25fa, 0x2603, 0x2603, 0x2603, + 0x2603, 0x2603, 0x2612, 0x2612, 0x2621, 0x2621, 0x2630, 0x263c, + 0x2648, 0x2663, 0x2663, 0x2678, 0x2678, 0x2684, 0x268d, 0x269c, + // Entry 240 - 27F + 0x269c, 0x269c, 0x269c, 0x26b1, 0x26c6, 0x26ed, 0x26ed, 0x2705, + 0x2749, 0x2755, 0x279f, 0x27ab, 0x27e3, 0x27e3, 0x280e, 0x2837, + 0x286e, 0x2899, 0x28c4, 0x28ef, 0x292a, 0x2958, 0x2986, 0x2986, + 0x29ae, 0x29d0, 0x29e9, 0x29fe, 0x2a38, 0x2a6c, 0x2a90, 0x2abb, + 0x2add, 0x2b05, +} // Size: 1244 bytes + +var msLangStr string = "" + // Size: 2443 bytes + "AbkhaziaAvestanAfrikaansAkanAmharicArabAssamAvaricAymaraAzerbaijanBashki" + + "rBelarusBulgariaBambaraBenggalaTibetBretonBosniaCataloniaChechenCorsicaC" + + "zechSlavik GerejaChuvashWalesDenmarkJermanDivehiDzongkhaEweGreekInggeris" + + "EsperantoSepanyolEstoniaBasqueParsiFinlandFijiFaroePerancisFrisian Barat" + + "IrelandScots GaelicGaliciaGuaraniGujeratManxHausaIbraniHindiCroatiaHaiti" + + "HungaryArmeniaInterlinguaIndonesiaInterlingueIgboSichuan YiIcelandItaliI" + + "nuktitutJepunJawaGeorgiaKongoKikuyaKazakhstanKalaallisutKhmerKannadaKore" + + "aKashmirKurdishCornishKirghizLatinLuxembourgGandaLingalaLaosLithuaniaLub" + + "a-KatangaLatviaMalagasyMaoriMacedoniaMalayalamMongoliaMarathiBahasa Mela" + + "yuMaltaBurmaNdebele UtaraNepalBelandaNynorsk NorwayBokmål NorwayNyanjaOc" + + "citaniaOromoOriyaOssetePunjabiPolandPashtoPortugisQuechuaRomanshRundiRom" + + "aniaRusiaKinyarwandaSanskritSindhiSami UtaraSangoSinhalaSlovakSloveniaSa" + + "moaShonaSomaliAlbaniaSerbiaSwatiSotho SelatanSundaSwedenSwahiliTamilTelu" + + "guTajikThaiTigrinyaTurkmenTswanaTongaTurkiTsongaTatarTahitiUyghurUkraine" + + "UrduUzbekistanVendaVietnamWolofXhosaYiddishYorubaCinaZuluAkoliAdygheArab" + + " TunisiaAghemAltai SelatanMapucheArab AlgeriaArab MaghribiArab MesirAsuB" + + "aluchiBasaaBamunGhomalaBejaBembaBenaBafutBalochi BaratKomBishnupriyaBrah" + + "uiBodoAkooseBuriatBuluMedumbaCayugaChigaMariCherokeeKurdi SoraniCopticTu" + + "rki KrimeaTaitaZarmaDogriLower SorbianDualaJola-FonyiDazagaEmbuEfikEwond" + + "oFilipinaGaGagauzGbayaZoroastrian DariGilakiGreek PurbaJerman Switzerlan" + + "dGusiiHawaiiUpper SorbianIbibioNgombaMachameKabyleKambaKanembuMakondeKab" + + "uverdianuKoyra ChiiniKhowarKakoKalenjinKomi-PermyakKonkaniShambalaBafiaC" + + "olognianLangiLahndaLakotaLoziLuri UtaraLuba-LuluaLuoMizoLuyiaMafaMasaiMa" + + "baMeruMorisyenMakhuwa-MeettoMeta’ManipuriMohawkMundangMyeneMazanderaniNa" + + "maJerman RendahKwasioNgiemboonN’koSotho UtaraNuerNyankoleKʼicheʼRomboRwa" + + "SamburuNgambaySanguKurdish SelatanSenecaSenaKoyraboro SenniTachelhitChad" + + "ian ArabSami SelatanLule SamiInari SamiSkolt SamiSahoComoriaCongo Swahil" + + "iTesoTetumKlingonTalyshTok PisinTarokoTumbukaTasawaqTamazight Atlas Teng" + + "ahBahasa Tidak DiketahuiVaiVunjoWalserWarlpiriSogaYangbenYembaTamazight " + + "Maghribi StandardTiada kandungan linguistikZazaArab Standard ModenJerman" + + " AustriaJerman Halus SwitzerlandInggeris AustraliaInggeris KanadaInggeri" + + "s BritishInggeris ASSepanyol Amerika LatinSepanyol EropahSepanyol Mexico" + + "Perancis KanadaPerancis SwitzerlandSaxon RendahFlemishPortugis BrazilPor" + + "tugis EropahMoldaviaSerboCroatiaCina RingkasCina Tradisional" + +var msLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0008, 0x000f, 0x0018, 0x001c, 0x0023, 0x0023, + 0x0027, 0x002c, 0x0032, 0x0038, 0x0042, 0x0049, 0x0050, 0x0058, + 0x0058, 0x005f, 0x0067, 0x006c, 0x0072, 0x0078, 0x0081, 0x0088, + 0x0088, 0x008f, 0x008f, 0x0094, 0x00a1, 0x00a8, 0x00ad, 0x00b4, + 0x00ba, 0x00c0, 0x00c8, 0x00cb, 0x00d0, 0x00d8, 0x00e1, 0x00e9, + 0x00f0, 0x00f6, 0x00fb, 0x00fb, 0x0102, 0x0106, 0x010b, 0x0113, + 0x0120, 0x0127, 0x0133, 0x013a, 0x0141, 0x0148, 0x014c, 0x0151, + 0x0157, 0x015c, 0x015c, 0x0163, 0x0168, 0x016f, 0x0176, 0x0176, + // Entry 40 - 7F + 0x0181, 0x018a, 0x0195, 0x0199, 0x01a3, 0x01a3, 0x01a3, 0x01aa, + 0x01af, 0x01b8, 0x01bd, 0x01c1, 0x01c8, 0x01cd, 0x01d3, 0x01d3, + 0x01dd, 0x01e8, 0x01ed, 0x01f4, 0x01f9, 0x01f9, 0x0200, 0x0207, + 0x0207, 0x020e, 0x0215, 0x021a, 0x0224, 0x0229, 0x0229, 0x0230, + 0x0234, 0x023d, 0x0249, 0x024f, 0x0257, 0x0257, 0x025c, 0x0265, + 0x026e, 0x0276, 0x027d, 0x028a, 0x028f, 0x0294, 0x0294, 0x02a1, + 0x02a6, 0x02a6, 0x02ad, 0x02bb, 0x02c9, 0x02c9, 0x02c9, 0x02cf, + 0x02d8, 0x02d8, 0x02dd, 0x02e2, 0x02e8, 0x02ef, 0x02ef, 0x02f5, + // Entry 80 - BF + 0x02fb, 0x0303, 0x030a, 0x0311, 0x0316, 0x031d, 0x0322, 0x032d, + 0x0335, 0x0335, 0x033b, 0x0345, 0x034a, 0x0351, 0x0357, 0x035f, + 0x0364, 0x0369, 0x036f, 0x0376, 0x037c, 0x0381, 0x038e, 0x0393, + 0x0399, 0x03a0, 0x03a5, 0x03ab, 0x03b0, 0x03b4, 0x03bc, 0x03c3, + 0x03c9, 0x03ce, 0x03d3, 0x03d9, 0x03de, 0x03e4, 0x03ea, 0x03f1, + 0x03f5, 0x03ff, 0x0404, 0x040b, 0x040b, 0x040b, 0x0410, 0x0415, + 0x041c, 0x0422, 0x0422, 0x0426, 0x042a, 0x042a, 0x042f, 0x042f, + 0x0435, 0x0441, 0x0441, 0x0446, 0x0446, 0x0446, 0x0446, 0x0446, + // Entry C0 - FF + 0x0446, 0x0453, 0x0453, 0x0453, 0x0453, 0x045a, 0x045a, 0x045a, + 0x0466, 0x0466, 0x0473, 0x047d, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0487, 0x0487, 0x0487, 0x048c, 0x0491, 0x0491, 0x0498, + 0x049c, 0x04a1, 0x04a1, 0x04a5, 0x04aa, 0x04aa, 0x04b7, 0x04b7, + 0x04b7, 0x04b7, 0x04b7, 0x04ba, 0x04ba, 0x04c5, 0x04c5, 0x04c5, + 0x04cb, 0x04cf, 0x04d5, 0x04db, 0x04db, 0x04df, 0x04df, 0x04e6, + 0x04e6, 0x04e6, 0x04ec, 0x04ec, 0x04ec, 0x04f1, 0x04f1, 0x04f1, + 0x04f1, 0x04f5, 0x04f5, 0x04f5, 0x04f5, 0x04fd, 0x04fd, 0x0509, + // Entry 100 - 13F + 0x050f, 0x050f, 0x051b, 0x051b, 0x051b, 0x051b, 0x0520, 0x0520, + 0x0520, 0x0520, 0x0520, 0x0525, 0x052a, 0x0537, 0x0537, 0x053c, + 0x053c, 0x0546, 0x0546, 0x054c, 0x0550, 0x0554, 0x0554, 0x0554, + 0x0554, 0x0554, 0x0554, 0x0554, 0x055a, 0x055a, 0x055a, 0x0562, + 0x0562, 0x0562, 0x0562, 0x0562, 0x0562, 0x0562, 0x0562, 0x0562, + 0x0562, 0x0564, 0x056a, 0x056a, 0x056a, 0x056f, 0x057f, 0x057f, + 0x057f, 0x0585, 0x0585, 0x0585, 0x0585, 0x0585, 0x0585, 0x0585, + 0x0585, 0x0590, 0x05a2, 0x05a2, 0x05a2, 0x05a7, 0x05a7, 0x05a7, + // Entry 140 - 17F + 0x05a7, 0x05ad, 0x05ad, 0x05ad, 0x05ad, 0x05ad, 0x05ba, 0x05ba, + 0x05ba, 0x05ba, 0x05c0, 0x05c0, 0x05c0, 0x05c0, 0x05c0, 0x05c0, + 0x05c6, 0x05cd, 0x05cd, 0x05cd, 0x05cd, 0x05cd, 0x05d3, 0x05d3, + 0x05d3, 0x05d8, 0x05d8, 0x05d8, 0x05df, 0x05df, 0x05e6, 0x05f2, + 0x05f2, 0x05f2, 0x05f2, 0x05f2, 0x05f2, 0x05fe, 0x0604, 0x0604, + 0x0608, 0x0610, 0x0610, 0x061c, 0x0623, 0x0623, 0x0623, 0x0623, + 0x0623, 0x0623, 0x0623, 0x0623, 0x062b, 0x0630, 0x0639, 0x0639, + 0x0639, 0x0639, 0x063e, 0x0644, 0x0644, 0x0644, 0x0644, 0x0644, + // Entry 180 - 1BF + 0x0644, 0x064a, 0x064a, 0x064a, 0x064e, 0x0658, 0x0658, 0x0662, + 0x0662, 0x0662, 0x0665, 0x0669, 0x066e, 0x066e, 0x066e, 0x066e, + 0x0672, 0x0672, 0x0672, 0x0672, 0x0672, 0x0677, 0x067b, 0x067b, + 0x067b, 0x067b, 0x067f, 0x0687, 0x0687, 0x0695, 0x069c, 0x069c, + 0x069c, 0x069c, 0x06a4, 0x06aa, 0x06aa, 0x06aa, 0x06b1, 0x06b1, + 0x06b1, 0x06b1, 0x06b1, 0x06b1, 0x06b6, 0x06b6, 0x06c1, 0x06c1, + 0x06c1, 0x06c5, 0x06d2, 0x06d2, 0x06d2, 0x06d2, 0x06d2, 0x06d8, + 0x06e1, 0x06e1, 0x06e1, 0x06e1, 0x06e7, 0x06f2, 0x06f6, 0x06f6, + // Entry 1C0 - 1FF + 0x06f6, 0x06fe, 0x06fe, 0x06fe, 0x06fe, 0x06fe, 0x06fe, 0x06fe, + 0x06fe, 0x06fe, 0x06fe, 0x06fe, 0x06fe, 0x06fe, 0x06fe, 0x06fe, + 0x06fe, 0x06fe, 0x06fe, 0x06fe, 0x06fe, 0x06fe, 0x0707, 0x0707, + 0x0707, 0x0707, 0x0707, 0x0707, 0x0707, 0x070c, 0x070c, 0x070c, + 0x070c, 0x070c, 0x070c, 0x070f, 0x070f, 0x070f, 0x070f, 0x0716, + 0x0716, 0x0716, 0x0716, 0x071d, 0x0722, 0x0722, 0x0722, 0x0722, + 0x0731, 0x0737, 0x073b, 0x073b, 0x073b, 0x074a, 0x074a, 0x074a, + 0x0753, 0x0753, 0x075f, 0x075f, 0x075f, 0x075f, 0x076b, 0x0774, + // Entry 200 - 23F + 0x077e, 0x0788, 0x0788, 0x0788, 0x0788, 0x0788, 0x078c, 0x078c, + 0x078c, 0x078c, 0x078c, 0x0793, 0x07a0, 0x07a0, 0x07a0, 0x07a0, + 0x07a0, 0x07a0, 0x07a4, 0x07a4, 0x07a9, 0x07a9, 0x07a9, 0x07a9, + 0x07a9, 0x07b0, 0x07b0, 0x07b6, 0x07b6, 0x07b6, 0x07bf, 0x07bf, + 0x07c5, 0x07c5, 0x07c5, 0x07c5, 0x07cc, 0x07cc, 0x07d3, 0x07d3, + 0x07e9, 0x07e9, 0x07e9, 0x07e9, 0x07ff, 0x0802, 0x0802, 0x0802, + 0x0802, 0x0802, 0x0802, 0x0802, 0x0807, 0x080d, 0x080d, 0x080d, + 0x080d, 0x0815, 0x0815, 0x0815, 0x0815, 0x0819, 0x0819, 0x0819, + // Entry 240 - 27F + 0x0820, 0x0825, 0x0825, 0x0825, 0x0825, 0x0825, 0x0825, 0x0825, + 0x0840, 0x0840, 0x085a, 0x085e, 0x0871, 0x0871, 0x087f, 0x0897, + 0x08a9, 0x08b8, 0x08c8, 0x08d3, 0x08e9, 0x08f8, 0x0907, 0x0907, + 0x0916, 0x092a, 0x0936, 0x093d, 0x094c, 0x095b, 0x0963, 0x096f, + 0x097b, 0x098b, +} // Size: 1244 bytes + +var myLangStr string = "" + // Size: 6975 bytes + "အဘ်ခါဇီရန်အာဖရိကန်းစ်အာကိန်အန်ဟာရစျချအာရေဗီအက္စမီစ်အော်ဇောဘိုင်ဂျောနီဘက်" + + "ရှ်ကီအာဘီလာရုဘူဂေးရီးယားဘန်ဘာရာဘင်္ဂါလီတိဘက်ဘရီတွန်ဘော့စ်နီးယားကာတာလန်" + + "ချေချင်းခိုစီကန်ခရီးချက်ချူဗက်ရှ်ဝေလဒိန်းမတ်ဂျာမန်ဒွန်ကာဝီဂရိအင်္ဂလိပ်" + + "အက္စပရန္တိုစပိန်အက်စ်တိုးနီးရန်းဘစ်က္ကီပါရှန်ဖင်နစ်ရှ်ဖီဂျီဖာရိုအိစ်ပြ" + + "င်သစ်အနောက်ပိုင်း ဖရီစီရန်အိုင်းရစ်ဂါလာစီယံဂူအာရာနီဂူဂျာရသီမန်းဇ်ဟာဥစာ" + + "ဟီးဘရူးဟိန္ဒီခရိုအေရှန်ဟာအီတီအန်ဟန်ဂေရီအာမေနီအန်အင်ဒိုနီးရှားအစ္ဂဘိုစီ" + + "ချွမ် ရီအိုင်စ်လန္ဒီအီတလီအီနုခ်တီတုဂျပန်ဂျာဗားနီးစ်ဂျော်ဂျီယန်ကွန်ဂိုခ" + + "ီခူယူခါဇါခ်ခလာအ်လီဆပ်ခမာကန္နာဒါကိုးရီးယားကက်ရှ်မီရီကဒ်ခိုနီရှ်ခရူဂစ်လက" + + "်တင်လူဇင်ဘတ်က်ဂန်ဒီလင်ဂါလာလာအိုလစ္သူအာနီယံလူဘာ-ခါတန်ဂါလက္ဘီအံအာလာဂါစီမ" + + "ောင်းရီ (နယူးဇီလန်ကျွန်းရှိ ပင်ရင်းတိုင်းရင်းသားလူမျိုး)မာစီဒိုနီယံမလေ" + + "းရာလမ်မွန်ဂိုလီးယန်းမာရသီမလေးမောလ္တီစ်ဗမာတောင်ဒီဘီလီနီပါလီဒတ်ချ်နော်ဝေ" + + "း နီးနော်စ်ခ်ဘွတ်မော်လ်အိုရိုမိုအိုရီရာပန်ချာပီပါဠိပိုလန်ပါရှ်တိုပေါ်တ" + + "ူဂီခက်ချ်ဝါရောမရွန်ဒီရိုမေနီယားရုရှကင်ရာဝန်ဒါသင်္သကရိုက်စင်ဒီတောင်ဆာမိ" + + "ဆမ်ဂိုဆင်ဟာလစလိုဗက်စလိုဗေးနီးယမ်းရှိနာဆိုမာလီအယ်လ်ဘေးနီးယန်းဆားဗီးယန်း" + + "ဆွီဒင်ဆြာဟီလီတမီးလ်တီလီဂုတာဂျစ်ထိုင်းတီဂ်ရင်ရာတခ္မင်တွန်ဂါတာကစ်တတာဝီဂါ" + + "ယူကရိန်းအော်ဒူဦးဇ်ဘက်ဗီယက်နမ်ဝူလိုဖ်ဇိုစာရိုရုဘာတရုတ်ဇူလူအာဂ်ဟိန်းအင်္" + + "ဂလိပ်စာဟောင်းမာပုချီအာစုဘာလီဘာဆာဘိန်ဘာဘီနာအနောက်ပိုင်းဘဲလိုချီဗိုဒိုချ" + + "ီဂါချာရိုကီဆိုရာနီ ကူဒစ်ရှ်ဒါကိုတာတိုင်တာဒီလာဝဲဇာမာအောက်ဆိုဘီအမ်ဒူအလာအ" + + "လယ်ပိုင်း ဒတ်ချ်ဂျိုလာ-ဖွန်ရီအမ်ဘူရှေးဟောင်း အီဂျစ်အလယ်ပိုင်း အင်္ဂလိပ" + + "်ဖိလစ်ပီနိုအလယ်ပိုင်းပြင်သစ်ပြင်သစ်ဟောင်းမြောက်ပိုင်း ဖရီစီရန်အရှေ့ပို" + + "င်း ဖရီစီရန်ဂါဂါဇ်အလယ်ပိုင်းအမြင့်ဂျာမန်ရှေးဟောင်း ဂရိဆွစ် ဂျာမန်ဂူစီး" + + "ဟာဝေယံအပေါ်ဆိုဘီအမ်ဂွမ်ဘာမချာမီဂျူဒီယို-ပါရှန်ဂျူဒီယို-အာရေဗျခဘိုင်လ်က" + + "ချင်ခမ်ဘာမာခွန်ဒီခဘူဗာဒီအာနူခါစီခိုရာ ချီအီနီခါလိမ်ဂျင်ကိုမီ-ပါမြက်ကွန" + + "်ကနီရှန်ဘာလာဘာဖီအာလန်ဂီလာကိုတာမြောက်လူရီလူအိုလူရီအာမာဆိုင်မီရုမိုရှီစ်" + + "ယန်းအလယ်ပိုင်း အိုင်းရစ်မာခူဝါ-မီအီတိုမီတာမန်ချူးမိုဟော့ခ်မန်ဒန်းအကြိမ" + + "်များစွာ ဘာသာစကားများမာဇန်ဒါရန်နီနာမာအနိမ့် ဂျာမန်ဝါဆီအိုနကိုနူအာယန်ကိ" + + "ုလီပါရှန် အဟောင်းခီခ်အီချီရွမ်ဘိုဝါဆန်ဘူရုဆန်ဂုစကော့စီနာခိုရာဘိုရို ဆမ" + + "်နီအိုင်းရစ် ဟောင်းတာချယ်လ်ဟစ်ရှမ်းတောင်ပိုင်း ဆာမိလူလီ ဆာမိအီနာရီ ဆာမ" + + "ိခိုလ် ဆာမိခွန်ဂို စွာဟီလီတီဆိုတာဆာဝါခ်အလယ်အက်တ်လက်စ် တာမာဇိုက်မူလရင်း" + + "မြစ်ဗိုင်ဗန်ဂျိုဝေါလ်ပါရီဆိုဂါမိုရိုကန် တွမ်မဇိုတ် စံဘာသာစကား နှင့် ပတ" + + "်သက် သောအရာမရှိအရေဗီ(ပုံမှန်)ဩစတြီးယ ဂျာမန်ဆွစ် အမြင့် ဂျာမန်ဩစတြေးလျှ" + + " အင်္ဂလိပ်ကနေဒါ အင်္ဂလိပ်ဗြိတိသျှ အင်္ဂလိပ်အမေရိကန် အင်္ဂလိပ်လက်တင်အမေရိ" + + "က စပိန်စပိန်(ဥရောပ)ကနေဒါ ပြင်သစ်ဆွစ် ပြင်သစ်ဖလီမစ်ရှ်ဘရာဇီး ပေါ်တူဂီဥရ" + + "ောပ ပေါ်တူဂီရိုးရှင်းသော တရုတ်ရှေးရိုးစဉ်လာ တရုတ်" + +var myLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x001e, 0x001e, 0x003f, 0x0051, 0x006f, 0x006f, + 0x0081, 0x0099, 0x0099, 0x0099, 0x00cf, 0x00ed, 0x00ff, 0x0120, + 0x0120, 0x0135, 0x014d, 0x015c, 0x0171, 0x0195, 0x01aa, 0x01c2, + 0x01c2, 0x01da, 0x01e6, 0x01f2, 0x01f2, 0x020d, 0x0216, 0x022e, + 0x0240, 0x0240, 0x0252, 0x0258, 0x0261, 0x027c, 0x029d, 0x02ac, + 0x02dc, 0x02f1, 0x0303, 0x0303, 0x031e, 0x032d, 0x0348, 0x035d, + 0x039a, 0x03b5, 0x03b5, 0x03cd, 0x03e5, 0x03fd, 0x040f, 0x041e, + 0x0433, 0x0445, 0x0445, 0x0463, 0x047e, 0x0493, 0x04ae, 0x04ae, + // Entry 40 - 7F + 0x04ae, 0x04d5, 0x04d5, 0x04ea, 0x0506, 0x0506, 0x0506, 0x052a, + 0x0539, 0x0557, 0x0566, 0x0587, 0x05a8, 0x05bd, 0x05cf, 0x05cf, + 0x05e1, 0x05ff, 0x0608, 0x061d, 0x063b, 0x063b, 0x0659, 0x0662, + 0x0662, 0x067a, 0x068c, 0x069e, 0x06bc, 0x06cb, 0x06cb, 0x06e0, + 0x06ef, 0x0710, 0x0732, 0x0747, 0x075f, 0x075f, 0x0802, 0x0823, + 0x083e, 0x0868, 0x0877, 0x0883, 0x089e, 0x08a7, 0x08a7, 0x08c8, + 0x08da, 0x08da, 0x08ec, 0x0923, 0x0941, 0x0941, 0x0941, 0x0941, + 0x0941, 0x0941, 0x095c, 0x0971, 0x0971, 0x0989, 0x0995, 0x09a7, + // Entry 80 - BF + 0x09bf, 0x09d7, 0x09ef, 0x09fb, 0x0a0d, 0x0a2b, 0x0a37, 0x0a55, + 0x0a76, 0x0a76, 0x0a85, 0x0aa0, 0x0ab2, 0x0ac4, 0x0ad9, 0x0b03, + 0x0b03, 0x0b12, 0x0b27, 0x0b54, 0x0b72, 0x0b72, 0x0b72, 0x0b72, + 0x0b84, 0x0b99, 0x0bab, 0x0bbd, 0x0bcf, 0x0be1, 0x0bfc, 0x0c0e, + 0x0c0e, 0x0c20, 0x0c2f, 0x0c2f, 0x0c38, 0x0c38, 0x0c44, 0x0c5c, + 0x0c6e, 0x0c83, 0x0c83, 0x0c9b, 0x0c9b, 0x0c9b, 0x0cb0, 0x0cbf, + 0x0cbf, 0x0cd4, 0x0cd4, 0x0ce3, 0x0cef, 0x0cef, 0x0cef, 0x0cef, + 0x0cef, 0x0cef, 0x0cef, 0x0d0a, 0x0d0a, 0x0d0a, 0x0d0a, 0x0d0a, + // Entry C0 - FF + 0x0d0a, 0x0d0a, 0x0d3d, 0x0d3d, 0x0d3d, 0x0d52, 0x0d52, 0x0d52, + 0x0d52, 0x0d52, 0x0d52, 0x0d52, 0x0d5e, 0x0d5e, 0x0d5e, 0x0d5e, + 0x0d5e, 0x0d5e, 0x0d6a, 0x0d6a, 0x0d76, 0x0d76, 0x0d76, 0x0d76, + 0x0d76, 0x0d88, 0x0d88, 0x0d94, 0x0d94, 0x0d94, 0x0dd0, 0x0dd0, + 0x0dd0, 0x0dd0, 0x0dd0, 0x0dd0, 0x0dd0, 0x0dd0, 0x0dd0, 0x0dd0, + 0x0dd0, 0x0de2, 0x0de2, 0x0de2, 0x0de2, 0x0de2, 0x0de2, 0x0de2, + 0x0de2, 0x0de2, 0x0de2, 0x0de2, 0x0de2, 0x0df1, 0x0df1, 0x0df1, + 0x0df1, 0x0df1, 0x0df1, 0x0df1, 0x0df1, 0x0e09, 0x0e09, 0x0e37, + // Entry 100 - 13F + 0x0e37, 0x0e37, 0x0e37, 0x0e37, 0x0e4c, 0x0e4c, 0x0e61, 0x0e73, + 0x0e73, 0x0e73, 0x0e73, 0x0e7f, 0x0e7f, 0x0ea6, 0x0ea6, 0x0eb5, + 0x0ee6, 0x0f0b, 0x0f0b, 0x0f0b, 0x0f1a, 0x0f1a, 0x0f1a, 0x0f4b, + 0x0f4b, 0x0f4b, 0x0f85, 0x0f85, 0x0f85, 0x0f85, 0x0f85, 0x0fa3, + 0x0fa3, 0x0fa3, 0x0fa3, 0x0fd6, 0x0ffd, 0x0ffd, 0x103a, 0x1074, + 0x1074, 0x1074, 0x1086, 0x1086, 0x1086, 0x1086, 0x1086, 0x1086, + 0x1086, 0x1086, 0x10c8, 0x10c8, 0x10c8, 0x10c8, 0x10c8, 0x10c8, + 0x10c8, 0x10f0, 0x110f, 0x110f, 0x110f, 0x111e, 0x111e, 0x111e, + // Entry 140 - 17F + 0x111e, 0x1130, 0x1130, 0x1130, 0x1130, 0x1130, 0x1157, 0x1157, + 0x1157, 0x1157, 0x1157, 0x1157, 0x1157, 0x1157, 0x1157, 0x1157, + 0x1169, 0x117b, 0x11a6, 0x11d1, 0x11d1, 0x11d1, 0x11e9, 0x11f8, + 0x11f8, 0x1207, 0x1207, 0x1207, 0x1207, 0x1207, 0x121f, 0x1240, + 0x1240, 0x1240, 0x1240, 0x124c, 0x124c, 0x1271, 0x1271, 0x1271, + 0x1271, 0x128f, 0x128f, 0x12b1, 0x12c6, 0x12c6, 0x12c6, 0x12c6, + 0x12c6, 0x12c6, 0x12c6, 0x12c6, 0x12de, 0x12f0, 0x12f0, 0x12f0, + 0x12f0, 0x12f0, 0x12ff, 0x12ff, 0x12ff, 0x12ff, 0x12ff, 0x12ff, + // Entry 180 - 1BF + 0x12ff, 0x1314, 0x1314, 0x1314, 0x1314, 0x1332, 0x1332, 0x1332, + 0x1332, 0x1332, 0x1341, 0x1341, 0x1353, 0x1353, 0x1353, 0x1353, + 0x1353, 0x1353, 0x1353, 0x1353, 0x1353, 0x1368, 0x1368, 0x1368, + 0x1368, 0x1368, 0x1374, 0x1398, 0x13d2, 0x13fa, 0x1406, 0x1406, + 0x1406, 0x141b, 0x141b, 0x1436, 0x1436, 0x1436, 0x144b, 0x1497, + 0x1497, 0x1497, 0x1497, 0x1497, 0x1497, 0x1497, 0x14bb, 0x14bb, + 0x14bb, 0x14c7, 0x14ec, 0x14ec, 0x14ec, 0x14ec, 0x14ec, 0x1501, + 0x1501, 0x1501, 0x1501, 0x1501, 0x150d, 0x150d, 0x1519, 0x1519, + // Entry 1C0 - 1FF + 0x1519, 0x1531, 0x1531, 0x1531, 0x1531, 0x1531, 0x1531, 0x1531, + 0x1531, 0x1531, 0x1531, 0x1531, 0x1531, 0x1531, 0x1559, 0x1559, + 0x1559, 0x1559, 0x1559, 0x1559, 0x1559, 0x1559, 0x1574, 0x1574, + 0x1574, 0x1574, 0x1574, 0x1574, 0x1574, 0x1589, 0x1589, 0x1589, + 0x1589, 0x1589, 0x1589, 0x158f, 0x158f, 0x158f, 0x158f, 0x15a4, + 0x15a4, 0x15a4, 0x15a4, 0x15a4, 0x15b3, 0x15b3, 0x15c2, 0x15c2, + 0x15c2, 0x15c2, 0x15ce, 0x15ce, 0x15ce, 0x15ff, 0x162d, 0x162d, + 0x164e, 0x165d, 0x165d, 0x165d, 0x165d, 0x165d, 0x168b, 0x16a4, + // Entry 200 - 23F + 0x16c3, 0x16df, 0x16df, 0x16df, 0x16df, 0x16df, 0x16df, 0x16df, + 0x16df, 0x16df, 0x16df, 0x16df, 0x170a, 0x170a, 0x170a, 0x170a, + 0x170a, 0x170a, 0x1719, 0x1719, 0x1719, 0x1719, 0x1719, 0x1719, + 0x1719, 0x1719, 0x1719, 0x1719, 0x1719, 0x1719, 0x1719, 0x1719, + 0x1719, 0x1719, 0x1719, 0x1719, 0x1719, 0x1719, 0x1731, 0x1731, + 0x1777, 0x1777, 0x1777, 0x1777, 0x1798, 0x17a7, 0x17a7, 0x17a7, + 0x17a7, 0x17a7, 0x17a7, 0x17a7, 0x17bc, 0x17bc, 0x17bc, 0x17bc, + 0x17bc, 0x17d7, 0x17d7, 0x17d7, 0x17d7, 0x17e6, 0x17e6, 0x17e6, + // Entry 240 - 27F + 0x17e6, 0x17e6, 0x17e6, 0x17e6, 0x17e6, 0x17e6, 0x17e6, 0x17e6, + 0x1827, 0x1827, 0x1881, 0x1881, 0x18a7, 0x18a7, 0x18cf, 0x1901, + 0x1938, 0x1963, 0x1997, 0x19cb, 0x19ff, 0x1a1f, 0x1a1f, 0x1a1f, + 0x1a44, 0x1a66, 0x1a66, 0x1a81, 0x1aac, 0x1ad4, 0x1ad4, 0x1ad4, + 0x1b08, 0x1b3f, +} // Size: 1244 bytes + +var neLangStr string = "" + // Size: 12514 bytes + "अफारअब्खाजियालीअवेस्तानअफ्रिकान्सआकानअम्हारिकअरागोनीअरबीआसामीअवारिकऐमारा" + + "अजरबैजानीबास्किरबेलारुसीबुल्गेरियालीबिस्लामबाम्बाराबंगालीतिब्बतीब्रेटन" + + "बोस्नियालीक्याटालनचेचेनचामोर्रोकोर्सिकनक्रीचेकचर्च स्लाभिकचुभासवेल्शडे" + + "निसजर्मनदिबेहीजोङ्खाइवीग्रीकअङ्ग्रेजीएस्पेरान्तोस्पेनीइस्टोनियालीबास्क" + + "फारसीफुलाहफिनिसफिजियालीफारोजफ्रान्सेलीफ्रिजीयनआयरिसस्कटिस गाएलिकगलिसिय" + + "ालीगुवारानीगुजरातीमान्क्सहाउसाहिब्रुहिन्दीहिरी मोटुक्रोयसियालीहैटियाली" + + "हङ्गेरियालीआर्मेनियालीहेरेरोइन्टर्लिङ्गुआइन्डोनेसियालीइन्टरलिङ्ग्वेइग्" + + "बोसिचुआन यिइनुपिआक्इडोआइसल्यान्डियालीइटालेलीइनुक्टिटुटजापानीजाभानीजर्ज" + + "ियालीकोङ्गोकिकुयुकुआन्यामाकाजाखकालालिसुटखमेरकन्नाडाकोरियालीकानुरीकास्म" + + "िरीकुर्दीकोमीकोर्निसकिर्गिजल्याटिनलक्जेम्बर्गीगान्डालिम्बुर्गीलिङ्गाला" + + "लाओलिथुआनियालीलुबा-काताङ्गालात्भियालीमलागासीमार्सालीमाओरीम्यासेडोनियाल" + + "ीमलयालममङ्गोलियालीमराठीमलायमाल्टिजबर्मेलीनाउरूउत्तरी न्डेबेलेनेपालीन्द" + + "ोन्गाडचनर्वेली नाइनोर्स्कनर्वेली बोकमालनाभाजोन्यान्जाअक्सिटनओजिब्वाओरो" + + "मोउडियाअोस्सेटिकपंजाबीपालीपोलिसपास्तोपोर्तुगीक्वेचुवारोमानिसरुन्डीरोमा" + + "नियालीरूसीकिन्यारवान्डासंस्कृतसिन्धीउत्तरी सामीसाङ्गोसिन्हालीस्लोभाकिय" + + "ालीस्लोभेनियालीशोनासोमालीअल्बानियालीसर्बियालीस्वातीस्विडिसस्वाहिलीतामि" + + "लतेलुगुताजिकथाईतिग्रीन्याटर्कमेनटोङ्गनटर्किशतातारउइघुरयुक्रेनीउर्दुउज्" + + "बेकीभियतनामीवुलुफखोसायिद्दिसयोरूवाचिनियाँजुलुअचाइनिजअकोलीअदाङमेअदिघेअफ" + + "्रिहिलीआघेमअइनुअक्कादियालीअलाबामाअलेउटघेग अल्बानियालीपुरातन अङ्ग्रेजीअ" + + "ङ्गिकाअरामाइकमापुचेअराओनाअरापाहोअल्जेरियाली अरबीअरावाकमोरोक्कोली अरबीइ" + + "जिप्ट अरबीआसुअमेरिकी साङ्केतिक भाषाअस्टुरियालीकोटावाअवधीबालुचीबालीबाभा" + + "रियालीबासाबामुनबाताक तोबाघोमालाबेजाबेम्बाबेटावीबेनाबाफुटबडागापश्चिम बा" + + "लोचीभोजपुरीबिकोलबिनीबन्जारकोमविष्णुप्रियाबाख्तिआरीब्रजब्राहुइबोडोअकुजब" + + "ुरिआतबुगिनियालीबुलुब्लिनमेडुम्बाकाड्डोक्यारिबकायुगाअट्सामसेबुआनोचिगाचि" + + "ब्चाचागाटाईचुकेसेमारीचिनुक जार्गनचोक्टावचिपेव्यानचेरोकीचेयेन्नेकेन्द्र" + + "ीय कुर्दीकोप्टिककापिज्नोनक्रिमियाली तुर्ककासुवियनडाकोटादार्ग्वाताइतादे" + + "लावरदोग्रिबदिन्काजर्माडोगरीतल्लो सोर्बियनकेन्द्रीय दुसुनदुवालामध्य डचज" + + "ोला-फोनिलद्युलादाजागाएम्बुएफिकएमिलियालीपुरातन इजिप्टीएकाजुकएलामाइटमध्य" + + " अङ्ग्रेजीकेन्द्रीय युपिकइवोन्डोएक्सट्रेमादुरालीफाङफिलिपिनीफोनकाहुन फ्रा" + + "न्सेलीमध्य फ्रान्सेलीपुरातन फ्रान्सेलीअर्पितानउत्तरी फ्रिजीपूर्वी फ्रि" + + "सियालीफ्रिउलियालीगागगाउजगान चिनियाँगायोग्बायागिजगिल्बर्टीगिलाकीमध्य उच" + + "्च जर्मनपुरातन उच्च जर्मनगोवा कोन्कानीगोन्डीगोरोन्टालोगोथिकग्रेबोपुरात" + + "न ग्रिकस्वीस जर्मनफ्राफ्रागुसीगुइचिनहाइदाहक्का चिनियाँहवाइयनफिजी हिन्द" + + "ीहिलिगायनोनहिट्टिटेहमोङमाथिल्लो सोर्बियनहुपाइबानइबिबियोइयोकोइन्गसइन्ग्" + + "रियालीजमैकाली क्रेओले अङ्ग्रेजीलोज्बानन्गोम्बामाचामेजुडियो-फारसीजुडियो" + + "-अरबीजुटिसकारा-काल्पाककाबिलकाचिनज्जुकाम्बाकावीकाबार्दियालीकानेम्बुमाकोन्" + + "डेकाबुभेर्डियानुकेनयाङकोरोकाइनगाङखासीखोटानीकोयरा चिनीखोवारकिर्मान्जकीक" + + "ाकोकालेन्जिनकिम्बुन्डुकोमी-पर्म्याककोन्कानीकोस्रालीक्पेल्लेकाराचाय-बाल" + + "्करक्रिओकिनाराय-एकारेलियालीकुरुखशाम्बालाबाफियाकोलोग्नियालीकुमिककुतेनाइ" + + "लाडिनोलाङ्गीलाहन्डालाम्बालाज्घियालीलिङ्गुवा फ्राङ्का नोभालिगुरियालीलिभ" + + "ोनियालीलाकोतालोम्बार्डमोङ्गोलोजीउत्तरी लुरीलाट्गालीलुबा-लुलुआलुइसेनोलु" + + "न्डालुओमिजोलुइयासाहित्यिक चिनियाँलाजमादुरेसेमाफामगधीमैथिलीमाकासारमान्द" + + "िङोमसाईमाबामोक्षमन्दरमेन्डेमेरूमोरिसेनमध्य आयरिसमाखुवा-मिट्टोमेटामिकमा" + + "कमिनाङकाबाउमान्चुमनिपुरीमोहकमोस्सीमुन्डाङबहुभाषाक्रिकमिरान्डीमाडवारीमे" + + "न्टावाईम्येनेइर्ज्यामजानडेरानीमिन नान चिनियाँनेपोलिटाननामातल्लो जर्मनन" + + "ेवारीनियासनिउएनअओ नागाक्वासियोन्गिएम्बुननोगाइपुरानो नोर्सेनोभियलनकोउत्" + + "तरी सोथोनुएरपरम्परागत नेवारीन्यामवेजीन्यान्कोलन्योरोनजिमाओसागेअटोमन तु" + + "र्कीपाङ्गासिनानपाहलावीपामपाङ्गापापियामेन्तोपालाउवालीपिकार्डपेन्सिलभानि" + + "याली जर्मनपुरातन फारसीपालाटिन जर्मनफोनिसियालीपिएडमोन्तेसेपोन्टिकपुरातन" + + " प्रोभेन्कालकिचेचिम्बोराजो उच्चस्थान किचुआराजस्थानीरोम्बोअरोमानीयालीर्" + + "\u200cवासाम्बुरूसान्तालीन्गामबायसाङ्गुदक्षिणी कुर्दिशसेनाकोयराबोरो सेन्न" + + "ीपुरातन आयरीसटाचेल्हिटचाड अरबीतल्लो सिलेसियालीदक्षिणी सामीलुले सामीइना" + + "री सामीस्कोइट सामीस्रानान टोङ्गोसुकुमासुसूसुमेरियालीकोमोरीकङ्गो स्वाहि" + + "लीपरम्परागत सिरियाकसिरियाकटेसोक्लिङ्गनन्यास टोङ्गामुस्लिम टाटतासावाकके" + + "न्द्रीय एट्लास टामाजिघटअज्ञात भाषाभाइमुख्य-फ्राङ्कोनियालीभुन्जोवार्ल्प" + + "िरीकाल्मिकमिनग्रेलियालीसोगान्हिनगातुकान्टोनियालीब्लिससिम्बोल्समानक मोर" + + "ोक्कोन तामाजिघटभाषिक सामग्री छैनआधुनिक मानक अरबीअस्ट्रियाली जर्मनस्वीस" + + " हाई जर्मनअस्ट्रेलियाली अङ्ग्रेजीक्यानाडेली अङ्ग्रेजीबेलायती अङ्ग्रेजीअम" + + "ेरिकी अङ्ग्रेजील्याटिन अमेरिकी स्पेनीयुरोपेली स्पेनीमेक्सिकन स्पेनीक्य" + + "ानेडाली फ्रान्सेलीतल्लो साक्सनफ्लेमिसब्राजिली पोर्तुगीयुरोपेली पोर्तुग" + + "ीमाल्डाभियनसरलिकृत चिनियाँपरम्परागत चिनियाँ" + +var neLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000c, 0x002d, 0x0045, 0x0063, 0x006f, 0x0087, 0x009c, + 0x00a8, 0x00b7, 0x00c9, 0x00d8, 0x00f3, 0x0108, 0x0120, 0x0144, + 0x0159, 0x0171, 0x0183, 0x0198, 0x01aa, 0x01c8, 0x01e0, 0x01ef, + 0x0207, 0x021f, 0x022b, 0x0234, 0x0256, 0x0265, 0x0274, 0x0283, + 0x0292, 0x02a4, 0x02b6, 0x02bf, 0x02ce, 0x02e9, 0x030a, 0x031c, + 0x033d, 0x034c, 0x035b, 0x036a, 0x0379, 0x0391, 0x03a0, 0x03be, + 0x03d6, 0x03e5, 0x040a, 0x0425, 0x043d, 0x0452, 0x0467, 0x0476, + 0x0488, 0x049a, 0x04b3, 0x04d4, 0x04ec, 0x050d, 0x052e, 0x0540, + // Entry 40 - 7F + 0x0567, 0x058e, 0x05b5, 0x05c4, 0x05dd, 0x05f5, 0x05fe, 0x062b, + 0x0640, 0x065e, 0x0670, 0x0682, 0x069d, 0x06af, 0x06c1, 0x06dc, + 0x06eb, 0x0706, 0x0712, 0x0727, 0x073f, 0x0751, 0x0769, 0x077b, + 0x0787, 0x079c, 0x07b1, 0x07c6, 0x07ea, 0x07fc, 0x081a, 0x0832, + 0x083b, 0x085c, 0x0881, 0x089f, 0x08b4, 0x08cc, 0x08db, 0x0905, + 0x0917, 0x0938, 0x0947, 0x0953, 0x0968, 0x097d, 0x098c, 0x09b7, + 0x09c9, 0x09e1, 0x09e7, 0x0a1b, 0x0a43, 0x0a43, 0x0a55, 0x0a6d, + 0x0a82, 0x0a97, 0x0aa6, 0x0ab5, 0x0ad0, 0x0ae2, 0x0aee, 0x0afd, + // Entry 80 - BF + 0x0b0f, 0x0b27, 0x0b3f, 0x0b54, 0x0b66, 0x0b84, 0x0b90, 0x0bb7, + 0x0bcc, 0x0bcc, 0x0bde, 0x0bfd, 0x0c0f, 0x0c27, 0x0c4b, 0x0c6f, + 0x0c6f, 0x0c7b, 0x0c8d, 0x0cae, 0x0cc9, 0x0cdb, 0x0cdb, 0x0cdb, + 0x0cf0, 0x0d08, 0x0d17, 0x0d29, 0x0d38, 0x0d41, 0x0d5f, 0x0d74, + 0x0d74, 0x0d86, 0x0d98, 0x0d98, 0x0da7, 0x0da7, 0x0db6, 0x0dce, + 0x0ddd, 0x0df2, 0x0df2, 0x0e0a, 0x0e0a, 0x0e0a, 0x0e19, 0x0e25, + 0x0e3a, 0x0e4c, 0x0e4c, 0x0e61, 0x0e6d, 0x0e82, 0x0e91, 0x0ea3, + 0x0eb2, 0x0eb2, 0x0ecd, 0x0ed9, 0x0ee5, 0x0f06, 0x0f1b, 0x0f2a, + // Entry C0 - FF + 0x0f55, 0x0f55, 0x0f83, 0x0f98, 0x0fad, 0x0fbf, 0x0fd1, 0x0fe6, + 0x1014, 0x1026, 0x1051, 0x1070, 0x1079, 0x10b7, 0x10d8, 0x10ea, + 0x10f6, 0x1108, 0x1114, 0x1132, 0x113e, 0x114d, 0x1169, 0x117b, + 0x1187, 0x1199, 0x11ab, 0x11b7, 0x11c6, 0x11d5, 0x11fa, 0x120f, + 0x121e, 0x122a, 0x123c, 0x1245, 0x1245, 0x1269, 0x1284, 0x1290, + 0x12a5, 0x12b1, 0x12bd, 0x12cf, 0x12ed, 0x12f9, 0x1308, 0x1320, + 0x1332, 0x1347, 0x1359, 0x136b, 0x1380, 0x138c, 0x139e, 0x13b3, + 0x13c5, 0x13d1, 0x13f3, 0x1408, 0x1423, 0x1435, 0x144d, 0x147b, + // Entry 100 - 13F + 0x1490, 0x14ab, 0x14d9, 0x14f1, 0x1503, 0x151b, 0x152a, 0x153c, + 0x153c, 0x1551, 0x1563, 0x1572, 0x1581, 0x15a9, 0x15d4, 0x15e6, + 0x15f9, 0x1615, 0x1627, 0x1639, 0x1648, 0x1654, 0x166f, 0x1697, + 0x16a9, 0x16be, 0x16e6, 0x1711, 0x1726, 0x1756, 0x175f, 0x1777, + 0x1777, 0x1780, 0x17ae, 0x17d9, 0x180a, 0x1822, 0x1847, 0x1878, + 0x1899, 0x189f, 0x18ae, 0x18cd, 0x18d9, 0x18eb, 0x18eb, 0x18f4, + 0x190f, 0x1921, 0x194a, 0x1979, 0x199e, 0x19b0, 0x19ce, 0x19dd, + 0x19ef, 0x1a11, 0x1a30, 0x1a30, 0x1a48, 0x1a54, 0x1a66, 0x1a75, + // Entry 140 - 17F + 0x1a9a, 0x1aac, 0x1acb, 0x1ae9, 0x1b01, 0x1b0d, 0x1b3e, 0x1b3e, + 0x1b4a, 0x1b56, 0x1b6b, 0x1b7a, 0x1b89, 0x1baa, 0x1bf1, 0x1c06, + 0x1c1e, 0x1c30, 0x1c52, 0x1c71, 0x1c80, 0x1ca2, 0x1cb1, 0x1cc0, + 0x1ccc, 0x1cde, 0x1cea, 0x1d0e, 0x1d26, 0x1d26, 0x1d3e, 0x1d68, + 0x1d7a, 0x1d86, 0x1d9b, 0x1da7, 0x1db9, 0x1dd5, 0x1de4, 0x1e05, + 0x1e11, 0x1e2c, 0x1e4a, 0x1e6f, 0x1e87, 0x1e9f, 0x1eb7, 0x1edf, + 0x1eee, 0x1f07, 0x1f25, 0x1f34, 0x1f4c, 0x1f5e, 0x1f82, 0x1f91, + 0x1fa6, 0x1fb8, 0x1fca, 0x1fdf, 0x1ff1, 0x200f, 0x204d, 0x206b, + // Entry 180 - 1BF + 0x2089, 0x209b, 0x20b6, 0x20c8, 0x20d4, 0x20f3, 0x210b, 0x2127, + 0x213c, 0x214e, 0x2157, 0x2163, 0x2172, 0x21a3, 0x21ac, 0x21c4, + 0x21d0, 0x21dc, 0x21ee, 0x2203, 0x221b, 0x2227, 0x2233, 0x2242, + 0x2251, 0x2263, 0x226f, 0x2284, 0x22a0, 0x22c5, 0x22d1, 0x22e3, + 0x2301, 0x2313, 0x2328, 0x2334, 0x2346, 0x2346, 0x235b, 0x2370, + 0x237f, 0x2397, 0x23ac, 0x23c7, 0x23d9, 0x23ee, 0x240c, 0x2435, + 0x2450, 0x245c, 0x247b, 0x248d, 0x249c, 0x24ab, 0x24be, 0x24d6, + 0x24f4, 0x2503, 0x2528, 0x253a, 0x2543, 0x2562, 0x256e, 0x259c, + // Entry 1C0 - 1FF + 0x25b7, 0x25d2, 0x25e4, 0x25f3, 0x2602, 0x2624, 0x2645, 0x265a, + 0x2675, 0x2699, 0x26b4, 0x26c9, 0x2706, 0x2706, 0x2728, 0x274d, + 0x276b, 0x278f, 0x27a4, 0x27a4, 0x27a4, 0x27d8, 0x27e4, 0x282e, + 0x2849, 0x2849, 0x2849, 0x2849, 0x2849, 0x285b, 0x285b, 0x285b, + 0x285b, 0x285b, 0x287c, 0x288b, 0x288b, 0x288b, 0x288b, 0x28a3, + 0x28a3, 0x28bb, 0x28bb, 0x28d3, 0x28e5, 0x28e5, 0x28e5, 0x28e5, + 0x2910, 0x2910, 0x291c, 0x291c, 0x291c, 0x294a, 0x296c, 0x296c, + 0x2987, 0x2987, 0x299d, 0x299d, 0x29cb, 0x29cb, 0x29ed, 0x2a06, + // Entry 200 - 23F + 0x2a22, 0x2a41, 0x2a41, 0x2a41, 0x2a69, 0x2a69, 0x2a69, 0x2a69, + 0x2a7b, 0x2a87, 0x2aa5, 0x2ab7, 0x2adf, 0x2b10, 0x2b25, 0x2b25, + 0x2b25, 0x2b25, 0x2b31, 0x2b31, 0x2b31, 0x2b31, 0x2b31, 0x2b31, + 0x2b31, 0x2b49, 0x2b49, 0x2b49, 0x2b49, 0x2b6b, 0x2b6b, 0x2b6b, + 0x2b6b, 0x2b6b, 0x2b6b, 0x2b8a, 0x2b8a, 0x2b8a, 0x2b9f, 0x2b9f, + 0x2be6, 0x2be6, 0x2be6, 0x2be6, 0x2c05, 0x2c0e, 0x2c0e, 0x2c0e, + 0x2c0e, 0x2c48, 0x2c48, 0x2c48, 0x2c5a, 0x2c5a, 0x2c5a, 0x2c5a, + 0x2c5a, 0x2c78, 0x2c78, 0x2c8d, 0x2cb4, 0x2cc0, 0x2cc0, 0x2cc0, + // Entry 240 - 27F + 0x2cc0, 0x2cc0, 0x2cdb, 0x2cff, 0x2cff, 0x2d29, 0x2d29, 0x2d29, + 0x2d6a, 0x2d6a, 0x2d99, 0x2d99, 0x2dc5, 0x2dc5, 0x2df6, 0x2e1f, + 0x2e62, 0x2e9c, 0x2ecd, 0x2efe, 0x2f3c, 0x2f67, 0x2f92, 0x2f92, + 0x2fcf, 0x2fcf, 0x2ff1, 0x3006, 0x3037, 0x3068, 0x3086, 0x3086, + 0x30b1, 0x30e2, +} // Size: 1244 bytes + +var nlLangStr string = "" + // Size: 4999 bytes + "AfarAbchazischAvestischAfrikaansAkanAmhaarsAragoneesArabischAssameesAvar" + + "ischAymaraAzerbeidzjaansBasjkiersWit-RussischBulgaarsBislamaBambaraBenga" + + "alsTibetaansBretonsBosnischCatalaansTsjetsjeensChamorroCorsicaansCreeTsj" + + "echischKerkslavischTsjoevasjischWelshDeensDuitsDivehiDzongkhaEweGrieksEn" + + "gelsEsperantoSpaansEstischBaskischPerzischFulahFinsFijischFaeröersFransF" + + "riesIersSchots-GaelischGalicischGuaraníGujaratiManxHausaHebreeuwsHindiHi" + + "ri MotuKroatischHaïtiaans CreoolsHongaarsArmeensHereroInterlinguaIndones" + + "ischInterlingueIgboYiInupiaqIdoIJslandsItaliaansInuktitutJapansJavaansGe" + + "orgischKongoGikuyuKuanyamaKazachsGroenlandsKhmerKannadaKoreaansKanuriKas" + + "jmiriKoerdischKomiCornishKirgizischLatijnLuxemburgsLugandaLimburgsLingal" + + "aLaotiaansLitouwsLuba-KatangaLetsMalagassischMarshalleesMaoriMacedonisch" + + "MalayalamMongoolsMarathiMaleisMalteesBirmaansNauruaansNoord-NdebeleNepal" + + "eesNdongaNederlandsNoors - NynorskNoors - BokmålZuid-NdbeleNavajoNyanjaO" + + "ccitaansOjibwaAfaan OromoOdiaOssetischPunjabiPaliPoolsPasjtoePortugeesQu" + + "echuaReto-RomaansKirundiRoemeensRussischKinyarwandaSanskrietSardijnsSind" + + "hiNoord-SamischSangoSingaleesSlowaaksSloveensSamoaansShonaSomalischAlban" + + "eesServischSwaziZuid-SothoSoendaneesZweedsSwahiliTamilTeluguTadzjieksTha" + + "iTigrinyaTurkmeensTswanaTongaansTurksTsongaTataarsTahitiaansOeigoersOekr" + + "aïensUrduOezbeeksVendaVietnameesVolapükWaalsWolofXhosaJiddischYorubaZhua" + + "ngChineesZoeloeAtjehsAkoliAdangmeAdygeesTunesisch ArabischAfrihiliAghemA" + + "inuAkkadischAlabamaAleoetischGegischZuid-AltaïschOudengelsAngikaArameesM" + + "apudungunAraonaArapahoAlgerijns ArabischArawakMarokkaans ArabischEgyptis" + + "ch ArabischAsuAmerikaanse GebarentaalAsturischKotavaAwadhiBeloetsjiBalin" + + "eesBeiersBasaBamounBatak TobaGhomala’BejaBembaBetawiBenaBafutBadagaWeste" + + "rs BeloetsjiBhojpuriBikolBiniBanjarKomSiksikaBishnupriyaBakhtiariBrajBra" + + "huiBodoAkooseBoerjatischBugineesBuluBlinMedumbaCaddoCaribischCayugaAtsam" + + "CebuanoChigaChibchaChagataiChuukeesMariChinook JargonChoctawChipewyanChe" + + "rokeeCheyenneSoranîKoptischCapiznonKrim-TataarsKasjoebischDakotaDargwaTa" + + "itaDelawareSlaveyDogribDinkaZarmaDogriNedersorbischDusunDualaMiddelneder" + + "landsJola-FonyiDyulaDazagaEmbuEfikEmilianoOudegyptischEkajukElamitischMi" + + "ddelengelsYupikEwondoExtremeensFangFilipijnsTornedal-FinsFonCajun-FransM" + + "iddelfransOudfransArpitaansNoord-FriesOost-FriesFriulischGaGagaoezischGa" + + "nyuGayoGbayaZoroastrisch DariGe’ezGilberteesGilakiMiddelhoogduitsOudhoog" + + "duitsGoa KonkaniGondiGorontaloGothischGreboOudgrieksZwitserduitsWayuuGur" + + "uneGusiiGwichʼinHaidaHakkaHawaïaansFijisch HindiHiligaynonHettitischHmon" + + "gOppersorbischXiangyuHupaIbanIbibioIlokoIngoesjetischIngrischJamaicaans " + + "CreoolsLojbanNgombaMachameJudeo-PerzischJudeo-ArabischJutlandsKarakalpak" + + "sKabylischKachinJjuKambaKawiKabardischKanembuTyapMakondeKaapverdisch Cre" + + "oolsKenyangKoroKaingangKhasiKhotaneesKoyra ChiiniKhowarKirmanckîKakoKale" + + "njinKimbunduKomi-PermjaaksKonkaniKosraeaansKpelleKaratsjaj-BalkarischKri" + + "oKinaray-aKarelischKurukhShambalaBafiaKölschKoemuksKutenaiLadinoLangiLah" + + "ndaLambaLezgischLingua Franca NovaLigurischLijfsLakotaLombardischMongoLo" + + "ziNoordelijk LuriLetgaalsLuba-LuluaLuisenoLundaLuoMizoLuyiaKlassiek Chin" + + "eesLazischMadoereesMafaMagahiMaithiliMakassaarsMandingoMaaMabaMoksjaMand" + + "arMendeMeruMorisyenMiddeliersMakhuwa-MeettoMeta’Mi’kmaqMinangkabauMantsj" + + "oeMeiteiMohawkMossiWest-MariMundangMeerdere talenCreekMirandeesMarwariMe" + + "ntawaiMyeneErzjaMazanderaniMinnanyuNapolitaansNamaNedersaksischNewariNia" + + "sNiueaansAo NagaNgumbaNgiemboonNogaiOudnoorsNovialN’KoNoord-SothoNuerKla" + + "ssiek NepalbhasaNyamweziNyankoleNyoroNzimaOsageOttomaans-TurksPangasinan" + + "PahlaviPampangaPapiamentsPalausPicardischPennsylvania-DuitsPlautdietschO" + + "udperzischPaltsischFoenicischPiëmonteesPontischPohnpeiaansOudpruisischOu" + + "dprovençaalsK’iche’KichwaRajasthaniRapanuiRarotonganRomagnolRiffijnsRomb" + + "oRomaniRotumaansRoetheensRovianaAroemeensRwaSandaweJakoetsSamaritaans-Ar" + + "ameesSamburuSasakSantaliSaurashtraNgambaySanguSiciliaansSchotsSassareesP" + + "ahlavaniSenecaSenaSeriSelkoepsKoyraboro SenniOudiersSamogitischTashelhiy" + + "tShanTsjadisch ArabischSidamoSilezisch DuitsSelayarZuid-SamischLule-Sami" + + "schInari-SamischSkolt-SamischSoninkeSogdischSranantongoSererSahoSaterfri" + + "esSukumaSoesoeSoemerischShimaoreCongo SwahiliKlassiek SyrischSyrischSile" + + "zischTuluTimneTesoTerenoTetunTigreTivTokelausTsakhurKlingonTlingitTalysh" + + "TamashekNyasa TongaTok PisinTuroyoTarokoTsakonischTsimshianMoslim TatToe" + + "mboekaTuvaluaansTasawaqToevaansTamazight (Centraal-Marokko)OedmoertsOega" + + "ritischUmbunduRootVaiVenetiaansWepsischWest-VlaamsOpperfrankischVotischV" + + "õroVunjoWalserWolayttaWarayWashoWarlpiriWuyuKalmuksMingreelsSogaYaoYape" + + "esYangbenYembaNheengatuKantoneesZapotecBlissymbolenZeeuwsZenagaStandaard" + + " Marokkaanse TamazightZunigeen linguïstische inhoudZazamodern standaard " + + "ArabischOostenrijks DuitsZwitsers HoogduitsAustralisch EngelsCanadees En" + + "gelsBrits EngelsAmerikaans EngelsLatijns-Amerikaans SpaansEuropees Spaan" + + "sMexicaans SpaansCanadees FransZwitsers FransVlaamsBraziliaans Portugees" + + "Europees PortugeesServo-Kroatischvereenvoudigd Chineestraditioneel Chine" + + "es" + +var nlLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000e, 0x0017, 0x0020, 0x0024, 0x002b, 0x0034, + 0x003c, 0x0044, 0x004c, 0x0052, 0x0060, 0x0069, 0x0075, 0x007d, + 0x0084, 0x008b, 0x0093, 0x009c, 0x00a3, 0x00ab, 0x00b4, 0x00bf, + 0x00c7, 0x00d1, 0x00d5, 0x00df, 0x00eb, 0x00f8, 0x00fd, 0x0102, + 0x0107, 0x010d, 0x0115, 0x0118, 0x011e, 0x0124, 0x012d, 0x0133, + 0x013a, 0x0142, 0x014a, 0x014f, 0x0153, 0x015a, 0x0163, 0x0168, + 0x016d, 0x0171, 0x0180, 0x0189, 0x0191, 0x0199, 0x019d, 0x01a2, + 0x01ab, 0x01b0, 0x01b9, 0x01c2, 0x01d4, 0x01dc, 0x01e3, 0x01e9, + // Entry 40 - 7F + 0x01f4, 0x01ff, 0x020a, 0x020e, 0x0210, 0x0217, 0x021a, 0x0222, + 0x022b, 0x0234, 0x023a, 0x0241, 0x024a, 0x024f, 0x0255, 0x025d, + 0x0264, 0x026e, 0x0273, 0x027a, 0x0282, 0x0288, 0x0290, 0x0299, + 0x029d, 0x02a4, 0x02ae, 0x02b4, 0x02be, 0x02c5, 0x02cd, 0x02d4, + 0x02dd, 0x02e4, 0x02f0, 0x02f4, 0x0300, 0x030b, 0x0310, 0x031b, + 0x0324, 0x032c, 0x0333, 0x0339, 0x0340, 0x0348, 0x0351, 0x035e, + 0x0366, 0x036c, 0x0376, 0x0385, 0x0394, 0x039f, 0x03a5, 0x03ab, + 0x03b4, 0x03ba, 0x03c5, 0x03c9, 0x03d2, 0x03d9, 0x03dd, 0x03e2, + // Entry 80 - BF + 0x03e9, 0x03f2, 0x03f9, 0x0405, 0x040c, 0x0414, 0x041c, 0x0427, + 0x0430, 0x0438, 0x043e, 0x044b, 0x0450, 0x0459, 0x0461, 0x0469, + 0x0471, 0x0476, 0x047f, 0x0487, 0x048f, 0x0494, 0x049e, 0x04a8, + 0x04ae, 0x04b5, 0x04ba, 0x04c0, 0x04c9, 0x04cd, 0x04d5, 0x04de, + 0x04e4, 0x04ec, 0x04f1, 0x04f7, 0x04fe, 0x0508, 0x0510, 0x051a, + 0x051e, 0x0526, 0x052b, 0x0535, 0x053d, 0x0542, 0x0547, 0x054c, + 0x0554, 0x055a, 0x0560, 0x0567, 0x056d, 0x0573, 0x0578, 0x057f, + 0x0586, 0x0598, 0x05a0, 0x05a5, 0x05a9, 0x05b2, 0x05b9, 0x05c3, + // Entry C0 - FF + 0x05ca, 0x05d8, 0x05e1, 0x05e7, 0x05ee, 0x05f8, 0x05fe, 0x0605, + 0x0617, 0x061d, 0x0630, 0x0642, 0x0645, 0x065c, 0x0665, 0x066b, + 0x0671, 0x067a, 0x0682, 0x0688, 0x068c, 0x0692, 0x069c, 0x06a6, + 0x06aa, 0x06af, 0x06b5, 0x06b9, 0x06be, 0x06c4, 0x06d5, 0x06dd, + 0x06e2, 0x06e6, 0x06ec, 0x06ef, 0x06f6, 0x0701, 0x070a, 0x070e, + 0x0714, 0x0718, 0x071e, 0x0729, 0x0731, 0x0735, 0x0739, 0x0740, + 0x0745, 0x074e, 0x0754, 0x0759, 0x0760, 0x0765, 0x076c, 0x0774, + 0x077c, 0x0780, 0x078e, 0x0795, 0x079e, 0x07a6, 0x07ae, 0x07b5, + // Entry 100 - 13F + 0x07bd, 0x07c5, 0x07d1, 0x07dc, 0x07e2, 0x07e8, 0x07ed, 0x07f5, + 0x07fb, 0x0801, 0x0806, 0x080b, 0x0810, 0x081d, 0x0822, 0x0827, + 0x0837, 0x0841, 0x0846, 0x084c, 0x0850, 0x0854, 0x085c, 0x0868, + 0x086e, 0x0878, 0x0884, 0x0889, 0x088f, 0x0899, 0x089d, 0x08a6, + 0x08b3, 0x08b6, 0x08c1, 0x08cc, 0x08d4, 0x08dd, 0x08e8, 0x08f2, + 0x08fb, 0x08fd, 0x0908, 0x090d, 0x0911, 0x0916, 0x0927, 0x092e, + 0x0938, 0x093e, 0x094d, 0x0959, 0x0964, 0x0969, 0x0972, 0x097a, + 0x097f, 0x0988, 0x0994, 0x0999, 0x099f, 0x09a4, 0x09ad, 0x09b2, + // Entry 140 - 17F + 0x09b7, 0x09c1, 0x09ce, 0x09d8, 0x09e2, 0x09e7, 0x09f4, 0x09fb, + 0x09ff, 0x0a03, 0x0a09, 0x0a0e, 0x0a1b, 0x0a23, 0x0a35, 0x0a3b, + 0x0a41, 0x0a48, 0x0a56, 0x0a64, 0x0a6c, 0x0a77, 0x0a80, 0x0a86, + 0x0a89, 0x0a8e, 0x0a92, 0x0a9c, 0x0aa3, 0x0aa7, 0x0aae, 0x0ac2, + 0x0ac9, 0x0acd, 0x0ad5, 0x0ada, 0x0ae3, 0x0aef, 0x0af5, 0x0aff, + 0x0b03, 0x0b0b, 0x0b13, 0x0b21, 0x0b28, 0x0b32, 0x0b38, 0x0b4c, + 0x0b50, 0x0b59, 0x0b62, 0x0b68, 0x0b70, 0x0b75, 0x0b7c, 0x0b83, + 0x0b8a, 0x0b90, 0x0b95, 0x0b9b, 0x0ba0, 0x0ba8, 0x0bba, 0x0bc3, + // Entry 180 - 1BF + 0x0bc8, 0x0bce, 0x0bd9, 0x0bde, 0x0be2, 0x0bf1, 0x0bf9, 0x0c03, + 0x0c0a, 0x0c0f, 0x0c12, 0x0c16, 0x0c1b, 0x0c2b, 0x0c32, 0x0c3b, + 0x0c3f, 0x0c45, 0x0c4d, 0x0c57, 0x0c5f, 0x0c62, 0x0c66, 0x0c6c, + 0x0c72, 0x0c77, 0x0c7b, 0x0c83, 0x0c8d, 0x0c9b, 0x0ca2, 0x0cab, + 0x0cb6, 0x0cbe, 0x0cc4, 0x0cca, 0x0ccf, 0x0cd8, 0x0cdf, 0x0ced, + 0x0cf2, 0x0cfb, 0x0d02, 0x0d0a, 0x0d0f, 0x0d14, 0x0d1f, 0x0d27, + 0x0d32, 0x0d36, 0x0d43, 0x0d49, 0x0d4d, 0x0d55, 0x0d5c, 0x0d62, + 0x0d6b, 0x0d70, 0x0d78, 0x0d7e, 0x0d84, 0x0d8f, 0x0d93, 0x0da6, + // Entry 1C0 - 1FF + 0x0dae, 0x0db6, 0x0dbb, 0x0dc0, 0x0dc5, 0x0dd4, 0x0dde, 0x0de5, + 0x0ded, 0x0df7, 0x0dfd, 0x0e07, 0x0e19, 0x0e25, 0x0e30, 0x0e39, + 0x0e43, 0x0e4e, 0x0e56, 0x0e61, 0x0e6d, 0x0e7c, 0x0e87, 0x0e8d, + 0x0e97, 0x0e9e, 0x0ea8, 0x0eb0, 0x0eb8, 0x0ebd, 0x0ec3, 0x0ecc, + 0x0ed5, 0x0edc, 0x0ee5, 0x0ee8, 0x0eef, 0x0ef6, 0x0f09, 0x0f10, + 0x0f15, 0x0f1c, 0x0f26, 0x0f2d, 0x0f32, 0x0f3c, 0x0f42, 0x0f4b, + 0x0f54, 0x0f5a, 0x0f5e, 0x0f62, 0x0f6a, 0x0f79, 0x0f80, 0x0f8b, + 0x0f95, 0x0f99, 0x0fab, 0x0fb1, 0x0fc0, 0x0fc7, 0x0fd3, 0x0fdf, + // Entry 200 - 23F + 0x0fec, 0x0ff9, 0x1000, 0x1008, 0x1013, 0x1018, 0x101c, 0x1026, + 0x102c, 0x1032, 0x103c, 0x1044, 0x1051, 0x1061, 0x1068, 0x1071, + 0x1075, 0x107a, 0x107e, 0x1084, 0x1089, 0x108e, 0x1091, 0x1099, + 0x10a0, 0x10a7, 0x10ae, 0x10b4, 0x10bc, 0x10c7, 0x10d0, 0x10d6, + 0x10dc, 0x10e6, 0x10ef, 0x10f9, 0x1102, 0x110c, 0x1113, 0x111b, + 0x1137, 0x1140, 0x114b, 0x1152, 0x1156, 0x1159, 0x1163, 0x116b, + 0x1176, 0x1184, 0x118b, 0x1190, 0x1195, 0x119b, 0x11a3, 0x11a8, + 0x11ad, 0x11b5, 0x11b9, 0x11c0, 0x11c9, 0x11cd, 0x11d0, 0x11d6, + // Entry 240 - 27F + 0x11dd, 0x11e2, 0x11eb, 0x11f4, 0x11fb, 0x1207, 0x120d, 0x1213, + 0x1232, 0x1236, 0x1250, 0x1254, 0x126d, 0x126d, 0x127e, 0x1290, + 0x12a2, 0x12b1, 0x12bd, 0x12ce, 0x12e7, 0x12f6, 0x1306, 0x1306, + 0x1314, 0x1322, 0x1322, 0x1328, 0x133d, 0x134f, 0x134f, 0x135e, + 0x1373, 0x1387, +} // Size: 1244 bytes + +var noLangStr string = "" + // Size: 4987 bytes + "afarabkhasiskavestiskafrikaansakanamhariskaragonskarabiskassamiskavarisk" + + "aymaraaserbajdsjanskbasjkirskhviterussiskbulgarskbislamabambarabengaliti" + + "betanskbretonskbosniskkatalansktsjetsjenskchamorrokorsikanskcreetsjekkis" + + "kkirkeslavisktsjuvasjiskwalisiskdansktyskdivehidzongkhaewegreskengelskes" + + "perantospanskestiskbaskiskpersiskfulanifinskfijianskfærøyskfranskvestfri" + + "siskirskskotsk gæliskgalisiskguaranigujaratimanskhausahebraiskhindihiri " + + "motukroatiskhaitiskungarskarmenskhererointerlinguaindonesiskinterlinguei" + + "bosichuan-yiinupiakidoislandskitalienskinuktitutjapanskjavanesiskgeorgis" + + "kkikongokikuyukuanyamakasakhiskgrønlandskkhmerkannadakoreanskkanurikasjm" + + "irikurdiskkomikorniskkirgisisklatinluxemburgskgandalimburgisklingalalaot" + + "isklitauiskluba-katangalatviskgassiskmarshallesiskmaorimakedonskmalayala" + + "mmongolskmarathimalayiskmaltesiskburmesisknaurunord-ndebelenepalindongan" + + "ederlandsknorsk nynorsknorsk bokmålsør-ndebelenavajonyanjaoksitanskojibw" + + "aoromooriyaossetiskpunjabipalipolskpashtoportugisiskquechuaretoromanskru" + + "ndirumenskrussiskkinyarwandasanskritsardinsksindhinordsamisksangosingale" + + "siskslovakiskslovensksamoanskshonasomalialbanskserbiskswatisør-sothosund" + + "anesisksvenskswahilitamiltelugutadsjikiskthaitigrinjaturkmensksetswanato" + + "ngansktyrkisktsongatatarisktahitiskuiguriskukrainskurduusbekiskvendaviet" + + "namesiskvolapykvallonskwolofxhosajiddiskjorubazhuangkinesiskzuluachinesi" + + "skacoliadangmeadyghetunisisk-arabiskafrihiliaghemainuakkadiskalabamaaleu" + + "tiskgegisk-albansksøraltaiskgammelengelskangikaarameiskaraukanskaraonaar" + + "apahoalgerisk arabiskarawakmarokkansk-arabiskegyptisk arabiskasuamerikan" + + "sk tegnspråkasturiskkotavaawadhibaluchibalinesiskbairiskbasabamunbatak t" + + "obaghomalabejabembabetawibenabafutbadagavestbalutsjibhojpuribikolbiniban" + + "jarkomsiksikabishnupriyabakhtiaribrajbrahuibodoakoseburiatbuginesiskbulu" + + "blinmedumbacaddokaribiskcayugaatsamcebuanskkigachibchachagataichuukesisk" + + "marichinookchoctawchipewianskcherokesiskcheyennekurdisk (sorani)koptiskk" + + "apizkrimtatariskkasjubiskdakotadargwataitadelawareslaviskdogribdinkazarm" + + "adogrilavsorbisksentraldusundualamellomnederlandskjola-fonyidyuladazagak" + + "iembuefikemilianskgammelegyptiskekajukelamittiskmellomengelsksentralyupi" + + "kewondoekstremaduranskfangfilippinsktornedalsfinskfonkajunfranskmellomfr" + + "anskgammelfranskarpitansknordfrisiskøstfrisiskfriulianskgagagausiskganga" + + "yogbayazoroastrisk darigeskiribatiskgilekimellomhøytyskgammelhøytyskgoan" + + "sk konkanigondigorontalogotiskgrebogammelgresksveitsertyskwayuufrafragus" + + "iigwichinhaidahakkahawaiiskfijiansk hindihiligaynonhettittiskhmonghøysor" + + "biskxianghupaibanibibioilokoingusjiskingriskjamaicansk kreolengelsklojba" + + "nngombamachamejødepersiskjødearabiskjyskkarakalpakiskkabylskkachinjjukam" + + "bakawikabardiskkanembutyapmakondekappverdiskkenyangkorokaingangkhasikhot" + + "anesiskkoyra chiinikhowarkirmanckikakokalenjinkimbundukomipermjakiskkonk" + + "anikosraeanskkpellekarachay-balkarkriokinaray-akarelskkurukhshambalabafi" + + "akølnskkumykkutenailadinsklangilahndalambalezghianlingua franca novaligu" + + "risklivisklakotalombardiskmongolozinord-lurilatgalliskluba-lulualuisenol" + + "undaluomizoluhyaklassisk kinesisklaziskmaduresiskmafamagahimaithilimakas" + + "armandingomasaimabamokshamandarmendemerumauritisk-kreolskmellomirskmakhu" + + "wa-meettometa’micmacminangkabaumandsjumanipurimohawkmossivestmariskmunda" + + "ngflere språkcreekmirandesiskmarwarimentawaimyeneerzyamazandaraniminnann" + + "apolitansknamanedertysknewariniasniueanskao nagakwasiongiemboonnogaigamm" + + "elnorsknovialnʼkonord-sothonuerklassisk newarinyamwezinyankolenyoronzima" + + "osageottomansk tyrkiskpangasinanpahlavipampangapapiamentopalauiskpikardi" + + "skpennsylvaniatyskplautdietschgammelpersiskpalatintyskfønikiskpiemontesi" + + "skpontiskponapiskprøyssiskgammelprovençalskquichékichwa (Chimborazo-høyl" + + "andet)rajasthanirapanuirarotonganskromagnolskriffromboromanirotumanskrus" + + "inskrovianaaromanskrwasandawejakutsksamaritansk arameisksamburusasaksant" + + "alisaurashtrangambaysangusicilianskskotsksassarisk sardinsksørkurdisksen" + + "ecasenaseriselkupiskkoyraboro sennigammelirsksamogitisktachelhitshanTsja" + + "d-arabisksidamolavschlesiskselayarsørsamisklulesamiskenaresamiskskoltesa" + + "misksoninkesogdisksranan tongoserersahosaterfrisisksukumasususumeriskkom" + + "oriskkongolesisk swahiliklassisk syrisksyriskschlesisktulutemnetesoteren" + + "otetumtigrétivtokelautsakhurskklingontlingittalyshtamasjeknyasa-tongansk" + + "tok pisinturoyotarokotsakonisktsimshianmuslimsk tattumbukatuvalutasawaqt" + + "uvinisksentralmarokkansk tamazightudmurtugaritiskumbundurotvaivenetiansk" + + "vepsiskvestflamskMain-frankiskvotisksørestiskvunjowalserwalamowaraywasho" + + "warlpiriwukalmykmingrelsksogayaoyapesiskyangbenyembanheengatukantonesisk" + + "zapotecblissymbolerzeeuwszenagastandard marrokansk tamazightzuniuten spr" + + "åklig innholdzazamoderne standard arabiskøsterriksk tysksveitsisk høyty" + + "skaustralsk engelskcanadisk engelskbritisk engelskamerikansk engelsklati" + + "namerikansk spanskeuropeisk spanskmeksikansk spanskcanadisk fransksveits" + + "isk fransknedersaksiskflamskbrasiliansk portugisiskeuropeisk portugisisk" + + "moldovskserbokroatiskforenklet kinesisktradisjonell kinesisk" + +var noLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000d, 0x0015, 0x001e, 0x0022, 0x002a, 0x0032, + 0x0039, 0x0041, 0x0048, 0x004e, 0x005c, 0x0065, 0x0071, 0x0079, + 0x0080, 0x0087, 0x008e, 0x0097, 0x009f, 0x00a6, 0x00af, 0x00ba, + 0x00c2, 0x00cc, 0x00d0, 0x00d9, 0x00e5, 0x00f0, 0x00f8, 0x00fd, + 0x0101, 0x0107, 0x010f, 0x0112, 0x0117, 0x011e, 0x0127, 0x012d, + 0x0133, 0x013a, 0x0141, 0x0147, 0x014c, 0x0154, 0x015d, 0x0163, + 0x016e, 0x0172, 0x0180, 0x0188, 0x018f, 0x0197, 0x019c, 0x01a1, + 0x01a9, 0x01ae, 0x01b7, 0x01bf, 0x01c6, 0x01cd, 0x01d4, 0x01da, + // Entry 40 - 7F + 0x01e5, 0x01ef, 0x01fa, 0x01fd, 0x0207, 0x020e, 0x0211, 0x0219, + 0x0222, 0x022b, 0x0232, 0x023c, 0x0244, 0x024b, 0x0251, 0x0259, + 0x0262, 0x026d, 0x0272, 0x0279, 0x0281, 0x0287, 0x028f, 0x0296, + 0x029a, 0x02a1, 0x02aa, 0x02af, 0x02ba, 0x02bf, 0x02c9, 0x02d0, + 0x02d7, 0x02df, 0x02eb, 0x02f2, 0x02f9, 0x0306, 0x030b, 0x0314, + 0x031d, 0x0325, 0x032c, 0x0334, 0x033d, 0x0346, 0x034b, 0x0357, + 0x035d, 0x0363, 0x036e, 0x037b, 0x0388, 0x0394, 0x039a, 0x03a0, + 0x03a9, 0x03af, 0x03b4, 0x03b9, 0x03c1, 0x03c8, 0x03cc, 0x03d1, + // Entry 80 - BF + 0x03d7, 0x03e2, 0x03e9, 0x03f4, 0x03f9, 0x0400, 0x0407, 0x0412, + 0x041a, 0x0422, 0x0428, 0x0432, 0x0437, 0x0442, 0x044b, 0x0453, + 0x045b, 0x0460, 0x0466, 0x046d, 0x0474, 0x0479, 0x0483, 0x048e, + 0x0494, 0x049b, 0x04a0, 0x04a6, 0x04b0, 0x04b4, 0x04bc, 0x04c5, + 0x04cd, 0x04d5, 0x04dc, 0x04e2, 0x04ea, 0x04f2, 0x04fa, 0x0502, + 0x0506, 0x050e, 0x0513, 0x051f, 0x0526, 0x052e, 0x0533, 0x0538, + 0x053f, 0x0545, 0x054b, 0x0553, 0x0557, 0x0561, 0x0566, 0x056d, + 0x0573, 0x0583, 0x058b, 0x0590, 0x0594, 0x059c, 0x05a3, 0x05ab, + // Entry C0 - FF + 0x05b9, 0x05c4, 0x05d1, 0x05d7, 0x05df, 0x05e8, 0x05ee, 0x05f5, + 0x0605, 0x060b, 0x061d, 0x062d, 0x0630, 0x0645, 0x064d, 0x0653, + 0x0659, 0x0660, 0x066a, 0x0671, 0x0675, 0x067a, 0x0684, 0x068b, + 0x068f, 0x0694, 0x069a, 0x069e, 0x06a3, 0x06a9, 0x06b5, 0x06bd, + 0x06c2, 0x06c6, 0x06cc, 0x06cf, 0x06d6, 0x06e1, 0x06ea, 0x06ee, + 0x06f4, 0x06f8, 0x06fd, 0x0703, 0x070d, 0x0711, 0x0715, 0x071c, + 0x0721, 0x0729, 0x072f, 0x0734, 0x073c, 0x0740, 0x0747, 0x074f, + 0x0759, 0x075d, 0x0764, 0x076b, 0x0776, 0x0781, 0x0789, 0x0799, + // Entry 100 - 13F + 0x07a0, 0x07a5, 0x07b1, 0x07ba, 0x07c0, 0x07c6, 0x07cb, 0x07d3, + 0x07da, 0x07e0, 0x07e5, 0x07ea, 0x07ef, 0x07f9, 0x0805, 0x080a, + 0x081b, 0x0825, 0x082a, 0x0830, 0x0836, 0x083a, 0x0843, 0x0851, + 0x0857, 0x0861, 0x086e, 0x087a, 0x0880, 0x088f, 0x0893, 0x089d, + 0x08ab, 0x08ae, 0x08b9, 0x08c5, 0x08d1, 0x08da, 0x08e5, 0x08f0, + 0x08fa, 0x08fc, 0x0905, 0x0908, 0x090c, 0x0911, 0x0921, 0x0924, + 0x092e, 0x0934, 0x0942, 0x0950, 0x095e, 0x0963, 0x096c, 0x0972, + 0x0977, 0x0982, 0x098e, 0x0993, 0x0999, 0x099e, 0x09a5, 0x09aa, + // Entry 140 - 17F + 0x09af, 0x09b7, 0x09c5, 0x09cf, 0x09d9, 0x09de, 0x09e9, 0x09ee, + 0x09f2, 0x09f6, 0x09fc, 0x0a01, 0x0a0a, 0x0a11, 0x0a28, 0x0a2e, + 0x0a34, 0x0a3b, 0x0a47, 0x0a53, 0x0a57, 0x0a64, 0x0a6b, 0x0a71, + 0x0a74, 0x0a79, 0x0a7d, 0x0a86, 0x0a8d, 0x0a91, 0x0a98, 0x0aa3, + 0x0aaa, 0x0aae, 0x0ab6, 0x0abb, 0x0ac6, 0x0ad2, 0x0ad8, 0x0ae1, + 0x0ae5, 0x0aed, 0x0af5, 0x0b03, 0x0b0a, 0x0b14, 0x0b1a, 0x0b29, + 0x0b2d, 0x0b36, 0x0b3d, 0x0b43, 0x0b4b, 0x0b50, 0x0b57, 0x0b5c, + 0x0b63, 0x0b6a, 0x0b6f, 0x0b75, 0x0b7a, 0x0b82, 0x0b94, 0x0b9c, + // Entry 180 - 1BF + 0x0ba2, 0x0ba8, 0x0bb2, 0x0bb7, 0x0bbb, 0x0bc4, 0x0bce, 0x0bd8, + 0x0bdf, 0x0be4, 0x0be7, 0x0beb, 0x0bf0, 0x0c01, 0x0c07, 0x0c11, + 0x0c15, 0x0c1b, 0x0c23, 0x0c2a, 0x0c32, 0x0c37, 0x0c3b, 0x0c41, + 0x0c47, 0x0c4c, 0x0c50, 0x0c61, 0x0c6b, 0x0c79, 0x0c80, 0x0c86, + 0x0c91, 0x0c98, 0x0ca0, 0x0ca6, 0x0cab, 0x0cb5, 0x0cbc, 0x0cc8, + 0x0ccd, 0x0cd8, 0x0cdf, 0x0ce7, 0x0cec, 0x0cf1, 0x0cfc, 0x0d02, + 0x0d0d, 0x0d11, 0x0d1a, 0x0d20, 0x0d24, 0x0d2c, 0x0d33, 0x0d39, + 0x0d42, 0x0d47, 0x0d52, 0x0d58, 0x0d5d, 0x0d67, 0x0d6b, 0x0d7a, + // Entry 1C0 - 1FF + 0x0d82, 0x0d8a, 0x0d8f, 0x0d94, 0x0d99, 0x0daa, 0x0db4, 0x0dbb, + 0x0dc3, 0x0dcd, 0x0dd5, 0x0dde, 0x0dee, 0x0dfa, 0x0e07, 0x0e12, + 0x0e1b, 0x0e27, 0x0e2e, 0x0e36, 0x0e40, 0x0e52, 0x0e59, 0x0e77, + 0x0e81, 0x0e88, 0x0e94, 0x0e9e, 0x0ea2, 0x0ea7, 0x0ead, 0x0eb6, + 0x0ebd, 0x0ec4, 0x0ecc, 0x0ecf, 0x0ed6, 0x0edd, 0x0ef1, 0x0ef8, + 0x0efd, 0x0f04, 0x0f0e, 0x0f15, 0x0f1a, 0x0f24, 0x0f2a, 0x0f3c, + 0x0f47, 0x0f4d, 0x0f51, 0x0f55, 0x0f5e, 0x0f6d, 0x0f77, 0x0f81, + 0x0f8a, 0x0f8e, 0x0f9b, 0x0fa1, 0x0fad, 0x0fb4, 0x0fbe, 0x0fc8, + // Entry 200 - 23F + 0x0fd3, 0x0fdf, 0x0fe6, 0x0fed, 0x0ff9, 0x0ffe, 0x1002, 0x100e, + 0x1014, 0x1018, 0x1020, 0x1028, 0x103b, 0x104a, 0x1050, 0x1059, + 0x105d, 0x1062, 0x1066, 0x106c, 0x1071, 0x1077, 0x107a, 0x1081, + 0x108a, 0x1091, 0x1098, 0x109e, 0x10a6, 0x10b4, 0x10bd, 0x10c3, + 0x10c9, 0x10d2, 0x10db, 0x10e7, 0x10ee, 0x10f4, 0x10fb, 0x1103, + 0x111e, 0x1124, 0x112d, 0x1134, 0x1137, 0x113a, 0x1144, 0x114b, + 0x1155, 0x1162, 0x1168, 0x1172, 0x1177, 0x117d, 0x1183, 0x1188, + 0x118d, 0x1195, 0x1197, 0x119d, 0x11a6, 0x11aa, 0x11ad, 0x11b5, + // Entry 240 - 27F + 0x11bc, 0x11c1, 0x11ca, 0x11d5, 0x11dc, 0x11e8, 0x11ee, 0x11f4, + 0x1211, 0x1215, 0x122b, 0x122f, 0x1247, 0x1247, 0x1257, 0x1269, + 0x127a, 0x128a, 0x1299, 0x12ab, 0x12c1, 0x12d1, 0x12e2, 0x12e2, + 0x12f1, 0x1301, 0x130d, 0x1313, 0x132a, 0x133f, 0x1347, 0x1354, + 0x1366, 0x137b, +} // Size: 1244 bytes + +var paLangStr string = "" + // Size: 5353 bytes + "ਅਬਖਾਜ਼ੀਅਨਅਫ਼ਰੀਕੀਅਕਾਨਅਮਹਾਰਿਕਅਰਬੀਅਸਾਮੀਅਜ਼ਰਬਾਈਜਾਨੀਬਸ਼ਕੀਰਬੇਲਾਰੂਸੀਬੁਲਗਾਰੀਆਈਬੰ" + + "ਬਾਰਾਬੰਗਾਲੀਤਿੱਬਤੀਬਰੇਟਨਬੋਸਨੀਆਈਕੈਟਾਲਾਨਚੇਚਨਕੋਰਸੀਕਨਚੈਕਚੁਵਾਸ਼ਵੈਲਜ਼ਡੈਨਿਸ਼ਜਰਮਨ" + + "ਜ਼ੋਂਗਖਾਈਵਈਯੂਨਾਨੀਅੰਗਰੇਜ਼ੀਇਸਪੇਰਾਂਟੋਸਪੇਨੀਇਸਟੋਨੀਆਈਬਾਸਕਫ਼ਾਰਸੀਫਿਨਿਸ਼ਫ਼ਿਜ਼ੀਫ਼" + + "ੇਰੋਸੇਫਰਾਂਸੀਸੀਪੱਛਮੀ ਫ੍ਰਿਸੀਅਨਆਇਰੀਗੈਲਿਸ਼ਿਅਨਗੁਆਰਾਨੀਗੁਜਰਾਤੀਮੈਂਕਸਹੌਸਾਹਿਬਰੂਹਿ" + + "ੰਦੀਕ੍ਰੋਏਸ਼ਿਆਈਹੈਤੀਆਈਹੰਗਰੀਆਈਅਰਮੀਨੀਆਈਇੰਡੋਨੇਸ਼ੀਆਈਇਗਬੋਸਿਚੁਆਨ ਯੀਆਈਸਲੈਂਡਿਕਇਤਾ" + + "ਲਵੀਇੰਕਟੀਟੂਤਜਪਾਨੀਜਾਵਾਨੀਜ਼ਜਾਰਜੀਆਈਕਿਕੂਯੂਕਜ਼ਾਖ਼ਕਲਾਅੱਲੀਸੁਟਖਮੇਰਕੰਨੜਕੋਰੀਆਈਕਸ਼" + + "ਮੀਰੀਕੁਰਦਕੋਰਨਿਸ਼ਕਿਰਗੀਜ਼ਲਾਤੀਨੀਲਕਜ਼ਮਬਰਗਿਸ਼ਗਾਂਡਾਲਿੰਗਾਲਾਲਾਓਲਿਥੁਆਨੀਅਨਲੂਬਾ-ਕਾ" + + "ਟਾਂਗਾਲਾਟਵਿਅਨਮੇਲੇਗਸੀਮਾਉਰੀਮੈਕਡੋਨੀਆਈਮਲਿਆਲਮਮੰਗੋਲੀਅਨਮਰਾਠੀਮਲਯਮਾਲਟੀਜ਼ਬਰਮੀਉੱਤਰ" + + "ੀ ਨਡੇਬੇਲੇਨੇਪਾਲੀਡੱਚਨਾਰਵੇਜਿਆਈ ਨਿਓਨੌਰਸਕਨਾਰਵੇਜਿਆਈ ਬੋਕਮਲਓਰੋਮੋਉੜੀਆਪੰਜਾਬੀਪਲੀਪ" + + "ੋਲੈਂਡੀਪਸ਼ਤੋਪੁਰਤਗਾਲੀਕਕੇਸ਼ੁਆਰੋਮਾਂਸ਼ਰੁੰਡੀਰੋਮਾਨੀਆਈਰੂਸੀਕਿਨਿਆਰਵਾਂਡਾਸੰਸਕ੍ਰਿਤਸ" + + "ਿੰਧੀਉੱਤਰੀ ਸਾਮੀਸਾਂਗੋਸਿੰਹਾਲਾਸਲੋਵਾਕਸਲੋਵੇਨੀਆਈਸ਼ੋਨਾਸੋਮਾਲੀਅਲਬਾਨੀਆਈਸਰਬੀਆਈਸੂੰਡ" + + "ਾਨੀਸਵੀਡਿਸ਼ਸਵਾਹਿਲੀਤਮਿਲਤੇਲਗੂਤਾਜਿਕਥਾਈਤਿਗ੍ਰੀਨਿਆਤੁਰਕਮੇਨਟੌਂਗਨਤੁਰਕੀਤਤਾਰਉਇਗੁਰਯ" + + "ੂਕਰੇਨੀਆਈਉਰਦੂਉਜ਼ਬੇਕਵੀਅਤਨਾਮੀਵੋਲੋਫਖੋਸਾਯੋਰੂਬਾਚੀਨੀਜ਼ੁਲੂਅਚੀਨੀਅਕੋਲੀਅਗੇਮਪੁਰਾਣੀ" + + " ਅੰਗਰੇਜ਼ੀਮਾਪੁਚੇਅਸੂਬੇਮਬਾਬੇਨਾਪੱਛਮੀ ਬਲੂਚੀਭੋਜਪੁਰੀਬੋਡੋਚੀਗਾਮਾਰੀਚੇਰੋਕੀਕੇਂਦਰੀ ਕੁ" + + "ਰਦਿਸ਼ਟੇਟਾਜ਼ਾਰਮਾਲੋਅਰ ਸੋਰਬੀਅਨਡੂਆਲਾਜੋਲਾ-ਫੋਇਨੀਇੰਬੂਪੁਰਾਤਨ ਮਿਸਰੀਫਿਲੀਪਿਨੋਗਾਗੌ" + + "ਜ਼ਪੁਰਾਤਨ ਯੂਨਾਨੀਸਵਿਸ ਜਰਮਨਗੁਸੀਹਵਾਈਫਿਜੀ ਹਿੰਦੀਅੱਪਰ ਸੋਰਬੀਅਨਨਗੋਂਬਾਮਚਾਮੇਕਬਾਇਲ" + + "ਕੰਬਾਮਕੋਂਡਕਾਬੁਵੇਰਦਿਆਨੂਕੋਯਰਾ ਚੀਨੀਕਲੇਜਿਨਕੋਮੀ-ਪੇਰਮਿਆਕਕੋਂਕਣੀਸ਼ੰਬਾਲਾਬਫ਼ੀਆਲੰਗ" + + "ਾਈਲਕੋਟਾਉੱਤਰੀ ਲੁਰੀਲੂਓਲੂਈਆਮੈਥਲੀਮਸਾਈਮੇਰੂਮੋਰੀਸਿਅਨਮਖੋਵਾ-ਮਿੱਟੋਮੇਟਾਮਨੀਪੁਰੀਮੋਹ" + + "ਾਵਕਮੁੰਡੇਂਗਕਈ ਭਾਸ਼ਾਵਾਂਮੇਜ਼ੈਂਡਰਾਨੀਨਾਮਾਲੋ ਜਰਮਨਕਵਾਸਿਓਐਂਕੋਨੁਏਰਨਿਆਂਕੋਲੇਕੇਸ਼ਰ" + + "ਾਜਸਥਾਨੀਰੋਮਬੋਰਵਾਸਮਬੁਰੂਸੰਥਾਲੀਸੇਂਗੋਦੱਖਣੀ ਕੁਰਦਿਸ਼ਸੇਨਾਕੋਇਰਾਬੋਰੋ ਸੇਂਨੀਟਚੇਲਹਿ" + + "ਟਸ਼ਾਨਦੱਖਣੀ ਸਾਮੀਲਿਊਲ ਸਾਮੀਇਨਾਰੀ ਸਾਮੀਸਕੌਲਟ ਸਾਮੀਕਾਂਗੋ ਸਵਾਹਿਲੀਟੇਸੋਤਾਸਾਵਿਕਮੱ" + + "ਧ ਐਟਲਸ ਤਮਾਜ਼ਿਤਅਗਿਆਤ ਭਾਸ਼ਾਵਾਈਵੂੰਜੋਵਾਲਪੁਰੀਸੋਗਾਮਿਆਰੀ ਮੋਰੋਕੇਨ ਟਾਮਾਜ਼ਿਕਕੋਈ " + + "ਭਾਸ਼ਾਈ ਸਮੱਗਰੀ ਨਹੀਂਆਧੁਨਿਕ ਮਿਆਰੀ ਅਰਬੀਆਸਟਰੀਆਈ ਜਰਮਨਸਵਿਸ ਹਾਈ ਜਰਮਨਆਸਟ੍ਰੇਲੀਆਈ" + + " ਅੰਗਰੇਜ਼ੀਕੈਨੇਡੀਅਨ ਅੰਗਰੇਜ਼ੀਬਰਤਾਨਵੀ ਅੰਗਰੇਜ਼ੀਅਮਰੀਕੀ ਅੰਗਰੇਜ਼ੀਲਾਤੀਨੀ ਅਮਰੀਕੀ ਸ" + + "ਪੇਨੀਯੂਰਪੀ ਸਪੇਨੀਮੈਕਸੀਕਨ ਸਪੈਨਿਸ਼ਕੈਨੇਡੀਅਨ ਫਰਾਂਸੀਸੀਸਵਿਸ ਫਰਾਂਸੀਸੀਲੋ ਸੈਕਸਨਫਲ" + + "ੈਮਿਸ਼ਬ੍ਰਾਜ਼ੀਲੀਆਈ ਪੁਰਤਗਾਲੀਯੂਰਪੀ ਪੁਰਤਗਾਲੀਮੋਲਡਾਵੀਆਈਸਰਲ ਚੀਨੀਰਵਾਇਤੀ ਚੀਨੀ" + +var paLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x001b, 0x001b, 0x0030, 0x003c, 0x0051, 0x0051, + 0x005d, 0x006c, 0x006c, 0x006c, 0x008d, 0x009f, 0x00b7, 0x00d2, + 0x00d2, 0x00e4, 0x00f6, 0x0108, 0x0117, 0x012c, 0x0141, 0x014d, + 0x014d, 0x0162, 0x0162, 0x016b, 0x016b, 0x017d, 0x018c, 0x019e, + 0x01aa, 0x01aa, 0x01bf, 0x01c8, 0x01da, 0x01f2, 0x020d, 0x021c, + 0x0234, 0x0240, 0x0252, 0x0252, 0x0264, 0x0276, 0x028b, 0x02a3, + 0x02cb, 0x02d7, 0x02d7, 0x02f2, 0x0307, 0x031c, 0x032b, 0x0337, + 0x0346, 0x0355, 0x0355, 0x0373, 0x0385, 0x039a, 0x03b2, 0x03b2, + // Entry 40 - 7F + 0x03b2, 0x03d3, 0x03d3, 0x03df, 0x03f8, 0x03f8, 0x03f8, 0x0413, + 0x0425, 0x043d, 0x044c, 0x0464, 0x0479, 0x0479, 0x048b, 0x048b, + 0x049d, 0x04bb, 0x04c7, 0x04d3, 0x04e5, 0x04e5, 0x04fa, 0x0506, + 0x0506, 0x051b, 0x0530, 0x0542, 0x0563, 0x0572, 0x0572, 0x0587, + 0x0590, 0x05ab, 0x05cd, 0x05e2, 0x05f7, 0x05f7, 0x0606, 0x0621, + 0x0633, 0x064b, 0x065a, 0x0663, 0x0678, 0x0684, 0x0684, 0x06a9, + 0x06bb, 0x06bb, 0x06c4, 0x06f8, 0x0723, 0x0723, 0x0723, 0x0723, + 0x0723, 0x0723, 0x0732, 0x073e, 0x073e, 0x0750, 0x0759, 0x076e, + // Entry 80 - BF + 0x077d, 0x0795, 0x07aa, 0x07bf, 0x07ce, 0x07e6, 0x07f2, 0x0813, + 0x082b, 0x082b, 0x083a, 0x0856, 0x0865, 0x087a, 0x088c, 0x08a7, + 0x08a7, 0x08b6, 0x08c8, 0x08e0, 0x08f2, 0x08f2, 0x08f2, 0x0907, + 0x091c, 0x0931, 0x093d, 0x094c, 0x095b, 0x0964, 0x097f, 0x0994, + 0x0994, 0x09a3, 0x09b2, 0x09b2, 0x09be, 0x09be, 0x09cd, 0x09e8, + 0x09f4, 0x0a06, 0x0a06, 0x0a1e, 0x0a1e, 0x0a1e, 0x0a2d, 0x0a39, + 0x0a39, 0x0a4b, 0x0a4b, 0x0a57, 0x0a66, 0x0a75, 0x0a84, 0x0a84, + 0x0a84, 0x0a84, 0x0a84, 0x0a90, 0x0a90, 0x0a90, 0x0a90, 0x0a90, + // Entry C0 - FF + 0x0a90, 0x0a90, 0x0abb, 0x0abb, 0x0abb, 0x0acd, 0x0acd, 0x0acd, + 0x0acd, 0x0acd, 0x0acd, 0x0acd, 0x0ad6, 0x0ad6, 0x0ad6, 0x0ad6, + 0x0ad6, 0x0ad6, 0x0ad6, 0x0ad6, 0x0ad6, 0x0ad6, 0x0ad6, 0x0ad6, + 0x0ad6, 0x0ae5, 0x0ae5, 0x0af1, 0x0af1, 0x0af1, 0x0b10, 0x0b25, + 0x0b25, 0x0b25, 0x0b25, 0x0b25, 0x0b25, 0x0b25, 0x0b25, 0x0b25, + 0x0b25, 0x0b31, 0x0b31, 0x0b31, 0x0b31, 0x0b31, 0x0b31, 0x0b31, + 0x0b31, 0x0b31, 0x0b31, 0x0b31, 0x0b31, 0x0b3d, 0x0b3d, 0x0b3d, + 0x0b3d, 0x0b49, 0x0b49, 0x0b49, 0x0b49, 0x0b5b, 0x0b5b, 0x0b83, + // Entry 100 - 13F + 0x0b83, 0x0b83, 0x0b83, 0x0b83, 0x0b83, 0x0b83, 0x0b8f, 0x0b8f, + 0x0b8f, 0x0b8f, 0x0b8f, 0x0ba1, 0x0ba1, 0x0bc3, 0x0bc3, 0x0bd2, + 0x0bd2, 0x0bee, 0x0bee, 0x0bee, 0x0bfa, 0x0bfa, 0x0bfa, 0x0c1c, + 0x0c1c, 0x0c1c, 0x0c1c, 0x0c1c, 0x0c1c, 0x0c1c, 0x0c1c, 0x0c34, + 0x0c34, 0x0c34, 0x0c34, 0x0c34, 0x0c34, 0x0c34, 0x0c34, 0x0c34, + 0x0c34, 0x0c34, 0x0c46, 0x0c46, 0x0c46, 0x0c46, 0x0c46, 0x0c46, + 0x0c46, 0x0c46, 0x0c46, 0x0c46, 0x0c46, 0x0c46, 0x0c46, 0x0c46, + 0x0c46, 0x0c6b, 0x0c84, 0x0c84, 0x0c84, 0x0c90, 0x0c90, 0x0c90, + // Entry 140 - 17F + 0x0c90, 0x0c9c, 0x0cb8, 0x0cb8, 0x0cb8, 0x0cb8, 0x0cda, 0x0cda, + 0x0cda, 0x0cda, 0x0cda, 0x0cda, 0x0cda, 0x0cda, 0x0cda, 0x0cda, + 0x0cec, 0x0cfb, 0x0cfb, 0x0cfb, 0x0cfb, 0x0cfb, 0x0d0a, 0x0d0a, + 0x0d0a, 0x0d16, 0x0d16, 0x0d16, 0x0d16, 0x0d16, 0x0d25, 0x0d49, + 0x0d49, 0x0d49, 0x0d49, 0x0d49, 0x0d49, 0x0d65, 0x0d65, 0x0d65, + 0x0d65, 0x0d77, 0x0d77, 0x0d99, 0x0dab, 0x0dab, 0x0dab, 0x0dab, + 0x0dab, 0x0dab, 0x0dab, 0x0dab, 0x0dc0, 0x0dcf, 0x0dcf, 0x0dcf, + 0x0dcf, 0x0dcf, 0x0dde, 0x0dde, 0x0dde, 0x0dde, 0x0dde, 0x0dde, + // Entry 180 - 1BF + 0x0dde, 0x0ded, 0x0ded, 0x0ded, 0x0ded, 0x0e09, 0x0e09, 0x0e09, + 0x0e09, 0x0e09, 0x0e12, 0x0e12, 0x0e1e, 0x0e1e, 0x0e1e, 0x0e1e, + 0x0e1e, 0x0e1e, 0x0e2d, 0x0e2d, 0x0e2d, 0x0e39, 0x0e39, 0x0e39, + 0x0e39, 0x0e39, 0x0e45, 0x0e5d, 0x0e5d, 0x0e7c, 0x0e88, 0x0e88, + 0x0e88, 0x0e88, 0x0e9d, 0x0eaf, 0x0eaf, 0x0eaf, 0x0ec4, 0x0ee3, + 0x0ee3, 0x0ee3, 0x0ee3, 0x0ee3, 0x0ee3, 0x0ee3, 0x0f04, 0x0f04, + 0x0f04, 0x0f10, 0x0f23, 0x0f23, 0x0f23, 0x0f23, 0x0f23, 0x0f35, + 0x0f35, 0x0f35, 0x0f35, 0x0f35, 0x0f41, 0x0f41, 0x0f4d, 0x0f4d, + // Entry 1C0 - 1FF + 0x0f4d, 0x0f65, 0x0f65, 0x0f65, 0x0f65, 0x0f65, 0x0f65, 0x0f65, + 0x0f65, 0x0f65, 0x0f65, 0x0f65, 0x0f65, 0x0f65, 0x0f65, 0x0f65, + 0x0f65, 0x0f65, 0x0f65, 0x0f65, 0x0f65, 0x0f65, 0x0f71, 0x0f71, + 0x0f89, 0x0f89, 0x0f89, 0x0f89, 0x0f89, 0x0f98, 0x0f98, 0x0f98, + 0x0f98, 0x0f98, 0x0f98, 0x0fa1, 0x0fa1, 0x0fa1, 0x0fa1, 0x0fb3, + 0x0fb3, 0x0fc5, 0x0fc5, 0x0fc5, 0x0fd4, 0x0fd4, 0x0fd4, 0x0fd4, + 0x0ff9, 0x0ff9, 0x1005, 0x1005, 0x1005, 0x1030, 0x1030, 0x1030, + 0x1045, 0x1051, 0x1051, 0x1051, 0x1051, 0x1051, 0x106d, 0x1086, + // Entry 200 - 23F + 0x10a2, 0x10be, 0x10be, 0x10be, 0x10be, 0x10be, 0x10be, 0x10be, + 0x10be, 0x10be, 0x10be, 0x10be, 0x10e3, 0x10e3, 0x10e3, 0x10e3, + 0x10e3, 0x10e3, 0x10ef, 0x10ef, 0x10ef, 0x10ef, 0x10ef, 0x10ef, + 0x10ef, 0x10ef, 0x10ef, 0x10ef, 0x10ef, 0x10ef, 0x10ef, 0x10ef, + 0x10ef, 0x10ef, 0x10ef, 0x10ef, 0x10ef, 0x10ef, 0x1104, 0x1104, + 0x1130, 0x1130, 0x1130, 0x1130, 0x114f, 0x1158, 0x1158, 0x1158, + 0x1158, 0x1158, 0x1158, 0x1158, 0x1167, 0x1167, 0x1167, 0x1167, + 0x1167, 0x117c, 0x117c, 0x117c, 0x117c, 0x1188, 0x1188, 0x1188, + // Entry 240 - 27F + 0x1188, 0x1188, 0x1188, 0x1188, 0x1188, 0x1188, 0x1188, 0x1188, + 0x11c6, 0x11c6, 0x1202, 0x1202, 0x1231, 0x1231, 0x1253, 0x1276, + 0x12ad, 0x12de, 0x130c, 0x1337, 0x136c, 0x138b, 0x13b6, 0x13b6, + 0x13e7, 0x140c, 0x1422, 0x1437, 0x1471, 0x1499, 0x14b4, 0x14b4, + 0x14ca, 0x14e9, +} // Size: 1244 bytes + +var plLangStr string = "" + // Size: 5558 bytes + "afarabchaskiawestyjskiafrikaansakanamharskiaragońskiarabskiasamskiawarsk" + + "iajmaraazerskibaszkirskibiałoruskibułgarskibislamabambarabengalskitybeta" + + "ńskibretońskibośniackikatalońskiczeczeńskichamorrokorsykańskikriczeskis" + + "taro-cerkiewno-słowiańskiczuwaskiwalijskiduńskiniemieckimalediwskidzongk" + + "haewegreckiangielskiesperantohiszpańskiestońskibaskijskiperskifulanifińs" + + "kifidżijskifarerskifrancuskizachodniofryzyjskiirlandzkiszkocki gaelickig" + + "alicyjskiguaranigudźarackimanxhausahebrajskihindihiri motuchorwackihaita" + + "ńskiwęgierskiormiańskihererointerlinguaindonezyjskiinterlingueigbosyczu" + + "ańskiinupiakidoislandzkiwłoskiinuktitutjapońskijawajskigruzińskikongokik" + + "ujukwanyamakazachskigrenlandzkikhmerskikannadakoreańskikanurikaszmirskik" + + "urdyjskikomikornijskikirgiskiłacińskiluksemburskigandalimburgijskilingal" + + "alaotańskilitewskiluba-katangałotewskimalgaskimarshallmaoryjskimacedońsk" + + "imalajalammongolskimarathimalajskimaltańskibirmańskinaurundebele północn" + + "ynepalskindonganiderlandzkinorweski (nynorsk)norweski (bokmål)ndebele po" + + "łudniowynawahonjandżaprowansalskiodżibwaoromskiorijaosetyjskipendżabski" + + "palijskipolskipasztoportugalskikeczuaretoromańskirundirumuńskirosyjskiki" + + "nya-ruandasanskrytsardyńskisindhilapoński północnysangosyngaleskisłowack" + + "isłoweńskisamoańskiszonasomalijskialbańskiserbskisiswatisotho południowy" + + "sundajskiszwedzkisuahilitamilskitelugutadżyckitajskitigriniaturkmeńskise" + + "tswanatongatureckitsongatatarskitahitańskiujgurskiukraińskiurduuzbeckive" + + "ndawietnamskivolapukwalońskiwolofkhosajidyszjorubaczuangchińskizuluaceha" + + "czoliadangmeadygejskitunezyjski arabskiafrihiliaghemajnuakadyjskialabama" + + "aleuckialbański gegijskipołudniowoałtajskistaroangielskiangikaaramejskia" + + "raukańskiaraonaarapahoalgierski arabskiarawakmarokański arabskiegipski a" + + "rabskiasuamerykański język migowyasturyjskikotavaawadhibeludżibalijskiba" + + "warskibasabamumbatak tobaghomalabedżabembabetawibenabafutbadagabeludżi p" + + "ółnocnybhodźpuribikolbinibanjarkomsiksikabisznuprija-manipuribachtiarsk" + + "ibradźbrahuibodoakoseburiackibugińskibulublinmedumbakaddokaribikajugaats" + + "amcebuanochigaczibczaczagatajskitrukmaryjskiżargon Chinookchoctawchipewy" + + "anczirokeskijęzyk Czejenówsoranikoptyjskicapiznonkrymski tureckikaszubsk" + + "idakotadargwijskitaitadelawareslavedogribdinkadżermadogridolnołużyckidus" + + "un centralnydualaśredniowieczny niderlandzkidioladyuladazagaembuefikemil" + + "ijskistarożytny egipskiekajukelamickiśrednioangielskiyupik środkowosyber" + + "yjskiewondoestremadurskifangfilipinomeänkielifoncajunśredniofrancuskista" + + "rofrancuskifranko-prowansalskipółnocnofryzyjskifryzyjski wschodnifriulij" + + "skigagagauskigangayogbayazaratusztriański darigyyzgilbertańskigiliańskiś" + + "rednio-wysoko-niemieckistaro-wysoko-niemieckikonkani (Goa)gondigorontalo" + + "gockigrebostarogreckiszwajcarski niemieckiwayúufrafragusiigwichʼinhaidah" + + "akkahawajskihindi fidżyjskiehiligajnonhetyckihmongijskigórnołużyckixiang" + + "hupaibanagibibioilokanoinguskiingryjskijamajskilojbanngombemachamejudeop" + + "erskijudeoarabskijutlandzkikarakałpackikabylskikaczinjjukambakawikabardy" + + "jskikanembutyapmakondekreolski Wysp Zielonego Przylądkakenyangkorokainga" + + "ngkhasichotańskikoyra chinikhowarkirmandżkikakokalenjinkimbundukomi-perm" + + "iackikonkanikosraekpellekaraczajsko-bałkarskikriokinarayakarelskikurukhs" + + "ambalabafiagwara kolońskakumyckikutenailadyńskilangilahndalambalezgijski" + + "Lingua Franca Novaliguryjskiliwskilakotalombardzkimongoloziluryjski półn" + + "ocnyłatgalskiluba-lulualuisenolundaluolushailuhyachiński klasycznylazyjs" + + "kimadurajskimafamagahimaithilimakasarmandingomasajskimabamokshamandarmen" + + "demerukreolski Mauritiusaśrednioirlandzkimakuametamicmacminangkabumanchu" + + "manipuryjskimohawkmossizachodniomaryjskimundangwiele językówcreekmirande" + + "semarwarimentawaimyeneerzyamazanderańskiminnańskineapolitańskinamadolnon" + + "iemieckinewarskiniasniueaongumbangiemboonnogajskistaronordyjskinovialn’k" + + "osotho północnynuernewarski klasycznyniamwezinyankolenyoronzemaosageosma" + + "ńsko-tureckipangasinopahlavipampangopapiamentopalaupikardyjskipensylwań" + + "skiplautdietschstaroperskipalatynackifenickipiemonckipontyjskiponpejskip" + + "ruskistaroprowansalskikiczechimborazo górski keczuaradźasthanirapanuirar" + + "otongaromagnoltarifitrombocygańskirotumańskirusińskirovianaarumuńskirwas" + + "andawejakuckisamarytański aramejskisamburusasaksantalisaurasztryjskingam" + + "baysangusycylijskiszkockisassarskipołudniowokurdyjskisenekasenaseriselku" + + "pskikoyraboro sennistaroirlandzkiżmudzkitashelhiytshanarabski (Czad)sida" + + "modolnośląskiselayarlapoński południowylapoński Lulelapoński Inarilapońs" + + "ki Skoltsoninkesogdyjskisranan tongoserersahofryzyjski saterlandzkisukum" + + "asususumeryjskikomoryjskikongijski suahilisyriackisyryjskiśląskitulutemn" + + "eatesoterenotetumtigretiwtokelaucachurskiklingońskitlingittałyskitamasze" + + "ktonga (Niasa)tok pisinturoyotarokocakońskitsimshiantackitumbukatuvaluta" + + "sawaqtuwińskicentralnomarokański tamazightudmurckiugaryckiumbundujęzyk r" + + "dzennywaiweneckiwepskizachodnioflamandzkimeński frankońskiwotiackivõrovu" + + "njowalserwalamowarajwashoWarlpiriwukałmuckimegrelskisogayaojapskiyangben" + + "yembanhengatukantońskizapoteckiblisszelandzkizenagastandardowy marokańsk" + + "i tamazightzunibrak treści o charakterze językowymzazakiwspółczesny arab" + + "skiaustriacki niemieckiwysokoniemiecki (Szwajcaria)australijski angielsk" + + "ikanadyjski angielskibrytyjski angielskiamerykański angielskiamerykański" + + " hiszpańskieuropejski hiszpańskimeksykański hiszpańskikanadyjski francus" + + "kiszwajcarski francuskiflamandzkibrazylijski portugalskieuropejski portu" + + "galskimołdawskiserbsko-chorwackichiński (uproszczony)chiński (tradycyjny" + + ")" + +var plLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000c, 0x0016, 0x001f, 0x0023, 0x002b, 0x0035, + 0x003c, 0x0043, 0x004a, 0x0050, 0x0057, 0x0061, 0x006c, 0x0076, + 0x007d, 0x0084, 0x008d, 0x0098, 0x00a2, 0x00ac, 0x00b7, 0x00c2, + 0x00ca, 0x00d6, 0x00d9, 0x00df, 0x00fb, 0x0103, 0x010b, 0x0112, + 0x011b, 0x0125, 0x012d, 0x0130, 0x0136, 0x013f, 0x0148, 0x0153, + 0x015c, 0x0165, 0x016b, 0x0171, 0x0178, 0x0182, 0x018a, 0x0193, + 0x01a5, 0x01ae, 0x01be, 0x01c8, 0x01cf, 0x01da, 0x01de, 0x01e3, + 0x01ec, 0x01f1, 0x01fa, 0x0203, 0x020d, 0x0217, 0x0221, 0x0227, + // Entry 40 - 7F + 0x0232, 0x023e, 0x0249, 0x024d, 0x0258, 0x025f, 0x0262, 0x026b, + 0x0272, 0x027b, 0x0284, 0x028c, 0x0296, 0x029b, 0x02a1, 0x02a9, + 0x02b2, 0x02bd, 0x02c5, 0x02cc, 0x02d6, 0x02dc, 0x02e6, 0x02ef, + 0x02f3, 0x02fc, 0x0304, 0x030e, 0x031a, 0x031f, 0x032b, 0x0332, + 0x033c, 0x0344, 0x0350, 0x0359, 0x0361, 0x0369, 0x0372, 0x037d, + 0x0386, 0x038f, 0x0396, 0x039e, 0x03a8, 0x03b2, 0x03b7, 0x03c9, + 0x03d1, 0x03d7, 0x03e3, 0x03f5, 0x0407, 0x041a, 0x0420, 0x0428, + 0x0434, 0x043c, 0x0443, 0x0448, 0x0451, 0x045c, 0x0464, 0x046a, + // Entry 80 - BF + 0x0470, 0x047b, 0x0481, 0x048e, 0x0493, 0x049c, 0x04a4, 0x04b0, + 0x04b8, 0x04c2, 0x04c8, 0x04dc, 0x04e1, 0x04eb, 0x04f4, 0x04ff, + 0x0509, 0x050e, 0x0518, 0x0521, 0x0528, 0x052f, 0x0540, 0x0549, + 0x0551, 0x0558, 0x0560, 0x0566, 0x056f, 0x0575, 0x057d, 0x0588, + 0x0590, 0x0595, 0x059c, 0x05a2, 0x05aa, 0x05b5, 0x05bd, 0x05c7, + 0x05cb, 0x05d2, 0x05d7, 0x05e1, 0x05e8, 0x05f1, 0x05f6, 0x05fb, + 0x0601, 0x0607, 0x060d, 0x0615, 0x0619, 0x061d, 0x0623, 0x062a, + 0x0633, 0x0645, 0x064d, 0x0652, 0x0656, 0x065f, 0x0666, 0x066d, + // Entry C0 - FF + 0x067f, 0x0693, 0x06a1, 0x06a7, 0x06b0, 0x06bb, 0x06c1, 0x06c8, + 0x06d9, 0x06df, 0x06f2, 0x0701, 0x0704, 0x071e, 0x0728, 0x072e, + 0x0734, 0x073c, 0x0744, 0x074c, 0x0750, 0x0755, 0x075f, 0x0766, + 0x076c, 0x0771, 0x0777, 0x077b, 0x0780, 0x0786, 0x0799, 0x07a3, + 0x07a8, 0x07ac, 0x07b2, 0x07b5, 0x07bc, 0x07d0, 0x07db, 0x07e1, + 0x07e7, 0x07eb, 0x07f0, 0x07f8, 0x0801, 0x0805, 0x0809, 0x0810, + 0x0815, 0x081b, 0x0821, 0x0826, 0x082d, 0x0832, 0x0839, 0x0844, + 0x0848, 0x0850, 0x085f, 0x0866, 0x086f, 0x0879, 0x0889, 0x088f, + // Entry 100 - 13F + 0x0898, 0x08a0, 0x08af, 0x08b8, 0x08be, 0x08c8, 0x08cd, 0x08d5, + 0x08da, 0x08e0, 0x08e5, 0x08ec, 0x08f1, 0x08ff, 0x090e, 0x0913, + 0x092f, 0x0934, 0x0939, 0x093f, 0x0943, 0x0947, 0x0950, 0x0963, + 0x0969, 0x0971, 0x0982, 0x099b, 0x09a1, 0x09ae, 0x09b2, 0x09ba, + 0x09c4, 0x09c7, 0x09cc, 0x09dd, 0x09eb, 0x09fe, 0x0a11, 0x0a23, + 0x0a2d, 0x0a2f, 0x0a37, 0x0a3a, 0x0a3e, 0x0a43, 0x0a59, 0x0a5d, + 0x0a6a, 0x0a74, 0x0a8d, 0x0aa3, 0x0ab0, 0x0ab5, 0x0abe, 0x0ac3, + 0x0ac8, 0x0ad3, 0x0ae8, 0x0aee, 0x0af4, 0x0af9, 0x0b02, 0x0b07, + // Entry 140 - 17F + 0x0b0c, 0x0b14, 0x0b25, 0x0b2f, 0x0b36, 0x0b40, 0x0b4f, 0x0b54, + 0x0b58, 0x0b5e, 0x0b64, 0x0b6b, 0x0b72, 0x0b7b, 0x0b83, 0x0b89, + 0x0b8f, 0x0b96, 0x0ba1, 0x0bad, 0x0bb7, 0x0bc4, 0x0bcc, 0x0bd2, + 0x0bd5, 0x0bda, 0x0bde, 0x0be9, 0x0bf0, 0x0bf4, 0x0bfb, 0x0c1d, + 0x0c24, 0x0c28, 0x0c30, 0x0c35, 0x0c3f, 0x0c4a, 0x0c50, 0x0c5b, + 0x0c5f, 0x0c67, 0x0c6f, 0x0c7d, 0x0c84, 0x0c8a, 0x0c90, 0x0ca6, + 0x0caa, 0x0cb2, 0x0cba, 0x0cc0, 0x0cc7, 0x0ccc, 0x0cdb, 0x0ce2, + 0x0ce9, 0x0cf2, 0x0cf7, 0x0cfd, 0x0d02, 0x0d0b, 0x0d1d, 0x0d27, + // Entry 180 - 1BF + 0x0d2d, 0x0d33, 0x0d3d, 0x0d42, 0x0d46, 0x0d59, 0x0d63, 0x0d6d, + 0x0d74, 0x0d79, 0x0d7c, 0x0d82, 0x0d87, 0x0d99, 0x0da1, 0x0dab, + 0x0daf, 0x0db5, 0x0dbd, 0x0dc4, 0x0dcc, 0x0dd4, 0x0dd8, 0x0dde, + 0x0de4, 0x0de9, 0x0ded, 0x0e00, 0x0e11, 0x0e16, 0x0e1a, 0x0e20, + 0x0e2a, 0x0e30, 0x0e3c, 0x0e42, 0x0e47, 0x0e58, 0x0e5f, 0x0e6e, + 0x0e73, 0x0e7c, 0x0e83, 0x0e8b, 0x0e90, 0x0e95, 0x0ea3, 0x0ead, + 0x0ebb, 0x0ebf, 0x0ecd, 0x0ed5, 0x0ed9, 0x0edd, 0x0edf, 0x0ee5, + 0x0eee, 0x0ef6, 0x0f04, 0x0f0a, 0x0f10, 0x0f20, 0x0f24, 0x0f36, + // Entry 1C0 - 1FF + 0x0f3e, 0x0f46, 0x0f4b, 0x0f50, 0x0f55, 0x0f66, 0x0f6f, 0x0f76, + 0x0f7e, 0x0f88, 0x0f8d, 0x0f98, 0x0fa5, 0x0fb1, 0x0fbc, 0x0fc7, + 0x0fce, 0x0fd7, 0x0fe0, 0x0fe9, 0x0fef, 0x1000, 0x1005, 0x101e, + 0x102a, 0x1031, 0x103a, 0x1042, 0x1049, 0x104e, 0x1057, 0x1062, + 0x106b, 0x1072, 0x107c, 0x107f, 0x1086, 0x108d, 0x10a4, 0x10ab, + 0x10b0, 0x10b7, 0x10c5, 0x10cc, 0x10d1, 0x10db, 0x10e2, 0x10eb, + 0x10ff, 0x1105, 0x1109, 0x110d, 0x1116, 0x1125, 0x1133, 0x113b, + 0x1145, 0x1149, 0x1157, 0x115d, 0x116a, 0x1171, 0x1186, 0x1194, + // Entry 200 - 23F + 0x11a3, 0x11b2, 0x11b9, 0x11c2, 0x11ce, 0x11d3, 0x11d7, 0x11ed, + 0x11f3, 0x11f7, 0x1201, 0x120b, 0x121c, 0x1224, 0x122c, 0x1234, + 0x1238, 0x123d, 0x1242, 0x1248, 0x124d, 0x1252, 0x1255, 0x125c, + 0x1265, 0x1270, 0x1277, 0x127f, 0x1287, 0x1294, 0x129d, 0x12a3, + 0x12a9, 0x12b2, 0x12bb, 0x12c0, 0x12c7, 0x12cd, 0x12d4, 0x12dd, + 0x12fb, 0x1303, 0x130b, 0x1312, 0x1320, 0x1323, 0x132a, 0x1330, + 0x1343, 0x1356, 0x135e, 0x1363, 0x1368, 0x136e, 0x1374, 0x1379, + 0x137e, 0x1386, 0x1388, 0x1391, 0x139a, 0x139e, 0x13a1, 0x13a7, + // Entry 240 - 27F + 0x13ae, 0x13b3, 0x13bb, 0x13c5, 0x13ce, 0x13d3, 0x13dc, 0x13e2, + 0x1403, 0x1407, 0x142c, 0x1432, 0x1447, 0x1447, 0x145b, 0x1477, + 0x148d, 0x14a1, 0x14b4, 0x14ca, 0x14e2, 0x14f8, 0x1510, 0x1510, + 0x1524, 0x1539, 0x1539, 0x1543, 0x155a, 0x1570, 0x157a, 0x158b, + 0x15a1, 0x15b6, +} // Size: 1244 bytes + +var ptLangStr string = "" + // Size: 4263 bytes + "afarabcázioavésticoafricânerakanamáricoaragonêsárabeassamêsavaricaimaraa" + + "zerbaijanobashkirbielorrussobúlgarobislamábambarabengalitibetanobretãobó" + + "sniocatalãochechenochamorrocórsicocreetchecoeslavo eclesiásticotchuvache" + + "galêsdinamarquêsalemãodivehidzongaevegregoinglêsesperantoespanholestonia" + + "nobascopersafulafinlandêsfijianoferoêsfrancêsfrísio ocidentalirlandêsgaé" + + "lico escocêsgalegoguaraniguzeratemanxhauçáhebraicohíndihiri motucroataha" + + "itianohúngaroarmêniohererointerlínguaindonésiointerlingueibosichuan yiin" + + "upiaqueidoislandêsitalianoinuktitutjaponêsjavanêsgeorgianocongolêsquicui" + + "okuanyamacazaquegroenlandêskhmercanarêscoreanocanúricaxemiracurdokomicór" + + "nicoquirguizlatimluxemburguêslugandalimburguêslingalalaosianolituanoluba" + + "-catangaletãomalgaxemarshalêsmaorimacedôniomalaialamongolmaratamalaiomal" + + "têsbirmanêsnauruanondebele do nortenepalidongoholandêsnynorsk norueguêsb" + + "okmål norueguêsndebele do sulnavajonianjaoccitânicoojibwaoromooriyaosset" + + "icpanjabipálipolonêspashtoportuguêsquíchuaromancherundiromenorussoquinia" + + "ruandasânscritosardosindisami do nortesangocingalêseslovacoeslovenosamoa" + + "noshonasomalialbanêssérvioswatisoto do sulsundanêssuecosuaílitâmiltelugu" + + "tajiquetailandêstigríniaturcomenotswanatonganêsturcotsongatatartaitianou" + + "igurucranianourduusbequevendavietnamitavolapuquevalãouólofexosaiídicheio" + + "rubazhuangchinêszuluachémacoliadangmeadigueafrihiliaghemainuacadianoaleú" + + "tealtai do sulinglês arcaicoangikaaramaicomapudungunarapahoarauaquiasuas" + + "turianoawadhibalúchibalinêsbasabamumghomala’bejabembabenabafutbalúchi oc" + + "identalbhojpuribikolbinikomsiksikabrajbodoakooseburiatbuginêsbulublinmed" + + "umbacaddocaribecayugaatsamcebuanochigachibchachagataichuukesemarichinook" + + " jargonchoctawchipewyancherokeecheienesorâni curdocoptaturco da Crimeiak" + + "ashubiandacotadargwataitadelawareslavedogribdinkazarmadogrisorábio baixo" + + "dualaholandês médiojola-fonyidiúladazagaembuefiqueegípcio arcaicoekajuke" + + "lamiteinglês médioewondofanguefilipinofomfrancês médiofrancês arcaicofrí" + + "sio setentrionalfrisão orientalfriulanogagagauzgayogbaiageezgilbertêsale" + + "mão médio-altoalemão arcaico altogondigorontalogóticogrebogrego arcaicoa" + + "lemão suíçogusiigwichʼinhaidahavaianohiligaynonhititahmongsorábio altohu" + + "paibanibibioilocanoinguchelojbannguembamachamejudaico-persajudaico-arábi" + + "cokara-kalpakkabylekachinjjukambakawikabardianokanembutyapmacondekabuver" + + "dianukorokhasikhotanêskoyra chiinikakokalenjinquimbundokomi-permyakconca" + + "nikosraeankpellekarachay-balkaridioma caréliokurukhshambalabafiakölschku" + + "mykkutenailadinolangilahndalambalezghianlacotamongoloziluri setentrional" + + "luba-lulualuisenolundaluolushailuyiamadurêsmafamagahimaithilimakasarmand" + + "ingamassaimabamocsamandarmendemerumorisyenirlandês médiomacuameta’miquem" + + "aqueminangkabaumanchumanipurimoicanomossimundangidiomas múltiploscreekmi" + + "randêsmarwarimyeneerzyamazandaraninapolitanonamabaixo alemãonewariniasni" + + "ueanokwasiongiemboonnogainórdico arcaicon’kosoto setentrionalnuernewari " + + "clássiconyamwezinyankolenyoronzimaosageturco otomanopangasinãpálavipampa" + + "ngapapiamentopalauanopersa arcaicofeníciopohnpeianprovençal arcaicoquich" + + "érajastanirapanuirarotonganoromboromaniaromenorwasandaweiacutoaramaico " + + "samaritanosamburusasaksantalingambaysangusicilianoescocêscurdo meridiona" + + "lsenecasenaselkupkoyraboro senniirlandês arcaicotachelhitshanárabe chadi" + + "anosidamosami do sulsami de Lulesami de Inarisami de Skoltsoninquêsogdia" + + "noidioma surinamêssereresahosukumasossosumériocomorianosuaíli do Congosi" + + "ríaco clássicosiríacotimnetesoterenotétumtigrétivtoquelauanoklingontling" + + "uitetamaxequetonganês de Nyasatok pisintarokotsimshiantumbukatuvaluanota" + + "sawaqtuvinianotamazight do Atlas Centraludmurtugaríticoumbunduidioma des" + + "conhecidovaivoticvunjowalserwalamowaraywashowarlpirikalmyklusogayaoyapes" + + "eyangbenyembacantonêszapotecasímbolos bliszenagatamazight marroquino pad" + + "rãozunhisem conteúdo linguísticozazaárabe modernoazeri sulalemão austría" + + "coalto alemão suíçoinglês australianoinglês canadenseinglês britânicoing" + + "lês americanoespanhol latino-americanoespanhol europeuespanhol mexicanof" + + "rancês canadensefrancês suíçobaixo-saxãoflamengoportuguês do Brasilportu" + + "guês europeumoldávioservo-croatachinês simplificadochinês tradicional" + +var ptLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000c, 0x0015, 0x001f, 0x0023, 0x002b, 0x0034, + 0x003a, 0x0042, 0x0048, 0x004e, 0x0059, 0x0060, 0x006b, 0x0073, + 0x007b, 0x0082, 0x0089, 0x0091, 0x0098, 0x009f, 0x00a7, 0x00af, + 0x00b7, 0x00bf, 0x00c3, 0x00c9, 0x00dd, 0x00e6, 0x00ec, 0x00f8, + 0x00ff, 0x0105, 0x010b, 0x010e, 0x0113, 0x011a, 0x0123, 0x012b, + 0x0134, 0x0139, 0x013e, 0x0142, 0x014c, 0x0153, 0x015a, 0x0162, + 0x0173, 0x017c, 0x018d, 0x0193, 0x019a, 0x01a2, 0x01a6, 0x01ad, + 0x01b5, 0x01bb, 0x01c4, 0x01ca, 0x01d2, 0x01da, 0x01e2, 0x01e8, + // Entry 40 - 7F + 0x01f4, 0x01fe, 0x0209, 0x020c, 0x0216, 0x021f, 0x0222, 0x022b, + 0x0233, 0x023c, 0x0244, 0x024c, 0x0255, 0x025e, 0x0265, 0x026d, + 0x0274, 0x0280, 0x0285, 0x028d, 0x0294, 0x029b, 0x02a3, 0x02a8, + 0x02ac, 0x02b4, 0x02bc, 0x02c1, 0x02ce, 0x02d5, 0x02e0, 0x02e7, + 0x02ef, 0x02f6, 0x0302, 0x0308, 0x030f, 0x0319, 0x031e, 0x0328, + 0x0330, 0x0336, 0x033c, 0x0342, 0x0349, 0x0352, 0x035a, 0x036a, + 0x0370, 0x0375, 0x037e, 0x0390, 0x03a2, 0x03b0, 0x03b6, 0x03bc, + 0x03c7, 0x03cd, 0x03d2, 0x03d7, 0x03de, 0x03e5, 0x03ea, 0x03f2, + // Entry 80 - BF + 0x03f8, 0x0402, 0x040a, 0x0412, 0x0417, 0x041d, 0x0422, 0x042e, + 0x0438, 0x043d, 0x0442, 0x044f, 0x0454, 0x045d, 0x0465, 0x046d, + 0x0474, 0x0479, 0x047f, 0x0487, 0x048e, 0x0493, 0x049e, 0x04a7, + 0x04ac, 0x04b3, 0x04b9, 0x04bf, 0x04c6, 0x04d0, 0x04d9, 0x04e2, + 0x04e8, 0x04f1, 0x04f6, 0x04fc, 0x0501, 0x0509, 0x050e, 0x0517, + 0x051b, 0x0522, 0x0527, 0x0531, 0x053a, 0x0540, 0x0547, 0x054b, + 0x0553, 0x0559, 0x055f, 0x0566, 0x056a, 0x0570, 0x0575, 0x057c, + 0x0582, 0x0582, 0x058a, 0x058f, 0x0593, 0x059b, 0x059b, 0x05a2, + // Entry C0 - FF + 0x05a2, 0x05ae, 0x05bd, 0x05c3, 0x05cb, 0x05d5, 0x05d5, 0x05dc, + 0x05dc, 0x05e4, 0x05e4, 0x05e4, 0x05e7, 0x05e7, 0x05f0, 0x05f0, + 0x05f6, 0x05fe, 0x0606, 0x0606, 0x060a, 0x060f, 0x060f, 0x0619, + 0x061d, 0x0622, 0x0622, 0x0626, 0x062b, 0x062b, 0x063d, 0x0645, + 0x064a, 0x064e, 0x064e, 0x0651, 0x0658, 0x0658, 0x0658, 0x065c, + 0x065c, 0x0660, 0x0666, 0x066c, 0x0674, 0x0678, 0x067c, 0x0683, + 0x0688, 0x068e, 0x0694, 0x0699, 0x06a0, 0x06a5, 0x06ac, 0x06b4, + 0x06bc, 0x06c0, 0x06ce, 0x06d5, 0x06de, 0x06e6, 0x06ed, 0x06fa, + // Entry 100 - 13F + 0x06ff, 0x06ff, 0x070f, 0x0718, 0x071e, 0x0724, 0x0729, 0x0731, + 0x0736, 0x073c, 0x0741, 0x0746, 0x074b, 0x0759, 0x0759, 0x075e, + 0x076e, 0x0778, 0x077e, 0x0784, 0x0788, 0x078e, 0x078e, 0x079e, + 0x07a4, 0x07ab, 0x07b9, 0x07b9, 0x07bf, 0x07bf, 0x07c5, 0x07cd, + 0x07cd, 0x07d0, 0x07d0, 0x07df, 0x07ef, 0x07ef, 0x0803, 0x0813, + 0x081b, 0x081d, 0x0823, 0x0823, 0x0827, 0x082c, 0x082c, 0x0830, + 0x083a, 0x083a, 0x084d, 0x0861, 0x0861, 0x0866, 0x086f, 0x0876, + 0x087b, 0x0888, 0x0897, 0x0897, 0x0897, 0x089c, 0x08a5, 0x08aa, + // Entry 140 - 17F + 0x08aa, 0x08b2, 0x08b2, 0x08bc, 0x08c2, 0x08c7, 0x08d4, 0x08d4, + 0x08d8, 0x08dc, 0x08e2, 0x08e9, 0x08f0, 0x08f0, 0x08f0, 0x08f6, + 0x08fd, 0x0904, 0x0911, 0x0921, 0x0921, 0x092c, 0x0932, 0x0938, + 0x093b, 0x0940, 0x0944, 0x094e, 0x0955, 0x0959, 0x0960, 0x096c, + 0x096c, 0x0970, 0x0970, 0x0975, 0x097e, 0x098a, 0x098a, 0x098a, + 0x098e, 0x0996, 0x099f, 0x09ab, 0x09b2, 0x09ba, 0x09c0, 0x09cf, + 0x09cf, 0x09cf, 0x09de, 0x09e4, 0x09ec, 0x09f1, 0x09f8, 0x09fd, + 0x0a04, 0x0a0a, 0x0a0f, 0x0a15, 0x0a1a, 0x0a22, 0x0a22, 0x0a22, + // Entry 180 - 1BF + 0x0a22, 0x0a28, 0x0a28, 0x0a2d, 0x0a31, 0x0a42, 0x0a42, 0x0a4c, + 0x0a53, 0x0a58, 0x0a5b, 0x0a61, 0x0a66, 0x0a66, 0x0a66, 0x0a6e, + 0x0a72, 0x0a78, 0x0a80, 0x0a87, 0x0a8f, 0x0a95, 0x0a99, 0x0a9e, + 0x0aa4, 0x0aa9, 0x0aad, 0x0ab5, 0x0ac5, 0x0aca, 0x0ad1, 0x0adb, + 0x0ae6, 0x0aec, 0x0af4, 0x0afb, 0x0b00, 0x0b00, 0x0b07, 0x0b19, + 0x0b1e, 0x0b27, 0x0b2e, 0x0b2e, 0x0b33, 0x0b38, 0x0b43, 0x0b43, + 0x0b4d, 0x0b51, 0x0b5e, 0x0b64, 0x0b68, 0x0b6f, 0x0b6f, 0x0b75, + 0x0b7e, 0x0b83, 0x0b93, 0x0b93, 0x0b99, 0x0baa, 0x0bae, 0x0bbe, + // Entry 1C0 - 1FF + 0x0bc6, 0x0bce, 0x0bd3, 0x0bd8, 0x0bdd, 0x0bea, 0x0bf4, 0x0bfb, + 0x0c03, 0x0c0d, 0x0c15, 0x0c15, 0x0c15, 0x0c15, 0x0c22, 0x0c22, + 0x0c2a, 0x0c2a, 0x0c2a, 0x0c33, 0x0c33, 0x0c45, 0x0c4c, 0x0c4c, + 0x0c55, 0x0c5c, 0x0c67, 0x0c67, 0x0c67, 0x0c6c, 0x0c72, 0x0c72, + 0x0c72, 0x0c72, 0x0c79, 0x0c7c, 0x0c83, 0x0c89, 0x0c9c, 0x0ca3, + 0x0ca8, 0x0caf, 0x0caf, 0x0cb6, 0x0cbb, 0x0cc4, 0x0ccc, 0x0ccc, + 0x0cdc, 0x0ce2, 0x0ce6, 0x0ce6, 0x0cec, 0x0cfb, 0x0d0c, 0x0d0c, + 0x0d15, 0x0d19, 0x0d28, 0x0d2e, 0x0d2e, 0x0d2e, 0x0d39, 0x0d45, + // Entry 200 - 23F + 0x0d52, 0x0d5f, 0x0d68, 0x0d70, 0x0d81, 0x0d87, 0x0d8b, 0x0d8b, + 0x0d91, 0x0d96, 0x0d9e, 0x0da7, 0x0db7, 0x0dc9, 0x0dd1, 0x0dd1, + 0x0dd1, 0x0dd6, 0x0dda, 0x0de0, 0x0de6, 0x0dec, 0x0def, 0x0dfa, + 0x0dfa, 0x0e01, 0x0e0a, 0x0e0a, 0x0e13, 0x0e25, 0x0e2e, 0x0e2e, + 0x0e34, 0x0e34, 0x0e3d, 0x0e3d, 0x0e44, 0x0e4d, 0x0e54, 0x0e5d, + 0x0e77, 0x0e7d, 0x0e87, 0x0e8e, 0x0ea1, 0x0ea4, 0x0ea4, 0x0ea4, + 0x0ea4, 0x0ea4, 0x0ea9, 0x0ea9, 0x0eae, 0x0eb4, 0x0eba, 0x0ebf, + 0x0ec4, 0x0ecc, 0x0ecc, 0x0ed2, 0x0ed2, 0x0ed8, 0x0edb, 0x0ee1, + // Entry 240 - 27F + 0x0ee8, 0x0eed, 0x0eed, 0x0ef6, 0x0efe, 0x0f0c, 0x0f0c, 0x0f12, + 0x0f2e, 0x0f33, 0x0f4d, 0x0f51, 0x0f5f, 0x0f68, 0x0f7a, 0x0f8e, + 0x0fa1, 0x0fb2, 0x0fc4, 0x0fd5, 0x0fee, 0x0ffe, 0x100f, 0x100f, + 0x1021, 0x1031, 0x103d, 0x1045, 0x1059, 0x106b, 0x1074, 0x1080, + 0x1094, 0x10a7, +} // Size: 1244 bytes + +var ptPTLangStr string = "" + // Size: 591 bytes + "africânderchecochuvasheweestóniofrísico ocidentalhaúçahindiarménioigboco" + + "nguêscanarimgandamacedónionorueguês nynorsknorueguês bokmålprovençalossé" + + "ticopolacopastókinyarwandaturcomanotongamapuchebamunghomalajargão chinoo" + + "ksorani curdobaixo sórabioegípcio clássicoinglês medievalfrancês medieva" + + "lfrísio orientalalemão medieval altogrego clássicoalto sórabiocabo-verdi" + + "anolezghianoluri do norteluoirlandês, medievalmohawkbaixo-alemãoromanêss" + + "akhaárabe do Chadelule samiinari samiskolt samirootvaisogaárabe moderno " + + "padrãoazeri meridionalinglês canadianofrancês canadiano" + +var ptPTLangIdx = []uint16{ // 601 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000b, 0x000b, 0x000b, 0x000b, + 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, + 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, + 0x000b, 0x000b, 0x000b, 0x0010, 0x0010, 0x0017, 0x0017, 0x0017, + 0x0017, 0x0017, 0x0017, 0x001a, 0x001a, 0x001a, 0x001a, 0x001a, + 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, + 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x003b, + 0x003b, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0048, 0x0048, + // Entry 40 - 7F + 0x0048, 0x0048, 0x0048, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, + 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x0054, 0x0054, 0x0054, + 0x0054, 0x0054, 0x0054, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, + 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x0060, 0x0060, 0x0060, + 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x006a, + 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, + 0x006a, 0x006a, 0x006a, 0x007c, 0x008e, 0x008e, 0x008e, 0x008e, + 0x0098, 0x0098, 0x0098, 0x0098, 0x00a1, 0x00a1, 0x00a1, 0x00a7, + // Entry 80 - BF + 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00b8, + 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, + 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, + 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00c1, + 0x00c1, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, + 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, + 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, + 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, + // Entry C0 - FF + 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00cd, 0x00cd, 0x00cd, + 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, + 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00d2, 0x00d2, 0x00d9, + 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, + 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, + 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, + 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, + 0x00d9, 0x00d9, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00f4, + // Entry 100 - 13F + 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, + 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x0102, 0x0102, 0x0102, + 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0114, + 0x0114, 0x0114, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, + 0x0124, 0x0124, 0x0124, 0x0135, 0x0135, 0x0135, 0x0135, 0x0145, + 0x0145, 0x0145, 0x0145, 0x0145, 0x0145, 0x0145, 0x0145, 0x0145, + 0x0145, 0x0145, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, 0x015a, + 0x015a, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, + // Entry 140 - 17F + 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0169, 0x0176, 0x0176, + 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, + 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, + 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0183, + 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, + 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, + 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, + 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, 0x018c, 0x018c, 0x018c, + // Entry 180 - 1BF + 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x0199, 0x0199, 0x0199, + 0x0199, 0x0199, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, + 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, 0x019c, + 0x019c, 0x019c, 0x019c, 0x019c, 0x01af, 0x01af, 0x01af, 0x01af, + 0x01af, 0x01af, 0x01af, 0x01b5, 0x01b5, 0x01b5, 0x01b5, 0x01b5, + 0x01b5, 0x01b5, 0x01b5, 0x01b5, 0x01b5, 0x01b5, 0x01b5, 0x01b5, + 0x01b5, 0x01b5, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, + 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, + // Entry 1C0 - 1FF + 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, + 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, + 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, + 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01ca, 0x01ca, + 0x01ca, 0x01ca, 0x01ca, 0x01ca, 0x01ca, 0x01cf, 0x01cf, 0x01cf, + 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, + 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, 0x01cf, + 0x01cf, 0x01cf, 0x01de, 0x01de, 0x01de, 0x01de, 0x01de, 0x01e7, + // Entry 200 - 23F + 0x01f1, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, + 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, + 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, + 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, + 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, + 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01ff, 0x0202, 0x0202, 0x0202, + 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, + 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, 0x0206, 0x0206, 0x0206, + // Entry 240 - 27F + 0x0206, 0x0206, 0x0206, 0x0206, 0x0206, 0x0206, 0x0206, 0x0206, + 0x0206, 0x0206, 0x0206, 0x0206, 0x021c, 0x022c, 0x022c, 0x022c, + 0x022c, 0x023d, 0x023d, 0x023d, 0x023d, 0x023d, 0x023d, 0x023d, + 0x024f, +} // Size: 1226 bytes + +var roLangStr string = "" + // Size: 4388 bytes + "afarabhazăavestanăafrikaansakanamharicăaragonezăarabăasamezăavarăaymaraa" + + "zerăbașkirăbielorusăbulgarăbislamabambarabengalezătibetanăbretonăbosniac" + + "ăcatalanăcecenăchamorrocorsicanăcreecehăslavonăciuvașăgalezădanezăgerma" + + "nădivehidzongkhaewegreacăenglezăesperantospaniolăestonianăbascăpersanăfu" + + "lahfinlandezăfijianăfaroezăfrancezăfrizonă occidentalăirlandezăgaelică s" + + "coțianăgalicianăguaranigujaratimanxhausaebraicăhindihiri motucroatăhaiti" + + "anămaghiarăarmeanăhererointerlinguaindonezianăinterlingueigbosichuan yii" + + "nupiakidoislandezăitalianăinuktitutjaponezăjavanezăgeorgianăcongolezăkik" + + "uyukuanyamakazahăkalaallisutkhmerăkannadacoreeanăkanuricașmirăkurdăkomic" + + "ornicăkârgâzălatinăluxemburghezăgandalimburghezălingalalaoțianălituanian" + + "ăluba-katangaletonămalgașămarshallezămaorimacedoneanămalayalammongolăma" + + "rathimalaezămaltezăbirmanezănaurundebele de nordnepalezăndonganeerlandez" + + "ănorvegiană nynorsknorvegiană bokmålndebele de sudnavajonyanjaoccitanăo" + + "jibwaoromooriyaosetăpunjabipalipolonezăpaștunăportughezăquechuaromanșăki" + + "rundiromânărusăkinyarwandasanscrităsardinianăsindhisami de nordsangosing" + + "halezăslovacăslovenăsamoanăshonasomalezăalbanezăsârbăswatisesothosundane" + + "zăsuedezăswahilitamilătelugutadjicăthailandezătigrinăturkmenăsetswanaton" + + "gaturcătsongatătarătahitianăuigurăucraineanăurduuzbecăvendavietnamezăvol" + + "apukvalonăwolofxhosaidișyorubazhuangchinezăzuluacehacoliadangmeadygheafr" + + "ihiliaghemainuakkadianăaleutăaltaică meridionalăengleză vecheangikaarama" + + "icămapuchearapahoarawakasuasturianăawadhibaluchibalinezăbasaabamunghomal" + + "abejabembabenabafutbaluchi occidentalăbhojpuribikolbinikomsiksikabrajbod" + + "oakooseburiatbuginezăbulublinmedumbacaddocaribcayugaatsamcebuanochigachi" + + "bchachagataichuukesemarijargon chinookchoctawchipewyancherokeecheyenneku" + + "rdă soranicoptăturcă crimeeanăcașubianădakotadargwataitadelawareslavedog" + + "ribdinkazarmadogrisorabă de josdualaolandeză mijlociejola-fonyidyuladaza" + + "gaembuefikegipteană vecheekajukelamităengleză mijlocieewondofangfilipine" + + "zăfonfranceză mijlociefranceză vechefrizonă nordicăfrizonă orientalăfriu" + + "lanăgagăgăuzăgayogbayageezgilbertinăgermană mijlocie înaltăgermană veche" + + " înaltăgondigorontalogoticăgrebogreacă vechegermană elvețianăgusiigwichʼ" + + "inhaidahawaiianăhiligaynonhitităhmongsorabă de sushupaibanibibioilokoing" + + "ușălojbanngombamachameiudeo-persanăiudeo-arabăkarakalpakkabylekachinjjuk" + + "ambakawikabardiankanembutyapmakondekabuverdianukorokhasilimbp khotanezăk" + + "oyra chiinikakokalenjinkimbundukomi-permiakkonkanikosraekpellekaraceai-b" + + "alkarkarelianăkurukhshambalabafiakölschkumykkutenailadinolangilahndalamb" + + "alezghianlakotamongoloziluri de nordluba-lulualuisenolundaluolusahiluyia" + + "madurezămafamagahimaithilimakasarmandingomasaimabamokshamandarmendemerum" + + "orisyenirlandeză mijlociemakhuwa-meettometa’micmacminangkabaumanciuriană" + + "manipurmohawkmossimundanglimbi multiplecreekmirandezămarwarimyeneerzyama" + + "zanderaninapolitanănamagermana de josnewariniasniueanăkwasiongiemboonnog" + + "ainordică vechen’kosotho de nordnuernewari clasicănyamwezinyankolenyoron" + + "zimaosageturcă otomanăpangasinanpahlavipampangapapiamentopalauanăpersană" + + " vechefenicianăpohnpeianăprovensală vechequichérajasthanirapanuirarotong" + + "anromboromaniaromânărwasandawesakhaaramaică samariteanăsamburusasaksanta" + + "lingambaysangusicilianăscotskurdă de sudsenecasenaselkupkoyraboro Sennii" + + "rlandeză vechetachelhitshanarabă ciadianăsidamosami de sudlule samiinari" + + " samiskolt samisoninkesogdiensranan tongoserersahosukumasususumerianăcom" + + "orezăswahili Congosiriacă clasicăsiriacătimnetesoterenotetumtigretivtoke" + + "lauklingonianătlingittamasheknyasa tongatok pisintarokotsimshiantumbukat" + + "uvalutasawaqtuvanătamazight central marocanăudmurtugariticăumbundurootva" + + "ivoticvunjowalserwalamowaraywashowarlpiricalmucăsogayaoyapezăyangbenyemb" + + "acantonezăzapotecăsimboluri Bilsszenagatamazight standard marocanăzunifa" + + "ră conținut lingvisticzazaarabă standard modernăgermană austriacăgermană" + + " standard elvețianăengleză australianăengleză canadianăengleză britanică" + + "engleză americanăspaniolă latino-americanăspaniolă europeanăspaniolă mex" + + "icanăfranceză canadianăfranceză elvețianăsaxona de josflamandăportugheză" + + " brazilianăportugheză europeanămoldoveneascăsârbo-croatăchineză simplifi" + + "catăchineză tradițională" + +var roLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000b, 0x0014, 0x001d, 0x0021, 0x002a, 0x0034, + 0x003a, 0x0042, 0x0048, 0x004e, 0x0054, 0x005d, 0x0067, 0x006f, + 0x0076, 0x007d, 0x0087, 0x0090, 0x0098, 0x00a1, 0x00aa, 0x00b1, + 0x00b9, 0x00c3, 0x00c7, 0x00cc, 0x00d4, 0x00dd, 0x00e4, 0x00eb, + 0x00f3, 0x00f9, 0x0101, 0x0104, 0x010b, 0x0113, 0x011c, 0x0125, + 0x012f, 0x0135, 0x013d, 0x0142, 0x014d, 0x0155, 0x015d, 0x0166, + 0x017b, 0x0185, 0x0198, 0x01a2, 0x01a9, 0x01b1, 0x01b5, 0x01ba, + 0x01c2, 0x01c7, 0x01d0, 0x01d7, 0x01e0, 0x01e9, 0x01f1, 0x01f7, + // Entry 40 - 7F + 0x0202, 0x020e, 0x0219, 0x021d, 0x0227, 0x022e, 0x0231, 0x023b, + 0x0244, 0x024d, 0x0256, 0x025f, 0x0269, 0x0273, 0x0279, 0x0281, + 0x0288, 0x0293, 0x029a, 0x02a1, 0x02aa, 0x02b0, 0x02b9, 0x02bf, + 0x02c3, 0x02cb, 0x02d5, 0x02dc, 0x02ea, 0x02ef, 0x02fb, 0x0302, + 0x030c, 0x0317, 0x0323, 0x032a, 0x0333, 0x033f, 0x0344, 0x0350, + 0x0359, 0x0361, 0x0368, 0x0370, 0x0378, 0x0382, 0x0387, 0x0396, + 0x039f, 0x03a5, 0x03b1, 0x03c4, 0x03d7, 0x03e5, 0x03eb, 0x03f1, + 0x03fa, 0x0400, 0x0405, 0x040a, 0x0410, 0x0417, 0x041b, 0x0424, + // Entry 80 - BF + 0x042d, 0x0438, 0x043f, 0x0448, 0x044f, 0x0457, 0x045c, 0x0467, + 0x0471, 0x047c, 0x0482, 0x048e, 0x0493, 0x049e, 0x04a6, 0x04ae, + 0x04b6, 0x04bb, 0x04c4, 0x04cd, 0x04d4, 0x04d9, 0x04e0, 0x04ea, + 0x04f2, 0x04f9, 0x0500, 0x0506, 0x050e, 0x051a, 0x0522, 0x052b, + 0x0533, 0x0538, 0x053e, 0x0544, 0x054c, 0x0556, 0x055d, 0x0568, + 0x056c, 0x0573, 0x0578, 0x0583, 0x058a, 0x0591, 0x0596, 0x059b, + 0x05a0, 0x05a6, 0x05ac, 0x05b4, 0x05b8, 0x05bc, 0x05c1, 0x05c8, + 0x05ce, 0x05ce, 0x05d6, 0x05db, 0x05df, 0x05e9, 0x05e9, 0x05f0, + // Entry C0 - FF + 0x05f0, 0x0605, 0x0613, 0x0619, 0x0622, 0x0629, 0x0629, 0x0630, + 0x0630, 0x0636, 0x0636, 0x0636, 0x0639, 0x0639, 0x0643, 0x0643, + 0x0649, 0x0650, 0x0659, 0x0659, 0x065e, 0x0663, 0x0663, 0x066a, + 0x066e, 0x0673, 0x0673, 0x0677, 0x067c, 0x067c, 0x0690, 0x0698, + 0x069d, 0x06a1, 0x06a1, 0x06a4, 0x06ab, 0x06ab, 0x06ab, 0x06af, + 0x06af, 0x06b3, 0x06b9, 0x06bf, 0x06c8, 0x06cc, 0x06d0, 0x06d7, + 0x06dc, 0x06e1, 0x06e7, 0x06ec, 0x06f3, 0x06f8, 0x06ff, 0x0707, + 0x070f, 0x0713, 0x0721, 0x0728, 0x0731, 0x0739, 0x0741, 0x074e, + // Entry 100 - 13F + 0x0754, 0x0754, 0x0765, 0x0770, 0x0776, 0x077c, 0x0781, 0x0789, + 0x078e, 0x0794, 0x0799, 0x079e, 0x07a3, 0x07b1, 0x07b1, 0x07b6, + 0x07c8, 0x07d2, 0x07d7, 0x07dd, 0x07e1, 0x07e5, 0x07e5, 0x07f5, + 0x07fb, 0x0803, 0x0814, 0x0814, 0x081a, 0x081a, 0x081e, 0x0829, + 0x0829, 0x082c, 0x082c, 0x083e, 0x084d, 0x084d, 0x085e, 0x0871, + 0x087a, 0x087c, 0x0886, 0x0886, 0x088a, 0x088f, 0x088f, 0x0893, + 0x089e, 0x089e, 0x08b8, 0x08cf, 0x08cf, 0x08d4, 0x08dd, 0x08e4, + 0x08e9, 0x08f6, 0x090a, 0x090a, 0x090a, 0x090f, 0x0918, 0x091d, + // Entry 140 - 17F + 0x091d, 0x0927, 0x0927, 0x0931, 0x0938, 0x093d, 0x094b, 0x094b, + 0x094f, 0x0953, 0x0959, 0x095e, 0x0966, 0x0966, 0x0966, 0x096c, + 0x0972, 0x0979, 0x0987, 0x0993, 0x0993, 0x099d, 0x09a3, 0x09a9, + 0x09ac, 0x09b1, 0x09b5, 0x09be, 0x09c5, 0x09c9, 0x09d0, 0x09dc, + 0x09dc, 0x09e0, 0x09e0, 0x09e5, 0x09f5, 0x0a01, 0x0a01, 0x0a01, + 0x0a05, 0x0a0d, 0x0a15, 0x0a21, 0x0a28, 0x0a2e, 0x0a34, 0x0a43, + 0x0a43, 0x0a43, 0x0a4d, 0x0a53, 0x0a5b, 0x0a60, 0x0a67, 0x0a6c, + 0x0a73, 0x0a79, 0x0a7e, 0x0a84, 0x0a89, 0x0a91, 0x0a91, 0x0a91, + // Entry 180 - 1BF + 0x0a91, 0x0a97, 0x0a97, 0x0a9c, 0x0aa0, 0x0aac, 0x0aac, 0x0ab6, + 0x0abd, 0x0ac2, 0x0ac5, 0x0acb, 0x0ad0, 0x0ad0, 0x0ad0, 0x0ad9, + 0x0add, 0x0ae3, 0x0aeb, 0x0af2, 0x0afa, 0x0aff, 0x0b03, 0x0b09, + 0x0b0f, 0x0b14, 0x0b18, 0x0b20, 0x0b33, 0x0b41, 0x0b48, 0x0b4e, + 0x0b59, 0x0b65, 0x0b6c, 0x0b72, 0x0b77, 0x0b77, 0x0b7e, 0x0b8c, + 0x0b91, 0x0b9b, 0x0ba2, 0x0ba2, 0x0ba7, 0x0bac, 0x0bb7, 0x0bb7, + 0x0bc2, 0x0bc6, 0x0bd4, 0x0bda, 0x0bde, 0x0be6, 0x0be6, 0x0bec, + 0x0bf5, 0x0bfa, 0x0c08, 0x0c08, 0x0c0e, 0x0c1b, 0x0c1f, 0x0c2e, + // Entry 1C0 - 1FF + 0x0c36, 0x0c3e, 0x0c43, 0x0c48, 0x0c4d, 0x0c5c, 0x0c66, 0x0c6d, + 0x0c75, 0x0c7f, 0x0c88, 0x0c88, 0x0c88, 0x0c88, 0x0c96, 0x0c96, + 0x0ca0, 0x0ca0, 0x0ca0, 0x0cab, 0x0cab, 0x0cbc, 0x0cc3, 0x0cc3, + 0x0ccd, 0x0cd4, 0x0cde, 0x0cde, 0x0cde, 0x0ce3, 0x0ce9, 0x0ce9, + 0x0ce9, 0x0ce9, 0x0cf2, 0x0cf5, 0x0cfc, 0x0d01, 0x0d17, 0x0d1e, + 0x0d23, 0x0d2a, 0x0d2a, 0x0d31, 0x0d36, 0x0d40, 0x0d45, 0x0d45, + 0x0d52, 0x0d58, 0x0d5c, 0x0d5c, 0x0d62, 0x0d71, 0x0d81, 0x0d81, + 0x0d8a, 0x0d8e, 0x0d9e, 0x0da4, 0x0da4, 0x0da4, 0x0daf, 0x0db8, + // Entry 200 - 23F + 0x0dc2, 0x0dcc, 0x0dd3, 0x0dda, 0x0de6, 0x0deb, 0x0def, 0x0def, + 0x0df5, 0x0df9, 0x0e03, 0x0e0c, 0x0e19, 0x0e2a, 0x0e32, 0x0e32, + 0x0e32, 0x0e37, 0x0e3b, 0x0e41, 0x0e46, 0x0e4b, 0x0e4e, 0x0e55, + 0x0e55, 0x0e61, 0x0e68, 0x0e68, 0x0e70, 0x0e7b, 0x0e84, 0x0e84, + 0x0e8a, 0x0e8a, 0x0e93, 0x0e93, 0x0e9a, 0x0ea0, 0x0ea7, 0x0eae, + 0x0ec9, 0x0ecf, 0x0ed9, 0x0ee0, 0x0ee4, 0x0ee7, 0x0ee7, 0x0ee7, + 0x0ee7, 0x0ee7, 0x0eec, 0x0eec, 0x0ef1, 0x0ef7, 0x0efd, 0x0f02, + 0x0f07, 0x0f0f, 0x0f0f, 0x0f17, 0x0f17, 0x0f1b, 0x0f1e, 0x0f25, + // Entry 240 - 27F + 0x0f2c, 0x0f31, 0x0f31, 0x0f3b, 0x0f44, 0x0f53, 0x0f53, 0x0f59, + 0x0f75, 0x0f79, 0x0f93, 0x0f97, 0x0faf, 0x0faf, 0x0fc2, 0x0fdf, + 0x0ff4, 0x1007, 0x101a, 0x102d, 0x1048, 0x105c, 0x106f, 0x106f, + 0x1083, 0x1098, 0x10a5, 0x10ae, 0x10c5, 0x10db, 0x10e9, 0x10f7, + 0x110d, 0x1124, +} // Size: 1244 bytes + +var ruLangStr string = "" + // Size: 9370 bytes + "афарабхазскийавестийскийафрикаансаканамхарскийарагонскийарабскийассамски" + + "йаварскийаймараазербайджанскийбашкирскийбелорусскийболгарскийбисламабам" + + "барийскийбенгальскийтибетскийбретонскийбоснийскийкаталанскийчеченскийча" + + "моррокорсиканскийкриийскийчешскийцерковнославянскийчувашскийваллийскийд" + + "атскийнемецкиймальдивскийдзонг-кээвегреческийанглийскийэсперантоиспанск" + + "ийэстонскийбаскскийперсидскийфулахфинскийфиджифарерскийфранцузскийзапад" + + "но-фризскийирландскийгэльскийгалисийскийгуаранигуджаратимэнскийхаусаивр" + + "итхиндихиримотухорватскийгаитянскийвенгерскийармянскийгерероинтерлингва" + + "индонезийскийинтерлингвеигбосычуаньинупиакидоисландскийитальянскийинукт" + + "итутяпонскийяванскийгрузинскийконгокикуйюкунамаказахскийгренландскийкхм" + + "ерскийканнадакорейскийканурикашмирикурдскийкомикорнийскийкиргизскийлати" + + "нскийлюксембургскийгандалимбургскийлингалалаосскийлитовскийлуба-катанга" + + "латышскиймалагасийскиймаршалльскиймаоримакедонскиймалаяламмонгольскийма" + + "ратхималайскиймальтийскийбирманскийнаурусеверный ндебелинепальскийндонг" + + "анидерландскийнорвежский нюнорскнорвежский букмолндебели южныйнавахонья" + + "нджаокситанскийоджибваоромоорияосетинскийпанджабипалипольскийпуштупорту" + + "гальскийкечуароманшскийрундирумынскийрусскийкиньяруандасанскритсардинск" + + "ийсиндхисеверносаамскийсангосингальскийсловацкийсловенскийсамоанскийшон" + + "асомалиалбанскийсербскийсвазисото южныйсунданскийшведскийсуахилитамильс" + + "кийтелугутаджикскийтайскийтигриньятуркменскийтсванатонганскийтурецкийтс" + + "онгататарскийтаитянскийуйгурскийукраинскийурдуузбекскийвендавьетнамский" + + "волапюкваллонскийволофкосаидишйорубачжуанькитайскийзулуачехскийачолиада" + + "нгмеадыгейскийафрихилиагхемайнуаккадскийалеутскийюжноалтайскийстароангл" + + "ийскийангикаарамейскийарауканскийарапахоаравакскийасуастурийскийавадхиб" + + "елуджскийбалийскийбасабамумгхомалабеджабембабенабафутзападно-белуджский" + + "бходжпурибикольскийбиникомсиксикабрауибодоакоосебурятскийбугийскийбулуб" + + "илин (блин)медумбакаддокарибкайюгаатсамкебуаночигачибчачагатайскийчукот" + + "скиймарийский (черемисский)чинук жаргончоктавчипевайянчерокичейеннсоран" + + "и курдскийкоптскийкрымско-татарскийкашубианскийдакотадаргватаитаделавар" + + "скийслейвидогрибдинказармадогринижнелужицкийдуаласредненидерландскийдьо" + + "ла-фоньидиула (дьюла)дазагскийэмбуэфикдревнеегипетскийэкаджукэламскийср" + + "еднеанглийскийэвондофангфилиппинскийфонсреднефранцузскийстарофранцузски" + + "йфризский северныйвосточный фризскийфриульскийгагагаузскийгайогбаягеэзг" + + "ильбертскийсредневерхненемецкийдревневерхненемецкийгондигоронталоготски" + + "йгребодревнегреческийшвейцарский немецкийгусиигвичинхайдагавайскийхилиг" + + "айнонхеттскийхмонгверхнелужицкийхупаибанскийибибиоилокоингушскийложбанн" + + "гомбамачамееврейско-персидскийеврейско-арабскийкаракалпакскийкабильский" + + "качинскийкаджикамбакавикабардинскийканембутьяпмакондекабувердьянукорокх" + + "асихотанскийкойра чииникакокаленджинкимбундийскийкоми-пермяцкийконканик" + + "осраенскийкпеллекарачаево-балкарскийкарельскийкурухшамбалабафиякёльшкум" + + "ыкскийкутенаиладинолангилахндаламбалезгинскийлакотамонголозисеверно-лур" + + "ийскийлуба-лулуалуисеньолундалуо (Кения и Танзания)лушайлухьямадурскийм" + + "афамагахимайтхилимакассарскиймандингомасаимабанскиймокшанскиймандарский" + + "мендемерумаврикийский креольскийсреднеирландскиймакуа-мееттометамикмакм" + + "инангкабауманьчжурскийманипурскиймохаукмосимундангнесколько языковкрикм" + + "ирандийскиймарваримиенеэрзямазендеранскийнеаполитанскийнаманижнегерманс" + + "кийневарскийниасниуэквасионгиембундногайскийстаронорвежскийнкосото севе" + + "рныйнуэрневари (классический)ньямвезиньянколеньоронзимаоседжистаротурец" + + "кийпангасинанпехлевийскийпампангапапьяментопалаустароперсидскийфиникийс" + + "кийпонапестаропровансальскийкичераджастханирапануираротонганскийромбоцы" + + "ганскийарумынскийруандасандавеякутскийсамаритянский арамейскийсамбуруса" + + "сакисанталингамбайскийсангусицилийскийшотландскийюжнокурдскийсенекасена" + + "селькупскийкойраборо сеннистароирландскийташельхитшанскийчадский арабсс" + + "идамаюжно-саамскийлуле-саамскийинари-саамскийскольт-саамскийсонинкесогд" + + "ийскийсранан тонгосерерсахосукумасусушумерскийкоморскийконголезский суа" + + "хиликлассический сирийскийсирийскийтемнетесотеренотетумтигретивитокелай" + + "скийклингонскийтлингиттамашекньяса (тонга)ток-писинтуройотарокоцимшиант" + + "умбукатувалутасавактувинскийсреднеатласский тамазигхтскийудмуртскийугар" + + "итскийумбундукорневой языкваиводскийвунджовалисскийволамоварайвашовальб" + + "ирикалмыцкийсогаяояпянбанйембакантонскийсапотекскийблиссимволиказенагск" + + "ийтамазигхтскийзуньибез языкового содержаниязазаарабский литературныйав" + + "стрийский немецкийшвейцарский верхненемецкийавстралийский английскийкан" + + "адский английскийбританский английскийамериканский английскийлатиноамер" + + "иканский испанскийевропейский испанскиймексиканский испанскийканадский " + + "французскийшвейцарский французскийнижнесаксонскийфламандскийбразильский" + + " португальскийевропейский португальскиймолдавскийсербскохорватскийупроще" + + "нный китайскийтрадиционный китайский" + +var ruLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0008, 0x001a, 0x0030, 0x0042, 0x004a, 0x005c, 0x0070, + 0x0080, 0x0092, 0x00a2, 0x00ae, 0x00cc, 0x00e0, 0x00f6, 0x010a, + 0x0118, 0x0130, 0x0146, 0x0158, 0x016c, 0x0180, 0x0196, 0x01a8, + 0x01b6, 0x01ce, 0x01e0, 0x01ee, 0x0212, 0x0224, 0x0238, 0x0246, + 0x0256, 0x026c, 0x027b, 0x0281, 0x0293, 0x02a7, 0x02b9, 0x02cb, + 0x02dd, 0x02ed, 0x0301, 0x030b, 0x0319, 0x0323, 0x0335, 0x034b, + 0x036a, 0x037e, 0x038e, 0x03a4, 0x03b2, 0x03c4, 0x03d2, 0x03dc, + 0x03e6, 0x03f0, 0x0400, 0x0414, 0x0428, 0x043c, 0x044e, 0x045a, + // Entry 40 - 7F + 0x0470, 0x048a, 0x04a0, 0x04a8, 0x04b6, 0x04c4, 0x04ca, 0x04de, + 0x04f4, 0x0506, 0x0516, 0x0526, 0x053a, 0x0544, 0x0550, 0x055c, + 0x056e, 0x0586, 0x0598, 0x05a6, 0x05b8, 0x05c4, 0x05d2, 0x05e2, + 0x05ea, 0x05fe, 0x0612, 0x0624, 0x0640, 0x064a, 0x0660, 0x066e, + 0x067e, 0x0690, 0x06a7, 0x06b9, 0x06d3, 0x06eb, 0x06f5, 0x070b, + 0x071b, 0x0731, 0x073f, 0x0751, 0x0767, 0x077b, 0x0785, 0x07a4, + 0x07b8, 0x07c4, 0x07de, 0x0801, 0x0822, 0x083b, 0x0847, 0x0855, + 0x086b, 0x0879, 0x0883, 0x088b, 0x089f, 0x08af, 0x08b7, 0x08c7, + // Entry 80 - BF + 0x08d1, 0x08eb, 0x08f5, 0x0909, 0x0913, 0x0925, 0x0933, 0x0949, + 0x0959, 0x096d, 0x0979, 0x0997, 0x09a1, 0x09b7, 0x09c9, 0x09dd, + 0x09f1, 0x09f9, 0x0a05, 0x0a17, 0x0a27, 0x0a31, 0x0a44, 0x0a58, + 0x0a68, 0x0a76, 0x0a8a, 0x0a96, 0x0aaa, 0x0ab8, 0x0ac8, 0x0ade, + 0x0aea, 0x0afe, 0x0b0e, 0x0b1a, 0x0b2c, 0x0b40, 0x0b52, 0x0b66, + 0x0b6e, 0x0b80, 0x0b8a, 0x0ba0, 0x0bae, 0x0bc2, 0x0bcc, 0x0bd4, + 0x0bdc, 0x0be8, 0x0bf4, 0x0c06, 0x0c0e, 0x0c1e, 0x0c28, 0x0c36, + 0x0c4a, 0x0c4a, 0x0c5a, 0x0c64, 0x0c6c, 0x0c7e, 0x0c7e, 0x0c90, + // Entry C0 - FF + 0x0c90, 0x0caa, 0x0cc8, 0x0cd4, 0x0ce8, 0x0cfe, 0x0cfe, 0x0d0c, + 0x0d0c, 0x0d20, 0x0d20, 0x0d20, 0x0d26, 0x0d26, 0x0d3c, 0x0d3c, + 0x0d48, 0x0d5c, 0x0d6e, 0x0d6e, 0x0d76, 0x0d80, 0x0d80, 0x0d8e, + 0x0d98, 0x0da2, 0x0da2, 0x0daa, 0x0db4, 0x0db4, 0x0dd7, 0x0de9, + 0x0dfd, 0x0e05, 0x0e05, 0x0e0b, 0x0e19, 0x0e19, 0x0e19, 0x0e23, + 0x0e23, 0x0e2b, 0x0e37, 0x0e49, 0x0e5b, 0x0e63, 0x0e78, 0x0e86, + 0x0e90, 0x0e9a, 0x0ea6, 0x0eb0, 0x0ebe, 0x0ec6, 0x0ed0, 0x0ee6, + 0x0ef8, 0x0f23, 0x0f3a, 0x0f46, 0x0f58, 0x0f64, 0x0f70, 0x0f8d, + // Entry 100 - 13F + 0x0f9d, 0x0f9d, 0x0fbe, 0x0fd6, 0x0fe2, 0x0fee, 0x0ff8, 0x100e, + 0x101a, 0x1026, 0x1030, 0x103a, 0x1044, 0x105e, 0x105e, 0x1068, + 0x108e, 0x10a3, 0x10ba, 0x10cc, 0x10d4, 0x10dc, 0x10dc, 0x10fc, + 0x110a, 0x111a, 0x113a, 0x113a, 0x1146, 0x1146, 0x114e, 0x1166, + 0x1166, 0x116c, 0x116c, 0x118e, 0x11ae, 0x11ae, 0x11cf, 0x11f2, + 0x1206, 0x120a, 0x121e, 0x121e, 0x1226, 0x122e, 0x122e, 0x1236, + 0x124e, 0x124e, 0x1276, 0x129e, 0x129e, 0x12a8, 0x12ba, 0x12c8, + 0x12d2, 0x12f0, 0x1317, 0x1317, 0x1317, 0x1321, 0x132d, 0x1337, + // Entry 140 - 17F + 0x1337, 0x1349, 0x1349, 0x135d, 0x136d, 0x1377, 0x1393, 0x1393, + 0x139b, 0x13ab, 0x13b7, 0x13c1, 0x13d3, 0x13d3, 0x13d3, 0x13df, + 0x13eb, 0x13f7, 0x141c, 0x143d, 0x143d, 0x1459, 0x146d, 0x147f, + 0x1489, 0x1493, 0x149b, 0x14b3, 0x14c1, 0x14c9, 0x14d7, 0x14ef, + 0x14ef, 0x14f7, 0x14f7, 0x1501, 0x1513, 0x1528, 0x1528, 0x1528, + 0x1530, 0x1542, 0x155c, 0x1577, 0x1585, 0x159b, 0x15a7, 0x15ce, + 0x15ce, 0x15ce, 0x15e2, 0x15ec, 0x15fa, 0x1604, 0x160e, 0x1620, + 0x162e, 0x163a, 0x1644, 0x1650, 0x165a, 0x166e, 0x166e, 0x166e, + // Entry 180 - 1BF + 0x166e, 0x167a, 0x167a, 0x1684, 0x168c, 0x16ad, 0x16ad, 0x16c0, + 0x16d0, 0x16da, 0x1701, 0x170b, 0x1715, 0x1715, 0x1715, 0x1727, + 0x172f, 0x173b, 0x174b, 0x1763, 0x1773, 0x177d, 0x178f, 0x17a3, + 0x17b7, 0x17c1, 0x17c9, 0x17f6, 0x1816, 0x182d, 0x1835, 0x1841, + 0x1857, 0x186f, 0x1885, 0x1891, 0x1899, 0x1899, 0x18a7, 0x18c6, + 0x18ce, 0x18e6, 0x18f4, 0x18f4, 0x18fe, 0x1906, 0x1922, 0x1922, + 0x193e, 0x1946, 0x1964, 0x1976, 0x197e, 0x1986, 0x1986, 0x1992, + 0x19a4, 0x19b6, 0x19d4, 0x19d4, 0x19da, 0x19f3, 0x19fb, 0x1a22, + // Entry 1C0 - 1FF + 0x1a32, 0x1a42, 0x1a4c, 0x1a56, 0x1a62, 0x1a7c, 0x1a90, 0x1aa8, + 0x1ab8, 0x1acc, 0x1ad6, 0x1ad6, 0x1ad6, 0x1ad6, 0x1af4, 0x1af4, + 0x1b0a, 0x1b0a, 0x1b0a, 0x1b16, 0x1b16, 0x1b3c, 0x1b44, 0x1b44, + 0x1b5a, 0x1b68, 0x1b84, 0x1b84, 0x1b84, 0x1b8e, 0x1ba0, 0x1ba0, + 0x1ba0, 0x1ba0, 0x1bb4, 0x1bc0, 0x1bce, 0x1bde, 0x1c0d, 0x1c1b, + 0x1c27, 0x1c35, 0x1c35, 0x1c4b, 0x1c55, 0x1c6b, 0x1c81, 0x1c81, + 0x1c99, 0x1ca5, 0x1cad, 0x1cad, 0x1cc3, 0x1ce0, 0x1cfe, 0x1cfe, + 0x1d10, 0x1d1e, 0x1d37, 0x1d43, 0x1d43, 0x1d43, 0x1d5c, 0x1d75, + // Entry 200 - 23F + 0x1d90, 0x1dad, 0x1dbb, 0x1dcf, 0x1de6, 0x1df0, 0x1df8, 0x1df8, + 0x1e04, 0x1e0c, 0x1e1e, 0x1e30, 0x1e57, 0x1e82, 0x1e94, 0x1e94, + 0x1e94, 0x1e9e, 0x1ea6, 0x1eb2, 0x1ebc, 0x1ec6, 0x1ece, 0x1ee4, + 0x1ee4, 0x1efa, 0x1f08, 0x1f08, 0x1f16, 0x1f2d, 0x1f3e, 0x1f4a, + 0x1f56, 0x1f56, 0x1f64, 0x1f64, 0x1f72, 0x1f7e, 0x1f8c, 0x1f9e, + 0x1fd7, 0x1feb, 0x1fff, 0x200d, 0x2026, 0x202c, 0x202c, 0x202c, + 0x202c, 0x202c, 0x203a, 0x203a, 0x2046, 0x2058, 0x2064, 0x206e, + 0x2076, 0x2086, 0x2086, 0x2098, 0x2098, 0x20a0, 0x20a4, 0x20a8, + // Entry 240 - 27F + 0x20b2, 0x20bc, 0x20bc, 0x20d0, 0x20e6, 0x2100, 0x2100, 0x2112, + 0x212c, 0x2136, 0x2164, 0x216c, 0x2195, 0x2195, 0x21bc, 0x21ef, + 0x221e, 0x2245, 0x226e, 0x229b, 0x22d2, 0x22fb, 0x2326, 0x2326, + 0x234f, 0x237c, 0x239a, 0x23b0, 0x23e1, 0x2412, 0x2426, 0x2448, + 0x246f, 0x249a, +} // Size: 1244 bytes + +var siLangStr string = "" + // Size: 5819 bytes + "ඇබ්කාසියානුඅප්\u200dරිකානුඅකාන්ඇම්හාරික්අරාබිඇසමියානුඅසර්බයිජාන්බාෂ්කිර්" + + "බෙලරුසියානුබල්ගේරියානුබම්බරාබෙංගාලිටිබෙට්බ්\u200dරේටොන්බොස්නියානුකැටලන" + + "්චෙච්නියානුක්\u200dරොඑශියානුචෙත්චවේෂ්වේල්ස්ඩැනිශ්ජර්මන්දිවෙහිඩිසොන්කාඉ" + + "ව්ග්\u200dරීකඉංග්\u200dරීසිඑස්පැරන්ටෝස්පාඤ්ඤඑස්තෝනියානුබොස්කෝපර්සියානු" + + "ෆින්ලන්තෆීජිෆාරෝස්ප්\u200dරංශබටහිර ෆ්\u200dරිසියානුඅයර්ලන්තගැලීසියානුග" + + "ුවාරනිගුජරාටිමැන්ක්ස්හෝසාහීබෲහින්දික්\u200dරෝයේශියානුහයිටිහන්ගේරියානුආ" + + "ර්මේනියානුඉන්දුනීසියානුඉග්බෝසිචුආන් යීඅයිස්ලන්තඉතාලිඉනුක්ටිටුට්ජපන්ජාව" + + "ාජෝර්ජියානුකිකුයුකසාඛ්කලාලිසට්කමර්කණ්ණඩකොරියානුකාෂ්මීර්කුර්දිකෝනීසියාන" + + "ුකිර්ගිස්ලතින්ලක්සැම්බර්ග්ගන්ඩාලින්ගලාලාඕලිතුවේනියානුලුලැට්වියානුමලගාස" + + "ිමාවොරිමැසිඩෝනියානුමලයාලම්මොංගෝලියානුමරාතිමැලේමොල්ටිස්බුරුමඋතුරු එන්ඩි" + + "බෙලෙනේපාලලන්දේසිනොවේර්ජියානු නයිනෝර්ස්ක්නෝවේජියානු බොක්මාල්ඔරොමෝඔරියාජ" + + "න්ජාබිපෝලන්තපෂ්ටොපෘතුගීසික්වීචුවාරොමෑන්ශ්රුන්ඩිරොමේනියානුරුසියානුකින්ය" + + "ර්වන්ඩාසංස්කෘතසින්ධිඋතුරු සාමිසන්ග්\u200dරෝසිංහලස්ලෝවැක්ස්ලෝවේනියානුශෝ" + + "නාසෝමාලිඇල්බේනියානුසර්බියානුසන්ඩනීසියානුස්වීඩන්ස්වාහිලිදෙමළතෙළිඟුටජික්" + + "තායිටිග්\u200dරින්යාටර්ක්මෙන්ටොංගාතුර්කිටාටර්උයිගර්යුක්රේනියානුඋර්දුඋස" + + "්බෙක්වියට්නාම්වොලොෆ්ශෝසායොරූබාචීනසුලුටියුනිසියනු අරාබිඇගම්මපුචෙඅසුබෙම්" + + "බාබෙනාබටහිර බලොචිබොඩොචිගාචෙරොකීසොරානි කුර්දිෂ්ටයිටාෆර්මාපහළ සෝබියානුඩු" + + "ආලාජොල-ෆෝනියිඑම්බුපිලිපීනගගාස්ස්විස් ජර්මනිගුසීහවායිඉහළ සෝබියානුනොම්බා" + + "මැකාමීකැබලාකැම්බාමැකොන්ඩ්කබුවෙර්ඩියානෝකොයිරා චිනිකලෙන්ජන්කොමි-පර්මියාක" + + "්කොන්කනිශාම්බලාබාෆියාලංගිලකොටඋතුරු ලුරිලුඔලුයියාමසායිමෙරුමොරිස්යෙම්මඛු" + + "වා-මීටෝමෙටාමොහොව්ක්මුන්ඩන්මැසන්ඩරනිනාමාපහළ ජර්මන්කුවාසිඔඑන්‘කෝනොයර්නයන" + + "්කොළේකියිචේරෝම්බෝර්වාසම්බුරුසංගුදකුණු කුර්දිසෙනාකෝයිරාබොරො සෙන්නිටචේල්" + + "හිට්දකුණු සාමිලුලේ සාමිඉනාරි සාමිස්කොල්ට් සාමිකොන්ගෝ ස්වාහිලිටෙසෝටසවාක" + + "්මධ්\u200dයම ඇට්ලස් ටමසිට්නොදන්නා භාෂාවවයිවුන්ජෝවොපිරිසොගාසම්මත මොරොක්" + + "කෝ ටමසිග්ත්වාග් විද්\u200dයා අන්තර්ගතයක් නැතනවීන සම්මත අරාබිඔස්ට්" + + "\u200dරියානු ජර්මන්ස්විස් උසස් ජර්මන්ඕස්ට්\u200dරේලියානු ඉංග්\u200dරීසික" + + "ැනේඩියානු ඉංග්\u200dරීසිබ්\u200dරිතාන්\u200dය ඉංග්\u200dරීසිඇමෙරිකානු " + + "ඉංග්\u200dරීසිලතින් ඇමරිකානු ස්පාඤ්ඤයුරෝපීය ස්පාඤ්ඤමෙක්සිකානු ස්පාඤ්ඤක" + + "ැනේඩියානු ප්\u200dරංශස්විස් ප්\u200dරංශපහළ සැක්සන්ෆ්ලෙමිශ්බ්\u200dරසීල" + + " පෘතුගීසියුරෝපීය පෘතුගීසිමොල්ඩෝවාවසුළුකළ චීනසාම්ප්\u200dරදායික චීන" + +var siLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0021, 0x0021, 0x003f, 0x004e, 0x0069, 0x0069, + 0x0078, 0x0090, 0x0090, 0x0090, 0x00b1, 0x00c9, 0x00ea, 0x010b, + 0x010b, 0x011d, 0x0132, 0x0144, 0x015f, 0x017d, 0x018f, 0x01ad, + 0x01ad, 0x01d1, 0x01d1, 0x01dd, 0x01dd, 0x01ec, 0x01fe, 0x0210, + 0x0222, 0x0234, 0x024c, 0x0255, 0x0267, 0x0282, 0x02a0, 0x02b5, + 0x02d6, 0x02e8, 0x0303, 0x0303, 0x031b, 0x0327, 0x0339, 0x034b, + 0x037c, 0x0394, 0x0394, 0x03b2, 0x03c7, 0x03dc, 0x03f4, 0x0400, + 0x040c, 0x041e, 0x041e, 0x0445, 0x0454, 0x0475, 0x0496, 0x0496, + // Entry 40 - 7F + 0x0496, 0x04bd, 0x04bd, 0x04cc, 0x04e8, 0x04e8, 0x04e8, 0x0503, + 0x0512, 0x0533, 0x053f, 0x054b, 0x0569, 0x0569, 0x057b, 0x057b, + 0x058a, 0x05a2, 0x05ae, 0x05bd, 0x05d5, 0x05d5, 0x05ed, 0x05ff, + 0x05ff, 0x061d, 0x0635, 0x0644, 0x0668, 0x0677, 0x0677, 0x068c, + 0x0695, 0x06b9, 0x06bf, 0x06dd, 0x06ef, 0x06ef, 0x0701, 0x0725, + 0x073a, 0x075b, 0x076a, 0x0776, 0x078e, 0x079d, 0x079d, 0x07c8, + 0x07d7, 0x07d7, 0x07ec, 0x0832, 0x0869, 0x0869, 0x0869, 0x0869, + 0x0869, 0x0869, 0x0878, 0x0887, 0x0887, 0x089c, 0x089c, 0x08ae, + // Entry 80 - BF + 0x08bd, 0x08d5, 0x08ed, 0x0905, 0x0917, 0x0935, 0x094d, 0x0971, + 0x0986, 0x0986, 0x0998, 0x09b4, 0x09cc, 0x09db, 0x09f3, 0x0a17, + 0x0a17, 0x0a23, 0x0a35, 0x0a56, 0x0a71, 0x0a71, 0x0a71, 0x0a95, + 0x0aaa, 0x0ac2, 0x0ace, 0x0ae0, 0x0aef, 0x0afb, 0x0b1c, 0x0b37, + 0x0b37, 0x0b46, 0x0b58, 0x0b58, 0x0b67, 0x0b67, 0x0b79, 0x0b9d, + 0x0bac, 0x0bc1, 0x0bc1, 0x0bdc, 0x0bdc, 0x0bdc, 0x0bee, 0x0bfa, + 0x0bfa, 0x0c0c, 0x0c0c, 0x0c15, 0x0c21, 0x0c21, 0x0c21, 0x0c21, + 0x0c21, 0x0c52, 0x0c52, 0x0c5e, 0x0c5e, 0x0c5e, 0x0c5e, 0x0c5e, + // Entry C0 - FF + 0x0c5e, 0x0c5e, 0x0c5e, 0x0c5e, 0x0c5e, 0x0c6d, 0x0c6d, 0x0c6d, + 0x0c6d, 0x0c6d, 0x0c6d, 0x0c6d, 0x0c76, 0x0c76, 0x0c76, 0x0c76, + 0x0c76, 0x0c76, 0x0c76, 0x0c76, 0x0c76, 0x0c76, 0x0c76, 0x0c76, + 0x0c76, 0x0c88, 0x0c88, 0x0c94, 0x0c94, 0x0c94, 0x0cb3, 0x0cb3, + 0x0cb3, 0x0cb3, 0x0cb3, 0x0cb3, 0x0cb3, 0x0cb3, 0x0cb3, 0x0cb3, + 0x0cb3, 0x0cbf, 0x0cbf, 0x0cbf, 0x0cbf, 0x0cbf, 0x0cbf, 0x0cbf, + 0x0cbf, 0x0cbf, 0x0cbf, 0x0cbf, 0x0cbf, 0x0ccb, 0x0ccb, 0x0ccb, + 0x0ccb, 0x0ccb, 0x0ccb, 0x0ccb, 0x0ccb, 0x0cdd, 0x0cdd, 0x0d08, + // Entry 100 - 13F + 0x0d08, 0x0d08, 0x0d08, 0x0d08, 0x0d08, 0x0d08, 0x0d17, 0x0d17, + 0x0d17, 0x0d17, 0x0d17, 0x0d26, 0x0d26, 0x0d48, 0x0d48, 0x0d57, + 0x0d57, 0x0d73, 0x0d73, 0x0d73, 0x0d82, 0x0d82, 0x0d82, 0x0d82, + 0x0d82, 0x0d82, 0x0d82, 0x0d82, 0x0d82, 0x0d82, 0x0d82, 0x0d97, + 0x0d97, 0x0d97, 0x0d97, 0x0d97, 0x0d97, 0x0d97, 0x0d97, 0x0d97, + 0x0d97, 0x0d97, 0x0da6, 0x0da6, 0x0da6, 0x0da6, 0x0da6, 0x0da6, + 0x0da6, 0x0da6, 0x0da6, 0x0da6, 0x0da6, 0x0da6, 0x0da6, 0x0da6, + 0x0da6, 0x0da6, 0x0dcb, 0x0dcb, 0x0dcb, 0x0dd7, 0x0dd7, 0x0dd7, + // Entry 140 - 17F + 0x0dd7, 0x0de6, 0x0de6, 0x0de6, 0x0de6, 0x0de6, 0x0e08, 0x0e08, + 0x0e08, 0x0e08, 0x0e08, 0x0e08, 0x0e08, 0x0e08, 0x0e08, 0x0e08, + 0x0e1a, 0x0e2c, 0x0e2c, 0x0e2c, 0x0e2c, 0x0e2c, 0x0e3b, 0x0e3b, + 0x0e3b, 0x0e4d, 0x0e4d, 0x0e4d, 0x0e4d, 0x0e4d, 0x0e65, 0x0e8c, + 0x0e8c, 0x0e8c, 0x0e8c, 0x0e8c, 0x0e8c, 0x0eab, 0x0eab, 0x0eab, + 0x0eab, 0x0ec3, 0x0ec3, 0x0eeb, 0x0f00, 0x0f00, 0x0f00, 0x0f00, + 0x0f00, 0x0f00, 0x0f00, 0x0f00, 0x0f15, 0x0f27, 0x0f27, 0x0f27, + 0x0f27, 0x0f27, 0x0f33, 0x0f33, 0x0f33, 0x0f33, 0x0f33, 0x0f33, + // Entry 180 - 1BF + 0x0f33, 0x0f3f, 0x0f3f, 0x0f3f, 0x0f3f, 0x0f5b, 0x0f5b, 0x0f5b, + 0x0f5b, 0x0f5b, 0x0f64, 0x0f64, 0x0f76, 0x0f76, 0x0f76, 0x0f76, + 0x0f76, 0x0f76, 0x0f76, 0x0f76, 0x0f76, 0x0f85, 0x0f85, 0x0f85, + 0x0f85, 0x0f85, 0x0f91, 0x0faf, 0x0faf, 0x0fcb, 0x0fd7, 0x0fd7, + 0x0fd7, 0x0fd7, 0x0fd7, 0x0fef, 0x0fef, 0x0fef, 0x1004, 0x1004, + 0x1004, 0x1004, 0x1004, 0x1004, 0x1004, 0x1004, 0x101f, 0x101f, + 0x101f, 0x102b, 0x1047, 0x1047, 0x1047, 0x1047, 0x1047, 0x105c, + 0x105c, 0x105c, 0x105c, 0x105c, 0x106e, 0x106e, 0x107d, 0x107d, + // Entry 1C0 - 1FF + 0x107d, 0x1095, 0x1095, 0x1095, 0x1095, 0x1095, 0x1095, 0x1095, + 0x1095, 0x1095, 0x1095, 0x1095, 0x1095, 0x1095, 0x1095, 0x1095, + 0x1095, 0x1095, 0x1095, 0x1095, 0x1095, 0x1095, 0x10a7, 0x10a7, + 0x10a7, 0x10a7, 0x10a7, 0x10a7, 0x10a7, 0x10b9, 0x10b9, 0x10b9, + 0x10b9, 0x10b9, 0x10b9, 0x10c5, 0x10c5, 0x10c5, 0x10c5, 0x10da, + 0x10da, 0x10da, 0x10da, 0x10da, 0x10e6, 0x10e6, 0x10e6, 0x10e6, + 0x1108, 0x1108, 0x1114, 0x1114, 0x1114, 0x1145, 0x1145, 0x1145, + 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x117c, 0x1195, + // Entry 200 - 23F + 0x11b1, 0x11d6, 0x11d6, 0x11d6, 0x11d6, 0x11d6, 0x11d6, 0x11d6, + 0x11d6, 0x11d6, 0x11d6, 0x11d6, 0x1201, 0x1201, 0x1201, 0x1201, + 0x1201, 0x1201, 0x120d, 0x120d, 0x120d, 0x120d, 0x120d, 0x120d, + 0x120d, 0x120d, 0x120d, 0x120d, 0x120d, 0x120d, 0x120d, 0x120d, + 0x120d, 0x120d, 0x120d, 0x120d, 0x120d, 0x120d, 0x121f, 0x121f, + 0x1257, 0x1257, 0x1257, 0x1257, 0x127c, 0x1285, 0x1285, 0x1285, + 0x1285, 0x1285, 0x1285, 0x1285, 0x1297, 0x1297, 0x1297, 0x1297, + 0x1297, 0x12a9, 0x12a9, 0x12a9, 0x12a9, 0x12b5, 0x12b5, 0x12b5, + // Entry 240 - 27F + 0x12b5, 0x12b5, 0x12b5, 0x12b5, 0x12b5, 0x12b5, 0x12b5, 0x12b5, + 0x12f6, 0x12f6, 0x1344, 0x1344, 0x1370, 0x1370, 0x13a7, 0x13d9, + 0x141f, 0x1459, 0x1496, 0x14cd, 0x150b, 0x1536, 0x156a, 0x156a, + 0x159b, 0x15c0, 0x15df, 0x15f7, 0x1625, 0x1653, 0x166e, 0x166e, + 0x168a, 0x16bb, +} // Size: 1244 bytes + +var skLangStr string = "" + // Size: 5626 bytes + "afarčinaabcházčinaavestčinaafrikánčinaakančinaamharčinaaragónčinaarabčin" + + "aásamčinaavarčinaaymarčinaazerbajdžančinabaškirčinabieloruštinabulharčin" + + "abislamabambarčinabengálčinatibetčinabretónčinabosniačtinakatalánčinačeč" + + "enčinačamorčinakorzičtinakríčeštinacirkevná slovančinačuvaštinawaleština" + + "dánčinanemčinadivehidzongkäeweštinagréčtinaangličtinaesperantošpanielčin" + + "aestónčinabaskičtinaperzštinafulbčinafínčinafidžijčinafaerčinafrancúzšti" + + "nazápadná frízštinaírčinaškótska gaelčinagalícijčinaguaraníjčinagudžarát" + + "činamančinahauštinahebrejčinahindčinahiri motuchorvátčinahaitčinamaďarč" + + "inaarménčinahererointerlinguaindonézštinainterlingueigboštinas’čchuanská" + + " ioštinainupiaqidoislandčinataliančinainuktitutjapončinajávčinagruzínčin" + + "akongčinakikujčinakuaňamakazaštinagrónčinakhmérčinakannadčinakórejčinaka" + + "nurijčinakašmírčinakurdčinakomijčinakornčinakirgizštinalatinčinaluxembur" + + "činagandčinalimburčinalingalčinalaoštinalitovčinalubčina (katanžská)lot" + + "yštinamalgaštinakajin-majolmaorijčinamacedónčinamalajálamčinamongolčinam" + + "aráthčinamalajčinamaltčinabarmčinanauruseverné ndebelenepálčinandongahol" + + "andčinanórčina (nynorsk)nórčina (bokmål)južná ndebelčinanavajočewaokcitá" + + "nčinaodžibvaoromčinauríjčinaosetčinapandžábčinapálípoľštinapaštčinaportu" + + "galčinakečuánčinarétorománčinakirundčinarumunčinaruštinakiňarwandasanskr" + + "itsardínčinasindhčinalapončina (severná)sangosinhalčinaslovenčinaslovinč" + + "inasamojčinašončinasomálčinaalbánčinasrbčinasvazijčinajužná sothčinasund" + + "činašvédčinasvahilčinatamilčinatelugčinatadžičtinathajčinatigriňaturkmé" + + "nčinatswančinatongčinaturečtinatsongatatárčinatahitčinaujgurčinaukrajinč" + + "inaurdčinauzbečtinavendčinavietnamčinavolapükvalónčinawolofčinaxhoštinaj" + + "idišjorubčinačuangčinačínštinazuluštinaacehčinaačoliadangmeadygčinaafrih" + + "iliaghemainčinaakkadčinaaleutčinajužná altajčinastará angličtinaangikaar" + + "amejčinaaraukánčinaarapahoarawačtinaasuastúrčinaavadhčinabalúčtinabalijč" + + "inabasabamunghomalabedžabembabenabafutzápadná balúčtinabhódžpurčinabikol" + + "binikomsiksikabradžčinabodoakooseburiatčinabugištinabulublinmedumbakaddo" + + "karibskýcayugaatsamcebuánčinakigačibčačagatajčinatrukmarijčinačinucký ža" + + "rgónčoktavčinačipevajčinačerokíčejenčinakurdčina (sorání)koptčinakrymská" + + " turečtinakašubčinadakotčinadarginčinataitadelawarčinaslovančinadogribči" + + "nadinkazarmadógrídolnolužická srbčinadualastredná holandčinajola-fonyiďu" + + "ladazagaembuefikstaroegyptskýekadžukelamčinastredná angličtinaewondofang" + + "činafilipínčinafončinastredná francúzštinastará francúzštinaseverná frí" + + "zštinavýchodná frízštinafriulčinagagagauzštinagayogbajaetiópčinakiribatč" + + "inastredná horná nemčinastará horná nemčinagóndčinagorontalogótčinagrebo" + + "starogréčtinanemčina (švajčiarska)gusiigwichʼinhaidahavajčinahiligajnonč" + + "inachetitčinahmonghornolužická srbčinahupčinaibančinaibibioilokánčinaing" + + "uštinalojbanngombamašamežidovská perzštinažidovská arabčinakarakalpačtin" + + "akabylčinakačjinčinajjukambakawikabardčinakanembutyapmakondekapverdčinak" + + "orokhasijčinachotančinazápadná songhajčinakakokalendžinkimbundukomi-perm" + + "iačtinakonkánčinakusaiekpellekaračajevsko-balkarský jazykkarelčinakurukh" + + "činašambalabafiakolínčinakumyčtinakutenajčinažidovská španielčinalangil" + + "ahandčinalambalezginčinalakotčinamongoloziseverné luriluba-luluánčinalui" + + "seňolundaluomizorámčinaluhjamadurčinamafamagadhčinamaithilčinamakasarčin" + + "amandingomasajčinamabamokšiančinamandarčinamendimerumaurícijská kreolčin" + + "astredná írčinamakua-meettometa’mikmakčinaminangkabaučinamandžuštinamaní" + + "purčinamohawkčinamossimundangviaceré jazykykríkčinamirandčinamarawarimye" + + "neerzjančinamázandaránčinaneapolčinanamadolná nemčinanevárčinaniasánčina" + + "niueštinakwasiongiemboonnogajčinastará nórčinan’koseverná sothčinanuerkl" + + "asická nevárčinaňamweziňankoleňoronzimaosagčinaosmanská turečtinapangasi" + + "nančinapahlavípampangapapiamentopalaučinastará perzštinafeničtinapohnpei" + + "činastará okcitánčinakičéradžastančinarapanujčinararotonganromborómčina" + + "arumunčinarwasandawejakutčinasamaritánska aramejčinasamburusasačtinasant" + + "alčinangambaysangusicílčinaškótčinakurdčina (južná)senecasenaselkupčinak" + + "oyraboro sennistará írčinatachelhitšančinačadská arabčinasidamolapončina" + + " (južná)lapončina (lulská)lapončina (inarijská)lapončina (skoltská)sonin" + + "kesogdijčinasrananserersahosukumasususumerčinakomorčinasvahilčina (konžs" + + "ká)klasická sýrčinasýrčinatemnetesoterenotetumtigrejčinativtokelaučinakl" + + "ingónčinatlingitčinatamašekňasa tongatok pisintarokotsimshijské jazykytu" + + "mbukatuvalčinatasawaqtuviančinatamašek (stredomarocký)udmurtčinaugaritči" + + "naumbundukoreňvaivodčinavunjowalserčinawalamowaraywashowarlpirikalmyčtin" + + "asogajaojapčinajangbenyembakantončinazapotéčtinasystém Blisszenagatamaše" + + "k (štandardný marocký)zuništinabez jazykového obsahuzázáarabčina (modern" + + "á štandardná)nemčina (rakúska)nemčina (švajčiarska spisovná)angličtina " + + "(austrálska)angličtina (kanadská)angličtina (britská)angličtina (americk" + + "á)španielčina (latinskoamerická)španielčina (európska)španielčina (mexi" + + "cká)francúzština (kanadská)francúzština (švajčiarska)dolná saštinaflámči" + + "naportugalčina (brazílska)portugalčina (európska)moldavčinasrbochorvátči" + + "načínština (zjednodušená)čínština (tradičná)" + +var skLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0009, 0x0015, 0x001f, 0x002c, 0x0035, 0x003f, 0x004b, + 0x0054, 0x005e, 0x0067, 0x0071, 0x0082, 0x008e, 0x009b, 0x00a6, + 0x00ad, 0x00b8, 0x00c4, 0x00ce, 0x00da, 0x00e6, 0x00f3, 0x00ff, + 0x010a, 0x0115, 0x0119, 0x0122, 0x0137, 0x0142, 0x014c, 0x0155, + 0x015d, 0x0163, 0x016b, 0x0174, 0x017e, 0x0189, 0x0192, 0x019f, + 0x01aa, 0x01b5, 0x01bf, 0x01c8, 0x01d1, 0x01dd, 0x01e6, 0x01f4, + 0x0209, 0x0211, 0x0224, 0x0231, 0x023f, 0x024e, 0x0256, 0x025f, + 0x026a, 0x0273, 0x027c, 0x0289, 0x0292, 0x029d, 0x02a8, 0x02ae, + // Entry 40 - 7F + 0x02b9, 0x02c7, 0x02d2, 0x02dc, 0x02f4, 0x02fb, 0x02fe, 0x0309, + 0x0314, 0x031d, 0x0327, 0x0330, 0x033c, 0x0345, 0x034f, 0x0357, + 0x0361, 0x036b, 0x0376, 0x0381, 0x038c, 0x0398, 0x03a5, 0x03ae, + 0x03b8, 0x03c1, 0x03cd, 0x03d7, 0x03e4, 0x03ed, 0x03f8, 0x0403, + 0x040c, 0x0416, 0x042c, 0x0436, 0x0441, 0x044c, 0x0457, 0x0464, + 0x0473, 0x047e, 0x048a, 0x0494, 0x049d, 0x04a6, 0x04ab, 0x04bb, + 0x04c6, 0x04cc, 0x04d7, 0x04ea, 0x04fd, 0x0510, 0x0516, 0x051b, + 0x0528, 0x0530, 0x0539, 0x0543, 0x054c, 0x055a, 0x0560, 0x056a, + // Entry 80 - BF + 0x0574, 0x0581, 0x058e, 0x059e, 0x05a9, 0x05b3, 0x05bb, 0x05c6, + 0x05ce, 0x05da, 0x05e4, 0x05f9, 0x05fe, 0x0609, 0x0614, 0x061f, + 0x0629, 0x0632, 0x063d, 0x0648, 0x0650, 0x065b, 0x066c, 0x0675, + 0x0680, 0x068b, 0x0695, 0x069f, 0x06ab, 0x06b4, 0x06bc, 0x06c9, + 0x06d3, 0x06dc, 0x06e6, 0x06ec, 0x06f7, 0x0701, 0x070b, 0x0717, + 0x071f, 0x0729, 0x0732, 0x073e, 0x0746, 0x0751, 0x075b, 0x0764, + 0x076a, 0x0774, 0x077f, 0x078a, 0x0794, 0x079d, 0x07a3, 0x07aa, + 0x07b3, 0x07b3, 0x07bb, 0x07c0, 0x07c8, 0x07d2, 0x07d2, 0x07dc, + // Entry C0 - FF + 0x07dc, 0x07ee, 0x0800, 0x0806, 0x0811, 0x081e, 0x081e, 0x0825, + 0x0825, 0x0830, 0x0830, 0x0830, 0x0833, 0x0833, 0x083e, 0x083e, + 0x0848, 0x0853, 0x085d, 0x085d, 0x0861, 0x0866, 0x0866, 0x086d, + 0x0873, 0x0878, 0x0878, 0x087c, 0x0881, 0x0881, 0x0896, 0x08a5, + 0x08aa, 0x08ae, 0x08ae, 0x08b1, 0x08b8, 0x08b8, 0x08b8, 0x08c3, + 0x08c3, 0x08c7, 0x08cd, 0x08d8, 0x08e2, 0x08e6, 0x08ea, 0x08f1, + 0x08f6, 0x08ff, 0x0905, 0x090a, 0x0916, 0x091a, 0x0921, 0x092e, + 0x0932, 0x093c, 0x094e, 0x095a, 0x0967, 0x096f, 0x097a, 0x098e, + // Entry 100 - 13F + 0x0997, 0x0997, 0x09aa, 0x09b5, 0x09bf, 0x09ca, 0x09cf, 0x09db, + 0x09e6, 0x09f1, 0x09f6, 0x09fb, 0x0a02, 0x0a19, 0x0a19, 0x0a1e, + 0x0a32, 0x0a3c, 0x0a41, 0x0a47, 0x0a4b, 0x0a4f, 0x0a4f, 0x0a5d, + 0x0a65, 0x0a6e, 0x0a82, 0x0a82, 0x0a88, 0x0a88, 0x0a91, 0x0a9e, + 0x0a9e, 0x0aa6, 0x0aa6, 0x0abd, 0x0ad2, 0x0ad2, 0x0ae6, 0x0afc, + 0x0b06, 0x0b08, 0x0b14, 0x0b14, 0x0b18, 0x0b1d, 0x0b1d, 0x0b28, + 0x0b34, 0x0b34, 0x0b4c, 0x0b62, 0x0b62, 0x0b6c, 0x0b75, 0x0b7e, + 0x0b83, 0x0b92, 0x0baa, 0x0baa, 0x0baa, 0x0baf, 0x0bb8, 0x0bbd, + // Entry 140 - 17F + 0x0bbd, 0x0bc7, 0x0bc7, 0x0bd6, 0x0be1, 0x0be6, 0x0bfd, 0x0bfd, + 0x0c05, 0x0c0e, 0x0c14, 0x0c20, 0x0c2a, 0x0c2a, 0x0c2a, 0x0c30, + 0x0c36, 0x0c3d, 0x0c52, 0x0c66, 0x0c66, 0x0c75, 0x0c7f, 0x0c8b, + 0x0c8e, 0x0c93, 0x0c97, 0x0ca2, 0x0ca9, 0x0cad, 0x0cb4, 0x0cc0, + 0x0cc0, 0x0cc4, 0x0cc4, 0x0ccf, 0x0cda, 0x0cf0, 0x0cf0, 0x0cf0, + 0x0cf4, 0x0cfe, 0x0d06, 0x0d17, 0x0d23, 0x0d29, 0x0d2f, 0x0d4d, + 0x0d4d, 0x0d4d, 0x0d57, 0x0d62, 0x0d6a, 0x0d6f, 0x0d7a, 0x0d84, + 0x0d90, 0x0da8, 0x0dad, 0x0db8, 0x0dbd, 0x0dc8, 0x0dc8, 0x0dc8, + // Entry 180 - 1BF + 0x0dc8, 0x0dd2, 0x0dd2, 0x0dd7, 0x0ddb, 0x0de8, 0x0de8, 0x0df9, + 0x0e01, 0x0e06, 0x0e09, 0x0e16, 0x0e1b, 0x0e1b, 0x0e1b, 0x0e25, + 0x0e29, 0x0e34, 0x0e40, 0x0e4c, 0x0e54, 0x0e5e, 0x0e62, 0x0e6f, + 0x0e7a, 0x0e7f, 0x0e83, 0x0e9b, 0x0eac, 0x0eb8, 0x0ebf, 0x0eca, + 0x0eda, 0x0ee7, 0x0ef4, 0x0eff, 0x0f04, 0x0f04, 0x0f0b, 0x0f1a, + 0x0f24, 0x0f2f, 0x0f37, 0x0f37, 0x0f3c, 0x0f47, 0x0f58, 0x0f58, + 0x0f63, 0x0f67, 0x0f76, 0x0f81, 0x0f8d, 0x0f97, 0x0f97, 0x0f9d, + 0x0fa6, 0x0fb0, 0x0fc0, 0x0fc0, 0x0fc6, 0x0fd8, 0x0fdc, 0x0ff1, + // Entry 1C0 - 1FF + 0x0ff9, 0x1001, 0x1006, 0x100b, 0x1014, 0x1028, 0x1037, 0x103f, + 0x1047, 0x1051, 0x105b, 0x105b, 0x105b, 0x105b, 0x106c, 0x106c, + 0x1076, 0x1076, 0x1076, 0x1082, 0x1082, 0x1096, 0x109c, 0x109c, + 0x10ab, 0x10b7, 0x10c1, 0x10c1, 0x10c1, 0x10c6, 0x10cf, 0x10cf, + 0x10cf, 0x10cf, 0x10da, 0x10dd, 0x10e4, 0x10ee, 0x1107, 0x110e, + 0x1118, 0x1123, 0x1123, 0x112a, 0x112f, 0x113a, 0x1145, 0x1145, + 0x1158, 0x115e, 0x1162, 0x1162, 0x116d, 0x117c, 0x118b, 0x118b, + 0x1194, 0x119d, 0x11af, 0x11b5, 0x11b5, 0x11b5, 0x11c9, 0x11dd, + // Entry 200 - 23F + 0x11f4, 0x120a, 0x1211, 0x121c, 0x1222, 0x1227, 0x122b, 0x122b, + 0x1231, 0x1235, 0x123f, 0x1249, 0x1260, 0x1273, 0x127c, 0x127c, + 0x127c, 0x1281, 0x1285, 0x128b, 0x1290, 0x129b, 0x129e, 0x12aa, + 0x12aa, 0x12b7, 0x12c3, 0x12c3, 0x12cb, 0x12d6, 0x12df, 0x12df, + 0x12e5, 0x12e5, 0x12f8, 0x12f8, 0x12ff, 0x1309, 0x1310, 0x131b, + 0x1334, 0x133f, 0x134a, 0x1351, 0x1357, 0x135a, 0x135a, 0x135a, + 0x135a, 0x135a, 0x1362, 0x1362, 0x1367, 0x1372, 0x1378, 0x137d, + 0x1382, 0x138a, 0x138a, 0x1395, 0x1395, 0x1399, 0x139c, 0x13a4, + // Entry 240 - 27F + 0x13ab, 0x13b0, 0x13b0, 0x13bb, 0x13c8, 0x13d5, 0x13d5, 0x13db, + 0x13fb, 0x1405, 0x141b, 0x1421, 0x1442, 0x1442, 0x1455, 0x1477, + 0x1490, 0x14a7, 0x14bd, 0x14d4, 0x14f5, 0x150e, 0x1526, 0x1526, + 0x1540, 0x155e, 0x156d, 0x1577, 0x1591, 0x15aa, 0x15b5, 0x15c6, + 0x15e2, 0x15fa, +} // Size: 1244 bytes + +var slLangStr string = "" + // Size: 6193 bytes + "afarščinaabhaščinaavestijščinaafrikanščinaakanščinaamharščinaaragonščina" + + "arabščinaasamščinaavarščinaajmarščinaazerbajdžanščinabaškirščinabelorušč" + + "inabolgarščinabislamščinabambarščinabengalščinatibetanščinabretonščinabo" + + "sanščinakatalonščinačečenščinačamorščinakorziščinakrijščinačeščinastara " + + "cerkvena slovanščinačuvaščinavaližanščinadanščinanemščinadiveščinadzonka" + + "evenščinagrščinaangleščinaesperantošpanščinaestonščinabaskovščinaperzijš" + + "činafulščinafinščinafidžijščinaferščinafrancoščinafrizijščinairščinaško" + + "tska gelščinagalicijščinagvaranijščinagudžaratščinamanščinahavščinahebre" + + "jščinahindujščinahiri motuhrvaščinahaitijska kreolščinamadžarščinaarmenš" + + "činahererointerlingvaindonezijščinainterlingveigboščinasečuanska jiščin" + + "ainupiaščinaidoislandščinaitalijanščinainuktitutščinajaponščinajavanščin" + + "agruzinščinakongovščinakikujščinakvanjamakazaščinagrenlandščinakmerščina" + + "kanadakorejščinakanurščinakašmirščinakurdščinakomijščinakornijščinakirgi" + + "ščinalatinščinaluksemburščinagandalimburščinalingalalaoščinalitovščinal" + + "uba-katangalatvijščinamalagaščinamarshallovščinamaorščinamakedonščinamal" + + "ajalamščinamongolščinamaratščinamalajščinamalteščinaburmanščinanaurujšči" + + "naseverna ndebelščinanepalščinanizozemščinanovonorveščinaknjižna norvešč" + + "inajužna ndebelščinanavajščinanjanščinaokcitanščinaanašinabščinaoromoori" + + "jščinaosetinščinapandžabščinapalijščinapoljščinapaštunščinaportugalščina" + + "kečuanščinaretoromanščinarundščinaromunščinaruščinaruandščinasanskrtsard" + + "inščinasindščinaseverna samijščinasangosingalščinaslovaščinaslovenščinas" + + "amoanščinašonščinasomalščinaalbanščinasrbščinasvazijščinasesotosundanšči" + + "našvedščinasvahilitamilščinatelugijščinatadžiščinatajščinatigrajščinatur" + + "kmenščinacvanščinatongščinaturščinatsongatatarščinatahitščinaujgurščinau" + + "krajinščinaurdujščinauzbeščinavendavietnamščinavolapukvalonščinavolofšči" + + "nakoščinajidišjorubščinakitajščinazulujščinaačejščinaačolijščinaadangmej" + + "ščinaadigejščinaafrihiliaghemščinaainujščinaakadščinaaleutščinajužna al" + + "tajščinastara angleščinaangikaščinaaramejščinaaravkanščinaarapaščinaarav" + + "aščinaasujščinaasturijščinaavadščinabeludžijščinabalijščinabasabedžabemb" + + "abenajščinazahodnobalučijščinabodžpuribikolski jezikedosiksikabradžbakan" + + "ščinabodojščinaburjatščinabuginščinablinščinakadoščinakaribski jezikseb" + + "uanščinačigajščinačibčevščinačagatajščinatrukeščinamarijščinačinuški žar" + + "gončoktavščinačipevščinačerokeščinačejenščinasoranska kurdščinakoptščina" + + "krimska tatarščinakašubščinadakotščinadarginščinataitajščinadelavarščina" + + "slavejščinadogribdinkazarmajščinadogridolnja lužiška srbščinadualasrednj" + + "a nizozemščinajola-fonjiščinadiulaembujščinaefiščinastara egipčanščinaek" + + "ajukelamščinasrednja angleščinaevondovščinafangijščinafilipinščinafonšči" + + "nasrednja francoščinastara francoščinaseverna frizijščinavzhodna frizijš" + + "činafurlanščinagagagavščinagajščinagbajščinaetiopščinakiribatščinasredn" + + "ja visoka nemščinastara visoka nemščinagondigorontalščinagotščinagrebšči" + + "nastara grščinanemščina (Švica)gusijščinahaidščinahavajščinahiligajnonšč" + + "inahetitščinahmonščinagornja lužiška srbščinahupaibanščinailokanščinaing" + + "uščinalojbanngombamačamejščinajudovska perzijščinajudovska arabščinakara" + + "kalpaščinakabilščinakačinščinakambaščinakavikabardinščinatjapska nigerij" + + "ščinamakondščinazelenortskootoška kreolščinakasikotanščinakoyra chiinik" + + "alenjinščinakimbundukomi-permjaščinakonkanščinakosrajščinakpelejščinakar" + + "ačaj-balkarščinakarelščinakurukshambalabafiakumiščinakutenajščinaladinšč" + + "inalangijščinalandalambalezginščinalakotščinamongolozisevernolurijščinal" + + "uba-lulualuisenščinalundaluolushailuhijščinamadurščinamagadščinamaitilim" + + "akasarščinamandingomasajščinamokšavščinamandarščinamendemerumorisjenščin" + + "asrednja irščinamakuva-metometamikmaščinaminangkabaumandžurščinamanipurš" + + "činamohoščinamosijščinamundangveč jezikovmirandeščinamarvarščinaerzjanš" + + "činamazanderanščinanapolitanščinakhoekhoenizka nemščinanevarščinaniašči" + + "naniuejščinakwasionogajščinastara nordijščinan’koseverna sotščinanueršči" + + "naklasična nevarščinanjamveščinanjankolenjoronzimaosageotomanska turščin" + + "apangasinanščinapampanščinapapiamentupalavanščinastara perzijščinafeniča" + + "nščinaponpejščinastara provansalščinaquicheradžastanščinarapanujščinarar" + + "otongščinaromboromščinaaromunščinarwajakutščinasamaritanska aramejščinas" + + "amburščinasasaščinasantalščinasangujščinasicilijanščinaškotščinajužna ku" + + "rdščinasenaselkupščinakoyraboro sennistara irščinatahelitska berberščina" + + "šanščinasidamščinajužna samijščinaluleška samijščinainarska samijščinas" + + "amijščina Skoltsurinamska kreolščinasererščinasukumasusujščinasumerščina" + + "šikomorsvahili (Kongo)klasična sirščinasirščinatemnejščinatesotetumščin" + + "atigrejščinativščinatokelavščinaklingonščinatlingitščinatamajaščinamalav" + + "ijska tongščinatok pisintsimščinatumbukščinatuvalujščinatasawaqtuvinščin" + + "atamašek (srednji atlas)udmurtščinaugaritski jezikumbundščinaneznan ali " + + "neveljaven jezikvajščinavotjaščinavunjovalamščinavarajščinavašajščinavar" + + "lpirščinakalmiščinasogščinajaojščinajapščinakantonščinazapoteščinaznakov" + + "ni jezik Blisszenaščinastandardni maroški tamazigzunijščinabrez jezikosl" + + "ovne vsebinezazajščinasodobna standardna arabščinaavstrijska nemščinavis" + + "oka nemščina (Švica)avstralska angleščinakanadska angleščinaangleščina (" + + "VB)angleščina (ZDA)latinskoameriška španščinaiberska španščinakanadska f" + + "rancoščinašvicarska francoščinanizka saščinaflamščinabrazilska portugalš" + + "činaiberska portugalščinamoldavščinasrbohrvaščinapoenostavljena kitajšč" + + "inatradicionalna kitajščina" + +var slLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000b, 0x0016, 0x0024, 0x0032, 0x003d, 0x0049, 0x0056, + 0x0061, 0x006c, 0x0077, 0x0083, 0x0096, 0x00a4, 0x00b1, 0x00be, + 0x00cb, 0x00d8, 0x00e5, 0x00f3, 0x0100, 0x010c, 0x011a, 0x0128, + 0x0135, 0x0141, 0x014c, 0x0156, 0x0172, 0x017e, 0x018d, 0x0197, + 0x01a1, 0x01ac, 0x01b2, 0x01bd, 0x01c6, 0x01d2, 0x01db, 0x01e7, + 0x01f3, 0x0200, 0x020d, 0x0217, 0x0221, 0x022f, 0x0239, 0x0246, + 0x0253, 0x025c, 0x026f, 0x027d, 0x028c, 0x029c, 0x02a6, 0x02b0, + 0x02bd, 0x02ca, 0x02d3, 0x02de, 0x02f4, 0x0302, 0x030e, 0x0314, + // Entry 40 - 7F + 0x031f, 0x032f, 0x033a, 0x0345, 0x0359, 0x0366, 0x0369, 0x0376, + 0x0385, 0x0395, 0x03a1, 0x03ad, 0x03ba, 0x03c7, 0x03d3, 0x03db, + 0x03e6, 0x03f5, 0x0400, 0x0406, 0x0412, 0x041e, 0x042c, 0x0437, + 0x0443, 0x0450, 0x045c, 0x0468, 0x0478, 0x047d, 0x048a, 0x0491, + 0x049b, 0x04a7, 0x04b3, 0x04c0, 0x04cd, 0x04de, 0x04e9, 0x04f7, + 0x0507, 0x0514, 0x0520, 0x052c, 0x0538, 0x0545, 0x0552, 0x0567, + 0x0573, 0x0573, 0x0581, 0x0591, 0x05a6, 0x05ba, 0x05c6, 0x05d1, + 0x05df, 0x05ef, 0x05f4, 0x05ff, 0x060c, 0x061b, 0x0627, 0x0632, + // Entry 80 - BF + 0x0640, 0x064f, 0x065d, 0x066d, 0x0678, 0x0684, 0x068d, 0x0699, + 0x06a0, 0x06ad, 0x06b8, 0x06cc, 0x06d1, 0x06de, 0x06ea, 0x06f7, + 0x0704, 0x070f, 0x071b, 0x0727, 0x0731, 0x073e, 0x0744, 0x0751, + 0x075d, 0x0764, 0x0770, 0x077e, 0x078b, 0x0795, 0x07a2, 0x07b0, + 0x07bb, 0x07c6, 0x07d0, 0x07d6, 0x07e2, 0x07ee, 0x07fa, 0x0808, + 0x0814, 0x081f, 0x0824, 0x0832, 0x0839, 0x0845, 0x0851, 0x085a, + 0x0860, 0x086c, 0x086c, 0x0878, 0x0884, 0x0890, 0x089e, 0x08ad, + 0x08ba, 0x08ba, 0x08c2, 0x08ce, 0x08da, 0x08e5, 0x08e5, 0x08f1, + // Entry C0 - FF + 0x08f1, 0x0904, 0x0916, 0x0923, 0x0930, 0x093e, 0x093e, 0x094a, + 0x094a, 0x0956, 0x0956, 0x0956, 0x0961, 0x0961, 0x096f, 0x096f, + 0x097a, 0x098a, 0x0996, 0x0996, 0x099a, 0x099a, 0x099a, 0x099a, + 0x09a0, 0x09a5, 0x09a5, 0x09b1, 0x09b1, 0x09b1, 0x09c7, 0x09d0, + 0x09de, 0x09e1, 0x09e1, 0x09e1, 0x09e8, 0x09e8, 0x09e8, 0x09fa, + 0x09fa, 0x0a06, 0x0a06, 0x0a13, 0x0a1f, 0x0a1f, 0x0a2a, 0x0a2a, + 0x0a35, 0x0a43, 0x0a43, 0x0a43, 0x0a50, 0x0a5d, 0x0a6c, 0x0a7b, + 0x0a87, 0x0a93, 0x0aa4, 0x0ab2, 0x0abf, 0x0acd, 0x0ada, 0x0aee, + // Entry 100 - 13F + 0x0af9, 0x0af9, 0x0b0d, 0x0b1a, 0x0b26, 0x0b33, 0x0b40, 0x0b4e, + 0x0b5b, 0x0b61, 0x0b66, 0x0b73, 0x0b78, 0x0b93, 0x0b93, 0x0b98, + 0x0bae, 0x0bbf, 0x0bc4, 0x0bc4, 0x0bd0, 0x0bda, 0x0bda, 0x0bef, + 0x0bf5, 0x0c00, 0x0c14, 0x0c14, 0x0c22, 0x0c22, 0x0c2f, 0x0c3d, + 0x0c3d, 0x0c47, 0x0c47, 0x0c5c, 0x0c6f, 0x0c6f, 0x0c84, 0x0c99, + 0x0ca6, 0x0ca8, 0x0cb4, 0x0cb4, 0x0cbe, 0x0cc9, 0x0cc9, 0x0cd5, + 0x0ce3, 0x0ce3, 0x0cfc, 0x0d13, 0x0d13, 0x0d18, 0x0d27, 0x0d31, + 0x0d3c, 0x0d4b, 0x0d5e, 0x0d5e, 0x0d5e, 0x0d6a, 0x0d6a, 0x0d75, + // Entry 140 - 17F + 0x0d75, 0x0d81, 0x0d81, 0x0d92, 0x0d9e, 0x0da9, 0x0dc4, 0x0dc4, + 0x0dc8, 0x0dd3, 0x0dd3, 0x0de0, 0x0deb, 0x0deb, 0x0deb, 0x0df1, + 0x0df7, 0x0e06, 0x0e1c, 0x0e30, 0x0e30, 0x0e40, 0x0e4c, 0x0e59, + 0x0e59, 0x0e65, 0x0e69, 0x0e78, 0x0e78, 0x0e8e, 0x0e9b, 0x0eba, + 0x0eba, 0x0eba, 0x0eba, 0x0ebe, 0x0eca, 0x0ed6, 0x0ed6, 0x0ed6, + 0x0ed6, 0x0ee5, 0x0eed, 0x0eff, 0x0f0c, 0x0f19, 0x0f26, 0x0f3c, + 0x0f3c, 0x0f3c, 0x0f48, 0x0f4d, 0x0f55, 0x0f5a, 0x0f5a, 0x0f65, + 0x0f73, 0x0f7f, 0x0f8c, 0x0f91, 0x0f96, 0x0fa3, 0x0fa3, 0x0fa3, + // Entry 180 - 1BF + 0x0fa3, 0x0faf, 0x0faf, 0x0fb4, 0x0fb8, 0x0fcb, 0x0fcb, 0x0fd5, + 0x0fe2, 0x0fe7, 0x0fea, 0x0ff0, 0x0ffc, 0x0ffc, 0x0ffc, 0x1008, + 0x1008, 0x1014, 0x101b, 0x1029, 0x1031, 0x103d, 0x103d, 0x104b, + 0x1058, 0x105d, 0x1061, 0x1070, 0x1081, 0x108c, 0x1090, 0x109c, + 0x10a7, 0x10b6, 0x10c4, 0x10cf, 0x10db, 0x10db, 0x10e2, 0x10ee, + 0x10ee, 0x10fc, 0x1109, 0x1109, 0x1109, 0x1116, 0x1127, 0x1127, + 0x1137, 0x113f, 0x114f, 0x115b, 0x1165, 0x1171, 0x1171, 0x1177, + 0x1177, 0x1183, 0x1196, 0x1196, 0x119c, 0x11ae, 0x11b9, 0x11cf, + // Entry 1C0 - 1FF + 0x11dc, 0x11e4, 0x11e9, 0x11ee, 0x11f3, 0x1207, 0x1218, 0x1218, + 0x1225, 0x122f, 0x123d, 0x123d, 0x123d, 0x123d, 0x1250, 0x1250, + 0x125f, 0x125f, 0x125f, 0x126c, 0x126c, 0x1282, 0x1288, 0x1288, + 0x1299, 0x12a7, 0x12b6, 0x12b6, 0x12b6, 0x12bb, 0x12c5, 0x12c5, + 0x12c5, 0x12c5, 0x12d2, 0x12d5, 0x12d5, 0x12e1, 0x12fb, 0x1308, + 0x1313, 0x1320, 0x1320, 0x1320, 0x132d, 0x133d, 0x1349, 0x1349, + 0x135b, 0x135b, 0x135f, 0x135f, 0x136c, 0x137b, 0x138a, 0x138a, + 0x13a2, 0x13ad, 0x13ad, 0x13b9, 0x13b9, 0x13b9, 0x13cc, 0x13e1, + // Entry 200 - 23F + 0x13f5, 0x1407, 0x1407, 0x1407, 0x141e, 0x142a, 0x142a, 0x142a, + 0x1430, 0x143c, 0x1448, 0x1450, 0x145f, 0x1473, 0x147d, 0x147d, + 0x147d, 0x148a, 0x148e, 0x148e, 0x149a, 0x14a7, 0x14b1, 0x14bf, + 0x14bf, 0x14cd, 0x14db, 0x14db, 0x14e8, 0x14fe, 0x1507, 0x1507, + 0x1507, 0x1507, 0x1512, 0x1512, 0x151f, 0x152d, 0x1534, 0x1540, + 0x1558, 0x1565, 0x1574, 0x1581, 0x159c, 0x15a6, 0x15a6, 0x15a6, + 0x15a6, 0x15a6, 0x15b2, 0x15b2, 0x15b7, 0x15b7, 0x15c3, 0x15cf, + 0x15dc, 0x15ea, 0x15ea, 0x15f6, 0x15f6, 0x1600, 0x160b, 0x1615, + // Entry 240 - 27F + 0x1615, 0x1615, 0x1615, 0x1622, 0x162f, 0x1643, 0x1643, 0x164e, + 0x1669, 0x1675, 0x168e, 0x169a, 0x16b8, 0x16b8, 0x16cd, 0x16e7, + 0x16fe, 0x1713, 0x1724, 0x1736, 0x1754, 0x1768, 0x1768, 0x1768, + 0x177e, 0x1796, 0x17a5, 0x17b0, 0x17c9, 0x17e0, 0x17ed, 0x17fc, + 0x1817, 0x1831, +} // Size: 1244 bytes + +var sqLangStr string = "" + // Size: 2672 bytes + "abkazishtafrikanishtakanishtamarikishtarabishtasamezishtazerbajxhanishtb" + + "ashkirishtbjellorusishtbullgarishtbambarishtbengalishttibetishtbretonish" + + "tboshnjakishtkatalonishtçeçenishtkorsikanishtçekishtçuvashishtuellsishtd" + + "anishtgjermanishtxhongaishtjuishtgreqishtanglishtesperantospanjishteston" + + "ishtbaskishtpersishtfinlandishtfixhianishtfaroishtfrëngjishtfrizianishti" + + "rlandishtgalikeguaranishtguxharatishtmanksishthausishthebraishtindishtkr" + + "oatishthaitianishthungarishtarmenishtindonezishtigboishtsishuanishtislan" + + "dishtitalishtinuktitutishtjaponishtjavanishtgjeorgjishtkikujuishtkazakis" + + "htkalalisutishtkmerekanadekoreanishtkashmirekurdekornishishtkirgizishtla" + + "tinishtluksemburgasegandishtlingalishtlaosishtlituanishtlubakatangishtle" + + "tonishtmalagezishtmaorishtmaqedonishtmalajalamishtmongolishtmaratishtmal" + + "ajishtmaltishtbirmanishtndebelishte veriorenepalishtholandishtninorske n" + + "orvegjezebokmalishte norvegjezeoromoishtorijaishtpanxhabishtpolonishtpas" + + "htoishtportugalishtkeçuaishtromerundishtrumanishtrusishtkiniaruandishtsa" + + "nskritishtsindishtsamishte verioresangoishtsinhalishtsllovakishtslloveni" + + "shtshonishtsomalishtshqipserbishtsundanishtsuedishtsuahilishttamiletelug" + + "etaxhikishttajlandishttigrinjeturkmenishttonganishtturqishttatarishtujgu" + + "reukrainishturduuzbekevietnamishtulufishtxhozaishtjorubishtkinezishtzulu" + + "ishtagemishtmapuçishtasuishtbembaishtbenaishtbalokishte perëndimorebodoi" + + "shtçigishtçerokishtkurdishte soranitaitishtzarmishtsorbishte e poshtmedu" + + "alaishtxhulafonjishtembuishtfilipinasegagauzishtgjermanishte zviceranegu" + + "sishthuajanishtsorbiane e sipërmengombishtmaçamishtkabilishtkambaishtmak" + + "ondishtkabuverdianishtkojraçinishtkalenjinishtkomishte permiakekonkanish" + + "tshambalishtbafianishtlangishtlakotishtlurishte verioreluoishtlujaishtma" + + "saishtmeruishtnorisjenemakuamitoishtmetaishtmohaukishtmundagishtemazande" + + "ranishtnamaishtegjermanishte e vendeve të ulëtakuasishtnkoishtnuerishtni" + + "ankolishtkiçeishtromboishteruaishtsamburishtsanguishtkurdishte jugoresen" + + "aishtesenishte kojraboretaçelitishtsamishte jugoresamishte lulejesamisht" + + "e inariesamishte skoltesuahilishte kongojetezoishttasaukishttamaziatisht" + + "e atlase qendroree panjohurvaishtvunjishtuarlipirishtsogishttamazishte s" + + "tandarde marokenenuk ka përmbajtje gjuhësorearabishte standarde moderneg" + + "jermanishte austriakegjermanishte zvicerane (dialekti i Alpeve)anglishte" + + " australianeanglishte kanadezeanglishte britanikeanglishte amerikanespan" + + "jishte amerikano-latinespanjishte evropianespanjishte meksikanefrëngjish" + + "te kanadezefrëngjishte zviceranegjermanishte saksone e vendeve të ulëtaf" + + "lamandishtportugalishte brazilianeportugalishte evropianemoldavishteSerb" + + "o-Kroatishtkinezishte e thjeshtuarkinezishte tradicionale" + +var sqLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0009, 0x0009, 0x0014, 0x001c, 0x0026, 0x0026, + 0x002e, 0x0038, 0x0038, 0x0038, 0x0047, 0x0052, 0x005f, 0x006a, + 0x006a, 0x0074, 0x007e, 0x0087, 0x0091, 0x009d, 0x00a8, 0x00b3, + 0x00b3, 0x00bf, 0x00bf, 0x00c7, 0x00c7, 0x00d2, 0x00db, 0x00e2, + 0x00ed, 0x00ed, 0x00f7, 0x00fd, 0x0105, 0x010d, 0x0116, 0x011f, + 0x0128, 0x0130, 0x0138, 0x0138, 0x0143, 0x014e, 0x0156, 0x0161, + 0x016c, 0x0176, 0x0176, 0x017c, 0x0186, 0x0192, 0x019b, 0x01a3, + 0x01ac, 0x01b3, 0x01b3, 0x01bc, 0x01c7, 0x01d1, 0x01da, 0x01da, + // Entry 40 - 7F + 0x01da, 0x01e5, 0x01e5, 0x01ed, 0x01f8, 0x01f8, 0x01f8, 0x0202, + 0x020a, 0x0217, 0x0220, 0x0229, 0x0234, 0x0234, 0x023e, 0x023e, + 0x0247, 0x0254, 0x0259, 0x025f, 0x0269, 0x0269, 0x0271, 0x0276, + 0x0276, 0x0281, 0x028b, 0x0294, 0x02a1, 0x02a9, 0x02a9, 0x02b3, + 0x02bb, 0x02c5, 0x02d3, 0x02dc, 0x02e7, 0x02e7, 0x02ef, 0x02fa, + 0x0307, 0x0311, 0x031a, 0x0323, 0x032b, 0x0335, 0x0335, 0x0348, + 0x0351, 0x0351, 0x035b, 0x036e, 0x0384, 0x0384, 0x0384, 0x0384, + 0x0384, 0x0384, 0x038d, 0x0396, 0x0396, 0x03a1, 0x03a1, 0x03aa, + // Entry 80 - BF + 0x03b4, 0x03c0, 0x03ca, 0x03ce, 0x03d6, 0x03df, 0x03e6, 0x03f4, + 0x0400, 0x0400, 0x0408, 0x0418, 0x0421, 0x042b, 0x0436, 0x0441, + 0x0441, 0x0449, 0x0452, 0x0457, 0x045f, 0x045f, 0x045f, 0x0469, + 0x0471, 0x047b, 0x0481, 0x0487, 0x0491, 0x049c, 0x04a4, 0x04af, + 0x04af, 0x04b9, 0x04c1, 0x04c1, 0x04ca, 0x04ca, 0x04d0, 0x04da, + 0x04de, 0x04e4, 0x04e4, 0x04ef, 0x04ef, 0x04ef, 0x04f7, 0x0500, + 0x0500, 0x0509, 0x0509, 0x0512, 0x051a, 0x051a, 0x051a, 0x051a, + 0x051a, 0x051a, 0x051a, 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, + // Entry C0 - FF + 0x0522, 0x0522, 0x0522, 0x0522, 0x0522, 0x052c, 0x052c, 0x052c, + 0x052c, 0x052c, 0x052c, 0x052c, 0x0533, 0x0533, 0x0533, 0x0533, + 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, + 0x0533, 0x053c, 0x053c, 0x0544, 0x0544, 0x0544, 0x055b, 0x055b, + 0x055b, 0x055b, 0x055b, 0x055b, 0x055b, 0x055b, 0x055b, 0x055b, + 0x055b, 0x0563, 0x0563, 0x0563, 0x0563, 0x0563, 0x0563, 0x0563, + 0x0563, 0x0563, 0x0563, 0x0563, 0x0563, 0x056b, 0x056b, 0x056b, + 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x0575, 0x0575, 0x0585, + // Entry 100 - 13F + 0x0585, 0x0585, 0x0585, 0x0585, 0x0585, 0x0585, 0x058d, 0x058d, + 0x058d, 0x058d, 0x058d, 0x0595, 0x0595, 0x05a8, 0x05a8, 0x05b1, + 0x05b1, 0x05be, 0x05be, 0x05be, 0x05c6, 0x05c6, 0x05c6, 0x05c6, + 0x05c6, 0x05c6, 0x05c6, 0x05c6, 0x05c6, 0x05c6, 0x05c6, 0x05d0, + 0x05d0, 0x05d0, 0x05d0, 0x05d0, 0x05d0, 0x05d0, 0x05d0, 0x05d0, + 0x05d0, 0x05d0, 0x05da, 0x05da, 0x05da, 0x05da, 0x05da, 0x05da, + 0x05da, 0x05da, 0x05da, 0x05da, 0x05da, 0x05da, 0x05da, 0x05da, + 0x05da, 0x05da, 0x05f0, 0x05f0, 0x05f0, 0x05f7, 0x05f7, 0x05f7, + // Entry 140 - 17F + 0x05f7, 0x0601, 0x0601, 0x0601, 0x0601, 0x0601, 0x0614, 0x0614, + 0x0614, 0x0614, 0x0614, 0x0614, 0x0614, 0x0614, 0x0614, 0x0614, + 0x061d, 0x0627, 0x0627, 0x0627, 0x0627, 0x0627, 0x0630, 0x0630, + 0x0630, 0x0639, 0x0639, 0x0639, 0x0639, 0x0639, 0x0643, 0x0652, + 0x0652, 0x0652, 0x0652, 0x0652, 0x0652, 0x065f, 0x065f, 0x065f, + 0x065f, 0x066b, 0x066b, 0x067c, 0x0686, 0x0686, 0x0686, 0x0686, + 0x0686, 0x0686, 0x0686, 0x0686, 0x0691, 0x069b, 0x069b, 0x069b, + 0x069b, 0x069b, 0x06a3, 0x06a3, 0x06a3, 0x06a3, 0x06a3, 0x06a3, + // Entry 180 - 1BF + 0x06a3, 0x06ac, 0x06ac, 0x06ac, 0x06ac, 0x06bc, 0x06bc, 0x06bc, + 0x06bc, 0x06bc, 0x06c3, 0x06c3, 0x06cb, 0x06cb, 0x06cb, 0x06cb, + 0x06cb, 0x06cb, 0x06cb, 0x06cb, 0x06cb, 0x06d3, 0x06d3, 0x06d3, + 0x06d3, 0x06d3, 0x06db, 0x06e4, 0x06e4, 0x06f1, 0x06f9, 0x06f9, + 0x06f9, 0x06f9, 0x06f9, 0x0703, 0x0703, 0x0703, 0x070e, 0x070e, + 0x070e, 0x070e, 0x070e, 0x070e, 0x070e, 0x070e, 0x071c, 0x071c, + 0x071c, 0x0725, 0x0746, 0x0746, 0x0746, 0x0746, 0x0746, 0x074e, + 0x074e, 0x074e, 0x074e, 0x074e, 0x0755, 0x0755, 0x075d, 0x075d, + // Entry 1C0 - 1FF + 0x075d, 0x0768, 0x0768, 0x0768, 0x0768, 0x0768, 0x0768, 0x0768, + 0x0768, 0x0768, 0x0768, 0x0768, 0x0768, 0x0768, 0x0768, 0x0768, + 0x0768, 0x0768, 0x0768, 0x0768, 0x0768, 0x0768, 0x0771, 0x0771, + 0x0771, 0x0771, 0x0771, 0x0771, 0x0771, 0x077b, 0x077b, 0x077b, + 0x077b, 0x077b, 0x077b, 0x0782, 0x0782, 0x0782, 0x0782, 0x078c, + 0x078c, 0x078c, 0x078c, 0x078c, 0x0795, 0x0795, 0x0795, 0x0795, + 0x07a5, 0x07a5, 0x07ae, 0x07ae, 0x07ae, 0x07c0, 0x07c0, 0x07c0, + 0x07cc, 0x07cc, 0x07cc, 0x07cc, 0x07cc, 0x07cc, 0x07db, 0x07ea, + // Entry 200 - 23F + 0x07f9, 0x0808, 0x0808, 0x0808, 0x0808, 0x0808, 0x0808, 0x0808, + 0x0808, 0x0808, 0x0808, 0x0808, 0x081b, 0x081b, 0x081b, 0x081b, + 0x081b, 0x081b, 0x0823, 0x0823, 0x0823, 0x0823, 0x0823, 0x0823, + 0x0823, 0x0823, 0x0823, 0x0823, 0x0823, 0x0823, 0x0823, 0x0823, + 0x0823, 0x0823, 0x0823, 0x0823, 0x0823, 0x0823, 0x082d, 0x082d, + 0x084a, 0x084a, 0x084a, 0x084a, 0x0854, 0x085a, 0x085a, 0x085a, + 0x085a, 0x085a, 0x085a, 0x085a, 0x0862, 0x0862, 0x0862, 0x0862, + 0x0862, 0x086e, 0x086e, 0x086e, 0x086e, 0x0875, 0x0875, 0x0875, + // Entry 240 - 27F + 0x0875, 0x0875, 0x0875, 0x0875, 0x0875, 0x0875, 0x0875, 0x0875, + 0x0892, 0x0892, 0x08af, 0x08af, 0x08ca, 0x08ca, 0x08e0, 0x090a, + 0x091f, 0x0931, 0x0944, 0x0957, 0x0972, 0x0986, 0x099a, 0x099a, + 0x09af, 0x09c5, 0x09ee, 0x09f9, 0x0a11, 0x0a28, 0x0a33, 0x0a42, + 0x0a59, 0x0a70, +} // Size: 1244 bytes + +var srLangStr string = "" + // Size: 7594 bytes + "АфарскиабхаскиАвестанскиафрикансаканамхарскиАрагонежанскиарапскиасамскиА" + + "варскиАјмараазербејџанскибашкирскибелорускибугарскиБисламабамбарабенгал" + + "скитибетанскибретонскибосанскикаталонскиЧеченскиЧаморокорзиканскиКричеш" + + "киСтарословенскиЧувашкивелшкиданскинемачкиДивехијскиџонгаевегрчкиенглес" + + "киесперантошпанскиестонскибаскијскиперсијскиФулахфинскифиџијскифарскифр" + + "анцускизападни фризијскиирскиШкотски Галскигалицијскигваранигуџаратиман" + + "скихаусахебрејскихиндиХири МотухрватскихаићанскимађарскијерменскиХереро" + + "ИнтерлингваиндонежанскиМеђујезичкиигбосечуан јиУнупиакИдоисландскиитали" + + "јанскиинуктитутјапанскијаванскигрузијскиКонгокикујуКуањамаказашкикалали" + + "суткмерскиканадакорејскиКанурикашмирскикурдскиКомикорнволскикиргискилат" + + "инскилуксембуршкигандаЛимбургишлингалалаошкилитванскилуба-катангалетонс" + + "кималгашкиМаршалскимаорскимакедонскималајаламмонголскимаратималајскимал" + + "тешкибурманскиНаурусеверни ндебеленепалскиНдонгахоландскинорвешки нинор" + + "скнорвешки бокмалЈужни ндебелеНавахоЊањаПровансалскиОјибваоромооријаОсе" + + "тскипанџабиПалипољскипаштунскипортугалскикечуарето-романскирундирумунск" + + "ирускикинјаруандасанскритСардињаскисиндисеверни самисангосинхалскислова" + + "чкисловеначкиСамоанскишонасомалскиалбанскисрпскиСватиСесотосунданскишве" + + "дскисвахилитамилскителугутаџичкитајландскитигрињатуркменскиТсванатонгат" + + "урскиТсонгататарскиТахићанскиујгурскиукрајинскиурдуузбечкиВендавијетнам" + + "скиВолапукВалунволофкосаЈидишјорубаЖуангкинескизулуАчинескиАколиАдангме" + + "јскиАдигејскиАфрихилиагемАинуАкадијскиАљутЈужни алтаиСтароенглескиАнгик" + + "аАрмајскимапучеАрапахоАравакасуАстуријскиАвадхиБалучиБалинезијскиБасаБе" + + "јабембабеназападни белучкиБојпуриБиколБиниСисикаБрајбодоБуриатБугинежан" + + "скиБлинКадоКарипскиАтсамскиЦебуаночигаЧибчаЧагатаиЧукескиМариЧинукскиЧо" + + "ктавскиЧипвијанскичерокиЧејенскисорани курдскиКоптскиКримеански турскиК" + + "ашубијанскиДакотаДаргватаитаДелаверСлавскиДогрибДинказармаДогридоњи луж" + + "ичкосрпскидуалаСредњи холандскиџола фоњиЂулаембуЕфикскиСтароегипатскиЕк" + + "ајукЕламитскиСредњи енглескиЕвондоФангфилипинскиФонСредњи францускиСтар" + + "офранцускиСеверно-фризијскиИсточни фризијскиФриулијскиГагагаузГајоГбаја" + + "ЏизГилбертшкиСредњи високи немачкиСтаронемачкиГондиГоронталоГотскиГребо" + + "СтарогрчкиШвајцарски немачкигусиГвич’инХаидахавајскиХилигајнонХититеХмо" + + "нггорњи лужичкосрпскиХупаИбанИлокоИнгвишкиЛојбаннгомбамачамеЈудео-перси" + + "јскиЈудео-арапскиКара-калпашкикабилеКачинЂукамбаКавиКабардијскиТјапмако" + + "ндезеленортски креолскиКороКасиКотанешкикојра чииникаленџинКимбундукоми" + + "-пермскиконканиКосреанскиКпелеКарачај-балкарКарелијскиКурукхшамбалабафиј" + + "аКумикКутенаиЛадинолангиЛандаЛамбаЛезгианлакотаМонгоЛозисеверни луриЛуб" + + "а-лулуаЛуисеноЛундалуоЛушаилујиаМадурешкиМагахиМаитилиМакасарМандингома" + + "саиМокшаМандарМендемеруморисјенСредњи ирскимакува-меетометаМикмакМинанг" + + "кабауМанчуМанипуримохокМосимундангВише језикаКришкиМирандешкиМарвариЕрз" + + "ијамазандеранскиНеаполитанскинамаНиски немачкиНевариНиасНиуеанквасиоНог" + + "аиСтари норскин’коСеверни сотонуерКласични невариЊамвезинјанколеЊороНзи" + + "маОсагеОтомански турскиПангасинскиПахлавиПампангаПапиаментоПалауанскиСт" + + "ароперсијскиФеничанскиПонпејскиСтаропровансалскик’ичеРађастаниРапануиРа" + + "ротонганромбоРоманиАроманијскируаСандавеЈакутСамаритански арамејскисамб" + + "уруСасакСанталисангуСицилијанскиШкотскијужнокурдскисенаСелкапкојраборо " + + "сениСтароирскиташелхитШанСидамојужни самилуле самиинари самисколт самиС" + + "онинкеСоџијенскиСранански тонгоСерерСукумаСусуСумерскиКоморскиконго сва" + + "хилиКласични сиријскиСиријскиТимнетесоТереноТетумТигреТивТокелауКлингон" + + "скиТлингитТамашекЊаса тонгаТок ПисинТсимшианТумбукаТувалутасавакТувиниј" + + "скицентралноатласки тамазигтУдмуртУгаритскиУмбундуРутваиВотскивунџоВала" + + "моВарајВашоварлпириКалмиксогаЈаоЈапешкиКантонскиЗапотечкиБлисимболиЗена" + + "гастандардни марокански тамазигтЗунибез лингвистичког садржајаЗазамодер" + + "ан стандардни арапскишвајцарски високи немачкинискосаксонскифламанскиБр" + + "азилски португалскиИберијски португалскимолдавскиСрпскохрватски" + +var srLangIdx = []uint16{ // 608 elements + // Entry 0 - 3F + 0x0000, 0x000e, 0x001c, 0x0030, 0x0040, 0x0048, 0x0058, 0x0072, + 0x0080, 0x008e, 0x009c, 0x00a8, 0x00c2, 0x00d4, 0x00e6, 0x00f6, + 0x0104, 0x0112, 0x0124, 0x0138, 0x014a, 0x015a, 0x016e, 0x017e, + 0x018a, 0x01a0, 0x01a6, 0x01b0, 0x01cc, 0x01da, 0x01e6, 0x01f2, + 0x0200, 0x0214, 0x021e, 0x0224, 0x022e, 0x023e, 0x0250, 0x025e, + 0x026e, 0x0280, 0x0292, 0x029c, 0x02a8, 0x02b8, 0x02c4, 0x02d6, + 0x02f7, 0x0301, 0x031c, 0x0330, 0x033e, 0x034e, 0x035a, 0x0364, + 0x0376, 0x0380, 0x0391, 0x03a1, 0x03b3, 0x03c3, 0x03d5, 0x03e1, + // Entry 40 - 7F + 0x03f7, 0x040f, 0x0425, 0x042d, 0x043e, 0x044c, 0x0452, 0x0464, + 0x047a, 0x048c, 0x049c, 0x04ac, 0x04be, 0x04c8, 0x04d4, 0x04e2, + 0x04f0, 0x0502, 0x0510, 0x051c, 0x052c, 0x0538, 0x054a, 0x0558, + 0x0560, 0x0574, 0x0584, 0x0594, 0x05ac, 0x05b6, 0x05c8, 0x05d6, + 0x05e2, 0x05f4, 0x060b, 0x061b, 0x062b, 0x063d, 0x064b, 0x065f, + 0x0671, 0x0683, 0x068f, 0x069f, 0x06af, 0x06c1, 0x06cb, 0x06e8, + 0x06f8, 0x0704, 0x0716, 0x0735, 0x0752, 0x076b, 0x0777, 0x077f, + 0x0797, 0x07a3, 0x07ad, 0x07b7, 0x07c5, 0x07d3, 0x07db, 0x07e7, + // Entry 80 - BF + 0x07f9, 0x080f, 0x0819, 0x0832, 0x083c, 0x084c, 0x0856, 0x086c, + 0x087c, 0x0890, 0x089a, 0x08b1, 0x08bb, 0x08cd, 0x08dd, 0x08f1, + 0x0903, 0x090b, 0x091b, 0x092b, 0x0937, 0x0941, 0x094d, 0x095f, + 0x096d, 0x097b, 0x098b, 0x0997, 0x09a5, 0x09b9, 0x09c7, 0x09db, + 0x09e7, 0x09f1, 0x09fd, 0x0a09, 0x0a19, 0x0a2d, 0x0a3d, 0x0a51, + 0x0a59, 0x0a67, 0x0a71, 0x0a87, 0x0a95, 0x0a9f, 0x0aa9, 0x0ab1, + 0x0abb, 0x0ac7, 0x0ad1, 0x0adf, 0x0ae7, 0x0af7, 0x0b01, 0x0b17, + 0x0b29, 0x0b29, 0x0b39, 0x0b41, 0x0b49, 0x0b5b, 0x0b5b, 0x0b63, + // Entry C0 - FF + 0x0b63, 0x0b78, 0x0b92, 0x0b9e, 0x0bae, 0x0bba, 0x0bba, 0x0bc8, + 0x0bc8, 0x0bd4, 0x0bd4, 0x0bd4, 0x0bda, 0x0bda, 0x0bee, 0x0bee, + 0x0bfa, 0x0c06, 0x0c1e, 0x0c1e, 0x0c26, 0x0c26, 0x0c26, 0x0c26, + 0x0c2e, 0x0c38, 0x0c38, 0x0c40, 0x0c40, 0x0c40, 0x0c5d, 0x0c6b, + 0x0c75, 0x0c7d, 0x0c7d, 0x0c7d, 0x0c89, 0x0c89, 0x0c89, 0x0c91, + 0x0c91, 0x0c99, 0x0c99, 0x0ca5, 0x0cbd, 0x0cbd, 0x0cc5, 0x0cc5, + 0x0ccd, 0x0cdd, 0x0cdd, 0x0ced, 0x0cfb, 0x0d03, 0x0d0d, 0x0d1b, + 0x0d29, 0x0d31, 0x0d41, 0x0d53, 0x0d69, 0x0d75, 0x0d85, 0x0da0, + // Entry 100 - 13F + 0x0dae, 0x0dae, 0x0dcf, 0x0de7, 0x0df3, 0x0dff, 0x0e09, 0x0e17, + 0x0e25, 0x0e31, 0x0e3b, 0x0e45, 0x0e4f, 0x0e72, 0x0e72, 0x0e7c, + 0x0e9b, 0x0eac, 0x0eb4, 0x0eb4, 0x0ebc, 0x0eca, 0x0eca, 0x0ee6, + 0x0ef2, 0x0f04, 0x0f21, 0x0f21, 0x0f2d, 0x0f2d, 0x0f35, 0x0f49, + 0x0f49, 0x0f4f, 0x0f4f, 0x0f6e, 0x0f8a, 0x0f8a, 0x0fab, 0x0fcc, + 0x0fe0, 0x0fe4, 0x0ff0, 0x0ff0, 0x0ff8, 0x1002, 0x1002, 0x1008, + 0x101c, 0x101c, 0x1044, 0x105c, 0x105c, 0x1066, 0x1078, 0x1084, + 0x108e, 0x10a2, 0x10c5, 0x10c5, 0x10c5, 0x10cd, 0x10dc, 0x10e6, + // Entry 140 - 17F + 0x10e6, 0x10f6, 0x10f6, 0x110a, 0x1116, 0x1120, 0x1145, 0x1145, + 0x114d, 0x1155, 0x1155, 0x115f, 0x116f, 0x116f, 0x116f, 0x117b, + 0x1187, 0x1193, 0x11b0, 0x11c9, 0x11c9, 0x11e2, 0x11ee, 0x11f8, + 0x11fc, 0x1206, 0x120e, 0x1224, 0x1224, 0x122c, 0x123a, 0x1261, + 0x1261, 0x1269, 0x1269, 0x1271, 0x1283, 0x1298, 0x1298, 0x1298, + 0x1298, 0x12a8, 0x12b8, 0x12cf, 0x12dd, 0x12f1, 0x12fb, 0x1316, + 0x1316, 0x1316, 0x132a, 0x1336, 0x1344, 0x1350, 0x1350, 0x135a, + 0x1368, 0x1374, 0x137e, 0x1388, 0x1392, 0x13a0, 0x13a0, 0x13a0, + // Entry 180 - 1BF + 0x13a0, 0x13ac, 0x13ac, 0x13b6, 0x13be, 0x13d5, 0x13d5, 0x13e8, + 0x13f6, 0x1400, 0x1406, 0x1410, 0x141a, 0x141a, 0x141a, 0x142c, + 0x142c, 0x1438, 0x1446, 0x1454, 0x1464, 0x146e, 0x146e, 0x1478, + 0x1484, 0x148e, 0x1496, 0x14a6, 0x14bd, 0x14d4, 0x14dc, 0x14e8, + 0x14fe, 0x1508, 0x1518, 0x1522, 0x152a, 0x152a, 0x1538, 0x154d, + 0x1559, 0x156d, 0x157b, 0x157b, 0x157b, 0x1587, 0x15a1, 0x15a1, + 0x15bb, 0x15c3, 0x15dc, 0x15e8, 0x15f0, 0x15fc, 0x15fc, 0x1608, + 0x1608, 0x1612, 0x1629, 0x1629, 0x1632, 0x1649, 0x1651, 0x166e, + // Entry 1C0 - 1FF + 0x167c, 0x168c, 0x1694, 0x169e, 0x16a8, 0x16c7, 0x16dd, 0x16eb, + 0x16fb, 0x170f, 0x1723, 0x1723, 0x1723, 0x1723, 0x173f, 0x173f, + 0x1753, 0x1753, 0x1753, 0x1765, 0x1765, 0x1787, 0x1792, 0x1792, + 0x17a4, 0x17b2, 0x17c6, 0x17c6, 0x17c6, 0x17d0, 0x17dc, 0x17dc, + 0x17dc, 0x17dc, 0x17f2, 0x17f8, 0x1806, 0x1810, 0x183b, 0x1849, + 0x1853, 0x1861, 0x1861, 0x1861, 0x186b, 0x1883, 0x1891, 0x1891, + 0x18a9, 0x18a9, 0x18b1, 0x18b1, 0x18bd, 0x18d8, 0x18ec, 0x18ec, + 0x18fc, 0x1902, 0x1902, 0x190e, 0x190e, 0x190e, 0x1921, 0x1932, + // Entry 200 - 23F + 0x1945, 0x1958, 0x1966, 0x197a, 0x1997, 0x19a1, 0x19a1, 0x19a1, + 0x19ad, 0x19b5, 0x19c5, 0x19d5, 0x19ee, 0x1a0f, 0x1a1f, 0x1a1f, + 0x1a1f, 0x1a29, 0x1a31, 0x1a3d, 0x1a47, 0x1a51, 0x1a57, 0x1a65, + 0x1a65, 0x1a79, 0x1a87, 0x1a87, 0x1a95, 0x1aa8, 0x1ab9, 0x1ab9, + 0x1ab9, 0x1ab9, 0x1ac9, 0x1ac9, 0x1ad7, 0x1ae3, 0x1af1, 0x1b05, + 0x1b36, 0x1b42, 0x1b54, 0x1b62, 0x1b68, 0x1b6e, 0x1b6e, 0x1b6e, + 0x1b6e, 0x1b6e, 0x1b7a, 0x1b7a, 0x1b84, 0x1b84, 0x1b90, 0x1b9a, + 0x1ba2, 0x1bb2, 0x1bb2, 0x1bbe, 0x1bbe, 0x1bc6, 0x1bcc, 0x1bda, + // Entry 240 - 27F + 0x1bda, 0x1bda, 0x1bda, 0x1bec, 0x1bfe, 0x1c12, 0x1c12, 0x1c1e, + 0x1c58, 0x1c60, 0x1c92, 0x1c9a, 0x1ccc, 0x1ccc, 0x1ccc, 0x1cfc, + 0x1cfc, 0x1cfc, 0x1cfc, 0x1cfc, 0x1cfc, 0x1cfc, 0x1cfc, 0x1cfc, + 0x1cfc, 0x1cfc, 0x1d18, 0x1d2a, 0x1d53, 0x1d7c, 0x1d8e, 0x1daa, +} // Size: 1240 bytes + +var srLatnLangStr string = "" + // Size: 3982 bytes + "AfarskiabhaskiAvestanskiafrikansakanamharskiAragonežanskiarapskiasamskiA" + + "varskiAjmaraazerbejdžanskibaškirskibeloruskibugarskiBislamabambarabengal" + + "skitibetanskibretonskibosanskikatalonskiČečenskiČamorokorzikanskiKričešk" + + "iStaroslovenskiČuvaškivelškidanskinemačkiDivehijskidžongaevegrčkienglesk" + + "iesperantošpanskiestonskibaskijskipersijskiFulahfinskifidžijskifarskifra" + + "ncuskizapadni frizijskiirskiŠkotski Galskigalicijskigvaranigudžaratimans" + + "kihausahebrejskihindiHiri MotuhrvatskihaićanskimađarskijermenskiHereroIn" + + "terlingvaindonežanskiMeđujezičkiigbosečuan jiUnupiakIdoislandskiitalijan" + + "skiinuktitutjapanskijavanskigruzijskiKongokikujuKuanjamakazaškikalalisut" + + "kmerskikanadakorejskiKanurikašmirskikurdskiKomikornvolskikirgiskilatinsk" + + "iluksemburškigandaLimburgišlingalalaoškilitvanskiluba-katangaletonskimal" + + "gaškiMaršalskimaorskimakedonskimalajalammongolskimaratimalajskimalteškib" + + "urmanskiNauruseverni ndebelenepalskiNdongaholandskinorveški ninorsknorve" + + "ški bokmalJužni ndebeleNavahoNjanjaProvansalskiOjibvaoromoorijaOsetskip" + + "andžabiPalipoljskipaštunskiportugalskikečuareto-romanskirundirumunskirus" + + "kikinjaruandasanskritSardinjaskisindiseverni samisangosinhalskislovačkis" + + "lovenačkiSamoanskišonasomalskialbanskisrpskiSvatiSesotosundanskišvedskis" + + "vahilitamilskitelugutadžičkitajlandskitigrinjaturkmenskiTsvanatongatursk" + + "iTsongatatarskiTahićanskiujgurskiukrajinskiurduuzbečkiVendavijetnamskiVo" + + "lapukValunvolofkosaJidišjorubaŽuangkineskizuluAčineskiAkoliAdangmejskiAd" + + "igejskiAfrihiliagemAinuAkadijskiAljutJužni altaiStaroengleskiAngikaArmaj" + + "skimapučeArapahoAravakasuAsturijskiAvadhiBalučiBalinezijskiBasaBejabemba" + + "benazapadni belučkiBojpuriBikolBiniSisikaBrajbodoBuriatBuginežanskiBlinK" + + "adoKaripskiAtsamskiCebuanočigaČibčaČagataiČukeskiMariČinukskiČoktavskiČi" + + "pvijanskičerokiČejenskisorani kurdskiKoptskiKrimeanski turskiKašubijansk" + + "iDakotaDargvataitaDelaverSlavskiDogribDinkazarmaDogridonji lužičkosrpski" + + "dualaSrednji holandskidžola fonjiĐulaembuEfikskiStaroegipatskiEkajukElam" + + "itskiSrednji engleskiEvondoFangfilipinskiFonSrednji francuskiStarofrancu" + + "skiSeverno-frizijskiIstočni frizijskiFriulijskiGagagauzGajoGbajaDžizGilb" + + "ertškiSrednji visoki nemačkiStaronemačkiGondiGorontaloGotskiGreboStarogr" + + "čkiŠvajcarski nemačkigusiGvič’inHaidahavajskiHiligajnonHititeHmonggornj" + + "i lužičkosrpskiHupaIbanIlokoIngviškiLojbanngombamačameJudeo-persijskiJud" + + "eo-arapskiKara-kalpaškikabileKačinĐukambaKaviKabardijskiTjapmakondezelen" + + "ortski kreolskiKoroKasiKotaneškikojra čiinikalendžinKimbundukomi-permski" + + "konkaniKosreanskiKpeleKaračaj-balkarKarelijskiKurukhšambalabafijaKumikKu" + + "tenaiLadinolangiLandaLambaLezgianlakotaMongoLoziseverni luriLuba-luluaLu" + + "isenoLundaluoLušailujiaMadureškiMagahiMaitiliMakasarMandingomasaiMokšaMa" + + "ndarMendemerumorisjenSrednji irskimakuva-meetometaMikmakMinangkabauManču" + + "ManipurimohokMosimundangViše jezikaKriškiMirandeškiMarvariErzijamazander" + + "anskiNeapolitanskinamaNiski nemačkiNevariNiasNiueankvasioNogaiStari nors" + + "kin’koSeverni sotonuerKlasični nevariNjamvezinjankoleNjoroNzimaOsageOtom" + + "anski turskiPangasinskiPahlaviPampangaPapiamentoPalauanskiStaropersijski" + + "FeničanskiPonpejskiStaroprovansalskik’ičeRađastaniRapanuiRarotonganrombo" + + "RomaniAromanijskiruaSandaveJakutSamaritanski aramejskisamburuSasakSantal" + + "isanguSicilijanskiŠkotskijužnokurdskisenaSelkapkojraboro seniStaroirskit" + + "ašelhitŠanSidamojužni samilule samiinari samiskolt samiSoninkeSodžijensk" + + "iSrananski tongoSererSukumaSusuSumerskiKomorskikongo svahiliKlasični sir" + + "ijskiSirijskiTimnetesoTerenoTetumTigreTivTokelauKlingonskiTlingitTamašek" + + "Njasa tongaTok PisinTsimšianTumbukaTuvalutasavakTuvinijskicentralnoatlas" + + "ki tamazigtUdmurtUgaritskiUmbunduRutvaiVotskivundžoValamoVarajVašovarlpi" + + "riKalmiksogaJaoJapeškiKantonskiZapotečkiBlisimboliZenagastandardni marok" + + "anski tamazigtZunibez lingvističkog sadržajaZazamoderan standardni araps" + + "kišvajcarski visoki nemačkiniskosaksonskiflamanskiBrazilski portugalskiI" + + "berijski portugalskimoldavskiSrpskohrvatski" + +var srLatnLangIdx = []uint16{ // 608 elements + // Entry 0 - 3F + 0x0000, 0x0007, 0x000e, 0x0018, 0x0020, 0x0024, 0x002c, 0x003a, + 0x0041, 0x0048, 0x004f, 0x0055, 0x0064, 0x006e, 0x0077, 0x007f, + 0x0086, 0x008d, 0x0096, 0x00a0, 0x00a9, 0x00b1, 0x00bb, 0x00c5, + 0x00cc, 0x00d7, 0x00da, 0x00e1, 0x00ef, 0x00f8, 0x00ff, 0x0105, + 0x010d, 0x0117, 0x011e, 0x0121, 0x0127, 0x012f, 0x0138, 0x0140, + 0x0148, 0x0151, 0x015a, 0x015f, 0x0165, 0x016f, 0x0175, 0x017e, + 0x018f, 0x0194, 0x01a3, 0x01ad, 0x01b4, 0x01be, 0x01c4, 0x01c9, + 0x01d2, 0x01d7, 0x01e0, 0x01e8, 0x01f2, 0x01fb, 0x0204, 0x020a, + // Entry 40 - 7F + 0x0215, 0x0222, 0x022f, 0x0233, 0x023d, 0x0244, 0x0247, 0x0250, + 0x025b, 0x0264, 0x026c, 0x0274, 0x027d, 0x0282, 0x0288, 0x0290, + 0x0298, 0x02a1, 0x02a8, 0x02ae, 0x02b6, 0x02bc, 0x02c6, 0x02cd, + 0x02d1, 0x02db, 0x02e3, 0x02eb, 0x02f8, 0x02fd, 0x0307, 0x030e, + 0x0315, 0x031e, 0x032a, 0x0332, 0x033b, 0x0345, 0x034c, 0x0356, + 0x035f, 0x0368, 0x036e, 0x0376, 0x037f, 0x0388, 0x038d, 0x039c, + 0x03a4, 0x03aa, 0x03b3, 0x03c4, 0x03d4, 0x03e2, 0x03e8, 0x03ee, + 0x03fa, 0x0400, 0x0405, 0x040a, 0x0411, 0x041a, 0x041e, 0x0425, + // Entry 80 - BF + 0x042f, 0x043a, 0x0440, 0x044d, 0x0452, 0x045a, 0x045f, 0x046a, + 0x0472, 0x047d, 0x0482, 0x048e, 0x0493, 0x049c, 0x04a5, 0x04b0, + 0x04b9, 0x04be, 0x04c6, 0x04ce, 0x04d4, 0x04d9, 0x04df, 0x04e8, + 0x04f0, 0x04f7, 0x04ff, 0x0505, 0x050f, 0x0519, 0x0521, 0x052b, + 0x0531, 0x0536, 0x053c, 0x0542, 0x054a, 0x0555, 0x055d, 0x0567, + 0x056b, 0x0573, 0x0578, 0x0583, 0x058a, 0x058f, 0x0594, 0x0598, + 0x059e, 0x05a4, 0x05aa, 0x05b1, 0x05b5, 0x05be, 0x05c3, 0x05ce, + 0x05d7, 0x05d7, 0x05df, 0x05e3, 0x05e7, 0x05f0, 0x05f0, 0x05f5, + // Entry C0 - FF + 0x05f5, 0x0601, 0x060e, 0x0614, 0x061c, 0x0623, 0x0623, 0x062a, + 0x062a, 0x0630, 0x0630, 0x0630, 0x0633, 0x0633, 0x063d, 0x063d, + 0x0643, 0x064a, 0x0656, 0x0656, 0x065a, 0x065a, 0x065a, 0x065a, + 0x065e, 0x0663, 0x0663, 0x0667, 0x0667, 0x0667, 0x0677, 0x067e, + 0x0683, 0x0687, 0x0687, 0x0687, 0x068d, 0x068d, 0x068d, 0x0691, + 0x0691, 0x0695, 0x0695, 0x069b, 0x06a8, 0x06a8, 0x06ac, 0x06ac, + 0x06b0, 0x06b8, 0x06b8, 0x06c0, 0x06c7, 0x06cc, 0x06d3, 0x06db, + 0x06e3, 0x06e7, 0x06f0, 0x06fa, 0x0706, 0x070d, 0x0716, 0x0724, + // Entry 100 - 13F + 0x072b, 0x072b, 0x073c, 0x0749, 0x074f, 0x0755, 0x075a, 0x0761, + 0x0768, 0x076e, 0x0773, 0x0778, 0x077d, 0x0792, 0x0792, 0x0797, + 0x07a8, 0x07b4, 0x07b9, 0x07b9, 0x07bd, 0x07c4, 0x07c4, 0x07d2, + 0x07d8, 0x07e1, 0x07f1, 0x07f1, 0x07f7, 0x07f7, 0x07fb, 0x0805, + 0x0805, 0x0808, 0x0808, 0x0819, 0x0827, 0x0827, 0x0838, 0x084a, + 0x0854, 0x0856, 0x085c, 0x085c, 0x0860, 0x0865, 0x0865, 0x086a, + 0x0875, 0x0875, 0x088c, 0x0899, 0x0899, 0x089e, 0x08a7, 0x08ad, + 0x08b2, 0x08bd, 0x08d1, 0x08d1, 0x08d1, 0x08d5, 0x08df, 0x08e4, + // Entry 140 - 17F + 0x08e4, 0x08ec, 0x08ec, 0x08f6, 0x08fc, 0x0901, 0x0917, 0x0917, + 0x091b, 0x091f, 0x091f, 0x0924, 0x092d, 0x092d, 0x092d, 0x0933, + 0x0939, 0x0940, 0x094f, 0x095c, 0x095c, 0x096a, 0x0970, 0x0976, + 0x0979, 0x097e, 0x0982, 0x098d, 0x098d, 0x0991, 0x0998, 0x09ac, + 0x09ac, 0x09b0, 0x09b0, 0x09b4, 0x09be, 0x09ca, 0x09ca, 0x09ca, + 0x09ca, 0x09d4, 0x09dc, 0x09e8, 0x09ef, 0x09f9, 0x09fe, 0x0a0d, + 0x0a0d, 0x0a0d, 0x0a17, 0x0a1d, 0x0a25, 0x0a2b, 0x0a2b, 0x0a30, + 0x0a37, 0x0a3d, 0x0a42, 0x0a47, 0x0a4c, 0x0a53, 0x0a53, 0x0a53, + // Entry 180 - 1BF + 0x0a53, 0x0a59, 0x0a59, 0x0a5e, 0x0a62, 0x0a6e, 0x0a6e, 0x0a78, + 0x0a7f, 0x0a84, 0x0a87, 0x0a8d, 0x0a92, 0x0a92, 0x0a92, 0x0a9c, + 0x0a9c, 0x0aa2, 0x0aa9, 0x0ab0, 0x0ab8, 0x0abd, 0x0abd, 0x0ac3, + 0x0ac9, 0x0ace, 0x0ad2, 0x0ada, 0x0ae7, 0x0af3, 0x0af7, 0x0afd, + 0x0b08, 0x0b0e, 0x0b16, 0x0b1b, 0x0b1f, 0x0b1f, 0x0b26, 0x0b32, + 0x0b39, 0x0b44, 0x0b4b, 0x0b4b, 0x0b4b, 0x0b51, 0x0b5e, 0x0b5e, + 0x0b6b, 0x0b6f, 0x0b7d, 0x0b83, 0x0b87, 0x0b8d, 0x0b8d, 0x0b93, + 0x0b93, 0x0b98, 0x0ba4, 0x0ba4, 0x0baa, 0x0bb6, 0x0bba, 0x0bca, + // Entry 1C0 - 1FF + 0x0bd2, 0x0bda, 0x0bdf, 0x0be4, 0x0be9, 0x0bf9, 0x0c04, 0x0c0b, + 0x0c13, 0x0c1d, 0x0c27, 0x0c27, 0x0c27, 0x0c27, 0x0c35, 0x0c35, + 0x0c40, 0x0c40, 0x0c40, 0x0c49, 0x0c49, 0x0c5a, 0x0c62, 0x0c62, + 0x0c6c, 0x0c73, 0x0c7d, 0x0c7d, 0x0c7d, 0x0c82, 0x0c88, 0x0c88, + 0x0c88, 0x0c88, 0x0c93, 0x0c96, 0x0c9d, 0x0ca2, 0x0cb8, 0x0cbf, + 0x0cc4, 0x0ccb, 0x0ccb, 0x0ccb, 0x0cd0, 0x0cdc, 0x0ce4, 0x0ce4, + 0x0cf1, 0x0cf1, 0x0cf5, 0x0cf5, 0x0cfb, 0x0d09, 0x0d13, 0x0d13, + 0x0d1c, 0x0d20, 0x0d20, 0x0d26, 0x0d26, 0x0d26, 0x0d31, 0x0d3a, + // Entry 200 - 23F + 0x0d44, 0x0d4e, 0x0d55, 0x0d61, 0x0d70, 0x0d75, 0x0d75, 0x0d75, + 0x0d7b, 0x0d7f, 0x0d87, 0x0d8f, 0x0d9c, 0x0dae, 0x0db6, 0x0db6, + 0x0db6, 0x0dbb, 0x0dbf, 0x0dc5, 0x0dca, 0x0dcf, 0x0dd2, 0x0dd9, + 0x0dd9, 0x0de3, 0x0dea, 0x0dea, 0x0df2, 0x0dfd, 0x0e06, 0x0e06, + 0x0e06, 0x0e06, 0x0e0f, 0x0e0f, 0x0e16, 0x0e1c, 0x0e23, 0x0e2d, + 0x0e46, 0x0e4c, 0x0e55, 0x0e5c, 0x0e5f, 0x0e62, 0x0e62, 0x0e62, + 0x0e62, 0x0e62, 0x0e68, 0x0e68, 0x0e6f, 0x0e6f, 0x0e75, 0x0e7a, + 0x0e7f, 0x0e87, 0x0e87, 0x0e8d, 0x0e8d, 0x0e91, 0x0e94, 0x0e9c, + // Entry 240 - 27F + 0x0e9c, 0x0e9c, 0x0e9c, 0x0ea5, 0x0eaf, 0x0eb9, 0x0eb9, 0x0ebf, + 0x0edd, 0x0ee1, 0x0efd, 0x0f01, 0x0f1b, 0x0f1b, 0x0f1b, 0x0f36, + 0x0f36, 0x0f36, 0x0f36, 0x0f36, 0x0f36, 0x0f36, 0x0f36, 0x0f36, + 0x0f36, 0x0f36, 0x0f44, 0x0f4d, 0x0f62, 0x0f77, 0x0f80, 0x0f8e, +} // Size: 1240 bytes + +var svLangStr string = "" + // Size: 5432 bytes + "afarabchaziskaavestiskaafrikaansakanamhariskaaragonesiskaarabiskaassames" + + "iskaavariskaaymaraazerbajdzjanskabasjkiriskavitryskabulgariskabislamabam" + + "barabengalitibetanskabretonskabosniskakatalanskatjetjenskachamorrokorsik" + + "anskacreetjeckiskakyrkslaviskatjuvasjiskawalesiskadanskatyskadivehibhuta" + + "nesiskaewegrekiskaengelskaesperantospanskaestniskabaskiskapersiskafulani" + + "finskafijianskafäröiskafranskavästfrisiskairiskaskotsk gäliskagaliciskag" + + "uaranígujaratimanxhausahebreiskahindihirimotukroatiskahaitiskaungerskaar" + + "meniskahererointerlinguaindonesiskainterlingueigboszezuan iinupiakidoisl" + + "ändskaitalienskainuktitutjapanskajavanesiskageorgiskakikongokikuyukuany" + + "amakazakiskagrönländskakambodjanskakannadakoreanskakanurikashmiriskakurd" + + "iskakomekorniskakirgisiskalatinluxemburgiskalugandalimburgiskalingalalao" + + "tiskalitauiskaluba-katangalettiskamalagassiskamarshalliskamaorimakedonsk" + + "amalayalammongoliskamarathimalajiskamaltesiskaburmesiskanaurunordndebele" + + "nepalesiskandonganederländskanynorskanorskt bokmålsydndebelenavahonyanja" + + "occitanskaodjibwaoromooriyaossetiskapunjabipalipolskaafghanskaportugisis" + + "kaquechuarätoromanskarundirumänskaryskakinjarwandasanskritsardiskasindhi" + + "nordsamiskasangosingalesiskaslovakiskaslovenskasamoanskashonasomaliskaal" + + "banskaserbiskaswatisydsothosundanesiskasvenskaswahilitamiltelugiskatadzj" + + "ikiskathailändskatigrinjaturkmeniskatswanatonganskaturkiskatsongatataris" + + "katahitiskauiguriskaukrainskaurduuzbekiskavendavietnamesiskavolapükvallo" + + "nskawolofxhosajiddischyorubazhuangkinesiskazuluacehnesiskaacholiadangmea" + + "dygeiskatunisisk arabiskaafrihiliaghemainuakkadiskaAlabama-muskogeealeut" + + "iskagegiskasydaltaiskafornengelskaangikaarameiskaaraukanskaaraoniskaarap" + + "ahoalgerisk arabiskaarawakiskamarockansk arabiskaegyptisk arabiskaasuame" + + "rikanskt teckenspråkasturiskakotavaawadhibaluchiskabalinesiskabayerskaba" + + "sabamunskabatak-tobaghomalabejabembabetawiskabenabafutbagadavästbaluchis" + + "kabhojpuribikolbinibanjariskabamekonsiksikabishnupriyabakhtiaribrajbrahu" + + "iskabodobakossiburjätiskabuginesiskabouloublinbagangtecaddokaribiskacayu" + + "gaatsamcebuanochigachibchachagataichuukesiskamariskachinookchoctawchipew" + + "yancherokesiskacheyennesoranisk kurdiskakoptiskakapisnonkrimtatariskakas" + + "jubiskadakotadarginskataitadelawareslavejdogribdinkazarmadogrilågsorbisk" + + "acentraldusundualamedelnederländskajola-fonyidyuladazagaembuefikemiliska" + + "fornegyptiskaekajukelamitiskamedelengelskacentralalaskisk jupiskaewondoe" + + "xtremaduriskafangfilippinskameänkielifonspråketcajun-franskamedelfranska" + + "fornfranskafrankoprovensalskanordfrisiskaöstfrisiskafriulianskagãgagauzi" + + "skagangayogbayazoroastrisk darietiopiskagilbertiskagilakimedelhögtyskafo" + + "rnhögtyskaGoa-konkanigondigorontalogotiskagreboforngrekiskaschweizertysk" + + "awayuufarefaregusiigwichinhaidahakkahawaiiskaFiji-hindihiligaynonhettiti" + + "skahmongspråkhögsorbiskaxianghupaibanskaibibioilokoingusjiskaingriskajam" + + "aikansk engelsk kreollojbanngombakimashamijudisk persiskajudisk arabiska" + + "jylländskakarakalpakiskakabyliskakachinjjukambakawikabardinskakanembutya" + + "pmakondekapverdiskakenjangkorokaingangkhasikhotanesiskaTimbuktu-songhoyk" + + "howarkirmanjkimkakokalenjinkimbundukomi-permjakiskakonkanikosreanskakpel" + + "lekarachay-balkarkriokinaray-akarelskakurukhkisambaabafiakölniskakumykis" + + "kakutenajladinolangilahndalambalezghienlingua franca novaliguriskalivoni" + + "skalakotalombardiskamongolozinordlurilettgalliskaluba-lulualuiseñolundal" + + "uolushailuhyalitterär kineiskalaziskamaduresiskamafamagahimaithilimakasa" + + "rmandemassajiskamabamoksjamandarmendemerumauritansk kreolmedeliriskamakh" + + "uwa-meettometa’mi’kmaqminangkabaumanchuriskamanipurimohawkmossivästmaris" + + "kamundangflera språkmuskogeemirandesiskamarwarimentawaimyeneerjyamazande" + + "ranimin nannapolitanskanamalågtyskanewariskaniasniueanskaao-nagakwasioba" + + "mileké-ngiemboonnogaifornnordiskanovialn-kånordsothonuerklassisk newaris" + + "kanyamwezinyankolenyoronzimaosageottomanskapangasinanmedelpersiskapampan" + + "gapapiamentopalaupikardiskaPennsylvaniatyskamennonitisk lågtyskafornpers" + + "iskaPfalz-tyskafeniciskapiemontesiskapontiskaponapefornpreussiskafornpro" + + "vensalskaquichéChimborazo-höglandskichwarajasthanirapanuirarotonganskaro" + + "magnolriffianskaromboromanirotumänskarusynrovianskaarumänskarwasandaweja" + + "kutiskasamaritanskasamburusasaksantalisaurashtrangambaysangusicilianskas" + + "kotskasassaresisk sardiskasydkurdiskasenecasenaseriselkupGao-songhayforn" + + "iriskasamogitiskatachelhitshanChad-arabiskasidamolågsilesiskaselayarsyds" + + "amiskalulesamiskaenaresamiskaskoltsamiskasoninkesogdiskasranan tongosere" + + "rsahosaterfrisiskasukumasususumeriskashimaoréKongo-swahiliklassisk syris" + + "kasyriskasilesiskatulutemnetesoterenotetumtigrétivitokelauiskatsakhurkli" + + "ngonskatlingittalyshtamasheknyasatonganskatok pisinturoyotarokotsakodisk" + + "atsimshianmuslimsk tatariskatumbukatuvaluanskatasawaqtuviniskacentralmar" + + "ockansk tamazightudmurtiskaugaritiskaumbundurotvajvenetianskavepsvästfla" + + "mländskaMain-frankiskavotiskavõruvunjowalsertyskawalamowaraywashowarlpir" + + "iwukalmuckiskamingrelianskalusogakiyaojapetiskayangbenbamileké-jembanhee" + + "ngatukantonesiskazapotekblissymbolerzeeländskazenagamarockansk standard-" + + "tamazightzuniinget språkligt innehållzazaiskamodern standardarabiskaöste" + + "rrikisk tyskaschweizisk högtyskaaustralisk engelskakanadensisk engelskab" + + "rittisk engelskaamerikansk engelskalatinamerikansk spanskaeuropeisk span" + + "skamexikansk spanskakanadensisk franskaschweizisk franskalågsaxiskaflaml" + + "ändskabrasiliansk portugisiskaeuropeisk portugisiskamoldaviskaserbokroa" + + "tiskaförenklad kinesiskatraditionell kinesiska" + +var svLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000e, 0x0017, 0x0020, 0x0024, 0x002d, 0x0039, + 0x0041, 0x004c, 0x0054, 0x005a, 0x0069, 0x0074, 0x007c, 0x0086, + 0x008d, 0x0094, 0x009b, 0x00a5, 0x00ae, 0x00b6, 0x00c0, 0x00ca, + 0x00d2, 0x00dd, 0x00e1, 0x00ea, 0x00f6, 0x0101, 0x010a, 0x0110, + 0x0115, 0x011b, 0x0127, 0x012a, 0x0132, 0x013a, 0x0143, 0x014a, + 0x0152, 0x015a, 0x0162, 0x0168, 0x016e, 0x0177, 0x0181, 0x0188, + 0x0195, 0x019b, 0x01aa, 0x01b3, 0x01bb, 0x01c3, 0x01c7, 0x01cc, + 0x01d5, 0x01da, 0x01e2, 0x01eb, 0x01f3, 0x01fb, 0x0204, 0x020a, + // Entry 40 - 7F + 0x0215, 0x0220, 0x022b, 0x022f, 0x0238, 0x023f, 0x0242, 0x024c, + 0x0256, 0x025f, 0x0267, 0x0272, 0x027b, 0x0282, 0x0288, 0x0290, + 0x0299, 0x02a6, 0x02b2, 0x02b9, 0x02c2, 0x02c8, 0x02d3, 0x02db, + 0x02df, 0x02e7, 0x02f1, 0x02f6, 0x0303, 0x030a, 0x0315, 0x031c, + 0x0324, 0x032d, 0x0339, 0x0341, 0x034d, 0x0359, 0x035e, 0x0368, + 0x0371, 0x037b, 0x0382, 0x038b, 0x0395, 0x039f, 0x03a4, 0x03af, + 0x03ba, 0x03c0, 0x03cd, 0x03d5, 0x03e3, 0x03ed, 0x03f3, 0x03f9, + 0x0403, 0x040a, 0x040f, 0x0414, 0x041d, 0x0424, 0x0428, 0x042e, + // Entry 80 - BF + 0x0437, 0x0443, 0x044a, 0x0457, 0x045c, 0x0465, 0x046a, 0x0475, + 0x047d, 0x0485, 0x048b, 0x0496, 0x049b, 0x04a7, 0x04b1, 0x04ba, + 0x04c3, 0x04c8, 0x04d1, 0x04d9, 0x04e1, 0x04e6, 0x04ee, 0x04fa, + 0x0501, 0x0508, 0x050d, 0x0516, 0x0521, 0x052d, 0x0535, 0x0540, + 0x0546, 0x054f, 0x0557, 0x055d, 0x0566, 0x056f, 0x0578, 0x0581, + 0x0585, 0x058e, 0x0593, 0x05a0, 0x05a8, 0x05b1, 0x05b6, 0x05bb, + 0x05c3, 0x05c9, 0x05cf, 0x05d8, 0x05dc, 0x05e7, 0x05ed, 0x05f4, + 0x05fd, 0x060e, 0x0616, 0x061b, 0x061f, 0x0628, 0x0638, 0x0641, + // Entry C0 - FF + 0x0648, 0x0653, 0x065f, 0x0665, 0x066e, 0x0678, 0x0681, 0x0688, + 0x0699, 0x06a3, 0x06b6, 0x06c7, 0x06ca, 0x06e2, 0x06eb, 0x06f1, + 0x06f7, 0x0701, 0x070c, 0x0714, 0x0718, 0x0720, 0x072a, 0x0731, + 0x0735, 0x073a, 0x0743, 0x0747, 0x074c, 0x0752, 0x0761, 0x0769, + 0x076e, 0x0772, 0x077c, 0x0783, 0x078a, 0x0795, 0x079e, 0x07a2, + 0x07ab, 0x07af, 0x07b6, 0x07c1, 0x07cc, 0x07d2, 0x07d6, 0x07de, + 0x07e3, 0x07ec, 0x07f2, 0x07f7, 0x07fe, 0x0803, 0x080a, 0x0812, + 0x081d, 0x0824, 0x082b, 0x0832, 0x083b, 0x0847, 0x084f, 0x0860, + // Entry 100 - 13F + 0x0868, 0x0870, 0x087d, 0x0887, 0x088d, 0x0896, 0x089b, 0x08a3, + 0x08a9, 0x08af, 0x08b4, 0x08b9, 0x08be, 0x08ca, 0x08d6, 0x08db, + 0x08ed, 0x08f7, 0x08fc, 0x0902, 0x0906, 0x090a, 0x0912, 0x091f, + 0x0925, 0x092f, 0x093c, 0x0953, 0x0959, 0x0967, 0x096b, 0x0976, + 0x0980, 0x098b, 0x0998, 0x09a4, 0x09af, 0x09c1, 0x09cd, 0x09d9, + 0x09e4, 0x09e7, 0x09f1, 0x09f4, 0x09f8, 0x09fd, 0x0a0d, 0x0a16, + 0x0a21, 0x0a27, 0x0a35, 0x0a42, 0x0a4d, 0x0a52, 0x0a5b, 0x0a62, + 0x0a67, 0x0a73, 0x0a81, 0x0a86, 0x0a8e, 0x0a93, 0x0a9a, 0x0a9f, + // Entry 140 - 17F + 0x0aa4, 0x0aad, 0x0ab7, 0x0ac1, 0x0acb, 0x0ad6, 0x0ae2, 0x0ae7, + 0x0aeb, 0x0af2, 0x0af8, 0x0afd, 0x0b07, 0x0b0f, 0x0b27, 0x0b2d, + 0x0b33, 0x0b3c, 0x0b4b, 0x0b5a, 0x0b65, 0x0b73, 0x0b7c, 0x0b82, + 0x0b85, 0x0b8a, 0x0b8e, 0x0b99, 0x0ba0, 0x0ba4, 0x0bab, 0x0bb6, + 0x0bbd, 0x0bc1, 0x0bc9, 0x0bce, 0x0bda, 0x0bea, 0x0bf0, 0x0bf9, + 0x0bfe, 0x0c06, 0x0c0e, 0x0c1e, 0x0c25, 0x0c2f, 0x0c35, 0x0c44, + 0x0c48, 0x0c51, 0x0c59, 0x0c5f, 0x0c67, 0x0c6c, 0x0c75, 0x0c7e, + 0x0c85, 0x0c8b, 0x0c90, 0x0c96, 0x0c9b, 0x0ca3, 0x0cb5, 0x0cbe, + // Entry 180 - 1BF + 0x0cc7, 0x0ccd, 0x0cd8, 0x0cdd, 0x0ce1, 0x0ce9, 0x0cf5, 0x0cff, + 0x0d07, 0x0d0c, 0x0d0f, 0x0d15, 0x0d1a, 0x0d2c, 0x0d33, 0x0d3e, + 0x0d42, 0x0d48, 0x0d50, 0x0d57, 0x0d5c, 0x0d66, 0x0d6a, 0x0d70, + 0x0d76, 0x0d7b, 0x0d7f, 0x0d8f, 0x0d9a, 0x0da8, 0x0daf, 0x0db8, + 0x0dc3, 0x0dce, 0x0dd6, 0x0ddc, 0x0de1, 0x0ded, 0x0df4, 0x0e00, + 0x0e08, 0x0e14, 0x0e1b, 0x0e23, 0x0e28, 0x0e2d, 0x0e38, 0x0e3f, + 0x0e4b, 0x0e4f, 0x0e58, 0x0e61, 0x0e65, 0x0e6e, 0x0e75, 0x0e7b, + 0x0e8e, 0x0e93, 0x0e9f, 0x0ea5, 0x0eaa, 0x0eb3, 0x0eb7, 0x0ec9, + // Entry 1C0 - 1FF + 0x0ed1, 0x0ed9, 0x0ede, 0x0ee3, 0x0ee8, 0x0ef2, 0x0efc, 0x0f09, + 0x0f11, 0x0f1b, 0x0f20, 0x0f2a, 0x0f3b, 0x0f50, 0x0f5c, 0x0f67, + 0x0f70, 0x0f7d, 0x0f85, 0x0f8b, 0x0f99, 0x0fa9, 0x0fb0, 0x0fca, + 0x0fd4, 0x0fdb, 0x0fe8, 0x0ff0, 0x0ffa, 0x0fff, 0x1005, 0x1010, + 0x1015, 0x101e, 0x1028, 0x102b, 0x1032, 0x103b, 0x1047, 0x104e, + 0x1053, 0x105a, 0x1064, 0x106b, 0x1070, 0x107b, 0x1082, 0x1096, + 0x10a1, 0x10a7, 0x10ab, 0x10af, 0x10b5, 0x10c0, 0x10ca, 0x10d5, + 0x10de, 0x10e2, 0x10ef, 0x10f5, 0x1102, 0x1109, 0x1113, 0x111e, + // Entry 200 - 23F + 0x112a, 0x1136, 0x113d, 0x1145, 0x1151, 0x1156, 0x115a, 0x1167, + 0x116d, 0x1171, 0x117a, 0x1183, 0x1190, 0x11a0, 0x11a7, 0x11b0, + 0x11b4, 0x11b9, 0x11bd, 0x11c3, 0x11c8, 0x11ce, 0x11d2, 0x11dd, + 0x11e4, 0x11ee, 0x11f5, 0x11fb, 0x1203, 0x1211, 0x121a, 0x1220, + 0x1226, 0x1230, 0x1239, 0x124b, 0x1252, 0x125d, 0x1264, 0x126d, + 0x1288, 0x1292, 0x129c, 0x12a3, 0x12a6, 0x12a9, 0x12b4, 0x12b8, + 0x12c9, 0x12d7, 0x12de, 0x12e3, 0x12e8, 0x12f3, 0x12f9, 0x12fe, + 0x1303, 0x130b, 0x130d, 0x1318, 0x1325, 0x132b, 0x1330, 0x1339, + // Entry 240 - 27F + 0x1340, 0x134f, 0x1358, 0x1364, 0x136b, 0x1377, 0x1382, 0x1388, + 0x13a5, 0x13a9, 0x13c3, 0x13cb, 0x13e2, 0x13e2, 0x13f4, 0x1408, + 0x141b, 0x142f, 0x1440, 0x1453, 0x146a, 0x147b, 0x148c, 0x148c, + 0x149f, 0x14b1, 0x14bc, 0x14c8, 0x14e0, 0x14f6, 0x1500, 0x150e, + 0x1522, 0x1538, +} // Size: 1244 bytes + +var swLangStr string = "" + // Size: 2426 bytes + "KiabkhaziKiafrikanaKiakaniKiamhariKiarabuKiassamKiaimaraKiazabajaniKibas" + + "hkirKibelarusiKibulgariaKibambaraKibengaliKitibetiKibretoniKibosniaKikat" + + "alaniKichecheniaKikosikaniKichekiKichuvashKiwelisiKidenmakiKijerumaniKid" + + "ivehiKizongkhaKieweKigirikiKiingerezaKiesperantoKihispaniaKiestoniaKibas" + + "queKiajemiKifiniKifijiKifaroeKifaransaKifrisia cha MagharibiKiayalandiKi" + + "gaeli cha UskotiKigalisiKiguaraniKigujaratiKimanxKihausaKiebraniaKihindi" + + "KroeshiaKihaitiKihungariKiarmeniaKiintalinguaKiindonesiaKiigboSichuan Yi" + + "KiaisilandiKiitalianoKiinuktitutKijapaniKijavaKijojiaKikongoKikikuyuKika" + + "zakiKikalaallisutKikambodiaKikannadaKikoreaKikashmiriKikurdiKikomiKikorn" + + "iKikirigiziKilatiniKilasembagiKigandaKilingalaKilaosiKilithuaniaKiluba-K" + + "atangaKilatviaMalagasiKimaoriKimasedoniaKimalayalamKimongoliaKimarathiKi" + + "malesiaKimaltaKiburmaKindebele cha KaskaziniKinepaliKiholanziKinorwe Kip" + + "yaKibokmal cha NorweKinyanjaKiokitaniKioromoKioriyaKiosetiaKipunjabiKipo" + + "landiKipashtoKirenoKiquechuaKiromanshiKirundiKiromaniaKirusiKinyarwandaK" + + "isanskritiKisindhiKisami cha KaskaziniKisangoKisinhalaKislovakiaKisloven" + + "iaKisamoaKishonaKisomaliKialbaniaKiserbiaKiswatiKisotho cha KusiniKisund" + + "aKiswidiKiswahiliKitamilKiteluguKitajikiKitailandiKitigrinyaKiturukimeni" + + "KitswanaKitongaKiturukiKitsongaKitatariKitahitiKiuyghurKiukraniaKiurduKi" + + "uzbekiKivendaKivietinamuKiwolofuKixhosaKiyidiKiyorubaKichinaKizuluKiakol" + + "iKiaghemKimapucheKiarabu cha KialjeriaKiarabu cha MisriKiasuKibembaKiben" + + "aKibalochi cha MagharibiKibodoKichigaKicherokeeKikurdi cha SoraniKitaita" + + "KizarmaKidolnoserbskiKidualaKijola-FonyiKiembuKiefikiKifilipinoKigaKigag" + + "auziKiyunaniKijerumani cha UswisiKikisiiKihawaiKihitihsbKingombaKimacham" + + "eKikabyliaKikambaKimakondeKikabuverdianuKikoroKikoyra ChiiniKikalenjinKi" + + "mbunduKikomipermyakKikonkaniKisambaaKibafiaKirangiChilambaKilakotaKilozi" + + "Kiluri cha KaskaziniKiluba-LuluaKijaluoKiluhyaKimagahiKimaasaiKimeruKimo" + + "riseniKimakhuwa-MeettoKimetaKimohokiKimundangKimazanderaniKinamandsKinew" + + "ariKikwasioN’KoKisotho cha KaskaziniKinuerKinewari cha kaleKinyankoleKʼi" + + "cheʼKiromboKirwoKisamburuKisanguKikurdi cha KusiniKisenaKoyraboro SenniK" + + "itachelhitKisami cha KusiniKisami cha LuleKisami cha InariKisami cha Sko" + + "ltKisukumaKingwanaKitesoKitetumKiklingoniKitokpisinKitumbukaKitasawaqCen" + + "tral Atlas TamazightLugha IsiyojulikanaKivaiKivunjoKiwarlpiriKisogaKiyao" + + "Tamaziti Msingi ya KimorokoHakuna maudhui ya lughaKiarabu Sanifu cha Kis" + + "asaKichina (Kilichorahisishwa)Kichina cha Jadi" + +var swLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0009, 0x0009, 0x0013, 0x001a, 0x0022, 0x0022, + 0x0029, 0x0030, 0x0030, 0x0038, 0x0043, 0x004c, 0x0056, 0x0060, + 0x0060, 0x0069, 0x0072, 0x007a, 0x0083, 0x008b, 0x0095, 0x00a0, + 0x00a0, 0x00aa, 0x00aa, 0x00b1, 0x00b1, 0x00ba, 0x00c2, 0x00cb, + 0x00d5, 0x00dd, 0x00e6, 0x00eb, 0x00f3, 0x00fd, 0x0108, 0x0112, + 0x011b, 0x0123, 0x012a, 0x012a, 0x0130, 0x0136, 0x013d, 0x0146, + 0x015c, 0x0166, 0x0178, 0x0180, 0x0189, 0x0193, 0x0199, 0x01a0, + 0x01a9, 0x01b0, 0x01b0, 0x01b8, 0x01bf, 0x01c8, 0x01d1, 0x01d1, + // Entry 40 - 7F + 0x01dd, 0x01e8, 0x01e8, 0x01ee, 0x01f8, 0x01f8, 0x01f8, 0x0203, + 0x020d, 0x0218, 0x0220, 0x0226, 0x022d, 0x0234, 0x023c, 0x023c, + 0x0244, 0x0251, 0x025b, 0x0264, 0x026b, 0x026b, 0x0275, 0x027c, + 0x0282, 0x0289, 0x0293, 0x029b, 0x02a6, 0x02ad, 0x02ad, 0x02b6, + 0x02bd, 0x02c8, 0x02d6, 0x02de, 0x02e6, 0x02e6, 0x02ed, 0x02f8, + 0x0303, 0x030d, 0x0316, 0x031f, 0x0326, 0x032d, 0x032d, 0x0344, + 0x034c, 0x034c, 0x0355, 0x0362, 0x0374, 0x0374, 0x0374, 0x037c, + 0x0385, 0x0385, 0x038c, 0x0393, 0x039b, 0x03a4, 0x03a4, 0x03ad, + // Entry 80 - BF + 0x03b5, 0x03bb, 0x03c4, 0x03ce, 0x03d5, 0x03de, 0x03e4, 0x03ef, + 0x03fa, 0x03fa, 0x0402, 0x0416, 0x041d, 0x0426, 0x0430, 0x043a, + 0x0441, 0x0448, 0x0450, 0x0459, 0x0461, 0x0468, 0x047a, 0x0481, + 0x0488, 0x0491, 0x0498, 0x04a0, 0x04a8, 0x04b2, 0x04bc, 0x04c8, + 0x04d0, 0x04d7, 0x04df, 0x04e7, 0x04ef, 0x04f7, 0x04ff, 0x0508, + 0x050e, 0x0516, 0x051d, 0x0528, 0x0528, 0x0528, 0x0530, 0x0537, + 0x053d, 0x0545, 0x0545, 0x054c, 0x0552, 0x0552, 0x0559, 0x0559, + 0x0559, 0x0559, 0x0559, 0x0560, 0x0560, 0x0560, 0x0560, 0x0560, + // Entry C0 - FF + 0x0560, 0x0560, 0x0560, 0x0560, 0x0560, 0x0569, 0x0569, 0x0569, + 0x057e, 0x057e, 0x057e, 0x058f, 0x0594, 0x0594, 0x0594, 0x0594, + 0x0594, 0x0594, 0x0594, 0x0594, 0x0594, 0x0594, 0x0594, 0x0594, + 0x0594, 0x059b, 0x059b, 0x05a1, 0x05a1, 0x05a1, 0x05b8, 0x05b8, + 0x05b8, 0x05b8, 0x05b8, 0x05b8, 0x05b8, 0x05b8, 0x05b8, 0x05b8, + 0x05b8, 0x05be, 0x05be, 0x05be, 0x05be, 0x05be, 0x05be, 0x05be, + 0x05be, 0x05be, 0x05be, 0x05be, 0x05be, 0x05c5, 0x05c5, 0x05c5, + 0x05c5, 0x05c5, 0x05c5, 0x05c5, 0x05c5, 0x05cf, 0x05cf, 0x05e1, + // Entry 100 - 13F + 0x05e1, 0x05e1, 0x05e1, 0x05e1, 0x05e1, 0x05e1, 0x05e8, 0x05e8, + 0x05e8, 0x05e8, 0x05e8, 0x05ef, 0x05ef, 0x05fd, 0x05fd, 0x0604, + 0x0604, 0x0610, 0x0610, 0x0610, 0x0616, 0x061d, 0x061d, 0x061d, + 0x061d, 0x061d, 0x061d, 0x061d, 0x061d, 0x061d, 0x061d, 0x0627, + 0x0627, 0x0627, 0x0627, 0x0627, 0x0627, 0x0627, 0x0627, 0x0627, + 0x0627, 0x062b, 0x0634, 0x0634, 0x0634, 0x0634, 0x0634, 0x0634, + 0x0634, 0x0634, 0x0634, 0x0634, 0x0634, 0x0634, 0x0634, 0x0634, + 0x0634, 0x063c, 0x0651, 0x0651, 0x0651, 0x0658, 0x0658, 0x0658, + // Entry 140 - 17F + 0x0658, 0x065f, 0x065f, 0x065f, 0x0665, 0x0665, 0x0668, 0x0668, + 0x0668, 0x0668, 0x0668, 0x0668, 0x0668, 0x0668, 0x0668, 0x0668, + 0x0670, 0x0679, 0x0679, 0x0679, 0x0679, 0x0679, 0x0682, 0x0682, + 0x0682, 0x0689, 0x0689, 0x0689, 0x0689, 0x0689, 0x0692, 0x06a0, + 0x06a0, 0x06a6, 0x06a6, 0x06a6, 0x06a6, 0x06b4, 0x06b4, 0x06b4, + 0x06b4, 0x06be, 0x06c6, 0x06d3, 0x06dc, 0x06dc, 0x06dc, 0x06dc, + 0x06dc, 0x06dc, 0x06dc, 0x06dc, 0x06e4, 0x06eb, 0x06eb, 0x06eb, + 0x06eb, 0x06eb, 0x06f2, 0x06f2, 0x06fa, 0x06fa, 0x06fa, 0x06fa, + // Entry 180 - 1BF + 0x06fa, 0x0702, 0x0702, 0x0702, 0x0708, 0x071c, 0x071c, 0x0728, + 0x0728, 0x0728, 0x072f, 0x072f, 0x0736, 0x0736, 0x0736, 0x0736, + 0x0736, 0x073e, 0x073e, 0x073e, 0x073e, 0x0746, 0x0746, 0x0746, + 0x0746, 0x0746, 0x074c, 0x0756, 0x0756, 0x0766, 0x076c, 0x076c, + 0x076c, 0x076c, 0x076c, 0x0774, 0x0774, 0x0774, 0x077d, 0x077d, + 0x077d, 0x077d, 0x077d, 0x077d, 0x077d, 0x077d, 0x078a, 0x078a, + 0x078a, 0x0790, 0x0793, 0x079b, 0x079b, 0x079b, 0x079b, 0x07a3, + 0x07a3, 0x07a3, 0x07a3, 0x07a3, 0x07a9, 0x07be, 0x07c4, 0x07d5, + // Entry 1C0 - 1FF + 0x07d5, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, + 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, + 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07df, 0x07e8, 0x07e8, + 0x07e8, 0x07e8, 0x07e8, 0x07e8, 0x07e8, 0x07ef, 0x07ef, 0x07ef, + 0x07ef, 0x07ef, 0x07ef, 0x07f4, 0x07f4, 0x07f4, 0x07f4, 0x07fd, + 0x07fd, 0x07fd, 0x07fd, 0x07fd, 0x0804, 0x0804, 0x0804, 0x0804, + 0x0816, 0x0816, 0x081c, 0x081c, 0x081c, 0x082b, 0x082b, 0x082b, + 0x0836, 0x0836, 0x0836, 0x0836, 0x0836, 0x0836, 0x0847, 0x0856, + // Entry 200 - 23F + 0x0866, 0x0876, 0x0876, 0x0876, 0x0876, 0x0876, 0x0876, 0x0876, + 0x087e, 0x087e, 0x087e, 0x087e, 0x0886, 0x0886, 0x0886, 0x0886, + 0x0886, 0x0886, 0x088c, 0x088c, 0x0893, 0x0893, 0x0893, 0x0893, + 0x0893, 0x089d, 0x089d, 0x089d, 0x089d, 0x089d, 0x08a7, 0x08a7, + 0x08a7, 0x08a7, 0x08a7, 0x08a7, 0x08b0, 0x08b0, 0x08b9, 0x08b9, + 0x08d0, 0x08d0, 0x08d0, 0x08d0, 0x08e3, 0x08e8, 0x08e8, 0x08e8, + 0x08e8, 0x08e8, 0x08e8, 0x08e8, 0x08ef, 0x08ef, 0x08ef, 0x08ef, + 0x08ef, 0x08f9, 0x08f9, 0x08f9, 0x08f9, 0x08ff, 0x0904, 0x0904, + // Entry 240 - 27F + 0x0904, 0x0904, 0x0904, 0x0904, 0x0904, 0x0904, 0x0904, 0x0904, + 0x091f, 0x091f, 0x0936, 0x0936, 0x094f, 0x094f, 0x094f, 0x094f, + 0x094f, 0x094f, 0x094f, 0x094f, 0x094f, 0x094f, 0x094f, 0x094f, + 0x094f, 0x094f, 0x094f, 0x094f, 0x094f, 0x094f, 0x094f, 0x094f, + 0x096a, 0x097a, +} // Size: 1244 bytes + +var taLangStr string = "" + // Size: 12271 bytes + "அஃபார்அப்காஜியான்அவெஸ்தான்ஆஃப்ரிகான்ஸ்அகான்அம்ஹாரிக்ஆர்கோனீஸ்அரபிக்அஸ்ஸா" + + "மீஸ்அவேரிக்அய்மராஅஸர்பைஜானிபஷ்கிர்பெலாருஷியன்பல்கேரியன்பிஸ்லாமாபம்பாரா" + + "வங்காளம்திபெத்தியன்பிரெட்டன்போஸ்னியன்கேட்டலான்செச்சென்சாமோரோகார்சிகன்க" + + "்ரீசெக்சர்ச் ஸ்லாவிக்சுவாஷ்வேல்ஷ்டேனிஷ்ஜெர்மன்திவேஹிபூடானிஈவ்கிரேக்கம்" + + "ஆங்கிலம்எஸ்பரேன்டோஸ்பானிஷ்எஸ்டோனியன்பாஸ்க்பெர்ஷியன்ஃபுலாஃபின்னிஷ்ஃபிஜி" + + "யன்ஃபரோயிஸ்பிரெஞ்சுமேற்கு ஃப்ரிஷியன்ஐரிஷ்ஸ்காட்ஸ் கேலிக்காலிஸியன்குரான" + + "ிகுஜராத்திமேங்க்ஸ்ஹௌஸாஹீப்ரூஇந்திஹிரி மோட்டுகுரோஷியன்ஹைத்தியன்ஹங்கேரிய" + + "ன்ஆர்மேனியன்ஹெரேரோஇண்டர்லிங்வாஇந்தோனேஷியன்இன்டர்லிங்இக்போசிசுவான் ஈஇனு" + + "பியாக்இடோஐஸ்லேண்டிக்இத்தாலியன்இனுகிடூட்ஜப்பானியம்ஜாவனீஸ்ஜார்ஜியன்காங்க" + + "ோகிகுயூகுவான்யாமாகசாக்கலாலிசூட்கெமெர்கன்னடம்கொரியன்கனுரிகாஷ்மிரிகுர்தி" + + "ஷ்கோமிகார்னிஷ்கிர்கிஸ்லத்தின்லக்ஸம்போர்கிஷ்கான்டாலிம்பர்கிஷ்லிங்காலாலா" + + "வோலிதுவேனியன்லுபா-கடாங்காலாட்வியன்மலகாஸிமார்ஷெலிஷ்மௌரிமாஸிடோனியன்மலையா" + + "ளம்மங்கோலியன்மராத்திமலாய்மால்டிஸ்பர்மீஸ்நவ்ரூவடக்கு தெபெலேநேபாளிதோங்கா" + + "டச்சுநார்வேஜியன் நியூநார்ஸ்க்நார்வேஜியன் பொக்மால்தெற்கு தெபெலேநவாஜோநயன" + + "்ஜாஒக்கிடன்ஓஜிபவாஒரோமோஒரியாஒசெட்டிக்பஞ்சாபிபாலிபோலிஷ்பஷ்தோபோர்ச்சுக்கீ" + + "ஸ்கிவேசுவாரோமான்ஷ்ருண்டிரோமேனியன்ரஷியன்கின்யாருவான்டாசமஸ்கிருதம்சாடினி" + + "யன்சிந்திவடக்கு சமிசாங்கோசிங்களம்ஸ்லோவாக்ஸ்லோவேனியன்ஸாமோவான்ஷோனாசோமாலி" + + "அல்பேனியன்செர்பியன்ஸ்வாடீதெற்கு ஸோதோசுண்டானீஸ்ஸ்வீடிஷ்சுவாஹிலிதமிழ்தெல" + + "ுங்குதாஜிக்தாய்டிக்ரின்யாதுருக்மென்ஸ்வானாடோங்கான்துருக்கிஷ்ஸோங்காடாடர்" + + "டஹிதியான்உய்குர்உக்ரைனியன்உருதுஉஸ்பெக்வென்டாவியட்நாமிஸ்ஒலாபூக்ஒவாலூன்ஒ" + + "லூஃப்ஹோசாஇத்திஷ்யோருபாஜுவாங்சீனம்ஜுலுஆச்சினீஸ்அகோலிஅதாங்மேஅதகேதுனிசிய " + + "அரபுஅஃப்ரிஹிலிஅகெம்ஐனுஅக்கேதியன்அலூட்தெற்கு அல்தைபழைய ஆங்கிலம்அங்கிகாஅ" + + "ராமைக்மபுசேஅரபஹோஅராவாக்அசுஅஸ்துரியன்அவதிபெலுசிபலினீஸ்பாஸாபேஜாபெம்பாபென" + + "ாபடகாமேற்கு பலோச்சிபோஜ்பூரிபிகோல்பினிசிக்சிகாபிஷ்ணுப்பிரியாப்ராஜ்போடோப" + + "ுரியாத்புகினீஸ்ப்லின்கேடோகரீப்ஆட்சம்செபுவானோசிகாசிப்சாஷகதைசூகிசேமாரிசி" + + "னூக் ஜார்கான்சோக்தௌசிபெவ்யான்செரோகீசெயேனிமத்திய குர்திஷ்காப்டிக்கிரிமி" + + "யன் துர்க்கிகஷுபியன்தகோடாதார்குவாடைடாதெலாவேர்ஸ்லாவ்டோக்ரிப்டின்காசார்ம" + + "ாடோக்ரிலோயர் சோர்பியன்டுவாலாமத்திய டச்சுஜோலா-ஃபோன்யிட்யூலாஎம்புஎஃபிக்ப" + + "ண்டைய எகிப்தியன்ஈகாஜுக்எலமைட்மத்திய ஆங்கிலம்எவோன்டோஃபங்க்ஃபிலிபினோஃபான" + + "்மத்திய ஃப்ரென்ச்பழைய ஃப்ரென்ச்வடக்கு ஃப்ரிஸியான்கிழக்கு ஃப்ரிஸியான்ஃப" + + "்ரியூலியன்காகாகௌஸ்கயோபயாகீஜ்கில்பெர்டீஸ்மத்திய ஹை ஜெர்மன்பழைய ஹை ஜெர்ம" + + "ன்கோன்டிகோரோன்டலோகோதிக்க்ரேபோபண்டைய கிரேக்கம்ஜெர்மன் (ஸ்விஸ்)குஸிகுவிச" + + "ின்ஹைடாஹவாயியன்பிஜி இந்திஹிலிகாய்னான்ஹிட்டைட்மாங்க்அப்பர் சோர்பியான்ஹு" + + "பாஇபான்இலோகோஇங்குஷ்லோஜ்பன்நகொம்பாமாசெம்ஜூதேயோ-பெர்ஷியன்ஜூதேயோ-அராபிக்க" + + "ாரா-கல்பாக்கபாய்ல்காசின்ஜ்ஜூகம்பாகாவிகபார்டியன்தையாப்மகொண்டேகபுவெர்திய" + + "ானுகோரோகாஸிகோதானீஸ்கொய்ரா சீனீகலின்ஜின்கிம்புன்துகொமி-பெர்ம்யாக்கொங்கண" + + "ிகோஸ்ரைன்க்பெல்லேகராசே-பல்கார்கரேலியன்குருக்ஷம்பாலாபாஃபியாகும்இக்குடேன" + + "ைலடினோலங்கிலஹன்டாலம்பாலெஜ்ஜியன்லகோடாமோங்கோலோசிவடக்கு லுரிலுபா-லுலுலாலு" + + "ய்சேனோலூன்டாலுயோலுஷய்லுயியாமதுரீஸ்மகாஹிமைதிலிமகாசார்மான்டிங்கோமாசாய்மோ" + + "க்க்ஷாமான்டார்மென்டீமெருமொரிசியன்மத்திய ஐரிஷ்மகுவா-மீட்டோமேடாமிக்மாக்ம" + + "ின்னாங்கபௌமன்சுமனிபூரிமொஹாக்மோஸ்ஸிமுன்டாங்பல மொழிகள்க்ரீக்மிரான்டீஸ்மா" + + "ர்வாரிஏர்ஜியாமசந்தேரனிநியோபோலிடன்நாமாலோ ஜெர்மன்நெவாரிநியாஸ்நியூவான்க்வ" + + "ாசியோநோகைபழைய நோர்ஸ்என்‘கோவடக்கு சோதோநியூர்பாரம்பரிய நேவாரிநியாம்வேஜிந" + + "ியான்கோலேநியோரோநிஜ்மாஓசேஜ்ஒட்டோமன் துர்க்கிபன்காசினன்பாஹ்லவிபம்பாங்காப" + + "பியேமென்டோபலௌவ்ன்பென்சில்வேனிய ஜெர்மன்பழைய பெர்ஷியன்ஃபொனிஷியன்ஃபோன்பெய" + + "ென்பழைய ப்ரோவென்சால்கீசீராஜஸ்தானிரபனுய்ரரோடோங்கன்ரோம்போரோமானிஅரோமானியன" + + "்ருவாசான்டாவேயாகுட்சமாரிடன் அராமைக்சம்புருசாசாக்சான்டாலிசௌராஷ்டிரம்சங்" + + "குசிசிலியன்ஸ்காட்ஸ்தெற்கு குர்திஷ்செனாசெல்குப்கொய்ராபோரோ சென்னிபழைய ஐர" + + "ிஷ்தசேஹித்ஷான்சிடாமோதெற்கு சமிலுலே சமிஇனாரி சமிஸ்கோல்ட் சமிசோனின்கேசோக" + + "்தியன்ஸ்ரானன் டோங்கோசெரெர்சுகுமாசுசுசுமேரியன்கொமோரியன்காங்கோ சுவாஹிலிப" + + "ாரம்பரிய சிரியாக்சிரியாக்டிம்னேடெசோடெரெனோடெடும்டைக்ரேடிவ்டோகேலௌக்ளிங்க" + + "ோன்டிலிங்கிட்டாமாஷேக்நயாசா டோங்காடோக் பிஸின்ட்ஸிம்ஷியன்தும்புகாடுவாலுட" + + "சவாக்டுவினியன்மத்திய அட்லஸ் டமசைட்உட்முர்ட்உகாரிட்க்அம்பொண்டுரூட்வைவோட" + + "்க்வுன்ஜோவாலாமோவாரேவாஷோவல்பிரிகல்மிக்சோகாயாவ்யாபேசிகாண்டோனீஸ்ஜாபோடெக்ப" + + "்லிஸ்ஸிம்பால்ஸ்ஜெனகாஸ்டாண்டர்ட் மொராக்கன் தமாசைட்ஜூனிமொழி உள்ளடக்கம் ஏ" + + "துமில்லைஜாஜாநவீன நிலையான அரபிக்ஆஸ்திரிய ஜெர்மன்ஸ்விஸ் ஹை ஜெர்மன்ஆஸ்திர" + + "ேலிய ஆங்கிலம்கனடிய ஆங்கிலம்பிரிட்டிஷ் ஆங்கிலம்அமெரிக்க ஆங்கிலம்ஸ்பானிஷ" + + "் (ஐரோப்பா)கனடிய பிரெஞ்சுஸ்விஸ் பிரஞ்சுலோ சாக்ஸன்ஃப்லெமிஷ்போர்ச்சுகீஸ்" + + " (பிரேசில்)போர்ச்சுகீஸ் (ஐரோப்பா)மோல்டாவியன்செர்போ-க்ரோஷியன்எளிதாக்கப்பட" + + "்ட சீனம்பாரம்பரிய சீனம்" + +var taLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0012, 0x0033, 0x004e, 0x0072, 0x0081, 0x009c, 0x00b7, + 0x00c9, 0x00e4, 0x00f9, 0x010b, 0x0129, 0x013e, 0x015f, 0x017d, + 0x0195, 0x01aa, 0x01c2, 0x01e3, 0x01fe, 0x0219, 0x0234, 0x024c, + 0x025e, 0x0279, 0x0285, 0x0291, 0x02b9, 0x02cb, 0x02dd, 0x02ef, + 0x0304, 0x0316, 0x0328, 0x0331, 0x034c, 0x0364, 0x0382, 0x039a, + 0x03b8, 0x03ca, 0x03e5, 0x03f4, 0x040f, 0x0427, 0x043f, 0x0457, + 0x0488, 0x0497, 0x04c2, 0x04dd, 0x04ef, 0x050a, 0x0522, 0x052e, + 0x0540, 0x054f, 0x056e, 0x0589, 0x05a4, 0x05c2, 0x05e0, 0x05f2, + // Entry 40 - 7F + 0x0616, 0x063a, 0x0658, 0x0667, 0x0683, 0x069e, 0x06a7, 0x06c8, + 0x06e6, 0x0701, 0x071f, 0x0734, 0x074f, 0x0761, 0x0773, 0x0791, + 0x07a0, 0x07bb, 0x07cd, 0x07e2, 0x07f7, 0x0806, 0x081e, 0x0836, + 0x0842, 0x085a, 0x0872, 0x0887, 0x08b1, 0x08c3, 0x08e4, 0x08fc, + 0x0908, 0x0929, 0x094b, 0x0966, 0x0978, 0x0996, 0x09a2, 0x09c3, + 0x09db, 0x09f9, 0x0a0e, 0x0a1d, 0x0a35, 0x0a4a, 0x0a59, 0x0a7e, + 0x0a90, 0x0aa2, 0x0ab1, 0x0af7, 0x0b31, 0x0b56, 0x0b65, 0x0b77, + 0x0b8f, 0x0ba1, 0x0bb0, 0x0bbf, 0x0bda, 0x0bef, 0x0bfb, 0x0c0d, + // Entry 80 - BF + 0x0c1c, 0x0c46, 0x0c5e, 0x0c76, 0x0c88, 0x0ca3, 0x0cb5, 0x0cdf, + 0x0d00, 0x0d1b, 0x0d2d, 0x0d49, 0x0d5b, 0x0d73, 0x0d8b, 0x0dac, + 0x0dc4, 0x0dd0, 0x0de2, 0x0e00, 0x0e1b, 0x0e2d, 0x0e4c, 0x0e6a, + 0x0e82, 0x0e9a, 0x0ea9, 0x0ec1, 0x0ed3, 0x0edf, 0x0efd, 0x0f1b, + 0x0f2d, 0x0f45, 0x0f63, 0x0f75, 0x0f84, 0x0f9f, 0x0fb4, 0x0fd2, + 0x0fe1, 0x0ff6, 0x1008, 0x1029, 0x103e, 0x1053, 0x1065, 0x1071, + 0x1086, 0x1098, 0x10aa, 0x10b9, 0x10c5, 0x10e0, 0x10ef, 0x1104, + 0x1110, 0x1132, 0x1150, 0x115f, 0x1168, 0x1186, 0x1186, 0x1195, + // Entry C0 - FF + 0x1195, 0x11b7, 0x11dc, 0x11f1, 0x1206, 0x1215, 0x1215, 0x1224, + 0x1224, 0x1239, 0x1239, 0x1239, 0x1242, 0x1242, 0x1260, 0x1260, + 0x126c, 0x127e, 0x1293, 0x1293, 0x129f, 0x129f, 0x129f, 0x129f, + 0x12ab, 0x12bd, 0x12bd, 0x12c9, 0x12c9, 0x12d5, 0x12fd, 0x1315, + 0x1327, 0x1333, 0x1333, 0x1333, 0x134b, 0x1375, 0x1375, 0x1387, + 0x1387, 0x1393, 0x1393, 0x13ab, 0x13c3, 0x13c3, 0x13d5, 0x13d5, + 0x13e1, 0x13f0, 0x13f0, 0x1402, 0x141a, 0x1426, 0x1438, 0x1444, + 0x1456, 0x1462, 0x148d, 0x149f, 0x14bd, 0x14cf, 0x14e1, 0x150c, + // Entry 100 - 13F + 0x1524, 0x1524, 0x1558, 0x1570, 0x157f, 0x1597, 0x15a3, 0x15bb, + 0x15cd, 0x15e5, 0x15f7, 0x1609, 0x161b, 0x1646, 0x1646, 0x1658, + 0x167a, 0x169c, 0x16ae, 0x16ae, 0x16bd, 0x16cf, 0x16cf, 0x1700, + 0x1715, 0x1727, 0x1752, 0x1752, 0x1767, 0x1767, 0x1779, 0x1794, + 0x1794, 0x17a3, 0x17a3, 0x17d1, 0x17f9, 0x17f9, 0x182d, 0x1864, + 0x1888, 0x188e, 0x18a0, 0x18a0, 0x18a9, 0x18b2, 0x18b2, 0x18be, + 0x18e2, 0x18e2, 0x1911, 0x193a, 0x193a, 0x194c, 0x1967, 0x1979, + 0x198b, 0x19b9, 0x19e3, 0x19e3, 0x19e3, 0x19ef, 0x1a07, 0x1a13, + // Entry 140 - 17F + 0x1a13, 0x1a2b, 0x1a47, 0x1a6b, 0x1a83, 0x1a95, 0x1ac6, 0x1ac6, + 0x1ad2, 0x1ae1, 0x1ae1, 0x1af0, 0x1b05, 0x1b05, 0x1b05, 0x1b1a, + 0x1b2f, 0x1b41, 0x1b6f, 0x1b97, 0x1b97, 0x1bb9, 0x1bce, 0x1be0, + 0x1bec, 0x1bfb, 0x1c07, 0x1c25, 0x1c25, 0x1c37, 0x1c4c, 0x1c73, + 0x1c73, 0x1c7f, 0x1c7f, 0x1c8b, 0x1ca3, 0x1cc2, 0x1cc2, 0x1cc2, + 0x1cc2, 0x1cdd, 0x1cfb, 0x1d26, 0x1d3b, 0x1d53, 0x1d6b, 0x1d90, + 0x1d90, 0x1d90, 0x1da8, 0x1dba, 0x1dcf, 0x1de4, 0x1de4, 0x1df9, + 0x1e0b, 0x1e1a, 0x1e29, 0x1e3b, 0x1e4a, 0x1e65, 0x1e65, 0x1e65, + // Entry 180 - 1BF + 0x1e65, 0x1e74, 0x1e74, 0x1e86, 0x1e92, 0x1eb1, 0x1eb1, 0x1ed0, + 0x1ee8, 0x1efa, 0x1f06, 0x1f15, 0x1f27, 0x1f27, 0x1f27, 0x1f3c, + 0x1f3c, 0x1f4b, 0x1f5d, 0x1f72, 0x1f90, 0x1fa2, 0x1fa2, 0x1fba, + 0x1fd2, 0x1fe4, 0x1ff0, 0x200b, 0x202d, 0x204f, 0x205b, 0x2073, + 0x2094, 0x20a3, 0x20b8, 0x20ca, 0x20dc, 0x20dc, 0x20f4, 0x2110, + 0x2122, 0x2140, 0x2158, 0x2158, 0x2158, 0x216d, 0x2188, 0x2188, + 0x21a9, 0x21b5, 0x21d1, 0x21e3, 0x21f5, 0x220d, 0x220d, 0x2225, + 0x2225, 0x2231, 0x2250, 0x2250, 0x2262, 0x2281, 0x2293, 0x22c1, + // Entry 1C0 - 1FF + 0x22df, 0x22fd, 0x230f, 0x2321, 0x2330, 0x2361, 0x237f, 0x2394, + 0x23af, 0x23d0, 0x23e5, 0x23e5, 0x2422, 0x2422, 0x244a, 0x244a, + 0x2468, 0x2468, 0x2468, 0x2489, 0x2489, 0x24ba, 0x24c6, 0x24c6, + 0x24e1, 0x24f3, 0x2511, 0x2511, 0x2511, 0x2523, 0x2535, 0x2535, + 0x2535, 0x2535, 0x2553, 0x255f, 0x2577, 0x2589, 0x25b7, 0x25cc, + 0x25de, 0x25f6, 0x2617, 0x2617, 0x2626, 0x2641, 0x2659, 0x2659, + 0x2684, 0x2684, 0x2690, 0x2690, 0x26a8, 0x26d9, 0x26f5, 0x26f5, + 0x270a, 0x2716, 0x2716, 0x2728, 0x2728, 0x2728, 0x2744, 0x275a, + // Entry 200 - 23F + 0x2773, 0x2795, 0x27ad, 0x27c8, 0x27f0, 0x2802, 0x2802, 0x2802, + 0x2814, 0x2820, 0x283b, 0x2856, 0x2881, 0x28b5, 0x28cd, 0x28cd, + 0x28cd, 0x28df, 0x28eb, 0x28fd, 0x290f, 0x2921, 0x292d, 0x293f, + 0x293f, 0x295d, 0x297b, 0x297b, 0x2993, 0x29b5, 0x29d4, 0x29d4, + 0x29d4, 0x29d4, 0x29f5, 0x29f5, 0x2a0d, 0x2a1f, 0x2a31, 0x2a4c, + 0x2a84, 0x2a9f, 0x2aba, 0x2ad5, 0x2ae1, 0x2ae7, 0x2ae7, 0x2ae7, + 0x2ae7, 0x2ae7, 0x2af9, 0x2af9, 0x2b0b, 0x2b0b, 0x2b1d, 0x2b29, + 0x2b35, 0x2b4a, 0x2b4a, 0x2b5f, 0x2b5f, 0x2b6b, 0x2b77, 0x2b89, + // Entry 240 - 27F + 0x2b89, 0x2b89, 0x2b89, 0x2ba7, 0x2bbf, 0x2bef, 0x2bef, 0x2bfe, + 0x2c51, 0x2c5d, 0x2ca4, 0x2cb0, 0x2ce5, 0x2ce5, 0x2d13, 0x2d42, + 0x2d79, 0x2da1, 0x2dd8, 0x2e09, 0x2e09, 0x2e39, 0x2e39, 0x2e39, + 0x2e61, 0x2e89, 0x2ea5, 0x2ec0, 0x2eff, 0x2f3b, 0x2f5c, 0x2f8a, + 0x2fc4, 0x2fef, +} // Size: 1244 bytes + +var teLangStr string = "" + // Size: 11712 bytes + "అఫార్అబ్ఖాజియన్అవేస్టాన్ఆఫ్రికాన్స్అకాన్అమ్హారిక్అరగోనిస్అరబిక్అస్సామీఅవ" + + "ారిక్ఐమారాఅజర్బైజానిబష్కిర్బెలరుశియన్బల్గేరియన్బిస్లామాబంబారాబెంగాలీటి" + + "బెటన్బ్రెటన్బోస్నియన్కెటలాన్చెచెన్చమర్రోకోర్సికన్క్రిచెక్చర్చ స్లావిక్" + + "చువాష్వెల్ష్డేనిష్జర్మన్దివేహిజొన్ఖాఈవీగ్రీక్ఆంగ్లంఎస్పరెన్టొస్పానిష్ఈ" + + "స్టొనియన్బాస్క్పర్షియన్ఫ్యులఫిన్నిష్ఫిజియన్ఫారోయీజ్ఫ్రెంచ్పశ్చిమ ఫ్రిస" + + "ియన్ఐరిష్స్కాటిష్ గేలిక్గెలిషియన్గురానిగుజరాతిమంకస్హౌసాహీబ్రుహిందీహిరి" + + " మోటుక్రొయెషియన్హైతియన్హన్గేరియన్ఆర్మేనియన్హిరేరోఇంటర్లింగ్వాఇండోనేషియన్" + + "ఇంటర్ లింగ్ఇగ్బోశిషువన్ ఈఇనూపైఏక్ఈడౌఐస్లాండిక్ఇటాలియన్ఇనుక్టిటుట్జాపనీ" + + "స్జావనీస్జార్జియన్కోంగోకికుయుక్వాన్యామకజఖ్కలాల్లిసూట్ఖ్మేర్కన్నడకొరియన" + + "్కానురికాశ్మీరికుర్దిష్కోమికోర్నిష్కిర్గిజ్లాటిన్లుక్సంబర్గిష్గాండాలిమ" + + "్బర్గిష్లింగాలలావోలిథుయేనియన్లూబ-కటాంగలాట్వియన్మాలాగసిమార్షలీస్మయోరిమస" + + "డోనియన్మలయాళంమంగోలియన్మరాఠీమలేయ్మాల్టీస్బర్మీస్నౌరుఉత్తర దెబెలెనేపాలిద" + + "ోంగాడచ్నార్విజియాన్ న్యోర్స్క్నార్వీజియన్ బొక్మాల్దక్షిణ దెబెలెనవాహోన్" + + "యాన్జాఆక్సిటన్చేవాఒరోమోఒరియాఒసేటిక్పంజాబీపాలీపోలిష్పాష్టోపోర్చుగీస్కెష" + + "ుయారోమన్ష్రండిరోమానియన్రష్యన్కిన్యర్వాండాసంస్కృతంసార్డీనియన్సింధీఉత్తర" + + " సామిసాంగోసింహళంస్లోవాక్స్లోవేనియాన్సమోవన్షోనసోమాలిఅల్బేనియన్సెర్బియన్స్" + + "వాతిదక్షిణ సోతోసుడానీస్స్వీడిష్స్వాహిలితమిళముతెలుగుతజిక్థాయ్తిగ్రిన్యా" + + "తుర్కమెన్సెటస్వానాటాంగాన్టర్కిష్సోంగాటాటర్తహితియన్ఉయ్\u200cఘర్ఉక్రేనియ" + + "న్ఉర్దూఉజ్బెక్వెండావియత్నామీస్వోలాపుక్వాలూన్వొలాఫ్షోసాఇడ్డిష్యోరుబాజువ" + + "ాన్చైనీస్జూలూఆఖినీస్అకోలిఅడాంగ్మేఅడిగాబ్జేఅఫ్రిహిలిఅగేమ్ఐనుఅక్కాడియాన్" + + "అలియుట్దక్షిణ ఆల్టైప్రాచీన ఆగ్లంఆంగికఅరామేక్అరౌకేనియన్అరాపాహోఅరావాక్అస" + + "ుఅస్టురియాన్అవధిబాలుచిబాలినీస్బసాబేజాబెంబాబీనాపశ్చిమ బలూచీభోజ్ పూరిబిక" + + "ోల్బినిసిక్ సికాబ్రాజ్బోడోబురియట్బ్యుగినిస్బ్లిన్కేడ్డోకేరిబ్అట్సామ్సే" + + "బుఆనోఛిగాచిబ్చాచాగటైచూకిస్మారిచినూక్ జార్గన్చొచ్కతావ్చిపెవ్యాన్చెరోకీచ" + + "ేయేన్సెంట్రల్ కుర్దిష్కోప్టిక్క్రిమియన్ టర్కిష్కషుబియన్డకోటాడార్గ్వాటై" + + "టాడెలావేర్స్లేవ్డోగ్రిబ్డింకాజార్మాడోగ్రిలోవర్ సోర్బియన్దుఆలామధ్యమ డచ్" + + "జోలా-ఫోనయిడ్యులాఇంబుఎఫిక్ప్రాచీన ఇజిప్షియన్ఏకాజక్ఎలామైట్మధ్యమ ఆంగ్లంఎవ" + + "ోండొఫాంగ్ఫిలిపినోఫాన్మధ్యమ ప్రెంచ్ప్రాచీన ప్రెంచ్ఉత్తర ఫ్రిసియన్తూర్పు" + + " ఫ్రిసియన్ఫ్రియులియన్గాగాగౌజ్గాయోగ్బాయాజీజ్గిల్బర్టీస్మధ్యమ హై జర్మన్ప్ర" + + "ాచీన హై జర్మన్గోండిగోరోంటలాగోథిక్గ్రేబోప్రాచీన గ్రీక్స్విస్ జర్మన్గుస్" + + "సీగ్విచిన్హైడాహవాయియన్హిలి గేయినోన్హిట్టిటేమోంగ్అప్పర్ సోర్బియన్హుపాఐబ" + + "ాన్ఐయోకోఇంగుష్లోజ్బాన్గోంబామకొమ్జ్యుడియో-పర్షియన్జ్యుడియో-అరబిక్కారా-క" + + "ల్పాక్కాబిల్కాచిన్జ్యూకంబాకావికబార్డియన్ట్యాప్మకొండేకాబువేర్దియనుకోరోఖ" + + "ాసిఖటోనీస్కొయరా చీన్నీకలెంజిన్కిమ్బుండుకోమి-పర్మాక్కొంకణికోస్రేయన్పెల్" + + "లేకరచే-బల్కార్కరేలియన్కూరుఖ్శంబాలాబాఫియకుమ్యిక్కుటేనైలాడినోలాంగీలాహండా" + + "లాంబాలేజ్ఘియన్లకొటామొంగోలోజిఉత్తర లూరీలుబా-లులువలుఇసేనోలుండాలువోలుషైలు" + + "యియమాదురీస్మగాహిమైథిలిమకాసార్మండింగోమాసాయిమొక్షామండార్మెండేమెరుమొరిస్య" + + "ేన్మధ్యమ ఐరిష్మక్వా-మిట్టోమెటామికమాక్మినాంగ్కాబోమంచుమణిపూరిమోహుక్మోస్స" + + "ిముదాంగ్బహుళ భాషలుక్రీక్మిరాండిస్మార్వాడిఎర్జియామాసన్\u200cదెరానినియాప" + + "ోలిటన్నమలో జర్మన్నెవారినియాస్నియూఇయాన్క్వాసియెనోగైప్రాచిన నోర్స్న్కోఉత" + + "్తర సోతోన్యుర్సాంప్రదాయ న్యుఆరిన్యంవేజిన్యాన్కోలెనిఓరోజీమాఒసాజ్ఒట్టోమన" + + "్ టర్కిష్పంగా సినాన్పహ్లావిపంపగ్నపపియమేంటోపాలుఆన్ప్రాచీన పర్షియన్ఫోనిక" + + "న్పోహ్న్పెయన్ప్రాచీన ప్రోవెంసాల్కిచేరాజస్తానిరాపన్యుయిరారోటొంగాన్రోంబో" + + "రోమానీఆరోమేనియన్ర్వాసండావియాకుట్సమారిటన్ అరమేక్సంబురుససక్సంటాలిసాంగుసి" + + "సిలియన్స్కాట్స్దక్షిణ కుర్దిష్సెనాసేల్కప్కోయోరాబోరో సెన్నీప్రాచీన ఐరిష" + + "్టాచెల్\u200cహిట్షాన్సిడామోదక్షిణ సామిలులే సామిఇనారి సామిస్కోల్ట్ సామి" + + "సోనింకిసోగ్డియన్స్రానన్ టోనగోసెరేర్సుకుమాసుసుసుమేరియాన్కొమొరియన్కాంగో " + + "స్వాహిలిసాంప్రదాయ సిరియాక్సిరియాక్టింనేటెసోటెరెనోటేటంటీగ్రెటివ్టోకెలావ" + + "్క్లింగాన్లింగిట్టామషేక్న్యాసా టోన్గాటోక్ పిసిన్శింషీయన్టుంబుకాటువాలుట" + + "సావాఖ్టువినియన్సెంట్రల్ అట్లాస్ టామాజైట్ఉడ్ముర్ట్ఉగారిటిక్ఉమ్బుండురూట్" + + "వాయివోటిక్వుంజొవాలామోవారేవాషోవార్లపిరికల్మిక్సొగాయాఒయాపిస్కాంటనీస్జపోట" + + "ెక్బ్లిసింబల్స్జెనాగాప్రామాణిక మొరొకన్ తమజియట్జునిలిపి లేదుజాజాఆధునిక " + + "ప్రామాణిక అరబిక్ఆస్ట్రేలియన్ జర్మన్స్విస్ హై జర్మన్ఆస్ట్రేలియన్ ఇంగ్లీ" + + "ష్కెనడియన్ ఇంగ్లీష్బ్రిటిష్ ఇంగ్లీష్అమెరికన్ ఇంగ్లీష్లాటిన్ అమెరికెన్ " + + "స్పానిష్యూరోపియన్ స్పానిష్మెక్సికన్ స్పానిష్కెనడియెన్ ఫ్రెంచ్స్విస్ ఫ్" + + "రెంచ్లో సాక్సన్ఫ్లెమిష్బ్రెజీలియన్ పోర్చుగీస్యూరోపియన్ పోర్చుగీస్మొల్డ" + + "ావియన్సేర్బో-క్రొయేషియన్సరళీకృత చైనీస్సాంప్రదాయక చైనీస్" + +var teLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x000f, 0x002d, 0x0048, 0x0069, 0x0078, 0x0093, 0x00ab, + 0x00bd, 0x00d2, 0x00e7, 0x00f6, 0x0114, 0x0129, 0x0147, 0x0165, + 0x017d, 0x018f, 0x01a4, 0x01b9, 0x01ce, 0x01e9, 0x01fe, 0x0210, + 0x0222, 0x023d, 0x0249, 0x0255, 0x027a, 0x028c, 0x029e, 0x02b0, + 0x02c2, 0x02d4, 0x02e6, 0x02ef, 0x0301, 0x0313, 0x0331, 0x0349, + 0x0367, 0x0379, 0x0391, 0x03a0, 0x03b8, 0x03cd, 0x03e5, 0x03fa, + 0x0428, 0x0437, 0x0462, 0x047d, 0x048f, 0x04a4, 0x04b3, 0x04bf, + 0x04d1, 0x04e0, 0x04f9, 0x051a, 0x052f, 0x054d, 0x056b, 0x057d, + // Entry 40 - 7F + 0x05a1, 0x05c2, 0x05e1, 0x05f0, 0x0609, 0x0621, 0x062a, 0x0648, + 0x0660, 0x0681, 0x0696, 0x06ab, 0x06c6, 0x06d5, 0x06e7, 0x0702, + 0x070e, 0x072f, 0x0741, 0x0750, 0x0765, 0x0777, 0x078f, 0x07a7, + 0x07b3, 0x07cb, 0x07e3, 0x07f5, 0x081c, 0x082b, 0x084c, 0x085e, + 0x086a, 0x088b, 0x08a4, 0x08bf, 0x08d4, 0x08ef, 0x08fe, 0x0919, + 0x092b, 0x0946, 0x0955, 0x0964, 0x097c, 0x0991, 0x099d, 0x09bf, + 0x09d1, 0x09e0, 0x09e9, 0x0a2c, 0x0a66, 0x0a8b, 0x0a9a, 0x0ab2, + 0x0aca, 0x0ad6, 0x0ae5, 0x0af4, 0x0b09, 0x0b1b, 0x0b27, 0x0b39, + // Entry 80 - BF + 0x0b4b, 0x0b69, 0x0b7b, 0x0b90, 0x0b9c, 0x0bb7, 0x0bc9, 0x0bed, + 0x0c05, 0x0c26, 0x0c35, 0x0c51, 0x0c60, 0x0c72, 0x0c8a, 0x0cae, + 0x0cc0, 0x0cc9, 0x0cdb, 0x0cf9, 0x0d14, 0x0d26, 0x0d45, 0x0d5d, + 0x0d75, 0x0d8d, 0x0d9f, 0x0db1, 0x0dc0, 0x0dcc, 0x0dea, 0x0e05, + 0x0e20, 0x0e35, 0x0e4a, 0x0e59, 0x0e68, 0x0e80, 0x0e95, 0x0eb3, + 0x0ec2, 0x0ed7, 0x0ee6, 0x0f07, 0x0f1f, 0x0f31, 0x0f43, 0x0f4f, + 0x0f64, 0x0f76, 0x0f88, 0x0f9a, 0x0fa6, 0x0fbb, 0x0fca, 0x0fe2, + 0x0ffd, 0x0ffd, 0x1018, 0x1027, 0x1030, 0x1051, 0x1051, 0x1066, + // Entry C0 - FF + 0x1066, 0x1088, 0x10ad, 0x10bc, 0x10d1, 0x10ef, 0x10ef, 0x1104, + 0x1104, 0x1119, 0x1119, 0x1119, 0x1122, 0x1122, 0x1143, 0x1143, + 0x114f, 0x1161, 0x1179, 0x1179, 0x1182, 0x1182, 0x1182, 0x1182, + 0x118e, 0x119d, 0x119d, 0x11a9, 0x11a9, 0x11a9, 0x11cb, 0x11e4, + 0x11f6, 0x1202, 0x1202, 0x1202, 0x121b, 0x121b, 0x121b, 0x122d, + 0x122d, 0x1239, 0x1239, 0x124e, 0x126c, 0x126c, 0x127e, 0x127e, + 0x1290, 0x12a2, 0x12a2, 0x12b7, 0x12cc, 0x12d8, 0x12ea, 0x12f9, + 0x130b, 0x1317, 0x133f, 0x135a, 0x1378, 0x138a, 0x139c, 0x13cd, + // Entry 100 - 13F + 0x13e5, 0x13e5, 0x1416, 0x142e, 0x143d, 0x1455, 0x1461, 0x1479, + 0x148b, 0x14a3, 0x14b2, 0x14c4, 0x14d6, 0x1501, 0x1501, 0x1510, + 0x1529, 0x1545, 0x1557, 0x1557, 0x1563, 0x1572, 0x1572, 0x15a6, + 0x15b8, 0x15cd, 0x15ef, 0x15ef, 0x1601, 0x1601, 0x1610, 0x1628, + 0x1628, 0x1634, 0x1634, 0x1659, 0x1684, 0x1684, 0x16af, 0x16dd, + 0x16fe, 0x1704, 0x1716, 0x1716, 0x1722, 0x1734, 0x1734, 0x1740, + 0x1761, 0x1761, 0x178a, 0x17b9, 0x17b9, 0x17c8, 0x17e0, 0x17f2, + 0x1804, 0x182c, 0x1851, 0x1851, 0x1851, 0x1863, 0x187b, 0x1887, + // Entry 140 - 17F + 0x1887, 0x189f, 0x189f, 0x18c4, 0x18dc, 0x18eb, 0x1919, 0x1919, + 0x1925, 0x1934, 0x1934, 0x1943, 0x1955, 0x1955, 0x1955, 0x196d, + 0x197c, 0x198b, 0x19bc, 0x19e7, 0x19e7, 0x1a09, 0x1a1b, 0x1a2d, + 0x1a39, 0x1a45, 0x1a51, 0x1a6f, 0x1a6f, 0x1a81, 0x1a93, 0x1aba, + 0x1aba, 0x1ac6, 0x1ac6, 0x1ad2, 0x1ae7, 0x1b09, 0x1b09, 0x1b09, + 0x1b09, 0x1b21, 0x1b3c, 0x1b5e, 0x1b70, 0x1b8b, 0x1b9d, 0x1bbf, + 0x1bbf, 0x1bbf, 0x1bd7, 0x1be9, 0x1bfb, 0x1c0a, 0x1c0a, 0x1c22, + 0x1c34, 0x1c46, 0x1c55, 0x1c67, 0x1c76, 0x1c91, 0x1c91, 0x1c91, + // Entry 180 - 1BF + 0x1c91, 0x1ca0, 0x1ca0, 0x1caf, 0x1cbb, 0x1cd7, 0x1cd7, 0x1cf3, + 0x1d08, 0x1d17, 0x1d23, 0x1d2f, 0x1d3e, 0x1d3e, 0x1d3e, 0x1d56, + 0x1d56, 0x1d65, 0x1d77, 0x1d8c, 0x1da1, 0x1db3, 0x1db3, 0x1dc5, + 0x1dd7, 0x1de6, 0x1df2, 0x1e10, 0x1e2f, 0x1e51, 0x1e5d, 0x1e72, + 0x1e93, 0x1e9f, 0x1eb4, 0x1ec6, 0x1ed8, 0x1ed8, 0x1eed, 0x1f09, + 0x1f1b, 0x1f36, 0x1f4e, 0x1f4e, 0x1f4e, 0x1f63, 0x1f87, 0x1f87, + 0x1fa8, 0x1fae, 0x1fc7, 0x1fd9, 0x1feb, 0x2006, 0x2006, 0x201e, + 0x201e, 0x202a, 0x2052, 0x2052, 0x205e, 0x207a, 0x208c, 0x20bd, + // Entry 1C0 - 1FF + 0x20d5, 0x20f3, 0x2102, 0x210e, 0x211d, 0x214b, 0x216a, 0x217f, + 0x2191, 0x21ac, 0x21c1, 0x21c1, 0x21c1, 0x21c1, 0x21ef, 0x21ef, + 0x2204, 0x2204, 0x2204, 0x2225, 0x2225, 0x225c, 0x2268, 0x2268, + 0x2283, 0x229e, 0x22bf, 0x22bf, 0x22bf, 0x22ce, 0x22e0, 0x22e0, + 0x22e0, 0x22e0, 0x22fe, 0x230a, 0x231c, 0x232e, 0x2359, 0x236b, + 0x2377, 0x2389, 0x2389, 0x2389, 0x2398, 0x23b3, 0x23cb, 0x23cb, + 0x23f6, 0x23f6, 0x2402, 0x2402, 0x2417, 0x2448, 0x246d, 0x246d, + 0x248e, 0x249a, 0x249a, 0x24ac, 0x24ac, 0x24ac, 0x24cb, 0x24e4, + // Entry 200 - 23F + 0x2500, 0x2525, 0x253a, 0x2555, 0x257a, 0x258c, 0x258c, 0x258c, + 0x259e, 0x25aa, 0x25c8, 0x25e3, 0x260b, 0x263f, 0x2657, 0x2657, + 0x2657, 0x2666, 0x2672, 0x2684, 0x2690, 0x26a2, 0x26ae, 0x26c6, + 0x26c6, 0x26e1, 0x26f6, 0x26f6, 0x270b, 0x2730, 0x274f, 0x274f, + 0x274f, 0x274f, 0x2767, 0x2767, 0x277c, 0x278e, 0x27a3, 0x27be, + 0x2805, 0x2820, 0x283b, 0x2853, 0x285f, 0x286b, 0x286b, 0x286b, + 0x286b, 0x286b, 0x287d, 0x287d, 0x288c, 0x288c, 0x289e, 0x28aa, + 0x28b6, 0x28d1, 0x28d1, 0x28e6, 0x28e6, 0x28f2, 0x28fb, 0x290d, + // Entry 240 - 27F + 0x290d, 0x290d, 0x290d, 0x2925, 0x293a, 0x295e, 0x295e, 0x2970, + 0x29b7, 0x29c3, 0x29dc, 0x29e8, 0x2a29, 0x2a29, 0x2a60, 0x2a8c, + 0x2ac9, 0x2afa, 0x2b2b, 0x2b5c, 0x2ba3, 0x2bd7, 0x2c0b, 0x2c0b, + 0x2c3c, 0x2c64, 0x2c80, 0x2c98, 0x2cd8, 0x2d12, 0x2d33, 0x2d67, + 0x2d8f, 0x2dc0, +} // Size: 1244 bytes + +var thLangStr string = "" + // Size: 13735 bytes + "อะฟาร์อับคาซอเวสตะแอฟริกานส์อาคันอัมฮาราอารากอนอาหรับอัสสัมอาวาร์ไอย์มาร" + + "าอาเซอร์ไบจานบัชคีร์เบลารุสบัลแกเรียบิสลามาบัมบาราเบงกาลีทิเบตเบรตันบอ" + + "สเนียกาตาลังเชเชนชามอร์โรคอร์ซิกาครีเช็กเชอร์ชสลาวิกชูวัชเวลส์เดนมาร์ก" + + "เยอรมันธิเวหิซองคาเอเวกรีกอังกฤษเอสเปอรันโตสเปนเอสโตเนียบัสเกเปอร์เซีย" + + "ฟูลาฮ์ฟินแลนด์ฟิจิแฟโรฝรั่งเศสฟริเซียนตะวันตกไอริชสกอตส์กาลิกกาลิเซียก" + + "วารานีคุชราตมานซ์เฮาชาฮิบรูฮินดีฮีรีโมตูโครเอเชียเฮติฮังการีอาร์เมเนีย" + + "เฮเรโรอินเตอร์ลิงกัวอินโดนีเชียอินเตอร์ลิงกิวอิกโบเสฉวนยิอีนูเปียกอีโด" + + "ไอซ์แลนด์อิตาลีอินุกติตุตญี่ปุ่นชวาจอร์เจียคองโกกีกูยูกวนยามาคาซัคกรีน" + + "แลนด์เขมรกันนาดาเกาหลีคานูรีกัศมีร์เคิร์ดโกมิคอร์นิชคีร์กีซละตินลักเซม" + + "เบิร์กยูกันดาลิมเบิร์กลิงกาลาลาวลิทัวเนียลูบา-กาตองกาลัตเวียมาลากาซีมา" + + "ร์แชลลิสเมารีมาซิโดเนียมาลายาลัมมองโกเลียมราฐีมาเลย์มอลตาพม่านาอูรูเอ็" + + "นเดเบเลเหนือเนปาลดองกาดัตช์นอร์เวย์นีนอสก์นอร์เวย์บุคมอลเอ็นเดเบเลใต้น" + + "าวาโฮเนียนจาอ็อกซิตันโอจิบวาโอโรโมโอริยาออสเซเตียปัญจาบบาลีโปแลนด์พาชต" + + "ูโปรตุเกสควิชัวโรแมนซ์บุรุนดีโรมาเนียรัสเซียรวันดาสันสกฤตซาร์เดญาสินธุ" + + "ซามิเหนือแซงโกสิงหลสโลวักสโลวีเนียซามัวโชนาโซมาลีแอลเบเนียเซอร์เบียสวา" + + "ติโซโทใต้ซุนดาสวีเดนสวาฮีลีทมิฬเตลูกูทาจิกไทยติกริญญาเติร์กเมนิสถานบอต" + + "สวานาตองกาตุรกีซิิตซองกาตาตาร์ตาฮิตีอุยกัวยูเครนอูรดูอุซเบกเวนดาเวียดน" + + "ามโวลาพึควาโลนีโวลอฟคะห์โอซายิวโยรูบาจ้วงจีนซูลูอาเจะห์อาโคลิอาแดงมีอะ" + + "ดืยเกอาหรับตูนิเซียแอฟริฮีลีอักเฮมไอนุอักกาดแอละแบมาอาลิวต์เกกแอลเบเนี" + + "ยอัลไตใต้อังกฤษโบราณอังคิกาอราเมอิกอาเราคาเนียนอาเรานาอาราปาโฮอาหรับแอ" + + "ลจีเรียอาราวักอาหรับโมร็อกโกอาหรับพื้นเมืองอียิปต์อาซูภาษามืออเมริกันอ" + + "ัสตูเรียสโคตาวาอวธีบาลูชิบาหลีบาวาเรียบาสาบามันบาตักโทบาโคมาลาเบจาเบมบ" + + "าเบตาวีเบนาบาฟัตพทคะบาลูจิตะวันออกโภชปุรีบิกอลบินีบันจาร์กมสิกสิกาพิศน" + + "ุปริยะบักติยารีพัรชบราฮุยโพโฑอาโคซีบูเรียตบูกิสบูลูบลินเมดุมบาคัดโดคาร" + + "ิบคายูกาแอตแซมเซบูคีกาชิบชาชะกะไตชูกมารีชินุกจาร์กอนช็อกทอว์ชิพิวยันเช" + + "อโรกีเชเยนเนเคิร์ดโซรานีคอปติกกาปิซนอนตุรกีไครเมียคาซูเบียนดาโกทาดาร์ก" + + "ินไททาเดลาแวร์สเลวีโดกริบดิงกาซาร์มาโฑครีซอร์บส์ตอนล่างดูซุนกลางดัวลาด" + + "ัตช์กลางโจลา-ฟอนยีดิวลาดาซากาเอ็มบูอีฟิกเอมีเลียอียิปต์โบราณอีกาจุกอีล" + + "าไมต์อังกฤษกลางยูพิกกลางอีวันโดเอกซ์เตรมาดูราฟองฟิลิปปินส์ฟินแลนด์ทอร์" + + "เนดาเล็นฟอนฝรั่งเศสกาฌ็องฝรั่งเศสกลางฝรั่งเศสโบราณอาร์พิตาฟริเซียนเหนื" + + "อฟริเซียนตะวันออกฟรูลีกากากาอุซจีนกานกาโยกบายาดารีโซโรอัสเตอร์กีซกิลเบ" + + "อร์ตกิลากีเยอรมันสูงกลางเยอรมันสูงโบราณกอนกานีของกัวกอนดิกอรอนทาโลโกธิ" + + "กเกรโบกรีกโบราณเยอรมันสวิสวายูฟราฟรากุซซีกวิชอินไฮดาจีนแคะฮาวายฮินดีฟิ" + + "จิฮีลีกัยนนฮิตไตต์ม้งซอร์บส์ตอนบนจีนเซียงฮูปาอิบานอิบิบิโออีโลโกอินกุช" + + "อินเกรียนอังกฤษคลีโอลจาเมกาโลชบันอึนกอมบามาชาเมยิว-เปอร์เซียยิว-อาหรับ" + + "จัทการา-กาลพากกาไบลกะฉิ่นคจูคัมบากวีคาร์บาเดียคาเนมบูทีแยปมาคอนเดคาบูเ" + + "วอร์เดียนูเกินยางโคโรเคนก่างกาสีโคตันโคย์ราชีนีโควาร์เคอร์มานิกิคาโกคา" + + "เลนจินคิมบุนดูโคมิ-เปียร์เมียคกอนกานีคูสไรกาแปลคาราไช-บัลคาร์คริโอกินา" + + "รายอาแกรเลียนกุรุขชัมบาลาบาเฟียโคโลญคูมืยค์คูเทไนลาดิโนแลนจีลาฮ์นดาแลม" + + "บาเลซเกียนลิงกัวฟรังกาโนวาลิกูเรียลิโวเนียลาโกตาลอมบาร์ดมองโกโลซิลูรีเ" + + "หนือลัตเกลลูบา-ลูลัวลุยเซโนลันดาลัวลูไชลูเยียจีนคลาสสิกแลซมาดูรามาฟามค" + + "หีไมถิลีมากาซาร์มันดิงกามาไซมาบามอคชามานดาร์เมนเดเมรูมอริสเยนไอริชกลาง" + + "มากัววา-มีทโทเมตามิกแมกมีนังกาเบาแมนจูมณีปุระโมฮอว์กโมซีมารีตะวันตกมัน" + + "ดังหลายภาษาครีกมีรันดามารวาฑีเม็นตาไวมยีนเอียร์ซยามาซันดารานีจีนมินหนา" + + "นนาโปลีนามาเยอรมันต่ำ - แซกซอนต่ำเนวาร์นีอัสนีอูอ๋าวนากากวาซิโอจีมบูนโ" + + "นไกนอร์สโบราณโนเวียลเอ็นโกโซโทเหนือเนือร์เนวาร์ดั้งเดิมเนียมเวซีเนียนโ" + + "กเลนิโอโรนซิมาโอซากีตุรกีออตโตมันปางาซีนันปะห์ลาวีปัมปางาปาเปียเมนโตปา" + + "เลาปิการ์เยอรมันเพนซิลเวเนียเพลาท์ดิชเปอร์เซียโบราณเยอรมันพาลาทิเนตฟิน" + + "ิเชียพีดมอนต์พอนติกพอห์นเพปรัสเซียโปรวองซาลโบราณกีเชควิชัวไฮแลนด์ชิมโบ" + + "ราโซราชสถานราปานูราโรทองกาโรมัณโญริฟฟิอันรอมโบโรมานีโรทูมันรูซินโรเวีย" + + "นาอาโรมาเนียนรวาซันดาเวซาฮาอราเมอิกซามาเรียแซมบูรูซาซักสันตาลีเสาราษฏร" + + "์กัมเบแซงกูซิซิลีสกอตส์ซาร์ดิเนียซาสซารีเคอร์ดิชใต้เซนิกาเซนาเซรีเซลคุ" + + "ปโคย์ราโบโรเซนนีไอริชโบราณซาโมจิเตียนทาเชลีห์ทไทใหญ่อาหรับ-ชาดซิดาโมไซ" + + "ลีเซียตอนล่างเซลายาร์ซามิใต้ซามิลูเลซามิอีนารีซามิสคอลต์โซนีนเกซอกดีนซ" + + "ูรินาเมเซแรร์ซาโฮฟรีเซียนซัทเธอร์แลนด์ซูคูมาซูซูซูเมอโคเมอเรียนสวาฮีลี" + + "-คองโกซีเรียแบบดั้งเดิมซีเรียไซลีเซียตูลูทิมเนเตโซเทเรโนเตตุมตีเกรทิฟโตเ" + + "กเลาแซคเซอร์คลิงกอนทลิงกิตทาลิชทามาเชกไนอะซาตองกาท็อกพิซินตูโรโยทาโรโก" + + "ซาโคเนียซิมชีแอนตัตมุสลิมทุมบูกาตูวาลูตัสซาวัคตูวาทามาไซต์แอตลาสกลางอุ" + + "ดมูร์ตยูการิตอุมบุนดูรูทไวเวเนโต้เวปส์เฟลมิชตะวันตกเมน-ฟรานโกเนียโวทิก" + + "โวโรวุนจูวัลเซอร์วาลาโมวาเรย์วาโชวอล์เพอร์รีจีนอู๋คัลมืยค์เมเกรเลียโซก" + + "าเย้ายัปแยงเบนเยมบาเหงงกาตุกวางตุ้งซาโปเตกบลิสซิมโบลส์เซแลนด์เซนากาทาม" + + "าไซต์โมร็อกโกมาตรฐานซูนิไม่มีข้อมูลภาษาซาซาอาหรับมาตรฐานสมัยใหม่เยอรมั" + + "น - ออสเตรียเยอรมันสูง (สวิส)อังกฤษ - ออสเตรเลียอังกฤษ - แคนาดาอังกฤษ " + + "- สหราชอาณาจักรอังกฤษ - อเมริกันสเปน - ละตินอเมริกาสเปน - ยุโรปสเปน - เม" + + "็กซิโกฝรั่งเศส - แคนาดาฝรั่งเศส (สวิส)แซกซอนใต้เฟลมิชโปรตุเกส - บราซิล" + + "โปรตุเกส - ยุโรปมอลโดวาเซอร์โบ-โครเอเชียจีนตัวย่อจีนตัวเต็ม" + +var thLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0012, 0x0024, 0x0036, 0x0054, 0x0063, 0x0078, 0x008d, + 0x009f, 0x00b1, 0x00c3, 0x00db, 0x00ff, 0x0114, 0x0129, 0x0144, + 0x0159, 0x016e, 0x0183, 0x0192, 0x01a4, 0x01b9, 0x01ce, 0x01dd, + 0x01f5, 0x020d, 0x0216, 0x0222, 0x0246, 0x0255, 0x0264, 0x027c, + 0x0291, 0x02a3, 0x02b2, 0x02be, 0x02ca, 0x02dc, 0x02fd, 0x0309, + 0x0324, 0x0333, 0x034e, 0x0360, 0x0378, 0x0384, 0x0390, 0x03a8, + 0x03d5, 0x03e4, 0x0405, 0x041d, 0x0432, 0x0444, 0x0453, 0x0462, + 0x0471, 0x0480, 0x0498, 0x04b3, 0x04bf, 0x04d4, 0x04f2, 0x0504, + // Entry 40 - 7F + 0x052e, 0x054f, 0x0579, 0x0588, 0x059d, 0x05b8, 0x05c4, 0x05df, + 0x05f1, 0x060f, 0x0624, 0x062d, 0x0645, 0x0654, 0x0666, 0x067b, + 0x068a, 0x06a5, 0x06b1, 0x06c6, 0x06d8, 0x06ea, 0x06ff, 0x0711, + 0x071d, 0x0732, 0x0747, 0x0756, 0x077a, 0x078f, 0x07aa, 0x07bf, + 0x07c8, 0x07e3, 0x0805, 0x081a, 0x0832, 0x0850, 0x085f, 0x087d, + 0x0898, 0x08b3, 0x08c2, 0x08d4, 0x08e3, 0x08ef, 0x0901, 0x092e, + 0x093d, 0x094c, 0x095b, 0x0988, 0x09b2, 0x09d9, 0x09eb, 0x0a00, + 0x0a1b, 0x0a30, 0x0a42, 0x0a54, 0x0a6f, 0x0a81, 0x0a8d, 0x0aa2, + // Entry 80 - BF + 0x0ab1, 0x0ac9, 0x0adb, 0x0af0, 0x0b05, 0x0b1d, 0x0b32, 0x0b44, + 0x0b59, 0x0b71, 0x0b80, 0x0b9b, 0x0baa, 0x0bb9, 0x0bcb, 0x0be6, + 0x0bf5, 0x0c01, 0x0c13, 0x0c2e, 0x0c49, 0x0c58, 0x0c6d, 0x0c7c, + 0x0c8e, 0x0ca3, 0x0caf, 0x0cc1, 0x0cd0, 0x0cd9, 0x0cf1, 0x0d1b, + 0x0d33, 0x0d42, 0x0d51, 0x0d6c, 0x0d7e, 0x0d90, 0x0da2, 0x0db4, + 0x0dc3, 0x0dd5, 0x0de4, 0x0dfc, 0x0e11, 0x0e23, 0x0e32, 0x0e4a, + 0x0e53, 0x0e65, 0x0e71, 0x0e7a, 0x0e86, 0x0e9b, 0x0ead, 0x0ec2, + 0x0ed7, 0x0f01, 0x0f1c, 0x0f2e, 0x0f3a, 0x0f4c, 0x0f64, 0x0f79, + // Entry C0 - FF + 0x0f9d, 0x0fb5, 0x0fd6, 0x0feb, 0x1003, 0x1027, 0x103c, 0x1054, + 0x1081, 0x1096, 0x10c0, 0x1102, 0x110e, 0x113b, 0x1159, 0x116b, + 0x1177, 0x1189, 0x1198, 0x11b0, 0x11bc, 0x11cb, 0x11e6, 0x11f8, + 0x1204, 0x1213, 0x1225, 0x1231, 0x1240, 0x124c, 0x1276, 0x128b, + 0x129a, 0x12a6, 0x12bb, 0x12c1, 0x12d6, 0x12f4, 0x130f, 0x131b, + 0x132d, 0x1339, 0x134b, 0x1360, 0x136f, 0x137b, 0x1387, 0x139c, + 0x13ab, 0x13ba, 0x13cc, 0x13de, 0x13ea, 0x13f6, 0x1405, 0x1417, + 0x1420, 0x142c, 0x1450, 0x1468, 0x1480, 0x1495, 0x14aa, 0x14ce, + // Entry 100 - 13F + 0x14e0, 0x14f8, 0x151c, 0x1537, 0x1549, 0x155e, 0x156a, 0x1582, + 0x1591, 0x15a3, 0x15b2, 0x15c4, 0x15d3, 0x15fd, 0x1618, 0x1627, + 0x1642, 0x165e, 0x166d, 0x167f, 0x1691, 0x16a0, 0x16b8, 0x16dc, + 0x16f1, 0x1709, 0x1727, 0x1742, 0x1757, 0x1781, 0x178a, 0x17a8, + 0x17e4, 0x17ed, 0x1817, 0x183b, 0x1862, 0x187a, 0x18a1, 0x18d1, + 0x18e0, 0x18e6, 0x18fb, 0x190d, 0x1919, 0x1928, 0x1958, 0x1961, + 0x197c, 0x198e, 0x19b8, 0x19e5, 0x1a0c, 0x1a1b, 0x1a36, 0x1a45, + 0x1a54, 0x1a6f, 0x1a90, 0x1a9c, 0x1aae, 0x1abd, 0x1ad2, 0x1ade, + // Entry 140 - 17F + 0x1af0, 0x1aff, 0x1b1a, 0x1b35, 0x1b4a, 0x1b53, 0x1b77, 0x1b8f, + 0x1b9b, 0x1baa, 0x1bc2, 0x1bd4, 0x1be6, 0x1c01, 0x1c37, 0x1c49, + 0x1c61, 0x1c73, 0x1c98, 0x1cb4, 0x1cbd, 0x1cdc, 0x1ceb, 0x1cfd, + 0x1d06, 0x1d15, 0x1d1e, 0x1d3c, 0x1d51, 0x1d60, 0x1d75, 0x1da2, + 0x1db7, 0x1dc3, 0x1dd8, 0x1de4, 0x1df3, 0x1e11, 0x1e23, 0x1e44, + 0x1e50, 0x1e68, 0x1e80, 0x1eae, 0x1ec3, 0x1ed2, 0x1ee1, 0x1f09, + 0x1f18, 0x1f33, 0x1f4b, 0x1f5a, 0x1f6f, 0x1f81, 0x1f90, 0x1fa5, + 0x1fb7, 0x1fc9, 0x1fd8, 0x1fed, 0x1ffc, 0x2014, 0x2044, 0x205c, + // Entry 180 - 1BF + 0x2074, 0x2086, 0x209e, 0x20ad, 0x20b9, 0x20d4, 0x20e6, 0x2102, + 0x2117, 0x2126, 0x212f, 0x213b, 0x214d, 0x216b, 0x2174, 0x2186, + 0x2192, 0x219e, 0x21b0, 0x21c8, 0x21e0, 0x21ec, 0x21f8, 0x2207, + 0x221c, 0x222b, 0x2237, 0x224f, 0x226a, 0x228f, 0x229b, 0x22ad, + 0x22cb, 0x22da, 0x22ef, 0x2304, 0x2310, 0x2331, 0x2343, 0x235b, + 0x2367, 0x237c, 0x2391, 0x23a9, 0x23b5, 0x23d0, 0x23f1, 0x240f, + 0x2421, 0x242d, 0x2469, 0x247b, 0x248a, 0x2496, 0x24ae, 0x24c3, + 0x24d5, 0x24e1, 0x24ff, 0x2514, 0x2526, 0x2541, 0x2553, 0x257d, + // Entry 1C0 - 1FF + 0x2598, 0x25b3, 0x25c5, 0x25d4, 0x25e6, 0x260d, 0x2628, 0x2640, + 0x2655, 0x2676, 0x2685, 0x2697, 0x26d0, 0x26eb, 0x2715, 0x2745, + 0x275d, 0x2775, 0x2787, 0x279c, 0x27b4, 0x27de, 0x27ea, 0x282c, + 0x2841, 0x2853, 0x286e, 0x2883, 0x289b, 0x28aa, 0x28bc, 0x28d1, + 0x28e0, 0x28f8, 0x2919, 0x2922, 0x2937, 0x2943, 0x2973, 0x2988, + 0x2997, 0x29ac, 0x29c7, 0x29d6, 0x29e5, 0x29f7, 0x2a09, 0x2a3c, + 0x2a5d, 0x2a6f, 0x2a7b, 0x2a87, 0x2a99, 0x2ac6, 0x2ae4, 0x2b05, + 0x2b20, 0x2b32, 0x2b4e, 0x2b60, 0x2b8d, 0x2ba5, 0x2bba, 0x2bd2, + // Entry 200 - 23F + 0x2bf0, 0x2c0e, 0x2c23, 0x2c35, 0x2c4d, 0x2c5f, 0x2c6b, 0x2caa, + 0x2cbc, 0x2cc8, 0x2cd7, 0x2cf5, 0x2d1a, 0x2d4d, 0x2d5f, 0x2d77, + 0x2d83, 0x2d92, 0x2d9e, 0x2db0, 0x2dbf, 0x2dce, 0x2dd7, 0x2dec, + 0x2e04, 0x2e19, 0x2e2e, 0x2e3d, 0x2e52, 0x2e73, 0x2e8e, 0x2ea0, + 0x2eb2, 0x2eca, 0x2ee2, 0x2efd, 0x2f12, 0x2f24, 0x2f3c, 0x2f48, + 0x2f7e, 0x2f96, 0x2fab, 0x2fc3, 0x2fcc, 0x2fd2, 0x2fe7, 0x2ff6, + 0x301d, 0x3045, 0x3054, 0x3060, 0x306f, 0x3087, 0x3099, 0x30ab, + 0x30b7, 0x30d8, 0x30ea, 0x3102, 0x311d, 0x3129, 0x3135, 0x313e, + // Entry 240 - 27F + 0x3150, 0x315f, 0x3177, 0x318f, 0x31a4, 0x31c8, 0x31dd, 0x31ef, + 0x3234, 0x3240, 0x326d, 0x3279, 0x32b8, 0x32b8, 0x32e8, 0x3315, + 0x3348, 0x336f, 0x33ab, 0x33d8, 0x340b, 0x3429, 0x3450, 0x3450, + 0x347d, 0x34a4, 0x34bf, 0x34d1, 0x34fe, 0x3528, 0x353d, 0x356e, + 0x3589, 0x35a7, +} // Size: 1244 bytes + +var trLangStr string = "" + // Size: 5557 bytes + "AfarAbhazcaAvestçeAfrikaancaAkanAmharcaAragoncaArapçaAssamcaAvar DiliAym" + + "araAzericeBaşkırtçaBeyaz RusçaBulgarcaBislamaBambaraBengalceTibetçeBreto" + + "ncaBoşnakçaKatalancaÇeçenceChamorroKorsikacaCreeÇekçeKilise SlavcasıÇuva" + + "şçaGalceDancaAlmancaDivehiButan DiliEweYunancaİngilizceEsperantoİspanyo" + + "lcaEstoncaBaskçaFarsçaFulahFinceFiji DiliFaroe DiliFransızcaBatı Frizces" + + "iİrlandacaİskoç Gal DiliGaliçyacaGuarani DiliGüceratçaManksHausaİbranice" + + "HintçeHiri MotuHırvatçaHaiti DiliMacarcaErmeniceHereroInterlinguaEndonez" + + "ceInterlingueİbo DiliSichuan YiInupiakIdoİzlandacaİtalyancaInuktitutJapo" + + "ncaCava DiliGürcüceKongoKikuyuKuanyamaKazakçaGrönland DiliKmerceKannadaK" + + "oreceKanuriKeşmirceKürtçeKomiKernevekçeKırgızcaLatinceLüksemburgcaGandaL" + + "imburgcaLingalaLaocaLitvancaLuba-KatangaLetoncaMalgaşçaMarshall Adaları " + + "DiliMaori DiliMakedoncaMalayalamMoğolcaMarathiMalaycaMaltacaBurmacaNauru" + + " DiliKuzey NdebeleNepalceNdongaHollandacaNorveççe NynorskNorveççe Bokmål" + + "Güney NdebeleNavaho DiliNyanjaOccitanOjibva DiliOromoOriya DiliOsetçePen" + + "capçaPaliLehçePeştucaPortekizceKeçuvacaRomanşçaKirundiRomenceRusçaKinyar" + + "wandaSanskritçeSardunya DiliSindhiKuzey SamiSangoSeylancaSlovakçaSlovenc" + + "eSamoa DiliShonaSomaliceArnavutçaSırpçaSisvatiGüney SothoSunda Diliİsveç" + + "çeSvahiliTamilceTelugu DiliTacikçeTaycaTigrinyaTürkmenceSetsvanaTongaca" + + "TürkçeTsongaTatarcaTahiti DiliUygurcaUkraynacaUrducaÖzbekçeVendaVietnamc" + + "aVolapükValoncaVolofçaZosaYidişYorubacaZhuangÇinceZulucaAchineseAcoliAda" + + "ngmeAdigeceTunus ArapçasıAfrihiliAghemAyni DiliAkad DiliAlabamacaAleutGh" + + "eg ArnavutçasıGüney AltaycaEski İngilizceAngikaAramiceAraukanya DiliArao" + + "naArapaho DiliCezayir ArapçasıArawak DiliFas ArapçasıMısır ArapçasıAsuAm" + + "erikan İşaret DiliAsturyascaKotavaAwadhiBaluchiBali DiliBavyera DiliBasa" + + " DiliBamunBatak TobaGhomalaBeja DiliBembaBetawiBenaBafutBadagaBatı Baloc" + + "hiArayaniceBikolBiniBanjar DiliKomSiksikaBishnupriyaBahtiyariBrajBrohice" + + "BodoAkooseBuryatBugisBuluBlinMedumbaCaddoCaribCayugaAtsamCebuanoKigacaCh" + + "ibchaÇağatay DiliChuukeseMariChinook JargonChoctawChipewyanÇerokiceŞayen" + + " DiliOrta KürtçeKıpticeCapiznonKırım TürkçesiKashubianDakotaDarginceTait" + + "aDelawareSlaveyDogribDinkaZarmaDogriAşağı SorbçaOrta KadazanDualaOrtaçağ" + + " FelemenkçesiJola-FonyiDyulaDazagaEmbuEfikEmilia DiliEski Mısır DiliEkaj" + + "ukElamOrtaçağ İngilizcesiMerkezi YupikçeEwondoEkstremadura DiliFangFilip" + + "inceTornedalin FincesiFonCajun FransızcasıOrtaçağ FransızcasıEski Fransı" + + "zcaArpitancaKuzey FrizceDoğu FrizcesiFriulianGaGagavuzcaGan ÇincesiGayoG" + + "bayaZerdüşt DaricesiGeezKiribati DiliGilaniceOrtaçağ Yüksek AlmancasıEsk" + + "i Yüksek AlmancaGoa KonkanicesiGondiGorontaloGotçaGreboAntik Yunancaİsvi" + + "çre AlmancasıWayuuFrafraGusiiGwichʼinHaidaHakka ÇincesiHawaii DiliFiji " + + "HintçesiHiligaynonHititçeHmongYukarı SorbçaXiang ÇincesiHupaIbanIbibioIl" + + "okoİnguşçaİngriya DiliJamaika Patois DiliLojbanNgombaMachameYahudi Farsç" + + "asıYahudi ArapçasıYutland DiliKarakalpakçaKabiliyeceKaçinJjuKambaKawiKab" + + "ardeyceKanembuTyapMakondeKabuverdianuKenyangKoroKaingangKhasiHotancaKoyr" + + "a ChiiniÇitral DiliKırmanççaKakoKalenjinKimbunduKomi-PermyakKonkaniKosra" + + "eanKpelleKaraçay-BalkarcaKrioKinaray-aKarelyacaKurukhShambalaBafiaKöln D" + + "iyalektiKumukçaKutenaiLadinoLangiLahndaLambaLezgiceLingua Franca NovaLig" + + "urcaLivoncaLakotacaLombardçaMongoLoziKuzey LuriLatgalianLuba-LuluaLuisen" + + "oLundaLuoLushaiLuyiaEdebi ÇinceLazcaMadura DiliMafaMagahiMaithiliMakasar" + + "MandingoMasaiMabaMokşa DiliMandarMendeMeruMorisyenOrtaçağ İrlandacasıMak" + + "huwa-MeettoMeta’MicmacMinangkabauMançurya DiliManipuriMohavk DiliMossiOv" + + "a ÇirmişçesiMundangBirden Fazla DilCreekMiranda DiliMarvariMentawaiMyene" + + "ErzyaMazenderancaMin Nan ÇincesiNapoliceNamaAşağı AlmancaNevariNiasNiuea" + + "nAo NagaKwasioNgiemboonNogaycaEski NorseNovialN’KoKuzey SothoNuerKlasik " + + "NevariNyamveziNyankoleNyoroNzimaOsageOsmanlı TürkçesiPangasinanPehlevi D" + + "iliPampangaPapiamentoPalau DiliPicard DiliPensilvanya AlmancasıPlautdiet" + + "schEski FarsçaPalatin AlmancasıFenike DiliPiyemonteceKuzeybatı KafkasyaP" + + "ohnpeianPrusyacaEski ProvensalKiçeceChimborazo Highland QuichuaRajasthan" + + "iRapanuiRarotonganRomanyolcaRif BerbericesiRomboRomancaRotumanRusinceRov" + + "ianaUlahçaRwaSandaveYakutçaSamarit AramcasıSamburuSasakSantaliSaurashtra" + + "NgambaySanguSicilyacaScotsSassari SarducaGüney KürtçesiSenecaSenaSeriSel" + + "kupKoyraboro SenniEski İrlandacaSamogitçeTaşelhitShan DiliÇad ArapçasıSi" + + "damoAşağı SilezyacaSelayarGüney SamiLule SamiInari SamiSkolt SamiSoninke" + + "Sogdiana DiliSranan TongoSererSahoSaterland FrizcesiSukumaSusuSümerceKom" + + "orcaKongo SvahiliKlasik SüryaniceSüryaniceSilezyacaTulucaTimneTesoTereno" + + "TetumTigreTivTokelauSahurcaKlingoncaTlingitTalışçaTamaşekNyasa TongaTok " + + "PisinTuroyoTarokoTsakoncaTsimshianTatçaTumbukaTuvaluTasawaqTuvacaOrta Fa" + + "s TamazigtiUdmurtçaUgarit DiliUmbunduKökenVaiVenedikçeVepsBatı FlamancaM" + + "ain Frankonya DiliVoticVõroVunjoWalserValamoVarayVaşoWarlpiriWu ÇincesiK" + + "almıkçaMegrelceSogaYaoYapçaYangbenYembaNheengatuKantoncaZapotek DiliBlis" + + " SembolleriZelandacaZenagaStandart Berberi Dili TamazightZuniDilbilim iç" + + "eriği yokZazacaModern Standart ArapçaGüney AzericeAvusturya Almancasıİsv" + + "içre Yüksek AlmancasıAvustralya İngilizcesiKanada İngilizcesiİngiliz İng" + + "ilizcesiAmerikan İngilizcesiLatin Amerika İspanyolcasıAvrupa İspanyolcas" + + "ıMeksika İspanyolcasıKanada Fransızcasıİsviçre FransızcasıAşağı Saksonc" + + "aFlamancaBrezilya PortekizcesiAvrupa PortekizcesiMoldovacaSırp-Hırvat Di" + + "liBasitleştirilmiş ÇinceGeleneksel Çince" + +var trLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0004, 0x000b, 0x0013, 0x001d, 0x0021, 0x0028, 0x0030, + 0x0037, 0x003e, 0x0047, 0x004d, 0x0054, 0x0060, 0x006c, 0x0074, + 0x007b, 0x0082, 0x008a, 0x0092, 0x009a, 0x00a4, 0x00ad, 0x00b6, + 0x00be, 0x00c7, 0x00cb, 0x00d2, 0x00e2, 0x00ec, 0x00f1, 0x00f6, + 0x00fd, 0x0103, 0x010d, 0x0110, 0x0117, 0x0121, 0x012a, 0x0135, + 0x013c, 0x0143, 0x014a, 0x014f, 0x0154, 0x015d, 0x0167, 0x0171, + 0x017f, 0x0189, 0x0199, 0x01a3, 0x01af, 0x01ba, 0x01bf, 0x01c4, + 0x01cd, 0x01d4, 0x01dd, 0x01e7, 0x01f1, 0x01f8, 0x0200, 0x0206, + // Entry 40 - 7F + 0x0211, 0x021a, 0x0225, 0x022e, 0x0238, 0x023f, 0x0242, 0x024c, + 0x0256, 0x025f, 0x0266, 0x026f, 0x0278, 0x027d, 0x0283, 0x028b, + 0x0293, 0x02a1, 0x02a7, 0x02ae, 0x02b4, 0x02ba, 0x02c3, 0x02cb, + 0x02cf, 0x02da, 0x02e4, 0x02eb, 0x02f8, 0x02fd, 0x0306, 0x030d, + 0x0312, 0x031a, 0x0326, 0x032d, 0x0337, 0x034d, 0x0357, 0x0360, + 0x0369, 0x0371, 0x0378, 0x037f, 0x0386, 0x038d, 0x0397, 0x03a4, + 0x03ab, 0x03b1, 0x03bb, 0x03cd, 0x03df, 0x03ed, 0x03f8, 0x03fe, + 0x0405, 0x0410, 0x0415, 0x041f, 0x0426, 0x042f, 0x0433, 0x0439, + // Entry 80 - BF + 0x0441, 0x044b, 0x0454, 0x045e, 0x0465, 0x046c, 0x0472, 0x047d, + 0x0488, 0x0495, 0x049b, 0x04a5, 0x04aa, 0x04b2, 0x04bb, 0x04c3, + 0x04cd, 0x04d2, 0x04da, 0x04e4, 0x04ec, 0x04f3, 0x04ff, 0x0509, + 0x0513, 0x051a, 0x0521, 0x052c, 0x0534, 0x0539, 0x0541, 0x054b, + 0x0553, 0x055a, 0x0562, 0x0568, 0x056f, 0x057a, 0x0581, 0x058a, + 0x0590, 0x0599, 0x059e, 0x05a7, 0x05af, 0x05b6, 0x05be, 0x05c2, + 0x05c8, 0x05d0, 0x05d6, 0x05dc, 0x05e2, 0x05ea, 0x05ef, 0x05f6, + 0x05fd, 0x060d, 0x0615, 0x061a, 0x0623, 0x062c, 0x0635, 0x063a, + // Entry C0 - FF + 0x064c, 0x065a, 0x0669, 0x066f, 0x0676, 0x0684, 0x068a, 0x0696, + 0x06a8, 0x06b3, 0x06c1, 0x06d3, 0x06d6, 0x06ec, 0x06f6, 0x06fc, + 0x0702, 0x0709, 0x0712, 0x071e, 0x0727, 0x072c, 0x0736, 0x073d, + 0x0746, 0x074b, 0x0751, 0x0755, 0x075a, 0x0760, 0x076d, 0x0776, + 0x077b, 0x077f, 0x078a, 0x078d, 0x0794, 0x079f, 0x07a8, 0x07ac, + 0x07b3, 0x07b7, 0x07bd, 0x07c3, 0x07c8, 0x07cc, 0x07d0, 0x07d7, + 0x07dc, 0x07e1, 0x07e7, 0x07ec, 0x07f3, 0x07f9, 0x0800, 0x080e, + 0x0816, 0x081a, 0x0828, 0x082f, 0x0838, 0x0841, 0x084c, 0x0859, + // Entry 100 - 13F + 0x0861, 0x0869, 0x087b, 0x0884, 0x088a, 0x0892, 0x0897, 0x089f, + 0x08a5, 0x08ab, 0x08b0, 0x08b5, 0x08ba, 0x08ca, 0x08d6, 0x08db, + 0x08f2, 0x08fc, 0x0901, 0x0907, 0x090b, 0x090f, 0x091a, 0x092b, + 0x0931, 0x0935, 0x094b, 0x095b, 0x0961, 0x0972, 0x0976, 0x097f, + 0x0991, 0x0994, 0x09a7, 0x09be, 0x09cd, 0x09d6, 0x09e2, 0x09f0, + 0x09f8, 0x09fa, 0x0a03, 0x0a0f, 0x0a13, 0x0a18, 0x0a2a, 0x0a2e, + 0x0a3b, 0x0a43, 0x0a5f, 0x0a73, 0x0a82, 0x0a87, 0x0a90, 0x0a96, + 0x0a9b, 0x0aa8, 0x0abc, 0x0ac1, 0x0ac7, 0x0acc, 0x0ad5, 0x0ada, + // Entry 140 - 17F + 0x0ae8, 0x0af3, 0x0b01, 0x0b0b, 0x0b13, 0x0b18, 0x0b27, 0x0b35, + 0x0b39, 0x0b3d, 0x0b43, 0x0b48, 0x0b52, 0x0b5f, 0x0b72, 0x0b78, + 0x0b7e, 0x0b85, 0x0b96, 0x0ba7, 0x0bb3, 0x0bc0, 0x0bca, 0x0bd0, + 0x0bd3, 0x0bd8, 0x0bdc, 0x0be6, 0x0bed, 0x0bf1, 0x0bf8, 0x0c04, + 0x0c0b, 0x0c0f, 0x0c17, 0x0c1c, 0x0c23, 0x0c2f, 0x0c3b, 0x0c47, + 0x0c4b, 0x0c53, 0x0c5b, 0x0c67, 0x0c6e, 0x0c76, 0x0c7c, 0x0c8d, + 0x0c91, 0x0c9a, 0x0ca3, 0x0ca9, 0x0cb1, 0x0cb6, 0x0cc5, 0x0ccd, + 0x0cd4, 0x0cda, 0x0cdf, 0x0ce5, 0x0cea, 0x0cf1, 0x0d03, 0x0d0a, + // Entry 180 - 1BF + 0x0d11, 0x0d19, 0x0d23, 0x0d28, 0x0d2c, 0x0d36, 0x0d3f, 0x0d49, + 0x0d50, 0x0d55, 0x0d58, 0x0d5e, 0x0d63, 0x0d6f, 0x0d74, 0x0d7f, + 0x0d83, 0x0d89, 0x0d91, 0x0d98, 0x0da0, 0x0da5, 0x0da9, 0x0db4, + 0x0dba, 0x0dbf, 0x0dc3, 0x0dcb, 0x0de2, 0x0df0, 0x0df7, 0x0dfd, + 0x0e08, 0x0e16, 0x0e1e, 0x0e29, 0x0e2e, 0x0e3f, 0x0e46, 0x0e56, + 0x0e5b, 0x0e67, 0x0e6e, 0x0e76, 0x0e7b, 0x0e80, 0x0e8c, 0x0e9c, + 0x0ea4, 0x0ea8, 0x0eb8, 0x0ebe, 0x0ec2, 0x0ec8, 0x0ecf, 0x0ed5, + 0x0ede, 0x0ee5, 0x0eef, 0x0ef5, 0x0efb, 0x0f06, 0x0f0a, 0x0f17, + // Entry 1C0 - 1FF + 0x0f1f, 0x0f27, 0x0f2c, 0x0f31, 0x0f36, 0x0f49, 0x0f53, 0x0f5f, + 0x0f67, 0x0f71, 0x0f7b, 0x0f86, 0x0f9c, 0x0fa8, 0x0fb4, 0x0fc6, + 0x0fd1, 0x0fdc, 0x0fef, 0x0ff8, 0x1000, 0x100e, 0x1015, 0x1030, + 0x103a, 0x1041, 0x104b, 0x1055, 0x1064, 0x1069, 0x1070, 0x1077, + 0x107e, 0x1085, 0x108c, 0x108f, 0x1096, 0x109e, 0x10af, 0x10b6, + 0x10bb, 0x10c2, 0x10cc, 0x10d3, 0x10d8, 0x10e1, 0x10e6, 0x10f5, + 0x1106, 0x110c, 0x1110, 0x1114, 0x111a, 0x1129, 0x1138, 0x1142, + 0x114b, 0x1154, 0x1163, 0x1169, 0x117b, 0x1182, 0x118d, 0x1196, + // Entry 200 - 23F + 0x11a0, 0x11aa, 0x11b1, 0x11be, 0x11ca, 0x11cf, 0x11d3, 0x11e5, + 0x11eb, 0x11ef, 0x11f7, 0x11fe, 0x120b, 0x121c, 0x1226, 0x122f, + 0x1235, 0x123a, 0x123e, 0x1244, 0x1249, 0x124e, 0x1251, 0x1258, + 0x125f, 0x1268, 0x126f, 0x1279, 0x1281, 0x128c, 0x1295, 0x129b, + 0x12a1, 0x12a9, 0x12b2, 0x12b8, 0x12bf, 0x12c5, 0x12cc, 0x12d2, + 0x12e4, 0x12ed, 0x12f8, 0x12ff, 0x1305, 0x1308, 0x1312, 0x1316, + 0x1324, 0x1337, 0x133c, 0x1341, 0x1346, 0x134c, 0x1352, 0x1357, + 0x135c, 0x1364, 0x136f, 0x1379, 0x1381, 0x1385, 0x1388, 0x138e, + // Entry 240 - 27F + 0x1395, 0x139a, 0x13a3, 0x13ab, 0x13b7, 0x13c6, 0x13cf, 0x13d5, + 0x13f4, 0x13f8, 0x140e, 0x1414, 0x142b, 0x1439, 0x144d, 0x1469, + 0x1480, 0x1493, 0x14a8, 0x14bd, 0x14d9, 0x14ee, 0x1504, 0x1504, + 0x1518, 0x152f, 0x1540, 0x1548, 0x155d, 0x1570, 0x1579, 0x158b, + 0x15a4, 0x15b5, +} // Size: 1244 bytes + +var ukLangStr string = "" + // Size: 9058 bytes + "афарськаабхазькаавестійськаафрикаансаканамхарськаарагонськаарабськаассам" + + "ськааварськааймараазербайджанськабашкирськабілоруськаболгарськабісламаб" + + "амбарабенгальськатибетськабретонськабоснійськакаталонськачеченськачамор" + + "рокорсиканськакрічеськацерковнослов’янськачуваськаваллійськаданськаніме" + + "цькадівехідзонг-кеевегрецькаанглійськаесперантоіспанськаестонськабасксь" + + "каперськафулафінськафіджіфарерськафранцузьказахіднофризькаірландськагае" + + "льськагалісійськагуаранігуджаратіменкськахаусаівритгіндіхірі-мотухорват" + + "ськагаїтянськаугорськавірменськагерероінтерлінгваіндонезійськаінтерлінг" + + "веігбосичуаньінупіакідоісландськаіталійськаінуктітутяпонськаяванськагру" + + "зинськаконґолезькакікуйюкунамаказахськакалааллісуткхмерськаканнадакорей" + + "ськаканурікашмірськакурдськакомікорнійськакиргизькалатинськалюксембурзь" + + "кагандалімбургійськалінгалалаоськалитовськалуба-катангалатвійськамалага" + + "сійськамаршалльськамаорімакедонськамалаяламмонгольськамаратхімалайськам" + + "альтійськабірманськанаурундебелє північнанепальськандонгаголландськанюн" + + "ошк (Норвегія)букмол (Норвегія)ндебелє південнанавахоньянджаокитаноджіб" + + "ваоромооріяосетинськапанджабіпаліпольськапуштупортугальськакечуаретором" + + "анськарундірумунськаросійськакіньяруандасанскритсардинськасіндхісаамськ" + + "а північнасангосингальськасловацькасловенськасамоанськашонасомаліалбанс" + + "ькасербськасісватісото південнасунданськашведськасуахілітамільськателуг" + + "утаджицькатайськатигриньятуркменськатсванатонганськатурецькатсонгататар" + + "ськатаїтянськауйгурськаукраїнськаурдуузбецькавендавʼєтнамськаволап’юква" + + "ллонськаволофкхосаідишйорубачжуанкитайськазулуськаачехськаачоліадангмеа" + + "дигейськаафрихіліагемайнськааккадськаалабамаалеутськапівденноалтайськад" + + "авньоанглійськаангікаарамейськаарауканськаараонаарапахоалжирська арабсь" + + "кааравакськаасуамериканська мова рухівастурськаавадхібалучібалійськабае" + + "рішбасабамумбатак тобагомалабеджабембабетавібенабафутбадагасхіднобелудж" + + "ійськабходжпурібікольськабінібанджарськакомсіксікабахтіарібраджбодоакус" + + "бурятськабугійськабулублінмедумбакаддокарібськакайюгаатсамсебуанськакіг" + + "ачібчачагатайськачуукськамарійськачинук жаргончокточіпев’янчерокічейєнн" + + "курдська (сорані)коптськакримськотатарськакашубськадакотадаргінськатаіт" + + "аделаварськаслейвдогрибськадінкаджермадогрінижньолужицькадуаласередньон" + + "ідерландськадьола-фонідіуладазагаембуефікдавньоєгипетськаекаджукеламськ" + + "асередньоанглійськаевондофангфіліппінськафонсередньофранцузькадавньофра" + + "нцузькаарпітанськафризька північнафризька східнафріульськагагагаузькага" + + "йогбайягєезгільбертськасередньоверхньонімецькадавньоверхньонімецькагонд" + + "ігоронталоготськагребодавньогрецьканімецька (Швейцарія)гусіїкучінхайдаг" + + "авайськахілігайнонхітітіхмонгверхньолужицькахупаібанськаібібіоілоканськ" + + "аінгуськаложбаннгомбамачамеіудео-перськаіудео-арабськакаракалпацькакабі" + + "льськакачінйюкамбакавікабардинськаканембутіапмакондекабувердіанукорокха" + + "сіхотаносакськакойра чіїнікакокаленджинкімбундукомі-перм’яцькаконканіко" + + "сраекпеллєкарачаєво-балкарськакарельськакурукхшамбалабафіаколоніанкумиц" + + "ькакутенаїладінолангіландаламбалезгінськалакотамонголозіпівнічна лурськ" + + "алуба-лулуалуїсеньолундалуолушейлуйямадурськамафамагадхімайтхілімакасар" + + "ськамандінгомасаїмабамокшамандарськамендемерумаврикійська креольськасер" + + "едньоірландськамакува-меетометамікмакмінангкабауманчжурськаманіпурімага" + + "вкмоссімундангдекілька мовкрікмірандськамарварімиінерзямазандеранськане" + + "аполітанськанаманижньонімецьканеварініаськаніуеао нагаквазіонгємбуннога" + + "йськадавньонорвезьканкосото північнануерневарі класичнаньямвезіньянколе" + + "ньоронзімаосейджосманськапангасінанськапехлевіпампангапап’яментопалауан" + + "ськадавньоперськафінікійсько-пунічнапонапедавньопровансальськакічераджа" + + "стханірапануїраротонгаромбоциганськаарумунськарвасандавеякутськасамарит" + + "янська арамейськасамбурусасакськасантальськангамбайсангусицилійськашотл" + + "андськапівденнокурдськасенекасенаселькупськакойраборо сенідавньоірландс" + + "ькатачелітшанськачадійська арабськасідамопівденносаамськасаамська лулес" + + "аамська інарісаамська скольтсонінкесогдійськасранан тонгосерерсахосукум" + + "асусушумерськакоморськаконгійське суахілісирійська класичнасирійськатем" + + "нетесотеренотетумтигретівтокелауклінгонтлінгіттамашекньяса тонгаток-піс" + + "інтарокоцимшиантумбукатувалутасавактувинськацентральномароканська тамаз" + + "ітудмуртськаугаритськаумбундукоріньваїводськавуньовалзерськаваламоварай" + + "вашовалпірікалмицькасогаяояпянгбенємбакантонськасапотекськаблісса моваз" + + "енагастандартна марокканська берберськазуньїнемає мовного вмістузазакіс" + + "учасна стандартна арабськапівденноазербайджанськаверхньонімецька (Швейц" + + "арія)англійська британськаіспанська (Європа)нижньосаксонськафламандська" + + "португальська (Європа)молдавськасербсько-хорватськакитайська спрощенаки" + + "тайська традиційна" + +var ukLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0010, 0x0020, 0x0036, 0x0048, 0x0050, 0x0062, 0x0076, + 0x0086, 0x0098, 0x00a8, 0x00b4, 0x00d2, 0x00e6, 0x00fa, 0x010e, + 0x011c, 0x012a, 0x0140, 0x0152, 0x0166, 0x017a, 0x0190, 0x01a2, + 0x01b0, 0x01c8, 0x01ce, 0x01da, 0x0201, 0x0211, 0x0225, 0x0233, + 0x0243, 0x024f, 0x025e, 0x0264, 0x0272, 0x0286, 0x0298, 0x02aa, + 0x02bc, 0x02cc, 0x02da, 0x02e2, 0x02f0, 0x02fa, 0x030c, 0x0320, + 0x033c, 0x0350, 0x0362, 0x0378, 0x0386, 0x0398, 0x03a8, 0x03b2, + 0x03bc, 0x03c6, 0x03d7, 0x03eb, 0x03ff, 0x040f, 0x0423, 0x042f, + // Entry 40 - 7F + 0x0445, 0x045f, 0x0475, 0x047d, 0x048b, 0x0499, 0x049f, 0x04b3, + 0x04c7, 0x04d9, 0x04e9, 0x04f9, 0x050d, 0x0523, 0x052f, 0x053b, + 0x054d, 0x0563, 0x0575, 0x0583, 0x0595, 0x05a1, 0x05b5, 0x05c5, + 0x05cd, 0x05e1, 0x05f3, 0x0605, 0x061f, 0x0629, 0x0643, 0x0651, + 0x065f, 0x0671, 0x0688, 0x069c, 0x06b6, 0x06ce, 0x06d8, 0x06ee, + 0x06fe, 0x0714, 0x0722, 0x0734, 0x074a, 0x075e, 0x0768, 0x0787, + 0x079b, 0x07a7, 0x07bd, 0x07dc, 0x07fb, 0x081a, 0x0826, 0x0834, + 0x0840, 0x084e, 0x0858, 0x0860, 0x0874, 0x0884, 0x088c, 0x089c, + // Entry 80 - BF + 0x08a6, 0x08c0, 0x08ca, 0x08e4, 0x08ee, 0x0900, 0x0912, 0x0928, + 0x0938, 0x094c, 0x0958, 0x0979, 0x0983, 0x0999, 0x09ab, 0x09bf, + 0x09d3, 0x09db, 0x09e7, 0x09f9, 0x0a09, 0x0a17, 0x0a30, 0x0a44, + 0x0a54, 0x0a62, 0x0a76, 0x0a82, 0x0a94, 0x0aa2, 0x0ab2, 0x0ac8, + 0x0ad4, 0x0ae8, 0x0af8, 0x0b04, 0x0b16, 0x0b2a, 0x0b3c, 0x0b50, + 0x0b58, 0x0b68, 0x0b72, 0x0b88, 0x0b99, 0x0bad, 0x0bb7, 0x0bc1, + 0x0bc9, 0x0bd5, 0x0bdf, 0x0bf1, 0x0c01, 0x0c11, 0x0c1b, 0x0c29, + 0x0c3d, 0x0c3d, 0x0c4d, 0x0c55, 0x0c63, 0x0c75, 0x0c83, 0x0c95, + // Entry C0 - FF + 0x0c95, 0x0cb7, 0x0cd7, 0x0ce3, 0x0cf7, 0x0d0d, 0x0d19, 0x0d27, + 0x0d4a, 0x0d5e, 0x0d5e, 0x0d5e, 0x0d64, 0x0d90, 0x0da2, 0x0da2, + 0x0dae, 0x0dba, 0x0dcc, 0x0dd8, 0x0de0, 0x0dea, 0x0dfd, 0x0e09, + 0x0e13, 0x0e1d, 0x0e29, 0x0e31, 0x0e3b, 0x0e47, 0x0e6b, 0x0e7d, + 0x0e91, 0x0e99, 0x0eaf, 0x0eb5, 0x0ec3, 0x0ec3, 0x0ed3, 0x0edd, + 0x0edd, 0x0ee5, 0x0eed, 0x0eff, 0x0f11, 0x0f19, 0x0f21, 0x0f2f, + 0x0f39, 0x0f4b, 0x0f57, 0x0f61, 0x0f75, 0x0f7d, 0x0f87, 0x0f9d, + 0x0fad, 0x0fbf, 0x0fd6, 0x0fe0, 0x0ff1, 0x0ffd, 0x1009, 0x1028, + // Entry 100 - 13F + 0x1038, 0x1038, 0x105a, 0x106c, 0x1078, 0x108c, 0x1096, 0x10ac, + 0x10b6, 0x10ca, 0x10d4, 0x10e0, 0x10ea, 0x1106, 0x1106, 0x1110, + 0x113a, 0x114d, 0x1157, 0x1163, 0x116b, 0x1173, 0x1173, 0x1193, + 0x11a1, 0x11b1, 0x11d5, 0x11d5, 0x11e1, 0x11e1, 0x11e9, 0x1201, + 0x1201, 0x1207, 0x1207, 0x122b, 0x124b, 0x1261, 0x1280, 0x129b, + 0x12af, 0x12b3, 0x12c5, 0x12c5, 0x12cd, 0x12d7, 0x12d7, 0x12df, + 0x12f7, 0x12f7, 0x1325, 0x134f, 0x134f, 0x1359, 0x136b, 0x1379, + 0x1383, 0x139d, 0x13c2, 0x13c2, 0x13c2, 0x13cc, 0x13d6, 0x13e0, + // Entry 140 - 17F + 0x13e0, 0x13f2, 0x13f2, 0x1406, 0x1412, 0x141c, 0x143a, 0x143a, + 0x1442, 0x1452, 0x145e, 0x1472, 0x1482, 0x1482, 0x1482, 0x148e, + 0x149a, 0x14a6, 0x14bf, 0x14da, 0x14da, 0x14f4, 0x1508, 0x1512, + 0x1516, 0x1520, 0x1528, 0x1540, 0x154e, 0x1556, 0x1564, 0x157c, + 0x157c, 0x1584, 0x1584, 0x158e, 0x15a8, 0x15bd, 0x15bd, 0x15bd, + 0x15c5, 0x15d7, 0x15e7, 0x1605, 0x1613, 0x161f, 0x162b, 0x1652, + 0x1652, 0x1652, 0x1666, 0x1672, 0x1680, 0x168a, 0x169a, 0x16aa, + 0x16b8, 0x16c4, 0x16ce, 0x16d8, 0x16e2, 0x16f6, 0x16f6, 0x16f6, + // Entry 180 - 1BF + 0x16f6, 0x1702, 0x1702, 0x170c, 0x1714, 0x1733, 0x1733, 0x1746, + 0x1756, 0x1760, 0x1766, 0x1770, 0x1778, 0x1778, 0x1778, 0x178a, + 0x1792, 0x17a0, 0x17b0, 0x17c6, 0x17d6, 0x17e0, 0x17e8, 0x17f2, + 0x1806, 0x1810, 0x1818, 0x1845, 0x1869, 0x1880, 0x1888, 0x1894, + 0x18aa, 0x18c0, 0x18d0, 0x18dc, 0x18e6, 0x18e6, 0x18f4, 0x190b, + 0x1913, 0x1927, 0x1935, 0x1935, 0x193d, 0x1945, 0x1961, 0x1961, + 0x197d, 0x1985, 0x19a1, 0x19ad, 0x19bb, 0x19c3, 0x19d0, 0x19dc, + 0x19ea, 0x19fc, 0x1a1a, 0x1a1a, 0x1a20, 0x1a39, 0x1a41, 0x1a5e, + // Entry 1C0 - 1FF + 0x1a6e, 0x1a7e, 0x1a88, 0x1a92, 0x1a9e, 0x1ab0, 0x1acc, 0x1ada, + 0x1aea, 0x1aff, 0x1b15, 0x1b15, 0x1b15, 0x1b15, 0x1b2f, 0x1b2f, + 0x1b54, 0x1b54, 0x1b54, 0x1b60, 0x1b60, 0x1b88, 0x1b90, 0x1b90, + 0x1ba6, 0x1bb4, 0x1bc6, 0x1bc6, 0x1bc6, 0x1bd0, 0x1be2, 0x1be2, + 0x1be2, 0x1be2, 0x1bf6, 0x1bfc, 0x1c0a, 0x1c1a, 0x1c49, 0x1c57, + 0x1c69, 0x1c7f, 0x1c7f, 0x1c8d, 0x1c97, 0x1cad, 0x1cc3, 0x1cc3, + 0x1ce3, 0x1cef, 0x1cf7, 0x1cf7, 0x1d0d, 0x1d28, 0x1d48, 0x1d48, + 0x1d56, 0x1d64, 0x1d87, 0x1d93, 0x1d93, 0x1d93, 0x1db3, 0x1dcc, + // Entry 200 - 23F + 0x1de7, 0x1e04, 0x1e12, 0x1e26, 0x1e3d, 0x1e47, 0x1e4f, 0x1e4f, + 0x1e5b, 0x1e63, 0x1e75, 0x1e87, 0x1eaa, 0x1ecd, 0x1edf, 0x1edf, + 0x1edf, 0x1ee9, 0x1ef1, 0x1efd, 0x1f07, 0x1f11, 0x1f17, 0x1f25, + 0x1f25, 0x1f33, 0x1f41, 0x1f41, 0x1f4f, 0x1f64, 0x1f75, 0x1f75, + 0x1f81, 0x1f81, 0x1f8f, 0x1f8f, 0x1f9d, 0x1fa9, 0x1fb7, 0x1fc9, + 0x2002, 0x2016, 0x202a, 0x2038, 0x2044, 0x204a, 0x204a, 0x204a, + 0x204a, 0x204a, 0x2058, 0x2058, 0x2062, 0x2076, 0x2082, 0x208c, + 0x2094, 0x20a2, 0x20a2, 0x20b4, 0x20b4, 0x20bc, 0x20c0, 0x20c4, + // Entry 240 - 27F + 0x20d0, 0x20d8, 0x20d8, 0x20ec, 0x2102, 0x2117, 0x2117, 0x2123, + 0x2165, 0x216f, 0x2195, 0x21a1, 0x21d5, 0x2203, 0x2203, 0x2236, + 0x2236, 0x2236, 0x225f, 0x225f, 0x225f, 0x2280, 0x2280, 0x2280, + 0x2280, 0x2280, 0x22a0, 0x22b6, 0x22b6, 0x22df, 0x22f3, 0x2318, + 0x233b, 0x2362, +} // Size: 1244 bytes + +var urLangStr string = "" + // Size: 3619 bytes + "ابقازیانایفریکانزاکانامہاریعربیآسامیایماراآزربائیجانیباشکیربیلاروسیبلغار" + + "یبمبارابنگالیتبتیبریٹنبوسنیکیٹالانچیچنکوراسیکنچیکچوواشویلشڈینشجرمنڈیویہ" + + "یژونگکھاایویونانیانگریزیایسپرانٹوہسپانویاسٹونینباسکیفارسیفینیشفجیفیروئی" + + "زفرانسیسیمغربی فریسیئنآئیرِشسکاٹ گیلِکگالیشیائیگُارانیگجراتیمینکسہؤساعب" + + "رانیہندیکراتیہیتیہنگیرینارمینیبین لسانیاتانڈونیثیائیاِگبوسچوان ایآئس لی" + + "نڈکاطالویاینُکٹیٹٹجاپانیجاویجارجیکانگوکیکویوقزاخكالاليستخمیرکنّاڈاکوریا" + + "ئیکشمیریکردشکورنشکرغیزیلاطینیلگژمبرگشگینڈالِنگَلالاؤلتھُواینینلبا-كاتان" + + "جالیٹوینملاگاسیماؤریمقدونیائیمالایالممنگؤلیمراٹهیمالائیمالٹیبرمیشمالی د" + + "بیلنیپالیڈچنورویجینی نینورسکنارویجین بوکملنیانجاآكسیٹاناورومواورِیااوسی" + + "ٹکپنجابیپولستانیپشتوپُرتگالیکویچوآرومانشرونڈیرومینینروسیکینیاروانڈاسَنس" + + "کرِتسندھیشمالی سامیساںغوسنہالاسلوواکسلووینیائیساموآنشوناصومالیالبانیصرب" + + "یسواتیجنوبی سوتھوسنڈانیزسویڈشسواحلیتملتیلگوتاجکتھائیٹگرینیاترکمانسواناٹ" + + "ونگنترکیزونگاتاتارتاہیتییوئگہریوکرینیائیاردوازبیکوینڈاویتنامیوولوفژوسای" + + "دشیوروباچینیزولواکولیاغمماپوچےآسوبیمبابینامغربی بلوچیبوڈوچیگاچیروکیسورا" + + "نی کردشتائتازرماذیلی سربیائیدوالاجولا فونياامبوایفِکفلیپینوگاغاغاوزسوئس" + + " جرمنگسیہوائیاپر سربیائینگومباماشیمقبائلیکامباماكوندهكابويرديانوكويرا شي" + + "نيكالينجينکومی پرمیاککونکنیشامبالابافيالانگیلاکوٹالوزیشمالی لریلیوبا لو" + + "لوآلولویاماسایمیروموریسیینماخاوا-ميتومیٹاموہاکمنڈانگمزندرانیناماادنی جر" + + "منكوايسواینکوشمالی سوتھونویرنینکولكيشیرومبورواسامبوروسانگوجنوبی کردسینا" + + "كويرابورو سينیتشلحيتجنوبی سامیلول سامیاناری سامیسکولٹ سامیکانگو سواحلیت" + + "یسوٹیٹمکلنگنٹوک پِسِنٹمبوکاتاساواقسینٹرل ایٹلس ٹمازائٹنامعلوم زبانوائیو" + + "نجووارلپیریسوگااسٹینڈرڈ مراقشی تمازیقیکوئی لسانی مواد نہیںماڈرن اسٹینڈر" + + "ڈ عربیجنوبی آزربائیجانیآسٹریائی جرمنسوئس ہائی جرمنآسٹریلیائی انگریزیکین" + + "یڈین انگریزیبرطانوی انگریزیامریکی انگریزیلاطینی امریکی ہسپانوییورپی ہسپ" + + "انویمیکسیکن ہسپانویکینیڈین فرانسیسیسوئس فرینچادنی سیکسنفلیمِشبرازیلی پر" + + "تگالییورپی پرتگالیمالدوواسربو-کروئیشینچینی (آسان کردہ)روایتی چینی" + +var urLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0010, 0x0010, 0x0022, 0x002a, 0x0036, 0x0036, + 0x003e, 0x0048, 0x0048, 0x0054, 0x006a, 0x0076, 0x0086, 0x0092, + 0x0092, 0x009e, 0x00aa, 0x00b2, 0x00bc, 0x00c6, 0x00d4, 0x00dc, + 0x00dc, 0x00ec, 0x00ec, 0x00f2, 0x00f2, 0x00fc, 0x0104, 0x010c, + 0x0114, 0x0120, 0x012e, 0x0134, 0x0140, 0x014e, 0x0160, 0x016e, + 0x017c, 0x0186, 0x0190, 0x0190, 0x019a, 0x01a0, 0x01ae, 0x01be, + 0x01d7, 0x01e3, 0x01f6, 0x0208, 0x0216, 0x0222, 0x022c, 0x0234, + 0x0240, 0x0248, 0x0248, 0x0252, 0x025a, 0x0268, 0x0274, 0x0274, + // Entry 40 - 7F + 0x0289, 0x029f, 0x029f, 0x02a9, 0x02b8, 0x02b8, 0x02b8, 0x02c9, + 0x02d5, 0x02e7, 0x02f3, 0x02fb, 0x0305, 0x030f, 0x031b, 0x031b, + 0x0323, 0x0333, 0x033b, 0x0347, 0x0355, 0x0355, 0x0361, 0x0369, + 0x0369, 0x0373, 0x037f, 0x038b, 0x039b, 0x03a5, 0x03a5, 0x03b3, + 0x03b9, 0x03cd, 0x03e2, 0x03ee, 0x03fc, 0x03fc, 0x0406, 0x0418, + 0x0428, 0x0434, 0x0440, 0x044c, 0x0456, 0x045e, 0x045e, 0x0471, + 0x047d, 0x047d, 0x0481, 0x04a2, 0x04bd, 0x04bd, 0x04bd, 0x04c9, + 0x04d7, 0x04d7, 0x04e3, 0x04ef, 0x04fb, 0x0507, 0x0507, 0x0517, + // Entry 80 - BF + 0x051f, 0x052f, 0x053b, 0x0547, 0x0551, 0x055f, 0x0567, 0x057d, + 0x058d, 0x058d, 0x0597, 0x05aa, 0x05b4, 0x05c0, 0x05cc, 0x05e0, + 0x05ec, 0x05f4, 0x0600, 0x060c, 0x0614, 0x061e, 0x0633, 0x0641, + 0x064b, 0x0657, 0x065d, 0x0667, 0x066f, 0x0679, 0x0687, 0x0693, + 0x069d, 0x06a7, 0x06af, 0x06b9, 0x06c3, 0x06cf, 0x06db, 0x06ef, + 0x06f7, 0x0701, 0x070b, 0x0719, 0x0719, 0x0719, 0x0723, 0x072b, + 0x0731, 0x073d, 0x073d, 0x0745, 0x074d, 0x074d, 0x0757, 0x0757, + 0x0757, 0x0757, 0x0757, 0x075d, 0x075d, 0x075d, 0x075d, 0x075d, + // Entry C0 - FF + 0x075d, 0x075d, 0x075d, 0x075d, 0x075d, 0x0769, 0x0769, 0x0769, + 0x0769, 0x0769, 0x0769, 0x0769, 0x076f, 0x076f, 0x076f, 0x076f, + 0x076f, 0x076f, 0x076f, 0x076f, 0x076f, 0x076f, 0x076f, 0x076f, + 0x076f, 0x0779, 0x0779, 0x0781, 0x0781, 0x0781, 0x0796, 0x0796, + 0x0796, 0x0796, 0x0796, 0x0796, 0x0796, 0x0796, 0x0796, 0x0796, + 0x0796, 0x079e, 0x079e, 0x079e, 0x079e, 0x079e, 0x079e, 0x079e, + 0x079e, 0x079e, 0x079e, 0x079e, 0x079e, 0x07a6, 0x07a6, 0x07a6, + 0x07a6, 0x07a6, 0x07a6, 0x07a6, 0x07a6, 0x07b2, 0x07b2, 0x07c7, + // Entry 100 - 13F + 0x07c7, 0x07c7, 0x07c7, 0x07c7, 0x07c7, 0x07c7, 0x07d1, 0x07d1, + 0x07d1, 0x07d1, 0x07d1, 0x07d9, 0x07d9, 0x07f0, 0x07f0, 0x07fa, + 0x07fa, 0x080d, 0x080d, 0x080d, 0x0815, 0x081f, 0x081f, 0x081f, + 0x081f, 0x081f, 0x081f, 0x081f, 0x081f, 0x081f, 0x081f, 0x082d, + 0x082d, 0x082d, 0x082d, 0x082d, 0x082d, 0x082d, 0x082d, 0x082d, + 0x082d, 0x0831, 0x083d, 0x083d, 0x083d, 0x083d, 0x083d, 0x083d, + 0x083d, 0x083d, 0x083d, 0x083d, 0x083d, 0x083d, 0x083d, 0x083d, + 0x083d, 0x083d, 0x084e, 0x084e, 0x084e, 0x0854, 0x0854, 0x0854, + // Entry 140 - 17F + 0x0854, 0x085e, 0x085e, 0x085e, 0x085e, 0x085e, 0x0873, 0x0873, + 0x0873, 0x0873, 0x0873, 0x0873, 0x0873, 0x0873, 0x0873, 0x0873, + 0x087f, 0x0889, 0x0889, 0x0889, 0x0889, 0x0889, 0x0895, 0x0895, + 0x0895, 0x089f, 0x089f, 0x089f, 0x089f, 0x089f, 0x08ad, 0x08c3, + 0x08c3, 0x08c3, 0x08c3, 0x08c3, 0x08c3, 0x08d6, 0x08d6, 0x08d6, + 0x08d6, 0x08e6, 0x08e6, 0x08fb, 0x0907, 0x0907, 0x0907, 0x0907, + 0x0907, 0x0907, 0x0907, 0x0907, 0x0915, 0x091f, 0x091f, 0x091f, + 0x091f, 0x091f, 0x0929, 0x0929, 0x0929, 0x0929, 0x0929, 0x0929, + // Entry 180 - 1BF + 0x0929, 0x0935, 0x0935, 0x0935, 0x093d, 0x094e, 0x094e, 0x0963, + 0x0963, 0x0963, 0x0967, 0x0967, 0x096f, 0x096f, 0x096f, 0x096f, + 0x096f, 0x096f, 0x096f, 0x096f, 0x096f, 0x0979, 0x0979, 0x0979, + 0x0979, 0x0979, 0x0981, 0x0991, 0x0991, 0x09a6, 0x09ae, 0x09ae, + 0x09ae, 0x09ae, 0x09ae, 0x09b8, 0x09b8, 0x09b8, 0x09c4, 0x09c4, + 0x09c4, 0x09c4, 0x09c4, 0x09c4, 0x09c4, 0x09c4, 0x09d4, 0x09d4, + 0x09d4, 0x09dc, 0x09ed, 0x09ed, 0x09ed, 0x09ed, 0x09ed, 0x09f9, + 0x09f9, 0x09f9, 0x09f9, 0x09f9, 0x0a03, 0x0a18, 0x0a20, 0x0a20, + // Entry 1C0 - 1FF + 0x0a20, 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c, + 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c, + 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c, 0x0a2c, 0x0a34, 0x0a34, + 0x0a34, 0x0a34, 0x0a34, 0x0a34, 0x0a34, 0x0a3e, 0x0a3e, 0x0a3e, + 0x0a3e, 0x0a3e, 0x0a3e, 0x0a44, 0x0a44, 0x0a44, 0x0a44, 0x0a52, + 0x0a52, 0x0a52, 0x0a52, 0x0a52, 0x0a5c, 0x0a5c, 0x0a5c, 0x0a5c, + 0x0a6d, 0x0a6d, 0x0a75, 0x0a75, 0x0a75, 0x0a90, 0x0a90, 0x0a90, + 0x0a9c, 0x0a9c, 0x0a9c, 0x0a9c, 0x0a9c, 0x0a9c, 0x0aaf, 0x0abe, + // Entry 200 - 23F + 0x0ad1, 0x0ae4, 0x0ae4, 0x0ae4, 0x0ae4, 0x0ae4, 0x0ae4, 0x0ae4, + 0x0ae4, 0x0ae4, 0x0ae4, 0x0ae4, 0x0afb, 0x0afb, 0x0afb, 0x0afb, + 0x0afb, 0x0afb, 0x0b03, 0x0b03, 0x0b0b, 0x0b0b, 0x0b0b, 0x0b0b, + 0x0b0b, 0x0b15, 0x0b15, 0x0b15, 0x0b15, 0x0b15, 0x0b26, 0x0b26, + 0x0b26, 0x0b26, 0x0b26, 0x0b26, 0x0b32, 0x0b32, 0x0b40, 0x0b40, + 0x0b66, 0x0b66, 0x0b66, 0x0b66, 0x0b7d, 0x0b85, 0x0b85, 0x0b85, + 0x0b85, 0x0b85, 0x0b85, 0x0b85, 0x0b8d, 0x0b8d, 0x0b8d, 0x0b8d, + 0x0b8d, 0x0b9d, 0x0b9d, 0x0b9d, 0x0b9d, 0x0ba5, 0x0ba5, 0x0ba5, + // Entry 240 - 27F + 0x0ba5, 0x0ba5, 0x0ba5, 0x0ba5, 0x0ba5, 0x0ba5, 0x0ba5, 0x0ba5, + 0x0bd1, 0x0bd1, 0x0bf6, 0x0bf6, 0x0c1a, 0x0c3b, 0x0c54, 0x0c6e, + 0x0c91, 0x0cae, 0x0ccb, 0x0ce6, 0x0d0e, 0x0d27, 0x0d44, 0x0d44, + 0x0d63, 0x0d76, 0x0d89, 0x0d95, 0x0db2, 0x0dcb, 0x0dd9, 0x0df2, + 0x0e0e, 0x0e23, +} // Size: 1244 bytes + +var uzLangStr string = "" + // Size: 1850 bytes + "abxazafrikaansakanamxararabassamozarbayjonboshqirdbelarusbolgarbambarben" + + "galtibetbretonbosniykatalanchechenkorsikanchexchuvashvalliydatnemischadz" + + "ongkaevegrekinglizchaesperantoispanchaestonchabaskforsfinchafijifarercha" + + "fransuzchag‘arbiy frizirlandgalisiyguaranigujarotmenxausaibroniyhindxorv" + + "atgaityanvengerarmanindonezigbosichuanislanditalyaninuktitutyaponyavangr" + + "uzinchakikuyuqozoqchagrenlandxmerchakannadakoreyschakashmirchakurdchakor" + + "nqirgʻizchalotinchalyuksemburgchagandalingalalaoschalitvaluba-katangalat" + + "ishchamalagasiymaorimakedonmalayalammo‘g‘ulmaratximalaymaltiybirmanshimo" + + "liy ndebelenepalgollandnorveg-nyunorsknorveg-bokmaloromooriyapanjobchapo" + + "lyakchapushtuportugalchakechuaromanshrundirumincharuschakinyaruandasansk" + + "ritsindxishimoliy saamsangosingalslovakchaslovenchashonasomalichaalbanse" + + "rbchasundanshvedsuaxilitamiltelugutojiktaytigrinyaturkmantonganturktatar" + + "uyg‘urukrainurduo‘zbekvyetnamvolofkxosayorubaxitoyzuluagemaraukanasubemb" + + "abenag‘arbiy belujibodochigacherokisorani-kurdtaitazarmaquyi sorbchadual" + + "adiola-fogniembufilipinchagagauznemis (Shveytsariya)gusiigavaychayuqori " + + "sorbngombamachamekabilkambamakondekabuverdianukoyra-chiinikalenjinkomi-p" + + "ermyakkonkanshambalabafiyalangilakotashimoliy luriluoluhyamasaymendemeru" + + "morisyenmaxuva-mittometamohaukmundangmazanderannamaquyi nemiskvasionkonu" + + "ernyankolekicheromboruandasamburusangujanubiy kurdsenakoyraboro-sennitas" + + "helxitjanubiy saamlule-saaminari-saamskolt-saamkongo-suaxilitesotasavaqm" + + "arkaziy atlas tamazigxtnoma’lum tilvaivunjovalbirisogatamazigxttil tarki" + + "bi yo‘qstandart arabnemis (Avstriya)yuqori nemis (Shveytsariya)ingliz (A" + + "vstraliya)ingliz (Kanada)ingliz (Britaniya)ingliz (Amerika)ispan (Lotin " + + "Amerikasi)ispan (Yevropa)ispan (Meksika)fransuz (Kanada)fransuz (Shveyts" + + "ariya)quyi saksonflamandportugal (Braziliya)portugal (Yevropa)moldovanso" + + "ddalashgan xitoyan’anaviy xitoy" + +var uzLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0005, 0x0005, 0x000e, 0x0012, 0x0017, 0x0017, + 0x001b, 0x0020, 0x0020, 0x0020, 0x002a, 0x0032, 0x0039, 0x003f, + 0x003f, 0x0045, 0x004b, 0x0050, 0x0056, 0x005c, 0x0063, 0x006a, + 0x006a, 0x0072, 0x0072, 0x0076, 0x0076, 0x007d, 0x0083, 0x0086, + 0x008e, 0x008e, 0x0095, 0x0098, 0x009c, 0x00a5, 0x00ae, 0x00b6, + 0x00be, 0x00c2, 0x00c6, 0x00c6, 0x00cc, 0x00d0, 0x00d8, 0x00e2, + 0x00f0, 0x00f6, 0x00f6, 0x00fd, 0x0104, 0x010b, 0x010e, 0x0113, + 0x011a, 0x011e, 0x011e, 0x0124, 0x012b, 0x0131, 0x0136, 0x0136, + // Entry 40 - 7F + 0x0136, 0x013d, 0x013d, 0x0141, 0x0148, 0x0148, 0x0148, 0x014e, + 0x0155, 0x015e, 0x0163, 0x0168, 0x0171, 0x0171, 0x0177, 0x0177, + 0x017f, 0x0187, 0x018e, 0x0195, 0x019e, 0x019e, 0x01a8, 0x01af, + 0x01af, 0x01b3, 0x01be, 0x01c6, 0x01d4, 0x01d9, 0x01d9, 0x01e0, + 0x01e7, 0x01ec, 0x01f8, 0x0201, 0x020a, 0x020a, 0x020f, 0x0216, + 0x021f, 0x022a, 0x0231, 0x0236, 0x023c, 0x0242, 0x0242, 0x0252, + 0x0257, 0x0257, 0x025e, 0x026d, 0x027a, 0x027a, 0x027a, 0x027a, + 0x027a, 0x027a, 0x027f, 0x0284, 0x0284, 0x028d, 0x028d, 0x0296, + // Entry 80 - BF + 0x029c, 0x02a7, 0x02ad, 0x02b4, 0x02b9, 0x02c1, 0x02c7, 0x02d2, + 0x02da, 0x02da, 0x02e0, 0x02ed, 0x02f2, 0x02f8, 0x0301, 0x030a, + 0x030a, 0x030f, 0x0318, 0x031d, 0x0324, 0x0324, 0x0324, 0x032a, + 0x032f, 0x0336, 0x033b, 0x0341, 0x0346, 0x0349, 0x0351, 0x0358, + 0x0358, 0x035e, 0x0362, 0x0362, 0x0367, 0x0367, 0x036f, 0x0375, + 0x0379, 0x0381, 0x0381, 0x0388, 0x0388, 0x0388, 0x038d, 0x0392, + 0x0392, 0x0398, 0x0398, 0x039d, 0x03a1, 0x03a1, 0x03a1, 0x03a1, + 0x03a1, 0x03a1, 0x03a1, 0x03a5, 0x03a5, 0x03a5, 0x03a5, 0x03a5, + // Entry C0 - FF + 0x03a5, 0x03a5, 0x03a5, 0x03a5, 0x03a5, 0x03ac, 0x03ac, 0x03ac, + 0x03ac, 0x03ac, 0x03ac, 0x03ac, 0x03af, 0x03af, 0x03af, 0x03af, + 0x03af, 0x03af, 0x03af, 0x03af, 0x03af, 0x03af, 0x03af, 0x03af, + 0x03af, 0x03b4, 0x03b4, 0x03b8, 0x03b8, 0x03b8, 0x03c8, 0x03c8, + 0x03c8, 0x03c8, 0x03c8, 0x03c8, 0x03c8, 0x03c8, 0x03c8, 0x03c8, + 0x03c8, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, + 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03cc, 0x03d1, 0x03d1, 0x03d1, + 0x03d1, 0x03d1, 0x03d1, 0x03d1, 0x03d1, 0x03d8, 0x03d8, 0x03e3, + // Entry 100 - 13F + 0x03e3, 0x03e3, 0x03e3, 0x03e3, 0x03e3, 0x03e3, 0x03e8, 0x03e8, + 0x03e8, 0x03e8, 0x03e8, 0x03ed, 0x03ed, 0x03f9, 0x03f9, 0x03fe, + 0x03fe, 0x0409, 0x0409, 0x0409, 0x040d, 0x040d, 0x040d, 0x040d, + 0x040d, 0x040d, 0x040d, 0x040d, 0x040d, 0x040d, 0x040d, 0x0417, + 0x0417, 0x0417, 0x0417, 0x0417, 0x0417, 0x0417, 0x0417, 0x0417, + 0x0417, 0x0417, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, + 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, 0x041d, + 0x041d, 0x041d, 0x0431, 0x0431, 0x0431, 0x0436, 0x0436, 0x0436, + // Entry 140 - 17F + 0x0436, 0x043e, 0x043e, 0x043e, 0x043e, 0x043e, 0x0449, 0x0449, + 0x0449, 0x0449, 0x0449, 0x0449, 0x0449, 0x0449, 0x0449, 0x0449, + 0x044f, 0x0456, 0x0456, 0x0456, 0x0456, 0x0456, 0x045b, 0x045b, + 0x045b, 0x0460, 0x0460, 0x0460, 0x0460, 0x0460, 0x0467, 0x0473, + 0x0473, 0x0473, 0x0473, 0x0473, 0x0473, 0x047f, 0x047f, 0x047f, + 0x047f, 0x0487, 0x0487, 0x0493, 0x0499, 0x0499, 0x0499, 0x0499, + 0x0499, 0x0499, 0x0499, 0x0499, 0x04a1, 0x04a7, 0x04a7, 0x04a7, + 0x04a7, 0x04a7, 0x04ac, 0x04ac, 0x04ac, 0x04ac, 0x04ac, 0x04ac, + // Entry 180 - 1BF + 0x04ac, 0x04b2, 0x04b2, 0x04b2, 0x04b2, 0x04bf, 0x04bf, 0x04bf, + 0x04bf, 0x04bf, 0x04c2, 0x04c2, 0x04c7, 0x04c7, 0x04c7, 0x04c7, + 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04c7, 0x04cc, 0x04cc, 0x04cc, + 0x04cc, 0x04d1, 0x04d5, 0x04dd, 0x04dd, 0x04e9, 0x04ed, 0x04ed, + 0x04ed, 0x04ed, 0x04ed, 0x04f3, 0x04f3, 0x04f3, 0x04fa, 0x04fa, + 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x04fa, 0x0504, 0x0504, + 0x0504, 0x0508, 0x0512, 0x0512, 0x0512, 0x0512, 0x0512, 0x0518, + 0x0518, 0x0518, 0x0518, 0x0518, 0x051b, 0x051b, 0x051f, 0x051f, + // Entry 1C0 - 1FF + 0x051f, 0x0527, 0x0527, 0x0527, 0x0527, 0x0527, 0x0527, 0x0527, + 0x0527, 0x0527, 0x0527, 0x0527, 0x0527, 0x0527, 0x0527, 0x0527, + 0x0527, 0x0527, 0x0527, 0x0527, 0x0527, 0x0527, 0x052c, 0x052c, + 0x052c, 0x052c, 0x052c, 0x052c, 0x052c, 0x0531, 0x0531, 0x0531, + 0x0531, 0x0531, 0x0531, 0x0537, 0x0537, 0x0537, 0x0537, 0x053e, + 0x053e, 0x053e, 0x053e, 0x053e, 0x0543, 0x0543, 0x0543, 0x0543, + 0x054f, 0x054f, 0x0553, 0x0553, 0x0553, 0x0562, 0x0562, 0x0562, + 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x056b, 0x0577, 0x0580, + // Entry 200 - 23F + 0x058a, 0x0594, 0x0594, 0x0594, 0x0594, 0x0594, 0x0594, 0x0594, + 0x0594, 0x0594, 0x0594, 0x0594, 0x05a1, 0x05a1, 0x05a1, 0x05a1, + 0x05a1, 0x05a1, 0x05a5, 0x05a5, 0x05a5, 0x05a5, 0x05a5, 0x05a5, + 0x05a5, 0x05a5, 0x05a5, 0x05a5, 0x05a5, 0x05a5, 0x05a5, 0x05a5, + 0x05a5, 0x05a5, 0x05a5, 0x05a5, 0x05a5, 0x05a5, 0x05ac, 0x05ac, + 0x05c4, 0x05c4, 0x05c4, 0x05c4, 0x05d2, 0x05d5, 0x05d5, 0x05d5, + 0x05d5, 0x05d5, 0x05d5, 0x05d5, 0x05da, 0x05da, 0x05da, 0x05da, + 0x05da, 0x05e1, 0x05e1, 0x05e1, 0x05e1, 0x05e5, 0x05e5, 0x05e5, + // Entry 240 - 27F + 0x05e5, 0x05e5, 0x05e5, 0x05e5, 0x05e5, 0x05e5, 0x05e5, 0x05e5, + 0x05ee, 0x05ee, 0x0600, 0x0600, 0x060d, 0x060d, 0x061d, 0x0638, + 0x064b, 0x065a, 0x066c, 0x067c, 0x0693, 0x06a2, 0x06b1, 0x06b1, + 0x06c1, 0x06d7, 0x06e2, 0x06e9, 0x06fd, 0x070f, 0x0717, 0x0717, + 0x0729, 0x073a, +} // Size: 1244 bytes + +var viLangStr string = "" + // Size: 8556 bytes + "Tiếng AfarTiếng AbkhaziaTiếng AvestanTiếng Nam PhiTiếng AkanTiếng Amhari" + + "cTiếng AragonTiếng Ả RậpTiếng AssamTiếng AvaricTiếng AymaraTiếng Azerbai" + + "janTiếng BashkirTiếng BelarusTiếng BulgariaTiếng BislamaTiếng BambaraTiế" + + "ng BengaliTiếng Tây TạngTiếng BretonTiếng Nam TưTiếng CatalanTiếng Chech" + + "enTiếng ChamorroTiếng CorsicaTiếng CreeTiếng SécTiếng Slavơ Nhà thờTiếng" + + " ChuvashTiếng WalesTiếng Đan MạchTiếng ĐứcTiếng DivehiTiếng DzongkhaTiến" + + "g EweTiếng Hy LạpTiếng AnhTiếng Quốc Tế NgữTiếng Tây Ban NhaTiếng Estoni" + + "aTiếng BasqueTiếng Ba TưTiếng FulahTiếng Phần LanTiếng FijiTiếng FaoreTi" + + "ếng PhápTiếng FrisiaTiếng Ai-lenTiếng Xentơ (Xcốt len)Tiếng GalicianTi" + + "ếng GuaraniTiếng GujaratiTiếng ManxTiếng HausaTiếng Do TháiTiếng Hindi" + + "Tiếng Hiri MotuTiếng CroatiaTiếng HaitiTiếng HungaryTiếng ArmeniaTiếng H" + + "ereroTiếng Khoa Học Quốc TếTiếng IndonesiaTiếng InterlingueTiếng IgboTiế" + + "ng Di Tứ XuyênTiếng InupiaqTiếng IdoTiếng IcelandTiếng ÝTiếng InuktitutT" + + "iếng NhậtTiếng JavaTiếng GruziaTiếng KongoTiếng KikuyuTiếng KuanyamaTiến" + + "g KazakhTiếng KalaallisutTiếng Khơ-meTiếng KannadaTiếng HànTiếng KanuriT" + + "iếng KashmiriTiếng KurdTiếng KomiTiếng CornwallTiếng KyrgyzTiếng La-tinh" + + "Tiếng LuxembourgTiếng GandaTiếng LimburgTiếng LingalaTiếng LàoTiếng Lít-" + + "vaTiếng Luba-KatangaTiếng LatviaTiếng MalagasyTiếng MarshallTiếng MaoriT" + + "iếng MacedoniaTiếng MalayalamTiếng Mông CổTiếng MarathiTiếng MalaysiaTiế" + + "ng MaltTiếng Miến ĐiệnTiếng NauruTiếng Ndebele Miền BắcTiếng NepalTiếng " + + "NdongaTiếng Hà LanTiếng Na Uy (Nynorsk)Tiếng Na Uy (Bokmål)Tiếng Ndebele" + + " Miền NamTiếng NavajoTiếng NyanjaTiếng OccitanTiếng OjibwaTiếng OromoTiế" + + "ng OriyaTiếng OsseticTiếng PunjabTiếng PaliTiếng Ba LanTiếng PashtoTiếng" + + " Bồ Đào NhaTiếng QuechuaTiếng RomanshTiếng RundiTiếng RumaniTiếng NgaTiế" + + "ng KinyarwandaTiếng PhạnTiếng SardiniaTiếng SindhiTiếng Sami Miền BắcTiế" + + "ng SangoTiếng SinhalaTiếng SlovakTiếng SloveniaTiếng SamoaTiếng ShonaTiế" + + "ng SomaliTiếng An-ba-niTiếng SerbiaTiếng SwatiTiếng SesothoTiếng SundaTi" + + "ếng Thụy ĐiểnTiếng SwahiliTiếng TamilTiếng TeluguTiếng TajikTiếng Thái" + + "Tiếng TigrigyaTiếng TurkTiếng TswanaTiếng TongaTiếng Thổ Nhĩ KỳTiếng Tso" + + "ngaTiếng TatarTiếng TahitiTiếng UyghurTiếng UcrainaTiếng UđuTiếng UzbekT" + + "iếng VendaTiếng ViệtTiếng VolapükTiếng WalloonTiếng WolofTiếng XhosaTiến" + + "g Y-đitTiếng YorubaTiếng ZhuangTiếng TrungTiếng ZuluTiếng AchineseTiếng " + + "AcoliTiếng AdangmeTiếng AdygheTiếng AfrihiliTiếng AghemTiếng AinuTiếng A" + + "kkadiaTiếng AlabamaTiếng AleutTiếng Gheg AlbaniTiếng Altai Miền NamTiếng" + + " Anh cổTiếng AngikaTiếng AramaicTiếng AraucanianTiếng AraonaTiếng Arapah" + + "oTiếng Ả Rập AlgeriaTiếng ArawakTiếng Ả Rập Ai CậpTiếng AsuNgôn ngữ Ký h" + + "iệu MỹTiếng AsturiasTiếng AwadhiTiếng BaluchiTiếng BaliTiếng BavariaTiến" + + "g BasaaTiếng BamunTiếng Batak TobaTiếng GhomalaTiếng BejaTiếng BembaTiến" + + "g BetawiTiếng BenaTiếng BafutTiếng BadagaTiếng Tây BalochiTiếng Bhojpuri" + + "Tiếng BikolTiếng BiniTiếng BanjarTiếng KomTiếng SiksikaTiếng Bishnupriya" + + "Tiếng BakhtiariTiếng BrajTiếng BrahuiTiếng BodoTiếng AkooseTiếng BuriatT" + + "iếng BuginTiếng BuluTiếng BlinTiếng MedumbaTiếng CaddoTiếng CaribTiếng C" + + "ayugaTiếng AtsamTiếng CebuanoTiếng ChigaTiếng ChibchaTiếng ChagataiTiếng" + + " ChuukTiếng MariBiệt ngữ ChinookTiếng ChoctawTiếng ChipewyanTiếng Cherok" + + "eeTiếng CheyenneTiếng Kurd Miền TrungTiếng CopticTiếng CapiznonTiếng Thổ" + + " Nhĩ Kỳ CrimeanTiếng KashubiaTiếng DakotaTiếng DargwaTiếng TaitaTiếng De" + + "lawareTiếng SlaveTiếng DogribTiếng DinkaTiếng ZarmaTiếng DogriTiếng Hạ S" + + "orbiaTiếng Dusun Miền TrungTiếng DualaTiếng Hà Lan Trung cổTiếng Jola-Fo" + + "nyiTiếng DyulaTiếng DazagaTiếng EmbuTiếng EfikTiếng EmiliaTiếng Ai Cập c" + + "ổTiếng EkajukTiếng ElamiteTiếng Anh Trung cổTiếng Yupik Miền TrungTiến" + + "g EwondoTiếng ExtremaduraTiếng FangTiếng PhilipinTiếng FonTiếng Pháp Caj" + + "unTiếng Pháp Trung cổTiếng Pháp cổTiếng ArpitanTiếng Frisian Miền BắcTiế" + + "ng Frisian Miền ĐôngTiếng FriulianTiếng GaTiếng GagauzTiếng GayoTiếng Gb" + + "ayaTiếng GeezTiếng GilbertTiếng GilakiTiếng Thượng Giéc-man Trung cổTiến" + + "g Thượng Giéc-man cổTiếng Goan KonkaniTiếng GondiTiếng GorontaloTiếng Gô" + + "-tíchTiếng GreboTiếng Hy Lạp cổTiếng Đức (Thụy Sĩ)Tiếng FrafraTiếng Gusi" + + "iTiếng GwichʼinTiếng HaidaTiếng Trung HakkaTiếng HawaiiTiếng Fiji HindiT" + + "iếng HiligaynonTiếng HittiteTiếng HmôngTiếng Thượng SorbiaTiếng HupaTiến" + + "g IbanTiếng IbibioTiếng IlokoTiếng IngushTiếng IngriaTiếng Anh Jamaica C" + + "reoleTiếng LojbanTiếng NgombaTiếng MachameTiếng Judeo-Ba TưTiếng Judeo-Ả" + + " RậpTiếng JutishTiếng Kara-KalpakTiếng KabyleTiếng KachinTiếng JjuTiếng " + + "KambaTiếng KawiTiếng KabardianTiếng KanembuTiếng TyapTiếng MakondeTiếng " + + "KabuverdianuTiếng KoroTiếng KhasiTiếng KhotanTiếng Koyra ChiiniTiếng Kak" + + "oTiếng KalenjinTiếng KimbunduTiếng Komi-PermyakTiếng KonkaniTiếng Kosrae" + + "Tiếng KpelleTiếng Karachay-BalkarTiếng KarelianTiếng KurukhTiếng Shambal" + + "aTiếng BafiaTiếng CologneTiếng KumykTiếng KutenaiTiếng LadinoTiếng Langi" + + "Tiếng LahndaTiếng LambaTiếng LezghianTiếng LakotaTiếng MongoTiếng LoziTi" + + "ếng Bắc LuriTiếng Luba-LuluaTiếng LuisenoTiếng LundaTiếng LuoTiếng Lus" + + "haiTiếng LuyiaTiếng MaduraTiếng MafaTiếng MagahiTiếng MaithiliTiếng Maka" + + "sarTiếng MandingoTiếng MasaiTiếng MabaTiếng MokshaTiếng MandarTiếng Mend" + + "eTiếng MeruTiếng MorisyenTiếng Ai-len Trung cổTiếng Makhuwa-MeettoTiếng " + + "Meta’Tiếng MicmacTiếng MinangkabauTiếng ManchuTiếng ManipuriTiếng Mohawk" + + "Tiếng MossiTiếng MundangNhiều Ngôn ngữTiếng CreekTiếng MirandaTiếng Marw" + + "ariTiếng MyeneTiếng ErzyaTiếng MazanderaniTiếng NapoliTiếng NamaTiếng Hạ" + + " Giéc-manTiếng NewariTiếng NiasTiếng NiueanTiếng Ao NagaTiếng KwasioTiến" + + "g NgiemboonTiếng NogaiTiếng Na Uy cổTiếng N’KoBắc SothoTiếng NuerTiếng N" + + "ewari Cổ điểnTiếng NyamweziTiếng NyankoleTiếng NyoroTiếng NzimaTiếng Osa" + + "geTiếng Thổ Nhĩ Kỳ OttomanTiếng PangasinanTiếng PahlaviTiếng PampangaTiế" + + "ng PapiamentoTiếng PalauanTiếng Ba Tư cổTiếng PhoeniciaTiếng PohnpeianTi" + + "ếng Provençal cổTiếng KʼicheʼTiếng Quechua ở Cao nguyên ChimborazoTiến" + + "g RajasthaniTiếng RapanuiTiếng RarotonganTiếng RomboTiếng RomanyTiếng Ar" + + "omaniaTiếng RwaTiếng SandaweTiếng SakhaTiếng Samaritan AramaicTiếng Samb" + + "uruTiếng SasakTiếng SantaliTiếng NgambayTiếng SanguTiếng SiciliaTiếng Sc" + + "otsTiếng Kurd Miền NamTiếng SenecaTiếng SenaTiếng SelkupTiếng Koyraboro " + + "SenniTiếng Ai-len cổTiếng TachelhitTiếng ShanTiếng Ả-Rập ChadTiếng Sidam" + + "oTIếng Sami Miền NamTiếng Lule SamiTiếng Inari SamiTiếng Skolt SamiTiếng" + + " SoninkeTiếng SogdienTiếng Sranan TongoTiếng SererTiếng SahoTiếng Sukuma" + + "Tiếng SusuTiếng SumeriaTiếng CômoTiếng Swahili CongoTiếng Syria Cổ điểnT" + + "iếng SyriacTiếng TimneTiếng TesoTiếng TerenoTetumTiếng TigreTiếng TivTiế" + + "ng TokelauTiếng KlingonTiếng TlingitTiếng TamashekTiếng Nyasa TongaTiếng" + + " Tok PisinTiếng TarokoTiếng TsimshianTiếng TumbukaTiếng TuvaluTiếng Tasa" + + "waqTiếng TuvinianTiếng Tamazight Miền Trung Ma-rốcTiếng UdmurtTiếng Ugar" + + "iticTiếng UmbunduTiếng RootTiếng VaiTiếng VoticTiếng VunjoTiếng WalserTi" + + "ếng WalamoTiếng WarayTiếng WashoTiếng WarlpiriTiếng KalmykTiếng SogaTi" + + "ếng YaoTiếng YapTiếng YangbenTiếng YembaTiếng Quảng ĐôngTiếng ZapotecK" + + "ý hiệu BlissymbolsTiếng ZenagaTiếng Tamazight Chuẩn của Ma-rốcTiếng Zun" + + "iKhông có nội dung ngôn ngữTiếng ZazaTiếng Ả Rập Hiện đạiTiếng Thượng Gi" + + "éc-man (Thụy Sĩ)Tiếng Anh (Anh)Tiếng Anh (Mỹ)Tiếng Tây Ban Nha (Mỹ La t" + + "inh)Tiếng Tây Ban Nha (Châu Âu)Tiếng Hạ SaxonTiếng FlemishTiếng Bồ Đào N" + + "ha (Braxin)Tiếng Bồ Đào Nha (Châu Âu)Tiếng MoldovaTiếng Xéc bi - Croatia" + +var viLangIdx = []uint16{ // 608 elements + // Entry 0 - 3F + 0x0000, 0x000c, 0x001c, 0x002b, 0x003a, 0x0046, 0x0055, 0x0063, + 0x0074, 0x0081, 0x008f, 0x009d, 0x00af, 0x00be, 0x00cd, 0x00dd, + 0x00ec, 0x00fb, 0x010a, 0x011d, 0x012b, 0x013a, 0x0149, 0x0158, + 0x0168, 0x0177, 0x0183, 0x018f, 0x01a8, 0x01b7, 0x01c4, 0x01d7, + 0x01e5, 0x01f3, 0x0203, 0x020e, 0x021e, 0x0229, 0x0242, 0x0256, + 0x0265, 0x0273, 0x0281, 0x028e, 0x02a0, 0x02ac, 0x02b9, 0x02c6, + 0x02d4, 0x02e2, 0x02fd, 0x030d, 0x031c, 0x032c, 0x0338, 0x0345, + 0x0355, 0x0362, 0x0373, 0x0382, 0x038f, 0x039e, 0x03ad, 0x03bb, + // Entry 40 - 7F + 0x03d9, 0x03ea, 0x03fd, 0x0409, 0x041f, 0x042e, 0x0439, 0x0448, + 0x0452, 0x0463, 0x0471, 0x047d, 0x048b, 0x0498, 0x04a6, 0x04b6, + 0x04c4, 0x04d7, 0x04e6, 0x04f5, 0x0501, 0x050f, 0x051f, 0x052b, + 0x0537, 0x0547, 0x0555, 0x0564, 0x0576, 0x0583, 0x0592, 0x05a1, + 0x05ad, 0x05bc, 0x05d0, 0x05de, 0x05ee, 0x05fe, 0x060b, 0x061c, + 0x062d, 0x063f, 0x064e, 0x065e, 0x066a, 0x0680, 0x068d, 0x06a9, + 0x06b6, 0x06c4, 0x06d3, 0x06ea, 0x0701, 0x071b, 0x0729, 0x0737, + 0x0746, 0x0754, 0x0761, 0x076e, 0x077d, 0x078b, 0x0797, 0x07a5, + // Entry 80 - BF + 0x07b3, 0x07c9, 0x07d8, 0x07e7, 0x07f4, 0x0802, 0x080d, 0x0820, + 0x082e, 0x083e, 0x084c, 0x0865, 0x0872, 0x0881, 0x088f, 0x089f, + 0x08ac, 0x08b9, 0x08c7, 0x08d7, 0x08e5, 0x08f2, 0x0901, 0x090e, + 0x0924, 0x0933, 0x0940, 0x094e, 0x095b, 0x0968, 0x0978, 0x0984, + 0x0992, 0x099f, 0x09b6, 0x09c4, 0x09d1, 0x09df, 0x09ed, 0x09fc, + 0x0a08, 0x0a15, 0x0a22, 0x0a30, 0x0a40, 0x0a4f, 0x0a5c, 0x0a69, + 0x0a77, 0x0a85, 0x0a93, 0x0aa0, 0x0aac, 0x0abc, 0x0ac9, 0x0ad8, + 0x0ae6, 0x0ae6, 0x0af6, 0x0b03, 0x0b0f, 0x0b1e, 0x0b2d, 0x0b3a, + // Entry C0 - FF + 0x0b4d, 0x0b65, 0x0b75, 0x0b83, 0x0b92, 0x0ba4, 0x0bb2, 0x0bc1, + 0x0bda, 0x0be8, 0x0be8, 0x0c02, 0x0c0d, 0x0c28, 0x0c38, 0x0c38, + 0x0c46, 0x0c55, 0x0c61, 0x0c70, 0x0c7d, 0x0c8a, 0x0c9c, 0x0cab, + 0x0cb7, 0x0cc4, 0x0cd2, 0x0cde, 0x0ceb, 0x0cf9, 0x0d0d, 0x0d1d, + 0x0d2a, 0x0d36, 0x0d44, 0x0d4f, 0x0d5e, 0x0d71, 0x0d82, 0x0d8e, + 0x0d9c, 0x0da8, 0x0db6, 0x0dc4, 0x0dd1, 0x0ddd, 0x0de9, 0x0df8, + 0x0e05, 0x0e12, 0x0e20, 0x0e2d, 0x0e3c, 0x0e49, 0x0e58, 0x0e68, + 0x0e75, 0x0e81, 0x0e95, 0x0ea4, 0x0eb5, 0x0ec5, 0x0ed5, 0x0eee, + // Entry 100 - 13F + 0x0efc, 0x0f0c, 0x0f2b, 0x0f3b, 0x0f49, 0x0f57, 0x0f64, 0x0f74, + 0x0f81, 0x0f8f, 0x0f9c, 0x0fa9, 0x0fb6, 0x0fc9, 0x0fe3, 0x0ff0, + 0x100a, 0x101c, 0x1029, 0x1037, 0x1043, 0x104f, 0x105d, 0x1072, + 0x1080, 0x108f, 0x10a5, 0x10bf, 0x10cd, 0x10e0, 0x10ec, 0x10fc, + 0x10fc, 0x1107, 0x111a, 0x1132, 0x1144, 0x1153, 0x116f, 0x118c, + 0x119c, 0x11a6, 0x11b4, 0x11b4, 0x11c0, 0x11cd, 0x11cd, 0x11d9, + 0x11e8, 0x11f6, 0x121c, 0x123c, 0x1250, 0x125d, 0x126e, 0x127f, + 0x128c, 0x12a1, 0x12bc, 0x12bc, 0x12ca, 0x12d7, 0x12e8, 0x12f5, + // Entry 140 - 17F + 0x1308, 0x1316, 0x1328, 0x133a, 0x1349, 0x1357, 0x136f, 0x136f, + 0x137b, 0x1387, 0x1395, 0x13a2, 0x13b0, 0x13be, 0x13d8, 0x13e6, + 0x13f4, 0x1403, 0x1417, 0x142e, 0x143c, 0x144f, 0x145d, 0x146b, + 0x1476, 0x1483, 0x148f, 0x14a0, 0x14af, 0x14bb, 0x14ca, 0x14de, + 0x14de, 0x14ea, 0x14ea, 0x14f7, 0x1505, 0x1519, 0x1519, 0x1519, + 0x1525, 0x1535, 0x1545, 0x1559, 0x1568, 0x1576, 0x1584, 0x159b, + 0x159b, 0x159b, 0x15ab, 0x15b9, 0x15c9, 0x15d6, 0x15e5, 0x15f2, + 0x1601, 0x160f, 0x161c, 0x162a, 0x1637, 0x1647, 0x1647, 0x1647, + // Entry 180 - 1BF + 0x1647, 0x1655, 0x1655, 0x1662, 0x166e, 0x1680, 0x1680, 0x1692, + 0x16a1, 0x16ae, 0x16b9, 0x16c7, 0x16d4, 0x16d4, 0x16d4, 0x16e2, + 0x16ee, 0x16fc, 0x170c, 0x171b, 0x172b, 0x1738, 0x1744, 0x1752, + 0x1760, 0x176d, 0x1779, 0x1789, 0x17a2, 0x17b8, 0x17c7, 0x17d5, + 0x17e8, 0x17f6, 0x1806, 0x1814, 0x1821, 0x1821, 0x1830, 0x1843, + 0x1850, 0x185f, 0x186e, 0x186e, 0x187b, 0x1888, 0x189b, 0x189b, + 0x18a9, 0x18b5, 0x18cb, 0x18d9, 0x18e5, 0x18f3, 0x1902, 0x1910, + 0x1921, 0x192e, 0x1940, 0x1940, 0x194e, 0x1959, 0x1965, 0x1980, + // Entry 1C0 - 1FF + 0x1990, 0x19a0, 0x19ad, 0x19ba, 0x19c7, 0x19e6, 0x19f8, 0x1a07, + 0x1a17, 0x1a29, 0x1a38, 0x1a38, 0x1a38, 0x1a38, 0x1a4b, 0x1a4b, + 0x1a5c, 0x1a5c, 0x1a5c, 0x1a6d, 0x1a6d, 0x1a84, 0x1a95, 0x1abf, + 0x1ad1, 0x1ae0, 0x1af2, 0x1af2, 0x1af2, 0x1aff, 0x1b0d, 0x1b0d, + 0x1b0d, 0x1b0d, 0x1b1d, 0x1b28, 0x1b37, 0x1b44, 0x1b5d, 0x1b6c, + 0x1b79, 0x1b88, 0x1b88, 0x1b97, 0x1ba4, 0x1bb3, 0x1bc0, 0x1bc0, + 0x1bd7, 0x1be5, 0x1bf1, 0x1bf1, 0x1bff, 0x1c16, 0x1c29, 0x1c29, + 0x1c3a, 0x1c46, 0x1c5c, 0x1c6a, 0x1c6a, 0x1c6a, 0x1c81, 0x1c92, + // Entry 200 - 23F + 0x1ca4, 0x1cb6, 0x1cc5, 0x1cd4, 0x1ce8, 0x1cf5, 0x1d01, 0x1d01, + 0x1d0f, 0x1d1b, 0x1d2a, 0x1d37, 0x1d4c, 0x1d66, 0x1d74, 0x1d74, + 0x1d74, 0x1d81, 0x1d8d, 0x1d9b, 0x1da0, 0x1dad, 0x1db8, 0x1dc7, + 0x1dc7, 0x1dd6, 0x1de5, 0x1de5, 0x1df5, 0x1e08, 0x1e19, 0x1e19, + 0x1e27, 0x1e27, 0x1e38, 0x1e38, 0x1e47, 0x1e55, 0x1e64, 0x1e74, + 0x1e9b, 0x1ea9, 0x1eb9, 0x1ec8, 0x1ed4, 0x1edf, 0x1edf, 0x1edf, + 0x1edf, 0x1edf, 0x1eec, 0x1eec, 0x1ef9, 0x1f07, 0x1f15, 0x1f22, + 0x1f2f, 0x1f3f, 0x1f3f, 0x1f4d, 0x1f4d, 0x1f59, 0x1f64, 0x1f6f, + // Entry 240 - 27F + 0x1f7e, 0x1f8b, 0x1f8b, 0x1fa1, 0x1fb0, 0x1fc6, 0x1fc6, 0x1fd4, + 0x1ffc, 0x2008, 0x2029, 0x2035, 0x2054, 0x2054, 0x2054, 0x207c, + 0x207c, 0x207c, 0x208d, 0x209f, 0x20c2, 0x20e2, 0x20e2, 0x20e2, + 0x20e2, 0x20e2, 0x20f4, 0x2103, 0x2122, 0x2144, 0x2153, 0x216c, +} // Size: 1240 bytes + +var zhLangStr string = "" + // Size: 6405 bytes + "阿法文阿布哈西亚文阿维斯塔文南非荷兰文阿肯文阿姆哈拉文阿拉贡文阿拉伯文阿萨姆文阿瓦尔文艾马拉文阿塞拜疆文巴什客尔文白俄罗斯文保加利亚文比斯拉马文" + + "班巴拉文孟加拉文藏文布里多尼文波斯尼亚文加泰罗尼亚文车臣文查莫罗文科西嘉文克里族文捷克文宗教斯拉夫文楚瓦什文威尔士文丹麦文德文迪维希文不丹文" + + "埃维文希腊文英文世界文西班牙文爱沙尼亚文巴斯克文波斯文夫拉文芬兰文斐济文法罗文法文西弗里西亚文爱尔兰文苏格兰盖尔文加利西亚文瓜拉尼文古吉拉特" + + "文马恩岛文豪萨文希伯来文印地文希里莫图文克罗地亚文海地文匈牙利文亚美尼亚文赫雷罗文国际文字印度尼西亚文国际文字(E)伊布文四川彝文依奴皮维克" + + "文伊多文冰岛文意大利文因纽特文日文爪哇文格鲁吉亚文刚果文吉库尤文宽亚玛文哈萨克文格陵兰文高棉文卡纳达文韩文卡努里文克什米尔文库尔德文科米文凯" + + "尔特文吉尔吉斯文拉丁文卢森堡文卢干达文淋布尔吉文林加拉文老挝文立陶宛文鲁巴加丹加文拉脱维亚文马尔加什文马绍尔文毛利文马其顿文马拉雅拉姆文蒙古" + + "文马拉地文马来文马耳他文缅甸文瑙鲁文北恩德贝勒文尼泊尔文恩东加文荷兰文挪威尼诺斯克文挪威博克马尔文南恩德贝勒文纳瓦霍文尼扬扎文奥克西唐文奥吉" + + "布瓦文奥洛莫文奥里亚文奥塞梯文旁遮普文巴利文波兰文普什图文葡萄牙文盖丘亚文罗曼什文基隆迪文罗马尼亚文俄文卢旺达文梵文萨丁文信德文北萨米文桑戈" + + "文僧伽罗文斯洛伐克文斯洛文尼亚文萨摩亚文绍纳文索马里文阿尔巴尼亚文塞尔维亚文斯瓦特文南索托文巽他文瑞典文斯瓦希里文泰米尔文泰卢固文塔吉克文泰" + + "文提格里尼亚文土库曼文塞茨瓦纳文汤加文土耳其文宗加文塔塔尔文塔西提文维吾尔文乌克兰文乌尔都文乌兹别克文文达文越南文沃拉普克文瓦隆文沃洛夫文科" + + "萨文依地文约鲁巴文壮文中文祖鲁文亚齐文阿乔利文阿当梅文阿迪何文阿弗里希利文亚罕文阿伊努文阿卡德文阿留申文南阿尔泰文古英文昂加文阿拉米文马普切" + + "文阿拉帕霍文阿拉瓦克文阿苏文阿斯图里亚思特文阿瓦乔文俾路支文巴里文巴萨文巴姆穆文戈马拉文别札文别姆巴文贝纳文巴非特文西俾路支文博杰普尔文毕库" + + "尔文比尼文科姆文司克司卡文布拉杰文博多文阿库色文布里亚特文布吉文布鲁文布林文梅敦巴文卡多文巴勒比文卡尤加文阿灿文宿务文奇加文契布卡文查加文楚" + + "吾克文马里文契努克文乔克托文佩瓦扬文彻罗基文夏延文索拉尼库尔德文科普特文克里米亚土耳其文卡舒文达科他文达尔格瓦文台塔文特拉华文司雷夫文多格里" + + "布文丁卡文哲尔马文多格拉文下索布文都阿拉文中古荷兰文朱拉文迪尤拉文达扎葛文恩布文埃菲克文古埃及文埃克丘克文艾拉米特文中古英文旺杜文芳格文菲律" + + "宾文丰文中古法文古法文北弗里西亚文东弗里西亚文弗留利文加文加告兹文迦约文葛巴亚文吉兹文吉尔伯特斯文中古高地德文古高地德文岗德文科洛涅达罗文哥" + + "特文格列博文古希腊文瑞士德文古西文吉维克琴文海达文夏威夷文希利盖农文赫梯文赫蒙文上索布文胡帕文伊班文伊比比奥文伊洛干诺文印古什文逻辑文恩艮巴" + + "马切姆文犹太波斯文犹太阿拉伯文卡拉卡尔帕克文卡比尔文卡琴文卡捷文卡姆巴文卡威文卡巴尔达文加涅姆布文卡塔布文马孔德文卡布佛得鲁文科罗文卡西文和" + + "田文西桑海文卡库文卡伦金文金邦杜文科米-彼尔米亚克文刚卡尼文科斯拉伊文克佩列文卡拉恰伊巴尔卡尔文卡累利阿文库鲁克文香巴拉文巴菲亚文科隆文库梅" + + "克文库特内文拉迪诺文朗吉文拉亨达文兰巴文莱兹依昂文拉科塔文芒戈文洛兹文北卢尔文鲁巴鲁瓦文路易塞诺文隆达文卢奥文卢晒文卢雅文马都拉文马法文马加" + + "伊文迈蒂利文望加锡文曼丁哥文萨伊文马坝文莫克沙文曼达尔文门迪文梅鲁文毛里求斯克里奥尔文中古爱尔兰文马夸文梅塔米克马克文米南卡保文满文曼尼普里" + + "文摩霍克文莫西文蒙当文多种语系克里克文米兰德斯文马尔瓦利文姆耶内文俄日亚文马赞德兰文拿波里文纳马文低地德文尼瓦尔文尼亚斯文纽埃文夸西奥文恩甘" + + "澎文诺盖文古诺尔斯文西非书面文字北索托文努埃尔文经典尼瓦尔文尼亚姆韦齐文尼昂科勒文尼约罗文恩济马文奥萨格文奥托曼土耳其文邦阿西楠文帕拉维文邦" + + "板牙文帕皮亚门托文帕劳文古老波斯文腓尼基文波纳佩文普罗文斯文基切文拉贾斯坦文拉帕努伊文拉罗汤加文兰博文吉普赛文阿罗马尼亚文罗瓦文散达维文雅库" + + "特文萨玛利亚文桑布鲁文萨萨克文桑塔利文甘拜文桑古文西西里文苏格兰文南库尔德文塞内卡文塞纳文塞尔库普文东桑海文古爱尔兰文希尔哈文掸文乍得阿拉伯" + + "文悉达摩文南萨米文律勒欧萨米文伊纳里萨米文斯科特萨米文索尼基文古粟特文苏里南汤加文谢列尔文萨霍文苏库马文苏苏文苏马文科摩罗文刚果斯瓦希里文经" + + "典叙利亚文叙利亚文滕内文特索文特列纳文特塔姆文提格雷文蒂夫文托克劳文克林贡文特林吉特文塔马奇克文汤加文(尼亚萨地区)托克皮辛文太鲁阁文蒂姆西" + + "亚文通布卡文图瓦卢文北桑海文图瓦文塔马齐格特文乌德穆尔特文乌加里特文翁本杜文根语言瓦伊文维普森文沃提克文温旧文瓦尔瑟文瓦拉莫文瓦赖文瓦绍文瓦" + + "尔皮瑞文卡尔梅克文索加文瑶族文雅浦文洋卞文耶姆巴文粤语萨波蒂克文布利斯符号泽纳加文标准摩洛哥塔马塞特文祖尼文无语言内容扎扎文现代标准阿拉伯文" + + "南阿塞拜疆文奥地利德文瑞士高地德文澳大利亚英文加拿大英文英式英文美式英文拉丁美洲西班牙文欧洲西班牙文墨西哥西班牙文加拿大法文瑞士法文佛兰芒文" + + "巴西葡萄牙文欧洲葡萄牙文摩尔多瓦文塞尔维亚-克罗地亚文简体中文繁体中文" + +var zhLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0009, 0x001b, 0x002a, 0x0039, 0x0042, 0x0051, 0x005d, + 0x0069, 0x0075, 0x0081, 0x008d, 0x009c, 0x00ab, 0x00ba, 0x00c9, + 0x00d8, 0x00e4, 0x00f0, 0x00f6, 0x0105, 0x0114, 0x0126, 0x012f, + 0x013b, 0x0147, 0x0153, 0x015c, 0x016e, 0x017a, 0x0186, 0x018f, + 0x0195, 0x01a1, 0x01aa, 0x01b3, 0x01bc, 0x01c2, 0x01cb, 0x01d7, + 0x01e6, 0x01f2, 0x01fb, 0x0204, 0x020d, 0x0216, 0x021f, 0x0225, + 0x0237, 0x0243, 0x0255, 0x0264, 0x0270, 0x027f, 0x028b, 0x0294, + 0x02a0, 0x02a9, 0x02b8, 0x02c7, 0x02d0, 0x02dc, 0x02eb, 0x02f7, + // Entry 40 - 7F + 0x0303, 0x0315, 0x0328, 0x0331, 0x033d, 0x034f, 0x0358, 0x0361, + 0x036d, 0x0379, 0x037f, 0x0388, 0x0397, 0x03a0, 0x03ac, 0x03b8, + 0x03c4, 0x03d0, 0x03d9, 0x03e5, 0x03eb, 0x03f7, 0x0406, 0x0412, + 0x041b, 0x0427, 0x0436, 0x043f, 0x044b, 0x0457, 0x0466, 0x0472, + 0x047b, 0x0487, 0x0499, 0x04a8, 0x04b7, 0x04c3, 0x04cc, 0x04d8, + 0x04ea, 0x04f3, 0x04ff, 0x0508, 0x0514, 0x051d, 0x0526, 0x0538, + 0x0544, 0x0550, 0x0559, 0x056e, 0x0583, 0x0595, 0x05a1, 0x05ad, + 0x05bc, 0x05cb, 0x05d7, 0x05e3, 0x05ef, 0x05fb, 0x0604, 0x060d, + // Entry 80 - BF + 0x0619, 0x0625, 0x0631, 0x063d, 0x0649, 0x0658, 0x065e, 0x066a, + 0x0670, 0x0679, 0x0682, 0x068e, 0x0697, 0x06a3, 0x06b2, 0x06c4, + 0x06d0, 0x06d9, 0x06e5, 0x06f7, 0x0706, 0x0712, 0x071e, 0x0727, + 0x0730, 0x073f, 0x074b, 0x0757, 0x0763, 0x0769, 0x077b, 0x0787, + 0x0796, 0x079f, 0x07ab, 0x07b4, 0x07c0, 0x07cc, 0x07d8, 0x07e4, + 0x07f0, 0x07ff, 0x0808, 0x0811, 0x0820, 0x0829, 0x0835, 0x083e, + 0x0847, 0x0853, 0x0859, 0x085f, 0x0868, 0x0871, 0x087d, 0x0889, + 0x0895, 0x0895, 0x08a7, 0x08b0, 0x08bc, 0x08c8, 0x08c8, 0x08d4, + // Entry C0 - FF + 0x08d4, 0x08e3, 0x08ec, 0x08f5, 0x0901, 0x090d, 0x090d, 0x091c, + 0x091c, 0x092b, 0x092b, 0x092b, 0x0934, 0x0934, 0x094c, 0x094c, + 0x0958, 0x0964, 0x096d, 0x096d, 0x0976, 0x0982, 0x0982, 0x098e, + 0x0997, 0x09a3, 0x09a3, 0x09ac, 0x09b8, 0x09b8, 0x09c7, 0x09d6, + 0x09e2, 0x09eb, 0x09eb, 0x09f4, 0x0a03, 0x0a03, 0x0a03, 0x0a0f, + 0x0a0f, 0x0a18, 0x0a24, 0x0a33, 0x0a3c, 0x0a45, 0x0a4e, 0x0a5a, + 0x0a63, 0x0a6f, 0x0a7b, 0x0a84, 0x0a8d, 0x0a96, 0x0aa2, 0x0aab, + 0x0ab7, 0x0ac0, 0x0acc, 0x0ad8, 0x0ae4, 0x0af0, 0x0af9, 0x0b0e, + // Entry 100 - 13F + 0x0b1a, 0x0b1a, 0x0b32, 0x0b3b, 0x0b47, 0x0b56, 0x0b5f, 0x0b6b, + 0x0b77, 0x0b86, 0x0b8f, 0x0b9b, 0x0ba7, 0x0bb3, 0x0bb3, 0x0bbf, + 0x0bce, 0x0bd7, 0x0be3, 0x0bef, 0x0bf8, 0x0c04, 0x0c04, 0x0c10, + 0x0c1f, 0x0c2e, 0x0c3a, 0x0c3a, 0x0c43, 0x0c43, 0x0c4c, 0x0c58, + 0x0c58, 0x0c5e, 0x0c5e, 0x0c6a, 0x0c73, 0x0c73, 0x0c85, 0x0c97, + 0x0ca3, 0x0ca9, 0x0cb5, 0x0cb5, 0x0cbe, 0x0cca, 0x0cca, 0x0cd3, + 0x0ce5, 0x0ce5, 0x0cf7, 0x0d06, 0x0d06, 0x0d0f, 0x0d21, 0x0d2a, + 0x0d36, 0x0d42, 0x0d4e, 0x0d4e, 0x0d4e, 0x0d57, 0x0d66, 0x0d6f, + // Entry 140 - 17F + 0x0d6f, 0x0d7b, 0x0d7b, 0x0d8a, 0x0d93, 0x0d9c, 0x0da8, 0x0da8, + 0x0db1, 0x0dba, 0x0dc9, 0x0dd8, 0x0de4, 0x0de4, 0x0de4, 0x0ded, + 0x0df6, 0x0e02, 0x0e11, 0x0e23, 0x0e23, 0x0e38, 0x0e44, 0x0e4d, + 0x0e56, 0x0e62, 0x0e6b, 0x0e7a, 0x0e89, 0x0e95, 0x0ea1, 0x0eb3, + 0x0eb3, 0x0ebc, 0x0ebc, 0x0ec5, 0x0ece, 0x0eda, 0x0eda, 0x0eda, + 0x0ee3, 0x0eef, 0x0efb, 0x0f14, 0x0f20, 0x0f2f, 0x0f3b, 0x0f56, + 0x0f56, 0x0f56, 0x0f65, 0x0f71, 0x0f7d, 0x0f89, 0x0f92, 0x0f9e, + 0x0faa, 0x0fb6, 0x0fbf, 0x0fcb, 0x0fd4, 0x0fe3, 0x0fe3, 0x0fe3, + // Entry 180 - 1BF + 0x0fe3, 0x0fef, 0x0fef, 0x0ff8, 0x1001, 0x100d, 0x100d, 0x101c, + 0x102b, 0x1034, 0x103d, 0x1046, 0x104f, 0x104f, 0x104f, 0x105b, + 0x1064, 0x1070, 0x107c, 0x1088, 0x1094, 0x109d, 0x10a6, 0x10b2, + 0x10be, 0x10c7, 0x10d0, 0x10eb, 0x10fd, 0x1106, 0x110c, 0x111b, + 0x112a, 0x1130, 0x113f, 0x114b, 0x1154, 0x1154, 0x115d, 0x1169, + 0x1175, 0x1184, 0x1193, 0x1193, 0x119f, 0x11ab, 0x11ba, 0x11ba, + 0x11c6, 0x11cf, 0x11db, 0x11e7, 0x11f3, 0x11fc, 0x11fc, 0x1208, + 0x1214, 0x121d, 0x122c, 0x122c, 0x123e, 0x124a, 0x1256, 0x1268, + // Entry 1C0 - 1FF + 0x127a, 0x1289, 0x1295, 0x12a1, 0x12ad, 0x12c2, 0x12d1, 0x12dd, + 0x12e9, 0x12fb, 0x1304, 0x1304, 0x1304, 0x1304, 0x1313, 0x1313, + 0x131f, 0x131f, 0x131f, 0x132b, 0x132b, 0x133a, 0x1343, 0x1343, + 0x1352, 0x1361, 0x1370, 0x1370, 0x1370, 0x1379, 0x1385, 0x1385, + 0x1385, 0x1385, 0x1397, 0x13a0, 0x13ac, 0x13b8, 0x13c7, 0x13d3, + 0x13df, 0x13eb, 0x13eb, 0x13f4, 0x13fd, 0x1409, 0x1415, 0x1415, + 0x1424, 0x1430, 0x1439, 0x1439, 0x1448, 0x1454, 0x1463, 0x1463, + 0x146f, 0x1475, 0x1487, 0x1493, 0x1493, 0x1493, 0x149f, 0x14b1, + // Entry 200 - 23F + 0x14c3, 0x14d5, 0x14e1, 0x14ed, 0x14ff, 0x150b, 0x1514, 0x1514, + 0x1520, 0x1529, 0x1532, 0x153e, 0x1553, 0x1565, 0x1571, 0x1571, + 0x1571, 0x157a, 0x1583, 0x158f, 0x159b, 0x15a7, 0x15b0, 0x15bc, + 0x15bc, 0x15c8, 0x15d7, 0x15d7, 0x15e6, 0x1604, 0x1613, 0x1613, + 0x161f, 0x161f, 0x162e, 0x162e, 0x163a, 0x1646, 0x1652, 0x165b, + 0x166d, 0x167f, 0x168e, 0x169a, 0x16a3, 0x16ac, 0x16ac, 0x16b8, + 0x16b8, 0x16b8, 0x16c4, 0x16c4, 0x16cd, 0x16d9, 0x16e5, 0x16ee, + 0x16f7, 0x1706, 0x1706, 0x1715, 0x1715, 0x171e, 0x1727, 0x1730, + // Entry 240 - 27F + 0x1739, 0x1745, 0x1745, 0x174b, 0x175a, 0x1769, 0x1769, 0x1775, + 0x1793, 0x179c, 0x17ab, 0x17b4, 0x17cc, 0x17de, 0x17ed, 0x17ff, + 0x1811, 0x1820, 0x182c, 0x1838, 0x1850, 0x1862, 0x1877, 0x1877, + 0x1886, 0x1892, 0x1892, 0x189e, 0x18b0, 0x18c2, 0x18d1, 0x18ed, + 0x18f9, 0x1905, +} // Size: 1244 bytes + +var zhHantLangStr string = "" + // Size: 7582 bytes + "阿法文阿布哈茲文阿緯斯陀文南非荷蘭文阿坎文阿姆哈拉文阿拉貢文阿拉伯文阿薩姆文阿瓦爾文艾馬拉文亞塞拜然文巴什客爾文白俄羅斯文保加利亞文比斯拉馬文班" + + "巴拉文孟加拉文藏文布列塔尼文波士尼亞文加泰羅尼亞文車臣文查莫洛文科西嘉文克裡文捷克文宗教斯拉夫文楚瓦什文威爾斯文丹麥文德文迪維西文宗卡文埃維" + + "文希臘文英文世界文西班牙文愛沙尼亞文巴斯克文波斯文富拉文芬蘭文斐濟文法羅文法文西弗里西亞文愛爾蘭文蘇格蘭蓋爾文加利西亞文瓜拉尼文古吉拉特文曼" + + "島文豪撒文希伯來文北印度文西里莫圖土文克羅埃西亞文海地文匈牙利文亞美尼亞文赫雷羅文國際文印尼文國際文(E)伊布文四川彝文依奴皮維克文伊多文冰" + + "島文義大利文因紐特文日文爪哇文喬治亞文剛果文吉庫尤文廣亞馬文哈薩克文格陵蘭文高棉文坎那達文韓文卡努裡文喀什米爾文庫爾德文科米文康瓦耳文吉爾吉" + + "斯文拉丁文盧森堡文干達文林堡文林加拉文寮文立陶宛文魯巴加丹加文拉脫維亞文馬拉加什文馬紹爾文毛利文馬其頓文馬來亞拉姆文蒙古文馬拉地文馬來文馬爾" + + "他文緬甸文諾魯文北地畢列文尼泊爾文恩東加文荷蘭文耐諾斯克挪威文巴克摩挪威文南地畢列文納瓦霍文尼揚賈文奧克西坦文奧杰布瓦文奧羅莫文歐利亞文奧塞" + + "提文旁遮普文巴利文波蘭文普什圖文葡萄牙文蓋楚瓦文羅曼斯文隆迪文羅馬尼亞文俄文盧安達文梵文撒丁文信德文北方薩米文桑戈文僧伽羅文斯洛伐克文斯洛維" + + "尼亞文薩摩亞文塞內加爾文索馬利文阿爾巴尼亞文塞爾維亞文斯瓦特文塞索托文巽他文瑞典文史瓦希里文坦米爾文泰盧固文塔吉克文泰文提格利尼亞文土庫曼文" + + "突尼西亞文東加文土耳其文特松加文韃靼文大溪地文維吾爾文烏克蘭文烏都文烏茲別克文溫達文越南文沃拉普克文瓦隆文沃洛夫文科薩文意第緒文約魯巴文壯文" + + "中文祖魯文亞齊文阿僑利文阿當莫文阿迪各文突尼斯阿拉伯文阿弗里希利文亞罕文阿伊努文阿卡德文阿拉巴馬文阿留申文蓋格阿爾巴尼亞文南阿爾泰文古英文昂" + + "加文阿拉米文馬普切文阿拉奧納文阿拉帕霍文阿爾及利亞阿拉伯文阿拉瓦克文摩洛哥阿拉伯文埃及阿拉伯文阿蘇文美國手語阿斯圖里亞文科塔瓦文阿瓦文俾路支" + + "文峇里文巴伐利亞文巴薩文巴姆穆文巴塔克托巴文戈馬拉文貝扎文別姆巴文貝塔維文貝納文富特文巴達加文西俾路支文博傑普爾文比科爾文比尼文班亞爾文康姆" + + "文錫克錫卡文比什奴普萊利亞文巴赫蒂亞里文布拉杰文布拉維文博多文阿庫色文布里阿特文布吉斯文布魯文比林文梅敦巴文卡多文加勒比文卡尤加文阿燦文宿霧" + + "文奇加文奇布查文查加文處奇斯文馬里文契奴克文喬克托文奇佩瓦揚文柴羅基文沙伊安文索拉尼庫爾德文科普特文卡皮茲文克里米亞半島的土耳其文;克里米亞" + + "半島的塔塔爾文卡舒布文達科他文達爾格瓦文台塔文德拉瓦文斯拉夫多格里布文丁卡文扎爾馬文多格來文下索布文中部杜順文杜亞拉文中古荷蘭文朱拉文迪尤拉" + + "文達薩文恩布文埃菲克文埃米利安文古埃及文艾卡朱克文埃蘭文中古英文中尤皮克文依汪都文埃斯特雷馬杜拉文芳族文菲律賓文托爾訥芬蘭文豐文卡真法文中古" + + "法文古法文法蘭克-普羅旺斯文北弗里西亞文東弗里西亞文弗留利文加族文加告茲文贛語加約文葛巴亞文索羅亞斯德教達里文吉茲文吉爾伯特群島文吉拉基文中" + + "古高地德文古高地日耳曼文孔卡尼文岡德文科隆達羅文哥德文格列博文古希臘文德文(瑞士)瓦尤文弗拉弗拉文古西文圭契文海達文客家話夏威夷文斐濟印地文" + + "希利蓋農文赫梯文孟文上索布文湘語胡帕文伊班文伊比比奧文伊洛闊文印古什文英格裏亞文牙買加克裏奧爾英文邏輯文恩格姆巴文馬恰美文猶太教-波斯文猶太" + + "阿拉伯文日德蘭文卡拉卡爾帕克文卡比爾文卡琴文卡捷文卡姆巴文卡威文卡巴爾達文卡念布文卡塔布文馬孔德文卡布威爾第文肯揚文科羅文坎剛文卡西文和闐文" + + "西桑海文科瓦文北紮紮其文卡庫文卡倫金文金邦杜文科米-彼爾米亞克文貢根文科斯雷恩文克佩列文卡拉柴-包爾卡爾文塞拉利昂克裏奧爾文基那來阿文卡累利" + + "阿文庫魯科文尚巴拉文巴菲亞文科隆文庫密克文庫特奈文拉迪諾文朗吉文拉亨達文蘭巴文列茲干文新共同語言利古里亞文利伏尼亞文拉科塔文倫巴底文芒戈文洛" + + "齊文北盧爾文拉特加萊文魯巴魯魯亞文路易塞諾文盧恩達文盧奧文盧晒文盧雅文文言文拉茲文馬都拉文馬法文馬加伊文邁蒂利文望加錫文曼丁哥文馬賽文馬巴文" + + "莫克沙文曼達文門德文梅魯文克里奧文(模里西斯)中古愛爾蘭文馬夸文美塔文米克馬克文米南卡堡文滿族文曼尼普裡文莫霍克文莫西文西馬裏文蒙當文多種語" + + "言克里克文米蘭德斯文馬爾尼裡文明打威文姆耶內文厄爾茲亞文馬贊德蘭文閩南語拿波里文納馬文低地德文尼瓦爾文尼亞斯文紐埃文阿沃那加文夸西奧文恩甘澎" + + "文諾蓋文古諾爾斯文諾維亞文曼德文字 (N’Ko)北索托文努埃爾文古尼瓦爾文尼揚韋齊文尼揚科萊文尼奧囉文尼茲馬文歐塞奇文鄂圖曼土耳其文潘加辛文" + + "巴列維文潘帕嘉文帕皮阿門托文帛琉文庇卡底文賓夕法尼亞德文門諾低地德文古波斯文普法爾茨德文腓尼基文皮埃蒙特文旁狄希臘文波那貝文普魯士文古普羅旺" + + "斯文基切文欽博拉索海蘭蓋丘亞文拉賈斯坦諸文復活島文拉羅通加文羅馬格諾里文里菲亞諾文蘭博文吉普賽文羅圖馬島文盧森尼亞文羅維阿納文羅馬尼亞語系羅" + + "瓦文桑達韋文雅庫特文薩瑪利亞阿拉姆文薩布魯文撒撒克文散塔利文索拉什特拉文甘拜文桑古文西西里文蘇格蘭文薩丁尼亞-薩薩里文南庫爾德文塞訥卡文賽納" + + "文瑟里文瑟爾卡普文東桑海文古愛爾蘭文薩莫吉希亞文希爾哈文撣文阿拉伯文(查德)希達摩文下西利西亞文塞拉亞文南薩米文魯勒薩米文伊納裡薩米文斯科特" + + "薩米文索尼基文索格底亞納文蘇拉南東墎文塞雷爾文薩霍文沙特菲士蘭文蘇庫馬文蘇蘇文蘇美文葛摩文史瓦希里文(剛果)古敘利亞文敘利亞文西利西亞文圖盧" + + "文提姆文特索文泰雷諾文泰頓文蒂格雷文提夫文托克勞文查庫爾文克林貢文特林基特文塔里什文塔馬奇克文東加文(尼亞薩)托比辛文圖羅尤文太魯閣文特薩克" + + "尼恩文欽西安文穆斯林塔特文圖姆布卡文吐瓦魯文北桑海文土凡文塔馬齊格特文沃蒂艾克文烏加列文姆本杜文根語言瓦伊文威尼斯文維普森文西佛蘭德文美茵-" + + "法蘭克尼亞文沃提克文佛羅文溫舊文瓦瑟文瓦拉莫文瓦瑞文瓦紹文沃皮瑞文吳語卡爾梅克文明格列爾文索加文瑤文雅浦文洋卞文耶姆巴文奈恩加圖文粵語薩波特" + + "克文布列斯符號西蘭文澤納加文標準摩洛哥塔馬塞特文祖尼文無語言內容扎扎文現代標準阿拉伯文高地德文(瑞士)低地薩克遜文佛蘭芒文摩爾多瓦文塞爾維亞" + + "克羅埃西亞文簡體中文繁體中文" + +var zhHantLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0009, 0x0018, 0x0027, 0x0036, 0x003f, 0x004e, 0x005a, + 0x0066, 0x0072, 0x007e, 0x008a, 0x0099, 0x00a8, 0x00b7, 0x00c6, + 0x00d5, 0x00e1, 0x00ed, 0x00f3, 0x0102, 0x0111, 0x0123, 0x012c, + 0x0138, 0x0144, 0x014d, 0x0156, 0x0168, 0x0174, 0x0180, 0x0189, + 0x018f, 0x019b, 0x01a4, 0x01ad, 0x01b6, 0x01bc, 0x01c5, 0x01d1, + 0x01e0, 0x01ec, 0x01f5, 0x01fe, 0x0207, 0x0210, 0x0219, 0x021f, + 0x0231, 0x023d, 0x024f, 0x025e, 0x026a, 0x0279, 0x0282, 0x028b, + 0x0297, 0x02a3, 0x02b5, 0x02c7, 0x02d0, 0x02dc, 0x02eb, 0x02f7, + // Entry 40 - 7F + 0x0300, 0x0309, 0x0319, 0x0322, 0x032e, 0x0340, 0x0349, 0x0352, + 0x035e, 0x036a, 0x0370, 0x0379, 0x0385, 0x038e, 0x039a, 0x03a6, + 0x03b2, 0x03be, 0x03c7, 0x03d3, 0x03d9, 0x03e5, 0x03f4, 0x0400, + 0x0409, 0x0415, 0x0424, 0x042d, 0x0439, 0x0442, 0x044b, 0x0457, + 0x045d, 0x0469, 0x047b, 0x048a, 0x0499, 0x04a5, 0x04ae, 0x04ba, + 0x04cc, 0x04d5, 0x04e1, 0x04ea, 0x04f6, 0x04ff, 0x0508, 0x0517, + 0x0523, 0x052f, 0x0538, 0x054d, 0x055f, 0x056e, 0x057a, 0x0586, + 0x0595, 0x05a4, 0x05b0, 0x05bc, 0x05c8, 0x05d4, 0x05dd, 0x05e6, + // Entry 80 - BF + 0x05f2, 0x05fe, 0x060a, 0x0616, 0x061f, 0x062e, 0x0634, 0x0640, + 0x0646, 0x064f, 0x0658, 0x0667, 0x0670, 0x067c, 0x068b, 0x069d, + 0x06a9, 0x06b8, 0x06c4, 0x06d6, 0x06e5, 0x06f1, 0x06fd, 0x0706, + 0x070f, 0x071e, 0x072a, 0x0736, 0x0742, 0x0748, 0x075a, 0x0766, + 0x0775, 0x077e, 0x078a, 0x0796, 0x079f, 0x07ab, 0x07b7, 0x07c3, + 0x07cc, 0x07db, 0x07e4, 0x07ed, 0x07fc, 0x0805, 0x0811, 0x081a, + 0x0826, 0x0832, 0x0838, 0x083e, 0x0847, 0x0850, 0x085c, 0x0868, + 0x0874, 0x0889, 0x089b, 0x08a4, 0x08b0, 0x08bc, 0x08cb, 0x08d7, + // Entry C0 - FF + 0x08ef, 0x08fe, 0x0907, 0x0910, 0x091c, 0x0928, 0x0937, 0x0946, + 0x0961, 0x0970, 0x0985, 0x0997, 0x09a0, 0x09ac, 0x09be, 0x09ca, + 0x09d3, 0x09df, 0x09e8, 0x09f7, 0x0a00, 0x0a0c, 0x0a1e, 0x0a2a, + 0x0a33, 0x0a3f, 0x0a4b, 0x0a54, 0x0a5d, 0x0a69, 0x0a78, 0x0a87, + 0x0a93, 0x0a9c, 0x0aa8, 0x0ab1, 0x0ac0, 0x0ad8, 0x0aea, 0x0af6, + 0x0b02, 0x0b0b, 0x0b17, 0x0b26, 0x0b32, 0x0b3b, 0x0b44, 0x0b50, + 0x0b59, 0x0b65, 0x0b71, 0x0b7a, 0x0b83, 0x0b8c, 0x0b98, 0x0ba1, + 0x0bad, 0x0bb6, 0x0bc2, 0x0bce, 0x0bdd, 0x0be9, 0x0bf5, 0x0c0a, + // Entry 100 - 13F + 0x0c16, 0x0c22, 0x0c67, 0x0c73, 0x0c7f, 0x0c8e, 0x0c97, 0x0ca3, + 0x0cac, 0x0cbb, 0x0cc4, 0x0cd0, 0x0cdc, 0x0ce8, 0x0cf7, 0x0d03, + 0x0d12, 0x0d1b, 0x0d27, 0x0d30, 0x0d39, 0x0d45, 0x0d54, 0x0d60, + 0x0d6f, 0x0d78, 0x0d84, 0x0d93, 0x0d9f, 0x0db7, 0x0dc0, 0x0dcc, + 0x0dde, 0x0de4, 0x0df0, 0x0dfc, 0x0e05, 0x0e1e, 0x0e30, 0x0e42, + 0x0e4e, 0x0e57, 0x0e63, 0x0e69, 0x0e72, 0x0e7e, 0x0e99, 0x0ea2, + 0x0eb7, 0x0ec3, 0x0ed5, 0x0eea, 0x0ef6, 0x0eff, 0x0f0e, 0x0f17, + 0x0f23, 0x0f2f, 0x0f41, 0x0f4a, 0x0f59, 0x0f62, 0x0f6b, 0x0f74, + // Entry 140 - 17F + 0x0f7d, 0x0f89, 0x0f98, 0x0fa7, 0x0fb0, 0x0fb6, 0x0fc2, 0x0fc8, + 0x0fd1, 0x0fda, 0x0fe9, 0x0ff5, 0x1001, 0x1010, 0x102b, 0x1034, + 0x1043, 0x104f, 0x1062, 0x1074, 0x1080, 0x1095, 0x10a1, 0x10aa, + 0x10b3, 0x10bf, 0x10c8, 0x10d7, 0x10e3, 0x10ef, 0x10fb, 0x110d, + 0x1116, 0x111f, 0x1128, 0x1131, 0x113a, 0x1146, 0x114f, 0x115e, + 0x1167, 0x1173, 0x117f, 0x1198, 0x11a1, 0x11b0, 0x11bc, 0x11d5, + 0x11f0, 0x11ff, 0x120e, 0x121a, 0x1226, 0x1232, 0x123b, 0x1247, + 0x1253, 0x125f, 0x1268, 0x1274, 0x127d, 0x1289, 0x1298, 0x12a7, + // Entry 180 - 1BF + 0x12b6, 0x12c2, 0x12ce, 0x12d7, 0x12e0, 0x12ec, 0x12fb, 0x130d, + 0x131c, 0x1328, 0x1331, 0x133a, 0x1343, 0x134c, 0x1355, 0x1361, + 0x136a, 0x1376, 0x1382, 0x138e, 0x139a, 0x13a3, 0x13ac, 0x13b8, + 0x13c1, 0x13ca, 0x13d3, 0x13f1, 0x1403, 0x140c, 0x1415, 0x1424, + 0x1433, 0x143c, 0x144b, 0x1457, 0x1460, 0x146c, 0x1475, 0x1481, + 0x148d, 0x149c, 0x14ab, 0x14b7, 0x14c3, 0x14d2, 0x14e1, 0x14ea, + 0x14f6, 0x14ff, 0x150b, 0x1517, 0x1523, 0x152c, 0x153b, 0x1547, + 0x1553, 0x155c, 0x156b, 0x1577, 0x158c, 0x1598, 0x15a4, 0x15b3, + // Entry 1C0 - 1FF + 0x15c2, 0x15d1, 0x15dd, 0x15e9, 0x15f5, 0x160a, 0x1616, 0x1622, + 0x162e, 0x1640, 0x1649, 0x1655, 0x166a, 0x167c, 0x1688, 0x169a, + 0x16a6, 0x16b5, 0x16c4, 0x16d0, 0x16dc, 0x16ee, 0x16f7, 0x1715, + 0x1727, 0x1733, 0x1742, 0x1754, 0x1763, 0x176c, 0x1778, 0x1787, + 0x1796, 0x17a5, 0x17b7, 0x17c0, 0x17cc, 0x17d8, 0x17f0, 0x17fc, + 0x1808, 0x1814, 0x1826, 0x182f, 0x1838, 0x1844, 0x1850, 0x1869, + 0x1878, 0x1884, 0x188d, 0x1896, 0x18a5, 0x18b1, 0x18c0, 0x18d2, + 0x18de, 0x18e4, 0x18fc, 0x1908, 0x191a, 0x1926, 0x1932, 0x1941, + // Entry 200 - 23F + 0x1953, 0x1965, 0x1971, 0x1983, 0x1995, 0x19a1, 0x19aa, 0x19bc, + 0x19c8, 0x19d1, 0x19da, 0x19e3, 0x19fe, 0x1a0d, 0x1a19, 0x1a28, + 0x1a31, 0x1a3a, 0x1a43, 0x1a4f, 0x1a58, 0x1a64, 0x1a6d, 0x1a79, + 0x1a85, 0x1a91, 0x1aa0, 0x1aac, 0x1abb, 0x1ad3, 0x1adf, 0x1aeb, + 0x1af7, 0x1b09, 0x1b15, 0x1b27, 0x1b36, 0x1b42, 0x1b4e, 0x1b57, + 0x1b69, 0x1b78, 0x1b84, 0x1b90, 0x1b99, 0x1ba2, 0x1bae, 0x1bba, + 0x1bc9, 0x1be2, 0x1bee, 0x1bf7, 0x1c00, 0x1c09, 0x1c15, 0x1c1e, + 0x1c27, 0x1c33, 0x1c39, 0x1c48, 0x1c57, 0x1c60, 0x1c66, 0x1c6f, + // Entry 240 - 27F + 0x1c78, 0x1c84, 0x1c93, 0x1c99, 0x1ca8, 0x1cb7, 0x1cc0, 0x1ccc, + 0x1cea, 0x1cf3, 0x1d02, 0x1d0b, 0x1d23, 0x1d23, 0x1d23, 0x1d3b, + 0x1d3b, 0x1d3b, 0x1d3b, 0x1d3b, 0x1d3b, 0x1d3b, 0x1d3b, 0x1d3b, + 0x1d3b, 0x1d3b, 0x1d4d, 0x1d59, 0x1d59, 0x1d59, 0x1d68, 0x1d86, + 0x1d92, 0x1d9e, +} // Size: 1244 bytes + +var zuLangStr string = "" + // Size: 3045 bytes + "isi-Abkhaziani-Afrikaansisi-Akanisi-Amharicisi-Arabicisi-Assameseisi-Aym" + + "araisi-Azerbaijaniisi-Bashkirisi-Belarusianisi-Bulgariisi-Bambaraisi-Ben" + + "galiisi-Tibetanisi-Bretonisi-Bosnianisi-Catalanisi-Chechenisi-Corsicanis" + + "i-Czechisi-Chuvashisi-Welshisi-Danishisi-Germanisi-Divehiisi-Dzongkhaisi" + + "-Eweisi-Greeki-Englishisi-Esperantoisi-Spanishisi-Estoniaisi-Basqueisi-P" + + "ersianisi-Finnishisi-Fijianisi-Faroeseisi-Frenchisi-Western Frisianisi-I" + + "rishi-Scottish Gaelicisi-Galiciaisi-Guaraniisi-Gujaratiisi-Manxisi-Hausa" + + "isi-Hebrewisi-Hindiisi-Croatianisi-Haitianisi-Hungarianisi-ArmeniaIzilim" + + "i ezihlangeneisi-Indonesianisi-Igboisi-Sichuan Yiisi-Icelandicisi-Italia" + + "nisi-Inuktitutisi-Japaneseisi-Javaneseisi-GeorgianIsi-Kongoisi-Kikuyuisi" + + "-Kazakhisi-Kalaallisutisi-Khmerisi-Kannadaisi-Koreanisi-Kashmiriisi-Kurd" + + "ishisi-Cornishisi-Kyrgyzisi-Latinisi-Luxembourgishisi-Gandaisi-Lingalai-" + + "Laoisi-Lithuanianisi-Luba-Katangaisi-Latvianisi-Malagasyisi-Maoriisi-Mac" + + "edonianisi-Malayalamisi-Mongolianisi-Marathiisi-Malayisi-Malteseisi-Burm" + + "eseisi-North Ndebeleisi-Nepaliisi-Dutchi-Norwegian Nynorskisi-Norwegian " + + "Bokmålisi-NyanjaIsi-Osithanii-Oromoisi-Oriyaisi-Osseticisi-Punjabiisi-Po" + + "lishisi-Pashtoisi-Portugueseisi-Quechuaisi-Romanshisi-Rundiisi-Romaniani" + + "si-Russianisi-Kinyarwandaisi-Sanskritisi-Sindhiisi-Northern Samiisi-Sang" + + "oi-Sinhalaisi-Slovakisi-Slovenianisi-SamoanisiShonaisi-Somaliisi-Albania" + + "isi-SerbianisiSwatiisiSuthuisi-Sundaneseisi-SwedishisiSwahiliisi-Tamilis" + + "i-Teluguisi-Tajikisi-Thaiisi-Tigrinyaisi-Turkmenisi-Tswanaisi-Tonganisi-" + + "Turkishisi-Tsongaisi-Tatarisi-Tahitianisi-Uighurisi-Ukrainianisi-Urduisi" + + "-Uzbekisi-Vendaisi-Vietnameseisi-WolofisiXhosaIsi-Yidishisi-Yorubaisi-Ch" + + "ineseisiZuluIsi-Acoliisi-Aghemisi-Mapucheisi-Asuisi-Bembaisi-Benaisi-Wes" + + "tern Balochiisi-Bodoisi-Chigaisi-Cherokeeisi-Central Kurdishisi-Taitaisi" + + "-Zarmaisi-Lower Sorbianisi-Dualaisi-Jola-Fonylisi-Embuisi-Efikisi-Filipi" + + "noIsi-Gaisi-Gagauzisi-Swiss Germanisi-Gusliisi-Hawaiianisi-Upper Sorbian" + + "isi-Ngombaisi-Machameisi-Kabyleisi-Kambaisi-Makondeisi-Kabuverdianuisi-K" + + "oyra Chiiniisi-Kalenjinisi-Komi-Permyakisi-KonkaniisiShambalaisi-Bafiais" + + "i-Langiisi-LakotaIsi-Loziisi-Northern LuriIsi-Luba-Luluaisi-Luoisi-Luyia" + + "isi-Masaiisi-Meruisi-Morisyenisi-Makhuwa-Meettoisi-Meta’isi-Mohawkisi-Mu" + + "ndangisi-Mazanderaniisi-Namandsisi-Kwasioisi-N’Koisi-Northern Sothoisi-N" + + "uerisi-Nyankoleisi-Kʼicheʼisi-Romboisi-Rwaisi-Samburuisi-Sangui-Southern" + + " Kurdishisi-Senaisi-Koyraboro Senniisi-Tachelhitisi-Southern Samiisi-Lul" + + "e Samiisi-Inari Samiisi-Skolt Samiisi-Congo Swahiliisi-Tesoisi-TetumIsi-" + + "Klingonisi-Tok PisinIsi-Tumbukaisi-Tasawaqisi-Central Atlas Tamazightuli" + + "mi olungaziwaisi-VaiisiVunjoisi-Warlpiriisi-Sogaisi-Standard Moroccan Ta" + + "mazightakukho okuqukethwe kolimiisi-Arabic esivamile sesimanjeisi-Austri" + + "an Germani-Swiss High Germanisi-Austrillian Englishi-Canadian Englishi-B" + + "ritish Englishi-American Englishisi-Latin American Spanishi-European Spa" + + "nishi-Mexican Spanishi-Canadian Frenchi-Swiss Frenchisi-Low Saxonisi-Fle" + + "mishisi-Brazillian Portugueseisi-European Portugueseisi-Moldavianisi-Chi" + + "nese (Okosiko)" + +var zuLangIdx = []uint16{ // 610 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x000d, 0x000d, 0x0018, 0x0020, 0x002b, 0x002b, + 0x0035, 0x0041, 0x0041, 0x004b, 0x005a, 0x0065, 0x0073, 0x007e, + 0x007e, 0x0089, 0x0094, 0x009f, 0x00a9, 0x00b4, 0x00bf, 0x00ca, + 0x00ca, 0x00d6, 0x00d6, 0x00df, 0x00df, 0x00ea, 0x00f3, 0x00fd, + 0x0107, 0x0111, 0x011d, 0x0124, 0x012d, 0x0136, 0x0143, 0x014e, + 0x0159, 0x0163, 0x016e, 0x016e, 0x0179, 0x0183, 0x018e, 0x0198, + 0x01ab, 0x01b4, 0x01c5, 0x01d0, 0x01db, 0x01e7, 0x01ef, 0x01f8, + 0x0202, 0x020b, 0x020b, 0x0217, 0x0222, 0x022f, 0x023a, 0x023a, + // Entry 40 - 7F + 0x024d, 0x025b, 0x025b, 0x0263, 0x0271, 0x0271, 0x0271, 0x027e, + 0x0289, 0x0296, 0x02a2, 0x02ae, 0x02ba, 0x02c3, 0x02cd, 0x02cd, + 0x02d7, 0x02e6, 0x02ef, 0x02fa, 0x0304, 0x0304, 0x0310, 0x031b, + 0x031b, 0x0326, 0x0330, 0x0339, 0x034a, 0x0353, 0x0353, 0x035e, + 0x0363, 0x0371, 0x0381, 0x038c, 0x0398, 0x0398, 0x03a1, 0x03af, + 0x03bc, 0x03c9, 0x03d4, 0x03dd, 0x03e8, 0x03f3, 0x03f3, 0x0404, + 0x040e, 0x040e, 0x0417, 0x042a, 0x043f, 0x043f, 0x043f, 0x0449, + 0x0455, 0x0455, 0x045c, 0x0465, 0x0470, 0x047b, 0x047b, 0x0485, + // Entry 80 - BF + 0x048f, 0x049d, 0x04a8, 0x04b3, 0x04bc, 0x04c8, 0x04d3, 0x04e2, + 0x04ee, 0x04ee, 0x04f8, 0x0509, 0x0512, 0x051b, 0x0525, 0x0532, + 0x053c, 0x0544, 0x054e, 0x0559, 0x0564, 0x056c, 0x0574, 0x0581, + 0x058c, 0x0596, 0x059f, 0x05a9, 0x05b2, 0x05ba, 0x05c6, 0x05d1, + 0x05db, 0x05e5, 0x05f0, 0x05fa, 0x0603, 0x060f, 0x0619, 0x0626, + 0x062e, 0x0637, 0x0640, 0x064e, 0x064e, 0x064e, 0x0657, 0x065f, + 0x0669, 0x0673, 0x0673, 0x067e, 0x0685, 0x0685, 0x068e, 0x068e, + 0x068e, 0x068e, 0x068e, 0x0697, 0x0697, 0x0697, 0x0697, 0x0697, + // Entry C0 - FF + 0x0697, 0x0697, 0x0697, 0x0697, 0x0697, 0x06a2, 0x06a2, 0x06a2, + 0x06a2, 0x06a2, 0x06a2, 0x06a2, 0x06a9, 0x06a9, 0x06a9, 0x06a9, + 0x06a9, 0x06a9, 0x06a9, 0x06a9, 0x06a9, 0x06a9, 0x06a9, 0x06a9, + 0x06a9, 0x06b2, 0x06b2, 0x06ba, 0x06ba, 0x06ba, 0x06cd, 0x06cd, + 0x06cd, 0x06cd, 0x06cd, 0x06cd, 0x06cd, 0x06cd, 0x06cd, 0x06cd, + 0x06cd, 0x06d5, 0x06d5, 0x06d5, 0x06d5, 0x06d5, 0x06d5, 0x06d5, + 0x06d5, 0x06d5, 0x06d5, 0x06d5, 0x06d5, 0x06de, 0x06de, 0x06de, + 0x06de, 0x06de, 0x06de, 0x06de, 0x06de, 0x06ea, 0x06ea, 0x06fd, + // Entry 100 - 13F + 0x06fd, 0x06fd, 0x06fd, 0x06fd, 0x06fd, 0x06fd, 0x0706, 0x0706, + 0x0706, 0x0706, 0x0706, 0x070f, 0x070f, 0x0720, 0x0720, 0x0729, + 0x0729, 0x0737, 0x0737, 0x0737, 0x073f, 0x0747, 0x0747, 0x0747, + 0x0747, 0x0747, 0x0747, 0x0747, 0x0747, 0x0747, 0x0747, 0x0753, + 0x0753, 0x0753, 0x0753, 0x0753, 0x0753, 0x0753, 0x0753, 0x0753, + 0x0753, 0x0759, 0x0763, 0x0763, 0x0763, 0x0763, 0x0763, 0x0763, + 0x0763, 0x0763, 0x0763, 0x0763, 0x0763, 0x0763, 0x0763, 0x0763, + 0x0763, 0x0763, 0x0773, 0x0773, 0x0773, 0x077c, 0x077c, 0x077c, + // Entry 140 - 17F + 0x077c, 0x0788, 0x0788, 0x0788, 0x0788, 0x0788, 0x0799, 0x0799, + 0x0799, 0x0799, 0x0799, 0x0799, 0x0799, 0x0799, 0x0799, 0x0799, + 0x07a3, 0x07ae, 0x07ae, 0x07ae, 0x07ae, 0x07ae, 0x07b8, 0x07b8, + 0x07b8, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07c1, 0x07cc, 0x07dc, + 0x07dc, 0x07dc, 0x07dc, 0x07dc, 0x07dc, 0x07ec, 0x07ec, 0x07ec, + 0x07ec, 0x07f8, 0x07f8, 0x0808, 0x0813, 0x0813, 0x0813, 0x0813, + 0x0813, 0x0813, 0x0813, 0x0813, 0x081e, 0x0827, 0x0827, 0x0827, + 0x0827, 0x0827, 0x0830, 0x0830, 0x0830, 0x0830, 0x0830, 0x0830, + // Entry 180 - 1BF + 0x0830, 0x083a, 0x083a, 0x083a, 0x0842, 0x0853, 0x0853, 0x0861, + 0x0861, 0x0861, 0x0868, 0x0868, 0x0871, 0x0871, 0x0871, 0x0871, + 0x0871, 0x0871, 0x0871, 0x0871, 0x0871, 0x087a, 0x087a, 0x087a, + 0x087a, 0x087a, 0x0882, 0x088e, 0x088e, 0x08a0, 0x08ab, 0x08ab, + 0x08ab, 0x08ab, 0x08ab, 0x08b5, 0x08b5, 0x08b5, 0x08c0, 0x08c0, + 0x08c0, 0x08c0, 0x08c0, 0x08c0, 0x08c0, 0x08c0, 0x08cf, 0x08cf, + 0x08cf, 0x08d7, 0x08da, 0x08da, 0x08da, 0x08da, 0x08da, 0x08e4, + 0x08e4, 0x08e4, 0x08e4, 0x08e4, 0x08ee, 0x0900, 0x0908, 0x0908, + // Entry 1C0 - 1FF + 0x0908, 0x0914, 0x0914, 0x0914, 0x0914, 0x0914, 0x0914, 0x0914, + 0x0914, 0x0914, 0x0914, 0x0914, 0x0914, 0x0914, 0x0914, 0x0914, + 0x0914, 0x0914, 0x0914, 0x0914, 0x0914, 0x0914, 0x0921, 0x0921, + 0x0921, 0x0921, 0x0921, 0x0921, 0x0921, 0x092a, 0x092a, 0x092a, + 0x092a, 0x092a, 0x092a, 0x0931, 0x0931, 0x0931, 0x0931, 0x093c, + 0x093c, 0x093c, 0x093c, 0x093c, 0x0945, 0x0945, 0x0945, 0x0945, + 0x0957, 0x0957, 0x095f, 0x095f, 0x095f, 0x0972, 0x0972, 0x0972, + 0x097f, 0x097f, 0x097f, 0x097f, 0x097f, 0x097f, 0x0990, 0x099d, + // Entry 200 - 23F + 0x09ab, 0x09b9, 0x09b9, 0x09b9, 0x09b9, 0x09b9, 0x09b9, 0x09b9, + 0x09b9, 0x09b9, 0x09b9, 0x09b9, 0x09ca, 0x09ca, 0x09ca, 0x09ca, + 0x09ca, 0x09ca, 0x09d2, 0x09d2, 0x09db, 0x09db, 0x09db, 0x09db, + 0x09db, 0x09e6, 0x09e6, 0x09e6, 0x09e6, 0x09e6, 0x09f3, 0x09f3, + 0x09f3, 0x09f3, 0x09f3, 0x09f3, 0x09fe, 0x09fe, 0x0a09, 0x0a09, + 0x0a24, 0x0a24, 0x0a24, 0x0a24, 0x0a34, 0x0a3b, 0x0a3b, 0x0a3b, + 0x0a3b, 0x0a3b, 0x0a3b, 0x0a3b, 0x0a43, 0x0a43, 0x0a43, 0x0a43, + 0x0a43, 0x0a4f, 0x0a4f, 0x0a4f, 0x0a4f, 0x0a57, 0x0a57, 0x0a57, + // Entry 240 - 27F + 0x0a57, 0x0a57, 0x0a57, 0x0a57, 0x0a57, 0x0a57, 0x0a57, 0x0a57, + 0x0a76, 0x0a76, 0x0a8f, 0x0a8f, 0x0aad, 0x0aad, 0x0ac0, 0x0ad3, + 0x0aea, 0x0afc, 0x0b0d, 0x0b1f, 0x0b39, 0x0b4b, 0x0b5c, 0x0b5c, + 0x0b6d, 0x0b7b, 0x0b88, 0x0b93, 0x0bac, 0x0bc3, 0x0bd0, 0x0bd0, + 0x0bd0, 0x0be5, +} // Size: 1244 bytes + +// Total size for lang: 896067 bytes (896 KB) + +// Number of keys: 167 +var ( + scriptIndex = tagIndex{ + "", + "", + "AfakAghbAhomArabArmiArmnAvstBaliBamuBassBatkBengBlisBopoBrahBraiBugiBuhd" + + "CakmCansCariChamCherCirtCoptCprtCyrlCyrsDevaDsrtDuplEgydEgyhEgypElba" + + "EthiGeokGeorGlagGothGranGrekGujrGuruHangHaniHanoHansHantHatrHebrHira" + + "HluwHmngHrktHungIndsItalJavaJpanJurcKaliKanaKharKhmrKhojKndaKoreKpel" + + "KthiLanaLaooLatfLatgLatnLepcLimbLinaLinbLisuLomaLyciLydiMahjMandMani" + + "MayaMendMercMeroMlymModiMongMoonMrooMteiMultMymrNarbNbatNkgbNkooNshu" + + "OgamOlckOrkhOryaOsmaPalmPaucPermPhagPhliPhlpPhlvPhnxPlrdPrtiRjngRoro" + + "RunrSamrSaraSarbSaurSgnwShawShrdSiddSindSinhSoraSundSyloSyrcSyreSyrj" + + "SyrnTagbTakrTaleTaluTamlTangTavtTeluTengTfngTglgThaaThaiTibtTirhUgar" + + "VaiiVispWaraWoleXpeoXsuxYiiiZinhZmthZsymZxxxZyyyZzzz", + } +) + +var scriptHeaders = [218]header{ + { // af + afScriptStr, + afScriptIdx, + }, + {}, // agq + {}, // ak + { // am + amScriptStr, + amScriptIdx, + }, + { // ar + arScriptStr, + arScriptIdx, + }, + {}, // ar-EG + { // as + "বঙালী", + []uint16{ // 13 elements + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x000f, + }, + }, + {}, // asa + { // ast + "afakacáucaso-albanésahomárabearamaicu imperialarmeniuavésticubalinésbamu" + + "mbassa vahbatakbengalínsímbolos de Blissbopomofobrahmibraillelontara" + + "buhidchakmasilábicu unificáu de los nativos canadiensescariuchamcher" + + "okicirthcoptuxipriotacirílicueslavónicu cirílicu eclesiásticu antigu" + + "udevanagarialfabetu Deserettaquigrafía Duployédemóticu exipcianuhier" + + "áticu exipcianuxeroglíficos exipcianoselbasanetíopekhutsuri xeorxan" + + "uxeorxanuglagolíticugóticugranthagrieguguyaratigurmukhihangulhanhanu" + + "nó’ohan simplificáuhan tradicionalhatranuhebréuḥiraganaxeroglíficos " + + "anatoliospahawh hmongsilabarios xaponeseshúngaru antiguuindusitálicu" + + " antiguuxavanésxaponésjurchenkayah likatakanakharoshthiḥemerkhojkica" + + "naréscoreanukpellekaithilannalaosianufraktur llatíngaélicu llatínlla" + + "tínlepchalimbullinial Allinial Balfabetu de Fraserlomaliciulidiumaha" + + "janimandéumaniquéuxeroglíficos mayesmendemeroíticu en cursivameroíti" + + "cumalayalammodimongoltipos Moonmromeitei mayekmultanibirmanuárabe de" + + "l norte antiguunabatéugeba del naxin’konüshuoghamol chikiorkhonoriya" + + "osmanyapalmirenuPau Cin Haupérmicu antiguuescritura ‘Phags-papahlavi" + + " d’inscripcionespahlavi de salteriupahlavi de llibrosfeniciufonéticu" + + " de Pollardpartu d’inscripcionesrejangrongorongorunessamaritanusarat" + + "iárabe del sur antiguusaurashtraescritura de signosshavianusharadasi" + + "ddhamkhudabadicingaléssora sompengsondanéssyloti nagrisiriacusiriacu" + + " estrangelosiriacu occidentalsiriacu orientaltagbanwatakritai letai " + + "lue nuevutamiltanguttai viettelugutengwartifinaghtagalogthaanatailan" + + "déstibetanutirhutaugaríticuvaifala visiblevarang kshitiwoleaipersa a" + + "ntiguucuneiforme sumeriu acadiuyiheredáuescritura matemáticasímbolos" + + "non escritucomúnescritura desconocida", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0005, 0x0016, 0x001a, 0x0020, 0x0031, 0x0038, 0x0041, + 0x0049, 0x004e, 0x0057, 0x005c, 0x0065, 0x0077, 0x007f, 0x0085, + 0x008c, 0x0093, 0x0098, 0x009e, 0x00cc, 0x00d1, 0x00d5, 0x00dc, + 0x00e1, 0x00e6, 0x00ee, 0x00f7, 0x0122, 0x012c, 0x013c, 0x0151, + 0x0164, 0x0178, 0x0190, 0x0197, 0x019e, 0x01af, 0x01b7, 0x01c3, + 0x01ca, 0x01d1, 0x01d7, 0x01df, 0x01e7, 0x01ed, 0x01f0, 0x01fb, + 0x020b, 0x021a, 0x0221, 0x0228, 0x0232, 0x0249, 0x0255, 0x0269, + 0x0279, 0x027e, 0x028e, 0x0296, 0x029e, 0x02a5, 0x02ad, 0x02b5, + // Entry 40 - 7F + 0x02bf, 0x02c6, 0x02cc, 0x02d4, 0x02db, 0x02e1, 0x02e7, 0x02ec, + 0x02f4, 0x0303, 0x0313, 0x031a, 0x0320, 0x0325, 0x032e, 0x0337, + 0x0349, 0x034d, 0x0352, 0x0357, 0x035f, 0x0366, 0x036f, 0x0382, + 0x0387, 0x039c, 0x03a6, 0x03af, 0x03b3, 0x03b9, 0x03c3, 0x03c6, + 0x03d2, 0x03d9, 0x03e0, 0x03f8, 0x0400, 0x040d, 0x0413, 0x0419, + 0x041e, 0x0426, 0x042c, 0x0431, 0x0438, 0x0441, 0x044c, 0x045c, + 0x0471, 0x048a, 0x049d, 0x04af, 0x04b6, 0x04ca, 0x04e1, 0x04e7, + 0x04f1, 0x04f6, 0x0500, 0x0506, 0x051c, 0x0526, 0x0539, 0x0541, + // Entry 80 - BF + 0x0548, 0x054f, 0x0558, 0x0561, 0x056d, 0x0576, 0x0582, 0x0589, + 0x059b, 0x05ad, 0x05bd, 0x05c5, 0x05ca, 0x05d0, 0x05dd, 0x05e2, + 0x05e8, 0x05f0, 0x05f6, 0x05fd, 0x0605, 0x060c, 0x0612, 0x061c, + 0x0624, 0x062b, 0x0635, 0x0638, 0x0644, 0x0651, 0x0657, 0x0664, + 0x067d, 0x067f, 0x0687, 0x069c, 0x06a5, 0x06b0, 0x06b6, 0x06cb, + }, + }, + { // az + azScriptStr, + azScriptIdx, + }, + { // az-Cyrl + "Кирил", + []uint16{ // 28 elements + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x000a, + }, + }, + {}, // bas + { // be + "арабскаеармянскаебенгальскаебапамофашрыфт Брайлякірыліцадэванагарыэфіопс" + + "каегрузінскаегрэчаскаегуджараціГурмукхіхангыльханспрошчаны хантрады" + + "цыйны ханяўрэйскаехіраганаяпонскаекатаканакхмерскаеканадакарэйскаел" + + "аоскаелацінкамалаяламстарамангольскаем’янмарскаеорыясінгальскаетамі" + + "льскаетэлугутанатайскаетыбецкаесімвалынепісьменнызвычайнаеневядомае" + + " пісьмо", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0010, 0x0022, 0x0022, + 0x0022, 0x0022, 0x0022, 0x0022, 0x0038, 0x0038, 0x0048, 0x0048, + 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, 0x005f, + 0x005f, 0x005f, 0x005f, 0x006f, 0x006f, 0x0083, 0x0083, 0x0083, + 0x0083, 0x0083, 0x0083, 0x0083, 0x0095, 0x0095, 0x00a9, 0x00a9, + 0x00a9, 0x00a9, 0x00bb, 0x00cd, 0x00dd, 0x00eb, 0x00f1, 0x00f1, + 0x010a, 0x0125, 0x0125, 0x0137, 0x0147, 0x0147, 0x0147, 0x0147, + 0x0147, 0x0147, 0x0147, 0x0147, 0x0157, 0x0157, 0x0157, 0x0167, + // Entry 40 - 7F + 0x0167, 0x0179, 0x0179, 0x0185, 0x0197, 0x0197, 0x0197, 0x0197, + 0x01a5, 0x01a5, 0x01a5, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, + 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, + 0x01b3, 0x01b3, 0x01b3, 0x01c3, 0x01c3, 0x01e3, 0x01e3, 0x01e3, + 0x01e3, 0x01e3, 0x01fa, 0x01fa, 0x01fa, 0x01fa, 0x01fa, 0x01fa, + 0x01fa, 0x01fa, 0x01fa, 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, + 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, + 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, 0x0202, + // Entry 80 - BF + 0x0202, 0x0202, 0x0202, 0x0218, 0x0218, 0x0218, 0x0218, 0x0218, + 0x0218, 0x0218, 0x0218, 0x0218, 0x0218, 0x0218, 0x0218, 0x022c, + 0x022c, 0x022c, 0x0238, 0x0238, 0x0238, 0x0238, 0x0240, 0x024e, + 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, + 0x025e, 0x025e, 0x025e, 0x025e, 0x026c, 0x0282, 0x0294, 0x02b3, + }, + }, + {}, // bem + {}, // bez + { // bg + bgScriptStr, + bgScriptIdx, + }, + {}, // bm + { // bn + bnScriptStr, + bnScriptIdx, + }, + { // bo + "རྒྱ་ཡིག་གསར་པ།རྒྱ་ཡིག་རྙིང་པ།བོད་ཡིག་སྙན་བརྒྱུད། ཡིག་རིགས་སུ་མ་བཀོད་པའི་" + + "ཟིན་ཐོ།", + []uint16{ // 166 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x002a, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + // Entry 40 - 7F + 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + // Entry 80 - BF + 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, + 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, + 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x00eb, + }, + }, + {}, // bo-IN + { // br + "arabekarameek impalaerelarmenianekavestekbalinekbengalibopomofoBraillebo" + + "ugiekkoptekkirillekkirillek henslavonekdevanagarihieroglifoù egiptek" + + "etiopekjorjianekglagolitekgotekgresianekgujaratigurmukhihangeulhanha" + + "n eeunaethan hengounelhebraekhiraganahieroglifoù Anatoliahenitalekja" + + "vanekjapanekkatakanakhmerkannadakoreaneklaoseklatin gouezeleklatinhi" + + "eroglifoù mayaekmalayalammongolekmyanmarogamoriyaruneksinghaleksunda" + + "neksirieksiriek Estrangelāsiriek ar C’hornôgsiriek ar Retertamilekte" + + "lougoutagalogthaanathaitibetanekougaritekvaipersek kozhnotadur jedon" + + "ielarouezioùanskrivetboutinskritur dianav", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0018, 0x0022, 0x0029, + 0x0030, 0x0030, 0x0030, 0x0030, 0x0037, 0x0037, 0x003f, 0x003f, + 0x0046, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, + 0x004d, 0x0053, 0x0053, 0x005b, 0x006f, 0x0079, 0x0079, 0x0079, + 0x0079, 0x0079, 0x008d, 0x008d, 0x0094, 0x0094, 0x009d, 0x00a7, + 0x00ac, 0x00ac, 0x00b5, 0x00bd, 0x00c5, 0x00cc, 0x00cf, 0x00cf, + 0x00da, 0x00e7, 0x00e7, 0x00ee, 0x00f6, 0x010b, 0x010b, 0x010b, + 0x010b, 0x010b, 0x0114, 0x011b, 0x0122, 0x0122, 0x0122, 0x012a, + // Entry 40 - 7F + 0x012a, 0x012f, 0x012f, 0x0136, 0x013e, 0x013e, 0x013e, 0x013e, + 0x0144, 0x0144, 0x0153, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, + 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x016b, + 0x016b, 0x016b, 0x016b, 0x0174, 0x0174, 0x017c, 0x017c, 0x017c, + 0x017c, 0x017c, 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, 0x0183, + 0x0187, 0x0187, 0x0187, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, + 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, 0x018c, + 0x018c, 0x0191, 0x0191, 0x0191, 0x0191, 0x0191, 0x0191, 0x0191, + // Entry 80 - BF + 0x0191, 0x0191, 0x0191, 0x019a, 0x019a, 0x01a2, 0x01a2, 0x01a8, + 0x01ba, 0x01cf, 0x01de, 0x01de, 0x01de, 0x01de, 0x01de, 0x01e5, + 0x01e5, 0x01e5, 0x01ed, 0x01ed, 0x01ed, 0x01f4, 0x01fa, 0x01fe, + 0x0207, 0x0207, 0x0210, 0x0213, 0x0213, 0x0213, 0x0213, 0x021e, + 0x021e, 0x021e, 0x021e, 0x022e, 0x0238, 0x0241, 0x0247, 0x0255, + }, + }, + { // brx + "अरबीशहनशाही आरामाईकअर्मेनियाईअवस्तन्बालीबटकीबंगालीब्लीस चीन्हबोपोमोफोब्र" + + "ह्मीब्रेलबुगीनीबुहीदयुनीफाईड कैनेडियन अबॉरीजीनल सीलैबीक्सकारियनकॅम" + + "चिरूकीसिर्थकॉप्टसीप्रीओट्सिरिलिक्पुरानी चर्च सिरिलिक्देवनागरीदेसेर" + + "ट्मीस्री डैमोटीक्मीस्री हैरैटीक्मीस्री हैरोग्लीफ़्ईथोपियाईजोर्जीयन" + + " खुतसुरीजोर्जीयनग्लैगोलिटीकगौथीकग्रीकगुजरातीगुरमुखीहंगुलहानहानुनुसरल" + + "ीकृत हानपारम्परिक हानहिब्रूहीरागानापाहवाह ह्मौंगकाताकाना या हीरागा" + + "नापुरानी हंगैरीयनसिन्धुपुरानी इटैलियनजावानीसजापानीकायाह लीकाताकाना" + + "खरोष्टीख्मेरकन्नड़कोरियाईलानालाओफ्रैक्तुर लैटिनगैलीक लैटिनलैटिनलेप" + + "चालिम्बुलीनीयर एलीनीयर बीलीसीयनलीडीयनमांडेमानीकीमाया हीरोग्लीफ्मेर" + + "ोईटीक्मलयालम्मंगोलियाईमुन्मेतेई मयेकम्यानमार्न्गकोओगहैमओल चीकीओरखो" + + "नउड़ियाओस्मानियापुरानी पर्मीक्फाग्स पाबुक (सालटर) पहलवीफोनीशीयनपौल" + + "ार्ड़ फोनेटीकरेजेंगरोंगोरोंगोरूनिकसमारतीसरातीसौराष्ट्रसांकेतिक लेख" + + "शेवियनसिंहालीसूडानीसील्होटी नागरीसीरीआकएस्ट्रांगलो सीरीआकपश्चीमी स" + + "ीरीआकपूर्वी सीरीआकतागबानवाताई लेनया ताई लुएतमीळतेलुगुतेंगवारतीफीना" + + "ग़टागालॉगथानाथाईतिब्बतीऊगारीटीकवाईवीज़ीबल बोलीपुरानी फारसीसुमेरो अ" + + "क्काड़ी कुनेईफॉर्मयीविरासतअलिखितआमअज्ञात या अवैध लिपि", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x0037, 0x0055, 0x006a, + 0x0076, 0x0076, 0x0076, 0x0082, 0x0094, 0x00b3, 0x00cb, 0x00e0, + 0x00ef, 0x0101, 0x0110, 0x0110, 0x0179, 0x018b, 0x0194, 0x01a6, + 0x01b5, 0x01c4, 0x01df, 0x01f7, 0x022f, 0x0247, 0x025c, 0x025c, + 0x0287, 0x02b2, 0x02e6, 0x02e6, 0x02fe, 0x032c, 0x0344, 0x0365, + 0x0374, 0x0374, 0x0383, 0x0398, 0x03ad, 0x03bc, 0x03c5, 0x03d7, + 0x03f6, 0x041b, 0x041b, 0x042d, 0x0445, 0x0445, 0x046a, 0x04a2, + 0x04cd, 0x04df, 0x0507, 0x051c, 0x052e, 0x052e, 0x0544, 0x055c, + // Entry 40 - 7F + 0x0571, 0x0580, 0x0580, 0x0592, 0x05a7, 0x05a7, 0x05a7, 0x05b3, + 0x05bc, 0x05e7, 0x0606, 0x0615, 0x0624, 0x0636, 0x064c, 0x0665, + 0x0665, 0x0665, 0x0677, 0x0689, 0x0689, 0x0698, 0x06aa, 0x06d5, + 0x06d5, 0x06d5, 0x06f0, 0x0705, 0x0705, 0x0720, 0x072c, 0x072c, + 0x0748, 0x0748, 0x0763, 0x0763, 0x0763, 0x0763, 0x0772, 0x0772, + 0x0781, 0x0794, 0x07a3, 0x07b5, 0x07d0, 0x07d0, 0x07d0, 0x07f8, + 0x080e, 0x080e, 0x080e, 0x0839, 0x0851, 0x087f, 0x087f, 0x0891, + 0x08af, 0x08be, 0x08d0, 0x08df, 0x08df, 0x08fa, 0x091c, 0x092e, + // Entry 80 - BF + 0x092e, 0x092e, 0x092e, 0x0943, 0x0943, 0x0955, 0x097d, 0x098f, + 0x09c3, 0x09eb, 0x0a10, 0x0a28, 0x0a28, 0x0a38, 0x0a55, 0x0a61, + 0x0a61, 0x0a61, 0x0a73, 0x0a88, 0x0aa0, 0x0ab5, 0x0ac1, 0x0aca, + 0x0adf, 0x0adf, 0x0af7, 0x0b00, 0x0b22, 0x0b22, 0x0b22, 0x0b44, + 0x0b8e, 0x0b94, 0x0ba6, 0x0ba6, 0x0ba6, 0x0bb8, 0x0bbe, 0x0bf1, + }, + }, + { // bs + "arapsko pismoimperijsko aramejsko pismojermensko pismoavestansko pismoba" + + "lijsko pismobatak pismobengalsko pismoblisimbolično pismobopomofo pi" + + "smobramansko pismobrajevo pismobuginsko pismobuhidsko pismočakmansko" + + " pismoUjedinjeni kanadski aboridžinski silabicikarijsko pismočamsko " + + "pismočerokicirt pismokoptičko pismokiparsko pismoćirilicaStarosloven" + + "ska crkvena ćirilicadevanagaridezeretegipatsko narodno pismoegipatsk" + + "o hijeratsko pismoegipatski hijeroglifietiopsko pismogruzijsko khuts" + + "uri pismogruzijsko pismoglagoljicagotikagrčko pismogudžarati pismogu" + + "rmuki pismohangul pismohan pismohanuno pismopojednostavljeno hansko " + + "pismotradicionalno hansko pismohebrejsko pismohiraganapahawh hmong p" + + "ismoKatakana ili HiraganaStaromađarsko pismoinduško ismostaro italsk" + + "o pismojavansko pismojapansko pismokajah li pismokatakanakarošti pis" + + "mokmersko pismokanada pismokorejsko pismokaićansko pismolanna pismol" + + "aosko pismolatinica (fraktur varijanta)galska latinicalatinicalepča " + + "pismolimbu pismolinearno A pismolinearno B pismolisijsko pismolidijs" + + "ko pismomandeansko pismomanihejsko pismomajanski hijeroglifimeroitik" + + " pismomalajalam pismomongolsko pismomesečevo pismomeitei majek pismo" + + "mijanmarsko pismon’ko pismoogham pismool čiki pismoorkhon pismoorija" + + " pismoosmanja pismostaro permiksko pismophags-pa pismopisani pahlavi" + + "psalter pahlavipahlavi pismofeničansko pismopolard fonetsko pismopis" + + "ani partianrejang pismorongorongo pismorunsko pismosamaritansko pism" + + "osarati pismosauraštra pismoznakovno pismošavian pismosinhala pismos" + + "iloti nagri pismosirijsko pismosirijsko estrangelo pismozapadnosirij" + + "sko pismopismo istočne Sirijetagbanva pismotai le pismonovo tai lue " + + "pismotamilsko pismotai viet pismotelugu pismotengvar pismotifinag pi" + + "smotagalogtana pismotajlandsko pismotibetansko pismougaritsko pismov" + + "ai pismovidljivi govorstaropersijsko pismosumersko-akadsko kuneiform" + + " pismoji pismonasledno pismomatematička notacijasimbolinepisani jezi" + + "kzajedničko pismonepoznato pismo", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000d, 0x0027, 0x0036, 0x0046, + 0x0054, 0x0054, 0x0054, 0x005f, 0x006e, 0x0082, 0x0090, 0x009f, + 0x00ac, 0x00ba, 0x00c8, 0x00d8, 0x0102, 0x0110, 0x011d, 0x0124, + 0x012e, 0x013d, 0x014b, 0x0154, 0x0174, 0x017e, 0x0185, 0x0185, + 0x019c, 0x01b6, 0x01cb, 0x01cb, 0x01d9, 0x01f1, 0x0200, 0x020a, + 0x0210, 0x0210, 0x021c, 0x022c, 0x0239, 0x0245, 0x024e, 0x025a, + 0x0277, 0x0291, 0x0291, 0x02a0, 0x02a8, 0x02a8, 0x02ba, 0x02cf, + 0x02e3, 0x02f0, 0x0303, 0x0311, 0x031f, 0x031f, 0x032d, 0x0335, + // Entry 40 - 7F + 0x0343, 0x0350, 0x0350, 0x035c, 0x036a, 0x036a, 0x037a, 0x0385, + 0x0391, 0x03ad, 0x03bc, 0x03c4, 0x03d0, 0x03db, 0x03eb, 0x03fb, + 0x03fb, 0x03fb, 0x0409, 0x0417, 0x0417, 0x0427, 0x0437, 0x044b, + 0x044b, 0x044b, 0x0459, 0x0468, 0x0468, 0x0477, 0x0486, 0x0486, + 0x0498, 0x0498, 0x04a9, 0x04a9, 0x04a9, 0x04a9, 0x04b5, 0x04b5, + 0x04c0, 0x04ce, 0x04da, 0x04e5, 0x04f2, 0x04f2, 0x04f2, 0x0507, + 0x0515, 0x0523, 0x0532, 0x053f, 0x0550, 0x0565, 0x0573, 0x057f, + 0x058f, 0x059b, 0x05ad, 0x05b9, 0x05b9, 0x05c9, 0x05d7, 0x05e4, + // Entry 80 - BF + 0x05e4, 0x05e4, 0x05e4, 0x05f1, 0x05f1, 0x05f1, 0x0603, 0x0611, + 0x062a, 0x063f, 0x0654, 0x0662, 0x0662, 0x066e, 0x0680, 0x068e, + 0x068e, 0x069c, 0x06a8, 0x06b5, 0x06c2, 0x06c9, 0x06d3, 0x06e3, + 0x06f3, 0x06f3, 0x0702, 0x070b, 0x0719, 0x0719, 0x0719, 0x072d, + 0x074d, 0x0755, 0x0763, 0x0778, 0x077f, 0x078d, 0x079e, 0x07ad, + }, + }, + { // bs-Cyrl + "арапско писмоимперијско арамејско писмојерменско писмоавестанско писмоба" + + "лијско писмобатак писмобенгалско писмоблисимболично писмобопомофо п" + + "исмобраманско писмоБрајево писмобугинско писмобухидско писмочакманс" + + "ко писмоуједињени канадски абориџински силабицикаријско писмочамско" + + " писмоЧерокицирт писмокоптичко писмокипарско писмоЋирилицаСтарослове" + + "нска црквена ћирилицаДеванагариДезеретегипатско народно писмоегипат" + + "ско хијератско писмоегипатски хијероглифиетиопско писмогрузијско кх" + + "утсури писмогрузијско писмоглагољицаГотикагрчко писмогујарати писмо" + + "гурмуки писмохангулханханунопоједностављени хантрадиционални ханхеб" + + "рејско писмоХираганапахав хмонг писмоКатакана или Хираганастаромађа" + + "рско писмоиндушко писмостари италикјаванско писмојапанско писмокаја" + + "х-ли писмоКатаканакарошти писмокмерско писмоканнада писмокорејско п" + + "исмокаитиланна писмолаошко писмолатиница (фрактур варијанта)галска " + + "латиницаЛатиницалепча писмолимбу писмолинеарно А писмолинеарно Б пи" + + "смолисијско писмолидијско писмомандеанско писмоманихејско писмомаја" + + "нски хијероглифимероитик писмомалајалам писмомонголско писмомесечев" + + "о писмомеитеи мајек писмомијанмарско писмон’ко писмоогамско писмоол" + + " чики писмоорконско писмооријанско писмоосмањанско писмостаро пермик" + + "ско писмопагс-па писмописани пахлавипсалтер пахлавипахлави писмоФен" + + "ичанско писмопоралд фонетско писмописани партианрејанг писморонгоро" + + "нго писморунско писмосамаританско писмосарати писмосаураштра писмоз" + + "наковно писмошавијанско писмосинхала писмосилоти нагри писмосиријск" + + "о писмосиријско естрангело писмозападносиријско писмописмо источне " + + "Сиријетагбанва писмотаи ле писмонови таи луетамилско писмотаи виет " + + "писмотелугу писмотенгвар писмотифинаг писмоТагалогтхана писмотајлан" + + "дско писмотибетанско писмоугаритско писмоваи писмовидљиви говорстар" + + "оперсијско писмосумерско-акадско кунеиформ писмоји писмонаследно пи" + + "смоматематичка нотацијасимболиНеписани језикзаједничко писмоНепозна" + + "то или неважеће писмо", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0019, 0x004b, 0x0068, 0x0087, + 0x00a2, 0x00a2, 0x00a2, 0x00b7, 0x00d4, 0x00f9, 0x0114, 0x0131, + 0x014a, 0x0165, 0x0180, 0x019d, 0x01e8, 0x0203, 0x021a, 0x0226, + 0x0239, 0x0254, 0x026f, 0x027f, 0x02bb, 0x02cf, 0x02dd, 0x02dd, + 0x0309, 0x033b, 0x0364, 0x0364, 0x037f, 0x03ad, 0x03ca, 0x03dc, + 0x03e8, 0x03e8, 0x03fd, 0x0418, 0x0431, 0x043d, 0x0443, 0x044f, + 0x0474, 0x0495, 0x0495, 0x04b2, 0x04c2, 0x04c2, 0x04e2, 0x050a, + 0x052f, 0x0548, 0x055f, 0x057a, 0x0595, 0x0595, 0x05af, 0x05bf, + // Entry 40 - 7F + 0x05d8, 0x05f1, 0x05f1, 0x060a, 0x0625, 0x0625, 0x062f, 0x0644, + 0x065b, 0x068f, 0x06ac, 0x06bc, 0x06d1, 0x06e6, 0x0704, 0x0722, + 0x0722, 0x0722, 0x073d, 0x0758, 0x0758, 0x0777, 0x0796, 0x07bd, + 0x07bd, 0x07bd, 0x07d8, 0x07f5, 0x07f5, 0x0812, 0x082d, 0x082d, + 0x084f, 0x084f, 0x0870, 0x0870, 0x0870, 0x0870, 0x0884, 0x0884, + 0x089d, 0x08b5, 0x08d0, 0x08ed, 0x090c, 0x090c, 0x090c, 0x0934, + 0x094c, 0x0967, 0x0984, 0x099d, 0x09bc, 0x09e4, 0x09ff, 0x0a16, + 0x0a35, 0x0a4c, 0x0a6f, 0x0a86, 0x0a86, 0x0aa3, 0x0abe, 0x0add, + // Entry 80 - BF + 0x0add, 0x0add, 0x0add, 0x0af6, 0x0af6, 0x0af6, 0x0b18, 0x0b33, + 0x0b63, 0x0b8c, 0x0bb2, 0x0bcd, 0x0bcd, 0x0be3, 0x0bf9, 0x0c14, + 0x0c14, 0x0c2e, 0x0c45, 0x0c5e, 0x0c77, 0x0c85, 0x0c9a, 0x0cb9, + 0x0cd8, 0x0cd8, 0x0cf5, 0x0d06, 0x0d1f, 0x0d1f, 0x0d1f, 0x0d46, + 0x0d83, 0x0d92, 0x0dad, 0x0dd4, 0x0de2, 0x0dfd, 0x0e1c, 0x0e51, + }, + }, + { // ca + caScriptStr, + caScriptIdx, + }, + { // ce + "Ӏаьрбийнэрмалойнбенгалхойнбопомофобрайлякириллицадеванагариэфиопингуьржи" + + "йнгрекийнгуджаратигурмукхихангылькитайнатта китайнламастан китайнжу" + + "гтийнхираганаяпонийнкатаканакхмерийнканнадакорейнлаоссийнлатинанмал" + + "аялийнмонголийнмьянманийнорисингалхойнтамилхойнтелугутаанатайнтибет" + + "хойнсимволашйоза доцумассара а тӀеэцнадоьвзуш доцу йоза", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0010, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0034, 0x0034, 0x0044, 0x0044, + 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, + 0x0050, 0x0050, 0x0050, 0x0062, 0x0062, 0x0076, 0x0076, 0x0076, + 0x0076, 0x0076, 0x0076, 0x0076, 0x0084, 0x0084, 0x0094, 0x0094, + 0x0094, 0x0094, 0x00a2, 0x00b4, 0x00c4, 0x00d2, 0x00de, 0x00de, + 0x00f3, 0x0110, 0x0110, 0x011e, 0x012e, 0x012e, 0x012e, 0x012e, + 0x012e, 0x012e, 0x012e, 0x012e, 0x013c, 0x013c, 0x013c, 0x014c, + // Entry 40 - 7F + 0x014c, 0x015c, 0x015c, 0x016a, 0x0176, 0x0176, 0x0176, 0x0176, + 0x0186, 0x0186, 0x0186, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, + 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, + 0x0194, 0x0194, 0x0194, 0x01a6, 0x01a6, 0x01b8, 0x01b8, 0x01b8, + 0x01b8, 0x01b8, 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, 0x01cc, + 0x01cc, 0x01cc, 0x01cc, 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, + 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, + 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, 0x01d2, + // Entry 80 - BF + 0x01d2, 0x01d2, 0x01d2, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01f8, + 0x01f8, 0x01f8, 0x0204, 0x0204, 0x0204, 0x0204, 0x020e, 0x0216, + 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, 0x0228, + 0x0228, 0x0228, 0x0228, 0x0228, 0x0238, 0x0249, 0x0269, 0x0289, + }, + }, + {}, // cgg + { // chr + "ᎡᎳᏈᎩᏣᎳᎩᏲᏂᎢ ᏗᎪᏪᎵᎠᎯᏗᎨ ᏓᎶᏂᎨᎤᏦᏍᏗ ᏓᎶᏂᎨᎳᏗᎾᏄᏬᎵᏍᏛᎾ ᎠᏍᏓᏩᏛᏍᏙᏗ", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x0015, + 0x0015, 0x0015, 0x0015, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, + 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, + 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, + 0x0044, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, + 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, + // Entry 40 - 7F + 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, + 0x005d, 0x005d, 0x005d, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + // Entry 80 - BF + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0091, + }, + }, + { // ckb + "عەرەبیئەرمەنیبەنگالیبۆپۆمۆفۆبرەیلسریلیکدەڤەناگەریئەتیۆپیکگورجییۆنانیگوجە" + + "راتیگورموکھیھانگولهیبرێھیراگاناژاپۆنیکاتاکاناخمێریکەنەداکۆریاییلاول" + + "اتینیمالایالاممەنگۆلیمیانمارئۆریاسینھالاتامیلیتیلوگوتانەتایلەندی", + []uint16{ // 152 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x001a, 0x001a, + 0x001a, 0x001a, 0x001a, 0x001a, 0x0028, 0x0028, 0x0038, 0x0038, + 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, + 0x0042, 0x0042, 0x0042, 0x004e, 0x004e, 0x0062, 0x0062, 0x0062, + 0x0062, 0x0062, 0x0062, 0x0062, 0x0072, 0x0072, 0x007c, 0x007c, + 0x007c, 0x007c, 0x0088, 0x0098, 0x00a8, 0x00b4, 0x00b4, 0x00b4, + 0x00b4, 0x00b4, 0x00b4, 0x00be, 0x00ce, 0x00ce, 0x00ce, 0x00ce, + 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00da, 0x00da, 0x00da, 0x00ea, + // Entry 40 - 7F + 0x00ea, 0x00f4, 0x00f4, 0x0100, 0x010e, 0x010e, 0x010e, 0x010e, + 0x0114, 0x0114, 0x0114, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, + 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, 0x0120, + 0x0120, 0x0120, 0x0120, 0x0132, 0x0132, 0x0140, 0x0140, 0x0140, + 0x0140, 0x0140, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, 0x014e, + 0x014e, 0x014e, 0x014e, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, + 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, + 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, 0x0158, + // Entry 80 - BF + 0x0158, 0x0158, 0x0158, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, + 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0166, 0x0172, + 0x0172, 0x0172, 0x017e, 0x017e, 0x017e, 0x017e, 0x0186, 0x0196, + }, + }, + { // cs + csScriptStr, + csScriptIdx, + }, + { // cy + "ArabaiddArmenaiddBengalaiddBopomofoBrailleCyriligDevanagariEthiopigGeorg" + + "aiddGroegaiddGwjarataiddGwrmwciHangulHanHan symledigHan traddodiadol" + + "HebreigHiraganaJapaneaiddCatacanaChmeraiddCanaraiddCoreaiddLaoaiddLl" + + "adinMalayalamaiddMongolaiddMyanmaraiddOgamOrïaiddSinhanaiddTamilaidd" + + "TeluguThaanaTaiTibetaiddSymbolauAnysgrifenedigCyffredinSgript anhysb" + + "ys", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0011, 0x001b, 0x001b, 0x0023, 0x0023, + 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, + 0x002a, 0x002a, 0x002a, 0x0031, 0x0031, 0x003b, 0x003b, 0x003b, + 0x003b, 0x003b, 0x003b, 0x003b, 0x0043, 0x0043, 0x004c, 0x004c, + 0x004c, 0x004c, 0x0055, 0x0060, 0x0067, 0x006d, 0x0070, 0x0070, + 0x007c, 0x008c, 0x008c, 0x0093, 0x009b, 0x009b, 0x009b, 0x009b, + 0x009b, 0x009b, 0x009b, 0x009b, 0x00a5, 0x00a5, 0x00a5, 0x00ad, + // Entry 40 - 7F + 0x00ad, 0x00b6, 0x00b6, 0x00bf, 0x00c7, 0x00c7, 0x00c7, 0x00c7, + 0x00ce, 0x00ce, 0x00ce, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, + 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, + 0x00d4, 0x00d4, 0x00d4, 0x00e1, 0x00e1, 0x00eb, 0x00eb, 0x00eb, + 0x00eb, 0x00eb, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, 0x00f6, + 0x00fa, 0x00fa, 0x00fa, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, + 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, + 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, + // Entry 80 - BF + 0x0102, 0x0102, 0x0102, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, + 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x0115, + 0x0115, 0x0115, 0x011b, 0x011b, 0x011b, 0x011b, 0x0121, 0x0124, + 0x012d, 0x012d, 0x012d, 0x012d, 0x012d, 0x012d, 0x012d, 0x012d, + 0x012d, 0x012d, 0x012d, 0x012d, 0x0135, 0x0143, 0x014c, 0x015b, + }, + }, + { // da + daScriptStr, + daScriptIdx, + }, + {}, // dav + { // de + deScriptStr, + deScriptIdx, + }, + {}, // de-CH + {}, // dje + { // dsb + "arabskiarmeńskibengalskibopomofobraillowe pismokyriliskidevanagarietiopi" + + "skigeorgiskigrichiskigujaratigurmukhihangulhanzjadnorjone hantradici" + + "onalne hanhebrejskihiraganajapańskikatakanakhmerkannadakorejskilaosk" + + "iłatyńskimalayalamskimongolskiburmaskioriyasinghaleskitamilskitelugu" + + "thaanathaiskitibetskisymbolebźez pismapowšyknenjeznate pismo", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x0010, 0x0010, + 0x0010, 0x0010, 0x0010, 0x0010, 0x0019, 0x0019, 0x0021, 0x0021, + 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0030, 0x0030, 0x0030, 0x0039, 0x0039, 0x0043, 0x0043, 0x0043, + 0x0043, 0x0043, 0x0043, 0x0043, 0x004c, 0x004c, 0x0055, 0x0055, + 0x0055, 0x0055, 0x005e, 0x0066, 0x006e, 0x0074, 0x0077, 0x0077, + 0x0086, 0x0097, 0x0097, 0x00a0, 0x00a8, 0x00a8, 0x00a8, 0x00a8, + 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00b1, 0x00b1, 0x00b1, 0x00b9, + // Entry 40 - 7F + 0x00b9, 0x00be, 0x00be, 0x00c5, 0x00cd, 0x00cd, 0x00cd, 0x00cd, + 0x00d3, 0x00d3, 0x00d3, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, + 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, + 0x00dd, 0x00dd, 0x00dd, 0x00e9, 0x00e9, 0x00f2, 0x00f2, 0x00f2, + 0x00f2, 0x00f2, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x00fa, + 0x00fa, 0x00fa, 0x00fa, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, + 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, + 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, + // Entry 80 - BF + 0x00ff, 0x00ff, 0x00ff, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, + 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, 0x0112, + 0x0112, 0x0112, 0x0118, 0x0118, 0x0118, 0x0118, 0x011e, 0x0125, + 0x012d, 0x012d, 0x012d, 0x012d, 0x012d, 0x012d, 0x012d, 0x012d, + 0x012d, 0x012d, 0x012d, 0x012d, 0x0134, 0x013f, 0x0148, 0x0156, + }, + }, + {}, // dua + {}, // dyo + { // dz + "ཨེ་ར་བིཀ་ཡིག་གུཨར་མི་ནི་ཡཱན་ཡིག་གུབངྒ་ལ་ཡིག་གུབོ་པོ་མོ་ཕཱོ་ཡིག་གུའབུར་ཡི" + + "གསིརིལ་ལིཀ་ཡིག་གུདེ་ཝ་ན་ག་རི་ཡིག་གུཨི་ཐི་ཡོ་པིཀ྄་ཡིག་གུཇཽ་ཇི་ཡཱན་ཡ" + + "ིག་གུགྲིཀ་ཡིག་གུགུ་ཇ་ར་ཏི་ཡིག་གུགུ་རུ་མུ་ཁ་ཡིག་གུཧཱན་གུལ་ཡིག་གུརྒྱ" + + "་ནག་ཡིག་གུརྒྱ་ཡིག་ ལུགས་གསར་ལུགས་རྙིང་ རྒྱ་ཡིགཧེ་བྲུ་ཡིག་གུཇ་པཱན་ག" + + "ྱི་ཧི་ར་ག་ན་ཡིག་གུཇ་པཱན་ཡིག་གུཇ་པཱན་གྱི་ཀ་ཏ་ཀ་ན་ཡིག་གུཁེ་མེར་ཡིག་ག" + + "ུཀ་ན་ཌ་ཡིག་གུཀོ་རི་ཡཱན་ཡིག་གུལའོ་ཡིག་གུལེ་ཊིན་ཡིག་གུམ་ལ་ཡ་ལམ་ཡིག་ག" + + "ུསོག་པོའི་ཡིག་གུབར་མིས་ཡིག་གུཨོ་རི་ཡ་ཡིག་གུསིན་ཧ་ལ་རིག་གུཏ་མིལ་ཡིག" + + "་གུཏེ་ལུ་གུ་ཡིག་གུཐཱ་ན་ཡིག་གུཐཱའི་ཡིག་གུང་བཅས་ཀྱི་ཡིག་གུམཚན་རྟགསཡི" + + "ག་ཐོག་མ་བཀོདཔསྤྱིཡིགངོ་མ་ཤེས་པའི་ཡི་གུ", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x002d, 0x002d, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x008a, 0x008a, 0x00c3, 0x00c3, + 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, 0x00db, + 0x00db, 0x00db, 0x00db, 0x010b, 0x010b, 0x0141, 0x0141, 0x0141, + 0x0141, 0x0141, 0x0141, 0x0141, 0x017d, 0x017d, 0x01ad, 0x01ad, + 0x01ad, 0x01ad, 0x01ce, 0x01fe, 0x0231, 0x025b, 0x0282, 0x0282, + 0x02b6, 0x02ea, 0x02ea, 0x0311, 0x035c, 0x035c, 0x035c, 0x035c, + 0x035c, 0x035c, 0x035c, 0x035c, 0x0380, 0x0380, 0x0380, 0x03c8, + // Entry 40 - 7F + 0x03c8, 0x03ef, 0x03ef, 0x0413, 0x0443, 0x0443, 0x0443, 0x0443, + 0x0461, 0x0461, 0x0461, 0x0488, 0x0488, 0x0488, 0x0488, 0x0488, + 0x0488, 0x0488, 0x0488, 0x0488, 0x0488, 0x0488, 0x0488, 0x0488, + 0x0488, 0x0488, 0x0488, 0x04b5, 0x04b5, 0x04e2, 0x04e2, 0x04e2, + 0x04e2, 0x04e2, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, 0x0509, + 0x0509, 0x0509, 0x0509, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, + 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, + 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, 0x0533, + // Entry 80 - BF + 0x0533, 0x0533, 0x0533, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, + 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x055d, 0x0581, + 0x0581, 0x0581, 0x05ae, 0x05ae, 0x05ae, 0x05ae, 0x05cf, 0x05f0, + 0x0620, 0x0620, 0x0620, 0x0620, 0x0620, 0x0620, 0x0620, 0x0620, + 0x0620, 0x0620, 0x0620, 0x0620, 0x0638, 0x0665, 0x067a, 0x06b0, + }, + }, + {}, // ebu + { // ee + "Arabiagbeŋɔŋlɔarmeniagbeŋɔŋlɔbengaligbeŋɔŋlɔbopomfogbeŋɔŋlɔbraillegbeŋɔŋ" + + "lɔCyrillicgbeŋɔŋlɔdevanagarigbeŋɔŋlɔethiopiagbeŋɔŋlɔgɔgiagbeŋɔŋlɔgri" + + "sigbeŋɔŋlɔgudzaratigbeŋɔŋlɔgurmukhigbeŋɔŋlɔhangulgbeŋɔŋlɔhangbeŋɔŋlɔ" + + "HansgbeŋɔŋlɔBlema HantgbeŋcŋlɔhebrigbeŋɔŋlɔhiraganagbeŋɔŋlɔJapaneseg" + + "beŋɔŋlɔkatakanagbeŋɔŋlɔkhmergbeŋɔŋlɔkannadagbeŋɔŋlɔKoreagbeŋɔŋlɔlaog" + + "beŋɔŋlɔLatingbeŋɔŋlɔmalayagbeŋɔŋlɔmongoliagbeŋɔŋlɔmyanmargbeŋɔŋlɔori" + + "yagbeŋɔŋlɔsinhalagbeŋɔŋlɔtamilgbeŋɔŋlɔtelegugbeŋɔŋlɔthaanagbeŋɔŋlɔta" + + "igbeŋɔŋlɔtibetgbeŋɔŋlɔŋɔŋlɔdzesiwogbemaŋlɔgbeŋɔŋlɔ bɔbɔgbeŋɔŋlɔ many" + + "a", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x0012, 0x0025, 0x0025, + 0x0025, 0x0025, 0x0025, 0x0025, 0x0038, 0x0038, 0x004b, 0x004b, + 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, + 0x005e, 0x005e, 0x005e, 0x0072, 0x0072, 0x0088, 0x0088, 0x0088, + 0x0088, 0x0088, 0x0088, 0x0088, 0x009c, 0x009c, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00bf, 0x00d4, 0x00e8, 0x00fa, 0x0109, 0x0109, + 0x0119, 0x012e, 0x012e, 0x013f, 0x0153, 0x0153, 0x0153, 0x0153, + 0x0153, 0x0153, 0x0153, 0x0153, 0x0167, 0x0167, 0x0167, 0x017b, + // Entry 40 - 7F + 0x017b, 0x018c, 0x018c, 0x019f, 0x01b0, 0x01b0, 0x01b0, 0x01b0, + 0x01bf, 0x01bf, 0x01bf, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, + 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, + 0x01d0, 0x01d0, 0x01d0, 0x01e2, 0x01e2, 0x01f6, 0x01f6, 0x01f6, + 0x01f6, 0x01f6, 0x0209, 0x0209, 0x0209, 0x0209, 0x0209, 0x0209, + 0x0209, 0x0209, 0x0209, 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, + 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, + 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, 0x021a, + // Entry 80 - BF + 0x021a, 0x021a, 0x021a, 0x022d, 0x022d, 0x022d, 0x022d, 0x022d, + 0x022d, 0x022d, 0x022d, 0x022d, 0x022d, 0x022d, 0x022d, 0x023e, + 0x023e, 0x023e, 0x0250, 0x0250, 0x0250, 0x0250, 0x0262, 0x0271, + 0x0282, 0x0282, 0x0282, 0x0282, 0x0282, 0x0282, 0x0282, 0x0282, + 0x0282, 0x0282, 0x0282, 0x0282, 0x0292, 0x029c, 0x02af, 0x02c1, + }, + }, + { // el + elScriptStr, + elScriptIdx, + }, + { // en + enScriptStr, + enScriptIdx, + }, + {}, // en-AU + { // en-GB + enGBScriptStr, + enGBScriptIdx, + }, + {}, // eo + { // es + esScriptStr, + esScriptIdx, + }, + { // es-419 + es419ScriptStr, + es419ScriptIdx, + }, + {}, // es-CL + { // es-MX + "telugú", + []uint16{ // 147 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 80 - BF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0007, + }, + }, + { // et + etScriptStr, + etScriptIdx, + }, + { // eu + "arabiarraarmeniarrabengaliarrabopomofoabrailleazirilikoadevanagariaetiop" + + "iarrageorgiarragreziarragujarateragurmukhiahangulaidazkera txinatarr" + + "aidazkera txinatar sinplifikatuaidazkera txinatar tradizionalahebree" + + "rahiraganajaponiarrakatakanakhemerarrakanadarrakorearralaosarralatin" + + "amalayalameramongoliarrabirmaniarraoriyarrasinhalatamilarrateluguarr" + + "athaanathailandiarratibetarraikurrakidatzi gabeaohikoaidazkera ezeza" + + "guna", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0009, 0x0013, 0x0013, + 0x0013, 0x0013, 0x0013, 0x0013, 0x001e, 0x001e, 0x0027, 0x0027, + 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, + 0x002f, 0x002f, 0x002f, 0x0038, 0x0038, 0x0043, 0x0043, 0x0043, + 0x0043, 0x0043, 0x0043, 0x0043, 0x004d, 0x004d, 0x0057, 0x0057, + 0x0057, 0x0057, 0x0060, 0x006a, 0x0073, 0x007a, 0x008d, 0x008d, + 0x00ac, 0x00ca, 0x00ca, 0x00d2, 0x00da, 0x00da, 0x00da, 0x00da, + 0x00da, 0x00da, 0x00da, 0x00da, 0x00e4, 0x00e4, 0x00e4, 0x00ec, + // Entry 40 - 7F + 0x00ec, 0x00f6, 0x00f6, 0x00ff, 0x0107, 0x0107, 0x0107, 0x0107, + 0x010f, 0x010f, 0x010f, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, + 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, 0x0115, + 0x0115, 0x0115, 0x0115, 0x0121, 0x0121, 0x012c, 0x012c, 0x012c, + 0x012c, 0x012c, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, 0x0137, + 0x0137, 0x0137, 0x0137, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, + 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, + 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, 0x013f, + // Entry 80 - BF + 0x013f, 0x013f, 0x013f, 0x0146, 0x0146, 0x0146, 0x0146, 0x0146, + 0x0146, 0x0146, 0x0146, 0x0146, 0x0146, 0x0146, 0x0146, 0x014f, + 0x014f, 0x014f, 0x0159, 0x0159, 0x0159, 0x0159, 0x015f, 0x016c, + 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, 0x0175, + 0x0175, 0x0175, 0x0175, 0x0175, 0x017c, 0x0188, 0x018e, 0x01a0, + }, + }, + {}, // ewo + { // fa + faScriptStr, + faScriptIdx, + }, + { // fa-AF + "مغلی", + []uint16{ // 94 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, + }, + }, + {}, // ff + { // fi + fiScriptStr, + fiScriptIdx, + }, + { // fil + filScriptStr, + filScriptIdx, + }, + { // fo + "arabiskarmensktbengalibopomofoblindaskriftkyrillisktdevanagarietiopisktg" + + "eorgiansktgriksktgujaratigurmukhihangulhaneinkult hanvanligt hanhebr" + + "aiskthiraganajapansktkatakanakhmerkannadakoreansktlaolatínsktmalayal" + + "ammongolskmyanmarsktoriyasinhalatamilsktteluguthaanatailendskttibets" + + "kttekinóskrivavanligókend skrift", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x0016, 0x0016, 0x001e, 0x001e, + 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, + 0x002a, 0x002a, 0x002a, 0x0034, 0x0034, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x003e, 0x0047, 0x0047, 0x0052, 0x0052, + 0x0052, 0x0052, 0x0059, 0x0061, 0x0069, 0x006f, 0x0072, 0x0072, + 0x007d, 0x0088, 0x0088, 0x0091, 0x0099, 0x0099, 0x0099, 0x0099, + 0x0099, 0x0099, 0x0099, 0x0099, 0x00a1, 0x00a1, 0x00a1, 0x00a9, + // Entry 40 - 7F + 0x00a9, 0x00ae, 0x00ae, 0x00b5, 0x00be, 0x00be, 0x00be, 0x00be, + 0x00c1, 0x00c1, 0x00c1, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, + 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, 0x00ca, + 0x00ca, 0x00ca, 0x00ca, 0x00d3, 0x00d3, 0x00db, 0x00db, 0x00db, + 0x00db, 0x00db, 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00e5, + 0x00e5, 0x00e5, 0x00e5, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, + 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, + 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, 0x00ea, + // Entry 80 - BF + 0x00ea, 0x00ea, 0x00ea, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, + 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f9, + 0x00f9, 0x00f9, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x0105, 0x010f, + 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, + 0x0117, 0x0117, 0x0117, 0x0117, 0x011c, 0x0124, 0x012a, 0x0137, + }, + }, + { // fr + frScriptStr, + frScriptIdx, + }, + { // fr-CA + frCAScriptStr, + frCAScriptIdx, + }, + {}, // fr-CH + { // fur + "araparmenbalinêsbengalêsBraillebuginêsSilabari unificât aborigjens canad" + + "êscoptcipriotciriliccirilic dal vieri slavonic de glesiedevanagarid" + + "emotic egjizianjeratic egjizianjeroglifics egjiziansetiopicgeorgjian" + + "glagoliticgoticgrêcgujaratihanHan semplificâtHan tradizionâlebreukat" + + "akana o hiraganavieri ongjarêsvieri italicgjavanêsgjaponêskhmerkanna" + + "dacoreanlaolatin Frakturlatin gaeliclatinlineâr Alineâr Bjeroglifics" + + " Mayamalayalammongulmyanmaroriyarunicsinhalasiriacsiriac Estrangelos" + + "iriac ocidentâlsiriac orientâltamiltelegutagalogthaanathaitibetanuga" + + "riticvieri persiancuneiform sumeric-acadiccodiç pes lenghis no scrit" + + "iscomuncodiç par scrituris no codificadis", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0004, 0x0009, 0x0009, + 0x0011, 0x0011, 0x0011, 0x0011, 0x001a, 0x001a, 0x001a, 0x001a, + 0x0021, 0x0029, 0x0029, 0x0029, 0x004f, 0x004f, 0x004f, 0x004f, + 0x004f, 0x0053, 0x005a, 0x0061, 0x0085, 0x008f, 0x008f, 0x008f, + 0x009f, 0x00af, 0x00c4, 0x00c4, 0x00cb, 0x00cb, 0x00d4, 0x00de, + 0x00e3, 0x00e3, 0x00e8, 0x00f0, 0x00f0, 0x00f0, 0x00f3, 0x00f3, + 0x0103, 0x0113, 0x0113, 0x0118, 0x0118, 0x0118, 0x0118, 0x012b, + 0x013a, 0x013a, 0x0146, 0x014f, 0x0158, 0x0158, 0x0158, 0x0158, + // Entry 40 - 7F + 0x0158, 0x015d, 0x015d, 0x0164, 0x016a, 0x016a, 0x016a, 0x016a, + 0x016d, 0x017a, 0x0186, 0x018b, 0x018b, 0x018b, 0x0194, 0x019d, + 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x019d, 0x01ad, + 0x01ad, 0x01ad, 0x01ad, 0x01b6, 0x01b6, 0x01bc, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01c3, 0x01c3, 0x01c3, 0x01c3, 0x01c3, 0x01c3, + 0x01c3, 0x01c3, 0x01c3, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, + 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, 0x01c8, + 0x01c8, 0x01cd, 0x01cd, 0x01cd, 0x01cd, 0x01cd, 0x01cd, 0x01cd, + // Entry 80 - BF + 0x01cd, 0x01cd, 0x01cd, 0x01d4, 0x01d4, 0x01d4, 0x01d4, 0x01da, + 0x01eb, 0x01fc, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x0211, + 0x0211, 0x0211, 0x0217, 0x0217, 0x0217, 0x021e, 0x0224, 0x0228, + 0x022f, 0x022f, 0x0237, 0x0237, 0x0237, 0x0237, 0x0237, 0x0244, + 0x025c, 0x025c, 0x025c, 0x025c, 0x025c, 0x0279, 0x027e, 0x02a1, + }, + }, + { // fy + "DefakaArabyskKeizerlijk ArameesArmeensAvestaanskBalineeskBamounBassa Vah" + + "BatakBengaleesBlissymbolenBopomofoBrahmiBrailleBugineeskBuhidChakmaV" + + "erenigde Canadese Aboriginal-symbolenKaryskChamCherokeeCirthKoptyskS" + + "ypryskSyrillyskAldkerkslavysk SyrillyskDevanagariDeseretDuployan sne" + + "lschriftEgyptysk demotyskEgyptysk hiëratyskEgyptyske hiërogliefenEth" + + "iopyskGeorgysk KhutsuriGeorgyskGlagolityskGothyskGranthaGrieksGujara" + + "tiGurmukhiHangulHanHanunooFerienfâldigd SineeskTraditjoneel SineeskH" + + "ebreeuwskHiraganaAnatolyske hiërogliefenPahawh HmongKatakana of Hira" + + "ganaAldhongaarsIndusAld-italyskJavaanskJapansJurchenKayah LiKatakana" + + "KharoshthiKhmerKhojkiKannadaKoreaanskKpelleKaithiLannaLaoGotysk Laty" + + "nGaelysk LatynLatynLepchaLimbuLineair ALineair BFraserLomaLycyskLydy" + + "skMandaeansManicheaanskMayahiërogliefenMendeMeroitysk cursiefMeroïty" + + "skMalayalamMongoolsMoonMroMeiteiMyanmarAld Noard-ArabyskNabateaanskN" + + "axi GebaN’KoNüshuOghamOl ChikiOrkhonOdiaOsmanyaPalmyreensAldpermyskP" + + "hags-paInscriptioneel PahlaviPsalmen PahlaviBoek PahlaviFoenicyskPol" + + "lard-fonetyskInscriptioneel ParthyskRejangRongorongoRunicSamaritaans" + + "kSaratiAld Sûd-ArabyskSaurashtraSignWritingShavianSharadaSindhiSinha" + + "laSora SompengSoendaneeskSyloti NagriSyriacEstrangelo ArameeskWest-A" + + "rameeskEast-ArameeskTagbanwaTakriTai LeNij Tai LueTamilTangutTai Vie" + + "tTeluguTengwarTifinaghTagalogThaanaThaisTibetaanskTirhutaUgarityskVa" + + "iSichtbere spraakVarang KshitiWoleaiAldperzyskSumero-Akkadian Cuneif" + + "ormYiOergeërfdWiskundige notatieSymbolenOngeschrevenAlgemeenOnbekend" + + " schriftsysteem", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0006, 0x0006, 0x0006, 0x000d, 0x001f, 0x0026, 0x0030, + 0x0039, 0x003f, 0x0048, 0x004d, 0x0056, 0x0062, 0x006a, 0x0070, + 0x0077, 0x0080, 0x0085, 0x008b, 0x00b1, 0x00b7, 0x00bb, 0x00c3, + 0x00c8, 0x00cf, 0x00d6, 0x00df, 0x00f7, 0x0101, 0x0108, 0x011c, + 0x012d, 0x0140, 0x0157, 0x0157, 0x0160, 0x0171, 0x0179, 0x0184, + 0x018b, 0x0192, 0x0198, 0x01a0, 0x01a8, 0x01ae, 0x01b1, 0x01b8, + 0x01ce, 0x01e2, 0x01e2, 0x01ec, 0x01f4, 0x020c, 0x0218, 0x022c, + 0x0237, 0x023c, 0x0247, 0x024f, 0x0255, 0x025c, 0x0264, 0x026c, + // Entry 40 - 7F + 0x0276, 0x027b, 0x0281, 0x0288, 0x0291, 0x0297, 0x029d, 0x02a2, + 0x02a5, 0x02b1, 0x02be, 0x02c3, 0x02c9, 0x02ce, 0x02d7, 0x02e0, + 0x02e6, 0x02ea, 0x02f0, 0x02f6, 0x02f6, 0x02ff, 0x030b, 0x031c, + 0x0321, 0x0332, 0x033c, 0x0345, 0x0345, 0x034d, 0x0351, 0x0354, + 0x035a, 0x035a, 0x0361, 0x0372, 0x037d, 0x0386, 0x038c, 0x0392, + 0x0397, 0x039f, 0x03a5, 0x03a9, 0x03b0, 0x03ba, 0x03ba, 0x03c4, + 0x03cc, 0x03e2, 0x03f1, 0x03fd, 0x0406, 0x0416, 0x042d, 0x0433, + 0x043d, 0x0442, 0x044e, 0x0454, 0x0464, 0x046e, 0x0479, 0x0480, + // Entry 80 - BF + 0x0487, 0x0487, 0x048d, 0x0494, 0x04a0, 0x04ab, 0x04b7, 0x04bd, + 0x04d0, 0x04dd, 0x04ea, 0x04f2, 0x04f7, 0x04fd, 0x0508, 0x050d, + 0x0513, 0x051b, 0x0521, 0x0528, 0x0530, 0x0537, 0x053d, 0x0542, + 0x054c, 0x0553, 0x055c, 0x055f, 0x056f, 0x057c, 0x0582, 0x058c, + 0x05a5, 0x05a7, 0x05b1, 0x05c3, 0x05cb, 0x05d7, 0x05df, 0x05f6, + }, + }, + { // ga + "ArabachAirméanachAivéisteachBailíochBatacachBeangálachBopomofoBrailleBui" + + "gineachButhaideachSeiricíochCoptachCipireachCoireallachDéiveanágrach" + + "Éigipteach coiteannÉigipteach cliarúilIairiglifí ÉigipteachaAetópac" + + "hSeoirseachGlagalachGotachGréagachGúisearátachGurmúcachHangalachHanH" + + "an SimplitheHan TraidisiúntaEabhrachHireagánachIairiglifí Anatólacha" + + "Siollabraí SeapánachaSean-UngárachSean-IodáilicIávachSeapánachCatacá" + + "nachCiméarachCannadachCóiréachLaosachCló GaelachLaidineachLiombúchLí" + + "neach ALíneach BFraserLiciachLidiachMahasánachMainicéasachIairiglifí" + + " MáigheachaMeindeachMailéalamachMongólachMaenmarachOghamOiríseachSea" + + "n-PheirmeachFéiníceachRúnachSamárachShawachSiolónachSiriceachTamalac" + + "hTeileagúchTifinaghTagálagachTánachTéalannachTibéadachSean-Pheirseac" + + "hDingchruthach Suiméar-AcádachNodaireacht MhatamaiticiúilSiombailíGa" + + "n ScríobhCoitiantaScript Anaithnid", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x0012, 0x001e, + 0x0027, 0x0027, 0x0027, 0x002f, 0x003a, 0x003a, 0x0042, 0x0042, + 0x0049, 0x0053, 0x005e, 0x005e, 0x005e, 0x005e, 0x005e, 0x0069, + 0x0069, 0x0070, 0x0079, 0x0084, 0x0084, 0x0093, 0x0093, 0x0093, + 0x00a7, 0x00bc, 0x00d4, 0x00d4, 0x00dd, 0x00dd, 0x00e7, 0x00f0, + 0x00f6, 0x00f6, 0x00ff, 0x010d, 0x0117, 0x0120, 0x0123, 0x0123, + 0x0130, 0x0141, 0x0141, 0x0149, 0x0155, 0x016c, 0x016c, 0x0183, + 0x0191, 0x0191, 0x019f, 0x01a6, 0x01b0, 0x01b0, 0x01b0, 0x01bb, + // Entry 40 - 7F + 0x01bb, 0x01c5, 0x01c5, 0x01ce, 0x01d8, 0x01d8, 0x01d8, 0x01d8, + 0x01df, 0x01df, 0x01eb, 0x01f5, 0x01f5, 0x01fe, 0x0208, 0x0212, + 0x0218, 0x0218, 0x021f, 0x0226, 0x0231, 0x0231, 0x023e, 0x0255, + 0x025e, 0x025e, 0x025e, 0x026b, 0x026b, 0x0275, 0x0275, 0x0275, + 0x0275, 0x0275, 0x027f, 0x027f, 0x027f, 0x027f, 0x027f, 0x027f, + 0x0284, 0x0284, 0x0284, 0x028e, 0x028e, 0x028e, 0x028e, 0x029d, + 0x029d, 0x029d, 0x029d, 0x029d, 0x02a9, 0x02a9, 0x02a9, 0x02a9, + 0x02a9, 0x02b0, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02b9, 0x02c0, + // Entry 80 - BF + 0x02c0, 0x02c0, 0x02c0, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02d3, + 0x02d3, 0x02d3, 0x02d3, 0x02d3, 0x02d3, 0x02d3, 0x02d3, 0x02db, + 0x02db, 0x02db, 0x02e6, 0x02e6, 0x02ee, 0x02f9, 0x0300, 0x030b, + 0x0315, 0x0315, 0x0315, 0x0315, 0x0315, 0x0315, 0x0315, 0x0324, + 0x0343, 0x0343, 0x0343, 0x035f, 0x0369, 0x0375, 0x037e, 0x038e, + }, + }, + { // gd + "AfakaAlbàinis ChabhcasachAhomArabaisAramais impireilAirmeinisAvestanaisB" + + "aliBamumBassa VahBatakBeangailisComharran BlissBopomofoBrahmiBraille" + + "BuhidChakmaSgrìobhadh Lideach Aonaichte nan Tùsanach CanadachChamChe" + + "rokeeCirthCoptaisCìoprasaisCirilisCirilis Seann-Slàbhais na h-Eaglai" + + "seDevanagariDeseretSealbh-sgrìobhadh ÈipheiteachGe’ezCairtbheilisGot" + + "aisGranthaGreugaisGujaratiGurmukhiHangulHanHanunooHan simplichteHan " + + "tradaiseantaEabhraHiraganaDealbh-sgrìobhadh AnatolachPahawh HmongKat" + + "akana no HiraganaSeann-UngaraisSeann-EadailtisDeàbhanaisSeapanaisJur" + + "chenKayah LiKatakanaKharoshthiCmèarKhojkiKannadaCoirèanaisKpelleKait" + + "hiLannaLàthoLaideann frakturLaideann GhàidhealachLaideannLepchaLimbu" + + "Linear ALinear BLomaMahajaniDealbh-sgrìobhadh MayachMendeMalayalamMo" + + "diMongolaisMroMeitei MayekMultaniMiànmarSeann-Arabach ThuathachNaxi " + + "GebaN’koNüshuOgham-chraobhOl ChikiOrkhonOriyaOsmanyaPau Cin HauPhags" + + "-paPartais snaidh-sgrìobhteRejangRongorongoRùn-sgrìobhadhSaratiSeann" + + "-Arabais DheasachSaurashtraSharadaSiddhamKhudawadiSinhalaSora Sompen" + + "gSundaSyloti NagriSuraidheacSuraidheac SiarachSuraidheac EarachTagba" + + "nwaTakriTai LeTai Lue ÙrTaimilTangutTai VietTeluguTengwarTifinaghTag" + + "alogThaanaTàidhTibeitisTirhutaVaiVarang KshitiWoleaiSeann-PheirsisYi" + + "Gnìomhairean matamataigSamhlaidheanGun sgrìobhadhCoitcheannLitreadh " + + "neo-aithnichte", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0005, 0x001a, 0x001e, 0x0025, 0x0035, 0x003e, 0x0048, + 0x004c, 0x0051, 0x005a, 0x005f, 0x0069, 0x0078, 0x0080, 0x0086, + 0x008d, 0x008d, 0x0092, 0x0098, 0x00cc, 0x00cc, 0x00d0, 0x00d8, + 0x00dd, 0x00e4, 0x00ef, 0x00f6, 0x011b, 0x0125, 0x012c, 0x012c, + 0x012c, 0x012c, 0x014b, 0x014b, 0x0152, 0x0152, 0x015e, 0x015e, + 0x0164, 0x016b, 0x0173, 0x017b, 0x0183, 0x0189, 0x018c, 0x0193, + 0x01a1, 0x01b1, 0x01b1, 0x01b7, 0x01bf, 0x01db, 0x01e7, 0x01fb, + 0x0209, 0x0209, 0x0218, 0x0223, 0x022c, 0x0233, 0x023b, 0x0243, + // Entry 40 - 7F + 0x024d, 0x0253, 0x0259, 0x0260, 0x026b, 0x0271, 0x0277, 0x027c, + 0x0282, 0x0292, 0x02a8, 0x02b0, 0x02b6, 0x02bb, 0x02c3, 0x02cb, + 0x02cb, 0x02cf, 0x02cf, 0x02cf, 0x02d7, 0x02d7, 0x02d7, 0x02f0, + 0x02f5, 0x02f5, 0x02f5, 0x02fe, 0x0302, 0x030b, 0x030b, 0x030e, + 0x031a, 0x0321, 0x0329, 0x0340, 0x0340, 0x0349, 0x034f, 0x0355, + 0x0362, 0x036a, 0x0370, 0x0375, 0x037c, 0x037c, 0x0387, 0x0387, + 0x038f, 0x038f, 0x038f, 0x038f, 0x038f, 0x038f, 0x03a8, 0x03ae, + 0x03b8, 0x03c8, 0x03c8, 0x03ce, 0x03e4, 0x03ee, 0x03ee, 0x03ee, + // Entry 80 - BF + 0x03f5, 0x03fc, 0x0405, 0x040c, 0x0418, 0x041d, 0x0429, 0x0433, + 0x0433, 0x0445, 0x0456, 0x045e, 0x0463, 0x0469, 0x0474, 0x047a, + 0x0480, 0x0488, 0x048e, 0x0495, 0x049d, 0x04a4, 0x04aa, 0x04b0, + 0x04b8, 0x04bf, 0x04bf, 0x04c2, 0x04c2, 0x04cf, 0x04d5, 0x04e3, + 0x04e3, 0x04e5, 0x04e5, 0x04fd, 0x0509, 0x0518, 0x0522, 0x0539, + }, + }, + { // gl + "ÁrabeArmenioBengalíBopomofoBrailleSilabario aborixe canadiano unificadoC" + + "irílicoDevanagariEtíopeXeorxianoGregoguxaratíGurmukhiHangulHanHan si" + + "mplificadoHan tradicionalHebreoHiraganaXaponésKatakanaCamboxanocanar" + + "ésCoreanoLaosianoLatinoMalabarMongolBirmaniaOriyaCingalésTámilTelug" + + "úThaanaTailandésTibetanoSímbolosNon escritaComúnEscritura descoñeci" + + "da", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x0015, 0x0015, 0x001d, 0x001d, + 0x0024, 0x0024, 0x0024, 0x0024, 0x0049, 0x0049, 0x0049, 0x0049, + 0x0049, 0x0049, 0x0049, 0x0052, 0x0052, 0x005c, 0x005c, 0x005c, + 0x005c, 0x005c, 0x005c, 0x005c, 0x0063, 0x0063, 0x006c, 0x006c, + 0x006c, 0x006c, 0x0071, 0x007a, 0x0082, 0x0088, 0x008b, 0x008b, + 0x009b, 0x00aa, 0x00aa, 0x00b0, 0x00b8, 0x00b8, 0x00b8, 0x00b8, + 0x00b8, 0x00b8, 0x00b8, 0x00b8, 0x00c0, 0x00c0, 0x00c0, 0x00c8, + // Entry 40 - 7F + 0x00c8, 0x00d1, 0x00d1, 0x00d9, 0x00e0, 0x00e0, 0x00e0, 0x00e0, + 0x00e8, 0x00e8, 0x00e8, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, + 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00ee, + 0x00ee, 0x00ee, 0x00ee, 0x00f5, 0x00f5, 0x00fb, 0x00fb, 0x00fb, + 0x00fb, 0x00fb, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, + 0x0103, 0x0103, 0x0103, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, + 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, + 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, 0x0108, + // Entry 80 - BF + 0x0108, 0x0108, 0x0108, 0x0111, 0x0111, 0x0111, 0x0111, 0x0111, + 0x0111, 0x0111, 0x0111, 0x0111, 0x0111, 0x0111, 0x0111, 0x0117, + 0x0117, 0x0117, 0x011e, 0x011e, 0x011e, 0x011e, 0x0124, 0x012e, + 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, 0x0136, + 0x0136, 0x0136, 0x0136, 0x0136, 0x013f, 0x014a, 0x0150, 0x0166, + }, + }, + { // gsw + "ArabischArmiArmenischAveschtischBalinesischBattakischBengalischBliss-Sym" + + "boolBopomofoBrahmiBlindäschriftBuginesischBuhidUCASKarischChamCherok" + + "eeCirthKoptischZypriotischKyrillischAltchileslawischTövanagaariTeser" + + "etTemozisch-ÄgüptischHiraazisch-ÄgüptischÄgüptischi HiroglüüfeÄzioop" + + "ischGhutsuriGeorgischGlagolitischGotischGriechischGuscharatiGurmukhi" + + "HangulChineesischHanunooVeräifachti Chineesischi SchriftTradizionell" + + "i Chineesischi SchriftHebräischHiraganaPahawh HmongKatakana oder Hir" + + "aganaAltungarischIndus-SchriftAltitalischJavanesischJapanischKayah L" + + "iKatakanaKharoshthiKhmerKannadaKoreanischLannaLaotischLatiinisch - F" + + "raktur-VarianteLatiinisch - Gäälischi VarianteLatiinischLepchaLimbuL" + + "inear ALinear BLykischLydischMandäischManichäischMaya-HieroglyphäMer" + + "oitischMalaysischMongolischMoonMeitei MayekBurmesischN’KoOghamOl Chi" + + "kiOrchon-RunäOriyaOsmanischAltpermischPhags-paPahlaviPhönizischPolla" + + "rd PhonetischRejangRongorongoRunäschriftSamaritanischSaratiSaurashtr" + + "aGebäärdeschpraachShaw-AlphabetSinghalesischSundanesischSyloti Nagri" + + "SyrischSyrisch - Eschtrangelo-VarianteWeschtsyrischOschtsyrischTagba" + + "nwaTai LeTai LueTamilischTeluguTengwarTifinaghTagalogThaanaThaiTibee" + + "tischUgaritischVaiSichtbari SchpraachAltpersischSumerisch-akkadischi" + + " KeilschriftYiG’eerbtä SchriftwärtSchriftlosi SchpraachUnbeschtimmtU" + + "ncodiirti Schrift", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x000c, 0x0015, 0x0020, + 0x002b, 0x002b, 0x002b, 0x0035, 0x003f, 0x004c, 0x0054, 0x005a, + 0x0068, 0x0073, 0x0078, 0x0078, 0x007c, 0x0083, 0x0087, 0x008f, + 0x0094, 0x009c, 0x00a7, 0x00b1, 0x00c1, 0x00cd, 0x00d4, 0x00d4, + 0x00e9, 0x00ff, 0x0118, 0x0118, 0x0123, 0x012b, 0x0134, 0x0140, + 0x0147, 0x0147, 0x0151, 0x015b, 0x0163, 0x0169, 0x0174, 0x017b, + 0x019c, 0x01be, 0x01be, 0x01c8, 0x01d0, 0x01d0, 0x01dc, 0x01f2, + 0x01fe, 0x020b, 0x0216, 0x0221, 0x022a, 0x022a, 0x0232, 0x023a, + // Entry 40 - 7F + 0x0244, 0x0249, 0x0249, 0x0250, 0x025a, 0x025a, 0x025a, 0x025f, + 0x0267, 0x0284, 0x02a5, 0x02af, 0x02b5, 0x02ba, 0x02c2, 0x02ca, + 0x02ca, 0x02ca, 0x02d1, 0x02d8, 0x02d8, 0x02e2, 0x02ee, 0x02ff, + 0x02ff, 0x02ff, 0x0309, 0x0313, 0x0313, 0x031d, 0x0321, 0x0321, + 0x032d, 0x032d, 0x0337, 0x0337, 0x0337, 0x0337, 0x033d, 0x033d, + 0x0342, 0x034a, 0x0356, 0x035b, 0x0364, 0x0364, 0x0364, 0x036f, + 0x0377, 0x0377, 0x0377, 0x037e, 0x0389, 0x039b, 0x039b, 0x03a1, + 0x03ab, 0x03b7, 0x03c4, 0x03ca, 0x03ca, 0x03d4, 0x03e7, 0x03f4, + // Entry 80 - BF + 0x03f4, 0x03f4, 0x03f4, 0x0401, 0x0401, 0x040d, 0x0419, 0x0420, + 0x043f, 0x044c, 0x0458, 0x0460, 0x0460, 0x0466, 0x046d, 0x0476, + 0x0476, 0x0476, 0x047c, 0x0483, 0x048b, 0x0492, 0x0498, 0x049c, + 0x04a6, 0x04a6, 0x04b0, 0x04b3, 0x04c6, 0x04c6, 0x04c6, 0x04d1, + 0x04f1, 0x04f3, 0x050b, 0x050b, 0x050b, 0x0520, 0x052c, 0x053e, + }, + }, + { // gu + guScriptStr, + guScriptIdx, + }, + {}, // guz + {}, // gv + {}, // ha + {}, // haw + { // he + heScriptStr, + heScriptIdx, + }, + { // hi + hiScriptStr, + hiScriptIdx, + }, + { // hr + hrScriptStr, + hrScriptIdx, + }, + { // hsb + "arabscearmenscebengalscebopomofoBraillowe pismokyriliscedevanagarietiopi" + + "scegeorgiscegrjekscegujaratigurmukhihangulchinscezjednorjene chinske" + + " pismotradicionalne chinske pismohebrejscehiraganajapanscekatakanakh" + + "merscekannadscekorejscelaoscełaćonscemalayalamscemongolsceburmasceor" + + "iyasinghalscetamilsceteluguthaanathailandscetibetscesymbolebjez pism" + + "apowšitkownenjeznate pismo", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x0018, 0x0018, 0x0020, 0x0020, + 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, + 0x002f, 0x002f, 0x002f, 0x0038, 0x0038, 0x0042, 0x0042, 0x0042, + 0x0042, 0x0042, 0x0042, 0x0042, 0x004b, 0x004b, 0x0054, 0x0054, + 0x0054, 0x0054, 0x005c, 0x0064, 0x006c, 0x0072, 0x0079, 0x0079, + 0x0092, 0x00ad, 0x00ad, 0x00b6, 0x00be, 0x00be, 0x00be, 0x00be, + 0x00be, 0x00be, 0x00be, 0x00be, 0x00c6, 0x00c6, 0x00c6, 0x00ce, + // Entry 40 - 7F + 0x00ce, 0x00d6, 0x00d6, 0x00df, 0x00e7, 0x00e7, 0x00e7, 0x00e7, + 0x00ed, 0x00ed, 0x00ed, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, + 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, + 0x00f7, 0x00f7, 0x00f7, 0x0103, 0x0103, 0x010c, 0x010c, 0x010c, + 0x010c, 0x010c, 0x0114, 0x0114, 0x0114, 0x0114, 0x0114, 0x0114, + 0x0114, 0x0114, 0x0114, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, 0x0119, + // Entry 80 - BF + 0x0119, 0x0119, 0x0119, 0x0123, 0x0123, 0x0123, 0x0123, 0x0123, + 0x0123, 0x0123, 0x0123, 0x0123, 0x0123, 0x0123, 0x0123, 0x012b, + 0x012b, 0x012b, 0x0131, 0x0131, 0x0131, 0x0131, 0x0137, 0x0142, + 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, 0x014a, + 0x014a, 0x014a, 0x014a, 0x014a, 0x0151, 0x015b, 0x0167, 0x0175, + }, + }, + { // hu + huScriptStr, + huScriptIdx, + }, + { // hy + hyScriptStr, + hyScriptIdx, + }, + { // id + idScriptStr, + idScriptIdx, + }, + {}, // ig + { // ii + "ꀊꇁꀨꁱꂷꀊꆨꌦꇁꃚꁱꂷꈝꐯꉌꈲꁱꂷꀎꋏꉌꈲꁱꂷꇁꄀꁱꂷꆈꌠꁱꂷꁱꀋꉆꌠꅉꀋꐚꌠꁱꂷ", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, + 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, + 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, + 0x0036, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, + 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, + // Entry 40 - 7F + 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, + 0x0048, 0x0048, 0x0048, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, + 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, + 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, + 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, + 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, + 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, + 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, + // Entry 80 - BF + 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, + 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, + 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, + 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, 0x0054, + 0x0054, 0x0060, 0x0060, 0x0060, 0x0060, 0x006c, 0x006c, 0x007e, + }, + }, + { // is + isScriptStr, + isScriptIdx, + }, + { // it + itScriptStr, + itScriptIdx, + }, + { // ja + jaScriptStr, + jaScriptIdx, + }, + { // jgo + "mík -ŋwaꞌnɛ yi ɛ́ líŋɛ́nɛ Latɛ̂ŋntúu yi pɛ́ ká ŋwaꞌnεntɛ-ŋwaꞌnɛ yí pɛ́ k" + + "á kɛ́ jí", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, + 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, + 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, + 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, + 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, + 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, + 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, + // Entry 80 - BF + 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, + 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, + 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, + 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, + 0x002f, 0x002f, 0x002f, 0x002f, 0x002f, 0x004c, 0x004c, 0x0073, + }, + }, + {}, // jmc + { // ka + kaScriptStr, + kaScriptIdx, + }, + {}, // kab + {}, // kam + {}, // kde + { // kea + "arábikuarméniubengalibopomofobraillesirílikudevanagarietiópikujorjianugr" + + "egugujaratigurmukiangulhanhan simplifikaduhan tradisionalebraikuirag" + + "anajaponeskatakanakmerkanareskorianulausianulatinumalaialammongolbir" + + "manesoriyasingalestamiltelugutaanatailandestibetanusimbulusnãu skrit" + + "ukomunskrita diskonxedu", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0010, 0x0010, + 0x0010, 0x0010, 0x0010, 0x0010, 0x0017, 0x0017, 0x001f, 0x001f, + 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, + 0x0026, 0x0026, 0x0026, 0x002f, 0x002f, 0x0039, 0x0039, 0x0039, + 0x0039, 0x0039, 0x0039, 0x0039, 0x0042, 0x0042, 0x004a, 0x004a, + 0x004a, 0x004a, 0x004f, 0x0057, 0x005e, 0x0063, 0x0066, 0x0066, + 0x0076, 0x0085, 0x0085, 0x008c, 0x0093, 0x0093, 0x0093, 0x0093, + 0x0093, 0x0093, 0x0093, 0x0093, 0x009a, 0x009a, 0x009a, 0x00a2, + // Entry 40 - 7F + 0x00a2, 0x00a6, 0x00a6, 0x00ad, 0x00b4, 0x00b4, 0x00b4, 0x00b4, + 0x00bc, 0x00bc, 0x00bc, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, + 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, 0x00c2, + 0x00c2, 0x00c2, 0x00c2, 0x00cb, 0x00cb, 0x00d1, 0x00d1, 0x00d1, + 0x00d1, 0x00d1, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, + 0x00d9, 0x00d9, 0x00d9, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + // Entry 80 - BF + 0x00de, 0x00de, 0x00de, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, + 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00eb, + 0x00eb, 0x00eb, 0x00f1, 0x00f1, 0x00f1, 0x00f1, 0x00f6, 0x00ff, + 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, 0x0107, + 0x0107, 0x0107, 0x0107, 0x0107, 0x010f, 0x011a, 0x011f, 0x0130, + }, + }, + {}, // khq + {}, // ki + { // kk + kkScriptStr, + kkScriptIdx, + }, + {}, // kkj + {}, // kl + {}, // kln + { // km + kmScriptStr, + kmScriptIdx, + }, + { // kn + knScriptStr, + knScriptIdx, + }, + { // ko + koScriptStr, + koScriptIdx, + }, + {}, // kok + { // ks + "اَربیاَرمانیَناَویستَنبالَنیٖزباتَکبیٚنگٲلۍبِلِس سِمبلزبوپوموفوبرٛاہمیبر" + + "یلبُگِنیٖزبُہِدیُنِفایِڑ کنیڑِیَن ایٚب آرجِنَل سِلیبِککاریَنچَمچیٚر" + + "وکیکِرتھکاپٹِککِپرایِٹسَیرِلِکپرون چٔرچسلیوونِک سَیرِلِکدیوناگریڈیٚ" + + "سٔریٚٹاِجپشِیَن ڈِماٹِکاِجِپشَن ہَیریٹِکاِجِپشَن ہَیروگلِپھساِتھیوپ" + + "ِکجارجِیَن کھتسوریجارجِیَنگلیگولِٹِکگوتھِکگرَنتھاگریٖکگُجرٲتۍہانٛگُ" + + "لہانہانُنوٗسِمپلِفایِڑ ہانٹریڑِشَنَلہِبرِوہیٖراگاناپَہاو مانٛگکَٹاک" + + "انا یا ہِراگاناپرون ہَنگیریَناِنڈَساولڈ اِٹیلِکجاوَنیٖزجیٚپَنیٖزکای" + + "ا لیکَتاکاناخَروشتھیکھٕمیرکَنَڑاکوریَنلانالاوفرٛکتُر لیٹِنگیلِک لیٹ" + + "َنلیٹِنلیٚپکالِمبوٗلیٖنیَر اےلیٖنیَر بیلیسِیَنلیدِیَنمَندییَنمانیشی" + + "یَنمایَن ہیٖروگلِپھمِرایٹِکمَلیالَممَنٛگولیَنموٗنمیتی مایَکمَیَنمار" + + "ایٚن کواوگہاماول چِکیاورکھوناورِیااوسمانیااولڈ پٔرمِکپھاگس پابوٗک پ" + + "َہَلویپھونِشِیَنپولاڑ پھونِٹِکریجَنٛگرونٛگو رونٛگورَنِکسَمارِٹَنسَر" + + "اتیسوراشٹرااِشارٲتی لِکھٲےشاویَنسِنہالاسَنڈَنیٖزسیلوتی ناگریسیٖرِیَ" + + "کایٚسٹرینجِلو سیٖرِیَکمغرِبی سیٖریَکمشرَقی سیٖریَکتَگبَنواتَیلیےنوٚ" + + "و تیلوتَمِلتیلگوٗتیٚنگوارتِفِناگتَگَلوگتھاناتھاےتِبتیاُگارِٹِکواےوِ" + + "زِبٕل سپیٖچپرون فارسیسُمیرو اکادیَن کوٗنِفامیٖیلیٚکھنَےعاماَن زٲنۍ " + + "یا نا لَگہٕ ہار رَسمُل خظ", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x000a, 0x001c, 0x002c, + 0x003c, 0x003c, 0x003c, 0x0046, 0x0056, 0x006d, 0x007d, 0x008b, + 0x0093, 0x00a3, 0x00ad, 0x00ad, 0x00f7, 0x0103, 0x0109, 0x0117, + 0x0121, 0x012d, 0x013d, 0x014d, 0x017f, 0x018f, 0x01a1, 0x01a1, + 0x01c2, 0x01e3, 0x020a, 0x020a, 0x021c, 0x023b, 0x024b, 0x025f, + 0x026b, 0x026b, 0x0279, 0x0283, 0x0291, 0x029f, 0x02a5, 0x02b3, + 0x02d0, 0x02e4, 0x02e4, 0x02f0, 0x0302, 0x0302, 0x0317, 0x033d, + 0x0358, 0x0364, 0x037b, 0x038b, 0x039d, 0x039d, 0x03aa, 0x03ba, + // Entry 40 - 7F + 0x03ca, 0x03d6, 0x03d6, 0x03e2, 0x03ee, 0x03ee, 0x03ee, 0x03f6, + 0x03fc, 0x0415, 0x042a, 0x0434, 0x0440, 0x044c, 0x045f, 0x0472, + 0x0472, 0x0472, 0x0480, 0x048e, 0x048e, 0x049e, 0x04b0, 0x04cf, + 0x04cf, 0x04cf, 0x04df, 0x04ef, 0x04ef, 0x0503, 0x050b, 0x050b, + 0x051e, 0x051e, 0x052e, 0x052e, 0x052e, 0x052e, 0x053b, 0x053b, + 0x0547, 0x0556, 0x0564, 0x0570, 0x0580, 0x0580, 0x0580, 0x0595, + 0x05a4, 0x05a4, 0x05a4, 0x05bb, 0x05cf, 0x05ea, 0x05ea, 0x05f8, + 0x0611, 0x061b, 0x062d, 0x0639, 0x0639, 0x0649, 0x0666, 0x0672, + // Entry 80 - BF + 0x0672, 0x0672, 0x0672, 0x0680, 0x0680, 0x0692, 0x06a9, 0x06b9, + 0x06e2, 0x06fd, 0x0718, 0x0728, 0x0728, 0x0734, 0x0745, 0x074f, + 0x074f, 0x074f, 0x075b, 0x076b, 0x0779, 0x0787, 0x0791, 0x0799, + 0x07a3, 0x07a3, 0x07b5, 0x07bb, 0x07d4, 0x07d4, 0x07d4, 0x07e7, + 0x0813, 0x0819, 0x0819, 0x0819, 0x0819, 0x0829, 0x082f, 0x086c, + }, + }, + {}, // ksb + {}, // ksf + { // ksh + "arraabesche Schreffarmeenesche Schreffbängjaalesche Schreffschineeseche " + + "Ömschreff BopomofoBlindeschreffkürrellesche Schreffindesche Devanaj" + + "ari-Schreffätejoopesche Schreffje’orrjesche Schreffjriischesche Schr" + + "effjujaraatesche Schreffindesche Gurmukhi-Schreffkorrejaanesche Schr" + + "effen schineesesche Schreffeijfacher schineesesche Schrefftradizjonä" + + "ll schineesesche Schreffhebrääjesche Schreffjapaanesche Hiddajaana-S" + + "chreffen japaanesche Schreffjapaanesche Kattakaana-SchreffKhmer-Schr" + + "effindesche Kannada-Schreffkorrejaanesche Schreff udder en schineese" + + "sche Schrefflahootesche Schrefflateinesche Schreffindesche Malajalam" + + "-Schreffmongjoolesche Schreffbirmaanesche Schreffindesche Orija-Schr" + + "effsingjaleesesche Schrefftamiilesche Schreffindesche Telugu-Schreff" + + "malledivesche Taana-Schrefftailändesche Schrefftibeetesche Schreff-Z" + + "eiche ävver kein Schreff--jaa keij Schreff--öhnß en Schreff--onbikan" + + "nte Schreff-", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0013, 0x0013, 0x0026, 0x0026, + 0x0026, 0x0026, 0x0026, 0x0026, 0x003c, 0x003c, 0x005c, 0x005c, + 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, + 0x0069, 0x0069, 0x0069, 0x007e, 0x007e, 0x0099, 0x0099, 0x0099, + 0x0099, 0x0099, 0x0099, 0x0099, 0x00ae, 0x00ae, 0x00c4, 0x00c4, + 0x00c4, 0x00c4, 0x00d8, 0x00ed, 0x0106, 0x011c, 0x0134, 0x0134, + 0x0153, 0x0176, 0x0176, 0x018c, 0x01aa, 0x01aa, 0x01aa, 0x01aa, + 0x01aa, 0x01aa, 0x01aa, 0x01aa, 0x01c0, 0x01c0, 0x01c0, 0x01de, + // Entry 40 - 7F + 0x01de, 0x01eb, 0x01eb, 0x0203, 0x0238, 0x0238, 0x0238, 0x0238, + 0x024b, 0x024b, 0x024b, 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, + 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, 0x025e, + 0x025e, 0x025e, 0x025e, 0x0278, 0x0278, 0x028d, 0x028d, 0x028d, + 0x028d, 0x028d, 0x02a1, 0x02a1, 0x02a1, 0x02a1, 0x02a1, 0x02a1, + 0x02a1, 0x02a1, 0x02a1, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, + 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, + 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, 0x02b7, + // Entry 80 - BF + 0x02b7, 0x02b7, 0x02b7, 0x02ce, 0x02ce, 0x02ce, 0x02ce, 0x02ce, + 0x02ce, 0x02ce, 0x02ce, 0x02ce, 0x02ce, 0x02ce, 0x02ce, 0x02e1, + 0x02e1, 0x02e1, 0x02f8, 0x02f8, 0x02f8, 0x02f8, 0x0313, 0x0328, + 0x033b, 0x033b, 0x033b, 0x033b, 0x033b, 0x033b, 0x033b, 0x033b, + 0x033b, 0x033b, 0x033b, 0x033b, 0x0357, 0x0369, 0x037c, 0x0390, + }, + }, + {}, // kw + { // ky + kyScriptStr, + kyScriptIdx, + }, + {}, // lag + { // lb + "ArabeschArmiArmeneschAvesteschBalineseschBattakeschBengaleschBliss-Symbo" + + "lerBopomofoBrahmiBlanneschrëftBugineseschBuhidUCASKareschChamCheroke" + + "eCirthKopteschZyprioteschKyrilleschAlkiercheslaweschDevanagariDesere" + + "tEgyptesch-DemoteschEgyptesch-HierateschEgyptesch HieroglyphenEthiop" + + "eschKhutsuriGeorgeschGlagoliteschGoteschGriicheschGujaratiGurmukhiHa" + + "ngulChineseschHanunooVereinfacht ChineseschTraditionellt ChineseschH" + + "ebräeschHiraganaPahawh HmongKatakana oder HiraganaAlungareschIndus-S" + + "chrëftAlitaleschJavaneseschJapaneschKayah LiKatakanaKharoshthiKhmerK" + + "annadaKoreaneschLannaLaoteschLaténgesch-Fraktur-VariantLaténgesch-Gä" + + "llesch VariantLaténgeschLepchaLimbuLinear ALinear BLykeschLydeschMan" + + "däeschManichäeschMaya-HieroglyphenMeroiteschMalayseschMongoleschMoon" + + "Meitei MayekBirmaneschN’KoOghamOl ChikiOrchon-RunenOriyaOsmaneschAlp" + + "ermeschPhags-paPahlaviPhönizeschPollard PhoneteschRejangRongorongoRu" + + "neschrëftSamaritaneschSaratiSaurashtraZeechesproochShaw-AlphabetSing" + + "haleseschSundaneseschSyloti NagriSyreschSyresch-Estrangelo-VariantWe" + + "stsyreschOstsyreschTai LeTai LueTamileschTeluguTengwarTifinaghDagalo" + + "gThaanaThaiTibeteschUgariteschVaiSiichtbar SproochAlperseschSumeresc" + + "h-akkadesch KeilschrëftYiGeierfte SchrëftwäertSymbolerOuni SchrëftOn" + + "bestëmmtOncodéiert Schrëft", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x000c, 0x0015, 0x001e, + 0x0029, 0x0029, 0x0029, 0x0033, 0x003d, 0x004b, 0x0053, 0x0059, + 0x0067, 0x0072, 0x0077, 0x0077, 0x007b, 0x0082, 0x0086, 0x008e, + 0x0093, 0x009b, 0x00a6, 0x00b0, 0x00c1, 0x00cb, 0x00d2, 0x00d2, + 0x00e5, 0x00f9, 0x010f, 0x010f, 0x0119, 0x0121, 0x012a, 0x0136, + 0x013d, 0x013d, 0x0147, 0x014f, 0x0157, 0x015d, 0x0167, 0x016e, + 0x0184, 0x019c, 0x019c, 0x01a6, 0x01ae, 0x01ae, 0x01ba, 0x01d0, + 0x01db, 0x01e9, 0x01f3, 0x01fe, 0x0207, 0x0207, 0x020f, 0x0217, + // Entry 40 - 7F + 0x0221, 0x0226, 0x0226, 0x022d, 0x0237, 0x0237, 0x0237, 0x023c, + 0x0244, 0x025f, 0x027c, 0x0287, 0x028d, 0x0292, 0x029a, 0x02a2, + 0x02a2, 0x02a2, 0x02a9, 0x02b0, 0x02b0, 0x02ba, 0x02c6, 0x02d7, + 0x02d7, 0x02d7, 0x02e1, 0x02eb, 0x02eb, 0x02f5, 0x02f9, 0x02f9, + 0x0305, 0x0305, 0x030f, 0x030f, 0x030f, 0x030f, 0x0315, 0x0315, + 0x031a, 0x0322, 0x032e, 0x0333, 0x033c, 0x033c, 0x033c, 0x0346, + 0x034e, 0x034e, 0x034e, 0x0355, 0x0360, 0x0372, 0x0372, 0x0378, + 0x0382, 0x038e, 0x039b, 0x03a1, 0x03a1, 0x03ab, 0x03b8, 0x03c5, + // Entry 80 - BF + 0x03c5, 0x03c5, 0x03c5, 0x03d2, 0x03d2, 0x03de, 0x03ea, 0x03f1, + 0x040b, 0x0416, 0x0420, 0x0420, 0x0420, 0x0426, 0x042d, 0x0436, + 0x0436, 0x0436, 0x043c, 0x0443, 0x044b, 0x0452, 0x0458, 0x045c, + 0x0465, 0x0465, 0x046f, 0x0472, 0x0483, 0x0483, 0x0483, 0x048d, + 0x04ad, 0x04af, 0x04c6, 0x04c6, 0x04ce, 0x04db, 0x04e6, 0x04fa, + }, + }, + {}, // lg + {}, // lkt + {}, // ln + { // lo + loScriptStr, + loScriptIdx, + }, + { // lrc + "عأرأڤیأرمأنیبأنگالیبوٙپوٙبئرئیلسیریلیکدیڤانگأریئتوٙیوٙپیاییگورجییوٙنانیگ" + + "وجأراتیگوٙروٙمخیھانگوٙلھانیبیتار سادە بیەسونأتی بیتارعئبریھیراگاناج" + + "اپوٙنیکاتانگاخئمئرکاناداکورئ ییلائولاتینمالایامموغولیمیانمارئوریاسی" + + "ناھالاتامیلتئلئگوتاناتایلأندیتأبأتینئشوٙنە یانیسئسە نأبیەجائوفتاأنی" + + "سئسە نادیار", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0026, 0x0026, 0x0032, 0x0032, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x004c, 0x004c, 0x005e, 0x005e, 0x005e, + 0x005e, 0x005e, 0x005e, 0x005e, 0x0076, 0x0076, 0x0080, 0x0080, + 0x0080, 0x0080, 0x008e, 0x009e, 0x00b0, 0x00be, 0x00c6, 0x00c6, + 0x00e0, 0x00f7, 0x00f7, 0x0101, 0x0111, 0x0111, 0x0111, 0x0111, + 0x0111, 0x0111, 0x0111, 0x0111, 0x011f, 0x011f, 0x011f, 0x012d, + // Entry 40 - 7F + 0x012d, 0x0137, 0x0137, 0x0143, 0x0150, 0x0150, 0x0150, 0x0150, + 0x0158, 0x0158, 0x0158, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, + 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, 0x0162, + 0x0162, 0x0162, 0x0162, 0x0170, 0x0170, 0x017c, 0x017c, 0x017c, + 0x017c, 0x017c, 0x018a, 0x018a, 0x018a, 0x018a, 0x018a, 0x018a, + 0x018a, 0x018a, 0x018a, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, + 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, + 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, 0x0194, + // Entry 80 - BF + 0x0194, 0x0194, 0x0194, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, + 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01ae, + 0x01ae, 0x01ae, 0x01ba, 0x01ba, 0x01ba, 0x01ba, 0x01c2, 0x01d2, + 0x01de, 0x01de, 0x01de, 0x01de, 0x01de, 0x01de, 0x01de, 0x01de, + 0x01de, 0x01de, 0x01de, 0x01de, 0x01f1, 0x0208, 0x0218, 0x0231, + }, + }, + { // lt + ltScriptStr, + ltScriptIdx, + }, + {}, // lu + {}, // luo + {}, // luy + { // lv + lvScriptStr, + lvScriptIdx, + }, + {}, // mas + {}, // mer + {}, // mfe + {}, // mg + {}, // mgh + { // mgo + "ngam ŋwaʼringam choʼabo ŋwaʼri tisɔʼ", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + // Entry 80 - BF + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, + 0x000d, 0x000d, 0x000d, 0x000d, 0x000d, 0x0017, 0x0017, 0x002b, + }, + }, + { // mk + mkScriptStr, + mkScriptIdx, + }, + { // ml + mlScriptStr, + mlScriptIdx, + }, + { // mn + mnScriptStr, + mnScriptIdx, + }, + { // mr + mrScriptStr, + mrScriptIdx, + }, + { // ms + msScriptStr, + msScriptIdx, + }, + { // mt + "GħarbiĊirillikuGriegHan SimplifikatHan TradizzjonaliLatinPersjan AntikMh" + + "ux MiktubKomuniKitba Mhux Magħrufa", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, + 0x0025, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + // Entry 40 - 7F + 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, + 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, + 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, + 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, + 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, + 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, + 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, + // Entry 80 - BF + 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, + 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, + 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, + 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x003b, 0x0048, + 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0053, 0x0059, 0x006d, + }, + }, + {}, // mua + { // my + myScriptStr, + myScriptIdx, + }, + { // mzn + "عربیارمنیبنگالیبوپوموفوسیریلیکدیوانانگریاتیوپیاییگرجییونانیگجراتیگورموخی" + + "هانگولهانساده\u200cبَیی هاناستاندارد ِسنتی هانتعبریهیراگاناجاپونیکا" + + "تاکانا", + []uint16{ // 64 elements + 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0012, 0x0012, + 0x0012, 0x0012, 0x0012, 0x0012, 0x001e, 0x001e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x003c, 0x003c, 0x0050, 0x0050, 0x0050, + 0x0050, 0x0050, 0x0050, 0x0050, 0x0062, 0x0062, 0x006a, 0x006a, + 0x006a, 0x006a, 0x0076, 0x0082, 0x0090, 0x009c, 0x00a2, 0x00a2, + 0x00bc, 0x00e2, 0x00e2, 0x00ea, 0x00fa, 0x00fa, 0x00fa, 0x00fa, + 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x0106, 0x0106, 0x0106, 0x0116, + }, + }, + {}, // naq + {}, // nd + { // ne + neScriptStr, + neScriptIdx, + }, + { // nl + nlScriptStr, + nlScriptIdx, + }, + {}, // nmg + { // nn + "arabiskarmiskarmenskavestiskbalinesiskbatakbengaliblissymbolbopomofobrah" + + "mibraillebuginesiskbuhidchakmafelles kanadiske urspråksstavingarkari" + + "skchamcherokeecirthkoptiskkypriotiskkyrilliskkyrillisk (kyrkjeslavis" + + "k variant)devanagarideseretegyptisk demotiskegyptisk hieratiskegypti" + + "ske hieroglyfaretiopiskkhutsuri (asomtavruli og nuskhuri)georgiskgla" + + "golittiskgotiskgreskgujaratigurmukhihangulhanhanunooforenkla kinesis" + + "ktradisjonell kinesiskhebraiskhiraganapahawk hmongkatakana eller hir" + + "aganagammalungarskindusgammalitaliskjavanesiskjapanskkayah likatakan" + + "akharoshthikhmerkannadakoreanskkaithisklannalaotisklatinsk (frakturv" + + "ariant)latinsk (gælisk variant)latinsklepchalumbulineær Alineær Blyk" + + "isklydiskmandaiskmanikeiskmaya-hieroglyfarmeroitiskmalayalammongolsk" + + "moonmeitei-mayekmyanmarn’kooghamol-chikiorkhonoriyaosmanyagammalperm" + + "iskphags-painskripsjonspahlavisalmepahlavipahlavifønikiskpollard-fon" + + "etiskinskripsjonsparthiskrejangrongorongorunersamaritansksaratisaura" + + "shtrateiknskriftshavisksinhalasundanesisksyloti nagrisyriakisksyriak" + + "isk (estrangelo-variant)syriakisk (vestleg variant)syriakisk (austle" + + "g variant)tagbanwatai leny tai luetamilsktai viettelugutengwartifina" + + "ghtagalogthaanathaitibetanskugaritiskvaisynleg talegammalpersisksume" + + "ro-akkadisk kileskriftyinedarvamatematisk notasjonsymbolkode for spr" + + "åk utan skriftfellesukjend skrift", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x000d, 0x0014, 0x001c, + 0x0026, 0x0026, 0x0026, 0x002b, 0x0032, 0x003c, 0x0044, 0x004a, + 0x0051, 0x005b, 0x0060, 0x0066, 0x0089, 0x008f, 0x0093, 0x009b, + 0x00a0, 0x00a7, 0x00b1, 0x00ba, 0x00db, 0x00e5, 0x00ec, 0x00ec, + 0x00fd, 0x010f, 0x0124, 0x0124, 0x012c, 0x014e, 0x0156, 0x0162, + 0x0168, 0x0168, 0x016d, 0x0175, 0x017d, 0x0183, 0x0186, 0x018d, + 0x019e, 0x01b3, 0x01b3, 0x01bb, 0x01c3, 0x01c3, 0x01cf, 0x01e6, + 0x01f3, 0x01f8, 0x0205, 0x020f, 0x0216, 0x0216, 0x021e, 0x0226, + // Entry 40 - 7F + 0x0230, 0x0235, 0x0235, 0x023c, 0x0244, 0x0244, 0x024c, 0x0251, + 0x0258, 0x0270, 0x0289, 0x0290, 0x0296, 0x029b, 0x02a4, 0x02ad, + 0x02ad, 0x02ad, 0x02b3, 0x02b9, 0x02b9, 0x02c1, 0x02ca, 0x02da, + 0x02da, 0x02da, 0x02e3, 0x02ec, 0x02ec, 0x02f4, 0x02f8, 0x02f8, + 0x0304, 0x0304, 0x030b, 0x030b, 0x030b, 0x030b, 0x0311, 0x0311, + 0x0316, 0x031e, 0x0324, 0x0329, 0x0330, 0x0330, 0x0330, 0x033d, + 0x0345, 0x0358, 0x0364, 0x036b, 0x0374, 0x0384, 0x0398, 0x039e, + 0x03a8, 0x03ad, 0x03b8, 0x03be, 0x03be, 0x03c8, 0x03d3, 0x03da, + // Entry 80 - BF + 0x03da, 0x03da, 0x03da, 0x03e1, 0x03e1, 0x03ec, 0x03f8, 0x0401, + 0x041f, 0x043a, 0x0455, 0x045d, 0x045d, 0x0463, 0x046d, 0x0474, + 0x0474, 0x047c, 0x0482, 0x0489, 0x0491, 0x0498, 0x049e, 0x04a2, + 0x04ab, 0x04ab, 0x04b4, 0x04b7, 0x04c2, 0x04c2, 0x04c2, 0x04cf, + 0x04e9, 0x04eb, 0x04f2, 0x0505, 0x050b, 0x0526, 0x052c, 0x0539, + }, + }, + {}, // nnh + { // no + noScriptStr, + noScriptIdx, + }, + {}, // nus + {}, // nyn + { // om + "Latin", + []uint16{ // 76 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0005, + }, + }, + { // or + "ଆରବିକ୍ଇମ୍ପେରିଆଲ୍ ଆରମିକ୍ଆର୍ମେନିଆନ୍ଆବେସ୍ଥାନ୍ବାଲିନୀଜ୍ବାଟାକ୍ବଙ୍ଗାଳୀବ୍ଲିସିମ୍ବ" + + "ଲସ୍ବୋପୋମୋଫୋବ୍ରାହ୍ମୀବ୍ରିଲ୍ବୁଗାନୀଜ୍ବୁହିଦ୍ଚକମାୟୁନିଫାଏଡ୍ କାନାଡିଆନ୍ ଆବ୍" + + "ରୋଜିନାଲ୍ ସିଲାବିକସ୍କୈରନ୍ଛମ୍ଚିରୁକୀସିର୍ଥକପଟିକ୍ସିପ୍ରଅଟ୍ସିରିଲିକ୍ଓଲ୍ଡ ଚର" + + "୍ଚ୍ଚ ସାଲଭୋନିକ୍ ସିରିଲିକ୍ଦେବାନଗିରିଡେସର୍ଟଇଜିପ୍ଟିଆନ୍ ଡେମୋଟିକ୍ଇଜିପ୍ଟିଆନ" + + "୍ ହାଇଅରଟିକ୍ଇଜିପ୍ଟିଆନ୍ ହାଅରଗ୍ଲିପସ୍ଇଥୋପିକ୍ଜର୍ଜିଆନ୍ ଖୁଟସୁରୀଜର୍ଜିଆନ୍ଗ୍" + + "ଲାଗ୍ଲୋଟିକ୍ଗୋଥିକ୍ଗ୍ରୀକ୍ଗୁଜୁରାଟୀଗୁରୁମୁଖୀହାଙ୍ଗୁଲ୍ହାନ୍ହାନୁନ୍ସରଳୀକୃତ ହା" + + "ନ୍ପାରମ୍ପରିକ୍ ହାନ୍ହେବ୍ର୍ୟୁହିରାଗାନାପାହୋ ହୋଙ୍ଗକାଟାକାନ୍ କିମ୍ବା ହିରାଗାନ" + + "୍ପୁରୁଣା ହଙ୍ଗେରିଆନ୍ସିନ୍ଧୁପୁରୁଣା ଇଟାଲୀଜାଭାନୀଜ୍ଜାପାନୀଜ୍କାୟାହା ଲୀକାଟକା" + + "ନ୍ଖାରୋସ୍ଥିଖ୍ମେର୍କନ୍ନଡକୋରିଆନ୍କୈଥିଲାନାଲାଓଫ୍ରାକଥୁର୍ ଲାଟିନ୍ଗାଏଲିକ୍ ଲାଟ" + + "ିନ୍ଲାଟିନ୍ଲେପଚାଲିମ୍ବୁଲିନିୟର୍ଲିନିୟର୍ ବିଲିଶିୟନ୍ଲିଡିୟନ୍ମାନଡେନ୍ମନଶୀନ୍ମୟ" + + "ାନ୍ ହାୟରଲଜିକସ୍ମେରୋଇଟିକ୍ମାଲୟଲମ୍ମଙ୍ଗୋଲିଆନ୍ଚନ୍ଦ୍ରମାଏତି ମାୟେକ୍ମିଆମାର୍ଏ" + + "ନ୍ କୋଓଘାମାଓଲ୍ ଚିକିଓରୋଖନ୍ଓଡିଆଓସୋମାନିୟାଓଲ୍ଡ ପରମିକ୍ଫାଗସ୍-ପାଇନସ୍କ୍ରୀପସ" + + "ାନଲ୍ ପାହାଲାୱୀସ୍ଲାଟର୍ ପାହାଲାୱୀବୁକ୍ ପାହାଲାୱୀଫେନୋସିଆନ୍ପୋଲାର୍ଡ ଫୋନେଟିକ" + + "୍ଇନସ୍କ୍ରୀପସାନଲ୍ ପାର୍ଥିଆନ୍ରେଜାଙ୍ଗରୋଙ୍ଗୋରୋଙ୍ଗୋରନିକ୍ସମୌରିଟନ୍ସାରାତିସୌର" + + "ାଷ୍ଟ୍ରସାଙ୍କେତିକ ଲିଖସାବିୟାନ୍ସିଂହଳସୁଦାନୀଜ୍ସୀଲିତୋ ନଗରୀସିରିୟାକ୍ଏଷ୍ଟ୍ରା" + + "ଙ୍ଗେଲୋ ସିରିକ୍ୱେଷ୍ଟର୍ନ ସିରିକ୍ଇଷ୍ଟର୍ନ ସିରିକ୍ତଗବାନ୍ୱାତାଇ ଲେନୂତନ ତାଇ ଲ" + + "ୁଏତାମିଲ୍ତାଇ ଭିଏତ୍ତେଲୁଗୁତେଙ୍ଗୱାର୍ତିଫିଙ୍ଘାଟାଗାଲୋଗ୍ଥାନାଥାଇତିବେତାନ୍ୟୁଗ" + + "ାରିଟିକ୍ୱାଇଭିଜିବଲ୍ ସ୍ପିଚ୍ପୁରୁଣା ଫରାସୀସୁମେରୋ-ଆକ୍କାଡିଆନ୍ ସୁନିଫର୍ମୟୀବଂ" + + "ଶଗତଗାଣିତିକ ନୋଟେସନ୍ସିମ୍ବଲ୍ଅଲିଖିତସାଧାରଣଅଞ୍ଜାତ କିମ୍ବା ଅବୈଧ ସ୍କ୍ରୀପ୍ଟ", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x0043, 0x0061, 0x007c, + 0x0094, 0x0094, 0x0094, 0x00a6, 0x00bb, 0x00df, 0x00f7, 0x010f, + 0x0121, 0x0139, 0x014b, 0x0157, 0x01cc, 0x01db, 0x01e4, 0x01f6, + 0x0205, 0x0217, 0x022f, 0x0247, 0x029b, 0x02b6, 0x02c8, 0x02c8, + 0x02ff, 0x0339, 0x0379, 0x0379, 0x038e, 0x03bc, 0x03d4, 0x03f8, + 0x040a, 0x040a, 0x041c, 0x0434, 0x044c, 0x0464, 0x0470, 0x0482, + 0x04a4, 0x04cf, 0x04cf, 0x04e7, 0x04ff, 0x04ff, 0x051b, 0x055f, + 0x0590, 0x05a2, 0x05c4, 0x05dc, 0x05f4, 0x05f4, 0x060d, 0x0622, + // Entry 40 - 7F + 0x063a, 0x064c, 0x064c, 0x065b, 0x0670, 0x0670, 0x067c, 0x0688, + 0x0691, 0x06bf, 0x06e7, 0x06f9, 0x0708, 0x071a, 0x072f, 0x074b, + 0x074b, 0x074b, 0x0760, 0x0775, 0x0775, 0x078a, 0x079c, 0x07ca, + 0x07ca, 0x07ca, 0x07e5, 0x07fa, 0x07fa, 0x0818, 0x082a, 0x082a, + 0x084c, 0x084c, 0x0861, 0x0861, 0x0861, 0x0861, 0x0871, 0x0871, + 0x0880, 0x0896, 0x08a8, 0x08b4, 0x08cf, 0x08cf, 0x08cf, 0x08ee, + 0x0904, 0x0947, 0x0975, 0x099a, 0x09b5, 0x09e3, 0x0a29, 0x0a3e, + 0x0a62, 0x0a71, 0x0a89, 0x0a9b, 0x0a9b, 0x0ab6, 0x0adb, 0x0af3, + // Entry 80 - BF + 0x0af3, 0x0af3, 0x0af3, 0x0b02, 0x0b02, 0x0b1a, 0x0b39, 0x0b51, + 0x0b8b, 0x0bb6, 0x0bde, 0x0bf6, 0x0bf6, 0x0c06, 0x0c26, 0x0c38, + 0x0c38, 0x0c51, 0x0c63, 0x0c7e, 0x0c96, 0x0cae, 0x0cba, 0x0cc3, + 0x0cdb, 0x0cdb, 0x0cf9, 0x0d02, 0x0d2a, 0x0d2a, 0x0d2a, 0x0d4c, + 0x0d96, 0x0d9c, 0x0dab, 0x0dd6, 0x0deb, 0x0dfd, 0x0e0f, 0x0e5d, + }, + }, + { // os + "АраббагКиррилицӕӔнцонгонд китайагТрадицион китайагЛатинагНӕфысгӕНӕзонгӕ " + + "скрипт", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0041, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, + 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, + // Entry 40 - 7F + 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, + 0x0062, 0x0062, 0x0062, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, + 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, + 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, + 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, + 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, + 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, + 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, + // Entry 80 - BF + 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, + 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, + 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, + 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, + 0x0070, 0x0070, 0x0070, 0x0070, 0x0070, 0x007e, 0x007e, 0x0099, + }, + }, + { // pa + paScriptStr, + paScriptIdx, + }, + { // pa-Arab + "عربیگُرمُکھی", + []uint16{ // 45 elements + 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0018, + }, + }, + { // pl + plScriptStr, + plScriptIdx, + }, + {}, // prg + { // ps + "عربي", + []uint16{ // 5 elements + 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, + }, + }, + { // pt + ptScriptStr, + ptScriptIdx, + }, + { // pt-PT + ptPTScriptStr, + ptPTScriptIdx, + }, + {}, // qu + { // rm + "arabarameic imperialarmenavesticbalinaisbatakbengalsimbols da Blissbopom" + + "ofobrahmiscrittira da Braillebuginaisbuhidchakmasimbols autoctons ca" + + "nadais unifitgadscarianchamcherokeecirthcopticcipriotcirillicslav da" + + " baselgia vegldevanagarideseretegipzian demoticegipzian ieraticierog" + + "lifas egipzianasetiopickutsurigeorgianglagoliticgoticgrecgujaratigur" + + "mukhihangulhanhanunooscrittira chinaisa simplifitgadascrittira china" + + "isa tradiziunalaebraichiraganapahawn hmongkatanaka u hiraganaungarai" + + "s veglindusitalic vegljavanaisgiapunaiskayah likatakanakharoshthikhm" + + "er/cambodschankannadacoreankaithilannalaotlatin (scrittira gotica)la" + + "tin (scrittira gaelica)latinlepchalimbulinear Alinear Blichiclidicma" + + "ndaicmanicheicieroglifas mayameroiticmalaisianmongolicmoonmeetei may" + + "ekburmaisn’kooghamol chikiorkhonoriyaosmanpermic veglphags-papahlavi" + + " dad inscripziunspahlavi da psalmspahlavi da cudeschsfenizianfonetic" + + "a da Pollardpartic dad inscripziunsrejangrongorongorunicsamaritansar" + + "atisaurashtralingua da segnsshaviansingalaissundanaissyloti nagrisir" + + "icsiric estrangelosiric dal vestsiric da l’osttagbanwatai letai luet" + + "amiltai viettelugutengwartifinaghtagalogthaanatailandaistibetanugari" + + "ticvaiialfabet visibelpersian veglscrittira a cugn sumeric-accadicay" + + "iertànotaziun matematicasimbolslinguas na scrittasbetg determinàscri" + + "ttira nunenconuschenta u nunvalaivla", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0014, 0x0019, 0x0020, + 0x0028, 0x0028, 0x0028, 0x002d, 0x0033, 0x0043, 0x004b, 0x0051, + 0x0065, 0x006d, 0x0072, 0x0078, 0x009d, 0x00a3, 0x00a7, 0x00af, + 0x00b4, 0x00ba, 0x00c1, 0x00c9, 0x00de, 0x00e8, 0x00ef, 0x00ef, + 0x00ff, 0x010f, 0x0124, 0x0124, 0x012b, 0x0132, 0x013a, 0x0144, + 0x0149, 0x0149, 0x014d, 0x0155, 0x015d, 0x0163, 0x0166, 0x016d, + 0x018d, 0x01ac, 0x01ac, 0x01b2, 0x01ba, 0x01ba, 0x01c6, 0x01d9, + 0x01e6, 0x01eb, 0x01f6, 0x01fe, 0x0207, 0x0207, 0x020f, 0x0217, + // Entry 40 - 7F + 0x0221, 0x0232, 0x0232, 0x0239, 0x023f, 0x023f, 0x0245, 0x024a, + 0x024e, 0x0266, 0x027f, 0x0284, 0x028a, 0x028f, 0x0297, 0x029f, + 0x029f, 0x029f, 0x02a5, 0x02aa, 0x02aa, 0x02b1, 0x02ba, 0x02c9, + 0x02c9, 0x02c9, 0x02d1, 0x02da, 0x02da, 0x02e2, 0x02e6, 0x02e6, + 0x02f2, 0x02f2, 0x02f9, 0x02f9, 0x02f9, 0x02f9, 0x02ff, 0x02ff, + 0x0304, 0x030c, 0x0312, 0x0317, 0x031c, 0x031c, 0x031c, 0x0327, + 0x032f, 0x0347, 0x0358, 0x036b, 0x0373, 0x0386, 0x039d, 0x03a3, + 0x03ad, 0x03b2, 0x03bb, 0x03c1, 0x03c1, 0x03cb, 0x03da, 0x03e1, + // Entry 80 - BF + 0x03e1, 0x03e1, 0x03e1, 0x03ea, 0x03ea, 0x03f3, 0x03ff, 0x0404, + 0x0414, 0x0422, 0x0432, 0x043a, 0x043a, 0x0440, 0x0447, 0x044c, + 0x044c, 0x0454, 0x045a, 0x0461, 0x0469, 0x0470, 0x0476, 0x0480, + 0x0487, 0x0487, 0x048f, 0x0493, 0x04a2, 0x04a2, 0x04a2, 0x04ae, + 0x04cf, 0x04d1, 0x04d6, 0x04e9, 0x04f0, 0x0503, 0x0512, 0x053a, + }, + }, + {}, // rn + { // ro + roScriptStr, + roScriptIdx, + }, + {}, // rof + { // ru + ruScriptStr, + ruScriptIdx, + }, + {}, // rw + {}, // rwk + { // sah + "АрааптыыЭрмээннииНууччалыыКириэктииДьоппуоннууКэриэйдииЛатыынныыТаайдыыС" + + "урулла иликБиллибэт сурук", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0010, 0x0022, 0x0022, + 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, + 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, + 0x0022, 0x0022, 0x0022, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, + 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, + 0x0034, 0x0034, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, + 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, + 0x0046, 0x0046, 0x0046, 0x0046, 0x005c, 0x005c, 0x005c, 0x005c, + // Entry 40 - 7F + 0x005c, 0x005c, 0x005c, 0x005c, 0x006e, 0x006e, 0x006e, 0x006e, + 0x006e, 0x006e, 0x006e, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + // Entry 80 - BF + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, + 0x008e, 0x008e, 0x008e, 0x008e, 0x008e, 0x00a5, 0x00a5, 0x00c0, + }, + }, + {}, // saq + {}, // sbp + { // se + "arábakyrillalašgreikkalašhangulkiinnašálkiárbevirolašhiraganakatakanaláh" + + "tenašorrut chállojuvvotdovdameahttun chállin", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x001c, 0x001c, 0x001c, 0x0022, 0x002a, 0x002a, + 0x002f, 0x003c, 0x003c, 0x003c, 0x0044, 0x0044, 0x0044, 0x0044, + 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x004c, + // Entry 40 - 7F + 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, + 0x004c, 0x004c, 0x004c, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, + 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, + 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, + 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, + 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, + 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, + 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, + // Entry 80 - BF + 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, + 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, + 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, + 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, + 0x0056, 0x0056, 0x0056, 0x0056, 0x0056, 0x0069, 0x0069, 0x007f, + }, + }, + { // se-FI + "arábalaškiinnálašálkes kiinnálašárbevirolaš kiinnálašorrut čállojuvvotdo" + + "vdameahttun čállin", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0015, 0x0015, + 0x0027, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + // Entry 40 - 7F + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + // Entry 80 - BF + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0053, 0x0053, 0x0069, + }, + }, + {}, // seh + {}, // ses + {}, // sg + {}, // shi + {}, // shi-Latn + { // si + siScriptStr, + siScriptIdx, + }, + { // sk + skScriptStr, + skScriptIdx, + }, + { // sl + slScriptStr, + slScriptIdx, + }, + {}, // smn + {}, // sn + { // so + "Aan la qorinFar aan la aqoon amase aan saxnayn", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 80 - BF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x002e, + }, + }, + { // sq + sqScriptStr, + sqScriptIdx, + }, + { // sr + srScriptStr, + srScriptIdx, + }, + { // sr-Latn + srLatnScriptStr, + srLatnScriptIdx, + }, + { // sv + svScriptStr, + svScriptIdx, + }, + {}, // sv-FI + { // sw + swScriptStr, + swScriptIdx, + }, + {}, // sw-CD + { // ta + taScriptStr, + taScriptIdx, + }, + { // te + teScriptStr, + teScriptIdx, + }, + {}, // teo + { // th + thScriptStr, + thScriptIdx, + }, + { // ti + "ፊደልላቲን", + []uint16{ // 76 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + // Entry 40 - 7F + 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0012, + }, + }, + { // to + "tohinima fakaʻafakatohinima fakaʻalapēnia-kaukasiatohinima fakaʻalepeato" + + "hinima fakaʻalāmiti-ʻemipaeatohinima fakaʻāmeniatohinima fakaʻavesit" + + "anitohinima fakapalitohinima fakapamumitohinima fakapasa-vātohinima " + + "fakapātakitohinima fakapengikalitohinima fakaʻilonga-pilisitohinima " + + "fakapopomofotohinima fakapalāmītohinima laukonga ki he kuitohinima f" + + "akapukisitohinima fakapuhititohinima fakasakimātohinima fakatupuʻi-k" + + "ānata-fakatahatahatohinima fakakalitohinima fakasamitohinima fakase" + + "lokītohinima fakakīlititohinima fakakopitikatohinima fakasaipalesito" + + "hinima fakalūsiatohinima fakalūsia-lotu-motuʻatohinima fakaʻinitia-t" + + "evanākalītohinima fakateseletitohinimanounou fakatupoloiētohinima te" + + "motika-fakaʻisipitetohinima hielatika-fakaʻisipitetohinima tongitapu" + + "-fakaʻisipitetohinima fakaʻelepasanitohinima fakaʻītiōpiatohinima fa" + + "kakutusuli-seōsiatohinima fakaseōsiatohinima fakakalakolititohinima " + + "fakakotikatohinima fakasilanitātohinima fakakalisitohinima fakaʻinit" + + "ia-kutalatitohinima fakakūmukitohinima fakakōlea-hāngūlutohinima fak" + + "asiainatohinima fakahanunōʻotohinima fakasiaina-fakafaingofuatohinim" + + "a fakasiaina-tukufakaholotohinima fakahepelūtohinima fakasiapani-hil" + + "akanatohinima tongitapu-fakaʻanatoliatohinima fakapahaumongitohinima" + + " fakasilapa-siapanitohinima fakahungakalia-motuʻatohinima fakaʻinitu" + + "sitohinima fakaʻītali-motuʻatohinima fakasavatohinima fakasiapanitoh" + + "inima fakaiūkenitohinima fakakaialītohinima fakasiapani-katakanatohi" + + "nima fakakalositītohinima fakakamipōtiatohinima fakakosikītohinima f" + + "akaʻinitia-kanatatohinima fakakōleatohinima fakakepeletohinima fakak" + + "aiatītohinima fakalanatohinima fakalautohinima fakalatina-falakituli" + + "tohinima fakalatina-kaelikitohinima fakalatinatohinima fakalepasātoh" + + "inima fakalimipūtohinima fakalinea-Atohinima fakalinea-Ptohinima fak" + + "afalāsetohinima fakalomatohinima fakalīsiatohinima fakalītiatohinima" + + " fakamahasanitohinima fakamanitaeatohinima fakamanikaeatohinima tong" + + "itapu fakamaiatohinima fakamēnititohinima fakameloue-heiheitohinima " + + "fakamelouetohinima fakaʻinitia-malāialamitohinima fakamotītohinima f" + + "akamongokōliatohinima laukonga ki he kui-māhinatohinima fakamolōtohi" + + "nima fakametei-maiekitohinima fakapematohinima fakaʻalepea-tokelau-m" + + "otuʻatohinima fakanapateatohinima fakanati-sepatohinima fakanikōtohi" + + "nima fakanasiūtohinima fakaʻokamitohinima fakaʻolisikitohinima fakaʻ" + + "olikonitohinima fakaʻinitia-ʻolāeatohinima fakaʻosimāniatohinima fak" + + "apalamilenetohinima fakapausinihautohinima fakapēmi-motuʻatohinima f" + + "akapākisipātohinima fakapālavi-tongitohinima fakapālavi-saametohinim" + + "a fakapālavi-tohitohinima fakafoinikiatohinima fakafonētiki-polātito" + + "hinima fakapātia-tongitohinima fakalesiangitohinima fakalongolongoto" + + "hinima fakalunikitohinima fakasamalitanetohinima fakasalatitohinima " + + "fakaʻalepea-tonga-motuʻatohinima fakasaulasitātohinima fakaʻilonga-t" + + "ohitohinima fakasiavitohinima fakasiālatātohinima fakasititamitohini" + + "ma fakakutauātitohinima fakasingihalatohinima fakasolasomipengitohin" + + "ima fakasunitātohinima fakasailoti-nakilitohinima fakasuliāiātohinim" + + "a fakasuliāiā-ʻesitelangelotohinima fakasuliāiā-hihifotohinima fakas" + + "uliāiā-hahaketohinima fakatakipaneuātohinima fakatakilitohinima faka" + + "tai-luetohinima fakatai-lue-foʻoutohinima fakatamilitohinima fakatan" + + "gutitohinima fakatai-vietitohinima fakaʻinitia-telukutohinima fakate" + + "ngiualitohinima fakatifinākitohinima fakatakalokatohinima fakatānato" + + "hinima fakatailanitohinima fakataipetitohinima fakatīhutatohinima fa" + + "kaʻūkalititohinima fakavaitohinima fakafonētiki-hāmaitohinima fakava" + + "langi-kisitītohinima fakauoleaitohinima fakapēsiamuʻatohinima fakama" + + "taʻingahau-sumelo-akatiatohinima fakaīītohinima hokositohinima fakam" + + "atematikatohinima fakaʻilongatohinima taʻetohitohiʻitohinima fakatat" + + "autohinima taʻeʻiloa", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0014, 0x0035, 0x0035, 0x004a, 0x006b, 0x0081, 0x0099, + 0x00aa, 0x00bd, 0x00d2, 0x00e6, 0x00fc, 0x0118, 0x012d, 0x0142, + 0x015d, 0x0170, 0x0183, 0x0197, 0x01c0, 0x01d1, 0x01e2, 0x01f6, + 0x020a, 0x021f, 0x0235, 0x0248, 0x0268, 0x028a, 0x029f, 0x02bb, + 0x02da, 0x02fa, 0x031a, 0x0332, 0x034a, 0x0367, 0x037b, 0x0392, + 0x03a5, 0x03bb, 0x03ce, 0x03ec, 0x0400, 0x041d, 0x0430, 0x0447, + 0x0468, 0x0488, 0x0488, 0x049c, 0x04b9, 0x04da, 0x04f1, 0x050c, + 0x052b, 0x0541, 0x055e, 0x056f, 0x0583, 0x0597, 0x05ab, 0x05c8, + // Entry 40 - 7F + 0x05de, 0x05f5, 0x0609, 0x0625, 0x0638, 0x064b, 0x065f, 0x0670, + 0x0680, 0x069e, 0x06b9, 0x06cc, 0x06e0, 0x06f4, 0x0708, 0x071c, + 0x0730, 0x0741, 0x0754, 0x0767, 0x077c, 0x0791, 0x07a6, 0x07c1, + 0x07d5, 0x07ef, 0x0802, 0x0823, 0x0835, 0x084d, 0x0870, 0x0882, + 0x089b, 0x089b, 0x08ac, 0x08d1, 0x08e5, 0x08fb, 0x090d, 0x0920, + 0x0934, 0x094a, 0x0960, 0x097e, 0x0996, 0x09ad, 0x09c4, 0x09de, + 0x09f5, 0x0a0f, 0x0a29, 0x0a42, 0x0a57, 0x0a75, 0x0a8e, 0x0aa3, + 0x0aba, 0x0acd, 0x0ae4, 0x0af7, 0x0b1a, 0x0b31, 0x0b4b, 0x0b5d, + // Entry 80 - BF + 0x0b73, 0x0b88, 0x0b9e, 0x0bb4, 0x0bce, 0x0be2, 0x0bfd, 0x0c13, + 0x0c38, 0x0c55, 0x0c72, 0x0c8a, 0x0c9d, 0x0cb1, 0x0ccc, 0x0cdf, + 0x0cf3, 0x0d09, 0x0d25, 0x0d3b, 0x0d51, 0x0d66, 0x0d78, 0x0d8c, + 0x0da0, 0x0db4, 0x0dcb, 0x0ddb, 0x0df8, 0x0e14, 0x0e27, 0x0e3f, + 0x0e67, 0x0e78, 0x0e87, 0x0e9e, 0x0eb3, 0x0ecc, 0x0ede, 0x0ef2, + }, + }, + { // tr + trScriptStr, + trScriptIdx, + }, + {}, // twq + {}, // tzm + { // ug + "ئافاكائەرەبخان جەمەتى ئارامۇئەرمەنئاۋېستابالىبامۇمباسساباتاكبېنگالبىلىس " + + "بەلگىلىرىخەنچە پىنيىنبراخمىبرائىل ئەمالار يېزىقىبۇگىبۇخىتچاكمابىرلى" + + "ككە كەلگەن كانادا يەرلىك بوغۇم جەدۋىلىكارىياچامچېروكىكىرسچەكوپتىكسى" + + "پرۇسكىرىلقەدىمكى چىركاۋ سىلاۋيانچە كىرىلدېۋاناگارىدېزېرېتدۇپلويان ت" + + "ېز خاتىرىلەشدېموتىكچە مىسىرخىيەراتىكچە مىسىرتەسۋىرىي يېزىق مىسىرئېف" + + "ىيوپىيەچەخۇتسۇرى گىرۇزىنچەگىرۇزىنچەگىلاگوتچەگوتچەگىرانتاچەگىرېكچەگۇ" + + "جاراتچەگۇرمۇكىچەخەنچەخانۇنۇچەئاددىي خەنچەمۇرەككەپ خەنچەئىبرانىچەخىر" + + "اگانائاناتولىيە تەسۋىرىي يېزىقمۆڭچەياپونچە خىراگانا ياكى كاتاكاناقە" + + "دىمكى ماجارچەئىندۇسچەقەدىمكى ئىتاليانچەياۋاچەياپونچەجۇرچېنچەكاياھچە" + + "كاتاكاناكاروشتىچەكېخمېرچەخوجكىچەكانناداچەكورېيەچەكپېللېچەكاياتىچەلا" + + "نناچەلائوسچەفىراكتۇر لاتىنچەسىكوت لاتىنچەلاتىنچەلەپچاچەلىمبۇچەسىزىق" + + "لىق Aسىزىقلىق Bفراسېرچەلوماچەلىسىيانچەلىدىيەچەماندائىكچەمانەكېزەمچە" + + "ماياچە تەسۋىرىي يېزىقمېندېچەمېتروئىت يازمىچەمېتروئىتمالايامچەموڭغۇل" + + "چەكورىيەمروچەمانىپۇرىچەبىرماچەقەدىمكى شىمالىي ئەرەبچەئانباتچەناشىچە" + + "نىكوچەنۈشۇچەئوگەمچەئول-چىكىچەئورخۇنچەئورىياچەئوسمانيەپالمىراچەقەدىم" + + "كى پېرمىكچەپاسپاچەپەھلىۋىچە ئويما خەتپەھلىۋىچە شېئىرىي تىلپەھلىۋىچە" + + " كىتابى تىلفىنىكچەپوللارد تاۋۇشلىرىپارتىئانچە ئويما خەترېجاڭچەروڭگور" + + "وڭگورۇنىكچەسامارىچەساراتىچەقەدىمكى جەنۇبى ئەرەبچەسائۇراشتىراچەئىشار" + + "ەت تىلىشاۋىيانچەشاراداچەكۇداۋادچەسىنخالاچەسورا سامپىڭسۇنداچەسىيولوت" + + "ى-ناگرىچەسۈرىيەچەسۈرىيەچە ئەبجەتغەربىي سۈرىيەچەشەرقىي سۈرىيەچەتاگبا" + + "نۋاچەتاكرىچەتاي-لەچەيېڭى تاي-لەچەتامىلچەتاڭغۇتچەتايلاندچە-ۋىيېتنامچ" + + "ەتېلۇگۇچەتېڭۋارچەتىفىناغچەتاگالوگچەتاناچەتايلاندچەتىبەتچەتىرخۇتاچەئ" + + "ۇگارىتىكچەۋايچەكۆرۈنۈشچان تاۋۇشۋاراڭ كىشىتىۋولىئايقەدىمكى پارىسچەسۇ" + + "مېر-ئاككادىيان مىخ خەتيىچەئىرسىيەت ئاتالغۇماتېماتىكىلىق بەلگەبەلگەي" + + "ېزىلمىغانئورتاقيوچۇن يېزىق", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x000c, 0x000c, 0x000c, 0x0016, 0x0036, 0x0042, 0x0050, + 0x0058, 0x0062, 0x006c, 0x0076, 0x0082, 0x009f, 0x00b6, 0x00c2, + 0x00ea, 0x00f2, 0x00fc, 0x0106, 0x0157, 0x0163, 0x0169, 0x0175, + 0x0181, 0x018d, 0x0199, 0x01a3, 0x01de, 0x01f2, 0x0200, 0x022a, + 0x0247, 0x0268, 0x028e, 0x028e, 0x02a6, 0x02c7, 0x02d9, 0x02eb, + 0x02f5, 0x0307, 0x0315, 0x0327, 0x0339, 0x0339, 0x0343, 0x0353, + 0x036a, 0x0385, 0x0385, 0x0397, 0x03a7, 0x03d7, 0x03e1, 0x041a, + 0x0437, 0x0447, 0x046a, 0x0476, 0x0484, 0x0494, 0x04a2, 0x04b2, + // Entry 40 - 7F + 0x04c4, 0x04d4, 0x04e2, 0x04f4, 0x0504, 0x0514, 0x0524, 0x0532, + 0x0540, 0x055f, 0x0578, 0x0586, 0x0594, 0x05a2, 0x05b4, 0x05c6, + 0x05d6, 0x05e2, 0x05f4, 0x0604, 0x0604, 0x0618, 0x062e, 0x0656, + 0x0664, 0x0683, 0x0693, 0x06a5, 0x06a5, 0x06b5, 0x06c1, 0x06cb, + 0x06df, 0x06df, 0x06ed, 0x0719, 0x0729, 0x0735, 0x0741, 0x074d, + 0x075b, 0x076e, 0x077e, 0x078e, 0x079e, 0x07b0, 0x07b0, 0x07cf, + 0x07dd, 0x0801, 0x0829, 0x084f, 0x085d, 0x087e, 0x08a4, 0x08b2, + 0x08c6, 0x08d4, 0x08e4, 0x08f4, 0x091e, 0x0938, 0x094f, 0x0961, + // Entry 80 - BF + 0x0971, 0x0971, 0x0983, 0x0995, 0x09aa, 0x09b8, 0x09d7, 0x09e7, + 0x0a04, 0x0a21, 0x0a3e, 0x0a52, 0x0a60, 0x0a6f, 0x0a87, 0x0a95, + 0x0aa5, 0x0acc, 0x0adc, 0x0aec, 0x0afe, 0x0b10, 0x0b1c, 0x0b2e, + 0x0b3c, 0x0b4e, 0x0b64, 0x0b6e, 0x0b8d, 0x0ba4, 0x0bb2, 0x0bcf, + 0x0bfc, 0x0c04, 0x0c23, 0x0c48, 0x0c52, 0x0c66, 0x0c72, 0x0c87, + }, + }, + { // uk + ukScriptStr, + ukScriptIdx, + }, + { // ur + urScriptStr, + urScriptIdx, + }, + {}, // ur-IN + { // uz + uzScriptStr, + uzScriptIdx, + }, + { // uz-Arab + "عربی", + []uint16{ // 5 elements + 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, + }, + }, + { // uz-Cyrl + "АрабАрманБенгалиБопомофоБраиллеКирилДевангариҲабашГрузинЮнонГужаратиГурм" + + "ухиХангулХанСоддалаштирилганАнъанавийИбронийХираганаЯпонКатаканаХме" + + "рКаннадаКорейсЛаоЛотинМалайаламМўғулчаМьянмаОрияСинхалаТамилТелугуТ" + + "аанаТайТибетРамзларЁзилмаганУмумийНомаълум шрифт", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0012, 0x0012, + 0x0012, 0x0012, 0x0012, 0x0012, 0x0020, 0x0020, 0x0030, 0x0030, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x0048, 0x0048, 0x005a, 0x005a, 0x005a, + 0x005a, 0x005a, 0x005a, 0x005a, 0x0064, 0x0064, 0x0070, 0x0070, + 0x0070, 0x0070, 0x0078, 0x0088, 0x0096, 0x00a2, 0x00a8, 0x00a8, + 0x00c8, 0x00da, 0x00da, 0x00e8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, + 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x0100, 0x0100, 0x0100, 0x0110, + // Entry 40 - 7F + 0x0110, 0x0118, 0x0118, 0x0126, 0x0132, 0x0132, 0x0132, 0x0132, + 0x0138, 0x0138, 0x0138, 0x0142, 0x0142, 0x0142, 0x0142, 0x0142, + 0x0142, 0x0142, 0x0142, 0x0142, 0x0142, 0x0142, 0x0142, 0x0142, + 0x0142, 0x0142, 0x0142, 0x0154, 0x0154, 0x0162, 0x0162, 0x0162, + 0x0162, 0x0162, 0x016e, 0x016e, 0x016e, 0x016e, 0x016e, 0x016e, + 0x016e, 0x016e, 0x016e, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, + 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, + 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, + // Entry 80 - BF + 0x0176, 0x0176, 0x0176, 0x0184, 0x0184, 0x0184, 0x0184, 0x0184, + 0x0184, 0x0184, 0x0184, 0x0184, 0x0184, 0x0184, 0x0184, 0x018e, + 0x018e, 0x018e, 0x019a, 0x019a, 0x019a, 0x019a, 0x01a4, 0x01aa, + 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01b4, + 0x01b4, 0x01b4, 0x01b4, 0x01b4, 0x01c2, 0x01d4, 0x01e0, 0x01fb, + }, + }, + {}, // vai + {}, // vai-Latn + { // vi + viScriptStr, + viScriptIdx, + }, + {}, // vun + { // wae + "ArabišArmenišBengališKirillišDevanagariEthiopišGeorgišGričišGujaratiVere" + + "ifačtTraditionellHebräišJapanišKhmerKannadaKorianišLaotišLatinišMala" + + "isišBurmesišOriyaSingalesišTamilišTeluguThánaThaiSchriftlosUnkodiert" + + "i Schrift", + []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x000f, 0x000f, + 0x000f, 0x000f, 0x000f, 0x000f, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0018, 0x0021, 0x0021, 0x002b, 0x002b, 0x002b, + 0x002b, 0x002b, 0x002b, 0x002b, 0x0034, 0x0034, 0x003c, 0x003c, + 0x003c, 0x003c, 0x0044, 0x004c, 0x004c, 0x004c, 0x004c, 0x004c, + 0x0056, 0x0062, 0x0062, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, + 0x006b, 0x006b, 0x006b, 0x006b, 0x0073, 0x0073, 0x0073, 0x0073, + // Entry 40 - 7F + 0x0073, 0x0078, 0x0078, 0x007f, 0x0088, 0x0088, 0x0088, 0x0088, + 0x008f, 0x008f, 0x008f, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, + 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, + 0x0097, 0x0097, 0x0097, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, + 0x00a0, 0x00a0, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, 0x00a9, + 0x00a9, 0x00a9, 0x00a9, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + // Entry 80 - BF + 0x00ae, 0x00ae, 0x00ae, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, + 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00b9, 0x00c1, + 0x00c1, 0x00c1, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00cd, 0x00d1, + 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, + 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00d1, 0x00db, 0x00db, 0x00ed, + }, + }, + {}, // xog + {}, // yav + { // yi + "אַראַבישצירילישדעוואַנאַגאַריגריכישHebrגַלחיש", + []uint16{ // 76 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0010, 0x0010, 0x0010, + 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, + 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, + 0x0010, 0x0010, 0x0010, 0x001e, 0x001e, 0x003a, 0x003a, 0x003a, + 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, + 0x003a, 0x003a, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, + 0x0046, 0x0046, 0x0046, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, + 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, + // Entry 40 - 7F + 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, + 0x004a, 0x004a, 0x004a, 0x0056, + }, + }, + {}, // yo + {}, // yo-BJ + {}, // zgh + { // zh + zhScriptStr, + zhScriptIdx, + }, + { // zh-Hant + zhHantScriptStr, + zhHantScriptIdx, + }, + { // zh-Hant-HK + "西里爾文梵文埃塞俄比亞文格魯吉亞文古木基文韓文字母簡體字繁體字坎納達文老撾文拉丁字母馬拉雅拉姆文奧里雅文僧伽羅文泰米爾文它拿字母藏文", + []uint16{ // 153 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x0012, 0x0012, 0x0012, + 0x0012, 0x0012, 0x0012, 0x0012, 0x0024, 0x0024, 0x0033, 0x0033, + 0x0033, 0x0033, 0x0033, 0x0033, 0x003f, 0x004b, 0x004b, 0x004b, + 0x0054, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, + 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, 0x005d, + // Entry 40 - 7F + 0x005d, 0x005d, 0x005d, 0x0069, 0x0069, 0x0069, 0x0069, 0x0069, + 0x0072, 0x0072, 0x0072, 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, + 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, 0x007e, + 0x007e, 0x007e, 0x007e, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, + 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, 0x0090, + 0x0090, 0x0090, 0x0090, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, + 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, + 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, + // Entry 80 - BF + 0x009c, 0x009c, 0x009c, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, + 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00a8, 0x00b4, + 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00c0, 0x00c0, + 0x00c6, + }, + }, + { // zu + zuScriptStr, + zuScriptIdx, + }, +} + +var afScriptStr string = "" + // Size: 315 bytes + "ArabiesArmeensBengaalsBopomofoBrailleSirilliesDevanagariEtiopiesGeorgies" + + "GrieksGudjaratiGurmukhiHangulHanVereenvoudigde HanTradisionele HanHebree" + + "usHiraganaJapanneesKatakanaKhmerKannadaKoreaansLaoLatynMalabaarsMongools" + + "MianmarOriyaSinhalaTamilTeloegoeThaanaThaiTibettaansSimboleOngeskreweAlg" + + "emeenOnbekende skryfstelsel" + +var afScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x0016, 0x0016, 0x001e, 0x001e, + 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, + 0x0025, 0x0025, 0x0025, 0x002e, 0x002e, 0x0038, 0x0038, 0x0038, + 0x0038, 0x0038, 0x0038, 0x0038, 0x0040, 0x0040, 0x0048, 0x0048, + 0x0048, 0x0048, 0x004e, 0x0057, 0x005f, 0x0065, 0x0068, 0x0068, + 0x007a, 0x008a, 0x008a, 0x0092, 0x009a, 0x009a, 0x009a, 0x009a, + 0x009a, 0x009a, 0x009a, 0x009a, 0x00a3, 0x00a3, 0x00a3, 0x00ab, + // Entry 40 - 7F + 0x00ab, 0x00b0, 0x00b0, 0x00b7, 0x00bf, 0x00bf, 0x00bf, 0x00bf, + 0x00c2, 0x00c2, 0x00c2, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, + 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, + 0x00c7, 0x00c7, 0x00c7, 0x00d0, 0x00d0, 0x00d8, 0x00d8, 0x00d8, + 0x00d8, 0x00d8, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, 0x00df, + 0x00df, 0x00df, 0x00df, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, + 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, + 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, 0x00e4, + // Entry 80 - BF + 0x00e4, 0x00e4, 0x00e4, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, + 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00f0, + 0x00f0, 0x00f0, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00fe, 0x0102, + 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, + 0x010c, 0x010c, 0x010c, 0x010c, 0x0113, 0x011d, 0x0125, 0x013b, +} // Size: 360 bytes + +var amScriptStr string = "" + // Size: 505 bytes + "ዓረብኛአርሜንያዊቤንጋሊቦፖሞፎብሬይልሲይሪልክደቫንጋሪኢትዮፒክጆርጂያዊግሪክጉጃራቲጉርሙኪሐንጉልሃንቀለል ያለ ሃንባህላዊ" + + " ሃንእብራይስጥሂራጋናጃፓንኛካታካናክህመርካንአዳኮሪያኛላኦላቲንማላያልምሞንጎሊያኛምያንማርኦሪያሲንሃላታሚልተሉጉታናታይቲ" + + "ቤታንምልክቶችያልተጻፈየጋራያልታወቀ ስክሪፕት" + +var amScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x001e, 0x001e, + 0x001e, 0x001e, 0x001e, 0x001e, 0x002a, 0x002a, 0x0036, 0x0036, + 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, + 0x0042, 0x0042, 0x0042, 0x0051, 0x0051, 0x0060, 0x0060, 0x0060, + 0x0060, 0x0060, 0x0060, 0x0060, 0x006f, 0x006f, 0x007e, 0x007e, + 0x007e, 0x007e, 0x0087, 0x0093, 0x009f, 0x00ab, 0x00b1, 0x00b1, + 0x00c8, 0x00db, 0x00db, 0x00ed, 0x00f9, 0x00f9, 0x00f9, 0x00f9, + 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x0105, 0x0105, 0x0105, 0x0111, + // Entry 40 - 7F + 0x0111, 0x011d, 0x011d, 0x0129, 0x0135, 0x0135, 0x0135, 0x0135, + 0x013b, 0x013b, 0x013b, 0x0144, 0x0144, 0x0144, 0x0144, 0x0144, + 0x0144, 0x0144, 0x0144, 0x0144, 0x0144, 0x0144, 0x0144, 0x0144, + 0x0144, 0x0144, 0x0144, 0x0153, 0x0153, 0x0165, 0x0165, 0x0165, + 0x0165, 0x0165, 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, + 0x0174, 0x0174, 0x0174, 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, + 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, + 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, 0x017d, + // Entry 80 - BF + 0x017d, 0x017d, 0x017d, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, + 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0192, + 0x0192, 0x0192, 0x019b, 0x019b, 0x019b, 0x019b, 0x01a1, 0x01a7, + 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01b3, + 0x01b3, 0x01b3, 0x01b3, 0x01b3, 0x01c2, 0x01d1, 0x01da, 0x01f9, +} // Size: 360 bytes + +var arScriptStr string = "" + // Size: 2430 bytes + "العربيةالأرمينيةالباليةالباتاكالبنغاليةرموز بليسالبوبوموفوالهندوسيةالبرا" + + "يلالبجينيزالبهيديةمقاطع كندية أصلية موحدةالكاريةالتشاميةالشيروكيالسيرثا" + + "لقبطيةالقبرصيةالسيريليةالسيريلية السلافية الكنسية القديمةالديفاناجاريال" + + "ديسيريتالديموطيقيةالهيراطيقيةالهيروغليفيةالأثيوبيةالأبجدية الجورجية - أ" + + "سومتافرلي و نسخريالجورجيةالجلاجوليتيكالقوطيةاليونانيةالتاغجراتيةالجرمخي" + + "الهانغولالهانالهانونوالهان المبسطةالهان التقليديةالعبريةالهيراجاناالباه" + + "وه همونجالكتكانا أو الهيراجاناالمجرية القديمةاندس - هارابانالإيطالية ال" + + "قديمةالجاويةاليابانيةالكياه لىالكتكاناالخاروشتىالخميريةالكاناداالكوريةا" + + "لانااللاواللاتينية - متغير فراكتراللاتينية - متغير غيلىاللاتينيةالليبتش" + + "ا - رونجالليمبوالخطية أالخطية بالليسيةالليديةالمانداينيةالمايا الهيروغل" + + "يفيةالميرويتيكالماليالامالمغوليةمونالميانمارالعربية الشمالية القديمةأنك" + + "والأوجهامالأورخونالأورياالأوسمانياالبيرميكية القديمةالفاجسباالفينيقيةال" + + "صوتيات الجماءرنجورنجوالرونيالساراتيالعربية الجنوبية القديمةالشوانيالسين" + + "هالاالسوندانيةالسيلوتي ناغريالسريانيةالسريانية الأسترنجيليةالسريانية ال" + + "غربيةالسريانية الشرقيةالتاجبانواالتاي ليالتاى لى الجديدالتاميليةالتيلجو" + + "التينجوارالتيفيناغالتغالوغيةالثعنةالتايلانديةالتبتيةالأجاريتيكيةالفايال" + + "كلام المرئيالفارسية القديمةالكتابة المسمارية الأكدية السومريةالييالمورو" + + "ثرموزغير مكتوبعامنظام كتابة غير معروف" + +var arScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000e, 0x000e, 0x0020, 0x0020, + 0x002e, 0x002e, 0x002e, 0x003c, 0x004e, 0x005f, 0x0073, 0x0085, + 0x0093, 0x00a3, 0x00b3, 0x00b3, 0x00de, 0x00ec, 0x00fc, 0x010c, + 0x0118, 0x0126, 0x0136, 0x0148, 0x0189, 0x01a1, 0x01b3, 0x01b3, + 0x01c9, 0x01df, 0x01f7, 0x01f7, 0x0209, 0x024f, 0x025f, 0x0277, + 0x0285, 0x0285, 0x0297, 0x02ad, 0x02bb, 0x02cb, 0x02d5, 0x02e5, + 0x02fe, 0x031b, 0x031b, 0x0329, 0x033d, 0x033d, 0x0356, 0x0380, + 0x039d, 0x03b6, 0x03d7, 0x03e5, 0x03f7, 0x03f7, 0x0408, 0x0418, + // Entry 40 - 7F + 0x042a, 0x043a, 0x043a, 0x044a, 0x0458, 0x0458, 0x0458, 0x0462, + 0x046c, 0x0498, 0x04c0, 0x04d2, 0x04ed, 0x04fb, 0x050a, 0x0519, + 0x0519, 0x0519, 0x0527, 0x0535, 0x0535, 0x054b, 0x054b, 0x0570, + 0x0570, 0x0570, 0x0584, 0x0598, 0x0598, 0x05a8, 0x05ae, 0x05ae, + 0x05ae, 0x05ae, 0x05c0, 0x05ee, 0x05ee, 0x05ee, 0x05f6, 0x05f6, + 0x0606, 0x0606, 0x0616, 0x0624, 0x0638, 0x0638, 0x0638, 0x065b, + 0x066b, 0x066b, 0x066b, 0x066b, 0x067d, 0x069a, 0x069a, 0x069a, + 0x06aa, 0x06b6, 0x06b6, 0x06c6, 0x06f4, 0x06f4, 0x06f4, 0x0702, + // Entry 80 - BF + 0x0702, 0x0702, 0x0702, 0x0714, 0x0714, 0x0728, 0x0743, 0x0755, + 0x0780, 0x07a1, 0x07c2, 0x07d6, 0x07d6, 0x07e5, 0x0801, 0x0813, + 0x0813, 0x0813, 0x0821, 0x0833, 0x0845, 0x0859, 0x0865, 0x087b, + 0x0889, 0x0889, 0x08a1, 0x08ab, 0x08c4, 0x08c4, 0x08c4, 0x08e3, + 0x0924, 0x092c, 0x093a, 0x093a, 0x0942, 0x0953, 0x0959, 0x097e, +} // Size: 360 bytes + +var azScriptStr string = "" + // Size: 1043 bytes + "ərəbarmierməniavestanbalibatakbenqalblissymbolsbopomofobrahmibraylbuqinb" + + "uhidkakmbirləşmiş kanada yerli yazısıkariyançamçirokisirtkoptikkiprkiril" + + "qədimi kilsa kirilidevanaqarideseretmisir demotikmisir hiyeratikmisir hi" + + "yeroqlifefiopgürcü xutsurigürcüqlaqolitikqotikyunanqucaratqurmuxihanqılh" + + "anhanunuSadələşdirilmiş HanƏnənəvi Hanibraniiraqanapahav monqkatakana və" + + "ya hiraqanaqədimi macarhindistanqədimi italyalıcavayaponkayax likatakana" + + "xaroştikxmerkannadakoreyaktilannalaofraktur latınıgael latınılatınlepçəl" + + "imbulusianludianmandayenmaniçayenmaya hiyeroqlifimeroytikmalayalammonqol" + + "munmeytey mayekmyanmarnkooğamol çikiorxonoriyaosmanyaqədimi permikfaqs-p" + + "afliflpkitab paxlavifoenikpolard fonetikprtirecəngronqoronqoruniksamarit" + + "ansaratisaurastraişarət yazısışavyansinhalsundansiloti nəqrisiryakestran" + + "gela süryanicetaqbanvatay letəzə tay lutamiltavtteluqutengvartifinaqtaqa" + + "loqthanataytibetuqaritvaydanışma səsləriqədimi farssumer-akadyan kuneyfo" + + "rmyizmthsimvollaryazısızümumi yazınaməlum skript" + +var azScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000a, 0x0011, 0x0018, + 0x001c, 0x001c, 0x001c, 0x0021, 0x0027, 0x0032, 0x003a, 0x0040, + 0x0045, 0x004a, 0x004f, 0x0053, 0x0075, 0x007c, 0x0080, 0x0087, + 0x008b, 0x0091, 0x0095, 0x009a, 0x00ae, 0x00b8, 0x00bf, 0x00bf, + 0x00cc, 0x00db, 0x00eb, 0x00eb, 0x00f0, 0x00ff, 0x0106, 0x0110, + 0x0115, 0x0115, 0x011a, 0x0121, 0x0128, 0x012f, 0x0132, 0x0138, + 0x014f, 0x015d, 0x015d, 0x0163, 0x016a, 0x016a, 0x0174, 0x018b, + 0x0198, 0x01a1, 0x01b2, 0x01b6, 0x01bb, 0x01bb, 0x01c3, 0x01cb, + // Entry 40 - 7F + 0x01d3, 0x01d8, 0x01d8, 0x01df, 0x01e5, 0x01e5, 0x01e8, 0x01ed, + 0x01f0, 0x0200, 0x020d, 0x0213, 0x021a, 0x021f, 0x021f, 0x021f, + 0x021f, 0x021f, 0x0225, 0x022b, 0x022b, 0x0233, 0x023d, 0x024d, + 0x024d, 0x024d, 0x0255, 0x025e, 0x025e, 0x0264, 0x0267, 0x0267, + 0x0273, 0x0273, 0x027a, 0x027a, 0x027a, 0x027a, 0x027d, 0x027d, + 0x0282, 0x028a, 0x028f, 0x0294, 0x029b, 0x029b, 0x029b, 0x02a9, + 0x02b0, 0x02b3, 0x02b6, 0x02c3, 0x02c9, 0x02d7, 0x02db, 0x02e2, + 0x02ec, 0x02f1, 0x02fa, 0x0300, 0x0300, 0x0309, 0x031a, 0x0321, + // Entry 80 - BF + 0x0321, 0x0321, 0x0321, 0x0327, 0x0327, 0x032d, 0x033a, 0x0340, + 0x0355, 0x0355, 0x0355, 0x035d, 0x035d, 0x0363, 0x0370, 0x0375, + 0x0375, 0x0379, 0x037f, 0x0386, 0x038d, 0x0394, 0x0399, 0x039c, + 0x03a1, 0x03a1, 0x03a7, 0x03aa, 0x03bd, 0x03bd, 0x03bd, 0x03c9, + 0x03e0, 0x03e2, 0x03e2, 0x03e6, 0x03ef, 0x03f8, 0x0404, 0x0413, +} // Size: 360 bytes + +var bgScriptStr string = "" + // Size: 2324 bytes + "арабскаАрамейскаарменскаАвестанскаБалийскиБатакскабенгалскаБлис символиб" + + "опомофоБрахмиБрайловаБугинскаБухидЧакмаУнифицирани символи на канадски " + + "аборигениКарийскаХамитскаЧерокиКиртКоптскаКипърскакирилицадеванагариДез" + + "еретЕгипетско демотично писмоЕгипетско йератично писмоЕгипетски йерогли" + + "фиетиопскаГрузинска хуцуригрузинскаГлаголическаГотическагръцкагуджарати" + + "гурмукхихангълкитайскаХанунуопростен китайскитрадиционен китайскиивритх" + + "ираганаПахау хмонгКатакана или ХираганаСтароунгарскаХарапскаДревно итал" + + "ийскаЯванскаяпонскаКая ЛикатаканаКхароштхикхмерскаканнадакорейскаКайтхи" + + "ЛанналаоскаЛатинска фрактураГалска латинскалатиницаЛепчаЛимбуЛинейна АЛ" + + "инейна БЛицийскаЛидийскаМандаринскаМанихейскаЙероглифи на МаитеМероитск" + + "амалаяламмонголскаМунМанипурибирманскаН’КоОгамическаОл ЧикиОрхоно-енисе" + + "йскаорияОсманскаДревно пермскаФагс-паПахлавскаФиникийскаПисменост Полар" + + "дРонго-ронгоРуническаСамаританскаСаратиСаураштрасинхалскаСунданскаСилот" + + "и НагриСирийскаСирийска естрангелоЗападна сирийскаИзточна сирийскаТагба" + + "нваТай ЛеНова Тай ЛетамилскателугуТагалогтаанатайскатибетскаУгаритскаВа" + + "йскаВидима речСтароперсийскаШумеро-акадски клинописЙиМатематически симв" + + "олисимволибез писменостобщанепозната писменост" + +var bgScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000e, 0x0020, 0x0030, 0x0044, + 0x0054, 0x0054, 0x0054, 0x0064, 0x0076, 0x008d, 0x009d, 0x00a9, + 0x00b9, 0x00c9, 0x00d3, 0x00dd, 0x012b, 0x013b, 0x014b, 0x0157, + 0x015f, 0x016d, 0x017d, 0x018d, 0x018d, 0x01a1, 0x01af, 0x01af, + 0x01df, 0x020f, 0x0234, 0x0234, 0x0244, 0x0263, 0x0275, 0x028d, + 0x029f, 0x029f, 0x02ab, 0x02bd, 0x02cd, 0x02d9, 0x02e9, 0x02f5, + 0x0316, 0x033d, 0x033d, 0x0347, 0x0357, 0x0357, 0x036c, 0x0394, + 0x03ae, 0x03be, 0x03dd, 0x03eb, 0x03f9, 0x03f9, 0x0404, 0x0414, + // Entry 40 - 7F + 0x0426, 0x0436, 0x0436, 0x0444, 0x0454, 0x0454, 0x0460, 0x046a, + 0x0476, 0x0497, 0x04b4, 0x04c4, 0x04ce, 0x04d8, 0x04e9, 0x04fa, + 0x04fa, 0x04fa, 0x050a, 0x051a, 0x051a, 0x0530, 0x0544, 0x0566, + 0x0566, 0x0566, 0x0578, 0x0588, 0x0588, 0x059a, 0x05a0, 0x05a0, + 0x05b0, 0x05b0, 0x05c2, 0x05c2, 0x05c2, 0x05c2, 0x05cb, 0x05cb, + 0x05df, 0x05ec, 0x060b, 0x0613, 0x0623, 0x0623, 0x0623, 0x063e, + 0x064b, 0x064b, 0x064b, 0x065d, 0x0671, 0x0690, 0x0690, 0x0690, + 0x06a5, 0x06b7, 0x06cf, 0x06db, 0x06db, 0x06ed, 0x06ed, 0x06ed, + // Entry 80 - BF + 0x06ed, 0x06ed, 0x06ed, 0x06ff, 0x06ff, 0x0711, 0x0728, 0x0738, + 0x075d, 0x077c, 0x079b, 0x07ab, 0x07ab, 0x07b6, 0x07ca, 0x07da, + 0x07da, 0x07da, 0x07e6, 0x07e6, 0x07e6, 0x07f4, 0x07fe, 0x080a, + 0x081a, 0x081a, 0x082c, 0x0838, 0x084b, 0x084b, 0x084b, 0x0867, + 0x0893, 0x0897, 0x0897, 0x08c0, 0x08ce, 0x08e7, 0x08ef, 0x0914, +} // Size: 360 bytes + +var bnScriptStr string = "" + // Size: 3576 bytes + "আরবিআরমিআর্মেনীয়আভেসতানবালীয়বাটাকবাংলাব্লিসপ্রতীকবোপোমোফোব্রাহ্মীব্রেই" + + "লবুগিবুহিডচাকমাসংযুক্ত কানাডিয়ান অ্যাব্রোজিনিয়ান সিলেবিক্সক্যারিয়ান" + + "চ্যামচেরোকিকির্টকোপ্টিকসাইপ্রোয়েটসিরিলিকপ্রাচীন চার্চ স্লাভোনিক সিরিল" + + "িকদেবনাগরিদেসেরাতমিশরীয় ডেমোটিকমিশরীয় হায়রেটিকমিশরীয় হায়ারোগ্লিপই" + + "থিওপিয়জর্জিয় খুৎসুরিজর্জিয়ানগ্লাগোলিটিকগোথিকগ্রিকগুজরাটিগুরুমুখিহাঙ" + + "্গুলহ্যানহ্যানুনুসরলিকৃত হ্যানঐতিহ্যবাহী হ্যানহিব্রুহিরাগানাফাহাও মঙকা" + + "টাকানা অথবা হিরাগানাপুরোনো হাঙ্গেরীয়সিন্ধুপ্রাচীন ইতালিজাভানিজজাপানীক" + + "ায়াহ লিকাটাকানাখরোষ্ঠীখমেরকানাড়াকোরিয়ানকাইথিলান্নালাওফ্রাক্টুর ল্যা" + + "টিনগ্যালিক ল্যাটিনল্যাটিনলেপ্চালিম্বুলিনিয়ার এলিনিয়ার বিলাইসিয়ানলাই" + + "ডিয়ানম্যান্ডায়ীনম্যানিচাইনমায়ান হায়ারোগ্লিপমেরোইটিকমালায়ালামমোঙ্গ" + + "োলীয়মুনমেইটেই মায়েকমায়ানমারএনকোওঘামওল চিকিঅর্খোনওড়িয়াওসমানিয়প্রা" + + "চীন পার্মিকফাগ্স-পাখদিত পাহলভিসল্টার পাহলভিপুস্তক পাহলভিফিনিশিয়পোলার্" + + "ড ধ্বনিকপার্থিয়নরেজ্যাঙ্গরোঙ্গোরোঙ্গোরুনিকসমেরিটনসারাতিসৌরাষ্ট্রচিহ্ন" + + " লিখনসাভিয়ানসিংহলিসান্দানিজসিলেটি নাগরিসিরিয়াকএস্ট্রেঙ্গেলো সিরিয়াকপশ" + + "্চিমাঞ্চলীয় সিরিয়াকপূর্বাঞ্চলীয় সিরিয়াকটাগোওয়ানাতাইলেনতুন তাই লুত" + + "ামিলতাই ভিয়েৎতেলেগুতেঙ্গোয়ারতিফিনাগটাগালগথানাথাইতিব্বতিউগারিটিকভাইদৃ" + + "শ্যমান ভাষাপ্রাচীন ফার্সিসুমের-আক্কাদীয় কীলকরূপউইকাইগানিতিক চিহ্নপ্রত" + + "ীকসমুহঅলিখিতসাধারনঅজানা লিপি" + +var bnScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x0018, 0x0033, 0x0048, + 0x005a, 0x005a, 0x005a, 0x0069, 0x0078, 0x0099, 0x00b1, 0x00c9, + 0x00db, 0x00e7, 0x00f6, 0x0105, 0x0186, 0x01a4, 0x01b3, 0x01c5, + 0x01d4, 0x01e9, 0x020a, 0x021f, 0x0276, 0x028e, 0x02a3, 0x02a3, + 0x02ce, 0x02ff, 0x0339, 0x0339, 0x0351, 0x037c, 0x0397, 0x03b8, + 0x03c7, 0x03c7, 0x03d6, 0x03eb, 0x0403, 0x0418, 0x0427, 0x043f, + 0x0464, 0x0492, 0x0492, 0x04a4, 0x04bc, 0x04bc, 0x04d2, 0x0510, + 0x0541, 0x0553, 0x0578, 0x058d, 0x059f, 0x059f, 0x05b8, 0x05d0, + // Entry 40 - 7F + 0x05e5, 0x05f1, 0x05f1, 0x0606, 0x061e, 0x061e, 0x062d, 0x063f, + 0x0648, 0x0679, 0x06a4, 0x06b9, 0x06cb, 0x06dd, 0x06f9, 0x0718, + 0x0718, 0x0718, 0x0733, 0x074e, 0x074e, 0x0772, 0x0790, 0x07c7, + 0x07c7, 0x07c7, 0x07df, 0x07fd, 0x07fd, 0x081b, 0x0824, 0x0824, + 0x0849, 0x0849, 0x0864, 0x0864, 0x0864, 0x0864, 0x0870, 0x0870, + 0x087c, 0x088f, 0x08a1, 0x08b6, 0x08ce, 0x08ce, 0x08ce, 0x08f9, + 0x090f, 0x092e, 0x0953, 0x0978, 0x0990, 0x09b8, 0x09d3, 0x09ee, + 0x0a12, 0x0a21, 0x0a36, 0x0a48, 0x0a48, 0x0a63, 0x0a7f, 0x0a97, + // Entry 80 - BF + 0x0a97, 0x0a97, 0x0a97, 0x0aa9, 0x0aa9, 0x0ac4, 0x0ae6, 0x0afe, + 0x0b3e, 0x0b81, 0x0bc1, 0x0bdf, 0x0bdf, 0x0bee, 0x0c0b, 0x0c1a, + 0x0c1a, 0x0c36, 0x0c48, 0x0c66, 0x0c7b, 0x0c8d, 0x0c99, 0x0ca2, + 0x0cb7, 0x0cb7, 0x0ccf, 0x0cd8, 0x0cfd, 0x0cfd, 0x0cfd, 0x0d25, + 0x0d66, 0x0d6c, 0x0d75, 0x0d9a, 0x0db8, 0x0dca, 0x0ddc, 0x0df8, +} // Size: 360 bytes + +var caScriptStr string = "" + // Size: 1535 bytes + "afakaàrabarameu imperialarmeniavèsticbalinèsbamumbassa vahbatakbengalísí" + + "mbols Blissbopomofobrahmibraillebuginèsbuhidchakmasíl·labes dels aboríge" + + "ns canadencs unificatscariàchamcherokeecirthcoptexipriotaciríl·licciríl·" + + "lic de l’antic eslau eclesiàsticdevanagarideserettaquigrafia Duployédemò" + + "tic egipcihieràtic egipcijeroglífic egipcietiòpicgeorgià hucurigeorgiàgl" + + "agolíticgòticgranthagrecgujaratigurmukhihangulhanhanunoohan simplificath" + + "an tradicionalhebreuhiraganajeroglífic anatolipahawh hmongkatakana o hir" + + "aganahongarès anticescriptura de la vall de l’Induscursiva antigajavanès" + + "japonèsjürchenkayah likatakanakharosthikhmerkhojakannadacoreàkpellekaith" + + "ilannalaollatí frakturllatí gaèlicllatílepchalimbulineal Alineal Blisulo" + + "malicilidimandaicmaniqueujeroglífics maiesmendecursiva meroíticameroític" + + "malaiàlammongolmoonmromanipuríbirmàantic nord-aràbicnabateugeban’Konü sh" + + "uoghamsantaliorkhonoriyaosmanyapalmirèantic pèrmicphagspapahlavi inscrip" + + "cionalpsalter pahlavipahlavifenicipollard miaoparthià inscripcionalrejan" + + "grongo-rongorúnicsamaritàsaratisud-aràbic anticsaurashtraescriptura de s" + + "ignesshaviàshradadevangarisingalèssora sompengsundanèssyloti nagrisiríac" + + "siríac estrangelosiríac occidentalsiríac orientaltagbanwatakritai lenou " + + "tai luetàmiltanguttai viettelugutengwartifinaghtagàlogthaanatailandèstib" + + "etàtirhutugaríticvaillenguatge visiblevarang kshitiwoleaipersa anticcune" + + "ïforme sumeri-accadiyiheretatnotació matemàticasímbolssense escripturac" + + "omúescriptura desconeguda" + +var caScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0005, 0x0005, 0x0005, 0x000a, 0x0019, 0x001f, 0x0027, + 0x002f, 0x0034, 0x003d, 0x0042, 0x004a, 0x0058, 0x0060, 0x0066, + 0x006d, 0x0075, 0x007a, 0x0080, 0x00af, 0x00b5, 0x00b9, 0x00c1, + 0x00c6, 0x00cb, 0x00d3, 0x00de, 0x0109, 0x0113, 0x011a, 0x012e, + 0x013d, 0x014d, 0x015f, 0x015f, 0x0167, 0x0176, 0x017e, 0x0189, + 0x018f, 0x0196, 0x019a, 0x01a2, 0x01aa, 0x01b0, 0x01b3, 0x01ba, + 0x01c9, 0x01d8, 0x01d8, 0x01de, 0x01e6, 0x01f9, 0x0205, 0x0218, + 0x0227, 0x0249, 0x0257, 0x025f, 0x0267, 0x026f, 0x0277, 0x027f, + // Entry 40 - 7F + 0x0288, 0x028d, 0x0292, 0x0299, 0x029f, 0x02a5, 0x02ab, 0x02b0, + 0x02b3, 0x02c1, 0x02cf, 0x02d5, 0x02db, 0x02e0, 0x02e8, 0x02f0, + 0x02f4, 0x02f8, 0x02fc, 0x0300, 0x0300, 0x0307, 0x030f, 0x0321, + 0x0326, 0x0338, 0x0341, 0x034b, 0x034b, 0x0351, 0x0355, 0x0358, + 0x0361, 0x0361, 0x0367, 0x0379, 0x0380, 0x0384, 0x038a, 0x0391, + 0x0396, 0x039d, 0x03a3, 0x03a8, 0x03af, 0x03b7, 0x03b7, 0x03c4, + 0x03cb, 0x03e0, 0x03ef, 0x03f6, 0x03fc, 0x0408, 0x041e, 0x0424, + 0x042f, 0x0435, 0x043e, 0x0444, 0x0455, 0x045f, 0x0473, 0x047a, + // Entry 80 - BF + 0x0480, 0x0480, 0x0489, 0x0492, 0x049e, 0x04a7, 0x04b3, 0x04ba, + 0x04cc, 0x04de, 0x04ee, 0x04f6, 0x04fb, 0x0501, 0x050c, 0x0512, + 0x0518, 0x0520, 0x0526, 0x052d, 0x0535, 0x053d, 0x0543, 0x054d, + 0x0554, 0x055a, 0x0563, 0x0566, 0x0578, 0x0585, 0x058b, 0x0596, + 0x05af, 0x05b1, 0x05b8, 0x05cc, 0x05d4, 0x05e4, 0x05e9, 0x05ff, +} // Size: 360 bytes + +var csScriptStr string = "" + // Size: 1891 bytes + "afakakavkazskoalbánskéarabskéaramejské (imperiální)arménskéavestánskébal" + + "ijskébamumskébassa vahbatackébengálskéBlissovo písmobopomofobráhmíBraill" + + "ovo písmobuginskébuhidskéčakmaslabičné písmo kanadských domorodcůkarijsk" + + "éčamčerokíkirtkoptskékyperskécyrilicecyrilce - staroslověnskádévanágárí" + + "deseretDuployého těsnopisegyptské démotickéegyptské hieratickéegyptské h" + + "ieroglyfyelbasanskéetiopskégruzínské chutsurigruzínskéhlaholicegotickégr" + + "anthařeckégudžarátígurmukhihangulhanhanunóohan (zjednodušené)han (tradič" + + "ní)hebrejskéhiraganaanatolské hieroglyfyhmongskéjaponské slabičnéstaroma" + + "ďarskéharappskéetruskéjavánskéjaponskédžürčenskékayah likatakanakháróšt" + + "híkhmerskéchodžikikannadskékorejskékpellekaithilannalaoskélatinka - lome" + + "nálatinka - galskálatinkalepčskélimbulineární Alineární BFraserovolomalý" + + "kijskélýdskémahádžanímandejskémanichejskémayské hieroglyfymendskémeroiti" + + "cké psacímeroitickémalajlámskémodímongolskéMoonovomromejtej majek (manip" + + "urské)myanmarskéstaroseveroarabskénabatejskénaxi geban’konü-šuogamskésan" + + "tálské (ol chiki)orchonskéurijskéosmansképalmýrsképau cin haustaropermsk" + + "éphags-papahlavské klínovépahlavské žalmovépahlavské knižnífénickéPolla" + + "rdova fonetická abecedaparthské klínovéredžanskérongorongorunovésamařské" + + "saratistarojihoarabskésaurášterskéSignWritingShawova abecedašáradásiddha" + + "mchudábádísinhálskésora sompengsundskésylhetskésyrskésyrské - estrangelo" + + "syrské - západnísyrské - východnítagbanwatakrítai letai lü novétamilskét" + + "anguttai viettelugskétengwarberberskétagalskéthaanathajskétibetskétirhut" + + "augaritské klínovévaividitelná řečvarang kšitikarolínské (woleai)starope" + + "rské klínové písmosumero-akkadské klínové písmoyimatematický zápissymbol" + + "ybez zápisuobecnéneznámé písmo" + +var csScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0005, 0x0018, 0x0018, 0x0020, 0x0039, 0x0043, 0x004f, + 0x0058, 0x0061, 0x006a, 0x0072, 0x007d, 0x008c, 0x0094, 0x009c, + 0x00ac, 0x00b5, 0x00be, 0x00c4, 0x00ec, 0x00f5, 0x00f9, 0x0101, + 0x0105, 0x010d, 0x0116, 0x011e, 0x0138, 0x0146, 0x014d, 0x0161, + 0x0176, 0x018b, 0x019f, 0x01aa, 0x01b3, 0x01c7, 0x01d2, 0x01db, + 0x01e3, 0x01ea, 0x01f1, 0x01fd, 0x0205, 0x020b, 0x020e, 0x0216, + 0x022a, 0x023a, 0x023a, 0x0244, 0x024c, 0x0261, 0x026a, 0x027e, + 0x028d, 0x0297, 0x029f, 0x02a9, 0x02b2, 0x02c0, 0x02c8, 0x02d0, + // Entry 40 - 7F + 0x02dd, 0x02e6, 0x02ef, 0x02f9, 0x0302, 0x0308, 0x030e, 0x0313, + 0x031a, 0x032b, 0x033c, 0x0343, 0x034c, 0x0351, 0x035d, 0x0369, + 0x0372, 0x0376, 0x0380, 0x0388, 0x0394, 0x039e, 0x03aa, 0x03bc, + 0x03c4, 0x03d6, 0x03e1, 0x03ee, 0x03f3, 0x03fd, 0x0404, 0x0407, + 0x0421, 0x0421, 0x042c, 0x043f, 0x044a, 0x0453, 0x0459, 0x0460, + 0x0468, 0x047e, 0x0488, 0x0490, 0x0499, 0x04a4, 0x04af, 0x04bc, + 0x04c4, 0x04d8, 0x04ec, 0x04ff, 0x0508, 0x0525, 0x0538, 0x0543, + 0x054d, 0x0554, 0x055e, 0x0564, 0x0575, 0x0584, 0x058f, 0x059e, + // Entry 80 - BF + 0x05a7, 0x05ae, 0x05ba, 0x05c5, 0x05d1, 0x05d9, 0x05e3, 0x05ea, + 0x05fe, 0x0611, 0x0625, 0x062d, 0x0633, 0x0639, 0x0646, 0x064f, + 0x0655, 0x065d, 0x0666, 0x066d, 0x0677, 0x0680, 0x0686, 0x068e, + 0x0697, 0x069e, 0x06b2, 0x06b5, 0x06c5, 0x06d2, 0x06e7, 0x0704, + 0x0725, 0x0727, 0x0727, 0x073a, 0x0741, 0x074c, 0x0753, 0x0763, +} // Size: 360 bytes + +var daScriptStr string = "" + // Size: 1443 bytes + "afakaarabiskarmiarmenskavestanskbalinesiskbamumbassabatakbengaliblissymb" + + "olerbopomofobramiskbrailleskriftbuginesiskbuhidcakmoprindelige canadiske" + + " symbolerkarianskchamcherokeecirtkoptiskcypriotiskkyrilliskkyrillisk - o" + + "ldkirkeslavisk variantdevanagarideseretDuploya-stenografiegyptisk demoti" + + "skegyptisk hieratiskegyptiske hieroglyfferetiopiskgeorgisk kutsurigeorgi" + + "skglagolitiskgotiskgranthagræskgujaratigurmukhihangulhanhanunooforenklet" + + " hantraditionelt hanhebraiskhiraganaanatolske hieroglyfferpahawh hmongka" + + "takana eller hiraganaoldungarskindusOlditaliskjavanesiskjapanskjurchenka" + + "ya likatakanakharoshtikhmerkhojkikannadakoreanskkpellekthilannalaolatins" + + "k - frakturvariantlatinsk - gælisk variantlatinsklepchalimbulineær Aline" + + "ær Blisulomalykisklydiskmandaiskmanikæiskmayahieroglyffermendemetroitis" + + "k sammenhængendemeroitiskmalayalammongolskmoonmroomeitei-mayekburmesiskg" + + "ammelt nordarabisknabateisknakhi geban’konüshuoghamol-chikiorkhonoriyaos" + + "manniskpalmyrenskoldpermiskphags-paphliphlppahlavifønikiskpollardtegnprt" + + "irejangrongo-rongorunersamaritansksaratioldsørarabisksaurashtrategnskrif" + + "tshavisksharadakhudawadisingalesisksorasundanesisksyloti nagrisyrisksyri" + + "sk - estrangelovariantvestsyriskøstsyriakisktagbanwatakritai letai lueta" + + "milsktanguttavttelugutengwartifinaghtagalogthaanathailandsktibetansktirh" + + "utaugaritiskvaisynlig talevarang kshitiwoleaioldpersisksumero-akkadisk c" + + "uneiformyiarvetzmthzsymuden skriftsprogfællesukendt skriftsprog" + +var daScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0005, 0x0005, 0x0005, 0x000c, 0x0010, 0x0017, 0x0020, + 0x002a, 0x002f, 0x0034, 0x0039, 0x0040, 0x004c, 0x0054, 0x005b, + 0x0068, 0x0072, 0x0077, 0x007b, 0x0099, 0x00a1, 0x00a5, 0x00ad, + 0x00b1, 0x00b8, 0x00c2, 0x00cb, 0x00ee, 0x00f8, 0x00ff, 0x0111, + 0x0122, 0x0134, 0x014a, 0x014a, 0x0152, 0x0162, 0x016a, 0x0175, + 0x017b, 0x0182, 0x0188, 0x0190, 0x0198, 0x019e, 0x01a1, 0x01a8, + 0x01b5, 0x01c5, 0x01c5, 0x01cd, 0x01d5, 0x01eb, 0x01f7, 0x020e, + 0x0218, 0x021d, 0x0227, 0x0231, 0x0238, 0x023f, 0x0246, 0x024e, + // Entry 40 - 7F + 0x0257, 0x025c, 0x0262, 0x0269, 0x0271, 0x0277, 0x027b, 0x0280, + 0x0283, 0x029b, 0x02b4, 0x02bb, 0x02c1, 0x02c6, 0x02cf, 0x02d8, + 0x02dc, 0x02e0, 0x02e6, 0x02ec, 0x02ec, 0x02f4, 0x02fe, 0x030e, + 0x0313, 0x032d, 0x0336, 0x033f, 0x033f, 0x0347, 0x034b, 0x034f, + 0x035b, 0x035b, 0x0364, 0x0377, 0x0380, 0x038a, 0x0390, 0x0396, + 0x039b, 0x03a3, 0x03a9, 0x03ae, 0x03b7, 0x03c1, 0x03c1, 0x03cb, + 0x03d3, 0x03d7, 0x03db, 0x03e2, 0x03eb, 0x03f6, 0x03fa, 0x0400, + 0x040b, 0x0410, 0x041b, 0x0421, 0x042f, 0x0439, 0x0443, 0x044a, + // Entry 80 - BF + 0x0451, 0x0451, 0x045a, 0x0465, 0x0469, 0x0474, 0x0480, 0x0486, + 0x04a0, 0x04aa, 0x04b7, 0x04bf, 0x04c4, 0x04ca, 0x04d1, 0x04d8, + 0x04de, 0x04e2, 0x04e8, 0x04ef, 0x04f7, 0x04fe, 0x0504, 0x050e, + 0x0517, 0x051e, 0x0527, 0x052a, 0x0535, 0x0542, 0x0548, 0x0552, + 0x056b, 0x056d, 0x0572, 0x0576, 0x057a, 0x058a, 0x0591, 0x05a3, +} // Size: 360 bytes + +var deScriptStr string = "" + // Size: 1682 bytes + "AfakaKaukasisch-AlbanischArabischArmiArmenischAvestischBalinesischBamunB" + + "assaBattakischBengalischBliss-SymboleBopomofoBrahmiBlindenschriftBugines" + + "ischBuhidChakmaUCASKarischChamCherokeeCirthKoptischZypriotischKyrillisch" + + "AltkirchenslawischDevanagariDeseretDuployanischÄgyptisch - DemotischÄgyp" + + "tisch - HieratischÄgyptische HieroglyphenElbasanischÄthiopischKhutsuriGe" + + "orgischGlagolitischGotischGranthaGriechischGujaratiGurmukhiHangulChinesi" + + "schHanunooVereinfachtes ChinesischTraditionelles ChinesischHebräischHira" + + "ganaHieroglyphen-LuwischPahawh HmongKatakana oder HiraganaAltungarischIn" + + "dus-SchriftAltitalischJavanesischJapanischJurchenKayah LiKatakanaKharosh" + + "thiKhmerKhojkiKannadaKoreanischKpelleKaithiLannaLaotischLateinisch - Fra" + + "ktur-VarianteLateinisch - Gälische VarianteLateinischLepchaLimbuLinear A" + + "Linear BFraserLomaLykischLydischMahajaniMandäischManichäischMaya-Hierogl" + + "yphenMendeMeroitisch kursivMeroitischMalayalamModiMongolischMoonMroMeite" + + "i MayekBirmanischAltnordarabischNabatäischGebaN’KoFrauenschriftOghamOl C" + + "hikiOrchon-RunenOriyaOsmanischPalmyrenischPau Cin HauAltpermischPhags-pa" + + "Buch-PahlaviPsalter-PahlaviPahlaviPhönizischPollard PhonetischParthischR" + + "ejangRongorongoRunenschriftSamaritanischSaratiAltsüdarabischSaurashtraGe" + + "bärdenspracheShaw-AlphabetSharadaSiddhamKhudawadiSinghalesischSora Sompe" + + "ngSundanesischSyloti NagriSyrischSyrisch - Estrangelo-VarianteWestsyrisc" + + "hOstsyrischTagbanwaTakriTai LeTai LueTamilischXixiaTai-VietTeluguTengwar" + + "TifinaghTagalogThaanaThaiTibetischTirhutaUgaritischVaiSichtbare SpracheV" + + "arang KshitiWoleaianischAltpersischSumerisch-akkadische KeilschriftYiGee" + + "rbter SchriftwertMathematische NotationSymboleSchriftlosUnbestimmtUnbeka" + + "nnte Schrift" + +var deScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0005, 0x0019, 0x0019, 0x0021, 0x0025, 0x002e, 0x0037, + 0x0042, 0x0047, 0x004c, 0x0056, 0x0060, 0x006d, 0x0075, 0x007b, + 0x0089, 0x0094, 0x0099, 0x009f, 0x00a3, 0x00aa, 0x00ae, 0x00b6, + 0x00bb, 0x00c3, 0x00ce, 0x00d8, 0x00ea, 0x00f4, 0x00fb, 0x0107, + 0x011d, 0x0134, 0x014c, 0x0157, 0x0162, 0x016a, 0x0173, 0x017f, + 0x0186, 0x018d, 0x0197, 0x019f, 0x01a7, 0x01ad, 0x01b7, 0x01be, + 0x01d6, 0x01ef, 0x01ef, 0x01f9, 0x0201, 0x0215, 0x0221, 0x0237, + 0x0243, 0x0250, 0x025b, 0x0266, 0x026f, 0x0276, 0x027e, 0x0286, + // Entry 40 - 7F + 0x0290, 0x0295, 0x029b, 0x02a2, 0x02ac, 0x02b2, 0x02b8, 0x02bd, + 0x02c5, 0x02e2, 0x0301, 0x030b, 0x0311, 0x0316, 0x031e, 0x0326, + 0x032c, 0x0330, 0x0337, 0x033e, 0x0346, 0x0350, 0x035c, 0x036d, + 0x0372, 0x0383, 0x038d, 0x0396, 0x039a, 0x03a4, 0x03a8, 0x03ab, + 0x03b7, 0x03b7, 0x03c1, 0x03d0, 0x03db, 0x03df, 0x03e5, 0x03f2, + 0x03f7, 0x03ff, 0x040b, 0x0410, 0x0419, 0x0425, 0x0430, 0x043b, + 0x0443, 0x044f, 0x045e, 0x0465, 0x0470, 0x0482, 0x048b, 0x0491, + 0x049b, 0x04a7, 0x04b4, 0x04ba, 0x04c9, 0x04d3, 0x04e3, 0x04f0, + // Entry 80 - BF + 0x04f7, 0x04fe, 0x0507, 0x0514, 0x0520, 0x052c, 0x0538, 0x053f, + 0x055c, 0x0567, 0x0571, 0x0579, 0x057e, 0x0584, 0x058b, 0x0594, + 0x0599, 0x05a1, 0x05a7, 0x05ae, 0x05b6, 0x05bd, 0x05c3, 0x05c7, + 0x05d0, 0x05d7, 0x05e1, 0x05e4, 0x05f5, 0x0602, 0x060e, 0x0619, + 0x0639, 0x063b, 0x064f, 0x0665, 0x066c, 0x0676, 0x0680, 0x0692, +} // Size: 360 bytes + +var elScriptStr string = "" + // Size: 2635 bytes + "ΑραβικόΑυτοκρατορικό ΑραμαϊκόΑρμενικόΑβεστάνΜπαλινίζΜπατάκΜπενγκάλιΣύμβο" + + "λα BlissΜποπομόφοΜπραχμίΜπράιγΜπούγκιςΜπουχίντΤσάκμαΕνοποιημένοι Καναδε" + + "ζικοί Συλλαβισμοί ΙθαγενώνΚαριάνΤσαμΤσερόκιΣερθΚοπτικόΚυπριακόΚυριλλικό" + + "Παλαιό Εκκλησιαστικό Σλαβικό ΚυριλλικόΝτεβαναγκάριΝτεσερέΛαϊκό Αιγυπτια" + + "κόΙερατικό ΑιγυπτιακόΑιγυπτιακά ΙερογλυφικάΑιθιοπικόΓεωργιανό Κχουτσούρ" + + "ιΓεωργιανόΓκλαγκολιτικόΓοτθικόΕλληνικόΓκουγιαράτιΓκουρμουκχίΧανγκούλΧαν" + + "ΧανούνουΑπλοποιημένο ΧανΠαραδοσιακό ΧανΕβραϊκόΧιραγκάναΠαχάχ ΧμονγκΚατα" + + "κάνα ή ΧιραγκάναΠαλαιό ΟυγγρικόΊνδουςΠαλαιό ΙταλικόΙαβανεζικόΙαπωνικόΚα" + + "γιάχ ΛιΚατακάναΚαρόσθιΧμερΚανάνταΚορεατικόΚαϊθίΛάνναΛάοςΦράκτουρ Λατινι" + + "κόΓαελικό ΛατινικόΛατινικόΛέπτσαΛιμπούΓραμμικό ΑΓραμμικό ΒΛυκιανικόΛυδι" + + "ανικόΜανδαϊκόΜανιχαϊκόΙερογλυφικά ΜάγιαΜεροϊτικόΜαλαγιάλαμΜογγολικόΜουν" + + "Μεϊτέι ΜάγεκΜιανμάρΝ’ΚοΌγκχαμΟλ ΤσίκιΌρκχονΟρίγιαΟσμάνγιαΠαλαιό Περμικό" + + "Παγκς-παΕπιγραφικό ΠαχλάβιΨάλτερ ΠαχλάβιΜπουκ ΠαχλαβίΦοινικικόΦωνητικό " + + "ΠόλαρντΕπιγραφικό ΠαρθιάνΡετζάνγκΡονγκορόνγκοΡουνίκΣαμαριτικόΣαράθιΣαου" + + "ράστραΝοηματική γραφήΣαβιανόΣινχάλαΣουνδανικόΣυλότι ΝάγκριΣυριακόΕστραν" + + "τζέλο ΣυριακόΔυτικό ΣυριακόΑνατολικό ΣυριακόΤαγκμάνγουαΤάι ΛεΝέο Τάι Λο" + + "ύεΤαμίλΤάι ΒιέτΤελούγκουΤεγνγουάρΤιφινάγκΤαγκαλόγκΘαανάΤαϊλανδικόΘιβετι" + + "ανόΟυγκαριτικόΒάιΟρατή ομιλίαΠαλαιό ΠερσικόΣούμερο-Ακάντιαν ΚουνεϊφόρμΓ" + + "ιΚληρονομημένοΜαθηματική παράστασηΣύμβολαΆγραφοΚοινόΆγνωστη γραφή" + +var elScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000e, 0x0039, 0x0049, 0x0057, + 0x0067, 0x0067, 0x0067, 0x0073, 0x0085, 0x0099, 0x00ab, 0x00b9, + 0x00c5, 0x00d5, 0x00e5, 0x00f1, 0x0148, 0x0154, 0x015c, 0x016a, + 0x0172, 0x0180, 0x0190, 0x01a2, 0x01eb, 0x0203, 0x0211, 0x0211, + 0x0230, 0x0255, 0x0280, 0x0280, 0x0292, 0x02b9, 0x02cb, 0x02e5, + 0x02f3, 0x02f3, 0x0303, 0x0319, 0x032f, 0x033f, 0x0345, 0x0355, + 0x0374, 0x0391, 0x0391, 0x039f, 0x03b1, 0x03b1, 0x03c8, 0x03ee, + 0x040b, 0x0417, 0x0432, 0x0446, 0x0456, 0x0456, 0x0467, 0x0477, + // Entry 40 - 7F + 0x0485, 0x048d, 0x048d, 0x049b, 0x04ad, 0x04ad, 0x04b7, 0x04c1, + 0x04c9, 0x04ea, 0x0509, 0x0519, 0x0525, 0x0531, 0x0544, 0x0557, + 0x0557, 0x0557, 0x0569, 0x057b, 0x057b, 0x058b, 0x059d, 0x05be, + 0x05be, 0x05be, 0x05d0, 0x05e4, 0x05e4, 0x05f6, 0x05fe, 0x05fe, + 0x0615, 0x0615, 0x0623, 0x0623, 0x0623, 0x0623, 0x062c, 0x062c, + 0x0638, 0x0647, 0x0653, 0x065f, 0x066f, 0x066f, 0x066f, 0x068a, + 0x0699, 0x06bc, 0x06d7, 0x06f0, 0x0702, 0x0721, 0x0744, 0x0754, + 0x076c, 0x0778, 0x078c, 0x0798, 0x0798, 0x07ac, 0x07c9, 0x07d7, + // Entry 80 - BF + 0x07d7, 0x07d7, 0x07d7, 0x07e5, 0x07e5, 0x07f9, 0x0812, 0x0820, + 0x0845, 0x0860, 0x0881, 0x0897, 0x0897, 0x08a2, 0x08b8, 0x08c2, + 0x08c2, 0x08d1, 0x08e3, 0x08f5, 0x0905, 0x0917, 0x0921, 0x0935, + 0x0947, 0x0947, 0x095d, 0x0963, 0x097a, 0x097a, 0x097a, 0x0995, + 0x09c9, 0x09cd, 0x09e7, 0x0a0e, 0x0a1c, 0x0a28, 0x0a32, 0x0a4b, +} // Size: 360 bytes + +var enScriptStr string = "" + // Size: 1531 bytes + "AfakaCaucasian AlbanianAhomArabicImperial AramaicArmenianAvestanBalinese" + + "BamumBassa VahBatakBengaliBlissymbolsBopomofoBrahmiBrailleBugineseBuhidC" + + "hakmaUnified Canadian Aboriginal SyllabicsCarianChamCherokeeCirthCopticC" + + "ypriotCyrillicOld Church Slavonic CyrillicDevanagariDeseretDuployan shor" + + "thandEgyptian demoticEgyptian hieraticEgyptian hieroglyphsElbasanEthiopi" + + "cGeorgian KhutsuriGeorgianGlagoliticGothicGranthaGreekGujaratiGurmukhiHa" + + "ngulHanHanunooSimplified HanTraditional HanHatranHebrewHiraganaAnatolian" + + " HieroglyphsPahawh HmongJapanese syllabariesOld HungarianIndusOld Italic" + + "JavaneseJapaneseJurchenKayah LiKatakanaKharoshthiKhmerKhojkiKannadaKorea" + + "nKpelleKaithiLannaLaoFraktur LatinGaelic LatinLatinLepchaLimbuLinear ALi" + + "near BFraserLomaLycianLydianMahajaniMandaeanManichaeanMayan hieroglyphsM" + + "endeMeroitic CursiveMeroiticMalayalamModiMongolianMoonMroMeitei MayekMul" + + "taniMyanmarOld North ArabianNabataeanNaxi GebaN’KoNüshuOghamOl ChikiOrkh" + + "onOriyaOsmanyaPalmyrenePau Cin HauOld PermicPhags-paInscriptional Pahlav" + + "iPsalter PahlaviBook PahlaviPhoenicianPollard PhoneticInscriptional Part" + + "hianRejangRongorongoRunicSamaritanSaratiOld South ArabianSaurashtraSignW" + + "ritingShavianSharadaSiddhamKhudawadiSinhalaSora SompengSundaneseSyloti N" + + "agriSyriacEstrangelo SyriacWestern SyriacEastern SyriacTagbanwaTakriTai " + + "LeNew Tai LueTamilTangutTai VietTeluguTengwarTifinaghTagalogThaanaThaiTi" + + "betanTirhutaUgariticVaiVisible SpeechVarang KshitiWoleaiOld PersianSumer" + + "o-Akkadian CuneiformYiInheritedMathematical NotationSymbolsUnwrittenComm" + + "onUnknown Script" + +var enScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0005, 0x0017, 0x001b, 0x0021, 0x0031, 0x0039, 0x0040, + 0x0048, 0x004d, 0x0056, 0x005b, 0x0062, 0x006d, 0x0075, 0x007b, + 0x0082, 0x008a, 0x008f, 0x0095, 0x00ba, 0x00c0, 0x00c4, 0x00cc, + 0x00d1, 0x00d7, 0x00de, 0x00e6, 0x0102, 0x010c, 0x0113, 0x0125, + 0x0135, 0x0146, 0x015a, 0x0161, 0x0169, 0x017a, 0x0182, 0x018c, + 0x0192, 0x0199, 0x019e, 0x01a6, 0x01ae, 0x01b4, 0x01b7, 0x01be, + 0x01cc, 0x01db, 0x01e1, 0x01e7, 0x01ef, 0x0204, 0x0210, 0x0224, + 0x0231, 0x0236, 0x0240, 0x0248, 0x0250, 0x0257, 0x025f, 0x0267, + // Entry 40 - 7F + 0x0271, 0x0276, 0x027c, 0x0283, 0x0289, 0x028f, 0x0295, 0x029a, + 0x029d, 0x02aa, 0x02b6, 0x02bb, 0x02c1, 0x02c6, 0x02ce, 0x02d6, + 0x02dc, 0x02e0, 0x02e6, 0x02ec, 0x02f4, 0x02fc, 0x0306, 0x0317, + 0x031c, 0x032c, 0x0334, 0x033d, 0x0341, 0x034a, 0x034e, 0x0351, + 0x035d, 0x0364, 0x036b, 0x037c, 0x0385, 0x038e, 0x0394, 0x039a, + 0x039f, 0x03a7, 0x03ad, 0x03b2, 0x03b9, 0x03c2, 0x03cd, 0x03d7, + 0x03df, 0x03f4, 0x0403, 0x040f, 0x0419, 0x0429, 0x043f, 0x0445, + 0x044f, 0x0454, 0x045d, 0x0463, 0x0474, 0x047e, 0x0489, 0x0490, + // Entry 80 - BF + 0x0497, 0x049e, 0x04a7, 0x04ae, 0x04ba, 0x04c3, 0x04cf, 0x04d5, + 0x04e6, 0x04f4, 0x0502, 0x050a, 0x050f, 0x0515, 0x0520, 0x0525, + 0x052b, 0x0533, 0x0539, 0x0540, 0x0548, 0x054f, 0x0555, 0x0559, + 0x0560, 0x0567, 0x056f, 0x0572, 0x0580, 0x058d, 0x0593, 0x059e, + 0x05b7, 0x05b9, 0x05c2, 0x05d7, 0x05de, 0x05e7, 0x05ed, 0x05fb, +} // Size: 360 bytes + +const enGBScriptStr string = "" + +var enGBScriptIdx = []uint16{ // 0 elements + +} // Size: 24 bytes + +var esScriptStr string = "" + // Size: 1165 bytes + "árabearmenioavésticobalinésbatakbengalísímbolos blisbopomofobrahmibraill" + + "ebuginésbuhidsímbolos aborígenes canadienses unificadoscariochamcherokee" + + "cirthcoptochipriotacirílicocirílico del antiguo eslavo eclesiásticodevan" + + "agarideseretegipcio demóticoegipcio hieráticojeroglíficos egipciosetiópi" + + "cogeorgiano eclesiásticogeorgianoglagolíticogóticogriegogujaratigurmujih" + + "angulhanhanunoohan simplificadohan tradicionalhebreohiraganapahawh hmong" + + "katakana o hiraganahúngaro antiguoIndio (harappan)antigua bastardillajav" + + "anésjaponéskayah likatakanakharosthijemercanaréscoreanolannalaolatino fr" + + "akturlatino gaélicolatínlepchalimbulineal Alineal Bliciolidiomandeojerog" + + "líficos mayasmeroíticomalayálammongolmoonmanipuribirmanon’kooghamol ciki" + + "orkhonoriyaosmaniyapermiano antiguophags-pafenicioPollard Miaorejangrong" + + "o-rongorúnicosaratisaurashtraSignWritingshavianocingaléssundanéssyloti n" + + "agrisiriacosiriaco estrangelosiriaco occidentalsiriaco orientaltagbanúat" + + "ai lenuevo tai luetamiltelugutengwartifinaghtagalothaanatailandéstibetan" + + "ougaríticovailenguaje visiblepersa antiguocuneiforme sumerio-acadioyiher" + + "edadosímbolosno escritocomúnalfabeto desconocido" + +var esScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x000d, 0x0016, + 0x001e, 0x001e, 0x001e, 0x0023, 0x002b, 0x0039, 0x0041, 0x0047, + 0x004e, 0x0056, 0x005b, 0x005b, 0x0087, 0x008c, 0x0090, 0x0098, + 0x009d, 0x00a2, 0x00ab, 0x00b4, 0x00de, 0x00e8, 0x00ef, 0x00ef, + 0x0100, 0x0112, 0x0128, 0x0128, 0x0131, 0x0148, 0x0151, 0x015d, + 0x0164, 0x0164, 0x016a, 0x0172, 0x0179, 0x017f, 0x0182, 0x0189, + 0x0199, 0x01a8, 0x01a8, 0x01ae, 0x01b6, 0x01b6, 0x01c2, 0x01d5, + 0x01e5, 0x01f5, 0x0208, 0x0210, 0x0218, 0x0218, 0x0220, 0x0228, + // Entry 40 - 7F + 0x0231, 0x0236, 0x0236, 0x023e, 0x0245, 0x0245, 0x0245, 0x024a, + 0x024d, 0x025b, 0x026a, 0x0270, 0x0276, 0x027b, 0x0283, 0x028b, + 0x028b, 0x028b, 0x0290, 0x0295, 0x0295, 0x029b, 0x029b, 0x02ae, + 0x02ae, 0x02ae, 0x02b8, 0x02c2, 0x02c2, 0x02c8, 0x02cc, 0x02cc, + 0x02d4, 0x02d4, 0x02db, 0x02db, 0x02db, 0x02db, 0x02e1, 0x02e1, + 0x02e6, 0x02ed, 0x02f3, 0x02f8, 0x0300, 0x0300, 0x0300, 0x0310, + 0x0318, 0x0318, 0x0318, 0x0318, 0x031f, 0x032b, 0x032b, 0x0331, + 0x033c, 0x0343, 0x0343, 0x0349, 0x0349, 0x0353, 0x035e, 0x0366, + // Entry 80 - BF + 0x0366, 0x0366, 0x0366, 0x036f, 0x036f, 0x0378, 0x0384, 0x038b, + 0x039d, 0x03af, 0x03bf, 0x03c8, 0x03c8, 0x03ce, 0x03db, 0x03e0, + 0x03e0, 0x03e0, 0x03e6, 0x03ed, 0x03f5, 0x03fb, 0x0401, 0x040b, + 0x0413, 0x0413, 0x041d, 0x0420, 0x0430, 0x0430, 0x0430, 0x043d, + 0x0456, 0x0458, 0x0460, 0x0460, 0x0469, 0x0473, 0x0479, 0x048d, +} // Size: 360 bytes + +const es419ScriptStr string = "" + +var es419ScriptIdx = []uint16{ // 0 elements + +} // Size: 24 bytes + +var etScriptStr string = "" + // Size: 1541 bytes + "afakaalbaaniahomiaraabiavanaarameaarmeeniaavestabalibamumibassabatakiben" + + "galiBlissi sümbolidbopomofobraahmipunktkiribugibuhiditšaakmaKanada põlis" + + "rahvaste ühtlustatud silpkirikaariatšaamitšerokiiCirthikoptiKüprose silp" + + "kirikirillitsakürilliline kirikuslaavidevanaagarideseretiDuployé kiirkir" + + "iegiptuse demootilineegiptuse hieraatilineegiptuse hieroglüüfkiriElbasan" + + "ietioopiahutsurigruusiaglagoolitsagootigranthakreekagudžaratigurmukhikor" + + "eahanihanunoolihtsustatud hanitraditsiooniline haniHatraheebreahiraganaA" + + "natoolia hieroglüüfkiriphahau-hmongi kirijaapani silpkirjadvanaungariInd" + + "usevanaitalijaavajaapanitšurtšenikaja-liikatakanakharoshthikhmeerihodžki" + + "kannadakorea segakirikpellekaithitai-thamilaoladina fraktuurkiriladina g" + + "aeliladinaleptšalimbulineaarkiri Alineaarkiri Blisulomalüükialüüdiamahaa" + + "džanimandeamanimaaja hieroglüüfkirimendemeroe kursiivkirimeroemalajalami" + + "modimongoliMoonimruumeiteiMultanibirmaPõhja-AraabiaNabateanasinkoonüšuog" + + "amsantaliOrhonioriaosmaniPalmyravanapermiphakpapahlavi raidkiripahlavi p" + + "salmikiripahlavi raamatukirifoiniikiaPollardi miaopartia raidkiriredžang" + + "irongorongoruunikiriSamaariasaratiLõuna-AraabiasauraštraviipekiriShaw’ k" + + "irišaaradasiddhamihudavadisingalisorasundasilotisüüriasüüria estrangelol" + + "äänesüüriaidasüüriatagbanvataakritai-lööuus tai-lõõtamilitanguuditai-vi" + + "etiteluguTengwaritifinagitagalogitaanataitiibetitirhutaugaritivainähtava" + + " kõnehoovoleaivanapärsiasumeri-akadi kiilkirijiipäritudmatemaatiline täh" + + "istussümbolidkirjakeeletaüldinemääramata kiri" + +var etScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0005, 0x000c, 0x0011, 0x0018, 0x0022, 0x002a, 0x0030, + 0x0034, 0x003a, 0x003f, 0x0045, 0x004c, 0x005c, 0x0064, 0x006b, + 0x0074, 0x0078, 0x007e, 0x0086, 0x00b1, 0x00b7, 0x00be, 0x00c7, + 0x00cd, 0x00d2, 0x00e3, 0x00ed, 0x0106, 0x0111, 0x0119, 0x012a, + 0x013e, 0x0153, 0x016c, 0x0174, 0x017c, 0x0183, 0x018a, 0x0195, + 0x019a, 0x01a1, 0x01a7, 0x01b1, 0x01b9, 0x01be, 0x01c2, 0x01c9, + 0x01da, 0x01ef, 0x01f4, 0x01fb, 0x0203, 0x021d, 0x022f, 0x0241, + 0x024b, 0x0251, 0x025a, 0x025f, 0x0266, 0x0271, 0x0279, 0x0281, + // Entry 40 - 7F + 0x028b, 0x0292, 0x0299, 0x02a0, 0x02ae, 0x02b4, 0x02ba, 0x02c3, + 0x02c6, 0x02d9, 0x02e5, 0x02eb, 0x02f2, 0x02f7, 0x0304, 0x0311, + 0x0315, 0x0319, 0x0321, 0x0329, 0x0334, 0x033a, 0x033e, 0x0354, + 0x0359, 0x036a, 0x036f, 0x0379, 0x037d, 0x0384, 0x0389, 0x038d, + 0x0393, 0x039a, 0x039f, 0x03ad, 0x03b4, 0x03b8, 0x03bc, 0x03c2, + 0x03c6, 0x03cd, 0x03d3, 0x03d7, 0x03dd, 0x03e4, 0x03e4, 0x03ed, + 0x03f3, 0x0403, 0x0415, 0x0428, 0x0431, 0x043e, 0x044d, 0x0456, + 0x0460, 0x0469, 0x0471, 0x0477, 0x0485, 0x048f, 0x0498, 0x04a4, + // Entry 80 - BF + 0x04ac, 0x04b4, 0x04bc, 0x04c3, 0x04c7, 0x04cc, 0x04d2, 0x04da, + 0x04ed, 0x04fc, 0x0507, 0x050f, 0x0515, 0x051e, 0x052b, 0x0531, + 0x0539, 0x0542, 0x0548, 0x0550, 0x0558, 0x0560, 0x0565, 0x0568, + 0x056f, 0x0576, 0x057d, 0x0580, 0x058e, 0x0591, 0x0597, 0x05a2, + 0x05b7, 0x05ba, 0x05c2, 0x05d9, 0x05e2, 0x05ee, 0x05f5, 0x0605, +} // Size: 360 bytes + +var faScriptStr string = "" + // Size: 1849 bytes + "آلبانیایی قفقازیعربیآرامی هخامنشیارمنیاوستاییبالیاییباتاکیبنگالینمادهای " + + "بلیسبوپوموفوبراهمیبریلبوگیاییبوهیدچاکماییکاریچمیچروکیاییکرتقبطیقبرسیسیر" + + "یلیدوناگریدیسرتیکاهنی مصریهیروگلیف مصریاتیوپیاییگرجی خوتسوریگرجیگلاگولی" + + "تیگوتییونانیگجراتیگورومخیهانگولهانهانونوییهان ساده\u200cشدههان سنتیعبری" + + "هیراگاناهیروگلیف آناتولیسیلابی\u200cهای ژاپنیمجاری باستانایندوسایتالی ب" + + "استانجاوه\u200cایژاپنیکایالیکاتاکاناخمریخواجکیکاناراکره\u200cایکثیلانای" + + "یلائوسیلاتینی فراکتورلاتینی گیلیلاتینیلیمباییخطی الفخطی بلسیاییلدیاییمن" + + "ده\u200cایمانویهیروگلیف مایاییمروییتیمالایالامیمغولیمونیمایک میتیمیانما" + + "رعربی شمالی باستاننبطیاوگامیاورخونیاوریه\u200cایپالمیراییپرمی باستانپهل" + + "وی کتیبه\u200cایپهلوی زبوریپهلوی کتابیفنیقیپارتی کتیبه\u200cایرجنگیرونی" + + "سامریساراتیعربی جنوبی باستانسوراشتراییشاویسینهالیسیلوتی نگاریسریانیسریا" + + "نی سطرنجیلیسریانی غربیسریانی شرقیتگبنواییتامیلیتلوگوییتنگوارتیفیناغیتاگ" + + "الوگیتانه\u200cایتایلندیتبتیاوگاریتیویاییگفتار قابل مشاهدهفارسی باستانم" + + "یخی سومری‐اکدیییموروثیعلائم ریاضیعلائمنانوشتهمشترکخط نامشخص" + +var faScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x001f, 0x001f, 0x0027, 0x0040, 0x004a, 0x0058, + 0x0066, 0x0066, 0x0066, 0x0072, 0x007e, 0x0095, 0x00a5, 0x00b1, + 0x00b9, 0x00c7, 0x00d1, 0x00df, 0x00df, 0x00e7, 0x00ed, 0x00fd, + 0x0103, 0x010b, 0x0115, 0x0121, 0x0121, 0x012f, 0x013b, 0x013b, + 0x013b, 0x014e, 0x0167, 0x0167, 0x0179, 0x0190, 0x0198, 0x01aa, + 0x01b2, 0x01b2, 0x01be, 0x01ca, 0x01d8, 0x01e4, 0x01ea, 0x01fa, + 0x0212, 0x0221, 0x0221, 0x0229, 0x0239, 0x0258, 0x0258, 0x0278, + 0x028f, 0x029b, 0x02b4, 0x02c3, 0x02cd, 0x02cd, 0x02d9, 0x02e9, + // Entry 40 - 7F + 0x02e9, 0x02f1, 0x02fd, 0x0309, 0x0316, 0x0316, 0x031c, 0x0328, + 0x0334, 0x034f, 0x0364, 0x0370, 0x0370, 0x037e, 0x038b, 0x0394, + 0x0394, 0x0394, 0x03a0, 0x03ac, 0x03ac, 0x03bb, 0x03c5, 0x03e2, + 0x03e2, 0x03e2, 0x03f0, 0x0404, 0x0404, 0x040e, 0x0416, 0x0416, + 0x0427, 0x0427, 0x0435, 0x0455, 0x045d, 0x045d, 0x045d, 0x045d, + 0x0469, 0x0469, 0x0477, 0x0488, 0x0488, 0x049a, 0x049a, 0x04af, + 0x04af, 0x04cb, 0x04e0, 0x04f5, 0x04ff, 0x04ff, 0x051b, 0x0525, + 0x0525, 0x052d, 0x0537, 0x0543, 0x0563, 0x0577, 0x0577, 0x057f, + // Entry 80 - BF + 0x057f, 0x057f, 0x057f, 0x058d, 0x058d, 0x058d, 0x05a4, 0x05b0, + 0x05cd, 0x05e2, 0x05f7, 0x0607, 0x0607, 0x0607, 0x0607, 0x0613, + 0x0613, 0x0613, 0x0621, 0x062d, 0x063d, 0x064d, 0x065c, 0x066a, + 0x0672, 0x0672, 0x0682, 0x068c, 0x06ac, 0x06ac, 0x06ac, 0x06c3, + 0x06e1, 0x06e5, 0x06f1, 0x0706, 0x0710, 0x071e, 0x0728, 0x0739, +} // Size: 360 bytes + +var fiScriptStr string = "" + // Size: 2325 bytes + "afakakaukasianalbanialainenahomarabialainenvaltakunnanaramealainenarmeni" + + "alainenavestalainenbalilainenbamumbassabatakilainenbengalilainenbliss-sy" + + "mbolitbopomofobrahmibraille-pistekirjoitusbugilainenbuhidilainenchakmala" + + "inenkanadalaisten alkuperäiskansojen yhtenäistetty tavukirjoituskaariala" + + "inentšamilainencherokeelainencirthkoptilainenmuinaiskyproslainenkyrillin" + + "enkyrillinen muinaiskirkkoslaavimuunnelmadevanagarideseretDuployén pikak" + + "irjoitusegyptiläinen demoottinenegyptiläinen hieraattinenegyptiläiset hi" + + "eroglyfitelbasanilainenetiopialainenmuinaisgeorgialainengeorgialainengla" + + "goliittinengoottilainengranthakreikkalainengudžaratilainengurmukhihangul" + + "kiinalainen hanhanunoolainenkiinalainen yksinkertaistettu hankiinalainen" + + " perinteinen hanhatralainenheprealainenhiraganaanatolialaiset hieroglyfi" + + "tpahawh hmonghiragana tai katakanamuinaisunkarilaineninduslainenmuinaisi" + + "talialainenjaavalainenjapanilainendžurtšenkayah likatakanakharosthikhmer" + + "iläinenkhojkikannadalainenkorealainenkpellekaithilannalaolainenlatinalai" + + "nen fraktuuramuunnelmalatinalainen gaelimuunnelmalatinalainenlepchalaine" + + "nlimbulainenlineaari-Alineaari-BFraserin aakkosetlomalyykialainenlyydial" + + "ainenmahajanilainenmandealainenmanikealainenmaya-hieroglyfitmendemeroiit" + + "tinen kursiivikirjoitusmeroiittinenmalajalamilainenmodi-aakkosetmongolil" + + "ainenmoon-kohokirjoitusmromeiteimultanilainenburmalainenmuinaispohjoisar" + + "abialainennabatealainennaxi geban’konüshuogamol chikiorkhonorijalainenos" + + "manjalainenpalmyralainenzotuallaimuinaispermiläinenphags-papiirtokirjoit" + + "uspahlavilainenpsalttaripahlavilainenkirjapahlavilainenfoinikialainenPol" + + "lardin foneettinenpiirtokirjoitusparthialainenrejangrongorongoriimukirjo" + + "itussamarianaramealainensaratimuinaiseteläarabialainensaurashtraSignWrit" + + "ingshaw’lainenšaradasiddham-tavukirjoituskhudabadisinhalilainensorang so" + + "mpengsundalainensyloti nagrisyyrialainensyyrialainen estrangelo-muunnelm" + + "asyyrialainen läntinen muunnelmasyyrialainen itäinen muunnelmatagbanwala" + + "inentakritailelainenuusi tailuelainentamililainentanguttai viettelugulai" + + "nentengwartifinaghtagalogilainenthaanathailainentiibetiläinentirhutaugar" + + "itilainenvailainennäkyvä puhevarang kshitiwoleaimuinaispersialainensumer" + + "ilais-akkadilainen nuolenpääkirjoitusyiläinenperittymatemaattinensymboli" + + "tkirjoittamatonmäärittämätöntuntematon kirjoitusjärjestelmä" + +var fiScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0005, 0x001b, 0x001f, 0x002b, 0x0042, 0x004f, 0x005b, + 0x0065, 0x006a, 0x006f, 0x007b, 0x0088, 0x0096, 0x009e, 0x00a4, + 0x00ba, 0x00c4, 0x00d0, 0x00dc, 0x011a, 0x0126, 0x0132, 0x0140, + 0x0145, 0x0150, 0x0163, 0x016d, 0x0194, 0x019e, 0x01a5, 0x01bc, + 0x01d5, 0x01ef, 0x0208, 0x0216, 0x0223, 0x0237, 0x0244, 0x0252, + 0x025e, 0x0265, 0x0272, 0x0282, 0x028a, 0x0290, 0x029f, 0x02ac, + 0x02cd, 0x02e8, 0x02f3, 0x02ff, 0x0307, 0x0321, 0x032d, 0x0342, + 0x0355, 0x0360, 0x0373, 0x037e, 0x038a, 0x0394, 0x039c, 0x03a4, + // Entry 40 - 7F + 0x03ad, 0x03ba, 0x03c0, 0x03cd, 0x03d8, 0x03de, 0x03e4, 0x03e9, + 0x03f2, 0x0411, 0x042c, 0x0438, 0x0444, 0x044f, 0x0459, 0x0463, + 0x0474, 0x0478, 0x0484, 0x0490, 0x049e, 0x04aa, 0x04b7, 0x04c7, + 0x04cc, 0x04ea, 0x04f6, 0x0506, 0x0513, 0x0520, 0x0532, 0x0535, + 0x053b, 0x0548, 0x0553, 0x056d, 0x057a, 0x0583, 0x0589, 0x058f, + 0x0593, 0x059b, 0x05a1, 0x05ac, 0x05b9, 0x05c6, 0x05cf, 0x05e2, + 0x05ea, 0x0606, 0x061c, 0x062e, 0x063c, 0x0651, 0x066d, 0x0673, + 0x067d, 0x068b, 0x069f, 0x06a5, 0x06be, 0x06c8, 0x06d3, 0x06e0, + // Entry 80 - BF + 0x06e7, 0x06fc, 0x0705, 0x0712, 0x0720, 0x072b, 0x0737, 0x0743, + 0x0764, 0x0784, 0x07a3, 0x07b1, 0x07b6, 0x07c1, 0x07d2, 0x07de, + 0x07e4, 0x07ec, 0x07f8, 0x07ff, 0x0807, 0x0815, 0x081b, 0x0825, + 0x0833, 0x083a, 0x0847, 0x0850, 0x085d, 0x086a, 0x0870, 0x0883, + 0x08af, 0x08b8, 0x08bf, 0x08cc, 0x08d4, 0x08e2, 0x08f4, 0x0915, +} // Size: 360 bytes + +var filScriptStr string = "" + // Size: 311 bytes + "ArabicArmenianBengaliBopomofoBrailleCyrillicDevanagariEthiopicGeorgianGr" + + "eekGujaratiGurmukhiHangulHanPinasimpleng HanTradisyonal na HanHebrewHira" + + "ganaJapaneseKatakanaKhmerKannadaKoreanLaoLatinMalayalamMongolianMyanmarO" + + "riyaSinhalaTamilTeluguThaanaThaiTibetanMga SimboloHindi NakasulatKaraniw" + + "anHindi Kilalang Script" + +var filScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x0015, 0x0015, 0x001d, 0x001d, + 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, + 0x0024, 0x0024, 0x0024, 0x002c, 0x002c, 0x0036, 0x0036, 0x0036, + 0x0036, 0x0036, 0x0036, 0x0036, 0x003e, 0x003e, 0x0046, 0x0046, + 0x0046, 0x0046, 0x004b, 0x0053, 0x005b, 0x0061, 0x0064, 0x0064, + 0x0074, 0x0086, 0x0086, 0x008c, 0x0094, 0x0094, 0x0094, 0x0094, + 0x0094, 0x0094, 0x0094, 0x0094, 0x009c, 0x009c, 0x009c, 0x00a4, + // Entry 40 - 7F + 0x00a4, 0x00a9, 0x00a9, 0x00b0, 0x00b6, 0x00b6, 0x00b6, 0x00b6, + 0x00b9, 0x00b9, 0x00b9, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, + 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, 0x00be, + 0x00be, 0x00be, 0x00be, 0x00c7, 0x00c7, 0x00d0, 0x00d0, 0x00d0, + 0x00d0, 0x00d0, 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d7, 0x00d7, + 0x00d7, 0x00d7, 0x00d7, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, + 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, + 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, + // Entry 80 - BF + 0x00dc, 0x00dc, 0x00dc, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, + 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e3, 0x00e8, + 0x00e8, 0x00e8, 0x00ee, 0x00ee, 0x00ee, 0x00ee, 0x00f4, 0x00f8, + 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x00ff, + 0x00ff, 0x00ff, 0x00ff, 0x00ff, 0x010a, 0x0119, 0x0122, 0x0137, +} // Size: 360 bytes + +var frScriptStr string = "" + // Size: 1445 bytes + "arabearaméen impérialarménienavestiquebalinaisbatakbengalisymboles Bliss" + + "bopomofobrâhmîbraillebouguisbouhidechakmasyllabaire autochtone canadien " + + "unifiécarienchamcherokeecirthcoptesyllabaire chypriotecyrilliquecyrilliq" + + "ue (variante slavonne)dévanâgarîdéséretdémotique égyptienhiératique égyp" + + "tienhiéroglyphes égyptienséthiopiquegéorgien khoutsourigéorgienglagoliti" + + "quegotiquegrecgoudjarâtîgourmoukhîhangûlsinogrammeshanounóosinogrammes s" + + "implifiéssinogrammes traditionnelshébreuhiraganapahawh hmongkatakana ou " + + "hiraganaancien hongroisindusancien italiquejavanaisjaponaiskayah likatak" + + "anakharochthîkhmerkannaracoréenkaithîlannalaolatin (variante brisée)lati" + + "n (variante gaélique)latinlepchalimboulinéaire Alinéaire Blycienlydienma" + + "ndéenmanichéenhiéroglyphes mayasméroïtiquemalayalammongolmoonmeitei maye" + + "kbirmann’koogamol tchikiorkhonoriyaosmanaisancien permienphags papehlevi" + + " des inscriptionspehlevi des psautierspehlevi des livresphénicienphonéti" + + "que de Pollardparthe des inscriptionsrejangrongorongoruniquesamaritainsa" + + "ratisaurashtraécriture des signesshaviencinghalaissundanaissylotî nâgrîs" + + "yriaquesyriaque estranghélosyriaque occidentalsyriaque orientaltagbanoua" + + "taï-lenouveau taï-luetamoultaï viêttélougoutengwartifinaghtagalthânathaï" + + "tibétainougaritiquevaïparole visiblecunéiforme persépolitaincunéiforme s" + + "uméro-akkadienyihériténotation mathématiquesymbolesnon écritcommunécritu" + + "re inconnue" + +var frScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, 0x0017, 0x0020, 0x0029, + 0x0031, 0x0031, 0x0031, 0x0036, 0x003d, 0x004b, 0x0053, 0x005b, + 0x0062, 0x0069, 0x0070, 0x0076, 0x009c, 0x00a2, 0x00a6, 0x00ae, + 0x00b3, 0x00b8, 0x00cc, 0x00d6, 0x00f4, 0x0101, 0x010a, 0x010a, + 0x011e, 0x0133, 0x014b, 0x014b, 0x0156, 0x016a, 0x0173, 0x017f, + 0x0186, 0x0186, 0x018a, 0x0196, 0x01a1, 0x01a8, 0x01b3, 0x01bc, + 0x01d3, 0x01ec, 0x01ec, 0x01f3, 0x01fb, 0x01fb, 0x0207, 0x021b, + 0x022a, 0x022f, 0x023e, 0x0246, 0x024e, 0x024e, 0x0256, 0x025e, + // Entry 40 - 7F + 0x0269, 0x026e, 0x026e, 0x0275, 0x027c, 0x027c, 0x0283, 0x0288, + 0x028b, 0x02a3, 0x02bd, 0x02c2, 0x02c8, 0x02ce, 0x02d9, 0x02e4, + 0x02e4, 0x02e4, 0x02ea, 0x02f0, 0x02f0, 0x02f8, 0x0302, 0x0315, + 0x0315, 0x0315, 0x0321, 0x032a, 0x032a, 0x0330, 0x0334, 0x0334, + 0x0340, 0x0340, 0x0346, 0x0346, 0x0346, 0x0346, 0x034c, 0x034c, + 0x0350, 0x0359, 0x035f, 0x0364, 0x036c, 0x036c, 0x036c, 0x037a, + 0x0382, 0x039a, 0x03af, 0x03c1, 0x03cb, 0x03e1, 0x03f8, 0x03fe, + 0x0408, 0x040f, 0x0419, 0x041f, 0x041f, 0x0429, 0x043d, 0x0444, + // Entry 80 - BF + 0x0444, 0x0444, 0x0444, 0x044e, 0x044e, 0x0457, 0x0466, 0x046e, + 0x0483, 0x0496, 0x04a7, 0x04b0, 0x04b0, 0x04b7, 0x04c7, 0x04cd, + 0x04cd, 0x04d7, 0x04e0, 0x04e7, 0x04ef, 0x04f4, 0x04fa, 0x04ff, + 0x0508, 0x0508, 0x0513, 0x0517, 0x0525, 0x0525, 0x0525, 0x053f, + 0x055b, 0x055d, 0x0565, 0x057b, 0x0583, 0x058d, 0x0593, 0x05a5, +} // Size: 360 bytes + +var frCAScriptStr string = "devanagarigujarati" + +var frCAScriptIdx = []uint16{ // 44 elements + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x0012, +} // Size: 112 bytes + +var guScriptStr string = "" + // Size: 3319 bytes + "અરબીઇમ્પિરિયલ આર્મનિકઅર્મેનિયનઅવેસ્તનબાલીનીઝબટાકબંગાળીબ્લિસિમ્બોલ્સબોપોમ" + + "ોફોબ્રહ્મીબ્રેલબગિનીસબુહિદચકમાયુનાઇટેડ કેનેડિયન એબોરિજનલ સિલેબિક્સકરૈન" + + "ચેરોકીસિર્થકોપ્ટિકસિપ્રાયટસિરિલિકઓલ્ડ ચર્ચ સ્લાવોનિક સિરિલિકદેવનાગરીડે" + + "સરેટઇજિપ્શિયન ડેમોટિકઇજિપ્શિયન હાઇરેટિકઇજિપ્શિયન હાઇરોગ્લિફ્સઇથિયોપિકજ" + + "્યોર્જિઅન ખુતસુરીજ્યોર્જિઅનગ્લેગોલિટિકગોથિકગ્રીકગુજરાતીગુરૂમુખીહંગુલહા" + + "નહનુનૂસરળીકૃત હાનપરંપરાગત હાનહીબ્રુહિરાગાનાપહાઉ મોન્ગકતાકના અને હિરાગન" + + "ાઓલ્ડ હંગેરિયનસિન્ધુજૂનુ ઇટાલિકજાવાનીસજાપાનીકાયાહ લીકટાકાનાખારોશ્થીખ્મ" + + "ેરકન્નડાકોરિયનકૈથીલાનાલાઓફ્રેકતુર લેટિનગૈલિક લેટિનલેટિનલેપચાલિમ્બૂલીનિ" + + "યર અલીનિયર બીલિશિયનલિડિયનમાન્ડાયીનમાનીચાયીનમયાન હાઇરોગ્લિફ્સમેરોઇટિકમલ" + + "યાલમમોંગોલિયનમૂનમેઇતેઇ માયેકમ્યાંમારએન’ કોઓઘામઓલ ચિકીઓરખોનઉડિયાઓસ્માન્" + + "યાઓલ્ડ પરમિકફાગ્સ-પાઇન્સ્ક્રિપ્શનલ પહલવીસાલટર પહલવીબુક પહલવીફોનિશિયનપો" + + "લાર્ડ ફોનેટિકઇન્સ્ક્રિપ્શનલ પાર્થિયનરીજાંગરોંગોરોંગોરૂનિકસમરિટાનસરાતીસ" + + "ૌરાષ્ટ્રસંકેત લિપીશાવિયાનસિંહલીસુદાનીઝસિલોતી નાગરીસિરિયેકએસ્ત્રેન્જેલો" + + " સિરિયાકપશ્ચિમ સિરિયાકપૂર્વ સિરિયાકતગબન્વાતાઇ લીનવીન તાઇ લૂતમિલતાઇ વેઇતત" + + "ેલુગુતેન્ગવારતિફિનાઘટેગાલોગથાનાથાઇટિબેટીયુગાતિટિકવાઇવિસિબલ સ્પીચજુની ફ" + + "ારસીસુમેરો અક્કાદિયન સુનિફોર્મયીવંશાગતગણિતીય સંકેતલિપિપ્રતીકોઅલિખિતસામ" + + "ાન્યઅજ્ઞાત લિપિ" + +var guScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x003d, 0x0058, 0x006d, + 0x0082, 0x0082, 0x0082, 0x008e, 0x00a0, 0x00c7, 0x00df, 0x00f4, + 0x0103, 0x0115, 0x0124, 0x0130, 0x0196, 0x01a2, 0x01a2, 0x01b4, + 0x01c3, 0x01d8, 0x01f0, 0x0205, 0x0250, 0x0268, 0x027a, 0x027a, + 0x02ab, 0x02df, 0x031f, 0x031f, 0x0337, 0x036b, 0x0389, 0x03aa, + 0x03b9, 0x03b9, 0x03c8, 0x03dd, 0x03f5, 0x0404, 0x040d, 0x041c, + 0x043b, 0x045d, 0x045d, 0x046f, 0x0487, 0x0487, 0x04a3, 0x04d5, + 0x04fa, 0x050c, 0x052b, 0x0540, 0x0552, 0x0552, 0x0568, 0x057d, + // Entry 40 - 7F + 0x0595, 0x05a4, 0x05a4, 0x05b6, 0x05c8, 0x05c8, 0x05d4, 0x05e0, + 0x05e9, 0x0611, 0x0630, 0x063f, 0x064e, 0x0660, 0x0676, 0x068f, + 0x068f, 0x068f, 0x06a1, 0x06b3, 0x06b3, 0x06ce, 0x06e9, 0x071a, + 0x071a, 0x071a, 0x0732, 0x0744, 0x0744, 0x075f, 0x0768, 0x0768, + 0x078a, 0x078a, 0x07a2, 0x07a2, 0x07a2, 0x07a2, 0x07b2, 0x07b2, + 0x07be, 0x07d1, 0x07e0, 0x07ef, 0x080a, 0x080a, 0x080a, 0x0826, + 0x083c, 0x0876, 0x0895, 0x08ae, 0x08c6, 0x08f1, 0x0934, 0x0946, + 0x0964, 0x0973, 0x0988, 0x0997, 0x0997, 0x09b2, 0x09ce, 0x09e3, + // Entry 80 - BF + 0x09e3, 0x09e3, 0x09e3, 0x09f5, 0x09f5, 0x0a0a, 0x0a2c, 0x0a41, + 0x0a7e, 0x0aa6, 0x0acb, 0x0ae0, 0x0ae0, 0x0af0, 0x0b0d, 0x0b19, + 0x0b19, 0x0b2f, 0x0b41, 0x0b59, 0x0b6e, 0x0b83, 0x0b8f, 0x0b98, + 0x0baa, 0x0baa, 0x0bc5, 0x0bce, 0x0bf0, 0x0bf0, 0x0bf0, 0x0c0c, + 0x0c56, 0x0c5c, 0x0c6e, 0x0c9c, 0x0cb1, 0x0cc3, 0x0cd8, 0x0cf7, +} // Size: 360 bytes + +var heScriptStr string = "" + // Size: 849 bytes + "ערביארמניבאלינזיבנגליבופומופובריילצ׳אםצ׳ירוקיקופטיקפריסאיקיריליקירילי סל" + + "אבוני כנסייתי עתיקדוואנגריכתב חרטומיםאתיופיגאורגיגותייווניגוג׳רטיגורמוק" + + "יהאנגולהאןכתב האן פשוטכתב האן מסורתיעבריהירגאנההונגרי עתיקאינדוסאיטלקי " + + "עתיקג׳אוונזייפניקטקאנהקמריתקאנדהקוריאנילאיתלטיני גאלילטינימאיהמליאלאםמו" + + "נגולימיאנמראורייהפיניקירוניסינהלהסוריסורי מערביסורי מזרחיטמילטלוגוטגלוג" + + "כתב טאנהתאיטיבטיאוגריתיפרסי עתיקמורשסימון מתמטיסימניםלא כתוברגילכתב שאי" + + "נו ידוע" + +var heScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0012, 0x0012, + 0x0020, 0x0020, 0x0020, 0x0020, 0x002a, 0x002a, 0x003a, 0x003a, + 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x004c, 0x005a, + 0x005a, 0x0064, 0x0072, 0x007e, 0x00b1, 0x00c1, 0x00c1, 0x00c1, + 0x00c1, 0x00c1, 0x00d6, 0x00d6, 0x00e2, 0x00e2, 0x00ee, 0x00ee, + 0x00f6, 0x00f6, 0x0100, 0x010e, 0x011c, 0x0128, 0x012e, 0x012e, + 0x0144, 0x015e, 0x015e, 0x0166, 0x0174, 0x0174, 0x0174, 0x0174, + 0x0189, 0x0195, 0x01aa, 0x01ba, 0x01c2, 0x01c2, 0x01c2, 0x01ce, + // Entry 40 - 7F + 0x01ce, 0x01d8, 0x01d8, 0x01e2, 0x01f0, 0x01f0, 0x01f0, 0x01f0, + 0x01f8, 0x01f8, 0x020b, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, + 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x021d, + 0x021d, 0x021d, 0x021d, 0x022b, 0x022b, 0x0239, 0x0239, 0x0239, + 0x0239, 0x0239, 0x0245, 0x0245, 0x0245, 0x0245, 0x0245, 0x0245, + 0x0245, 0x0245, 0x0245, 0x0251, 0x0251, 0x0251, 0x0251, 0x0251, + 0x0251, 0x0251, 0x0251, 0x0251, 0x025d, 0x025d, 0x025d, 0x025d, + 0x025d, 0x0265, 0x0265, 0x0265, 0x0265, 0x0265, 0x0265, 0x0265, + // Entry 80 - BF + 0x0265, 0x0265, 0x0265, 0x0271, 0x0271, 0x0271, 0x0271, 0x0279, + 0x0279, 0x028c, 0x029f, 0x029f, 0x029f, 0x029f, 0x029f, 0x02a7, + 0x02a7, 0x02a7, 0x02b1, 0x02b1, 0x02b1, 0x02bb, 0x02ca, 0x02d0, + 0x02da, 0x02da, 0x02e8, 0x02e8, 0x02e8, 0x02e8, 0x02e8, 0x02f9, + 0x02f9, 0x02f9, 0x0301, 0x0316, 0x0322, 0x032f, 0x0337, 0x0351, +} // Size: 360 bytes + +var hiScriptStr string = "" + // Size: 3328 bytes + "अरबीइम्पिरियल आर्मेनिकआर्मेनियाईअवेस्तनबालीबटकीबंगालीब्लिसिम्बॉल्सबोपोमो" + + "फ़ोब्रह्मीब्रेलबगिनीसबुहिदचकमायुनिफाइड कैनेडियन एबोरिजनल सिलेबिक्सकरैन" + + "चामचेरोकीकिर्थकॉप्टिककाइप्रायटसिरिलिकओल्ड चर्च स्लावोनिक सिरिलिकदेवनाग" + + "रीडेसरेटइजिप्शियन डेमोटिकइजिप्शियन हाइरेटिकइजिप्शियन हाइरोग्लिफ्सइथियो" + + "पियाईजॉर्जियन खुतसुरीजॉर्जियनग्लेगोलिटिकगोथिकग्रन्थयूनानीगुजरातीगुरमुख" + + "ीहंगुलहानहनुनूसरलीकृत हानपारंपरिक हानहिब्रूहिरागानापाहो ह्मोन्गकचाकना " + + "और हिरागनाऑल्ड हंगेरियनसिन्धुपुरानी इटलीजावानीसजापानीकायाह लीकाताकानाख" + + "ारोशथीखमेरकन्नड़कोरियाईकैथीलानालाओफ़्रैक्टुर लातिनीगेली लातिनीलैटिनलेप" + + "चालिम्बूलीनियर Aलीनियर बीलिशियनलिडियनमनडेनमनीशीनमयान हाइरोग्लिफ्समेरोइ" + + "टिकमलयालममंगोलियाईमूनमेइतेइ मायेकम्यांमारएन्‘कोओगमऑल चिकीओरखोनउड़ियाओस" + + "्मान्याओल्ड परमिकफाग्स-पाइंस्क्रिपश्नल पाहलवीसॉल्टर पाहलवीबुक पाहलवीफो" + + "निशियनपॉलार्ड फोनेटिकइंस्क्रिपश्नल पार्थियनरीजांगरोन्गोरोन्गोरूनिकसमरि" + + "टनसरातीसौराष्ट्रसांकेतिक लेखशावियानसिंहलीसूडानीसिलोती नागरीसिरियेकएस्त" + + "्रेन्जेलो सिरिएकपश्चिम सिरिएकपूर्व सिरिएकतगबन्वाताई लीनया ताई लुतमिलता" + + "ई विएततेलुगूतेन्गवारतिफिनाघटैगालोगथानाथाईतिब्बतीयुगारिटिकवाईविसिबल स्प" + + "ीचपुरानी फारसीसुमेरो अक्कादियन सुनिफॉर्मयीविरासतगणितीय संकेतनचिह्नअलिख" + + "ितसामान्यअज्ञात लिपि" + +var hiScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x0040, 0x005e, 0x0073, + 0x007f, 0x007f, 0x007f, 0x008b, 0x009d, 0x00c4, 0x00df, 0x00f4, + 0x0103, 0x0115, 0x0124, 0x0130, 0x0196, 0x01a2, 0x01ab, 0x01bd, + 0x01cc, 0x01e1, 0x01fc, 0x0211, 0x025c, 0x0274, 0x0286, 0x0286, + 0x02b7, 0x02eb, 0x032b, 0x032b, 0x0349, 0x0377, 0x038f, 0x03b0, + 0x03bf, 0x03d1, 0x03e3, 0x03f8, 0x040d, 0x041c, 0x0425, 0x0434, + 0x0453, 0x0475, 0x0475, 0x0487, 0x049f, 0x049f, 0x04c1, 0x04f0, + 0x0515, 0x0527, 0x0546, 0x055b, 0x056d, 0x056d, 0x0583, 0x059b, + // Entry 40 - 7F + 0x05b0, 0x05bc, 0x05bc, 0x05ce, 0x05e3, 0x05e3, 0x05ef, 0x05fb, + 0x0604, 0x0635, 0x0654, 0x0663, 0x0672, 0x0684, 0x0698, 0x06b1, + 0x06b1, 0x06b1, 0x06c3, 0x06d5, 0x06d5, 0x06e4, 0x06f6, 0x0727, + 0x0727, 0x0727, 0x073f, 0x0751, 0x0751, 0x076c, 0x0775, 0x0775, + 0x0797, 0x0797, 0x07af, 0x07af, 0x07af, 0x07af, 0x07c1, 0x07c1, + 0x07ca, 0x07dd, 0x07ec, 0x07fe, 0x0819, 0x0819, 0x0819, 0x0835, + 0x084b, 0x0885, 0x08aa, 0x08c6, 0x08de, 0x0909, 0x0949, 0x095b, + 0x097f, 0x098e, 0x09a0, 0x09af, 0x09af, 0x09ca, 0x09ec, 0x0a01, + // Entry 80 - BF + 0x0a01, 0x0a01, 0x0a01, 0x0a13, 0x0a13, 0x0a25, 0x0a47, 0x0a5c, + 0x0a96, 0x0abb, 0x0add, 0x0af2, 0x0af2, 0x0b02, 0x0b1c, 0x0b28, + 0x0b28, 0x0b3e, 0x0b50, 0x0b68, 0x0b7d, 0x0b92, 0x0b9e, 0x0ba7, + 0x0bbc, 0x0bbc, 0x0bd7, 0x0be0, 0x0c02, 0x0c02, 0x0c02, 0x0c24, + 0x0c6e, 0x0c74, 0x0c86, 0x0cab, 0x0cba, 0x0ccc, 0x0ce1, 0x0d00, +} // Size: 360 bytes + +var hrScriptStr string = "" + // Size: 2371 bytes + "afaka pismoarapsko pismoaramejsko pismoarmensko pismoavestansko pismobal" + + "ijsko pismobamum pismobassa vah pismobatak pismobengalsko pismoblissymbo" + + "lsbopomofo pismobrahmi pismobrajicabuginsko pismobuhid pismochakma pismo" + + "unificirani kanadski aboriđinski slogovikarijsko pismočamsko pismočeroki" + + " pismocirth pismokoptsko pismocypriot pismoćirilicastaroslavenska crkven" + + "a čirilicadevangari pismodeseret pismoegipatsko narodno pismoegipatsko h" + + "ijeratsko pismoegipatski hijeroglifietiopsko pismogruzijsko khutsuri pis" + + "mogruzijsko pismoglagoljicagotičko pismograntha pismogrčko pismogudžarat" + + "sko pismogurmukhi pismohangul pismohan pismohanunoo pismopojednostavljen" + + "o hansko pismotradicionalno hansko pismohebrejsko pismohiragana pismoana" + + "tolijski hijeroglifipahawh hmong pismokatakana ili hiragana pismostaro m" + + "ađarsko pismoindijsko pismostaro talijansko pismojavansko pismojapansko " + + "pismojurchen pismokayah li pismokatakana pismokharoshthi pismokmersko pi" + + "smokhojki pismokannada pismokorejsko pismokpelle pismokaithi pismolanna " + + "pismolaosko pismofraktur latinicakeltska latinicalatinicalepcha pismolim" + + "bu pismolinear A pismolinear B pismofraser pismoloma pismolikijsko pismo" + + "lidijsko pismomandai pismomanihejsko pismomajanski hijeroglifimende pism" + + "omeroitski kurzivmeroitic pismomalajalamsko pismomongolsko pismomoon pis" + + "momro pismomeitei mayek pismomjanmarsko pismostaro sjevernoarapsko pismo" + + "nabatejsko pismonaxi geba pismon’ko pismonushu pismoogham pismool chiki " + + "pismoorkhon pismoorijsko pismoosmanya pismopalmyrene pismostaro permic p" + + "ismophags-pa pismopisani pahlavipsalter pahlavipahlavi pismofeničko pism" + + "opollard fonetsko pismopisani parthianrejang pismorongorongo pismorunsko" + + " pismosamaritansko pismosarati pismostaro južnoarapsko pismosaurashtra p" + + "ismoznakovno pismoshavian pismosharada pismokhudawadi pismosinhaleško pi" + + "smosora sompeng pismosundansko pismosyloti nagri pismosirijsko pismosiri" + + "jsko estrangelo pismopismo zapadne Sirijepismo istočne Sirijetagbanwa pi" + + "smotakri pismotai le pismonovo tai lue pismotamilsko pismotangut pismota" + + "i viet pismotelugu pismotengwar pismotifinartagalog pismothaana pismotaj" + + "landsko pismotibetansko pismotirhuta pismougaritsko pismovai pismoVisibl" + + "e Speechvarang kshiti pismowoleai pismostaro perzijsko pismosumersko-aka" + + "dsko cuneiform pismoYi pismonasljedno pismomatematičko znakovljesimbolij" + + "ezik bez pismenostizajedničko pismonepoznato pismo" + +var hrScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x000b, 0x000b, 0x000b, 0x0018, 0x0027, 0x0035, 0x0045, + 0x0053, 0x005e, 0x006d, 0x0078, 0x0087, 0x0092, 0x00a0, 0x00ac, + 0x00b3, 0x00c1, 0x00cc, 0x00d8, 0x0101, 0x010f, 0x011c, 0x0129, + 0x0134, 0x0141, 0x014e, 0x0157, 0x0177, 0x0186, 0x0193, 0x0193, + 0x01aa, 0x01c4, 0x01d9, 0x01d9, 0x01e7, 0x01ff, 0x020e, 0x0218, + 0x0226, 0x0233, 0x023f, 0x0251, 0x025f, 0x026b, 0x0274, 0x0281, + 0x029e, 0x02b8, 0x02b8, 0x02c7, 0x02d5, 0x02ec, 0x02fe, 0x0319, + 0x032e, 0x033c, 0x0352, 0x0360, 0x036e, 0x037b, 0x0389, 0x0397, + // Entry 40 - 7F + 0x03a7, 0x03b4, 0x03c0, 0x03cd, 0x03db, 0x03e7, 0x03f3, 0x03fe, + 0x040a, 0x041a, 0x042a, 0x0432, 0x043e, 0x0449, 0x0457, 0x0465, + 0x0471, 0x047b, 0x0489, 0x0497, 0x0497, 0x04a3, 0x04b3, 0x04c7, + 0x04d2, 0x04e2, 0x04f0, 0x0502, 0x0502, 0x0511, 0x051b, 0x0524, + 0x0536, 0x0536, 0x0546, 0x0561, 0x0571, 0x0580, 0x058c, 0x0597, + 0x05a2, 0x05b0, 0x05bc, 0x05c9, 0x05d6, 0x05e5, 0x05e5, 0x05f7, + 0x0605, 0x0613, 0x0622, 0x062f, 0x063d, 0x0653, 0x0662, 0x066e, + 0x067e, 0x068a, 0x069c, 0x06a8, 0x06c1, 0x06d1, 0x06df, 0x06ec, + // Entry 80 - BF + 0x06f9, 0x06f9, 0x0708, 0x0719, 0x072b, 0x073a, 0x074c, 0x075a, + 0x0773, 0x0787, 0x079c, 0x07aa, 0x07b5, 0x07c1, 0x07d3, 0x07e1, + 0x07ed, 0x07fb, 0x0807, 0x0814, 0x081b, 0x0828, 0x0834, 0x0844, + 0x0854, 0x0861, 0x0870, 0x0879, 0x0887, 0x089a, 0x08a6, 0x08bb, + 0x08db, 0x08e3, 0x08f2, 0x0908, 0x090f, 0x0923, 0x0934, 0x0943, +} // Size: 360 bytes + +var huScriptStr string = "" + // Size: 1273 bytes + "ArabBirodalmi arámiÖrményAvesztánBalinézBatakBengáliBliss jelképrendszer" + + "BopomofoBrámiVakírásBuginézBuhidCsakmaEgyesített kanadai őslakos jelekKa" + + "riCsámCserokiKoptCiprusiCirillÓegyházi szláv cirillDevanagáriDeseretEgyi" + + "ptomi demotikusEgyiptomi hieratikusEgyiptomi hieroglifákEtiópGrúz kucsur" + + "iGrúzGlagolitikusGótGörögGudzsarátiGurmukiHangulHanHanunooEgyszerűsített" + + " kínaiHagyományos kínaiHéberHiraganaPahawh hmongKatakana vagy hiraganaÓm" + + "agyarIndusRégi olaszJávaiJapánKajah liKatakanaKharoshthiKhmerKannadaKore" + + "aiKaithiLannaLaoFraktur latinGael latinLatinLepchaLimbuLineáris ALineári" + + "s BLíciaiLídiaiMandaiManicheusMaja hieroglifákMeroitikusMalajálamMongolM" + + "oonMeitei mayekBurmaiN’koOghamOl chikiOrhonOriyaOszmánÓpermikusPhags-paF" + + "elriatos pahlaviPsalter pahlaviKönyv pahlaviFőniciaiPollard fonetikusFel" + + "iratos parthianRedzsangRongorongoRunikusSzamaritánSzaratiSzaurastraJelír" + + "ásShaw ábécéSzingalézSzundanézSylheti nagáriSzíriaiEstrangelo szíriaiNy" + + "ugat-szíriaiKelet-szíriaiTagbanwaTai LeÚj tai lueTamilTai vietTeluguTeng" + + "warBerberTagalogThaanaThaiTibetiUgariVaiLátható beszédÓperzsaÉkírásos su" + + "méro-akkádJiSzármaztatottMatematikai jelrendszerSzimbólumÍratlan nyelvek" + + " kódjaMeghatározatlanIsmeretlen írásrendszer" + +var huScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0014, 0x001c, 0x0025, + 0x002d, 0x002d, 0x002d, 0x0032, 0x003a, 0x004f, 0x0057, 0x005d, + 0x0066, 0x006e, 0x0073, 0x0079, 0x009b, 0x009f, 0x00a4, 0x00ab, + 0x00ab, 0x00af, 0x00b6, 0x00bc, 0x00d4, 0x00df, 0x00e6, 0x00e6, + 0x00f9, 0x010d, 0x0123, 0x0123, 0x0129, 0x0136, 0x013b, 0x0147, + 0x014b, 0x014b, 0x0152, 0x015d, 0x0164, 0x016a, 0x016d, 0x0174, + 0x018b, 0x019e, 0x019e, 0x01a4, 0x01ac, 0x01ac, 0x01b8, 0x01ce, + 0x01d6, 0x01db, 0x01e6, 0x01ec, 0x01f2, 0x01f2, 0x01fa, 0x0202, + // Entry 40 - 7F + 0x020c, 0x0211, 0x0211, 0x0218, 0x021e, 0x021e, 0x0224, 0x0229, + 0x022c, 0x0239, 0x0243, 0x0248, 0x024e, 0x0253, 0x025e, 0x0269, + 0x0269, 0x0269, 0x0270, 0x0277, 0x0277, 0x027d, 0x0286, 0x0297, + 0x0297, 0x0297, 0x02a1, 0x02ab, 0x02ab, 0x02b1, 0x02b5, 0x02b5, + 0x02c1, 0x02c1, 0x02c7, 0x02c7, 0x02c7, 0x02c7, 0x02cd, 0x02cd, + 0x02d2, 0x02da, 0x02df, 0x02e4, 0x02eb, 0x02eb, 0x02eb, 0x02f5, + 0x02fd, 0x030e, 0x031d, 0x032b, 0x0334, 0x0345, 0x0357, 0x035f, + 0x0369, 0x0370, 0x037b, 0x0382, 0x0382, 0x038c, 0x0395, 0x03a2, + // Entry 80 - BF + 0x03a2, 0x03a2, 0x03a2, 0x03ac, 0x03ac, 0x03b6, 0x03c5, 0x03cd, + 0x03e0, 0x03ef, 0x03fd, 0x0405, 0x0405, 0x040b, 0x0416, 0x041b, + 0x041b, 0x0423, 0x0429, 0x0430, 0x0436, 0x043d, 0x0443, 0x0447, + 0x044d, 0x044d, 0x0452, 0x0455, 0x0466, 0x0466, 0x0466, 0x046e, + 0x0488, 0x048a, 0x0498, 0x04af, 0x04b9, 0x04d0, 0x04e0, 0x04f9, +} // Size: 360 bytes + +var hyScriptStr string = "" + // Size: 679 bytes + "արաբականհայկականբենգալականբոպոմոֆոբրայլիկյուրեղագիրդեվանագարիեթովպականվր" + + "ացականհունականգուջարաթիգուրմուխիհանգուլչինականպարզեցված չինականավանդակա" + + "ն չինականեբրայականհիրագանաճապոնականկատականաքմերականկաննադակորեականլաոսա" + + "կանլատինականմալայալամմոնղոլականմյանմարականօրիյասինհալականթամիլականթելու" + + "գութաանաթայականտիբեթականնշաններչգրվածընդհանուրանհայտ գիր" + +var hyScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0010, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0034, 0x0034, 0x0044, 0x0044, + 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, 0x0050, + 0x0050, 0x0050, 0x0050, 0x0066, 0x0066, 0x007a, 0x007a, 0x007a, + 0x007a, 0x007a, 0x007a, 0x007a, 0x008c, 0x008c, 0x009c, 0x009c, + 0x009c, 0x009c, 0x00ac, 0x00be, 0x00d0, 0x00de, 0x00ec, 0x00ec, + 0x010d, 0x012e, 0x012e, 0x0140, 0x0150, 0x0150, 0x0150, 0x0150, + 0x0150, 0x0150, 0x0150, 0x0150, 0x0162, 0x0162, 0x0162, 0x0172, + // Entry 40 - 7F + 0x0172, 0x0182, 0x0182, 0x0190, 0x01a0, 0x01a0, 0x01a0, 0x01a0, + 0x01b0, 0x01b0, 0x01b0, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, + 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, 0x01c2, + 0x01c2, 0x01c2, 0x01c2, 0x01d4, 0x01d4, 0x01e8, 0x01e8, 0x01e8, + 0x01e8, 0x01e8, 0x01fe, 0x01fe, 0x01fe, 0x01fe, 0x01fe, 0x01fe, + 0x01fe, 0x01fe, 0x01fe, 0x0208, 0x0208, 0x0208, 0x0208, 0x0208, + 0x0208, 0x0208, 0x0208, 0x0208, 0x0208, 0x0208, 0x0208, 0x0208, + 0x0208, 0x0208, 0x0208, 0x0208, 0x0208, 0x0208, 0x0208, 0x0208, + // Entry 80 - BF + 0x0208, 0x0208, 0x0208, 0x021c, 0x021c, 0x021c, 0x021c, 0x021c, + 0x021c, 0x021c, 0x021c, 0x021c, 0x021c, 0x021c, 0x021c, 0x022e, + 0x022e, 0x022e, 0x023e, 0x023e, 0x023e, 0x023e, 0x0248, 0x0256, + 0x0268, 0x0268, 0x0268, 0x0268, 0x0268, 0x0268, 0x0268, 0x0268, + 0x0268, 0x0268, 0x0268, 0x0268, 0x0276, 0x0282, 0x0294, 0x02a7, +} // Size: 360 bytes + +var idScriptStr string = "" + // Size: 1396 bytes + "AfakaAlbania KaukasiaArabAram ImperialArmeniaAvestaBaliBamumBassa VahBat" + + "akBengaliBlissymbolBopomofoBrahmiBrailleBugisBuhidChakmaSimbol Aborigin " + + "Kanada KesatuanKariaChamCherokeeCirthKoptikSiprusSirilikGereja Slavonia " + + "Sirilik LamaDevanagariDeseretStenografi DuployanDemotik MesirHieratik Me" + + "sirHieroglip MesirEtiopiaGeorgian KhutsuriGeorgiaGlagoliticGothicGrantha" + + "YunaniGujaratiGurmukhiHangulHanHanunooHan SederhanaHan TradisionalIbrani" + + "HiraganaHieroglif AnatoliaPahawh HmongKatakana atau HiraganaHungaria Kun" + + "oIndusItalia LamaJawaJepangJurchenKayah LiKatakanaKharoshthiKhmerKhojkiK" + + "annadaKoreaKpelleKaithiLannaLaosLatin FrakturLatin GaelikLatinLepchaLimb" + + "uLinear ALinear BLisuLomaLyciaLydiaMandaeManikheiHieroglip MayaMendeKurs" + + "if MeroitikMeroitikMalayalamModiMongoliaMoonMroMeitei MayekMyanmarArab U" + + "tara KunoNabataeaNaxi GebaN’KoNushuOghamChiki LamaOrkhonOriyaOsmanyaPalm" + + "iraPermik KunoPhags-paPahleviMazmur PahleviKitab PahleviPhoenixFonetik P" + + "ollardPrasasti ParthiaRejangRongorongoRunikSamariaSaratiArab Selatan Kun" + + "oSaurashtraTulisan IsyaratShaviaSharadaSiddhamKhudawadiSinhalaSora Sompe" + + "ngSundaSyloti NagriSuriahSuriah EstrangeloSuriah BaratSuriah TimurTagban" + + "waTakriTai LeTai Lue BaruTamilTangutTai VietTeluguTenghwarTifinaghTagalo" + + "gThaanaThaiTibetTirhutaUgaritikVaiUcapan TerlihatVarang KshitiWoleaiPers" + + "ia KunoCuneiform Sumero-AkkadiaYiWarisanNotasi MatematikaSimbolTidak Ter" + + "tulisUmumSkrip Tak Dikenal" + +var idScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0005, 0x0015, 0x0015, 0x0019, 0x0026, 0x002d, 0x0033, + 0x0037, 0x003c, 0x0045, 0x004a, 0x0051, 0x005b, 0x0063, 0x0069, + 0x0070, 0x0075, 0x007a, 0x0080, 0x009f, 0x00a4, 0x00a8, 0x00b0, + 0x00b5, 0x00bb, 0x00c1, 0x00c8, 0x00e4, 0x00ee, 0x00f5, 0x0108, + 0x0115, 0x0123, 0x0132, 0x0132, 0x0139, 0x014a, 0x0151, 0x015b, + 0x0161, 0x0168, 0x016e, 0x0176, 0x017e, 0x0184, 0x0187, 0x018e, + 0x019b, 0x01aa, 0x01aa, 0x01b0, 0x01b8, 0x01ca, 0x01d6, 0x01ec, + 0x01f9, 0x01fe, 0x0209, 0x020d, 0x0213, 0x021a, 0x0222, 0x022a, + // Entry 40 - 7F + 0x0234, 0x0239, 0x023f, 0x0246, 0x024b, 0x0251, 0x0257, 0x025c, + 0x0260, 0x026d, 0x0279, 0x027e, 0x0284, 0x0289, 0x0291, 0x0299, + 0x029d, 0x02a1, 0x02a6, 0x02ab, 0x02ab, 0x02b1, 0x02b9, 0x02c7, + 0x02cc, 0x02db, 0x02e3, 0x02ec, 0x02f0, 0x02f8, 0x02fc, 0x02ff, + 0x030b, 0x030b, 0x0312, 0x0321, 0x0329, 0x0332, 0x0338, 0x033d, + 0x0342, 0x034c, 0x0352, 0x0357, 0x035e, 0x0365, 0x0365, 0x0370, + 0x0378, 0x037f, 0x038d, 0x039a, 0x03a1, 0x03b0, 0x03c0, 0x03c6, + 0x03d0, 0x03d5, 0x03dc, 0x03e2, 0x03f3, 0x03fd, 0x040c, 0x0412, + // Entry 80 - BF + 0x0419, 0x0420, 0x0429, 0x0430, 0x043c, 0x0441, 0x044d, 0x0453, + 0x0464, 0x0470, 0x047c, 0x0484, 0x0489, 0x048f, 0x049b, 0x04a0, + 0x04a6, 0x04ae, 0x04b4, 0x04bc, 0x04c4, 0x04cb, 0x04d1, 0x04d5, + 0x04da, 0x04e1, 0x04e9, 0x04ec, 0x04fb, 0x0508, 0x050e, 0x0519, + 0x0531, 0x0533, 0x053a, 0x054b, 0x0551, 0x055f, 0x0563, 0x0574, +} // Size: 360 bytes + +var isScriptStr string = "" + // Size: 363 bytes + "arabísktarmensktbengalsktbopomofoblindraleturkyrillísktdevanagarieþíópís" + + "ktgeorgísktgrísktgújaratígurmukhihangulkínverskteinfaldað hanhefðbundið " + + "hanhebreskthiraganakatakana eða hiraganajapansktkatakanakmerkannadakóres" + + "ktlaolatnesktmalalajammongólsktmjanmarsktoriyasinhalatamílskttelúgúthaan" + + "ataílenskttíbeskttáknóskrifaðalmenntóþekkt letur" + +var isScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0009, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0011, 0x001a, 0x001a, 0x0022, 0x0022, + 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x002e, 0x002e, 0x0039, 0x0039, 0x0043, 0x0043, 0x0043, + 0x0043, 0x0043, 0x0043, 0x0043, 0x0050, 0x0050, 0x005a, 0x005a, + 0x005a, 0x005a, 0x0061, 0x006b, 0x0073, 0x0079, 0x0083, 0x0083, + 0x0091, 0x00a1, 0x00a1, 0x00a9, 0x00b1, 0x00b1, 0x00b1, 0x00c7, + 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00cf, 0x00cf, 0x00cf, 0x00d7, + // Entry 40 - 7F + 0x00d7, 0x00db, 0x00db, 0x00e2, 0x00ea, 0x00ea, 0x00ea, 0x00ea, + 0x00ed, 0x00ed, 0x00ed, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, + 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, 0x00f5, + 0x00f5, 0x00f5, 0x00f5, 0x00fe, 0x00fe, 0x0108, 0x0108, 0x0108, + 0x0108, 0x0108, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, + 0x0112, 0x0112, 0x0112, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, + 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, + 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, 0x0117, + // Entry 80 - BF + 0x0117, 0x0117, 0x0117, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, + 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x011e, 0x0127, + 0x0127, 0x0127, 0x012f, 0x012f, 0x012f, 0x012f, 0x0135, 0x013f, + 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, 0x0147, + 0x0147, 0x0147, 0x0147, 0x0147, 0x014c, 0x0156, 0x015d, 0x016b, +} // Size: 360 bytes + +var itScriptStr string = "" + // Size: 1562 bytes + "afakaaraboaramaico imperialearmenoavesticobalinesebamumBassa Vahbatakben" + + "galesesimboli blissbopomofobrahmibraillebuginesebuhidchakmasimboli abori" + + "geni canadesi unificaticarianchamcherokeecirthcoptocipriotacirillicociri" + + "llico antica chiesa slavonicadevanagarideseretstenografia duployanegizia" + + "no demoticoieratico egizianogeroglifici egizianietiopekutsurigeorgianogl" + + "agoliticogoticogranthagrecogujaratigurmukhihangulhanhanunoohan semplific" + + "atohan tradizionaleebraicohiraganageroglifici anatolicipahawn hmongkatan" + + "aka o hiraganaantico unghereseinduitalico anticojavanesegiapponesejurche" + + "nkayah likatakanakharoshthikhmerkhojkikannadacoreanoKpellekaithilannalao" + + "variante fraktur del latinovariante gaelica del latinolatinolepchalimbul" + + "ineare Alineare Blisulomalycilydimandaicomanicheogeroglifici mayamendeco" + + "rsivo meroiticomeroiticomalayalammongolomoonmromeetei mayekbirmanoarabo " + + "settentrionale anticonabateogeba naxin’konushuoghamol chikiorkhonoriyaos" + + "manyapalmirenopermico anticophags-papahlavi delle iscrizionipahlavi psal" + + "terpahlavi bookfeniciofonetica di pollardpartico delle iscrizionirejangr" + + "ongorongorunicosamaritanosaratiarabo meridionale anticosaurashtralinguag" + + "gio dei segnishavianosharadakhudawadisingalesesora sompengsundanesesylot" + + "i nagrisirianosiriaco estrangelosiriaco occidentalesiriaco orientaletagb" + + "anwatakritai letai luetamiltanguttai viettelugutengwartifinaghtagalogtha" + + "anathailandesetibetanotirhutaugaritavaiialfabeto visivovarang kshitiwole" + + "aipersiano anticosumero-accadiano cuneiformeyiereditatonotazione matemat" + + "icasimbolinon scrittocomunescrittura sconosciuta" + +var itScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0005, 0x0005, 0x0005, 0x000a, 0x001c, 0x0022, 0x002a, + 0x0032, 0x0037, 0x0040, 0x0045, 0x004e, 0x005b, 0x0063, 0x0069, + 0x0070, 0x0078, 0x007d, 0x0083, 0x00a7, 0x00ad, 0x00b1, 0x00b9, + 0x00be, 0x00c3, 0x00cb, 0x00d4, 0x00f5, 0x00ff, 0x0106, 0x011a, + 0x012b, 0x013c, 0x0150, 0x0150, 0x0156, 0x015d, 0x0166, 0x0171, + 0x0177, 0x017e, 0x0183, 0x018b, 0x0193, 0x0199, 0x019c, 0x01a3, + 0x01b3, 0x01c3, 0x01c3, 0x01ca, 0x01d2, 0x01e7, 0x01f3, 0x0206, + 0x0216, 0x021a, 0x0228, 0x0230, 0x023a, 0x0241, 0x0249, 0x0251, + // Entry 40 - 7F + 0x025b, 0x0260, 0x0266, 0x026d, 0x0274, 0x027a, 0x0280, 0x0285, + 0x0288, 0x02a3, 0x02be, 0x02c4, 0x02ca, 0x02cf, 0x02d8, 0x02e1, + 0x02e5, 0x02e9, 0x02ed, 0x02f1, 0x02f1, 0x02f9, 0x0301, 0x0311, + 0x0316, 0x0327, 0x0330, 0x0339, 0x0339, 0x0340, 0x0344, 0x0347, + 0x0353, 0x0353, 0x035a, 0x0375, 0x037c, 0x0385, 0x038b, 0x0390, + 0x0395, 0x039d, 0x03a3, 0x03a8, 0x03af, 0x03b8, 0x03b8, 0x03c6, + 0x03ce, 0x03e6, 0x03f5, 0x0401, 0x0408, 0x041b, 0x0433, 0x0439, + 0x0443, 0x0449, 0x0453, 0x0459, 0x0471, 0x047b, 0x048f, 0x0497, + // Entry 80 - BF + 0x049e, 0x049e, 0x04a7, 0x04b0, 0x04bc, 0x04c5, 0x04d1, 0x04d8, + 0x04ea, 0x04fd, 0x050e, 0x0516, 0x051b, 0x0521, 0x0528, 0x052d, + 0x0533, 0x053b, 0x0541, 0x0548, 0x0550, 0x0557, 0x055d, 0x0568, + 0x0570, 0x0577, 0x057e, 0x0582, 0x0591, 0x059e, 0x05a4, 0x05b3, + 0x05ce, 0x05d0, 0x05d9, 0x05ed, 0x05f4, 0x05ff, 0x0605, 0x061a, +} // Size: 360 bytes + +var jaScriptStr string = "" + // Size: 3253 bytes + "アファカ文字カフカス・アルバニア文字アラビア文字帝国アラム文字アルメニア文字アヴェスター文字バリ文字バムン文字バサ文字バタク文字ベンガル文字ブリ" + + "スシンボル注音字母ブラーフミー文字ブライユ点字ブギス文字ブヒッド文字チャクマ文字統合カナダ先住民音節文字カリア文字チャム文字チェロキー文字キ" + + "アス文字コプト文字キプロス文字キリル文字古代教会スラブ語キリル文字デーバナーガリー文字デセレット文字デュプロワエ式速記エジプト民衆文字エジプ" + + "ト神官文字エジプト聖刻文字エルバサン文字エチオピア文字ジョージア文字(フツリ)ジョージア文字グラゴル文字ゴート文字グランタ文字ギリシャ文字グ" + + "ジャラート文字グルムキー文字ハングル漢字ハヌノオ文字漢字(簡体字)漢字(繁体字)ヘブライ文字ひらがなアナトリア象形文字パハウ・フモン文字仮名" + + "古代ハンガリー文字インダス文字古イタリア文字ジャワ文字日本語の文字女真文字カヤー文字カタカナカローシュティー文字クメール文字ホジャ文字カンナ" + + "ダ文字韓国語の文字クペレ文字カイティ文字ラーンナー文字ラオ文字ラテン文字(ドイツ文字)ラテン文字 (ゲール文字)ラテン文字レプチャ文字リンブ" + + "文字線文字A線文字Bフレイザー文字ロマ文字リキア文字リディア文字マハージャニー文字マンダ文字マニ文字マヤ象形文字メンデ文字メロエ文字草書体メ" + + "ロエ文字マラヤーラム文字モーディー文字モンゴル文字ムーン文字ムロ文字メイテイ文字ミャンマー文字古代北アラビア文字ナバテア文字ナシ族ゲバ文字ン" + + "コ文字女書オガム文字オルチキ文字オルホン文字オリヤー文字オスマニア文字パルミラ文字パウ・チン・ハウ文字古ぺルム文字パスパ文字碑文パフラヴィー" + + "文字詩編用パフラヴィー文字書物用パフラヴィー文字フェニキア文字ポラード音声記号碑文パルティア文字ルジャン文字ロンゴロンゴ文字ルーン文字サマリ" + + "ア文字サラティ文字古代南アラビア文字サウラーシュトラ文字手話文字ショー文字シャーラダー文字梵字クダワディ文字シンハラ文字ソラング・ソンペング" + + "文字スンダ文字シロティ・ナグリ文字シリア文字シリア文字(エストランゲロ文字)シリア文字(西方シリア文字)シリア文字(東方シリア文字)タグバン" + + "ワ文字タークリー文字タイ・レ文字新タイ・ルー文字タミール文字西夏文字タイ・ヴェト文字テルグ文字テングワール文字ティフナグ文字タガログ文字ター" + + "ナ文字タイ文字チベット文字ティルフータ文字ウガリット文字ヴァイ文字視話法バラン・クシティ文字ウォレアイ文字古代ペルシア文字シュメール=アッカ" + + "ド語楔形文字イ文字基底文字の種別を継承する結合文字数学記号記号文字非表記共通文字未定義文字" + +var jaScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0012, 0x0036, 0x0036, 0x0048, 0x005d, 0x0072, 0x008a, + 0x0096, 0x00a5, 0x00b1, 0x00c0, 0x00d2, 0x00e7, 0x00f3, 0x010b, + 0x011d, 0x012c, 0x013e, 0x0150, 0x0174, 0x0183, 0x0192, 0x01a7, + 0x01b6, 0x01c5, 0x01d7, 0x01e6, 0x020d, 0x022b, 0x0240, 0x025b, + 0x0273, 0x028b, 0x02a3, 0x02b8, 0x02cd, 0x02ed, 0x0302, 0x0314, + 0x0323, 0x0335, 0x0347, 0x035f, 0x0374, 0x0380, 0x0386, 0x0398, + 0x03a9, 0x03ba, 0x03ba, 0x03cc, 0x03d8, 0x03f3, 0x040e, 0x0414, + 0x042f, 0x0441, 0x0456, 0x0465, 0x0477, 0x0483, 0x0492, 0x049e, + // Entry 40 - 7F + 0x04bc, 0x04ce, 0x04dd, 0x04ef, 0x0501, 0x0510, 0x0522, 0x0537, + 0x0543, 0x0563, 0x0584, 0x0593, 0x05a5, 0x05b4, 0x05be, 0x05c8, + 0x05dd, 0x05e9, 0x05f8, 0x060a, 0x0625, 0x0634, 0x0640, 0x0652, + 0x0661, 0x0679, 0x0688, 0x06a0, 0x06b5, 0x06c7, 0x06d6, 0x06e2, + 0x06f4, 0x06f4, 0x0709, 0x0724, 0x0736, 0x074b, 0x0757, 0x075d, + 0x076c, 0x077e, 0x0790, 0x07a2, 0x07b7, 0x07c9, 0x07e7, 0x07f9, + 0x0808, 0x0826, 0x0847, 0x0868, 0x087d, 0x0895, 0x08b0, 0x08c2, + 0x08da, 0x08e9, 0x08fb, 0x090d, 0x0928, 0x0946, 0x0952, 0x0961, + // Entry 80 - BF + 0x0979, 0x097f, 0x0994, 0x09a6, 0x09ca, 0x09d9, 0x09f7, 0x0a06, + 0x0a32, 0x0a58, 0x0a7e, 0x0a93, 0x0aa8, 0x0aba, 0x0ad2, 0x0ae4, + 0x0af0, 0x0b08, 0x0b17, 0x0b2f, 0x0b44, 0x0b56, 0x0b65, 0x0b71, + 0x0b83, 0x0b9b, 0x0bb0, 0x0bbf, 0x0bc8, 0x0be6, 0x0bfb, 0x0c13, + 0x0c40, 0x0c49, 0x0c79, 0x0c85, 0x0c91, 0x0c9a, 0x0ca6, 0x0cb5, +} // Size: 360 bytes + +var kaScriptStr string = "" + // Size: 4008 bytes + "აფაკაარაბულიიმპერიული არამეულისომხურიავესტურიბალიურიბამუმიბასა ვაჰიბატაკ" + + "იბენგალურიბლისსიმბოლოებიბოპომოფობრაჰმიბრაილიბუჰიდიჩაკმაკარიულიჩამიჩერო" + + "კიკირთიკოპტურიკვიპროსულიკირილიცაძველი სლავური კირილიცადევანაგარიდეზერე" + + "ტისდუპლოის სტენოგრაფიაეგვიპტური დემოტიკურიეგვიპტური იერატიკულიეგვიპტურ" + + "ი იეროგლიფურიეთიოპიურიხუცურიქართულიგლაგოლიცაგოთურიგრანთაბერძნულიგუჯარა" + + "თულიგურმუხიჰანგულიჰანიჰანუნოოგამარტივებული ჰანიტრადიციული ჰანიებრაულიჰ" + + "ირაგანაანატოლიური იეროგლიფურიფაჰაუ-მონიიაპონური კანაძველი უნგრულიიავურ" + + "იიაპონურიჯურჯენულიკაიაჰ-ლიკატაკანაქაროშთიქმერულიქოჯკიკანადაკორეულიკპელ" + + "ეკაითილაოსურიგელური ლათინურილათინურილიმბუA-ხაზოვანიB-ხაზოვანილომალიკიუ" + + "რილიდიურიმანდეურიმანიქეურიმაიას იეროგლიფებიმენდემეროიტული კურსივიმეროი" + + "ტულიმალაიალამურიმონღოლურიმრომიანმურიძველი ჩრდილოეთ-არაბულინაბატეურინკო" + + "ნუშუოღამიოლ-ჩიკიორხონულიორიაოსმანიაპალმირულიძველი პერმულიფაგსპამონუმენ" + + "ტური ფალაურიფსალმუნური ფალაურიწიგნური ფალაურიფინიკიურიმონუმენტური პართ" + + "ულირეჯანგირონგორონგორუნულისამარიულისარატიძველი სამხრეთ-არაბულისაურაშტრ" + + "აჟესტთაშარადაქუდავადისინჰალურისორან-სომპენისუნდანურისილოტი ნაგრისირიულ" + + "ისირიული ესტრანგელოდასავლეთი სირიულიაღმოსავლეთი სირიულიტაგბანვატაკრიტა" + + "ი ლეახალი ტაი ლიუტამილურიტანღუტურიტაი-ვიეტიტელუგუტენგვარიტიფინაღითაანა" + + "ტაიტიბეტურიტირჰუტაუგარითულივაიხილული მეტყველებავარანგ-კშიტივოლეაიძველი" + + " სპარსულიშუმერულ-აქადური ლურსმნულიგადაღებულიმათემატიკური ნოტაციასიმბოლოე" + + "ბიუმწერლობოზოგადიუცნობი დამწერლობა" + +var kaScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x000f, 0x000f, 0x000f, 0x0024, 0x0058, 0x006d, 0x0085, + 0x009a, 0x00ac, 0x00c5, 0x00d7, 0x00f2, 0x011c, 0x0134, 0x0146, + 0x0158, 0x0158, 0x016a, 0x0179, 0x0179, 0x018e, 0x019a, 0x01ac, + 0x01bb, 0x01d0, 0x01ee, 0x0206, 0x0244, 0x0262, 0x027d, 0x02b4, + 0x02ee, 0x0328, 0x0365, 0x0365, 0x0380, 0x0392, 0x03a7, 0x03c2, + 0x03d4, 0x03e6, 0x03fe, 0x041c, 0x0431, 0x0446, 0x0452, 0x0467, + 0x049b, 0x04c6, 0x04c6, 0x04db, 0x04f3, 0x0533, 0x054f, 0x0574, + 0x0599, 0x0599, 0x0599, 0x05ab, 0x05c3, 0x05de, 0x05f4, 0x060c, + // Entry 40 - 7F + 0x0621, 0x0636, 0x0645, 0x0657, 0x066c, 0x067b, 0x068a, 0x068a, + 0x069f, 0x069f, 0x06ca, 0x06e2, 0x06e2, 0x06f1, 0x070b, 0x0725, + 0x0725, 0x0731, 0x0746, 0x075b, 0x075b, 0x0773, 0x078e, 0x07bf, + 0x07ce, 0x07ff, 0x081a, 0x083e, 0x083e, 0x0859, 0x0859, 0x0862, + 0x0862, 0x0862, 0x087a, 0x08b8, 0x08d3, 0x08d3, 0x08dc, 0x08e8, + 0x08f7, 0x090a, 0x0922, 0x092e, 0x0943, 0x095e, 0x095e, 0x0983, + 0x0995, 0x09cc, 0x0a00, 0x0a2b, 0x0a46, 0x0a46, 0x0a7d, 0x0a92, + 0x0ab0, 0x0ac2, 0x0add, 0x0aef, 0x0b2a, 0x0b45, 0x0b57, 0x0b57, + // Entry 80 - BF + 0x0b69, 0x0b69, 0x0b81, 0x0b9c, 0x0bc1, 0x0bdc, 0x0bfe, 0x0c13, + 0x0c47, 0x0c78, 0x0caf, 0x0cc7, 0x0cd6, 0x0ce6, 0x0d09, 0x0d21, + 0x0d3c, 0x0d55, 0x0d67, 0x0d7f, 0x0d97, 0x0d97, 0x0da6, 0x0daf, + 0x0dc7, 0x0ddc, 0x0df7, 0x0e00, 0x0e31, 0x0e53, 0x0e65, 0x0e8d, + 0x0ed4, 0x0ed4, 0x0ef2, 0x0f2c, 0x0f4a, 0x0f65, 0x0f77, 0x0fa8, +} // Size: 360 bytes + +var kkScriptStr string = "" + // Size: 918 bytes + "араб жазуыармян жазуыбенгал жазуыбопомофо жазуБрайль жазуыкирилл жазуыде" + + "ванагари жазуыэфиоп жазугрузин жазуыгрек жазуыгуджарати жазуыгурмукхи ж" + + "азуыхангул жазуықытай жазуыжеңілдетілген қытай иероглифыдәстүрлі қытай " + + "иероглифыиврит жазуыхирагана жазуыжапон жазуыкатакана жазуыкхмер жазуык" + + "аннада жазуыкорей жазуылаос жазуылатын жазуымалаялам жазуымоңғол жазуым" + + "ьянма жазуыория жазуысингаль жазуытамиль жазуытелугу жазуытаана жазуыта" + + "й жазуытибет жазуытаңбаларжазусызжалпыбелгісіз жазу" + +var kkScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0013, 0x0013, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x003f, 0x003f, 0x0058, 0x0058, + 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, 0x006f, + 0x006f, 0x006f, 0x006f, 0x0086, 0x0086, 0x00a5, 0x00a5, 0x00a5, + 0x00a5, 0x00a5, 0x00a5, 0x00a5, 0x00b8, 0x00b8, 0x00cf, 0x00cf, + 0x00cf, 0x00cf, 0x00e2, 0x00ff, 0x011a, 0x0131, 0x0146, 0x0146, + 0x017e, 0x01ac, 0x01ac, 0x01c1, 0x01dc, 0x01dc, 0x01dc, 0x01dc, + 0x01dc, 0x01dc, 0x01dc, 0x01dc, 0x01f1, 0x01f1, 0x01f1, 0x020c, + // Entry 40 - 7F + 0x020c, 0x0221, 0x0221, 0x023a, 0x024f, 0x024f, 0x024f, 0x024f, + 0x0262, 0x0262, 0x0262, 0x0277, 0x0277, 0x0277, 0x0277, 0x0277, + 0x0277, 0x0277, 0x0277, 0x0277, 0x0277, 0x0277, 0x0277, 0x0277, + 0x0277, 0x0277, 0x0277, 0x0292, 0x0292, 0x02a9, 0x02a9, 0x02a9, + 0x02a9, 0x02a9, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, 0x02c0, + 0x02c0, 0x02c0, 0x02c0, 0x02d3, 0x02d3, 0x02d3, 0x02d3, 0x02d3, + 0x02d3, 0x02d3, 0x02d3, 0x02d3, 0x02d3, 0x02d3, 0x02d3, 0x02d3, + 0x02d3, 0x02d3, 0x02d3, 0x02d3, 0x02d3, 0x02d3, 0x02d3, 0x02d3, + // Entry 80 - BF + 0x02d3, 0x02d3, 0x02d3, 0x02ec, 0x02ec, 0x02ec, 0x02ec, 0x02ec, + 0x02ec, 0x02ec, 0x02ec, 0x02ec, 0x02ec, 0x02ec, 0x02ec, 0x0303, + 0x0303, 0x0303, 0x031a, 0x031a, 0x031a, 0x031a, 0x032f, 0x0340, + 0x0355, 0x0355, 0x0355, 0x0355, 0x0355, 0x0355, 0x0355, 0x0355, + 0x0355, 0x0355, 0x0355, 0x0355, 0x0365, 0x0373, 0x037d, 0x0396, +} // Size: 360 bytes + +var kmScriptStr string = "" + // Size: 957 bytes + "អារ៉ាប់អាម៉ានីបង់ក្លាដែសបូផូម៉ូហ្វូអក្សរ\u200bសម្រាប់មនុស្ស\u200bពិការ" + + "\u200bភ្នែកស៊ីរីលីកដាវ៉ាន់ណាការិអេត្យូពីហ្សកហ្ស៊ីក្រិចគូចារ៉ាទីកុមុយឃីហា" + + "ំងកុលហានអក្សរ\u200bហាន\u200bកាត់អក្សរ\u200bហាន\u200bពេញអ៊ីស្រាអែលហ៊ីរ៉" + + "ាកាណាជប៉ុនកាតាកាណាខ្មែរកន្នដកូរ៉េឡាវឡាតាំងមលយាល័មម៉ុងហ្គោលីភូមាអូរីយ៉ា" + + "ស៊ីនហាឡាតាមីលតេលុគុថាណាថៃទីបេនិមិត្តសញ្ញាគ្មានការសរសេរទូទៅអក្សរមិនស្គា" + + "ល់" + +var kmScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0015, 0x0015, 0x002a, 0x002a, + 0x002a, 0x002a, 0x002a, 0x002a, 0x0048, 0x0048, 0x0069, 0x0069, + 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, 0x00c6, + 0x00c6, 0x00c6, 0x00c6, 0x00de, 0x00de, 0x0105, 0x0105, 0x0105, + 0x0105, 0x0105, 0x0105, 0x0105, 0x011d, 0x011d, 0x0138, 0x0138, + 0x0138, 0x0138, 0x0147, 0x0162, 0x0177, 0x018c, 0x0195, 0x0195, + 0x01bf, 0x01e6, 0x01e6, 0x0204, 0x0222, 0x0222, 0x0222, 0x0222, + 0x0222, 0x0222, 0x0222, 0x0222, 0x0231, 0x0231, 0x0231, 0x0249, + // Entry 40 - 7F + 0x0249, 0x0258, 0x0258, 0x0267, 0x0276, 0x0276, 0x0276, 0x0276, + 0x027f, 0x027f, 0x027f, 0x0291, 0x0291, 0x0291, 0x0291, 0x0291, + 0x0291, 0x0291, 0x0291, 0x0291, 0x0291, 0x0291, 0x0291, 0x0291, + 0x0291, 0x0291, 0x0291, 0x02a6, 0x02a6, 0x02c4, 0x02c4, 0x02c4, + 0x02c4, 0x02c4, 0x02d0, 0x02d0, 0x02d0, 0x02d0, 0x02d0, 0x02d0, + 0x02d0, 0x02d0, 0x02d0, 0x02e5, 0x02e5, 0x02e5, 0x02e5, 0x02e5, + 0x02e5, 0x02e5, 0x02e5, 0x02e5, 0x02e5, 0x02e5, 0x02e5, 0x02e5, + 0x02e5, 0x02e5, 0x02e5, 0x02e5, 0x02e5, 0x02e5, 0x02e5, 0x02e5, + // Entry 80 - BF + 0x02e5, 0x02e5, 0x02e5, 0x02fd, 0x02fd, 0x02fd, 0x02fd, 0x02fd, + 0x02fd, 0x02fd, 0x02fd, 0x02fd, 0x02fd, 0x02fd, 0x02fd, 0x030c, + 0x030c, 0x030c, 0x031e, 0x031e, 0x031e, 0x031e, 0x032a, 0x0330, + 0x033c, 0x033c, 0x033c, 0x033c, 0x033c, 0x033c, 0x033c, 0x033c, + 0x033c, 0x033c, 0x033c, 0x033c, 0x0360, 0x0387, 0x0393, 0x03bd, +} // Size: 360 bytes + +var knScriptStr string = "" + // Size: 3788 bytes + "ಅರೇಬಿಕ್ಇಂಪೀರಿಯಲ್ ಅರೆಮಾಯಿಕ್ಅರ್ಮೇನಿಯನ್ಅವೆಸ್ತಾನ್ಬಾಲಿನೀಸ್ಬಾಟಕ್ಬೆಂಗಾಲಿಬ್ಲಿಸ್" + + "\u200cಸಿಂಬಲ್ಸ್ಬೋಪೊಮೋಫೋಬ್ರಾಹ್ಮಿಬ್ರೈಲ್ಬಗಿನೀಸ್ಬುಹಿದ್ಕಾಕಂಯುನಿಟೆಡ್ ಕೆನೆಡಿಯನ್ " + + "ಅಬೊರಿಜಿನಲ್ ಸಿಲ್ಯಾಬಿಕ್ಸ್ಕರೇನ್ಚಾಮ್ಚೆರೋಕೀಸಿರ್ಥ್ಕಾಪ್ಟಿಕ್ಸಿಪ್ರಿಯಾಟ್ಸಿರಿಲಿಕ್" + + "ಪ್ರಾಚೀನ ಚರ್ಚ್ ಸ್ಲೋವಾನಿಕ್ ಸಿರಿಲಿಕ್ದೇವನಾಗರಿಡಸರ್ಟ್ಈಜಿಪ್ಟಿಯನ್ ಡೆಮೋಟಿಕ್ಈಜಿಪ" + + "್ಟಿಯನ್ ಹಯಾರಿಟಿಕ್ಈಜಿಪ್ಟಿಯನ್ ಹೀರೋಗ್ಲಿಫ್ಸ್ಇಥಿಯೋಪಿಕ್ಜಾರ್ಜಿಯನ್ ಖುಸ್ತುರಿಜಾರ್" + + "ಜಿಯನ್ಗ್ಲಾಗೋಲಿಟಿಕ್ಗೋತಿಕ್ಗ್ರೀಕ್ಗುಜರಾತಿಗುರ್ಮುಖಿಹ್ಯಾಂಗುಲ್ಹಾನ್ಹನೂನೂಸರಳೀಕೃತ " + + "ಹಾನ್ಸಾಂಪ್ರದಾಯಿಕ ಹಾನ್ಹೀಬ್ರೂಹಿರಗಾನಾಪಹವ್ ಹ್ಮೋಂಗ್ಕಟಕಾನಾ ಅಥವಾ ಹಿರಗಾನಾಪ್ರಾಚೀ" + + "ನ ಹಂಗೇರಿಯನ್ಸಿಂಧೂಪ್ರಾಚೀನ್ ಇಟಾಲಿಕ್ಜಾವನೀಸ್ಜಾಪನೀಸ್ಕೆಯಾ ಲಿಕಟಕಾನಾಖರೋಶ್ತಿಖಮೇಕ" + + "ನ್ನಡಕೊರಿಯನ್ಕೈಥಿಲಾನಾಲಾವೋಫ್ರಾಕ್ತರ್ ಲ್ಯಾಟಿನ್ಗೇಲಿಕ್ ಲ್ಯಾಟಿನ್ಲ್ಯಾಟಿನ್ಲೆಪ್ಚಾ" + + "ಲಿಂಬುಲೀನಯರ್ ಎಲೀನಯರ್ ಬಿಲೈಸಿಯನ್ಲಿಡಿಯನ್ಮಂಡೇಯನ್ಮನಿಚೈಯನ್ಮಯಾನ್ ಹೀರೋಗ್ಲಿಫ್ಸ್ಮ" + + "ೆರೊಯಿಟಿಕ್ಮಲಯಾಳಂಮಂಗೋಲಿಯನ್ಮೂನ್ಮೈತಿ ಮಯೆಕ್ಮ್ಯಾನ್ಮಾರ್ಎನ್\u200dಕೋಓಘಮ್ಓಲ್ ಚಿಕ" + + "ಿಓರ್ಖೋನ್ಒರಿಯಾಓಸ್ಮಾನ್ಯಾಪ್ರಾಚೀನ ಪೆರ್ಮಿಕ್ಫಾಗ್ಸ್-ಪಾಇನ್ಸ್\u200cಕ್ರಿಪ್ಶನಲ್ ಪ" + + "ಾಹ್ಲವಿಸಾಲ್ಟರ್ ಪಾಹ್ಲವಿಬುಕ್ ಪಾಹ್ಲವಿಫೀನಿಶಿಯನ್ಪೊಲ್ಲಾರ್ಡ್ ಫೊನೆಟಿಕ್ಇನ್ಸ್" + + "\u200cಕ್ರಿಪ್ಶನಲ್ ಪಾರ್ಥಿಯನ್ರೆಜಾಂಗ್ರೋಂಗೋರೋಂಗೋರೂನಿಕ್ಸಮಾರಿಟನ್ಸರಾಟಿಸೌರಾಷ್ಟ್ರಸ" + + "ೈನ್\u200cರೈಟಿಂಗ್ಶಾವಿಯಾನ್ಸಿಂಹಳಸುಂಡಾನೀಸ್ಸೈಲೋಟಿ ನಗ್ರಿಸಿರಿಯಾಕ್ಎಸ್ಟ್ರಾಂಜಿಲೋ" + + " ಸಿರಿಯಾಕ್ಪಶ್ಚಿಮ ಸಿರಿಯಾಕ್ಪೂರ್ವ ಸಿರಿಯಾಕ್ಟಾಗ್ಬಾನವಾಥಾಯ್ ಲಿನ್ಯೂ ಥಾಯ್ ಲುಇತಮಿಳು" + + "ಥಾಯ್ ವಿಯೆಟ್ತೆಲುಗುತೆಂಗ್\u200cವಾರ್ಟಿಫಿನಾಘ್ಟ್ಯಾಗಲೋಗ್ಥಾನಾಥಾಯ್ಟಿಬೇಟನ್ಉಗಾರಿಟ" + + "ಿಕ್ವಾಯ್ವಿಸಿಬಲ್ ಸ್ಪೀಚ್ಪ್ರಾಚೀನ ಪರ್ಶಿಯನ್ಸುಮೇರೋ-ಅಕ್ಕಾಡಿಯನ್ ಕ್ಯೂನಿಫಾರ್ಮ್ಯಿಇ" + + "ನ್\u200dಹೆರಿಟೆಡ್ಗಣೀತ ಸಂಕೇತಲಿಪಿಸಂಕೇತಗಳುಅಲಿಖಿತಸಾಮಾನ್ಯಗೊತ್ತಿಲ್ಲದ ಲಿಪಿ" + +var knScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0015, 0x004c, 0x006a, 0x0085, + 0x009d, 0x009d, 0x009d, 0x00ac, 0x00c1, 0x00ee, 0x0106, 0x011e, + 0x0130, 0x0145, 0x0157, 0x0163, 0x01db, 0x01ea, 0x01f6, 0x0208, + 0x021a, 0x0232, 0x0250, 0x0268, 0x02c5, 0x02dd, 0x02ef, 0x02ef, + 0x0326, 0x0360, 0x03a3, 0x03a3, 0x03be, 0x03f2, 0x040d, 0x0431, + 0x0443, 0x0443, 0x0455, 0x046a, 0x0482, 0x049d, 0x04a9, 0x04b8, + 0x04da, 0x0508, 0x0508, 0x051a, 0x052f, 0x052f, 0x0551, 0x0586, + 0x05b7, 0x05c6, 0x05f4, 0x0609, 0x061e, 0x061e, 0x0631, 0x0643, + // Entry 40 - 7F + 0x0658, 0x0661, 0x0661, 0x0670, 0x0685, 0x0685, 0x0691, 0x069d, + 0x06a9, 0x06dd, 0x0708, 0x0720, 0x0732, 0x0741, 0x0757, 0x0770, + 0x0770, 0x0770, 0x0785, 0x079a, 0x079a, 0x07af, 0x07c7, 0x07fb, + 0x07fb, 0x07fb, 0x0819, 0x082b, 0x082b, 0x0846, 0x0852, 0x0852, + 0x086e, 0x086e, 0x088c, 0x088c, 0x088c, 0x088c, 0x089e, 0x089e, + 0x08aa, 0x08c0, 0x08d5, 0x08e4, 0x08ff, 0x08ff, 0x08ff, 0x092d, + 0x0946, 0x098c, 0x09b7, 0x09d9, 0x09f4, 0x0a2b, 0x0a77, 0x0a8c, + 0x0aaa, 0x0abc, 0x0ad4, 0x0ae3, 0x0ae3, 0x0afe, 0x0b22, 0x0b3a, + // Entry 80 - BF + 0x0b3a, 0x0b3a, 0x0b3a, 0x0b49, 0x0b49, 0x0b64, 0x0b86, 0x0b9e, + 0x0bdb, 0x0c06, 0x0c2e, 0x0c49, 0x0c49, 0x0c5c, 0x0c7f, 0x0c8e, + 0x0c8e, 0x0cad, 0x0cbf, 0x0cdd, 0x0cf5, 0x0d10, 0x0d1c, 0x0d28, + 0x0d3d, 0x0d3d, 0x0d58, 0x0d64, 0x0d8c, 0x0d8c, 0x0d8c, 0x0dba, + 0x0e10, 0x0e16, 0x0e3a, 0x0e62, 0x0e7a, 0x0e8c, 0x0ea1, 0x0ecc, +} // Size: 360 bytes + +var koScriptStr string = "" + // Size: 2788 bytes + "아파카 문자코카시안 알바니아 문자아랍 문자아랍제국 문자아르메니아 문자아베스타 문자발리 문자바뭄 문자바사바흐 문자바타크 문자벵골 문" + + "자블리스기호 문자주음부호브라미브라유 점자부기 문자부히드 문자차크마 문자통합 캐나다 토착어카리 문자칸 고어체로키 문자키르쓰콥트 " + + "문자키프로스 문자키릴 문자고대교회슬라브어 키릴문자데바나가리 문자디저렛 문자듀플로이안 문자고대 이집트 민중문자고대 이집트 신관문" + + "자고대 이집트 신성문자엘바산 문자에티오피아 문자그루지야 쿠츠리 문자그루지야 문자글라골 문자고트 문자그란타 문자그리스 문자구쟈라" + + "티 문자구르무키 문자한글한자하누누 문자한자 간체한자 번체히브리 문자히라가나아나톨리아 상형문자파하우 몽 문자가나고대 헝가리 문자" + + "인더스 문자고대 이탈리아 문자자바 문자일본 문자줄첸 문자카야 리 문자가타카나카로슈티 문자크메르 문자코즈키 문자칸나다 문자한국어" + + "크펠레 문자카이시 문자란나 문자라오 문자독일식 로마자아일랜드식 로마자로마자렙차 문자림부 문자선형 문자(A)선형 문자(B)프레이" + + "저 문자로마 문자리키아 문자리디아 문자마하자니 문자만다이아 문자마니교 문자마야 상형 문자멘데 문자메로에 필기체메로에 문자말라얄" + + "람 문자몽골 문자문 문자므로 문자메이테이 마옉 문자미얀마 문자옛 북부 아라비아 문자나바테아 문자나시 게바 문자응코 문자누슈 문" + + "자오검 문자올 치키 문자오르혼어오리야 문자오스마니아 문자팔미라 문자고대 페름 문자파스파 문자명문 팔라비 문자솔터 팔라비 문자북" + + " 팔라비 문자페니키아 문자폴라드 표음 문자명문 파라티아 문자레장 문자롱고롱고룬 문자사마리아 문자사라티옛 남부 아라비아 문자사우라슈" + + "트라 문자수화 문자샤비안 문자사라다 문자실담자쿠다와디 문자신할라 문자소라 솜펭 문자순다 문자실헤티 나가리시리아 문자에스트랑겔로" + + "식 시리아 문자서부 시리아 문자동부 시리아 문자타그반와 문자타크리 문자타이 레 문자신 타이 루에타밀 문자탕구트 문자태국 베트남" + + " 문자텔루구 문자텡과르 문자티피나그 문자타갈로그 문자타나 문자타이 문자티베트 문자티르후타 문자우가리트 문자바이 문자시화법바랑 크시" + + "티 문자울레아이고대 페르시아 문자수메르-아카드어 설형문자이 문자구전 문자수학 기호기호구전일반 문자기록되지 않은 문자(구전)" + +var koScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0010, 0x0030, 0x0030, 0x003d, 0x0050, 0x0066, 0x0079, + 0x0086, 0x0093, 0x00a6, 0x00b6, 0x00c3, 0x00d9, 0x00e5, 0x00ee, + 0x00fe, 0x010b, 0x011b, 0x012b, 0x0145, 0x0152, 0x015c, 0x016c, + 0x0175, 0x0182, 0x0195, 0x01a2, 0x01c7, 0x01dd, 0x01ed, 0x0203, + 0x0220, 0x023d, 0x025a, 0x026a, 0x0280, 0x029d, 0x02b0, 0x02c0, + 0x02cd, 0x02dd, 0x02ed, 0x0300, 0x0313, 0x0319, 0x031f, 0x032f, + 0x033c, 0x0349, 0x0349, 0x0359, 0x0365, 0x0381, 0x0395, 0x039b, + 0x03b2, 0x03c2, 0x03dc, 0x03e9, 0x03f6, 0x0403, 0x0414, 0x0420, + // Entry 40 - 7F + 0x0433, 0x0443, 0x0453, 0x0463, 0x046c, 0x047c, 0x048c, 0x0499, + 0x04a6, 0x04b9, 0x04d2, 0x04db, 0x04e8, 0x04f5, 0x0505, 0x0515, + 0x0528, 0x0535, 0x0545, 0x0555, 0x0568, 0x057b, 0x058b, 0x059f, + 0x05ac, 0x05bf, 0x05cf, 0x05e2, 0x05e2, 0x05ef, 0x05f9, 0x0606, + 0x0620, 0x0620, 0x0630, 0x064e, 0x0661, 0x0675, 0x0682, 0x068f, + 0x069c, 0x06ad, 0x06b9, 0x06c9, 0x06df, 0x06ef, 0x06ef, 0x0703, + 0x0713, 0x072a, 0x0741, 0x0755, 0x0768, 0x077f, 0x0799, 0x07a6, + 0x07b2, 0x07bc, 0x07cf, 0x07d8, 0x07f6, 0x080f, 0x081c, 0x082c, + // Entry 80 - BF + 0x083c, 0x0845, 0x0858, 0x0868, 0x087c, 0x0889, 0x089c, 0x08ac, + 0x08d2, 0x08e9, 0x0900, 0x0913, 0x0923, 0x0934, 0x0945, 0x0952, + 0x0962, 0x0979, 0x0989, 0x0999, 0x09ac, 0x09bf, 0x09cc, 0x09d9, + 0x09e9, 0x09fc, 0x0a0f, 0x0a1c, 0x0a25, 0x0a3c, 0x0a48, 0x0a62, + 0x0a85, 0x0a8f, 0x0a9c, 0x0aa9, 0x0aaf, 0x0ab5, 0x0ac2, 0x0ae4, +} // Size: 360 bytes + +var kyScriptStr string = "" + // Size: 491 bytes + "АрабАрмянБенгалБопомофоБрейлКириллДеванагариЭфиопГрузинГрекГужаратиГурму" + + "хиХангулХаньЖөн. КытайСалт. КытайИвритХираганаЖапанКатаканаКмерКаннадаК" + + "орейЛаоЛатынМалайаламМоңголМйанмарОрийаСингалаТамилТелуТаанаТайТибетБел" + + "гилерЖазылбаганЖалпыБелгисиз жазуу" + +var kyScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0012, 0x0012, + 0x0012, 0x0012, 0x0012, 0x0012, 0x001e, 0x001e, 0x002e, 0x002e, + 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, + 0x0038, 0x0038, 0x0038, 0x0044, 0x0044, 0x0058, 0x0058, 0x0058, + 0x0058, 0x0058, 0x0058, 0x0058, 0x0062, 0x0062, 0x006e, 0x006e, + 0x006e, 0x006e, 0x0076, 0x0086, 0x0094, 0x00a0, 0x00a8, 0x00a8, + 0x00ba, 0x00ce, 0x00ce, 0x00d8, 0x00e8, 0x00e8, 0x00e8, 0x00e8, + 0x00e8, 0x00e8, 0x00e8, 0x00e8, 0x00f2, 0x00f2, 0x00f2, 0x0102, + // Entry 40 - 7F + 0x0102, 0x010a, 0x010a, 0x0118, 0x0122, 0x0122, 0x0122, 0x0122, + 0x0128, 0x0128, 0x0128, 0x0132, 0x0132, 0x0132, 0x0132, 0x0132, + 0x0132, 0x0132, 0x0132, 0x0132, 0x0132, 0x0132, 0x0132, 0x0132, + 0x0132, 0x0132, 0x0132, 0x0144, 0x0144, 0x0150, 0x0150, 0x0150, + 0x0150, 0x0150, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, 0x015e, + 0x015e, 0x015e, 0x015e, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, + 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, + 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, 0x0168, + // Entry 80 - BF + 0x0168, 0x0168, 0x0168, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, + 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0176, 0x0180, + 0x0180, 0x0180, 0x0188, 0x0188, 0x0188, 0x0188, 0x0192, 0x0198, + 0x01a2, 0x01a2, 0x01a2, 0x01a2, 0x01a2, 0x01a2, 0x01a2, 0x01a2, + 0x01a2, 0x01a2, 0x01a2, 0x01a2, 0x01b2, 0x01c6, 0x01d0, 0x01eb, +} // Size: 360 bytes + +var loScriptStr string = "" + // Size: 3892 bytes + "ອັບຟາກາອາລັບອິມພີຮຽນ ອາເມອິກອາເມນຽນອະເວສຕະບາລີບາມູມບັດຊາບາຕັກເບັງກາລິບລິ" + + "ກຊິມໂບລສຈູ້ອິນພຮາຫມີເບຣວບູກິສບູຮິດຊາກມາສັນຍາລັກຊົນເຜົ່າພື້ນເມືອງແຄນນາດ" + + "າຄາເຮຍຈາມເຊໂຮກີເຊີຮຄອບຕິກໄຊເປຍຊີຣິວລິກເຊຮັດສລາ ໂວນິກຊີຮິກລິກໂບຮານດີວານ" + + "າກາຣີເດເຊເຮຊົວເລດັບໂລຍັນດີໂມຕິກອີຍິບເຮຍຮາຕິກອີຍິບເຮຍໂຮກລິຟອີຍິບອີທິໂອປ" + + "ິກຄອດຊູຮີຈໍເຈຍຈໍຈຽນກລາໂກລິຕິກໂກຮິກເຄນທາກະເລັກຈູຈາຣາທີກົວມູຄີຮັນກູນຮານຮ" + + "ານູໂນໂອຈີນ (ແບບງ່າຍ)ຈີນ (ດັ້ງເດີມ)ຮີບຣິວຣິຣະງະນະອັກລຮະອານາໂຕເລຍປາເຮາເມ" + + "ັງຄະຕະກະນະຫຮືຮີຮະງະນະຮັງກາຮີໂບຮານອິນດັດອີຕາລີໂບຮານຈາວາຍີ່ປຸ່ນຈູຮເຊັນຄຍ" + + "າຄະຕະກະນະຂໍໂຮກສີຂະໝຽນຄໍຈຄີຄັນນາດາເກົາຫຼີເປລເລກາຍຕິລ້ານນາລາວລາຕິນ-ຟຮັ່ງ" + + "ເຕຣລາຕິນ-ແກລິກລາຕິນເລຊາລິມບູລີເນຍລີເນຍຣເຟຣເຊຮໂລມາໄລເຊຍລີເດຍແມນດຽນມານິແ" + + "ຊນມາຍາໄຮໂຮກລິບເມນເດເຄເລີຊີເມໂຮອິຕິກເມໂຮຕິກມາລາຍັນມົງໂກນມູນເມໂຮເມເທມາເຍ" + + "ກມຽນມາອາຮະເບຍເໜືອໂບຮານນາບາທາທຽນກີບາ-ນາຊີເອັນໂກນຸຊຸອອກຄອນໂອຊິກິອອກສມັນຍ" + + "າໂອຣິຢາພາລໄມຮິນເພີມີໂບຮານຟາກສ-ປາປະຫລາວີອິນສຄິບຊັນແນລປະຫລາວີຊອດເຕຮ໌ປະຫລ" + + "າວີບຸກຟີນິເຊຍສັດຕະສາດພໍຮລາພາຮ໌ເທຍອິນສຄຮິປຊັນແນລເຮຈັງຮອງໂກຮອງໂກຮູນິກຊາມ" + + "າເລຍຊາຮາຕິອາລະເບຍໃຕ້ໂບຮານໂສຮັດຕຣະໄຊນ໌ໄຮຕີ້ງຊອວຽນຊາຮາດາດຸດາວາດີສິນຫາລາໂ" + + "ສຮາສົມເປັງຊຸນດາຊີໂລຕິນາກຣີຊີເຮຍຊີເຮຍເອສທຮານຈີໂລຊີເຮຍຕາເວັນຕົກຊີເຮຍຕາເວ" + + "ັນອອກຕັກບັນວາທາຄຮີໄທເລໄທລື້ໃໝ່ທາມິລຕັນກັນໄທຫວຽດເຕລູກູເທງກວາຮທີຟີນາກຕາກ" + + "າລອກທານາໄທທິເບທັນເທຮຸທາຍູກາຮິດໄວຄຳເວົ້າທີ່ເບີ່ງເຫັນໄດ້ວາຮັງກສິຕິໂອລີເອ" + + "ເປຮເຊຍໂບຮານອັກສອນຮູບປລີ່ມສຸເມເຮຍ-ອັດຄາເດຍຍີອິນເຮຮິດເຄື່ອງໝາຍທາງຄະນິດສາ" + + "ດສັນຍາລັກບໍ່ມີພາສາຂຽນສາມັນການຂຽນທີ່ບໍ່ຮູ້ຈັກ" + +var loScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0015, 0x0015, 0x0015, 0x0024, 0x0052, 0x0067, 0x007c, + 0x0088, 0x0097, 0x00a6, 0x00b5, 0x00cd, 0x00ee, 0x0100, 0x0112, + 0x011e, 0x012d, 0x013c, 0x014b, 0x01ab, 0x01ba, 0x01c3, 0x01d5, + 0x01e1, 0x01f3, 0x0202, 0x021a, 0x0269, 0x0287, 0x0299, 0x02c0, + 0x02e4, 0x030b, 0x0335, 0x0335, 0x0350, 0x0374, 0x0383, 0x03a1, + 0x03b0, 0x03bf, 0x03d1, 0x03e9, 0x03fe, 0x0410, 0x0419, 0x0431, + 0x0452, 0x0476, 0x0476, 0x0488, 0x04a0, 0x04cd, 0x04e8, 0x0521, + 0x0545, 0x0557, 0x0578, 0x0584, 0x0599, 0x05ae, 0x05b7, 0x05cf, + // Entry 40 - 7F + 0x05e4, 0x05f3, 0x0602, 0x0617, 0x062c, 0x063b, 0x064a, 0x065c, + 0x0665, 0x068d, 0x06ac, 0x06bb, 0x06c7, 0x06d6, 0x06e5, 0x06f7, + 0x0709, 0x0715, 0x0724, 0x0733, 0x0733, 0x0745, 0x075a, 0x077e, + 0x078d, 0x07bd, 0x07d2, 0x07e7, 0x07e7, 0x07f9, 0x0802, 0x080e, + 0x0829, 0x0829, 0x0838, 0x0868, 0x0883, 0x089c, 0x08ae, 0x08ba, + 0x08cc, 0x08de, 0x08f9, 0x090b, 0x090b, 0x0923, 0x0923, 0x0941, + 0x0954, 0x0990, 0x09ba, 0x09d8, 0x09ed, 0x0a14, 0x0a53, 0x0a62, + 0x0a80, 0x0a8f, 0x0aa4, 0x0ab6, 0x0ae3, 0x0afb, 0x0b19, 0x0b28, + // Entry 80 - BF + 0x0b3a, 0x0b3a, 0x0b52, 0x0b67, 0x0b88, 0x0b97, 0x0bb8, 0x0bc7, + 0x0bf7, 0x0c21, 0x0c4b, 0x0c63, 0x0c72, 0x0c7e, 0x0c96, 0x0ca5, + 0x0cb7, 0x0cc9, 0x0cdb, 0x0cf0, 0x0d05, 0x0d1a, 0x0d26, 0x0d2c, + 0x0d41, 0x0d53, 0x0d68, 0x0d6e, 0x0db0, 0x0dce, 0x0de0, 0x0e01, + 0x0e59, 0x0e5f, 0x0e77, 0x0eb3, 0x0ecb, 0x0eef, 0x0efe, 0x0f34, +} // Size: 360 bytes + +var ltScriptStr string = "" + // Size: 1634 bytes + "AfakaKaukazo Albanijosarabųimperinė aramaikųarmėnųavestanoBaliečiųBamumB" + + "assa Vahbatakbengalų„Bliss“ simboliaibopomofobrahmibrailiobuginezųbuhidč" + + "akmasuvienodinti Kanados aborigenų silabiniaikariųčamčerokiųkirtkoptųkip" + + "rokirilicasenoji bažnytinė slavų kirilicadevanagarideseretasDuplojė sten" + + "ografijaEgipto liaudiesEgipto žyniųegipto hieroglifaiElbasanoetiopųgruzi" + + "nų kutsurigruzinųglagolitikgotųGrantagraikųgudžaratųgurmukihangulhanhanu" + + "nosupaprastinti hantradiciniai hanhebrajųhiraganaAnatolijaus hieroglifai" + + "pahav hmongkatakana / hiraganasenasis vengrųindussenasis italųjaviečiųja" + + "ponųJurchenkajah likatakanakaroštikhmerųKhojkikanadųkorėjiečiųKpelųkaith" + + "ilanalaosiečiųfraktur lotynųgėlų lotynųlotynųlepčalimbulinijiniai Alinij" + + "iniai BFraserLomalicianlidianMahadžanimandėjųmaničųmalų hieroglifaiMende" + + "Merojitų rankraštinismeroitikmalajaliųModimongolųmūnMromeitei majekbirmi" + + "ečiųSenasis šiaurės arabųNabatėjųNaxi GebaenkoNüshuoghamol čikiorkonorij" + + "ųosmanųPalmirosPau Cin Hausenieji permėspagsa parašytiniai pahlavipselt" + + "er pahlavibuk pahvalifoenikųpolard fonetinėrašytiniai partųrejangrongoro" + + "ngorunųsamariečiųsaratisenoji pietų Arabijossauraštraženklų raštasšaviųŠ" + + "aradosSiddhamKhudawadisinhalųSora Sompengsundųsyloti nagrisirųestrangelo" + + " siriečiųvakarų sirųrytų sirųtagbanvaTakritai lenaujasis Tailando luetam" + + "ilųTanguttai vettelugųtengvartifinagtagalogųhanatajųtibetiečiųTirhutauga" + + "ritikvaimatoma kalbaVarang KshitiWoleaisenieji persųŠumero Akado dantira" + + "štisjipaveldėtasmatematiniai simboliaisimboliųneparašytabendrinežinomi " + + "rašmenys" + +var ltScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0005, 0x0016, 0x0016, 0x001c, 0x002f, 0x0037, 0x003f, + 0x0049, 0x004e, 0x0057, 0x005c, 0x0064, 0x0079, 0x0081, 0x0087, + 0x008e, 0x0097, 0x009c, 0x00a2, 0x00cc, 0x00d2, 0x00d6, 0x00df, + 0x00e3, 0x00e9, 0x00ee, 0x00f6, 0x0118, 0x0122, 0x012b, 0x0140, + 0x014f, 0x015d, 0x016f, 0x0177, 0x017e, 0x018e, 0x0196, 0x01a0, + 0x01a5, 0x01ab, 0x01b2, 0x01bd, 0x01c4, 0x01ca, 0x01cd, 0x01d3, + 0x01e4, 0x01f3, 0x01f3, 0x01fb, 0x0203, 0x021a, 0x0225, 0x0238, + 0x0247, 0x024c, 0x025a, 0x0264, 0x026b, 0x0272, 0x027a, 0x0282, + // Entry 40 - 7F + 0x028a, 0x0291, 0x0297, 0x029e, 0x02ab, 0x02b1, 0x02b7, 0x02bb, + 0x02c6, 0x02d5, 0x02e3, 0x02ea, 0x02f0, 0x02f5, 0x0301, 0x030d, + 0x0313, 0x0317, 0x031d, 0x0323, 0x032d, 0x0336, 0x033e, 0x034f, + 0x0354, 0x036b, 0x0373, 0x037d, 0x0381, 0x0389, 0x038d, 0x0390, + 0x039c, 0x039c, 0x03a7, 0x03bf, 0x03c9, 0x03d2, 0x03d6, 0x03dc, + 0x03e1, 0x03e9, 0x03ee, 0x03f4, 0x03fb, 0x0403, 0x040e, 0x041d, + 0x0425, 0x0438, 0x0447, 0x0452, 0x045a, 0x046a, 0x047c, 0x0482, + 0x048c, 0x0491, 0x049d, 0x04a3, 0x04b9, 0x04c3, 0x04d3, 0x04da, + // Entry 80 - BF + 0x04e2, 0x04e9, 0x04f2, 0x04fa, 0x0506, 0x050c, 0x0518, 0x051d, + 0x0532, 0x053f, 0x054a, 0x0552, 0x0557, 0x055d, 0x0572, 0x0579, + 0x057f, 0x0586, 0x058d, 0x0594, 0x059b, 0x05a4, 0x05a8, 0x05ad, + 0x05b9, 0x05c0, 0x05c8, 0x05cb, 0x05d7, 0x05e4, 0x05ea, 0x05f8, + 0x0612, 0x0614, 0x061f, 0x0635, 0x063e, 0x0649, 0x064f, 0x0662, +} // Size: 360 bytes + +var lvScriptStr string = "" + // Size: 761 bytes + "arābuaramiešuarmēņubaliešubengāļubopomofobrahmiBraila rakstsirokēzukoptu" + + "kirilicasenslāvudevānagāridemotiskais rakstshierātiskais rakstsēģiptiešu" + + " hieroglifietiopiešugruzīnugotugrieķugudžaratupandžabuhangilaķīniešuhanu" + + " vienkāršotāhanu tradicionālāivritshiraganakatakana vai hiraganasenungār" + + "uvecitāļujaviešujapāņukatakanakhmerukannarukorejiešulaosiešulatīņulineār" + + "ā Alineārā BlīdiešumaijumalajalumongoļuMūna rakstsbirmiešuogamiskais ra" + + "kstsorijuosmaņu turkufeniķiešurongorongorūnu rakstssamariešusingāļuzundu" + + "sīriešurietumsīriešuaustrumsīriešutamilutelugutagalutaanatajutibetiešuse" + + "nperiešušumeru-akadiešu ķīļrakstsjimantotāmatemātiskais pierakstssimboli" + + "bez rakstībasvispārējānezināma rakstība" + +var lvScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000f, 0x0017, 0x0017, + 0x001f, 0x001f, 0x001f, 0x001f, 0x0028, 0x0028, 0x0030, 0x0036, + 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x004b, + 0x004b, 0x0050, 0x0050, 0x0058, 0x0061, 0x006d, 0x006d, 0x006d, + 0x007f, 0x0093, 0x00aa, 0x00aa, 0x00b4, 0x00b4, 0x00bc, 0x00bc, + 0x00c0, 0x00c0, 0x00c7, 0x00d1, 0x00da, 0x00e1, 0x00eb, 0x00eb, + 0x00fe, 0x0111, 0x0111, 0x0117, 0x011f, 0x011f, 0x011f, 0x0134, + 0x013e, 0x013e, 0x0148, 0x0150, 0x0158, 0x0158, 0x0158, 0x0160, + // Entry 40 - 7F + 0x0160, 0x0166, 0x0166, 0x016d, 0x0177, 0x0177, 0x0177, 0x0177, + 0x0180, 0x0180, 0x0180, 0x0188, 0x0188, 0x0188, 0x0193, 0x019e, + 0x019e, 0x019e, 0x019e, 0x01a7, 0x01a7, 0x01a7, 0x01a7, 0x01ac, + 0x01ac, 0x01ac, 0x01ac, 0x01b4, 0x01b4, 0x01bc, 0x01c8, 0x01c8, + 0x01c8, 0x01c8, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, 0x01d1, + 0x01e2, 0x01e2, 0x01e2, 0x01e7, 0x01f4, 0x01f4, 0x01f4, 0x01f4, + 0x01f4, 0x01f4, 0x01f4, 0x01f4, 0x01ff, 0x01ff, 0x01ff, 0x01ff, + 0x0209, 0x0215, 0x021f, 0x021f, 0x021f, 0x021f, 0x021f, 0x021f, + // Entry 80 - BF + 0x021f, 0x021f, 0x021f, 0x0228, 0x0228, 0x022d, 0x022d, 0x0236, + 0x0236, 0x0245, 0x0255, 0x0255, 0x0255, 0x0255, 0x0255, 0x025b, + 0x025b, 0x025b, 0x0261, 0x0261, 0x0261, 0x0267, 0x026c, 0x0270, + 0x027a, 0x027a, 0x027a, 0x027a, 0x027a, 0x027a, 0x027a, 0x0285, + 0x02a3, 0x02a5, 0x02ad, 0x02c5, 0x02cc, 0x02da, 0x02e6, 0x02f9, +} // Size: 360 bytes + +var mkScriptStr string = "" + // Size: 3505 bytes + "афакакавкаскоалбанскиарапско писмоцарскоарамејскиерменско писмоавестанск" + + "обалискобамумскобасабатачкобенгалско писмоблиссимболибопомофобрамибрајо" + + "во писмобугискобухидскочакманскоканадско слоговнокарискочамскочерокиско" + + "кирткоптскокипарскокирилско писмостарословенска кирилицадеванагаридезер" + + "етскоДиплојеево стенографскоегипетско демотскоегипетско хиератскоегипет" + + "ски хиероглифиелбасанскоетиопско писмогрузиски хуцуригрузиско писмоглаг" + + "олицаготскогрантагрчко писмогуџаратигурмукихангулханско писмохануноовск" + + "опоедноставено ханско писмотрадиционално ханскохебрејско писмохираганаа" + + "надолски хиероглифипахауанско хмоншкојапонско слоговностароунгарскохара" + + "пскостароиталскојаванскојапонско писмоџурченскокаја ликатаканакароштикм" + + "ерско писмохоџкиканнадакорејско писмокпелскокајтилансколаошко писмофрак" + + "турна латиницагелска латиницалатинично писмолепчансколимбулинеарно Алин" + + "еарно БФрејзероволомсколикисколидискомахаџанимандејскоманихејскомајанск" + + "и хиероглифимендскомероитско ракописномероитскомалајаламско писмомодимо" + + "нголско писмоМуновомромејтејскомјанмарско писмостаросеверноарапсконабат" + + "ејсконасиска гебанконишуогамол чикистаротурскооријанско писмосомалископ" + + "алмирскоПаучинхауовостаропермскопагспанатписно средноперсископсалтирско" + + " средноперсискокнижевно староперсискофеникискоПолардовонатписно партиско" + + "реџаншкоронгоронгорунскосамарјанскосаратистаројужноарапскосаураштранско" + + "знаковно пишувањеШоовошарадасидамкудабадисинхалско писмосоранг сомпенгс" + + "унданскосилхетско нагарисирискоестрангелско сирискозападносирискоисточн" + + "осирискотагбанванскотакритај леново тај луетамилско писмотангутскотај в" + + "јеттелугутенгвартифинагтагалошкотанатајландско писмотибетско писмотирху" + + "таугаритсковајвидлив говорваранг кшитиволеајскостароперсискосумероакадс" + + "ко клинестојинаследеноматематичка нотацијасимболибез писмоопштонепознат" + + "о писмо" + +var mkScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x000a, 0x002a, 0x002a, 0x0043, 0x0061, 0x007c, 0x0090, + 0x009e, 0x00ae, 0x00b6, 0x00c4, 0x00e1, 0x00f7, 0x0107, 0x0111, + 0x012a, 0x0138, 0x0148, 0x015a, 0x017b, 0x0189, 0x0195, 0x01a7, + 0x01af, 0x01bd, 0x01cd, 0x01e8, 0x0215, 0x0229, 0x023d, 0x026a, + 0x028d, 0x02b2, 0x02d9, 0x02ed, 0x0308, 0x0325, 0x0340, 0x0352, + 0x035e, 0x036a, 0x037f, 0x038f, 0x039d, 0x03a9, 0x03c0, 0x03d6, + 0x0408, 0x042f, 0x042f, 0x044c, 0x045c, 0x0483, 0x04a6, 0x04c7, + 0x04e1, 0x04f1, 0x0509, 0x0519, 0x0534, 0x0546, 0x0553, 0x0563, + // Entry 40 - 7F + 0x0571, 0x058a, 0x0594, 0x05a2, 0x05bd, 0x05cb, 0x05d5, 0x05e1, + 0x05f8, 0x061b, 0x0638, 0x0655, 0x0667, 0x0671, 0x0684, 0x0697, + 0x06ab, 0x06b7, 0x06c5, 0x06d3, 0x06e3, 0x06f5, 0x0709, 0x072e, + 0x073c, 0x0761, 0x0773, 0x0796, 0x079e, 0x07bb, 0x07c7, 0x07cd, + 0x07df, 0x07df, 0x07fe, 0x0824, 0x0838, 0x084f, 0x0855, 0x085d, + 0x0865, 0x0872, 0x0888, 0x08a5, 0x08b7, 0x08c9, 0x08e1, 0x08f9, + 0x0905, 0x0932, 0x0963, 0x098e, 0x09a0, 0x09b2, 0x09d3, 0x09e3, + 0x09f7, 0x0a03, 0x0a19, 0x0a25, 0x0a47, 0x0a61, 0x0a82, 0x0a8c, + // Entry 80 - BF + 0x0a98, 0x0aa2, 0x0ab2, 0x0acf, 0x0aea, 0x0afc, 0x0b1b, 0x0b29, + 0x0b50, 0x0b6c, 0x0b88, 0x0ba0, 0x0baa, 0x0bb5, 0x0bcb, 0x0be6, + 0x0bf8, 0x0c07, 0x0c13, 0x0c21, 0x0c2f, 0x0c41, 0x0c49, 0x0c68, + 0x0c83, 0x0c91, 0x0ca3, 0x0ca9, 0x0cc0, 0x0cd7, 0x0ce9, 0x0d03, + 0x0d2e, 0x0d32, 0x0d44, 0x0d6b, 0x0d79, 0x0d8a, 0x0d94, 0x0db1, +} // Size: 360 bytes + +var mlScriptStr string = "" + // Size: 3465 bytes + "അറബിക്അർമിഅർമേനിയൻഅവെസ്ഥൻബാലിനീസ്ബട്ടക്ബംഗാളിബ്ലിസ് ചിത്ര ലിപിബോപ്പോമോഫോ" + + "ബ്രാഹ്മിബ്രെയ്\u200cലിബുഗിനീസ്ബുഹിഡ്ചകംഏകീകൃത കനേഡിയൻ ഗോത്രലിപിചരിയൻഛം" + + "ചെറോക്കിചിർത്ത്കോപ്റ്റിക്സൈപ്രിയോട്ട്സിറിലിക്പുരാതന ചർച്ച് സ്ലവോണിക് സ" + + "ിറിലിക്ദേവനാഗരിഡെസെർട്ട്ഈജിപ്ഷ്യൻ ഡിമോട്ടിക്ഈജിപ്ഷ്യൻ ഹിരാറ്റിക്ഈജിപ്ഷ" + + "്യൻ ചിത്രലിപിഎത്യോപിക്ജോർജ്ജിയൻ ഖുട്സുരിജോർജ്ജിയൻഗ്ലഗോലിറ്റിക്ഗോഥിക്ഗ്" + + "രീക്ക്ഗുജറാത്തിഗുരുമുഖിഹാംഗുൽഹാൻഹനുനൂലളിതവൽക്കരിച്ച ഹാൻപരമ്പരാഗത ഹാൻഹീ" + + "ബ്രുഹിരഗാനപഹ്വാ ഹമോംഗ്കടകാനയോ ഹിരാഗാനയോപുരാതന ഹംഗേറിയൻസിന്ധുപഴയ ഇറ്റാല" + + "ിയൻജാവനീസ്ജാപ്പനീസ്കയാ ലികറ്റക്കാനഖരോഷ്ടിഖമെർകന്നഡകൊറിയൻക്തിലന്നലാവോഫ്" + + "രാക്ടുർ ലാറ്റിൻഗെയ്\u200cലിക് ലാറ്റിൻലാറ്റിൻലെപ്ചലിംബുസമരേഖയിലുള്ള എലീ" + + "നിയർ ബിലൈസിൻലൈഡിയൻമൻഡേയൻമണിചേയൻമായൻ ചിത്രലിപിമെറോയിറ്റിക്മലയാളംമംഗോളിയ" + + "ൻമൂൺമേറ്റി മായക്മ്യാൻമാർഎൻകോഒഖാംഒൽ ചിക്കിഒർഖോൺഒഡിയഒസ്\u200cമാനിയപുരാതന" + + " പെർമിക്ഫഗസ് പഎഴുത്തു പഹൽവിസാൾട്ടർ പഹൽവിപഹൽവി ലിപിഫിനീഷ്യൻപൊള്ളാർഡ് ശബ്ദ" + + "ലിപിപൃതിറെജാംഗ്റൊംഗോറൊംഗോറുണിക്സമരിയസരതിസൗരാഷ്ട്രചിഹ്നലിപിഷാവിയൻസിംഹളസ" + + "ന്താനീസ്സൈലോതി നാഗരിസിറിയക്ക്എസ്റ്റ്രാംഗ്ലോ സിറിയക്പശ്ചിമസുറിയാനികിഴക്" + + "കൻ സിറിയക്തഗ്ബൻവാതായ് ലേപുതിയ തായ് ല്യൂതമിഴ്ത്വട്തെലുങ്ക്തെംഗ്വർതിഫിനാ" + + "ഗ്തഗലോഗ്ഥാനതായ്ടിബറ്റൻഉഗ്രൈറ്റിക്വൈദൃശ്യഭാഷപഴയ പേർഷ്യൻസുമേറോ അക്കാഡിയൻ" + + " ക്യുണിഫോംയിപാരമ്പര്യമായഗണിത രൂപംചിഹ്നങ്ങൾഎഴുതപ്പെടാത്തത്സാധാരണഅജ്ഞാത ലി" + + "പി" + +var mlScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x001e, 0x0036, 0x004b, + 0x0063, 0x0063, 0x0063, 0x0075, 0x0087, 0x00b6, 0x00d4, 0x00ec, + 0x0107, 0x011f, 0x0131, 0x013a, 0x017e, 0x018d, 0x0193, 0x01ab, + 0x01c0, 0x01de, 0x0202, 0x021a, 0x0274, 0x028c, 0x02a7, 0x02a7, + 0x02e1, 0x031b, 0x0352, 0x0352, 0x036d, 0x03a1, 0x03bc, 0x03e3, + 0x03f5, 0x03f5, 0x040d, 0x0428, 0x0440, 0x0452, 0x045b, 0x046a, + 0x049e, 0x04c3, 0x04c3, 0x04d5, 0x04e7, 0x04e7, 0x0509, 0x053a, + 0x0565, 0x0577, 0x059c, 0x05b1, 0x05cc, 0x05cc, 0x05dc, 0x05f7, + // Entry 40 - 7F + 0x060c, 0x0618, 0x0618, 0x0627, 0x0639, 0x0639, 0x0645, 0x0651, + 0x065d, 0x068e, 0x06bf, 0x06d4, 0x06e3, 0x06f2, 0x071a, 0x0733, + 0x0733, 0x0733, 0x0742, 0x0754, 0x0754, 0x0766, 0x077b, 0x07a3, + 0x07a3, 0x07a3, 0x07c7, 0x07d9, 0x07d9, 0x07f1, 0x07fa, 0x07fa, + 0x081c, 0x081c, 0x0834, 0x0834, 0x0834, 0x0834, 0x0840, 0x0840, + 0x084c, 0x0865, 0x0874, 0x0880, 0x089b, 0x089b, 0x089b, 0x08c3, + 0x08d3, 0x08f8, 0x091d, 0x0939, 0x0951, 0x0985, 0x0991, 0x09a6, + 0x09c4, 0x09d6, 0x09e5, 0x09f1, 0x09f1, 0x0a0c, 0x0a27, 0x0a39, + // Entry 80 - BF + 0x0a39, 0x0a39, 0x0a39, 0x0a48, 0x0a48, 0x0a63, 0x0a85, 0x0aa0, + 0x0ae0, 0x0b0a, 0x0b35, 0x0b4a, 0x0b4a, 0x0b5d, 0x0b86, 0x0b95, + 0x0b95, 0x0ba4, 0x0bbc, 0x0bd1, 0x0be9, 0x0bfb, 0x0c04, 0x0c10, + 0x0c25, 0x0c25, 0x0c46, 0x0c4c, 0x0c64, 0x0c64, 0x0c64, 0x0c83, + 0x0ccd, 0x0cd3, 0x0cf7, 0x0d10, 0x0d2b, 0x0d58, 0x0d6a, 0x0d89, +} // Size: 360 bytes + +var mnScriptStr string = "" + // Size: 532 bytes + "арабарменбенгалвопомофобрайлкирилдеванагариэтиопгүржгрекгүжаратигурмукхи" + + "хангулханхялбаршуулсан ханзуламжлалт ханзеврейхираганаяпонкатаканакхмер" + + "каннадасолонгослаослатинмалаяламмонгол бичигмьянмарориясинхалатамилтэлү" + + "гүтанатайтөвдтэмдэгбичигдээгүйнийтлэгтодорхойгүй бичиг" + +var mnScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0012, 0x0012, + 0x0012, 0x0012, 0x0012, 0x0012, 0x001e, 0x001e, 0x002e, 0x002e, + 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, 0x0038, + 0x0038, 0x0038, 0x0038, 0x0042, 0x0042, 0x0056, 0x0056, 0x0056, + 0x0056, 0x0056, 0x0056, 0x0056, 0x0060, 0x0060, 0x0068, 0x0068, + 0x0068, 0x0068, 0x0070, 0x0080, 0x0090, 0x009c, 0x00a2, 0x00a2, + 0x00c5, 0x00e0, 0x00e0, 0x00ea, 0x00fa, 0x00fa, 0x00fa, 0x00fa, + 0x00fa, 0x00fa, 0x00fa, 0x00fa, 0x0102, 0x0102, 0x0102, 0x0112, + // Entry 40 - 7F + 0x0112, 0x011c, 0x011c, 0x012a, 0x013a, 0x013a, 0x013a, 0x013a, + 0x0142, 0x0142, 0x0142, 0x014c, 0x014c, 0x014c, 0x014c, 0x014c, + 0x014c, 0x014c, 0x014c, 0x014c, 0x014c, 0x014c, 0x014c, 0x014c, + 0x014c, 0x014c, 0x014c, 0x015c, 0x015c, 0x0173, 0x0173, 0x0173, + 0x0173, 0x0173, 0x0181, 0x0181, 0x0181, 0x0181, 0x0181, 0x0181, + 0x0181, 0x0181, 0x0181, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, + 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, + 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, + // Entry 80 - BF + 0x0189, 0x0189, 0x0189, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, + 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x0197, 0x01a1, + 0x01a1, 0x01a1, 0x01ad, 0x01ad, 0x01ad, 0x01ad, 0x01b5, 0x01bb, + 0x01c3, 0x01c3, 0x01c3, 0x01c3, 0x01c3, 0x01c3, 0x01c3, 0x01c3, + 0x01c3, 0x01c3, 0x01c3, 0x01c3, 0x01cf, 0x01e5, 0x01f3, 0x0214, +} // Size: 360 bytes + +var mrScriptStr string = "" + // Size: 3386 bytes + "अरबीइम्पिरियल आर्मेनिकअर्मेनियनअवेस्तानबालीबटाकबंगालीब्लिसिम्बॉल्सबोपोमो" + + "फोब्रह्मीब्रेलबूगीबुहिदचकमायूनिफाइड कॅनेडियन अ\u200dॅबोरिदनल सिलॅबिक्स" + + "कॅरियनचामचेरोकीकिर्थकॉप्टिकसायप्रिऑटसीरिलिकपुरातन चर्च स्लाव्होनिक सिर" + + "िलिकदेवनागरीडेसर्टइजिप्शियन डेमोटिकइजिप्शियन हायरेटिकइजिप्शियन हायरोग्" + + "लिफ्सईथिओपिकजॉर्जियन खुत्सुरीजॉर्जियनग्लॅगोलिटिकगोथिकग्रीकगुजरातीगुरुम" + + "ुखीहंगुलहानहनुनूसरलीकृत हानपारंपारिक हानहिब्रूहिरागानापहाउ मंगकॅटाकना " + + "आणि हिरागानापुरातन हंगेरियनसिन्धुजुनी इटालिकजावानीसजपानीकायाह लीकॅटाका" + + "नाखारोश्थीख्मेरकन्नडकोरियनकाइथीलानालाओफ्रॅक्तुर लॅटिनगाएलिक लेटिनलॅटिन" + + "लेपचालिम्बूलीनियार अलीनियर बीलायशियानलायडियानमान्डायीनमानीचायीनमायान ह" + + "ाइरोग्लिफ्समेरोइटिकमल्याळममंगोलियनमूनमेइतेइ मायेकम्यानमारएन्‘कोओघामओल " + + "चिकिओर्खोनउडियाउस्मानियापुरातन पर्मिकफाग्स-पाइन्स्क्रिप्शनल पाहलवीसॉल्" + + "टर पाहलवीबुक पाहलवीफोनिशियनपोलार्ड फोनेटिकइन्स्क्रिप्शनल पर्थियनरीजांग" + + "रोन्गोरोन्गोरूनिकसमरिटानसरातीसौराष्ट्रसंकेत लिपीशॅव्हियनसिंहलासूदानीसि" + + "लोती नागरीसिरीयाकएस्त्ट्रेन्जेलो सिरियाकपश्चिमी सिरियाकपूर्वी सिरियाकत" + + "गोआन्वाताई लीनवीन ताई लूतामिळताई विएततेलगुतेन्गवारतिफिनाघटागालोगथानाथा" + + "ईतिबेटीयुगारिटिकवाईदृश्य संवादपुरातन फारसीदृश्यमान भाषायीवंशपरंपरागतगण" + + "िती संकेतलिपीप्रतीकअलिखितसामान्यअज्ञात लिपी" + +var mrScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x0040, 0x005b, 0x0073, + 0x007f, 0x007f, 0x007f, 0x008b, 0x009d, 0x00c4, 0x00dc, 0x00f1, + 0x0100, 0x010c, 0x011b, 0x0127, 0x0193, 0x01a5, 0x01ae, 0x01c0, + 0x01cf, 0x01e4, 0x01ff, 0x0214, 0x026b, 0x0283, 0x0295, 0x0295, + 0x02c6, 0x02fa, 0x033a, 0x033a, 0x034f, 0x0380, 0x0398, 0x03b9, + 0x03c8, 0x03c8, 0x03d7, 0x03ec, 0x0404, 0x0413, 0x041c, 0x042b, + 0x044a, 0x046f, 0x046f, 0x0481, 0x0499, 0x0499, 0x04af, 0x04e7, + 0x0512, 0x0524, 0x0543, 0x0558, 0x0567, 0x0567, 0x057d, 0x0595, + // Entry 40 - 7F + 0x05ad, 0x05bc, 0x05bc, 0x05cb, 0x05dd, 0x05dd, 0x05ec, 0x05f8, + 0x0601, 0x062c, 0x064e, 0x065d, 0x066c, 0x067e, 0x0697, 0x06b0, + 0x06b0, 0x06b0, 0x06c8, 0x06e0, 0x06e0, 0x06fb, 0x0716, 0x074a, + 0x074a, 0x074a, 0x0762, 0x0777, 0x0777, 0x078f, 0x0798, 0x0798, + 0x07ba, 0x07ba, 0x07d2, 0x07d2, 0x07d2, 0x07d2, 0x07e4, 0x07e4, + 0x07f0, 0x0803, 0x0815, 0x0824, 0x083f, 0x083f, 0x083f, 0x0864, + 0x087a, 0x08b7, 0x08dc, 0x08f8, 0x0910, 0x093b, 0x097b, 0x098d, + 0x09b1, 0x09c0, 0x09d5, 0x09e4, 0x09e4, 0x09ff, 0x0a1b, 0x0a33, + // Entry 80 - BF + 0x0a33, 0x0a33, 0x0a33, 0x0a45, 0x0a45, 0x0a57, 0x0a79, 0x0a8e, + 0x0ad1, 0x0afc, 0x0b24, 0x0b3c, 0x0b3c, 0x0b4c, 0x0b69, 0x0b78, + 0x0b78, 0x0b8e, 0x0b9d, 0x0bb5, 0x0bca, 0x0bdf, 0x0beb, 0x0bf4, + 0x0c06, 0x0c06, 0x0c21, 0x0c2a, 0x0c49, 0x0c49, 0x0c49, 0x0c6b, + 0x0c90, 0x0c96, 0x0cb7, 0x0ce2, 0x0cf4, 0x0d06, 0x0d1b, 0x0d3a, +} // Size: 360 bytes + +var msScriptStr string = "" + // Size: 289 bytes + "ArabArmeniaBaliBamuBengaliBopomofoBrailleCansCyrilDevanagariEthiopiaGeor" + + "giaGreekGujaratGurmukhiHangulHanHan RingkasHan TradisionalIbraniHiragana" + + "JepunKatakanaKhmerKannadaKoreaLaoLatinMalayalamMongoliaMyammarOriyaSinha" + + "laTamilTeluguThaanaThaiTibetSimbolTidak ditulisBiasaSkrip Tidak Diketahu" + + "i" + +var msScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0004, 0x000b, 0x000b, + 0x000f, 0x0013, 0x0013, 0x0013, 0x001a, 0x001a, 0x0022, 0x0022, + 0x0029, 0x0029, 0x0029, 0x0029, 0x002d, 0x002d, 0x002d, 0x002d, + 0x002d, 0x002d, 0x002d, 0x0032, 0x0032, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x0044, 0x0044, 0x004b, 0x004b, + 0x004b, 0x004b, 0x0050, 0x0057, 0x005f, 0x0065, 0x0068, 0x0068, + 0x0073, 0x0082, 0x0082, 0x0088, 0x0090, 0x0090, 0x0090, 0x0090, + 0x0090, 0x0090, 0x0090, 0x0090, 0x0095, 0x0095, 0x0095, 0x009d, + // Entry 40 - 7F + 0x009d, 0x00a2, 0x00a2, 0x00a9, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00b1, 0x00b1, 0x00b1, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, + 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, + 0x00b6, 0x00b6, 0x00b6, 0x00bf, 0x00bf, 0x00c7, 0x00c7, 0x00c7, + 0x00c7, 0x00c7, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, + 0x00ce, 0x00ce, 0x00ce, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, + 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, + 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, + // Entry 80 - BF + 0x00d3, 0x00d3, 0x00d3, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, + 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00da, 0x00df, + 0x00df, 0x00df, 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00eb, 0x00ef, + 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00f4, + 0x00f4, 0x00f4, 0x00f4, 0x00f4, 0x00fa, 0x0107, 0x010c, 0x0121, +} // Size: 360 bytes + +var myScriptStr string = "" + // Size: 1208 bytes + "အာရေဗျအာမေးနီးယားဘင်္ဂါလီဘိုပိုဗြဟ္မမီဘရေစစ်ရိလစ်ဒီဗနာဂရီအီသီယိုးပီးယားဂ" + + "ျော်ဂျီယန်ဂရိဂုဂျာရသီဂူရူဟန်ဂူးလ်ဟန်ရိုးရှင်းသော ဟန်ရှေးရိုးစဉ်လာဟန်ဟီ" + + "ဗရူးဟိရဂဏခတခဏ သို့မဟုတ် ဟိရဂဏဂျာဗားနီးစ်ဂျပန်ကယားလီခတခဏခမာခန္နာဒါကိုးရ" + + "ီးယားလာအိုလက်တင်မာလာရာလန်မွန်ဂိုလီးယားမြန်မာအိုရာဆင်ဟာလတိုင်လီတမီးလ်တီ" + + "လုတဂလော့ဂ်သာအ်ထိုင်းတိဘက်မြင်နိုင်သော စကားပါရှန် အဟောင်းရီသင်္ကေတမရေးထ" + + "ားသောအများနှင့်သက်ဆိုင်သောမသိ သို့မဟုတ် မရှိသော စကားလုံး" + +var myScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x0012, 0x0033, 0x0033, + 0x0033, 0x0033, 0x0033, 0x0033, 0x004b, 0x004b, 0x005d, 0x0072, + 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, + 0x007b, 0x007b, 0x007b, 0x0093, 0x0093, 0x00ab, 0x00ab, 0x00ab, + 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00d5, 0x00d5, 0x00f6, 0x00f6, + 0x00f6, 0x00f6, 0x00ff, 0x0117, 0x0123, 0x013b, 0x0144, 0x0144, + 0x0172, 0x01a2, 0x01a2, 0x01b4, 0x01c3, 0x01c3, 0x01c3, 0x01fb, + 0x01fb, 0x01fb, 0x01fb, 0x021c, 0x022b, 0x022b, 0x023d, 0x0249, + // Entry 40 - 7F + 0x0249, 0x0252, 0x0252, 0x0267, 0x0285, 0x0285, 0x0285, 0x0285, + 0x0294, 0x0294, 0x0294, 0x02a6, 0x02a6, 0x02a6, 0x02a6, 0x02a6, + 0x02a6, 0x02a6, 0x02a6, 0x02a6, 0x02a6, 0x02a6, 0x02a6, 0x02a6, + 0x02a6, 0x02a6, 0x02a6, 0x02c1, 0x02c1, 0x02e8, 0x02e8, 0x02e8, + 0x02e8, 0x02e8, 0x02fa, 0x02fa, 0x02fa, 0x02fa, 0x02fa, 0x02fa, + 0x02fa, 0x02fa, 0x02fa, 0x0309, 0x0309, 0x0309, 0x0309, 0x0309, + 0x0309, 0x0309, 0x0309, 0x0309, 0x0309, 0x0309, 0x0309, 0x0309, + 0x0309, 0x0309, 0x0309, 0x0309, 0x0309, 0x0309, 0x0309, 0x0309, + // Entry 80 - BF + 0x0309, 0x0309, 0x0309, 0x031b, 0x031b, 0x031b, 0x031b, 0x031b, + 0x031b, 0x031b, 0x031b, 0x031b, 0x031b, 0x0330, 0x0330, 0x0342, + 0x0342, 0x0342, 0x034e, 0x034e, 0x034e, 0x0366, 0x0372, 0x0384, + 0x0393, 0x0393, 0x0393, 0x0393, 0x03c4, 0x03c4, 0x03c4, 0x03ec, + 0x03ec, 0x03f2, 0x03f2, 0x03f2, 0x0407, 0x0425, 0x0464, 0x04b8, +} // Size: 360 bytes + +var neScriptStr string = "" + // Size: 3010 bytes + "अरबीआर्मीआर्मेनियालीआभेस्टानबालीबाटकबङ्गालीब्लिजसिम्बोल्सबोपोमोफोब्राह्म" + + "ीब्रेलबुगिनिजबुहिदकाक्म्कारियनचामचेरोकीकिर्थकप्टिककप्रियटसिरिलिकदेवाना" + + "गरीडेसेरेटइजिप्टियन डेमोटिकइजिप्टियन हाइरटिकइजिप्टियन हाइरोग्लिफ्सइथिय" + + "ोपिकग्रुजियाली खुट्सुरीजोर्जियनग्लागोलिटिकगोथिकग्रीकगुजरातीगुरूमुखीहान" + + "्गुलहानहानुनुसरलिकृत चिनीपरम्परागत चिनीहिब्रुहिरागनापहावह हमोङ्गकाताका" + + "ना वा हिरागानापुरानो हङ्गेरियालीइन्दुसपुरानो इटालिकजाभानीजापानीकायाहली" + + "काताकानाखारोस्थितिखमेरकान्नाडाकोरियनक्थीलान्नालाओफ्राक्टुर ल्याटिनग्या" + + "लिक ल्याटिनल्याटिनलेप्चालिम्बुलाइसियनलाइडियनमान्डाएनमानिकाएनमाया हाइरो" + + "ग्लिफ्समेरियोटिकमलायालममङ्गोलजूनमाइटेइ मायेकम्यान्मारएन्कोओघामओलचिकीओर" + + "्खोनओडियाओस्मान्यापुरानो पर्मिकफाग्स-पाफ्लिफ्ल्पबुक पहल्भीफोनिसियनपोल्" + + "लार्ड फोनेटिकपिआरटीरेजाङरोङ्गोरोङ्गोरूनिकसमारिटनसारतीसौराष्ट्रसाइनराइट" + + "िङशाभियनसिन्हालास्ल्योटी नाग्रीसिरियाकइस्ट्रेनजेलो सिरियाकपश्चिमी सिरि" + + "याकपूर्वी सिरियाकटाग्वान्वाटाइलेन्यू टाइ लुइतामिलटाभ्टतेलुगुटेङ्वारटिफ" + + "िनाघटागालोगथानाथाईतिब्बतीयुगारिटिकभाइदृश्यमय वाणीपुरानो पर्सियनयीइन्हे" + + "रिटेडजमथप्रतीकहरूनलेखिएकोसाझाअज्ञात लिपि" + +var neScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x001b, 0x003c, 0x0054, + 0x0060, 0x0060, 0x0060, 0x006c, 0x0081, 0x00ab, 0x00c3, 0x00db, + 0x00ea, 0x00ff, 0x010e, 0x0120, 0x0120, 0x0132, 0x013b, 0x014d, + 0x015c, 0x016e, 0x0183, 0x0198, 0x0198, 0x01b3, 0x01c8, 0x01c8, + 0x01f9, 0x022a, 0x026a, 0x026a, 0x0282, 0x02b9, 0x02d1, 0x02f2, + 0x0301, 0x0301, 0x0310, 0x0325, 0x033d, 0x0352, 0x035b, 0x036d, + 0x038f, 0x03b7, 0x03b7, 0x03c9, 0x03de, 0x03de, 0x0400, 0x0438, + 0x046c, 0x047e, 0x04a3, 0x04b5, 0x04c7, 0x04c7, 0x04dc, 0x04f4, + // Entry 40 - 7F + 0x0512, 0x051e, 0x051e, 0x0536, 0x0548, 0x0548, 0x0554, 0x0566, + 0x056f, 0x05a0, 0x05cb, 0x05e0, 0x05f2, 0x0604, 0x0604, 0x0604, + 0x0604, 0x0604, 0x0619, 0x062e, 0x062e, 0x0646, 0x065e, 0x068f, + 0x068f, 0x068f, 0x06aa, 0x06bf, 0x06bf, 0x06d1, 0x06da, 0x06da, + 0x06fc, 0x06fc, 0x0717, 0x0717, 0x0717, 0x0717, 0x0726, 0x0726, + 0x0732, 0x0744, 0x0756, 0x0765, 0x0780, 0x0780, 0x0780, 0x07a5, + 0x07bb, 0x07c7, 0x07d6, 0x07f2, 0x080a, 0x083b, 0x084d, 0x085c, + 0x0880, 0x088f, 0x08a4, 0x08b3, 0x08b3, 0x08ce, 0x08ec, 0x08fe, + // Entry 80 - BF + 0x08fe, 0x08fe, 0x08fe, 0x0916, 0x0916, 0x0916, 0x0941, 0x0956, + 0x0990, 0x09bb, 0x09e3, 0x0a01, 0x0a01, 0x0a10, 0x0a30, 0x0a3f, + 0x0a3f, 0x0a4e, 0x0a60, 0x0a75, 0x0a8a, 0x0a9f, 0x0aab, 0x0ab4, + 0x0ac9, 0x0ac9, 0x0ae4, 0x0aed, 0x0b0f, 0x0b0f, 0x0b0f, 0x0b37, + 0x0b37, 0x0b3d, 0x0b5b, 0x0b64, 0x0b7f, 0x0b97, 0x0ba3, 0x0bc2, +} // Size: 360 bytes + +var nlScriptStr string = "" + // Size: 1633 bytes + "DefakaKaukasisch AlbaneesAhomArabischKeizerlijk ArameesArmeensAvestaansB" + + "alineesBamounBassa VahBatakBengaalsBlissymbolenBopomofoBrahmiBrailleBugi" + + "neesBuhidChakmaVerenigde Canadese Aboriginal-symbolenCarischChamCherokee" + + "CirthKoptischCyprischCyrillischOudkerkslavisch CyrillischDevanagariDeser" + + "etDuployan snelschriftEgyptisch demotischEgyptisch hiëratischEgyptische " + + "hiërogliefenElbasanEthiopischGeorgisch KhutsuriGeorgischGlagolitischGoth" + + "ischGranthaGrieksGujaratiGurmukhiHangulHanHanunoovereenvoudigd Chineestr" + + "aditioneel ChineesHatranHebreeuwsHiraganaAnatolische hiërogliefenPahawh " + + "HmongKatakana of HiraganaOudhongaarsIndusOud-italischJavaansJapansJurche" + + "nKayah LiKatakanaKharoshthiKhmerKhojkiKannadaKoreaansKpelleKaithiLannaLa" + + "otiaansGotisch LatijnsGaelisch LatijnsLatijnsLepchaLimbuLineair ALineair" + + " BFraserLomaLycischLydischMahajaniMandaeansManicheaansMayahiërogliefenMe" + + "ndeMeroitisch cursiefMeroïtischMalayalamModiMongoolsMoonMroMeiteiMultani" + + "BirmaansOud Noord-ArabischNabateaansNaxi GebaN’KoNüshuOghamOl ChikiOrkho" + + "nOdiaOsmanyaPalmyreensPau Cin HauOudpermischPhags-paInscriptioneel Pahla" + + "viPsalmen PahlaviBoek PahlaviFoenicischPollard-fonetischInscriptioneel P" + + "arthischRejangRongorongoRunicSamaritaansSaratiOud Zuid-ArabischSaurashtr" + + "aSignWritingShavianSharadaSiddhamSindhiSingaleesSora SompengSoendaneesSy" + + "loti NagriSyriacEstrangelo ArameesWest-ArameesOost-ArameesTagbanwaTakriT" + + "ai LeNieuw Tai LueTamilTangutTai VietTeluguTengwarTifinaghTagalogThaanaT" + + "haiTibetaansTirhutaUgaritischVaiZichtbare spraakVarang KshitiWoleaiOudpe" + + "rzischSumero-Akkadian CuneiformYiOvergeërfdWiskundige notatieSymbolenong" + + "eschrevenalgemeenonbekend schriftsysteem" + +var nlScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0006, 0x0019, 0x001d, 0x0025, 0x0037, 0x003e, 0x0047, + 0x004f, 0x0055, 0x005e, 0x0063, 0x006b, 0x0077, 0x007f, 0x0085, + 0x008c, 0x0094, 0x0099, 0x009f, 0x00c5, 0x00cc, 0x00d0, 0x00d8, + 0x00dd, 0x00e5, 0x00ed, 0x00f7, 0x0111, 0x011b, 0x0122, 0x0136, + 0x0149, 0x015e, 0x0176, 0x017d, 0x0187, 0x0199, 0x01a2, 0x01ae, + 0x01b6, 0x01bd, 0x01c3, 0x01cb, 0x01d3, 0x01d9, 0x01dc, 0x01e3, + 0x01f8, 0x020c, 0x0212, 0x021b, 0x0223, 0x023c, 0x0248, 0x025c, + 0x0267, 0x026c, 0x0278, 0x027f, 0x0285, 0x028c, 0x0294, 0x029c, + // Entry 40 - 7F + 0x02a6, 0x02ab, 0x02b1, 0x02b8, 0x02c0, 0x02c6, 0x02cc, 0x02d1, + 0x02da, 0x02e9, 0x02f9, 0x0300, 0x0306, 0x030b, 0x0314, 0x031d, + 0x0323, 0x0327, 0x032e, 0x0335, 0x033d, 0x0346, 0x0351, 0x0362, + 0x0367, 0x0379, 0x0384, 0x038d, 0x0391, 0x0399, 0x039d, 0x03a0, + 0x03a6, 0x03ad, 0x03b5, 0x03c7, 0x03d1, 0x03da, 0x03e0, 0x03e6, + 0x03eb, 0x03f3, 0x03f9, 0x03fd, 0x0404, 0x040e, 0x0419, 0x0424, + 0x042c, 0x0442, 0x0451, 0x045d, 0x0467, 0x0478, 0x0490, 0x0496, + 0x04a0, 0x04a5, 0x04b0, 0x04b6, 0x04c7, 0x04d1, 0x04dc, 0x04e3, + // Entry 80 - BF + 0x04ea, 0x04f1, 0x04f7, 0x0500, 0x050c, 0x0516, 0x0522, 0x0528, + 0x053a, 0x0546, 0x0552, 0x055a, 0x055f, 0x0565, 0x0572, 0x0577, + 0x057d, 0x0585, 0x058b, 0x0592, 0x059a, 0x05a1, 0x05a7, 0x05ab, + 0x05b4, 0x05bb, 0x05c5, 0x05c8, 0x05d8, 0x05e5, 0x05eb, 0x05f6, + 0x060f, 0x0611, 0x061c, 0x062e, 0x0636, 0x0642, 0x064a, 0x0661, +} // Size: 360 bytes + +var noScriptStr string = "" + // Size: 1588 bytes + "afakakaukasus-albanskahomarabiskarameiskarmenskavestiskbalinesiskbamumba" + + "ssa vahbatakbengalskblissymbolbopomofobrahmibraillebuginesiskbuhidchakma" + + "felles kanadiske urspråksstavelserkariskchamcherokeecirthkoptiskkyprioti" + + "skkyrilliskkirkeslavisk kyrilliskdevanagarideseretduployan stenografiegy" + + "ptisk demotiskegyptisk hieratiskegyptiske hieroglyferelbasisketiopiskgeo" + + "rgisk khutsurigeorgiskglagolittiskgotiskgammeltamilskgreskgujaratigurmuk" + + "hihangulhanhanunooforenklet hantradisjonell hanhatransk armenskhebraiskh" + + "iraganaanatoliske hieroglyferpahawh hmongkatakana eller hiraganagammelun" + + "garskindusgammelitaliskjavanesiskjapanskjurchenkayah likatakanakharoshth" + + "ikhmerkhojkikannadakoreanskkpellekaithisklannalaotiskfrakturlatinskgælis" + + "k latinsklatinsklepchalimbulineær Alineær Bfraserlomalykisklydiskmahajan" + + "imandaiskmanikeiskmaya-hieroglyfermendemeroitisk kursivmeroitiskmalayala" + + "mmodimongolskmoonmromeitei-mayekmultanimyanmargammelnordarabisknabataean" + + "sknaxi geban’konüshuoghamol-chikiorkhonoriyaosmanyapalmyrenskpau cin hau" + + "gammelpermiskphags-painskripsjonspahlavipsalter pahlavipahlavifønikiskpo" + + "llard-fonetiskinskripsjonsparthiskrejangrongorongorunersamaritansksarati" + + "gammelsørarabisksaurashtrategnskriftshavisksharadasiddhamkhudawadisinhal" + + "asora sompengsundanesisksyloti nagrisyriskestrangelosyriakiskvestlig syr" + + "iakiskøstlig syriakisktagbanwatakritai leny tai luetamilsktanguttai viet" + + "telugutengwartifinaghtagalogthaanathaitibetansktirhutaugaritiskvaisynlig" + + " talevarang kshitiwoleaigammelpersisksumersk-akkadisk kileskriftyinedarv" + + "etmatematisk notasjonsymbolerspråk uten skriftfellesukjent skrift" + +var noScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0005, 0x0015, 0x0019, 0x0020, 0x0028, 0x002f, 0x0037, + 0x0041, 0x0046, 0x004f, 0x0054, 0x005c, 0x0066, 0x006e, 0x0074, + 0x007b, 0x0085, 0x008a, 0x0090, 0x00b3, 0x00b9, 0x00bd, 0x00c5, + 0x00ca, 0x00d1, 0x00db, 0x00e4, 0x00fa, 0x0104, 0x010b, 0x011e, + 0x012f, 0x0141, 0x0156, 0x015e, 0x0166, 0x0177, 0x017f, 0x018b, + 0x0191, 0x019e, 0x01a3, 0x01ab, 0x01b3, 0x01b9, 0x01bc, 0x01c3, + 0x01d0, 0x01e0, 0x01f0, 0x01f8, 0x0200, 0x0216, 0x0222, 0x0239, + 0x0246, 0x024b, 0x0258, 0x0262, 0x0269, 0x0270, 0x0278, 0x0280, + // Entry 40 - 7F + 0x028a, 0x028f, 0x0295, 0x029c, 0x02a4, 0x02aa, 0x02b2, 0x02b7, + 0x02be, 0x02cc, 0x02db, 0x02e2, 0x02e8, 0x02ed, 0x02f6, 0x02ff, + 0x0305, 0x0309, 0x030f, 0x0315, 0x031d, 0x0325, 0x032e, 0x033e, + 0x0343, 0x0353, 0x035c, 0x0365, 0x0369, 0x0371, 0x0375, 0x0378, + 0x0384, 0x038b, 0x0392, 0x03a3, 0x03ae, 0x03b7, 0x03bd, 0x03c3, + 0x03c8, 0x03d0, 0x03d6, 0x03db, 0x03e2, 0x03ec, 0x03f7, 0x0404, + 0x040c, 0x041f, 0x042e, 0x0435, 0x043e, 0x044e, 0x0462, 0x0468, + 0x0472, 0x0477, 0x0482, 0x0488, 0x0499, 0x04a3, 0x04ad, 0x04b4, + // Entry 80 - BF + 0x04bb, 0x04c2, 0x04cb, 0x04d2, 0x04de, 0x04e9, 0x04f5, 0x04fb, + 0x050e, 0x051f, 0x0530, 0x0538, 0x053d, 0x0543, 0x054d, 0x0554, + 0x055a, 0x0562, 0x0568, 0x056f, 0x0577, 0x057e, 0x0584, 0x0588, + 0x0591, 0x0598, 0x05a1, 0x05a4, 0x05af, 0x05bc, 0x05c2, 0x05cf, + 0x05ea, 0x05ec, 0x05f4, 0x0607, 0x060f, 0x0621, 0x0627, 0x0634, +} // Size: 360 bytes + +var paScriptStr string = "" + // Size: 740 bytes + "ਅਰਬੀਅਰਮੀਨੀਆਈਬੰਗਾਲੀਬੋਪੋਮੋਫੋਬਰੇਲਸਿਰੀਲਿਕਦੇਵਨਾਗਰੀਇਥੀਓਪਿਕਜਾਰਜੀਆਈਗ੍ਰੀਕਗੁਜਰਾਤੀਗ" + + "ੁਰਮੁਖੀਹੰਗੁਲਹਾਨਸਰਲ ਹਾਨਰਵਾਇਤੀ ਹਾਨਹਿਬਰੂਹਿਰਾਗਾਨਾਜਪਾਨੀਕਾਟਾਕਾਨਾਖਮੇਰਕੰਨੜਕੋਰੀਆ" + + "ਈਲਾਓਲਾਤੀਨੀਮਲਿਆਲਮਮੰਗੋਲੀਅਨਮਿਆਂਮਾਰਉੜੀਆਸਿੰਹਾਲਾਤਮਿਲਤੇਲਗੂਥਾਨਾਥਾਈਤਿੱਬਤੀਗਣਿਤ ਚ" + + "ਿੰਨ੍ਹ-ਲਿਪੀਚਿੰਨ੍ਹਅਲਿਖਤਸਧਾਰਨਅਣਪਛਾਤੀ ਲਿਪੀ" + +var paScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x0024, 0x0024, + 0x0024, 0x0024, 0x0024, 0x0024, 0x0036, 0x0036, 0x004e, 0x004e, + 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, + 0x005a, 0x005a, 0x005a, 0x006f, 0x006f, 0x0087, 0x0087, 0x0087, + 0x0087, 0x0087, 0x0087, 0x0087, 0x009c, 0x009c, 0x00b1, 0x00b1, + 0x00b1, 0x00b1, 0x00c0, 0x00d5, 0x00ea, 0x00f9, 0x0102, 0x0102, + 0x0115, 0x0131, 0x0131, 0x0140, 0x0158, 0x0158, 0x0158, 0x0158, + 0x0158, 0x0158, 0x0158, 0x0158, 0x0167, 0x0167, 0x0167, 0x017f, + // Entry 40 - 7F + 0x017f, 0x018b, 0x018b, 0x0197, 0x01a9, 0x01a9, 0x01a9, 0x01a9, + 0x01b2, 0x01b2, 0x01b2, 0x01c4, 0x01c4, 0x01c4, 0x01c4, 0x01c4, + 0x01c4, 0x01c4, 0x01c4, 0x01c4, 0x01c4, 0x01c4, 0x01c4, 0x01c4, + 0x01c4, 0x01c4, 0x01c4, 0x01d6, 0x01d6, 0x01ee, 0x01ee, 0x01ee, + 0x01ee, 0x01ee, 0x0203, 0x0203, 0x0203, 0x0203, 0x0203, 0x0203, + 0x0203, 0x0203, 0x0203, 0x020f, 0x020f, 0x020f, 0x020f, 0x020f, + 0x020f, 0x020f, 0x020f, 0x020f, 0x020f, 0x020f, 0x020f, 0x020f, + 0x020f, 0x020f, 0x020f, 0x020f, 0x020f, 0x020f, 0x020f, 0x020f, + // Entry 80 - BF + 0x020f, 0x020f, 0x020f, 0x0224, 0x0224, 0x0224, 0x0224, 0x0224, + 0x0224, 0x0224, 0x0224, 0x0224, 0x0224, 0x0224, 0x0224, 0x0230, + 0x0230, 0x0230, 0x023f, 0x023f, 0x023f, 0x023f, 0x024b, 0x0254, + 0x0266, 0x0266, 0x0266, 0x0266, 0x0266, 0x0266, 0x0266, 0x0266, + 0x0266, 0x0266, 0x0266, 0x0292, 0x02a4, 0x02b3, 0x02c2, 0x02e4, +} // Size: 360 bytes + +var plScriptStr string = "" + // Size: 1483 bytes + "arabskiearmiormiańskieawestyjskiebalijskiebamunbatakbengalskiesymbole Bl" + + "issabopomofobrahmiBraille’abugińskiebuhidchakmazunifikowane symbole kana" + + "dyjskich autochtonówkaryjskieczamskieczirokeskicirthkoptyjskiecypryjskie" + + "cyrylicacyrylica staro-cerkiewno-słowiańskadevanagarideseretegipskie dem" + + "otyczneegipskie hieratycznehieroglify egipskieetiopskiegruzińskie chucur" + + "igruzińskiegłagolicagotyckiegreckiegudźarackiegurmukhihangylhanhanunooup" + + "roszczone hantradycyjne hanhebrajskiehiraganapahawh hmongkatakana lub hi" + + "raganastarowęgierskieindusstarowłoskiejawajskiejapońskiekayah likatakana" + + "charostikhmerskiekannadakoreańskiekaithilannalaotańskiełaciński - fraktu" + + "rałaciński - odmiana gaelickałacińskielepchalimbulinearne Alinearne Blik" + + "ijskielidyjskiemandejskiemanichejskiehieroglify Majówmeroickiemalajalamm" + + "ongolskieMoon’ameitei mayekbirmańskien’kooghamol chikiorchońskieorijaosm" + + "anyastaropermskiephags-painskrypcyjne pahlawipahlawi psałterzowypahlawi " + + "książkowyfenickifonetyczny Pollard’apartyjski inskrypcyjnyrejangrongoron" + + "gorunicznesamarytańskisaratisaurashtrapismo znakoweshawasyngaleskiesunda" + + "jskiesyloti nagrisyryjskisyriacki estrangelosyryjski (odmiana zachodnia)" + + "syryjski (odmiana wschodnia)tagbanwatai lenowy tai luetamilskietai viett" + + "elugutengwartifinagh (berberski)tagalogthaanatajskietybetańskieugaryckie" + + "vaiVisible Speechstaroperskieklinowe sumero-akadyjskieyidziedziczonenota" + + "cja matematycznasymbolejęzyk bez systemu pismawspólnenieznane lub niepop" + + "rawne" + +var plScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x000c, 0x0017, 0x0022, + 0x002b, 0x0030, 0x0030, 0x0035, 0x003f, 0x004d, 0x0055, 0x005b, + 0x0066, 0x0070, 0x0075, 0x007b, 0x00a9, 0x00b2, 0x00ba, 0x00c4, + 0x00c9, 0x00d3, 0x00dd, 0x00e5, 0x010a, 0x0114, 0x011b, 0x011b, + 0x012e, 0x0142, 0x0155, 0x0155, 0x015e, 0x0171, 0x017c, 0x0186, + 0x018e, 0x018e, 0x0195, 0x01a1, 0x01a9, 0x01af, 0x01b2, 0x01b9, + 0x01c8, 0x01d6, 0x01d6, 0x01e0, 0x01e8, 0x01e8, 0x01f4, 0x0209, + 0x0219, 0x021e, 0x022b, 0x0234, 0x023e, 0x023e, 0x0246, 0x024e, + // Entry 40 - 7F + 0x0256, 0x025f, 0x025f, 0x0266, 0x0271, 0x0271, 0x0277, 0x027c, + 0x0287, 0x029c, 0x02b9, 0x02c4, 0x02ca, 0x02cf, 0x02d9, 0x02e3, + 0x02e3, 0x02e3, 0x02ec, 0x02f5, 0x02f5, 0x02ff, 0x030b, 0x031c, + 0x031c, 0x031c, 0x0325, 0x032e, 0x032e, 0x0338, 0x0340, 0x0340, + 0x034c, 0x034c, 0x0357, 0x0357, 0x0357, 0x0357, 0x035d, 0x035d, + 0x0362, 0x036a, 0x0375, 0x037a, 0x0381, 0x0381, 0x0381, 0x038e, + 0x0396, 0x03aa, 0x03be, 0x03d1, 0x03d8, 0x03ee, 0x0404, 0x040a, + 0x0414, 0x041c, 0x0429, 0x042f, 0x042f, 0x0439, 0x0446, 0x044b, + // Entry 80 - BF + 0x044b, 0x044b, 0x044b, 0x0456, 0x0456, 0x0460, 0x046c, 0x0474, + 0x0487, 0x04a3, 0x04bf, 0x04c7, 0x04c7, 0x04cd, 0x04d9, 0x04e2, + 0x04e2, 0x04ea, 0x04f0, 0x04f7, 0x050b, 0x0512, 0x0518, 0x051f, + 0x052b, 0x052b, 0x0534, 0x0537, 0x0545, 0x0545, 0x0545, 0x0551, + 0x056a, 0x056c, 0x0578, 0x058c, 0x0593, 0x05ab, 0x05b3, 0x05cb, +} // Size: 360 bytes + +var ptScriptStr string = "" + // Size: 1251 bytes + "árabearmiarmênioavésticobalinêsbamumbataquebengalisímbolos blissbopomofo" + + "brahmibraillebuginêsbuhidcakmescrita silábica unificada dos aborígenes c" + + "anadensescarianochamcherokeecirthcópticocipriotacirílicocirílico eslavo " + + "eclesiásticodevanágarideseretdemótico egípciohierático egípciohieróglifo" + + "s egípciosetiópicokhutsuri georgianogeorgianoglagolíticogóticogregogujer" + + "atigurmuquihangulhanhanunoohan simplificadohan tradicionalhebraicohiraga" + + "napahawh hmongkatakana ou hiraganahúngaro antigoindoitálico antigojavanê" + + "sjaponêskayah likatakanakharoshthikhmerkannadacoreanokthilannalaolatim f" + + "rakturlatim gaélicolatimlepchalimbulinear Alinear Blisulíciolídiomandaic" + + "omaniqueanohieróglifos maiasmeroítico cursivomeroíticomalaialamongolmoon" + + "meitei mayekbirmanêsn’koogâmicool chikiorkhonoriyaosmaniapérmico antigop" + + "hags-paphliphlppahlavi antigofeníciofonético pollardprtirejangrongorongo" + + "rúnicosamaritanosaratisaurashtrasignwritingshavianocingalêssundanêssylot" + + "i nagrisiríacosiríaco estrangelosiríaco ocidentalsiríaco orientaltagbanw" + + "atai Lenovo tai luetâmiltavttélugotengwartifinaghtagalothaanatailandêsti" + + "betanougaríticovaivisible speechpersa antigosumério-acadiano cuneiformey" + + "iherdadozmthzsymágrafocomumescrita desconhecida" + +var ptScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x000a, 0x0012, 0x001b, + 0x0023, 0x0028, 0x0028, 0x002f, 0x0036, 0x0045, 0x004d, 0x0053, + 0x005a, 0x0062, 0x0067, 0x006b, 0x00a1, 0x00a8, 0x00ac, 0x00b4, + 0x00b9, 0x00c1, 0x00c9, 0x00d2, 0x00f0, 0x00fb, 0x0102, 0x0102, + 0x0114, 0x0127, 0x013d, 0x013d, 0x0146, 0x0158, 0x0161, 0x016d, + 0x0174, 0x0174, 0x0179, 0x0181, 0x0189, 0x018f, 0x0192, 0x0199, + 0x01a9, 0x01b8, 0x01b8, 0x01c0, 0x01c8, 0x01c8, 0x01d4, 0x01e8, + 0x01f7, 0x01fb, 0x020a, 0x0212, 0x021a, 0x021a, 0x0222, 0x022a, + // Entry 40 - 7F + 0x0234, 0x0239, 0x0239, 0x0240, 0x0247, 0x0247, 0x024b, 0x0250, + 0x0253, 0x0260, 0x026e, 0x0273, 0x0279, 0x027e, 0x0286, 0x028e, + 0x0292, 0x0292, 0x0298, 0x029e, 0x029e, 0x02a6, 0x02b0, 0x02c2, + 0x02c2, 0x02d4, 0x02de, 0x02e6, 0x02e6, 0x02ec, 0x02f0, 0x02f0, + 0x02fc, 0x02fc, 0x0305, 0x0305, 0x0305, 0x0305, 0x030b, 0x030b, + 0x0313, 0x031b, 0x0321, 0x0326, 0x032d, 0x032d, 0x032d, 0x033c, + 0x0344, 0x0348, 0x034c, 0x035a, 0x0362, 0x0373, 0x0377, 0x037d, + 0x0387, 0x038e, 0x0398, 0x039e, 0x039e, 0x03a8, 0x03b3, 0x03bb, + // Entry 80 - BF + 0x03bb, 0x03bb, 0x03bb, 0x03c4, 0x03c4, 0x03cd, 0x03d9, 0x03e1, + 0x03f4, 0x0406, 0x0417, 0x041f, 0x041f, 0x0425, 0x0431, 0x0437, + 0x0437, 0x043b, 0x0442, 0x0449, 0x0451, 0x0457, 0x045d, 0x0467, + 0x046f, 0x046f, 0x0479, 0x047c, 0x048a, 0x048a, 0x048a, 0x0496, + 0x04b2, 0x04b4, 0x04bb, 0x04bf, 0x04c3, 0x04ca, 0x04cf, 0x04e3, +} // Size: 360 bytes + +var ptPTScriptStr string = "" + // Size: 103 bytes + "arménioegípcio demóticoegípcio hieráticoguzerateindussiloti nagritai let" + + "elugusímbolosnão escrito" + +var ptPTScriptIdx = []uint16{ // 166 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, + 0x001a, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, + 0x002d, 0x002d, 0x002d, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, + // Entry 40 - 7F + 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, + 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, + 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, + 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, + 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, + 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, + 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, + 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, + // Entry 80 - BF + 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x003a, 0x0046, 0x0046, + 0x0046, 0x0046, 0x0046, 0x0046, 0x0046, 0x004c, 0x004c, 0x004c, + 0x004c, 0x004c, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, + 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, + 0x0052, 0x0052, 0x0052, 0x0052, 0x005b, 0x0067, +} // Size: 356 bytes + +var roScriptStr string = "" + // Size: 825 bytes + "arabăarmeanăbalinezăbengalezăbopomofobraillesilabică aborigenă canadiană" + + " unificatăcoptăcipriotăchirilicăchirilică slavonă bisericească vechedeva" + + "nagarimormonădemotică egipteanăhieratică egipteanăhieroglife egipteneeti" + + "opianăgeorgiană bisericeascăgeorgianăglagoliticăgoticăgreacăgujaratigurm" + + "ukhihangulhanhan simplificatăhan tradiționalăebraicăhiraganakatakana sau" + + " hiraganamaghiară vecheindusitalică vechejavanezăjaponezăkatakanakhmerăk" + + "annadacoreeanălaoțianălatină Frakturlatină gaelicălatinălineară Alineară" + + " Blidianăhieroglife mayamalayalammongolăbirmanăoriyafenicianărunicăsinga" + + "lezăsiriacăsiriacă occidentalăsiriacă orientalătamilăteluguberberăthaana" + + "thailandezătibetanăpersană vechecuneiformă sumero-akkadianămoștenităsimb" + + "olurinescrisăcomunăscriere necunoscută" + +var roScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x000e, 0x000e, + 0x0017, 0x0017, 0x0017, 0x0017, 0x0021, 0x0021, 0x0029, 0x0029, + 0x0030, 0x0030, 0x0030, 0x0030, 0x005a, 0x005a, 0x005a, 0x005a, + 0x005a, 0x0060, 0x0069, 0x0073, 0x009a, 0x00a4, 0x00ac, 0x00ac, + 0x00c0, 0x00d5, 0x00e8, 0x00e8, 0x00f2, 0x010a, 0x0114, 0x0120, + 0x0127, 0x0127, 0x012e, 0x0136, 0x013e, 0x0144, 0x0147, 0x0147, + 0x0158, 0x016a, 0x016a, 0x0172, 0x017a, 0x017a, 0x017a, 0x018f, + 0x019e, 0x01a3, 0x01b1, 0x01ba, 0x01c3, 0x01c3, 0x01c3, 0x01cb, + // Entry 40 - 7F + 0x01cb, 0x01d2, 0x01d2, 0x01d9, 0x01e2, 0x01e2, 0x01e2, 0x01e2, + 0x01ec, 0x01fb, 0x020b, 0x0212, 0x0212, 0x0212, 0x021c, 0x0226, + 0x0226, 0x0226, 0x0226, 0x022e, 0x022e, 0x022e, 0x022e, 0x023d, + 0x023d, 0x023d, 0x023d, 0x0246, 0x0246, 0x024e, 0x024e, 0x024e, + 0x024e, 0x024e, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, 0x0256, + 0x0256, 0x0256, 0x0256, 0x025b, 0x025b, 0x025b, 0x025b, 0x025b, + 0x025b, 0x025b, 0x025b, 0x025b, 0x0265, 0x0265, 0x0265, 0x0265, + 0x0265, 0x026c, 0x026c, 0x026c, 0x026c, 0x026c, 0x026c, 0x026c, + // Entry 80 - BF + 0x026c, 0x026c, 0x026c, 0x0276, 0x0276, 0x0276, 0x0276, 0x027e, + 0x027e, 0x0293, 0x02a6, 0x02a6, 0x02a6, 0x02a6, 0x02a6, 0x02ad, + 0x02ad, 0x02ad, 0x02b3, 0x02b3, 0x02bb, 0x02bb, 0x02c1, 0x02cd, + 0x02d6, 0x02d6, 0x02d6, 0x02d6, 0x02d6, 0x02d6, 0x02d6, 0x02e4, + 0x0301, 0x0301, 0x030c, 0x030c, 0x0315, 0x031e, 0x0325, 0x0339, +} // Size: 360 bytes + +var ruScriptStr string = "" + // Size: 3384 bytes + "афакаарабицаарамейскаяармянскаяавестийскаябалийскаябамумбасса (вах)батак" + + "скаябенгальскаяблиссимволикабопомофобрахмиБрайлябугинизийскаябухидчакми" + + "йскаяканадское слоговое письмокарийскаячамскаячерокикирткоптскаякипрска" + + "якириллицастарославянскаядеванагаридезеретдуплоянская скорописьегипетск" + + "ая демотическаяегипетская иератическаяегипетская иероглифическаяэфиопск" + + "аягрузинская хуцуригрузинскаяглаголицаготскаягрантхагреческаягуджаратиг" + + "урмукхихангылькитайскаяханунуупрощенная китайскаятрадиционная китайская" + + "ивритхираганалувийские иероглифыпахау хмонгкатакана или хираганастарове" + + "нгерскаяхараппская (письменность долины Инда)староитальянскаяяванскаяяп" + + "онскаячжурчжэньскаякайакатаканакхароштхикхмерскаяходжикиканнадакорейска" + + "якпеллекайтхиланналаосскаялатинская фрактурагэльская латинскаялатиницал" + + "епхалимбулинейное письмо Алинейное письмо Блисуломалицианлидийскаяманде" + + "йскаяманихейскаямайямендемероитская курсивнаямероитскаямалаяльскаямонго" + + "льскаяазбука мунамроманипуримьянманскаясеверноаравийскоенабатейскаянаси" + + " гебанконюй-шуогамическаяол чикиорхоно-енисейскаяорияосманскаяпальмирыдр" + + "евнепермскаяпагспапехлевийскаяпахлави псалтирнаяпахлави книжнаяфиникийс" + + "каяполлардовская фонетикапарфянскаяреджангскаяронго-ронгоруническаясама" + + "ритянскаясаратистароюжноарабскаясаураштраязык знаковалфавит Шоушарадакх" + + "удавадисингальскаясора-сонпенгсунданскаясилоти нагрисирийскаясирийская " + + "эстрангелозападносирийскаявосточно-сирийскаятагбанватакритайский леновы" + + "й тайский летамильскаятангутское менятай-вьеттелугутенгварскаядревнелив" + + "ийскаятагалогтаанатайскаятибетскаятирхутаугаритскаявайскаявидимая речьв" + + "аранг-кшитиволеаистароперсидскаяшумеро-аккадская клинописьиунаследованн" + + "аяматематические обозначениясимволыбесписьменныйобщепринятаянеизвестная" + + " письменность" + +var ruScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x000a, 0x000a, 0x000a, 0x0018, 0x002c, 0x003e, 0x0054, + 0x0066, 0x0070, 0x0083, 0x0095, 0x00ab, 0x00c5, 0x00d5, 0x00e1, + 0x00ed, 0x0107, 0x0111, 0x0125, 0x0155, 0x0167, 0x0175, 0x0181, + 0x0189, 0x0199, 0x01a9, 0x01bb, 0x01d9, 0x01ed, 0x01fb, 0x0224, + 0x0251, 0x027e, 0x02b1, 0x02b1, 0x02c3, 0x02e4, 0x02f8, 0x030a, + 0x0318, 0x0326, 0x0338, 0x034a, 0x035a, 0x0368, 0x037a, 0x0386, + 0x03ad, 0x03d8, 0x03d8, 0x03e2, 0x03f2, 0x0417, 0x042c, 0x0454, + 0x0472, 0x04b7, 0x04d7, 0x04e7, 0x04f7, 0x0511, 0x0519, 0x0529, + // Entry 40 - 7F + 0x053b, 0x054d, 0x055b, 0x0569, 0x057b, 0x0587, 0x0593, 0x059d, + 0x05ad, 0x05d0, 0x05f3, 0x0603, 0x060d, 0x0617, 0x0637, 0x0657, + 0x065f, 0x0667, 0x0673, 0x0685, 0x0685, 0x0699, 0x06af, 0x06b7, + 0x06c1, 0x06e8, 0x06fc, 0x0712, 0x0712, 0x0728, 0x073d, 0x0743, + 0x0753, 0x0753, 0x0769, 0x078b, 0x07a1, 0x07b2, 0x07b8, 0x07c3, + 0x07d9, 0x07e6, 0x0807, 0x080f, 0x0821, 0x0831, 0x0831, 0x084d, + 0x0859, 0x0871, 0x0894, 0x08b1, 0x08c7, 0x08f2, 0x0906, 0x091c, + 0x0931, 0x0945, 0x095f, 0x096b, 0x098d, 0x099f, 0x09b4, 0x09c9, + // Entry 80 - BF + 0x09d5, 0x09d5, 0x09e7, 0x09fd, 0x0a14, 0x0a28, 0x0a3f, 0x0a51, + 0x0a78, 0x0a98, 0x0abb, 0x0acb, 0x0ad5, 0x0ae8, 0x0b06, 0x0b1a, + 0x0b37, 0x0b46, 0x0b52, 0x0b68, 0x0b86, 0x0b94, 0x0b9e, 0x0bac, + 0x0bbe, 0x0bcc, 0x0be0, 0x0bee, 0x0c05, 0x0c1c, 0x0c28, 0x0c46, + 0x0c78, 0x0c7a, 0x0c96, 0x0cc9, 0x0cd7, 0x0cf1, 0x0d09, 0x0d38, +} // Size: 360 bytes + +var siScriptStr string = "" + // Size: 809 bytes + "අරාබිආර්මේනියානුබෙංගාලිබොපොමොෆෝබ්\u200dරේල්සිරිලික්දේවනාගරීඉතියෝපියානුජෝ" + + "ර්ජියානුග්\u200dරීකගුජරාටිගුර්මුඛිහැන්ගුල්හන්සුළුකළ හෑන්සම්ප්\u200dරදා" + + "යික හෑන්හීබෲහිරඟනාජපන්කතකනාකමර්කණ්ණඩකොරියානුලාඕලතින්මලයාලම්මොන්ගෝලියාන" + + "ුමියන්මාරඔරියාසිංහලදෙමළතෙළිඟුතානතායිටි\u200dබෙට්සංකේතඅලිඛිතපොදු.නොදත් " + + "අක්ෂර මාලාව" + +var siScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000f, 0x000f, 0x0030, 0x0030, + 0x0030, 0x0030, 0x0030, 0x0030, 0x0045, 0x0045, 0x005d, 0x005d, + 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, + 0x0072, 0x0072, 0x0072, 0x008a, 0x008a, 0x00a2, 0x00a2, 0x00a2, + 0x00a2, 0x00a2, 0x00a2, 0x00a2, 0x00c3, 0x00c3, 0x00e1, 0x00e1, + 0x00e1, 0x00e1, 0x00f3, 0x0108, 0x0120, 0x0138, 0x0141, 0x0141, + 0x0160, 0x0191, 0x0191, 0x019d, 0x01af, 0x01af, 0x01af, 0x01af, + 0x01af, 0x01af, 0x01af, 0x01af, 0x01bb, 0x01bb, 0x01bb, 0x01ca, + // Entry 40 - 7F + 0x01ca, 0x01d6, 0x01d6, 0x01e5, 0x01fd, 0x01fd, 0x01fd, 0x01fd, + 0x0206, 0x0206, 0x0206, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, + 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, + 0x0215, 0x0215, 0x0215, 0x022a, 0x022a, 0x024e, 0x024e, 0x024e, + 0x024e, 0x024e, 0x0266, 0x0266, 0x0266, 0x0266, 0x0266, 0x0266, + 0x0266, 0x0266, 0x0266, 0x0275, 0x0275, 0x0275, 0x0275, 0x0275, + 0x0275, 0x0275, 0x0275, 0x0275, 0x0275, 0x0275, 0x0275, 0x0275, + 0x0275, 0x0275, 0x0275, 0x0275, 0x0275, 0x0275, 0x0275, 0x0275, + // Entry 80 - BF + 0x0275, 0x0275, 0x0275, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, + 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0284, 0x0290, + 0x0290, 0x0290, 0x02a2, 0x02a2, 0x02a2, 0x02a2, 0x02ab, 0x02b7, + 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, + 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02db, 0x02ed, 0x02fa, 0x0329, +} // Size: 360 bytes + +var skScriptStr string = "" + // Size: 487 bytes + "arabskéarménskebalijskýbengálskebopomofobraillovocyrilikadévanágaríegypt" + + "ské hieroglyfyetiópskegruzínskehlaholikagotickýgréckegudžarátígurmukhiha" + + "ngulčínskečínske zjednodušenéčínske tradičnéhebrejskéhiraganajaponskékat" + + "akanakhmérskekannadskékórejskélaoskélatinkalineárna Alineárna Bmayské hi" + + "eroglyfymalajálamskemongolskébarmskéuríjskeosmanskýRunové písmosinhálske" + + "tamilskételugskétánathajskétibetskésymbolybez zápisuvšeobecnéneznáme pís" + + "mo" + +var skScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x0011, 0x0011, + 0x001a, 0x001a, 0x001a, 0x001a, 0x0024, 0x0024, 0x002c, 0x002c, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x003d, 0x003d, 0x004a, 0x004a, 0x004a, + 0x004a, 0x004a, 0x005e, 0x005e, 0x0067, 0x0067, 0x0071, 0x007a, + 0x0082, 0x0082, 0x0089, 0x0095, 0x009d, 0x00a3, 0x00ab, 0x00ab, + 0x00c2, 0x00d5, 0x00d5, 0x00df, 0x00e7, 0x00e7, 0x00e7, 0x00e7, + 0x00e7, 0x00e7, 0x00e7, 0x00e7, 0x00f0, 0x00f0, 0x00f0, 0x00f8, + // Entry 40 - 7F + 0x00f8, 0x0101, 0x0101, 0x010b, 0x0115, 0x0115, 0x0115, 0x0115, + 0x011c, 0x011c, 0x011c, 0x0123, 0x0123, 0x0123, 0x012e, 0x0139, + 0x0139, 0x0139, 0x0139, 0x0139, 0x0139, 0x0139, 0x0139, 0x014b, + 0x014b, 0x014b, 0x014b, 0x0158, 0x0158, 0x0162, 0x0162, 0x0162, + 0x0162, 0x0162, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, 0x016a, + 0x016a, 0x016a, 0x016a, 0x0172, 0x017b, 0x017b, 0x017b, 0x017b, + 0x017b, 0x017b, 0x017b, 0x017b, 0x017b, 0x017b, 0x017b, 0x017b, + 0x017b, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, 0x0189, + // Entry 80 - BF + 0x0189, 0x0189, 0x0189, 0x0193, 0x0193, 0x0193, 0x0193, 0x0193, + 0x0193, 0x0193, 0x0193, 0x0193, 0x0193, 0x0193, 0x0193, 0x019c, + 0x019c, 0x019c, 0x01a5, 0x01a5, 0x01a5, 0x01a5, 0x01aa, 0x01b2, + 0x01bb, 0x01bb, 0x01bb, 0x01bb, 0x01bb, 0x01bb, 0x01bb, 0x01bb, + 0x01bb, 0x01bb, 0x01bb, 0x01bb, 0x01c2, 0x01cd, 0x01d8, 0x01e7, +} // Size: 360 bytes + +var slScriptStr string = "" + // Size: 1487 bytes + "arabskiimperialno-aramejskiarmenskiavestanskibalijskibataškibengalskizna" + + "kovna pisava Blissbopomofobramanskibraillova pisavabuginskibuhidskipoeno" + + "tena zlogovna pisava kanadskih staroselcevChamčerokeškikirtkoptskiciprsk" + + "icirilicastarocerkvenoslovanska cirilicadevanagarščicafonetska pisava de" + + "seretdemotska egipčanska pisavahieratska egipčanska pisavaegipčanska sli" + + "kovna pisavaetiopskicerkvenogruzijskigruzijskiglagoliškigotskigrškigudža" + + "ratskigurmukihangulkanjihanunskipoenostavljena pisava hantradicionalna p" + + "isava hanhebrejskihiraganapahavhmonska zlogovna pisavakatakana ali hirag" + + "anastaroogrskiinduškistaroitalskijavanskijaponskikarenskikatakanagandars" + + "kikmerskikanadskikorejskikajatskilaoškifrakturagelski latiničnilatinical" + + "epškilimbuškilinearna pisava Alinearna pisava Blicijskilidijskimandanski" + + "manihejskimajevska slikovna pisavameroitskimalajalamskimongolskaMoonova " + + "pisava za slepemanipurskimjanmarskiogamskisantalskiorkonskiorijskiosmans" + + "kistaropermijskipagpajskivrezani napisi pahlavipsalmski pahlaviknjižno p" + + "alavanskifeničanskiPollardova fonetska pisavarongorongorunskisamaritansk" + + "isaratskiznakovna pisavašojevskisinhalskisundanskisiletsko-nagarijskisir" + + "ijskisirska abeceda estrangelozahodnosirijskivzhodnosirijskitagbanskitam" + + "ilskitajsko-vietnamskiteluškitengvarskitifinajskitagaloškitanajskitajski" + + "tibetanskiugaritskizlogovna pisava vaividni govorstaroperzijskisumersko-" + + "akadski klinopispodedovanmatematična znamenjasimbolinenapisanosplošnonez" + + "nan ali neveljaven zapis" + +var slScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x001b, 0x0023, 0x002d, + 0x0035, 0x0035, 0x0035, 0x003d, 0x0046, 0x005b, 0x0063, 0x006c, + 0x007c, 0x0084, 0x008c, 0x008c, 0x00bb, 0x00bb, 0x00bf, 0x00ca, + 0x00ce, 0x00d5, 0x00dc, 0x00e4, 0x0103, 0x0113, 0x012a, 0x012a, + 0x0145, 0x0161, 0x017c, 0x017c, 0x0184, 0x0195, 0x019e, 0x01a9, + 0x01af, 0x01af, 0x01b5, 0x01c1, 0x01c8, 0x01ce, 0x01d3, 0x01db, + 0x01f4, 0x020c, 0x020c, 0x0215, 0x021d, 0x021d, 0x0239, 0x024e, + 0x0259, 0x0261, 0x026d, 0x0275, 0x027d, 0x027d, 0x0285, 0x028d, + // Entry 40 - 7F + 0x0296, 0x029d, 0x029d, 0x02a5, 0x02ad, 0x02ad, 0x02b5, 0x02b5, + 0x02bc, 0x02c4, 0x02d5, 0x02dd, 0x02e4, 0x02ed, 0x02fe, 0x030f, + 0x030f, 0x030f, 0x0317, 0x031f, 0x031f, 0x0328, 0x0332, 0x034a, + 0x034a, 0x034a, 0x0353, 0x035f, 0x035f, 0x0368, 0x037f, 0x037f, + 0x0389, 0x0389, 0x0393, 0x0393, 0x0393, 0x0393, 0x0393, 0x0393, + 0x039a, 0x03a3, 0x03ab, 0x03b2, 0x03ba, 0x03ba, 0x03ba, 0x03c8, + 0x03d1, 0x03e7, 0x03f7, 0x040a, 0x0415, 0x042f, 0x042f, 0x042f, + 0x0439, 0x043f, 0x044b, 0x0453, 0x0453, 0x0453, 0x0462, 0x046b, + // Entry 80 - BF + 0x046b, 0x046b, 0x046b, 0x0474, 0x0474, 0x047d, 0x0490, 0x0498, + 0x04b1, 0x04c0, 0x04cf, 0x04d8, 0x04d8, 0x04d8, 0x04d8, 0x04e0, + 0x04e0, 0x04f1, 0x04f9, 0x0503, 0x050d, 0x0517, 0x051f, 0x0525, + 0x052f, 0x052f, 0x0538, 0x054b, 0x0556, 0x0556, 0x0556, 0x0564, + 0x057d, 0x057d, 0x0586, 0x059b, 0x05a2, 0x05ac, 0x05b4, 0x05cf, +} // Size: 360 bytes + +var sqScriptStr string = "" + // Size: 290 bytes + "arabikarmenbengalbopomofbrailishtcirilikdevanagaretiopikgjeorgjiangrekgu" + + "xharatgurmukhangulhanhan i thjeshtuarhan tradicionalhebraikhiraganjapone" + + "zkatakankmerkanadkoreanlaosishtlatinmalajalammongolbirmanorijasinhaltami" + + "ltelugtanishttajlandeztibetishtme simbolei pashkruari zakonshëmi panjohu" + + "r" + +var sqScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x000b, 0x000b, + 0x000b, 0x000b, 0x000b, 0x000b, 0x0011, 0x0011, 0x0018, 0x0018, + 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, + 0x0021, 0x0021, 0x0021, 0x0028, 0x0028, 0x0031, 0x0031, 0x0031, + 0x0031, 0x0031, 0x0031, 0x0031, 0x0038, 0x0038, 0x0042, 0x0042, + 0x0042, 0x0042, 0x0046, 0x004e, 0x0054, 0x005a, 0x005d, 0x005d, + 0x006d, 0x007c, 0x007c, 0x0083, 0x008a, 0x008a, 0x008a, 0x008a, + 0x008a, 0x008a, 0x008a, 0x008a, 0x0091, 0x0091, 0x0091, 0x0098, + // Entry 40 - 7F + 0x0098, 0x009c, 0x009c, 0x00a1, 0x00a7, 0x00a7, 0x00a7, 0x00a7, + 0x00af, 0x00af, 0x00af, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, + 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, 0x00b4, + 0x00b4, 0x00b4, 0x00b4, 0x00bd, 0x00bd, 0x00c3, 0x00c3, 0x00c3, + 0x00c3, 0x00c3, 0x00c9, 0x00c9, 0x00c9, 0x00c9, 0x00c9, 0x00c9, + 0x00c9, 0x00c9, 0x00c9, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, + 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, + 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, + // Entry 80 - BF + 0x00ce, 0x00ce, 0x00ce, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, + 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d9, + 0x00d9, 0x00d9, 0x00de, 0x00de, 0x00de, 0x00de, 0x00e5, 0x00ee, + 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x00f7, + 0x00f7, 0x00f7, 0x00f7, 0x00f7, 0x0101, 0x010c, 0x0118, 0x0122, +} // Size: 360 bytes + +var srScriptStr string = "" + // Size: 3698 bytes + "арапско писмоимперијско арамејско писмојерменско писмоавестанско писмоба" + + "лијско писмобатак писмобенгалско писмоблисимболично писмобопомофо писмо" + + "браманско писмоБрајево писмобугинско писмобухидско писмочакманско писмо" + + "уједињени канадски абориџински силабицикаријско писмочамско писмоЧероки" + + "цирт писмокоптичко писмокипарско писмоћирилицаСтарословенска црквена ћи" + + "рилицадеванагариДезеретегипатско народно писмоегипатско хијератско писм" + + "оегипатски хијероглифиетиопско писмогрузијско кхутсури писмогрузијско п" + + "исмоглагољицаГотикагрчко писмогуџаратско писмогурмуки писмохангулханхан" + + "унопоједностављено хан писмотрадиционално хан писмохебрејско писмохираг" + + "анапахав хмонг писмоКатакана или Хираганастаромађарско писмоиндушко пис" + + "мостари италикјаванско писмојапанско писмокајах-ли писмокатаканакарошти" + + " писмокмерско писмоканада писмокорејско писмокаитиланна писмолаошко писм" + + "олатиница (фрактур варијанта)галска латиницалатиницалепча писмолимбу пи" + + "смолинеарно А писмолинеарно Б писмолисијско писмолидијско писмомандеанс" + + "ко писмоманихејско писмомајански хијероглифимероитик писмомалајалам пис" + + "момонголско писмомесечево писмомеитеи мајек писмомијанмарско писмон’ко " + + "писмоогамско писмоол чики писмоорконско писмооријанско писмоосмањанско " + + "писмостаро пермикско писмопагс-па писмописани пахлавипсалтер пахлавипах" + + "лави писмоФеничанско писмопоралд фонетско писмописани партианрејанг пис" + + "моронгоронго писморунско писмосамаританско писмосарати писмосаураштра п" + + "исмознаковно писмошавијанско писмосинхалско писмосунданско писмосилоти " + + "нагри писмосиријско писмосиријско естрангело писмозападносиријско писмо" + + "писмо источне Сиријетагбанва писмотаи ле писмонови таи луетамилско писм" + + "отаи виет писмотелугу писмотенгвар писмотифинаг писмоТагалогтхана писмо" + + "тајландско писмотибетанско писмоугаритско писмоваи писмовидљиви говорст" + + "ароперсијско писмосумерско-акадско кунеиформ писмоји писмонаследно писм" + + "оматематичка нотацијасимболинеписани језикзаједничко писмонепознато пис" + + "мо" + +var srScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0019, 0x004b, 0x0068, 0x0087, + 0x00a2, 0x00a2, 0x00a2, 0x00b7, 0x00d4, 0x00f9, 0x0114, 0x0131, + 0x014a, 0x0165, 0x0180, 0x019d, 0x01e8, 0x0203, 0x021a, 0x0226, + 0x0239, 0x0254, 0x026f, 0x027f, 0x02bb, 0x02cf, 0x02dd, 0x02dd, + 0x0309, 0x033b, 0x0364, 0x0364, 0x037f, 0x03ad, 0x03ca, 0x03dc, + 0x03e8, 0x03e8, 0x03fd, 0x041c, 0x0435, 0x0441, 0x0447, 0x0453, + 0x0483, 0x04af, 0x04af, 0x04cc, 0x04dc, 0x04dc, 0x04fc, 0x0524, + 0x0549, 0x0562, 0x0579, 0x0594, 0x05af, 0x05af, 0x05c9, 0x05d9, + // Entry 40 - 7F + 0x05f2, 0x060b, 0x060b, 0x0622, 0x063d, 0x063d, 0x0647, 0x065c, + 0x0673, 0x06a7, 0x06c4, 0x06d4, 0x06e9, 0x06fe, 0x071c, 0x073a, + 0x073a, 0x073a, 0x0755, 0x0770, 0x0770, 0x078f, 0x07ae, 0x07d5, + 0x07d5, 0x07d5, 0x07f0, 0x080d, 0x080d, 0x082a, 0x0845, 0x0845, + 0x0867, 0x0867, 0x0888, 0x0888, 0x0888, 0x0888, 0x089c, 0x089c, + 0x08b5, 0x08cd, 0x08e8, 0x0905, 0x0924, 0x0924, 0x0924, 0x094c, + 0x0964, 0x097f, 0x099c, 0x09b5, 0x09d4, 0x09fc, 0x0a17, 0x0a2e, + 0x0a4d, 0x0a64, 0x0a87, 0x0a9e, 0x0a9e, 0x0abb, 0x0ad6, 0x0af5, + // Entry 80 - BF + 0x0af5, 0x0af5, 0x0af5, 0x0b12, 0x0b12, 0x0b2f, 0x0b51, 0x0b6c, + 0x0b9c, 0x0bc5, 0x0beb, 0x0c06, 0x0c06, 0x0c1c, 0x0c32, 0x0c4d, + 0x0c4d, 0x0c67, 0x0c7e, 0x0c97, 0x0cb0, 0x0cbe, 0x0cd3, 0x0cf2, + 0x0d11, 0x0d11, 0x0d2e, 0x0d3f, 0x0d58, 0x0d58, 0x0d58, 0x0d7f, + 0x0dbc, 0x0dcb, 0x0de6, 0x0e0d, 0x0e1b, 0x0e36, 0x0e55, 0x0e72, +} // Size: 360 bytes + +var srLatnScriptStr string = "" + // Size: 1953 bytes + "arapsko pismoimperijsko aramejsko pismojermensko pismoavestansko pismoba" + + "lijsko pismobatak pismobengalsko pismoblisimbolično pismobopomofo pismob" + + "ramansko pismoBrajevo pismobuginsko pismobuhidsko pismočakmansko pismouj" + + "edinjeni kanadski aboridžinski silabicikarijsko pismočamsko pismoČerokic" + + "irt pismokoptičko pismokiparsko pismoćirilicaStaroslovenska crkvena ćiri" + + "licadevanagariDezeretegipatsko narodno pismoegipatsko hijeratsko pismoeg" + + "ipatski hijeroglifietiopsko pismogruzijsko khutsuri pismogruzijsko pismo" + + "glagoljicaGotikagrčko pismogudžaratsko pismogurmuki pismohangulhanhanuno" + + "pojednostavljeno han pismotradicionalno han pismohebrejsko pismohiragana" + + "pahav hmong pismoKatakana ili Hiraganastaromađarsko pismoinduško pismost" + + "ari italikjavansko pismojapansko pismokajah-li pismokatakanakarošti pism" + + "okmersko pismokanada pismokorejsko pismokaitilanna pismolaoško pismolati" + + "nica (fraktur varijanta)galska latinicalatinicalepča pismolimbu pismolin" + + "earno A pismolinearno B pismolisijsko pismolidijsko pismomandeansko pism" + + "omanihejsko pismomajanski hijeroglifimeroitik pismomalajalam pismomongol" + + "sko pismomesečevo pismomeitei majek pismomijanmarsko pismon’ko pismoogam" + + "sko pismool čiki pismoorkonsko pismoorijansko pismoosmanjansko pismostar" + + "o permiksko pismopags-pa pismopisani pahlavipsalter pahlavipahlavi pismo" + + "Feničansko pismoporald fonetsko pismopisani partianrejang pismorongorong" + + "o pismorunsko pismosamaritansko pismosarati pismosauraštra pismoznakovno" + + " pismošavijansko pismosinhalsko pismosundansko pismosiloti nagri pismosi" + + "rijsko pismosirijsko estrangelo pismozapadnosirijsko pismopismo istočne " + + "Sirijetagbanva pismotai le pismonovi tai luetamilsko pismotai viet pismo" + + "telugu pismotengvar pismotifinag pismoTagalogthana pismotajlandsko pismo" + + "tibetansko pismougaritsko pismovai pismovidljivi govorstaropersijsko pis" + + "mosumersko-akadsko kuneiform pismoji pismonasledno pismomatematička nota" + + "cijasimbolinepisani jezikzajedničko pismonepoznato pismo" + +var srLatnScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000d, 0x0027, 0x0036, 0x0046, + 0x0054, 0x0054, 0x0054, 0x005f, 0x006e, 0x0082, 0x0090, 0x009f, + 0x00ac, 0x00ba, 0x00c8, 0x00d8, 0x0102, 0x0110, 0x011d, 0x0124, + 0x012e, 0x013d, 0x014b, 0x0154, 0x0174, 0x017e, 0x0185, 0x0185, + 0x019c, 0x01b6, 0x01cb, 0x01cb, 0x01d9, 0x01f1, 0x0200, 0x020a, + 0x0210, 0x0210, 0x021c, 0x022e, 0x023b, 0x0241, 0x0244, 0x024a, + 0x0264, 0x027b, 0x027b, 0x028a, 0x0292, 0x0292, 0x02a3, 0x02b8, + 0x02cc, 0x02da, 0x02e6, 0x02f4, 0x0302, 0x0302, 0x0310, 0x0318, + // Entry 40 - 7F + 0x0326, 0x0333, 0x0333, 0x033f, 0x034d, 0x034d, 0x0352, 0x035d, + 0x036a, 0x0386, 0x0395, 0x039d, 0x03a9, 0x03b4, 0x03c4, 0x03d4, + 0x03d4, 0x03d4, 0x03e2, 0x03f0, 0x03f0, 0x0400, 0x0410, 0x0424, + 0x0424, 0x0424, 0x0432, 0x0441, 0x0441, 0x0450, 0x045f, 0x045f, + 0x0471, 0x0471, 0x0482, 0x0482, 0x0482, 0x0482, 0x048e, 0x048e, + 0x049b, 0x04a9, 0x04b7, 0x04c6, 0x04d7, 0x04d7, 0x04d7, 0x04ec, + 0x04f9, 0x0507, 0x0516, 0x0523, 0x0534, 0x0549, 0x0557, 0x0563, + 0x0573, 0x057f, 0x0591, 0x059d, 0x059d, 0x05ad, 0x05bb, 0x05cc, + // Entry 80 - BF + 0x05cc, 0x05cc, 0x05cc, 0x05db, 0x05db, 0x05ea, 0x05fc, 0x060a, + 0x0623, 0x0638, 0x064d, 0x065b, 0x065b, 0x0667, 0x0673, 0x0681, + 0x0681, 0x068f, 0x069b, 0x06a8, 0x06b5, 0x06bc, 0x06c7, 0x06d7, + 0x06e7, 0x06e7, 0x06f6, 0x06ff, 0x070d, 0x070d, 0x070d, 0x0721, + 0x0741, 0x0749, 0x0757, 0x076c, 0x0773, 0x0781, 0x0792, 0x07a1, +} // Size: 360 bytes + +var svScriptStr string = "" + // Size: 1661 bytes + "afakiskakaukasiska albanskaahomarabiskaimperisk arameiskaarmeniskaavesti" + + "skabalinesiskabamunskabassaiska vahbatakbengaliskablissymbolerbopomofobr" + + "amipunktskriftbuginesiskabuhidchakmakanadensiska stavelseteckenkariskach" + + "amcherokeecirtkoptiskacypriotiskakyrilliskafornkyrkoslavisk kyrilliskade" + + "vanagarideseretDuployéstenografiskademotiskahieratiskaegyptiska hierogly" + + "ferelbasiskaetiopiskakutsurigeorgiskaglagolitiskagotiskagammaltamilskagr" + + "ekiskagujaratigurmukhihangulhanhanunåförenklade han-teckentraditionella " + + "han-teckenhatranhebreiskahiraganahittitiska hieroglyferpahaw mongkatakan" + + "a/hiraganafornungerskaindusfornitaliskajavanskajapanskajurchenskakaya li" + + "katakanakharoshtikhmeriskakhojkiskakanaresiskakoreanskakpellékaithiskala" + + "nnalaotiskafrakturlatingaeliskt latinlatinskaronglimbulinjär Alinjär BFr" + + "aserlomalykiskalydiskamahajaniskamandaéiskamanikeanskamayahieroglyfermen" + + "dekursiv-meroitiskameroitiskamalayalammodiskamongoliskamoonmrumeitei-may" + + "ekmultaniskaburmesiskafornnordarabiskanabatateiskanaxi geban-kånüshuogha" + + "mol-chikiorkonoriyaosmanjapalmyreniskaPau Cin Hau-skriftfornpermiskaphag" + + "s-patidig pahlavipsaltaren-pahlavibokpahlavifenikiskapollardteckentidig " + + "parthianskarejangrongo-rongorunorsamaritiskasaratifornsydarabiskasaurash" + + "trateckningsskriftshawiskasharadasiddhamskasindhiskasingalesiskasora som" + + "pengsundanesiskasyloti nagrisyriskaestrangelosyriskavästsyriskaöstsyrisk" + + "atagbanwatakritiskatai letai luetamilskatangutiskatai viettelugutengwart" + + "ifinaghiskatagalogtaanathailändskatibetanskatirhutaugaritiskavajsynligt " + + "talvarang kshitiwoleaifornpersiskasumeo-akkadisk kilskriftyiärvdamatemat" + + "isk notationsymboleroskrivet språkgemensammaokänt skriftsystem" + +var svScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0008, 0x001b, 0x001f, 0x0027, 0x0039, 0x0042, 0x004b, + 0x0056, 0x005e, 0x006b, 0x0070, 0x007a, 0x0086, 0x008e, 0x0093, + 0x009e, 0x00a9, 0x00ae, 0x00b4, 0x00cf, 0x00d6, 0x00da, 0x00e2, + 0x00e6, 0x00ee, 0x00f9, 0x0103, 0x011e, 0x0128, 0x012f, 0x0144, + 0x014d, 0x0157, 0x016c, 0x0175, 0x017e, 0x0185, 0x018e, 0x019a, + 0x01a1, 0x01af, 0x01b7, 0x01bf, 0x01c7, 0x01cd, 0x01d0, 0x01d7, + 0x01ed, 0x0205, 0x020b, 0x0214, 0x021c, 0x0232, 0x023c, 0x024d, + 0x0259, 0x025e, 0x026a, 0x0272, 0x027a, 0x0284, 0x028b, 0x0293, + // Entry 40 - 7F + 0x029c, 0x02a5, 0x02ae, 0x02b9, 0x02c2, 0x02c9, 0x02d2, 0x02d7, + 0x02df, 0x02eb, 0x02f9, 0x0301, 0x0305, 0x030a, 0x0313, 0x031c, + 0x0322, 0x0326, 0x032d, 0x0334, 0x033f, 0x034a, 0x0355, 0x0364, + 0x0369, 0x037a, 0x0384, 0x038d, 0x0394, 0x039e, 0x03a2, 0x03a5, + 0x03b1, 0x03bb, 0x03c5, 0x03d5, 0x03e1, 0x03ea, 0x03ef, 0x03f5, + 0x03fa, 0x0402, 0x0407, 0x040c, 0x0413, 0x041f, 0x0431, 0x043d, + 0x0445, 0x0452, 0x0463, 0x046d, 0x0476, 0x0483, 0x0494, 0x049a, + 0x04a5, 0x04aa, 0x04b5, 0x04bb, 0x04ca, 0x04d4, 0x04e3, 0x04eb, + // Entry 80 - BF + 0x04f2, 0x04fc, 0x0505, 0x0511, 0x051d, 0x0529, 0x0535, 0x053c, + 0x054d, 0x0559, 0x0564, 0x056c, 0x0576, 0x057c, 0x0583, 0x058b, + 0x0595, 0x059d, 0x05a3, 0x05aa, 0x05b6, 0x05bd, 0x05c2, 0x05ce, + 0x05d8, 0x05df, 0x05e9, 0x05ec, 0x05f7, 0x0604, 0x060a, 0x0616, + 0x062e, 0x0630, 0x0636, 0x0649, 0x0651, 0x0660, 0x066a, 0x067d, +} // Size: 360 bytes + +var swScriptStr string = "" + // Size: 346 bytes + "KiarabuKiarmeniaKibengaliKibopomofoBrailleKisirilikiKidevanagariKiethiop" + + "iaKijojiaKigirikiKigujaratiKigurmukhiKihangulKihanKihan RahisiKihan cha " + + "JadiKiebraniaKihiraganaKijapaniKikatakanaKikambodiaKikannadaKikoreaKilao" + + "siKilatiniKimalayalamKimongoliaMyamaKioriyaKisinhalaKitamilKiteluguKitha" + + "anaKitaiKitibetiAlamaHaijaandikwaKawaidaHati isiyojulikana" + +var swScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, 0x0010, 0x0010, + 0x0010, 0x0010, 0x0010, 0x0010, 0x0019, 0x0019, 0x0023, 0x0023, + 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a, + 0x002a, 0x002a, 0x002a, 0x0034, 0x0034, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0040, 0x004a, 0x004a, 0x0051, 0x0051, + 0x0051, 0x0051, 0x0059, 0x0063, 0x006d, 0x0075, 0x007a, 0x007a, + 0x0086, 0x0094, 0x0094, 0x009d, 0x00a7, 0x00a7, 0x00a7, 0x00a7, + 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00af, 0x00af, 0x00af, 0x00b9, + // Entry 40 - 7F + 0x00b9, 0x00c3, 0x00c3, 0x00cc, 0x00d3, 0x00d3, 0x00d3, 0x00d3, + 0x00da, 0x00da, 0x00da, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, + 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, 0x00e2, + 0x00e2, 0x00e2, 0x00e2, 0x00ed, 0x00ed, 0x00f7, 0x00f7, 0x00f7, + 0x00f7, 0x00f7, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, + 0x00fc, 0x00fc, 0x00fc, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, + 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, + 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, + // Entry 80 - BF + 0x0103, 0x0103, 0x0103, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, + 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x010c, 0x0113, + 0x0113, 0x0113, 0x011b, 0x011b, 0x011b, 0x011b, 0x0123, 0x0128, + 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, + 0x0130, 0x0130, 0x0130, 0x0130, 0x0135, 0x0141, 0x0148, 0x015a, +} // Size: 360 bytes + +var taScriptStr string = "" + // Size: 3904 bytes + "அரபிக்இம்பேரியல் அரமெய்க்அர்மேனியன்அவெஸ்தான்பாலினீஸ்பாடாக்வங்காளம்ப்லிஸ்" + + "ஸிமிபால்ஸ்போபோமோஃபோபிரம்மிபிரெயில்புகினீஸ்புகித்சக்மாயுனிஃபைடு கனடியன்" + + " அபொரிஜினல் சிலபிக்ஸ்கரியன்சாம்செரோக்கிகிர்த்காப்டிக்சைப்ரியாட்சிரிலிக்ப" + + "ழைய சர்ச் ஸ்லவோனிக் சிரிலிக்தேவநாகரிடெசராட்எகிப்தியன் டெமோட்டிக்எகிப்த" + + "ியன் ஹைரேட்டிக்எகிப்தியன் ஹைரோகிளிப்ஸ்எத்தியோபிக்ஜியார்ஜியன் குட்சுரிஜ" + + "ார்ஜியன்க்லாகோலிடிக்கோதிக்கிரேக்கம்குஜராத்திகுர்முகிஹங்குல்ஹன்ஹனுனூஎளி" + + "தாக்கப்பட்ட ஹன்பாரம்பரிய ஹன்ஹீப்ருஹிராகானாபஹாவ் மாங்க்கடாகானா அல்லது ஹ" + + "ிராகானாபழைய ஹங்கேரியன்சிந்துபழைய இத்தாலிஜாவனீஸ்ஜப்பானியம்கயாஹ் லீகதகான" + + "ாகரோஷ்டிகமெர்கன்னடம்கொரியன்காய்திலன்னாலாவோஃப்ரக்டூர் லெத்தின்கேலிக் லெ" + + "த்தின்லத்தின்லெப்சாலிம்புலினியர் ஏலினியர் பிலிசியன்லிடியன்மேன்டியன்மனி" + + "செய்ன்மயான் ஹைரோகிளிப்மெராய்டிக்மலையாளம்மங்கோலியன்மூன்மெய்தெய் மயக்மிய" + + "ான்மர்என்‘கோஒகாம்ஒல் சிக்கிஆர்கான்ஒரியாஒஸ்மான்யாபழைய பெர்மிக்பக்ஸ்-பாஇ" + + "ன்ஸ்கிரிப்ஷனல் பஹலவிசால்டர் பஹலவிபுக் பஹலவிஃபோனேஷியன்போலார்ட் ஃபொனெட்ட" + + "ிக்இன்ஸ்கிரிப்ஷனல் பார்த்தியன்ரெஜெய்ன்ரொங்கோரொங்கோருனிக்சமாரிடன்சாராதி" + + "சௌராஷ்ட்ராஸைன்எழுத்துஷவியான்சிங்களம்சுந்தானீஸ்சிலோடி நக்ரிசிரியாக்எஸ்ட" + + "்ரெங்கெலோ சிரியாக்மேற்கு சிரியாக்கிழக்கு சிரியாக்தகோவானாதாய் லேபுதிய த" + + "ை லூதமிழ்தை வியத்தெலுங்குதெங்வார்டிஃபினாக்தகலாக்தானாதாய்திபெத்தியன்உகா" + + "ரதிக்வைவிசிபிள் ஸ்பீச்பழைய பெர்ஷியன்சுமெரோ-அக்கடியன் க்யூனிஃபார்ம்யீபா" + + "ரம்பரியமானகணிதக்குறியீடுசின்னங்கள்எழுதப்படாததுபொதுஅறியப்படாத எழுத்து" + +var taScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x0049, 0x0067, 0x0082, + 0x009a, 0x009a, 0x009a, 0x00ac, 0x00c4, 0x00f4, 0x010f, 0x0124, + 0x013c, 0x0154, 0x0166, 0x0175, 0x01e1, 0x01f3, 0x01ff, 0x0217, + 0x0229, 0x0241, 0x025f, 0x0277, 0x02c8, 0x02e0, 0x02f5, 0x02f5, + 0x0332, 0x036f, 0x03b2, 0x03b2, 0x03d3, 0x040d, 0x0428, 0x044c, + 0x045e, 0x045e, 0x0479, 0x0494, 0x04ac, 0x04c1, 0x04ca, 0x04d9, + 0x050d, 0x0532, 0x0532, 0x0544, 0x055c, 0x055c, 0x057e, 0x05bf, + 0x05ea, 0x05fc, 0x061e, 0x0633, 0x0651, 0x0651, 0x0667, 0x0679, + // Entry 40 - 7F + 0x068e, 0x069d, 0x069d, 0x06b2, 0x06c7, 0x06c7, 0x06d9, 0x06e8, + 0x06f4, 0x072b, 0x0756, 0x076b, 0x077d, 0x078f, 0x07a8, 0x07c4, + 0x07c4, 0x07c4, 0x07d9, 0x07ee, 0x07ee, 0x0809, 0x0824, 0x0852, + 0x0852, 0x0852, 0x0870, 0x0888, 0x0888, 0x08a6, 0x08b2, 0x08b2, + 0x08d7, 0x08d7, 0x08f2, 0x08f2, 0x08f2, 0x08f2, 0x0904, 0x0904, + 0x0913, 0x092f, 0x0944, 0x0953, 0x096e, 0x096e, 0x096e, 0x0993, + 0x09a9, 0x09e6, 0x0a0b, 0x0a27, 0x0a45, 0x0a7f, 0x0ace, 0x0ae6, + 0x0b0a, 0x0b1c, 0x0b34, 0x0b46, 0x0b46, 0x0b64, 0x0b85, 0x0b9a, + // Entry 80 - BF + 0x0b9a, 0x0b9a, 0x0b9a, 0x0bb2, 0x0bb2, 0x0bd0, 0x0bf2, 0x0c0a, + 0x0c4a, 0x0c75, 0x0ca3, 0x0cb8, 0x0cb8, 0x0ccb, 0x0ce8, 0x0cf7, + 0x0cf7, 0x0d0d, 0x0d25, 0x0d3d, 0x0d58, 0x0d6a, 0x0d76, 0x0d82, + 0x0da3, 0x0da3, 0x0dbb, 0x0dc1, 0x0dec, 0x0dec, 0x0dec, 0x0e14, + 0x0e6a, 0x0e70, 0x0e94, 0x0ebe, 0x0edc, 0x0f00, 0x0f0c, 0x0f40, +} // Size: 360 bytes + +var teScriptStr string = "" + // Size: 3721 bytes + "అరబిక్ఇంపీరియల్ అరామాక్అర్మేనియన్అవేస్టాన్బాలినీస్బాటక్బెంగాలిబ్లిస్సింబ" + + "ల్స్బోపోమోఫోబ్రాహ్మిబ్రెయిల్బ్యుగినీస్బుహిడ్చక్మాయునిఫైడ్ కెనెడియన్ అబ" + + "ొరిజినల్ సిలబిక్స్కారియన్చామ్చిరోకిసిర్థ్కోప్టిక్సైప్రోట్సిరిలిక్ప్రాచ" + + "ీన చర్చ స్లావోనిక్ సిరిలిక్దేవనాగరిడేసెరెట్ఇజిప్షియన్ డెమోటిక్ఇజిప్షియ" + + "న్ హైరాటిక్ఇజిప్షియన్ హైరోగ్లైఫ్స్ఇథియోపిక్జార్జియన్ ఖట్సూరిజార్జియన్గ" + + "్లాగో లిటిక్గోతిక్గ్రీక్గుజరాతీగుర్ముఖిహంగుల్హాన్హనునూసరళీకృత హాన్సాంప" + + "్రదాయక హాన్హీబ్రుహిరాగానపాహవా హ్మోంగ్కాటాకాన లేదా హిరాగనప్రాచీన హంగేరి" + + "యన్సింధుప్రాచిన ఐటాలిక్జావనీస్జాపనీస్కాయాహ్ లికాటాకానఖరోషథిఖ్మేర్కన్నడ" + + "కొరియన్కైథిలన్నాలావోఫ్రాక్టూర్ లాటిన్గేలిక్ లాటిన్లాటిన్లేప్చాలింబులిన" + + "ియర్ ఎలినియర్ బిలిసియన్లిడియన్మాన్డియన్మానిచేన్మాయన్ హైరోగ్లైఫ్స్మెరోఇ" + + "టిక్మలయాళంమంగోలియన్మూన్మీటి మయెక్మయాన్మార్న్కోఒఘమ్ఓల్ చికిఓర్ఖోన్ఒరియా" + + "ఓసమాన్యప్రాచీన పెర్మిక్ఫాగ్స్-పాఇంస్క్రిప్షనాల్ పహ్లావిసల్టార్ పహ్లావి" + + "పుస్తక పహ్లావిఫోనిశియన్పోల్లర్డ్ ఫోనెటిక్ఇంస్క్రిప్షనాల్ పార్థియన్రేజా" + + "ంగ్రోంగో రోంగోరూనిక్సమారిటన్సరాటిసౌరాష్ట్రసంజ్ఞ లిపిషవియాన్సింహళంసుడాన" + + "ీస్స్లోటి నాగ్రిసిరియాక్ఎస్ట్రానజీలో సిరియాక్పశ్చిమ సిరియాక్తూర్పు సిర" + + "ియాక్టాగ్బానవాతై లీక్రొత్త టై లుఇతమిళముటై వియట్తెలుగుటేంగ్వార్టిఫీనాఘ్" + + "టగలాగ్థానాథాయ్టిబెటన్యుగారిటిక్వాయికనిపించే భాషప్రాచీన పర్షియన్సుమేరో-" + + " అక్కడియన్ క్యునిఫార్మ్యివారసత్వంగణిత సంకేతలిపిచిహ్నాలులిపి లేనిసామాన్యత" + + "ెలియని లిపి" + +var teScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x0043, 0x0061, 0x007c, + 0x0094, 0x0094, 0x0094, 0x00a3, 0x00b8, 0x00e2, 0x00fa, 0x0112, + 0x012a, 0x0148, 0x015a, 0x0169, 0x01d8, 0x01ed, 0x01f9, 0x020b, + 0x021d, 0x0235, 0x024d, 0x0265, 0x02bf, 0x02d7, 0x02ef, 0x02ef, + 0x0326, 0x035d, 0x03a0, 0x03a0, 0x03bb, 0x03ec, 0x0407, 0x042c, + 0x043e, 0x043e, 0x0450, 0x0465, 0x047d, 0x048f, 0x049b, 0x04aa, + 0x04cc, 0x04f7, 0x04f7, 0x0509, 0x051e, 0x051e, 0x0543, 0x0578, + 0x05a9, 0x05b8, 0x05e3, 0x05f8, 0x060d, 0x060d, 0x0626, 0x063b, + // Entry 40 - 7F + 0x064d, 0x065f, 0x065f, 0x066e, 0x0683, 0x0683, 0x068f, 0x069e, + 0x06aa, 0x06db, 0x0700, 0x0712, 0x0724, 0x0733, 0x074c, 0x0768, + 0x0768, 0x0768, 0x077d, 0x0792, 0x0792, 0x07ad, 0x07c5, 0x07f9, + 0x07f9, 0x07f9, 0x0814, 0x0826, 0x0826, 0x0841, 0x084d, 0x084d, + 0x0869, 0x0869, 0x0884, 0x0884, 0x0884, 0x0884, 0x0890, 0x0890, + 0x089c, 0x08b2, 0x08c7, 0x08d6, 0x08eb, 0x08eb, 0x08eb, 0x0919, + 0x0932, 0x0975, 0x09a0, 0x09c8, 0x09e3, 0x0a17, 0x0a60, 0x0a75, + 0x0a94, 0x0aa6, 0x0abe, 0x0acd, 0x0acd, 0x0ae8, 0x0b04, 0x0b19, + // Entry 80 - BF + 0x0b19, 0x0b19, 0x0b19, 0x0b2b, 0x0b2b, 0x0b43, 0x0b68, 0x0b80, + 0x0bbd, 0x0be8, 0x0c13, 0x0c2e, 0x0c2e, 0x0c3b, 0x0c61, 0x0c73, + 0x0c73, 0x0c89, 0x0c9b, 0x0cb6, 0x0cce, 0x0ce0, 0x0cec, 0x0cf8, + 0x0d0d, 0x0d0d, 0x0d2b, 0x0d37, 0x0d59, 0x0d59, 0x0d59, 0x0d87, + 0x0ddb, 0x0de1, 0x0df9, 0x0e21, 0x0e39, 0x0e52, 0x0e67, 0x0e89, +} // Size: 360 bytes + +var thScriptStr string = "" + // Size: 4317 bytes + "อะฟาคาแอลเบเนีย คอเคเซียอาหรับอิมพีเรียล อราเมอิกอาร์เมเนียอเวสตะบาหลีบา" + + "มุมบัสซาบาตักเบงกาลีบลิสซิมโบลส์ปอพอมอฟอพราหมีเบรลล์บูกิสบูฮิดชากมาสัญ" + + "ลักษณ์ชนเผ่าพื้นเมืองแคนาดาคาเรียจามเชอโรกีเซิร์ทคอปติกไซเปรียทซีริลลิ" + + "กเชอร์ชสลาโวนิกซีริลลิกโบราณเทวนาครีเดเซเรทชวเลขดัปโลยันดีโมติกอียิปต์" + + "เฮียราติกอียิปต์เฮียโรกลิฟส์อียิปต์เอลบ์ซานเอทิโอปิกคัตซูรีจอร์เจียจอร" + + "์เจียกลาโกลิติกโกธิกคฤณห์กรีกคุชราตกูร์มูคีฮันกูลฮั่นฮานูโนโอฮั่นตัวย่" + + "อฮั่นตัวเต็มฮีบรูฮิระงะนะอักขระอานาโตเลียปาเฮาห์ม้งคะตะกะนะหรือฮิระงะน" + + "ะฮังการีโบราณอินดัสอิตาลีโบราณชวาญี่ปุ่นจูร์เชนคยาห์คะตะกะนะขโรษฐีเขมร" + + "คอจคีกันนาดาเกาหลีเปลเลกายติล้านนาลาวลาติน - ฟรังเตอร์ลาติน - แกลิกละต" + + "ินเลปชาลิมบูลีเนียร์เอลีเนียร์บีเฟรเซอร์โลมาไลเซียลีเดียมหาชนีแมนเดียน" + + "มานิแชนมายาไฮโรกลิฟส์เมนเดเคอร์ซีฟ-เมโรอิติกเมโรติกมาลายาลัมโมฑีมองโกเ" + + "ลียมูนมโรเมเทมาเยกพม่าอาระเบียเหนือโบราณนาบาทาเอียนกีบา-นาซีเอ็นโกนุซุ" + + "โอคัมโอลชิกิออร์คอนโอริยาออสมันยาพาลไมรีนป่อจิ้งฮอเปอร์มิกโบราณฟากส์-ป" + + "าปะห์ลาวีอินสคริปชันแนลปะห์ลาวีซอลเตอร์ปะห์ลาวีบุ๊กฟินิเชียสัทศาสตร์พอ" + + "ลลาร์ดพาร์เทียอินสคริปชันแนลเรจังรองโกรองโกรูนิกซามาเรียซาราติอาระเบีย" + + "ใต้โบราณโสวรัสตระไซน์ไรติ้งซอเวียนชาราดาสิทธัมคุดาวาดีสิงหลโสราสมเป็งซ" + + "ุนดาซิโลตินากรีซีเรียซีเรียเอสทรานจีโลซีเรียตะวันตกซีเรียตะวันออกตักบั" + + "นวาทาครีไทเลไทลื้อใหม่ทมิฬตันกัทไทเวียตเทลูกูเทงกวาร์ทิฟินากตากาล็อกทา" + + "นาไทยทิเบตเทอฮุทายูการิตไวคำพูดที่มองเห็นได้วารังกสิติโอลีเอเปอร์เซียโ" + + "บราณอักษรรูปลิ่มสุเมเรีย-อัคคาเดียยิอินเฮอริตเครื่องหมายทางคณิตศาสตร์ซ" + + "ิมโบลส์ไม่มีภาษาเขียนสามัญสคริปต์ที่ไม่รู้จัก" + +var thScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0012, 0x0046, 0x0046, 0x0058, 0x008f, 0x00ad, 0x00bf, + 0x00ce, 0x00dd, 0x00ec, 0x00fb, 0x0110, 0x0134, 0x014c, 0x015e, + 0x0170, 0x017f, 0x018e, 0x019d, 0x01f7, 0x0209, 0x0212, 0x0227, + 0x0239, 0x024b, 0x0263, 0x027b, 0x02cc, 0x02e4, 0x02f9, 0x0320, + 0x034a, 0x037a, 0x03b3, 0x03cb, 0x03e6, 0x0413, 0x042b, 0x0449, + 0x0458, 0x0467, 0x0473, 0x0485, 0x049d, 0x04af, 0x04bb, 0x04d3, + 0x04f1, 0x0512, 0x0512, 0x0521, 0x0539, 0x0569, 0x0587, 0x05c3, + 0x05e7, 0x05f9, 0x061a, 0x0623, 0x0638, 0x064d, 0x065c, 0x0674, + // Entry 40 - 7F + 0x0686, 0x0692, 0x06a1, 0x06b6, 0x06c8, 0x06d7, 0x06e6, 0x06f8, + 0x0701, 0x072e, 0x074f, 0x075e, 0x076d, 0x077c, 0x079a, 0x07b8, + 0x07d0, 0x07dc, 0x07ee, 0x0800, 0x0812, 0x082a, 0x083f, 0x0869, + 0x0878, 0x08ac, 0x08c1, 0x08dc, 0x08e8, 0x0903, 0x090c, 0x0915, + 0x0930, 0x0930, 0x093c, 0x0972, 0x0993, 0x09ac, 0x09be, 0x09ca, + 0x09d9, 0x09ee, 0x0a03, 0x0a15, 0x0a2d, 0x0a45, 0x0a60, 0x0a87, + 0x0a9d, 0x0adf, 0x0b0f, 0x0b33, 0x0b4b, 0x0b7e, 0x0bc0, 0x0bcf, + 0x0bed, 0x0bfc, 0x0c14, 0x0c26, 0x0c56, 0x0c71, 0x0c8f, 0x0ca4, + // Entry 80 - BF + 0x0cb6, 0x0cc8, 0x0ce0, 0x0cef, 0x0d0d, 0x0d1c, 0x0d3d, 0x0d4f, + 0x0d82, 0x0da9, 0x0dd3, 0x0deb, 0x0dfa, 0x0e06, 0x0e24, 0x0e30, + 0x0e42, 0x0e57, 0x0e69, 0x0e81, 0x0e96, 0x0eae, 0x0eba, 0x0ec3, + 0x0ed2, 0x0ee7, 0x0efc, 0x0f02, 0x0f38, 0x0f56, 0x0f68, 0x0f92, + 0x0fea, 0x0ff0, 0x100b, 0x1053, 0x106b, 0x1095, 0x10a4, 0x10dd, +} // Size: 360 bytes + +var trScriptStr string = "" + // Size: 1491 bytes + "AfakaKafkas AlbanyasıArapİmparatorluk AramicesiErmeniAvestaBali DiliBamu" + + "mBassa VahBatakBengalBlis SembolleriBopomofoBrahmiBrailleBugisBuhidChakm" + + "aUCASKaryaChamÇerokiCirthKıptiKıbrısKirilEski Kilise Slavcası KirilDevan" + + "agariDeseretDuployé StenografiDemotik MısırHiyeratik MısırMısır Hiyerogl" + + "ifleriElbasanEtiyopyaHutsuri GürcüGürcüGlagolitGotikGranthaYunanGüceratG" + + "urmukhiHangılHanHanunooBasitleştirilmiş HanGeleneksel HanİbraniHiraganaA" + + "nadolu HiyeroglifleriPahavh HmongKatakana veya HiraganaEski MacarIndusEs" + + "ki İtalyanCava DiliJaponJurchenKayah LiKatakanaKharoshthiKmerKhojkiKanna" + + "daKoreKpelleKaithiLannaLaoFraktur LatinGael LatinLatinLepchaLimbuLineer " + + "ALineer BFraserLomaLikyaLidyaMahajaniMandenManiMaya HiyeroglifleriMendeM" + + "eroitik El YazısıMeroitikMalayalamModiMoğolMoonMroMeitei MayekBurmaEski " + + "Kuzey ArapNebatiNaksi GebaN’KoNüshuOghamOl ChikiOrhunOriyaOsmanyaPalmira" + + "Pau Cin HauEski PermikPhags-paPehlevi Kitabe DiliPsalter PehleviKitap Pe" + + "hlevi DiliFenikePollard FonetikPartça Kitabe DiliRejangRongorongoRunikSa" + + "maritSaratiEski Güney ArapSaurashtraİşaret DiliShavianSharadaSiddhamKhud" + + "abadiSeylanSora SompengSundaSyloti NagriSüryaniEstrangela SüryaniBatı Sü" + + "ryaniDoğu SüryaniTagbanvaTakriTai LeNew Tai LueTamilTangutTai VietTelugu" + + "TengvarTifinaghTakalotThaanaTayTibetTirhutaUgarit Çivi YazısıVaiKonuşma " + + "Sesleri ÇizimlemesiVarang KshitiWoleaiEski FarsSümer-Akad Çivi YazısıYiK" + + "alıtsalMatematiksel GösterimSembolYazılı OlmayanOrtakBilinmeyen Alfabe" + +var trScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0005, 0x0016, 0x0016, 0x001a, 0x0031, 0x0037, 0x003d, + 0x0046, 0x004b, 0x0054, 0x0059, 0x005f, 0x006e, 0x0076, 0x007c, + 0x0083, 0x0088, 0x008d, 0x0093, 0x0097, 0x009c, 0x00a0, 0x00a7, + 0x00ac, 0x00b2, 0x00ba, 0x00bf, 0x00da, 0x00e4, 0x00eb, 0x00fe, + 0x010d, 0x011e, 0x0134, 0x013b, 0x0143, 0x0152, 0x0159, 0x0161, + 0x0166, 0x016d, 0x0172, 0x017a, 0x0182, 0x0189, 0x018c, 0x0193, + 0x01a9, 0x01b7, 0x01b7, 0x01be, 0x01c6, 0x01dc, 0x01e8, 0x01fe, + 0x0208, 0x020d, 0x021a, 0x0223, 0x0228, 0x022f, 0x0237, 0x023f, + // Entry 40 - 7F + 0x0249, 0x024d, 0x0253, 0x025a, 0x025e, 0x0264, 0x026a, 0x026f, + 0x0272, 0x027f, 0x0289, 0x028e, 0x0294, 0x0299, 0x02a1, 0x02a9, + 0x02af, 0x02b3, 0x02b8, 0x02bd, 0x02c5, 0x02cb, 0x02cf, 0x02e2, + 0x02e7, 0x02fb, 0x0303, 0x030c, 0x0310, 0x0316, 0x031a, 0x031d, + 0x0329, 0x0329, 0x032e, 0x033d, 0x0343, 0x034d, 0x0353, 0x0359, + 0x035e, 0x0366, 0x036b, 0x0370, 0x0377, 0x037e, 0x0389, 0x0394, + 0x039c, 0x03af, 0x03be, 0x03d0, 0x03d6, 0x03e5, 0x03f8, 0x03fe, + 0x0408, 0x040d, 0x0414, 0x041a, 0x042a, 0x0434, 0x0441, 0x0448, + // Entry 80 - BF + 0x044f, 0x0456, 0x045f, 0x0465, 0x0471, 0x0476, 0x0482, 0x048a, + 0x049d, 0x04ab, 0x04b9, 0x04c1, 0x04c6, 0x04cc, 0x04d7, 0x04dc, + 0x04e2, 0x04ea, 0x04f0, 0x04f7, 0x04ff, 0x0506, 0x050c, 0x050f, + 0x0514, 0x051b, 0x0530, 0x0533, 0x0550, 0x055d, 0x0563, 0x056c, + 0x0586, 0x0588, 0x0591, 0x05a7, 0x05ad, 0x05bd, 0x05c2, 0x05d3, +} // Size: 360 bytes + +var ukScriptStr string = "" + // Size: 2925 bytes + "афакакавказька албанськаахомарабицяАрмівірменськаАвестійськийБалійськийБ" + + "амумбассаБатакбенгальськасимволи БліссабопомофоБрахмішрифт БрайляБугійс" + + "ькийБухідЧакмауніфіковані символи канадських тубільцівКаріанськийХамітс" + + "ькийЧерокіКиртКоптськийКіпрськийкирилицяДавньоцерковнословʼянськийдеван" + + "агаріДезеретЄгипетський демотичнийЄгипетський ієратичнийЄгипетський ієр" + + "огліфічнийефіопськаКхутсурігрузинськаГлаголичнийГотичнийгрецькагуджарат" + + "ігурмухіхангилькитайськаХанунукитайська спрощенакитайська традиційнаівр" + + "итхіраганаПахау хмонгКатакана чи хіраганаДавньоугорськийХарапськийДавнь" + + "оіталійськийЯванськийяпонськаКая ЛікатаканаКхароштхікхмерськаканнадакор" + + "ейськаКаїтіЛанналаоськаЛатинський фрактурнийЛатинський гельськийлатиниц" + + "яЛепчаЛімбуЛінійний АЛінійний Вабетка ФрейзераломаЛікійськийЛідійськийМ" + + "андейськийМаніхейськийМайя ієрогліфічнийМероїтськиймалаяламськамонгольс" + + "ькаМунМейтей майєкмʼянмськаНкоОгамічнийСантальськийОрхонськийоріяОсманс" + + "ькийДавньопермськийПхагс-паПехлеві написівПехлеві релігійнийПехлеві літ" + + "ературнийФінікійськийписемність ПоллардаПарфянськийРеджангРонго-ронгоРу" + + "нічнийСамаритянськийСаратіСаураштраЗнаковийШоусингальськаСунданськийСіл" + + "оті нагріСирійськийДавньосирійський естрангелоДавньосирійський західний" + + "Давньосирійський східнийТагбанваТай-ліНовий тайський луетамільськатангу" + + "тТай-вʼєттелугуТенгварТифінагТагальськийтаанатайськатибетськаУгаритськи" + + "йВаївидиме мовленняДавньоперськийШумеро-аккадський клінописЙїуспадкован" + + "аматематичнасимвольнабезписемназвичайнаневідома система письма" + +var ukScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x000a, 0x002f, 0x0037, 0x0045, 0x004d, 0x0061, 0x0079, + 0x008d, 0x0097, 0x00a1, 0x00ab, 0x00c1, 0x00dc, 0x00ec, 0x00f8, + 0x010f, 0x0123, 0x012d, 0x0137, 0x0184, 0x019a, 0x01ae, 0x01ba, + 0x01c2, 0x01d4, 0x01e6, 0x01f6, 0x022a, 0x023e, 0x024c, 0x024c, + 0x0277, 0x02a2, 0x02d3, 0x02d3, 0x02e5, 0x02f5, 0x0309, 0x031f, + 0x032f, 0x032f, 0x033d, 0x034f, 0x035d, 0x036b, 0x037d, 0x0389, + 0x03ac, 0x03d3, 0x03d3, 0x03dd, 0x03ed, 0x03ed, 0x0402, 0x0428, + 0x0446, 0x045a, 0x047c, 0x048e, 0x049e, 0x049e, 0x04a9, 0x04b9, + // Entry 40 - 7F + 0x04cb, 0x04dd, 0x04dd, 0x04eb, 0x04fd, 0x04fd, 0x0507, 0x0511, + 0x051f, 0x0548, 0x056f, 0x057f, 0x0589, 0x0593, 0x05a6, 0x05b9, + 0x05d6, 0x05de, 0x05f2, 0x0606, 0x0606, 0x061c, 0x0634, 0x0657, + 0x0657, 0x0657, 0x066d, 0x0685, 0x0685, 0x069b, 0x06a1, 0x06a1, + 0x06b8, 0x06b8, 0x06ca, 0x06ca, 0x06ca, 0x06ca, 0x06d0, 0x06d0, + 0x06e2, 0x06fa, 0x070e, 0x0716, 0x072a, 0x072a, 0x072a, 0x0748, + 0x0757, 0x0774, 0x0797, 0x07be, 0x07d6, 0x07fb, 0x0811, 0x081f, + 0x0834, 0x0844, 0x0860, 0x086c, 0x086c, 0x087e, 0x088e, 0x0894, + // Entry 80 - BF + 0x0894, 0x0894, 0x0894, 0x08aa, 0x08aa, 0x08c0, 0x08d7, 0x08eb, + 0x0920, 0x0951, 0x0980, 0x0990, 0x0990, 0x099b, 0x09bd, 0x09d1, + 0x09dd, 0x09ec, 0x09f8, 0x0a06, 0x0a14, 0x0a2a, 0x0a34, 0x0a42, + 0x0a54, 0x0a54, 0x0a6a, 0x0a70, 0x0a8d, 0x0a8d, 0x0a8d, 0x0aa9, + 0x0adb, 0x0adf, 0x0af5, 0x0b0b, 0x0b1d, 0x0b31, 0x0b41, 0x0b6d, +} // Size: 360 bytes + +var urScriptStr string = "" + // Size: 492 bytes + "عربیآرمینیائیبنگالیبوپوموفوبریلسیریلکدیوناگریایتھوپیائیجارجیائییونانیگجر" + + "اتیگرمکھیہنگولہانآسان ہانروایتی ہانعبرانیہیراگیناجاپانیکٹاکاناخمیرکنڑکو" + + "ریائیلاؤلاطینیملیالممنگولیائیمیانماراڑیہسنہالاتملتیلگوتھاناتھائیتبتیعلا" + + "ماتغیر تحریر شدہعامنامعلوم رسم الخط" + +var urScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, 0x001a, 0x001a, + 0x001a, 0x001a, 0x001a, 0x001a, 0x0026, 0x0026, 0x0036, 0x0036, + 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, 0x003e, + 0x003e, 0x003e, 0x003e, 0x004a, 0x004a, 0x005a, 0x005a, 0x005a, + 0x005a, 0x005a, 0x005a, 0x005a, 0x006e, 0x006e, 0x007e, 0x007e, + 0x007e, 0x007e, 0x008a, 0x0096, 0x00a2, 0x00ac, 0x00b2, 0x00b2, + 0x00c1, 0x00d4, 0x00d4, 0x00e0, 0x00f0, 0x00f0, 0x00f0, 0x00f0, + 0x00f0, 0x00f0, 0x00f0, 0x00f0, 0x00fc, 0x00fc, 0x00fc, 0x010a, + // Entry 40 - 7F + 0x010a, 0x0112, 0x0112, 0x0118, 0x0126, 0x0126, 0x0126, 0x0126, + 0x012c, 0x012c, 0x012c, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, + 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, 0x0138, + 0x0138, 0x0138, 0x0138, 0x0144, 0x0144, 0x0156, 0x0156, 0x0156, + 0x0156, 0x0156, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, 0x0164, + 0x0164, 0x0164, 0x0164, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, + // Entry 80 - BF + 0x016c, 0x016c, 0x016c, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, + 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, 0x0178, 0x017e, + 0x017e, 0x017e, 0x0188, 0x0188, 0x0188, 0x0188, 0x0192, 0x019c, + 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01a4, + 0x01a4, 0x01a4, 0x01a4, 0x01a4, 0x01b0, 0x01c8, 0x01ce, 0x01ec, +} // Size: 360 bytes + +var uzScriptStr string = "" + // Size: 273 bytes + "arabarmanbengalbopomofoBraylkirilldevanagarhabashgruzingrekgujarotgurmuk" + + "xihangulxitoysoddalashgan xitoyan’anaviy xitoyibroniyhiraganayaponkataka" + + "naxmerkannadakoreyslaoslotinmalayalammo‘g‘ulmyanmaoriyasingaltamiltelugu" + + "taanataytibetbelgilaryozuvsizumumiynoma’lum yozuv" + +var uzScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0004, 0x0009, 0x0009, + 0x0009, 0x0009, 0x0009, 0x0009, 0x000f, 0x000f, 0x0017, 0x0017, + 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, + 0x001c, 0x001c, 0x001c, 0x0022, 0x0022, 0x002b, 0x002b, 0x002b, + 0x002b, 0x002b, 0x002b, 0x002b, 0x0031, 0x0031, 0x0037, 0x0037, + 0x0037, 0x0037, 0x003b, 0x0042, 0x004a, 0x0050, 0x0055, 0x0055, + 0x0067, 0x0078, 0x0078, 0x007f, 0x0087, 0x0087, 0x0087, 0x0087, + 0x0087, 0x0087, 0x0087, 0x0087, 0x008c, 0x008c, 0x008c, 0x0094, + // Entry 40 - 7F + 0x0094, 0x0098, 0x0098, 0x009f, 0x00a5, 0x00a5, 0x00a5, 0x00a5, + 0x00a9, 0x00a9, 0x00a9, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00ae, 0x00b7, 0x00b7, 0x00c2, 0x00c2, 0x00c2, + 0x00c2, 0x00c2, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, + 0x00c8, 0x00c8, 0x00c8, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, + 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, + 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, 0x00cd, + // Entry 80 - BF + 0x00cd, 0x00cd, 0x00cd, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, + 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d3, 0x00d8, + 0x00d8, 0x00d8, 0x00de, 0x00de, 0x00de, 0x00de, 0x00e3, 0x00e6, + 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00eb, + 0x00eb, 0x00eb, 0x00eb, 0x00eb, 0x00f3, 0x00fb, 0x0101, 0x0111, +} // Size: 360 bytes + +var viScriptStr string = "" + // Size: 2484 bytes + "Chữ AfakaChữ Ả RậpChữ Imperial AramaicChữ ArmeniaChữ AvestanChữ BaliChữ " + + "BamumChữ Bassa VahChữ BatakChữ BengaliChữ BlissymbolsChữ BopomofoChữ Bra" + + "hmiChữ nổi BrailleChữ BuginChữ BuhidChữ ChakmaÂm tiết Thổ dân Canada Hợp" + + " nhấtChữ CariaChữ ChămChữ CherokeeChữ CirthChữ CopticChứ SípChữ KirinChữ" + + " Kirin Slavơ Nhà thờ cổChữ DevanagariChữ DeseretChữ tốc ký DuployanChữ A" + + "i Cập bình dânChữ Ai Cập thày tuChữ tượng hình Ai CậpChữ EthiopiaChữ Khu" + + "tsuri GeorgiaChữ GruziaChữ GlagoliticChữ Gô-tíchChữ GranthaChữ Hy LạpChữ" + + " GujaratiChữ GurmukhiChữ HangulChữ HánChữ HanunooChữ Hán giản thểChữ Hán" + + " phồn thểChữ Do TháiChữ HiraganaChữ tượng hình AnatoliaChữ Pahawh HmongB" + + "ảng ký hiệu âm tiết Tiếng NhậtChữ Hungary cổChữ IndusChữ Italic cổChữ " + + "JavaChữ Nhật BảnChữ JurchenChữ Kayah LiChữ KatakanaChữ KharoshthiChữ Khơ" + + "-meChữ KhojkiChữ KannadaChữ Hàn QuốcChữ KpelleChữ KaithiChữ LannaChữ Lào" + + "Chữ La-tinh FrakturChữ La-tinh Xcốt-lenChữ La tinhChữ LepchaChữ LimbuChữ" + + " Linear AChữ Linear BChữ FraserChữ LomaChữ LyciaChữ LydiaChữ MandaeanChữ" + + " ManichaeanChữ tượng hình MayaChữ MendeChữ Meroitic Nét thảoChữ Meroitic" + + "Chữ MalayalamChữ Mông CổChữ nổi MoonChữ MroChữ Meitei MayekMyanmaChữ Bắc" + + " Ả Rập cổChữ NabataeanChữ Naxi GebaChữ N’KoChữ NüshuChữ OghamChữ Ol Chik" + + "iChữ OrkhonChữ OriyaChữ OsmanyaChữ PalmyreneChữ Permic cổChữ Phags-paChữ" + + " Pahlavi Văn biaChữ Pahlavi Thánh caChữ Pahlavi SáchChữ PhoeniciaNgữ âm " + + "PollardChữ Parthia Văn biaChữ RejangChữ RongorongoChữ RunicChữ Samaritan" + + "Chữ SaratiChữ Nam Ả Rập cổChữ SaurashtraChữ viết Ký hiệuChữ ShavianChữ S" + + "haradaChữ KhudawadiChữ SinhalaChữ Sora SompengChữ Xu-đăngChữ Syloti Nagr" + + "iChữ SyriaChữ Estrangelo SyriacChữ Tây SyriaChữ Đông SyriaChữ TagbanwaCh" + + "ữ TakriChữ Thái NaChữ Thái Lặc mớiChữ TamilChữ TangutChữ Thái ViệtChữ " + + "TeluguChữ TengwarChữ TifinaghChữ TagalogChữ ThaanaChữ TháiChữ Tây TạngCh" + + "ữ TirhutaChữ UgaritChữ VaiTiếng nói Nhìn thấy đượcChữ Varang KshitiChữ" + + " WoleaiChữ Ba Tư cổChữ hình nêm Sumero-AkkadianChữ DiChữ Kế thừaKý hiệu " + + "Toán họcKý hiệuChưa có chữ viếtChungChữ viết không xác định" + +var viScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x000b, 0x000b, 0x000b, 0x001a, 0x0030, 0x003d, 0x004a, + 0x0054, 0x005f, 0x006e, 0x0079, 0x0086, 0x0097, 0x00a5, 0x00b1, + 0x00c4, 0x00cf, 0x00da, 0x00e6, 0x010f, 0x011a, 0x0125, 0x0133, + 0x013e, 0x014a, 0x0154, 0x015f, 0x0181, 0x0191, 0x019e, 0x01b6, + 0x01cf, 0x01e6, 0x0203, 0x0203, 0x0211, 0x0227, 0x0233, 0x0243, + 0x0252, 0x025f, 0x026d, 0x027b, 0x0289, 0x0295, 0x029f, 0x02ac, + 0x02c3, 0x02da, 0x02da, 0x02e8, 0x02f6, 0x0313, 0x0325, 0x0350, + 0x0362, 0x036d, 0x037e, 0x0388, 0x039a, 0x03a7, 0x03b5, 0x03c3, + // Entry 40 - 7F + 0x03d3, 0x03e0, 0x03ec, 0x03f9, 0x040a, 0x0416, 0x0422, 0x042d, + 0x0437, 0x044c, 0x0464, 0x0471, 0x047d, 0x0488, 0x0496, 0x04a4, + 0x04b0, 0x04ba, 0x04c5, 0x04d0, 0x04d0, 0x04de, 0x04ee, 0x0507, + 0x0512, 0x052c, 0x053a, 0x0549, 0x0549, 0x0559, 0x0569, 0x0572, + 0x0584, 0x0584, 0x058a, 0x05a4, 0x05b3, 0x05c2, 0x05ce, 0x05da, + 0x05e5, 0x05f3, 0x05ff, 0x060a, 0x0617, 0x0626, 0x0626, 0x0637, + 0x0645, 0x065b, 0x0672, 0x0685, 0x0694, 0x06a5, 0x06bb, 0x06c7, + 0x06d7, 0x06e2, 0x06f1, 0x06fd, 0x0715, 0x0725, 0x073c, 0x0749, + // Entry 80 - BF + 0x0756, 0x0756, 0x0765, 0x0772, 0x0784, 0x0793, 0x07a5, 0x07b0, + 0x07c7, 0x07d7, 0x07e9, 0x07f7, 0x0802, 0x0810, 0x0827, 0x0832, + 0x083e, 0x0850, 0x085c, 0x0869, 0x0877, 0x0884, 0x0890, 0x089b, + 0x08ac, 0x08b9, 0x08c5, 0x08ce, 0x08f0, 0x0903, 0x090f, 0x0920, + 0x0940, 0x0948, 0x0959, 0x096f, 0x0979, 0x098f, 0x0994, 0x09b4, +} // Size: 360 bytes + +var zhScriptStr string = "" + // Size: 2184 bytes + "阿法卡文阿拉伯文皇室亚拉姆文亚美尼亚文阿维斯陀文巴厘文巴姆穆文巴萨文巴塔克文孟加拉文布列斯符号汉语拼音婆罗米文字布莱叶盲文布吉文布希德文查克马文" + + "加拿大土著统一音节卡里亚文占文切罗基文色斯文克普特文塞浦路斯文西里尔文西里尔文字(古教会斯拉夫文的变体)天城文德塞莱特文杜普洛伊速记后期埃及" + + "文古埃及僧侣书写体古埃及象形文埃塞俄比亚文格鲁吉亚文(教堂体)格鲁吉亚文格拉哥里文哥特文格兰塔文希腊文古吉拉特文果鲁穆奇文韩文字汉字汉奴罗文" + + "简体中文繁体中文希伯来文平假名安那托利亚象形文字杨松录苗文片假名或平假名古匈牙利文古希腊哈拉潘古意大利文爪哇文日文女真文克耶李文字片假名卡罗" + + "须提文高棉文克吉奇文字卡纳达文韩文克佩列文凯提文兰拿文老挝文拉丁文(哥特式字体变体)拉丁文(盖尔文变体)拉丁文雷布查文林布文线形文字(A)线" + + "形文字(B)傈僳文洛马文利西亚文吕底亚文阿拉米文摩尼教文玛雅圣符文门迪文麦罗埃草书麦若提克文马拉雅拉姆文蒙古文韩文语系谬文曼尼普尔文缅甸文古" + + "北方阿拉伯文纳巴泰文纳西格巴文西非书面文字(N’Ko)女书欧甘文桑塔利文鄂尔浑文奥里亚文奥斯曼亚文帕尔迈拉文古彼尔姆文八思巴文巴列维文碑铭体" + + "巴列维文(圣诗体)巴列维文(书体)腓尼基文波拉德音标文字帕提亚文碑铭体拉让文朗格朗格文古代北欧文撒马利亚文沙拉堤文古南阿拉伯文索拉什特拉文书" + + "写符号萧伯纳式文夏拉达文信德文僧伽罗文索朗桑朋文巽他文锡尔赫特文叙利亚文福音体叙利亚文西叙利亚文东叙利亚文塔格班瓦文泰克里文泰乐文新傣文泰米" + + "尔文唐古特文越南傣文泰卢固文腾格瓦文字提非纳文塔加路文塔安那文泰文藏文迈蒂利文乌加里特文瓦依文可见语言瓦郎奇蒂文字沃莱艾文古波斯文苏美尔-阿" + + "卡德楔形文字彝文遗传学术语数学符号符号非书面文字通用未知文字" + +var zhScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x000c, 0x000c, 0x000c, 0x0018, 0x002a, 0x0039, 0x0048, + 0x0051, 0x005d, 0x0066, 0x0072, 0x007e, 0x008d, 0x0099, 0x00a8, + 0x00b7, 0x00c0, 0x00cc, 0x00d8, 0x00f3, 0x00ff, 0x0105, 0x0111, + 0x011a, 0x0126, 0x0135, 0x0141, 0x0174, 0x017d, 0x018c, 0x019e, + 0x01ad, 0x01c5, 0x01d7, 0x01d7, 0x01e9, 0x0207, 0x0216, 0x0225, + 0x022e, 0x023a, 0x0243, 0x0252, 0x0261, 0x026a, 0x0270, 0x027c, + 0x0288, 0x0294, 0x0294, 0x02a0, 0x02a9, 0x02c4, 0x02d3, 0x02e8, + 0x02f7, 0x0309, 0x0318, 0x0321, 0x0327, 0x0330, 0x033f, 0x0348, + // Entry 40 - 7F + 0x0357, 0x0360, 0x036f, 0x037b, 0x0381, 0x038d, 0x0396, 0x039f, + 0x03a8, 0x03cc, 0x03ea, 0x03f3, 0x03ff, 0x0408, 0x041b, 0x042e, + 0x0437, 0x0440, 0x044c, 0x0458, 0x0458, 0x0464, 0x0470, 0x047f, + 0x0488, 0x0497, 0x04a6, 0x04b8, 0x04b8, 0x04c1, 0x04cd, 0x04d3, + 0x04e2, 0x04e2, 0x04eb, 0x0500, 0x050c, 0x051b, 0x0539, 0x053f, + 0x0548, 0x0554, 0x0560, 0x056c, 0x057b, 0x058a, 0x058a, 0x0599, + 0x05a5, 0x05ba, 0x05d5, 0x05ed, 0x05f9, 0x060e, 0x0623, 0x062c, + 0x063b, 0x064a, 0x0659, 0x0665, 0x0677, 0x0689, 0x0695, 0x06a4, + // Entry 80 - BF + 0x06b0, 0x06b0, 0x06b9, 0x06c5, 0x06d4, 0x06dd, 0x06ec, 0x06f8, + 0x070d, 0x071c, 0x072b, 0x073a, 0x0746, 0x074f, 0x0758, 0x0764, + 0x0770, 0x077c, 0x0788, 0x0797, 0x07a3, 0x07af, 0x07bb, 0x07c1, + 0x07c7, 0x07d3, 0x07e2, 0x07eb, 0x07f7, 0x0809, 0x0815, 0x0821, + 0x0840, 0x0846, 0x0855, 0x0861, 0x0867, 0x0876, 0x087c, 0x0888, +} // Size: 360 bytes + +var zhHantScriptStr string = "" + // Size: 2409 bytes + "阿法卡文字高加索阿爾巴尼亞文阿拉伯文皇室亞美尼亞文亞美尼亞文阿維斯陀文峇里文巴姆穆文巴薩文巴塔克文孟加拉文布列斯文注音符號婆羅米文盲人用點字布吉" + + "斯文布希德文查克馬文加拿大原住民通用字符卡里亞文占文柴羅基文色斯文科普特文塞浦路斯文斯拉夫文西里爾文(古教會斯拉夫文變體)天城文德瑟雷特文杜" + + "普洛伊速記古埃及世俗體古埃及僧侶體古埃及象形文字愛爾巴桑文衣索比亞文喬治亞語系(阿索他路里和努斯克胡里文)喬治亞文格拉哥里文歌德文格蘭他文字" + + "希臘文古吉拉特文古魯穆奇文韓文字漢語哈努諾文簡體中文繁體中文希伯來文平假名安那托利亞象形文字楊松錄苗文片假名或平假名古匈牙利文印度河流域(哈" + + "拉帕文)古意大利文爪哇文日文女真文字克耶李文片假名卡羅須提文高棉文克吉奇文字坎那達文韓文克培列文凱提文藍拿文寮國文拉丁文(尖角體活字變體)拉" + + "丁文(蓋爾語變體)拉丁文雷布查文林佈文線性文字(A)線性文字(B)栗僳文洛馬文呂西亞語里底亞語曼底安文摩尼教文瑪雅象形文字門德文麥羅埃文(曲" + + "線字體)麥羅埃文馬來亞拉姆文蒙古文蒙氏點字謬文曼尼普爾文緬甸文古北阿拉伯文納巴泰文字納西格巴文西非書面語言 (N’Ko)女書文字歐甘文桑塔利" + + "文鄂爾渾文歐利亞文歐斯曼亞文帕米瑞拉文字古彼爾姆諸文八思巴文巴列維文(碑銘體)巴列維文(聖詩體)巴列維文(書體)腓尼基文柏格理拼音符帕提亞文" + + "(碑銘體)拉讓文朗格朗格象形文古北歐文字撒馬利亞文沙拉堤文古南阿拉伯文索拉什特拉文手語書寫符號簫柏納字符夏拉達文悉曇文字信德文錫蘭文索朗桑朋" + + "文字巽他文希洛弟納格里文敍利亞文敘利亞文(福音體文字變體)敘利亞文(西方文字變體)敘利亞文(東方文字變體)南島文塔卡里文字傣哪文西雙版納新傣" + + "文坦米爾文西夏文傣擔文泰盧固文談格瓦文提非納文塔加拉文塔安那文泰文西藏文邁蒂利文烏加列文瓦依文視覺語音文字瓦郎奇蒂文字沃雷艾文古波斯文蘇米魯" + + "亞甲文楔形文字彞文繼承文字(Unicode)數學符號符號非書寫語言一般文字未知文字" + +var zhHantScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x000f, 0x002a, 0x002a, 0x0036, 0x004b, 0x005a, 0x0069, + 0x0072, 0x007e, 0x0087, 0x0093, 0x009f, 0x00ab, 0x00b7, 0x00c3, + 0x00d2, 0x00de, 0x00ea, 0x00f6, 0x0114, 0x0120, 0x0126, 0x0132, + 0x013b, 0x0147, 0x0156, 0x0162, 0x018f, 0x0198, 0x01a7, 0x01b9, + 0x01cb, 0x01dd, 0x01f2, 0x0201, 0x0210, 0x0249, 0x0255, 0x0264, + 0x026d, 0x027c, 0x0285, 0x0294, 0x02a3, 0x02ac, 0x02b2, 0x02be, + 0x02ca, 0x02d6, 0x02d6, 0x02e2, 0x02eb, 0x0306, 0x0315, 0x032a, + 0x0339, 0x035a, 0x0369, 0x0372, 0x0378, 0x0384, 0x0390, 0x0399, + // Entry 40 - 7F + 0x03a8, 0x03b1, 0x03c0, 0x03cc, 0x03d2, 0x03de, 0x03e7, 0x03f0, + 0x03f9, 0x041d, 0x043b, 0x0444, 0x0450, 0x0459, 0x046c, 0x047f, + 0x0488, 0x0491, 0x049d, 0x04a9, 0x04a9, 0x04b5, 0x04c1, 0x04d3, + 0x04dc, 0x04fa, 0x0506, 0x0518, 0x0518, 0x0521, 0x052d, 0x0533, + 0x0542, 0x0542, 0x054b, 0x055d, 0x056c, 0x057b, 0x0596, 0x05a2, + 0x05ab, 0x05b7, 0x05c3, 0x05cf, 0x05de, 0x05f0, 0x05f0, 0x0602, + 0x060e, 0x0629, 0x0644, 0x065c, 0x0668, 0x067a, 0x0695, 0x069e, + 0x06b3, 0x06c2, 0x06d1, 0x06dd, 0x06ef, 0x0701, 0x0713, 0x0722, + // Entry 80 - BF + 0x072e, 0x073a, 0x0743, 0x074c, 0x075e, 0x0767, 0x077c, 0x0788, + 0x07af, 0x07d3, 0x07f7, 0x0800, 0x080f, 0x0818, 0x082d, 0x0839, + 0x0842, 0x084b, 0x0857, 0x0863, 0x086f, 0x087b, 0x0887, 0x088d, + 0x0896, 0x08a2, 0x08ae, 0x08b7, 0x08c9, 0x08db, 0x08e7, 0x08f3, + 0x0911, 0x0917, 0x0930, 0x093c, 0x0942, 0x0951, 0x095d, 0x0969, +} // Size: 360 bytes + +var zuScriptStr string = "" + // Size: 371 bytes + "i-Arabi-Armeniani-Bengalii-Bopomofoi-Braillei-Cyrillici-Devanagarii-Ethi" + + "opici-Georgiani-Greeki-Gujaratii-Gurmukhii-Hanguli-Hani-Simplified Hani-" + + "Traditional Hani-Hebrewi-Hiraganai-Japanesei-Katakanai-Khmeri-Kannadai-K" + + "oreani-Laoi-Latini-Malayami-Mongoliani-Myanmari-Oriyai-Sinhalai-Tamili-T" + + "elegui-Thaanai-Thaii-Tibetanamasimbuliokungabhaliweejwayelekileiskripthi" + + " esingaziwa" + +var zuScriptIdx = []uint16{ // 168 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x0010, 0x0010, + 0x0010, 0x0010, 0x0010, 0x0010, 0x0019, 0x0019, 0x0023, 0x0023, + 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, + 0x002c, 0x002c, 0x002c, 0x0036, 0x0036, 0x0042, 0x0042, 0x0042, + 0x0042, 0x0042, 0x0042, 0x0042, 0x004c, 0x004c, 0x0056, 0x0056, + 0x0056, 0x0056, 0x005d, 0x0067, 0x0071, 0x0079, 0x007e, 0x007e, + 0x008e, 0x009f, 0x009f, 0x00a7, 0x00b1, 0x00b1, 0x00b1, 0x00b1, + 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00bb, 0x00bb, 0x00bb, 0x00c5, + // Entry 40 - 7F + 0x00c5, 0x00cc, 0x00cc, 0x00d5, 0x00dd, 0x00dd, 0x00dd, 0x00dd, + 0x00e2, 0x00e2, 0x00e2, 0x00e9, 0x00e9, 0x00e9, 0x00e9, 0x00e9, + 0x00e9, 0x00e9, 0x00e9, 0x00e9, 0x00e9, 0x00e9, 0x00e9, 0x00e9, + 0x00e9, 0x00e9, 0x00e9, 0x00f2, 0x00f2, 0x00fd, 0x00fd, 0x00fd, + 0x00fd, 0x00fd, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, 0x0106, + 0x0106, 0x0106, 0x0106, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, + 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, + 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, 0x010d, + // Entry 80 - BF + 0x010d, 0x010d, 0x010d, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, + 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x0116, 0x011d, + 0x011d, 0x011d, 0x0125, 0x0125, 0x0125, 0x0125, 0x012d, 0x0133, + 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, 0x013c, + 0x013c, 0x013c, 0x013c, 0x013c, 0x0146, 0x0153, 0x015f, 0x0173, +} // Size: 360 bytes + +// Total size for script: 230112 bytes (230 KB) + +// Number of keys: 290 +var ( + regionIndex = tagIndex{ + "ACADAEAFAGAIALAMANAOAQARASATAUAWAXAZBABBBDBEBFBGBHBIBJBLBMBNBOBQBRBSBTBV" + + "BWBYBZCACCCDCFCGCHCICKCLCMCNCOCPCRCUCVCWCXCYCZDEDGDJDKDMDODZEAECEEEG" + + "EHERESETEUFIFJFKFMFOFRGAGBGDGEGFGGGHGIGLGMGNGPGQGRGSGTGUGWGYHKHMHNHR" + + "HTHUICIDIEILIMINIOIQIRISITJEJMJOJPKEKGKHKIKMKNKPKRKWKYKZLALBLCLILKLR" + + "LSLTLULVLYMAMCMDMEMFMGMHMKMLMMMNMOMPMQMRMSMTMUMVMWMXMYMZNANCNENFNGNI" + + "NLNONPNRNUNZOMPAPEPFPGPHPKPLPMPNPRPSPTPWPYQAQORERORSRURWSASBSCSDSESG" + + "SHSISJSKSLSMSNSOSRSSSTSVSXSYSZTATCTDTFTGTHTJTKTLTMTNTOTRTTTVTWTZUAUG" + + "UMUSUYUZVAVCVEVGVIVNVUWFWSXKYEYTZAZMZWZZ", + "001002003005009011013014015017018019021029030034035039053054057061142143" + + "145150151154155419", + "", + } +) + +var regionHeaders = [218]header{ + { // af + afRegionStr, + afRegionIdx, + }, + { // agq + "ÀndolàYùnaetɛ Alab ɛmelɛ̀Àfɨ̀ganìsɨ̀tânÀntigwà à BàbudàÀŋgwilàÀabɛnìaÀmɛ" + + "nyìaNedàlân AntàeÀŋgolàÀdzɛ̀ntinàÀmɛlekan SamwàUsɨtɨ̀làÙsɨ̀tɛ̀lɛlìaÀ" + + "lubàÀzɨbɛ̀dzânBosɨnyìa à Hɛ̀zɛ̀gòvinàBàbadòsBaŋgɨ̀làdɛ̂BɛɛdzwùmBùkin" + + "à FasòBùugɛlìaBàlaenBùlundìBɛ̀nɨ̂ŋBɛ̀mudàBɨ̀lunèBòlevàBɨ̀làzîiBàham" + + "àsMbutànBòtɨ̀swǎnàBɛlàlûsBɛ̀lezɨ̀KanadàDɛ̀mùkàlatì Lèkpubèlè è Kuŋg" + + "ùSɛnta Afɨlekan LèkpobèlèKuŋgùSuezàlânKu Dɨ̀vûaChwɨla ŋ̀ KûʔChilèKà" + + "màlûŋChaenàKòlombìaKòsɨ̀tà LekàKuuwbàChwɨla ŋ̀ Kɛ̀b Vɛ̂ɛSaekpùlùChɛ̂" + + " LèkpubèlèDzamanèDzìbuwtìDɛnɨmàDòmenekàDòmenekà LèkpubèlèÀadzɛlìaEkw" + + "adòÈsɨ̀tonyìaEdzìÈletɨ̀làSɨ̀kpɛ̂nÈtyǒpìaFɨnlànFidziChwɨlà fɨ Fakɨlàn" + + "MaekòlòneshìaFàlâŋnsìGàbûnYùnaetɛ Kiŋdɔ̀mGɨ̀lɛnadàDzɔɔdzìaGàyanà è F" + + "àlâŋnsìGaanàDzibɨ̀latàGɨ̀lenlânGambìaGinèGwadalukpɛ̀Èkwɛ̀tolia Ginè" + + "Gɨ̀lêsGwàtɨ̀malàGwamGinè BìsawùGùyanàHɔndulàsKòwɛshìaHǎetìHɔŋgàlèÈnd" + + "òneshìaAelɨ̀lânEzɨ̀lɛ̂EndìaDɨŋò kɨ dzughùnstòʔ kɨ Endìa kɨ Bɨ̀letì " + + "kòÈlâkɨ̀ÈlânAesɨ̀lânEtalèDzàmɛkàDzodànDzàkpânKɨnyàKìdzisɨ̀tânKàmbodì" + + "aKèlèbatiKomolòsSɛ̀n Kî à NevìKùulîa, EkùwKùulîa, EmàmKùwɛ̂Chwɨlà ŋ̀" + + " KaemànKàzasɨ̀tânLàwosLɛbanèSɛ̀n LushìaLetɨnshɨ̀nSɨ̀le LaŋkàLàebɛlìa" + + "Lɛ̀sotùLètwǎnyìaLuzɨmbùʔLàtɨvaLebìaMòlokòMùnakuMòodovàMàdàgasɨkàChwɨ" + + "là fɨ MashàMɨ̀sɨ̀donyìaMalèMǐanmàMùŋgolìaChwɨlà m̀ Màlǐanà mɨ̀ Ekùw " + + "mòMàtìnekìMùlètanyìaMùŋtselàMaatàMùleshwɨ̀sMàdivèMàlawìMɛkɨzikùMàlɛs" + + "hìaMùzàmbîNàmibìaKàlèdonyìa È fūghūNaedzàChwɨlà fɨ NufòʔGɨ̀anyɨNikàl" + + "agwàNedàlânNoowɛ̂ɛNɛkpâaNàwulùNiyuZìlân È fūghūUmànKpanàmaKpɛlûKpole" + + "neshìa è FàlâŋnsìKpakpua Ginè È fūghūFelèkpîKpakìsɨ̀tânKpulànSɛ̀n Kp" + + "iyɛ̀ à MikelɔŋKpitɨ̀kalèKpǒto LekoAdzɨmā kɨ ŋgùŋ kɨ Palɛsɨtɨnyia à k" + + "ɨ Gazà kòKputuwgàKpàlawùKpalàgwɛ̂KatàLèyunyɔ̀ŋLùmanyìaLoshìaLùwandà" + + "Sawudi AlabiChwɨlà fɨ Solomwɨ̀nSɛchɛ̀lɛ̀sSùdânSuedɨ̀nSiŋgàkpôoSɛ̀n È" + + "lenàSɨ̀lòvɨnyìaSɨ̀lòvɨkɨ̀aSilìa lûŋSàn MàlenùSɛ̀nɛ̀gâaSòmalìaSulènam" + + "èSawo Tɔ̀me à Kpèlènsikpɛ̀EsàvadòSilîaShǔazìlânChwɨla n Tɨtê à Kaek" + + "ùsChâTugùTaelànTàdzikìsɨ̀tânTuwkelawùÊs TaemòTekɨmènèsɨ̀tânTùneshìa" + + "TuŋgàTeekìTèlenedà à TòbagùTuwvalùwTaewànTàanzanyìaYùkɛ̀lɛ̂YùgandàUS" + + "AYulùgwɛ̂Yùzɨ̀bɛkìsɨ̀tânVatikàn Sɨ̀tɛ̂Sɛ̀n Vinsɨ̀n à Gɨlenadi Ù tēVɛ" + + "̀nɛ̀zǔɛɛlàChwɨlà m̀ Vidzinyìa m̀ Bɨ̀letì mòU. S. Chwɨlà fɨ MbuʔmbuV" + + "ìyɛnàmVànǔatùwWales à FùwtuwnàSàmowàYɛmɛ̀nMàyotìAfɨlekà ghɨ Emàm gh" + + "òZambìaZìmbagbɛ̀", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0008, 0x0020, 0x0035, 0x004a, 0x0054, 0x005e, + 0x0068, 0x0078, 0x0081, 0x0081, 0x008f, 0x00a0, 0x00ac, 0x00bf, + 0x00c6, 0x00c6, 0x00d5, 0x00f5, 0x00fe, 0x010f, 0x011a, 0x0128, + 0x0133, 0x013a, 0x0143, 0x014f, 0x014f, 0x0159, 0x0163, 0x016b, + 0x016b, 0x0177, 0x0180, 0x0187, 0x0187, 0x0196, 0x01a0, 0x01ac, + 0x01b3, 0x01b3, 0x01db, 0x01f8, 0x01ff, 0x0209, 0x0215, 0x0227, + 0x022d, 0x0238, 0x023f, 0x0249, 0x0249, 0x025a, 0x0261, 0x027c, + 0x027c, 0x027c, 0x0286, 0x0299, 0x02a1, 0x02a1, 0x02ab, 0x02b4, + // Entry 40 - 7F + 0x02be, 0x02d5, 0x02e0, 0x02e0, 0x02e7, 0x02f5, 0x02fa, 0x02fa, + 0x0306, 0x0312, 0x031c, 0x031c, 0x0324, 0x0329, 0x033f, 0x034f, + 0x034f, 0x035b, 0x0362, 0x0376, 0x0383, 0x038e, 0x03a6, 0x03a6, + 0x03ac, 0x03b9, 0x03c5, 0x03cc, 0x03d1, 0x03de, 0x03f1, 0x03fa, + 0x03fa, 0x0408, 0x040c, 0x041a, 0x0422, 0x0422, 0x0422, 0x042c, + 0x0437, 0x043e, 0x0449, 0x0449, 0x0456, 0x0461, 0x046c, 0x046c, + 0x0472, 0x04aa, 0x04b4, 0x04ba, 0x04c5, 0x04cb, 0x04cb, 0x04d5, + 0x04dc, 0x04e5, 0x04ec, 0x04fb, 0x0505, 0x050f, 0x0517, 0x052a, + // Entry 80 - BF + 0x0539, 0x0548, 0x0550, 0x0565, 0x0573, 0x0579, 0x0581, 0x058f, + 0x059c, 0x05ab, 0x05b6, 0x05c0, 0x05cc, 0x05d7, 0x05df, 0x05e5, + 0x05ed, 0x05f4, 0x05fd, 0x05fd, 0x05fd, 0x060b, 0x061e, 0x062f, + 0x0634, 0x063c, 0x0647, 0x0647, 0x066e, 0x0679, 0x0686, 0x0691, + 0x0697, 0x06a4, 0x06ac, 0x06b4, 0x06bf, 0x06ca, 0x06d4, 0x06dd, + 0x06f5, 0x06fc, 0x0710, 0x071a, 0x0725, 0x072e, 0x0738, 0x0740, + 0x0748, 0x074c, 0x075e, 0x0763, 0x076b, 0x0772, 0x078e, 0x07a6, + 0x07af, 0x07be, 0x07c5, 0x07e1, 0x07ee, 0x07f9, 0x0832, 0x083b, + // Entry C0 - FF + 0x0844, 0x0850, 0x0855, 0x0855, 0x0862, 0x086c, 0x086c, 0x0873, + 0x087c, 0x0888, 0x08a0, 0x08af, 0x08b6, 0x08bf, 0x08cb, 0x08d9, + 0x08e9, 0x08e9, 0x08fa, 0x0906, 0x0913, 0x0921, 0x092a, 0x0934, + 0x0934, 0x0954, 0x095d, 0x095d, 0x0963, 0x096f, 0x096f, 0x098a, + 0x098e, 0x098e, 0x0993, 0x099a, 0x09ac, 0x09b6, 0x09c0, 0x09d4, + 0x09de, 0x09e5, 0x09eb, 0x0a01, 0x0a0a, 0x0a11, 0x0a1d, 0x0a2a, + 0x0a33, 0x0a33, 0x0a36, 0x0a41, 0x0a58, 0x0a6b, 0x0a8f, 0x0aa3, + 0x0acd, 0x0ae8, 0x0af2, 0x0afd, 0x0b10, 0x0b18, 0x0b18, 0x0b21, + // Entry 100 - 13F + 0x0b29, 0x0b42, 0x0b49, 0x0b55, + }, + }, + { // ak + "AndoraUnited Arab EmiratesAfganistanAntigua ne BaabudaAnguilaAlbeniaAame" + + "niaNɛdɛland AntelezAngolaAgyɛntinaAmɛrika SamoaƆstriaƆstreliaArubaAz" + + "ebaegyanBosnia ne HɛzegovinaBaabadosBangladɛhyeBɛlgyiumBɔkina FasoBɔ" + + "lgeriaBarenBurundiBɛninBɛmudaBrunaeBoliviaBrazilBahamaButanBɔtswanaB" + + "ɛlarusBelizKanadaKongo (Zair)Afrika Finimfin ManKongoSwetzalandLa C" + + "ôte d’IvoireKook NsupɔwKyiliKamɛrunKyaenaKolombiaKɔsta RikaKubaKepv" + + "ɛdfo IslandsSaeprɔsKyɛk KurokɛseGyaamanGyibutiDɛnmakDɔmenekaDɔmenek" + + "a KurokɛseƆlgyeriaIkuwadɔƐstoniaNisrimƐritreaSpainIthiopiaFinlandFig" + + "yiFɔlkman AelandMaekronehyiaFrɛnkyemanGabɔnAhendiman NkabomGrenadaGy" + + "ɔgyeaFrɛnkye GayanaGaanaGyebraltaGreenmanGambiaGiniGuwadelupGini Ik" + + "uwetaGreekmanGuwatemalaGuamGini BisawGayanaHɔndurasKrowehyiaHeitiHan" + + "gariIndɔnehyiaAerelandIsraelIndiaBritenfo Hɔn Man Wɔ India Po No MuI" + + "rakIranAeslandItaliGyamekaGyɔdanGyapanKɛnyaKɛɛgestanKambodiaKiribati" + + "KɔmɔrɔsSaint Kitts ne NɛvesEtifi KoriaAnaafo KoriaKuweteKemanfo Isla" + + "ndsKazakstanLaosLɛbanɔnSaint LuciaLektenstaenSri LankaLaeberiaLɛsutu" + + "LituweniaLaksembɛgLatviaLibyaMorokoMɔnakoMɔldovaMadagaskaMarshall Is" + + "landsMasedoniaMaliMiyanmaMɔngoliaNorthern Mariana IslandsMatinikMɔre" + + "teniaMantseratMɔltaMɔrehyeɔsMaldivesMalawiMɛksikoMalehyiaMozambikNam" + + "ibiaKaledonia FoforoNigyɛNɔfolk AelandNaegyeriaNekaraguwaNɛdɛlandNɔɔ" + + "weNɛpɔlNaworuNiyuZiland FoforoOmanPanamaPeruFrɛnkye PɔlenehyiaPapua " + + "Guinea FoforoPhilippinesPakistanPolandSaint Pierre ne MiquelonPitcai" + + "rnPuɛto RikoPalestaen West Bank ne GazaPɔtugalPalauParaguayKataReyun" + + "iɔnRomeniaRɔhyeaRwandaSaudi ArabiaSolomon IslandsSeyhyɛlSudanSwedenS" + + "ingapɔSaint HelenaSloviniaSlovakiaSierra LeoneSan MarinoSenegalSomal" + + "iaSurinameSão Tomé and PríncipeƐl SalvadɔSiriaSwazilandTurks ne Caic" + + "os IslandsKyadTogoTaelandTajikistanTokelauTimɔ BokaTɛkmɛnistanTunihy" + + "iaTongaTɛɛkiTrinidad ne TobagoTuvaluTaiwanTanzaniaUkrenUgandaAmɛrika" + + "YurugwaeUzbɛkistanVatican ManSaint Vincent ne GrenadinesVenezuelaBri" + + "tainfo Virgin IslandsAmɛrika Virgin IslandsViɛtnamVanuatuWallis ne F" + + "utunaSamoaYɛmenMayɔteAfrika AnaafoZambiaZembabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x001a, 0x0024, 0x0036, 0x003d, 0x0044, + 0x004b, 0x005d, 0x0063, 0x0063, 0x006d, 0x007b, 0x0082, 0x008b, + 0x0090, 0x0090, 0x009a, 0x00af, 0x00b7, 0x00c3, 0x00cc, 0x00d8, + 0x00e1, 0x00e6, 0x00ed, 0x00f3, 0x00f3, 0x00fa, 0x0100, 0x0107, + 0x0107, 0x010d, 0x0113, 0x0118, 0x0118, 0x0121, 0x0129, 0x012e, + 0x0134, 0x0134, 0x0140, 0x0153, 0x0158, 0x0162, 0x0175, 0x0181, + 0x0186, 0x018e, 0x0194, 0x019c, 0x019c, 0x01a7, 0x01ab, 0x01bc, + 0x01bc, 0x01bc, 0x01c4, 0x01d3, 0x01da, 0x01da, 0x01e1, 0x01e8, + // Entry 40 - 7F + 0x01f1, 0x0204, 0x020d, 0x020d, 0x0215, 0x021d, 0x0223, 0x0223, + 0x022b, 0x0230, 0x0238, 0x0238, 0x023f, 0x0244, 0x0253, 0x025f, + 0x025f, 0x026a, 0x0270, 0x0280, 0x0287, 0x028f, 0x029e, 0x029e, + 0x02a3, 0x02ac, 0x02b4, 0x02ba, 0x02be, 0x02c7, 0x02d3, 0x02db, + 0x02db, 0x02e5, 0x02e9, 0x02f3, 0x02f9, 0x02f9, 0x02f9, 0x0302, + 0x030b, 0x0310, 0x0317, 0x0317, 0x0322, 0x032a, 0x0330, 0x0330, + 0x0335, 0x0359, 0x035d, 0x0361, 0x0368, 0x036d, 0x036d, 0x0374, + 0x037b, 0x0381, 0x0387, 0x0392, 0x039a, 0x03a2, 0x03ac, 0x03c1, + // Entry 80 - BF + 0x03cc, 0x03d8, 0x03de, 0x03ed, 0x03f6, 0x03fa, 0x0403, 0x040e, + 0x0419, 0x0422, 0x042a, 0x0431, 0x043a, 0x0444, 0x044a, 0x044f, + 0x0455, 0x045c, 0x0464, 0x0464, 0x0464, 0x046d, 0x047d, 0x0486, + 0x048a, 0x0491, 0x049a, 0x049a, 0x04b2, 0x04b9, 0x04c3, 0x04cc, + 0x04d2, 0x04dd, 0x04e5, 0x04eb, 0x04f3, 0x04fb, 0x0503, 0x050a, + 0x051a, 0x0520, 0x052e, 0x0537, 0x0541, 0x054b, 0x0552, 0x0559, + 0x055f, 0x0563, 0x0570, 0x0574, 0x057a, 0x057e, 0x0592, 0x05a5, + 0x05b0, 0x05b8, 0x05be, 0x05d6, 0x05de, 0x05e9, 0x0604, 0x060c, + // Entry C0 - FF + 0x0611, 0x0619, 0x061d, 0x061d, 0x0626, 0x062d, 0x062d, 0x0634, + 0x063a, 0x0646, 0x0655, 0x065d, 0x0662, 0x0668, 0x0670, 0x067c, + 0x0684, 0x0684, 0x068c, 0x0698, 0x06a2, 0x06a9, 0x06b0, 0x06b8, + 0x06b8, 0x06d0, 0x06dc, 0x06dc, 0x06e1, 0x06ea, 0x06ea, 0x0701, + 0x0705, 0x0705, 0x0709, 0x0710, 0x071a, 0x0721, 0x072b, 0x0738, + 0x0740, 0x0745, 0x074c, 0x075e, 0x0764, 0x076a, 0x0772, 0x0777, + 0x077d, 0x077d, 0x0785, 0x078d, 0x0798, 0x07a3, 0x07be, 0x07c7, + 0x07df, 0x07f6, 0x07fe, 0x0805, 0x0815, 0x081a, 0x081a, 0x0820, + // Entry 100 - 13F + 0x0827, 0x0834, 0x083a, 0x0842, + }, + }, + { // am + amRegionStr, + amRegionIdx, + }, + { // ar + arRegionStr, + arRegionIdx, + }, + {}, // ar-EG + { // as + "এন্টাৰ্টিকাব্ৰাজিলবভেট দ্বীপচীনজাৰ্মানিফ্ৰান্সসংযুক্ত ৰাজ্যদক্ষিণ জৰ্জিয" + + "়া আৰু দক্ষিণ চেণ্ডৱিচ্\u200c দ্বীপহাৰ্ড দ্বীপ আৰু মেক্\u200cডোনাল" + + "্ড দ্বীপভাৰতব্ৰিটিশ্ব ইণ্ডিয়ান মহাসাগৰৰ অঞ্চলইটালিজাপানৰুচদক্ষিণ " + + "ফ্ৰান্সৰ অঞ্চলযুক্তৰাষ্ট্ৰঅজ্ঞাত বা অবৈধ অঞ্চল", + []uint16{ // 261 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, + 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, + 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, 0x0021, + 0x0021, 0x0036, 0x0036, 0x0036, 0x0052, 0x0052, 0x0052, 0x0052, + 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, 0x0052, + 0x0052, 0x0052, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, + 0x005b, 0x005b, 0x005b, 0x005b, 0x0073, 0x0073, 0x0073, 0x0073, + // Entry 40 - 7F + 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, + 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, + 0x0073, 0x0088, 0x0088, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, + 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, + 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0124, 0x0182, 0x0182, + 0x0182, 0x0182, 0x0182, 0x0182, 0x0182, 0x0182, 0x0182, 0x0182, + 0x018e, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01fd, 0x01fd, 0x01fd, + 0x01fd, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, + // Entry 80 - BF + 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, + 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, + 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, + 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, + 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, + 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, + 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, + 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, + // Entry C0 - FF + 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x020c, 0x0215, + 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, + 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, + 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, 0x0215, + 0x0215, 0x0250, 0x0250, 0x0250, 0x0250, 0x0250, 0x0250, 0x0250, + 0x0250, 0x0250, 0x0250, 0x0250, 0x0250, 0x0250, 0x0250, 0x0250, + 0x0250, 0x0250, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, + 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, 0x0274, + // Entry 100 - 13F + 0x0274, 0x0274, 0x0274, 0x0274, 0x02aa, + }, + }, + { // asa + "AndoraFalme dha KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArme" + + "niaAntili za UholandhiAngolaAjentinaThamoa ya MarekaniAuthtriaAuthtr" + + "aliaArubaAdhabajaniBothnia na HedhegovinaBabadothiBangladeshiUbelgij" + + "iBukinafathoBulgariaBahareniBurundiBeniniBermudaBruneiBraziliBahamaB" + + "utaniBotthwanaBelaruthiBelidheKanadaJamhuri ya Kidemokrathia ya Kong" + + "oJamhuri ya Afrika ya KatiKongoUthwithiKodivaaVithiwa vya CookChileK" + + "ameruniChinaKolombiaKothtarikaKubaKepuvedeKuprothiJamhuri ya ChekiUj" + + "erumaniJibutiDenmakiDominikaJamhuri ya DominikaAljeriaEkwadoEthtonia" + + "MithriEritreaHithpaniaUhabeshiUfiniFijiVithiwa vya FalklandMikroneth" + + "iaUfaranthaGaboniUingeredhaGrenadaJojiaGwiyana ya UfaranthaGhanaJibr" + + "altaGrinlandiGambiaGineGwadelupeGinekwetaUgirikiGwatemalaGwamGinebis" + + "auGuyanaHondurathiKorathiaHaitiHungariaIndonethiaAyalandiIthraeliInd" + + "iaIeneo la Uingeredha katika Bahari HindiIrakiUajemiAithlandiItaliaJ" + + "amaikaYordaniJapaniKenyaKirigizithtaniKambodiaKiribatiKomoroThantaki" + + "tdhi na NevithKorea KathkaziniKorea KuthiniKuwaitiVithiwa vya Kayman" + + "KazakithtaniLaothiLebanoniThantaluthiaLishenteniThirilankaLiberiaLet" + + "hotoLitwaniaLathembagiLativiaLibyaMorokoMonakoMoldovaBukiniVithiwa v" + + "ya MarshalMathedoniaMaliMyamaMongoliaVithiwa vya Mariana vya Kathkaz" + + "iniMartinikiMoritaniaMonttherratiMaltaMorithiModivuMalawiMekthikoMal" + + "ethiaMthumbijiNamibiaNyukaledoniaNijeriKithiwa cha NorfokNijeriaNika" + + "ragwaUholandhiNorweNepaliNauruNiueNyudhilandiOmaniPanamaPeruPolinesi" + + "a ya UfaranthaPapuaFilipinoPakithtaniPolandiThantapieri na MikeloniP" + + "itkairniPwetorikoPalestinaUrenoPalauParagwaiKatariRiyunioniRomaniaUr" + + "uthiRwandaThaudiVithiwa vya TholomonShelisheliThudaniUthwidiThingapo" + + "oThantahelenaThloveniaTholvakiaThiera LeoniThamarinoThenegaliThomali" + + "aThurinamuThao Tome na PrincipeElsavadoThiriaUthwadhiVithiwa vya Tur" + + "ki na KaikoChadiTogoTailandiTajikithtaniTokelauTimori ya MasharikiTu" + + "rukimenithtaniTunithiaTongaUturukiTrinidad na TobagoTuvaluTaiwaniTad" + + "haniaUgandaMarekaniUrugwaiUdhibekithtaniVatikaniThantavithenti na Gr" + + "enadiniVenezuelaVithiwa vya Virgin vya UingeredhaVithiwa vya Virgin " + + "vya MarekaniVietinamuVanuatuWalith na FutunaThamoaYemeniMayotteAfrik" + + "a KuthiniDhambiaDhimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0017, 0x0023, 0x0035, 0x003d, 0x0044, + 0x004b, 0x005e, 0x0064, 0x0064, 0x006c, 0x007e, 0x0086, 0x0090, + 0x0095, 0x0095, 0x009f, 0x00b5, 0x00be, 0x00c9, 0x00d1, 0x00dc, + 0x00e4, 0x00ec, 0x00f3, 0x00f9, 0x00f9, 0x0100, 0x0106, 0x0106, + 0x0106, 0x010d, 0x0113, 0x0119, 0x0119, 0x0122, 0x012b, 0x0132, + 0x0138, 0x0138, 0x0159, 0x0172, 0x0177, 0x017f, 0x0186, 0x0196, + 0x019b, 0x01a3, 0x01a8, 0x01b0, 0x01b0, 0x01ba, 0x01be, 0x01c6, + 0x01c6, 0x01c6, 0x01ce, 0x01de, 0x01e7, 0x01e7, 0x01ed, 0x01f4, + // Entry 40 - 7F + 0x01fc, 0x020f, 0x0216, 0x0216, 0x021c, 0x0224, 0x022a, 0x022a, + 0x0231, 0x023a, 0x0242, 0x0242, 0x0247, 0x024b, 0x025f, 0x026a, + 0x026a, 0x0273, 0x0279, 0x0283, 0x028a, 0x028f, 0x02a3, 0x02a3, + 0x02a8, 0x02b0, 0x02b9, 0x02bf, 0x02c3, 0x02cc, 0x02d5, 0x02dc, + 0x02dc, 0x02e5, 0x02e9, 0x02f2, 0x02f8, 0x02f8, 0x02f8, 0x0302, + 0x030a, 0x030f, 0x0317, 0x0317, 0x0321, 0x0329, 0x0331, 0x0331, + 0x0336, 0x035d, 0x0362, 0x0368, 0x0371, 0x0377, 0x0377, 0x037e, + 0x0385, 0x038b, 0x0390, 0x039e, 0x03a6, 0x03ae, 0x03b4, 0x03ca, + // Entry 80 - BF + 0x03da, 0x03e7, 0x03ee, 0x0400, 0x040c, 0x0412, 0x041a, 0x0426, + 0x0430, 0x043a, 0x0441, 0x0448, 0x0450, 0x045a, 0x0461, 0x0466, + 0x046c, 0x0472, 0x0479, 0x0479, 0x0479, 0x047f, 0x0492, 0x049c, + 0x04a0, 0x04a5, 0x04ad, 0x04ad, 0x04cf, 0x04d8, 0x04e1, 0x04ed, + 0x04f2, 0x04f9, 0x04ff, 0x0505, 0x050d, 0x0515, 0x051e, 0x0525, + 0x0531, 0x0537, 0x0549, 0x0550, 0x0559, 0x0562, 0x0567, 0x056d, + 0x0572, 0x0576, 0x0581, 0x0586, 0x058c, 0x0590, 0x05a6, 0x05ab, + 0x05b3, 0x05bd, 0x05c4, 0x05db, 0x05e4, 0x05ed, 0x05f6, 0x05fb, + // Entry C0 - FF + 0x0600, 0x0608, 0x060e, 0x060e, 0x0617, 0x061e, 0x061e, 0x0624, + 0x062a, 0x0630, 0x0644, 0x064e, 0x0655, 0x065c, 0x0665, 0x0671, + 0x067a, 0x067a, 0x0683, 0x068f, 0x0698, 0x06a1, 0x06a9, 0x06b2, + 0x06b2, 0x06c7, 0x06cf, 0x06cf, 0x06d5, 0x06dd, 0x06dd, 0x06f7, + 0x06fc, 0x06fc, 0x0700, 0x0708, 0x0714, 0x071b, 0x072e, 0x073e, + 0x0746, 0x074b, 0x0752, 0x0764, 0x076a, 0x0771, 0x0779, 0x0779, + 0x077f, 0x077f, 0x0787, 0x078e, 0x079c, 0x07a4, 0x07bf, 0x07c8, + 0x07e9, 0x0808, 0x0811, 0x0818, 0x0828, 0x082e, 0x082e, 0x0834, + // Entry 100 - 13F + 0x083b, 0x0849, 0x0850, 0x0859, + }, + }, + { // ast + "Islla AscensiónAndorraEmiratos Árabes XuníosAfganistánAntigua y BarbudaA" + + "nguilaAlbaniaArmeniaAngolaL’AntártidaArxentinaSamoa AmericanaAustria" + + "AustraliaArubaIslles AlandAzerbaixánBosnia y HerzegovinaBarbadosBang" + + "ladexBélxicaBurkina FasuBulgariaBaḥréinBurundiBenínSan BartoloméLes " + + "BermudesBrunéiBoliviaCaribe neerlandésBrasilLes BahamesButánIslla Bo" + + "uvetBotsuanaBielorrusiaBelizeCanadáIslles Cocos (Keeling)Congu - Kin" + + "xasaRepública CentroafricanaCongu - BrazzavilleSuizaCosta de MarfilI" + + "slles CookChileCamerúnChinaColombiaIslla ClippertonCosta RicaCubaCab" + + "u VerdeCuraçaoIslla ChristmasXipreChequiaAlemañaDiego GarciaXibutiDi" + + "namarcaDominicaRepública DominicanaArxeliaCeuta y MelillaEcuadorEsto" + + "niaExiptuSáḥara OccidentalEritreaEspañaEtiopíaXunión EuropeaFinlandi" + + "aIslles FixiFalkland IslandsMicronesiaIslles FeroeFranciaGabónReinu " + + "XuníuGranadaXeorxaGuyana FrancesaGuernseyGhanaXibraltarGroenlandiaGa" + + "mbiaGuineaGuadalupeGuinea EcuatorialGreciaIslles Xeorxa del Sur y Sa" + + "ndwich del SurGuatemalaGuamGuinea-BisáuGuyanaARE China de Ḥong KongI" + + "slles Heard y McDonaldHonduresCroaciaHaitíHungríaIslles CanariesIndo" + + "nesiaIrlandaIsraelIslla de ManIndiaTerritoriu Británicu del Océanu Í" + + "ndicuIraqIránIslandiaItaliaJerseyXamaicaXordaniaXapónKeniaKirguistán" + + "CamboyaKiribatiLes ComoresSaint Kitts y NevisCorea del NorteCorea de" + + "l SurKuwaitIslles CaimánKazakstánLaosLíbanuSanta LlucíaLiechtenstein" + + "Sri LankaLiberiaLesothuLituaniaLuxemburguLetoniaLibiaMarruecosMónacu" + + "MoldaviaMontenegruSaint MartinMadagascarIslles MarshallMacedoniaMalí" + + "Myanmar (Birmania)MongoliaARE China de MacáuIslles Marianes del Nort" + + "eLa MartinicaMauritaniaMontserratMaltaMauriciuLes MaldivesMalauiMéxi" + + "cuMalasiaMozambiqueNamibiaNueva CaledoniaEl NíxerIslla NorfolkNixeri" + + "aNicaraguaPaíses BaxosNoruegaNepalNauruNiueNueva ZelandaOmánPanamáPe" + + "rúPolinesia FrancesaPapúa Nueva GuineaFilipinesPaquistánPoloniaSaint" + + " Pierre y MiquelonIslles PitcairnPuertu RicuTerritorios PalestinosPo" + + "rtugalPaláuParaguáiQatarOceanía esteriorReuniónRumaníaSerbiaRusiaRua" + + "ndaArabia SauditaIslles SalomónLes SeixelesSudánSueciaSingapurSanta " + + "HelenaEsloveniaSvalbard ya Islla Jan MayenEslovaquiaSierra LleonaSan" + + " MarínSenegalSomaliaSurinamSudán del SurSantu Tomé y PríncipeEl Salv" + + "adorSint MaartenSiriaSuazilandiaTristán da CunhaIslles Turques y Cai" + + "cosChadTierres Australes FrancesesToguTailandiaTaxiquistánTokeláuTim" + + "or OrientalTurkmenistánTuniciaTongaTurquíaTrinidá y TobaguTuvaluTaiw" + + "ánTanzaniaUcraínaUgandaIslles Perifériques Menores de los EE.XX.Est" + + "aos XuníosUruguáiUzbequistánCiudá del VaticanuSan Vicente y Granadin" + + "esVenezuelaIslles Vírxenes BritániquesIslles Vírxenes AmericanesViet" + + "namVanuatuWallis y FutunaSamoaKosovuYemenMayotteSudáfricaZambiaZimba" + + "bueRexón desconocidaMunduÁfricaNorteaméricaAmérica del SurOceaníaÁfr" + + "ica OccidentalAmérica CentralÁfrica OrientalÁfrica del NorteÁfrica C" + + "entralÁfrica del SurAméricaAmérica del NorteCaribeAsia OrientalAsia " + + "del SurSureste AsiáticuEuropa del SurAustralasiaMelanesiaRexón de Mi" + + "cronesiaPolinesiaAsiaAsia CentralAsia OccidentalEuropaEuropa Orienta" + + "lEuropa del NorteEuropa OccidentalAmérica Llatina", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0010, 0x0017, 0x002f, 0x003a, 0x004b, 0x0052, 0x0059, + 0x0060, 0x0060, 0x0066, 0x0074, 0x007d, 0x008c, 0x0093, 0x009c, + 0x00a1, 0x00ad, 0x00b8, 0x00cc, 0x00d4, 0x00dd, 0x00e5, 0x00f1, + 0x00f9, 0x0103, 0x010a, 0x0110, 0x011e, 0x012a, 0x0131, 0x0138, + 0x014a, 0x0150, 0x015b, 0x0161, 0x016d, 0x0175, 0x0180, 0x0186, + 0x018d, 0x01a3, 0x01b2, 0x01cb, 0x01de, 0x01e3, 0x01f2, 0x01fd, + 0x0202, 0x020a, 0x020f, 0x0217, 0x0227, 0x0231, 0x0235, 0x023f, + 0x0247, 0x0256, 0x025b, 0x0262, 0x026a, 0x0276, 0x027c, 0x0285, + // Entry 40 - 7F + 0x028d, 0x02a2, 0x02a9, 0x02b8, 0x02bf, 0x02c6, 0x02cc, 0x02e0, + 0x02e7, 0x02ee, 0x02f6, 0x0305, 0x030e, 0x0319, 0x0329, 0x0333, + 0x033f, 0x0346, 0x034c, 0x0358, 0x035f, 0x0365, 0x0374, 0x037c, + 0x0381, 0x038a, 0x0395, 0x039b, 0x03a1, 0x03aa, 0x03bb, 0x03c1, + 0x03e9, 0x03f2, 0x03f6, 0x0403, 0x0409, 0x0421, 0x0438, 0x0440, + 0x0447, 0x044d, 0x0455, 0x0464, 0x046d, 0x0474, 0x047a, 0x0486, + 0x048b, 0x04b4, 0x04b8, 0x04bd, 0x04c5, 0x04cb, 0x04d1, 0x04d8, + 0x04e0, 0x04e6, 0x04eb, 0x04f6, 0x04fd, 0x0505, 0x0510, 0x0523, + // Entry 80 - BF + 0x0532, 0x053f, 0x0545, 0x0553, 0x055d, 0x0561, 0x0568, 0x0575, + 0x0582, 0x058b, 0x0592, 0x0599, 0x05a1, 0x05ab, 0x05b2, 0x05b7, + 0x05c0, 0x05c7, 0x05cf, 0x05d9, 0x05e5, 0x05ef, 0x05fe, 0x0607, + 0x060c, 0x061e, 0x0626, 0x0639, 0x0652, 0x065e, 0x0668, 0x0672, + 0x0677, 0x067f, 0x068b, 0x0691, 0x0698, 0x069f, 0x06a9, 0x06b0, + 0x06bf, 0x06c8, 0x06d5, 0x06dc, 0x06e5, 0x06f2, 0x06f9, 0x06fe, + 0x0703, 0x0707, 0x0714, 0x0719, 0x0720, 0x0725, 0x0737, 0x074a, + 0x0753, 0x075d, 0x0764, 0x077b, 0x078a, 0x0795, 0x07ab, 0x07b3, + // Entry C0 - FF + 0x07b9, 0x07c2, 0x07c7, 0x07d8, 0x07e0, 0x07e8, 0x07ee, 0x07f3, + 0x07f9, 0x0807, 0x0816, 0x0822, 0x0828, 0x082e, 0x0836, 0x0842, + 0x084b, 0x0866, 0x0870, 0x087d, 0x0887, 0x088e, 0x0895, 0x089c, + 0x08aa, 0x08c1, 0x08cc, 0x08d8, 0x08dd, 0x08e8, 0x08f9, 0x0910, + 0x0914, 0x092f, 0x0933, 0x093c, 0x0948, 0x0950, 0x095e, 0x096b, + 0x0972, 0x0977, 0x097f, 0x0990, 0x0996, 0x099d, 0x09a5, 0x09ad, + 0x09b3, 0x09dd, 0x09eb, 0x09f3, 0x09ff, 0x0a12, 0x0a2a, 0x0a33, + 0x0a50, 0x0a6b, 0x0a72, 0x0a79, 0x0a88, 0x0a8d, 0x0a93, 0x0a98, + // Entry 100 - 13F + 0x0a9f, 0x0aa9, 0x0aaf, 0x0ab7, 0x0ac9, 0x0ace, 0x0ad5, 0x0ae2, + 0x0af2, 0x0afa, 0x0b0c, 0x0b1c, 0x0b2c, 0x0b3d, 0x0b4c, 0x0b5b, + 0x0b63, 0x0b75, 0x0b7b, 0x0b88, 0x0b94, 0x0ba5, 0x0bb3, 0x0bbe, + 0x0bc7, 0x0bdb, 0x0be4, 0x0be8, 0x0bf4, 0x0c03, 0x0c09, 0x0c18, + 0x0c28, 0x0c39, 0x0c49, + }, + }, + { // az + azRegionStr, + azRegionIdx, + }, + { // az-Cyrl + "АзәрбајҹанБразилијаЧинАлманијаФрансаҺиндистанИталијаЈапонијаРусијаАмерик" + + "а Бирләшмиш Штатлары", + []uint16{ // 243 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, + 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, + 0x0014, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, + 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, + 0x0026, 0x0026, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, + 0x002c, 0x002c, 0x002c, 0x002c, 0x003c, 0x003c, 0x003c, 0x003c, + // Entry 40 - 7F + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, + 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, + 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, + 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, 0x0048, + 0x005a, 0x005a, 0x005a, 0x005a, 0x005a, 0x0068, 0x0068, 0x0068, + 0x0068, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, + // Entry 80 - BF + 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, + 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, + 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, + 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, + 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, + 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, + 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, + 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, + // Entry C0 - FF + 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0078, 0x0084, + 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, + 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, + 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, + 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, + 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, 0x0084, + 0x0084, 0x0084, 0x00b6, + }, + }, + { // bas + "Àŋdɔ̂rÀdnà i Bilɔ̀ŋ bi ArābìàÀfgànìstâŋÀŋtigà ɓɔ BàrbudàÀŋgiyàÀlbanìàÀrm" + + "enìàÀŋtîy ǹlɛ̀ndiÀŋgolàÀrgàŋtinàÒstrǐkÒstralìàÀrubàÀzɛ̀rbajàŋBòhnià " + + "ƐrzègòvinàBàrbadòBàŋglàdɛ̂sBɛlgyùmBùrkìnà FasòBùlgarìàBàraìnBùrundì" + + "Bènɛ̂ŋBɛ̀rmudàBruneiBòlivìàBràsîlBàhamàsBùtânBòdsùanàBèlarùsBèlîsKàn" + + "adàKòŋgo ìkɛŋiŊ̀ɛm AfrīkàKòŋgoSùwîsMàŋ mi Njɔ̂kBìòn bi KookKìlîKàmɛ̀" + + "rûnKinàKɔ̀lɔmbìàKòstà RikàKubàKabwɛ᷆rKipròJamânJìbutìDànmârkDòmnîkDò" + + "mnikàÀlgerìàÈkwàtorìàÈstonìàÈgîptòÈrìtrěàPànyaÈtìopìàFìnlândFijiBìòn" + + " bi FalklandMìkrònesìàPùlàsi / Fɛ̀lɛ̀nsi /Gàbɔ̂ŋÀdnà i Lɔ̂ŋGrènadàGè" + + "ɔrgìàGùyanà PùlàsiGanàGìlbràtârGrǐnlàndGàmbiàGìnêGwàdèlûpGìne Èkwàt" + + "orìàGrǐkyàGwàtèmalàGùâmGìne BìsàôGùyanàƆ̀ŋduràsKròasìàÀitìƆ̀ŋgriìInd" + + "ònèsiàÌrlândIsràɛ̂lIndìàBìtèk bi Ŋgisì i Tūyɛ ĪndìàÌrâkÌrâŋÌslandìà" + + "ÌtalìàJàmàikàYɔ̀rdaniàKenìàKìrgìzìstàŋKàmbodìàKìrìbatìKɔ̀mɔ̂rNûmpub" + + "i Kîts nì NevìsKɔ̀re ì Ŋ̀ɔmbɔkKɔ̀re ì Ŋ̀wɛ̀lmbɔkKòwêtBìòn bi KaymànK" + + "àzàkstâŋLàôsLèbanònNûmpubi LusìLigstɛntànSrìlaŋkàLìberìàLesòtòLìtùa" + + "nìàLùgsàmbûrLàdviàLibìàMàrokòMònakòMoldavìàMàdàgàskârBìòn bi MarcàlM" + + "àsèdonìàMàliMyànmârMòŋgolìàBìòn bi Marìanà ŋ̀ɔmbɔkMàrtìnîkMòrìtanìà" + + "Mɔ̀ŋseràtMaltàMòrîsMàldîfMàlàwiMɛ̀gsîkMàlɛ̀sìàMòsàmbîkNàmibìàKàlèdon" + + "ìà Yɔ̀ndɔNìjɛ̂rÒn i Nɔrfɔ̂kNìgerìàNìkàragwàǸlɛndiNɔ̀rvegìàNèpâlNerù" + + "Nìuɛ̀Sìlând Yɔ̀ndɔÒmânPànàmaPèrûPòlìnesìà PùlàsiGìne ì PàpuFìlìpînPà" + + "kìstânPòlàndNûmpubi Petrò nì MikèlônPìdkaìrnPɔ̀rtò RikòPàlɛ̀htinà Hy" + + "ɔ̀ŋg nì GazàPɔ̀tɔkìPàlaùPàràgwêKàtârRèunyɔ̂ŋRùmanìàRuslàndRùandàSàu" + + "di ÀrabìàBìòn bi SalōmòSèsɛ̂lSùdâŋSwedɛ̀nSìŋgàpûrNûmpubi ƐlēnàSlòvan" + + "ìàSlòvakìàSièra Lèɔ̂nNûmpubi MāatìnSènègâlSòmalìàSùrinâmSào Tòme ɓɔ" + + " Prɛ̀ŋcipèSàlvàdɔ̂rSirìàSwàzìlândBìòn bi Tûrks nì KalkòsCâdTògoTaylà" + + "ndTàjìkìstaŋTòkèlaòTìmɔ̂r lìkòlTùrgmènìstânTùnisìàTɔŋgàTùrkâyTrìnidà" + + "d ɓɔ TòbagòTùvàlùTàywânTànzàniàÙkrɛ̌nÙgandàÀdnà i Bilɔ̀ŋ bi AmerkàÙr" + + "ùgwêyÙzbèkìstânVàtìkâŋNûmpubi Vɛ̂ŋsâŋ nì grènàdînVènèzùelàBìòn bi k" + + "ɔnji bi ŊgisìBìòn bi kɔnji bi U.S.Vìɛ̀dnâmVànùatùWàlîs nì FùtunàSàm" + + "oàYèmɛ̂nMàyɔ̂tÀfrǐkà Sɔ̀ZàmbiàZìmbàbwê", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x000a, 0x0029, 0x0038, 0x0050, 0x0059, 0x0063, + 0x006d, 0x0080, 0x0089, 0x0089, 0x0096, 0x0096, 0x009e, 0x00a9, + 0x00b0, 0x00b0, 0x00bf, 0x00d6, 0x00df, 0x00ee, 0x00f7, 0x0107, + 0x0112, 0x011a, 0x0123, 0x012d, 0x012d, 0x0138, 0x013e, 0x0148, + 0x0148, 0x0150, 0x0159, 0x0160, 0x0160, 0x016b, 0x0174, 0x017b, + 0x0183, 0x0183, 0x0193, 0x01a3, 0x01aa, 0x01b1, 0x01c1, 0x01cf, + 0x01d5, 0x01e1, 0x01e6, 0x01f4, 0x01f4, 0x0201, 0x0206, 0x0210, + 0x0210, 0x0210, 0x0216, 0x0216, 0x021c, 0x021c, 0x0224, 0x022d, + // Entry 40 - 7F + 0x0235, 0x023e, 0x0248, 0x0248, 0x0255, 0x025f, 0x0268, 0x0268, + 0x0273, 0x0279, 0x0284, 0x0284, 0x028d, 0x0291, 0x02a3, 0x02b1, + 0x02b1, 0x02cb, 0x02d5, 0x02e5, 0x02ee, 0x02f9, 0x030a, 0x030a, + 0x030f, 0x031b, 0x0325, 0x032d, 0x0333, 0x033e, 0x0351, 0x0359, + 0x0359, 0x0365, 0x036b, 0x0379, 0x0381, 0x0381, 0x0381, 0x038d, + 0x0397, 0x039d, 0x03a8, 0x03a8, 0x03b4, 0x03bc, 0x03c6, 0x03c6, + 0x03cd, 0x03f1, 0x03f7, 0x03fe, 0x0409, 0x0412, 0x0412, 0x041c, + 0x0428, 0x0428, 0x042f, 0x043f, 0x044a, 0x0455, 0x0460, 0x0479, + // Entry 80 - BF + 0x048f, 0x04a9, 0x04b0, 0x04c1, 0x04ce, 0x04d4, 0x04dd, 0x04eb, + 0x04f7, 0x0502, 0x050c, 0x0514, 0x0520, 0x052c, 0x0534, 0x053b, + 0x0543, 0x054b, 0x0555, 0x0555, 0x0555, 0x0563, 0x0574, 0x0581, + 0x0586, 0x058f, 0x059b, 0x059b, 0x05ba, 0x05c5, 0x05d2, 0x05df, + 0x05e5, 0x05ec, 0x05f4, 0x05fc, 0x0606, 0x0613, 0x061e, 0x0628, + 0x063f, 0x0648, 0x0658, 0x0662, 0x066e, 0x0676, 0x0683, 0x068a, + 0x068f, 0x0697, 0x06a9, 0x06af, 0x06b7, 0x06bd, 0x06d3, 0x06e1, + 0x06eb, 0x06f6, 0x06fe, 0x071b, 0x0725, 0x0734, 0x0756, 0x0761, + // Entry C0 - FF + 0x0768, 0x0772, 0x0779, 0x0779, 0x0785, 0x078f, 0x078f, 0x0797, + 0x079f, 0x07af, 0x07c1, 0x07ca, 0x07d2, 0x07db, 0x07e7, 0x07f8, + 0x0803, 0x0803, 0x080e, 0x081d, 0x082e, 0x0838, 0x0842, 0x084b, + 0x084b, 0x0868, 0x0875, 0x0875, 0x087c, 0x0888, 0x0888, 0x08a4, + 0x08a8, 0x08a8, 0x08ad, 0x08b5, 0x08c3, 0x08cd, 0x08de, 0x08ee, + 0x08f8, 0x0900, 0x0908, 0x0920, 0x0929, 0x0931, 0x093c, 0x0945, + 0x094d, 0x094d, 0x096a, 0x0974, 0x0982, 0x098d, 0x09b2, 0x09bf, + 0x09da, 0x09f2, 0x09fe, 0x0a08, 0x0a1c, 0x0a23, 0x0a23, 0x0a2c, + // Entry 100 - 13F + 0x0a35, 0x0a44, 0x0a4c, 0x0a57, + }, + }, + { // be + "Востраў УшэсцяАндораАб’яднаныя Арабскія ЭміратыАфганістанАнтыгуа і Барбу" + + "даАнгільяАлбаніяАрменіяНідэрландскія АнтылыАнголаАнтарктыкаАргенцін" + + "аАмерыканскае СамоаАўстрыяАўстраліяАрубаАландскія астравыАзербайджа" + + "нБоснія і ГерцагавінаБарбадасБангладэшБельгіяБуркіна-ФасоБалгарыяБа" + + "хрэйнБурундзіБенінСен-БартэльміБермудскія астравыБрунейБалівіяКарыб" + + "скія НідэрландыБразіліяБагамыБутанВостраў БувэБатсванаБеларусьБеліз" + + "КанадаКакосавыя астравыКонга (Кіншаса)Цэнтральна-Афрыканская Рэспуб" + + "лікаКонга (Бразавіль)ШвейцарыяКот-д’ІвуарАстравы КукаЧыліКамерунКіт" + + "айКалумбіяВостраў КліпертонКоста-РыкаКубаКаба-ВердэВостраў КюрасааВ" + + "остраў РастваКіпрЧэхіяГерманіяВостраў Дыега-ГарсіяДжыбуціДаніяДамін" + + "ікаДамініканская РэспублікаАлжырСеўта і МелільяЭквадорЭстоніяЕгіпет" + + "Заходняя СахараЭрытрэяІспаніяЭфіопіяЕўрапейскі саюзФінляндыяФіджыФа" + + "лклендскія астравыМікранезіяФарэрскія астравыФранцыяГабонВялікабрыт" + + "аніяГрэнадаГрузіяФранцузская ГвіянаВостраў ГернсіГанаГібралтарГрэнл" + + "андыяГамбіяГвінеяГвадэлупаЭкватарыяльная ГвінеяГрэцыяПаўднёвая Джор" + + "джыя і Паўднёвыя Сандвічавы астравыГватэмалаГуамГвінея-БісауГаянаГа" + + "нконг, САР (Кітай)Востраў Херд і астравы МакдональдГандурасХарватыя" + + "ГаіціВенгрыяКанарскія астравыІнданезіяІрландыяІзраільВостраў МэнІнд" + + "ыяБрытанская тэрыторыя ў Індыйскім акіянеІракІранІсландыяІталіяВост" + + "раў ДжэрсіЯмайкаІарданіяЯпоніяКеніяКыргызстанКамбоджаКірыбаціКаморс" + + "кія АстравыСент-Кітс і НевісПаўночная КарэяПаўднёвая КарэяКувейтКай" + + "манавы астравыКазахстанЛаосЛіванСент-ЛюсіяЛіхтэнштэйнШры-ЛанкаЛібер" + + "ыяЛесотаЛітваЛюксембургЛатвіяЛівіяМарокаМанакаМалдоваЧарнагорыяСен-" + + "МартэнМадагаскарМаршалавы АстравыМакедоніяМаліМ’янма (Бірма)Манголі" + + "яМакаа, САР (Кітай)Паўночныя Марыянскія астравыМарцінікаМаўрытаніяМ" + + "антсератМальтаМаўрыкійМальдывыМалавіМексікаМалайзіяМазамбікНамібіяН" + + "овая КаледоніяНігерВостраў НорфалкНігерыяНікарагуаНідэрландыНарвегі" + + "яНепалНауруНіуэНовая ЗеландыяАманПанамаПеруФранцузская ПалінезіяПап" + + "уа — Новая ГвінеяФіліпіныПакістанПольшчаСен-П’ер і МікелонАстравы П" + + "іткэрнПуэрта-РыкаПалестынскія тэрыторыіПартугаліяПалауПарагвайКатар" + + "Вонкавая АкіяніяРэюньёнРумыніяСербіяРасіяРуандаСаудаўская АравіяСал" + + "амонавы АстравыСейшэльскія АстравыСуданШвецыяСінгапурВостраў Святой" + + " АленыСлавеніяСвальбард (Паўночна-Усходняя Зямля) і Ян-МаенСлавакіяС" + + "ьера-ЛеонэСан-МарынаСенегалСамаліСурынамПаўднёвы СуданСан-Тамэ і Пр" + + "ынсіпіСальвадорСінт-МартэнСірыяСвазілендТрыстан-да-КуньяЦёркс і Кай" + + "касЧадФранцузскія Паўднёвыя тэрыторыіТогаТайландТаджыкістанТакелауУ" + + "сходні ТыморТуркменістанТунісТонгаТурцыяТрынідад і ТабагаТувалуТайв" + + "аньТанзаніяУкраінаУгандаЗнешнія малыя астравы ЗШАЗлучаныя Штаты Аме" + + "рыкіУругвайУзбекістанВатыканСент-Вінсент і ГрэнадзіныВенесуэлаБрыта" + + "нскія Віргінскія астравыАмерыканскія Віргінскія астравыВ’етнамВануа" + + "туУоліс і ФутунаСамоаКосаваЕменВостраў МаётаПаўднёва-Афрыканская Рэ" + + "спублікаЗамбіяЗімбабвэНевядомы рэгіёнСветАфрыкаПаўночная АмерыкаПаў" + + "днёвая АмерыкаАкіяніяЗаходняя АфрыкаЦэнтральная АмерыкаУсходняя Афр" + + "ыкаПаўночная АфрыкаЦэнтральная АфрыкаПаўднёвая АфрыкаПаўночная і Па" + + "ўднёвая АмерыкіПаўночнаамерыканскі рэгіёнКарыбскія астравыУсходняя " + + "АзіяПаўднёвая АзіяПаўднёва-Усходняя АзіяПаўднёвая ЕўропаАўстралазія" + + "МеланезіяМікранезійскі рэгіёнПалінезіяАзіяЦэнтральная АзіяЗаходняя " + + "АзіяЕўропаУсходняя ЕўропаПаўночная ЕўропаЗаходняя ЕўропаЛацінская А" + + "мерыка", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x001b, 0x0027, 0x005c, 0x0070, 0x0090, 0x009e, 0x00ac, + 0x00ba, 0x00e1, 0x00ed, 0x0101, 0x0113, 0x0136, 0x0144, 0x0156, + 0x0160, 0x0181, 0x0197, 0x01bd, 0x01cd, 0x01df, 0x01ed, 0x0204, + 0x0214, 0x0222, 0x0232, 0x023c, 0x0255, 0x0278, 0x0284, 0x0292, + 0x02b9, 0x02c9, 0x02d5, 0x02df, 0x02f6, 0x0306, 0x0316, 0x0320, + 0x032c, 0x034d, 0x0368, 0x03a8, 0x03c7, 0x03d9, 0x03ef, 0x0406, + 0x040e, 0x041c, 0x0426, 0x0436, 0x0457, 0x046a, 0x0472, 0x0485, + 0x04a2, 0x04bd, 0x04c5, 0x04cf, 0x04df, 0x0505, 0x0513, 0x051d, + // Entry 40 - 7F + 0x052d, 0x055c, 0x0566, 0x0582, 0x0590, 0x059e, 0x05aa, 0x05c7, + 0x05d5, 0x05e3, 0x05f1, 0x060e, 0x0620, 0x062a, 0x0651, 0x0665, + 0x0686, 0x0694, 0x069e, 0x06ba, 0x06c8, 0x06d4, 0x06f7, 0x0712, + 0x071a, 0x072c, 0x0740, 0x074c, 0x0758, 0x076a, 0x0793, 0x079f, + 0x07fc, 0x080e, 0x0816, 0x082d, 0x0837, 0x085a, 0x0898, 0x08a8, + 0x08b8, 0x08c2, 0x08d0, 0x08f1, 0x0903, 0x0913, 0x0921, 0x0936, + 0x0940, 0x098a, 0x0992, 0x099a, 0x09aa, 0x09b6, 0x09d1, 0x09dd, + 0x09ed, 0x09f9, 0x0a03, 0x0a17, 0x0a27, 0x0a37, 0x0a58, 0x0a77, + // Entry 80 - BF + 0x0a94, 0x0ab1, 0x0abd, 0x0ade, 0x0af0, 0x0af8, 0x0b02, 0x0b15, + 0x0b2b, 0x0b3c, 0x0b4a, 0x0b56, 0x0b60, 0x0b74, 0x0b80, 0x0b8a, + 0x0b96, 0x0ba2, 0x0bb0, 0x0bc4, 0x0bd7, 0x0beb, 0x0c0c, 0x0c1e, + 0x0c26, 0x0c40, 0x0c50, 0x0c6f, 0x0ca5, 0x0cb7, 0x0ccb, 0x0cdd, + 0x0ce9, 0x0cf9, 0x0d09, 0x0d15, 0x0d23, 0x0d33, 0x0d43, 0x0d51, + 0x0d6e, 0x0d78, 0x0d95, 0x0da3, 0x0db5, 0x0dc9, 0x0dd9, 0x0de3, + 0x0ded, 0x0df5, 0x0e10, 0x0e18, 0x0e24, 0x0e2c, 0x0e55, 0x0e7b, + 0x0e8b, 0x0e9b, 0x0ea9, 0x0ecb, 0x0ee8, 0x0efd, 0x0f28, 0x0f3c, + // Entry C0 - FF + 0x0f46, 0x0f56, 0x0f60, 0x0f7f, 0x0f8d, 0x0f9b, 0x0fa7, 0x0fb1, + 0x0fbd, 0x0fde, 0x1001, 0x1026, 0x1030, 0x103c, 0x104c, 0x1072, + 0x1082, 0x10d4, 0x10e4, 0x10f9, 0x110c, 0x111a, 0x1126, 0x1134, + 0x114f, 0x1172, 0x1184, 0x1199, 0x11a3, 0x11b5, 0x11d3, 0x11ed, + 0x11f3, 0x122f, 0x1237, 0x1245, 0x125b, 0x1269, 0x1282, 0x129a, + 0x12a4, 0x12ae, 0x12ba, 0x12da, 0x12e6, 0x12f4, 0x1304, 0x1312, + 0x131e, 0x134d, 0x1377, 0x1385, 0x1399, 0x13a7, 0x13d6, 0x13e8, + 0x1420, 0x145c, 0x146b, 0x1479, 0x1493, 0x149d, 0x14a9, 0x14b1, + // Entry 100 - 13F + 0x14ca, 0x1506, 0x1512, 0x1522, 0x153f, 0x1547, 0x1553, 0x1574, + 0x1595, 0x15a3, 0x15c0, 0x15e5, 0x1602, 0x1621, 0x1644, 0x1663, + 0x169a, 0x16cd, 0x16ee, 0x1707, 0x1722, 0x174c, 0x176b, 0x1781, + 0x1793, 0x17ba, 0x17cc, 0x17d4, 0x17f3, 0x180c, 0x1818, 0x1835, + 0x1854, 0x1871, 0x1892, + }, + }, + { // bem + "Zambia", + []uint16{ // 259 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 80 - BF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry C0 - FF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 100 - 13F + 0x0000, 0x0000, 0x0006, + }, + }, + { // bez + "HuandolaHufalme dza HihalabuHuafuganistaniHuantigua na HubarubudaHuangui" + + "laHualbaniaHuameniaHuantili dza HuuholanziHuangolaHuajendinaHusamoa " + + "ya HumalekaniHuastliaHuaustlaliaHualubaHuazabajaniHubosinia na Huhez" + + "egovinaHubabadosiHubangaladeshiHuubelgijiHubukinafasoHubulgariaHubah" + + "aleniHuburundiHubeniniHubelmudaHubruneiHuboliviaHublaziliHubahamaHub" + + "utaniHubotiswanaHubelalusiHubelizeHukanadaIjamhuri ya Hidemokrasi ya" + + " HukongoIjamhuri ya Afrika ya PagatiHukongoHuuswisiHukodivaaIfisima " + + "fya KookHuchileHukameruniHuchinaHukolombiaHukostarikaHukubaHukepuved" + + "eHukuprosiIjamhuri ya ChekiHuujerumaniHujibutiHudenmakiHudominikaIja" + + "mhuri ya HudominikaHualjeliaHuekwadoHuestoniaHumisriHueritreaHuhispa" + + "niaHuuhabeshiHuufiniHufijiIfisima fya FalklandHumikronesiaHuufaransa" + + "HugaboniHuuingerezaHugrenadaHujojiaHugwiyana ya HuufaransaHughanaHuj" + + "iblaltaHujinlandiHugambiaHujineHugwadelupeHuginekwetaHuugilikiHugwat" + + "emalaHugwamHuginebisauHuguyanaHuhondulasiHukorasiaHuhaitiHuhungaliaH" + + "uindonesiaHuayalandiHuislaheliHuindiaUlubali lwa Hubahari ya Hindi l" + + "wa HuingerezaHuilakiHuuajemiHuaislandiHuitaliaHujamaikaHuyolodaniHuj" + + "apaniHukenyaHukiligizistaniHukambodiaHukilibatiHukomoroHusantakitzi " + + "na HunevisHukolea KaskaziniHukolea KusiniHukuwaitiIfisima fya Kayman" + + "HukazakistaniHulaosiHulebanoniHusantalusiaHulishenteniHusirilankaHul" + + "ibeliaHulesotoHulitwaniaHulasembagiHulativiaHulibiyaHumolokoHumonako" + + "HumoldovaHubukiniIfisima fya MarshalHumasedoniaHumaliHumyamaHumongol" + + "iaIfisima fya Mariana fya HukaskaziniHumartinikiHumolitaniaHumontser" + + "ratiHumaltaHumolisiHumodivuHumalawiHumeksikoHumalesiaHumusumbijiHuna" + + "mibiaHunyukaledoniaHunijeliIhisima sha NorfokHunijeliaHunikaragwaHuu" + + "holanziHunolweHunepaliHunauruHuniueHunyuzilandiHuomaniHupanamaHupelu" + + "Hupolinesia ya HuufaransaHupapuaHufilipinoHupakistaniHupolandiHusant" + + "apieri na HumikeloniHupitkainiHupwetorikoUlubali lwa Magharibi nu Ga" + + "za wa HupalestinaHuulenoHupalauHupalagwaiHukataliHuliyunioniHulomani" + + "aHuulusiHulwandaHusaudiIfisima fya SolomonHushelisheliHusudaniHuuswi" + + "diHusingapooHusantahelenaHusloveniaHuslovakiaHusiela LioniHusamalino" + + "HusenegaliHusomaliaHusurinamuHusaotome na HuprinsipeHuelsavadoHusili" + + "aHuuswaziIfisima fya Turki na KaikoHuchadiHutogoHutailandiHutajikist" + + "aniHutokelauHutimori ya MasharikiHuuturukimenistaniHutunisiaHutongaH" + + "uuturukiHutrinad na HutobagoHutuvaluHutaiwaniHutanzaniaHuukrainiHuug" + + "andaHumalekaniHuulugwaiHuuzibekistaniHuvatikaniHusantavisenti na Hug" + + "renadiniHuvenezuelaIfisima fya Virgin fya HuingerezaIfisima fya Virg" + + "in fya HumelekaniHuvietinamuHuvanuatuHuwalis na HufutunaHusamoaHuyem" + + "eniHumayotteHuafrika iya HukusiniHuzambiaHuzimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0008, 0x001c, 0x002a, 0x0041, 0x004a, 0x0053, + 0x005b, 0x0072, 0x007a, 0x007a, 0x0084, 0x0099, 0x00a1, 0x00ac, + 0x00b3, 0x00b3, 0x00be, 0x00d7, 0x00e1, 0x00ef, 0x00f9, 0x0105, + 0x010f, 0x0119, 0x0122, 0x012a, 0x012a, 0x0133, 0x013b, 0x0144, + 0x0144, 0x014d, 0x0155, 0x015d, 0x015d, 0x0168, 0x0172, 0x017a, + 0x0182, 0x0182, 0x01a4, 0x01c0, 0x01c7, 0x01cf, 0x01d8, 0x01e8, + 0x01ef, 0x01f9, 0x0200, 0x020a, 0x020a, 0x0215, 0x021b, 0x0225, + 0x0225, 0x0225, 0x022e, 0x023f, 0x024a, 0x024a, 0x0252, 0x025b, + // Entry 40 - 7F + 0x0265, 0x027b, 0x0284, 0x0284, 0x028c, 0x0295, 0x029c, 0x029c, + 0x02a5, 0x02af, 0x02b9, 0x02b9, 0x02c0, 0x02c6, 0x02da, 0x02e6, + 0x02e6, 0x02f0, 0x02f8, 0x0303, 0x030c, 0x0313, 0x032a, 0x032a, + 0x0331, 0x033b, 0x0345, 0x034d, 0x0353, 0x035e, 0x0369, 0x0372, + 0x0372, 0x037d, 0x0383, 0x038e, 0x0396, 0x0396, 0x0396, 0x03a1, + 0x03aa, 0x03b1, 0x03bb, 0x03bb, 0x03c6, 0x03d0, 0x03da, 0x03da, + 0x03e1, 0x040d, 0x0414, 0x041c, 0x0426, 0x042e, 0x042e, 0x0437, + 0x0441, 0x0449, 0x0450, 0x045f, 0x0469, 0x0473, 0x047b, 0x0492, + // Entry 80 - BF + 0x04a3, 0x04b1, 0x04ba, 0x04cc, 0x04d9, 0x04e0, 0x04ea, 0x04f6, + 0x0502, 0x050d, 0x0516, 0x051e, 0x0528, 0x0533, 0x053c, 0x0544, + 0x054c, 0x0554, 0x055d, 0x055d, 0x055d, 0x0565, 0x0578, 0x0583, + 0x0589, 0x0590, 0x059a, 0x059a, 0x05bd, 0x05c8, 0x05d3, 0x05e0, + 0x05e7, 0x05ef, 0x05f7, 0x05ff, 0x0608, 0x0611, 0x061c, 0x0625, + 0x0633, 0x063b, 0x064d, 0x0656, 0x0661, 0x066b, 0x0672, 0x067a, + 0x0681, 0x0687, 0x0693, 0x069a, 0x06a2, 0x06a8, 0x06c1, 0x06c8, + 0x06d2, 0x06dd, 0x06e6, 0x0700, 0x070a, 0x0715, 0x0741, 0x0748, + // Entry C0 - FF + 0x074f, 0x0759, 0x0761, 0x0761, 0x076c, 0x0775, 0x0775, 0x077c, + 0x0784, 0x078b, 0x079e, 0x07aa, 0x07b2, 0x07ba, 0x07c4, 0x07d1, + 0x07db, 0x07db, 0x07e5, 0x07f2, 0x07fc, 0x0806, 0x080f, 0x0819, + 0x0819, 0x0830, 0x083a, 0x083a, 0x0841, 0x0849, 0x0849, 0x0863, + 0x086a, 0x086a, 0x0870, 0x087a, 0x0887, 0x0890, 0x08a5, 0x08b7, + 0x08c0, 0x08c7, 0x08d0, 0x08e4, 0x08ec, 0x08f5, 0x08ff, 0x0908, + 0x0910, 0x0910, 0x091a, 0x0923, 0x0931, 0x093b, 0x0958, 0x0963, + 0x0984, 0x09a5, 0x09b0, 0x09b9, 0x09cc, 0x09d3, 0x09d3, 0x09db, + // Entry 100 - 13F + 0x09e4, 0x09f9, 0x0a01, 0x0a0b, + }, + }, + { // bg + bgRegionStr, + bgRegionIdx, + }, + { // bm + "AndɔrArabu mara kafoliAfiganistaŋAntiga-ni-BarbudaAngiyaAlibaniArimeniPe" + + "yiba ka AntiyiAngolaArizantinSamowa amerikaniOtirisiOsitiraliArubaAz" + + "ɛrbayjaŋBozni-ƐrizigoviniBarbadiBɛngiladɛsiBɛlizikiBurukina FasoBul" + + "igariBareyiniBurundiBenɛnBermudiBurinɛyiBoliviBereziliBahamasiButaŋB" + + "ɔtisiwanaBelarusiBeliziKanadaKongo ka republiki demɔkratikiSantaraf" + + "irikiKongoSuwisiKodiwariKuki GunSiliKameruniSiniwajamanaKolombiKɔsit" + + "arikaKubaCapivɛrdiCipriCeki republikiAlimaɲiJibutiDanemarkiDɔminikiD" + + "ɔmimiki republikiAlizeriEkwatɔrEsetoniEziputiEritereEsipaɲiEtiopiFi" + + "nilandiFijiMaluwini GunMikironesiFaransiGabɔŋAngilɛtɛriGranadiZeyɔrz" + + "iFaransi ka gwiyaniGanaZibralitariGɔrɔhenelandiGanbiGineGwadelupGine" + + " ekwatɔriGɛrɛsiGwatemalaGwamGine BisawoGwiyanaHɔndirasiKroasiAyitiHɔ" + + "ngriƐndoneziIrilandiIsirayeliƐndujamanaAngilɛ ka ɛndu dugukoloIrakiI" + + "raŋIsilandiItaliZamayikiZɔrdaniZapɔnKeniyaKirigizisitaŋKambojiKiriba" + + "tiKomɔriKristɔfo-Senu-ni-ƝevɛsKɛɲɛka KoreWorodugu KoreKowɛtiBama Gun" + + "KazakistaŋLayosiLibaŋLusi-SenuLisɛnsitayiniSirilankaLiberiyaLesotoLi" + + "tuyaniLikisanburuLetoniLibiMarɔkuMonakoMolidaviMadagasikariMarisali " + + "GunMacedɔniMaliMyanimariMoŋoliKɛɲɛka Mariyani GunMaritinikiMɔritaniM" + + "oŋseraMaltiMorisiMaldiviMalawiMeksikiMalɛziMozanbikiNamibiKaledoni K" + + "ouraNizɛriNɔrofoliki GunNizeriyaNikaragwaPeyibaNɔriwɛziNepaliNawuruN" + + "yuweZelandi KouraOmaŋPanamaPeruFaransi ka polineziPapuwasi-Gine-Kour" + + "aFilipiniPakisitaŋPoloɲiPiyɛri-Senu-ni-MikelɔŋPitikariniPɔrotorikoPa" + + "lesitiniPɔritigaliPalawuParaguwayiKatariReyuɲɔŋRumaniIrisiRuwandaAra" + + "biya SawudiyaSalomo GunSesɛliSudaŋSuwɛdiSɛngapuriƐlɛni SenuSloveniSl" + + "owakiSiyera LewɔniMarini-SenuSenegaliSomaliSurinamiSawo Tome-ni-Prin" + + "icipeSalivadɔrSiriSwazilandiTuriki Gun ni KayikiCadiTogoTayilandiTaj" + + "ikisitaniTokeloKɔrɔn TimɔrTurikimenisitaniTuniziTongaTurikiTrinite-n" + + "i-TobagoTuvaluTayiwaniTanzaniUkɛrɛniUgandaAmerikiUrugwayiUzebekisita" + + "niVatikaŋVinisɛn-Senu-ni-GrenadiniVenezuwelaAngilɛ ka Sungurunnin Gu" + + "nAmeriki ka Sungurunnin GunWiyɛtinamuVanuwatuWalisi-ni-FutunaSamowaY" + + "emɛniMayotiWorodugu AfrikiZanbiZimbabuwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0017, 0x0023, 0x0034, 0x003a, 0x0041, + 0x0048, 0x0058, 0x005e, 0x005e, 0x0067, 0x0077, 0x007e, 0x0087, + 0x008c, 0x008c, 0x0098, 0x00aa, 0x00b1, 0x00be, 0x00c7, 0x00d4, + 0x00dc, 0x00e4, 0x00eb, 0x00f1, 0x00f1, 0x00f8, 0x0101, 0x0107, + 0x0107, 0x010f, 0x0117, 0x011d, 0x011d, 0x0128, 0x0130, 0x0136, + 0x013c, 0x013c, 0x015b, 0x0168, 0x016d, 0x0173, 0x017b, 0x0183, + 0x0187, 0x018f, 0x019b, 0x01a2, 0x01a2, 0x01ad, 0x01b1, 0x01bb, + 0x01bb, 0x01bb, 0x01c0, 0x01ce, 0x01d6, 0x01d6, 0x01dc, 0x01e5, + // Entry 40 - 7F + 0x01ee, 0x0201, 0x0208, 0x0208, 0x0210, 0x0217, 0x021e, 0x021e, + 0x0225, 0x022d, 0x0233, 0x0233, 0x023c, 0x0240, 0x024c, 0x0256, + 0x0256, 0x025d, 0x0264, 0x0270, 0x0277, 0x027f, 0x0291, 0x0291, + 0x0295, 0x02a0, 0x02af, 0x02b4, 0x02b8, 0x02c0, 0x02ce, 0x02d6, + 0x02d6, 0x02df, 0x02e3, 0x02ee, 0x02f5, 0x02f5, 0x02f5, 0x02ff, + 0x0305, 0x030a, 0x0311, 0x0311, 0x031a, 0x0322, 0x032b, 0x032b, + 0x0336, 0x034f, 0x0354, 0x0359, 0x0361, 0x0366, 0x0366, 0x036e, + 0x0376, 0x037c, 0x0382, 0x0390, 0x0397, 0x039f, 0x03a6, 0x03bf, + // Entry 80 - BF + 0x03cd, 0x03da, 0x03e1, 0x03e9, 0x03f4, 0x03fa, 0x0400, 0x0409, + 0x0417, 0x0420, 0x0428, 0x042e, 0x0436, 0x0441, 0x0447, 0x044b, + 0x0452, 0x0458, 0x0460, 0x0460, 0x0460, 0x046c, 0x0478, 0x0481, + 0x0485, 0x048e, 0x0495, 0x0495, 0x04ab, 0x04b5, 0x04be, 0x04c6, + 0x04cb, 0x04d1, 0x04d8, 0x04de, 0x04e5, 0x04ec, 0x04f5, 0x04fb, + 0x0509, 0x0510, 0x051f, 0x0527, 0x0530, 0x0536, 0x0540, 0x0546, + 0x054c, 0x0551, 0x055e, 0x0563, 0x0569, 0x056d, 0x0580, 0x0593, + 0x059b, 0x05a5, 0x05ac, 0x05c5, 0x05cf, 0x05da, 0x05e4, 0x05ef, + // Entry C0 - FF + 0x05f5, 0x05ff, 0x0605, 0x0605, 0x060f, 0x0615, 0x0615, 0x061a, + 0x0621, 0x0631, 0x063b, 0x0642, 0x0648, 0x064f, 0x0659, 0x0665, + 0x066c, 0x066c, 0x0673, 0x0681, 0x068c, 0x0694, 0x069a, 0x06a2, + 0x06a2, 0x06b8, 0x06c2, 0x06c2, 0x06c6, 0x06d0, 0x06d0, 0x06e4, + 0x06e8, 0x06e8, 0x06ec, 0x06f5, 0x0701, 0x0707, 0x0715, 0x0725, + 0x072b, 0x0730, 0x0736, 0x0747, 0x074d, 0x0755, 0x075c, 0x0765, + 0x076b, 0x076b, 0x0772, 0x077a, 0x0787, 0x078f, 0x07a9, 0x07b3, + 0x07cd, 0x07e7, 0x07f2, 0x07fa, 0x080a, 0x0810, 0x0810, 0x0817, + // Entry 100 - 13F + 0x081d, 0x082c, 0x0831, 0x083a, + }, + }, + { // bn + bnRegionStr, + bnRegionIdx, + }, + { // bo + "རྒྱ་ནགའཇར་མན་དབྱིན་ཇི་རྒྱ་གར་ཨི་ཀྲར་ལི་ཉི་ཧོང་ལྷོ་ཀོ་རི་ཡ།བལ་ཡུལ་ཨུ་རུ་ས" + + "ུ་ཨ་མེ་རི་ཀ།མིའི་ཤེས་རྟོགས་མ་བྱུང་བའི་ཁོར་ཡུགའཛམ་གླིང་།", + []uint16{ // 262 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, + 0x0012, 0x0012, 0x0012, 0x0012, 0x0027, 0x0027, 0x0027, 0x0027, + // Entry 40 - 7F + 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, + 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, + 0x0027, 0x0027, 0x0027, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, + 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, + 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, + 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, + 0x0057, 0x0057, 0x0057, 0x0057, 0x0057, 0x0075, 0x0075, 0x0075, + 0x0075, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, 0x008a, + // Entry 80 - BF + 0x008a, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00c3, + 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, + 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, + // Entry C0 - FF + 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00c3, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, + 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x00fc, + // Entry 100 - 13F + 0x00fc, 0x00fc, 0x00fc, 0x00fc, 0x015f, 0x017d, + }, + }, + { // bo-IN + "ཨོཤི་ཡཱན་ན།", + []uint16{ // 266 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 80 - BF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry C0 - FF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 100 - 13F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0021, + }, + }, + { // br + "Enez AscensionAndorraEmirelezhioù Arab UnanetAfghanistanAntigua ha Barbu" + + "daAnguillaAlbaniaArmeniaAntilhez NederlandatAngolaAntarktikaArcʼhant" + + "inaSamoa AmerikanAostriaAostraliaArubaInizi ÅlandAzerbaidjanBosnia h" + + "a HerzegovinaBarbadosBangladeshBelgiaBurkina FasoBulgariaBahreinBuru" + + "ndiBeninSaint BarthélemyBermudaBruneiBoliviaKarib NederlandatBrazilB" + + "ahamasBhoutanEnez BouvetBotswanaBelarusBelizeKanadaInizi KokozKongo " + + "- KinshasaRepublik KreizafrikanKongo - BrazzavilleSuisAod an Olifant" + + "Inizi CookChileKamerounSinaKolombiaEnez ClippertonCosta RicaKubaKab-" + + "GlasCuraçaoEnez ChristmasKiprenezRepublik TchekAlamagnDiego GarciaDj" + + "iboutiDanmarkDominicaRepublik DominikanAljeriaCeuta ha MelillaEcuado" + + "rEstoniaEgiptSahara ar CʼhornôgEritreaSpagnEtiopiaUnaniezh EuropaFin" + + "landFidjiInizi FalklandMikroneziaInizi FaeroFrañsGabonRouantelezh-Un" + + "anetGrenadaJorjiaGwiana cʼhallGwernenezGhanaJibraltarGreunlandGambia" + + "GineaGwadeloupGinea ar CʼhehederGresInizi Georgia ar Su hag Inizi Sa" + + "ndwich ar SuGuatemalaGuamGinea-BissauGuyanaHong Kong RMD SinaInizi H" + + "eard ha McDonaldHondurasKroatiaHaitiHungariaInizi KanariezIndoneziaI" + + "werzhonIsraelEnez VanavIndiaTiriad breizhveurat Meurvor IndezIraqIra" + + "nIslandItaliaJerzenezJamaikaJordaniaJapanKenyaKyrgyzstanKambodjaKiri" + + "batiKomorezSaint Kitts ha NevisKorea an NorzhKorea ar SuKoweitInizi " + + "CaymanKazakstanLaosLibanSaint LuciaLiechtensteinSri LankaLiberiaLeso" + + "thoLituaniaLuksembourgLatviaLibiaMarokoMonacoMoldovaMontenegroSaint " + + "MartinMadagaskarInizi MarshallMakedoniaMaliMyanmar (Birmania)Mongoli" + + "aMacau RMD SinaInizi Mariana an NorzhMartinikMaouritaniaMontserratMa" + + "ltaMorisMaldivezMalawiMecʼhikoMalaysiaMozambikNamibiaKaledonia Nevez" + + "NigerEnez NorfolkNigeriaNicaraguaIzelvroioùNorvegiaNepalNauruNiueZel" + + "and-NevezOmanPanamáPerouPolinezia CʼhallPapoua Ginea-NevezFilipinezP" + + "akistanPoloniaSant-Pêr-ha-MikelonEnez PitcairnPuerto RicoTiriadoù Pa" + + "lestinaPortugalPalauParaguayQatarOseania diabellAr ReünionRoumaniaSe" + + "rbiaRusiaRwandaArabia SaoudatInizi SalomonSechelezSoudanSvedenSingap" + + "ourSaint-HelenaSloveniaSvalbardSlovakiaSierra LeoneSan MarinoSenegal" + + "SomaliaSurinamSusoudanSão Tomé ha PríncipeSalvadorSint MaartenSiriaS" + + "wazilandTristan da CunhaInizi Turks ha CaicosTchadDouaroù aostral Fr" + + "añsTogoThailandTadjikistanTokelauTimor-LesteTurkmenistanTuniziaTonga" + + "TurkiaTrinidad ha TobagoTuvaluTaiwanTanzaniaUkrainaOugandaInizi diab" + + "ell ar Stadoù-UnanetStadoù-UnanetUruguayOuzbekistanVatikanSant Visan" + + "t hag ar GrenadinezVenezuelaInizi Gwercʼh Breizh-VeurInizi Gwercʼh a" + + "r Stadoù-UnanetViêt NamVanuatuWallis ha FutunaSamoaKosovoYemenMayott" + + "eSuafrikaZambiaZimbabweRannved dianavBedAfrikaNorzhamerikaSuamerikaO" + + "seaniaAfrika ar CʼhornôgKreizamerikaAfrika ar ReterAfrika an NorzhAf" + + "rika ar CʼhreizAfrika ar SuAmerikaoùAmerika an NorzhKaribAzia ar Ret" + + "erAzia ar SuAzia ar GevredEuropa ar SuAostralaziaMelaneziaRannved Mi" + + "kroneziaPolineziaAziaAzia ar CʼhreizAzia ar CʼhornôgEuropaEuropa ar " + + "ReterEuropa an NorzhEuropa ar CʼhornôgAmerika Latin", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x000e, 0x0015, 0x002e, 0x0039, 0x004b, 0x0053, 0x005a, + 0x0061, 0x0075, 0x007b, 0x0085, 0x0091, 0x009f, 0x00a6, 0x00af, + 0x00b4, 0x00c0, 0x00cb, 0x00e0, 0x00e8, 0x00f2, 0x00f8, 0x0104, + 0x010c, 0x0113, 0x011a, 0x011f, 0x0130, 0x0137, 0x013d, 0x0144, + 0x0155, 0x015b, 0x0162, 0x0169, 0x0174, 0x017c, 0x0183, 0x0189, + 0x018f, 0x019a, 0x01aa, 0x01bf, 0x01d2, 0x01d6, 0x01e4, 0x01ee, + 0x01f3, 0x01fb, 0x01ff, 0x0207, 0x0216, 0x0220, 0x0224, 0x022c, + 0x0234, 0x0242, 0x024a, 0x0258, 0x025f, 0x026b, 0x0273, 0x027a, + // Entry 40 - 7F + 0x0282, 0x0294, 0x029b, 0x02ab, 0x02b2, 0x02b9, 0x02be, 0x02d2, + 0x02d9, 0x02de, 0x02e5, 0x02f4, 0x02fb, 0x0300, 0x030e, 0x0318, + 0x0323, 0x0329, 0x032e, 0x0340, 0x0347, 0x034d, 0x035b, 0x0364, + 0x0369, 0x0372, 0x037b, 0x0381, 0x0386, 0x038f, 0x03a2, 0x03a6, + 0x03d2, 0x03db, 0x03df, 0x03eb, 0x03f1, 0x0403, 0x041a, 0x0422, + 0x0429, 0x042e, 0x0436, 0x0444, 0x044d, 0x0455, 0x045b, 0x0465, + 0x046a, 0x048b, 0x048f, 0x0493, 0x0499, 0x049f, 0x04a7, 0x04ae, + 0x04b6, 0x04bb, 0x04c0, 0x04ca, 0x04d2, 0x04da, 0x04e1, 0x04f5, + // Entry 80 - BF + 0x0503, 0x050e, 0x0514, 0x0520, 0x0529, 0x052d, 0x0532, 0x053d, + 0x054a, 0x0553, 0x055a, 0x0561, 0x0569, 0x0574, 0x057a, 0x057f, + 0x0585, 0x058b, 0x0592, 0x059c, 0x05a8, 0x05b2, 0x05c0, 0x05c9, + 0x05cd, 0x05df, 0x05e7, 0x05f5, 0x060b, 0x0613, 0x061e, 0x0628, + 0x062d, 0x0632, 0x063a, 0x0640, 0x0649, 0x0651, 0x0659, 0x0660, + 0x066f, 0x0674, 0x0680, 0x0687, 0x0690, 0x069b, 0x06a3, 0x06a8, + 0x06ad, 0x06b1, 0x06bd, 0x06c1, 0x06c8, 0x06cd, 0x06de, 0x06f0, + 0x06f9, 0x0701, 0x0708, 0x071c, 0x0729, 0x0734, 0x0747, 0x074f, + // Entry C0 - FF + 0x0754, 0x075c, 0x0761, 0x0770, 0x077b, 0x0783, 0x0789, 0x078e, + 0x0794, 0x07a2, 0x07af, 0x07b7, 0x07bd, 0x07c3, 0x07cc, 0x07d8, + 0x07e0, 0x07e8, 0x07f0, 0x07fc, 0x0806, 0x080d, 0x0814, 0x081b, + 0x0823, 0x083a, 0x0842, 0x084e, 0x0853, 0x085c, 0x086c, 0x0881, + 0x0886, 0x089d, 0x08a1, 0x08a9, 0x08b4, 0x08bb, 0x08c6, 0x08d2, + 0x08d9, 0x08de, 0x08e4, 0x08f6, 0x08fc, 0x0902, 0x090a, 0x0911, + 0x0918, 0x0937, 0x0945, 0x094c, 0x0957, 0x095e, 0x097b, 0x0984, + 0x099e, 0x09be, 0x09c7, 0x09ce, 0x09de, 0x09e3, 0x09e9, 0x09ee, + // Entry 100 - 13F + 0x09f5, 0x09fd, 0x0a03, 0x0a0b, 0x0a19, 0x0a1c, 0x0a22, 0x0a2e, + 0x0a37, 0x0a3e, 0x0a52, 0x0a5e, 0x0a6d, 0x0a7c, 0x0a8e, 0x0a9a, + 0x0aa4, 0x0ab4, 0x0ab9, 0x0ac6, 0x0ad0, 0x0ade, 0x0aea, 0x0af5, + 0x0afe, 0x0b10, 0x0b19, 0x0b1d, 0x0b2d, 0x0b3f, 0x0b45, 0x0b54, + 0x0b63, 0x0b77, 0x0b84, + }, + }, + { // brx + "ऍन्डोरासंयुक्त अरब अमीरातअफ़ग़ानिस्तानएन्टिगुआ एवं बारबूडाएंगीलाअल्बानिय" + + "ाआर्मेनियानीदरलैंड्स एंटिलीज़अंगोलाअंटार्कटिकाअर्जेण्टिनाअमरिकी सम" + + "ोआऑस्ट्रियाऑस्ट्रेलियाअरूबाआलाँड द्वीपअज़रबैजानबोसनिया हर्ज़ेगोविन" + + "ाबारबाडोसबंगलादेशबेल्जियमबुर्किना फासोबल्गैरियाबहरैनबुरुंडीबेनेँसे" + + "ँ बार्थेलेमीबरमूडाब्रूनइबोलीवियाब्राज़ीलबहामाभूटानबुवे द्वीपबोत्स्" + + "वानाबेलारूसबेलिज़कैनाडाकोकोस द्वीपकॉंगो किनशासासेंट्रल अफ्रीकन रिप" + + "ब्लिककॉंगो ब्राज़्ज़ावीलस्वित्ज़रलैंडआईवरी कोस्टकुक द्वीपचिलीकोमेर" + + "ानचीनकोलम्बियाकोस्टारीकाक्यूबाकैप वेर्देक्रिस्मस द्वीपसाइप्रसचेक ग" + + "णराज्यजर्मनीद्जिबूतीडेनमार्कडोमिनिकाडोमिनिकन गणराज्यअल्जीरियाएक्वा" + + "डोरएस्टोनियामिस्रपश्चिमी सहाराएरिट्रियास्पेनइथिओपियायूरोपीय संघफिन" + + "लैंडफिजीफ़ॉल्कलैंड द्वीपमाइक्रोनेशियाफरो द्वीपफ्राँसगैबॉनब्रितनग्र" + + "ेनडाजॉर्जियाफ्राँसीसी गिआनागेर्नसेघानाजिब्राल्टरग्रीनलैण्डगाम्बिया" + + "गिनीग्वादलुपइक्वेटोरियल गिनीग्रीसदक्षिण जोर्जिया एवं दक्षिण सैंडवी" + + "च द्वीपगोतेदालागुआमगीनी-बिसाउगुयानाहाँगकाँग विशेष प्रशासनिक क्षेत्" + + "र चीनहर्ड द्वीप एवं मैकडोनॉल्ड द्वीपहौण्डूरासक्रोएशियाहाइतीहंगरीइं" + + "डोनेशियाआयरलैंडइस्राइलआईल ऑफ़ मैनभारतब्रिटिश हिंद महासागरिय क्षेत्" + + "रईराक़ईरानआइसलैंडइटलीजर्सीजमाइकाजॉर्डनजापानकेन्याकिर्गिज़कम्बोडिया" + + "किरिबातीकोमोरोज़सेंट किट्स एवं नेविसउत्तर कोरियादक्षिण कोरियाकुवैत" + + "केमैन द्वीपकज़ाखस्तानलाओसलेबनोनसेंट लूसियालिक्टैनस्टाईनश्री लँकाला" + + "इबेरियालसोथोलिथुआनियालक्समबर्गलाट्वीयालीबियामोरोक्कोमोनाकोमोल्डेवि" + + "यामोंटेनेग्रोसेँ मार्टेँमदागास्करमार्शल द्वीपमैसेडोनियामालीम्यानमा" + + "रमंगोलियामकाओ विशेष प्रशासनिक क्षेत्र (चीन)उत्तरी मारियाना द्वीपमा" + + "र्टीनिकमॉरिटेनियामॉंसेरामाल्टामॉरिसमालदीवमलावीमैक्सिकोमलेशियामोज़ा" + + "म्बिकनामीबियान्यू कैलेडोनियानाइजेरनॉरफ़ॉक द्वीपनाइजीरियानिकारागुआन" + + "ेदरलैण्डनॉर्वेनेपालनाउरूनीयूएन्यूज़ीलैंडओमानपनामापेरूफ्राँसीसी पॉल" + + "िनीशियापापुआ न्यू गिनीफिलीपिन्सपाकिस्तानपोलैण्डसेँ पीएर एवं मि" + + "\u200dकेलॉंपिटकेर्नपुएर्टो रीकोफ़िलिस्तीनपुर्तगालपलाऊपारागुएक़तारबाह" + + "रिय ओशेआनियारेयूनियॉंरोमानियासर्बियारूसरूआण्डासऊदी अरबसॉलोमन द्वीप" + + "सेशेल्ससूदानस्वीडनसिंगापुरसेण्\u200dट हेलेनास्लोवेनियास्वाल्बार्ड " + + "एवं यान मायेनस्लोवाकियासियेरा लेओनसैन मरीनोसेनेगालसोमालियासुरिनामस" + + "ाउँ-तोमे एवं प्रिंसिपऍल साल्वाडोरसीरियास्वाज़ीलैंडतुर्की एवं कैकोज" + + "़ द्वीपचाडफ्राँसीसी उत्तरी क्षेत्रोंटोगोथाइलैण्डताजिकिस्तानटोकेलौप" + + "ूर्वी तिमोरतुर्कमेनीस्तानत्युनिशियाटॉंगातुर्कीट्रिनिडाड एवं टोबैगो" + + "तुवालुताइवानतंज़ानियायूक्रेनयुगाँडायुनाइटेड स्टेट्स के छोटे बाहरिय" + + " द्वीपसंयुक्त राज्य अमरिकायुरूगुएउज़बेकिस्तानवैटिकनसेंट विंसंट एवं द" + + "ी ग्रनाडीन्स्वेनेज़ुएलाब्रिटिश वर्जीन आईलंड्सयु.एस. वर्जीन आईलंड्स" + + "वियतनामवानाऊटुवॉलेस एवं फ़्यूचूनासमोआयमनमैयौटदक्षिण अफ्रीकाज़ाम्बि" + + "याज़ीम्बाब्वेअज्ञात या अवैध प्रदेशदुनियाअफ्रीकाउत्तर अमरिकादक्षिण " + + "अमरिकाओशेआनियापश्चिमी अफ्रीकामध्य अमरिकापूर्वी अफ्रीकाउत्तरी अफ्री" + + "कामध्य अफ्रीकादक्षिणी अफ्रीकाअमरिकाज़्उत्तरी अमरिकाकैरिबियनपूर्वी " + + "एशियादक्षिणी एशियादक्षिण-पूर्वी एशियादक्षिणी यूरोपऑस्ट्रेलिया एवं " + + "न्यूजीलैंडमेलीनेशियामाईक्रोनेशियापोलीनेशियाएशियामध्य एशियापश्चिमी " + + "ऐशियायूरोपपूर्वी यूरोपउत्तरी यूरोपपश्चिमी यूरोप्लैटिन अमरिका एवं क" + + "रीबी", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0015, 0x0047, 0x006e, 0x00a6, 0x00b8, 0x00d3, + 0x00ee, 0x0125, 0x0137, 0x0158, 0x0179, 0x0198, 0x01b3, 0x01d4, + 0x01e3, 0x0202, 0x021d, 0x0257, 0x026f, 0x0287, 0x029f, 0x02c4, + 0x02df, 0x02ee, 0x0303, 0x0312, 0x033a, 0x034c, 0x035e, 0x0376, + 0x0376, 0x038e, 0x039d, 0x03ac, 0x03c8, 0x03e6, 0x03fb, 0x040d, + 0x041f, 0x043e, 0x0463, 0x04a7, 0x04de, 0x0505, 0x0524, 0x053d, + 0x0549, 0x055e, 0x0567, 0x0582, 0x0582, 0x05a0, 0x05b2, 0x05ce, + 0x05ce, 0x05f6, 0x060b, 0x062a, 0x063c, 0x063c, 0x0654, 0x066c, + // Entry 40 - 7F + 0x0684, 0x06b2, 0x06cd, 0x06cd, 0x06e5, 0x0700, 0x070f, 0x0734, + 0x074f, 0x075e, 0x0776, 0x0795, 0x07aa, 0x07b6, 0x07e4, 0x080b, + 0x0824, 0x0836, 0x0845, 0x0857, 0x086c, 0x0884, 0x08af, 0x08c4, + 0x08d0, 0x08ee, 0x090c, 0x0924, 0x0930, 0x0948, 0x0976, 0x0985, + 0x09f3, 0x0a0b, 0x0a17, 0x0a33, 0x0a45, 0x0aa9, 0x0afe, 0x0b19, + 0x0b34, 0x0b43, 0x0b52, 0x0b52, 0x0b70, 0x0b85, 0x0b9a, 0x0bb7, + 0x0bc3, 0x0c17, 0x0c26, 0x0c32, 0x0c47, 0x0c53, 0x0c62, 0x0c74, + 0x0c86, 0x0c95, 0x0ca7, 0x0cbf, 0x0cda, 0x0cf2, 0x0d0a, 0x0d40, + // Entry 80 - BF + 0x0d62, 0x0d87, 0x0d96, 0x0db5, 0x0dd3, 0x0ddf, 0x0df1, 0x0e10, + 0x0e37, 0x0e50, 0x0e6b, 0x0e7a, 0x0e95, 0x0eb0, 0x0ec8, 0x0eda, + 0x0ef2, 0x0f04, 0x0f22, 0x0f43, 0x0f62, 0x0f7d, 0x0f9f, 0x0fbd, + 0x0fc9, 0x0fe1, 0x0ff9, 0x1053, 0x108e, 0x10a9, 0x10c7, 0x10dc, + 0x10ee, 0x10fd, 0x110f, 0x111e, 0x1136, 0x114b, 0x1169, 0x1181, + 0x11ac, 0x11be, 0x11e3, 0x11fe, 0x1219, 0x1234, 0x1246, 0x1255, + 0x1264, 0x1273, 0x1294, 0x12a0, 0x12af, 0x12bb, 0x12f5, 0x131e, + 0x1339, 0x1354, 0x1369, 0x13a2, 0x13ba, 0x13dc, 0x13fa, 0x1412, + // Entry C0 - FF + 0x141e, 0x1433, 0x1442, 0x146d, 0x1488, 0x14a0, 0x14b5, 0x14be, + 0x14d3, 0x14e9, 0x150b, 0x1520, 0x152f, 0x1541, 0x1559, 0x157e, + 0x159c, 0x15e1, 0x15ff, 0x161e, 0x1637, 0x164c, 0x1664, 0x1679, + 0x1679, 0x16b5, 0x16d7, 0x16d7, 0x16e9, 0x170a, 0x170a, 0x1749, + 0x1752, 0x179c, 0x17a8, 0x17c0, 0x17e1, 0x17f3, 0x1815, 0x183f, + 0x185d, 0x186c, 0x187e, 0x18b6, 0x18c8, 0x18da, 0x18f5, 0x190a, + 0x191f, 0x1984, 0x19bc, 0x19d1, 0x19f5, 0x1a07, 0x1a59, 0x1a77, + 0x1ab5, 0x1aec, 0x1b01, 0x1b16, 0x1b4b, 0x1b57, 0x1b57, 0x1b60, + // Entry 100 - 13F + 0x1b6f, 0x1b97, 0x1bb2, 0x1bd3, 0x1c0c, 0x1c1e, 0x1c33, 0x1c55, + 0x1c7a, 0x1c92, 0x1cbd, 0x1cdc, 0x1d04, 0x1d2c, 0x1d4e, 0x1d79, + 0x1d94, 0x1db9, 0x1dd1, 0x1df3, 0x1e18, 0x1e4d, 0x1e72, 0x1ebc, + 0x1eda, 0x1f01, 0x1f1f, 0x1f2e, 0x1f4a, 0x1f6f, 0x1f7e, 0x1fa0, + 0x1fc2, 0x1fea, 0x2026, + }, + }, + { // bs + "Ostrvo AsensionAndoraUjedinjeni Arapski EmiratiAfganistanAntigva i Barbu" + + "daAngvilaAlbanijaJermenijaHolandski AntiliAngolaAntarktikaArgentinaA" + + "merička SamoaAustrijaAustralijaArubaAlandska OstrvaAzerbejdžanBosna " + + "i HercegovinaBarbadosBangladešBelgijaBurkina FasoBugarskaBahreinBuru" + + "ndiBeninSveti BartolomejBermudaBrunejBolivijaKaripska HolandijaBrazi" + + "lBahamiButanBuve OstrvaBocvanaBjelorusijaBelizeKanadaKokosova (Kilin" + + "gova) ostrvaDemokratska Republika KongoCentralnoafrička RepublikaKon" + + "goŠvicarskaObala SlonovačeKukova OstrvaČileKamerunKinaKolumbijaOstrv" + + "o KlipertonKostarikaKubaKape VerdeKurasaoBožićna OstrvaKiparČeškaNje" + + "mačkaDijego GarsijaDžibutiDanskaDominikaDominikanska RepublikaAlžirS" + + "euta i MeliljaEkvadorEstonijaEgipatZapadna SaharaEritrejaŠpanijaEtio" + + "pijaEvropska UnijaFinskaFidžiFolklandska OstrvaMikronezijaFarska Ost" + + "rvaFrancuskaGabonVelika BritanijaGrenadaGruzijaFrancuska GvajanaGern" + + "ziGanaGibraltarGrenlandGambijaGvinejaGvadelupeEkvatorijalna GvinejaG" + + "rčkaJužna Džordžija i Južna Sendvič OstrvaGvatemalaGuamGvineja-Bisao" + + "GvajanaHong Kong (S. A. R. Kina)Heard i arhipelag McDonaldHondurasHr" + + "vatskaHaitiMađarskaKanarska ostrvaIndonezijaIrskaIzraelOstrvo ManInd" + + "ijaBritanska Territorija u Indijskom OkeanuIrakIranIslandItalijaDžer" + + "siJamajkaJordanJapanKenijaKirgizstanKambodžaKiribatiKomorska OstrvaS" + + "ent Kits i NevisSjeverna KorejaJužna KorejaKuvajtKajmanska OstrvaKaz" + + "ahstanLaosLibanSveta LucijaLihtenštajnŠri LankaLiberijaLesotoLitvani" + + "jaLuksemburgLetonijaLibijaMarokoMonakoMoldavijaCrna GoraSv. MartinMa" + + "dagaskarMaršalska OstrvaMakedonijaMaliMijanmarMongolijaMakao (S. A. " + + "R. Kina)Sjeverna Marijanska OstrvaMartinikMauritanijaMonseratMaltaMa" + + "uriciusMaldiviMalaviMeksikoMalezijaMozambikNamibijaNova KaledonijaNi" + + "gerNorfolk OstrvoNigerijaNikaragvaHolandijaNorveškaNepalNauruNiueNov" + + "i ZelandOmanPanamaPeruFrancuska PolinezijaPapua Nova GvinejaFilipini" + + "PakistanPoljskaSveti Petar i MikelonPitkernPorto RikoPalestinska Ter" + + "itorijaPortugalPalauParagvajKatarOstala OkeanijaRejunionRumunijaSrbi" + + "jaRusijaRuandaSaudijska ArabijaSolomonska OstrvaSejšeliSudanŠvedskaS" + + "ingapurSveta HelenaSlovenijaSvalbard i Jan MajenSlovačkaSijera Leone" + + "San MarinoSenegalSomalijaSurinamJužni SudanSao Tome i PrincipeSalvad" + + "orSint MartenSirijaSvazilendTristan da KunjaOstrva Turks i CaicosČad" + + "Francuske Južne TeritorijeTogoTajlandTadžikistanTokelauTimor LesteTu" + + "rkmenistanTunisTongaTurskaTrinidad i TobagoTuvaluTajvanTanzanijaUkra" + + "jinaUgandaUdaljena ostrva SADSjedinjene Američke DržaveUrugvajUzbeki" + + "stanVatikanSveti Vincent i GrenadiniVenecuelaBritanska Djevičanska O" + + "strvaDjevičanska Ostrva SADVijetnamVanuatuWallis i FutunaSamoaKosovo" + + "JemenMajoteJužnoafrička RepublikaZambijaZimbabveNepoznata oblastSvij" + + "etAfrikaSjevernoamerički kontinentJužna AmerikaOkeanijaZapadna Afrik" + + "aCentralna AmerikaIstočna AfrikaSjeverna AfrikaCentralna AfrikaJužna" + + " AfrikaAmerikaSjeverna AmerikaKaribiIstočna AzijaJužna AzijaJugoisto" + + "čna AzijaJužna EvropaAustralazijaMelanezijaMikronezijski RegionPoli" + + "nezijaAzijaCentralna AzijaZapadna AzijaEvropaIstočna EvropaSjeverna " + + "EvropaZapadna EvropaLatinska Amerika", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x000f, 0x0015, 0x002f, 0x0039, 0x004a, 0x0051, 0x0059, + 0x0062, 0x0072, 0x0078, 0x0082, 0x008b, 0x009a, 0x00a2, 0x00ac, + 0x00b1, 0x00c0, 0x00cc, 0x00df, 0x00e7, 0x00f1, 0x00f8, 0x0104, + 0x010c, 0x0113, 0x011a, 0x011f, 0x012f, 0x0136, 0x013c, 0x0144, + 0x0156, 0x015c, 0x0162, 0x0167, 0x0172, 0x0179, 0x0184, 0x018a, + 0x0190, 0x01ab, 0x01c6, 0x01e1, 0x01e6, 0x01f0, 0x0200, 0x020d, + 0x0212, 0x0219, 0x021d, 0x0226, 0x0236, 0x023f, 0x0243, 0x024d, + 0x0254, 0x0264, 0x0269, 0x0270, 0x0279, 0x0287, 0x028f, 0x0295, + // Entry 40 - 7F + 0x029d, 0x02b3, 0x02b9, 0x02c8, 0x02cf, 0x02d7, 0x02dd, 0x02eb, + 0x02f3, 0x02fb, 0x0303, 0x0311, 0x0317, 0x031d, 0x032f, 0x033a, + 0x0347, 0x0350, 0x0355, 0x0365, 0x036c, 0x0373, 0x0384, 0x038a, + 0x038e, 0x0397, 0x039f, 0x03a6, 0x03ad, 0x03b6, 0x03cb, 0x03d1, + 0x03fc, 0x0405, 0x0409, 0x0416, 0x041d, 0x0436, 0x0450, 0x0458, + 0x0460, 0x0465, 0x046e, 0x047d, 0x0487, 0x048c, 0x0492, 0x049c, + 0x04a2, 0x04ca, 0x04ce, 0x04d2, 0x04d8, 0x04df, 0x04e6, 0x04ed, + 0x04f3, 0x04f8, 0x04fe, 0x0508, 0x0511, 0x0519, 0x0528, 0x0539, + // Entry 80 - BF + 0x0548, 0x0555, 0x055b, 0x056b, 0x0574, 0x0578, 0x057d, 0x0589, + 0x0595, 0x059f, 0x05a7, 0x05ad, 0x05b6, 0x05c0, 0x05c8, 0x05ce, + 0x05d4, 0x05da, 0x05e3, 0x05ec, 0x05f6, 0x0600, 0x0611, 0x061b, + 0x061f, 0x0627, 0x0630, 0x0645, 0x065f, 0x0667, 0x0672, 0x067a, + 0x067f, 0x0688, 0x068f, 0x0695, 0x069c, 0x06a4, 0x06ac, 0x06b4, + 0x06c3, 0x06c8, 0x06d6, 0x06de, 0x06e7, 0x06f0, 0x06f9, 0x06fe, + 0x0703, 0x0707, 0x0712, 0x0716, 0x071c, 0x0720, 0x0734, 0x0746, + 0x074e, 0x0756, 0x075d, 0x0772, 0x0779, 0x0783, 0x0799, 0x07a1, + // Entry C0 - FF + 0x07a6, 0x07ae, 0x07b3, 0x07c2, 0x07ca, 0x07d2, 0x07d8, 0x07de, + 0x07e4, 0x07f5, 0x0806, 0x080e, 0x0813, 0x081b, 0x0823, 0x082f, + 0x0838, 0x084c, 0x0855, 0x0861, 0x086b, 0x0872, 0x087a, 0x0881, + 0x088d, 0x08a0, 0x08a8, 0x08b3, 0x08b9, 0x08c2, 0x08d2, 0x08e7, + 0x08eb, 0x0906, 0x090a, 0x0911, 0x091d, 0x0924, 0x092f, 0x093b, + 0x0940, 0x0945, 0x094b, 0x095c, 0x0962, 0x0968, 0x0971, 0x0979, + 0x097f, 0x0992, 0x09ae, 0x09b5, 0x09bf, 0x09c6, 0x09df, 0x09e8, + 0x0a05, 0x0a1c, 0x0a24, 0x0a2b, 0x0a3a, 0x0a3f, 0x0a45, 0x0a4a, + // Entry 100 - 13F + 0x0a50, 0x0a68, 0x0a6f, 0x0a77, 0x0a87, 0x0a8d, 0x0a93, 0x0aae, + 0x0abc, 0x0ac4, 0x0ad2, 0x0ae3, 0x0af2, 0x0b01, 0x0b11, 0x0b1e, + 0x0b25, 0x0b35, 0x0b3b, 0x0b49, 0x0b55, 0x0b67, 0x0b74, 0x0b80, + 0x0b8a, 0x0b9e, 0x0ba8, 0x0bad, 0x0bbc, 0x0bc9, 0x0bcf, 0x0bde, + 0x0bed, 0x0bfb, 0x0c0b, + }, + }, + { // bs-Cyrl + "Острво АсенсионАндораУједињени Арапски ЕмиратиАвганистанАнтигва и Барбуд" + + "аАнгвилаАлбанијаАрменијаХоландски АнтилиАнголаАнтарктикАргентинаАме" + + "ричка СамоаАустријаАустралијаАрубаАландска острваАзербејџанБосна и " + + "ХерцеговинаБарбадосБангладешБелгијаБуркина ФасоБугарскаБахреинБурун" + + "диБенинСвети БартоломејБермудаБрунејБоливијаБразилБахамиБутанБуве О" + + "стрваБоцванаБелорусијаБелизеКанадаКокос (Келинг) ОстрваКонго - Кинш" + + "асаЦентрално Афричка РепубликаКонго - БразавилШвајцарскаОбала Слоно" + + "вачеКукова ОстрваЧилеКамерунКинаКолумбијаОстрво КлипертонКостарикаК" + + "убаКапе ВердеБожићна острваКипарЧешкаНемачкаДијего ГарсијаЏибутиДан" + + "скаДоминикаДоминиканска РепубликаАлжирСеута и МелиљаЕквадорЕстонија" + + "ЕгипатЗападна СахараЕритрејаШпанијаЕтиопијаЕвропска УнијаФинскаФиџи" + + "Фокландска острваМикронезијаФарска ОстрваФранцускаГабонВелика Брита" + + "нијаГренадаГрузијаФранцуска ГвајанаГурнсиГанаГибралтарГренландГамби" + + "јаГвинејаГваделупеЕкваторијална ГвинејаГрчкаЈужна Џорџија и Јужна С" + + "ендвич ОстрваГватемалаГуамГвинеја-БисаоГвајанаХонг Конг С. А. Р. Ки" + + "наХерд и Мекдоналд ОстрваХондурасХрватскаХаитиМађарскаКанарска остр" + + "ваИндонезијаИрскаИзраелОстрво МанИндијаБританска територија у Индиј" + + "ском океануИракИранИсландИталијаЏерсиЈамајкаЈорданЈапанКенијаКиргиз" + + "станКамбоџаКирибатиКоморска ОстрваСент Китс и НевисСеверна КорејаЈу" + + "жна КорејаКувајтКајманска ОстрваКазахстанЛаосЛибанСент ЛуцијаЛихтен" + + "штајнШри ЛанкаЛиберијаЛесотоЛитванијаЛуксембургЛетонијаЛибијаМароко" + + "МонакоМолдавијаЦрна ГораСент МартинМадагаскарМаршалска ОстрваМакедо" + + "нијаМалиМијанмар (Бурма)МонголијаМакао С. А. Р. КинаСеверна Маријан" + + "ска ОстрваМартиникМауританијаМонсератМалтаМаурицијусМалдивиМалавиМе" + + "ксикоМалезијаМозамбикНамибијаНова КаледонијаНигерНорфолк ОстрвоНиге" + + "ријаНикарагваХоландијаНорвешкаНепалНауруНиуеНови ЗеландОманПанамаПе" + + "руФранцуска ПолинезијаПапуа Нова ГвинејаФилипиниПакистанПољскаСен П" + + "јер и МикелонПиткернПорто РикоПалестинске територијеПортугалијаПала" + + "уПарагвајКатарОстала океанијаРеинионРумунијаСрбијаРусијаРуандаСауди" + + "јска АрабијаСоломонска ОстрваСејшелиСуданШведскаСингапурСвета Јелен" + + "аСловенијаСвалбард и Јанмајен ОстрваСловачкаСијера ЛеонеСан МариноС" + + "енегалСомалијаСуринамСао Томе и ПринципеСалвадорСиријаСвазилендТрис" + + "тан да КуњаТуркс и Кајкос ОстрваЧадФранцуске Јужне ТериторијеТогоТа" + + "јландТаџикистанТокелауИсточни ТиморТуркменистанТунисТонгаТурскаТрин" + + "идад и ТобагоТувалуТајванТанзанијаУкрајинаУгандаМања удаљена острва" + + " САДСједињене Америчке ДржавеУругвајУзбекистанВатиканСент Винсент и " + + "ГренадиниВенецуелаБританска Девичанска ОстрваС.А.Д. Девичанска Остр" + + "ваВијетнамВануатуВалис и Футуна ОстрваСамоаЈеменМајотеЈужноафричка " + + "РепубликаЗамбијаЗимбабвеНепозната или неважећа областСветАфрикаСеве" + + "рноамерички континентЈужна АмерикаОкеанијаЗападна АфрикаЦентрална А" + + "мерикаИсточна АфрикаСеверна АфрикаЦентрална АфрикаЈужна АфрикаАмери" + + "кеСеверна АмерикаКарибиИсточна АзијаЈужна АзијаЈугоисточна АзијаЈуж" + + "на ЕвропаАустралија и Нови ЗеландМеланезијаМикронезијски регионПоли" + + "незијаАзијаЦентрална АзијаЗападна АзијаЕвропаИсточна ЕвропаСеверна " + + "ЕвропаЗападна ЕвропаЛатинска Америка", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x001d, 0x0029, 0x0059, 0x006d, 0x008d, 0x009b, 0x00ab, + 0x00bb, 0x00da, 0x00e6, 0x00f8, 0x010a, 0x0125, 0x0135, 0x0149, + 0x0153, 0x0170, 0x0184, 0x01a8, 0x01b8, 0x01ca, 0x01d8, 0x01ef, + 0x01ff, 0x020d, 0x021b, 0x0225, 0x0244, 0x0252, 0x025e, 0x026e, + 0x026e, 0x027a, 0x0286, 0x0290, 0x02a5, 0x02b3, 0x02c7, 0x02d3, + 0x02df, 0x0305, 0x0320, 0x0354, 0x0371, 0x0385, 0x03a2, 0x03bb, + 0x03c3, 0x03d1, 0x03d9, 0x03eb, 0x040a, 0x041c, 0x0424, 0x0437, + 0x0437, 0x0452, 0x045c, 0x0466, 0x0474, 0x048f, 0x049b, 0x04a7, + // Entry 40 - 7F + 0x04b7, 0x04e2, 0x04ec, 0x0506, 0x0514, 0x0524, 0x0530, 0x054b, + 0x055b, 0x0569, 0x0579, 0x0594, 0x05a0, 0x05a8, 0x05c9, 0x05df, + 0x05f8, 0x060a, 0x0614, 0x0633, 0x0641, 0x064f, 0x0670, 0x067c, + 0x0684, 0x0696, 0x06a6, 0x06b4, 0x06c2, 0x06d4, 0x06fd, 0x0707, + 0x074a, 0x075c, 0x0764, 0x077d, 0x078b, 0x07b1, 0x07dc, 0x07ec, + 0x07fc, 0x0806, 0x0816, 0x0833, 0x0847, 0x0851, 0x085d, 0x0870, + 0x087c, 0x08c6, 0x08ce, 0x08d6, 0x08e2, 0x08f0, 0x08fa, 0x0908, + 0x0914, 0x091e, 0x092a, 0x093e, 0x094c, 0x095c, 0x0979, 0x0998, + // Entry 80 - BF + 0x09b3, 0x09ca, 0x09d6, 0x09f5, 0x0a07, 0x0a0f, 0x0a19, 0x0a2e, + 0x0a44, 0x0a55, 0x0a65, 0x0a71, 0x0a83, 0x0a97, 0x0aa7, 0x0ab3, + 0x0abf, 0x0acb, 0x0add, 0x0aee, 0x0b03, 0x0b17, 0x0b36, 0x0b4a, + 0x0b52, 0x0b6f, 0x0b81, 0x0ba0, 0x0bd0, 0x0be0, 0x0bf6, 0x0c06, + 0x0c10, 0x0c24, 0x0c32, 0x0c3e, 0x0c4c, 0x0c5c, 0x0c6c, 0x0c7c, + 0x0c99, 0x0ca3, 0x0cbe, 0x0cce, 0x0ce0, 0x0cf2, 0x0d02, 0x0d0c, + 0x0d16, 0x0d1e, 0x0d33, 0x0d3b, 0x0d47, 0x0d4f, 0x0d76, 0x0d98, + 0x0da8, 0x0db8, 0x0dc4, 0x0de5, 0x0df3, 0x0e06, 0x0e31, 0x0e47, + // Entry C0 - FF + 0x0e51, 0x0e61, 0x0e6b, 0x0e88, 0x0e96, 0x0ea6, 0x0eb2, 0x0ebe, + 0x0eca, 0x0eeb, 0x0f0c, 0x0f1a, 0x0f24, 0x0f32, 0x0f42, 0x0f59, + 0x0f6b, 0x0f9c, 0x0fac, 0x0fc3, 0x0fd6, 0x0fe4, 0x0ff4, 0x1002, + 0x1002, 0x1025, 0x1035, 0x1035, 0x1041, 0x1053, 0x106f, 0x1096, + 0x109c, 0x10ce, 0x10d6, 0x10e4, 0x10f8, 0x1106, 0x111f, 0x1137, + 0x1141, 0x114b, 0x1157, 0x1177, 0x1183, 0x118f, 0x11a1, 0x11b1, + 0x11bd, 0x11e8, 0x1218, 0x1226, 0x123a, 0x1248, 0x1275, 0x1287, + 0x12bb, 0x12e6, 0x12f6, 0x1304, 0x132b, 0x1335, 0x1335, 0x133f, + // Entry 100 - 13F + 0x134b, 0x1376, 0x1384, 0x1394, 0x13cb, 0x13d3, 0x13df, 0x1410, + 0x1429, 0x1439, 0x1454, 0x1475, 0x1490, 0x14ab, 0x14ca, 0x14e1, + 0x14ef, 0x150c, 0x1518, 0x1531, 0x1546, 0x1567, 0x157e, 0x15ab, + 0x15bf, 0x15e6, 0x15fa, 0x1604, 0x1621, 0x163a, 0x1646, 0x1661, + 0x167c, 0x1697, 0x16b6, + }, + }, + { // ca + caRegionStr, + caRegionIdx, + }, + { // ce + "Айъадаларан гӀайреАндорраӀарбийн Цхьанатоьхна ЭмираташОвхӀан-пачхьалкхАн" + + "тигуа а, Барбуда аАнгильяАлбаниЭрмалойчоьАнголаАнтарктидаАргентинаА" + + "мерикан СамоаАвстриАвстралиАрубаАландан гӀайренашАзербайджанБосни а" + + ", Герцеговина аБарбадосБангладешБельгиБуркина- ФасоБолгариБахрейнБур" + + "ундиБенинСен-БартельмиБермудан гӀайренашБруней-ДаруссаламБоливиБонэ" + + "йр, Синт-Эстатиус а, Саба аБразилиБагаман гӀайренашБутанБувен гӀайр" + + "еБотсванаБелоруссиБелизКанадаКокосийн гӀайренашДемократин Республик" + + "а КонгоЮккъерчу Африкин РеспубликаРеспублика КонгоШвейцариКот-Д’иву" + + "арКукан гӀайренашЧилиКамерунКитайКолумбиКлиппертонКоста-РикаКубаКаб" + + "о-ВердеКюрасаоГӀайре ӏиса пайхӏамар вина деКипрЧехиГерманиДиего-Гар" + + "сиДжибутиДаниДоминикаДоминикан РеспубликаАлжирСеута а, Мелилья аЭкв" + + "адорЭстониМисарМалхбузен СаьхьараЭритрейИспаниЭфиопиЕвробартФинлянд" + + "иФиджиФолклендан гӀайренашМикронезин Федеративни штаташФарерийн гӀа" + + "йренашФранциГабонЙоккха БританиГренадаГуьржийчоьФранцузийн ГвианаГе" + + "рнсиГанаГибралтарГренландиГамбиГвинейГваделупаЭкваторан ГвинейГреци" + + "Къилба Джорджи а, Къилба Гавайн гӀайренаш аГватемалаГуамГвиней-Биса" + + "уГайанаГонконг (ша-къаьстина кӀошт)Херд гӀайре а, Макдональд гӀайре" + + "наш аГондурасХорватиГаитиВенгриКанаран гӀайренашИндонезиИрландиИзра" + + "ильМэн гӀайреИндиБританин латта Индин океанехьӀиракъГӀажарийчоьИсла" + + "ндиИталиДжерсиЯмайкаУрданЯпониКениКиргизиКамбоджаКирибатиКоморашСен" + + "т-Китс а, Невис аКъилбаседа КорейКъилба КорейКувейтКайман гӀайренаш" + + "КазахстанЛаосЛиванСент-ЛюсиЛихтенштейнШри-ЛанкаЛибериЛесотоЛитваЛюк" + + "сембургЛатвиЛивиМароккоМонакоМолдавиӀаьржаламанхойчоьСен-МартенМада" + + "гаскарМаршаллан гӀайренашМакедониМалиМьянма (Бирма)МонголиМакао (ша" + + "-къаьстина кӀошт)Къилбаседа Марианан гӀайренашМартиникаМавританиМонт" + + "серратМальтаМаврикиМальдивашМалавиМексикаМалайзиМозамбикНамибиКерла" + + " КаледониНигерНорфолк гӀайреНигериНикарагуаНидерландашНорвегиНепалНа" + + "уруНиуэКерла ЗеландиОманПанамаПеруФранцузийн ПолинезиПапуа — Керла " + + "ГвинейФилиппинашПакистанПольшаСен-Пьер а, Микелон аПиткэрн гӀайрена" + + "шПуэрто-РикоПалестинан латтанашПортугалиПалауПарагвайКатарАрахьара " + + "ОкеаниРеюньонРумыниСербиРоссиРуандаСаӀудийн АравиСоломонан гӀайрена" + + "шСейшелан гӀайренашСуданШвециСингапурСийлахьчу Еленин гӀайреСловени" + + "Шпицберген а, Ян-Майен аСловакиСьерра- ЛеонеСан-МариноСенегалСомали" + + "СуринамКъилба СуданСан-Томе а, Принсипи аСальвадорСинт-МартенШемаСв" + + "азилендТристан-да- КуньяТёркс а, Кайкос а гӀайренашЧадФранцузийн къ" + + "илба латтанашТогоТаиландТаджикистанТокелауМалхбален ТиморТуркмениТу" + + "нисТонгаТуркойчоьТринидад а, Тобаго аТувалуТайваньТанзаниУкраинаУга" + + "ндаАЦШн арахьара кегийн гӀайренашЦхьанатоьхна ШтаташУругвайУзбекист" + + "анВатиканСент-Винсент а, Гренадинаш аВенесуэлаВиргинийн гӀайренаш (" + + "Британи)Виргинийн гӀайренаш (АЦШ)ВьетнамВануатуУоллис а, Футуна аСа" + + "моаКосовоЙеменМайоттаКъилба-Африкин РеспубликаЗамбиЗимбабвеЙоьвзуш " + + "йоцу регионДерригдуьненанАфрикаКъилбаседа АмерикаКъилба АмерикаОкеа" + + "ниМалхбузен АфрикаЮккъера АмерикаМалхбален АфрикаКъилбаседа АфрикаЮ" + + "ккъера АфрикаКъилба АфрикаКъилбаседа а, къилба а АмерикаКъилбаседа " + + "Америка – АЦШ а, Канада аКарибашЮккъера АзиКъилба АзиКъилба-малхбал" + + "ен АзиКъилба ЕвропаАвстралазиМеланезиМикронезиПолинезиАзиЮккъера Ма" + + "лхбалеЮккъера а, Гергара а МалхбалеЕвропаМалхбален ЕвропаКъилбаседа" + + " ЕвропаМалхбузен ЕвропаЛатинан Америка", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0023, 0x0031, 0x0069, 0x0088, 0x00ac, 0x00ba, 0x00c6, + 0x00da, 0x00da, 0x00e6, 0x00fa, 0x010c, 0x0127, 0x0133, 0x0143, + 0x014d, 0x016e, 0x0184, 0x01ac, 0x01bc, 0x01ce, 0x01da, 0x01f2, + 0x0200, 0x020e, 0x021c, 0x0226, 0x023f, 0x0262, 0x0283, 0x028f, + 0x02c6, 0x02d4, 0x02f5, 0x02ff, 0x0316, 0x0326, 0x0338, 0x0342, + 0x034e, 0x0371, 0x03a5, 0x03d9, 0x03f8, 0x0408, 0x041e, 0x043b, + 0x0443, 0x0451, 0x045b, 0x0469, 0x047d, 0x0490, 0x0498, 0x04ab, + 0x04b9, 0x04ef, 0x04f7, 0x04ff, 0x050d, 0x0522, 0x0530, 0x0538, + // Entry 40 - 7F + 0x0548, 0x056f, 0x0579, 0x0599, 0x05a7, 0x05b3, 0x05bd, 0x05e0, + 0x05ee, 0x05fa, 0x0606, 0x0616, 0x0626, 0x0630, 0x0657, 0x068f, + 0x06b2, 0x06be, 0x06c8, 0x06e3, 0x06f1, 0x0705, 0x0726, 0x0732, + 0x073a, 0x074c, 0x075e, 0x0768, 0x0774, 0x0786, 0x07a5, 0x07af, + 0x07fe, 0x0810, 0x0818, 0x082f, 0x083b, 0x086e, 0x08b2, 0x08c2, + 0x08d0, 0x08da, 0x08e6, 0x0907, 0x0917, 0x0925, 0x0933, 0x0946, + 0x094e, 0x0985, 0x0991, 0x09a7, 0x09b5, 0x09bf, 0x09cb, 0x09d7, + 0x09e1, 0x09eb, 0x09f3, 0x0a01, 0x0a11, 0x0a21, 0x0a2f, 0x0a52, + // Entry 80 - BF + 0x0a71, 0x0a88, 0x0a94, 0x0ab3, 0x0ac5, 0x0acd, 0x0ad7, 0x0ae8, + 0x0afe, 0x0b0f, 0x0b1b, 0x0b27, 0x0b31, 0x0b45, 0x0b4f, 0x0b57, + 0x0b65, 0x0b71, 0x0b7f, 0x0ba1, 0x0bb4, 0x0bc8, 0x0bed, 0x0bfd, + 0x0c05, 0x0c1e, 0x0c2c, 0x0c5b, 0x0c93, 0x0ca5, 0x0cb7, 0x0ccb, + 0x0cd7, 0x0ce5, 0x0cf7, 0x0d03, 0x0d11, 0x0d1f, 0x0d2f, 0x0d3b, + 0x0d56, 0x0d60, 0x0d7b, 0x0d87, 0x0d99, 0x0daf, 0x0dbd, 0x0dc7, + 0x0dd1, 0x0dd9, 0x0df2, 0x0dfa, 0x0e06, 0x0e0e, 0x0e33, 0x0e59, + 0x0e6d, 0x0e7d, 0x0e89, 0x0eae, 0x0ecf, 0x0ee4, 0x0f09, 0x0f1b, + // Entry C0 - FF + 0x0f25, 0x0f35, 0x0f3f, 0x0f5c, 0x0f6a, 0x0f76, 0x0f80, 0x0f8a, + 0x0f96, 0x0fb1, 0x0fd6, 0x0ff9, 0x1003, 0x100d, 0x101d, 0x1049, + 0x1057, 0x1082, 0x1090, 0x10a8, 0x10bb, 0x10c9, 0x10d5, 0x10e3, + 0x10fa, 0x1121, 0x1133, 0x1148, 0x1150, 0x1162, 0x1181, 0x11b2, + 0x11b8, 0x11ea, 0x11f2, 0x1200, 0x1216, 0x1224, 0x1241, 0x1251, + 0x125b, 0x1265, 0x1277, 0x129b, 0x12a7, 0x12b5, 0x12c3, 0x12d1, + 0x12dd, 0x1316, 0x133b, 0x1349, 0x135d, 0x136b, 0x139e, 0x13b0, + 0x13e6, 0x1414, 0x1422, 0x1430, 0x1450, 0x145a, 0x1466, 0x1470, + // Entry 100 - 13F + 0x147e, 0x14ae, 0x14b8, 0x14c8, 0x14ec, 0x1508, 0x1514, 0x1537, + 0x1552, 0x155e, 0x157d, 0x159a, 0x15b9, 0x15da, 0x15f5, 0x160e, + 0x1645, 0x1687, 0x1695, 0x16aa, 0x16bd, 0x16e3, 0x16fc, 0x1710, + 0x1720, 0x1732, 0x1742, 0x1748, 0x1767, 0x179c, 0x17a8, 0x17c7, + 0x17e8, 0x1807, 0x1824, + }, + }, + { // cgg + "AndoraAmahanga ga Buharabu ageeteereineAfuganistaniAngiguwa na BabudaAng" + + "wiraArubaniaArimeniyaAntiri za HoorandiAngoraArigentinaSamowa ya Ame" + + "erikaOsituriaOsitureeriyaArubaAzabagyaniBoziniya na HezegovinaBabado" + + "siBangaradeshiBubirigiBokina FasoBurugariyaBahareniBurundiBeniniBeri" + + "mudaBuruneiBoriiviyaBuraziiriBahamaButaniBotswanaBararusiBerizeKanad" + + "aDemokoratika Ripaaburika ya KongoEihanga rya Rwagati ya AfirikaKong" + + "oSwisiAivore KositiEbizinga bya KuukuChileKameruuniChinaKorombiyaKos" + + "itarikaCubaEbizinga bya KepuvadeSaipurasiRipaaburika ya ZeekiBugirim" + + "aaniGyibutiDeenimaakaDominikaRipaaburika ya DominicaArigyeriyaIkweda" + + "EsitoniyaMisiriEriteriyaSipeyiniEthiyopiyaBufiniFigyiEbizinga bya Fa" + + "akilandaMikironesiyaBufaransaGabooniBungyerezaGurenadaGyogiyaGuyana " + + "ya BufaransaGanaGiburaataGuriinirandiGambiyaGineGwaderupeGuniGuriisi" + + "GwatemaraGwamuGinebisauGuyanaHondurasiKorasiyaHaitiHangareIndoneeziy" + + "aIrerandiIsirairiIndiyaIraakaIraaniAisilandiItareGyamaikaYorudaaniGy" + + "apaaniKenyaKirigizistaniKambodiyaKiribatiKoromoSenti Kittis na Nevis" + + "iKoreya AmatembaKoreya AmashuumaKuweitiEbizinga bya KayimaniKazakisi" + + "taniLayosiLebanoniSenti RusiyaLishenteniSirirankaLiberiyaLesothoLith" + + "uaniaLakizembaagaLatviyaLibyaMoroccoMonacoMoridovaMadagasikaEbizinga" + + " bya MarshaaMasedooniaMariMyanamarMongoriaEbizinga by’amatemba ga Ma" + + "rianaMartiniqueMauriteeniyaMontserratiMaritaMaurishiasiMaridivesMara" + + "wiMexicomarayiziaMozambiqueNamibiyaNiukaredoniaNaigyaEkizinga Norifo" + + "koNaigyeriyaNikaragwaHoorandiNoorweNepoNauruNiueNiuzirandiOmaaniPana" + + "maPeruPolinesia ya BufaransaPapuaFiripinoPakisitaaniPoorandiSenti Pi" + + "yerre na MikweronPitkainiPwetorikoPocugoPalaawuParagwaiKataRiyuniyon" + + "iRomaniyaRrashaRwandaSaudi AreebiyaEbizinga bya SurimaaniShesheresiS" + + "udaniSwideniSingapoSenti HerenaSirovaaniyaSirovaakiyaSirra RiyooniSa" + + "marinoSenegoSomaariyaSurinaamuSawo Tome na PurinsipoEri SalivadoSiri" + + "yaSwazirandiEbizinga bya Buturuki na KaikoChadiTogoTairandiTajikisit" + + "aniTokerawuBurugweizooba bwa TimoriTurukimenisitaniTuniziaTongaButur" + + "uki /TakeTurinidad na TobagoTuvaruTayiwaaniTanzaniaUkureiniUgandaAme" + + "rikaUrugwaiUzibekisitaniVatikaniSenti Vinsent na GurenadiniVenezuwer" + + "aEbizinga bya Virigini ebya BungyerezaEbizinga bya Virigini ebya Ame" + + "rikaViyetinaamuVanuatuWarris na FutunaSamowaYemeniMayoteSausi Afirik" + + "aZambiaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0027, 0x0033, 0x0045, 0x004c, 0x0054, + 0x005d, 0x006f, 0x0075, 0x0075, 0x007f, 0x0091, 0x0099, 0x00a5, + 0x00aa, 0x00aa, 0x00b4, 0x00ca, 0x00d2, 0x00de, 0x00e6, 0x00f1, + 0x00fb, 0x0103, 0x010a, 0x0110, 0x0110, 0x0118, 0x011f, 0x0128, + 0x0128, 0x0131, 0x0137, 0x013d, 0x013d, 0x0145, 0x014d, 0x0153, + 0x0159, 0x0159, 0x017a, 0x0198, 0x019d, 0x01a2, 0x01af, 0x01c1, + 0x01c6, 0x01cf, 0x01d4, 0x01dd, 0x01dd, 0x01e7, 0x01eb, 0x0200, + 0x0200, 0x0200, 0x0209, 0x021d, 0x0228, 0x0228, 0x022f, 0x0239, + // Entry 40 - 7F + 0x0241, 0x0258, 0x0262, 0x0262, 0x0268, 0x0271, 0x0277, 0x0277, + 0x0280, 0x0288, 0x0292, 0x0292, 0x0298, 0x029d, 0x02b4, 0x02c0, + 0x02c0, 0x02c9, 0x02d0, 0x02da, 0x02e2, 0x02e9, 0x02fc, 0x02fc, + 0x0300, 0x0309, 0x0315, 0x031c, 0x0320, 0x0329, 0x032d, 0x0334, + 0x0334, 0x033d, 0x0342, 0x034b, 0x0351, 0x0351, 0x0351, 0x035a, + 0x0362, 0x0367, 0x036e, 0x036e, 0x0379, 0x0381, 0x0389, 0x0389, + 0x038f, 0x038f, 0x0395, 0x039b, 0x03a4, 0x03a9, 0x03a9, 0x03b1, + 0x03ba, 0x03c2, 0x03c7, 0x03d4, 0x03dd, 0x03e5, 0x03eb, 0x0401, + // Entry 80 - BF + 0x0410, 0x0420, 0x0427, 0x043c, 0x0448, 0x044e, 0x0456, 0x0462, + 0x046c, 0x0475, 0x047d, 0x0484, 0x048d, 0x0499, 0x04a0, 0x04a5, + 0x04ac, 0x04b2, 0x04ba, 0x04ba, 0x04ba, 0x04c4, 0x04d8, 0x04e2, + 0x04e6, 0x04ee, 0x04f6, 0x04f6, 0x0517, 0x0521, 0x052d, 0x0538, + 0x053e, 0x0549, 0x0552, 0x0558, 0x055e, 0x0567, 0x0571, 0x0579, + 0x0585, 0x058b, 0x059c, 0x05a6, 0x05af, 0x05b7, 0x05bd, 0x05c1, + 0x05c6, 0x05ca, 0x05d4, 0x05da, 0x05e0, 0x05e4, 0x05fa, 0x05ff, + 0x0607, 0x0612, 0x061a, 0x0633, 0x063b, 0x0644, 0x0644, 0x064a, + // Entry C0 - FF + 0x0651, 0x0659, 0x065d, 0x065d, 0x0667, 0x066f, 0x066f, 0x0675, + 0x067b, 0x0689, 0x069f, 0x06a9, 0x06af, 0x06b6, 0x06bd, 0x06c9, + 0x06d4, 0x06d4, 0x06df, 0x06ec, 0x06f4, 0x06fa, 0x0703, 0x070c, + 0x070c, 0x0722, 0x072e, 0x072e, 0x0734, 0x073e, 0x073e, 0x075c, + 0x0761, 0x0761, 0x0765, 0x076d, 0x0779, 0x0781, 0x0799, 0x07a9, + 0x07b0, 0x07b5, 0x07c3, 0x07d6, 0x07dc, 0x07e5, 0x07ed, 0x07f5, + 0x07fb, 0x07fb, 0x0802, 0x0809, 0x0816, 0x081e, 0x0839, 0x0843, + 0x0868, 0x088a, 0x0895, 0x089c, 0x08ac, 0x08b2, 0x08b2, 0x08b8, + // Entry 100 - 13F + 0x08be, 0x08cb, 0x08d1, 0x08d9, + }, + }, + { // chr + "ᎠᏂᏙᎳᏌᏊ ᎢᏳᎾᎵᏍᏔᏅ ᎡᎳᏈ ᎢᎹᎵᏘᏏᎠᏫᎨᏂᏍᏖᏂᎤᏪᏘ ᎠᎴ ᏆᏊᏓᎠᏂᎩᎳᎠᎵᏇᏂᏯᎠᎵᎻᏂᎠᎠᏂᎪᎳᏧᏁᏍᏓᎸᎠᏥᏂᏘᏂᎠᎠᎺ" + + "ᎵᎧ ᏌᎼᎠᎠᏍᏟᏯᎡᎳᏗᏜᎠᎷᏆᎣᎴᏅᏓ ᏚᎦᏚᏛᎢᎠᏏᎵᏆᏌᏂᏉᏏᏂᎠ ᎠᎴ ᎲᏤᎪᏫᏆᏇᏙᏍᏆᏂᎦᎵᏕᏍᏇᎵᏥᎥᎻᏋᎩᎾ ᏩᏐ" + + "ᏊᎵᎨᎵᎠᏆᎭᎴᎢᏂᏋᎷᏂᏗᏆᏂᎢᏂᎠᏥᎸᏉᏗ ᏆᏕᎳᎻᏆᏊᏓᏊᎾᎢᏉᎵᏫᎠᏆᏏᎵᎢᎾᏍᎩ ᏆᎭᎹᏍᏊᏔᏂᏊᏪ ᎤᎦᏚᏛᎢᏆᏣᏩᎾᏇ" + + "ᎳᎷᏍᏇᎵᏍᎨᎾᏓᎪᎪᏍ (ᎩᎵᏂ) ᏚᎦᏚᏛᎧᏂᎪᎬᎿᎨᏍᏛ ᎠᏰᏟ ᏍᎦᏚᎩᎧᏂᎪ (ᏍᎦᏚᎩ)ᏍᏫᏍᎢᏬᎵ ᎾᎿ ᎠᎹᏳᎶᏗᎠ" + + "ᏓᏍᏓᏴᎲᏍᎩ ᎤᎦᏚᏛᏥᎵᎧᎹᎷᏂᏓᎶᏂᎨᏍᏛᎪᎸᎻᏈᎢᎠᎪᏍᏓ ᎵᎧᎫᏆᎢᎬᎾᏕᎾ ᎢᏤᏳᏍᏗᏂᎦᏓ ᎤᏂᎲ ᎾᎿ ᎫᎳᎨᎣᏓᏂ" + + "ᏍᏓᏲᎯᎲ ᎤᎦᏚᏛᎢᏌᎢᏆᏍᏤᎩ ᏍᎦᏚᎩᎠᏂᏛᏥᏥᏊᏗᏗᏂᎹᎦᏙᎻᏂᎧᏙᎻᏂᎧᏂ ᏍᎦᏚᎩᎠᎵᏥᎵᏯᎡᏆᏙᎵᎡᏍᏙᏂᏯᎢᏥᏈᎢᎡ" + + "ᎵᏟᏯᎠᏂᏍᏆᏂᏱᏫᏂᎦᏙᎯᏫᏥᏩᎩ ᏚᎦᏚᏛᎢᎠᏰᏟ ᏧᎾᎵᎪᎯ ᎾᎿ ᎹᎢᏉᏂᏏᏯᏪᎶ ᏚᎦᏚᏛᎢᎦᎸᏥᏱᎦᏉᏂᎩᎵᏏᏲᏋᎾᏓᏣ" + + "ᎠᏥᎢᎠᏂᎦᎸᏥ ᎩᎠᎬᏂᏏᎦᎠᎾᏥᏆᎵᏓᎢᏤᏍᏛᏱᎦᎹᏈᎢᎠᎫᏇᏩᏓᎷᏇᎡᏆᏙᎵᎠᎵ ᎩᎢᏂᎪᎢᎯᏧᎦᏃᏮ ᏣᏥᏱ ᎠᎴ ᎾᏍᎩ " + + "ᏧᎦᏃᏮ ᎠᏍᏛᎭᏟ ᏚᎦᏚᏛᏩᏔᎹᎳᏆᎻᎫᏇ-ᏈᏌᎤᏫᎦᏯᎾᎰᏂᎩ ᎪᏂᎩᎲᏗ ᎤᎦᏚᏛᎢ ᎠᎴ ᎺᎩᏓᎾᎵᏗ ᏚᎦᏚᏛᎢᎧᎶᎡᏏ" + + "ᎠᎮᎢᏘᎲᏂᎦᎵᎢᏂᏙᏂᏍᏯᎠᎢᎴᏂᏗᎢᏏᎵᏱᎤᏍᏗ ᎤᎦᏚᏛᎢ ᎾᎿ ᎠᏍᎦᏯᎢᏅᏗᎾᏈᏗᏏ ᏴᏫᏯ ᎠᎺᏉ ᎢᎬᎾᏕᏅᎢᎳᎩᎢᎴ" + + "ᏂᏧᏁᏍᏓᎸᎯᏲᎶᏨᎵᏏᏣᎺᎢᎧᏦᏓᏂᏣᏩᏂᏏᎨᏂᏯᎩᎵᏣᎢᏍᎧᎹᏉᏗᎠᏂᎧᎵᏆᏘᎪᎼᎳᏍᎠᏰᏟ ᎾᎿ ᎨᏥᎸᏉᏗ ᎠᏂᏪᏌ ᎠᎴ " + + "ᎠᏂᏁᏫᏍᏧᏴᏢ ᎪᎵᎠᏧᎦᏃᏮ ᎪᎵᎠᎫᏪᎢᏘᎨᎢᎹᏂ ᏚᎦᏚᏛᎢᎧᏎᎧᏍᏕᏂᎴᎣᏍᎴᏆᎾᏂᎵᎦᏗᏂᏍᏓᏂᏍᎵ ᎳᏂᎧᎳᏈᎵᏯᎴᏐ" + + "ᏙᎵᏗᏪᏂᎠᎸᎧᏎᏋᎩᎳᏘᏫᎠᎵᏈᏯᎼᎶᎪᎹᎾᎪᎹᎵᏙᏫᎠᎼᏂᏔᏁᎦᎶᎠᏥᎸᏉᏗ ᏡᏡᎹᏓᎦᏍᎧᎵᎹᏌᎵ ᏚᎪᏚᏛᎹᏏᏙᏂᎢᎠᎹᎵᎹ" + + "ᏯᎹᎵᎹᏂᎪᎵᎠᎹᎧᎣ (ᎤᏓᏤᎵᏓ ᏧᏂᎸᏫᏍᏓᏁᏗ ᎢᎬᎾᏕᎾ) ᏣᎢᎾᏍᎩ ᎤᏴᏢ ᏗᏜ ᎹᎵᎠᎾ ᏚᎦᏚᏛᎹᏘᏂᎨᎹᏘᎢᏯᎹ" + + "ᏂᏘᏌᎳᏗᎹᎵᏔᎼᎵᏏᎥᏍᎹᎵᏗᏫᏍᎹᎳᏫᏍᏆᏂᏱᎹᎴᏏᎢᎠᎼᏎᎻᏇᎩᎾᎻᏈᎢᏯᎢᏤ ᎧᎵᏙᏂᎠᏂᏃᎵᏬᎵᎩ ᎤᎦᏚᏛᎢᏂᏥᎵᏯᏂᎧ" + + "ᎳᏆᏁᏛᎳᏂᏃᏪᏁᏆᎵᏃᎤᎷᏂᏳᎢᏤ ᏏᎢᎴᏂᏗᎣᎺᏂᏆᎾᎹᏇᎷᎠᏂᎦᎸᏣ ᏆᎵᏂᏏᎠᏆᏇ ᎢᏤ ᎩᏂᎠᏂᏈᎵᎩᏃᏆᎩᏍᏖᏂᏉᎳᏂᏎ" + + "ᏂᏘ ᏈᏓ ᎠᎴ ᎻᏇᎶᏂᏈᎧᎵᏂ ᎤᎦᏚᏛᎢᏇᎡᏙ ᎵᎢᎪᏆᎴᏍᏗᏂᎠᏂ ᏄᎬᏫᏳᏌᏕᎩᏉᏥᎦᎳᏆᎴᎠᏫᏆᎳᏇᎢᏯᎧᏔᎵᎶᎹᏂᏯᏒ" + + "ᏈᏯᏲᏂᎢᎶᏩᏂᏓᏌᎤᏗ ᎡᎴᏈᎠᏐᎶᎹᏂ ᏚᎦᏚᏛᎢᏏᎡᏥᎵᏍᏑᏕᏂᏍᏫᏕᏂᏏᏂᎦᏉᎵᎠᏥᎸᏉᏗ ᎮᎵᎾᏍᎶᏫᏂᎠᏍᎶᏩᎩᎠᏏᎡᎳ" + + " ᎴᎣᏂᎠᎹᏰᏟᏄᏬᎵᏍᏛᎾ ᎤᏔᏂᏗᎦᏙᎯᎡᎶᎯᏧᏴᏢ ᎠᎺᎵᎦᏧᎦᏃᏮ ᎠᎺᎵᎦᎠᎺᎵᎦᎢ", + []uint16{ // 273 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x000c, 0x0042, 0x0057, 0x0071, 0x007d, 0x008c, + 0x009b, 0x009b, 0x00a7, 0x00b6, 0x00c8, 0x00de, 0x00ea, 0x00f6, + 0x00ff, 0x011b, 0x012d, 0x014d, 0x0159, 0x016b, 0x017a, 0x018a, + 0x0199, 0x01a8, 0x01b4, 0x01c0, 0x01dc, 0x01e5, 0x01ee, 0x01fa, + 0x01fa, 0x0206, 0x021c, 0x0225, 0x023b, 0x0247, 0x0253, 0x025c, + 0x0265, 0x0287, 0x0290, 0x02b6, 0x02ce, 0x02d7, 0x02f7, 0x031c, + 0x0322, 0x032e, 0x0340, 0x0352, 0x0352, 0x0362, 0x0368, 0x0387, + 0x03ae, 0x03d3, 0x03df, 0x03f2, 0x03fe, 0x03fe, 0x0407, 0x0413, + // Entry 40 - 7F + 0x041f, 0x043b, 0x044a, 0x044a, 0x0456, 0x0465, 0x0471, 0x0471, + 0x047d, 0x048f, 0x048f, 0x048f, 0x049e, 0x04a4, 0x04ba, 0x04ed, + 0x0503, 0x050f, 0x0518, 0x0524, 0x052d, 0x0539, 0x054f, 0x0558, + 0x0561, 0x056d, 0x057c, 0x058b, 0x0591, 0x059d, 0x05b9, 0x05c2, + 0x0613, 0x061f, 0x0625, 0x0638, 0x0641, 0x0654, 0x0694, 0x0694, + 0x06a3, 0x06ac, 0x06b8, 0x06b8, 0x06ca, 0x06d9, 0x06e5, 0x0712, + 0x071e, 0x074b, 0x0754, 0x075d, 0x076f, 0x0775, 0x077e, 0x078a, + 0x0793, 0x079f, 0x07a8, 0x07b7, 0x07c9, 0x07d5, 0x07e1, 0x0825, + // Entry 80 - BF + 0x0838, 0x084e, 0x085a, 0x0876, 0x0888, 0x0891, 0x089d, 0x089d, + 0x08b2, 0x08c2, 0x08ce, 0x08d7, 0x08e6, 0x08f5, 0x0901, 0x090a, + 0x0913, 0x091c, 0x092b, 0x093d, 0x0953, 0x0965, 0x097b, 0x098d, + 0x0993, 0x099f, 0x09ae, 0x09f9, 0x0a2d, 0x0a39, 0x0a45, 0x0a57, + 0x0a60, 0x0a6f, 0x0a7e, 0x0a87, 0x0a93, 0x0aa2, 0x0ab1, 0x0ac0, + 0x0ad9, 0x0ad9, 0x0af8, 0x0b04, 0x0b10, 0x0b1c, 0x0b22, 0x0b2b, + 0x0b34, 0x0b3a, 0x0b50, 0x0b59, 0x0b62, 0x0b68, 0x0b87, 0x0b9b, + 0x0bad, 0x0bbc, 0x0bc5, 0x0be9, 0x0c05, 0x0c18, 0x0c43, 0x0c4f, + // Entry C0 - FF + 0x0c5b, 0x0c6a, 0x0c73, 0x0c73, 0x0c73, 0x0c7f, 0x0c88, 0x0c91, + 0x0c9d, 0x0cb3, 0x0ccf, 0x0cde, 0x0ce7, 0x0cf3, 0x0d02, 0x0d1b, + 0x0d2a, 0x0d2a, 0x0d39, 0x0d4c, 0x0d4c, 0x0d4c, 0x0d4c, 0x0d4c, + 0x0d4c, 0x0d4c, 0x0d4c, 0x0d4c, 0x0d4c, 0x0d4c, 0x0d4c, 0x0d4c, + 0x0d4c, 0x0d4c, 0x0d4c, 0x0d4c, 0x0d4c, 0x0d4c, 0x0d4c, 0x0d4c, + 0x0d4c, 0x0d4c, 0x0d4c, 0x0d4c, 0x0d4c, 0x0d4c, 0x0d4c, 0x0d4c, + 0x0d4c, 0x0d4c, 0x0d58, 0x0d58, 0x0d58, 0x0d58, 0x0d58, 0x0d58, + 0x0d58, 0x0d58, 0x0d58, 0x0d58, 0x0d58, 0x0d58, 0x0d58, 0x0d58, + // Entry 100 - 13F + 0x0d58, 0x0d58, 0x0d58, 0x0d58, 0x0d80, 0x0d89, 0x0d89, 0x0d9f, + 0x0db8, 0x0db8, 0x0db8, 0x0db8, 0x0db8, 0x0db8, 0x0db8, 0x0db8, + 0x0dc7, + }, + }, + { // ckb + "ئەورووپای باشووریئاسیای ناوەندیئاسیای ڕۆژاوا", + []uint16{ // 286 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 80 - BF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry C0 - FF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 100 - 13F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0021, 0x0021, + 0x0021, 0x0021, 0x0021, 0x0021, 0x003c, 0x0055, + }, + }, + { // cs + csRegionStr, + csRegionIdx, + }, + { // cy + "Ynys AscensionAndorraEmiradau Arabaidd UnedigAfghanistanAntigua a Barbud" + + "aAnguillaAlbaniaArmeniaYnysoedd Caribî yr IseldiroeddAngolaAntarctic" + + "aYr ArianninSamoa AmericaAwstriaAwstraliaArubaYnysoedd ÅlandAzerbaij" + + "anBosnia a HercegovinaBarbadosBangladeshGwlad BelgBurkina FasoBwlgar" + + "iaBahrainBurundiBeninSaint BarthélemyBermudaBruneiBolifiaAntilles yr" + + " IseldiroeddBrasilY BahamasBhutanYnys BouvetBotswanaBelarwsBelizeCan" + + "adaYnysoedd Cocos (Keeling)Y Congo - KinshasaGweriniaeth Canolbarth " + + "AffricaY Congo - BrazzavilleY SwistirCôte d’IvoireYnysoedd CookChile" + + "CamerŵnTsieinaColombiaYnys ClippertonCosta RicaCiwbaCabo VerdeCuraça" + + "oYnys y NadoligCyprusGweriniaeth TsiecYr AlmaenDiego GarciaDjiboutiD" + + "enmarcDominicaGweriniaeth DominicaAlgeriaCeuta a MelillaEcuadorEston" + + "iaYr AifftGorllewin SaharaEritreaSbaenEthiopiaYr Undeb EwropeaiddY F" + + "findirFijiYnysoedd y Falkland/MalvinasMicronesiaYnysoedd FfaroFfrain" + + "cGabonY Deyrnas UnedigGrenadaGeorgiaGuyane FfrengigYnys y GarnGhanaG" + + "ibraltarYr Ynys LasGambiaGuinéeGuadeloupeGuinea GyhydeddolGwlad Groe" + + "gDe Georgia ac Ynysoedd Sandwich y DeGuatemalaGuamGuiné-BissauGuyana" + + "Hong Kong RhGA TsieinaYnys Heard ac Ynysoedd McDonaldHondurasCroatia" + + "HaitiHwngariYr Ynysoedd DedwyddIndonesiaIwerddonIsraelYnys ManawIndi" + + "aTiriogaeth Brydeinig Cefnfor IndiaIracIranGwlad yr IâYr EidalJersey" + + "JamaicaGwlad IorddonenJapanKenyaKyrgyzstanCambodiaKiribatiComorosSai" + + "nt Kitts a NevisGogledd KoreaDe KoreaKuwaitYnysoedd CaymanKazakstanL" + + "aosLibanusSaint LuciaLiechtensteinSri LankaLiberiaLesothoLithuaniaLw" + + "csembwrgLatfiaLibyaMorocoMonacoMoldofaMontenegroSaint MartinMadagasc" + + "arYnysoedd MarshallMacedoniaMaliMyanmar (Burma)MongoliaMacau RhGA Ts" + + "ieinaYnysoedd Gogledd MarianaMartiniqueMauritaniaMontserratMaltaMaur" + + "itiusY MaldivesMalawiMecsicoMalaysiaMozambiqueNamibiaCaledonia Newyd" + + "dNigerYnys NorfolkNigeriaNicaraguaYr IseldiroeddNorwyNepalNauruNiueS" + + "eland NewyddOmanPanamaPeriwPolynesia FfrengigPapua Guinea NewyddY Ph" + + "ilipinauPakistanGwlad PwylSaint-Pierre-et-MiquelonYnysoedd PitcairnP" + + "uerto RicoTiriogaethau PalesteinaiddPortiwgalPalauParaguayQatarOcean" + + "ia BellennigRéunionRwmaniaSerbiaRwsiaRwandaSaudi ArabiaYnysoedd Solo" + + "monSeychellesSwdanSwedenSingaporeSaint HelenaSlofeniaSvalbard a Jan " + + "MayenSlofaciaSierra LeoneSan MarinoSenegalSomaliaSurinameDe SwdanSão" + + " Tomé a PríncipeEl SalvadorSint MaartenSyriaGwlad SwaziTristan da Cu" + + "nhaYnysoedd Turks a CaicosTchadTiroedd Deheuol ac Antarctig FfraincT" + + "ogoGwlad ThaiTajikistanTokelauTimor-LesteTurkmenistanTunisiaTongaTwr" + + "ciTrinidad a TobagoTuvaluTaiwanTanzaniaWcráinUgandaYnysoedd Pellenni" + + "g UDAYr Unol DaleithiauUruguayUzbekistanY FaticanSaint Vincent a’r G" + + "renadinesVenezuelaYnysoedd Gwyryf PrydainYnysoedd Gwyryf yr Unol Dal" + + "eithiauFietnamVanuatuWallis a FutunaSamoaKosovoYemenMayotteDe Affric" + + "aZambiaZimbabweRhanbarth AnhysbysY BydAffricaGogledd AmericaDe Ameri" + + "caOceaniaGorllewin AffricaCanolbarth AmericaDwyrain AffricaGogledd A" + + "ffricaCanol AffricaDeheudir AffricaYr AmerigAmerica i’r Gogledd o Fe" + + "csicoY CaribîDwyrain AsiaDe AsiaDe-Ddwyrain AsiaDe EwropAwstralasiaM" + + "elanesiaRhanbarth MicronesiaPolynesiaAsiaCanol AsiaGorllewin AsiaEwr" + + "opDwyrain EwropGogledd EwropGorllewin EwropAmerica Ladin", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x000e, 0x0015, 0x002d, 0x0038, 0x0049, 0x0051, 0x0058, + 0x005f, 0x007e, 0x0084, 0x008e, 0x0099, 0x00a6, 0x00ad, 0x00b6, + 0x00bb, 0x00ca, 0x00d4, 0x00e8, 0x00f0, 0x00fa, 0x0104, 0x0110, + 0x0118, 0x011f, 0x0126, 0x012b, 0x013c, 0x0143, 0x0149, 0x0150, + 0x0167, 0x016d, 0x0176, 0x017c, 0x0187, 0x018f, 0x0196, 0x019c, + 0x01a2, 0x01ba, 0x01cc, 0x01ea, 0x01ff, 0x0208, 0x0218, 0x0225, + 0x022a, 0x0232, 0x0239, 0x0241, 0x0250, 0x025a, 0x025f, 0x0269, + 0x0271, 0x027f, 0x0285, 0x0296, 0x029f, 0x02ab, 0x02b3, 0x02ba, + // Entry 40 - 7F + 0x02c2, 0x02d6, 0x02dd, 0x02ec, 0x02f3, 0x02fa, 0x0302, 0x0312, + 0x0319, 0x031e, 0x0326, 0x0339, 0x0342, 0x0346, 0x0362, 0x036c, + 0x037a, 0x0381, 0x0386, 0x0396, 0x039d, 0x03a4, 0x03b3, 0x03be, + 0x03c3, 0x03cc, 0x03d7, 0x03dd, 0x03e4, 0x03ee, 0x03ff, 0x040a, + 0x042e, 0x0437, 0x043b, 0x0448, 0x044e, 0x0464, 0x0483, 0x048b, + 0x0492, 0x0497, 0x049e, 0x04b1, 0x04ba, 0x04c2, 0x04c8, 0x04d2, + 0x04d7, 0x04f9, 0x04fd, 0x0501, 0x050d, 0x0515, 0x051b, 0x0522, + 0x0531, 0x0536, 0x053b, 0x0545, 0x054d, 0x0555, 0x055c, 0x056f, + // Entry 80 - BF + 0x057c, 0x0584, 0x058a, 0x0599, 0x05a2, 0x05a6, 0x05ad, 0x05b8, + 0x05c5, 0x05ce, 0x05d5, 0x05dc, 0x05e5, 0x05ef, 0x05f5, 0x05fa, + 0x0600, 0x0606, 0x060d, 0x0617, 0x0623, 0x062d, 0x063e, 0x0647, + 0x064b, 0x065a, 0x0662, 0x0674, 0x068c, 0x0696, 0x06a0, 0x06aa, + 0x06af, 0x06b8, 0x06c2, 0x06c8, 0x06cf, 0x06d7, 0x06e1, 0x06e8, + 0x06f8, 0x06fd, 0x0709, 0x0710, 0x0719, 0x0727, 0x072c, 0x0731, + 0x0736, 0x073a, 0x0747, 0x074b, 0x0751, 0x0756, 0x0768, 0x077b, + 0x0787, 0x078f, 0x0799, 0x07b1, 0x07c2, 0x07cd, 0x07e7, 0x07f0, + // Entry C0 - FF + 0x07f5, 0x07fd, 0x0802, 0x0813, 0x081b, 0x0822, 0x0828, 0x082d, + 0x0833, 0x083f, 0x084f, 0x0859, 0x085e, 0x0864, 0x086d, 0x0879, + 0x0881, 0x0895, 0x089d, 0x08a9, 0x08b3, 0x08ba, 0x08c1, 0x08c9, + 0x08d1, 0x08e7, 0x08f2, 0x08fe, 0x0903, 0x090e, 0x091e, 0x0935, + 0x093a, 0x095e, 0x0962, 0x096c, 0x0976, 0x097d, 0x0988, 0x0994, + 0x099b, 0x09a0, 0x09a5, 0x09b6, 0x09bc, 0x09c2, 0x09ca, 0x09d1, + 0x09d7, 0x09ed, 0x09ff, 0x0a06, 0x0a10, 0x0a19, 0x0a37, 0x0a40, + 0x0a57, 0x0a79, 0x0a80, 0x0a87, 0x0a96, 0x0a9b, 0x0aa1, 0x0aa6, + // Entry 100 - 13F + 0x0aad, 0x0ab7, 0x0abd, 0x0ac5, 0x0ad7, 0x0adc, 0x0ae3, 0x0af2, + 0x0afc, 0x0b03, 0x0b14, 0x0b26, 0x0b35, 0x0b44, 0x0b51, 0x0b61, + 0x0b6a, 0x0b89, 0x0b92, 0x0b9e, 0x0ba5, 0x0bb5, 0x0bbd, 0x0bc8, + 0x0bd1, 0x0be5, 0x0bee, 0x0bf2, 0x0bfc, 0x0c0a, 0x0c0f, 0x0c1c, + 0x0c29, 0x0c38, 0x0c45, + }, + }, + { // da + daRegionStr, + daRegionIdx, + }, + { // dav + "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + + "iaAntili za UholanziAngolaAjentinaSamoa ya MarekaniAustriaAustraliaA" + + "rubaAzabajaniBosnia na HezegovinaBabadosiBangladeshiUbelgijiBukinafa" + + "soBulgariaBahareniBurundiBeniniBermudaBruneiBoliviaBraziliBahamaButa" + + "niBotswanaBelarusiBelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhur" + + "i ya Afrika ya KatiKongoUswisiKodivaaVisiwa vya CookChileKameruniChi" + + "naKolombiaKostarikaKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibut" + + "iDenmakiDominikaJamhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaH" + + "ispaniaUhabeshiUfiniFijiVisiwa vya FalklandMikronesiaUfaransaGaboniU" + + "ingerezaGrenadaJojiaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaG" + + "ineGwadelupeGinekwetaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKor" + + "asiaHaitiHungariaIndonesiaAyalandiIsraeliIndiaEneo la Uingereza kati" + + "ka Bahari HindiIrakiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKir" + + "igizistaniKambodiaKiribatiKomoroSantakitzi na NevisKorea KaskaziniKo" + + "rea KusiniKuwaitiVisiwa vya KaymanKazakistaniLaosiLebanoniSantalusia" + + "LishenteniSirilankaLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoM" + + "onakoMoldovaBukiniVisiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa" + + " vya Mariana vya KaskaziniMartinikiMoritaniaMontserratiMaltaMorisiMo" + + "divuMalawiMeksikoMalesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha " + + "NorfokNijeriaNikaragwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPan" + + "amaPeruPolinesia ya UfaransaPapuaFilipinoPakistaniPolandiSantapieri " + + "na MikeloniPitkairniPwetorikoUkingo wa Magharibi na Ukanda wa Gaza w" + + "a PalestinaUrenoPalauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiV" + + "isiwa vya SolomonShelisheliSudaniUswidiSingapooSantahelenaSloveniaSl" + + "ovakiaSiera LeoniSamarinoSenegaliSomaliaSurinamuSao Tome na Principe" + + "ElsavadoSiriaUswaziVisiwa vya Turki na KaikoChadiTogoTailandiTajikis" + + "taniTokelauTimori ya MasharikiTurukimenistaniTunisiaTongaUturukiTrin" + + "idad na TobagoTuvaluTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibe" + + "kistaniVatikaniSantavisenti na GrenadiniVenezuelaVisiwa vya Virgin v" + + "ya UingerezaVisiwa vya Virgin vya MarekaniVietinamuVanuatuWalis na F" + + "utunaSamoaYemeniMayotteAfrika KusiniZambiaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, + 0x004a, 0x005c, 0x0062, 0x0062, 0x006a, 0x007b, 0x0082, 0x008b, + 0x0090, 0x0090, 0x0099, 0x00ad, 0x00b5, 0x00c0, 0x00c8, 0x00d2, + 0x00da, 0x00e2, 0x00e9, 0x00ef, 0x00ef, 0x00f6, 0x00fc, 0x0103, + 0x0103, 0x010a, 0x0110, 0x0116, 0x0116, 0x011e, 0x0126, 0x012c, + 0x0132, 0x0132, 0x0152, 0x016b, 0x0170, 0x0176, 0x017d, 0x018c, + 0x0191, 0x0199, 0x019e, 0x01a6, 0x01a6, 0x01af, 0x01b3, 0x01bb, + 0x01bb, 0x01bb, 0x01c2, 0x01d2, 0x01db, 0x01db, 0x01e1, 0x01e8, + // Entry 40 - 7F + 0x01f0, 0x0203, 0x020a, 0x020a, 0x0210, 0x0217, 0x021c, 0x021c, + 0x0223, 0x022b, 0x0233, 0x0233, 0x0238, 0x023c, 0x024f, 0x0259, + 0x0259, 0x0261, 0x0267, 0x0270, 0x0277, 0x027c, 0x028f, 0x028f, + 0x0294, 0x029c, 0x02a5, 0x02ab, 0x02af, 0x02b8, 0x02c1, 0x02c8, + 0x02c8, 0x02d1, 0x02d5, 0x02de, 0x02e4, 0x02e4, 0x02e4, 0x02ed, + 0x02f4, 0x02f9, 0x0301, 0x0301, 0x030a, 0x0312, 0x0319, 0x0319, + 0x031e, 0x0343, 0x0348, 0x034e, 0x0356, 0x035c, 0x035c, 0x0363, + 0x036a, 0x0370, 0x0375, 0x0382, 0x038a, 0x0392, 0x0398, 0x03ab, + // Entry 80 - BF + 0x03ba, 0x03c6, 0x03cd, 0x03de, 0x03e9, 0x03ee, 0x03f6, 0x0400, + 0x040a, 0x0413, 0x041a, 0x0420, 0x0428, 0x0431, 0x0438, 0x043d, + 0x0443, 0x0449, 0x0450, 0x0450, 0x0450, 0x0456, 0x0468, 0x0471, + 0x0475, 0x047a, 0x0482, 0x0482, 0x04a2, 0x04ab, 0x04b4, 0x04bf, + 0x04c4, 0x04ca, 0x04d0, 0x04d6, 0x04dd, 0x04e4, 0x04ec, 0x04f3, + 0x04ff, 0x0505, 0x0516, 0x051d, 0x0526, 0x052e, 0x0533, 0x0539, + 0x053e, 0x0542, 0x054c, 0x0551, 0x0557, 0x055b, 0x0570, 0x0575, + 0x057d, 0x0586, 0x058d, 0x05a3, 0x05ac, 0x05b5, 0x05e7, 0x05ec, + // Entry C0 - FF + 0x05f1, 0x05f9, 0x05ff, 0x05ff, 0x0608, 0x060f, 0x060f, 0x0614, + 0x061a, 0x061f, 0x0631, 0x063b, 0x0641, 0x0647, 0x064f, 0x065a, + 0x0662, 0x0662, 0x066a, 0x0675, 0x067d, 0x0685, 0x068c, 0x0694, + 0x0694, 0x06a8, 0x06b0, 0x06b0, 0x06b5, 0x06bb, 0x06bb, 0x06d4, + 0x06d9, 0x06d9, 0x06dd, 0x06e5, 0x06f0, 0x06f7, 0x070a, 0x0719, + 0x0720, 0x0725, 0x072c, 0x073e, 0x0744, 0x074b, 0x0753, 0x075a, + 0x0760, 0x0760, 0x0768, 0x076f, 0x077b, 0x0783, 0x079c, 0x07a5, + 0x07c4, 0x07e2, 0x07eb, 0x07f2, 0x0801, 0x0806, 0x0806, 0x080c, + // Entry 100 - 13F + 0x0813, 0x0820, 0x0826, 0x082e, + }, + }, + { // de + deRegionStr, + deRegionIdx, + }, + { // de-CH + "BangladeshBruneiBotswanaWeissrusslandGrossbritannienMarshall-InselnÄusse" + + "res OzeanienSalomon-InselnZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0010, 0x0010, + 0x0010, 0x0010, 0x0010, 0x0010, 0x0010, 0x0018, 0x0025, 0x0025, + 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, + 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, + 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, + // Entry 40 - 7F + 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, + 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, + 0x0025, 0x0025, 0x0025, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, + 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, + 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, + 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, + 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, + 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, + // Entry 80 - BF + 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, + 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, + 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0034, 0x0043, 0x0043, + 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, + 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, + 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, + 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, + 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, 0x0043, + // Entry C0 - FF + 0x0043, 0x0043, 0x0043, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, + 0x0055, 0x0055, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, + // Entry 100 - 13F + 0x0063, 0x0063, 0x0063, 0x006b, + }, + }, + { // dje + "AndooraLaaraw Imaarawey MarganteyAfgaanistanAntigua nda BarbuudaAngiiyaA" + + "lbaaniArmeeniHollandu Antiiyey LabooAngoolaArgentineAmeriki SamoaOtr" + + "išiOstraaliAruubaAzerbaayijaŋBosni nda HerzegovineBarbaadosBangladeš" + + "iBelgiikiBurkina fasoBulgaariBahareenBurundiBeniŋBermudaBruuneeBooli" + + "viBreezilBahamasBuutaŋBotswaanaBilorišiBeliiziKanaadaKongoo demookar" + + "atiki labooCentraafriki koyraKongooSwisuKudwarKuuk gungeyŠiiliKameru" + + "unŠiinKolombiKosta rikaKuubaKapuver gungeyŠiipurCek laboAlmaaɲeJibuu" + + "tiDanemarkDoominiki labooAlžeeriEkwateerEstooniMisraEritreeEspaaɲeEc" + + "ioopiFinlanduFijiKalkan gungeyMikroneziFaransiGaabonAlbaasalaama Mar" + + "gantaGrenaadaGorgiFaransi GuyaanGaanaGibraltarGrinlandGambiGineGwade" + + "luupGinee EkwatorialGreeceGwatemaalaGuamGine-BissoGuyaaneHondurasKrw" + + "aasiHaitiHungaariIndoneeziIrlanduIsrayelIndu labooBritiši Indu teeko" + + "o laamaIraakIraanAyselandItaaliJamaayikUrdunJaapoŋKeeniyaKyrgyzstank" + + "amboogiKiribaatiKomoorSeŋ Kitts nda NevisGurma KooreeHawsa KooreeKuw" + + "eetKayman gungeyKaazakstanLaawosLubnaanSeŋ LussiaLiechtensteinSrilan" + + "kaLiberiaLeesotoLituaaniLuxembourgLetooniLiibiMaarokMonakoMoldoviMad" + + "agascarMaršal gungeyMaacedooniMaaliMaynamarMongooliMariana Gurma Gun" + + "geyMartiniikiMooritaaniMontserratMaltaMooris gungeyMaldiivuMalaawiMe" + + "xikiMaleeziMozambikNaamibiKaaledooni TaagaaNižerNorfolk GungooNaajir" + + "iiaNikaragwaHollanduNorveejNeepalNauruNiueZeelandu TaagaOmaanPanamaP" + + "eeruFaransi PolineeziPapua Ginee TaagaFilipinePaakistanPoloɲeSeŋ Piy" + + "er nda MikelonPitikarinPorto RikoPalestine Dangay nda GaazaPortugaal" + + "PaluParaguweyKataarReenioŋRumaaniIriši labooRwandaSaudiyaSolomon Gun" + + "geySeešelSuudaŋSweedeSingapurSeŋ HelenaSloveeniSlovaakiSeera LeonSan" + + " MarinoSenegalSomaaliSurinaamSao Tome nda PrinsipeSalvador labooSuur" + + "iaSwazilandTurk nda Kayikos GungeyCaaduTogoTaayilandTaažikistanTokel" + + "auTimoor hawsaTurkmenistaŋTuniziTongaTurkiTrinidad nda TobaagoTuvalu" + + "TaayiwanTanzaaniUkreenUgandaAmeriki Laabu MarganteyUruguweyUzbeekist" + + "anVaatikan LaamaSeŋvinsaŋ nda GrenadineVeneezuyeelaBritiši Virgin gu" + + "ngeyAmeerik Virgin GungeyVietnaamVanautuWallis nda FutunaSamoaYamanM" + + "ayootiHawsa Afriki LabooZambiZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x0021, 0x002c, 0x0040, 0x0047, 0x004e, + 0x0055, 0x006c, 0x0073, 0x0073, 0x007c, 0x0089, 0x0090, 0x0098, + 0x009e, 0x009e, 0x00ab, 0x00c0, 0x00c9, 0x00d4, 0x00dc, 0x00e8, + 0x00f0, 0x00f8, 0x00ff, 0x0105, 0x0105, 0x010c, 0x0113, 0x011a, + 0x011a, 0x0121, 0x0128, 0x012f, 0x012f, 0x0138, 0x0141, 0x0148, + 0x014f, 0x014f, 0x0169, 0x017b, 0x0181, 0x0186, 0x018c, 0x0197, + 0x019d, 0x01a5, 0x01aa, 0x01b1, 0x01b1, 0x01bb, 0x01c0, 0x01ce, + 0x01ce, 0x01ce, 0x01d5, 0x01dd, 0x01e5, 0x01e5, 0x01ec, 0x01f4, + // Entry 40 - 7F + 0x01f4, 0x0203, 0x020b, 0x020b, 0x0213, 0x021a, 0x021f, 0x021f, + 0x0226, 0x022e, 0x0235, 0x0235, 0x023d, 0x0241, 0x024e, 0x0257, + 0x0257, 0x025e, 0x0264, 0x0279, 0x0281, 0x0286, 0x0294, 0x0294, + 0x0299, 0x02a2, 0x02aa, 0x02af, 0x02b3, 0x02bc, 0x02cc, 0x02d2, + 0x02d2, 0x02dc, 0x02e0, 0x02ea, 0x02f1, 0x02f1, 0x02f1, 0x02f9, + 0x0300, 0x0305, 0x030d, 0x030d, 0x0316, 0x031d, 0x0324, 0x0324, + 0x032e, 0x0348, 0x034d, 0x0352, 0x035a, 0x0360, 0x0360, 0x0368, + 0x036d, 0x0374, 0x037b, 0x0385, 0x038d, 0x0396, 0x039c, 0x03b0, + // Entry 80 - BF + 0x03bc, 0x03c8, 0x03ce, 0x03db, 0x03e5, 0x03eb, 0x03f2, 0x03fd, + 0x040a, 0x0412, 0x0419, 0x0420, 0x0428, 0x0432, 0x0439, 0x043e, + 0x0444, 0x044a, 0x0451, 0x0451, 0x0451, 0x045b, 0x0469, 0x0473, + 0x0478, 0x0480, 0x0488, 0x0488, 0x049c, 0x04a6, 0x04b0, 0x04ba, + 0x04bf, 0x04cc, 0x04d4, 0x04db, 0x04e1, 0x04e8, 0x04f0, 0x04f7, + 0x0508, 0x050e, 0x051c, 0x0525, 0x052e, 0x0536, 0x053d, 0x0543, + 0x0548, 0x054c, 0x055a, 0x055f, 0x0565, 0x056a, 0x057b, 0x058c, + 0x0594, 0x059d, 0x05a4, 0x05ba, 0x05c3, 0x05cd, 0x05e7, 0x05f0, + // Entry C0 - FF + 0x05f4, 0x05fd, 0x0603, 0x0603, 0x060b, 0x0612, 0x0612, 0x061e, + 0x0624, 0x062b, 0x0639, 0x0640, 0x0647, 0x064d, 0x0655, 0x0660, + 0x0668, 0x0668, 0x0670, 0x067a, 0x0684, 0x068b, 0x0692, 0x069a, + 0x069a, 0x06af, 0x06bd, 0x06bd, 0x06c3, 0x06cc, 0x06cc, 0x06e3, + 0x06e8, 0x06e8, 0x06ec, 0x06f5, 0x0701, 0x0708, 0x0714, 0x0721, + 0x0727, 0x072c, 0x0731, 0x0745, 0x074b, 0x0753, 0x075b, 0x0761, + 0x0767, 0x0767, 0x077e, 0x0786, 0x0791, 0x079f, 0x07b8, 0x07c4, + 0x07da, 0x07ef, 0x07f7, 0x07fe, 0x080f, 0x0814, 0x0814, 0x0819, + // Entry 100 - 13F + 0x0820, 0x0832, 0x0837, 0x083f, + }, + }, + { // dsb + "AscensionAndorraZjadnośone arabiske emiratyAfghanistanAntigua a BarbudaA" + + "nguillaAlbańskaArmeńskaAngolaAntarktisArgentinskaAmeriska SamoaAwstr" + + "iskaAwstralskaArubaÅlandAzerbajdžanBosniska a HercegowinaBarbadosBan" + + "gladešBelgiskaBurkina FasoBulgarskaBahrainBurundiBeninSt. Barthélemy" + + "BermudyBruneiBoliwiskaKaribiska NižozemskaBrazilskaBahamyBhutanBouve" + + "towa kupaBotswanaBěłoruskaBelizeKanadaKokosowe kupyKongo-KinshasaCen" + + "tralnoafriska republikaKongo-BrazzavilleŠwicarskaCôte d’IvoireCookow" + + "e kupyChilskaKamerunChinaKolumbiskaClippertonowa kupaKosta RikaKubaK" + + "ap VerdeCuraçaoGódowne kupyCypriskaČeska republikaNimskaDiego Garcia" + + "DžibutiDańskaDominikaDominikańska republikaAlgeriskaCeuta a MelillaE" + + "kwadorEstniskaEgyptojskaPódwjacorna SaharaEritrejaŠpańskaEtiopiskaEu" + + "ropska unijaFinskaFidžiFalklandske kupyMikroneziskaFäröjeFrancojskaG" + + "abunZjadnośone kralejstwoGrenadaGeorgiskaFrancojska GuyanaGuernseyGh" + + "anaGibraltarGrönlandskaGambijaGinejaGuadeloupeEkwatorialna GinejaGri" + + "chiskaPódpołdnjowa Georgiska a Pódpołdnjowe Sandwichowe kupyGuatemal" + + "aGuamGineja-BissauGuyanaWósebna zastojnstwowa cona HongkongHeardowa " + + "kupa a McDonaldowe kupyHondurasChorwatskaHaitiHungorskaKanariske kup" + + "yIndoneziskaIrskaIsraelManIndiskaBritiski indiskooceaniski teritoriu" + + "mIrakIranIslandskaItalskaJerseyJamaikaJordaniskaJapańskaKeniaKirgizi" + + "stanKambodžaKiribatiKomorySt. Kitts a NevisPódpołnocna KorejaPódpołd" + + "njowa KorejaKuwaitKajmaniske kupyKazachstanLaosLibanonSt. LuciaLiech" + + "tensteinSri LankaLiberijaLesothoLitawskaLuxemburgskaLetiskaLibyskaMa" + + "rokkoMonacoMoldawskaCarna GóraSt. MartinMadagaskarMarshallowe kupyMa" + + "kedońskaMaliMyanmarMongolskaWósebna zastojnstwowa cona MacaoPódpołno" + + "cne MarianyMartiniqueMawretańskaMontserratMaltaMauritiusMalediwyMala" + + "wiMexikoMalajzijaMosambikNamibijaNowa KaledoniskaNigerNorfolkowa kup" + + "aNigerijaNikaraguaNižozemskaNorwegskaNepalNauruNiueNowoseelandskaOma" + + "nPanamaPeruFrancojska PolyneziskaPapua-NeuguineaFilipinyPakistanPóls" + + "kaSt. Pierre a MiquelonPitcairnowe kupyPuerto RicoPalestinski awtono" + + "mny teritoriumPortugalskaPalauParaguayKatarwenkowna OceaniskaRéunion" + + "RumuńskaSerbiskaRuskaRuandaSaudi-ArabiskaSalomonySeychelleSudanŠweds" + + "kaSingapurSt. HelenaSłowjeńskaSvalbard a Jan MayenSłowakskaSierra Le" + + "oneSan MarinoSenegalSomalijaSurinamskaPódpołdnjowy SudanSão Tomé a P" + + "ríncipeEl SalvadorSint MaartenSyriskaSwasiskaTristan da CunhaTurks a" + + " Caicos kupyČadFrancojski pódpołdnjowy a antarktiski teritoriumTogoT" + + "hailandskaTadźikistanTokelauTimor-LesteTurkmeniskaTuneziskaTongaTurk" + + "ojskaTrinidad a TobagoTuvaluTaiwanTansanijaUkrainaUgandaAmeriska Oce" + + "aniskaZjadnośone staty AmerikiUruguayUzbekistanVatikańske městoSt. V" + + "incent a GrenadinyVenezuelaBritiske kněžniske kupyAmeriske kněžniske" + + " kupyVietnamVanuatuWallis a FutunaSamoaKosowoJemenMayottePódpołdnjow" + + "a Afrika (Republika)SambijaSimbabwenjeznaty regionswětAfrikaPódpołno" + + "cna AmerikaPódpołdnjowa AmerikaOceaniskaPódwjacorna AfrikaSrjejźna A" + + "merikapódzajtšna Afrikapódpołnocna Afrikasrjejźna Afrikapódpołdnjowa" + + " AfrikaAmerikapódpołnocny ameriski kontinentKaribiskapódzajtšna Azij" + + "apódpołdnjowa Azijakrotkozajtšna Azijapódpołdnjowa EuropaAwstralazij" + + "aMelaneziskaMikroneziska (kupowy region)PolyneziskaAzijacentralna Az" + + "ijapódwjacorna AzijaEuropapódzajtšna Europapódpołnocna Europapódwjac" + + "orna EuropaŁatyńska Amerika", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0009, 0x0010, 0x002c, 0x0037, 0x0048, 0x0050, 0x0059, + 0x0062, 0x0062, 0x0068, 0x0071, 0x007c, 0x008a, 0x0093, 0x009d, + 0x00a2, 0x00a8, 0x00b4, 0x00ca, 0x00d2, 0x00dc, 0x00e4, 0x00f0, + 0x00f9, 0x0100, 0x0107, 0x010c, 0x011b, 0x0122, 0x0128, 0x0131, + 0x0146, 0x014f, 0x0155, 0x015b, 0x0169, 0x0171, 0x017c, 0x0182, + 0x0188, 0x0195, 0x01a3, 0x01bd, 0x01ce, 0x01d8, 0x01e8, 0x01f4, + 0x01fb, 0x0202, 0x0207, 0x0211, 0x0223, 0x022d, 0x0231, 0x023a, + 0x0242, 0x024f, 0x0257, 0x0267, 0x026d, 0x0279, 0x0281, 0x0288, + // Entry 40 - 7F + 0x0290, 0x02a7, 0x02b0, 0x02bf, 0x02c6, 0x02ce, 0x02d8, 0x02eb, + 0x02f3, 0x02fc, 0x0305, 0x0313, 0x0319, 0x031f, 0x032f, 0x033b, + 0x0343, 0x034d, 0x0352, 0x0368, 0x036f, 0x0378, 0x0389, 0x0391, + 0x0396, 0x039f, 0x03ab, 0x03b2, 0x03b8, 0x03c2, 0x03d5, 0x03de, + 0x0418, 0x0421, 0x0425, 0x0432, 0x0438, 0x045c, 0x047c, 0x0484, + 0x048e, 0x0493, 0x049c, 0x04aa, 0x04b5, 0x04ba, 0x04c0, 0x04c3, + 0x04ca, 0x04ee, 0x04f2, 0x04f6, 0x04ff, 0x0506, 0x050c, 0x0513, + 0x051d, 0x0526, 0x052b, 0x0536, 0x053f, 0x0547, 0x054d, 0x055e, + // Entry 80 - BF + 0x0572, 0x0587, 0x058d, 0x059c, 0x05a6, 0x05aa, 0x05b1, 0x05ba, + 0x05c7, 0x05d0, 0x05d8, 0x05df, 0x05e7, 0x05f3, 0x05fa, 0x0601, + 0x0608, 0x060e, 0x0617, 0x0622, 0x062c, 0x0636, 0x0646, 0x0651, + 0x0655, 0x065c, 0x0665, 0x0686, 0x069b, 0x06a5, 0x06b1, 0x06bb, + 0x06c0, 0x06c9, 0x06d1, 0x06d7, 0x06dd, 0x06e6, 0x06ee, 0x06f6, + 0x0706, 0x070b, 0x071a, 0x0722, 0x072b, 0x0736, 0x073f, 0x0744, + 0x0749, 0x074d, 0x075b, 0x075f, 0x0765, 0x0769, 0x077f, 0x078e, + 0x0796, 0x079e, 0x07a5, 0x07ba, 0x07ca, 0x07d5, 0x07f5, 0x0800, + // Entry C0 - FF + 0x0805, 0x080d, 0x0812, 0x0824, 0x082c, 0x0835, 0x083d, 0x0842, + 0x0848, 0x0856, 0x085e, 0x0867, 0x086c, 0x0874, 0x087c, 0x0886, + 0x0892, 0x08a6, 0x08b0, 0x08bc, 0x08c6, 0x08cd, 0x08d5, 0x08df, + 0x08f3, 0x0909, 0x0914, 0x0920, 0x0927, 0x092f, 0x093f, 0x0952, + 0x0956, 0x0988, 0x098c, 0x0997, 0x09a3, 0x09aa, 0x09b5, 0x09c0, + 0x09c9, 0x09ce, 0x09d7, 0x09e8, 0x09ee, 0x09f4, 0x09fd, 0x0a04, + 0x0a0a, 0x0a1c, 0x0a35, 0x0a3c, 0x0a46, 0x0a58, 0x0a6f, 0x0a78, + 0x0a91, 0x0aaa, 0x0ab1, 0x0ab8, 0x0ac7, 0x0acc, 0x0ad2, 0x0ad7, + // Entry 100 - 13F + 0x0ade, 0x0aff, 0x0b06, 0x0b0e, 0x0b1d, 0x0b22, 0x0b28, 0x0b3d, + 0x0b53, 0x0b5c, 0x0b6f, 0x0b80, 0x0b93, 0x0ba7, 0x0bb7, 0x0bcc, + 0x0bd3, 0x0bf3, 0x0bfc, 0x0c0e, 0x0c22, 0x0c36, 0x0c4b, 0x0c57, + 0x0c62, 0x0c7e, 0x0c89, 0x0c8e, 0x0c9d, 0x0caf, 0x0cb5, 0x0cc8, + 0x0cdc, 0x0cef, 0x0d01, + }, + }, + { // dua + "Cameroun", + []uint16{ // 50 elements + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0008, + }, + }, + { // dyo + "AndorraAfganistanAntigua di BarbudaAngiiyaAlbaniArmeniAngolaArsantinSamo" + + "a yati AmerikOtrisOstraaliaArubaAserbaysanBosni di HersegovinBarbadB" + + "angladesBelsikBurukiina FasoBulgariBahraynBurundiBeneBermudBuruneyBo" + + "liiviBresilBahamaButanBoswanaBelarusBeliisKanadaMofam demokratik mat" + + "i KongoKongoKoddiwarCiliKamerunSiinKolombiKosta RikaKubaKap VerSiipr" + + "Mofam mati CekAlmaañJibutiDanmarkDominikaMofam mati DominikAlseriEku" + + "adorEstoniEsíptEritreeEspaañEcoopiFinlandFijiFransGabonGrenadaSeorsi" + + "GaanaSipraltaarGreenlandGambiGinéGuwadalupGresGuatemalaGuamGiné Bisa" + + "auGiyanOndurasKroasiAytiOŋriEndonesiIrlandIsraelEndIrakIranIislandIt" + + "aliSamaikSapoŋKeniyaKambojKomorSaŋ LusiaSiri LankaLiberiaMadagaskaar" + + "MaliEcinkey yati NoorfokAbari SaudiSudanSingapurSloveniSlovakiSerra " + + "LeonSenegalSomaliSalvadoorCadTogoTailand", + []uint16{ // 228 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x0007, 0x0011, 0x0023, 0x002a, 0x0030, + 0x0036, 0x0036, 0x003c, 0x003c, 0x0044, 0x0055, 0x005a, 0x0063, + 0x0068, 0x0068, 0x0072, 0x0085, 0x008b, 0x0094, 0x009a, 0x00a8, + 0x00af, 0x00b6, 0x00bd, 0x00c1, 0x00c1, 0x00c7, 0x00ce, 0x00d5, + 0x00d5, 0x00db, 0x00e1, 0x00e6, 0x00e6, 0x00ed, 0x00f4, 0x00fa, + 0x0100, 0x0100, 0x011b, 0x011b, 0x0120, 0x0120, 0x0128, 0x0128, + 0x012c, 0x0133, 0x0137, 0x013e, 0x013e, 0x0148, 0x014c, 0x0153, + 0x0153, 0x0153, 0x0158, 0x0166, 0x016d, 0x016d, 0x0173, 0x017a, + // Entry 40 - 7F + 0x0182, 0x0194, 0x019a, 0x019a, 0x01a1, 0x01a7, 0x01ad, 0x01ad, + 0x01b4, 0x01bb, 0x01c1, 0x01c1, 0x01c8, 0x01cc, 0x01cc, 0x01cc, + 0x01cc, 0x01d1, 0x01d6, 0x01d6, 0x01dd, 0x01e3, 0x01e3, 0x01e3, + 0x01e8, 0x01f2, 0x01fb, 0x0200, 0x0205, 0x020e, 0x020e, 0x0212, + 0x0212, 0x021b, 0x021f, 0x022b, 0x0230, 0x0230, 0x0230, 0x0237, + 0x023d, 0x0241, 0x0246, 0x0246, 0x024e, 0x0254, 0x025a, 0x025a, + 0x025d, 0x025d, 0x0261, 0x0265, 0x026c, 0x0271, 0x0271, 0x0277, + 0x0277, 0x027d, 0x0283, 0x0283, 0x0289, 0x0289, 0x028e, 0x028e, + // Entry 80 - BF + 0x028e, 0x028e, 0x028e, 0x028e, 0x028e, 0x028e, 0x028e, 0x0298, + 0x0298, 0x02a2, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, + 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02a9, 0x02b4, 0x02b4, 0x02b4, + 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, + 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02b8, + 0x02b8, 0x02b8, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, + 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, + 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, + // Entry C0 - FF + 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, 0x02cc, + 0x02cc, 0x02d7, 0x02d7, 0x02d7, 0x02dc, 0x02dc, 0x02e4, 0x02e4, + 0x02eb, 0x02eb, 0x02f2, 0x02fc, 0x02fc, 0x0303, 0x0309, 0x0309, + 0x0309, 0x0309, 0x0312, 0x0312, 0x0312, 0x0312, 0x0312, 0x0312, + 0x0315, 0x0315, 0x0319, 0x0320, + }, + }, + { // dz + "ཨེ་སེན་ཤུན་ཚོ་གླིང༌ཨཱན་དོ་རཡུ་ནཱའི་ཊེཌ་ ཨ་རབ་ ཨེ་མེ་རེཊསཨཕ་གྷ་ནི་སཏཱནཨན་" + + "ཊི་གུ་ཝ་ ཨེནཌ་ བྷར་བྷུ་ཌཨང་གི་ལཨཱལ་བེ་ནི་ཡཨར་མི་ནི་ཡཨང་གྷོ་ལའཛམ་གླ" + + "ིང་ལྷོ་མཐའི་ཁྱགས་གླིངཨར་ཇེན་ཊི་ནས་མོ་ཨ་ཡུ་ཨེས་ཨེ་མངའ་ཁོངསཨཱོས་ཊྲི་" + + "ཡཨཱོས་ཊྲེལ་ལི་ཡཨ་རུ་བཱཨ་ལནཌ་གླིང་ཚོམཨ་ཛར་བྷའི་ཇཱནབྷོས་ནི་ཡ་ ཨེནཌ་ " + + "ཧར་ཛི་གྷོ་བི་ནབྷར་བེ་ཌོསབངྒ་ལ་དེཤབྷེལ་ཇམབྷར་ཀི་ན་ ཕེ་སོབུལ་ག་རི་ཡབ" + + "ྷ་རེནབྷུ་རུན་ཌིབྷེ་ནིནསེནཊ་ བར་ཐོ་ལོམ་མིའུབར་མུ་ཌབྷྲུ་ནའིབྷེ་ལི་བི" + + "་ཡཀེ་རི་བི་ཡེན་ནེ་དར་ལནཌས྄བྲ་ཛིལབྷ་ཧ་མས྄འབྲུགབོའུ་ཝེཊ་མཚོ་གླིངབྷོཙ" + + "་ཝ་ནབེལ་ཨ་རུ་སུབྷེ་ལིཛཀེ་ན་ཌཀོ་ཀོས་གླིང་ཚོམཀོང་གྷོ ཀིན་ཤ་སསེན་ཊལ་ " + + "ཨཕ་རི་ཀཱན་ རི་པབ་ལིཀཀོང་གྷོ བྷྲ་ཛ་བིལསུ་ཝིཊ་ཛར་ལེནཌཀོ་ཊེ་ ཌི་ཨི་ཝོ" + + "་རེཀུག་གླིང་ཚོམཅི་ལིཀེ་མ་རུནརྒྱ་ནགཀོ་ལོམ་བྷི་ཡཀི་ལི་པེར་ཊོན་མཚོ་གླ" + + "ིང་ཀོས་ཊ་རི་ཀཀིའུ་བྷཀེཔ་བཱཌཀྱཱུར་ར་ཀོཁི་རིསྟ་མེས་མཚོ་གླིངསཱའི་པྲསཅ" + + "ེཀ་ རི་པབ་ལིཀཇཱར་མ་ནིཌི་ཡེ་གོ་གར་སིའོཇི་བྷུ་ཊིཌེན་མཱཀཌོ་མི་ནི་ཀཌོ་" + + "མི་ནི་ཀཱན་ རི་པབ་ལིཀཨཱལ་ཇི་རི་ཡསེ་ཨུ་ཏ་ ཨེནཌ་ མེལ་ལི་ལཨེ་ཁྭ་ཌོརཨེས" + + "་ཊོ་ནི་ཡཨི་ཇིབཊནུབ་ཕྱོགས་ ས་ཧཱ་རཨེ་རི་ཊྲེ་ཡཨིས་པེནཨི་ཐི་ཡོ་པི་ཡཡུ་" + + "རོབ་གཅིག་བསྡོམས་ཚོགས་པཕིན་ལེནཌཕི་ཇིཕལྐ་ལནྜ་གླིང་ཚོམམའི་ཀྲོ་ནི་ཤི་ཡ" + + "ཕཱའེ་རོ་གླིང་ཚོམཕྲཱནསགྷ་བྷོནཡུ་ནཱའི་ཊེཌ་ ཀིང་ཌམགྲྀ་ན་ཌཇཽར་ཇཱགུའི་ཡ" + + "་ན་ ཕྲནས྄་མངའ་ཁོངསགུ་ཨེརྣ་སིགྷ་ནཇིབ་རཱལ་ཊརགིརཱིན་ལནཌ྄གྷེམ་བི་ཡགྷི་" + + "ནིགོ་ཌེ་ལུ་པེཨེ་ཀུ་ཊོ་རེལ་ གི་ནིགིརིས྄སཱའུཐ་ཇཽར་ཇཱ་ དང་ སཱའུཐ་སེནཌ" + + "྄་ཝིཅ་གླིང་ཚོམགྷོ་ཊ་མ་ལགུ་འམ་ མཚོ་གླིངགྷི་ནི་ བྷི་སཱའུགྷ་ཡ་ནཧོང་ཀོ" + + "ང་ཅཱའི་ནཧཱརཌ་མཚོ་གླིང་ དང་ མེཀ་ཌོ་ནལཌ྄་གླིང་ཚོམཧཱན་ཌུ་རཱས྄ཀྲོ་ཨེ་ཤ" + + "ཧེ་ཊིཧཱང་གྷ་རིཀ་ནེ་རི་གླིང་ཚོམཨིན་ཌོ་ནེ་ཤི་ཡཨཱ་ཡ་ལེནཌཨིས་ར་ཡེལཨ་ཡུ" + + "ལ་ ཨོཕ་ མཱནརྒྱ་གརབྲི་ཊིཤ་རྒྱ་གར་གྱི་རྒྱ་མཚོ་ས་ཁོངསཨི་རཱཀཨི་རཱནཨཱའི" + + "ས་ལེནཌཨི་ཊ་ལིཇེར་སིཇཱ་མཻ་ཀཇོར་ཌནཇ་པཱནཀེན་ཡཀིར་གིས་སཏཱནཀམ་བྷོ་ཌི་ཡཀ" + + "ི་རི་བ་ཏི་མཚོ་གླིངཀོ་མོ་རོསསེནཊ་ ཀིཊས་ དང་ ནེ་བིསབྱང་ ཀོ་རི་ཡལྷོ་ " + + "ཀོ་རི་ཡཀུ་ཝེཊཁེ་མེན་གླིང་ཚོམཀ་ཛགས་སཏཱནལཱ་ཝོསལེ་བ་ནོནསེནཊ་ ལུ་སི་ཡལ" + + "ིཀ་ཏནས་ཏ་ཡིནཤྲཱི་ལང་ཀལཱའི་བེ་རི་ཡལཻ་སོ་ཐོལི་ཐུ་ཝེ་ནི་ཡལག་ཛམ་བོརྒལཊ" + + "་བི་ཡལི་བི་ཡམོ་རོ་ཀོམོ་ན་ཀོམོལ་དོ་བཱམོན་ཊི་ནེག་རོསེནཊ་ མཱར་ཊིནམ་དཱ" + + "་གེས་ཀརམར་ཤེལ་གླིང་ཚོམམ་སེ་ཌོ་ནི་ཡམཱ་ལིམི་ཡཱན་མར་ (བྷར་མ)སོག་པོ་ཡུ" + + "ལམཀ་ཨའུ་ཅཱའི་ནབྱང་ཕྱོགས་ཀྱི་མ་ར་ཡ་ན་གླིང་ཚོམམཱར་ཊི་ནིཀམོ་རི་ཊེ་ནི་" + + "ཡམོན་ས་རཊམཱལ་ཊམོ་རི་ཤཱསམཱལ་དིབསམ་ལ་ཝིམེཀ་སི་ཀོམ་ལེ་ཤི་ཡམོ་ཛམ་བྷིཀན" + + "་མི་བི་ཡནིའུ་ཀ་ལི་དོ་ནི་ཡནཱའི་ཇཱནོར་ཕོལཀ་མཚོ་གླིང༌ནཱའི་ཇི་རི་ཡནི་ཀ" + + "ྲ་ཝ་གནེ་དར་ལནཌས྄ནོར་ཝེབལ་ཡུལནའུ་རུ་ནི་ཨུ་ཨཻནིའུ་ཛི་ལེནཌཨོ་མཱནཔ་ན་མ" + + "པེ་རུཕྲཱནས྄་ཀྱི་པོ་ལི་ནི་ཤི་ཡཔ་པུ་ ནིའུ་གི་ནིཕི་ལི་པིནསཔ་ཀི་སཏཱནཔོ" + + "་ལེནཌསིནཊ་པི་ཡེར་ ཨེནཌ་ མིཀོ་ལེནཔིཊ་ཀེ་ཡེརན་གླིང་ཚོམཔུ་འེར་ཊོ་རི་ཁ" + + "ོཔེ་ལིསི་ཊི་ནི་ཡན་ཊེ་རི་ཐོ་རིཔོར་ཅུ་གཱལཔ་ལའུཔ་ར་གུ་ཝའིཀ་ཊརཨོཤི་ཡཱན" + + "་ན་གྱི་མཐའ་མཚམསརེ་ཡུ་ནི་ཡོནརོ་མེ་ནི་ཡསཱར་བྷི་ཡཨུ་རུ་སུརུ་ཝན་ཌསཱཝ་ད" + + "ི་ ཨ་རེ་བྷི་ཡསོ་ལོ་མོན་ གླིང་ཚོམསེ་ཤཱལསསུ་ཌཱནསུའི་ཌེནསིང་ག་པོརསེནཊ" + + "་ ཧེ་ལི་ནསུ་ལོ་བི་ནི་ཡསྭཱལ་བྷརྡ་ ཨེནཌ་ ཇཱན་མ་ཡེནསུ་ལོ་བཱ་ཀི་ཡསི་ར་" + + " ལི་འོནསཱན་མ་རི་ནོསེ་ནི་གྷལསོ་མ་ལི་ཡསུ་རི་ནཱམསཱའུཐ་ སུ་ཌཱནསཝ་ ཊོ་མེ་" + + " ཨེནཌ་ པྲྀན་སི་པེཨེལ་སལ་བ་ཌོརསིནཊ་ མཱར་ཊེནསི་རི་ཡསུ་ཝ་ཛི་ལེནཌཏྲིས་ཏན" + + "་ད་ཀུན་ཧཏུརྐས྄་ ཨེནཌ་ ཀ་ཀོས་གླིང་ཚོམཅཱཌཕྲནཅ་གི་ལྷོ་ཕྱོགས་མངའ་ཁོངསཊ" + + "ོ་གྷོཐཱའི་ལེནཌཏ་ཇིག་གི་སཏཱནཏོ་ཀེ་ལའུ་ མཚོ་གླིངཏི་་མོར་ལེ་ཨེསཊཊཱརཀ་" + + "མེནའི་སཏཱནཊུ་ནི་ཤི་ཡཊོང་གྷཊཱར་ཀིཊི་ནི་ཌཱཌ་ ཨེནཌ་ ཊོ་བྷེ་གྷོཏུ་ཝ་ལུ" + + "ཊཱའི་ཝཱནཊཱན་ཛཱ་ནི་ཡཡུ་ཀརེནཡུ་གྷན་ཌཡུ་ཨེས་གྱི་མཐའ་མཚམས་མཚོ་གླིང་ཡུ་" + + "ཨེས་ཨེཡུ་རུ་གུ་ཝའིཨུས་བེག་གི་སཏཱནབ་ཊི་ཀཱན་ སི་ཊིསེནཊ་ཝིན་སེནཌ྄ ཨེན" + + "ཌ་ གི་རེ་ན་དིནས྄བེ་ནི་ཛུ་ཝེ་ལཝརཇིན་གླིང་ཚོམ་ བྲཱི་ཊིཤ་མངའ་ཁོངསཝརཇི" + + "ན་གླིང་ཚོམ་ ཡུ་ཨེས་ཨེ་མངའ་ཁོངསབེཊ་ནཱམཝ་ནུ་ཨ་ཏུཝལ་ལིས྄་ ཨེནཌ་ ཕུ་ཏུ" + + "་ན་ས་མོ་ཨཡེ་མེནམེ་ཡོཊསཱའུཐ་ ཨཕ་རི་ཀཛམ་བྷི་ཡཛིམ་བྷབ་ཝེངོ་མ་ཤེས་པའི་" + + "ལུང་ཕྱོགསའཛམ་གླིང༌ཨཕ་རི་ཀབྱང་ཨ་མི་རི་ཀལྷོ་ཨ་མི་རི་ཀཨོཤི་ཡཱན་ནནུབ་ཕ" + + "ྱོགས་ཀྱི་ཨཕ་རི་ཀབར་ཕྱོགས་ཨ་མི་རི་ཀཤར་ཕྱོགས་ཀྱི་ཨཕ་རི་ཀབྱང་ཕྱོགས་ཀྱ" + + "ི་ཨཕ་རི་ཀསྦུག་ཕྱོགས་ཀྱི་ཨཕ་རི་ཀལྷོའི་ཨཕ་རི་ཀཨ་མི་རི་ཀ་ཚུབྱང་ཕྱོགས་" + + "ཀྱི་ཨ་མི་རི་ཀཀེ་རི་བི་ཡེནཤར་ཕྱོགས་ཀྱི་ཨེ་ཤི་ཡལྷོའི་ཨེ་ཤི་ཡལྷོ་ཤར་ཕ" + + "ྱོགས་ཀྱི་ཨེ་ཤི་ཡལྷོའི་ཡུ་རོབཨཱོས་ཊྲེལ་ཨེ་ཤི་ཡམེ་ལ་ནི་ཤི་ཡལུང་ཕྱོགས" + + "་མའི་ཀྲོ་ནི་ཤི་ཡཔོ་ལི་ནི་ཤི་ཡཨེ་ཤི་ཡསྦུག་ཕྱོགས་ཀྱི་ཨེ་ཤི་ཡནུབ་ཕྱོག" + + "ས་ཀྱི་ཨེ་ཤི་ཡཡུ་རོབཤར་ཕྱོགས་ཀྱི་ཡུ་རོབབྱང་ཕྱོགས་ཀྱི་ཡུ་རོབནུབ་ཕྱོག" + + "ས་ཀྱི་ཡུ་རོབལེ་ཊིནཨ་མི་རི་ཀ", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0039, 0x0051, 0x00a4, 0x00cb, 0x0118, 0x012d, 0x014e, + 0x016c, 0x016c, 0x0184, 0x01d5, 0x01f6, 0x0241, 0x025f, 0x0289, + 0x029e, 0x02c8, 0x02ef, 0x0348, 0x0366, 0x0381, 0x0396, 0x03c1, + 0x03df, 0x03f1, 0x040f, 0x0424, 0x045e, 0x0473, 0x048b, 0x04ac, + 0x04f4, 0x0506, 0x051e, 0x052d, 0x0560, 0x0578, 0x0599, 0x05ae, + 0x05c0, 0x05ed, 0x0618, 0x0668, 0x0699, 0x06c3, 0x06f7, 0x071b, + 0x072a, 0x0742, 0x0754, 0x0778, 0x07bd, 0x07db, 0x07f0, 0x0805, + 0x0823, 0x085f, 0x0877, 0x089f, 0x08b7, 0x08e7, 0x0902, 0x0917, + // Entry 40 - 7F + 0x0935, 0x0978, 0x0999, 0x09da, 0x09f5, 0x0a16, 0x0a2b, 0x0a5c, + 0x0a7d, 0x0a92, 0x0ab9, 0x0b04, 0x0b1c, 0x0b2b, 0x0b5b, 0x0b88, + 0x0bb8, 0x0bc7, 0x0bdc, 0x0c13, 0x0c28, 0x0c3a, 0x0c80, 0x0c9e, + 0x0caa, 0x0cc8, 0x0ce9, 0x0d04, 0x0d16, 0x0d37, 0x0d6e, 0x0d80, + 0x0dfa, 0x0e15, 0x0e40, 0x0e6e, 0x0e80, 0x0eaa, 0x0f1b, 0x0f3c, + 0x0f54, 0x0f63, 0x0f7e, 0x0fae, 0x0fd8, 0x0ff3, 0x100e, 0x1037, + 0x1049, 0x10ac, 0x10be, 0x10d0, 0x10ee, 0x1103, 0x1115, 0x112a, + 0x113c, 0x114b, 0x115a, 0x117e, 0x119f, 0x11d8, 0x11f3, 0x122f, + // Entry 80 - BF + 0x1251, 0x1273, 0x1285, 0x12b2, 0x12d0, 0x12e2, 0x12fa, 0x131f, + 0x1346, 0x1361, 0x1385, 0x139d, 0x13c4, 0x13e2, 0x13f7, 0x140c, + 0x1424, 0x1439, 0x1454, 0x147b, 0x14a0, 0x14c1, 0x14ee, 0x1512, + 0x1521, 0x1551, 0x156f, 0x1596, 0x15f0, 0x160e, 0x1635, 0x164d, + 0x165c, 0x1677, 0x168f, 0x16a1, 0x16bc, 0x16d7, 0x16f5, 0x1710, + 0x1743, 0x1758, 0x178e, 0x17b2, 0x17cd, 0x17ee, 0x1800, 0x1812, + 0x1827, 0x183f, 0x1863, 0x1875, 0x1884, 0x1893, 0x18db, 0x1909, + 0x1927, 0x1942, 0x1957, 0x19a4, 0x19e0, 0x1a0d, 0x1a61, 0x1a7f, + // Entry C0 - FF + 0x1a8e, 0x1aac, 0x1ab8, 0x1afd, 0x1b21, 0x1b3f, 0x1b5a, 0x1b72, + 0x1b87, 0x1bbb, 0x1bf2, 0x1c07, 0x1c19, 0x1c31, 0x1c4c, 0x1c71, + 0x1c98, 0x1ce2, 0x1d09, 0x1d2b, 0x1d4c, 0x1d67, 0x1d82, 0x1d9d, + 0x1dc2, 0x1e0d, 0x1e31, 0x1e56, 0x1e6b, 0x1e8f, 0x1ebc, 0x1f0c, + 0x1f15, 0x1f63, 0x1f75, 0x1f90, 0x1fb7, 0x1fee, 0x201b, 0x2048, + 0x2066, 0x2078, 0x208a, 0x20d7, 0x20ec, 0x2104, 0x2125, 0x213a, + 0x2152, 0x21a9, 0x21c4, 0x21e8, 0x2215, 0x2240, 0x22a2, 0x22c9, + 0x232a, 0x238e, 0x23a3, 0x23be, 0x23ff, 0x2411, 0x2411, 0x2423, + // Entry 100 - 13F + 0x2435, 0x245d, 0x2475, 0x2493, 0x24d5, 0x24f0, 0x2505, 0x252c, + 0x2553, 0x2571, 0x25b0, 0x25e6, 0x2622, 0x2661, 0x26a3, 0x26ca, + 0x26ee, 0x2733, 0x2757, 0x2793, 0x27ba, 0x2802, 0x2826, 0x2859, + 0x287d, 0x28c8, 0x28ef, 0x2904, 0x2946, 0x2985, 0x2997, 0x29d0, + 0x2a0c, 0x2a48, 0x2a75, + }, + }, + { // ebu + "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + + "iaAntili za UholanziAngolaAjentinaSamoa ya MarekaniAustriaAustraliaA" + + "rubaAzabajaniBosnia na HezegovinaBabadosiBangladeshiUbelgijiBukinafa" + + "soBulgariaBahareniBurundiBeniniBermudaBruneiBoliviaBraziliBahamaButa" + + "niBotswanaBelarusiBelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhur" + + "i ya Afrika ya KatiKongoUswisiKodivaaVisiwa vya CookChileKameruniChi" + + "naKolombiaKostarikaKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibut" + + "iDenmakiDominikaJamhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaH" + + "ispaniaUhabeshiUfiniFijiVisiwa vya FalklandMikronesiaUfaransaGaboniU" + + "ingerezaGrenadaJojiaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaG" + + "ineGwadelupeGinekwetaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKor" + + "asiaHaitiHungariaIndonesiaAyalandiIsraeliIndiaEneo la Uingereza kati" + + "ka Bahari HindiIrakiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKir" + + "igizistaniKambodiaKiribatiKomoroSantakitzi na NevisKorea KaskaziniKo" + + "rea KusiniKuwaitiVisiwa vya KaymanKazakistaniLaosiLebanoniSantalusia" + + "LishenteniSirilankaLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoM" + + "onakoMoldovaBukiniVisiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa" + + " vya Mariana vya KaskaziniMartinikiMoritaniaMontserratiMaltaMorisiMo" + + "divuMalawiMeksikoMalesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha " + + "NorfokNijeriaNikaragwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPan" + + "amaPeruPolinesia ya UfaransaPapuaFilipinoPakistaniPolandiSantapieri " + + "na MikeloniPitkairniPwetorikoUkingo wa Magharibi na Ukanda wa Gaza w" + + "a PalestinaUrenoPalauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiV" + + "isiwa vya SolomonShelisheliSudaniUswidiSingapooSantahelenaSloveniaSl" + + "ovakiaSiera LeoniSamarinoSenegaliSomaliaSurinamuSao Tome na Principe" + + "ElsavadoSiriaUswaziVisiwa vya Turki na KaikoChadiTogoTailandiTajikis" + + "taniTokelauTimori ya MasharikiTurukimenistaniTunisiaTongaUturukiTrin" + + "idad na TobagoTuvaluTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibe" + + "kistaniVatikaniSantavisenti na GrenadiniVenezuelaVisiwa vya Virgin v" + + "ya UingerezaVisiwa vya Virgin vya MarekaniVietinamuVanuatuWalis na F" + + "utunaSamoaYemeniMayotteAfrika KusiniZambiaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, + 0x004a, 0x005c, 0x0062, 0x0062, 0x006a, 0x007b, 0x0082, 0x008b, + 0x0090, 0x0090, 0x0099, 0x00ad, 0x00b5, 0x00c0, 0x00c8, 0x00d2, + 0x00da, 0x00e2, 0x00e9, 0x00ef, 0x00ef, 0x00f6, 0x00fc, 0x0103, + 0x0103, 0x010a, 0x0110, 0x0116, 0x0116, 0x011e, 0x0126, 0x012c, + 0x0132, 0x0132, 0x0152, 0x016b, 0x0170, 0x0176, 0x017d, 0x018c, + 0x0191, 0x0199, 0x019e, 0x01a6, 0x01a6, 0x01af, 0x01b3, 0x01bb, + 0x01bb, 0x01bb, 0x01c2, 0x01d2, 0x01db, 0x01db, 0x01e1, 0x01e8, + // Entry 40 - 7F + 0x01f0, 0x0203, 0x020a, 0x020a, 0x0210, 0x0217, 0x021c, 0x021c, + 0x0223, 0x022b, 0x0233, 0x0233, 0x0238, 0x023c, 0x024f, 0x0259, + 0x0259, 0x0261, 0x0267, 0x0270, 0x0277, 0x027c, 0x028f, 0x028f, + 0x0294, 0x029c, 0x02a5, 0x02ab, 0x02af, 0x02b8, 0x02c1, 0x02c8, + 0x02c8, 0x02d1, 0x02d5, 0x02de, 0x02e4, 0x02e4, 0x02e4, 0x02ed, + 0x02f4, 0x02f9, 0x0301, 0x0301, 0x030a, 0x0312, 0x0319, 0x0319, + 0x031e, 0x0343, 0x0348, 0x034e, 0x0356, 0x035c, 0x035c, 0x0363, + 0x036a, 0x0370, 0x0375, 0x0382, 0x038a, 0x0392, 0x0398, 0x03ab, + // Entry 80 - BF + 0x03ba, 0x03c6, 0x03cd, 0x03de, 0x03e9, 0x03ee, 0x03f6, 0x0400, + 0x040a, 0x0413, 0x041a, 0x0420, 0x0428, 0x0431, 0x0438, 0x043d, + 0x0443, 0x0449, 0x0450, 0x0450, 0x0450, 0x0456, 0x0468, 0x0471, + 0x0475, 0x047a, 0x0482, 0x0482, 0x04a2, 0x04ab, 0x04b4, 0x04bf, + 0x04c4, 0x04ca, 0x04d0, 0x04d6, 0x04dd, 0x04e4, 0x04ec, 0x04f3, + 0x04ff, 0x0505, 0x0516, 0x051d, 0x0526, 0x052e, 0x0533, 0x0539, + 0x053e, 0x0542, 0x054c, 0x0551, 0x0557, 0x055b, 0x0570, 0x0575, + 0x057d, 0x0586, 0x058d, 0x05a3, 0x05ac, 0x05b5, 0x05e7, 0x05ec, + // Entry C0 - FF + 0x05f1, 0x05f9, 0x05ff, 0x05ff, 0x0608, 0x060f, 0x060f, 0x0614, + 0x061a, 0x061f, 0x0631, 0x063b, 0x0641, 0x0647, 0x064f, 0x065a, + 0x0662, 0x0662, 0x066a, 0x0675, 0x067d, 0x0685, 0x068c, 0x0694, + 0x0694, 0x06a8, 0x06b0, 0x06b0, 0x06b5, 0x06bb, 0x06bb, 0x06d4, + 0x06d9, 0x06d9, 0x06dd, 0x06e5, 0x06f0, 0x06f7, 0x070a, 0x0719, + 0x0720, 0x0725, 0x072c, 0x073e, 0x0744, 0x074b, 0x0753, 0x075a, + 0x0760, 0x0760, 0x0768, 0x076f, 0x077b, 0x0783, 0x079c, 0x07a5, + 0x07c4, 0x07e2, 0x07eb, 0x07f2, 0x0801, 0x0806, 0x0806, 0x080c, + // Entry 100 - 13F + 0x0813, 0x0820, 0x0826, 0x082e, + }, + }, + { // ee + "Ascension ƒudomekpo nutomeAndorra nutomeUnited Arab Emirates nutomeAfgha" + + "nistan nutoméAntigua kple Barbuda nutomeAnguilla nutomeAlbania nuto" + + "meArmenia nutomeNedalands Antilis nutomeAngola nutomeAntartica nutom" + + "eArgentina nutomeAmerika Samoa nutomeAustria nutomeAustralia nutomeA" + + "ruba nutomeÅland ƒudomekpo nutomeAzerbaijan nutomeBosnia kple Herzer" + + "govina nutomeBarbados nutomeBangladesh nutomeBelgium nutomeBurkina F" + + "aso nutomeBulgaria nutomeBahrain nutomeBurundi nutomeBenin nutomeSai" + + "nt Barthélemy nutomeBermuda nutomeBrunei nutomeBolivia nutomeBrazil " + + "nutomeBahamas nutomeBhutan nutomeBouvet ƒudomekpo nutomeBotswana nut" + + "omeBelarus nutomeBelize nutomeCanada nutomeKokos (Kiling) fudomekpo " + + "nutomeKongo Kinshasa nutomeTitina Afrika repɔblik nutomeKongo Brazza" + + "ville nutomeSwitzerland nutomeKote d’Ivoire nutomeKook ƒudomekpo nut" + + "omeTsile nutomeKamerun nutomeTsaina nutomeKolombia nutomeKlipaton ƒu" + + "domekpo nutomeKosta Rika nutomeKuba nutomeKape Verde nutomeKristmas " + + "ƒudomekpo nutomeSaiprus nutomeTsɛk repɔblik nutomeGermania nutomeDi" + + "ego Garsia nutomeDzibuti nutomeDenmark nutomeDominika nutomeDominika" + + " repɔblik nutomeAlgeria nutomeKeuta and Melilla nutomeEkuadɔ nutomeE" + + "stonia nutomeEgypte nutomeƔetoɖoƒe Sahara nutomeEritrea nutomeSpain " + + "nutomeEtiopia nutomeEuropa Wɔɖeka nutomeFinland nutomeFidzi nutomeFa" + + "lkland ƒudomekpowo nutomeMikronesia nutomeFaroe ƒudomekpowo nutomeFr" + + "ance nutomeGabɔn nutomeUnited Kingdom nutomeGrenada nutomeGeorgia nu" + + "tomeFrentsi Gayana nutomeGuernse nutomeGhana nutomeGibraltar nutomeG" + + "rinland nutomeGambia nutomeGuini nutomeGuadelupe nutomeEkuatorial Gu" + + "ini nutomeGreece nutomeAnyiehe Georgia kple Anyiehe Sandwich ƒudomek" + + "powo nutomeGuatemala nutomeGuam nutomeGini-Bisao nutomeGuyanaduHɔng " + + "Kɔng SAR Tsaina nutomeHeard kple Mcdonald ƒudomekpowo nutomeHonduras" + + "duKroatsia nutomeHaiti nutomeHungari nutomeKanari ƒudomekpowo nutome" + + "Indonesia nutomeIreland nutomeIsrael nutomeAisle of Man nutomeIndia " + + "nutomeBritaintɔwo ƒe india ƒudome nutomeiraqdukɔIran nutomeAiseland " + + "nutomeItalia nutomeDzɛse nutomeDzamaika nutomeYordan nutomeDzapan nu" + + "tomeKenya nutomeKirgizstan nutomeKambodia nutomeKiribati nutomeKomor" + + "os nutomeSaint Kitis kple Nevis nutomeDziehe Korea nutomeAnyiehe Kor" + + "ea nutomeKuwait nutomeKayman ƒudomekpowo nutomeKazakstan nutomeLaos " + + "nutomeLebanɔn nutomeSaint Lusia nutomeLitsenstein nutomeSri Lanka nu" + + "tomeLiberia nutomeLɛsoto nutomeLituania nutomeLazembɔg nutomeLatvia " + + "nutomeLibya nutomeMoroko nutomeMonako nutomeMoldova nutomeMontenegro" + + " nutomeSaint Martin nutomeMadagaska nutomeMarshal ƒudomekpowo nutome" + + "Makedonia nutomeMali nutomeMyanmar (Burma) nutomeMongolia nutomeMaca" + + "u SAR Tsaina nutomeDziehe Marina ƒudomekpowo nutomeMartiniki nutomeM" + + "auritania nutomeMontserrat nutomeMalta nutomemauritiusdukɔmaldivesdu" + + "kɔMalawi nutomeMexico nutomeMalaysia nutomeMozambiki nutomeNamibia n" + + "utomeNew Kaledonia nutomeNiger nutomeNorfolk ƒudomekpo nutomeNigeria" + + " nutomeNicaraguadukɔNetherlands nutomeNorway nutomeNepal nutomeNauru" + + " nutomeNiue nutomeNew Zealand nutomeOman nutomePanama nutomePeru nut" + + "omeFrentsi Pɔlinesia nutomePapua New Gini nutomeFilipini nutomePakis" + + "tan nutomePoland nutomeSaint Pierre kple Mikelɔn nutomePitkairn ƒudo" + + "mekpo nutomePuerto Riko nutomePalestinia nutomePortugal nutomePalau " + + "nutomeParagua nutomeKatar nutomeOutlaying Oceania nutomeRéunion nuto" + + "meRomania nutomeRussia nutomeRwanda nutomeSaudi Arabia nutomeSolomon" + + " ƒudomekpowo nutomeSeshɛls nutomeSudan nutomeSweden nutomeSingapɔr n" + + "utomeSaint Helena nutomeSlovenia nutomeSvalbard kple Yan Mayen nutom" + + "eSlovakia nutomeSierra Leone nutomeSan Marino nutomeSenegal nutomeSo" + + "malia nutomeSuriname nutomeSão Tomé kple Príncipe nutomeEl Salvadɔ n" + + "utomeSiria nutomeSwaziland nutomeTristan da Kunha nutomeTɛks kple Ka" + + "ikos ƒudomekpowo nutomeTsad nutomeAnyiehe Franseme nutomeTogo nutome" + + "Thailand nutomeTajikistan nutomeTokelau nutomeTimor-Leste nutomeTɛkm" + + "enistan nutomeTunisia nutomeTonga nutomeTɛki nutomeTrinidad kple Tob" + + "ago nutomeTuvalu nutomeTaiwan nutomeTanzania nutomeUkraine nutomeUga" + + "nda nutomeU.S. Minor Outlaying ƒudomekpowo nutomeUSA nutomeuruguaydu" + + "kɔUzbekistan nutomeVatikandu nutomeSaint Vincent kple Grenadine nuto" + + "meVenezuela nutomeBritaintɔwo ƒe Virgin ƒudomekpowo nutomeU.S. Vɛrgi" + + "n ƒudomekpowo nutomeVietnam nutomeVanuatu nutomeWallis kple Futuna n" + + "utomeSamoa nutomeYemen nutomeMayotte nutomeAnyiehe Africa nutomeZamb" + + "ia nutomeZimbabwe nutomenutome manyaxexemeAfrika nutomeDziehe Amerik" + + "a nutomeAnyiehe Amerika nutomeOceania nutomeƔetoɖoƒelɔƒo Afrika nuto" + + "meTitina Amerika nutomeƔedzeƒe Afrika nutomeDziehe Afrika nutomeTiti" + + "na Afrika nutomeAnyiehelɔƒo Afrika nutomeAmerika nutomeDziehelɔƒo Am" + + "erika nutomeKaribbea nutomeƔedzeƒe Asia nutomeAnyiehelɔƒo Asia nutom" + + "eAnyiehe Ɣedzeƒe Afrika nutomeAnyiehelɔƒo Europa nutomeAustralia kpl" + + "e New Zealand nutomeMelanesia nutomeMikronesiaPɔlinesia nutomeAsia n" + + "utomeTitina Asia nutomeƔetoɖoƒelɔƒo Asia nutomeEuropa nutomeƔedzeƒe " + + "Europa nutomeDziehelɔƒo Europa nutomeƔetoɖoƒelɔƒo Europa nutomeLatin" + + " Amerika nutome", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x001b, 0x0029, 0x0044, 0x0056, 0x0073, 0x0082, 0x0090, + 0x009e, 0x00b6, 0x00c3, 0x00d3, 0x00e3, 0x00f7, 0x0105, 0x0115, + 0x0121, 0x0139, 0x014a, 0x0169, 0x0178, 0x0189, 0x0197, 0x01aa, + 0x01b9, 0x01c7, 0x01d5, 0x01e1, 0x01f9, 0x0207, 0x0214, 0x0222, + 0x0222, 0x022f, 0x023d, 0x024a, 0x0262, 0x0271, 0x027f, 0x028c, + 0x0299, 0x02b8, 0x02cd, 0x02eb, 0x0303, 0x0315, 0x032b, 0x0341, + 0x034d, 0x035b, 0x0368, 0x0377, 0x0391, 0x03a2, 0x03ad, 0x03be, + 0x03be, 0x03d8, 0x03e6, 0x03fc, 0x040b, 0x041e, 0x042c, 0x043a, + // Entry 40 - 7F + 0x0449, 0x0462, 0x0470, 0x0488, 0x0496, 0x04a4, 0x04b1, 0x04ca, + 0x04d8, 0x04e4, 0x04f2, 0x0508, 0x0516, 0x0522, 0x053e, 0x054f, + 0x0568, 0x0575, 0x0582, 0x0597, 0x05a5, 0x05b3, 0x05c8, 0x05d6, + 0x05e2, 0x05f2, 0x0601, 0x060e, 0x061a, 0x062a, 0x0641, 0x064e, + 0x0687, 0x0697, 0x06a2, 0x06b3, 0x06bb, 0x06d8, 0x06ff, 0x0709, + 0x0718, 0x0724, 0x0732, 0x074c, 0x075c, 0x076a, 0x0777, 0x078a, + 0x0796, 0x07bb, 0x07c4, 0x07cf, 0x07de, 0x07eb, 0x07f8, 0x0807, + 0x0814, 0x0821, 0x082d, 0x083e, 0x084d, 0x085c, 0x086a, 0x0887, + // Entry 80 - BF + 0x089a, 0x08ae, 0x08bb, 0x08d5, 0x08e5, 0x08f0, 0x08ff, 0x0911, + 0x0923, 0x0933, 0x0941, 0x094f, 0x095e, 0x096e, 0x097b, 0x0987, + 0x0994, 0x09a1, 0x09af, 0x09c0, 0x09d3, 0x09e3, 0x09fe, 0x0a0e, + 0x0a19, 0x0a2f, 0x0a3e, 0x0a55, 0x0a76, 0x0a86, 0x0a97, 0x0aa8, + 0x0ab4, 0x0ac2, 0x0acf, 0x0adc, 0x0ae9, 0x0af8, 0x0b08, 0x0b16, + 0x0b2a, 0x0b36, 0x0b4f, 0x0b5d, 0x0b6b, 0x0b7d, 0x0b8a, 0x0b96, + 0x0ba2, 0x0bad, 0x0bbf, 0x0bca, 0x0bd7, 0x0be2, 0x0bfb, 0x0c10, + 0x0c1f, 0x0c2e, 0x0c3b, 0x0c5c, 0x0c76, 0x0c88, 0x0c99, 0x0ca8, + // Entry C0 - FF + 0x0cb4, 0x0cc2, 0x0cce, 0x0ce6, 0x0cf5, 0x0d03, 0x0d03, 0x0d10, + 0x0d1d, 0x0d30, 0x0d4b, 0x0d5a, 0x0d66, 0x0d73, 0x0d83, 0x0d96, + 0x0da5, 0x0dc3, 0x0dd2, 0x0de5, 0x0df6, 0x0e04, 0x0e12, 0x0e21, + 0x0e21, 0x0e41, 0x0e53, 0x0e53, 0x0e5f, 0x0e6f, 0x0e86, 0x0eab, + 0x0eb6, 0x0ecd, 0x0ed8, 0x0ee7, 0x0ef8, 0x0f06, 0x0f18, 0x0f2b, + 0x0f39, 0x0f45, 0x0f51, 0x0f6c, 0x0f79, 0x0f86, 0x0f95, 0x0fa3, + 0x0fb0, 0x0fd8, 0x0fe2, 0x0fee, 0x0fff, 0x100f, 0x1032, 0x1042, + 0x106d, 0x108d, 0x109b, 0x10a9, 0x10c2, 0x10ce, 0x10ce, 0x10da, + // Entry 100 - 13F + 0x10e8, 0x10fd, 0x110a, 0x1119, 0x1125, 0x112b, 0x1138, 0x114d, + 0x1163, 0x1171, 0x1190, 0x11a5, 0x11bc, 0x11d0, 0x11e4, 0x11ff, + 0x120d, 0x1228, 0x1237, 0x124c, 0x1265, 0x1284, 0x129f, 0x12c0, + 0x12d0, 0x12da, 0x12eb, 0x12f6, 0x1308, 0x1325, 0x1332, 0x1349, + 0x1363, 0x1382, 0x1396, + }, + }, + { // el + elRegionStr, + elRegionIdx, + }, + { // en + enRegionStr, + enRegionIdx, + }, + {}, // en-AU + { // en-GB + enGBRegionStr, + enGBRegionIdx, + }, + { // eo + "AndoroUnuiĝintaj Arabaj EmirlandosAfganujoAntigvo-BarbudoAngviloAlbanujo" + + "ArmenujoNederlandaj AntilojAngoloAntarktoArgentinoAŭstrujoAŭstralioA" + + "ruboAzerbajĝanoBosnio-HercegovinoBarbadoBangladeŝoBelgujoBurkinoBulg" + + "arujoBarejnoBurundoBeninoBermudojBrunejoBolivioBraziloBahamojButanoB" + + "ocvanoBelorusujoBelizoKanadoCentr-Afrika RespublikoKongoloSvisujoEbu" + + "r-BordoKukinsulojĈilioKamerunoĈinujoKolombioKostarikoKuboKabo-VerdoK" + + "iproĈeĥujoGermanujoĜibutioDanujoDominikoDomingoAlĝerioEkvadoroEstonu" + + "joEgiptoOkcidenta SaharoEritreoHispanujoEtiopujoFinnlandoFiĝojMikron" + + "ezioFeroojFrancujoGabonoUnuiĝinta ReĝlandoGrenadoKartvelujoFranca Gv" + + "ianoGanaoĜibraltaroGronlandoGambioGvineoGvadelupoEkvatora GvineoGrek" + + "ujoSud-Georgio kaj Sud-SandviĉinsulojGvatemaloGvamoGvineo-BisaŭoGuja" + + "noHerda kaj Makdonaldaj InsulojHonduroKroatujoHaitioHungarujoIndonez" + + "ioIrlandoIsraeloHindujoBrita Hindoceana TeritorioIrakoIranoIslandoIt" + + "alujoJamajkoJordanioJapanujoKenjoKirgizistanoKamboĝoKiribatoKomorojS" + + "ent-Kristofo kaj NevisoNord-KoreoSud-KoreoKuvajtoKejmanojKazaĥstanoL" + + "aosoLibanoSent-LucioLiĥtenŝtejnoSri-LankoLiberioLesotoLitovujoLuksem" + + "burgoLatvujoLibioMarokoMonakoMoldavujoMadagaskaroMarŝalojMakedonujoM" + + "alioMjanmaoMongolujoNord-MarianojMartinikoMaŭritanujoMaltoMaŭricioMa" + + "ldivojMalavioMeksikoMalajzioMozambikoNamibioNov-KaledonioNiĝeroNorfo" + + "lkinsuloNiĝerioNikaragvoNederlandoNorvegujoNepaloNauroNiuoNov-Zeland" + + "oOmanoPanamoPeruoFranca PolinezioPapuo-Nov-GvineoFilipinojPakistanoP" + + "ollandoSent-Piero kaj MikelonoPitkarna InsuloPuerto-RikoPortugalujoB" + + "elaŭoParagvajoKataroReunioRumanujoRusujoRuandoSaŭda ArabujoSalomonoj" + + "SejŝelojSudanoSvedujoSingapuroSent-HelenoSlovenujoSvalbardo kaj Jan-" + + "Majen-insuloSlovakujoSiera-LeonoSan-MarinoSenegaloSomalujoSurinamoSa" + + "o-Tomeo kaj PrincipeoSalvadoroSirioSvazilandoĈadoTogoloTajlandoTaĝik" + + "ujoTurkmenujoTunizioTongoTurkujoTrinidado kaj TobagoTuvaloTajvanoTan" + + "zanioUkrajnoUgandoUsonaj malgrandaj insulojUsonoUrugvajoUzbekujoVati" + + "kanoSent-Vincento kaj la GrenadinojVenezueloBritaj VirgulininsulojUs" + + "onaj VirgulininsulojVjetnamoVanuatuoValiso kaj FutunoSamooJemenoMajo" + + "toSud-AfrikoZambioZimbabvo", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0023, 0x002b, 0x003a, 0x0041, 0x0049, + 0x0051, 0x0064, 0x006a, 0x0072, 0x007b, 0x007b, 0x0084, 0x008e, + 0x0093, 0x0093, 0x009f, 0x00b1, 0x00b8, 0x00c3, 0x00ca, 0x00d1, + 0x00da, 0x00e1, 0x00e8, 0x00ee, 0x00ee, 0x00f6, 0x00fd, 0x0104, + 0x0104, 0x010b, 0x0112, 0x0118, 0x0118, 0x011f, 0x0129, 0x012f, + 0x0135, 0x0135, 0x0135, 0x014c, 0x0153, 0x015a, 0x0164, 0x016e, + 0x0174, 0x017c, 0x0183, 0x018b, 0x018b, 0x0194, 0x0198, 0x01a2, + 0x01a2, 0x01a2, 0x01a7, 0x01af, 0x01b8, 0x01b8, 0x01c0, 0x01c6, + // Entry 40 - 7F + 0x01ce, 0x01d5, 0x01dd, 0x01dd, 0x01e5, 0x01ed, 0x01f3, 0x0203, + 0x020a, 0x0213, 0x021b, 0x021b, 0x0224, 0x022a, 0x022a, 0x0234, + 0x023a, 0x0242, 0x0248, 0x025c, 0x0263, 0x026d, 0x027a, 0x027a, + 0x027f, 0x028a, 0x0293, 0x0299, 0x029f, 0x02a8, 0x02b7, 0x02be, + 0x02e1, 0x02ea, 0x02ef, 0x02fd, 0x0303, 0x0303, 0x0320, 0x0327, + 0x032f, 0x0335, 0x033e, 0x033e, 0x0347, 0x034e, 0x0355, 0x0355, + 0x035c, 0x0376, 0x037b, 0x0380, 0x0387, 0x038e, 0x038e, 0x0395, + 0x039d, 0x03a5, 0x03aa, 0x03b6, 0x03be, 0x03c6, 0x03cd, 0x03e5, + // Entry 80 - BF + 0x03ef, 0x03f8, 0x03ff, 0x0407, 0x0412, 0x0417, 0x041d, 0x0427, + 0x0435, 0x043e, 0x0445, 0x044b, 0x0453, 0x045e, 0x0465, 0x046a, + 0x0470, 0x0476, 0x047f, 0x047f, 0x047f, 0x048a, 0x0493, 0x049d, + 0x04a2, 0x04a9, 0x04b2, 0x04b2, 0x04bf, 0x04c8, 0x04d4, 0x04d4, + 0x04d9, 0x04e2, 0x04ea, 0x04f1, 0x04f8, 0x0500, 0x0509, 0x0510, + 0x051d, 0x0524, 0x0531, 0x0539, 0x0542, 0x054c, 0x0555, 0x055b, + 0x0560, 0x0564, 0x056f, 0x0574, 0x057a, 0x057f, 0x058f, 0x059f, + 0x05a8, 0x05b1, 0x05b9, 0x05d0, 0x05df, 0x05ea, 0x05ea, 0x05f5, + // Entry C0 - FF + 0x05fc, 0x0605, 0x060b, 0x060b, 0x0611, 0x0619, 0x0619, 0x061f, + 0x0625, 0x0633, 0x063c, 0x0645, 0x064b, 0x0652, 0x065b, 0x0666, + 0x066f, 0x068d, 0x0696, 0x06a1, 0x06ab, 0x06b3, 0x06bb, 0x06c3, + 0x06c3, 0x06da, 0x06e3, 0x06e3, 0x06e8, 0x06f2, 0x06f2, 0x06f2, + 0x06f7, 0x06f7, 0x06fd, 0x0705, 0x070e, 0x070e, 0x070e, 0x0718, + 0x071f, 0x0724, 0x072b, 0x073f, 0x0745, 0x074c, 0x0754, 0x075b, + 0x0761, 0x077a, 0x077f, 0x0787, 0x078f, 0x0797, 0x07b6, 0x07bf, + 0x07d5, 0x07eb, 0x07f3, 0x07fb, 0x080c, 0x0811, 0x0811, 0x0817, + // Entry 100 - 13F + 0x081d, 0x0827, 0x082d, 0x0835, + }, + }, + { // es + esRegionStr, + esRegionIdx, + }, + { // es-419 + es419RegionStr, + es419RegionIdx, + }, + { // es-CL + "Sahara Occidental", + []uint16{ // 72 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0011, + }, + }, + { // es-MX + "BangladeshIslas Cocos (Keeling)GuernseyRegión Administrativa Especial de" + + " Hong Kong de la República Popular ChinaIslas CanariasRegión Adminis" + + "trativa Especial de Macao de la República Popular ChinaTristán de Ac" + + "uñaIslas Ultramarinas Menores de Estados UnidosIslas Vírgenes de los" + + " Estados UnidosÁfrica OccidentalÁfrica OrientalÁfrica del NorteÁfric" + + "a CentralÁfrica del SurAméricasAsia OrientalAsia del SurSudeste Asiá" + + "ticoEuropa del SurAsia CentralAsia OccidentalEuropa OrientalEuropa d" + + "el NorteEuropa Occidental", + []uint16{ // 290 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + // Entry 40 - 7F + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, + 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x001f, 0x0027, + 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, + 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0072, 0x0072, 0x0072, + 0x0072, 0x0072, 0x0072, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + // Entry 80 - BF + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, + 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, + 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, + 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, + 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, + // Entry C0 - FF + 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, + 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, + 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, + 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00c7, 0x00d9, 0x00d9, + 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, + 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, + 0x00d9, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, 0x0105, + 0x0105, 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, + // Entry 100 - 13F + 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, 0x012a, + 0x012a, 0x012a, 0x013c, 0x013c, 0x014c, 0x015d, 0x016c, 0x017b, + 0x0184, 0x0184, 0x0184, 0x0191, 0x019d, 0x01ae, 0x01bc, 0x01bc, + 0x01bc, 0x01bc, 0x01bc, 0x01bc, 0x01c8, 0x01d7, 0x01d7, 0x01e6, + 0x01f6, 0x0207, + }, + }, + { // et + etRegionStr, + etRegionIdx, + }, + { // eu + "Ascension uharteaAndorraArabiar Emirerri BatuakAfganistanAntigua eta Bar" + + "budaAngilaAlbaniaArmeniaHolandarren AntillakAngolaAntartikaArgentina" + + "Amerikar SamoaAustriaAustraliaArubaAland uharteakAzerbaijanBosnia-He" + + "rzegovinaBarbadosBangladeshBelgikaBurkina FasoBulgariaBahrainBurundi" + + "BeninSaint BarthélemyBermudaBruneiBoliviaKaribeko HerbehereakBrasilB" + + "ahamakBhutanBouvet uharteaBotswanaBielorrusiaBelizeKanadaCocos uhart" + + "eakKongoko Errepublika DemokratikoaAfrika Erdiko ErrepublikaKongo (B" + + "razzaville)SuitzaBoli KostaCook uharteakTxileKamerunTxinaKolonbiaCli" + + "pperton uharteaCosta RicaKubaCabo VerdeCuraçaoChristmas uharteaZipre" + + "Txekiar ErrepublikaAlemaniaDiego GarciaDjibutiDanimarkaDominikaDomin" + + "ikar ErrepublikaAljeriaCeuta eta MelillaEkuadorEstoniaEgiptoMendebal" + + "deko SaharaEritreaEspainiaEtiopiaEuropar BatasunaFinlandiaFijiMalvin" + + "akMikronesiaFaroe uharteakFrantziaGabonErresuma BatuaGrenadaGeorgiaG" + + "uyana FrantsesaGuerneseyGhanaGibraltarGroenlandiaGambiaGineaGuadalup" + + "eEkuatore GineaGreziaHegoaldeko Georgia eta Hegoaldeko Sandwich uhar" + + "teakGuatemalaGuamGinea-BissauGuyanaHong Kong AEB TxinaHeard eta McDo" + + "nald uharteakHondurasKroaziaHaitiHungariaKanariakIndonesiaIrlandaIsr" + + "aelMan uharteaIndiaIndiako Ozeanoko lurralde britainiarraIrakIranIsl" + + "andiaItaliaJerseyJamaikaJordaniaJaponiaKenyaKirgizistanKanbodiaKirib" + + "atiKomoreakSaint Kitts eta NevisIpar KoreaHego KoreaKuwaitKaiman uha" + + "rteakKazakhstanLaosLibanoSanta LuziaLiechtensteinSri LankaLiberiaLes" + + "othoLituaniaLuxenburgoLetoniaLibiaMarokoMonakoMoldaviaMontenegroSain" + + "t MartinMadagaskarMarshall uharteakMazedoniaMaliMyanmarMongoliaMacau" + + " AEB TxinaIparraldeko Mariana uharteakMartinikaMauritaniaMontserratM" + + "altaMaurizioMaldivakMalawiMexikoMalaysiaMozambikeNamibiaKaledonia Be" + + "rriaNigerNorfolk uharteaNigeriaNikaraguaHerbehereakNorvegiaNepalNaur" + + "uNiueZeelanda BerriaOmanPanamaPeruPolinesia FrantsesaPapua Ginea Ber" + + "riaFilipinakPakistanPoloniaSaint-Pierre eta MikelunePitcairn uhartea" + + "kPuerto RicoPalestinako LurraldeakPortugalPalauParaguaiQatarMugaz ka" + + "npoko OzeaniaReunionErrumaniaSerbiaErrusiaRuandaSaudi ArabiaSalomon " + + "uharteakSeychelleakSudanSuediaSingapurSaint HelenaEsloveniaSvalbard " + + "eta Jan Mayen uharteakEslovakiaSierra LeonaSan MarinoSenegalSomaliaS" + + "urinamHego SudanSao Tome eta PrincipeEl SalvadorSint MaartenSiriaSwa" + + "zilandiaTristan da CunhaTurk eta Caicos uharteakTxadHegoaldeko lurra" + + "lde frantsesakTogoThailandiaTajikistanTokelauEkialdeko TimorTurkmeni" + + "stanTunisiaTongaTurkiaTrinidad eta TobagoTuvaluTaiwanTanzaniaUkraina" + + "UgandaAmeriketako Estatu Batuetako Kanpoaldeko Uharte TxikiakAmerike" + + "tako Estatu BatuakUruguaiUzbekistanVatikano HiriaSaint Vincent eta G" + + "renadinakVenezuelaBirjina uharte britainiarrakBirjina uharte amerika" + + "rrakVietnamVanuatuWallis eta FutunaSamoaKosovoYemenMayotteHegoafrika" + + "ZambiaZimbabweEskualde ezezagunaMunduaAfrikaIpar AmerikaHego Amerika" + + "OzeaniaAfrika mendebaldeaErdialdeko AmerikaAfrika ekialdeaAfrika ipa" + + "rraldeaErdialdeko AfrikaAfrika hegoaldeaAmerikaAmerika iparraldeaKar" + + "ibeaAsia ekialdeaAsia hegoaldeaAsia hego-ekialdeaEuropa hegoaldeaAus" + + "tralasiaMelanesiaMikronesia eskualdeaPolinesiaAsiaAsia erdialdeaAsia" + + " mendebaldeaEuropaEuropa ekialdeaEuropa iparraldeaEuropa mendebaldea" + + "Latinoamerika", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0011, 0x0018, 0x002f, 0x0039, 0x004c, 0x0052, 0x0059, + 0x0060, 0x0074, 0x007a, 0x0083, 0x008c, 0x009a, 0x00a1, 0x00aa, + 0x00af, 0x00bd, 0x00c7, 0x00d9, 0x00e1, 0x00eb, 0x00f2, 0x00fe, + 0x0106, 0x010d, 0x0114, 0x0119, 0x012a, 0x0131, 0x0137, 0x013e, + 0x0152, 0x0158, 0x015f, 0x0165, 0x0173, 0x017b, 0x0186, 0x018c, + 0x0192, 0x01a0, 0x01c0, 0x01d9, 0x01ec, 0x01f2, 0x01fc, 0x0209, + 0x020e, 0x0215, 0x021a, 0x0222, 0x0234, 0x023e, 0x0242, 0x024c, + 0x0254, 0x0265, 0x026a, 0x027d, 0x0285, 0x0291, 0x0298, 0x02a1, + // Entry 40 - 7F + 0x02a9, 0x02be, 0x02c5, 0x02d6, 0x02dd, 0x02e4, 0x02ea, 0x02fd, + 0x0304, 0x030c, 0x0313, 0x0323, 0x032c, 0x0330, 0x0338, 0x0342, + 0x0350, 0x0358, 0x035d, 0x036b, 0x0372, 0x0379, 0x0389, 0x0392, + 0x0397, 0x03a0, 0x03ab, 0x03b1, 0x03b6, 0x03bf, 0x03cd, 0x03d3, + 0x0406, 0x040f, 0x0413, 0x041f, 0x0425, 0x0438, 0x0453, 0x045b, + 0x0462, 0x0467, 0x046f, 0x0477, 0x0480, 0x0487, 0x048d, 0x0498, + 0x049d, 0x04c3, 0x04c7, 0x04cb, 0x04d3, 0x04d9, 0x04df, 0x04e6, + 0x04ee, 0x04f5, 0x04fa, 0x0505, 0x050d, 0x0515, 0x051d, 0x0532, + // Entry 80 - BF + 0x053c, 0x0546, 0x054c, 0x055b, 0x0565, 0x0569, 0x056f, 0x057a, + 0x0587, 0x0590, 0x0597, 0x059e, 0x05a6, 0x05b0, 0x05b7, 0x05bc, + 0x05c2, 0x05c8, 0x05d0, 0x05da, 0x05e6, 0x05f0, 0x0601, 0x060a, + 0x060e, 0x0615, 0x061d, 0x062c, 0x0648, 0x0651, 0x065b, 0x0665, + 0x066a, 0x0672, 0x067a, 0x0680, 0x0686, 0x068e, 0x0697, 0x069e, + 0x06ae, 0x06b3, 0x06c2, 0x06c9, 0x06d2, 0x06dd, 0x06e5, 0x06ea, + 0x06ef, 0x06f3, 0x0702, 0x0706, 0x070c, 0x0710, 0x0723, 0x0735, + 0x073e, 0x0746, 0x074d, 0x0766, 0x0777, 0x0782, 0x0798, 0x07a0, + // Entry C0 - FF + 0x07a5, 0x07ad, 0x07b2, 0x07c7, 0x07ce, 0x07d7, 0x07dd, 0x07e4, + 0x07ea, 0x07f6, 0x0806, 0x0811, 0x0816, 0x081c, 0x0824, 0x0830, + 0x0839, 0x0858, 0x0861, 0x086d, 0x0877, 0x087e, 0x0885, 0x088c, + 0x0896, 0x08ab, 0x08b6, 0x08c2, 0x08c7, 0x08d2, 0x08e2, 0x08fa, + 0x08fe, 0x091c, 0x0920, 0x092a, 0x0934, 0x093b, 0x094a, 0x0956, + 0x095d, 0x0962, 0x0968, 0x097b, 0x0981, 0x0987, 0x098f, 0x0996, + 0x099c, 0x09d3, 0x09ec, 0x09f3, 0x09fd, 0x0a0b, 0x0a27, 0x0a30, + 0x0a4c, 0x0a66, 0x0a6d, 0x0a74, 0x0a85, 0x0a8a, 0x0a90, 0x0a95, + // Entry 100 - 13F + 0x0a9c, 0x0aa6, 0x0aac, 0x0ab4, 0x0ac6, 0x0acc, 0x0ad2, 0x0ade, + 0x0aea, 0x0af1, 0x0b03, 0x0b15, 0x0b24, 0x0b35, 0x0b46, 0x0b56, + 0x0b5d, 0x0b6f, 0x0b76, 0x0b83, 0x0b91, 0x0ba3, 0x0bb3, 0x0bbe, + 0x0bc7, 0x0bdb, 0x0be4, 0x0be8, 0x0bf6, 0x0c06, 0x0c0c, 0x0c1b, + 0x0c2c, 0x0c3e, 0x0c4b, + }, + }, + { // ewo + "AndórBemirá yá Arábə uníAfəganisətánAntígwa ai BarəbúdaAngíyəAləbániaArə" + + "méniaAnətíyə NɛdəlániaAngoláArəhenətínaBəsamóa yá Amə́rəkaOsətəlíaOs" + + "ətəlalíArúbaAzɛrəbaidzáŋBosəní ai ɛrəzegovínBarəbádBangaladɛ́sBɛləh" + + "ígBuləkiná FasóBuləgaríBahərɛ́nBurundíBəníŋBɛrəmúdBulunéBolíviaBəla" + + "zílBahámasButáŋBotswanáBəlarúsBəlískanadáǹnam Kongó Demokəlatígǹnam " + + "Zǎŋ AfirikáKongóSuísKód Divɔ́rMinlán Mí kúgTsilíKamərúnTsáinaKolɔmbí" + + "Kosta RíkaKubáMinlán Mí Káb VɛrSipəlúsǸnam Tsɛ́gNdzámanDzibutíDanəmá" + + "rəgDómənikaRépublique dominicaineAləyériaEkwatórEsetoníEhíbətɛnElitə" + + "léKpənyáEtiopíFinəlánFidzíMinlán Mi FóləkəlanMikoronésiaFulɛnsíGabóŋ" + + "Ǹnam EngəlisGələnádəHorə́yiaGuyán yá FulɛnsíGanáYiləbalatárGoelánGa" + + "mbíGinéGuadəlúbGiné EkwatóGəlɛ́sGuatemaláGuámGiné BisaóGuyánOndurásK" + + "əlowásiaAitíOngiríɛndonésiaIrəlándəIsəraɛ́lɛ́ndəǹnam ɛngəlís yá Máŋ" + + " mə́ ɛ́ndəIrágIránIsəlándəItáliɛnHamaíkaHorədaníHapɔ́nKeniáKirigisət" + + "ánkambodíaKiribatíKomɔ́rǸfúfúb-Kilisətóv-ai-NevisKoré yá NórKoré yá" + + " SúdKowɛ́dMinlán Mí KalimáŋKazakətáŋLaósLibáŋǸfúfúb-LúsiaLísə́sə́tái" + + "nSəri LaŋkáLibériaLəsotóLituaníLukəzambúdLətoníLibíMarɔ́gMɔnakóMoləd" + + "avíMadagasəkárəMinlán Mí MaresálMasedóniaMalíMianəmárMɔngɔ́liaMinlán" + + " Mi Marián yá NórMarətinígMoritaníMɔ́ntserádMálətəMorísMalədívəMalaw" + + "íMɛkəsígMalɛ́ziaMozambígNamibíǸkpámɛn KaledóniaNihɛ́rMinlán Nɔrəfɔ́" + + "ləkəNihériaNikaráguaPɛíbáNɔrəvɛ́sNepálNaurúNiuéǸkpámɛn ZeláŋOmánPana" + + "máPerúPolinesí yá FulɛnsíPapwazi yá Ǹkpámɛ́n GinéFilipínPakisətánfól" + + "isǸfúfúb-Píɛr-ai-Mikəlɔ́ŋPítə́kɛ́rɛnəPwɛrəto RíkoǸnam Palɛsətínfɔrət" + + "ugɛ́sPalauParaguéKatárReuniɔ́ŋRumaníRúsianRuwandáArabí SaudíMinlán M" + + "í Solomɔ́nSɛsɛ́lSudáŋSuwɛ́dSingapúrǸfúfúb-Ɛlɛ́naSəlovéniaSəlovakíSi" + + "erá-leónəǸfúfúb MarínoSenegálSomáliaSurinámSaó Tomé ai PəlinəsípeSal" + + "əvadórSiríSwazilándəMinlán Mí túrə́g-ai-KaígTsádTogóTailánTadzikisə" + + "táŋTokelóTimôrTurəkəmənisətáŋTunisíTɔngáTurəkíTəlinité-ai-TobágoTuva" + + "lúTaiwánTaŋəzaníUkərɛ́nUgandáǸnam AmɛrəkəUruguéUzubekisətánǸnam Vati" + + "kánǸfúfúb-Vɛngəsáŋ-ai-Bə GələnadínVenezuélańnam Minlán ɛ́ngəlísMinlá" + + "n Mi AmɛrəkəViɛdənámVanuátuWalís-ai-FutúnaSamoáYemɛ́nMayɔ́dAfiríka y" + + "á SúdZambíZimbabwé", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x001e, 0x002d, 0x0043, 0x004b, 0x0055, + 0x005f, 0x0076, 0x007d, 0x007d, 0x008b, 0x00a4, 0x00af, 0x00bb, + 0x00c1, 0x00c1, 0x00d1, 0x00ea, 0x00f3, 0x0100, 0x010a, 0x011a, + 0x0124, 0x012f, 0x0137, 0x013f, 0x013f, 0x0149, 0x0150, 0x0158, + 0x0158, 0x0161, 0x0169, 0x0170, 0x0170, 0x0179, 0x0182, 0x0189, + 0x0190, 0x0190, 0x01aa, 0x01be, 0x01c4, 0x01c9, 0x01d6, 0x01e6, + 0x01ec, 0x01f5, 0x01fc, 0x0205, 0x0205, 0x0210, 0x0215, 0x022a, + 0x022a, 0x022a, 0x0233, 0x0240, 0x0248, 0x0248, 0x0250, 0x025c, + // Entry 40 - 7F + 0x0266, 0x027d, 0x0287, 0x0287, 0x028f, 0x0297, 0x02a2, 0x02a2, + 0x02ab, 0x02b3, 0x02ba, 0x02ba, 0x02c3, 0x02c9, 0x02e0, 0x02ec, + 0x02ec, 0x02f5, 0x02fc, 0x030a, 0x0316, 0x0320, 0x0334, 0x0334, + 0x0339, 0x0346, 0x034d, 0x0353, 0x0358, 0x0362, 0x036f, 0x0378, + 0x0378, 0x0382, 0x0387, 0x0393, 0x0399, 0x0399, 0x0399, 0x03a1, + 0x03ac, 0x03b1, 0x03b8, 0x03b8, 0x03c3, 0x03ce, 0x03d9, 0x03d9, + 0x03e1, 0x040a, 0x040f, 0x0414, 0x041f, 0x0428, 0x0428, 0x0430, + 0x043a, 0x0442, 0x0448, 0x0455, 0x045e, 0x0467, 0x046f, 0x048d, + // Entry 80 - BF + 0x049b, 0x04a9, 0x04b1, 0x04c6, 0x04d2, 0x04d7, 0x04de, 0x04ee, + 0x0500, 0x050d, 0x0515, 0x051d, 0x0525, 0x0531, 0x0539, 0x053e, + 0x0546, 0x054e, 0x0558, 0x0558, 0x0558, 0x0567, 0x057b, 0x0585, + 0x058a, 0x0594, 0x05a0, 0x05a0, 0x05bb, 0x05c6, 0x05cf, 0x05dc, + 0x05e5, 0x05eb, 0x05f6, 0x05fd, 0x0607, 0x0611, 0x061a, 0x0621, + 0x0636, 0x063e, 0x0657, 0x065f, 0x0669, 0x0671, 0x067d, 0x0683, + 0x0689, 0x068e, 0x06a0, 0x06a5, 0x06ac, 0x06b1, 0x06c8, 0x06e6, + 0x06ee, 0x06f9, 0x06ff, 0x071f, 0x0732, 0x0741, 0x0753, 0x0761, + // Entry C0 - FF + 0x0766, 0x076e, 0x0774, 0x0774, 0x077f, 0x0786, 0x0786, 0x078d, + 0x0795, 0x07a2, 0x07b8, 0x07c1, 0x07c8, 0x07d0, 0x07d9, 0x07ec, + 0x07f7, 0x07f7, 0x0801, 0x080f, 0x0820, 0x0828, 0x0830, 0x0838, + 0x0838, 0x0853, 0x085e, 0x085e, 0x0863, 0x086f, 0x086f, 0x088d, + 0x0892, 0x0892, 0x0897, 0x089e, 0x08ad, 0x08b4, 0x08ba, 0x08cf, + 0x08d6, 0x08dd, 0x08e5, 0x08fa, 0x0901, 0x0908, 0x0913, 0x091d, + 0x0924, 0x0924, 0x0934, 0x093b, 0x0949, 0x0957, 0x0981, 0x098b, + 0x09a5, 0x09ba, 0x09c5, 0x09cd, 0x09de, 0x09e4, 0x09e4, 0x09ec, + // Entry 100 - 13F + 0x09f4, 0x0a05, 0x0a0b, 0x0a14, + }, + }, + { // fa + faRegionStr, + faRegionIdx, + }, + { // fa-AF + "اندوراانتیگوا و باربوداالبانیاانگولاارجنتاینآسترالیابوسنیا و هرزه\u200cگ" + + "وینابنگله\u200cدیشبلجیمبلغاریابرونیبولیویابرازیلبهاماسروسیهٔ سفیدکا" + + "نگو - کینشاساکانگو - برازویلسویسچلیکولمبیاکاستریکاکیوبادنمارکاستونی" + + "ااریتریاهسپانیهایتوپیافنلندمیکرونزیاگریناداگینیاگینیا استواییگواتیم" + + "الاگینیا بیسائوگیاناهاندوراسکروشیاهایتیاندونیزیاآیرلندآیسلندجاپانکی" + + "نیاقرغزستانکمپوچیاکوریای شمالیکوریای جنوبیسریلانکالیسوتولتوانیالاتو" + + "یالیبیامادغاسکرمنگولیاموریتانیامالتامکسیکومالیزیاموزمبیقنیجریانیکار" + + "اگواهالندناروینیپالزیلاند جدیدپانامهپیروپاپوا نیو گینیاپولندپرتگالپ" + + "اراگوایرومانیاروآنداسویدنسینگاپورسلونیاسلواکیاسیرالیونسینیگالسومالی" + + "هالسلوادورتاجکستاناکراینیوروگوایونزویلازیمبابوی", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x000c, 0x000c, 0x000c, 0x002c, 0x002c, 0x003a, + 0x003a, 0x003a, 0x0046, 0x0046, 0x0056, 0x0056, 0x0056, 0x0066, + 0x0066, 0x0066, 0x0066, 0x008b, 0x008b, 0x009e, 0x00a8, 0x00a8, + 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00b6, 0x00c0, 0x00ce, + 0x00ce, 0x00da, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00fb, 0x00fb, + 0x00fb, 0x00fb, 0x0116, 0x0116, 0x0131, 0x0139, 0x0139, 0x0139, + 0x013f, 0x013f, 0x013f, 0x014d, 0x014d, 0x015d, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0167, 0x0173, + // Entry 40 - 7F + 0x0173, 0x0173, 0x0173, 0x0173, 0x0173, 0x0181, 0x0181, 0x0181, + 0x018f, 0x019d, 0x01ab, 0x01ab, 0x01b5, 0x01b5, 0x01b5, 0x01c7, + 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01d5, 0x01d5, 0x01d5, 0x01d5, + 0x01d5, 0x01d5, 0x01d5, 0x01d5, 0x01df, 0x01df, 0x01f8, 0x01f8, + 0x01f8, 0x020a, 0x020a, 0x0221, 0x022b, 0x022b, 0x022b, 0x023b, + 0x0247, 0x0251, 0x0251, 0x0251, 0x0263, 0x026f, 0x026f, 0x026f, + 0x026f, 0x026f, 0x026f, 0x026f, 0x027b, 0x027b, 0x027b, 0x027b, + 0x027b, 0x0285, 0x028f, 0x029f, 0x02ad, 0x02ad, 0x02ad, 0x02ad, + // Entry 80 - BF + 0x02c4, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, 0x02db, + 0x02db, 0x02eb, 0x02eb, 0x02f7, 0x0305, 0x0305, 0x0311, 0x031b, + 0x031b, 0x031b, 0x031b, 0x031b, 0x031b, 0x032b, 0x032b, 0x032b, + 0x032b, 0x032b, 0x0339, 0x0339, 0x0339, 0x0339, 0x034b, 0x034b, + 0x0355, 0x0355, 0x0355, 0x0355, 0x0361, 0x036f, 0x037d, 0x037d, + 0x037d, 0x037d, 0x037d, 0x0389, 0x039b, 0x03a5, 0x03af, 0x03b9, + 0x03b9, 0x03b9, 0x03ce, 0x03ce, 0x03da, 0x03e2, 0x03e2, 0x03fe, + 0x03fe, 0x03fe, 0x0408, 0x0408, 0x0408, 0x0408, 0x0408, 0x0414, + // Entry C0 - FF + 0x0414, 0x0424, 0x0424, 0x0424, 0x0424, 0x0432, 0x0432, 0x0432, + 0x043e, 0x043e, 0x043e, 0x043e, 0x043e, 0x0448, 0x0458, 0x0458, + 0x0464, 0x0464, 0x0472, 0x0482, 0x0482, 0x0490, 0x049e, 0x049e, + 0x049e, 0x049e, 0x04b0, 0x04b0, 0x04b0, 0x04b0, 0x04b0, 0x04b0, + 0x04b0, 0x04b0, 0x04b0, 0x04b0, 0x04c0, 0x04c0, 0x04c0, 0x04c0, + 0x04c0, 0x04c0, 0x04c0, 0x04c0, 0x04c0, 0x04c0, 0x04c0, 0x04cc, + 0x04cc, 0x04cc, 0x04cc, 0x04dc, 0x04dc, 0x04dc, 0x04dc, 0x04ea, + 0x04ea, 0x04ea, 0x04ea, 0x04ea, 0x04ea, 0x04ea, 0x04ea, 0x04ea, + // Entry 100 - 13F + 0x04ea, 0x04ea, 0x04ea, 0x04fa, + }, + }, + { // ff + "AnndooraEmiraat Araab DenntuɗeAfganistaanAntiguwaa e BarbudaaAnngiyaaAlb" + + "aniiArmeniiAntiiye NederlanndeejeAnngolaaArjantiinSamowa AmerikOtiri" + + "isOstaraaliiAruubaAjerbayjaanBosnii HersegowiinBarbadoosBanglaadeesB" + + "eljikBurkibaa FaasoBulgariiBahreynBurunndiBeneeBermudaaBurnaayBoliwi" + + "iBeresiilBahamaasButaanBotswaanaBelaruusBeliiseKanadaaNdenndaandi De" + + "mokaraasiire KonngoNdenndaandi SantarafrikKonngoSuwiisKodduwaarDuuɗe" + + " KuukCiliiKameruunSiinKolombiyaKosta RikaaKubaaDuuɗe Kap WeerSiiparN" + + "denndaandi CekAlmaañJibutiiDanmarkDominikaNdenndanndi DominikaAlaser" + + "iEkuwatoorEstoniEjiptEritereeEspaañEcoppiFenlandFijjiDuuɗe FalklandM" + + "ikoronesiiFarayseGabooLaamateeri RentundiGarnaadJeorgiiGiyaan Farays" + + "eGanaaJibraltaarGorwendlandGammbiGineGwaadalupGinee EkuwaatoriyaalGe" + + "reesGwaatemalaaGuwamGine-BisaawoGiyaanOnnduraasKorwasiiHaytiiOnngiri" + + "EnndonesiiIrlanndaIsraa’iilaEnndoKeeriindi britaani to maayo enndoIr" + + "aakIraanIslanndaItaliJamaykaJordaniSapooKeñaaKirgistaanKambodsoKirib" + + "ariKomoorSent Kits e NewisKoree RewoKoree WorgoKuweytiDuuɗe KaymaaKa" + + "sakstaanLawoosLibaaSent LusiyaaLincenstaynSiri LankaLiberiyaaLesotoL" + + "ituaaniiLiksembuurLetoniiLibiMarukMonaakooMoldawiiMadagaskaarDuuɗe M" + + "arsaalMeceduwaanMaaliMiyamaarMonngoliiDuuɗe Mariyaana RewoMartinikMu" + + "ritaniMonseraatMalteMoriisMaldiiweMalaawiMeksikMalesiiMosammbikNamib" + + "iiNuwel KaledoniiNijeerDuuɗe NorfolkNijeriyaaNikaraguwaaNederlanndaN" + + "orweesNepaalNawuruNiuweNuwel SelanndaOmaanPanamaaPeruPolinesii Faray" + + "sePapuwaa Nuwel GineFilipiinPakistaanPoloñSee Piyeer e MikelooPitker" + + "nPorto RikooPalestiin Sisjordani e GaasaaPurtugaalPalawuParaguwaayKa" + + "taarRewiñooRumaniiRiisiiRuwanndaaArabii SawditDuuɗe SolomonSeyselSud" + + "aanSuweedSinngapuurSent HelenSloweniiSlowakiiSeraa liyonSee MareeSen" + + "egaalSomaliiSurinaamSawo Tome e PerensipeEl SalwadorSiriiSwaasilannd" + + "aDuuɗe Turke e KeikoosCaadTogooTaylanndaTajikistaanTokelaawTimoor Fu" + + "ɗnaangeTurkmenistaanTunisiiTonngaaTurkiiTirnidaad e TobaagoTuwaluuT" + + "aywaanTansaniiUkereenUnganndaaDowlaaji Dentuɗi AmerikUruguwaayUsbeki" + + "staanDowla WaticaanSee Weesaa e GarnadiinWenesuwelaaduuɗe kecce brit" + + "aniiDuuɗe Kecce AmerikWiyetnaamWanuwaatuuWalis e FutunaSamowaaYemenM" + + "ayootAfrik bŋ WorgoSammbiSimbaabuwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0008, 0x001f, 0x002a, 0x003e, 0x0046, 0x004d, + 0x0054, 0x006a, 0x0072, 0x0072, 0x007b, 0x0088, 0x008f, 0x0099, + 0x009f, 0x009f, 0x00aa, 0x00bc, 0x00c5, 0x00d0, 0x00d6, 0x00e4, + 0x00ec, 0x00f3, 0x00fb, 0x0100, 0x0100, 0x0108, 0x010f, 0x0116, + 0x0116, 0x011e, 0x0126, 0x012c, 0x012c, 0x0135, 0x013d, 0x0144, + 0x014b, 0x014b, 0x016c, 0x0183, 0x0189, 0x018f, 0x0198, 0x01a3, + 0x01a8, 0x01b0, 0x01b4, 0x01bd, 0x01bd, 0x01c8, 0x01cd, 0x01dc, + 0x01dc, 0x01dc, 0x01e2, 0x01f1, 0x01f8, 0x01f8, 0x01ff, 0x0206, + // Entry 40 - 7F + 0x020e, 0x0222, 0x0229, 0x0229, 0x0232, 0x0238, 0x023d, 0x023d, + 0x0245, 0x024c, 0x0252, 0x0252, 0x0259, 0x025e, 0x026d, 0x0278, + 0x0278, 0x027f, 0x0284, 0x0297, 0x029e, 0x02a5, 0x02b3, 0x02b3, + 0x02b8, 0x02c2, 0x02cd, 0x02d3, 0x02d7, 0x02e0, 0x02f4, 0x02fa, + 0x02fa, 0x0305, 0x030a, 0x0316, 0x031c, 0x031c, 0x031c, 0x0325, + 0x032d, 0x0333, 0x033a, 0x033a, 0x0344, 0x034c, 0x0358, 0x0358, + 0x035d, 0x037e, 0x0383, 0x0388, 0x0390, 0x0395, 0x0395, 0x039c, + 0x03a3, 0x03a8, 0x03ae, 0x03b8, 0x03c0, 0x03c8, 0x03ce, 0x03df, + // Entry 80 - BF + 0x03e9, 0x03f4, 0x03fb, 0x0408, 0x0412, 0x0418, 0x041d, 0x0429, + 0x0434, 0x043e, 0x0447, 0x044d, 0x0456, 0x0460, 0x0467, 0x046b, + 0x0470, 0x0478, 0x0480, 0x0480, 0x0480, 0x048b, 0x0499, 0x04a3, + 0x04a8, 0x04b0, 0x04b9, 0x04b9, 0x04ce, 0x04d6, 0x04de, 0x04e7, + 0x04ec, 0x04f2, 0x04fa, 0x0501, 0x0507, 0x050e, 0x0517, 0x051e, + 0x052d, 0x0533, 0x0541, 0x054a, 0x0555, 0x0560, 0x0567, 0x056d, + 0x0573, 0x0578, 0x0586, 0x058b, 0x0592, 0x0596, 0x05a7, 0x05b9, + 0x05c1, 0x05ca, 0x05d0, 0x05e4, 0x05eb, 0x05f6, 0x0613, 0x061c, + // Entry C0 - FF + 0x0622, 0x062c, 0x0632, 0x0632, 0x063a, 0x0641, 0x0641, 0x0647, + 0x0650, 0x065d, 0x066b, 0x0671, 0x0677, 0x067d, 0x0687, 0x0691, + 0x0699, 0x0699, 0x06a1, 0x06ac, 0x06b5, 0x06bd, 0x06c4, 0x06cc, + 0x06cc, 0x06e1, 0x06ec, 0x06ec, 0x06f1, 0x06fd, 0x06fd, 0x0713, + 0x0717, 0x0717, 0x071c, 0x0725, 0x0730, 0x0738, 0x0749, 0x0756, + 0x075d, 0x0764, 0x076a, 0x077d, 0x0784, 0x078b, 0x0793, 0x079a, + 0x07a3, 0x07a3, 0x07bb, 0x07c4, 0x07cf, 0x07dd, 0x07f3, 0x07fe, + 0x0813, 0x0826, 0x082f, 0x0839, 0x0847, 0x084e, 0x084e, 0x0853, + // Entry 100 - 13F + 0x0859, 0x0868, 0x086e, 0x0878, + }, + }, + { // fi + fiRegionStr, + fiRegionIdx, + }, + { // fil + filRegionStr, + filRegionIdx, + }, + { // fo + "AscensionAndorraSameindu EmirríkiniAfganistanAntigua & BarbudaAnguillaAl" + + "baniaArmeniaNiðurlendsku AntilloyggjarnarAngolaAntarktisArgentinaAme" + + "rikanska SamoaEysturríkiAvstraliaArubaÁlandAserbadjanBosnia-Hersegov" + + "inaBarbadosBangladesjBelgiaBurkina FasoBulgariaBareinBurundiBeninSt-" + + "BarthélemyBermudaBruneiBoliviaNiðurlonds KaribiaBrasilBahamaoyggjarB" + + "utanBouvetoyggjBotsvanaHvítarusslandBelisKanadaKokosoyggjarKongo, De" + + "m. LýðveldiðMiðafrikalýðveldiðKongoSveisFílabeinsstrondinCooksoyggja" + + "rKiliKamerunKinaKolombiaClippertonKosta RikaKubaGrønhøvdaoyggjarCura" + + "çaoJólaoyggjinKýprosKekkiaTýsklandDiego GarciaDjibutiDanmarkDominik" + + "aDominikalýðveldiðAlgeriaCeuta og MelillaEkvadorEstlandEgyptalandVes" + + "tursaharaEritreaSpaniaEtiopiaEvropasamveldiðFinnlandFijiFalklandsoyg" + + "gjarMikronesiasamveldiðFøroyarFraklandGabonStórabretlandGrenadaGeorg" + + "iaFranska GujanaGuernseyGanaGibraltarGrønlandGambiaGuineaGuadeloupeE" + + "kvatorguineaGrikkalandSuðurgeorgia og SuðursandwichoyggjarGuatemalaG" + + "uamGuinea-BissauGujanaHong Kong SAR KinaHeard og McDonaldoyggjarHond" + + "urasKroatiaHaitiUngarnKanariuoyggjarIndonesiaÍrlandÍsraelIsle of Man" + + "IndiaStóra Bretlands IndiahavoyggjarIrakIranÍslandItaliaJerseyJamaik" + + "aJordanJapanKenjaKirgisiaKambodjaKiribatiKomoroyggjarSt. Kitts & Nev" + + "isNorðurkoreaSuðurkoreaKuvaitCaymanoyggjarKasakstanLaosLibanonSt. Lu" + + "siaLiktinsteinSri LankaLiberiaLesotoLitavaLuksemborgLettlandLibyaMar" + + "okkoMonakoMoldovaMontenegroSt-MartinMadagaskarMarshalloyggjarMakedón" + + "iaMaliMyanmar (Burma)MongoliaMakao SAR KinaNorðaru MariuoyggjarMarti" + + "niqueMóritaniaMontserratMaltaMóritiusMaldivoyggjarMalaviMeksikoMalai" + + "siaMosambikNamibiaNýkaledóniaNigerNorfolksoyggjNigeriaNikaraguaNiður" + + "londNoregNepalNauruNiueNýsælandOmanPanamaPeruFranska PolynesiaPapua " + + "NýguineaFilipsoyggjarPakistanPóllandSaint Pierre og MiquelonPitcairn" + + "oyggjarPuerto RikoPalestinskt landøkiPortugalPalauParaguaiKatarfjars" + + "koti OsianiaRéunionRumeniaSerbiaRusslandRuandaSaudiarabiaSalomonoygg" + + "jarSeyskelloyggjarSudanSvøríkiSingaporSt. HelenaSloveniaSvalbard & J" + + "an MayenSlovakiaSierra LeonaSan MarinoSenegalSomaliaSurinamSuðursuda" + + "nSao Tome & PrinsipiEl SalvadorSint MaartenSýriaSvasilandTristan da " + + "CunhaTurks- og CaicosoyggjarKjadFronsku sunnaru landaøkiTogoTailandT" + + "adsjikistanTokelauEysturtimorTurkmenistanTunesiaTongaTurkalandTrinid" + + "ad & TobagoTuvaluTaivanTansaniaUkrainaUgandaSambandsríki Amerikas fj" + + "arskotnu oyggjarSambandsríki AmerikaUruguaiUsbekistanVatikanbýurSt. " + + "Vinsent & GrenadinoyggjarVenesuelaStóra Bretlands JomfrúoyggjarSamba" + + "ndsríki Amerikas JomfrúoyggjarVjetnamVanuatuWallis- og Futunaoyggjar" + + "SamoaKosovoJemenMayotteSuðurafrikaSambiaSimbabviókent økiheimurAfrik" + + "aNorðuramerikaSuðuramerikaOsianiaVesturafrikaMiðamerikaEysturafrikaN" + + "orðurafrikaMiðafrikasunnari partur av AfrikaAmerikaAmerika norðanfyr" + + "i MeksikoKaribiaEysturasiaSuðurasiaÚtsynningsasiaSuðurevropaAvstrala" + + "siaMelanesiaMikronesi økiPolynesiaAsiaMiðasiaVesturasiaEvropaEysture" + + "vropaNorðurevropaVesturevropaLatínamerika", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0009, 0x0010, 0x0024, 0x002e, 0x003f, 0x0047, 0x004e, + 0x0055, 0x0073, 0x0079, 0x0082, 0x008b, 0x009c, 0x00a7, 0x00b0, + 0x00b5, 0x00bb, 0x00c5, 0x00d7, 0x00df, 0x00e9, 0x00ef, 0x00fb, + 0x0103, 0x0109, 0x0110, 0x0115, 0x0123, 0x012a, 0x0130, 0x0137, + 0x014a, 0x0150, 0x015d, 0x0162, 0x016d, 0x0175, 0x0183, 0x0188, + 0x018e, 0x019a, 0x01b2, 0x01c8, 0x01cd, 0x01d2, 0x01e4, 0x01f0, + 0x01f4, 0x01fb, 0x01ff, 0x0207, 0x0211, 0x021b, 0x021f, 0x0231, + 0x0239, 0x0245, 0x024c, 0x0252, 0x025b, 0x0267, 0x026e, 0x0275, + // Entry 40 - 7F + 0x027d, 0x0291, 0x0298, 0x02a8, 0x02af, 0x02b6, 0x02c0, 0x02cc, + 0x02d3, 0x02d9, 0x02e0, 0x02f0, 0x02f8, 0x02fc, 0x030c, 0x0320, + 0x0328, 0x0330, 0x0335, 0x0343, 0x034a, 0x0351, 0x035f, 0x0367, + 0x036b, 0x0374, 0x037d, 0x0383, 0x0389, 0x0393, 0x03a0, 0x03aa, + 0x03d0, 0x03d9, 0x03dd, 0x03ea, 0x03f0, 0x0402, 0x041a, 0x0422, + 0x0429, 0x042e, 0x0434, 0x0442, 0x044b, 0x0452, 0x0459, 0x0464, + 0x0469, 0x0489, 0x048d, 0x0491, 0x0498, 0x049e, 0x04a4, 0x04ab, + 0x04b1, 0x04b6, 0x04bb, 0x04c3, 0x04cb, 0x04d3, 0x04df, 0x04f0, + // Entry 80 - BF + 0x04fc, 0x0507, 0x050d, 0x051a, 0x0523, 0x0527, 0x052e, 0x0537, + 0x0542, 0x054b, 0x0552, 0x0558, 0x055e, 0x0568, 0x0570, 0x0575, + 0x057c, 0x0582, 0x0589, 0x0593, 0x059c, 0x05a6, 0x05b5, 0x05bf, + 0x05c3, 0x05d2, 0x05da, 0x05e8, 0x05fd, 0x0607, 0x0611, 0x061b, + 0x0620, 0x0629, 0x0636, 0x063c, 0x0643, 0x064b, 0x0653, 0x065a, + 0x0667, 0x066c, 0x0679, 0x0680, 0x0689, 0x0693, 0x0698, 0x069d, + 0x06a2, 0x06a6, 0x06b0, 0x06b4, 0x06ba, 0x06be, 0x06cf, 0x06de, + 0x06eb, 0x06f3, 0x06fb, 0x0713, 0x0722, 0x072d, 0x0741, 0x0749, + // Entry C0 - FF + 0x074e, 0x0756, 0x075b, 0x076c, 0x0774, 0x077b, 0x0781, 0x0789, + 0x078f, 0x079a, 0x07a8, 0x07b7, 0x07bc, 0x07c5, 0x07cd, 0x07d7, + 0x07df, 0x07f3, 0x07fb, 0x0807, 0x0811, 0x0818, 0x081f, 0x0826, + 0x0831, 0x0844, 0x084f, 0x085b, 0x0861, 0x086a, 0x087a, 0x0891, + 0x0895, 0x08ae, 0x08b2, 0x08b9, 0x08c5, 0x08cc, 0x08d7, 0x08e3, + 0x08ea, 0x08ef, 0x08f8, 0x0909, 0x090f, 0x0915, 0x091d, 0x0924, + 0x092a, 0x0953, 0x0968, 0x096f, 0x0979, 0x0985, 0x09a2, 0x09ab, + 0x09ca, 0x09ef, 0x09f6, 0x09fd, 0x0a15, 0x0a1a, 0x0a20, 0x0a25, + // Entry 100 - 13F + 0x0a2c, 0x0a38, 0x0a3e, 0x0a46, 0x0a51, 0x0a57, 0x0a5d, 0x0a6b, + 0x0a78, 0x0a7f, 0x0a8b, 0x0a96, 0x0aa2, 0x0aaf, 0x0ab9, 0x0ad1, + 0x0ad8, 0x0af3, 0x0afa, 0x0b04, 0x0b0e, 0x0b1d, 0x0b29, 0x0b34, + 0x0b3d, 0x0b4b, 0x0b54, 0x0b58, 0x0b60, 0x0b6a, 0x0b70, 0x0b7c, + 0x0b89, 0x0b95, 0x0ba2, + }, + }, + { // fr + frRegionStr, + frRegionIdx, + }, + { // fr-CA + frCARegionStr, + frCARegionIdx, + }, + {}, // fr-CH + { // fur + "AndorraEmirâts araps unîtsAfghanistanAntigua e BarbudaAnguillaAlbanieArm" + + "enieAntilis olandesisAngolaAntarticArgjentineSamoa merecanisAustrieA" + + "ustralieArubaIsulis AlandAzerbaigianBosnie e ErcegovineBarbadosBangl" + + "adeshBelgjicheBurkina FasoBulgarieBahrainBurundiBeninSant Barthélemy" + + "BermudaBruneiBolivieBrasîlBahamasBhutanIsule BouvetBotswanaBieloruss" + + "ieBelizeCanadeIsulis CocosRepubliche Democratiche dal CongoRepublich" + + "e centri africaneCongo - BrazzavilleSvuizareCueste di AvoliIsulis Co" + + "okCileCamerunCineColombieIsule ClippertonCosta RicaCubaCjâf vertIsul" + + "e ChristmasCipriRepubliche cecheGjermanieDiego GarciaGibutiDanimarcj" + + "eDominicheRepubliche dominicaneAlzerieCeuta e MelillaEcuadorEstonieE" + + "gjitSahara ocidentâlEritreeSpagneEtiopieUnion europeaneFinlandieFizi" + + "Isulis FalklandMicronesieIsulis FaroeFranceGabonReam unîtGrenadaGjeo" + + "rgjieGuiana francêsGuernseyGhanaGjibraltarGroenlandeGambiaGuineeGuad" + + "alupeGuinee ecuatoriâlGrecieGeorgia dal Sud e Isulis Sandwich dal Su" + + "dGuatemalaGuamGuinea-BissauGuyanaRegjon aministrative speciâl de Cin" + + "e di Hong KongIsule Heard e Isulis McDonaldHondurasCravuazieHaitiOng" + + "jarieIsulis CanariisIndonesieIrlandeIsraêlIsule di ManIndiaTeritori " + + "britanic dal Ocean IndianIraqIranIslandeItalieJerseyGjamaicheJordani" + + "eGjaponKenyaKirghizstanCambozeKiribatiComorisSan Kitts e NevisCoree " + + "dal nordCoree dal sudKuwaitIsulis CaymanKazachistanLaosLibanSante Lu" + + "sieLiechtensteinSri LankaLiberieLesothoLituanieLussemburcLetonieLibi" + + "eMarocMonacoMoldavieMontenegroSant MartinMadagascarIsulis MarshallMa" + + "cedonieMaliBirmanieMongolieRegjon aministrative speciâl de Cine di M" + + "acaoIsulis Mariana dal NordMartinicheMauritanieMontserratMaltaMauriz" + + "iMaldivisMalawiMessicMalaysiaMozambicNamibieGnove CaledonieNigerIsol" + + "e NorfolkNigerieNicaraguaPaîs basNorvegjeNepalNauruNiueGnove Zelande" + + "OmanPanamàPerùPolinesie francêsPapue Gnove GuineeFilipinisPakistanPo" + + "lonieSan Pierre e MiquelonPitcairnPorto RicoTeritoris palestinêsPort" + + "ugalPalauParaguayQatarOceanie perifericheReunionRomanieSerbieRussieR" + + "uandeArabie SaudideIsulis SalomonSeychellesSudanSvezieSingaporeSante" + + " ElineSlovenieSvalbard e Jan MayenSlovachieSierra LeoneSan MarinSene" + + "galSomalieSurinameSao Tomè e PrincipeEl SalvadorSirieSwazilandTrista" + + "n da CunhaIsulis Turks e CaicosÇadTeritoris meridionâi francêsTogoTa" + + "ilandieTazikistanTokelauTimor orientâlTurkmenistanTunisieTongaTurchi" + + "eTrinidad e TobagoTuvaluTaiwanTanzanieUcraineUgandaIsulis periferich" + + "is minôrs dai Stâts UnîtsStâts UnîtsUruguayUzbechistanVaticanSan Vin" + + "cent e lis GrenadinisVenezuelaIsulis vergjinis britanichisIsulis ver" + + "gjinis americanisVietnamVanuatuWallis e FutunaSamoaYemenMayotteSud A" + + "fricheZambiaZimbabweRegjon no cognossude o no valideMontAfricheAmeri" + + "che dal NordAmeriche meridionâlOceanieAfriche ocidentâlAmeriche cent" + + "râlAfriche orientâlAfriche setentrionâlAfriche di mieçAfriche meridi" + + "onâlAmerichisAmeriche setentrionâlcaraibicAsie orientâlAsie meridion" + + "âlAsie sud orientâlEurope meridionâlAustralie e Gnove ZelandeMelane" + + "sieRegjon de MicronesiePolinesieAsieAsie centrâlAsie ocidentâlEurope" + + "Europe orientâlEurope setentrionâlEurope ocidentâlAmeriche latine", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x001c, 0x0027, 0x0038, 0x0040, 0x0047, + 0x004e, 0x005f, 0x0065, 0x006d, 0x0077, 0x0086, 0x008d, 0x0096, + 0x009b, 0x00a7, 0x00b2, 0x00c5, 0x00cd, 0x00d7, 0x00e0, 0x00ec, + 0x00f4, 0x00fb, 0x0102, 0x0107, 0x0117, 0x011e, 0x0124, 0x012b, + 0x012b, 0x0132, 0x0139, 0x013f, 0x014b, 0x0153, 0x015e, 0x0164, + 0x016a, 0x0176, 0x0197, 0x01b1, 0x01c4, 0x01cc, 0x01db, 0x01e6, + 0x01ea, 0x01f1, 0x01f5, 0x01fd, 0x020d, 0x0217, 0x021b, 0x0225, + 0x0225, 0x0234, 0x0239, 0x0249, 0x0252, 0x025e, 0x0264, 0x026e, + // Entry 40 - 7F + 0x0277, 0x028c, 0x0293, 0x02a2, 0x02a9, 0x02b0, 0x02b5, 0x02c6, + 0x02cd, 0x02d3, 0x02da, 0x02e9, 0x02f2, 0x02f6, 0x0305, 0x030f, + 0x031b, 0x0321, 0x0326, 0x0330, 0x0337, 0x0340, 0x034f, 0x0357, + 0x035c, 0x0366, 0x0370, 0x0376, 0x037c, 0x0385, 0x0397, 0x039d, + 0x03c6, 0x03cf, 0x03d3, 0x03e0, 0x03e6, 0x0418, 0x0435, 0x043d, + 0x0446, 0x044b, 0x0453, 0x0462, 0x046b, 0x0472, 0x0479, 0x0485, + 0x048a, 0x04ac, 0x04b0, 0x04b4, 0x04bb, 0x04c1, 0x04c7, 0x04d0, + 0x04d8, 0x04de, 0x04e3, 0x04ee, 0x04f5, 0x04fd, 0x0504, 0x0515, + // Entry 80 - BF + 0x0523, 0x0530, 0x0536, 0x0543, 0x054e, 0x0552, 0x0557, 0x0562, + 0x056f, 0x0578, 0x057f, 0x0586, 0x058e, 0x0598, 0x059f, 0x05a4, + 0x05a9, 0x05af, 0x05b7, 0x05c1, 0x05cc, 0x05d6, 0x05e5, 0x05ee, + 0x05f2, 0x05fa, 0x0602, 0x0630, 0x0647, 0x0651, 0x065b, 0x0665, + 0x066a, 0x0671, 0x0679, 0x067f, 0x0685, 0x068d, 0x0695, 0x069c, + 0x06ab, 0x06b0, 0x06bd, 0x06c4, 0x06cd, 0x06d6, 0x06de, 0x06e3, + 0x06e8, 0x06ec, 0x06f9, 0x06fd, 0x0704, 0x0709, 0x071b, 0x072d, + 0x0736, 0x073e, 0x0745, 0x075a, 0x0762, 0x076c, 0x0781, 0x0789, + // Entry C0 - FF + 0x078e, 0x0796, 0x079b, 0x07ae, 0x07b5, 0x07bc, 0x07c2, 0x07c8, + 0x07ce, 0x07dc, 0x07ea, 0x07f4, 0x07f9, 0x07ff, 0x0808, 0x0813, + 0x081b, 0x082f, 0x0838, 0x0844, 0x084d, 0x0854, 0x085b, 0x0863, + 0x0863, 0x0877, 0x0882, 0x0882, 0x0887, 0x0890, 0x08a0, 0x08b5, + 0x08b9, 0x08d7, 0x08db, 0x08e4, 0x08ee, 0x08f5, 0x0904, 0x0910, + 0x0917, 0x091c, 0x0923, 0x0934, 0x093a, 0x0940, 0x0948, 0x094f, + 0x0955, 0x0982, 0x098f, 0x0996, 0x09a1, 0x09a8, 0x09c4, 0x09cd, + 0x09e9, 0x0a04, 0x0a0b, 0x0a12, 0x0a21, 0x0a26, 0x0a26, 0x0a2b, + // Entry 100 - 13F + 0x0a32, 0x0a3d, 0x0a43, 0x0a4b, 0x0a6b, 0x0a6f, 0x0a76, 0x0a87, + 0x0a9b, 0x0aa2, 0x0ab4, 0x0ac5, 0x0ad6, 0x0aeb, 0x0afb, 0x0b0e, + 0x0b17, 0x0b2d, 0x0b35, 0x0b43, 0x0b53, 0x0b65, 0x0b77, 0x0b90, + 0x0b99, 0x0bad, 0x0bb6, 0x0bba, 0x0bc7, 0x0bd6, 0x0bdc, 0x0bec, + 0x0c00, 0x0c11, 0x0c20, + }, + }, + { // fy + "AscensionAndorraVerenigde Arabyske EmiratenAfghanistanAntigua en Barbuda" + + "AnguillaAlbaniëArmeniëNederlânske AntillenAngolaAntarcticaArgentinië" + + "Amerikaansk SamoaEastenrykAustraliëArubaÅlânAzerbeidzjanBosnië en He" + + "rzegovinaBarbadosBangladeshBelgiëBurkina FasoBulgarijeBahreinBurundi" + + "BeninSaint BarthélemyBermudaBruneiBoliviaKaribysk NederlânBraziliëBa" + + "hama’sBhutanBouveteilânBotswanaWit-RuslânBelizeCanadaKokosilanenCong" + + "o-KinshasaSintraal-Afrikaanske RepublykCongo-BrazzavilleSwitserlânIv" + + "oorkustCookeilannenChiliKameroenSinaKolombiaClippertonCosta RicaKuba" + + "KaapverdiëCuraçaoKrysteilanSyprusTsjechjeDútslânDiego GarciaDjibouti" + + "DenemarkenDominikaDominikaanske RepublykAlgerijeCeuta en MelillaEcua" + + "dorEstlânEgypteWestelijke SaharaEritreaSpanjeEthiopiëEuropeeske Unie" + + "FinlânFijiFalklâneilannenMicronesiëFaeröerFrankrijkGabonVerenigd Kon" + + "inkrijkGrenadaGeorgiëFrans-GuyanaGuernseyGhanaGibraltarGrienlânGambi" + + "aGuineeGuadeloupeEquatoriaal-GuineaGrikelânSûd-Georgia en Sûdlike Sa" + + "ndwicheilannenGuatemalaGuamGuinee-BissauGuyanaHongkong SAR van SinaH" + + "eard- en McDonaldeilannenHondurasKroatiëHaïtiHongarijeKanaryske Eilâ" + + "nnenYndonesiëIerlânIsraëlIsle of ManIndiaBritse Gebieden yn de Indys" + + "ke OseaanIrakIranYslânItaliëJerseyJamaicaJordaniëJapanKeniaKirgiziëC" + + "ambodjaKiribatiComorenSaint Kitts en NevisNoard-KoreaSûd-KoreaKoewei" + + "tCaymaneilannenKazachstanLaosLibanonSaint LuciaLiechtensteinSri Lank" + + "aLiberiaLesothoLitouwenLuxemburgLetlânLibiëMarokkoMonacoMoldaviëMont" + + "enegroSaint-MartinMadeiaskarMarshalleilannenMacedoniëMaliMyanmar (Bi" + + "rma)MongoliëMacao SAR van SinaNoardlike MarianeneilannenMartiniqueMa" + + "uritaniëMontserratMaltaMauritiusMaldivenMalawiMexicoMaleisiëMozambiq" + + "ueNamibiëNij-CaledoniëNigerNorfolkeilânNigeriaNicaraguaNederlânNoarw" + + "egenNepalNauruNiueNij-SeelânOmanPanamaPeruFrans-PolynesiëPapoea-Nij-" + + "GuineaFilipijnenPakistanPolenSaint-Pierre en MiquelonPitcairneilanne" + + "nPuerto RicoPalestynske gebietenPortugalPalauParaguayQatarOerig Ocea" + + "niëRéunionRoemeniëServiëRuslânRwandaSaoedi-ArabiëSalomonseilannenSey" + + "chellenSoedanZwedenSingaporeSint-HelenaSloveniëSpitsbergen en Jan Ma" + + "yenSlowakijeSierra LeoneSan MarinoSenegalSomaliëSurinameSûd-SoedanSa" + + "o Tomé en PrincipeEl SalvadorSint-MaartenSyriëSwazilânTristan da Cun" + + "haTurks- en CaicoseilannenTsjaadFranse Gebieden in de zuidelijke Ind" + + "yske OseaanTogoThailânTadzjikistanTokelauEast-TimorTurkmenistanTunes" + + "iëTongaTurkijeTrinidad en TobagoTuvaluTaiwanTanzaniaOekraïneOegandaL" + + "yts ôflizzen eilannen fan de Ferienigde StatenFerienigde StatenUrugu" + + "ayOezbekistanVaticaanstêdSaint Vincent en de GrenadinesVenezuelaBrit" + + "se MaagdeneilannenAmerikaanske MaagdeneilannenVietnamVanuatuWallis e" + + "n FutunaSamoaKosovoJemenMayotteSûd-AfrikaZambiaZimbabweUnbekend gebi" + + "etWrâldAfrikaNoard-AmerikaSûd-AmerikaOceaniëWest-AfrikaMidden-Amerik" + + "aEast-AfrikaNoard-AfrikaSintraal-AfrikaSûdelijk AfrikaAmerikaNoardli" + + "k AmerikaKaribysk gebietEast-AziëSûd-AziëSûdoost-AziëSûd-EuropaAustr" + + "alaziëMelanesiëMicronesyske regioPolynesiëAziëSintraal-AziëWest-Azië" + + "EuropaEast-EuropaNoard-EuropaWest-EuropaLatynsk-Amearika", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0009, 0x0010, 0x002b, 0x0036, 0x0048, 0x0050, 0x0058, + 0x0060, 0x0075, 0x007b, 0x0085, 0x0090, 0x00a1, 0x00aa, 0x00b4, + 0x00b9, 0x00bf, 0x00cb, 0x00e1, 0x00e9, 0x00f3, 0x00fa, 0x0106, + 0x010f, 0x0116, 0x011d, 0x0122, 0x0133, 0x013a, 0x0140, 0x0147, + 0x0159, 0x0162, 0x016c, 0x0172, 0x017e, 0x0186, 0x0191, 0x0197, + 0x019d, 0x01a8, 0x01b6, 0x01d3, 0x01e4, 0x01ef, 0x01f8, 0x0204, + 0x0209, 0x0211, 0x0215, 0x021d, 0x0227, 0x0231, 0x0235, 0x0240, + 0x0248, 0x0252, 0x0258, 0x0260, 0x0269, 0x0275, 0x027d, 0x0287, + // Entry 40 - 7F + 0x028f, 0x02a5, 0x02ad, 0x02bd, 0x02c4, 0x02cb, 0x02d1, 0x02e2, + 0x02e9, 0x02ef, 0x02f8, 0x0307, 0x030e, 0x0312, 0x0322, 0x032d, + 0x0335, 0x033e, 0x0343, 0x0356, 0x035d, 0x0365, 0x0371, 0x0379, + 0x037e, 0x0387, 0x0390, 0x0396, 0x039c, 0x03a6, 0x03b8, 0x03c1, + 0x03ea, 0x03f3, 0x03f7, 0x0404, 0x040a, 0x041f, 0x0439, 0x0441, + 0x0449, 0x044f, 0x0458, 0x046b, 0x0475, 0x047c, 0x0483, 0x048e, + 0x0493, 0x04b7, 0x04bb, 0x04bf, 0x04c5, 0x04cc, 0x04d2, 0x04d9, + 0x04e2, 0x04e7, 0x04ec, 0x04f5, 0x04fd, 0x0505, 0x050c, 0x0520, + // Entry 80 - BF + 0x052b, 0x0535, 0x053c, 0x054a, 0x0554, 0x0558, 0x055f, 0x056a, + 0x0577, 0x0580, 0x0587, 0x058e, 0x0596, 0x059f, 0x05a6, 0x05ac, + 0x05b3, 0x05b9, 0x05c2, 0x05cc, 0x05d8, 0x05e2, 0x05f2, 0x05fc, + 0x0600, 0x060f, 0x0618, 0x062a, 0x0644, 0x064e, 0x0659, 0x0663, + 0x0668, 0x0671, 0x0679, 0x067f, 0x0685, 0x068e, 0x0698, 0x06a0, + 0x06ae, 0x06b3, 0x06c0, 0x06c7, 0x06d0, 0x06d9, 0x06e2, 0x06e7, + 0x06ec, 0x06f0, 0x06fb, 0x06ff, 0x0705, 0x0709, 0x0719, 0x072a, + 0x0734, 0x073c, 0x0741, 0x0759, 0x0769, 0x0774, 0x0788, 0x0790, + // Entry C0 - FF + 0x0795, 0x079d, 0x07a2, 0x07b0, 0x07b8, 0x07c1, 0x07c8, 0x07cf, + 0x07d5, 0x07e3, 0x07f3, 0x07fd, 0x0803, 0x0809, 0x0812, 0x081d, + 0x0826, 0x083e, 0x0847, 0x0853, 0x085d, 0x0864, 0x086c, 0x0874, + 0x087f, 0x0894, 0x089f, 0x08ab, 0x08b1, 0x08ba, 0x08ca, 0x08e2, + 0x08e8, 0x0917, 0x091b, 0x0923, 0x092f, 0x0936, 0x0940, 0x094c, + 0x0954, 0x0959, 0x0960, 0x0972, 0x0978, 0x097e, 0x0986, 0x098f, + 0x0996, 0x09c6, 0x09d7, 0x09de, 0x09e9, 0x09f6, 0x0a14, 0x0a1d, + 0x0a33, 0x0a4f, 0x0a56, 0x0a5d, 0x0a6d, 0x0a72, 0x0a78, 0x0a7d, + // Entry 100 - 13F + 0x0a84, 0x0a8f, 0x0a95, 0x0a9d, 0x0aac, 0x0ab2, 0x0ab8, 0x0ac5, + 0x0ad1, 0x0ad9, 0x0ae4, 0x0af2, 0x0afd, 0x0b09, 0x0b18, 0x0b28, + 0x0b2f, 0x0b3f, 0x0b4e, 0x0b58, 0x0b62, 0x0b70, 0x0b7b, 0x0b87, + 0x0b91, 0x0ba3, 0x0bad, 0x0bb2, 0x0bc0, 0x0bca, 0x0bd0, 0x0bdb, + 0x0be7, 0x0bf2, 0x0c02, + }, + }, + { // ga + "Oileán na DeascabhálaAndóraAontas na nÉimíríochtaí ArabachaAn Afganastái" + + "nAntigua agus BarbúdaAngaíleAn AlbáinAn AirméinAintillí na hÍsiltíre" + + "AngólaAn AntartaiceAn AirgintínSamó MeiriceánachAn OstairAn AstráilA" + + "rúbaOileáin ÅlandAn AsarbaiseáinAn Bhoisnia agus An HeirseagaivéinBa" + + "rbadósAn BhanglaidéisAn BheilgBuircíne FasóAn BhulgáirBairéinAn Bhur" + + "úinBeininSaint BarthélemyBeirmiúdaBrúinéAn BholaivAn Ísiltír Chairi" + + "beachAn BhrasaílNa BahámaíAn BhútáinOileán BouvetAn BhotsuáinAn Bhea" + + "larúisAn BheilísCeanadaOileáin Cocos (Keeling)Poblacht Dhaonlathach " + + "an ChongóPoblacht na hAfraice LáirAn CongóAn EilvéisAn Cósta Eabhair" + + "Oileáin CookAn tSileCamarúnAn tSínAn CholóimOileán ClippertonCósta R" + + "íceCúbaRinn VerdeCuraçaoOileán na NollagAn ChipirPoblacht na SeiceA" + + "n GhearmáinDiego GarciaDjiboutiAn DanmhairgDoiminiceAn Phoblacht Dho" + + "iminiceachAn AilgéirCeuta agus MelillaEacuadórAn EastóinAn ÉigiptAn " + + "Sahára ThiarAn EiritréAn SpáinnAn AetóipAn tAontas EorpachAn Fhionla" + + "innFidsíOileáin FháclainneAn MhicrinéisOileáin FharóAn FhraincAn Gha" + + "búinAn Ríocht AontaitheGreanádaAn tSeoirsiaGuáin na FrainceGeansaíGá" + + "naGiobráltarAn GhraonlainnAn GhaimbiaAn GhuineGuadalúipAn Ghuine Mhe" + + "ánchriosachAn GhréigAn tSeoirsia Theas agus Oileáin Sandwich TheasG" + + "uatamalaGuamGuine BissauAn GhuáinS.R.R. na Síne Hong CongOileán Hear" + + "d agus Oileáin McDonaldHondúrasAn ChróitHáítíAn UngáirNa hOileáin Ch" + + "anárachaAn IndinéisÉireIosraelOileán MhanannAn IndiaCríoch Aigéan In" + + "diach na BreataineAn IaráicAn IaráinAn ÍoslainnAn IodáilGeirsíIamáic" + + "eAn IordáinAn tSeapáinAn ChéiniaAn ChirgeastáinAn ChambóidCireabaití" + + "Oileáin ChomóraSan Críostóir-NimheasAn Chóiré ThuaidhAn Chóiré Theas" + + "CuáitOileáin CaymanAn ChasacstáinLaosAn LiobáinSaint LuciaLichtinsté" + + "inSrí LancaAn LibéirLeosótaAn LiotuáinLucsamburgAn LaitviaAn LibiaMa" + + "racóMonacóAn MholdóivMontainéagróSaint-MartinMadagascarOileáin Marsh" + + "allAn MhacadóinMailíMaenmar (Burma)An MhongóilS.R.R. na Síne MacaoNa" + + " hOileáin Mháirianacha ThuaidhMartiniqueAn MháratáinMontsaratMáltaOi" + + "leán MhuirísOileáin MhaildíveAn MhaláivMeicsiceoAn MhalaeisiaMósaimb" + + "ícAn NamaibAn Nua-ChaladóinAn NígirOileán NorfolkAn NigéirNicearagu" + + "aAn ÍsiltírAn IoruaNeipealNárúNiueAn Nua-ShéalainnÓmanPanamaPeiriúPo" + + "lainéis na FrainceNua-Ghuine PhapuaNa hOileáin FhilipíneachaAn Phaca" + + "stáinAn PholainnSaint-Pierre-et-MiquelonOileáin PitcairnPortó RíceNa" + + " Críocha PalaistíneachaAn PhortaingéilPalauParaguaCatarAn Aigéine Im" + + "eallachRéunionAn RómáinAn tSeirbiaAn RúisRuandaAn Araib ShádachOileá" + + "in SholomónNa SéiséilAn tSúdáinAn tSualainnSingeapórSan HéilinAn tSl" + + "óivéinSvalbard agus Jan MayenAn tSlóvaicSiarra LeonSan MairíneAn tS" + + "eineagáilAn tSomáilSuranamAn tSúdáin TheasSão Tomé agus PríncipeAn t" + + "SalvadóirSint MaartenAn tSiriaAn tSuasalainnTristan da CunhaOileáin " + + "na dTurcach agus CaicosSeadCríocha Francacha Dheisceart an DomhainTó" + + "gaAn TéalainnAn TáidsíceastáinTócaláTíomór ThoirAn TuircméanastáinAn" + + " TúinéisTongaAn TuircOileán na Tríonóide agus TobágaTuvaluAn Téaváin" + + "An TansáinAn ÚcráinUgandaOileáin Imeallacha S.A.M.Stáit Aontaithe Mh" + + "eiriceáUruguaAn ÚisbéiceastáinAn VatacáinSan Uinseann agus na Greaná" + + "idíníVeiniséalaOileáin Bhriotanacha na MaighdeanOileáin Mheiriceánac" + + "ha na MaighdeanVítneamVanuatúVailís agus FutúnaSamóAn ChosaivÉiminMa" + + "yotteAn Afraic TheasAn tSaimbiaAn tSiombáibRéigiún AnaithnidAn Domha" + + "nAn AfraicMeiriceá ThuaidhMeiriceá TheasAn AigéineIarthar na hAfraic" + + "eMeiriceá LáirOirthear na hAfraiceTuaisceart na hAfraiceAn Afraic Lá" + + "irDeisceart na hAfraiceCríocha MheiriceáTuaisceart MheiriceáAn Mhuir" + + " ChairibOirthear na hÁiseDeisceart na hÁiseOirdheisceart na hÁiseDei" + + "sceart na hEorpaAn AstraláiseAn MheilinéisAn Réigiún MicrinéiseachAn" + + " PholainéisAn ÁiseAn Áise LáirIarthar na hÁiseAn EoraipOirthear na h" + + "EorpaTuaisceart na hEorpaIarthar na hEorpaMeiriceá Laidineach", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0017, 0x001e, 0x0042, 0x0051, 0x0066, 0x006e, 0x0078, + 0x0083, 0x009b, 0x00a2, 0x00af, 0x00bc, 0x00cf, 0x00d8, 0x00e3, + 0x00e9, 0x00f8, 0x0108, 0x012b, 0x0134, 0x0144, 0x014d, 0x015c, + 0x0168, 0x0170, 0x017b, 0x0181, 0x0192, 0x019c, 0x01a4, 0x01ae, + 0x01c6, 0x01d2, 0x01de, 0x01ea, 0x01f8, 0x0205, 0x0213, 0x021e, + 0x0225, 0x023d, 0x025d, 0x0277, 0x0280, 0x028b, 0x029c, 0x02a9, + 0x02b1, 0x02b9, 0x02c1, 0x02cc, 0x02de, 0x02ea, 0x02ef, 0x02f9, + 0x0301, 0x0312, 0x031b, 0x032c, 0x0339, 0x0345, 0x034d, 0x0359, + // Entry 40 - 7F + 0x0362, 0x037c, 0x0387, 0x0399, 0x03a2, 0x03ad, 0x03b7, 0x03c7, + 0x03d2, 0x03dc, 0x03e6, 0x03f8, 0x0405, 0x040b, 0x041f, 0x042d, + 0x043c, 0x0446, 0x0451, 0x0465, 0x046e, 0x047a, 0x048b, 0x0493, + 0x0498, 0x04a3, 0x04b1, 0x04bc, 0x04c5, 0x04cf, 0x04e8, 0x04f2, + 0x0521, 0x052a, 0x052e, 0x053a, 0x0544, 0x055d, 0x0581, 0x058a, + 0x0594, 0x059c, 0x05a6, 0x05be, 0x05ca, 0x05cf, 0x05d6, 0x05e5, + 0x05ed, 0x0611, 0x061b, 0x0625, 0x0631, 0x063b, 0x0642, 0x064a, + 0x0655, 0x0661, 0x066c, 0x067c, 0x0688, 0x0693, 0x06a4, 0x06bb, + // Entry 80 - BF + 0x06ce, 0x06df, 0x06e5, 0x06f4, 0x0703, 0x0707, 0x0712, 0x071d, + 0x072a, 0x0734, 0x073e, 0x0746, 0x0752, 0x075c, 0x0766, 0x076e, + 0x0775, 0x077c, 0x0788, 0x0796, 0x07a2, 0x07ac, 0x07bd, 0x07ca, + 0x07d0, 0x07df, 0x07eb, 0x0800, 0x0822, 0x082c, 0x083a, 0x0843, + 0x0849, 0x0859, 0x086c, 0x0877, 0x0880, 0x088d, 0x0898, 0x08a1, + 0x08b2, 0x08bb, 0x08ca, 0x08d4, 0x08de, 0x08ea, 0x08f2, 0x08f9, + 0x08ff, 0x0903, 0x0914, 0x0919, 0x091f, 0x0926, 0x093b, 0x094c, + 0x0967, 0x0975, 0x0980, 0x0998, 0x09a9, 0x09b5, 0x09d0, 0x09e0, + // Entry C0 - FF + 0x09e5, 0x09ec, 0x09f1, 0x0a06, 0x0a0e, 0x0a19, 0x0a24, 0x0a2c, + 0x0a32, 0x0a43, 0x0a55, 0x0a61, 0x0a6d, 0x0a79, 0x0a83, 0x0a8e, + 0x0a9c, 0x0ab3, 0x0abf, 0x0aca, 0x0ad6, 0x0ae5, 0x0af0, 0x0af7, + 0x0b09, 0x0b22, 0x0b30, 0x0b3c, 0x0b45, 0x0b53, 0x0b63, 0x0b83, + 0x0b87, 0x0baf, 0x0bb4, 0x0bc0, 0x0bd4, 0x0bdc, 0x0bea, 0x0bfe, + 0x0c0a, 0x0c0f, 0x0c17, 0x0c3a, 0x0c40, 0x0c4c, 0x0c57, 0x0c62, + 0x0c68, 0x0c82, 0x0c9d, 0x0ca3, 0x0cb7, 0x0cc3, 0x0ce6, 0x0cf1, + 0x0d13, 0x0d38, 0x0d40, 0x0d48, 0x0d5c, 0x0d61, 0x0d6b, 0x0d71, + // Entry 100 - 13F + 0x0d78, 0x0d87, 0x0d92, 0x0d9f, 0x0db2, 0x0dbb, 0x0dc4, 0x0dd5, + 0x0de4, 0x0def, 0x0e02, 0x0e11, 0x0e25, 0x0e3b, 0x0e4a, 0x0e5f, + 0x0e72, 0x0e87, 0x0e97, 0x0ea9, 0x0ebc, 0x0ed3, 0x0ee6, 0x0ef4, + 0x0f02, 0x0f1d, 0x0f2b, 0x0f33, 0x0f41, 0x0f52, 0x0f5b, 0x0f6d, + 0x0f81, 0x0f92, 0x0fa6, + }, + }, + { // gd + "Eilean na DeasgabhalachAndorraNa h-Iomaratan Arabach AonaichteAfghanastà" + + "nAintìoga is BarbudaAnguillaAlbàiniaAirmeiniaEileanan Aintilia nan T" + + "ìrean ÌsleAngòlaAn AntartaigAn ArgantainSamotha na h-AimeireagaAn O" + + "stairAstràiliaArùbaNa h-Eileanan ÅlandAsarbaideànBosna agus Hearsago" + + "bhanaBarbadosBangladaisA’ BheilgBuirciona FasoA’ BhulgairBachrainBur" + + "undaidhBeininSaint BarthélemyBearmùdaBrùnaighBoilibhiaNa Tìrean Ìsle" + + " CaraibeachBraisilNa h-Eileanan BhathamaButànEilean BouvetBotsuanaA’" + + " BhealaruisA’ BheilìsCanadaNa h-Eileanan Cocos (Keeling)Congo - Kins" + + "hasaPoblachd Meadhan AfragaA’ Chongo - BrazzavilleAn EilbheisCôte d’" + + "IvoireEileanan CookAn t-SileCamarunAn t-SìnColoimbiaEilean Clipperto" + + "nCosta RìceaCùbaAn Ceap UaineCuraçaoEilean na NollaigCìoprasPoblachd" + + " na SeiceA’ GhearmailtDiego GarciaDiobùtaidhAn DanmhairgDoiminiceaA’" + + " Phoblachd DhoiminiceachAildiriaCeuta agus MelillaEacuadorAn Eastoin" + + "An ÈiphitSathara an IarEartraAn SpàinnAn ItiopAn t-Aonadh EòrpachAn " + + "FhionnlannFìdiNa h-Eileanan FàclannachNa Meanbh-EileananNa h-Eileana" + + "n FàroAn FhraingGabonAn Rìoghachd AonaichteGreanàdaA’ ChairtbheilGui" + + "dheàna na FraingeGeàrnsaidhGànaDiobraltarA’ GhraonlannA’ GhaimbiaGin" + + "iGuadalupGini Mheadhan-ChriosachA’ GhreugSeòrsea a Deas is na h-Eile" + + "anan Sandwich a DeasGuatamalaGuamGini-BiosoGuidheànaHong Kong SAR na" + + " SìneEilean Heard is MhicDhòmhnaillHondùrasA’ ChròthaisHaidhtiAn Ung" + + "airNa h-Eileanan CanàrachNa h-Innd InnseÈirinnIosraelEilean Mhanainn" + + "Na h-InnseachanRanntair Breatannach Cuan nan InnseachanIoràcIorànInn" + + "is TìleAn EadailtDeàrsaidhDiameugaIòrdanAn t-SeapanCeiniaCìorgastanC" + + "ambuideaCiribeasComorosNaomh Crìstean is NibheisCoirèa a TuathCoirèa" + + " a DeasCuibhèitNa h-Eileanan CaimeanCasachstànLàthosLeabanonNaomh Lù" + + "iseaLichtensteinSri LancaLibèirLeasotoAn LiotuainLugsamburgAn Laitbh" + + "eLibiaMorocoMonacoA’ MholdobhaAm Monadh NeagrachNaomh MàrtainnMadaga" + + "sgarEileanan MharshallA’ MhasadonMàiliMiànmarDùthaich nam MongolMacà" + + "thu SAR na SìneNa h-Eileanan Mairianach a TuathMairtinicMoratàineaMo" + + "ntsaratMaltaNa h-Eileanan MhoiriseasNa h-Eileanan MhaladaibhMalabhai" + + "dhMeagsagoMalaidhseaMòsaimbicAn NamaibCailleann NuadhNìgeirEilean No" + + "rfolkNigèiriaNiocaraguaNa Tìrean ÌsleAn NirribhidhNeapàlNabhruNiueSe" + + "alainn NuadhOmànPanamaPearùPoilinèis na FraingeGini Nuadh Phaputhach" + + "Na h-Eileanan FilipineachPagastànA’ PhòlainnSaint Pierre agus Miquel" + + "onEilean Peit a’ ChàirnPorto RìceoNa Ranntairean PalastaineachA’ Pho" + + "rtagailPalabhParaguaidhCatarRoinn Iomallach a’ Chuain SèimhRéunionRo" + + "màiniaAn t-SèirbAn RuisRubhandaAràibia nan SabhdEileanan SholaimhNa " + + "h-Eileanan SheiseallSudànAn t-SuainSingeapòrEilean Naomh EilidhAn t-" + + "SlòbhainSvalbard agus Jan MayenAn t-SlòbhacSiarra LeòmhannSan Marino" + + "SeanagalSomàiliaSuranamSudàn a DeasSão Tomé agus PríncipeAn Salbhado" + + "rSint MaartenSiridheaDùthaich nan SuasaidhTristan da CunhaNa h-Eilea" + + "nan Turcach is CaiceoAn t-SeàdRanntairean a Deas na FraingeTogoDùtha" + + "ich nan TàidhTaidigeastànTokelauTimor-LesteTurcmanastànTuiniseaTonga" + + "An TuircTrianaid agus TobagoTubhaluTaidh-BhànAn TansanAn UcràinUgand" + + "aMeanbh-Eileanan Iomallach nan SANa Stàitean AonaichteUruguaidhUsbag" + + "astànCathair na BhatacainNaomh Bhionsant agus Eileanan GreanadachA’ " + + "BheinisealaEileanan Breatannach na MaighdinnEileanan Aimeireagach na" + + " MaighdinnBhiet-NamVanuatuUallas agus FutunaSamothaA’ ChosobhoAn Eam" + + "anMayotteAfraga a DeasSàimbiaAn t-SìombabRoinn-dùthcha neo-aithnicht" + + "eAn SaoghalAfragaAimeireaga a TuathAimeireaga a DeasRoinn a’ Chuain " + + "SèimhAfraga an IarMeadhan AimeireagaAfraga an EarAfraga a TuathMeadh" + + "an AfragaCeann a Deas AfragaAn Dà AimeireagaCeann a Tuath Aimeireaga" + + "Am Muir CaraibeachÀisia an EarÀisia a DeasÀisia an Ear-dheasAn Roinn" + + "-Eòrpa a DeasAstràilia is Sealainn NuadhNa h-Eileanan DubhaRoinn nam" + + " Meanbh-EileananPoilinèisÀisiaMeadhan ÀisiaÀisia an IarAn Roinn-Eòrp" + + "aAn Roinn-Eòrpa an EarAn Roinn-Eòrpa a TuathAn Roinn-Eòrpa an IarAim" + + "eireaga Laidinneach", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0017, 0x001e, 0x003e, 0x004a, 0x005e, 0x0066, 0x006f, + 0x0078, 0x009b, 0x00a2, 0x00ae, 0x00ba, 0x00d1, 0x00da, 0x00e4, + 0x00ea, 0x00fe, 0x010a, 0x0122, 0x012a, 0x0134, 0x013f, 0x014d, + 0x015a, 0x0162, 0x016c, 0x0172, 0x0183, 0x018c, 0x0195, 0x019e, + 0x01b9, 0x01c0, 0x01d6, 0x01dc, 0x01e9, 0x01f1, 0x0200, 0x020d, + 0x0213, 0x0230, 0x0240, 0x0257, 0x0270, 0x027b, 0x028b, 0x0298, + 0x02a1, 0x02a8, 0x02b1, 0x02ba, 0x02cb, 0x02d7, 0x02dc, 0x02e9, + 0x02f1, 0x0302, 0x030a, 0x031b, 0x032a, 0x0336, 0x0341, 0x034d, + // Entry 40 - 7F + 0x0357, 0x0373, 0x037b, 0x038d, 0x0395, 0x039f, 0x03a9, 0x03b7, + 0x03bd, 0x03c7, 0x03cf, 0x03e3, 0x03f0, 0x03f5, 0x040e, 0x0420, + 0x0433, 0x043d, 0x0442, 0x0459, 0x0462, 0x0472, 0x0487, 0x0492, + 0x0497, 0x04a1, 0x04b0, 0x04bd, 0x04c1, 0x04c9, 0x04e0, 0x04eb, + 0x051b, 0x0524, 0x0528, 0x0532, 0x053c, 0x0552, 0x0571, 0x057a, + 0x0589, 0x0590, 0x0599, 0x05b0, 0x05bf, 0x05c6, 0x05cd, 0x05dc, + 0x05eb, 0x0613, 0x0619, 0x061f, 0x062a, 0x0634, 0x063e, 0x0646, + 0x064d, 0x0658, 0x065e, 0x0669, 0x0672, 0x067a, 0x0681, 0x069b, + // Entry 80 - BF + 0x06aa, 0x06b8, 0x06c1, 0x06d6, 0x06e1, 0x06e8, 0x06f0, 0x06fd, + 0x0709, 0x0712, 0x0719, 0x0720, 0x072b, 0x0735, 0x073f, 0x0744, + 0x074a, 0x0750, 0x075e, 0x0770, 0x077f, 0x0789, 0x079b, 0x07a8, + 0x07ae, 0x07b6, 0x07ca, 0x07df, 0x07ff, 0x0808, 0x0813, 0x081c, + 0x0821, 0x0839, 0x0851, 0x085b, 0x0863, 0x086d, 0x0877, 0x0880, + 0x088f, 0x0896, 0x08a4, 0x08ad, 0x08b7, 0x08c7, 0x08d4, 0x08db, + 0x08e1, 0x08e5, 0x08f3, 0x08f8, 0x08fe, 0x0904, 0x0919, 0x092e, + 0x0947, 0x0950, 0x095e, 0x0978, 0x0990, 0x099c, 0x09b8, 0x09c7, + // Entry C0 - FF + 0x09cd, 0x09d7, 0x09dc, 0x09fe, 0x0a06, 0x0a0f, 0x0a1a, 0x0a21, + 0x0a29, 0x0a3b, 0x0a4c, 0x0a63, 0x0a69, 0x0a73, 0x0a7d, 0x0a90, + 0x0a9e, 0x0ab5, 0x0ac2, 0x0ad2, 0x0adc, 0x0ae4, 0x0aed, 0x0af4, + 0x0b01, 0x0b1a, 0x0b26, 0x0b32, 0x0b3a, 0x0b50, 0x0b60, 0x0b7f, + 0x0b89, 0x0ba6, 0x0baa, 0x0bbe, 0x0bcb, 0x0bd2, 0x0bdd, 0x0bea, + 0x0bf2, 0x0bf7, 0x0bff, 0x0c13, 0x0c1a, 0x0c25, 0x0c2e, 0x0c38, + 0x0c3e, 0x0c5e, 0x0c74, 0x0c7d, 0x0c88, 0x0c9c, 0x0cc4, 0x0cd4, + 0x0cf5, 0x0d17, 0x0d20, 0x0d27, 0x0d39, 0x0d40, 0x0d4d, 0x0d55, + // Entry 100 - 13F + 0x0d5c, 0x0d69, 0x0d71, 0x0d7e, 0x0d9b, 0x0da5, 0x0dab, 0x0dbd, + 0x0dce, 0x0de6, 0x0df3, 0x0e05, 0x0e12, 0x0e20, 0x0e2e, 0x0e41, + 0x0e52, 0x0e6a, 0x0e7c, 0x0e89, 0x0e96, 0x0ea9, 0x0ebf, 0x0edb, + 0x0eee, 0x0f07, 0x0f11, 0x0f17, 0x0f25, 0x0f32, 0x0f41, 0x0f57, + 0x0f6e, 0x0f84, 0x0f9a, + }, + }, + { // gl + "Illa de AscensiónAndorraEmiratos Árabes UnidosAfganistánAntiga e Barbuda" + + "AnguilaAlbaniaArmeniaAntillas HolandesasAngolaAntártidaArxentinaSamo" + + "a AmericanaAustriaAustraliaArubaIllas AlandAcerbaixánBosnia e Herceg" + + "ovinaBarbadosBangladeshBélxicaBurkina FasoBulgariaBahreinBurundiBeni" + + "nSan BartoloméBermudasBruneiBoliviaCaribe neerlandésBrasilBahamasBut" + + "ánIlla BouvetBotsuanaBielorrusiaBeliceCanadáIllas Cocos (Keeling)Re" + + "pública Democrática do CongoRepública CentroafricanaCongoSuízaCosta " + + "de MarfilIllas CookChileCamerúnChinaColombiaIlla ClippertonCosta Ric" + + "aCubaCabo VerdeCuraçaoIlla ChristmasChipreRepública ChecaAlemañaDieg" + + "o GarcíaDjibutiDinamarcaDominicaRepública DominicanaArxeliaCeuta e M" + + "elillaEcuadorEstoniaExiptoSáhara OccidentalEritreaEspañaEtiopíaUnión" + + " EuropeaFinlandiaFixiIllas MalvinasMicronesiaIllas FeroeFranciaGabón" + + "Reino UnidoGranadaXeorxiaGüiana FrancesaGuernseyGanaXibraltarGrenlan" + + "diaGambiaGuineaGuadalupeGuinea EcuatorialGreciaXeorxia do Sur e Illa" + + "s SandwichGuatemalaGuamGuinea-BissauGüianaHong Kong RAE de ChinaIlla" + + " Heard e Illas McDonaldHondurasCroaciaHaitíHungríaIllas CanariasIndo" + + "nesiaIrlandaIsraelIlla de ManIndiaTerritorio Británico do Océano Índ" + + "icoIraqIránIslandiaItaliaJerseyXamaicaXordaniaXapónKenyaQuirguicistá" + + "nCambodiaKiribatiComoresSan Cristovo e NevisCorea do NorteCorea do S" + + "urKuwaitIllas CaimánKazakhstanLaosLíbanoSanta LucíaLiechtensteinSri " + + "LankaLiberiaLesothoLituaniaLuxemburgoLetoniaLibiaMarrocosMónacoMoldo" + + "vaMontenegroSan MartiñoMadagascarIllas MarshallMacedoniaMaliMyanmar " + + "(Birmania)MongoliaMacau RAE de ChinaIllas Marianas do norteMartinica" + + "MauritaniaMontserratMaltaMauricioMaldivasMalauiMéxicoMalaisiaMozambi" + + "queNamibiaNova CaledoniaNíxerIlla NorfolkNixeriaNicaraguaPaíses Baix" + + "osNoruegaNepalNauruNiueNova CelandiaOmánPanamáPerúPolinesia Francesa" + + "Papúa Nova GuineaFilipinasPaquistánPoloniaSan Pedro e MiguelónIllas " + + "PitcairnPorto RicoTerritorios palestinosPortugalPalauParaguaiQatarOc" + + "eanía DistanteReuniónRomaníaSerbiaRusiaRuandaArabia SauditaIllas Sal" + + "omónSeixelesSudánSueciaSingapurSanta HelenaEsloveniaSvalbard e Jan M" + + "ayenEslovaquiaSerra LeoaSan MarinoSenegalSomaliaSurinamSudán do surS" + + "an Tomé e PríncipeEl SalvadorSint MaartenSiriaSuacilandiaTristán da " + + "CunhaIllas Turks e CaicosChadTerritorios Franceses do SulTogoTailand" + + "iaTaxiquistánTokelauTimor LesteTurkmenistánTunisiaTongaTurquíaTrinda" + + "de e TobagoTuvaluTaiwánTanzaniaUcraínaUgandaIllas Menores Distantes " + + "dos EUA.Estados Unidos de AméricaUruguaiUzbekistánCidade do Vaticano" + + "San Vicente e GranadinasVenezuelaIllas Virxes BritánicasIllas Virxes" + + " EstadounidensesVietnamVanuatuWallis e FutunaSamoaKosovoIemenMayotte" + + "SudáfricaZambiaCimbabueRexión descoñecidaMundoÁfricaNorteaméricaSuda" + + "méricaOceaníaÁfrica OccidentalAmérica CentralÁfrica OrientalÁfrica S" + + "eptentrionalÁfrica CentralÁfrica MeridionalAméricaAmérica do NorteCa" + + "ribeAsia OrientalSul de AsiaSureste AsiáticoEuropa MeridionalAustral" + + "asiaMelanesiaRexión da MicronesiaPolinesiaAsiaAsia CentralAsia Occid" + + "entalEuropaEuropa do LesteEuropa SeptentrionalEuropa OccidentalAméri" + + "ca Latina", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0012, 0x0019, 0x0030, 0x003b, 0x004b, 0x0052, 0x0059, + 0x0060, 0x0073, 0x0079, 0x0083, 0x008c, 0x009b, 0x00a2, 0x00ab, + 0x00b0, 0x00bb, 0x00c6, 0x00da, 0x00e2, 0x00ec, 0x00f4, 0x0100, + 0x0108, 0x010f, 0x0116, 0x011b, 0x0129, 0x0131, 0x0137, 0x013e, + 0x0150, 0x0156, 0x015d, 0x0163, 0x016e, 0x0176, 0x0181, 0x0187, + 0x018e, 0x01a3, 0x01c3, 0x01dc, 0x01e1, 0x01e7, 0x01f6, 0x0200, + 0x0205, 0x020d, 0x0212, 0x021a, 0x0229, 0x0233, 0x0237, 0x0241, + 0x0249, 0x0257, 0x025d, 0x026d, 0x0275, 0x0282, 0x0289, 0x0292, + // Entry 40 - 7F + 0x029a, 0x02af, 0x02b6, 0x02c5, 0x02cc, 0x02d3, 0x02d9, 0x02eb, + 0x02f2, 0x02f9, 0x0301, 0x030f, 0x0318, 0x031c, 0x032a, 0x0334, + 0x033f, 0x0346, 0x034c, 0x0357, 0x035e, 0x0365, 0x0375, 0x037d, + 0x0381, 0x038a, 0x0394, 0x039a, 0x03a0, 0x03a9, 0x03ba, 0x03c0, + 0x03df, 0x03e8, 0x03ec, 0x03f9, 0x0400, 0x0416, 0x0431, 0x0439, + 0x0440, 0x0446, 0x044e, 0x045c, 0x0465, 0x046c, 0x0472, 0x047d, + 0x0482, 0x04aa, 0x04ae, 0x04b3, 0x04bb, 0x04c1, 0x04c7, 0x04ce, + 0x04d6, 0x04dc, 0x04e1, 0x04ef, 0x04f7, 0x04ff, 0x0506, 0x051a, + // Entry 80 - BF + 0x0528, 0x0534, 0x053a, 0x0547, 0x0551, 0x0555, 0x055c, 0x0568, + 0x0575, 0x057e, 0x0585, 0x058c, 0x0594, 0x059e, 0x05a5, 0x05aa, + 0x05b2, 0x05b9, 0x05c0, 0x05ca, 0x05d6, 0x05e0, 0x05ee, 0x05f7, + 0x05fb, 0x060d, 0x0615, 0x0627, 0x063e, 0x0647, 0x0651, 0x065b, + 0x0660, 0x0668, 0x0670, 0x0676, 0x067d, 0x0685, 0x068f, 0x0696, + 0x06a4, 0x06aa, 0x06b6, 0x06bd, 0x06c6, 0x06d4, 0x06db, 0x06e0, + 0x06e5, 0x06e9, 0x06f6, 0x06fb, 0x0702, 0x0707, 0x0719, 0x072b, + 0x0734, 0x073e, 0x0745, 0x075a, 0x0768, 0x0772, 0x0788, 0x0790, + // Entry C0 - FF + 0x0795, 0x079d, 0x07a2, 0x07b3, 0x07bb, 0x07c3, 0x07c9, 0x07ce, + 0x07d4, 0x07e2, 0x07f0, 0x07f8, 0x07fe, 0x0804, 0x080c, 0x0818, + 0x0821, 0x0835, 0x083f, 0x0849, 0x0853, 0x085a, 0x0861, 0x0868, + 0x0875, 0x088a, 0x0895, 0x08a1, 0x08a6, 0x08b1, 0x08c2, 0x08d6, + 0x08da, 0x08f6, 0x08fa, 0x0903, 0x090f, 0x0916, 0x0921, 0x092e, + 0x0935, 0x093a, 0x0942, 0x0953, 0x0959, 0x0960, 0x0968, 0x0970, + 0x0976, 0x0996, 0x09b0, 0x09b7, 0x09c2, 0x09d4, 0x09ec, 0x09f5, + 0x0a0d, 0x0a29, 0x0a30, 0x0a37, 0x0a46, 0x0a4b, 0x0a51, 0x0a56, + // Entry 100 - 13F + 0x0a5d, 0x0a67, 0x0a6d, 0x0a75, 0x0a89, 0x0a8e, 0x0a95, 0x0aa2, + 0x0aad, 0x0ab5, 0x0ac7, 0x0ad7, 0x0ae7, 0x0afc, 0x0b0b, 0x0b1d, + 0x0b25, 0x0b36, 0x0b3c, 0x0b49, 0x0b54, 0x0b65, 0x0b76, 0x0b81, + 0x0b8a, 0x0b9f, 0x0ba8, 0x0bac, 0x0bb8, 0x0bc7, 0x0bcd, 0x0bdc, + 0x0bf0, 0x0c01, 0x0c10, + }, + }, + { // gsw + "AndorraVeräinigti Arabischi EmirateAfganischtanAntigua und BarbudaAnguil" + + "laAlbaanieArmeenieNiderländischi AntilleAngoolaAntarktisArgentiinieA" + + "merikaanisch-SamoaÖöschtriichAuschtraalieArubaAaland-InsleAserbäidsc" + + "hanBosnie und HerzegowinaBarbadosBangladeschBelgieBurkina FaasoBulga" + + "arieBachräinBurundiBeninSt. BarthelemiBermuudaBrunäi TarussalamBolii" + + "vieBrasilieBahaamasBhutanBouvet-InsleBotswanaWiissrusslandBelizeKana" + + "daKokos-InsleTemokraatischi Republik KongoZentraalafrikaanischi Repu" + + "blikKongoSchwiizElfebäiküschteCook-InsleTschileKamerunChiinaKolumbie" + + "Coschta RicaKubaKap VerdeWienachts-InsleZypereTschechischi RepublikT" + + "üütschlandTschibuutiTänemarkTominicaTominikaanischi RepublikAlgeeri" + + "eEcuadorEestlandÄgüpteWeschtsaharaÄritreeaSchpanieÄthiopieEuropääisc" + + "hi UnioonFinnlandFitschiFalkland-InsleMikroneesieFäröerFrankriichGab" + + "unVeräinigts ChönigriichGrenadaGeoorgieFranzösisch-GuäjaanaGäärnsiGa" + + "anaGibraltarGröönlandGambiaGineeaGuadälupÄquatoriaalgineeaGriechelan" + + "dSüüdgeorgie und d’süüdlichi Sändwitsch-InsleGuatemaalaGuamGineea-Bi" + + "ssauGuäjaanaSonderverwaltigszone HongkongHöörd- und MäcDonald-InsleH" + + "ondurasKroaazieHaitiUngarnIndoneesieIrlandIsraelInsle vo MänIndieBri" + + "tischs Territoorium im Indische OozeanIraakIraanIislandItaalieDschör" + + "siDschamäikaJordaanieJapanKeeniaKirgiisischtanKambodschaKiribaatiKom" + + "ooreSt. Kitts und NiuwisDemokraatischi Volksrepublik KoreeaRepublik " + + "KoreeaKuwäitKäimän-InsleKasachschtanLaaosLibanonSt. LutschiiaLiächte" + + "schtäiSchri LankaLibeeriaLesootoLittaueLuxemburgLettlandLüübieMarokk" + + "oMonacoRepublik MoldauMonteneegroSt. MartinMadagaschkarMarshallinsle" + + "MazedoonieMaaliMyanmar (Burma)MongoleiSonderverwaltigszone MacaoNörd" + + "lichi MariaaneMartiniggMauretaanieMoosörratMaltaMauriiziusMalediiweM" + + "alaawiMexikoMaläisiaMosambikNamiibiaNöikaledoonieNigerNorfolk-InsleN" + + "igeeriaNicaraaguaHollandNorweegeNeepalNauruNiueNöiseelandOmaanPanama" + + "PeruFranzösisch-PolineesiePapua-NeuguineaPhilippiinePakischtanPooleS" + + "t. Pierr und MiggeloPitggäärnPuerto RiggoPaläschtinänsischi GebietPo" + + "rtugalPalauParaguaiGgatarÜssers OzeaanieReünioonRumäänieSärbieRussla" + + "ndRuandaSaudi-AraabieSalomooneSeischälleSudanSchweedeSingapuurSt. He" + + "lenaSloweenieSvalbard und Jaan MääieSlowakäiSierra LeooneSan Mariino" + + "SenegalSomaalieSurinamSao Tome und PrinssipeEl SalvadorSüürieSwasila" + + "ndTörks- und Gaiggos-InsleTschadFranzösischi Süüd- und Antarktisgebi" + + "etToogoThailandTadschikischtanTokelauOschttimorTurkmeenischtanTunees" + + "ieTongaTürggeiTrinidad und TobaagoTuvaluTaiwanTansaniiaUkraiineUgand" + + "aAmerikanisch-OzeaanieVeräinigti SchtaateUruguayUschbeekischtanVatik" + + "anstadtSt. Vincent und d’GrönadiineVenezueelaBritischi Jungfere-Insl" + + "eAmerikaanischi Jungfere-InsleWietnamWanuatuWallis und FutuunaSamooa" + + "JeemeMajottSüüdafrikaSambiaSimbabweUnbekannti oder ungültigi Regioon" + + "WältAfrikaNordameerikaSüüdameerikaOzeaanieWeschtafrikaMittelameerika" + + "OschtafrikaNordafrikaZentraalafrikaSüüdlichs AfrikaNord-, Mittel- un" + + "d SüüdameerikaNördlichs AmeerikaKaribikOschtaasieSüüdaasieSüüdoschta" + + "asieSüüdeuropaAuschtraalie und NöiseelandMelaneesieMikroneesischs In" + + "selgebietPolineesieAasieZentraalaasieWeschtaasieEuroopaOschteuroopaN" + + "ordeuroopaWeschteuroopaLatiinameerika", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x0024, 0x0030, 0x0043, 0x004b, 0x0053, + 0x005b, 0x0072, 0x0079, 0x0082, 0x008d, 0x00a0, 0x00ad, 0x00b9, + 0x00be, 0x00ca, 0x00d8, 0x00ee, 0x00f6, 0x0101, 0x0107, 0x0114, + 0x011d, 0x0126, 0x012d, 0x0132, 0x0140, 0x0148, 0x015a, 0x0162, + 0x0162, 0x016a, 0x0172, 0x0178, 0x0184, 0x018c, 0x0199, 0x019f, + 0x01a5, 0x01b0, 0x01cd, 0x01eb, 0x01f0, 0x01f7, 0x0207, 0x0211, + 0x0218, 0x021f, 0x0225, 0x022d, 0x022d, 0x0239, 0x023d, 0x0246, + 0x0246, 0x0255, 0x025b, 0x0270, 0x027d, 0x027d, 0x0287, 0x0290, + // Entry 40 - 7F + 0x0298, 0x02b0, 0x02b8, 0x02b8, 0x02bf, 0x02c7, 0x02cf, 0x02db, + 0x02e4, 0x02ec, 0x02f5, 0x030a, 0x0312, 0x0319, 0x0327, 0x0332, + 0x033a, 0x0344, 0x0349, 0x0361, 0x0368, 0x0370, 0x0386, 0x038f, + 0x0394, 0x039d, 0x03a8, 0x03ae, 0x03b4, 0x03bd, 0x03cf, 0x03da, + 0x040d, 0x0417, 0x041b, 0x0428, 0x0431, 0x044e, 0x046b, 0x0473, + 0x047b, 0x0480, 0x0486, 0x0486, 0x0490, 0x0496, 0x049c, 0x04a9, + 0x04ae, 0x04d7, 0x04dc, 0x04e1, 0x04e8, 0x04ef, 0x04f8, 0x0503, + 0x050c, 0x0511, 0x0517, 0x0525, 0x052f, 0x0538, 0x053f, 0x0553, + // Entry 80 - BF + 0x0576, 0x0585, 0x058c, 0x059a, 0x05a6, 0x05ab, 0x05b2, 0x05bf, + 0x05ce, 0x05d9, 0x05e1, 0x05e8, 0x05ef, 0x05f8, 0x0600, 0x0608, + 0x060f, 0x0615, 0x0624, 0x062f, 0x0639, 0x0645, 0x0652, 0x065c, + 0x0661, 0x0670, 0x0678, 0x0692, 0x06a5, 0x06ae, 0x06b9, 0x06c3, + 0x06c8, 0x06d2, 0x06db, 0x06e2, 0x06e8, 0x06f1, 0x06f9, 0x0701, + 0x070f, 0x0714, 0x0721, 0x0729, 0x0733, 0x073a, 0x0742, 0x0748, + 0x074d, 0x0751, 0x075c, 0x0761, 0x0767, 0x076b, 0x0782, 0x0791, + 0x079c, 0x07a6, 0x07ab, 0x07c0, 0x07cb, 0x07d7, 0x07f2, 0x07fa, + // Entry C0 - FF + 0x07ff, 0x0807, 0x080d, 0x081d, 0x0826, 0x0830, 0x0837, 0x083f, + 0x0845, 0x0852, 0x085b, 0x0866, 0x086b, 0x0873, 0x087c, 0x0886, + 0x088f, 0x08a8, 0x08b1, 0x08be, 0x08c9, 0x08d0, 0x08d8, 0x08df, + 0x08df, 0x08f5, 0x0900, 0x0900, 0x0908, 0x0911, 0x0911, 0x092a, + 0x0930, 0x0959, 0x095e, 0x0966, 0x0975, 0x097c, 0x0986, 0x0995, + 0x099d, 0x09a2, 0x09aa, 0x09be, 0x09c4, 0x09ca, 0x09d3, 0x09db, + 0x09e1, 0x09f6, 0x0a0a, 0x0a11, 0x0a20, 0x0a2c, 0x0a4b, 0x0a55, + 0x0a6d, 0x0a8a, 0x0a91, 0x0a98, 0x0aaa, 0x0ab0, 0x0ab0, 0x0ab5, + // Entry 100 - 13F + 0x0abb, 0x0ac7, 0x0acd, 0x0ad5, 0x0af7, 0x0afc, 0x0b02, 0x0b0e, + 0x0b1c, 0x0b24, 0x0b30, 0x0b3e, 0x0b49, 0x0b53, 0x0b61, 0x0b73, + 0x0b94, 0x0ba7, 0x0bae, 0x0bb8, 0x0bc3, 0x0bd3, 0x0bdf, 0x0bfb, + 0x0c05, 0x0c1f, 0x0c29, 0x0c2e, 0x0c3b, 0x0c46, 0x0c4d, 0x0c59, + 0x0c64, 0x0c71, 0x0c7f, + }, + }, + { // gu + guRegionStr, + guRegionIdx, + }, + { // guz + "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + + "iaAntili za UholanziAngolaAjentinaSamoa ya MarekaniAustriaAustraliaA" + + "rubaAzabajaniBosnia na HezegovinaBabadosiBangladeshiUbelgijiBukinafa" + + "soBulgariaBahareniBurundiBeniniBermudaBruneiBoliviaBraziliBahamaButa" + + "niBotswanaBelarusiBelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhur" + + "i ya Afrika ya KatiKongoUswisiKodivaaVisiwa vya CookChileKameruniChi" + + "naKolombiaKostarikaKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibut" + + "iDenmakiDominikaJamhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaH" + + "ispaniaUhabeshiUfiniFijiVisiwa vya FalklandMikronesiaUfaransaGaboniU" + + "ingerezaGrenadaJojiaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaG" + + "ineGwadelupeGinekwetaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKor" + + "asiaHaitiHungariaIndonesiaAyalandiIsraeliIndiaEneo la Uingereza kati" + + "ka Bahari HindiIrakiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKir" + + "igizistaniKambodiaKiribatiKomoroSantakitzi na NevisKorea KaskaziniKo" + + "rea KusiniKuwaitiVisiwa vya KaymanKazakistaniLaosiLebanoniSantalusia" + + "LishenteniSirilankaLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoM" + + "onakoMoldovaBukiniVisiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa" + + " vya Mariana vya KaskaziniMartinikiMoritaniaMontserratiMaltaMorisiMo" + + "divuMalawiMeksikoMalesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha " + + "NorfokNijeriaNikaragwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPan" + + "amaPeruPolinesia ya UfaransaPapuaFilipinoPakistaniPolandiSantapieri " + + "na MikeloniPitkairniPwetorikoUkingo wa Magharibi na Ukanda wa Gaza w" + + "a PalestinaUrenoPalauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiV" + + "isiwa vya SolomonShelisheliSudaniUswidiSingapooSantahelenaSloveniaSl" + + "ovakiaSiera LeoniSamarinoSenegaliSomaliaSurinamuSao Tome na Principe" + + "ElsavadoSiriaUswaziVisiwa vya Turki na KaikoChadiTogoTailandiTajikis" + + "taniTokelauTimori ya MasharikiTurukimenistaniTunisiaTongaUturukiTrin" + + "idad na TobagoTuvaluTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibe" + + "kistaniVatikaniSantavisenti na GrenadiniVenezuelaVisiwa vya Virgin v" + + "ya UingerezaVisiwa vya Virgin vya MarekaniVietinamuVanuatuWalis na F" + + "utunaSamoaYemeniMayotteAfrika KusiniZambiaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, + 0x004a, 0x005c, 0x0062, 0x0062, 0x006a, 0x007b, 0x0082, 0x008b, + 0x0090, 0x0090, 0x0099, 0x00ad, 0x00b5, 0x00c0, 0x00c8, 0x00d2, + 0x00da, 0x00e2, 0x00e9, 0x00ef, 0x00ef, 0x00f6, 0x00fc, 0x0103, + 0x0103, 0x010a, 0x0110, 0x0116, 0x0116, 0x011e, 0x0126, 0x012c, + 0x0132, 0x0132, 0x0152, 0x016b, 0x0170, 0x0176, 0x017d, 0x018c, + 0x0191, 0x0199, 0x019e, 0x01a6, 0x01a6, 0x01af, 0x01b3, 0x01bb, + 0x01bb, 0x01bb, 0x01c2, 0x01d2, 0x01db, 0x01db, 0x01e1, 0x01e8, + // Entry 40 - 7F + 0x01f0, 0x0203, 0x020a, 0x020a, 0x0210, 0x0217, 0x021c, 0x021c, + 0x0223, 0x022b, 0x0233, 0x0233, 0x0238, 0x023c, 0x024f, 0x0259, + 0x0259, 0x0261, 0x0267, 0x0270, 0x0277, 0x027c, 0x028f, 0x028f, + 0x0294, 0x029c, 0x02a5, 0x02ab, 0x02af, 0x02b8, 0x02c1, 0x02c8, + 0x02c8, 0x02d1, 0x02d5, 0x02de, 0x02e4, 0x02e4, 0x02e4, 0x02ed, + 0x02f4, 0x02f9, 0x0301, 0x0301, 0x030a, 0x0312, 0x0319, 0x0319, + 0x031e, 0x0343, 0x0348, 0x034e, 0x0356, 0x035c, 0x035c, 0x0363, + 0x036a, 0x0370, 0x0375, 0x0382, 0x038a, 0x0392, 0x0398, 0x03ab, + // Entry 80 - BF + 0x03ba, 0x03c6, 0x03cd, 0x03de, 0x03e9, 0x03ee, 0x03f6, 0x0400, + 0x040a, 0x0413, 0x041a, 0x0420, 0x0428, 0x0431, 0x0438, 0x043d, + 0x0443, 0x0449, 0x0450, 0x0450, 0x0450, 0x0456, 0x0468, 0x0471, + 0x0475, 0x047a, 0x0482, 0x0482, 0x04a2, 0x04ab, 0x04b4, 0x04bf, + 0x04c4, 0x04ca, 0x04d0, 0x04d6, 0x04dd, 0x04e4, 0x04ec, 0x04f3, + 0x04ff, 0x0505, 0x0516, 0x051d, 0x0526, 0x052e, 0x0533, 0x0539, + 0x053e, 0x0542, 0x054c, 0x0551, 0x0557, 0x055b, 0x0570, 0x0575, + 0x057d, 0x0586, 0x058d, 0x05a3, 0x05ac, 0x05b5, 0x05e7, 0x05ec, + // Entry C0 - FF + 0x05f1, 0x05f9, 0x05ff, 0x05ff, 0x0608, 0x060f, 0x060f, 0x0614, + 0x061a, 0x061f, 0x0631, 0x063b, 0x0641, 0x0647, 0x064f, 0x065a, + 0x0662, 0x0662, 0x066a, 0x0675, 0x067d, 0x0685, 0x068c, 0x0694, + 0x0694, 0x06a8, 0x06b0, 0x06b0, 0x06b5, 0x06bb, 0x06bb, 0x06d4, + 0x06d9, 0x06d9, 0x06dd, 0x06e5, 0x06f0, 0x06f7, 0x070a, 0x0719, + 0x0720, 0x0725, 0x072c, 0x073e, 0x0744, 0x074b, 0x0753, 0x075a, + 0x0760, 0x0760, 0x0768, 0x076f, 0x077b, 0x0783, 0x079c, 0x07a5, + 0x07c4, 0x07e2, 0x07eb, 0x07f2, 0x0801, 0x0806, 0x0806, 0x080c, + // Entry 100 - 13F + 0x0813, 0x0820, 0x0826, 0x082e, + }, + }, + { // gv + "Rywvaneth UnysEllan Vannin", + []uint16{ // 112 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x001a, + }, + }, + { // ha + "AndoraHaɗaɗɗiyar Daular LarabawaAfaganistanAntigwa da BarbubaAngilaAlban" + + "iyaArmeniyaAntiya Na HolanAngolaArjantiniyaSamowa Ta AmurkaOstiriyaO" + + "stareliyaArubaAzarbaijanBosniya HarzagobinaBarbadasBangiladasBelgiyo" + + "mBurkina FasoBulgariyaBaharanBurundiBininBarmudaBuruneBolibiyaBirazi" + + "lBahamasButanBaswanaBelarusBelizKanadaJamhuriyar Dimokuraɗiyyar Kong" + + "oJamhuriyar Afirka Ta TsakiyaKongoSuwizalanAibari KwasTsibiran KukuC" + + "ayileKamaruCaina, SinKolambiyaKwasta RikaKyubaTsibiran Kap BardeSifu" + + "rusJamhuriyar CakJamusJibutiDanmarkDominikaJamhuriyar DominikaAljeri" + + "yaEkwadorEstoniyaMasar, MisiraEritireyaSipenHabashaFinlanFijiTsibira" + + "n FalkilanMikuronesiyaFaransaGabonBirtaniyaGirnadaJiwarjiyaGini Ta F" + + "aransaGanaJibaraltarGrinlanGambiyaGiniGwadalufGini Ta IkwaitaGirkaGw" + + "atamalaGwamGini BisauGuyanaHondurasKurowaishiyaHaitiHungariIndunusiy" + + "aAyalanIziraʼilaIndiyaYankin Birtaniya Na Tekun IndiyaIraƙiIranAisal" + + "anItaliyaJamaikaJordanJapanKenyaKirgizistanKambodiyaKiribatiKwamoras" + + "San Kiti Da NebisKoreya Ta ArewaKoreya Ta KuduKwiyatTsibiran KaimanK" + + "azakistanLawasLabananSan LusiyaLicansitanSiri LankaLaberiyaLesotoLit" + + "uweniyaLukusamburlatibiyaLibiyaMarokoMonakoMaldobaMadagaskarTsibiran" + + " MarshalMasedoniyaMaliBurma, MiyamarMangoliyaTsibiran Mariyana Na Ar" + + "ewaMartinikMoritaniyaManseratiMaltaMoritusMaldibiMalawiMakasikoMalai" + + "siyaMozambikNamibiyaKaledoniya SabuwaNijarTsibirin NarfalkNajeriyaNi" + + "karaguwaHolanNorweNefalNauruNiyuNuzilanOmanPanamaPeruFolinesiya Ta F" + + "aransaPapuwa NuginiFilipinPakistanPolanSan Piyar Da MikelanPitakarin" + + "Porto RikoPalasɗinuPortugalPalauParagaiKwatarRawuniyanRomaniyaRashaR" + + "uwandaƘasar MakkaTsibiran SalamanSaishalSudanSuwedanSingapurSan Hele" + + "naSulobeniyaSulobakiyaSalewoSan MarinoSinigalSomaliyaSurinameSawo To" + + "me Da ParansipEl SalbadorSham, SiriyaSuwazilanTurkis Da Tsibiran Kai" + + "kwasCadiTogoTailanTajikistanTakelauTimor Ta GabasTurkumenistanTunisi" + + "yaTangaTurkiyyaTirinidad Da TobagoTubaluTaiwanTanzaniyaYukaranYugand" + + "aAmurkaYurugaiUzubekistanBatikanSan Binsan Da GirnadinBenezuwelaTsib" + + "irin Birjin Na BirtaniyaTsibiran Birjin Ta AmurkaBiyetinamBanuwatuWa" + + "lis Da FutunaSamowaYamalMayotiAfirka Ta KuduZambiyaZimbabuwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0023, 0x002e, 0x0040, 0x0046, 0x004e, + 0x0056, 0x0065, 0x006b, 0x006b, 0x0076, 0x0086, 0x008e, 0x0098, + 0x009d, 0x009d, 0x00a7, 0x00ba, 0x00c2, 0x00cc, 0x00d4, 0x00e0, + 0x00e9, 0x00f0, 0x00f7, 0x00fc, 0x00fc, 0x0103, 0x0109, 0x0111, + 0x0111, 0x0118, 0x011f, 0x0124, 0x0124, 0x012b, 0x0132, 0x0137, + 0x013d, 0x013d, 0x015d, 0x0179, 0x017e, 0x0187, 0x0192, 0x019f, + 0x01a5, 0x01ab, 0x01b5, 0x01be, 0x01be, 0x01c9, 0x01ce, 0x01e0, + 0x01e0, 0x01e0, 0x01e7, 0x01f5, 0x01fa, 0x01fa, 0x0200, 0x0207, + // Entry 40 - 7F + 0x020f, 0x0222, 0x022a, 0x022a, 0x0231, 0x0239, 0x0246, 0x0246, + 0x024f, 0x0254, 0x025b, 0x025b, 0x0261, 0x0265, 0x0276, 0x0282, + 0x0282, 0x0289, 0x028e, 0x0297, 0x029e, 0x02a7, 0x02b6, 0x02b6, + 0x02ba, 0x02c4, 0x02cb, 0x02d2, 0x02d6, 0x02de, 0x02ed, 0x02f2, + 0x02f2, 0x02fb, 0x02ff, 0x0309, 0x030f, 0x030f, 0x030f, 0x0317, + 0x0323, 0x0328, 0x032f, 0x032f, 0x0339, 0x033f, 0x0349, 0x0349, + 0x034f, 0x036f, 0x0375, 0x0379, 0x0380, 0x0387, 0x0387, 0x038e, + 0x0394, 0x0399, 0x039e, 0x03a9, 0x03b2, 0x03ba, 0x03c2, 0x03d3, + // Entry 80 - BF + 0x03e2, 0x03f0, 0x03f6, 0x0405, 0x040f, 0x0414, 0x041b, 0x0425, + 0x042f, 0x0439, 0x0441, 0x0447, 0x0451, 0x045b, 0x0463, 0x0469, + 0x046f, 0x0475, 0x047c, 0x047c, 0x047c, 0x0486, 0x0496, 0x04a0, + 0x04a4, 0x04b2, 0x04bb, 0x04bb, 0x04d5, 0x04dd, 0x04e7, 0x04f0, + 0x04f5, 0x04fc, 0x0503, 0x0509, 0x0511, 0x051a, 0x0522, 0x052a, + 0x053b, 0x0540, 0x0550, 0x0558, 0x0562, 0x0567, 0x056c, 0x0571, + 0x0576, 0x057a, 0x0581, 0x0585, 0x058b, 0x058f, 0x05a4, 0x05b1, + 0x05b8, 0x05c0, 0x05c5, 0x05d9, 0x05e2, 0x05ec, 0x05f6, 0x05fe, + // Entry C0 - FF + 0x0603, 0x060a, 0x0610, 0x0610, 0x0619, 0x0621, 0x0621, 0x0626, + 0x062d, 0x0639, 0x0649, 0x0650, 0x0655, 0x065c, 0x0664, 0x066e, + 0x0678, 0x0678, 0x0682, 0x0688, 0x0692, 0x0699, 0x06a1, 0x06a9, + 0x06a9, 0x06be, 0x06c9, 0x06c9, 0x06d5, 0x06de, 0x06de, 0x06f8, + 0x06fc, 0x06fc, 0x0700, 0x0706, 0x0710, 0x0717, 0x0725, 0x0732, + 0x073a, 0x073f, 0x0747, 0x075a, 0x0760, 0x0766, 0x076f, 0x0776, + 0x077d, 0x077d, 0x0783, 0x078a, 0x0795, 0x079c, 0x07b2, 0x07bc, + 0x07d8, 0x07f1, 0x07fa, 0x0802, 0x0811, 0x0817, 0x0817, 0x081c, + // Entry 100 - 13F + 0x0822, 0x0830, 0x0837, 0x0840, + }, + }, + { // haw + "NūhōlaniKanakāKinaKelemāniaKenemakaKepaniaPalaniAupuni Mōʻī Hui Pū ʻIaHe" + + "leneʻIlelaniʻIseraʻelaʻĪniaʻĪkāliaIāpanaMekikoHōlaniAotearoaʻĀina Pi" + + "lipinoLūkiaʻAmelika Hui Pū ʻIa", + []uint16{ // 243 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0015, 0x001f, 0x001f, 0x001f, 0x0027, + // Entry 40 - 7F + 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, 0x0027, + 0x0027, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, 0x002e, + 0x002e, 0x0034, 0x0034, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, + 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x004f, 0x0055, + 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, + 0x0055, 0x0055, 0x0055, 0x0055, 0x0055, 0x005e, 0x006a, 0x006a, + 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x007b, 0x007b, 0x007b, + 0x007b, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, + // Entry 80 - BF + 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, + 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, + 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, + 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, 0x0082, + 0x0082, 0x0082, 0x0082, 0x0082, 0x0088, 0x0088, 0x0088, 0x0088, + 0x0088, 0x0088, 0x0088, 0x0088, 0x0088, 0x008f, 0x008f, 0x008f, + 0x008f, 0x008f, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, 0x0097, + 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, + // Entry C0 - FF + 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00a7, 0x00ad, + 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, + 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, + 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, + 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, + 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, 0x00ad, + 0x00ad, 0x00ad, 0x00c3, + }, + }, + { // he + heRegionStr, + heRegionIdx, + }, + { // hi + hiRegionStr, + hiRegionIdx, + }, + { // hr + hrRegionStr, + hrRegionIdx, + }, + { // hsb + "AscensionAndorraZjednoćene arabske emiratyAfghanistanAntigua a BarbudaAn" + + "guillaAlbanskaArmenskaAngolaAntarktikaArgentinskaAmeriska SamoaAwstr" + + "iskaAwstralskaArubaÅlandAzerbajdźanBosniska a HercegowinaBarbadosBan" + + "gladešBelgiskaBurkina FasoBołharskaBahrainBurundiBeninSt. Barthélemy" + + "BermudyBruneiBoliwiskaKaribiska NižozemskaBrazilskaBahamyBhutanBouve" + + "towa kupaBotswanaBěłoruskaBelizeKanadaKokosowe kupyKongo-KinshasaCen" + + "tralnoafriska republikaKongo-BrazzavilleŠwicarskaCôte d’IvoireCookow" + + "e kupyChilskaKamerunChinaKolumbiskaClippertonowa kupaKosta RikaKubaK" + + "ap VerdeCuraçaoHodowna kupaCypernČěska republikaNěmskaDiego GarciaDź" + + "ibutiDanskaDominikaDominikanska republikaAlgeriskaCeuta a MelillaEkw" + + "adorEstiskaEgyptowskaZapadna SaharaEritrejaŠpaniskaEtiopiskaEuropska" + + " unijaFinskaFidźiFalklandske kupyMikroneziskaFäröske kupyFrancoskaGa" + + "bunZjednoćene kralestwoGrenadaGeorgiskaFrancoska GuyanaGuernseyGhana" + + "GibraltarGrönlandskaGambijaGinejaGuadeloupeEkwatorialna GinejaGrjeks" + + "kaJužna Georgiska a Južne Sandwichowe kupyGuatemalaGuamGineja-Bissau" + + "GuyanaWosebita zarjadniska cona HongkongHeardowa kupa a McDonaldowe " + + "kupyHondurasChorwatskaHaitiMadźarskaKanariske kupyIndoneskaIrskaIsra" + + "elManIndiskaBritiski teritorij w Indiskim oceanjeIrakIranIslandskaIt" + + "alskaJerseyJamaikaJordaniskaJapanskaKenijaKirgizistanKambodźaKiribat" + + "iKomorySt. Kitts a NevisSewjerna KorejaJužna KorejaKuwaitKajmanske k" + + "upyKazachstanLaosLibanonSt. LuciaLiechtensteinSri LankaLiberijaLesot" + + "hoLitawskaLuxemburgskaLetiskaLibyskaMarokkoMonacoMoldawskaMontenegro" + + "St. MartinMadagaskarMarshallowe kupyMakedonskaMaliMyanmarMongolskaWo" + + "sebita zarjadniska cona MacaoSewjerne MarianyMartiniqueMawretanskaMo" + + "ntserratMaltaMauritiusMalediwyMalawiMexikoMalajzijaMosambikNamibijaN" + + "owa KaledoniskaNigerNorfolkowa kupaNigerijaNikaraguaNižozemskaNorweg" + + "skaNepalNauruNiueNowoseelandskaOmanPanamaPeruFrancoska PolyneziskaPa" + + "puwa-Nowa GinejaFilipinyPakistanPólskaSt. Pierre a MiquelonPitcairno" + + "we kupyPuerto RicoPalestinski awtonomny teritorijPortugalskaPalauPar" + + "aguayKatarWonkowna OceaniskaRéunionRumunskaSerbiskaRuskaRuandaSawdi-" + + "ArabskaSalomonySeychelleSudanŠwedskaSingapurSt. HelenaSłowjenskaSval" + + "bard a Jan MayenSłowakskaSierra LeoneSan MarinoSenegalSomalijaSurina" + + "mJužny SudanSão Tomé a PríncipeEl SalvadorSint MaartenSyriskaSwazisk" + + "aTristan da Cunhakupy Turks a CaicosČadFrancoski južny a antarktiski" + + " teritorijTogoThailandskaTadźikistanTokelauTimor-LesteTurkmeniskaTun" + + "eziskaTongaTurkowskaTrinidad a TobagoTuvaluTaiwanTansanijaUkrainaUga" + + "ndaAmeriska OceaniskaZjednoćene staty AmerikiUruguayUzbekistanVatika" + + "nske městoSt. Vincent a GrenadinyVenezuelaBritiske knježniske kupyAm" + + "eriske knježniske kupyVietnamVanuatuWallis a FutunaSamoaKosowoJemenM" + + "ayotteJužna Afrika (Republika)SambijaSimbabwenjeznaty regionswětAfri" + + "kaSewjerna AmerikaJužna AmerikaOceaniskazapadna AfrikaSrjedźna Ameri" + + "kawuchodna Afrikasewjerna Afrikasrjedźna Afrikajužna AfrikaAmerikase" + + "wjerny ameriski kontinentKaribikawuchodna Azijajužna Azijajuhowuchod" + + "na Azijajužna EuropaAwstralazijaMelaneziskaMikroneziska (kupowy regi" + + "on)PolyneziskaAzijacentralna Azijazapadna AzijaEuropawuchodna Europa" + + "sewjerna Europazapadna EuropaŁaćonska Amerika", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0009, 0x0010, 0x002b, 0x0036, 0x0047, 0x004f, 0x0057, + 0x005f, 0x005f, 0x0065, 0x006f, 0x007a, 0x0088, 0x0091, 0x009b, + 0x00a0, 0x00a6, 0x00b2, 0x00c8, 0x00d0, 0x00da, 0x00e2, 0x00ee, + 0x00f8, 0x00ff, 0x0106, 0x010b, 0x011a, 0x0121, 0x0127, 0x0130, + 0x0145, 0x014e, 0x0154, 0x015a, 0x0168, 0x0170, 0x017b, 0x0181, + 0x0187, 0x0194, 0x01a2, 0x01bc, 0x01cd, 0x01d7, 0x01e7, 0x01f3, + 0x01fa, 0x0201, 0x0206, 0x0210, 0x0222, 0x022c, 0x0230, 0x0239, + 0x0241, 0x024d, 0x0253, 0x0264, 0x026b, 0x0277, 0x027f, 0x0285, + // Entry 40 - 7F + 0x028d, 0x02a3, 0x02ac, 0x02bb, 0x02c2, 0x02c9, 0x02d3, 0x02e1, + 0x02e9, 0x02f2, 0x02fb, 0x0309, 0x030f, 0x0315, 0x0325, 0x0331, + 0x033f, 0x0348, 0x034d, 0x0362, 0x0369, 0x0372, 0x0382, 0x038a, + 0x038f, 0x0398, 0x03a4, 0x03ab, 0x03b1, 0x03bb, 0x03ce, 0x03d6, + 0x0400, 0x0409, 0x040d, 0x041a, 0x0420, 0x0442, 0x0462, 0x046a, + 0x0474, 0x0479, 0x0483, 0x0491, 0x049a, 0x049f, 0x04a5, 0x04a8, + 0x04af, 0x04d4, 0x04d8, 0x04dc, 0x04e5, 0x04ec, 0x04f2, 0x04f9, + 0x0503, 0x050b, 0x0511, 0x051c, 0x0525, 0x052d, 0x0533, 0x0544, + // Entry 80 - BF + 0x0553, 0x0560, 0x0566, 0x0574, 0x057e, 0x0582, 0x0589, 0x0592, + 0x059f, 0x05a8, 0x05b0, 0x05b7, 0x05bf, 0x05cb, 0x05d2, 0x05d9, + 0x05e0, 0x05e6, 0x05ef, 0x05f9, 0x0603, 0x060d, 0x061d, 0x0627, + 0x062b, 0x0632, 0x063b, 0x065a, 0x066a, 0x0674, 0x067f, 0x0689, + 0x068e, 0x0697, 0x069f, 0x06a5, 0x06ab, 0x06b4, 0x06bc, 0x06c4, + 0x06d4, 0x06d9, 0x06e8, 0x06f0, 0x06f9, 0x0704, 0x070d, 0x0712, + 0x0717, 0x071b, 0x0729, 0x072d, 0x0733, 0x0737, 0x074c, 0x075e, + 0x0766, 0x076e, 0x0775, 0x078a, 0x079a, 0x07a5, 0x07c4, 0x07cf, + // Entry C0 - FF + 0x07d4, 0x07dc, 0x07e1, 0x07f3, 0x07fb, 0x0803, 0x080b, 0x0810, + 0x0816, 0x0823, 0x082b, 0x0834, 0x0839, 0x0841, 0x0849, 0x0853, + 0x085e, 0x0872, 0x087c, 0x0888, 0x0892, 0x0899, 0x08a1, 0x08a8, + 0x08b4, 0x08ca, 0x08d5, 0x08e1, 0x08e8, 0x08f0, 0x0900, 0x0913, + 0x0917, 0x093f, 0x0943, 0x094e, 0x095a, 0x0961, 0x096c, 0x0977, + 0x0980, 0x0985, 0x098e, 0x099f, 0x09a5, 0x09ab, 0x09b4, 0x09bb, + 0x09c1, 0x09d3, 0x09ec, 0x09f3, 0x09fd, 0x0a0e, 0x0a25, 0x0a2e, + 0x0a47, 0x0a60, 0x0a67, 0x0a6e, 0x0a7d, 0x0a82, 0x0a88, 0x0a8d, + // Entry 100 - 13F + 0x0a94, 0x0aad, 0x0ab4, 0x0abc, 0x0acb, 0x0ad0, 0x0ad6, 0x0ae6, + 0x0af4, 0x0afd, 0x0b0b, 0x0b1c, 0x0b2b, 0x0b3a, 0x0b4a, 0x0b57, + 0x0b5e, 0x0b79, 0x0b81, 0x0b8f, 0x0b9b, 0x0bad, 0x0bba, 0x0bc6, + 0x0bd1, 0x0bed, 0x0bf8, 0x0bfd, 0x0c0c, 0x0c19, 0x0c1f, 0x0c2e, + 0x0c3d, 0x0c4b, 0x0c5d, + }, + }, + { // hu + huRegionStr, + huRegionIdx, + }, + { // hy + hyRegionStr, + hyRegionIdx, + }, + { // id + idRegionStr, + idRegionIdx, + }, + { // ig + "BininBemudaChainaHatiComorosuLibyiaMaldivesaNigeria", + []uint16{ // 172 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0005, 0x0005, 0x000b, 0x000b, 0x000b, + 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, + 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, + 0x000b, 0x000b, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + // Entry 40 - 7F + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, 0x0011, + 0x0011, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x001d, 0x001d, + // Entry 80 - BF + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0023, + 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, + 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, 0x0023, + 0x0023, 0x0023, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, + 0x002c, 0x002c, 0x002c, 0x0033, + }, + }, + { // ii + "ꀠꑭꍏꇩꄓꇩꃔꇩꑱꇩꑴꄗꑴꄊꆺꏝꀪꊉꇆꌦꂰꇩꃅꄷꅉꀋꐚꌠ", + []uint16{ // 261 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x0012, 0x0012, 0x0012, 0x0012, + // Entry 40 - 7F + 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, + 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, + 0x0012, 0x0018, 0x0018, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, + 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, + 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, + 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, + 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x002d, 0x002d, 0x002d, + 0x002d, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, + // Entry 80 - BF + 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, + 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, + 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, + 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, + 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, + 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, + 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, + 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, + // Entry C0 - FF + 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x0033, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, 0x003c, + 0x003c, 0x003c, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, + 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, 0x0042, + // Entry 100 - 13F + 0x0042, 0x0042, 0x0042, 0x0042, 0x0054, + }, + }, + { // is + isRegionStr, + isRegionIdx, + }, + { // it + itRegionStr, + itRegionIdx, + }, + { // ja + jaRegionStr, + jaRegionIdx, + }, + { // jgo + "Aŋgɔ́laAjɛntînMbulukína FásɔMbulundíMbɛnɛ̂ŋMbɔlivîMbɛlazîlMbɔtswánaKanad" + + "âKɔ́ŋgɔ-KinshásaKɔ́ŋgɔ-MbɛlazavîlSẅísɛKɔ́t NdivwâCíllɛKamɛlûnShînKɔ" + + "llɔmbîKúbaNjámanNjimbútiAljɛlîƐkwandɔ̂ƐjíptɛƐlitɛlɛ́yaƐspániyaƐtiyɔp" + + "îFɛlánciŊgabɔ̂ŋŊgánaŊgambîŊginɛ̂Ŋginɛ̂ ƐkwatɔliyâlŊgɛlɛ̂kŊginɛ̂ Mbi" + + "sáwuIslayɛ̂lÁndɛIlâkItalîJapɔ̂nKɛ́nyaKɔmɔ́lɔshiLibɛrîLɛsɔ́tɔLibîMɔlɔ" + + "̂kMándaŋgasɛkâMalîMɔlitanîMaláwiMɛksîkMɔzambîkNamimbîNijɛ̂Ninjɛliyâ" + + "Nɔlɛvɛ́jɛPɛlûLɛ́uniyɔ̂nSɛlɛbîLusîLuwándaPɛsɛ́shɛlSundânSiyɛ́la Lɛɔ̂n" + + "SɛnɛgâlSɔmalîSáwɔŋ Tɔmɛ́ nɛ́ PɛlínsipɛSwazilânCâtTɔ́ŋgɔTunizîTanzanî" + + "UŋgándaVɛnɛzwɛ́laMayɔ̂tZambîZimbámbwɛŋgɔŋ yi pɛ́ ká kɛ́ jʉɔMbíAfɛlîk" + + "AmɛlîkAzîɄlôp", + []uint16{ // 287 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x000a, 0x000a, 0x0013, 0x0013, 0x0013, 0x0013, + 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0013, 0x0024, + 0x0024, 0x0024, 0x002d, 0x0038, 0x0038, 0x0038, 0x0038, 0x0041, + 0x0041, 0x004b, 0x004b, 0x004b, 0x004b, 0x0056, 0x0056, 0x0056, + 0x005d, 0x005d, 0x0071, 0x0071, 0x0088, 0x0091, 0x009f, 0x009f, + 0x00a6, 0x00af, 0x00b4, 0x00bf, 0x00bf, 0x00bf, 0x00c4, 0x00c4, + 0x00c4, 0x00c4, 0x00c4, 0x00c4, 0x00cb, 0x00cb, 0x00d4, 0x00d4, + // Entry 40 - 7F + 0x00d4, 0x00d4, 0x00dc, 0x00dc, 0x00e7, 0x00e7, 0x00f0, 0x00f0, + 0x00fe, 0x0108, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, 0x0112, + 0x0112, 0x011b, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, 0x0126, + 0x012d, 0x012d, 0x012d, 0x0135, 0x013e, 0x013e, 0x0156, 0x0161, + 0x0161, 0x0161, 0x0161, 0x0173, 0x0173, 0x0173, 0x0173, 0x0173, + 0x0173, 0x0173, 0x0173, 0x0173, 0x0173, 0x0173, 0x017d, 0x017d, + 0x0183, 0x0183, 0x0188, 0x0188, 0x0188, 0x018e, 0x018e, 0x018e, + 0x018e, 0x0196, 0x019e, 0x019e, 0x019e, 0x019e, 0x01ac, 0x01ac, + // Entry 80 - BF + 0x01ac, 0x01ac, 0x01ac, 0x01ac, 0x01ac, 0x01ac, 0x01ac, 0x01ac, + 0x01ac, 0x01ac, 0x01b4, 0x01bf, 0x01bf, 0x01bf, 0x01bf, 0x01c4, + 0x01cd, 0x01cd, 0x01cd, 0x01cd, 0x01cd, 0x01dd, 0x01dd, 0x01dd, + 0x01e2, 0x01e2, 0x01e2, 0x01e2, 0x01e2, 0x01e2, 0x01ec, 0x01ec, + 0x01ec, 0x01ec, 0x01ec, 0x01f3, 0x01fb, 0x01fb, 0x0205, 0x020d, + 0x020d, 0x0214, 0x0214, 0x021f, 0x021f, 0x021f, 0x022d, 0x022d, + 0x022d, 0x022d, 0x022d, 0x022d, 0x022d, 0x0233, 0x0233, 0x0233, + 0x0233, 0x0233, 0x0233, 0x0233, 0x0233, 0x0233, 0x0233, 0x0233, + // Entry C0 - FF + 0x0233, 0x0233, 0x0233, 0x0233, 0x0241, 0x0241, 0x024a, 0x024f, + 0x0257, 0x0257, 0x0257, 0x0264, 0x026b, 0x026b, 0x026b, 0x026b, + 0x026b, 0x026b, 0x026b, 0x027d, 0x027d, 0x0287, 0x028f, 0x028f, + 0x028f, 0x02b3, 0x02b3, 0x02b3, 0x02b3, 0x02bc, 0x02bc, 0x02bc, + 0x02c0, 0x02c0, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, 0x02ca, + 0x02d1, 0x02d1, 0x02d1, 0x02d1, 0x02d1, 0x02d1, 0x02d9, 0x02d9, + 0x02e2, 0x02e2, 0x02e2, 0x02e2, 0x02e2, 0x02e2, 0x02e2, 0x02f0, + 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, 0x02f0, + // Entry 100 - 13F + 0x02f8, 0x02f8, 0x02fe, 0x0309, 0x0329, 0x032d, 0x0335, 0x0335, + 0x0335, 0x0335, 0x0335, 0x0335, 0x0335, 0x0335, 0x0335, 0x0335, + 0x033d, 0x033d, 0x033d, 0x033d, 0x033d, 0x033d, 0x033d, 0x033d, + 0x033d, 0x033d, 0x033d, 0x0341, 0x0341, 0x0341, 0x0347, + }, + }, + { // jmc + "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + + "iaAntili za UholanziAngolaAjentinaSamoa ya MarekaniAustriaAustraliaA" + + "rubaAzabajaniBosnia na HezegovinaBabadosiBangladeshiUbelgijiBukinafa" + + "soBulgariaBahareniBurundiBeniniBermudaBruneiBoliviaBraziliBahamaButa" + + "niBotswanaBelarusiBelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhur" + + "i ya Afrika ya KatiKongoUswisiKodivaaVisiwa vya CookChileKameruniChi" + + "naKolombiaKostarikaKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibut" + + "iDenmakiDominikaJamhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaH" + + "ispaniaUhabeshiUfiniFijiVisiwa vya FalklandMikronesiaUfaransaGaboniU" + + "ingerezaGrenadaJojiaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaG" + + "ineGwadelupeGinekwetaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKor" + + "asiaHaitiHungariaIndonesiaAyalandiIsraeliIndiaEneo la Uingereza kati" + + "ka Bahari HindiIrakiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKir" + + "igizistaniKambodiaKiribatiKomoroSantakitzi na NevisKorea KaskaziniKo" + + "rea KusiniKuwaitiVisiwa vya KaymanKazakistaniLaosiLebanoniSantalusia" + + "LishenteniSirilankaLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoM" + + "onakoMoldovaBukiniVisiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa" + + " vya Mariana vya KaskaziniMartinikiMoritaniaMontserratiMaltaMorisiMo" + + "divuMalawiMeksikoMalesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha " + + "NorfokNijeriaNikaragwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPan" + + "amaPeruPolinesia ya UfaransaPapuaFilipinoPakistaniPolandiSantapieri " + + "na MikeloniPitkairniPwetorikoUkingo wa Magharibi na Ukanda wa Gaza w" + + "a PalestinaUrenoPalauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiV" + + "isiwa vya SolomonShelisheliSudaniUswidiSingapooSantahelenaSloveniaSl" + + "ovakiaSiera LeoniSamarinoSenegaliSomaliaSurinamuSao Tome na Principe" + + "ElsavadoSiriaUswaziVisiwa vya Turki na KaikoChadiTogoTailandiTajikis" + + "taniTokelauTimori ya MasharikiTurukimenistaniTunisiaTongaUturukiTrin" + + "idad na TobagoTuvaluTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibe" + + "kistaniVatikaniSantavisenti na GrenadiniVenezuelaVisiwa vya Virgin v" + + "ya UingerezaVisiwa vya Virgin vya MarekaniVietinamuVanuatuWalis na F" + + "utunaSamoaYemeniMayotteAfrika KusiniZambiaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, + 0x004a, 0x005c, 0x0062, 0x0062, 0x006a, 0x007b, 0x0082, 0x008b, + 0x0090, 0x0090, 0x0099, 0x00ad, 0x00b5, 0x00c0, 0x00c8, 0x00d2, + 0x00da, 0x00e2, 0x00e9, 0x00ef, 0x00ef, 0x00f6, 0x00fc, 0x0103, + 0x0103, 0x010a, 0x0110, 0x0116, 0x0116, 0x011e, 0x0126, 0x012c, + 0x0132, 0x0132, 0x0152, 0x016b, 0x0170, 0x0176, 0x017d, 0x018c, + 0x0191, 0x0199, 0x019e, 0x01a6, 0x01a6, 0x01af, 0x01b3, 0x01bb, + 0x01bb, 0x01bb, 0x01c2, 0x01d2, 0x01db, 0x01db, 0x01e1, 0x01e8, + // Entry 40 - 7F + 0x01f0, 0x0203, 0x020a, 0x020a, 0x0210, 0x0217, 0x021c, 0x021c, + 0x0223, 0x022b, 0x0233, 0x0233, 0x0238, 0x023c, 0x024f, 0x0259, + 0x0259, 0x0261, 0x0267, 0x0270, 0x0277, 0x027c, 0x028f, 0x028f, + 0x0294, 0x029c, 0x02a5, 0x02ab, 0x02af, 0x02b8, 0x02c1, 0x02c8, + 0x02c8, 0x02d1, 0x02d5, 0x02de, 0x02e4, 0x02e4, 0x02e4, 0x02ed, + 0x02f4, 0x02f9, 0x0301, 0x0301, 0x030a, 0x0312, 0x0319, 0x0319, + 0x031e, 0x0343, 0x0348, 0x034e, 0x0356, 0x035c, 0x035c, 0x0363, + 0x036a, 0x0370, 0x0375, 0x0382, 0x038a, 0x0392, 0x0398, 0x03ab, + // Entry 80 - BF + 0x03ba, 0x03c6, 0x03cd, 0x03de, 0x03e9, 0x03ee, 0x03f6, 0x0400, + 0x040a, 0x0413, 0x041a, 0x0420, 0x0428, 0x0431, 0x0438, 0x043d, + 0x0443, 0x0449, 0x0450, 0x0450, 0x0450, 0x0456, 0x0468, 0x0471, + 0x0475, 0x047a, 0x0482, 0x0482, 0x04a2, 0x04ab, 0x04b4, 0x04bf, + 0x04c4, 0x04ca, 0x04d0, 0x04d6, 0x04dd, 0x04e4, 0x04ec, 0x04f3, + 0x04ff, 0x0505, 0x0516, 0x051d, 0x0526, 0x052e, 0x0533, 0x0539, + 0x053e, 0x0542, 0x054c, 0x0551, 0x0557, 0x055b, 0x0570, 0x0575, + 0x057d, 0x0586, 0x058d, 0x05a3, 0x05ac, 0x05b5, 0x05e7, 0x05ec, + // Entry C0 - FF + 0x05f1, 0x05f9, 0x05ff, 0x05ff, 0x0608, 0x060f, 0x060f, 0x0614, + 0x061a, 0x061f, 0x0631, 0x063b, 0x0641, 0x0647, 0x064f, 0x065a, + 0x0662, 0x0662, 0x066a, 0x0675, 0x067d, 0x0685, 0x068c, 0x0694, + 0x0694, 0x06a8, 0x06b0, 0x06b0, 0x06b5, 0x06bb, 0x06bb, 0x06d4, + 0x06d9, 0x06d9, 0x06dd, 0x06e5, 0x06f0, 0x06f7, 0x070a, 0x0719, + 0x0720, 0x0725, 0x072c, 0x073e, 0x0744, 0x074b, 0x0753, 0x075a, + 0x0760, 0x0760, 0x0768, 0x076f, 0x077b, 0x0783, 0x079c, 0x07a5, + 0x07c4, 0x07e2, 0x07eb, 0x07f2, 0x0801, 0x0806, 0x0806, 0x080c, + // Entry 100 - 13F + 0x0813, 0x0820, 0x0826, 0x082e, + }, + }, + { // ka + kaRegionStr, + kaRegionIdx, + }, + { // kab + "UnduraTigeldunin Yedduklen TaɛrabinAfɣanistanUntiga d BarbudaUngiyaLalba" + + "niArminyaAntilles n Tmura-YessakesrenUngulaArjuntinSamwa Tamarikanit" + + "UstriyaUstraliArubaAzrabijanBusna d HersekBarbadusBangladacBelǧikBur" + + "kina FasuBulgariBaḥrinBurandiBininBermudaBruneyBuliviBrizilBahamasBh" + + "utanBustwanaBilarusBilizKanadaTigduda Tagdudant n KunguTigduda n Tef" + + "riqt TalemmastKunguSwisKuṭ DivwarTigzirin n KukCiliKamirunLacinKulum" + + "biKusta RikaKubaTigzirin n yixef azegzawCiprČčekLalmanǦibutiDenmarkD" + + "uminikTigduda TaduminikitLezzayerIkwaṭurIstunyaMaṣrIritiriaSpanyaUty" + + "upiFinlundFijiTigzirin n FalklandMikrunizyaFransaGabunTagelda Yedduk" + + "lenGrunadJiyurjiƔana tafransistƔanaJibraltarGrunlandGambyaƔinyaGwada" + + "lupiƔinya TasebgastLagrisGwatimalaGwamƔinya-BisawGuwanaHundurasKerwa" + + "syaHaytiHungriInduniziLirlundIzrayilLhendAkal Aglizi deg Ugaraw Ahen" + + "diLɛiraqIranIslandṬelyanJamyikaLajurdaniJappuKinyaKirigistanCambudya" + + "KiribatiKumurSan Kits d NivisKurya, UfellaKurya, WaddaKuwaytTigzirin" + + " n KamyanKazaxistanLawsLubnanSan LučyaLayctenstanSri LankaLibiryaLiz" + + "uṭuLiṭwanyaLuksamburgLatviaLibyaLmerrukMunakuMuldabiMadaɣecqerTigzir" + + "in n MarcalMasidwanMaliMyanmarMungulyaTigzirin n Maryan UfellaMartin" + + "ikMuriṭanyaMunsiratMalṭMurisMaldibMalawiMeksikMalizyaMuzembiqNamibya" + + "Kalidunya TamaynutNijerTigzirin TinawfukinNijiryaNikaragwaTimura-Yes" + + "sakesrenNurvijNipalNuruNiwiZiland TamaynutƐumanPanamPiruPulunizi taf" + + "ransistƔinya Tamaynut TapaputFilipinPakistanPulundSan Pyar d MiklunP" + + "itkarinPurtu RikuFalisṭin d ƔezzaPurtugalPaluParagwayQaṭarTimlilitRu" + + "maniRrusRuwandaSuɛudiya TaɛrabtTigzirin n SulumunSeycelSudanSwidSing" + + "afurSant IlinaSluvinyaSluvakyaSira LyunSan MarinuSinigalṢumalSurinam" + + "Saw Tumi d PransipSalvadurSuryaSwazilundṬurk d Tegzirin n KaykusČadṬ" + + "uguṬaylandTajikistanṬukluTumur AsamarṬurkmanistanTunesṬungaṬurkṬrind" + + "ad d ṬubaguṬuvaluṬaywanṬanzanyaUkranUɣandaWDMUrugwayUzbaxistanAwanek" + + " n VatikanSan Vansu d GrunadinVenzwilaTigzirin Tiverjiniyin Tigliziy" + + "inW.D. Tigzirin n VirginyaVyeṭnamVanwatuWallis d FutunaSamwaLyamenMa" + + "yuṭTafriqt WaddaZambyaZimbabwi", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0024, 0x002f, 0x003f, 0x0045, 0x004c, + 0x0053, 0x006f, 0x0075, 0x0075, 0x007d, 0x008e, 0x0095, 0x009c, + 0x00a1, 0x00a1, 0x00aa, 0x00b8, 0x00c0, 0x00c9, 0x00d0, 0x00dc, + 0x00e3, 0x00eb, 0x00f2, 0x00f7, 0x00f7, 0x00fe, 0x0104, 0x010a, + 0x010a, 0x0110, 0x0117, 0x011d, 0x011d, 0x0125, 0x012c, 0x0131, + 0x0137, 0x0137, 0x0150, 0x016b, 0x0170, 0x0174, 0x0180, 0x018e, + 0x0192, 0x0199, 0x019e, 0x01a5, 0x01a5, 0x01af, 0x01b3, 0x01cb, + 0x01cb, 0x01cb, 0x01cf, 0x01d5, 0x01db, 0x01db, 0x01e2, 0x01e9, + // Entry 40 - 7F + 0x01f0, 0x0203, 0x020b, 0x020b, 0x0214, 0x021b, 0x0221, 0x0221, + 0x0229, 0x022f, 0x0235, 0x0235, 0x023c, 0x0240, 0x0253, 0x025d, + 0x025d, 0x0263, 0x0268, 0x0279, 0x027f, 0x0286, 0x0296, 0x0296, + 0x029b, 0x02a4, 0x02ac, 0x02b2, 0x02b8, 0x02c1, 0x02d1, 0x02d7, + 0x02d7, 0x02e0, 0x02e4, 0x02f0, 0x02f6, 0x02f6, 0x02f6, 0x02fe, + 0x0306, 0x030b, 0x0311, 0x0311, 0x0319, 0x0320, 0x0327, 0x0327, + 0x032c, 0x0349, 0x0350, 0x0354, 0x035a, 0x0362, 0x0362, 0x0369, + 0x0372, 0x0377, 0x037c, 0x0386, 0x038e, 0x0396, 0x039b, 0x03ab, + // Entry 80 - BF + 0x03b8, 0x03c4, 0x03ca, 0x03db, 0x03e5, 0x03e9, 0x03ef, 0x03f9, + 0x0404, 0x040d, 0x0414, 0x041c, 0x0426, 0x0430, 0x0436, 0x043b, + 0x0442, 0x0448, 0x044f, 0x044f, 0x044f, 0x045a, 0x046b, 0x0473, + 0x0477, 0x047e, 0x0486, 0x0486, 0x049e, 0x04a6, 0x04b1, 0x04b9, + 0x04bf, 0x04c4, 0x04ca, 0x04d0, 0x04d6, 0x04dd, 0x04e5, 0x04ec, + 0x04fe, 0x0503, 0x0516, 0x051d, 0x0526, 0x0538, 0x053e, 0x0543, + 0x0547, 0x054b, 0x055a, 0x0560, 0x0565, 0x0569, 0x057c, 0x0593, + 0x059a, 0x05a2, 0x05a8, 0x05b9, 0x05c1, 0x05cb, 0x05de, 0x05e6, + // Entry C0 - FF + 0x05ea, 0x05f2, 0x05f9, 0x05f9, 0x0601, 0x0607, 0x0607, 0x060b, + 0x0612, 0x0624, 0x0636, 0x063c, 0x0641, 0x0645, 0x064d, 0x0657, + 0x065f, 0x065f, 0x0667, 0x0670, 0x067a, 0x0681, 0x0688, 0x068f, + 0x068f, 0x06a1, 0x06a9, 0x06a9, 0x06ae, 0x06b7, 0x06b7, 0x06d1, + 0x06d5, 0x06d5, 0x06db, 0x06e4, 0x06ee, 0x06f5, 0x0701, 0x070f, + 0x0714, 0x071b, 0x0721, 0x0735, 0x073d, 0x0745, 0x074f, 0x0754, + 0x075b, 0x075b, 0x075e, 0x0765, 0x076f, 0x077f, 0x0793, 0x079b, + 0x07bb, 0x07d3, 0x07dc, 0x07e3, 0x07f2, 0x07f7, 0x07f7, 0x07fd, + // Entry 100 - 13F + 0x0804, 0x0811, 0x0817, 0x081f, + }, + }, + { // kam + "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + + "iaAntili za UholanziAngolaAjentinaSamoa ya MarekaniAustriaAustraliaA" + + "rubaAzabajaniBosnia na HezegovinaBabadosiBangladeshiUbelgijiBukinafa" + + "soBulgariaBahareniMbulundiBeniniBermudaBruneiBoliviaBraziliBahamaBut" + + "aniBotswanaBelarusiBelizeKanandaJamhuri ya Kidemokrasia ya KongoJamh" + + "uri ya Afrika ya KatiKongoUswisiKodivaaIsiwa sya CookChileKameluniKy" + + "ainaKolombiaKostarikaKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJib" + + "utiDenmakiDominikaJamhuri ya DominikaAljeriaEkwadoEstoniaMisiliEritr" + + "eaHispaniaUhabeshiUfiniFijiVisiwa vya FalklandMikronesiaUvalanzaGabo" + + "niUingerezaGrenadaJojiaGwiyana ya UfaransaGhanaJibraltaGrinlandiGamb" + + "iaGineGwadelupeGinekwetaUgirikiGwatemalaGwamGinebisauGuyanaHondurasi" + + "KorasiaHaitiHungariaIndonesiaAyalandiIsraeliIndiaEneo la Uingereza k" + + "atika Bahari HindiIrakiUajemiAislandiItaliaJamaikaYordaniJapaniKenya" + + "KirigizistaniKambodiaKiribatiKomoroSantakitzi na NevisKorea Kaskazin" + + "iKorea KusiniKuwaitiIsiwa sya KaymanKazakistaniLaosiLebanoniSantalus" + + "iaLishenteniSirilankaLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorok" + + "oMonakoMoldovaBukiniVisiwa vya MarshalMasedoniaMaliMyamaMongoliaVisi" + + "wa vya Mariana vya KaskaziniMartinikiMoritaniaMontserratiMaltaMorisi" + + "ModivuMalawiMeksikoMalesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa ch" + + "a NorfokNijeriaNikaragwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniP" + + "anamaPeruPolinesia ya UfaransaPapuaFilipinoPakistaniPolandiSantapier" + + "i na MikeloniPitkairniPwetorikoUkingo wa Magharibi na Ukanda wa Gaza" + + " wa PalestinaUrenoPalauParagwaiKatariRiyunioniRomaniaUrusiLwandaSaud" + + "iIsiwa sya SolomonShelisheliSudaniUswidiSingapooSantahelenaSloveniaS" + + "lovakiaSiera LeoniSamarinoSenegaliSomaliaSurinamuSao Tome na Princip" + + "eElsavadoSiriaUswaziVisiwa vya Turki na KaikoChadiTogoTailandiTajiki" + + "staniTokelauTimori ya MasharikiTurukimenistaniTunisiaTongaUturukiTri" + + "nidad na TobagoTuvaluTaiwaniTanzaniaUkrainiUkandaMarekaniUrugwaiUzib" + + "ekistaniVatikaniSantavisenti na GrenadiniVenezuelaVisiwa vya Virgin " + + "vya UingerezaVisiwa vya Virgin vya MarekaniVietinamuVanuatuWalis na " + + "FutunaSamoaYemeniMayotteAfrika KusiniNzambiaNzimbambwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, + 0x004a, 0x005c, 0x0062, 0x0062, 0x006a, 0x007b, 0x0082, 0x008b, + 0x0090, 0x0090, 0x0099, 0x00ad, 0x00b5, 0x00c0, 0x00c8, 0x00d2, + 0x00da, 0x00e2, 0x00ea, 0x00f0, 0x00f0, 0x00f7, 0x00fd, 0x0104, + 0x0104, 0x010b, 0x0111, 0x0117, 0x0117, 0x011f, 0x0127, 0x012d, + 0x0134, 0x0134, 0x0154, 0x016d, 0x0172, 0x0178, 0x017f, 0x018d, + 0x0192, 0x019a, 0x01a0, 0x01a8, 0x01a8, 0x01b1, 0x01b5, 0x01bd, + 0x01bd, 0x01bd, 0x01c4, 0x01d4, 0x01dd, 0x01dd, 0x01e3, 0x01ea, + // Entry 40 - 7F + 0x01f2, 0x0205, 0x020c, 0x020c, 0x0212, 0x0219, 0x021f, 0x021f, + 0x0226, 0x022e, 0x0236, 0x0236, 0x023b, 0x023f, 0x0252, 0x025c, + 0x025c, 0x0264, 0x026a, 0x0273, 0x027a, 0x027f, 0x0292, 0x0292, + 0x0297, 0x029f, 0x02a8, 0x02ae, 0x02b2, 0x02bb, 0x02c4, 0x02cb, + 0x02cb, 0x02d4, 0x02d8, 0x02e1, 0x02e7, 0x02e7, 0x02e7, 0x02f0, + 0x02f7, 0x02fc, 0x0304, 0x0304, 0x030d, 0x0315, 0x031c, 0x031c, + 0x0321, 0x0346, 0x034b, 0x0351, 0x0359, 0x035f, 0x035f, 0x0366, + 0x036d, 0x0373, 0x0378, 0x0385, 0x038d, 0x0395, 0x039b, 0x03ae, + // Entry 80 - BF + 0x03bd, 0x03c9, 0x03d0, 0x03e0, 0x03eb, 0x03f0, 0x03f8, 0x0402, + 0x040c, 0x0415, 0x041c, 0x0422, 0x042a, 0x0433, 0x043a, 0x043f, + 0x0445, 0x044b, 0x0452, 0x0452, 0x0452, 0x0458, 0x046a, 0x0473, + 0x0477, 0x047c, 0x0484, 0x0484, 0x04a4, 0x04ad, 0x04b6, 0x04c1, + 0x04c6, 0x04cc, 0x04d2, 0x04d8, 0x04df, 0x04e6, 0x04ee, 0x04f5, + 0x0501, 0x0507, 0x0518, 0x051f, 0x0528, 0x0530, 0x0535, 0x053b, + 0x0540, 0x0544, 0x054e, 0x0553, 0x0559, 0x055d, 0x0572, 0x0577, + 0x057f, 0x0588, 0x058f, 0x05a5, 0x05ae, 0x05b7, 0x05e9, 0x05ee, + // Entry C0 - FF + 0x05f3, 0x05fb, 0x0601, 0x0601, 0x060a, 0x0611, 0x0611, 0x0616, + 0x061c, 0x0621, 0x0632, 0x063c, 0x0642, 0x0648, 0x0650, 0x065b, + 0x0663, 0x0663, 0x066b, 0x0676, 0x067e, 0x0686, 0x068d, 0x0695, + 0x0695, 0x06a9, 0x06b1, 0x06b1, 0x06b6, 0x06bc, 0x06bc, 0x06d5, + 0x06da, 0x06da, 0x06de, 0x06e6, 0x06f1, 0x06f8, 0x070b, 0x071a, + 0x0721, 0x0726, 0x072d, 0x073f, 0x0745, 0x074c, 0x0754, 0x075b, + 0x0761, 0x0761, 0x0769, 0x0770, 0x077c, 0x0784, 0x079d, 0x07a6, + 0x07c5, 0x07e3, 0x07ec, 0x07f3, 0x0802, 0x0807, 0x0807, 0x080d, + // Entry 100 - 13F + 0x0814, 0x0821, 0x0828, 0x0832, + }, + }, + { // kde + "AndolaDimiliki dya Vakulungwa va ChalabuAfuganistaniAntigua na BalbudaAn" + + "gwilaAlbaniaAlmeniaAntili za UholanziAngolaAdyentinaSamoa ya Malekan" + + "iAustliaAustlaliaAlubaAzabadyaniBosnia na HezegovinaBabadosiBanglade" + + "shiUbelgidiBuchinafasoBulgaliaBahaleniBulundiBeniniBelmudaBluneiBoli" + + "viaBlaziliBahamaButaniBotswanaBelalusiBelizeKanadaJamuhuli ya Chidem" + + "oklasia ya kuKongoJamuhuli ya Afilika ya Paching’atiKongoUswisiKodiv" + + "aaChisiwa cha CookChileKameluniChinaKolombiaKostalikaKubaKepuvedeKup" + + "losiJamuhuli ya ChechiUdyerumaniDyibutiDenmakiDominikaJamuhuli ya Do" + + "minikaAljeliaEkwadoEstoniaMisliElitileaHispaniaUhabeshiUfiniFijiChis" + + "iwa cha FalklandMikilonesiaUfalansaGaboniNngalesaGlenadaDyodyaGwiyan" + + "a ya UfalansaGhanaDiblaltaGlinlandiGambiaGineGwadelupeGinekwetaUgili" + + "chiGwatemalaGwamGinebisauGuyanaHondulasiKolasiaHaitiHungaliaIndonesi" + + "aAyalandiIslaeliIndiaLieneo lyaki Nngalesa Nbahali ya HindiIlakiUady" + + "emiAislandiItaliaDyamaikaYordaniDyapaniKenyaKiligizistaniKambodiaKil" + + "ibatiKomoloSantakitzi na NevisKolea KasikaziniKolea KusiniKuwaitiChi" + + "siwa cha KemenKazachistaniLaosiLebanoniSantalusiaLishenteniSililanka" + + "LibeliaLesotoLitwaniaLasembagiLativiaLibyaMolokoMonakoMoldovaBukiniC" + + "hisiwa cha MalushalMasedoniaMaliMyamaMongoliaChisiwa cha Marian cha " + + "KasikaziniMalitinikiMolitaniaMonselatiMaltaMolisiModivuMalawiMeksiko" + + "MalesiaMsumbijiNamibiaNyukaledoniaNidyeliChisiwa cha NolufokNidyelia" + + "NikalagwaUholanziNorweNepaliNauluNiueNyuzilandiOmaniPanamaPeluPoline" + + "sia ya UfalansaPapuaFilipinoPakistaniPolandiSantapieli na MikeloniPi" + + "tikeluniPwetolikoNchingu wa Magalibi wa Mpanda wa kuGaza wa kuPalesU" + + "lenoPalauPalagwaiKataliLiyunioniLomaniaUlusiLwandaSaudiaChisiwa cha " + + "SolomonShelisheliSudaniUswidiSingapooSantahelenaSloveniaSlovakiaSiel" + + "a LeoniSamalinoSenegaliSomaliaSulinamuSaotome na PrinsipeElsavadoSil" + + "iaUswaziChisiwa cha Tuluchi na KaikoChadiTogoTailandiTadikistaniToke" + + "lauTimoli ya MashalikiTuluchimenistaniTunisiaTongaUtuluchiTilinidad " + + "na TobagoTuvaluTaiwaniTanzaniaUklainiUgandaMalekaniUlugwaiUzibechist" + + "aniVatikaniSantavisenti na GlenadiniVenezuelaChisiwa Chivihi cha Win" + + "galesaChisiwa Chivihi cha MalekaniVietinamuVanuatuWalis na FutunaSam" + + "oaYemeniMaoleAfilika KusiniZambiaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0028, 0x0034, 0x0046, 0x004d, 0x0054, + 0x005b, 0x006d, 0x0073, 0x0073, 0x007c, 0x008d, 0x0094, 0x009d, + 0x00a2, 0x00a2, 0x00ac, 0x00c0, 0x00c8, 0x00d3, 0x00db, 0x00e6, + 0x00ee, 0x00f6, 0x00fd, 0x0103, 0x0103, 0x010a, 0x0110, 0x0117, + 0x0117, 0x011e, 0x0124, 0x012a, 0x012a, 0x0132, 0x013a, 0x0140, + 0x0146, 0x0146, 0x016a, 0x018e, 0x0193, 0x0199, 0x01a0, 0x01b0, + 0x01b5, 0x01bd, 0x01c2, 0x01ca, 0x01ca, 0x01d3, 0x01d7, 0x01df, + 0x01df, 0x01df, 0x01e6, 0x01f8, 0x0202, 0x0202, 0x0209, 0x0210, + // Entry 40 - 7F + 0x0218, 0x022c, 0x0233, 0x0233, 0x0239, 0x0240, 0x0245, 0x0245, + 0x024d, 0x0255, 0x025d, 0x025d, 0x0262, 0x0266, 0x027a, 0x0285, + 0x0285, 0x028d, 0x0293, 0x029b, 0x02a2, 0x02a8, 0x02bb, 0x02bb, + 0x02c0, 0x02c8, 0x02d1, 0x02d7, 0x02db, 0x02e4, 0x02ed, 0x02f5, + 0x02f5, 0x02fe, 0x0302, 0x030b, 0x0311, 0x0311, 0x0311, 0x031a, + 0x0321, 0x0326, 0x032e, 0x032e, 0x0337, 0x033f, 0x0346, 0x0346, + 0x034b, 0x0371, 0x0376, 0x037d, 0x0385, 0x038b, 0x038b, 0x0393, + 0x039a, 0x03a1, 0x03a6, 0x03b3, 0x03bb, 0x03c3, 0x03c9, 0x03dc, + // Entry 80 - BF + 0x03ec, 0x03f8, 0x03ff, 0x0410, 0x041c, 0x0421, 0x0429, 0x0433, + 0x043d, 0x0446, 0x044d, 0x0453, 0x045b, 0x0464, 0x046b, 0x0470, + 0x0476, 0x047c, 0x0483, 0x0483, 0x0483, 0x0489, 0x049d, 0x04a6, + 0x04aa, 0x04af, 0x04b7, 0x04b7, 0x04d8, 0x04e2, 0x04eb, 0x04f4, + 0x04f9, 0x04ff, 0x0505, 0x050b, 0x0512, 0x0519, 0x0521, 0x0528, + 0x0534, 0x053b, 0x054e, 0x0556, 0x055f, 0x0567, 0x056c, 0x0572, + 0x0577, 0x057b, 0x0585, 0x058a, 0x0590, 0x0594, 0x05a9, 0x05ae, + 0x05b6, 0x05bf, 0x05c6, 0x05dc, 0x05e6, 0x05ef, 0x0621, 0x0626, + // Entry C0 - FF + 0x062b, 0x0633, 0x0639, 0x0639, 0x0642, 0x0649, 0x0649, 0x064e, + 0x0654, 0x065a, 0x066d, 0x0677, 0x067d, 0x0683, 0x068b, 0x0696, + 0x069e, 0x069e, 0x06a6, 0x06b1, 0x06b9, 0x06c1, 0x06c8, 0x06d0, + 0x06d0, 0x06e3, 0x06eb, 0x06eb, 0x06f0, 0x06f6, 0x06f6, 0x0712, + 0x0717, 0x0717, 0x071b, 0x0723, 0x072e, 0x0735, 0x0748, 0x0758, + 0x075f, 0x0764, 0x076c, 0x077f, 0x0785, 0x078c, 0x0794, 0x079b, + 0x07a1, 0x07a1, 0x07a9, 0x07b0, 0x07bd, 0x07c5, 0x07de, 0x07e7, + 0x0804, 0x0820, 0x0829, 0x0830, 0x083f, 0x0844, 0x0844, 0x084a, + // Entry 100 - 13F + 0x084f, 0x085d, 0x0863, 0x086b, + }, + }, + { // kea + "Ilha di AsensãuAndoraEmiradus Arabi UniduAfeganistãuAntigua i BarbudaAng" + + "ilaAlbaniaArmeniaAntilhas OlandezaAngolaAntartikaArjentinaSamoa Merk" + + "anuAustriaAustraliaArubaIlhas ÅlandAzerbaijãuBosnia-ErzegovinaBarbad" + + "usBangladexiBéljikaBurkina FasuBulgariaBarainBurundiBeninSãu Bartolo" + + "meuBermudasBruneiBolíviaKaraibas OlandezasBrazilBaamasButãuIlha Buve" + + "BotsuanaBelarusBeliziKanadáIlhas KokusKongu - KinxasaRepublika Sentr" + + "u-AfrikanuKongu - BrazaviliSuisaKosta di MarfinIlhas KukXiliKamarõis" + + "XinaKolômbiaIlha KlipertonKosta RikaKubaKabu VerdiKurasauIlha di Nat" + + "alXipriRepublika TxekaAlimanhaDiegu GarsiaDjibutiDinamarkaDominikaRe" + + "públika DominikanaArjeliaSeuta i MelilaEkuadorStoniaEjituSara Osiden" + + "talIritreiaSpanhaItiopiaUniãu EuropeiaFinlandiaFidjiIlhas MalvinasMi" + + "kroneziaIlhas FaroeFransaGabãuReinu UniduGranadaJiorjiaGiana Fransez" + + "aGernziGanaJibraltarGronelándiaGambiaGineGuadalupiGine EkuatorialGre" + + "siaJeórjia di Sul i Ilhas di Sanduixi di SulGuatimalaGuamGine-BisauG" + + "ianaRejiãu Administrativu Special di Hong KongIlha Heard i Ilhas McD" + + "onaldOndurasKroasiaAitíUngriaKanáriasIndoneziaIrlandaIsraelIlha di M" + + "anIndiaIlhas Britanika di IndikuIrakiIronIslandiaItaliaJersiJamaikaJ" + + "ordaniaJapãuKeniaKirgistonKambodjaKiribatiKamorisSãu Kristovãu i Nev" + + "isKoreia di NortiKoreia di SulKueitiIlhas KaimãuKazakistãuLausLibanu" + + "Santa LúsiaLixenstainSri LankaLiberiaLezotuLituaniaLuxemburguLetonia" + + "LibiaMarokusMonakuMoldaviaMontenegruSãu Martinhu di FransaMadagaskar" + + "Ilhas MarxalMasidoniaMaliMianmarMongoliaRejiãu Administrativu Specia" + + "l di MakauIlhas Marianas di NortiMartinikaMauritaniaMonseratMaltaIlh" + + "as MaurisiaMaldivasMalauiMéxikuMalaziaMusambikiNamibiaNova Kalidonia" + + "NijerIlhas NorfolkNijeriaNikaráguaOlandaNoruegaNepalNauruNiueNova Zi" + + "landiaOmanPanamáPeruPolinezia FransezaPapua-Nova GineFilipinasPakist" + + "ãuPuloniaSan Piere i MikelonPirkairnPortu RikuPalistinaPurtugalPala" + + "uParaguaiKatarIlhas di OseaniaRunionRomeniaServiaRúsiaRuandaArabia S" + + "auditaIlhas SalumonSeixelisSudãuSuesiaSingapuraSanta IlenaSloveniaSv" + + "albard i Jan MaienSlovakiaSera LioaSan MarinuSenegalSumaliaSurinamiS" + + "udãu di SulSãu Tume i PrinsipiEl SalvadorSãu Martinhu di OlandaSiria" + + "SuazilándiaTristan da KunhaIlhas Turkas i KaikusTxadiTerras Franses " + + "di SulToguTailandiaTadjikistãuTokelauTimor LestiTurkumenistãuTunizia" + + "TongaTurkiaTrinidad i TobaguTuvaluTaiuanTanzaniaUkraniaUgandaIlhas M" + + "inoris Distantis de Stadus UnidusStadus Unidos di MerkaUruguaiUzbeki" + + "stãuVatikanuSãu Bisenti i GranadinasVinizuelaIlhas Virjens Britanika" + + "sIlhas Virjens MerkanasVietnamVanuatuUalis i FutunaSamoaKozovuIemenM" + + "aioteAfrika di SulZambiaZimbabuiRejiãu DiskonxeduMunduÁfrikaMerka di" + + " NortiMerka di SulOseaniaÁfrika OsidentalMerka SentralÁfrika Orienta" + + "lNorti di ÁfrikaÁfrika SentralSul di ÁfrikaMerkasNorti di MerkaKarai" + + "basÁzia OrientalSul di ÁziaSudesti AziátikuEuropa di SulAustraláziaM" + + "elanéziaRejiãu di MikronéziaPolinéziaÁziaÁzia SentralÁzia OsidentalE" + + "uropaEuropa OrientalEuropa di NortiEuropa OsidentalMerka Latinu", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0010, 0x0016, 0x002a, 0x0036, 0x0047, 0x004d, 0x0054, + 0x005b, 0x006c, 0x0072, 0x007b, 0x0084, 0x0091, 0x0098, 0x00a1, + 0x00a6, 0x00b2, 0x00bd, 0x00ce, 0x00d6, 0x00e0, 0x00e8, 0x00f4, + 0x00fc, 0x0102, 0x0109, 0x010e, 0x011d, 0x0125, 0x012b, 0x0133, + 0x0145, 0x014b, 0x0151, 0x0157, 0x0160, 0x0168, 0x016f, 0x0175, + 0x017c, 0x0187, 0x0196, 0x01af, 0x01c0, 0x01c5, 0x01d4, 0x01dd, + 0x01e1, 0x01ea, 0x01ee, 0x01f7, 0x0205, 0x020f, 0x0213, 0x021d, + 0x0224, 0x0231, 0x0236, 0x0245, 0x024d, 0x0259, 0x0260, 0x0269, + // Entry 40 - 7F + 0x0271, 0x0286, 0x028d, 0x029b, 0x02a2, 0x02a8, 0x02ad, 0x02bb, + 0x02c3, 0x02c9, 0x02d0, 0x02df, 0x02e8, 0x02ed, 0x02fb, 0x0305, + 0x0310, 0x0316, 0x031c, 0x0327, 0x032e, 0x0335, 0x0343, 0x0349, + 0x034d, 0x0356, 0x0362, 0x0368, 0x036c, 0x0375, 0x0384, 0x038a, + 0x03b4, 0x03bd, 0x03c1, 0x03cb, 0x03d0, 0x03fb, 0x0416, 0x041d, + 0x0424, 0x0429, 0x042f, 0x0438, 0x0441, 0x0448, 0x044e, 0x0459, + 0x045e, 0x0477, 0x047c, 0x0480, 0x0488, 0x048e, 0x0493, 0x049a, + 0x04a2, 0x04a8, 0x04ad, 0x04b6, 0x04be, 0x04c6, 0x04cd, 0x04e4, + // Entry 80 - BF + 0x04f3, 0x0500, 0x0506, 0x0513, 0x051e, 0x0522, 0x0528, 0x0534, + 0x053e, 0x0547, 0x054e, 0x0554, 0x055c, 0x0566, 0x056d, 0x0572, + 0x0579, 0x057f, 0x0587, 0x0591, 0x05a8, 0x05b2, 0x05be, 0x05c7, + 0x05cb, 0x05d2, 0x05da, 0x0601, 0x0618, 0x0621, 0x062b, 0x0633, + 0x0638, 0x0646, 0x064e, 0x0654, 0x065b, 0x0662, 0x066b, 0x0672, + 0x0680, 0x0685, 0x0692, 0x0699, 0x06a3, 0x06a9, 0x06b0, 0x06b5, + 0x06ba, 0x06be, 0x06cb, 0x06cf, 0x06d6, 0x06da, 0x06ec, 0x06fb, + 0x0704, 0x070d, 0x0714, 0x0727, 0x072f, 0x0739, 0x0742, 0x074a, + // Entry C0 - FF + 0x074f, 0x0757, 0x075c, 0x076c, 0x0772, 0x0779, 0x077f, 0x0785, + 0x078b, 0x0799, 0x07a6, 0x07ae, 0x07b4, 0x07ba, 0x07c3, 0x07ce, + 0x07d6, 0x07ea, 0x07f2, 0x07fb, 0x0805, 0x080c, 0x0813, 0x081b, + 0x0828, 0x083c, 0x0847, 0x085e, 0x0863, 0x086f, 0x087f, 0x0894, + 0x0899, 0x08ae, 0x08b2, 0x08bb, 0x08c7, 0x08ce, 0x08d9, 0x08e7, + 0x08ee, 0x08f3, 0x08f9, 0x090a, 0x0910, 0x0916, 0x091e, 0x0925, + 0x092b, 0x0953, 0x0969, 0x0970, 0x097b, 0x0983, 0x099c, 0x09a5, + 0x09bd, 0x09d3, 0x09da, 0x09e1, 0x09ef, 0x09f4, 0x09fa, 0x09ff, + // Entry 100 - 13F + 0x0a05, 0x0a12, 0x0a18, 0x0a20, 0x0a32, 0x0a37, 0x0a3e, 0x0a4c, + 0x0a58, 0x0a5f, 0x0a70, 0x0a7d, 0x0a8d, 0x0a9d, 0x0aac, 0x0aba, + 0x0ac0, 0x0ace, 0x0ad6, 0x0ae4, 0x0af0, 0x0b01, 0x0b0e, 0x0b1a, + 0x0b24, 0x0b3a, 0x0b44, 0x0b49, 0x0b56, 0x0b65, 0x0b6b, 0x0b7a, + 0x0b89, 0x0b99, 0x0ba5, + }, + }, + { // khq + "AndooraLaaraw Imaarawey MarganteyAfgaanistanAntigua nda BarbuudaAngiiyaA" + + "lbaaniArmeeniHollandu Antiiyey LabooAngoolaArgentineAmeriki SamoaOtr" + + "išiOstraaliAruubaAzerbaayijaŋBosni nda HerzegovineBarbaadosBangladeš" + + "iBelgiikiBurkina fasoBulgaariBahareenBurundiBeniŋBermudaBruuneeBooli" + + "viBreezilBahamasBuutaŋBotswaanaBilorišiBeliiziKanaadaKongoo demookar" + + "atiki labooCentraafriki koyraKongooSwisuKudwarKuuk gungeyŠiiliKameru" + + "unŠiinKolombiKosta rikaKuubaKapuver gungeyŠiipurCek laboAlmaaɲeJibuu" + + "tiDanemarkDoominikiDoominiki labooAlžeeriEkwateerEstooniMisraEritree" + + "EspaaɲeEcioopiFinlanduFijiKalkan gungeyMikroneziFaransiGaabonAlbaasa" + + "laama MargantaGrenaadaGorgiFaransi GuyaanGaanaGibraltarGrinlandGambi" + + "GineGwadeluupGinee EkwatorialGreeceGwatemaalaGuamGine-BissoGuyaaneHo" + + "ndurasKrwaasiHaitiHungaariIndoneeziIrlanduIsrayelIndu labooBritiši I" + + "ndu teekoo laamaIraakIraanAycelandItaaliJamaayikUrdunJaapoŋKeeniyaKy" + + "rgyzstanKamboogiKiribaatiKomoorSeŋ Kitts nda NevisKooree, GurmaKoore" + + "e, HawsaKuweetKayman gungeyKaazakstanLaawosLubnaanSeŋ LussiaLiechten" + + "steinSrilankaLiberiaLeesotoLituaaniLuxembourgLetooniLiibiMaarokMonak" + + "oMoldoviMadagascarMaršal gungeyMaacedooniMaaliMaynamarMongooliMarian" + + "a Gurma GungeyMartiniikiMooritaaniMontserratMaltaMooris gungeyMaldii" + + "vuMalaawiMexikiMaleeziMozambikNaamibiKaaledooni TaagaaNižerNorfolk G" + + "ungooNaajiriiaNikaragwaHollanduNorveejNeepalNauruNiueZeelandu TaagaO" + + "maanPanamaPeeruFaransi PolineeziPapua Ginee TaagaFilipinePaakistanPo" + + "loɲeSeŋ Piyer nda MikelonPitikarinPorto RikoPalestine Dangay nda Gaa" + + "zaPortugaalPaluParaguweyKataarReenioŋRumaaniIriši labooRwandaSaudiya" + + "Solomon GungeySeešelSuudaŋSweedeSingapurSeŋ HelenaSloveeniSlovaakiSe" + + "era LeonSan MarinoSenegalSomaaliSurinaamSao Tome nda PrinsipeSalvado" + + "r labooSuuriaSwazilandTurk nda Kayikos GungeyCaaduTogoTaayilandTaaži" + + "kistanTokelauTimoor hawsaTurkmenistaŋTuniziTongaTurkiTrinidad nda To" + + "baagoTuvaluTaayiwanTanzaaniUkreenUgandaAmeriki Laabu MarganteyUruguw" + + "eyUzbeekistanVaatikan LaamaSeŋvinsaŋ nda GrenadineVeneezuyeelaBritiš" + + "i Virgin gungeyAmeerik Virgin GungeyVietnaamVanautuWallis nda Futuna" + + "SamoaYamanMayootiHawsa Afriki LabooZambiZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x0021, 0x002c, 0x0040, 0x0047, 0x004e, + 0x0055, 0x006c, 0x0073, 0x0073, 0x007c, 0x0089, 0x0090, 0x0098, + 0x009e, 0x009e, 0x00ab, 0x00c0, 0x00c9, 0x00d4, 0x00dc, 0x00e8, + 0x00f0, 0x00f8, 0x00ff, 0x0105, 0x0105, 0x010c, 0x0113, 0x011a, + 0x011a, 0x0121, 0x0128, 0x012f, 0x012f, 0x0138, 0x0141, 0x0148, + 0x014f, 0x014f, 0x0169, 0x017b, 0x0181, 0x0186, 0x018c, 0x0197, + 0x019d, 0x01a5, 0x01aa, 0x01b1, 0x01b1, 0x01bb, 0x01c0, 0x01ce, + 0x01ce, 0x01ce, 0x01d5, 0x01dd, 0x01e5, 0x01e5, 0x01ec, 0x01f4, + // Entry 40 - 7F + 0x01fd, 0x020c, 0x0214, 0x0214, 0x021c, 0x0223, 0x0228, 0x0228, + 0x022f, 0x0237, 0x023e, 0x023e, 0x0246, 0x024a, 0x0257, 0x0260, + 0x0260, 0x0267, 0x026d, 0x0282, 0x028a, 0x028f, 0x029d, 0x029d, + 0x02a2, 0x02ab, 0x02b3, 0x02b8, 0x02bc, 0x02c5, 0x02d5, 0x02db, + 0x02db, 0x02e5, 0x02e9, 0x02f3, 0x02fa, 0x02fa, 0x02fa, 0x0302, + 0x0309, 0x030e, 0x0316, 0x0316, 0x031f, 0x0326, 0x032d, 0x032d, + 0x0337, 0x0351, 0x0356, 0x035b, 0x0363, 0x0369, 0x0369, 0x0371, + 0x0376, 0x037d, 0x0384, 0x038e, 0x0396, 0x039f, 0x03a5, 0x03b9, + // Entry 80 - BF + 0x03c6, 0x03d3, 0x03d9, 0x03e6, 0x03f0, 0x03f6, 0x03fd, 0x0408, + 0x0415, 0x041d, 0x0424, 0x042b, 0x0433, 0x043d, 0x0444, 0x0449, + 0x044f, 0x0455, 0x045c, 0x045c, 0x045c, 0x0466, 0x0474, 0x047e, + 0x0483, 0x048b, 0x0493, 0x0493, 0x04a7, 0x04b1, 0x04bb, 0x04c5, + 0x04ca, 0x04d7, 0x04df, 0x04e6, 0x04ec, 0x04f3, 0x04fb, 0x0502, + 0x0513, 0x0519, 0x0527, 0x0530, 0x0539, 0x0541, 0x0548, 0x054e, + 0x0553, 0x0557, 0x0565, 0x056a, 0x0570, 0x0575, 0x0586, 0x0597, + 0x059f, 0x05a8, 0x05af, 0x05c5, 0x05ce, 0x05d8, 0x05f2, 0x05fb, + // Entry C0 - FF + 0x05ff, 0x0608, 0x060e, 0x060e, 0x0616, 0x061d, 0x061d, 0x0629, + 0x062f, 0x0636, 0x0644, 0x064b, 0x0652, 0x0658, 0x0660, 0x066b, + 0x0673, 0x0673, 0x067b, 0x0685, 0x068f, 0x0696, 0x069d, 0x06a5, + 0x06a5, 0x06ba, 0x06c8, 0x06c8, 0x06ce, 0x06d7, 0x06d7, 0x06ee, + 0x06f3, 0x06f3, 0x06f7, 0x0700, 0x070c, 0x0713, 0x071f, 0x072c, + 0x0732, 0x0737, 0x073c, 0x0750, 0x0756, 0x075e, 0x0766, 0x076c, + 0x0772, 0x0772, 0x0789, 0x0791, 0x079c, 0x07aa, 0x07c3, 0x07cf, + 0x07e5, 0x07fa, 0x0802, 0x0809, 0x081a, 0x081f, 0x081f, 0x0824, + // Entry 100 - 13F + 0x082b, 0x083d, 0x0842, 0x084a, + }, + }, + { // ki + "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + + "iaAntili za UholanziAngolaAjentinaSamoa ya MarekaniAustriaAustraliaA" + + "rubaAzabajaniBosnia na HezegovinaBabadosiBangladeshiUbelgijiBukinafa" + + "soBulgariaBahareniMburundiBeniniBermudaBruneiBoliviaBraziliBahamaBut" + + "aniBotswanaBelarusiBelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhu" + + "ri ya Afrika ya KatiKongoUswisiKodivaaVisiwa vya CookChileKameruniCa" + + "inaKolombiaKostarikaKiumbaKepuvedeKuprosiJamhuri ya ChekiNjeremaniJi" + + "butiDenmakiDominikaJamhuri ya DominikaAljeriaEkwadoEstoniaMisriEritr" + + "eaHispaniaUhabeshiUfiniFijiVisiwa vya FalklandMikronesiaUbaranjaGabo" + + "niNgerethaGrenadaJojiaGwiyana ya UfaransaNganaJibraltaGrinlandiGambi" + + "aGineGwadelupeGinekwetaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiK" + + "orasiaHaitiHungariaIndonesiaAyalandiIsraeliIndiaEneo la Uingereza ka" + + "tika Bahari HindiIrakiUajemiAislandiItaliaJamaikaNjorondaniNjabaniKe" + + "nyaKirigizistaniKambodiaKiribatiKomoroSantakitzi na NevisKorea Kaska" + + "ziniKorea KusiniKuwaitiVisiwa vya KaymanKazakistaniLaosiLebanoniSant" + + "alusiaLishenteniSirilankaLiberiaLesotoLitwaniaLasembagiLativiaLibyaM" + + "orokoMonakoMoldovaBukiniVisiwa vya MarshalMasedoniaMaliMyamaMongolia" + + "Visiwa vya Mariana vya KaskaziniMartinikiMoritaniaMontserratiMaltaMo" + + "risiModivuMalawiMeksikoMalesiaMsumbijiNamimbiaNyukaledoniaNijeriKisi" + + "wa cha NorfokNainjeriaNikaragwaUholanziNorweNepaliNauruNiueNyuziland" + + "iOmaniPanamaPeruPolinesia ya UfaransaPapuaFilipinoPakistaniPolandiSa" + + "ntapieri na MikeloniPitkairniPwetorikoUkingo wa Magharibi na Ukanda " + + "wa Gaza wa PalestinaUrenoPalauParagwaiKatariRiyunioniRomaniaUrusiRwa" + + "ndaSaudiVisiwa vya SolomonShelisheliSudaniUswidiSingapooSantahelenaS" + + "loveniaSlovakiaSiera LeoniSamarinoSenegaliSomariaSurinamuSao Tome na" + + " PrincipeElsavadoSiriaUswaziVisiwa vya Turki na KaikoChadiTogoTailan" + + "diTajikistaniTokelauTimori ya MasharikiTurukimenistaniTunisiaTongaUt" + + "urukiTrinidad na TobagoTuvaluTaiwaniTanzaniaUkrainiUgandaAmerikaUrug" + + "waiUzibekistaniVatikaniSantavisenti na GrenadiniVenezuelaVisiwa vya " + + "Virgin vya UingerezaVisiwa vya Virgin vya MarekaniVietinamuVanuatuWa" + + "lis na FutunaSamoaYemeniMayotteAfrika KusiniZambiaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, + 0x004a, 0x005c, 0x0062, 0x0062, 0x006a, 0x007b, 0x0082, 0x008b, + 0x0090, 0x0090, 0x0099, 0x00ad, 0x00b5, 0x00c0, 0x00c8, 0x00d2, + 0x00da, 0x00e2, 0x00ea, 0x00f0, 0x00f0, 0x00f7, 0x00fd, 0x0104, + 0x0104, 0x010b, 0x0111, 0x0117, 0x0117, 0x011f, 0x0127, 0x012d, + 0x0133, 0x0133, 0x0153, 0x016c, 0x0171, 0x0177, 0x017e, 0x018d, + 0x0192, 0x019a, 0x019f, 0x01a7, 0x01a7, 0x01b0, 0x01b6, 0x01be, + 0x01be, 0x01be, 0x01c5, 0x01d5, 0x01de, 0x01de, 0x01e4, 0x01eb, + // Entry 40 - 7F + 0x01f3, 0x0206, 0x020d, 0x020d, 0x0213, 0x021a, 0x021f, 0x021f, + 0x0226, 0x022e, 0x0236, 0x0236, 0x023b, 0x023f, 0x0252, 0x025c, + 0x025c, 0x0264, 0x026a, 0x0272, 0x0279, 0x027e, 0x0291, 0x0291, + 0x0296, 0x029e, 0x02a7, 0x02ad, 0x02b1, 0x02ba, 0x02c3, 0x02ca, + 0x02ca, 0x02d3, 0x02d7, 0x02e0, 0x02e6, 0x02e6, 0x02e6, 0x02ef, + 0x02f6, 0x02fb, 0x0303, 0x0303, 0x030c, 0x0314, 0x031b, 0x031b, + 0x0320, 0x0345, 0x034a, 0x0350, 0x0358, 0x035e, 0x035e, 0x0365, + 0x036f, 0x0376, 0x037b, 0x0388, 0x0390, 0x0398, 0x039e, 0x03b1, + // Entry 80 - BF + 0x03c0, 0x03cc, 0x03d3, 0x03e4, 0x03ef, 0x03f4, 0x03fc, 0x0406, + 0x0410, 0x0419, 0x0420, 0x0426, 0x042e, 0x0437, 0x043e, 0x0443, + 0x0449, 0x044f, 0x0456, 0x0456, 0x0456, 0x045c, 0x046e, 0x0477, + 0x047b, 0x0480, 0x0488, 0x0488, 0x04a8, 0x04b1, 0x04ba, 0x04c5, + 0x04ca, 0x04d0, 0x04d6, 0x04dc, 0x04e3, 0x04ea, 0x04f2, 0x04fa, + 0x0506, 0x050c, 0x051d, 0x0526, 0x052f, 0x0537, 0x053c, 0x0542, + 0x0547, 0x054b, 0x0555, 0x055a, 0x0560, 0x0564, 0x0579, 0x057e, + 0x0586, 0x058f, 0x0596, 0x05ac, 0x05b5, 0x05be, 0x05f0, 0x05f5, + // Entry C0 - FF + 0x05fa, 0x0602, 0x0608, 0x0608, 0x0611, 0x0618, 0x0618, 0x061d, + 0x0623, 0x0628, 0x063a, 0x0644, 0x064a, 0x0650, 0x0658, 0x0663, + 0x066b, 0x066b, 0x0673, 0x067e, 0x0686, 0x068e, 0x0695, 0x069d, + 0x069d, 0x06b1, 0x06b9, 0x06b9, 0x06be, 0x06c4, 0x06c4, 0x06dd, + 0x06e2, 0x06e2, 0x06e6, 0x06ee, 0x06f9, 0x0700, 0x0713, 0x0722, + 0x0729, 0x072e, 0x0735, 0x0747, 0x074d, 0x0754, 0x075c, 0x0763, + 0x0769, 0x0769, 0x0770, 0x0777, 0x0783, 0x078b, 0x07a4, 0x07ad, + 0x07cc, 0x07ea, 0x07f3, 0x07fa, 0x0809, 0x080e, 0x080e, 0x0814, + // Entry 100 - 13F + 0x081b, 0x0828, 0x082e, 0x0836, + }, + }, + { // kk + kkRegionStr, + kkRegionIdx, + }, + { // kkj + "Kamɛrun", + []uint16{ // 50 elements + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0008, + }, + }, + { // kl + "Kalaallit Nunaat", + []uint16{ // 91 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0010, + }, + }, + { // kln + "Emetab AndorraEmetab kibagenge nebo arabukEmetab AfghanistanEmetab Antig" + + "ua ak BarbudaEmetab AnguillaEmetab AlbaniaEmetab ArmeniaEmetab Antil" + + "e nebo HolandEmetab AngolaEmetab ArgentinaEmetab American SamoaEmeta" + + "b AustriaEmetab AustraliaEmetab ArubaEmetab AzerbaijanEmetab Bosnia " + + "ak HerzegovinaEmetab BarbadosEmetab BangladeshEmetab BelgiumEmetab B" + + "urkina FasoEmetab BulgariaEmetab BahrainEmetab BurundiEmetab BeninEm" + + "etab BermudaEmetab BruneiEmetab BoliviaEmetab BrazilEmetab BahamasEm" + + "etab BhutanEmetab BotswanaEmetab BelarusEmetab BelizeEmetab CanadaEm" + + "etab Congo - KinshasaEmetab Afrika nebo KwenEmetab Congo - Brazzavil" + + "leEmetab SwitzerlandEmetab Côte d’IvoireIkwembeyotab CookEmetab Chil" + + "eEmetab CameroonEmetab ChinaEmetab ColombiaEmetab Costa RicaEmetab C" + + "ubaIkwembeyotab Cape VerdeEmetab CyprusEmetab Czech RepublicEmetab G" + + "erumanEmetab DjiboutiEmetab DenmarkEmetab DominicaEmetab Dominican R" + + "epublicEmetab AlgeriaEmetab EcuadorEmetab EstoniaEmetab MisiriEmetab" + + " EritreaEmetab SpainEmetab EthiopiaEmetab FinlandEmetab FijiIkwembey" + + "otab FalklandEmetab MicronesiaEmetab FranceEmetab GabonEmetab Kibage" + + "nge nebo UingerezaEmetab GrenadaEmetab GeorgiaEmetab Guiana nebo Ufa" + + "ransaEmetab GhanaEmetab GibraltarEmetab GreenlandEmetab GambiaEmetab" + + " GuineaEmetab GuadeloupeEmetab Equatorial GuineaEmetab GreeceEmetab " + + "GuatemalaEmetab GuamEmetab Guinea-BissauEmetab GuyanaEmetab Honduras" + + "Emetab CroatiaEmetab HaitiEmetab HungaryEmetab IndonesiaEmetab Irela" + + "ndEmetab IsraelEmetab IndiaKebebertab araraitab indian Ocean nebo Ui" + + "ngeresaEmetab IraqEmetab IranEmetab IcelandEmetab ItalyEmetab Jamaic" + + "aEmetab JordanEmetab JapanEmetab KenyaEmetab KyrgyzstanEmetab Cambod" + + "iaEmetab KiribatiEmetab ComorosEmetab Saint Kitts ak NevisEmetab Kor" + + "ea nebo murot katamEmetab korea nebo murot taiEmetab KuwaitIkwembeyo" + + "tab CaymanEmetab KazakhstanEmetab LaosEmetab LebanonEmetab Lucia NeE" + + "metab LiechtensteinEmetab Sri LankaEmetab LiberiaEmetab LesothoEmeta" + + "b LithuaniaEmetab LuxembourgEmetab LatviaEmetab LibyaEmetab MoroccoE" + + "metab MonacoEmetab MoldovaEmetab MadagascarIkwembeiyotab MarshallEme" + + "tab MacedoniaEmetab MaliEmetab MyanmarEmetab MongoliaIkwembeiyotab M" + + "ariana nebo murot katamEmetab MartiniqueEmetab MauritaniaEmetab Mont" + + "serratEmetab MaltaEmetab MauritiusEmetab MaldivesEmetab MalawiEmetab" + + " MexicoEmetab MalaysiaEmetab MozambiqueEmetab NamibiaEmetab New Cale" + + "doniaEmetab nigerIkwembeiyotab NorforkEmetab NigeriaEmetab Nicaragua" + + "Emetab HolandEmetab NorwayEmetab NepalEmetab NauruEmetab NiueEmetab " + + "New ZealandEmetab OmanEmetab PanamaEmetab PeruEmetab Polynesia nebo " + + "ufaransaEmetab Papua New GuineaEmetab PhilippinesEmetab PakistanEmet" + + "ab PolandEmetab Peter Ne titil ak MiquelonEmetab PitcairnEmetab Puer" + + "to RicoEmetab PalestineEmetab PortugalEmetab PalauEmetab ParaguayEme" + + "tab QatarEmetab RéunionEmetab RomaniaEmetab RussiaEmetab RwandaEmeta" + + "b Saudi ArabiaIkwembeiyotab SolomonEmetab SeychellesEmetab SudanEmet" + + "ab SwedenEmetab SingaporeEmetab Helena Ne tililEmetab SloveniaEmetab" + + " SlovakiaEmetab Sierra LeoneEmetab San MarinoEmetab SenegalEmetab So" + + "maliaEmetab SurinameEmetab São Tomé and PríncipeEmetab El SalvadorEm" + + "etab SyriaEmetab SwazilandIkwembeiyotab Turks ak CaicosEmetab ChadEm" + + "etab TogoEmetab ThailandEmetab TajikistanEmetab TokelauEmetab Timor " + + "nebo Murot taiEmetab TurkmenistanEmetab TunisiaEmetab TongaEmetab Tu" + + "rkeyEmetab Trinidad ak TobagoEmetab TuvaluEmetab TaiwanEmetab Tanzan" + + "iaEmetab UkrainieEmetab UgandaEmetab amerikaEmetab UruguayEmetab Uzi" + + "bekistaniEmetab VaticanEmetab Vincent netilil ak GrenadinesEmetab Ve" + + "nezuelaIkwembeyotab British VirginIkwemweiyotab AmerikaEmetab Vietna" + + "mEmetab VanuatuEmetab Walis ak FutunaEmetab SamoaEmetab YemenEmetab " + + "MayotteEmetab Afrika nebo Murot taiEmetab ZambiaEmetab Zimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x000e, 0x002a, 0x003c, 0x0055, 0x0064, 0x0072, + 0x0080, 0x0099, 0x00a6, 0x00a6, 0x00b6, 0x00cb, 0x00d9, 0x00e9, + 0x00f5, 0x00f5, 0x0106, 0x0122, 0x0131, 0x0142, 0x0150, 0x0163, + 0x0172, 0x0180, 0x018e, 0x019a, 0x019a, 0x01a8, 0x01b5, 0x01c3, + 0x01c3, 0x01d0, 0x01de, 0x01eb, 0x01eb, 0x01fa, 0x0208, 0x0215, + 0x0222, 0x0222, 0x0239, 0x0250, 0x026a, 0x027c, 0x0293, 0x02a4, + 0x02b0, 0x02bf, 0x02cb, 0x02da, 0x02da, 0x02eb, 0x02f6, 0x030d, + 0x030d, 0x030d, 0x031a, 0x032f, 0x033d, 0x033d, 0x034c, 0x035a, + // Entry 40 - 7F + 0x0369, 0x0382, 0x0390, 0x0390, 0x039e, 0x03ac, 0x03b9, 0x03b9, + 0x03c7, 0x03d3, 0x03e2, 0x03e2, 0x03f0, 0x03fb, 0x0410, 0x0421, + 0x0421, 0x042e, 0x043a, 0x0459, 0x0467, 0x0475, 0x0490, 0x0490, + 0x049c, 0x04ac, 0x04bc, 0x04c9, 0x04d6, 0x04e7, 0x04ff, 0x050c, + 0x050c, 0x051c, 0x0527, 0x053b, 0x0548, 0x0548, 0x0548, 0x0557, + 0x0565, 0x0571, 0x057f, 0x057f, 0x058f, 0x059d, 0x05aa, 0x05aa, + 0x05b6, 0x05e6, 0x05f1, 0x05fc, 0x060a, 0x0616, 0x0616, 0x0624, + 0x0631, 0x063d, 0x0649, 0x065a, 0x0669, 0x0678, 0x0686, 0x06a1, + // Entry 80 - BF + 0x06be, 0x06d9, 0x06e6, 0x06f9, 0x070a, 0x0715, 0x0723, 0x0732, + 0x0746, 0x0756, 0x0764, 0x0772, 0x0782, 0x0793, 0x07a0, 0x07ac, + 0x07ba, 0x07c7, 0x07d5, 0x07d5, 0x07d5, 0x07e6, 0x07fc, 0x080c, + 0x0817, 0x0825, 0x0834, 0x0834, 0x085a, 0x086b, 0x087c, 0x088d, + 0x0899, 0x08a9, 0x08b8, 0x08c5, 0x08d2, 0x08e1, 0x08f2, 0x0900, + 0x0914, 0x0920, 0x0935, 0x0943, 0x0953, 0x0960, 0x096d, 0x0979, + 0x0985, 0x0990, 0x09a2, 0x09ad, 0x09ba, 0x09c5, 0x09e3, 0x09fa, + 0x0a0c, 0x0a1b, 0x0a28, 0x0a49, 0x0a58, 0x0a6a, 0x0a7a, 0x0a89, + // Entry C0 - FF + 0x0a95, 0x0aa4, 0x0ab0, 0x0ab0, 0x0abf, 0x0acd, 0x0acd, 0x0ada, + 0x0ae7, 0x0afa, 0x0b0f, 0x0b20, 0x0b2c, 0x0b39, 0x0b49, 0x0b5f, + 0x0b6e, 0x0b6e, 0x0b7d, 0x0b90, 0x0ba1, 0x0baf, 0x0bbd, 0x0bcc, + 0x0bcc, 0x0beb, 0x0bfd, 0x0bfd, 0x0c09, 0x0c19, 0x0c19, 0x0c36, + 0x0c41, 0x0c41, 0x0c4c, 0x0c5b, 0x0c6c, 0x0c7a, 0x0c95, 0x0ca8, + 0x0cb6, 0x0cc2, 0x0ccf, 0x0ce8, 0x0cf5, 0x0d02, 0x0d11, 0x0d20, + 0x0d2d, 0x0d2d, 0x0d3b, 0x0d49, 0x0d5c, 0x0d6a, 0x0d8e, 0x0d9e, + 0x0db9, 0x0dce, 0x0ddc, 0x0dea, 0x0e00, 0x0e0c, 0x0e0c, 0x0e18, + // Entry 100 - 13F + 0x0e26, 0x0e42, 0x0e4f, 0x0e5e, + }, + }, + { // km + kmRegionStr, + kmRegionIdx, + }, + { // kn + knRegionStr, + knRegionIdx, + }, + { // ko + koRegionStr, + koRegionIdx, + }, + { // kok + "भारत", + []uint16{ // 113 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x000c, + }, + }, + { // ks + "اٮ۪نڑورامُتحدہ عرَب اماراتاَفغانَستاناٮ۪نٹِگُوا تہٕ باربوڑاانگوئیلااٮ۪لب" + + "انِیااَرمانِیانَیدَرلینٛڑٕس اٮ۪نٹَیلٕسانگولااینٹارٹِکاأرجَنٹینااَمر" + + "یٖکَن سَمواآسٹِیاآسٹریلِیااَروٗباایلینٛڑ جٔزیٖرٕآزَرباجانبوسنِیا تہ" + + "ٕ ہَرزِگووِناباربیڈاسبَنٛگلادیشبیٛلجِیَمبُرکِنا فیسوبَلجیرِیابحریٖن" + + "بورَنڈِبِنِنسینٛٹ بارتَھیلمیبٔرمیوڈابُرنٔےبولِوِیابرطانوی قُطبہِ جَ" + + "نوٗبی علاقہٕبرٛازِلبَہامَسبوٗٹانبووَٹ جٔزیٖرٕبوتَسوانابیلاروٗسبیلِج" + + "کینَڑاکوکَس کیٖلِنٛگ جٔزیٖرٕکونٛگو کِنشاسامرکٔزی اَفریٖکی جموٗریَتک" + + "ونٛگو بٔرٛزاوِلیسُوِزَرلینٛڑاَیوٕری کوسٹکُک جٔزیٖرٕچِلیکیٚمِروٗنچیٖ" + + "نکولَمبِیاکوسٹا رِکاکیوٗباکیپ ؤرڑیکرِسمَس جٔزیٖرٕسایفرٛسچیک جَموٗرِ" + + "یَتجرمٔنیجِبوٗتیڈینٛمارٕکڈومِنِکاڈومِنِکَن جموٗرِیَتاٮ۪لجیرِیااِکوا" + + "ڑورایسٹونِیامِسٔرمشرِقی سَہارااِرٕٹِیاسٕپیناِتھوپِیافِنلینٛڑفِجیفٕل" + + "اکلینٛڑ جٔزیٖرٕفرٛانسگیبانیُنایٹِڑ کِنٛگڈَمگرٛنیڑاجارجِیافرٛانسِسی " + + "گِاناگیوَنَرسےگاناجِبرالٹَرگریٖنلینٛڑگَمبِیاگِنیگَواڑیلوپاِکوِٹورِی" + + "َل گِنیگریٖسجنوٗبی جارجِیا تہٕ جنوٗبی سینٛڑوٕچ جٔزیٖرٕگوتیدالاگُوام" + + "گیٖنی بِساوگُیاناہانٛگ کانٛگ ایس اے آر چیٖنہَرٕڑ جٔزیٖرٕ تہٕ مٮ۪کڈو" + + "نالڑٕ جٔزیٖرٕہانٛڈوٗرِسکرٛوشِیاہایتیہَنٛگریاِنڑونیشِیااَیَرلینٛڑاِس" + + "رایٖلآیِل آف میٛنہِنٛدوستانبرطانوی بحرِ ہِنٛدۍ علاقہٕایٖراقایٖراناَ" + + "یِسلینٛڑاِٹلیجٔرسیجَمایکاجاپانکِنٛیاکِرگِستانکَمبوڑِیاکِرٕباتیکَمور" + + "َسسینٛٹ کِٹَس تہٕ نیوِسشُمٲلی کورِیاجنوٗبی کورِیاکُویتکیمَن جٔزیٖرٕ" + + "کَزاکِستانلاسلٮ۪بنانسینٛٹ لوٗسِیالِکٹیٛسٹیٖنسِریٖلَنٛکالایبیرِیالیس" + + "وتھولِتھُوانِیالَکسَمبٔرٕگلیٛٹوِیالِبیاموروکومونیٚکومولڑاوِیاموٹونی" + + "ٛگِریوسینٛٹ مارٹِنمیڑاگاسکارمارشَل جٔزیٖرٕمٮ۪سوڑونِیامالیمَیَنما بٔ" + + "رمامَنٛگولِیامَکاوو ایس اے آر چیٖنشُمٲلی مارِیانا جٔزیٖرٕمارٹِنِکما" + + "رٕٹانِیامانٛٹسیراٹمالٹامورِشَسمالدیٖوملاویمٮ۪کسِکومَلیشِیاموزَمبِکن" + + "امِبِیانِو کیلِڑونِیانایجَرنارفاک جٔزیٖرٕنایجیرِیاناکاراگُوانیٖدَرل" + + "ینٛڑناروےنیپالنارووٗنیوٗنیوٗزِلینٛڑاومانپَناماپیٖروٗفرٛانسی پولِنیش" + + "ِیاپاپُوا نیوٗ گیٖنیفِلِپِینسپاکِستانپولینٛڑسینٛٹ پیٖری تہٕ موکیلِی" + + "َنپِٹکیرٕنۍ جٔزیٖرٕپٔرٹو رِکوفَلَستیٖنپُرتِگالپَلاوپَراگُےقَطِرآوُٹ" + + "لاینِگ اوشینِیارِیوٗنِیَنرومانِیاسَربِیاروٗسروٗوانٛڈاسوٗدی عربِیہسو" + + "لامان جٔزیٖرٕسیشَلِسسوٗڈانسُوِڈَنٛسِنٛگاپوٗرسینٛٹ ہٮ۪لِناسَلووینِیا" + + "سَوالبریڑ تہٕ جان ماییڑسَلوواکِیاسیٖرالیوونسین میرِنوسینیگَلسومالِی" + + "اسُرِنامساو توم تہٕ پرٛنسِپیاٮ۪ل سَلواڑورشامسُوزِلینٛڑتُرُک تہٕ کیک" + + "وس جٔزیٖرٕچاڑفرٛانسِسی جَنوٗبی عَلاقہٕٹوگوتھایلینٛڑتاجکِستانتوکیلاو" + + "مَشرِقی تایمورتُرمِنِستانٹونیشِیاٹونٛگاتُرکیٹرٛنِنداد تہٕ ٹوبیگوتوٗ" + + "والوٗتایوانتَنجانِیایوٗرِکینیوٗگانٛڑایوٗنایٹِڑ سِٹیٹِس ماینَر آوُٹل" + + "ییِنٛگ جٔزیٖرٕیوٗنایٹِڑ سِٹیٹِسیوٗروگےاُزبِکِستانویٹِکَن سِٹیسینٛٹ " + + "وینسٮ۪ٹ تہٕ گرٛیناڑاینٕزوینازوٗلابَرطانوی ؤرجِن جٔزیٖرٕیوٗ ایس ؤرجِ" + + "ن جٔزیٖرٕویٹِناموانوٗتوٗوالِس تہٕ فیوٗچوٗناسیمووایَمَنمَییٹجَنوٗبی " + + "اَفریٖکاجامبِیازِمبابےنامعلوٗم تہٕ نالَگہار عَلاقہٕدُنیااَفریٖکاشُم" + + "ٲلی اَمریٖکاجَنوٗنی اَمرٖیٖکااوشَنیامَغریٖبی اَفریٖکامرکٔزی اَمریٖک" + + "امَشرِقی اَفریٖکاشُمٲلی اَفریٖکاوسطی اَفریٖکاجنوٗبی اَفریٖکااَمریٖک" + + "َسشُمٲلی اَمریٖکا خٕطہٕکَرِببیٖنمَشرِقی ایشیاجنوٗبی ایشیاجنوٗبہِ مَ" + + "شرِقی ایشیاجنوٗبی یوٗرَپآسٹریلیا تہٕ نِوزِلینٛڑمٮ۪لَنیٖشِیامَیکرونَ" + + "یشِیَن خٕطہٕپالنیشِیاایشیامرکٔزی ایشیامَغرِبی ایشیایوٗرَپمشرِقی یوٗ" + + "رَپشُمٲلی یوٗرَپمغرِبی یوٗرَپلاطیٖنی اَمریٖکا تہٕ کیرَبیٖن", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0010, 0x0032, 0x0048, 0x0072, 0x0082, 0x0096, + 0x00a8, 0x00d7, 0x00e3, 0x00f7, 0x0109, 0x0126, 0x0132, 0x0144, + 0x0152, 0x016f, 0x0181, 0x01ad, 0x01bd, 0x01d1, 0x01e3, 0x01fa, + 0x020c, 0x0218, 0x0226, 0x0230, 0x024f, 0x025f, 0x026b, 0x027b, + 0x02b2, 0x02c0, 0x02ce, 0x02da, 0x02f3, 0x0305, 0x0315, 0x031f, + 0x032b, 0x0355, 0x0370, 0x039e, 0x03bf, 0x03d7, 0x03ee, 0x0403, + 0x040b, 0x041d, 0x0425, 0x0437, 0x0437, 0x044a, 0x0456, 0x0465, + 0x0465, 0x0482, 0x0490, 0x04ab, 0x04b7, 0x04b7, 0x04c5, 0x04d7, + // Entry 40 - 7F + 0x04e7, 0x050c, 0x0520, 0x0520, 0x0530, 0x0542, 0x054c, 0x0565, + 0x0575, 0x057f, 0x0591, 0x0591, 0x05a1, 0x05a9, 0x05cc, 0x05cc, + 0x05cc, 0x05d8, 0x05e2, 0x0603, 0x0611, 0x061f, 0x063c, 0x064e, + 0x0656, 0x0668, 0x067c, 0x068a, 0x0692, 0x06a4, 0x06c5, 0x06cf, + 0x071e, 0x072e, 0x0738, 0x074d, 0x0759, 0x0788, 0x07ce, 0x07e2, + 0x07f2, 0x07fc, 0x080a, 0x080a, 0x0820, 0x0834, 0x0844, 0x085a, + 0x086e, 0x089f, 0x08ab, 0x08b7, 0x08cb, 0x08d5, 0x08df, 0x08ed, + 0x08ed, 0x08f7, 0x0903, 0x0915, 0x0927, 0x0937, 0x0945, 0x096c, + // Entry 80 - BF + 0x0985, 0x099e, 0x09a8, 0x09c1, 0x09d5, 0x09db, 0x09e9, 0x0a02, + 0x0a18, 0x0a2e, 0x0a40, 0x0a4e, 0x0a64, 0x0a7a, 0x0a8a, 0x0a94, + 0x0aa0, 0x0aae, 0x0ac0, 0x0ad8, 0x0aef, 0x0b03, 0x0b1e, 0x0b34, + 0x0b3c, 0x0b55, 0x0b69, 0x0b8f, 0x0bbb, 0x0bcb, 0x0bdf, 0x0bf3, + 0x0bfd, 0x0c0b, 0x0c19, 0x0c23, 0x0c33, 0x0c43, 0x0c53, 0x0c63, + 0x0c7e, 0x0c8a, 0x0ca5, 0x0cb7, 0x0ccb, 0x0ce1, 0x0ceb, 0x0cf5, + 0x0d01, 0x0d09, 0x0d1f, 0x0d29, 0x0d35, 0x0d41, 0x0d64, 0x0d84, + 0x0d96, 0x0da6, 0x0db4, 0x0de3, 0x0e04, 0x0e17, 0x0e29, 0x0e39, + // Entry C0 - FF + 0x0e43, 0x0e51, 0x0e5b, 0x0e80, 0x0e94, 0x0ea4, 0x0eb2, 0x0eba, + 0x0ecc, 0x0ee3, 0x0f00, 0x0f0e, 0x0f1a, 0x0f28, 0x0f3e, 0x0f57, + 0x0f6b, 0x0f96, 0x0faa, 0x0fbe, 0x0fd1, 0x0fdf, 0x0fef, 0x0ffd, + 0x0ffd, 0x1022, 0x103b, 0x103b, 0x1041, 0x1055, 0x1055, 0x1080, + 0x1086, 0x10b6, 0x10be, 0x10d0, 0x10e2, 0x10f0, 0x110b, 0x1121, + 0x1131, 0x113d, 0x1147, 0x116d, 0x117d, 0x1189, 0x119b, 0x11ab, + 0x11bd, 0x1211, 0x1232, 0x1240, 0x1256, 0x126d, 0x12a6, 0x12b8, + 0x12e2, 0x1309, 0x1317, 0x1327, 0x134b, 0x1357, 0x1357, 0x1361, + // Entry 100 - 13F + 0x136b, 0x138a, 0x1398, 0x13a6, 0x13dd, 0x13e7, 0x13f7, 0x1414, + 0x1435, 0x1443, 0x1464, 0x1481, 0x14a0, 0x14bd, 0x14d6, 0x14f3, + 0x1505, 0x152d, 0x153f, 0x1558, 0x156f, 0x1597, 0x15b0, 0x15dc, + 0x15f4, 0x161b, 0x162d, 0x1637, 0x164e, 0x1667, 0x1673, 0x168c, + 0x16a5, 0x16be, 0x16f5, + }, + }, + { // ksb + "AndolaFalme za KialabuAfuganistaniAntigua na BalbudaAnguillaAlbaniaAlmen" + + "iaAntili za UholanziAngolaAjentinaSamoa ya MalekaniAustliaAustlaliaA" + + "lubaAzabajaniBosnia na HezegovinaBabadosiBangladeshiBukinafasoBulgal" + + "iaBahaleniBulundiBeniniBelmudaBluneiBoliviaBlaziliBahamaButaniBotswa" + + "naBelalusiBelizeKanadaJamhuli ya Kidemoklasia ya KongoJamhuli ya Afr" + + "ika ya GatiKongoUswisiKodivaaVisiwa vya CookChileKameluniChinaKolomb" + + "iaKostalikaKubaKepuvedeKuplosiJamhuli ya ChekiUjeumaniJibutiDenmakiD" + + "ominikaJamhuli ya DominikaAljeliaEkwadoEstoniaMisliElitleaHispaniaUh" + + "abeshiUfiniFijiVisiwa vya FalklandMiklonesiaUfalansaGaboniUingeezaGl" + + "enadaJojiaGwiyana ya UfalansaGhanaJiblaltaGlinlandiGambiaGineGwadelu" + + "peGinekwetaUgiikiGwatemalaGwamGinebisauGuyanaHonduasiKolasiaHaitiHun" + + "galiaIndonesiaAyalandiIslaeliIndiaEneo ja Uingeeza mwe Bahali HindiI" + + "lakiUajemiAislandiItaliaJamaikaYoldaniJapaniKenyaKiigizistaniKambodi" + + "aKiibatiKomoloSantakitzi na NevisKolea KaskaziniKolea KusiniKuwaitiV" + + "isiwa vya KaymanKazakistaniLaosiLebanoniSantalusiaLishenteniSililank" + + "aLibeliaLesotoLitwaniaLasembagiLativiaLibyaMolokoMonakoMoldovaBukini" + + "Visiwa vya MashalMasedoniaMaliMyamaMongoliaVisiwa vya Maliana vya Ka" + + "skaziniMaltinikiMaulitaniaMontselatiMaltaMolisiModivuMalawiMeksikoMa" + + "lesiaMsumbijiNamibiaNyukaledoniaNaijaKisiwa cha NolfokNaijeliaNikala" + + "gwaUholanziNolweiNepaliNauluNiueNyuzilandiOmaniPanamaPeluPolinesia y" + + "a UfalansaPapuaFilipinoPakistaniPolandiSantapieli na MikeloniPitkail" + + "niPwetolikoUkingo wa Maghalibi na Ukanda wa Gaza wa PalestinaUlenoPa" + + "lauPalagwaiKataliLiyunioniLomaniaUlusiLwandaSaudiVisiwa vya SolomonS" + + "helisheliSudaniUswidiSingapooSantahelenaSloveniaSlovakiaSiela LeoniS" + + "amalinoSenegaliSomaliaSulinamuSao Tome na PlincipeElsavadoSiliaUswaz" + + "iVisiwa vya Tulki na KaikoChadiTogoTailandiTajikistaniTokelauTimoli " + + "ya MashalikiTulukimenistaniTunisiaTongaUtulukiTlinidad na TobagoTuva" + + "luTaiwaniTanzaniaUklainiUgandaMalekaniUlugwaiUzibekistaniVatikaniSan" + + "tavisenti na GlenadiniVenezuelaVisiwa vya Vilgin vya UingeezaVisiwa " + + "vya Vilgin vya MalekaniVietinamuVanuatuWalis na FutunaSamoaYemeniMay" + + "otteAflika KusiniZambiaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, + 0x004a, 0x005c, 0x0062, 0x0062, 0x006a, 0x007b, 0x0082, 0x008b, + 0x0090, 0x0090, 0x0099, 0x00ad, 0x00b5, 0x00c0, 0x00c0, 0x00ca, + 0x00d2, 0x00da, 0x00e1, 0x00e7, 0x00e7, 0x00ee, 0x00f4, 0x00fb, + 0x00fb, 0x0102, 0x0108, 0x010e, 0x010e, 0x0116, 0x011e, 0x0124, + 0x012a, 0x012a, 0x014a, 0x0163, 0x0168, 0x016e, 0x0175, 0x0184, + 0x0189, 0x0191, 0x0196, 0x019e, 0x019e, 0x01a7, 0x01ab, 0x01b3, + 0x01b3, 0x01b3, 0x01ba, 0x01ca, 0x01d2, 0x01d2, 0x01d8, 0x01df, + // Entry 40 - 7F + 0x01e7, 0x01fa, 0x0201, 0x0201, 0x0207, 0x020e, 0x0213, 0x0213, + 0x021a, 0x0222, 0x022a, 0x022a, 0x022f, 0x0233, 0x0246, 0x0250, + 0x0250, 0x0258, 0x025e, 0x0266, 0x026d, 0x0272, 0x0285, 0x0285, + 0x028a, 0x0292, 0x029b, 0x02a1, 0x02a5, 0x02ae, 0x02b7, 0x02bd, + 0x02bd, 0x02c6, 0x02ca, 0x02d3, 0x02d9, 0x02d9, 0x02d9, 0x02e1, + 0x02e8, 0x02ed, 0x02f5, 0x02f5, 0x02fe, 0x0306, 0x030d, 0x030d, + 0x0312, 0x0333, 0x0338, 0x033e, 0x0346, 0x034c, 0x034c, 0x0353, + 0x035a, 0x0360, 0x0365, 0x0371, 0x0379, 0x0380, 0x0386, 0x0399, + // Entry 80 - BF + 0x03a8, 0x03b4, 0x03bb, 0x03cc, 0x03d7, 0x03dc, 0x03e4, 0x03ee, + 0x03f8, 0x0401, 0x0408, 0x040e, 0x0416, 0x041f, 0x0426, 0x042b, + 0x0431, 0x0437, 0x043e, 0x043e, 0x043e, 0x0444, 0x0455, 0x045e, + 0x0462, 0x0467, 0x046f, 0x046f, 0x048f, 0x0498, 0x04a2, 0x04ac, + 0x04b1, 0x04b7, 0x04bd, 0x04c3, 0x04ca, 0x04d1, 0x04d9, 0x04e0, + 0x04ec, 0x04f1, 0x0502, 0x050a, 0x0513, 0x051b, 0x0521, 0x0527, + 0x052c, 0x0530, 0x053a, 0x053f, 0x0545, 0x0549, 0x055e, 0x0563, + 0x056b, 0x0574, 0x057b, 0x0591, 0x059a, 0x05a3, 0x05d5, 0x05da, + // Entry C0 - FF + 0x05df, 0x05e7, 0x05ed, 0x05ed, 0x05f6, 0x05fd, 0x05fd, 0x0602, + 0x0608, 0x060d, 0x061f, 0x0629, 0x062f, 0x0635, 0x063d, 0x0648, + 0x0650, 0x0650, 0x0658, 0x0663, 0x066b, 0x0673, 0x067a, 0x0682, + 0x0682, 0x0696, 0x069e, 0x069e, 0x06a3, 0x06a9, 0x06a9, 0x06c2, + 0x06c7, 0x06c7, 0x06cb, 0x06d3, 0x06de, 0x06e5, 0x06f8, 0x0707, + 0x070e, 0x0713, 0x071a, 0x072c, 0x0732, 0x0739, 0x0741, 0x0748, + 0x074e, 0x074e, 0x0756, 0x075d, 0x0769, 0x0771, 0x078a, 0x0793, + 0x07b1, 0x07cf, 0x07d8, 0x07df, 0x07ee, 0x07f3, 0x07f3, 0x07f9, + // Entry 100 - 13F + 0x0800, 0x080d, 0x0813, 0x081b, + }, + }, + { // ksf + "andɔrǝbǝlɔŋ bǝ kaksa bɛ táatáaŋzǝnafganistáŋantiga ri barbúdaangiyaalban" + + "íarmɛníantíyǝ nɛlandéangólaarjǝntínsamɔa a amɛrikaotricɔstralíaruba" + + "azabecánbɔsnyɛ ri hɛrsǝgɔvínbaabaadǝbaŋladɛ́cbɛljíkbukína fǝ́ asɔbul" + + "garíbarǝ́nburundíbɛnǝ́nbɛɛmúdǝbrunǝ́bɔɔlívíbrɛsílbaamásbutánbotswana" + + "bɛlarisbɛlizkanadakɔngó anyɔ́nsantrafríkkɔngóswískɔtiwuárzɛ i kúkcíl" + + "ikamɛrúncínkolɔmbíkɔstaríkakubakapvɛrcíprɛcɛ́kdjɛrmandyibutídanmakdɔ" + + "minikdɔminik rɛpublíkaljɛríɛkwatɛǝ́ɛstoníɛjíptɛritrɛ́kpanyáɛtyɔpífín" + + "lanfíjizǝ maalwínmikronɛ́sipɛrɛsǝ́gabɔŋkǝlɔŋ kǝ kǝtáatáaŋzǝngrɛnadǝj" + + "ɔrjíguyán i pɛrɛsǝ́gánajibraltágrínlangambíginɛ́gwadɛlúpginɛ́ ɛkwat" + + "ɔrialgrɛ́kgwátǝmalagwámginɛ́ bisɔ́guyánɔnduraskrwasíayitiɔngríindon" + + "ɛsíilánisraɛ́lindízǝ ingɛrís ncɔ́m wa indiirákiráŋzǝ i glásitalíjam" + + "aíkjɔrdánjapɔ́ŋkɛnyakigistáŋkambodjkiribátikomɔrsɛnkrǝstɔ́f ri nyɛ́v" + + "ǝkorɛanɔ́rkorɛasudkuwɛitzǝ i gankazakstáŋlaɔslibáŋsɛntlísílictɛnstɛ" + + "́nsrílaŋkalibɛryalǝsótolitwaníluksɛmbúrlɛtonílibímarɔkmonakomɔldaví" + + "madagaskazǝ i marcálmásǝdwánmalimyanmármɔŋolízǝ maryánnɔ́rmatiníkmwa" + + "ritanímɔnsɛratmaltǝmwarísmaldivǝmalawimɛksíkmalɛsímosambíknamibíkalɛ" + + "doní anyɔ́nnijɛ́rzɛ nɔ́fɔlknijɛ́ryaníkarágwakǝlɔŋ kǝ ázǝnɔrvɛjǝnɛpal" + + "nwarúniwɛ́zɛlan anyɔ́nomanpanamapɛrúpɔlinɛsí a pɛrɛsǝ́papwazí ginɛ́ " + + "anyɔ́nfilipǝ́npakistáŋpolɔ́nsɛnpyɛr ri mikɛlɔŋpitkɛ́npɔtoríkozǝ palɛ" + + "stínǝportugálpalwaparagwɛ́katárɛunyɔŋrɔmanírisírwandaarabí saodízǝ s" + + "alomɔ́nsɛcɛlsudanswɛdǝsiŋapósɛntɛ́lenslovɛníslovakísyɛraleonsɛnmarǝn" + + "sɛnɛgalsomalísurinamsaotomɛ́ ri priŋsibsalvadɔrsiríswazilanzǝ tirk r" + + "i kakɔscaádtogotɛlantadjikistaŋtokǝlaotimor anǝ á ɛsttirkmɛnistaŋtun" + + "ɛsítɔŋatirkítɛrinitɛ ri tobagotuwalutɛwántanzaníukrainugandaamɛrika" + + "urugwɛ́usbɛkistaŋwatikáŋsɛnvǝnsǝŋ ri grɛnadínwɛnǝzwɛlazǝ bɛ gɔn inɛ " + + "a ingɛríszǝ bɛ gɔn inɛ á amɛrikawyɛtnámwanwatuwalis ri futunasamɔayɛ" + + "mɛnmayɔ́tafrik anǝ a sudzambízimbabwɛ́", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0008, 0x002d, 0x0039, 0x004b, 0x0051, 0x0058, + 0x0060, 0x0072, 0x0079, 0x0079, 0x0083, 0x0094, 0x0099, 0x00a2, + 0x00a7, 0x00a7, 0x00b0, 0x00ca, 0x00d3, 0x00df, 0x00e7, 0x00f9, + 0x0101, 0x0109, 0x0111, 0x011a, 0x011a, 0x0125, 0x012d, 0x0138, + 0x0138, 0x0140, 0x0147, 0x014d, 0x014d, 0x0155, 0x015d, 0x0163, + 0x0169, 0x0169, 0x0179, 0x0184, 0x018b, 0x0190, 0x019a, 0x01a4, + 0x01a9, 0x01b2, 0x01b6, 0x01bf, 0x01bf, 0x01ca, 0x01ce, 0x01d5, + 0x01d5, 0x01d5, 0x01dc, 0x01e2, 0x01ea, 0x01ea, 0x01f2, 0x01f8, + // Entry 40 - 7F + 0x0200, 0x0213, 0x021b, 0x021b, 0x0227, 0x022f, 0x0236, 0x0236, + 0x0240, 0x0247, 0x0250, 0x0250, 0x0257, 0x025c, 0x0268, 0x0274, + 0x0274, 0x027f, 0x0286, 0x02a4, 0x02ad, 0x02b4, 0x02c8, 0x02c8, + 0x02cd, 0x02d6, 0x02de, 0x02e4, 0x02eb, 0x02f5, 0x0309, 0x0310, + 0x0310, 0x031b, 0x0320, 0x032f, 0x0335, 0x0335, 0x0335, 0x033d, + 0x0344, 0x0349, 0x0350, 0x0350, 0x035a, 0x035f, 0x0368, 0x0368, + 0x036d, 0x038a, 0x038f, 0x0395, 0x03a0, 0x03a6, 0x03a6, 0x03ad, + 0x03b5, 0x03be, 0x03c4, 0x03ce, 0x03d5, 0x03de, 0x03e4, 0x0400, + // Entry 80 - BF + 0x040c, 0x0415, 0x041c, 0x0425, 0x0430, 0x0435, 0x043c, 0x0447, + 0x0455, 0x045f, 0x0467, 0x046f, 0x0477, 0x0482, 0x048a, 0x048f, + 0x0495, 0x049b, 0x04a4, 0x04a4, 0x04a4, 0x04ad, 0x04ba, 0x04c5, + 0x04c9, 0x04d1, 0x04da, 0x04da, 0x04eb, 0x04f3, 0x04fd, 0x0507, + 0x050d, 0x0514, 0x051c, 0x0522, 0x052a, 0x0532, 0x053b, 0x0542, + 0x0555, 0x055d, 0x056b, 0x0575, 0x0580, 0x0592, 0x059c, 0x05a2, + 0x05a8, 0x05af, 0x05be, 0x05c2, 0x05c8, 0x05ce, 0x05e7, 0x0600, + 0x060a, 0x0614, 0x061c, 0x0633, 0x063c, 0x0646, 0x0656, 0x065f, + // Entry C0 - FF + 0x0664, 0x066e, 0x0673, 0x0673, 0x067d, 0x0685, 0x0685, 0x068a, + 0x0690, 0x069d, 0x06ab, 0x06b2, 0x06b7, 0x06be, 0x06c6, 0x06d2, + 0x06db, 0x06db, 0x06e3, 0x06ed, 0x06f7, 0x0700, 0x0707, 0x070e, + 0x070e, 0x0724, 0x072d, 0x072d, 0x0732, 0x073a, 0x073a, 0x074c, + 0x0751, 0x0751, 0x0755, 0x075b, 0x0767, 0x076f, 0x0781, 0x078f, + 0x0797, 0x079d, 0x07a3, 0x07b7, 0x07bd, 0x07c4, 0x07cc, 0x07d2, + 0x07d8, 0x07d8, 0x07e0, 0x07e9, 0x07f5, 0x07fe, 0x0819, 0x0825, + 0x0842, 0x085f, 0x0868, 0x086f, 0x087e, 0x0884, 0x0884, 0x088b, + // Entry 100 - 13F + 0x0893, 0x08a3, 0x08a9, 0x08b4, + }, + }, + { // ksh + "AßensionAndorraVereinschte Arrabesche EmmirateAfjaanistahnAntigwa un Bar" + + "budaAnggwillaAlbaanijeArrmeenijede Nederlängsche AntilleAngjoolader " + + "SödpolAjjentiinijeAmmerikaanesch SammohaÖösterischAustraalijeArubade" + + " Ohland-EnselleAsserbaidschahnBoßnije un Herzegovinade Ensel Barbado" + + "sBangladeschBelljeBukkinna-FaaseBulljaarijeBachrainBurundidä Beninde" + + " Zint Battälmi-Ensellede BermudasBruneiBolliivijede karribbesche Ned" + + "erlängBrasilijede BahamasButtaande Buvee-EnselBozwaanaWießrußlandBel" + + "izeKanadade Kokkos-Enselledä Konggo (Kinschasa)de Zäntraalaffrikaane" + + "sche Republikdä Konggo (Brassavill)de SchweizÄlfebeijn-Kößde Kuuk-En" + + "selleSchiileKammeruhnSchiinaKolumbijede Klipperton-EnselKostarikaKub" + + "ade kapvärdesche EnselleCuraçaode Weihnaachs-EnselZüpperede Tschäsch" + + "eiDoütschlandde Diego-Garcia-EnselDschibuttiDänemarkDominnikade Domm" + + "enekaanesche ReppublikAlljeerijeZe’uta un MeliijaÄkwadorÄßlandÄjüpte" + + "Wäß-SaharaÄritrejaSchpaanijeÄttijoopijede Europäjesche UnijonFinnlan" + + "dde Fidschi-Endellede Falkland-EnselleMikroneesijede Färrör-EnselleF" + + "rankrischJabuhnJruußbrettannijeJrenaadaJeorrjijeFranzüüsesch Jujaana" + + "JöönseiJaanaJibralltaaJröhnlandJambijaJinnehaJuadeluppÄquatorial Jin" + + "eejaJrieschelandSöd-Jeorjie un de södlijje Botteramms-EnselleJuwatem" + + "aalaJuhamJinneha_BißauJujaanaHongkongde Heart Ensel un de McDonald-E" + + "nselleHondurasKrowazijeHa’ittiUnjannde Kannaresche EnselleIndoneesij" + + "eIrrlandIßraälde Ensel MänIndijeBrettesche Besezunge em indesche Ooz" + + "ejahnIrakPersijeIßlandItaalijeJöösehJammaikaJordaanijeJapanKeenijaKi" + + "rrjiisijeKambodschaKiribatide KommooreZint Kitts un NevisNood-Koreja" + + "Söd-KorejaKuweitde Kaiman-EnselleKassakstahnLa’osLebbannonde Ensel Z" + + "int-LutschaLischteschteinSri LankaLibeerijaLesootoLittaueLuxembursch" + + "LätlandLibbijeMarokkoMonakkoMoldaavijeet Monteneejrode Zint-Määtes-E" + + "nselMaddajaskade Machschall-EnselleMazedoonijeMaaliBirmaMongjoleiMak" + + "aude nöödlijje Marijanne-EnselleMachtinikMautitaanijeMongßerratMalta" + + "MaurizijusMallediiveMalawiMäxikoMalaisijeMosambikNamiibijeNeuschottl" + + "andNijerde Noofok-EnselNikaraaguaNikaraaguwade NederlängNorrweejeNep" + + "allNauruNiueNeuseelandOmanPannamaPerruhFranzüüsesch PollineesijePapu" + + "wa NeujineejaFillipiinePakistahnPoleZint Pjäär un Mikelongde Pitkärn" + + "-EnselPochtorikoPalästinaPochtojallPallauParraguwaiKataaOzejaanije u" + + "ßerhallefRehunjohnRomäänijeSärbijeRußlandRuandaSaudi Arraabijede So" + + "lomone-Ensellede SeischälleNoodsudahnSchweedeSingjapuurde Ensel Zint" + + " Hellenaẞloveenijede Enselle Svalbard un Jan MayenẞlovakeiSjärra Lej" + + "oneSan-Marinoder SennejallSomaalijeSürinammSödsudahnZint Tommeh un P" + + "rintschipeÄl SlavadoorZint MaartenSürijeẞwaasilandTristan da Cunjade" + + " Enselle Turks un Kaikosder TschaddFranzüüsesche Södsee-EnselleToojo" + + "TailandTadschikistahnTokelauOß-TimorTurkmenistahnTuneesijeTonggade T" + + "örkeiTrinidad un TobääjoTuvaluTaiwanTansanijade Ukra’iineUjandade V" + + "ereineschte Schtaate vun Amärrika ier ußerhallef jelääje Enselschede" + + " vereineschte Schtaate vun AmmärrikaUrrujwaiUßbeekistahnder Vattikah" + + "nZint Vinzänz un de Jrenadines-EnselleVenezuelade brettesche Juffer-" + + "Ensellede ammärrikahnesche Juffer-EnselleVijätnammVanuatuWallis un F" + + "utunaSammohaKosovoJämmeMajottde Republik SödaffrikaSambijaSimbabwe- " + + "Jääjend onbikannt -de ÄädAffrikaNood-AmärrikaSöd-AmärrikaOzejaanijeW" + + "äß-AffrikaMeddelammärrikaOß-AffrikaNood-AffrikaMeddel-AffrikaSöd-Af" + + "frikaAmmärrikader Norde vun Amärrikade KarribikOß-AasijeSöd-AasijeSö" + + "d-Oß-AasijeSöd-Europpade Rejjohn öm AustraalijeMellaneesijede Rejohn" + + " vun MikroneesejePolineesijeAasijeMeddelaasijeWäß-AasijeEuroppaOß-Eu" + + "roppaNood-EuroppaWäß-EuroppaLateinamärrika", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0009, 0x0010, 0x002f, 0x003b, 0x004d, 0x0056, 0x005f, + 0x0069, 0x0082, 0x008a, 0x0095, 0x00a1, 0x00b7, 0x00c3, 0x00ce, + 0x00d3, 0x00e4, 0x00f3, 0x010a, 0x011b, 0x0126, 0x012c, 0x013a, + 0x0145, 0x014d, 0x0154, 0x015d, 0x0176, 0x0181, 0x0187, 0x0191, + 0x01ab, 0x01b4, 0x01be, 0x01c5, 0x01d3, 0x01db, 0x01e8, 0x01ee, + 0x01f4, 0x0205, 0x021b, 0x023e, 0x0255, 0x025f, 0x026f, 0x027e, + 0x0285, 0x028e, 0x0295, 0x029e, 0x02b1, 0x02ba, 0x02be, 0x02d6, + 0x02de, 0x02f1, 0x02f9, 0x0307, 0x0313, 0x0328, 0x0332, 0x033b, + // Entry 40 - 7F + 0x0344, 0x0361, 0x036b, 0x037e, 0x0386, 0x038e, 0x0396, 0x03a2, + 0x03ab, 0x03b5, 0x03c1, 0x03d8, 0x03e0, 0x03f2, 0x0405, 0x0411, + 0x0424, 0x042e, 0x0434, 0x0445, 0x044d, 0x0456, 0x046c, 0x0475, + 0x047a, 0x0484, 0x048e, 0x0495, 0x049c, 0x04a5, 0x04b8, 0x04c4, + 0x04f3, 0x04fe, 0x0503, 0x0511, 0x0518, 0x0520, 0x0545, 0x054d, + 0x0556, 0x055f, 0x0565, 0x057b, 0x0586, 0x058d, 0x0595, 0x05a2, + 0x05a8, 0x05d1, 0x05d5, 0x05dc, 0x05e3, 0x05eb, 0x05f3, 0x05fb, + 0x0605, 0x060a, 0x0611, 0x061c, 0x0626, 0x062e, 0x0639, 0x064c, + // Entry 80 - BF + 0x0657, 0x0662, 0x0668, 0x0679, 0x0684, 0x068b, 0x0694, 0x06a9, + 0x06b7, 0x06c0, 0x06c9, 0x06d0, 0x06d7, 0x06e2, 0x06ea, 0x06f1, + 0x06f8, 0x06ff, 0x0709, 0x0717, 0x072d, 0x0737, 0x074c, 0x0757, + 0x075c, 0x0761, 0x076a, 0x076f, 0x078f, 0x0798, 0x07a4, 0x07af, + 0x07b4, 0x07be, 0x07c8, 0x07ce, 0x07d5, 0x07de, 0x07e6, 0x07ef, + 0x07fc, 0x0801, 0x0810, 0x081a, 0x0825, 0x0832, 0x083b, 0x0841, + 0x0846, 0x084a, 0x0854, 0x0858, 0x085f, 0x0865, 0x0880, 0x0891, + 0x089b, 0x08a4, 0x08a8, 0x08c0, 0x08d1, 0x08db, 0x08e5, 0x08ef, + // Entry C0 - FF + 0x08f5, 0x08ff, 0x0904, 0x091a, 0x0923, 0x092e, 0x0936, 0x093e, + 0x0944, 0x0953, 0x0966, 0x0974, 0x097e, 0x0986, 0x0990, 0x09a5, + 0x09b1, 0x09d1, 0x09db, 0x09e9, 0x09f3, 0x0a00, 0x0a09, 0x0a12, + 0x0a1c, 0x0a36, 0x0a43, 0x0a4f, 0x0a56, 0x0a62, 0x0a72, 0x0a8c, + 0x0a97, 0x0ab6, 0x0abb, 0x0ac2, 0x0ad0, 0x0ad7, 0x0ae0, 0x0aed, + 0x0af6, 0x0afc, 0x0b06, 0x0b1b, 0x0b21, 0x0b27, 0x0b30, 0x0b3e, + 0x0b44, 0x0b8e, 0x0bb5, 0x0bbd, 0x0bca, 0x0bd7, 0x0bfd, 0x0c06, + 0x0c22, 0x0c45, 0x0c4f, 0x0c56, 0x0c66, 0x0c6d, 0x0c73, 0x0c79, + // Entry 100 - 13F + 0x0c7f, 0x0c96, 0x0c9d, 0x0ca5, 0x0cbc, 0x0cc4, 0x0ccb, 0x0cd9, + 0x0ce7, 0x0cf1, 0x0cfe, 0x0d0e, 0x0d19, 0x0d25, 0x0d33, 0x0d3f, + 0x0d49, 0x0d60, 0x0d6b, 0x0d75, 0x0d80, 0x0d8f, 0x0d9b, 0x0db5, + 0x0dc1, 0x0ddb, 0x0de6, 0x0dec, 0x0df8, 0x0e04, 0x0e0b, 0x0e16, + 0x0e22, 0x0e2f, 0x0e3e, + }, + }, + { // kw + "Rywvaneth Unys", + []uint16{ // 84 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x000e, + }, + }, + { // ky + kyRegionStr, + kyRegionIdx, + }, + { // lag + "AndóraɄtemi wa KɨaráabuAfuganisitáaniAntigúua na BaribúudaAnguíilaAlubán" + + "iaAriméniaAntili ya ɄholáanziAngóolaAjentíinaSamóoa ya Amerɨ́kaÁusit" + + "iriaAusiteréeliaArúubaAzabajáaniBósiniaBabadóosiBangaladéeshiɄbeligí" + + "ijiBukinafáasoBuligaríaBaharéeniBurúundiBeníiniBerimúudaBurunéeiBolí" + + "viaBrasíiliBaháamaButáaniBotiswáanaBelarúusiBelíiseKánadaJamuhúuri y" + + "a Kɨdemokurasía ya KóongoJuhúuri ya Afɨrɨka ya katɨ katɨKóongoUswíis" + + "iIvori KositiVisíiwa vya KúukuChíileKamerúuniChíinaKolómbiaKósita Rɨ" + + "́ɨkaKyúubaKepuvéedeKupuróosiJamuhúuri ya ChéekiɄjerumáaniJibúutiDen" + + "imakiDomínɨkaJamuhúuri ya DominɨkaAlijériaÍkwadoEstoníaMísiriEritere" + + "aHisipániaɄhabéeshiUfíiniFíijiVisíiwa vya FakulandiMikironésiaɄfaráa" + + "nsaGabóoniɄɨngeréesaGirenáadaJójiaGwiyáana yʉ ɄfaráansaGáanaJiburáli" + + "taGiriniláandiGámbiaGíineGwadelúupeGíine IkwéetaUgiríkiGwatemáalaGwa" + + "niGíine BisáauGuyáanaHonduráasiKoréshiaHaíitiHungáriaIndonésiaAyaláa" + + "ndiIsiraéeliÍndiaƗsɨ yʉ Ʉɨngeréesa irivii ra HíindiIráakiɄajéemiAisi" + + "láandiItáliaJamáikaJódaniJapáaniKéenyaKirigisitáaniKambódiaKiribáati" + + "KomóoroMʉtakatíifu kitisi na NevíisiKoréa yʉ ʉtʉrʉkoKoréa ya SaameKʉ" + + "wáitiVisíiwa vya KayimaniKazakasitáaniLaóosiLebanóoniMʉtakatíifu Lus" + + "íiaLishentéeniSiriláankaLiibériaLesóotoLisuániaLasembáagiLativiaLíb" + + "iaMoróokoMonáakoMolidóovaBukíiniVisíiwa vya MarisháaliMasedóniaMáali" + + "MiáamaMongóliaVisiwa vya Mariana vya KaskaziniMaritiníikiMoritániaMo" + + "nteráatiMálitaMoríisiModíivuMaláawiMekisikoMaleísiaMusumbíijiNamíbia" + + "Kaledónia IfyaNíijaKisíiwa cha NofifóokiNiijériaNikarágʉaɄholáanziNo" + + "rweNepáaliNaúuruNiúueNyuzílandiÓmaniPanáamaPéeruPolinésia yʉ Ʉfaráan" + + "saPapúuaUfilipíinoPakisitáaniPólandiMʉtakatíifu Peéteri na MɨkaéeliP" + + "atikaíriniPwetorɨ́ɨkoMweemberera wa kʉmweeri wa GáazaɄréenoPaláauPar" + + "aguáaiKatáariReyunióoniRomaníiaUrúusiRwáandaSaudíia ArabíiaVisíiwa v" + + "ya SolomóoniShelishéeliSudáaniUswíidiSingapooMʉtakatíifu HeléenaSulo" + + "véniaSulováakiaSeraleóoniSamaríinoSenegáaliSomáliaSurináamuSao Tóome" + + " na PirinsipeElisalivadoSíriaɄswáaziVisíiwa vya Turíiki na KaíikoChá" + + "adiTóogoTáilandiTajikisitáaniTokeláauTimóori yi ItʉʉmbaUturukimenisi" + + "táaniTunísiaTóongaUturúukiTiriníida ya TobáagoTuváaluTaiwáaniTaansan" + + "íaɄkɨréeniɄgáandaAmerɨkaUruguáaiUsibekisitáaniVatikáaniMʉtakatíifu " + + "Viséenti na GernadíiniVenezuéelaVisíiwa vya Vigíini vya ɄɨngeréesaVi" + + "síiwa vya Vigíini vya Amerɨ́kaVietináamuVanuáatuWalíisi na FutúunaSa" + + "móoaYémeniMayóoteAfɨrɨka ya SaameSámbiaSimbáabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x001b, 0x002a, 0x0041, 0x004a, 0x0053, + 0x005c, 0x0071, 0x0079, 0x0079, 0x0083, 0x0098, 0x00a2, 0x00af, + 0x00b6, 0x00b6, 0x00c1, 0x00c9, 0x00d3, 0x00e1, 0x00ed, 0x00f9, + 0x0103, 0x010d, 0x0116, 0x011e, 0x011e, 0x0128, 0x0131, 0x0139, + 0x0139, 0x0142, 0x014a, 0x0152, 0x0152, 0x015d, 0x0167, 0x016f, + 0x0176, 0x0176, 0x019e, 0x01c2, 0x01c9, 0x01d1, 0x01dd, 0x01f0, + 0x01f7, 0x0201, 0x0208, 0x0211, 0x0211, 0x0222, 0x0229, 0x0233, + 0x0233, 0x0233, 0x023d, 0x0252, 0x025e, 0x025e, 0x0266, 0x026e, + // Entry 40 - 7F + 0x0278, 0x028f, 0x0298, 0x0298, 0x029f, 0x02a7, 0x02ae, 0x02ae, + 0x02b6, 0x02c0, 0x02cb, 0x02cb, 0x02d2, 0x02d8, 0x02ee, 0x02fa, + 0x02fa, 0x0305, 0x030d, 0x031a, 0x0324, 0x032a, 0x0343, 0x0343, + 0x0349, 0x0354, 0x0361, 0x0368, 0x036e, 0x0379, 0x0388, 0x0390, + 0x0390, 0x039b, 0x03a0, 0x03ae, 0x03b6, 0x03b6, 0x03b6, 0x03c1, + 0x03ca, 0x03d1, 0x03da, 0x03da, 0x03e4, 0x03ee, 0x03f8, 0x03f8, + 0x03fe, 0x0427, 0x042e, 0x0437, 0x0442, 0x0449, 0x0449, 0x0451, + 0x0458, 0x0460, 0x0467, 0x0475, 0x047e, 0x0488, 0x0490, 0x04b0, + // Entry 80 - BF + 0x04c5, 0x04d4, 0x04dd, 0x04f2, 0x0500, 0x0507, 0x0511, 0x0526, + 0x0532, 0x053d, 0x0546, 0x054e, 0x0557, 0x0562, 0x0569, 0x056f, + 0x0577, 0x057f, 0x0589, 0x0589, 0x0589, 0x0591, 0x05a9, 0x05b3, + 0x05b9, 0x05c0, 0x05c9, 0x05c9, 0x05e9, 0x05f5, 0x05ff, 0x060a, + 0x0611, 0x0619, 0x0621, 0x0629, 0x0631, 0x063a, 0x0645, 0x064d, + 0x065c, 0x0662, 0x0679, 0x0682, 0x068d, 0x0698, 0x069d, 0x06a5, + 0x06ac, 0x06b2, 0x06bd, 0x06c3, 0x06cb, 0x06d1, 0x06eb, 0x06f2, + 0x06fd, 0x0709, 0x0711, 0x0735, 0x0741, 0x074f, 0x0771, 0x0779, + // Entry C0 - FF + 0x0780, 0x078a, 0x0792, 0x0792, 0x079d, 0x07a6, 0x07a6, 0x07ad, + 0x07b5, 0x07c6, 0x07dd, 0x07e9, 0x07f1, 0x07f9, 0x0801, 0x0817, + 0x0821, 0x0821, 0x082c, 0x0837, 0x0841, 0x084b, 0x0853, 0x085d, + 0x085d, 0x0874, 0x087f, 0x087f, 0x0885, 0x088e, 0x088e, 0x08ae, + 0x08b5, 0x08b5, 0x08bb, 0x08c4, 0x08d2, 0x08db, 0x08f0, 0x0903, + 0x090b, 0x0912, 0x091b, 0x0931, 0x0939, 0x0942, 0x094c, 0x0957, + 0x0960, 0x0960, 0x0968, 0x0971, 0x0980, 0x098a, 0x09b0, 0x09bb, + 0x09e2, 0x0a06, 0x0a11, 0x0a1a, 0x0a2e, 0x0a35, 0x0a35, 0x0a3c, + // Entry 100 - 13F + 0x0a44, 0x0a56, 0x0a5d, 0x0a67, + }, + }, + { // lb + "AscensionAndorraVereenegt Arabesch EmiraterAfghanistanAntigua a BarbudaA" + + "nguillaAlbanienArmenienAngolaAntarktisArgentinienAmerikanesch-SamoaÉ" + + "isträichAustralienArubaÅlandinselenAserbaidschanBosnien an Herzegowi" + + "naBarbadosBangladeschBelschBurkina FasoBulgarienBahrainBurundiBeninS" + + "aint-BarthélemyBermudaBruneiBolivienKaribescht HollandBrasilienBaham" + + "asBhutanBouvetinselBotsuanaWäissrusslandBelizeKanadaKokosinselenKong" + + "o-KinshasaZentralafrikanesch RepublikKongo-BrazzavilleSchwäizCôte d’" + + "IvoireCookinselenChileKamerunChinaKolumbienClipperton-InselCosta Ric" + + "aKubaKap VerdeCuraçaoChrëschtdagsinselZypernTschechienDäitschlandDie" + + "go GarciaDschibutiDänemarkDominicaDominikanesch RepublikAlgerienCeut" + + "a a MelillaEcuadorEstlandEgyptenWestsaharaEritreaSpanienEthiopienEur" + + "opäesch UniounFinnlandFidschiFalklandinselenMikronesienFäröerFrankrä" + + "ichGabunGroussbritannienGrenadaGeorgienGuayaneGuernseyGhanaGibraltar" + + "GrönlandGambiaGuineaGuadeloupeEquatorialguineaGriichelandSüdgeorgien" + + " an déi Südlech SandwichinselenGuatemalaGuamGuinea-BissauGuyanaSpezi" + + "alverwaltungszon Hong KongHeard- a McDonald-InselenHondurasKroatienH" + + "aitiUngarnKanaresch InselenIndonesienIrlandIsraelIsle of ManIndienBr" + + "itescht Territorium am Indeschen OzeanIrakIranIslandItalienJerseyJam" + + "aikaJordanienJapanKeniaKirgisistanKambodschaKiribatiKomorenSt. Kitts" + + " an NevisNordkoreaSüdkoreaKuwaitKaimaninselenKasachstanLaosLibanonSt" + + ". LuciaLiechtensteinSri LankaLiberiaLesothoLitauenLëtzebuergLettland" + + "LibyenMarokkoMonacoMoldawienMontenegroSt. MartinMadagaskarMarshallin" + + "selenMazedonienMaliMyanmarMongoleiSpezialverwaltungszon MacauNërdlec" + + "h MarianenMartiniqueMauretanienMontserratMaltaMauritiusMaldivenMalaw" + + "iMexikoMalaysiaMosambikNamibiaNeikaledonienNigerNorfolkinselNigeriaN" + + "icaraguaHollandNorwegenNepalNauruNiueNeiséilandOmanPanamaPeruFranséi" + + "sch-PolynesienPapua-NeiguineaPhilippinnenPakistanPolenSt. Pierre a M" + + "iquelonPitcairninselenPuerto RicoPalestinensesch AutonomiegebidderPo" + + "rtugalPalauParaguayKatarBaussecht OzeanienRéunionRumänienSerbienRuss" + + "landRuandaSaudi-ArabienSalomonenSeychellenSudanSchwedenSingapurSt. H" + + "elenaSlowenienSvalbard a Jan MayenSlowakeiSierra LeoneSan MarinoSene" + + "galSomaliaSurinameSüdsudanSão Tomé a PríncipeEl SalvadorSint Maarten" + + "SyrienSwasilandTristan da CunhaTurks- a CaicosinselenTschadFranséisc" + + "h Süd- an AntarktisgebidderTogoThailandTadschikistanTokelauOsttimorT" + + "urkmenistanTunesienTongaTierkeiTrinidad an TobagoTuvaluTaiwanTansani" + + "aUkrainUgandaAmerikanesch-OzeanienVereenegt Staate vun AmerikaUrugua" + + "yUsbekistanVatikanstadSt. Vincent an d’GrenadinnenVenezuelaBritesch " + + "JoffereninselenAmerikanesch JoffereninselenVietnamVanuatuWallis a Fu" + + "tunaSamoaKosovoJemenMayotteSüdafrikaSambiaSimbabweOnbekannt RegiounW" + + "eltAfrikaNordamerikaSüdamerikaOzeanienWestafrikaMëttelamerikaOstafri" + + "kaNordafrikaZentralafrikaSüdlecht AfrikaAmerikaNërdlecht AmerikaKari" + + "bikOstasienSüdasienSüdostasienSüdeuropaAustralien an NeiséilandMelan" + + "esienMikronesescht InselgebittPolynesienAsienZentralasienWestasienEu" + + "ropaOsteuropaNordeuropaWesteuropaLatäinamerika", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0009, 0x0010, 0x002b, 0x0036, 0x0047, 0x004f, 0x0057, + 0x005f, 0x005f, 0x0065, 0x006e, 0x0079, 0x008b, 0x0096, 0x00a0, + 0x00a5, 0x00b2, 0x00bf, 0x00d5, 0x00dd, 0x00e8, 0x00ee, 0x00fa, + 0x0103, 0x010a, 0x0111, 0x0116, 0x0127, 0x012e, 0x0134, 0x013c, + 0x014e, 0x0157, 0x015e, 0x0164, 0x016f, 0x0177, 0x0185, 0x018b, + 0x0191, 0x019d, 0x01ab, 0x01c6, 0x01d7, 0x01df, 0x01ef, 0x01fa, + 0x01ff, 0x0206, 0x020b, 0x0214, 0x0224, 0x022e, 0x0232, 0x023b, + 0x0243, 0x0255, 0x025b, 0x0265, 0x0271, 0x027d, 0x0286, 0x028f, + // Entry 40 - 7F + 0x0297, 0x02ad, 0x02b5, 0x02c4, 0x02cb, 0x02d2, 0x02d9, 0x02e3, + 0x02ea, 0x02f1, 0x02fa, 0x030c, 0x0314, 0x031b, 0x032a, 0x0335, + 0x033d, 0x0348, 0x034d, 0x035d, 0x0364, 0x036c, 0x0373, 0x037b, + 0x0380, 0x0389, 0x0392, 0x0398, 0x039e, 0x03a8, 0x03b8, 0x03c3, + 0x03f0, 0x03f9, 0x03fd, 0x040a, 0x0410, 0x042f, 0x0448, 0x0450, + 0x0458, 0x045d, 0x0463, 0x0474, 0x047e, 0x0484, 0x048a, 0x0495, + 0x049b, 0x04c3, 0x04c7, 0x04cb, 0x04d1, 0x04d8, 0x04de, 0x04e5, + 0x04ee, 0x04f3, 0x04f8, 0x0503, 0x050d, 0x0515, 0x051c, 0x052e, + // Entry 80 - BF + 0x0537, 0x0540, 0x0546, 0x0553, 0x055d, 0x0561, 0x0568, 0x0571, + 0x057e, 0x0587, 0x058e, 0x0595, 0x059c, 0x05a7, 0x05af, 0x05b5, + 0x05bc, 0x05c2, 0x05cb, 0x05d5, 0x05df, 0x05e9, 0x05f8, 0x0602, + 0x0606, 0x060d, 0x0615, 0x0630, 0x0642, 0x064c, 0x0657, 0x0661, + 0x0666, 0x066f, 0x0677, 0x067d, 0x0683, 0x068b, 0x0693, 0x069a, + 0x06a7, 0x06ac, 0x06b8, 0x06bf, 0x06c8, 0x06cf, 0x06d7, 0x06dc, + 0x06e1, 0x06e5, 0x06f0, 0x06f4, 0x06fa, 0x06fe, 0x0714, 0x0723, + 0x072f, 0x0737, 0x073c, 0x0751, 0x0760, 0x076b, 0x078c, 0x0794, + // Entry C0 - FF + 0x0799, 0x07a1, 0x07a6, 0x07b8, 0x07c0, 0x07c9, 0x07d0, 0x07d8, + 0x07de, 0x07eb, 0x07f4, 0x07fe, 0x0803, 0x080b, 0x0813, 0x081d, + 0x0826, 0x083a, 0x0842, 0x084e, 0x0858, 0x085f, 0x0866, 0x086e, + 0x0877, 0x088d, 0x0898, 0x08a4, 0x08aa, 0x08b3, 0x08c3, 0x08d9, + 0x08df, 0x0905, 0x0909, 0x0911, 0x091e, 0x0925, 0x092d, 0x0939, + 0x0941, 0x0946, 0x094d, 0x095f, 0x0965, 0x096b, 0x0973, 0x0979, + 0x097f, 0x0994, 0x09b0, 0x09b7, 0x09c1, 0x09cc, 0x09ea, 0x09f3, + 0x0a0b, 0x0a27, 0x0a2e, 0x0a35, 0x0a44, 0x0a49, 0x0a4f, 0x0a54, + // Entry 100 - 13F + 0x0a5b, 0x0a65, 0x0a6b, 0x0a73, 0x0a84, 0x0a88, 0x0a8e, 0x0a99, + 0x0aa4, 0x0aac, 0x0ab6, 0x0ac4, 0x0acd, 0x0ad7, 0x0ae4, 0x0af4, + 0x0afb, 0x0b0d, 0x0b14, 0x0b1c, 0x0b25, 0x0b31, 0x0b3b, 0x0b54, + 0x0b5e, 0x0b77, 0x0b81, 0x0b86, 0x0b92, 0x0b9b, 0x0ba1, 0x0baa, + 0x0bb4, 0x0bbe, 0x0bcc, + }, + }, + { // lg + "AndoraEmireetiAfaganisitaniAntigwa ne BarabudaAngwilaAlibaniyaArameniyaB" + + "izinga bya Antile eby’abaHolandiAngolaArigentinaSamowa omumerikaAwus" + + "ituriyaAwusitureliyaArubaAzerebayijaaniBoziniya HezegovinaBarabadosi" + + "BangaladesiBubirigiBurukina FasoBulugariyaBaareeniBurundiBeniniBerem" + + "udaBurunayiBoliviyaBuraziiriBahamasiButaaniBotiswanaBelarusiBelizeKa" + + "nadaKongo - ZayireLipubulika eya SenturafirikiKongoSwitizirandiKote " + + "DivwaBizinga bya KkukiCileKameruuniCayinaKolombyaKosita RikaCubaBizi" + + "nga by’e Kepu VerediSipuriyaLipubulika ya CeekaBudaakiJjibutiDenimaa" + + "kaDominikaLipubulika ya DominikaAligeryaEkwadoEsitoniyaMisiriEriture" + + "yaSipeyiniEsyopyaFinilandiFijiBizinga by’eFalikalandiMikuronezyaBufa" + + "lansaGaboniBungerezaGurenadaGyogyaGuyana enfalansaGanaGiburalitaGure" + + "nelandiGambyaGiniGwadalupeGayana ey’oku ekwetaBugereeki/BuyonaaniGwa" + + "temalaGwamuGini-BisawuGayanaHundurasiKurowesyaHayitiHangareYindonezy" + + "aAyalandiYisirayeriBuyindiBizinga by’eCagoYiraakaYiraaniAyisirandiYi" + + "taleJamayikaYorodaniJapaniKenyaKirigizisitaaniKambodyaKiribatiBizing" + + "a by’eKomoroSenti Kitisi ne NevisiKoreya ey’omumambukaKoreya ey’omum" + + "aserengetaKuwetiBizinga ebya KayimaaniKazakisitaaniLawosiLebanoniSen" + + "ti LuciyaLicitensitayiniSirilankaLiberyaLesosoLisuwenyaLukisembaagaL" + + "ativyaLibyaMorokoMonakoMolodovaMadagasikaBizinga bya MarisoMasedoniy" + + "aMaliMyanimaMongoliyaBizinga bya Mariyana eby’omumambukaMaritiniikiM" + + "awulitenyaMonteseraatiMalitaMawulisyasiBizinga by’eMalidiveMalawiMek" + + "isikoMalezyaMozambiikiNamibiyaKaledonya mupyaNijeKizinga ky’eNorofok" + + "oNayijeryaNikaraguwaHolandiNoweNepaloNawuruNiyuweNiyuziirandiOmaaniP" + + "anamaPeruPolinesiya enfalansaPapwa NyuginiBizinga bya FiripinoPakisi" + + "taaniPolandiSenti Piyere ne MikeloniPitikeeniPotorikoPalesitayiniPot" + + "ugaaliPalawuParagwayiKataaLeyunyoniLomaniyaLasaRwandaSawudarebya - B" + + "uwarabuBizanga by’eSolomooniSesereSudaaniSwideniSingapowaSenti Heren" + + "aSirovenyaSirovakyaSiyeralewoneSanimarinoSenegaaloSomaliyaSurinaamuS" + + "anitome ne PurincipeEl salivadoSiriyaSwazirandiBizinga by’eTaaka ne " + + "KayikosiCaadiTogoTayirandiTajikisitaaniTokelawuTimowaTakimenesitaani" + + "TunisyaTongaTtakeTurindaadi ne TobagoTuvaluTayiwaniTanzaniyaYukurayi" + + "neYugandaAmerikaWurugwayiWuzibekisitaaniVatikaaniSenti Vinsenti ne G" + + "urendadiiniVenzweraBizinga ebya Virigini ebitwalibwa BungerezaBizing" + + "a bya Virigini eby’AmerikaVyetinaamuVanawuwatuWalisi ne FutunaSamowa" + + "YemeniMayotteSawusafirikaZambyaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x000e, 0x001b, 0x002e, 0x0035, 0x003e, + 0x0047, 0x006a, 0x0070, 0x0070, 0x007a, 0x008a, 0x0095, 0x00a2, + 0x00a7, 0x00a7, 0x00b5, 0x00c8, 0x00d2, 0x00dd, 0x00e5, 0x00f2, + 0x00fc, 0x0104, 0x010b, 0x0111, 0x0111, 0x0119, 0x0121, 0x0129, + 0x0129, 0x0132, 0x013a, 0x0141, 0x0141, 0x014a, 0x0152, 0x0158, + 0x015e, 0x015e, 0x016c, 0x0188, 0x018d, 0x0199, 0x01a3, 0x01b4, + 0x01b8, 0x01c1, 0x01c7, 0x01cf, 0x01cf, 0x01da, 0x01de, 0x01f8, + 0x01f8, 0x01f8, 0x0200, 0x0213, 0x021a, 0x021a, 0x0221, 0x022a, + // Entry 40 - 7F + 0x0232, 0x0248, 0x0250, 0x0250, 0x0256, 0x025f, 0x0265, 0x0265, + 0x026e, 0x0276, 0x027d, 0x027d, 0x0286, 0x028a, 0x02a3, 0x02ae, + 0x02ae, 0x02b7, 0x02bd, 0x02c6, 0x02ce, 0x02d4, 0x02e4, 0x02e4, + 0x02e8, 0x02f2, 0x02fd, 0x0303, 0x0307, 0x0310, 0x0326, 0x0339, + 0x0339, 0x0342, 0x0347, 0x0352, 0x0358, 0x0358, 0x0358, 0x0361, + 0x036a, 0x0370, 0x0377, 0x0377, 0x0381, 0x0389, 0x0393, 0x0393, + 0x039a, 0x03ac, 0x03b3, 0x03ba, 0x03c4, 0x03ca, 0x03ca, 0x03d2, + 0x03da, 0x03e0, 0x03e5, 0x03f4, 0x03fc, 0x0404, 0x0418, 0x042e, + // Entry 80 - BF + 0x0444, 0x045e, 0x0464, 0x047a, 0x0487, 0x048d, 0x0495, 0x04a1, + 0x04b0, 0x04b9, 0x04c0, 0x04c6, 0x04cf, 0x04db, 0x04e2, 0x04e7, + 0x04ed, 0x04f3, 0x04fb, 0x04fb, 0x04fb, 0x0505, 0x0517, 0x0521, + 0x0525, 0x052c, 0x0535, 0x0535, 0x055a, 0x0565, 0x0570, 0x057c, + 0x0582, 0x058d, 0x05a3, 0x05a9, 0x05b1, 0x05b8, 0x05c2, 0x05ca, + 0x05d9, 0x05dd, 0x05f3, 0x05fc, 0x0606, 0x060d, 0x0611, 0x0617, + 0x061d, 0x0623, 0x062f, 0x0635, 0x063b, 0x063f, 0x0653, 0x0660, + 0x0674, 0x067f, 0x0686, 0x069e, 0x06a7, 0x06af, 0x06bb, 0x06c4, + // Entry C0 - FF + 0x06ca, 0x06d3, 0x06d8, 0x06d8, 0x06e1, 0x06e9, 0x06e9, 0x06ed, + 0x06f3, 0x0709, 0x0720, 0x0726, 0x072d, 0x0734, 0x073d, 0x0749, + 0x0752, 0x0752, 0x075b, 0x0767, 0x0771, 0x077a, 0x0782, 0x078b, + 0x078b, 0x07a0, 0x07ab, 0x07ab, 0x07b1, 0x07bb, 0x07bb, 0x07da, + 0x07df, 0x07df, 0x07e3, 0x07ec, 0x07f9, 0x0801, 0x0807, 0x0816, + 0x081d, 0x0822, 0x0827, 0x083b, 0x0841, 0x0849, 0x0852, 0x085c, + 0x0863, 0x0863, 0x086a, 0x0873, 0x0882, 0x088b, 0x08a9, 0x08b1, + 0x08dc, 0x08fe, 0x0908, 0x0912, 0x0922, 0x0928, 0x0928, 0x092e, + // Entry 100 - 13F + 0x0935, 0x0941, 0x0947, 0x094f, + }, + }, + { // lkt + "Uŋčíyapi MakȟóčhePȟečhókaŋhaŋska MakȟóčheIyášiča MakȟóčheSpayólaȟče Makȟ" + + "óčheKisúŋla MakȟóčheSpayóla MakȟóčheMílahaŋska TȟamákȟočheMakȟásito" + + "mniHásapa MakȟáwitaKhéya WítaHazíla MakȟáwitaWašíču Makȟáwita", + []uint16{ // 287 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, + 0x0017, 0x0017, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, 0x0037, + 0x0037, 0x0037, 0x0037, 0x0037, 0x004d, 0x004d, 0x004d, 0x004d, + // Entry 40 - 7F + 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, + 0x004d, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, 0x0066, + 0x0066, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, + // Entry 80 - BF + 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, + 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, + 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, + 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, 0x007b, + 0x007b, 0x007b, 0x007b, 0x007b, 0x008f, 0x008f, 0x008f, 0x008f, + 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + // Entry C0 - FF + 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, 0x008f, + 0x008f, 0x008f, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, + 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, + // Entry 100 - 13F + 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00ab, 0x00b9, 0x00cc, 0x00cc, + 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, 0x00cc, + 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, 0x00d8, + 0x00d8, 0x00d8, 0x00d8, 0x00eb, 0x00eb, 0x00eb, 0x0100, + }, + }, + { // ln + "AndorɛLɛmila alaboAfiganisitáAntiga mpé BarbudaAngiyɛAlibaniAmɛniAntiyɛ " + + "ya OlandɛAngólaAntarctiqueArizantinɛSamoa ya AmerikiOtilisiOsitáliAr" + + "ubaAzɛlɛbaizáBosini mpé HezegovineBarɛbadɛBengalidɛsiBelezikiBukina " + + "FasoBiligariBahrɛnɛBurundiBenɛBermudaBrineyiBoliviBrezílɛBahamasɛBut" + + "ániBotswanaByelorisiBelizɛKanadaRepibiki demokratiki ya KongóRepibi" + + "ki ya Afríka ya KátiKongoSwisɛKotídivualɛBisanga bya KookɛSíliKamɛru" + + "neSinɛKolombiKositarikaKibaBisanga bya KapevɛrɛSípɛlɛRepibiki TsekɛA" + + "lemaniDzibutiDanɛmarikeDomínikeRepibiki ya DomínikɛAlizɛriEkwatɛ́lɛE" + + "sitoniEzípiteElitelɛEsipanyeEtsíopiFilandɛFidziBisanga bya MaluniMik" + + "roneziFalánsɛGabɔAngɛlɛtɛ́lɛGelenadɛZorziGiyanɛ ya FalánsɛGuerneseyG" + + "anaZibatalɛGowelandeGambiGinɛGwadɛlupɛGinɛ́kwatɛ́lɛGelekiÎles de Géo" + + "rgie du Sud et Sandwich du SudGwatémalaGwamɛGinɛbisauGiyaneIle Heard" + + " et Iles McDonaldOndurasɛKrowasiAyitiOngiliIndoneziIrelandɛIsirayelɛ" + + "ÍndɛMabelé ya Angɛlɛtɛ́lɛ na mbú ya IndiyaIrakiIrâIsilandɛItaliZama" + + "ikiZɔdaniZapɔKenyaKigizisitáKambodzaKiribatiKomorɛSántu krístofe mpé" + + " Nevɛ̀sKorɛ ya nɔ́rdiKorɛ ya súdiKowetiBisanga bya KayímaKazakisitáL" + + "awosiLibáSántu lisiLishɛteniSirilankaLibériyaLesotoLitwaniLikisambul" + + "uLetoniLibíMarokɛMonakoMolidaviMonténégroMadagasikariBisanga bya Mar" + + "ishalɛMasedwanɛMalíBirmanieMongolíBisanga bya Marianɛ ya nɔ́rdiMarti" + + "nikiMoritaniMɔseraMalitɛMorisɛMadívɛMalawiMeksikeMaleziMozambíkiNami" + + "biKaledoni ya sikaNizɛrɛEsanga NorfokɛNizeryaNikaragwaOlandɛNorivezɛ" + + "NepálɛNauruNyuéZelandɛ ya sikaOmánɛPanamaPéruPolinezi ya FalánsɛPapw" + + "azi Ginɛ ya sikaFilipinɛPakisitáPoloniSántu pététo mpé MikelɔPikairn" + + "iPɔtorikoPalɛsinePutúlugɛsiPalauPalagweiKatariLenyoRomaniSerbieRisíR" + + "wandaAlabi SawuditɛBisanga SolomɔSɛshɛlɛSudáSwédɛSingapurɛSántu elen" + + "iSiloveniSilovakiSiera LeonɛSántu MarinɛSenegalɛSomaliSurinamɛSao To" + + "mé mpé PresipɛSavadɔrɛSiríSwazilandiBisanga bya Turki mpé KaikoTsádi" + + "Terres australes et antarctiques françaisesTogoTailandɛTazikisitáTok" + + "elauTimorɛ ya MoniɛlɛTikɛménisitáTiniziTongaTilikiTinidadɛ mpé Tobag" + + "oTuvaluTaiwaninTanzaniIkrɛniUgandaAmerikiIrigweiUzibɛkisitáVatikáSán" + + "tu vesá mpé GelenadinɛVenézuelaBisanga bya Vierzi ya Angɛlɛtɛ́lɛBisa" + + "nga bya Vierzi ya AmerikiViyetinamɛVanuatuWalisɛ mpé FutunaSamoaYemɛ" + + "nɛMayotɛAfríka ya SúdiZambiZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x0014, 0x0020, 0x0033, 0x003a, 0x0041, + 0x0047, 0x0059, 0x0060, 0x006b, 0x0076, 0x0086, 0x008d, 0x0095, + 0x009a, 0x009a, 0x00a7, 0x00bd, 0x00c7, 0x00d3, 0x00db, 0x00e6, + 0x00ee, 0x00f7, 0x00fe, 0x0103, 0x0103, 0x010a, 0x0111, 0x0117, + 0x0117, 0x0120, 0x0129, 0x0130, 0x0130, 0x0138, 0x0141, 0x0148, + 0x014e, 0x014e, 0x016c, 0x0188, 0x018d, 0x0193, 0x01a0, 0x01b2, + 0x01b7, 0x01c0, 0x01c5, 0x01cc, 0x01cc, 0x01d6, 0x01da, 0x01f0, + 0x01f0, 0x01f0, 0x01f9, 0x0208, 0x020f, 0x020f, 0x0216, 0x0221, + // Entry 40 - 7F + 0x022a, 0x0240, 0x0248, 0x0248, 0x0254, 0x025b, 0x0263, 0x0263, + 0x026b, 0x0273, 0x027b, 0x027b, 0x0283, 0x0288, 0x029a, 0x02a3, + 0x02a3, 0x02ac, 0x02b1, 0x02c1, 0x02ca, 0x02cf, 0x02e3, 0x02ec, + 0x02f0, 0x02f9, 0x0302, 0x0307, 0x030c, 0x0317, 0x0329, 0x032f, + 0x035a, 0x0364, 0x036a, 0x0374, 0x037a, 0x037a, 0x0394, 0x039d, + 0x03a4, 0x03a9, 0x03af, 0x03af, 0x03b7, 0x03c0, 0x03ca, 0x03ca, + 0x03d0, 0x03fd, 0x0402, 0x0406, 0x040f, 0x0414, 0x0414, 0x041b, + 0x0422, 0x0427, 0x042c, 0x0437, 0x043f, 0x0447, 0x044e, 0x046c, + // Entry 80 - BF + 0x047d, 0x048b, 0x0491, 0x04a4, 0x04af, 0x04b5, 0x04ba, 0x04c5, + 0x04cf, 0x04d8, 0x04e1, 0x04e7, 0x04ee, 0x04f9, 0x04ff, 0x0504, + 0x050b, 0x0511, 0x0519, 0x0525, 0x0525, 0x0531, 0x0547, 0x0551, + 0x0556, 0x055e, 0x0566, 0x0566, 0x0586, 0x058f, 0x0597, 0x059e, + 0x05a5, 0x05ac, 0x05b4, 0x05ba, 0x05c1, 0x05c7, 0x05d1, 0x05d7, + 0x05e7, 0x05ef, 0x05fe, 0x0605, 0x060e, 0x0615, 0x061e, 0x0626, + 0x062b, 0x0630, 0x0640, 0x0647, 0x064d, 0x0652, 0x0667, 0x067c, + 0x0685, 0x068e, 0x0694, 0x06b0, 0x06b8, 0x06c1, 0x06ca, 0x06d6, + // Entry C0 - FF + 0x06db, 0x06e3, 0x06e9, 0x06e9, 0x06ee, 0x06f4, 0x06fa, 0x06ff, + 0x0705, 0x0714, 0x0723, 0x072d, 0x0732, 0x0739, 0x0743, 0x074f, + 0x0757, 0x0757, 0x075f, 0x076b, 0x0779, 0x0782, 0x0788, 0x0791, + 0x0791, 0x07a8, 0x07b2, 0x07b2, 0x07b7, 0x07c1, 0x07c1, 0x07dd, + 0x07e3, 0x080f, 0x0813, 0x081c, 0x0827, 0x082e, 0x0842, 0x0851, + 0x0857, 0x085c, 0x0862, 0x0877, 0x087d, 0x0885, 0x088c, 0x0893, + 0x0899, 0x0899, 0x08a0, 0x08a7, 0x08b4, 0x08bb, 0x08d8, 0x08e2, + 0x0908, 0x0925, 0x0930, 0x0937, 0x094a, 0x094f, 0x094f, 0x0957, + // Entry 100 - 13F + 0x095e, 0x096e, 0x0973, 0x097b, + }, + }, + { // lo + loRegionStr, + loRegionIdx, + }, + { // lrc + "بئرئزیلچینآلمانفأرانسەبیریتانیا گأپھئنئیتالیاجاپوٙنروٙسیەڤولاتیا یأکاگئر" + + "تەراساگە نادیاردونیائفریقائمریکا شومالیئمریکا ھارگەھوم پئڤأند جأھوٙ" + + "ن آڤمینجا ئمریکائمریکائمریکا ڤاروکارائیبآسیائوروٙپائمریکا لاتین", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, 0x0014, + 0x0014, 0x0014, 0x0014, 0x0014, 0x001e, 0x001e, 0x001e, 0x001e, + // Entry 40 - 7F + 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, + 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, + 0x001e, 0x002c, 0x002c, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, 0x0045, + 0x004b, 0x004b, 0x004b, 0x004b, 0x004b, 0x0059, 0x0059, 0x0059, + 0x0059, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, + // Entry 80 - BF + 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, + 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, + 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, + 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, + 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, + 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, + 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, + 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, + // Entry C0 - FF + 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0065, 0x0071, + 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, + 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, + 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, + 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, + 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, 0x0071, + 0x0071, 0x0071, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, + 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, 0x0092, + // Entry 100 - 13F + 0x0092, 0x0092, 0x0092, 0x0092, 0x00ab, 0x00b5, 0x00c1, 0x00da, + 0x00f1, 0x0116, 0x0116, 0x012d, 0x012d, 0x012d, 0x012d, 0x012d, + 0x0139, 0x014e, 0x015c, 0x015c, 0x015c, 0x015c, 0x015c, 0x015c, + 0x015c, 0x015c, 0x015c, 0x0164, 0x0164, 0x0164, 0x0172, 0x0172, + 0x0172, 0x0172, 0x0189, + }, + }, + { // lt + ltRegionStr, + ltRegionIdx, + }, + { // lu + "AndoreLemila alabuAfuganisitaAntiga ne BarbudaAngiyeAlubaniAmeniAntiye w" + + "a OlandeAngolaAlijantineSamoa wa AmerikiOtilisiOsitaliArubaAjelbayid" + + "jaMbosini ne HezegovineBarebadeBenguladeshiBelejikiBukinafasoBiligar" + + "iBahreneBurundiBeneBermudaBrineyiMboliviMnulezileBahamaseButaniMbots" + + "wanaByelorisiBelizeKanadaDitunga wa KonguDitunga dya Afrika wa munka" + + "tshiKonguSwiseKotedivualeLutanda lua KookɛShiliKameruneShineKolombiK" + + "ositarikaKubaLutanda lua KapeveleShipeleDitunga dya TshekaAlemanuDji" + + "butiDanemalakuDuminikuDitunga wa DuminikuAlijeriEkwateleEsitoniMushi" + + "diEliteleNsipaniEtshiopiFilandeFujiLutanda lua MaluniMikroneziNfalan" + + "seNgabuAngeleteleNgelenadeJorijiGiyane wa NfalanseNganaJibeletaleNgo" + + "welandeGambiNgineNgwadelupeGine EkwateleNgelekaNgwatemalaNgwameNgine" + + "bisauNgiyaneOnduraseKrowasiAyitiOngiliIndoneziIrelandeIsirayeleIndeL" + + "utanda lwa Angeletele ku mbu wa IndiyaIrakiIraIsilandeItaliJamaikiJo" + + "daniJapuKenyaKigizisitaKambodzaKiribatiKomoruSantu krístofe ne Neves" + + "Kore wa muuluKore wa mwinshiKowetiLutanda lua KayimaKazakusitaLawosi" + + "LibaSantu lisiLishuteniSirilankaLiberiyaLesotoLitwaniLikisambuluLeto" + + "niLibiMarokeMonakuMolidaviMadagasikariLutanda lua MarishaleMasedwane" + + "MaliMyamareMongoliLutanda lua Mariane wa muuluMartinikiMoritaniMuser" + + "aMaliteMoriseMadiveMalawiMeksikeMaleziMozambikiNamibiKaledoni wa mum" + + "uNijereLutanda lua NorfokNijeryaNikaragwaOlandɛNorivejeNepálɛNauruNy" + + "ueZelanda wa mumuOmanePanamaPeruPolinezi wa NfalansePapwazi wa Nginɛ" + + " wa mumuNfilipiPakisitaMpoloniSantu pététo ne MikeluPikairniMpotorik" + + "uPalesineMputulugeshiPalauPalagweiKatariLenyoRomaniRisiRwandaAlabu N" + + "sawudiLutanda lua SolomuSesheleSudaSuwediSingapureSantu eleniSiloven" + + "iSilovakiSiera LeoneSantu MarineSenegaleSomaliSurinameSao Tome ne Pr" + + "esipɛSavadoreSiriSwazilandiLutanda lua Tuluki ne KaikoTshadiToguTayi" + + "landaTazikisitaTokelauTimoru wa dibokuTukemenisitaTiniziTongaTulukiT" + + "inidade ne TobagoTuvaluTaiwaniTanzaniUkreniUgandaAmerikiIrigweiUzibe" + + "kisitaNvatikaSantu vesa ne NgelenadineVenezuelaLutanda lua Vierzi wa" + + " AngeleteleLutanda lua Vierzi wa AmerikiViyetinameVanuatuWalise ne F" + + "utunaSamoaYemenuMayoteAfrika ya SúdiZambiZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0012, 0x001d, 0x002e, 0x0034, 0x003b, + 0x0040, 0x0050, 0x0056, 0x0056, 0x0060, 0x0070, 0x0077, 0x007e, + 0x0083, 0x0083, 0x008e, 0x00a3, 0x00ab, 0x00b7, 0x00bf, 0x00c9, + 0x00d1, 0x00d8, 0x00df, 0x00e3, 0x00e3, 0x00ea, 0x00f1, 0x00f8, + 0x00f8, 0x0101, 0x0109, 0x010f, 0x010f, 0x0118, 0x0121, 0x0127, + 0x012d, 0x012d, 0x013d, 0x015c, 0x0161, 0x0166, 0x0171, 0x0183, + 0x0188, 0x0190, 0x0195, 0x019c, 0x019c, 0x01a6, 0x01aa, 0x01be, + 0x01be, 0x01be, 0x01c5, 0x01d7, 0x01de, 0x01de, 0x01e5, 0x01ef, + // Entry 40 - 7F + 0x01f7, 0x020a, 0x0211, 0x0211, 0x0219, 0x0220, 0x0227, 0x0227, + 0x022e, 0x0235, 0x023d, 0x023d, 0x0244, 0x0248, 0x025a, 0x0263, + 0x0263, 0x026b, 0x0270, 0x027a, 0x0283, 0x0289, 0x029b, 0x029b, + 0x02a0, 0x02aa, 0x02b4, 0x02b9, 0x02be, 0x02c8, 0x02d5, 0x02dc, + 0x02dc, 0x02e6, 0x02ec, 0x02f6, 0x02fd, 0x02fd, 0x02fd, 0x0305, + 0x030c, 0x0311, 0x0317, 0x0317, 0x031f, 0x0327, 0x0330, 0x0330, + 0x0334, 0x035b, 0x0360, 0x0363, 0x036b, 0x0370, 0x0370, 0x0377, + 0x037d, 0x0381, 0x0386, 0x0390, 0x0398, 0x03a0, 0x03a6, 0x03be, + // Entry 80 - BF + 0x03cb, 0x03da, 0x03e0, 0x03f2, 0x03fc, 0x0402, 0x0406, 0x0410, + 0x0419, 0x0422, 0x042a, 0x0430, 0x0437, 0x0442, 0x0448, 0x044c, + 0x0452, 0x0458, 0x0460, 0x0460, 0x0460, 0x046c, 0x0481, 0x048a, + 0x048e, 0x0495, 0x049c, 0x049c, 0x04b8, 0x04c1, 0x04c9, 0x04cf, + 0x04d5, 0x04db, 0x04e1, 0x04e7, 0x04ee, 0x04f4, 0x04fd, 0x0503, + 0x0513, 0x0519, 0x052b, 0x0532, 0x053b, 0x0542, 0x054a, 0x0552, + 0x0557, 0x055b, 0x056a, 0x056f, 0x0575, 0x0579, 0x058d, 0x05a6, + 0x05ad, 0x05b5, 0x05bc, 0x05d4, 0x05dc, 0x05e5, 0x05ed, 0x05f9, + // Entry C0 - FF + 0x05fe, 0x0606, 0x060c, 0x060c, 0x0611, 0x0617, 0x0617, 0x061b, + 0x0621, 0x062e, 0x0640, 0x0647, 0x064b, 0x0651, 0x065a, 0x0665, + 0x066d, 0x066d, 0x0675, 0x0680, 0x068c, 0x0694, 0x069a, 0x06a2, + 0x06a2, 0x06b6, 0x06be, 0x06be, 0x06c2, 0x06cc, 0x06cc, 0x06e7, + 0x06ed, 0x06ed, 0x06f1, 0x06fa, 0x0704, 0x070b, 0x071b, 0x0727, + 0x072d, 0x0732, 0x0738, 0x074a, 0x0750, 0x0757, 0x075e, 0x0764, + 0x076a, 0x076a, 0x0771, 0x0778, 0x0783, 0x078a, 0x07a3, 0x07ac, + 0x07cc, 0x07e9, 0x07f3, 0x07fa, 0x080a, 0x080f, 0x080f, 0x0815, + // Entry 100 - 13F + 0x081b, 0x082a, 0x082f, 0x0837, + }, + }, + { // luo + "AndorraUnited Arab EmiratesAfghanistanAntigua gi BarbudaAnguillaAlbaniaA" + + "rmeniaNetherlands AntillesAngolaArgentinaAmerican SamoaAustriaAustra" + + "liaArubaAzerbaijanBosnia gi HerzegovinaBarbadosBangladeshBelgiumBurk" + + "ina FasoBulgariaBahrainBurundiBeninBermudaBruneiBoliviaBrazilBahamas" + + "BhutanBotswanaBelarusBelizeCanadaDemocratic Republic of the CongoCen" + + "tral African RepublicCongoSwitzerlandCôte dCook IslandsChileCameroon" + + "ChinaColombiaCosta RicaCubaCape Verde IslandsCyprusCzech RepublicGer" + + "manyDjiboutiDenmarkDominicaDominican RepublicAlgeriaEcuadorEstoniaEg" + + "yptEritreaSpainEthiopiaFinlandFijiChuia mar FalklandMicronesiaFrance" + + "GabonUnited KingdomGrenadaGeorgiaFrench GuianaGhanaGibraltarGreenlan" + + "dGambiaGuineaGuadeloupeEquatorial GuineaGreeceGuatemalaGuamGuinea-Bi" + + "ssauGuyanaHondurasCroatiaHaitiHungaryIndonesiaIrelandIsraelIndiaBrit" + + "ish Indian Ocean TerritoryIraqIranIcelandItalyJamaicaJordanJapanKeny" + + "aKyrgyzstanCambodiaKiribatiComorosSaint Kitts gi NevisKorea MasawaKo" + + "rea MilamboKuwaitCayman IslandsKazakhstanLaosLebanonSaint LuciaLiech" + + "tensteinSri LankaLiberiaLesothoLithuaniaLuxembourgLatviaLibyaMorocco" + + "MonacoMoldovaMadagascarChuia mar MarshallMacedoniaMaliMyanmarMongoli" + + "aNorthern Mariana IslandsMartiniqueMauritaniaMontserratMaltaMauritiu" + + "sMaldivesMalawiMexicoMalaysiaMozambiqueNamibiaNew CaledoniaNigerChui" + + "a mar NorfolkNigeriaNicaraguaNetherlandsNorwayNepalNauruNiueNew Zeal" + + "andOmanPanamaPeruFrench PolynesiaPapua New GuineaPhilippinesPakistan" + + "PolandSaint Pierre gi MiquelonPitcairnPuerto RicoPalestinian West Ba" + + "nk gi GazaPortugalPalauParaguayQatarRéunionRomaniaRussiaRwandaSaudi " + + "ArabiaSolomon IslandsSeychellesSudanSwedenSingaporeSaint HelenaSlove" + + "niaSlovakiaSierra LeoneSan MarinoSenegalSomaliaSurinameSão Tomé gi P" + + "ríncipeEl SalvadorSyriaSwazilandTurks gi Caicos IslandsChadTogoThail" + + "andTajikistanTokelauEast TimorTurkmenistanTunisiaTongaTurkeyTrinidad" + + " gi TobagoTuvaluTaiwanTanzaniaUkraineUgandaUSAUruguayUzbekistanVatic" + + "an StateSaint Vincent gi GrenadinesVenezuelaBritish Virgin IslandsU." + + "S. Virgin IslandsVietnamVanuatuWallis gi FutunaSamoaYemenMayotteSout" + + "h AfricaZambiaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x001b, 0x0026, 0x0038, 0x0040, 0x0047, + 0x004e, 0x0062, 0x0068, 0x0068, 0x0071, 0x007f, 0x0086, 0x008f, + 0x0094, 0x0094, 0x009e, 0x00b3, 0x00bb, 0x00c5, 0x00cc, 0x00d8, + 0x00e0, 0x00e7, 0x00ee, 0x00f3, 0x00f3, 0x00fa, 0x0100, 0x0107, + 0x0107, 0x010d, 0x0114, 0x011a, 0x011a, 0x0122, 0x0129, 0x012f, + 0x0135, 0x0135, 0x0155, 0x016d, 0x0172, 0x017d, 0x0184, 0x0190, + 0x0195, 0x019d, 0x01a2, 0x01aa, 0x01aa, 0x01b4, 0x01b8, 0x01ca, + 0x01ca, 0x01ca, 0x01d0, 0x01de, 0x01e5, 0x01e5, 0x01ed, 0x01f4, + // Entry 40 - 7F + 0x01fc, 0x020e, 0x0215, 0x0215, 0x021c, 0x0223, 0x0228, 0x0228, + 0x022f, 0x0234, 0x023c, 0x023c, 0x0243, 0x0247, 0x0259, 0x0263, + 0x0263, 0x0269, 0x026e, 0x027c, 0x0283, 0x028a, 0x0297, 0x0297, + 0x029c, 0x02a5, 0x02ae, 0x02b4, 0x02ba, 0x02c4, 0x02d5, 0x02db, + 0x02db, 0x02e4, 0x02e8, 0x02f5, 0x02fb, 0x02fb, 0x02fb, 0x0303, + 0x030a, 0x030f, 0x0316, 0x0316, 0x031f, 0x0326, 0x032c, 0x032c, + 0x0331, 0x034f, 0x0353, 0x0357, 0x035e, 0x0363, 0x0363, 0x036a, + 0x0370, 0x0375, 0x037a, 0x0384, 0x038c, 0x0394, 0x039b, 0x03af, + // Entry 80 - BF + 0x03bb, 0x03c8, 0x03ce, 0x03dc, 0x03e6, 0x03ea, 0x03f1, 0x03fc, + 0x0409, 0x0412, 0x0419, 0x0420, 0x0429, 0x0433, 0x0439, 0x043e, + 0x0445, 0x044b, 0x0452, 0x0452, 0x0452, 0x045c, 0x046e, 0x0477, + 0x047b, 0x0482, 0x048a, 0x048a, 0x04a2, 0x04ac, 0x04b6, 0x04c0, + 0x04c5, 0x04ce, 0x04d6, 0x04dc, 0x04e2, 0x04ea, 0x04f4, 0x04fb, + 0x0508, 0x050d, 0x051e, 0x0525, 0x052e, 0x0539, 0x053f, 0x0544, + 0x0549, 0x054d, 0x0558, 0x055c, 0x0562, 0x0566, 0x0576, 0x0586, + 0x0591, 0x0599, 0x059f, 0x05b7, 0x05bf, 0x05ca, 0x05e7, 0x05ef, + // Entry C0 - FF + 0x05f4, 0x05fc, 0x0601, 0x0601, 0x0609, 0x0610, 0x0610, 0x0616, + 0x061c, 0x0628, 0x0637, 0x0641, 0x0646, 0x064c, 0x0655, 0x0661, + 0x0669, 0x0669, 0x0671, 0x067d, 0x0687, 0x068e, 0x0695, 0x069d, + 0x069d, 0x06b4, 0x06bf, 0x06bf, 0x06c4, 0x06cd, 0x06cd, 0x06e4, + 0x06e8, 0x06e8, 0x06ec, 0x06f4, 0x06fe, 0x0705, 0x070f, 0x071b, + 0x0722, 0x0727, 0x072d, 0x073f, 0x0745, 0x074b, 0x0753, 0x075a, + 0x0760, 0x0760, 0x0763, 0x076a, 0x0774, 0x0781, 0x079c, 0x07a5, + 0x07bb, 0x07ce, 0x07d5, 0x07dc, 0x07ec, 0x07f1, 0x07f1, 0x07f6, + // Entry 100 - 13F + 0x07fd, 0x0809, 0x080f, 0x0817, + }, + }, + { // luy + "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + + "iaAntili za UholanziAngolaAjentinaSamoa lya MarekaniAustriaAustralia" + + "ArubaAzabajaniBosnia na HezegovinaBabadosiBangladeshiUbelgijiBukinaf" + + "asoBulgariaBahareniBurundiBeniniBermudaBruneiBoliviaBraziliBahamaBut" + + "aniBotswanaBelarusiBelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhu" + + "ri ya Afrika ya KatiKongoUswisiKodivaaVisiwa vya CookChileKameruniCh" + + "inaKolombiaKostarikaKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibu" + + "tiDenmakiDominikaJamhuri ya DominikaAljeriaEkwadoEstoniaMisriEritrea" + + "HispaniaUhabeshiUfiniFijiVisiwa vya FalklandMikronesiaUfaransaGaboni" + + "UingerezaGrenadaJojiaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambia" + + "GineGwadelupeGinekwetaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKo" + + "rasiaHaitiHungariaIndonesiaAyalandiIsraeliIndiaEneo la Uingereza kat" + + "ika Bahari HindiIrakiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKi" + + "rigizistaniKambodiaKiribatiKomoroSantakitzi na NevisKorea KaskaziniK" + + "orea KusiniKuwaitiVisiwa vya KaymanKazakistaniLaosiLebanoniSantalusi" + + "aLishenteniSirilankaLiberiaLesotoLitwaniaLasembagiLativiaLibyaMoroko" + + "MonakoMoldovaBukiniVisiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiw" + + "a vya Mariana vya KaskaziniMartinikiMoritaniaMontserratiMaltaMorisiM" + + "odivuMalawiMeksikoMalesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha" + + " NorfokNijeriaNikaragwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPa" + + "namaPeruPolinesia ya UfaransaPapuaFilipinoPakistaniPolandiSantapieri" + + " na MikeloniPitkairniPwetorikoUkingo wa Magharibi na Ukanda wa Gaza " + + "wa PalestinaUrenoPalauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudi" + + "Visiwa vya SolomonShelisheliSudaniUswidiSingapooSantahelenaSloveniaS" + + "lovakiaSiera LeoniSamarinoSenegaliSomaliaSurinamuSao Tome na Princip" + + "eElsavadoSiriaUswaziVisiwa vya Turki na KaikoChadiTogoTailandiTajiki" + + "staniTokelauTimori ya MasharikiTurukimenistaniTunisiaTongaUturukiTri" + + "nidad na TobagoTuvaluTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzib" + + "ekistaniVatikaniSantavisenti na GrenadiniVenezuelaVisiwa vya Virgin " + + "vya UingerezaVisiwa vya Virgin vya MarekaniVietinamuVanuatuWalis na " + + "FutunaSamoaYemeniMayotteAfrika KusiniZambiaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, + 0x004a, 0x005c, 0x0062, 0x0062, 0x006a, 0x007c, 0x0083, 0x008c, + 0x0091, 0x0091, 0x009a, 0x00ae, 0x00b6, 0x00c1, 0x00c9, 0x00d3, + 0x00db, 0x00e3, 0x00ea, 0x00f0, 0x00f0, 0x00f7, 0x00fd, 0x0104, + 0x0104, 0x010b, 0x0111, 0x0117, 0x0117, 0x011f, 0x0127, 0x012d, + 0x0133, 0x0133, 0x0153, 0x016c, 0x0171, 0x0177, 0x017e, 0x018d, + 0x0192, 0x019a, 0x019f, 0x01a7, 0x01a7, 0x01b0, 0x01b4, 0x01bc, + 0x01bc, 0x01bc, 0x01c3, 0x01d3, 0x01dc, 0x01dc, 0x01e2, 0x01e9, + // Entry 40 - 7F + 0x01f1, 0x0204, 0x020b, 0x020b, 0x0211, 0x0218, 0x021d, 0x021d, + 0x0224, 0x022c, 0x0234, 0x0234, 0x0239, 0x023d, 0x0250, 0x025a, + 0x025a, 0x0262, 0x0268, 0x0271, 0x0278, 0x027d, 0x0290, 0x0290, + 0x0295, 0x029d, 0x02a6, 0x02ac, 0x02b0, 0x02b9, 0x02c2, 0x02c9, + 0x02c9, 0x02d2, 0x02d6, 0x02df, 0x02e5, 0x02e5, 0x02e5, 0x02ee, + 0x02f5, 0x02fa, 0x0302, 0x0302, 0x030b, 0x0313, 0x031a, 0x031a, + 0x031f, 0x0344, 0x0349, 0x034f, 0x0357, 0x035d, 0x035d, 0x0364, + 0x036b, 0x0371, 0x0376, 0x0383, 0x038b, 0x0393, 0x0399, 0x03ac, + // Entry 80 - BF + 0x03bb, 0x03c7, 0x03ce, 0x03df, 0x03ea, 0x03ef, 0x03f7, 0x0401, + 0x040b, 0x0414, 0x041b, 0x0421, 0x0429, 0x0432, 0x0439, 0x043e, + 0x0444, 0x044a, 0x0451, 0x0451, 0x0451, 0x0457, 0x0469, 0x0472, + 0x0476, 0x047b, 0x0483, 0x0483, 0x04a3, 0x04ac, 0x04b5, 0x04c0, + 0x04c5, 0x04cb, 0x04d1, 0x04d7, 0x04de, 0x04e5, 0x04ed, 0x04f4, + 0x0500, 0x0506, 0x0517, 0x051e, 0x0527, 0x052f, 0x0534, 0x053a, + 0x053f, 0x0543, 0x054d, 0x0552, 0x0558, 0x055c, 0x0571, 0x0576, + 0x057e, 0x0587, 0x058e, 0x05a4, 0x05ad, 0x05b6, 0x05e8, 0x05ed, + // Entry C0 - FF + 0x05f2, 0x05fa, 0x0600, 0x0600, 0x0609, 0x0610, 0x0610, 0x0615, + 0x061b, 0x0620, 0x0632, 0x063c, 0x0642, 0x0648, 0x0650, 0x065b, + 0x0663, 0x0663, 0x066b, 0x0676, 0x067e, 0x0686, 0x068d, 0x0695, + 0x0695, 0x06a9, 0x06b1, 0x06b1, 0x06b6, 0x06bc, 0x06bc, 0x06d5, + 0x06da, 0x06da, 0x06de, 0x06e6, 0x06f1, 0x06f8, 0x070b, 0x071a, + 0x0721, 0x0726, 0x072d, 0x073f, 0x0745, 0x074c, 0x0754, 0x075b, + 0x0761, 0x0761, 0x0769, 0x0770, 0x077c, 0x0784, 0x079d, 0x07a6, + 0x07c5, 0x07e3, 0x07ec, 0x07f3, 0x0802, 0x0807, 0x0807, 0x080d, + // Entry 100 - 13F + 0x0814, 0x0821, 0x0827, 0x082f, + }, + }, + { // lv + lvRegionStr, + lvRegionIdx, + }, + { // mas + "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + + "iaAntili za UholanziAngolaAjentinaSamoa ya MarekaniAustriaAustraliaA" + + "rubaAzabajaniBosnia na HezegovinaBabadosiBangladeshiUbelgijiBukinafa" + + "soBulgariaBahareniBurundiBeniniBermudaBruneiBoliviaBraziliBahamaButa" + + "niBotswanaBelarusiBelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhur" + + "i ya Afrika ya KatiKongoUswisiKodivaaVisiwa vya CookChileKameruniChi" + + "naKolombiaKostarikaKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibut" + + "iDenmakiDominikaJamhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaH" + + "ispaniaUhabeshiUfiniFijiVisiwa vya FalklandMikronesiaUfaransaGaboniU" + + "ingerezaGrenadaJojiaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaG" + + "ineGwadelupeGinekwetaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKor" + + "asiaHaitiHungariaIndonesiaAyalandiIsraeliIndiaEneo la Uingereza kati" + + "ka Bahari HindiIrakiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKir" + + "igizistaniKambodiaKiribatiKomoroSantakitzi na NevisKorea KaskaziniKo" + + "rea KusiniKuwaitiVisiwa vya KaymanKazakistaniLaosiLebanoniSantalusia" + + "LishenteniSirilankaLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoM" + + "onakoMoldovaBukiniVisiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa" + + " vya Mariana vya KaskaziniMartinikiMoritaniaMontserratiMaltaMorisiMo" + + "divuMalawiMeksikoMalesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha " + + "NorfokNijeriaNikaragwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPan" + + "amaPeruPolinesia ya UfaransaPapuaFilipinoPakistaniPolandiSantapieri " + + "na MikeloniPitkairniPwetorikoUkingo wa Magharibi na Ukanda wa Gaza w" + + "a PalestinaUrenoPalauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiV" + + "isiwa vya SolomonShelisheliSudaniUswidiSingapooSantahelenaSloveniaSl" + + "ovakiaSiera LeoniSamarinoSenegaliSomaliaSurinamuSao Tome na Principe" + + "ElsavadoSiriaUswaziVisiwa vya Turki na KaikoChadiTogoTailandiTajikis" + + "taniTokelauTimori ya MasharikiTurukimenistaniTunisiaTongaUturukiTrin" + + "idad na TobagoTuvaluTaiwaniTansaniaUkrainiUgandaMarekaniUrugwaiUzibe" + + "kistaniVatikaniSantavisenti na GrenadiniVenezuelaVisiwa vya Virgin v" + + "ya UingerezaVisiwa vya Virgin vya MarekaniVietinamuVanuatuWalis na F" + + "utunaSamoaYemeniMayotteAfrika KusiniSambiaSimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, + 0x004a, 0x005c, 0x0062, 0x0062, 0x006a, 0x007b, 0x0082, 0x008b, + 0x0090, 0x0090, 0x0099, 0x00ad, 0x00b5, 0x00c0, 0x00c8, 0x00d2, + 0x00da, 0x00e2, 0x00e9, 0x00ef, 0x00ef, 0x00f6, 0x00fc, 0x0103, + 0x0103, 0x010a, 0x0110, 0x0116, 0x0116, 0x011e, 0x0126, 0x012c, + 0x0132, 0x0132, 0x0152, 0x016b, 0x0170, 0x0176, 0x017d, 0x018c, + 0x0191, 0x0199, 0x019e, 0x01a6, 0x01a6, 0x01af, 0x01b3, 0x01bb, + 0x01bb, 0x01bb, 0x01c2, 0x01d2, 0x01db, 0x01db, 0x01e1, 0x01e8, + // Entry 40 - 7F + 0x01f0, 0x0203, 0x020a, 0x020a, 0x0210, 0x0217, 0x021c, 0x021c, + 0x0223, 0x022b, 0x0233, 0x0233, 0x0238, 0x023c, 0x024f, 0x0259, + 0x0259, 0x0261, 0x0267, 0x0270, 0x0277, 0x027c, 0x028f, 0x028f, + 0x0294, 0x029c, 0x02a5, 0x02ab, 0x02af, 0x02b8, 0x02c1, 0x02c8, + 0x02c8, 0x02d1, 0x02d5, 0x02de, 0x02e4, 0x02e4, 0x02e4, 0x02ed, + 0x02f4, 0x02f9, 0x0301, 0x0301, 0x030a, 0x0312, 0x0319, 0x0319, + 0x031e, 0x0343, 0x0348, 0x034e, 0x0356, 0x035c, 0x035c, 0x0363, + 0x036a, 0x0370, 0x0375, 0x0382, 0x038a, 0x0392, 0x0398, 0x03ab, + // Entry 80 - BF + 0x03ba, 0x03c6, 0x03cd, 0x03de, 0x03e9, 0x03ee, 0x03f6, 0x0400, + 0x040a, 0x0413, 0x041a, 0x0420, 0x0428, 0x0431, 0x0438, 0x043d, + 0x0443, 0x0449, 0x0450, 0x0450, 0x0450, 0x0456, 0x0468, 0x0471, + 0x0475, 0x047a, 0x0482, 0x0482, 0x04a2, 0x04ab, 0x04b4, 0x04bf, + 0x04c4, 0x04ca, 0x04d0, 0x04d6, 0x04dd, 0x04e4, 0x04ec, 0x04f3, + 0x04ff, 0x0505, 0x0516, 0x051d, 0x0526, 0x052e, 0x0533, 0x0539, + 0x053e, 0x0542, 0x054c, 0x0551, 0x0557, 0x055b, 0x0570, 0x0575, + 0x057d, 0x0586, 0x058d, 0x05a3, 0x05ac, 0x05b5, 0x05e7, 0x05ec, + // Entry C0 - FF + 0x05f1, 0x05f9, 0x05ff, 0x05ff, 0x0608, 0x060f, 0x060f, 0x0614, + 0x061a, 0x061f, 0x0631, 0x063b, 0x0641, 0x0647, 0x064f, 0x065a, + 0x0662, 0x0662, 0x066a, 0x0675, 0x067d, 0x0685, 0x068c, 0x0694, + 0x0694, 0x06a8, 0x06b0, 0x06b0, 0x06b5, 0x06bb, 0x06bb, 0x06d4, + 0x06d9, 0x06d9, 0x06dd, 0x06e5, 0x06f0, 0x06f7, 0x070a, 0x0719, + 0x0720, 0x0725, 0x072c, 0x073e, 0x0744, 0x074b, 0x0753, 0x075a, + 0x0760, 0x0760, 0x0768, 0x076f, 0x077b, 0x0783, 0x079c, 0x07a5, + 0x07c4, 0x07e2, 0x07eb, 0x07f2, 0x0801, 0x0806, 0x0806, 0x080c, + // Entry 100 - 13F + 0x0813, 0x0820, 0x0826, 0x082e, + }, + }, + { // mer + "AndoraFalme cia KiarabuAfuganistaniAntigua na BarbudaAnguillaAlubaniaArm" + + "eniaAntili cia HolandiAngolaAjentinaSamoa ya AmerikaAustiriaAustrĩli" + + "aArubaAzebaijaniBosnia na HezegovinaBabadosiBangiradeshiBeronjiamuBu" + + "kinafasoBulgariaBahariniBurundiBeniniBamudaBruneiBoliviaBraziluBaham" + + "asiButaniBotswanaBelarusiBelizeKanadaNthĩ ya Kidemokrasĩ ya KongoNth" + + "ĩ ya Afrika gatĩgatĩKongoSwizilandiKodivaaAĩrandi cia CookChileKame" + + "runiChinaKolombiaKostarikaKiubaKepuvedeCaipurasiNthĩ ya ChekiNjamanĩ" + + "JibutiDenimakiDominikaNthĩ ya DominikaAngiriaEkwadoEstoniaMisiriErit" + + "reaSpĩniIthiopiaFinilandiFijiAĩrandi cia FalklandiMikronesiaFransiGa" + + "boniNgerethaGrenadaJojiaGwiyana ya FransiGhanaNgĩbrataNgirinilandiGa" + + "mbiaGineGwadelupeGine ya IquitaNgirikiGwatemalaGwamGinebisauGuyanaHo" + + "ndurasiKoroashiaHaitiHangarĩIndonesiaAelandiIsiraeliIndiaNthĩ cia Ng" + + "eretha gatagatĩ ka ĩria ria HindiIrakiIraniAisilandiItalĩJamaikaJoro" + + "ndaniJapaniKenyaKirigizistaniKambodiaKiribatiKomoroSantakitzi na Nev" + + "isKorea NothiKorea SaũthiKuwĩ tiAĩrandi cia KaymanKazakistaniLaosiLe" + + "banoniSantalusiaLishenteniSirilankaLiberiaLesothoLithuaniaLuxemboguL" + + "ativiaLĩbiaMorokoMonakoMoldovaMadagasikaAĩrandi cia MarshalMacedonia" + + "MaliMyanimaMongoliaAĩrandi cia Mariana ya nothiMartinikiMauritaniaMo" + + "ntserratiMaltaMaurĩtiasiModivuMalawiMexikoMalĩsiaMozambikiNamibiaKal" + + "endoia ĨnjeruNijaAĩrandi cia NorfokNijeriaNikaragwaHolandiNorwiNepal" + + "iNauruNiueNiuzilandiOmaniPanamaPeruPolinesia ya FransiPapuaFilipinoP" + + "akistaniPolandiSantapieri na MikeloniPitkairniPwetorikoRũtere rwa We" + + "sti banki na Gaza cia PalestinaPotogoPalauParagwaiKataRiyunioniRoman" + + "iaRashiaRwandaSaudiAirandi Cia SolomonShelisheliSudaniSwideniSingapo" + + "oSantahelenaSloveniaSlovakiaSiera LeoniSamarinoSenegoSomaliaSurinamu" + + "Sao Tome na PrincipeElsavadoSiriaSwazilandiAĩrandi cia Takĩ na Kaiko" + + "ChadiTogoThaĩlandiTajikistaniTokelauTimori ya IstiTukumenistaniTunis" + + "iaTongaTakĩTrinidad na TobagoTuvaluTaiwaniTanzaniaUkirĩniUgandaAmeri" + + "kaUrugwĩUzibekistaniVatikaniSantavisenti na GrenadiniVenezuelaAĩrand" + + "i cia Virgin cia NgerethaAĩrandi cia Virgin cia AmerikaVietinamuVanu" + + "atuWalis na FutunaSamoaYemeniMayotteAfrika ya SouthiZambiaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0017, 0x0023, 0x0035, 0x003d, 0x0045, + 0x004c, 0x005e, 0x0064, 0x0064, 0x006c, 0x007c, 0x0084, 0x008e, + 0x0093, 0x0093, 0x009d, 0x00b1, 0x00b9, 0x00c5, 0x00cf, 0x00d9, + 0x00e1, 0x00e9, 0x00f0, 0x00f6, 0x00f6, 0x00fc, 0x0102, 0x0109, + 0x0109, 0x0110, 0x0118, 0x011e, 0x011e, 0x0126, 0x012e, 0x0134, + 0x013a, 0x013a, 0x0158, 0x0172, 0x0177, 0x0181, 0x0188, 0x0199, + 0x019e, 0x01a6, 0x01ab, 0x01b3, 0x01b3, 0x01bc, 0x01c1, 0x01c9, + 0x01c9, 0x01c9, 0x01d2, 0x01e0, 0x01e8, 0x01e8, 0x01ee, 0x01f6, + // Entry 40 - 7F + 0x01fe, 0x020f, 0x0216, 0x0216, 0x021c, 0x0223, 0x0229, 0x0229, + 0x0230, 0x0236, 0x023e, 0x023e, 0x0247, 0x024b, 0x0261, 0x026b, + 0x026b, 0x0271, 0x0277, 0x027f, 0x0286, 0x028b, 0x029c, 0x029c, + 0x02a1, 0x02aa, 0x02b6, 0x02bc, 0x02c0, 0x02c9, 0x02d7, 0x02de, + 0x02de, 0x02e7, 0x02eb, 0x02f4, 0x02fa, 0x02fa, 0x02fa, 0x0303, + 0x030c, 0x0311, 0x0319, 0x0319, 0x0322, 0x0329, 0x0331, 0x0331, + 0x0336, 0x0365, 0x036a, 0x036f, 0x0378, 0x037e, 0x037e, 0x0385, + 0x038e, 0x0394, 0x0399, 0x03a6, 0x03ae, 0x03b6, 0x03bc, 0x03cf, + // Entry 80 - BF + 0x03da, 0x03e7, 0x03ef, 0x0402, 0x040d, 0x0412, 0x041a, 0x0424, + 0x042e, 0x0437, 0x043e, 0x0445, 0x044e, 0x0457, 0x045e, 0x0464, + 0x046a, 0x0470, 0x0477, 0x0477, 0x0477, 0x0481, 0x0495, 0x049e, + 0x04a2, 0x04a9, 0x04b1, 0x04b1, 0x04ce, 0x04d7, 0x04e1, 0x04ec, + 0x04f1, 0x04fc, 0x0502, 0x0508, 0x050e, 0x0516, 0x051f, 0x0526, + 0x0537, 0x053b, 0x054e, 0x0555, 0x055e, 0x0565, 0x056a, 0x0570, + 0x0575, 0x0579, 0x0583, 0x0588, 0x058e, 0x0592, 0x05a5, 0x05aa, + 0x05b2, 0x05bb, 0x05c2, 0x05d8, 0x05e1, 0x05ea, 0x0617, 0x061d, + // Entry C0 - FF + 0x0622, 0x062a, 0x062e, 0x062e, 0x0637, 0x063e, 0x063e, 0x0644, + 0x064a, 0x064f, 0x0662, 0x066c, 0x0672, 0x0679, 0x0681, 0x068c, + 0x0694, 0x0694, 0x069c, 0x06a7, 0x06af, 0x06b5, 0x06bc, 0x06c4, + 0x06c4, 0x06d8, 0x06e0, 0x06e0, 0x06e5, 0x06ef, 0x06ef, 0x070a, + 0x070f, 0x070f, 0x0713, 0x071d, 0x0728, 0x072f, 0x073d, 0x074a, + 0x0751, 0x0756, 0x075b, 0x076d, 0x0773, 0x077a, 0x0782, 0x078a, + 0x0790, 0x0790, 0x0797, 0x079e, 0x07aa, 0x07b2, 0x07cb, 0x07d4, + 0x07f4, 0x0813, 0x081c, 0x0823, 0x0832, 0x0837, 0x0837, 0x083d, + // Entry 100 - 13F + 0x0844, 0x0854, 0x085a, 0x0862, + }, + }, + { // mfe + "AndorEmira arab iniAfganistanAntigua-ek-BarbudaAnguillaAlbaniArmeniAntiy" + + " neerlandeAngolaLarzantinnSamoa amerikinLostrisLostraliArubaAzerbaïd" + + "janBosni-HerzegovinnBarbadBangladesBelzikBurkina FasoBilgariBahreïnB" + + "urundiBeninBermidBruneiBoliviBrezilBahamasBoutanBotswanaBelarisBeliz" + + "KanadaRepiblik demokratik KongoRepiblik Lafrik SantralKongoLaswisCôt" + + "e d’IvoireZil CookShiliKamerounnLasinnKolonbiCosta RicaCubaKap-VerCy" + + "prusRepiblik ChekAlmagnDjiboutiDannmarkDominikRepiblik dominikinAlze" + + "riEkwaterEstoniLeziptErythreLespagnLetiopiFinlandFidjiZil malwinnMik" + + "roneziLafransGabonUnited KingdomGrenadZeorziGwiyann franseGhanaZibra" + + "ltarGreenlandGambiGineGuadloupGine ekwatoryalGresGuatemalaGuamGine-B" + + "isauGuyanaHondurasKroasiAytiOngriIndoneziIrlandIzraelLennTeritwar Br" + + "itanik Losean IndienIrakIranIslandItaliZamaikZordaniZaponKenyaKirghi" + + "zistanKambodjKiribatiKomorSaint-Christophe-ek-NiévèsLakore-dinorLako" + + "re-disidKoweitZil KaymanKazakstanLaosLibanSainte-LucieLiechtensteinS" + + "ri LankaLiberiaLezotoLituaniLuxembourgLetoniLibiMarokMonakoMoldaviMa" + + "dagaskarZil MarshallMasedwannMaliMyanmarMongoliZil Maryann dinorMart" + + "inikMoritaniMontseraMaltMorisMaldivMalawiMexikMaleziMozambikNamibiNo" + + "uvel-KaledoniNizerLil NorfolkNizeriaNicaraguaOlandNorvezNepalNauruNi" + + "oweNouvel ZelandOmanPanamaPerouPolinezi fransePapouazi-Nouvel-GineFi" + + "lipinnPakistanPolognSaint-Pierre-ek-MiquelonPitcairnPorto RicoTeritw" + + "ar PalestinnPortigalPalauParaguayKatarLarenionRoumaniLarisiRwandaLar" + + "abi SaouditZil SalomonSeselSoudanLaswedSingapourSainte-HélèneSloveni" + + "SlovakiSierra LeoneSaint-MarinSenegalSomaliSurinamSão Tome-ek-Prínsi" + + "pSalvadorLasiriSwazilandZil Tirk ek CaïcosTchadTogoThaylandTadjikist" + + "anTokelauTimor oriantalTurkmenistanTiniziTongaTirkiTrinite-ek-Tobago" + + "TuvaluTaiwanTanzaniIkrennOugandaLamerikUruguayOuzbekistanLata Vatika" + + "nSaint-Vincent-ek-GrenadinesVenezuelaZil vierz britanikZil Vierz Lam" + + "erikVietnamVanuatuWallis-ek-FutunaSamoaYemennMayotSid-AfrikZambiZimb" + + "abwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0005, 0x0013, 0x001d, 0x002f, 0x0037, 0x003d, + 0x0043, 0x0052, 0x0058, 0x0058, 0x0062, 0x0070, 0x0077, 0x007f, + 0x0084, 0x0084, 0x0090, 0x00a1, 0x00a7, 0x00b0, 0x00b6, 0x00c2, + 0x00c9, 0x00d1, 0x00d8, 0x00dd, 0x00dd, 0x00e3, 0x00e9, 0x00ef, + 0x00ef, 0x00f5, 0x00fc, 0x0102, 0x0102, 0x010a, 0x0111, 0x0116, + 0x011c, 0x011c, 0x0135, 0x014c, 0x0151, 0x0157, 0x0167, 0x016f, + 0x0174, 0x017d, 0x0183, 0x018a, 0x018a, 0x0194, 0x0198, 0x019f, + 0x019f, 0x019f, 0x01a5, 0x01b2, 0x01b8, 0x01b8, 0x01c0, 0x01c8, + // Entry 40 - 7F + 0x01cf, 0x01e1, 0x01e7, 0x01e7, 0x01ee, 0x01f4, 0x01fa, 0x01fa, + 0x0201, 0x0208, 0x020f, 0x020f, 0x0216, 0x021b, 0x0226, 0x022f, + 0x022f, 0x0236, 0x023b, 0x0249, 0x024f, 0x0255, 0x0263, 0x0263, + 0x0268, 0x0271, 0x027a, 0x027f, 0x0283, 0x028b, 0x029a, 0x029e, + 0x029e, 0x02a7, 0x02ab, 0x02b5, 0x02bb, 0x02bb, 0x02bb, 0x02c3, + 0x02c9, 0x02cd, 0x02d2, 0x02d2, 0x02da, 0x02e0, 0x02e6, 0x02e6, + 0x02ea, 0x0309, 0x030d, 0x0311, 0x0317, 0x031c, 0x031c, 0x0322, + 0x0329, 0x032e, 0x0333, 0x033f, 0x0346, 0x034e, 0x0353, 0x036f, + // Entry 80 - BF + 0x037b, 0x0387, 0x038d, 0x0397, 0x03a0, 0x03a4, 0x03a9, 0x03b5, + 0x03c2, 0x03cb, 0x03d2, 0x03d8, 0x03df, 0x03e9, 0x03ef, 0x03f3, + 0x03f8, 0x03fe, 0x0405, 0x0405, 0x0405, 0x040f, 0x041b, 0x0424, + 0x0428, 0x042f, 0x0436, 0x0436, 0x0447, 0x044f, 0x0457, 0x045f, + 0x0463, 0x0468, 0x046e, 0x0474, 0x0479, 0x047f, 0x0487, 0x048d, + 0x049c, 0x04a1, 0x04ac, 0x04b3, 0x04bc, 0x04c1, 0x04c7, 0x04cc, + 0x04d1, 0x04d6, 0x04e3, 0x04e7, 0x04ed, 0x04f2, 0x0501, 0x0515, + 0x051d, 0x0525, 0x052b, 0x0543, 0x054b, 0x0555, 0x0567, 0x056f, + // Entry C0 - FF + 0x0574, 0x057c, 0x0581, 0x0581, 0x0589, 0x0590, 0x0590, 0x0596, + 0x059c, 0x05aa, 0x05b5, 0x05ba, 0x05c0, 0x05c6, 0x05cf, 0x05de, + 0x05e5, 0x05e5, 0x05ec, 0x05f8, 0x0603, 0x060a, 0x0610, 0x0617, + 0x0617, 0x062c, 0x0634, 0x0634, 0x063a, 0x0643, 0x0643, 0x0656, + 0x065b, 0x065b, 0x065f, 0x0667, 0x0672, 0x0679, 0x0687, 0x0693, + 0x0699, 0x069e, 0x06a3, 0x06b4, 0x06ba, 0x06c0, 0x06c7, 0x06cd, + 0x06d4, 0x06d4, 0x06db, 0x06e2, 0x06ed, 0x06f9, 0x0714, 0x071d, + 0x072f, 0x0740, 0x0747, 0x074e, 0x075e, 0x0763, 0x0763, 0x0769, + // Entry 100 - 13F + 0x076e, 0x0777, 0x077c, 0x0784, + }, + }, + { // mg + "AndorraEmirà Arabo mitambatraAfghanistanAntiga sy BarbodaAnguillaAlbania" + + "ArmeniaVondronosy karaiba holandeyAngolaArzantinaSamoa amerikaninaAo" + + "trisyAostraliaArobàAzerbaidjanBosnia sy HerzegovinaBarbadyBangladesy" + + "BelzikaBorkina FasoBiolgariaBahrainBorondiBeninBermiodaBruneiBolivia" + + "BrezilaBahamasBhotanaBotsoanaBelarosyBelizeKanadaRepoblikan’i KongoR" + + "epoblika Ivon’AfrikaKôngôSoisaCôte d’IvoireNosy KookShiliKameronaSin" + + "aKôlômbiaKosta RikàKiobàNosy Cap-VertSypraRepoblikan’i TsekyAlemaina" + + "DjibotiDanmarkaDominikaRepoblika DominikaninaAlzeriaEkoateraEstoniaE" + + "jyptaEritreaEspainaEthiopiaFinlandyFidjiNosy FalkandMikrôneziaFrants" + + "aGabonAngleteraGrenadyZeorziaGuyana frantsayGhanaZibraltaraGroenland" + + "GambiaGineaGoadelopyGuinea EkoateraGresyGoatemalàGuamGiné-BisaoGuyan" + + "aHondiorasyKroasiaHaitiHongriaIndoneziaIrlandyIsraelyIndyFaridranoma" + + "sina indiana britanikaIrakIranIslandyItaliaJamaïkaJordaniaJapanaKeny" + + "aKiordistanKambôdjaKiribatiKômaoroSaint-Christophe-et-NiévèsKorea Av" + + "aratraKorea AtsimoKôeityNosy KaymanKazakhstanLaôsLibanaSainte-LucieL" + + "istensteinSri LankaLiberiaLesothoLitoaniaLioksamboroLetoniaLibyaMarô" + + "kaMônakôMôldaviaMadagasikaraNosy MarshallMakedoniaMaliMyanmarMôngôli" + + "aNosy Mariana AtsinananaMartinikaMaoritaniaMontserratMaltaMaorisyMal" + + "divaMalaoìMeksikaMalaiziaMozambikaNamibiaNouvelle-CalédonieNigerNosy" + + " NorfolkNizeriaNikaragoàHolandaNôrvezyNepalaNaoròNioéNouvelle-Zéland" + + "eOmanPanamaPeroaPolynezia frantsayPapouasie-Nouvelle-GuinéeFilipinaP" + + "akistanPôlônaSaint-Pierre-et-MiquelonPitkairnPôrtô RikôPalestinaPôrt" + + "iogalaPalaoParagoayKatarLarenionRomaniaRosiaRoandaArabia saoditaNosy" + + " SalomonaSeyshelaSodanSoedySingaporoSainte-HélèneSloveniaSlovakiaSie" + + "rra LeoneSaint-MarinSenegalSomaliaSorinamSão Tomé-et-PríncipeEl Salv" + + "adorSyriaSoazilandyNosy Turks sy CaïquesTsadyTogoThailandyTajikistan" + + "TokelaoTimor AtsinananaTorkmenistanToniziaTongàTorkiaTrinidad sy Tob" + + "agôTovalòTaioanaTanzaniaOkrainaOgandaEtazoniaOrogoayOzbekistanFirene" + + "n’i VatikanaSaint-Vincent-et-les GrenadinesVenezoelàNosy britanika v" + + "irijinyNosy Virijiny EtazoniaVietnamVanoatòWallis sy FutunaSamoaYeme" + + "nMayôtyAfrika AtsimoZambiaZimbaboe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x001e, 0x0029, 0x003a, 0x0042, 0x0049, + 0x0050, 0x006b, 0x0071, 0x0071, 0x007a, 0x008b, 0x0092, 0x009b, + 0x00a1, 0x00a1, 0x00ac, 0x00c1, 0x00c8, 0x00d2, 0x00d9, 0x00e5, + 0x00ee, 0x00f5, 0x00fc, 0x0101, 0x0101, 0x0109, 0x010f, 0x0116, + 0x0116, 0x011d, 0x0124, 0x012b, 0x012b, 0x0133, 0x013b, 0x0141, + 0x0147, 0x0147, 0x015b, 0x0172, 0x0179, 0x017e, 0x018e, 0x0197, + 0x019c, 0x01a4, 0x01a8, 0x01b2, 0x01b2, 0x01bd, 0x01c3, 0x01d0, + 0x01d0, 0x01d0, 0x01d5, 0x01e9, 0x01f1, 0x01f1, 0x01f8, 0x0200, + // Entry 40 - 7F + 0x0208, 0x021e, 0x0225, 0x0225, 0x022d, 0x0234, 0x023a, 0x023a, + 0x0241, 0x0248, 0x0250, 0x0250, 0x0258, 0x025d, 0x0269, 0x0274, + 0x0274, 0x027b, 0x0280, 0x0289, 0x0290, 0x0297, 0x02a6, 0x02a6, + 0x02ab, 0x02b5, 0x02be, 0x02c4, 0x02c9, 0x02d2, 0x02e1, 0x02e6, + 0x02e6, 0x02f0, 0x02f4, 0x02ff, 0x0305, 0x0305, 0x0305, 0x030f, + 0x0316, 0x031b, 0x0322, 0x0322, 0x032b, 0x0332, 0x0339, 0x0339, + 0x033d, 0x035e, 0x0362, 0x0366, 0x036d, 0x0373, 0x0373, 0x037b, + 0x0383, 0x0389, 0x038e, 0x0398, 0x03a1, 0x03a9, 0x03b1, 0x03cd, + // Entry 80 - BF + 0x03db, 0x03e7, 0x03ee, 0x03f9, 0x0403, 0x0408, 0x040e, 0x041a, + 0x0425, 0x042e, 0x0435, 0x043c, 0x0444, 0x044f, 0x0456, 0x045b, + 0x0462, 0x046a, 0x0473, 0x0473, 0x0473, 0x047f, 0x048c, 0x0495, + 0x0499, 0x04a0, 0x04aa, 0x04aa, 0x04c1, 0x04ca, 0x04d4, 0x04de, + 0x04e3, 0x04ea, 0x04f1, 0x04f8, 0x04ff, 0x0507, 0x0510, 0x0517, + 0x052a, 0x052f, 0x053b, 0x0542, 0x054c, 0x0553, 0x055b, 0x0561, + 0x0567, 0x056c, 0x057d, 0x0581, 0x0587, 0x058c, 0x059e, 0x05b8, + 0x05c0, 0x05c8, 0x05d0, 0x05e8, 0x05f0, 0x05fd, 0x0606, 0x0611, + // Entry C0 - FF + 0x0616, 0x061e, 0x0623, 0x0623, 0x062b, 0x0632, 0x0632, 0x0637, + 0x063d, 0x064b, 0x0658, 0x0660, 0x0665, 0x066a, 0x0673, 0x0682, + 0x068a, 0x068a, 0x0692, 0x069e, 0x06a9, 0x06b0, 0x06b7, 0x06be, + 0x06be, 0x06d5, 0x06e0, 0x06e0, 0x06e5, 0x06ef, 0x06ef, 0x0705, + 0x070a, 0x070a, 0x070e, 0x0717, 0x0721, 0x0728, 0x0738, 0x0744, + 0x074b, 0x0751, 0x0757, 0x076a, 0x0771, 0x0778, 0x0780, 0x0787, + 0x078d, 0x078d, 0x0795, 0x079c, 0x07a6, 0x07ba, 0x07d9, 0x07e3, + 0x07fa, 0x0810, 0x0817, 0x081f, 0x082f, 0x0834, 0x0834, 0x0839, + // Entry 100 - 13F + 0x0840, 0x084d, 0x0853, 0x085b, + }, + }, + { // mgh + "UandoraUfugustaniUalbaniaUsamoa ya MarekaniUazabajaniUrundiUbelinUkanada" + + "UkongoUswisiUkodivaUchileUchinaUkolombiaUkubaUkuprosiUchekiUjibutiUd" + + "enimakaUdominikaAlujeriaUmisiriUritereaUhispaniaUhabeshiUfiniUfijiUf" + + "aransaUgaboniUgrenadaUjojiaUfaransa yo GwayaUganaUjibraltaUgrinlandi" + + "UgambiaUgineUgwadelupeUgwatemalaUgwamUginebisauUguyanaUhondurasiUkor" + + "asiaUhaitiUhungariaUndonesiaUayalandiUisraeliUhindiniWirakiItaliaUja" + + "maikaUyordaniUjapaniUkenyaUkambodiaUkomoroUsantakitzi na NevisUkorea" + + " KaskaziniUkorea KusiniUkazakistaniUlebanoniUsantalusiaUshenteniUsir" + + "ilankaUliberiaUlesotoUtwaniaUsembajiUlativiaUlibyaUmantegroUbukiniUm" + + "asedoniaUmalawiUmozambikiUnijeriUnijeriaUnorweUomaniUpanamaUperuuUfa" + + "ransa yo PotinaUpapuaUfilipinoUpakistaniUpolandiUsantapieri na Mikel" + + "oniUpitkairniUpwetorikoParagwaiUkatariUriyunioniUromaniaUrwandaUsaud" + + "iUshelisheliUsudaniUswidiUsingapooUsantahelenaUsloveniaUslovakiaUsam" + + "arinoUsenegaliUsomaliaUsurinamuUsao Tome na PrincipeUsalavadoUsiriaU" + + "swaziUchadiUtogoUtailandiUjikistaniUtokelauUtimo MasharikiUturukimen" + + "istaniUtunisiaUtongaUtukiUtrinidad na TobagoUtuvaluUtanzaniaUmarekan" + + "iUvatikaniUsantavisenti na GrenadiniUvenezuelaUvietinamuUvanuatuUwal" + + "is na FutunaUsamoaUyemeniAfrika du SuluUzambiaUzimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x0007, 0x0011, 0x0011, 0x0011, 0x0019, + 0x0019, 0x0019, 0x0019, 0x0019, 0x0019, 0x002b, 0x002b, 0x002b, + 0x002b, 0x002b, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x003b, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, + 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, + 0x0048, 0x0048, 0x0048, 0x0048, 0x004e, 0x0054, 0x005b, 0x005b, + 0x0061, 0x0061, 0x0067, 0x0070, 0x0070, 0x0070, 0x0075, 0x0075, + 0x0075, 0x0075, 0x007d, 0x0083, 0x0083, 0x0083, 0x008a, 0x0093, + // Entry 40 - 7F + 0x009c, 0x009c, 0x00a4, 0x00a4, 0x00a4, 0x00a4, 0x00ab, 0x00ab, + 0x00b3, 0x00bc, 0x00c4, 0x00c4, 0x00c9, 0x00ce, 0x00ce, 0x00ce, + 0x00ce, 0x00d6, 0x00dd, 0x00dd, 0x00e5, 0x00eb, 0x00fc, 0x00fc, + 0x0101, 0x010a, 0x0114, 0x011b, 0x0120, 0x012a, 0x012a, 0x012a, + 0x012a, 0x0134, 0x0139, 0x0143, 0x014a, 0x014a, 0x014a, 0x0154, + 0x015c, 0x0162, 0x016b, 0x016b, 0x0174, 0x017d, 0x0185, 0x0185, + 0x018d, 0x018d, 0x0193, 0x0193, 0x0193, 0x0199, 0x0199, 0x01a1, + 0x01a9, 0x01b0, 0x01b6, 0x01b6, 0x01bf, 0x01bf, 0x01c6, 0x01da, + // Entry 80 - BF + 0x01ea, 0x01f7, 0x01f7, 0x01f7, 0x0203, 0x0203, 0x020c, 0x0217, + 0x0220, 0x022a, 0x0232, 0x0239, 0x0240, 0x0248, 0x0250, 0x0256, + 0x0256, 0x0256, 0x0256, 0x025f, 0x025f, 0x0266, 0x0266, 0x0270, + 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, 0x0270, + 0x0270, 0x0270, 0x0270, 0x0277, 0x0277, 0x0277, 0x0281, 0x0281, + 0x0281, 0x0288, 0x0288, 0x0290, 0x0290, 0x0290, 0x0296, 0x0296, + 0x0296, 0x0296, 0x0296, 0x029c, 0x02a3, 0x02a9, 0x02bb, 0x02c1, + 0x02ca, 0x02d4, 0x02dc, 0x02f3, 0x02fd, 0x0307, 0x0307, 0x0307, + // Entry C0 - FF + 0x0307, 0x030f, 0x0316, 0x0316, 0x0320, 0x0328, 0x0328, 0x0328, + 0x032f, 0x0335, 0x0335, 0x0340, 0x0347, 0x034d, 0x0356, 0x0362, + 0x036b, 0x036b, 0x0374, 0x0374, 0x037d, 0x0386, 0x038e, 0x0397, + 0x0397, 0x03ac, 0x03b5, 0x03b5, 0x03bb, 0x03c1, 0x03c1, 0x03c1, + 0x03c7, 0x03c7, 0x03cc, 0x03d5, 0x03df, 0x03e7, 0x03f6, 0x0406, + 0x040e, 0x0414, 0x0419, 0x042c, 0x0433, 0x0433, 0x043c, 0x043c, + 0x043c, 0x043c, 0x0445, 0x0445, 0x0445, 0x044e, 0x0468, 0x0472, + 0x0472, 0x0472, 0x047c, 0x0484, 0x0494, 0x049a, 0x049a, 0x04a1, + // Entry 100 - 13F + 0x04a1, 0x04af, 0x04b6, 0x04bf, + }, + }, + { // mgo + "Kamalunaba aben tisɔ̀", + []uint16{ // 261 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + // Entry 40 - 7F + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + // Entry 80 - BF + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + // Entry C0 - FF + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, + // Entry 100 - 13F + 0x0007, 0x0007, 0x0007, 0x0007, 0x0017, + }, + }, + { // mk + mkRegionStr, + mkRegionIdx, + }, + { // ml + mlRegionStr, + mlRegionIdx, + }, + { // mn + mnRegionStr, + mnRegionIdx, + }, + { // mr + mrRegionStr, + mrRegionIdx, + }, + { // ms + msRegionStr, + msRegionIdx, + }, + { // mt + "AndorraEmirati Għarab MaqgħudaAfganistanAntigua and BarbudaAngwillaAlban" + + "ijaArmenjaAntilles OlandiżiAngolaAntartikaArġentinaSamoa AmerikanaAw" + + "strijaAwstraljaArubaGżejjer AlandAżerbajġanBożnija ĦerżegovinaBarbad" + + "osBangladexxBelġjuBurkina FasoBulgarijaBaħrajnBurundiBeninBermudaBru" + + "nejBolivjaIl-BrażilBaħamasButanBouvet IslandBotswanaBjelorussjaBeliż" + + "eKanadaCocos (Keeling) IslandsDemocratic Republic of the CongoRepubb" + + "lika Afrikana ĊentraliKongoSvizzeraKosta ta’ l-AvorjuCook IslandsĊil" + + "iKamerunIċ-ĊinaKolombjaKosta RikaKubaKape VerdeChristmas IslandĊipru" + + "Repubblika ĊekaIl-ĠermanjaĠibutiDanimarkaDominikaRepublikka Domenika" + + "naAlġerijaEkwadorEstonjaEġittuSahara tal-PunentEritreaSpanjaEtijopja" + + "Unjoni EwropeaFinlandjaFiġiFalkland IslandsMikronesjaGżejjer FaroeFr" + + "anzaGabonL-IngilterraGrenadaĠeorġjaGujana FranċiżaGanaGibraltarGrinl" + + "andjaGambjaGineaGwadelupeGinea EkwatorjaliGreċjaSouth Georgia and th" + + "e South Sandwich IslandsGwatemalaGwamGinea-BissawGujanaĦong Kong S.A" + + ".R. ĊinaHeard Island and McDonald IslandsĦondurasKroazjaĦaitiUngerij" + + "aIndoneżjaIrlandaIżraelIsle of ManL-IndjaBritish Indian Ocean Territ" + + "oryIraqIranIslandaL-ItaljaĠamajkaĠordanIl-ĠappunKenjaKirgistanKambod" + + "jaKiribatiKomorosSaint Kitts and NevisKoreja ta’ FuqKoreja t’IsfelKu" + + "wajtGżejjer KajmaniKażakstanLaosLibanuSanta LuċijaLiechtensteinSri L" + + "ankaLiberjaLesotoLitwanjaLussemburguLatvjaLibjaMarokkMonakoMoldovaMa" + + "dagaskarGżejjer ta’ MarshallMaċedonjaMaliMjanmarMongoljaMacao S.A.R." + + ", ChinaGżejjer Marjana ta’ FuqMartinikMawritanjaMontserratMaltaMawri" + + "zjuMaldivesMalawiMessikuMalasjaMożambikNamibjaNew CaledoniaNiġerNorf" + + "olk IslandNiġerjaNikaragwaOlandaNorveġjaNepalNauruNiueNew ZealandOma" + + "nPanamaPeruPolinesja FranċiżaPapwa-Ginea ĠdidaFilippiniPakistanPolon" + + "jaSaint Pierre and MiquelonPitcairnPuerto RicoTerritorju Palestinjan" + + "PortugallPalauParagwajQatarRéunionRumanijaIr-RussjaRwandaGħarabja Sa" + + "wditaSolomon IslandsSeychellesSudanŻvezjaSingaporSaint HelenaSlovenj" + + "aSvalbard and Jan MayenSlovakkjaSierra LeoneSan MarinoSenegalSomalja" + + "SurinamSao Tome and PrincipeEl SalvadorSirjaSważilandTurks and Caico" + + "s IslandsĊadTerritorji Franċiżi ta’ NofsinharTogoTajlandjaTaġikistan" + + "TokelawTimor tal-LvantTurkmenistanTuneżTongaTurkijaTrinidad u Tobago" + + "TuvaluTajwanTanżanijaUkrainaUgandaUnited States Minor Outlying Islan" + + "dsL-Istati UnitiUrugwajUżbekistanVatikanSaint Vincent and the Grenad" + + "inesVenezwelaBritish Virgin IslandsU.S. Virgin IslandsVjetnamVanwatu" + + "Wallis and FutunaSamoaJemenMajotteAfrika t’IsfelŻambjaŻimbabweReġjun" + + " Mhux MagħrufDinjaAffrikaAmerika t’IsfelOċejanjaAffrika tal-PunentAm" + + "erika ĊentraliAffrika tal-LvantAffrika ta’ FuqAffrika NofsaniAffrika" + + " t’IsfelAmerikaKaribewAsja tal-LvantAsja t’Isfel ĊentraliAsja tax-Xl" + + "okkEwropa t’IsfelAwstralja u New ZealandMelanesjaReġjun ta’ Mikroneż" + + "jaPolinesjaAsjaAsja ĊentraliAsja tal-PunentEwropaEwropa tal-LvantEwr" + + "opa ta’ FuqEwropa tal-PunentAmerika Latina", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x0020, 0x002a, 0x003d, 0x0045, 0x004d, + 0x0054, 0x0066, 0x006c, 0x0075, 0x007f, 0x008e, 0x0096, 0x009f, + 0x00a4, 0x00b2, 0x00be, 0x00d4, 0x00dc, 0x00e6, 0x00ed, 0x00f9, + 0x0102, 0x010a, 0x0111, 0x0116, 0x0116, 0x011d, 0x0123, 0x012a, + 0x012a, 0x0134, 0x013c, 0x0141, 0x014e, 0x0156, 0x0161, 0x0168, + 0x016e, 0x0185, 0x01a5, 0x01c2, 0x01c7, 0x01cf, 0x01e3, 0x01ef, + 0x01f4, 0x01fb, 0x0204, 0x020c, 0x020c, 0x0216, 0x021a, 0x0224, + 0x0224, 0x0234, 0x023a, 0x024a, 0x0256, 0x0256, 0x025d, 0x0266, + // Entry 40 - 7F + 0x026e, 0x0283, 0x028c, 0x028c, 0x0293, 0x029a, 0x02a1, 0x02b2, + 0x02b9, 0x02bf, 0x02c7, 0x02d5, 0x02de, 0x02e3, 0x02f3, 0x02fd, + 0x030b, 0x0311, 0x0316, 0x0322, 0x0329, 0x0332, 0x0343, 0x0343, + 0x0347, 0x0350, 0x035a, 0x0360, 0x0365, 0x036e, 0x037f, 0x0386, + 0x03b2, 0x03bb, 0x03bf, 0x03cb, 0x03d1, 0x03e8, 0x0409, 0x0412, + 0x0419, 0x041f, 0x0427, 0x0427, 0x0431, 0x0438, 0x043f, 0x044a, + 0x0451, 0x046f, 0x0473, 0x0477, 0x047e, 0x0486, 0x0486, 0x048e, + 0x0495, 0x049f, 0x04a4, 0x04ad, 0x04b5, 0x04bd, 0x04c4, 0x04d9, + // Entry 80 - BF + 0x04e9, 0x04f9, 0x04ff, 0x050f, 0x0519, 0x051d, 0x0523, 0x0530, + 0x053d, 0x0546, 0x054d, 0x0553, 0x055b, 0x0566, 0x056c, 0x0571, + 0x0577, 0x057d, 0x0584, 0x0584, 0x0584, 0x058e, 0x05a5, 0x05af, + 0x05b3, 0x05ba, 0x05c2, 0x05d5, 0x05ef, 0x05f7, 0x0601, 0x060b, + 0x0610, 0x0618, 0x0620, 0x0626, 0x062d, 0x0634, 0x063d, 0x0644, + 0x0651, 0x0657, 0x0665, 0x066d, 0x0676, 0x067c, 0x0685, 0x068a, + 0x068f, 0x0693, 0x069e, 0x06a2, 0x06a8, 0x06ac, 0x06c0, 0x06d2, + 0x06db, 0x06e3, 0x06ea, 0x0703, 0x070b, 0x0716, 0x072c, 0x0735, + // Entry C0 - FF + 0x073a, 0x0742, 0x0747, 0x0747, 0x074f, 0x0757, 0x0757, 0x0760, + 0x0766, 0x0777, 0x0786, 0x0790, 0x0795, 0x079c, 0x07a4, 0x07b0, + 0x07b8, 0x07ce, 0x07d7, 0x07e3, 0x07ed, 0x07f4, 0x07fb, 0x0802, + 0x0802, 0x0817, 0x0822, 0x0822, 0x0827, 0x0831, 0x0831, 0x0849, + 0x084d, 0x0872, 0x0876, 0x087f, 0x088a, 0x0891, 0x08a0, 0x08ac, + 0x08b2, 0x08b7, 0x08be, 0x08cf, 0x08d5, 0x08db, 0x08e5, 0x08ec, + 0x08f2, 0x0916, 0x0924, 0x092b, 0x0936, 0x093d, 0x095d, 0x0966, + 0x097c, 0x098f, 0x0996, 0x099d, 0x09ae, 0x09b3, 0x09b3, 0x09b8, + // Entry 100 - 13F + 0x09bf, 0x09cf, 0x09d6, 0x09df, 0x09f4, 0x09f9, 0x0a00, 0x0a00, + 0x0a11, 0x0a1a, 0x0a2c, 0x0a3d, 0x0a4e, 0x0a5f, 0x0a6e, 0x0a7f, + 0x0a86, 0x0a86, 0x0a8d, 0x0a9b, 0x0ab3, 0x0ac1, 0x0ad1, 0x0ae8, + 0x0af1, 0x0b0a, 0x0b13, 0x0b17, 0x0b25, 0x0b34, 0x0b3a, 0x0b4a, + 0x0b5a, 0x0b6b, 0x0b79, + }, + }, + { // mua + "andorraSǝr Arabiya ma tainiafghanistaŋantiguan ne Barbudaanguiyaalbaniya" + + "armeniyaSǝr ma kasǝŋ ma laŋneangolaargentiniyasamoa Amerikaaustriyaa" + + "ustraliyaarubaazerbaijaŋbosniya ne Herzegovinabarbadiyabangladeshiya" + + "belgikaburkina Fasobulgariyabahraiŋburundibeniŋbermudiyabruniyaboliv" + + "iyabrazilyabahamasbutaŋbotswanabelarussiyabeliziyakanadaSǝr Kongo ma" + + " dii ne zaircentrafrikakongoSǝr Swissser Ivoiriyakook ma laŋnesyilik" + + "ameruŋsyiŋkolombiyakosta RikaKubakap ma laŋneSyipriyaSǝr SyekGermani" + + "yaDjiboutiDaŋmarkDominikSǝr Dominik ma liialgeriyaEkwatǝrEstoniyaSǝr" + + " EgyptSǝr EritreEspaŋiyaEtiopiaSǝr FinlandSǝr FijiSǝr malouniya ma l" + + "aŋneMicronesiyaFranssǝGaboŋSǝr AnglofoŋGrenadǝGeorgiyaSǝr Guyana ma " + + "FranssǝGanaSǝr GibraltarSǝr GroenlandGambiyaGuineSǝr GwadeloupǝSǝr G" + + "uineSǝr GrekGwatemalaGwamGuine ma BissaoGuyanaSǝr HonduraskroatiyaSǝ" + + "r HaitiHungriyaIndonesiyaSǝr IrelandSǝr IsraelSǝr Indǝanglofoŋ ma In" + + "diyaIrakIraŋSǝr IslandItaliyaJamaikaJordaniyaJapaŋSǝr KenyaKirgizsta" + + "ŋkambodiyaSǝr KiribatikomoraSǝr Kristof ne NievǝSǝr Kore fah sǝŋSǝr" + + " Kore nekǝsǝŋSǝr Kowaitkayman ma laŋneKazakstaŋSǝr LaosLibaŋSǝr Luci" + + "aLichtǝnsteiŋSǝr LankaLiberiyaSǝr LesothoLituaniyaSǝr LuxemburgLeton" + + "iyaLibiyaMarokMonakoMoldoviyaMadagaskarSǝr Marshall ma laŋneMacedoni" + + "yaSǝr MaliSǝr MyanmarMongoliyaSǝr Maria ma laŋneMartinikaMauritaniya" + + "Sǝr MontserratSǝr MaltaSǝr MauricǝMaldivǝSǝr MalawiMexikoMalaysiyaMo" + + "zambikaNamibiyaKaledoniya mafuuSǝr NigerNorfolk ma laŋneNigeriyaNika" + + "ragwaSǝr ma kasǝŋNorvegǝSǝr NepalSǝr NauruNiweZeland mafuuOmaŋSǝr Pa" + + "namaPeruSǝr Polynesiya ma FranssǝPapuasiya Guine mafuuFilipiŋPakista" + + "ŋPologŋSǝr Pǝtar ne MikǝlonPitkairnPorto RikoSǝr PalestiniyaSǝr Por" + + "tugalSǝr PalauParagwaiKatarSǝr ReunionRomaniyaRussiyaRwandaSǝr Arabi" + + "yaSǝr Salomon ma laŋneSaichelSudaŋSǝr SuedSingapurSǝr HelenaSloveniy" + + "aSlovakiyaSierra LeonǝSǝr MarinoSenegalSomaliyaSǝr SurinamSao Tome n" + + "e PrincipeSǝr SalvadorSyriaSǝr SwazilandTurkiya ne kaicos ma laŋnesy" + + "adSǝr TogoTailandTajikistaŋSǝr TokelauTimoriyaTurkmenistaŋTunisiyaSǝ" + + "r TongaTurkiyaTrinite ne TobagoSǝr TuvaluTaiwaŋTanzaniyaUkraiŋUganda" + + "AmerikaUrugwaiUzbekistaŋVaticaŋSǝr Vinceŋ ne GrenadiŋSǝr Venezuelase" + + "r Anglofon ma laŋneSǝr amerika ma laŋneSǝr VietnamSǝr VanuatuWallis " + + "ne FutunaSǝr SamoaYemeŋMayotAfrika nekǝsǝŋZambiyaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x001c, 0x0028, 0x003b, 0x0042, 0x004a, + 0x0052, 0x006b, 0x0071, 0x0071, 0x007c, 0x0089, 0x0091, 0x009b, + 0x00a0, 0x00a0, 0x00ab, 0x00c1, 0x00ca, 0x00d7, 0x00de, 0x00ea, + 0x00f3, 0x00fb, 0x0102, 0x0108, 0x0108, 0x0111, 0x0118, 0x0120, + 0x0120, 0x0128, 0x012f, 0x0135, 0x0135, 0x013d, 0x0148, 0x0150, + 0x0156, 0x0156, 0x016f, 0x017a, 0x017f, 0x0189, 0x0195, 0x01a3, + 0x01a8, 0x01b0, 0x01b5, 0x01be, 0x01be, 0x01c8, 0x01cc, 0x01d9, + 0x01d9, 0x01d9, 0x01e1, 0x01ea, 0x01f3, 0x01f3, 0x01fb, 0x0203, + // Entry 40 - 7F + 0x020a, 0x021d, 0x0225, 0x0225, 0x022d, 0x0235, 0x023f, 0x023f, + 0x024a, 0x0253, 0x025a, 0x025a, 0x0266, 0x026f, 0x0287, 0x0292, + 0x0292, 0x029a, 0x02a0, 0x02ae, 0x02b6, 0x02be, 0x02d5, 0x02d5, + 0x02d9, 0x02e7, 0x02f5, 0x02fc, 0x0301, 0x0311, 0x031b, 0x0324, + 0x0324, 0x032d, 0x0331, 0x0340, 0x0346, 0x0346, 0x0346, 0x0353, + 0x035b, 0x0365, 0x036d, 0x036d, 0x0377, 0x0383, 0x038e, 0x038e, + 0x0398, 0x03ab, 0x03af, 0x03b4, 0x03bf, 0x03c6, 0x03c6, 0x03cd, + 0x03d6, 0x03dc, 0x03e6, 0x03f1, 0x03fa, 0x0407, 0x040d, 0x0423, + // Entry 80 - BF + 0x0436, 0x044a, 0x0455, 0x0465, 0x046f, 0x0478, 0x047e, 0x0488, + 0x0496, 0x04a0, 0x04a8, 0x04b4, 0x04bd, 0x04cb, 0x04d3, 0x04d9, + 0x04de, 0x04e4, 0x04ed, 0x04ed, 0x04ed, 0x04f7, 0x050e, 0x0518, + 0x0521, 0x052d, 0x0536, 0x0536, 0x054a, 0x0553, 0x055e, 0x056d, + 0x0577, 0x0584, 0x058c, 0x0597, 0x059d, 0x05a6, 0x05af, 0x05b7, + 0x05c7, 0x05d1, 0x05e2, 0x05ea, 0x05f3, 0x0602, 0x060a, 0x0614, + 0x061e, 0x0622, 0x062e, 0x0633, 0x063e, 0x0642, 0x065d, 0x0672, + 0x067a, 0x0683, 0x068a, 0x06a1, 0x06a9, 0x06b3, 0x06c3, 0x06d0, + // Entry C0 - FF + 0x06da, 0x06e2, 0x06e7, 0x06e7, 0x06f3, 0x06fb, 0x06fb, 0x0702, + 0x0708, 0x0714, 0x072a, 0x0731, 0x0737, 0x0740, 0x0748, 0x0753, + 0x075c, 0x075c, 0x0765, 0x0772, 0x077d, 0x0784, 0x078c, 0x0798, + 0x0798, 0x07ac, 0x07b9, 0x07b9, 0x07be, 0x07cc, 0x07cc, 0x07e7, + 0x07eb, 0x07eb, 0x07f4, 0x07fb, 0x0806, 0x0812, 0x081a, 0x0827, + 0x082f, 0x0839, 0x0840, 0x0851, 0x085c, 0x0863, 0x086c, 0x0873, + 0x0879, 0x0879, 0x0880, 0x0887, 0x0892, 0x089a, 0x08b3, 0x08c1, + 0x08d7, 0x08ed, 0x08f9, 0x0905, 0x0915, 0x091f, 0x091f, 0x0925, + // Entry 100 - 13F + 0x092a, 0x093b, 0x0942, 0x094a, + }, + }, + { // my + myRegionStr, + myRegionIdx, + }, + { // mzn + "آسنسیون جزیرهآندورامتحده عربی اماراتافغانستونآنتیگوا و باربوداآنگویلاآلب" + + "انیارمنستونآنگولاجنوبی یخ\u200cبزه قطبآرژانتینآمریکای ِساموآاتریشاس" + + "ترالیاآروباآلند جزیرهآذربایجونبوسنی و هرزگوینباربادوسبنگلادشبلژیکبو" + + "رکینا فاسوبلغارستونبحرینبوروندیبنینسنت بارتلمیبرمودابرونئیبولیویهلن" + + "د ِکاراییبی جزایربرزیلباهامابوتانبووت جزیرهبوتساوانابلاروسبلیزکاناد" + + "اکوک (کیلینگ) جزایرکنگو کینشاسامرکزی آفریقای جمهوریکنگو برازاویلسوی" + + "یسعاج ِساحلکوک جزایرشیلیکامرونچینکلمبیاکلیپرتون جزیرهکاستاریکاکوباک" + + "یپ وردکوراسائوکریسمس جزیرهقبرسچک جمهوریآلماندیگو گارسیاجیبوتیدانمار" + + "کدومنیکادومنیکن جمهوریالجزیرهسوتا و ملیلهاکوادراستونیمصرغربی صحراار" + + "یترهایسپانیااتیوپیاروپا اتحادیهفنلاندفیجیفالکلند جزیره\u200cئونمیکر" + + "ونزیفارو جزایرفرانسهگابونبریتانیاگراناداگرجستونفرانسه\u200cی ِگویان" + + "گرنزیغناجبل طارقگرینلندگامبیاگینهگوادلوپاستوایی گینهیونانجنوبی جورج" + + "یا و جنوبی ساندویچ جزایرگواتمالاگوئامگینه بیسائوگویانهنگ کنگهارد و " + + "مک\u200cدونالد جزایرهندوراسکرواسیهاییتیمجارستونقناری جزایراندونزیای" + + "رلندایسراییلمن ِجزیرههندبریتانیای هند ِاوقیانوس ِمناطقعراقایرانایسل" + + "ندایتالیاجرسیجاماییکااردنجاپونکنیاقرقیزستونکامبوجکیریباتیکومورسنت ک" + + "یتس و نویسشمالی کُرهجنوبی کُرهکویتکیمن جزیره\u200cئونقزاقستونلائوسل" + + "بنانسنت لوسیالیختن اشتاینسریلانکالیبریالسوتولتونیلوکزامبورگلاتویالی" + + "بیمراکشموناکومولداویمونته\u200cنگروسنت مارتینماداگاسکارمارشال جزایر" + + "مقدونیهمالیمیانمارمغولستونماکائو (چین دله)شمالی ماریانا جزایرمارتین" + + "یک جزیره\u200cئونموریتانیمونتسراتمالتمورى تيوسمالدیومالاویمکزیکمالز" + + "یموزامبیکنامبیانیو کالیدونیانیجرنورفولک جزیرهنیجریهنیکاراگوئههلندنر" + + "وژنپالنائورونیئونیوزلندعمانپاناماپروفرانسه\u200cی پولی\u200cنزیپاپو" + + "ا نو گینهفیلیپینپاکستونلهستونسن پییر و میکلنپیتکارین جزایرپورتوریکو" + + "فلسطین ِسرزمینپرتغالپالائوپاراگوئهقطراوقیانوسیه\u200cی ِپرت ِجائونر" + + "ئونیونرومانیصربستونروسیهروآنداعربستونسلیمون جزیرهسیشلسودانسوئدسنگاپ" + + "ورسنت هلنااسلوونیسوالبارد و يان مايناسلواکیسیرالئونسن مارینوسنگالسو" + + "مالیسورینامجنوبی سودانسائوتومه و پرینسیپالسالوادورسنت مارتنسوریهسوا" + + "زیلندتریستان دا جونهاتورکس و کایکوس جزایرچادفرانسه\u200cی جنوبی منا" + + "طقتوگوتایلندتاجیکستونتوکلائوتیمور شرقیترکمونستونتونستونگاترکیهترینی" + + "داد و توباگوتووالوتایوانتانزانیااوکرایناوگانداآمریکای پَرتِ\u200cپِ" + + "لا جزیره\u200cئونمتحده ایالاتاروگوئهازبکستونواتیکانسنت وینسنت و گرن" + + "ادینونزوئلابریتانیای ویرجینآمریکای ویرجینویتناموانواتووالیس و فوتون" + + "اساموآکوزوویمنمایوتجنوبی افریقازامبیازیمبابوهنامَیِّن منطقهجهونآفری" + + "قاشمالی آمریکاجنوبی آمریکااوقیانوسیهغربی آفریقامیونی آمریکاشرقی آفر" + + "یقاشمالی ۀفریقامیونی آفریقاجنوبی آفریقاآمریکاشمالی امریکاکاراییبشرق" + + "ی آسیاجنوبی آسیاآسیای ِجنوب\u200cشرقی\u200cوَرجنوبی اروپااوسترالزیم" + + "لانزیمیکرونزی منقطهپولی\u200cنزیآسیامیونی آسیاغربی آسیااروپاشرقی ار" + + "وپاشمالی اروپاغربی اروپالاتین آمریکا", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0019, 0x0025, 0x0045, 0x0057, 0x0077, 0x0085, 0x0091, + 0x00a1, 0x00a1, 0x00ad, 0x00cc, 0x00dc, 0x00f7, 0x0101, 0x0111, + 0x011b, 0x012e, 0x0140, 0x015c, 0x016c, 0x017a, 0x0184, 0x019b, + 0x01ad, 0x01b7, 0x01c5, 0x01cd, 0x01e2, 0x01ee, 0x01fa, 0x0206, + 0x022c, 0x0236, 0x0242, 0x024c, 0x025f, 0x0271, 0x027d, 0x0285, + 0x0291, 0x02b1, 0x02c8, 0x02ee, 0x0307, 0x0311, 0x0322, 0x0333, + 0x033b, 0x0347, 0x034d, 0x0359, 0x0374, 0x0386, 0x038e, 0x039b, + 0x03ab, 0x03c2, 0x03ca, 0x03db, 0x03e5, 0x03fa, 0x0406, 0x0414, + // Entry 40 - 7F + 0x0422, 0x043d, 0x044b, 0x0461, 0x046d, 0x0479, 0x047f, 0x0490, + 0x049c, 0x04ac, 0x04b8, 0x04d1, 0x04dd, 0x04e5, 0x0507, 0x0517, + 0x052a, 0x0536, 0x0540, 0x0550, 0x055e, 0x056c, 0x058a, 0x0594, + 0x059a, 0x05a9, 0x05b7, 0x05c3, 0x05cb, 0x05d9, 0x05f0, 0x05fa, + 0x0639, 0x0649, 0x0653, 0x0668, 0x0672, 0x067f, 0x06a9, 0x06b7, + 0x06c3, 0x06cf, 0x06df, 0x06f4, 0x0702, 0x070e, 0x071e, 0x072f, + 0x0735, 0x076e, 0x0776, 0x0780, 0x078c, 0x079a, 0x07a2, 0x07b2, + 0x07ba, 0x07c4, 0x07cc, 0x07de, 0x07ea, 0x07fa, 0x0804, 0x081f, + // Entry 80 - BF + 0x0832, 0x0845, 0x084d, 0x0869, 0x0879, 0x0883, 0x088d, 0x089e, + 0x08b5, 0x08c5, 0x08d1, 0x08db, 0x08e5, 0x08f9, 0x0905, 0x090d, + 0x0917, 0x0923, 0x0931, 0x0946, 0x0959, 0x096d, 0x0984, 0x0992, + 0x099a, 0x09a8, 0x09b8, 0x09d4, 0x09f8, 0x0a1c, 0x0a2c, 0x0a3c, + 0x0a44, 0x0a55, 0x0a61, 0x0a6d, 0x0a77, 0x0a81, 0x0a91, 0x0a9d, + 0x0ab6, 0x0abe, 0x0ad7, 0x0ae3, 0x0af7, 0x0aff, 0x0b07, 0x0b0f, + 0x0b1b, 0x0b23, 0x0b31, 0x0b39, 0x0b45, 0x0b4b, 0x0b6e, 0x0b86, + 0x0b94, 0x0ba2, 0x0bae, 0x0bc9, 0x0be4, 0x0bf6, 0x0c11, 0x0c1d, + // Entry C0 - FF + 0x0c29, 0x0c39, 0x0c3f, 0x0c6e, 0x0c7c, 0x0c88, 0x0c96, 0x0ca0, + 0x0cac, 0x0cba, 0x0cd1, 0x0cd9, 0x0ce3, 0x0ceb, 0x0cf9, 0x0d08, + 0x0d16, 0x0d39, 0x0d47, 0x0d57, 0x0d68, 0x0d72, 0x0d7e, 0x0d8c, + 0x0da1, 0x0dc3, 0x0dd7, 0x0de8, 0x0df2, 0x0e02, 0x0e20, 0x0e45, + 0x0e4b, 0x0e72, 0x0e7a, 0x0e86, 0x0e98, 0x0ea6, 0x0eb9, 0x0ecd, + 0x0ed5, 0x0edf, 0x0ee9, 0x0f09, 0x0f15, 0x0f21, 0x0f31, 0x0f3f, + 0x0f4d, 0x0f85, 0x0f9c, 0x0faa, 0x0fba, 0x0fc8, 0x0fed, 0x0ffb, + 0x101a, 0x1035, 0x1041, 0x104f, 0x1069, 0x1073, 0x107d, 0x1083, + // Entry 100 - 13F + 0x108d, 0x10a4, 0x10b0, 0x10c0, 0x10db, 0x10e3, 0x10ef, 0x1106, + 0x111d, 0x1131, 0x1146, 0x115d, 0x1172, 0x1189, 0x11a0, 0x11b7, + 0x11c3, 0x11da, 0x11e8, 0x11f9, 0x120c, 0x1235, 0x124a, 0x125c, + 0x1268, 0x1283, 0x1294, 0x129c, 0x12af, 0x12c0, 0x12ca, 0x12dd, + 0x12f2, 0x1305, 0x131c, + }, + }, + { // naq + "AndorrabUnited Arab EmiratesAfghanistanniAntiguab tsî BarbudabAnguillabA" + + "lbaniabArmeniabNetherlands AntillesAngolabArgentinabAmericab SamoabA" + + "ustriabAustraliebArubabAzerbaijanniBosniab tsî HerzegovinabBarbadosB" + + "angladesBelgiummiBurkina FasobBulgariabBahrainBurundibBeninsBermudas" + + "BruneiBoliviabBraziliabBahamasBhutansBotswanabBelarusBelizeKanadabDe" + + "mocratic Republic of the CongoCentral African RepublikiCongobSwitzer" + + "landiIvoorkusiCook IslandsChilibCameroonniChinabColombiabCosta RicaC" + + "ubabCape Verde IslandsCyprusCzech RepublikiDuitslandiDjiboutiDenmark" + + "iDominicabDominican RepublicAlgeriabEcuadoriEstoniabEgiptebEritreabS" + + "paniebEthiopiabFinlandiFijibFalkland IslandsMicronesiaFrankreikiGabo" + + "niUnited KingdomGrenadaGeorgiabFrench GuianaGhanabGibraltarGreenland" + + "GambiabGuineabGuadeloupeEquatorial GuineabXrikelandiGuatemalaGuamGui" + + "nea-BissauGuyanaHondurasCroatiabHaitiHongareiebIndonesiabIrlandiIsra" + + "eliIndiabBritish Indian Ocean TerritoryIraqiIranniIcelandItaliabJama" + + "icabJordanniJapanniKenyabKyrgyzstanniCambodiabKiribatiComorosSaint K" + + "itts and NevisKoreab, NoordKoreab, SuidKuwaitiCayman IslandsKazakhst" + + "anniLaosLebanonniSaint LuciaLiechtensteinniSri LankabLiberiabLesotho" + + "bLithuaniabLuxembourgiLatviaLibyabMoroccoMonacoMoldovaMadagascariMar" + + "shall IslandsMacedoniabMalibMyanmarMongoliaNorthern Mariana IslandsM" + + "artiniqueMauritaniaMontserratMaltaMauritiusMaldivesMalawibMexicobMal" + + "aysiabMozambikiNamibiabNew CaledoniaNigeriNorfolk IslandNigeriebNica" + + "raguabNetherlandsNoorweebNepaliNauruNiueNew ZealandiOmanPanamaPerubF" + + "rench PolynesiaPapua New GuineabPhilippinniPakistanniPolandiSaint Pi" + + "erre and MiquelonPitcairnPuerto RicoPalestinian West Bank and GazaPo" + + "rtugaliPalauParaguaibQatarRéunionRomaniaRasiabRwandabSaudi ArabiabSo" + + "lomon IslandsSeychellesSudanniSwedebSingaporeSaint HelenaSloveniaSlo" + + "vakiaSierra LeoneSan MarinoSenegaliSomaliabSurinameSão Tomé and Prín" + + "cipeEl SalvadoriSyriabSwazilandiTurks and Caicos IslandsChadiTogobTh" + + "ailandiTajikistanTokelauEast TimorTurkmenistanTunisiabTongaTurkeiebT" + + "rinidad and TobagoTuvaluTaiwanTanzaniabUkraineUgandabAmerikabUruguai" + + "bUzbekistanVatican StateSaint Vincent and the GrenadinesVenezuelabBr" + + "itish Virgin IslandsU.S. Virgin IslandsVietnammiVanuatuWallis and Fu" + + "tunaSamoaYemenMayotteSuid AfrikabZambiabZimbabweb", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0008, 0x001c, 0x0029, 0x003f, 0x0048, 0x0050, + 0x0058, 0x006c, 0x0073, 0x0073, 0x007d, 0x008c, 0x0094, 0x009e, + 0x00a4, 0x00a4, 0x00b0, 0x00c9, 0x00d1, 0x00da, 0x00e3, 0x00f0, + 0x00f9, 0x0100, 0x0108, 0x010e, 0x010e, 0x0116, 0x011c, 0x0124, + 0x0124, 0x012d, 0x0134, 0x013b, 0x013b, 0x0144, 0x014b, 0x0151, + 0x0158, 0x0158, 0x0178, 0x0191, 0x0197, 0x01a3, 0x01ac, 0x01b8, + 0x01be, 0x01c8, 0x01ce, 0x01d7, 0x01d7, 0x01e1, 0x01e6, 0x01f8, + 0x01f8, 0x01f8, 0x01fe, 0x020d, 0x0217, 0x0217, 0x021f, 0x0227, + // Entry 40 - 7F + 0x0230, 0x0242, 0x024a, 0x024a, 0x0252, 0x025a, 0x0261, 0x0261, + 0x0269, 0x0270, 0x0279, 0x0279, 0x0281, 0x0286, 0x0296, 0x02a0, + 0x02a0, 0x02aa, 0x02b0, 0x02be, 0x02c5, 0x02cd, 0x02da, 0x02da, + 0x02e0, 0x02e9, 0x02f2, 0x02f9, 0x0300, 0x030a, 0x031c, 0x0326, + 0x0326, 0x032f, 0x0333, 0x0340, 0x0346, 0x0346, 0x0346, 0x034e, + 0x0356, 0x035b, 0x0365, 0x0365, 0x036f, 0x0376, 0x037d, 0x037d, + 0x0383, 0x03a1, 0x03a6, 0x03ac, 0x03b3, 0x03ba, 0x03ba, 0x03c2, + 0x03ca, 0x03d1, 0x03d7, 0x03e3, 0x03ec, 0x03f4, 0x03fb, 0x0410, + // Entry 80 - BF + 0x041d, 0x0429, 0x0430, 0x043e, 0x044a, 0x044e, 0x0457, 0x0462, + 0x0471, 0x047b, 0x0483, 0x048b, 0x0495, 0x04a0, 0x04a6, 0x04ac, + 0x04b3, 0x04b9, 0x04c0, 0x04c0, 0x04c0, 0x04cb, 0x04db, 0x04e5, + 0x04ea, 0x04f1, 0x04f9, 0x04f9, 0x0511, 0x051b, 0x0525, 0x052f, + 0x0534, 0x053d, 0x0545, 0x054c, 0x0553, 0x055c, 0x0565, 0x056d, + 0x057a, 0x0580, 0x058e, 0x0596, 0x05a0, 0x05ab, 0x05b3, 0x05b9, + 0x05be, 0x05c2, 0x05ce, 0x05d2, 0x05d8, 0x05dd, 0x05ed, 0x05fe, + 0x0609, 0x0613, 0x061a, 0x0633, 0x063b, 0x0646, 0x0664, 0x066d, + // Entry C0 - FF + 0x0672, 0x067b, 0x0680, 0x0680, 0x0688, 0x068f, 0x068f, 0x0695, + 0x069c, 0x06a9, 0x06b8, 0x06c2, 0x06c9, 0x06cf, 0x06d8, 0x06e4, + 0x06ec, 0x06ec, 0x06f4, 0x0700, 0x070a, 0x0712, 0x071a, 0x0722, + 0x0722, 0x073a, 0x0746, 0x0746, 0x074c, 0x0756, 0x0756, 0x076e, + 0x0773, 0x0773, 0x0778, 0x0781, 0x078b, 0x0792, 0x079c, 0x07a8, + 0x07b0, 0x07b5, 0x07bd, 0x07d0, 0x07d6, 0x07dc, 0x07e5, 0x07ec, + 0x07f3, 0x07f3, 0x07fb, 0x0803, 0x080d, 0x081a, 0x083a, 0x0844, + 0x085a, 0x086d, 0x0876, 0x087d, 0x088e, 0x0893, 0x0893, 0x0898, + // Entry 100 - 13F + 0x089f, 0x08ab, 0x08b2, 0x08bb, + }, + }, + { // nd + "AndoraUnited Arab EmiratesAfghanistanAntigua le BarbudaAnguillaAlbaniaAr" + + "meniaNetherlands AntillesAngolaAjentinaSamoa ye AmelikaAustriaAustra" + + "liaArubhaAzerbaijanBhosnia le HerzegovinaBhabhadosiBhangiladeshiBhel" + + "giumBhukina FasoBhulgariyaBhahareniBhurundiBheniniBhemudaBruneiBholi" + + "viyaBraziliBhahamasBhutaniBotswanaBhelarusiBhelizeKhanadaDemocratic " + + "Republic of the CongoCentral African RepublicKhongoSwitzerlandIvory " + + "CoastCook IslandsChileKhameruniChinaKholombiyaKhosta RikhaCubaCape V" + + "erde IslandsCyprusCzech RepublicGermanyDjiboutiDenmakhiDominikhaDomi" + + "nican RepublicAljeriyaEcuadorEstoniaEgyptEritreaSpainEthiopiaFinland" + + "FijiFalkland IslandsMicronesiaFuransiGabhoniUnited KingdomGrenadaGeo" + + "rgiaGwiyana ye FuransiGhanaGibraltarGreenlandGambiyaGuineaGuadeloupe" + + "Equatorial GuineaGreeceGuatemalaGuamGuinea-BissauGuyanaHondurasCroat" + + "iaHayitiHungaryIndonesiyaIrelandIsuraeliIndiyaBritish Indian Ocean T" + + "erritoryIrakiIranIcelandItaliJamaicaJodaniJapanKhenyaKyrgyzstanCambo" + + "diaKhiribatiKhomoroSaint Kitts and NevisNorth KoreaSouth KoreaKhuwei" + + "tiCayman IslandsKazakhstanLaosLebhanoniSaint LuciaLiechtensteinSri L" + + "ankaLibheriyaLesothoLithuaniaLuxembourgLatviaLibhiyaMorokhoMonakhoMo" + + "ldovaMadagaskaMarshall IslandsMacedoniaMaliMyanmarMongoliaNorthern M" + + "ariana IslandsMartiniqueMauritaniaMontserratMaltaMauritiusMaldivesMa" + + "lawiMeksikhoMalezhiyaMozambiqueNamibhiyaNew CaledoniaNigerNorfolk Is" + + "landNigeriyaNicaraguaNetherlandsNoweyiNephaliNauruNiueNew ZealandOma" + + "niPanamaPheruPholinesiya ye FulansiPapua New GuineaPhilippinesPhakis" + + "taniPholandiSaint Pierre and MiquelonPitcairnPuerto RicoPalestinian " + + "West Bank and GazaPortugalPalauParaguayKathariRéunionRomaniaRashiyaR" + + "uwandaSaudi ArabiaSolomon IslandsSeychellesSudaniSwedenSingaporeSain" + + "t HelenaSloveniaSlovakiaSierra LeoneSan MarinoSenegaliSomaliyaSurina" + + "meSão Tomé and PríncipeEl SalvadorSyriaSwazilandTurks and Caicos Isl" + + "andsChadiThogoThayilandiTajikistanThokelawuEast TimorTurkmenistanTun" + + "isiyaThongaThekhiTrinidad le TobagoThuvaluThayiwaniTanzaniyaYukreini" + + "UgandaAmelikaYurugwaiUzbekistanVatican StateSaint Vincent and the Gr" + + "enadinesVenezuelaBritish Virgin IslandsU.S. Virgin IslandsVietnamVha" + + "nuatuWallis and FutunaSamowaYemeniMayotteMzansi ye AfrikaZambiyaZimb" + + "abwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x001a, 0x0025, 0x0037, 0x003f, 0x0046, + 0x004d, 0x0061, 0x0067, 0x0067, 0x006f, 0x007f, 0x0086, 0x008f, + 0x0095, 0x0095, 0x009f, 0x00b5, 0x00bf, 0x00cc, 0x00d4, 0x00e0, + 0x00ea, 0x00f3, 0x00fb, 0x0102, 0x0102, 0x0109, 0x010f, 0x0118, + 0x0118, 0x011f, 0x0127, 0x012e, 0x012e, 0x0136, 0x013f, 0x0146, + 0x014d, 0x014d, 0x016d, 0x0185, 0x018b, 0x0196, 0x01a1, 0x01ad, + 0x01b2, 0x01bb, 0x01c0, 0x01ca, 0x01ca, 0x01d6, 0x01da, 0x01ec, + 0x01ec, 0x01ec, 0x01f2, 0x0200, 0x0207, 0x0207, 0x020f, 0x0217, + // Entry 40 - 7F + 0x0220, 0x0232, 0x023a, 0x023a, 0x0241, 0x0248, 0x024d, 0x024d, + 0x0254, 0x0259, 0x0261, 0x0261, 0x0268, 0x026c, 0x027c, 0x0286, + 0x0286, 0x028d, 0x0294, 0x02a2, 0x02a9, 0x02b0, 0x02c2, 0x02c2, + 0x02c7, 0x02d0, 0x02d9, 0x02e0, 0x02e6, 0x02f0, 0x0301, 0x0307, + 0x0307, 0x0310, 0x0314, 0x0321, 0x0327, 0x0327, 0x0327, 0x032f, + 0x0336, 0x033c, 0x0343, 0x0343, 0x034d, 0x0354, 0x035c, 0x035c, + 0x0362, 0x0380, 0x0385, 0x0389, 0x0390, 0x0395, 0x0395, 0x039c, + 0x03a2, 0x03a7, 0x03ad, 0x03b7, 0x03bf, 0x03c8, 0x03cf, 0x03e4, + // Entry 80 - BF + 0x03ef, 0x03fa, 0x0402, 0x0410, 0x041a, 0x041e, 0x0427, 0x0432, + 0x043f, 0x0448, 0x0451, 0x0458, 0x0461, 0x046b, 0x0471, 0x0478, + 0x047f, 0x0486, 0x048d, 0x048d, 0x048d, 0x0496, 0x04a6, 0x04af, + 0x04b3, 0x04ba, 0x04c2, 0x04c2, 0x04da, 0x04e4, 0x04ee, 0x04f8, + 0x04fd, 0x0506, 0x050e, 0x0514, 0x051c, 0x0525, 0x052f, 0x0538, + 0x0545, 0x054a, 0x0558, 0x0560, 0x0569, 0x0574, 0x057a, 0x0581, + 0x0586, 0x058a, 0x0595, 0x059a, 0x05a0, 0x05a5, 0x05bb, 0x05cb, + 0x05d6, 0x05e0, 0x05e8, 0x0601, 0x0609, 0x0614, 0x0632, 0x063a, + // Entry C0 - FF + 0x063f, 0x0647, 0x064e, 0x064e, 0x0656, 0x065d, 0x065d, 0x0664, + 0x066b, 0x0677, 0x0686, 0x0690, 0x0696, 0x069c, 0x06a5, 0x06b1, + 0x06b9, 0x06b9, 0x06c1, 0x06cd, 0x06d7, 0x06df, 0x06e7, 0x06ef, + 0x06ef, 0x0707, 0x0712, 0x0712, 0x0717, 0x0720, 0x0720, 0x0738, + 0x073d, 0x073d, 0x0742, 0x074c, 0x0756, 0x075f, 0x0769, 0x0775, + 0x077d, 0x0783, 0x0789, 0x079b, 0x07a2, 0x07ab, 0x07b4, 0x07bc, + 0x07c2, 0x07c2, 0x07c9, 0x07d1, 0x07db, 0x07e8, 0x0808, 0x0811, + 0x0827, 0x083a, 0x0841, 0x0849, 0x085a, 0x0860, 0x0860, 0x0866, + // Entry 100 - 13F + 0x086d, 0x087d, 0x0884, 0x088c, + }, + }, + { // ne + neRegionStr, + neRegionIdx, + }, + { // nl + nlRegionStr, + nlRegionIdx, + }, + { // nmg + "Andɔ́raMinlambɔ́ Nsaŋ́nsa mí ArabiaAfganistaŋAntíga bá BarbúdaAnguíllaAl" + + "baniaArméniaB’Antilles bó NedɛrlandAngolaArgentínaSamoa m ́Amɛ́rkaÖt" + + "rishÖstraliáÁrúbaAzerbaïjaŋBosnia na ƐrzegovinaBarbadoBɛŋgladɛshBɛlg" + + "ikBurkina FasoBulgariaBahrainBurundiBeninBɛrmudaBrunɛiBoliviaBrésilB" + + "ahamasButaŋBotswanaBelarusBɛlizKanadaKongó ZaïreSentrafríkaKongoSwit" + + "zɛrlandKote d´IvoireMaŋ́ má KookTshiliKamerunShineKɔlɔ́mbiaKosta Rík" + + "aKubaMaŋ́ má KapvɛrSipriaNlambɔ́ bó tschɛkJamanJibútiDanemarkDominík" + + "aNlambɔ́ DominíkaAlgeriaEkuateurƐstoniaÄgyptɛnErytreaPaŋáEthiopiáFin" + + "landeFijiáMaŋ má FalklandMikronesiaFalaGabɔŋNlambɔ́ NgɛlɛnGrenadaJɔr" + + "giaGuyane FalaGánaGilbratarGreenlandGambiaGuineGuadeloupGuine Ekuato" + + "rialGrɛceGuatemalaGuamGuine BissoGuyanaƆndúrasKroasiaHaïtiƆngríaIndo" + + "nesiaIrlandÄsrɛlIndiaNlambɔ́ ngɛlɛn ma yí maŋ ntsiɛhIrakIranIslandIt" + + "aliaJamaikaJɔrdaniaJapɔnKɛnyaKyrgystaŋKambodiaKiribatiKɔmɔrSaint Kit" + + "ts na NevisKoré yí bvuɔKoré yí síKowɛitMaŋ́ má kumbiKazakstaŋLaosLib" + + "aŋSaint LuciaLishensteinSri LankaLiberiaLesotoLituaniáLuxembourgLatv" + + "iaLibyaMarɔkMonakoMɔldaviaMadagaskarMaŋ́ má MarshallMacedoniaMaliMya" + + "nmarMɔngoliaMaŋ́ MariáMartinikaMoritaniaMɔnserratMaltaMorisseMaldivi" + + "aMalawiMɛxikMalaysiaMozambikNamibiaKaledoni nwanahNigerMaŋ́ má Nɔrfɔ" + + "rkNigeriaNikaraguaNedɛrlandNɔrvɛgNepalNoruNiuɛZeland nwanahOmanPanam" + + "aPeruPolynesia FalaGuine PapuasiFilipinPakistanPɔlɔŋSaint Peter ba M" + + "ikelɔnPitkairnPuɛrto RikoPalɛstinPɔrtugalPaloParaguayKatarRéuniɔnRou" + + "maniaRussiRwandaSaudi ArabiaMaŋ́ má SalomɔnSeychɛlleSudaŋSuɛdSingapu" + + "rSaint LinaSloveniaSlovakiaSierra LeɔnSan MarinoSenegalSomáliaSurina" + + "mSao Tomé ba PrinshipSalvadɔrSyriaSwazilandMaŋ́ má Turk na KaikoTsha" + + "dTogoTaïlandTajikistaŋTokeloTimɔr tsindikēhTurkmɛnistaŋTunisiáTɔngaT" + + "urkiTrinidad ba TobágóTuvalúTaïwanTanzáníaUkrɛnUgandaAmɛŕkaUruguayUs" + + "bǝkistaŋVatikaŋSaint Vincent ba GrenadinesVǝnǝzuelaMinsilɛ́ mímaŋ mí" + + " ngɛ̄lɛ̄nMinsilɛ mí maŋ́ m´AmɛrkaViɛtnamVanuatuWallis ba FutunaSamoa" + + "YǝmɛnMayɔtAfríka yí síZambiaZimbabwǝ", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0009, 0x002a, 0x0035, 0x0049, 0x0052, 0x0059, + 0x0061, 0x007c, 0x0082, 0x0082, 0x008c, 0x009f, 0x00a6, 0x00b0, + 0x00b7, 0x00b7, 0x00c3, 0x00d8, 0x00df, 0x00ec, 0x00f3, 0x00ff, + 0x0107, 0x010e, 0x0115, 0x011a, 0x011a, 0x0122, 0x0129, 0x0130, + 0x0130, 0x0137, 0x013e, 0x0144, 0x0144, 0x014c, 0x0153, 0x0159, + 0x015f, 0x015f, 0x016c, 0x0178, 0x017d, 0x0189, 0x0197, 0x01a6, + 0x01ac, 0x01b3, 0x01b8, 0x01c4, 0x01c4, 0x01cf, 0x01d3, 0x01e5, + 0x01e5, 0x01e5, 0x01eb, 0x0200, 0x0205, 0x0205, 0x020c, 0x0214, + // Entry 40 - 7F + 0x021d, 0x0230, 0x0237, 0x0237, 0x023f, 0x0247, 0x0250, 0x0250, + 0x0257, 0x025d, 0x0266, 0x0266, 0x026e, 0x0274, 0x0285, 0x028f, + 0x028f, 0x0293, 0x029a, 0x02ac, 0x02b3, 0x02ba, 0x02c5, 0x02c5, + 0x02ca, 0x02d3, 0x02dc, 0x02e2, 0x02e7, 0x02f0, 0x0300, 0x0306, + 0x0306, 0x030f, 0x0313, 0x031e, 0x0324, 0x0324, 0x0324, 0x032d, + 0x0334, 0x033a, 0x0342, 0x0342, 0x034b, 0x0351, 0x0358, 0x0358, + 0x035d, 0x0383, 0x0387, 0x038b, 0x0391, 0x0397, 0x0397, 0x039e, + 0x03a7, 0x03ad, 0x03b3, 0x03bd, 0x03c5, 0x03cd, 0x03d4, 0x03e8, + // Entry 80 - BF + 0x03f7, 0x0404, 0x040b, 0x041b, 0x0425, 0x0429, 0x042f, 0x043a, + 0x0445, 0x044e, 0x0455, 0x045b, 0x0464, 0x046e, 0x0474, 0x0479, + 0x047f, 0x0485, 0x048e, 0x048e, 0x048e, 0x0498, 0x04ab, 0x04b4, + 0x04b8, 0x04bf, 0x04c8, 0x04c8, 0x04d5, 0x04de, 0x04e7, 0x04f1, + 0x04f6, 0x04fd, 0x0505, 0x050b, 0x0511, 0x0519, 0x0521, 0x0528, + 0x0537, 0x053c, 0x0550, 0x0557, 0x0560, 0x056a, 0x0572, 0x0577, + 0x057b, 0x0580, 0x058d, 0x0591, 0x0597, 0x059b, 0x05a9, 0x05b6, + 0x05bd, 0x05c5, 0x05cd, 0x05e4, 0x05ec, 0x05f8, 0x0601, 0x060a, + // Entry C0 - FF + 0x060e, 0x0616, 0x061b, 0x061b, 0x0624, 0x062c, 0x062c, 0x0631, + 0x0637, 0x0643, 0x0656, 0x0660, 0x0666, 0x066b, 0x0673, 0x067d, + 0x0685, 0x0685, 0x068d, 0x0699, 0x06a3, 0x06aa, 0x06b2, 0x06b9, + 0x06b9, 0x06ce, 0x06d7, 0x06d7, 0x06dc, 0x06e5, 0x06e5, 0x06fd, + 0x0702, 0x0702, 0x0706, 0x070e, 0x0719, 0x071f, 0x0730, 0x073e, + 0x0746, 0x074c, 0x0751, 0x0765, 0x076c, 0x0773, 0x077d, 0x0783, + 0x0789, 0x0789, 0x0791, 0x0798, 0x07a4, 0x07ac, 0x07c7, 0x07d2, + 0x07f5, 0x0813, 0x081b, 0x0822, 0x0832, 0x0837, 0x0837, 0x083e, + // Entry 100 - 13F + 0x0844, 0x0853, 0x0859, 0x0862, + }, + }, + { // nn + "AscensionAndorraDei sameinte arabiske emirataAfghanistanAntigua og Barbu" + + "daAnguillaAlbaniaArmeniaDei nederlandske AntillaneAngolaAntarktisArg" + + "entinaAmerikansk SamoaAusterrikeAustraliaArubaÅlandAserbajdsjanBosni" + + "a og HercegovinaBarbadosBangladeshBelgiaBurkina FasoBulgariaBahrainB" + + "urundiBeninSaint BarthélemyBermudaBrunei DarussalamBoliviaBrasilBaha" + + "masBhutanBouvetøyaBotswanaKviterusslandBelizeCanadaKokosøyaneKongo-K" + + "inshasaDen sentralafrikanske republikkenKongo-BrazzavilleSveitsElfen" + + "beinskystenCookøyaneChileKamerunKinaColombiaClippertonøyaCosta RicaC" + + "ubaKapp VerdeChristmasøyaKyprosTsjekkiaTysklandDiego GarciaDjiboutiD" + + "anmarkDominicaDen dominikanske republikkenAlgerieCeuta og MelillaEcu" + + "adorEstlandEgyptVest-SaharaEritreaSpaniaEtiopiaDen europeiske unione" + + "nFinlandFijiFalklandsøyaneMikronesiaføderasjonenFærøyaneFrankrikeGab" + + "onStorbritanniaGrenadaGeorgiaFransk GuyanaGuernseyGhanaGibraltarGrøn" + + "landGambiaGuineaGuadeloupeEkvatorial-GuineaHellasSør-Georgia og Sør-" + + "Sandwich-øyaneGuatemalaGuamGuinea-BissauGuyanaHongkong S.A.R. KinaHe" + + "ard- og McDonaldsøyaneHondurasKroatiaHaitiUngarnKanariøyaneIndonesia" + + "IrlandIsraelManIndiaBritiske område i Det indiske havIrakIranIslandI" + + "taliaJerseyJamaicaJordanJapanKenyaKirgisistanKambodsjaKiribatiKomore" + + "neSt. Christopher og NevisNord-KoreaSør-KoreaKuwaitCaymanøyaneKasakh" + + "stanLaosLibanonSt. LuciaLiechtensteinSri LankaLiberiaLesothoLitauenL" + + "uxembourgLatviaLibyaMarokkoMonacoMoldovaMontenegroSaint MartinMadaga" + + "skarMarshalløyaneMakedoniaMaliMyanmarMongoliaMacao S.A.R. KinaNord-M" + + "ariananeMartiniqueMauritaniaMontserratMaltaMauritiusMaldivaneMalawiM" + + "exicoMalaysiaMosambikNamibiaNy-CaledoniaNigerNorfolkøyaneNigeriaNica" + + "raguaNederlandNoregNepalNauruNiueNew ZealandOmanPanamaPeruFransk Pol" + + "ynesiaPapua Ny-GuineaFilippinanePakistanPolenSt. Pierre og MiquelonP" + + "itcairnPuerto RicoPalestinsk territoriumPortugalPalauParaguayQatarYt" + + "re OseaniaRéunionRomaniaSerbiaRusslandRwandaSaudi ArabiaSalomonøyane" + + "SeychellaneSudanSverigeSingaporeSaint HelenaSloveniaSvalbard og Jan " + + "MayenSlovakiaSierra LeoneSan MarinoSenegalSomaliaSurinamSão Tomé og " + + "PríncipeEl SalvadorSyriaSwazilandTristan da CunhaTurks- og Caicosøya" + + "neTchadFranske sørområdeTogoThailandTadsjikistanTokelauAust-TimorTur" + + "kmenistanTunisiaTongaTyrkiaTrinidad og TobagoTuvaluTaiwanTanzaniaUkr" + + "ainaUgandaUSAs ytre småøyarUSAUruguayUsbekistanVatikanstatenSt. Vinc" + + "ent og GrenadinaneVenezuelaDei britiske jomfruøyaneDei amerikanske j" + + "omfruøyaneVietnamVanuatuWallis og FutunaSamoaYemenMayotteSør-AfrikaZ" + + "ambiaZimbabweukjent områdeverdaAfrikaNord-AmerikaSør-AmerikaOseaniaV" + + "est-AfrikaSentral-AmerikaAust-AfrikaNord-AfrikaSentral-AfrikaSørlege" + + " AfrikaAmerikanordlege AmerikaKaribiaAust-AsiaSør-AsiaSøraust-AsiaSø" + + "r-EuropaAustralia og New ZealandMelanesiaMikronesiaPolynesiaAsiaSent" + + "ral-AsiaVest-AsiaEuropaAust-EuropaNord-EuropaVest-EuropaLatin-Amerik" + + "a", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0009, 0x0010, 0x002d, 0x0038, 0x004a, 0x0052, 0x0059, + 0x0060, 0x007a, 0x0080, 0x0089, 0x0092, 0x00a2, 0x00ac, 0x00b5, + 0x00ba, 0x00c0, 0x00cc, 0x00e1, 0x00e9, 0x00f3, 0x00f9, 0x0105, + 0x010d, 0x0114, 0x011b, 0x0120, 0x0131, 0x0138, 0x0149, 0x0150, + 0x0150, 0x0156, 0x015d, 0x0163, 0x016d, 0x0175, 0x0182, 0x0188, + 0x018e, 0x0199, 0x01a7, 0x01c8, 0x01d9, 0x01df, 0x01ef, 0x01f9, + 0x01fe, 0x0205, 0x0209, 0x0211, 0x021f, 0x0229, 0x022d, 0x0237, + 0x0237, 0x0244, 0x024a, 0x0252, 0x025a, 0x0266, 0x026e, 0x0275, + // Entry 40 - 7F + 0x027d, 0x0299, 0x02a0, 0x02b0, 0x02b7, 0x02be, 0x02c3, 0x02ce, + 0x02d5, 0x02db, 0x02e2, 0x02f8, 0x02ff, 0x0303, 0x0312, 0x0329, + 0x0333, 0x033c, 0x0341, 0x034e, 0x0355, 0x035c, 0x0369, 0x0371, + 0x0376, 0x037f, 0x0388, 0x038e, 0x0394, 0x039e, 0x03af, 0x03b5, + 0x03d9, 0x03e2, 0x03e6, 0x03f3, 0x03f9, 0x040d, 0x0426, 0x042e, + 0x0435, 0x043a, 0x0440, 0x044c, 0x0455, 0x045b, 0x0461, 0x0464, + 0x0469, 0x048b, 0x048f, 0x0493, 0x0499, 0x049f, 0x04a5, 0x04ac, + 0x04b2, 0x04b7, 0x04bc, 0x04c7, 0x04d0, 0x04d8, 0x04e0, 0x04f8, + // Entry 80 - BF + 0x0502, 0x050c, 0x0512, 0x051e, 0x0528, 0x052c, 0x0533, 0x053c, + 0x0549, 0x0552, 0x0559, 0x0560, 0x0567, 0x0571, 0x0577, 0x057c, + 0x0583, 0x0589, 0x0590, 0x059a, 0x05a6, 0x05b0, 0x05be, 0x05c7, + 0x05cb, 0x05d2, 0x05da, 0x05eb, 0x05f9, 0x0603, 0x060d, 0x0617, + 0x061c, 0x0625, 0x062e, 0x0634, 0x063a, 0x0642, 0x064a, 0x0651, + 0x065d, 0x0662, 0x066f, 0x0676, 0x067f, 0x0688, 0x068d, 0x0692, + 0x0697, 0x069b, 0x06a6, 0x06aa, 0x06b0, 0x06b4, 0x06c4, 0x06d3, + 0x06de, 0x06e6, 0x06eb, 0x0701, 0x0709, 0x0714, 0x072a, 0x0732, + // Entry C0 - FF + 0x0737, 0x073f, 0x0744, 0x0750, 0x0758, 0x075f, 0x0765, 0x076d, + 0x0773, 0x077f, 0x078c, 0x0797, 0x079c, 0x07a3, 0x07ac, 0x07b8, + 0x07c0, 0x07d5, 0x07dd, 0x07e9, 0x07f3, 0x07fa, 0x0801, 0x0808, + 0x0808, 0x081f, 0x082a, 0x082a, 0x082f, 0x0838, 0x0848, 0x085e, + 0x0863, 0x0876, 0x087a, 0x0882, 0x088e, 0x0895, 0x089f, 0x08ab, + 0x08b2, 0x08b7, 0x08bd, 0x08cf, 0x08d5, 0x08db, 0x08e3, 0x08ea, + 0x08f0, 0x0903, 0x0906, 0x090d, 0x0917, 0x0924, 0x093e, 0x0947, + 0x0960, 0x097c, 0x0983, 0x098a, 0x099a, 0x099f, 0x099f, 0x09a4, + // Entry 100 - 13F + 0x09ab, 0x09b6, 0x09bc, 0x09c4, 0x09d2, 0x09d7, 0x09dd, 0x09e9, + 0x09f5, 0x09fc, 0x0a07, 0x0a16, 0x0a21, 0x0a2c, 0x0a3a, 0x0a49, + 0x0a50, 0x0a60, 0x0a67, 0x0a70, 0x0a79, 0x0a86, 0x0a91, 0x0aa9, + 0x0ab2, 0x0abc, 0x0ac5, 0x0ac9, 0x0ad5, 0x0ade, 0x0ae4, 0x0aef, + 0x0afa, 0x0b05, 0x0b12, + }, + }, + { // nnh + "Kàmalûm", + []uint16{ // 50 elements + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0009, + }, + }, + { // no + noRegionStr, + noRegionIdx, + }, + { // nus + "AndoraAbganithtanAntiguaa kɛnɛ BarbudaAŋguɛlaAlbäniaAɛrmäniaAŋgolaAɛrgen" + + "tinAmerika thamowAthtɛriaAthɔra̱liaArubaAdhe̱rbe̱ja̱nBothnia kɛnɛ ɣä" + + "rgobiniaBärbadothBengeladiecBe̱lgimBurkinɛ pa̱thuBulga̱a̱riaBa̱reenB" + + "urundiBe̱ni̱nBe̱rmudaaBurunɛyBulibiaBäraadhiilBämuɔthButa̱nBothiwaan" + + "aBe̱lɛruthBilidhaKänɛdaCɛntrɔl aprika repuɔblicKɔŋgɔKodibo̱o̱Kuk ɣa̱" + + "ylɛnCili̱KɛmɛrunCaynaKolombiaKothtirikaKɛp bedi ɣa̱ylɛnAlgeriaKorwaa" + + "tiaBurutic ɣe̱ndian oce̱nKombodiaKomruthKaymɛn ɣa̱ylɛnSudanCa̱dBurut" + + "ic dhuɔ̱ɔ̱l be̱rgin", + []uint16{ // 249 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0006, 0x0011, 0x0028, 0x0031, 0x0039, + 0x0043, 0x0043, 0x004a, 0x004a, 0x0054, 0x0062, 0x006b, 0x0077, + 0x007c, 0x007c, 0x008c, 0x00a7, 0x00b1, 0x00bc, 0x00c4, 0x00d4, + 0x00e1, 0x00e9, 0x00f0, 0x00f9, 0x00f9, 0x0103, 0x010b, 0x0112, + 0x0112, 0x011d, 0x0126, 0x012d, 0x012d, 0x0137, 0x0142, 0x0149, + 0x0151, 0x0151, 0x0151, 0x016c, 0x0174, 0x0174, 0x017f, 0x018d, + 0x0193, 0x019c, 0x01a1, 0x01a9, 0x01a9, 0x01b3, 0x01b3, 0x01c7, + 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, 0x01c7, + // Entry 40 - 7F + 0x01c7, 0x01c7, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, + 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, + 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, + 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, + 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, 0x01ce, + 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, + 0x01d7, 0x01f0, 0x01f0, 0x01f0, 0x01f0, 0x01f0, 0x01f0, 0x01f0, + 0x01f0, 0x01f0, 0x01f0, 0x01f0, 0x01f8, 0x01f8, 0x01ff, 0x01ff, + // Entry 80 - BF + 0x01ff, 0x01ff, 0x01ff, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, + 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, + 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, + 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, + 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, + 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, + 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, + 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, + // Entry C0 - FF + 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, 0x0211, + 0x0211, 0x0211, 0x0211, 0x0211, 0x0216, 0x0216, 0x0216, 0x0216, + 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, + 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, 0x0216, + 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, + 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, + 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, 0x021b, + 0x0238, + }, + }, + { // nyn + "AndoraAmahanga ga Buharabu ageeteereineAfuganistaniAngiguwa na BabudaAng" + + "wiraArubaniaArimeniyaAntiri za HoorandiAngoraArigentinaSamowa ya Ame" + + "erikaOsituriaOsitureeriyaArubaAzabagyaniBoziniya na HezegovinaBabado" + + "siBangaradeshiBubirigiBokina FasoBurugariyaBahareniBurundiBeniniBeri" + + "mudaBuruneiBoriiviyaBuraziiriBahamaButaniBotswanaBararusiBerizeKanad" + + "aDemokoratika Ripaaburika ya KongoEihanga rya Rwagati ya AfirikaKong" + + "oSwisiAivore KositiEbizinga bya KuukuChileKameruuniChinaKorombiyaKos" + + "itarikaCubaEbizinga bya KepuvadeSaipurasiRipaaburika ya ZeekiBugirim" + + "aaniGyibutiDeenimaakaDominikaRipaaburika ya DominicaArigyeriyaIkweda" + + "EsitoniyaMisiriEriteriyaSipeyiniEthiyopiyaBufiniFigyiEbizinga bya Fa" + + "akilandaMikironesiyaBufaransaGabooniBungyerezaGurenadaGyogiyaGuyana " + + "ya BufaransaGanaGiburaataGuriinirandiGambiyaGineGwaderupeGuniGuriisi" + + "GwatemaraGwamuGinebisauGuyanaHondurasiKorasiyaHaitiHangareIndoneeziy" + + "aIrerandiIsirairiIndiyaEbizinga bya Indian ebya BungyerezaIraakaIraa" + + "niAisilandiItareGyamaikaYorudaaniGyapaaniKenyaKirigizistaniKambodiya" + + "KiribatiKoromoSenti Kittis na NevisiKoreya AmatembaKoreya AmashuumaK" + + "uweitiEbizinga bya KayimaniKazakisitaniLayosiLebanoniSenti RusiyaLis" + + "henteniSirirankaLiberiyaLesothoLithuaniaLakizembaagaLatviyaLibyaMoro" + + "ccoMonacoMoridovaMadagasikaEbizinga bya MarshaaMasedooniaMariMyanama" + + "rMongoriaEbizinga by’amatemba ga MarianaMartiniqueMauriteeniyaMontse" + + "rratiMaritaMaurishiasiMaridivesMarawiMexicomarayiziaMozambiqueNamibi" + + "yaNiukaredoniaNaigyaEkizinga NorifokoNaigyeriyaNikaragwaHoorandiNoor" + + "weNepoNauruNiueNiuzirandiOmaaniPanamaPeruPolinesia ya BufaransaPapua" + + "FiripinoPakisitaaniPoorandiSenti Piyerre na MikweronPitkainiPwetorik" + + "oParestiina na GazaPocugoPalaawuParagwaiKataRiyuniyoniRomaniyaRrasha" + + "RwandaSaudi AreebiyaEbizinga bya SurimaaniShesheresiSudaniSwideniSin" + + "gapoSenti HerenaSirovaaniyaSirovaakiyaSirra RiyooniSamarinoSenegoSom" + + "aariyaSurinaamuSawo Tome na PurinsipoEri SalivadoSiriyaSwazirandiEbi" + + "zinga bya Buturuki na KaikoChadiTogoTairandiTajikisitaniTokerawuBuru" + + "gweizooba bwa TimoriTurukimenisitaniTuniziaTongaButuruki /TakeTurini" + + "dad na TobagoTuvaruTayiwaaniTanzaniaUkureiniUgandaAmerikaUrugwaiUzib" + + "ekisitaniVatikaniSenti Vinsent na GurenadiniVenezuweraEbizinga bya V" + + "irigini ebya BungyerezaEbizinga bya Virigini ebya AmerikaViyetinaamu" + + "VanuatuWarris na FutunaSamowaYemeniMayoteSausi AfirikaZambiaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0027, 0x0033, 0x0045, 0x004c, 0x0054, + 0x005d, 0x006f, 0x0075, 0x0075, 0x007f, 0x0091, 0x0099, 0x00a5, + 0x00aa, 0x00aa, 0x00b4, 0x00ca, 0x00d2, 0x00de, 0x00e6, 0x00f1, + 0x00fb, 0x0103, 0x010a, 0x0110, 0x0110, 0x0118, 0x011f, 0x0128, + 0x0128, 0x0131, 0x0137, 0x013d, 0x013d, 0x0145, 0x014d, 0x0153, + 0x0159, 0x0159, 0x017a, 0x0198, 0x019d, 0x01a2, 0x01af, 0x01c1, + 0x01c6, 0x01cf, 0x01d4, 0x01dd, 0x01dd, 0x01e7, 0x01eb, 0x0200, + 0x0200, 0x0200, 0x0209, 0x021d, 0x0228, 0x0228, 0x022f, 0x0239, + // Entry 40 - 7F + 0x0241, 0x0258, 0x0262, 0x0262, 0x0268, 0x0271, 0x0277, 0x0277, + 0x0280, 0x0288, 0x0292, 0x0292, 0x0298, 0x029d, 0x02b4, 0x02c0, + 0x02c0, 0x02c9, 0x02d0, 0x02da, 0x02e2, 0x02e9, 0x02fc, 0x02fc, + 0x0300, 0x0309, 0x0315, 0x031c, 0x0320, 0x0329, 0x032d, 0x0334, + 0x0334, 0x033d, 0x0342, 0x034b, 0x0351, 0x0351, 0x0351, 0x035a, + 0x0362, 0x0367, 0x036e, 0x036e, 0x0379, 0x0381, 0x0389, 0x0389, + 0x038f, 0x03b2, 0x03b8, 0x03be, 0x03c7, 0x03cc, 0x03cc, 0x03d4, + 0x03dd, 0x03e5, 0x03ea, 0x03f7, 0x0400, 0x0408, 0x040e, 0x0424, + // Entry 80 - BF + 0x0433, 0x0443, 0x044a, 0x045f, 0x046b, 0x0471, 0x0479, 0x0485, + 0x048f, 0x0498, 0x04a0, 0x04a7, 0x04b0, 0x04bc, 0x04c3, 0x04c8, + 0x04cf, 0x04d5, 0x04dd, 0x04dd, 0x04dd, 0x04e7, 0x04fb, 0x0505, + 0x0509, 0x0511, 0x0519, 0x0519, 0x053a, 0x0544, 0x0550, 0x055b, + 0x0561, 0x056c, 0x0575, 0x057b, 0x0581, 0x058a, 0x0594, 0x059c, + 0x05a8, 0x05ae, 0x05bf, 0x05c9, 0x05d2, 0x05da, 0x05e0, 0x05e4, + 0x05e9, 0x05ed, 0x05f7, 0x05fd, 0x0603, 0x0607, 0x061d, 0x0622, + 0x062a, 0x0635, 0x063d, 0x0656, 0x065e, 0x0667, 0x0679, 0x067f, + // Entry C0 - FF + 0x0686, 0x068e, 0x0692, 0x0692, 0x069c, 0x06a4, 0x06a4, 0x06aa, + 0x06b0, 0x06be, 0x06d4, 0x06de, 0x06e4, 0x06eb, 0x06f2, 0x06fe, + 0x0709, 0x0709, 0x0714, 0x0721, 0x0729, 0x072f, 0x0738, 0x0741, + 0x0741, 0x0757, 0x0763, 0x0763, 0x0769, 0x0773, 0x0773, 0x0791, + 0x0796, 0x0796, 0x079a, 0x07a2, 0x07ae, 0x07b6, 0x07ce, 0x07de, + 0x07e5, 0x07ea, 0x07f8, 0x080b, 0x0811, 0x081a, 0x0822, 0x082a, + 0x0830, 0x0830, 0x0837, 0x083e, 0x084b, 0x0853, 0x086e, 0x0878, + 0x089d, 0x08bf, 0x08ca, 0x08d1, 0x08e1, 0x08e7, 0x08e7, 0x08ed, + // Entry 100 - 13F + 0x08f3, 0x0900, 0x0906, 0x090e, + }, + }, + { // om + "BrazilChinaGermanyItoophiyaaFranceUnited KingdomIndiaItalyJapanKeeniyaaR" + + "ussiaUnited States", + []uint16{ // 243 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, 0x000b, + 0x000b, 0x000b, 0x000b, 0x000b, 0x0012, 0x0012, 0x0012, 0x0012, + // Entry 40 - 7F + 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, + 0x0012, 0x0012, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, + 0x001c, 0x0022, 0x0022, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003a, 0x003a, 0x003a, + 0x003a, 0x003f, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, + // Entry 80 - BF + 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, + 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, + 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, + 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, + 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, + 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, + 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, + 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, + // Entry C0 - FF + 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x0047, 0x004d, + 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, + 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, + 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, + 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, + 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, 0x004d, + 0x004d, 0x004d, 0x005a, + }, + }, + { // or + "ଆଣ୍ଡୋରାସଂଯୁକ୍ତ ଆରବ ଏମିରେଟସ୍ଆଫାଗାନିସ୍ତାନ୍ଆଣ୍ଟିଗୁଆ ଏବଂ ବାରବୁଦାଆଙ୍ଗୁଇଲ୍ଲାଆଲ" + + "ବାନିଆଆର୍ମେନିଆନେଦରଲ୍ୟାଣ୍ଡସ୍ ଆଣ୍ଟିଲିଜ୍ଆଙ୍ଗୋଲାଆର୍ଣ୍ଟକଟିକାଆର୍ଜେଣ୍ଟିନାଆ" + + "ମେରିକାନ୍ ସାମୋଆଅଷ୍ଟ୍ରିଆଅଷ୍ଟ୍ରେଲିଆଆରୁବାଆଲାଣ୍ଡ ଆଇସଲ୍ୟାଣ୍ଡଆଜେରବାଇଜାନ୍ବ" + + "ୋସନିଆ ଏବଂ ହର୍ଜଗୋଭିନାବାରବାଡୋସ୍ବାଙ୍ଗଲାଦେଶ୍ବେଲଜିୟମ୍ବୁର୍କିନୋ ଫାସୋବୁଲଗେ" + + "ରିଆବାହାରିନ୍ବୁରୁନ୍ଦିବେନିନ୍ସେଣ୍ଟ ବାର୍ଥେଲେମିବରମୁଡାବ୍ରୁନେଇବୋଲଭିଆବ୍ରାଜି" + + "ଲ୍ବାହାମାସ୍ଭୁଟାନ୍ବୌଭେଟ୍ ଆଇସଲ୍ୟାଣ୍ଡବୋଟସ୍ବାନ୍ବେଲାରୁଷ୍ବେଲିଜ୍କାନାଡାକୋକୋ" + + "ସ୍ ଆଇସଲ୍ୟାଣ୍ଡକଙ୍ଗୋ-କିନସାସାମଧ୍ୟ ଆଫ୍ରିକୀୟ ଗଣତନ୍ତ୍ରକଙ୍ଗୋ-ବ୍ରାଜିଭିଲ୍ଲେ" + + "ସ୍ବିଜରଲ୍ୟାଣ୍ଡଆଇବରୀ କୋଷ୍ଟକୁକ୍ ଆଇସଲ୍ୟାଣ୍ଡଚିଲ୍ଲୀକାମେରୁନ୍ଚିନ୍କୋଲମ୍ବିଆକ" + + "ୋଷ୍ଟା ରିକାକ୍ୱିବାକେପ୍ ଭର୍ଦେଖ୍ରୀଷ୍ଟମାସ ଆଇଲ୍ୟାଣ୍ଡସାଇପ୍ରସ୍ଚେକ୍ ସାଧାରଣତ" + + "ନ୍ତ୍ରଜର୍ମାନୀଡିବୌଟିଡେନମାର୍କଡୋମିନାକାଡୋମିନକାନ୍ ପ୍ରଜାତନ୍ତ୍ରଆଲଜେରିଆଇକ୍ୱ" + + "ାଡୋର୍ଏସ୍ତୋନିଆଇଜିପ୍ଟପଶ୍ଚିମ ସାହାରାଇରିଟ୍ରିୟାସ୍ପେନ୍ଇଥିଓପିଆୟୁରୋପିଆନ୍ ୟୁ" + + "ନିଅନ୍ଫିନଲ୍ୟାଣ୍ଡଫିଜିଫଲ୍କଲ୍ୟାଣ୍ଡ ଦ୍ବୀପପୁଞ୍ଜମାଇକ୍ରୋନେସିଆଫାରୋଇ ଦ୍ବୀପପୁ" + + "ଞ୍ଜଫ୍ରାନ୍ସଗାବୋନ୍ବ୍ରିଟେନ୍ଗ୍ରେନାଡାଜର୍ଜିଆଫ୍ରେଞ୍ଚ ଗୁଇନାଗୁଏରନେସିଘାନାଜିବ" + + "୍ରାଲ୍ଟର୍ଗ୍ରୀନଲ୍ୟାଣ୍ଡଗାମ୍ବିଆଗୁଏନେଆଗୌଡେଲୌପେଇକ୍ବାଟେରିଆଲ୍ ଗୁଇନିଆଗ୍ରୀସ୍" + + "ଦକ୍ଷିଣ ଜର୍ଜିଆ ଏବଂ ଦକ୍ଷିଣ ସାଣ୍ଡୱିଚ୍ ଦ୍ବୀପପୁଞ୍ଜଗୁଏତମାଲାଗୁଆମ୍ଗୁଇନିଆ-ବ" + + "ିସାଉଗୁଇନାହଂକଂ ବିଶେଷ ପ୍ରଶାସନିକ କ୍ଷେତ୍ର ଚୀନ୍ହାର୍ଡ ଦ୍ବୀପପୁଞ୍ଜ ଏବଂ ମ୍ୟ" + + "ାକଡୋନାଲ୍ ଦ୍ବୀପପୁଞ୍ଜହୋଣ୍ଡାରୁସ୍କ୍ରୋଆଟିଆହାଇତିହଙ୍ଗେରୀଇଣ୍ଡୋନେସିଆଆୟରଲ୍ୟା" + + "ଣ୍ଡଇସ୍ରାଏଲ୍ଆଇଲ୍ ଅଫ୍ ମୈନ୍ଭାରତବ୍ରିଟିଶ୍ ଭାରତୀୟ ସାମୁଦ୍ରିକ କ୍ଷେତ୍ରଇରାକ୍" + + "ଇରାନ୍ଆଇସଲ୍ୟାଣ୍ଡଇଟାଲୀଜର୍ସିଜାମାଇକାଜୋର୍ଡାନ୍ଜାପାନ୍କେନିୟାକିର୍ଗିଜିସ୍ଥାନକ" + + "ାମ୍ବୋଡିଆକିରିବାଟୀକାମୋରସ୍ସେଣ୍ଟ କିଟସ୍ ଏଣ୍ଡ ନେଭିସ୍ଉତ୍ତର କୋରିଆଦକ୍ଷିଣ କୋ" + + "ରିଆକୁଏତ୍କେମ୍ୟାନ୍ ଦ୍ବୀପପୁଞ୍ଜକାଜାକାସ୍ଥାନ୍ଲାଓସ୍ଲେବାନନ୍ସେଣ୍ଟ ଲୁସିଆଲିଚେ" + + "ସ୍ତିଆନାନ୍ଶ୍ରୀଲଙ୍କାଲିବେରିଆଲେସୋଥୋଲିଥାଆନିଆଲକ୍ସେମବର୍ଗଲାଟଭିଆଲିବିଆମୋରୋକ୍" + + "କୋମୋନାକୋମାଲଡୋଭାମଣ୍ଟେଗ୍ରୋସେଣ୍ଟ ମାର୍ଟିନ୍ମାଡାଗାସ୍କର୍ମାର୍ଶଲ୍ ଦ୍ବୀପପୁଞ୍" + + "ଜମାସେଡୋନିଆମାଳୀମିୟାମାର୍ମଙ୍ଗୋଲିଆମାକାଉ SAR ଚିନ୍ଉତ୍ତର ମାରିଆନା ଦ୍ବୀପପୁଞ" + + "୍ଜମାର୍ଟିନିକ୍ୟୁମାଉରିଟାନିଆମଣ୍ଟେସେରାଟ୍ମାଲ୍ଟାମୌରିସସ୍ମାଳଦ୍ବୀପମାଲୱିମେକ୍ସ" + + "ିକୋମାଲେସିଆମୋଜାମ୍ବିକ୍ୟୁନାମ୍ବିଆନୂତନ କାଲେଡୋନିଆନାଇଜର୍ନରଫ୍ଲକ୍ ଦ୍ବୀପନାଇଜ" + + "େରିଆନିକାରାଗୁଆନେଦରଲ୍ୟାଣ୍ଡନରୱେନେପାଳନାଉରୁନିଉନ୍ୟୁଜିଲାଣ୍ଡଓମାନ୍ପାନାମାପେର" + + "ୁଫ୍ରେଞ୍ଚ ପଲିନେସିଆପପୁଆ ନ୍ୟୁ ଗୁଏନିଆଫିଲିପାଇନସ୍ପାକିସ୍ତାନପୋଲାଣ୍ଡସେଣ୍ଟ ପ" + + "ିଏରେ ଏବଂ ମିକ୍ବାଲୋନ୍ପିଟକାଇରିନ୍ପୁଏର୍ତ୍ତୋ ରିକୋପାଲେସ୍ତେନିଆପର୍ତ୍ତୁଗାଲ୍ପ" + + "ାଲାଉପାରାଗୁଏକତାର୍ଆଉଟଲେଇଂ ଓସେନିଆରିୟୁନିଅନ୍ରୋମାନିଆସର୍ବିଆରୁଷିଆରାୱାଣ୍ଡାସ" + + "ାଉଦି ଆରବିଆସୋଲୋମନ୍ ଦ୍ବୀପପୁଞ୍ଜସେଚେଲସ୍ସୁଦାନ୍ସ୍ୱେଡେନ୍ସିଙ୍ଗାପୁର୍ସେଣ୍ଟ ହ" + + "େଲେନାସ୍ଲୋଭେନିଆସାଲ୍ଭାର୍ଡ ଏବଂ ଜାନ୍ ମାୟୋନ୍ସ୍ଲୋଭାକିଆସିଓରା ଲିଓନ୍ସାନ୍ ମା" + + "ରିନୋସେନେଗାଲ୍ସୋମାଲିଆସୁରିନାମସାଓ ଟୋମେ ଏବଂ ପ୍ରିନସିପିଏଲ୍ ସାଲଭାଡୋର୍ସିରିଆ" + + "ସ୍ବାଜିଲାଣ୍ଡତୁର୍କସ୍ ଏବଂ ସାଇକସ୍ ଦ୍ବୀପପୁଞ୍ଜଚାଦ୍ଫରାସୀ ଦକ୍ଷିଣ କ୍ଷେତ୍ରଟୋ" + + "ଗୋଥାଇଲାଣ୍ଡତାଜିକିସ୍ଥାନ୍ଟୋକେଲାଉପୁର୍ବ ତିମୋର୍ତୁର୍କମେନିସ୍ତାନ୍ତୁନିସିଆଟୋଙ" + + "୍ଗାତୁର୍କୀତ୍ରିନିଦାଦ୍ ଏବଂ ଟୋବାଗୋଟୁଭାଲୁତାଇୱାନ୍ତାଞ୍ଜାନିଆୟୁକ୍ରାଇନ୍ଉଗାଣ୍" + + "ଡାୟୁନାଇଟେଡ୍ ଷ୍ଟେଟସ୍ ମାଇନର୍ ଆଉଟଲେଇଂ ଦ୍ବୀପପୁଞ୍ଜଯୁକ୍ତ ରାଷ୍ଟ୍ର ଆମେରିକା" + + "ଉରୁଗୁଏଉଜବେକିସ୍ଥାନ୍ଭାଟିକାନ୍ସେଣ୍ଟ ଭିନସେଣ୍ଟ ଏବଂ ଦି ଗ୍ରେନାଡିସ୍ଭେନଜୁଏଲା" + + "ବ୍ରିଟିଶ୍ ଭର୍ଜିନ୍ ଦ୍ବୀପପୁଞ୍ଜୟୁଏସ୍ ଭର୍ଜିନ୍ ଦ୍ବୀପପୁଞ୍ଜଭିଏତନାମ୍ଭାନୁଆତୁ" + + "ୱାଲିସ୍ ଏବଂ ଫୁତୁନାସାମୋଆୟେମେନ୍ମାୟୋଟେଦକ୍ଷିଣ ଆଫ୍ରିକାଜାମ୍ବିଆଜିମ୍ବାୱେଅଜଣ" + + "ା କିମ୍ବା ଅବୈଧ ପ୍ରଦେଶବିଶ୍ବଆଫ୍ରିକାଉତ୍ତର ଆମେରିକାଦକ୍ଷିଣ ଆମେରିକାଓସୋନିଆନ" + + "୍ପଶ୍ଚିମ ଆଫ୍ରିକାମଧ୍ୟ ଆମେରିକାପୂର୍ବ ଆଫ୍ରିକାଉତ୍ତର ଆଫ୍ରିକାମଧ୍ୟ ଆଫ୍ରିକାଦ" + + "କ୍ଷିଣସ୍ଥ ଆଫ୍ରିକାଆମେରିକାସ୍ଉତ୍ତରସ୍ଥ ଆମେରିକାକାରିବିଆନ୍ପୂର୍ବ ଏସିଆଦକ୍ଷିଣ" + + " ଏସିଆଦକ୍ଷିଣ-ପୂର୍ବ ଏସିଆଦକ୍ଷିଣ ୟୁରୋପ୍ଅଷ୍ଟ୍ରେଲିଆ ଏବଂ ନ୍ୟୁଜିଲ୍ୟାଣ୍ଡମେଲାନ" + + "େସିଆମାଇକ୍ରୋନେସିଆନ୍ ଅଞ୍ଚଳପଲିନେସିଆଏସିଆମଧ୍ୟ ଏସିଆପଶ୍ଚିମ ଏସିଆୟୁରୋପ୍ପୂର୍" + + "ବ ୟୁରୋପ୍ଉତ୍ତର ୟୁରୋପ୍ପଶ୍ଚିମ ୟୁରୋପ୍ଲାଟିନ୍ ଆମେରିକା ଏବଂ କାରିବିଆନ୍", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0015, 0x004d, 0x0074, 0x00ac, 0x00ca, 0x00df, + 0x00f7, 0x013a, 0x014f, 0x0170, 0x0191, 0x01bc, 0x01d4, 0x01f2, + 0x0201, 0x0232, 0x0253, 0x028e, 0x02a9, 0x02ca, 0x02e2, 0x0307, + 0x031f, 0x0337, 0x034f, 0x0361, 0x038f, 0x03a1, 0x03b6, 0x03c8, + 0x03c8, 0x03e0, 0x03f8, 0x040a, 0x043b, 0x0456, 0x046e, 0x0480, + 0x0492, 0x04c3, 0x04e8, 0x0526, 0x055a, 0x0581, 0x05a0, 0x05cb, + 0x05dd, 0x05f5, 0x0601, 0x0619, 0x0619, 0x0638, 0x064a, 0x0666, + 0x0666, 0x06a0, 0x06b8, 0x06e9, 0x06fe, 0x06fe, 0x0710, 0x0728, + // Entry 40 - 7F + 0x0740, 0x077d, 0x0792, 0x0792, 0x07ad, 0x07c5, 0x07d7, 0x07fc, + 0x0817, 0x0829, 0x083e, 0x086f, 0x088d, 0x0899, 0x08d9, 0x08fd, + 0x092b, 0x0940, 0x0952, 0x096a, 0x0982, 0x0994, 0x09b9, 0x09d1, + 0x09dd, 0x09fe, 0x0a22, 0x0a37, 0x0a49, 0x0a61, 0x0a98, 0x0aaa, + 0x0b27, 0x0b3f, 0x0b4e, 0x0b70, 0x0b7f, 0x0bda, 0x0c53, 0x0c71, + 0x0c89, 0x0c98, 0x0cad, 0x0cad, 0x0ccb, 0x0ce9, 0x0d01, 0x0d24, + 0x0d30, 0x0d8d, 0x0d9c, 0x0dab, 0x0dc9, 0x0dd8, 0x0de7, 0x0dfc, + 0x0e14, 0x0e26, 0x0e38, 0x0e5f, 0x0e7a, 0x0e92, 0x0ea7, 0x0ee6, + // Entry 80 - BF + 0x0f05, 0x0f27, 0x0f36, 0x0f6d, 0x0f91, 0x0fa0, 0x0fb5, 0x0fd4, + 0x0ffb, 0x1016, 0x102b, 0x103d, 0x1055, 0x1073, 0x1085, 0x1094, + 0x10ac, 0x10be, 0x10d3, 0x10ee, 0x1116, 0x1137, 0x116b, 0x1186, + 0x1192, 0x11aa, 0x11c2, 0x11e2, 0x1226, 0x124a, 0x1268, 0x1289, + 0x129b, 0x12b0, 0x12c8, 0x12d7, 0x12ef, 0x1304, 0x1328, 0x133d, + 0x1365, 0x1377, 0x139c, 0x13b4, 0x13cf, 0x13f0, 0x13fc, 0x140b, + 0x141a, 0x1423, 0x1444, 0x1453, 0x1465, 0x1471, 0x149f, 0x14cb, + 0x14e9, 0x1504, 0x1519, 0x1561, 0x157f, 0x15a7, 0x15c8, 0x15e9, + // Entry C0 - FF + 0x15f8, 0x160d, 0x161c, 0x1644, 0x165f, 0x1674, 0x1686, 0x1695, + 0x16ad, 0x16cc, 0x1700, 0x1715, 0x1727, 0x173f, 0x175d, 0x177f, + 0x179a, 0x17df, 0x17fa, 0x1819, 0x1838, 0x1850, 0x1865, 0x187a, + 0x187a, 0x18b6, 0x18db, 0x18db, 0x18ea, 0x190b, 0x190b, 0x195c, + 0x1968, 0x19a0, 0x19ac, 0x19c4, 0x19e8, 0x19fd, 0x1a1f, 0x1a4c, + 0x1a61, 0x1a73, 0x1a85, 0x1ac0, 0x1ad2, 0x1ae7, 0x1b02, 0x1b1d, + 0x1b32, 0x1bab, 0x1be6, 0x1bf8, 0x1c1c, 0x1c34, 0x1c8c, 0x1ca4, + 0x1cf1, 0x1d35, 0x1d4d, 0x1d62, 0x1d91, 0x1da0, 0x1da0, 0x1db2, + // Entry 100 - 13F + 0x1dc4, 0x1dec, 0x1e01, 0x1e19, 0x1e58, 0x1e67, 0x1e7c, 0x1ea1, + 0x1ec9, 0x1ee1, 0x1f09, 0x1f2b, 0x1f50, 0x1f75, 0x1f97, 0x1fc8, + 0x1fe3, 0x2011, 0x202c, 0x2048, 0x2067, 0x2096, 0x20bb, 0x210b, + 0x2126, 0x2160, 0x2178, 0x2184, 0x219d, 0x21bc, 0x21ce, 0x21f0, + 0x2212, 0x2237, 0x2285, + }, + }, + { // os + "БразилиКитайГерманФранцСтыр БританиГуырдзыстонИндиИталиЯпонУӕрӕсеАИШНӕзо" + + "нгӕ бӕстӕДунеАфрикӕОкеаниАмерикӕАзиЕвропӕ", + []uint16{ // 287 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, + 0x000e, 0x000e, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0024, 0x0024, 0x0024, 0x0024, + // Entry 40 - 7F + 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, + 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, 0x0024, + 0x0024, 0x002e, 0x002e, 0x0045, 0x0045, 0x005b, 0x005b, 0x005b, + 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, + 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, + 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, + 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x006d, 0x006d, 0x006d, + 0x006d, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, + // Entry 80 - BF + 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, + 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, + 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, + 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, + 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, + 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, + 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, + 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, + // Entry C0 - FF + 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0075, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, + 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, 0x0087, + // Entry 100 - 13F + 0x0087, 0x0087, 0x0087, 0x0087, 0x00a0, 0x00a8, 0x00b4, 0x00b4, + 0x00b4, 0x00c0, 0x00c0, 0x00c0, 0x00c0, 0x00c0, 0x00c0, 0x00c0, + 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, 0x00ce, + 0x00ce, 0x00ce, 0x00ce, 0x00d4, 0x00d4, 0x00d4, 0x00e0, + }, + }, + { // pa + paRegionStr, + paRegionIdx, + }, + { // pa-Arab + "پکستان", + []uint16{ // 186 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 80 - BF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x000c, + }, + }, + { // pl + plRegionStr, + plRegionIdx, + }, + {}, // prg + { // ps + "افغانستانالبانیهانګولاانتارکتیکااتریشبنګله\u200cدیشبلغاریهکاناډاسویسچینک" + + "ولمبیاکیوباالمانډنمارکالجزایرمصرهسپانیهحبشهفنلینډفرانسهبرتانیهګاناګ" + + "یانایونانګواتیمالاهانډوراسمجارستاناندونیزیاهندعراقآیسلینډایټالیهجمی" + + "کاجاپانکمبودیاکویټلاوسلبنانلایبریالیبیامراکشمغولستانمالیزیانایجیریا" + + "نکاراګواهالېنډناروېنیپالنیوزیلنډپاکستانپولنډفلسطینپورتګالروسیهروندا" + + "سعودی عربستانسویډنسالوېډورسوریهتاجکستانتنزانیایوروګواییمن", + []uint16{ // 256 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, 0x0012, 0x0012, 0x0020, + 0x0020, 0x0020, 0x002c, 0x0040, 0x0040, 0x0040, 0x004a, 0x004a, + 0x004a, 0x004a, 0x004a, 0x004a, 0x004a, 0x005d, 0x005d, 0x005d, + 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, + 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, 0x006b, + 0x0077, 0x0077, 0x0077, 0x0077, 0x0077, 0x007f, 0x007f, 0x007f, + 0x007f, 0x007f, 0x0085, 0x0093, 0x0093, 0x0093, 0x009d, 0x009d, + 0x009d, 0x009d, 0x009d, 0x009d, 0x00a7, 0x00a7, 0x00a7, 0x00b3, + // Entry 40 - 7F + 0x00b3, 0x00b3, 0x00c1, 0x00c1, 0x00c1, 0x00c1, 0x00c7, 0x00c7, + 0x00c7, 0x00d5, 0x00dd, 0x00dd, 0x00e9, 0x00e9, 0x00e9, 0x00e9, + 0x00e9, 0x00f5, 0x00f5, 0x0103, 0x0103, 0x0103, 0x0103, 0x0103, + 0x010b, 0x010b, 0x010b, 0x010b, 0x0115, 0x0115, 0x0115, 0x011f, + 0x011f, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0131, 0x0141, + 0x0141, 0x0141, 0x0151, 0x0151, 0x0163, 0x0163, 0x0163, 0x0163, + 0x0169, 0x0169, 0x0171, 0x0171, 0x017f, 0x018d, 0x018d, 0x0197, + 0x0197, 0x01a1, 0x01a1, 0x01a1, 0x01af, 0x01af, 0x01af, 0x01af, + // Entry 80 - BF + 0x01af, 0x01af, 0x01b7, 0x01b7, 0x01b7, 0x01bf, 0x01c9, 0x01c9, + 0x01c9, 0x01c9, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01d7, 0x01e1, + 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, 0x01eb, + 0x01eb, 0x01eb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, + 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x01fb, 0x0209, 0x0209, 0x0209, + 0x0209, 0x0209, 0x0209, 0x0219, 0x0229, 0x0235, 0x023f, 0x0249, + 0x0249, 0x0249, 0x0259, 0x0259, 0x0259, 0x0259, 0x0259, 0x0259, + 0x0259, 0x0267, 0x0271, 0x0271, 0x0271, 0x0271, 0x027d, 0x028b, + // Entry C0 - FF + 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, 0x028b, 0x0295, + 0x029f, 0x02b8, 0x02b8, 0x02b8, 0x02b8, 0x02c2, 0x02c2, 0x02c2, + 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, + 0x02c2, 0x02c2, 0x02d2, 0x02d2, 0x02dc, 0x02dc, 0x02dc, 0x02dc, + 0x02dc, 0x02dc, 0x02dc, 0x02dc, 0x02ec, 0x02ec, 0x02ec, 0x02ec, + 0x02ec, 0x02ec, 0x02ec, 0x02ec, 0x02ec, 0x02ec, 0x02fa, 0x02fa, + 0x02fa, 0x02fa, 0x02fa, 0x030a, 0x030a, 0x030a, 0x030a, 0x030a, + 0x030a, 0x030a, 0x030a, 0x030a, 0x030a, 0x030a, 0x030a, 0x0310, + }, + }, + { // pt + ptRegionStr, + ptRegionIdx, + }, + { // pt-PT + ptPTRegionStr, + ptPTRegionIdx, + }, + { // qu + "AndorraAfganistánAlbaniaArmeniaAngolaArgentinaSamoa AmericanaAustriaAust" + + "raliaAzerbaiyánBangladeshBélgicaBulgariaBaréinBurundiBenínBrunéiBoli" + + "viaBonaireBrasilBahamasButánBotsuanaBelarúsIslas CocosCongo (RDC)Con" + + "goSuizaCôte d’IvoireChileCamerúnChinaColombiaCosta RicaCubaCurazaoIs" + + "la ChristmasChipreAlemaniaYibutiDinamarcaDominicaArgeliaEcuadorEston" + + "iaEgiptoEritreaEspañaEtiopíaFinlandiaFiyiMicronesiaFranciaGabónReino" + + " UnidoGuerneseyGhanaGambiaGuineaGuinea EcuatorialGreciaGuatemalaGuam" + + "Guinea-BisáuGuyanaHong Kong (RAE)Islas Heard y McDonaldHondurasCroac" + + "iaHaitíIndonesiaIsraelIndiaIrakIránIslandiaItaliaJerseyJordaniaKenia" + + "KirguistánCamboyaKiribatiComorasSan Cristóbal y NievesCorea del Nort" + + "eCorea del SurKuwaitKazajistánLaosLíbanoLiechtensteinSri LankaLiberi" + + "aLesotoLituaniaLuxemburgoLetoniaMarruecosMónacoMoldovaSan MartínMada" + + "gascarIslas MarshallERY MacedoniaMalíMyanmarMacao RAEIslas Marianas " + + "del NorteMauritaniaMaltaMauricioMaldivasMalawiMéxicoMozambiqueNamibi" + + "aNueva CaledoniaNígerIsla NorfolkNigeriaNicaraguaPaíses BajosNoruega" + + "NepalNauruOmánPanamáPerúPolinesia FrancesaPapúa Nueva GuineaFilipina" + + "sPakistánPoloniaSan Pedro y MiquelónIslas PitcairnPuerto RicoPalesti" + + "na KamachikuqPortugalPalaosParaguayQatarSerbiaRusiaRuandaArabia Saud" + + "íSeychellesSudánSueciaSingapurEsloveniaEslovaquiaSierra LeonaSan Ma" + + "rinoSenegalSomaliaSurinamSudán del SurSanto Tomé y PríncipeEl Salvad" + + "orSint MaartenSiriaSuazilandiaChadTerritorios Australes FrancesesTog" + + "oTailandiaTayikistánTimor-LesteTúnezTongaTurquíaTrinidad y TobagoTan" + + "zaniaUgandaIslas menores alejadas de los EE.UU.Estados UnidosUruguay" + + "UzbekistánSanta Sede (Ciudad del Vaticano)VenezuelaEE.UU. Islas Vírg" + + "enesVietnamVanuatuWallis y FutunaSamoaYemenSudáfricaZambiaZimbabue", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x0007, 0x0012, 0x0012, 0x0012, 0x0019, + 0x0020, 0x0020, 0x0026, 0x0026, 0x002f, 0x003e, 0x0045, 0x004e, + 0x004e, 0x004e, 0x0059, 0x0059, 0x0059, 0x0063, 0x006b, 0x006b, + 0x0073, 0x007a, 0x0081, 0x0087, 0x0087, 0x0087, 0x008e, 0x0095, + 0x009c, 0x00a2, 0x00a9, 0x00af, 0x00af, 0x00b7, 0x00bf, 0x00bf, + 0x00bf, 0x00ca, 0x00d5, 0x00d5, 0x00da, 0x00df, 0x00ef, 0x00ef, + 0x00f4, 0x00fc, 0x0101, 0x0109, 0x0109, 0x0113, 0x0117, 0x0117, + 0x011e, 0x012c, 0x0132, 0x0132, 0x013a, 0x013a, 0x0140, 0x0149, + // Entry 40 - 7F + 0x0151, 0x0151, 0x0158, 0x0158, 0x015f, 0x0166, 0x016c, 0x016c, + 0x0173, 0x017a, 0x0182, 0x0182, 0x018b, 0x018f, 0x018f, 0x0199, + 0x0199, 0x01a0, 0x01a6, 0x01b1, 0x01b1, 0x01b1, 0x01b1, 0x01ba, + 0x01bf, 0x01bf, 0x01bf, 0x01c5, 0x01cb, 0x01cb, 0x01dc, 0x01e2, + 0x01e2, 0x01eb, 0x01ef, 0x01fc, 0x0202, 0x0211, 0x0227, 0x022f, + 0x0236, 0x023c, 0x023c, 0x023c, 0x0245, 0x0245, 0x024b, 0x024b, + 0x0250, 0x0250, 0x0254, 0x0259, 0x0261, 0x0267, 0x026d, 0x026d, + 0x0275, 0x0275, 0x027a, 0x0285, 0x028c, 0x0294, 0x029b, 0x02b2, + // Entry 80 - BF + 0x02c1, 0x02ce, 0x02d4, 0x02d4, 0x02df, 0x02e3, 0x02ea, 0x02ea, + 0x02f7, 0x0300, 0x0307, 0x030d, 0x0315, 0x031f, 0x0326, 0x0326, + 0x032f, 0x0336, 0x033d, 0x033d, 0x0348, 0x0352, 0x0360, 0x036d, + 0x0372, 0x0379, 0x0379, 0x0382, 0x039a, 0x039a, 0x03a4, 0x03a4, + 0x03a9, 0x03b1, 0x03b9, 0x03bf, 0x03c6, 0x03c6, 0x03d0, 0x03d7, + 0x03e6, 0x03ec, 0x03f8, 0x03ff, 0x0408, 0x0415, 0x041c, 0x0421, + 0x0426, 0x0426, 0x0426, 0x042b, 0x0432, 0x0437, 0x0449, 0x045c, + 0x0465, 0x046e, 0x0475, 0x048a, 0x0498, 0x04a3, 0x04b7, 0x04bf, + // Entry C0 - FF + 0x04c5, 0x04cd, 0x04d2, 0x04d2, 0x04d2, 0x04d2, 0x04d8, 0x04dd, + 0x04e3, 0x04f0, 0x04f0, 0x04fa, 0x0500, 0x0506, 0x050e, 0x050e, + 0x0517, 0x0517, 0x0521, 0x052d, 0x0537, 0x053e, 0x0545, 0x054c, + 0x055a, 0x0571, 0x057c, 0x0588, 0x058d, 0x0598, 0x0598, 0x0598, + 0x059c, 0x05bb, 0x05bf, 0x05c8, 0x05d3, 0x05d3, 0x05de, 0x05de, + 0x05e4, 0x05e9, 0x05f1, 0x0602, 0x0602, 0x0602, 0x060a, 0x060a, + 0x0610, 0x0634, 0x0642, 0x0649, 0x0654, 0x0674, 0x0674, 0x067d, + 0x067d, 0x0693, 0x069a, 0x06a1, 0x06b0, 0x06b5, 0x06b5, 0x06ba, + // Entry 100 - 13F + 0x06ba, 0x06c4, 0x06ca, 0x06d2, + }, + }, + { // rm + "AndorraEmirats Arabs UnidsAfghanistanAntigua e BarbudaAnguillaAlbaniaArm" + + "eniaAntillas OllandaisasAngolaAntarcticaArgentiniaSamoa AmericanaAus" + + "triaAustraliaArubaInslas AlandAserbaidschanBosnia ed ErzegovinaBarba" + + "dosBangladeschBelgiaBurkina FasoBulgariaBahrainBurundiBeninSon Barth" + + "élemyBermudasBruneiBoliviaBrasilaBahamasBhutanInsla BouvetBotswanaB" + + "ielorussiaBelizeCanadaInslas CocosRepublica Democratica dal CongoRep" + + "ublica CentralafricanaCongoSvizraCosta d’IvurInslas CookChileCamerun" + + "ChinaColumbiaCosta RicaCubaCap VerdInsla da ChristmasCipraRepublica " + + "TschecaGermaniaDschibutiDanemarcDominicaRepublica DominicanaAlgeriaE" + + "cuadorEstoniaEgiptaSahara OccidentalaEritreaSpagnaEtiopiaUniun europ" + + "eicaFinlandaFidschiInslas dal FalklandMicronesiaInslas FeroeFrantsch" + + "aGabunReginavel UnìGrenadaGeorgiaGuyana FranzosaGuernseyGhanaGibralt" + + "arGrönlandaGambiaGuineaGuadeloupeGuinea EquatorialaGreziaGeorgia dal" + + " Sid e las Inslas Sandwich dal SidGuatemalaGuamGuinea-BissauGuyanaRe" + + "giun d’administraziun speziala da Hongkong, ChinaInslas da Heard e d" + + "a McDonladHondurasCroaziaHaitiUngariaIndonesiaIrlandaIsraelInsla da " + + "ManIndiaTerritori Britannic en l’Ocean IndicIracIranIslandaItaliaJer" + + "seyGiamaicaJordaniaGiapunKeniaKirghisistanCambodschaKiribatiComorasS" + + "aint Kitts e NevisCorea dal NordCorea dal SidKuwaitInslas CaymanKasa" + + "chstanLaosLibanonSaint LuciaLiechtensteinSri LankaLiberiaLesothoLitu" + + "aniaLuxemburgLettoniaLibiaMarocMonacoMoldaviaMontenegroSaint MartinM" + + "adagascarInslas da MarshallMacedoniaMaliMyanmarMongoliaRegiun d’admi" + + "nistraziun speziala Macao, ChinaInslas Mariannas dal NordMartiniqueM" + + "auretaniaMontserratMaltaMauritiusMaldivasMalawiMexicoMalaisiaMosambi" + + "cNamibiaNova CaledoniaNigerInsla NorfolkNigeriaNicaraguaPajais BassN" + + "orvegiaNepalNauruNiueNova ZelandaOmanPanamaPeruPolinesia FranzosaPap" + + "ua Nova GuineaFilippinasPakistanPolognaSaint Pierre e MiquelonPitcai" + + "rnPuerto RicoTerritori PalestinaisPortugalPalauParaguaiKatarOceania " + + "PerifericaRéunionRumeniaSerbiaRussiaRuandaArabia SauditaSalomonasSey" + + "chellasSudanSveziaSingapurSontg’ElenaSloveniaSvalbard e Jan MayenSlo" + + "vachiaSierra LeoneSan MarinoSenegalSomaliaSurinamSão Tomé e Principe" + + "El SalvadorSiriaSwazilandInslas Turks e CaicosTschadTerritoris Franz" + + "os MeridiunalsTogoTailandaTadschikistanTokelauTimor da l’OstTurkmeni" + + "stanTunesiaTongaTirchiaTrinidad e TobagoTuvaluTaiwanTansaniaUcrainaU" + + "gandaInslas pitschnas perifericas dals Stadis Unids da l’AmericaStad" + + "is Unids da l’AmericaUruguayUsbekistanCitad dal VaticanSaint Vincent" + + " e las GrenadinasVenezuelaInslas Verginas BritannicasInslas Verginas" + + " AmericanasVietnamVanuatuWallis e FutunaSamoaJemenMayotteAfrica dal " + + "SidSambiaSimbabweRegiun betg encouschenta u nunvalaivlamundAfricaAme" + + "rica dal NordAmerica dal SidOceaniaAfrica dal VestAmerica CentralaAf" + + "rica da l’OstAfrica dal NordAfrica CentralaAfrica MeridiunalaAmerica" + + " dal Nord, America Centrala ed America dal SidCaribicaAsia da l’OstA" + + "sia dal SidAsia dal SidostEuropa dal SidAustralia e Nova ZelandaMela" + + "nesiaRegiun MicronesicaPolinesiaAsiaAsia CentralaAsia dal VestEuropa" + + "Europa OrientalaEuropa dal NordEuropa dal VestAmerica Latina", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x001a, 0x0025, 0x0036, 0x003e, 0x0045, + 0x004c, 0x0060, 0x0066, 0x0070, 0x007a, 0x0089, 0x0090, 0x0099, + 0x009e, 0x00aa, 0x00b7, 0x00cb, 0x00d3, 0x00de, 0x00e4, 0x00f0, + 0x00f8, 0x00ff, 0x0106, 0x010b, 0x011a, 0x0122, 0x0128, 0x012f, + 0x012f, 0x0136, 0x013d, 0x0143, 0x014f, 0x0157, 0x0162, 0x0168, + 0x016e, 0x017a, 0x0199, 0x01b2, 0x01b7, 0x01bd, 0x01cb, 0x01d6, + 0x01db, 0x01e2, 0x01e7, 0x01ef, 0x01ef, 0x01f9, 0x01fd, 0x0205, + 0x0205, 0x0217, 0x021c, 0x022d, 0x0235, 0x0235, 0x023e, 0x0246, + // Entry 40 - 7F + 0x024e, 0x0262, 0x0269, 0x0269, 0x0270, 0x0277, 0x027d, 0x028f, + 0x0296, 0x029c, 0x02a3, 0x02b2, 0x02ba, 0x02c1, 0x02d4, 0x02de, + 0x02ea, 0x02f3, 0x02f8, 0x0306, 0x030d, 0x0314, 0x0323, 0x032b, + 0x0330, 0x0339, 0x0343, 0x0349, 0x034f, 0x0359, 0x036b, 0x0371, + 0x039e, 0x03a7, 0x03ab, 0x03b8, 0x03be, 0x03f3, 0x0410, 0x0418, + 0x041f, 0x0424, 0x042b, 0x042b, 0x0434, 0x043b, 0x0441, 0x044d, + 0x0452, 0x0478, 0x047c, 0x0480, 0x0487, 0x048d, 0x0493, 0x049b, + 0x04a3, 0x04a9, 0x04ae, 0x04ba, 0x04c4, 0x04cc, 0x04d3, 0x04e6, + // Entry 80 - BF + 0x04f4, 0x0501, 0x0507, 0x0514, 0x051e, 0x0522, 0x0529, 0x0534, + 0x0541, 0x054a, 0x0551, 0x0558, 0x0560, 0x0569, 0x0571, 0x0576, + 0x057b, 0x0581, 0x0589, 0x0593, 0x059f, 0x05a9, 0x05bb, 0x05c4, + 0x05c8, 0x05cf, 0x05d7, 0x0606, 0x061f, 0x0629, 0x0633, 0x063d, + 0x0642, 0x064b, 0x0653, 0x0659, 0x065f, 0x0667, 0x066f, 0x0676, + 0x0684, 0x0689, 0x0696, 0x069d, 0x06a6, 0x06b1, 0x06b9, 0x06be, + 0x06c3, 0x06c7, 0x06d3, 0x06d7, 0x06dd, 0x06e1, 0x06f3, 0x0704, + 0x070e, 0x0716, 0x071d, 0x0734, 0x073c, 0x0747, 0x075c, 0x0764, + // Entry C0 - FF + 0x0769, 0x0771, 0x0776, 0x0788, 0x0790, 0x0797, 0x079d, 0x07a3, + 0x07a9, 0x07b7, 0x07c0, 0x07ca, 0x07cf, 0x07d5, 0x07dd, 0x07ea, + 0x07f2, 0x0806, 0x080f, 0x081b, 0x0825, 0x082c, 0x0833, 0x083a, + 0x083a, 0x084f, 0x085a, 0x085a, 0x085f, 0x0868, 0x0868, 0x087d, + 0x0883, 0x08a1, 0x08a5, 0x08ad, 0x08ba, 0x08c1, 0x08d1, 0x08dd, + 0x08e4, 0x08e9, 0x08f0, 0x0901, 0x0907, 0x090d, 0x0915, 0x091c, + 0x0922, 0x095f, 0x097a, 0x0981, 0x098b, 0x099c, 0x09ba, 0x09c3, + 0x09de, 0x09f8, 0x09ff, 0x0a06, 0x0a15, 0x0a1a, 0x0a1a, 0x0a1f, + // Entry 100 - 13F + 0x0a26, 0x0a34, 0x0a3a, 0x0a42, 0x0a68, 0x0a6c, 0x0a72, 0x0a82, + 0x0a91, 0x0a98, 0x0aa7, 0x0ab7, 0x0ac8, 0x0ad7, 0x0ae6, 0x0af8, + 0x0b2d, 0x0b2d, 0x0b35, 0x0b44, 0x0b50, 0x0b5f, 0x0b6d, 0x0b85, + 0x0b8e, 0x0ba0, 0x0ba9, 0x0bad, 0x0bba, 0x0bc7, 0x0bcd, 0x0bdd, + 0x0bec, 0x0bfb, 0x0c09, + }, + }, + { // rn + "AndoraLeta Zunze Ubumwe z’AbarabuAfuganisitaniAntigwa na BaribudaAngwila" + + "AlubaniyaArumeniyaAntiye y’AbaholandiAngolaArijantineSamowa nyamerik" + + "aOtirisheOsitaraliyaArubaAzerubayijaniBosiniya na HerigozevineBaruba" + + "dosiBangaladeshiUbubiligiBurukina FasoBuligariyaBahareyiniUburundiBe" + + "neBerimudaBuruneyiBoliviyaBureziliBahamasiButaniBotswanaBelausiBeliz" + + "eKanadaRepubulika Iharanira Demokarasi ya KongoRepubulika ya Santara" + + "furikaKongoUbusuwisiKotedivuwareIzinga rya KukuShiliKameruniUbushinw" + + "aKolombiyaKositarikaKibaIbirwa bya KapuveriIzinga rya ShipureRepubul" + + "ika ya CekeUbudageJibutiDanimarikiDominikaRepubulika ya DominikaAlij" + + "eriyaEkwateriEsitoniyaMisiriElitereyaHisipaniyaEtiyopiyaFinilandiFij" + + "iIzinga rya FilikilandiMikoroniziyaUbufaransaGaboUbwongerezaGerenada" + + "JeworujiyaGwayana y’AbafaransaGanaJuburalitariGurunilandiGambiyaGune" + + "yaGwadelupeGineya EkwatoriyaliUbugerekiGwatemalaGwamuGineya BisawuGu" + + "yaneHondurasiKorowasiyaHayitiHungariyaIndoneziyaIrilandiIsiraheliUbu" + + "hindiIntara y’Ubwongereza yo mu birwa by’AbahindiIrakiIraniAyisiland" + + "iUbutaliyaniJamayikaYorudaniyaUbuyapaniKenyaKirigisitaniKambojeKirib" + + "atiIzinga rya KomoreSekitsi na NevisiKoreya y’amajaruguruKoreya y’am" + + "ajepfoKowetiIbirwa bya KeyimaniKazakisitaniLayosiLibaniSelusiyaLishy" + + "itenshitayiniSirilankaLiberiyaLesotoLituwaniyaLukusamburuLativaLibiy" + + "aMarokeMonakoMoludaviMadagasikariIzinga rya MarishariMasedoniyaMaliB" + + "irimaniyaMongoliyaAmazinga ya Mariyana ryo mu majaruguruMaritinikiMo" + + "ritaniyaMonteseratiMalitaIzinga rya MoriseMoludaveMalawiMigizikeMale" + + "ziyaMozambikiNamibiyaNiyukaledoniyaNijeriizinga rya NorufolukeNijeri" + + "yaNikaragwaUbuholandiNoruvejiNepaliNawuruNiyuweNuvelizelandiOmaniPan" + + "amaPeruPolineziya y’AbafaransaPapuwa NiyugineyaAmazinga ya FilipineP" + + "akisitaniPolonyeSempiyeri na MikeloniPitikeyiriniPuwetorikoPalesitin" + + "a Wesitibanka na GazaPorutugaliPalawuParagweKatariAmazinga ya Reyini" + + "yoRumaniyaUburusiyau RwandaArabiya SawuditeAmazinga ya SalumoniAmazi" + + "nga ya SeyisheliSudaniSuwediSingapuruSeheleneSiloveniyaSilovakiyaSiy" + + "eralewoneSanimarinoSenegaliSomaliyaSurinameSawotome na PerensipeEli " + + "SaluvatoriSiriyaSuwazilandiAmazinga ya Turkisi na CayikosiCadiTogoTa" + + "yilandiTajikisitaniTokelawuTimoru y’iburasirazubaTurukumenisitaniTun" + + "iziyaTongaTurukiyaTirinidadi na TobagoTuvaluTayiwaniTanzaniyaIkerene" + + "UbugandeLeta Zunze Ubumwe za AmerikaIrigweUzubekisitaniUmurwa wa Vat" + + "ikaniSevensa na GerenadineVenezuwelaIbirwa by’isugi by’AbongerezaAma" + + "zinga y’Isugi y’AbanyamerikaViyetinamuVanuwatuWalisi na FutunaSamowa" + + "YemeniMayoteAfurika y’EpfoZambiyaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0023, 0x0030, 0x0043, 0x004a, 0x0053, + 0x005c, 0x0071, 0x0077, 0x0077, 0x0081, 0x0091, 0x0099, 0x00a4, + 0x00a9, 0x00a9, 0x00b6, 0x00ce, 0x00d8, 0x00e4, 0x00ed, 0x00fa, + 0x0104, 0x010e, 0x0116, 0x011a, 0x011a, 0x0122, 0x012a, 0x0132, + 0x0132, 0x013a, 0x0142, 0x0148, 0x0148, 0x0150, 0x0157, 0x015d, + 0x0163, 0x0163, 0x018b, 0x01a6, 0x01ab, 0x01b4, 0x01c0, 0x01cf, + 0x01d4, 0x01dc, 0x01e5, 0x01ee, 0x01ee, 0x01f8, 0x01fc, 0x020f, + 0x020f, 0x020f, 0x0221, 0x0233, 0x023a, 0x023a, 0x0240, 0x024a, + // Entry 40 - 7F + 0x0252, 0x0268, 0x0271, 0x0271, 0x0279, 0x0282, 0x0288, 0x0288, + 0x0291, 0x029b, 0x02a4, 0x02a4, 0x02ad, 0x02b1, 0x02c7, 0x02d3, + 0x02d3, 0x02dd, 0x02e1, 0x02ec, 0x02f4, 0x02fe, 0x0314, 0x0314, + 0x0318, 0x0324, 0x032f, 0x0336, 0x033c, 0x0345, 0x0358, 0x0361, + 0x0361, 0x036a, 0x036f, 0x037c, 0x0382, 0x0382, 0x0382, 0x038b, + 0x0395, 0x039b, 0x03a4, 0x03a4, 0x03ae, 0x03b6, 0x03bf, 0x03bf, + 0x03c7, 0x03f7, 0x03fc, 0x0401, 0x040b, 0x0416, 0x0416, 0x041e, + 0x0428, 0x0431, 0x0436, 0x0442, 0x0449, 0x0451, 0x0462, 0x0473, + // Entry 80 - BF + 0x0489, 0x049c, 0x04a2, 0x04b5, 0x04c1, 0x04c7, 0x04cd, 0x04d5, + 0x04e7, 0x04f0, 0x04f8, 0x04fe, 0x0508, 0x0513, 0x0519, 0x051f, + 0x0525, 0x052b, 0x0533, 0x0533, 0x0533, 0x053f, 0x0553, 0x055d, + 0x0561, 0x056b, 0x0574, 0x0574, 0x059a, 0x05a4, 0x05ae, 0x05b9, + 0x05bf, 0x05d0, 0x05d8, 0x05de, 0x05e6, 0x05ee, 0x05f7, 0x05ff, + 0x060d, 0x0613, 0x0628, 0x0630, 0x0639, 0x0643, 0x064b, 0x0651, + 0x0657, 0x065d, 0x066a, 0x066f, 0x0675, 0x0679, 0x0692, 0x06a3, + 0x06b7, 0x06c1, 0x06c8, 0x06dd, 0x06e9, 0x06f3, 0x0711, 0x071b, + // Entry C0 - FF + 0x0721, 0x0728, 0x072e, 0x072e, 0x0742, 0x074a, 0x074a, 0x0753, + 0x075b, 0x076b, 0x077f, 0x0794, 0x079a, 0x07a0, 0x07a9, 0x07b1, + 0x07bb, 0x07bb, 0x07c5, 0x07d1, 0x07db, 0x07e3, 0x07eb, 0x07f3, + 0x07f3, 0x0808, 0x0816, 0x0816, 0x081c, 0x0827, 0x0827, 0x0846, + 0x084a, 0x084a, 0x084e, 0x0857, 0x0863, 0x086b, 0x0883, 0x0893, + 0x089b, 0x08a0, 0x08a8, 0x08bc, 0x08c2, 0x08ca, 0x08d3, 0x08da, + 0x08e2, 0x08e2, 0x08fe, 0x0904, 0x0911, 0x0923, 0x0938, 0x0942, + 0x0963, 0x0986, 0x0990, 0x0998, 0x09a8, 0x09ae, 0x09ae, 0x09b4, + // Entry 100 - 13F + 0x09ba, 0x09ca, 0x09d1, 0x09d9, + }, + }, + { // ro + roRegionStr, + roRegionIdx, + }, + { // rof + "AndoroFalme za KiarabuAfuganistaniAntigua na BabudaAnguilaAlbaniaAmeniaA" + + "ntili za UholanziAngoloAjentinaSamoa ya MarekaniOstriaAustraliaAruba" + + "AzabajaniBosnia na HezegovinaBabadoBangladeshiUbelgijiBukinafasoBulg" + + "ariaBahareniBurundiBeniniBermudaBruneiBoliviaBraziliBahamasiButaniBo" + + "tswanaBelarusiBelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhuri ya" + + " Afrika ya KatiKongoUswisiKodivaaVisiwa vya CookChileKameruniChinaKo" + + "lombiaKostarikaKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibutiDen" + + "makiDominikaJamhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaHispa" + + "niaUhabeshiUfiniFijiVisiwa vya FalklandMikronesiaUfaransaGaboniUinge" + + "rezaGrenadaJojiaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaGineG" + + "wadelupeGinekwetaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKorasia" + + "HaitiHungariaIndonesiaAyalandiIsraeliIndiaEneo la Uingereza katika B" + + "ahari HindiIrakiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKirigiz" + + "istaniKambodiaKiribatiKomoroSantakitzi na NevisKorea KaskaziniKorea " + + "KusiniKuwaitiVisiwa vya KaimaiKazakistaniLaosiLebanoniSantalusiaLish" + + "enteniSirilankaLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoMonak" + + "oMoldovaBukiniVisiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa vya" + + " Mariana vya KaskaziniMartinikiMoritaniaMontserratiMaltaMorisiModivu" + + "MalawiMeksikoMalesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha Norf" + + "okNijeriaNikaragwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPanamaP" + + "eruPolinesia ya UfaransaPapuaFilipinoPakistaniPolandiSantapieri na M" + + "ikeloniPitkairniPwetorikoUkingo wa Magharibi na Ukanda wa Gaza wa Pa" + + "lestinaUrenoPalauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiVisiw" + + "a vya SolomonShelisheliSudaniUswidiSingapooSantahelenaSloveniaSlovak" + + "iaSiera LeoniSamarinoSenegaliSomaliaSurinamuSao Tome na PrincipeElsa" + + "vadoSiriaUswaziVisiwa vya Turki na KaikoChadiTogoTailandiTajikistani" + + "TokelauTimori ya MasharikiTurukimenistaniTunisiaTongaUturukiTrinidad" + + " na TobagoTuvaluTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibekist" + + "aniVatikaniSantavisenti na GrenadiniVenezuelaVisiwa vya Virgin vya U" + + "ingerezaVisiwa vya Virgin vya MarekaniVietinamuVanuatuWalis na Futun" + + "aSamoaYemeniMayotteAfrika KusiniZambiaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0033, 0x003a, 0x0041, + 0x0047, 0x0059, 0x005f, 0x005f, 0x0067, 0x0078, 0x007e, 0x0087, + 0x008c, 0x008c, 0x0095, 0x00a9, 0x00af, 0x00ba, 0x00c2, 0x00cc, + 0x00d4, 0x00dc, 0x00e3, 0x00e9, 0x00e9, 0x00f0, 0x00f6, 0x00fd, + 0x00fd, 0x0104, 0x010c, 0x0112, 0x0112, 0x011a, 0x0122, 0x0128, + 0x012e, 0x012e, 0x014e, 0x0167, 0x016c, 0x0172, 0x0179, 0x0188, + 0x018d, 0x0195, 0x019a, 0x01a2, 0x01a2, 0x01ab, 0x01af, 0x01b7, + 0x01b7, 0x01b7, 0x01be, 0x01ce, 0x01d7, 0x01d7, 0x01dd, 0x01e4, + // Entry 40 - 7F + 0x01ec, 0x01ff, 0x0206, 0x0206, 0x020c, 0x0213, 0x0218, 0x0218, + 0x021f, 0x0227, 0x022f, 0x022f, 0x0234, 0x0238, 0x024b, 0x0255, + 0x0255, 0x025d, 0x0263, 0x026c, 0x0273, 0x0278, 0x028b, 0x028b, + 0x0290, 0x0298, 0x02a1, 0x02a7, 0x02ab, 0x02b4, 0x02bd, 0x02c4, + 0x02c4, 0x02cd, 0x02d1, 0x02da, 0x02e0, 0x02e0, 0x02e0, 0x02e9, + 0x02f0, 0x02f5, 0x02fd, 0x02fd, 0x0306, 0x030e, 0x0315, 0x0315, + 0x031a, 0x033f, 0x0344, 0x034a, 0x0352, 0x0358, 0x0358, 0x035f, + 0x0366, 0x036c, 0x0371, 0x037e, 0x0386, 0x038e, 0x0394, 0x03a7, + // Entry 80 - BF + 0x03b6, 0x03c2, 0x03c9, 0x03da, 0x03e5, 0x03ea, 0x03f2, 0x03fc, + 0x0406, 0x040f, 0x0416, 0x041c, 0x0424, 0x042d, 0x0434, 0x0439, + 0x043f, 0x0445, 0x044c, 0x044c, 0x044c, 0x0452, 0x0464, 0x046d, + 0x0471, 0x0476, 0x047e, 0x047e, 0x049e, 0x04a7, 0x04b0, 0x04bb, + 0x04c0, 0x04c6, 0x04cc, 0x04d2, 0x04d9, 0x04e0, 0x04e8, 0x04ef, + 0x04fb, 0x0501, 0x0512, 0x0519, 0x0522, 0x052a, 0x052f, 0x0535, + 0x053a, 0x053e, 0x0548, 0x054d, 0x0553, 0x0557, 0x056c, 0x0571, + 0x0579, 0x0582, 0x0589, 0x059f, 0x05a8, 0x05b1, 0x05e3, 0x05e8, + // Entry C0 - FF + 0x05ed, 0x05f5, 0x05fb, 0x05fb, 0x0604, 0x060b, 0x060b, 0x0610, + 0x0616, 0x061b, 0x062d, 0x0637, 0x063d, 0x0643, 0x064b, 0x0656, + 0x065e, 0x065e, 0x0666, 0x0671, 0x0679, 0x0681, 0x0688, 0x0690, + 0x0690, 0x06a4, 0x06ac, 0x06ac, 0x06b1, 0x06b7, 0x06b7, 0x06d0, + 0x06d5, 0x06d5, 0x06d9, 0x06e1, 0x06ec, 0x06f3, 0x0706, 0x0715, + 0x071c, 0x0721, 0x0728, 0x073a, 0x0740, 0x0747, 0x074f, 0x0756, + 0x075c, 0x075c, 0x0764, 0x076b, 0x0777, 0x077f, 0x0798, 0x07a1, + 0x07c0, 0x07de, 0x07e7, 0x07ee, 0x07fd, 0x0802, 0x0802, 0x0808, + // Entry 100 - 13F + 0x080f, 0x081c, 0x0822, 0x082a, + }, + }, + { // ru + ruRegionStr, + ruRegionIdx, + }, + { // rw + "RwandaIgitonga", + []uint16{ // 234 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 80 - BF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry C0 - FF + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, + 0x0006, 0x000e, + }, + }, + { // rwk + "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + + "iaAntili za UholanziAngolaAjentinaSamoa ya MarekaniAustriaAustraliaA" + + "rubaAzabajaniBosnia na HezegovinaBabadosiBangladeshiUbelgijiBukinafa" + + "soBulgariaBahareniBurundiBeniniBermudaBruneiBoliviaBraziliBahamaButa" + + "niBotswanaBelarusiBelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhur" + + "i ya Afrika ya KatiKongoUswisiKodivaaVisiwa vya CookChileKameruniChi" + + "naKolombiaKostarikaKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibut" + + "iDenmakiDominikaJamhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaH" + + "ispaniaUhabeshiUfiniFijiVisiwa vya FalklandMikronesiaUfaransaGaboniU" + + "ingerezaGrenadaJojiaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaG" + + "ineGwadelupeGinekwetaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKor" + + "asiaHaitiHungariaIndonesiaAyalandiIsraeliIndiaEneo la Uingereza kati" + + "ka Bahari HindiIrakiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKir" + + "igizistaniKambodiaKiribatiKomoroSantakitzi na NevisKorea KaskaziniKo" + + "rea KusiniKuwaitiVisiwa vya KaymanKazakistaniLaosiLebanoniSantalusia" + + "LishenteniSirilankaLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoM" + + "onakoMoldovaBukiniVisiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa" + + " vya Mariana vya KaskaziniMartinikiMoritaniaMontserratiMaltaMorisiMo" + + "divuMalawiMeksikoMalesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha " + + "NorfokNijeriaNikaragwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPan" + + "amaPeruPolinesia ya UfaransaPapuaFilipinoPakistaniPolandiSantapieri " + + "na MikeloniPitkairniPwetorikoUkingo wa Magharibi na Ukanda wa Gaza w" + + "a PalestinaUrenoPalauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiV" + + "isiwa vya SolomonShelisheliSudaniUswidiSingapooSantahelenaSloveniaSl" + + "ovakiaSiera LeoniSamarinoSenegaliSomaliaSurinamuSao Tome na Principe" + + "ElsavadoSiriaUswaziVisiwa vya Turki na KaikoChadiTogoTailandiTajikis" + + "taniTokelauTimori ya MasharikiTurukimenistaniTunisiaTongaUturukiTrin" + + "idad na TobagoTuvaluTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibe" + + "kistaniVatikaniSantavisenti na GrenadiniVenezuelaVisiwa vya Virgin v" + + "ya UingerezaVisiwa vya Virgin vya MarekaniVietinamuVanuatuWalis na F" + + "utunaSamoaYemeniMayotteAfrika KusiniZambiaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, + 0x004a, 0x005c, 0x0062, 0x0062, 0x006a, 0x007b, 0x0082, 0x008b, + 0x0090, 0x0090, 0x0099, 0x00ad, 0x00b5, 0x00c0, 0x00c8, 0x00d2, + 0x00da, 0x00e2, 0x00e9, 0x00ef, 0x00ef, 0x00f6, 0x00fc, 0x0103, + 0x0103, 0x010a, 0x0110, 0x0116, 0x0116, 0x011e, 0x0126, 0x012c, + 0x0132, 0x0132, 0x0152, 0x016b, 0x0170, 0x0176, 0x017d, 0x018c, + 0x0191, 0x0199, 0x019e, 0x01a6, 0x01a6, 0x01af, 0x01b3, 0x01bb, + 0x01bb, 0x01bb, 0x01c2, 0x01d2, 0x01db, 0x01db, 0x01e1, 0x01e8, + // Entry 40 - 7F + 0x01f0, 0x0203, 0x020a, 0x020a, 0x0210, 0x0217, 0x021c, 0x021c, + 0x0223, 0x022b, 0x0233, 0x0233, 0x0238, 0x023c, 0x024f, 0x0259, + 0x0259, 0x0261, 0x0267, 0x0270, 0x0277, 0x027c, 0x028f, 0x028f, + 0x0294, 0x029c, 0x02a5, 0x02ab, 0x02af, 0x02b8, 0x02c1, 0x02c8, + 0x02c8, 0x02d1, 0x02d5, 0x02de, 0x02e4, 0x02e4, 0x02e4, 0x02ed, + 0x02f4, 0x02f9, 0x0301, 0x0301, 0x030a, 0x0312, 0x0319, 0x0319, + 0x031e, 0x0343, 0x0348, 0x034e, 0x0356, 0x035c, 0x035c, 0x0363, + 0x036a, 0x0370, 0x0375, 0x0382, 0x038a, 0x0392, 0x0398, 0x03ab, + // Entry 80 - BF + 0x03ba, 0x03c6, 0x03cd, 0x03de, 0x03e9, 0x03ee, 0x03f6, 0x0400, + 0x040a, 0x0413, 0x041a, 0x0420, 0x0428, 0x0431, 0x0438, 0x043d, + 0x0443, 0x0449, 0x0450, 0x0450, 0x0450, 0x0456, 0x0468, 0x0471, + 0x0475, 0x047a, 0x0482, 0x0482, 0x04a2, 0x04ab, 0x04b4, 0x04bf, + 0x04c4, 0x04ca, 0x04d0, 0x04d6, 0x04dd, 0x04e4, 0x04ec, 0x04f3, + 0x04ff, 0x0505, 0x0516, 0x051d, 0x0526, 0x052e, 0x0533, 0x0539, + 0x053e, 0x0542, 0x054c, 0x0551, 0x0557, 0x055b, 0x0570, 0x0575, + 0x057d, 0x0586, 0x058d, 0x05a3, 0x05ac, 0x05b5, 0x05e7, 0x05ec, + // Entry C0 - FF + 0x05f1, 0x05f9, 0x05ff, 0x05ff, 0x0608, 0x060f, 0x060f, 0x0614, + 0x061a, 0x061f, 0x0631, 0x063b, 0x0641, 0x0647, 0x064f, 0x065a, + 0x0662, 0x0662, 0x066a, 0x0675, 0x067d, 0x0685, 0x068c, 0x0694, + 0x0694, 0x06a8, 0x06b0, 0x06b0, 0x06b5, 0x06bb, 0x06bb, 0x06d4, + 0x06d9, 0x06d9, 0x06dd, 0x06e5, 0x06f0, 0x06f7, 0x070a, 0x0719, + 0x0720, 0x0725, 0x072c, 0x073e, 0x0744, 0x074b, 0x0753, 0x075a, + 0x0760, 0x0760, 0x0768, 0x076f, 0x077b, 0x0783, 0x079c, 0x07a5, + 0x07c4, 0x07e2, 0x07eb, 0x07f2, 0x0801, 0x0806, 0x0806, 0x080c, + // Entry 100 - 13F + 0x0813, 0x0820, 0x0826, 0x082e, + }, + }, + { // sah + "КытайАрассыыйаАан дойдуАапырыкаХотугу ЭмиэрикэСоҕуруу Эмиэрикэ", + []uint16{ // 265 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + // Entry 40 - 7F + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + // Entry 80 - BF + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, + // Entry C0 - FF + 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x001c, + 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, + 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, + 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, + 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, + 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, + 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, + 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, + // Entry 100 - 13F + 0x001c, 0x001c, 0x001c, 0x001c, 0x001c, 0x002d, 0x003d, 0x005a, + 0x0079, + }, + }, + { // saq + "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + + "iaAntili za UholanziAngolaAjentinaSamoa ya MarekaniAustriaAustraliaA" + + "rubaAzabajaniBosnia na HezegovinaBabadosiBangladeshiUbelgijiBukinafa" + + "soBulgariaBahareniBurundiBeniniBermudaBruneiBoliviaBraziliBahamaButa" + + "niBotswanaBelarusiBelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhur" + + "i ya Afrika ya KatiKongoUswisiKodivaaVisiwa vya CookChileKameruniChi" + + "naKolombiaKostarikaKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibut" + + "iDenmakiDominikaJamhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaH" + + "ispaniaUhabeshiUfiniFijiVisiwa vya FalklandMikronesiaUfaransaGaboniU" + + "ingerezaGrenadaJojiaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaG" + + "ineGwadelupeGinekwetaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKor" + + "asiaHaitiHungariaIndonesiaAyalandiIsraeliIndiaEneo la Uingereza kati" + + "ka Bahari HindiIrakiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKir" + + "igizistaniKambodiaKiribatiKomoroSantakitzi na NevisKorea KaskaziniKo" + + "rea KusiniKuwaitiVisiwa vya KaymanKazakistaniLaosiLebanoniSantalusia" + + "LishenteniSirilankaLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoM" + + "onakoMoldovaBukiniVisiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa" + + " vya Mariana vya KaskaziniMartinikiMoritaniaMontserratiMaltaMorisiMo" + + "divuMalawiMeksikoMalesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha " + + "NorfokNijeriaNikaragwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPan" + + "amaPeruPolinesia ya UfaransaPapuaFilipinoPakistaniPolandiSantapieri " + + "na MikeloniPitkairniPwetorikoUkingo wa Magharibi na Ukanda wa Gaza w" + + "a PalestinaUrenoPalauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiV" + + "isiwa vya SolomonShelisheliSudaniUswidiSingapooSantahelenaSloveniaSl" + + "ovakiaSiera LeoniSamarinoSenegaliSomaliaSurinamuSao Tome na Principe" + + "ElsavadoSiriaUswaziVisiwa vya Turki na KaikoChadiTogoTailandiTajikis" + + "taniTokelauTimori ya MasharikiTurukimenistaniTunisiaTongaUturukiTrin" + + "idad na TobagoTuvaluTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibe" + + "kistaniVatikaniSantavisenti na GrenadiniVenezuelaVisiwa vya Virgin v" + + "ya UingerezaVisiwa vya Virgin vya MarekaniVietinamuVanuatuWalis na F" + + "utunaSamoaYemeniMayotteAfrika KusiniZambiaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, + 0x004a, 0x005c, 0x0062, 0x0062, 0x006a, 0x007b, 0x0082, 0x008b, + 0x0090, 0x0090, 0x0099, 0x00ad, 0x00b5, 0x00c0, 0x00c8, 0x00d2, + 0x00da, 0x00e2, 0x00e9, 0x00ef, 0x00ef, 0x00f6, 0x00fc, 0x0103, + 0x0103, 0x010a, 0x0110, 0x0116, 0x0116, 0x011e, 0x0126, 0x012c, + 0x0132, 0x0132, 0x0152, 0x016b, 0x0170, 0x0176, 0x017d, 0x018c, + 0x0191, 0x0199, 0x019e, 0x01a6, 0x01a6, 0x01af, 0x01b3, 0x01bb, + 0x01bb, 0x01bb, 0x01c2, 0x01d2, 0x01db, 0x01db, 0x01e1, 0x01e8, + // Entry 40 - 7F + 0x01f0, 0x0203, 0x020a, 0x020a, 0x0210, 0x0217, 0x021c, 0x021c, + 0x0223, 0x022b, 0x0233, 0x0233, 0x0238, 0x023c, 0x024f, 0x0259, + 0x0259, 0x0261, 0x0267, 0x0270, 0x0277, 0x027c, 0x028f, 0x028f, + 0x0294, 0x029c, 0x02a5, 0x02ab, 0x02af, 0x02b8, 0x02c1, 0x02c8, + 0x02c8, 0x02d1, 0x02d5, 0x02de, 0x02e4, 0x02e4, 0x02e4, 0x02ed, + 0x02f4, 0x02f9, 0x0301, 0x0301, 0x030a, 0x0312, 0x0319, 0x0319, + 0x031e, 0x0343, 0x0348, 0x034e, 0x0356, 0x035c, 0x035c, 0x0363, + 0x036a, 0x0370, 0x0375, 0x0382, 0x038a, 0x0392, 0x0398, 0x03ab, + // Entry 80 - BF + 0x03ba, 0x03c6, 0x03cd, 0x03de, 0x03e9, 0x03ee, 0x03f6, 0x0400, + 0x040a, 0x0413, 0x041a, 0x0420, 0x0428, 0x0431, 0x0438, 0x043d, + 0x0443, 0x0449, 0x0450, 0x0450, 0x0450, 0x0456, 0x0468, 0x0471, + 0x0475, 0x047a, 0x0482, 0x0482, 0x04a2, 0x04ab, 0x04b4, 0x04bf, + 0x04c4, 0x04ca, 0x04d0, 0x04d6, 0x04dd, 0x04e4, 0x04ec, 0x04f3, + 0x04ff, 0x0505, 0x0516, 0x051d, 0x0526, 0x052e, 0x0533, 0x0539, + 0x053e, 0x0542, 0x054c, 0x0551, 0x0557, 0x055b, 0x0570, 0x0575, + 0x057d, 0x0586, 0x058d, 0x05a3, 0x05ac, 0x05b5, 0x05e7, 0x05ec, + // Entry C0 - FF + 0x05f1, 0x05f9, 0x05ff, 0x05ff, 0x0608, 0x060f, 0x060f, 0x0614, + 0x061a, 0x061f, 0x0631, 0x063b, 0x0641, 0x0647, 0x064f, 0x065a, + 0x0662, 0x0662, 0x066a, 0x0675, 0x067d, 0x0685, 0x068c, 0x0694, + 0x0694, 0x06a8, 0x06b0, 0x06b0, 0x06b5, 0x06bb, 0x06bb, 0x06d4, + 0x06d9, 0x06d9, 0x06dd, 0x06e5, 0x06f0, 0x06f7, 0x070a, 0x0719, + 0x0720, 0x0725, 0x072c, 0x073e, 0x0744, 0x074b, 0x0753, 0x075a, + 0x0760, 0x0760, 0x0768, 0x076f, 0x077b, 0x0783, 0x079c, 0x07a5, + 0x07c4, 0x07e2, 0x07eb, 0x07f2, 0x0801, 0x0806, 0x0806, 0x080c, + // Entry 100 - 13F + 0x0813, 0x0820, 0x0826, 0x082e, + }, + }, + { // sbp + "AndolaWutwa wa shiyalabuAfuganisitaniAnitiguya ni BalubudaAnguillaAluban" + + "iyaAlimeniyaAnitili sa UholansiAngolaAjentinaSamoya ya MalekaniAwusi" + + "tiliyaAwusitilaliyaAlubaAsabajaniBosiniya ni HesegovinaBabadosiBangi" + + "ladeshiUbeligijiBukinafasoBuligaliyaBahaleniBulundiBeniniBelimudaBul" + + "uneyiBoliviyaBulasiliBahamaButaniBotiswanaBelalusiBeliseKanadaJamuhu" + + "li ya Kidemokilasiya ya KongoJamuhuli ya Afilika ya PakhatiKongoUswi" + + "siKodivayaFigunguli fya KookiShileKameruniShinaKolombiyaKositalikaKu" + + "baKepuvedeKupilosiJamuhuli ya ShekiWujelumaniJibutiDenimakiDominikaJ" + + "amuhuli ya DominikaAlijeliyaEkwadoEsitoniyaMisiliElitileyaHisipaniya" + + "UhabeshiWufiniFijiFigunguli fya FokolendiMikilonesiyaWufalansaGaboni" + + "UwingelesaGilenadaJojiyaGwiyana ya WufalansaKhanaJibulalitaGilinilan" + + "diGambiyaGineGwadelupeGinekwetaWugilikiGwatemalaGwamuGinebisawuGuyan" + + "aHondulasiKolasiyaHayitiHungaliyaIndonesiyaAyalandiIsilaeliIndiyaUlu" + + "vala lwa Uwingelesa ku Bahali ya HindiIlakiUwajemiAyisilendiItaliyaJ" + + "amaikaYolodaniJapaniKenyaKiligisisitaniKambodiyaKilibatiKomoloSantak" + + "itisi ni NevisiKoleya ya luvala lwa KunyamandeKoleya ya KusiniKuwait" + + "iFigunguli ifya KayimayiKasakisitaniLayosiLebanoniSantalusiyaLisheni" + + "teniSililankaLibeliyaLesotoLitwaniyaLasembagiLativiyaLibiyaMolokoMon" + + "akoMolidovaBukiniFigunguli ifya MalishaliMasedoniyaMaliMuyamaMongoli" + + "yaFigunguli fya Maliyana ifya luvala lwa KunyamandeMalitinikiMolitan" + + "iyaMonitiselatiMalitaMolisiModivuMalawiMekisikoMalesiyaMusumbijiNami" + + "biyaNyukaledoniyaNijeliShigunguli sha NolifokiNijeliyaNikalagwaWuhol" + + "ansiNolweNepaliNawuluNiwueNyusilendiOmaniPanamaPeluPolinesiya ya Wuf" + + "alansaPapuwaFilipinoPakisitaniPolandiSantapieli ni MikeloniPitikaili" + + "niPwetolikoMunjema gwa Kusikha nu Luvala lwa Gasa lwa PalesitWulenoP" + + "alawuPalagwayiKataliLiyunioniLomaniyaWulusiLwandaSawudiFigunguli fya" + + " SolomoniShelisheliSudaniUswidiSingapooSantahelenaSiloveniyaSilovaki" + + "yaSiela LiyoniSamalinoSenegaliSomaliyaSulinamuSayo Tome ni Pilinikip" + + "eElisavadoSiliyaUswasiFigunguli fya Tuliki ni KaikoShadiTogoTailandi" + + "TajikisitaniTokelawuTimoli ya kunenaTulukimenisitaniTunisiyaTongaUtu" + + "lukiTilinidadi ni TobagoTuvaluTaiwaniTansaniyaYukileiniUgandaMalekan" + + "iUlugwayiUsibekisitaniVatikaniSantavisenti na GilenadiniVenesuelaFig" + + "unguli ifya Viliginiya ifya UwingelesaFigunguli fya Viliginiya ifya " + + "MalekaniVietinamuVanuatuWalisi ni FutunaSamoyaYemeniMayoteAfilika Ku" + + "siniSambiyaSimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0018, 0x0025, 0x003a, 0x0042, 0x004b, + 0x0054, 0x0067, 0x006d, 0x006d, 0x0075, 0x0087, 0x0092, 0x009f, + 0x00a4, 0x00a4, 0x00ad, 0x00c3, 0x00cb, 0x00d7, 0x00e0, 0x00ea, + 0x00f4, 0x00fc, 0x0103, 0x0109, 0x0109, 0x0111, 0x0119, 0x0121, + 0x0121, 0x0129, 0x012f, 0x0135, 0x0135, 0x013e, 0x0146, 0x014c, + 0x0152, 0x0152, 0x0175, 0x0193, 0x0198, 0x019e, 0x01a6, 0x01b9, + 0x01be, 0x01c6, 0x01cb, 0x01d4, 0x01d4, 0x01de, 0x01e2, 0x01ea, + 0x01ea, 0x01ea, 0x01f2, 0x0203, 0x020d, 0x020d, 0x0213, 0x021b, + // Entry 40 - 7F + 0x0223, 0x0237, 0x0240, 0x0240, 0x0246, 0x024f, 0x0255, 0x0255, + 0x025e, 0x0268, 0x0270, 0x0270, 0x0276, 0x027a, 0x0291, 0x029d, + 0x029d, 0x02a6, 0x02ac, 0x02b6, 0x02be, 0x02c4, 0x02d8, 0x02d8, + 0x02dd, 0x02e7, 0x02f2, 0x02f9, 0x02fd, 0x0306, 0x030f, 0x0317, + 0x0317, 0x0320, 0x0325, 0x032f, 0x0335, 0x0335, 0x0335, 0x033e, + 0x0346, 0x034c, 0x0355, 0x0355, 0x035f, 0x0367, 0x036f, 0x036f, + 0x0375, 0x039e, 0x03a3, 0x03aa, 0x03b4, 0x03bb, 0x03bb, 0x03c2, + 0x03ca, 0x03d0, 0x03d5, 0x03e3, 0x03ec, 0x03f4, 0x03fa, 0x040f, + // Entry 80 - BF + 0x042e, 0x043e, 0x0445, 0x045c, 0x0468, 0x046e, 0x0476, 0x0481, + 0x048c, 0x0495, 0x049d, 0x04a3, 0x04ac, 0x04b5, 0x04bd, 0x04c3, + 0x04c9, 0x04cf, 0x04d7, 0x04d7, 0x04d7, 0x04dd, 0x04f5, 0x04ff, + 0x0503, 0x0509, 0x0512, 0x0512, 0x0543, 0x054d, 0x0557, 0x0563, + 0x0569, 0x056f, 0x0575, 0x057b, 0x0583, 0x058b, 0x0594, 0x059c, + 0x05a9, 0x05af, 0x05c6, 0x05ce, 0x05d7, 0x05e0, 0x05e5, 0x05eb, + 0x05f1, 0x05f6, 0x0600, 0x0605, 0x060b, 0x060f, 0x0626, 0x062c, + 0x0634, 0x063e, 0x0645, 0x065b, 0x0666, 0x066f, 0x06a1, 0x06a7, + // Entry C0 - FF + 0x06ad, 0x06b6, 0x06bc, 0x06bc, 0x06c5, 0x06cd, 0x06cd, 0x06d3, + 0x06d9, 0x06df, 0x06f5, 0x06ff, 0x0705, 0x070b, 0x0713, 0x071e, + 0x0728, 0x0728, 0x0732, 0x073e, 0x0746, 0x074e, 0x0756, 0x075e, + 0x075e, 0x0775, 0x077e, 0x077e, 0x0784, 0x078a, 0x078a, 0x07a7, + 0x07ac, 0x07ac, 0x07b0, 0x07b8, 0x07c4, 0x07cc, 0x07dc, 0x07ec, + 0x07f4, 0x07f9, 0x0800, 0x0814, 0x081a, 0x0821, 0x082a, 0x0833, + 0x0839, 0x0839, 0x0841, 0x0849, 0x0856, 0x085e, 0x0878, 0x0881, + 0x08aa, 0x08d0, 0x08d9, 0x08e0, 0x08f0, 0x08f6, 0x08f6, 0x08fc, + // Entry 100 - 13F + 0x0902, 0x0910, 0x0917, 0x091f, + }, + }, + { // se + "AscensionAndorraOvttastuvvan ArábaemiráhtatAfghanistanAntigua ja Barbuda" + + "AnguillaAlbániaArmeniaAngolaAntárktisArgentinaAmerihká SamoaNuortari" + + "ikaAustráliaArubaÅlándaAserbaižanBosnia-HercegovinaBarbadosBanglades" + + "hBelgiaBurkina FasoBulgáriaBahrainBurundiBeninSaint BarthélemyBermud" + + "aBruneiBoliviaBrasilBahamasBhutanBouvet-sullotBotswanaVilges-RuoššaB" + + "elizeKanádaCocos-sullotKongo-KinshasaGaska-Afrihká dásseváldiKongo-B" + + "razzavilleŠveicaElfenbenaridduCook-sullotČiileKamerunKiinnáKolombiaC" + + "lipperton-sullotCosta RicaKubaKap VerdeCuraçaoJuovllat-sullotKyprosČ" + + "eahkkaDuiskaDiego GarciaDjiboutiDánmárkuDominicaDominikána dásseváld" + + "iAlgeriaCeuta ja MelillaEcuadorEstlándaEgyptaOarje-SaháraEritreaSpán" + + "iaEtiopiaEurohpa UniovdnaSuopmaFijisullotFalklandsullotMikronesiaFea" + + "rsullotFrankriikaGabonStuorra-BritánniaGrenadaGeorgiaFrankriikka Gua" + + "yanaGuernseyGhanaGibraltarKalaallit NunaatGámbiaGuineaGuadeloupeEkva" + + "toriála GuineaGreikaLulli Georgia ja Lulli Sandwich-sullotGuatemalaG" + + "uamGuinea-BissauGuyanaHongkongHeard- ja McDonald-sullotHondurasKroát" + + "iaHaitiUngárKanáriasullotIndonesiaIrlándaIsraelMann-sullotIndiaIrakI" + + "ranIslándaItáliaJerseyJamaicaJordániaJapánaKeniaKirgisistanKambodžaK" + + "iribatiKomorosSaint Kitts ja NevisDavvi-KoreaMátta-KoreaKuwaitCayman" + + "-sullotKasakstanLaosLibanonSaint LuciaLiechtensteinSri LankaLiberiaL" + + "esothoLietuvaLuxembourgLátviaLibyaMarokkoMonacoMoldáviaMontenegroFra" + + "nkriikka Saint MartinMadagaskarMarshallsullotMakedoniaMaliBurmaMongo" + + "liaMakáoDavvi-MariánatMartiniqueMauretániaMontserratMáltaMauritiusMa" + + "lediivvatMalawiMeksikoMalesiaMosambikNamibiaOđđa-KaledoniaNigerNorfo" + + "lksullotNigeriaNicaraguaVuolleeatnamatNorgaNepalNauruNiueOđđa-Selánd" + + "aOmanPanamaPeruFrankriikka PolynesiaPapua-Ođđa-GuineaFilippiinnatPak" + + "istanPolenSaint Pierre ja MiquelonPitcairnPuerto RicoPalestinaPortug" + + "álaPalauParaguayQatarRéunionRomániaSerbiaRuoššaRwandaSaudi-ArábiaSa" + + "lomon-sullotSeychellsullotDavvisudanRuoŧŧaSingaporeSaint HelenaSlove" + + "niaSvalbárda ja Jan MayenSlovákiaSierra LeoneSan MarinoSenegalSomáli" + + "aSurinamMáttasudanSão Tomé ja PríncipeEl SalvadorVuolleeatnamat Sain" + + "t MartinSyriaSvazieanaTristan da CunhaTurks ja Caicos-sullotTčadTogo" + + "ThaieanaTažikistanTokelauNuorta-TimorTurkmenistanTunisiaTongaDurkaTr" + + "inidad ja TobagoTuvaluTaiwanTanzániaUkrainaUgandaAmerihká ovttastuvv" + + "an stáhtatUruguayUsbekistanVatikánaSaint Vincent ja GrenadineVenezue" + + "laBrittania Virgin-sullotAOS Virgin-sullotVietnamVanuatuWallis ja Fu" + + "tunaSamoaKosovoJemenMayotteMátta-AfrihkáZambiaZimbabwedovdameahttun " + + "guovlumáilbmiAfrihkkádávvi-Amerihkká ja gaska-Amerihkkámátta-Amerihk" + + "káOseaniaoarji-Afrihkkágaska-Amerihkkánuorta-Afrihkkádavvi-Afrihkkág" + + "aska-Afrihkkámátta-AfrihkkáAmerihkkádávvi-AmerihkkáKaribianuorta-Ási" + + "amátta-Ásiamátta-nuorta-Ásiamátta-EurohpáAustrália ja Ođđa-SelándaMe" + + "lanesiaMikronesia guovllusPolynesiaÁsiagaska-Ásiaoarji-ÁsiaEurohpánu" + + "orta-Eurohpádavvi-Eurohpáoarji-Eurohpálulli-Amerihkká", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0009, 0x0010, 0x002d, 0x0038, 0x004a, 0x0052, 0x005a, + 0x0061, 0x0061, 0x0067, 0x0071, 0x007a, 0x0089, 0x0094, 0x009e, + 0x00a3, 0x00ab, 0x00b6, 0x00c8, 0x00d0, 0x00da, 0x00e0, 0x00ec, + 0x00f5, 0x00fc, 0x0103, 0x0108, 0x0119, 0x0120, 0x0126, 0x012d, + 0x012d, 0x0133, 0x013a, 0x0140, 0x014d, 0x0155, 0x0164, 0x016a, + 0x0171, 0x017d, 0x018b, 0x01a6, 0x01b7, 0x01be, 0x01cc, 0x01d7, + 0x01dd, 0x01e4, 0x01eb, 0x01f3, 0x0204, 0x020e, 0x0212, 0x021b, + 0x0223, 0x0232, 0x0238, 0x0240, 0x0246, 0x0252, 0x025a, 0x0264, + // Entry 40 - 7F + 0x026c, 0x0284, 0x028b, 0x029b, 0x02a2, 0x02ab, 0x02b1, 0x02be, + 0x02c5, 0x02cc, 0x02d3, 0x02e3, 0x02e9, 0x02f3, 0x0301, 0x030b, + 0x0315, 0x031f, 0x0324, 0x0336, 0x033d, 0x0344, 0x0357, 0x035f, + 0x0364, 0x036d, 0x037d, 0x0384, 0x038a, 0x0394, 0x03a7, 0x03ad, + 0x03d3, 0x03dc, 0x03e0, 0x03ed, 0x03f3, 0x03fb, 0x0414, 0x041c, + 0x0424, 0x0429, 0x042f, 0x043d, 0x0446, 0x044e, 0x0454, 0x045f, + 0x0464, 0x0464, 0x0468, 0x046c, 0x0474, 0x047b, 0x0481, 0x0488, + 0x0491, 0x0498, 0x049d, 0x04a8, 0x04b1, 0x04b9, 0x04c0, 0x04d4, + // Entry 80 - BF + 0x04df, 0x04eb, 0x04f1, 0x04fe, 0x0507, 0x050b, 0x0512, 0x051d, + 0x052a, 0x0533, 0x053a, 0x0541, 0x0548, 0x0552, 0x0559, 0x055e, + 0x0565, 0x056b, 0x0574, 0x057e, 0x0596, 0x05a0, 0x05ae, 0x05b7, + 0x05bb, 0x05c0, 0x05c8, 0x05ce, 0x05dd, 0x05e7, 0x05f2, 0x05fc, + 0x0602, 0x060b, 0x0616, 0x061c, 0x0623, 0x062a, 0x0632, 0x0639, + 0x0649, 0x064e, 0x065b, 0x0662, 0x066b, 0x0679, 0x067e, 0x0683, + 0x0688, 0x068c, 0x069b, 0x069f, 0x06a5, 0x06a9, 0x06be, 0x06d1, + 0x06dd, 0x06e5, 0x06ea, 0x0702, 0x070a, 0x0715, 0x071e, 0x0728, + // Entry C0 - FF + 0x072d, 0x0735, 0x073a, 0x073a, 0x0742, 0x074a, 0x0750, 0x0758, + 0x075e, 0x076b, 0x0779, 0x0787, 0x0791, 0x0799, 0x07a2, 0x07ae, + 0x07b6, 0x07cd, 0x07d6, 0x07e2, 0x07ec, 0x07f3, 0x07fb, 0x0802, + 0x080d, 0x0824, 0x082f, 0x084a, 0x084f, 0x0858, 0x0868, 0x087e, + 0x0883, 0x0883, 0x0887, 0x088f, 0x089a, 0x08a1, 0x08ad, 0x08b9, + 0x08c0, 0x08c5, 0x08ca, 0x08dc, 0x08e2, 0x08e8, 0x08f1, 0x08f8, + 0x08fe, 0x08fe, 0x091d, 0x0924, 0x092e, 0x0937, 0x0951, 0x095a, + 0x0971, 0x0982, 0x0989, 0x0990, 0x09a0, 0x09a5, 0x09ab, 0x09b0, + // Entry 100 - 13F + 0x09b7, 0x09c6, 0x09cc, 0x09d4, 0x09e8, 0x09f0, 0x09f9, 0x0a1e, + 0x0a2f, 0x0a36, 0x0a45, 0x0a55, 0x0a65, 0x0a74, 0x0a83, 0x0a93, + 0x0a9d, 0x0aae, 0x0ab5, 0x0ac1, 0x0acd, 0x0ae0, 0x0aef, 0x0b0c, + 0x0b15, 0x0b28, 0x0b31, 0x0b36, 0x0b41, 0x0b4c, 0x0b54, 0x0b63, + 0x0b71, 0x0b7f, 0x0b8f, + }, + }, + { // se-FI + "Bosnia ja HercegovinaKambožaSudanChadDavvi-Amerihkká ja Gaska-AmerihkkáL" + + "ulli-AmerihkkáGaska-AmerihkkáDavvi-AmerihkkáLatiinnalaš-Amerihkká", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, + // Entry 40 - 7F + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, 0x0015, + 0x0015, 0x0015, 0x0015, 0x0015, 0x001d, 0x001d, 0x001d, 0x001d, + // Entry 80 - BF + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, + // Entry C0 - FF + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, + 0x001d, 0x001d, 0x001d, 0x001d, 0x0022, 0x0022, 0x0022, 0x0022, + 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, + 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, 0x0022, + 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, + 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, + 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, + 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, + // Entry 100 - 13F + 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x0026, 0x004a, + 0x005a, 0x005a, 0x005a, 0x006a, 0x006a, 0x006a, 0x006a, 0x006a, + 0x006a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, + 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, 0x007a, + 0x007a, 0x007a, 0x0091, + }, + }, + { // seh + "AndorraEmirados Árabes UnidosAfeganistãoAntígua e BarbudaAnguillaAlbânia" + + "ArmêniaAntilhas HolandesasAngolaArgentinaSamoa AmericanaÁustriaAustr" + + "áliaArubaAzerbaijãoBósnia-HerzegovinaBarbadosBangladeshBélgicaBurqu" + + "ina FasoBulgáriaBahrainBurundiBeninBermudasBruneiBolíviaBrasilBahama" + + "sButãoBotsuanaBelarusBelizeCanadáCongo-KinshasaRepública Centro-Afri" + + "canaCongoSuíçaCosta do MarfimIlhas CookChileRepública dos CamarõesCh" + + "inaColômbiaCosta RicaCubaCabo VerdeChipreRepública TchecaAlemanhaDji" + + "butiDinamarcaDominicaRepública DominicanaArgéliaEquadorEstôniaEgitoE" + + "ritréiaEspanhaEtiópiaFinlândiaFijiIlhas MalvinasMicronésiaFrançaGabã" + + "oReino UnidoGranadaGeórgiaGuiana FrancesaGanaGibraltarGroênlandiaGâm" + + "biaGuinéGuadalupeGuiné EquatorialGréciaGuatemalaGuamGuiné BissauGuia" + + "naHondurasCroáciaHaitiHungriaIndonésiaIrlandaIsraelÍndiaTerritório B" + + "ritânico do Oceano ÍndicoIraqueIrãIslândiaItáliaJamaicaJordâniaJapão" + + "QuêniaQuirguistãoCambojaQuiribatiComoresSão Cristovão e NevisCoréia " + + "do NorteCoréia do SulKuwaitIlhas CaimanCasaquistãoLaosLíbanoSanta Lú" + + "ciaLiechtensteinSri LankaLibériaLesotoLituâniaLuxemburgoLetôniaLíbia" + + "MarrocosMônacoMoldáviaMadagascarIlhas MarshallMacedôniaMaliMianmarMo" + + "ngóliaIlhas Marianas do NorteMartinicaMauritâniaMontserratMaltaMaurí" + + "cioMaldivasMalawiMéxicoMalásiaMoçambiqueNamíbiaNova CaledôniaNígerIl" + + "has NorfolkNigériaNicaráguaHolandaNoruegaNepalNauruNiueNova Zelândia" + + "OmãPanamáPeruPolinésia FrancesaPapua-Nova GuinéFilipinasPaquistãoPol" + + "ôniaSaint Pierre e MiquelonPitcairnPorto RicoTerritório da Palestin" + + "aPortugalPalauParaguaiCatarReuniãoRomêniaRússiaRuandaArábia SauditaI" + + "lhas SalomãoSeychellesSudãoSuéciaCingapuraSanta HelenaEslovêniaEslov" + + "áquiaSerra LeoaSan MarinoSenegalSomáliaSurinameSão Tomé e PríncipeE" + + "l SalvadorSíriaSuazilândiaIlhas Turks e CaicosChadeTogoTailândiaTadj" + + "iquistãoTokelauTimor LesteTurcomenistãoTunísiaTongaTurquiaTrinidad e" + + " TobagoTuvaluTaiwanUcrâniaUgandaEstados UnidosUruguaiUzbequistãoVati" + + "canoSão Vicente e GranadinasVenezuelaIlhas Virgens BritânicasIlhas V" + + "irgens dos EUAVietnãVanuatuWallis e FutunaSamoaIêmenMayotteÁfrica do" + + " SulZâmbiaZimbábue", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x001e, 0x002a, 0x003c, 0x0044, 0x004c, + 0x0054, 0x0067, 0x006d, 0x006d, 0x0076, 0x0085, 0x008d, 0x0097, + 0x009c, 0x009c, 0x00a7, 0x00ba, 0x00c2, 0x00cc, 0x00d4, 0x00e1, + 0x00ea, 0x00f1, 0x00f8, 0x00fd, 0x00fd, 0x0105, 0x010b, 0x0113, + 0x0113, 0x0119, 0x0120, 0x0126, 0x0126, 0x012e, 0x0135, 0x013b, + 0x0142, 0x0142, 0x0150, 0x016a, 0x016f, 0x0176, 0x0185, 0x018f, + 0x0194, 0x01ac, 0x01b1, 0x01ba, 0x01ba, 0x01c4, 0x01c8, 0x01d2, + 0x01d2, 0x01d2, 0x01d8, 0x01e9, 0x01f1, 0x01f1, 0x01f8, 0x0201, + // Entry 40 - 7F + 0x0209, 0x021e, 0x0226, 0x0226, 0x022d, 0x0235, 0x023a, 0x023a, + 0x0243, 0x024a, 0x0252, 0x0252, 0x025c, 0x0260, 0x026e, 0x0279, + 0x0279, 0x0280, 0x0286, 0x0291, 0x0298, 0x02a0, 0x02af, 0x02af, + 0x02b3, 0x02bc, 0x02c8, 0x02cf, 0x02d5, 0x02de, 0x02ef, 0x02f6, + 0x02f6, 0x02ff, 0x0303, 0x0310, 0x0316, 0x0316, 0x0316, 0x031e, + 0x0326, 0x032b, 0x0332, 0x0332, 0x033c, 0x0343, 0x0349, 0x0349, + 0x034f, 0x0377, 0x037d, 0x0381, 0x038a, 0x0391, 0x0391, 0x0398, + 0x03a1, 0x03a7, 0x03ae, 0x03ba, 0x03c1, 0x03ca, 0x03d1, 0x03e8, + // Entry 80 - BF + 0x03f8, 0x0406, 0x040c, 0x0418, 0x0424, 0x0428, 0x042f, 0x043b, + 0x0448, 0x0451, 0x0459, 0x045f, 0x0468, 0x0472, 0x047a, 0x0480, + 0x0488, 0x048f, 0x0498, 0x0498, 0x0498, 0x04a2, 0x04b0, 0x04ba, + 0x04be, 0x04c5, 0x04ce, 0x04ce, 0x04e5, 0x04ee, 0x04f9, 0x0503, + 0x0508, 0x0511, 0x0519, 0x051f, 0x0526, 0x052e, 0x0539, 0x0541, + 0x0550, 0x0556, 0x0563, 0x056b, 0x0575, 0x057c, 0x0583, 0x0588, + 0x058d, 0x0591, 0x059f, 0x05a3, 0x05aa, 0x05ae, 0x05c1, 0x05d2, + 0x05db, 0x05e5, 0x05ed, 0x0604, 0x060c, 0x0616, 0x062e, 0x0636, + // Entry C0 - FF + 0x063b, 0x0643, 0x0648, 0x0648, 0x0650, 0x0658, 0x0658, 0x065f, + 0x0665, 0x0674, 0x0682, 0x068c, 0x0692, 0x0699, 0x06a2, 0x06ae, + 0x06b8, 0x06b8, 0x06c3, 0x06cd, 0x06d7, 0x06de, 0x06e6, 0x06ee, + 0x06ee, 0x0704, 0x070f, 0x070f, 0x0715, 0x0721, 0x0721, 0x0735, + 0x073a, 0x073a, 0x073e, 0x0748, 0x0755, 0x075c, 0x0767, 0x0775, + 0x077d, 0x0782, 0x0789, 0x079a, 0x07a0, 0x07a6, 0x07a6, 0x07ae, + 0x07b4, 0x07b4, 0x07c2, 0x07c9, 0x07d5, 0x07dd, 0x07f6, 0x07ff, + 0x0818, 0x082d, 0x0834, 0x083b, 0x084a, 0x084f, 0x084f, 0x0855, + // Entry 100 - 13F + 0x085c, 0x086a, 0x0871, 0x087a, + }, + }, + { // ses + "AndooraLaaraw Imaarawey MarganteyAfgaanistanAntigua nda BarbuudaAngiiyaA" + + "lbaaniArmeeniHollandu Antiiyey LabooAngoolaArgentineAmeriki SamoaOtr" + + "išiOstraaliAruubaAzerbaayijaŋBosni nda HerzegovineBarbaadosBangladeš" + + "iBelgiikiBurkina fasoBulgaariBahareenBurundiBeniŋBermudaBruuneeBooli" + + "viBreezilBahamasBuutaŋBotswaanaBilorišiBeliiziKanaadaKongoo demookar" + + "atiki labooCentraafriki koyraKongooSwisuKudwarKuuk gungeyŠiiliKameru" + + "unŠiinKolombiKosta rikaKuubaKapuver gungeyŠiipurCek laboAlmaaɲeJibuu" + + "tiDanemarkDoominikiDoominiki labooAlžeeriEkwateerEstooniMisraEritree" + + "EspaaɲeEcioopiFinlanduFijiKalkan gungeyMikroneziFaransiGaabonAlbaasa" + + "laama MargantaGrenaadaGorgiFaransi GuyaanGaanaGibraltarGrinlandGambi" + + "GineGwadeluupGinee EkwatorialGreeceGwatemaalaGuamGine-BissoGuyaaneHo" + + "ndurasKrwaasiHaitiHungaariIndoneeziIrlanduIsrayelIndu labooBritiši I" + + "ndu teekoo laamaIraakIraanAycelandItaaliJamaayikUrdunJaapoŋKeeniyaKy" + + "rgyzstanKamboogiKiribaatiKomoorSeŋ Kitts nda NevisKooree, GurmaKoore" + + "e, HawsaKuweetKayman gungeyKaazakstanLaawosLubnaanSeŋ LussiaLiechten" + + "steinSrilankaLiberiaLeesotoLituaaniLuxembourgLetooniLiibiMaarokMonak" + + "oMoldoviMadagascarMaršal gungeyMaacedooniMaaliMaynamarMongooliMarian" + + "a Gurma GungeyMartiniikiMooritaaniMontserratMaltaMooris gungeyMaldii" + + "vuMalaawiMexikiMaleeziMozambikNaamibiKaaledooni TaagaaNižerNorfolk G" + + "ungooNaajiriiaNikaragwaHollanduNorveejNeepalNauruNiueZeelandu TaagaO" + + "maanPanamaPeeruFaransi PolineeziPapua Ginee TaagaFilipinePaakistanPo" + + "loɲeSeŋ Piyer nda MikelonPitikarinPorto RikoPalestine Dangay nda Gaa" + + "zaPortugaalPaluParaguweyKataarReenioŋRumaaniIriši labooRwandaSaudiya" + + "Solomon GungeySeešelSuudaŋSweedeSingapurSeŋ HelenaSloveeniSlovaakiSe" + + "era LeonSan MarinoSenegalSomaaliSurinaamSao Tome nda PrinsipeSalvado" + + "r labooSuuriaSwazilandTurk nda Kayikos GungeyCaaduTogoTaayilandTaaži" + + "kistanTokelauTimoor hawsaTurkmenistaŋTuniziTongaTurkiTrinidad nda To" + + "baagoTuvaluTaayiwanTanzaaniUkreenUgandaAmeriki Laabu MarganteyUruguw" + + "eyUzbeekistanVaatikan LaamaSeŋvinsaŋ nda GrenadineVeneezuyeelaBritiš" + + "i Virgin gungeyAmeerik Virgin GungeyVietnaamVanautuWallis nda Futuna" + + "SamoaYamanMayootiHawsa Afriki LabooZambiZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x0021, 0x002c, 0x0040, 0x0047, 0x004e, + 0x0055, 0x006c, 0x0073, 0x0073, 0x007c, 0x0089, 0x0090, 0x0098, + 0x009e, 0x009e, 0x00ab, 0x00c0, 0x00c9, 0x00d4, 0x00dc, 0x00e8, + 0x00f0, 0x00f8, 0x00ff, 0x0105, 0x0105, 0x010c, 0x0113, 0x011a, + 0x011a, 0x0121, 0x0128, 0x012f, 0x012f, 0x0138, 0x0141, 0x0148, + 0x014f, 0x014f, 0x0169, 0x017b, 0x0181, 0x0186, 0x018c, 0x0197, + 0x019d, 0x01a5, 0x01aa, 0x01b1, 0x01b1, 0x01bb, 0x01c0, 0x01ce, + 0x01ce, 0x01ce, 0x01d5, 0x01dd, 0x01e5, 0x01e5, 0x01ec, 0x01f4, + // Entry 40 - 7F + 0x01fd, 0x020c, 0x0214, 0x0214, 0x021c, 0x0223, 0x0228, 0x0228, + 0x022f, 0x0237, 0x023e, 0x023e, 0x0246, 0x024a, 0x0257, 0x0260, + 0x0260, 0x0267, 0x026d, 0x0282, 0x028a, 0x028f, 0x029d, 0x029d, + 0x02a2, 0x02ab, 0x02b3, 0x02b8, 0x02bc, 0x02c5, 0x02d5, 0x02db, + 0x02db, 0x02e5, 0x02e9, 0x02f3, 0x02fa, 0x02fa, 0x02fa, 0x0302, + 0x0309, 0x030e, 0x0316, 0x0316, 0x031f, 0x0326, 0x032d, 0x032d, + 0x0337, 0x0351, 0x0356, 0x035b, 0x0363, 0x0369, 0x0369, 0x0371, + 0x0376, 0x037d, 0x0384, 0x038e, 0x0396, 0x039f, 0x03a5, 0x03b9, + // Entry 80 - BF + 0x03c6, 0x03d3, 0x03d9, 0x03e6, 0x03f0, 0x03f6, 0x03fd, 0x0408, + 0x0415, 0x041d, 0x0424, 0x042b, 0x0433, 0x043d, 0x0444, 0x0449, + 0x044f, 0x0455, 0x045c, 0x045c, 0x045c, 0x0466, 0x0474, 0x047e, + 0x0483, 0x048b, 0x0493, 0x0493, 0x04a7, 0x04b1, 0x04bb, 0x04c5, + 0x04ca, 0x04d7, 0x04df, 0x04e6, 0x04ec, 0x04f3, 0x04fb, 0x0502, + 0x0513, 0x0519, 0x0527, 0x0530, 0x0539, 0x0541, 0x0548, 0x054e, + 0x0553, 0x0557, 0x0565, 0x056a, 0x0570, 0x0575, 0x0586, 0x0597, + 0x059f, 0x05a8, 0x05af, 0x05c5, 0x05ce, 0x05d8, 0x05f2, 0x05fb, + // Entry C0 - FF + 0x05ff, 0x0608, 0x060e, 0x060e, 0x0616, 0x061d, 0x061d, 0x0629, + 0x062f, 0x0636, 0x0644, 0x064b, 0x0652, 0x0658, 0x0660, 0x066b, + 0x0673, 0x0673, 0x067b, 0x0685, 0x068f, 0x0696, 0x069d, 0x06a5, + 0x06a5, 0x06ba, 0x06c8, 0x06c8, 0x06ce, 0x06d7, 0x06d7, 0x06ee, + 0x06f3, 0x06f3, 0x06f7, 0x0700, 0x070c, 0x0713, 0x071f, 0x072c, + 0x0732, 0x0737, 0x073c, 0x0750, 0x0756, 0x075e, 0x0766, 0x076c, + 0x0772, 0x0772, 0x0789, 0x0791, 0x079c, 0x07aa, 0x07c3, 0x07cf, + 0x07e5, 0x07fa, 0x0802, 0x0809, 0x081a, 0x081f, 0x081f, 0x0824, + // Entry 100 - 13F + 0x082b, 0x083d, 0x0842, 0x084a, + }, + }, + { // sg + "AndôroArâbo Emirâti ÔkoFaganïta, AfganïstäanAntîgua na BarbûdaAngûîlaAlb" + + "anïiArmenïiAntîyi tî HolândeAngoläaArzantînaSamöa tî AmerîkaOtrîsiOs" + + "tralïi, SotralïiArûbaZerebaidyäan, Azerbaidyäan,Bosnïi na Herzegovîn" + + "niBarabâdaBengladêshiBêleze, BelezîkiBurkina FasoBulugarïiBahrâinaBu" + + "rundïiBenëenBeremûdaBrunêiBolivïiBrezîliBahâmasaButäanBotswanaBelarü" + + "siBelîziKanadäaKödörösêse tî Ngunuhalëzo tî kongöKödörösêse tî Bêafr" + + "îkaKongöSûîsiKôdivüäraâzûâ KûkuShilïiKamerûneShînaKolombïiKôsta Rîk" + + "aKubäaAzûâ tî Kâpo-VêreSîpriKödörösêse tî TyêkiZâmaniDibutùiiDanemêr" + + "keDömïnîkaKödörösêse tî DominîkaAlzerïiEkuatëreEstonïiKâmitâEritrëeE" + + "spânyeEtiopïiFëlândeFidyïiÂzûâ tî MälüîniMikronezïiFarânziGaböonKödö" + + "rögbïä--ÔkoGrenâdaZorzïiGüyâni tî farânziGanäaZibraltära, Zibaratära" + + "GorolândeGambïiGinëeGuadelûpuGinëe tî EkuatëreGerêsiGuatêmäläGuâmGni" + + "nëe-BisauGayânaHonduräsiKroasïiHaitïiHongirùiiÊnndonezïiIrlândeIsraë" + + "liÊnndeSêse tî Anglëe na Ngûyämä tî ÊnndeIrâkiIräanIslândeItalùiiZam" + + "aîkaZordanïiZapöonKenyäaKirigizitùaanKämbôziKiribatiKömôroSên-Krïstô" + + "fo-na-NevîsiKorëe tî BangaKorëe tî MbongoKöwêtiÂzûâ Ngundë, KaimäniK" + + "azakisitäanLùaôsiLibùaanSênt-LisïiLiechtenstein,Sirî-LankaLiberïaLes" + + "ôthoLituanïiLugzambûruLetonùiiLibïiMarôkoMonaköoMoldavùiiMadagaskär" + + "aÂzûâ MärshâlMaseduäniMalïiMyämâraMongolïiÂzûâ Märïâni tî BangaMärtï" + + "nîkiMoritanïiMonserâteMâltaMörîsiMaldîvaMalawïiMekisîkiMalezïiMözämb" + + "îkaNamibùiiFinî KaledonïiNizëreZûâ NôrfôlkoNizerïaNikaraguaHoländeN" + + "örvêziNëpâliNauruNiueFinî ZelândeOmâniPanamaPerüuPolinezïi tî farân" + + "ziPapû Finî Ginëe, PapuazïiFilipîniPakistäanPölôniSên-Pyêre na Mikel" + + "öonPitikêrniPorto RîkoSêse tî PalestîniPörtugäle, Ködörö PûraPalauP" + + "araguëeKatäraReinïonRumanïiRusïiRuandäaSaûdi ArabïiZûâ SalomöonSëysh" + + "êleSudäanSuêdeSïngäpûruSênt-HelênaSolovenïiSolovakïiSierä-LeôneSên-" + + "MarëenSenegäleSomalïiSurinämSâô Tömê na PrinsîpeSalvadöroSirïiSwäzïl" + + "ândeÂzûâ Turku na KaîkiTyâdeTogöTailândeTaazikiistäanTokelauTimôro " + + "tî TöTurkumenistäanTunizïiTongaTurukïiTrinitùee na TobagöTüvalüTâiwâ" + + "niTanzanïiUkrêniUgandäaÂLeaa-Ôko tî AmerikaUruguëeUzbekistäanLetëe t" + + "î VatikäanSên-Vensäan na âGrenadîniVenezueläaÂzôâ Viîrîggo tî Anglë" + + "eÂzûâ Virîgo tî AmerîkaVietnämVanuatüWalîsi na FutunaSamoäaYëmêniMäy" + + "ôteMbongo-AfrîkaZambïiZimbäbwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x001b, 0x0033, 0x0047, 0x0050, 0x0058, + 0x0060, 0x0074, 0x007c, 0x007c, 0x0086, 0x0099, 0x00a0, 0x00b4, + 0x00ba, 0x00ba, 0x00d7, 0x00ef, 0x00f8, 0x0104, 0x0116, 0x0122, + 0x012c, 0x0135, 0x013e, 0x0145, 0x0145, 0x014e, 0x0155, 0x015d, + 0x015d, 0x0165, 0x016e, 0x0175, 0x0175, 0x017d, 0x0186, 0x018d, + 0x0195, 0x0195, 0x01bf, 0x01dc, 0x01e2, 0x01e9, 0x01f5, 0x0202, + 0x0209, 0x0212, 0x0218, 0x0221, 0x0221, 0x022d, 0x0233, 0x0249, + 0x0249, 0x0249, 0x024f, 0x0268, 0x026f, 0x026f, 0x0278, 0x0282, + // Entry 40 - 7F + 0x028d, 0x02a9, 0x02b1, 0x02b1, 0x02ba, 0x02c2, 0x02ca, 0x02ca, + 0x02d2, 0x02da, 0x02e2, 0x02e2, 0x02eb, 0x02f2, 0x0308, 0x0313, + 0x0313, 0x031b, 0x0322, 0x0337, 0x033f, 0x0346, 0x035b, 0x035b, + 0x0361, 0x0379, 0x0383, 0x038a, 0x0390, 0x039a, 0x03ae, 0x03b5, + 0x03b5, 0x03c1, 0x03c6, 0x03d3, 0x03da, 0x03da, 0x03da, 0x03e4, + 0x03ec, 0x03f3, 0x03fd, 0x03fd, 0x0409, 0x0411, 0x0419, 0x0419, + 0x041f, 0x0449, 0x044f, 0x0455, 0x045d, 0x0465, 0x0465, 0x046d, + 0x0476, 0x047d, 0x0484, 0x0492, 0x049b, 0x04a3, 0x04ab, 0x04c5, + // Entry 80 - BF + 0x04d5, 0x04e6, 0x04ee, 0x0507, 0x0514, 0x051c, 0x0524, 0x0530, + 0x053e, 0x0549, 0x0551, 0x0559, 0x0562, 0x056d, 0x0576, 0x057c, + 0x0583, 0x058b, 0x0595, 0x0595, 0x0595, 0x05a1, 0x05b2, 0x05bc, + 0x05c2, 0x05cb, 0x05d4, 0x05d4, 0x05f0, 0x05fc, 0x0606, 0x0610, + 0x0616, 0x061e, 0x0626, 0x062e, 0x0637, 0x063f, 0x064b, 0x0654, + 0x0664, 0x066b, 0x067b, 0x0683, 0x068c, 0x0694, 0x069d, 0x06a5, + 0x06aa, 0x06ae, 0x06bc, 0x06c2, 0x06c8, 0x06ce, 0x06e5, 0x0702, + 0x070b, 0x0715, 0x071d, 0x0735, 0x073f, 0x074a, 0x075e, 0x077a, + // Entry C0 - FF + 0x077f, 0x0788, 0x078f, 0x078f, 0x0797, 0x079f, 0x079f, 0x07a5, + 0x07ad, 0x07bb, 0x07ca, 0x07d4, 0x07db, 0x07e1, 0x07ed, 0x07fa, + 0x0804, 0x0804, 0x080e, 0x081b, 0x0827, 0x0830, 0x0838, 0x0840, + 0x0840, 0x0859, 0x0863, 0x0863, 0x0869, 0x0876, 0x0876, 0x088d, + 0x0893, 0x0893, 0x0898, 0x08a1, 0x08af, 0x08b6, 0x08c5, 0x08d4, + 0x08dc, 0x08e1, 0x08e9, 0x08fe, 0x0906, 0x090f, 0x0918, 0x091f, + 0x0927, 0x0927, 0x093e, 0x0946, 0x0952, 0x0966, 0x0983, 0x098e, + 0x09ac, 0x09c8, 0x09d0, 0x09d8, 0x09e9, 0x09f0, 0x09f0, 0x09f8, + // Entry 100 - 13F + 0x0a00, 0x0a0e, 0x0a15, 0x0a1e, + }, + }, + { // shi + "ⴰⵏⴷⵓⵔⴰⵍⵉⵎⴰⵔⴰⵜⴰⴼⵖⴰⵏⵉⵙⵜⴰⵏⴰⵏⵜⵉⴳⴰ ⴷ ⴱⵔⴱⵓⴷⴰⴰⵏⴳⵉⵍⴰⴰⵍⴱⴰⵏⵢⴰⴰⵔⵎⵉⵏⵢⴰⴰⵏⵜⵉⵢ ⵏ ⵀⵓⵍⴰⵏⴷ" + + "ⴰⴰⵏⴳⵓⵍⴰⴰⵔⵊⴰⵏⵜⵉⵏⵙⴰⵎⵡⴰ ⵜⴰⵎⵉⵔⵉⴽⴰⵏⵉⵜⵏⵏⵎⵙⴰⵓⵙⵜⵔⴰⵍⵢⴰⴰⵔⵓⴱⴰⴰⴷⵔⴰⴱⵉⵊⴰⵏⴱⵓⵙⵏⴰ ⴷ" + + " ⵀⵉⵔⵙⵉⴽⴱⴰⵔⴱⴰⴷⴱⴰⵏⴳⵍⴰⴷⵉⵛⴱⵍⵊⵉⴽⴰⴱⵓⵔⴽⵉⵏⴰ ⴼⴰⵙⵓⴱⵍⵖⴰⵔⵢⴰⴱⵃⵔⴰⵢⵏⴱⵓⵔⵓⵏⴷⵉⴱⵉⵏⵉⵏⴱⵔⵎ" + + "ⵓⴷⴰⴱⵔⵓⵏⵉⴱⵓⵍⵉⴼⵢⴰⴱⵔⴰⵣⵉⵍⴱⴰⵀⴰⵎⴰⵙⴱⵀⵓⵜⴰⵏⴱⵓⵜⵙⵡⴰⵏⴰⴱⵉⵍⴰⵔⵓⵙⵢⴰⴱⵉⵍⵉⵣⴽⴰⵏⴰⴷⴰⵜⴰⴳⴷ" + + "ⵓⴷⴰⵏⵜ ⵜⴰⴷⵉⵎⵓⵇⵔⴰⵜⵉⵜ ⵏ ⴽⵓⵏⴳⵓⵜⴰⴳⴷⵓⴷⴰⵏⵜ ⵜⴰⵏⴰⵎⵎⴰⵙⵜ ⵏ ⵉⴼⵔⵉⵇⵢⴰⴽⵓⵏⴳⵓⵙⵡⵉⵙⵔⴰ" + + "ⴽⵓⵜ ⴷⵉⴼⵡⴰⵔⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⴽⵓⴽⵛⵛⵉⵍⵉⴽⴰⵎⵉⵔⵓⵏⵛⵛⵉⵏⵡⴰⴽⵓⵍⵓⵎⴱⵢⴰⴽⵓⵙⵜⴰ ⵔⵉⴽⴰⴽⵓⴱⴰⵜⵉ" + + "ⴳⵣⵉⵔⵉⵏ ⵏ ⴽⴰⴱⴱⵉⵔⴷⵉⵇⵓⴱⵔⵓⵙⵜⴰⴳⴷⵓⴷⴰⵏⵜ ⵜⴰⵜⵛⵉⴽⵉⵜⴰⵍⵎⴰⵏⵢⴰⴷⵊⵉⴱⵓⵜⵉⴷⴰⵏⵎⴰⵔⴽⴷⵓⵎⵉ" + + "ⵏⵉⴽⵜⴰⴳⴷⵓⴷⴰⵏⵜ ⵜⴰⴷⵓⵎⵉⵏⵉⴽⵜⴷⵣⴰⵢⵔⵉⴽⵡⴰⴷⵓⵔⵉⵙⵜⵓⵏⵢⴰⵎⵉⵚⵕⵉⵔⵉⵜⵉⵔⵢⴰⵙⴱⴰⵏⵢⴰⵉⵜⵢⵓⴱⵢ" + + "ⴰⴼⵉⵍⵍⴰⵏⴷⴰⴼⵉⴷⵊⵉⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵎⴰⵍⴰⵡⵉⵎⵉⴽⵔⵓⵏⵉⵣⵢⴰⴼⵔⴰⵏⵙⴰⴳⴰⴱⵓⵏⵜⴰⴳⵍⴷⵉⵜ ⵉⵎⵓⵏⵏⵖ" + + "ⵔⵏⴰⵟⴰⵊⵓⵔⵊⵢⴰⴳⵡⵉⵢⴰⵏ ⵜⴰⴼⵔⴰⵏⵙⵉⵙⵜⵖⴰⵏⴰⴰⴷⵔⴰⵔ ⵏ ⵟⴰⵕⵉⵇⴳⵔⵉⵍⴰⵏⴷⴳⴰⵎⴱⵢⴰⵖⵉⵏⵢⴰⴳⵡⴰ" + + "ⴷⴰⵍⵓⴱⵖⵉⵏⵢⴰ ⵏ ⵉⴽⵡⴰⴷⵓⵔⵍⵢⵓⵏⴰⵏⴳⵡⴰⵜⵉⵎⴰⵍⴰⴳⵡⴰⵎⵖⵉⵏⵢⴰ ⴱⵉⵙⴰⵡⴳⵡⵉⵢⴰⵏⴰⵀⵓⵏⴷⵓⵔⴰⵙⴽ" + + "ⵔⵡⴰⵜⵢⴰⵀⴰⵢⵜⵉⵀⵏⵖⴰⵔⵢⴰⴰⵏⴷⵓⵏⵉⵙⵢⴰⵉⵔⵍⴰⵏⴷⴰⵉⵙⵔⴰⵢⵉⵍⵍⵀⵉⵏⴷⵜⴰⵎⵏⴰⴹⵜ ⵜⴰⵏⴳⵍⵉⵣⵉⵜ ⵏ " + + "ⵓⴳⴰⵔⵓ ⴰⵀⵉⵏⴷⵉⵍⵄⵉⵔⴰⵇⵉⵔⴰⵏⵉⵙⵍⴰⵏⴷⵉⵟⴰⵍⵢⴰⵊⴰⵎⴰⵢⴽⴰⵍⵓⵔⴷⵓⵏⵍⵢⴰⴱⴰⵏⴽⵉⵏⵢⴰⴽⵉⵔⵖⵉⵣⵉⵙ" + + "ⵜⴰⵏⴽⴰⵎⴱⵓⴷⵢⴰⴽⵉⵔⵉⴱⴰⵜⵉⵇⵓⵎⵓⵔⵙⴰⵏⴽⵔⵉⵙ ⴷ ⵏⵉⴼⵉⵙⴽⵓⵔⵢⴰ ⵏ ⵉⵥⵥⵍⵎⴹⴽⵓⵔⵢⴰ ⵏ ⵉⴼⴼⵓⵙ" + + "ⵍⴽⵡⵉⵜⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⴽⴰⵢⵎⴰⵏⴽⴰⵣⴰⵅⵙⵜⴰⵏⵍⴰⵡⵙⵍⵓⴱⵏⴰⵏⵙⴰⵏⵜⵍⵓⵙⵉⵍⵉⴽⵉⵏⵛⵜⴰⵢⵏⵙⵔⵉⵍⴰⵏⴽ" + + "ⴰⵍⵉⴱⵉⵔⵢⴰⵍⵉⵚⵓⵟⵓⵍⵉⵜⵡⴰⵏⵢⴰⵍⵓⴽⵙⴰⵏⴱⵓⵔⴳⵍⴰⵜⴼⵢⴰⵍⵉⴱⵢⴰⵍⵎⵖⵔⵉⴱⵎⵓⵏⴰⴽⵓⵎⵓⵍⴷⵓⴼⵢⴰⵎⴰⴷ" + + "ⴰⵖⴰⵛⵇⴰⵔⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵎⴰⵔⵛⴰⵍⵎⴰⵙⵉⴷⵓⵏⵢⴰⵎⴰⵍⵉⵎⵢⴰⵏⵎⴰⵔⵎⵏⵖⵓⵍⵢⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵎⴰⵔⵢ" + + "ⴰⵏ ⵏ ⵉⵥⵥⵍⵎⴹⵎⴰⵔⵜⵉⵏⵉⴽⵎⵓⵕⵉⵟⴰⵏⵢⴰⵎⵓⵏⵙⵉⵔⴰⵜⵎⴰⵍⵟⴰⵎⵓⵔⵉⵙⵎⴰⵍⴷⵉⴼⵎⴰⵍⴰⵡⵉⵎⵉⴽⵙⵉⴽⵎⴰ" + + "ⵍⵉⵣⵢⴰⵎⵓⵣⵏⴱⵉⵇⵏⴰⵎⵉⴱⵢⴰⴽⴰⵍⵉⴷⵓⵏⵢⴰ ⵜⴰⵎⴰⵢⵏⵓⵜⵏⵏⵉⵊⵉⵔⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵏⵓⵔⴼⵓⵍⴽⵏⵉⵊⵉⵔ" + + "ⵢⴰⵏⵉⴽⴰⵔⴰⴳⵡⴰⵀⵓⵍⴰⵏⴷⴰⵏⵏⵔⵡⵉⵊⵏⵉⴱⴰⵍⵏⴰⵡⵔⵓⵏⵉⵡⵉⵏⵢⵓⵣⵉⵍⴰⵏⴷⴰⵄⵓⵎⴰⵏⴱⴰⵏⴰⵎⴰⴱⵉⵔⵓⴱⵓⵍ" + + "ⵉⵏⵉⵣⵢⴰ ⵜⴰⴼⵔⴰⵏⵙⵉⵙⵜⴱⴰⴱⵡⴰ ⵖⵉⵏⵢⴰ ⵜⴰⵎⴰⵢⵏⵓⵜⴼⵉⵍⵉⴱⴱⵉⵏⴱⴰⴽⵉⵙⵜⴰⵏⴱⵓⵍⵓⵏⵢⴰⵙⴰⵏⴱⵢⵉ" + + "ⵔ ⴷ ⵎⵉⴽⵍⵓⵏⴱⵉⵜⴽⴰⵢⵔⵏⴱⵓⵔⵜⵓ ⵔⵉⴽⵓⴰⴳⵎⵎⴰⴹ ⵏ ⵜⴰⴳⵓⵜ ⴷ ⵖⵣⵣⴰⴱⵕⵟⵇⵉⵣⴱⴰⵍⴰⵡⴱⴰⵔⴰⴳⵡ" + + "ⴰⵢⵇⴰⵜⴰⵔⵔⵉⵢⵓⵏⵢⵓⵏⵔⵓⵎⴰⵏⵢⴰⵔⵓⵙⵢⴰⵔⵡⴰⵏⴷⴰⵙⵙⴰⵄⵓⴷⵉⵢⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵙⴰⵍⵓⵎⴰⵏⵙⵙⵉⵛⵉⵍ" + + "ⵙⵙⵓⴷⴰⵏⵙⵙⵡⵉⴷⵙⵏⵖⴰⴼⵓⵔⴰⵙⴰⵏⵜⵉⵍⵉⵏⵙⵍⵓⴼⵉⵏⵢⴰⵙⵍⵓⴼⴰⴽⵢⴰⵙⵙⵉⵔⴰⵍⵢⵓⵏⵙⴰⵏⵎⴰⵔⵉⵏⵓⵙⵙⵉⵏⵉ" + + "ⴳⴰⵍⵚⵚⵓⵎⴰⵍⵙⵓⵔⵉⵏⴰⵎⵙⴰⵡⵟⵓⵎⵉ ⴷ ⴱⵔⴰⵏⵙⵉⴱⵙⴰⵍⴼⴰⴷⵓⵔⵙⵓⵔⵢⴰⵙⵡⴰⵣⵉⵍⴰⵏⴷⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ" + + " ⵜⵓⵔⴽⵢⴰ ⴷ ⴽⴰⵢⴽⵜⵛⴰⴷⵟⵓⴳⵓⵟⴰⵢⵍⴰⵏⴷⵜⴰⴷⵊⴰⴽⵉⵙⵜⴰⵏⵟⵓⴽⵍⴰⵡⵜⵉⵎⵓⵔ ⵏ ⵍⵇⴱⵍⵜⵜⵓⵔⴽⵎⴰⵏⵙⵜ" + + "ⴰⵏⵜⵓⵏⵙⵟⵓⵏⴳⴰⵜⵓⵔⴽⵢⴰⵜⵔⵉⵏⵉⴷⴰⴷ ⴷ ⵟⵓⴱⴰⴳⵓⵜⵓⴼⴰⵍⵓⵟⴰⵢⵡⴰⵏⵟⴰⵏⵥⴰⵏⵢⴰⵓⴽⵔⴰⵏⵢⴰⵓⵖⴰⵏⴷ" + + "ⴰⵉⵡⵓⵏⴰⴽ ⵎⵓⵏⵏⵉⵏ ⵏ ⵎⵉⵔⵉⴽⴰⵏⵓⵔⵓⴳⵡⴰⵢⵓⵣⴱⴰⴽⵉⵙⵜⴰⵏⴰⵡⴰⵏⴽ ⵏ ⴼⴰⵜⵉⴽⴰⵏⵙⴰⵏⴼⴰⵏⵙⴰⵏ " + + "ⴷ ⴳⵔⵉⵏⴰⴷⵉⵏⴼⵉⵏⵣⵡⵉⵍⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵜⵉⵎⴳⴰⴷ ⵏ ⵏⵏⴳⵍⵉⵣⵜⵉⴳⵣⵉⵔⵉⵏ ⵜⵉⵎⴳⴰⴷ ⵏ ⵉⵡⵓⵏⴰⴽ" + + " ⵎⵓⵏⵏⵉⵏⴼⵉⵜⵏⴰⵎⴼⴰⵏⵡⴰⵟⵓⵡⴰⵍⵉⵙ ⴷ ⴼⵓⵜⵓⵏⴰⵙⴰⵎⵡⴰⵢⴰⵎⴰⵏⵎⴰⵢⵓⵟⴰⴼⵔⵉⵇⵢⴰ ⵏ ⵉⴼⴼⵓⵙⵣⴰⵎⴱ" + + "ⵢⴰⵣⵉⵎⴱⴰⴱⵡⵉ", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0012, 0x0027, 0x0045, 0x006e, 0x0080, 0x0095, + 0x00aa, 0x00d3, 0x00e5, 0x00e5, 0x00fd, 0x012e, 0x013d, 0x0155, + 0x0164, 0x0164, 0x017f, 0x01a5, 0x01b7, 0x01d2, 0x01e4, 0x0206, + 0x021b, 0x022d, 0x0242, 0x0251, 0x0251, 0x0263, 0x0272, 0x0287, + 0x0287, 0x0299, 0x02ae, 0x02c0, 0x02c0, 0x02d8, 0x02f3, 0x0302, + 0x0314, 0x0314, 0x0368, 0x03b9, 0x03c8, 0x03da, 0x03f6, 0x041c, + 0x042b, 0x0440, 0x0452, 0x046a, 0x046a, 0x0486, 0x0492, 0x04c7, + 0x04c7, 0x04c7, 0x04d9, 0x050d, 0x0522, 0x0522, 0x0537, 0x054c, + // Entry 40 - 7F + 0x0561, 0x059b, 0x05aa, 0x05aa, 0x05bf, 0x05d4, 0x05e0, 0x05e0, + 0x05f8, 0x060a, 0x061f, 0x061f, 0x0637, 0x0646, 0x0675, 0x0693, + 0x0693, 0x06a5, 0x06b4, 0x06d9, 0x06eb, 0x06fd, 0x072e, 0x072e, + 0x073a, 0x075d, 0x0772, 0x0784, 0x0793, 0x07ab, 0x07d4, 0x07e6, + 0x07e6, 0x0801, 0x080d, 0x082c, 0x0841, 0x0841, 0x0841, 0x0859, + 0x086e, 0x087d, 0x0892, 0x0892, 0x08ad, 0x08c2, 0x08d7, 0x08d7, + 0x08e6, 0x093e, 0x0950, 0x095c, 0x096e, 0x0980, 0x0980, 0x0995, + 0x09a7, 0x09b9, 0x09c8, 0x09e9, 0x0a01, 0x0a19, 0x0a28, 0x0a51, + // Entry 80 - BF + 0x0a77, 0x0a9a, 0x0aa9, 0x0ad8, 0x0af3, 0x0aff, 0x0b11, 0x0b29, + 0x0b47, 0x0b5f, 0x0b74, 0x0b86, 0x0b9e, 0x0bbc, 0x0bce, 0x0bdd, + 0x0bef, 0x0c01, 0x0c19, 0x0c19, 0x0c19, 0x0c37, 0x0c66, 0x0c81, + 0x0c8d, 0x0ca2, 0x0cb7, 0x0cb7, 0x0cfd, 0x0d15, 0x0d30, 0x0d48, + 0x0d57, 0x0d66, 0x0d78, 0x0d8a, 0x0d9c, 0x0db1, 0x0dc6, 0x0ddb, + 0x0e0f, 0x0e21, 0x0e53, 0x0e68, 0x0e83, 0x0e98, 0x0eaa, 0x0eb9, + 0x0ec8, 0x0ed4, 0x0ef2, 0x0f01, 0x0f13, 0x0f1f, 0x0f59, 0x0f91, + 0x0fa9, 0x0fc1, 0x0fd6, 0x1002, 0x101a, 0x1036, 0x106d, 0x107f, + // Entry C0 - FF + 0x108e, 0x10a6, 0x10b5, 0x10b5, 0x10cd, 0x10e2, 0x10e2, 0x10f1, + 0x1103, 0x111e, 0x1150, 0x1162, 0x1174, 0x1183, 0x119b, 0x11b3, + 0x11cb, 0x11cb, 0x11e3, 0x11fe, 0x1219, 0x1231, 0x1243, 0x1258, + 0x1258, 0x1287, 0x129f, 0x129f, 0x12ae, 0x12cc, 0x12cc, 0x130c, + 0x1318, 0x1318, 0x1324, 0x1339, 0x135a, 0x136c, 0x138f, 0x13b0, + 0x13bc, 0x13cb, 0x13dd, 0x140c, 0x141e, 0x1430, 0x1448, 0x145d, + 0x146f, 0x146f, 0x14ae, 0x14c3, 0x14e1, 0x150a, 0x1542, 0x155a, + 0x159c, 0x15f1, 0x1603, 0x1618, 0x163e, 0x164d, 0x164d, 0x165c, + // Entry 100 - 13F + 0x166b, 0x1694, 0x16a6, 0x16be, + }, + }, + { // shi-Latn + "anduralimaratafɣanistanantiga d brbudaangilaalbanyaarminyaantiy n huland" + + "aangulaarjantinsamwa tamirikanitnnmsaustralyaarubaadrabijanbusna d h" + + "irsikbarbadbangladicbljikaburkina fasublɣarabḥraynburundibininbrmuda" + + "brunibulibyabrazilbahamasbhutanbutswanabilarusyabilizkanadatagdudant" + + " tadimukratit n Kongotagdudant tanammast n ifriqyakunguswisrakut dif" + + "wartigzirin n kukccilikamirunccinwaculumbyakusta rikakubatigzirin n " + + "kabbirdiqubrustagdudant tatcikitalmanyadjibutidanmarkduminiktagdudan" + + "t taduminiktdzayrikwaduristunyamiṣṛiritiryasbanyaityubyafillandafidj" + + "itigzirin n malawimikrunizyafransagabuntagldit imunnɣrnaṭajurjyagwiy" + + "an tafransistɣanaadrar n ṭaṛiqgrilandgambyaɣinyagwadalubɣinya n ikwa" + + "durlyunangwatimalagwamɣinya bisawgwiyanahunduraskrwatyahaytihnɣaryaa" + + "ndunisyairlandaisrayillhindtamnaḍt tanglizit n ugaru ahindilɛiraqira" + + "nislandiṭalyajamaykalurdunlyabankinyakirɣizistankambudyakiribaticumu" + + "rsankris d nifiskurya n iẓẓlmḍkurya n iffuslkwittigzirin n kaymankaz" + + "axstanlawslubnansantlusilikinctaynsrilankalibiryaliṣuṭulitwanyaluksa" + + "nburglatfyalibyalmɣribmunakumuldufyamadaɣacqartigzirin n marcalmasid" + + "unyamalimyanmarmnɣulyatigzirin n maryan n iẓẓlmḍmartinikmuṛiṭanyamun" + + "siratmalṭamurismaldifmalawimiksikmalizyamuznbiqnamibyakalidunya tama" + + "ynutnnijirtigzirin n nurfulknijiryanikaragwahulandannrwijnibalnawrun" + + "iwinyuzilandaɛumanbanamabirubulinizya tafransistbabwa ɣinya tamaynut" + + "filibbinbakistanbulunyasanbyir d miklunbitkayrnburtu rikuagmmaḍ n ta" + + "gut d ɣzzabṛṭqizbalawbaragwayqatarriyunyunrumanyarusyarwandassaɛudiy" + + "atigzirin n salumanssicilssudansswidsnɣafurasantilinslufinyaslufakya" + + "ssiralyunsanmarinussinigalṣṣumalsurinamsawṭumi d bransibsalfadursury" + + "aswazilandatigzirin n turkya d kayktcadṭuguṭaylandtadjakistanṭuklawt" + + "imur n lqbltturkmanstantunsṭungaturkyatrinidad d ṭubagutufaluṭaywanṭ" + + "anẓanyaukranyauɣandaiwunak munnin n mirikanurugwayuzbakistanawank n " + + "fatikansanfansan d grinadinfinzwilatigzirin timgad n nngliztigzirin " + + "timgad n iwunak munninfitnamfanwaṭuwalis d futunasamwayamanmayuṭafri" + + "qya n iffuszambyazimbabwi", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x000d, 0x0018, 0x0027, 0x002d, 0x0034, + 0x003b, 0x004a, 0x0050, 0x0050, 0x0058, 0x0069, 0x006e, 0x0076, + 0x007b, 0x007b, 0x0084, 0x0092, 0x0098, 0x00a1, 0x00a7, 0x00b3, + 0x00ba, 0x00c2, 0x00c9, 0x00ce, 0x00ce, 0x00d4, 0x00d9, 0x00e0, + 0x00e0, 0x00e6, 0x00ed, 0x00f3, 0x00f3, 0x00fb, 0x0104, 0x0109, + 0x010f, 0x010f, 0x012d, 0x014a, 0x014f, 0x0155, 0x015f, 0x016d, + 0x0172, 0x0179, 0x017f, 0x0187, 0x0187, 0x0191, 0x0195, 0x01a8, + 0x01a8, 0x01a8, 0x01ae, 0x01c0, 0x01c7, 0x01c7, 0x01ce, 0x01d5, + // Entry 40 - 7F + 0x01dc, 0x01f0, 0x01f5, 0x01f5, 0x01fc, 0x0203, 0x020b, 0x020b, + 0x0213, 0x0219, 0x0220, 0x0220, 0x0228, 0x022d, 0x023e, 0x0248, + 0x0248, 0x024e, 0x0253, 0x0260, 0x0269, 0x026f, 0x0280, 0x0280, + 0x0285, 0x0296, 0x029d, 0x02a3, 0x02a9, 0x02b1, 0x02c1, 0x02c7, + 0x02c7, 0x02d0, 0x02d4, 0x02e0, 0x02e7, 0x02e7, 0x02e7, 0x02ef, + 0x02f6, 0x02fb, 0x0303, 0x0303, 0x030c, 0x0313, 0x031a, 0x031a, + 0x031f, 0x0341, 0x0348, 0x034c, 0x0352, 0x035a, 0x035a, 0x0361, + 0x0367, 0x036d, 0x0372, 0x037e, 0x0386, 0x038e, 0x0393, 0x03a2, + // Entry 80 - BF + 0x03b6, 0x03c3, 0x03c8, 0x03d9, 0x03e2, 0x03e6, 0x03ec, 0x03f4, + 0x03fe, 0x0406, 0x040d, 0x0417, 0x041f, 0x0429, 0x042f, 0x0434, + 0x043b, 0x0441, 0x0449, 0x0449, 0x0449, 0x0454, 0x0465, 0x046e, + 0x0472, 0x0479, 0x0481, 0x0481, 0x04a1, 0x04a9, 0x04b6, 0x04be, + 0x04c5, 0x04ca, 0x04d0, 0x04d6, 0x04dc, 0x04e3, 0x04ea, 0x04f1, + 0x0503, 0x0509, 0x051b, 0x0522, 0x052b, 0x0532, 0x0538, 0x053d, + 0x0542, 0x0546, 0x0550, 0x0556, 0x055c, 0x0560, 0x0574, 0x0589, + 0x0591, 0x0599, 0x05a0, 0x05b0, 0x05b8, 0x05c2, 0x05da, 0x05e4, + // Entry C0 - FF + 0x05e9, 0x05f1, 0x05f6, 0x05f6, 0x05fe, 0x0605, 0x0605, 0x060a, + 0x0610, 0x061a, 0x062c, 0x0632, 0x0638, 0x063d, 0x0646, 0x064e, + 0x0656, 0x0656, 0x065e, 0x0667, 0x0670, 0x0678, 0x0682, 0x0689, + 0x0689, 0x069c, 0x06a4, 0x06a4, 0x06a9, 0x06b3, 0x06b3, 0x06cb, + 0x06cf, 0x06cf, 0x06d5, 0x06de, 0x06e9, 0x06f1, 0x06fe, 0x0709, + 0x070d, 0x0714, 0x071a, 0x072d, 0x0733, 0x073b, 0x0747, 0x074e, + 0x0755, 0x0755, 0x076c, 0x0773, 0x077d, 0x078c, 0x07a0, 0x07a8, + 0x07c0, 0x07df, 0x07e5, 0x07ee, 0x07fc, 0x0801, 0x0801, 0x0806, + // Entry 100 - 13F + 0x080d, 0x081c, 0x0822, 0x082a, + }, + }, + { // si + siRegionStr, + siRegionIdx, + }, + { // sk + skRegionStr, + skRegionIdx, + }, + { // sl + slRegionStr, + slRegionIdx, + }, + { // smn + "Suomâ", + []uint16{ // 77 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + // Entry 40 - 7F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, + }, + }, + { // sn + "AndoraUnited Arab EmiratesAfuganistaniAntigua ne BarbudaAnguilaAlbaniaAr" + + "meniaNetherlands AntillesAngolaAjentinaSamoa ye AmerikaAustriaAustra" + + "liaArubhaAzabajaniBoznia ne HerzegovinaBarbadosBangladeshiBeljiumBuk" + + "inafasoBulgariaBahareniBurundiBeniniBermudaBuruneiBoliviaBrazilBaham" + + "aBhutaniBotswanaBelarusiBelizeKanadaDemocratic Republic of the Congo" + + "Central African RepublicKongoSwitzerlandIvory CoastZvitsuwa zveCookC" + + "hileKameruniChinaKolombiaKostarikaCubaZvitsuwa zveCape VerdeCyprusCz" + + "ech RepublicGermanyDjiboutiDenmarkDominicaDominican RepublicAljeriaE" + + "cuadorEstoniaEgyptEritreaSpainEtiopiaFinlandFijiZvitsuwa zveFalkland" + + "sMicronesiaFranceGabonUnited KingdomGrenadaGeorgiaFrench GuianaGhana" + + "GibraltarGreenlandGambiaGuineaGuadeloupeEquatorial GuineaGreeceGuate" + + "malaGuamGuinea-BissauGuyanaHondurasKorasiaHaitiHungaryIndonesiaIrela" + + "ndIzuraeriIndiaBritish Indian Ocean TerritoryIraqIranIcelandItalyJam" + + "aicaJordanJapanKenyaKyrgyzstanKambodiaKiribatiKomoroSaint Kitts and " + + "NevisKorea, NorthKorea, SouthKuwaitZvitsuwa zveCaymanKazakhstanLaosL" + + "ebanonSaint LuciaLiechtensteinSri LankaLiberiaLesothoLithuaniaLuxemb" + + "ourgLatviaLibyaMoroccoMonacoMoldovaMadagascarZvitsuwa zveMarshallMac" + + "edoniaMaliMyanmarMongoliaZvitsuwa zvekumaodzanyemba eMarianaMartiniq" + + "ueMauritaniaMontserratMaltaMauritiusMaldivesMalawiMexicoMalaysiaMoza" + + "mbiqueNamibiaNew CaledoniaNigerChitsuwa cheNorfolkNigeriaNicaraguaNe" + + "therlandsNorwayNepalNauruNiueNew ZealandOmanPanamaPeruFrench Polynes" + + "iaPapua New GuineaPhilippinesPakistanPolandSaint Pierre and Miquelon" + + "PitcairnPuerto RicoPortugalPalauParaguayQatarRéunionRomaniaRussiaRwa" + + "ndaSaudi ArabiaZvitsuwa zvaSolomonSeychellesSudanSwedenSingaporeSain" + + "t HelenaSloveniaSlovakiaSierra LeoneSan MarinoSenegalSomaliaSuriname" + + "São Tomé and PríncipeEl SalvadorSyriaSwazilandZvitsuwa zveTurk neCai" + + "coChadiTogoThailandTajikistanTokelauEast TimorTurkmenistanTunisiaTon" + + "gaTurkeyTrinidad and TobagoTuvaluTaiwanTanzaniaUkraineUgandaAmerikaU" + + "ruguayUzbekistanVatican StateSaint Vincent and the GrenadinesVenezue" + + "laZvitsuwa zveHingirandiZvitsuwa zveAmerikaVietnamVanuatuWallis and " + + "FutunaSamoaYemenMayotteSouth AfricaZambiaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x001a, 0x0026, 0x0038, 0x003f, 0x0046, + 0x004d, 0x0061, 0x0067, 0x0067, 0x006f, 0x007f, 0x0086, 0x008f, + 0x0095, 0x0095, 0x009e, 0x00b3, 0x00bb, 0x00c6, 0x00cd, 0x00d7, + 0x00df, 0x00e7, 0x00ee, 0x00f4, 0x00f4, 0x00fb, 0x0102, 0x0109, + 0x0109, 0x010f, 0x0115, 0x011c, 0x011c, 0x0124, 0x012c, 0x0132, + 0x0138, 0x0138, 0x0158, 0x0170, 0x0175, 0x0180, 0x018b, 0x019b, + 0x01a0, 0x01a8, 0x01ad, 0x01b5, 0x01b5, 0x01be, 0x01c2, 0x01d8, + 0x01d8, 0x01d8, 0x01de, 0x01ec, 0x01f3, 0x01f3, 0x01fb, 0x0202, + // Entry 40 - 7F + 0x020a, 0x021c, 0x0223, 0x0223, 0x022a, 0x0231, 0x0236, 0x0236, + 0x023d, 0x0242, 0x0249, 0x0249, 0x0250, 0x0254, 0x0269, 0x0273, + 0x0273, 0x0279, 0x027e, 0x028c, 0x0293, 0x029a, 0x02a7, 0x02a7, + 0x02ac, 0x02b5, 0x02be, 0x02c4, 0x02ca, 0x02d4, 0x02e5, 0x02eb, + 0x02eb, 0x02f4, 0x02f8, 0x0305, 0x030b, 0x030b, 0x030b, 0x0313, + 0x031a, 0x031f, 0x0326, 0x0326, 0x032f, 0x0336, 0x033e, 0x033e, + 0x0343, 0x0361, 0x0365, 0x0369, 0x0370, 0x0375, 0x0375, 0x037c, + 0x0382, 0x0387, 0x038c, 0x0396, 0x039e, 0x03a6, 0x03ac, 0x03c1, + // Entry 80 - BF + 0x03cd, 0x03d9, 0x03df, 0x03f1, 0x03fb, 0x03ff, 0x0406, 0x0411, + 0x041e, 0x0427, 0x042e, 0x0435, 0x043e, 0x0448, 0x044e, 0x0453, + 0x045a, 0x0460, 0x0467, 0x0467, 0x0467, 0x0471, 0x0485, 0x048e, + 0x0492, 0x0499, 0x04a1, 0x04a1, 0x04c4, 0x04ce, 0x04d8, 0x04e2, + 0x04e7, 0x04f0, 0x04f8, 0x04fe, 0x0504, 0x050c, 0x0516, 0x051d, + 0x052a, 0x052f, 0x0542, 0x0549, 0x0552, 0x055d, 0x0563, 0x0568, + 0x056d, 0x0571, 0x057c, 0x0580, 0x0586, 0x058a, 0x059a, 0x05aa, + 0x05b5, 0x05bd, 0x05c3, 0x05dc, 0x05e4, 0x05ef, 0x05ef, 0x05f7, + // Entry C0 - FF + 0x05fc, 0x0604, 0x0609, 0x0609, 0x0611, 0x0618, 0x0618, 0x061e, + 0x0624, 0x0630, 0x0643, 0x064d, 0x0652, 0x0658, 0x0661, 0x066d, + 0x0675, 0x0675, 0x067d, 0x0689, 0x0693, 0x069a, 0x06a1, 0x06a9, + 0x06a9, 0x06c1, 0x06cc, 0x06cc, 0x06d1, 0x06da, 0x06da, 0x06f2, + 0x06f7, 0x06f7, 0x06fb, 0x0703, 0x070d, 0x0714, 0x071e, 0x072a, + 0x0731, 0x0736, 0x073c, 0x074f, 0x0755, 0x075b, 0x0763, 0x076a, + 0x0770, 0x0770, 0x0777, 0x077e, 0x0788, 0x0795, 0x07b5, 0x07be, + 0x07d4, 0x07e7, 0x07ee, 0x07f5, 0x0806, 0x080b, 0x080b, 0x0810, + // Entry 100 - 13F + 0x0817, 0x0823, 0x0829, 0x0831, + }, + }, + { // so + "AndoraImaaraadka Carabta ee MidoobayAfgaanistaanAntigua iyo BarbudaAngui" + + "llaAlbaaniyaArmeeniyaNetherlands AntillesAngoolaArjantiinSamowa Amee" + + "rikaAwsteriyaAwstaraaliyaArubaAzerbajaanBosniya HersigoviinaBaarbado" + + "osBangaaladheeshBiljamBurkiina FaasoBulgaariyaBaxreynBurundiBiniinBe" + + "rmuudaBuruneeyaBoliifiyaBraasiilBahaamasBhutanBotuswaanaBelarusBeliz" + + "eKanadaJamhuuriyadda Dimuquraadiga KongoJamhuuriyadda Afrikada Dhexe" + + "KongoSwiiserlaandIvory coastJaziiradda CookJiliKaameruunShiinahaKolo" + + "mbiyaKosta RiikaKuubaCape Verde IslandsQubrusJamhuuriyadda JekJarmal" + + "JabuutiDenmarkDomeenikaJamhuuriyadda DomeenikaAljeeriyaIkuwadoorEsto" + + "oniyaMasarEretereeyaIsbeynItoobiyaFinlandFijiJaziiradaha FooklaanMic" + + "ronesiaFaransiisGaaboonUnited KingdomGiriinaadaJoorjiyaFrench Guiana" + + "GaanaGibraltarGreenlandGambiyaGiniGuadeloupeEquatorial GuineaGiriigG" + + "uwaatamaalaGuamGini-BisaawGuyanaHondurasKorweeshiyaHaytiHangeriIndon" + + "eesiyaAyrlaandIsraaʼiilHindiyaBritish Indian Ocean TerritoryCiraaqIi" + + "raanIislaandTalyaaniJameykaUrdunJabaanKiiniyaKirgistaanKamboodiyaKir" + + "ibatiKomoorosSaint Kitts and NevisKuuriyada WaqooyiKuuriyada Koonfur" + + "eedKuwaytCayman IslandsKasaakhistaanLaosLubnaanSaint LuciaLiechtenst" + + "einSirilaankaLaybeeriyaLosootoLituweeniyaLuksemboorgLatfiyaLiibiyaMa" + + "rookoMoonakoMoldofaMadagaskarMarshall IslandsMakadooniyaMaaliMyanmar" + + "MongooliyaNorthern Mariana IslandsMartiniqueMuritaaniyaMontserratMaa" + + "ldaMurishiyoosMaaldiqeenMalaawiMeksikoMalaysiaMusambiigNamiibiyaNew " + + "CaledoniaNayjerNorfolk IslandNayjeeriyaNikaraaguwaNetherlandsNoorwee" + + "yNebaalNauruNiueNeyuusilaandCumaanPanamaPeruFrench PolynesiaPapua Ne" + + "w GuineaFilibiinBakistaanBoolandSaint Pierre and MiquelonPitcairnPue" + + "rto RicoFalastiin Daanka galbeed iyo QasaBortuqaalPalauParaguayQadar" + + "RéunionRumaaniyaRuushRuwandaSacuudi CarabiyaSolomon IslandsSishelisS" + + "uudaanIswidhanSingaboorSaint HelenaSloveniaSlovakiaSiraaliyoonSan Ma" + + "rinoSinigaalSoomaaliyaSurinameSão Tomé and PríncipeEl SalvadorSuuriy" + + "aIswaasilaandTurks and Caicos IslandsJaadToogoTaylaandTajikistanToke" + + "lauTimorka bariTurkmenistanTuniisiyaTongaTurkiTrinidad and TobagoTuv" + + "aluTaywaanTansaaniyaUkraynUgaandaMaraykankaUruguwaayUusbakistaanFaat" + + "ikaanSaint Vincent and the GrenadinesFenisuweelaBritish Virgin Islan" + + "dsU.S. Virgin IslandsFiyetnaamVanuatuWallis and FutunaSamoaYamanMayo" + + "tteKoonfur AfrikaSaambiyaSimbaabweFar aan la aqoon amase aan saxnayn", + []uint16{ // 261 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0024, 0x0030, 0x0043, 0x004b, 0x0054, + 0x005d, 0x0071, 0x0078, 0x0078, 0x0081, 0x0090, 0x0099, 0x00a5, + 0x00aa, 0x00aa, 0x00b4, 0x00c8, 0x00d2, 0x00e0, 0x00e6, 0x00f4, + 0x00fe, 0x0105, 0x010c, 0x0112, 0x0112, 0x011a, 0x0123, 0x012c, + 0x012c, 0x0134, 0x013c, 0x0142, 0x0142, 0x014c, 0x0153, 0x0159, + 0x015f, 0x015f, 0x0180, 0x019c, 0x01a1, 0x01ad, 0x01b8, 0x01c7, + 0x01cb, 0x01d4, 0x01dc, 0x01e5, 0x01e5, 0x01f0, 0x01f5, 0x0207, + 0x0207, 0x0207, 0x020d, 0x021e, 0x0224, 0x0224, 0x022b, 0x0232, + // Entry 40 - 7F + 0x023b, 0x0252, 0x025b, 0x025b, 0x0264, 0x026d, 0x0272, 0x0272, + 0x027c, 0x0282, 0x028a, 0x028a, 0x0291, 0x0295, 0x02a9, 0x02b3, + 0x02b3, 0x02bc, 0x02c3, 0x02d1, 0x02db, 0x02e3, 0x02f0, 0x02f0, + 0x02f5, 0x02fe, 0x0307, 0x030e, 0x0312, 0x031c, 0x032d, 0x0333, + 0x0333, 0x033f, 0x0343, 0x034e, 0x0354, 0x0354, 0x0354, 0x035c, + 0x0367, 0x036c, 0x0373, 0x0373, 0x037e, 0x0386, 0x0390, 0x0390, + 0x0397, 0x03b5, 0x03bb, 0x03c1, 0x03c9, 0x03d1, 0x03d1, 0x03d8, + 0x03dd, 0x03e3, 0x03ea, 0x03f4, 0x03fe, 0x0406, 0x040e, 0x0423, + // Entry 80 - BF + 0x0434, 0x0448, 0x044e, 0x045c, 0x0469, 0x046d, 0x0474, 0x047f, + 0x048c, 0x0496, 0x04a0, 0x04a7, 0x04b2, 0x04bd, 0x04c4, 0x04cb, + 0x04d2, 0x04d9, 0x04e0, 0x04e0, 0x04e0, 0x04ea, 0x04fa, 0x0505, + 0x050a, 0x0511, 0x051b, 0x051b, 0x0533, 0x053d, 0x0548, 0x0552, + 0x0558, 0x0563, 0x056d, 0x0574, 0x057b, 0x0583, 0x058c, 0x0595, + 0x05a2, 0x05a8, 0x05b6, 0x05c0, 0x05cb, 0x05d6, 0x05de, 0x05e4, + 0x05e9, 0x05ed, 0x05f9, 0x05ff, 0x0605, 0x0609, 0x0619, 0x0629, + 0x0631, 0x063a, 0x0641, 0x065a, 0x0662, 0x066d, 0x068e, 0x0697, + // Entry C0 - FF + 0x069c, 0x06a4, 0x06a9, 0x06a9, 0x06b1, 0x06ba, 0x06ba, 0x06bf, + 0x06c6, 0x06d6, 0x06e5, 0x06ed, 0x06f4, 0x06fc, 0x0705, 0x0711, + 0x0719, 0x0719, 0x0721, 0x072c, 0x0736, 0x073e, 0x0748, 0x0750, + 0x0750, 0x0768, 0x0773, 0x0773, 0x077a, 0x0786, 0x0786, 0x079e, + 0x07a2, 0x07a2, 0x07a7, 0x07af, 0x07b9, 0x07c0, 0x07cc, 0x07d8, + 0x07e1, 0x07e6, 0x07eb, 0x07fe, 0x0804, 0x080b, 0x0815, 0x081b, + 0x0822, 0x0822, 0x082c, 0x0835, 0x0841, 0x084a, 0x086a, 0x0875, + 0x088b, 0x089e, 0x08a7, 0x08ae, 0x08bf, 0x08c4, 0x08c4, 0x08c9, + // Entry 100 - 13F + 0x08d0, 0x08de, 0x08e6, 0x08ef, 0x0911, + }, + }, + { // sq + sqRegionStr, + sqRegionIdx, + }, + { // sr + srRegionStr, + srRegionIdx, + }, + { // sr-Latn + srLatnRegionStr, + srLatnRegionIdx, + }, + { // sv + svRegionStr, + svRegionIdx, + }, + {}, // sv-FI + { // sw + swRegionStr, + swRegionIdx, + }, + { // sw-CD + "AfuganistaniBeniniKongoKodivaaKuprosiUajemiLishenteniBukiniMyamaKisiwa c" + + "ha NorfokNijeriaTimori ya Mashariki", + []uint16{ // 231 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, + 0x000c, 0x000c, 0x000c, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, + 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, 0x0012, + 0x0012, 0x0012, 0x0012, 0x0012, 0x0017, 0x0017, 0x001e, 0x001e, + 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e, + 0x001e, 0x001e, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, + // Entry 40 - 7F + 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, + 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, + 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, + 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, + 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, + 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, 0x0025, + 0x0025, 0x0025, 0x0025, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, + 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, + // Entry 80 - BF + 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, + 0x0035, 0x0035, 0x0035, 0x0035, 0x0035, 0x003b, 0x003b, 0x003b, + 0x003b, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0051, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, + 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, + 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, + // Entry C0 - FF + 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, + 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, + 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, + 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, + 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x0058, 0x006b, + }, + }, + { // ta + taRegionStr, + taRegionIdx, + }, + { // te + teRegionStr, + teRegionIdx, + }, + { // teo + "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + + "iaAntili za UholanziAngolaAjentinaSamoa ya MarekaniAustriaAustraliaA" + + "rubaAzabajaniBosnia na HezegovinaBabadosiBangladeshiUbelgijiBukinafa" + + "soBulgariaBahareniBurundiBeniniBermudaBruneiBoliviaBraziliBahamaButa" + + "niBotswanaBelarusiBelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhur" + + "i ya Afrika ya KatiKongoUswisiKodivaaVisiwa vya CookChileKameruniChi" + + "naKolombiaKostarikaKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibut" + + "iDenmakiDominikaJamhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaH" + + "ispaniaUhabeshiUfiniFijiVisiwa vya FalklandMikronesiaUfaransaGaboniU" + + "ingerezaGrenadaJojiaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaG" + + "ineGwadelupeGinekwetaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKor" + + "asiaHaitiHungariaIndonesiaAyalandiIsraeliIndiaEneo la Uingereza kati" + + "ka Bahari HindiIrakiUajemiAislandiItaliaJamaikaYordaniJapaniKeniaKir" + + "igizistaniKambodiaKiribatiKomoroSantakitzi na NevisKorea KaskaziniKo" + + "rea KusiniKuwaitiVisiwa vya KaymanKazakistaniLaosiLebanoniSantalusia" + + "LishenteniSirilankaLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoM" + + "onakoMoldovaBukiniVisiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa" + + " vya Mariana vya KaskaziniMartinikiMoritaniaMontserratiMaltaMorisiMo" + + "divuMalawiMeksikoMalesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha " + + "NorfokNijeriaNikaragwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPan" + + "amaPeruPolinesia ya UfaransaPapuaFilipinoPakistaniPolandiSantapieri " + + "na MikeloniPitkairniPwetorikoUkingo wa Magharibi na Ukanda wa Gaza w" + + "a PalestinaUrenoPalauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiV" + + "isiwa vya SolomonShelisheliSudaniUswidiSingapooSantahelenaSloveniaSl" + + "ovakiaSiera LeoniSamarinoSenegaliSomaliaSurinamuSao Tome na Principe" + + "ElsavadoSiriaUswaziVisiwa vya Turki na KaikoChadiTogoTailandiTajikis" + + "taniTokelauTimori ya MasharikiTurukimenistaniTunisiaTongaUturukiTrin" + + "idad na TobagoTuvaluTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibe" + + "kistaniVatikaniSantavisenti na GrenadiniVenezuelaVisiwa vya Virgin v" + + "ya UingerezaVisiwa vya Virgin vya MarekaniVietinamuVanuatuWalis na F" + + "utunaSamoaYemeniMayotteAfrika KusiniZambiaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, + 0x004a, 0x005c, 0x0062, 0x0062, 0x006a, 0x007b, 0x0082, 0x008b, + 0x0090, 0x0090, 0x0099, 0x00ad, 0x00b5, 0x00c0, 0x00c8, 0x00d2, + 0x00da, 0x00e2, 0x00e9, 0x00ef, 0x00ef, 0x00f6, 0x00fc, 0x0103, + 0x0103, 0x010a, 0x0110, 0x0116, 0x0116, 0x011e, 0x0126, 0x012c, + 0x0132, 0x0132, 0x0152, 0x016b, 0x0170, 0x0176, 0x017d, 0x018c, + 0x0191, 0x0199, 0x019e, 0x01a6, 0x01a6, 0x01af, 0x01b3, 0x01bb, + 0x01bb, 0x01bb, 0x01c2, 0x01d2, 0x01db, 0x01db, 0x01e1, 0x01e8, + // Entry 40 - 7F + 0x01f0, 0x0203, 0x020a, 0x020a, 0x0210, 0x0217, 0x021c, 0x021c, + 0x0223, 0x022b, 0x0233, 0x0233, 0x0238, 0x023c, 0x024f, 0x0259, + 0x0259, 0x0261, 0x0267, 0x0270, 0x0277, 0x027c, 0x028f, 0x028f, + 0x0294, 0x029c, 0x02a5, 0x02ab, 0x02af, 0x02b8, 0x02c1, 0x02c8, + 0x02c8, 0x02d1, 0x02d5, 0x02de, 0x02e4, 0x02e4, 0x02e4, 0x02ed, + 0x02f4, 0x02f9, 0x0301, 0x0301, 0x030a, 0x0312, 0x0319, 0x0319, + 0x031e, 0x0343, 0x0348, 0x034e, 0x0356, 0x035c, 0x035c, 0x0363, + 0x036a, 0x0370, 0x0375, 0x0382, 0x038a, 0x0392, 0x0398, 0x03ab, + // Entry 80 - BF + 0x03ba, 0x03c6, 0x03cd, 0x03de, 0x03e9, 0x03ee, 0x03f6, 0x0400, + 0x040a, 0x0413, 0x041a, 0x0420, 0x0428, 0x0431, 0x0438, 0x043d, + 0x0443, 0x0449, 0x0450, 0x0450, 0x0450, 0x0456, 0x0468, 0x0471, + 0x0475, 0x047a, 0x0482, 0x0482, 0x04a2, 0x04ab, 0x04b4, 0x04bf, + 0x04c4, 0x04ca, 0x04d0, 0x04d6, 0x04dd, 0x04e4, 0x04ec, 0x04f3, + 0x04ff, 0x0505, 0x0516, 0x051d, 0x0526, 0x052e, 0x0533, 0x0539, + 0x053e, 0x0542, 0x054c, 0x0551, 0x0557, 0x055b, 0x0570, 0x0575, + 0x057d, 0x0586, 0x058d, 0x05a3, 0x05ac, 0x05b5, 0x05e7, 0x05ec, + // Entry C0 - FF + 0x05f1, 0x05f9, 0x05ff, 0x05ff, 0x0608, 0x060f, 0x060f, 0x0614, + 0x061a, 0x061f, 0x0631, 0x063b, 0x0641, 0x0647, 0x064f, 0x065a, + 0x0662, 0x0662, 0x066a, 0x0675, 0x067d, 0x0685, 0x068c, 0x0694, + 0x0694, 0x06a8, 0x06b0, 0x06b0, 0x06b5, 0x06bb, 0x06bb, 0x06d4, + 0x06d9, 0x06d9, 0x06dd, 0x06e5, 0x06f0, 0x06f7, 0x070a, 0x0719, + 0x0720, 0x0725, 0x072c, 0x073e, 0x0744, 0x074b, 0x0753, 0x075a, + 0x0760, 0x0760, 0x0768, 0x076f, 0x077b, 0x0783, 0x079c, 0x07a5, + 0x07c4, 0x07e2, 0x07eb, 0x07f2, 0x0801, 0x0806, 0x0806, 0x080c, + // Entry 100 - 13F + 0x0813, 0x0820, 0x0826, 0x082e, + }, + }, + { // th + thRegionStr, + thRegionIdx, + }, + {}, // ti + { // to + "Motu ʻAsenisiniʻAnitolaʻAlepea FakatahatahaʻAfikānisitaniAnitikua mo Pal" + + "aputaAnikuilaʻAlipaniaʻĀmeniaAnitila fakahōlaniʻAngikolaʻAnitātikaʻA" + + "senitinaHaʻamoa ʻAmelikaʻAosituliaʻAositelēliaʻAlupaʻOtumotu ʻAlaniʻ" + + "AsapaisaniPosinia mo HesikōvinaPāpeitosiPengilātesiPelesiumePekano F" + + "asoPulukaliaPaleiniPulunitiPeniniSā PatēlemiPēmutaPuluneiPolīviaKali" + + "piane fakahōlaniPalāsiliPahamaPūtaniMotu PuvetiPotisiuanaPelalusiPel" + + "iseKānataʻOtumotu KokoKongo - KinisasaLipapilika ʻAfilika LotolotoKo" + + "ngo - PalasavilaSuisilaniMatafonua ʻAivolīʻOtumotu KukiSiliKameluniS" + + "iainaKolomipiaMotu KilipatoniKosita LikaKiupaMuiʻi VēteKulasaoMotu K" + + "ilisimasiSaipalesiLipapilika SekiSiamaneTieko KāsiaSiputiTenimaʻakeT" + + "ominikaLipapilika TominikaʻAisiliaSiuta mo MelilaʻEkuetoaʻEsitōniaʻI" + + "sipiteSahala fakahihifoʻElituliaSipeiniʻĪtiōpiaʻIulope fakatahatahaF" + + "inilaniFisiʻOtumotu FokulaniMikolonīsiaʻOtumotu FaloeFalanisēKaponiP" + + "ilitāniaKelenatāSeōsiaKuiana fakafalanisēKuenisīKanaSipalālitāKulini" + + "laniKamipiaKiniKuatalupeʻEkueta KiniKalisiʻOtumotu Seōsia-tonga mo S" + + "aniuisi-tongaKuatamalaKuamuKini-PisauKuianaHongi Kongi SAR SiainaʻOt" + + "umotu Heati mo MakitonaliHonitulasiKuloisiaHaitiHungakaliaʻOtumotu K" + + "aneliʻInitonēsiaʻAealaniʻIsileliMotu ManiʻInitiaPotu fonua moana ʻIn" + + "itia fakapilitāniaʻIlaakiʻIlaaniʻAisilaniʻĪtaliSelusīSamaikaSoataneS" + + "iapaniKeniāKīkisitaniKamipōtiaKilipasiKomolosiSā Kitisi mo NevisiKōl" + + "ea tokelauKōlea tongaKueitiʻOtumotu KeimeniKasakitaniLauLepanoniSā L" + + "ūsiaLikitenisiteiniSīlangikāLaipeliaLesotoLituaniaLakisimipekiLativ" + + "iaLīpiaMolokoMonakoMolotovaMonitenikaloSā Mātini (fakafalanisē)Matak" + + "asikaʻOtumotu MāsoloMasetōniaMāliPemaMongokōliaMakau SAR SiainaʻOtum" + + "otu Maliana tokelauMātenikiMauliteniaMoʻungaselatiMalitaMaulitiusiMa" + + "lativisiMalauiMekisikouMalēsiaMosēmipikiNamipiaNiu KaletōniaNisiaMot" + + "u NōfolikiNaisiliaNikalakuaHōlaniNoauēNepaliNauluNiuēNuʻusilaʻOmaniP" + + "anamāPelūPolinisia fakafalanisēPapuaniukiniFilipainiPākisitaniPolani" + + "Sā Piea mo MikeloniʻOtumotu PitikeniPueto LikoPotu PalesitainePotuka" + + "liPalauPalakuaiKatāʻOsēnia mamaʻoLēunioniLomēniaSēpiaLūsiaLuanitāSau" + + "te ʻAlepeaʻOtumotu SolomoneʻOtumotu SeiseliSūteniSuēteniSingapoaSā H" + + "elenaSilōveniaSivolopāti mo Sani MaieniSilōvakiaSiela LeoneSā Malino" + + "SenekaloSōmaliaSulinameSūtani fakatongaSao Tomē mo PilinisipeʻEle Sa" + + "lavatoaSā Mātini (fakahōlani)SīliaSuasilaniTulisiteni ta KunuhaʻOtum" + + "otu Tuki mo KaikosiSātiPotu fonua tonga fakafalanisēTokoTailaniTasik" + + "itaniTokelauTimoa hahakeTūkimenisitaniTunīsiaTongaToakeTilinitati mo" + + " TopakoTūvaluTaiuaniTenisāniaʻŪkalaʻineʻIukanitāʻOtumotu siʻi ʻo ʻAm" + + "elikaPuleʻanga fakatahataha ʻAmelikaʻUlukuaiʻUsipekitaniKolo Vatikan" + + "iSā Viniseni mo KulenatiniVenesuelaʻOtumotu Vilikini fakapilitāniaʻO" + + "tumotu Vilikini fakaʻamelikaVietinamiVanuatuʻUvea mo FutunaHaʻamoaKō" + + "sovoIemeniMaioteʻAfilika tongaSemipiaSimipapueiPotu fonua taʻeʻiloa " + + "pe halaMāmaniʻAfilikaʻAmelika tokelauʻAmelika tongaʻOsēniaʻAfilika f" + + "akahihifoʻAmelika lotolotoʻAfilika fakahahakeʻAfilika fakatokelauʻAf" + + "ilika lotolotoʻAfilika fakatongaOngo ʻAmelikaʻAmelika fakatokelauKal" + + "ipianeʻĒsia fakahahakeʻĒsia fakatongaʻĒsia fakatongahahakeʻIulope fa" + + "katongaʻAositelēlēsiaMelanīsiaPotu fonua MikolonīsiaPolinīsiaʻĒsiaʻĒ" + + "sia lotolotoʻĒsia fakahihifoʻIulopeʻIulope fakahahakeʻIulope fakatok" + + "elauʻIulope fakahihifoʻAmelika fakalatina", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0010, 0x0019, 0x002e, 0x003e, 0x0052, 0x005a, 0x0064, + 0x006d, 0x0080, 0x008a, 0x0096, 0x00a1, 0x00b3, 0x00be, 0x00cc, + 0x00d3, 0x00e4, 0x00f0, 0x0106, 0x0110, 0x011c, 0x0125, 0x0130, + 0x0139, 0x0140, 0x0148, 0x014e, 0x015b, 0x0162, 0x0169, 0x0171, + 0x0186, 0x018f, 0x0195, 0x019c, 0x01a7, 0x01b1, 0x01b9, 0x01bf, + 0x01c6, 0x01d4, 0x01e4, 0x0201, 0x0213, 0x021c, 0x022f, 0x023d, + 0x0241, 0x0249, 0x024f, 0x0258, 0x0267, 0x0272, 0x0277, 0x0283, + 0x028a, 0x0299, 0x02a2, 0x02b1, 0x02b8, 0x02c4, 0x02ca, 0x02d5, + // Entry 40 - 7F + 0x02dd, 0x02f0, 0x02f9, 0x0308, 0x0311, 0x031c, 0x0325, 0x0336, + 0x0340, 0x0347, 0x0352, 0x0367, 0x036f, 0x0373, 0x0385, 0x0391, + 0x03a0, 0x03a9, 0x03af, 0x03b9, 0x03c2, 0x03c9, 0x03dd, 0x03e5, + 0x03e9, 0x03f5, 0x03ff, 0x0406, 0x040a, 0x0413, 0x0420, 0x0426, + 0x044f, 0x0458, 0x045d, 0x0467, 0x046d, 0x0483, 0x04a0, 0x04aa, + 0x04b2, 0x04b7, 0x04c1, 0x04d1, 0x04de, 0x04e7, 0x04f0, 0x04f9, + 0x0501, 0x0529, 0x0531, 0x0539, 0x0543, 0x054b, 0x0552, 0x0559, + 0x0560, 0x0567, 0x056d, 0x0578, 0x0582, 0x058a, 0x0592, 0x05a6, + // Entry 80 - BF + 0x05b4, 0x05c0, 0x05c6, 0x05d7, 0x05e1, 0x05e4, 0x05ec, 0x05f6, + 0x0605, 0x0610, 0x0618, 0x061e, 0x0626, 0x0632, 0x0639, 0x063f, + 0x0645, 0x064b, 0x0653, 0x065f, 0x067a, 0x0684, 0x0695, 0x069f, + 0x06a4, 0x06a8, 0x06b3, 0x06c3, 0x06dc, 0x06e5, 0x06ef, 0x06fd, + 0x0703, 0x070d, 0x0717, 0x071d, 0x0726, 0x072e, 0x0739, 0x0740, + 0x074e, 0x0753, 0x0761, 0x0769, 0x0772, 0x0779, 0x077f, 0x0785, + 0x078a, 0x078f, 0x0798, 0x079f, 0x07a6, 0x07ab, 0x07c2, 0x07ce, + 0x07d7, 0x07e2, 0x07e8, 0x07fc, 0x080e, 0x0818, 0x0828, 0x0830, + // Entry C0 - FF + 0x0835, 0x083d, 0x0842, 0x0853, 0x085c, 0x0864, 0x086a, 0x0870, + 0x0878, 0x0886, 0x0898, 0x08a9, 0x08b0, 0x08b8, 0x08c0, 0x08ca, + 0x08d4, 0x08ee, 0x08f8, 0x0903, 0x090d, 0x0915, 0x091d, 0x0925, + 0x0936, 0x094d, 0x095c, 0x0975, 0x097b, 0x0984, 0x0998, 0x09b1, + 0x09b6, 0x09d4, 0x09d8, 0x09df, 0x09e9, 0x09f0, 0x09fc, 0x0a0b, + 0x0a13, 0x0a18, 0x0a1d, 0x0a31, 0x0a38, 0x0a3f, 0x0a49, 0x0a56, + 0x0a61, 0x0a7e, 0x0a9f, 0x0aa8, 0x0ab5, 0x0ac2, 0x0adc, 0x0ae5, + 0x0b06, 0x0b26, 0x0b2f, 0x0b36, 0x0b46, 0x0b4e, 0x0b55, 0x0b5b, + // Entry 100 - 13F + 0x0b61, 0x0b70, 0x0b77, 0x0b81, 0x0b9f, 0x0ba6, 0x0baf, 0x0bc0, + 0x0bcf, 0x0bd8, 0x0bec, 0x0bfe, 0x0c12, 0x0c27, 0x0c39, 0x0c4c, + 0x0c5a, 0x0c6f, 0x0c78, 0x0c8a, 0x0c9b, 0x0cb2, 0x0cc4, 0x0cd5, + 0x0cdf, 0x0cf6, 0x0d00, 0x0d07, 0x0d17, 0x0d29, 0x0d31, 0x0d44, + 0x0d58, 0x0d6b, 0x0d7f, + }, + }, + { // tr + trRegionStr, + trRegionIdx, + }, + { // twq + "AndooraLaaraw Imaarawey MarganteyAfgaanistanAntigua nda BarbuudaAngiiyaA" + + "lbaaniArmeeniHollandu Antiiyey LabooAngoolaArgentineAmeriki SamoaOtr" + + "išiOstraaliAruubaAzerbaayijaŋBosni nda HerzegovineBarbaadosBangladeš" + + "iBelgiikiBurkina fasoBulgaariBahareenBurundiBeniŋBermudaBruuneeBooli" + + "viBreezilBahamasBuutaŋBotswaanaBilorišiBeliiziKanaadaKongoo demookar" + + "atiki labooCentraafriki koyraKongooSwisuKudwarKuuk gungeyŠiiliKameru" + + "unŠiinKolombiKosta rikaKuubaKapuver gungeyŠiipurCek laboAlmaaɲeJibuu" + + "tiDanemarkDoominikiDoominiki labooAlžeeriEkwateerEstooniMisraEritree" + + "EspaaɲeEcioopiFinlanduFijiKalkan gungeyMikroneziFaransiGaabonAlbaasa" + + "laama MargantaGrenaadaGorgiFaransi GuyaanGaanaGibraltarGrinlandGambi" + + "GineGwadeluupGinee EkwatorialGreeceGwatemaalaGuamGine-BissoGuyaaneHo" + + "ndurasKrwaasiHaitiHungaariIndoneeziIrlanduIsrayelIndu labooBritiši I" + + "ndu teekoo laamaIraakIraanAyselandItaaliJamaayikUrdunJaapoŋKeeniyaKy" + + "rgyzstankamboogiKiribaatiKomoorSeŋ Kitts nda NevisKooree, GurmaKoore" + + "e, HawsaKuweetKayman gungeyKaazakstanLaawosLubnaanSeŋ LussiaLiechten" + + "steinSrilankaLiberiaLeesotoLituaaniLuxembourgLetooniLiibiMaarokMonak" + + "oMoldoviMadagascarMaršal gungeyMaacedooniMaaliMaynamarMongooliMarian" + + "a Gurma GungeyMartiniikiMooritaaniMontserratMaltaMooris gungeyMaldii" + + "vuMalaawiMexikiMaleeziMozambikNaamibiKaaledooni TaagaaNižerNorfolk G" + + "ungooNaajiriiaNikaragwaHollanduNorveejNeepalNauruNiueZeelandu TaagaO" + + "maanPanamaPeeruFaransi PolineeziPapua Ginee TaagaFilipinePaakistanPo" + + "loɲeSeŋ Piyer nda MikelonPitikarinPorto RikoPalestine Dangay nda Gaa" + + "zaPortugaalPaluParaguweyKataarReenioŋRumaaniIriši labooRwandaSaudiya" + + "Solomon GungeySeešelSuudaŋSweedeSingapurSeŋ HelenaSloveeniSlovaakiSe" + + "era LeonSan MarinoSenegalSomaaliSurinaamSao Tome nda PrinsipeSalvado" + + "r labooSuuriaSwazilandTurk nda Kayikos GungeyCaaduTogoTaayilandTaaži" + + "kistanTokelauTimoor hawsaTurkmenistaŋTuniziTongaTurkiTrinidad nda To" + + "baagoTuvaluTaayiwanTanzaaniUkreenUgandaAmeriki Laabu MarganteyUruguw" + + "eyUzbeekistanVaatikan LaamaSeŋvinsaŋ nda GrenadineVeneezuyeelaBritiš" + + "i Virgin gungeyAmeerik Virgin GungeyVietnaamVanautuWallis nda Futuna" + + "SamoaYamanMayootiHawsa Afriki LabooZambiZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0007, 0x0021, 0x002c, 0x0040, 0x0047, 0x004e, + 0x0055, 0x006c, 0x0073, 0x0073, 0x007c, 0x0089, 0x0090, 0x0098, + 0x009e, 0x009e, 0x00ab, 0x00c0, 0x00c9, 0x00d4, 0x00dc, 0x00e8, + 0x00f0, 0x00f8, 0x00ff, 0x0105, 0x0105, 0x010c, 0x0113, 0x011a, + 0x011a, 0x0121, 0x0128, 0x012f, 0x012f, 0x0138, 0x0141, 0x0148, + 0x014f, 0x014f, 0x0169, 0x017b, 0x0181, 0x0186, 0x018c, 0x0197, + 0x019d, 0x01a5, 0x01aa, 0x01b1, 0x01b1, 0x01bb, 0x01c0, 0x01ce, + 0x01ce, 0x01ce, 0x01d5, 0x01dd, 0x01e5, 0x01e5, 0x01ec, 0x01f4, + // Entry 40 - 7F + 0x01fd, 0x020c, 0x0214, 0x0214, 0x021c, 0x0223, 0x0228, 0x0228, + 0x022f, 0x0237, 0x023e, 0x023e, 0x0246, 0x024a, 0x0257, 0x0260, + 0x0260, 0x0267, 0x026d, 0x0282, 0x028a, 0x028f, 0x029d, 0x029d, + 0x02a2, 0x02ab, 0x02b3, 0x02b8, 0x02bc, 0x02c5, 0x02d5, 0x02db, + 0x02db, 0x02e5, 0x02e9, 0x02f3, 0x02fa, 0x02fa, 0x02fa, 0x0302, + 0x0309, 0x030e, 0x0316, 0x0316, 0x031f, 0x0326, 0x032d, 0x032d, + 0x0337, 0x0351, 0x0356, 0x035b, 0x0363, 0x0369, 0x0369, 0x0371, + 0x0376, 0x037d, 0x0384, 0x038e, 0x0396, 0x039f, 0x03a5, 0x03b9, + // Entry 80 - BF + 0x03c6, 0x03d3, 0x03d9, 0x03e6, 0x03f0, 0x03f6, 0x03fd, 0x0408, + 0x0415, 0x041d, 0x0424, 0x042b, 0x0433, 0x043d, 0x0444, 0x0449, + 0x044f, 0x0455, 0x045c, 0x045c, 0x045c, 0x0466, 0x0474, 0x047e, + 0x0483, 0x048b, 0x0493, 0x0493, 0x04a7, 0x04b1, 0x04bb, 0x04c5, + 0x04ca, 0x04d7, 0x04df, 0x04e6, 0x04ec, 0x04f3, 0x04fb, 0x0502, + 0x0513, 0x0519, 0x0527, 0x0530, 0x0539, 0x0541, 0x0548, 0x054e, + 0x0553, 0x0557, 0x0565, 0x056a, 0x0570, 0x0575, 0x0586, 0x0597, + 0x059f, 0x05a8, 0x05af, 0x05c5, 0x05ce, 0x05d8, 0x05f2, 0x05fb, + // Entry C0 - FF + 0x05ff, 0x0608, 0x060e, 0x060e, 0x0616, 0x061d, 0x061d, 0x0629, + 0x062f, 0x0636, 0x0644, 0x064b, 0x0652, 0x0658, 0x0660, 0x066b, + 0x0673, 0x0673, 0x067b, 0x0685, 0x068f, 0x0696, 0x069d, 0x06a5, + 0x06a5, 0x06ba, 0x06c8, 0x06c8, 0x06ce, 0x06d7, 0x06d7, 0x06ee, + 0x06f3, 0x06f3, 0x06f7, 0x0700, 0x070c, 0x0713, 0x071f, 0x072c, + 0x0732, 0x0737, 0x073c, 0x0750, 0x0756, 0x075e, 0x0766, 0x076c, + 0x0772, 0x0772, 0x0789, 0x0791, 0x079c, 0x07aa, 0x07c3, 0x07cf, + 0x07e5, 0x07fa, 0x0802, 0x0809, 0x081a, 0x081f, 0x081f, 0x0824, + // Entry 100 - 13F + 0x082b, 0x083d, 0x0842, 0x084a, + }, + }, + { // tzm + "AnḍurraImarat Tiεrabin TidduklinAfɣanistanAntigwa d BarbudaAngwillaAlban" + + "yaArminyaAntil TihulanḍiyyinAngulaArjuntinSamwa ImirikaniyyinUstriyy" + + "aUsṭralyaArubaAzerbiǧanBusna-d-HirsikBarbadusBangladicBeljikaBurkina" + + " FasuBelɣaryaBaḥraynBurundiBininBirmudaBrunayBulivyaBṛazilBahamasBuṭ" + + "anButswanaBilarusyaBilizKanadaTagduda Tadimuqraṭit n KunguTagduda n " + + "Afrika WammasKunguSwisraTaɣazut n UszerTigzirin n KukCciliKamerunṢṣi" + + "nKulumbyaKusṭa RikakubaTigzirin n Iɣf UzegzawQubrusTagduda n ČikAlma" + + "nyaǦibutiDanmarkḌuminikaTagduda n ḌuminikanDzayerIkwaḍurIsṭunyaMiṣrI" + + "ritryaSbanyaItyupyaFinlanḍaFijiTigzirin n FalklandMikrunizyaFṛansaGa" + + "bunTagelda TaddukeltGrinadaJyurjyaGuyana TafransistƔanaJibralṭarGrin" + + "lanḍaGambyaƔinyaGwadalupƔinya Tikwaṭur itYunanGwatimalaGwamƔinya-Bis" + + "sawGuyanaHindurasKrwatyaHaytiHenɣaryaIndunizyaIrlanḍaIsraeilHindAmur" + + " n Agaraw Uhindi UbṛiṭaniƐiraqIranIslanḍaIṭalyaJamaykaUrḍunJjappunKi" + + "nyaKirɣistanKambudjKiribatiQumurSantekits d NivisKurya TugafatKurya " + + "TunẓultKuwwaytTigzirin n KaymanKazaxistanLawsLubnanSantelusyaLictenc" + + "ṭaynSrilankaLibiryaLisuṭuLitwanyaLiksumburgLiṭṭunyaLibyaMeṛṛukMuna" + + "kuMulḍavyaMadaɣacqarTigzirin n MarcalMaqdunyaMaliMyanmarManɣulyaTigz" + + "irin n Maryana TugafatMartinikMuritanyaMuntsirraMalṭaMurisMaldivMala" + + "wiMiksikMalizyaMuzambiqNamibyakalidunya TamaynutNnijerTigzirt Nurful" + + "kNijiriaNikaragwaHulanḍaNnurwijNippalNawruNiwiZilanḍa TamaynutƐumman" + + "PanamaPiruPulinizya TafransistPapwa Ɣinya TamaynutFilippinPakistanPu" + + "lunyaSantepyir d MikelunPitkirnPurturikuAgemmaḍ Ugut d Ɣazza Ifilisṭ" + + "iniyenPurtuɣalPaluParagwayQaṭarRiyyunyunṚumanyaRusyaRuwwanḍaSsaεudiy" + + "ya TaεrabtTigzirin n SalumunSsicilSsudanSsewwidSanɣafuraSantehilinSl" + + "uvinyaSluvakyaSiralyunSanmarinuSsiniɣalṢṣumalSurinamSawṭumi d Prinsi" + + "pSalvaḍurSuryaSwazilanḍaTigzirin Turkiyyin d TikaykusinTcadṬṭuguṬayl" + + "anḍaṬaǧikistanTukluTimur TagmuṭTurkmanistanTunesṬungaTurkyaTrinidad " + + "d ṬubaguṬuvaluṬaywanṬanzanyaUkranyaUɣandaIwunak Idduklen n AmirikaUr" + + "ugwayUzbakistanAwank iɣrem n VatikanSantevinsent d GrinadinVinzwilla" + + "Tigzirin (Virgin) TibṛiṭaniyinTigzirin n Virjin n Iwunak YedduklenVi" + + "ṭnamVanwatuWalis d FutunaSamwaYamanMayuṭTafrikt TunẓulZambyaZimbab" + + "wi", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0009, 0x0023, 0x002e, 0x003f, 0x0047, 0x004e, + 0x0055, 0x006a, 0x0070, 0x0070, 0x0078, 0x008b, 0x0093, 0x009d, + 0x00a2, 0x00a2, 0x00ac, 0x00ba, 0x00c2, 0x00cb, 0x00d2, 0x00de, + 0x00e7, 0x00f0, 0x00f7, 0x00fc, 0x00fc, 0x0103, 0x0109, 0x0110, + 0x0110, 0x0118, 0x011f, 0x0126, 0x0126, 0x012e, 0x0137, 0x013c, + 0x0142, 0x0142, 0x0160, 0x0177, 0x017c, 0x0182, 0x0192, 0x01a0, + 0x01a5, 0x01ac, 0x01b4, 0x01bc, 0x01bc, 0x01c8, 0x01cc, 0x01e3, + 0x01e3, 0x01e3, 0x01e9, 0x01f7, 0x01fe, 0x01fe, 0x0205, 0x020c, + // Entry 40 - 7F + 0x0216, 0x022b, 0x0231, 0x0231, 0x023a, 0x0243, 0x0249, 0x0249, + 0x0250, 0x0256, 0x025d, 0x025d, 0x0267, 0x026b, 0x027e, 0x0288, + 0x0288, 0x0290, 0x0295, 0x02a6, 0x02ad, 0x02b4, 0x02c5, 0x02c5, + 0x02ca, 0x02d5, 0x02e0, 0x02e6, 0x02ec, 0x02f4, 0x0308, 0x030d, + 0x030d, 0x0316, 0x031a, 0x0327, 0x032d, 0x032d, 0x032d, 0x0335, + 0x033c, 0x0341, 0x034a, 0x034a, 0x0353, 0x035c, 0x0363, 0x0363, + 0x0367, 0x0388, 0x038e, 0x0392, 0x039b, 0x03a3, 0x03a3, 0x03aa, + 0x03b1, 0x03b8, 0x03bd, 0x03c7, 0x03ce, 0x03d6, 0x03db, 0x03ec, + // Entry 80 - BF + 0x03f9, 0x0408, 0x040f, 0x0420, 0x042a, 0x042e, 0x0434, 0x043e, + 0x044b, 0x0453, 0x045a, 0x0462, 0x046a, 0x0474, 0x0480, 0x0485, + 0x048f, 0x0495, 0x049f, 0x049f, 0x049f, 0x04aa, 0x04bb, 0x04c3, + 0x04c7, 0x04ce, 0x04d7, 0x04d7, 0x04f1, 0x04f9, 0x0502, 0x050b, + 0x0512, 0x0517, 0x051d, 0x0523, 0x0529, 0x0530, 0x0538, 0x053f, + 0x0551, 0x0557, 0x0566, 0x056d, 0x0576, 0x057f, 0x0586, 0x058c, + 0x0591, 0x0595, 0x05a7, 0x05ae, 0x05b4, 0x05b8, 0x05cc, 0x05e1, + 0x05e9, 0x05f1, 0x05f8, 0x060b, 0x0612, 0x061b, 0x0642, 0x064b, + // Entry C0 - FF + 0x064f, 0x0657, 0x065e, 0x065e, 0x0667, 0x0670, 0x0670, 0x0675, + 0x067f, 0x0693, 0x06a5, 0x06ab, 0x06b1, 0x06b8, 0x06c2, 0x06cc, + 0x06d4, 0x06d4, 0x06dc, 0x06e4, 0x06ed, 0x06f6, 0x0700, 0x0707, + 0x0707, 0x071a, 0x0724, 0x0724, 0x0729, 0x0735, 0x0735, 0x0754, + 0x0758, 0x0758, 0x0761, 0x076d, 0x077a, 0x077f, 0x078d, 0x0799, + 0x079e, 0x07a5, 0x07ab, 0x07be, 0x07c6, 0x07ce, 0x07d8, 0x07df, + 0x07e6, 0x07e6, 0x07ff, 0x0806, 0x0810, 0x0826, 0x083d, 0x0846, + 0x0868, 0x088c, 0x0894, 0x089b, 0x08a9, 0x08ae, 0x08ae, 0x08b3, + // Entry 100 - 13F + 0x08ba, 0x08ca, 0x08d0, 0x08d8, + }, + }, + { // ug + "ئاسسېنسىيون ئارىلىئاندوررائەرەب بىرلەشمە خەلىپىلىكىئافغانىستانئانتىگۋا ۋ" + + "ە باربۇدائانگۋىللائالبانىيەئەرمېنىيەئانگولائانتاركتىكائارگېنتىنائام" + + "ېرىكا تەۋەلىكىدىكى ساموئائاۋسترىيەئاۋسترالىيەئارۇبائالاند ئاراللىرى" + + "ئەزەربەيجانبوسنىيە-گېرتسېگوۋىناباربادوسباڭلادىشبېلگىيەبۇركىنا-فاسوب" + + "ۇلغارىيەبەھرەينبۇرۇندىبېنىنساينىت-بارتھېلەمي ئاراللىرىبېرمۇدابىرۇنې" + + "يبولىۋىيەكارىب دېڭىزى گوللاندىيەبىرازىلىيەباھامابۇتانبۇۋېت ئاراللىر" + + "ىبوتسۋانابېلارۇسىيەبېلىزكاناداكەئەلىڭ كوكۇس ئاراللىرىكونگو - كىنشاس" + + "ائوتتۇرا ئافرىقا جۇمھۇرىيىتىكونگو - بىراززاۋىلشىۋىتسارىيەكوتې دې ئى" + + "ۋوئىركۇك ئاراللىرىچىلىكامېرونجۇڭگوكولومبىيەكىلىپپېرتون ئاراللىرىكوس" + + "تارىكاكۇبايېشىل تۇمشۇقكۇراسوروژدېستۋو ئارىلىسىپرۇسچېخ جۇمھۇرىيىتىگې" + + "رمانىيەدېگو-گارشىياجىبۇتىدانىيەدومىنىكادومىنىكا جۇمھۇرىيىتىئالجىرىي" + + "ەسېيتا ۋە مېلىلائېكۋادورئېستونىيەمىسىرغەربىي ساخارائېرىترېيەئىسپانى" + + "يەئېفىيوپىيەياۋروپا ئىتتىپاقىفىنلاندىيەفىجىفالكلاند ئاراللىرىمىكرون" + + "ېزىيەفائېرو ئاراللىرىفىرانسىيەگابونئەنگلىيە پادىشاھلىقىگىرېناداگىرو" + + "زىيەفىرانسىيەگە قاراشلىق گىۋىياناگېرىنسىگاناجەبىلتارىقگىرېنلاندگامب" + + "ىيەگىۋىنېيەگىۋادېلۇپئېكۋاتور گىۋىنېيەسىگىرېتسىيەجەنۇبىي جورجىيە ۋە " + + "جەنۇبىي ساندىۋىچ ئاراللىرىگىۋاتېمالاگۇئامگىۋىنېيە-بىسسائۇگىۋىياناشي" + + "اڭگاڭ ئالاھىدە مەمۇرىي رايونى (جۇڭگو)خېرد ۋە ماك-دونالد ئارىلىھوندۇ" + + "راسكىرودىيەھايتىۋېنگىرىيەكانارى ئاراللىرىھىندونېزىيەئىرېلاندىيەئىسر" + + "ائىلىيەمېن ئارىلىھىندىستانئەنگلىيەنىڭ ھىندى ئوكياندىكى تەۋەلىكىئىرا" + + "قئىرانئىسلاندىيەئىتالىيەجېرسېييامايكائىيوردانىيەياپونىيەكېنىيەقىرغى" + + "زىستانكامبودژاكىرىباتىكوموروساينىت-كىرىستوفېر ۋە نېۋىسشىمالىي كورىي" + + "ەجەنۇبىي كورىيەكۇۋەيتكايمان ئاراللىرىقازاقىستانلائوسلىۋانساينىت-لۇس" + + "ىيەلىچتېنشتېين بەگلىكىسىرىلانكالىبېرىيەلېسوتولىتۋانىيەلىيۇكسېمبۇرگل" + + "اتۋىيەلىۋىيەماراكەشموناكومولدوۋامونتېنېگروساينىت-مارتېنماداغاسقارما" + + "رشال ئاراللىرىماكېدونىيەمالىبىرماموڭغۇلىيەئاۋمېن ئالاھىدە مەمۇرىي ر" + + "ايونى (جۇڭگو)شىمالىي مارىيانا ئاراللىرىمارتىنىكاماۋرىتانىيەمونتسېرر" + + "اتمالتاماۋرىتىئۇسمالدىۋېمالاۋىمېكسىكامالايشىياموزامبىكنامىبىيەيېڭى " + + "كالېدونىيەنېگىرنورفولك ئارىلىنىگېرىيەنىكاراگۇئاگوللاندىيەنورۋېگىيەن" + + "ېپالناۋرۇنىيۇئېيېڭى زېلاندىيەئومانپاناماپېرۇفىرانسىيەگە قاراشلىق پو" + + "لىنېزىيەپاپۇئا يېڭى گىۋىنېيەسىفىلىپپىنپاكىستانپولشاساينىت-پىئېر ۋە " + + "مىكېلون ئاراللىرىپىتكاير ئاراللىرىپۇئېرتو-رىكوپەلەستىن زېمىنىپورتۇگ" + + "الىيەپالاۋپاراگۋايقاتارئوكيانىيە ئەتراپىدىكى ئاراللاررېئونىيونرۇمىن" + + "ىيەسېربىيەرۇسىيەرىۋانداسەئۇدى ئەرەبىستانسولومون ئاراللىرىسېيشېلسۇدا" + + "نشىۋېتسىيەسىنگاپورساينىت ھېلېناسىلوۋېنىيەسىۋالبارد ۋە يان-مايېن ئار" + + "ىلىسىلوۋاكىيەسېررالېئونسان-مارىنوسېنېگالسومالىسۇرىنامجەنۇبىي سۇدانس" + + "ان تومې ۋە پرىنسىپېئەل سالۋادورسىنت مارتېنسۈرىيەسىۋېزىلاندترىستان د" + + "اكۇنھاتۇركس ۋە كايكوس ئاراللىرىچادفىرانسىيەگە قاراشلىق جەنۇبتىكى زې" + + "مىنلىرىتوگوتايلاندتاجىكىستانتوكېلاۋشەرقىي تىمورتۈركمەنىستانتۇنىستون" + + "گاتۈركىيەتىرىنىداد ۋە توباگوتۇۋالۇتەيۋەنتانزانىيەئۇكرائىنائۇگاندائا" + + "مېرىكا تەۋەلىكىدىكى سىرتقى كىچىك ئاراللارئامېرىكا قوشما شتاتلىرىئۇر" + + "ۇگۋايئۆزبېكىستانۋاتىكان شەھىرىساينىت-ۋىنسېنت ۋە گىرېنادىنېسۋېنېزۇئې" + + "لائەنگلىيەگە قاراشلىق ۋىرجىن ئارىلىئامېرىكا تەۋەلىكىدىكى ۋىرجىن تاق" + + "ىم ئاراللىرىۋىيېتنامۋانۇئاتۇۋالىس ۋە فۇتۇناساموئاكوسوۋويەمەنمايوتتې" + + "جەنۇبىي ئافرىقازامبىيەزىمبابۋېيوچۇن جايدۇنيائافرىقاشىمالىي ئامېرىكا" + + "جەنۇبىي ئامېرىكائوكيانىيەغەربىي ئافرىقائوتتۇرا ئامېرىكاشەرقىي ئافرى" + + "قاشىمالىي ئافرىقائوتتۇرا ئافرىقاجەنۇبىي ئافرىقا رايونىئامېرىكاشىمال" + + "ىي ئامېرىكا رايونىكارىب دېڭىزىشەرقىي ئاسىياجەنۇبىي ئاسىياشەرقىي جەن" + + "ۇبىي ئاسىياجەنۇبىي ياۋروپائاۋسترالئاسىيامېلانېسىيەمىكرونېزىيە رايون" + + "ىپولىنىزىيەئاسىيائوتتۇرا ئاسىياغەربىي ئاسىياياۋروپاشەرقىي ياۋروپاشى" + + "مالىي ياۋروپاغەربىي ياۋروپالاتىن ئامېرىكا", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0023, 0x0033, 0x0063, 0x0079, 0x009d, 0x00af, 0x00c1, + 0x00d3, 0x00d3, 0x00e1, 0x00f7, 0x010b, 0x0141, 0x0153, 0x0169, + 0x0175, 0x0194, 0x01aa, 0x01d1, 0x01e1, 0x01f1, 0x01ff, 0x0216, + 0x0228, 0x0236, 0x0244, 0x024e, 0x0282, 0x0290, 0x029e, 0x02ae, + 0x02da, 0x02ee, 0x02fa, 0x0304, 0x0321, 0x0331, 0x0345, 0x034f, + 0x035b, 0x0387, 0x03a2, 0x03d6, 0x03f7, 0x040d, 0x0429, 0x0442, + 0x044a, 0x0458, 0x0462, 0x0474, 0x049d, 0x04af, 0x04b7, 0x04ce, + 0x04da, 0x04f9, 0x0505, 0x0522, 0x0534, 0x054b, 0x0557, 0x0563, + // Entry 40 - 7F + 0x0573, 0x059a, 0x05ac, 0x05c8, 0x05d8, 0x05ea, 0x05f4, 0x060d, + 0x061f, 0x0631, 0x0645, 0x0666, 0x067a, 0x0682, 0x06a5, 0x06bb, + 0x06da, 0x06ec, 0x06f6, 0x071d, 0x072d, 0x073d, 0x0775, 0x0783, + 0x078b, 0x079f, 0x07b1, 0x07bf, 0x07cf, 0x07e1, 0x0806, 0x0818, + 0x086d, 0x0881, 0x088b, 0x08aa, 0x08ba, 0x0902, 0x0930, 0x0940, + 0x0950, 0x095a, 0x096c, 0x098b, 0x09a1, 0x09b7, 0x09cd, 0x09e0, + 0x09f2, 0x0a39, 0x0a43, 0x0a4d, 0x0a61, 0x0a71, 0x0a7d, 0x0a8b, + 0x0aa1, 0x0ab1, 0x0abd, 0x0ad3, 0x0ae3, 0x0af3, 0x0aff, 0x0b30, + // Entry 80 - BF + 0x0b4b, 0x0b66, 0x0b72, 0x0b91, 0x0ba5, 0x0baf, 0x0bb9, 0x0bd2, + 0x0bf7, 0x0c09, 0x0c19, 0x0c25, 0x0c37, 0x0c4f, 0x0c5d, 0x0c69, + 0x0c77, 0x0c83, 0x0c91, 0x0ca5, 0x0cbe, 0x0cd2, 0x0cf1, 0x0d05, + 0x0d0d, 0x0d17, 0x0d29, 0x0d6f, 0x0da1, 0x0db3, 0x0dc9, 0x0ddd, + 0x0de7, 0x0dfb, 0x0e09, 0x0e15, 0x0e23, 0x0e35, 0x0e45, 0x0e55, + 0x0e72, 0x0e7c, 0x0e97, 0x0ea7, 0x0ebb, 0x0ecf, 0x0ee1, 0x0eeb, + 0x0ef5, 0x0f01, 0x0f1c, 0x0f26, 0x0f32, 0x0f3a, 0x0f76, 0x0fa0, + 0x0fb0, 0x0fc0, 0x0fca, 0x1008, 0x1029, 0x1040, 0x105d, 0x1073, + // Entry C0 - FF + 0x107d, 0x108d, 0x1097, 0x10d1, 0x10e3, 0x10f3, 0x1101, 0x110d, + 0x111b, 0x113c, 0x115d, 0x1169, 0x1173, 0x1185, 0x1195, 0x11ae, + 0x11c2, 0x11f8, 0x120c, 0x1220, 0x1233, 0x1241, 0x124d, 0x125b, + 0x1274, 0x1299, 0x12b0, 0x12c5, 0x12d1, 0x12e5, 0x1302, 0x1331, + 0x1337, 0x1384, 0x138c, 0x139a, 0x13ae, 0x13bc, 0x13d3, 0x13eb, + 0x13f5, 0x13ff, 0x140d, 0x1431, 0x143d, 0x1449, 0x145b, 0x146d, + 0x147b, 0x14cd, 0x14f9, 0x1509, 0x151f, 0x153a, 0x1571, 0x1585, + 0x15c4, 0x1618, 0x1628, 0x1638, 0x1654, 0x1660, 0x166c, 0x1676, + // Entry 100 - 13F + 0x1684, 0x16a1, 0x16af, 0x16bf, 0x16d0, 0x16da, 0x16e8, 0x1707, + 0x1726, 0x1738, 0x1753, 0x1772, 0x178d, 0x17aa, 0x17c7, 0x17f1, + 0x1801, 0x182d, 0x1844, 0x185d, 0x1878, 0x18a0, 0x18bd, 0x18d9, + 0x18ed, 0x1910, 0x1924, 0x1930, 0x194b, 0x1964, 0x1972, 0x198d, + 0x19aa, 0x19c5, 0x19e0, + }, + }, + { // uk + ukRegionStr, + ukRegionIdx, + }, + { // ur + urRegionStr, + urRegionIdx, + }, + { // ur-IN + "جزیرہ اسینشنجزائر آلینڈجزیرہ بوویتجزائر (کیلنگ) کوکوسکوت داوواغجزائر ککج" + + "زیرہ کلپرٹنڈیگو گارشیاجزائر فاکلینڈجزائر فیروفرانسیسی گیاناجزائر ہر" + + "ڈ و مکڈونلڈجزائر کناریبرطانوی بحرہند خطہجزائر مارشلجزائر شمالی ماری" + + "اناجزیرہ نارفوکجزائر پٹکیرنجزائر سلیمانترسٹان دا کونیاجزائر کیکس و " + + "ترکیہامریکی بیرونی جزائربرطانوی جزائر ورجنامریکی جزائر ورجن", + []uint16{ // 250 elements + // Entry 0 - 3F + 0x0000, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, + 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, 0x0017, + 0x0017, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, + 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, 0x002c, + 0x002c, 0x002c, 0x002c, 0x002c, 0x0041, 0x0041, 0x0041, 0x0041, + 0x0041, 0x0063, 0x0063, 0x0063, 0x0063, 0x0063, 0x0076, 0x0085, + 0x0085, 0x0085, 0x0085, 0x0085, 0x009c, 0x009c, 0x009c, 0x009c, + 0x009c, 0x009c, 0x009c, 0x009c, 0x009c, 0x00b1, 0x00b1, 0x00b1, + // Entry 40 - 7F + 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, + 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00b1, 0x00ca, 0x00ca, + 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00dd, 0x00f8, 0x00f8, + 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, + 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x00f8, 0x011b, 0x011b, + 0x011b, 0x011b, 0x011b, 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, + 0x0130, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, + 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, + // Entry 80 - BF + 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, + 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, + 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0167, 0x0167, + 0x0167, 0x0167, 0x0167, 0x0167, 0x018b, 0x018b, 0x018b, 0x018b, + 0x018b, 0x018b, 0x018b, 0x018b, 0x018b, 0x018b, 0x018b, 0x018b, + 0x018b, 0x018b, 0x01a2, 0x01a2, 0x01a2, 0x01a2, 0x01a2, 0x01a2, + 0x01a2, 0x01a2, 0x01a2, 0x01a2, 0x01a2, 0x01a2, 0x01a2, 0x01a2, + 0x01a2, 0x01a2, 0x01a2, 0x01a2, 0x01b9, 0x01b9, 0x01b9, 0x01b9, + // Entry C0 - FF + 0x01b9, 0x01b9, 0x01b9, 0x01b9, 0x01b9, 0x01b9, 0x01b9, 0x01b9, + 0x01b9, 0x01b9, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, + 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, + 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01d0, 0x01ec, 0x020d, + 0x020d, 0x020d, 0x020d, 0x020d, 0x020d, 0x020d, 0x020d, 0x020d, + 0x020d, 0x020d, 0x020d, 0x020d, 0x020d, 0x020d, 0x020d, 0x020d, + 0x020d, 0x0231, 0x0231, 0x0231, 0x0231, 0x0231, 0x0231, 0x0231, + 0x0253, 0x0273, + }, + }, + { // uz + uzRegionStr, + uzRegionIdx, + }, + { // uz-Arab + "افغانستان", + []uint16{ // 5 elements + 0x0000, 0x0000, 0x0000, 0x0000, 0x0012, + }, + }, + { // uz-Cyrl + "Вознесение оролиАндорраБирлашган Араб АмирликлариАфғонистонАнтигуа ва Ба" + + "рбадосАнгилаАлбанияАрманистонАнголаАнтарктикаАргентинаАмерика Самоа" + + "сиАвстрияАвстралияАрубаАланд ороллариОзарбайжонБосния ва Герцеговин" + + "аБарбадосБангладешБельгияБуркина-ФасоБолгарияБаҳрайнБурундиБенинМуқ" + + "аддас ВарфаломейБермудаБрунейБоливияКариб НидерландиясиБразилияБага" + + "ма ороллариБутанБувет оролиБотсваннаБелорусияБелизКанадаКокос (Кили" + + "нг) ороллариКонго-КиншасаМарказий Африка РеспубликасиКонго Браззави" + + "льШвейцарияКот-д-ИвуарКук ороллариЧилиКамерунХитойКолумбияКлипперто" + + "н оролиКоста-РикаКубаКабо-ВердеКурасаоРождество оролиКипрЧехия Респ" + + "убликасиОлмонияДиего ГарсияДжибутиДанияДоминикаДоминикан Республика" + + "сиЖазоирСейта ва МелиллаЭквадорЭстонияМисрҒарбий Саҳрои КабирЭритре" + + "яИспанияЭфиопияЕвропа ИттифоқиФинляндияФижи ороллариФолькленд оролл" + + "ариМикронезияФарер ороллариФранцияГабонБирлашган ҚиролликГренадаГру" + + "зияФранцуз ГвианасиГернсиГанаГибралтарГренландияГамбияГвинеяГваделу" + + "пеЭкваториал ГвинеяГрецияЖанубий Джорджия ва Жанубий Сендвич оролла" + + "риГватемалаГуамГвинея-БисауГаянаГонконг Хитой ММҲГерд ороли ва МакД" + + "оналд ороллариГондурасХорватияГаитиВенгрияКанар ороллариИндонезияИр" + + "ландияИсроилМэн оролиҲиндистонБритания Ҳинд океани ҳудудиИроқЭронИс" + + "ландияИталияДжерсиЯмайкаИорданияЯпонияКенияҚирғизистонКамбоджаКириб" + + "атиКомор ороллариСент-Китс ва НевисШимолий КореяЖанубий КореяКувайт" + + "Кайман ороллариҚозоғистонЛаосЛиванСент-ЛюсияЛихтенштейнШри-ЛанкаЛиб" + + "ерияЛесотоЛитваЛюксембургЛатвияЛивияМарокашМонакоМолдоваЧерногорияС" + + "ент-МартинМадагаскарМаршал ороллариМакедонияМалиМьянма (Бирма)Муғул" + + "истонМакао Хитой ММҲШимолий Марианна ороллариМартиникаМавританияМон" + + "тсерратМальтаМаврикийМальдив ороллариМалавиМексикаМалайзияМозамбикН" + + "амибияЯнги КаледонияНигерНорфолк ороллариНигерияНикарагуаНидерланди" + + "яНорвегияНепалНауруНиуеЯнги ЗеландияУммонПанамаПеруФранцуз Полинези" + + "ясиПапуа Янги ГвинеяФилиппинПокистонПольшаСент-Пьер ва МикелонПитка" + + "рин ороллариПуэрто-РикоФаластин ҳудудиПортугалияПалауПарагвайҚатарЁ" + + "ндош ОкеанияРеюньонРуминияСербияРоссияРуандаСаудия АрабистониСоломо" + + "н ороллариСейшел ороллариСуданШвецияСингапурМуқаддас Елена ороллари" + + "СловенияСавльбард ва Жан МаенСловакияСьерра-ЛеонеСан-МариноСенегалС" + + "омалиСуринамЖанубий СуданСан-Томе ва ПринсипиЭль-СальвадорСинт-Маар" + + "тенСурияСвазилендТристан де КунаТуркс ва Кайкос ороллариЧадФранция " + + "жанубий худудлариТогоТайландТожикистонТокелауШарқий-ТиморТуркманист" + + "онТунисТонгаТуркияТринидад ва ТобагоТувалуТайванТанзанияУкраинаУган" + + "даАҚШ ёндош ороллариҚўшма ШтатларУругвайЎзбекистонВатиканСент-Винсе" + + "нт ва ГренадинВенесуэлаБритания Вирджиния ороллариАҚШ Вирджиния оро" + + "ллариВьетнамВануатуУэллис ва ФутунаСамоаКосовоЯманМайоттаЖанубий Аф" + + "рикаЗамбияЗимбабвеНомаълум минтақаДунёАфрикаШимолий АмерикаЖанубий " + + "АмерикаОкеанияҒарбий АфрикаМарказий АмерикаШарқий АфрикаШимолий Афр" + + "икаМарказий АфрикаЖануби-АфрикаАмерикаШимоли-АмерикаКариб ҳавзасиШа" + + "рқий ОсиёЖанубий ОсиёЖанубий-Шарқий ОсиёЖанубий ЕвропаАвстралазияМе" + + "ланезияМикронезия минтақасиПолинезияОсиёМарказий ОсиёҒарбий ОсиёЕвр" + + "опаШарқий ЕвропаШимолий ЕвропаҒарбий ЕвропаЛотин Америкаси", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x001f, 0x002d, 0x005f, 0x0073, 0x0097, 0x00a3, 0x00b1, + 0x00c5, 0x00c5, 0x00d1, 0x00e5, 0x00f7, 0x0114, 0x0122, 0x0134, + 0x013e, 0x0159, 0x016d, 0x0195, 0x01a5, 0x01b7, 0x01c5, 0x01dc, + 0x01ec, 0x01fa, 0x0208, 0x0212, 0x0237, 0x0245, 0x0251, 0x025f, + 0x0284, 0x0294, 0x02b1, 0x02bb, 0x02d0, 0x02e2, 0x02f4, 0x02fe, + 0x030a, 0x0334, 0x034d, 0x0383, 0x03a2, 0x03b4, 0x03c8, 0x03df, + 0x03e7, 0x03f5, 0x03ff, 0x040f, 0x042e, 0x0441, 0x0449, 0x045c, + 0x046a, 0x0487, 0x048f, 0x04b2, 0x04c0, 0x04d7, 0x04e5, 0x04ef, + // Entry 40 - 7F + 0x04ff, 0x052a, 0x0536, 0x0554, 0x0562, 0x0570, 0x0578, 0x059c, + 0x05aa, 0x05b8, 0x05c6, 0x05e3, 0x05f5, 0x060e, 0x0631, 0x0645, + 0x0660, 0x066e, 0x0678, 0x069b, 0x06a9, 0x06b5, 0x06d4, 0x06e0, + 0x06e8, 0x06fa, 0x070e, 0x071a, 0x0726, 0x0738, 0x0759, 0x0765, + 0x07b8, 0x07ca, 0x07d2, 0x07e9, 0x07f3, 0x0813, 0x084f, 0x085f, + 0x086f, 0x0879, 0x0887, 0x08a2, 0x08b4, 0x08c4, 0x08d0, 0x08e1, + 0x08f3, 0x0926, 0x092e, 0x0936, 0x0946, 0x0952, 0x095e, 0x096a, + 0x097a, 0x0986, 0x0990, 0x09a6, 0x09b6, 0x09c6, 0x09e1, 0x0a02, + // Entry 80 - BF + 0x0a1b, 0x0a34, 0x0a40, 0x0a5d, 0x0a71, 0x0a79, 0x0a83, 0x0a96, + 0x0aac, 0x0abd, 0x0acb, 0x0ad7, 0x0ae1, 0x0af5, 0x0b01, 0x0b0b, + 0x0b19, 0x0b25, 0x0b33, 0x0b47, 0x0b5c, 0x0b70, 0x0b8d, 0x0b9f, + 0x0ba7, 0x0bc0, 0x0bd4, 0x0bf0, 0x0c20, 0x0c32, 0x0c46, 0x0c5a, + 0x0c66, 0x0c76, 0x0c95, 0x0ca1, 0x0caf, 0x0cbf, 0x0ccf, 0x0cdd, + 0x0cf8, 0x0d02, 0x0d21, 0x0d2f, 0x0d41, 0x0d57, 0x0d67, 0x0d71, + 0x0d7b, 0x0d83, 0x0d9c, 0x0da6, 0x0db2, 0x0dba, 0x0ddf, 0x0dff, + 0x0e0f, 0x0e1f, 0x0e2b, 0x0e50, 0x0e71, 0x0e86, 0x0ea3, 0x0eb7, + // Entry C0 - FF + 0x0ec1, 0x0ed1, 0x0edb, 0x0ef4, 0x0f02, 0x0f10, 0x0f1c, 0x0f28, + 0x0f34, 0x0f55, 0x0f74, 0x0f91, 0x0f9b, 0x0fa7, 0x0fb7, 0x0fe3, + 0x0ff3, 0x101a, 0x102a, 0x1041, 0x1054, 0x1062, 0x106e, 0x107c, + 0x1095, 0x10ba, 0x10d3, 0x10ea, 0x10f4, 0x1106, 0x1122, 0x114f, + 0x1155, 0x1185, 0x118d, 0x119b, 0x11af, 0x11bd, 0x11d4, 0x11ec, + 0x11f6, 0x1200, 0x120c, 0x122e, 0x123a, 0x1246, 0x1256, 0x1264, + 0x1270, 0x1292, 0x12ab, 0x12b9, 0x12cd, 0x12db, 0x1308, 0x131a, + 0x134e, 0x1378, 0x1386, 0x1394, 0x13b2, 0x13bc, 0x13c8, 0x13d0, + // Entry 100 - 13F + 0x13de, 0x13f9, 0x1405, 0x1415, 0x1434, 0x143c, 0x1448, 0x1465, + 0x1482, 0x1490, 0x14a9, 0x14c8, 0x14e1, 0x14fc, 0x1519, 0x1532, + 0x1540, 0x155b, 0x1574, 0x1589, 0x15a0, 0x15c4, 0x15df, 0x15f5, + 0x1607, 0x162e, 0x1640, 0x1648, 0x1661, 0x1676, 0x1682, 0x169b, + 0x16b6, 0x16cf, 0x16ec, + }, + }, + { // vai + "ꕉꖆꕟꖳꕯꔤꗳ ꕉꕟꔬ ꗡꕆꔓꔻꕉꔱꕭꔕꔻꕚꘋꕉꘋꔳꖶꕎ ꗪ ꕑꖜꕜꕉꕄꕞꕉꔷꕑꕇꕩꕉꕆꕯꘉꕜ ꖨꕮꕊ ꕉꘋꔳꔷꕉꖐꕞꕉꘀꘋꔳꕯꕶꕱ ꕢꕹꕎꖺꔻ" + + "ꖤꕎꖺꖬꖤꔃꔷꕩꕉꖩꕑꕉꕤꕑꔤꕧꘋꕷꔻꕇꕰ ꗪ ꗥꕤꖑꔲꕯꕑꔆꖁꔻꕑꕅꕞꗵꔼꗩꕀꗚꘋꕷꕃꕯ ꕘꖇꗂꔠꔸꕩꕑꗸꘋꖜꖩꔺꗩꕇꘋꗩꖷꕜꖜꖩ" + + "ꘉꔧꕷꔷꔲꕩꖜꕟꔘꔀꕑꕌꕮꔻꖜꕚꘋꕷꖬꕎꕯꗩꕞꖩꔻꔆꔷꔘꕪꕯꕜꖏꖐ ꗵꗞꖴꕟꔎ ꕸꖃꔀꕉꔱꔸꕪ ꗳ ꗳ ꕸꖃꔀꖏꖐꖬꔃꕤ ꖨꕮꕊꖏꔳ" + + " ꕾꕎꖏꕃ ꔳꘋꗣꔚꔷꕪꔈꖩꘋꕦꔤꕯꗛꗏꔭꕩꖏꔻꕚ ꔸꕪꕃꖳꕑꔞꔪ ꗲꔵ ꔳꘋꗣꕢꗡꖛꗐꔻꗿꕃ ꕸꖃꔀꕧꕮꔧꕀꖜꔳꕜꕇꕮꕃꖁꕆꕇꕪꖁꕆꕇ" + + "ꕪꘋ ꕸꕱꔀꕉꔷꔠꔸꕩꗡꖴꔃꗍꗡꔻꕿꕇꕰꕆꔖꕞꔀꔸꔳꕟꕐꘊꔧꔤꔳꖎꔪꕩꔱꘋ ꖨꕮꕊꔱꔤꕀꕘꔷꕃ ꖨꕮ ꔳꘋꗣꕆꖏꕇꔻꕩꖢꕟꘋꔻꕭꕷꘋ" + + "ꖕꕯꔤꗳꖶꕟꕯꕜꗘꖺꕀꕩꗱꘋꔻ ꖶꕎꕯꕭꕌꕯꕀꖜꕟꕚꕧꕓ ꖴꕎ ꖨꕮꕊꕭꔭꕩꕅꔤꕇꖶꕎꔐꖨꔅꖦꕰꕊ ꗳ ꕅꔤꕇꗥꗷꘋꖶꕎꔎꕮꕞꖶꕎꕆ" + + "ꕅꔤꕇ ꔫꕢꕴꖶꕩꕯꖽꖫꕟꖏꔓꔻꕩꕌꔤꔳꖽꘋꕭꔓꔤꖆꕇꔻꕩꕉꔓ ꖨꕮꕊꕑꕇꔻꕞꔤꕞꔤꔺꕩꔛꔟꔻ ꔤꔺꕩ ꗛꔤꘂ ꕗꕴꔀ ꕮꔤꕟꕃꔤꕟ" + + "ꘋꕉꔤꔻ ꖨꕮꕊꔤꕚꔷꕧꕮꔧꕪꗘꖺꗵꘋꔛꗨꗢꔞꕰꕃꕅꔻꕚꘋꕪꕹꔵꕩꕃꔸꕑꔳꖏꕹꖄꔻꔻꘋ ꕃꔳꔻ ꗪ ꔕꔲꔻꖏꔸꕩ ꗛꔤ ꕪꘋꗒꖏꔸꕩ" + + " ꗛꔤ ꔒꘋꗣ ꗏꖴꔃꔳꔞꔀꕮꘋ ꔳꘋꗣꕪꕤꔻꕚꘋꕞꕴꔻꔒꕑꗟꘋꔻꘋ ꖨꔻꕩꔷꗿꘋꔻꗳꘋꖬꔸ ꕞꘋꕪꕞꔤꔫꕩꔷꖇꕿꔷꖤꔃꕇꕰꗏꔻꘋꗂꖺꕞ" + + "ꔳꔲꕩꔒꔫꕩꗞꕟꖏꗞꕯꖏꖒꔷꖁꕙꕮꕜꕭꔻꕪꕮꕊꕣ ꔳꘋꗣꕮꔖꖁꕇꕰꕮꔷꕆꕩꘋꕮꗞꖐꔷꕩꗛꔤ ꕪꘋꗒ ꕮꔸꕩꕯ ꔳꘋꗣꕮꔳꕇꕃꗞꔓꔎꕇ" + + "ꕰꗞꘋꔖꕟꔳꕮꕊꕚꗞꔓꗔꕮꔷꕜꔍꕮꕞꕌꔨꘈꔻꖏꕮꔒꔻꕩꕹꕤꔭꕃꕯꕆꔫꕩꕪꔷꖁꕇꕰ ꕯꕮꕊꕯꔤꕧꗟꖺꗉ ꔳꘋꗣꕯꔤꕀꔸꕩꕇꕪꕟꖶꕎꘉꕜ" + + " ꖨꕮꕊꗟꖺꔃꕇꕐꔷꖆꖩꖸꔃꔤꔽꔤ ꖨꕮ ꕯꕮꕊꕱꕮꘋꕐꕯꕮꗨꗡꖩꗱꘋꔻ ꕶꔷꕇꔻꕩꕐꖛꕎ ꕅꔤꕇ ꕯꕮꕊꔱꔒꔪꘋꕐꕃꔻꕚꘋꕶꗷꘋꔻꘋ " + + "ꔪꘂ ꗪ ꕆꔞꗏꘋꔪꔳꕪꕆꔪꖳꕿ ꔸꖏꕐꔒꔻꔳꕯ ꔎꔒ ꕀꔤ ꗛꔤ ꕞ ꗱ ꗪ ꕭꕌꕤꕶꕿꕃꔤ ꕸꖃꔀꕐꖃꕐꕟꗝꔀꕪꕚꕌꔓꗠꖻꖄꕆꕇ" + + "ꕰꗐꖺꔻꕩꕟꖙꕡꕞꕌꖝ ꕸꖃꔀꖬꕞꔤꕮꕊꕯ ꔳꘋꗣꔖꗼꔷꖬꗵꘋꖬꔨꗵꘋꔻꕬꕶꕱꔻꘋ ꗥꔷꕯꔻꖃꔍꕇꕰꔻꖃꕙꕃꕩꔋꕩ ꕒꕌꖺ ꕸꖃꔀꕮ" + + "ꔸꖆ ꕢꘋꔻꕇꕭꕌꖇꕮꔷꕩꖬꔸꕯꔈꕢꕴ ꕿꔈ ꗪ ꕉ ꕮꔧ ꕗꕴꔀꗡꗷ ꕢꔍꗍꖺꔻꕩꘋꖬꕎꔽ ꖨꕮꕊꗋꖺꕃꔻ ꗪ ꕪꔤꖏꔻ ꔳꘋꗣꕦ" + + "ꔵꕿꖑꕚꔤ ꖨꕮꕊꕚꕀꕃꔻꕚꘋꕿꔞꖃꔎꔒ ꗃ ꔳꗞꖻꗋꖺꕃꕮꕇꔻꕚꘋꖤꕇꔻꕩꗋꕬꗋꖺꕃꖤꔸꔕꕜ ꗪ ꕿꔆꖑꕚꖣꖨꕚꔤꕎꘋꕚꘋꕤꕇꕰꖳ" + + "ꖴꔓꘋꖳꕭꕡꕶꕱꖳꔓꗝꔀꖳꗩꕃꔻꕚꘋꔻꘋ ꔲꘋꔻꘋ ꗪ ꖶꔓꕯꔵꘋ ꖸꕙꔳꕪꘋ ꕸꖃꔀꔛꔟꔻ ꗩꗡ ꗏ ꖷꖬ ꔳꘋꗣꕶꕱ ꗩꗡ ꗏ " + + "ꖷꖬ ꔳꘋꗣꗲꕇꖮꔃꕞꕙꖸꕎꖤꕎꔷꔻ ꗪ ꖢꖤꕯꕢꕹꖙꕉꔝꘈꘋꕮꗚꔎꕉꔱꔸꕪ ꗛꔤ ꔒꘋꗣ ꗏ ꕸꖃꔀꕤꔭꕩꔽꕓꖜꔃ", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0009, 0x002c, 0x0041, 0x005e, 0x0067, 0x0076, + 0x007f, 0x009c, 0x00a5, 0x00a5, 0x00b4, 0x00c4, 0x00d0, 0x00e2, + 0x00eb, 0x00eb, 0x00fd, 0x011d, 0x0129, 0x0138, 0x0144, 0x0154, + 0x0160, 0x0169, 0x0172, 0x017b, 0x017b, 0x0184, 0x0190, 0x019c, + 0x019c, 0x01a8, 0x01b4, 0x01bd, 0x01bd, 0x01c9, 0x01d5, 0x01de, + 0x01e7, 0x01e7, 0x0207, 0x0225, 0x022b, 0x023e, 0x024b, 0x025b, + 0x0261, 0x026d, 0x0276, 0x0282, 0x0282, 0x0292, 0x029b, 0x02b2, + 0x02b2, 0x02b2, 0x02c1, 0x02d1, 0x02da, 0x02da, 0x02e3, 0x02ef, + // Entry 40 - 7F + 0x02fb, 0x0314, 0x0323, 0x0323, 0x032f, 0x033e, 0x0347, 0x0347, + 0x0353, 0x035c, 0x036b, 0x036b, 0x037b, 0x0384, 0x039e, 0x03ad, + 0x03ad, 0x03b9, 0x03c2, 0x03ce, 0x03da, 0x03e6, 0x03f9, 0x03f9, + 0x0402, 0x040e, 0x0425, 0x042e, 0x0437, 0x0446, 0x045d, 0x0466, + 0x0466, 0x0475, 0x047e, 0x0491, 0x049a, 0x049a, 0x049a, 0x04a3, + 0x04af, 0x04b8, 0x04c4, 0x04c4, 0x04d3, 0x04e3, 0x04f5, 0x04f5, + 0x04fe, 0x0529, 0x0532, 0x053b, 0x054e, 0x0557, 0x0557, 0x0563, + 0x056f, 0x0578, 0x057e, 0x058d, 0x0599, 0x05a5, 0x05b1, 0x05cf, + // Entry 80 - BF + 0x05e9, 0x0607, 0x0610, 0x0626, 0x0635, 0x063e, 0x064a, 0x065a, + 0x066c, 0x067c, 0x0688, 0x0691, 0x06a0, 0x06af, 0x06bb, 0x06c4, + 0x06cd, 0x06d6, 0x06e2, 0x06e2, 0x06e2, 0x06f1, 0x0704, 0x0713, + 0x0719, 0x0725, 0x0731, 0x0731, 0x0758, 0x0764, 0x0773, 0x0782, + 0x078b, 0x0794, 0x07a0, 0x07ac, 0x07b5, 0x07c1, 0x07cd, 0x07d9, + 0x07f2, 0x07fb, 0x080e, 0x081d, 0x082c, 0x083c, 0x0845, 0x084e, + 0x0854, 0x085d, 0x0874, 0x087d, 0x0886, 0x088f, 0x08a8, 0x08c5, + 0x08d1, 0x08e0, 0x08e9, 0x0907, 0x0913, 0x0923, 0x095d, 0x0973, + // Entry C0 - FF + 0x0979, 0x0985, 0x098e, 0x098e, 0x0997, 0x09a3, 0x09a3, 0x09af, + 0x09b8, 0x09cb, 0x09e7, 0x09f0, 0x09f9, 0x0a05, 0x0a11, 0x0a21, + 0x0a30, 0x0a30, 0x0a3f, 0x0a59, 0x0a69, 0x0a75, 0x0a81, 0x0a8d, + 0x0a8d, 0x0ab3, 0x0ac6, 0x0ac6, 0x0acf, 0x0ae2, 0x0ae2, 0x0b09, + 0x0b0f, 0x0b0f, 0x0b15, 0x0b25, 0x0b37, 0x0b40, 0x0b54, 0x0b6c, + 0x0b78, 0x0b7e, 0x0b87, 0x0ba1, 0x0baa, 0x0bb6, 0x0bc5, 0x0bd1, + 0x0bda, 0x0bda, 0x0be0, 0x0bec, 0x0bfe, 0x0bfe, 0x0c29, 0x0c3f, + 0x0c64, 0x0c86, 0x0c95, 0x0ca1, 0x0cb8, 0x0cc4, 0x0cc4, 0x0ccd, + // Entry 100 - 13F + 0x0cd6, 0x0d01, 0x0d0a, 0x0d16, + }, + }, + { // vai-Latn + "AŋdóraYunaitɛ Arabhi ƐmireAfigándesitaŋAŋtígwa ƁahabhudaAŋgílaAbhaniyaAm" + + "éniyaNidɔlɛŋ AŋtiliAŋgólaAjɛŋtínaPoo SambowaƆ́situwaƆsituwéeliyaAru" + + "bhaAzabhaijaŋBhɔsiniyaBhabhedoBhangiladɛ̀shiBhɛgiyɔŋBhokina FásoBhɔg" + + "eriyaBharɛŋBhurundiBhɛniBhɛmudaBhurunɛĩBholiviyaBhurazeliBahámasiBhu" + + "taŋBhosuwanaBhɛlarusiBhelizKánádaAvorekooÁfíríka Lumaã Tɛ BoloeKóngo" + + "Suweza LumaãKódivówaKóki TiŋŋɛChéliKameruŋCháínaKɔlɔmbiyaKósíta Ríko" + + "KiyubhaKepi Vɛdi TiŋŋɛSaɛpurɔChɛki BoloeJamáĩJibhutiDanimahaDomíiník" + + "aDomíiníka ƁoloeAgiriyaƐ́kúwédɔƐsitóninyaMísélaƐriteraPanyɛĩÍtiyópiy" + + "aFiŋlɛŋFíjiFáháki Luma TiŋŋɛMikonisiyaFɛŋsiGabhɔŋYunaitɛ KíŋdɔŋGurin" + + "édaJɔɔjiyaFɛŋsi GiwanaGanaJibhurataJamba Kuwa LumaãGambiyaGiniGuwad" + + "elupeDúúnyá Tɛ GiiniHɛlɛŋGuwatɛmalaGuwamiGini BhisawoGuyanaHɔnduraKo" + + "resiyaHáitiHɔ́ngareÍndonisiyaÁre LumaãBhanísiláilaÍndiyaJengéesi Gba" + + "woe Índiya Kɔiyɛ LɔIrakiIraŋÁisi LumaãÍtaliJamaikaJɔɔdaŋJapaŋKényaKi" + + "gisitaŋKaŋbhodiyaKiribhatiKomorosiSiŋ Kisi ɓɛ́ NevisiKoriya Kɔi Kaŋn" + + "dɔKoriya Kɔi Leŋŋɛ LɔKuwetiKeemaŋ TiŋŋɛKazasitaŋLawosiLebhanɔSiŋ Lus" + + "iyaSuri LaŋkaLaibhiyaLisótoLituweninyaLusimbɔLativiyaLebhiyaMɔrokoMɔ" + + "nakoMɔlidovaMadagasitaMasha TiŋŋɛMasedoninyaMaliMiyamahaMɔngoliyaKɔi" + + " Kaŋndɔ Mariyana TiŋŋɛMatinikiMɔretaninyaMɔseratiMalitaMɔreshɔMalida" + + "viMalawiMɛsíkoMalesiyaMozambikiNamibiyaKalidoninya NámaáNaĩjaNɔfɔ Ti" + + "ŋŋɛNaĩjiriyaNikaraguwaNidɔlɛŋNɔɔweNepaNoruNiweZilɛŋ NámaáOmaŋPanama" + + "PɛruFɛŋsi PolinísiyaPapuwa Gini NámaáFélepiŋPakisitaŋPólɛŋSiŋ Piiyɛ " + + "ɓɛ́ MikelɔŋPitikɛŋPiyuto RikoPalesitininya Tele Jii Kɔiyɛ lá hĩ Gaz" + + "aPotokíiPaloParagɔeKatahaRenyɔɔ̃RomininyaRɔshiyaRawundaLahabuSulaima" + + "ãna TiŋŋɛSeshɛɛSudɛŋSuwidɛŋSíingapooSiŋ HɛlinaSuloveninyaSulovakiya" + + "Gbeya BahawɔSaŋ MarindoSinigahaSomaliyaSurinambeSawo Tombe ɓɛ a Gbaw" + + "oeƐlɛ SávádɔSíyaŋSuwazi LumaãTukisi ɓɛ̀ Kaikóosi TiŋŋɛChádiTogoTai L" + + "umaãTajikisitaŋTokeloTele Ɓɔ́ Timɔɔ̃TukimɛnisitaŋTunisiyaTɔngaTɔ́ɔ́k" + + "iTurindeda ɓɛ́ TobhegoTuváluTaiwaŋTaŋzaninyaYukuréŋYugandaPooYuwegɔw" + + "eYubhɛkisitaŋVatikaŋ ƁoloeSiŋ ViŋsiVɛnɛzuwelaJengéesi Bhɛɛ Lɔ Musu T" + + "iŋŋɛPoo Bhɛɛ lɔ Musu TiŋŋɛViyanamiVanuwátuWalísiSamowaYemɛniMavoteAf" + + "irika Kɔi Leŋŋɛ LɔZambiyaZimbabhuwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0008, 0x001e, 0x002d, 0x0041, 0x0049, 0x0051, + 0x0059, 0x006b, 0x0073, 0x0073, 0x007e, 0x0089, 0x0093, 0x00a1, + 0x00a7, 0x00a7, 0x00b2, 0x00bc, 0x00c4, 0x00d4, 0x00df, 0x00ec, + 0x00f6, 0x00fe, 0x0106, 0x010c, 0x010c, 0x0114, 0x011e, 0x0127, + 0x0127, 0x0130, 0x0139, 0x0140, 0x0140, 0x0149, 0x0153, 0x0159, + 0x0161, 0x0161, 0x0169, 0x0184, 0x018a, 0x0197, 0x01a1, 0x01af, + 0x01b5, 0x01bd, 0x01c5, 0x01d0, 0x01d0, 0x01de, 0x01e5, 0x01f8, + 0x01f8, 0x01f8, 0x0201, 0x020d, 0x0214, 0x0214, 0x021b, 0x0223, + // Entry 40 - 7F + 0x022e, 0x0240, 0x0247, 0x0247, 0x0254, 0x0260, 0x0268, 0x0268, + 0x0270, 0x0278, 0x0283, 0x0283, 0x028c, 0x0291, 0x02a7, 0x02b1, + 0x02b1, 0x02b8, 0x02c0, 0x02d3, 0x02dc, 0x02e5, 0x02f3, 0x02f3, + 0x02f7, 0x0300, 0x0311, 0x0318, 0x031c, 0x0326, 0x0339, 0x0341, + 0x0341, 0x034c, 0x0352, 0x035e, 0x0364, 0x0364, 0x0364, 0x036c, + 0x0374, 0x037a, 0x0384, 0x0384, 0x038f, 0x039a, 0x03a8, 0x03a8, + 0x03af, 0x03d3, 0x03d8, 0x03dd, 0x03e9, 0x03ef, 0x03ef, 0x03f6, + 0x03ff, 0x0405, 0x040b, 0x0415, 0x0420, 0x0429, 0x0431, 0x0448, + // Entry 80 - BF + 0x045c, 0x0474, 0x047a, 0x048a, 0x0494, 0x049a, 0x04a2, 0x04ad, + 0x04ad, 0x04b8, 0x04c0, 0x04c7, 0x04d2, 0x04da, 0x04e2, 0x04e9, + 0x04f0, 0x04f7, 0x0500, 0x0500, 0x0500, 0x050a, 0x0518, 0x0523, + 0x0527, 0x052f, 0x0539, 0x0539, 0x0558, 0x0560, 0x056c, 0x0575, + 0x057b, 0x0584, 0x058c, 0x0592, 0x059a, 0x05a2, 0x05ab, 0x05b3, + 0x05c6, 0x05cc, 0x05db, 0x05e5, 0x05ef, 0x05f9, 0x0600, 0x0604, + 0x0608, 0x060c, 0x061b, 0x0620, 0x0626, 0x062b, 0x063e, 0x0651, + 0x065a, 0x0664, 0x066c, 0x0688, 0x0691, 0x069c, 0x06c7, 0x06cf, + // Entry C0 - FF + 0x06d3, 0x06db, 0x06e1, 0x06e1, 0x06eb, 0x06f4, 0x06f4, 0x06fc, + 0x0703, 0x0709, 0x071d, 0x0725, 0x072c, 0x0735, 0x073f, 0x074b, + 0x0756, 0x0756, 0x0760, 0x076d, 0x0779, 0x0781, 0x0789, 0x0792, + 0x0792, 0x07aa, 0x07b9, 0x07b9, 0x07c0, 0x07cd, 0x07cd, 0x07ed, + 0x07f3, 0x07f3, 0x07f7, 0x0801, 0x080d, 0x0813, 0x0828, 0x0837, + 0x083f, 0x0845, 0x0850, 0x0868, 0x086f, 0x0876, 0x0881, 0x088a, + 0x0891, 0x0891, 0x0894, 0x089d, 0x08ab, 0x08ba, 0x08c5, 0x08d1, + 0x08f3, 0x090f, 0x0917, 0x0920, 0x0927, 0x092d, 0x092d, 0x0934, + // Entry 100 - 13F + 0x093a, 0x0953, 0x095a, 0x0964, + }, + }, + { // vi + viRegionStr, + viRegionIdx, + }, + { // vun + "AndoraFalme za KiarabuAfuganistaniAntigua na BarbudaAnguillaAlbaniaArmen" + + "iaAntili za UholanziAngolaAjentinaSamoa ya MarekaniAustriaAustraliaA" + + "rubaAzabajaniBosnia na HezegovinaBabadosiBangladeshiUbelgijiBukinafa" + + "soBulgariaBahareniBurundiBeniniBermudaBruneiBoliviaBraziliBahamaButa" + + "niBotswanaBelarusiBelizeKanadaJamhuri ya Kidemokrasia ya KongoJamhur" + + "i ya Afrika ya KatiKongoUswisiKodivaaVisiwa vya CookChileKameruniChi" + + "naKolombiaKostarikaKubaKepuvedeKuprosiJamhuri ya ChekiUjerumaniJibut" + + "iDenmakiDominikaJamhuri ya DominikaAljeriaEkwadoEstoniaMisriEritreaH" + + "ispaniaUhabeshiUfiniFijiVisiwa vya FalklandMikronesiaUfaransaGaboniU" + + "ingerezaGrenadaJojiaGwiyana ya UfaransaGhanaJibraltaGrinlandiGambiaG" + + "ineGwadelupeGinekwetaUgirikiGwatemalaGwamGinebisauGuyanaHondurasiKor" + + "asiaHaitiHungariaIndonesiaAyalandiIsraeliIndiaEneo la Uingereza kati" + + "ka Bahari HindiIrakiUajemiAislandiItaliaJamaikaYordaniJapaniKenyaKir" + + "igizistaniKambodiaKiribatiKomoroSantakitzi na NevisKorea KaskaziniKo" + + "rea KusiniKuwaitiVisiwa vya KaymanKazakistaniLaosiLebanoniSantalusia" + + "LishenteniSirilankaLiberiaLesotoLitwaniaLasembagiLativiaLibyaMorokoM" + + "onakoMoldovaBukiniVisiwa vya MarshalMasedoniaMaliMyamaMongoliaVisiwa" + + " vya Mariana vya KaskaziniMartinikiMoritaniaMontserratiMaltaMorisiMo" + + "divuMalawiMeksikoMalesiaMsumbijiNamibiaNyukaledoniaNijeriKisiwa cha " + + "NorfokNijeriaNikaragwaUholanziNorweNepaliNauruNiueNyuzilandiOmaniPan" + + "amaPeruPolinesia ya UfaransaPapuaFilipinoPakistaniPolandiSantapieri " + + "na MikeloniPitkairniPwetorikoUkingo wa Magharibi na Ukanda wa Gaza w" + + "a PalestinaUrenoPalauParagwaiKatariRiyunioniRomaniaUrusiRwandaSaudiV" + + "isiwa vya SolomonShelisheliSudaniUswidiSingapooSantahelenaSloveniaSl" + + "ovakiaSiera LeoniSamarinoSenegaliSomaliaSurinamuSao Tome na Principe" + + "ElsavadoSiriaUswaziVisiwa vya Turki na KaikoChadiTogoTailandiTajikis" + + "taniTokelauTimori ya MasharikiTurukimenistaniTunisiaTongaUturukiTrin" + + "idad na TobagoTuvaluTaiwaniTanzaniaUkrainiUgandaMarekaniUrugwaiUzibe" + + "kistaniVatikaniSantavisenti na GrenadiniVenezuelaVisiwa vya Virgin v" + + "ya UingerezaVisiwa vya Virgin vya MarekaniVietinamuVanuatuWalis na F" + + "utunaSamoaYemeniMayotteAfrika KusiniZambiaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x0016, 0x0022, 0x0034, 0x003c, 0x0043, + 0x004a, 0x005c, 0x0062, 0x0062, 0x006a, 0x007b, 0x0082, 0x008b, + 0x0090, 0x0090, 0x0099, 0x00ad, 0x00b5, 0x00c0, 0x00c8, 0x00d2, + 0x00da, 0x00e2, 0x00e9, 0x00ef, 0x00ef, 0x00f6, 0x00fc, 0x0103, + 0x0103, 0x010a, 0x0110, 0x0116, 0x0116, 0x011e, 0x0126, 0x012c, + 0x0132, 0x0132, 0x0152, 0x016b, 0x0170, 0x0176, 0x017d, 0x018c, + 0x0191, 0x0199, 0x019e, 0x01a6, 0x01a6, 0x01af, 0x01b3, 0x01bb, + 0x01bb, 0x01bb, 0x01c2, 0x01d2, 0x01db, 0x01db, 0x01e1, 0x01e8, + // Entry 40 - 7F + 0x01f0, 0x0203, 0x020a, 0x020a, 0x0210, 0x0217, 0x021c, 0x021c, + 0x0223, 0x022b, 0x0233, 0x0233, 0x0238, 0x023c, 0x024f, 0x0259, + 0x0259, 0x0261, 0x0267, 0x0270, 0x0277, 0x027c, 0x028f, 0x028f, + 0x0294, 0x029c, 0x02a5, 0x02ab, 0x02af, 0x02b8, 0x02c1, 0x02c8, + 0x02c8, 0x02d1, 0x02d5, 0x02de, 0x02e4, 0x02e4, 0x02e4, 0x02ed, + 0x02f4, 0x02f9, 0x0301, 0x0301, 0x030a, 0x0312, 0x0319, 0x0319, + 0x031e, 0x0343, 0x0348, 0x034e, 0x0356, 0x035c, 0x035c, 0x0363, + 0x036a, 0x0370, 0x0375, 0x0382, 0x038a, 0x0392, 0x0398, 0x03ab, + // Entry 80 - BF + 0x03ba, 0x03c6, 0x03cd, 0x03de, 0x03e9, 0x03ee, 0x03f6, 0x0400, + 0x040a, 0x0413, 0x041a, 0x0420, 0x0428, 0x0431, 0x0438, 0x043d, + 0x0443, 0x0449, 0x0450, 0x0450, 0x0450, 0x0456, 0x0468, 0x0471, + 0x0475, 0x047a, 0x0482, 0x0482, 0x04a2, 0x04ab, 0x04b4, 0x04bf, + 0x04c4, 0x04ca, 0x04d0, 0x04d6, 0x04dd, 0x04e4, 0x04ec, 0x04f3, + 0x04ff, 0x0505, 0x0516, 0x051d, 0x0526, 0x052e, 0x0533, 0x0539, + 0x053e, 0x0542, 0x054c, 0x0551, 0x0557, 0x055b, 0x0570, 0x0575, + 0x057d, 0x0586, 0x058d, 0x05a3, 0x05ac, 0x05b5, 0x05e7, 0x05ec, + // Entry C0 - FF + 0x05f1, 0x05f9, 0x05ff, 0x05ff, 0x0608, 0x060f, 0x060f, 0x0614, + 0x061a, 0x061f, 0x0631, 0x063b, 0x0641, 0x0647, 0x064f, 0x065a, + 0x0662, 0x0662, 0x066a, 0x0675, 0x067d, 0x0685, 0x068c, 0x0694, + 0x0694, 0x06a8, 0x06b0, 0x06b0, 0x06b5, 0x06bb, 0x06bb, 0x06d4, + 0x06d9, 0x06d9, 0x06dd, 0x06e5, 0x06f0, 0x06f7, 0x070a, 0x0719, + 0x0720, 0x0725, 0x072c, 0x073e, 0x0744, 0x074b, 0x0753, 0x075a, + 0x0760, 0x0760, 0x0768, 0x076f, 0x077b, 0x0783, 0x079c, 0x07a5, + 0x07c4, 0x07e2, 0x07eb, 0x07f2, 0x0801, 0x0806, 0x0806, 0x080c, + // Entry 100 - 13F + 0x0813, 0x0820, 0x0826, 0x082e, + }, + }, + { // wae + "HimmelfártsinslaAndorraVereinigti Arabiše EmiratAfganištanAntigua und Ba" + + "rbudaAnguillaAlbanieArmenieHoländiši AntilläAngolaAntarktisArgentini" + + "eAmerikaniš SamoaÖštričAustralieArubaAlandinsläAserbaidšanBosnie und" + + " HerzegovinaBarbadosBangladešBelgieBurkina FasoBulgarieBačrainBurund" + + "iBeninSt. Bartholomäus-InslaBermudaBruneiBoliwieBrasilieBahamasBhuta" + + "nBouvetinslaBotswanaWísrusslandBelizeKanadaKokosinsläKongo-KinshasaZ" + + "entralafrikaniši RebublikKongo BrazzavilleSchwizElfebeiküštaCookinsl" + + "äTšileKamerunChinaKolumbieClipperton InslaCosta RicaKubaKap VerdeWi" + + "enäčtsinsläZypreTšečieTitšlandDiego GarciaDšibutiDänemarkDoninicaDom" + + "inikaniši RebublikAlgerieCeuta und MelillaEcuadorEštlandEgypteWeštsa" + + "haraEritreaSchpanieEthiopieEuropäiši UnioFinnlandFidšiFalklandinsläM" + + "ikronesieFäröeFrankričGabonEnglandGrenadaGeorgieFranzösiš GuianaGuer" + + "nseyGanaGibraltarGrönlandGambiaGineaGuadeloupeEquatorialgineaGričela" + + "ndSüdgeorgie und d’südliče SenwičinsläGuatemalaGuamGinea BissauGuyan" + + "aSonderverwaltigszona HongkongHeard- und McDonald-InsläHondurasKroat" + + "ieHaitiUngareKanariše InsläIndonesieIrlandIsraelIsle of ManIndieBrit" + + "išes Territorium em indiše OzeanIrakIranIslandItalieJerseyJamaikaJor" + + "danieJapanKenyaKirgištanKambodšaKiribatiKomoreSt. Kitts und NevisNor" + + "dkoreaSüdkoreaKuweitKaimaninsläKasačstanLaosLibanonSt. LuciaLiečtešt" + + "eiSri LankaLiberiaLesothoLitaueLuxeburgLettlandLübieMarokoMonagoMold" + + "auMontenegroSt. MartinMadagaskarMaršalinsläMazedonieMaliBurmaMongole" + + "iSonderverwaltigszona MakauNördliči MarianeMartiniqueMauretanieMonse" + + "rratMaltaMauritiusMalediweMalawiMexikoMalaysiaMosambikNamibiaNiwkale" + + "donieNigerNorfolkinslaNigeriaNicaraguaHolandNorwägeNepalNauruNiueNiw" + + "sélandOmanPanamaPeruFranzösiš PolinesiePapua NiwgineaPhilippinePakiš" + + "tanPoleSt. Pierre und MiquelonPitcairnPuerto RicoPaleštinaPortugalPa" + + "lauParaguaiKatarÜssers OzeanieRéunionRumänieSerbieRusslandRuandaSaud" + + "i ArabieSalomoneSečelleSudanSchwedeSingapurSt. HelenaSlowenieSvalbar" + + "d und Jan MayenSlowakeiSierra LeoneSan MarinoSenegalSomaliaSurinameS" + + "ão Tomé and PríncipeEl SalvadorSürieSwasilandTristan da CunhaTurks-" + + " und CaicosinsläTšadFranzösiši Süd- und AntarktisgebietTogoThailandT" + + "adšikistanTokelauOšttimorTurkmeništanTunesieTongaTürkeiTrinidad und " + + "TobagoTuvaluTaiwanTansaniaUkraineUgandaAmerikaniš OzeanieAmerikaUrug" + + "auyUsbekištanVatikanSt. Vincent und d’GrenadineVenezuelaBritiši Jung" + + "fröiwinsläAmerikaniši JungfröiwinsläVietnamVanuatuWallis und FutunaS" + + "amoaJémeMoyetteSüdafrikaSambiaSimbabweUnbekannti RegioWäldAfrikaNord" + + "amerikaSüdamerikaOzeanieWeštafrikaZentralamerikaOštafrikaNordafrikaM" + + "ittelafrikaSüdličs AfrikaAmerikaniš KontinäntNördličs AmerikaKaribik" + + "OštasieSüdasieSüdoštasieSüdeuropaAuštralie und NiwsélandMelanesieMik" + + "ronesišes InselgebietPolinesieAsieZentralasieWeštasieEuropaOšteuropa" + + "NordeuropaWešteuropaLatíamerika", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0011, 0x0018, 0x0032, 0x003d, 0x0050, 0x0058, 0x005f, + 0x0066, 0x007a, 0x0080, 0x0089, 0x0093, 0x00a4, 0x00ad, 0x00b6, + 0x00bb, 0x00c6, 0x00d2, 0x00e8, 0x00f0, 0x00fa, 0x0100, 0x010c, + 0x0114, 0x011c, 0x0123, 0x0128, 0x013f, 0x0146, 0x014c, 0x0153, + 0x0153, 0x015b, 0x0162, 0x0168, 0x0173, 0x017b, 0x0187, 0x018d, + 0x0193, 0x019e, 0x01ac, 0x01c7, 0x01d8, 0x01de, 0x01ec, 0x01f6, + 0x01fc, 0x0203, 0x0208, 0x0210, 0x0220, 0x022a, 0x022e, 0x0237, + 0x0237, 0x0247, 0x024c, 0x0254, 0x025d, 0x0269, 0x0271, 0x027a, + // Entry 40 - 7F + 0x0282, 0x0298, 0x029f, 0x02b0, 0x02b7, 0x02bf, 0x02c5, 0x02d0, + 0x02d7, 0x02df, 0x02e7, 0x02f7, 0x02ff, 0x0305, 0x0313, 0x031d, + 0x0324, 0x032d, 0x0332, 0x0339, 0x0340, 0x0347, 0x0359, 0x0361, + 0x0365, 0x036e, 0x0377, 0x037d, 0x0382, 0x038c, 0x039b, 0x03a5, + 0x03d0, 0x03d9, 0x03dd, 0x03e9, 0x03ef, 0x040c, 0x0426, 0x042e, + 0x0435, 0x043a, 0x0440, 0x0450, 0x0459, 0x045f, 0x0465, 0x0470, + 0x0475, 0x049b, 0x049f, 0x04a3, 0x04a9, 0x04af, 0x04b5, 0x04bc, + 0x04c4, 0x04c9, 0x04ce, 0x04d8, 0x04e1, 0x04e9, 0x04ef, 0x0502, + // Entry 80 - BF + 0x050b, 0x0514, 0x051a, 0x0526, 0x0530, 0x0534, 0x053b, 0x0544, + 0x0550, 0x0559, 0x0560, 0x0567, 0x056d, 0x0575, 0x057d, 0x0583, + 0x0589, 0x058f, 0x0595, 0x059f, 0x05a9, 0x05b3, 0x05c0, 0x05c9, + 0x05cd, 0x05d2, 0x05da, 0x05f4, 0x0606, 0x0610, 0x061a, 0x0623, + 0x0628, 0x0631, 0x0639, 0x063f, 0x0645, 0x064d, 0x0655, 0x065c, + 0x0668, 0x066d, 0x0679, 0x0680, 0x0689, 0x068f, 0x0697, 0x069c, + 0x06a1, 0x06a5, 0x06af, 0x06b3, 0x06b9, 0x06bd, 0x06d2, 0x06e0, + 0x06ea, 0x06f3, 0x06f7, 0x070e, 0x0716, 0x0721, 0x072b, 0x0733, + // Entry C0 - FF + 0x0738, 0x0740, 0x0745, 0x0754, 0x075c, 0x0764, 0x076a, 0x0772, + 0x0778, 0x0784, 0x078c, 0x0794, 0x0799, 0x07a0, 0x07a8, 0x07b2, + 0x07ba, 0x07d0, 0x07d8, 0x07e4, 0x07ee, 0x07f5, 0x07fc, 0x0804, + 0x0804, 0x081c, 0x0827, 0x0827, 0x082d, 0x0836, 0x0846, 0x085d, + 0x0862, 0x0888, 0x088c, 0x0894, 0x08a0, 0x08a7, 0x08b0, 0x08bd, + 0x08c4, 0x08c9, 0x08d0, 0x08e3, 0x08e9, 0x08ef, 0x08f7, 0x08fe, + 0x0904, 0x0917, 0x091e, 0x0925, 0x0930, 0x0937, 0x0954, 0x095d, + 0x0976, 0x0993, 0x099a, 0x09a1, 0x09b2, 0x09b7, 0x09b7, 0x09bc, + // Entry 100 - 13F + 0x09c3, 0x09cd, 0x09d3, 0x09db, 0x09eb, 0x09f0, 0x09f6, 0x0a01, + 0x0a0c, 0x0a13, 0x0a1e, 0x0a2c, 0x0a36, 0x0a40, 0x0a4c, 0x0a5c, + 0x0a72, 0x0a84, 0x0a8b, 0x0a93, 0x0a9b, 0x0aa7, 0x0ab1, 0x0aca, + 0x0ad3, 0x0aec, 0x0af5, 0x0af9, 0x0b04, 0x0b0d, 0x0b13, 0x0b1d, + 0x0b27, 0x0b32, 0x0b3e, + }, + }, + { // xog + "AndoraEmireetiAfaganisitaniAntigwa ni BarabudaAngwilaAlibaniyaArameniyaE" + + "bizinga bya Antile by’abaHolandiAngolaArigentinaSamowa omumerikaAwus" + + "ituriyaAwusitureliyaArubaAzerebayijaaniBoziniya HezegovinaBarabadosi" + + "BangaladesiBubirigiBurukina FasoBulugariyaBaareeniBurundiBeniniBerem" + + "udaBurunayiBoliviyaBuraziiriBahamasiButaaniBotiswanaBelarusiBelizeKa" + + "nadaKongo - ZayireLipabulika ya SenturafirikiKongoSwitizirandiKote D" + + "ivwaEbizinga bya KkukiCileKameruuniCayinaKolombyaKosita RikaCubaEbiz" + + "inga bya Kepu VerediSipuriyaLipabulika ya CeekaBudaakiJjibutiDenimaa" + + "kaDominikaLipabulika ya DominikaAligeryaEkwadoEsitoniyaMisiriEriture" + + "yaSipeyiniEsyopyaFinilandiFijiEbiizinga bya FalikalandiMikuronezyaBu" + + "falansaGaboniBungerezaGurenadaGyogyaGuyana enfalansaGanaGiburalitaGu" + + "renelandiGambyaGiniGwadalupeGayana yaku ekwetaBuyonaaniGwatemalaGwam" + + "uGini-BisawuGayanaHundurasiKurowesyaHayitiHangareYindonezyaAyalandiY" + + "isirayeriBuyindiEbizinga bya CagoYiraakaYiraaniAyisirandiYitaleJamay" + + "ikaYorodaniJapaniKenyaKirigizisitaaniKambodyaKiribatiEbizinga bya Ko" + + "moroSenti Kitisi ne NevisiKoreya eya mumambukaKoreya eya mumaserenge" + + "taKuwetiEbizinga bya KayimaaniKazakisitaaniLawosiLebanoniSenti Luciy" + + "aLicitensitayiniSirilankaLiberyaLesosoLisuwenyaLukisembaagaLativyaLi" + + "byaMorokoMonakoMolodovaMadagasikaBizinga bya MarisoMasedoniyaMaliMya" + + "nimaMongoliyaBizinga bya Mariyana ebyamumambukaMaritiniikiMawuliteny" + + "aMonteseraatiMalitaMawulisyasiEbizinga bya MalidiveMalawiMekisikoMal" + + "ezyaMozambiikiNamibiyaKaledonya mupyaNijeKizinga ky’eNorofokoNayijer" + + "yaNikaraguwaHolandiNoweNepaloNawuruNiyuweNiyuziirandiOmaaniPanamaPer" + + "uPolinesiya enfalansaPapwa NyuginiEbizinga bya FiripinoPakisitaaniPo" + + "landiSenti Piyere ni MikeloniPitikeeniPotorikoPalesitayini ni GazaPo" + + "tugaaliPalawuParagwayiKataaLeyunyoniLomaniyaLasaRwandaSawudarebyaEbi" + + "zanga bya SolomooniSesereSudaaniSwideniSingapowaSenti HerenaSiroveny" + + "aSirovakyaSiyeralewoneSanimarinoSenegaaloSomaliyaSurinaamuSanitome n" + + "i PurincipeEl salivadoSiriyaSwazirandiEbizinga bya Taaka ni Kayikosi" + + "CaadiTogoTayirandiTajikisitaaniTokelawuTimowaTakimenesitaaniTunisyaT" + + "ongaTtakeTurindaadi ni TobagoTuvaluTayiwaniYukurayineYugandaAmerikaW" + + "urugwayiWuzibekisitaaniVatikaaniSenti Vinsenti ni GurendadiiniVenzwe" + + "raEbizinga bya Virigini ebitwalibwa BungerezaEbizinga bya Virigini e" + + "by’AmerikaVyetinaamuVanawuwatuWalisi ni FutunaSamowaYemeniMayotteSaw" + + "usafirikaZambyaZimbabwe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0006, 0x000e, 0x001b, 0x002e, 0x0035, 0x003e, + 0x0047, 0x006a, 0x0070, 0x0070, 0x007a, 0x008a, 0x0095, 0x00a2, + 0x00a7, 0x00a7, 0x00b5, 0x00c8, 0x00d2, 0x00dd, 0x00e5, 0x00f2, + 0x00fc, 0x0104, 0x010b, 0x0111, 0x0111, 0x0119, 0x0121, 0x0129, + 0x0129, 0x0132, 0x013a, 0x0141, 0x0141, 0x014a, 0x0152, 0x0158, + 0x015e, 0x015e, 0x016c, 0x0187, 0x018c, 0x0198, 0x01a2, 0x01b4, + 0x01b8, 0x01c1, 0x01c7, 0x01cf, 0x01cf, 0x01da, 0x01de, 0x01f6, + 0x01f6, 0x01f6, 0x01fe, 0x0211, 0x0218, 0x0218, 0x021f, 0x0228, + // Entry 40 - 7F + 0x0230, 0x0246, 0x024e, 0x024e, 0x0254, 0x025d, 0x0263, 0x0263, + 0x026c, 0x0274, 0x027b, 0x027b, 0x0284, 0x0288, 0x02a1, 0x02ac, + 0x02ac, 0x02b5, 0x02bb, 0x02c4, 0x02cc, 0x02d2, 0x02e2, 0x02e2, + 0x02e6, 0x02f0, 0x02fb, 0x0301, 0x0305, 0x030e, 0x0320, 0x0329, + 0x0329, 0x0332, 0x0337, 0x0342, 0x0348, 0x0348, 0x0348, 0x0351, + 0x035a, 0x0360, 0x0367, 0x0367, 0x0371, 0x0379, 0x0383, 0x0383, + 0x038a, 0x039b, 0x03a2, 0x03a9, 0x03b3, 0x03b9, 0x03b9, 0x03c1, + 0x03c9, 0x03cf, 0x03d4, 0x03e3, 0x03eb, 0x03f3, 0x0406, 0x041c, + // Entry 80 - BF + 0x0430, 0x0448, 0x044e, 0x0464, 0x0471, 0x0477, 0x047f, 0x048b, + 0x049a, 0x04a3, 0x04aa, 0x04b0, 0x04b9, 0x04c5, 0x04cc, 0x04d1, + 0x04d7, 0x04dd, 0x04e5, 0x04e5, 0x04e5, 0x04ef, 0x0501, 0x050b, + 0x050f, 0x0516, 0x051f, 0x051f, 0x0541, 0x054c, 0x0557, 0x0563, + 0x0569, 0x0574, 0x0589, 0x058f, 0x0597, 0x059e, 0x05a8, 0x05b0, + 0x05bf, 0x05c3, 0x05d9, 0x05e2, 0x05ec, 0x05f3, 0x05f7, 0x05fd, + 0x0603, 0x0609, 0x0615, 0x061b, 0x0621, 0x0625, 0x0639, 0x0646, + 0x065b, 0x0666, 0x066d, 0x0685, 0x068e, 0x0696, 0x06aa, 0x06b3, + // Entry C0 - FF + 0x06b9, 0x06c2, 0x06c7, 0x06c7, 0x06d0, 0x06d8, 0x06d8, 0x06dc, + 0x06e2, 0x06ed, 0x0703, 0x0709, 0x0710, 0x0717, 0x0720, 0x072c, + 0x0735, 0x0735, 0x073e, 0x074a, 0x0754, 0x075d, 0x0765, 0x076e, + 0x076e, 0x0783, 0x078e, 0x078e, 0x0794, 0x079e, 0x079e, 0x07bc, + 0x07c1, 0x07c1, 0x07c5, 0x07ce, 0x07db, 0x07e3, 0x07e9, 0x07f8, + 0x07ff, 0x0804, 0x0809, 0x081d, 0x0823, 0x082b, 0x082b, 0x0835, + 0x083c, 0x083c, 0x0843, 0x084c, 0x085b, 0x0864, 0x0882, 0x088a, + 0x08b5, 0x08d8, 0x08e2, 0x08ec, 0x08fc, 0x0902, 0x0902, 0x0908, + // Entry 100 - 13F + 0x090f, 0x091b, 0x0921, 0x0929, + }, + }, + { // yav + "Aŋtúlaimiláat i paaláapAfkanistáŋAŋtíka na PalpútaAŋkílaAlpaníAlmaníaand" + + "íiy u nitililáandAŋkúlaAlsaŋtínSámua u AmelíkaOtilísOtalalíAlúpaAsɛ" + + "lpaisáŋPusiní-ɛlkofínaPalpatósPaŋkalatɛsPɛlsíikPulikínafásóPulukalíi" + + "PalɛŋPúlúndíPenɛŋPɛlmútaPulunéyPolífiaPilesílPahámasPutaŋPosuánaPela" + + "lúsPelíseKánátakitɔŋ kí kongóSantalafilíikKongósuwíisKótifualɛKúukeS" + + "ilíKemelúnSíineKɔlɔ́mbíaKóstálíkakúpaKápfɛlsíplɛkitɔŋ kí cɛ́knsámans" + + "íputítanemálktúmúnékekitɔŋ kí tumunikɛ́ŋAlselíekuatɛ́lɛstoniisípite" + + "litéepanyáetiopífɛnlándfísimaluwínmikolonesífelensíkapɔ́ŋingilíískel" + + "enáatsɔlsíikuyáan u felensíkanásílpalatáalkuluɛnlándkambíikiinékuate" + + "lúupkinéekuatolialkilɛ́ɛkkuatemalákuamiɛkiinépisaókuyáanɔndúlasKolow" + + "asíiayítiɔngilíɛndonesíililándísilayɛ́lɛ́ɛndKɔɔ́m kí ndián yi ngilís" + + "ilákiláŋisláanditalísamayíiksɔltanísapɔ́ɔŋkéniakilikisistáŋKámbóseki" + + "lipatíKɔmɔ́ɔlsɛ́ŋkilistɔ́f eniɛ́fkɔlé u muɛnɛ́kɔlé wu mbátkowéetKáyí" + + "manɛkasaksitáŋlawóslipáŋsɛ́ŋtɛ́lusílístɛ́nsitáyinsilíláŋkalipéliales" + + "otólitiyaníliksambúulletonílipíimalóokmonakómoltafímatakaskáalílmala" + + "sáalmasetuánmalímiaŋmáalmongolíil maliyanɛ u muɛnɛ́maltiníikmolitaní" + + "mɔŋsilámálɛ́tmolísmaletíifmalawímɛksíikmalesímosambíknamipínufɛ́l ka" + + "letonínisɛ́ɛlil nɔ́lfɔ́lɔknisélianikalakánitililáandnɔlfɛ́ɛsnepáalna" + + "wulúniyuwénufɛ́l seláandomáŋpanamápelúpolinesí u felensípapuasí nufɛ" + + "́l kiinéfilipíinpakistáŋpɔlɔ́ɔnysɛ́ŋpiɛ́l e mikelɔ́ŋpitikɛ́ɛlínɛ́pó" + + "lótolíkokitɔŋ ki palɛstíinpɔltukáalpalawúpalakúékatáalelewuniɔ́ŋulum" + + "aníulusíuluándáalapísawutíitil salomɔ́ŋsesɛ́ɛlsutáaŋsuɛ́tsingapúulsɛ" + + "́ŋtɛ́ elɛ́ɛnɛsilofenísilofakísieláleyɔ́ɔnsan malínosenekáalsomalísu" + + "lináamsáwó tomé e pelensípesalfatɔ́ɔlsuasiláandtúluk na káyiikSáatto" + + "kótayiláandtasikistáaŋtokelótimɔ́ɔl u nipálɛ́ntulukmenisitáaŋtunusít" + + "ɔ́ŋkatulukíitilinitáat na tupákɔtufalútayiwáantaŋsaníukilɛ́ɛnukánda" + + "amálíkaulukuéyusupekistáaŋfatikáaŋsɛ́ŋ fɛŋsáŋ elekelenatíinfenesuwel" + + "áFilisíin ungilíspindisúlɛ́ pi amálíkafiɛtnáamfanuatúwalíis na futú" + + "nasamowáyémɛnmayɔ́ɔtafilí mbátɛ́saambíisimbapuwé", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0008, 0x001b, 0x0027, 0x003b, 0x0043, 0x004a, + 0x0052, 0x0068, 0x0070, 0x0070, 0x007a, 0x008b, 0x0092, 0x009a, + 0x00a0, 0x00a0, 0x00ad, 0x00bf, 0x00c8, 0x00d4, 0x00dd, 0x00ec, + 0x00f6, 0x00fd, 0x0107, 0x010e, 0x010e, 0x0117, 0x011f, 0x0127, + 0x0127, 0x012f, 0x0137, 0x013d, 0x013d, 0x0145, 0x014d, 0x0154, + 0x015c, 0x015c, 0x016e, 0x017c, 0x0182, 0x0189, 0x0194, 0x019a, + 0x019f, 0x01a7, 0x01ad, 0x01ba, 0x01ba, 0x01c6, 0x01cb, 0x01d3, + 0x01d3, 0x01d3, 0x01da, 0x01ec, 0x01f3, 0x01f3, 0x01fb, 0x0204, + // Entry 40 - 7F + 0x020f, 0x0228, 0x022f, 0x022f, 0x0239, 0x0240, 0x0247, 0x0247, + 0x024e, 0x0254, 0x025b, 0x025b, 0x0264, 0x0269, 0x0271, 0x027c, + 0x027c, 0x0284, 0x028d, 0x0297, 0x02a0, 0x02a8, 0x02ba, 0x02ba, + 0x02bf, 0x02cc, 0x02d8, 0x02df, 0x02e5, 0x02ef, 0x02fe, 0x0308, + 0x0308, 0x0312, 0x0319, 0x0325, 0x032c, 0x032c, 0x032c, 0x0335, + 0x033f, 0x0345, 0x034d, 0x034d, 0x0357, 0x035f, 0x036b, 0x036b, + 0x0373, 0x0391, 0x0396, 0x039c, 0x03a4, 0x03aa, 0x03aa, 0x03b3, + 0x03bc, 0x03c7, 0x03cd, 0x03db, 0x03e4, 0x03ed, 0x03f8, 0x0413, + // Entry 80 - BF + 0x0425, 0x0434, 0x043b, 0x0446, 0x0452, 0x0458, 0x045f, 0x0470, + 0x0482, 0x048e, 0x0496, 0x049d, 0x04a6, 0x04b1, 0x04b8, 0x04be, + 0x04c5, 0x04cc, 0x04d4, 0x04d4, 0x04d4, 0x04e0, 0x04ec, 0x04f5, + 0x04fa, 0x0504, 0x050c, 0x050c, 0x0524, 0x052e, 0x0537, 0x0541, + 0x054a, 0x0550, 0x0559, 0x0560, 0x0569, 0x0570, 0x0579, 0x0580, + 0x0592, 0x059c, 0x05ae, 0x05b6, 0x05bf, 0x05cb, 0x05d7, 0x05de, + 0x05e5, 0x05ec, 0x05fd, 0x0603, 0x060a, 0x060f, 0x0623, 0x063b, + 0x0644, 0x064e, 0x065a, 0x0676, 0x0689, 0x0696, 0x06ac, 0x06b7, + // Entry C0 - FF + 0x06be, 0x06c7, 0x06ce, 0x06ce, 0x06db, 0x06e3, 0x06e3, 0x06e9, + 0x06f2, 0x0701, 0x070f, 0x0719, 0x0721, 0x0728, 0x0732, 0x074a, + 0x0753, 0x0753, 0x075c, 0x076c, 0x0777, 0x0780, 0x0787, 0x0790, + 0x0790, 0x07a9, 0x07b6, 0x07b6, 0x07b6, 0x07c1, 0x07c1, 0x07d2, + 0x07d7, 0x07d7, 0x07dc, 0x07e6, 0x07f3, 0x07fa, 0x0812, 0x0823, + 0x082a, 0x0833, 0x083b, 0x0852, 0x0859, 0x0862, 0x086b, 0x0876, + 0x087d, 0x087d, 0x0886, 0x088e, 0x089c, 0x08a6, 0x08c7, 0x08d2, + 0x08e4, 0x08fe, 0x0908, 0x0910, 0x0922, 0x0929, 0x0929, 0x0930, + // Entry 100 - 13F + 0x093a, 0x094a, 0x0952, 0x095c, + }, + }, + { // yi + "אַנדארעאַפֿגהאַניסטאַןאַנטיגוע און באַרבודעאַלבאַניעאַרמעניעאַנגאלעאַנטא" + + "ַרקטיקעאַרגענטינעעסטרייךאויסטראַליעאַרובאַבאסניע הערצעגאווינעבאַרבא" + + "ַדאסבאַנגלאַדעשבעלגיעבורקינע פֿאַסאבולגאַריעבורונדיבעניןבערמודעברונ" + + "ייבאליוויעבראַזילבאַהאַמאַסבהוטאַןבאצוואַנעבעלאַרוסבעליזקאַנאַדעקאנ" + + "גא־קינשאַזעצענטראַל־אַפֿריקאַנישע רעפּובליקשווייץהעלפֿאַ נדביין באר" + + "טןקוק אינזלעןטשילעקאַמערוןכינעקאלאמביעקאסטאַ ריקאַקובאַקאַפּווערדיש" + + "ע אינזלעןקוראַסאַאטשעכיידייטשלאַנדדזשיבוטידענמאַרקדאמיניקעדאמיניקאַ" + + "נישע רעפּובליקעקוואַדארעסטלאַנדעגיפּטןעריטרעעשפּאַניעעטיאפּיעאייראפ" + + "ּעישער פֿאַרבאַנדפֿינלאַנדפֿידזשיפֿאַלקלאַנד אינזלעןמיקראנעזיעפֿאַר" + + "א אינזלעןפֿראַנקרייךגאַבאןפֿאַראייניגטע קעניגרייךגרענאַדאַגרוזיעפֿר" + + "אַנצויזישע גויאַנעגערנזיגהאַנעגיבראַלטאַרגרינלאַנדגאַמביעגינעגוואַד" + + "עלופעקוואַטארישע גינעגריכנלאַנדגוואַטעמאַלעגוואַםגינע־ביסאַוגויאַנע" + + "האנדוראַסקראאַטיעהאַיטיאונגערןקאַנאַרישע אינזלעןאינדאנעזיעאירלאַנדי" + + "שראלאינדיעאיראַןאיסלאַנדאיטאַליעדזשערזידזשאַמייקעיאַפּאַןקעניעקאַמב" + + "אדיעקיריבאַטיקאמאראסקיימאַן אינזלעןלאַאסלבנוןליכטנשטייןסרי־לאַנקאַל" + + "יבעריעלעסאטאליטעלוקסעמבורגלעטלאַנדליביעמאַראקאמאנאַקאמאלדאוועמאנטענ" + + "עגראמאַדאַגאַסקאַרמאַרשאַל אינזלעןמאַקעדאניעמאַלימיאַנמאַרמאנגאליימ" + + "אַרטיניקמאַריטאַניעמאנטסעראַטמאַלטאַמאריציוסמאַלדיווןמאַלאַווימעקסי" + + "קעמאַלייזיעמאזאַמביקנאַמיביענײַ קאַלעדאניעניזשערנארפֿאלק אינזלניגער" + + "יעניקאַראַגועהאלאַנדנארוועגיענעפּאַלניו זילאַנדפּאַנאַמאַפּערופֿראַ" + + "נצויזישע פּאלינעזיעפּאַפּואַ נײַ גינעפֿיליפּינעןפּאַקיסטאַןפּוילןפּ" + + "יטקערן אינזלעןפּארטא־ריקאפּארטוגאַלפּאַראַגווײַקאַטאַררעאוניאןרומענ" + + "יעסערביערוסלאַנדרוואַנדעסאלאמאן אינזלעןסיישעלסודאַןשוועדןסינגאַפּור" + + "סט העלענעסלאוועניעסלאוואַקייסיערע לעאנעסאַן מאַרינאסענעגאַלסאמאַליע" + + "סורינאַםדרום־סודאַןסאַא טאמע און פּרינסיפּעעל סאַלוואַדארסיריעסוואַ" + + "זילאַנדטשאַדטאגאטיילאַנדטורקמעניסטאַןטוניסיעטאנגאַטערקייטרינידאַד א" + + "ון טאבאַגאטואוואַלוטאַנזאַניעאוקראַינעאוגאַנדעפֿאַראייניגטע שטאַטןא" + + "ורוגווייוואַטיקאַן שטאָטווענעזועלעוויעטנאַםוואַנואַטוסאַמאאַקאסאווא" + + "תימןמאַיאטדרום־אַפֿריקעזאַמביעזימבאַבוועאומבאַוואוסטער ראַיאןוועלטא" + + "ַפֿריקעצפון־אַמעריקעדרום־אַמעריקעאקעאַניעצענטראַל־אַמעריקעאַמעריקעצ" + + "פונדיקע אַמעריקעקאַראַאיבעמזרח אַזיעדרום־אַזיעדרום־מזרח אַזיעדרום־א" + + "ייראפּעפּאלינעזיעאַזיעצענטראַל־אַזיעמערב־אַזיעאייראפּעמזרח־אייראפּע" + + "צפֿון־אייראפּעמערב־אייראפּעלאַטיין־אַמעריקע", + []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x000e, 0x000e, 0x002c, 0x0054, 0x0054, 0x0066, + 0x0076, 0x0076, 0x0084, 0x009c, 0x00b0, 0x00b0, 0x00be, 0x00d4, + 0x00e2, 0x00e2, 0x00e2, 0x0107, 0x011b, 0x0131, 0x013d, 0x0158, + 0x016a, 0x016a, 0x0178, 0x0182, 0x0182, 0x0190, 0x019c, 0x01ac, + 0x01ac, 0x01ba, 0x01ce, 0x01dc, 0x01dc, 0x01ee, 0x01fe, 0x0208, + 0x0218, 0x0218, 0x0234, 0x0273, 0x0273, 0x027f, 0x02a5, 0x02ba, + 0x02c4, 0x02d4, 0x02dc, 0x02ec, 0x02ec, 0x0303, 0x030d, 0x0336, + 0x0348, 0x0348, 0x0348, 0x0354, 0x0368, 0x0368, 0x0378, 0x0388, + // Entry 40 - 7F + 0x0398, 0x03c5, 0x03c5, 0x03c5, 0x03d7, 0x03e7, 0x03f5, 0x03f5, + 0x0403, 0x0413, 0x0423, 0x0450, 0x0462, 0x0470, 0x0495, 0x04a9, + 0x04c4, 0x04da, 0x04e6, 0x0513, 0x0525, 0x0531, 0x055a, 0x0566, + 0x0572, 0x0588, 0x059a, 0x05a8, 0x05b0, 0x05c4, 0x05e5, 0x05f9, + 0x05f9, 0x0611, 0x061d, 0x0633, 0x0641, 0x0641, 0x0641, 0x0653, + 0x0663, 0x066f, 0x067d, 0x06a0, 0x06b4, 0x06c4, 0x06ce, 0x06ce, + 0x06da, 0x06da, 0x06da, 0x06e6, 0x06f6, 0x0706, 0x0714, 0x0728, + 0x0728, 0x0738, 0x0742, 0x0742, 0x0754, 0x0766, 0x0774, 0x0774, + // Entry 80 - BF + 0x0774, 0x0774, 0x0774, 0x0791, 0x0791, 0x079b, 0x07a5, 0x07a5, + 0x07b9, 0x07cf, 0x07dd, 0x07e9, 0x07f1, 0x0805, 0x0815, 0x081f, + 0x082d, 0x083b, 0x084b, 0x085f, 0x085f, 0x087b, 0x089a, 0x08ae, + 0x08b8, 0x08ca, 0x08da, 0x08da, 0x08da, 0x08ec, 0x0902, 0x0916, + 0x0924, 0x0934, 0x0946, 0x0958, 0x0966, 0x0978, 0x098a, 0x099a, + 0x09b5, 0x09c1, 0x09dc, 0x09ea, 0x0a00, 0x0a0e, 0x0a20, 0x0a2e, + 0x0a2e, 0x0a2e, 0x0a43, 0x0a43, 0x0a57, 0x0a61, 0x0a90, 0x0ab2, + 0x0ac8, 0x0ade, 0x0aea, 0x0aea, 0x0b09, 0x0b1f, 0x0b1f, 0x0b33, + // Entry C0 - FF + 0x0b33, 0x0b4b, 0x0b59, 0x0b59, 0x0b69, 0x0b77, 0x0b83, 0x0b93, + 0x0ba3, 0x0ba3, 0x0bc0, 0x0bcc, 0x0bd8, 0x0be4, 0x0bf8, 0x0c09, + 0x0c1b, 0x0c1b, 0x0c2f, 0x0c44, 0x0c5b, 0x0c6b, 0x0c7b, 0x0c8b, + 0x0ca1, 0x0cce, 0x0ce9, 0x0ce9, 0x0cf3, 0x0d0b, 0x0d0b, 0x0d0b, + 0x0d15, 0x0d15, 0x0d1d, 0x0d2d, 0x0d2d, 0x0d2d, 0x0d2d, 0x0d47, + 0x0d55, 0x0d61, 0x0d6d, 0x0d95, 0x0da7, 0x0da7, 0x0dbb, 0x0dcd, + 0x0ddd, 0x0ddd, 0x0e04, 0x0e16, 0x0e16, 0x0e35, 0x0e35, 0x0e49, + 0x0e49, 0x0e49, 0x0e5b, 0x0e6f, 0x0e6f, 0x0e7d, 0x0e8b, 0x0e93, + // Entry 100 - 13F + 0x0e9f, 0x0eb9, 0x0ec7, 0x0edb, 0x0f04, 0x0f0e, 0x0f1e, 0x0f38, + 0x0f52, 0x0f62, 0x0f62, 0x0f84, 0x0f84, 0x0f84, 0x0f84, 0x0f84, + 0x0f94, 0x0fb5, 0x0fc9, 0x0fdc, 0x0ff0, 0x100d, 0x1027, 0x1027, + 0x1027, 0x1027, 0x103b, 0x1045, 0x1061, 0x1075, 0x1085, 0x109f, + 0x10bb, 0x10d5, 0x10f5, + }, + }, + { // yo + "Orílẹ́ède ÀàndóràOrílẹ́ède Ẹmirate ti Awọn ArabuOrílẹ́ède ÀfùgànístánìOr" + + "ílẹ́ède Ààntígúà àti BáríbúdàOrílẹ́ède ÀàngúlílàOrílẹ́ède Àlùbàníán" + + "ìOrílẹ́ède AméníàOrílẹ́ède Nedalandi ti AntelisiOrílẹ́ède ÀàngólàOr" + + "ílẹ́ède AgentínàSámóánì ti Orílẹ́ède ÀméríkàOrílẹ́ède AsítíríàOrílẹ" + + "́ède ÁstràlìáOrílẹ́ède ÁrúbàOrílẹ́ède Asẹ́bájánìOrílẹ́ède Bọ̀síníà " + + "àti ẸtisẹgófínàOrílẹ́ède BábádósìOrílẹ́ède BángáládésìOrílẹ́ède Bég" + + "íọ́mùOrílẹ́ède Bùùkíná FasòOrílẹ́ède BùùgáríàOrílẹ́ède BáránìOrílẹ́" + + "ède BùùrúndìOrílẹ́ède Bẹ̀nẹ̀Orílẹ́ède BémúdàOrílẹ́ède Búrúnẹ́lìOríl" + + "ẹ́ède Bọ̀lífíyàOrílẹ́ède BàràsílìOrílẹ́ède BàhámásìOrílẹ́ède Bútán" + + "ìOrílẹ́ède Bọ̀tìsúwánàOrílẹ́ède BélárúsìOrílẹ́ède Bèlísẹ̀Orílẹ́ède " + + "KánádàOrilẹ́ède KóngòOrílẹ́ède Àrin gùngun ÁfíríkàOrílẹ́ède KóngòOrí" + + "lẹ́ède switiṣilandiOrílẹ́ède Kóútè foràOrílẹ́ède Etíokun KùúkùOrílẹ́" + + "ède ṣílèOrílẹ́ède KamerúúnìOrílẹ́ède ṣáínàOrílẹ́ède KòlómíbìaOrílẹ́" + + "ède Kuusita RíkàOrílẹ́ède KúbàOrílẹ́ède Etíokun Kápé féndèOrílẹ́ède" + + " KúrúsìOrílẹ́ède ṣẹ́ẹ́kìOrílẹ́ède GemaniOrílẹ́ède Díbọ́ótìOrílẹ́ède " + + "Dẹ́mákìOrílẹ́ède DòmíníkàOrilẹ́ède DòmíníkánìOrílẹ́ède ÀlùgèríánìOrí" + + "lẹ́ède EkuádòOrílẹ́ède EsitoniaOrílẹ́ède ÉgípítìOrílẹ́ède EritiraOrí" + + "lẹ́ède SipaniOrílẹ́ède EtopiaOrílẹ́ède FilandiOrílẹ́ède FijiOrílẹ́èd" + + "e Etikun FakalandiOrílẹ́ède MakoronesiaOrílẹ́ède FaranseOrílẹ́ède Ga" + + "bonOrílẹ́ède OmobabirinOrílẹ́ède GenadaOrílẹ́ède GọgiaOrílẹ́ède Fire" + + "nṣi GuanaOrílẹ́ède GanaOrílẹ́ède GibarataraOrílẹ́ède GerelandiOrílẹ́" + + "ède GambiaOrílẹ́ède GeneOrílẹ́ède GadelopeOrílẹ́ède Ekutoria GiniOr" + + "ílẹ́ède GeriisiOrílẹ́ède GuatemalaOrílẹ́ède GuamuOrílẹ́ède Gene-Bus" + + "auOrílẹ́ède GuyanaOrílẹ́ède HondurasiOrílẹ́ède KòróátíàOrílẹ́ède Haa" + + "tiOrílẹ́ède HungariOrílẹ́ède IndonesiaOrílẹ́ède AilandiOrílẹ́ède Ise" + + "rẹliOrílẹ́ède IndiaOrílẹ́ède Etíkun Índíánì ti Ìlú BírítísìOrílẹ́ède" + + " IrakiOrílẹ́ède IraniOrílẹ́ède AṣilandiOrílẹ́ède ItaliyiOrílẹ́ède Ja" + + "maikaOrílẹ́ède JọdaniOrílẹ́ède JapaniOrílẹ́ède KenyaOrílẹ́ède Kuriṣi" + + "sitaniOrílẹ́ède KàmùbódíàOrílẹ́ède KiribatiOrílẹ́ède KòmòrósìOrílẹ́è" + + "de Kiiti ati NeefiOrílẹ́ède Guusu KọriaOrílẹ́ède Ariwa KọriaOrílẹ́èd" + + "e KuwetiOrílẹ́ède Etíokun KámánìOrílẹ́ède KaṣaṣataniOrílẹ́ède LaosiO" + + "rílẹ́ède LebanoniOrílẹ́ède LuṣiaOrílẹ́ède LẹṣitẹnisiteniOrílẹ́ède Si" + + "ri LankaOrílẹ́ède LaberiaOrílẹ́ède LesotoOrílẹ́ède LituaniaOrílẹ́ède" + + " LusemogiOrílẹ́ède LatifiaOrílẹ́ède LibiyaOrílẹ́ède MorokoOrílẹ́ède " + + "MonakoOrílẹ́ède ModofiaOrílẹ́ède MadasikaOrílẹ́ède Etikun MáṣaliOríl" + + "ẹ́ède MasidoniaOrílẹ́ède MaliOrílẹ́ède ManamariOrílẹ́ède MogoliaOr" + + "ílẹ́ède Etikun Guusu MarianaOrílẹ́ède MatinikuwiOrílẹ́ède Maritania" + + "Orílẹ́ède MotseratiOrílẹ́ède MalataOrílẹ́ède MaritiusiOrílẹ́ède Mala" + + "difiOrílẹ́ède MalawiOrílẹ́ède MesikoOrílẹ́ède MalasiaOrílẹ́ède Moṣam" + + "ibikuOrílẹ́ède NamibiaOrílẹ́ède Kaledonia TitunOrílẹ́ède NàìjáOrílẹ́" + + "ède Etikun Nọ́úfókìOrílẹ́ède NàìjíríàOrílẹ́ède NIkaraguaOrílẹ́ède N" + + "edalandiOrílẹ́ède NọọwiiOrílẹ́ède NepaOrílẹ́ède NauruOrílẹ́ède NiueO" + + "rílẹ́ède ṣilandi TitunOrílẹ́ède ỌọmaOrílẹ́ède PanamaOrílẹ́ède PeruOr" + + "ílẹ́ède Firenṣi PolinesiaOrílẹ́ède Paapu ti GiiniOrílẹ́ède filipini" + + "Orílẹ́ède PakisitanOrílẹ́ède PolandiOrílẹ́ède Pẹẹri ati mikuloniOríl" + + "ẹ́ède PikariniOrílẹ́ède Pọto RikoOrílẹ́ède Iwọorun Pakisitian ati " + + "GaṣaOrílẹ́ède PọtugiOrílẹ́ède PaaluOrílẹ́ède ParaguyeOrílẹ́ède KotaO" + + "rílẹ́ède RiuniyanOrílẹ́ède RomaniyaOrílẹ́ède RọṣiaOrílẹ́ède RuwandaO" + + "rílẹ́ède Saudi ArabiaOrílẹ́ède Etikun SolomoniOrílẹ́ède seṣẹlẹsiOríl" + + "ẹ́ède SudaniOrílẹ́ède SwidiniOrílẹ́ède SingapoOrílẹ́ède HẹlenaOríl" + + "ẹ́ède SilofaniaOrílẹ́ède SilofakiaOrílẹ́ède Siria looniOrílẹ́ède S" + + "ani MarinoOrílẹ́ède SẹnẹgaOrílẹ́ède SomaliaOrílẹ́ède SurinamiOrílẹ́è" + + "de Sao tomi ati piriiṣipiOrílẹ́ède ẸẹsáfádòOrílẹ́ède SiriaOrílẹ́ède " + + "SaṣilandOrílẹ́ède Tọọki ati Etikun KakọsiOrílẹ́ède ṣààdìOrílẹ́ède To" + + "goOrílẹ́ède TailandiOrílẹ́ède TakisitaniOrílẹ́ède TokelauOrílẹ́ède Ì" + + "làOòrùn Tímọ̀Orílẹ́ède TọọkimenisitaOrílẹ́ède TuniṣiaOrílẹ́ède Tonga" + + "Orílẹ́ède TọọkiOrílẹ́ède Tirinida ati TobagaOrílẹ́ède TufaluOrílẹ́èd" + + "e TaiwaniOrílẹ́ède TanṣaniaOrílẹ́ède UkariniOrílẹ́ède UgandaOrílẹ́èd" + + "e Orilẹede AmerikaOrílẹ́ède NruguayiOrílẹ́ède NṣibẹkisitaniOrílẹ́ède" + + " FatikaniOrílẹ́ède Fisẹnnti ati GenadinaOrílẹ́ède FẹnẹṣuẹlaOrílẹ́ède" + + " Etíkun Fágínì ti ìlú BírítísìOrílẹ́ède Etikun Fagini ti AmẹrikaOríl" + + "ẹ́ède FẹtinamiOrílẹ́ède FaniatuOrílẹ́ède Wali ati futunaOrílẹ́ède " + + "SamọOrílẹ́ède yemeniOrílẹ́ède MayoteOrílẹ́ède Ariwa AfirikaOrílẹ́ède" + + " ṣamibiaOrílẹ́ède ṣimibabe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x001a, 0x0042, 0x0063, 0x0091, 0x00ae, 0x00cd, + 0x00e5, 0x0109, 0x0123, 0x0123, 0x013c, 0x0165, 0x0180, 0x019b, + 0x01b2, 0x01b2, 0x01d1, 0x0206, 0x0221, 0x0240, 0x025d, 0x027d, + 0x0299, 0x02b1, 0x02cc, 0x02e7, 0x02e7, 0x02ff, 0x031d, 0x033b, + 0x033b, 0x0356, 0x0371, 0x0389, 0x0389, 0x03aa, 0x03c5, 0x03e0, + 0x03f8, 0x03f8, 0x040d, 0x0435, 0x044b, 0x0468, 0x0485, 0x04a5, + 0x04bc, 0x04d7, 0x04f0, 0x050c, 0x050c, 0x0529, 0x053e, 0x0564, + 0x0564, 0x0564, 0x057c, 0x059b, 0x05b0, 0x05b0, 0x05cd, 0x05e8, + // Entry 40 - 7F + 0x0603, 0x0620, 0x063f, 0x063f, 0x0656, 0x066d, 0x0687, 0x0687, + 0x069d, 0x06b2, 0x06c7, 0x06c7, 0x06dd, 0x06f0, 0x070f, 0x0729, + 0x0729, 0x073f, 0x0753, 0x076c, 0x0781, 0x0797, 0x07b5, 0x07b5, + 0x07c8, 0x07e1, 0x07f9, 0x080e, 0x0821, 0x0838, 0x0854, 0x086a, + 0x086a, 0x0882, 0x0896, 0x08af, 0x08c4, 0x08c4, 0x08c4, 0x08dc, + 0x08f8, 0x090c, 0x0922, 0x0922, 0x093a, 0x0950, 0x0968, 0x0968, + 0x097c, 0x09b4, 0x09c8, 0x09dc, 0x09f5, 0x0a0b, 0x0a0b, 0x0a21, + 0x0a38, 0x0a4d, 0x0a61, 0x0a7e, 0x0a9b, 0x0ab2, 0x0acd, 0x0aeb, + // Entry 80 - BF + 0x0b07, 0x0b23, 0x0b38, 0x0b59, 0x0b76, 0x0b8a, 0x0ba1, 0x0bb7, + 0x0bda, 0x0bf3, 0x0c09, 0x0c1e, 0x0c35, 0x0c4c, 0x0c62, 0x0c77, + 0x0c8c, 0x0ca1, 0x0cb7, 0x0cb7, 0x0cb7, 0x0cce, 0x0ced, 0x0d05, + 0x0d18, 0x0d2f, 0x0d45, 0x0d45, 0x0d68, 0x0d81, 0x0d99, 0x0db1, + 0x0dc6, 0x0dde, 0x0df5, 0x0e0a, 0x0e1f, 0x0e35, 0x0e50, 0x0e66, + 0x0e84, 0x0e9b, 0x0ebf, 0x0edb, 0x0ef3, 0x0f0b, 0x0f24, 0x0f37, + 0x0f4b, 0x0f5e, 0x0f7c, 0x0f93, 0x0fa8, 0x0fbb, 0x0fdd, 0x0ffa, + 0x1011, 0x1029, 0x103f, 0x1064, 0x107b, 0x1095, 0x10c3, 0x10da, + // Entry C0 - FF + 0x10ee, 0x1105, 0x1118, 0x1118, 0x112f, 0x1146, 0x1146, 0x115e, + 0x1174, 0x118f, 0x11ad, 0x11ca, 0x11df, 0x11f5, 0x120b, 0x1222, + 0x123a, 0x123a, 0x1252, 0x126c, 0x1286, 0x129f, 0x12b5, 0x12cc, + 0x12cc, 0x12f3, 0x1311, 0x1311, 0x1325, 0x133e, 0x133e, 0x136a, + 0x1383, 0x1383, 0x1396, 0x13ad, 0x13c6, 0x13dc, 0x1401, 0x1421, + 0x1439, 0x144d, 0x1465, 0x1487, 0x149c, 0x14b2, 0x14cb, 0x14e1, + 0x14f6, 0x14f6, 0x1517, 0x152e, 0x154e, 0x1565, 0x158b, 0x15ab, + 0x15e1, 0x160a, 0x1623, 0x1639, 0x1657, 0x166c, 0x166c, 0x1681, + // Entry 100 - 13F + 0x1696, 0x16b2, 0x16ca, 0x16e3, + }, + }, + { // yo-BJ + "Orílɛ́ède ÀàndóràOrílɛ́ède Ɛmirate ti Awɔn ArabuOrílɛ́ède ÀfùgànístánìOr" + + "ílɛ́ède Ààntígúà àti BáríbúdàOrílɛ́ède ÀàngúlílàOrílɛ́ède Àlùbàníán" + + "ìOrílɛ́ède AméníàOrílɛ́ède Nedalandi ti AntelisiOrílɛ́ède ÀàngólàOr" + + "ílɛ́ède AgentínàSámóánì ti Orílɛ́ède ÀméríkàOrílɛ́ède AsítíríàOrílɛ" + + "́ède ÁstràlìáOrílɛ́ède ÁrúbàOrílɛ́ède Asɛ́bájánìOrílɛ́ède Bɔ̀síníà " + + "àti ƐtisɛgófínàOrílɛ́ède BábádósìOrílɛ́ède BángáládésìOrílɛ́ède Bég" + + "íɔ́mùOrílɛ́ède Bùùkíná FasòOrílɛ́ède BùùgáríàOrílɛ́ède BáránìOrílɛ́" + + "ède BùùrúndìOrílɛ́ède Bɛ̀nɛ̀Orílɛ́ède BémúdàOrílɛ́ède Búrúnɛ́lìOríl" + + "ɛ́ède Bɔ̀lífíyàOrílɛ́ède BàràsílìOrílɛ́ède BàhámásìOrílɛ́ède Bútánì" + + "Orílɛ́ède Bɔ̀tìsúwánàOrílɛ́ède BélárúsìOrílɛ́ède Bèlísɛ̀Orílɛ́ède Ká" + + "nádàOrilɛ́ède KóngòOrílɛ́ède Àrin gùngun ÁfíríkàOrílɛ́ède KóngòOrílɛ" + + "́ède switishilandiOrílɛ́ède Kóútè foràOrílɛ́ède Etíokun KùúkùOrílɛ́" + + "ède shílèOrílɛ́ède KamerúúnìOrílɛ́ède sháínàOrílɛ́ède KòlómíbìaOríl" + + "ɛ́ède Kuusita RíkàOrílɛ́ède KúbàOrílɛ́ède Etíokun Kápé féndèOrílɛ́è" + + "de KúrúsìOrílɛ́ède shɛ́ɛ́kìOrílɛ́ède GemaniOrílɛ́ède Díbɔ́ótìOrílɛ́è" + + "de Dɛ́mákìOrílɛ́ède DòmíníkàOrilɛ́ède DòmíníkánìOrílɛ́ède Àlùgèríánì" + + "Orílɛ́ède EkuádòOrílɛ́ède EsitoniaOrílɛ́ède ÉgípítìOrílɛ́ède Eritira" + + "Orílɛ́ède SipaniOrílɛ́ède EtopiaOrílɛ́ède FilandiOrílɛ́ède FijiOrílɛ" + + "́ède Etikun FakalandiOrílɛ́ède MakoronesiaOrílɛ́ède FaranseOrílɛ́èd" + + "e GabonOrílɛ́ède OmobabirinOrílɛ́ède GenadaOrílɛ́ède GɔgiaOrílɛ́ède " + + "Firenshi GuanaOrílɛ́ède GanaOrílɛ́ède GibarataraOrílɛ́ède GerelandiO" + + "rílɛ́ède GambiaOrílɛ́ède GeneOrílɛ́ède GadelopeOrílɛ́ède Ekutoria Gi" + + "niOrílɛ́ède GeriisiOrílɛ́ède GuatemalaOrílɛ́ède GuamuOrílɛ́ède Gene-" + + "BusauOrílɛ́ède GuyanaOrílɛ́ède HondurasiOrílɛ́ède KòróátíàOrílɛ́ède " + + "HaatiOrílɛ́ède HungariOrílɛ́ède IndonesiaOrílɛ́ède AilandiOrílɛ́ède " + + "IserɛliOrílɛ́ède IndiaOrílɛ́ède Etíkun Índíánì ti Ìlú BírítísìOrílɛ́" + + "ède IrakiOrílɛ́ède IraniOrílɛ́ède AshilandiOrílɛ́ède ItaliyiOrílɛ́è" + + "de JamaikaOrílɛ́ède JɔdaniOrílɛ́ède JapaniOrílɛ́ède KenyaOrílɛ́ède K" + + "urishisitaniOrílɛ́ède KàmùbódíàOrílɛ́ède KiribatiOrílɛ́ède KòmòrósìO" + + "rílɛ́ède Kiiti ati NeefiOrílɛ́ède Guusu KɔriaOrílɛ́ède Ariwa KɔriaOr" + + "ílɛ́ède KuwetiOrílɛ́ède Etíokun KámánìOrílɛ́ède KashashataniOrílɛ́è" + + "de LaosiOrílɛ́ède LebanoniOrílɛ́ède LushiaOrílɛ́ède LɛshitɛnisiteniO" + + "rílɛ́ède Siri LankaOrílɛ́ède LaberiaOrílɛ́ède LesotoOrílɛ́ède Lituan" + + "iaOrílɛ́ède LusemogiOrílɛ́ède LatifiaOrílɛ́ède LibiyaOrílɛ́ède Morok" + + "oOrílɛ́ède MonakoOrílɛ́ède ModofiaOrílɛ́ède MadasikaOrílɛ́ède Etikun" + + " MáshaliOrílɛ́ède MasidoniaOrílɛ́ède MaliOrílɛ́ède ManamariOrílɛ́ède" + + " MogoliaOrílɛ́ède Etikun Guusu MarianaOrílɛ́ède MatinikuwiOrílɛ́ède " + + "MaritaniaOrílɛ́ède MotseratiOrílɛ́ède MalataOrílɛ́ède MaritiusiOrílɛ" + + "́ède MaladifiOrílɛ́ède MalawiOrílɛ́ède MesikoOrílɛ́ède MalasiaOrílɛ" + + "́ède MoshamibikuOrílɛ́ède NamibiaOrílɛ́ède Kaledonia TitunOrílɛ́ède" + + " NàìjáOrílɛ́ède Etikun Nɔ́úfókìOrílɛ́ède NàìjíríàOrílɛ́ède NIkaragua" + + "Orílɛ́ède NedalandiOrílɛ́ède NɔɔwiiOrílɛ́ède NepaOrílɛ́ède NauruOríl" + + "ɛ́ède NiueOrílɛ́ède shilandi TitunOrílɛ́ède ƆɔmaOrílɛ́ède PanamaOrí" + + "lɛ́ède PeruOrílɛ́ède Firenshi PolinesiaOrílɛ́ède Paapu ti GiiniOrílɛ" + + "́ède filipiniOrílɛ́ède PakisitanOrílɛ́ède PolandiOrílɛ́ède Pɛɛri at" + + "i mikuloniOrílɛ́ède PikariniOrílɛ́ède Pɔto RikoOrílɛ́ède Iwɔorun Pak" + + "isitian ati GashaOrílɛ́ède PɔtugiOrílɛ́ède PaaluOrílɛ́ède ParaguyeOr" + + "ílɛ́ède KotaOrílɛ́ède RiuniyanOrílɛ́ède RomaniyaOrílɛ́ède RɔshiaOrí" + + "lɛ́ède RuwandaOrílɛ́ède Saudi ArabiaOrílɛ́ède Etikun SolomoniOrílɛ́è" + + "de seshɛlɛsiOrílɛ́ède SudaniOrílɛ́ède SwidiniOrílɛ́ède SingapoOrílɛ́" + + "ède HɛlenaOrílɛ́ède SilofaniaOrílɛ́ède SilofakiaOrílɛ́ède Siria loo" + + "niOrílɛ́ède Sani MarinoOrílɛ́ède SɛnɛgaOrílɛ́ède SomaliaOrílɛ́ède Su" + + "rinamiOrílɛ́ède Sao tomi ati piriishipiOrílɛ́ède ƐɛsáfádòOrílɛ́ède S" + + "iriaOrílɛ́ède SashilandOrílɛ́ède Tɔɔki ati Etikun KakɔsiOrílɛ́ède sh" + + "ààdìOrílɛ́ède TogoOrílɛ́ède TailandiOrílɛ́ède TakisitaniOrílɛ́ède T" + + "okelauOrílɛ́ède ÌlàOòrùn Tímɔ̀Orílɛ́ède TɔɔkimenisitaOrílɛ́ède Tunis" + + "hiaOrílɛ́ède TongaOrílɛ́ède TɔɔkiOrílɛ́ède Tirinida ati TobagaOrílɛ́" + + "ède TufaluOrílɛ́ède TaiwaniOrílɛ́ède TanshaniaOrílɛ́ède UkariniOríl" + + "ɛ́ède UgandaOrílɛ́ède Orilɛede AmerikaOrílɛ́ède NruguayiOrílɛ́ède N" + + "shibɛkisitaniOrílɛ́ède FatikaniOrílɛ́ède Fisɛnnti ati GenadinaOrílɛ́" + + "ède FɛnɛshuɛlaOrílɛ́ède Etíkun Fágínì ti ìlú BírítísìOrílɛ́ède Etik" + + "un Fagini ti AmɛrikaOrílɛ́ède FɛtinamiOrílɛ́ède FaniatuOrílɛ́ède Wal" + + "i ati futunaOrílɛ́ède SamɔOrílɛ́ède yemeniOrílɛ́ède MayoteOrílɛ́ède " + + "Ariwa AfirikaOrílɛ́ède shamibiaOrílɛ́ède shimibabe", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0019, 0x003e, 0x005e, 0x008b, 0x00a7, 0x00c5, + 0x00dc, 0x00ff, 0x0118, 0x0118, 0x0130, 0x0158, 0x0172, 0x018c, + 0x01a2, 0x01a2, 0x01bf, 0x01f0, 0x020a, 0x0228, 0x0243, 0x0262, + 0x027d, 0x0294, 0x02ae, 0x02c6, 0x02c6, 0x02dd, 0x02f9, 0x0315, + 0x0315, 0x032f, 0x0349, 0x0360, 0x0360, 0x037f, 0x0399, 0x03b2, + 0x03c9, 0x03c9, 0x03dd, 0x0404, 0x0419, 0x0434, 0x0450, 0x046f, + 0x0484, 0x049e, 0x04b5, 0x04d0, 0x04d0, 0x04ec, 0x0500, 0x0525, + 0x0525, 0x0525, 0x053c, 0x0557, 0x056b, 0x056b, 0x0586, 0x059f, + // Entry 40 - 7F + 0x05b9, 0x05d5, 0x05f3, 0x05f3, 0x0609, 0x061f, 0x0638, 0x0638, + 0x064d, 0x0661, 0x0675, 0x0675, 0x068a, 0x069c, 0x06ba, 0x06d3, + 0x06d3, 0x06e8, 0x06fb, 0x0713, 0x0727, 0x073b, 0x0757, 0x0757, + 0x0769, 0x0781, 0x0798, 0x07ac, 0x07be, 0x07d4, 0x07ef, 0x0804, + 0x0804, 0x081b, 0x082e, 0x0846, 0x085a, 0x085a, 0x085a, 0x0871, + 0x088c, 0x089f, 0x08b4, 0x08b4, 0x08cb, 0x08e0, 0x08f6, 0x08f6, + 0x0909, 0x0940, 0x0953, 0x0966, 0x097d, 0x0992, 0x0992, 0x09a7, + 0x09bc, 0x09d0, 0x09e3, 0x09fe, 0x0a1a, 0x0a30, 0x0a4a, 0x0a67, + // Entry 80 - BF + 0x0a81, 0x0a9b, 0x0aaf, 0x0acf, 0x0ae9, 0x0afc, 0x0b12, 0x0b26, + 0x0b45, 0x0b5d, 0x0b72, 0x0b86, 0x0b9c, 0x0bb2, 0x0bc7, 0x0bdb, + 0x0bef, 0x0c03, 0x0c18, 0x0c18, 0x0c18, 0x0c2e, 0x0c4b, 0x0c62, + 0x0c74, 0x0c8a, 0x0c9f, 0x0c9f, 0x0cc1, 0x0cd9, 0x0cf0, 0x0d07, + 0x0d1b, 0x0d32, 0x0d48, 0x0d5c, 0x0d70, 0x0d85, 0x0d9e, 0x0db3, + 0x0dd0, 0x0de6, 0x0e08, 0x0e23, 0x0e3a, 0x0e51, 0x0e67, 0x0e79, + 0x0e8c, 0x0e9e, 0x0eba, 0x0ece, 0x0ee2, 0x0ef4, 0x0f14, 0x0f30, + 0x0f46, 0x0f5d, 0x0f72, 0x0f94, 0x0faa, 0x0fc2, 0x0fed, 0x1002, + // Entry C0 - FF + 0x1015, 0x102b, 0x103d, 0x103d, 0x1053, 0x1069, 0x1069, 0x107e, + 0x1093, 0x10ad, 0x10ca, 0x10e3, 0x10f7, 0x110c, 0x1121, 0x1136, + 0x114d, 0x114d, 0x1164, 0x117d, 0x1196, 0x11ac, 0x11c1, 0x11d7, + 0x11d7, 0x11fc, 0x1217, 0x1217, 0x122a, 0x1241, 0x1241, 0x1269, + 0x1280, 0x1280, 0x1292, 0x12a8, 0x12c0, 0x12d5, 0x12f8, 0x1315, + 0x132b, 0x133e, 0x1353, 0x1374, 0x1388, 0x139d, 0x13b4, 0x13c9, + 0x13dd, 0x13dd, 0x13fc, 0x1412, 0x142f, 0x1445, 0x1469, 0x1484, + 0x14b9, 0x14e0, 0x14f7, 0x150c, 0x1529, 0x153c, 0x153c, 0x1550, + // Entry 100 - 13F + 0x1564, 0x157f, 0x1595, 0x15ac, + }, + }, + { // zgh + "ⴰⵏⴷⵓⵔⴰⵍⵉⵎⴰⵔⴰⵜⴰⴼⵖⴰⵏⵉⵙⵜⴰⵏⴰⵏⵜⵉⴳⴰ ⴷ ⴱⵔⴱⵓⴷⴰⴰⵏⴳⵉⵍⴰⴰⵍⴱⴰⵏⵢⴰⴰⵔⵎⵉⵏⵢⴰⴰⵏⴳⵓⵍⴰⴰⵔⵊⴰⵏⵜⵉⵏ" + + "ⵙⴰⵎⵡⴰ ⵜⴰⵎⵉⵔⵉⴽⴰⵏⵉⵜⵏⵏⵎⵙⴰⵓⵙⵜⵔⴰⵍⵢⴰⴰⵔⵓⴱⴰⴰⴷⵔⴰⴱⵉⵊⴰⵏⴱⵓⵙⵏⴰ ⴷ ⵀⵉⵔⵙⵉⴽⴱⴰⵔⴱⴰⴷⴱⴰ" + + "ⵏⴳⵍⴰⴷⵉⵛⴱⵍⵊⵉⴽⴰⴱⵓⵔⴽⵉⵏⴰ ⴼⴰⵙⵓⴱⵍⵖⴰⵔⵢⴰⴱⵃⵔⴰⵢⵏⴱⵓⵔⵓⵏⴷⵉⴱⵉⵏⵉⵏⴱⵔⵎⵓⴷⴰⴱⵔⵓⵏⵉⴱⵓⵍⵉⴱ" + + "ⵢⴰⴱⵔⴰⵣⵉⵍⴱⴰⵀⴰⵎⴰⵙⴱⵀⵓⵜⴰⵏⴱⵓⵜⵙⵡⴰⵏⴰⴱⵉⵍⴰⵔⵓⵙⵢⴰⴱⵉⵍⵉⵣⴽⴰⵏⴰⴷⴰⵜⴰⴳⴷⵓⴷⴰⵏⵜ ⵜⴰⴷⵉⵎⵓⵇ" + + "ⵔⴰⵜⵉⵜ ⵏ ⴽⵓⵏⴳⵓⵜⴰⴳⴷⵓⴷⴰⵏⵜ ⵜⴰⵏⴰⵎⵎⴰⵙⵜ ⵏ ⵉⴼⵔⵉⵇⵢⴰⴽⵓⵏⴳⵓⵙⵡⵉⵙⵔⴰⴽⵓⵜ ⴷⵉⴼⵡⴰⵔⵜⵉⴳ" + + "ⵣⵉⵔⵉⵏ ⵏ ⴽⵓⴽⵛⵛⵉⵍⵉⴽⴰⵎⵉⵔⵓⵏⵛⵛⵉⵏⵡⴰⴽⵓⵍⵓⵎⴱⵢⴰⴽⵓⵙⵜⴰ ⵔⵉⴽⴰⴽⵓⴱⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⴽⴰⴱⴱ" + + "ⵉⵔⴷⵉⵇⵓⴱⵔⵓⵙⵜⴰⴳⴷⵓⴷⴰⵏⵜ ⵜⴰⵜⵛⵉⴽⵉⵜⴰⵍⵎⴰⵏⵢⴰⴷⵊⵉⴱⵓⵜⵉⴷⴰⵏⵎⴰⵔⴽⴷⵓⵎⵉⵏⵉⴽⵜⴰⴳⴷⵓⴷⴰⵏⵜ " + + "ⵜⴰⴷⵓⵎⵉⵏⵉⴽⵜⴷⵣⴰⵢⵔⵉⴽⵡⴰⴷⵓⵔⵉⵙⵜⵓⵏⵢⴰⵎⵉⵚⵕⵉⵔⵉⵜⵉⵔⵢⴰⵙⴱⴰⵏⵢⴰⵉⵜⵢⵓⴱⵢⴰⴼⵉⵍⵍⴰⵏⴷⴰⴼⵉⴷⵊ" + + "ⵉⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵎⴰⵍⴰⵡⵉⵎⵉⴽⵔⵓⵏⵉⵣⵢⴰⴼⵔⴰⵏⵙⴰⴳⴰⴱⵓⵏⵜⴰⴳⵍⴷⵉⵜ ⵉⵎⵓⵏⵏⵖⵔⵏⴰⵟⴰⵊⵓⵔⵊⵢⴰⴳⵡ" + + "ⵉⵢⴰⵏ ⵜⴰⴼⵔⴰⵏⵙⵉⵙⵜⵖⴰⵏⴰⴰⴷⵔⴰⵔ ⵏ ⵟⴰⵕⵉⵇⴳⵔⵉⵍⴰⵏⴷⴳⴰⵎⴱⵢⴰⵖⵉⵏⵢⴰⴳⵡⴰⴷⴰⵍⵓⴱⵖⵉⵏⵢⴰ ⵏ " + + "ⵉⴽⵡⴰⴷⵓⵔⵍⵢⵓⵏⴰⵏⴳⵡⴰⵜⵉⵎⴰⵍⴰⴳⵡⴰⵎⵖⵉⵏⵢⴰ ⴱⵉⵙⴰⵡⴳⵡⵉⵢⴰⵏⴰⵀⵓⵏⴷⵓⵔⴰⵙⴽⵔⵡⴰⵜⵢⴰⵀⴰⵢⵜⵉⵀⵏ" + + "ⵖⴰⵔⵢⴰⴰⵏⴷⵓⵏⵉⵙⵢⴰⵉⵔⵍⴰⵏⴷⴰⵉⵙⵔⴰⵢⵉⵍⵍⵀⵉⵏⴷⵜⴰⵎⵏⴰⴹⵜ ⵜⴰⵏⴳⵍⵉⵣⵉⵜ ⵏ ⵓⴳⴰⵔⵓ ⴰⵀⵉⵏⴷⵉⵍ" + + "ⵄⵉⵔⴰⵇⵉⵔⴰⵏⵉⵙⵍⴰⵏⴷⵉⵟⴰⵍⵢⴰⵊⴰⵎⴰⵢⴽⴰⵍⵓⵔⴷⵓⵏⵍⵢⴰⴱⴰⵏⴽⵉⵏⵢⴰⴽⵉⵔⵖⵉⵣⵉⵙⵜⴰⵏⴽⴰⵎⴱⵓⴷⵢⴰⴽⵉ" + + "ⵔⵉⴱⴰⵜⵉⵇⵓⵎⵓⵔⵙⴰⵏⴽⵔⵉⵙ ⴷ ⵏⵉⴼⵉⵙⴽⵓⵔⵢⴰ ⵏ ⵉⵥⵥⵍⵎⴹⴽⵓⵔⵢⴰ ⵏ ⵉⴼⴼⵓⵙⵍⴽⵡⵉⵜⵜⵉⴳⵣⵉⵔⵉⵏ" + + " ⵏ ⴽⴰⵢⵎⴰⵏⴽⴰⵣⴰⵅⵙⵜⴰⵏⵍⴰⵡⵙⵍⵓⴱⵏⴰⵏⵙⴰⵏⵜⵍⵓⵙⵉⵍⵉⴽⵉⵏⵛⵜⴰⵢⵏⵙⵔⵉⵍⴰⵏⴽⴰⵍⵉⴱⵉⵔⵢⴰⵍⵉⵚⵓⵟⵓⵍ" + + "ⵉⵜⵡⴰⵏⵢⴰⵍⵓⴽⵙⴰⵏⴱⵓⵔⴳⵍⴰⵜⴼⵢⴰⵍⵉⴱⵢⴰⵍⵎⵖⵔⵉⴱⵎⵓⵏⴰⴽⵓⵎⵓⵍⴷⵓⴼⵢⴰⵎⵓⵏⵜⵉⵏⵉⴳⵔⵓⵎⴰⴷⴰⵖⴰⵛⵇ" + + "ⴰⵔⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵎⴰⵔⵛⴰⵍⵎⴰⵙⵉⴷⵓⵏⵢⴰⵎⴰⵍⵉⵎⵢⴰⵏⵎⴰⵔⵎⵏⵖⵓⵍⵢⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵎⴰⵔⵢⴰⵏ ⵏ " + + "ⵉⵥⵥⵍⵎⴹⵎⴰⵔⵜⵉⵏⵉⴽⵎⵓⵕⵉⵟⴰⵏⵢⴰⵎⵓⵏⵙⵉⵔⴰⵜⵎⴰⵍⵟⴰⵎⵓⵔⵉⵙⵎⴰⵍⴷⵉⴼⵎⴰⵍⴰⵡⵉⵎⵉⴽⵙⵉⴽⵎⴰⵍⵉⵣⵢⴰ" + + "ⵎⵓⵣⵏⴱⵉⵇⵏⴰⵎⵉⴱⵢⴰⴽⴰⵍⵉⴷⵓⵏⵢⴰ ⵜⴰⵎⴰⵢⵏⵓⵜⵏⵏⵉⵊⵉⵔⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵏⵓⵔⴼⵓⵍⴽⵏⵉⵊⵉⵔⵢⴰⵏⵉⴽ" + + "ⴰⵔⴰⴳⵡⴰⵀⵓⵍⴰⵏⴷⴰⵏⵏⵔⵡⵉⵊⵏⵉⴱⴰⵍⵏⴰⵡⵔⵓⵏⵉⵡⵉⵏⵢⵓⵣⵉⵍⴰⵏⴷⴰⵄⵓⵎⴰⵏⴱⴰⵏⴰⵎⴰⴱⵉⵔⵓⴱⵓⵍⵉⵏⵉⵣⵢ" + + "ⴰ ⵜⴰⴼⵔⴰⵏⵙⵉⵙⵜⴱⴰⴱⵡⴰ ⵖⵉⵏⵢⴰ ⵜⴰⵎⴰⵢⵏⵓⵜⴼⵉⵍⵉⴱⴱⵉⵏⴱⴰⴽⵉⵙⵜⴰⵏⴱⵓⵍⵓⵏⵢⴰⵙⴰⵏⴱⵢⵉⵔ ⴷ ⵎ" + + "ⵉⴽⵍⵓⵏⴱⵉⵜⴽⴰⵢⵔⵏⴱⵓⵔⵜⵓ ⵔⵉⴽⵓⴰⴳⵎⵎⴰⴹ ⵏ ⵜⴰⴳⵓⵜ ⴷ ⵖⵣⵣⴰⴱⵕⵟⵇⵉⵣⴱⴰⵍⴰⵡⴱⴰⵔⴰⴳⵡⴰⵢⵇⴰⵜ" + + "ⴰⵔⵔⵉⵢⵓⵏⵢⵓⵏⵔⵓⵎⴰⵏⵢⴰⵙⵉⵔⴱⵢⴰⵔⵓⵙⵢⴰⵔⵡⴰⵏⴷⴰⵙⵙⴰⵄⵓⴷⵉⵢⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵙⴰⵍⵓⵎⴰⵏⵙⵙⵉⵛⵉ" + + "ⵍⵙⵙⵓⴷⴰⵏⵙⵙⵡⵉⴷⵙⵏⵖⴰⴼⵓⵔⴰⵙⴰⵏⵜⵉⵍⵉⵏⵙⵍⵓⴼⵉⵏⵢⴰⵙⵍⵓⴼⴰⴽⵢⴰⵙⵙⵉⵔⴰⵍⵢⵓⵏⵙⴰⵏⵎⴰⵔⵉⵏⵓⵙⵙⵉⵏ" + + "ⵉⴳⴰⵍⵚⵚⵓⵎⴰⵍⵙⵓⵔⵉⵏⴰⵎⵙⵙⵓⴷⴰⵏ ⵏ ⵉⴼⴼⵓⵙⵙⴰⵡⵟⵓⵎⵉ ⴷ ⴱⵔⴰⵏⵙⵉⴱⵙⴰⵍⴼⴰⴷⵓⵔⵙⵓⵔⵢⴰⵙⵡⴰⵣⵉ" + + "ⵍⴰⵏⴷⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵏ ⵜⵓⵔⴽⵢⴰ ⴷ ⴽⴰⵢⴽⵜⵛⴰⴷⵟⵓⴳⵓⵟⴰⵢⵍⴰⵏⴷⵜⴰⴷⵊⴰⴽⵉⵙⵜⴰⵏⵟⵓⴽⵍⴰⵡⵜⵉⵎⵓⵔ" + + " ⵏ ⵍⵇⴱⵍⵜⵜⵓⵔⴽⵎⴰⵏⵙⵜⴰⵏⵜⵓⵏⵙⵟⵓⵏⴳⴰⵜⵓⵔⴽⵢⴰⵜⵔⵉⵏⵉⴷⴰⴷ ⴷ ⵟⵓⴱⴰⴳⵓⵜⵓⴼⴰⵍⵓⵟⴰⵢⵡⴰⵏⵟⴰⵏⵥⴰ" + + "ⵏⵢⴰⵓⴽⵔⴰⵏⵢⴰⵓⵖⴰⵏⴷⴰⵉⵡⵓⵏⴰⴽ ⵎⵓⵏⵏⵉⵏ ⵏ ⵎⵉⵔⵉⴽⴰⵏⵓⵔⵓⴳⵡⴰⵢⵓⵣⴱⴰⴽⵉⵙⵜⴰⵏⴰⵡⴰⵏⴽ ⵏ ⴼⴰ" + + "ⵜⵉⴽⴰⵏⵙⴰⵏⴼⴰⵏⵙⴰⵏ ⴷ ⴳⵔⵉⵏⴰⴷⵉⵏⴼⵉⵏⵣⵡⵉⵍⴰⵜⵉⴳⵣⵉⵔⵉⵏ ⵜⵉⵎⴳⴰⴷ ⵏ ⵏⵏⴳⵍⵉⵣⵜⵉⴳⵣⵉⵔⵉⵏ " + + "ⵜⵉⵎⴳⴰⴷ ⵏ ⵉⵡⵓⵏⴰⴽ ⵎⵓⵏⵏⵉⵏⴼⵉⵜⵏⴰⵎⴼⴰⵏⵡⴰⵟⵓⵡⴰⵍⵉⵙ ⴷ ⴼⵓⵜⵓⵏⴰⵙⴰⵎⵡⴰⵢⴰⵎⴰⵏⵎⴰⵢⵓⵟⴰⴼ" + + "ⵔⵉⵇⵢⴰ ⵏ ⵉⴼⴼⵓⵙⵣⴰⵎⴱⵢⴰⵣⵉⵎⴱⴰⴱⵡⵉ", + []uint16{ // 260 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0012, 0x0027, 0x0045, 0x006e, 0x0080, 0x0095, + 0x00aa, 0x00aa, 0x00bc, 0x00bc, 0x00d4, 0x0105, 0x0114, 0x012c, + 0x013b, 0x013b, 0x0156, 0x017c, 0x018e, 0x01a9, 0x01bb, 0x01dd, + 0x01f2, 0x0204, 0x0219, 0x0228, 0x0228, 0x023a, 0x0249, 0x025e, + 0x025e, 0x0270, 0x0285, 0x0297, 0x0297, 0x02af, 0x02ca, 0x02d9, + 0x02eb, 0x02eb, 0x033f, 0x0390, 0x039f, 0x03b1, 0x03cd, 0x03f3, + 0x0402, 0x0417, 0x0429, 0x0441, 0x0441, 0x045d, 0x0469, 0x049e, + 0x049e, 0x049e, 0x04b0, 0x04e4, 0x04f9, 0x04f9, 0x050e, 0x0523, + // Entry 40 - 7F + 0x0538, 0x0572, 0x0581, 0x0581, 0x0596, 0x05ab, 0x05b7, 0x05b7, + 0x05cf, 0x05e1, 0x05f6, 0x05f6, 0x060e, 0x061d, 0x064c, 0x066a, + 0x066a, 0x067c, 0x068b, 0x06b0, 0x06c2, 0x06d4, 0x0705, 0x0705, + 0x0711, 0x0734, 0x0749, 0x075b, 0x076a, 0x0782, 0x07ab, 0x07bd, + 0x07bd, 0x07d8, 0x07e4, 0x0803, 0x0818, 0x0818, 0x0818, 0x0830, + 0x0845, 0x0854, 0x0869, 0x0869, 0x0884, 0x0899, 0x08ae, 0x08ae, + 0x08bd, 0x0915, 0x0927, 0x0933, 0x0945, 0x0957, 0x0957, 0x096c, + 0x097e, 0x0990, 0x099f, 0x09c0, 0x09d8, 0x09f0, 0x09ff, 0x0a28, + // Entry 80 - BF + 0x0a4e, 0x0a71, 0x0a80, 0x0aaf, 0x0aca, 0x0ad6, 0x0ae8, 0x0b00, + 0x0b1e, 0x0b36, 0x0b4b, 0x0b5d, 0x0b75, 0x0b93, 0x0ba5, 0x0bb4, + 0x0bc6, 0x0bd8, 0x0bf0, 0x0c0e, 0x0c0e, 0x0c2c, 0x0c5b, 0x0c76, + 0x0c82, 0x0c97, 0x0cac, 0x0cac, 0x0cf2, 0x0d0a, 0x0d25, 0x0d3d, + 0x0d4c, 0x0d5b, 0x0d6d, 0x0d7f, 0x0d91, 0x0da6, 0x0dbb, 0x0dd0, + 0x0e04, 0x0e16, 0x0e48, 0x0e5d, 0x0e78, 0x0e8d, 0x0e9f, 0x0eae, + 0x0ebd, 0x0ec9, 0x0ee7, 0x0ef6, 0x0f08, 0x0f14, 0x0f4e, 0x0f86, + 0x0f9e, 0x0fb6, 0x0fcb, 0x0ff7, 0x100f, 0x102b, 0x1062, 0x1074, + // Entry C0 - FF + 0x1083, 0x109b, 0x10aa, 0x10aa, 0x10c2, 0x10d7, 0x10e9, 0x10f8, + 0x110a, 0x1125, 0x1157, 0x1169, 0x117b, 0x118a, 0x11a2, 0x11ba, + 0x11d2, 0x11d2, 0x11ea, 0x1205, 0x1220, 0x1238, 0x124a, 0x125f, + 0x1285, 0x12b4, 0x12cc, 0x12cc, 0x12db, 0x12f9, 0x12f9, 0x1339, + 0x1345, 0x1345, 0x1351, 0x1366, 0x1387, 0x1399, 0x13bc, 0x13dd, + 0x13e9, 0x13f8, 0x140a, 0x1439, 0x144b, 0x145d, 0x1475, 0x148a, + 0x149c, 0x149c, 0x14db, 0x14f0, 0x150e, 0x1537, 0x156f, 0x1587, + 0x15c9, 0x161e, 0x1630, 0x1645, 0x166b, 0x167a, 0x167a, 0x1689, + // Entry 100 - 13F + 0x1698, 0x16c1, 0x16d3, 0x16eb, + }, + }, + { // zh + zhRegionStr, + zhRegionIdx, + }, + { // zh-Hant + zhHantRegionStr, + zhHantRegionIdx, + }, + { // zh-Hant-HK + "阿拉伯聯合酋長國安提瓜和巴布達阿魯巴阿塞拜疆波斯尼亞和黑塞哥維那巴巴多斯布基納法索布隆迪貝寧聖巴泰勒米鮑威特島博茨瓦納伯利茲可可斯群島剛果 - " + + "金夏沙剛果 - 布拉薩科特迪瓦克里珀頓島哥斯達黎加佛得角塞浦路斯吉布提多米尼加共和國厄瓜多爾厄立特里亞埃塞俄比亞加蓬格林納達格魯吉亞" + + "加納岡比亞南佐治亞島與南桑威奇群島危地馬拉幾內亞比紹圭亞那洪都拉斯克羅地亞馬恩島英屬印度洋領土意大利肯雅科摩羅聖基茨和尼維斯老撾聖盧" + + "西亞列支敦士登利比里亞萊索托黑山馬里毛里塔尼亞蒙特塞拉特馬耳他毛里裘斯馬爾代夫馬拉維莫桑比克尼日爾尼日利亞瑙魯阿曼法屬波利尼西亞巴布" + + "亞新幾內亞皮特凱恩島卡塔爾盧旺達沙特阿拉伯所羅門群島塞舌爾斯洛文尼亞斯瓦爾巴特群島及揚馬延島塞拉利昂索馬里蘇里南聖多美和普林西比斯威" + + "士蘭特克斯和凱科斯群島乍得法屬南部地區多哥共和國湯加千里達和多巴哥圖瓦盧坦桑尼亞聖文森特和格林納丁斯英屬維爾京群島美屬維爾京群島瓦努" + + "阿圖也門贊比亞津巴布韋中美洲加勒比波利尼西亞", + []uint16{ // 283 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0018, 0x0018, 0x002d, 0x002d, 0x002d, + 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, 0x002d, + 0x0036, 0x0036, 0x0042, 0x0060, 0x006c, 0x006c, 0x006c, 0x007b, + 0x007b, 0x007b, 0x0084, 0x008a, 0x0099, 0x0099, 0x0099, 0x0099, + 0x0099, 0x0099, 0x0099, 0x0099, 0x00a5, 0x00b1, 0x00b1, 0x00ba, + 0x00ba, 0x00c9, 0x00db, 0x00db, 0x00ed, 0x00ed, 0x00f9, 0x00f9, + 0x00f9, 0x00f9, 0x00f9, 0x00f9, 0x0108, 0x0117, 0x0117, 0x0120, + 0x0120, 0x0120, 0x012c, 0x012c, 0x012c, 0x012c, 0x0135, 0x0135, + // Entry 40 - 7F + 0x0135, 0x014a, 0x014a, 0x014a, 0x0156, 0x0156, 0x0156, 0x0156, + 0x0165, 0x0165, 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, 0x0174, + 0x0174, 0x0174, 0x017a, 0x017a, 0x0186, 0x0192, 0x0192, 0x0192, + 0x0198, 0x0198, 0x0198, 0x01a1, 0x01a1, 0x01a1, 0x01a1, 0x01a1, + 0x01c5, 0x01d1, 0x01d1, 0x01e0, 0x01e9, 0x01e9, 0x01e9, 0x01f5, + 0x0201, 0x0201, 0x0201, 0x0201, 0x0201, 0x0201, 0x0201, 0x020a, + 0x020a, 0x021f, 0x021f, 0x021f, 0x021f, 0x0228, 0x0228, 0x0228, + 0x0228, 0x0228, 0x022e, 0x022e, 0x022e, 0x022e, 0x0237, 0x024c, + // Entry 80 - BF + 0x024c, 0x024c, 0x024c, 0x024c, 0x024c, 0x0252, 0x0252, 0x025e, + 0x026d, 0x026d, 0x0279, 0x0282, 0x0282, 0x0282, 0x0282, 0x0282, + 0x0282, 0x0282, 0x0282, 0x0288, 0x0288, 0x0288, 0x0288, 0x0288, + 0x028e, 0x028e, 0x028e, 0x028e, 0x028e, 0x028e, 0x029d, 0x02ac, + 0x02b5, 0x02c1, 0x02cd, 0x02d6, 0x02d6, 0x02d6, 0x02e2, 0x02e2, + 0x02e2, 0x02eb, 0x02eb, 0x02f7, 0x02f7, 0x02f7, 0x02f7, 0x02f7, + 0x02fd, 0x02fd, 0x02fd, 0x0303, 0x0303, 0x0303, 0x0318, 0x032d, + 0x032d, 0x032d, 0x032d, 0x032d, 0x033c, 0x033c, 0x033c, 0x033c, + // Entry C0 - FF + 0x033c, 0x033c, 0x0345, 0x0345, 0x0345, 0x0345, 0x0345, 0x0345, + 0x034e, 0x035d, 0x036c, 0x0375, 0x0375, 0x0375, 0x0375, 0x0375, + 0x0384, 0x03a8, 0x03a8, 0x03b4, 0x03b4, 0x03b4, 0x03bd, 0x03c6, + 0x03c6, 0x03de, 0x03de, 0x03de, 0x03de, 0x03ea, 0x03ea, 0x0405, + 0x040b, 0x041d, 0x042c, 0x042c, 0x042c, 0x042c, 0x042c, 0x042c, + 0x042c, 0x0432, 0x0432, 0x0447, 0x0450, 0x0450, 0x045c, 0x045c, + 0x045c, 0x045c, 0x045c, 0x045c, 0x045c, 0x045c, 0x047a, 0x047a, + 0x048f, 0x04a4, 0x04a4, 0x04b0, 0x04b0, 0x04b0, 0x04b0, 0x04b6, + // Entry 100 - 13F + 0x04b6, 0x04b6, 0x04bf, 0x04cb, 0x04cb, 0x04cb, 0x04cb, 0x04cb, + 0x04cb, 0x04cb, 0x04cb, 0x04d4, 0x04d4, 0x04d4, 0x04d4, 0x04d4, + 0x04d4, 0x04d4, 0x04dd, 0x04dd, 0x04dd, 0x04dd, 0x04dd, 0x04dd, + 0x04dd, 0x04dd, 0x04ec, + }, + }, + { // zu + zuRegionStr, + zuRegionIdx, + }, +} + +var afRegionStr string = "" + // Size: 3021 bytes + "AscensioneilandAndorraVerenigde Arabiese EmirateAfganistanAntigua en Bar" + + "budaAnguillaAlbaniëArmeniëNederlands-AntilleAngolaAntarktikaArgentiniëAm" + + "erikaans-SamoaOostenrykAustraliëArubaÅlandeilandeAzerbeidjanBosnië en He" + + "rzegowinaBarbadosBangladesjBelgiëBurkina FasoBulgaryeBahreinBurundiBenin" + + "Sint BarthélemyBermudaBroeneiBoliviëKaribiese NederlandBrasiliëBahamasBh" + + "oetanBouvet-eilandBotswanaBelarusBelizeKanadaKokos-eilandeDemokratiese R" + + "epubliek van die KongoSentraal-Afrikaanse RepubliekKongo - BrazzavilleSw" + + "itserlandIvoorkusCookeilandeChiliKameroenSjinaColombiëClippertoneilandCo" + + "sta RicaKubaKaap VerdeCuraçaoKerseilandSiprusTjeggiese RepubliekDuitslan" + + "dDiego GarciaDjiboetiDenemarkeDominicaDominikaanse RepubliekAlgeriëCeuta" + + " en MelillaEcuadorEstlandEgipteWes-SaharaEritreaSpanjeEthiopiëEuropese U" + + "nieFinlandFidjiFalklandeilandeMikronesiëFaroëreilandeFrankrykGaboenVeren" + + "igde KoninkrykGrenadaGeorgiëFrans-GuyanaGuernseyGhanaGibraltarGroenlandG" + + "ambiëGuineeGuadeloupeEkwatoriaal-GuineeGriekelandSuid-Georgië en die Sui" + + "delike SandwicheilandeGuatemalaGuamGuinee-BissauGuyanaHongkong SAS Sjina" + + "Heard- en McDonaldeilandeHondurasKroasiëHaïtiHongaryeKanariese EilandeIn" + + "donesiëIerlandIsraelEiland ManIndiëBrits-Indiese OseaangebiedIrakIranYsl" + + "andItaliëJerseyJamaikaJordaniëJapanKeniaKirgisiëKambodjaKiribatiComoreSt" + + ". Kitts en NevisNoord-KoreaSuid-KoreaKoeweitKaaimanseilandeKazakstanLaos" + + "LibanonSt. LuciaLiechtensteinSri LankaLiberiëLesothoLitaueLuxemburgLetla" + + "ndLibiëMarokkoMonacoMoldowaMontenegroSt. MartinMadagaskarMarshalleilande" + + "MacedoniëMaliMianmar (Birma)MongoliëMacau SAS SjinaNoord-Mariane-eilande" + + "MartiniqueMauritaniëMontserratMaltaMauritiusMalediveMalawiMeksikoMaleisi" + + "ëMosambiekNamibiëNieu-KaledoniëNigerNorfolkeilandNigeriëNicaraguaNederl" + + "andNoorweëNepalNauruNiueNieu-SeelandOmanPanamaPeruFrans-PolinesiëPapoea-" + + "Nieu-GuineeFilippynePakistanPoleSt. Pierre en MiquelonPitcairneilandePue" + + "rto RicoPalestynse gebiedePortugalPalauParaguayKatarOmliggende OseaniëRé" + + "unionRoemeniëSerwiëRuslandRwandaSaoedi-ArabiëSalomonseilandeSeychelleSoe" + + "danSwedeSingapoerSint HelenaSloweniëSvalbard en Jan MayenSlowakyeSierra " + + "LeoneSan MarinoSenegalSomaliëSurinameSuid-SoedanSão Tomé en PríncipeEl S" + + "alvadorSint MaartenSiriëSwazilandTristan da CunhaTurks- en Caicoseilande" + + "TsjadFranse Suidelike GebiedeTogoThailandTadjikistanTokelauOos-TimorTurk" + + "meniëTunisiëTongaTurkyeTrinidad en TobagoTuvaluTaiwanTanzaniëOekraïneUga" + + "ndaVS klein omliggende eilandeVerenigde State van AmerikaUruguayOesbekis" + + "tanVatikaanstadSt. Vincent en die GrenadineVenezuelaBritse Maagde-eiland" + + "eAmerikaanse Maagde-eilandeViëtnamVanuatuWallis en FutunaSamoaKosovoJeme" + + "nMayotteSuid-AfrikaZambiëZimbabweOnbekende gebiedWêreldAfrikaNoord-Ameri" + + "kaSuid-AmerikaOseaniëWes-AfrikaSentraal-AmerikaOos-AfrikaNoord-AfrikaMid" + + "de-AfrikaSuider-AfrikaAmerikasNoordelike AmerikaKaribiesOos-AsiëSuid-Asi" + + "ëSuidoos-AsiëSuid-EuropaAustralasiëMelanesiëMikronesiese streekPolinesi" + + "ëAsiëSentraal-AsiëWes-AsiëEuropaOos-EuropaNoord-EuropaWes-EuropaLatyns-" + + "Amerika" + +var afRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x000f, 0x0016, 0x0030, 0x003a, 0x004c, 0x0054, 0x005c, + 0x0064, 0x0076, 0x007c, 0x0086, 0x0091, 0x00a1, 0x00aa, 0x00b4, + 0x00b9, 0x00c6, 0x00d1, 0x00e7, 0x00ef, 0x00f9, 0x0100, 0x010c, + 0x0114, 0x011b, 0x0122, 0x0127, 0x0137, 0x013e, 0x0145, 0x014d, + 0x0160, 0x0169, 0x0170, 0x0177, 0x0184, 0x018c, 0x0193, 0x0199, + 0x019f, 0x01ac, 0x01d0, 0x01ed, 0x0200, 0x020b, 0x0213, 0x021e, + 0x0223, 0x022b, 0x0230, 0x0239, 0x0249, 0x0253, 0x0257, 0x0261, + 0x0269, 0x0273, 0x0279, 0x028c, 0x0295, 0x02a1, 0x02a9, 0x02b2, + // Entry 40 - 7F + 0x02ba, 0x02d0, 0x02d8, 0x02e8, 0x02ef, 0x02f6, 0x02fc, 0x0306, + 0x030d, 0x0313, 0x031c, 0x0329, 0x0330, 0x0335, 0x0344, 0x034f, + 0x035d, 0x0365, 0x036b, 0x037e, 0x0385, 0x038d, 0x0399, 0x03a1, + 0x03a6, 0x03af, 0x03b8, 0x03bf, 0x03c5, 0x03cf, 0x03e1, 0x03eb, + 0x0419, 0x0422, 0x0426, 0x0433, 0x0439, 0x044b, 0x0464, 0x046c, + 0x0474, 0x047a, 0x0482, 0x0493, 0x049d, 0x04a4, 0x04aa, 0x04b4, + 0x04ba, 0x04d4, 0x04d8, 0x04dc, 0x04e2, 0x04e9, 0x04ef, 0x04f6, + 0x04ff, 0x0504, 0x0509, 0x0512, 0x051a, 0x0522, 0x0528, 0x053a, + // Entry 80 - BF + 0x0545, 0x054f, 0x0556, 0x0565, 0x056e, 0x0572, 0x0579, 0x0582, + 0x058f, 0x0598, 0x05a0, 0x05a7, 0x05ad, 0x05b6, 0x05bd, 0x05c3, + 0x05ca, 0x05d0, 0x05d7, 0x05e1, 0x05eb, 0x05f5, 0x0604, 0x060e, + 0x0612, 0x0621, 0x062a, 0x0639, 0x064e, 0x0658, 0x0663, 0x066d, + 0x0672, 0x067b, 0x0683, 0x0689, 0x0690, 0x0699, 0x06a2, 0x06aa, + 0x06b9, 0x06be, 0x06cb, 0x06d3, 0x06dc, 0x06e5, 0x06ed, 0x06f2, + 0x06f7, 0x06fb, 0x0707, 0x070b, 0x0711, 0x0715, 0x0725, 0x0737, + 0x0740, 0x0748, 0x074c, 0x0762, 0x0771, 0x077c, 0x078e, 0x0796, + // Entry C0 - FF + 0x079b, 0x07a3, 0x07a8, 0x07bb, 0x07c3, 0x07cc, 0x07d3, 0x07da, + 0x07e0, 0x07ee, 0x07fd, 0x0806, 0x080c, 0x0811, 0x081a, 0x0825, + 0x082e, 0x0843, 0x084b, 0x0857, 0x0861, 0x0868, 0x0870, 0x0878, + 0x0883, 0x089a, 0x08a5, 0x08b1, 0x08b7, 0x08c0, 0x08d0, 0x08e7, + 0x08ec, 0x0904, 0x0908, 0x0910, 0x091b, 0x0922, 0x092b, 0x0935, + 0x093d, 0x0942, 0x0948, 0x095a, 0x0960, 0x0966, 0x096f, 0x0978, + 0x097e, 0x0999, 0x09b4, 0x09bb, 0x09c6, 0x09d2, 0x09ee, 0x09f7, + 0x0a0c, 0x0a26, 0x0a2e, 0x0a35, 0x0a45, 0x0a4a, 0x0a50, 0x0a55, + // Entry 100 - 13F + 0x0a5c, 0x0a67, 0x0a6e, 0x0a76, 0x0a86, 0x0a8d, 0x0a93, 0x0aa0, + 0x0aac, 0x0ab4, 0x0abe, 0x0ace, 0x0ad8, 0x0ae4, 0x0af0, 0x0afd, + 0x0b05, 0x0b17, 0x0b1f, 0x0b28, 0x0b32, 0x0b3f, 0x0b4a, 0x0b56, + 0x0b60, 0x0b73, 0x0b7d, 0x0b82, 0x0b90, 0x0b99, 0x0b9f, 0x0ba9, + 0x0bb5, 0x0bbf, 0x0bcd, +} // Size: 606 bytes + +var amRegionStr string = "" + // Size: 5336 bytes + "አሴንሽን ደሴትአንዶራየተባበሩት አረብ ኤምሬትስአፍጋኒስታንአንቲጓ እና ባሩዳአንጉኢላአልባኒያአርሜኒያኔዘርላንድስ አን" + + "ቲልስአንጐላአንታርክቲካአርጀንቲናየአሜሪካ ሳሞአኦስትሪያአውስትራልያአሩባየአላንድ ደሴቶችአዘርባጃንቦስኒያ እና ሄር" + + "ዞጎቪኒያባርቤዶስባንግላዲሽቤልጄምቡርኪና ፋሶቡልጌሪያባህሬንብሩንዲቤኒንቅዱስ በርቴሎሜቤርሙዳብሩኒቦሊቪያየካሪቢያን " + + "ኔዘርላንድስብራዚልባሃማስቡህታንቡቬት ደሴትቦትስዋናቤላሩስቤሊዘካናዳኮኮስ(ኬሊንግ) ደሴቶችኮንጎ-ኪንሻሳየመካከለኛው" + + " አፍሪካ ሪፐብሊክኮንጎ ብራዛቪልስዊዘርላንድኮት ዲቯርኩክ ደሴቶችቺሊካሜሩንቻይናኮሎምቢያክሊፐርቶን ደሴትኮስታ ሪካኩባ" + + "ኬፕ ቬርዴኩራሳዎየገና ደሴትሳይፕረስቼክ ሪፑብሊክጀርመንዲዬጎ ጋርሺያጂቡቲዴንማርክዶሚኒካዶሚኒክ ሪፑብሊክአልጄሪያሴ" + + "ኡታና ሜሊላኢኳዶርኤስቶኒያግብጽምዕራባዊ ሳህራኤርትራስፔንኢትዮጵያየአውሮፓ ህብረትፊንላንድፊጂየፎክላንድ ደሴቶችሚክ" + + "ሮኔዢያየፋሮ ደሴቶችፈረንሳይጋቦንእንግሊዝግሬናዳጆርጂያየፈረንሳይ ጉዊአናጉርነሲጋናጂብራልተርግሪንላንድጋምቢያጊኒጉዋ" + + "ደሉፕኢኳቶሪያል ጊኒግሪክደቡብ ጆርጂያ እና የደቡብ ሳንድዊች ደሴቶችጉዋቲማላጉዋምጊኒ ቢሳኦጉያናሆንግ ኮንግ SAR" + + " ቻይናኽርድ ደሴቶችና ማክዶናልድ ደሴቶችሆንዱራስክሮኤሽያሀይቲሀንጋሪየካናሪ ደሴቶችኢንዶኔዢያአየርላንድእስራኤልአይል " + + "ኦፍ ማንህንድየብሪታኒያ ህንድ ውቂያኖስ ግዛትኢራቅኢራንአይስላንድጣሊያንጀርሲጃማይካጆርዳንጃፓንኬንያኪርጊስታንካምቦ" + + "ዲያኪሪባቲኮሞሮስቅዱስ ኪትስ እና ኔቪስሰሜን ኮሪያደቡብ ኮሪያክዌትካይማን ደሴቶችካዛኪስታንላኦስሊባኖስሴንት ሉቺያ" + + "ሊችተንስታይንሲሪላንካላይቤሪያሌሶቶሊቱዌኒያሉክሰምበርግላትቪያሊቢያሞሮኮሞናኮሞልዶቫሞንተኔግሮሴንት ማርቲንማዳጋስካር" + + "ማርሻል አይላንድመቄዶንያማሊማይናማር(በርማ)ሞንጎሊያማካኡ ልዩ የአስተዳደር ክልል ቻይናየሰሜናዊ ማሪያና ደሴቶችማ" + + "ርቲኒክሞሪቴኒያሞንትሴራትማልታሞሪሸስማልዲቭስማላዊሜክሲኮማሌዢያሞዛምቢክናሚቢያኒው ካሌዶኒያኒጀርኖርፎልክ ደሴትናይጄ" + + "ሪያኒካራጓኔዘርላንድኖርዌይኔፓልናኡሩኒኡይኒው ዚላንድኦማንፓናማፔሩየፈረንሳይ ፖሊኔዢያፓፑዋ ኒው ጊኒፊሊፒንስፓኪስታ" + + "ንፖላንድቅዱስ ፒዬር እና ሚኩኤሎንፒትካኢርን አይስላንድፖርታ ሪኮየፍልስጤም ግዛትፖርቱጋልፓላውፓራጓይኳታርአውትላይ" + + "ንግ ኦሽንያሪዩኒየንሮሜኒያሰርብያራሽያሩዋንዳሳውድአረቢያሰሎሞን ደሴትሲሼልስሱዳንስዊድንሲንጋፖርሴንት ሄለናስሎቬኒያ" + + "ስቫልባርድ እና ጃን ማየንስሎቫኪያሴራሊዮንሳን ማሪኖሴኔጋልሱማሌሱሪናምደቡብ ሱዳንሳኦ ቶሜ እና ፕሪንሲፔኤል ሳልቫ" + + "ዶርሲንት ማርተንሲሪያሱዋዚላንድትሪስታን ዲ ኩንሃየቱርኮችና የካኢኮስ ደሴቶችቻድየፈረንሳይ ደቡባዊ ግዛቶችቶጐታይላ" + + "ንድታጃኪስታንቶክላውምስራቅ ሌስትቱርክሜኒስታንቱኒዚያቶንጋቱርክትሪናዳድ እና ቶቤጎቱቫሉታይዋንታንዛኒያዩክሬንዩጋንዳ" + + "የዩ ኤስ ጠረፍ ላይ ያሉ ደሴቶችዩናይትድ ስቴትስኡራጓይኡዝቤኪስታንቫቲካን ከተማቅዱስ ቪንሴንት እና ግሬናዲንስቬን" + + "ዙዌላየእንግሊዝ ቨርጂን ደሴቶችየአሜሪካ ቨርጂን ደሴቶችቬትናምቫኑአቱዋሊስ እና ፉቱና ደሴቶችሳሞአኮሶቮየመንሜይኦቴ" + + "ደቡብ አፍሪካዛምቢያዚምቧቤያልታወቀ ክልልዓለምአፍሪካሰሜን አሜሪካደቡብ አሜሪካኦሽኒአምስራቃዊ አፍሪካመካከለኛው አ" + + "ሜሪካምዕራባዊ አፍሪካሰሜናዊ አፍሪካመካከለኛው አፍሪካደቡባዊ አፍሪካአሜሪካሰሜናዊ አሜሪካካሪቢያንምዕራባዊ እሲያደ" + + "ቡባዊ እሲያምዕራባዊ ደቡብ እሲያደቡባዊ አውሮፓአውስትራሊያሜላኔዥያየማይክሮኔዥያን ክልልፖሊኔዥያእሲያመካከለኛው እ" + + "ሲያምስራቃዊ እሲያአውሮፓምዕራባዊ አውሮፓሰሜናዊ አውሮፓምስራቃዊ አውሮፓላቲን አሜሪካ" + +var amRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0019, 0x0025, 0x0051, 0x0066, 0x0083, 0x0092, 0x00a1, + 0x00b0, 0x00d5, 0x00e1, 0x00f6, 0x0108, 0x0121, 0x0130, 0x0145, + 0x014e, 0x016a, 0x017c, 0x01a5, 0x01b4, 0x01c6, 0x01d2, 0x01e5, + 0x01f4, 0x0200, 0x020c, 0x0215, 0x022e, 0x023a, 0x0243, 0x024f, + 0x0277, 0x0283, 0x028f, 0x029b, 0x02ae, 0x02bd, 0x02c9, 0x02d2, + 0x02db, 0x02ff, 0x0315, 0x0347, 0x0360, 0x0375, 0x0385, 0x0398, + 0x039e, 0x03aa, 0x03b3, 0x03c2, 0x03de, 0x03ee, 0x03f4, 0x0404, + 0x0410, 0x0423, 0x0432, 0x0448, 0x0454, 0x046a, 0x0473, 0x0482, + // Entry 40 - 7F + 0x048e, 0x04aa, 0x04b9, 0x04cf, 0x04db, 0x04ea, 0x04f3, 0x050c, + 0x0518, 0x0521, 0x0530, 0x054c, 0x055b, 0x0561, 0x0580, 0x0592, + 0x05a8, 0x05b7, 0x05c0, 0x05cf, 0x05db, 0x05e7, 0x0606, 0x0612, + 0x0618, 0x062a, 0x063c, 0x0648, 0x064e, 0x065d, 0x0676, 0x067f, + 0x06c6, 0x06d5, 0x06de, 0x06ee, 0x06f7, 0x0718, 0x0751, 0x0760, + 0x076f, 0x0778, 0x0784, 0x079d, 0x07af, 0x07c1, 0x07d0, 0x07e7, + 0x07f0, 0x0826, 0x082f, 0x0838, 0x084a, 0x0856, 0x085f, 0x086b, + 0x0877, 0x0880, 0x0889, 0x089b, 0x08aa, 0x08b6, 0x08c2, 0x08e6, + // Entry 80 - BF + 0x08f9, 0x090c, 0x0915, 0x092e, 0x0940, 0x0949, 0x0955, 0x0968, + 0x0980, 0x098f, 0x099e, 0x09a7, 0x09b6, 0x09cb, 0x09d7, 0x09e0, + 0x09e9, 0x09f2, 0x09fe, 0x0a10, 0x0a26, 0x0a38, 0x0a54, 0x0a63, + 0x0a69, 0x0a83, 0x0a92, 0x0acc, 0x0af5, 0x0b04, 0x0b13, 0x0b25, + 0x0b2e, 0x0b3a, 0x0b49, 0x0b52, 0x0b5e, 0x0b6a, 0x0b79, 0x0b85, + 0x0b9b, 0x0ba4, 0x0bbd, 0x0bcc, 0x0bd8, 0x0bea, 0x0bf6, 0x0bff, + 0x0c08, 0x0c11, 0x0c24, 0x0c2d, 0x0c36, 0x0c3c, 0x0c5e, 0x0c75, + 0x0c84, 0x0c93, 0x0c9f, 0x0cc9, 0x0cee, 0x0cfe, 0x0d1a, 0x0d29, + // Entry C0 - FF + 0x0d32, 0x0d3e, 0x0d47, 0x0d69, 0x0d78, 0x0d84, 0x0d90, 0x0d99, + 0x0da5, 0x0dba, 0x0dd0, 0x0ddc, 0x0de5, 0x0df1, 0x0e00, 0x0e13, + 0x0e22, 0x0e4c, 0x0e5b, 0x0e6a, 0x0e7a, 0x0e86, 0x0e8f, 0x0e9b, + 0x0eae, 0x0ed2, 0x0ee8, 0x0efe, 0x0f07, 0x0f19, 0x0f36, 0x0f65, + 0x0f6b, 0x0f97, 0x0f9d, 0x0fac, 0x0fbe, 0x0fca, 0x0fe0, 0x0ff8, + 0x1004, 0x100d, 0x1016, 0x1036, 0x103f, 0x104b, 0x105a, 0x1066, + 0x1072, 0x10a4, 0x10c0, 0x10cc, 0x10e1, 0x10f7, 0x112a, 0x1139, + 0x1165, 0x118e, 0x119a, 0x11a6, 0x11cd, 0x11d6, 0x11df, 0x11e8, + // Entry 100 - 13F + 0x11f4, 0x120a, 0x1216, 0x1222, 0x123b, 0x1244, 0x1250, 0x1266, + 0x127c, 0x1288, 0x12a4, 0x12c3, 0x12df, 0x12f8, 0x1317, 0x1330, + 0x133c, 0x1355, 0x1364, 0x137d, 0x1393, 0x13b6, 0x13cf, 0x13e4, + 0x13f3, 0x1418, 0x1427, 0x1430, 0x144c, 0x1465, 0x1471, 0x148d, + 0x14a6, 0x14c2, 0x14d8, +} // Size: 606 bytes + +var arRegionStr string = "" + // Size: 5380 bytes + "جزيرة أسينشيونأندوراالإمارات العربية المتحدةأفغانستانأنتيغوا وبربوداأنغو" + + "يلاألبانياأرمينياجزر الأنتيل الهولنديةأنغولاأنتاركتيكاالأرجنتينساموا ال" + + "أمريكيةالنمساأسترالياأروباجزر آلاندأذربيجانالبوسنة والهرسكبربادوسبنجلاد" + + "يشبلجيكابوركينا فاسوبلغارياالبحرينبورونديبنينسان بارتليميبرمودابرونايبو" + + "ليفياهولندا الكاريبيةالبرازيلالبهامابوتانجزيرة بوفيهبتسوانابيلاروسبليزك" + + "نداجزر كوكوس (كيلينغ)الكونغو - كينشاساجمهورية أفريقيا الوسطىالكونغو - ب" + + "رازافيلسويسراساحل العاججزر كوكتشيليالكاميرونالصينكولومبياجزيرة كليبيرتو" + + "نكوستاريكاكوباالرأس الأخضركوراساوجزيرة الكريسماسقبرصجمهورية التشيكألمان" + + "يادييغو غارسياجيبوتيالدانمركدومينيكاجمهورية الدومينيكالجزائرسيوتا وميلي" + + "لاالإكوادورإستونيامصرالصحراء الغربيةإريترياإسبانياإثيوبياالاتحاد الأورو" + + "بيفنلندافيجيجزر فوكلاندميكرونيزياجزر فاروفرنساالجابونالمملكة المتحدةغري" + + "ناداجورجياغويانا الفرنسيةغيرنزيغاناجبل طارقغرينلاندغامبياغينياغوادلوبغي" + + "نيا الإستوائيةاليونانجورجيا الجنوبية وجزر ساندويتش الجنوبيةغواتيمالاغوا" + + "مغينيا بيساوغياناهونغ كونغ الصينيةجزيرة هيرد وجزر ماكدونالدهندوراسكروات" + + "ياهايتيهنغارياجزر الكناريإندونيسياأيرلنداإسرائيلجزيرة مانالهندالإقليم ا" + + "لبريطاني في المحيط الهنديالعراقإيرانأيسلنداإيطالياجيرسيجامايكاالأردنالي" + + "ابانكينياقرغيزستانكمبودياكيريباتيجزر القمرسانت كيتس ونيفيسكوريا الشمالي" + + "ةكوريا الجنوبيةالكويتجزر الكايمنكازاخستانلاوسلبنانسانت لوسياليختنشتاينس" + + "ريلانكاليبيرياليسوتوليتوانيالوكسمبورغلاتفياليبياالمغربموناكومولدافياالج" + + "بل الأسودسانت مارتنمدغشقرجزر المارشالمقدونياماليميانمار -بورمامنغوليامك" + + "او الصينية (منطقة إدارية خاصة)جزر ماريانا الشماليةمارتينيكموريتانيامونت" + + "سراتمالطاموريشيوسجزر المالديفملاويالمكسيكماليزياموزمبيقناميبياكاليدونيا" + + " الجديدةالنيجرجزيرة نورفوكنيجيريانيكاراغواهولنداالنرويجنيبالناورونيوينيو" + + "زيلنداعُمانبنمابيروبولينيزيا الفرنسيةبابوا غينيا الجديدةالفلبينباكستانب" + + "ولنداسانت بيير وميكولونجزر بيتكيرنبورتوريكوالأراضي الفلسطينيةالبرتغالبا" + + "لاوباراغوايقطرأوقيانوسيا النائيةروينيونرومانياصربياروسياروانداالمملكة ا" + + "لعربية السعوديةجزر سليمانسيشلالسودانالسويدسنغافورةسانت هيلناسلوفينياسفا" + + "لبارد وجان مايانسلوفاكياسيراليونسان مارينوالسنغالالصومالسورينامجنوب الس" + + "ودانساو تومي وبرينسيبيالسلفادورسينت مارتنسورياسوازيلاندتريستان دي كونها" + + "جزر توركس وكايكوستشادالأقاليم الجنوبية الفرنسيةتوغوتايلاندطاجيكستانتوكي" + + "لوتيمور الشرقيةتركمانستانتونستونغاتركياترينيداد وتوباغوتوفالوتايوانتنزا" + + "نياأوكرانياأوغنداجزر الولايات المتحدة النائيةالولايات المتحدةأورغوايأوز" + + "بكستانالفاتيكانسانت فنسنت وغرنادينفنزويلاجزر فرجين البريطانيةجزر فرجين " + + "الأمريكيةفيتنامفانواتوجزر والس وفوتوناسامواكوسوفواليمنمايوتجنوب أفريقيا" + + "زامبيازيمبابويمنطقة غير معروفةالعالمأفريقياأمريكا الشماليةأمريكا الجنوب" + + "يةأوقيانوسياغرب أفريقياأمريكا الوسطىشرق أفريقياشمال أفريقياوسط أفريقياأ" + + "فريقيا الجنوبيةالأمريكتانشمال أمريكاالكاريبيشرق آسياجنوب آسياجنوب شرق آ" + + "سياجنوب أوروباأسترالاسياميلانيزياالجزر الميكرونيزيةبولينيزياآسياوسط آسي" + + "اغرب آسياأوروباشرق أوروباشمال أوروباغرب أوروباأمريكا اللاتينية" + +var arRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x001b, 0x0027, 0x0055, 0x0067, 0x0084, 0x0092, 0x00a0, + 0x00ae, 0x00d6, 0x00e2, 0x00f6, 0x0108, 0x0125, 0x0131, 0x0141, + 0x014b, 0x015c, 0x016c, 0x0189, 0x0197, 0x01a7, 0x01b3, 0x01ca, + 0x01d8, 0x01e6, 0x01f4, 0x01fc, 0x0213, 0x021f, 0x022b, 0x0239, + 0x0258, 0x0268, 0x0276, 0x0280, 0x0295, 0x02a3, 0x02b1, 0x02b9, + 0x02c1, 0x02e1, 0x0300, 0x032a, 0x034b, 0x0357, 0x036a, 0x0377, + 0x0381, 0x0393, 0x039d, 0x03ad, 0x03ca, 0x03dc, 0x03e4, 0x03fb, + 0x0409, 0x0426, 0x042e, 0x0449, 0x0457, 0x046e, 0x047a, 0x048a, + // Entry 40 - 7F + 0x049a, 0x04bb, 0x04c9, 0x04e2, 0x04f4, 0x0502, 0x0508, 0x0525, + 0x0533, 0x0541, 0x054f, 0x056e, 0x057a, 0x0582, 0x0597, 0x05ab, + 0x05ba, 0x05c4, 0x05d2, 0x05ef, 0x05fd, 0x0609, 0x0626, 0x0632, + 0x063a, 0x0649, 0x0659, 0x0665, 0x066f, 0x067d, 0x069c, 0x06aa, + 0x06f2, 0x0704, 0x070c, 0x0721, 0x072b, 0x074b, 0x077a, 0x0788, + 0x0796, 0x07a0, 0x07ae, 0x07c3, 0x07d5, 0x07e3, 0x07f1, 0x0802, + 0x080c, 0x084c, 0x0858, 0x0862, 0x0870, 0x087e, 0x0888, 0x0896, + 0x08a2, 0x08b0, 0x08ba, 0x08cc, 0x08da, 0x08ea, 0x08fb, 0x0919, + // Entry 80 - BF + 0x0934, 0x094f, 0x095b, 0x0970, 0x0982, 0x098a, 0x0994, 0x09a7, + 0x09bb, 0x09cb, 0x09d9, 0x09e5, 0x09f5, 0x0a07, 0x0a13, 0x0a1d, + 0x0a29, 0x0a35, 0x0a45, 0x0a5c, 0x0a6f, 0x0a7b, 0x0a92, 0x0aa0, + 0x0aa8, 0x0ac2, 0x0ad0, 0x0b0a, 0x0b30, 0x0b40, 0x0b52, 0x0b62, + 0x0b6c, 0x0b7c, 0x0b93, 0x0b9d, 0x0bab, 0x0bb9, 0x0bc7, 0x0bd5, + 0x0bf6, 0x0c02, 0x0c19, 0x0c27, 0x0c39, 0x0c45, 0x0c53, 0x0c5d, + 0x0c67, 0x0c6f, 0x0c81, 0x0c8b, 0x0c93, 0x0c9b, 0x0cbe, 0x0ce2, + 0x0cf0, 0x0cfe, 0x0d0a, 0x0d2c, 0x0d41, 0x0d53, 0x0d76, 0x0d86, + // Entry C0 - FF + 0x0d90, 0x0da0, 0x0da6, 0x0dc9, 0x0dd7, 0x0de5, 0x0def, 0x0df9, + 0x0e05, 0x0e33, 0x0e46, 0x0e4e, 0x0e5c, 0x0e68, 0x0e78, 0x0e8b, + 0x0e9b, 0x0ebf, 0x0ecf, 0x0edf, 0x0ef2, 0x0f00, 0x0f0e, 0x0f1c, + 0x0f33, 0x0f55, 0x0f67, 0x0f7a, 0x0f84, 0x0f96, 0x0fb4, 0x0fd4, + 0x0fdc, 0x100e, 0x1016, 0x1024, 0x1036, 0x1042, 0x105b, 0x106f, + 0x1077, 0x1081, 0x108b, 0x10aa, 0x10b6, 0x10c2, 0x10d0, 0x10e0, + 0x10ec, 0x1121, 0x1140, 0x114e, 0x1160, 0x1172, 0x1196, 0x11a4, + 0x11ca, 0x11ee, 0x11fa, 0x1208, 0x1226, 0x1230, 0x123c, 0x1246, + // Entry 100 - 13F + 0x1250, 0x1267, 0x1273, 0x1283, 0x12a1, 0x12ad, 0x12bb, 0x12d8, + 0x12f5, 0x1309, 0x131e, 0x1337, 0x134c, 0x1363, 0x1378, 0x1397, + 0x13ab, 0x13c0, 0x13d0, 0x13df, 0x13f0, 0x1408, 0x141d, 0x1431, + 0x1443, 0x1466, 0x1478, 0x1480, 0x148f, 0x149e, 0x14aa, 0x14bd, + 0x14d2, 0x14e5, 0x1504, +} // Size: 606 bytes + +var azRegionStr string = "" + // Size: 3197 bytes + "Yüksəliş AdasıAndorraBirləşmiş Ərəb ƏmirlikləriƏfqanıstanAntiqua və Barb" + + "udaAngilaAlbaniyaErmənistanHollandiya antilleriAnqolaAntarktikaArgentina" + + "Amerika SamoasıAvstriyaAvstraliyaArubaAland AdalarıAzərbaycanBosniya və " + + "HersoqovinaBarbadosBanqladeşBelçikaBurkina FasoBolqariyaBəhreynBurundiBe" + + "ninSan BartolomeyBermudaBruneyBoliviyaKarib NiderlandıBraziliyaBaham Ada" + + "larıButanBuve AdasıBotsvanaBelarusBelizKanadaKokos AdalarıKonqo - Kinşas" + + "aMərkəzi Afrika RespublikasıKonqo - BrazzavilİsveçrəFil Dişi SahiliKuk A" + + "dalarıÇiliKamerunÇinKolumbiyaKlipperton AdasıKosta RikaKubaKape VerdeKur" + + "asaoMilad AdasıKiprÇexiyaAlmaniyaDieqo QarsiyaCibutiDanimarkaDominikaDom" + + "inikan RespublikasıƏlcəzairSeuta və MelilyaEkvadorEstoniyaMisirQərbi Sah" + + "araEritreyaİspaniyaEfiopiyaAvropa BirliyiFinlandiyaFiciFolklend AdalarıM" + + "ikroneziyaFarer AdalarıFransaQabonBirləşmiş KrallıqQrenadaGürcüstanFrans" + + "ız QviyanasıGernseyQanaGibraltarQrenlandiyaQambiyaQvineyaQvadelupaEkvat" + + "orial QvineyaYunanıstanCənubi Corciya və Cənubi Sendviç AdalarıQvatemala" + + "QuamQvineya-BisauQviyanaHonq Konq Xüsusi İnzibati Ərazi ÇinHerd və Mak D" + + "onald AdalarıHondurasXorvatiyaHaitiMacarıstanKanar Adalarıİndoneziyaİrla" + + "ndiyaİsrailMen AdasıHindistanBritaniya Hind Okeanı Ərazisiİraqİranİsland" + + "iyaİtaliyaCersiYamaykaİordaniyaYaponiyaKeniyaQırğızıstanKambocaKiribatiK" + + "omor AdalarıSan Kits və NevisŞimali KoreyaCənubi KoreyaKüveytKayman Adal" + + "arıQazaxıstanLaosLivanSan LüsiyaLixtenşteynŞri LankaLiberiyaLesotoLitvaL" + + "üksemburqLatviyaLiviyaMərakeşMonakoMoldovaMonteneqroSan MartinMadaqaska" + + "rMarşal AdalarıMakedoniyaMaliMyanmaMonqoliyaMakao Xüsusi İnzibati Ərazi " + + "ÇinŞimali Mariana AdalarıMartinikMavritaniyaMonseratMaltaMavrikiMaldiv " + + "AdalarıMalaviMeksikaMalayziyaMozambikNamibiyaYeni KaledoniyaNigerNorfolk" + + " AdasıNigeriyaNikaraquaNiderlandNorveçNepalNauruNiueYeni ZelandiyaOmanPa" + + "namaPeruFransız PolineziyasıPapua Yeni QvineyaFilippinPakistanPolşaSan P" + + "ier və MikelonPitkern AdalarıPuerto RikoFələstin ƏraziləriPortuqalPalauP" + + "araqvayQatarUzaq OkeaniyaReunionRumıniyaSerbiyaRusiyaRuandaSəudiyyə Ərəb" + + "istanıSolomon AdalarıSeyşel AdalarıSudanİsveçSinqapurMüqəddəs YelenaSlov" + + "eniyaSvalbard və Yan MayenSlovakiyaSiera LeonSan MarinoSeneqalSomaliSuri" + + "namCənubi SudanSao Tome və PrinsipSalvadorSint MaartenSuriyaSvazilendTri" + + "stan da KunyaTurks və Kaikos AdalarıÇadFransa Cənub ƏraziləriToqoTayland" + + "TacikistanTokelauŞərqi TimorTürkmənistanTunisTonqaTürkiyaTrinidad və Tob" + + "aqoTuvaluTayvanTanzaniyaUkraynaUqandaBirləşmiş Ştatlar Uzaq AdalarAmerik" + + "a Birləşmiş ŞtatlarıUruqvayÖzbəkistanVatikanSan Vinsent və QrenadaVenesu" + + "elaBritaniya Vircin AdalarıABŞ Vircin AdalarıVyetnamVanuatuUolis və Futu" + + "naSamoaKosovoYəmənMayotCənub AfrikaZambiyaZimbabveNaməlum RegionDünyaAfr" + + "ikaŞimali AmerikaCənubi AmerikaOkeaniyaQərbi AfrikaMərkəzi AmerikaŞərqi " + + "AfrikaŞimali AfrikaMərkəzi AfrikaCənubi AfrikaAmerikalarŞimal AmerikasıK" + + "aribŞərqi AsiyaCənubi AsiyaCənub-Şərqi AsiyaCənubi AvropaAvstralaziyaMel" + + "aneziyaMikroneziya RegionuPolineziyaAsiyaMərkəzi AsiyaQərbi AsiyaAvropaŞ" + + "ərqi AvropaŞimali AvropaQərbi AvropaLatın Amerikası" + +var azRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0012, 0x0019, 0x003a, 0x0046, 0x0059, 0x005f, 0x0067, + 0x0072, 0x0086, 0x008c, 0x0096, 0x009f, 0x00af, 0x00b7, 0x00c1, + 0x00c6, 0x00d4, 0x00df, 0x00f6, 0x00fe, 0x0108, 0x0110, 0x011c, + 0x0125, 0x012d, 0x0134, 0x0139, 0x0147, 0x014e, 0x0154, 0x015c, + 0x016d, 0x0176, 0x0184, 0x0189, 0x0194, 0x019c, 0x01a3, 0x01a8, + 0x01ae, 0x01bc, 0x01cc, 0x01ea, 0x01fb, 0x0205, 0x0215, 0x0221, + 0x0226, 0x022d, 0x0231, 0x023a, 0x024b, 0x0255, 0x0259, 0x0263, + 0x026a, 0x0276, 0x027a, 0x0281, 0x0289, 0x0296, 0x029c, 0x02a5, + // Entry 40 - 7F + 0x02ad, 0x02c4, 0x02ce, 0x02df, 0x02e6, 0x02ee, 0x02f3, 0x0300, + 0x0308, 0x0311, 0x0319, 0x0327, 0x0331, 0x0335, 0x0346, 0x0351, + 0x035f, 0x0365, 0x036a, 0x037f, 0x0386, 0x0391, 0x03a4, 0x03ab, + 0x03af, 0x03b8, 0x03c3, 0x03ca, 0x03d1, 0x03da, 0x03ec, 0x03f7, + 0x0424, 0x042d, 0x0431, 0x043e, 0x0445, 0x046c, 0x0488, 0x0490, + 0x0499, 0x049e, 0x04a9, 0x04b7, 0x04c2, 0x04cc, 0x04d3, 0x04dd, + 0x04e6, 0x0505, 0x050a, 0x050f, 0x0519, 0x0521, 0x0526, 0x052d, + 0x0537, 0x053f, 0x0545, 0x0554, 0x055b, 0x0563, 0x0571, 0x0583, + // Entry 80 - BF + 0x0591, 0x059f, 0x05a6, 0x05b5, 0x05c0, 0x05c4, 0x05c9, 0x05d4, + 0x05e0, 0x05ea, 0x05f2, 0x05f8, 0x05fd, 0x0608, 0x060f, 0x0615, + 0x061e, 0x0624, 0x062b, 0x0635, 0x063f, 0x0649, 0x0659, 0x0663, + 0x0667, 0x066d, 0x0676, 0x0699, 0x06b1, 0x06b9, 0x06c4, 0x06cc, + 0x06d1, 0x06d8, 0x06e7, 0x06ed, 0x06f4, 0x06fd, 0x0705, 0x070d, + 0x071c, 0x0721, 0x072f, 0x0737, 0x0740, 0x0749, 0x0750, 0x0755, + 0x075a, 0x075e, 0x076c, 0x0770, 0x0776, 0x077a, 0x0790, 0x07a2, + 0x07aa, 0x07b2, 0x07b8, 0x07cc, 0x07dc, 0x07e7, 0x07fd, 0x0805, + // Entry C0 - FF + 0x080a, 0x0812, 0x0817, 0x0824, 0x082b, 0x0834, 0x083b, 0x0841, + 0x0847, 0x085f, 0x086f, 0x087f, 0x0884, 0x088b, 0x0893, 0x08a5, + 0x08ae, 0x08c4, 0x08cd, 0x08d7, 0x08e1, 0x08e8, 0x08ee, 0x08f5, + 0x0902, 0x0916, 0x091e, 0x092a, 0x0930, 0x0939, 0x0949, 0x0962, + 0x0966, 0x097f, 0x0983, 0x098a, 0x0994, 0x099b, 0x09a8, 0x09b6, + 0x09bb, 0x09c0, 0x09c8, 0x09db, 0x09e1, 0x09e7, 0x09f0, 0x09f7, + 0x09fd, 0x0a1e, 0x0a3d, 0x0a44, 0x0a50, 0x0a57, 0x0a6e, 0x0a77, + 0x0a90, 0x0aa4, 0x0aab, 0x0ab2, 0x0ac2, 0x0ac7, 0x0acd, 0x0ad4, + // Entry 100 - 13F + 0x0ad9, 0x0ae6, 0x0aed, 0x0af5, 0x0b04, 0x0b0a, 0x0b10, 0x0b1f, + 0x0b2e, 0x0b36, 0x0b43, 0x0b54, 0x0b62, 0x0b70, 0x0b80, 0x0b8e, + 0x0b98, 0x0ba9, 0x0bae, 0x0bbb, 0x0bc8, 0x0bdc, 0x0bea, 0x0bf6, + 0x0c00, 0x0c13, 0x0c1d, 0x0c22, 0x0c31, 0x0c3d, 0x0c43, 0x0c51, + 0x0c5f, 0x0c6c, 0x0c7d, +} // Size: 606 bytes + +var bgRegionStr string = "" + // Size: 5899 bytes + "остров ВъзнесениеАндораОбединени арабски емирстваАфганистанАнтигуа и Бар" + + "будаАнгуилаАлбанияАрменияХоландски АнтилиАнголаАнтарктикаАржентинаАмери" + + "канска СамоаАвстрияАвстралияАрубаОландски островиАзербайджанБосна и Хер" + + "цеговинаБарбадосБангладешБелгияБуркина ФасоБългарияБахрейнБурундиБенинС" + + "ен БартелемиБермудаБруней ДаруссаламБоливияКарибска НидерландияБразилия" + + "БахамиБутаностров БувеБотсванаБеларусБелизКанадаКокосови острови (остро" + + "ви Кийлинг)Конго (Киншаса)Централноафриканска републикаКонго (Бразавил)" + + "ШвейцарияКот д’Ивоарострови КукЧилиКамерунКитайКолумбияостров Клипертон" + + "Коста РикаКубаКабо ВердеКюрасаоостров РождествоКипърЧешка републикаГерм" + + "анияДиего ГарсияДжибутиДанияДоминикаДоминиканска републикаАлжирСеута и " + + "МелияЕквадорЕстонияЕгипетЗападна СахараЕритреяИспанияЕтиопияЕвропейски " + + "съюзФинландияФиджиФолклендски островиМикронезияФарьорски островиФранция" + + "ГабонОбединеното кралствоГренадаГрузияФренска ГвианаГърнзиГанаГибралтар" + + "ГренландияГамбияГвинеяГваделупаЕкваториална ГвинеяГърцияЮжна Джорджия и" + + " Южни Сандвичеви островиГватемалаГуамГвинея-БисауГаянаХонконг, САР на Ки" + + "тайостров Хърд и острови МакдоналдХондурасХърватияХаитиУнгарияКанарски " + + "островиИндонезияИрландияИзраелостров МанИндияБританска територия в Инди" + + "йския океанИракИранИсландияИталияДжърсиЯмайкаЙорданияЯпонияКенияКиргизс" + + "танКамбоджаКирибатиКоморски островиСейнт Китс и НевисСеверна КореяЮжна " + + "КореяКувейтКайманови островиКазахстанЛаосЛиванСейнт ЛусияЛихтенщайнШри " + + "ЛанкаЛиберияЛесотоЛитваЛюксембургЛатвияЛибияМарокоМонакоМолдоваЧерна го" + + "раСен МартенМадагаскарМаршалови островиМакедонияМалиМианмар (Бирма)Монг" + + "олияМакао, САР на КитайСеверни Мариански островиМартиникаМавританияМонт" + + "сератМалтаМаврицийМалдивиМалавиМексикоМалайзияМозамбикНамибияНова Калед" + + "онияНигеростров НорфолкНигерияНикарагуаНидерландияНорвегияНепалНауруНиу" + + "еНова ЗеландияОманПанамаПеруФренска ПолинезияПапуа-Нова ГвинеяФилипиниП" + + "акистанПолшаСен Пиер и МикелонОстрови ПиткернПуерто РикоПалестински тер" + + "иторииПортугалияПалауПарагвайКатарОтдалечени острови на ОкеанияРеюнионР" + + "умънияСърбияРусияРуандаСаудитска АрабияСоломонови островиСейшелиСуданШв" + + "ецияСингапурСвета ЕленаСловенияСвалбард и Ян МайенСловакияСиера ЛеонеСа" + + "н МариноСенегалСомалияСуринамЮжен СуданСао Томе и ПринсипиСалвадорСинт " + + "МартенСирияСвазилендТристан да Куняострови Търкс и КайкосЧадФренски южн" + + "и територииТогоТайландТаджикистанТокелауИзточен ТиморТуркменистанТунисТ" + + "онгаТурцияТринидад и ТобагоТувалуТайванТанзанияУкрайнаУгандаОтдалечени " + + "острови на САЩСъединени щатиУругвайУзбекистанВатиканСейнт Винсънт и Гре" + + "надиниВенецуелаБритански Вирджински островиАмерикански Вирджински остро" + + "виВиетнамВануатуУолис и ФутунаСамоаКосовоЙеменМайотЮжна АфрикаЗамбияЗим" + + "бабвенепознат регионСвятАфрикаСеверноамерикански континентЮжна АмерикаО" + + "кеанияЗападна АфиркаЦентрална АмерикаИзточна АфрикаСеверна АфрикаЦентра" + + "лна АфрикаЮжноафрикански регионАмерикаСеверна АмерикаКарибски регионИзт" + + "очна АзияЮжна АзияЮгоизточна АзияЮжна ЕвропаАвстралазияМеланезияМикроне" + + "зийски регионПолинезияАзияЦентрална АзияЗападна АзияЕвропаИзточна Европ" + + "аСеверна ЕвропаЗападна ЕвропаЛатинска Америка" + +var bgRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0021, 0x002d, 0x005f, 0x0073, 0x0093, 0x00a1, 0x00af, + 0x00bd, 0x00dc, 0x00e8, 0x00fc, 0x010e, 0x012f, 0x013d, 0x014f, + 0x0159, 0x0178, 0x018e, 0x01b2, 0x01c2, 0x01d4, 0x01e0, 0x01f7, + 0x0207, 0x0215, 0x0223, 0x022d, 0x0246, 0x0254, 0x0275, 0x0283, + 0x02aa, 0x02ba, 0x02c6, 0x02d0, 0x02e5, 0x02f5, 0x0303, 0x030d, + 0x0319, 0x0358, 0x0373, 0x03ac, 0x03c9, 0x03db, 0x03f1, 0x0406, + 0x040e, 0x041c, 0x0426, 0x0436, 0x0455, 0x0468, 0x0470, 0x0483, + 0x0491, 0x04b0, 0x04ba, 0x04d7, 0x04e7, 0x04fe, 0x050c, 0x0516, + // Entry 40 - 7F + 0x0526, 0x0551, 0x055b, 0x0573, 0x0581, 0x058f, 0x059b, 0x05b6, + 0x05c4, 0x05d2, 0x05e0, 0x05fd, 0x060f, 0x0619, 0x063e, 0x0652, + 0x0673, 0x0681, 0x068b, 0x06b2, 0x06c0, 0x06cc, 0x06e7, 0x06f3, + 0x06fb, 0x070d, 0x0721, 0x072d, 0x0739, 0x074b, 0x0770, 0x077c, + 0x07c5, 0x07d7, 0x07df, 0x07f6, 0x0800, 0x0826, 0x0860, 0x0870, + 0x0880, 0x088a, 0x0898, 0x08b7, 0x08c9, 0x08d9, 0x08e5, 0x08f8, + 0x0902, 0x0948, 0x0950, 0x0958, 0x0968, 0x0974, 0x0980, 0x098c, + 0x099c, 0x09a8, 0x09b2, 0x09c6, 0x09d6, 0x09e6, 0x0a05, 0x0a26, + // Entry 80 - BF + 0x0a3f, 0x0a52, 0x0a5e, 0x0a7f, 0x0a91, 0x0a99, 0x0aa3, 0x0ab8, + 0x0acc, 0x0add, 0x0aeb, 0x0af7, 0x0b01, 0x0b15, 0x0b21, 0x0b2b, + 0x0b37, 0x0b43, 0x0b51, 0x0b64, 0x0b77, 0x0b8b, 0x0bac, 0x0bbe, + 0x0bc6, 0x0be1, 0x0bf1, 0x0c13, 0x0c43, 0x0c55, 0x0c69, 0x0c7b, + 0x0c85, 0x0c95, 0x0ca3, 0x0caf, 0x0cbd, 0x0ccd, 0x0cdd, 0x0ceb, + 0x0d06, 0x0d10, 0x0d2b, 0x0d39, 0x0d4b, 0x0d61, 0x0d71, 0x0d7b, + 0x0d85, 0x0d8d, 0x0da6, 0x0dae, 0x0dba, 0x0dc2, 0x0de3, 0x0e03, + 0x0e13, 0x0e23, 0x0e2d, 0x0e4e, 0x0e6b, 0x0e80, 0x0ea9, 0x0ebd, + // Entry C0 - FF + 0x0ec7, 0x0ed7, 0x0ee1, 0x0f18, 0x0f26, 0x0f34, 0x0f40, 0x0f4a, + 0x0f56, 0x0f75, 0x0f98, 0x0fa6, 0x0fb0, 0x0fbc, 0x0fcc, 0x0fe1, + 0x0ff1, 0x1014, 0x1024, 0x1039, 0x104c, 0x105a, 0x1068, 0x1076, + 0x1089, 0x10ac, 0x10bc, 0x10d1, 0x10db, 0x10ed, 0x1109, 0x1132, + 0x1138, 0x1162, 0x116a, 0x1178, 0x118e, 0x119c, 0x11b5, 0x11cd, + 0x11d7, 0x11e1, 0x11ed, 0x120d, 0x1219, 0x1225, 0x1235, 0x1243, + 0x124f, 0x127e, 0x1299, 0x12a7, 0x12bb, 0x12c9, 0x12f8, 0x130a, + 0x1340, 0x137a, 0x1388, 0x1396, 0x13b0, 0x13ba, 0x13c6, 0x13d0, + // Entry 100 - 13F + 0x13da, 0x13ef, 0x13fb, 0x140b, 0x1428, 0x1430, 0x143c, 0x1473, + 0x148a, 0x1498, 0x14b3, 0x14d4, 0x14ef, 0x150a, 0x1529, 0x1552, + 0x1560, 0x157d, 0x159a, 0x15b1, 0x15c2, 0x15df, 0x15f4, 0x160a, + 0x161c, 0x1643, 0x1655, 0x165d, 0x1678, 0x168f, 0x169b, 0x16b6, + 0x16d1, 0x16ec, 0x170b, +} // Size: 606 bytes + +var bnRegionStr string = "" + // Size: 9571 bytes + "অ্যাসসেনশন আইল্যান্ডএ্যান্ডোরাসংযুক্ত আরব আমিরাতআফগানিস্তানএন্টিগুয়া ও " + + "বারবুডাএ্যাঙ্গুইলাআলব্যানিয়াআর্মেনিয়ানেদারল্যান্ডস এ্যান্টিলিসঅ্যাঙ্" + + "গোলাঅ্যান্টার্কটিকাআর্জেন্টিনাআমেরিকান সামোয়াঅস্ট্রিয়াঅস্ট্রেলিয়াআর" + + "ুবাআলান্ড দ্বীপপুঞ্জআজারবাইজানবসনিয়া ও হার্জেগোভিনাবারবাদোসবাংলাদেশবে" + + "লজিয়ামবুরকিনা ফাসোবুলগেরিয়াবাহরাইনবুরুন্ডিবেনিনসেন্ট বারথেলিমিবারমুড" + + "াব্রুনেইবোলিভিয়াক্যারিবিয়ান নেদারল্যান্ডসব্রাজিলবাহামা দ্বীপপুঞ্জভুট" + + "ানবোভেট দ্বীপবতসোয়ানাবেলোরুশিয়াবেলিজকানাডাকোকোস (কিলিং)দ্বীপপুঞ্জকঙ্" + + "গো-কিনশাসামধ্য আফ্রিকার প্রজাতন্ত্রকঙ্গো - ব্রাজাভিলসুইজারল্যান্ডআইভরি" + + " কোস্টকুক দ্বীপপুঞ্জচিলিক্যামেরুনচীনকোলোম্বিয়াক্লিপারটন আইল্যান্ডকোস্টা" + + "রিকাকিউবাকেপভার্দেকিউরাসাওক্রিসমাস দ্বীপসাইপ্রাসচেক প্রজাতন্ত্রজার্মান" + + "িদিয়েগো গার্সিয়াজিবুতিডেনমার্কডোমিনিকাডোমেনিকান প্রজাতন্ত্রআলজেরিয়া" + + "কুউটা এবং মেলিলাইকুয়েডরএস্তোনিয়ামিশরপশ্চিম সাহারাইরিত্রিয়াস্পেনইফিও" + + "পিয়াইউরোপীয় ইউনিয়নফিনল্যান্ডফিজিফকল্যান্ড দ্বীপপুঞ্জমাইক্রোনেশিয়াফ" + + "্যারও দ্বীপপুঞ্জফ্রান্সগ্যাবনযুক্তরাজ্যগ্রেনেডাজর্জিয়াফরাসী গায়ানাগ্" + + "রাঞ্জিঘানাজিব্রাল্টারগ্রীনল্যান্ডগাম্বিয়াগিনিগুয়াদেলৌপনিরক্ষীয় গিনি" + + "গ্রীসদক্ষিণ জর্জিয়া ও দক্ষিণ স্যান্ডউইচ দ্বীপপুঞ্জগোয়াতেমালাগুয়ামগি" + + "নি-বিসাউগিয়ানাহংকং এসএআর চীনাহার্ড দ্বীপ এবং ম্যাকডোনাল্ড দ্বীপপুঞ্জহ" + + "ণ্ডুরাসক্রোয়েশিয়াহাইতিহাঙ্গেরিক্যানারি দ্বীপপুঞ্জইন্দোনেশিয়াআয়ারল্" + + "যান্ডইজরায়েলআইল অফ ম্যানভারতব্রিটিশ ভারত মহাসাগরীয় অঞ্চলইরাকইরানআইসল" + + "্যান্ডইতালীজার্সিজামাইকাজর্ডনজাপানকেনিয়াকির্গিজিয়াকম্বোডিয়াকিরিবাতি" + + "কমোরোসসেন্ট কিটস ও নেভিসউত্তর কোরিয়াদক্ষিণ কোরিয়াকুয়েতকেম্যান দ্বীপ" + + "পুঞ্জকাজাখস্তানলাওসলেবাননসেন্ট লুসিয়ালিচেনস্টেইনশ্রীলঙ্কালাইবেরিয়ালে" + + "সোথোলিথুয়ানিয়ালাক্সেমবার্গলাত্ভিয়ালিবিয়ামোরক্কোমোনাকোমোল্দাভিয়ামন" + + "্টিনিগ্রোসেন্ট মার্টিনমাদাগাস্কারমার্শাল দ্বীপপুঞ্জম্যাসাডোনিয়ামালিমা" + + "য়ানমার (বার্মা)মঙ্গোলিয়াম্যাকাও এস এ আর চায়নাউত্তরাঞ্চলীয় মারিয়ান" + + "া দ্বীপপুঞ্জমার্টিনিকমরিতানিয়ামন্টসেরাটমাল্টামরিশাসমালদ্বীপমালাউইমেক্" + + "সিকোমালয়েশিয়ামোজাম্বিকনামিবিয়ানিউ ক্যালেডোনিয়ানাইজারনিরফোক দ্বীপনা" + + "ইজেরিয়ানিকারাগুয়ানেদারল্যান্ডসনরওয়েনেপালনাউরুনিউয়েনিউজিল্যান্ডওমান" + + "পানামাপিরুফরাসী পলিনেশিয়াপাপুয়া নিউ গিনিফিলিপাইনপাকিস্তানপোল্যান্ডসে" + + "ন্ট পিয়ের ও মিকুয়েলনপিটকেয়ার্ন দ্বীপপুঞ্জপুয়ের্তো রিকোফিলিস্তিন অঞ" + + "্চলসমূহপর্তুগালপালাউপ্যারাগুয়েকাতারআউটলাইনিং ওসানিয়ারিইউনিয়নরুমানিয" + + "়াসার্বিয়ারাশিয়ারুয়ান্ডাসৌদি আরবসলোমন দ্বীপপুঞ্জসিসিলিসুদানসুইডেনসি" + + "ঙ্গাপুরসেন্ট হেলেনাস্লোভানিয়াস্বালবার্ড ও জান মেয়েনশ্লোভাকিয়াসিয়ের" + + "ালিওনসান মারিনোসেনেগালসোমালিয়াসুরিনামদক্ষিন সুদানসাওটোমা ও প্রিন্সিপি" + + "এল সালভেদরসিন্ট মার্টেনসিরিয়াসোয়াজিল্যান্ডট্রিস্টান ডা কুনহাতুর্কস ও" + + " কাইকোস দ্বীপপুঞ্জচাদফরাসী দক্ষিণাঞ্চলটোগোথাইল্যান্ডতাজিকস্থানটোকেলাউতিম" + + "ুর-লেস্তেতুর্কমেনিস্তানতিউনিশিয়াটোঙ্গাতুরস্কত্রিনিনাদ ও টোব্যাগোটুভাল" + + "ুতাইওয়ানতাঞ্জানিয়াইউক্রেইনউগান্ডাযুক্তরাষ্ট্রের পার্শ্ববর্তী দ্বীপপু" + + "ঞ্জমার্কিন যুক্তরাষ্ট্রউরুগুয়েউজবেকিস্তানভ্যাটিকান সিটিসেন্ট ভিনসেন্ট" + + " ও দ্যা গ্রেনাডিনসভেনেজুয়েলাব্রিটিশ ভার্জিন দ্বীপপুঞ্জমার্কিন ভার্জিন দ" + + "্বীপপুঞ্জভিয়েতনামভানুয়াটুওয়ালিস ও ফুটুনাসামোয়াকসোভোইয়েমেনমায়োত্ত" + + "েদক্ষিণ আফ্রিকাজাম্বিয়াজিম্বাবোয়েঅজানা স্থানপৃথিবীআফ্রিকাউত্তর আমেরি" + + "কাদক্ষিণ আমেরিকাওশিয়ানিয়াপশ্চিম আফ্রিকামধ্য আমেরিকাপূর্ব আফ্রিকাউত্ত" + + "র আফ্রিকামধ্য আফ্রিকাদক্ষিন আফ্রিকাআমেরিকাসউত্তরাঞ্চলীয় আমেরিকাক্যারা" + + "বিয়ানপূর্ব এশিয়াদক্ষিণ এশিয়াদক্ষিণ পূর্ব এশিয়াদক্ষিণ ইউরোপঅস্ট্রাল" + + "েশিয়াম্যালেনেশিয়াম্যালেনিশা অঞ্চলপলিনেশিয়াএশিয়ামধ্য এশিয়াপশ্চিম এ" + + "শিয়াইউরোপপূর্ব ইউরোপউত্তর ইউরোপপশ্চিম ইউরোপল্যাটিন আমেরিকা" + +var bnRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x003a, 0x0058, 0x008a, 0x00ab, 0x00e3, 0x0104, 0x0125, + 0x0143, 0x018c, 0x01aa, 0x01d7, 0x01f8, 0x0226, 0x0244, 0x0268, + 0x0277, 0x02a8, 0x02c6, 0x0304, 0x031c, 0x0334, 0x034f, 0x0371, + 0x038f, 0x03a4, 0x03bc, 0x03cb, 0x03f6, 0x040b, 0x0420, 0x043b, + 0x0487, 0x049c, 0x04cd, 0x04dc, 0x04fb, 0x0516, 0x0537, 0x0546, + 0x0558, 0x0597, 0x05bc, 0x0603, 0x0630, 0x0657, 0x0676, 0x069e, + 0x06aa, 0x06c5, 0x06ce, 0x06ef, 0x0726, 0x0744, 0x0753, 0x076e, + 0x0786, 0x07ae, 0x07c6, 0x07f1, 0x0809, 0x083a, 0x084c, 0x0864, + // Entry 40 - 7F + 0x087c, 0x08b9, 0x08d4, 0x0900, 0x0918, 0x0936, 0x0942, 0x0967, + 0x0985, 0x0994, 0x09af, 0x09dd, 0x09fb, 0x0a07, 0x0a41, 0x0a6b, + 0x0a9c, 0x0ab1, 0x0ac3, 0x0ae1, 0x0af9, 0x0b11, 0x0b36, 0x0b4e, + 0x0b5a, 0x0b7b, 0x0b9f, 0x0bba, 0x0bc6, 0x0be4, 0x0c0c, 0x0c1b, + 0x0c9b, 0x0cbc, 0x0cce, 0x0cea, 0x0cff, 0x0d28, 0x0d95, 0x0dad, + 0x0dd1, 0x0de0, 0x0df8, 0x0e2f, 0x0e53, 0x0e77, 0x0e8f, 0x0eaf, + 0x0ebb, 0x0f0c, 0x0f18, 0x0f24, 0x0f42, 0x0f51, 0x0f63, 0x0f78, + 0x0f87, 0x0f96, 0x0fab, 0x0fcc, 0x0fea, 0x1002, 0x1014, 0x1044, + // Entry 80 - BF + 0x1069, 0x1091, 0x10a3, 0x10d7, 0x10f5, 0x1101, 0x1113, 0x1138, + 0x1159, 0x1174, 0x1192, 0x11a4, 0x11c8, 0x11ec, 0x1207, 0x121c, + 0x1231, 0x1243, 0x1264, 0x1285, 0x12aa, 0x12cb, 0x12ff, 0x1326, + 0x1332, 0x1362, 0x1380, 0x13ba, 0x141c, 0x1437, 0x1455, 0x1470, + 0x1482, 0x1494, 0x14ac, 0x14be, 0x14d6, 0x14f7, 0x1512, 0x152d, + 0x155e, 0x1570, 0x1592, 0x15b0, 0x15d1, 0x15f8, 0x160a, 0x1619, + 0x1628, 0x163a, 0x165e, 0x166a, 0x167c, 0x1688, 0x16b6, 0x16e2, + 0x16fa, 0x1715, 0x1730, 0x1772, 0x17b2, 0x17da, 0x1811, 0x1829, + // Entry C0 - FF + 0x1838, 0x1859, 0x1868, 0x189c, 0x18b7, 0x18d2, 0x18ed, 0x1902, + 0x191d, 0x1933, 0x1961, 0x1973, 0x1982, 0x1994, 0x19af, 0x19d1, + 0x19f2, 0x1a31, 0x1a52, 0x1a73, 0x1a8f, 0x1aa4, 0x1abf, 0x1ad4, + 0x1af6, 0x1b2e, 0x1b4a, 0x1b6f, 0x1b84, 0x1bae, 0x1be0, 0x1c28, + 0x1c31, 0x1c62, 0x1c6e, 0x1c8c, 0x1caa, 0x1cbf, 0x1ce1, 0x1d0b, + 0x1d29, 0x1d3b, 0x1d4d, 0x1d85, 0x1d97, 0x1daf, 0x1dd0, 0x1de8, + 0x1dfd, 0x1e6b, 0x1ea5, 0x1ebd, 0x1ede, 0x1f06, 0x1f5e, 0x1f7f, + 0x1fc9, 0x2013, 0x202e, 0x2049, 0x2075, 0x208a, 0x2099, 0x20ae, + // Entry 100 - 13F + 0x20c9, 0x20f1, 0x210c, 0x212d, 0x214c, 0x215e, 0x2173, 0x2198, + 0x21c0, 0x21e1, 0x2209, 0x222b, 0x2250, 0x2275, 0x2297, 0x22bf, + 0x22d7, 0x2314, 0x2338, 0x235a, 0x237f, 0x23b4, 0x23d6, 0x2400, + 0x2427, 0x2455, 0x2473, 0x2485, 0x24a4, 0x24c9, 0x24d8, 0x24f7, + 0x2516, 0x2538, 0x2563, +} // Size: 606 bytes + +var caRegionStr string = "" + // Size: 3171 bytes + "Illa de l’AscensióAndorraEmirats Àrabs UnitsAfganistanAntigua i BarbudaA" + + "nguillaAlbàniaArmèniaAntilles NeerlandesesAngolaAntàrtidaArgentinaSamoa " + + "Nord-americanaÀustriaAustràliaArubaIlles ÅlandAzerbaidjanBòsnia i Herceg" + + "ovinaBarbadosBangla DeshBèlgicaBurkina FasoBulgàriaBahrainBurundiBenínSa" + + "int BarthélemyBermudesBruneiBolíviaCarib NeerlandèsBrasilBahamesBhutanBo" + + "uvetBotswanaBelarúsBelizeCanadàIlles CocosCongo - KinshasaRepública Cent" + + "reafricanaCongo - BrazzavilleSuïssaCosta d’IvoriIlles CookXileCamerunXin" + + "aColòmbiaIlla ClippertonCosta RicaCubaCap VerdCuraçaoIlla ChristmasXipre" + + "República TxecaAlemanyaDiego GarciaDjiboutiDinamarcaDominicaRepública Do" + + "minicanaAlgèriaCeuta i MelillaEquadorEstòniaEgipteSàhara OccidentalEritr" + + "eaEspanyaEtiòpiaUnió EuropeaFinlàndiaFijiIlles MalvinesMicronèsiaIlles F" + + "èroeFrançaGabonRegne UnitGrenadaGeòrgiaGuaiana FrancesaGuernseyGhanaGib" + + "raltarGrenlàndiaGàmbiaGuineaGuadeloupeGuinea EquatorialGrèciaIlles Geòrg" + + "ia del Sud i Sandwich del SudGuatemalaGuamGuinea BissauGuyanaHong Kong (" + + "RAE Xina)Illa Heard i Illes McDonaldHonduresCroàciaHaitíHongriaIlles Can" + + "àriesIndonèsiaIrlandaIsraelIlla de ManÍndiaTerritori Britànic de l’Oceà" + + " ÍndicIraqIranIslàndiaItàliaJerseyJamaicaJordàniaJapóKenyaKirguizistanCa" + + "mbodjaKiribatiComoresSaint Christopher i NevisCorea del NordCorea del Su" + + "dKuwaitIlles CaimanKazakhstanLaosLíbanSaint LuciaLiechtensteinSri LankaL" + + "ibèriaLesothoLituàniaLuxemburgLetòniaLíbiaMarrocMònacoMoldàviaMontenegro" + + "Saint MartinMadagascarIlles MarshallMacedòniaMaliMyanmar (Birmània)Mongò" + + "liaMacau (RAE Xina)Illes Mariannes del NordMartinicaMauritàniaMontserrat" + + "MaltaMauriciMaldivesMalawiMèxicMalàisiaMoçambicNamíbiaNova CaledòniaNíge" + + "rNorfolkNigèriaNicaraguaPaïsos BaixosNoruegaNepalNauruNiueNova ZelandaOm" + + "anPanamàPerúPolinèsia FrancesaPapua Nova GuineaFilipinesPakistanPolòniaS" + + "aint-Pierre-et-MiquelonIlles PitcairnPuerto RicoPalestinaPortugalPalauPa" + + "raguaiQatarTerritoris allunyats d’OceaniaIlla de la ReunióRomaniaSèrbiaR" + + "ússiaRuandaAràbia SauditaIlles SalomóSeychellesSudanSuèciaSingapurSaint" + + " HelenaEslovèniaSvalbard i Jan MayenEslovàquiaSierra LeoneSan MarinoSene" + + "galSomàliaSurinamSudan del SudSão Tomé i PríncipeEl SalvadorSint Maarten" + + "SíriaSwazilàndiaTristão da CunhaIlles Turks i CaicosTxadTerritoris Franc" + + "esos del SudTogoTailàndiaTadjikistanTokelauTimor OrientalTurkmenistanTun" + + "ísiaTongaTurquiaTrinitat i TobagoTuvaluTaiwanTanzàniaUcraïnaUgandaIlles" + + " Perifèriques Menors dels EUAEstats UnitsUruguaiUzbekistanCiutat del Vat" + + "icàSaint Vincent i les GrenadinesVeneçuelaIlles Verges BritàniquesIlles " + + "Verges Nord-americanesVietnamVanuatuWallis i FutunaSamoaKosovoIemenMayot" + + "teRepública de Sud-àfricaZàmbiaZimbàbueRegió desconegudaMónÀfricaAmèrica" + + " del NordAmèrica del SudOceaniaÀfrica occidentalAmèrica CentralÀfrica or" + + "ientalÀfrica septentrionalÀfrica centralÀfrica meridionalAmèricaAmèrica " + + "septentrionalCaribÀsia orientalÀsia meridionalÀsia sud-orientalEuropa me" + + "ridionalAustralàsiaMelanèsiaRegió de la MicronèsiaPolinèsiaÀsiaÀsia cent" + + "ralÀsia occidentalEuropaEuropa orientalEuropa septentrionalEuropa occide" + + "ntalAmèrica Llatina" + +var caRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0015, 0x001c, 0x0030, 0x003a, 0x004b, 0x0053, 0x005b, + 0x0063, 0x0078, 0x007e, 0x0088, 0x0091, 0x00a5, 0x00ad, 0x00b7, + 0x00bc, 0x00c8, 0x00d3, 0x00e8, 0x00f0, 0x00fb, 0x0103, 0x010f, + 0x0118, 0x011f, 0x0126, 0x012c, 0x013d, 0x0145, 0x014b, 0x0153, + 0x0164, 0x016a, 0x0171, 0x0177, 0x017d, 0x0185, 0x018d, 0x0193, + 0x019a, 0x01a5, 0x01b5, 0x01ce, 0x01e1, 0x01e8, 0x01f7, 0x0201, + 0x0205, 0x020c, 0x0210, 0x0219, 0x0228, 0x0232, 0x0236, 0x023e, + 0x0246, 0x0254, 0x0259, 0x0269, 0x0271, 0x027d, 0x0285, 0x028e, + // Entry 40 - 7F + 0x0296, 0x02ab, 0x02b3, 0x02c2, 0x02c9, 0x02d1, 0x02d7, 0x02e9, + 0x02f0, 0x02f7, 0x02ff, 0x030c, 0x0316, 0x031a, 0x0328, 0x0333, + 0x033f, 0x0346, 0x034b, 0x0355, 0x035c, 0x0364, 0x0374, 0x037c, + 0x0381, 0x038a, 0x0395, 0x039c, 0x03a2, 0x03ac, 0x03bd, 0x03c4, + 0x03ed, 0x03f6, 0x03fa, 0x0407, 0x040d, 0x0421, 0x043c, 0x0444, + 0x044c, 0x0452, 0x0459, 0x0468, 0x0472, 0x0479, 0x047f, 0x048a, + 0x0490, 0x04b7, 0x04bb, 0x04bf, 0x04c8, 0x04cf, 0x04d5, 0x04dc, + 0x04e5, 0x04ea, 0x04ef, 0x04fb, 0x0503, 0x050b, 0x0512, 0x052b, + // Entry 80 - BF + 0x0539, 0x0546, 0x054c, 0x0558, 0x0562, 0x0566, 0x056c, 0x0577, + 0x0584, 0x058d, 0x0595, 0x059c, 0x05a5, 0x05ae, 0x05b6, 0x05bc, + 0x05c2, 0x05c9, 0x05d2, 0x05dc, 0x05e8, 0x05f2, 0x0600, 0x060a, + 0x060e, 0x0621, 0x062a, 0x063a, 0x0652, 0x065b, 0x0666, 0x0670, + 0x0675, 0x067c, 0x0684, 0x068a, 0x0690, 0x0699, 0x06a2, 0x06aa, + 0x06b9, 0x06bf, 0x06c6, 0x06ce, 0x06d7, 0x06e5, 0x06ec, 0x06f1, + 0x06f6, 0x06fa, 0x0706, 0x070a, 0x0711, 0x0716, 0x0729, 0x073a, + 0x0743, 0x074b, 0x0753, 0x076b, 0x0779, 0x0784, 0x078d, 0x0795, + // Entry C0 - FF + 0x079a, 0x07a2, 0x07a7, 0x07c7, 0x07d9, 0x07e0, 0x07e7, 0x07ee, + 0x07f4, 0x0803, 0x0810, 0x081a, 0x081f, 0x0826, 0x082e, 0x083a, + 0x0844, 0x0858, 0x0863, 0x086f, 0x0879, 0x0880, 0x0888, 0x088f, + 0x089c, 0x08b2, 0x08bd, 0x08c9, 0x08cf, 0x08db, 0x08ec, 0x0900, + 0x0904, 0x0920, 0x0924, 0x092e, 0x0939, 0x0940, 0x094e, 0x095a, + 0x0962, 0x0967, 0x096e, 0x097f, 0x0985, 0x098b, 0x0994, 0x099c, + 0x09a2, 0x09c5, 0x09d1, 0x09d8, 0x09e2, 0x09f4, 0x0a12, 0x0a1c, + 0x0a35, 0x0a51, 0x0a58, 0x0a5f, 0x0a6e, 0x0a73, 0x0a79, 0x0a7e, + // Entry 100 - 13F + 0x0a85, 0x0a9e, 0x0aa5, 0x0aae, 0x0ac0, 0x0ac4, 0x0acb, 0x0adc, + 0x0aec, 0x0af3, 0x0b05, 0x0b15, 0x0b25, 0x0b3a, 0x0b49, 0x0b5b, + 0x0b63, 0x0b79, 0x0b7e, 0x0b8c, 0x0b9c, 0x0bae, 0x0bbf, 0x0bcb, + 0x0bd5, 0x0bed, 0x0bf7, 0x0bfc, 0x0c09, 0x0c19, 0x0c1f, 0x0c2e, + 0x0c42, 0x0c53, 0x0c63, +} // Size: 606 bytes + +var csRegionStr string = "" + // Size: 3229 bytes + "AscensionAndorraSpojené arabské emirátyAfghánistánAntigua a BarbudaAngui" + + "llaAlbánieArménieNizozemské AntilyAngolaAntarktidaArgentinaAmerická Samo" + + "aRakouskoAustrálieArubaÅlandyÁzerbájdžánBosna a HercegovinaBarbadosBangl" + + "adéšBelgieBurkina FasoBulharskoBahrajnBurundiBeninSvatý BartolomějBermud" + + "yBrunejBolívieKaribské NizozemskoBrazílieBahamyBhútánBouvetův ostrovBots" + + "wanaBěloruskoBelizeKanadaKokosové ostrovyKongo – KinshasaStředoafrická r" + + "epublikaKongo – BrazzavilleŠvýcarskoPobřeží slonovinyCookovy ostrovyChil" + + "eKamerunČínaKolumbieClippertonův ostrovKostarikaKubaKapverdyCuraçaoVánoč" + + "ní ostrovKyprČeská republikaNěmeckoDiego GarcíaDžibutskoDánskoDominikaDo" + + "minikánská republikaAlžírskoCeuta a MelillaEkvádorEstonskoEgyptZápadní S" + + "aharaEritreaŠpanělskoEtiopieEvropská unieFinskoFidžiFalklandské ostrovyM" + + "ikronésieFaerské ostrovyFrancieGabonVelká BritánieGrenadaGruzieFrancouzs" + + "ká GuyanaGuernseyGhanaGibraltarGrónskoGambieGuineaGuadeloupeRovníková Gu" + + "ineaŘeckoJižní Georgie a Jižní Sandwichovy ostrovyGuatemalaGuamGuinea-Bi" + + "ssauGuyanaHongkong – ZAO ČínyHeardův ostrov a McDonaldovy ostrovyHondura" + + "sChorvatskoHaitiMaďarskoKanárské ostrovyIndonésieIrskoIzraelOstrov ManIn" + + "dieBritské indickooceánské územíIrákÍránIslandItálieJerseyJamajkaJordáns" + + "koJaponskoKeňaKyrgyzstánKambodžaKiribatiKomorySvatý Kryštof a NevisSever" + + "ní KoreaJižní KoreaKuvajtKajmanské ostrovyKazachstánLaosLibanonSvatá Luc" + + "ieLichtenštejnskoSrí LankaLibérieLesothoLitvaLucemburskoLotyšskoLibyeMar" + + "okoMonakoMoldavskoČerná HoraSvatý Martin (Francie)MadagaskarMarshallovy " + + "ostrovyMakedonieMaliMyanmar (Barma)MongolskoMacao – ZAO ČínySeverní Mari" + + "anyMartinikMauritánieMontserratMaltaMauriciusMaledivyMalawiMexikoMalajsi" + + "eMosambikNamibieNová KaledonieNigerNorfolkNigérieNikaraguaNizozemskoNors" + + "koNepálNauruNiueNový ZélandOmánPanamaPeruFrancouzská PolynésiePapua-Nová" + + " GuineaFilipínyPákistánPolskoSaint-Pierre a MiquelonPitcairnovy ostrovyP" + + "ortorikoPalestinská územíPortugalskoPalauParaguayKatarVnější OceánieRéun" + + "ionRumunskoSrbskoRuskoRwandaSaúdská ArábieŠalamounovy ostrovySeychelySúd" + + "ánŠvédskoSingapurSvatá HelenaSlovinskoŠpicberky a Jan MayenSlovenskoSie" + + "rra LeoneSan MarinoSenegalSomálskoSurinamJižní SúdánSvatý Tomáš a Princů" + + "v ostrovSalvadorSvatý Martin (Nizozemsko)SýrieSvazijskoTristan da CunhaT" + + "urks a CaicosČadFrancouzská jižní územíTogoThajskoTádžikistánTokelauVých" + + "odní TimorTurkmenistánTuniskoTongaTureckoTrinidad a TobagoTuvaluTchaj-wa" + + "nTanzanieUkrajinaUgandaMenší odlehlé ostrovy USASpojené státyUruguayUzbe" + + "kistánVatikánSvatý Vincenc a GrenadinyVenezuelaBritské Panenské ostrovyA" + + "merické Panenské ostrovyVietnamVanuatuWallis a FutunaSamoaKosovoJemenMay" + + "otteJihoafrická republikaZambieZimbabweNeznámá oblastSvětAfrikaSeverní A" + + "merikaJižní AmerikaOceánieZápadní AfrikaStřední AmerikaVýchodní AfrikaSe" + + "verní AfrikaStřední AfrikaJižní AfrikaAmerikaSeverní Amerika (oblast)Kar" + + "ibikVýchodní AsieJižní AsieJihovýchodní AsieJižní EvropaAustralasieMelan" + + "ésieMikronésie (region)PolynésieAsieStřední AsieZápadní AsieEvropaVýcho" + + "dní EvropaSeverní EvropaZápadní EvropaLatinská Amerika" + +var csRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0009, 0x0010, 0x002a, 0x0037, 0x0048, 0x0050, 0x0058, + 0x0060, 0x0072, 0x0078, 0x0082, 0x008b, 0x009a, 0x00a2, 0x00ac, + 0x00b1, 0x00b8, 0x00c7, 0x00da, 0x00e2, 0x00ed, 0x00f3, 0x00ff, + 0x0108, 0x010f, 0x0116, 0x011b, 0x012d, 0x0134, 0x013a, 0x0142, + 0x0156, 0x015f, 0x0165, 0x016d, 0x017d, 0x0185, 0x018f, 0x0195, + 0x019b, 0x01ac, 0x01be, 0x01d7, 0x01ec, 0x01f7, 0x020b, 0x021a, + 0x021f, 0x0226, 0x022c, 0x0234, 0x0248, 0x0251, 0x0255, 0x025d, + 0x0265, 0x0276, 0x027a, 0x028b, 0x0293, 0x02a0, 0x02aa, 0x02b1, + // Entry 40 - 7F + 0x02b9, 0x02d1, 0x02db, 0x02ea, 0x02f2, 0x02fa, 0x02ff, 0x030f, + 0x0316, 0x0321, 0x0328, 0x0336, 0x033c, 0x0342, 0x0356, 0x0361, + 0x0371, 0x0378, 0x037d, 0x038d, 0x0394, 0x039a, 0x03ad, 0x03b5, + 0x03ba, 0x03c3, 0x03cb, 0x03d1, 0x03d7, 0x03e1, 0x03f3, 0x03f9, + 0x0426, 0x042f, 0x0433, 0x0440, 0x0446, 0x045d, 0x0482, 0x048a, + 0x0494, 0x0499, 0x04a2, 0x04b4, 0x04be, 0x04c3, 0x04c9, 0x04d3, + 0x04d8, 0x04fa, 0x04ff, 0x0505, 0x050b, 0x0512, 0x0518, 0x051f, + 0x0529, 0x0531, 0x0536, 0x0541, 0x054a, 0x0552, 0x0558, 0x056f, + // Entry 80 - BF + 0x057d, 0x058a, 0x0590, 0x05a2, 0x05ad, 0x05b1, 0x05b8, 0x05c4, + 0x05d4, 0x05de, 0x05e6, 0x05ed, 0x05f2, 0x05fd, 0x0606, 0x060b, + 0x0611, 0x0617, 0x0620, 0x062c, 0x0643, 0x064d, 0x0660, 0x0669, + 0x066d, 0x067c, 0x0685, 0x0699, 0x06a9, 0x06b1, 0x06bc, 0x06c6, + 0x06cb, 0x06d4, 0x06dc, 0x06e2, 0x06e8, 0x06f0, 0x06f8, 0x06ff, + 0x070e, 0x0713, 0x071a, 0x0722, 0x072b, 0x0735, 0x073b, 0x0741, + 0x0746, 0x074a, 0x0757, 0x075c, 0x0762, 0x0766, 0x077d, 0x078f, + 0x0798, 0x07a2, 0x07a8, 0x07bf, 0x07d2, 0x07db, 0x07ef, 0x07fa, + // Entry C0 - FF + 0x07ff, 0x0807, 0x080c, 0x081e, 0x0826, 0x082e, 0x0834, 0x0839, + 0x083f, 0x0850, 0x0864, 0x086c, 0x0873, 0x087c, 0x0884, 0x0891, + 0x089a, 0x08b0, 0x08b9, 0x08c5, 0x08cf, 0x08d6, 0x08df, 0x08e6, + 0x08f5, 0x0915, 0x091d, 0x0937, 0x093d, 0x0946, 0x0956, 0x0964, + 0x0968, 0x0984, 0x0988, 0x098f, 0x099d, 0x09a4, 0x09b4, 0x09c1, + 0x09c8, 0x09cd, 0x09d4, 0x09e5, 0x09eb, 0x09f4, 0x09fc, 0x0a04, + 0x0a0a, 0x0a26, 0x0a35, 0x0a3c, 0x0a47, 0x0a4f, 0x0a69, 0x0a72, + 0x0a8c, 0x0aa7, 0x0aae, 0x0ab5, 0x0ac4, 0x0ac9, 0x0acf, 0x0ad4, + // Entry 100 - 13F + 0x0adb, 0x0af1, 0x0af7, 0x0aff, 0x0b0f, 0x0b14, 0x0b1a, 0x0b2a, + 0x0b39, 0x0b41, 0x0b51, 0x0b62, 0x0b73, 0x0b82, 0x0b92, 0x0ba0, + 0x0ba7, 0x0bc0, 0x0bc7, 0x0bd6, 0x0be2, 0x0bf5, 0x0c03, 0x0c0e, + 0x0c18, 0x0c2c, 0x0c36, 0x0c3a, 0x0c48, 0x0c56, 0x0c5c, 0x0c6d, + 0x0c7c, 0x0c8c, 0x0c9d, +} // Size: 606 bytes + +var daRegionStr string = "" + // Size: 2956 bytes + "AscensionøenAndorraDe Forenede Arabiske EmiraterAfghanistanAntigua og Ba" + + "rbudaAnguillaAlbanienArmenienHollandske AntillerAngolaAntarktisArgentina" + + "Amerikansk SamoaØstrigAustralienArubaÅlandAserbajdsjanBosnien-Hercegovin" + + "aBarbadosBangladeshBelgienBurkina FasoBulgarienBahrainBurundiBeninSaint " + + "BarthélemyBermudaBruneiBoliviaDe Nederlandske AntillerBrasilienBahamasBh" + + "utanBouvetøenBotswanaHvideruslandBelizeCanadaCocosøerneCongo-KinshasaDen" + + " Centralafrikanske RepublikCongo-BrazzavilleSchweizElfenbenskystenCookøe" + + "rneChileCamerounKinaColombiaClippertonøenCosta RicaCubaKap VerdeCuraçaoJ" + + "uleøenCypernTjekkietTysklandDiego GarciaDjiboutiDanmarkDominicaDen Domin" + + "ikanske RepublikAlgerietCeuta og MelillaEcuadorEstlandEgyptenVestsaharaE" + + "ritreaSpanienEtiopienDen Europæiske UnionFinlandFijiFalklandsøerneMikron" + + "esiens Forenede StaterFærøerneFrankrigGabonStorbritannienGrenadaGeorgien" + + "Fransk GuyanaGuernseyGhanaGibraltarGrønlandGambiaGuineaGuadeloupeÆkvator" + + "ialguineaGrækenlandSouth Georgia og South Sandwich IslandsGuatemalaGuamG" + + "uinea-BissauGuyanaHongkong SARHeard Island og McDonald IslandsHondurasKr" + + "oatienHaitiUngarnKanariske øerIndonesienIrlandIsraelIsle of ManIndienDet" + + " britiske territorium i Det Indiske OceanIrakIranIslandItalienJerseyJama" + + "icaJordanJapanKenyaKirgisistanCambodjaKiribatiComorerneSaint Kitts og Ne" + + "visNordkoreaSydkoreaKuwaitCaymanøerneKasakhstanLaosLibanonSaint LuciaLie" + + "chtensteinSri LankaLiberiaLesothoLitauenLuxembourgLetlandLibyenMarokkoMo" + + "nacoMoldovaMontenegroSaint MartinMadagaskarMarshalløerneMakedonienMaliMy" + + "anmar (Burma)MongolietMacao SARNordmarianerneMartiniqueMauretanienMontse" + + "rratMaltaMauritiusMaldiverneMalawiMexicoMalaysiaMozambiqueNamibiaNy Kale" + + "donienNigerNorfolk IslandNigeriaNicaraguaNederlandeneNorgeNepalNauruNiue" + + "New ZealandOmanPanamaPeruFransk PolynesienPapua Ny GuineaFilippinernePak" + + "istanPolenSaint Pierre og MiquelonPitcairnPuerto RicoDe palæstinensiske " + + "områderPortugalPalauParaguayQatarYdre OceanienRéunionRumænienSerbienRusl" + + "andRwandaSaudi-ArabienSalomonøerneSeychellerneSudanSverigeSingaporeSt. H" + + "elenaSlovenienSvalbard og Jan MayenSlovakietSierra LeoneSan MarinoSenega" + + "lSomaliaSurinamSydsudanSão Tomé og PríncipeEl SalvadorSint MaartenSyrien" + + "SwazilandTristan da CunhaTurks- og CaicosøerneTchadDe franske besiddelse" + + "r i Det Sydlige Indiske OceanTogoThailandTadsjikistanTokelauTimor-LesteT" + + "urkmenistanTunesienTongaTyrkietTrinidad og TobagoTuvaluTaiwanTanzaniaUkr" + + "aineUgandaAmerikanske oversøiske øerUSAUruguayUsbekistanVatikanstatenSai" + + "nt Vincent og GrenadinerneVenezuelaDe Britiske JomfruøerDe Amerikanske J" + + "omfruøerVietnamVanuatuWallis og FutunaSamoaKosovoYemenMayotteSydafrikaZa" + + "mbiaZimbabweUkendt områdeVerdenAfrikaNordamerikaSydamerikaOceanienVestaf" + + "rikaMellemamerikaØstafrikaNordafrikaCentralafrikaDet sydlige AfrikaAmeri" + + "kaDet nordlige AmerikaCaribienØstasienSydasienSydøstasienSydeuropaAustra" + + "lasienMelanesienMikronesienPolynesienAsienCentralasienVestasienEuropaØst" + + "europaNordeuropaVesteuropaLatinamerika" + +var daRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x000d, 0x0014, 0x0031, 0x003c, 0x004e, 0x0056, 0x005e, + 0x0066, 0x0079, 0x007f, 0x0088, 0x0091, 0x00a1, 0x00a8, 0x00b2, + 0x00b7, 0x00bd, 0x00c9, 0x00dc, 0x00e4, 0x00ee, 0x00f5, 0x0101, + 0x010a, 0x0111, 0x0118, 0x011d, 0x012e, 0x0135, 0x013b, 0x0142, + 0x015a, 0x0163, 0x016a, 0x0170, 0x017a, 0x0182, 0x018e, 0x0194, + 0x019a, 0x01a5, 0x01b3, 0x01d1, 0x01e2, 0x01e9, 0x01f8, 0x0202, + 0x0207, 0x020f, 0x0213, 0x021b, 0x0229, 0x0233, 0x0237, 0x0240, + 0x0248, 0x0250, 0x0256, 0x025e, 0x0266, 0x0272, 0x027a, 0x0281, + // Entry 40 - 7F + 0x0289, 0x02a2, 0x02aa, 0x02ba, 0x02c1, 0x02c8, 0x02cf, 0x02d9, + 0x02e0, 0x02e7, 0x02ef, 0x0304, 0x030b, 0x030f, 0x031e, 0x033a, + 0x0344, 0x034c, 0x0351, 0x035f, 0x0366, 0x036e, 0x037b, 0x0383, + 0x0388, 0x0391, 0x039a, 0x03a0, 0x03a6, 0x03b0, 0x03c1, 0x03cc, + 0x03f3, 0x03fc, 0x0400, 0x040d, 0x0413, 0x041f, 0x043f, 0x0447, + 0x044f, 0x0454, 0x045a, 0x0468, 0x0472, 0x0478, 0x047e, 0x0489, + 0x048f, 0x04bb, 0x04bf, 0x04c3, 0x04c9, 0x04d0, 0x04d6, 0x04dd, + 0x04e3, 0x04e8, 0x04ed, 0x04f8, 0x0500, 0x0508, 0x0511, 0x0525, + // Entry 80 - BF + 0x052e, 0x0536, 0x053c, 0x0548, 0x0552, 0x0556, 0x055d, 0x0568, + 0x0575, 0x057e, 0x0585, 0x058c, 0x0593, 0x059d, 0x05a4, 0x05aa, + 0x05b1, 0x05b7, 0x05be, 0x05c8, 0x05d4, 0x05de, 0x05ec, 0x05f6, + 0x05fa, 0x0609, 0x0612, 0x061b, 0x0629, 0x0633, 0x063e, 0x0648, + 0x064d, 0x0656, 0x0660, 0x0666, 0x066c, 0x0674, 0x067e, 0x0685, + 0x0692, 0x0697, 0x06a5, 0x06ac, 0x06b5, 0x06c1, 0x06c6, 0x06cb, + 0x06d0, 0x06d4, 0x06df, 0x06e3, 0x06e9, 0x06ed, 0x06fe, 0x070d, + 0x0719, 0x0721, 0x0726, 0x073e, 0x0746, 0x0751, 0x076d, 0x0775, + // Entry C0 - FF + 0x077a, 0x0782, 0x0787, 0x0794, 0x079c, 0x07a5, 0x07ac, 0x07b3, + 0x07b9, 0x07c6, 0x07d3, 0x07df, 0x07e4, 0x07eb, 0x07f4, 0x07fe, + 0x0807, 0x081c, 0x0825, 0x0831, 0x083b, 0x0842, 0x0849, 0x0850, + 0x0858, 0x086f, 0x087a, 0x0886, 0x088c, 0x0895, 0x08a5, 0x08bb, + 0x08c0, 0x08f2, 0x08f6, 0x08fe, 0x090a, 0x0911, 0x091c, 0x0928, + 0x0930, 0x0935, 0x093c, 0x094e, 0x0954, 0x095a, 0x0962, 0x0969, + 0x096f, 0x098b, 0x098e, 0x0995, 0x099f, 0x09ac, 0x09c9, 0x09d2, + 0x09e8, 0x0a01, 0x0a08, 0x0a0f, 0x0a1f, 0x0a24, 0x0a2a, 0x0a2f, + // Entry 100 - 13F + 0x0a36, 0x0a3f, 0x0a45, 0x0a4d, 0x0a5b, 0x0a61, 0x0a67, 0x0a72, + 0x0a7c, 0x0a84, 0x0a8e, 0x0a9b, 0x0aa5, 0x0aaf, 0x0abc, 0x0ace, + 0x0ad5, 0x0ae9, 0x0af1, 0x0afa, 0x0b02, 0x0b0e, 0x0b17, 0x0b23, + 0x0b2d, 0x0b38, 0x0b42, 0x0b47, 0x0b53, 0x0b5c, 0x0b62, 0x0b6c, + 0x0b76, 0x0b80, 0x0b8c, +} // Size: 606 bytes + +var deRegionStr string = "" + // Size: 3107 bytes + "AscensionAndorraVereinigte Arabische EmirateAfghanistanAntigua und Barbu" + + "daAnguillaAlbanienArmenienNiederländische AntillenAngolaAntarktisArgenti" + + "nienAmerikanisch-SamoaÖsterreichAustralienArubaÅlandinselnAserbaidschanB" + + "osnien und HerzegowinaBarbadosBangladeschBelgienBurkina FasoBulgarienBah" + + "rainBurundiBeninSt. BarthélemyBermudaBrunei DarussalamBolivienBonaire, S" + + "int Eustatius und SabaBrasilienBahamasBhutanBouvetinselBotsuanaBelarusBe" + + "lizeKanadaKokosinselnKongo-KinshasaZentralafrikanische RepublikKongo-Bra" + + "zzavilleSchweizCôte d’IvoireCookinselnChileKamerunChinaKolumbienClippert" + + "on-InselCosta RicaKubaKap VerdeCuraçaoWeihnachtsinselZypernTschechische " + + "RepublikDeutschlandDiego GarciaDschibutiDänemarkDominicaDominikanische R" + + "epublikAlgerienCeuta und MelillaEcuadorEstlandÄgyptenWestsaharaEritreaSp" + + "anienÄthiopienEuropäische UnionFinnlandFidschiFalklandinselnMikronesienF" + + "äröerFrankreichGabunVereinigtes KönigreichGrenadaGeorgienFranzösisch-Gu" + + "ayanaGuernseyGhanaGibraltarGrönlandGambiaGuineaGuadeloupeÄquatorialguine" + + "aGriechenlandSüdgeorgien und die Südlichen SandwichinselnGuatemalaGuamGu" + + "inea-BissauGuyanaSonderverwaltungszone HongkongHeard und McDonaldinselnH" + + "ondurasKroatienHaitiUngarnKanarische InselnIndonesienIrlandIsraelIsle of" + + " ManIndienBritisches Territorium im Indischen OzeanIrakIranIslandItalien" + + "JerseyJamaikaJordanienJapanKeniaKirgisistanKambodschaKiribatiKomorenSt. " + + "Kitts und NevisNordkoreaSüdkoreaKuwaitKaimaninselnKasachstanLaosLibanonS" + + "t. LuciaLiechtensteinSri LankaLiberiaLesothoLitauenLuxemburgLettlandLiby" + + "enMarokkoMonacoRepublik MoldauMontenegroSt. MartinMadagaskarMarshallinse" + + "lnMazedonienMaliMyanmarMongoleiSonderverwaltungsregion MacauNördliche Ma" + + "rianenMartiniqueMauretanienMontserratMaltaMauritiusMaledivenMalawiMexiko" + + "MalaysiaMosambikNamibiaNeukaledonienNigerNorfolkinselNigeriaNicaraguaNie" + + "derlandeNorwegenNepalNauruNiueNeuseelandOmanPanamaPeruFranzösisch-Polyne" + + "sienPapua-NeuguineaPhilippinenPakistanPolenSt. Pierre und MiquelonPitcai" + + "rninselnPuerto RicoPalästinensische AutonomiegebietePortugalPalauParagua" + + "yKatarÄußeres OzeanienRéunionRumänienSerbienRusslandRuandaSaudi-ArabienS" + + "alomonenSeychellenSudanSchwedenSingapurSt. HelenaSlowenienSvalbard und J" + + "an MayenSlowakeiSierra LeoneSan MarinoSenegalSomaliaSurinameSüdsudanSão " + + "Tomé und PríncipeEl SalvadorSint MaartenSyrienSwasilandTristan da CunhaT" + + "urks- und CaicosinselnTschadFranzösische Süd- und AntarktisgebieteTogoTh" + + "ailandTadschikistanTokelauTimor-LesteTurkmenistanTunesienTongaTürkeiTrin" + + "idad und TobagoTuvaluTaiwanTansaniaUkraineUgandaAmerikanische Überseeins" + + "elnVereinigte StaatenUruguayUsbekistanVatikanstadtSt. Vincent und die Gr" + + "enadinenVenezuelaBritische JungferninselnAmerikanische JungferninselnVie" + + "tnamVanuatuWallis und FutunaSamoaKosovoJemenMayotteSüdafrikaSambiaSimbab" + + "weUnbekannte RegionWeltAfrikaNordamerikaSüdamerikaOzeanienWestafrikaMitt" + + "elamerikaOstafrikaNordafrikaZentralafrikaSüdliches AfrikaAmerikaNördlich" + + "es AmerikaKaribikOstasienSüdasienSüdostasienSüdeuropaAustralasienMelanes" + + "ienMikronesisches InselgebietPolynesienAsienZentralasienWestasienEuropaO" + + "steuropaNordeuropaWesteuropaLateinamerika" + +var deRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0009, 0x0010, 0x002c, 0x0037, 0x004a, 0x0052, 0x005a, + 0x0062, 0x007b, 0x0081, 0x008a, 0x0095, 0x00a7, 0x00b2, 0x00bc, + 0x00c1, 0x00cd, 0x00da, 0x00f1, 0x00f9, 0x0104, 0x010b, 0x0117, + 0x0120, 0x0127, 0x012e, 0x0133, 0x0142, 0x0149, 0x015a, 0x0162, + 0x0182, 0x018b, 0x0192, 0x0198, 0x01a3, 0x01ab, 0x01b2, 0x01b8, + 0x01be, 0x01c9, 0x01d7, 0x01f3, 0x0204, 0x020b, 0x021b, 0x0225, + 0x022a, 0x0231, 0x0236, 0x023f, 0x024f, 0x0259, 0x025d, 0x0266, + 0x026e, 0x027d, 0x0283, 0x0298, 0x02a3, 0x02af, 0x02b8, 0x02c1, + // Entry 40 - 7F + 0x02c9, 0x02e0, 0x02e8, 0x02f9, 0x0300, 0x0307, 0x030f, 0x0319, + 0x0320, 0x0327, 0x0331, 0x0343, 0x034b, 0x0352, 0x0360, 0x036b, + 0x0373, 0x037d, 0x0382, 0x0399, 0x03a0, 0x03a8, 0x03bc, 0x03c4, + 0x03c9, 0x03d2, 0x03db, 0x03e1, 0x03e7, 0x03f1, 0x0402, 0x040e, + 0x043c, 0x0445, 0x0449, 0x0456, 0x045c, 0x047a, 0x0492, 0x049a, + 0x04a2, 0x04a7, 0x04ad, 0x04be, 0x04c8, 0x04ce, 0x04d4, 0x04df, + 0x04e5, 0x050e, 0x0512, 0x0516, 0x051c, 0x0523, 0x0529, 0x0530, + 0x0539, 0x053e, 0x0543, 0x054e, 0x0558, 0x0560, 0x0567, 0x057a, + // Entry 80 - BF + 0x0583, 0x058c, 0x0592, 0x059e, 0x05a8, 0x05ac, 0x05b3, 0x05bc, + 0x05c9, 0x05d2, 0x05d9, 0x05e0, 0x05e7, 0x05f0, 0x05f8, 0x05fe, + 0x0605, 0x060b, 0x061a, 0x0624, 0x062e, 0x0638, 0x0646, 0x0650, + 0x0654, 0x065b, 0x0663, 0x0680, 0x0693, 0x069d, 0x06a8, 0x06b2, + 0x06b7, 0x06c0, 0x06c9, 0x06cf, 0x06d5, 0x06dd, 0x06e5, 0x06ec, + 0x06f9, 0x06fe, 0x070a, 0x0711, 0x071a, 0x0725, 0x072d, 0x0732, + 0x0737, 0x073b, 0x0745, 0x0749, 0x074f, 0x0753, 0x076a, 0x0779, + 0x0784, 0x078c, 0x0791, 0x07a8, 0x07b6, 0x07c1, 0x07e3, 0x07eb, + // Entry C0 - FF + 0x07f0, 0x07f8, 0x07fd, 0x080f, 0x0817, 0x0820, 0x0827, 0x082f, + 0x0835, 0x0842, 0x084b, 0x0855, 0x085a, 0x0862, 0x086a, 0x0874, + 0x087d, 0x0893, 0x089b, 0x08a7, 0x08b1, 0x08b8, 0x08bf, 0x08c7, + 0x08d0, 0x08e8, 0x08f3, 0x08ff, 0x0905, 0x090e, 0x091e, 0x0935, + 0x093b, 0x0963, 0x0967, 0x096f, 0x097c, 0x0983, 0x098e, 0x099a, + 0x09a2, 0x09a7, 0x09ae, 0x09c1, 0x09c7, 0x09cd, 0x09d5, 0x09dc, + 0x09e2, 0x09fe, 0x0a10, 0x0a17, 0x0a21, 0x0a2d, 0x0a4b, 0x0a54, + 0x0a6c, 0x0a88, 0x0a8f, 0x0a96, 0x0aa7, 0x0aac, 0x0ab2, 0x0ab7, + // Entry 100 - 13F + 0x0abe, 0x0ac8, 0x0ace, 0x0ad6, 0x0ae7, 0x0aeb, 0x0af1, 0x0afc, + 0x0b07, 0x0b0f, 0x0b19, 0x0b26, 0x0b2f, 0x0b39, 0x0b46, 0x0b57, + 0x0b5e, 0x0b71, 0x0b78, 0x0b80, 0x0b89, 0x0b95, 0x0b9f, 0x0bab, + 0x0bb5, 0x0bcf, 0x0bd9, 0x0bde, 0x0bea, 0x0bf3, 0x0bf9, 0x0c02, + 0x0c0c, 0x0c16, 0x0c23, +} // Size: 606 bytes + +var elRegionStr string = "" + // Size: 6260 bytes + "Νήσος ΑσενσιόνΑνδόραΗνωμένα Αραβικά ΕμιράταΑφγανιστάνΑντίγκουα και Μπαρμ" + + "πούνταΑνγκουίλαΑλβανίαΑρμενίαΟλλανδικές ΑντίλλεςΑνγκόλαΑνταρκτικήΑργεντ" + + "ινήΑμερικανική ΣαμόαΑυστρίαΑυστραλίαΑρούμπαΝήσοι ΌλαντΑζερμπαϊτζάνΒοσνί" + + "α - ΕρζεγοβίνηΜπαρμπάντοςΜπανγκλαντέςΒέλγιοΜπουρκίνα ΦάσοΒουλγαρίαΜπαχρ" + + "έινΜπουρούντιΜπενίνΆγιος ΒαρθολομαίοςΒερμούδεςΜπρουνέιΒολιβίαΟλλανδία Κ" + + "αραϊβικήςΒραζιλίαΜπαχάμεςΜπουτάνΝήσος ΜπουβέΜποτσουάναΛευκορωσίαΜπελίζΚ" + + "αναδάςΝήσοι Κόκος (Κίλινγκ)Κονγκό - ΚινσάσαΚεντροαφρικανική ΔημοκρατίαΚ" + + "ονγκό - ΜπραζαβίλΕλβετίαΑκτή ΕλεφαντοστούΝήσοι ΚουκΧιλήΚαμερούνΚίναΚολο" + + "μβίαΝήσος ΚλίπερτονΚόστα ΡίκαΚούβαΠράσινο ΑκρωτήριοΚουρασάοΝήσος των Χρ" + + "ιστουγέννωνΚύπροςΤσεχική ΔημοκρατίαΓερμανίαΝτιέγκο ΓκαρσίαΤζιμπουτίΔανί" + + "αΝτομίνικαΔομινικανή ΔημοκρατίαΑλγερίαΘεούτα και ΜελίλαΕκουαδόρΕσθονίαΑ" + + "ίγυπτοςΔυτική ΣαχάραΕρυθραίαΙσπανίαΑιθιοπίαΕυρωπαϊκή ΈνωσηΦινλανδίαΦίτζ" + + "ιΝήσοι ΦόκλαντΜικρονησίαΝήσοι ΦερόεςΓαλλίαΓκαμπόνΗνωμένο ΒασίλειοΓρενάδ" + + "αΓεωργίαΓαλλική ΓουιάναΓκέρνζιΓκάναΓιβραλτάρΓροιλανδίαΓκάμπιαΓουινέαΓου" + + "αδελούπηΙσημερινή ΓουινέαΕλλάδαΝήσοι Νότια Γεωργία και Νότιες Σάντουιτς" + + "ΓουατεμάλαΓκουάμΓουινέα ΜπισάουΓουιάναΧονγκ Κονγκ ΕΔΠ ΚίναςΝήσοι Χερντ " + + "και ΜακντόναλντΟνδούραΚροατίαΑϊτήΟυγγαρίαΚανάριοι ΝήσοιΙνδονησίαΙρλανδί" + + "αΙσραήλΝήσος ΜανΙνδίαΒρετανικά Εδάφη Ινδικού ΩκεανούΙράκΙράνΙσλανδίαΙτα" + + "λίαΤζέρζιΤζαμάικαΙορδανίαΙαπωνίαΚένυαΚιργιστάνΚαμπότζηΚιριμπάτιΚομόρεςΆ" + + "γιος Χριστόφορος και ΝέβιςΒόρεια ΚορέαΝότια ΚορέαΚουβέιτΝήσοι ΚάιμανΚαζ" + + "ακστάνΛάοςΛίβανοςΑγία ΛουκίαΛιχτενστάινΣρι ΛάνκαΛιβερίαΛεσότοΛιθουανίαΛ" + + "ουξεμβούργοΛετονίαΛιβύηΜαρόκοΜονακόΜολδαβίαΜαυροβούνιοΆγιος Μαρτίνος (Γ" + + "αλλικό τμήμα)ΜαδαγασκάρηΝήσοι ΜάρσαλΠρώην Γιουγκοσλαβική Δημοκρατία της" + + " ΜακεδονίαςΜάλιΜιανμάρ/ΒιρμανίαΜογγολίαΜακάο ΕΔΠ ΚίναςΝήσοι Βόρειες Μαρι" + + "άνεςΜαρτινίκαΜαυριτανίαΜονσεράτΜάλταΜαυρίκιοςΜαλδίβεςΜαλάουιΜεξικόΜαλαι" + + "σίαΜοζαμβίκηΝαμίμπιαΝέα ΚαληδονίαΝίγηραςΝήσος ΝόρφολκΝιγηρίαΝικαράγουαΟ" + + "λλανδίαΝορβηγίαΝεπάλΝαουρούΝιούεΝέα ΖηλανδίαΟμάνΠαναμάςΠερούΓαλλική Πολ" + + "υνησίαΠαπούα Νέα ΓουινέαΦιλιππίνεςΠακιστάνΠολωνίαΣεν Πιερ και ΜικελόνΝή" + + "σοι ΠίτκερνΠουέρτο ΡίκοΠαλαιστινιακά ΕδάφηΠορτογαλίαΠαλάουΠαραγουάηΚατά" + + "ρΠεριφερειακή ΩκεανίαΡεϊνιόνΡουμανίαΣερβίαΡωσίαΡουάνταΣαουδική ΑραβίαΝή" + + "σοι ΣολομώντοςΣεϋχέλλεςΣουδάνΣουηδίαΣιγκαπούρηΑγία ΕλένηΣλοβενίαΣβάλμπα" + + "ρντ και Γιαν ΜαγιένΣλοβακίαΣιέρα ΛεόνεΆγιος ΜαρίνοςΣενεγάληΣομαλίαΣουρι" + + "νάμΝότιο ΣουδάνΣάο Τομέ και ΠρίνσιπεΕλ ΣαλβαδόρΆγιος Μαρτίνος (Ολλανδικ" + + "ό τμήμα)ΣυρίαΣουαζιλάνδηΤριστάν ντα ΚούνιαΝήσοι Τερκ και ΚάικοςΤσαντΓαλ" + + "λικές περιοχές του νοτίου ημισφαιρίουΤόγκοΤαϊλάνδηΤατζικιστάνΤοκελάουΤι" + + "μόρ-ΛέστεΤουρκμενιστάνΤυνησίαΤόνγκαΤουρκίαΤρινιντάντ και ΤομπάγκοΤουβαλ" + + "ούΤαϊβάνΤανζανίαΟυκρανίαΟυγκάνταΑπομακρυσμένες Νησίδες ΗΠΑΗνωμένες Πολι" + + "τείεςΟυρουγουάηΟυζμπεκιστάνΒατικανόΆγιος Βικέντιος και ΓρεναδίνεςΒενεζο" + + "υέλαΒρετανικές Παρθένοι ΝήσοιΑμερικανικές Παρθένοι ΝήσοιΒιετνάμΒανουάτο" + + "υΟυάλις και ΦουτούναΣαμόαΚόσοβοΥεμένηΜαγιότΝότια ΑφρικήΖάμπιαΖιμπάμπουε" + + "Άγνωστη περιοχήΚόσμοςΑφρικήΒόρεια ΑμερικήΝότια ΑμερικήΩκεανίαΔυτική Αφρ" + + "ικήΚεντρική ΑμερικήΑνατολική ΑφρικήΒόρεια ΑφρικήΜέση ΑφρικήΝότιος Αφρικ" + + "ήΑμερικήΒόρειος ΑμερικήΚαραϊβικήΑνατολική ΑσίαΝότια ΑσίαΝοτιοανατολική " + + "ΑσίαΝότια ΕυρώπηΑυστραλασίαΜελανησίαΠεριοχή ΜικρονησίαςΠολυνησίαΑσίαΚεν" + + "τρική ΑσίαΔυτική ΑσίαΕυρώπηΑνατολική ΕυρώπηΒόρεια ΕυρώπηΔυτική ΕυρώπηΛα" + + "τινική Αμερική" + +var elRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x001b, 0x0027, 0x0053, 0x0067, 0x0097, 0x00a9, 0x00b7, + 0x00c5, 0x00ea, 0x00f8, 0x010c, 0x011e, 0x013f, 0x014d, 0x015f, + 0x016d, 0x0182, 0x019a, 0x01bd, 0x01d3, 0x01eb, 0x01f7, 0x0212, + 0x0224, 0x0234, 0x0248, 0x0254, 0x0277, 0x0289, 0x0299, 0x02a7, + 0x02cc, 0x02dc, 0x02ec, 0x02fa, 0x0311, 0x0325, 0x0339, 0x0345, + 0x0353, 0x0379, 0x0396, 0x03cb, 0x03ec, 0x03fa, 0x041b, 0x042e, + 0x0436, 0x0446, 0x044e, 0x045e, 0x047b, 0x048e, 0x0498, 0x04b9, + 0x04c9, 0x04f5, 0x0501, 0x0524, 0x0534, 0x0551, 0x0563, 0x056d, + // Entry 40 - 7F + 0x057f, 0x05a8, 0x05b6, 0x05d6, 0x05e6, 0x05f4, 0x0604, 0x061d, + 0x062d, 0x063b, 0x064b, 0x0668, 0x067a, 0x0684, 0x069d, 0x06b1, + 0x06c8, 0x06d4, 0x06e2, 0x0701, 0x070f, 0x071d, 0x073a, 0x0748, + 0x0752, 0x0764, 0x0778, 0x0786, 0x0794, 0x07aa, 0x07cb, 0x07d7, + 0x0822, 0x0836, 0x0842, 0x085f, 0x086d, 0x0894, 0x08c7, 0x08d5, + 0x08e3, 0x08eb, 0x08fb, 0x0916, 0x0928, 0x0938, 0x0944, 0x0955, + 0x095f, 0x099a, 0x09a2, 0x09aa, 0x09ba, 0x09c6, 0x09d2, 0x09e2, + 0x09f2, 0x0a00, 0x0a0a, 0x0a1c, 0x0a2c, 0x0a3e, 0x0a4c, 0x0a7f, + // Entry 80 - BF + 0x0a96, 0x0aab, 0x0ab9, 0x0ad0, 0x0ae2, 0x0aea, 0x0af8, 0x0b0d, + 0x0b23, 0x0b34, 0x0b42, 0x0b4e, 0x0b60, 0x0b78, 0x0b86, 0x0b90, + 0x0b9c, 0x0ba8, 0x0bb8, 0x0bce, 0x0c05, 0x0c1b, 0x0c32, 0x0c8a, + 0x0c92, 0x0cb1, 0x0cc1, 0x0cdd, 0x0d07, 0x0d19, 0x0d2d, 0x0d3d, + 0x0d47, 0x0d59, 0x0d69, 0x0d77, 0x0d83, 0x0d93, 0x0da5, 0x0db5, + 0x0dce, 0x0ddc, 0x0df5, 0x0e03, 0x0e17, 0x0e27, 0x0e37, 0x0e41, + 0x0e4f, 0x0e59, 0x0e70, 0x0e78, 0x0e86, 0x0e90, 0x0eb1, 0x0ed3, + 0x0ee7, 0x0ef7, 0x0f05, 0x0f2a, 0x0f43, 0x0f5a, 0x0f7f, 0x0f93, + // Entry C0 - FF + 0x0f9f, 0x0fb1, 0x0fbb, 0x0fe2, 0x0ff0, 0x1000, 0x100c, 0x1016, + 0x1024, 0x1041, 0x1060, 0x1072, 0x107e, 0x108c, 0x10a0, 0x10b3, + 0x10c3, 0x10f4, 0x1104, 0x1119, 0x1132, 0x1142, 0x1150, 0x1160, + 0x1177, 0x119e, 0x11b3, 0x11ee, 0x11f8, 0x120e, 0x1230, 0x1257, + 0x1261, 0x12ad, 0x12b7, 0x12c7, 0x12dd, 0x12ed, 0x1302, 0x131c, + 0x132a, 0x1336, 0x1344, 0x1370, 0x1380, 0x138c, 0x139c, 0x13ac, + 0x13bc, 0x13ee, 0x1411, 0x1425, 0x143d, 0x144d, 0x1486, 0x149a, + 0x14ca, 0x14fe, 0x150c, 0x151e, 0x1542, 0x154c, 0x1558, 0x1564, + // Entry 100 - 13F + 0x1570, 0x1587, 0x1593, 0x15a7, 0x15c4, 0x15d0, 0x15dc, 0x15f7, + 0x1610, 0x161e, 0x1637, 0x1656, 0x1675, 0x168e, 0x16a3, 0x16bc, + 0x16ca, 0x16e7, 0x16f9, 0x1714, 0x1727, 0x174c, 0x1763, 0x1779, + 0x178b, 0x17b0, 0x17c2, 0x17ca, 0x17e3, 0x17f8, 0x1804, 0x1823, + 0x183c, 0x1855, 0x1874, +} // Size: 606 bytes + +var enRegionStr string = "" + // Size: 2940 bytes + "Ascension IslandAndorraUnited Arab EmiratesAfghanistanAntigua & BarbudaA" + + "nguillaAlbaniaArmeniaNetherlands AntillesAngolaAntarcticaArgentinaAmeric" + + "an SamoaAustriaAustraliaArubaÅland IslandsAzerbaijanBosnia & Herzegovina" + + "BarbadosBangladeshBelgiumBurkina FasoBulgariaBahrainBurundiBeninSt. Bart" + + "hélemyBermudaBruneiBoliviaCaribbean NetherlandsBrazilBahamasBhutanBouvet" + + " IslandBotswanaBelarusBelizeCanadaCocos (Keeling) IslandsCongo - Kinshas" + + "aCentral African RepublicCongo - BrazzavilleSwitzerlandCôte d’IvoireCook" + + " IslandsChileCameroonChinaColombiaClipperton IslandCosta RicaCubaCape Ve" + + "rdeCuraçaoChristmas IslandCyprusCzech RepublicGermanyDiego GarciaDjibout" + + "iDenmarkDominicaDominican RepublicAlgeriaCeuta & MelillaEcuadorEstoniaEg" + + "yptWestern SaharaEritreaSpainEthiopiaEuropean UnionFinlandFijiFalkland I" + + "slandsMicronesiaFaroe IslandsFranceGabonUnited KingdomGrenadaGeorgiaFren" + + "ch GuianaGuernseyGhanaGibraltarGreenlandGambiaGuineaGuadeloupeEquatorial" + + " GuineaGreeceSouth Georgia & South Sandwich IslandsGuatemalaGuamGuinea-B" + + "issauGuyanaHong Kong SAR ChinaHeard & McDonald IslandsHondurasCroatiaHai" + + "tiHungaryCanary IslandsIndonesiaIrelandIsraelIsle of ManIndiaBritish Ind" + + "ian Ocean TerritoryIraqIranIcelandItalyJerseyJamaicaJordanJapanKenyaKyrg" + + "yzstanCambodiaKiribatiComorosSt. Kitts & NevisNorth KoreaSouth KoreaKuwa" + + "itCayman IslandsKazakhstanLaosLebanonSt. LuciaLiechtensteinSri LankaLibe" + + "riaLesothoLithuaniaLuxembourgLatviaLibyaMoroccoMonacoMoldovaMontenegroSt" + + ". MartinMadagascarMarshall IslandsMacedoniaMaliMyanmar (Burma)MongoliaMa" + + "cau SAR ChinaNorthern Mariana IslandsMartiniqueMauritaniaMontserratMalta" + + "MauritiusMaldivesMalawiMexicoMalaysiaMozambiqueNamibiaNew CaledoniaNiger" + + "Norfolk IslandNigeriaNicaraguaNetherlandsNorwayNepalNauruNiueNew Zealand" + + "OmanPanamaPeruFrench PolynesiaPapua New GuineaPhilippinesPakistanPolandS" + + "t. Pierre & MiquelonPitcairn IslandsPuerto RicoPalestinian TerritoriesPo" + + "rtugalPalauParaguayQatarOutlying OceaniaRéunionRomaniaSerbiaRussiaRwanda" + + "Saudi ArabiaSolomon IslandsSeychellesSudanSwedenSingaporeSt. HelenaSlove" + + "niaSvalbard & Jan MayenSlovakiaSierra LeoneSan MarinoSenegalSomaliaSurin" + + "ameSouth SudanSão Tomé & PríncipeEl SalvadorSint MaartenSyriaSwazilandTr" + + "istan da CunhaTurks & Caicos IslandsChadFrench Southern TerritoriesTogoT" + + "hailandTajikistanTokelauTimor-LesteTurkmenistanTunisiaTongaTurkeyTrinida" + + "d & TobagoTuvaluTaiwanTanzaniaUkraineUgandaU.S. Outlying IslandsUnited S" + + "tatesUruguayUzbekistanVatican CitySt. Vincent & GrenadinesVenezuelaBriti" + + "sh Virgin IslandsU.S. Virgin IslandsVietnamVanuatuWallis & FutunaSamoaKo" + + "sovoYemenMayotteSouth AfricaZambiaZimbabweUnknown RegionWorldAfricaNorth" + + " AmericaSouth AmericaOceaniaWestern AfricaCentral AmericaEastern AfricaN" + + "orthern AfricaMiddle AfricaSouthern AfricaAmericasNorthern AmericaCaribb" + + "eanEastern AsiaSouthern AsiaSoutheast AsiaSouthern EuropeAustralasiaMela" + + "nesiaMicronesian RegionPolynesiaAsiaCentral AsiaWestern AsiaEuropeEaster" + + "n EuropeNorthern EuropeWestern EuropeLatin America" + +var enRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0010, 0x0017, 0x002b, 0x0036, 0x0047, 0x004f, 0x0056, + 0x005d, 0x0071, 0x0077, 0x0081, 0x008a, 0x0098, 0x009f, 0x00a8, + 0x00ad, 0x00bb, 0x00c5, 0x00d9, 0x00e1, 0x00eb, 0x00f2, 0x00fe, + 0x0106, 0x010d, 0x0114, 0x0119, 0x0128, 0x012f, 0x0135, 0x013c, + 0x0151, 0x0157, 0x015e, 0x0164, 0x0171, 0x0179, 0x0180, 0x0186, + 0x018c, 0x01a3, 0x01b3, 0x01cb, 0x01de, 0x01e9, 0x01f9, 0x0205, + 0x020a, 0x0212, 0x0217, 0x021f, 0x0230, 0x023a, 0x023e, 0x0248, + 0x0250, 0x0260, 0x0266, 0x0274, 0x027b, 0x0287, 0x028f, 0x0296, + // Entry 40 - 7F + 0x029e, 0x02b0, 0x02b7, 0x02c6, 0x02cd, 0x02d4, 0x02d9, 0x02e7, + 0x02ee, 0x02f3, 0x02fb, 0x0309, 0x0310, 0x0314, 0x0324, 0x032e, + 0x033b, 0x0341, 0x0346, 0x0354, 0x035b, 0x0362, 0x036f, 0x0377, + 0x037c, 0x0385, 0x038e, 0x0394, 0x039a, 0x03a4, 0x03b5, 0x03bb, + 0x03e1, 0x03ea, 0x03ee, 0x03fb, 0x0401, 0x0414, 0x042c, 0x0434, + 0x043b, 0x0440, 0x0447, 0x0455, 0x045e, 0x0465, 0x046b, 0x0476, + 0x047b, 0x0499, 0x049d, 0x04a1, 0x04a8, 0x04ad, 0x04b3, 0x04ba, + 0x04c0, 0x04c5, 0x04ca, 0x04d4, 0x04dc, 0x04e4, 0x04eb, 0x04fc, + // Entry 80 - BF + 0x0507, 0x0512, 0x0518, 0x0526, 0x0530, 0x0534, 0x053b, 0x0544, + 0x0551, 0x055a, 0x0561, 0x0568, 0x0571, 0x057b, 0x0581, 0x0586, + 0x058d, 0x0593, 0x059a, 0x05a4, 0x05ae, 0x05b8, 0x05c8, 0x05d1, + 0x05d5, 0x05e4, 0x05ec, 0x05fb, 0x0613, 0x061d, 0x0627, 0x0631, + 0x0636, 0x063f, 0x0647, 0x064d, 0x0653, 0x065b, 0x0665, 0x066c, + 0x0679, 0x067e, 0x068c, 0x0693, 0x069c, 0x06a7, 0x06ad, 0x06b2, + 0x06b7, 0x06bb, 0x06c6, 0x06ca, 0x06d0, 0x06d4, 0x06e4, 0x06f4, + 0x06ff, 0x0707, 0x070d, 0x0722, 0x0732, 0x073d, 0x0754, 0x075c, + // Entry C0 - FF + 0x0761, 0x0769, 0x076e, 0x077e, 0x0786, 0x078d, 0x0793, 0x0799, + 0x079f, 0x07ab, 0x07ba, 0x07c4, 0x07c9, 0x07cf, 0x07d8, 0x07e2, + 0x07ea, 0x07fe, 0x0806, 0x0812, 0x081c, 0x0823, 0x082a, 0x0832, + 0x083d, 0x0853, 0x085e, 0x086a, 0x086f, 0x0878, 0x0888, 0x089e, + 0x08a2, 0x08bd, 0x08c1, 0x08c9, 0x08d3, 0x08da, 0x08e5, 0x08f1, + 0x08f8, 0x08fd, 0x0903, 0x0914, 0x091a, 0x0920, 0x0928, 0x092f, + 0x0935, 0x094a, 0x0957, 0x095e, 0x0968, 0x0974, 0x098c, 0x0995, + 0x09ab, 0x09be, 0x09c5, 0x09cc, 0x09db, 0x09e0, 0x09e6, 0x09eb, + // Entry 100 - 13F + 0x09f2, 0x09fe, 0x0a04, 0x0a0c, 0x0a1a, 0x0a1f, 0x0a25, 0x0a32, + 0x0a3f, 0x0a46, 0x0a54, 0x0a63, 0x0a71, 0x0a80, 0x0a8d, 0x0a9c, + 0x0aa4, 0x0ab4, 0x0abd, 0x0ac9, 0x0ad6, 0x0ae4, 0x0af3, 0x0afe, + 0x0b07, 0x0b19, 0x0b22, 0x0b26, 0x0b32, 0x0b3e, 0x0b44, 0x0b52, + 0x0b61, 0x0b6f, 0x0b7c, +} // Size: 606 bytes + +const enGBRegionStr string = "" + +var enGBRegionIdx = []uint16{ // 0 elements + +} // Size: 24 bytes + +var esRegionStr string = "" + // Size: 3128 bytes + "Isla de la AscensiónAndorraEmiratos Árabes UnidosAfganistánAntigua y Bar" + + "budaAnguilaAlbaniaArmeniaAntillas NeerlandesasAngolaAntártidaArgentinaSa" + + "moa AmericanaAustriaAustraliaArubaIslas ÅlandAzerbaiyánBosnia-Herzegovin" + + "aBarbadosBangladésBélgicaBurkina FasoBulgariaBaréinBurundiBenínSan Barto" + + "loméBermudasBrunéiBoliviaCaribe neerlandésBrasilBahamasButánIsla BouvetB" + + "otsuanaBielorrusiaBeliceCanadáIslas CocosRepública Democrática del Congo" + + "República CentroafricanaRepública del CongoSuizaCosta de MarfilIslas Coo" + + "kChileCamerúnChinaColombiaIsla ClippertonCosta RicaCubaCabo VerdeCurazao" + + "Isla de NavidadChipreRepública ChecaAlemaniaDiego GarcíaYibutiDinamarcaD" + + "ominicaRepública DominicanaArgeliaCeuta y MelillaEcuadorEstoniaEgiptoSáh" + + "ara OccidentalEritreaEspañaEtiopíaUnión EuropeaFinlandiaFiyiIslas Malvin" + + "asMicronesiaIslas FeroeFranciaGabónReino UnidoGranadaGeorgiaGuayana Fran" + + "cesaGuerneseyGhanaGibraltarGroenlandiaGambiaGuineaGuadalupeGuinea Ecuato" + + "rialGreciaIslas Georgia del Sur y Sandwich del SurGuatemalaGuamGuinea-Bi" + + "sáuGuyanaRAE de Hong Kong (China)Islas Heard y McDonaldHondurasCroaciaHa" + + "itíHungríaCanariasIndonesiaIrlandaIsraelIsla de ManIndiaTerritorio Britá" + + "nico del Océano ÍndicoIrakIránIslandiaItaliaJerseyJamaicaJordaniaJapónKe" + + "niaKirguistánCamboyaKiribatiComorasSan Cristóbal y NievesCorea del Norte" + + "Corea del SurKuwaitIslas CaimánKazajistánLaosLíbanoSanta LucíaLiechtenst" + + "einSri LankaLiberiaLesotoLituaniaLuxemburgoLetoniaLibiaMarruecosMónacoMo" + + "ldaviaMontenegroSan MartínMadagascarIslas MarshallMacedoniaMaliMyanmar (" + + "Birmania)MongoliaRAE de Macao (China)Islas Marianas del NorteMartinicaMa" + + "uritaniaMontserratMaltaMauricioMaldivasMalauiMéxicoMalasiaMozambiqueNami" + + "biaNueva CaledoniaNígerIsla NorfolkNigeriaNicaraguaPaíses BajosNoruegaNe" + + "palNauruNiueNueva ZelandaOmánPanamáPerúPolinesia FrancesaPapúa Nueva Gui" + + "neaFilipinasPakistánPoloniaSan Pedro y MiquelónIslas PitcairnPuerto Rico" + + "Territorios PalestinosPortugalPalaosParaguayCatarTerritorios alejados de" + + " OceaníaReuniónRumaníaSerbiaRusiaRuandaArabia SaudíIslas SalomónSeychell" + + "esSudánSueciaSingapurSanta ElenaEsloveniaSvalbard y Jan MayenEslovaquiaS" + + "ierra LeonaSan MarinoSenegalSomaliaSurinamSudán del SurSanto Tomé y Prín" + + "cipeEl SalvadorSint MaartenSiriaSuazilandiaTristán da CunhaIslas Turcas " + + "y CaicosChadTerritorios Australes FrancesesTogoTailandiaTayikistánTokela" + + "uTimor OrientalTurkmenistánTúnezTongaTurquíaTrinidad y TobagoTuvaluTaiwá" + + "nTanzaniaUcraniaUgandaIslas menores alejadas de EE. UU.Estados UnidosUru" + + "guayUzbekistánCiudad del VaticanoSan Vicente y las GranadinasVenezuelaIs" + + "las Vírgenes BritánicasIslas Vírgenes de EE. UU.VietnamVanuatuWallis y F" + + "utunaSamoaKosovoYemenMayotteSudáfricaZambiaZimbabueRegión desconocidaMun" + + "doÁfricaAmérica del NorteSudaméricaOceaníaÁfrica occidentalCentroamérica" + + "África orientalÁfrica septentrionalÁfrica centralÁfrica meridionalAméri" + + "caNorteaméricaCaribeAsia orientalAsia meridionalSudeste asiáticoEuropa m" + + "eridionalAustralasiaMelanesiaRegión de MicronesiaPolinesiaAsiaAsia centr" + + "alAsia occidentalEuropaEuropa orientalEuropa septentrionalEuropa occiden" + + "talLatinoamérica" + +var esRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0015, 0x001c, 0x0033, 0x003e, 0x004f, 0x0056, 0x005d, + 0x0064, 0x0079, 0x007f, 0x0089, 0x0092, 0x00a1, 0x00a8, 0x00b1, + 0x00b6, 0x00c2, 0x00cd, 0x00df, 0x00e7, 0x00f1, 0x00f9, 0x0105, + 0x010d, 0x0114, 0x011b, 0x0121, 0x012f, 0x0137, 0x013e, 0x0145, + 0x0157, 0x015d, 0x0164, 0x016a, 0x0175, 0x017d, 0x0188, 0x018e, + 0x0195, 0x01a0, 0x01c1, 0x01da, 0x01ee, 0x01f3, 0x0202, 0x020c, + 0x0211, 0x0219, 0x021e, 0x0226, 0x0235, 0x023f, 0x0243, 0x024d, + 0x0254, 0x0263, 0x0269, 0x0279, 0x0281, 0x028e, 0x0294, 0x029d, + // Entry 40 - 7F + 0x02a5, 0x02ba, 0x02c1, 0x02d0, 0x02d7, 0x02de, 0x02e4, 0x02f6, + 0x02fd, 0x0304, 0x030c, 0x031a, 0x0323, 0x0327, 0x0335, 0x033f, + 0x034a, 0x0351, 0x0357, 0x0362, 0x0369, 0x0370, 0x0380, 0x0389, + 0x038e, 0x0397, 0x03a2, 0x03a8, 0x03ae, 0x03b7, 0x03c8, 0x03ce, + 0x03f6, 0x03ff, 0x0403, 0x0410, 0x0416, 0x042e, 0x0444, 0x044c, + 0x0453, 0x0459, 0x0461, 0x0469, 0x0472, 0x0479, 0x047f, 0x048a, + 0x048f, 0x04b8, 0x04bc, 0x04c1, 0x04c9, 0x04cf, 0x04d5, 0x04dc, + 0x04e4, 0x04ea, 0x04ef, 0x04fa, 0x0501, 0x0509, 0x0510, 0x0527, + // Entry 80 - BF + 0x0536, 0x0543, 0x0549, 0x0556, 0x0561, 0x0565, 0x056c, 0x0578, + 0x0585, 0x058e, 0x0595, 0x059b, 0x05a3, 0x05ad, 0x05b4, 0x05b9, + 0x05c2, 0x05c9, 0x05d1, 0x05db, 0x05e6, 0x05f0, 0x05fe, 0x0607, + 0x060b, 0x061d, 0x0625, 0x0639, 0x0651, 0x065a, 0x0664, 0x066e, + 0x0673, 0x067b, 0x0683, 0x0689, 0x0690, 0x0697, 0x06a1, 0x06a8, + 0x06b7, 0x06bd, 0x06c9, 0x06d0, 0x06d9, 0x06e6, 0x06ed, 0x06f2, + 0x06f7, 0x06fb, 0x0708, 0x070d, 0x0714, 0x0719, 0x072b, 0x073e, + 0x0747, 0x0750, 0x0757, 0x076c, 0x077a, 0x0785, 0x079b, 0x07a3, + // Entry C0 - FF + 0x07a9, 0x07b1, 0x07b6, 0x07d6, 0x07de, 0x07e6, 0x07ec, 0x07f1, + 0x07f7, 0x0804, 0x0812, 0x081c, 0x0822, 0x0828, 0x0830, 0x083b, + 0x0844, 0x0858, 0x0862, 0x086e, 0x0878, 0x087f, 0x0886, 0x088d, + 0x089b, 0x08b2, 0x08bd, 0x08c9, 0x08ce, 0x08d9, 0x08ea, 0x08ff, + 0x0903, 0x0922, 0x0926, 0x092f, 0x093a, 0x0941, 0x094f, 0x095c, + 0x0962, 0x0967, 0x096f, 0x0980, 0x0986, 0x098d, 0x0995, 0x099c, + 0x09a2, 0x09c3, 0x09d1, 0x09d8, 0x09e3, 0x09f6, 0x0a12, 0x0a1b, + 0x0a36, 0x0a50, 0x0a57, 0x0a5e, 0x0a6d, 0x0a72, 0x0a78, 0x0a7d, + // Entry 100 - 13F + 0x0a84, 0x0a8e, 0x0a94, 0x0a9c, 0x0aaf, 0x0ab4, 0x0abb, 0x0acd, + 0x0ad8, 0x0ae0, 0x0af2, 0x0b00, 0x0b10, 0x0b25, 0x0b34, 0x0b46, + 0x0b4e, 0x0b5b, 0x0b61, 0x0b6e, 0x0b7d, 0x0b8e, 0x0b9f, 0x0baa, + 0x0bb3, 0x0bc8, 0x0bd1, 0x0bd5, 0x0be1, 0x0bf0, 0x0bf6, 0x0c05, + 0x0c19, 0x0c2a, 0x0c38, +} // Size: 606 bytes + +const es419RegionStr string = "" + +var es419RegionIdx = []uint16{ // 0 elements + +} // Size: 24 bytes + +var etRegionStr string = "" + // Size: 2993 bytes + "Ascensioni saarAndorraAraabia ÜhendemiraadidAfganistanAntigua ja Barbuda" + + "AnguillaAlbaaniaArmeeniaHollandi AntillidAngolaAntarktisArgentinaAmeerik" + + "a SamoaAustriaAustraaliaArubaAhvenamaaAserbaidžaanBosnia ja Hertsegoviin" + + "aBarbadosBangladeshBelgiaBurkina FasoBulgaariaBahreinBurundiBeninSaint B" + + "arthélemyBermudaBruneiBoliiviaHollandi Kariibi mere saaredBrasiiliaBaham" + + "aBhutanBouvet’ saarBotswanaValgeveneBelizeKanadaKookossaaredKongo DVKesk" + + "-Aafrika VabariikKongo VabariikŠveitsCôte d’IvoireCooki saaredTšiiliKame" + + "runHiinaColombiaClippertoni saarCosta RicaKuubaRoheneemesaaredCuraçaoJõu" + + "lusaarKüprosTšehhiSaksamaaDiego GarciaDjiboutiTaaniDominicaDominikaani V" + + "abariikAlžeeriaCeuta ja MelillaEcuadorEestiEgiptusLääne-SaharaEritreaHis" + + "paaniaEtioopiaEuroopa LiitSoomeFidžiFalklandi saaredMikroneesiaFääri saa" + + "redPrantsusmaaGabonSuurbritanniaGrenadaGruusiaPrantsuse GuajaanaGuernsey" + + "GhanaGibraltarGröönimaaGambiaGuineaGuadeloupeEkvatoriaal-GuineaKreekaLõu" + + "na-Georgia ja Lõuna-Sandwichi saaredGuatemalaGuamGuinea-BissauGuyanaHong" + + "kongi erihalduspiirkondHeardi ja McDonaldi saaredHondurasHorvaatiaHaitiU" + + "ngariKanaari saaredIndoneesiaIirimaaIisraelMani saarIndiaBriti India ook" + + "eani alaIraakIraanIslandItaaliaJerseyJamaicaJordaaniaJaapanKeeniaKõrgõzs" + + "tanKambodžaKiribatiKomooridSaint Kitts ja NevisPõhja-KoreaLõuna-KoreaKuv" + + "eitKaimanisaaredKasahstanLaosLiibanonSaint LuciaLiechtensteinSri LankaLi" + + "beeriaLesothoLeeduLuksemburgLätiLiibüaMarokoMonacoMoldovaMontenegroSaint" + + "-MartinMadagaskarMarshalli SaaredMakedooniaMaliMyanmar (Birma)MongooliaM" + + "acau erihalduspiirkondPõhja-MariaanidMartiniqueMauritaaniaMontserratMalt" + + "aMauritiusMaldiividMalawiMehhikoMalaisiaMosambiikNamiibiaUus-KaledooniaN" + + "igerNorfolkNigeeriaNicaraguaHollandNorraNepalNauruNiueUus-MeremaaOmaanPa" + + "namaPeruuPrantsuse PolüneesiaPaapua Uus-GuineaFilipiinidPakistanPoolaSai" + + "nt Pierre ja MiquelonPitcairni saaredPuerto RicoPalestiina aladPortugalB" + + "elauParaguayKatarOkeaania hajasaaredRéunionRumeeniaSerbiaVenemaaRwandaSa" + + "udi AraabiaSaalomoni SaaredSeišellidSudaanRootsiSingapurSaint HelenaSlov" + + "eeniaSvalbard ja Jan MayenSlovakkiaSierra LeoneSan MarinoSenegalSomaalia" + + "SurinameLõuna-SudaanSão Tomé ja PríncipeEl SalvadorSint MaartenSüüriaSva" + + "asimaaTristan da CunhaTurks ja CaicosTšaadPrantsuse LõunaaladTogoTaiTadž" + + "ikistanTokelauIda-TimorTürkmenistanTuneesiaTongaTürgiTrinidad ja TobagoT" + + "uvaluTaiwanTansaaniaUkrainaUgandaÜhendriikide hajasaaredAmeerika Ühendri" + + "igidUruguayUsbekistanVatikanSaint Vincent ja GrenadiinidVenezuelaBriti N" + + "eitsisaaredUSA NeitsisaaredVietnamVanuatuWallis ja FutunaSamoaKosovoJeem" + + "enMayotteLõuna-Aafrika VabariikSambiaZimbabweTundmatu piirkondmaailmAafr" + + "ikaPõhja-AmeerikaLõuna-AmeerikaOkeaaniaLääne-AafrikaKesk-AmeerikaIda-Aaf" + + "rikaPõhja-AafrikaKesk-AafrikaLõuna-AafrikaAmeerikaAmeerika põhjaosaKarii" + + "bi piirkondIda-AasiaLõuna-AasiaKagu-AasiaLõuna-EuroopaAustralaasiaMelane" + + "esiaMikroneesia (piirkond)PolüneesiaAasiaKesk-AasiaLääne-AasiaEuroopaIda" + + "-EuroopaPõhja-EuroopaLääne-EuroopaLadina-Ameerika" + +var etRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x000f, 0x0016, 0x002d, 0x0037, 0x0049, 0x0051, 0x0059, + 0x0061, 0x0072, 0x0078, 0x0081, 0x008a, 0x0098, 0x009f, 0x00a9, + 0x00ae, 0x00b7, 0x00c4, 0x00db, 0x00e3, 0x00ed, 0x00f3, 0x00ff, + 0x0108, 0x010f, 0x0116, 0x011b, 0x012c, 0x0133, 0x0139, 0x0141, + 0x015d, 0x0166, 0x016c, 0x0172, 0x0180, 0x0188, 0x0191, 0x0197, + 0x019d, 0x01a9, 0x01b1, 0x01c6, 0x01d4, 0x01db, 0x01eb, 0x01f7, + 0x01fe, 0x0205, 0x020a, 0x0212, 0x0222, 0x022c, 0x0231, 0x0240, + 0x0248, 0x0252, 0x0259, 0x0260, 0x0268, 0x0274, 0x027c, 0x0281, + // Entry 40 - 7F + 0x0289, 0x029d, 0x02a6, 0x02b6, 0x02bd, 0x02c2, 0x02c9, 0x02d7, + 0x02de, 0x02e7, 0x02ef, 0x02fb, 0x0300, 0x0306, 0x0316, 0x0321, + 0x032f, 0x033a, 0x033f, 0x034c, 0x0353, 0x035a, 0x036c, 0x0374, + 0x0379, 0x0382, 0x038d, 0x0393, 0x0399, 0x03a3, 0x03b5, 0x03bb, + 0x03e4, 0x03ed, 0x03f1, 0x03fe, 0x0404, 0x041f, 0x0439, 0x0441, + 0x044a, 0x044f, 0x0455, 0x0463, 0x046d, 0x0474, 0x047b, 0x0484, + 0x0489, 0x04a0, 0x04a5, 0x04aa, 0x04b0, 0x04b7, 0x04bd, 0x04c4, + 0x04cd, 0x04d3, 0x04d9, 0x04e5, 0x04ee, 0x04f6, 0x04fe, 0x0512, + // Entry 80 - BF + 0x051e, 0x052a, 0x0530, 0x053d, 0x0546, 0x054a, 0x0552, 0x055d, + 0x056a, 0x0573, 0x057b, 0x0582, 0x0587, 0x0591, 0x0596, 0x059d, + 0x05a3, 0x05a9, 0x05b0, 0x05ba, 0x05c6, 0x05d0, 0x05e0, 0x05ea, + 0x05ee, 0x05fd, 0x0606, 0x061d, 0x062d, 0x0637, 0x0642, 0x064c, + 0x0651, 0x065a, 0x0663, 0x0669, 0x0670, 0x0678, 0x0681, 0x0689, + 0x0697, 0x069c, 0x06a3, 0x06ab, 0x06b4, 0x06bb, 0x06c0, 0x06c5, + 0x06ca, 0x06ce, 0x06d9, 0x06de, 0x06e4, 0x06e9, 0x06fe, 0x070f, + 0x0719, 0x0721, 0x0726, 0x073e, 0x074e, 0x0759, 0x0768, 0x0770, + // Entry C0 - FF + 0x0775, 0x077d, 0x0782, 0x0795, 0x079d, 0x07a5, 0x07ab, 0x07b2, + 0x07b8, 0x07c5, 0x07d5, 0x07df, 0x07e5, 0x07eb, 0x07f3, 0x07ff, + 0x0808, 0x081d, 0x0826, 0x0832, 0x083c, 0x0843, 0x084b, 0x0853, + 0x0860, 0x0877, 0x0882, 0x088e, 0x0896, 0x089f, 0x08af, 0x08be, + 0x08c4, 0x08d8, 0x08dc, 0x08df, 0x08eb, 0x08f2, 0x08fb, 0x0908, + 0x0910, 0x0915, 0x091b, 0x092d, 0x0933, 0x0939, 0x0942, 0x0949, + 0x094f, 0x0967, 0x097c, 0x0983, 0x098d, 0x0994, 0x09b0, 0x09b9, + 0x09cb, 0x09db, 0x09e2, 0x09e9, 0x09f9, 0x09fe, 0x0a04, 0x0a0a, + // Entry 100 - 13F + 0x0a11, 0x0a28, 0x0a2e, 0x0a36, 0x0a47, 0x0a4d, 0x0a54, 0x0a63, + 0x0a72, 0x0a7a, 0x0a89, 0x0a96, 0x0aa1, 0x0aaf, 0x0abb, 0x0ac9, + 0x0ad1, 0x0ae3, 0x0af3, 0x0afc, 0x0b08, 0x0b12, 0x0b20, 0x0b2c, + 0x0b36, 0x0b4c, 0x0b57, 0x0b5c, 0x0b66, 0x0b73, 0x0b7a, 0x0b85, + 0x0b93, 0x0ba2, 0x0bb1, +} // Size: 606 bytes + +var faRegionStr string = "" + // Size: 5002 bytes + "جزایر آسنسیونآندوراامارات متحدهٔ عربیافغانستانآنتیگوا و باربوداآنگویلاآل" + + "بانیارمنستانآنتیل هلندآنگولاجنوبگانآرژانتینساموآی امریکااتریشاسترالیاآر" + + "وباجزایر آلاندجمهوری آذربایجانبوسنی و هرزگوینباربادوسبنگلادشبلژیکبورکین" + + "افاسوبلغارستانبحرینبوروندیبنینسن بارتلمیبرمودابرونئیبولیویجزایر کارائیب" + + " هلندبرزیلباهامابوتانجزیرهٔ بووهبوتسوانابلاروسبلیزکاناداجزایر کوکوسکنگو " + + "- کینشاساجمهوری افریقای مرکزیکنگو - برازویلسوئیسساحل عاججزایر کوکشیلیکام" + + "رونچینکلمبیاجزایر کلیپرتونکاستاریکاکوباکیپ\u200cوردکوراسائوجزیرهٔ کریسم" + + "سقبرسجمهوری چکآلماندیه\u200cگو گارسیاجیبوتیدانمارکدومینیکاجمهوری دومینی" + + "کنالجزایرسبته و ملیلهاکوادوراستونیمصرصحرای غربیاریترهاسپانیااتیوپیاتحاد" + + "یهٔ اروپافنلاندفیجیجزایر فالکلندمیکرونزیجزایر فاروفرانسهگابنبریتانیاگرن" + + "اداگرجستانگویان فرانسهگرنزیغناجبل\u200cالطارقگرینلندگامبیاگینهگوادلوپگی" + + "نهٔ استوایییونانجورجیای جنوبی و جزایر ساندویچ جنوبیگواتمالاگوامگینهٔ بی" + + "سائوگویانهنگ\u200cکنگ، ناحیهٔ ویژهٔ حکومتی چینجزیرهٔ هرد و جزایر مک" + + "\u200cدونالدهندوراسکرواسیهائیتیمجارستانجزایر قناریاندونزیایرلنداسرائیلجز" + + "یرهٔ منهندقلمرو بریتانیا در اقیانوس هندعراقایرانایسلندایتالیاجرزیجامائی" + + "کااردنژاپنکنیاقرقیزستانکامبوجکیریباتیکوموروسنت کیتس و نویسکرهٔ شمالیکره" + + "ٔ جنوبیکویتجزایر کِیمنقزاقستانلائوسلبنانسنت لوسیالیختن\u200cاشتاینسری" + + "\u200cلانکالیبریالسوتولیتوانیلوکزامبورگلتونیلیبیمراکشموناکومولداویمونته" + + "\u200cنگروسنت مارتینماداگاسکارجزایر مارشالمقدونیهمالیمیانمار (برمه)مغولس" + + "تانماکائو، ناحیهٔ ویژهٔ حکومتی چینجزایر ماریانای شمالیمارتینیکموریتانیم" + + "ونت\u200cسراتمالتموریسمالدیومالاویمکزیکمالزیموزامبیکنامیبیاکالدونیای جد" + + "یدنیجرجزیرهٔ نورفولکنیجریهنیکاراگوئههلندنروژنپالنائورونیوئهنیوزیلندعمان" + + "پاناماپروپلی\u200cنزی فرانسهپاپوا گینهٔ نوفیلیپینپاکستانلهستانسن پیر و " + + "میکلنجزایر پیت\u200cکرنپورتوریکوسرزمین\u200cهای فلسطینیپرتغالپالائوپارا" + + "گوئهقطربخش\u200cهای دورافتادهٔ اقیانوسیهرئونیونرومانیصربستانروسیهرواندا" + + "عربستان سعودیجزایر سلیمانسیشلسودانسوئدسنگاپورسنت هلناسلوونیاسوالبارد و " + + "جان\u200cمایناسلواکیسیرالئونسان\u200cمارینوسنگالسومالیسورینامسودان جنوب" + + "یپرینسیپ و سائوتومهالسالوادورسنت مارتنسوریهسوازیلندتریستان دا کوناجزایر" + + " تورکس و کایکوسچادقلمروهای جنوبی فرانسهتوگوتایلندتاجیکستانتوکلائوتیمور-ل" + + "ستهترکمنستانتونستونگاترکیهترینیداد و توباگوتووالوتایوانتانزانیااوکراینا" + + "وگانداجزایر دورافتادهٔ ایالات متحدهایالات متحدهاروگوئهازبکستانواتیکانسن" + + "ت وینسنت و گرنادین\u200cهاونزوئلاجزایر ویرجین بریتانیاجزایر ویرجین ایال" + + "ات متحدهویتناموانواتووالیس و فوتوناساموآکوزوویمنمایوتافریقای جنوبیزامبی" + + "ازیمبابوهناحیهٔ نامشخصجهانافریقاامریکای شمالیامریکای جنوبیاقیانوسیهغرب " + + "افریقاامریکای مرکزیشرق افریقاشمال افریقامرکز افریقاجنوب افریقاامریکاشما" + + "ل امریکاکارائیبشرق آسیاجنوب آسیاجنوب شرق آسیاجنوب اروپااسترالزیملانزینا" + + "حیهٔ میکرونزیپلی\u200cنزیآسیاآسیای مرکزیغرب آسیااروپاشرق اروپاشمال اروپ" + + "اغرب اروپاامریکای لاتین" + +var faRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0019, 0x0025, 0x0047, 0x0059, 0x0079, 0x0087, 0x0093, + 0x00a3, 0x00b6, 0x00c2, 0x00d0, 0x00e0, 0x00f9, 0x0103, 0x0113, + 0x011d, 0x0132, 0x0151, 0x016d, 0x017d, 0x018b, 0x0195, 0x01ab, + 0x01bd, 0x01c7, 0x01d5, 0x01dd, 0x01f0, 0x01fc, 0x0208, 0x0214, + 0x0236, 0x0240, 0x024c, 0x0256, 0x026b, 0x027b, 0x0287, 0x028f, + 0x029b, 0x02b0, 0x02c9, 0x02ef, 0x0308, 0x0312, 0x0321, 0x0332, + 0x033a, 0x0346, 0x034c, 0x0358, 0x0373, 0x0385, 0x038d, 0x039c, + 0x03ac, 0x03c5, 0x03cd, 0x03de, 0x03e8, 0x0402, 0x040e, 0x041c, + // Entry 40 - 7F + 0x042c, 0x0449, 0x0457, 0x046d, 0x047b, 0x0487, 0x048d, 0x04a0, + 0x04ac, 0x04ba, 0x04c6, 0x04e1, 0x04ed, 0x04f5, 0x050e, 0x051e, + 0x0531, 0x053d, 0x0545, 0x0555, 0x0561, 0x056f, 0x0586, 0x0590, + 0x0596, 0x05ab, 0x05b9, 0x05c5, 0x05cd, 0x05db, 0x05f4, 0x05fe, + 0x063f, 0x064f, 0x0657, 0x066e, 0x0678, 0x06b5, 0x06ea, 0x06f8, + 0x0704, 0x0710, 0x0720, 0x0735, 0x0743, 0x074f, 0x075d, 0x076e, + 0x0774, 0x07aa, 0x07b2, 0x07bc, 0x07c8, 0x07d6, 0x07de, 0x07ee, + 0x07f6, 0x07fe, 0x0806, 0x0818, 0x0824, 0x0834, 0x0840, 0x085b, + // Entry 80 - BF + 0x086e, 0x0881, 0x0889, 0x089e, 0x08ae, 0x08b8, 0x08c2, 0x08d3, + 0x08ec, 0x08ff, 0x090b, 0x0915, 0x0923, 0x0937, 0x0941, 0x0949, + 0x0953, 0x095f, 0x096d, 0x0982, 0x0995, 0x09a9, 0x09c0, 0x09ce, + 0x09d6, 0x09ef, 0x09ff, 0x0a39, 0x0a5f, 0x0a6f, 0x0a7f, 0x0a92, + 0x0a9a, 0x0aa4, 0x0ab0, 0x0abc, 0x0ac6, 0x0ad0, 0x0ae0, 0x0aee, + 0x0b09, 0x0b11, 0x0b2c, 0x0b38, 0x0b4c, 0x0b54, 0x0b5c, 0x0b64, + 0x0b70, 0x0b7a, 0x0b8a, 0x0b92, 0x0b9e, 0x0ba4, 0x0bc0, 0x0bda, + 0x0be8, 0x0bf6, 0x0c02, 0x0c1b, 0x0c35, 0x0c47, 0x0c6b, 0x0c77, + // Entry C0 - FF + 0x0c83, 0x0c93, 0x0c99, 0x0cd0, 0x0cde, 0x0cea, 0x0cf8, 0x0d02, + 0x0d0e, 0x0d27, 0x0d3e, 0x0d46, 0x0d50, 0x0d58, 0x0d66, 0x0d73, + 0x0d81, 0x0da8, 0x0db6, 0x0dc6, 0x0ddb, 0x0de5, 0x0df1, 0x0dff, + 0x0e14, 0x0e36, 0x0e4a, 0x0e5b, 0x0e65, 0x0e75, 0x0e91, 0x0eb6, + 0x0ebc, 0x0ee4, 0x0eec, 0x0ef8, 0x0f0a, 0x0f18, 0x0f2b, 0x0f3d, + 0x0f45, 0x0f4f, 0x0f59, 0x0f79, 0x0f85, 0x0f91, 0x0fa1, 0x0faf, + 0x0fbd, 0x0ff4, 0x100b, 0x1019, 0x1029, 0x1037, 0x1063, 0x1071, + 0x1099, 0x10c8, 0x10d4, 0x10e2, 0x10fc, 0x1106, 0x1110, 0x1116, + // Entry 100 - 13F + 0x1120, 0x1139, 0x1145, 0x1155, 0x116e, 0x1176, 0x1182, 0x119b, + 0x11b4, 0x11c6, 0x11d9, 0x11f2, 0x1205, 0x121a, 0x122f, 0x1244, + 0x1250, 0x1265, 0x1273, 0x1282, 0x1293, 0x12ab, 0x12be, 0x12ce, + 0x12da, 0x12f7, 0x1306, 0x130e, 0x1323, 0x1332, 0x133c, 0x134d, + 0x1360, 0x1371, 0x138a, +} // Size: 606 bytes + +var fiRegionStr string = "" + // Size: 3017 bytes + "Ascension-saariAndorraArabiemiirikunnatAfganistanAntigua ja BarbudaAngui" + + "llaAlbaniaArmeniaAlankomaiden AntillitAngolaAntarktisArgentiinaAmerikan " + + "SamoaItävaltaAustraliaArubaAhvenanmaaAzerbaidžanBosnia ja HertsegovinaBa" + + "rbadosBangladeshBelgiaBurkina FasoBulgariaBahrainBurundiBeninSaint-Barth" + + "élemyBermudaBruneiBoliviaKaribian AlankomaatBrasiliaBahamaBhutanBouvet’" + + "nsaariBotswanaValko-VenäjäBelizeKanadaKookossaaret (Keelingsaaret)Kongon" + + " demokraattinen tasavaltaKeski-Afrikan tasavaltaKongon tasavaltaSveitsiN" + + "orsunluurannikkoCookinsaaretChileKamerunKiinaKolumbiaClippertoninsaariCo" + + "sta RicaKuubaKap VerdeCuraçaoJoulusaariKyprosTšekkiSaksaDiego GarciaDjib" + + "outiTanskaDominicaDominikaaninen tasavaltaAlgeriaCeuta ja MelillaEcuador" + + "ViroEgyptiLänsi-SaharaEritreaEspanjaEtiopiaEuroopan unioniSuomiFidžiFalk" + + "landinsaaretMikronesian liittovaltioFärsaaretRanskaGabonIso-BritanniaGre" + + "nadaGeorgiaRanskan GuayanaGuernseyGhanaGibraltarGrönlantiGambiaGuineaGua" + + "deloupePäiväntasaajan GuineaKreikkaEtelä-Georgia ja Eteläiset Sandwichsa" + + "aretGuatemalaGuamGuinea-BissauGuyanaHongkong – Kiinan e.h.a.Heard ja McD" + + "onaldinsaaretHondurasKroatiaHaitiUnkariKanariansaaretIndonesiaIrlantiIsr" + + "aelMansaariIntiaBrittiläinen Intian valtameren alueIrakIranIslantiItalia" + + "JerseyJamaikaJordaniaJapaniKeniaKirgisiaKambodžaKiribatiKomoritSaint Kit" + + "ts ja NevisPohjois-KoreaEtelä-KoreaKuwaitCaymansaaretKazakstanLaosLibano" + + "nSaint LuciaLiechtensteinSri LankaLiberiaLesothoLiettuaLuxemburgLatviaLi" + + "byaMarokkoMonacoMoldovaMontenegroSaint-MartinMadagaskarMarshallinsaaretM" + + "akedoniaMaliMyanmar (Burma)MongoliaMacao – Kiinan e.h.a.Pohjois-Mariaani" + + "tMartiniqueMauritaniaMontserratMaltaMauritiusMalediivitMalawiMeksikoMale" + + "siaMosambikNamibiaUusi-KaledoniaNigerNorfolkinsaariNigeriaNicaraguaAlank" + + "omaatNorjaNepalNauruNiueUusi-SeelantiOmanPanamaPeruRanskan PolynesiaPapu" + + "a-Uusi-GuineaFilippiinitPakistanPuolaSaint-Pierre ja MiquelonPitcairnPue" + + "rto RicoPalestiinalaisalueetPortugaliPalauParaguayQatarulkomeriRéunionRo" + + "maniaSerbiaVenäjäRuandaSaudi-ArabiaSalomonsaaretSeychellitSudanRuotsiSin" + + "gaporeSaint HelenaSloveniaHuippuvuoret ja Jan MayenSlovakiaSierra LeoneS" + + "an MarinoSenegalSomaliaSurinamEtelä-SudanSão Tomé ja PríncipeEl Salvador" + + "Sint MaartenSyyriaSwazimaaTristan da CunhaTurks- ja CaicossaaretTšadRans" + + "kan eteläiset alueetTogoThaimaaTadžikistanTokelauItä-TimorTurkmenistanTu" + + "nisiaTongaTurkkiTrinidad ja TobagoTuvaluTaiwanTansaniaUkrainaUgandaYhdys" + + "valtain erillissaaretYhdysvallatUruguayUzbekistanVatikaaniSaint Vincent " + + "ja GrenadiinitVenezuelaBrittiläiset NeitsytsaaretYhdysvaltain Neitsytsaa" + + "retVietnamVanuatuWallis ja FutunaSamoaKosovoJemenMayotteEtelä-AfrikkaSam" + + "biaZimbabwetuntematon aluemaailmaAfrikkaPohjois-AmerikkaEtelä-AmerikkaOs" + + "eaniaLänsi-AfrikkaVäli-AmerikkaItä-AfrikkaPohjois-AfrikkaKeski-Afrikkaet" + + "eläinen AfrikkaAmerikkapohjoinen AmerikkaKaribiaItä-AasiaEtelä-AasiaKaak" + + "kois-AasiaEtelä-EurooppaAustralaasiaMelanesiaMikronesiaPolynesiaAasiaKes" + + "ki-AasiaLänsi-AasiaEurooppaItä-EurooppaPohjois-EurooppaLänsi-EurooppaLat" + + "inalainen Amerikka" + +var fiRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x000f, 0x0016, 0x0027, 0x0031, 0x0043, 0x004b, 0x0052, + 0x0059, 0x006e, 0x0074, 0x007d, 0x0087, 0x0095, 0x009e, 0x00a7, + 0x00ac, 0x00b6, 0x00c2, 0x00d8, 0x00e0, 0x00ea, 0x00f0, 0x00fc, + 0x0104, 0x010b, 0x0112, 0x0117, 0x0128, 0x012f, 0x0135, 0x013c, + 0x014f, 0x0157, 0x015d, 0x0163, 0x0172, 0x017a, 0x0188, 0x018e, + 0x0194, 0x01b0, 0x01cf, 0x01e6, 0x01f6, 0x01fd, 0x020e, 0x021a, + 0x021f, 0x0226, 0x022b, 0x0233, 0x0244, 0x024e, 0x0253, 0x025c, + 0x0264, 0x026e, 0x0274, 0x027b, 0x0280, 0x028c, 0x0294, 0x029a, + // Entry 40 - 7F + 0x02a2, 0x02ba, 0x02c1, 0x02d1, 0x02d8, 0x02dc, 0x02e2, 0x02ef, + 0x02f6, 0x02fd, 0x0304, 0x0313, 0x0318, 0x031e, 0x032e, 0x0346, + 0x0350, 0x0356, 0x035b, 0x0368, 0x036f, 0x0376, 0x0385, 0x038d, + 0x0392, 0x039b, 0x03a5, 0x03ab, 0x03b1, 0x03bb, 0x03d2, 0x03d9, + 0x0404, 0x040d, 0x0411, 0x041e, 0x0424, 0x043e, 0x0457, 0x045f, + 0x0466, 0x046b, 0x0471, 0x047f, 0x0488, 0x048f, 0x0495, 0x049d, + 0x04a2, 0x04c6, 0x04ca, 0x04ce, 0x04d5, 0x04db, 0x04e1, 0x04e8, + 0x04f0, 0x04f6, 0x04fb, 0x0503, 0x050c, 0x0514, 0x051b, 0x052f, + // Entry 80 - BF + 0x053c, 0x0548, 0x054e, 0x055a, 0x0563, 0x0567, 0x056e, 0x0579, + 0x0586, 0x058f, 0x0596, 0x059d, 0x05a4, 0x05ad, 0x05b3, 0x05b8, + 0x05bf, 0x05c5, 0x05cc, 0x05d6, 0x05e2, 0x05ec, 0x05fc, 0x0605, + 0x0609, 0x0618, 0x0620, 0x0637, 0x0648, 0x0652, 0x065c, 0x0666, + 0x066b, 0x0674, 0x067e, 0x0684, 0x068b, 0x0692, 0x069a, 0x06a1, + 0x06af, 0x06b4, 0x06c2, 0x06c9, 0x06d2, 0x06dc, 0x06e1, 0x06e6, + 0x06eb, 0x06ef, 0x06fc, 0x0700, 0x0706, 0x070a, 0x071b, 0x072c, + 0x0737, 0x073f, 0x0744, 0x075c, 0x0764, 0x076f, 0x0783, 0x078c, + // Entry C0 - FF + 0x0791, 0x0799, 0x079e, 0x07a6, 0x07ae, 0x07b5, 0x07bb, 0x07c3, + 0x07c9, 0x07d5, 0x07e2, 0x07ec, 0x07f1, 0x07f7, 0x0800, 0x080c, + 0x0814, 0x082d, 0x0835, 0x0841, 0x084b, 0x0852, 0x0859, 0x0860, + 0x086c, 0x0883, 0x088e, 0x089a, 0x08a0, 0x08a8, 0x08b8, 0x08ce, + 0x08d3, 0x08ec, 0x08f0, 0x08f7, 0x0903, 0x090a, 0x0914, 0x0920, + 0x0927, 0x092c, 0x0932, 0x0944, 0x094a, 0x0950, 0x0958, 0x095f, + 0x0965, 0x097f, 0x098a, 0x0991, 0x099b, 0x09a4, 0x09c0, 0x09c9, + 0x09e4, 0x09fe, 0x0a05, 0x0a0c, 0x0a1c, 0x0a21, 0x0a27, 0x0a2c, + // Entry 100 - 13F + 0x0a33, 0x0a41, 0x0a47, 0x0a4f, 0x0a5e, 0x0a65, 0x0a6c, 0x0a7c, + 0x0a8b, 0x0a92, 0x0aa0, 0x0aae, 0x0aba, 0x0ac9, 0x0ad6, 0x0ae8, + 0x0af0, 0x0b02, 0x0b09, 0x0b13, 0x0b1f, 0x0b2d, 0x0b3c, 0x0b48, + 0x0b51, 0x0b5b, 0x0b64, 0x0b69, 0x0b74, 0x0b80, 0x0b88, 0x0b95, + 0x0ba5, 0x0bb4, 0x0bc9, +} // Size: 606 bytes + +var filRegionStr string = "" + // Size: 3038 bytes + "Acsencion islandAndorraUnited Arab EmiratesAfghanistanAntigua and Barbud" + + "aAnguillaAlbaniaArmeniaNetherlands AntillesAngolaAntarcticaArgentinaAmer" + + "ican SamoaAustriaAustraliaArubaÅland IslandsAzerbaijanBosnia and Herzego" + + "vinaBarbadosBangladeshBelgiumBurkina FasoBulgariaBahrainBurundiBeninSain" + + "t BarthélemyBermudaBruneiBoliviaCaribbean NetherlandsBrazilBahamasBhutan" + + "Bouvet IslandBotswanaBelarusBelizeCanadaCocos (Keeling) IslandsCongo - K" + + "inshasaCentral African RepublicCongo - BrazzavilleSwitzerlandCôte d’Ivoi" + + "reCook IslandsChileCameroonChinaColombiaClipperton IslandCosta RicaCubaC" + + "ape VerdeCuraçaoChristmas IslandCyprusCzech RepublicGermanyDiego GarciaD" + + "jiboutiDenmarkDominicaDominican RepublicAlgeriaCeuta and MelillaEcuadorE" + + "stoniaEgyptKanlurang SaharaEritreaSpainEthiopiaEuropean UnionFinlandFiji" + + "Falkland IslandsMicronesiaFaroe IslandsFranceGabonUnited KingdomGrenadaG" + + "eorgiaFrench GuianaGuernseyGhanaGibraltarGreenlandGambiaGuineaGuadeloupe" + + "Equatorial GuineaGreeceSouth Georgia and the South Sandwich IslandsGuate" + + "malaGuamGuinea-BissauGuyanaHong Kong SAR ChinaHeard Island and McDonald " + + "IslandsHondurasCroatiaHaitiHungaryCanary IslandIndonesiaIrelandIsraelIsl" + + "e of ManIndiaBritish Indian Ocean TerritoryIraqIranIcelandItalyJerseyJam" + + "aicaJordanJapanKenyaKyrgyzstanCambodiaKiribatiComorosSaint Kitts and Nev" + + "isHilagang KoreaTimog KoreaKuwaitCayman IslandsKazakhstanLaosLebanonSain" + + "t LuciaLiechtensteinSri LankaLiberiaLesothoLithuaniaLuxembourgLatviaLiby" + + "aMoroccoMonacoMoldovaMontenegroSaint MartinMadagascarMarshall IslandsMac" + + "edoniaMaliMyanmar (Burma)MongoliaMacau SAR ChinaNorthern Mariana Islands" + + "MartiniqueMauritaniaMontserratMaltaMauritiusMaldivesMalawiMexicoMalaysia" + + "MozambiqueNamibiaNew CaledoniaNigerNorfolk IslandNigeriaNicaraguaNetherl" + + "andsNorwayNepalNauruNiueNew ZealandOmanPanamaPeruFrench PolynesiaPapua N" + + "ew GuineaPilipinasPakistanPolandSaint Pierre and MiquelonPitcairn Island" + + "sPuerto RicoPalestinian TerritoriesPortugalPalauParaguayQatarOutlying Oc" + + "eaniaRéunionRomaniaSerbiaRussiaRwandaSaudi ArabiaSolomon IslandsSeychell" + + "esSudanSwedenSingaporeSaint HelenaSloveniaSvalbard and Jan MayenSlovakia" + + "Sierra LeoneSan MarinoSenegalSomaliaSurinameTimog SudanSão Tomé and Prín" + + "cipeEl SalvadorSint MaartenSyriaSwazilandTristan de CunhaTurks and Caico" + + "s IslandsChadFrench Southern TerritoriesTogoThailandTajikistanTokelauTim" + + "or-LesteTurkmenistanTunisiaTongaTurkeyTrinidad and TobagoTuvaluTaiwanTan" + + "zaniaUkraineUgandaU.S. Outlying IslandsEstados UnidosUruguayUzbekistanVa" + + "tican CitySaint Vincent and the GrenadinesVenezuelaBritish Virgin Island" + + "sU.S. Virgin IslandsVietnamVanuatuWallis and FutunaSamoaKosovoYemenMayot" + + "teSouth AfricaZambiaZimbabweHindi Kilalang RehiyonMundoAfricaHilagang Am" + + "erikaTimog AmerikaOceaniaKanlurang AfricaGitnang AmerikaSilangang Africa" + + "Hilagang AfricaGitnang AfricaKatimugang AfricaAmericasNorthern AmericaCa" + + "rribbeanSilangang AsyaKatimugang AsyaTimog-Silangang AsyaKatimugang Euro" + + "peAustralasiaMelanesiaRehiyon ng MicronesiaPolynesiaAsyaGitnang AsyaKanl" + + "urang AsyaEuropeSilangang EuropeHilagang EuropeKanlurang EuropeLatin Ame" + + "rica" + +var filRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0010, 0x0017, 0x002b, 0x0036, 0x0049, 0x0051, 0x0058, + 0x005f, 0x0073, 0x0079, 0x0083, 0x008c, 0x009a, 0x00a1, 0x00aa, + 0x00af, 0x00bd, 0x00c7, 0x00dd, 0x00e5, 0x00ef, 0x00f6, 0x0102, + 0x010a, 0x0111, 0x0118, 0x011d, 0x012e, 0x0135, 0x013b, 0x0142, + 0x0157, 0x015d, 0x0164, 0x016a, 0x0177, 0x017f, 0x0186, 0x018c, + 0x0192, 0x01a9, 0x01b9, 0x01d1, 0x01e4, 0x01ef, 0x01ff, 0x020b, + 0x0210, 0x0218, 0x021d, 0x0225, 0x0236, 0x0240, 0x0244, 0x024e, + 0x0256, 0x0266, 0x026c, 0x027a, 0x0281, 0x028d, 0x0295, 0x029c, + // Entry 40 - 7F + 0x02a4, 0x02b6, 0x02bd, 0x02ce, 0x02d5, 0x02dc, 0x02e1, 0x02f1, + 0x02f8, 0x02fd, 0x0305, 0x0313, 0x031a, 0x031e, 0x032e, 0x0338, + 0x0345, 0x034b, 0x0350, 0x035e, 0x0365, 0x036c, 0x0379, 0x0381, + 0x0386, 0x038f, 0x0398, 0x039e, 0x03a4, 0x03ae, 0x03bf, 0x03c5, + 0x03f1, 0x03fa, 0x03fe, 0x040b, 0x0411, 0x0424, 0x0445, 0x044d, + 0x0454, 0x0459, 0x0460, 0x046d, 0x0476, 0x047d, 0x0483, 0x048e, + 0x0493, 0x04b1, 0x04b5, 0x04b9, 0x04c0, 0x04c5, 0x04cb, 0x04d2, + 0x04d8, 0x04dd, 0x04e2, 0x04ec, 0x04f4, 0x04fc, 0x0503, 0x0518, + // Entry 80 - BF + 0x0526, 0x0531, 0x0537, 0x0545, 0x054f, 0x0553, 0x055a, 0x0565, + 0x0572, 0x057b, 0x0582, 0x0589, 0x0592, 0x059c, 0x05a2, 0x05a7, + 0x05ae, 0x05b4, 0x05bb, 0x05c5, 0x05d1, 0x05db, 0x05eb, 0x05f4, + 0x05f8, 0x0607, 0x060f, 0x061e, 0x0636, 0x0640, 0x064a, 0x0654, + 0x0659, 0x0662, 0x066a, 0x0670, 0x0676, 0x067e, 0x0688, 0x068f, + 0x069c, 0x06a1, 0x06af, 0x06b6, 0x06bf, 0x06ca, 0x06d0, 0x06d5, + 0x06da, 0x06de, 0x06e9, 0x06ed, 0x06f3, 0x06f7, 0x0707, 0x0717, + 0x0720, 0x0728, 0x072e, 0x0747, 0x0757, 0x0762, 0x0779, 0x0781, + // Entry C0 - FF + 0x0786, 0x078e, 0x0793, 0x07a3, 0x07ab, 0x07b2, 0x07b8, 0x07be, + 0x07c4, 0x07d0, 0x07df, 0x07e9, 0x07ee, 0x07f4, 0x07fd, 0x0809, + 0x0811, 0x0827, 0x082f, 0x083b, 0x0845, 0x084c, 0x0853, 0x085b, + 0x0866, 0x087e, 0x0889, 0x0895, 0x089a, 0x08a3, 0x08b3, 0x08cb, + 0x08cf, 0x08ea, 0x08ee, 0x08f6, 0x0900, 0x0907, 0x0912, 0x091e, + 0x0925, 0x092a, 0x0930, 0x0943, 0x0949, 0x094f, 0x0957, 0x095e, + 0x0964, 0x0979, 0x0987, 0x098e, 0x0998, 0x09a4, 0x09c4, 0x09cd, + 0x09e3, 0x09f6, 0x09fd, 0x0a04, 0x0a15, 0x0a1a, 0x0a20, 0x0a25, + // Entry 100 - 13F + 0x0a2c, 0x0a38, 0x0a3e, 0x0a46, 0x0a5c, 0x0a61, 0x0a67, 0x0a77, + 0x0a84, 0x0a8b, 0x0a9b, 0x0aaa, 0x0aba, 0x0ac9, 0x0ad7, 0x0ae8, + 0x0af0, 0x0b00, 0x0b0a, 0x0b18, 0x0b27, 0x0b3b, 0x0b4c, 0x0b57, + 0x0b60, 0x0b75, 0x0b7e, 0x0b82, 0x0b8e, 0x0b9c, 0x0ba2, 0x0bb2, + 0x0bc1, 0x0bd1, 0x0bde, +} // Size: 606 bytes + +var frRegionStr string = "" + // Size: 3330 bytes + "Île de l’AscensionAndorreÉmirats arabes unisAfghanistanAntigua-et-Barbud" + + "aAnguillaAlbanieArménieAntilles néerlandaisesAngolaAntarctiqueArgentineS" + + "amoa américainesAutricheAustralieArubaÎles ÅlandAzerbaïdjanBosnie-Herzég" + + "ovineBarbadeBangladeshBelgiqueBurkina FasoBulgarieBahreïnBurundiBéninSai" + + "nt-BarthélemyBermudesBrunéi DarussalamBoliviePays-Bas caribéensBrésilBah" + + "amasBhoutanÎle BouvetBotswanaBiélorussieBelizeCanadaÎles CocosCongo-Kins" + + "hasaRépublique centrafricaineCongo-BrazzavilleSuisseCôte d’IvoireÎles Co" + + "okChiliCamerounChineColombieÎle ClippertonCosta RicaCubaCap-VertCuraçaoÎ" + + "le ChristmasChypreRépublique tchèqueAllemagneDiego GarciaDjiboutiDanemar" + + "kDominiqueRépublique dominicaineAlgérieCeuta et MelillaÉquateurEstonieÉg" + + "ypteSahara occidentalÉrythréeEspagneÉthiopieUnion européenneFinlandeFidj" + + "iÎles MalouinesÉtats fédérés de MicronésieÎles FéroéFranceGabonRoyaume-U" + + "niGrenadeGéorgieGuyane françaiseGuerneseyGhanaGibraltarGroenlandGambieGu" + + "inéeGuadeloupeGuinée équatorialeGrèceGéorgie du Sud et îles Sandwich du " + + "SudGuatemalaGuamGuinée-BissauGuyanaR.A.S. chinoise de Hong KongÎles Hear" + + "d et McDonaldHondurasCroatieHaïtiHongrieÎles CanariesIndonésieIrlandeIsr" + + "aëlÎle de ManIndeTerritoire britannique de l’océan IndienIrakIranIslande" + + "ItalieJerseyJamaïqueJordanieJaponKenyaKirghizistanCambodgeKiribatiComore" + + "sSaint-Christophe-et-NiévèsCorée du NordCorée du SudKoweïtÎles CaïmansKa" + + "zakhstanLaosLibanSainte-LucieLiechtensteinSri LankaLibériaLesothoLituani" + + "eLuxembourgLettonieLibyeMarocMonacoMoldavieMonténégroSaint-MartinMadagas" + + "carÎles MarshallMacédoineMaliMyanmar (Birmanie)MongolieR.A.S. chinoise d" + + "e MacaoÎles Mariannes du NordMartiniqueMauritanieMontserratMalteMauriceM" + + "aldivesMalawiMexiqueMalaisieMozambiqueNamibieNouvelle-CalédonieNigerÎle " + + "NorfolkNigériaNicaraguaPays-BasNorvègeNépalNauruNiueNouvelle-ZélandeOman" + + "PanamaPérouPolynésie françaisePapouasie-Nouvelle-GuinéePhilippinesPakist" + + "anPologneSaint-Pierre-et-MiquelonÎles PitcairnPorto RicoTerritoires pale" + + "stiniensPortugalPalaosParaguayQatarrégions éloignées de l’OcéanieLa Réun" + + "ionRoumanieSerbieRussieRwandaArabie saouditeÎles SalomonSeychellesSoudan" + + "SuèdeSingapourSainte-HélèneSlovénieSvalbard et Jan MayenSlovaquieSierra " + + "LeoneSaint-MarinSénégalSomalieSurinameSoudan du SudSao Tomé-et-PrincipeE" + + "l SalvadorSaint-Martin (partie néerlandaise)SyrieSwazilandTristan da Cun" + + "haÎles Turques-et-CaïquesTchadTerres australes françaisesTogoThaïlandeTa" + + "djikistanTokélaouTimor orientalTurkménistanTunisieTongaTurquieTrinité-et" + + "-TobagoTuvaluTaïwanTanzanieUkraineOugandaÎles mineures éloignées des Éta" + + "ts-UnisÉtats-UnisUruguayOuzbékistanÉtat de la Cité du VaticanSaint-Vince" + + "nt-et-les-GrenadinesVenezuelaÎles Vierges britanniquesÎles Vierges des É" + + "tats-UnisVietnamVanuatuWallis-et-FutunaSamoaKosovoYémenMayotteAfrique du" + + " SudZambieZimbabwerégion indéterminéeMondeAfriqueAmérique du NordAmériqu" + + "e du SudOcéanieAfrique occidentaleAmérique centraleAfrique orientaleAfri" + + "que septentrionaleAfrique centraleAfrique australeAmériquesAmérique sept" + + "entrionaleCaraïbesAsie orientaleAsie du SudAsie du Sud-EstEurope méridio" + + "naleAustralasieMélanésierégion micronésiennePolynésieAsieAsie centraleAs" + + "ie occidentaleEuropeEurope de l’EstEurope septentrionaleEurope occidenta" + + "leAmérique latine" + +var frRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0015, 0x001c, 0x0030, 0x003b, 0x004d, 0x0055, 0x005c, + 0x0064, 0x007b, 0x0081, 0x008c, 0x0095, 0x00a7, 0x00af, 0x00b8, + 0x00bd, 0x00c9, 0x00d5, 0x00e8, 0x00ef, 0x00f9, 0x0101, 0x010d, + 0x0115, 0x011d, 0x0124, 0x012a, 0x013b, 0x0143, 0x0155, 0x015c, + 0x016f, 0x0176, 0x017d, 0x0184, 0x018f, 0x0197, 0x01a3, 0x01a9, + 0x01af, 0x01ba, 0x01c8, 0x01e2, 0x01f3, 0x01f9, 0x0209, 0x0213, + 0x0218, 0x0220, 0x0225, 0x022d, 0x023c, 0x0246, 0x024a, 0x0252, + 0x025a, 0x0268, 0x026e, 0x0282, 0x028b, 0x0297, 0x029f, 0x02a7, + // Entry 40 - 7F + 0x02b0, 0x02c7, 0x02cf, 0x02df, 0x02e8, 0x02ef, 0x02f6, 0x0307, + 0x0311, 0x0318, 0x0321, 0x0332, 0x033a, 0x033f, 0x034e, 0x036e, + 0x037b, 0x0381, 0x0386, 0x0391, 0x0398, 0x03a0, 0x03b1, 0x03ba, + 0x03bf, 0x03c8, 0x03d1, 0x03d7, 0x03de, 0x03e8, 0x03fc, 0x0402, + 0x042a, 0x0433, 0x0437, 0x0445, 0x044b, 0x0467, 0x047e, 0x0486, + 0x048d, 0x0493, 0x049a, 0x04a8, 0x04b2, 0x04b9, 0x04c0, 0x04cb, + 0x04cf, 0x04fa, 0x04fe, 0x0502, 0x0509, 0x050f, 0x0515, 0x051e, + 0x0526, 0x052b, 0x0530, 0x053c, 0x0544, 0x054c, 0x0553, 0x056f, + // Entry 80 - BF + 0x057d, 0x058a, 0x0591, 0x059f, 0x05a9, 0x05ad, 0x05b2, 0x05be, + 0x05cb, 0x05d4, 0x05dc, 0x05e3, 0x05eb, 0x05f5, 0x05fd, 0x0602, + 0x0607, 0x060d, 0x0615, 0x0621, 0x062d, 0x0637, 0x0645, 0x064f, + 0x0653, 0x0665, 0x066d, 0x0685, 0x069c, 0x06a6, 0x06b0, 0x06ba, + 0x06bf, 0x06c6, 0x06ce, 0x06d4, 0x06db, 0x06e3, 0x06ed, 0x06f4, + 0x0707, 0x070c, 0x0718, 0x0720, 0x0729, 0x0731, 0x0739, 0x073f, + 0x0744, 0x0748, 0x0759, 0x075d, 0x0763, 0x0769, 0x077e, 0x0798, + 0x07a3, 0x07ab, 0x07b2, 0x07ca, 0x07d8, 0x07e2, 0x07fa, 0x0802, + // Entry C0 - FF + 0x0808, 0x0810, 0x0815, 0x0839, 0x0844, 0x084c, 0x0852, 0x0858, + 0x085e, 0x086d, 0x087a, 0x0884, 0x088a, 0x0890, 0x0899, 0x08a8, + 0x08b1, 0x08c6, 0x08cf, 0x08db, 0x08e6, 0x08ef, 0x08f6, 0x08fe, + 0x090b, 0x0920, 0x092b, 0x094e, 0x0953, 0x095c, 0x096c, 0x0985, + 0x098a, 0x09a6, 0x09aa, 0x09b4, 0x09bf, 0x09c8, 0x09d6, 0x09e3, + 0x09ea, 0x09ef, 0x09f6, 0x0a08, 0x0a0e, 0x0a15, 0x0a1d, 0x0a24, + 0x0a2b, 0x0a55, 0x0a60, 0x0a67, 0x0a73, 0x0a8f, 0x0aae, 0x0ab7, + 0x0ad1, 0x0aee, 0x0af5, 0x0afc, 0x0b0c, 0x0b11, 0x0b17, 0x0b1d, + // Entry 100 - 13F + 0x0b24, 0x0b32, 0x0b38, 0x0b40, 0x0b56, 0x0b5b, 0x0b62, 0x0b73, + 0x0b83, 0x0b8b, 0x0b9e, 0x0bb0, 0x0bc1, 0x0bd7, 0x0be7, 0x0bf7, + 0x0c01, 0x0c19, 0x0c22, 0x0c30, 0x0c3b, 0x0c4a, 0x0c5d, 0x0c68, + 0x0c73, 0x0c89, 0x0c93, 0x0c97, 0x0ca4, 0x0cb4, 0x0cba, 0x0ccb, + 0x0ce0, 0x0cf2, 0x0d02, +} // Size: 606 bytes + +var frCARegionStr string = "" + // Size: 145 bytes + "BélarusÎles Cocos (Keeling)MicronésieSaint-Martin (France)MyanmarSaint-M" + + "artin (Pays-Bas)TokelauSaint-Vincent-et-les GrenadinesEurope orientale" + +var frCARegionIdx = []uint16{ // 288 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0008, + 0x0008, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, + // Entry 40 - 7F + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, + 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x001d, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + // Entry 80 - BF + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, 0x0028, + 0x0028, 0x0028, 0x0028, 0x0028, 0x003d, 0x003d, 0x003d, 0x003d, + 0x003d, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, + 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, + 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, + 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, + 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, + // Entry C0 - FF + 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, + 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, + 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, 0x0044, + 0x0044, 0x0044, 0x0044, 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, + 0x005b, 0x005b, 0x005b, 0x005b, 0x005b, 0x0062, 0x0062, 0x0062, + 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, + 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0062, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + // Entry 100 - 13F + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, + 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0081, 0x0091, +} // Size: 600 bytes + +var guRegionStr string = "" + // Size: 8706 bytes + "એસેન્શન આઇલેન્ડઍંડોરાયુનાઇટેડ આરબ અમીરાતઅફઘાનિસ્તાનએન્ટીગુઆ અને બર્મુડાઍ" + + "ંગ્વિલાઅલ્બેનિયાઆર્મેનિયાનેધરલેંડ્સ એંટિલેસઅંગોલાએન્ટાર્કટિકાઆર્જેન્ટી" + + "નાઅમેરીકન સમોઆઑસ્ટ્રિયાઑસ્ટ્રેલિયાઅરુબાએલેંડ ટાપુઓઅઝરબૈજાનબોસ્નિયા અને" + + " હર્ઝેગોવિનાબાર્બાડોસબાંગ્લાદેશબેલ્જીયમબુર્કિના ફાસોબલ્ગેરિયાબેહરીનબુરું" + + "ડીબેનિનસેન્ટ બાર્થેલેમીબર્મુડાબ્રુનેઇબોલિવિયાકેરેબિયન નેધરલેન્ડ્ઝબ્રાઝ" + + "િલબહામાસભૂટાનબૌવેત આઇલેન્ડબોત્સ્વાનાબેલારુસબેલીઝકેનેડાકોકોઝ (કીલીંગ) આ" + + "ઇલેન્ડ્સકોંગો - કિંશાસાસેન્ટ્રલ આફ્રિકન રીપબ્લિકકોંગો - બ્રાઝાવિલેસ્વિ" + + "ટ્ઝર્લૅન્ડકોટ ડી આઇવરીકુક આઇલેન્ડ્સચિલીકૅમરૂનચીનકોલમ્બિયાક્લિપરટન આઇલે" + + "ન્ડકોસ્ટા રિકાક્યુબાકૅપ વર્ડેકુરાકાઓક્રિસમસ આઇલેન્ડસાયપ્રસચેક રીપબ્લિક" + + "જર્મનીડિએગો ગારસિઆજીબૌટીડેનમાર્કડોમિનિકાડોમિનિકન રીપબ્લિકઅલ્જીરિયાસ્યુ" + + "ટા અને મેલિલાએક્વાડોરએસ્ટોનિયાઇજિપ્તપશ્ચિમી સહારાએરિટ્રિયાસ્પેનઇથિઓપિય" + + "ાયુરોપિયન સંઘફિનલેન્ડફીજીફૉકલેન્ડ ટાપુઓમાઇક્રોનેશિયાફૅરો ટાપુઓફ્રાંસગે" + + "બનયુનાઇટેડ કિંગડમગ્રેનેડાજ્યોર્જીયાફ્રેંચ ગયાનાગ્વેર્નસેઘાનાજીબ્રાલ્ટર" + + "ગ્રીનલેન્ડગેમ્બિયાગિનીગ્વાડેલોપઇક્વેટોરિયલ ગિનીગ્રીસદક્ષિણ જ્યોર્જીયા " + + "અને દક્ષિણ સેન્ડવિચ આઇલેન્ડ્સગ્વાટેમાલાગ્વામગિની-બિસાઉગયાનાહોંગકોંગ SA" + + "R ચીનહર્ડ અને મેકડોનાલ્ડ આઇલેન્ડ્સહોન્ડુરસક્રોએશિયાહૈતિહંગેરીકૅનેરી ટાપુ" + + "ઓઇન્ડોનેશિયાઆયર્લેન્ડઇઝરાઇલઆઈલ ઓફ મૅનભારતબ્રિટિશ ઇન્ડિયન ઓશન ટેરિટરીઇર" + + "ાકઈરાનઆઇસલેન્ડઇટાલીજર્સીજમૈકાજોર્ડનજાપાનકેન્યાકિર્ગિઝ્સ્તાનકંબોડિયાકિર" + + "િબાટીકોમોરસસેન્ટ કિટ્સ અને નેવિસઉત્તર કોરિયાદક્ષિણ કોરિયાકુવૈતકેમેન ટા" + + "પુઓકઝાકિસ્તાનલાઓસલેબનોનસેન્ટ લુસિયાલૈચટેંસ્ટેઇનશ્રીલંકાલાઇબેરિયાલેસોથો" + + "લિથુઆનિયાલક્ઝમબર્ગલાત્વિયાલિબિયામોરોક્કોમોનાકોમોલડોવામૉન્ટેંનેગ્રોસેન્" + + "ટ માર્ટિનમેડાગાસ્કરમાર્શલ આઇલેન્ડ્સમેસેડોનિયામાલીમ્યાંમાર (બર્મા)મંગોલ" + + "િયામકાઉ SAR ચીનઉત્તરીય મારિયાના આઇલેન્ડ્સમાર્ટીનીકમૌરિટાનિયામોંટસેરાતમ" + + "ાલ્ટામોરિશિયસમાલદિવ્સમાલાવીમેક્સિકોમલેશિયામોઝામ્બિકનામિબિયાન્યુ સેલેડો" + + "નિયાનાઇજરનોરફૉક ટાપુનાઇજીરીયાનિકારાગુઆનેધરલેન્ડનૉર્વેનેપાળનૌરુનીયુન્યુ" + + "ઝીલેન્ડઓમાનપનામાપેરુફ્રેંચ પોલિનેશિયાપાપુઆ ન્યૂ ગિનીફિલીપાઇન્સપાકિસ્તા" + + "નપોલેંડસેન્ટ પિયર અને મીક્વેલનપીટકૈર્ન આઇલેન્ડ્સપ્યુઅર્ટો રિકોપેલેસ્ટિ" + + "નિયન ટેરિટરીપોર્ટુગલપલાઉપેરાગ્વેકતારઆઉટલાઈન્ગ ઓશનિયારીયુનિયનરોમાનિયાસર" + + "્બિયારશિયારવાંડાસાઉદી અરેબિયાસોલોમન આઇલેન્ડ્સસેશેલ્સસુદાનસ્વીડનસિંગાપુ" + + "રસેન્ટ હેલેનાસ્લોવેનિયાસ્વાલબર્ડ અને જેન મેયનસ્લોવેકિયાસીએરા લેઓનસૅન મ" + + "ેરિનોસેનેગલસોમાલિયાસુરીનામદક્ષિણ સુદાનસાઓ ટૉમ અને પ્રિંસિપેએલ સેલ્વાડો" + + "રસિંટ માર્ટેનસીરિયાસ્વાઝિલેન્ડત્રિસ્તાન દા કુન્હાતુર્ક્સ અને કાઇકોસ ટા" + + "પુઓચાડફ્રેંચ સદર્ન ટેરિટરીઝટોગોથાઇલેંડતાજીકિસ્તાનટોકેલાઉતિમોર-લેસ્તેતુ" + + "ર્કમેનિસ્તાનટ્યુનિશિયાટોંગાતુર્કીટ્રિનીદાદ અને ટોબેગોતુવાલુતાઇવાનતાંઝા" + + "નિયાયુક્રેનયુગાંડાસંયુક્ત રાજ્ય આઉટલાઇંગ આયલેન્ડ્સસંયુકત રાજ્ય અમેરિકા" + + "ઉરુગ્વેઉઝ્બેકિસ્તાનવેટિકન સિટીસેન્ટ વિન્સેટ અને ગ્રેનેડીન્સવેનેઝુએલાબ્" + + "રિટિશ વર્જિન ટાપુઓયુ.એસ. વર્જિન ટાપુઓવિયેતનામવાનુઆતુવેલીસ અને ફ્યુટુના" + + "સમોઆકોસોવોયેમેનમેયોટદક્ષિણ આફ્રિકાઝામ્બિયાઝિમ્બાબ્વેઅજ્ઞાત પ્રદેશવિશ્વ" + + "આફ્રિકાઉત્તર અમેરિકાદક્ષિણ અમેરિકાઓશનિયાપશ્ચિમી આફ્રિકામધ્ય અમેરિકાપૂર" + + "્વીય આફ્રિકાઉત્તરીય આફ્રિકામધ્ય આફ્રિકાસધર્ન આફ્રિકાઅમેરિકાઉત્તરીય અમે" + + "રિકાકેરિબિયનપૂર્વીય એશિયાસર્ધન એશિયાદક્ષિણપૂર્વ એશિયાસધર્ન યુરોપઓસ્ટ્ર" + + "ેલેશિયામેલાનેશિયામાઈક્રોનેશિયન ક્ષેત્રપોલિનેશિયાએશિયામધ્ય એશિયાપશ્ચિમી" + + " એશિયાયુરોપપૂર્વીય યુરોપઉત્તરીય યુરોપપશ્ચિમ યુરોપલેટિન અમેરિકા" + +var guRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x002b, 0x003d, 0x0072, 0x0093, 0x00cb, 0x00e3, 0x00fe, + 0x0119, 0x014d, 0x015f, 0x0183, 0x01a4, 0x01c6, 0x01e1, 0x0202, + 0x0211, 0x0230, 0x0248, 0x028c, 0x02a7, 0x02c5, 0x02dd, 0x0302, + 0x031d, 0x032f, 0x0344, 0x0353, 0x0381, 0x0396, 0x03ab, 0x03c3, + 0x03fd, 0x0412, 0x0424, 0x0433, 0x0458, 0x0476, 0x048b, 0x049a, + 0x04ac, 0x04ec, 0x0513, 0x055a, 0x058a, 0x05b4, 0x05d4, 0x05f9, + 0x0605, 0x0617, 0x0620, 0x063b, 0x0669, 0x0688, 0x069a, 0x06b3, + 0x06c8, 0x06f3, 0x0708, 0x072a, 0x073c, 0x075e, 0x0770, 0x0788, + // Entry 40 - 7F + 0x07a0, 0x07d1, 0x07ec, 0x081b, 0x0833, 0x084e, 0x0860, 0x0885, + 0x08a0, 0x08af, 0x08c7, 0x08e9, 0x0901, 0x090d, 0x0935, 0x095c, + 0x0978, 0x098a, 0x0996, 0x09c1, 0x09d9, 0x09f7, 0x0a19, 0x0a34, + 0x0a40, 0x0a5e, 0x0a7c, 0x0a94, 0x0aa0, 0x0abb, 0x0ae9, 0x0af8, + 0x0b7b, 0x0b99, 0x0ba8, 0x0bc4, 0x0bd3, 0x0bf9, 0x0c4a, 0x0c62, + 0x0c7d, 0x0c89, 0x0c9b, 0x0cbd, 0x0cde, 0x0cf9, 0x0d0b, 0x0d25, + 0x0d31, 0x0d7c, 0x0d88, 0x0d94, 0x0dac, 0x0dbb, 0x0dca, 0x0dd9, + 0x0deb, 0x0dfa, 0x0e0c, 0x0e33, 0x0e4b, 0x0e63, 0x0e75, 0x0eae, + // Entry 80 - BF + 0x0ed0, 0x0ef5, 0x0f04, 0x0f23, 0x0f41, 0x0f4d, 0x0f5f, 0x0f81, + 0x0fa5, 0x0fbd, 0x0fd8, 0x0fea, 0x1005, 0x1020, 0x1038, 0x104a, + 0x1062, 0x1074, 0x1089, 0x10b0, 0x10d5, 0x10f3, 0x1121, 0x113f, + 0x114b, 0x1175, 0x118d, 0x11a7, 0x11f1, 0x120c, 0x122a, 0x1245, + 0x1257, 0x126f, 0x1287, 0x1299, 0x12b1, 0x12c6, 0x12e1, 0x12f9, + 0x1324, 0x1333, 0x1352, 0x136d, 0x1388, 0x13a3, 0x13b5, 0x13c4, + 0x13d0, 0x13dc, 0x13fd, 0x1409, 0x1418, 0x1424, 0x1455, 0x147e, + 0x149c, 0x14b7, 0x14c9, 0x1508, 0x153c, 0x1564, 0x159e, 0x15b6, + // Entry C0 - FF + 0x15c2, 0x15da, 0x15e6, 0x1614, 0x162c, 0x1644, 0x1659, 0x1668, + 0x167a, 0x169f, 0x16cd, 0x16e2, 0x16f1, 0x1703, 0x171b, 0x173d, + 0x175b, 0x1797, 0x17b5, 0x17d1, 0x17ed, 0x17ff, 0x1817, 0x182c, + 0x184e, 0x1887, 0x18a9, 0x18cb, 0x18dd, 0x18fe, 0x1933, 0x1975, + 0x197e, 0x19b9, 0x19c5, 0x19da, 0x19fb, 0x1a10, 0x1a32, 0x1a5c, + 0x1a7a, 0x1a89, 0x1a9b, 0x1ad3, 0x1ae5, 0x1af7, 0x1b12, 0x1b27, + 0x1b3c, 0x1b96, 0x1bce, 0x1be3, 0x1c07, 0x1c26, 0x1c77, 0x1c92, + 0x1cca, 0x1cfb, 0x1d13, 0x1d28, 0x1d5a, 0x1d66, 0x1d78, 0x1d87, + // Entry 100 - 13F + 0x1d96, 0x1dbe, 0x1dd6, 0x1df4, 0x1e19, 0x1e28, 0x1e3d, 0x1e62, + 0x1e8a, 0x1e9c, 0x1ec7, 0x1ee9, 0x1f14, 0x1f3f, 0x1f61, 0x1f86, + 0x1f9b, 0x1fc6, 0x1fde, 0x2003, 0x2022, 0x2053, 0x2072, 0x2099, + 0x20b7, 0x20f4, 0x2112, 0x2121, 0x213d, 0x2162, 0x2171, 0x2196, + 0x21bb, 0x21dd, 0x2202, +} // Size: 606 bytes + +var heRegionStr string = "" + // Size: 5023 bytes + "האי אסנשןאנדורהאיחוד האמירויות הערביותאפגניסטןאנטיגואה וברבודהאנגילהאלבנ" + + "יהארמניהאנטילים הולנדייםאנגולהאנטארקטיקהארגנטינהסמואה האמריקניתאוסטריהא" + + "וסטרליהארובהאיי אולנדאזרבייג׳ןבוסניה והרצגובינהברבדוסבנגלדשבלגיהבורקינה" + + " פאסובולגריהבחרייןבורונדיבניןסנט ברתולומיאוברמודהברונייבוליביההאיים הקרי" + + "ביים ההולנדייםברזילאיי בהאמהבהוטןאיי בובהבוטסוואנהבלארוסבליזקנדהאיי קוק" + + "וס (קילינג)קונגו - קינשאסההרפובליקה של מרכז אפריקהקונגו - ברזאוילשווייץ" + + "חוף השנהבאיי קוקצ׳ילהקמרוןסיןקולומביההאי קליפרטוןקוסטה ריקהקובהכף ורדהק" + + "וראסאואי חג המולדקפריסיןצ׳כיהגרמניהדייגו גרסיהג׳יבוטידנמרקדומיניקההרפוב" + + "ליקה הדומיניקניתאלג׳יריהסאוטה ומלייהאקוודוראסטוניהמצריםסהרה המערביתארית" + + "ריאהספרדאתיופיההאיחוד האירופיפינלנדפיג׳יאיי פוקלנדמיקרונזיהאיי פארוצרפת" + + "גאבוןהממלכה המאוחדתגרנדהגאורגיהגיאנה הצרפתיתגרנסיגאנהגיברלטרגרינלנדגמבי" + + "הגיניאהגוואדלופגיניאה המשווניתיווןג׳ורג׳יה הדרומית ואיי סנדוויץ׳ הדרומי" + + "יםגואטמלהגואםגיניאה-ביסאוגיאנההונג קונג - מחוז מנהלי מיוחד של סיןהאי הר" + + "ד ואיי מקדונלדהונדורסקרואטיההאיטיהונגריההאיים הקנרייםאינדונזיהאירלנדישר" + + "אלהאי מאןהודוהטריטוריה הבריטית באוקיינוס ההודיעיראקאיראןאיסלנדאיטליהג׳ר" + + "סיג׳מייקהירדןיפןקניהקירגיזסטןקמבודיהקיריבאטיקומורוסנט קיטס ונוויסקוריאה" + + " הצפוניתקוריאה הדרומיתכוויתאיי קיימןקזחסטןלאוסלבנוןסנט לוסיהליכטנשטייןסר" + + "י לנקהליבריהלסוטוליטאלוקסמבורגלטביהלובמרוקומונקומולדובהמונטנגרוסן מרטןמ" + + "דגסקראיי מרשלמקדוניהמאלימיאנמאר (בורמה)\u200eמונגוליהמקאו - מחוז מנהלי " + + "מיוחד של סיןאיי מריאנה הצפונייםמרטיניקמאוריטניהמונסראטמלטהמאוריציוסהאיי" + + "ם המלדיבייםמלאווימקסיקומלזיהמוזמביקנמיביהקלדוניה החדשהניז׳ראיי נורפוקני" + + "גריהניקרגואההולנדנורווגיהנפאלנאורוניווהניו זילנדעומאןפנמהפרופולינזיה הצ" + + "רפתיתפפואה גיניאה החדשהפיליפיניםפקיסטןפוליןסנט פייר ומיקלוןאיי פיטקרןפו" + + "ארטו ריקוהשטחים הפלסטינייםפורטוגלפאלאופרגוואיקטאראוקיאניה חיצוניתראוניו" + + "ןרומניהסרביהרוסיהרואנדהערב הסעודיתאיי שלמהאיי סיישלסודןשוודיהסינגפורסנט" + + " הלנהסלובניהסוולבארד ויאן מאייןסלובקיהסיירה לאונהסן מרינוסנגלסומליהסורינ" + + "םדרום סודןסאו טומה ופרינסיפהאל סלבדורסנט מארטןסוריהסווזילנדטריסטן דה קו" + + "נהאיי טורקס וקאיקוסצ׳אדטריטוריות דרומיות של צרפתטוגותאילנדטג׳יקיסטןטוקל" + + "אוטימור לסטהטורקמניסטןתוניסיהטונגהטורקיהטרינידד וטובגוטובלוטייוואןטנזני" + + "האוקראינהאוגנדהאיים לחוף ארצות הבריתארצות הבריתאורוגוואיאוזבקיסטןהוותיק" + + "ןסנט וינסנט והגרנדיניםונצואלהאיי הבתולה הבריטייםאיי הבתולה של ארצות הבר" + + "יתוייטנאםונואטואיי ווליס ופוטונהסמואהקוסובותימןמאיוטדרום אפריקהזמביהזימ" + + "באבווהאזור לא ידועהעולםאפריקהצפון אמריקהדרום אמריקהאוקיאניהמערב אפריקהמ" + + "רכז אמריקהמזרח אפריקהצפון אפריקהמרכז אפריקהדרום יבשת אפריקהאמריקהאמריקה" + + " הצפוניתהאיים הקריבייםמזרח אסיהדרום אסיהדרום־מזרח אסיהדרום אירופהאוסטרלא" + + "סיהמלנזיהאזור מיקרונזיהפולינזיהאסיהמרכז אסיהמערב אסיהאירופהמזרח אירופהצ" + + "פון אירופהמערב אירופהאמריקה הלטינית" + +var heRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0011, 0x001d, 0x0049, 0x0059, 0x0078, 0x0084, 0x0090, + 0x009c, 0x00bb, 0x00c7, 0x00db, 0x00eb, 0x0108, 0x0116, 0x0126, + 0x0130, 0x0141, 0x0153, 0x0174, 0x0180, 0x018c, 0x0196, 0x01ad, + 0x01bb, 0x01c7, 0x01d5, 0x01dd, 0x01f8, 0x0204, 0x0210, 0x021e, + 0x024c, 0x0256, 0x0267, 0x0271, 0x0280, 0x0292, 0x029e, 0x02a6, + 0x02ae, 0x02ce, 0x02e9, 0x0316, 0x0331, 0x033d, 0x034e, 0x035b, + 0x0365, 0x036f, 0x0375, 0x0385, 0x039c, 0x03af, 0x03b7, 0x03c4, + 0x03d2, 0x03e6, 0x03f4, 0x03fe, 0x040a, 0x041f, 0x042d, 0x0437, + // Entry 40 - 7F + 0x0447, 0x0470, 0x0480, 0x0497, 0x04a5, 0x04b3, 0x04bd, 0x04d4, + 0x04e4, 0x04ec, 0x04fa, 0x0515, 0x0521, 0x052b, 0x053e, 0x0550, + 0x055f, 0x0567, 0x0571, 0x058c, 0x0596, 0x05a4, 0x05bd, 0x05c7, + 0x05cf, 0x05dd, 0x05eb, 0x05f5, 0x0601, 0x0611, 0x062e, 0x0636, + 0x0680, 0x068e, 0x0696, 0x06ad, 0x06b7, 0x06f5, 0x071a, 0x0728, + 0x0736, 0x0740, 0x074e, 0x0767, 0x0779, 0x0785, 0x078f, 0x079c, + 0x07a4, 0x07e3, 0x07ed, 0x07f7, 0x0803, 0x080f, 0x0819, 0x0827, + 0x082f, 0x0835, 0x083d, 0x084f, 0x085d, 0x086d, 0x0879, 0x0895, + // Entry 80 - BF + 0x08b0, 0x08cb, 0x08d5, 0x08e6, 0x08f2, 0x08fa, 0x0904, 0x0915, + 0x0929, 0x0938, 0x0944, 0x094e, 0x0956, 0x0968, 0x0972, 0x0978, + 0x0982, 0x098c, 0x099a, 0x09aa, 0x09b7, 0x09c3, 0x09d2, 0x09e0, + 0x09e8, 0x0a06, 0x0a16, 0x0a4b, 0x0a6f, 0x0a7d, 0x0a8f, 0x0a9d, + 0x0aa5, 0x0ab7, 0x0ad4, 0x0ae0, 0x0aec, 0x0af6, 0x0b04, 0x0b10, + 0x0b29, 0x0b33, 0x0b46, 0x0b52, 0x0b62, 0x0b6c, 0x0b7c, 0x0b84, + 0x0b8e, 0x0b98, 0x0ba9, 0x0bb3, 0x0bbb, 0x0bc1, 0x0be0, 0x0c02, + 0x0c14, 0x0c20, 0x0c2a, 0x0c48, 0x0c5b, 0x0c70, 0x0c91, 0x0c9f, + // Entry C0 - FF + 0x0ca9, 0x0cb7, 0x0cbf, 0x0cde, 0x0cec, 0x0cf8, 0x0d02, 0x0d0c, + 0x0d18, 0x0d2d, 0x0d3c, 0x0d4d, 0x0d55, 0x0d61, 0x0d6f, 0x0d7e, + 0x0d8c, 0x0db0, 0x0dbe, 0x0dd3, 0x0de2, 0x0dea, 0x0df6, 0x0e02, + 0x0e13, 0x0e35, 0x0e46, 0x0e57, 0x0e61, 0x0e71, 0x0e8b, 0x0eab, + 0x0eb3, 0x0ee2, 0x0eea, 0x0ef6, 0x0f08, 0x0f14, 0x0f27, 0x0f3b, + 0x0f49, 0x0f53, 0x0f5f, 0x0f7a, 0x0f84, 0x0f92, 0x0f9e, 0x0fae, + 0x0fba, 0x0fe1, 0x0ff6, 0x1008, 0x101a, 0x1028, 0x1050, 0x105e, + 0x1082, 0x10b0, 0x10be, 0x10ca, 0x10ea, 0x10f4, 0x1100, 0x1108, + // Entry 100 - 13F + 0x1112, 0x1127, 0x1131, 0x1143, 0x1159, 0x1163, 0x116f, 0x1184, + 0x1199, 0x11a9, 0x11be, 0x11d3, 0x11e8, 0x11fd, 0x1212, 0x1230, + 0x123c, 0x1257, 0x1272, 0x1283, 0x1294, 0x12af, 0x12c4, 0x12d8, + 0x12e4, 0x12ff, 0x130f, 0x1317, 0x1328, 0x1339, 0x1345, 0x135a, + 0x136f, 0x1384, 0x139f, +} // Size: 606 bytes + +var hiRegionStr string = "" + // Size: 8760 bytes + "असेंशन द्वीपएंडोरासंयुक्त अरब अमीरातअफ़गानिस्तानएंटिगुआ और बरबुडाएंग्विल" + + "ाअल्बानियाआर्मेनियानीदरलैंडी ऐंटीलअंगोलाअंटार्कटिकाअर्जेंटीनाअमेरिकी स" + + "मोआऑस्ट्रियाऑस्ट्रेलियाअरूबाएलैंड द्वीपसमूहअज़रबैजानबोस्निया और हर्ज़े" + + "गोविनाबारबाडोसबांग्लादेशबेल्जियमबुर्किना फ़ासोबुल्गारियाबहरीनबुरुंडीबे" + + "निनसेंट बार्थेलेमीबरमूडाब्रूनेईबोलीवियाकैरिबियन नीदरलैंडब्राज़ीलबहामास" + + "भूटानबोवेत द्वीपबोत्स्वानाबेलारूसबेलीज़कनाडाकोकोस (कीलिंग) द्वीपसमूहका" + + "ंगो - किंशासामध्य अफ़्रीकी गणराज्यकांगो – ब्राज़ाविलस्विट्ज़रलैंडकोट ड" + + "ी आइवरकुक द्वीपसमूहचिलीकैमरूनचीनकोलंबियाक्लिपर्टन द्वीपकोस्टारिकाक्यूब" + + "ाकेप वर्डक्यूरासाओक्रिसमस द्वीपसाइप्रसचेक गणराज्यजर्मनीडिएगो गार्सियाज" + + "िबूतीडेनमार्कडोमिनिकाडोमिनिकन गणराज्यअल्जीरियासेउटा और मेलिलाइक्वाडोरए" + + "स्टोनियामिस्रपश्चिमी सहाराइरिट्रियास्पेनइथियोपियायूरोपीय संघफ़िनलैंडफ़" + + "िजीफ़ॉकलैंड द्वीपसमूहमाइक्रोनेशियाफ़ेरो द्वीपसमूहफ़्रांसगैबॉनयूनाइटेड " + + "किंगडमग्रेनाडाजॉर्जियाफ़्रेंच गयानागर्नसीघानाजिब्राल्टरग्रीनलैंडगाम्बि" + + "यागिनीग्वाडेलूपइक्वेटोरियल गिनीयूनानदक्षिण जॉर्जिया और दक्षिण सैंडविच " + + "द्वीपसमूहग्वाटेमालागुआमगिनी-बिसाउगयानाहाँग काँग (चीन विशेष प्रशासनिक क" + + "्षेत्र)हर्ड द्वीप और मैकडोनॉल्ड द्वीपसमूहहोंडूरासक्रोएशियाहैतीहंगरीकैन" + + "ेरी द्वीपसमूहइंडोनेशियाआयरलैंडइसराइलआइल ऑफ़ मैनभारतब्रिटिश हिंद महासाग" + + "रीय क्षेत्रइराकईरानआइसलैंडइटलीजर्सीजमैकाजॉर्डनजापानकेन्याकिर्गिज़स्तान" + + "कंबोडियाकिरिबातीकोमोरोससेंट किट्स और नेविसउत्तर कोरियादक्षिण कोरियाकुव" + + "ैतकेमैन द्वीपसमूहकज़ाखस्तानलाओसलेबनानसेंट लूसियालिचेंस्टीनश्रीलंकालाइब" + + "ेरियालेसोथोलिथुआनियालग्ज़मबर्गलातवियालीबियामोरक्कोमोनाकोमॉल्डोवामोंटेन" + + "ेग्रोसेंट मार्टिनमेडागास्करमार्शल द्वीपसमूहमैसिडोनियामालीम्यांमार (बर्" + + "मा)मंगोलियामकाऊ (विशेष प्रशासनिक क्षेत्र चीन)उत्तरी मारियाना द्वीपसमूह" + + "मार्टीनिकमॉरिटानियामोंटसेरातमाल्टामॉरिशसमालदीवमलावीमैक्सिकोमलेशियामोज़" + + "ांबिकनामीबियान्यू कैलेडोनियानाइजरनॉरफ़ॉक द्वीपनाइजीरियानिकारागुआनीदरलै" + + "ंडनॉर्वेनेपालनाउरुनीयून्यूज़ीलैंडओमानपनामापेरूफ़्रेंच पोलिनेशियापापुआ " + + "न्यू गिनीफ़िलिपींसपाकिस्तानपोलैंडसेंट पिएरे और मिक्वेलानपिटकैर्न द्वीप" + + "समूहपोर्टो रिकोफ़िलिस्तीनी क्षेत्रपुर्तगालपलाऊपेराग्वेक़तरआउटलाइंग ओशि" + + "नियारियूनियनरोमानियासर्बियारूसरवांडासऊदी अरबसोलोमन द्वीपसमूहसेशेल्ससूड" + + "ानस्वीडनसिंगापुरसेंट हेलेनास्लोवेनियास्वालबार्ड और जान मायेनस्लोवाकिया" + + "सिएरा लियोनसैन मेरीनोसेनेगलसोमालियासूरीनामदक्षिण सूडानसाओ टोम और प्रिं" + + "सिपेअल सल्वाडोरसिंट मार्टिनसीरियास्वाज़ीलैंडत्रिस्टान डा कुनातुर्क और " + + "कैकोज़ द्वीपसमूहचाडफ़्रांसीसी दक्षिणी क्षेत्रटोगोथाईलैंडताजिकिस्तानतोक" + + "ेलाउतिमोर-लेस्ततुर्कमेनिस्तानट्यूनीशियाटोंगातुर्कीत्रिनिदाद और टोबैगोत" + + "ुवालूताइवानतंज़ानियायूक्रेनयुगांडायू.एस. आउटलाइंग द्वीपसमूहसंयुक्त राज" + + "्यउरूग्वेउज़्बेकिस्तानवेटिकन सिटीसेंट विंसेंट और ग्रेनाडाइंसवेनेज़ुएला" + + "ब्रिटिश वर्जिन द्वीपसमूहयू.एस. वर्जिन द्वीपसमूहवियतनामवनुआतूवालिस और फ" + + "़्यूचूनासमोआकोसोवोयमनमायोतेदक्षिण अफ़्रीकाज़ाम्बियाज़िम्बाब्वेअज्ञात क" + + "्षेत्रविश्वअफ़्रीकाउत्तर अमेरिकादक्षिण अमेरिकाओशिआनियापश्चिमी अफ़्रीका" + + "मध्य अमेरिकापूर्वी अफ़्रीकाउत्तरी अफ़्रीकामध्य अफ़्रीकादक्षिणी अफ़्रीक" + + "ाअमेरिकाज़उत्तरी अमेरिकाकैरिबियनपूर्वी एशियादक्षिणी एशियादक्षिण-पूर्व " + + "एशियादक्षिणी यूरोपऑस्ट्रेलेशियामेलानेशियामाइक्रोनेशियाई क्षेत्रपोलीनेश" + + "ियाएशियामध्य एशियापश्चिमी एशियायूरोपपूर्वी यूरोपउत्तरी यूरोपपश्चिमी यू" + + "रोपलैटिन अमेरिका" + +var hiRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0022, 0x0034, 0x0066, 0x008a, 0x00b9, 0x00d1, 0x00ec, + 0x0107, 0x0132, 0x0144, 0x0165, 0x0183, 0x01a5, 0x01c0, 0x01e1, + 0x01f0, 0x021b, 0x0236, 0x027a, 0x0292, 0x02b0, 0x02c8, 0x02f0, + 0x030e, 0x031d, 0x0332, 0x0341, 0x036c, 0x037e, 0x0393, 0x03ab, + 0x03dc, 0x03f4, 0x0406, 0x0415, 0x0434, 0x0452, 0x0467, 0x0479, + 0x0488, 0x04c8, 0x04ef, 0x052a, 0x055c, 0x0583, 0x05a0, 0x05c5, + 0x05d1, 0x05e3, 0x05ec, 0x0604, 0x062f, 0x064d, 0x065f, 0x0675, + 0x0690, 0x06b5, 0x06ca, 0x06e9, 0x06fb, 0x0723, 0x0735, 0x074d, + // Entry 40 - 7F + 0x0765, 0x0793, 0x07ae, 0x07d7, 0x07ef, 0x080a, 0x0819, 0x083e, + 0x0859, 0x0868, 0x0883, 0x08a2, 0x08ba, 0x08c9, 0x08fd, 0x0924, + 0x094f, 0x0964, 0x0973, 0x099e, 0x09b6, 0x09ce, 0x09f3, 0x0a05, + 0x0a11, 0x0a2f, 0x0a4a, 0x0a62, 0x0a6e, 0x0a89, 0x0ab7, 0x0ac6, + 0x0b3d, 0x0b5b, 0x0b67, 0x0b83, 0x0b92, 0x0bf9, 0x0c57, 0x0c6f, + 0x0c8a, 0x0c96, 0x0ca5, 0x0cd3, 0x0cf1, 0x0d06, 0x0d18, 0x0d35, + 0x0d41, 0x0d95, 0x0da1, 0x0dad, 0x0dc2, 0x0dce, 0x0ddd, 0x0dec, + 0x0dfe, 0x0e0d, 0x0e1f, 0x0e46, 0x0e5e, 0x0e76, 0x0e8b, 0x0ebe, + // Entry 80 - BF + 0x0ee0, 0x0f05, 0x0f14, 0x0f3f, 0x0f5d, 0x0f69, 0x0f7b, 0x0f9a, + 0x0fb8, 0x0fd0, 0x0feb, 0x0ffd, 0x1018, 0x1036, 0x104b, 0x105d, + 0x1072, 0x1084, 0x109c, 0x10bd, 0x10df, 0x10fd, 0x112b, 0x1149, + 0x1155, 0x117f, 0x1197, 0x11f1, 0x1238, 0x1253, 0x1271, 0x128c, + 0x129e, 0x12b0, 0x12c2, 0x12d1, 0x12e9, 0x12fe, 0x1319, 0x1331, + 0x135c, 0x136b, 0x1390, 0x13ab, 0x13c6, 0x13de, 0x13f0, 0x13ff, + 0x140e, 0x141a, 0x143b, 0x1447, 0x1456, 0x1462, 0x1496, 0x14bf, + 0x14da, 0x14f5, 0x1507, 0x1546, 0x157a, 0x1599, 0x15d0, 0x15e8, + // Entry C0 - FF + 0x15f4, 0x160c, 0x1618, 0x1646, 0x165e, 0x1676, 0x168b, 0x1694, + 0x16a6, 0x16bc, 0x16ea, 0x16ff, 0x170e, 0x1720, 0x1738, 0x1757, + 0x1775, 0x17b4, 0x17d2, 0x17f1, 0x180d, 0x181f, 0x1837, 0x184c, + 0x186e, 0x18a4, 0x18c3, 0x18e5, 0x18f7, 0x1918, 0x1947, 0x198c, + 0x1995, 0x19df, 0x19eb, 0x1a00, 0x1a21, 0x1a36, 0x1a55, 0x1a7f, + 0x1a9d, 0x1aac, 0x1abe, 0x1af3, 0x1b05, 0x1b17, 0x1b32, 0x1b47, + 0x1b5c, 0x1b9f, 0x1bc4, 0x1bd9, 0x1c00, 0x1c1f, 0x1c6a, 0x1c88, + 0x1ccc, 0x1d09, 0x1d1e, 0x1d30, 0x1d62, 0x1d6e, 0x1d80, 0x1d89, + // Entry 100 - 13F + 0x1d9b, 0x1dc6, 0x1de1, 0x1e02, 0x1e2a, 0x1e39, 0x1e51, 0x1e76, + 0x1e9e, 0x1eb6, 0x1ee4, 0x1f06, 0x1f31, 0x1f5c, 0x1f81, 0x1faf, + 0x1fca, 0x1ff2, 0x200a, 0x202c, 0x2051, 0x2083, 0x20a8, 0x20cf, + 0x20ed, 0x212d, 0x214b, 0x215a, 0x2176, 0x219b, 0x21aa, 0x21cc, + 0x21ee, 0x2213, 0x2238, +} // Size: 606 bytes + +var hrRegionStr string = "" + // Size: 3113 bytes + "Otok AscensionAndoraUjedinjeni Arapski EmiratiAfganistanAntigua i Barbud" + + "aAngvilaAlbanijaArmenijaNizozemski AntiliAngolaAntarktikaArgentinaAmerič" + + "ka SamoaAustrijaAustralijaArubaOtoci AlandAzerbajdžanBosna i Hercegovina" + + "BarbadosBangladešBelgijaBurkina FasoBugarskaBahreinBurundiBeninSveti Bar" + + "tolomejBermudaBrunejBolivijaKaripski otoci NizozemskeBrazilBahamiButanOt" + + "ok BouvetBocvanaBjelorusijaBelizeKanadaKokosovi (Keeling) OtociKongo - K" + + "inshasaSrednjoafrička RepublikaKongo - BrazzavilleŠvicarskaObala Bjeloko" + + "stiCookovi OtociČileKamerunKinaKolumbijaOtok ClippertonKostarikaKubaZele" + + "nortska RepublikaCuraçaoBožićni OtokCiparČeška RepublikaNjemačkaDiego Ga" + + "rciaDžibutiDanskaDominikaDominikanska RepublikaAlžirCeuta i MelillaEkvad" + + "orEstonijaEgipatZapadna SaharaEritrejaŠpanjolskaEtiopijaEuropska unijaFi" + + "nskaFidžiFalklandski OtociMikronezijaFarski OtociFrancuskaGabonVelika Br" + + "itanijaGrenadaGruzijaFrancuska GvajanaGuernseyGanaGibraltarGrenlandGambi" + + "jaGvinejaGuadalupaEkvatorska GvinejaGrčkaJužna Georgija i Južni Sendvičk" + + "i OtociGvatemalaGuamGvineja BisauGvajanaHong Kong PUP KinaOtoci Heard i " + + "McDonaldHondurasHrvatskaHaitiMađarskaKanarski OtociIndonezijaIrskaIzrael" + + "Otok ManIndijaBritanski Indijskooceanski TeritorijIrakIranIslandItalijaJ" + + "erseyJamajkaJordanJapanKenijaKirgistanKambodžaKiribatiKomoriSveti Kristo" + + "for i NevisSjeverna KorejaJužna KorejaKuvajtKajmanski OtociKazahstanLaos" + + "LibanonSveta LucijaLihtenštajnŠri LankaLiberijaLesotoLitvaLuksemburgLatv" + + "ijaLibijaMarokoMonakoMoldavijaCrna GoraSveti MartinMadagaskarMaršalovi O" + + "tociMakedonijaMaliMijanmar (Burma)MongolijaMakao PUP KinaSjeverni Marija" + + "nski OtociMartiniqueMauritanijaMontserratMaltaMauricijusMaldiviMalaviMek" + + "sikoMalezijaMozambikNamibijaNova KaledonijaNigerOtok NorfolkNigerijaNika" + + "ragvaNizozemskaNorveškaNepalNauruNiueNovi ZelandOmanPanamaPeruFrancuska " + + "PolinezijaPapua Nova GvinejaFilipiniPakistanPoljskaSveti Petar i Mikelon" + + "Otoci PitcairnPortorikoPalestinsko PodručjePortugalPalauParagvajKatarOst" + + "ala oceanijaReunionRumunjskaSrbijaRusijaRuandaSaudijska ArabijaSalomonsk" + + "i OtociSejšeliSudanŠvedskaSingapurSveta HelenaSlovenijaSvalbard i Jan Ma" + + "yenSlovačkaSijera LeoneSan MarinoSenegalSomalijaSurinamJužni SudanSveti " + + "Toma i PrincipSalvadorSint MaartenSirijaSvaziTristan da CunhaOtoci Turks" + + " i CaicosČadFrancuske Južne i Antarktičke ZemljeTogoTajlandTadžikistanTo" + + "kelauIstočni TimorTurkmenistanTunisTongaTurskaTrinidad i TobagoTuvaluTaj" + + "vanTanzanijaUkrajinaUgandaMali udaljeni otoci SAD-aSjedinjene Američke D" + + "ržaveUrugvajUzbekistanSveta StolicaSveti Vincent i GrenadiniVenezuelaBri" + + "tanski Djevičanski OtociAmerički Djevičanski OtociVijetnamVanuatuWallis " + + "i FutunaSamoaKosovoJemenMayotteJužnoafrička RepublikaZambijaZimbabvenepo" + + "znato područjeSvijetAfrikaSjevernoamerički kontinentJužna AmerikaOceanij" + + "aZapadna AfrikaCentralna AmerikaIstočna AfrikaSjeverna AfrikaSredišnja A" + + "frikaJužna AfrikaAmerikeSjeverna AmerikaKaribiIstočna AzijaJužna AzijaJu" + + "goistočna AzijaJužna EuropaAustralazijaMelanezijaMikronezijsko područjeP" + + "olinezijaAzijaSrednja AzijaZapadna AzijaEuropaIstočna EuropaSjeverna Eur" + + "opaZapadna EuropaLatinska Amerika" + +var hrRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x000e, 0x0014, 0x002e, 0x0038, 0x0049, 0x0050, 0x0058, + 0x0060, 0x0071, 0x0077, 0x0081, 0x008a, 0x0099, 0x00a1, 0x00ab, + 0x00b0, 0x00bb, 0x00c7, 0x00da, 0x00e2, 0x00ec, 0x00f3, 0x00ff, + 0x0107, 0x010e, 0x0115, 0x011a, 0x012a, 0x0131, 0x0137, 0x013f, + 0x0158, 0x015e, 0x0164, 0x0169, 0x0174, 0x017b, 0x0186, 0x018c, + 0x0192, 0x01aa, 0x01ba, 0x01d3, 0x01e6, 0x01f0, 0x0200, 0x020d, + 0x0212, 0x0219, 0x021d, 0x0226, 0x0235, 0x023e, 0x0242, 0x0257, + 0x025f, 0x026d, 0x0272, 0x0283, 0x028c, 0x0298, 0x02a0, 0x02a6, + // Entry 40 - 7F + 0x02ae, 0x02c4, 0x02ca, 0x02d9, 0x02e0, 0x02e8, 0x02ee, 0x02fc, + 0x0304, 0x030f, 0x0317, 0x0325, 0x032b, 0x0331, 0x0342, 0x034d, + 0x0359, 0x0362, 0x0367, 0x0377, 0x037e, 0x0385, 0x0396, 0x039e, + 0x03a2, 0x03ab, 0x03b3, 0x03ba, 0x03c1, 0x03ca, 0x03dc, 0x03e2, + 0x040b, 0x0414, 0x0418, 0x0425, 0x042c, 0x043e, 0x0454, 0x045c, + 0x0464, 0x0469, 0x0472, 0x0480, 0x048a, 0x048f, 0x0495, 0x049d, + 0x04a3, 0x04c7, 0x04cb, 0x04cf, 0x04d5, 0x04dc, 0x04e2, 0x04e9, + 0x04ef, 0x04f4, 0x04fa, 0x0503, 0x050c, 0x0514, 0x051a, 0x0531, + // Entry 80 - BF + 0x0540, 0x054d, 0x0553, 0x0562, 0x056b, 0x056f, 0x0576, 0x0582, + 0x058e, 0x0598, 0x05a0, 0x05a6, 0x05ab, 0x05b5, 0x05bc, 0x05c2, + 0x05c8, 0x05ce, 0x05d7, 0x05e0, 0x05ec, 0x05f6, 0x0606, 0x0610, + 0x0614, 0x0624, 0x062d, 0x063b, 0x0654, 0x065e, 0x0669, 0x0673, + 0x0678, 0x0682, 0x0689, 0x068f, 0x0696, 0x069e, 0x06a6, 0x06ae, + 0x06bd, 0x06c2, 0x06ce, 0x06d6, 0x06df, 0x06e9, 0x06f2, 0x06f7, + 0x06fc, 0x0700, 0x070b, 0x070f, 0x0715, 0x0719, 0x072d, 0x073f, + 0x0747, 0x074f, 0x0756, 0x076b, 0x0779, 0x0782, 0x0797, 0x079f, + // Entry C0 - FF + 0x07a4, 0x07ac, 0x07b1, 0x07c0, 0x07c7, 0x07d0, 0x07d6, 0x07dc, + 0x07e2, 0x07f3, 0x0803, 0x080b, 0x0810, 0x0818, 0x0820, 0x082c, + 0x0835, 0x0849, 0x0852, 0x085e, 0x0868, 0x086f, 0x0877, 0x087e, + 0x088a, 0x089e, 0x08a6, 0x08b2, 0x08b8, 0x08bd, 0x08cd, 0x08e1, + 0x08e5, 0x090b, 0x090f, 0x0916, 0x0922, 0x0929, 0x0937, 0x0943, + 0x0948, 0x094d, 0x0953, 0x0964, 0x096a, 0x0970, 0x0979, 0x0981, + 0x0987, 0x09a0, 0x09bc, 0x09c3, 0x09cd, 0x09da, 0x09f3, 0x09fc, + 0x0a18, 0x0a34, 0x0a3c, 0x0a43, 0x0a52, 0x0a57, 0x0a5d, 0x0a62, + // Entry 100 - 13F + 0x0a69, 0x0a81, 0x0a88, 0x0a90, 0x0aa3, 0x0aa9, 0x0aaf, 0x0aca, + 0x0ad8, 0x0ae0, 0x0aee, 0x0aff, 0x0b0e, 0x0b1d, 0x0b2e, 0x0b3b, + 0x0b42, 0x0b52, 0x0b58, 0x0b66, 0x0b72, 0x0b84, 0x0b91, 0x0b9d, + 0x0ba7, 0x0bbe, 0x0bc8, 0x0bcd, 0x0bda, 0x0be7, 0x0bed, 0x0bfc, + 0x0c0b, 0x0c19, 0x0c29, +} // Size: 606 bytes + +var huRegionStr string = "" + // Size: 3354 bytes + "Ascension-szigetAndorraEgyesült Arab EmírségekAfganisztánAntigua és Barb" + + "udaAnguillaAlbániaÖrményországHolland AntillákAngolaAntarktiszArgentínaA" + + "merikai SzamoaAusztriaAusztráliaArubaÅland-szigetekAzerbajdzsánBosznia-H" + + "ercegovinaBarbadosBangladesBelgiumBurkina FasoBulgáriaBahreinBurundiBeni" + + "nSaint-BarthélemyBermudaBruneiBolíviaHolland Karib-térségBrazíliaBahama-" + + "szigetekBhutánBouvet-szigetBotswanaFehéroroszországBelizeKanadaKókusz-sz" + + "igetekKongó - KinshasaKözép-afrikai KöztársaságKongó - BrazzavilleSvájcE" + + "lefántcsontpartCook-szigetekChileKamerunKínaKolumbiaClipperton-szigetCos" + + "ta RicaKubaZöld-foki KöztársaságCuraçaoKarácsony-szigetCiprusCsehországN" + + "émetországDiego GarciaDzsibutiDániaDominikaDominikai KöztársaságAlgéria" + + "Ceuta és MelillaEcuadorÉsztországEgyiptomNyugat-SzaharaEritreaSpanyolors" + + "zágEtiópiaEurópai UnióFinnországFidzsiFalkland-szigetekMikronéziaFeröer-" + + "szigetekFranciaországGabonEgyesült KirályságGrenadaGrúziaFrancia GuyanaG" + + "uernseyGhánaGibraltárGrönlandGambiaGuineaGuadeloupeEgyenlítői-GuineaGörö" + + "gországDéli-Georgia és Déli-Sandwich-szigetekGuatemalaGuamBissau-GuineaG" + + "uyanaHongkong SAR KínaHeard-sziget és McDonald-szigetekHondurasHorvátors" + + "zágHaitiMagyarországKanári-szigetekIndonéziaÍrországIzraelMan-szigetIndi" + + "aBrit Indiai-óceáni TerületIrakIránIzlandOlaszországJerseyJamaicaJordáni" + + "aJapánKenyaKirgizisztánKambodzsaKiribatiComore-szigetekSaint Kitts és Ne" + + "visÉszak-KoreaDél-KoreaKuvaitKajmán-szigetekKazahsztánLaoszLibanonSanta " + + "LuciaLiechtensteinSrí LankaLibériaLesothoLitvániaLuxemburgLettországLíbi" + + "aMarokkóMonacoMoldovaMontenegróSaint MartinMadagaszkárMarshall-szigetekM" + + "acedóniaMaliMianmar (Burma)MongóliaMakaó SAR KínaÉszaki Mariana-szigetek" + + "MartiniqueMauritániaMontserratMáltaMauritiusMaldív-szigetekMalawiMexikóM" + + "alajziaMozambikNamíbiaÚj-KaledóniaNigerNorfolk-szigetNigériaNicaraguaHol" + + "landiaNorvégiaNepálNauruNiueÚj-ZélandOmánPanamaPeruFrancia PolinéziaPápu" + + "a Új-GuineaFülöp-szigetekPakisztánLengyelországSaint Pierre és MiquelonP" + + "itcairn-szigetekPuerto RicoPalesztin TerületPortugáliaPalauParaguayKatar" + + "Külső-ÓceániaReunionRomániaSzerbiaOroszországRuandaSzaúd-ArábiaSalamon-s" + + "zigetekSeychelle-szigetekSzudánSvédországSzingapúrSzent IlonaSzlovéniaSp" + + "itzbergák és Jan Mayen-szigetekSzlovákiaSierra LeoneSan MarinoSzenegálSz" + + "omáliaSurinameDél-SzudánSao Tomé és PríncipeSalvadorSint MaartenSzíriaSz" + + "váziföldTristan da CunhaTurks- és Caicos-szigetekCsádFrancia Déli Terüle" + + "tekTogoThaiföldTádzsikisztánTokelauKelet-TimorTürkmenisztánTunéziaTongaT" + + "örökországTrinidad és TobagoTuvaluTajvanTanzániaUkrajnaUgandaAmerikai C" + + "sendes-óceáni SzigetekEgyesült ÁllamokUruguayÜzbegisztánVatikánSaint Vin" + + "cent és a Grenadine-szigetekVenezuelaBrit Virgin-szigetekAmerikai Virgin" + + "-szigetekVietnamVanuatuWallis- és Futuna-szigetekSzamoaKoszovóJemenMayot" + + "teDél-afrikai KöztársaságZambiaZimbabweIsmeretlen körzetVilágAfrikaÉszak" + + "-AmerikaDél-AmerikaÓceániaNyugat-AfrikaKözép-AmerikaKelet-AfrikaÉszak-Af" + + "rikaKözép-AfrikaAfrika déli részeAmerikaAmerika északi részeKarib-térség" + + "Kelet-ÁzsiaDél-ÁzsiaDélkelet-ÁzsiaDél-EurópaAusztrálázsiaMelanéziaMikron" + + "éziai régióPolinéziaÁzsiaKözép-ÁzsiaNyugat-ÁzsiaEurópaKelet-EurópaÉszak" + + "-EurópaNyugat-EurópaLatin-Amerika" + +var huRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0010, 0x0017, 0x0031, 0x003d, 0x0050, 0x0058, 0x0060, + 0x006f, 0x0080, 0x0086, 0x0090, 0x009a, 0x00a9, 0x00b1, 0x00bc, + 0x00c1, 0x00d0, 0x00dd, 0x00f0, 0x00f8, 0x0101, 0x0108, 0x0114, + 0x011d, 0x0124, 0x012b, 0x0130, 0x0141, 0x0148, 0x014e, 0x0156, + 0x016c, 0x0175, 0x0184, 0x018b, 0x0198, 0x01a0, 0x01b2, 0x01b8, + 0x01be, 0x01ce, 0x01df, 0x01fd, 0x0211, 0x0217, 0x0228, 0x0235, + 0x023a, 0x0241, 0x0246, 0x024e, 0x025f, 0x0269, 0x026d, 0x0286, + 0x028e, 0x029f, 0x02a5, 0x02b0, 0x02bd, 0x02c9, 0x02d1, 0x02d7, + // Entry 40 - 7F + 0x02df, 0x02f7, 0x02ff, 0x0310, 0x0317, 0x0323, 0x032b, 0x0339, + 0x0340, 0x034e, 0x0356, 0x0364, 0x036f, 0x0375, 0x0386, 0x0391, + 0x03a1, 0x03af, 0x03b4, 0x03c9, 0x03d0, 0x03d7, 0x03e5, 0x03ed, + 0x03f3, 0x03fd, 0x0406, 0x040c, 0x0412, 0x041c, 0x042f, 0x043d, + 0x0466, 0x046f, 0x0473, 0x0480, 0x0486, 0x0498, 0x04ba, 0x04c2, + 0x04d0, 0x04d5, 0x04e2, 0x04f2, 0x04fc, 0x0506, 0x050c, 0x0516, + 0x051b, 0x0538, 0x053c, 0x0541, 0x0547, 0x0553, 0x0559, 0x0560, + 0x0569, 0x056f, 0x0574, 0x0581, 0x058a, 0x0592, 0x05a1, 0x05b6, + // Entry 80 - BF + 0x05c2, 0x05cc, 0x05d2, 0x05e2, 0x05ed, 0x05f2, 0x05f9, 0x0604, + 0x0611, 0x061b, 0x0623, 0x062a, 0x0633, 0x063c, 0x0647, 0x064d, + 0x0655, 0x065b, 0x0662, 0x066d, 0x0679, 0x0685, 0x0696, 0x06a0, + 0x06a4, 0x06b3, 0x06bc, 0x06cc, 0x06e4, 0x06ee, 0x06f9, 0x0703, + 0x0709, 0x0712, 0x0722, 0x0728, 0x072f, 0x0737, 0x073f, 0x0747, + 0x0755, 0x075a, 0x0768, 0x0770, 0x0779, 0x0782, 0x078b, 0x0791, + 0x0796, 0x079a, 0x07a5, 0x07aa, 0x07b0, 0x07b4, 0x07c6, 0x07d7, + 0x07e7, 0x07f1, 0x07ff, 0x0818, 0x0829, 0x0834, 0x0846, 0x0851, + // Entry C0 - FF + 0x0856, 0x085e, 0x0863, 0x0874, 0x087b, 0x0883, 0x088a, 0x0896, + 0x089c, 0x08aa, 0x08ba, 0x08cc, 0x08d3, 0x08df, 0x08e9, 0x08f4, + 0x08fe, 0x0921, 0x092b, 0x0937, 0x0941, 0x094a, 0x0953, 0x095b, + 0x0967, 0x097e, 0x0986, 0x0992, 0x0999, 0x09a5, 0x09b5, 0x09cf, + 0x09d4, 0x09ec, 0x09f0, 0x09f9, 0x0a08, 0x0a0f, 0x0a1a, 0x0a29, + 0x0a31, 0x0a36, 0x0a44, 0x0a57, 0x0a5d, 0x0a63, 0x0a6c, 0x0a73, + 0x0a79, 0x0a9b, 0x0aad, 0x0ab4, 0x0ac1, 0x0ac9, 0x0aef, 0x0af8, + 0x0b0c, 0x0b24, 0x0b2b, 0x0b32, 0x0b4d, 0x0b53, 0x0b5b, 0x0b60, + // Entry 100 - 13F + 0x0b67, 0x0b82, 0x0b88, 0x0b90, 0x0ba2, 0x0ba8, 0x0bae, 0x0bbc, + 0x0bc8, 0x0bd1, 0x0bde, 0x0bed, 0x0bf9, 0x0c06, 0x0c14, 0x0c27, + 0x0c2e, 0x0c44, 0x0c52, 0x0c5e, 0x0c69, 0x0c79, 0x0c85, 0x0c94, + 0x0c9e, 0x0cb2, 0x0cbc, 0x0cc2, 0x0cd0, 0x0cdd, 0x0ce4, 0x0cf1, + 0x0cff, 0x0d0d, 0x0d1a, +} // Size: 606 bytes + +var hyRegionStr string = "" + // Size: 6292 bytes + "Համբարձման կղզիԱնդորրաԱրաբական Միացյալ ԷմիրություններԱֆղանստանԱնտիգուա և" + + " ԲարբուդաԱնգիլյաԱլբանիաՀայաստանԱնգոլաԱնտարկտիդաԱրգենտինաԱմերիկյան ՍամոաԱ" + + "վստրիաԱվստրալիաԱրուբաԱլանդյան կղզիներԱդրբեջանԲոսնիա և ՀերցեգովինաԲարբադ" + + "ոսԲանգլադեշԲելգիաԲուրկինա ՖասոԲուլղարիաԲահրեյնԲուրունդիԲենինՍուրբ Բարդո" + + "ւղիմեոսԲերմուդյան կղզիներԲրունեյԲոլիվիաԿարիբյան ՆիդեռլանդներԲրազիլիաԲահ" + + "ամներԲութանԲուվե կղզիԲոթսվանաԲելառուսԲելիզԿանադաԿոկոսյան (Քիլինգ) կղզին" + + "երԿոնգո - ԿինշասաԿենտրոնական Աֆրիկյան ՀանրապետությունԿոնգո - ԲրազավիլՇվ" + + "եյցարիաԿոտ Դ՛իվուարԿուկի կղզիներՉիլիԿամերունՉինաստանԿոլումբիաՔլիփերթոն " + + "կղզիԿոստա ՌիկաԿուբաԿաբո ՎերդեԿյուրասաոԾննդյան կղզիԿիպրոսՉեխիաԳերմանիաԴի" + + "եգո ԳարսիաՋիբուտիԴանիաԴոմինիկաԴոմինիկյան ՀանրապետությունԱլժիրՍեուտա և Մ" + + "ելիլյաԷկվադորԷստոնիաԵգիպտոսԱրևմտյան ՍահարաԷրիտրեաԻսպանիաԵթովպիաԵվրոպակա" + + "ն ՄիությունՖինլանդիաՖիջիՖոլքլենդյան կղզիներՄիկրոնեզիաՖարերյան կղզիներՖր" + + "անսիաԳաբոնՄեծ ԲրիտանիաԳրենադաՎրաստանՖրանսիական ԳվիանաԳերնսիԳանաՋիբրալթա" + + "րԳրենլանդիաԳամբիաԳվինեաԳվադելուպաՀասարակածային ԳվինեաՀունաստանՀարավային" + + " Ջորջիա և Հարավային Սենդվիչյան կղզիներԳվատեմալաԳուամԳվինեա-ԲիսաուԳայանաՀ" + + "ոնկոնգի ՀՎՇՀերդ կղզի և ՄակԴոնալդի կղզիներՀոնդուրասԽորվաթիաՀաիթիՀունգարի" + + "աԿանարյան կղզիներԻնդոնեզիաԻռլանդիաԻսրայելՄեն կղզիՀնդկաստանՀնդկական Օվկի" + + "անոսում Բրիտանական ՏարածքԻրաքԻրանԻսլանդիաԻտալիաՋերսիՃամայկաՀորդանանՃապո" + + "նիաՔենիաՂրղզստանԿամբոջաԿիրիբատիԿոմորյան կղզիներՍենթ Քիթս և ՆեվիսՀյուսիս" + + "ային ԿորեաՀարավային ԿորեաՔուվեյթԿայմանյան կղզիներՂազախստանԼաոսԼիբանանՍե" + + "նթ ԼուսիաԼիխտենշտեյնՇրի ԼանկաԼիբերիաԼեսոտոԼիտվաԼյուքսեմբուրգԼատվիաԼիբիա" + + "ՄարոկկոՄոնակոՄոլդովաՉեռնոգորիաՍեն ՄարտենՄադագասկարՄարշալյան կղզիներՄակե" + + "դոնիաՄալիՄյանմա (Բիրմա)ՄոնղոլիաՉինաստանի Մակաո ՀՎՇՀյուսիսային Մարիանյան" + + " կղզիներՄարտինիկաՄավրիտանիաՄոնտսերատՄալթաՄավրիկիոսՄալդիվներՄալավիՄեքսիկա" + + "ՄալայզիաՄոզամբիկՆամիբիաՆոր ԿալեդոնիաՆիգերՆորֆոլկ կղզիՆիգերիաՆիկարագուաՆ" + + "իդեռլանդներՆորվեգիաՆեպալՆաուրուՆիուեՆոր ԶելանդիաՕմանՊանամաՊերուՖրանսիակ" + + "ան ՊոլինեզիաՊապուա Նոր ԳվինեաՖիլիպիններՊակիստանԼեհաստանՍեն Պիեռ և Միքել" + + "ոնՊիտկեռն կղզիներՊուերտո ՌիկոՊաղեստինյան տարածքներՊորտուգալիաՊալաուՊարա" + + "գվայԿատարԱրտաքին ՕվկիանիաՌեյունիոնՌումինիաՍերբիաՌուսաստանՌուանդաՍաուդյա" + + "ն ԱրաբիաՍողոմոնյան կղզիներՍեյշելյան կղզիներՍուդանՇվեդիաՍինգապուրՍուրբ Հ" + + "եղինեի կղզիՍլովենիաՍվալբարդ և Յան ՄայենՍլովակիաՍիերա ԼեոնեՍան ՄարինոՍեն" + + "եգալՍոմալիՍուրինամՀարավային ՍուդանՍան Տոմե և ՓրինսիփիՍալվադորՍինտ Մարտե" + + "նՍիրիաՍվազիլենդՏրիստան դա ԿունյաԹըրքս և Կայկոս կղզիներՉադՖրանսիական Հար" + + "ավային ՏարածքներՏոգոԹաիլանդՏաջիկստանՏոկելաուԹիմոր-ԼեստեԹուրքմենստանԹուն" + + "իսՏոնգաԹուրքիաՏրինիդադ և ՏոբագոՏուվալուԹայվանԹանզանիաՈւկրաինաՈւգանդաԱրտ" + + "աքին կղզիներ (ԱՄՆ)Ամերիկայի Միացյալ ՆահանգներՈւրուգվայՈւզբեկստանՎատիկան" + + " քաղաք-պետությունՍենթ Վինսենթ և ԳրենադիններՎենեսուելաԲրիտանական Վիրջինյա" + + "ն կղզիներԱմերիկյան Վիրջինյան կղզիներՎիետնամՎանուատուՈւոլիս և ՖուտունաՍա" + + "մոաԿոսովոԵմենՄայոտՀարավաֆրիկյան ՀանրապետությունԶամբիաԶիմբաբվեԱնհայտ տար" + + "ածաշրջանԱշխարհԱֆրիկաՀյուսիսային ԱմերիկաՀարավային ԱմերիկաՕվկիանիաԱրևմտյա" + + "ն ԱֆրիկաԿենտրոնական ԱմերիկաԱրևելյան ԱֆրիկաՀյուսիսային ԱֆրիկաԿենտրոնական" + + " ԱֆրիկաՀարավային ԱֆրիկաԱմերիկաՀյուսիսային Ամերիկա - ԱՄՆ և ԿանադաԿարիբյան" + + " կղզիներԱրևելյան ԱսիաՀարավային ԱսիաՀարավ-Արևելյան ԱսիաՀարավային ԵվրոպաԱվ" + + "ստրալիա և Նոր ԶելանդիաՄելանեզիաՄիկրոնեզիայի տարածաշրջանՊոլինեզիաԱսիաԿեն" + + "տրոնական ԱսիաԱրևմտյան ԱսիաԵվրոպաԱրևելյան ԵվրոպաՀյուսիսային ԵվրոպաԱրևմտյ" + + "ան ԵվրոպաԼատինական Ամերիկա" + +var hyRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x001d, 0x002b, 0x0067, 0x0079, 0x009d, 0x00ab, 0x00b9, + 0x00c9, 0x00c9, 0x00d5, 0x00e9, 0x00fb, 0x0118, 0x0126, 0x0138, + 0x0144, 0x0163, 0x0173, 0x0199, 0x01a9, 0x01bb, 0x01c7, 0x01e0, + 0x01f2, 0x0200, 0x0212, 0x021c, 0x023f, 0x0262, 0x0270, 0x027e, + 0x02a7, 0x02b7, 0x02c7, 0x02d3, 0x02e6, 0x02f6, 0x0306, 0x0310, + 0x031c, 0x034a, 0x0365, 0x03ab, 0x03c8, 0x03da, 0x03f1, 0x040a, + 0x0412, 0x0422, 0x0432, 0x0444, 0x045f, 0x0472, 0x047c, 0x048f, + 0x04a1, 0x04b8, 0x04c4, 0x04ce, 0x04de, 0x04f5, 0x0503, 0x050d, + // Entry 40 - 7F + 0x051d, 0x0550, 0x055a, 0x0578, 0x0586, 0x0594, 0x05a2, 0x05bf, + 0x05cd, 0x05db, 0x05e9, 0x060e, 0x0620, 0x0628, 0x064d, 0x0661, + 0x0680, 0x068e, 0x0698, 0x06af, 0x06bd, 0x06cb, 0x06ec, 0x06f8, + 0x0700, 0x0712, 0x0726, 0x0732, 0x073e, 0x0752, 0x0779, 0x078b, + 0x07e4, 0x07f6, 0x0800, 0x0819, 0x0825, 0x083c, 0x0874, 0x0886, + 0x0896, 0x08a0, 0x08b2, 0x08d1, 0x08e3, 0x08f3, 0x0901, 0x0910, + 0x0922, 0x096b, 0x0973, 0x097b, 0x098b, 0x0997, 0x09a1, 0x09af, + 0x09bf, 0x09cd, 0x09d7, 0x09e7, 0x09f5, 0x0a05, 0x0a24, 0x0a43, + // Entry 80 - BF + 0x0a64, 0x0a81, 0x0a8f, 0x0ab0, 0x0ac2, 0x0aca, 0x0ad8, 0x0aed, + 0x0b03, 0x0b14, 0x0b22, 0x0b2e, 0x0b38, 0x0b52, 0x0b5e, 0x0b68, + 0x0b76, 0x0b82, 0x0b90, 0x0ba4, 0x0bb7, 0x0bcb, 0x0bec, 0x0bfe, + 0x0c06, 0x0c1f, 0x0c2f, 0x0c53, 0x0c8b, 0x0c9d, 0x0cb1, 0x0cc3, + 0x0ccd, 0x0cdf, 0x0cf1, 0x0cfd, 0x0d0b, 0x0d1b, 0x0d2b, 0x0d39, + 0x0d52, 0x0d5c, 0x0d73, 0x0d81, 0x0d95, 0x0dad, 0x0dbd, 0x0dc7, + 0x0dd5, 0x0ddf, 0x0df6, 0x0dfe, 0x0e0a, 0x0e14, 0x0e3b, 0x0e5b, + 0x0e6f, 0x0e7f, 0x0e8f, 0x0eb0, 0x0ecd, 0x0ee4, 0x0f0d, 0x0f23, + // Entry C0 - FF + 0x0f2f, 0x0f3f, 0x0f49, 0x0f68, 0x0f7a, 0x0f8a, 0x0f96, 0x0fa8, + 0x0fb6, 0x0fd3, 0x0ff6, 0x1017, 0x1023, 0x102f, 0x1041, 0x1063, + 0x1073, 0x1098, 0x10a8, 0x10bd, 0x10d0, 0x10de, 0x10ea, 0x10fa, + 0x1119, 0x113c, 0x114c, 0x1161, 0x116b, 0x117d, 0x119d, 0x11c6, + 0x11cc, 0x1206, 0x120e, 0x121c, 0x122e, 0x123e, 0x1253, 0x126b, + 0x1277, 0x1281, 0x128f, 0x12af, 0x12bf, 0x12cb, 0x12db, 0x12eb, + 0x12f9, 0x131f, 0x1353, 0x1365, 0x1379, 0x13a7, 0x13d8, 0x13ec, + 0x1422, 0x1456, 0x1464, 0x1476, 0x1496, 0x14a0, 0x14ac, 0x14b4, + // Entry 100 - 13F + 0x14be, 0x14f7, 0x1503, 0x1513, 0x1536, 0x1542, 0x154e, 0x1573, + 0x1594, 0x15a4, 0x15c1, 0x15e6, 0x1603, 0x1626, 0x1649, 0x1668, + 0x1676, 0x16b4, 0x16d3, 0x16ec, 0x1707, 0x172b, 0x174a, 0x1777, + 0x1789, 0x17b8, 0x17ca, 0x17d2, 0x17f1, 0x180a, 0x1816, 0x1833, + 0x1856, 0x1873, 0x1894, +} // Size: 606 bytes + +var idRegionStr string = "" + // Size: 3042 bytes + "Pulau AscensionAndorraUni Emirat ArabAfganistanAntigua dan BarbudaAnguil" + + "laAlbaniaArmeniaAntilla BelandaAngolaAntarktikaArgentinaSamoa AmerikaAus" + + "triaAustraliaArubaKepulauan AlandAzerbaijanBosnia dan HerzegovinaBarbado" + + "sBangladeshBelgiaBurkina FasoBulgariaBahrainBurundiBeninSaint Barthelemy" + + "BermudaBruneiBoliviaKaribia BelandaBrasilBahamaBhutanPulau BouvetBotswan" + + "aBelarusBelizeKanadaKepulauan CocosKongo - KinshasaRepublik Afrika Tenga" + + "hKongo - BrazzavilleSwissCote d’IvoireKepulauan CookCileKamerunChinaKolo" + + "mbiaPulau ClippertonKosta RikaKubaTanjung VerdeCuraçaoPulau ChristmasSip" + + "rusRepublik CheskaJermanDiego GarciaJibutiDenmarkDominikaRepublik Domini" + + "kaAljazairCeuta dan MelillaEkuadorEstoniaMesirSahara BaratEritreaSpanyol" + + "EtiopiaUni EropaFinlandiaFijiKepulauan MalvinasMikronesiaKepulauan Faroe" + + "PrancisGabonInggrisGrenadaGeorgiaGuyana PrancisGuernseyGhanaGibraltarGri" + + "nlandiaGambiaGuineaGuadeloupeGuinea EkuatorialYunaniGeorgia Selatan & Ke" + + "p. Sandwich SelatanGuatemalaGuamGuinea-BissauGuyanaHong Kong SAR ChinaPu" + + "lau Heard dan Kepulauan McDonaldHondurasKroasiaHaitiHungariaKepulauan Ca" + + "naryIndonesiaIrlandiaIsraelPulau ManIndiaWilayah Inggris di Samudra Hind" + + "iaIrakIranIslandiaItaliaJerseyJamaikaYordaniaJepangKenyaKirgistanKamboja" + + "KiribatiKomoroSaint Kitts dan NevisKorea UtaraKorea SelatanKuwaitKepulau" + + "an CaymanKazakstanLaosLebanonSaint LuciaLiechtensteinSri LankaLiberiaLes" + + "othoLituaniaLuksemburgLatviaLibiaMarokoMonakoMoldovaMontenegroSaint Mart" + + "inMadagaskarKepulauan MarshallMakedoniaMaliMyanmar (Burma)MongoliaMakau " + + "SAR ChinaKepulauan Mariana UtaraMartinikMauritaniaMontserratMaltaMauriti" + + "usMaladewaMalawiMeksikoMalaysiaMozambikNamibiaKaledonia BaruNigerKepulau" + + "an NorfolkNigeriaNikaraguaBelandaNorwegiaNepalNauruNiueSelandia BaruOman" + + "PanamaPeruPolinesia PrancisPapua NuginiFilipinaPakistanPolandiaSaint Pie" + + "rre dan MiquelonKepulauan PitcairnPuerto RikoWilayah PalestinaPortugalPa" + + "lauParaguayQatarOseania LuarRéunionRumaniaSerbiaRusiaRwandaArab SaudiKep" + + "ulauan SolomonSeychellesSudanSwediaSingapuraSaint HelenaSloveniaKepulaua" + + "n Svalbard dan Jan MayenSlovakiaSierra LeoneSan MarinoSenegalSomaliaSuri" + + "nameSudan SelatanSao Tome dan PrincipeEl SalvadorSint MaartenSuriahSwazi" + + "landTristan da CunhaKepulauan Turks dan CaicosCadWilayah Kutub Selatan P" + + "rancisTogoThailandTajikistanTokelauTimor LesteTurkimenistanTunisiaTongaT" + + "urkiTrinidad dan TobagoTuvaluTaiwanTanzaniaUkrainaUgandaKepulauan Terlua" + + "r A.S.Amerika SerikatUruguayUzbekistanVatikanSaint Vincent dan Grenadine" + + "sVenezuelaKepulauan Virgin InggrisKepulauan Virgin A.S.VietnamVanuatuKep" + + "ulauan Wallis dan FutunaSamoaKosovoYamanMayotteAfrika SelatanZambiaZimba" + + "bweWilayah Tidak DikenalDuniaAfrikaAmerika UtaraAmerika SelatanOseaniaAf" + + "rika Bagian BaratAmerika TengahAfrika Bagian TimurAfrika Bagian UtaraAfr" + + "ika Bagian TengahAfrika Bagian SelatanAmerikaAmerika Bagian UtaraKepulau" + + "an KaribiaAsia Bagian TimurAsia Bagian SelatanAsia TenggaraEropa Bagian " + + "SelatanAustralasiaMelanesiaWilayah MikronesiaPolinesiaAsiaAsia TengahAsi" + + "a Bagian BaratEropaEropa Bagian TimurEropa Bagian UtaraEropa Bagian Bara" + + "tAmerika Latin" + +var idRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x000f, 0x0016, 0x0025, 0x002f, 0x0042, 0x004a, 0x0051, + 0x0058, 0x0067, 0x006d, 0x0077, 0x0080, 0x008d, 0x0094, 0x009d, + 0x00a2, 0x00b1, 0x00bb, 0x00d1, 0x00d9, 0x00e3, 0x00e9, 0x00f5, + 0x00fd, 0x0104, 0x010b, 0x0110, 0x0120, 0x0127, 0x012d, 0x0134, + 0x0143, 0x0149, 0x014f, 0x0155, 0x0161, 0x0169, 0x0170, 0x0176, + 0x017c, 0x018b, 0x019b, 0x01b1, 0x01c4, 0x01c9, 0x01d8, 0x01e6, + 0x01ea, 0x01f1, 0x01f6, 0x01fe, 0x020e, 0x0218, 0x021c, 0x0229, + 0x0231, 0x0240, 0x0246, 0x0255, 0x025b, 0x0267, 0x026d, 0x0274, + // Entry 40 - 7F + 0x027c, 0x028d, 0x0295, 0x02a6, 0x02ad, 0x02b4, 0x02b9, 0x02c5, + 0x02cc, 0x02d3, 0x02da, 0x02e3, 0x02ec, 0x02f0, 0x0302, 0x030c, + 0x031b, 0x0322, 0x0327, 0x032e, 0x0335, 0x033c, 0x034a, 0x0352, + 0x0357, 0x0360, 0x036a, 0x0370, 0x0376, 0x0380, 0x0391, 0x0397, + 0x03be, 0x03c7, 0x03cb, 0x03d8, 0x03de, 0x03f1, 0x0413, 0x041b, + 0x0422, 0x0427, 0x042f, 0x043f, 0x0448, 0x0450, 0x0456, 0x045f, + 0x0464, 0x0485, 0x0489, 0x048d, 0x0495, 0x049b, 0x04a1, 0x04a8, + 0x04b0, 0x04b6, 0x04bb, 0x04c4, 0x04cb, 0x04d3, 0x04d9, 0x04ee, + // Entry 80 - BF + 0x04f9, 0x0506, 0x050c, 0x051c, 0x0525, 0x0529, 0x0530, 0x053b, + 0x0548, 0x0551, 0x0558, 0x055f, 0x0567, 0x0571, 0x0577, 0x057c, + 0x0582, 0x0588, 0x058f, 0x0599, 0x05a5, 0x05af, 0x05c1, 0x05ca, + 0x05ce, 0x05dd, 0x05e5, 0x05f4, 0x060b, 0x0613, 0x061d, 0x0627, + 0x062c, 0x0635, 0x063d, 0x0643, 0x064a, 0x0652, 0x065a, 0x0661, + 0x066f, 0x0674, 0x0685, 0x068c, 0x0695, 0x069c, 0x06a4, 0x06a9, + 0x06ae, 0x06b2, 0x06bf, 0x06c3, 0x06c9, 0x06cd, 0x06de, 0x06ea, + 0x06f2, 0x06fa, 0x0702, 0x071b, 0x072d, 0x0738, 0x0749, 0x0751, + // Entry C0 - FF + 0x0756, 0x075e, 0x0763, 0x076f, 0x0777, 0x077e, 0x0784, 0x0789, + 0x078f, 0x0799, 0x07aa, 0x07b4, 0x07b9, 0x07bf, 0x07c8, 0x07d4, + 0x07dc, 0x07fc, 0x0804, 0x0810, 0x081a, 0x0821, 0x0828, 0x0830, + 0x083d, 0x0852, 0x085d, 0x0869, 0x086f, 0x0878, 0x0888, 0x08a2, + 0x08a5, 0x08c2, 0x08c6, 0x08ce, 0x08d8, 0x08df, 0x08ea, 0x08f7, + 0x08fe, 0x0903, 0x0908, 0x091b, 0x0921, 0x0927, 0x092f, 0x0936, + 0x093c, 0x0952, 0x0961, 0x0968, 0x0972, 0x0979, 0x0995, 0x099e, + 0x09b6, 0x09cb, 0x09d2, 0x09d9, 0x09f4, 0x09f9, 0x09ff, 0x0a04, + // Entry 100 - 13F + 0x0a0b, 0x0a19, 0x0a1f, 0x0a27, 0x0a3c, 0x0a41, 0x0a47, 0x0a54, + 0x0a63, 0x0a6a, 0x0a7d, 0x0a8b, 0x0a9e, 0x0ab1, 0x0ac5, 0x0ada, + 0x0ae1, 0x0af5, 0x0b06, 0x0b17, 0x0b2a, 0x0b37, 0x0b4b, 0x0b56, + 0x0b5f, 0x0b71, 0x0b7a, 0x0b7e, 0x0b89, 0x0b9a, 0x0b9f, 0x0bb1, + 0x0bc3, 0x0bd5, 0x0be2, +} // Size: 606 bytes + +var isRegionStr string = "" + // Size: 3324 bytes + "Ascension-eyjaAndorraSameinuðu arabísku furstadæminAfganistanAntígva og " + + "BarbúdaAngvillaAlbaníaArmeníaHollensku AntillurAngólaSuðurskautslandiðAr" + + "gentínaBandaríska SamóaAusturríkiÁstralíaArúbaÁlandseyjarAserbaídsjanBos" + + "nía og HersegóvínaBarbadosBangladessBelgíaBúrkína FasóBúlgaríaBareinBúrú" + + "ndíBenínSankti BartólómeusareyjarBermúdaeyjarBrúneiBólivíaKaríbahafshlut" + + "i HollandsBrasilíaBahamaeyjarBútanBouveteyjaBotsvanaHvíta-RússlandBelísK" + + "anadaKókoseyjar (Keeling)Kongó-KinshasaMið-AfríkulýðveldiðKongó-Brazzavi" + + "lleSvissFílabeinsströndinCooks-eyjarSíleKamerúnKínaKólumbíaClipperton-ey" + + "jaKostaríkaKúbaGrænhöfðaeyjarCuracaoJólaeyKýpurTékklandÞýskalandDiego Ga" + + "rciaDjíbútíDanmörkDóminíkaDóminíska lýðveldiðAlsírCeuta og MelillaEkvado" + + "rEistlandEgyptalandVestur-SaharaErítreaSpánnEþíópíaEvrópusambandiðFinnla" + + "ndFídjíeyjarFalklandseyjarMíkrónesíaFæreyjarFrakklandGabonBretlandGrenad" + + "aGeorgíaFranska GvæjanaGuernseyGanaGíbraltarGrænlandGambíaGíneaGvadelúpe" + + "yjarMiðbaugs-GíneaGrikklandSuður-Georgía og Suður-SandvíkureyjarGvatemal" + + "aGvamGínea-BissáGvæjanaSjálfstjórnarsvæðið Hong KongHeard og McDonaldsey" + + "jarHondúrasKróatíaHaítíUngverjalandKanaríeyjarIndónesíaÍrlandÍsraelMönIn" + + "dlandBresku IndlandshafseyjarÍrakÍranÍslandÍtalíaJerseyJamaíkaJórdaníaJa" + + "panKeníaKirgistanKambódíaKíribatíKómoreyjarSankti Kitts og NevisNorður-K" + + "óreaSuður-KóreaKúveitCaymaneyjarKasakstanLaosLíbanonSankti LúsíaLiechte" + + "nsteinSrí LankaLíberíaLesótóLitháenLúxemborgLettlandLíbíaMarokkóMónakóMo" + + "ldóvaSvartfjallalandSt. MartinMadagaskarMarshalleyjarMakedóníaMalíMjanma" + + "r (Búrma)MongólíaSjálfstjórnarsvæðið MakaóNorður-MaríanaeyjarMartiníkMár" + + "itaníaMontserratMaltaMáritíusMaldíveyjarMalavíMexíkóMalasíaMósambíkNamib" + + "íaNýja-KaledóníaNígerNorfolkeyjaNígeríaNíkaragvaHollandNoregurNepalNárú" + + "NiueNýja-SjálandÓmanPanamaPerúFranska PólýnesíaPapúa Nýja-GíneaFilippsey" + + "jarPakistanPóllandSankti Pierre og MiquelonPitcairn-eyjarPúertó RíkóHeim" + + "astjórnarsvæði PalestínumannaPortúgalPaláParagvæKatarYtri EyjaálfaRéunio" + + "nRúmeníaSerbíaRússlandRúandaSádi-ArabíaSalómonseyjarSeychelles-eyjarSúda" + + "nSvíþjóðSingapúrSankti HelenaSlóveníaSvalbarði og Jan MayenSlóvakíaSíerr" + + "a LeóneSan MarínóSenegalSómalíaSúrínamSuður-SúdanSaó Tóme og PrinsípeEl " + + "SalvadorSankti MartinSýrlandSvasílandTristan da CunhaTurks- og Caicoseyj" + + "arTsjadFrönsku suðlægu landsvæðinTógóTaílandTadsjikistanTókeláTímor-Lest" + + "eTúrkmenistanTúnisTongaTyrklandTrínidad og TóbagóTúvalúTaívanTansaníaÚkr" + + "aínaÚgandaSmáeyjar BandaríkjannaBandaríkinÚrúgvæÚsbekistanVatíkaniðSankt" + + "i Vinsent og GrenadíneyjarVenesúelaBresku JómfrúaeyjarBandarísku Jómfrúa" + + "eyjarVíetnamVanúatúWallis- og FútúnaeyjarSamóaKósóvóJemenMayotteSuður-Af" + + "ríkaSambíaSimbabveÓþekkt svæðiHeimurinnAfríkaNorður-AmeríkaSuður-Ameríka" + + "EyjaálfaVestur-AfríkaMið-AmeríkaAustur-AfríkaNorður-AfríkaMið-AfríkaSuðu" + + "rhluti AfríkuAmeríkaAmeríka norðan MexikóKaríbahafiðAustur-AsíaSuður-Así" + + "aSuðaustur-AsíaSuður-EvrópaÁstralasíaMelanesíaMíkrónesíusvæðiðPólýnesíaA" + + "síaMið-AsíaVestur-AsíaEvrópaAustur-EvrópaNorður-EvrópaVestur-EvrópaRóman" + + "ska Ameríka" + +var isRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x000e, 0x0015, 0x0036, 0x0040, 0x0054, 0x005c, 0x0064, + 0x006c, 0x007e, 0x0085, 0x0098, 0x00a2, 0x00b4, 0x00bf, 0x00c9, + 0x00cf, 0x00db, 0x00e8, 0x0100, 0x0108, 0x0112, 0x0119, 0x0128, + 0x0132, 0x0138, 0x0142, 0x0148, 0x0163, 0x0170, 0x0177, 0x0180, + 0x0199, 0x01a2, 0x01ad, 0x01b3, 0x01bd, 0x01c5, 0x01d5, 0x01db, + 0x01e1, 0x01f6, 0x0205, 0x021d, 0x022f, 0x0234, 0x0247, 0x0252, + 0x0257, 0x025f, 0x0264, 0x026e, 0x027d, 0x0287, 0x028c, 0x029d, + 0x02a4, 0x02ab, 0x02b1, 0x02ba, 0x02c5, 0x02d1, 0x02db, 0x02e3, + // Entry 40 - 7F + 0x02ed, 0x0305, 0x030b, 0x031b, 0x0322, 0x032a, 0x0334, 0x0341, + 0x0349, 0x034f, 0x035a, 0x036b, 0x0373, 0x037f, 0x038d, 0x039a, + 0x03a3, 0x03ac, 0x03b1, 0x03b9, 0x03c0, 0x03c8, 0x03d8, 0x03e0, + 0x03e4, 0x03ee, 0x03f7, 0x03fe, 0x0404, 0x0412, 0x0422, 0x042b, + 0x0454, 0x045d, 0x0461, 0x046e, 0x0476, 0x0498, 0x04af, 0x04b8, + 0x04c1, 0x04c8, 0x04d4, 0x04e0, 0x04eb, 0x04f2, 0x04f9, 0x04fd, + 0x0504, 0x051c, 0x0521, 0x0526, 0x052d, 0x0535, 0x053b, 0x0543, + 0x054d, 0x0552, 0x0558, 0x0561, 0x056b, 0x0575, 0x0580, 0x0595, + // Entry 80 - BF + 0x05a3, 0x05b0, 0x05b7, 0x05c2, 0x05cb, 0x05cf, 0x05d7, 0x05e5, + 0x05f2, 0x05fc, 0x0605, 0x060d, 0x0615, 0x061f, 0x0627, 0x062e, + 0x0636, 0x063e, 0x0646, 0x0655, 0x065f, 0x0669, 0x0676, 0x0681, + 0x0686, 0x0696, 0x06a0, 0x06bf, 0x06d4, 0x06dd, 0x06e8, 0x06f2, + 0x06f7, 0x0701, 0x070d, 0x0714, 0x071c, 0x0724, 0x072e, 0x0736, + 0x0747, 0x074d, 0x0758, 0x0761, 0x076b, 0x0772, 0x0779, 0x077e, + 0x0784, 0x0788, 0x0796, 0x079b, 0x07a1, 0x07a6, 0x07ba, 0x07cd, + 0x07d9, 0x07e1, 0x07e9, 0x0802, 0x0810, 0x081f, 0x0844, 0x084d, + // Entry C0 - FF + 0x0852, 0x085a, 0x085f, 0x086d, 0x0875, 0x087e, 0x0885, 0x088e, + 0x0895, 0x08a2, 0x08b0, 0x08c0, 0x08c6, 0x08d1, 0x08da, 0x08e7, + 0x08f1, 0x0908, 0x0912, 0x0920, 0x092c, 0x0933, 0x093c, 0x0945, + 0x0952, 0x0969, 0x0974, 0x0981, 0x0989, 0x0993, 0x09a3, 0x09b8, + 0x09bd, 0x09dc, 0x09e2, 0x09ea, 0x09f6, 0x09fe, 0x0a0a, 0x0a17, + 0x0a1d, 0x0a22, 0x0a2a, 0x0a3f, 0x0a47, 0x0a4e, 0x0a57, 0x0a60, + 0x0a67, 0x0a7f, 0x0a8a, 0x0a93, 0x0a9e, 0x0aa9, 0x0ac9, 0x0ad3, + 0x0ae8, 0x0b02, 0x0b0a, 0x0b13, 0x0b2b, 0x0b31, 0x0b3a, 0x0b3f, + // Entry 100 - 13F + 0x0b46, 0x0b54, 0x0b5b, 0x0b63, 0x0b73, 0x0b7c, 0x0b83, 0x0b93, + 0x0ba2, 0x0bab, 0x0bb9, 0x0bc6, 0x0bd4, 0x0be3, 0x0bef, 0x0c02, + 0x0c0a, 0x0c22, 0x0c2f, 0x0c3b, 0x0c47, 0x0c57, 0x0c65, 0x0c71, + 0x0c7b, 0x0c91, 0x0c9d, 0x0ca2, 0x0cac, 0x0cb8, 0x0cbf, 0x0ccd, + 0x0cdc, 0x0cea, 0x0cfc, +} // Size: 606 bytes + +var itRegionStr string = "" + // Size: 3049 bytes + "Isola AscensioneAndorraEmirati Arabi UnitiAfghanistanAntigua e BarbudaAn" + + "guillaAlbaniaArmeniaAntille OlandesiAngolaAntartideArgentinaSamoa americ" + + "aneAustriaAustraliaArubaIsole ÅlandAzerbaigianBosnia ed ErzegovinaBarbad" + + "osBangladeshBelgioBurkina FasoBulgariaBahreinBurundiBeninSaint-Barthélem" + + "yBermudaBruneiBoliviaCaraibi OlandesiBrasileBahamasBhutanIsola BouvetBot" + + "swanaBielorussiaBelizeCanadaIsole Cocos (Keeling)Congo - KinshasaRepubbl" + + "ica CentrafricanaCongo-BrazzavilleSvizzeraCosta d’AvorioIsole CookCileCa" + + "merunCinaColombiaIsola di ClippertonCosta RicaCubaCapo VerdeCuraçaoIsola" + + " ChristmasCiproRepubblica CecaGermaniaDiego GarciaGibutiDanimarcaDominic" + + "aRepubblica DominicanaAlgeriaCeuta e MelillaEcuadorEstoniaEgittoSahara o" + + "ccidentaleEritreaSpagnaEtiopiaUnione EuropeaFinlandiaFigiIsole FalklandM" + + "icronesiaIsole Fær ØerFranciaGabonRegno UnitoGrenadaGeorgiaGuyana france" + + "seGuernseyGhanaGibilterraGroenlandiaGambiaGuineaGuadalupaGuinea Equatori" + + "aleGreciaGeorgia del Sud e isole Sandwich australiGuatemalaGuamGuinea-Bi" + + "ssauGuyanaRAS di Hong KongIsole Heard e McDonaldHondurasCroaziaHaitiUngh" + + "eriaIsole CanarieIndonesiaIrlandaIsraeleIsola di ManIndiaTerritorio brit" + + "annico dell’Oceano IndianoIraqIranIslandaItaliaJerseyGiamaicaGiordaniaGi" + + "apponeKenyaKirghizistanCambogiaKiribatiComoreSaint Kitts e NevisCorea de" + + "l NordCorea del SudKuwaitIsole CaymanKazakistanLaosLibanoSaint LuciaLiec" + + "htensteinSri LankaLiberiaLesothoLituaniaLussemburgoLettoniaLibiaMaroccoM" + + "onacoMoldaviaMontenegroSaint MartinMadagascarIsole MarshallRepubblica di" + + " MacedoniaMaliMyanmar (Birmania)MongoliaRAS di MacaoIsole Marianne sette" + + "ntrionaliMartinicaMauritaniaMontserratMaltaMauritiusMaldiveMalawiMessico" + + "MalaysiaMozambicoNamibiaNuova CaledoniaNigerIsola NorfolkNigeriaNicaragu" + + "aPaesi BassiNorvegiaNepalNauruNiueNuova ZelandaOmanPanamáPerùPolinesia f" + + "rancesePapua Nuova GuineaFilippinePakistanPoloniaSaint Pierre e Miquelon" + + "Isole PitcairnPortoricoTerritori palestinesiPortogalloPalauParaguayQatar" + + "Oceania lontanaRiunioneRomaniaSerbiaRussiaRuandaArabia SauditaIsole Salo" + + "moneSeychellesSudanSveziaSingaporeSant’ElenaSloveniaSvalbard e Jan Mayen" + + "SlovacchiaSierra LeoneSan MarinoSenegalSomaliaSurinameSud SudanSão Tomé " + + "e PríncipeEl SalvadorSint MaartenSiriaSwazilandTristan da CunhaIsole Tur" + + "ks e CaicosCiadTerre australi francesiTogoThailandiaTagikistanTokelauTim" + + "or LesteTurkmenistanTunisiaTongaTurchiaTrinidad e TobagoTuvaluTaiwanTanz" + + "aniaUcrainaUgandaAltre isole americane del PacificoStati UnitiUruguayUzb" + + "ekistanCittà del VaticanoSaint Vincent e GrenadinesVenezuelaIsole Vergin" + + "i BritannicheIsole Vergini AmericaneVietnamVanuatuWallis e FutunaSamoaKo" + + "sovoYemenMayotteSudafricaZambiaZimbabweRegione sconosciutaMondoAfricaNor" + + "d AmericaAmerica del SudOceaniaAfrica occidentaleAmerica CentraleAfrica " + + "orientaleNordafricaAfrica centraleAfrica del SudAmericheAmerica del Nord" + + "CaraibiAsia orientaleAsia del SudSud-est asiaticoEuropa meridionaleAustr" + + "alasiaMelanesiaRegione MicronesianaPolinesiaAsiaAsia centraleAsia occide" + + "ntaleEuropaEuropa orientaleEuropa settentrionaleEuropa occidentaleAmeric" + + "a Latina" + +var itRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0010, 0x0017, 0x002a, 0x0035, 0x0046, 0x004e, 0x0055, + 0x005c, 0x006c, 0x0072, 0x007b, 0x0084, 0x0093, 0x009a, 0x00a3, + 0x00a8, 0x00b4, 0x00bf, 0x00d3, 0x00db, 0x00e5, 0x00eb, 0x00f7, + 0x00ff, 0x0106, 0x010d, 0x0112, 0x0123, 0x012a, 0x0130, 0x0137, + 0x0147, 0x014e, 0x0155, 0x015b, 0x0167, 0x016f, 0x017a, 0x0180, + 0x0186, 0x019b, 0x01ab, 0x01c3, 0x01d4, 0x01dc, 0x01ec, 0x01f6, + 0x01fa, 0x0201, 0x0205, 0x020d, 0x0220, 0x022a, 0x022e, 0x0238, + 0x0240, 0x024f, 0x0254, 0x0263, 0x026b, 0x0277, 0x027d, 0x0286, + // Entry 40 - 7F + 0x028e, 0x02a3, 0x02aa, 0x02b9, 0x02c0, 0x02c7, 0x02cd, 0x02df, + 0x02e6, 0x02ec, 0x02f3, 0x0301, 0x030a, 0x030e, 0x031c, 0x0326, + 0x0335, 0x033c, 0x0341, 0x034c, 0x0353, 0x035a, 0x0369, 0x0371, + 0x0376, 0x0380, 0x038b, 0x0391, 0x0397, 0x03a0, 0x03b2, 0x03b8, + 0x03e1, 0x03ea, 0x03ee, 0x03fb, 0x0401, 0x0411, 0x0427, 0x042f, + 0x0436, 0x043b, 0x0443, 0x0450, 0x0459, 0x0460, 0x0467, 0x0473, + 0x0478, 0x04a3, 0x04a7, 0x04ab, 0x04b2, 0x04b8, 0x04be, 0x04c6, + 0x04cf, 0x04d7, 0x04dc, 0x04e8, 0x04f0, 0x04f8, 0x04fe, 0x0511, + // Entry 80 - BF + 0x051f, 0x052c, 0x0532, 0x053e, 0x0548, 0x054c, 0x0552, 0x055d, + 0x056a, 0x0573, 0x057a, 0x0581, 0x0589, 0x0594, 0x059c, 0x05a1, + 0x05a8, 0x05ae, 0x05b6, 0x05c0, 0x05cc, 0x05d6, 0x05e4, 0x05fb, + 0x05ff, 0x0611, 0x0619, 0x0625, 0x0642, 0x064b, 0x0655, 0x065f, + 0x0664, 0x066d, 0x0674, 0x067a, 0x0681, 0x0689, 0x0692, 0x0699, + 0x06a8, 0x06ad, 0x06ba, 0x06c1, 0x06ca, 0x06d5, 0x06dd, 0x06e2, + 0x06e7, 0x06eb, 0x06f8, 0x06fc, 0x0703, 0x0708, 0x071a, 0x072c, + 0x0735, 0x073d, 0x0744, 0x075b, 0x0769, 0x0772, 0x0787, 0x0791, + // Entry C0 - FF + 0x0796, 0x079e, 0x07a3, 0x07b2, 0x07ba, 0x07c1, 0x07c7, 0x07cd, + 0x07d3, 0x07e1, 0x07ef, 0x07f9, 0x07fe, 0x0804, 0x080d, 0x0819, + 0x0821, 0x0835, 0x083f, 0x084b, 0x0855, 0x085c, 0x0863, 0x086b, + 0x0874, 0x088a, 0x0895, 0x08a1, 0x08a6, 0x08af, 0x08bf, 0x08d3, + 0x08d7, 0x08ee, 0x08f2, 0x08fc, 0x0906, 0x090d, 0x0918, 0x0924, + 0x092b, 0x0930, 0x0937, 0x0948, 0x094e, 0x0954, 0x095c, 0x0963, + 0x0969, 0x098b, 0x0996, 0x099d, 0x09a7, 0x09ba, 0x09d4, 0x09dd, + 0x09f6, 0x0a0d, 0x0a14, 0x0a1b, 0x0a2a, 0x0a2f, 0x0a35, 0x0a3a, + // Entry 100 - 13F + 0x0a41, 0x0a4a, 0x0a50, 0x0a58, 0x0a6b, 0x0a70, 0x0a76, 0x0a82, + 0x0a91, 0x0a98, 0x0aaa, 0x0aba, 0x0aca, 0x0ad4, 0x0ae3, 0x0af1, + 0x0af9, 0x0b09, 0x0b10, 0x0b1e, 0x0b2a, 0x0b3a, 0x0b4c, 0x0b57, + 0x0b60, 0x0b74, 0x0b7d, 0x0b81, 0x0b8e, 0x0b9e, 0x0ba4, 0x0bb4, + 0x0bc9, 0x0bdb, 0x0be9, +} // Size: 606 bytes + +var jaRegionStr string = "" + // Size: 4839 bytes + "アセンション島アンドラアラブ首長国連邦アフガニスタンアンティグア・バーブーダアンギラアルバニアアルメニアオランダ領アンティルアンゴラ南極アルゼン" + + "チン米領サモアオーストリアオーストラリアアルバオーランド諸島アゼルバイジャンボスニア・ヘルツェゴビナバルバドスバングラデシュベルギーブルキナ" + + "ファソブルガリアバーレーンブルンジベナンサン・バルテルミー島バミューダブルネイボリビアオランダ領カリブブラジルバハマブータンブーベ島ボツワナ" + + "ベラルーシベリーズカナダココス(キーリング)諸島コンゴ民主共和国(キンシャサ)中央アフリカ共和国コンゴ共和国(ブラザビル)スイスコートジボワ" + + "ールクック諸島チリカメルーン中国コロンビアクリッパートン島コスタリカキューバカーボベルデキュラソークリスマス島キプロスチェコ共和国ドイツディ" + + "エゴガルシア島ジブチデンマークドミニカ国ドミニカ共和国アルジェリアセウタ・メリリャエクアドルエストニアエジプト西サハラエリトリアスペインエチ" + + "オピア欧州連合フィンランドフィジーフォークランド諸島ミクロネシア連邦フェロー諸島フランスガボンイギリスグレナダジョージア仏領ギアナガーンジー" + + "ガーナジブラルタルグリーンランドガンビアギニアグアドループ赤道ギニアギリシャ南ジョージア島・南サンドイッチ諸島グアテマラグアムギニアビサウガ" + + "イアナ中華人民共和国香港特別行政区ハード島・マクドナルド諸島ホンジュラスクロアチアハイチハンガリーカナリア諸島インドネシアアイルランドイスラ" + + "エルマン島インド英領インド洋地域イラクイランアイスランドイタリアジャージージャマイカヨルダン日本ケニアキルギスカンボジアキリバスコモロセント" + + "クリストファー・ネイビス朝鮮民主主義人民共和国大韓民国クウェートケイマン諸島カザフスタンラオスレバノンセントルシアリヒテンシュタインスリラン" + + "カリベリアレソトリトアニアルクセンブルグラトビアリビアモロッコモナコモルドバモンテネグロサン・マルタンマダガスカルマーシャル諸島マケドニアマ" + + "リミャンマーモンゴル中華人民共和国マカオ特別行政区北マリアナ諸島マルティニークモーリタニアモントセラトマルタモーリシャスモルディブマラウイメ" + + "キシコマレーシアモザンビークナミビアニューカレドニアニジェールノーフォーク島ナイジェリアニカラグアオランダノルウェーネパールナウルニウエ島ニ" + + "ュージーランドオマーンパナマペルー仏領ポリネシアパプアニューギニアフィリピンパキスタンポーランドサンピエール島・ミクロン島ピトケアン諸島プエ" + + "ルトリコパレスチナポルトガルパラオパラグアイカタールオセアニア周辺地域レユニオン島ルーマニアセルビアロシアルワンダサウジアラビアソロモン諸島" + + "セーシェルスーダンスウェーデンシンガポールセントヘレナスロベニアスバールバル諸島・ヤンマイエン島スロバキアシエラレオネサンマリノセネガルソマ" + + "リアスリナム南スーダンサントメ・プリンシペエルサルバドルシント・マールテンシリアスワジランドトリスタン・ダ・クーニャタークス・カイコス諸島チ" + + "ャド仏領極南諸島トーゴタイタジキスタントケラウ東ティモールトルクメニスタンチュニジアトンガトルコトリニダード・トバゴツバル台湾タンザニアウク" + + "ライナウガンダ米領太平洋諸島アメリカ合衆国ウルグアイウズベキスタンバチカン市国セントビンセント・グレナディーン諸島ベネズエラ英領ヴァージン諸" + + "島米領ヴァージン諸島ベトナムバヌアツウォリス・フツナサモアコソボイエメンマヨット島南アフリカザンビアジンバブエ不明な地域世界アフリカ北アメリ" + + "カ大陸南アメリカオセアニア西アフリカ中央アメリカ東アフリカ北アフリカ中部アフリカ南部アフリカアメリカ大陸北アメリカカリブ東アジア南アジア東南" + + "アジア南ヨーロッパオーストララシアメラネシアミクロネシアポリネシアアジア中央アジア西アジアヨーロッパ東ヨーロッパ北ヨーロッパ西ヨーロッパラテ" + + "ンアメリカ" + +var jaRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0015, 0x0021, 0x0039, 0x004e, 0x0072, 0x007e, 0x008d, + 0x009c, 0x00ba, 0x00c6, 0x00cc, 0x00de, 0x00ed, 0x00ff, 0x0114, + 0x011d, 0x0132, 0x014a, 0x016e, 0x017d, 0x0192, 0x019e, 0x01b3, + 0x01c2, 0x01d1, 0x01dd, 0x01e6, 0x0204, 0x0213, 0x021f, 0x022b, + 0x0243, 0x024f, 0x0258, 0x0264, 0x0270, 0x027c, 0x028b, 0x0297, + 0x02a0, 0x02c0, 0x02e9, 0x0304, 0x0327, 0x0330, 0x0348, 0x0357, + 0x035d, 0x036c, 0x0372, 0x0381, 0x0399, 0x03a8, 0x03b4, 0x03c6, + 0x03d5, 0x03e7, 0x03f3, 0x0405, 0x040e, 0x0429, 0x0432, 0x0441, + // Entry 40 - 7F + 0x0450, 0x0465, 0x0477, 0x048f, 0x049e, 0x04ad, 0x04b9, 0x04c5, + 0x04d4, 0x04e0, 0x04ef, 0x04fb, 0x050d, 0x0519, 0x0534, 0x054c, + 0x055e, 0x056a, 0x0573, 0x057f, 0x058b, 0x059a, 0x05a9, 0x05b8, + 0x05c1, 0x05d3, 0x05e8, 0x05f4, 0x05fd, 0x060f, 0x061e, 0x062a, + 0x065d, 0x066c, 0x0675, 0x0687, 0x0693, 0x06bd, 0x06e4, 0x06f6, + 0x0705, 0x070e, 0x071d, 0x072f, 0x0741, 0x0753, 0x0762, 0x076b, + 0x0774, 0x078c, 0x0795, 0x079e, 0x07b0, 0x07bc, 0x07cb, 0x07da, + 0x07e6, 0x07ec, 0x07f5, 0x0801, 0x0810, 0x081c, 0x0825, 0x0852, + // Entry 80 - BF + 0x0873, 0x087f, 0x088e, 0x08a0, 0x08b2, 0x08bb, 0x08c7, 0x08d9, + 0x08f4, 0x0903, 0x090f, 0x0918, 0x0927, 0x093c, 0x0948, 0x0951, + 0x095d, 0x0966, 0x0972, 0x0984, 0x0999, 0x09ab, 0x09c0, 0x09cf, + 0x09d5, 0x09e4, 0x09f0, 0x0a1d, 0x0a32, 0x0a47, 0x0a59, 0x0a6b, + 0x0a74, 0x0a86, 0x0a95, 0x0aa1, 0x0aad, 0x0abc, 0x0ace, 0x0ada, + 0x0af2, 0x0b01, 0x0b16, 0x0b28, 0x0b37, 0x0b43, 0x0b52, 0x0b5e, + 0x0b67, 0x0b73, 0x0b8b, 0x0b97, 0x0ba0, 0x0ba9, 0x0bbe, 0x0bd9, + 0x0be8, 0x0bf7, 0x0c06, 0x0c2d, 0x0c42, 0x0c54, 0x0c63, 0x0c72, + // Entry C0 - FF + 0x0c7b, 0x0c8a, 0x0c96, 0x0cb1, 0x0cc3, 0x0cd2, 0x0cde, 0x0ce7, + 0x0cf3, 0x0d08, 0x0d1a, 0x0d29, 0x0d35, 0x0d47, 0x0d59, 0x0d6b, + 0x0d7a, 0x0daa, 0x0db9, 0x0dcb, 0x0dda, 0x0de6, 0x0df2, 0x0dfe, + 0x0e0d, 0x0e2b, 0x0e40, 0x0e5b, 0x0e64, 0x0e76, 0x0e9a, 0x0ebb, + 0x0ec4, 0x0ed6, 0x0edf, 0x0ee5, 0x0ef7, 0x0f03, 0x0f15, 0x0f2d, + 0x0f3c, 0x0f45, 0x0f4e, 0x0f6c, 0x0f75, 0x0f7b, 0x0f8a, 0x0f99, + 0x0fa5, 0x0fba, 0x0fcf, 0x0fde, 0x0ff3, 0x1005, 0x103b, 0x104a, + 0x1065, 0x1080, 0x108c, 0x1098, 0x10b0, 0x10b9, 0x10c2, 0x10ce, + // Entry 100 - 13F + 0x10dd, 0x10ec, 0x10f8, 0x1107, 0x1116, 0x111c, 0x1128, 0x113d, + 0x114c, 0x115b, 0x116a, 0x117c, 0x118b, 0x119a, 0x11ac, 0x11be, + 0x11d0, 0x11df, 0x11e8, 0x11f4, 0x1200, 0x120f, 0x1221, 0x1239, + 0x1248, 0x125a, 0x1269, 0x1272, 0x1281, 0x128d, 0x129c, 0x12ae, + 0x12c0, 0x12d2, 0x12e7, +} // Size: 606 bytes + +var kaRegionStr string = "" + // Size: 9560 bytes + "ამაღლების კუნძულიანდორაარაბთა გაერთიანებული საამიროებიავღანეთიანტიგუა და" + + " ბარბუდაანგილიაალბანეთისომხეთინიდერლანდების ანტილებიანგოლაანტარქტიკაარგე" + + "ნტინაამერიკის სამოაავსტრიაავსტრალიაარუბაალანდის კუნძულებიაზერბაიჯანიბო" + + "სნია და ჰერცეგოვინაბარბადოსიბანგლადეშიბელგიაბურკინა-ფასობულგარეთიბაჰრე" + + "ინიბურუნდიბენინისენ-ბართელმიბერმუდიბრუნეიბოლივიაკარიბის ნიდერლანდებიბრ" + + "აზილიაბაჰამის კუნძულებიბჰუტანიბუვებოტსვანაბელარუსიბელიზიკანადაქოქოსის " + + "კუნძულებიკონგო - კინშასაცენტრალური აფრიკის რესპუბლიკაკონგო - ბრაზავილი" + + "შვეიცარიაკოტ-დივუარიკუკის კუნძულებიჩილეკამერუნიჩინეთიკოლუმბიაკლიპერტონ" + + "ის კუნძულიკოსტა-რიკაკუბაკაბო-ვერდეკიურასაოშობის კუნძულიკვიპროსიჩეხეთის" + + " რესპუბლიკაგერმანიადიეგო-გარსიაჯიბუტიდანიადომინიკადომინიკელთა რესპუბლიკა" + + "ალჟირისეუტა და მელილაეკვადორიესტონეთიეგვიპტედასავლეთი საჰარაერიტრეაესპ" + + "ანეთიეთიოპიაევროკავშირიფინეთიფიჯიფოლკლენდის კუნძულებიმიკრონეზიაფარერის" + + " კუნძულებისაფრანგეთიგაბონიდიდი ბრიტანეთიგრენადასაქართველოსაფრანგეთის გვი" + + "ანაგერნსიგანაგიბრალტარიგრენლანდიაგამბიაგვინეაგვადელუპაეკვატორული გვინე" + + "ასაბერძნეთისამხრეთი გეორგია და სამხრეთ სენდვიჩის კუნძულებიგვატემალაგუა" + + "მიგვინეა-ბისაუგაიანაჰონკონგის სპეციალური ადმინისტრაციული რეგიონი ჩინეთ" + + "იჰერდი და მაკდონალდის კუნძულებიჰონდურასიხორვატიაჰაიტიუნგრეთიკანარის კუ" + + "ნძულებიინდონეზიაირლანდიაისრაელიმენის კუნძულიინდოეთიბრიტ. ტერიტ. ინდ. ო" + + "კეანეშიერაყიირანიისლანდიაიტალიაჯერსიიამაიკაიორდანიაიაპონიაკენიაყირგიზე" + + "თიკამბოჯაკირიბატიკომორის კუნძულებისენტ-კიტსი და ნევისიჩრდილოეთი კორეას" + + "ამხრეთი კორეაქუვეითიკაიმანის კუნძულებიყაზახეთილაოსილიბანისენტ-ლუსიალიხ" + + "ტენშტაინიშრი-ლანკალიბერიალესოთოლიტვალუქსემბურგილატვიალიბიამაროკომონაკო" + + "მოლდოვამონტენეგროსენ-მარტენიმადაგასკარიმარშალის კუნძულებიმაკედონიამალი" + + "მიანმარი (ბირმა)მონღოლეთიმაკაოს სპეციალური ადმინისტრაციული რეგიონი ჩინ" + + "ეთიჩრდილოეთ მარიანას კუნძულებიმარტინიკამავრიტანიამონსერატიმალტამავრიკი" + + "მალდივის რესპუბლიკამალავიმექსიკამალაიზიამოზამბიკინამიბიაახალი კალედონი" + + "ანიგერინორფოლკის კუნძულინიგერიანიკარაგუანიდერლანდებინორვეგიანეპალინაურ" + + "უნიუეახალი ზელანდიაომანიპანამაპერუსაფრანგეთის პოლინეზიაპაპუა-ახალი გვი" + + "ნეაფილიპინებიპაკისტანიპოლონეთისენ-პიერი და მიკელონიპიტკერნის კუნძულები" + + "პუერტო-რიკოპალესტინის ტერიტორიებიპორტუგალიაპალაუპარაგვაიკატარიშორეული " + + "ოკეანეთირეუნიონირუმინეთისერბეთირუსეთირუანდასაუდის არაბეთისოლომონის კუნ" + + "ძულებისეიშელის კუნძულებისუდანიშვედეთისინგაპურიწმინდა ელენეს კუნძულისლო" + + "ვენიაშპიცბერგენი და იან-მაიენისლოვაკეთისიერა-ლეონესან-მარინოსენეგალისო" + + "მალისურინამისამხრეთი სუდანისან-ტომე და პრინსიპისალვადორისინტ-მარტენისი" + + "რიასვაზილენდიტრისტან-და-კუნიატერქსისა და კაიკოსის კუნძულებიჩადიფრანგულ" + + "ი სამხრეთის ტერიტორიებიტოგოტაილანდიტაჯიკეთიტოკელაუაღმოსავლეთი ტიმორითუ" + + "რქმენეთიტუნისიტონგათურქეთიტრინიდადი და ტობაგოტუვალუტაივანიტანზანიაუკრა" + + "ინაუგანდააშშ-ის შორეული კუნძულებიამერიკის შეერთებული შტატებიურუგვაიუზბ" + + "ეკეთიქალაქი ვატიკანისენტ-ვინსენტი და გრენადინებივენესუელაბრიტანეთის ვი" + + "რჯინის კუნძულებიაშშ-ის ვირჯინის კუნძულებივიეტნამივანუატუუოლისი და ფუტუ" + + "ნასამოაკოსოვოიემენიმაიოტასამხრეთ აფრიკის რესპუბლიკაზამბიაზიმბაბვეუცნობ" + + "ი რეგიონიმსოფლიოაფრიკაჩრდილოეთი ამერიკასამხრეთი ამერიკაოკეანეთიდასავლე" + + "თი აფრიკაცენტრალური ამერიკააღმოსავლეთი აფრიკაჩრდილოეთი აფრიკაშუა აფრიკ" + + "ასამხრეთი აფრიკაამერიკებიამერიკის ჩრდილოეთიკარიბის ზღვააღმოსავლეთი აზი" + + "ასამხრეთი აზიასამხრეთ-აღმოსავლეთი აზიასამხრეთი ევროპაავსტრალაზიამელანე" + + "ზიამიკრონეზიის რეგიონიპოლინეზიააზიაცენტრალური აზიადასავლეთი აზიაევროპა" + + "აღმოსავლეთი ევროპაჩრდილოეთი ევროპადასავლეთი ევროპალათინური ამერიკა" + +var kaRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0031, 0x0043, 0x009c, 0x00b4, 0x00e6, 0x00fb, 0x0113, + 0x0128, 0x0168, 0x017a, 0x0198, 0x01b3, 0x01db, 0x01f0, 0x020b, + 0x021a, 0x024b, 0x026c, 0x02a7, 0x02c2, 0x02e0, 0x02f2, 0x0314, + 0x032f, 0x0347, 0x035c, 0x036e, 0x0390, 0x03a5, 0x03b7, 0x03cc, + 0x0406, 0x041e, 0x044f, 0x0464, 0x0470, 0x0488, 0x04a0, 0x04b2, + 0x04c4, 0x04f5, 0x051c, 0x056f, 0x059c, 0x05b7, 0x05d6, 0x0601, + 0x060d, 0x0625, 0x0637, 0x064f, 0x0686, 0x06a2, 0x06ae, 0x06ca, + 0x06e2, 0x0707, 0x071f, 0x0753, 0x076b, 0x078d, 0x079f, 0x07ae, + // Entry 40 - 7F + 0x07c6, 0x0806, 0x0818, 0x0841, 0x0859, 0x0871, 0x0886, 0x08b4, + 0x08c9, 0x08e1, 0x08f6, 0x0917, 0x0929, 0x0935, 0x096f, 0x098d, + 0x09be, 0x09dc, 0x09ee, 0x0a16, 0x0a2b, 0x0a49, 0x0a7d, 0x0a8f, + 0x0a9b, 0x0ab9, 0x0ad7, 0x0ae9, 0x0afb, 0x0b16, 0x0b47, 0x0b65, + 0x0be8, 0x0c03, 0x0c12, 0x0c34, 0x0c46, 0x0cd7, 0x0d2b, 0x0d46, + 0x0d5e, 0x0d6d, 0x0d82, 0x0db3, 0x0dce, 0x0de6, 0x0dfb, 0x0e20, + 0x0e35, 0x0e77, 0x0e86, 0x0e95, 0x0ead, 0x0ebf, 0x0ece, 0x0ee3, + 0x0efb, 0x0f10, 0x0f1f, 0x0f3a, 0x0f4f, 0x0f67, 0x0f98, 0x0fce, + // Entry 80 - BF + 0x0ff9, 0x1021, 0x1036, 0x106a, 0x1082, 0x1091, 0x10a3, 0x10bf, + 0x10e3, 0x10fc, 0x1111, 0x1123, 0x1132, 0x1153, 0x1165, 0x1174, + 0x1186, 0x1198, 0x11ad, 0x11cb, 0x11ea, 0x120b, 0x123f, 0x125a, + 0x1266, 0x1290, 0x12ab, 0x1333, 0x1380, 0x139b, 0x13b9, 0x13d4, + 0x13e3, 0x13f8, 0x142f, 0x1441, 0x1456, 0x146e, 0x1489, 0x149e, + 0x14c9, 0x14db, 0x150c, 0x1521, 0x153c, 0x1560, 0x1578, 0x158a, + 0x1599, 0x15a5, 0x15cd, 0x15dc, 0x15ee, 0x15fa, 0x1637, 0x1669, + 0x1687, 0x16a2, 0x16ba, 0x16f3, 0x172a, 0x1749, 0x1789, 0x17a7, + // Entry C0 - FF + 0x17b6, 0x17ce, 0x17e0, 0x180e, 0x1826, 0x183e, 0x1853, 0x1865, + 0x1877, 0x189f, 0x18d6, 0x190a, 0x191c, 0x1931, 0x194c, 0x1987, + 0x199f, 0x19e4, 0x19ff, 0x1a1e, 0x1a3a, 0x1a52, 0x1a64, 0x1a7c, + 0x1aa7, 0x1add, 0x1af8, 0x1b1a, 0x1b29, 0x1b47, 0x1b73, 0x1bc7, + 0x1bd3, 0x1c29, 0x1c35, 0x1c4d, 0x1c65, 0x1c7a, 0x1cae, 0x1ccc, + 0x1cde, 0x1ced, 0x1d02, 0x1d37, 0x1d49, 0x1d5e, 0x1d76, 0x1d8b, + 0x1d9d, 0x1ddf, 0x1e2c, 0x1e41, 0x1e59, 0x1e84, 0x1ed2, 0x1eed, + 0x1f40, 0x1f85, 0x1f9d, 0x1fb2, 0x1fde, 0x1fed, 0x1fff, 0x2011, + // Entry 100 - 13F + 0x2023, 0x206d, 0x207f, 0x2097, 0x20bf, 0x20d4, 0x20e6, 0x2117, + 0x2145, 0x215d, 0x218b, 0x21bf, 0x21f3, 0x2221, 0x223d, 0x2268, + 0x2283, 0x22b7, 0x22d9, 0x2307, 0x232c, 0x2370, 0x239b, 0x23bc, + 0x23d7, 0x240e, 0x2429, 0x2435, 0x2460, 0x2488, 0x249a, 0x24ce, + 0x24fc, 0x252a, 0x2558, +} // Size: 606 bytes + +var kkRegionStr string = "" + // Size: 6084 bytes + "Әскенжін аралыАндорраБіріккен Араб ӘмірліктеріАуғанстанАнтигуа мен Барбу" + + "даАнгильяАлбанияАрменияАнголаАнтарктикаАргентинаАмерикандық СамоаАвстри" + + "яАвстралияАрубаАланд аралдарыӘзірбайжанБосния және ГерцеговинаБарбадосБ" + + "англадешБельгияБуркина-ФасоБолгарияБахрейнБурундиБенинСен-БартелемиБерм" + + "уд аралдарыБрунейБоливияКариб НидерландысыБразилияБагам аралдарыБутанБу" + + "ве аралыБотсванаБеларусьБелизКанадаКокос (Килинг) аралдарыКонгоОрталық " + + "Африка РеспубликасыКонго-Браззавиль РеспубликасыШвейцарияКот-д’ИвуарКук" + + " аралдарыЧилиКамерунҚытайКолумбияКлиппертон аралыКоста-РикаКубаКабо-Верд" + + "еКюрасаоКристмас аралыКипрЧех РеспубликасыГерманияДиего-ГарсияДжибутиДа" + + "нияДоминикаДоминикан РеспубликасыАлжирСеута мен МелильяЭквадорЭстонияМы" + + "сырБатыс СахараЭритреяИспанияЭфиопияЕуропалық ОдақФинляндияФиджиФолклен" + + "д аралдарыМикронезияФарер аралдарыФранцияГабонБіріккен КорольдікГренада" + + "ГрузияФранцуз ГвианасыГернсиГанаГибралтарГренландияГамбияГвинеяГваделуп" + + "аЭкваторлық ГвинеяГрецияОңтүстік Георгия және Оңтүстік Сандвич аралдары" + + "ГватемалаГуамГвинея-БисауГайанаҚытай Халық Республикасының Гонг-Конг ар" + + "найы әкімшілік ауданыХерд аралы мен Макдональд аралдарыГондурасХорватия" + + "ГаитиВенгрияКанар аралдарыИндонезияИрландияИзраильМэн аралыҮндістанҮнді" + + " мұхитындағы Британ аймағыИракИранИсландияИталияДжерсиЯмайкаИорданияЖапо" + + "нияКенияҚырғызстанКамбоджаКирибатиКоморСент-Китс және НевисОңтүстік Кор" + + "еяСолтүстік КореяКувейтКайман аралдарыҚазақстанЛаосЛиванСент-ЛюсияЛихте" + + "нштейнШри-ЛанкаЛиберияЛесотоЛитваЛюксембургЛатвияЛивияМороккоМонакоМолд" + + "оваЧерногорияСен-МартенМадагаскарМаршалл аралдарыМакедонияМалиМьянма (Б" + + "ирма)МоңғолияҚытай Халық Республикасының Макао арнайы әкімшілік ауданыС" + + "олтүстік Мариан аралдарыМартиникаМавританияМонтсерратМальтаМаврикийМаль" + + "див РеспубликасыМалавиМексикаМалайзияМозамбикНамибияЖаңа КаледонияНигер" + + "Норфолк аралыНигерияНикарагуаНидерландНорвегияНепалНауруНиуэЖаңа Зеланд" + + "ияОманПанамаПеруФранцуз ПолинезиясыПапуа — Жаңа ГвинеяФилиппинПәкістанП" + + "ольшаСен-Пьер және МикелонПиткэрн аралдарыПуэрто-РикоПалестина аймақтар" + + "ыПортугалияПалауПарагвайКатарАлыс ОкеанияРеюньонРумынияСербияРесейРуанд" + + "аСауд АрабиясыСоломон аралдарыСейшель аралдарыСуданШвецияСингапурӘулие " + + "Елена аралыСловенияШпицберген мен Ян-МайенСловакияСьерра-ЛеонеСан-Марин" + + "оСенегалСомалиСуринамОңтүстік СуданСан-Томе мен ПринсипиСальвадорСинт-М" + + "артенСирияСвазилендТристан-да-КуньяТеркс және Кайкос аралдарыЧадФранция" + + "ның оңтүстік аймақтарыТогоТайландТәжікстанТокелауТимор-ЛестеТүрікменста" + + "нТунисТонгаТүркияТринидад пен ТобагоТувалуТайваньТанзанияУкраинаУгандаА" + + "ҚШ-тың сыртқы кіші аралдарыАҚШУругвайӨзбекстанВатиканСент-Винсент және " + + "Гренадин аралдарыВенесуэлаБритандық Виргин аралдарыАҚШ-тың Виргин аралд" + + "арыВьетнамВануатуУоллис пен ФутунаСамоаКосовоЙеменМайоттаОңтүстік Африк" + + "а РеспубликасыЗамбияЗимбабвеБелгісіз аймақӘлемАфрикаСолтүстік АмерикаОң" + + "түстік АмерикаОкеанияБатыс АфрикаОрталық АмерикаШығыс АфрикаСолтүстік А" + + "фрикаОрталық АфрикаОңтүстік АфрикаСолтүстік және Оңтүстік АмерикаАмерик" + + "аның солтүстігіКарибШығыс АзияОңтүстік АзияОңтүстік-шығыс АзияОңтүстік " + + "ЕуропаАвстралазияМеланезияМикронезия аймағыПолинезияАзияОрталық АзияБат" + + "ыс АзияЕуропаШығыс ЕуропаСолтүстік ЕуропаБатыс ЕуропаЛатын Америкасы" + +var kkRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x001b, 0x0029, 0x0059, 0x006b, 0x008f, 0x009d, 0x00ab, + 0x00b9, 0x00b9, 0x00c5, 0x00d9, 0x00eb, 0x010c, 0x011a, 0x012c, + 0x0136, 0x0151, 0x0165, 0x0191, 0x01a1, 0x01b3, 0x01c1, 0x01d8, + 0x01e8, 0x01f6, 0x0204, 0x020e, 0x0227, 0x0244, 0x0250, 0x025e, + 0x0281, 0x0291, 0x02ac, 0x02b6, 0x02c9, 0x02d9, 0x02e9, 0x02f3, + 0x02ff, 0x0329, 0x0333, 0x0367, 0x039f, 0x03b1, 0x03c7, 0x03de, + 0x03e6, 0x03f4, 0x03fe, 0x040e, 0x042d, 0x0440, 0x0448, 0x045b, + 0x0469, 0x0484, 0x048c, 0x04ab, 0x04bb, 0x04d2, 0x04e0, 0x04ea, + // Entry 40 - 7F + 0x04fa, 0x0525, 0x052f, 0x054f, 0x055d, 0x056b, 0x0575, 0x058c, + 0x059a, 0x05a8, 0x05b6, 0x05d1, 0x05e3, 0x05ed, 0x060e, 0x0622, + 0x063d, 0x064b, 0x0655, 0x0678, 0x0686, 0x0692, 0x06b1, 0x06bd, + 0x06c5, 0x06d7, 0x06eb, 0x06f7, 0x0703, 0x0715, 0x0736, 0x0742, + 0x079b, 0x07ad, 0x07b5, 0x07cc, 0x07d8, 0x084b, 0x088b, 0x089b, + 0x08ab, 0x08b5, 0x08c3, 0x08de, 0x08f0, 0x0900, 0x090e, 0x091f, + 0x092f, 0x0968, 0x0970, 0x0978, 0x0988, 0x0994, 0x09a0, 0x09ac, + 0x09bc, 0x09ca, 0x09d4, 0x09e8, 0x09f8, 0x0a08, 0x0a12, 0x0a37, + // Entry 80 - BF + 0x0a52, 0x0a6f, 0x0a7b, 0x0a98, 0x0aaa, 0x0ab2, 0x0abc, 0x0acf, + 0x0ae5, 0x0af6, 0x0b04, 0x0b10, 0x0b1a, 0x0b2e, 0x0b3a, 0x0b44, + 0x0b52, 0x0b5e, 0x0b6c, 0x0b80, 0x0b93, 0x0ba7, 0x0bc6, 0x0bd8, + 0x0be0, 0x0bf9, 0x0c09, 0x0c75, 0x0ca5, 0x0cb7, 0x0ccb, 0x0cdf, + 0x0ceb, 0x0cfb, 0x0d22, 0x0d2e, 0x0d3c, 0x0d4c, 0x0d5c, 0x0d6a, + 0x0d85, 0x0d8f, 0x0da8, 0x0db6, 0x0dc8, 0x0dda, 0x0dea, 0x0df4, + 0x0dfe, 0x0e06, 0x0e1f, 0x0e27, 0x0e33, 0x0e3b, 0x0e60, 0x0e84, + 0x0e94, 0x0ea4, 0x0eb0, 0x0ed7, 0x0ef6, 0x0f0b, 0x0f30, 0x0f44, + // Entry C0 - FF + 0x0f4e, 0x0f5e, 0x0f68, 0x0f7f, 0x0f8d, 0x0f9b, 0x0fa7, 0x0fb1, + 0x0fbd, 0x0fd6, 0x0ff5, 0x1014, 0x101e, 0x102a, 0x103a, 0x105a, + 0x106a, 0x1095, 0x10a5, 0x10bc, 0x10cf, 0x10dd, 0x10e9, 0x10f7, + 0x1112, 0x1139, 0x114b, 0x1160, 0x116a, 0x117c, 0x119a, 0x11cb, + 0x11d1, 0x1209, 0x1211, 0x121f, 0x1231, 0x123f, 0x1254, 0x126c, + 0x1276, 0x1280, 0x128c, 0x12b0, 0x12bc, 0x12ca, 0x12da, 0x12e8, + 0x12f4, 0x1328, 0x132e, 0x133c, 0x134e, 0x135c, 0x139e, 0x13b0, + 0x13e0, 0x140b, 0x1419, 0x1427, 0x1447, 0x1451, 0x145d, 0x1467, + // Entry 100 - 13F + 0x1475, 0x14ab, 0x14b7, 0x14c7, 0x14e2, 0x14ea, 0x14f6, 0x1517, + 0x1536, 0x1544, 0x155b, 0x1578, 0x158f, 0x15ae, 0x15c9, 0x15e6, + 0x1621, 0x164a, 0x1654, 0x1667, 0x1680, 0x16a4, 0x16c1, 0x16d7, + 0x16e9, 0x170a, 0x171c, 0x1724, 0x173b, 0x174e, 0x175a, 0x1771, + 0x1790, 0x17a7, 0x17c4, +} // Size: 606 bytes + +var kmRegionStr string = "" + // Size: 9048 bytes + "កោះ\u200bអាសេនសិនអង់ដូរ៉ាអារ៉ាប់រួមអាហ្វហ្គានីស្ថានអង់ទីគ័រ និង\u200bបាប" + + "ុយដាអង់កូឡាអាល់បានីអារមេនីអង់ហ្គោឡាអង់តាក់ទិកអាហ្សង់ទីនសាម៉ូអាអាមេរិកអ" + + "ូទ្រីសអូស្ត្រាលីអារូបាកោះ\u200bអាឡាំងអាហ៊្សែរបែហ្សង់បូស្នី និងហឺហ្សីហ្" + + "គូវីណាបារបាដូសបង់ក្លាដេស្ហបែលហ្ស៉ិកប៊ូរគីណាហ្វាសូប៊ុលហ្គារីបារ៉ែនប៊ូរុ" + + "នឌីបេណាំងសង់ បាតេឡេម៉ីប៊ឺមុយដាប្រ៊ុយណេបូលីវីហុល្លង់ ការ៉ាប៊ីនប្រេស៊ីលប" + + "ាហាម៉ាប៊ូតានកោះ\u200bប៊ូវ៉េតបុតស្វាណាបេឡារុស្សបេលីហ្សកាណាដាកោះ\u200bកូ" + + "កូសកុងហ្គោ- គីនស្ហាសាសាធារណរដ្ឋអាហ្វ្រិកកណ្ដាលកុងហ្គោ - ប្រាហ្សាវីលស្វ" + + "ីសកូដឌីវ័រកោះ\u200bខូកស៊ីលីកាមេរូនចិនកូឡុំប៊ីកោះ\u200bឃ្លីភឺតុនកូស្តារ" + + "ីកាគុយបាកាបវែរកូរ៉ាកៅកោះ\u200bគ្រីស្មាសស៊ីពរ៍សាធារណរដ្ឋឆេកអាល្លឺម៉ង់ឌៀ" + + "ហ្គោហ្គាស៊ីហ្ស៊ីបូទីដាណឺម៉ាកដូមីនីកាសាធារណរដ្ឋដូមីនីកែនអាល់ហ្សេរីជឺតា " + + "និង\u200bម៉េលីឡាអេក្វាឌ័រអេស្តូនីអេហ្ស៊ីបសាហារ៉ាខាងលិចអេរីទ្រាអេស្ប៉ាញ" + + "អេត្យូពីសហភាព\u200bអឺរ៉ុបហ្វាំងឡង់ហ្វីជីកោះ\u200bហ្វក់ឡែនមីក្រូនេស៊ីកោ" + + "ះ\u200bហ្វារ៉ូបារាំងហ្គាបុងចក្រភព\u200bអង់គ្លេសហ្គ្រីណាដាហ្សកហ្ស៉ីហ្គៀ" + + "ណាបារាំងហ្គេនស៊ីហ្គាណាហ្គីប្រាលតាហ្គ្រោអង់ឡង់ហ្គាំប៊ីហ្គីណេហ្គោដឺឡុបហ្" + + "គីណេអេក្វាទ័រក្រិចកោះ\u200bហ្សកហ្ស៊ី\u200bខាង\u200bត្បូង និង\u200bសាន់" + + "វិច\u200bខាង\u200bត្បូងហ្គាតេម៉ាឡាហ្គាំហ្គីណេប៊ីសូហ្គីយ៉ាណាហុងកុងកោះ" + + "\u200bហឺដ និង\u200bម៉ាក់ដូណាល់ហុងឌួរ៉ាស់ក្រូអាតហៃទីហុងគ្រីកោះ\u200bកាណារ" + + "ីឥណ្ឌូណេស៊ីអៀរឡង់អ៊ីស្រាអែលអែលអុហ្វមែនឥណ្ឌាដែន\u200bមហា\u200bសមុទ្រ" + + "\u200bឥណ្ឌា ចក្រភព\u200bអង់គ្លេសអ៊ីរ៉ាក់អ៊ីរ៉ង់អ៊ីស្លង់អ៊ីតាលីជឺស៊ីចាម៉ៃ" + + "កាហ៊្សកដានីជប៉ុនកេនយ៉ាគៀរហ្គីស្តង់កម្ពុជាគិរិបាទីកុំម៉ូរ៉ូសសង់ឃីត និង" + + "\u200bណេវីសកូរ៉េ\u200bខាង\u200bជើងកូរ៉េ\u200bខាង\u200bត្បូងគុយវ៉ែតកោះ" + + "\u200bកៃម៉ង់កាហ្សាក់ស្តង់់ឡាវលីបង់សង់\u200bលូសៀលិចទេនស្តែនស្រីលង្កាលីបេរ" + + "ីយ៉ាលើសូតូលីទុយអានីលុចហ្សំបួរឡាតវីយ៉ាលីប៊ីម៉ារ៉ុកម៉ូណាកូសាធារណរដ្ឋម៉ុល" + + "ដាវីម៉ុងតេណេហ្គ្រោសង់\u200bម៉ាទីនម៉ាដាហ្កាស្ការកោះ\u200bម៉ាស់សលម៉ាសេដូ" + + "នាម៉ាលីមីយ៉ាន់ម៉ា (ភូមា)ម៉ុងហ្គោលីម៉ាកាវកោះ\u200bម៉ារីណា\u200bខាង" + + "\u200bជើងម៉ាទីនីកម៉ូរីតានីម៉ុង\u200bសេរ៉ង់ម៉ាល់តាម៉ូរីទុសម៉ាល់ឌីវម៉ាឡាវី" + + "ម៉ិចសិកម៉ាឡេស៊ីម៉ូហ្សាំប៊ិកណាមីប៊ីញូកាឡេដូនៀនីហ្សេរកោះ\u200bណ័រហ្វក់នី" + + "ហ្សេរីយ៉ានីការ៉ាហ្គ័រហុល្លង់ន័រវែសនេប៉ាល់ណូរូណៀនូវែលហ្សេឡង់អូម៉ង់ប៉ាណា" + + "ម៉ាប៉េរូប៉ូលី\u200bណេស៊ី\u200bបារាំងប៉ាពួញ៉ូហ្គីណេហ្វីលីពីនប៉ាគីស្ថានប" + + "៉ូឡូញសង់ព្យែរ និង\u200bមីគីឡុងកោះ\u200bភីតខារិនព័រតូរីកូដែន\u200bប៉ាលេ" + + "ស្ទីនព័រទុយហ្កាល់ផៅឡូប៉ារ៉ាហ្គាយកាតាតំបន់ជាយអូសេអានីរ៉េអ៊ុយ៉ុងរូម៉ានីស" + + "៊ែបរុស្ស៊ីរវ៉ាន់ដាអារ៉ាប៊ីសាអ៊ូឌីតកោះ\u200bស៊ូឡូម៉ុងសីសែលស៊ូដង់ស៊ុយអែដ" + + "សិង្ហបុរីសង់\u200bហេឡេណាស្លូវេនីស្វាប៊ឺត និង\u200bហ្យង់ម៉ាយេនស្លូវ៉ាគី" + + "សេរ៉ាឡេអូនសាន\u200bម៉ារីណូសេនេហ្កាល់សូម៉ាលីសូរីណាមស៊ូដង់\u200bខាង" + + "\u200bត្បូងសៅ\u200bតូមេ និង\u200bព្រីនស៊ីប៉េអែលសាល់វ៉ាឌ័រសីង\u200bម៉ាធីន" + + "ស៊ីរីស្វាហ្ស៊ីឡង់ទ្រីស្តង់\u200bដា\u200bចូនហាកោះ\u200bកៃកូស និងទូកឆាដដ" + + "ែន\u200bបារាំង\u200bខាង\u200bត្បូងតូហ្គោថៃតាជីគីស្តង់តូខេឡៅទីម័រទួគមេន" + + "ីស្តង់ទុយនេស៊ីតុងហ្គាទួរគីទ្រីនីដាត និង\u200bតូបាហ្គោទូវ៉ាលូតៃវ៉ាន់តង់" + + "ហ្សានីអ៊ុយក្រែនអ៊ូហ្កង់ដាកោះ\u200bអៅឡាយីង\u200bអាមេរិកសហរដ្ឋអាមេរិកអ៊ុ" + + "យរ៉ាហ្គាយអ៊ូហ្សបេគីស្តង់ទីក្រុងវ៉ាទីកង់សាំង\u200bវីនសេន និង\u200bឌឹ" + + "\u200bហ្គ្រីណាឌីនីសវេនេហ្ស៊ុយឡាកោះ\u200bវឺជិន\u200bចក្រភព\u200bអង់គ្លេសក" + + "ោះ\u200bវឺជីន\u200bអាមេរិកវៀតណាមវ៉ានូអាទូវ៉ាលីស និង\u200bហ្វូទូណាសា" + + "\u200bម៉ូអាកូសូវ៉ូយេមែនម៉ាយុតអាហ្វ្រិកខាងត្បូងហ្សាំប៊ីហ្ស៊ីមបាវ៉េតំបន់មិ" + + "នស្គាល់ពិភពលោកអាហ្វ្រិកអាមេរិក\u200bខាង\u200bជើងអាមេរិក\u200bខាង\u200b" + + "ត្បូងអូសេអានីអាហ្វ្រិក\u200bខាង\u200bលិចអាមេរិក\u200bកណ្ដាលអាហ្វ្រិកខា" + + "ងកើតអាហ្វ្រិក\u200bខាង\u200bជើងអាហ្វ្រិក\u200bកណ្តាលអាហ្វ្រិកភាគខាងត្ប" + + "ូងអាមេរិកអាមេរិក\u200bភាគ\u200bខាង\u200bជើងការ៉ាប៊ីនអាស៊ី\u200bខាង" + + "\u200bកើតអាស៊ី\u200bខាង\u200bត្បូងអាស៊ីអាគ្នេយ៍អឺរ៉ុប\u200bខាង\u200bត្បូ" + + "ងអូស្ត្រាឡាស៊ីមេឡាណេស៊ីតំបន់\u200bមីក្រូណេស៊ីប៉ូលីណេស៊ីអាស៊ីអាស៊ី" + + "\u200bកណ្ដាលអាស៊ី\u200bខាង\u200bលិចអឺរ៉ុបអឺរ៉ុប\u200bខាង\u200bកើតអឺរ៉ុប" + + "\u200bខាង\u200bជើងអឺរ៉ុប\u200bខាង\u200bលិចអាមេរិក\u200bឡាទីន" + +var kmRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0024, 0x003c, 0x005a, 0x008a, 0x00c4, 0x00d9, 0x00f1, + 0x0106, 0x0106, 0x0121, 0x013f, 0x015d, 0x0187, 0x019c, 0x01ba, + 0x01cc, 0x01ea, 0x0217, 0x025d, 0x0275, 0x0299, 0x02b4, 0x02de, + 0x02fc, 0x030e, 0x0326, 0x0338, 0x035d, 0x0375, 0x038d, 0x039f, + 0x03d0, 0x03e8, 0x03fd, 0x040f, 0x0430, 0x044b, 0x0466, 0x047b, + 0x048d, 0x04a8, 0x04da, 0x0525, 0x055e, 0x056d, 0x0585, 0x059a, + 0x05a9, 0x05be, 0x05c7, 0x05df, 0x0606, 0x0624, 0x0633, 0x0645, + 0x065a, 0x0681, 0x0693, 0x06ba, 0x06d8, 0x06ff, 0x071a, 0x0732, + // Entry 40 - 7F + 0x074a, 0x0783, 0x07a1, 0x07cf, 0x07ea, 0x0802, 0x081a, 0x0841, + 0x0859, 0x0871, 0x0889, 0x08ad, 0x08c8, 0x08da, 0x08fe, 0x091f, + 0x0940, 0x0952, 0x0967, 0x0994, 0x09b2, 0x09cd, 0x09f1, 0x0a09, + 0x0a1b, 0x0a3c, 0x0a60, 0x0a78, 0x0a8a, 0x0aa5, 0x0ad2, 0x0ae1, + 0x0b66, 0x0b87, 0x0b96, 0x0bb7, 0x0bd2, 0x0be4, 0x0c27, 0x0c45, + 0x0c5a, 0x0c66, 0x0c7b, 0x0c99, 0x0cb7, 0x0cc9, 0x0ce7, 0x0d08, + 0x0d17, 0x0d81, 0x0d99, 0x0dae, 0x0dc6, 0x0ddb, 0x0dea, 0x0dff, + 0x0e1a, 0x0e29, 0x0e3b, 0x0e5f, 0x0e74, 0x0e8c, 0x0eaa, 0x0ed8, + // Entry 80 - BF + 0x0eff, 0x0f2c, 0x0f41, 0x0f5f, 0x0f89, 0x0f92, 0x0fa1, 0x0fb9, + 0x0fda, 0x0ff5, 0x1010, 0x1022, 0x103d, 0x105b, 0x1073, 0x1082, + 0x1097, 0x10ac, 0x10e2, 0x110c, 0x112a, 0x1154, 0x1175, 0x1190, + 0x119f, 0x11cc, 0x11ea, 0x11fc, 0x1235, 0x124d, 0x1268, 0x1289, + 0x129e, 0x12b6, 0x12ce, 0x12e3, 0x12f8, 0x1310, 0x1334, 0x1349, + 0x1367, 0x137c, 0x13a0, 0x13c1, 0x13e5, 0x13fa, 0x140c, 0x1421, + 0x142d, 0x1433, 0x1457, 0x1469, 0x1481, 0x1490, 0x14c6, 0x14f0, + 0x150b, 0x1529, 0x153b, 0x1575, 0x1599, 0x15b4, 0x15de, 0x1602, + // Entry C0 - FF + 0x160e, 0x162f, 0x163b, 0x166b, 0x1689, 0x169e, 0x16aa, 0x16bf, + 0x16d7, 0x1707, 0x172e, 0x173d, 0x174f, 0x1764, 0x177f, 0x179d, + 0x17b5, 0x17fb, 0x1816, 0x1834, 0x1855, 0x1873, 0x1888, 0x189d, + 0x18cd, 0x1910, 0x1937, 0x1955, 0x1964, 0x1988, 0x19be, 0x19ec, + 0x19f5, 0x1a31, 0x1a43, 0x1a49, 0x1a6a, 0x1a7c, 0x1a8b, 0x1aaf, + 0x1ac7, 0x1adc, 0x1aeb, 0x1b2b, 0x1b40, 0x1b55, 0x1b70, 0x1b8b, + 0x1ba9, 0x1be2, 0x1c09, 0x1c2d, 0x1c5a, 0x1c87, 0x1ce5, 0x1d09, + 0x1d54, 0x1d87, 0x1d99, 0x1db4, 0x1deb, 0x1e03, 0x1e18, 0x1e27, + // Entry 100 - 13F + 0x1e39, 0x1e6c, 0x1e84, 0x1ea5, 0x1ecf, 0x1ee4, 0x1eff, 0x1f2c, + 0x1f5f, 0x1f77, 0x1faa, 0x1fd4, 0x2001, 0x2034, 0x2064, 0x20a0, + 0x20b5, 0x20ee, 0x2109, 0x2130, 0x215d, 0x2184, 0x21b4, 0x21db, + 0x21f6, 0x2229, 0x2247, 0x2256, 0x227a, 0x22a1, 0x22b3, 0x22dd, + 0x2307, 0x2331, 0x2358, +} // Size: 606 bytes + +var knRegionStr string = "" + // Size: 9427 bytes + "ಅಸೆನ್ಶನ್ ದ್ವೀಪಅಂಡೋರಾಸಂಯುಕ್ತ ಅರಬ್ ಎಮಿರೇಟಸ್ಅಫಘಾನಿಸ್ಥಾನ್ಆಂಟಿಗುವಾ ಮತ್ತು ಬರ್ಬ" + + "ುಡಾಆಂಗುಯಿಲ್ಲಾಅಲ್ಬೇನಿಯಾಅರ್ಮೇನಿಯಾನೆದರ್\u200cಲ್ಯಾಂಡ್ಅಂಗೋಲಾಅಂಟಾರ್ಟಿಕಾಅರ್ಜೆ" + + "ಂಟಿನಾಅಮೇರಿಕನ್ ಸಮೋವಾಆಸ್ಟ್ರಿಯಾಆಸ್ಟ್ರೇಲಿಯಅರುಬಾಆಲ್ಯಾಂಡ್ ದ್ವೀಪಗಳುಅಜರ್ಬೈಜಾನ್" + + "ಬೋಸ್ನಿಯಾ ಮತ್ತು ಹರ್ಜೆಗೋವಿನಾಬಾರ್ಬಡೋಸ್ಬಾಂಗ್ಲಾದೇಶ್ಬೆಲ್ಜಿಯಮ್ಬುರ್ಕಿನಾ ಫಾಸೋಬಲ" + + "್ಗೇರಿಯಾಬಹರೈನ್ಬುರುಂಡಿಬೆನಿನ್ಸೇಂಟ್ ಬಾರ್ಥೆಲೆಮಿಬರ್ಮುಡಾಬ್ರೂನಿಬೊಲಿವಿಯಾಕೆರೀಬಿಯ" + + "ನ್ ನೆದರ್\u200cಲ್ಯಾಂಡ್ಸ್ಬ್ರೆಜಿಲ್ಬಹಾಮಾಸ್ಭೂತಾನ್ಬೋವೆಟ್ ದ್ವೀಪಬೋಟ್ಸ್\u200cವಾ" + + "ನಾಬೆಲಾರಸ್ಬೆಲಿಜ್ಕೆನಡಾಕೊಕೊಸ್ (ಕೀಲಿಂಗ್) ದ್ವೀಪಗಳುಕಾಂಗೋ - ಕಿನ್ಶಾಸಾಮಧ್ಯ ಆಫ್ರ" + + "ಿಕಾ ಗಣರಾಜ್ಯಕಾಂಗೋ - ಬ್ರಾಜಾವಿಲ್ಲೇಸ್ವಿಟ್ಜರ್ಲ್ಯಾಂಡ್ಕೋತ್\u200c ದಿವಾರ್\u200d" + + "ಕುಕ್ ದ್ವೀಪಗಳುಚಿಲಿಕ್ಯಾಮರೋನ್ಚೀನಾಕೊಲಂಬಿಯಾಕ್ಲಿಪ್ಪರ್\u200cಟಾನ್ ದ್ವೀಪಗಳುಕೊಸ್" + + "ಟಾ ರಿಕಾಕ್ಯೂಬಾಕೇಪ್ ವರ್ಡೆಕುರಾಕಾವ್ಕ್ರಿಸ್ಮಸ್ ದ್ವೀಪಸೈಪ್ರಸ್ಚೆಕ್ ರಿಪಬ್ಲಿಕ್ಜರ್" + + "ಮನಿಡೈಗೋ ಗಾರ್ಸಿಯಜಿಬೋಟಿಡೆನ್ಮಾರ್ಕ್ಡೊಮಿನಿಕಾಡೊಮೆನಿಕನ್ ರಿಪಬ್ಲಿಕ್ಅಲ್ಗೇರಿಯಾಸೆಯ" + + "ುಟಾ ಹಾಗೂ ಮೆಲಿಲ್ಲಾಈಕ್ವೆಡಾರ್ಎಸ್ಟೋನಿಯಾಈಜಿಪ್ಟ್ಪಶ್ಚಿಮ ಸಹಾರಾಏರಿಟ್ರಿಯಾಸ್ಪೇನ್ಇ" + + "ಥಿಯೋಪಿಯಾಯುರೋಪಿಯನ್ ಯೂನಿಯನ್ಫಿನ್\u200cಲ್ಯಾಂಡ್ಫಿಜಿಫಾಲ್ಕ್\u200cಲ್ಯಾಂಡ್ ದ್ವೀ" + + "ಪಗಳುಮೈಕ್ರೋನೇಶಿಯಾಫರೋ ದ್ವೀಪಗಳುಫ್ರಾನ್ಸ್ಗೆಬೊನ್ಬ್ರಿಟನ್/ಇಂಗ್ಲೆಂಡ್ಗ್ರೆನೆಡಾಜಾರ" + + "್ಜಿಯಾಫ್ರೆಂಚ್ ಗಯಾನಾಗುರ್ನ್\u200cಸೆಘಾನಾಗಿಬ್ರಾಲ್ಟರ್ಗ್ರೀನ್\u200cಲ್ಯಾಂಡ್ಗ್ಯಾ" + + "ಂಬಿಯಾಗಿನಿಗುಡೆಲೋಪ್ಈಕ್ವೆಟೋರಿಯಲ್ ಗಿನಿಗ್ರೀಸ್ದಕ್ಷಿಣ ಜಾರ್ಜಿಯಾ ಮತ್ತು ದಕ್ಷಿಣ ಸ" + + "್ಯಾಂಡ್\u200dವಿಚ್ ದ್ವೀಪಗಳುಗ್ವಾಟೆಮಾಲಾಗುಯಾಮ್ಗಿನಿ-ಬಿಸ್ಸಾವ್ಗಯಾನಾಹಾಂಗ್ ಕಾಂಗ್" + + " SAR ಚೈನಾಹರ್ಡ್ ದ್ವೀಪ ಮತ್ತು ಮ್ಯಾಕ್\u200dಡೊನಾಲ್ಡ್ ದ್ವೀಪಗಳುಹೊಂಡುರಾಸ್ಕ್ರೊಯೇಶ" + + "ಿಯಾಹೈಟಿಹಂಗಾರಿಕ್ಯಾನರಿ ದ್ವೀಪಗಳುಇಂಡೋನೇಶಿಯಾಐರ್ಲೆಂಡ್ಇಸ್ರೇಲ್ಐಲ್ ಆಫ್ ಮ್ಯಾನ್ಭಾ" + + "ರತಬ್ರಿಟೀಶ್ ಇಂಡಿಯನ್ ಮಹಾಸಾಗರ ಪ್ರದೇಶಇರಾಕ್ಇರಾನ್ಐಸ್\u200cಲ್ಯಾಂಡ್ಇಟಲಿಜೆರ್ಸಿಜ" + + "ಮೈಕಾಜೋರ್ಡಾನ್ಜಪಾನ್ಕೀನ್ಯಾಕಿರ್ಗಿಸ್ಥಾನ್ಕಾಂಬೋಡಿಯಾಕಿರಿಬಾತಿಕೊಮೊರೊಸ್ಸೇಂಟ್ ಕಿಟ್" + + "ಸ್ ಮತ್ತು ನೆವಿಸ್ಉತ್ತರ ಕೋರಿಯಾದಕ್ಷಿಣ ಕೋರಿಯಾಕುವೈತ್ಕೇಮನ್ ದ್ವೀಪಗಳುಕಝಾಕಿಸ್ಥಾನ" + + "್ಲಾವೋಸ್ಲೆಬನಾನ್ಸೇಂಟ್ ಲೂಸಿಯಾಲಿಚೆನ್\u200cಸ್ಟೈನ್ಶ್ರೀಲಂಕಾಲಿಬೇರಿಯಾಲೆಸೊಥೋಲಿಥು" + + "ವೇನಿಯಾಲಕ್ಸಂಬರ್ಗ್ಲಾಟ್ವಿಯಾಲಿಬಿಯಾಮೊರಾಕ್ಕೊಮೊನಾಕೊಮೊಲ್ಡೋವಾಮೊಂಟೆನೆಗ್ರೋಸೇಂಟ್ ಮ" + + "ಾರ್ಟಿನ್ಮಡಗಾಸ್ಕರ್ಮಾರ್ಷಲ್ ದ್ವೀಪಗಳುಮ್ಯಾಸಿಡೋನಿಯಾಮಾಲಿಮಯನ್ಮಾರ್ (ಬರ್ಮಾ)ಮೊಂಗೋಲ" + + "ಿಯಾಮಖಾವ್ (SAR) ಚೈನಾಉತ್ತರ ಮರಿಯಾನಾ ದ್ವೀಪಗಳುಮಾರ್ಟಿನಿಕ್ಮಾರಿಟೇನಿಯಾಮಾಂಟ್" + + "\u200cಸೆರೇಟ್ಮಾಲ್ಟಾಮಾರಿಶಿಯಸ್ಮಾಲ್ಡಿವ್ಸ್ಮಲಾವಿಮೆಕ್ಸಿಕೊಮಲೇಶಿಯಾಮೊಜಾಂಬಿಕ್ನಮೀಬಿಯ" + + "ಾನ್ಯೂ ಕ್ಯಾಲಿಡೋನಿಯಾನೈಜರ್ನಾರ್ಫೋಕ್ ದ್ವೀಪನೈಜೀರಿಯಾನಿಕಾರಾಗುವಾನೆದರ್\u200cಲ್ಯಾ" + + "ಂಡ್ಸ್ನಾರ್ವೇನೇಪಾಳನೌರುನಿಯುನ್ಯೂಜಿಲೆಂಡ್ಓಮನ್ಪನಾಮಾಪೆರುಫ್ರೆಂಚ್ ಪಾಲಿನೇಷ್ಯಾಪಪುವ" + + "ಾ ನ್ಯೂಗಿನಿಯಾಫಿಲಿಫೈನ್ಸ್ಪಾಕಿಸ್ತಾನಪೋಲ್ಯಾಂಡ್ಸೇಂಟ್ ಪಿಯರೆ ಮತ್ತು ಮಿಕೆಲನ್ಪಿಟ್" + + "\u200cಕೈರ್ನ್ ದ್ವೀಪಗಳುಪ್ಯೂರ್ಟೋ ರಿಕೊಪ್ಯಾಲೇಸ್ಟೇನಿಯನ್ ಪ್ರದೇಶಪೋರ್ಚುಗಲ್ಪಲಾವುಪರ" + + "ಾಗ್ವೇಖತಾರ್ಔಟ್ ಲೈಯಿಂಗ್ ಓಷಿಯಾನಿಯಾರೀಯೂನಿಯನ್ರೊಮೇನಿಯಾಸೆರ್ಬಿಯಾರಷ್ಯಾರುವಾಂಡಾಸೌ" + + "ದಿ ಅರೇಬಿಯಾಸೊಲೊಮನ್ ದ್ವೀಪಗಳುಸೀಶೆಲ್ಲೆಸ್ಸೂಡಾನ್ಸ್ವೀಡನ್ಸಿಂಗಾಪುರ್ಸೇಂಟ್ ಹೆಲೆನಾ" + + "ಸ್ಲೋವೇನಿಯಾಸ್ವಾಲ್ಬಾರ್ಡ್ ಮತ್ತು ಜಾನ್ ಮೆಯನ್ಸ್ಲೋವೇಕಿಯಾಸಿಯೆರ್ರಾ ಲಿಯೋನ್ಸ್ಯಾನ್" + + " ಮೆರಿನೋಸೆನೆಗಲ್ಸೊಮಾಲಿಯಾಸುರಿನಾಮದಕ್ಷಿಣ ಸೂಡಾನ್ಸಾವೋ ಟೋಮ್ ಮತ್ತು ಪ್ರಿನ್ಸಿಪಿಎಲ್ " + + "ಸಾಲ್ವೇಡಾರ್ಸಿಂಟ್ ಮಾರ್ಟೆನ್ಸಿರಿಯಾಸ್ವಾಜಿಲ್ಯಾಂಡ್ಟ್ರಿಸ್ತನ್ ಡಾ ಕುನ್ಹಾಟರ್ಕ್ಸ್ " + + "ಮತ್ತು ಕೈಕೋಸ್ ದ್ವೀಪಗಳುಚಾದ್ಫ್ರೆಂಚ್ ದಕ್ಷಿಣ ಪ್ರದೇಶಗಳುಟೋಗೋಥೈಲ್ಯಾಂಡ್ತಜಾಕಿಸ್ಥ" + + "ಾನ್ಟೊಕೆಲಾವ್ಪೂರ್ವ ತಿಮೋರ್ತುರ್ಕ್ಮೇನಿಸ್ಥಾನ್ಟುನಿಶಿಯಾಟೊಂಗಟರ್ಕಿಟ್ರಿನಿಡಾಡ್ ಮತ್" + + "ತು ಟೊಬಾಗೊಟುವಾಲುಥೈವಾನ್ತಾಂಜೇನಿಯಾಉಕ್ರೈನ್ಉಗಾಂಡಾಯುಎಸ್\u200c. ಔಟ್\u200cಲೇಯಿಂ" + + "ಗ್ ದ್ವೀಪಗಳುಅಮೇರಿಕಾ ಸಂಯುಕ್ತ ಸಂಸ್ಥಾನಉರುಗ್ವೇಉಜ್ಬೇಕಿಸ್ಥಾನ್ವ್ಯಾಟಿಕನ್ಸೇಂಟ್. " + + "ವಿನ್ಸೆಂಟ್ ಮತ್ತು ಗ್ರೆನೆಡೈನ್ಸ್ವೆನೆಜುವೆಲಾಬ್ರಿಟಿಷ್ ವರ್ಜಿನ್ ದ್ವೀಪಗಳುಯು.ಎಸ್." + + " ವರ್ಜಿನ್ ದ್ವೀಪಗಳುವಿಯೇಟ್ನಾಮ್ವನೌಟುವಾಲಿಸ್ ಮತ್ತು ಫುಟುನಾಸಮೋವಾಕೊಸೊವೊಯೆಮನ್ಮಯೊಟ್" + + "ಟೆದಕ್ಷಿಣ ಆಫ್ರಿಕಾಝಾಂಬಿಯಾಜಿಂಬಾಬ್ವೆಅಜ್ಞಾತ ಪ್ರದೇಶಪ್ರಪಂಚಆಫ್ರಿಕಾಉತ್ತರ ಅಮೇರಿಕ" + + "ಾದಕ್ಷಿಣ ಅಮೇರಿಕಾಓಶಿಯೇನಿಯಾಪಶ್ಚಿಮ ಆಫ್ರಿಕಾಮಧ್ಯ ಅಮೇರಿಕಾಪೂರ್ವ ಆಫ್ರಿಕಾಉತ್ತರ ಆ" + + "ಫ್ರಿಕಾಮಧ್ಯ ಆಫ್ರಿಕಾಆಫ್ರಿಕಾದ ದಕ್ಷಿಣ ಭಾಗಅಮೆರಿಕಾಸ್ಅಮೇರಿಕಾದ ಉತ್ತರ ಭಾಗಕೆರೀಬಿ" + + "ಯನ್ಪೂರ್ವ ಏಷ್ಯಾದಕ್ಷಿಣ ಏಷ್ಯಾಆಗ್ನೇಯ ಏಷ್ಯಾದಕ್ಷಿಣ ಯೂರೋಪ್ಆಸ್ಟ್ರೇಲೇಷ್ಯಾಮೆಲನೇಷ" + + "ಿಯಾಮೈಕ್ರೋನೇಶಿಯನ್ ಪ್ರದೇಶಪಾಲಿನೇಷ್ಯಾಏಷ್ಯಾಮಧ್ಯ ಏಷ್ಯಾಪಶ್ಚಿಮ ಏಷ್ಯಾಯೂರೋಪ್ಪೂರ್" + + "ವ ಯೂರೋಪ್ಉತ್ತರ ಯೂರೋಪ್ಪಶ್ಚಿಮ ಯೂರೋಪ್ಲ್ಯಾಟಿನ್ ಅಮೇರಿಕಾ" + +var knRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0028, 0x003a, 0x0075, 0x0099, 0x00d7, 0x00f5, 0x0110, + 0x012b, 0x0152, 0x0164, 0x0182, 0x01a0, 0x01c8, 0x01e3, 0x0201, + 0x0210, 0x0241, 0x025f, 0x02a9, 0x02c4, 0x02e5, 0x0300, 0x0325, + 0x0340, 0x0352, 0x0367, 0x0379, 0x03a7, 0x03bc, 0x03ce, 0x03e6, + 0x042f, 0x0447, 0x045c, 0x046e, 0x0490, 0x04b1, 0x04c6, 0x04d8, + 0x04e7, 0x052a, 0x0554, 0x058c, 0x05c2, 0x05f2, 0x0617, 0x063c, + 0x0648, 0x0663, 0x066f, 0x0687, 0x06ca, 0x06e9, 0x06fb, 0x0717, + 0x072f, 0x075a, 0x076f, 0x0797, 0x07a9, 0x07cb, 0x07dd, 0x07fb, + // Entry 40 - 7F + 0x0813, 0x084a, 0x0865, 0x089d, 0x08b8, 0x08d3, 0x08e8, 0x090a, + 0x0925, 0x0937, 0x0952, 0x0983, 0x09a7, 0x09b3, 0x09f6, 0x0a1a, + 0x0a3c, 0x0a54, 0x0a66, 0x0a97, 0x0aaf, 0x0ac7, 0x0aec, 0x0b07, + 0x0b13, 0x0b34, 0x0b5e, 0x0b79, 0x0b85, 0x0b9d, 0x0bce, 0x0be0, + 0x0c6c, 0x0c8a, 0x0c9c, 0x0cc1, 0x0cd0, 0x0d00, 0x0d76, 0x0d91, + 0x0daf, 0x0dbb, 0x0dcd, 0x0dfb, 0x0e19, 0x0e31, 0x0e46, 0x0e6c, + 0x0e78, 0x0ecf, 0x0ede, 0x0eed, 0x0f0e, 0x0f1a, 0x0f2c, 0x0f3b, + 0x0f53, 0x0f62, 0x0f74, 0x0f98, 0x0fb3, 0x0fcb, 0x0fe3, 0x1028, + // Entry 80 - BF + 0x104a, 0x106f, 0x1081, 0x10a9, 0x10ca, 0x10dc, 0x10f1, 0x1113, + 0x113a, 0x1152, 0x116a, 0x117c, 0x119a, 0x11b8, 0x11d0, 0x11e2, + 0x11fa, 0x120c, 0x1224, 0x1245, 0x126d, 0x1288, 0x12b6, 0x12da, + 0x12e6, 0x1310, 0x132b, 0x134d, 0x138b, 0x13a9, 0x13c7, 0x13eb, + 0x13fd, 0x1418, 0x1436, 0x1445, 0x145d, 0x1472, 0x148d, 0x14a2, + 0x14d3, 0x14e2, 0x150a, 0x1522, 0x1540, 0x156d, 0x157f, 0x158e, + 0x159a, 0x15a6, 0x15c7, 0x15d3, 0x15e2, 0x15ee, 0x1622, 0x1650, + 0x166e, 0x1689, 0x16a4, 0x16e9, 0x1723, 0x1748, 0x1788, 0x17a3, + // Entry C0 - FF + 0x17b2, 0x17c7, 0x17d6, 0x1811, 0x182c, 0x1844, 0x185c, 0x186b, + 0x1880, 0x18a2, 0x18d0, 0x18ee, 0x1900, 0x1915, 0x1930, 0x1952, + 0x1970, 0x19c1, 0x19df, 0x1a0a, 0x1a2f, 0x1a44, 0x1a5c, 0x1a71, + 0x1a96, 0x1ade, 0x1b06, 0x1b2e, 0x1b40, 0x1b67, 0x1b9c, 0x1bed, + 0x1bf9, 0x1c3d, 0x1c49, 0x1c64, 0x1c85, 0x1c9d, 0x1cbf, 0x1cef, + 0x1d07, 0x1d13, 0x1d22, 0x1d63, 0x1d75, 0x1d87, 0x1da2, 0x1db7, + 0x1dc9, 0x1e17, 0x1e58, 0x1e6d, 0x1e94, 0x1eaf, 0x1f10, 0x1f2e, + 0x1f75, 0x1fb5, 0x1fd3, 0x1fe2, 0x2017, 0x2026, 0x2038, 0x2047, + // Entry 100 - 13F + 0x205c, 0x2084, 0x2099, 0x20b4, 0x20d9, 0x20eb, 0x2100, 0x2125, + 0x214d, 0x2168, 0x2190, 0x21b2, 0x21d7, 0x21fc, 0x221e, 0x2253, + 0x226e, 0x22a0, 0x22bb, 0x22da, 0x22fc, 0x231e, 0x2343, 0x236a, + 0x2385, 0x23bf, 0x23dd, 0x23ec, 0x2408, 0x242a, 0x243c, 0x245e, + 0x2480, 0x24a5, 0x24d3, +} // Size: 606 bytes + +var koRegionStr string = "" + // Size: 3916 bytes + "어센션 섬안도라아랍에미리트아프가니스탄앤티가 바부다앵귈라알바니아아르메니아네덜란드령 안틸레스앙골라남극 대륙아르헨티나아메리칸 사모아오스" + + "트리아오스트레일리아아루바올란드 제도아제르바이잔보스니아 헤르체고비나바베이도스방글라데시벨기에부르키나파소불가리아바레인부룬디베냉생바르" + + "텔레미버뮤다브루나이볼리비아네덜란드령 카리브브라질바하마부탄부베섬보츠와나벨라루스벨리즈캐나다코코스 제도콩고-킨샤사중앙 아프리카 공화" + + "국콩고스위스코트디부아르쿡 제도칠레카메룬중국콜롬비아클립퍼튼 섬코스타리카쿠바카보베르데퀴라소크리스마스섬키프로스체코독일디에고 가르시아" + + "지부티덴마크도미니카도미니카 공화국알제리세우타 및 멜리야에콰도르에스토니아이집트서사하라에리트리아스페인에티오피아유럽 연합핀란드피지포" + + "클랜드 제도미크로네시아페로 제도프랑스가봉영국그레나다조지아프랑스령 기아나건지가나지브롤터그린란드감비아기니과들루프적도 기니그리스사우" + + "스조지아 사우스샌드위치 제도과테말라괌기니비사우가이아나홍콩(중국 특별행정구)허드 맥도널드 제도온두라스크로아티아아이티헝가리카나리아" + + " 제도인도네시아아일랜드이스라엘맨 섬인도영국령 인도양 식민지이라크이란아이슬란드이탈리아저지자메이카요르단일본케냐키르기스스탄캄보디아키리바" + + "시코모로세인트키츠 네비스조선민주주의인민공화국대한민국쿠웨이트케이맨 제도카자흐스탄라오스레바논세인트루시아리히텐슈타인스리랑카라이베리아" + + "레소토리투아니아룩셈부르크라트비아리비아모로코모나코몰도바몬테네그로생마르탱마다가스카르마셜 제도마케도니아말리미얀마몽골마카오(중국 특별" + + "행정구)북마리아나제도마르티니크모리타니몬트세라트몰타모리셔스몰디브말라위멕시코말레이시아모잠비크나미비아뉴칼레도니아니제르노퍽섬나이지리아" + + "니카라과네덜란드노르웨이네팔나우루니우에뉴질랜드오만파나마페루프랑스령 폴리네시아파푸아뉴기니필리핀파키스탄폴란드생피에르 미클롱핏케언 섬" + + "푸에르토리코팔레스타인 지구포르투갈팔라우파라과이카타르오세아니아 외곽리유니온루마니아세르비아러시아르완다사우디아라비아솔로몬 제도세이셸" + + "수단스웨덴싱가포르세인트헬레나슬로베니아스발바르제도-얀마웬섬슬로바키아시에라리온산마리노세네갈소말리아수리남남수단상투메 프린시페엘살바도" + + "르신트마르턴시리아스와질란드트리스탄다쿠나터크스 케이커스 제도차드프랑스 남부 지방토고태국타지키스탄토켈라우동티모르투르크메니스탄튀니지" + + "통가터키트리니다드 토바고투발루대만탄자니아우크라이나우간다미국령 해외 제도미국우루과이우즈베키스탄바티칸 시국세인트빈센트그레나딘베네수" + + "엘라영국령 버진아일랜드미국령 버진아일랜드베트남바누아투왈리스-푸투나 제도사모아코소보예멘마요트남아프리카잠비아짐바브웨알려지지 않은 " + + "지역세계아프리카북아메리카남아메리카(남미)오세아니아서부 아프리카중앙 아메리카동부 아프리카북부 아프리카중부 아프리카남부 아프리카아" + + "메리카 대륙북부 아메리카카리브 제도동아시아남아시아동남아시아남유럽오스트랄라시아멜라네시아미크로네시아 지역폴리네시아아시아중앙 아시아" + + "서아시아유럽동유럽북유럽서유럽라틴 아메리카" + +var koRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x000d, 0x0016, 0x0028, 0x003a, 0x004d, 0x0056, 0x0062, + 0x0071, 0x008d, 0x0096, 0x00a3, 0x00b2, 0x00c8, 0x00d7, 0x00ec, + 0x00f5, 0x0105, 0x0117, 0x0136, 0x0145, 0x0154, 0x015d, 0x016f, + 0x017b, 0x0184, 0x018d, 0x0193, 0x01a5, 0x01ae, 0x01ba, 0x01c6, + 0x01df, 0x01e8, 0x01f1, 0x01f7, 0x0200, 0x020c, 0x0218, 0x0221, + 0x022a, 0x023a, 0x024a, 0x0267, 0x026d, 0x0276, 0x0288, 0x0292, + 0x0298, 0x02a1, 0x02a7, 0x02b3, 0x02c3, 0x02d2, 0x02d8, 0x02e7, + 0x02f0, 0x0302, 0x030e, 0x0314, 0x031a, 0x0330, 0x0339, 0x0342, + // Entry 40 - 7F + 0x034e, 0x0364, 0x036d, 0x0384, 0x0390, 0x039f, 0x03a8, 0x03b4, + 0x03c3, 0x03cc, 0x03db, 0x03e8, 0x03f1, 0x03f7, 0x040a, 0x041c, + 0x0429, 0x0432, 0x0438, 0x043e, 0x044a, 0x0453, 0x0469, 0x046f, + 0x0475, 0x0481, 0x048d, 0x0496, 0x049c, 0x04a8, 0x04b5, 0x04be, + 0x04ed, 0x04f9, 0x04fc, 0x050b, 0x0517, 0x0535, 0x054f, 0x055b, + 0x056a, 0x0573, 0x057c, 0x058f, 0x059e, 0x05aa, 0x05b6, 0x05bd, + 0x05c3, 0x05e0, 0x05e9, 0x05ef, 0x05fe, 0x060a, 0x0610, 0x061c, + 0x0625, 0x062b, 0x0631, 0x0643, 0x064f, 0x065b, 0x0664, 0x067d, + // Entry 80 - BF + 0x069e, 0x06aa, 0x06b6, 0x06c6, 0x06d5, 0x06de, 0x06e7, 0x06f9, + 0x070b, 0x0717, 0x0726, 0x072f, 0x073e, 0x074d, 0x0759, 0x0762, + 0x076b, 0x0774, 0x077d, 0x078c, 0x0798, 0x07aa, 0x07b7, 0x07c6, + 0x07cc, 0x07d5, 0x07db, 0x07fc, 0x0811, 0x0820, 0x082c, 0x083b, + 0x0841, 0x084d, 0x0856, 0x085f, 0x0868, 0x0877, 0x0883, 0x088f, + 0x08a1, 0x08aa, 0x08b3, 0x08c2, 0x08ce, 0x08da, 0x08e6, 0x08ec, + 0x08f5, 0x08fe, 0x090a, 0x0910, 0x0919, 0x091f, 0x093b, 0x094d, + 0x0956, 0x0962, 0x096b, 0x0981, 0x098e, 0x09a0, 0x09b6, 0x09c2, + // Entry C0 - FF + 0x09cb, 0x09d7, 0x09e0, 0x09f6, 0x0a02, 0x0a0e, 0x0a1a, 0x0a23, + 0x0a2c, 0x0a41, 0x0a51, 0x0a5a, 0x0a60, 0x0a69, 0x0a75, 0x0a87, + 0x0a96, 0x0ab5, 0x0ac4, 0x0ad3, 0x0adf, 0x0ae8, 0x0af4, 0x0afd, + 0x0b06, 0x0b1c, 0x0b2b, 0x0b3a, 0x0b43, 0x0b52, 0x0b67, 0x0b84, + 0x0b8a, 0x0ba1, 0x0ba7, 0x0bad, 0x0bbc, 0x0bc8, 0x0bd4, 0x0be9, + 0x0bf2, 0x0bf8, 0x0bfe, 0x0c17, 0x0c20, 0x0c26, 0x0c32, 0x0c41, + 0x0c4a, 0x0c61, 0x0c67, 0x0c73, 0x0c85, 0x0c95, 0x0cb3, 0x0cc2, + 0x0cde, 0x0cfa, 0x0d03, 0x0d0f, 0x0d29, 0x0d32, 0x0d3b, 0x0d41, + // Entry 100 - 13F + 0x0d4a, 0x0d59, 0x0d62, 0x0d6e, 0x0d88, 0x0d8e, 0x0d9a, 0x0da9, + 0x0dc0, 0x0dcf, 0x0de2, 0x0df5, 0x0e08, 0x0e1b, 0x0e2e, 0x0e41, + 0x0e54, 0x0e67, 0x0e77, 0x0e83, 0x0e8f, 0x0e9e, 0x0ea7, 0x0ebc, + 0x0ecb, 0x0ee4, 0x0ef3, 0x0efc, 0x0f0c, 0x0f18, 0x0f1e, 0x0f27, + 0x0f30, 0x0f39, 0x0f4c, +} // Size: 606 bytes + +var kyRegionStr string = "" + // Size: 5805 bytes + "Ассеншин аралыАндорраБириккен Араб ЭмираттарыАфганистанАнтигуа жана Барб" + + "удаАнгуилаАлбанияАрменияАнголаАнтарктикаАргентинаАмерика СамоасыАвстрия" + + "АвстралияАрубаАланд аралдарыАзербайжанБосния жана ГерцеговинаБарбадосБа" + + "нгладешБельгияБуркина-ФасоБолгарияБахрейнБурундиБенинСент БартелемиБерм" + + "уд аралдарыБрунейБоливияКариб НидерланддарыБразилияБагам аралдарыБутанБ" + + "уве аралдарыБотсванаБеларусьБелизКанадаКокос (Килиӊ) аралдарыКонго-Кинш" + + "асаБорбордук Африка РеспубликасыКонго-БраззавилШвейцарияКот-д’ИвуарКук " + + "аралдарыЧилиКамерунКытайКолумбияКлиппертон аралыКоста-РикаКубаКапе Верд" + + "еКюрасаоКрисмас аралыКипрЧехияГерманияДиего ГарсияДжибутиДанияДоминикаД" + + "оминика РеспубликасыАлжирСеута жана МелиллаЭквадорЭстонияЕгипетБатыш Са" + + "хараЭритреяИспанияЭфиопияЕвропа БиримдигиФинляндияФиджиФолклэнд аралдар" + + "ыМикронезияФарер аралдарыФранцияГабонУлуу БританияГренадаГрузияГвиана (" + + "Франция)ГернсиГанаГибралтарГренландияГамбияГвинеяГваделупаЭкваториалдык" + + " ГвинеяГрецияТүштүк Жоржия жана Түштүк Сэндвич аралдарыГватемалаГуамГвин" + + "ея-БисауГайанаГонконг Кытай АААХерд жана Макдоналд аралдарыГондурасХорв" + + "атияГаитиВенгрияКанар аралдарыИндонезияИрландияИзраильМэн аралыИндияБри" + + "таниянын Индия океанындагы аймагыИракИранИсландияИталияЖерсиЯмайкаИорда" + + "нияЯпонияКенияКыргызстанКамбоджаКирибатиКоморосСент-Китс жана НевисТүнд" + + "үк КореяТүштүк КореяКувейтКайман АралдарыКазакстанЛаосЛиванСент-ЛюсияЛи" + + "хтенштейнШри-ЛанкаЛиберияЛесотоЛитваЛюксембургЛатвияЛивияМароккоМонакоМ" + + "олдоваЧерногорияСент-МартинМадагаскарМаршалл аралдарыМакедонияМалиМьянм" + + "а (Бирма)МонголияМакау Кытай АААТүндүк Мариана аралдарыМартиникаМаврита" + + "нияМонсерратМальтаМаврикийМалдив аралдарыМалавиМексикаМалайзияМозамбикН" + + "амибияЖаӊы КаледонияНигерНорфолк аралыНигерияНикарагуаНидерланддарНорве" + + "гияНепалНауруНиуэЖаӊы ЗеландияОманПанамаПеруФранцуз ПолинезиясыПапуа Жа" + + "ңы-ГвинеяФиллипинПакистанПольшаСен-Пьер жана МикелонПиткэрн аралдарыПуэ" + + "рто-РикоПалестина аймактарыПортугалияПалауПарагвайКатарАлыскы ОкеанияРе" + + "юнионРумынияСербияРоссияРуандаСауд АрабиясыСоломон аралдарыСейшелдерСуд" + + "анШвецияСингапурЫйык ЕленаСловенияСвалбард жана Жан МайенСловакияСьерра" + + "-ЛеонеСан МариноСенегалСомалиСуринамеТүштүк СуданСан-Томе жана ПринсипиЭ" + + "л СалвадорСинт МаартенСирияСвазилендТристан да КуньяТүркс жана Кайкос а" + + "ралдарыЧадФранциянын Түштүктөгү аймактарыТогоТаиландТажикстанТокелауТим" + + "ор-ЛестеТүркмөнстанТунисТонгаТүркияТринидад жана ТобагоТувалуТайваньТан" + + "занияУкраинаУгандаАКШнын сырткы аралдарыАмерика Кошмо ШтаттарыУругвайӨз" + + "бекстанВатиканСент-Винсент жана ГренадиналарВенесуэлаВиргин аралдары (Б" + + "ритания)Виргин аралдары (АКШ)ВьетнамВануатуУоллис жана ФутунаСамоаКосов" + + "оЙеменМайоттаТүштүк Африка РеспубликасыЗамбияЗимбабвеБелгисиз регионДүй" + + "нөАфрикаТүндүк АмерикаТүштүк АмерикаОкеанияБатыш АфрикаБорбордук Америк" + + "аЧыгыш АфрикаТүндүк АфрикаБорбордук АфрикаТүштүк АфрикаАмерикаТүндүк Ам" + + "ерика (регион)Кариб аралдарыЧыгыш АзияТүштүк АзияТүштүк-Чыгыш АзияТүштү" + + "к ЕвропаАвстралазияМеланезияМикронезия РегионуПолинезияАзияБорбор АзияБ" + + "атыш АзияЕвропаЧыгыш ЕвропаТүндүк ЕвропаБатыш ЕвропаЛатын Америкасы" + +var kyRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x001b, 0x0029, 0x0057, 0x006b, 0x0091, 0x009f, 0x00ad, + 0x00bb, 0x00bb, 0x00c7, 0x00db, 0x00ed, 0x010a, 0x0118, 0x012a, + 0x0134, 0x014f, 0x0163, 0x018f, 0x019f, 0x01b1, 0x01bf, 0x01d6, + 0x01e6, 0x01f4, 0x0202, 0x020c, 0x0227, 0x0244, 0x0250, 0x025e, + 0x0283, 0x0293, 0x02ae, 0x02b8, 0x02d1, 0x02e1, 0x02f1, 0x02fb, + 0x0307, 0x032f, 0x0348, 0x0380, 0x039d, 0x03af, 0x03c5, 0x03dc, + 0x03e4, 0x03f2, 0x03fc, 0x040c, 0x042b, 0x043e, 0x0446, 0x0459, + 0x0467, 0x0480, 0x0488, 0x0492, 0x04a2, 0x04b9, 0x04c7, 0x04d1, + // Entry 40 - 7F + 0x04e1, 0x050a, 0x0514, 0x0536, 0x0544, 0x0552, 0x055e, 0x0575, + 0x0583, 0x0591, 0x059f, 0x05be, 0x05d0, 0x05da, 0x05fb, 0x060f, + 0x062a, 0x0638, 0x0642, 0x065b, 0x0669, 0x0675, 0x0692, 0x069e, + 0x06a6, 0x06b8, 0x06cc, 0x06d8, 0x06e4, 0x06f6, 0x071d, 0x0729, + 0x0778, 0x078a, 0x0792, 0x07a9, 0x07b5, 0x07d5, 0x080a, 0x081a, + 0x082a, 0x0834, 0x0842, 0x085d, 0x086f, 0x087f, 0x088d, 0x089e, + 0x08a8, 0x08ed, 0x08f5, 0x08fd, 0x090d, 0x0919, 0x0923, 0x092f, + 0x093f, 0x094b, 0x0955, 0x0969, 0x0979, 0x0989, 0x0997, 0x09bc, + // Entry 80 - BF + 0x09d3, 0x09ea, 0x09f6, 0x0a13, 0x0a25, 0x0a2d, 0x0a37, 0x0a4a, + 0x0a60, 0x0a71, 0x0a7f, 0x0a8b, 0x0a95, 0x0aa9, 0x0ab5, 0x0abf, + 0x0acd, 0x0ad9, 0x0ae7, 0x0afb, 0x0b10, 0x0b24, 0x0b43, 0x0b55, + 0x0b5d, 0x0b76, 0x0b86, 0x0ba2, 0x0bce, 0x0be0, 0x0bf4, 0x0c06, + 0x0c12, 0x0c22, 0x0c3f, 0x0c4b, 0x0c59, 0x0c69, 0x0c79, 0x0c87, + 0x0ca2, 0x0cac, 0x0cc5, 0x0cd3, 0x0ce5, 0x0cfd, 0x0d0d, 0x0d17, + 0x0d21, 0x0d29, 0x0d42, 0x0d4a, 0x0d56, 0x0d5e, 0x0d83, 0x0da3, + 0x0db3, 0x0dc3, 0x0dcf, 0x0df6, 0x0e15, 0x0e2a, 0x0e4f, 0x0e63, + // Entry C0 - FF + 0x0e6d, 0x0e7d, 0x0e87, 0x0ea2, 0x0eb0, 0x0ebe, 0x0eca, 0x0ed6, + 0x0ee2, 0x0efb, 0x0f1a, 0x0f2c, 0x0f36, 0x0f42, 0x0f52, 0x0f65, + 0x0f75, 0x0fa0, 0x0fb0, 0x0fc7, 0x0fda, 0x0fe8, 0x0ff4, 0x1004, + 0x101b, 0x1044, 0x1059, 0x1070, 0x107a, 0x108c, 0x10aa, 0x10db, + 0x10e1, 0x111d, 0x1125, 0x1133, 0x1145, 0x1153, 0x1168, 0x117e, + 0x1188, 0x1192, 0x119e, 0x11c4, 0x11d0, 0x11de, 0x11ee, 0x11fc, + 0x1208, 0x1232, 0x125c, 0x126a, 0x127c, 0x128a, 0x12c3, 0x12d5, + 0x1305, 0x132b, 0x1339, 0x1347, 0x1369, 0x1373, 0x137f, 0x1389, + // Entry 100 - 13F + 0x1397, 0x13c9, 0x13d5, 0x13e5, 0x1402, 0x140c, 0x1418, 0x1433, + 0x144e, 0x145c, 0x1473, 0x1494, 0x14ab, 0x14c4, 0x14e3, 0x14fc, + 0x150a, 0x1534, 0x154f, 0x1562, 0x1577, 0x1597, 0x15b0, 0x15c6, + 0x15d8, 0x15fb, 0x160d, 0x1615, 0x162a, 0x163d, 0x1649, 0x1660, + 0x1679, 0x1690, 0x16ad, +} // Size: 606 bytes + +var loRegionStr string = "" + // Size: 8043 bytes + "ເກາະອາເຊນຊັນອັນດໍຣາສະຫະລັດອາຣັບເອມິເຣດອາຟການິສຖານອາທິກົວ ບາບູດາແອນກຸຍລາແ" + + "ອວເບເນຍອາເມເນຍອັນໂກລາແອນຕາດຕິກາອາເຈນທິນາອາເມຣິກາ ຊາມົວໂອຕາລິກອອສເຕຣເລຍ" + + "ອໍຣູບາຫມູ່ເກາະໂອລັນອາເຊີໄບຈານບອດສະເນຍ ແລະ ແຮສໂກວີນາບາບາໂດສບັງກະລາເທດແບ" + + "ລຊິກເບີກິນາ ຟາໂຊບູລກາຣິບາເຣນບູຣຸນດິເບນິນເຊນ ບາເທເລມີເບີມິວດາບຣູໄນໂບລິເ" + + "ວຍຄາຣິບບຽນ ເນເທີແລນບະເລຊີນບາຮາມາສພູຖານເກາະບູເວດບອດສະວານາເບວບາຣຸສເບລີຊກ" + + "ານາດາຫມູ່ເກາະໂກໂກສຄອງໂກ - ຄິນຊາຊາສາທາລະນະລັດອາຟຣິກາກາງຄອງໂກ - ບຣາຊາວິວ" + + "ສະວິດເຊີແລນໂຄຕີ ວົວໝູ່ເກາະຄຸກຈີເລຄາເມຣູນຈີນໂຄລົມເບຍເກາະຄລິບເປີຕັນໂຄສຕາ" + + " ຣິກາກຸຍບາເຄບ ເວີດຄູຣາຊາວເກາະຄຣິສມາດໄຊປຣັສສາທາລະນະລັດເຊກເຢຍລະມັນດິເອໂກ ກ" + + "າເຊຍຈິບູຕິເດນມາກໂດມີນິຄາສາທາລະນະລັດ ໂດມິນິກັນອັລຈິເຣຍເຊວຕາ ແລະເມລິນລາເ" + + "ອກວາດໍເອສໂຕເນຍອີຢິບຊາຮາຣາຕາເວັນຕົກເອຣິເທຣຍສະເປນອີທິໂອເປຍສະຫະພາບຢູໂຣບຝຽ" + + "ກລັງຟິຈິຫມູ່ເກາະຟອກແລນໄມໂຄຣນີເຊຍຫມູ່ເກາະແຟໂຣຝຣັ່ງກາບອນສະຫະລາດຊະອະນາຈັກ" + + "ເກຣເນດາຈໍເຈຍເຟຣນຊ໌ ກຸຍອານາເກີນຊີການາຈິບບຣອນທາກຣີນແລນສາທາລະນະລັດແກມເບຍກ" + + "ິນີກົວດາລູບອີຄົວໂຕຣຽວ ກີນີກຣີຊໝູ່ເກາະຈໍເຈຍ & ເຊົາ ແຊນວິດກົວເທມາລາກວມກິ" + + "ນີ-ບິສເຊົາກາຍຢານາຮອງກົງ ເຂດປົກຄອງພິເສດ ຈີນໝູ່ເກາະເຮີດ & ແມັກໂດນອລຮອນດູ" + + "ຣັສໂຄຣເອເທຍໄຮຕິຮັງກາຣີໝູ່ເກາະຄານາຣີອິນໂດເນເຊຍໄອຣ໌ແລນອິສຣາເອວເອວ ອອບ ແມ" + + "ນອິນເດຍເຂດແດນບຣິທິສອິນດຽນໂອຊຽນອີຣັກອີຣ່ານໄອສແລນອິຕາລີເຈີຊີຈາໄມຄາຈໍແດນຍ" + + "ີ່ປຸ່ນເຄນຢາຄີກິສຖານກຳປູເຈຍຄິຣິບາທິໂຄໂມໂຣສເຊນ ຄິດ ແລະ ເນວິສເກົາຫລີເໜືອເ" + + "ກົາຫລີໃຕ້ກູເວດເຄແມນ ໄອແລນຄາຊັກສະຖານລາວເລບານອນເຊນ ລູເຊຍລິດເທນສະຕາຍສີລັງ" + + "ກາລິເບີເຣຍເລໂຊໂທລິທົວເນຍລຸກຊຳບົວລັດເວຍລິເບຍໂມຣັອກໂຄໂມນາໂຄໂມນໂດວາມອນເຕເ" + + "ນໂກຣເຊນ ມາທິນມາດາກາສກາຫມູ່ເກາະມາແຊວແມຊິໂດເນຍມາລິມຽນມາ (ເບີມາ)ມົງໂກລີມາ" + + "ເກົ້າ ເຂດປົກຄອງພິເສດ ຈີນຫມູ່ເກາະມາແຊວຕອນເຫນືອມາຕິນີກມົວຣິເທເນຍມອນເຊີຣາ" + + "ດມອນທາມົວຣິຊຽສມັນດິຟມາລາວີແມັກຊີໂກມາເລເຊຍໂມແຊມບິກນາມີເບຍນິວ ຄາເລໂດເນຍນ" + + "ິເຈີເກາະນໍໂຟກໄນຈີເຣຍນິກຄາຣາກົວເນເທີແລນນອກແວ໊ເນປານນາອູຣູນີອູເອນິວຊີແລນໂ" + + "ອມານພານາມາເປຣູເຟຣນຊ໌ ໂພລີນີເຊຍປາປົວນິວກີນີຟິລິບປິນປາກິສຖານໂປໂລຍເຊນ ປີແ" + + "ອ ມິເກວລອນໝູ່ເກາະພິດແຄນເພືອໂຕ ຣິໂກດິນແດນ ປາເລສຕິນຽນພອລທູໂກປາເລົາພາຣາກວ" + + "ຍກາຕາເຂດຫ່າງໄກໂອຊີເນຍເຣອູນິຍົງໂຣມານີເຊີເບຍຣັດເຊຍຣວັນດາຊາອຸດິ ອາຣາເບຍຫມ" + + "ູ່ເກາະໂຊໂລມອນເຊເຊວເລສຊູດານສະວີເດັນສິງກະໂປເຊນ ເຮເລນາສະໂລເວເນຍສະວາບາ ແລະ" + + " ແຢນ ມາເຢນສະໂລວາເກຍເຊຍຣາ ລີໂອນແຊນ ມາຣິໂນເຊນີໂກລໂຊມາລີຊູຣິນາມຊູດານໃຕ້ເຊົາ" + + "ທູເມ ແລະ ພຣິນຊິບເອວ ຊໍວາດໍຊິນ ມາເທັນຊີເຣຍສະວາຊິແລນທຣິສຕັນ ດາ ກັນຮາໝູ່ເ" + + "ກາະ ເທີກ ແລະ ໄຄໂຄສຊາດເຂດແດນທາງໃຕ້ຂອຝຮັ່ງໂຕໂກໄທທາຈິກິສຖານໂຕເກເລົາທິມໍ-ເ" + + "ລສເຕເທີກເມນິສຖານຕູນິເຊຍທອງກາເທີຄີທຣິນິແດດ ແລະ ໂທແບໂກຕູວາລູໄຕ້ຫວັນທານຊາ" + + "ເນຍຢູເຄຣນອູການດາໝູ່ເກາະຮອບນອກຂອງສະຫະລັດຯສະຫະລັດອູຣຸກວຍອຸສເບກິສຖານນະຄອນ" + + " ວາຕິກັນເຊນ ວິນເຊນ & ເກຣເນດິນເວເນຊູເອລາໝູ່ເກາະ ບຣິທິຊ ເວີຈິນໝູ່ເກາະ ຢູເອ" + + "ສ ເວີຈິນຫວຽດນາມວານົວຕູວາລິສ ແລະ ຟຸຕູນາຊາມົວໂຄໂຊໂວເຢເມນມາຢັອດອາຟະລິກາໃຕ" + + "້ແຊມເບຍຊິມບັບເວຂົງເຂດທີ່ບໍ່ຮູ້ຈັກໂລກອາຟຣິກາອາເມລິກາເໜືອອາເມລິກາໃຕ້ໂອຊີ" + + "ອານີອາຟຣິກາຕາເວັນຕົກອາເມລິກາກາງອາຟຣິກາຕາເວັນອອກອາຟຣິກາເໜືອອາຟຣິກາກາງອາ" + + "ຟຣິກາໃຕ້ອາເມຣິກາພາກເໜືອອາເມລີກາຄາຣິບບຽນອາຊີຕາເວັນອອກອາຊີໄຕ້ອາຊີຕາເວັນອ" + + "ອກສ່ຽງໄຕ້ຢູໂຣບໃຕ້ໂອດສະຕາລີເມລານີເຊຍເຂດໄມໂຄຣເນຊຽນໂພລີນີເຊຍອາຊີອາຊີກາງອາ" + + "ຊີຕາເວັນຕົກຢູໂຣບຢູໂຣບຕາເວັນອອກຢູໂຣບເໜືອຢູໂຣບຕາເວັນຕົກລາຕິນ ອາເມລິກາ" + +var loRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0024, 0x0039, 0x0072, 0x0093, 0x00bb, 0x00d3, 0x00eb, + 0x0100, 0x0100, 0x0115, 0x0133, 0x014e, 0x0176, 0x018b, 0x01a6, + 0x01b8, 0x01df, 0x01fd, 0x023b, 0x0250, 0x026e, 0x0280, 0x02a2, + 0x02b7, 0x02c6, 0x02db, 0x02ea, 0x030c, 0x0324, 0x0333, 0x0348, + 0x0379, 0x038e, 0x03a3, 0x03b2, 0x03cd, 0x03e8, 0x0400, 0x040f, + 0x0421, 0x0448, 0x046f, 0x04ae, 0x04d8, 0x04f9, 0x050f, 0x052d, + 0x0539, 0x054e, 0x0557, 0x056f, 0x0599, 0x05b5, 0x05c4, 0x05da, + 0x05ef, 0x0610, 0x0622, 0x064c, 0x0664, 0x0686, 0x0698, 0x06aa, + // Entry 40 - 7F + 0x06c2, 0x06ff, 0x0717, 0x0745, 0x075a, 0x0772, 0x0781, 0x07ae, + 0x07c6, 0x07d5, 0x07f0, 0x0814, 0x0826, 0x0832, 0x085c, 0x087a, + 0x089e, 0x08ad, 0x08bc, 0x08ec, 0x0901, 0x0910, 0x0938, 0x094a, + 0x0956, 0x0971, 0x0986, 0x09b9, 0x09c5, 0x09dd, 0x0a08, 0x0a14, + 0x0a5a, 0x0a75, 0x0a7e, 0x0aa0, 0x0ab5, 0x0afc, 0x0b3b, 0x0b53, + 0x0b6b, 0x0b77, 0x0b8c, 0x0bb3, 0x0bd1, 0x0be6, 0x0bfe, 0x0c1b, + 0x0c2d, 0x0c72, 0x0c81, 0x0c93, 0x0ca5, 0x0cb7, 0x0cc6, 0x0cd8, + 0x0ce7, 0x0cfc, 0x0d0b, 0x0d23, 0x0d38, 0x0d50, 0x0d65, 0x0d92, + // Entry 80 - BF + 0x0db3, 0x0dd1, 0x0de0, 0x0dff, 0x0e1d, 0x0e26, 0x0e3b, 0x0e54, + 0x0e75, 0x0e8a, 0x0ea2, 0x0eb4, 0x0ecc, 0x0ee4, 0x0ef6, 0x0f05, + 0x0f1d, 0x0f2f, 0x0f44, 0x0f62, 0x0f7b, 0x0f96, 0x0fbd, 0x0fd8, + 0x0fe4, 0x1005, 0x101a, 0x1064, 0x10a3, 0x10b8, 0x10d6, 0x10f1, + 0x1100, 0x1118, 0x112a, 0x113c, 0x1154, 0x1169, 0x1181, 0x1196, + 0x11bb, 0x11ca, 0x11e5, 0x11fa, 0x1218, 0x1230, 0x1242, 0x1251, + 0x1263, 0x1275, 0x128d, 0x129c, 0x12ae, 0x12ba, 0x12e8, 0x130c, + 0x1324, 0x133c, 0x134b, 0x137a, 0x13a1, 0x13c0, 0x13f1, 0x1406, + // Entry C0 - FF + 0x1418, 0x142d, 0x1439, 0x1469, 0x1484, 0x1496, 0x14a8, 0x14ba, + 0x14cc, 0x14f4, 0x1521, 0x1539, 0x1548, 0x1560, 0x1575, 0x1591, + 0x15ac, 0x15e2, 0x15fd, 0x161c, 0x1638, 0x164d, 0x165f, 0x1674, + 0x168c, 0x16c4, 0x16e0, 0x16fc, 0x170b, 0x1726, 0x1752, 0x178e, + 0x1797, 0x17d0, 0x17dc, 0x17e2, 0x1800, 0x1818, 0x1834, 0x1858, + 0x186d, 0x187c, 0x188b, 0x18c0, 0x18d2, 0x18e7, 0x18ff, 0x1911, + 0x1926, 0x196e, 0x1983, 0x1998, 0x19b9, 0x19de, 0x1a15, 0x1a33, + 0x1a6e, 0x1aa6, 0x1abb, 0x1ad0, 0x1afc, 0x1b0b, 0x1b1d, 0x1b2c, + // Entry 100 - 13F + 0x1b3e, 0x1b5f, 0x1b71, 0x1b89, 0x1bbf, 0x1bc8, 0x1bdd, 0x1c01, + 0x1c22, 0x1c3a, 0x1c6a, 0x1c8b, 0x1cbb, 0x1cdc, 0x1cfa, 0x1d18, + 0x1d30, 0x1d5d, 0x1d75, 0x1d9c, 0x1db1, 0x1ded, 0x1e05, 0x1e20, + 0x1e3b, 0x1e62, 0x1e7d, 0x1e89, 0x1e9e, 0x1ec5, 0x1ed4, 0x1efe, + 0x1f19, 0x1f43, 0x1f6b, +} // Size: 606 bytes + +var ltRegionStr string = "" + // Size: 3396 bytes + "Dangun Žengimo salaAndoraJungtiniai Arabų EmyrataiAfganistanasAntigva ir" + + " BarbudaAngilijaAlbanijaArmėnijaOlandijos AntilaiAngolaAntarktidaArgenti" + + "naAmerikos SamoaAustrijaAustralijaArubaAlandų SalosAzerbaidžanasBosnija " + + "ir HercegovinaBarbadosasBangladešasBelgijaBurkina FasasBulgarijaBahreina" + + "sBurundisBeninasSen BartelemiBermudaBrunėjusBolivijaKaribų NyderlandaiBr" + + "azilijaBahamosButanasBuvė SalaBotsvanaBaltarusijaBelizasKanadaKokosų (Ki" + + "lingo) SalosKongas-KinšasaCentrinės Afrikos RespublikaKongas-BrazavilisŠ" + + "veicarijaDramblio Kaulo KrantasKuko SalosČilėKamerūnasKinijaKolumbijaKli" + + "pertono salaKosta RikaKubaŽaliasis KyšulysKiurasaoKalėdų SalaKiprasČekij" + + "aVokietijaDiego GarsijaDžibutisDanijaDominikaDominikos RespublikaAlžyras" + + "Seuta ir MelilaEkvadorasEstijaEgiptasVakarų SacharaEritrėjaIspanijaEtiop" + + "ijaEuropos SąjungaSuomijaFidžisFolklando SalosMikronezijaFarerų SalosPra" + + "ncūzijaGabonasDidžioji BritanijaGrenadaGruzijaPrancūzijos GvianaGernsisG" + + "anaGibraltarasGrenlandijaGambijaGvinėjaGvadelupaPusiaujo GvinėjaGraikija" + + "Pietų Džordžija ir Pietų Sandvičo salosGvatemalaGuamasBisau GvinėjaGajan" + + "aYpatingasis Administracinis Kinijos Regionas HonkongasHerdo ir Makdonal" + + "do SalosHondūrasKroatijaHaitisVengrijaKanarų salosIndonezijaAirijaIzrael" + + "isMeno SalaIndijaIndijos Vandenyno Britų SritisIrakasIranasIslandijaItal" + + "ijaDžersisJamaikaJordanijaJaponijaKenijaKirgizijaKambodžaKiribatisKomora" + + "iSent Kitsas ir NevisŠiaurės KorėjaPietų KorėjaKuveitasKaimanų SalosKaza" + + "chstanasLaosasLibanasŠventoji LiucijaLichtenšteinasŠri LankaLiberijaLeso" + + "tasLietuvaLiuksemburgasLatvijaLibijaMarokasMonakasMoldovaJuodkalnijaSen " + + "MartenasMadagaskarasMaršalo SalosMakedonijaMalisMianmaras (Birma)Mongoli" + + "jaYpatingasis Administracinis Kinijos Regionas MakaoMarianos Šiaurinės S" + + "alosMartinikaMauritanijaMontseratasMaltaMauricijusMaldyvaiMalavisMeksika" + + "MalaizijaMozambikasNamibijaNaujoji KaledonijaNigerisNorfolko salaNigerij" + + "aNikaragvaNyderlandaiNorvegijaNepalasNauruNiujėNaujoji ZelandijaOmanasPa" + + "namaPeruPrancūzų PolinezijaPapua Naujoji GvinėjaFilipinaiPakistanasLenki" + + "jaSen Pjeras ir MikelonasPitkernasPuerto RikasPalestinos teritorijaPortu" + + "galijaPalauParagvajusKatarasNuošali OkeanijaReunjonasRumunijaSerbijaRusi" + + "jaRuandaSaudo ArabijaSaliamono SalosSeišeliaiSudanasŠvedijaSingapūrasŠv." + + " Elenos SalaSlovėnijaSvalbardas ir Janas MajenasSlovakijaSiera LeonėSan " + + "MarinasSenegalasSomalisSurinamasPietų SudanasSan Tomė ir PrinsipėSalvado" + + "rasSint MartenasSirijaSvazilandasTristanas da KunjaTerkso ir Kaikoso Sal" + + "osČadasPrancūzijos Pietų sritysTogasTailandasTadžikijaTokelauRytų Timora" + + "sTurkmėnistanasTunisasTongaTurkijaTrinidadas ir TobagasTuvaluTaivanasTan" + + "zanijaUkrainaUgandaJungtinių Valstijų Mažosios Tolimosios SalosJungtinės" + + " ValstijosUrugvajusUzbekistanasVatikano Miesto ValstybėŠventasis Vincent" + + "as ir GrenadinaiVenesuelaDidžiosios Britanijos Mergelių SalosJungtinių V" + + "alstijų Mergelių SalosVietnamasVanuatuVolisas ir FutunaSamoaKosovasJemen" + + "asMajotasPietų AfrikaZambijaZimbabvėnežinoma sritispasaulisAfrikaŠiaurės" + + " AmerikaPietų AmerikaOkeanijaVakarų AfrikaCentrinė AmerikaRytų AfrikaŠia" + + "urės AfrikaVidurio AfrikaPietinė AfrikaAmerikaŠiaurinė AmerikaKaribaiRyt" + + "ų AzijaPietų AzijaPietryčių AzijaPietų EuropaAustralazijaMelanezijaMikr" + + "onezijos regionasPolinezijaAzijaCentrinė AzijaVakarų AzijaEuropaRytų Eur" + + "opaŠiaurės EuropaVakarų EuropaLotynų Amerika" + +var ltRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0014, 0x001a, 0x0034, 0x0040, 0x0052, 0x005a, 0x0062, + 0x006b, 0x007c, 0x0082, 0x008c, 0x0095, 0x00a3, 0x00ab, 0x00b5, + 0x00ba, 0x00c7, 0x00d5, 0x00eb, 0x00f5, 0x0101, 0x0108, 0x0115, + 0x011e, 0x0127, 0x012f, 0x0136, 0x0143, 0x014a, 0x0153, 0x015b, + 0x016e, 0x0177, 0x017e, 0x0185, 0x018f, 0x0197, 0x01a2, 0x01a9, + 0x01af, 0x01c6, 0x01d5, 0x01f2, 0x0203, 0x020e, 0x0224, 0x022e, + 0x0234, 0x023e, 0x0244, 0x024d, 0x025c, 0x0266, 0x026a, 0x027c, + 0x0284, 0x0291, 0x0297, 0x029e, 0x02a7, 0x02b4, 0x02bd, 0x02c3, + // Entry 40 - 7F + 0x02cb, 0x02df, 0x02e7, 0x02f6, 0x02ff, 0x0305, 0x030c, 0x031b, + 0x0324, 0x032c, 0x0334, 0x0344, 0x034b, 0x0352, 0x0361, 0x036c, + 0x0379, 0x0384, 0x038b, 0x039e, 0x03a5, 0x03ac, 0x03bf, 0x03c6, + 0x03ca, 0x03d5, 0x03e0, 0x03e7, 0x03ef, 0x03f8, 0x0409, 0x0411, + 0x043d, 0x0446, 0x044c, 0x045a, 0x0460, 0x0496, 0x04af, 0x04b8, + 0x04c0, 0x04c6, 0x04ce, 0x04db, 0x04e5, 0x04eb, 0x04f3, 0x04fc, + 0x0502, 0x0521, 0x0527, 0x052d, 0x0536, 0x053d, 0x0545, 0x054c, + 0x0555, 0x055d, 0x0563, 0x056c, 0x0575, 0x057e, 0x0585, 0x0599, + // Entry 80 - BF + 0x05aa, 0x05b8, 0x05c0, 0x05ce, 0x05da, 0x05e0, 0x05e7, 0x05f8, + 0x0607, 0x0611, 0x0619, 0x0620, 0x0627, 0x0634, 0x063b, 0x0641, + 0x0648, 0x064f, 0x0656, 0x0661, 0x066d, 0x0679, 0x0687, 0x0691, + 0x0696, 0x06a7, 0x06b0, 0x06e2, 0x06fc, 0x0705, 0x0710, 0x071b, + 0x0720, 0x072a, 0x0732, 0x0739, 0x0740, 0x0749, 0x0753, 0x075b, + 0x076d, 0x0774, 0x0781, 0x0789, 0x0792, 0x079d, 0x07a6, 0x07ad, + 0x07b2, 0x07b8, 0x07c9, 0x07cf, 0x07d5, 0x07d9, 0x07ee, 0x0804, + 0x080d, 0x0817, 0x081e, 0x0835, 0x083e, 0x084a, 0x085f, 0x086a, + // Entry C0 - FF + 0x086f, 0x0879, 0x0880, 0x0891, 0x089a, 0x08a2, 0x08a9, 0x08af, + 0x08b5, 0x08c2, 0x08d1, 0x08db, 0x08e2, 0x08ea, 0x08f5, 0x0905, + 0x090f, 0x092a, 0x0933, 0x093f, 0x094a, 0x0953, 0x095a, 0x0963, + 0x0971, 0x0987, 0x0991, 0x099e, 0x09a4, 0x09af, 0x09c1, 0x09d8, + 0x09de, 0x09f8, 0x09fd, 0x0a06, 0x0a10, 0x0a17, 0x0a24, 0x0a33, + 0x0a3a, 0x0a3f, 0x0a46, 0x0a5b, 0x0a61, 0x0a69, 0x0a72, 0x0a79, + 0x0a7f, 0x0aae, 0x0ac2, 0x0acb, 0x0ad7, 0x0af0, 0x0b12, 0x0b1b, + 0x0b41, 0x0b65, 0x0b6e, 0x0b75, 0x0b86, 0x0b8b, 0x0b92, 0x0b99, + // Entry 100 - 13F + 0x0ba0, 0x0bad, 0x0bb4, 0x0bbd, 0x0bcd, 0x0bd5, 0x0bdb, 0x0bec, + 0x0bfa, 0x0c02, 0x0c10, 0x0c21, 0x0c2d, 0x0c3d, 0x0c4b, 0x0c5a, + 0x0c61, 0x0c73, 0x0c7a, 0x0c85, 0x0c91, 0x0ca2, 0x0caf, 0x0cbb, + 0x0cc5, 0x0cda, 0x0ce4, 0x0ce9, 0x0cf8, 0x0d05, 0x0d0b, 0x0d17, + 0x0d27, 0x0d35, 0x0d44, +} // Size: 606 bytes + +var lvRegionStr string = "" + // Size: 3293 bytes + "Debesbraukšanas salaAndoraApvienotie Arābu EmirātiAfganistānaAntigva un " + + "BarbudaAngiljaAlbānijaArmēnijaNīderlandes AntiļasAngolaAntarktikaArgentī" + + "naAmerikāņu SamoaAustrijaAustrālijaArubaOlandes salasAzerbaidžānaBosnija" + + " un HercegovinaBarbadosaBangladešaBeļģijaBurkinafasoBulgārijaBahreinaBur" + + "undiBeninaSenbartelmīBermudu salasBrunejaBolīvijaNīderlandes Karību sala" + + "sBrazīlijaBahamu salasButānaBuvē salaBotsvānaBaltkrievijaBelizaKanādaKok" + + "osu jeb Kīlinga salasKongo-KinšasaCentrālāfrikas RepublikaKongo - Brazav" + + "ilaŠveiceKotdivuāraKuka salasČīleKamerūnaĶīnaKolumbijaKlipertona salaKos" + + "tarikaKubaKaboverdeKirasaoZiemsvētku salaKipraČehijaVācijaDjego Garsijas" + + " atolsDžibutijaDānijaDominikaDominikānaAlžīrijaSeūta un MeliljaEkvadoraI" + + "gaunijaĒģipteRietumsahāraEritrejaSpānijaEtiopijaEiropas SavienībaSomijaF" + + "idžiFolklenda salasMikronēzijaFēru SalasFrancijaGabonaLielbritānijaGrenā" + + "daGruzijaFranču GviānaGērnsijaGanaGibraltārsGrenlandeGambijaGvinejaGvade" + + "lupaEkvatoriālā GvinejaGrieķijaDienviddžordžija un Dienvidsendviču salas" + + "GvatemalaGuamaGvineja-BisavaGajānaĶīnas īpašās pārvaldes apgabals Honkon" + + "gaHērda un Makdonalda salasHondurasaHorvātijaHaitiUngārijaKanāriju salas" + + "IndonēzijaĪrijaIzraēlaMenaIndijaIndijas okeāna Britu teritorijaIrākaIrān" + + "aĪslandeItālijaDžērsijaJamaikaJordānijaJapānaKenijaKirgizstānaKambodžaKi" + + "ribatiKomoru salasSentkitsa un NevisaZiemeļkorejaDienvidkorejaKuveitaKai" + + "manu salasKazahstānaLaosaLibānaSentlūsijaLihtenšteinaŠrilankaLibērijaLes" + + "otoLietuvaLuksemburgaLatvijaLībijaMarokaMonakoMoldovaMelnkalneSenmartēna" + + "MadagaskaraMāršala salasMaķedonijaMaliMjanma (Birma)MongolijaĶīnas īpašā" + + "s pārvaldes apgabals MakaoZiemeļu Marianas salasMartinikaMauritānijaMont" + + "serrataMaltaMaurīcijaMaldīvijaMalāvijaMeksikaMalaizijaMozambikaNamībijaJ" + + "aunkaledonijaNigēraNorfolkas salaNigērijaNikaragvaNīderlandeNorvēģijaNep" + + "ālaNauruNiueJaunzēlandeOmānaPanamaPeruFranču PolinēzijaPapua-Jaungvinej" + + "aFilipīnasPakistānaPolijaSenpjēra un MikelonaPitkērnaPuertorikoPalestīna" + + "PortugālePalauParagvajaKataraOkeānijas attālās salasReinjonaRumānijaSerb" + + "ijaKrievijaRuandaSaūda ArābijaZālamana salasŠeišelu salasSudānaZviedrija" + + "SingapūraSv.Helēnas salaSlovēnijaSvalbāra un Jana Majena salaSlovākijaSj" + + "erraleoneSanmarīnoSenegālaSomālijaSurinamaDienvidsudānaSantome un Prinsi" + + "piSalvadoraSintmārtenaSīrijaSvazilendaTristana da Kuņas salasTērksas un " + + "Kaikosas salasČadaFrancijas Dienvidjūru ZemesTogoTaizemeTadžikistānaToke" + + "lauAustrumtimoraTurkmenistānaTunisijaTongaTurcijaTrinidāda un TobāgoTuva" + + "luTaivānaTanzānijaUkrainaUgandaASV Aizjūras salasAmerikas Savienotās Val" + + "stisUrugvajaUzbekistānaVatikānsSentvinsenta un GrenadīnasVenecuēlaBritu " + + "VirdžīnasASV VirdžīnasVjetnamaVanuatuVolisa un FutunaSamoaKosovaJemenaMa" + + "jotaDienvidāfrikas RepublikaZambijaZimbabvenezināms reģionspasauleĀfrika" + + "ZiemeļamerikaDienvidamerikaOkeānijaRietumāfrikaCentrālamerikaAustrumāfri" + + "kaZiemeļāfrikaVidusāfrikaDienvidāfrikaAmerikaAmerikas ziemeļu daļaKarību" + + " jūras reģionsAustrumāzijaDienvidāzijaCentrālaustrumāzijaDienvideiropaAu" + + "strālāzijaMelanēzijaMikronēzijas reģionsPolinēzijaĀzijaCentrālāzijaRietu" + + "māzijaEiropaAustrumeiropaZiemeļeiropaRietumeiropaLatīņamerika" + +var lvRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0015, 0x001b, 0x0035, 0x0041, 0x0053, 0x005a, 0x0063, + 0x006c, 0x0081, 0x0087, 0x0091, 0x009b, 0x00ac, 0x00b4, 0x00bf, + 0x00c4, 0x00d1, 0x00df, 0x00f5, 0x00fe, 0x0109, 0x0112, 0x011d, + 0x0127, 0x012f, 0x0136, 0x013c, 0x0148, 0x0155, 0x015c, 0x0165, + 0x017f, 0x0189, 0x0195, 0x019c, 0x01a6, 0x01af, 0x01bb, 0x01c1, + 0x01c8, 0x01e1, 0x01ef, 0x0209, 0x021a, 0x0221, 0x022c, 0x0236, + 0x023c, 0x0245, 0x024b, 0x0254, 0x0263, 0x026c, 0x0270, 0x0279, + 0x0280, 0x0290, 0x0295, 0x029c, 0x02a3, 0x02b7, 0x02c1, 0x02c8, + // Entry 40 - 7F + 0x02d0, 0x02db, 0x02e5, 0x02f6, 0x02fe, 0x0306, 0x030e, 0x031b, + 0x0323, 0x032b, 0x0333, 0x0345, 0x034b, 0x0351, 0x0360, 0x036c, + 0x0377, 0x037f, 0x0385, 0x0393, 0x039b, 0x03a2, 0x03b1, 0x03ba, + 0x03be, 0x03c9, 0x03d2, 0x03d9, 0x03e0, 0x03e9, 0x03fe, 0x0407, + 0x0433, 0x043c, 0x0441, 0x044f, 0x0456, 0x0484, 0x049e, 0x04a7, + 0x04b1, 0x04b6, 0x04bf, 0x04ce, 0x04d9, 0x04df, 0x04e7, 0x04eb, + 0x04f1, 0x0511, 0x0517, 0x051d, 0x0525, 0x052d, 0x0537, 0x053e, + 0x0548, 0x054f, 0x0555, 0x0561, 0x056a, 0x0572, 0x057e, 0x0591, + // Entry 80 - BF + 0x059e, 0x05ab, 0x05b2, 0x05bf, 0x05ca, 0x05cf, 0x05d6, 0x05e1, + 0x05ee, 0x05f7, 0x0600, 0x0606, 0x060d, 0x0618, 0x061f, 0x0626, + 0x062c, 0x0632, 0x0639, 0x0642, 0x064d, 0x0658, 0x0667, 0x0672, + 0x0676, 0x0684, 0x068d, 0x06b8, 0x06cf, 0x06d8, 0x06e4, 0x06ef, + 0x06f4, 0x06fe, 0x0708, 0x0711, 0x0718, 0x0721, 0x072a, 0x0733, + 0x0741, 0x0748, 0x0756, 0x075f, 0x0768, 0x0773, 0x077e, 0x0785, + 0x078a, 0x078e, 0x079a, 0x07a0, 0x07a6, 0x07aa, 0x07bd, 0x07ce, + 0x07d8, 0x07e2, 0x07e8, 0x07fd, 0x0806, 0x0810, 0x081a, 0x0824, + // Entry C0 - FF + 0x0829, 0x0832, 0x0838, 0x0852, 0x085a, 0x0863, 0x086a, 0x0872, + 0x0878, 0x0887, 0x0896, 0x08a5, 0x08ac, 0x08b5, 0x08bf, 0x08cf, + 0x08d9, 0x08f6, 0x0900, 0x090b, 0x0915, 0x091e, 0x0927, 0x092f, + 0x093d, 0x0950, 0x0959, 0x0965, 0x096c, 0x0976, 0x098e, 0x09a8, + 0x09ad, 0x09c9, 0x09cd, 0x09d4, 0x09e2, 0x09e9, 0x09f6, 0x0a04, + 0x0a0c, 0x0a11, 0x0a18, 0x0a2d, 0x0a33, 0x0a3b, 0x0a45, 0x0a4c, + 0x0a52, 0x0a65, 0x0a81, 0x0a89, 0x0a95, 0x0a9e, 0x0ab9, 0x0ac3, + 0x0ad4, 0x0ae3, 0x0aeb, 0x0af2, 0x0b02, 0x0b07, 0x0b0d, 0x0b13, + // Entry 100 - 13F + 0x0b19, 0x0b32, 0x0b39, 0x0b41, 0x0b53, 0x0b5a, 0x0b61, 0x0b6f, + 0x0b7d, 0x0b86, 0x0b93, 0x0ba2, 0x0bb0, 0x0bbe, 0x0bca, 0x0bd8, + 0x0bdf, 0x0bf6, 0x0c0d, 0x0c1a, 0x0c27, 0x0c3c, 0x0c49, 0x0c57, + 0x0c62, 0x0c78, 0x0c83, 0x0c89, 0x0c97, 0x0ca3, 0x0ca9, 0x0cb6, + 0x0cc3, 0x0ccf, 0x0cdd, +} // Size: 606 bytes + +var mkRegionStr string = "" + // Size: 6058 bytes + "Остров АсенсионАндораОбединети Арапски ЕмиратиАвганистанАнтигва и Барбуд" + + "аАнгвилаАлбанијаЕрменијаХоландски АнтилиАнголаАнтарктикАргентинаАмерика" + + "нска СамоаАвстријаАвстралијаАрубаОландски островиАзербејџанБосна и Херц" + + "еговинаБарбадосБангладешБелгијаБуркина ФасоБугаријаБахреинБурундиБенинС" + + "вети ВартоломејБермудиБрунејБоливијаКарипска ХоландијаБразилБахамиБутан" + + "Остров БувеБоцванаБелорусијаБелизеКанадаКокосови (Килиншки) ОстровиКонг" + + "о - КиншасаЦентралноафриканска РепубликаКонго - БразавилШвајцаријаБрего" + + "т на Слоновата КоскаКукови ОстровиЧилеКамерунКинаКолумбијаОстров Клипер" + + "тонКостарикаКубаЗелен ’РтКурасаоБожиќен ОстровКипарРепублика ЧешкаГерма" + + "нијаДиего ГарсијаЏибутиДанскаДоминикаДоминиканска РепубликаАлжирСеута и" + + " МелиљаЕквадорЕстонијаЕгипетЗападна СахараЕритрејаШпанијаЕтиопијаЕвропск" + + "а унијаФинскаФиџиФолкландски ОстровиМикронезијаФарски ОстровиФранцијаГа" + + "бонОбединето КралствоГренадаГрузијаФранцуска ГвајанаГернзиГанаГибралтар" + + "ГренландГамбијаГвинејаГвадалупеЕкваторска ГвинејаГрцијаЈужна Џорџија и " + + "Јужни Сендвички ОстровиГватемалаГвамГвинеја-БисауГвајанаХонг Конг С.А.Р" + + " КинаОстров Херд и Острови МакдоналдХондурасХрватскаХаитиУнгаријаКанарск" + + "и ОстровиИндонезијаИрскаИзраелОстров МанИндијаБританска Индоокеанска Те" + + "риторијаИракИранИсландИталијаЏерсиЈамајкаЈорданЈапонијаКенијаКиргистанК" + + "амбоџаКирибатиКоморски ОстровиСвети Кристофер и НевисСеверна КорејаЈужн" + + "а КорејаКувајтКајмански ОстровиКазахстанЛаосЛибанСвета ЛуцијаЛихтенштај" + + "нШри ЛанкаЛиберијаЛесотоЛитванијаЛуксембургЛатвијаЛибијаМарокоМонакоМол" + + "давијаЦрна ГораСент МартинМадагаскарМаршалски ОстровиМакедонијаМалиМјан" + + "мар (Бурма)МонголијаМакао С.А.Р КинаСеверни Маријански ОстровиМартиникМ" + + "авританијаМонсератМалтаМаврициусМалдивиМалавиМексикоМалезијаМозамбикНам" + + "ибијаНова КаледонијаНигерНорфолшки ОстровНигеријаНикарагваХоландијаНорв" + + "ешкаНепалНауруНиуеНов ЗеландОманПанамаПеруФранцуска ПолинезијаПапуа Нов" + + "а ГвинејаФилипиниПакистанПолскаСент Пјер и МикеланПиткернски ОстровиПор" + + "торикоПалестински територииПортугалијаПалауПарагвајКатарЗависни земји в" + + "о ОкеанијаРијунионРоманијаСрбијаРусијаРуандаСаудиска АрабијаСоломонски " + + "ОстровиСејшелиСуданШведскаСингапурСвета ЕленаСловенијаСвалбард и Жан Ме" + + "јенСловачкаСиера ЛеонеСан МариноСенегалСомалијаСуринамЈужен СуданСао То" + + "ме и ПринсипеЕл СалвадорСвети МартинСиријаСвазилендТристан да КуњаОстро" + + "ви Туркс и КајкосЧадФранцуски Јужни територииТогоТајландТаџикистанТокел" + + "ауИсточен Тимор (Тимор Лесте)ТуркменистанТунисТонгаТурцијаТринидад и То" + + "багоТувалуТајванТанзанијаУкраинаУгандаАмерикански територии во Пацифико" + + "тСоединети Американски ДржавиУругвајУзбекистанВатиканСвети Винсент и Гр" + + "енадинитеВенецуелаБритански Девствени ОстровиАмерикански Девствени Остр" + + "овиВиетнамВануатуВалис и ФутунаСамоаКосовоЈеменМајотЈужноафриканска Реп" + + "убликаЗамбијаЗимбабвеНепознат регионСветАфрикаСеверна АмерикаЈужна Амер" + + "икаОкеанијаЗападна АфрикаЦентрална АмерикаИсточна АфрикаСеверна АфрикаС" + + "редна АфрикаЈужна АфрикаАмерикиСеверна континентална АмерикаКарибиИсточ" + + "на АзијаЈужна АзијаЈугоисточна АзијаЈужна ЕвропаАвстралазијаМеланезијаМ" + + "икронезиски регионПолинезијаАзијаЦентрална АзијаЗападна АзијаЕвропаИсто" + + "чна ЕвропаСеверна ЕвропаЗападна ЕвропаЛатинска Америка" + +var mkRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x001d, 0x0029, 0x0059, 0x006d, 0x008d, 0x009b, 0x00ab, + 0x00bb, 0x00da, 0x00e6, 0x00f8, 0x010a, 0x012b, 0x013b, 0x014f, + 0x0159, 0x0178, 0x018c, 0x01b0, 0x01c0, 0x01d2, 0x01e0, 0x01f7, + 0x0207, 0x0215, 0x0223, 0x022d, 0x024c, 0x025a, 0x0266, 0x0276, + 0x0299, 0x02a5, 0x02b1, 0x02bb, 0x02d0, 0x02de, 0x02f2, 0x02fe, + 0x030a, 0x033c, 0x0357, 0x0390, 0x03ad, 0x03c1, 0x03f0, 0x040b, + 0x0413, 0x0421, 0x0429, 0x043b, 0x045a, 0x046c, 0x0474, 0x0486, + 0x0494, 0x04af, 0x04b9, 0x04d6, 0x04e8, 0x0501, 0x050d, 0x0519, + // Entry 40 - 7F + 0x0529, 0x0554, 0x055e, 0x0578, 0x0586, 0x0596, 0x05a2, 0x05bd, + 0x05cd, 0x05db, 0x05eb, 0x0606, 0x0612, 0x061a, 0x063f, 0x0655, + 0x0670, 0x0680, 0x068a, 0x06ad, 0x06bb, 0x06c9, 0x06ea, 0x06f6, + 0x06fe, 0x0710, 0x0720, 0x072e, 0x073c, 0x074e, 0x0771, 0x077d, + 0x07c6, 0x07d8, 0x07e0, 0x07f9, 0x0807, 0x082a, 0x0864, 0x0874, + 0x0884, 0x088e, 0x089e, 0x08bd, 0x08d1, 0x08db, 0x08e7, 0x08fa, + 0x0906, 0x0946, 0x094e, 0x0956, 0x0962, 0x0970, 0x097a, 0x0988, + 0x0994, 0x09a4, 0x09b0, 0x09c2, 0x09d0, 0x09e0, 0x09ff, 0x0a2a, + // Entry 80 - BF + 0x0a45, 0x0a5c, 0x0a68, 0x0a89, 0x0a9b, 0x0aa3, 0x0aad, 0x0ac4, + 0x0ada, 0x0aeb, 0x0afb, 0x0b07, 0x0b19, 0x0b2d, 0x0b3b, 0x0b47, + 0x0b53, 0x0b5f, 0x0b71, 0x0b82, 0x0b97, 0x0bab, 0x0bcc, 0x0be0, + 0x0be8, 0x0c03, 0x0c15, 0x0c31, 0x0c63, 0x0c73, 0x0c89, 0x0c99, + 0x0ca3, 0x0cb5, 0x0cc3, 0x0ccf, 0x0cdd, 0x0ced, 0x0cfd, 0x0d0d, + 0x0d2a, 0x0d34, 0x0d53, 0x0d63, 0x0d75, 0x0d87, 0x0d97, 0x0da1, + 0x0dab, 0x0db3, 0x0dc6, 0x0dce, 0x0dda, 0x0de2, 0x0e09, 0x0e2b, + 0x0e3b, 0x0e4b, 0x0e57, 0x0e7a, 0x0e9d, 0x0eaf, 0x0ed8, 0x0eee, + // Entry C0 - FF + 0x0ef8, 0x0f08, 0x0f12, 0x0f41, 0x0f51, 0x0f61, 0x0f6d, 0x0f79, + 0x0f85, 0x0fa4, 0x0fc7, 0x0fd5, 0x0fdf, 0x0fed, 0x0ffd, 0x1012, + 0x1024, 0x1049, 0x1059, 0x106e, 0x1081, 0x108f, 0x109f, 0x10ad, + 0x10c2, 0x10e5, 0x10fa, 0x1111, 0x111d, 0x112f, 0x114b, 0x1174, + 0x117a, 0x11aa, 0x11b2, 0x11c0, 0x11d4, 0x11e2, 0x1213, 0x122b, + 0x1235, 0x123f, 0x124d, 0x126d, 0x1279, 0x1285, 0x1297, 0x12a5, + 0x12b1, 0x12f2, 0x1328, 0x1336, 0x134a, 0x1358, 0x138b, 0x139d, + 0x13d1, 0x1409, 0x1417, 0x1425, 0x143f, 0x1449, 0x1455, 0x145f, + // Entry 100 - 13F + 0x1469, 0x149a, 0x14a8, 0x14b8, 0x14d5, 0x14dd, 0x14e9, 0x1506, + 0x151f, 0x152f, 0x154a, 0x156b, 0x1586, 0x15a1, 0x15ba, 0x15d1, + 0x15df, 0x1617, 0x1623, 0x163c, 0x1651, 0x1672, 0x1689, 0x16a1, + 0x16b5, 0x16da, 0x16ee, 0x16f8, 0x1715, 0x172e, 0x173a, 0x1755, + 0x1770, 0x178b, 0x17aa, +} // Size: 606 bytes + +var mlRegionStr string = "" + // Size: 9275 bytes + "അസൻഷൻ ദ്വീപ്അന്റോറയുണൈറ്റഡ് അറബ് എമിറൈറ്റ്\u200cസ്അഫ്\u200cഗാനിസ്ഥാൻആൻറി" + + "ഗ്വയും ബർബുഡയുംആൻഗ്വില്ലഅൽബേനിയഅർമേനിയനെതർലൻഡ്സ് ആൻറിലിസ്അംഗോളഅൻറാർട്ട" + + "ിക്കഅർജൻറീനഅമേരിക്കൻ സമോവഓസ്ട്രിയഓസ്\u200cട്രേലിയഅറൂബഅലൻഡ് ദ്വീപുകൾഅസർ" + + "ബൈജാൻബോസ്നിയയും ഹെർസഗോവിനയുംബാർബഡോസ്ബംഗ്ലാദേശ്ബെൽജിയംബുർക്കിനാ ഫാസോബൾഗ" + + "േറിയബഹ്റിൻബറുണ്ടിബെനിൻസെന്റ് ബാർത്തലമിബർമുഡബ്രൂണൈബൊളീവിയബൊണെയ്ർ, സിന്റ" + + "് യുസ്റ്റേഷ്യസ്, സാബ എന്നിവബ്രസീൽബഹാമാസ്ഭൂട്ടാൻബൗവെട്ട് ദ്വീപ്ബോട്സ്വാ" + + "നബെലറൂസ്ബെലീസ്കാനഡകോക്കസ് (കീലിംഗ്) ദ്വീപുകൾകോംഗോ - കിൻഷാസസെൻട്രൽ ആഫ്ര" + + "ിക്കൻ റിപ്പബ്ലിക്കോംഗോ - ബ്രാസവില്ലിസ്വിറ്റ്സർലാൻഡ്കോട്ട് ഡി വാർകുക്ക്" + + " ദ്വീപുകൾചിലികാമറൂൺചൈനകൊളംബിയക്ലിപ്പെർട്ടൻ ദ്വീപ്കോസ്റ്ററിക്കക്യൂബകേപ്പ്" + + " വെർദെകുറാകാവോക്രിസ്മസ് ദ്വീപ്സൈപ്രസ്ചെക്ക് റിപ്പബ്ലിക്ജർമനിഡീഗോ ഗ്രാഷ്യ" + + "ദിജിബൗട്ടിഡെൻമാർക്ക്ഡൊമിനിക്കഡൊമിനിക്കൻ റിപ്പബ്ലിക്അൾജീരിയസെയൂത്ത ആൻഡ്" + + " മെലിയഇക്വഡോർഎസ്റ്റോണിയ\u200dഈജിപ്ത്പശ്ചിമ സഹാറഎറിത്രിയസ്\u200cപെയിൻഎത്യ" + + "ോപ്യയൂറോപ്യൻ യൂണിയൻഫിൻലാൻഡ്ഫിജിഫാക്ക്\u200cലാന്റ് ദ്വീപുകൾമൈക്രോനേഷ്യഫ" + + "റോ ദ്വീപുകൾഫ്രാൻസ്ഗാബൺയുണൈറ്റഡ് കിംഗ്ഡംഗ്രനേഡജോർജ്ജിയഫ്രഞ്ച് ഗയാനഗേൺസി" + + "ഘാനജിബ്രാൾട്ടർഗ്രീൻലാൻറ്ഗാംബിയഗിനിയഗ്വാഡലൂപ്പ്ഇക്വറ്റോറിയൽ ഗിനിയഗ്രീസ്" + + "ദക്ഷിണ ജോർജ്ജിയയും ദക്ഷിണ സാൻഡ്\u200cവിച്ച് ദ്വീപുകളുംഗ്വാട്ടിമാലഗ്വാം" + + "ഗിനിയ-ബിസൗഗയാനഹോങ്കോങ്ങ് (SAR) ചൈനഹിയേർഡും മക്\u200cഡൊണാൾഡ് ദ്വീപുകളും" + + "ഹോണ്ടുറാസ്ക്രൊയേഷ്യഹെയ്തിഹംഗറികാനറി ദ്വീപുകൾഇന്തോനേഷ്യഅയർലാൻഡ്ഇസ്രായേൽ" + + "ഐൽ ഓഫ് മാൻഇന്ത്യബ്രിട്ടീഷ് ഇന്ത്യൻ മഹാസമുദ്ര പ്രദേശംഇറാഖ്ഇറാൻഐസ്\u200c" + + "ലാന്റ്ഇറ്റലിജേഴ്സിജമൈക്കജോർദ്ദാൻജപ്പാൻകെനിയകിർഗിസ്ഥാൻകംബോഡിയകിരിബാട്ടി" + + "കോമൊറോസ്സെന്റ് കിറ്റ്\u200cസും നെവിസുംഉത്തരകൊറിയദക്ഷിണകൊറിയകുവൈറ്റ്കേമ" + + "ാൻ ദ്വീപുകൾകസാഖിസ്ഥാൻലാവോസ്ലെബനൻസെൻറ് ലൂസിയലിച്ചൺസ്റ്റൈൻശ്രീലങ്കലൈബീരി" + + "യലെസോതോലിത്വാനിയലക്സംബർഗ്ലാറ്റ്വിയലിബിയമൊറോക്കൊമൊണാക്കോമൾഡോവമോണ്ടെനെഗ്" + + "രോസെൻറ് മാർട്ടിൻമഡഗാസ്കർമാർഷൽ\u200d\u200d ദ്വീപുകൾമാസിഡോണിയമാലിമ്യാൻമാ" + + "ർ (ബർമ്മ)മംഗോളിയമക്കാവു (SAR) ചൈനഉത്തര മറിയാനാ ദ്വീപുകൾമാർട്ടിനിക്ക്മൗ" + + "റിറ്റാനിയമൊണ്ടെസരത്ത്മാൾട്ടമൗറീഷ്യസ്മാലിദ്വീപ്മലാവിമെക്സിക്കോമലേഷ്യമൊസ" + + "ാംബിക്ക്നമീബിയപുതിയ കാലിഡോണിയനൈജർനോർഫോക് ദ്വീപ്നൈജീരിയനിക്കരാഗ്വനെതർലാ" + + "ൻഡ്\u200cസ്നോർവെനേപ്പാൾനൗറുന്യൂയിന്യൂസിലാൻറ്ഒമാൻപനാമപെറുഫ്രഞ്ച് പോളിനേ" + + "ഷ്യപാപ്പുവ ന്യൂ ഗിനിയഫിലിപ്പൈൻസ്പാക്കിസ്ഥാൻപോളണ്ട്സെന്റ് പിയറിയും മിക്" + + "കലണുംപിറ്റ്\u200cകെയ്\u200cൻ ദ്വീപുകൾപ്യൂർട്ടോ റിക്കോപാലസ്\u200cതീൻ പ്" + + "രദേശങ്ങൾപോർച്ചുഗൽപലാവുപരാഗ്വേഖത്തർദ്വീപസമൂഹംറീയൂണിയൻറൊമാനിയസെർബിയറഷ്യറ" + + "ുവാണ്ടസൗദി അറേബ്യസോളമൻ\u200d ദ്വീപുകൾസെയ്\u200cഷെൽസ്സുഡാൻസ്വീഡൻസിംഗപ്പ" + + "ുർസെൻറ് ഹെലീനസ്ലോവേനിയസ്വാൽബാഡും ജാൻ മായേനുംസ്ലോവാക്യസിയെറ ലിയോൺസാൻ മറ" + + "ിനോസെനഗൽസോമാലിയസുരിനെയിംദക്ഷിണ സുഡാൻസാവോ ടോമും പ്രിൻസിപെയുംഎൽ സാൽവദോർസ" + + "ിന്റ് മാർട്ടെൻസിറിയസ്വാസിലാൻറ്ട്രസ്റ്റൻ ഡ കൂനടർക്ക്\u200cസും കെയ്" + + "\u200cക്കോ ദ്വീപുകളുംഛാഡ്ഫ്രഞ്ച് ദക്ഷിണ ഭൂപ്രദേശംടോഗോതായ്\u200cലാൻഡ്താജി" + + "ക്കിസ്ഥാൻടോക്കെലൂതിമോർ-ലെസ്റ്റെതുർക്ക്മെനിസ്ഥാൻടുണീഷ്യടോംഗതുർക്കിട്രിന" + + "ിഡാഡും ടുബാഗോയുംടുവാലുതായ്\u200cവാൻടാൻസാനിയഉക്രെയ്\u200cൻഉഗാണ്ടയു.എസ്." + + " ദ്വീപസമൂഹങ്ങൾഅമേരിക്കൻ ഐക്യനാടുകൾഉറുഗ്വേഉസ്\u200cബെക്കിസ്ഥാൻവത്തിക്കാൻസ" + + "െന്റ് വിൻസെന്റും ഗ്രനെഡൈൻസുംവെനിസ്വേലബ്രിട്ടീഷ് വെർജിൻ ദ്വീപുകൾയു.എസ്." + + " വെർജിൻ ദ്വീപുകൾവിയറ്റ്നാംവന്വാതുവാലിസ് ആന്റ് ഫ്യൂച്യുനസമോവകൊസോവൊയെമൻമയോ" + + "ട്ടിദക്ഷിണാഫ്രിക്കസാംബിയസിംബാബ്\u200cവേഅജ്ഞാത പ്രദേശംലോകംആഫ്രിക്കവടക്ക" + + "േ അമേരിക്കതെക്കേ അമേരിക്കഓഷ്യാനിയപശ്ചിമ ആഫ്രിക്കമദ്ധ്യഅമേരിക്കകിഴക്കൻ " + + "ആഫ്രിക്കഉത്തരാഫ്രിക്കമദ്ധ്യആഫ്രിക്കതെക്കേ ആഫ്രിക്കഅമേരിക്കകൾവടക്കൻ അമേ" + + "രിക്കകരീബിയൻകിഴക്കൻ ഏഷ്യതെക്കേ ഏഷ്യതെക്ക്-കിഴക്കൻ ഏഷ്യതെക്കേ യൂറോപ്പ്ഓ" + + "സ്\u200cട്രേലിയയും ന്യൂസിലാൻഡുംമെലനേഷ്യമൈക്രോനേഷ്യൻ പ്രദേശംപോളിനേഷ്യഏഷ" + + "്യമദ്ധ്യേഷ്യപശ്ചിമേഷ്യയൂറോപ്പ്കിഴക്കൻ യൂറോപ്പ്വടക്കേ യൂറോപ്പ്പശ്ചിമ യൂ" + + "റോപ്പ്ലാറ്റിനമേരിക്ക" + +var mlRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0022, 0x0034, 0x0081, 0x00a8, 0x00df, 0x00fa, 0x010f, + 0x0124, 0x015b, 0x016a, 0x018e, 0x01a3, 0x01cb, 0x01e3, 0x0204, + 0x0210, 0x0238, 0x0250, 0x0293, 0x02ab, 0x02c9, 0x02de, 0x0306, + 0x031b, 0x032d, 0x0342, 0x0351, 0x037f, 0x038e, 0x03a0, 0x03b5, + 0x0424, 0x0436, 0x044b, 0x0460, 0x048b, 0x04a6, 0x04bb, 0x04cd, + 0x04d9, 0x051f, 0x0543, 0x0596, 0x05c9, 0x05f6, 0x0619, 0x0644, + 0x0650, 0x0662, 0x066b, 0x0680, 0x06ba, 0x06de, 0x06ed, 0x070f, + 0x0727, 0x0755, 0x076a, 0x079e, 0x07ad, 0x07cf, 0x07ed, 0x080b, + // Entry 40 - 7F + 0x0826, 0x0866, 0x087b, 0x08ad, 0x08c2, 0x08e3, 0x08f8, 0x0917, + 0x092f, 0x0947, 0x095f, 0x098a, 0x09a2, 0x09ae, 0x09ee, 0x0a0f, + 0x0a31, 0x0a46, 0x0a52, 0x0a83, 0x0a95, 0x0aad, 0x0acf, 0x0ade, + 0x0ae7, 0x0b08, 0x0b26, 0x0b38, 0x0b47, 0x0b68, 0x0b9c, 0x0bae, + 0x0c39, 0x0c5a, 0x0c69, 0x0c85, 0x0c91, 0x0cbf, 0x0d18, 0x0d36, + 0x0d51, 0x0d63, 0x0d72, 0x0d9a, 0x0db8, 0x0dd0, 0x0de8, 0x0e02, + 0x0e14, 0x0e7a, 0x0e89, 0x0e95, 0x0eb3, 0x0ec5, 0x0ed7, 0x0ee9, + 0x0f01, 0x0f13, 0x0f22, 0x0f40, 0x0f55, 0x0f73, 0x0f8b, 0x0fd2, + // Entry 80 - BF + 0x0ff0, 0x1011, 0x1029, 0x1051, 0x106f, 0x1081, 0x1090, 0x10af, + 0x10d6, 0x10ee, 0x1103, 0x1115, 0x1130, 0x114b, 0x1166, 0x1175, + 0x118d, 0x11a5, 0x11b4, 0x11d8, 0x1200, 0x1218, 0x1246, 0x1261, + 0x126d, 0x1297, 0x12ac, 0x12d1, 0x130f, 0x1336, 0x1357, 0x137b, + 0x138d, 0x13a8, 0x13c6, 0x13d5, 0x13f3, 0x1405, 0x1426, 0x1438, + 0x1463, 0x146f, 0x1497, 0x14ac, 0x14ca, 0x14ee, 0x14fd, 0x1512, + 0x151e, 0x1530, 0x1551, 0x155d, 0x1569, 0x1575, 0x15a6, 0x15d8, + 0x15f9, 0x161a, 0x162f, 0x1676, 0x16b6, 0x16e4, 0x171e, 0x1739, + // Entry C0 - FF + 0x1748, 0x175d, 0x176c, 0x178a, 0x17a2, 0x17b7, 0x17c9, 0x17d5, + 0x17ea, 0x1809, 0x1834, 0x1852, 0x1861, 0x1873, 0x188e, 0x18ad, + 0x18c8, 0x1906, 0x1921, 0x1940, 0x1959, 0x1968, 0x197d, 0x1998, + 0x19ba, 0x19fb, 0x1a17, 0x1a42, 0x1a51, 0x1a72, 0x1a9b, 0x1af4, + 0x1b00, 0x1b44, 0x1b50, 0x1b6e, 0x1b95, 0x1bad, 0x1bd5, 0x1c05, + 0x1c1a, 0x1c26, 0x1c3b, 0x1c78, 0x1c8a, 0x1ca2, 0x1cba, 0x1cd5, + 0x1ce7, 0x1d20, 0x1d5a, 0x1d6f, 0x1d9c, 0x1dba, 0x1e0d, 0x1e28, + 0x1e72, 0x1eaf, 0x1ecd, 0x1ee2, 0x1f20, 0x1f2c, 0x1f3e, 0x1f4a, + // Entry 100 - 13F + 0x1f5f, 0x1f89, 0x1f9b, 0x1fb9, 0x1fe1, 0x1fed, 0x2005, 0x2030, + 0x205b, 0x2073, 0x209e, 0x20c8, 0x20f6, 0x211d, 0x2147, 0x2172, + 0x2190, 0x21bb, 0x21d0, 0x21f2, 0x2211, 0x2246, 0x2271, 0x22c0, + 0x22d8, 0x2312, 0x232d, 0x2339, 0x2357, 0x2375, 0x238d, 0x23bb, + 0x23e6, 0x2411, 0x243b, +} // Size: 606 bytes + +var mnRegionStr string = "" + // Size: 5487 bytes + "Аскенсион АралАндорраАрабын Нэгдсэн ЭмиратАфганистанАнтигуа ба БарбудаАн" + + "гилаАлбаниАрменАнголАнтарктикАргентинАмерикийн СамоаАвстриАвстралиАруба" + + "Аландын АрлуудАзербайжанБосни ХерцеговинБарбадосБангладешБелгиБуркина ф" + + "асоБолгарБахрейнБурундиБенинСент БартельмиБермудБрунейБоливиКарибын Нид" + + "ерландБразилБагамБутанБуветын АрлуудБотсванаБеларусБелизКанадКокос (Кий" + + "линг) АрлуудКонго-КиншасаТөв Африкийн Бүгд Найрамдах УлсКонго Браззавил" + + "ьШвейцариКот д’ИвуарКүүкийн АрлуудЧилиКамерунХятадКолумбКлиппертон Арал" + + "Коста РикаКубаКапе ВердеКуракаоЗул Сарын АралКипрБүгд Найрамдах Чех Улс" + + "ГерманДиего ГарсиаДжибутиДаниДоминикБүгд Найрамдах ДоминиканАлжирСеута " + + "ба МелильяЭквадорЭстонЕгипетБаруун СахарЭритриИспаниЭтиопЕвропын Холбоо" + + "ФинландФижиФолькландын АрлуудМикронезиФароэ АрлуудФранцГабонИх БританиГ" + + "ренадаГүржФранцын ГайанаГернсиГанаГибралтарГренландГамбиГвинейГваделупЭ" + + "кваторын ГвинейГрекӨмнөд Жоржиа ба Өмнөд Сэндвичийн АрлуудГватемалГуамГ" + + "виней-БисауГайанаБНХАУ-ын Тусгай захиргааны бүс Хонг КонгХэрд болон Мак" + + "доналд АрлуудГондурасХорватГаитиУнгарКанарын арлуудИндонезиИрландИзраил" + + "ьМэн АралЭнэтхэгБританийн харьяа Энэтхэгийн далай дахь нутаг дэвсгэрүүд" + + "ИракИранИсландИталиЖерсиЯмайкЙорданЯпонКениКыргызстанКамбожКирибатиКомо" + + "росСент-Киттс ба НевисХойд СолонгосӨмнөд СолонгосКувейтКайманы АрлуудКа" + + "захстанЛаосЛиванСент ЛюсиаЛихтенштейнШри ЛанкаЛибериЛесотоЛитваЛюксембу" + + "ргЛатвиЛивиМароккоМонакоМолдавМонтенегроСент-МартинМадагаскарМаршаллын " + + "АрлуудМакедонМалиМьянмар (Бурма)МонголБНХАУ-ын Тусгай захиргааны бүс Ма" + + "каоХойд Марианы АрлуудМартиникМавританиМонтсерратМальтаМавритусМальдивМ" + + "алавиМексикМалайзМозамбикНамибиШинэ КаледониНигерНорфолк АрлуудНигериНи" + + "карагуаНидерландНорвегиБалбаНауруНиуэШинэ ЗеландОманПанамПеруФранцын По" + + "линезПапуа Шинэ ГвинейФилиппинПакистанПольшСэнт Пьер ба МикелонПиткэрн " + + "АрлуудПуэрто РикоПалестины нутаг дэвсгэрүүдПортугалПалауПарагвайКатарНо" + + "мхон далайг тойрсон улс орнуудРеюньонРумынСербиОросРуандаСаудын АрабСол" + + "омоны АрлуудСейшелСуданШведСингапурСент ХеленаСловениСвалбард ба Ян Май" + + "енСловакСьерра-ЛеонеСан-МариноСенегалСомалиСуринамӨмнөд СуданСан-Томе б" + + "а ПринсипиЭль СальвадорСинт МартенСириСвазиландТристан да КуньяТурк ба " + + "Кайкосын АрлуудЧадФранцын өмнөд газар нутагТогоТайландТажикистанТокелау" + + "Тимор-ЛестеТуркменистанТунисТонгаТуркТринидад ба ТобагоТувалуТайванТанз" + + "аниУкрайнУгандаАНУ-ын тойрсон арлуудАмерикийн Нэгдсэн УлсУругвайУзбекис" + + "танВатикан хот улсСэнт Винсэнт ба ГренадинВенесуэлБританийн Виржиний Ар" + + "луудАНУ-ын Виржиний АрлуудВьетнамВануатуУоллис ба ФутунаСамоаКосовоЙеме" + + "нМайоттеӨмнөд Африк тивЗамбиЗимбабвеТодорхойгүйДэлхийАфрикХойд АмерикӨм" + + "нөд АмерикНомхон далайн орнуудБаруун АфрикТөв АмерикЗүүн АфрикХойд Афри" + + "кТөв АфрикӨмнөд АфрикАмерикХойд Америк тивКарибынЗүүн АзиӨмнөд АзиЗүүн " + + "Өмнөд АзиӨмнөд ЕвропАвстралиазиМеланезиМикронезийн бүсПолинезАзиТөв Ази" + + "Баруун АзиЕвропЗүүн ЕвропХойд ЕвропБаруун ЕвропЛатин Америк" + +var mnRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x001b, 0x0029, 0x0051, 0x0065, 0x0087, 0x0093, 0x009f, + 0x00a9, 0x00a9, 0x00b3, 0x00c5, 0x00d5, 0x00f2, 0x00fe, 0x010e, + 0x0118, 0x0133, 0x0147, 0x0166, 0x0176, 0x0188, 0x0192, 0x01a9, + 0x01b5, 0x01c3, 0x01d1, 0x01db, 0x01f6, 0x0202, 0x020e, 0x021a, + 0x023b, 0x0247, 0x0251, 0x025b, 0x0276, 0x0286, 0x0294, 0x029e, + 0x02a8, 0x02d0, 0x02e9, 0x0323, 0x0342, 0x0352, 0x0368, 0x0383, + 0x038b, 0x0399, 0x03a3, 0x03af, 0x03cc, 0x03df, 0x03e7, 0x03fa, + 0x0408, 0x0422, 0x042a, 0x0453, 0x045f, 0x0476, 0x0484, 0x048c, + // Entry 40 - 7F + 0x049a, 0x04c8, 0x04d2, 0x04f0, 0x04fe, 0x0508, 0x0514, 0x052b, + 0x0537, 0x0543, 0x054d, 0x0568, 0x0576, 0x057e, 0x05a1, 0x05b3, + 0x05ca, 0x05d4, 0x05de, 0x05f1, 0x05ff, 0x0607, 0x0622, 0x062e, + 0x0636, 0x0648, 0x0658, 0x0662, 0x066e, 0x067e, 0x069d, 0x06a5, + 0x06ee, 0x06fe, 0x0706, 0x071d, 0x0729, 0x0773, 0x07a6, 0x07b6, + 0x07c2, 0x07cc, 0x07d6, 0x07f1, 0x0801, 0x080d, 0x081b, 0x082a, + 0x0838, 0x08a0, 0x08a8, 0x08b0, 0x08bc, 0x08c6, 0x08d0, 0x08da, + 0x08e6, 0x08ee, 0x08f6, 0x090a, 0x0916, 0x0926, 0x0934, 0x0957, + // Entry 80 - BF + 0x0970, 0x098b, 0x0997, 0x09b2, 0x09c4, 0x09cc, 0x09d6, 0x09e9, + 0x09ff, 0x0a10, 0x0a1c, 0x0a28, 0x0a32, 0x0a46, 0x0a50, 0x0a58, + 0x0a66, 0x0a72, 0x0a7e, 0x0a92, 0x0aa7, 0x0abb, 0x0ada, 0x0ae8, + 0x0af0, 0x0b0b, 0x0b17, 0x0b5a, 0x0b7e, 0x0b8e, 0x0ba0, 0x0bb4, + 0x0bc0, 0x0bd0, 0x0bde, 0x0bea, 0x0bf6, 0x0c02, 0x0c12, 0x0c1e, + 0x0c37, 0x0c41, 0x0c5c, 0x0c68, 0x0c7a, 0x0c8c, 0x0c9a, 0x0ca4, + 0x0cae, 0x0cb6, 0x0ccb, 0x0cd3, 0x0cdd, 0x0ce5, 0x0d02, 0x0d22, + 0x0d32, 0x0d42, 0x0d4c, 0x0d71, 0x0d8c, 0x0da1, 0x0dd3, 0x0de3, + // Entry C0 - FF + 0x0ded, 0x0dfd, 0x0e07, 0x0e43, 0x0e51, 0x0e5b, 0x0e65, 0x0e6d, + 0x0e79, 0x0e8e, 0x0eab, 0x0eb7, 0x0ec1, 0x0ec9, 0x0ed9, 0x0eee, + 0x0efc, 0x0f21, 0x0f2d, 0x0f44, 0x0f57, 0x0f65, 0x0f71, 0x0f7f, + 0x0f94, 0x0fb9, 0x0fd2, 0x0fe7, 0x0fef, 0x1001, 0x101f, 0x104a, + 0x1050, 0x107f, 0x1087, 0x1095, 0x10a9, 0x10b7, 0x10cc, 0x10e4, + 0x10ee, 0x10f8, 0x1100, 0x1122, 0x112e, 0x113a, 0x1148, 0x1154, + 0x1160, 0x1187, 0x11af, 0x11bd, 0x11d1, 0x11ed, 0x121a, 0x122a, + 0x125a, 0x1283, 0x1291, 0x129f, 0x12bd, 0x12c7, 0x12d3, 0x12dd, + // Entry 100 - 13F + 0x12eb, 0x1307, 0x1311, 0x1321, 0x1337, 0x1343, 0x134d, 0x1362, + 0x1379, 0x139f, 0x13b6, 0x13c9, 0x13dc, 0x13ef, 0x1400, 0x1415, + 0x1421, 0x143d, 0x144b, 0x145a, 0x146b, 0x1485, 0x149a, 0x14b0, + 0x14c0, 0x14dd, 0x14eb, 0x14f1, 0x14fe, 0x1511, 0x151b, 0x152e, + 0x1541, 0x1558, 0x156f, +} // Size: 606 bytes + +var mrRegionStr string = "" + // Size: 8490 bytes + "अ\u200dॅसेन्शियन बेटअँडोरासंयुक्त अरब अमीरातअफगाणिस्तानअँटिग्वा आणि बर्ब" + + "ुडाअँग्विलाअल्बानियाअर्मेनियानेदरलँड्\u200dस अँ\u200dटिल्सअंगोलाअंटार्" + + "क्टिकाअर्जेंटिनाअमेरिकन सामोआऑस्ट्रियाऑस्ट्रेलियाअरुबाअ\u200dॅलँड बेटे" + + "अझरबैजानबोस्निया अणि हर्जेगोविनाबार्बाडोसबांगलादेशबेल्जियमबुर्किना फास" + + "ोबल्गेरियाबहारीनबुरुंडीबेनिनसेंट बार्थेलेमीबर्मुडाब्रुनेईबोलिव्हियाकॅर" + + "िबियन नेदरलँड्सब्राझिलबहामाजभूतानबोउवेट बेटबोट्सवानाबेलारूसबलिझकॅनडाको" + + "कोस (कीलिंग) बेटेकाँगो - किंशासाकेंद्रीय अफ्रिकी प्रजासत्ताककाँगो - ब्" + + "राझाविलेस्वित्झर्लंडआयव्हरी कोस्टकुक बेटेचिलीकॅमेरूनचीनकोलम्बियाक्लिपर" + + "टोन बेटकोस्टा रिकाक्यूबाकेप व्हर्डेक्युरासाओख्रिसमस बेटसायप्रसझेक प्रज" + + "ासत्ताकजर्मनीदिएगो गार्सियाजिबौटीडेन्मार्कडोमिनिकाडोमिनिकन प्रजासत्ताक" + + "अल्जीरियास्यूटा आणि मेलिलाइक्वाडोरएस्टोनियाइजिप्तपश्चिम सहाराएरिट्रिया" + + "स्पेनइथिओपियायुरोपीय संघफिनलंडफिजीफॉकलंड बेटेमायक्रोनेशियाफेरो बेटेफ्र" + + "ान्सगॅबॉनयुनायटेड किंगडमग्रेनेडाजॉर्जियाफ्रेंच गयानाग्वेर्नसेघानाजिब्र" + + "ाल्टरग्रीनलंडगाम्बियागिनीग्वाडेलोउपेइक्वेटोरियल गिनीग्रीसदक्षिण जॉर्जि" + + "या आणि दक्षिण सँडविच बेटेग्वाटेमालागुआमगिनी-बिसाउगयानाहाँगकाँग एसएआर च" + + "ीनहर्ड आणि मॅक्डोनाल्ड बेटेहोंडुरासक्रोएशियाहैतीहंगेरीकॅनरी बेटेइंडोने" + + "शियाआयर्लंडइस्त्राइलइस्ले ऑफ मॅनभारतब्रिटिश हिंदी महासागर क्षेत्रइराकइ" + + "राणआइसलँडइटलीजर्सीजमैकाजॉर्डनजपानकेनियाकिरगिझस्तानकंबोडियाकिरीबाटीकोमो" + + "रोजसेंट किट्स आणि नेव्हिसउत्तर कोरियादक्षिण कोरियाकुवेतकेमन बेटेकझाकस्" + + "तानलाओसलेबनॉनसेंट ल्यूसियालिक्टेनस्टाइनश्रीलंकालायबेरियालेसोथोलिथुआनिय" + + "ालक्झेंबर्गलात्वियालिबियामोरोक्कोमोनॅकोमोल्डोव्हामोंटेनेग्रोसेंट मार्ट" + + "िनमादागास्करमार्शल बेटेमॅसेडोनियामालीम्यानमार (बर्मा)मंगोलियामकाओ एसएआ" + + "र चीनउत्तरी मारियाना बेटेमार्टिनिकमॉरिटानियामॉन्ट्सेराटमाल्टामॉरिशसमाल" + + "दीवमलावीमेक्सिकोमलेशियामोझाम्बिकनामिबियान्यू कॅलेडोनियानाइजरनॉरफॉक बेट" + + "नायजेरियानिकाराग्वानेदरलँडनॉर्वेनेपाळनाउरूनीयून्यूझीलंडओमानपनामापेरूफ्" + + "रेंच पॉलिनेशियापापुआ न्यू गिनीफिलिपिन्सपाकिस्तानपोलंडसेंट पियरे आणि मि" + + "क्वेलोनपिटकैर्न बेटेप्युएर्तो रिकोपॅलेस्टिनियन प्रदेशपोर्तुगालपलाऊपराग" + + "्वेकतारआउटलाईंग ओशनियारियुनियनरोमानियासर्बियारशियारवांडासौदी अरबसोलोमन" + + " बेटेसेशेल्ससुदानस्वीडनसिंगापूरसेंट हेलेनास्लोव्हेनियास्वालबर्ड आणि जान " + + "मायेनस्लोव्हाकियासिएरा लिओनसॅन मरीनोसेनेगलसोमालियासुरिनामदक्षिण सुदानस" + + "ाओ टोम आणि प्रिंसिपेअल साल्वाडोरसिंट मार्टेनसीरियास्वाझिलँडट्रिस्टन दा" + + " कुन्हाटर्क्स आणि कैकोस बेटेचाडफ्रेंच दाक्षिणात्य प्रदेशटोगोथायलंडताजिकि" + + "स्तानतोकेलाउपूर्व तिमोरतुर्कमेनिस्तानट्यूनिशियाटोंगातुर्कीत्रिनिदाद आण" + + "ि टोबॅगोटुवालुतैवानटांझानियायुक्रेनयुगांडायू.एस. आउटलाइंग बेटेयुनायटेड" + + " स्टेट्सउरुग्वेउझबेकिस्तानव्हॅटिकन सिटीसेंट व्हिन्सेंट आणि ग्रेनडाइन्सव्" + + "हेनेझुएलाब्रिटिश व्हर्जिन बेटेयू.एस. व्हर्जिन बेटेव्हिएतनामवानुआतुवालि" + + "स आणि फ्यूचूनासामोआकोसोव्होयेमेनमायोट्टेदक्षिण आफ्रिकाझाम्बियाझिम्बाब्" + + "वेअज्ञात प्रदेशविश्वआफ्रिकाउत्तर अमेरिकादक्षिण अमेरिकाओशनियापश्चिम आफ्" + + "रिकामध्य अमेरिकापूर्व आफ्रिकाउत्तर आफ्रिकामध्य आफ्रिकादक्षिणी आफ्रिकाअ" + + "मेरिकाउत्तरी अमेरिकाकॅरीबियनपूर्व आशियादक्षिण आशियादक्षिण पूर्व आशियाद" + + "क्षिण युरोपऑस्\u200dट्रेलेशियामेलानेशियामायक्रोनेशियन प्रदेशपॉलिनेशिया" + + "अशियामध्य आशियापश्चिम आशियायुरोपपूर्व युरोपउत्तर युरोपपश्चिम युरोपलॅटि" + + "न अमेरिका" + +var mrRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x002b, 0x003d, 0x006f, 0x0090, 0x00c8, 0x00e0, 0x00fb, + 0x0116, 0x014d, 0x015f, 0x0183, 0x01a1, 0x01c6, 0x01e1, 0x0202, + 0x0211, 0x0230, 0x0248, 0x028c, 0x02a7, 0x02c2, 0x02da, 0x02ff, + 0x031a, 0x032c, 0x0341, 0x0350, 0x037b, 0x0390, 0x03a5, 0x03c3, + 0x03f7, 0x040c, 0x041e, 0x042d, 0x0449, 0x0464, 0x0479, 0x0485, + 0x0494, 0x04c5, 0x04ec, 0x053c, 0x056c, 0x0590, 0x05b5, 0x05cb, + 0x05d7, 0x05ec, 0x05f5, 0x0610, 0x0635, 0x0654, 0x0666, 0x0685, + 0x06a0, 0x06bf, 0x06d4, 0x06ff, 0x0711, 0x0739, 0x074b, 0x0766, + // Entry 40 - 7F + 0x077e, 0x07b8, 0x07d3, 0x0802, 0x081a, 0x0835, 0x0847, 0x0869, + 0x0884, 0x0893, 0x08ab, 0x08ca, 0x08dc, 0x08e8, 0x0907, 0x092e, + 0x0947, 0x095c, 0x096b, 0x0996, 0x09ae, 0x09c6, 0x09e8, 0x0a03, + 0x0a0f, 0x0a2d, 0x0a45, 0x0a5d, 0x0a69, 0x0a8a, 0x0ab8, 0x0ac7, + 0x0b2f, 0x0b4d, 0x0b59, 0x0b75, 0x0b84, 0x0bb6, 0x0bfb, 0x0c13, + 0x0c2e, 0x0c3a, 0x0c4c, 0x0c68, 0x0c86, 0x0c9b, 0x0cb6, 0x0cd6, + 0x0ce2, 0x0d33, 0x0d3f, 0x0d4b, 0x0d5d, 0x0d69, 0x0d78, 0x0d87, + 0x0d99, 0x0da5, 0x0db7, 0x0dd8, 0x0df0, 0x0e08, 0x0e1d, 0x0e59, + // Entry 80 - BF + 0x0e7b, 0x0ea0, 0x0eaf, 0x0ec8, 0x0ee3, 0x0eef, 0x0f01, 0x0f26, + 0x0f4d, 0x0f65, 0x0f80, 0x0f92, 0x0fad, 0x0fcb, 0x0fe3, 0x0ff5, + 0x100d, 0x101f, 0x103d, 0x105e, 0x1080, 0x109e, 0x10bd, 0x10db, + 0x10e7, 0x1111, 0x1129, 0x114f, 0x1187, 0x11a2, 0x11c0, 0x11e1, + 0x11f3, 0x1205, 0x1217, 0x1226, 0x123e, 0x1253, 0x126e, 0x1286, + 0x12b1, 0x12c0, 0x12dc, 0x12f7, 0x1315, 0x132a, 0x133c, 0x134b, + 0x135a, 0x1366, 0x1381, 0x138d, 0x139c, 0x13a8, 0x13d9, 0x1402, + 0x141d, 0x1438, 0x1447, 0x1489, 0x14ae, 0x14d6, 0x150d, 0x1528, + // Entry C0 - FF + 0x1534, 0x1549, 0x1555, 0x1580, 0x1598, 0x15b0, 0x15c5, 0x15d4, + 0x15e6, 0x15fc, 0x161b, 0x1630, 0x163f, 0x1651, 0x1669, 0x1688, + 0x16ac, 0x16eb, 0x170f, 0x172b, 0x1744, 0x1756, 0x176e, 0x1783, + 0x17a5, 0x17de, 0x1800, 0x1822, 0x1834, 0x184f, 0x1881, 0x18ba, + 0x18c3, 0x190a, 0x1916, 0x1928, 0x1949, 0x195e, 0x197d, 0x19a7, + 0x19c5, 0x19d4, 0x19e6, 0x1a1e, 0x1a30, 0x1a3f, 0x1a5a, 0x1a6f, + 0x1a84, 0x1ab8, 0x1ae6, 0x1afb, 0x1b1c, 0x1b41, 0x1b98, 0x1bb9, + 0x1bf4, 0x1c28, 0x1c43, 0x1c58, 0x1c8a, 0x1c99, 0x1cb1, 0x1cc0, + // Entry 100 - 13F + 0x1cd8, 0x1d00, 0x1d18, 0x1d36, 0x1d5b, 0x1d6a, 0x1d7f, 0x1da4, + 0x1dcc, 0x1dde, 0x1e06, 0x1e28, 0x1e4d, 0x1e72, 0x1e94, 0x1ebf, + 0x1ed4, 0x1efc, 0x1f14, 0x1f33, 0x1f55, 0x1f87, 0x1fa9, 0x1fd3, + 0x1ff1, 0x202b, 0x2049, 0x2058, 0x2074, 0x2096, 0x20a5, 0x20c4, + 0x20e3, 0x2105, 0x212a, +} // Size: 606 bytes + +var msRegionStr string = "" + // Size: 2966 bytes + "Pulau AscensionAndorraEmiriah Arab BersatuAfghanistanAntigua dan Barbuda" + + "AnguillaAlbaniaArmeniaNetherlands AntillesAngolaAntartikaArgentinaSamoa " + + "AmerikaAustriaAustraliaArubaKepulauan AlandAzerbaijanBosnia dan Herzegov" + + "inaBarbadosBangladeshBelgiumBurkina FasoBulgariaBahrainBurundiBeninSaint" + + " BarthélemyBermudaBruneiBoliviaBelanda CaribbeanBrazilBahamasBhutanPulau" + + " BouvetBotswanaBelarusBelizeKanadaKepulauan Cocos (Keeling)Congo - Kinsh" + + "asaRepublik Afrika TengahCongo - BrazzavilleSwitzerlandCote d’IvoireKepu" + + "lauan CookChileCameroonChinaColombiaPulau ClippertonCosta RicaCubaCape V" + + "erdeCuracaoPulau KrismasCyprusRepublik CzechJermanDiego GarciaDjiboutiDe" + + "nmarkDominicaRepublik DominicaAlgeriaCeuta dan MelillaEcuadorEstoniaMesi" + + "rSahara BaratEritreaSepanyolEthiopiaKesatuan EropahFinlandFijiKepulauan " + + "FalklandMicronesiaKepulauan FaroePerancisGabonUnited KingdomGrenadaGeorg" + + "iaGuiana PerancisGuernseyGhanaGibraltarGreenlandGambiaGuineaGuadeloupeGu" + + "inea KhatulistiwaGreeceKepulauan Georgia Selatan & Sandwich SelatanGuate" + + "malaGuamGuinea BissauGuyanaHong Kong SAR ChinaKepulauan Heard & McDonald" + + "HondurasCroatiaHaitiHungaryKepulauan CanaryIndonesiaIrelandIsraelIsle of" + + " ManIndiaWilayah Lautan Hindi BritishIraqIranIcelandItaliJerseyJamaicaJo" + + "rdanJepunKenyaKyrgyzstanKembojaKiribatiComorosSaint Kitts dan NevisKorea" + + " UtaraKorea SelatanKuwaitKepulauan CaymanKazakhstanLaosLubnanSaint Lucia" + + "LiechtensteinSri LankaLiberiaLesothoLithuaniaLuxembourgLatviaLibyaMaghri" + + "biMonacoMoldovaMontenegroSaint MartinMadagaskarKepulauan MarshallMacedon" + + "iaMaliMyanmar (Burma)MongoliaMacau SAR ChinaKepulauan Mariana UtaraMarti" + + "niqueMauritaniaMontserratMaltaMauritiusMaldivesMalawiMexicoMalaysiaMozam" + + "biqueNamibiaNew CaledoniaNigerPulau NorfolkNigeriaNicaraguaBelandaNorway" + + "NepalNauruNiueNew ZealandOmanPanamaPeruPolinesia PerancisPapua New Guine" + + "aFilipinaPakistanPolandSaint Pierre dan MiquelonKepulauan PitcairnPuerto" + + " RicoWilayah PalestinPortugalPalauParaguayQatarOceania TerpencilReunionR" + + "omaniaSerbiaRusiaRwandaArab SaudiKepulauan SolomonSeychellesSudanSwedenS" + + "ingapuraSaint HelenaSloveniaSvalbard dan Jan MayenSlovakiaSierra LeoneSa" + + "n MarinoSenegalSomaliaSurinamSudan SelatanSao Tome dan PrincipeEl Salvad" + + "orSint MaartenSyriaSwazilandTristan da CunhaKepulauan Turks dan CaicosCh" + + "adWilayah Selatan PerancisTogoThailandTajikistanTokelauTimor-LesteTurkme" + + "nistanTunisiaTongaTurkiTrinidad dan TobagoTuvaluTaiwanTanzaniaUkraineUga" + + "ndaKepulauan Terpencil A.S.Amerika SyarikatUruguayUzbekistanKota Vatican" + + "Saint Vincent dan GrenadinesVenezuelaKepulauan Virgin BritishKepulauan V" + + "irgin A.S.VietnamVanuatuWallis dan FutunaSamoaKosovoYamanMayotteAfrika S" + + "elatanZambiaZimbabweWilayah Tidak DiketahuiDuniaAfrikaAmerika UtaraAmeri" + + "ka SelatanOceaniaAfrika BaratAmerika TengahAfrika TimurAfrika UtaraAfrik" + + "a TengahSelatan AfrikaAmerikaUtara AmerikaCaribbeanAsia TimurAsia Selata" + + "nAsia TenggaraEropah SelatanAustralasiaMelanesiaWilayah MikronesiaPoline" + + "siaAsiaAsia TengahAsia BaratEropahEropah TimurEropah UtaraEropah BaratAm" + + "erika Latin" + +var msRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x000f, 0x0016, 0x002a, 0x0035, 0x0048, 0x0050, 0x0057, + 0x005e, 0x0072, 0x0078, 0x0081, 0x008a, 0x0097, 0x009e, 0x00a7, + 0x00ac, 0x00bb, 0x00c5, 0x00db, 0x00e3, 0x00ed, 0x00f4, 0x0100, + 0x0108, 0x010f, 0x0116, 0x011b, 0x012c, 0x0133, 0x0139, 0x0140, + 0x0151, 0x0157, 0x015e, 0x0164, 0x0170, 0x0178, 0x017f, 0x0185, + 0x018b, 0x01a4, 0x01b4, 0x01ca, 0x01dd, 0x01e8, 0x01f7, 0x0205, + 0x020a, 0x0212, 0x0217, 0x021f, 0x022f, 0x0239, 0x023d, 0x0247, + 0x024e, 0x025b, 0x0261, 0x026f, 0x0275, 0x0281, 0x0289, 0x0290, + // Entry 40 - 7F + 0x0298, 0x02a9, 0x02b0, 0x02c1, 0x02c8, 0x02cf, 0x02d4, 0x02e0, + 0x02e7, 0x02ef, 0x02f7, 0x0306, 0x030d, 0x0311, 0x0323, 0x032d, + 0x033c, 0x0344, 0x0349, 0x0357, 0x035e, 0x0365, 0x0374, 0x037c, + 0x0381, 0x038a, 0x0393, 0x0399, 0x039f, 0x03a9, 0x03bc, 0x03c2, + 0x03ee, 0x03f7, 0x03fb, 0x0408, 0x040e, 0x0421, 0x043b, 0x0443, + 0x044a, 0x044f, 0x0456, 0x0466, 0x046f, 0x0476, 0x047c, 0x0487, + 0x048c, 0x04a8, 0x04ac, 0x04b0, 0x04b7, 0x04bc, 0x04c2, 0x04c9, + 0x04cf, 0x04d4, 0x04d9, 0x04e3, 0x04ea, 0x04f2, 0x04f9, 0x050e, + // Entry 80 - BF + 0x0519, 0x0526, 0x052c, 0x053c, 0x0546, 0x054a, 0x0550, 0x055b, + 0x0568, 0x0571, 0x0578, 0x057f, 0x0588, 0x0592, 0x0598, 0x059d, + 0x05a5, 0x05ab, 0x05b2, 0x05bc, 0x05c8, 0x05d2, 0x05e4, 0x05ed, + 0x05f1, 0x0600, 0x0608, 0x0617, 0x062e, 0x0638, 0x0642, 0x064c, + 0x0651, 0x065a, 0x0662, 0x0668, 0x066e, 0x0676, 0x0680, 0x0687, + 0x0694, 0x0699, 0x06a6, 0x06ad, 0x06b6, 0x06bd, 0x06c3, 0x06c8, + 0x06cd, 0x06d1, 0x06dc, 0x06e0, 0x06e6, 0x06ea, 0x06fc, 0x070c, + 0x0714, 0x071c, 0x0722, 0x073b, 0x074d, 0x0758, 0x0768, 0x0770, + // Entry C0 - FF + 0x0775, 0x077d, 0x0782, 0x0793, 0x079a, 0x07a1, 0x07a7, 0x07ac, + 0x07b2, 0x07bc, 0x07cd, 0x07d7, 0x07dc, 0x07e2, 0x07eb, 0x07f7, + 0x07ff, 0x0815, 0x081d, 0x0829, 0x0833, 0x083a, 0x0841, 0x0848, + 0x0855, 0x086a, 0x0875, 0x0881, 0x0886, 0x088f, 0x089f, 0x08b9, + 0x08bd, 0x08d5, 0x08d9, 0x08e1, 0x08eb, 0x08f2, 0x08fd, 0x0909, + 0x0910, 0x0915, 0x091a, 0x092d, 0x0933, 0x0939, 0x0941, 0x0948, + 0x094e, 0x0966, 0x0976, 0x097d, 0x0987, 0x0993, 0x09af, 0x09b8, + 0x09d0, 0x09e5, 0x09ec, 0x09f3, 0x0a04, 0x0a09, 0x0a0f, 0x0a14, + // Entry 100 - 13F + 0x0a1b, 0x0a29, 0x0a2f, 0x0a37, 0x0a4e, 0x0a53, 0x0a59, 0x0a66, + 0x0a75, 0x0a7c, 0x0a88, 0x0a96, 0x0aa2, 0x0aae, 0x0abb, 0x0ac9, + 0x0ad0, 0x0add, 0x0ae6, 0x0af0, 0x0afc, 0x0b09, 0x0b17, 0x0b22, + 0x0b2b, 0x0b3d, 0x0b46, 0x0b4a, 0x0b55, 0x0b5f, 0x0b65, 0x0b71, + 0x0b7d, 0x0b89, 0x0b96, +} // Size: 606 bytes + +var myRegionStr string = "" + // Size: 9769 bytes + "အက်စ်စင်ရှီအွန်ကျွန်းအန်ဒိုရာယူအေအီးအာဖဂန်နစ္စတန်အန်တီဂုအာနှင့်ဘာဘုဒါအန်" + + "ဂွီလာအဲလ်ဘာနီအာအာမေနီးယားအင်ဂိုလာအန္တာတိကအာဂျင်တီးနားအမေရိကန် စမိုအဩစတ" + + "ြီးယားဩစတြေးလျအာရုဘာအာလန်ကျွန်းအဇာဘိုင်ဂျန်ဘော့စနီးယား နှင့် ဟာဇီဂိုဘီ" + + "းနားဘာဘဒိုးစ်ဘင်္ဂလားဒေ့ရှ်ဘယ်လ်ဂျီယမ်ဘာကီနာ ဖာဆိုဘူဂေးရီးယားဘာရိန်းBI" + + "ဘီနင်စိန့်ဘာသီလီမိုင်ဘာမူဒါဘရူနိုင်းဘိုလီးဘီးယားကာရီဘီယံနယ်သာလန်ဘရာဇီး" + + "ဘဟားမားဘူတန်ဘူဗက်ကျွန်းBWဘီလာရုစ်ဘေလီဇ်ကနေဒါကိုကိုး ကျွန်းစုကွန်ဂို-ကင" + + "်ရှာစအလယ်ပိုင်း အာဖရိက ပြည်ထောင်စုကွန်ဂို-ဘရာဇာဗီလ်ဆွစ်ဇလန်အိုင်ဗရီကို" + + "စ့်ကွတ် ကျွန်းစုချီလီကင်မရွန်းတရုတ်ကိုလံဘီယာကလစ်ပါတန်ကျွန်းကော့စ်တာရီက" + + "ာကျူးဘားခေ့ပ်ဗာဒူခူရာကာအိုခရစ်စမတ် ကျွန်းဆိုက်ပရက်စ်ချက် ပြည်ထောင်စုဂျ" + + "ာမဏီဒီအေဂိုဂရာစီအာဂျီဘူတီဒိန်းမတ်ဒိုမီနီကာဒိုမီနီကန်DZဆယ်ဥတာနှင့်မယ်လီ" + + "လ်လာအီကွေဒေါအက်စတိုးနီးယားEGEHအီရီတရီအာစပိန်အီသီယိုးပီးယားဥရောပသမဂ္ဂဖင" + + "်လန်ဖီဂျီဖောက်ကလန် ကျွန်းစုမိုင်ခရိုနီရှားဖာရိုး ကျွန်းစုများပြင်သစ်ဂါ" + + "ဘွန်ယူနိုက်တက်ကင်းဒမ်းဂရီနာဒါဂျော်ဂျီယာပြင်သစ် ဂီယာနာဂွန်းဇီဂါနာဂျီဘရေ" + + "ာ်လ်တာဂရင်းလန်းဂန်ဘီရာဂီးနီဂူအာဒီလုပ်အီကွေတာ ဂီရာနာဂရိတောင် ဂျော်ဂျီယာ" + + " နှင့် တောင် ဆင်းဒဝစ်ဂျ် ကျွန်းစုများဂွာတီမာလာဂူအမ်ဂီရာနာ-ဘီစ်စာဥဂူရာနာတ" + + "ရုတ်၏ အထူးအုပ်ချုပ်ခွင့်ရ ဟောင်ကောင်ဟတ်ကျွန်းနှင့်မက်ဒေါနယ်ကျွန်းစုဟွန" + + "်ဒူးရပ်စ်ခရိုအေးရှားဟေတီဟန်ဂေရီကာနာရီကျွန်းစုအင်ဒိုနီးရှားအိုင်ယာလန်အစ" + + "္စရေးမန်ကျွန်းအိန္ဒိယဗြိတိသျှ အိန္ဒြိယ သမုဒ္ဒရာ ပိုင်နက်အီရတ်အီရန်အိုက" + + "်စလန်အီတလီဂျာစီဂျမေကာဂျော်ဒန်ဂျပန်KEခရူဂစ်စတန်ကမ္ဘောဒီးယားခီရီဘာတီကိုမ" + + "ိုရိုစ်စိန့်ကစ်နှင့်နီဗီစ်မြောက်ကိုရီးယားတောင်ကိုရီးယားကူဝိတ်ကေမန် ကျွ" + + "န်းစုကာဇက်စတန်လာအိုလက်ဘနွန်စိန့်လူစီအာလစ်ခ်ထင်စတိုင်သီရိလင်္ကာလိုင်ဘေး" + + "ရီးယားလီဆိုသိုလစ်သူယေးနီးယားလူဇင်ဘတ်လတ်ဗီးယားLYMAမိုနာကိုမောလ်ဒိုဗာမွန" + + "်တီနိဂရိုးစိန့်မာတင်မာဒါဂတ်စကာမာရှယ် ကျွန်းစုမာစီဒိုးနီးယားမာလီမြန်မာမ" + + "ွန်ဂိုးလီးယားတရုတ်၏ အထူးအုပ်ချုပ်ခွင့်ရ မကာအိုတောင်ပိုင်းမာရီအာနာကျွန်" + + "းစုမာတီနီကီမောရီတာနီအာမောင့်စဲရက်မောလ်တာမော်ရေရှားစ်မော်လ်ဒိုက်မာလာဝီမ" + + "က္ကဆီကိုမလေးရှားမိုဇန်ဘစ်နမ်မီးဘီးယားနယူး ကယ်လီဒိုနီးယားနိုင်ဂျာနောဖော" + + "့ခ်ကျွန်းနိုင်ဂျီးရီးယားနီကာရာဂွာနယ်သာလန်နော်ဝေနီပေါနာဥူရူနီဥူအေနယူးဇီ" + + "လန်အိုမန်ပနားမားပီရူးပြင်သစ် ပေါ်လီနေးရှားပါပူရာနယူးဂီနီဖိလစ်ပိုင်ပါကစ" + + "္စတန်ပိုလန်စိန့်ပီအဲရီနှင့်မီကွီလွန်ပစ်တ်ကိန်းကျွန်းစုပေါ်တူရီကိုပါလက်" + + "စတိုင်း ပိုင်နက်ပေါ်တူဂီပလောင်ပါရာဂွေးကာတာသမုဒ္ဒရာဒေသအပြင်ထွက်နေသောဒေသ" + + "များရဲအူနီရွန်ရိုမေးနီးယားဆားဘီးယားရုရှRWဆော်ဒီအာရေးဗီးယားဆော်လမွန်ကျွ" + + "န်းစုဆေးရှလ်SDဆွီဒင်စင်္ကာပူစိန့်ဟဲလီနာစလိုဗေးနီးယားစဗိုလ်ဘတ်နှင့်ဂျန်" + + "မေရန်စလိုဗေးကီးယားဆီအဲရာ လီအိုနီဆော့န်မာရီနိုဆီနီဂေါဆိုမာလီယာဆူရီနိမ်း" + + "မြောက်ဆူဒန်စိန့်တိုမီနှင့်ပရင်စီပ့်အယ်လ်ဆာဗေးဒိုးဆင့်မာအာတင်ဆီးရီးယားS" + + "Zထရစ်တန်ဒါကွန်ဟာတခ်စ်နှင့်ကာအီကိုစ်ကျွန်းစုချဒ်ပြင်သစ် တောင်ပိုင်း ပိုင်" + + "နက်များတိုဂိုထိုင်းတာဂျီကစ္စတန်ထိုးခါလူအရှေ့တီမောတာခ်မီန့စ်တန်တူနီးရှာ" + + "းတွန်ဂါတူရကီထရိုင်နီဒတ်နှင့်တိုဘာဂိုထူးဗလူထိုင်ဝမ်တန်ဇန်းနီးယားယူကရိန်" + + "းUGယူနိုက်တက်စတိတ် အပြင်ထွက် နေသည့် သေးငယ်သောကျွန်းများယူနိုက်တက်စတိတ်" + + "ဥရုဂွေးဥဘက်ကစ္စတန်ဗာတီကန်စီတီးစိန့်ဗင့်ဆင့်နှင့် သည်ဂရဲနာဒင်းစ်ဗင်နီဇွ" + + "ဲလားဗြိတိသျှ ဗာဂျင်း ကျွန်းစုယူအက်စ် ဗာဂျင်း ကျွန်းစုဗီယက်နမ်ဗာနုအာတူဝ" + + "ေါလစ်နှင့်ဖူထူးနားဆာမိုအာကိုဆိုဗိုယီမင်မေအိုတီတောင်အာဖရိကဇမ်ဘီယာဇင်ဘာဘ" + + "ွေမသိ သို့မဟုတ် မရှိ သော နေရာကမ္ဘာအာဖရိကမြောက် အမေရိကတောင် အမေရိကသမုဒ္" + + "ဒရာဒေသအနောက် အာဖရိကအလယ်ပိုင်း အမေရိကအရှေ့ပိုင်း အာဖရိကမြောက်ပိုင်း အာဖ" + + "ရိကအလယ်ပိုင်း အာဖရိကတောင်ပိုင်း အာဖရိကအမေရိကများမြောက်ပိုင်း အမေရိကကာရ" + + "ီဘီယံအရှေ့ပိုင်း အာရှတောင်ပိုင်း အာရှအရှေ့တောင်ပိုင်းအာရှတောင်ပိုင်း ဥ" + + "ရောပဩစတြေးလျနှင့် နယူးဇီလန်မီလာနီးရှားမိုင်ခရိုနီရှားနယ်ပိုလီနီရှားအာရ" + + "ှအလယ် အာရှအနောက် အာရှဥရောပအရှေ့ပိုင်း ဥရောပမြောက်ပိုင်း ဥရောပအနောက်ပို" + + "င်း ဥရောပလက်တင်အမေရိက" + +var myRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x003f, 0x0057, 0x006c, 0x0093, 0x00cf, 0x00e7, 0x0105, + 0x0123, 0x0123, 0x013b, 0x0153, 0x0177, 0x019f, 0x01ba, 0x01d2, + 0x01e4, 0x0205, 0x0229, 0x0282, 0x029d, 0x02c7, 0x02e8, 0x030a, + 0x032b, 0x0340, 0x0342, 0x0351, 0x0381, 0x0393, 0x03ae, 0x03d2, + 0x0402, 0x0414, 0x0429, 0x0438, 0x0459, 0x045b, 0x0473, 0x0485, + 0x0494, 0x04c2, 0x04ed, 0x0540, 0x0571, 0x0589, 0x05b3, 0x05d8, + 0x05e7, 0x0602, 0x0611, 0x062c, 0x0659, 0x067d, 0x0692, 0x06ad, + 0x06c8, 0x06f3, 0x0714, 0x0742, 0x0754, 0x077e, 0x0793, 0x07ab, + // Entry 40 - 7F + 0x07c6, 0x07e4, 0x07e6, 0x0822, 0x083a, 0x0864, 0x0866, 0x0868, + 0x0883, 0x0892, 0x08bc, 0x08da, 0x08ec, 0x08fb, 0x092f, 0x095c, + 0x0993, 0x09a8, 0x09ba, 0x09f0, 0x0a05, 0x0a23, 0x0a4b, 0x0a60, + 0x0a6c, 0x0a90, 0x0aab, 0x0ac0, 0x0acf, 0x0aed, 0x0b15, 0x0b1e, + 0x0bb3, 0x0bce, 0x0bdd, 0x0c05, 0x0c17, 0x0c82, 0x0cdf, 0x0d03, + 0x0d24, 0x0d30, 0x0d45, 0x0d6f, 0x0d96, 0x0db4, 0x0dc9, 0x0de4, + 0x0df9, 0x0e5c, 0x0e6b, 0x0e7a, 0x0e95, 0x0ea4, 0x0eb3, 0x0ec5, + 0x0edd, 0x0eec, 0x0eee, 0x0f0c, 0x0f30, 0x0f48, 0x0f69, 0x0fa2, + // Entry 80 - BF + 0x0fcf, 0x0ff9, 0x100b, 0x1033, 0x104e, 0x105d, 0x1075, 0x1096, + 0x10c0, 0x10de, 0x1108, 0x1120, 0x114a, 0x1162, 0x117d, 0x117f, + 0x1181, 0x1199, 0x11b7, 0x11de, 0x11fc, 0x121a, 0x1245, 0x126f, + 0x127b, 0x128d, 0x12b7, 0x1316, 0x1367, 0x137f, 0x13a0, 0x13c1, + 0x13d6, 0x13fa, 0x141b, 0x142d, 0x1448, 0x1460, 0x147b, 0x149f, + 0x14d6, 0x14ee, 0x151b, 0x1548, 0x1563, 0x157b, 0x158d, 0x159c, + 0x15ae, 0x15c0, 0x15db, 0x15ed, 0x1602, 0x1611, 0x164e, 0x1678, + 0x1696, 0x16b1, 0x16c3, 0x170e, 0x1744, 0x1765, 0x17a2, 0x17ba, + // Entry C0 - FF + 0x17cc, 0x17e4, 0x17f0, 0x1850, 0x186e, 0x1892, 0x18ad, 0x18b9, + 0x18bb, 0x18ee, 0x1921, 0x1936, 0x1938, 0x194a, 0x1962, 0x1983, + 0x19aa, 0x19ef, 0x1a16, 0x1a3e, 0x1a65, 0x1a7a, 0x1a95, 0x1ab0, + 0x1ad1, 0x1b19, 0x1b43, 0x1b64, 0x1b7f, 0x1b81, 0x1bae, 0x1bff, + 0x1c0b, 0x1c67, 0x1c79, 0x1c8b, 0x1caf, 0x1cc7, 0x1ce5, 0x1d0c, + 0x1d27, 0x1d39, 0x1d48, 0x1d90, 0x1da2, 0x1dba, 0x1de1, 0x1df9, + 0x1dfb, 0x1e91, 0x1ebe, 0x1ed3, 0x1ef4, 0x1f18, 0x1f79, 0x1f9a, + 0x1fe1, 0x2025, 0x203d, 0x2055, 0x208e, 0x20a3, 0x20be, 0x20cd, + // Entry 100 - 13F + 0x20e2, 0x2103, 0x2118, 0x2130, 0x2179, 0x2188, 0x219a, 0x21bf, + 0x21e1, 0x2202, 0x2227, 0x2258, 0x228c, 0x22c3, 0x22f4, 0x2328, + 0x2346, 0x237d, 0x2395, 0x23c3, 0x23f1, 0x242d, 0x245e, 0x24a1, + 0x24c2, 0x24f8, 0x2519, 0x2525, 0x253e, 0x255d, 0x256c, 0x259d, + 0x25d1, 0x2605, 0x2629, +} // Size: 606 bytes + +var neRegionStr string = "" + // Size: 9084 bytes + "एस्केन्सन टापुअन्डोर्रासंयुक्त अरब इमिराट्सअफगानिस्तानएन्टिगुआ र बारबुडा" + + "आङ्गुइलाअल्बानियाआर्मेनियानेदरल्याण्ड्स एण्टिलिसअङ्गोलाअन्टारतिकाअर्जे" + + "न्टिनाअमेरिकी समोआअष्ट्रियाअष्ट्रेलियाआरूबाअलान्ड टापुहरुअजरबैजानबोस्न" + + "िया एण्ड हर्जगोभिनियाबार्बाडोसबङ्गलादेशबेल्जियमबर्किना फासोबुल्गेरियाब" + + "हराइनबुरूण्डीबेनिनसेन्ट बार्थालेमीबर्मुडाब्रुनाइबोलिभियाक्यारिवियन नेद" + + "रल्याण्ड्सब्राजिलबहामासभुटानबुभेट टापुबोट्स्वानाबेलारूसबेलिजक्यानाडाको" + + "कोस (किलिंग) टापुहरुकोङ्गो-किन्शासाकेन्द्रीय अफ्रिकी गणतन्त्रकोङ्गो - " + + "ब्राज्जाभिल्लेस्विजरल्याण्डआइभरी कोस्टकुक टापुहरुचिलीक्यामरूनचीनकोलोम्" + + "बियाक्लिप्पेर्टन टापुकोष्टारिकाक्युबाकेप भर्डेकुराकाओक्रिष्टमस टापुसाइ" + + "प्रसचेक गणतन्त्रजर्मनीडियगो गार्सियाडिजिबुटीडेनमार्कडोमिनिकाडोमिनिकन ग" + + "णतन्त्रअल्जेरियासिउटा र मेलिलाइक्वडेरइस्टोनियाइजिप्टपश्चिमी साहाराएरित" + + "्रियास्पेनइथियोपियायुरोपियन युनियनफिन्ल्याण्डफिजीफकल्याण्ड टापुहरुमाइक" + + "्रोनेसियाफारोर टापुहरुफ्रान्सगावोनबेलायतग्रेनाडाजर्जियाफ्रान्सेली गायन" + + "ागुएर्नसेघानाजिब्राल्टारग्रिनल्याण्डगाम्वियागिनीग्वाडेलुपभू-मध्यीय गिन" + + "ीग्रिसदक्षिण जर्जिया र दक्षिण स्यान्डवीच टापुहरूग्वाटेमालागुवामगिनी-बि" + + "साउगुयानाहङकङ चिनिया समाजवादी स्वायत्त क्षेत्रहर्ड टापु एण्ड म्याकडोना" + + "ल्ड टापुहरुहन्डुरासक्रोएशियाहैटीहङ्गेरीक्यानारी टापुहरूइन्डोनेशियाआयरल" + + "्याण्डइजरायलआइज्ले अफ् म्यानभारतबेलायती हिन्द महासागर क्षेत्रइराकइरानआ" + + "इस्ल्याण्डइटालीजर्सीजमाइकाजोर्डनजापानकेन्याकिर्गिस्थानकम्बोडियाकिरिबाट" + + "ीकोमोरोससेन्ट किट्स र नेभिसउत्तर कोरियादक्षिण कोरियाकुवेतकेयमान टापुका" + + "जाकस्तानलाओसलेबननसेन्ट लुसियालिएखटेन्स्टाइनश्रीलङ्कालाइबेरियालेसोथोलिथ" + + "ुअनियालक्जेमबर्गलाट्भियालिबियामोरोक्कोमोनाकोमाल्डोभामोन्टेनेग्रोसेन्ट " + + "मार्टिनमडागास्करमार्शल टापुहरुम्याकेडोनियामालीम्यान्मार (बर्मा)मङ्गोलि" + + "यामकावो चिनिँया स्वशासित क्षेत्रउत्तरी मारिआना टापुमार्टिनिकमाउरिटानिय" + + "ामोन्टसेर्राटमाल्टामाउरिटसमाल्दिभ्समालावीमेक्सिकोमलेसियामोजाम्बिकनामिब" + + "ियानयाँ कालेडोनियानाइजरनोरफोल्क टापुनाइजेरियानिकारागुवानेदरल्याण्ड्सनर" + + "्वेनेपालनाउरूनियुइन्युजिल्याण्डओमनपनामापेरूफ्रान्सेली पोलिनेसियापपुआ न" + + "्यू गाइनियाफिलिपिन्सपाकिस्तानपोल्याण्डसेन्ट पिर्रे र मिक्केलोनपिटकाइर्" + + "न टापुहरुपुएर्टो रिकोप्यालेस्टनी भू-भागहरुपोर्चुगलपलाउप्याराग्वेकतारबा" + + "ह्य ओसनियारियुनियनरोमानियासर्बियारूसरवाण्डासाउदी अरबसोलोमोन टापुहरुसेच" + + "ेलेससुडानस्विडेनसिङ्गापुरसेन्ट हेलेनास्लोभेनियासभाल्बार्ड र जान मायेनस" + + "्लोभाकियासिएर्रा लिओनसान् मारिनोसेनेगालसोमालियासुरिनेमदक्षिणी सुडानसाओ" + + " टोमे र प्रिन्सिपएल् साल्भाडोरसिन्ट मार्टेनसिरियास्वाजिल्याण्डट्रिस्टान " + + "डा कुन्हातुर्क र काइकोस टापुचाडफ्रान्सेली दक्षिणी क्षेत्रहरुटोगोथाइल्य" + + "ाण्डताजिकिस्तानतोकेलाउटिमोर-लेस्टेतुर्कमेनिस्तानट्युनिसियाटोंगाटर्कीत्" + + "रिनिडाड एण्ड टोबागोतुभालुताइवानतान्जानियायुक्रेनयुगाण्डासंयुक्त राज्य " + + "बाह्य टापुहरुसंयुक्त राज्यउरूग्वेउज्बेकिस्तानभेटिकन सिटीसेन्ट भिन्सेन्" + + "ट र ग्रेनाडिन्सभेनेजुएलाबेलायती भर्जिन टापुहरुसंयुक्त राज्य भर्जिन टाप" + + "ुहरुभिएतनामभानुआतुवालिस र फुटुनासामोआकोसोवोयेमेनमायोट्टदक्षिण अफ्रिकाज" + + "ाम्बियाजिम्बाबेअज्ञात क्षेत्रविश्वअफ्रिकाउत्तर अमेरिकादक्षिण अमेरिकाओस" + + "नियापश्चिमी अफ्रिकाकेन्द्रीय अमेरिकापूर्वी अफ्रिकाउत्तरी अफ्रिकामध्य अ" + + "फ्रिकादक्षिणी अफ्रिकाअमेरिकासउत्तरी अमेरिकाक्यारिबियनपूर्वी एशियादक्षि" + + "णी एशियादक्षिण पूर्वी एशियादक्षिणी युरोपअष्ट्रालासियामेलानेसियामाइक्रो" + + "नेसियाली क्षेत्रपोलिनेशियाएशियाकेन्द्रीय एशियापश्चिमी एशियायुरोपपूर्वी" + + " युरोपउत्तरी युरोपपश्चिमी युरोपल्याटिन अमेरिका" + +var neRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0028, 0x0043, 0x007b, 0x009c, 0x00ce, 0x00e6, 0x0101, + 0x011c, 0x015c, 0x0171, 0x018f, 0x01b0, 0x01d2, 0x01ed, 0x020e, + 0x021d, 0x0245, 0x025d, 0x02a7, 0x02c2, 0x02dd, 0x02f5, 0x0317, + 0x0335, 0x0347, 0x035f, 0x036e, 0x039c, 0x03b1, 0x03c6, 0x03de, + 0x0424, 0x0439, 0x044b, 0x045a, 0x0476, 0x0494, 0x04a9, 0x04b8, + 0x04d0, 0x050a, 0x0535, 0x057f, 0x05be, 0x05e5, 0x0604, 0x0623, + 0x062f, 0x0647, 0x0650, 0x066e, 0x069f, 0x06bd, 0x06cf, 0x06e8, + 0x06fd, 0x0725, 0x073a, 0x075c, 0x076e, 0x0796, 0x07ae, 0x07c6, + // Entry 40 - 7F + 0x07de, 0x080f, 0x082a, 0x0850, 0x0865, 0x0880, 0x0892, 0x08ba, + 0x08d5, 0x08e4, 0x08ff, 0x092a, 0x094b, 0x0957, 0x0988, 0x09af, + 0x09d4, 0x09e9, 0x09f8, 0x0a0a, 0x0a22, 0x0a37, 0x0a65, 0x0a7d, + 0x0a89, 0x0aaa, 0x0ace, 0x0ae6, 0x0af2, 0x0b0d, 0x0b33, 0x0b42, + 0x0bb6, 0x0bd4, 0x0be3, 0x0bff, 0x0c11, 0x0c78, 0x0cd9, 0x0cf1, + 0x0d0c, 0x0d18, 0x0d2d, 0x0d5b, 0x0d7c, 0x0d9a, 0x0dac, 0x0dd8, + 0x0de4, 0x0e35, 0x0e41, 0x0e4d, 0x0e6e, 0x0e7d, 0x0e8c, 0x0e9e, + 0x0eb0, 0x0ebf, 0x0ed1, 0x0ef2, 0x0f0d, 0x0f25, 0x0f3a, 0x0f6d, + // Entry 80 - BF + 0x0f8f, 0x0fb4, 0x0fc3, 0x0fe2, 0x1000, 0x100c, 0x101b, 0x103d, + 0x1067, 0x1082, 0x109d, 0x10af, 0x10ca, 0x10e8, 0x1100, 0x1112, + 0x112a, 0x113c, 0x1154, 0x1178, 0x119d, 0x11b8, 0x11e0, 0x1204, + 0x1210, 0x123d, 0x1258, 0x12ac, 0x12e1, 0x12fc, 0x131d, 0x1341, + 0x1353, 0x1368, 0x1383, 0x1395, 0x13ad, 0x13c2, 0x13dd, 0x13f5, + 0x1420, 0x142f, 0x1454, 0x146f, 0x148d, 0x14b4, 0x14c3, 0x14d2, + 0x14e1, 0x14f0, 0x1517, 0x1520, 0x152f, 0x153b, 0x1578, 0x15a7, + 0x15c2, 0x15dd, 0x15f8, 0x163a, 0x166b, 0x168d, 0x16c8, 0x16e0, + // Entry C0 - FF + 0x16ec, 0x170a, 0x1716, 0x1738, 0x1750, 0x1768, 0x177d, 0x1786, + 0x179b, 0x17b4, 0x17df, 0x17f4, 0x1803, 0x1818, 0x1833, 0x1855, + 0x1873, 0x18af, 0x18cd, 0x18ef, 0x190e, 0x1923, 0x193b, 0x1950, + 0x1975, 0x19ab, 0x19d0, 0x19f5, 0x1a07, 0x1a2e, 0x1a63, 0x1a96, + 0x1a9f, 0x1af2, 0x1afe, 0x1b1c, 0x1b3d, 0x1b52, 0x1b74, 0x1b9e, + 0x1bbc, 0x1bcb, 0x1bda, 0x1c15, 0x1c27, 0x1c39, 0x1c57, 0x1c6c, + 0x1c84, 0x1ccf, 0x1cf4, 0x1d09, 0x1d2d, 0x1d4c, 0x1d9d, 0x1db8, + 0x1df6, 0x1e44, 0x1e59, 0x1e6e, 0x1e94, 0x1ea3, 0x1eb5, 0x1ec4, + // Entry 100 - 13F + 0x1ed9, 0x1f01, 0x1f19, 0x1f31, 0x1f59, 0x1f68, 0x1f7d, 0x1fa2, + 0x1fca, 0x1fdc, 0x2007, 0x2038, 0x2060, 0x2088, 0x20aa, 0x20d5, + 0x20ed, 0x2115, 0x2133, 0x2155, 0x217a, 0x21af, 0x21d4, 0x21fb, + 0x2219, 0x225c, 0x227a, 0x2289, 0x22b4, 0x22d9, 0x22e8, 0x230a, + 0x232c, 0x2351, 0x237c, +} // Size: 606 bytes + +var nlRegionStr string = "" + // Size: 3081 bytes + "AscensionAndorraVerenigde Arabische EmiratenAfghanistanAntigua en Barbud" + + "aAnguillaAlbaniëArmeniëNederlandse AntillenAngolaAntarcticaArgentiniëAme" + + "rikaans-SamoaOostenrijkAustraliëArubaÅlandAzerbeidzjanBosnië en Herzegov" + + "inaBarbadosBangladeshBelgiëBurkina FasoBulgarijeBahreinBurundiBeninSaint" + + "-BarthélemyBermudaBruneiBoliviaCaribisch NederlandBraziliëBahama’sBhutan" + + "BouveteilandBotswanaBelarusBelizeCanadaCocoseilandenCongo-KinshasaCentra" + + "al-Afrikaanse RepubliekCongo-BrazzavilleZwitserlandIvoorkustCookeilanden" + + "ChiliKameroenChinaColombiaClippertonCosta RicaCubaKaapverdiëCuraçaoChris" + + "tmaseilandCyprusTsjechiëDuitslandDiego GarciaDjiboutiDenemarkenDominicaD" + + "ominicaanse RepubliekAlgerijeCeuta en MelillaEcuadorEstlandEgypteWesteli" + + "jke SaharaEritreaSpanjeEthiopiëEuropese UnieFinlandFijiFalklandeilandenM" + + "icronesiaFaeröerFrankrijkGabonVerenigd KoninkrijkGrenadaGeorgiëFrans-Guy" + + "anaGuernseyGhanaGibraltarGroenlandGambiaGuineeGuadeloupeEquatoriaal-Guin" + + "eaGriekenlandZuid-Georgia en Zuidelijke SandwicheilandenGuatemalaGuamGui" + + "nee-BissauGuyanaHongkong SAR van ChinaHeard en McDonaldeilandenHondurasK" + + "roatiëHaïtiHongarijeCanarische EilandenIndonesiëIerlandIsraëlIsle of Man" + + "IndiaBritse Gebieden in de Indische OceaanIrakIranIJslandItaliëJerseyJam" + + "aicaJordaniëJapanKeniaKirgiziëCambodjaKiribatiComorenSaint Kitts en Nevi" + + "sNoord-KoreaZuid-KoreaKoeweitCaymaneilandenKazachstanLaosLibanonSaint Lu" + + "ciaLiechtensteinSri LankaLiberiaLesothoLitouwenLuxemburgLetlandLibiëMaro" + + "kkoMonacoMoldaviëMontenegroSaint-MartinMadagaskarMarshalleilandenMacedon" + + "iëMaliMyanmar (Birma)MongoliëMacau SAR van ChinaNoordelijke MarianenMart" + + "iniqueMauritaniëMontserratMaltaMauritiusMaldivenMalawiMexicoMaleisiëMoza" + + "mbiqueNamibiëNieuw-CaledoniëNigerNorfolkNigeriaNicaraguaNederlandNoorweg" + + "enNepalNauruNiueNieuw-ZeelandOmanPanamaPeruFrans-PolynesiëPapoea-Nieuw-G" + + "uineaFilipijnenPakistanPolenSaint-Pierre en MiquelonPitcairneilandenPuer" + + "to RicoPalestijnse gebiedenPortugalPalauParaguayQataroverig OceaniëRéuni" + + "onRoemeniëServiëRuslandRwandaSaoedi-ArabiëSalomonseilandenSeychellenSoed" + + "anZwedenSingaporeSint-HelenaSloveniëSpitsbergen en Jan MayenSlowakijeSie" + + "rra LeoneSan MarinoSenegalSomaliëSurinameZuid-SoedanSao Tomé en Principe" + + "El SalvadorSint-MaartenSyriëSwazilandTristan da CunhaTurks- en Caicoseil" + + "andenTsjaadFranse Gebieden in de zuidelijke Indische OceaanTogoThailandT" + + "adzjikistanTokelauOost-TimorTurkmenistanTunesiëTongaTurkijeTrinidad en T" + + "obagoTuvaluTaiwanTanzaniaOekraïneOegandaKleine afgelegen eilanden van de" + + " Verenigde StatenVerenigde StatenUruguayOezbekistanVaticaanstadSaint Vin" + + "cent en de GrenadinesVenezuelaBritse MaagdeneilandenAmerikaanse Maagdene" + + "ilandenVietnamVanuatuWallis en FutunaSamoaKosovoJemenMayotteZuid-AfrikaZ" + + "ambiaZimbabweonbekend gebiedwereldAfrikaNoord-AmerikaZuid-AmerikaOceanië" + + "West-AfrikaMidden-AmerikaOost-AfrikaNoord-AfrikaCentraal-AfrikaZuidelijk" + + " AfrikaAmerikaNoordelijk AmerikaCaribisch gebiedOost-AziëZuid-AziëZuidoo" + + "st-AziëZuid-EuropaAustralaziëMelanesiëMicronesische regioPolynesiëAziëCe" + + "ntraal-AziëWest-AziëEuropaOost-EuropaNoord-EuropaWest-EuropaLatijns-Amer" + + "ika" + +var nlRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0009, 0x0010, 0x002c, 0x0037, 0x0049, 0x0051, 0x0059, + 0x0061, 0x0075, 0x007b, 0x0085, 0x0090, 0x00a0, 0x00aa, 0x00b4, + 0x00b9, 0x00bf, 0x00cb, 0x00e1, 0x00e9, 0x00f3, 0x00fa, 0x0106, + 0x010f, 0x0116, 0x011d, 0x0122, 0x0133, 0x013a, 0x0140, 0x0147, + 0x015a, 0x0163, 0x016d, 0x0173, 0x017f, 0x0187, 0x018e, 0x0194, + 0x019a, 0x01a7, 0x01b5, 0x01d2, 0x01e3, 0x01ee, 0x01f7, 0x0203, + 0x0208, 0x0210, 0x0215, 0x021d, 0x0227, 0x0231, 0x0235, 0x0240, + 0x0248, 0x0257, 0x025d, 0x0266, 0x026f, 0x027b, 0x0283, 0x028d, + // Entry 40 - 7F + 0x0295, 0x02ab, 0x02b3, 0x02c3, 0x02ca, 0x02d1, 0x02d7, 0x02e8, + 0x02ef, 0x02f5, 0x02fe, 0x030b, 0x0312, 0x0316, 0x0326, 0x0330, + 0x0338, 0x0341, 0x0346, 0x0359, 0x0360, 0x0368, 0x0374, 0x037c, + 0x0381, 0x038a, 0x0393, 0x0399, 0x039f, 0x03a9, 0x03bb, 0x03c6, + 0x03f1, 0x03fa, 0x03fe, 0x040b, 0x0411, 0x0427, 0x0440, 0x0448, + 0x0450, 0x0456, 0x045f, 0x0472, 0x047c, 0x0483, 0x048a, 0x0495, + 0x049a, 0x04bf, 0x04c3, 0x04c7, 0x04ce, 0x04d5, 0x04db, 0x04e2, + 0x04eb, 0x04f0, 0x04f5, 0x04fe, 0x0506, 0x050e, 0x0515, 0x0529, + // Entry 80 - BF + 0x0534, 0x053e, 0x0545, 0x0553, 0x055d, 0x0561, 0x0568, 0x0573, + 0x0580, 0x0589, 0x0590, 0x0597, 0x059f, 0x05a8, 0x05af, 0x05b5, + 0x05bc, 0x05c2, 0x05cb, 0x05d5, 0x05e1, 0x05eb, 0x05fb, 0x0605, + 0x0609, 0x0618, 0x0621, 0x0634, 0x0648, 0x0652, 0x065d, 0x0667, + 0x066c, 0x0675, 0x067d, 0x0683, 0x0689, 0x0692, 0x069c, 0x06a4, + 0x06b4, 0x06b9, 0x06c0, 0x06c7, 0x06d0, 0x06d9, 0x06e2, 0x06e7, + 0x06ec, 0x06f0, 0x06fd, 0x0701, 0x0707, 0x070b, 0x071b, 0x072e, + 0x0738, 0x0740, 0x0745, 0x075d, 0x076d, 0x0778, 0x078c, 0x0794, + // Entry C0 - FF + 0x0799, 0x07a1, 0x07a6, 0x07b5, 0x07bd, 0x07c6, 0x07cd, 0x07d4, + 0x07da, 0x07e8, 0x07f8, 0x0802, 0x0808, 0x080e, 0x0817, 0x0822, + 0x082b, 0x0843, 0x084c, 0x0858, 0x0862, 0x0869, 0x0871, 0x0879, + 0x0884, 0x0899, 0x08a4, 0x08b0, 0x08b6, 0x08bf, 0x08cf, 0x08e7, + 0x08ed, 0x091d, 0x0921, 0x0929, 0x0935, 0x093c, 0x0946, 0x0952, + 0x095a, 0x095f, 0x0966, 0x0978, 0x097e, 0x0984, 0x098c, 0x0995, + 0x099c, 0x09cd, 0x09dd, 0x09e4, 0x09ef, 0x09fb, 0x0a19, 0x0a22, + 0x0a38, 0x0a53, 0x0a5a, 0x0a61, 0x0a71, 0x0a76, 0x0a7c, 0x0a81, + // Entry 100 - 13F + 0x0a88, 0x0a93, 0x0a99, 0x0aa1, 0x0ab0, 0x0ab6, 0x0abc, 0x0ac9, + 0x0ad5, 0x0add, 0x0ae8, 0x0af6, 0x0b01, 0x0b0d, 0x0b1c, 0x0b2c, + 0x0b33, 0x0b45, 0x0b55, 0x0b5f, 0x0b69, 0x0b77, 0x0b82, 0x0b8e, + 0x0b98, 0x0bab, 0x0bb5, 0x0bba, 0x0bc8, 0x0bd2, 0x0bd8, 0x0be3, + 0x0bef, 0x0bfa, 0x0c09, +} // Size: 606 bytes + +var noRegionStr string = "" + // Size: 2836 bytes + "AscensionAndorraDe forente arabiske emiraterAfghanistanAntigua og Barbud" + + "aAnguillaAlbaniaArmeniaDe nederlandske antillerAngolaAntarktisArgentinaA" + + "merikansk SamoaØsterrikeAustraliaArubaÅlandAserbajdsjanBosnia-Hercegovin" + + "aBarbadosBangladeshBelgiaBurkina FasoBulgariaBahrainBurundiBeninSaint-Ba" + + "rthélemyBermudaBruneiBoliviaKaribisk NederlandBrasilBahamasBhutanBouvetø" + + "yaBotswanaHviterusslandBelizeCanadaKokosøyeneKongo-KinshasaDen sentralaf" + + "rikanske republikkKongo-BrazzavilleSveitsElfenbenskystenCookøyeneChileKa" + + "merunKinaColombiaClippertonøyaCosta RicaCubaKapp VerdeCuraçaoChristmasøy" + + "aKyprosTsjekkiaTysklandDiego GarciaDjiboutiDanmarkDominicaDen dominikans" + + "ke republikkAlgerieCeuta og MelillaEcuadorEstlandEgyptVest-SaharaEritrea" + + "SpaniaEtiopiaEUFinlandFijiFalklandsøyeneMikronesiaføderasjonenFærøyeneFr" + + "ankrikeGabonStorbritanniaGrenadaGeorgiaFransk GuyanaGuernseyGhanaGibralt" + + "arGrønlandGambiaGuineaGuadeloupeEkvatorial-GuineaHellasSør-Georgia og Sø" + + "r-SandwichøyeneGuatemalaGuamGuinea-BissauGuyanaHongkong S.A.R. KinaHeard" + + "- og McDonaldøyeneHondurasKroatiaHaitiUngarnKanariøyeneIndonesiaIrlandIs" + + "raelManIndiaDet britiske territoriet i IndiahavetIrakIranIslandItaliaJer" + + "seyJamaicaJordanJapanKenyaKirgisistanKambodsjaKiribatiKomoreneSaint Kitt" + + "s og NevisNord-KoreaSør-KoreaKuwaitCaymanøyeneKasakhstanLaosLibanonSt. L" + + "uciaLiechtensteinSri LankaLiberiaLesothoLitauenLuxemburgLatviaLibyaMarok" + + "koMonacoMoldovaMontenegroSaint-MartinMadagaskarMarshalløyeneMakedoniaMal" + + "iMyanmar (Burma)MongoliaMacao S.A.R. KinaNord-MarianeneMartiniqueMaurita" + + "niaMontserratMaltaMauritiusMaldiveneMalawiMexicoMalaysiaMosambikNamibiaN" + + "y-CaledoniaNigerNorfolkøyaNigeriaNicaraguaNederlandNorgeNepalNauruNiueNe" + + "w ZealandOmanPanamaPeruFransk PolynesiaPapua Ny-GuineaFilippinenePakista" + + "nPolenSt. Pierre og MiquelonPitcairnPuerto RicoDet palestinske områdetPo" + + "rtugalPalauParaguayQatarytre OseaniaRéunionRomaniaSerbiaRusslandRwandaSa" + + "udi-ArabiaSalomonøyeneSeychelleneSudanSverigeSingaporeSt. HelenaSlovenia" + + "Svalbard og Jan MayenSlovakiaSierra LeoneSan MarinoSenegalSomaliaSurinam" + + "Sør-SudanSão Tomé og PríncipeEl SalvadorSint MaartenSyriaSwazilandTrista" + + "n da CunhaTurks- og CaicosøyeneTsjadDe franske sørterritorierTogoThailan" + + "dTadsjikistanTokelauØst-TimorTurkmenistanTunisiaTongaTyrkiaTrinidad og T" + + "obagoTuvaluTaiwanTanzaniaUkrainaUgandaUSAs ytre øyerUSAUruguayUsbekistan" + + "VatikanstatenSt. Vincent og GrenadineneVenezuelaDe britiske jomfruøyeneD" + + "e amerikanske jomfruøyeneVietnamVanuatuWallis og FutunaSamoaKosovoJemenM" + + "ayotteSør-AfrikaZambiaZimbabweukjent områdeverdenAfrikaNord-AmerikaSør-A" + + "merikaOseaniaVest-AfrikaMellom-AmerikaØst-AfrikaNord-AfrikaSentral-Afrik" + + "aSørlige AfrikaAmerikaNordlige AmerikaKaribiaØst-AsiaSør-AsiaSørøst-Asia" + + "Sør-EuropaAustralasiaMelanesiaMikronesiaPolynesiaAsiaSentral-AsiaVest-As" + + "iaEuropaØst-EuropaNord-EuropaVest-EuropaLatin-Amerika" + +var noRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0009, 0x0010, 0x002c, 0x0037, 0x0049, 0x0051, 0x0058, + 0x005f, 0x0077, 0x007d, 0x0086, 0x008f, 0x009f, 0x00a9, 0x00b2, + 0x00b7, 0x00bd, 0x00c9, 0x00db, 0x00e3, 0x00ed, 0x00f3, 0x00ff, + 0x0107, 0x010e, 0x0115, 0x011a, 0x012b, 0x0132, 0x0138, 0x013f, + 0x0151, 0x0157, 0x015e, 0x0164, 0x016e, 0x0176, 0x0183, 0x0189, + 0x018f, 0x019a, 0x01a8, 0x01c7, 0x01d8, 0x01de, 0x01ed, 0x01f7, + 0x01fc, 0x0203, 0x0207, 0x020f, 0x021d, 0x0227, 0x022b, 0x0235, + 0x023d, 0x024a, 0x0250, 0x0258, 0x0260, 0x026c, 0x0274, 0x027b, + // Entry 40 - 7F + 0x0283, 0x029d, 0x02a4, 0x02b4, 0x02bb, 0x02c2, 0x02c7, 0x02d2, + 0x02d9, 0x02df, 0x02e6, 0x02e8, 0x02ef, 0x02f3, 0x0302, 0x0319, + 0x0323, 0x032c, 0x0331, 0x033e, 0x0345, 0x034c, 0x0359, 0x0361, + 0x0366, 0x036f, 0x0378, 0x037e, 0x0384, 0x038e, 0x039f, 0x03a5, + 0x03c8, 0x03d1, 0x03d5, 0x03e2, 0x03e8, 0x03fc, 0x0414, 0x041c, + 0x0423, 0x0428, 0x042e, 0x043a, 0x0443, 0x0449, 0x044f, 0x0452, + 0x0457, 0x047c, 0x0480, 0x0484, 0x048a, 0x0490, 0x0496, 0x049d, + 0x04a3, 0x04a8, 0x04ad, 0x04b8, 0x04c1, 0x04c9, 0x04d1, 0x04e5, + // Entry 80 - BF + 0x04ef, 0x04f9, 0x04ff, 0x050b, 0x0515, 0x0519, 0x0520, 0x0529, + 0x0536, 0x053f, 0x0546, 0x054d, 0x0554, 0x055d, 0x0563, 0x0568, + 0x056f, 0x0575, 0x057c, 0x0586, 0x0592, 0x059c, 0x05aa, 0x05b3, + 0x05b7, 0x05c6, 0x05ce, 0x05df, 0x05ed, 0x05f7, 0x0601, 0x060b, + 0x0610, 0x0619, 0x0622, 0x0628, 0x062e, 0x0636, 0x063e, 0x0645, + 0x0651, 0x0656, 0x0661, 0x0668, 0x0671, 0x067a, 0x067f, 0x0684, + 0x0689, 0x068d, 0x0698, 0x069c, 0x06a2, 0x06a6, 0x06b6, 0x06c5, + 0x06d0, 0x06d8, 0x06dd, 0x06f3, 0x06fb, 0x0706, 0x071e, 0x0726, + // Entry C0 - FF + 0x072b, 0x0733, 0x0738, 0x0744, 0x074c, 0x0753, 0x0759, 0x0761, + 0x0767, 0x0773, 0x0780, 0x078b, 0x0790, 0x0797, 0x07a0, 0x07aa, + 0x07b2, 0x07c7, 0x07cf, 0x07db, 0x07e5, 0x07ec, 0x07f3, 0x07fa, + 0x0804, 0x081b, 0x0826, 0x0832, 0x0837, 0x0840, 0x0850, 0x0866, + 0x086b, 0x0885, 0x0889, 0x0891, 0x089d, 0x08a4, 0x08ae, 0x08ba, + 0x08c1, 0x08c6, 0x08cc, 0x08de, 0x08e4, 0x08ea, 0x08f2, 0x08f9, + 0x08ff, 0x090e, 0x0911, 0x0918, 0x0922, 0x092f, 0x0949, 0x0952, + 0x096a, 0x0985, 0x098c, 0x0993, 0x09a3, 0x09a8, 0x09ae, 0x09b3, + // Entry 100 - 13F + 0x09ba, 0x09c5, 0x09cb, 0x09d3, 0x09e1, 0x09e7, 0x09ed, 0x09f9, + 0x0a05, 0x0a0c, 0x0a17, 0x0a25, 0x0a30, 0x0a3b, 0x0a49, 0x0a58, + 0x0a5f, 0x0a6f, 0x0a76, 0x0a7f, 0x0a88, 0x0a95, 0x0aa0, 0x0aab, + 0x0ab4, 0x0abe, 0x0ac7, 0x0acb, 0x0ad7, 0x0ae0, 0x0ae6, 0x0af1, + 0x0afc, 0x0b07, 0x0b14, +} // Size: 606 bytes + +var paRegionStr string = "" + // Size: 7688 bytes + "ਅਸੈਂਸ਼ਨ ਟਾਪੂਅੰਡੋਰਾਸੰਯੁਕਤ ਅਰਬ ਅਮੀਰਾਤਅਫ਼ਗਾਨਿਸਤਾਨਐਂਟੀਗੁਆ ਅਤੇ ਬਾਰਬੁਡਾਅੰਗੁਇਲਾ" + + "ਅਲਬਾਨੀਆਅਰਮੀਨੀਆਅੰਗੋਲਾਅੰਟਾਰਕਟਿਕਾਅਰਜਨਟੀਨਾਅਮੈਰੀਕਨ ਸਮੋਆਆਸਟਰੀਆਆਸਟ੍ਰੇਲੀਆਅਰੂਬਾ" + + "ਅਲੈਂਡ ਟਾਪੂਅਜ਼ਰਬਾਈਜਾਨਬੋਸਨੀਆ ਅਤੇ ਹਰਜ਼ੇਗੋਵੀਨਾਬਾਰਬਾਡੋਸਬੰਗਲਾਦੇਸ਼ਬੈਲਜੀਅਮਬੁਰਕ" + + "ੀਨਾ ਫ਼ਾਸੋਬੁਲਗਾਰੀਆਬਹਿਰੀਨਬੁਰੁੰਡੀਬੇਨਿਨਸੇਂਟ ਬਾਰਥੇਲੇਮੀਬਰਮੂਡਾਬਰੂਨੇਈਬੋਲੀਵੀਆਕੈ" + + "ਰੇਬੀਆਈ ਨੀਦਰਲੈਂਡਬ੍ਰਾਜ਼ੀਲਬਹਾਮਾਸਭੂਟਾਨਬੌਵੇਟ ਟਾਪੂਬੋਟਸਵਾਨਾਬੇਲਾਰੂਸਬੇਲੀਜ਼ਕੈਨੇਡ" + + "ਾਕੋਕੋਸ (ਕੀਲਿੰਗ) ਟਾਪੂਕਾਂਗੋ - ਕਿੰਸ਼ਾਸਾਕੇਂਦਰੀ ਅਫ਼ਰੀਕੀ ਗਣਰਾਜਕਾਂਗੋ - ਬ੍ਰਾਜ਼" + + "ਾਵਿਲੇਸਵਿਟਜ਼ਰਲੈਂਡਕੋਟ ਡੀਵੋਆਰਕੁੱਕ ਟਾਪੂਚਿਲੀਕੈਮਰੂਨਚੀਨਕੋਲੰਬੀਆਕਲਿੱਪਰਟਨ ਟਾਪੂਕੋ" + + "ਸਟਾ ਰੀਕਾਕਿਊਬਾਕੇਪ ਵਰਡੇਕੁਰਾਕਾਓਕ੍ਰਿਸਮਿਸ ਟਾਪੂਸਾਇਪ੍ਰਸਚੈਕ ਗਣਰਾਜਜਰਮਨੀਡੀਇਗੋ ਗਾ" + + "ਰਸੀਆਜ਼ੀਬੂਤੀਡੈਨਮਾਰਕਡੋਮੀਨਿਕਾਡੋਮੀਨਿਕਾਈ ਗਣਰਾਜਅਲਜੀਰੀਆਸਿਓਟਾ ਅਤੇ ਮੇਲਿੱਲਾਇਕਵੇਡ" + + "ੋਰਇਸਟੋਨੀਆਮਿਸਰਪੱਛਮੀ ਸਹਾਰਾਇਰੀਟ੍ਰਿਆਸਪੇਨਇਥੋਪੀਆਯੂਰਪੀ ਯੂਨੀਅਨਫਿਨਲੈਂਡਫ਼ਿਜੀਫ਼ਾਕ" + + "ਲੈਂਡ ਟਾਪੂਮਾਇਕ੍ਰੋਨੇਸ਼ੀਆਫੈਰੋ ਟਾਪੂਫ਼ਰਾਂਸਗਬੋਨਯੂਨਾਈਟਡ ਕਿੰਗਡਮਗ੍ਰੇਨਾਡਾਜਾਰਜੀਆਫ" + + "਼ਰੈਂਚ ਗੁਆਨਾਗਰਨਜੀਘਾਨਾਜਿਬਰਾਲਟਰਗ੍ਰੀਨਲੈਂਡਗੈਂਬੀਆਗਿਨੀਗੁਆਡੇਲੋਪਭੂ-ਖੰਡੀ ਗਿਨੀਗ੍ਰ" + + "ੀਸਦੱਖਣੀ ਜਾਰਜੀਆ ਅਤੇ ਦੱਖਣੀ ਸੈਂਡਵਿਚ ਟਾਪੂਗੁਆਟੇਮਾਲਾਗੁਆਮਗਿਨੀ-ਬਿਸਾਉਗੁਯਾਨਾਹਾਂਗ" + + " ਕਾਂਗ ਐਸਏਆਰ ਚੀਨਹਰਡ ਤੇ ਮੈਕਡੋਨਾਲਡ ਟਾਪੂਹੋਂਡੁਰਸਕਰੋਏਸ਼ੀਆਹੈਤੀਹੰਗਰੀਕੇਨਾਰੀ ਟਾਪੂਇ" + + "ੰਡੋਨੇਸ਼ੀਆਆਇਰਲੈਂਡਇਜ਼ਰਾਈਲਆਇਲ ਆਫ ਮੈਨਭਾਰਤਬਰਤਾਨਵੀ ਹਿੰਦ ਮਹਾਂਸਾਗਰ ਪ੍ਰਦੇਸ਼ਇਰਾਕ" + + "ਈਰਾਨਆਈਸਲੈਂਡਇਟਲੀਜਰਸੀਜਮਾਇਕਾਜਾਰਡਨਜਪਾਨਕੀਨੀਆਕਿਰਗਿਜ਼ਸਤਾਨਕੰਬੋਡੀਆਕਿਰਬਾਤੀਕੋਮੋਰੋ" + + "ਸਸੈਂਟ ਕਿਟਸ ਐਂਡ ਨੇਵਿਸਉੱਤਰੀ ਕੋਰੀਆਦੱਖਣੀ ਕੋਰੀਆਕੁਵੈਤਕੇਮੈਨ ਟਾਪੂਕਜ਼ਾਖਸਤਾਨਲਾਓਸ" + + "ਲੈਬਨਾਨਸੇਂਟ ਲੂਸੀਆਲਿਚੇਂਸਟਾਇਨਸ੍ਰੀ ਲੰਕਾਲਾਈਬੀਰੀਆਲੇਸੋਥੋਲਿਥੁਆਨੀਆਲਕਜ਼ਮਬਰਗਲਾਟਵੀ" + + "ਆਲੀਬੀਆਮੋਰੱਕੋਮੋਨਾਕੋਮੋਲਡੋਵਾਮੋਂਟੇਨੇਗਰੋਸੇਂਟ ਮਾਰਟਿਨਮੈਡਾਗਾਸਕਰਮਾਰਸ਼ਲ ਟਾਪੂਮੈਕਡ" + + "ੋਨੀਆਮਾਲੀਮਿਆਂਮਾਰ (ਬਰਮਾ)ਮੰਗੋਲੀਆਮਕਾਉ ਐਸਏਆਰ ਚੀਨਉੱਤਰੀ ਮਾਰੀਆਨਾ ਟਾਪੂਮਾਰਟੀਨਿਕਮ" + + "ੋਰਿਟਾਨੀਆਮੋਂਟਸੇਰਾਤਮਾਲਟਾਮੌਰਿਸ਼ਸਮਾਲਦੀਵਮਲਾਵੀਮੈਕਸੀਕੋਮਲੇਸ਼ੀਆਮੋਜ਼ਾਮਬੀਕਨਾਮੀਬੀਆ" + + "ਨਿਊ ਕੈਲੇਡੋਨੀਆਨਾਈਜਰਨੋਰਫੌਕ ਟਾਪੂਨਾਈਜੀਰੀਆਨਿਕਾਰਾਗੁਆਨੀਦਰਲੈਂਡਨਾਰਵੇਨੇਪਾਲਨਾਉਰੂਨ" + + "ਿਯੂਨਿਊਜ਼ੀਲੈਂਡਓਮਾਨਪਨਾਮਾਪੇਰੂਫਰੈਂਚ ਪੋਲੀਨੇਸ਼ੀਆਪਾਪੂਆ ਨਿਊ ਗਿਨੀਫਿਲੀਪੀਂਸਪਾਕਿਸਤ" + + "ਾਨਪੋਲੈਂਡਸੈਂਟ ਪੀਅਰੇ ਐਂਡ ਮਿਕੇਲਨਪਿਟਕੇਰਨ ਟਾਪੂਪਿਊਰਟੋ ਰਿਕੋਫਿਲੀਸਤੀਨੀ ਖੇਤਰਪੁਰਤ" + + "ਗਾਲਪਲਾਉਪੈਰਾਗਵੇਕਤਰਆਊਟਲਾਇੰਗ ਓਸ਼ੀਨੀਆਰਿਯੂਨੀਅਨਰੋਮਾਨੀਆਸਰਬੀਆਰੂਸਰਵਾਂਡਾਸਾਊਦੀ ਅਰ" + + "ਬਸੋਲੋਮਨ ਟਾਪੂਸੇਸ਼ਲਸਸੂਡਾਨਸਵੀਡਨਸਿੰਗਾਪੁਰਸੇਂਟ ਹੇਲੇਨਾਸਲੋਵੇਨੀਆਸਵਾਲਬਰਡ ਅਤੇ ਜਾਨ" + + " ਮਾਯੇਨਸਲੋਵਾਕੀਆਸਿਏਰਾ ਲਿਓਨਸੈਨ ਮਰੀਨੋਸੇਨੇਗਲਸੋਮਾਲੀਆਸੂਰੀਨਾਮਦੱਖਣੀ ਸੂਡਾਨਸਾਓ ਟੋਮ " + + "ਅਤੇ ਪ੍ਰਿੰਸੀਪੇਅਲ ਸਲਵਾਡੋਰਸਿੰਟ ਮਾਰਟੀਨਸੀਰੀਆਸਵਾਜ਼ੀਲੈਂਡਟ੍ਰਿਸਟਾਨ ਦਾ ਕੁੰਹਾਟੁਰਕ" + + "ਸ ਅਤੇ ਕੈਕੋਸ ਟਾਪੂਚਾਡਫਰੈਂਚ ਦੱਖਣੀ ਪ੍ਰਦੇਸ਼ਟੋਗੋਥਾਈਲੈਂਡਤਾਜਿਕਿਸਤਾਨਟੋਕੇਲਾਉਤਿਮੋ" + + "ਰ-ਲੇਸਤੇਤੁਰਕਮੇਨਿਸਤਾਨਟਿਊਨੀਸ਼ੀਆਟੌਂਗਾਤੁਰਕੀਟ੍ਰਿਨੀਡਾਡ ਅਤੇ ਟੋਬਾਗੋਟੁਵਾਲੂਤਾਇਵਾਨ" + + "ਤਨਜ਼ਾਨੀਆਯੂਕਰੇਨਯੂਗਾਂਡਾਯੂ.ਐਸ. ਦੂਰ-ਦੁਰਾਡੇ ਟਾਪੂਸੰਯੁਕਤ ਰਾਜਉਰੂਗਵੇਉਜ਼ਬੇਕਿਸਤਾਨ" + + "ਵੈਟੀਕਨ ਸਿਟੀਸੇਂਟ ਵਿਨਸੈਂਟ ਐਂਡ ਗ੍ਰੇਨਾਡੀਨਸਵੇਨੇਜ਼ੂਏਲਾਬ੍ਰਿਟਿਸ਼ ਵਰਜਿਨ ਟਾਪੂਯੂ " + + "ਐਸ ਵਰਜਿਨ ਟਾਪੂਵੀਅਤਨਾਮਵਾਨੂਆਟੂਵਾਲਿਸ ਅਤੇ ਫੂਟੂਨਾਸਾਮੋਆਕੋਸੋਵੋਯਮਨਮਾਯੋਟੀਦੱਖਣੀ ਅ" + + "ਫਰੀਕਾਜ਼ਾਮਬੀਆਜ਼ਿੰਬਾਬਵੇਅਣਪਛਾਤਾ ਖੇਤਰਸੰਸਾਰਅਫ਼ਰੀਕਾਉੱਤਰ ਅਮਰੀਕਾਦੱਖਣੀ ਅਮਰੀਕਾਓਸ" + + "਼ੇਨੀਆਪੱਛਮੀ ਅਫ਼ਰੀਕਾਕੇਂਦਰੀ ਅਮਰੀਕਾਪੂਰਬੀ ਅਫ਼ਰੀਕਾਉੱਤਰੀ ਅਫ਼ਰੀਕਾਮੱਧ ਅਫ਼ਰੀਕਾਦੱ" + + "ਖਣੀ ਅਫ਼ਰੀਕਾਅਮਰੀਕਾਉੱਤਰੀ ਅਮਰੀਕਾਕੈਰੇਬੀਆਈਪੂਰਬੀ ਏਸ਼ੀਆਦੱਖਣੀ ਏਸ਼ੀਆਦੱਖਣ-ਪੂਰਬੀ " + + "ਏਸ਼ੀਆਦੱਖਣੀ ਯੂਰਪਆਸਟਰੇਲੇਸ਼ੀਆਮੇਲਾਨੇਸ਼ੀਆਮਾਇਕ੍ਰੋਨੇਸ਼ੀਆਈ ਖੇਤਰਪੋਲੀਨੇਸ਼ੀਆਏਸ਼ੀਆ" + + "ਕੇਂਦਰੀ ਏਸ਼ੀਆਪੱਛਮੀ ਏਸ਼ੀਆਯੂਰਪਪੂਰਬੀ ਯੂਰਪਉੱਤਰੀ ਯੂਰਪਪੱਛਮੀ ਯੂਰਪਲਾਤੀਨੀ ਅਮਰੀਕਾ" + +var paRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0022, 0x0034, 0x0063, 0x0084, 0x00b9, 0x00ce, 0x00e3, + 0x00f8, 0x00f8, 0x010a, 0x0128, 0x0140, 0x0162, 0x0174, 0x018f, + 0x019e, 0x01ba, 0x01d8, 0x0216, 0x022e, 0x0249, 0x025e, 0x0283, + 0x029b, 0x02ad, 0x02c2, 0x02d1, 0x02f9, 0x030b, 0x031d, 0x0332, + 0x0363, 0x037b, 0x038d, 0x039c, 0x03b8, 0x03d0, 0x03e5, 0x03f7, + 0x0409, 0x043a, 0x0464, 0x049c, 0x04cf, 0x04f0, 0x050c, 0x0525, + 0x0531, 0x0543, 0x054c, 0x0561, 0x0586, 0x05a2, 0x05b1, 0x05c7, + 0x05dc, 0x0601, 0x0616, 0x062f, 0x063e, 0x0660, 0x0675, 0x068a, + // Entry 40 - 7F + 0x06a2, 0x06cd, 0x06e2, 0x0711, 0x0726, 0x073b, 0x0747, 0x0766, + 0x077e, 0x078a, 0x079c, 0x07be, 0x07d3, 0x07e2, 0x0807, 0x082e, + 0x0847, 0x0859, 0x0865, 0x088d, 0x08a5, 0x08b7, 0x08d9, 0x08e8, + 0x08f4, 0x090c, 0x0927, 0x0939, 0x0945, 0x095d, 0x097d, 0x098c, + 0x09eb, 0x0a06, 0x0a12, 0x0a2e, 0x0a40, 0x0a73, 0x0aac, 0x0ac1, + 0x0ad9, 0x0ae5, 0x0af4, 0x0b13, 0x0b31, 0x0b46, 0x0b5b, 0x0b75, + 0x0b81, 0x0bd2, 0x0bde, 0x0bea, 0x0bff, 0x0c0b, 0x0c17, 0x0c29, + 0x0c38, 0x0c44, 0x0c53, 0x0c74, 0x0c89, 0x0c9e, 0x0cb3, 0x0ce6, + // Entry 80 - BF + 0x0d05, 0x0d24, 0x0d33, 0x0d4f, 0x0d6a, 0x0d76, 0x0d88, 0x0da4, + 0x0dc2, 0x0ddb, 0x0df3, 0x0e05, 0x0e1d, 0x0e35, 0x0e47, 0x0e56, + 0x0e68, 0x0e7a, 0x0e8f, 0x0ead, 0x0ecc, 0x0ee7, 0x0f06, 0x0f1e, + 0x0f2a, 0x0f4e, 0x0f63, 0x0f89, 0x0fbb, 0x0fd3, 0x0fee, 0x1009, + 0x1018, 0x102d, 0x103f, 0x104e, 0x1063, 0x1078, 0x1093, 0x10a8, + 0x10cd, 0x10dc, 0x10fb, 0x1113, 0x112e, 0x1146, 0x1155, 0x1164, + 0x1173, 0x117f, 0x119d, 0x11a9, 0x11b8, 0x11c4, 0x11f2, 0x1218, + 0x1230, 0x1248, 0x125a, 0x1293, 0x12b5, 0x12d4, 0x12fc, 0x1311, + // Entry C0 - FF + 0x131d, 0x1332, 0x133b, 0x1369, 0x1381, 0x1396, 0x13a5, 0x13ae, + 0x13c0, 0x13d9, 0x13f8, 0x140a, 0x1419, 0x1428, 0x1440, 0x145f, + 0x1477, 0x14b0, 0x14c8, 0x14e4, 0x14fd, 0x150f, 0x1524, 0x1539, + 0x1558, 0x1591, 0x15ad, 0x15cc, 0x15db, 0x15f9, 0x1628, 0x165e, + 0x1667, 0x169c, 0x16a8, 0x16bd, 0x16db, 0x16f0, 0x170f, 0x1733, + 0x174e, 0x175d, 0x176c, 0x17a4, 0x17b6, 0x17c8, 0x17e0, 0x17f2, + 0x1807, 0x183f, 0x185b, 0x186d, 0x188e, 0x18ad, 0x18f8, 0x1916, + 0x194b, 0x1975, 0x198a, 0x199f, 0x19cb, 0x19da, 0x19ec, 0x19f5, + // Entry 100 - 13F + 0x1a07, 0x1a29, 0x1a3e, 0x1a59, 0x1a7b, 0x1a8a, 0x1a9f, 0x1abe, + 0x1ae0, 0x1af5, 0x1b1a, 0x1b3f, 0x1b64, 0x1b89, 0x1ba8, 0x1bcd, + 0x1bdf, 0x1c01, 0x1c19, 0x1c38, 0x1c57, 0x1c83, 0x1c9f, 0x1cc0, + 0x1cde, 0x1d15, 0x1d33, 0x1d42, 0x1d64, 0x1d83, 0x1d8f, 0x1dab, + 0x1dc7, 0x1de3, 0x1e08, +} // Size: 606 bytes + +var plRegionStr string = "" + // Size: 3161 bytes + "Wyspa WniebowstąpieniaAndoraZjednoczone Emiraty ArabskieAfganistanAntigu" + + "a i BarbudaAnguillaAlbaniaArmeniaAntyle HolenderskieAngolaAntarktykaArge" + + "ntynaSamoa AmerykańskieAustriaAustraliaArubaWyspy AlandzkieAzerbejdżanBo" + + "śnia i HercegowinaBarbadosBangladeszBelgiaBurkina FasoBułgariaBahrajnBu" + + "rundiBeninSaint-BarthélemyBermudyBrunei DarussalamBoliwiaNiderlandy Kara" + + "ibskieBrazyliaBahamyBhutanWyspa BouvetaBotswanaBiałoruśBelizeKanadaWyspy" + + " KokosoweDemokratyczna Republika KongaRepublika ŚrodkowoafrykańskaKongoS" + + "zwajcariaCôte d’IvoireWyspy CookaChileKamerunChinyKolumbiaClippertonKost" + + "arykaKubaRepublika Zielonego PrzylądkaCuraçaoWyspa Bożego NarodzeniaCypr" + + "CzechyNiemcyDiego GarciaDżibutiDaniaDominikaDominikanaAlgieriaCeuta i Me" + + "lillaEkwadorEstoniaEgiptSahara ZachodniaErytreaHiszpaniaEtiopiaUnia Euro" + + "pejskaFinlandiaFidżiFalklandyMikronezjaWyspy OwczeFrancjaGabonWielka Bry" + + "taniaGrenadaGruzjaGujana FrancuskaGuernseyGhanaGibraltarGrenlandiaGambia" + + "GwineaGwadelupaGwinea RównikowaGrecjaGeorgia Południowa i Sandwich Połud" + + "niowyGwatemalaGuamGwinea BissauGujanaSRA Hongkong (Chiny)Wyspy Heard i M" + + "cDonaldaHondurasChorwacjaHaitiWęgryWyspy KanaryjskieIndonezjaIrlandiaIzr" + + "aelWyspa ManIndieBrytyjskie Terytorium Oceanu IndyjskiegoIrakIranIslandi" + + "aWłochyJerseyJamajkaJordaniaJaponiaKeniaKirgistanKambodżaKiribatiKomoryS" + + "aint Kitts i NevisKorea PółnocnaKorea PołudniowaKuwejtKajmanyKazachstanL" + + "aosLibanSaint LuciaLiechtensteinSri LankaLiberiaLesothoLitwaLuksemburgŁo" + + "twaLibiaMarokoMonakoMołdawiaCzarnogóraSaint-MartinMadagaskarWyspy Marsha" + + "llaMacedoniaMaliMjanma (Birma)MongoliaSRA Makau (Chiny)Mariany PółnocneM" + + "artynikaMauretaniaMontserratMaltaMauritiusMalediwyMalawiMeksykMalezjaMoz" + + "ambikNamibiaNowa KaledoniaNigerNorfolkNigeriaNikaraguaHolandiaNorwegiaNe" + + "palNauruNiueNowa ZelandiaOmanPanamaPeruPolinezja FrancuskaPapua-Nowa Gwi" + + "neaFilipinyPakistanPolskaSaint-Pierre i MiquelonPitcairnPortorykoTerytor" + + "ia PalestyńskiePortugaliaPalauParagwajKatarOceania inneReunionRumuniaSer" + + "biaRosjaRwandaArabia SaudyjskaWyspy SalomonaSeszeleSudanSzwecjaSingapurW" + + "yspa Świętej HelenySłoweniaSvalbard i Jan MayenSłowacjaSierra LeoneSan M" + + "arinoSenegalSomaliaSurinamSudan PołudniowyWyspy Świętego Tomasza i Książ" + + "ęcaSalwadorSint MaartenSyriaSuaziTristan da CunhaTurks i CaicosCzadFran" + + "cuskie Terytoria Południowe i AntarktyczneTogoTajlandiaTadżykistanTokela" + + "uTimor WschodniTurkmenistanTunezjaTongaTurcjaTrynidad i TobagoTuvaluTajw" + + "anTanzaniaUkrainaUgandaDalekie Wyspy Mniejsze Stanów ZjednoczonychStany " + + "ZjednoczoneUrugwajUzbekistanWatykanSaint Vincent i GrenadynyWenezuelaBry" + + "tyjskie Wyspy DziewiczeWyspy Dziewicze Stanów ZjednoczonychWietnamVanuat" + + "uWallis i FutunaSamoaKosowoJemenMajottaRepublika Południowej AfrykiZambi" + + "aZimbabweNieznany regionświatAfrykaAmeryka PółnocnaAmeryka PołudniowaOce" + + "aniaAfryka ZachodniaAmeryka ŚrodkowaAfryka WschodniaAfryka PółnocnaAfryk" + + "a ŚrodkowaAfryka PołudniowaAmerykaAmeryka Północna (USA, Kanada)KaraibyA" + + "zja WschodniaAzja PołudniowaAzja Południowo-WschodniaEuropa PołudniowaAu" + + "stralazjaMelanezjaRegion MikronezjiPolinezjaAzjaAzja ŚrodkowaAzja Zachod" + + "niaEuropaEuropa WschodniaEuropa PółnocnaEuropa ZachodniaAmeryka Łacińska" + +var plRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0017, 0x001d, 0x0039, 0x0043, 0x0054, 0x005c, 0x0063, + 0x006a, 0x007d, 0x0083, 0x008d, 0x0096, 0x00a9, 0x00b0, 0x00b9, + 0x00be, 0x00cd, 0x00d9, 0x00ee, 0x00f6, 0x0100, 0x0106, 0x0112, + 0x011b, 0x0122, 0x0129, 0x012e, 0x013f, 0x0146, 0x0157, 0x015e, + 0x0173, 0x017b, 0x0181, 0x0187, 0x0194, 0x019c, 0x01a6, 0x01ac, + 0x01b2, 0x01c0, 0x01dd, 0x01fb, 0x0200, 0x020a, 0x021a, 0x0225, + 0x022a, 0x0231, 0x0236, 0x023e, 0x0248, 0x0251, 0x0255, 0x0273, + 0x027b, 0x0293, 0x0297, 0x029d, 0x02a3, 0x02af, 0x02b7, 0x02bc, + // Entry 40 - 7F + 0x02c4, 0x02ce, 0x02d6, 0x02e5, 0x02ec, 0x02f3, 0x02f8, 0x0308, + 0x030f, 0x0318, 0x031f, 0x032e, 0x0337, 0x033d, 0x0346, 0x0350, + 0x035b, 0x0362, 0x0367, 0x0376, 0x037d, 0x0383, 0x0393, 0x039b, + 0x03a0, 0x03a9, 0x03b3, 0x03b9, 0x03bf, 0x03c8, 0x03d9, 0x03df, + 0x0409, 0x0412, 0x0416, 0x0423, 0x0429, 0x043d, 0x0454, 0x045c, + 0x0465, 0x046a, 0x0470, 0x0481, 0x048a, 0x0492, 0x0498, 0x04a1, + 0x04a6, 0x04ce, 0x04d2, 0x04d6, 0x04de, 0x04e5, 0x04eb, 0x04f2, + 0x04fa, 0x0501, 0x0506, 0x050f, 0x0518, 0x0520, 0x0526, 0x0539, + // Entry 80 - BF + 0x0549, 0x055a, 0x0560, 0x0567, 0x0571, 0x0575, 0x057a, 0x0585, + 0x0592, 0x059b, 0x05a2, 0x05a9, 0x05ae, 0x05b8, 0x05be, 0x05c3, + 0x05c9, 0x05cf, 0x05d8, 0x05e3, 0x05ef, 0x05f9, 0x0608, 0x0611, + 0x0615, 0x0623, 0x062b, 0x063c, 0x064e, 0x0657, 0x0661, 0x066b, + 0x0670, 0x0679, 0x0681, 0x0687, 0x068d, 0x0694, 0x069c, 0x06a3, + 0x06b1, 0x06b6, 0x06bd, 0x06c4, 0x06cd, 0x06d5, 0x06dd, 0x06e2, + 0x06e7, 0x06eb, 0x06f8, 0x06fc, 0x0702, 0x0706, 0x0719, 0x072a, + 0x0732, 0x073a, 0x0740, 0x0757, 0x075f, 0x0768, 0x077f, 0x0789, + // Entry C0 - FF + 0x078e, 0x0796, 0x079b, 0x07a7, 0x07ae, 0x07b5, 0x07bb, 0x07c0, + 0x07c6, 0x07d6, 0x07e4, 0x07eb, 0x07f0, 0x07f7, 0x07ff, 0x0815, + 0x081e, 0x0832, 0x083b, 0x0847, 0x0851, 0x0858, 0x085f, 0x0866, + 0x0877, 0x089d, 0x08a5, 0x08b1, 0x08b6, 0x08bb, 0x08cb, 0x08d9, + 0x08dd, 0x090c, 0x0910, 0x0919, 0x0925, 0x092c, 0x093a, 0x0946, + 0x094d, 0x0952, 0x0958, 0x0969, 0x096f, 0x0975, 0x097d, 0x0984, + 0x098a, 0x09b6, 0x09c7, 0x09ce, 0x09d8, 0x09df, 0x09f8, 0x0a01, + 0x0a1b, 0x0a40, 0x0a47, 0x0a4e, 0x0a5d, 0x0a62, 0x0a68, 0x0a6d, + // Entry 100 - 13F + 0x0a74, 0x0a91, 0x0a97, 0x0a9f, 0x0aae, 0x0ab4, 0x0aba, 0x0acc, + 0x0adf, 0x0ae6, 0x0af6, 0x0b07, 0x0b17, 0x0b28, 0x0b38, 0x0b4a, + 0x0b51, 0x0b71, 0x0b78, 0x0b86, 0x0b96, 0x0bb0, 0x0bc2, 0x0bcd, + 0x0bd6, 0x0be7, 0x0bf0, 0x0bf4, 0x0c02, 0x0c10, 0x0c16, 0x0c26, + 0x0c37, 0x0c47, 0x0c59, +} // Size: 606 bytes + +var ptRegionStr string = "" + // Size: 3176 bytes + "Ilha de AscensãoAndorraEmirados Árabes UnidosAfeganistãoAntígua e Barbud" + + "aAnguillaAlbâniaArmêniaAntilhas HolandesasAngolaAntártidaArgentinaSamoa " + + "AmericanaÁustriaAustráliaArubaIlhas ÅlandAzerbaijãoBósnia e HerzegovinaB" + + "arbadosBangladeshBélgicaBurquina FasoBulgáriaBahreinBurundiBeninSão Bart" + + "olomeuBermudasBruneiBolíviaPaíses Baixos CaribenhosBrasilBahamasButãoIlh" + + "a BouvetBotsuanaBielorrússiaBelizeCanadáIlhas Cocos (Keeling)Congo - Kin" + + "shasaRepública Centro-AfricanaCongo - BrazzavilleSuíçaCosta do MarfimIlh" + + "as CookChileRepública dos CamarõesChinaColômbiaIlha de ClippertonCosta R" + + "icaCubaCabo VerdeCuraçaoIlha ChristmasChipreRepública TchecaAlemanhaDieg" + + "o GarciaDjibutiDinamarcaDominicaRepública DominicanaArgéliaCeuta e Melil" + + "haEquadorEstôniaEgitoSaara OcidentalEritreiaEspanhaEtiópiaUnião Europeia" + + "FinlândiaFijiIlhas MalvinasMicronésiaIlhas FaroeFrançaGabãoReino UnidoGr" + + "anadaGeórgiaGuiana FrancesaGuernseyGanaGibraltarGroenlândiaGâmbiaGuinéGu" + + "adalupeGuiné EquatorialGréciaIlhas Geórgia do Sul e Sandwich do SulGuate" + + "malaGuamGuiné-BissauGuianaHong Kong, RAE da ChinaIlhas Heard e McDonaldH" + + "ondurasCroáciaHaitiHungriaIlhas CanáriasIndonésiaIrlandaIsraelIlha de Ma" + + "nÍndiaTerritório Britânico do Oceano ÍndicoIraqueIrãIslândiaItáliaJersey" + + "JamaicaJordâniaJapãoQuêniaQuirguistãoCambojaQuiribatiComoresSão Cristóvã" + + "o e NevisCoreia do NorteCoreia do SulKuwaitIlhas CaymanCazaquistãoLaosLí" + + "banoSanta LúciaLiechtensteinSri LankaLibériaLesotoLituâniaLuxemburgoLetô" + + "niaLíbiaMarrocosMônacoMoldáviaMontenegroSão MartinhoMadagascarIlhas Mars" + + "hallMacedôniaMaliMianmar (Birmânia)MongóliaMacau, RAE da ChinaIlhas Mari" + + "anas do NorteMartinicaMauritâniaMontserratMaltaMaurícioMaldivasMalawiMéx" + + "icoMalásiaMoçambiqueNamíbiaNova CaledôniaNígerIlha NorfolkNigériaNicarág" + + "uaHolandaNoruegaNepalNauruNiueNova ZelândiaOmãPanamáPeruPolinésia France" + + "saPapua-Nova GuinéFilipinasPaquistãoPolôniaSaint Pierre e MiquelonIlhas " + + "PitcairnPorto RicoTerritórios palestinosPortugalPalauParaguaiCatarOceani" + + "a RemotaReuniãoRomêniaSérviaRússiaRuandaArábia SauditaIlhas SalomãoSeych" + + "ellesSudãoSuéciaCingapuraSanta HelenaEslovêniaSvalbard e Jan MayenEslová" + + "quiaSerra LeoaSan MarinoSenegalSomáliaSurinameSudão do SulSão Tomé e Prí" + + "ncipeEl SalvadorSint MaartenSíriaSuazilândiaTristão da CunhaIlhas Turks " + + "e CaicosChadeTerritórios Franceses do SulTogoTailândiaTajiquistãoTokelau" + + "Timor-LesteTurcomenistãoTunísiaTongaTurquiaTrinidad e TobagoTuvaluTaiwan" + + "TanzâniaUcrâniaUgandaIlhas Menores Distantes dos EUAEstados UnidosUrugua" + + "iUzbequistãoCidade do VaticanoSão Vicente e GranadinasVenezuelaIlhas Vir" + + "gens BritânicasIlhas Virgens dos EUAVietnãVanuatuWallis e FutunaSamoaKos" + + "ovoIêmenMayotteÁfrica do SulZâmbiaZimbábueRegião desconhecidaMundoÁfrica" + + "América do NorteAmérica do SulOceaniaÁfrica OcidentalAmérica CentralÁfri" + + "ca OrientalÁfrica do NorteÁfrica CentralÁfrica AustralAméricasAmérica Se" + + "tentrionalCaribeÁsia OrientalÁsia do SulSudeste AsiáticoEuropa do SulAus" + + "tralásiaMelanésiaRegião da MicronésiaPolinésiaÁsiaÁsia CentralÁsia Ocide" + + "ntalEuropaEuropa OrientalEuropa SetentrionalEuropa OcidentalAmérica Lati" + + "na" + +var ptRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0011, 0x0018, 0x002f, 0x003b, 0x004d, 0x0055, 0x005d, + 0x0065, 0x0078, 0x007e, 0x0088, 0x0091, 0x00a0, 0x00a8, 0x00b2, + 0x00b7, 0x00c3, 0x00ce, 0x00e3, 0x00eb, 0x00f5, 0x00fd, 0x010a, + 0x0113, 0x011a, 0x0121, 0x0126, 0x0135, 0x013d, 0x0143, 0x014b, + 0x0164, 0x016a, 0x0171, 0x0177, 0x0182, 0x018a, 0x0197, 0x019d, + 0x01a4, 0x01b9, 0x01c9, 0x01e3, 0x01f6, 0x01fd, 0x020c, 0x0216, + 0x021b, 0x0233, 0x0238, 0x0241, 0x0253, 0x025d, 0x0261, 0x026b, + 0x0273, 0x0281, 0x0287, 0x0298, 0x02a0, 0x02ac, 0x02b3, 0x02bc, + // Entry 40 - 7F + 0x02c4, 0x02d9, 0x02e1, 0x02f0, 0x02f7, 0x02ff, 0x0304, 0x0313, + 0x031b, 0x0322, 0x032a, 0x0339, 0x0343, 0x0347, 0x0355, 0x0360, + 0x036b, 0x0372, 0x0378, 0x0383, 0x038a, 0x0392, 0x03a1, 0x03a9, + 0x03ad, 0x03b6, 0x03c2, 0x03c9, 0x03cf, 0x03d8, 0x03e9, 0x03f0, + 0x0417, 0x0420, 0x0424, 0x0431, 0x0437, 0x044e, 0x0464, 0x046c, + 0x0474, 0x0479, 0x0480, 0x048f, 0x0499, 0x04a0, 0x04a6, 0x04b1, + 0x04b7, 0x04df, 0x04e5, 0x04e9, 0x04f2, 0x04f9, 0x04ff, 0x0506, + 0x050f, 0x0515, 0x051c, 0x0528, 0x052f, 0x0538, 0x053f, 0x0557, + // Entry 80 - BF + 0x0566, 0x0573, 0x0579, 0x0585, 0x0591, 0x0595, 0x059c, 0x05a8, + 0x05b5, 0x05be, 0x05c6, 0x05cc, 0x05d5, 0x05df, 0x05e7, 0x05ed, + 0x05f5, 0x05fc, 0x0605, 0x060f, 0x061c, 0x0626, 0x0634, 0x063e, + 0x0642, 0x0655, 0x065e, 0x0671, 0x0688, 0x0691, 0x069c, 0x06a6, + 0x06ab, 0x06b4, 0x06bc, 0x06c2, 0x06c9, 0x06d1, 0x06dc, 0x06e4, + 0x06f3, 0x06f9, 0x0705, 0x070d, 0x0717, 0x071e, 0x0725, 0x072a, + 0x072f, 0x0733, 0x0741, 0x0745, 0x074c, 0x0750, 0x0763, 0x0774, + 0x077d, 0x0787, 0x078f, 0x07a6, 0x07b4, 0x07be, 0x07d5, 0x07dd, + // Entry C0 - FF + 0x07e2, 0x07ea, 0x07ef, 0x07fd, 0x0805, 0x080d, 0x0814, 0x081b, + 0x0821, 0x0830, 0x083e, 0x0848, 0x084e, 0x0855, 0x085e, 0x086a, + 0x0874, 0x0888, 0x0893, 0x089d, 0x08a7, 0x08ae, 0x08b6, 0x08be, + 0x08cb, 0x08e1, 0x08ec, 0x08f8, 0x08fe, 0x090a, 0x091b, 0x092f, + 0x0934, 0x0951, 0x0955, 0x095f, 0x096b, 0x0972, 0x097d, 0x098b, + 0x0993, 0x0998, 0x099f, 0x09b0, 0x09b6, 0x09bc, 0x09c5, 0x09cd, + 0x09d3, 0x09f2, 0x0a00, 0x0a07, 0x0a13, 0x0a25, 0x0a3e, 0x0a47, + 0x0a60, 0x0a75, 0x0a7c, 0x0a83, 0x0a92, 0x0a97, 0x0a9d, 0x0aa3, + // Entry 100 - 13F + 0x0aaa, 0x0ab8, 0x0abf, 0x0ac8, 0x0adc, 0x0ae1, 0x0ae8, 0x0af9, + 0x0b08, 0x0b0f, 0x0b20, 0x0b30, 0x0b40, 0x0b50, 0x0b5f, 0x0b6e, + 0x0b77, 0x0b8c, 0x0b92, 0x0ba0, 0x0bac, 0x0bbd, 0x0bca, 0x0bd6, + 0x0be0, 0x0bf6, 0x0c00, 0x0c05, 0x0c12, 0x0c21, 0x0c27, 0x0c36, + 0x0c49, 0x0c59, 0x0c68, +} // Size: 606 bytes + +var ptPTRegionStr string = "" + // Size: 687 bytes + "AnguilaArméniaAlandaBangladecheBarémBenimBaamasIlhas dos Cocos (Keeling)" + + "Congo-KinshasaCongo-BrazzavilleCamarõesCuraçauIlha do NatalRepública Che" + + "caJibutiDomínicaEstóniaIlhas FalklandIlhas FaroéGronelândiaGuameIrãoQuén" + + "iaSão Cristóvão e NevesIlhas CaimãoListenstaineSri LancaLetóniaMónacoMad" + + "agáscarMacedóniaMonserrateMauríciaMaláuiNova CaledóniaPaíses BaixosPolón" + + "iaSão Pedro e MiquelãoTerritórios palestinianosOceânia InsularRoméniaSei" + + "chelesSingapuraEslovéniaSão MarinhoSalvadorIlhas Turcas e CaicosToquelau" + + "TurquemenistãoTrindade e TobagoIlhas Menores Afastadas dos EUAUsbequistã" + + "oVietnameIémenMaioteZimbabuéOceâniaNorte de ÁfricaCaraíbasEuropa do Nort" + + "e" + +var ptPTRegionIdx = []uint16{ // 289 elements + // Entry 0 - 3F + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0007, + 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, + 0x000f, 0x0015, 0x0015, 0x0015, 0x0015, 0x0020, 0x0020, 0x0020, + 0x0020, 0x0026, 0x0026, 0x002b, 0x002b, 0x002b, 0x002b, 0x002b, + 0x002b, 0x002b, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, 0x0031, + 0x0031, 0x004a, 0x0058, 0x0058, 0x0069, 0x0069, 0x0069, 0x0069, + 0x0069, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, + 0x007a, 0x0087, 0x0087, 0x0097, 0x0097, 0x0097, 0x009d, 0x009d, + // Entry 40 - 7F + 0x00a6, 0x00a6, 0x00a6, 0x00a6, 0x00a6, 0x00ae, 0x00ae, 0x00ae, + 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00ae, 0x00bc, 0x00bc, + 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, 0x00c8, + 0x00c8, 0x00c8, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, 0x00d4, + 0x00d4, 0x00d4, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, + 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, 0x00d9, + 0x00d9, 0x00d9, 0x00d9, 0x00de, 0x00de, 0x00de, 0x00de, 0x00de, + 0x00de, 0x00de, 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00e5, 0x00fd, + // Entry 80 - BF + 0x00fd, 0x00fd, 0x00fd, 0x010a, 0x010a, 0x010a, 0x010a, 0x010a, + 0x0116, 0x011f, 0x011f, 0x011f, 0x011f, 0x011f, 0x0127, 0x0127, + 0x0127, 0x012e, 0x012e, 0x012e, 0x012e, 0x0139, 0x0139, 0x0143, + 0x0143, 0x0143, 0x0143, 0x0143, 0x0143, 0x0143, 0x0143, 0x014d, + 0x014d, 0x0156, 0x0156, 0x015d, 0x015d, 0x015d, 0x015d, 0x015d, + 0x016c, 0x016c, 0x016c, 0x016c, 0x016c, 0x017a, 0x017a, 0x017a, + 0x017a, 0x017a, 0x017a, 0x017a, 0x017a, 0x017a, 0x017a, 0x017a, + 0x017a, 0x017a, 0x0182, 0x0198, 0x0198, 0x0198, 0x01b2, 0x01b2, + // Entry C0 - FF + 0x01b2, 0x01b2, 0x01b2, 0x01c2, 0x01c2, 0x01ca, 0x01ca, 0x01ca, + 0x01ca, 0x01ca, 0x01ca, 0x01d3, 0x01d3, 0x01d3, 0x01dc, 0x01dc, + 0x01e6, 0x01e6, 0x01e6, 0x01e6, 0x01f2, 0x01f2, 0x01f2, 0x01f2, + 0x01f2, 0x01f2, 0x01fa, 0x01fa, 0x01fa, 0x01fa, 0x01fa, 0x020f, + 0x020f, 0x020f, 0x020f, 0x020f, 0x020f, 0x0217, 0x0217, 0x0226, + 0x0226, 0x0226, 0x0226, 0x0237, 0x0237, 0x0237, 0x0237, 0x0237, + 0x0237, 0x0256, 0x0256, 0x0256, 0x0262, 0x0262, 0x0262, 0x0262, + 0x0262, 0x0262, 0x026a, 0x026a, 0x026a, 0x026a, 0x026a, 0x0270, + // Entry 100 - 13F + 0x0276, 0x0276, 0x0276, 0x027f, 0x027f, 0x027f, 0x027f, 0x027f, + 0x027f, 0x0287, 0x0287, 0x0287, 0x0287, 0x0297, 0x0297, 0x0297, + 0x0297, 0x0297, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, + 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, + 0x02af, +} // Size: 602 bytes + +var roRegionStr string = "" + // Size: 3238 bytes + "Insula AscensionAndorraEmiratele Arabe UniteAfganistanAntigua și Barbuda" + + "AnguillaAlbaniaArmeniaAntilele OlandezeAngolaAntarcticaArgentinaSamoa Am" + + "ericanăAustriaAustraliaArubaInsulele ÅlandAzerbaidjanBosnia și Herțegovi" + + "naBarbadosBangladeshBelgiaBurkina FasoBulgariaBahrainBurundiBeninSfântul" + + " BartolomeuBermudaBruneiBoliviaInsulele Caraibe OlandezeBraziliaBahamasB" + + "hutanInsula BouvetBotswanaBelarusBelizeCanadaInsulele Cocos (Keeling)Con" + + "go - KinshasaRepublica CentrafricanăCongo - BrazzavilleElvețiaCôte d’Ivo" + + "ireInsulele CookChileCamerunChinaColumbiaInsula ClippertonCosta RicaCuba" + + "Capul VerdeCuraçaoInsula ChristmasCipruRepublica CehăGermaniaDiego Garci" + + "aDjiboutiDanemarcaDominicaRepublica DominicanăAlgeriaCeuta și MelillaEcu" + + "adorEstoniaEgiptSahara OccidentalăEritreeaSpaniaEtiopiaUniunea Europeană" + + "FinlandaFijiInsulele FalklandMicroneziaInsulele FeroeFranțaGabonRegatul " + + "UnitGrenadaGeorgiaGuyana FrancezăGuernseyGhanaGibraltarGroenlandaGambiaG" + + "uineeaGuadelupaGuineea EcuatorialăGreciaGeorgia de Sud și Insulele Sandw" + + "ich de SudGuatemalaGuamGuineea-BissauGuyanaR.A.S. Hong Kong a ChineiInsu" + + "la Heard și Insulele McDonaldHondurasCroațiaHaitiUngariaInsulele CanareI" + + "ndoneziaIrlandaIsraelInsula ManIndiaTeritoriul Britanic din Oceanul Indi" + + "anIrakIranIslandaItaliaJerseyJamaicaIordaniaJaponiaKenyaKârgâzstanCambod" + + "giaKiribatiComoreSaint Kitts și NevisCoreea de NordCoreea de SudKuweitIn" + + "sulele CaymanKazahstanLaosLibanSfânta LuciaLiechtensteinSri LankaLiberia" + + "LesothoLituaniaLuxemburgLetoniaLibiaMarocMonacoRepublica MoldovaMunteneg" + + "ruSfântul MartinMadagascarInsulele MarshallMacedoniaMaliMyanmar (Birmani" + + "a)MongoliaR.A.S. Macao a ChineiInsulele Mariane de NordMartinicaMauritan" + + "iaMontserratMaltaMauritiusMaldiveMalawiMexicMalaysiaMozambicNamibiaNoua " + + "CaledonieNigerInsula NorfolkNigeriaNicaraguaȚările de JosNorvegiaNepalNa" + + "uruNiueNoua ZeelandăOmanPanamaPeruPolinezia FrancezăPapua-Noua GuineeFil" + + "ipinePakistanPoloniaSaint-Pierre și MiquelonInsulele PitcairnPuerto Rico" + + "Teritoriile PalestinienePortugaliaPalauParaguayQatarOceania PerifericăRé" + + "unionRomâniaSerbiaRusiaRwandaArabia SaudităInsulele SolomonSeychellesSud" + + "anSuediaSingaporeSfânta ElenaSloveniaSvalbard și Jan MayenSlovaciaSierra" + + " LeoneSan MarinoSenegalSomaliaSurinameSudanul de SudSao Tome și Principe" + + "El SalvadorSint-MaartenSiriaSwazilandTristan da CunhaInsulele Turks și C" + + "aicosCiadTeritoriile Australe și Antarctice FrancezeTogoThailandaTadjiki" + + "stanTokelauTimorul de EstTurkmenistanTunisiaTongaTurciaTrinidad și Tobag" + + "oTuvaluTaiwanTanzaniaUcrainaUgandaInsulele Îndepărtate ale S.U.A.Statele" + + " Unite ale AmericiiUruguayUzbekistanStatul Cetății VaticanuluiSaint Vinc" + + "ent și GrenadineleVenezuelaInsulele Virgine BritaniceInsulele Virgine S." + + "U.A.VietnamVanuatuWallis și FutunaSamoaKosovoYemenMayotteAfrica de SudZa" + + "mbiaZimbabweRegiune necunoscutăLumeAfricaAmerica de NordAmerica de SudOc" + + "eaniaAfrica OccidentalăAmerica CentralăAfrica OrientalăAfrica Septentrio" + + "nalăAfrica CentralăAfrica MeridionalăAmericiAmerica SeptentrionalăCaraib" + + "eAsia OrientalăAsia MeridionalăAsia de Sud-EstEuropa MeridionalăAustrala" + + "siaMelaneziaRegiunea MicroneziaPolineziaAsiaAsia CentralăAsia Occidental" + + "ăEuropaEuropa OrientalăEuropa SeptentrionalăEuropa OccidentalăAmerica L" + + "atină" + +var roRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0010, 0x0017, 0x002c, 0x0036, 0x0049, 0x0051, 0x0058, + 0x005f, 0x0070, 0x0076, 0x0080, 0x0089, 0x0099, 0x00a0, 0x00a9, + 0x00ae, 0x00bd, 0x00c8, 0x00df, 0x00e7, 0x00f1, 0x00f7, 0x0103, + 0x010b, 0x0112, 0x0119, 0x011e, 0x0131, 0x0138, 0x013e, 0x0145, + 0x015e, 0x0166, 0x016d, 0x0173, 0x0180, 0x0188, 0x018f, 0x0195, + 0x019b, 0x01b3, 0x01c3, 0x01db, 0x01ee, 0x01f6, 0x0206, 0x0213, + 0x0218, 0x021f, 0x0224, 0x022c, 0x023d, 0x0247, 0x024b, 0x0256, + 0x025e, 0x026e, 0x0273, 0x0282, 0x028a, 0x0296, 0x029e, 0x02a7, + // Entry 40 - 7F + 0x02af, 0x02c4, 0x02cb, 0x02dc, 0x02e3, 0x02ea, 0x02ef, 0x0302, + 0x030a, 0x0310, 0x0317, 0x0329, 0x0331, 0x0335, 0x0346, 0x0350, + 0x035e, 0x0365, 0x036a, 0x0376, 0x037d, 0x0384, 0x0394, 0x039c, + 0x03a1, 0x03aa, 0x03b4, 0x03ba, 0x03c1, 0x03ca, 0x03de, 0x03e4, + 0x040f, 0x0418, 0x041c, 0x042a, 0x0430, 0x0449, 0x046b, 0x0473, + 0x047b, 0x0480, 0x0487, 0x0496, 0x049f, 0x04a6, 0x04ac, 0x04b6, + 0x04bb, 0x04e1, 0x04e5, 0x04e9, 0x04f0, 0x04f6, 0x04fc, 0x0503, + 0x050b, 0x0512, 0x0517, 0x0523, 0x052c, 0x0534, 0x053a, 0x054f, + // Entry 80 - BF + 0x055d, 0x056a, 0x0570, 0x057f, 0x0588, 0x058c, 0x0591, 0x059e, + 0x05ab, 0x05b4, 0x05bb, 0x05c2, 0x05ca, 0x05d3, 0x05da, 0x05df, + 0x05e4, 0x05ea, 0x05fb, 0x0605, 0x0614, 0x061e, 0x062f, 0x0638, + 0x063c, 0x064e, 0x0656, 0x066b, 0x0683, 0x068c, 0x0696, 0x06a0, + 0x06a5, 0x06ae, 0x06b5, 0x06bb, 0x06c0, 0x06c8, 0x06d0, 0x06d7, + 0x06e5, 0x06ea, 0x06f8, 0x06ff, 0x0708, 0x0717, 0x071f, 0x0724, + 0x0729, 0x072d, 0x073b, 0x073f, 0x0745, 0x0749, 0x075c, 0x076d, + 0x0775, 0x077d, 0x0784, 0x079d, 0x07ae, 0x07b9, 0x07d1, 0x07db, + // Entry C0 - FF + 0x07e0, 0x07e8, 0x07ed, 0x0800, 0x0808, 0x0810, 0x0816, 0x081b, + 0x0821, 0x0830, 0x0840, 0x084a, 0x084f, 0x0855, 0x085e, 0x086b, + 0x0873, 0x0889, 0x0891, 0x089d, 0x08a7, 0x08ae, 0x08b5, 0x08bd, + 0x08cb, 0x08e0, 0x08eb, 0x08f7, 0x08fc, 0x0905, 0x0915, 0x092e, + 0x0932, 0x095e, 0x0962, 0x096b, 0x0976, 0x097d, 0x098b, 0x0997, + 0x099e, 0x09a3, 0x09a9, 0x09bc, 0x09c2, 0x09c8, 0x09d0, 0x09d7, + 0x09dd, 0x09fe, 0x0a18, 0x0a1f, 0x0a29, 0x0a45, 0x0a62, 0x0a6b, + 0x0a85, 0x0a9c, 0x0aa3, 0x0aaa, 0x0abb, 0x0ac0, 0x0ac6, 0x0acb, + // Entry 100 - 13F + 0x0ad2, 0x0adf, 0x0ae5, 0x0aed, 0x0b01, 0x0b05, 0x0b0b, 0x0b1a, + 0x0b28, 0x0b2f, 0x0b42, 0x0b53, 0x0b64, 0x0b7a, 0x0b8a, 0x0b9d, + 0x0ba4, 0x0bbb, 0x0bc2, 0x0bd1, 0x0be2, 0x0bf1, 0x0c04, 0x0c0f, + 0x0c18, 0x0c2b, 0x0c34, 0x0c38, 0x0c46, 0x0c57, 0x0c5d, 0x0c6e, + 0x0c84, 0x0c97, 0x0ca6, +} // Size: 606 bytes + +var ruRegionStr string = "" + // Size: 5872 bytes + "о-в ВознесенияАндорраОАЭАфганистанАнтигуа и БарбудаАнгильяАлбанияАрмения" + + "Нидерландские Антильские о-ваАнголаАнтарктидаАргентинаАмериканское Само" + + "аАвстрияАвстралияАрубаАландские о-ваАзербайджанБосния и ГерцеговинаБарб" + + "адосБангладешБельгияБуркина-ФасоБолгарияБахрейнБурундиБенинСен-Бартельм" + + "иБермудские о-ваБруней-ДаруссаламБоливияБонэйр, Синт-Эстатиус и СабаБра" + + "зилияБагамские о-ваБутано-в БувеБотсванаБеларусьБелизКанадаКокосовые о-" + + "ваКонго - КиншасаЦАРКонго - БраззавильШвейцарияКот-д’Ивуаро-ва КукаЧили" + + "КамерунКитайКолумбияо-в КлиппертонКоста-РикаКубаКабо-ВердеКюрасаоо-в Ро" + + "ждестваКипрЧехияГерманияДиего-ГарсияДжибутиДанияДоминикаДоминиканская Р" + + "еспубликаАлжирСеута и МелильяЭквадорЭстонияЕгипетЗападная СахараЭритрея" + + "ИспанияЭфиопияЕвропейский союзФинляндияФиджиФолклендские о-ваФедеративн" + + "ые Штаты МикронезииФарерские о-ваФранцияГабонВеликобританияГренадаГрузи" + + "яФранцузская ГвианаГернсиГанаГибралтарГренландияГамбияГвинеяГваделупаЭк" + + "ваториальная ГвинеяГрецияЮжная Георгия и Южные Сандвичевы о-ваГватемала" + + "ГуамГвинея-БисауГайанаГонконг (специальный административный район)о-ва " + + "Херд и МакдональдГондурасХорватияГаитиВенгрияКанарские о-ваИндонезияИрл" + + "андияИзраильо-в МэнИндияБританская территория в Индийском океанеИракИра" + + "нИсландияИталияДжерсиЯмайкаИорданияЯпонияКенияКиргизияКамбоджаКирибатиК" + + "оморские о-ваСент-Китс и НевисКНДРРеспублика КореяКувейтКаймановы о-ваК" + + "азахстанЛаосЛиванСент-ЛюсияЛихтенштейнШри-ЛанкаЛиберияЛесотоЛитваЛюксем" + + "бургЛатвияЛивияМароккоМонакоМолдоваЧерногорияСен-МартенМадагаскарМаршал" + + "ловы о-ваМакедонияМалиМьянма (Бирма)МонголияМакао (специальный админист" + + "ративный район)Северные Марианские о-ваМартиникаМавританияМонтсерратМал" + + "ьтаМаврикийМальдивыМалавиМексикаМалайзияМозамбикНамибияНовая КаледонияН" + + "игеро-в НорфолкНигерияНикарагуаНидерландыНорвегияНепалНауруНиуэНовая Зе" + + "ландияОманПанамаПеруФранцузская ПолинезияПапуа – Новая ГвинеяФилиппиныП" + + "акистанПольшаСен-Пьер и Микелонострова ПиткэрнПуэрто-РикоПалестинские т" + + "ерриторииПортугалияПалауПарагвайКатарВнешняя ОкеанияРеюньонРумынияСерби" + + "яРоссияРуандаСаудовская АравияСоломоновы о-ваСейшельские о-ваСуданШвеци" + + "яСингапуро-в Св. ЕленыСловенияШпицберген и Ян-МайенСловакияСьерра-Леоне" + + "Сан-МариноСенегалСомалиСуринамЮжный СуданСан-Томе и ПринсипиСальвадорСи" + + "нт-МартенСирияСвазилендТристан-да-Куньяо-ва Тёркс и КайкосЧадФранцузски" + + "е Южные ТерриторииТогоТаиландТаджикистанТокелауВосточный ТиморТуркменис" + + "танТунисТонгаТурцияТринидад и ТобагоТувалуТайваньТанзанияУкраинаУгандаВ" + + "нешние малые о-ва (США)Соединенные ШтатыУругвайУзбекистанВатиканСент-Ви" + + "нсент и ГренадиныВенесуэлаВиргинские о-ва (Британские)Виргинские о-ва (" + + "США)ВьетнамВануатуУоллис и ФутунаСамоаКосовоЙеменМайоттаЮАРЗамбияЗимбаб" + + "веНеизвестный регионМирАфрикаСеверная АмерикаЮжная АмерикаОкеанияЗападн" + + "ая АфрикаЦентральная АмерикаВосточная АфрикаСеверная АфрикаЦентральная " + + "АфрикаЮжная АфрикаАмерикаСеверная Америка – США и КанадаКарибыВосточная" + + " АзияЮжная АзияЮго-Восточная АзияЮжная ЕвропаАвстралазияМеланезияМикроне" + + "зияПолинезияАзияСредняя АзияБлижний и Средний ВостокЕвропаВосточная Евр" + + "опаСеверная ЕвропаЗападная ЕвропаЛатинская Америка" + +var ruRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x001a, 0x0028, 0x002e, 0x0042, 0x0062, 0x0070, 0x007e, + 0x008c, 0x00c3, 0x00cf, 0x00e3, 0x00f5, 0x0118, 0x0126, 0x0138, + 0x0142, 0x015c, 0x0172, 0x0198, 0x01a8, 0x01ba, 0x01c8, 0x01df, + 0x01ef, 0x01fd, 0x020b, 0x0215, 0x022e, 0x024a, 0x026b, 0x0279, + 0x02ac, 0x02bc, 0x02d6, 0x02e0, 0x02ee, 0x02fe, 0x030e, 0x0318, + 0x0324, 0x033e, 0x0359, 0x035f, 0x0380, 0x0392, 0x03a8, 0x03b8, + 0x03c0, 0x03ce, 0x03d8, 0x03e8, 0x0402, 0x0415, 0x041d, 0x0430, + 0x043e, 0x0456, 0x045e, 0x0468, 0x0478, 0x048f, 0x049d, 0x04a7, + // Entry 40 - 7F + 0x04b7, 0x04e6, 0x04f0, 0x050c, 0x051a, 0x0528, 0x0534, 0x0551, + 0x055f, 0x056d, 0x057b, 0x059a, 0x05ac, 0x05b6, 0x05d6, 0x060e, + 0x0628, 0x0636, 0x0640, 0x065c, 0x066a, 0x0676, 0x0699, 0x06a5, + 0x06ad, 0x06bf, 0x06d3, 0x06df, 0x06eb, 0x06fd, 0x0726, 0x0732, + 0x0776, 0x0788, 0x0790, 0x07a7, 0x07b3, 0x0806, 0x082e, 0x083e, + 0x084e, 0x0858, 0x0866, 0x0880, 0x0892, 0x08a2, 0x08b0, 0x08bc, + 0x08c6, 0x0912, 0x091a, 0x0922, 0x0932, 0x093e, 0x094a, 0x0956, + 0x0966, 0x0972, 0x097c, 0x098c, 0x099c, 0x09ac, 0x09c6, 0x09e5, + // Entry 80 - BF + 0x09ed, 0x0a0c, 0x0a18, 0x0a32, 0x0a44, 0x0a4c, 0x0a56, 0x0a69, + 0x0a7f, 0x0a90, 0x0a9e, 0x0aaa, 0x0ab4, 0x0ac8, 0x0ad4, 0x0ade, + 0x0aec, 0x0af8, 0x0b06, 0x0b1a, 0x0b2d, 0x0b41, 0x0b5d, 0x0b6f, + 0x0b77, 0x0b90, 0x0ba0, 0x0bef, 0x0c1c, 0x0c2e, 0x0c42, 0x0c56, + 0x0c62, 0x0c72, 0x0c82, 0x0c8e, 0x0c9c, 0x0cac, 0x0cbc, 0x0cca, + 0x0ce7, 0x0cf1, 0x0d05, 0x0d13, 0x0d25, 0x0d39, 0x0d49, 0x0d53, + 0x0d5d, 0x0d65, 0x0d80, 0x0d88, 0x0d94, 0x0d9c, 0x0dc5, 0x0deb, + 0x0dfd, 0x0e0d, 0x0e19, 0x0e3a, 0x0e57, 0x0e6c, 0x0e99, 0x0ead, + // Entry C0 - FF + 0x0eb7, 0x0ec7, 0x0ed1, 0x0eee, 0x0efc, 0x0f0a, 0x0f16, 0x0f22, + 0x0f2e, 0x0f4f, 0x0f6b, 0x0f89, 0x0f93, 0x0f9f, 0x0faf, 0x0fc5, + 0x0fd5, 0x0ffc, 0x100c, 0x1023, 0x1036, 0x1044, 0x1050, 0x105e, + 0x1073, 0x1096, 0x10a8, 0x10bd, 0x10c7, 0x10d9, 0x10f7, 0x1119, + 0x111f, 0x1155, 0x115d, 0x116b, 0x1181, 0x118f, 0x11ac, 0x11c4, + 0x11ce, 0x11d8, 0x11e4, 0x1204, 0x1210, 0x121e, 0x122e, 0x123c, + 0x1248, 0x1272, 0x1293, 0x12a1, 0x12b5, 0x12c3, 0x12f0, 0x1302, + 0x1335, 0x135a, 0x1368, 0x1376, 0x1392, 0x139c, 0x13a8, 0x13b2, + // Entry 100 - 13F + 0x13c0, 0x13c6, 0x13d2, 0x13e2, 0x1405, 0x140b, 0x1417, 0x1436, + 0x144f, 0x145d, 0x147a, 0x149f, 0x14be, 0x14db, 0x14fe, 0x1515, + 0x1523, 0x155d, 0x1569, 0x1584, 0x1597, 0x15b9, 0x15d0, 0x15e6, + 0x15f8, 0x160c, 0x161e, 0x1626, 0x163d, 0x166a, 0x1676, 0x1695, + 0x16b2, 0x16cf, 0x16f0, +} // Size: 606 bytes + +var siRegionStr string = "" + // Size: 9356 bytes + "ඇසෙන්ෂන් දිවයිනඇන්ඩෝරාවඑක්සත් අරාබි එමිර් රාජ්\u200dයයඇෆ්ගනිස්ථානයඇන්ටිග" + + "ුවා සහ බාබියුඩාවඇන්ගුයිලාවඇල්බේනියාවආර්මේනියාවනෙදර්ලන්ත ඇන්ටිලීසියඇන්ග" + + "ෝලාවඇන්ටාක්ටිකාවආර්ජෙන්ටිනාවඇමරිකානු සැමෝවාවඔස්ට්\u200dරියාවඕස්ට්" + + "\u200dරේලියාවඅරුබාවඕලන්ඩ් දූපත්අසර්බයිජානයබොස්නියාව සහ හර්සගොවීනාවබාර්බඩ" + + "ෝස්බංග්ලාදේශයබෙල්ජියමබර්කිනා ෆාසෝබල්ගේරියාවබහරේන්බුරුන්දිබෙනින්ශාන්ත බ" + + "ර්තලෙමිබර්මියුඩාබෲනායිබොලීවියාවකැරිබියානු නෙදර්ලන්තයබ්\u200dරසීලයබහමාස" + + "්භූතානයබුවට් දුපත්බොට්ස්වානාබෙලරුස්බෙලීස්කැනඩාවකොකෝස් දූපත්කොංගො - කින" + + "්ශාසාමධ්\u200dයම අප්\u200dරිකානු ජනරජයකොංගො - බ්\u200dරසාවිල්ස්විස්ටර්" + + "ලන්තයකෝට් දි අයිවරිකුක් දූපත්චිලීකැමරූන්චීනයකොළොම්බියාවක්ලීපර්ටන් දූපත" + + "කොස්ටරිකාවකියුබාවකේප් වර්ඩ්කුරකාවෝක්\u200dරිස්මස් දූපතසයිප්\u200dරසයචෙ" + + "ක් ජනරජයජර්මනියදියාගෝ ගාර්සියාජිබුටිඩෙන්මාර්කයඩොමිනිකාවඩොමිනිකා ජනරජයඇ" + + "ල්ජීරියාවසෙයුටා සහ මෙලිල්ලාඉක්වදෝරයඑස්තෝනියාවඊජිප්තුවබටහිර සහරාවඑරිත්" + + "\u200dරියාවස්පාඤ්ඤයඉතියෝපියාවයුරෝපා සංගමයෆින්ලන්තයෆීජීෆෝක්ලන්ත දූපත්මයික" + + "්\u200dරොනීසියාවෆැරෝ දූපත්ප්\u200dරංශයගැබොන්එක්සත් රාජධානියග්\u200dරැන" + + "ඩාවජෝර්ජියාවප්\u200dරංශ ගයනාවගර්න්සියඝානාවජිබ්\u200dරෝල්ටාවග්\u200dරීන" + + "්ලන්තයගැම්බියාවගිණියාවග්වෝඩලෝප්සමක ගිනියාවග්\u200dරීසියදකුණු ජෝර්ජියාව" + + " සහ දකුණු සැන්ඩ්විච් දූපත්ගෝතමාලාවගුවාම්ගිනි බිසව්ගයනාවහොංකොං චීන විශේෂ " + + "පරිපාලන කලාපයහර්ඩ් දූපත සහ මැක්ඩොනල්ඩ් දූපත්හොන්ඩුරාස්ක්\u200dරොඒෂියාව" + + "හයිටිහන්ගේරියාවකැනරි සූපත්ඉන්දුනීසියාවඅයර්ලන්තයඊශ්\u200dරායලයඅයිල් ඔෆ්" + + " මෑන්ඉන්දියාවබ්\u200dරිතාන්\u200dය ඉන්දීය සාගර බල ප්\u200dරදේශයඉරාකයඉරාන" + + "යඅයිස්ලන්තයඉතාලියජර්සිජැමෙයිකාවජෝර්දානයජපානයකෙන්යාවකිර්ගිස්තානයකාම්බෝජ" + + "යකිරිබතිකොමොරෝස්ශාන්ත කිට්ස් සහ නේවිස්උතුරු කොරියාවදකුණු කොරියාවකුවේටය" + + "කේමන් දූපත්කසකස්තානයලාඕසයලෙබනනයශාන්ත ලුසියාලික්ටන්ස්ටයින්ශ්\u200dරී ලං" + + "කාවලයිබීරියාවලෙසතෝලිතුවේනියාවලක්ශම්බර්ග්ලැට්වියාවලිබියාවමොරොක්කෝවමොනැක" + + "ෝවමොල්ඩෝවාවමොන්ටෙනීග්\u200dරෝශාන්ත මාර්ටින්මැඩගස්කරයමාෂල් දූපත්මැසිඩෝන" + + "ියාවමාලිමියන්මාරය (බුරුමය)මොන්ගෝලියාවමකාවු චීන විශේෂ පරිපාලන කලාපයඋතුර" + + "ු මරියානා දූපත්මර්ටිනික්මොරිටේනියාවමොන්සෙරාට්මෝල්ටාවමුරුසියමාල දිවයිනම" + + "ලාවිමෙක්සිකෝවමැලේසියාවමොසැම්බික්නැමීබියාවනව කැලිඩෝනියාවනයිජර්නෝෆෝක් දූ" + + "පතනයිජීරියාවනිකරගුවාවනෙදර්ලන්තයනෝර්වේනේපාලයනාවුරුනියූනවසීලන්තයඕමානයපැන" + + "මාවපේරුප්\u200dරංශ පොලිනීසියාවපැපුවා නිව් ගිනියාවපිලිපීනයපාකිස්තානයපෝල" + + "න්තයශාන්ත පියරේ සහ මැකෝලන්පිට්කෙය්න් දූපත්පුවර්ටෝ රිකෝපලස්තීන රාජ්" + + "\u200dයයපෘතුගාලයපලාවුපැරගුවේකටාර්ඈත ඕෂනියාවරීයුනියන්රුමේනියාවසර්බියාවරුස" + + "ියාවරුවන්ඩාවසෞදි අරාබියසොලමන් දූපත්සීශෙල්ස්සූඩානයස්වීඩනයසිංගප්පූරුවශාන" + + "්ත හෙලේනාස්ලෝවේනියාවස්වෙල්බර්ඩ් සහ ජේන් මයේන්ස්ලෝවැකියාවසියරාලියෝන්සැන" + + "් මැරිනෝසෙනගාලයසෝමාලියාවසුරිනාමයදකුණු සුඩානයසාඕ තෝම් සහ ප්\u200dරින්සි" + + "ප්එල් සැල්වදෝරයශාන්ත මාර්ටෙන්සිරියාවස්වාසිලන්තයට්\u200dරිස්ටන් ද කුන්හ" + + "ාටර්ක්ස් සහ කයිකොස් දූපත්චැච්දකුණු ප්\u200dරංශ දූපත් සමූහයටොගෝතායිලන්ත" + + "යටජිකිස්තානයටොකලාවුටිමෝර් - ලෙස්ත්ටර්ක්මෙනිස්ථානයටියුනීසියාවටොංගාතුර්ක" + + "ියට්\u200dරිනිඩෑඩ් සහ ටොබැගෝටුවාලූතායිවානයටැන්සානියාවයුක්රේනයඋගන්ඩාවඑක" + + "්සත් ජනපද ඈත දූපත්එක්සත් ජනපදයඋරුගුවේඋස්බෙකිස්ථානයවතිකානු නගරයශාන්ත වි" + + "න්සන්ට් සහ ග්\u200dරෙනඩින්ස්වෙනිසියුලාවබ්\u200dරිතාන්\u200dය වර්ජින් ද" + + "ූපත්ඇමරිකානු වර්ජින් දූපත්වියට්නාමයවනුවාටුවැලිස් සහ ෆුටුනාසැමෝවාකොසෝවෝ" + + "යේමනයමයෝට්දකුණු අප්\u200dරිකාවසැම්බියාවසිම්බාබ්වේහඳුනා නොගත් කළාපයලෝකය" + + "අප්\u200dරිකාවඋතුරු ඇමෙරිකාවදකුණු ඇමෙරිකාවඕෂනියාවබටහිරදිග අප්\u200dරික" + + "ාවමධ්\u200dයම ඇමෙරිකාවපෙරදිග අප්\u200dරිකාවඋතුරුදිග අප්\u200dරිකාවමධ්" + + "\u200dයම අප්\u200dරිකාවදකුණුදිග අප්\u200dරිකාවඇමරිකාවඋතුරුදිග ඇමෙරිකාවකැ" + + "රීබියන්නැගෙනහිර ආසියාවදකුණු ආසියාවඅග්නිදිග ආසියාවදකුණුදිග යුරෝපයඕස්ට්" + + "\u200dරලේෂියාවමෙලනීසියාවමයික්\u200dරෝනීසියානු කළාපයපොලිනීසියාවආසියාවමධ්" + + "\u200dයම ආසියාවබටහිර ආසියාවයුරෝපයනැගෙනහිර යුරෝපයඋතුරු යුරෝපයබටහිර යුරෝපය" + + "ලතින් ඇමෙරිකාව" + +var siRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x002b, 0x0043, 0x008b, 0x00af, 0x00ed, 0x010b, 0x0129, + 0x0147, 0x0181, 0x0199, 0x01bd, 0x01e1, 0x020f, 0x0230, 0x0257, + 0x0269, 0x028b, 0x02ac, 0x02f0, 0x030b, 0x0329, 0x0341, 0x0363, + 0x0381, 0x0393, 0x03ab, 0x03bd, 0x03e5, 0x0400, 0x0412, 0x042d, + 0x046a, 0x0482, 0x0494, 0x04a6, 0x04c5, 0x04e3, 0x04f8, 0x050a, + 0x051c, 0x053e, 0x0568, 0x05a9, 0x05d9, 0x0603, 0x0629, 0x0645, + 0x0651, 0x0666, 0x0672, 0x0693, 0x06be, 0x06dc, 0x06f1, 0x070d, + 0x0722, 0x074d, 0x0768, 0x0784, 0x0799, 0x07c4, 0x07d6, 0x07f4, + // Entry 40 - 7F + 0x080f, 0x0837, 0x0855, 0x0887, 0x089f, 0x08bd, 0x08d5, 0x08f4, + 0x0915, 0x092d, 0x094b, 0x096d, 0x0988, 0x0994, 0x09bc, 0x09e9, + 0x0a05, 0x0a1a, 0x0a2c, 0x0a57, 0x0a72, 0x0a8d, 0x0aaf, 0x0ac7, + 0x0ad6, 0x0afa, 0x0b1e, 0x0b39, 0x0b4e, 0x0b69, 0x0b88, 0x0ba0, + 0x0c11, 0x0c29, 0x0c3b, 0x0c57, 0x0c66, 0x0cb8, 0x0d0d, 0x0d2b, + 0x0d4c, 0x0d5b, 0x0d79, 0x0d98, 0x0dbc, 0x0dd7, 0x0df2, 0x0e18, + 0x0e30, 0x0e91, 0x0ea0, 0x0eaf, 0x0ecd, 0x0edf, 0x0eee, 0x0f09, + 0x0f21, 0x0f30, 0x0f45, 0x0f69, 0x0f81, 0x0f96, 0x0fae, 0x0fea, + // Entry 80 - BF + 0x100f, 0x1034, 0x1046, 0x1065, 0x1080, 0x108f, 0x10a1, 0x10c3, + 0x10ed, 0x110c, 0x112a, 0x1139, 0x115a, 0x117b, 0x1196, 0x11ab, + 0x11c6, 0x11db, 0x11f6, 0x121d, 0x1245, 0x1260, 0x127f, 0x12a0, + 0x12ac, 0x12dc, 0x12fd, 0x134c, 0x1381, 0x139c, 0x13bd, 0x13db, + 0x13f0, 0x1405, 0x1421, 0x1430, 0x144b, 0x1466, 0x1484, 0x149f, + 0x14c7, 0x14d9, 0x14f8, 0x1516, 0x1531, 0x154f, 0x1561, 0x1573, + 0x1585, 0x1591, 0x15ac, 0x15bb, 0x15cd, 0x15d9, 0x160d, 0x1642, + 0x165a, 0x1678, 0x168d, 0x16c9, 0x16f7, 0x1719, 0x1744, 0x175c, + // Entry C0 - FF + 0x176b, 0x1780, 0x178f, 0x17ab, 0x17c6, 0x17e1, 0x17f9, 0x180e, + 0x1826, 0x1845, 0x1867, 0x187f, 0x1891, 0x18a6, 0x18c7, 0x18e9, + 0x190a, 0x194f, 0x1970, 0x1991, 0x19b0, 0x19c5, 0x19e0, 0x19f8, + 0x1a1a, 0x1a59, 0x1a7e, 0x1aa6, 0x1abb, 0x1adc, 0x1b11, 0x1b53, + 0x1b5f, 0x1ba1, 0x1bad, 0x1bc8, 0x1be9, 0x1bfe, 0x1c25, 0x1c52, + 0x1c73, 0x1c82, 0x1c97, 0x1cd2, 0x1ce4, 0x1cfc, 0x1d1d, 0x1d35, + 0x1d4a, 0x1d80, 0x1da2, 0x1db7, 0x1dde, 0x1e00, 0x1e57, 0x1e78, + 0x1ebf, 0x1efd, 0x1f18, 0x1f2d, 0x1f59, 0x1f6b, 0x1f7d, 0x1f8c, + // Entry 100 - 13F + 0x1f9b, 0x1fc6, 0x1fe1, 0x1fff, 0x202e, 0x203a, 0x2055, 0x207d, + 0x20a5, 0x20ba, 0x20ee, 0x2119, 0x2147, 0x217b, 0x21a9, 0x21dd, + 0x21f2, 0x2223, 0x223e, 0x2269, 0x228b, 0x22b6, 0x22e1, 0x230b, + 0x2329, 0x2369, 0x238a, 0x239c, 0x23c1, 0x23e3, 0x23f5, 0x2420, + 0x2442, 0x2464, 0x248c, +} // Size: 606 bytes + +var skRegionStr string = "" + // Size: 3211 bytes + "AscensiónAndorraSpojené arabské emirátyAfganistanAntigua a BarbudaAnguil" + + "laAlbánskoArménskoHolandské AntilyAngolaAntarktídaArgentínaAmerická Samo" + + "aRakúskoAustráliaArubaÅlandyAzerbajdžanBosna a HercegovinaBarbadosBangla" + + "déšBelgickoBurkina FasoBulharskoBahrajnBurundiBeninSvätý BartolomejBermu" + + "dyBrunejBolíviaKaribské HolandskoBrazíliaBahamyBhutánBouvetov ostrovBots" + + "wanaBieloruskoBelizeKanadaKokosové ostrovyKongo - KinshasaStredoafrická " + + "republikaKongo - BrazzavilleŠvajčiarskoPobrežie SlonovinyCookove ostrovy" + + "ČileKamerunČínaKolumbiaClippertonKostarikaKubaKapverdyCuraçaoVianočný o" + + "strovCyprusČeská republikaNemeckoDiego GarcíaDžibutskoDánskoDominikaDomi" + + "nikánska republikaAlžírskoCeuta a MelillaEkvádorEstónskoEgyptZápadná Sah" + + "araEritreaŠpanielskoEtiópiaEurópska úniaFínskoFidžiFalklandyMikronéziaFa" + + "erské ostrovyFrancúzskoGabonSpojené kráľovstvoGrenadaGruzínskoFrancúzska" + + " GuayanaGuernseyGhanaGibraltárGrónskoGambiaGuineaGuadeloupeRovníková Gui" + + "neaGréckoJužná Georgia a Južné Sandwichove ostrovyGuatemalaGuamGuinea-Bi" + + "ssauGuayanaHongkong – OAO ČínyHeardov ostrov a McDonaldove ostrovyHondur" + + "asChorvátskoHaitiMaďarskoKanárske ostrovyIndonéziaÍrskoIzraelOstrov ManI" + + "ndiaBritské indickooceánske územieIrakIránIslandTalianskoJerseyJamajkaJo" + + "rdánskoJaponskoKeňaKirgizskoKambodžaKiribatiKomorySvätý Krištof a NevisS" + + "everná KóreaJužná KóreaKuvajtKajmanie ostrovyKazachstanLaosLibanonSvätá " + + "LuciaLichtenštajnskoSrí LankaLibériaLesothoLitvaLuxemburskoLotyšskoLíbya" + + "MarokoMonakoMoldavskoČierna HoraSvätý MartinMadagaskarMarshallove ostrov" + + "yMacedónskoMaliMjanmarskoMongolskoMacao – OAO ČínySeverné MariányMartini" + + "kMauritániaMontserratMaltaMauríciusMaldivyMalawiMexikoMalajziaMozambikNa" + + "míbiaNová KaledóniaNigerNorfolkNigériaNikaraguaHolandskoNórskoNepálNauru" + + "NiueNový ZélandOmánPanamaPeruFrancúzska PolynéziaPapua Nová GuineaFilipí" + + "nyPakistanPoľskoSaint Pierre a MiquelonPitcairnove ostrovyPortorikoPales" + + "tínske územiaPortugalskoPalauParaguajKatarostatné TichomorieRéunionRumun" + + "skoSrbskoRuskoRwandaSaudská ArábiaŠalamúnove ostrovySeychelySudánŠvédsko" + + "SingapurSvätá HelenaSlovinskoSvalbard a Jan MayenSlovenskoSierra LeoneSa" + + "n MarínoSenegalSomálskoSurinamJužný SudánSvätý Tomáš a Princov ostrovSal" + + "vádorSint MaartenSýriaSvazijskoTristan da CunhaTurks a CaicosČadFrancúzs" + + "ke južné a antarktické územiaTogoThajskoTadžikistanTokelauVýchodný Timor" + + "TurkménskoTuniskoTongaTureckoTrinidad a TobagoTuvaluTaiwanTanzániaUkraji" + + "naUgandaMenšie odľahlé ostrovy USASpojené štátyUruguajUzbekistanVatikánS" + + "vätý Vincent a GrenadínyVenezuelaBritské Panenské ostrovyAmerické Panens" + + "ké ostrovyVietnamVanuatuWallis a FutunaSamoaKosovoJemenMayotteJužná Afri" + + "kaZambiaZimbabweneznámy regiónsvetAfrikaSeverná AmerikaJužná AmerikaOceá" + + "niazápadná AfrikaStredná Amerikavýchodná Afrikaseverná Afrikastredná Afr" + + "ikajužné územia AfrikyAmerikaseverné územia AmerikyKaribikvýchodná Áziaj" + + "užná Áziajuhovýchodná Áziajužná EurópaAustraláziaMelanéziaoblasť Mikroné" + + "ziePolynéziaÁziastredná Áziazápadná ÁziaEurópavýchodná Európaseverná Eur" + + "ópazápadná EurópaLatinská Amerika" + +var skRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x000a, 0x0011, 0x002b, 0x0035, 0x0046, 0x004e, 0x0057, + 0x0060, 0x0071, 0x0077, 0x0082, 0x008c, 0x009b, 0x00a3, 0x00ad, + 0x00b2, 0x00b9, 0x00c5, 0x00d8, 0x00e0, 0x00eb, 0x00f3, 0x00ff, + 0x0108, 0x010f, 0x0116, 0x011b, 0x012d, 0x0134, 0x013a, 0x0142, + 0x0155, 0x015e, 0x0164, 0x016b, 0x017a, 0x0182, 0x018c, 0x0192, + 0x0198, 0x01a9, 0x01b9, 0x01d1, 0x01e4, 0x01f1, 0x0204, 0x0213, + 0x0218, 0x021f, 0x0225, 0x022d, 0x0237, 0x0240, 0x0244, 0x024c, + 0x0254, 0x0265, 0x026b, 0x027c, 0x0283, 0x0290, 0x029a, 0x02a1, + // Entry 40 - 7F + 0x02a9, 0x02c0, 0x02ca, 0x02d9, 0x02e1, 0x02ea, 0x02ef, 0x02ff, + 0x0306, 0x0311, 0x0319, 0x0328, 0x032f, 0x0335, 0x033e, 0x0349, + 0x0359, 0x0364, 0x0369, 0x037e, 0x0385, 0x038f, 0x03a2, 0x03aa, + 0x03af, 0x03b9, 0x03c1, 0x03c7, 0x03cd, 0x03d7, 0x03e9, 0x03f0, + 0x041d, 0x0426, 0x042a, 0x0437, 0x043e, 0x0455, 0x0479, 0x0481, + 0x048c, 0x0491, 0x049a, 0x04ab, 0x04b5, 0x04bb, 0x04c1, 0x04cb, + 0x04d0, 0x04f1, 0x04f5, 0x04fa, 0x0500, 0x0509, 0x050f, 0x0516, + 0x0520, 0x0528, 0x052d, 0x0536, 0x053f, 0x0547, 0x054d, 0x0565, + // Entry 80 - BF + 0x0574, 0x0582, 0x0588, 0x0598, 0x05a2, 0x05a6, 0x05ad, 0x05ba, + 0x05ca, 0x05d4, 0x05dc, 0x05e3, 0x05e8, 0x05f3, 0x05fc, 0x0602, + 0x0608, 0x060e, 0x0617, 0x0623, 0x0631, 0x063b, 0x064e, 0x0659, + 0x065d, 0x0667, 0x0670, 0x0684, 0x0695, 0x069d, 0x06a8, 0x06b2, + 0x06b7, 0x06c1, 0x06c8, 0x06ce, 0x06d4, 0x06dc, 0x06e4, 0x06ec, + 0x06fc, 0x0701, 0x0708, 0x0710, 0x0719, 0x0722, 0x0729, 0x072f, + 0x0734, 0x0738, 0x0745, 0x074a, 0x0750, 0x0754, 0x076a, 0x077c, + 0x0785, 0x078d, 0x0794, 0x07ab, 0x07be, 0x07c7, 0x07db, 0x07e6, + // Entry C0 - FF + 0x07eb, 0x07f3, 0x07f8, 0x080b, 0x0813, 0x081b, 0x0821, 0x0826, + 0x082c, 0x083c, 0x0850, 0x0858, 0x085e, 0x0867, 0x086f, 0x087d, + 0x0886, 0x089a, 0x08a3, 0x08af, 0x08ba, 0x08c1, 0x08ca, 0x08d1, + 0x08df, 0x08ff, 0x0908, 0x0914, 0x091a, 0x0923, 0x0933, 0x0941, + 0x0945, 0x096f, 0x0973, 0x097a, 0x0986, 0x098d, 0x099d, 0x09a8, + 0x09af, 0x09b4, 0x09bb, 0x09cc, 0x09d2, 0x09d8, 0x09e1, 0x09e9, + 0x09ef, 0x0a0c, 0x0a1c, 0x0a23, 0x0a2d, 0x0a35, 0x0a51, 0x0a5a, + 0x0a74, 0x0a8f, 0x0a96, 0x0a9d, 0x0aac, 0x0ab1, 0x0ab7, 0x0abc, + // Entry 100 - 13F + 0x0ac3, 0x0ad1, 0x0ad7, 0x0adf, 0x0aef, 0x0af3, 0x0af9, 0x0b09, + 0x0b18, 0x0b20, 0x0b30, 0x0b40, 0x0b51, 0x0b60, 0x0b6f, 0x0b85, + 0x0b8c, 0x0ba4, 0x0bab, 0x0bbb, 0x0bc8, 0x0bdc, 0x0beb, 0x0bf7, + 0x0c01, 0x0c14, 0x0c1e, 0x0c23, 0x0c31, 0x0c40, 0x0c47, 0x0c59, + 0x0c69, 0x0c7a, 0x0c8b, +} // Size: 606 bytes + +var slRegionStr string = "" + // Size: 3205 bytes + "Otok AscensionAndoraZdruženi arabski emiratiAfganistanAntigva in Barbuda" + + "AngvilaAlbanijaArmenijaNizozemski AntiliAngolaAntarktikaArgentinaAmerišk" + + "a SamoaAvstrijaAvstralijaArubaÅlandski otokiAzerbajdžanBosna in Hercegov" + + "inaBarbadosBangladešBelgijaBurkina FasoBolgarijaBahrajnBurundiBeninSaint" + + " BarthélemyBermudiBrunejBolivijaNizozemski KaribiBrazilijaBahamiButanBou" + + "vetov otokBocvanaBelorusijaBelizeKanadaKokosovi otokiDemokratična republ" + + "ika KongoCentralnoafriška republikaKongo - BrazzavilleŠvicaSlonokoščena " + + "obalaCookovi otokiČileKamerunKitajskaKolumbijaOtok ClippertonKostarikaKu" + + "baZelenortski otokiCuraçaoBožični otokCiperČeškaNemčijaDiego GarciaDžibu" + + "tiDanskaDominikaDominikanska republikaAlžirijaCeuta in MelillaEkvadorEst" + + "onijaEgiptZahodna SaharaEritrejaŠpanijaEtiopijaEvropska unijaFinskaFidži" + + "Falklandski otokiMikronezijaFerski otokiFrancijaGabonZdruženo kraljestvo" + + "GrenadaGruzijaFrancoska GvajanaGuernseyGanaGibraltarGrenlandijaGambijaGv" + + "inejaGvadalupeEkvatorialna GvinejaGrčijaJužna Georgia in Južni Sandwiche" + + "vi otokiGvatemalaGuamGvineja BissauGvajanaPosebno administrativno območj" + + "e LR Kitajske Hong KongHeardov otok in McDonaldovi otokiHondurasHrvaškaH" + + "aitiMadžarskaKanarski otokiIndonezijaIrskaIzraelOtok ManIndijaBritansko " + + "ozemlje v Indijskem oceanuIrakIranIslandijaItalijaJerseyJamajkaJordanija" + + "JaponskaKenijaKirgizistanKambodžaKiribatiKomoriSaint Kitts in NevisSever" + + "na KorejaJužna KorejaKuvajtKajmanski otokiKazahstanLaosLibanonSaint Luci" + + "aLihtenštajnŠrilankaLiberijaLesotoLitvaLuksemburgLatvijaLibijaMarokoMona" + + "koMoldavijaČrna goraSaint MartinMadagaskarMarshallovi otokiMakedonijaMal" + + "iMjanmar (Burma)MongolijaPosebno administrativno območje LR Kitajske Mac" + + "aoSeverni Marianski otokiMartinikMavretanijaMontserratMaltaMauritiusMald" + + "iviMalaviMehikaMalezijaMozambikNamibijaNova KaledonijaNigerNorfolški oto" + + "kNigerijaNikaragvaNizozemskaNorveškaNepalNauruNiueNova ZelandijaOmanPana" + + "maPeruFrancoska PolinezijaPapua Nova GvinejaFilipiniPakistanPoljskaSaint" + + " Pierre in MiquelonPitcairnPortorikoPalestinsko ozemljePortugalskaPalauP" + + "aragvajKatarOstala oceanijaReunionRomunijaSrbijaRusijaRuandaSaudova Arab" + + "ijaSalomonovi otokiSejšeliSudanŠvedskaSingapurSveta HelenaSlovenijaSvalb" + + "ard in Jan MayenSlovaškaSierra LeoneSan MarinoSenegalSomalijaSurinamJužn" + + "i SudanSao Tome in PrincipeSalvadorSint MaartenSirijaSvaziTristan da Cun" + + "haOtočji Turks in CaicosČadFrancosko južno ozemljeTogoTajskaTadžikistanT" + + "okelauVzhodni TimorTurkmenistanTunizijaTongaTurčijaTrinidad in TobagoTuv" + + "aluTajvanTanzanijaUkrajinaUgandaDruga ameriška ozemlja v Tihem oceanuZdr" + + "užene države AmerikeUrugvajUzbekistanVatikanSaint Vincent in GrenadineVe" + + "nezuelaBritanski Deviški otokiAmeriški Deviški otokiVietnamVanuatuWallis" + + " in FutunaSamoaKosovoJemenMayotteJužnoafriška republikaZambijaZimbabveNe" + + "znano ali neveljavno območjeSvetAfrikaSeverna AmerikaJužna AmerikaOceani" + + "jaZahodna AfrikaSrednja AmerikaVzhodna AfrikaSeverna AfrikaSrednja Afrik" + + "aJužna AfrikaAmerikesevernoameriška celinaKaribiVzhodna AzijaJužna Azija" + + "Jugovzhodna AzijaJužna EvropaAvstralija in Nova ZelandijaMelanezijamikro" + + "nezijska regijaPolinezijaAzijaOsrednja AzijaZahodna AzijaEvropaVzhodna E" + + "vropaSeverna EvropaZahodna EvropaLatinska Amerika" + +var slRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x000e, 0x0014, 0x002d, 0x0037, 0x0049, 0x0050, 0x0058, + 0x0060, 0x0071, 0x0077, 0x0081, 0x008a, 0x0099, 0x00a1, 0x00ab, + 0x00b0, 0x00bf, 0x00cb, 0x00df, 0x00e7, 0x00f1, 0x00f8, 0x0104, + 0x010d, 0x0114, 0x011b, 0x0120, 0x0131, 0x0138, 0x013e, 0x0146, + 0x0157, 0x0160, 0x0166, 0x016b, 0x0178, 0x017f, 0x0189, 0x018f, + 0x0195, 0x01a3, 0x01c0, 0x01db, 0x01ee, 0x01f4, 0x0208, 0x0215, + 0x021a, 0x0221, 0x0229, 0x0232, 0x0241, 0x024a, 0x024e, 0x025f, + 0x0267, 0x0275, 0x027a, 0x0281, 0x0289, 0x0295, 0x029d, 0x02a3, + // Entry 40 - 7F + 0x02ab, 0x02c1, 0x02ca, 0x02da, 0x02e1, 0x02e9, 0x02ee, 0x02fc, + 0x0304, 0x030c, 0x0314, 0x0322, 0x0328, 0x032e, 0x033f, 0x034a, + 0x0356, 0x035e, 0x0363, 0x0377, 0x037e, 0x0385, 0x0396, 0x039e, + 0x03a2, 0x03ab, 0x03b6, 0x03bd, 0x03c4, 0x03cd, 0x03e1, 0x03e8, + 0x0412, 0x041b, 0x041f, 0x042d, 0x0434, 0x046a, 0x048b, 0x0493, + 0x049b, 0x04a0, 0x04aa, 0x04b8, 0x04c2, 0x04c7, 0x04cd, 0x04d5, + 0x04db, 0x04ff, 0x0503, 0x0507, 0x0510, 0x0517, 0x051d, 0x0524, + 0x052d, 0x0535, 0x053b, 0x0546, 0x054f, 0x0557, 0x055d, 0x0571, + // Entry 80 - BF + 0x057f, 0x058c, 0x0592, 0x05a1, 0x05aa, 0x05ae, 0x05b5, 0x05c0, + 0x05cc, 0x05d5, 0x05dd, 0x05e3, 0x05e8, 0x05f2, 0x05f9, 0x05ff, + 0x0605, 0x060b, 0x0614, 0x061e, 0x062a, 0x0634, 0x0645, 0x064f, + 0x0653, 0x0662, 0x066b, 0x069d, 0x06b4, 0x06bc, 0x06c7, 0x06d1, + 0x06d6, 0x06df, 0x06e6, 0x06ec, 0x06f2, 0x06fa, 0x0702, 0x070a, + 0x0719, 0x071e, 0x072d, 0x0735, 0x073e, 0x0748, 0x0751, 0x0756, + 0x075b, 0x075f, 0x076d, 0x0771, 0x0777, 0x077b, 0x078f, 0x07a1, + 0x07a9, 0x07b1, 0x07b8, 0x07d0, 0x07d8, 0x07e1, 0x07f4, 0x07ff, + // Entry C0 - FF + 0x0804, 0x080c, 0x0811, 0x0820, 0x0827, 0x082f, 0x0835, 0x083b, + 0x0841, 0x0850, 0x0860, 0x0868, 0x086d, 0x0875, 0x087d, 0x0889, + 0x0892, 0x08a7, 0x08b0, 0x08bc, 0x08c6, 0x08cd, 0x08d5, 0x08dc, + 0x08e8, 0x08fc, 0x0904, 0x0910, 0x0916, 0x091b, 0x092b, 0x0942, + 0x0946, 0x095e, 0x0962, 0x0968, 0x0974, 0x097b, 0x0988, 0x0994, + 0x099c, 0x09a1, 0x09a9, 0x09bb, 0x09c1, 0x09c7, 0x09d0, 0x09d8, + 0x09de, 0x0a04, 0x0a1d, 0x0a24, 0x0a2e, 0x0a35, 0x0a4f, 0x0a58, + 0x0a70, 0x0a88, 0x0a8f, 0x0a96, 0x0aa6, 0x0aab, 0x0ab1, 0x0ab6, + // Entry 100 - 13F + 0x0abd, 0x0ad5, 0x0adc, 0x0ae4, 0x0b03, 0x0b07, 0x0b0d, 0x0b1c, + 0x0b2a, 0x0b32, 0x0b40, 0x0b4f, 0x0b5d, 0x0b6b, 0x0b79, 0x0b86, + 0x0b8d, 0x0ba4, 0x0baa, 0x0bb7, 0x0bc3, 0x0bd4, 0x0be1, 0x0bfd, + 0x0c07, 0x0c1b, 0x0c25, 0x0c2a, 0x0c38, 0x0c45, 0x0c4b, 0x0c59, + 0x0c67, 0x0c75, 0x0c85, +} // Size: 606 bytes + +var sqRegionStr string = "" + // Size: 3130 bytes + "Ishulli AsenshionAndorrëEmiratet e Bashkuara ArabeAfganistanAntigua e Ba" + + "rbudaAnguilëShqipëriArmeniAngolëAntarktikëArgjentinëSamoa AmerikaneAustr" + + "iAustraliArubëIshujt AlandëAzerbajxhanBosnjë-HercegovinëBarbadosBanglade" + + "shBelgjikëBurkina-FasoBullgariBahreinBurundBeninShën-BartolemeoBermudëBr" + + "unejBoliviKaraibet holandezeBrazilBahamasButanIshujt Bove’BotsuanëBjello" + + "rusiBelizëKanadaIshujt KokosëKongo-KinshasaRepublika Afrikano-QendroreKo" + + "ngo-BrazavilëZvicërBregu i FildishtëIshujt KukëKiliKamerunKinëKolumbiIsh" + + "ulli KlipërtonKosta-RikëKubëKepi i GjelbërKuraçaoIshulli i Krishtlindjes" + + "QiproRepublika ÇekeGjermaniDiego-GarsiaXhibutDanimarkëDominikëRepublika " + + "DominikaneAlgjeriTheuta e MelilaEkuadorEstoniEgjiptSaharaja PerëndimoreE" + + "ritreSpanjëEtiopiBashkimi EuropianFinlandëFixhiIshujt FolklandëMikronezi" + + "Ishujt FaroeFrancëGabonMbretëria e BashkuarGrenadëGjeorgjiGuajana France" + + "zeGuernsejGanëGjibraltarGrenlandëGambiGuineGuadalupeGuineja EkuatorialeG" + + "reqiXhorxha Jugore dhe Ishujt Senduiçë të JugutGuatemalëGuamGuine-BisauG" + + "uajanëRVAK i Hong KongutIshulli Hërd dhe Ishujt MekdonaldëHondurasKroaci" + + "HaitiHungariIshujt KanarieIndoneziIrlandëIzraelIshulli i ManitIndiTerrit" + + "ori Britanik i Oqeanit IndianIrakIranIslandëItaliXhersejXhamajkëJordaniJ" + + "aponiKeniaKirgistanKamboxhiaQiribatiKomoreShën-Kits dhe NevisKoreja e Ve" + + "riutKoreja e JugutKuvajtIshujt KajmanëKazakistanLaosLibanShën-LuçiaLihtë" + + "nshtajnSri-LankëLiberiLesotoLituaniLuksemburgLetoniLibiMarokMonakoMoldav" + + "iMali i ZiShën-MartinMadagaskarIshujt MarshallëMaqedoniMaliMianmar (Burm" + + "a)MongoliRVAK i MakaosIshujt e Marianës VerioreMartinikMauritaniMontsera" + + "tMaltëMauritiusMaldiveMalaviMeksikëMalajziMozambikNamibiKaledonia e ReNi" + + "gerIshulli NorfolkNigeriNikaraguaHolandëNorvegjiNepalNauruNiueZelanda e " + + "ReOmanPanamaPeruPolinezia FrancezePapua Guineja e ReFilipinePakistanPolo" + + "niShën-Peir dhe MikuelonIshujt PitkernëPorto-RikoTerritoret PalestinezeP" + + "ortugaliPalauParaguaiKatarOqeania e Largët (Lindja e Largët)ReunionRuman" + + "iSerbiRusiRuandëArabia SauditeIshujt SolomonëSishelSudanSuediSingaporShë" + + "n-HelenaSlloveniSvalbard e Zhan-MajenSllovakiSiera-LeoneSan-MarinoSenega" + + "liSomaliSurinamiSudani i JugutSao-Tome e PrinsipeEl SalvadorShën-Martin " + + "(Sint Maarten - pjesa e Mbretërisë së Holandës)SiriSuazilandëTristan-da-" + + "KunaIshujt Turke dhe KaikeÇadTerritoret Australiane FrancezeTogoTajlandë" + + "TaxhikistanTokelauTimori LindorTurkmenistanTuniziTongaTurqiTrinidad e To" + + "bagoTuvaluTajvanTanzaniUkrainëUgandëIshujt periferikë të SHBA-sëShtetet " + + "e Bashkuara të AmerikësUruguaiUzbekistanVatikanShën-Vinsent dhe Grenadin" + + "etVenezuelëIshujt e Virgjër BritanikëIshujt e Virgjër AmerikanëVietnamVa" + + "nuatuUollis e FutinaSamoaKosovëJemenMajotëAfrika e JugutZambiZimbabveI p" + + "anjohurBotaAfrikëAmerika e VeriutAmerika e JugutOqeaniAfrika Perëndimore" + + "Amerika QendroreAfrika LindoreAfrika VerioreAfrika e MesmeAfrika JugoreA" + + "merikëAmerika VerioreKaraibeAzia LindoreAzia JugoreAzia JuglindoreEuropa" + + " JugoreAustralaziaMelaneziaRajoni MikronezianPolineziaAziAzia QendroreAz" + + "ia PerëndimoreEuropëEuropa LindoreEuropa VerioreEuropa PerëndimoreAmerik" + + "a Latine" + +var sqRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0011, 0x0019, 0x0033, 0x003d, 0x004e, 0x0056, 0x005f, + 0x0065, 0x0065, 0x006c, 0x0077, 0x0082, 0x0091, 0x0097, 0x009f, + 0x00a5, 0x00b3, 0x00be, 0x00d2, 0x00da, 0x00e4, 0x00ed, 0x00f9, + 0x0101, 0x0108, 0x010e, 0x0113, 0x0123, 0x012b, 0x0131, 0x0137, + 0x0149, 0x014f, 0x0156, 0x015b, 0x0169, 0x0172, 0x017c, 0x0183, + 0x0189, 0x0197, 0x01a5, 0x01c0, 0x01d0, 0x01d7, 0x01e9, 0x01f5, + 0x01f9, 0x0200, 0x0205, 0x020c, 0x021e, 0x0229, 0x022e, 0x023d, + 0x0245, 0x025c, 0x0261, 0x0270, 0x0278, 0x0284, 0x028a, 0x0294, + // Entry 40 - 7F + 0x029d, 0x02b1, 0x02b8, 0x02c7, 0x02ce, 0x02d4, 0x02da, 0x02ef, + 0x02f5, 0x02fc, 0x0302, 0x0313, 0x031c, 0x0321, 0x0332, 0x033b, + 0x0347, 0x034e, 0x0353, 0x0368, 0x0370, 0x0378, 0x0388, 0x0390, + 0x0395, 0x039f, 0x03a9, 0x03ae, 0x03b3, 0x03bc, 0x03cf, 0x03d4, + 0x0402, 0x040c, 0x0410, 0x041b, 0x0423, 0x0435, 0x0459, 0x0461, + 0x0467, 0x046c, 0x0473, 0x0481, 0x0489, 0x0491, 0x0497, 0x04a6, + 0x04aa, 0x04cd, 0x04d1, 0x04d5, 0x04dd, 0x04e2, 0x04e9, 0x04f2, + 0x04f9, 0x04ff, 0x0504, 0x050d, 0x0516, 0x051e, 0x0524, 0x0538, + // Entry 80 - BF + 0x0547, 0x0555, 0x055b, 0x056a, 0x0574, 0x0578, 0x057d, 0x0589, + 0x0596, 0x05a0, 0x05a6, 0x05ac, 0x05b3, 0x05bd, 0x05c3, 0x05c7, + 0x05cc, 0x05d2, 0x05d9, 0x05e2, 0x05ee, 0x05f8, 0x0609, 0x0611, + 0x0615, 0x0624, 0x062b, 0x0638, 0x0652, 0x065a, 0x0663, 0x066c, + 0x0672, 0x067b, 0x0682, 0x0688, 0x0690, 0x0697, 0x069f, 0x06a5, + 0x06b3, 0x06b8, 0x06c7, 0x06cd, 0x06d6, 0x06de, 0x06e6, 0x06eb, + 0x06f0, 0x06f4, 0x0700, 0x0704, 0x070a, 0x070e, 0x0720, 0x0732, + 0x073a, 0x0742, 0x0748, 0x075f, 0x076f, 0x0779, 0x078f, 0x0798, + // Entry C0 - FF + 0x079d, 0x07a5, 0x07aa, 0x07ce, 0x07d5, 0x07db, 0x07e0, 0x07e4, + 0x07eb, 0x07f9, 0x0809, 0x080f, 0x0814, 0x0819, 0x0821, 0x082d, + 0x0835, 0x084a, 0x0852, 0x085d, 0x0867, 0x086f, 0x0875, 0x087d, + 0x088b, 0x089e, 0x08a9, 0x08e9, 0x08ed, 0x08f8, 0x0907, 0x091d, + 0x0921, 0x0940, 0x0944, 0x094d, 0x0958, 0x095f, 0x096c, 0x0978, + 0x097e, 0x0983, 0x0988, 0x0999, 0x099f, 0x09a5, 0x09ac, 0x09b4, + 0x09bb, 0x09da, 0x09fb, 0x0a02, 0x0a0c, 0x0a13, 0x0a2f, 0x0a39, + 0x0a55, 0x0a71, 0x0a78, 0x0a7f, 0x0a8e, 0x0a93, 0x0a9a, 0x0a9f, + // Entry 100 - 13F + 0x0aa6, 0x0ab4, 0x0ab9, 0x0ac1, 0x0acb, 0x0acf, 0x0ad6, 0x0ae6, + 0x0af5, 0x0afb, 0x0b0e, 0x0b1e, 0x0b2c, 0x0b3a, 0x0b48, 0x0b55, + 0x0b5d, 0x0b6c, 0x0b73, 0x0b7f, 0x0b8a, 0x0b99, 0x0ba6, 0x0bb1, + 0x0bba, 0x0bcc, 0x0bd5, 0x0bd8, 0x0be5, 0x0bf6, 0x0bfd, 0x0c0b, + 0x0c19, 0x0c2c, 0x0c3a, +} // Size: 606 bytes + +var srRegionStr string = "" + // Size: 5923 bytes + "Острво АсенсионАндораУједињени Арапски ЕмиратиАвганистанАнтигва и Барбуд" + + "аАнгвилаАлбанијаЈерменијаХоландски АнтилиАнголаАнтарктикАргентинаАмерич" + + "ка СамоаАустријаАустралијаАрубаОландска острваАзербејџанБосна и Херцего" + + "винаБарбадосБангладешБелгијаБуркина ФасоБугарскаБахреинБурундиБенинСвет" + + "и БартоломејБермудаБрунејБоливијаКарипска ХоландијаБразилБахамиБутанОст" + + "рво БувеБоцванаБелорусијаБелизеКанадаКокосова (Килингова) ОстрваКонго -" + + " КиншасаЦентралноафричка РепубликаКонго - БразавилШвајцарскаОбала Слонов" + + "ачеКукова ОстрваЧилеКамерунКинаКолумбијаОстрво КлипертонКостарикаКубаЗе" + + "ленортска ОстрваКурасаоБожићно острвоКипарЧешкаНемачкаДијего ГарсијаЏиб" + + "утиДанскаДоминикаДоминиканска РепубликаАлжирСеута и МелиљаЕквадорЕстони" + + "јаЕгипатЗападна СахараЕритрејаШпанијаЕтиопијаЕвропска УнијаФинскаФиџиФо" + + "кландска острваМикронезијаФарска ОстрваФранцускаГабонВелика БританијаГр" + + "енадаГрузијаФранцуска ГвајанаГурнсиГанаГибралтарГренландГамбијаГвинејаГ" + + "ваделупеЕкваторијална ГвинејаГрчкаЈужна Џорџија и Јужна Сендвич ОстрваГ" + + "ватемалаГуамГвинеја-БисаоГвајанаСАР Хонгконг (Кина)Острва Херд и Мекдон" + + "алдХондурасХрватскаХаитиМађарскаКанарска острваИндонезијаИрскаИзраелОст" + + "рво МанИндијаБританска територија у Индијском океануИракИранИсландИтали" + + "јаЏерсиЈамајкаЈорданЈапанКенијаКиргистанКамбоџаКирибатиКоморска ОстрваС" + + "ент Китс и НевисСеверна КорејаЈужна КорејаКувајтКајманска ОстрваКазахст" + + "анЛаосЛибанСвета ЛуцијаЛихтенштајнШри ЛанкаЛиберијаЛесотоЛитванијаЛуксе" + + "мбургЛетонијаЛибијаМарокоМонакоМолдавијаЦрна ГораСент МартинМадагаскарМ" + + "аршалска ОстрваМакедонијаМалиМијанмар (Бурма)МонголијаСАР Макао (Кина)С" + + "еверна Маријанска ОстрваМартиникМауританијаМонсератМалтаМаурицијусМалди" + + "виМалавиМексикоМалезијаМозамбикНамибијаНова КаледонијаНигерОстрво Норфо" + + "кНигеријаНикарагваХоландијаНорвешкаНепалНауруНиуеНови ЗеландОманПанамаП" + + "еруФранцуска ПолинезијаПапуа Нова ГвинејаФилипиниПакистанПољскаСен Пјер" + + " и МикелонПиткернПорторикоПалестинске територијеПортугалПалауПарагвајКат" + + "арОкеанија (удаљена острва)РеинионРумунијаСрбијаРусијаРуандаСаудијска А" + + "рабијаСоломонска ОстрваСејшелиСуданШведскаСингапурСвета ЈеленаСловенија" + + "Свалбард и Јан МајенСловачкаСијера ЛеонеСан МариноСенегалСомалијаСурина" + + "мЈужни СуданСао Томе и ПринципеСалвадорСвети МартинСиријаСвазилендТрист" + + "ан да КуњаОстрва Туркс и КаикосЧадФранцуске Јужне ТериторијеТогоТајланд" + + "ТаџикистанТокелауИсточни ТиморТуркменистанТунисТонгаТурскаТринидад и То" + + "багоТувалуТајванТанзанијаУкрајинаУгандаУдаљена острва САДСједињене Амер" + + "ичке ДржавеУругвајУзбекистанВатиканСент Винсент и ГренадиниВенецуелаБри" + + "танска Девичанска ОстрваАмеричка Девичанска ОстрваВијетнамВануатуВалис " + + "и ФутунаСамоаКосовоЈеменМајотЈужноафричка РепубликаЗамбијаЗимбабвеНепоз" + + "нат регионсветАфрикаСеверноамерички континентЈужна АмерикаОкеанијаЗапад" + + "на АфрикаЦентрална АмерикаИсточна АфрикаСеверна АфрикаЦентрална АфрикаЈ" + + "ужна АфрикаСеверна и Јужна АмерикаСеверна АмерикаКарибиИсточна АзијаЈуж" + + "на АзијаЈугоисточна АзијаЈужна ЕвропаАустралија и Нови ЗеландМеланезија" + + "Микронезијски регионПолинезијаАзијаЦентрална АзијаЗападна АзијаЕвропаИс" + + "точна ЕвропаСеверна ЕвропаЗападна ЕвропаЛатинска Америка" + +var srRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x001d, 0x0029, 0x0059, 0x006d, 0x008d, 0x009b, 0x00ab, + 0x00bd, 0x00dc, 0x00e8, 0x00fa, 0x010c, 0x0127, 0x0137, 0x014b, + 0x0155, 0x0172, 0x0186, 0x01aa, 0x01ba, 0x01cc, 0x01da, 0x01f1, + 0x0201, 0x020f, 0x021d, 0x0227, 0x0246, 0x0254, 0x0260, 0x0270, + 0x0293, 0x029f, 0x02ab, 0x02b5, 0x02ca, 0x02d8, 0x02ec, 0x02f8, + 0x0304, 0x0336, 0x0351, 0x0384, 0x03a1, 0x03b5, 0x03d2, 0x03eb, + 0x03f3, 0x0401, 0x0409, 0x041b, 0x043a, 0x044c, 0x0454, 0x0477, + 0x0485, 0x04a0, 0x04aa, 0x04b4, 0x04c2, 0x04dd, 0x04e9, 0x04f5, + // Entry 40 - 7F + 0x0505, 0x0530, 0x053a, 0x0554, 0x0562, 0x0572, 0x057e, 0x0599, + 0x05a9, 0x05b7, 0x05c7, 0x05e2, 0x05ee, 0x05f6, 0x0617, 0x062d, + 0x0646, 0x0658, 0x0662, 0x0681, 0x068f, 0x069d, 0x06be, 0x06ca, + 0x06d2, 0x06e4, 0x06f4, 0x0702, 0x0710, 0x0722, 0x074b, 0x0755, + 0x0798, 0x07aa, 0x07b2, 0x07cb, 0x07d9, 0x07fb, 0x0826, 0x0836, + 0x0846, 0x0850, 0x0860, 0x087d, 0x0891, 0x089b, 0x08a7, 0x08ba, + 0x08c6, 0x0910, 0x0918, 0x0920, 0x092c, 0x093a, 0x0944, 0x0952, + 0x095e, 0x0968, 0x0974, 0x0986, 0x0994, 0x09a4, 0x09c1, 0x09e0, + // Entry 80 - BF + 0x09fb, 0x0a12, 0x0a1e, 0x0a3d, 0x0a4f, 0x0a57, 0x0a61, 0x0a78, + 0x0a8e, 0x0a9f, 0x0aaf, 0x0abb, 0x0acd, 0x0ae1, 0x0af1, 0x0afd, + 0x0b09, 0x0b15, 0x0b27, 0x0b38, 0x0b4d, 0x0b61, 0x0b80, 0x0b94, + 0x0b9c, 0x0bb9, 0x0bcb, 0x0be7, 0x0c17, 0x0c27, 0x0c3d, 0x0c4d, + 0x0c57, 0x0c6b, 0x0c79, 0x0c85, 0x0c93, 0x0ca3, 0x0cb3, 0x0cc3, + 0x0ce0, 0x0cea, 0x0d03, 0x0d13, 0x0d25, 0x0d37, 0x0d47, 0x0d51, + 0x0d5b, 0x0d63, 0x0d78, 0x0d80, 0x0d8c, 0x0d94, 0x0dbb, 0x0ddd, + 0x0ded, 0x0dfd, 0x0e09, 0x0e2a, 0x0e38, 0x0e4a, 0x0e75, 0x0e85, + // Entry C0 - FF + 0x0e8f, 0x0e9f, 0x0ea9, 0x0ed7, 0x0ee5, 0x0ef5, 0x0f01, 0x0f0d, + 0x0f19, 0x0f3a, 0x0f5b, 0x0f69, 0x0f73, 0x0f81, 0x0f91, 0x0fa8, + 0x0fba, 0x0fdf, 0x0fef, 0x1006, 0x1019, 0x1027, 0x1037, 0x1045, + 0x105a, 0x107d, 0x108d, 0x10a4, 0x10b0, 0x10c2, 0x10de, 0x1105, + 0x110b, 0x113d, 0x1145, 0x1153, 0x1167, 0x1175, 0x118e, 0x11a6, + 0x11b0, 0x11ba, 0x11c6, 0x11e6, 0x11f2, 0x11fe, 0x1210, 0x1220, + 0x122c, 0x124e, 0x127e, 0x128c, 0x12a0, 0x12ae, 0x12db, 0x12ed, + 0x1321, 0x1353, 0x1363, 0x1371, 0x138b, 0x1395, 0x13a1, 0x13ab, + // Entry 100 - 13F + 0x13b5, 0x13e0, 0x13ee, 0x13fe, 0x141b, 0x1423, 0x142f, 0x1460, + 0x1479, 0x1489, 0x14a4, 0x14c5, 0x14e0, 0x14fb, 0x151a, 0x1531, + 0x155c, 0x1579, 0x1585, 0x159e, 0x15b3, 0x15d4, 0x15eb, 0x1618, + 0x162c, 0x1653, 0x1667, 0x1671, 0x168e, 0x16a7, 0x16b3, 0x16ce, + 0x16e9, 0x1704, 0x1723, +} // Size: 606 bytes + +var srLatnRegionStr string = "" + // Size: 3112 bytes + "Ostrvo AsensionAndoraUjedinjeni Arapski EmiratiAvganistanAntigva i Barbu" + + "daAngvilaAlbanijaJermenijaHolandski AntiliAngolaAntarktikArgentinaAmerič" + + "ka SamoaAustrijaAustralijaArubaOlandska ostrvaAzerbejdžanBosna i Hercego" + + "vinaBarbadosBangladešBelgijaBurkina FasoBugarskaBahreinBurundiBeninSveti" + + " BartolomejBermudaBrunejBolivijaKaripska HolandijaBrazilBahamiButanOstrv" + + "o BuveBocvanaBelorusijaBelizeKanadaKokosova (Kilingova) OstrvaKongo - Ki" + + "nšasaCentralnoafrička RepublikaKongo - BrazavilŠvajcarskaObala Slonovače" + + "Kukova OstrvaČileKamerunKinaKolumbijaOstrvo KlipertonKostarikaKubaZeleno" + + "rtska OstrvaKurasaoBožićno ostrvoKiparČeškaNemačkaDijego GarsijaDžibutiD" + + "anskaDominikaDominikanska RepublikaAlžirSeuta i MeliljaEkvadorEstonijaEg" + + "ipatZapadna SaharaEritrejaŠpanijaEtiopijaEvropska UnijaFinskaFidžiFoklan" + + "dska ostrvaMikronezijaFarska OstrvaFrancuskaGabonVelika BritanijaGrenada" + + "GruzijaFrancuska GvajanaGurnsiGanaGibraltarGrenlandGambijaGvinejaGvadelu" + + "peEkvatorijalna GvinejaGrčkaJužna Džordžija i Južna Sendvič OstrvaGvatem" + + "alaGuamGvineja-BisaoGvajanaSAR Hongkong (Kina)Ostrva Herd i MekdonaldHon" + + "durasHrvatskaHaitiMađarskaKanarska ostrvaIndonezijaIrskaIzraelOstrvo Man" + + "IndijaBritanska teritorija u Indijskom okeanuIrakIranIslandItalijaDžersi" + + "JamajkaJordanJapanKenijaKirgistanKambodžaKiribatiKomorska OstrvaSent Kit" + + "s i NevisSeverna KorejaJužna KorejaKuvajtKajmanska OstrvaKazahstanLaosLi" + + "banSveta LucijaLihtenštajnŠri LankaLiberijaLesotoLitvanijaLuksemburgLeto" + + "nijaLibijaMarokoMonakoMoldavijaCrna GoraSent MartinMadagaskarMaršalska O" + + "strvaMakedonijaMaliMijanmar (Burma)MongolijaSAR Makao (Kina)Severna Mari" + + "janska OstrvaMartinikMauritanijaMonseratMaltaMauricijusMaldiviMalaviMeks" + + "ikoMalezijaMozambikNamibijaNova KaledonijaNigerOstrvo NorfokNigerijaNika" + + "ragvaHolandijaNorveškaNepalNauruNiueNovi ZelandOmanPanamaPeruFrancuska P" + + "olinezijaPapua Nova GvinejaFilipiniPakistanPoljskaSen Pjer i MikelonPitk" + + "ernPortorikoPalestinske teritorijePortugalPalauParagvajKatarOkeanija (ud" + + "aljena ostrva)ReinionRumunijaSrbijaRusijaRuandaSaudijska ArabijaSolomons" + + "ka OstrvaSejšeliSudanŠvedskaSingapurSveta JelenaSlovenijaSvalbard i Jan " + + "MajenSlovačkaSijera LeoneSan MarinoSenegalSomalijaSurinamJužni SudanSao " + + "Tome i PrincipeSalvadorSveti MartinSirijaSvazilendTristan da KunjaOstrva" + + " Turks i KaikosČadFrancuske Južne TeritorijeTogoTajlandTadžikistanTokela" + + "uIstočni TimorTurkmenistanTunisTongaTurskaTrinidad i TobagoTuvaluTajvanT" + + "anzanijaUkrajinaUgandaUdaljena ostrva SADSjedinjene Američke DržaveUrugv" + + "ajUzbekistanVatikanSent Vinsent i GrenadiniVenecuelaBritanska Devičanska" + + " OstrvaAmerička Devičanska OstrvaVijetnamVanuatuValis i FutunaSamoaKosov" + + "oJemenMajotJužnoafrička RepublikaZambijaZimbabveNepoznat regionsvetAfrik" + + "aSevernoamerički kontinentJužna AmerikaOkeanijaZapadna AfrikaCentralna A" + + "merikaIstočna AfrikaSeverna AfrikaCentralna AfrikaJužna AfrikaSeverna i " + + "Južna AmerikaSeverna AmerikaKaribiIstočna AzijaJužna AzijaJugoistočna Az" + + "ijaJužna EvropaAustralija i Novi ZelandMelanezijaMikronezijski regionPol" + + "inezijaAzijaCentralna AzijaZapadna AzijaEvropaIstočna EvropaSeverna Evro" + + "paZapadna EvropaLatinska Amerika" + +var srLatnRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x000f, 0x0015, 0x002f, 0x0039, 0x004a, 0x0051, 0x0059, + 0x0062, 0x0072, 0x0078, 0x0081, 0x008a, 0x0099, 0x00a1, 0x00ab, + 0x00b0, 0x00bf, 0x00cb, 0x00de, 0x00e6, 0x00f0, 0x00f7, 0x0103, + 0x010b, 0x0112, 0x0119, 0x011e, 0x012e, 0x0135, 0x013b, 0x0143, + 0x0155, 0x015b, 0x0161, 0x0166, 0x0171, 0x0178, 0x0182, 0x0188, + 0x018e, 0x01a9, 0x01b9, 0x01d4, 0x01e4, 0x01ef, 0x01ff, 0x020c, + 0x0211, 0x0218, 0x021c, 0x0225, 0x0235, 0x023e, 0x0242, 0x0254, + 0x025b, 0x026b, 0x0270, 0x0277, 0x027f, 0x028d, 0x0295, 0x029b, + // Entry 40 - 7F + 0x02a3, 0x02b9, 0x02bf, 0x02ce, 0x02d5, 0x02dd, 0x02e3, 0x02f1, + 0x02f9, 0x0301, 0x0309, 0x0317, 0x031d, 0x0323, 0x0334, 0x033f, + 0x034c, 0x0355, 0x035a, 0x036a, 0x0371, 0x0378, 0x0389, 0x038f, + 0x0393, 0x039c, 0x03a4, 0x03ab, 0x03b2, 0x03bb, 0x03d0, 0x03d6, + 0x0401, 0x040a, 0x040e, 0x041b, 0x0422, 0x0435, 0x044c, 0x0454, + 0x045c, 0x0461, 0x046a, 0x0479, 0x0483, 0x0488, 0x048e, 0x0498, + 0x049e, 0x04c5, 0x04c9, 0x04cd, 0x04d3, 0x04da, 0x04e1, 0x04e8, + 0x04ee, 0x04f3, 0x04f9, 0x0502, 0x050b, 0x0513, 0x0522, 0x0533, + // Entry 80 - BF + 0x0541, 0x054e, 0x0554, 0x0564, 0x056d, 0x0571, 0x0576, 0x0582, + 0x058e, 0x0598, 0x05a0, 0x05a6, 0x05af, 0x05b9, 0x05c1, 0x05c7, + 0x05cd, 0x05d3, 0x05dc, 0x05e5, 0x05f0, 0x05fa, 0x060b, 0x0615, + 0x0619, 0x0629, 0x0632, 0x0642, 0x065b, 0x0663, 0x066e, 0x0676, + 0x067b, 0x0685, 0x068c, 0x0692, 0x0699, 0x06a1, 0x06a9, 0x06b1, + 0x06c0, 0x06c5, 0x06d2, 0x06da, 0x06e3, 0x06ec, 0x06f5, 0x06fa, + 0x06ff, 0x0703, 0x070e, 0x0712, 0x0718, 0x071c, 0x0730, 0x0742, + 0x074a, 0x0752, 0x0759, 0x076b, 0x0772, 0x077b, 0x0791, 0x0799, + // Entry C0 - FF + 0x079e, 0x07a6, 0x07ab, 0x07c5, 0x07cc, 0x07d4, 0x07da, 0x07e0, + 0x07e6, 0x07f7, 0x0808, 0x0810, 0x0815, 0x081d, 0x0825, 0x0831, + 0x083a, 0x084e, 0x0857, 0x0863, 0x086d, 0x0874, 0x087c, 0x0883, + 0x088f, 0x08a2, 0x08aa, 0x08b6, 0x08bc, 0x08c5, 0x08d5, 0x08ea, + 0x08ee, 0x0909, 0x090d, 0x0914, 0x0920, 0x0927, 0x0935, 0x0941, + 0x0946, 0x094b, 0x0951, 0x0962, 0x0968, 0x096e, 0x0977, 0x097f, + 0x0985, 0x0998, 0x09b4, 0x09bb, 0x09c5, 0x09cc, 0x09e4, 0x09ed, + 0x0a09, 0x0a25, 0x0a2d, 0x0a34, 0x0a42, 0x0a47, 0x0a4d, 0x0a52, + // Entry 100 - 13F + 0x0a57, 0x0a6f, 0x0a76, 0x0a7e, 0x0a8d, 0x0a91, 0x0a97, 0x0ab1, + 0x0abf, 0x0ac7, 0x0ad5, 0x0ae6, 0x0af5, 0x0b03, 0x0b13, 0x0b20, + 0x0b38, 0x0b47, 0x0b4d, 0x0b5b, 0x0b67, 0x0b79, 0x0b86, 0x0b9e, + 0x0ba8, 0x0bbc, 0x0bc6, 0x0bcb, 0x0bda, 0x0be7, 0x0bed, 0x0bfc, + 0x0c0a, 0x0c18, 0x0c28, +} // Size: 606 bytes + +var svRegionStr string = "" + // Size: 2924 bytes + "AscensionAndorraFörenade ArabemiratenAfghanistanAntigua och BarbudaAngui" + + "llaAlbanienArmenienNederländska AntillernaAngolaAntarktisArgentinaAmerik" + + "anska SamoaÖsterrikeAustralienArubaÅlandAzerbajdzjanBosnien och Hercegov" + + "inaBarbadosBangladeshBelgienBurkina FasoBulgarienBahrainBurundiBeninS:t " + + "BarthélemyBermudaBruneiBoliviaKaribiska NederländernaBrasilienBahamasBhu" + + "tanBouvetönBotswanaVitrysslandBelizeKanadaKokosöarnaKongo-KinshasaCentra" + + "lafrikanska republikenKongo-BrazzavilleSchweizElfenbenskustenCooköarnaCh" + + "ileKamerunKinaColombiaClippertonönCosta RicaKubaKap VerdeCuraçaoJulönCyp" + + "ernTjeckienTysklandDiego GarciaDjiboutiDanmarkDominicaDominikanska repub" + + "likenAlgerietCeuta och MelillaEcuadorEstlandEgyptenVästsaharaEritreaSpan" + + "ienEtiopienEuropeiska unionenFinlandFijiFalklandsöarnaMikronesienFäröarn" + + "aFrankrikeGabonStorbritannienGrenadaGeorgienFranska GuyanaGuernseyGhanaG" + + "ibraltarGrönlandGambiaGuineaGuadeloupeEkvatorialguineaGreklandSydgeorgie" + + "n och SydsandwichöarnaGuatemalaGuamGuinea-BissauGuyanaHongkong, S.A.R. K" + + "inaHeardön och McDonaldöarnaHondurasKroatienHaitiUngernKanarieöarnaIndon" + + "esienIrlandIsraelIsle of ManIndienBrittiska territoriet i Indiska oceane" + + "nIrakIranIslandItalienJerseyJamaicaJordanienJapanKenyaKirgizistanKambodj" + + "aKiribatiKomorernaS:t Kitts och NevisNordkoreaSydkoreaKuwaitCaymanöarnaK" + + "azakstanLaosLibanonS:t LuciaLiechtensteinSri LankaLiberiaLesothoLitauenL" + + "uxemburgLettlandLibyenMarockoMonacoMoldavienMontenegroS:t MartinMadagask" + + "arMarshallöarnaMakedonienMaliMyanmar (Burma)MongolietMacao, S.A.R. KinaN" + + "ordmarianernaMartiniqueMauretanienMontserratMaltaMauritiusMaldivernaMala" + + "wiMexikoMalaysiaMoçambiqueNamibiaNya KaledonienNigerNorfolkönNigeriaNica" + + "raguaNederländernaNorgeNepalNauruNiueNya ZeelandOmanPanamaPeruFranska Po" + + "lynesienPapua Nya GuineaFilippinernaPakistanPolenS:t Pierre och Miquelon" + + "PitcairnöarnaPuerto RicoPalestinska territoriernaPortugalPalauParaguayQa" + + "taryttre öar i OceanienRéunionRumänienSerbienRysslandRwandaSaudiarabienS" + + "alomonöarnaSeychellernaSudanSverigeSingaporeS:t HelenaSlovenienSvalbard " + + "och Jan MayenSlovakienSierra LeoneSan MarinoSenegalSomaliaSurinamSydsuda" + + "nSão Tomé och PríncipeEl SalvadorSint MaartenSyrienSwazilandTristan da C" + + "unhaTurks- och CaicosöarnaTchadFranska sydterritoriernaTogoThailandTadzj" + + "ikistanTokelauÖsttimorTurkmenistanTunisienTongaTurkietTrinidad och Tobag" + + "oTuvaluTaiwanTanzaniaUkrainaUgandaUSA:s yttre öarUSAUruguayUzbekistanVat" + + "ikanstatenS:t Vincent och GrenadinernaVenezuelaBrittiska JungfruöarnaAme" + + "rikanska JungfruöarnaVietnamVanuatuWallis- och FutunaöarnaSamoaKosovoJem" + + "enMayotteSydafrikaZambiaZimbabweokänd regionvärldenAfrikaNordamerikaSyda" + + "merikaOceanienVästafrikaCentralamerikaÖstafrikaNordafrikaCentralafrikasö" + + "dra AfrikaNord- och Sydamerikanorra AmerikaKaribienÖstasienSydasienSydos" + + "tasienSydeuropaAustralasienMelanesienMikronesiska öarnaPolynesienAsienCe" + + "ntralasienVästasienEuropaÖsteuropaNordeuropaVästeuropaLatinamerika" + +var svRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0009, 0x0010, 0x0026, 0x0031, 0x0044, 0x004c, 0x0054, + 0x005c, 0x0074, 0x007a, 0x0083, 0x008c, 0x009d, 0x00a7, 0x00b1, + 0x00b6, 0x00bc, 0x00c8, 0x00df, 0x00e7, 0x00f1, 0x00f8, 0x0104, + 0x010d, 0x0114, 0x011b, 0x0120, 0x012f, 0x0136, 0x013c, 0x0143, + 0x015b, 0x0164, 0x016b, 0x0171, 0x017a, 0x0182, 0x018d, 0x0193, + 0x0199, 0x01a4, 0x01b2, 0x01ce, 0x01df, 0x01e6, 0x01f5, 0x01ff, + 0x0204, 0x020b, 0x020f, 0x0217, 0x0224, 0x022e, 0x0232, 0x023b, + 0x0243, 0x0249, 0x024f, 0x0257, 0x025f, 0x026b, 0x0273, 0x027a, + // Entry 40 - 7F + 0x0282, 0x0299, 0x02a1, 0x02b2, 0x02b9, 0x02c0, 0x02c7, 0x02d2, + 0x02d9, 0x02e0, 0x02e8, 0x02fa, 0x0301, 0x0305, 0x0314, 0x031f, + 0x0329, 0x0332, 0x0337, 0x0345, 0x034c, 0x0354, 0x0362, 0x036a, + 0x036f, 0x0378, 0x0381, 0x0387, 0x038d, 0x0397, 0x03a7, 0x03af, + 0x03d0, 0x03d9, 0x03dd, 0x03ea, 0x03f0, 0x0405, 0x0420, 0x0428, + 0x0430, 0x0435, 0x043b, 0x0448, 0x0452, 0x0458, 0x045e, 0x0469, + 0x046f, 0x0496, 0x049a, 0x049e, 0x04a4, 0x04ab, 0x04b1, 0x04b8, + 0x04c1, 0x04c6, 0x04cb, 0x04d6, 0x04de, 0x04e6, 0x04ef, 0x0502, + // Entry 80 - BF + 0x050b, 0x0513, 0x0519, 0x0525, 0x052e, 0x0532, 0x0539, 0x0542, + 0x054f, 0x0558, 0x055f, 0x0566, 0x056d, 0x0576, 0x057e, 0x0584, + 0x058b, 0x0591, 0x059a, 0x05a4, 0x05ae, 0x05b8, 0x05c6, 0x05d0, + 0x05d4, 0x05e3, 0x05ec, 0x05fe, 0x060c, 0x0616, 0x0621, 0x062b, + 0x0630, 0x0639, 0x0643, 0x0649, 0x064f, 0x0657, 0x0662, 0x0669, + 0x0677, 0x067c, 0x0686, 0x068d, 0x0696, 0x06a4, 0x06a9, 0x06ae, + 0x06b3, 0x06b7, 0x06c2, 0x06c6, 0x06cc, 0x06d0, 0x06e2, 0x06f2, + 0x06fe, 0x0706, 0x070b, 0x0722, 0x0730, 0x073b, 0x0754, 0x075c, + // Entry C0 - FF + 0x0761, 0x0769, 0x076e, 0x0783, 0x078b, 0x0794, 0x079b, 0x07a3, + 0x07a9, 0x07b5, 0x07c2, 0x07ce, 0x07d3, 0x07da, 0x07e3, 0x07ed, + 0x07f6, 0x080c, 0x0815, 0x0821, 0x082b, 0x0832, 0x0839, 0x0840, + 0x0848, 0x0860, 0x086b, 0x0877, 0x087d, 0x0886, 0x0896, 0x08ad, + 0x08b2, 0x08ca, 0x08ce, 0x08d6, 0x08e2, 0x08e9, 0x08f2, 0x08fe, + 0x0906, 0x090b, 0x0912, 0x0925, 0x092b, 0x0931, 0x0939, 0x0940, + 0x0946, 0x0956, 0x0959, 0x0960, 0x096a, 0x0977, 0x0993, 0x099c, + 0x09b3, 0x09cc, 0x09d3, 0x09da, 0x09f2, 0x09f7, 0x09fd, 0x0a02, + // Entry 100 - 13F + 0x0a09, 0x0a12, 0x0a18, 0x0a20, 0x0a2d, 0x0a35, 0x0a3b, 0x0a46, + 0x0a50, 0x0a58, 0x0a63, 0x0a71, 0x0a7b, 0x0a85, 0x0a92, 0x0a9f, + 0x0ab3, 0x0ac0, 0x0ac8, 0x0ad1, 0x0ad9, 0x0ae4, 0x0aed, 0x0af9, + 0x0b03, 0x0b16, 0x0b20, 0x0b25, 0x0b31, 0x0b3b, 0x0b41, 0x0b4b, + 0x0b55, 0x0b60, 0x0b6c, +} // Size: 606 bytes + +var swRegionStr string = "" + // Size: 3122 bytes + "Kisiwa cha AscensionAndoraFalme za KiarabuAfghanistanAntigua na BarbudaA" + + "nguillaAlbaniaArmeniaAntili za UholanziAngolaAntaktikaAjentinaSamoa ya M" + + "arekaniAustriaAustraliaArubaVisiwa vya AlandiAzabajaniBosnia na Hezegovi" + + "naBabadosiBangladeshiUbelgijiBukinafasoBulgariaBahareniBurundiBeninSanta" + + "bathelemiBermudaBruneiBoliviaUholanzi ya KaribianiBraziliBahamaBhutanKis" + + "iwa cha BouvetBotswanaBelarusiBelizeKanadaVisiwa vya Cocos (Keeling)Jamh" + + "uri ya Kidemokrasia ya KongoJamhuri ya Afrika ya KatiKongo - Brazzaville" + + "UswisiCôte d’IvoireVisiwa vya CookChileKameruniChinaKolombiaKisiwa cha C" + + "lippertonKostarikaKubaKepuvedeKurakaoKisiwa cha KrismasiCyprusJamhuri ya" + + " ChekiUjerumaniDiego GarciaJibutiDenmarkDominikaJamhuri ya DominikaAljer" + + "iaCeuta na MelillaEkwadoEstoniaMisriSahara MagharibiEritreaHispaniaUhabe" + + "shiUmoja wa UlayaUfiniFijiVisiwa vya FalklandMikronesiaVisiwa vya FaroeU" + + "faransaGabonUingerezaGrenadaJojiaGwiyana ya UfaransaGuernseyGhanaJibralt" + + "aGrinlandiGambiaGineGwadelupeGinekwetaUgirikiJojia Kusini na Visiwa vya " + + "Sandwich KusiniGwatemalaGwamGinebisauGuyanaHong Kong SAR ChinaKisiwa cha" + + " Heard na Visiwa vya McDonaldHondurasiKorasiaHaitiHungariaVisiwa vya Kan" + + "ariIndonesiaAyalandiIsraeliIsle of ManIndiaEneo la Uingereza katika Baha" + + "ri HindiIrakiIranAislandiItaliaJerseyJamaikaYordaniJapaniKenyaKirigizist" + + "aniKambodiaKiribatiKomoroSantakitzi na NevisKorea KaskaziniKorea KusiniK" + + "uwaitiVisiwa vya KaymanKazakistaniLaosiLebanoniSantalusiaLiechtensteinSr" + + "i LankaLiberiaLesotoLitwaniaLuxembourgLativiaLibyaMorokoMonakoMoldovaMon" + + "tenegroSaint MartinMadagaskaVisiwa vya MarshallMasedoniaMaliMyanmar (Bur" + + "ma)MongoliaMacau SAR ChinaVisiwa vya Mariana vya KaskaziniMartinikiMorit" + + "aniaMontserratiMaltaMorisiMaldivesMalawiMeksikoMalesiaMsumbijiNamibiaNyu" + + "kaledoniaNigerKisiwa cha NorfolkNigeriaNikaragwaUholanziNorweNepalNauruN" + + "iueNyuzilandiOmaniPanamaPeruPolinesia ya UfaransaPapua New GuineaUfilipi" + + "noPakistaniPolandiSantapierre na MiquelonVisiwa vya PitcairnPuerto RicoM" + + "aeneo ya PalestinaUrenoPalauParagwaiQatarOceania ya NjeRiyunioniRomaniaS" + + "erbiaUrusiRwandaSaudiVisiwa vya SolomonShelisheliSudaniUswidiSingaporeSa" + + "ntahelenaSloveniaSvalbard na Jan MayenSlovakiaSiera LeoniSan MarinoSeneg" + + "aliSomaliaSurinamuSudani KusiniSão Tomé na PríncipeElsavadoSint MaartenS" + + "yriaUswaziTristan da CunhaVisiwa vya Turki na KaikoChadMaeneo ya Kusini " + + "ya UfaransaTogoTailandiTajikistaniTokelauTimor-LesteTurukimenistaniTunis" + + "iaTongaUturukiTrinidad na TobagoTuvaluTaiwanTanzaniaUkrainiUgandaVisiwa " + + "Vidogo vya Nje vya MarekaniMarekaniUrugwaiUzibekistaniVatikaniSantavisen" + + "ti na GrenadiniVenezuelaVisiwa vya Virgin vya UingerezaVisiwa vya Virgin" + + " vya MarekaniVietnamVanuatuWalis na FutunaSamoaKosovoYemeniMayotteAfrika" + + " KusiniZambiaZimbabweEneo lisilojulikanaDuniaAfrikaAmerika KaskaziniAmer" + + "ika KusiniOceaniaAfrika ya MagharibiAmerika ya KatiAfrika ya MasharikiAf" + + "rika ya KaskaziniAfrika ya KatiAfrika ya KusiniAmerikaAmerika ya Kaskazi" + + "niKaribianiAsia MasharikiAsia ya KusiniAsia ya Kusini MasharikiUlaya ya " + + "KusiniAustralasiaMelanesiaEneo la MikronesiaPolynesiaAsiaAsia ya KatiAsi" + + "a ya MagharibiUlayaUlaya ya MasharikiUlaya ya KaskaziniUlaya ya Magharib" + + "iAmerika ya Kilatini" + +var swRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0014, 0x001a, 0x002a, 0x0035, 0x0047, 0x004f, 0x0056, + 0x005d, 0x006f, 0x0075, 0x007e, 0x0086, 0x0097, 0x009e, 0x00a7, + 0x00ac, 0x00bd, 0x00c6, 0x00da, 0x00e2, 0x00ed, 0x00f5, 0x00ff, + 0x0107, 0x010f, 0x0116, 0x011b, 0x0129, 0x0130, 0x0136, 0x013d, + 0x0152, 0x0159, 0x015f, 0x0165, 0x0176, 0x017e, 0x0186, 0x018c, + 0x0192, 0x01ac, 0x01cc, 0x01e5, 0x01f8, 0x01fe, 0x020e, 0x021d, + 0x0222, 0x022a, 0x022f, 0x0237, 0x024c, 0x0255, 0x0259, 0x0261, + 0x0268, 0x027b, 0x0281, 0x0291, 0x029a, 0x02a6, 0x02ac, 0x02b3, + // Entry 40 - 7F + 0x02bb, 0x02ce, 0x02d5, 0x02e5, 0x02eb, 0x02f2, 0x02f7, 0x0307, + 0x030e, 0x0316, 0x031e, 0x032c, 0x0331, 0x0335, 0x0348, 0x0352, + 0x0362, 0x036a, 0x036f, 0x0378, 0x037f, 0x0384, 0x0397, 0x039f, + 0x03a4, 0x03ac, 0x03b5, 0x03bb, 0x03bf, 0x03c8, 0x03d1, 0x03d8, + 0x0402, 0x040b, 0x040f, 0x0418, 0x041e, 0x0431, 0x0458, 0x0461, + 0x0468, 0x046d, 0x0475, 0x0486, 0x048f, 0x0497, 0x049e, 0x04a9, + 0x04ae, 0x04d3, 0x04d8, 0x04dc, 0x04e4, 0x04ea, 0x04f0, 0x04f7, + 0x04fe, 0x0504, 0x0509, 0x0516, 0x051e, 0x0526, 0x052c, 0x053f, + // Entry 80 - BF + 0x054e, 0x055a, 0x0561, 0x0572, 0x057d, 0x0582, 0x058a, 0x0594, + 0x05a1, 0x05aa, 0x05b1, 0x05b7, 0x05bf, 0x05c9, 0x05d0, 0x05d5, + 0x05db, 0x05e1, 0x05e8, 0x05f2, 0x05fe, 0x0607, 0x061a, 0x0623, + 0x0627, 0x0636, 0x063e, 0x064d, 0x066d, 0x0676, 0x067f, 0x068a, + 0x068f, 0x0695, 0x069d, 0x06a3, 0x06aa, 0x06b1, 0x06b9, 0x06c0, + 0x06cc, 0x06d1, 0x06e3, 0x06ea, 0x06f3, 0x06fb, 0x0700, 0x0705, + 0x070a, 0x070e, 0x0718, 0x071d, 0x0723, 0x0727, 0x073c, 0x074c, + 0x0755, 0x075e, 0x0765, 0x077c, 0x078f, 0x079a, 0x07ad, 0x07b2, + // Entry C0 - FF + 0x07b7, 0x07bf, 0x07c4, 0x07d2, 0x07db, 0x07e2, 0x07e8, 0x07ed, + 0x07f3, 0x07f8, 0x080a, 0x0814, 0x081a, 0x0820, 0x0829, 0x0834, + 0x083c, 0x0851, 0x0859, 0x0864, 0x086e, 0x0876, 0x087d, 0x0885, + 0x0892, 0x08a9, 0x08b1, 0x08bd, 0x08c2, 0x08c8, 0x08d8, 0x08f1, + 0x08f5, 0x0911, 0x0915, 0x091d, 0x0928, 0x092f, 0x093a, 0x0949, + 0x0950, 0x0955, 0x095c, 0x096e, 0x0974, 0x097a, 0x0982, 0x0989, + 0x098f, 0x09b1, 0x09b9, 0x09c0, 0x09cc, 0x09d4, 0x09ed, 0x09f6, + 0x0a15, 0x0a33, 0x0a3a, 0x0a41, 0x0a50, 0x0a55, 0x0a5b, 0x0a61, + // Entry 100 - 13F + 0x0a68, 0x0a75, 0x0a7b, 0x0a83, 0x0a96, 0x0a9b, 0x0aa1, 0x0ab2, + 0x0ac0, 0x0ac7, 0x0ada, 0x0ae9, 0x0afc, 0x0b0f, 0x0b1d, 0x0b2d, + 0x0b34, 0x0b48, 0x0b51, 0x0b5f, 0x0b6d, 0x0b85, 0x0b94, 0x0b9f, + 0x0ba8, 0x0bba, 0x0bc3, 0x0bc7, 0x0bd3, 0x0be4, 0x0be9, 0x0bfb, + 0x0c0d, 0x0c1f, 0x0c32, +} // Size: 606 bytes + +var taRegionStr string = "" + // Size: 9580 bytes + "அஷன்ஷியன் தீவுஅன்டோராஐக்கிய அரபு எமிரேட்ஸ்ஆப்கானிஸ்தான்ஆண்டிகுவா மற்றும்" + + " பார்புடாஅங்குய்லாஅல்பேனியாஅர்மேனியாநெதர்லாந்து ஆண்டில்லெஸ்அங்கோலாஅண்டார" + + "்டிகாஅர்ஜென்டினாஅமெரிக்க சமோவாஆஸ்திரியாஆஸ்திரேலியாஅரூபாஆலந்து தீவுகள்அ" + + "சர்பைஜான்போஸ்னியா & ஹெர்ஸகோவினாபார்படோஸ்பங்களாதேஷ்பெல்ஜியம்புர்கினா ஃப" + + "ாஸோபல்கேரியாபஹ்ரைன்புருண்டிபெனின்செயின்ட் பார்தேலெமிபெர்முடாபுரூனேய்பொ" + + "லிவியாகரீபியன் நெதர்லாந்துபிரேசில்பஹாமாஸ்பூடான்பொவேட் தீவுகள்போட்ஸ்வான" + + "ாபெலாரூஸ்பெலிஸ்கனடாகோகோஸ் (கீலிங்) தீவுகள்காங்கோ - கின்ஷாசாமத்திய ஆப்ர" + + "ிக்கக் குடியரசுகாங்கோ - ப்ராஸாவில்லேஸ்விட்சர்லாந்துகோட் தி’வாயர்குக் த" + + "ீவுகள்சிலிகேமரூன்சீனாகொலம்பியாகிலிப்பர்டன் தீவுகோஸ்டாரிகாகியூபாகேப் வெ" + + "ர்டேகுராகவ்கிறிஸ்துமஸ் தீவுசைப்ரஸ்செக் குடியரசுஜெர்மனிடியகோ கார்ஷியாஜி" + + "பௌட்டிடென்மார்க்டொமினிகாடொமினிகன் குடியரசுஅல்ஜீரியாசியூடா & மெலில்லாஈக" + + "்வடார்எஸ்டோனியாஎகிப்துமேற்கு சஹாராஎரிட்ரியாஸ்பெயின்எதியோப்பியாஐரோப்பிய" + + " யூனியன்பின்லாந்துஃபிஜிஃபாக்லாந்து தீவுகள்மைக்ரோனேஷியாஃபாரோ தீவுகள்பிரான" + + "்ஸ்கேபான்ஐக்கிய பேரரசுகிரனெடாஜார்ஜியாபிரெஞ்சு கயானாகெர்ன்சிகானாஜிப்ரால" + + "்டர்கிரீன்லாந்துகாம்பியாகினியாக்வாதேலோப்ஈக்வடோரியல் கினியாகிரீஸ்தென் ஜ" + + "ியார்ஜியா மற்றும் தென் சான்ட்விச் தீவுகள்கவுதமாலாகுவாம்கினியா-பிஸ்ஸாவ்" + + "கயானாஹாங்காங் எஸ்ஏஆர் சீனாஹேர்ட் மற்றும் மெக்டொனால்டு தீவுகள்ஹோண்டூராஸ" + + "்குரேஷியாஹைட்டிஹங்கேரிகேனரி தீவுகள்இந்தோனேஷியாஅயர்லாந்துஇஸ்ரேல்ஐல் ஆஃப" + + "் மேன்இந்தியாபிரிட்டிஷ் இந்தியப் பெருங்கடல் பிரதேசம்ஈராக்ஈரான்ஐஸ்லாந்த" + + "ுஇத்தாலிஜெர்சிஜமைகாஜோர்டான்ஜப்பான்கென்யாகிர்கிஸ்தான்கம்போடியாகிரிபடிகோ" + + "மரோஸ்செயின்ட் கிட்ஸ் & நெவிஸ்வட கொரியாதென் கொரியாகுவைத்கெய்மென் தீவுகள" + + "்கஸகஸ்தான்லாவோஸ்லெபனான்செயின்ட் லூசியாலிச்செண்ஸ்டெய்ன்இலங்கைலைபீரியாலெ" + + "சோதோலிதுவேனியாலக்ஸ்சம்பர்க்லாட்வியாலிபியாமொராக்கோமொனாக்கோமால்டோவாமான்ட" + + "ேனெக்ரோசெயின்ட் மார்ட்டீன்மடகாஸ்கர்மார்ஷல் தீவுகள்மாசிடோனியாமாலிமியான்" + + "மார் (பர்மா)மங்கோலியாமகாவ் எஸ்ஏஆர் சீனாவடக்கு மரியானா தீவுகள்மார்டினிக" + + "்மௌரிடானியாமாண்ட்செராட்மால்டாமொரிசியஸ்மாலத்தீவுமலாவிமெக்சிகோமலேசியாமொச" + + "ாம்பிக்நமீபியாநியூ கேலிடோனியாநைஜர்நார்ஃபோக் தீவுகள்நைஜீரியாநிகரகுவாநெத" + + "ர்லாந்துநார்வேநேபாளம்நௌருநியூநியூசிலாந்துஓமன்பனாமாபெருபிரெஞ்சு பாலினேஷ" + + "ியாபப்புவா நியூ கினியாபிலிப்பைன்ஸ்பாகிஸ்தான்போலந்துசெயின்ட் பியர் & மி" + + "க்வேலான்பிட்கெய்ர்ன் தீவுகள்பியூர்டோ ரிகோபாலஸ்தீனிய பிரதேசங்கள்போர்ச்ச" + + "ுக்கல்பாலோபராகுவேகத்தார்வெளிப்புற ஓஷியானியாரீயூனியன்ருமேனியாசெர்பியாரஷ" + + "்யாருவான்டாசவூதி அரேபியாசாலமன் தீவுகள்சீஷெல்ஸ்சூடான்ஸ்வீடன்சிங்கப்பூர்" + + "செயின்ட் ஹெலெனாஸ்லோவேனியாஸ்வல்பார்டு & ஜான் மேயன்ஸ்லோவாகியாசியாரா லியோ" + + "ன்சான் மரினோசெனெகல்சோமாலியாசுரினாம்தெற்கு சூடான்சாவ் தோம் & ப்ரின்சிபி" + + "எல் சால்வடார்சின்ட் மார்டென்சிரியாஸ்வாஸிலாந்துடிரிஸ்டன் டா குன்ஹாடர்க்" + + "ஸ் & கைகோஸ் தீவுகள்சாட்பிரெஞ்சு தெற்கு பிரதேசங்கள்டோகோதாய்லாந்துதாஜிகி" + + "ஸ்தான்டோகேலோதைமூர்-லெஸ்தேதுர்க்மெனிஸ்தான்டுனிசியாடோங்காதுருக்கிட்ரினிட" + + "ாட் & டொபாகோதுவாலூதைவான்தான்சானியாஉக்ரைன்உகாண்டாயூ.எஸ். வெளிப்புற தீவு" + + "கள்அமெரிக்காஉருகுவேஉஸ்பெகிஸ்தான்வாடிகன் நகரம்செயின்ட் வின்சென்ட் & கிர" + + "ெனடைன்ஸ்வெனிசுலாபிரிட்டீஷ் கன்னித் தீவுகள்யூ.எஸ். கன்னித் தீவுகள்வியட்" + + "நாம்வனுவாட்டுவாலிஸ் மற்றும் ஃபுடுனாசமோவாகொசோவோஏமன்மயோட்தென் ஆப்பிரிக்க" + + "ாஜாம்பியாஜிம்பாப்வேஅறியப்படாத பிரதேசம்உலகம்ஆப்ரிக்காவட அமெரிக்காதென் அ" + + "மெரிக்காஓஷியானியாமேற்கு ஆப்ரிக்காமத்திய அமெரிக்காகிழக்கு ஆப்ரிக்காவடக்" + + "கு ஆப்ரிக்காமத்திய ஆப்ரிக்காதெற்கு ஆப்ரிக்காஅமெரிக்காஸ்வடக்கு அமெரிக்க" + + "ாகரீபியன்கிழக்கு ஆசியாதெற்கு ஆசியாதென்கிழக்கு ஆசியாதெற்கு ஐரோப்பாஆஸ்தி" + + "ரலேசியாமெலனேஷியாமைக்ரோ நேஷியா பிரதேசம்பாலினேஷியாஆசியாமத்திய ஆசியாமேற்க" + + "ு ஆசியாஐரோப்பாகிழக்கு ஐரோப்பாவடக்கு ஐரோப்பாமேற்கு ஐரோப்பாலத்தீன் அமெரி" + + "க்கா" + +var taRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0028, 0x003d, 0x0078, 0x009f, 0x00e9, 0x0104, 0x011f, + 0x013a, 0x017d, 0x0192, 0x01b3, 0x01d4, 0x01fc, 0x0217, 0x0238, + 0x0247, 0x026f, 0x028d, 0x02c9, 0x02e4, 0x0302, 0x031d, 0x0345, + 0x0360, 0x0375, 0x038d, 0x039f, 0x03d6, 0x03ee, 0x0406, 0x041e, + 0x0458, 0x0470, 0x0485, 0x0497, 0x04bf, 0x04dd, 0x04f5, 0x0507, + 0x0513, 0x0550, 0x057d, 0x05c7, 0x0600, 0x062d, 0x0652, 0x0674, + 0x0680, 0x0695, 0x06a1, 0x06bc, 0x06ed, 0x070b, 0x071d, 0x073c, + 0x0751, 0x077f, 0x0794, 0x07b9, 0x07ce, 0x07f6, 0x080e, 0x082c, + // Entry 40 - 7F + 0x0844, 0x0878, 0x0893, 0x08c0, 0x08d8, 0x08f3, 0x0908, 0x092a, + 0x0945, 0x095d, 0x097e, 0x09ac, 0x09ca, 0x09d9, 0x0a10, 0x0a34, + 0x0a59, 0x0a71, 0x0a83, 0x0aa8, 0x0abd, 0x0ad5, 0x0afd, 0x0b15, + 0x0b21, 0x0b42, 0x0b66, 0x0b7e, 0x0b90, 0x0bae, 0x0be2, 0x0bf4, + 0x0c77, 0x0c8f, 0x0ca1, 0x0ccc, 0x0cdb, 0x0d16, 0x0d79, 0x0d97, + 0x0daf, 0x0dc1, 0x0dd6, 0x0dfb, 0x0e1c, 0x0e3a, 0x0e4f, 0x0e72, + 0x0e87, 0x0ef6, 0x0f05, 0x0f14, 0x0f2f, 0x0f44, 0x0f56, 0x0f65, + 0x0f7d, 0x0f92, 0x0fa4, 0x0fc8, 0x0fe3, 0x0ff8, 0x100d, 0x104d, + // Entry 80 - BF + 0x1066, 0x1085, 0x1097, 0x10c5, 0x10e0, 0x10f2, 0x1107, 0x1132, + 0x1162, 0x1174, 0x118c, 0x119e, 0x11bc, 0x11e3, 0x11fb, 0x120d, + 0x1225, 0x123d, 0x1255, 0x1279, 0x12b0, 0x12cb, 0x12f6, 0x1314, + 0x1320, 0x1350, 0x136b, 0x139d, 0x13db, 0x13f9, 0x1417, 0x143b, + 0x144d, 0x1468, 0x1483, 0x1492, 0x14aa, 0x14bf, 0x14dd, 0x14f2, + 0x151d, 0x152c, 0x155d, 0x1575, 0x158d, 0x15ae, 0x15c0, 0x15d5, + 0x15e1, 0x15ed, 0x1611, 0x161d, 0x162c, 0x1638, 0x166f, 0x16a4, + 0x16c8, 0x16e6, 0x16fb, 0x1744, 0x177e, 0x17a3, 0x17e3, 0x180a, + // Entry C0 - FF + 0x1816, 0x182b, 0x1840, 0x1877, 0x1892, 0x18aa, 0x18c2, 0x18d1, + 0x18e9, 0x190e, 0x1936, 0x194e, 0x1960, 0x1975, 0x1996, 0x19c1, + 0x19df, 0x1a1f, 0x1a3d, 0x1a62, 0x1a7e, 0x1a93, 0x1aab, 0x1ac3, + 0x1ae8, 0x1b22, 0x1b47, 0x1b72, 0x1b84, 0x1ba8, 0x1bdd, 0x1c1d, + 0x1c29, 0x1c76, 0x1c82, 0x1ca0, 0x1cc4, 0x1cd6, 0x1cfb, 0x1d2b, + 0x1d43, 0x1d55, 0x1d6d, 0x1da0, 0x1db2, 0x1dc4, 0x1de2, 0x1df7, + 0x1e0c, 0x1e4f, 0x1e6a, 0x1e7f, 0x1ea6, 0x1ecb, 0x1f26, 0x1f3e, + 0x1f88, 0x1fc5, 0x1fe0, 0x1ffb, 0x2039, 0x2048, 0x205a, 0x2066, + // Entry 100 - 13F + 0x2075, 0x20a3, 0x20bb, 0x20d9, 0x2110, 0x211f, 0x213a, 0x215c, + 0x2184, 0x219f, 0x21cd, 0x21fb, 0x222c, 0x225a, 0x2288, 0x22b6, + 0x22d7, 0x2305, 0x231d, 0x2342, 0x2364, 0x2395, 0x23bd, 0x23e1, + 0x23fc, 0x243a, 0x2458, 0x2467, 0x2489, 0x24ab, 0x24c0, 0x24eb, + 0x2513, 0x253b, 0x256c, +} // Size: 606 bytes + +var teRegionStr string = "" + // Size: 9380 bytes + "ఎసెషన్ దీవిఅండొర్రాయునైటెడ్ అరబ్ ఎమిరేట్స్ఆఫ్ఘనిస్తాన్ఆంటిగ్వా మరియు బార" + + "్బుడాఆంగవిల్లాఅల్బేనియాఆర్మేనియానేదేర్లేండ్స్ అంటిల్లిస్అంగోలాఅంటార్కట" + + "ికాఅర్జెంటీనాఅమెరికన్ సమోవాఆస్ట్రియాఆస్ట్రేలియాఅరుబాఆలేండ్ దీవులుఅజర్బ" + + "ైజాన్బోస్నియా మరియు హెర్జెగొవీనాబార్బడోస్బంగ్లాదేశ్బెల్జియంబుర్కినా ఫా" + + "సోబల్గేరియాబహ్రెయిన్బురుండిబెనిన్సెంట్ బర్తేలెమీబెర్ముడాబ్రూనైబొలీవియా" + + "కరీబియన్ నెదర్లాండ్స్బ్రెజిల్బహామాస్భూటాన్బొవెట్ దీవిబోట్స్వానాబెలారస్" + + "బెలిజ్కెనడాకోకోస్ (కీలింగ్) దీవులుకాంగో- కిన్షాసాసెంట్రల్ ఆఫ్రికన్ రిప" + + "బ్లిక్కాంగో- బ్రాజావిల్లిస్విట్జర్లాండ్ఐవరీ కోస్ట్కుక్ దీవులుచిలీకామెర" + + "ూన్చైనాకొలంబియాక్లిప్పర్టన్ దీవికోస్టా రికాక్యూబాకేప్ వెర్డేకురాకవోక్ర" + + "ిస్మస్ దీవిసైప్రస్చెక్ రిపబ్లిక్జర్మనీడియాగో గార్సియాజిబౌటిడెన్మార్క్డ" + + "ోమెనికడొమెనికన్ రిపబ్లిక్అల్జీరియాస్యూటా మరియు మెలిల్లాఈక్వడార్ఎస్టోని" + + "యాఈజిప్ట్పడమటి సహారాఎరిట్రియాస్పెయిన్ఇథియోపియాయురోపియన్ యునియన్ఫిన్లాం" + + "డ్ఫిజీఫాక్\u200cల్యాండ్ దీవులుమైక్రోనేశియఫారో దీవులుఫ్రాన్స్\u200cగాబన" + + "్యునైటెడ్ కింగ్\u200cడమ్గ్రెనెడాజార్జియాఫ్రెంచ్ గియానాగ్వేర్నసేఘనాజిబ్" + + "రాల్టార్గ్రీన్\u200cలాండ్గాంబియాగినియాగ్వాడేలోప్ఈక్వటోరియల్ గినియాగ్రీ" + + "స్దక్షిణ జార్జియా & దక్షిణ శాండ్విచ్ దీవులుగ్వాటిమాలగ్వామ్గినియా-బిస్స" + + "ావ్గయానాహాంకాంగ్ ఎస్ఏఆర్ చైనాహెర్డ్ & మెక్ డొనాల్డ్ దీవులుహోండురాస్క్ర" + + "ోయేషియాహైటిహంగేరీకేనరీ దీవులుఇండోనేషియాఐర్లాండ్ఇజ్రాయిల్ఐల్ ఆఫ్ మాన్భా" + + "రత దేశంబ్రిటీష్ భారతీయ సముద్రపు ప్రాంతంఇరాక్ఇరాన్ఐస్లాండ్ఇటలీజెర్సీజమై" + + "కాజోర్డాన్జపాన్కెన్యాకిర్గిజిస్తాన్కంబోడియాకిరిబాటికొమొరోస్సెంట్ కిట్ట" + + "్స్ మరియు నెవిస్ఉత్తర కొరియాదక్షిణ కొరియాకువైట్కేమాన్ దీవులుకజకస్తాన్ల" + + "ావోస్లెబనాన్సెంట్ లూసియాలిక్టెస్టేన్శ్రీలంకలైబీరియాలెసోతోలిథువేనియాలక్" + + "సంబర్గ్లాత్వియాలిబియామొరాక్కోమొనాకోమోల్డోవామోంటేనేగ్రోసెంట్ మార్టిన్మడ" + + "గాస్కర్మార్షల్ దీవులుమేసిడోనియామాలిమయన్మార్ (బర్మా)మంగోలియామాకావ్ ఎస్ఏ" + + "ఆర్ చైనాఉత్తర మరియానా దీవులుమార్టినిక్మౌరిటేనియామోంట్సేర్రాట్మాల్టామార" + + "ిషస్మాల్దీవులుమాలావిమెక్సికోమలేషియామొజాంబిక్నమీబియాక్రొత్త కాలెడోనియాన" + + "ైజర్నార్ఫాక్ దీవినైజీరియానికరాగువానెదర్లాండ్స్నార్వేనేపాల్నౌరునియున్యూ" + + "జిలాండ్ఒమన్పనామాపెరూఫ్రెంచ్ పోలినిషియాపాపువా న్యు గినియాఫిలిప్పీన్స్పా" + + "కిస్తాన్పోలాండ్సెంట్ పియెర్ మరియు మికెలాన్పిట్\u200cకెయిర్న్ దీవులుఫ్య" + + "ూర్టో రికోపాలస్తీనియన్ ప్రాంతాలుపోర్చుగల్పలావుపరాగ్వేకతర్ఒషీనియా బయటున" + + "్నవిరియూనియన్రోమానియాసెర్బియారష్యారువాండాసౌదీ అరేబియాసోలమన్ దీవులుసీషె" + + "ల్స్సూడాన్స్వీడన్సింగపూర్సెంట్ హెలినాస్లోవేనియాస్వాల్బార్డ్ మరియు యాన్" + + " మాయేన్స్లోవేకియాసియెర్రా లియాన్సాన్ మారినోసెనెగల్సోమాలియాసురినామ్దక్షిణ" + + " సూడాన్సావోటోమ్ మరియు ప్రిన్సిపేఎల్ సాల్వడోర్సింట్ మార్టెన్సిరియాస్వాజిల" + + "్యాండ్ట్రిస్టన్ డ కన్హాతుర్క్ మరియు కాలికోస్ దీవులుచాద్ఫ్రెంచ్ దక్షిణ " + + "ప్రాంతాలుటోగోథాయిలాండ్తజికిస్తాన్టోకేలావ్టిమోర్-లెస్టెతుర్కమేనిస్తాన్ట" + + "్యునీషియాటోంగాటర్కీట్రినిడాడ్ మరియు టొబాగోటువాలుతైవాన్టాంజానియాఉక్రెయి" + + "న్ఉగాండాసంయుక్త రాజ్య అమెరికా బయట ఉన్న దీవులుఅమెరికా సంయుక్త రాష్ట్రాల" + + "ుఉరుగువేఉజ్బెకిస్తాన్వాటికన్ నగరంసెంట్ విన్సెంట్ మరియు గ్రెనడీన్స్వెను" + + "జువేలాబ్రిటిష్ వర్జిన్ దీవులుయు.ఎస్. వర్జిన్ దీవులువియత్నాంవనాటువాలిస్" + + " మరియు ఫ్యుత్యునాసమోవాకొసోవోయెమెన్మాయొట్టిదక్షిణ ఆఫ్రికాజాంబియాజింబాబ్వే" + + "తెలియని ప్రాంతంప్రపంచంఆఫ్రికాఉత్తర అమెరికాదక్షిణ అమెరికాఒషీనియపశ్చిమ ఆ" + + "ఫ్రికా భూభాగంమధ్యమ అమెరికాతూర్పు ఆఫ్రికాఉత్తర ఆఫ్రికామధ్యమ ఆఫ్రికాదక్ష" + + "ిణ ఆఫ్రికా భూభాగంఅమెరికాలుఉత్తర అమెరికా భూభాగంకరిబ్బియన్తూర్పు ఆసియాదక" + + "్షిణ ఆసియానైరుతి ఆసియాదక్షిణ యూరోప్ఆస్ట్రేలేసియామెలనేశియమైక్రోనేశియ ప్" + + "రాంతంపాలినేషియాఆసియామధ్య ఆసియాపడమటి ఆసియాయూరోప్తూర్పు యూరోప్ఉత్తర యూరో" + + "ప్పశ్చిమ యూరోప్లాటిన్ అమెరికా" + +var teRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x001f, 0x0037, 0x0078, 0x009c, 0x00dd, 0x00f8, 0x0113, + 0x012e, 0x0174, 0x0186, 0x01a7, 0x01c5, 0x01ed, 0x0208, 0x0229, + 0x0238, 0x025d, 0x027b, 0x02c8, 0x02e3, 0x0301, 0x0319, 0x033e, + 0x0359, 0x0374, 0x0389, 0x039b, 0x03c6, 0x03de, 0x03f0, 0x0408, + 0x0445, 0x045d, 0x0472, 0x0484, 0x04a3, 0x04c1, 0x04d6, 0x04e8, + 0x04f7, 0x0534, 0x055d, 0x05aa, 0x05df, 0x0609, 0x0628, 0x0647, + 0x0653, 0x066b, 0x0677, 0x068f, 0x06c0, 0x06df, 0x06f1, 0x0710, + 0x0725, 0x074d, 0x0762, 0x078a, 0x079c, 0x07c7, 0x07d9, 0x07f7, + // Entry 40 - 7F + 0x080c, 0x0843, 0x085e, 0x0899, 0x08b1, 0x08cc, 0x08e1, 0x0900, + 0x091b, 0x0933, 0x094e, 0x097f, 0x099a, 0x09a6, 0x09dd, 0x09fe, + 0x0a1d, 0x0a38, 0x0a47, 0x0a7b, 0x0a93, 0x0aab, 0x0ad3, 0x0aee, + 0x0af7, 0x0b1b, 0x0b3f, 0x0b54, 0x0b66, 0x0b84, 0x0bb8, 0x0bca, + 0x0c39, 0x0c54, 0x0c66, 0x0c91, 0x0ca0, 0x0cdb, 0x0d28, 0x0d43, + 0x0d61, 0x0d6d, 0x0d7f, 0x0da1, 0x0dbf, 0x0dd7, 0x0df2, 0x0e12, + 0x0e2b, 0x0e85, 0x0e94, 0x0ea3, 0x0ebb, 0x0ec7, 0x0ed9, 0x0ee8, + 0x0f00, 0x0f0f, 0x0f21, 0x0f4b, 0x0f63, 0x0f7b, 0x0f93, 0x0fde, + // Entry 80 - BF + 0x1000, 0x1025, 0x1037, 0x105c, 0x1077, 0x1089, 0x109e, 0x10c0, + 0x10e4, 0x10f9, 0x1111, 0x1123, 0x1141, 0x115f, 0x1177, 0x1189, + 0x11a1, 0x11b3, 0x11cb, 0x11ec, 0x1214, 0x122f, 0x1257, 0x1275, + 0x1281, 0x12ab, 0x12c3, 0x12f8, 0x1330, 0x134e, 0x136c, 0x1393, + 0x13a5, 0x13ba, 0x13d8, 0x13ea, 0x1402, 0x1417, 0x1432, 0x1447, + 0x147b, 0x148a, 0x14af, 0x14c7, 0x14e2, 0x1506, 0x1518, 0x152a, + 0x1536, 0x1542, 0x1563, 0x156f, 0x157e, 0x158a, 0x15be, 0x15f0, + 0x1614, 0x1632, 0x1647, 0x1692, 0x16cc, 0x16f1, 0x1731, 0x174c, + // Entry C0 - FF + 0x175b, 0x1770, 0x177c, 0x17ad, 0x17c8, 0x17e0, 0x17f8, 0x1807, + 0x181c, 0x183e, 0x1863, 0x187b, 0x188d, 0x18a2, 0x18ba, 0x18dc, + 0x18fa, 0x194e, 0x196c, 0x1997, 0x19b6, 0x19cb, 0x19e3, 0x19fb, + 0x1a20, 0x1a67, 0x1a8c, 0x1ab4, 0x1ac6, 0x1aed, 0x1b1c, 0x1b6a, + 0x1b76, 0x1bba, 0x1bc6, 0x1be1, 0x1c02, 0x1c1a, 0x1c3f, 0x1c6c, + 0x1c8a, 0x1c99, 0x1ca8, 0x1ce9, 0x1cfb, 0x1d0d, 0x1d28, 0x1d43, + 0x1d55, 0x1dba, 0x1e04, 0x1e19, 0x1e40, 0x1e62, 0x1ebf, 0x1edd, + 0x1f1e, 0x1f58, 0x1f70, 0x1f7f, 0x1fc0, 0x1fcf, 0x1fe1, 0x1ff3, + // Entry 100 - 13F + 0x200b, 0x2033, 0x2048, 0x2063, 0x208e, 0x20a3, 0x20b8, 0x20dd, + 0x2105, 0x2117, 0x2152, 0x2177, 0x219f, 0x21c4, 0x21e9, 0x2224, + 0x223f, 0x2277, 0x2295, 0x22b7, 0x22d9, 0x22fb, 0x2320, 0x2347, + 0x235f, 0x2396, 0x23b4, 0x23c3, 0x23df, 0x23fe, 0x2410, 0x2435, + 0x2457, 0x247c, 0x24a4, +} // Size: 606 bytes + +var thRegionStr string = "" + // Size: 9078 bytes + "เกาะแอสเซนชันอันดอร์ราสหรัฐอาหรับเอมิเรตส์อัฟกานิสถานแอนติกาและบาร์บูดาแ" + + "องกวิลลาแอลเบเนียอาร์เมเนียเนเธอร์แลนด์แอนทิลลิสแองโกลาแอนตาร์กติกาอาร" + + "์เจนตินาอเมริกันซามัวออสเตรียออสเตรเลียอารูบาหมู่เกาะโอลันด์อาเซอร์ไบจ" + + "านบอสเนียและเฮอร์เซโกวีนาบาร์เบโดสบังกลาเทศเบลเยียมบูร์กินาฟาโซบัลแกเร" + + "ียบาห์เรนบุรุนดีเบนินเซนต์บาร์เธเลมีเบอร์มิวดาบรูไนโบลิเวียเนเธอร์แลนด" + + "์แคริบเบียนบราซิลบาฮามาสภูฏานเกาะบูเวตบอตสวานาเบลารุสเบลีซแคนาดาหมู่เก" + + "าะโคโคส (คีลิง)คองโก-กินชาซาสาธารณรัฐแอฟริกากลางคองโก-บราซซาวิลสวิตเซอ" + + "ร์แลนด์ไอวอรี่โคสต์หมู่เกาะคุกชิลีแคเมอรูนจีนโคลอมเบียเกาะคลิปเปอร์ตัน" + + "คอสตาริกาคิวบาเคปเวิร์ดคูราเซาเกาะคริสต์มาสไซปรัสสาธารณรัฐเช็กเยอรมนีด" + + "ิเอโกการ์เซียจิบูตีเดนมาร์กโดมินิกาสาธารณรัฐโดมินิกันแอลจีเรียซีโอตาแล" + + "ะเมลิลลาเอกวาดอร์เอสโตเนียอียิปต์ซาฮาราตะวันตกเอริเทรียสเปนเอธิโอเปียส" + + "หภาพยุโรปฟินแลนด์ฟิจิหมู่เกาะฟอล์กแลนด์ไมโครนีเซียหมู่เกาะแฟโรฝรั่งเศส" + + "กาบองสหราชอาณาจักรเกรเนดาจอร์เจียเฟรนช์เกียนาเกิร์นซีย์กานายิบรอลตาร์ก" + + "รีนแลนด์แกมเบียกินีกวาเดอลูปอิเควทอเรียลกินีกรีซเกาะเซาท์จอร์เจียและหม" + + "ู่เกาะเซาท์แซนด์วิชกัวเตมาลากวมกินี-บิสเซากายอานาเขตปกครองพิเศษฮ่องกงแ" + + "ห่งสาธารณรัฐประชาชนจีนเกาะเฮิร์ดและหมู่เกาะแมกดอนัลด์ฮอนดูรัสโครเอเชีย" + + "เฮติฮังการีหมู่เกาะคานารีอินโดนีเซียไอร์แลนด์อิสราเอลเกาะแมนอินเดียบริ" + + "ติชอินเดียนโอเชียนเทร์ริทอรีอิรักอิหร่านไอซ์แลนด์อิตาลีเจอร์ซีย์จาเมกา" + + "จอร์แดนญี่ปุ่นเคนยาคีร์กีซสถานกัมพูชาคิริบาสคอโมโรสเซนต์คิตส์และเนวิสเ" + + "กาหลีเหนือเกาหลีใต้คูเวตหมู่เกาะเคย์แมนคาซัคสถานลาวเลบานอนเซนต์ลูเซียล" + + "ิกเตนสไตน์ศรีลังกาไลบีเรียเลโซโทลิทัวเนียลักเซมเบิร์กลัตเวียลิเบียโมร็" + + "อกโกโมนาโกมอลโดวามอนเตเนโกรเซนต์มาตินมาดากัสการ์หมู่เกาะมาร์แชลล์มาซิโ" + + "ดเนียมาลีเมียนม่าร์ (พม่า)มองโกเลียเขตปกครองพิเศษมาเก๊าแห่งสาธารณรัฐปร" + + "ะชาชนจีนหมู่เกาะนอร์เทิร์นมาเรียนามาร์ตินีกมอริเตเนียมอนต์เซอร์รัตมอลต" + + "ามอริเชียสมัลดีฟส์มาลาวีเม็กซิโกมาเลเซียโมซัมบิกนามิเบียนิวแคลิโดเนียไ" + + "นเจอร์เกาะนอร์ฟอล์กไนจีเรียนิการากัวเนเธอร์แลนด์นอร์เวย์เนปาลนาอูรูนีอ" + + "ูเอนิวซีแลนด์โอมานปานามาเปรูเฟรนช์โปลินีเซียปาปัวนิวกินีฟิลิปปินส์ปากี" + + "สถานโปแลนด์แซงปีแยร์และมีเกอลงหมู่เกาะพิตแคร์นเปอร์โตริโกดินแดนปาเลสไต" + + "น์โปรตุเกสปาเลาปารากวัยกาตาร์เอาต์ไลอิงโอเชียเนียเรอูนียงโรมาเนียเซอร์" + + "เบียรัสเซียรวันดาซาอุดีอาระเบียหมู่เกาะโซโลมอนเซเชลส์ซูดานสวีเดนสิงคโป" + + "ร์เซนต์เฮเลนาสโลวีเนียสฟาลบาร์และยานไมเอนสโลวะเกียเซียร์ราลีโอนซานมารี" + + "โนเซเนกัลโซมาเลียซูรินาเมซูดานใต้เซาตูเมและปรินซิปีเอลซัลวาดอร์เซนต์มา" + + "ร์ตินซีเรียสวาซิแลนด์ทริสตัน เดอ คูนาหมู่เกาะเติกส์และหมู่เกาะเคคอสชาด" + + "เฟรนช์เซาเทิร์นเทร์ริทอรีส์โตโกไทยทาจิกิสถานโตเกเลาติมอร์-เลสเตเติร์กเ" + + "มนิสถานตูนิเซียตองกาตุรกีตรินิแดดและโตเบโกตูวาลูไต้หวันแทนซาเนียยูเครน" + + "ยูกันดาหมู่เกาะรอบนอกของสหรัฐอเมริกาสหรัฐอเมริกาอุรุกวัยอุซเบกิสถานนคร" + + "วาติกันเซนต์วินเซนต์และเกรนาดีนส์เวเนซุเอลาหมู่เกาะบริติชเวอร์จินหมู่เ" + + "กาะยูเอสเวอร์จินเวียดนามวานูอาตูวาลลิสและฟุตูนาซามัวโคโซโวเยเมนมายอตแอ" + + "ฟริกาใต้แซมเบียซิมบับเวภูมิภาคที่ไม่รู้จักโลกแอฟริกาอเมริกาเหนืออเมริก" + + "าใต้โอเชียเนียแอฟริกาตะวันตกอเมริกากลางแอฟริกาตะวันออกแอฟริกาเหนือแอฟร" + + "ิกากลางแอฟริกาตอนใต้อเมริกาอเมริกาตอนเหนือแคริบเบียนเอเชียตะวันออกเอเช" + + "ียใต้เอเชียตะวันออกเฉียงใต้ยุโรปใต้ออสตราเลเซียเมลานีเซียเขตไมโครนีเซี" + + "ยโปลินีเซียเอเชียเอเชียกลางเอเชียตะวันตกยุโรปยุโรปตะวันออกยุโรปเหนือยุ" + + "โรปตะวันตกละตินอเมริกา" + +var thRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0027, 0x0042, 0x007e, 0x009f, 0x00d5, 0x00f0, 0x010b, + 0x0129, 0x0168, 0x017d, 0x01a1, 0x01c2, 0x01e9, 0x0201, 0x021f, + 0x0231, 0x025e, 0x0282, 0x02c7, 0x02e2, 0x02fd, 0x0315, 0x0339, + 0x0354, 0x0369, 0x037e, 0x038d, 0x03ba, 0x03d8, 0x03e7, 0x03ff, + 0x0441, 0x0453, 0x0468, 0x0477, 0x0492, 0x04aa, 0x04bf, 0x04ce, + 0x04e0, 0x0519, 0x053e, 0x057a, 0x05a5, 0x05cf, 0x05f3, 0x0614, + 0x0620, 0x0638, 0x0641, 0x065c, 0x068c, 0x06a7, 0x06b6, 0x06d1, + 0x06e6, 0x070d, 0x071f, 0x0746, 0x075b, 0x0785, 0x0797, 0x07af, + // Entry 40 - 7F + 0x07c7, 0x07fd, 0x0818, 0x0848, 0x0863, 0x087e, 0x0893, 0x08ba, + 0x08d5, 0x08e1, 0x08ff, 0x091d, 0x0935, 0x0941, 0x0977, 0x0998, + 0x09bc, 0x09d4, 0x09e3, 0x0a0a, 0x0a1f, 0x0a37, 0x0a5b, 0x0a79, + 0x0a85, 0x0aa3, 0x0abe, 0x0ad3, 0x0adf, 0x0afa, 0x0b2a, 0x0b36, + 0x0bb1, 0x0bcc, 0x0bd5, 0x0bf4, 0x0c09, 0x0c8a, 0x0ce7, 0x0cff, + 0x0d1a, 0x0d26, 0x0d3b, 0x0d65, 0x0d86, 0x0da1, 0x0db9, 0x0dce, + 0x0de3, 0x0e40, 0x0e4f, 0x0e64, 0x0e7f, 0x0e91, 0x0eac, 0x0ebe, + 0x0ed3, 0x0ee8, 0x0ef7, 0x0f18, 0x0f2d, 0x0f42, 0x0f57, 0x0f8d, + // Entry 80 - BF + 0x0fae, 0x0fc9, 0x0fd8, 0x1005, 0x1020, 0x1029, 0x103e, 0x105f, + 0x1080, 0x1098, 0x10b0, 0x10c2, 0x10dd, 0x1101, 0x1116, 0x1128, + 0x1140, 0x1152, 0x1167, 0x1185, 0x11a3, 0x11c4, 0x11f7, 0x1215, + 0x1221, 0x124e, 0x1269, 0x12ea, 0x1338, 0x1353, 0x1371, 0x1398, + 0x13a7, 0x13c2, 0x13da, 0x13ec, 0x1404, 0x141c, 0x1434, 0x144c, + 0x1473, 0x1488, 0x14af, 0x14c7, 0x14e2, 0x1506, 0x151e, 0x152d, + 0x153f, 0x1551, 0x156f, 0x157e, 0x1590, 0x159c, 0x15cc, 0x15f0, + 0x160e, 0x1626, 0x163b, 0x1674, 0x16a4, 0x16c5, 0x16f2, 0x170a, + // Entry C0 - FF + 0x1719, 0x1731, 0x1743, 0x177f, 0x1797, 0x17af, 0x17ca, 0x17df, + 0x17f1, 0x181b, 0x1848, 0x185d, 0x186c, 0x187e, 0x1896, 0x18b7, + 0x18d2, 0x190b, 0x1926, 0x194d, 0x1968, 0x197d, 0x1995, 0x19ad, + 0x19c5, 0x19fb, 0x1a1f, 0x1a43, 0x1a55, 0x1a73, 0x1a9f, 0x1af9, + 0x1b02, 0x1b53, 0x1b5f, 0x1b68, 0x1b86, 0x1b9b, 0x1bbd, 0x1be7, + 0x1bff, 0x1c0e, 0x1c1d, 0x1c50, 0x1c62, 0x1c77, 0x1c92, 0x1ca4, + 0x1cb9, 0x1d10, 0x1d34, 0x1d4c, 0x1d6d, 0x1d8b, 0x1dd9, 0x1df7, + 0x1e39, 0x1e78, 0x1e90, 0x1ea8, 0x1ed5, 0x1ee4, 0x1ef6, 0x1f05, + // Entry 100 - 13F + 0x1f14, 0x1f32, 0x1f47, 0x1f5f, 0x1f98, 0x1fa1, 0x1fb6, 0x1fda, + 0x1ff8, 0x2016, 0x2040, 0x2061, 0x208e, 0x20b2, 0x20d3, 0x20fa, + 0x210f, 0x213c, 0x215a, 0x2184, 0x219f, 0x21e1, 0x21f9, 0x221d, + 0x223b, 0x2265, 0x2283, 0x2295, 0x22b3, 0x22da, 0x22e9, 0x2310, + 0x232e, 0x2352, 0x2376, +} // Size: 606 bytes + +var trRegionStr string = "" + // Size: 3053 bytes + "Ascension AdasıAndorraBirleşik Arap EmirlikleriAfganistanAntigua ve Barb" + + "udaAnguillaArnavutlukErmenistanHollanda AntilleriAngolaAntarktikaArjanti" + + "nAmerikan SamoasıAvusturyaAvustralyaArubaÅland AdalarıAzerbaycanBosna He" + + "rsekBarbadosBangladeşBelçikaBurkina FasoBulgaristanBahreynBurundiBeninSa" + + "int BarthelemyBermudaBruneiBolivyaKarayip HollandaBrezilyaBahamalarButan" + + "Bouvet AdasıBotsvanaBeyaz RusyaBelizeKanadaCocos (Keeling) AdalarıKongo " + + "- KinşasaOrta Afrika CumhuriyetiKongo - BrazavilİsviçreFildişi SahiliCoo" + + "k AdalarıŞiliKamerunÇinKolombiyaClipperton AdasıKosta RikaKübaCape Verde" + + "CuraçaoChristmas AdasıGüney Kıbrıs Rum KesimiÇek CumhuriyetiAlmanyaDiego" + + " GarciaCibutiDanimarkaDominikaDominik CumhuriyetiCezayirSepte ve Melilla" + + "EkvadorEstonyaMısırBatı SaharaEritreİspanyaEtiyopyaAvrupa BirliğiFinland" + + "iyaFijiFalkland AdalarıMikronezyaFaroe AdalarıFransaGabonBirleşik Krallı" + + "kGrenadaGürcistanFransız GuyanasıGuernseyGanaCebelitarıkGrönlandGambiyaG" + + "ineGuadalupeEkvator GinesiYunanistanGüney Georgia ve Güney Sandwich Adal" + + "arıGuatemalaGuamGine-BissauGuyanaÇin Hong Kong ÖYBHeard Adası ve McDonal" + + "d AdalarıHondurasHırvatistanHaitiMacaristanKanarya AdalarıEndonezyaİrlan" + + "daİsrailMan AdasıHindistanBritanya Hint Okyanusu TopraklarıIrakİranİzlan" + + "daİtalyaJerseyJamaikaÜrdünJaponyaKenyaKırgızistanKamboçyaKiribatiKomorla" + + "rSaint Kitts ve NevisKuzey KoreGüney KoreKuveytCayman AdalarıKazakistanL" + + "aosLübnanSaint LuciaLiechtensteinSri LankaLiberyaLesotoLitvanyaLüksembur" + + "gLetonyaLibyaFasMonakoMoldovaKaradağSaint MartinMadagaskarMarshall Adala" + + "rıMakedonyaMaliMyanmar (Burma)MoğolistanÇin Makao ÖYBKuzey Mariana Adala" + + "rıMartinikMoritanyaMontserratMaltaMauritiusMaldivlerMalaviMeksikaMalezya" + + "MozambikNamibyaYeni KaledonyaNijerNorfolk AdasıNijeryaNikaraguaHollandaN" + + "orveçNepalNauruNiueYeni ZelandaUmmanPanamaPeruFransız PolinezyasıPapua Y" + + "eni GineFilipinlerPakistanPolonyaSaint Pierre ve MiquelonPitcairn Adalar" + + "ıPorto RikoFilistin BölgeleriPortekizPalauParaguayKatarUzak OkyanusyaRé" + + "unionRomanyaSırbistanRusyaRuandaSuudi ArabistanSolomon AdalarıSeyşellerS" + + "udanİsveçSingapurSaint HelenaSlovenyaSvalbard ve Jan Mayen AdalarıSlovak" + + "yaSierra LeoneSan MarinoSenegalSomaliSurinamGüney SudanSão Tomé ve Prínc" + + "ipeEl SalvadorSint MaartenSuriyeSvazilandTristan da CunhaTurks ve Caicos" + + " AdalarıÇadFransız Güney TopraklarıTogoTaylandTacikistanTokelauTimor-Les" + + "teTürkmenistanTunusTongaTürkiyeTrinidad ve TobagoTuvaluTayvanTanzanyaUkr" + + "aynaUgandaABD Uzak AdalarıABDUruguayÖzbekistanVatikanSaint Vincent ve Gr" + + "enadinlerVenezuelaBritanya Virjin AdalarıABD Virjin AdalarıVietnamVanuat" + + "uWallis ve Futuna AdalarıSamoaKosovaYemenMayotteGüney AfrikaZambiyaZimba" + + "bveBilinmeyen BölgeDünyaAfrikaKuzey AmerikaGüney AmerikaOkyanusyaBatı Af" + + "rikaOrta AmerikaDoğu AfrikaKuzey AfrikaOrta AfrikaAfrika’nın GüneyiAmeri" + + "kaAmerika’nın KuzeyiKarayiplerDoğu AsyaGüney AsyaGüneydoğu AsyaGüney Avr" + + "upaAvustralasyaMelanezyaMikronezya BölgesiPolinezyaAsyaOrta AsyaBatı Asy" + + "aAvrupaDoğu AvrupaKuzey AvrupaBatı AvrupaLatin Amerika" + +var trRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0010, 0x0017, 0x0031, 0x003b, 0x004d, 0x0055, 0x005f, + 0x0069, 0x007b, 0x0081, 0x008b, 0x0093, 0x00a4, 0x00ad, 0x00b7, + 0x00bc, 0x00cb, 0x00d5, 0x00e1, 0x00e9, 0x00f3, 0x00fb, 0x0107, + 0x0112, 0x0119, 0x0120, 0x0125, 0x0135, 0x013c, 0x0142, 0x0149, + 0x0159, 0x0161, 0x016a, 0x016f, 0x017c, 0x0184, 0x018f, 0x0195, + 0x019b, 0x01b3, 0x01c3, 0x01da, 0x01ea, 0x01f3, 0x0202, 0x020f, + 0x0214, 0x021b, 0x021f, 0x0228, 0x0239, 0x0243, 0x0248, 0x0252, + 0x025a, 0x026a, 0x0284, 0x0294, 0x029b, 0x02a7, 0x02ad, 0x02b6, + // Entry 40 - 7F + 0x02be, 0x02d1, 0x02d8, 0x02e8, 0x02ef, 0x02f6, 0x02fd, 0x0309, + 0x030f, 0x0317, 0x031f, 0x032e, 0x0338, 0x033c, 0x034d, 0x0357, + 0x0365, 0x036b, 0x0370, 0x0382, 0x0389, 0x0393, 0x03a5, 0x03ad, + 0x03b1, 0x03bd, 0x03c6, 0x03cd, 0x03d1, 0x03da, 0x03e8, 0x03f2, + 0x041c, 0x0425, 0x0429, 0x0434, 0x043a, 0x044d, 0x046e, 0x0476, + 0x0482, 0x0487, 0x0491, 0x04a1, 0x04aa, 0x04b2, 0x04b9, 0x04c3, + 0x04cc, 0x04ee, 0x04f2, 0x04f7, 0x04ff, 0x0506, 0x050c, 0x0513, + 0x051a, 0x0521, 0x0526, 0x0533, 0x053c, 0x0544, 0x054c, 0x0560, + // Entry 80 - BF + 0x056a, 0x0575, 0x057b, 0x058a, 0x0594, 0x0598, 0x059f, 0x05aa, + 0x05b7, 0x05c0, 0x05c7, 0x05cd, 0x05d5, 0x05e0, 0x05e7, 0x05ec, + 0x05ef, 0x05f5, 0x05fc, 0x0604, 0x0610, 0x061a, 0x062b, 0x0634, + 0x0638, 0x0647, 0x0652, 0x0661, 0x0677, 0x067f, 0x0688, 0x0692, + 0x0697, 0x06a0, 0x06a9, 0x06af, 0x06b6, 0x06bd, 0x06c5, 0x06cc, + 0x06da, 0x06df, 0x06ed, 0x06f4, 0x06fd, 0x0705, 0x070c, 0x0711, + 0x0716, 0x071a, 0x0726, 0x072b, 0x0731, 0x0735, 0x074a, 0x0759, + 0x0763, 0x076b, 0x0772, 0x078a, 0x079b, 0x07a5, 0x07b8, 0x07c0, + // Entry C0 - FF + 0x07c5, 0x07cd, 0x07d2, 0x07e0, 0x07e8, 0x07ef, 0x07f9, 0x07fe, + 0x0804, 0x0813, 0x0823, 0x082d, 0x0832, 0x0839, 0x0841, 0x084d, + 0x0855, 0x0873, 0x087b, 0x0887, 0x0891, 0x0898, 0x089e, 0x08a5, + 0x08b1, 0x08c8, 0x08d3, 0x08df, 0x08e5, 0x08ee, 0x08fe, 0x0916, + 0x091a, 0x0935, 0x0939, 0x0940, 0x094a, 0x0951, 0x095c, 0x0969, + 0x096e, 0x0973, 0x097b, 0x098d, 0x0993, 0x0999, 0x09a1, 0x09a8, + 0x09ae, 0x09bf, 0x09c2, 0x09c9, 0x09d4, 0x09db, 0x09f7, 0x0a00, + 0x0a18, 0x0a2b, 0x0a32, 0x0a39, 0x0a52, 0x0a57, 0x0a5d, 0x0a62, + // Entry 100 - 13F + 0x0a69, 0x0a76, 0x0a7d, 0x0a85, 0x0a96, 0x0a9c, 0x0aa2, 0x0aaf, + 0x0abd, 0x0ac6, 0x0ad2, 0x0ade, 0x0aea, 0x0af6, 0x0b01, 0x0b16, + 0x0b1d, 0x0b32, 0x0b3c, 0x0b46, 0x0b51, 0x0b61, 0x0b6e, 0x0b7a, + 0x0b83, 0x0b96, 0x0b9f, 0x0ba3, 0x0bac, 0x0bb6, 0x0bbc, 0x0bc8, + 0x0bd4, 0x0be0, 0x0bed, +} // Size: 606 bytes + +var ukRegionStr string = "" + // Size: 6146 bytes + "Острів ВознесінняАндорраОбʼєднані Арабські ЕміратиАфганістанАнтигуа і Ба" + + "рбудаАнгільяАлбаніяВірменіяНідерландські Антильські ОстровиАнголаАнтарк" + + "тикаАргентинаАмериканське СамоаАвстріяАвстраліяАрубаАландські островиАз" + + "ербайджанБоснія і ГерцоговинаБарбадосБангладешБельгіяБуркіна-ФасоБолгар" + + "іяБахрейнБурундіБенінСен-БартельміБермудські островиБрунейБолівіяНідерл" + + "андські Карибські островиБразиліяБагамські ОстровиБутанОстрів БувеБотсв" + + "анаБілорусьБелізКанадаКокосові (Кілінгові) островиКонго – КіншасаЦентра" + + "льноафриканська РеспублікаКонго – БраззавільШвейцаріяКот-д’ІвуарОстрови" + + " КукаЧиліКамерунКитайКолумбіяОстрів КліппертонКоста-РикаКубаКабо ВердеКю" + + "расаоОстрів РіздваКіпрЧехіяНімеччинаДієго-ГарсіяДжибутіДаніяДомінікаДом" + + "ініканська РеспублікаАлжирСеута і МелільяЕквадорЕстоніяЄгипетЗахідна Са" + + "хараЕритреяІспаніяЕфіопіяЄвропейський СоюзФінляндіяФіджіФолклендські ос" + + "тровиМікронезіяФарерські островиФранціяГабонВелика БританіяГренадаГрузі" + + "яФранцузька ГвіанаГернсіГанаГібралтарГренландіяГамбіяГвінеяГваделупаЕкв" + + "аторіальна ГвінеяГреціяПівденна Джорджія та Південні Сандвічеві острови" + + "ГватемалаГуамГвінея-БісауГаянаГонконг, О.А.Р. КитаюОстрови Херд і Мак-Д" + + "ональдГондурасХорватіяГаїтіУгорщинаКанарські островиІндонезіяІрландіяІз" + + "раїльОстрів МенІндіяБританські території в Індійському океаніІракІранІс" + + "ландіяІталіяДжерсіЯмайкаЙорданіяЯпоніяКеніяКиргизстанКамбоджаКірибатіКо" + + "морські островиСент-Кітс і НевісПівнічна КореяПівденна КореяКувейтКайма" + + "нові островиКазахстанЛаосЛіванСент-ЛюсіяЛіхтенштейнШрі-ЛанкаЛіберіяЛесо" + + "тоЛитваЛюксембургЛатвіяЛівіяМароккоМонакоМолдоваЧорногоріяСен-МартенМад" + + "агаскарМаршаллові ОстровиМакедоніяМаліМʼянма (Бірма)МонголіяМакао, О.А." + + "Р КитаюПівнічні Маріанські островиМартинікаМавританіяМонтсерратМальтаМа" + + "врикійМальдівиМалавіМексикаМалайзіяМозамбікНамібіяНова КаледоніяНігерОс" + + "трів НорфолкНігеріяНікарагуаНідерландиНорвегіяНепалНауруНіуеНова Зеланд" + + "іяОманПанамаПеруФранцузька ПолінезіяПапуа Нова ГвінеяФіліппіниПакистанП" + + "ольщаСен-Пʼєр і МікелонОстрови ПіткернПуерто-РикоПалестинські території" + + "ПортугаліяПалауПарагвайКатарВіддалені острови ОкеаніїРеюньйонРумуніяСер" + + "біяРосіяРуандаСаудівська АравіяСоломонові ОстровиСейшельські островиСуд" + + "анШвеціяСінгапурОстрів Святої ЄлениСловеніяОстрови Свальбард і Ян-МаєнС" + + "ловаччинаСьєрра-ЛеонеСан-МариноСенегалСомаліСуринамПівденний СуданСан-Т" + + "оме і ПрінсіпіСальвадорСінт-МартенСиріяСвазілендТрістан-да-КуньяОстрови" + + " Теркс і КайкосЧадФранцузькі Південні ТериторіїТогоТаїландТаджикистанТок" + + "елауТимор-ЛештіТуркменістанТунісТонгаТуреччинаТринідад і ТобагоТувалуТа" + + "йваньТанзаніяУкраїнаУгандаВіддалені острови СШАСШАУругвайУзбекистанВати" + + "канСент-Вінсент і ГренадиниВенесуелаБританські Віргінські островиВіргін" + + "ські острови, СШАВʼєтнамВануатуВолліс і ФутунаСамоаКосовоЄменМайоттаПів" + + "денно-Африканська РеспублікаЗамбіяЗімбабвеНевідомий регіонСвітАфрикаПів" + + "нічна АмерикаПівденна АмерикаОкеаніяЗахідна АфрикаЦентральна АмерикаСхі" + + "дна АфрикаПівнічна АфрикаЦентральна АфрикаПівденна АфрикаАмерикаПівнічн" + + "а Америка (регіон)Карибський басейнСхідна АзіяПівденна АзіяПівденно-Схі" + + "дна АзіяПівденна ЄвропаАвстралазіяМеланезіяМікронезійський регіонПоліне" + + "зіяАзіяЦентральна АзіяЗахідна АзіяЄвропаСхідна ЄвропаПівнічна ЄвропаЗах" + + "ідна ЄвропаЛатинська Америка" + +var ukRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0021, 0x002f, 0x0061, 0x0075, 0x0095, 0x00a3, 0x00b1, + 0x00c1, 0x00ff, 0x010b, 0x011f, 0x0131, 0x0154, 0x0162, 0x0174, + 0x017e, 0x019f, 0x01b5, 0x01db, 0x01eb, 0x01fd, 0x020b, 0x0222, + 0x0232, 0x0240, 0x024e, 0x0258, 0x0271, 0x0294, 0x02a0, 0x02ae, + 0x02ea, 0x02fa, 0x031b, 0x0325, 0x033a, 0x034a, 0x035a, 0x0364, + 0x0370, 0x03a4, 0x03c1, 0x0400, 0x0423, 0x0435, 0x044b, 0x0462, + 0x046a, 0x0478, 0x0482, 0x0492, 0x04b3, 0x04c6, 0x04ce, 0x04e1, + 0x04ef, 0x0508, 0x0510, 0x051a, 0x052c, 0x0543, 0x0551, 0x055b, + // Entry 40 - 7F + 0x056b, 0x059a, 0x05a4, 0x05c0, 0x05ce, 0x05dc, 0x05e8, 0x0603, + 0x0611, 0x061f, 0x062d, 0x064e, 0x0660, 0x066a, 0x0691, 0x06a5, + 0x06c6, 0x06d4, 0x06de, 0x06fb, 0x0709, 0x0715, 0x0736, 0x0742, + 0x074a, 0x075c, 0x0770, 0x077c, 0x0788, 0x079a, 0x07c1, 0x07cd, + 0x0828, 0x083a, 0x0842, 0x0859, 0x0863, 0x0887, 0x08b7, 0x08c7, + 0x08d7, 0x08e1, 0x08f1, 0x0912, 0x0924, 0x0934, 0x0942, 0x0955, + 0x095f, 0x09ad, 0x09b5, 0x09bd, 0x09cd, 0x09d9, 0x09e5, 0x09f1, + 0x0a01, 0x0a0d, 0x0a17, 0x0a2b, 0x0a3b, 0x0a4b, 0x0a6c, 0x0a8b, + // Entry 80 - BF + 0x0aa6, 0x0ac1, 0x0acd, 0x0aee, 0x0b00, 0x0b08, 0x0b12, 0x0b25, + 0x0b3b, 0x0b4c, 0x0b5a, 0x0b66, 0x0b70, 0x0b84, 0x0b90, 0x0b9a, + 0x0ba8, 0x0bb4, 0x0bc2, 0x0bd6, 0x0be9, 0x0bfd, 0x0c20, 0x0c32, + 0x0c3a, 0x0c53, 0x0c63, 0x0c82, 0x0cb6, 0x0cc8, 0x0cdc, 0x0cf0, + 0x0cfc, 0x0d0c, 0x0d1c, 0x0d28, 0x0d36, 0x0d46, 0x0d56, 0x0d64, + 0x0d7f, 0x0d89, 0x0da4, 0x0db2, 0x0dc4, 0x0dd8, 0x0de8, 0x0df2, + 0x0dfc, 0x0e04, 0x0e1d, 0x0e25, 0x0e31, 0x0e39, 0x0e60, 0x0e80, + 0x0e92, 0x0ea2, 0x0eae, 0x0ecf, 0x0eec, 0x0f01, 0x0f2c, 0x0f40, + // Entry C0 - FF + 0x0f4a, 0x0f5a, 0x0f64, 0x0f94, 0x0fa4, 0x0fb2, 0x0fbe, 0x0fc8, + 0x0fd4, 0x0ff5, 0x1018, 0x103d, 0x1047, 0x1053, 0x1063, 0x1087, + 0x1097, 0x10c9, 0x10dd, 0x10f4, 0x1107, 0x1115, 0x1121, 0x112f, + 0x114c, 0x116f, 0x1181, 0x1196, 0x11a0, 0x11b2, 0x11d0, 0x11f9, + 0x11ff, 0x1237, 0x123f, 0x124d, 0x1263, 0x1271, 0x1286, 0x129e, + 0x12a8, 0x12b2, 0x12c4, 0x12e4, 0x12f0, 0x12fe, 0x130e, 0x131c, + 0x1328, 0x1350, 0x1356, 0x1364, 0x1378, 0x1386, 0x13b3, 0x13c5, + 0x13fd, 0x1428, 0x1436, 0x1444, 0x1460, 0x146a, 0x1476, 0x147e, + // Entry 100 - 13F + 0x148c, 0x14c8, 0x14d4, 0x14e4, 0x1503, 0x150b, 0x1517, 0x1536, + 0x1555, 0x1563, 0x157e, 0x15a1, 0x15ba, 0x15d7, 0x15f8, 0x1615, + 0x1623, 0x1651, 0x1672, 0x1687, 0x16a0, 0x16c6, 0x16e3, 0x16f9, + 0x170b, 0x1736, 0x1748, 0x1750, 0x176d, 0x1784, 0x1790, 0x17a9, + 0x17c6, 0x17e1, 0x1802, +} // Size: 606 bytes + +var urRegionStr string = "" + // Size: 5159 bytes + "اسینشن آئلینڈانڈورامتحدہ عرب اماراتافغانستانانٹیگوا اور باربوداانگوئیلاا" + + "لبانیہآرمینیانیدرلینڈز انٹیلیزانگولاانٹارکٹیکاارجنٹیناامریکی ساموآآسٹری" + + "اآسٹریلیااروباآلینڈ آئلینڈزآذربائجانبوسنیا اور ہرزیگووینابارباڈوسبنگلہ " + + "دیشبیلجیمبرکینا فاسوبلغاریہبحرینبرونڈیبیننسینٹ برتھلیمیبرمودابرونئیبولی" + + "ویاکریبیائی نیدرلینڈزبرازیلبہاماسبھوٹانبؤویٹ آئلینڈبوتسوانابیلاروسبیلائ" + + "زکینیڈاکوکوس (کیلنگ) جزائرکانگو - کنشاساوسط افریقی جمہوریہکانگو - برازا" + + "ویلےسوئٹزر لینڈکوٹ ڈی آئیوریکک آئلینڈزچلیکیمرونچینکولمبیاکلپرٹن آئلینڈک" + + "وسٹا ریکاکیوباکیپ ورڈیکیوراکاؤکرسمس آئلینڈقبرصچیک جمہوریہجرمنیڈائجو گار" + + "سیاجبوتیڈنمارکڈومنیکاڈومنیکن جمہوریہالجیریاسیئوٹا اور میلیلاایکواڈوراسٹ" + + "ونیامصرمغربی صحارااریٹیریاہسپانیہایتھوپیایوروپی یونینفن لینڈفجیفاکلینڈ " + + "جزائرمائکرونیشیاجزائر فاروفرانسگیبونسلطنت متحدہگریناڈاجارجیافرینچ گیانا" + + "گوئرنسیگھاناجبل الطارقگرین لینڈگامبیاگنیگواڈیلوپاستوائی گیانایونانجنوبی" + + " جارجیا اور جنوبی سینڈوچ جزائرگواٹے مالاگوآمگنی بساؤگیاناہانگ کانگ SAR چ" + + "ینہیئرڈ آئلینڈ اور میکڈونالڈ آئلینڈزہونڈاروسکروشیاہیتیہنگریکینری آئلینڈ" + + "زانڈونیشیاآئرلینڈاسرائیلآئل آف مینبھارتبرطانوی ہندوستانی سمندری خطہعراق" + + "ایرانآئس لینڈاٹلیجرسیجمائیکااردنجاپانکینیاکرغزستانکمبوڈیاکریباتیکوموروس" + + "سینٹ کٹس اور نیویسشمالی کوریاجنوبی کوریاکویتکیمین آئلینڈزقزاخستانلاؤسلب" + + "نانسینٹ لوسیالیشٹنسٹائنسری لنکالائبیریالیسوتھولتھوانیالگژمبرگلٹویالیبیا" + + "مراقشموناکومالدووامونٹے نیگروسینٹ مارٹنمڈغاسکرمارشل آئلینڈزمقدونیہمالیم" + + "یانمار (برما)منگولیامکاؤ SAR چینشمالی ماریانا آئلینڈزمارٹینکموریطانیہمو" + + "نٹسیراٹمالٹاماریشسمالدیپملاویمیکسیکوملیشیاموزمبیقنامیبیانیو کلیڈونیانائ" + + "جرنارفوک آئلینڈنائجیریانکاراگووانیدر لینڈزناروےنیپالنؤرونیئونیوزی ینڈعم" + + "انپنامہپیروفرانسیسی پولینیشیاپاپوآ نیو گنیفلپائنیپاکستانپولینڈسینٹ پیئر" + + " اور میکلیئونپٹکائرن جزائرپیورٹو ریکوفلسطینی خطےپرتگالپلاؤپیراگوئےقطربیر" + + "ونی اوشیانیاری یونینرومانیاسربیاروسروانڈاسعودی عربسولومن آئلینڈزسشلیزسو" + + "ڈانسویڈنسنگاپورسینٹ ہیلیناسلووینیاسوالبرڈ اور جان ماینسلوواکیہسیئر لیون" + + "سان مارینوسینیگلصومالیہسورینامجنوبی سوڈانساؤ ٹوم اور پرنسپےال سلواڈورسن" + + "ٹ مارٹنشامسوازی لینڈٹرسٹن ڈا کیونہاترکس اور کیکاؤس جزائرچاڈفرانسیسی جنو" + + "بی خطےٹوگوتھائی لینڈتاجکستانٹوکیلاؤتیمور لیسٹترکمانستانتیونیسیاٹونگاترک" + + "یترینیداد اور ٹوباگوٹووالوتائیوانتنزانیہیوکرینیوگانڈاامریکہ سے باہر کے " + + "چھوٹے جزائزریاستہائے متحدہیوروگوئےازبکستانواٹیکن سٹیسینٹ ونسنٹ اور گرین" + + "یڈائنزوینزوئیلابرٹش ورجن آئلینڈزامریکی ورجن آئلینڈزویتناموینوآٹوویلیز ا" + + "ور فیوٹیوناساموآکوسووویمنمایوٹجنوبی افریقہزامبیازمبابوےنامعلوم علاقہدنی" + + "اافریقہشمالی امریکہجنوبی امریکہاوشیانیامغربی افریقہوسطی امریکہمشرقی افر" + + "یقہشمالی افریقہوسطی افریقہجنوبی افریقہ کے علاقہامیریکازشمالی امریکہ کا " + + "علاقہکریبیائیمشرقی ایشیاجنوبی ایشیاجنوب مشرقی ایشیاجنوبی یورپآسٹریلیشیا" + + "مالینیشیامائکرونیشیائی علاقہپولینیشیاایشیاوسطی ایشیامغربی ایشیایورپمشرق" + + "ی یورپشمالی یورپمغربی یورپلاطینی امریکہ" + +var urRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0019, 0x0025, 0x0043, 0x0055, 0x0079, 0x0089, 0x0097, + 0x00a5, 0x00c6, 0x00d2, 0x00e6, 0x00f6, 0x010d, 0x0119, 0x0129, + 0x0133, 0x014c, 0x015e, 0x0186, 0x0196, 0x01a7, 0x01b3, 0x01c8, + 0x01d6, 0x01e0, 0x01ec, 0x01f4, 0x020d, 0x0219, 0x0225, 0x0233, + 0x0256, 0x0262, 0x026e, 0x027a, 0x0291, 0x02a1, 0x02af, 0x02bb, + 0x02c7, 0x02e9, 0x0302, 0x0324, 0x0343, 0x0358, 0x0370, 0x0383, + 0x0389, 0x0395, 0x039b, 0x03a9, 0x03c2, 0x03d5, 0x03df, 0x03ee, + 0x03fe, 0x0415, 0x041d, 0x0432, 0x043c, 0x0453, 0x045d, 0x0469, + // Entry 40 - 7F + 0x0477, 0x0494, 0x04a2, 0x04c2, 0x04d2, 0x04e0, 0x04e6, 0x04fb, + 0x050b, 0x0519, 0x0529, 0x0540, 0x054d, 0x0553, 0x056c, 0x0582, + 0x0595, 0x059f, 0x05a9, 0x05be, 0x05cc, 0x05d8, 0x05ed, 0x05fb, + 0x0605, 0x0618, 0x0629, 0x0635, 0x063b, 0x064b, 0x0664, 0x066e, + 0x06af, 0x06c2, 0x06ca, 0x06d9, 0x06e3, 0x06ff, 0x073f, 0x074f, + 0x075b, 0x0763, 0x076d, 0x0786, 0x0798, 0x07a6, 0x07b4, 0x07c6, + 0x07d0, 0x0805, 0x080d, 0x0817, 0x0826, 0x082e, 0x0836, 0x0844, + 0x084c, 0x0856, 0x0860, 0x0870, 0x087e, 0x088c, 0x089a, 0x08bb, + // Entry 80 - BF + 0x08d0, 0x08e5, 0x08ed, 0x0906, 0x0916, 0x091e, 0x0928, 0x093b, + 0x094f, 0x095e, 0x096e, 0x097c, 0x098c, 0x099a, 0x09a4, 0x09ae, + 0x09b8, 0x09c4, 0x09d2, 0x09e7, 0x09fa, 0x0a08, 0x0a21, 0x0a2f, + 0x0a37, 0x0a50, 0x0a5e, 0x0a71, 0x0a99, 0x0aa7, 0x0ab9, 0x0acb, + 0x0ad5, 0x0ae1, 0x0aed, 0x0af7, 0x0b05, 0x0b11, 0x0b1f, 0x0b2d, + 0x0b44, 0x0b4e, 0x0b67, 0x0b77, 0x0b89, 0x0b9c, 0x0ba6, 0x0bb0, + 0x0bb8, 0x0bc0, 0x0bd1, 0x0bd9, 0x0be3, 0x0beb, 0x0c0e, 0x0c26, + 0x0c34, 0x0c42, 0x0c4e, 0x0c77, 0x0c90, 0x0ca5, 0x0cba, 0x0cc6, + // Entry C0 - FF + 0x0cce, 0x0cde, 0x0ce4, 0x0d01, 0x0d10, 0x0d1e, 0x0d28, 0x0d2e, + 0x0d3a, 0x0d4b, 0x0d66, 0x0d70, 0x0d7a, 0x0d84, 0x0d92, 0x0da7, + 0x0db7, 0x0ddc, 0x0dec, 0x0dfd, 0x0e10, 0x0e1c, 0x0e2a, 0x0e38, + 0x0e4d, 0x0e6e, 0x0e81, 0x0e92, 0x0e98, 0x0eab, 0x0ec7, 0x0eee, + 0x0ef4, 0x0f16, 0x0f1e, 0x0f31, 0x0f41, 0x0f4f, 0x0f62, 0x0f76, + 0x0f86, 0x0f90, 0x0f98, 0x0fbc, 0x0fc8, 0x0fd6, 0x0fe4, 0x0ff0, + 0x0ffe, 0x1033, 0x1050, 0x1060, 0x1070, 0x1083, 0x10b2, 0x10c4, + 0x10e4, 0x1108, 0x1114, 0x1122, 0x1144, 0x114e, 0x115a, 0x1160, + // Entry 100 - 13F + 0x116a, 0x1181, 0x118d, 0x119b, 0x11b4, 0x11bc, 0x11c8, 0x11df, + 0x11f6, 0x1206, 0x121d, 0x1232, 0x1249, 0x1260, 0x1275, 0x129c, + 0x12ac, 0x12d3, 0x12e3, 0x12f8, 0x130d, 0x132b, 0x133e, 0x1352, + 0x1364, 0x1389, 0x139b, 0x13a5, 0x13b8, 0x13cd, 0x13d5, 0x13e8, + 0x13fb, 0x140e, 0x1427, +} // Size: 606 bytes + +var uzRegionStr string = "" + // Size: 3194 bytes + "Me’roj oroliAndorraBirlashgan Arab AmirliklariAfgʻonistonAntigua va Barb" + + "adosAngilyaAlbaniyaArmanistonAngolaAntarktidaArgentinaAmerika SamoasiAvs" + + "triyaAvstraliyaArubaAland orollariOzarbayjonBosniya va GertsegovinaBarba" + + "dosBangladeshBelgiyaBurkina-FasoBolgariyaBahraynBurundiBeninSen-Bartelem" + + "iBermuda orollariBruneyBoliviyaBoneyr, Sint-Estatius va SabaBraziliyaBag" + + "ama orollariButanBuve oroliBotsvanaBelarusBelizKanadaKokos (Kiling) orol" + + "lariKongo – KinshasaMarkaziy Afrika RespublikasiKongo – BrazzavilShveyts" + + "ariyaKot-d’IvuarKuk orollariChiliKamerunXitoyKolumbiyaKlipperton oroliKo" + + "sta-RikaKubaKabo-VerdeKyurasaoRojdestvo oroliKiprChexiya RespublikasiGer" + + "maniyaDiyego-GarsiyaJibutiDaniyaDominikaDominikan RespublikasiJazoirSeut" + + "a va MelilyaEkvadorEstoniyaMisrG‘arbiy Sahroi KabirEritreyaIspaniyaEfiop" + + "iyaYevropa IttifoqiFinlandiyaFijiFolklend orollariMikroneziyaFarer oroll" + + "ariFransiyaGabonBirlashgan QirollikGrenadaGruziyaFransuz GvianasiGernsiG" + + "anaGibraltarGrenlandiyaGambiyaGvineyaGvadelupeEkvatorial GvineyaGretsiya" + + "Janubiy Georgiya va Janubiy Sendvich orollariGvatemalaGuamGvineya-BisauG" + + "ayanaGonkong (Xitoy MMH)Xerd va Makdonald orollariGondurasXorvatiyaGaiti" + + "VengriyaKanar orollariIndoneziyaIrlandiyaIsroilMen oroliHindistonBritani" + + "yaning Hind okeanidagi hududiIroqEronIslandiyaItaliyaJersiYamaykaIordani" + + "yaYaponiyaKeniyaQirgʻizistonKambodjaKiribatiKomor orollariSent-Kits va N" + + "evisShimoliy KoreyaJanubiy KoreyaQuvaytKayman orollariQozogʻistonLaosLiv" + + "anSent-LyusiyaLixtenshteynShri-LankaLiberiyaLesotoLitvaLyuksemburgLatviy" + + "aLiviyaMarokashMonakoMoldovaChernogoriyaSent-MartinMadagaskarMarshall or" + + "ollariMakedoniyaMaliMyanma (Birma)MongoliyaMakao (Xitoy MMH)Shimoliy Mar" + + "iana orollariMartinikaMavritaniyaMontserratMaltaMavrikiyMaldiv orollariM" + + "alaviMeksikaMalayziyaMozambikNamibiyaYangi KaledoniyaNigerNorfolk oroliN" + + "igeriyaNikaraguaNiderlandiyaNorvegiyaNepalNauruNiueYangi ZelandiyaUmmonP" + + "anamaPeruFransuz PolineziyasiPapua – Yangi GvineyaFilippinPokistonPolsha" + + "Sent-Pyer va MikelonPitkern orollariPuerto-RikoFalastin hududiPortugaliy" + + "aPalauParagvayQatarYondosh OkeaniyaReyunionRuminiyaSerbiyaRossiyaRuandaS" + + "audiya ArabistoniSolomon orollariSeyshel orollariSudanShvetsiyaSingapurM" + + "uqaddas Yelena oroliSloveniyaSvalbard va Yan-MayenSlovakiyaSyerra-LeoneS" + + "an-MarinoSenegalSomaliSurinamJanubiy SudanSan-Tome va PrinsipiSalvadorSi" + + "nt-MartenSuriyaSvazilendTristan-da-KunyaTurks va Kaykos orollariChadFran" + + "suz Janubiy hududlariTogoTailandTojikistonTokelauTimorTurkmanistonTunisT" + + "ongaTurkiyaTrinidad va TobagoTuvaluTayvanTanzaniyaUkrainaUgandaAQSH yond" + + "osh orollariQoʻshma ShtatlarUrugvayOʻzbekistonVatikanSent-Vinsent va Gre" + + "nadinVenesuelaBritaniya Virgin orollariAQSH Virgin orollariVyetnamVanuat" + + "uUollis va FutunaSamoaKosovoYamanMayottaJanubiy Afrika RespublikasiZambi" + + "yaZimbabveNoma’lum mintaqaDunyoAfrikaShimoliy AmerikaJanubiy AmerikaOkea" + + "niyaG‘arbiy AfrikaMarkaziy AmerikaSharqiy AfrikaShimoliy AfrikaMarkaziy " + + "AfrikaJanubiy AfrikaAmerikaShimoliy Amerika – AQSH va KanadaKarib havzas" + + "iSharqiy OsiyoJanubiy OsiyoJanubi-sharqiy OsiyoJanubiy YevropaAvstralazi" + + "yaMelaneziyaMikroneziya mintaqasiPolineziyaOsiyoMarkaziy OsiyoG‘arbiy Os" + + "iyoYevropaSharqiy YevropaShimoliy YevropaG‘arbiy YevropaLotin Amerikasi" + +var uzRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x000e, 0x0015, 0x0030, 0x003c, 0x004f, 0x0056, 0x005e, + 0x0068, 0x0068, 0x006e, 0x0078, 0x0081, 0x0090, 0x0098, 0x00a2, + 0x00a7, 0x00b5, 0x00bf, 0x00d6, 0x00de, 0x00e8, 0x00ef, 0x00fb, + 0x0104, 0x010b, 0x0112, 0x0117, 0x0124, 0x0134, 0x013a, 0x0142, + 0x015f, 0x0168, 0x0177, 0x017c, 0x0186, 0x018e, 0x0195, 0x019a, + 0x01a0, 0x01b7, 0x01c9, 0x01e5, 0x01f8, 0x0204, 0x0211, 0x021d, + 0x0222, 0x0229, 0x022e, 0x0237, 0x0247, 0x0251, 0x0255, 0x025f, + 0x0267, 0x0276, 0x027a, 0x028e, 0x0297, 0x02a5, 0x02ab, 0x02b1, + // Entry 40 - 7F + 0x02b9, 0x02cf, 0x02d5, 0x02e5, 0x02ec, 0x02f4, 0x02f8, 0x030e, + 0x0316, 0x031e, 0x0326, 0x0336, 0x0340, 0x0344, 0x0355, 0x0360, + 0x036e, 0x0376, 0x037b, 0x038e, 0x0395, 0x039c, 0x03ac, 0x03b2, + 0x03b6, 0x03bf, 0x03ca, 0x03d1, 0x03d8, 0x03e1, 0x03f3, 0x03fb, + 0x0428, 0x0431, 0x0435, 0x0442, 0x0448, 0x045b, 0x0475, 0x047d, + 0x0486, 0x048b, 0x0493, 0x04a1, 0x04ab, 0x04b4, 0x04ba, 0x04c3, + 0x04cc, 0x04f0, 0x04f4, 0x04f8, 0x0501, 0x0508, 0x050d, 0x0514, + 0x051d, 0x0525, 0x052b, 0x0538, 0x0540, 0x0548, 0x0556, 0x0568, + // Entry 80 - BF + 0x0577, 0x0585, 0x058b, 0x059a, 0x05a6, 0x05aa, 0x05af, 0x05bb, + 0x05c7, 0x05d1, 0x05d9, 0x05df, 0x05e4, 0x05ef, 0x05f6, 0x05fc, + 0x0604, 0x060a, 0x0611, 0x061d, 0x0628, 0x0632, 0x0643, 0x064d, + 0x0651, 0x065f, 0x0668, 0x0679, 0x0692, 0x069b, 0x06a6, 0x06b0, + 0x06b5, 0x06bd, 0x06cc, 0x06d2, 0x06d9, 0x06e2, 0x06ea, 0x06f2, + 0x0702, 0x0707, 0x0714, 0x071c, 0x0725, 0x0731, 0x073a, 0x073f, + 0x0744, 0x0748, 0x0757, 0x075c, 0x0762, 0x0766, 0x077a, 0x0791, + 0x0799, 0x07a1, 0x07a7, 0x07bb, 0x07cb, 0x07d6, 0x07e5, 0x07f0, + // Entry C0 - FF + 0x07f5, 0x07fd, 0x0802, 0x0812, 0x081a, 0x0822, 0x0829, 0x0830, + 0x0836, 0x0848, 0x0858, 0x0868, 0x086d, 0x0876, 0x087e, 0x0893, + 0x089c, 0x08b1, 0x08ba, 0x08c6, 0x08d0, 0x08d7, 0x08dd, 0x08e4, + 0x08f1, 0x0905, 0x090d, 0x0918, 0x091e, 0x0927, 0x0937, 0x094f, + 0x0953, 0x096c, 0x0970, 0x0977, 0x0981, 0x0988, 0x098d, 0x0999, + 0x099e, 0x09a3, 0x09aa, 0x09bc, 0x09c2, 0x09c8, 0x09d1, 0x09d8, + 0x09de, 0x09f3, 0x0a04, 0x0a0b, 0x0a17, 0x0a1e, 0x0a36, 0x0a3f, + 0x0a58, 0x0a6c, 0x0a73, 0x0a7a, 0x0a8a, 0x0a8f, 0x0a95, 0x0a9a, + // Entry 100 - 13F + 0x0aa1, 0x0abc, 0x0ac3, 0x0acb, 0x0add, 0x0ae2, 0x0ae8, 0x0af8, + 0x0b07, 0x0b0f, 0x0b1f, 0x0b2f, 0x0b3d, 0x0b4c, 0x0b5b, 0x0b69, + 0x0b70, 0x0b93, 0x0ba0, 0x0bad, 0x0bba, 0x0bce, 0x0bdd, 0x0be9, + 0x0bf3, 0x0c08, 0x0c12, 0x0c17, 0x0c25, 0x0c34, 0x0c3b, 0x0c4a, + 0x0c5a, 0x0c6b, 0x0c7a, +} // Size: 606 bytes + +var viRegionStr string = "" + // Size: 3230 bytes + "Đảo AscensionAndorraCác Tiểu V.quốc Ả Rập T.nhấtAfghanistanAntigua và Ba" + + "rbudaAnguillaAlbaniArmeniaTây Ấn Hà LanAngolaNam CựcArgentinaĐảo Somoa t" + + "huộc MỹÁoÚcArubaQuần đảo ÅlandAzerbaijanBosnia và HerzegovinaBarbadosBan" + + "gladeshBỉBurkina FasoBungariBahrainBurundiBeninSt. BarthélemyBermudaBrun" + + "eiBoliviaCa-ri-bê Hà LanBrazilBahamasBhutanĐảo BouvetBotswanaBelarusBeli" + + "zeCanadaQuần đảo Cocos (Keeling)Congo - KinshasaCộng hòa Trung PhiCongo " + + "- BrazzavilleThụy SĩBờ Biển NgàQuần đảo CookChileCameroonTrung QuốcColom" + + "biaĐảo ClippertonCosta RicaCubaCape VerdeCuraçaoĐảo Giáng SinhSípCộng hò" + + "a SécĐứcDiego GarciaDjiboutiĐan MạchDominicaCộng hòa DominicaAlgeriaCeut" + + "a và MelillaEcuadorEstoniaAi CậpTây SaharaEritreaTây Ban NhaEthiopiaLiên" + + " Minh Châu ÂuPhần LanFijiQuần đảo FalklandMicronesiaQuần đảo FaroePhápGa" + + "bonVương quốc AnhGrenadaGeorgiaGuiana thuộc PhápGuernseyGhanaGibraltarGr" + + "eenlandGambiaGuineaGuadeloupeGuinea Xích ĐạoHy LạpQuần đảo Nam Georgia v" + + "à Nam SandwichGuatemalaGuamGuinea-BissauGuyanaHồng Kông, Trung QuốcQuần" + + " đảo Heard và McDonaldHondurasCroatiaHaitiHungariQuần đảo CanaryIndonesi" + + "aAi-lenIsraelĐảo ManẤn ĐộThuộc địa Anh tại Ấn Độ DươngI-rắcIranIcelandÝJ" + + "erseyJamaicaJordanNhật BảnKenyaKyrgyzstanCampuchiaKiribatiComorosSt. Kit" + + "ts và NevisTriều TiênHàn QuốcCô-oétQuần đảo CaymanKazakhstanLàoLi-băngSt" + + ". LuciaLiechtensteinSri LankaLiberiaLesothoLít-vaLuxembourgLatviaLi-biMa" + + "-rốcMonacoMoldovaMontenegroSt. MartinMadagascarQuần đảo MarshallMacedoni" + + "aMaliMyanmar (Miến Điện)Mông CổMacao, Trung QuốcQuần đảo Bắc MarianaMart" + + "iniqueMauritaniaMontserratMaltaMauritiusMaldivesMalawiMexicoMalaysiaMoza" + + "mbiqueNamibiaNew CaledoniaNigerĐảo NorfolkNigeriaNicaraguaHà LanNa UyNep" + + "alNauruNiueNew ZealandOmanPanamaPeruPolynesia thuộc PhápPapua New Guinea" + + "PhilippinPakistanBa LanSaint Pierre và MiquelonQuần đảo PitcairnPuerto R" + + "icoLãnh thổ PalestineBồ Đào NhaPalauParaguayQatarVùng xa xôi thuộc Châu " + + "Đại DươngRéunionRomaniaSerbiaNgaRwandaẢ Rập Xê-útQuần đảo SolomonSeyche" + + "llesSudanThụy ĐiểnSingaporeSt. HelenaSloveniaSvalbard và Jan MayenSlovak" + + "iaSierra LeoneSan MarinoSenegalSomaliSurinameNam SudanSão Tomé và Prínci" + + "peEl SalvadorSint MaartenSyriaSwazilandTristan da CunhaQuần đảo Turk và " + + "CaicosChadLãnh thổ miền nam nước PhápTogoThái LanTajikistanTokelauĐông T" + + "imorTurkmenistanTunisiaTongaThổ Nhĩ KỳTrinidad và TobagoTuvaluĐài LoanTa" + + "nzaniaUkrainaUgandaCác đảo nhỏ xa t.tâm thuộc MỹHoa KỳUruguayUzbekistanT" + + "hành VaticanSt. Vincent và GrenadinesVenezuelaQuần đảo Virgin thuộc AnhQ" + + "uần đảo Virgin thuộc MỹViệt NamVanuatuWallis và FutunaSamoaKosovoYemenMa" + + "yotteNam PhiZambiaZimbabweVùng không xác địnhThế giớiChâu PhiBắc MỹNam M" + + "ỹChâu Đại DươngTây PhiTrung MỹĐông PhiBắc PhiTrung PhiMiền Nam Châu Ph" + + "iChâu MỹMiền Bắc Châu MỹCa-ri-bêĐông ÁNam ÁĐông Nam ÁNam ÂuÚc và New Zea" + + "landMelanesiaVùng MicronesianPolynesiaChâu ÁTrung ÁTây ÁChâu ÂuĐông ÂuBắ" + + "c ÂuTây ÂuChâu Mỹ La-tinh" + +var viRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0010, 0x0017, 0x003e, 0x0049, 0x005c, 0x0064, 0x006a, + 0x0071, 0x0082, 0x0088, 0x0091, 0x009a, 0x00b3, 0x00b6, 0x00b9, + 0x00be, 0x00d2, 0x00dc, 0x00f2, 0x00fa, 0x0104, 0x0108, 0x0114, + 0x011b, 0x0122, 0x0129, 0x012e, 0x013d, 0x0144, 0x014a, 0x0151, + 0x0162, 0x0168, 0x016f, 0x0175, 0x0182, 0x018a, 0x0191, 0x0197, + 0x019d, 0x01ba, 0x01ca, 0x01df, 0x01f2, 0x01fc, 0x020c, 0x021e, + 0x0223, 0x022b, 0x0237, 0x023f, 0x0250, 0x025a, 0x025e, 0x0268, + 0x0270, 0x0282, 0x0286, 0x0296, 0x029c, 0x02a8, 0x02b0, 0x02bb, + // Entry 40 - 7F + 0x02c3, 0x02d7, 0x02de, 0x02ef, 0x02f6, 0x02fd, 0x0305, 0x0310, + 0x0317, 0x0323, 0x032b, 0x033f, 0x0349, 0x034d, 0x0363, 0x036d, + 0x0380, 0x0385, 0x038a, 0x039c, 0x03a3, 0x03aa, 0x03be, 0x03c6, + 0x03cb, 0x03d4, 0x03dd, 0x03e3, 0x03e9, 0x03f3, 0x0406, 0x040e, + 0x0438, 0x0441, 0x0445, 0x0452, 0x0458, 0x0472, 0x0492, 0x049a, + 0x04a1, 0x04a6, 0x04ad, 0x04c1, 0x04ca, 0x04d0, 0x04d6, 0x04e0, + 0x04ea, 0x0515, 0x051c, 0x0520, 0x0527, 0x0529, 0x052f, 0x0536, + 0x053c, 0x0548, 0x054d, 0x0557, 0x0560, 0x0568, 0x056f, 0x0582, + // Entry 80 - BF + 0x058f, 0x059a, 0x05a2, 0x05b6, 0x05c0, 0x05c4, 0x05cc, 0x05d5, + 0x05e2, 0x05eb, 0x05f2, 0x05f9, 0x0600, 0x060a, 0x0610, 0x0615, + 0x061d, 0x0623, 0x062a, 0x0634, 0x063e, 0x0648, 0x065e, 0x0667, + 0x066b, 0x0683, 0x068d, 0x06a0, 0x06bb, 0x06c5, 0x06cf, 0x06d9, + 0x06de, 0x06e7, 0x06ef, 0x06f5, 0x06fb, 0x0703, 0x070d, 0x0714, + 0x0721, 0x0726, 0x0734, 0x073b, 0x0744, 0x074b, 0x0750, 0x0755, + 0x075a, 0x075e, 0x0769, 0x076d, 0x0773, 0x0777, 0x078e, 0x079e, + 0x07a7, 0x07af, 0x07b5, 0x07ce, 0x07e4, 0x07ef, 0x0804, 0x0812, + // Entry C0 - FF + 0x0817, 0x081f, 0x0824, 0x084e, 0x0856, 0x085d, 0x0863, 0x0866, + 0x086c, 0x087d, 0x0892, 0x089c, 0x08a1, 0x08af, 0x08b8, 0x08c2, + 0x08ca, 0x08e0, 0x08e8, 0x08f4, 0x08fe, 0x0905, 0x090b, 0x0913, + 0x091c, 0x0934, 0x093f, 0x094b, 0x0950, 0x0959, 0x0969, 0x0986, + 0x098a, 0x09ae, 0x09b2, 0x09bb, 0x09c5, 0x09cc, 0x09d8, 0x09e4, + 0x09eb, 0x09f0, 0x09ff, 0x0a12, 0x0a18, 0x0a22, 0x0a2a, 0x0a31, + 0x0a37, 0x0a5f, 0x0a67, 0x0a6e, 0x0a78, 0x0a86, 0x0aa0, 0x0aa9, + 0x0ac9, 0x0aea, 0x0af4, 0x0afb, 0x0b0c, 0x0b11, 0x0b17, 0x0b1c, + // Entry 100 - 13F + 0x0b23, 0x0b2a, 0x0b30, 0x0b38, 0x0b51, 0x0b5d, 0x0b66, 0x0b70, + 0x0b78, 0x0b8c, 0x0b94, 0x0b9e, 0x0ba8, 0x0bb1, 0x0bba, 0x0bce, + 0x0bd8, 0x0bef, 0x0bf8, 0x0c01, 0x0c07, 0x0c14, 0x0c1b, 0x0c2e, + 0x0c37, 0x0c48, 0x0c51, 0x0c59, 0x0c61, 0x0c68, 0x0c71, 0x0c7b, + 0x0c84, 0x0c8c, 0x0c9e, +} // Size: 606 bytes + +var zhRegionStr string = "" + // Size: 3331 bytes + "阿森松岛安道尔阿拉伯联合酋长国阿富汗安提瓜和巴布达安圭拉阿尔巴尼亚亚美尼亚荷属安的列斯群岛安哥拉南极洲阿根廷美属萨摩亚奥地利澳大利亚阿鲁巴奥兰群" + + "岛阿塞拜疆波斯尼亚和黑塞哥维那巴巴多斯孟加拉国比利时布基纳法索保加利亚巴林布隆迪贝宁圣巴泰勒米百慕大文莱玻利维亚荷兰加勒比区巴西巴哈马不丹布" + + "维岛博茨瓦纳白俄罗斯伯利兹加拿大科科斯(基林)群岛刚果(金)中非共和国刚果(布)瑞士科特迪瓦库克群岛智利喀麦隆中国哥伦比亚克利珀顿岛哥斯达黎" + + "加古巴佛得角库拉索圣诞岛塞浦路斯捷克共和国德国迪戈加西亚岛吉布提丹麦多米尼克多米尼加共和国阿尔及利亚休达及梅利利亚厄瓜多尔爱沙尼亚埃及西撒哈" + + "拉厄立特里亚西班牙埃塞俄比亚欧盟芬兰斐济福克兰群岛密克罗尼西亚法罗群岛法国加蓬英国格林纳达格鲁吉亚法属圭亚那根西岛加纳直布罗陀格陵兰冈比亚几" + + "内亚瓜德罗普赤道几内亚希腊南乔治亚岛和南桑威齐群岛危地马拉关岛几内亚比绍圭亚那中国香港特别行政区赫德岛和麦克唐纳群岛洪都拉斯克罗地亚海地匈牙" + + "利加纳利群岛印度尼西亚爱尔兰以色列曼岛印度英属印度洋领地伊拉克伊朗冰岛意大利泽西岛牙买加约旦日本肯尼亚吉尔吉斯斯坦柬埔寨基里巴斯科摩罗圣基茨" + + "和尼维斯朝鲜韩国科威特开曼群岛哈萨克斯坦老挝黎巴嫩圣卢西亚列支敦士登斯里兰卡利比里亚莱索托立陶宛卢森堡拉脱维亚利比亚摩洛哥摩纳哥摩尔多瓦黑山" + + "法属圣马丁马达加斯加马绍尔群岛马其顿马里缅甸蒙古中国澳门特别行政区北马里亚纳群岛马提尼克毛里塔尼亚蒙特塞拉特马耳他毛里求斯马尔代夫马拉维墨西" + + "哥马来西亚莫桑比克纳米比亚新喀里多尼亚尼日尔诺福克岛尼日利亚尼加拉瓜荷兰挪威尼泊尔瑙鲁纽埃新西兰阿曼巴拿马秘鲁法属波利尼西亚巴布亚新几内亚菲" + + "律宾巴基斯坦波兰圣皮埃尔和密克隆群岛皮特凯恩群岛波多黎各巴勒斯坦领土葡萄牙帕劳巴拉圭卡塔尔大洋洲边远群岛留尼汪罗马尼亚塞尔维亚俄罗斯卢旺达沙" + + "特阿拉伯所罗门群岛塞舌尔苏丹瑞典新加坡圣赫勒拿斯洛文尼亚斯瓦尔巴特和扬马延斯洛伐克塞拉利昂圣马力诺塞内加尔索马里苏里南南苏丹圣多美和普林西比" + + "萨尔瓦多荷属圣马丁叙利亚斯威士兰特里斯坦-达库尼亚群岛特克斯和凯科斯群岛乍得法属南部领地多哥泰国塔吉克斯坦托克劳东帝汶土库曼斯坦突尼斯汤加土" + + "耳其特立尼达和多巴哥图瓦卢台湾坦桑尼亚乌克兰乌干达美国本土外小岛屿美国乌拉圭乌兹别克斯坦梵蒂冈圣文森特和格林纳丁斯委内瑞拉英属维京群岛美属维" + + "京群岛越南瓦努阿图瓦利斯和富图纳萨摩亚科索沃也门马约特南非赞比亚津巴布韦未知地区世界非洲北美洲南美洲大洋洲西非中美洲东非北非中非南部非洲美洲" + + "美洲北部加勒比地区东亚南亚东南亚南欧澳大拉西亚美拉尼西亚密克罗尼西亚地区玻利尼西亚亚洲中亚西亚欧洲东欧北欧西欧拉丁美洲" + +var zhRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x000c, 0x0015, 0x002d, 0x0036, 0x004b, 0x0054, 0x0063, + 0x006f, 0x0087, 0x0090, 0x0099, 0x00a2, 0x00b1, 0x00ba, 0x00c6, + 0x00cf, 0x00db, 0x00e7, 0x0105, 0x0111, 0x011d, 0x0126, 0x0135, + 0x0141, 0x0147, 0x0150, 0x0156, 0x0165, 0x016e, 0x0174, 0x0180, + 0x0192, 0x0198, 0x01a1, 0x01a7, 0x01b0, 0x01bc, 0x01c8, 0x01d1, + 0x01da, 0x01f5, 0x0204, 0x0213, 0x0222, 0x0228, 0x0234, 0x0240, + 0x0246, 0x024f, 0x0255, 0x0261, 0x0270, 0x027f, 0x0285, 0x028e, + 0x0297, 0x02a0, 0x02ac, 0x02bb, 0x02c1, 0x02d3, 0x02dc, 0x02e2, + // Entry 40 - 7F + 0x02ee, 0x0303, 0x0312, 0x0327, 0x0333, 0x033f, 0x0345, 0x0351, + 0x0360, 0x0369, 0x0378, 0x037e, 0x0384, 0x038a, 0x0399, 0x03ab, + 0x03b7, 0x03bd, 0x03c3, 0x03c9, 0x03d5, 0x03e1, 0x03f0, 0x03f9, + 0x03ff, 0x040b, 0x0414, 0x041d, 0x0426, 0x0432, 0x0441, 0x0447, + 0x046b, 0x0477, 0x047d, 0x048c, 0x0495, 0x04b0, 0x04ce, 0x04da, + 0x04e6, 0x04ec, 0x04f5, 0x0504, 0x0513, 0x051c, 0x0525, 0x052b, + 0x0531, 0x0546, 0x054f, 0x0555, 0x055b, 0x0564, 0x056d, 0x0576, + 0x057c, 0x0582, 0x058b, 0x059d, 0x05a6, 0x05b2, 0x05bb, 0x05d0, + // Entry 80 - BF + 0x05d6, 0x05dc, 0x05e5, 0x05f1, 0x0600, 0x0606, 0x060f, 0x061b, + 0x062a, 0x0636, 0x0642, 0x064b, 0x0654, 0x065d, 0x0669, 0x0672, + 0x067b, 0x0684, 0x0690, 0x0696, 0x06a5, 0x06b4, 0x06c3, 0x06cc, + 0x06d2, 0x06d8, 0x06de, 0x06f9, 0x070e, 0x071a, 0x0729, 0x0738, + 0x0741, 0x074d, 0x0759, 0x0762, 0x076b, 0x0777, 0x0783, 0x078f, + 0x07a1, 0x07aa, 0x07b6, 0x07c2, 0x07ce, 0x07d4, 0x07da, 0x07e3, + 0x07e9, 0x07ef, 0x07f8, 0x07fe, 0x0807, 0x080d, 0x0822, 0x0837, + 0x0840, 0x084c, 0x0852, 0x0870, 0x0882, 0x088e, 0x08a0, 0x08a9, + // Entry C0 - FF + 0x08af, 0x08b8, 0x08c1, 0x08d6, 0x08df, 0x08eb, 0x08f7, 0x0900, + 0x0909, 0x0918, 0x0927, 0x0930, 0x0936, 0x093c, 0x0945, 0x0951, + 0x0960, 0x097b, 0x0987, 0x0993, 0x099f, 0x09ab, 0x09b4, 0x09bd, + 0x09c6, 0x09de, 0x09ea, 0x09f9, 0x0a02, 0x0a0e, 0x0a2d, 0x0a48, + 0x0a4e, 0x0a60, 0x0a66, 0x0a6c, 0x0a7b, 0x0a84, 0x0a8d, 0x0a9c, + 0x0aa5, 0x0aab, 0x0ab4, 0x0acc, 0x0ad5, 0x0adb, 0x0ae7, 0x0af0, + 0x0af9, 0x0b11, 0x0b17, 0x0b20, 0x0b32, 0x0b3b, 0x0b59, 0x0b65, + 0x0b77, 0x0b89, 0x0b8f, 0x0b9b, 0x0bb0, 0x0bb9, 0x0bc2, 0x0bc8, + // Entry 100 - 13F + 0x0bd1, 0x0bd7, 0x0be0, 0x0bec, 0x0bf8, 0x0bfe, 0x0c04, 0x0c0d, + 0x0c16, 0x0c1f, 0x0c25, 0x0c2e, 0x0c34, 0x0c3a, 0x0c40, 0x0c4c, + 0x0c52, 0x0c5e, 0x0c6d, 0x0c73, 0x0c79, 0x0c82, 0x0c88, 0x0c97, + 0x0ca6, 0x0cbe, 0x0ccd, 0x0cd3, 0x0cd9, 0x0cdf, 0x0ce5, 0x0ceb, + 0x0cf1, 0x0cf7, 0x0d03, +} // Size: 606 bytes + +var zhHantRegionStr string = "" + // Size: 3333 bytes + "阿森松島安道爾阿拉伯聯合大公國阿富汗安地卡及巴布達安圭拉阿爾巴尼亞亞美尼亞荷屬安地列斯安哥拉南極洲阿根廷美屬薩摩亞奧地利澳洲荷屬阿魯巴奧蘭群島亞" + + "塞拜然波士尼亞與赫塞哥維納巴貝多孟加拉比利時布吉納法索保加利亞巴林蒲隆地貝南聖巴瑟米百慕達汶萊玻利維亞荷蘭加勒比區巴西巴哈馬不丹布威島波札那" + + "白俄羅斯貝里斯加拿大科科斯(基林)群島剛果(金夏沙)中非共和國剛果(布拉薩)瑞士象牙海岸庫克群島智利喀麥隆中華人民共和國哥倫比亞克里派頓島哥" + + "斯大黎加古巴維德角庫拉索聖誕島賽普勒斯捷克共和國德國迪亞哥加西亞島吉布地丹麥多米尼克多明尼加共和國阿爾及利亞休達與梅利利亞厄瓜多愛沙尼亞埃及" + + "西撒哈拉厄利垂亞西班牙衣索比亞歐盟芬蘭斐濟福克蘭群島密克羅尼西亞群島法羅群島法國加彭英國格瑞那達喬治亞共和國法屬圭亞那根西島迦納直布羅陀格陵" + + "蘭甘比亞幾內亞瓜地洛普赤道幾內亞希臘南喬治亞與南三明治群島瓜地馬拉關島幾內亞比索蓋亞那中華人民共和國香港特別行政區赫德島和麥克唐納群島宏都拉" + + "斯克羅埃西亞海地匈牙利加那利群島印尼愛爾蘭以色列曼島印度英屬印度洋領地伊拉克伊朗冰島義大利澤西島牙買加約旦日本肯亞吉爾吉斯柬埔寨吉里巴斯葛摩" + + "聖克里斯多福及尼維斯北韓南韓科威特開曼群島哈薩克寮國黎巴嫩聖露西亞列支敦斯登斯里蘭卡賴比瑞亞賴索托立陶宛盧森堡拉脫維亞利比亞摩洛哥摩納哥摩爾" + + "多瓦蒙特內哥羅法屬聖馬丁馬達加斯加馬紹爾群島馬其頓馬利緬甸蒙古中華人民共和國澳門特別行政區北馬里亞納群島馬丁尼克島茅利塔尼亞蒙哲臘馬爾他模里" + + "西斯馬爾地夫馬拉威墨西哥馬來西亞莫三比克納米比亞新喀里多尼亞尼日諾福克島奈及利亞尼加拉瓜荷蘭挪威尼泊爾諾魯紐埃島紐西蘭阿曼王國巴拿馬秘魯法屬" + + "玻里尼西亞巴布亞紐幾內亞菲律賓巴基斯坦波蘭聖皮埃爾和密克隆群島皮特肯群島波多黎各巴勒斯坦自治區葡萄牙帛琉巴拉圭卡達大洋洲邊疆群島留尼旺羅馬尼" + + "亞塞爾維亞俄羅斯盧安達沙烏地阿拉伯索羅門群島塞席爾蘇丹瑞典新加坡聖赫勒拿島斯洛維尼亞冷岸及央麥恩群島斯洛伐克獅子山聖馬利諾塞內加爾索馬利亞蘇" + + "利南南蘇丹聖多美普林西比薩爾瓦多荷屬聖馬丁敘利亞史瓦濟蘭特里斯坦達庫尼亞群島土克斯及開科斯群島查德法屬南方屬地多哥泰國塔吉克托克勞群島東帝汶" + + "土庫曼突尼西亞東加土耳其千里達及托巴哥吐瓦魯台灣坦尚尼亞烏克蘭烏干達美國本土外小島嶼美國烏拉圭烏茲別克梵蒂岡聖文森及格瑞那丁委內瑞拉英屬維京" + + "群島美屬維京群島越南萬那杜瓦利斯和富圖納群島薩摩亞科索沃葉門馬約特南非尚比亞辛巴威未知區域世界非洲北美洲南美洲大洋洲西非中美東非北非中非非洲" + + "南部美洲北美加勒比海東亞南亞東南亞南歐澳洲與紐西蘭美拉尼西亞密克羅尼西亞玻里尼西亞亞洲中亞西亞歐洲東歐北歐西歐拉丁美洲" + +var zhHantRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x000c, 0x0015, 0x002d, 0x0036, 0x004b, 0x0054, 0x0063, + 0x006f, 0x0081, 0x008a, 0x0093, 0x009c, 0x00ab, 0x00b4, 0x00ba, + 0x00c9, 0x00d5, 0x00e1, 0x00ff, 0x0108, 0x0111, 0x011a, 0x0129, + 0x0135, 0x013b, 0x0144, 0x014a, 0x0156, 0x015f, 0x0165, 0x0171, + 0x0183, 0x0189, 0x0192, 0x0198, 0x01a1, 0x01aa, 0x01b6, 0x01bf, + 0x01c8, 0x01e3, 0x01f8, 0x0207, 0x021c, 0x0222, 0x022e, 0x023a, + 0x0240, 0x0249, 0x025e, 0x026a, 0x0279, 0x0288, 0x028e, 0x0297, + 0x02a0, 0x02a9, 0x02b5, 0x02c4, 0x02ca, 0x02df, 0x02e8, 0x02ee, + // Entry 40 - 7F + 0x02fa, 0x030f, 0x031e, 0x0333, 0x033c, 0x0348, 0x034e, 0x035a, + 0x0366, 0x036f, 0x037b, 0x0381, 0x0387, 0x038d, 0x039c, 0x03b4, + 0x03c0, 0x03c6, 0x03cc, 0x03d2, 0x03de, 0x03f0, 0x03ff, 0x0408, + 0x040e, 0x041a, 0x0423, 0x042c, 0x0435, 0x0441, 0x0450, 0x0456, + 0x0477, 0x0483, 0x0489, 0x0498, 0x04a1, 0x04cb, 0x04e9, 0x04f5, + 0x0504, 0x050a, 0x0513, 0x0522, 0x0528, 0x0531, 0x053a, 0x0540, + 0x0546, 0x055b, 0x0564, 0x056a, 0x0570, 0x0579, 0x0582, 0x058b, + 0x0591, 0x0597, 0x059d, 0x05a9, 0x05b2, 0x05be, 0x05c4, 0x05e2, + // Entry 80 - BF + 0x05e8, 0x05ee, 0x05f7, 0x0603, 0x060c, 0x0612, 0x061b, 0x0627, + 0x0636, 0x0642, 0x064e, 0x0657, 0x0660, 0x0669, 0x0675, 0x067e, + 0x0687, 0x0690, 0x069c, 0x06ab, 0x06ba, 0x06c9, 0x06d8, 0x06e1, + 0x06e7, 0x06ed, 0x06f3, 0x071d, 0x0732, 0x0741, 0x0750, 0x0759, + 0x0762, 0x076e, 0x077a, 0x0783, 0x078c, 0x0798, 0x07a4, 0x07b0, + 0x07c2, 0x07c8, 0x07d4, 0x07e0, 0x07ec, 0x07f2, 0x07f8, 0x0801, + 0x0807, 0x0810, 0x0819, 0x0825, 0x082e, 0x0834, 0x0849, 0x085e, + 0x0867, 0x0873, 0x0879, 0x0897, 0x08a6, 0x08b2, 0x08c7, 0x08d0, + // Entry C0 - FF + 0x08d6, 0x08df, 0x08e5, 0x08fa, 0x0903, 0x090f, 0x091b, 0x0924, + 0x092d, 0x093f, 0x094e, 0x0957, 0x095d, 0x0963, 0x096c, 0x097b, + 0x098a, 0x09a2, 0x09ae, 0x09b7, 0x09c3, 0x09cf, 0x09db, 0x09e4, + 0x09ed, 0x0a02, 0x0a0e, 0x0a1d, 0x0a26, 0x0a32, 0x0a50, 0x0a6b, + 0x0a71, 0x0a83, 0x0a89, 0x0a8f, 0x0a98, 0x0aa7, 0x0ab0, 0x0ab9, + 0x0ac5, 0x0acb, 0x0ad4, 0x0ae9, 0x0af2, 0x0af8, 0x0b04, 0x0b0d, + 0x0b16, 0x0b2e, 0x0b34, 0x0b3d, 0x0b49, 0x0b52, 0x0b6a, 0x0b76, + 0x0b88, 0x0b9a, 0x0ba0, 0x0ba9, 0x0bc4, 0x0bcd, 0x0bd6, 0x0bdc, + // Entry 100 - 13F + 0x0be5, 0x0beb, 0x0bf4, 0x0bfd, 0x0c09, 0x0c0f, 0x0c15, 0x0c1e, + 0x0c27, 0x0c30, 0x0c36, 0x0c3c, 0x0c42, 0x0c48, 0x0c4e, 0x0c5a, + 0x0c60, 0x0c66, 0x0c72, 0x0c78, 0x0c7e, 0x0c87, 0x0c8d, 0x0c9f, + 0x0cae, 0x0cc0, 0x0ccf, 0x0cd5, 0x0cdb, 0x0ce1, 0x0ce7, 0x0ced, + 0x0cf3, 0x0cf9, 0x0d05, +} // Size: 606 bytes + +var zuRegionStr string = "" + // Size: 3578 bytes + "i-Ascension Islandi-Andorrai-United Arab Emiratesi-Afghanistani-Antigua " + + "and Barbudai-Anguillai-Albaniai-Armeniai-Netherlands Antillesi-Angolai-A" + + "ntarcticai-Argentinai-American Samoai-Austriai-Australiai-Arubai-Åland I" + + "slandsi-Azerbaijani-Bosnia ne-Herzegovinai-Barbadosi-Bangladeshi-Belgium" + + "i-Burkina Fasoi-Bulgariai-Bahraini-Burundii-Benini-Saint Barthélemyi-Ber" + + "mudai-Bruneii-Boliviai-Caribbean Netherlandsi-Brazili-Bahamasi-Bhutani-B" + + "ouvet IslandiBotswanai-Belarusi-Belizei-Canadai-Cocos (Keeling) Islandsi" + + "-Congo - Kinshasai-Central African Republici-Congo - Brazzavillei-Switze" + + "rlandi-Côte d’Ivoirei-Cook Islandsi-Chilei-Camerooni-Chinai-Colombiai-Cl" + + "ipperton Islandi-Costa Ricai-Cubai-Cape Verdei-Curaçaoi-Christmas Island" + + "i-Cyprusi-Czech Republici-Germanyi-Diego Garciai-Djiboutii-Denmarki-Domi" + + "nicai-Dominican Republici-Algeriai-Cueta ne-Melillai-Ecuadori-Estoniai-E" + + "gypti-Western Saharai-Eritreai-Spaini-Ethiopiai-European Unioni-Finlandi" + + "-Fijii-Falkland Islandsi-Micronesiai-Faroe Islandsi-Francei-Gaboni-Unite" + + "d Kingdomi-Grenadai-Georgiai-French Guianai-Guernseyi-Ghanai-Gibraltari-" + + "Greenlandi-Gambiai-Guineai-Guadeloupei-Equatorial Guineai-Greecei-South " + + "Georgia ne-South Sandwich Islandsi-Guatemalai-Guami-Guinea-Bissaui-Guyan" + + "ai-Hong Kong SAR Chinai-Heard Island ne-McDonald Islandsi-Hondurasi-Croa" + + "tiai-Haitii-Hungaryi-Canary Islandsi-Indonesiai-Irelandkwa-Israeli-Isle " + + "of Mani-Indiai-British Indian Ocean Territoryi-Iraqi-Irani-Icelandi-Ital" + + "yi-Jerseyi-Jamaicai-Jordani-Japani-Kenyai-Kyrgyzstani-Cambodiai-Kiribati" + + "i-Comorosi-Saint Kitts ne-Nevisi-North Koreai-South Koreai-Kuwaiti-Cayma" + + "n Islandsi-Kazakhstani-Laosi-Lebanoni-Saint Luciai-Liechtensteini-Sri La" + + "nkai-LiberiaiLesothoi-Lithuaniai-Luxembourgi-Latviai-Libyai-Moroccoi-Mon" + + "acoi-Moldovai-Montenegroi-Saint Martini-Madagascari-Marshall Islandsi-Ma" + + "cedoniaiMalii-Myanmar (Burma)i-Mongoliai-Macau SAR Chinai-Northern Maria" + + "na Islandsi-Martiniquei-Mauritaniai-Montserrati-Maltai-Mauritiusi-Maldiv" + + "esiMalawii-Mexicoi-Malaysiai-Mozambiquei-Namibiai-New Caledoniai-Nigeri-" + + "Norfolk Islandi-Nigeriai-Nicaraguai-Netherlandsi-Norwayi-Nepali-Naurui-N" + + "iuei-New Zealandi-Omani-Panamai-Perui-French Polynesiai-Papua New Guinea" + + "i-Philippinesi-Pakistani-Polandi-Saint Pierre kanye ne-Miqueloni-Pitcair" + + "n Islandsi-Puerto Ricoi-Palestinian Territoriesi-Portugali-Palaui-Paragu" + + "ayi-Qatari-Outlying Oceaniai-Réunioni-Romaniai-Serbiai-Russiai-Rwandai-S" + + "audi Arabiai-Solomon Islandsi-Seychellesi-Sudani-Swedeni-Singaporei-Sain" + + "t Helenai-Sloveniai-Svalbard ne-Jan Mayeni-Slovakiai-Sierra Leonei-San M" + + "arinoi-Senegali-Somaliai-Surinamei-South Sudani-São Tomé kanye ne-Prínci" + + "pei-El Salvadori-Sint Maarteni-Syriai-Swazilandi-Tristan da Cunhai-Turks" + + " and Caicos Islandsi-Chadi-French Southern Territoriesi-Togoi-Thailandi-" + + "Tajikistani-Tokelaui-Timor-Lestei-Turkmenistani-Tunisiai-Tongai-Turkeyi-" + + "Trinidad ne-Tobagoi-Tuvalui-Taiwani-Tanzaniai-Ukrainei-Ugandai-U.S. Mino" + + "r Outlying Islandsi-United Statesi-Uruguayi-Uzbekistani-Vatican Cityi-Sa" + + "int Vincent ne-Grenadinesi-Venezuelai-British Virgin Islandsi-U.S. Virgi" + + "n Islandsi-Vietnami-Vanuatui-Wallis ne-Futunai-Samoai-Kosovoi-Yemeni-May" + + "ottei-South Africai-ZambiaiZimbabweiSifunda esingaziwaumhlabai-Africai-N" + + "orth Americai-South Americai-Oceaniai-Western Africai-Central Americai-E" + + "astern Africai-Northern Africai-Middle Africai-Southern Africai-Americas" + + "i-Northern Americai-Caribbeani-Eastern Asiai-Southern Asiai-South-Easter" + + "n Asiai-Southern Europei-Australasiai-Melanesiai-Micronesian Regioni-Pol" + + "ynesiai-Asiai-Central Asiai-Western Asiai-Europei-Eastern Europei-Northe" + + "rn Europei-Western Europei-Latin America" + +var zuRegionIdx = []uint16{ // 291 elements + // Entry 0 - 3F + 0x0000, 0x0012, 0x001b, 0x0031, 0x003e, 0x0053, 0x005d, 0x0066, + 0x006f, 0x0085, 0x008d, 0x0099, 0x00a4, 0x00b4, 0x00bd, 0x00c8, + 0x00cf, 0x00df, 0x00eb, 0x0102, 0x010c, 0x0118, 0x0121, 0x012f, + 0x0139, 0x0142, 0x014b, 0x0152, 0x0165, 0x016e, 0x0176, 0x017f, + 0x0196, 0x019e, 0x01a7, 0x01af, 0x01be, 0x01c7, 0x01d0, 0x01d8, + 0x01e0, 0x01f9, 0x020b, 0x0225, 0x023a, 0x0247, 0x0259, 0x0267, + 0x026e, 0x0278, 0x027f, 0x0289, 0x029c, 0x02a8, 0x02ae, 0x02ba, + 0x02c4, 0x02d6, 0x02de, 0x02ee, 0x02f7, 0x0305, 0x030f, 0x0318, + // Entry 40 - 7F + 0x0322, 0x0336, 0x033f, 0x0351, 0x035a, 0x0363, 0x036a, 0x037a, + 0x0383, 0x038a, 0x0394, 0x03a4, 0x03ad, 0x03b3, 0x03c5, 0x03d1, + 0x03e0, 0x03e8, 0x03ef, 0x03ff, 0x0408, 0x0411, 0x0420, 0x042a, + 0x0431, 0x043c, 0x0447, 0x044f, 0x0457, 0x0463, 0x0476, 0x047e, + 0x04a7, 0x04b2, 0x04b8, 0x04c7, 0x04cf, 0x04e4, 0x0506, 0x0510, + 0x0519, 0x0520, 0x0529, 0x0539, 0x0544, 0x054d, 0x0557, 0x0564, + 0x056b, 0x058b, 0x0591, 0x0597, 0x05a0, 0x05a7, 0x05af, 0x05b8, + 0x05c0, 0x05c7, 0x05ce, 0x05da, 0x05e4, 0x05ee, 0x05f7, 0x060d, + // Entry 80 - BF + 0x061a, 0x0627, 0x062f, 0x063f, 0x064b, 0x0651, 0x065a, 0x0667, + 0x0676, 0x0681, 0x068a, 0x0692, 0x069d, 0x06a9, 0x06b1, 0x06b8, + 0x06c1, 0x06c9, 0x06d2, 0x06de, 0x06ec, 0x06f8, 0x070a, 0x0715, + 0x071a, 0x072b, 0x0735, 0x0746, 0x0760, 0x076c, 0x0778, 0x0784, + 0x078b, 0x0796, 0x07a0, 0x07a7, 0x07af, 0x07b9, 0x07c5, 0x07ce, + 0x07dd, 0x07e4, 0x07f4, 0x07fd, 0x0808, 0x0815, 0x081d, 0x0824, + 0x082b, 0x0831, 0x083e, 0x0844, 0x084c, 0x0852, 0x0864, 0x0876, + 0x0883, 0x088d, 0x0895, 0x08b5, 0x08c7, 0x08d4, 0x08ed, 0x08f7, + // Entry C0 - FF + 0x08fe, 0x0908, 0x090f, 0x0921, 0x092b, 0x0934, 0x093c, 0x0944, + 0x094c, 0x095a, 0x096b, 0x0977, 0x097e, 0x0986, 0x0991, 0x099f, + 0x09a9, 0x09c0, 0x09ca, 0x09d8, 0x09e4, 0x09ed, 0x09f6, 0x0a00, + 0x0a0d, 0x0a2c, 0x0a39, 0x0a47, 0x0a4e, 0x0a59, 0x0a6b, 0x0a85, + 0x0a8b, 0x0aa8, 0x0aae, 0x0ab8, 0x0ac4, 0x0acd, 0x0ada, 0x0ae8, + 0x0af1, 0x0af8, 0x0b00, 0x0b14, 0x0b1c, 0x0b24, 0x0b2e, 0x0b37, + 0x0b3f, 0x0b5c, 0x0b6b, 0x0b74, 0x0b80, 0x0b8e, 0x0bab, 0x0bb6, + 0x0bce, 0x0be3, 0x0bec, 0x0bf5, 0x0c07, 0x0c0e, 0x0c16, 0x0c1d, + // Entry 100 - 13F + 0x0c26, 0x0c34, 0x0c3c, 0x0c45, 0x0c58, 0x0c5f, 0x0c67, 0x0c76, + 0x0c85, 0x0c8e, 0x0c9e, 0x0caf, 0x0cbf, 0x0cd0, 0x0cdf, 0x0cf0, + 0x0cfa, 0x0d0c, 0x0d17, 0x0d25, 0x0d34, 0x0d48, 0x0d59, 0x0d66, + 0x0d71, 0x0d85, 0x0d90, 0x0d96, 0x0da4, 0x0db2, 0x0dba, 0x0dca, + 0x0ddb, 0x0deb, 0x0dfa, +} // Size: 606 bytes + +// Total size for region: 808214 bytes (808 KB) + +const numSupported = 218 + +var supported string = "" + // Size: 833 bytes + "af|agq|ak|am|ar|ar-EG|as|asa|ast|az|az-Cyrl|bas|be|bem|bez|bg|bm|bn|bo|b" + + "o-IN|br|brx|bs|bs-Cyrl|ca|ce|cgg|chr|ckb|cs|cy|da|dav|de|de-CH|dje|dsb|d" + + "ua|dyo|dz|ebu|ee|el|en|en-AU|en-GB|eo|es|es-419|es-CL|es-MX|et|eu|ewo|fa" + + "|fa-AF|ff|fi|fil|fo|fr|fr-CA|fr-CH|fur|fy|ga|gd|gl|gsw|gu|guz|gv|ha|haw|" + + "he|hi|hr|hsb|hu|hy|id|ig|ii|is|it|ja|jgo|jmc|ka|kab|kam|kde|kea|khq|ki|k" + + "k|kkj|kl|kln|km|kn|ko|kok|ks|ksb|ksf|ksh|kw|ky|lag|lb|lg|lkt|ln|lo|lrc|l" + + "t|lu|luo|luy|lv|mas|mer|mfe|mg|mgh|mgo|mk|ml|mn|mr|ms|mt|mua|my|mzn|naq|" + + "nd|ne|nl|nmg|nn|nnh|no|nus|nyn|om|or|os|pa|pa-Arab|pl|prg|ps|pt|pt-PT|qu" + + "|rm|rn|ro|rof|ru|rw|rwk|sah|saq|sbp|se|se-FI|seh|ses|sg|shi|shi-Latn|si|" + + "sk|sl|smn|sn|so|sq|sr|sr-Latn|sv|sv-FI|sw|sw-CD|ta|te|teo|th|ti|to|tr|tw" + + "q|tzm|ug|uk|ur|ur-IN|uz|uz-Arab|uz-Cyrl|vai|vai-Latn|vi|vun|wae|xog|yav|" + + "yi|yo|yo-BJ|zgh|zh|zh-Hant|zh-Hant-HK|zu|" + +// Dictionary entries of frequent languages +var ( + af = Dictionary{ // af + nil, + header{afLangStr, afLangIdx}, + header{afScriptStr, afScriptIdx}, + header{afRegionStr, afRegionIdx}, + } + am = Dictionary{ // am + nil, + header{amLangStr, amLangIdx}, + header{amScriptStr, amScriptIdx}, + header{amRegionStr, amRegionIdx}, + } + ar = Dictionary{ // ar + nil, + header{arLangStr, arLangIdx}, + header{arScriptStr, arScriptIdx}, + header{arRegionStr, arRegionIdx}, + } + az = Dictionary{ // az + nil, + header{azLangStr, azLangIdx}, + header{azScriptStr, azScriptIdx}, + header{azRegionStr, azRegionIdx}, + } + bg = Dictionary{ // bg + nil, + header{bgLangStr, bgLangIdx}, + header{bgScriptStr, bgScriptIdx}, + header{bgRegionStr, bgRegionIdx}, + } + bn = Dictionary{ // bn + nil, + header{bnLangStr, bnLangIdx}, + header{bnScriptStr, bnScriptIdx}, + header{bnRegionStr, bnRegionIdx}, + } + ca = Dictionary{ // ca + nil, + header{caLangStr, caLangIdx}, + header{caScriptStr, caScriptIdx}, + header{caRegionStr, caRegionIdx}, + } + cs = Dictionary{ // cs + nil, + header{csLangStr, csLangIdx}, + header{csScriptStr, csScriptIdx}, + header{csRegionStr, csRegionIdx}, + } + da = Dictionary{ // da + nil, + header{daLangStr, daLangIdx}, + header{daScriptStr, daScriptIdx}, + header{daRegionStr, daRegionIdx}, + } + de = Dictionary{ // de + nil, + header{deLangStr, deLangIdx}, + header{deScriptStr, deScriptIdx}, + header{deRegionStr, deRegionIdx}, + } + el = Dictionary{ // el + nil, + header{elLangStr, elLangIdx}, + header{elScriptStr, elScriptIdx}, + header{elRegionStr, elRegionIdx}, + } + en = Dictionary{ // en + nil, + header{enLangStr, enLangIdx}, + header{enScriptStr, enScriptIdx}, + header{enRegionStr, enRegionIdx}, + } + enGB = Dictionary{ // en-GB + &en, + header{enGBLangStr, enGBLangIdx}, + header{enGBScriptStr, enGBScriptIdx}, + header{enGBRegionStr, enGBRegionIdx}, + } + es = Dictionary{ // es + nil, + header{esLangStr, esLangIdx}, + header{esScriptStr, esScriptIdx}, + header{esRegionStr, esRegionIdx}, + } + es419 = Dictionary{ // es-419 + &es, + header{es419LangStr, es419LangIdx}, + header{es419ScriptStr, es419ScriptIdx}, + header{es419RegionStr, es419RegionIdx}, + } + et = Dictionary{ // et + nil, + header{etLangStr, etLangIdx}, + header{etScriptStr, etScriptIdx}, + header{etRegionStr, etRegionIdx}, + } + fa = Dictionary{ // fa + nil, + header{faLangStr, faLangIdx}, + header{faScriptStr, faScriptIdx}, + header{faRegionStr, faRegionIdx}, + } + fi = Dictionary{ // fi + nil, + header{fiLangStr, fiLangIdx}, + header{fiScriptStr, fiScriptIdx}, + header{fiRegionStr, fiRegionIdx}, + } + fil = Dictionary{ // fil + nil, + header{filLangStr, filLangIdx}, + header{filScriptStr, filScriptIdx}, + header{filRegionStr, filRegionIdx}, + } + fr = Dictionary{ // fr + nil, + header{frLangStr, frLangIdx}, + header{frScriptStr, frScriptIdx}, + header{frRegionStr, frRegionIdx}, + } + frCA = Dictionary{ // fr-CA + &fr, + header{frCALangStr, frCALangIdx}, + header{frCAScriptStr, frCAScriptIdx}, + header{frCARegionStr, frCARegionIdx}, + } + gu = Dictionary{ // gu + nil, + header{guLangStr, guLangIdx}, + header{guScriptStr, guScriptIdx}, + header{guRegionStr, guRegionIdx}, + } + he = Dictionary{ // he + nil, + header{heLangStr, heLangIdx}, + header{heScriptStr, heScriptIdx}, + header{heRegionStr, heRegionIdx}, + } + hi = Dictionary{ // hi + nil, + header{hiLangStr, hiLangIdx}, + header{hiScriptStr, hiScriptIdx}, + header{hiRegionStr, hiRegionIdx}, + } + hr = Dictionary{ // hr + nil, + header{hrLangStr, hrLangIdx}, + header{hrScriptStr, hrScriptIdx}, + header{hrRegionStr, hrRegionIdx}, + } + hu = Dictionary{ // hu + nil, + header{huLangStr, huLangIdx}, + header{huScriptStr, huScriptIdx}, + header{huRegionStr, huRegionIdx}, + } + hy = Dictionary{ // hy + nil, + header{hyLangStr, hyLangIdx}, + header{hyScriptStr, hyScriptIdx}, + header{hyRegionStr, hyRegionIdx}, + } + id = Dictionary{ // id + nil, + header{idLangStr, idLangIdx}, + header{idScriptStr, idScriptIdx}, + header{idRegionStr, idRegionIdx}, + } + is = Dictionary{ // is + nil, + header{isLangStr, isLangIdx}, + header{isScriptStr, isScriptIdx}, + header{isRegionStr, isRegionIdx}, + } + it = Dictionary{ // it + nil, + header{itLangStr, itLangIdx}, + header{itScriptStr, itScriptIdx}, + header{itRegionStr, itRegionIdx}, + } + ja = Dictionary{ // ja + nil, + header{jaLangStr, jaLangIdx}, + header{jaScriptStr, jaScriptIdx}, + header{jaRegionStr, jaRegionIdx}, + } + ka = Dictionary{ // ka + nil, + header{kaLangStr, kaLangIdx}, + header{kaScriptStr, kaScriptIdx}, + header{kaRegionStr, kaRegionIdx}, + } + kk = Dictionary{ // kk + nil, + header{kkLangStr, kkLangIdx}, + header{kkScriptStr, kkScriptIdx}, + header{kkRegionStr, kkRegionIdx}, + } + km = Dictionary{ // km + nil, + header{kmLangStr, kmLangIdx}, + header{kmScriptStr, kmScriptIdx}, + header{kmRegionStr, kmRegionIdx}, + } + kn = Dictionary{ // kn + nil, + header{knLangStr, knLangIdx}, + header{knScriptStr, knScriptIdx}, + header{knRegionStr, knRegionIdx}, + } + ko = Dictionary{ // ko + nil, + header{koLangStr, koLangIdx}, + header{koScriptStr, koScriptIdx}, + header{koRegionStr, koRegionIdx}, + } + ky = Dictionary{ // ky + nil, + header{kyLangStr, kyLangIdx}, + header{kyScriptStr, kyScriptIdx}, + header{kyRegionStr, kyRegionIdx}, + } + lo = Dictionary{ // lo + nil, + header{loLangStr, loLangIdx}, + header{loScriptStr, loScriptIdx}, + header{loRegionStr, loRegionIdx}, + } + lt = Dictionary{ // lt + nil, + header{ltLangStr, ltLangIdx}, + header{ltScriptStr, ltScriptIdx}, + header{ltRegionStr, ltRegionIdx}, + } + lv = Dictionary{ // lv + nil, + header{lvLangStr, lvLangIdx}, + header{lvScriptStr, lvScriptIdx}, + header{lvRegionStr, lvRegionIdx}, + } + mk = Dictionary{ // mk + nil, + header{mkLangStr, mkLangIdx}, + header{mkScriptStr, mkScriptIdx}, + header{mkRegionStr, mkRegionIdx}, + } + ml = Dictionary{ // ml + nil, + header{mlLangStr, mlLangIdx}, + header{mlScriptStr, mlScriptIdx}, + header{mlRegionStr, mlRegionIdx}, + } + mn = Dictionary{ // mn + nil, + header{mnLangStr, mnLangIdx}, + header{mnScriptStr, mnScriptIdx}, + header{mnRegionStr, mnRegionIdx}, + } + mr = Dictionary{ // mr + nil, + header{mrLangStr, mrLangIdx}, + header{mrScriptStr, mrScriptIdx}, + header{mrRegionStr, mrRegionIdx}, + } + ms = Dictionary{ // ms + nil, + header{msLangStr, msLangIdx}, + header{msScriptStr, msScriptIdx}, + header{msRegionStr, msRegionIdx}, + } + my = Dictionary{ // my + nil, + header{myLangStr, myLangIdx}, + header{myScriptStr, myScriptIdx}, + header{myRegionStr, myRegionIdx}, + } + ne = Dictionary{ // ne + nil, + header{neLangStr, neLangIdx}, + header{neScriptStr, neScriptIdx}, + header{neRegionStr, neRegionIdx}, + } + nl = Dictionary{ // nl + nil, + header{nlLangStr, nlLangIdx}, + header{nlScriptStr, nlScriptIdx}, + header{nlRegionStr, nlRegionIdx}, + } + no = Dictionary{ // no + nil, + header{noLangStr, noLangIdx}, + header{noScriptStr, noScriptIdx}, + header{noRegionStr, noRegionIdx}, + } + pa = Dictionary{ // pa + nil, + header{paLangStr, paLangIdx}, + header{paScriptStr, paScriptIdx}, + header{paRegionStr, paRegionIdx}, + } + pl = Dictionary{ // pl + nil, + header{plLangStr, plLangIdx}, + header{plScriptStr, plScriptIdx}, + header{plRegionStr, plRegionIdx}, + } + pt = Dictionary{ // pt + nil, + header{ptLangStr, ptLangIdx}, + header{ptScriptStr, ptScriptIdx}, + header{ptRegionStr, ptRegionIdx}, + } + ptPT = Dictionary{ // pt-PT + &pt, + header{ptPTLangStr, ptPTLangIdx}, + header{ptPTScriptStr, ptPTScriptIdx}, + header{ptPTRegionStr, ptPTRegionIdx}, + } + ro = Dictionary{ // ro + nil, + header{roLangStr, roLangIdx}, + header{roScriptStr, roScriptIdx}, + header{roRegionStr, roRegionIdx}, + } + ru = Dictionary{ // ru + nil, + header{ruLangStr, ruLangIdx}, + header{ruScriptStr, ruScriptIdx}, + header{ruRegionStr, ruRegionIdx}, + } + si = Dictionary{ // si + nil, + header{siLangStr, siLangIdx}, + header{siScriptStr, siScriptIdx}, + header{siRegionStr, siRegionIdx}, + } + sk = Dictionary{ // sk + nil, + header{skLangStr, skLangIdx}, + header{skScriptStr, skScriptIdx}, + header{skRegionStr, skRegionIdx}, + } + sl = Dictionary{ // sl + nil, + header{slLangStr, slLangIdx}, + header{slScriptStr, slScriptIdx}, + header{slRegionStr, slRegionIdx}, + } + sq = Dictionary{ // sq + nil, + header{sqLangStr, sqLangIdx}, + header{sqScriptStr, sqScriptIdx}, + header{sqRegionStr, sqRegionIdx}, + } + sr = Dictionary{ // sr + nil, + header{srLangStr, srLangIdx}, + header{srScriptStr, srScriptIdx}, + header{srRegionStr, srRegionIdx}, + } + srLatn = Dictionary{ // sr-Latn + nil, + header{srLatnLangStr, srLatnLangIdx}, + header{srLatnScriptStr, srLatnScriptIdx}, + header{srLatnRegionStr, srLatnRegionIdx}, + } + sv = Dictionary{ // sv + nil, + header{svLangStr, svLangIdx}, + header{svScriptStr, svScriptIdx}, + header{svRegionStr, svRegionIdx}, + } + sw = Dictionary{ // sw + nil, + header{swLangStr, swLangIdx}, + header{swScriptStr, swScriptIdx}, + header{swRegionStr, swRegionIdx}, + } + ta = Dictionary{ // ta + nil, + header{taLangStr, taLangIdx}, + header{taScriptStr, taScriptIdx}, + header{taRegionStr, taRegionIdx}, + } + te = Dictionary{ // te + nil, + header{teLangStr, teLangIdx}, + header{teScriptStr, teScriptIdx}, + header{teRegionStr, teRegionIdx}, + } + th = Dictionary{ // th + nil, + header{thLangStr, thLangIdx}, + header{thScriptStr, thScriptIdx}, + header{thRegionStr, thRegionIdx}, + } + tr = Dictionary{ // tr + nil, + header{trLangStr, trLangIdx}, + header{trScriptStr, trScriptIdx}, + header{trRegionStr, trRegionIdx}, + } + uk = Dictionary{ // uk + nil, + header{ukLangStr, ukLangIdx}, + header{ukScriptStr, ukScriptIdx}, + header{ukRegionStr, ukRegionIdx}, + } + ur = Dictionary{ // ur + nil, + header{urLangStr, urLangIdx}, + header{urScriptStr, urScriptIdx}, + header{urRegionStr, urRegionIdx}, + } + uz = Dictionary{ // uz + nil, + header{uzLangStr, uzLangIdx}, + header{uzScriptStr, uzScriptIdx}, + header{uzRegionStr, uzRegionIdx}, + } + vi = Dictionary{ // vi + nil, + header{viLangStr, viLangIdx}, + header{viScriptStr, viScriptIdx}, + header{viRegionStr, viRegionIdx}, + } + zh = Dictionary{ // zh + nil, + header{zhLangStr, zhLangIdx}, + header{zhScriptStr, zhScriptIdx}, + header{zhRegionStr, zhRegionIdx}, + } + zhHant = Dictionary{ // zh-Hant + nil, + header{zhHantLangStr, zhHantLangIdx}, + header{zhHantScriptStr, zhHantScriptIdx}, + header{zhHantRegionStr, zhHantRegionIdx}, + } + zu = Dictionary{ // zu + nil, + header{zuLangStr, zuLangIdx}, + header{zuScriptStr, zuScriptIdx}, + header{zuRegionStr, zuRegionIdx}, + } +) + +// Total size for 79 entries: 10112 bytes (10 KB) + +// Number of keys: 217 +var ( + selfIndex = tagIndex{ + "afakamarasazbebgbmbnbobrbscacecscydadedzeeeleneoeseteufafffifofrfygagdgl" + + "gugvhahehihrhuhyidigiiisitjakakikkklkmknkokskwkylblglnloltlulvmgmkml" + + "mnmrmsmtmyndnenlnnnoomorospaplpsptqurmrnrorurwsesgsiskslsnsosqsrsvsw" + + "tatethtitotrugukuruzviyiyozhzu", + "agqasaastbasbembezbrxcggchrckbdavdjedsbduadyoebuewofilfurgswguzhawhsbjgo" + + "jmckabkamkdekeakhqkkjklnkokksbksfkshlaglktlrcluoluymasmermfemghmgomu" + + "amznnaqnnhnusnynprgrofrwksahsaqsbpsehsesshismnteotwqtzmvaivunwaexogy" + + "avzgh", + "", + } + selfTagsLong = []string{ // 27 elements + "ar-001", + "az-Cyrl", + "bs-Cyrl", + "de-AT", + "de-CH", + "en-AU", + "en-CA", + "en-GB", + "en-US", + "es-419", + "es-ES", + "es-MX", + "fa-AF", + "fr-CA", + "fr-CH", + "nl-BE", + "pa-Arab", + "pt-BR", + "pt-PT", + "ro-MD", + "shi-Latn", + "sr-Latn", + "uz-Arab", + "uz-Cyrl", + "vai-Latn", + "zh-Hans", + "zh-Hant", + } +) + +var selfHeaders = [1]header{ + { // mul + "AfrikaansAkanአማርኛالعربيةঅসমীয়াazərbaycan diliбеларускаябългарскиbamanak" + + "anবাংলাབོད་སྐད་brezhonegbosanskicatalàнохчийнčeštinaCymraegdanskDeut" + + "schརྫོང་ཁEʋegbeΕλληνικάEnglishesperantoespañoleestieuskaraفارسیPulaa" + + "rsuomiføroysktfrançaisWest-FryskGaeilgeGàidhliggalegoગુજરાતીGaelgHau" + + "saעבריתहिन्दीhrvatskimagyarհայերենIndonesiaIgboꆈꌠꉙíslenskaitaliano日本" + + "語ქართულიGikuyuқазақ тіліkalaallisutខ្មែរಕನ್ನಡ한국어کٲشُرkernewekкыргы" + + "зчаLëtzebuergeschLugandalingálaລາວlietuviųTshilubalatviešuMalagasyм" + + "акедонскиമലയാളംмонголमराठीBahasa MelayuMaltiဗမာisiNdebeleनेपालीNede" + + "rlandsnynorsknorsk bokmålOromooଓଡ଼ିଆиронਪੰਜਾਬੀpolskiپښتوportuguêsRun" + + "asimirumantschIkirundiromânăрусскийKinyarwandadavvisámegiellaSängöසි" + + "ංහලslovenčinaslovenščinachiShonaSoomaalishqipсрпскиsvenskaKiswahil" + + "iதமிழ்తెలుగుไทยትግርኛlea fakatongaTürkçeئۇيغۇرچەукраїнськаاردوo‘zbekTi" + + "ếng ViệtייִדישÈdè Yorùbá中文isiZuluAghemKipareasturianuƁàsàaIchibemb" + + "aHibenaबड़ोRukigaᏣᎳᎩکوردیی ناوەندیKitaitaZarmaciinedolnoserbšćinaduá" + + "lájoolaKĩembuewondoFilipinofurlanSchwiizertüütschEkegusiiʻŌlelo Hawa" + + "iʻihornjoserbšćinaNdaꞌaKimachameTaqbaylitKikambaChimakondekabuverdia" + + "nuKoyra ciinikakɔKalenjinकोंकणीKishambaarikpaKölschKɨlaangiLakȟólʼiy" + + "apiلۊری شومالیDholuoLuluhiaMaaKĩmĩrũkreol morisienMakuametaʼMUNDAŊما" + + "زرونیKhoekhoegowabShwóŋò ngiembɔɔnThok NathRunyankoreprūsiskanKihor" + + "omboKiruwaсаха тылаKisampurIshisangusenaKoyraboro senniⵜⴰⵛⵍⵃⵉⵜanarâš" + + "kielâKitesoTasawaq senniTamaziɣt n laṭlaṣꕙꔤKyivunjoWalserOlusoganuas" + + "ueⵜⴰⵎⴰⵣⵉⵖⵜالعربية الرسمية الحديثةазәрбајҹан дилибосанскиÖsterreichis" + + "ches DeutschSchweizer HochdeutschAustralian EnglishCanadian EnglishB" + + "ritish EnglishAmerican Englishespañol latinoamericanoespañol de Espa" + + "ñaespañol de Méxicoدریfrançais canadienfrançais suisseVlaamsپنجابیp" + + "ortuguês do Brasilportuguês europeumoldoveneascăTashelḥiytSrpskohrva" + + "tskiاوزبیکЎзбекVai简体中文繁體中文", + []uint16{ // 218 elements + // Entry 0 - 3F + 0x0000, 0x0009, 0x000d, 0x0019, 0x0027, 0x003c, 0x004c, 0x0060, + 0x0072, 0x007b, 0x008a, 0x00a2, 0x00ab, 0x00b3, 0x00ba, 0x00c8, + 0x00d1, 0x00d8, 0x00dd, 0x00e4, 0x00f6, 0x00fd, 0x010d, 0x0114, + 0x011d, 0x0125, 0x012a, 0x0131, 0x013b, 0x0141, 0x0146, 0x014f, + 0x0158, 0x0162, 0x0169, 0x0172, 0x0178, 0x018d, 0x0192, 0x0197, + 0x01a1, 0x01b3, 0x01bb, 0x01c1, 0x01cf, 0x01d8, 0x01dc, 0x01e5, + 0x01ee, 0x01f6, 0x01ff, 0x0214, 0x021a, 0x022d, 0x0238, 0x0247, + 0x0256, 0x025f, 0x0269, 0x0271, 0x0281, 0x0290, 0x0297, 0x029f, + // Entry 40 - 7F + 0x02a8, 0x02b1, 0x02b9, 0x02c2, 0x02ca, 0x02de, 0x02f0, 0x02fc, + 0x030b, 0x0318, 0x031d, 0x0326, 0x0330, 0x0342, 0x034c, 0x0353, + 0x0360, 0x0366, 0x0375, 0x037d, 0x038f, 0x0395, 0x039d, 0x03a7, + 0x03af, 0x03b8, 0x03c0, 0x03c8, 0x03d6, 0x03e1, 0x03f1, 0x03f8, + 0x0407, 0x0412, 0x041f, 0x0427, 0x042f, 0x0434, 0x0440, 0x0447, + 0x0450, 0x045f, 0x0471, 0x047a, 0x0486, 0x0493, 0x049b, 0x04ab, + 0x04bf, 0x04c7, 0x04cf, 0x04dd, 0x04e9, 0x04f7, 0x04fd, 0x0504, + 0x0509, 0x050f, 0x0518, 0x0520, 0x0529, 0x052f, 0x053b, 0x0541, + // Entry 80 - BF + 0x054a, 0x0565, 0x056c, 0x0576, 0x0586, 0x058d, 0x0592, 0x0599, + 0x059f, 0x05a7, 0x05ad, 0x05bf, 0x05c7, 0x05d8, 0x05e9, 0x05f0, + 0x05f9, 0x0602, 0x0609, 0x0613, 0x061f, 0x062a, 0x062f, 0x0637, + 0x0649, 0x0652, 0x0657, 0x065e, 0x0667, 0x0676, 0x068b, 0x0691, + 0x0698, 0x069b, 0x06a4, 0x06b2, 0x06b7, 0x06bd, 0x06c4, 0x06d2, + 0x06df, 0x06f4, 0x06fd, 0x0707, 0x0711, 0x071a, 0x0720, 0x0731, + 0x0739, 0x0742, 0x0746, 0x0755, 0x076a, 0x0778, 0x077e, 0x078b, + 0x07a1, 0x07a7, 0x07af, 0x07b5, 0x07bc, 0x07c2, 0x07da, 0x0806, + // Entry C0 - FF + 0x0823, 0x0833, 0x084c, 0x0861, 0x0873, 0x0883, 0x0892, 0x08a2, + 0x08ba, 0x08cd, 0x08e0, 0x08e6, 0x08f8, 0x0908, 0x090e, 0x091a, + 0x092e, 0x0940, 0x094e, 0x095a, 0x0968, 0x0974, 0x097e, 0x0981, + 0x098d, 0x0999, + }, + }, +} + +// Total size for self: 4071 bytes (4 KB) + +// Total table size 1949845 bytes (1904KiB); checksum: 2C9D44F diff --git a/vendor/golang.org/x/text/language/examples_test.go b/vendor/golang.org/x/text/language/examples_test.go new file mode 100644 index 0000000000..05e712d77f --- /dev/null +++ b/vendor/golang.org/x/text/language/examples_test.go @@ -0,0 +1,396 @@ +// Copyright 2013 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 language_test + +import ( + "fmt" + + "golang.org/x/text/language" +) + +func ExampleCanonType() { + p := func(id string) { + fmt.Printf("Default(%s) -> %s\n", id, language.Make(id)) + fmt.Printf("BCP47(%s) -> %s\n", id, language.BCP47.Make(id)) + fmt.Printf("Macro(%s) -> %s\n", id, language.Macro.Make(id)) + fmt.Printf("All(%s) -> %s\n", id, language.All.Make(id)) + } + p("en-Latn") + p("sh") + p("zh-cmn") + p("bjd") + p("iw-Latn-fonipa-u-cu-usd") + // Output: + // Default(en-Latn) -> en-Latn + // BCP47(en-Latn) -> en + // Macro(en-Latn) -> en-Latn + // All(en-Latn) -> en + // Default(sh) -> sr-Latn + // BCP47(sh) -> sh + // Macro(sh) -> sh + // All(sh) -> sr-Latn + // Default(zh-cmn) -> cmn + // BCP47(zh-cmn) -> cmn + // Macro(zh-cmn) -> zh + // All(zh-cmn) -> zh + // Default(bjd) -> drl + // BCP47(bjd) -> drl + // Macro(bjd) -> bjd + // All(bjd) -> drl + // Default(iw-Latn-fonipa-u-cu-usd) -> he-Latn-fonipa-u-cu-usd + // BCP47(iw-Latn-fonipa-u-cu-usd) -> he-Latn-fonipa-u-cu-usd + // Macro(iw-Latn-fonipa-u-cu-usd) -> iw-Latn-fonipa-u-cu-usd + // All(iw-Latn-fonipa-u-cu-usd) -> he-Latn-fonipa-u-cu-usd +} + +func ExampleTag_Base() { + fmt.Println(language.Make("und").Base()) + fmt.Println(language.Make("und-US").Base()) + fmt.Println(language.Make("und-NL").Base()) + fmt.Println(language.Make("und-419").Base()) // Latin America + fmt.Println(language.Make("und-ZZ").Base()) + // Output: + // en Low + // en High + // nl High + // es Low + // en Low +} + +func ExampleTag_Script() { + en := language.Make("en") + sr := language.Make("sr") + sr_Latn := language.Make("sr_Latn") + fmt.Println(en.Script()) + fmt.Println(sr.Script()) + // Was a script explicitly specified? + _, c := sr.Script() + fmt.Println(c == language.Exact) + _, c = sr_Latn.Script() + fmt.Println(c == language.Exact) + // Output: + // Latn High + // Cyrl Low + // false + // true +} + +func ExampleTag_Region() { + ru := language.Make("ru") + en := language.Make("en") + fmt.Println(ru.Region()) + fmt.Println(en.Region()) + // Output: + // RU Low + // US Low +} + +func ExampleRegion_TLD() { + us := language.MustParseRegion("US") + gb := language.MustParseRegion("GB") + uk := language.MustParseRegion("UK") + bu := language.MustParseRegion("BU") + + fmt.Println(us.TLD()) + fmt.Println(gb.TLD()) + fmt.Println(uk.TLD()) + fmt.Println(bu.TLD()) + + fmt.Println(us.Canonicalize().TLD()) + fmt.Println(gb.Canonicalize().TLD()) + fmt.Println(uk.Canonicalize().TLD()) + fmt.Println(bu.Canonicalize().TLD()) + // Output: + // US <nil> + // UK <nil> + // UK <nil> + // ZZ language: region is not a valid ccTLD + // US <nil> + // UK <nil> + // UK <nil> + // MM <nil> +} + +func ExampleCompose() { + nl, _ := language.ParseBase("nl") + us, _ := language.ParseRegion("US") + de := language.Make("de-1901-u-co-phonebk") + jp := language.Make("ja-JP") + fi := language.Make("fi-x-ing") + + u, _ := language.ParseExtension("u-nu-arabic") + x, _ := language.ParseExtension("x-piglatin") + + // Combine a base language and region. + fmt.Println(language.Compose(nl, us)) + // Combine a base language and extension. + fmt.Println(language.Compose(nl, x)) + // Replace the region. + fmt.Println(language.Compose(jp, us)) + // Combine several tags. + fmt.Println(language.Compose(us, nl, u)) + + // Replace the base language of a tag. + fmt.Println(language.Compose(de, nl)) + fmt.Println(language.Compose(de, nl, u)) + // Remove the base language. + fmt.Println(language.Compose(de, language.Base{})) + // Remove all variants. + fmt.Println(language.Compose(de, []language.Variant{})) + // Remove all extensions. + fmt.Println(language.Compose(de, []language.Extension{})) + fmt.Println(language.Compose(fi, []language.Extension{})) + // Remove all variants and extensions. + fmt.Println(language.Compose(de.Raw())) + + // An error is gobbled or returned if non-nil. + fmt.Println(language.Compose(language.ParseRegion("ZA"))) + fmt.Println(language.Compose(language.ParseRegion("HH"))) + + // Compose uses the same Default canonicalization as Make. + fmt.Println(language.Compose(language.Raw.Parse("en-Latn-UK"))) + + // Call compose on a different CanonType for different results. + fmt.Println(language.All.Compose(language.Raw.Parse("en-Latn-UK"))) + + // Output: + // nl-US <nil> + // nl-x-piglatin <nil> + // ja-US <nil> + // nl-US-u-nu-arabic <nil> + // nl-1901-u-co-phonebk <nil> + // nl-1901-u-nu-arabic <nil> + // und-1901-u-co-phonebk <nil> + // de-u-co-phonebk <nil> + // de-1901 <nil> + // fi <nil> + // de <nil> + // und-ZA <nil> + // und language: subtag "HH" is well-formed but unknown + // en-Latn-GB <nil> + // en-GB <nil> +} + +func ExampleParse_errors() { + for _, s := range []string{"Foo", "Bar", "Foobar"} { + _, err := language.Parse(s) + if err != nil { + if inv, ok := err.(language.ValueError); ok { + fmt.Println(inv.Subtag()) + } else { + fmt.Println(s) + } + } + } + for _, s := range []string{"en", "aa-Uuuu", "AC", "ac-u"} { + _, err := language.Parse(s) + switch e := err.(type) { + case language.ValueError: + fmt.Printf("%s: culprit %q\n", s, e.Subtag()) + case nil: + // No error. + default: + // A syntax error. + fmt.Printf("%s: ill-formed\n", s) + } + } + // Output: + // foo + // Foobar + // aa-Uuuu: culprit "Uuuu" + // AC: culprit "ac" + // ac-u: ill-formed +} + +func ExampleParent() { + p := func(tag string) { + fmt.Printf("parent(%v): %v\n", tag, language.Make(tag).Parent()) + } + p("zh-CN") + + // Australian English inherits from World English. + p("en-AU") + + // If the tag has a different maximized script from its parent, a tag with + // this maximized script is inserted. This allows different language tags + // which have the same base language and script in common to inherit from + // a common set of settings. + p("zh-HK") + + // If the maximized script of the parent is not identical, CLDR will skip + // inheriting from it, as it means there will not be many entries in common + // and inheriting from it is nonsensical. + p("zh-Hant") + + // The parent of a tag with variants and extensions is the tag with all + // variants and extensions removed. + p("de-1994-u-co-phonebk") + + // Remove default script. + p("de-Latn-LU") + + // Output: + // parent(zh-CN): zh + // parent(en-AU): en-001 + // parent(zh-HK): zh-Hant + // parent(zh-Hant): und + // parent(de-1994-u-co-phonebk): de + // parent(de-Latn-LU): de +} + +// ExampleMatcher_bestMatch gives some examples of getting the best match of +// a set of tags to any of the tags of given set. +func ExampleMatcher() { + // This is the set of tags from which we want to pick the best match. These + // can be, for example, the supported languages for some package. + tags := []language.Tag{ + language.English, + language.BritishEnglish, + language.French, + language.Afrikaans, + language.BrazilianPortuguese, + language.EuropeanPortuguese, + language.Croatian, + language.SimplifiedChinese, + language.Raw.Make("iw-IL"), + language.Raw.Make("iw"), + language.Raw.Make("he"), + } + m := language.NewMatcher(tags) + + // A simple match. + fmt.Println(m.Match(language.Make("fr"))) + + // Australian English is closer to British than American English. + fmt.Println(m.Match(language.Make("en-AU"))) + + // Default to the first tag passed to the Matcher if there is no match. + fmt.Println(m.Match(language.Make("ar"))) + + // Get the default tag. + fmt.Println(m.Match()) + + fmt.Println("----") + + // Croatian speakers will likely understand Serbian written in Latin script. + fmt.Println(m.Match(language.Make("sr-Latn"))) + + // We match SimplifiedChinese, but with Low confidence. + fmt.Println(m.Match(language.TraditionalChinese)) + + // Serbian in Latin script is a closer match to Croatian than Traditional + // Chinese to Simplified Chinese. + fmt.Println(m.Match(language.TraditionalChinese, language.Make("sr-Latn"))) + + fmt.Println("----") + + // In case a multiple variants of a language are available, the most spoken + // variant is typically returned. + fmt.Println(m.Match(language.Portuguese)) + + // Pick the first value passed to Match in case of a tie. + fmt.Println(m.Match(language.Dutch, language.Make("fr-BE"), language.Make("af-NA"))) + fmt.Println(m.Match(language.Dutch, language.Make("af-NA"), language.Make("fr-BE"))) + + fmt.Println("----") + + // If a Matcher is initialized with a language and it's deprecated version, + // it will distinguish between them. + fmt.Println(m.Match(language.Raw.Make("iw"))) + + // However, for non-exact matches, it will treat deprecated versions as + // equivalent and consider other factors first. + fmt.Println(m.Match(language.Raw.Make("he-IL"))) + + fmt.Println("----") + + // User settings passed to the Unicode extension are ignored for matching + // and preserved in the returned tag. + fmt.Println(m.Match(language.Make("de-u-co-phonebk"), language.Make("fr-u-cu-frf"))) + + // Even if the matching language is different. + fmt.Println(m.Match(language.Make("de-u-co-phonebk"), language.Make("br-u-cu-frf"))) + + // If there is no matching language, the options of the first preferred tag are used. + fmt.Println(m.Match(language.Make("de-u-co-phonebk"))) + + // Output: + // fr 2 Exact + // en-GB 1 High + // en 0 No + // en 0 No + // ---- + // hr 6 High + // zh-Hans 7 Low + // hr 6 High + // ---- + // pt-BR 4 High + // fr 2 High + // af 3 High + // ---- + // iw 9 Exact + // iw-IL 8 Exact + // ---- + // fr-u-cu-frf 2 Exact + // fr-u-cu-frf 2 High + // en-u-co-phonebk 0 No +} + +func ExampleComprehends() { + // Various levels of comprehensibility. + fmt.Println(language.Comprehends(language.English, language.English)) + fmt.Println(language.Comprehends(language.AmericanEnglish, language.BritishEnglish)) + + // An explicit Und results in no match. + fmt.Println(language.Comprehends(language.English, language.Und)) + + fmt.Println("----") + + // There is usually no mutual comprehensibility between different scripts. + fmt.Println(language.Comprehends(language.Make("en-Dsrt"), language.English)) + + // One exception is for Traditional versus Simplified Chinese, albeit with + // a low confidence. + fmt.Println(language.Comprehends(language.TraditionalChinese, language.SimplifiedChinese)) + + fmt.Println("----") + + // A Swiss German speaker will often understand High German. + fmt.Println(language.Comprehends(language.Make("gsw"), language.Make("de"))) + + // The converse is not generally the case. + fmt.Println(language.Comprehends(language.Make("de"), language.Make("gsw"))) + + // Output: + // Exact + // High + // No + // ---- + // No + // Low + // ---- + // High + // No +} + +func ExampleTag_values() { + us := language.MustParseRegion("US") + en := language.MustParseBase("en") + + lang, _, region := language.AmericanEnglish.Raw() + fmt.Println(lang == en, region == us) + + lang, _, region = language.BritishEnglish.Raw() + fmt.Println(lang == en, region == us) + + // Tags can be compared for exact equivalence using '=='. + en_us, _ := language.Compose(en, us) + fmt.Println(en_us == language.AmericanEnglish) + + // Output: + // true true + // true false + // true +} diff --git a/vendor/golang.org/x/text/language/gen_common.go b/vendor/golang.org/x/text/language/gen_common.go new file mode 100644 index 0000000000..83ce180133 --- /dev/null +++ b/vendor/golang.org/x/text/language/gen_common.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 ignore + +package main + +// This file contains code common to the maketables.go and the package code. + +// langAliasType is the type of an alias in langAliasMap. +type langAliasType int8 + +const ( + langDeprecated langAliasType = iota + langMacro + langLegacy + + langAliasTypeUnknown langAliasType = -1 +) diff --git a/vendor/golang.org/x/text/language/gen_index.go b/vendor/golang.org/x/text/language/gen_index.go new file mode 100644 index 0000000000..eef555cd3a --- /dev/null +++ b/vendor/golang.org/x/text/language/gen_index.go @@ -0,0 +1,162 @@ +// 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 ignore + +package main + +// This file generates derivative tables based on the language package itself. + +import ( + "bytes" + "flag" + "fmt" + "io/ioutil" + "log" + "reflect" + "sort" + "strings" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/language" + "golang.org/x/text/unicode/cldr" +) + +var ( + test = flag.Bool("test", false, + "test existing tables; can be used to compare web data with package data.") + + draft = flag.String("draft", + "contributed", + `Minimal draft requirements (approved, contributed, provisional, unconfirmed).`) +) + +func main() { + gen.Init() + + // Read the CLDR zip file. + r := gen.OpenCLDRCoreZip() + defer r.Close() + + d := &cldr.Decoder{} + data, err := d.DecodeZip(r) + if err != nil { + log.Fatalf("DecodeZip: %v", err) + } + + w := gen.NewCodeWriter() + defer func() { + buf := &bytes.Buffer{} + + if _, err = w.WriteGo(buf, "language"); err != nil { + log.Fatalf("Error formatting file index.go: %v", err) + } + + // Since we're generating a table for our own package we need to rewrite + // doing the equivalent of go fmt -r 'language.b -> b'. Using + // bytes.Replace will do. + out := bytes.Replace(buf.Bytes(), []byte("language."), nil, -1) + if err := ioutil.WriteFile("index.go", out, 0600); err != nil { + log.Fatalf("Could not create file index.go: %v", err) + } + }() + + m := map[language.Tag]bool{} + for _, lang := range data.Locales() { + // We include all locales unconditionally to be consistent with en_US. + // We want en_US, even though it has no data associated with it. + + // TODO: put any of the languages for which no data exists at the end + // of the index. This allows all components based on ICU to use that + // as the cutoff point. + // if x := data.RawLDML(lang); false || + // x.LocaleDisplayNames != nil || + // x.Characters != nil || + // x.Delimiters != nil || + // x.Measurement != nil || + // x.Dates != nil || + // x.Numbers != nil || + // x.Units != nil || + // x.ListPatterns != nil || + // x.Collations != nil || + // x.Segmentations != nil || + // x.Rbnf != nil || + // x.Annotations != nil || + // x.Metadata != nil { + + // TODO: support POSIX natively, albeit non-standard. + tag := language.Make(strings.Replace(lang, "_POSIX", "-u-va-posix", 1)) + m[tag] = true + // } + } + // Include locales for plural rules, which uses a different structure. + for _, plurals := range data.Supplemental().Plurals { + for _, rules := range plurals.PluralRules { + for _, lang := range strings.Split(rules.Locales, " ") { + m[language.Make(lang)] = true + } + } + } + + var core, special []language.Tag + + for t := range m { + if x := t.Extensions(); len(x) != 0 && fmt.Sprint(x) != "[u-va-posix]" { + log.Fatalf("Unexpected extension %v in %v", x, t) + } + if len(t.Variants()) == 0 && len(t.Extensions()) == 0 { + core = append(core, t) + } else { + special = append(special, t) + } + } + + w.WriteComment(` + NumCompactTags is the number of common tags. The maximum tag is + NumCompactTags-1.`) + w.WriteConst("NumCompactTags", len(core)+len(special)) + + sort.Sort(byAlpha(special)) + w.WriteVar("specialTags", special) + + // TODO: order by frequency? + sort.Sort(byAlpha(core)) + + // Size computations are just an estimate. + w.Size += int(reflect.TypeOf(map[uint32]uint16{}).Size()) + w.Size += len(core) * 6 // size of uint32 and uint16 + + fmt.Fprintln(w) + fmt.Fprintln(w, "var coreTags = map[uint32]uint16{") + fmt.Fprintln(w, "0x0: 0, // und") + i := len(special) + 1 // Und and special tags already written. + for _, t := range core { + if t == language.Und { + continue + } + fmt.Fprint(w.Hash, t, i) + b, s, r := t.Raw() + fmt.Fprintf(w, "0x%s%s%s: %d, // %s\n", + getIndex(b, 3), // 3 is enough as it is guaranteed to be a compact number + getIndex(s, 2), + getIndex(r, 3), + i, t) + i++ + } + fmt.Fprintln(w, "}") +} + +// getIndex prints the subtag type and extracts its index of size nibble. +// If the index is less than n nibbles, the result is prefixed with 0s. +func getIndex(x interface{}, n int) string { + s := fmt.Sprintf("%#v", x) // s is of form Type{typeID: 0x00} + s = s[strings.Index(s, "0x")+2 : len(s)-1] + return strings.Repeat("0", n-len(s)) + s +} + +type byAlpha []language.Tag + +func (a byAlpha) Len() int { return len(a) } +func (a byAlpha) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byAlpha) Less(i, j int) bool { return a[i].String() < a[j].String() } diff --git a/vendor/golang.org/x/text/language/go1_1.go b/vendor/golang.org/x/text/language/go1_1.go new file mode 100644 index 0000000000..380f4c09f7 --- /dev/null +++ b/vendor/golang.org/x/text/language/go1_1.go @@ -0,0 +1,38 @@ +// Copyright 2013 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.2 + +package language + +import "sort" + +func sortStable(s sort.Interface) { + ss := stableSort{ + s: s, + pos: make([]int, s.Len()), + } + for i := range ss.pos { + ss.pos[i] = i + } + sort.Sort(&ss) +} + +type stableSort struct { + s sort.Interface + pos []int +} + +func (s *stableSort) Len() int { + return len(s.pos) +} + +func (s *stableSort) Less(i, j int) bool { + return s.s.Less(i, j) || !s.s.Less(j, i) && s.pos[i] < s.pos[j] +} + +func (s *stableSort) Swap(i, j int) { + s.s.Swap(i, j) + s.pos[i], s.pos[j] = s.pos[j], s.pos[i] +} diff --git a/vendor/golang.org/x/text/language/go1_2.go b/vendor/golang.org/x/text/language/go1_2.go new file mode 100644 index 0000000000..38268c57a3 --- /dev/null +++ b/vendor/golang.org/x/text/language/go1_2.go @@ -0,0 +1,11 @@ +// Copyright 2013 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.2 + +package language + +import "sort" + +var sortStable = sort.Stable diff --git a/vendor/golang.org/x/text/language/httpexample_test.go b/vendor/golang.org/x/text/language/httpexample_test.go new file mode 100644 index 0000000000..40d0663c8f --- /dev/null +++ b/vendor/golang.org/x/text/language/httpexample_test.go @@ -0,0 +1,48 @@ +// Copyright 2016 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 language_test + +import ( + "fmt" + "net/http" + "strings" + + "golang.org/x/text/language" +) + +// matcher is a language.Matcher configured for all supported languages. +var matcher = language.NewMatcher([]language.Tag{ + language.BritishEnglish, + language.Norwegian, + language.German, +}) + +// handler is a http.HandlerFunc. +func handler(w http.ResponseWriter, r *http.Request) { + t, q, err := language.ParseAcceptLanguage(r.Header.Get("Accept-Language")) + // We ignore the error: the default language will be selected for t == nil. + tag, _, _ := matcher.Match(t...) + fmt.Printf("%5v (t: %6v; q: %3v; err: %v)\n", tag, t, q, err) +} + +func ExampleParseAcceptLanguage() { + for _, al := range []string{ + "nn;q=0.3, en-us;q=0.8, en,", + "gsw, en;q=0.7, en-US;q=0.8", + "gsw, nl, da", + "invalid", + } { + // Create dummy request with Accept-Language set and pass it to handler. + r, _ := http.NewRequest("GET", "example.com", strings.NewReader("Hello")) + r.Header.Set("Accept-Language", al) + handler(nil, r) + } + + // Output: + // en-GB (t: [ en en-US nn]; q: [ 1 0.8 0.3]; err: <nil>) + // en-GB (t: [ gsw en-US en]; q: [ 1 0.8 0.7]; err: <nil>) + // de (t: [ gsw nl da]; q: [ 1 1 1]; err: <nil>) + // en-GB (t: []; q: []; err: language: tag is not well-formed) +} diff --git a/vendor/golang.org/x/text/language/index.go b/vendor/golang.org/x/text/language/index.go new file mode 100644 index 0000000000..c640f1e149 --- /dev/null +++ b/vendor/golang.org/x/text/language/index.go @@ -0,0 +1,757 @@ +// This file was generated by go generate; DO NOT EDIT + +package language + +// NumCompactTags is the number of common tags. The maximum tag is +// NumCompactTags-1. +const NumCompactTags = 742 + +var specialTags = []Tag{ // 2 elements + 0: {lang: 0x61, region: 0x6d, script: 0x0, pVariant: 0x5, pExt: 0xe, str: "ca-ES-valencia"}, + 1: {lang: 0x9a, region: 0x132, script: 0x0, pVariant: 0x5, pExt: 0x5, str: "en-US-u-va-posix"}, +} // Size: 72 bytes + +var coreTags = map[uint32]uint16{ + 0x0: 0, // und + 0x00a00000: 3, // af + 0x00a000d0: 4, // af-NA + 0x00a0015e: 5, // af-ZA + 0x00b00000: 6, // agq + 0x00b00051: 7, // agq-CM + 0x00d00000: 8, // ak + 0x00d0007e: 9, // ak-GH + 0x01100000: 10, // am + 0x0110006e: 11, // am-ET + 0x01500000: 12, // ar + 0x01500001: 13, // ar-001 + 0x01500022: 14, // ar-AE + 0x01500038: 15, // ar-BH + 0x01500061: 16, // ar-DJ + 0x01500066: 17, // ar-DZ + 0x0150006a: 18, // ar-EG + 0x0150006b: 19, // ar-EH + 0x0150006c: 20, // ar-ER + 0x01500095: 21, // ar-IL + 0x01500099: 22, // ar-IQ + 0x0150009f: 23, // ar-JO + 0x015000a6: 24, // ar-KM + 0x015000aa: 25, // ar-KW + 0x015000ae: 26, // ar-LB + 0x015000b7: 27, // ar-LY + 0x015000b8: 28, // ar-MA + 0x015000c7: 29, // ar-MR + 0x015000df: 30, // ar-OM + 0x015000eb: 31, // ar-PS + 0x015000f1: 32, // ar-QA + 0x01500106: 33, // ar-SA + 0x01500109: 34, // ar-SD + 0x01500113: 35, // ar-SO + 0x01500115: 36, // ar-SS + 0x0150011a: 37, // ar-SY + 0x0150011e: 38, // ar-TD + 0x01500126: 39, // ar-TN + 0x0150015b: 40, // ar-YE + 0x01c00000: 41, // as + 0x01c00097: 42, // as-IN + 0x01d00000: 43, // asa + 0x01d0012d: 44, // asa-TZ + 0x01f00000: 45, // ast + 0x01f0006d: 46, // ast-ES + 0x02400000: 47, // az + 0x0241d000: 48, // az-Cyrl + 0x0241d031: 49, // az-Cyrl-AZ + 0x0244f000: 50, // az-Latn + 0x0244f031: 51, // az-Latn-AZ + 0x02a00000: 52, // bas + 0x02a00051: 53, // bas-CM + 0x02f00000: 54, // be + 0x02f00046: 55, // be-BY + 0x03100000: 56, // bem + 0x0310015f: 57, // bem-ZM + 0x03300000: 58, // bez + 0x0330012d: 59, // bez-TZ + 0x03800000: 60, // bg + 0x03800037: 61, // bg-BG + 0x03c00000: 62, // bh + 0x04900000: 63, // bm + 0x049000c1: 64, // bm-ML + 0x04b00000: 65, // bn + 0x04b00034: 66, // bn-BD + 0x04b00097: 67, // bn-IN + 0x04c00000: 68, // bo + 0x04c00052: 69, // bo-CN + 0x04c00097: 70, // bo-IN + 0x05000000: 71, // br + 0x05000076: 72, // br-FR + 0x05300000: 73, // brx + 0x05300097: 74, // brx-IN + 0x05400000: 75, // bs + 0x0541d000: 76, // bs-Cyrl + 0x0541d032: 77, // bs-Cyrl-BA + 0x0544f000: 78, // bs-Latn + 0x0544f032: 79, // bs-Latn-BA + 0x06100000: 80, // ca + 0x06100021: 81, // ca-AD + 0x0610006d: 82, // ca-ES + 0x06100076: 83, // ca-FR + 0x0610009c: 84, // ca-IT + 0x06400000: 85, // ce + 0x06400104: 86, // ce-RU + 0x06600000: 87, // cgg + 0x0660012f: 88, // cgg-UG + 0x06c00000: 89, // chr + 0x06c00132: 90, // chr-US + 0x06f00000: 91, // ckb + 0x06f00099: 92, // ckb-IQ + 0x06f0009a: 93, // ckb-IR + 0x07900000: 94, // cs + 0x0790005d: 95, // cs-CZ + 0x07d00000: 96, // cu + 0x07d00104: 97, // cu-RU + 0x07f00000: 98, // cy + 0x07f00079: 99, // cy-GB + 0x08000000: 100, // da + 0x08000062: 101, // da-DK + 0x08000080: 102, // da-GL + 0x08300000: 103, // dav + 0x083000a2: 104, // dav-KE + 0x08500000: 105, // de + 0x0850002d: 106, // de-AT + 0x08500035: 107, // de-BE + 0x0850004d: 108, // de-CH + 0x0850005f: 109, // de-DE + 0x085000b0: 110, // de-LI + 0x085000b5: 111, // de-LU + 0x08800000: 112, // dje + 0x088000d2: 113, // dje-NE + 0x08b00000: 114, // dsb + 0x08b0005f: 115, // dsb-DE + 0x08e00000: 116, // dua + 0x08e00051: 117, // dua-CM + 0x08f00000: 118, // dv + 0x09000000: 119, // dyo + 0x09000112: 120, // dyo-SN + 0x09200000: 121, // dz + 0x09200042: 122, // dz-BT + 0x09300000: 123, // ebu + 0x093000a2: 124, // ebu-KE + 0x09400000: 125, // ee + 0x0940007e: 126, // ee-GH + 0x09400120: 127, // ee-TG + 0x09900000: 128, // el + 0x0990005c: 129, // el-CY + 0x09900085: 130, // el-GR + 0x09a00000: 131, // en + 0x09a00001: 132, // en-001 + 0x09a0001a: 133, // en-150 + 0x09a00024: 134, // en-AG + 0x09a00025: 135, // en-AI + 0x09a0002c: 136, // en-AS + 0x09a0002d: 137, // en-AT + 0x09a0002e: 138, // en-AU + 0x09a00033: 139, // en-BB + 0x09a00035: 140, // en-BE + 0x09a00039: 141, // en-BI + 0x09a0003c: 142, // en-BM + 0x09a00041: 143, // en-BS + 0x09a00045: 144, // en-BW + 0x09a00047: 145, // en-BZ + 0x09a00048: 146, // en-CA + 0x09a00049: 147, // en-CC + 0x09a0004d: 148, // en-CH + 0x09a0004f: 149, // en-CK + 0x09a00051: 150, // en-CM + 0x09a0005b: 151, // en-CX + 0x09a0005c: 152, // en-CY + 0x09a0005f: 153, // en-DE + 0x09a00060: 154, // en-DG + 0x09a00062: 155, // en-DK + 0x09a00063: 156, // en-DM + 0x09a0006c: 157, // en-ER + 0x09a00070: 158, // en-FI + 0x09a00071: 159, // en-FJ + 0x09a00072: 160, // en-FK + 0x09a00073: 161, // en-FM + 0x09a00079: 162, // en-GB + 0x09a0007a: 163, // en-GD + 0x09a0007d: 164, // en-GG + 0x09a0007e: 165, // en-GH + 0x09a0007f: 166, // en-GI + 0x09a00081: 167, // en-GM + 0x09a00088: 168, // en-GU + 0x09a0008a: 169, // en-GY + 0x09a0008b: 170, // en-HK + 0x09a00094: 171, // en-IE + 0x09a00095: 172, // en-IL + 0x09a00096: 173, // en-IM + 0x09a00097: 174, // en-IN + 0x09a00098: 175, // en-IO + 0x09a0009d: 176, // en-JE + 0x09a0009e: 177, // en-JM + 0x09a000a2: 178, // en-KE + 0x09a000a5: 179, // en-KI + 0x09a000a7: 180, // en-KN + 0x09a000ab: 181, // en-KY + 0x09a000af: 182, // en-LC + 0x09a000b2: 183, // en-LR + 0x09a000b3: 184, // en-LS + 0x09a000bd: 185, // en-MG + 0x09a000be: 186, // en-MH + 0x09a000c4: 187, // en-MO + 0x09a000c5: 188, // en-MP + 0x09a000c8: 189, // en-MS + 0x09a000c9: 190, // en-MT + 0x09a000ca: 191, // en-MU + 0x09a000cc: 192, // en-MW + 0x09a000ce: 193, // en-MY + 0x09a000d0: 194, // en-NA + 0x09a000d3: 195, // en-NF + 0x09a000d4: 196, // en-NG + 0x09a000d7: 197, // en-NL + 0x09a000db: 198, // en-NR + 0x09a000dd: 199, // en-NU + 0x09a000de: 200, // en-NZ + 0x09a000e4: 201, // en-PG + 0x09a000e5: 202, // en-PH + 0x09a000e6: 203, // en-PK + 0x09a000e9: 204, // en-PN + 0x09a000ea: 205, // en-PR + 0x09a000ee: 206, // en-PW + 0x09a00105: 207, // en-RW + 0x09a00107: 208, // en-SB + 0x09a00108: 209, // en-SC + 0x09a00109: 210, // en-SD + 0x09a0010a: 211, // en-SE + 0x09a0010b: 212, // en-SG + 0x09a0010c: 213, // en-SH + 0x09a0010d: 214, // en-SI + 0x09a00110: 215, // en-SL + 0x09a00115: 216, // en-SS + 0x09a00119: 217, // en-SX + 0x09a0011b: 218, // en-SZ + 0x09a0011d: 219, // en-TC + 0x09a00123: 220, // en-TK + 0x09a00127: 221, // en-TO + 0x09a0012a: 222, // en-TT + 0x09a0012b: 223, // en-TV + 0x09a0012d: 224, // en-TZ + 0x09a0012f: 225, // en-UG + 0x09a00131: 226, // en-UM + 0x09a00132: 227, // en-US + 0x09a00136: 228, // en-VC + 0x09a00139: 229, // en-VG + 0x09a0013a: 230, // en-VI + 0x09a0013c: 231, // en-VU + 0x09a0013f: 232, // en-WS + 0x09a0015e: 233, // en-ZA + 0x09a0015f: 234, // en-ZM + 0x09a00161: 235, // en-ZW + 0x09b00000: 236, // eo + 0x09b00001: 237, // eo-001 + 0x09c00000: 238, // es + 0x09c00003: 239, // es-003 + 0x09c0001e: 240, // es-419 + 0x09c0002b: 241, // es-AR + 0x09c0003e: 242, // es-BO + 0x09c00050: 243, // es-CL + 0x09c00053: 244, // es-CO + 0x09c00055: 245, // es-CR + 0x09c00058: 246, // es-CU + 0x09c00064: 247, // es-DO + 0x09c00067: 248, // es-EA + 0x09c00068: 249, // es-EC + 0x09c0006d: 250, // es-ES + 0x09c00084: 251, // es-GQ + 0x09c00087: 252, // es-GT + 0x09c0008d: 253, // es-HN + 0x09c00092: 254, // es-IC + 0x09c000cd: 255, // es-MX + 0x09c000d6: 256, // es-NI + 0x09c000e0: 257, // es-PA + 0x09c000e2: 258, // es-PE + 0x09c000e5: 259, // es-PH + 0x09c000ea: 260, // es-PR + 0x09c000ef: 261, // es-PY + 0x09c00118: 262, // es-SV + 0x09c00132: 263, // es-US + 0x09c00133: 264, // es-UY + 0x09c00138: 265, // es-VE + 0x09e00000: 266, // et + 0x09e00069: 267, // et-EE + 0x0a000000: 268, // eu + 0x0a00006d: 269, // eu-ES + 0x0a100000: 270, // ewo + 0x0a100051: 271, // ewo-CM + 0x0a300000: 272, // fa + 0x0a300023: 273, // fa-AF + 0x0a30009a: 274, // fa-IR + 0x0a500000: 275, // ff + 0x0a500051: 276, // ff-CM + 0x0a500082: 277, // ff-GN + 0x0a5000c7: 278, // ff-MR + 0x0a500112: 279, // ff-SN + 0x0a700000: 280, // fi + 0x0a700070: 281, // fi-FI + 0x0a900000: 282, // fil + 0x0a9000e5: 283, // fil-PH + 0x0ac00000: 284, // fo + 0x0ac00062: 285, // fo-DK + 0x0ac00074: 286, // fo-FO + 0x0ae00000: 287, // fr + 0x0ae00035: 288, // fr-BE + 0x0ae00036: 289, // fr-BF + 0x0ae00039: 290, // fr-BI + 0x0ae0003a: 291, // fr-BJ + 0x0ae0003b: 292, // fr-BL + 0x0ae00048: 293, // fr-CA + 0x0ae0004a: 294, // fr-CD + 0x0ae0004b: 295, // fr-CF + 0x0ae0004c: 296, // fr-CG + 0x0ae0004d: 297, // fr-CH + 0x0ae0004e: 298, // fr-CI + 0x0ae00051: 299, // fr-CM + 0x0ae00061: 300, // fr-DJ + 0x0ae00066: 301, // fr-DZ + 0x0ae00076: 302, // fr-FR + 0x0ae00078: 303, // fr-GA + 0x0ae0007c: 304, // fr-GF + 0x0ae00082: 305, // fr-GN + 0x0ae00083: 306, // fr-GP + 0x0ae00084: 307, // fr-GQ + 0x0ae0008f: 308, // fr-HT + 0x0ae000a6: 309, // fr-KM + 0x0ae000b5: 310, // fr-LU + 0x0ae000b8: 311, // fr-MA + 0x0ae000b9: 312, // fr-MC + 0x0ae000bc: 313, // fr-MF + 0x0ae000bd: 314, // fr-MG + 0x0ae000c1: 315, // fr-ML + 0x0ae000c6: 316, // fr-MQ + 0x0ae000c7: 317, // fr-MR + 0x0ae000ca: 318, // fr-MU + 0x0ae000d1: 319, // fr-NC + 0x0ae000d2: 320, // fr-NE + 0x0ae000e3: 321, // fr-PF + 0x0ae000e8: 322, // fr-PM + 0x0ae00100: 323, // fr-RE + 0x0ae00105: 324, // fr-RW + 0x0ae00108: 325, // fr-SC + 0x0ae00112: 326, // fr-SN + 0x0ae0011a: 327, // fr-SY + 0x0ae0011e: 328, // fr-TD + 0x0ae00120: 329, // fr-TG + 0x0ae00126: 330, // fr-TN + 0x0ae0013c: 331, // fr-VU + 0x0ae0013d: 332, // fr-WF + 0x0ae0015c: 333, // fr-YT + 0x0b500000: 334, // fur + 0x0b50009c: 335, // fur-IT + 0x0b800000: 336, // fy + 0x0b8000d7: 337, // fy-NL + 0x0b900000: 338, // ga + 0x0b900094: 339, // ga-IE + 0x0c100000: 340, // gd + 0x0c100079: 341, // gd-GB + 0x0c700000: 342, // gl + 0x0c70006d: 343, // gl-ES + 0x0d100000: 344, // gsw + 0x0d10004d: 345, // gsw-CH + 0x0d100076: 346, // gsw-FR + 0x0d1000b0: 347, // gsw-LI + 0x0d200000: 348, // gu + 0x0d200097: 349, // gu-IN + 0x0d600000: 350, // guw + 0x0d700000: 351, // guz + 0x0d7000a2: 352, // guz-KE + 0x0d800000: 353, // gv + 0x0d800096: 354, // gv-IM + 0x0db00000: 355, // ha + 0x0db0007e: 356, // ha-GH + 0x0db000d2: 357, // ha-NE + 0x0db000d4: 358, // ha-NG + 0x0dd00000: 359, // haw + 0x0dd00132: 360, // haw-US + 0x0df00000: 361, // he + 0x0df00095: 362, // he-IL + 0x0e000000: 363, // hi + 0x0e000097: 364, // hi-IN + 0x0ed00000: 365, // hr + 0x0ed00032: 366, // hr-BA + 0x0ed0008e: 367, // hr-HR + 0x0ee00000: 368, // hsb + 0x0ee0005f: 369, // hsb-DE + 0x0f100000: 370, // hu + 0x0f100090: 371, // hu-HU + 0x0f200000: 372, // hy + 0x0f200027: 373, // hy-AM + 0x0f700000: 374, // id + 0x0f700093: 375, // id-ID + 0x0f900000: 376, // ig + 0x0f9000d4: 377, // ig-NG + 0x0fa00000: 378, // ii + 0x0fa00052: 379, // ii-CN + 0x10100000: 380, // is + 0x1010009b: 381, // is-IS + 0x10200000: 382, // it + 0x1020004d: 383, // it-CH + 0x1020009c: 384, // it-IT + 0x10200111: 385, // it-SM + 0x10300000: 386, // iu + 0x10600000: 387, // ja + 0x106000a0: 388, // ja-JP + 0x10800000: 389, // jbo + 0x10900000: 390, // jgo + 0x10900051: 391, // jgo-CM + 0x10b00000: 392, // jmc + 0x10b0012d: 393, // jmc-TZ + 0x10e00000: 394, // jv + 0x11000000: 395, // ka + 0x1100007b: 396, // ka-GE + 0x11200000: 397, // kab + 0x11200066: 398, // kab-DZ + 0x11400000: 399, // kaj + 0x11500000: 400, // kam + 0x115000a2: 401, // kam-KE + 0x11800000: 402, // kcg + 0x11a00000: 403, // kde + 0x11a0012d: 404, // kde-TZ + 0x11c00000: 405, // kea + 0x11c00059: 406, // kea-CV + 0x12700000: 407, // khq + 0x127000c1: 408, // khq-ML + 0x12a00000: 409, // ki + 0x12a000a2: 410, // ki-KE + 0x12e00000: 411, // kk + 0x12e000ac: 412, // kk-KZ + 0x12f00000: 413, // kkj + 0x12f00051: 414, // kkj-CM + 0x13000000: 415, // kl + 0x13000080: 416, // kl-GL + 0x13100000: 417, // kln + 0x131000a2: 418, // kln-KE + 0x13200000: 419, // km + 0x132000a4: 420, // km-KH + 0x13400000: 421, // kn + 0x13400097: 422, // kn-IN + 0x13500000: 423, // ko + 0x135000a8: 424, // ko-KP + 0x135000a9: 425, // ko-KR + 0x13700000: 426, // kok + 0x13700097: 427, // kok-IN + 0x14000000: 428, // ks + 0x14000097: 429, // ks-IN + 0x14100000: 430, // ksb + 0x1410012d: 431, // ksb-TZ + 0x14200000: 432, // ksf + 0x14200051: 433, // ksf-CM + 0x14300000: 434, // ksh + 0x1430005f: 435, // ksh-DE + 0x14400000: 436, // ku + 0x14900000: 437, // kw + 0x14900079: 438, // kw-GB + 0x14c00000: 439, // ky + 0x14c000a3: 440, // ky-KG + 0x15000000: 441, // lag + 0x1500012d: 442, // lag-TZ + 0x15300000: 443, // lb + 0x153000b5: 444, // lb-LU + 0x15900000: 445, // lg + 0x1590012f: 446, // lg-UG + 0x16000000: 447, // lkt + 0x16000132: 448, // lkt-US + 0x16300000: 449, // ln + 0x16300029: 450, // ln-AO + 0x1630004a: 451, // ln-CD + 0x1630004b: 452, // ln-CF + 0x1630004c: 453, // ln-CG + 0x16400000: 454, // lo + 0x164000ad: 455, // lo-LA + 0x16700000: 456, // lrc + 0x16700099: 457, // lrc-IQ + 0x1670009a: 458, // lrc-IR + 0x16800000: 459, // lt + 0x168000b4: 460, // lt-LT + 0x16a00000: 461, // lu + 0x16a0004a: 462, // lu-CD + 0x16c00000: 463, // luo + 0x16c000a2: 464, // luo-KE + 0x16d00000: 465, // luy + 0x16d000a2: 466, // luy-KE + 0x16f00000: 467, // lv + 0x16f000b6: 468, // lv-LV + 0x17900000: 469, // mas + 0x179000a2: 470, // mas-KE + 0x1790012d: 471, // mas-TZ + 0x17f00000: 472, // mer + 0x17f000a2: 473, // mer-KE + 0x18100000: 474, // mfe + 0x181000ca: 475, // mfe-MU + 0x18200000: 476, // mg + 0x182000bd: 477, // mg-MG + 0x18300000: 478, // mgh + 0x183000cf: 479, // mgh-MZ + 0x18400000: 480, // mgo + 0x18400051: 481, // mgo-CM + 0x18b00000: 482, // mk + 0x18b000c0: 483, // mk-MK + 0x18c00000: 484, // ml + 0x18c00097: 485, // ml-IN + 0x18e00000: 486, // mn + 0x18e000c3: 487, // mn-MN + 0x19500000: 488, // mr + 0x19500097: 489, // mr-IN + 0x19900000: 490, // ms + 0x1990003d: 491, // ms-BN + 0x199000ce: 492, // ms-MY + 0x1990010b: 493, // ms-SG + 0x19a00000: 494, // mt + 0x19a000c9: 495, // mt-MT + 0x19c00000: 496, // mua + 0x19c00051: 497, // mua-CM + 0x1a400000: 498, // my + 0x1a4000c2: 499, // my-MM + 0x1a800000: 500, // mzn + 0x1a80009a: 501, // mzn-IR + 0x1aa00000: 502, // nah + 0x1ad00000: 503, // naq + 0x1ad000d0: 504, // naq-NA + 0x1ae00000: 505, // nb + 0x1ae000d8: 506, // nb-NO + 0x1ae0010e: 507, // nb-SJ + 0x1b000000: 508, // nd + 0x1b000161: 509, // nd-ZW + 0x1b300000: 510, // ne + 0x1b300097: 511, // ne-IN + 0x1b3000d9: 512, // ne-NP + 0x1bc00000: 513, // nl + 0x1bc0002f: 514, // nl-AW + 0x1bc00035: 515, // nl-BE + 0x1bc0003f: 516, // nl-BQ + 0x1bc0005a: 517, // nl-CW + 0x1bc000d7: 518, // nl-NL + 0x1bc00114: 519, // nl-SR + 0x1bc00119: 520, // nl-SX + 0x1bd00000: 521, // nmg + 0x1bd00051: 522, // nmg-CM + 0x1be00000: 523, // nn + 0x1be000d8: 524, // nn-NO + 0x1bf00000: 525, // nnh + 0x1bf00051: 526, // nnh-CM + 0x1c000000: 527, // no + 0x1c400000: 528, // nqo + 0x1c500000: 529, // nr + 0x1c700000: 530, // nso + 0x1c800000: 531, // nus + 0x1c800115: 532, // nus-SS + 0x1cb00000: 533, // ny + 0x1cd00000: 534, // nyn + 0x1cd0012f: 535, // nyn-UG + 0x1d100000: 536, // om + 0x1d10006e: 537, // om-ET + 0x1d1000a2: 538, // om-KE + 0x1d200000: 539, // or + 0x1d200097: 540, // or-IN + 0x1d300000: 541, // os + 0x1d30007b: 542, // os-GE + 0x1d300104: 543, // os-RU + 0x1d500000: 544, // pa + 0x1d505000: 545, // pa-Arab + 0x1d5050e6: 546, // pa-Arab-PK + 0x1d52e000: 547, // pa-Guru + 0x1d52e097: 548, // pa-Guru-IN + 0x1d900000: 549, // pap + 0x1e500000: 550, // pl + 0x1e5000e7: 551, // pl-PL + 0x1eb00000: 552, // prg + 0x1eb00001: 553, // prg-001 + 0x1ec00000: 554, // ps + 0x1ec00023: 555, // ps-AF + 0x1ed00000: 556, // pt + 0x1ed00029: 557, // pt-AO + 0x1ed00040: 558, // pt-BR + 0x1ed00059: 559, // pt-CV + 0x1ed00089: 560, // pt-GW + 0x1ed000c4: 561, // pt-MO + 0x1ed000cf: 562, // pt-MZ + 0x1ed000ec: 563, // pt-PT + 0x1ed00116: 564, // pt-ST + 0x1ed00124: 565, // pt-TL + 0x1ef00000: 566, // qu + 0x1ef0003e: 567, // qu-BO + 0x1ef00068: 568, // qu-EC + 0x1ef000e2: 569, // qu-PE + 0x1fa00000: 570, // rm + 0x1fa0004d: 571, // rm-CH + 0x1ff00000: 572, // rn + 0x1ff00039: 573, // rn-BI + 0x20100000: 574, // ro + 0x201000ba: 575, // ro-MD + 0x20100102: 576, // ro-RO + 0x20300000: 577, // rof + 0x2030012d: 578, // rof-TZ + 0x20500000: 579, // ru + 0x20500046: 580, // ru-BY + 0x205000a3: 581, // ru-KG + 0x205000ac: 582, // ru-KZ + 0x205000ba: 583, // ru-MD + 0x20500104: 584, // ru-RU + 0x2050012e: 585, // ru-UA + 0x20800000: 586, // rw + 0x20800105: 587, // rw-RW + 0x20900000: 588, // rwk + 0x2090012d: 589, // rwk-TZ + 0x20d00000: 590, // sah + 0x20d00104: 591, // sah-RU + 0x20e00000: 592, // saq + 0x20e000a2: 593, // saq-KE + 0x21200000: 594, // sbp + 0x2120012d: 595, // sbp-TZ + 0x21a00000: 596, // sdh + 0x21b00000: 597, // se + 0x21b00070: 598, // se-FI + 0x21b000d8: 599, // se-NO + 0x21b0010a: 600, // se-SE + 0x21d00000: 601, // seh + 0x21d000cf: 602, // seh-MZ + 0x21f00000: 603, // ses + 0x21f000c1: 604, // ses-ML + 0x22000000: 605, // sg + 0x2200004b: 606, // sg-CF + 0x22400000: 607, // shi + 0x2244f000: 608, // shi-Latn + 0x2244f0b8: 609, // shi-Latn-MA + 0x224cc000: 610, // shi-Tfng + 0x224cc0b8: 611, // shi-Tfng-MA + 0x22600000: 612, // si + 0x226000b1: 613, // si-LK + 0x22800000: 614, // sk + 0x2280010f: 615, // sk-SK + 0x22a00000: 616, // sl + 0x22a0010d: 617, // sl-SI + 0x22e00000: 618, // sma + 0x22f00000: 619, // smi + 0x23000000: 620, // smj + 0x23100000: 621, // smn + 0x23100070: 622, // smn-FI + 0x23300000: 623, // sms + 0x23400000: 624, // sn + 0x23400161: 625, // sn-ZW + 0x23600000: 626, // so + 0x23600061: 627, // so-DJ + 0x2360006e: 628, // so-ET + 0x236000a2: 629, // so-KE + 0x23600113: 630, // so-SO + 0x23800000: 631, // sq + 0x23800026: 632, // sq-AL + 0x238000c0: 633, // sq-MK + 0x2380014a: 634, // sq-XK + 0x23900000: 635, // sr + 0x2391d000: 636, // sr-Cyrl + 0x2391d032: 637, // sr-Cyrl-BA + 0x2391d0bb: 638, // sr-Cyrl-ME + 0x2391d103: 639, // sr-Cyrl-RS + 0x2391d14a: 640, // sr-Cyrl-XK + 0x2394f000: 641, // sr-Latn + 0x2394f032: 642, // sr-Latn-BA + 0x2394f0bb: 643, // sr-Latn-ME + 0x2394f103: 644, // sr-Latn-RS + 0x2394f14a: 645, // sr-Latn-XK + 0x23e00000: 646, // ss + 0x23f00000: 647, // ssy + 0x24000000: 648, // st + 0x24500000: 649, // sv + 0x24500030: 650, // sv-AX + 0x24500070: 651, // sv-FI + 0x2450010a: 652, // sv-SE + 0x24600000: 653, // sw + 0x2460004a: 654, // sw-CD + 0x246000a2: 655, // sw-KE + 0x2460012d: 656, // sw-TZ + 0x2460012f: 657, // sw-UG + 0x24d00000: 658, // syr + 0x24f00000: 659, // ta + 0x24f00097: 660, // ta-IN + 0x24f000b1: 661, // ta-LK + 0x24f000ce: 662, // ta-MY + 0x24f0010b: 663, // ta-SG + 0x25600000: 664, // te + 0x25600097: 665, // te-IN + 0x25800000: 666, // teo + 0x258000a2: 667, // teo-KE + 0x2580012f: 668, // teo-UG + 0x25b00000: 669, // th + 0x25b00121: 670, // th-TH + 0x25f00000: 671, // ti + 0x25f0006c: 672, // ti-ER + 0x25f0006e: 673, // ti-ET + 0x26000000: 674, // tig + 0x26200000: 675, // tk + 0x26200125: 676, // tk-TM + 0x26900000: 677, // tn + 0x26a00000: 678, // to + 0x26a00127: 679, // to-TO + 0x26d00000: 680, // tr + 0x26d0005c: 681, // tr-CY + 0x26d00129: 682, // tr-TR + 0x27000000: 683, // ts + 0x27c00000: 684, // twq + 0x27c000d2: 685, // twq-NE + 0x27f00000: 686, // tzm + 0x27f000b8: 687, // tzm-MA + 0x28100000: 688, // ug + 0x28100052: 689, // ug-CN + 0x28300000: 690, // uk + 0x2830012e: 691, // uk-UA + 0x28900000: 692, // ur + 0x28900097: 693, // ur-IN + 0x289000e6: 694, // ur-PK + 0x28a00000: 695, // uz + 0x28a05000: 696, // uz-Arab + 0x28a05023: 697, // uz-Arab-AF + 0x28a1d000: 698, // uz-Cyrl + 0x28a1d134: 699, // uz-Cyrl-UZ + 0x28a4f000: 700, // uz-Latn + 0x28a4f134: 701, // uz-Latn-UZ + 0x28b00000: 702, // vai + 0x28b4f000: 703, // vai-Latn + 0x28b4f0b2: 704, // vai-Latn-LR + 0x28bd3000: 705, // vai-Vaii + 0x28bd30b2: 706, // vai-Vaii-LR + 0x28c00000: 707, // ve + 0x28f00000: 708, // vi + 0x28f0013b: 709, // vi-VN + 0x29400000: 710, // vo + 0x29400001: 711, // vo-001 + 0x29700000: 712, // vun + 0x2970012d: 713, // vun-TZ + 0x29800000: 714, // wa + 0x29900000: 715, // wae + 0x2990004d: 716, // wae-CH + 0x2a100000: 717, // wo + 0x2a600000: 718, // xh + 0x2ae00000: 719, // xog + 0x2ae0012f: 720, // xog-UG + 0x2b400000: 721, // yav + 0x2b400051: 722, // yav-CM + 0x2b600000: 723, // yi + 0x2b600001: 724, // yi-001 + 0x2b700000: 725, // yo + 0x2b70003a: 726, // yo-BJ + 0x2b7000d4: 727, // yo-NG + 0x2bf00000: 728, // zgh + 0x2bf000b8: 729, // zgh-MA + 0x2c000000: 730, // zh + 0x2c032000: 731, // zh-Hans + 0x2c032052: 732, // zh-Hans-CN + 0x2c03208b: 733, // zh-Hans-HK + 0x2c0320c4: 734, // zh-Hans-MO + 0x2c03210b: 735, // zh-Hans-SG + 0x2c033000: 736, // zh-Hant + 0x2c03308b: 737, // zh-Hant-HK + 0x2c0330c4: 738, // zh-Hant-MO + 0x2c03312c: 739, // zh-Hant-TW + 0x2c200000: 740, // zu + 0x2c20015e: 741, // zu-ZA +} + +// Total table size 4520 bytes (4KiB); checksum: E686101E diff --git a/vendor/golang.org/x/text/language/language.go b/vendor/golang.org/x/text/language/language.go new file mode 100644 index 0000000000..8b40f6330b --- /dev/null +++ b/vendor/golang.org/x/text/language/language.go @@ -0,0 +1,975 @@ +// Copyright 2013 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. + +//go:generate go run maketables.go gen_common.go -output tables.go +//go:generate go run gen_index.go + +// Package language implements BCP 47 language tags and related functionality. +// +// The Tag type, which is used to represent languages, is agnostic to the +// meaning of its subtags. Tags are not fully canonicalized to preserve +// information that may be valuable in certain contexts. As a consequence, two +// different tags may represent identical languages. +// +// Initializing language- or locale-specific components usually consists of +// two steps. The first step is to select a display language based on the +// preferred languages of the user and the languages supported by an application. +// The second step is to create the language-specific services based on +// this selection. Each is discussed in more details below. +// +// Matching preferred against supported languages +// +// An application may support various languages. This list is typically limited +// by the languages for which there exists translations of the user interface. +// Similarly, a user may provide a list of preferred languages which is limited +// by the languages understood by this user. +// An application should use a Matcher to find the best supported language based +// on the user's preferred list. +// Matchers are aware of the intricacies of equivalence between languages. +// The default Matcher implementation takes into account things such as +// deprecated subtags, legacy tags, and mutual intelligibility between scripts +// and languages. +// +// A Matcher for English, Australian English, Danish, and standard Mandarin can +// be defined as follows: +// +// var matcher = language.NewMatcher([]language.Tag{ +// language.English, // The first language is used as fallback. +// language.MustParse("en-AU"), +// language.Danish, +// language.Chinese, +// }) +// +// The following code selects the best match for someone speaking Spanish and +// Norwegian: +// +// preferred := []language.Tag{ language.Spanish, language.Norwegian } +// tag, _, _ := matcher.Match(preferred...) +// +// In this case, the best match is Danish, as Danish is sufficiently a match to +// Norwegian to not have to fall back to the default. +// See ParseAcceptLanguage on how to handle the Accept-Language HTTP header. +// +// Selecting language-specific services +// +// One should always use the Tag returned by the Matcher to create an instance +// of any of the language-specific services provided by the text repository. +// This prevents the mixing of languages, such as having a different language for +// messages and display names, as well as improper casing or sorting order for +// the selected language. +// Using the returned Tag also allows user-defined settings, such as collation +// order or numbering system to be transparently passed as options. +// +// If you have language-specific data in your application, however, it will in +// most cases suffice to use the index returned by the matcher to identify +// the user language. +// The following loop provides an alternative in case this is not sufficient: +// +// supported := map[language.Tag]data{ +// language.English: enData, +// language.MustParse("en-AU"): enAUData, +// language.Danish: daData, +// language.Chinese: zhData, +// } +// tag, _, _ := matcher.Match(preferred...) +// for ; tag != language.Und; tag = tag.Parent() { +// if v, ok := supported[tag]; ok { +// return v +// } +// } +// return enData // should not reach here +// +// Repeatedly taking the Parent of the tag returned by Match will eventually +// match one of the tags used to initialize the Matcher. +// +// Canonicalization +// +// By default, only legacy and deprecated tags are converted into their +// canonical equivalent. All other information is preserved. This approach makes +// the confidence scores more accurate and allows matchers to distinguish +// between variants that are otherwise lost. +// +// As a consequence, two tags that should be treated as identical according to +// BCP 47 or CLDR, like "en-Latn" and "en", will be represented differently. The +// Matchers will handle such distinctions, though, and are aware of the +// equivalence relations. The CanonType type can be used to alter the +// canonicalization form. +// +// References +// +// BCP 47 - Tags for Identifying Languages +// http://tools.ietf.org/html/bcp47 +package language // import "golang.org/x/text/language" + +// TODO: Remove above NOTE after: +// - verifying that tables are dropped correctly (most notably matcher tables). + +import ( + "errors" + "fmt" + "strings" +) + +const ( + // maxCoreSize is the maximum size of a BCP 47 tag without variants and + // extensions. Equals max lang (3) + script (4) + max reg (3) + 2 dashes. + maxCoreSize = 12 + + // max99thPercentileSize is a somewhat arbitrary buffer size that presumably + // is large enough to hold at least 99% of the BCP 47 tags. + max99thPercentileSize = 32 + + // maxSimpleUExtensionSize is the maximum size of a -u extension with one + // key-type pair. Equals len("-u-") + key (2) + dash + max value (8). + maxSimpleUExtensionSize = 14 +) + +// Tag represents a BCP 47 language tag. It is used to specify an instance of a +// specific language or locale. All language tag values are guaranteed to be +// well-formed. +type Tag struct { + lang langID + region regionID + script scriptID + pVariant byte // offset in str, includes preceding '-' + pExt uint16 // offset of first extension, includes preceding '-' + + // str is the string representation of the Tag. It will only be used if the + // tag has variants or extensions. + str string +} + +// Make is a convenience wrapper for Parse that omits the error. +// In case of an error, a sensible default is returned. +func Make(s string) Tag { + return Default.Make(s) +} + +// Make is a convenience wrapper for c.Parse that omits the error. +// In case of an error, a sensible default is returned. +func (c CanonType) Make(s string) Tag { + t, _ := c.Parse(s) + return t +} + +// Raw returns the raw base language, script and region, without making an +// attempt to infer their values. +func (t Tag) Raw() (b Base, s Script, r Region) { + return Base{t.lang}, Script{t.script}, Region{t.region} +} + +// equalTags compares language, script and region subtags only. +func (t Tag) equalTags(a Tag) bool { + return t.lang == a.lang && t.script == a.script && t.region == a.region +} + +// IsRoot returns true if t is equal to language "und". +func (t Tag) IsRoot() bool { + if int(t.pVariant) < len(t.str) { + return false + } + return t.equalTags(und) +} + +// private reports whether the Tag consists solely of a private use tag. +func (t Tag) private() bool { + return t.str != "" && t.pVariant == 0 +} + +// CanonType can be used to enable or disable various types of canonicalization. +type CanonType int + +const ( + // Replace deprecated base languages with their preferred replacements. + DeprecatedBase CanonType = 1 << iota + // Replace deprecated scripts with their preferred replacements. + DeprecatedScript + // Replace deprecated regions with their preferred replacements. + DeprecatedRegion + // Remove redundant scripts. + SuppressScript + // Normalize legacy encodings. This includes legacy languages defined in + // CLDR as well as bibliographic codes defined in ISO-639. + Legacy + // Map the dominant language of a macro language group to the macro language + // subtag. For example cmn -> zh. + Macro + // The CLDR flag should be used if full compatibility with CLDR is required. + // There are a few cases where language.Tag may differ from CLDR. To follow all + // of CLDR's suggestions, use All|CLDR. + CLDR + + // Raw can be used to Compose or Parse without Canonicalization. + Raw CanonType = 0 + + // Replace all deprecated tags with their preferred replacements. + Deprecated = DeprecatedBase | DeprecatedScript | DeprecatedRegion + + // All canonicalizations recommended by BCP 47. + BCP47 = Deprecated | SuppressScript + + // All canonicalizations. + All = BCP47 | Legacy | Macro + + // Default is the canonicalization used by Parse, Make and Compose. To + // preserve as much information as possible, canonicalizations that remove + // potentially valuable information are not included. The Matcher is + // designed to recognize similar tags that would be the same if + // they were canonicalized using All. + Default = Deprecated | Legacy + + canonLang = DeprecatedBase | Legacy | Macro + + // TODO: LikelyScript, LikelyRegion: suppress similar to ICU. +) + +// canonicalize returns the canonicalized equivalent of the tag and +// whether there was any change. +func (t Tag) canonicalize(c CanonType) (Tag, bool) { + if c == Raw { + return t, false + } + changed := false + if c&SuppressScript != 0 { + if t.lang < langNoIndexOffset && uint8(t.script) == suppressScript[t.lang] { + t.script = 0 + changed = true + } + } + if c&canonLang != 0 { + for { + if l, aliasType := normLang(t.lang); l != t.lang { + switch aliasType { + case langLegacy: + if c&Legacy != 0 { + if t.lang == _sh && t.script == 0 { + t.script = _Latn + } + t.lang = l + changed = true + } + case langMacro: + if c&Macro != 0 { + // We deviate here from CLDR. The mapping "nb" -> "no" + // qualifies as a typical Macro language mapping. However, + // for legacy reasons, CLDR maps "no", the macro language + // code for Norwegian, to the dominant variant "nb". This + // change is currently under consideration for CLDR as well. + // See http://unicode.org/cldr/trac/ticket/2698 and also + // http://unicode.org/cldr/trac/ticket/1790 for some of the + // practical implications. TODO: this check could be removed + // if CLDR adopts this change. + if c&CLDR == 0 || t.lang != _nb { + changed = true + t.lang = l + } + } + case langDeprecated: + if c&DeprecatedBase != 0 { + if t.lang == _mo && t.region == 0 { + t.region = _MD + } + t.lang = l + changed = true + // Other canonicalization types may still apply. + continue + } + } + } else if c&Legacy != 0 && t.lang == _no && c&CLDR != 0 { + t.lang = _nb + changed = true + } + break + } + } + if c&DeprecatedScript != 0 { + if t.script == _Qaai { + changed = true + t.script = _Zinh + } + } + if c&DeprecatedRegion != 0 { + if r := normRegion(t.region); r != 0 { + changed = true + t.region = r + } + } + return t, changed +} + +// Canonicalize returns the canonicalized equivalent of the tag. +func (c CanonType) Canonicalize(t Tag) (Tag, error) { + t, changed := t.canonicalize(c) + if changed { + t.remakeString() + } + return t, nil +} + +// Confidence indicates the level of certainty for a given return value. +// For example, Serbian may be written in Cyrillic or Latin script. +// The confidence level indicates whether a value was explicitly specified, +// whether it is typically the only possible value, or whether there is +// an ambiguity. +type Confidence int + +const ( + No Confidence = iota // full confidence that there was no match + Low // most likely value picked out of a set of alternatives + High // value is generally assumed to be the correct match + Exact // exact match or explicitly specified value +) + +var confName = []string{"No", "Low", "High", "Exact"} + +func (c Confidence) String() string { + return confName[c] +} + +// remakeString is used to update t.str in case lang, script or region changed. +// It is assumed that pExt and pVariant still point to the start of the +// respective parts. +func (t *Tag) remakeString() { + if t.str == "" { + return + } + extra := t.str[t.pVariant:] + if t.pVariant > 0 { + extra = extra[1:] + } + if t.equalTags(und) && strings.HasPrefix(extra, "x-") { + t.str = extra + t.pVariant = 0 + t.pExt = 0 + return + } + var buf [max99thPercentileSize]byte // avoid extra memory allocation in most cases. + b := buf[:t.genCoreBytes(buf[:])] + if extra != "" { + diff := uint8(len(b)) - t.pVariant + b = append(b, '-') + b = append(b, extra...) + t.pVariant += diff + t.pExt += uint16(diff) + } else { + t.pVariant = uint8(len(b)) + t.pExt = uint16(len(b)) + } + t.str = string(b) +} + +// genCoreBytes writes a string for the base languages, script and region tags +// to the given buffer and returns the number of bytes written. It will never +// write more than maxCoreSize bytes. +func (t *Tag) genCoreBytes(buf []byte) int { + n := t.lang.stringToBuf(buf[:]) + if t.script != 0 { + n += copy(buf[n:], "-") + n += copy(buf[n:], t.script.String()) + } + if t.region != 0 { + n += copy(buf[n:], "-") + n += copy(buf[n:], t.region.String()) + } + return n +} + +// String returns the canonical string representation of the language tag. +func (t Tag) String() string { + if t.str != "" { + return t.str + } + if t.script == 0 && t.region == 0 { + return t.lang.String() + } + buf := [maxCoreSize]byte{} + return string(buf[:t.genCoreBytes(buf[:])]) +} + +// Base returns the base language of the language tag. If the base language is +// unspecified, an attempt will be made to infer it from the context. +// It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change. +func (t Tag) Base() (Base, Confidence) { + if t.lang != 0 { + return Base{t.lang}, Exact + } + c := High + if t.script == 0 && !(Region{t.region}).IsCountry() { + c = Low + } + if tag, err := addTags(t); err == nil && tag.lang != 0 { + return Base{tag.lang}, c + } + return Base{0}, No +} + +// Script infers the script for the language tag. If it was not explicitly given, it will infer +// a most likely candidate. +// If more than one script is commonly used for a language, the most likely one +// is returned with a low confidence indication. For example, it returns (Cyrl, Low) +// for Serbian. +// If a script cannot be inferred (Zzzz, No) is returned. We do not use Zyyy (undetermined) +// as one would suspect from the IANA registry for BCP 47. In a Unicode context Zyyy marks +// common characters (like 1, 2, 3, '.', etc.) and is therefore more like multiple scripts. +// See http://www.unicode.org/reports/tr24/#Values for more details. Zzzz is also used for +// unknown value in CLDR. (Zzzz, Exact) is returned if Zzzz was explicitly specified. +// Note that an inferred script is never guaranteed to be the correct one. Latin is +// almost exclusively used for Afrikaans, but Arabic has been used for some texts +// in the past. Also, the script that is commonly used may change over time. +// It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change. +func (t Tag) Script() (Script, Confidence) { + if t.script != 0 { + return Script{t.script}, Exact + } + sc, c := scriptID(_Zzzz), No + if t.lang < langNoIndexOffset { + if scr := scriptID(suppressScript[t.lang]); scr != 0 { + // Note: it is not always the case that a language with a suppress + // script value is only written in one script (e.g. kk, ms, pa). + if t.region == 0 { + return Script{scriptID(scr)}, High + } + sc, c = scr, High + } + } + if tag, err := addTags(t); err == nil { + if tag.script != sc { + sc, c = tag.script, Low + } + } else { + t, _ = (Deprecated | Macro).Canonicalize(t) + if tag, err := addTags(t); err == nil && tag.script != sc { + sc, c = tag.script, Low + } + } + return Script{sc}, c +} + +// Region returns the region for the language tag. If it was not explicitly given, it will +// infer a most likely candidate from the context. +// It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change. +func (t Tag) Region() (Region, Confidence) { + if t.region != 0 { + return Region{t.region}, Exact + } + if t, err := addTags(t); err == nil { + return Region{t.region}, Low // TODO: differentiate between high and low. + } + t, _ = (Deprecated | Macro).Canonicalize(t) + if tag, err := addTags(t); err == nil { + return Region{tag.region}, Low + } + return Region{_ZZ}, No // TODO: return world instead of undetermined? +} + +// Variant returns the variants specified explicitly for this language tag. +// or nil if no variant was specified. +func (t Tag) Variants() []Variant { + v := []Variant{} + if int(t.pVariant) < int(t.pExt) { + for x, str := "", t.str[t.pVariant:t.pExt]; str != ""; { + x, str = nextToken(str) + v = append(v, Variant{x}) + } + } + return v +} + +// Parent returns the CLDR parent of t. In CLDR, missing fields in data for a +// specific language are substituted with fields from the parent language. +// The parent for a language may change for newer versions of CLDR. +func (t Tag) Parent() Tag { + if t.str != "" { + // Strip the variants and extensions. + t, _ = Raw.Compose(t.Raw()) + if t.region == 0 && t.script != 0 && t.lang != 0 { + base, _ := addTags(Tag{lang: t.lang}) + if base.script == t.script { + return Tag{lang: t.lang} + } + } + return t + } + if t.lang != 0 { + if t.region != 0 { + maxScript := t.script + if maxScript == 0 { + max, _ := addTags(t) + maxScript = max.script + } + + for i := range parents { + if langID(parents[i].lang) == t.lang && scriptID(parents[i].maxScript) == maxScript { + for _, r := range parents[i].fromRegion { + if regionID(r) == t.region { + return Tag{ + lang: t.lang, + script: scriptID(parents[i].script), + region: regionID(parents[i].toRegion), + } + } + } + } + } + + // Strip the script if it is the default one. + base, _ := addTags(Tag{lang: t.lang}) + if base.script != maxScript { + return Tag{lang: t.lang, script: maxScript} + } + return Tag{lang: t.lang} + } else if t.script != 0 { + // The parent for an base-script pair with a non-default script is + // "und" instead of the base language. + base, _ := addTags(Tag{lang: t.lang}) + if base.script != t.script { + return und + } + return Tag{lang: t.lang} + } + } + return und +} + +// returns token t and the rest of the string. +func nextToken(s string) (t, tail string) { + p := strings.Index(s[1:], "-") + if p == -1 { + return s[1:], "" + } + p++ + return s[1:p], s[p:] +} + +// Extension is a single BCP 47 extension. +type Extension struct { + s string +} + +// String returns the string representation of the extension, including the +// type tag. +func (e Extension) String() string { + return e.s +} + +// ParseExtension parses s as an extension and returns it on success. +func ParseExtension(s string) (e Extension, err error) { + scan := makeScannerString(s) + var end int + if n := len(scan.token); n != 1 { + return Extension{}, errSyntax + } + scan.toLower(0, len(scan.b)) + end = parseExtension(&scan) + if end != len(s) { + return Extension{}, errSyntax + } + return Extension{string(scan.b)}, nil +} + +// Type returns the one-byte extension type of e. It returns 0 for the zero +// exception. +func (e Extension) Type() byte { + if e.s == "" { + return 0 + } + return e.s[0] +} + +// Tokens returns the list of tokens of e. +func (e Extension) Tokens() []string { + return strings.Split(e.s, "-") +} + +// Extension returns the extension of type x for tag t. It will return +// false for ok if t does not have the requested extension. The returned +// extension will be invalid in this case. +func (t Tag) Extension(x byte) (ext Extension, ok bool) { + for i := int(t.pExt); i < len(t.str)-1; { + var ext string + i, ext = getExtension(t.str, i) + if ext[0] == x { + return Extension{ext}, true + } + } + return Extension{string(x)}, false +} + +// Extensions returns all extensions of t. +func (t Tag) Extensions() []Extension { + e := []Extension{} + for i := int(t.pExt); i < len(t.str)-1; { + var ext string + i, ext = getExtension(t.str, i) + e = append(e, Extension{ext}) + } + return e +} + +// TypeForKey returns the type associated with the given key, where key and type +// are of the allowed values defined for the Unicode locale extension ('u') in +// http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. +// TypeForKey will traverse the inheritance chain to get the correct value. +func (t Tag) TypeForKey(key string) string { + if start, end, _ := t.findTypeForKey(key); end != start { + return t.str[start:end] + } + return "" +} + +var ( + errPrivateUse = errors.New("cannot set a key on a private use tag") + errInvalidArguments = errors.New("invalid key or type") +) + +// SetTypeForKey returns a new Tag with the key set to type, where key and type +// are of the allowed values defined for the Unicode locale extension ('u') in +// http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. +// An empty value removes an existing pair with the same key. +func (t Tag) SetTypeForKey(key, value string) (Tag, error) { + if t.private() { + return t, errPrivateUse + } + if len(key) != 2 { + return t, errInvalidArguments + } + + // Remove the setting if value is "". + if value == "" { + start, end, _ := t.findTypeForKey(key) + if start != end { + // Remove key tag and leading '-'. + start -= 4 + + // Remove a possible empty extension. + if (end == len(t.str) || t.str[end+2] == '-') && t.str[start-2] == '-' { + start -= 2 + } + if start == int(t.pVariant) && end == len(t.str) { + t.str = "" + t.pVariant, t.pExt = 0, 0 + } else { + t.str = fmt.Sprintf("%s%s", t.str[:start], t.str[end:]) + } + } + return t, nil + } + + if len(value) < 3 || len(value) > 8 { + return t, errInvalidArguments + } + + var ( + buf [maxCoreSize + maxSimpleUExtensionSize]byte + uStart int // start of the -u extension. + ) + + // Generate the tag string if needed. + if t.str == "" { + uStart = t.genCoreBytes(buf[:]) + buf[uStart] = '-' + uStart++ + } + + // Create new key-type pair and parse it to verify. + b := buf[uStart:] + copy(b, "u-") + copy(b[2:], key) + b[4] = '-' + b = b[:5+copy(b[5:], value)] + scan := makeScanner(b) + if parseExtensions(&scan); scan.err != nil { + return t, scan.err + } + + // Assemble the replacement string. + if t.str == "" { + t.pVariant, t.pExt = byte(uStart-1), uint16(uStart-1) + t.str = string(buf[:uStart+len(b)]) + } else { + s := t.str + start, end, hasExt := t.findTypeForKey(key) + if start == end { + if hasExt { + b = b[2:] + } + t.str = fmt.Sprintf("%s-%s%s", s[:start], b, s[end:]) + } else { + t.str = fmt.Sprintf("%s%s%s", s[:start], value, s[end:]) + } + } + return t, nil +} + +// findKeyAndType returns the start and end position for the type corresponding +// to key or the point at which to insert the key-value pair if the type +// wasn't found. The hasExt return value reports whether an -u extension was present. +// Note: the extensions are typically very small and are likely to contain +// only one key-type pair. +func (t Tag) findTypeForKey(key string) (start, end int, hasExt bool) { + p := int(t.pExt) + if len(key) != 2 || p == len(t.str) || p == 0 { + return p, p, false + } + s := t.str + + // Find the correct extension. + for p++; s[p] != 'u'; p++ { + if s[p] > 'u' { + p-- + return p, p, false + } + if p = nextExtension(s, p); p == len(s) { + return len(s), len(s), false + } + } + // Proceed to the hyphen following the extension name. + p++ + + // curKey is the key currently being processed. + curKey := "" + + // Iterate over keys until we get the end of a section. + for { + // p points to the hyphen preceding the current token. + if p3 := p + 3; s[p3] == '-' { + // Found a key. + // Check whether we just processed the key that was requested. + if curKey == key { + return start, p, true + } + // Set to the next key and continue scanning type tokens. + curKey = s[p+1 : p3] + if curKey > key { + return p, p, true + } + // Start of the type token sequence. + start = p + 4 + // A type is at least 3 characters long. + p += 7 // 4 + 3 + } else { + // Attribute or type, which is at least 3 characters long. + p += 4 + } + // p points past the third character of a type or attribute. + max := p + 5 // maximum length of token plus hyphen. + if len(s) < max { + max = len(s) + } + for ; p < max && s[p] != '-'; p++ { + } + // Bail if we have exhausted all tokens or if the next token starts + // a new extension. + if p == len(s) || s[p+2] == '-' { + if curKey == key { + return start, p, true + } + return p, p, true + } + } +} + +// CompactIndex returns an index, where 0 <= index < NumCompactTags, for tags +// for which data exists in the text repository. The index will change over time +// and should not be stored in persistent storage. Extensions, except for the +// 'va' type of the 'u' extension, are ignored. It will return 0, false if no +// compact tag exists, where 0 is the index for the root language (Und). +func CompactIndex(t Tag) (index int, ok bool) { + // TODO: perhaps give more frequent tags a lower index. + // TODO: we could make the indexes stable. This will excluded some + // possibilities for optimization, so don't do this quite yet. + b, s, r := t.Raw() + if len(t.str) > 0 { + if strings.HasPrefix(t.str, "x-") { + // We have no entries for user-defined tags. + return 0, false + } + if uint16(t.pVariant) != t.pExt { + // There are no tags with variants and an u-va type. + if t.TypeForKey("va") != "" { + return 0, false + } + t, _ = Raw.Compose(b, s, r, t.Variants()) + } else if _, ok := t.Extension('u'); ok { + // Strip all but the 'va' entry. + variant := t.TypeForKey("va") + t, _ = Raw.Compose(b, s, r) + t, _ = t.SetTypeForKey("va", variant) + } + if len(t.str) > 0 { + // We have some variants. + for i, s := range specialTags { + if s == t { + return i + 1, true + } + } + return 0, false + } + } + // No variants specified: just compare core components. + // The key has the form lllssrrr, where l, s, and r are nibbles for + // respectively the langID, scriptID, and regionID. + key := uint32(b.langID) << (8 + 12) + key |= uint32(s.scriptID) << 12 + key |= uint32(r.regionID) + x, ok := coreTags[key] + return int(x), ok +} + +// Base is an ISO 639 language code, used for encoding the base language +// of a language tag. +type Base struct { + langID +} + +// ParseBase parses a 2- or 3-letter ISO 639 code. +// It returns a ValueError if s is a well-formed but unknown language identifier +// or another error if another error occurred. +func ParseBase(s string) (Base, error) { + if n := len(s); n < 2 || 3 < n { + return Base{}, errSyntax + } + var buf [3]byte + l, err := getLangID(buf[:copy(buf[:], s)]) + return Base{l}, err +} + +// Script is a 4-letter ISO 15924 code for representing scripts. +// It is idiomatically represented in title case. +type Script struct { + scriptID +} + +// ParseScript parses a 4-letter ISO 15924 code. +// It returns a ValueError if s is a well-formed but unknown script identifier +// or another error if another error occurred. +func ParseScript(s string) (Script, error) { + if len(s) != 4 { + return Script{}, errSyntax + } + var buf [4]byte + sc, err := getScriptID(script, buf[:copy(buf[:], s)]) + return Script{sc}, err +} + +// Region is an ISO 3166-1 or UN M.49 code for representing countries and regions. +type Region struct { + regionID +} + +// EncodeM49 returns the Region for the given UN M.49 code. +// It returns an error if r is not a valid code. +func EncodeM49(r int) (Region, error) { + rid, err := getRegionM49(r) + return Region{rid}, err +} + +// ParseRegion parses a 2- or 3-letter ISO 3166-1 or a UN M.49 code. +// It returns a ValueError if s is a well-formed but unknown region identifier +// or another error if another error occurred. +func ParseRegion(s string) (Region, error) { + if n := len(s); n < 2 || 3 < n { + return Region{}, errSyntax + } + var buf [3]byte + r, err := getRegionID(buf[:copy(buf[:], s)]) + return Region{r}, err +} + +// IsCountry returns whether this region is a country or autonomous area. This +// includes non-standard definitions from CLDR. +func (r Region) IsCountry() bool { + if r.regionID == 0 || r.IsGroup() || r.IsPrivateUse() && r.regionID != _XK { + return false + } + return true +} + +// IsGroup returns whether this region defines a collection of regions. This +// includes non-standard definitions from CLDR. +func (r Region) IsGroup() bool { + if r.regionID == 0 { + return false + } + return int(regionInclusion[r.regionID]) < len(regionContainment) +} + +// Contains returns whether Region c is contained by Region r. It returns true +// if c == r. +func (r Region) Contains(c Region) bool { + return r.regionID.contains(c.regionID) +} + +func (r regionID) contains(c regionID) bool { + if r == c { + return true + } + g := regionInclusion[r] + if g >= nRegionGroups { + return false + } + m := regionContainment[g] + + d := regionInclusion[c] + b := regionInclusionBits[d] + + // A contained country may belong to multiple disjoint groups. Matching any + // of these indicates containment. If the contained region is a group, it + // must strictly be a subset. + if d >= nRegionGroups { + return b&m != 0 + } + return b&^m == 0 +} + +var errNoTLD = errors.New("language: region is not a valid ccTLD") + +// TLD returns the country code top-level domain (ccTLD). UK is returned for GB. +// In all other cases it returns either the region itself or an error. +// +// This method may return an error for a region for which there exists a +// canonical form with a ccTLD. To get that ccTLD canonicalize r first. The +// region will already be canonicalized it was obtained from a Tag that was +// obtained using any of the default methods. +func (r Region) TLD() (Region, error) { + // See http://en.wikipedia.org/wiki/Country_code_top-level_domain for the + // difference between ISO 3166-1 and IANA ccTLD. + if r.regionID == _GB { + r = Region{_UK} + } + if (r.typ() & ccTLD) == 0 { + return Region{}, errNoTLD + } + return r, nil +} + +// Canonicalize returns the region or a possible replacement if the region is +// deprecated. It will not return a replacement for deprecated regions that +// are split into multiple regions. +func (r Region) Canonicalize() Region { + if cr := normRegion(r.regionID); cr != 0 { + return Region{cr} + } + return r +} + +// Variant represents a registered variant of a language as defined by BCP 47. +type Variant struct { + variant string +} + +// ParseVariant parses and returns a Variant. An error is returned if s is not +// a valid variant. +func ParseVariant(s string) (Variant, error) { + s = strings.ToLower(s) + if _, ok := variantIndex[s]; ok { + return Variant{s}, nil + } + return Variant{}, mkErrInvalid([]byte(s)) +} + +// String returns the string representation of the variant. +func (v Variant) String() string { + return v.variant +} diff --git a/vendor/golang.org/x/text/language/language_test.go b/vendor/golang.org/x/text/language/language_test.go new file mode 100644 index 0000000000..9cfddfa6be --- /dev/null +++ b/vendor/golang.org/x/text/language/language_test.go @@ -0,0 +1,871 @@ +// Copyright 2013 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 language + +import ( + "reflect" + "testing" +) + +func TestTagSize(t *testing.T) { + id := Tag{} + typ := reflect.TypeOf(id) + if typ.Size() > 24 { + t.Errorf("size of Tag was %d; want 24", typ.Size()) + } +} + +func TestIsRoot(t *testing.T) { + loc := Tag{} + if !loc.IsRoot() { + t.Errorf("unspecified should be root.") + } + for i, tt := range parseTests() { + loc, _ := Parse(tt.in) + undef := tt.lang == "und" && tt.script == "" && tt.region == "" && tt.ext == "" + if loc.IsRoot() != undef { + t.Errorf("%d: was %v; want %v", i, loc.IsRoot(), undef) + } + } +} + +func TestEquality(t *testing.T) { + for i, tt := range parseTests()[48:49] { + s := tt.in + tag := Make(s) + t1 := Make(tag.String()) + if tag != t1 { + t.Errorf("%d:%s: equality test 1 failed\n got: %#v\nwant: %#v)", i, s, t1, tag) + } + t2, _ := Compose(tag) + if tag != t2 { + t.Errorf("%d:%s: equality test 2 failed\n got: %#v\nwant: %#v", i, s, t2, tag) + } + } +} + +func TestMakeString(t *testing.T) { + tests := []struct{ in, out string }{ + {"und", "und"}, + {"und", "und-CW"}, + {"nl", "nl-NL"}, + {"de-1901", "nl-1901"}, + {"de-1901", "de-Arab-1901"}, + {"x-a-b", "de-Arab-x-a-b"}, + {"x-a-b", "x-a-b"}, + } + for i, tt := range tests { + id, _ := Parse(tt.in) + mod, _ := Parse(tt.out) + id.setTagsFrom(mod) + for j := 0; j < 2; j++ { + id.remakeString() + if str := id.String(); str != tt.out { + t.Errorf("%d:%d: found %s; want %s", i, j, id.String(), tt.out) + } + } + // The bytes to string conversion as used in remakeString + // occasionally measures as more than one alloc, breaking this test. + // To alleviate this we set the number of runs to more than 1. + if n := testing.AllocsPerRun(8, id.remakeString); n > 1 { + t.Errorf("%d: # allocs got %.1f; want <= 1", i, n) + } + } +} + +func TestCompactIndex(t *testing.T) { + tests := []struct { + tag string + index int + ok bool + }{ + // TODO: these values will change with each CLDR update. This issue + // will be solved if we decide to fix the indexes. + {"und", 0, true}, + {"ca-ES-valencia", 1, true}, + {"ca-ES-valencia-u-va-posix", 0, false}, + {"ca-ES-valencia-u-co-phonebk", 1, true}, + {"ca-ES-valencia-u-co-phonebk-va-posix", 0, false}, + {"x-klingon", 0, false}, + {"en-US", 227, true}, + {"en-US-u-va-posix", 2, true}, + {"en", 131, true}, + {"en-u-co-phonebk", 131, true}, + {"en-001", 132, true}, + {"sh", 0, false}, // We don't normalize. + } + for _, tt := range tests { + x, ok := CompactIndex(Raw.MustParse(tt.tag)) + if x != tt.index || ok != tt.ok { + t.Errorf("%s: got %d, %v; want %d %v", tt.tag, x, ok, tt.index, tt.ok) + } + } +} + +func TestBase(t *testing.T) { + tests := []struct { + loc, lang string + conf Confidence + }{ + {"und", "en", Low}, + {"x-abc", "und", No}, + {"en", "en", Exact}, + {"und-Cyrl", "ru", High}, + // If a region is not included, the official language should be English. + {"und-US", "en", High}, + // TODO: not-explicitly listed scripts should probably be und, No + // Modify addTags to return info on how the match was derived. + // {"und-Aghb", "und", No}, + } + for i, tt := range tests { + loc, _ := Parse(tt.loc) + lang, conf := loc.Base() + if lang.String() != tt.lang { + t.Errorf("%d: language was %s; want %s", i, lang, tt.lang) + } + if conf != tt.conf { + t.Errorf("%d: confidence was %d; want %d", i, conf, tt.conf) + } + } +} + +func TestParseBase(t *testing.T) { + tests := []struct { + in string + out string + ok bool + }{ + {"en", "en", true}, + {"EN", "en", true}, + {"nld", "nl", true}, + {"dut", "dut", true}, // bibliographic + {"aaj", "und", false}, // unknown + {"qaa", "qaa", true}, + {"a", "und", false}, + {"", "und", false}, + {"aaaa", "und", false}, + } + for i, tt := range tests { + x, err := ParseBase(tt.in) + if x.String() != tt.out || err == nil != tt.ok { + t.Errorf("%d:%s: was %s, %v; want %s, %v", i, tt.in, x, err == nil, tt.out, tt.ok) + } + if y, _, _ := Raw.Make(tt.out).Raw(); x != y { + t.Errorf("%d:%s: tag was %s; want %s", i, tt.in, x, y) + } + } +} + +func TestScript(t *testing.T) { + tests := []struct { + loc, scr string + conf Confidence + }{ + {"und", "Latn", Low}, + {"en-Latn", "Latn", Exact}, + {"en", "Latn", High}, + {"sr", "Cyrl", Low}, + {"kk", "Cyrl", High}, + {"kk-CN", "Arab", Low}, + {"cmn", "Hans", Low}, + {"ru", "Cyrl", High}, + {"ru-RU", "Cyrl", High}, + {"yue", "Zzzz", No}, + {"x-abc", "Zzzz", Low}, + {"und-zyyy", "Zyyy", Exact}, + } + for i, tt := range tests { + loc, _ := Parse(tt.loc) + sc, conf := loc.Script() + if sc.String() != tt.scr { + t.Errorf("%d:%s: script was %s; want %s", i, tt.loc, sc, tt.scr) + } + if conf != tt.conf { + t.Errorf("%d:%s: confidence was %d; want %d", i, tt.loc, conf, tt.conf) + } + } +} + +func TestParseScript(t *testing.T) { + tests := []struct { + in string + out string + ok bool + }{ + {"Latn", "Latn", true}, + {"zzzz", "Zzzz", true}, + {"zyyy", "Zyyy", true}, + {"Latm", "Zzzz", false}, + {"Zzz", "Zzzz", false}, + {"", "Zzzz", false}, + {"Zzzxx", "Zzzz", false}, + } + for i, tt := range tests { + x, err := ParseScript(tt.in) + if x.String() != tt.out || err == nil != tt.ok { + t.Errorf("%d:%s: was %s, %v; want %s, %v", i, tt.in, x, err == nil, tt.out, tt.ok) + } + if err == nil { + if _, y, _ := Raw.Make("und-" + tt.out).Raw(); x != y { + t.Errorf("%d:%s: tag was %s; want %s", i, tt.in, x, y) + } + } + } +} + +func TestRegion(t *testing.T) { + tests := []struct { + loc, reg string + conf Confidence + }{ + {"und", "US", Low}, + {"en", "US", Low}, + {"zh-Hant", "TW", Low}, + {"en-US", "US", Exact}, + {"cmn", "CN", Low}, + {"ru", "RU", Low}, + {"yue", "ZZ", No}, + {"x-abc", "ZZ", Low}, + } + for i, tt := range tests { + loc, _ := Raw.Parse(tt.loc) + reg, conf := loc.Region() + if reg.String() != tt.reg { + t.Errorf("%d: region was %s; want %s", i, reg, tt.reg) + } + if conf != tt.conf { + t.Errorf("%d: confidence was %d; want %d", i, conf, tt.conf) + } + } +} + +func TestEncodeM49(t *testing.T) { + tests := []struct { + m49 int + code string + ok bool + }{ + {1, "001", true}, + {840, "US", true}, + {899, "ZZ", false}, + } + for i, tt := range tests { + if r, err := EncodeM49(tt.m49); r.String() != tt.code || err == nil != tt.ok { + t.Errorf("%d:%d: was %s, %v; want %s, %v", i, tt.m49, r, err == nil, tt.code, tt.ok) + } + } + for i := 1; i <= 1000; i++ { + if r, err := EncodeM49(i); err == nil && r.M49() == 0 { + t.Errorf("%d has no error, but maps to undefined region", i) + } + } +} + +func TestParseRegion(t *testing.T) { + tests := []struct { + in string + out string + ok bool + }{ + {"001", "001", true}, + {"840", "US", true}, + {"899", "ZZ", false}, + {"USA", "US", true}, + {"US", "US", true}, + {"BC", "ZZ", false}, + {"C", "ZZ", false}, + {"CCCC", "ZZ", false}, + {"01", "ZZ", false}, + } + for i, tt := range tests { + r, err := ParseRegion(tt.in) + if r.String() != tt.out || err == nil != tt.ok { + t.Errorf("%d:%s: was %s, %v; want %s, %v", i, tt.in, r, err == nil, tt.out, tt.ok) + } + if err == nil { + if _, _, y := Raw.Make("und-" + tt.out).Raw(); r != y { + t.Errorf("%d:%s: tag was %s; want %s", i, tt.in, r, y) + } + } + } +} + +func TestIsCountry(t *testing.T) { + tests := []struct { + reg string + country bool + }{ + {"US", true}, + {"001", false}, + {"958", false}, + {"419", false}, + {"203", true}, + {"020", true}, + {"900", false}, + {"999", false}, + {"QO", false}, + {"EU", false}, + {"AA", false}, + {"XK", true}, + } + for i, tt := range tests { + reg, _ := getRegionID([]byte(tt.reg)) + r := Region{reg} + if r.IsCountry() != tt.country { + t.Errorf("%d: IsCountry(%s) was %v; want %v", i, tt.reg, r.IsCountry(), tt.country) + } + } +} + +func TestIsGroup(t *testing.T) { + tests := []struct { + reg string + group bool + }{ + {"US", false}, + {"001", true}, + {"958", false}, + {"419", true}, + {"203", false}, + {"020", false}, + {"900", false}, + {"999", false}, + {"QO", true}, + {"EU", true}, + {"AA", false}, + {"XK", false}, + } + for i, tt := range tests { + reg, _ := getRegionID([]byte(tt.reg)) + r := Region{reg} + if r.IsGroup() != tt.group { + t.Errorf("%d: IsGroup(%s) was %v; want %v", i, tt.reg, r.IsGroup(), tt.group) + } + } +} + +func TestContains(t *testing.T) { + tests := []struct { + enclosing, contained string + contains bool + }{ + // A region contains itself. + {"US", "US", true}, + {"001", "001", true}, + + // Direct containment. + {"001", "002", true}, + {"039", "XK", true}, + {"150", "XK", true}, + {"EU", "AT", true}, + {"QO", "AQ", true}, + + // Indirect containemnt. + {"001", "US", true}, + {"001", "419", true}, + {"001", "013", true}, + + // No containment. + {"US", "001", false}, + {"155", "EU", false}, + } + for i, tt := range tests { + enc, _ := getRegionID([]byte(tt.enclosing)) + con, _ := getRegionID([]byte(tt.contained)) + r := Region{enc} + if got := r.Contains(Region{con}); got != tt.contains { + t.Errorf("%d: %s.Contains(%s) was %v; want %v", i, tt.enclosing, tt.contained, got, tt.contains) + } + } +} + +func TestRegionCanonicalize(t *testing.T) { + for i, tt := range []struct{ in, out string }{ + {"UK", "GB"}, + {"TP", "TL"}, + {"QU", "EU"}, + {"SU", "SU"}, + {"VD", "VN"}, + {"DD", "DE"}, + } { + r := MustParseRegion(tt.in) + want := MustParseRegion(tt.out) + if got := r.Canonicalize(); got != want { + t.Errorf("%d: got %v; want %v", i, got, want) + } + } +} + +func TestRegionTLD(t *testing.T) { + for _, tt := range []struct { + in, out string + ok bool + }{ + {"EH", "EH", true}, + {"FR", "FR", true}, + {"TL", "TL", true}, + + // In ccTLD before in ISO. + {"GG", "GG", true}, + + // Non-standard assignment of ccTLD to ISO code. + {"GB", "UK", true}, + + // Exceptionally reserved in ISO and valid ccTLD. + {"UK", "UK", true}, + {"AC", "AC", true}, + {"EU", "EU", true}, + {"SU", "SU", true}, + + // Exceptionally reserved in ISO and invalid ccTLD. + {"CP", "ZZ", false}, + {"DG", "ZZ", false}, + {"EA", "ZZ", false}, + {"FX", "ZZ", false}, + {"IC", "ZZ", false}, + {"TA", "ZZ", false}, + + // Transitionally reserved in ISO (e.g. deprecated) but valid ccTLD as + // it is still being phased out. + {"AN", "AN", true}, + {"TP", "TP", true}, + + // Transitionally reserved in ISO (e.g. deprecated) and invalid ccTLD. + // Defined in package language as it has a mapping in CLDR. + {"BU", "ZZ", false}, + {"CS", "ZZ", false}, + {"NT", "ZZ", false}, + {"YU", "ZZ", false}, + {"ZR", "ZZ", false}, + // Not defined in package: SF. + + // Indeterminately reserved in ISO. + // Defined in package language as it has a legacy mapping in CLDR. + {"DY", "ZZ", false}, + {"RH", "ZZ", false}, + {"VD", "ZZ", false}, + // Not defined in package: EW, FL, JA, LF, PI, RA, RB, RC, RI, RL, RM, + // RN, RP, WG, WL, WV, and YV. + + // Not assigned in ISO, but legacy definitions in CLDR. + {"DD", "ZZ", false}, + {"YD", "ZZ", false}, + + // Normal mappings but somewhat special status in ccTLD. + {"BL", "BL", true}, + {"MF", "MF", true}, + {"BV", "BV", true}, + {"SJ", "SJ", true}, + + // Have values when normalized, but not as is. + {"QU", "ZZ", false}, + + // ISO Private Use. + {"AA", "ZZ", false}, + {"QM", "ZZ", false}, + {"QO", "ZZ", false}, + {"XA", "ZZ", false}, + {"XK", "ZZ", false}, // Sometimes used for Kosovo, but invalid ccTLD. + } { + if tt.in == "" { + continue + } + + r := MustParseRegion(tt.in) + var want Region + if tt.out != "ZZ" { + want = MustParseRegion(tt.out) + } + tld, err := r.TLD() + if got := err == nil; got != tt.ok { + t.Errorf("error(%v): got %v; want %v", r, got, tt.ok) + } + if tld != want { + t.Errorf("TLD(%v): got %v; want %v", r, tld, want) + } + } +} + +func TestCanonicalize(t *testing.T) { + // TODO: do a full test using CLDR data in a separate regression test. + tests := []struct { + in, out string + option CanonType + }{ + {"en-Latn", "en", SuppressScript}, + {"sr-Cyrl", "sr-Cyrl", SuppressScript}, + {"sh", "sr-Latn", Legacy}, + {"sh-HR", "sr-Latn-HR", Legacy}, + {"sh-Cyrl-HR", "sr-Cyrl-HR", Legacy}, + {"tl", "fil", Legacy}, + {"no", "no", Legacy}, + {"no", "nb", Legacy | CLDR}, + {"cmn", "cmn", Legacy}, + {"cmn", "zh", Macro}, + {"yue", "yue", Macro}, + {"nb", "no", Macro}, + {"nb", "nb", Macro | CLDR}, + {"no", "no", Macro}, + {"no", "no", Macro | CLDR}, + {"iw", "he", DeprecatedBase}, + {"iw", "he", Deprecated | CLDR}, + {"mo", "ro-MD", Deprecated}, // Adopted by CLDR as of version 25. + {"alb", "sq", Legacy}, // bibliographic + {"dut", "nl", Legacy}, // bibliographic + // As of CLDR 25, mo is no longer considered a legacy mapping. + {"mo", "mo", Legacy | CLDR}, + {"und-AN", "und-AN", Deprecated}, + {"und-YD", "und-YE", DeprecatedRegion}, + {"und-YD", "und-YD", DeprecatedBase}, + {"und-Qaai", "und-Zinh", DeprecatedScript}, + {"und-Qaai", "und-Qaai", DeprecatedBase}, + {"drh", "mn", All}, // drh -> khk -> mn + } + for i, tt := range tests { + in, _ := Raw.Parse(tt.in) + in, _ = tt.option.Canonicalize(in) + if in.String() != tt.out { + t.Errorf("%d:%s: was %s; want %s", i, tt.in, in.String(), tt.out) + } + } + // Test idempotence. + for _, base := range Supported.BaseLanguages() { + tag, _ := Raw.Compose(base) + got, _ := All.Canonicalize(tag) + want, _ := All.Canonicalize(got) + if got != want { + t.Errorf("idem(%s): got %s; want %s", tag, got, want) + } + } +} + +func TestTypeForKey(t *testing.T) { + tests := []struct{ key, in, out string }{ + {"co", "en", ""}, + {"co", "en-u-abc", ""}, + {"co", "en-u-co-phonebk", "phonebk"}, + {"co", "en-u-co-phonebk-cu-aud", "phonebk"}, + {"co", "x-foo-u-co-phonebk", ""}, + {"nu", "en-u-co-phonebk-nu-arabic", "arabic"}, + } + for _, tt := range tests { + if v := Make(tt.in).TypeForKey(tt.key); v != tt.out { + t.Errorf("%q[%q]: was %q; want %q", tt.in, tt.key, v, tt.out) + } + } +} + +func TestSetTypeForKey(t *testing.T) { + tests := []struct { + key, value, in, out string + err bool + }{ + // replace existing value + {"co", "pinyin", "en-u-co-phonebk", "en-u-co-pinyin", false}, + {"co", "pinyin", "en-u-co-phonebk-cu-xau", "en-u-co-pinyin-cu-xau", false}, + {"co", "pinyin", "en-u-co-phonebk-v-xx", "en-u-co-pinyin-v-xx", false}, + {"co", "pinyin", "en-u-co-phonebk-x-x", "en-u-co-pinyin-x-x", false}, + {"nu", "arabic", "en-u-co-phonebk-nu-vaai", "en-u-co-phonebk-nu-arabic", false}, + // add to existing -u extension + {"co", "pinyin", "en-u-ca-gregory", "en-u-ca-gregory-co-pinyin", false}, + {"co", "pinyin", "en-u-ca-gregory-nu-vaai", "en-u-ca-gregory-co-pinyin-nu-vaai", false}, + {"co", "pinyin", "en-u-ca-gregory-v-va", "en-u-ca-gregory-co-pinyin-v-va", false}, + {"co", "pinyin", "en-u-ca-gregory-x-a", "en-u-ca-gregory-co-pinyin-x-a", false}, + {"ca", "gregory", "en-u-co-pinyin", "en-u-ca-gregory-co-pinyin", false}, + // remove pair + {"co", "", "en-u-co-phonebk", "en", false}, + {"co", "", "en-u-ca-gregory-co-phonebk", "en-u-ca-gregory", false}, + {"co", "", "en-u-co-phonebk-nu-arabic", "en-u-nu-arabic", false}, + {"co", "", "en", "en", false}, + // add -u extension + {"co", "pinyin", "en", "en-u-co-pinyin", false}, + {"co", "pinyin", "und", "und-u-co-pinyin", false}, + {"co", "pinyin", "en-a-aaa", "en-a-aaa-u-co-pinyin", false}, + {"co", "pinyin", "en-x-aaa", "en-u-co-pinyin-x-aaa", false}, + {"co", "pinyin", "en-v-aa", "en-u-co-pinyin-v-aa", false}, + {"co", "pinyin", "en-a-aaa-x-x", "en-a-aaa-u-co-pinyin-x-x", false}, + {"co", "pinyin", "en-a-aaa-v-va", "en-a-aaa-u-co-pinyin-v-va", false}, + // error on invalid values + {"co", "pinyinxxx", "en", "en", true}, + {"co", "piny.n", "en", "en", true}, + {"co", "pinyinxxx", "en-a-aaa", "en-a-aaa", true}, + {"co", "pinyinxxx", "en-u-aaa", "en-u-aaa", true}, + {"co", "pinyinxxx", "en-u-aaa-co-pinyin", "en-u-aaa-co-pinyin", true}, + {"co", "pinyi.", "en-u-aaa-co-pinyin", "en-u-aaa-co-pinyin", true}, + {"col", "pinyin", "en", "en", true}, + {"co", "cu", "en", "en", true}, + // error when setting on a private use tag + {"co", "phonebook", "x-foo", "x-foo", true}, + } + for i, tt := range tests { + tag := Make(tt.in) + if v, err := tag.SetTypeForKey(tt.key, tt.value); v.String() != tt.out { + t.Errorf("%d:%q[%q]=%q: was %q; want %q", i, tt.in, tt.key, tt.value, v, tt.out) + } else if (err != nil) != tt.err { + t.Errorf("%d:%q[%q]=%q: error was %v; want %v", i, tt.in, tt.key, tt.value, err != nil, tt.err) + } else if val := v.TypeForKey(tt.key); err == nil && val != tt.value { + t.Errorf("%d:%q[%q]==%q: was %v; want %v", i, tt.out, tt.key, tt.value, val, tt.value) + } + if len(tag.String()) <= 3 { + // Simulate a tag for which the string has not been set. + tag.str, tag.pExt, tag.pVariant = "", 0, 0 + if tag, err := tag.SetTypeForKey(tt.key, tt.value); err == nil { + if val := tag.TypeForKey(tt.key); err == nil && val != tt.value { + t.Errorf("%d:%q[%q]==%q: was %v; want %v", i, tt.out, tt.key, tt.value, val, tt.value) + } + } + } + } +} + +func TestFindKeyAndType(t *testing.T) { + // out is either the matched type in case of a match or the original + // string up till the insertion point. + tests := []struct { + key string + hasExt bool + in, out string + }{ + // Don't search past a private use extension. + {"co", false, "en-x-foo-u-co-pinyin", "en"}, + {"co", false, "x-foo-u-co-pinyin", ""}, + {"co", false, "en-s-fff-x-foo", "en-s-fff"}, + // Insertion points in absence of -u extension. + {"cu", false, "en", ""}, // t.str is "" + {"cu", false, "en-v-va", "en"}, + {"cu", false, "en-a-va", "en-a-va"}, + {"cu", false, "en-a-va-v-va", "en-a-va"}, + {"cu", false, "en-x-a", "en"}, + // Tags with the -u extension. + {"co", true, "en-u-co-standard", "standard"}, + {"co", true, "yue-u-co-pinyin", "pinyin"}, + {"co", true, "en-u-co-abc", "abc"}, + {"co", true, "en-u-co-abc-def", "abc-def"}, + {"co", true, "en-u-co-abc-def-x-foo", "abc-def"}, + {"co", true, "en-u-co-standard-nu-arab", "standard"}, + {"co", true, "yue-u-co-pinyin-nu-arab", "pinyin"}, + // Insertion points. + {"cu", true, "en-u-co-standard", "en-u-co-standard"}, + {"cu", true, "yue-u-co-pinyin-x-foo", "yue-u-co-pinyin"}, + {"cu", true, "en-u-co-abc", "en-u-co-abc"}, + {"cu", true, "en-u-nu-arabic", "en-u"}, + {"cu", true, "en-u-co-abc-def-nu-arabic", "en-u-co-abc-def"}, + } + for i, tt := range tests { + start, end, hasExt := Make(tt.in).findTypeForKey(tt.key) + if start != end { + res := tt.in[start:end] + if res != tt.out { + t.Errorf("%d:%s: was %q; want %q", i, tt.in, res, tt.out) + } + } else { + if hasExt != tt.hasExt { + t.Errorf("%d:%s: hasExt was %v; want %v", i, tt.in, hasExt, tt.hasExt) + continue + } + if tt.in[:start] != tt.out { + t.Errorf("%d:%s: insertion point was %q; want %q", i, tt.in, tt.in[:start], tt.out) + } + } + } +} + +func TestParent(t *testing.T) { + tests := []struct{ in, out string }{ + // Strip variants and extensions first + {"de-u-co-phonebk", "de"}, + {"de-1994", "de"}, + {"de-Latn-1994", "de"}, // remove superfluous script. + + // Ensure the canonical Tag for an entry is in the chain for base-script + // pairs. + {"zh-Hans", "zh"}, + + // Skip the script if it is the maximized version. CLDR files for the + // skipped tag are always empty. + {"zh-Hans-TW", "zh"}, + {"zh-Hans-CN", "zh"}, + + // Insert the script if the maximized script is not the same as the + // maximized script of the base language. + {"zh-TW", "zh-Hant"}, + {"zh-HK", "zh-Hant"}, + {"zh-Hant-TW", "zh-Hant"}, + {"zh-Hant-HK", "zh-Hant"}, + + // Non-default script skips to und. + // CLDR + {"az-Cyrl", "und"}, + {"bs-Cyrl", "und"}, + {"en-Dsrt", "und"}, + {"ha-Arab", "und"}, + {"mn-Mong", "und"}, + {"pa-Arab", "und"}, + {"shi-Latn", "und"}, + {"sr-Latn", "und"}, + {"uz-Arab", "und"}, + {"uz-Cyrl", "und"}, + {"vai-Latn", "und"}, + {"zh-Hant", "und"}, + // extra + {"nl-Cyrl", "und"}, + + // World english inherits from en-001. + {"en-150", "en-001"}, + {"en-AU", "en-001"}, + {"en-BE", "en-001"}, + {"en-GG", "en-001"}, + {"en-GI", "en-001"}, + {"en-HK", "en-001"}, + {"en-IE", "en-001"}, + {"en-IM", "en-001"}, + {"en-IN", "en-001"}, + {"en-JE", "en-001"}, + {"en-MT", "en-001"}, + {"en-NZ", "en-001"}, + {"en-PK", "en-001"}, + {"en-SG", "en-001"}, + + // Spanish in Latin-American countries have es-419 as parent. + {"es-AR", "es-419"}, + {"es-BO", "es-419"}, + {"es-CL", "es-419"}, + {"es-CO", "es-419"}, + {"es-CR", "es-419"}, + {"es-CU", "es-419"}, + {"es-DO", "es-419"}, + {"es-EC", "es-419"}, + {"es-GT", "es-419"}, + {"es-HN", "es-419"}, + {"es-MX", "es-419"}, + {"es-NI", "es-419"}, + {"es-PA", "es-419"}, + {"es-PE", "es-419"}, + {"es-PR", "es-419"}, + {"es-PY", "es-419"}, + {"es-SV", "es-419"}, + {"es-US", "es-419"}, + {"es-UY", "es-419"}, + {"es-VE", "es-419"}, + // exceptions (according to CLDR) + {"es-CW", "es"}, + + // Inherit from pt-PT, instead of pt for these countries. + {"pt-AO", "pt-PT"}, + {"pt-CV", "pt-PT"}, + {"pt-GW", "pt-PT"}, + {"pt-MO", "pt-PT"}, + {"pt-MZ", "pt-PT"}, + {"pt-ST", "pt-PT"}, + {"pt-TL", "pt-PT"}, + } + for _, tt := range tests { + tag := Raw.MustParse(tt.in) + if p := Raw.MustParse(tt.out); p != tag.Parent() { + t.Errorf("%s: was %v; want %v", tt.in, tag.Parent(), p) + } + } +} + +var ( + // Tags without error that don't need to be changed. + benchBasic = []string{ + "en", + "en-Latn", + "en-GB", + "za", + "zh-Hant", + "zh", + "zh-HK", + "ar-MK", + "en-CA", + "fr-CA", + "fr-CH", + "fr", + "lv", + "he-IT", + "tlh", + "ja", + "ja-Jpan", + "ja-Jpan-JP", + "de-1996", + "de-CH", + "sr", + "sr-Latn", + } + // Tags with extensions, not changes required. + benchExt = []string{ + "x-a-b-c-d", + "x-aa-bbbb-cccccccc-d", + "en-x_cc-b-bbb-a-aaa", + "en-c_cc-b-bbb-a-aaa-x-x", + "en-u-co-phonebk", + "en-Cyrl-u-co-phonebk", + "en-US-u-co-phonebk-cu-xau", + "en-nedix-u-co-phonebk", + "en-t-t0-abcd", + "en-t-nl-latn", + "en-t-t0-abcd-x-a", + } + // Change, but not memory allocation required. + benchSimpleChange = []string{ + "EN", + "i-klingon", + "en-latn", + "zh-cmn-Hans-CN", + "iw-NL", + } + // Change and memory allocation required. + benchChangeAlloc = []string{ + "en-c_cc-b-bbb-a-aaa", + "en-u-cu-xua-co-phonebk", + "en-u-cu-xua-co-phonebk-a-cd", + "en-u-def-abc-cu-xua-co-phonebk", + "en-t-en-Cyrl-NL-1994", + "en-t-en-Cyrl-NL-1994-t0-abc-def", + } + // Tags that result in errors. + benchErr = []string{ + // IllFormed + "x_A.-B-C_D", + "en-u-cu-co-phonebk", + "en-u-cu-xau-co", + "en-t-nl-abcd", + // Invalid + "xx", + "nl-Uuuu", + "nl-QB", + } + benchChange = append(benchSimpleChange, benchChangeAlloc...) + benchAll = append(append(append(benchBasic, benchExt...), benchChange...), benchErr...) +) + +func doParse(b *testing.B, tag []string) { + for i := 0; i < b.N; i++ { + // Use the modulo instead of looping over all tags so that we get a somewhat + // meaningful ns/op. + Parse(tag[i%len(tag)]) + } +} + +func BenchmarkParse(b *testing.B) { + doParse(b, benchAll) +} + +func BenchmarkParseBasic(b *testing.B) { + doParse(b, benchBasic) +} + +func BenchmarkParseError(b *testing.B) { + doParse(b, benchErr) +} + +func BenchmarkParseSimpleChange(b *testing.B) { + doParse(b, benchSimpleChange) +} + +func BenchmarkParseChangeAlloc(b *testing.B) { + doParse(b, benchChangeAlloc) +} diff --git a/vendor/golang.org/x/text/language/lookup.go b/vendor/golang.org/x/text/language/lookup.go new file mode 100644 index 0000000000..1d80ac3708 --- /dev/null +++ b/vendor/golang.org/x/text/language/lookup.go @@ -0,0 +1,396 @@ +// Copyright 2013 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 language + +import ( + "bytes" + "fmt" + "sort" + "strconv" + + "golang.org/x/text/internal/tag" +) + +// findIndex tries to find the given tag in idx and returns a standardized error +// if it could not be found. +func findIndex(idx tag.Index, key []byte, form string) (index int, err error) { + if !tag.FixCase(form, key) { + return 0, errSyntax + } + i := idx.Index(key) + if i == -1 { + return 0, mkErrInvalid(key) + } + return i, nil +} + +func searchUint(imap []uint16, key uint16) int { + return sort.Search(len(imap), func(i int) bool { + return imap[i] >= key + }) +} + +type langID uint16 + +// getLangID returns the langID of s if s is a canonical subtag +// or langUnknown if s is not a canonical subtag. +func getLangID(s []byte) (langID, error) { + if len(s) == 2 { + return getLangISO2(s) + } + return getLangISO3(s) +} + +// mapLang returns the mapped langID of id according to mapping m. +func normLang(id langID) (langID, langAliasType) { + k := sort.Search(len(langAliasMap), func(i int) bool { + return langAliasMap[i].from >= uint16(id) + }) + if k < len(langAliasMap) && langAliasMap[k].from == uint16(id) { + return langID(langAliasMap[k].to), langAliasTypes[k] + } + return id, langAliasTypeUnknown +} + +// getLangISO2 returns the langID for the given 2-letter ISO language code +// or unknownLang if this does not exist. +func getLangISO2(s []byte) (langID, error) { + if !tag.FixCase("zz", s) { + return 0, errSyntax + } + if i := lang.Index(s); i != -1 && lang.Elem(i)[3] != 0 { + return langID(i), nil + } + return 0, mkErrInvalid(s) +} + +const base = 'z' - 'a' + 1 + +func strToInt(s []byte) uint { + v := uint(0) + for i := 0; i < len(s); i++ { + v *= base + v += uint(s[i] - 'a') + } + return v +} + +// converts the given integer to the original ASCII string passed to strToInt. +// len(s) must match the number of characters obtained. +func intToStr(v uint, s []byte) { + for i := len(s) - 1; i >= 0; i-- { + s[i] = byte(v%base) + 'a' + v /= base + } +} + +// getLangISO3 returns the langID for the given 3-letter ISO language code +// or unknownLang if this does not exist. +func getLangISO3(s []byte) (langID, error) { + if tag.FixCase("und", s) { + // first try to match canonical 3-letter entries + for i := lang.Index(s[:2]); i != -1; i = lang.Next(s[:2], i) { + if e := lang.Elem(i); e[3] == 0 && e[2] == s[2] { + // We treat "und" as special and always translate it to "unspecified". + // Note that ZZ and Zzzz are private use and are not treated as + // unspecified by default. + id := langID(i) + if id == nonCanonicalUnd { + return 0, nil + } + return id, nil + } + } + if i := altLangISO3.Index(s); i != -1 { + return langID(altLangIndex[altLangISO3.Elem(i)[3]]), nil + } + n := strToInt(s) + if langNoIndex[n/8]&(1<<(n%8)) != 0 { + return langID(n) + langNoIndexOffset, nil + } + // Check for non-canonical uses of ISO3. + for i := lang.Index(s[:1]); i != -1; i = lang.Next(s[:1], i) { + if e := lang.Elem(i); e[2] == s[1] && e[3] == s[2] { + return langID(i), nil + } + } + return 0, mkErrInvalid(s) + } + return 0, errSyntax +} + +// stringToBuf writes the string to b and returns the number of bytes +// written. cap(b) must be >= 3. +func (id langID) stringToBuf(b []byte) int { + if id >= langNoIndexOffset { + intToStr(uint(id)-langNoIndexOffset, b[:3]) + return 3 + } else if id == 0 { + return copy(b, "und") + } + l := lang[id<<2:] + if l[3] == 0 { + return copy(b, l[:3]) + } + return copy(b, l[:2]) +} + +// String returns the BCP 47 representation of the langID. +// Use b as variable name, instead of id, to ensure the variable +// used is consistent with that of Base in which this type is embedded. +func (b langID) String() string { + if b == 0 { + return "und" + } else if b >= langNoIndexOffset { + b -= langNoIndexOffset + buf := [3]byte{} + intToStr(uint(b), buf[:]) + return string(buf[:]) + } + l := lang.Elem(int(b)) + if l[3] == 0 { + return l[:3] + } + return l[:2] +} + +// ISO3 returns the ISO 639-3 language code. +func (b langID) ISO3() string { + if b == 0 || b >= langNoIndexOffset { + return b.String() + } + l := lang.Elem(int(b)) + if l[3] == 0 { + return l[:3] + } else if l[2] == 0 { + return altLangISO3.Elem(int(l[3]))[:3] + } + // This allocation will only happen for 3-letter ISO codes + // that are non-canonical BCP 47 language identifiers. + return l[0:1] + l[2:4] +} + +// IsPrivateUse reports whether this language code is reserved for private use. +func (b langID) IsPrivateUse() bool { + return langPrivateStart <= b && b <= langPrivateEnd +} + +type regionID uint16 + +// getRegionID returns the region id for s if s is a valid 2-letter region code +// or unknownRegion. +func getRegionID(s []byte) (regionID, error) { + if len(s) == 3 { + if isAlpha(s[0]) { + return getRegionISO3(s) + } + if i, err := strconv.ParseUint(string(s), 10, 10); err == nil { + return getRegionM49(int(i)) + } + } + return getRegionISO2(s) +} + +// getRegionISO2 returns the regionID for the given 2-letter ISO country code +// or unknownRegion if this does not exist. +func getRegionISO2(s []byte) (regionID, error) { + i, err := findIndex(regionISO, s, "ZZ") + if err != nil { + return 0, err + } + return regionID(i) + isoRegionOffset, nil +} + +// getRegionISO3 returns the regionID for the given 3-letter ISO country code +// or unknownRegion if this does not exist. +func getRegionISO3(s []byte) (regionID, error) { + if tag.FixCase("ZZZ", s) { + for i := regionISO.Index(s[:1]); i != -1; i = regionISO.Next(s[:1], i) { + if e := regionISO.Elem(i); e[2] == s[1] && e[3] == s[2] { + return regionID(i) + isoRegionOffset, nil + } + } + for i := 0; i < len(altRegionISO3); i += 3 { + if tag.Compare(altRegionISO3[i:i+3], s) == 0 { + return regionID(altRegionIDs[i/3]), nil + } + } + return 0, mkErrInvalid(s) + } + return 0, errSyntax +} + +func getRegionM49(n int) (regionID, error) { + if 0 < n && n <= 999 { + const ( + searchBits = 7 + regionBits = 9 + regionMask = 1<<regionBits - 1 + ) + idx := n >> searchBits + buf := fromM49[m49Index[idx]:m49Index[idx+1]] + val := uint16(n) << regionBits // we rely on bits shifting out + i := sort.Search(len(buf), func(i int) bool { + return buf[i] >= val + }) + if r := fromM49[int(m49Index[idx])+i]; r&^regionMask == val { + return regionID(r & regionMask), nil + } + } + var e ValueError + fmt.Fprint(bytes.NewBuffer([]byte(e.v[:])), n) + return 0, e +} + +// normRegion returns a region if r is deprecated or 0 otherwise. +// TODO: consider supporting BYS (-> BLR), CSK (-> 200 or CZ), PHI (-> PHL) and AFI (-> DJ). +// TODO: consider mapping split up regions to new most populous one (like CLDR). +func normRegion(r regionID) regionID { + m := regionOldMap + k := sort.Search(len(m), func(i int) bool { + return m[i].from >= uint16(r) + }) + if k < len(m) && m[k].from == uint16(r) { + return regionID(m[k].to) + } + return 0 +} + +const ( + iso3166UserAssigned = 1 << iota + ccTLD + bcp47Region +) + +func (r regionID) typ() byte { + return regionTypes[r] +} + +// String returns the BCP 47 representation for the region. +// It returns "ZZ" for an unspecified region. +func (r regionID) String() string { + if r < isoRegionOffset { + if r == 0 { + return "ZZ" + } + return fmt.Sprintf("%03d", r.M49()) + } + r -= isoRegionOffset + return regionISO.Elem(int(r))[:2] +} + +// ISO3 returns the 3-letter ISO code of r. +// Note that not all regions have a 3-letter ISO code. +// In such cases this method returns "ZZZ". +func (r regionID) ISO3() string { + if r < isoRegionOffset { + return "ZZZ" + } + r -= isoRegionOffset + reg := regionISO.Elem(int(r)) + switch reg[2] { + case 0: + return altRegionISO3[reg[3]:][:3] + case ' ': + return "ZZZ" + } + return reg[0:1] + reg[2:4] +} + +// M49 returns the UN M.49 encoding of r, or 0 if this encoding +// is not defined for r. +func (r regionID) M49() int { + return int(m49[r]) +} + +// IsPrivateUse reports whether r has the ISO 3166 User-assigned status. This +// may include private-use tags that are assigned by CLDR and used in this +// implementation. So IsPrivateUse and IsCountry can be simultaneously true. +func (r regionID) IsPrivateUse() bool { + return r.typ()&iso3166UserAssigned != 0 +} + +type scriptID uint8 + +// getScriptID returns the script id for string s. It assumes that s +// is of the format [A-Z][a-z]{3}. +func getScriptID(idx tag.Index, s []byte) (scriptID, error) { + i, err := findIndex(idx, s, "Zzzz") + return scriptID(i), err +} + +// String returns the script code in title case. +// It returns "Zzzz" for an unspecified script. +func (s scriptID) String() string { + if s == 0 { + return "Zzzz" + } + return script.Elem(int(s)) +} + +// IsPrivateUse reports whether this script code is reserved for private use. +func (s scriptID) IsPrivateUse() bool { + return _Qaaa <= s && s <= _Qabx +} + +const ( + maxAltTaglen = len("en-US-POSIX") + maxLen = maxAltTaglen +) + +var ( + // grandfatheredMap holds a mapping from legacy and grandfathered tags to + // their base language or index to more elaborate tag. + grandfatheredMap = map[[maxLen]byte]int16{ + [maxLen]byte{'a', 'r', 't', '-', 'l', 'o', 'j', 'b', 'a', 'n'}: _jbo, // art-lojban + [maxLen]byte{'i', '-', 'a', 'm', 'i'}: _ami, // i-ami + [maxLen]byte{'i', '-', 'b', 'n', 'n'}: _bnn, // i-bnn + [maxLen]byte{'i', '-', 'h', 'a', 'k'}: _hak, // i-hak + [maxLen]byte{'i', '-', 'k', 'l', 'i', 'n', 'g', 'o', 'n'}: _tlh, // i-klingon + [maxLen]byte{'i', '-', 'l', 'u', 'x'}: _lb, // i-lux + [maxLen]byte{'i', '-', 'n', 'a', 'v', 'a', 'j', 'o'}: _nv, // i-navajo + [maxLen]byte{'i', '-', 'p', 'w', 'n'}: _pwn, // i-pwn + [maxLen]byte{'i', '-', 't', 'a', 'o'}: _tao, // i-tao + [maxLen]byte{'i', '-', 't', 'a', 'y'}: _tay, // i-tay + [maxLen]byte{'i', '-', 't', 's', 'u'}: _tsu, // i-tsu + [maxLen]byte{'n', 'o', '-', 'b', 'o', 'k'}: _nb, // no-bok + [maxLen]byte{'n', 'o', '-', 'n', 'y', 'n'}: _nn, // no-nyn + [maxLen]byte{'s', 'g', 'n', '-', 'b', 'e', '-', 'f', 'r'}: _sfb, // sgn-BE-FR + [maxLen]byte{'s', 'g', 'n', '-', 'b', 'e', '-', 'n', 'l'}: _vgt, // sgn-BE-NL + [maxLen]byte{'s', 'g', 'n', '-', 'c', 'h', '-', 'd', 'e'}: _sgg, // sgn-CH-DE + [maxLen]byte{'z', 'h', '-', 'g', 'u', 'o', 'y', 'u'}: _cmn, // zh-guoyu + [maxLen]byte{'z', 'h', '-', 'h', 'a', 'k', 'k', 'a'}: _hak, // zh-hakka + [maxLen]byte{'z', 'h', '-', 'm', 'i', 'n', '-', 'n', 'a', 'n'}: _nan, // zh-min-nan + [maxLen]byte{'z', 'h', '-', 'x', 'i', 'a', 'n', 'g'}: _hsn, // zh-xiang + + // Grandfathered tags with no modern replacement will be converted as + // follows: + [maxLen]byte{'c', 'e', 'l', '-', 'g', 'a', 'u', 'l', 'i', 's', 'h'}: -1, // cel-gaulish + [maxLen]byte{'e', 'n', '-', 'g', 'b', '-', 'o', 'e', 'd'}: -2, // en-GB-oed + [maxLen]byte{'i', '-', 'd', 'e', 'f', 'a', 'u', 'l', 't'}: -3, // i-default + [maxLen]byte{'i', '-', 'e', 'n', 'o', 'c', 'h', 'i', 'a', 'n'}: -4, // i-enochian + [maxLen]byte{'i', '-', 'm', 'i', 'n', 'g', 'o'}: -5, // i-mingo + [maxLen]byte{'z', 'h', '-', 'm', 'i', 'n'}: -6, // zh-min + + // CLDR-specific tag. + [maxLen]byte{'r', 'o', 'o', 't'}: 0, // root + [maxLen]byte{'e', 'n', '-', 'u', 's', '-', 'p', 'o', 's', 'i', 'x'}: -7, // en_US_POSIX" + } + + altTagIndex = [...]uint8{0, 17, 31, 45, 61, 74, 86, 102} + + altTags = "xtg-x-cel-gaulishen-GB-oxendicten-x-i-defaultund-x-i-enochiansee-x-i-mingonan-x-zh-minen-US-u-va-posix" +) + +func grandfathered(s [maxAltTaglen]byte) (t Tag, ok bool) { + if v, ok := grandfatheredMap[s]; ok { + if v < 0 { + return Make(altTags[altTagIndex[-v-1]:altTagIndex[-v]]), true + } + t.lang = langID(v) + return t, true + } + return t, false +} diff --git a/vendor/golang.org/x/text/language/lookup_test.go b/vendor/golang.org/x/text/language/lookup_test.go new file mode 100644 index 0000000000..9833830c41 --- /dev/null +++ b/vendor/golang.org/x/text/language/lookup_test.go @@ -0,0 +1,457 @@ +// Copyright 2013 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 language + +import ( + "testing" + + "golang.org/x/text/internal/tag" +) + +func b(s string) []byte { + return []byte(s) +} + +func TestLangID(t *testing.T) { + tests := []struct { + id, bcp47, iso3, norm string + err error + }{ + {id: "", bcp47: "und", iso3: "und", err: errSyntax}, + {id: " ", bcp47: "und", iso3: "und", err: errSyntax}, + {id: " ", bcp47: "und", iso3: "und", err: errSyntax}, + {id: " ", bcp47: "und", iso3: "und", err: errSyntax}, + {id: "xxx", bcp47: "und", iso3: "und", err: mkErrInvalid([]byte("xxx"))}, + {id: "und", bcp47: "und", iso3: "und"}, + {id: "aju", bcp47: "aju", iso3: "aju", norm: "jrb"}, + {id: "jrb", bcp47: "jrb", iso3: "jrb"}, + {id: "es", bcp47: "es", iso3: "spa"}, + {id: "spa", bcp47: "es", iso3: "spa"}, + {id: "ji", bcp47: "ji", iso3: "yid-", norm: "yi"}, + {id: "jw", bcp47: "jw", iso3: "jav-", norm: "jv"}, + {id: "ar", bcp47: "ar", iso3: "ara"}, + {id: "kw", bcp47: "kw", iso3: "cor"}, + {id: "arb", bcp47: "arb", iso3: "arb", norm: "ar"}, + {id: "ar", bcp47: "ar", iso3: "ara"}, + {id: "kur", bcp47: "ku", iso3: "kur"}, + {id: "nl", bcp47: "nl", iso3: "nld"}, + {id: "NL", bcp47: "nl", iso3: "nld"}, + {id: "gsw", bcp47: "gsw", iso3: "gsw"}, + {id: "gSW", bcp47: "gsw", iso3: "gsw"}, + {id: "und", bcp47: "und", iso3: "und"}, + {id: "sh", bcp47: "sh", iso3: "hbs", norm: "sr"}, + {id: "hbs", bcp47: "sh", iso3: "hbs", norm: "sr"}, + {id: "no", bcp47: "no", iso3: "nor", norm: "no"}, + {id: "nor", bcp47: "no", iso3: "nor", norm: "no"}, + {id: "cmn", bcp47: "cmn", iso3: "cmn", norm: "zh"}, + } + for i, tt := range tests { + want, err := getLangID(b(tt.id)) + if err != tt.err { + t.Errorf("%d:err(%s): found %q; want %q", i, tt.id, err, tt.err) + } + if err != nil { + continue + } + if id, _ := getLangISO2(b(tt.bcp47)); len(tt.bcp47) == 2 && want != id { + t.Errorf("%d:getISO2(%s): found %v; want %v", i, tt.bcp47, id, want) + } + if len(tt.iso3) == 3 { + if id, _ := getLangISO3(b(tt.iso3)); want != id { + t.Errorf("%d:getISO3(%s): found %q; want %q", i, tt.iso3, id, want) + } + if id, _ := getLangID(b(tt.iso3)); want != id { + t.Errorf("%d:getID3(%s): found %v; want %v", i, tt.iso3, id, want) + } + } + norm := want + if tt.norm != "" { + norm, _ = getLangID(b(tt.norm)) + } + id, _ := normLang(want) + if id != norm { + t.Errorf("%d:norm(%s): found %v; want %v", i, tt.id, id, norm) + } + if id := want.String(); tt.bcp47 != id { + t.Errorf("%d:String(): found %s; want %s", i, id, tt.bcp47) + } + if id := want.ISO3(); tt.iso3[:3] != id { + t.Errorf("%d:iso3(): found %s; want %s", i, id, tt.iso3[:3]) + } + } +} + +func TestGrandfathered(t *testing.T) { + for _, tt := range []struct{ in, out string }{ + {"art-lojban", "jbo"}, + {"i-ami", "ami"}, + {"i-bnn", "bnn"}, + {"i-hak", "hak"}, + {"i-klingon", "tlh"}, + {"i-lux", "lb"}, + {"i-navajo", "nv"}, + {"i-pwn", "pwn"}, + {"i-tao", "tao"}, + {"i-tay", "tay"}, + {"i-tsu", "tsu"}, + {"no-bok", "nb"}, + {"no-nyn", "nn"}, + {"sgn-BE-FR", "sfb"}, + {"sgn-BE-NL", "vgt"}, + {"sgn-CH-DE", "sgg"}, + {"sgn-ch-de", "sgg"}, + {"zh-guoyu", "cmn"}, + {"zh-hakka", "hak"}, + {"zh-min-nan", "nan"}, + {"zh-xiang", "hsn"}, + + // Grandfathered tags with no modern replacement will be converted as follows: + {"cel-gaulish", "xtg-x-cel-gaulish"}, + {"en-GB-oed", "en-GB-oxendict"}, + {"en-gb-oed", "en-GB-oxendict"}, + {"i-default", "en-x-i-default"}, + {"i-enochian", "und-x-i-enochian"}, + {"i-mingo", "see-x-i-mingo"}, + {"zh-min", "nan-x-zh-min"}, + + {"root", "und"}, + {"en_US_POSIX", "en-US-u-va-posix"}, + {"en_us_posix", "en-US-u-va-posix"}, + {"en-us-posix", "en-US-u-va-posix"}, + } { + got := Raw.Make(tt.in) + want := Raw.MustParse(tt.out) + if got != want { + t.Errorf("%s: got %q; want %q", tt.in, got, want) + } + } +} + +func TestRegionID(t *testing.T) { + tests := []struct { + in, out string + }{ + {"_ ", ""}, + {"_000", ""}, + {"419", "419"}, + {"AA", "AA"}, + {"ATF", "TF"}, + {"HV", "HV"}, + {"CT", "CT"}, + {"DY", "DY"}, + {"IC", "IC"}, + {"FQ", "FQ"}, + {"JT", "JT"}, + {"ZZ", "ZZ"}, + {"EU", "EU"}, + {"QO", "QO"}, + {"FX", "FX"}, + } + for i, tt := range tests { + if tt.in[0] == '_' { + id := tt.in[1:] + if _, err := getRegionID(b(id)); err == nil { + t.Errorf("%d:err(%s): found nil; want error", i, id) + } + continue + } + want, _ := getRegionID(b(tt.in)) + if s := want.String(); s != tt.out { + t.Errorf("%d:%s: found %q; want %q", i, tt.in, s, tt.out) + } + if len(tt.in) == 2 { + want, _ := getRegionISO2(b(tt.in)) + if s := want.String(); s != tt.out { + t.Errorf("%d:getISO2(%s): found %q; want %q", i, tt.in, s, tt.out) + } + } + } +} + +func TestRegionType(t *testing.T) { + for _, tt := range []struct { + r string + t byte + }{ + {"NL", bcp47Region | ccTLD}, + {"EU", bcp47Region | ccTLD}, // exceptionally reserved + {"AN", bcp47Region | ccTLD}, // transitionally reserved + + {"DD", bcp47Region}, // deleted in ISO, deprecated in BCP 47 + {"NT", bcp47Region}, // transitionally reserved, deprecated in BCP 47 + + {"XA", iso3166UserAssigned | bcp47Region}, + {"ZZ", iso3166UserAssigned | bcp47Region}, + {"AA", iso3166UserAssigned | bcp47Region}, + {"QO", iso3166UserAssigned | bcp47Region}, + {"QM", iso3166UserAssigned | bcp47Region}, + {"XK", iso3166UserAssigned | bcp47Region}, + + {"CT", 0}, // deleted in ISO, not in BCP 47, canonicalized in CLDR + } { + r := MustParseRegion(tt.r) + if tp := r.typ(); tp != tt.t { + t.Errorf("Type(%s): got %x; want %x", tt.r, tp, tt.t) + } + } +} + +func TestRegionISO3(t *testing.T) { + tests := []struct { + from, iso3, to string + }{ + {" ", "ZZZ", "ZZ"}, + {"000", "ZZZ", "ZZ"}, + {"AA", "AAA", ""}, + {"CT", "CTE", ""}, + {"DY", "DHY", ""}, + {"EU", "QUU", ""}, + {"HV", "HVO", ""}, + {"IC", "ZZZ", "ZZ"}, + {"JT", "JTN", ""}, + {"PZ", "PCZ", ""}, + {"QU", "QUU", "EU"}, + {"QO", "QOO", ""}, + {"YD", "YMD", ""}, + {"FQ", "ATF", "TF"}, + {"TF", "ATF", ""}, + {"FX", "FXX", ""}, + {"ZZ", "ZZZ", ""}, + {"419", "ZZZ", "ZZ"}, + } + for _, tt := range tests { + r, _ := getRegionID(b(tt.from)) + if s := r.ISO3(); s != tt.iso3 { + t.Errorf("iso3(%q): found %q; want %q", tt.from, s, tt.iso3) + } + if tt.iso3 == "" { + continue + } + want := tt.to + if tt.to == "" { + want = tt.from + } + r, _ = getRegionID(b(want)) + if id, _ := getRegionISO3(b(tt.iso3)); id != r { + t.Errorf("%s: found %q; want %q", tt.iso3, id, want) + } + } +} + +func TestRegionM49(t *testing.T) { + fromTests := []struct { + m49 int + id string + }{ + {0, ""}, + {-1, ""}, + {1000, ""}, + {10000, ""}, + + {001, "001"}, + {104, "MM"}, + {180, "CD"}, + {230, "ET"}, + {231, "ET"}, + {249, "FX"}, + {250, "FR"}, + {276, "DE"}, + {278, "DD"}, + {280, "DE"}, + {419, "419"}, + {626, "TL"}, + {736, "SD"}, + {840, "US"}, + {854, "BF"}, + {891, "CS"}, + {899, ""}, + {958, "AA"}, + {966, "QT"}, + {967, "EU"}, + {999, "ZZ"}, + } + for _, tt := range fromTests { + id, err := getRegionM49(tt.m49) + if want, have := err != nil, tt.id == ""; want != have { + t.Errorf("error(%d): have %v; want %v", tt.m49, have, want) + continue + } + r, _ := getRegionID(b(tt.id)) + if r != id { + t.Errorf("region(%d): have %s; want %s", tt.m49, id, r) + } + } + + toTests := []struct { + m49 int + id string + }{ + {0, "000"}, + {0, "IC"}, // Some codes don't have an ID + + {001, "001"}, + {104, "MM"}, + {104, "BU"}, + {180, "CD"}, + {180, "ZR"}, + {231, "ET"}, + {250, "FR"}, + {249, "FX"}, + {276, "DE"}, + {278, "DD"}, + {419, "419"}, + {626, "TL"}, + {626, "TP"}, + {729, "SD"}, + {826, "GB"}, + {840, "US"}, + {854, "BF"}, + {891, "YU"}, + {891, "CS"}, + {958, "AA"}, + {966, "QT"}, + {967, "EU"}, + {967, "QU"}, + {999, "ZZ"}, + // For codes that don't have an M49 code use the replacement value, + // if available. + {854, "HV"}, // maps to Burkino Faso + } + for _, tt := range toTests { + r, _ := getRegionID(b(tt.id)) + if r.M49() != tt.m49 { + t.Errorf("m49(%q): have %d; want %d", tt.id, r.M49(), tt.m49) + } + } +} + +func TestRegionDeprecation(t *testing.T) { + tests := []struct{ in, out string }{ + {"BU", "MM"}, + {"BUR", "MM"}, + {"CT", "KI"}, + {"DD", "DE"}, + {"DDR", "DE"}, + {"DY", "BJ"}, + {"FX", "FR"}, + {"HV", "BF"}, + {"JT", "UM"}, + {"MI", "UM"}, + {"NH", "VU"}, + {"NQ", "AQ"}, + {"PU", "UM"}, + {"PZ", "PA"}, + {"QU", "EU"}, + {"RH", "ZW"}, + {"TP", "TL"}, + {"UK", "GB"}, + {"VD", "VN"}, + {"WK", "UM"}, + {"YD", "YE"}, + {"NL", "NL"}, + } + for _, tt := range tests { + rIn, _ := getRegionID([]byte(tt.in)) + rOut, _ := getRegionISO2([]byte(tt.out)) + r := normRegion(rIn) + if rOut == rIn && r != 0 { + t.Errorf("%s: was %q; want %q", tt.in, r, tt.in) + } + if rOut != rIn && r != rOut { + t.Errorf("%s: was %q; want %q", tt.in, r, tt.out) + } + + } +} + +func TestGetScriptID(t *testing.T) { + idx := tag.Index("0000BbbbDdddEeeeZzzz\xff\xff\xff\xff") + tests := []struct { + in string + out scriptID + }{ + {" ", 0}, + {" ", 0}, + {" ", 0}, + {"", 0}, + {"Aaaa", 0}, + {"Bbbb", 1}, + {"Dddd", 2}, + {"dddd", 2}, + {"dDDD", 2}, + {"Eeee", 3}, + {"Zzzz", 4}, + } + for i, tt := range tests { + if id, err := getScriptID(idx, b(tt.in)); id != tt.out { + t.Errorf("%d:%s: found %d; want %d", i, tt.in, id, tt.out) + } else if id == 0 && err == nil { + t.Errorf("%d:%s: no error; expected one", i, tt.in) + } + } +} + +func TestIsPrivateUse(t *testing.T) { + type test struct { + s string + private bool + } + tests := []test{ + {"en", false}, + {"und", false}, + {"pzn", false}, + {"qaa", true}, + {"qtz", true}, + {"qua", false}, + } + for i, tt := range tests { + x, _ := getLangID([]byte(tt.s)) + if b := x.IsPrivateUse(); b != tt.private { + t.Errorf("%d: langID.IsPrivateUse(%s) was %v; want %v", i, tt.s, b, tt.private) + } + } + tests = []test{ + {"001", false}, + {"419", false}, + {"899", false}, + {"900", false}, + {"957", false}, + {"958", true}, + {"AA", true}, + {"AC", false}, + {"EU", false}, // CLDR grouping, exceptionally reserved in ISO. + {"QU", true}, // Canonicalizes to EU, User-assigned in ISO. + {"QO", true}, // CLDR grouping, User-assigned in ISO. + {"QA", false}, + {"QM", true}, + {"QZ", true}, + {"XA", true}, + {"XK", true}, // Assigned to Kosovo in CLDR, User-assigned in ISO. + {"XZ", true}, + {"ZW", false}, + {"ZZ", true}, + } + for i, tt := range tests { + x, _ := getRegionID([]byte(tt.s)) + if b := x.IsPrivateUse(); b != tt.private { + t.Errorf("%d: regionID.IsPrivateUse(%s) was %v; want %v", i, tt.s, b, tt.private) + } + } + tests = []test{ + {"Latn", false}, + {"Laaa", false}, // invalid + {"Qaaa", true}, + {"Qabx", true}, + {"Qaby", false}, + {"Zyyy", false}, + {"Zzzz", false}, + } + for i, tt := range tests { + x, _ := getScriptID(script, []byte(tt.s)) + if b := x.IsPrivateUse(); b != tt.private { + t.Errorf("%d: scriptID.IsPrivateUse(%s) was %v; want %v", i, tt.s, b, tt.private) + } + } +} diff --git a/vendor/golang.org/x/text/language/maketables.go b/vendor/golang.org/x/text/language/maketables.go new file mode 100644 index 0000000000..2cc995b379 --- /dev/null +++ b/vendor/golang.org/x/text/language/maketables.go @@ -0,0 +1,1635 @@ +// Copyright 2013 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 + +// Language tag table generator. +// Data read from the web. + +package main + +import ( + "bufio" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "math" + "reflect" + "regexp" + "sort" + "strconv" + "strings" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/tag" + "golang.org/x/text/unicode/cldr" +) + +var ( + test = flag.Bool("test", + false, + "test existing tables; can be used to compare web data with package data.") + outputFile = flag.String("output", + "tables.go", + "output file for generated tables") +) + +var comment = []string{ + ` +lang holds an alphabetically sorted list of ISO-639 language identifiers. +All entries are 4 bytes. The index of the identifier (divided by 4) is the language tag. +For 2-byte language identifiers, the two successive bytes have the following meaning: + - if the first letter of the 2- and 3-letter ISO codes are the same: + the second and third letter of the 3-letter ISO code. + - otherwise: a 0 and a by 2 bits right-shifted index into altLangISO3. +For 3-byte language identifiers the 4th byte is 0.`, + ` +langNoIndex is a bit vector of all 3-letter language codes that are not used as an index +in lookup tables. The language ids for these language codes are derived directly +from the letters and are not consecutive.`, + ` +altLangISO3 holds an alphabetically sorted list of 3-letter language code alternatives +to 2-letter language codes that cannot be derived using the method described above. +Each 3-letter code is followed by its 1-byte langID.`, + ` +altLangIndex is used to convert indexes in altLangISO3 to langIDs.`, + ` +langAliasMap maps langIDs to their suggested replacements.`, + ` +script is an alphabetically sorted list of ISO 15924 codes. The index +of the script in the string, divided by 4, is the internal scriptID.`, + ` +isoRegionOffset needs to be added to the index of regionISO to obtain the regionID +for 2-letter ISO codes. (The first isoRegionOffset regionIDs are reserved for +the UN.M49 codes used for groups.)`, + ` +regionISO holds a list of alphabetically sorted 2-letter ISO region codes. +Each 2-letter codes is followed by two bytes with the following meaning: + - [A-Z}{2}: the first letter of the 2-letter code plus these two + letters form the 3-letter ISO code. + - 0, n: index into altRegionISO3.`, + ` +regionTypes defines the status of a region for various standards.`, + ` +m49 maps regionIDs to UN.M49 codes. The first isoRegionOffset entries are +codes indicating collections of regions.`, + ` +m49Index gives indexes into fromM49 based on the three most significant bits +of a 10-bit UN.M49 code. To search an UN.M49 code in fromM49, search in + fromM49[m49Index[msb39(code)]:m49Index[msb3(code)+1]] +for an entry where the first 7 bits match the 7 lsb of the UN.M49 code. +The region code is stored in the 9 lsb of the indexed value.`, + ` +fromM49 contains entries to map UN.M49 codes to regions. See m49Index for details.`, + ` +altRegionISO3 holds a list of 3-letter region codes that cannot be +mapped to 2-letter codes using the default algorithm. This is a short list.`, + ` +altRegionIDs holds a list of regionIDs the positions of which match those +of the 3-letter ISO codes in altRegionISO3.`, + ` +variantNumSpecialized is the number of specialized variants in variants.`, + ` +suppressScript is an index from langID to the dominant script for that language, +if it exists. If a script is given, it should be suppressed from the language tag.`, + ` +likelyLang is a lookup table, indexed by langID, for the most likely +scripts and regions given incomplete information. If more entries exist for a +given language, region and script are the index and size respectively +of the list in likelyLangList.`, + ` +likelyLangList holds lists info associated with likelyLang.`, + ` +likelyRegion is a lookup table, indexed by regionID, for the most likely +languages and scripts given incomplete information. If more entries exist +for a given regionID, lang and script are the index and size respectively +of the list in likelyRegionList. +TODO: exclude containers and user-definable regions from the list.`, + ` +likelyRegionList holds lists info associated with likelyRegion.`, + ` +likelyScript is a lookup table, indexed by scriptID, for the most likely +languages and regions given a script.`, + ` +matchLang holds pairs of langIDs of base languages that are typically +mutually intelligible. Each pair is associated with a confidence and +whether the intelligibility goes one or both ways.`, + ` +matchScript holds pairs of scriptIDs where readers of one script +can typically also read the other. Each is associated with a confidence.`, + ` +nRegionGroups is the number of region groups.`, + ` +regionInclusion maps region identifiers to sets of regions in regionInclusionBits, +where each set holds all groupings that are directly connected in a region +containment graph.`, + ` +regionInclusionBits is an array of bit vectors where every vector represents +a set of region groupings. These sets are used to compute the distance +between two regions for the purpose of language matching.`, + ` +regionInclusionNext marks, for each entry in regionInclusionBits, the set of +all groups that are reachable from the groups set in the respective entry.`, +} + +// TODO: consider changing some of these structures to tries. This can reduce +// memory, but may increase the need for memory allocations. This could be +// mitigated if we can piggyback on language tags for common cases. + +func failOnError(e error) { + if e != nil { + log.Panic(e) + } +} + +type setType int + +const ( + Indexed setType = 1 + iota // all elements must be of same size + Linear +) + +type stringSet struct { + s []string + sorted, frozen bool + + // We often need to update values after the creation of an index is completed. + // We include a convenience map for keeping track of this. + update map[string]string + typ setType // used for checking. +} + +func (ss *stringSet) clone() stringSet { + c := *ss + c.s = append([]string(nil), c.s...) + return c +} + +func (ss *stringSet) setType(t setType) { + if ss.typ != t && ss.typ != 0 { + log.Panicf("type %d cannot be assigned as it was already %d", t, ss.typ) + } +} + +// parse parses a whitespace-separated string and initializes ss with its +// components. +func (ss *stringSet) parse(s string) { + scan := bufio.NewScanner(strings.NewReader(s)) + scan.Split(bufio.ScanWords) + for scan.Scan() { + ss.add(scan.Text()) + } +} + +func (ss *stringSet) assertChangeable() { + if ss.frozen { + log.Panic("attempt to modify a frozen stringSet") + } +} + +func (ss *stringSet) add(s string) { + ss.assertChangeable() + ss.s = append(ss.s, s) + ss.sorted = ss.frozen +} + +func (ss *stringSet) freeze() { + ss.compact() + ss.frozen = true +} + +func (ss *stringSet) compact() { + if ss.sorted { + return + } + a := ss.s + sort.Strings(a) + k := 0 + for i := 1; i < len(a); i++ { + if a[k] != a[i] { + a[k+1] = a[i] + k++ + } + } + ss.s = a[:k+1] + ss.sorted = ss.frozen +} + +type funcSorter struct { + fn func(a, b string) bool + sort.StringSlice +} + +func (s funcSorter) Less(i, j int) bool { + return s.fn(s.StringSlice[i], s.StringSlice[j]) +} + +func (ss *stringSet) sortFunc(f func(a, b string) bool) { + ss.compact() + sort.Sort(funcSorter{f, sort.StringSlice(ss.s)}) +} + +func (ss *stringSet) remove(s string) { + ss.assertChangeable() + if i, ok := ss.find(s); ok { + copy(ss.s[i:], ss.s[i+1:]) + ss.s = ss.s[:len(ss.s)-1] + } +} + +func (ss *stringSet) replace(ol, nu string) { + ss.s[ss.index(ol)] = nu + ss.sorted = ss.frozen +} + +func (ss *stringSet) index(s string) int { + ss.setType(Indexed) + i, ok := ss.find(s) + if !ok { + if i < len(ss.s) { + log.Panicf("find: item %q is not in list. Closest match is %q.", s, ss.s[i]) + } + log.Panicf("find: item %q is not in list", s) + + } + return i +} + +func (ss *stringSet) find(s string) (int, bool) { + ss.compact() + i := sort.SearchStrings(ss.s, s) + return i, i != len(ss.s) && ss.s[i] == s +} + +func (ss *stringSet) slice() []string { + ss.compact() + return ss.s +} + +func (ss *stringSet) updateLater(v, key string) { + if ss.update == nil { + ss.update = map[string]string{} + } + ss.update[v] = key +} + +// join joins the string and ensures that all entries are of the same length. +func (ss *stringSet) join() string { + ss.setType(Indexed) + n := len(ss.s[0]) + for _, s := range ss.s { + if len(s) != n { + log.Panicf("join: not all entries are of the same length: %q", s) + } + } + ss.s = append(ss.s, strings.Repeat("\xff", n)) + return strings.Join(ss.s, "") +} + +// ianaEntry holds information for an entry in the IANA Language Subtag Repository. +// All types use the same entry. +// See http://tools.ietf.org/html/bcp47#section-5.1 for a description of the various +// fields. +type ianaEntry struct { + typ string + description []string + scope string + added string + preferred string + deprecated string + suppressScript string + macro string + prefix []string +} + +type builder struct { + w *gen.CodeWriter + hw io.Writer // MultiWriter for w and w.Hash + data *cldr.CLDR + supp *cldr.SupplementalData + + // indices + locale stringSet // common locales + lang stringSet // canonical language ids (2 or 3 letter ISO codes) with data + langNoIndex stringSet // 3-letter ISO codes with no associated data + script stringSet // 4-letter ISO codes + region stringSet // 2-letter ISO or 3-digit UN M49 codes + variant stringSet // 4-8-alphanumeric variant code. + + // Region codes that are groups with their corresponding group IDs. + groups map[int]index + + // langInfo + registry map[string]*ianaEntry +} + +type index uint + +func newBuilder(w *gen.CodeWriter) *builder { + r := gen.OpenCLDRCoreZip() + defer r.Close() + d := &cldr.Decoder{} + data, err := d.DecodeZip(r) + failOnError(err) + b := builder{ + w: w, + hw: io.MultiWriter(w, w.Hash), + data: data, + supp: data.Supplemental(), + } + b.parseRegistry() + return &b +} + +func (b *builder) parseRegistry() { + r := gen.OpenIANAFile("assignments/language-subtag-registry") + defer r.Close() + b.registry = make(map[string]*ianaEntry) + + scan := bufio.NewScanner(r) + scan.Split(bufio.ScanWords) + var record *ianaEntry + for more := scan.Scan(); more; { + key := scan.Text() + more = scan.Scan() + value := scan.Text() + switch key { + case "Type:": + record = &ianaEntry{typ: value} + case "Subtag:", "Tag:": + if s := strings.SplitN(value, "..", 2); len(s) > 1 { + for a := s[0]; a <= s[1]; a = inc(a) { + b.addToRegistry(a, record) + } + } else { + b.addToRegistry(value, record) + } + case "Suppress-Script:": + record.suppressScript = value + case "Added:": + record.added = value + case "Deprecated:": + record.deprecated = value + case "Macrolanguage:": + record.macro = value + case "Preferred-Value:": + record.preferred = value + case "Prefix:": + record.prefix = append(record.prefix, value) + case "Scope:": + record.scope = value + case "Description:": + buf := []byte(value) + for more = scan.Scan(); more; more = scan.Scan() { + b := scan.Bytes() + if b[0] == '%' || b[len(b)-1] == ':' { + break + } + buf = append(buf, ' ') + buf = append(buf, b...) + } + record.description = append(record.description, string(buf)) + continue + default: + continue + } + more = scan.Scan() + } + if scan.Err() != nil { + log.Panic(scan.Err()) + } +} + +func (b *builder) addToRegistry(key string, entry *ianaEntry) { + if info, ok := b.registry[key]; ok { + if info.typ != "language" || entry.typ != "extlang" { + log.Fatalf("parseRegistry: tag %q already exists", key) + } + } else { + b.registry[key] = entry + } +} + +var commentIndex = make(map[string]string) + +func init() { + for _, s := range comment { + key := strings.TrimSpace(strings.SplitN(s, " ", 2)[0]) + commentIndex[key] = s + } +} + +func (b *builder) comment(name string) { + if s := commentIndex[name]; len(s) > 0 { + b.w.WriteComment(s) + } else { + fmt.Fprintln(b.w) + } +} + +func (b *builder) pf(f string, x ...interface{}) { + fmt.Fprintf(b.hw, f, x...) + fmt.Fprint(b.hw, "\n") +} + +func (b *builder) p(x ...interface{}) { + fmt.Fprintln(b.hw, x...) +} + +func (b *builder) addSize(s int) { + b.w.Size += s + b.pf("// Size: %d bytes", s) +} + +func (b *builder) writeConst(name string, x interface{}) { + b.comment(name) + b.w.WriteConst(name, x) +} + +// writeConsts computes f(v) for all v in values and writes the results +// as constants named _v to a single constant block. +func (b *builder) writeConsts(f func(string) int, values ...string) { + b.pf("const (") + for _, v := range values { + b.pf("\t_%s = %v", v, f(v)) + } + b.pf(")") +} + +// writeType writes the type of the given value, which must be a struct. +func (b *builder) writeType(value interface{}) { + b.comment(reflect.TypeOf(value).Name()) + b.w.WriteType(value) +} + +func (b *builder) writeSlice(name string, ss interface{}) { + b.writeSliceAddSize(name, 0, ss) +} + +func (b *builder) writeSliceAddSize(name string, extraSize int, ss interface{}) { + b.comment(name) + b.w.Size += extraSize + v := reflect.ValueOf(ss) + t := v.Type().Elem() + b.pf("// Size: %d bytes, %d elements", v.Len()*int(t.Size())+extraSize, v.Len()) + + fmt.Fprintf(b.w, "var %s = ", name) + b.w.WriteArray(ss) + b.p() +} + +type fromTo struct { + from, to uint16 +} + +func (b *builder) writeSortedMap(name string, ss *stringSet, index func(s string) uint16) { + ss.sortFunc(func(a, b string) bool { + return index(a) < index(b) + }) + m := []fromTo{} + for _, s := range ss.s { + m = append(m, fromTo{index(s), index(ss.update[s])}) + } + b.writeSlice(name, m) +} + +const base = 'z' - 'a' + 1 + +func strToInt(s string) uint { + v := uint(0) + for i := 0; i < len(s); i++ { + v *= base + v += uint(s[i] - 'a') + } + return v +} + +// converts the given integer to the original ASCII string passed to strToInt. +// len(s) must match the number of characters obtained. +func intToStr(v uint, s []byte) { + for i := len(s) - 1; i >= 0; i-- { + s[i] = byte(v%base) + 'a' + v /= base + } +} + +func (b *builder) writeBitVector(name string, ss []string) { + vec := make([]uint8, int(math.Ceil(math.Pow(base, float64(len(ss[0])))/8))) + for _, s := range ss { + v := strToInt(s) + vec[v/8] |= 1 << (v % 8) + } + b.writeSlice(name, vec) +} + +// TODO: convert this type into a list or two-stage trie. +func (b *builder) writeMapFunc(name string, m map[string]string, f func(string) uint16) { + b.comment(name) + v := reflect.ValueOf(m) + sz := v.Len() * (2 + int(v.Type().Key().Size())) + for _, k := range m { + sz += len(k) + } + b.addSize(sz) + keys := []string{} + b.pf(`var %s = map[string]uint16{`, name) + for k := range m { + keys = append(keys, k) + } + sort.Strings(keys) + for _, k := range keys { + b.pf("\t%q: %v,", k, f(m[k])) + } + b.p("}") +} + +func (b *builder) writeMap(name string, m interface{}) { + b.comment(name) + v := reflect.ValueOf(m) + sz := v.Len() * (2 + int(v.Type().Key().Size()) + int(v.Type().Elem().Size())) + b.addSize(sz) + f := strings.FieldsFunc(fmt.Sprintf("%#v", m), func(r rune) bool { + return strings.IndexRune("{}, ", r) != -1 + }) + sort.Strings(f[1:]) + b.pf(`var %s = %s{`, name, f[0]) + for _, kv := range f[1:] { + b.pf("\t%s,", kv) + } + b.p("}") +} + +func (b *builder) langIndex(s string) uint16 { + if s == "und" { + return 0 + } + if i, ok := b.lang.find(s); ok { + return uint16(i) + } + return uint16(strToInt(s)) + uint16(len(b.lang.s)) +} + +// inc advances the string to its lexicographical successor. +func inc(s string) string { + const maxTagLength = 4 + var buf [maxTagLength]byte + intToStr(strToInt(strings.ToLower(s))+1, buf[:len(s)]) + for i := 0; i < len(s); i++ { + if s[i] <= 'Z' { + buf[i] -= 'a' - 'A' + } + } + return string(buf[:len(s)]) +} + +func (b *builder) parseIndices() { + meta := b.supp.Metadata + + for k, v := range b.registry { + var ss *stringSet + switch v.typ { + case "language": + if len(k) == 2 || v.suppressScript != "" || v.scope == "special" { + b.lang.add(k) + continue + } else { + ss = &b.langNoIndex + } + case "region": + ss = &b.region + case "script": + ss = &b.script + case "variant": + ss = &b.variant + default: + continue + } + ss.add(k) + } + // Include any language for which there is data. + for _, lang := range b.data.Locales() { + if x := b.data.RawLDML(lang); false || + x.LocaleDisplayNames != nil || + x.Characters != nil || + x.Delimiters != nil || + x.Measurement != nil || + x.Dates != nil || + x.Numbers != nil || + x.Units != nil || + x.ListPatterns != nil || + x.Collations != nil || + x.Segmentations != nil || + x.Rbnf != nil || + x.Annotations != nil || + x.Metadata != nil { + + from := strings.Split(lang, "_") + if lang := from[0]; lang != "root" { + b.lang.add(lang) + } + } + } + // Include locales for plural rules, which uses a different structure. + for _, plurals := range b.data.Supplemental().Plurals { + for _, rules := range plurals.PluralRules { + for _, lang := range strings.Split(rules.Locales, " ") { + if lang = strings.Split(lang, "_")[0]; lang != "root" { + b.lang.add(lang) + } + } + } + } + // Include languages in likely subtags. + for _, m := range b.supp.LikelySubtags.LikelySubtag { + from := strings.Split(m.From, "_") + b.lang.add(from[0]) + } + // Include ISO-639 alpha-3 bibliographic entries. + for _, a := range meta.Alias.LanguageAlias { + if a.Reason == "bibliographic" { + b.langNoIndex.add(a.Type) + } + } + // Include regions in territoryAlias (not all are in the IANA registry!) + for _, reg := range b.supp.Metadata.Alias.TerritoryAlias { + if len(reg.Type) == 2 { + b.region.add(reg.Type) + } + } + + for _, s := range b.lang.s { + if len(s) == 3 { + b.langNoIndex.remove(s) + } + } + b.writeConst("numLanguages", len(b.lang.slice())+len(b.langNoIndex.slice())) + b.writeConst("numScripts", len(b.script.slice())) + b.writeConst("numRegions", len(b.region.slice())) + + // Add dummy codes at the start of each list to represent "unspecified". + b.lang.add("---") + b.script.add("----") + b.region.add("---") + + // common locales + b.locale.parse(meta.DefaultContent.Locales) +} + +func (b *builder) computeRegionGroups() { + b.groups = make(map[int]index) + + // Create group indices. + for i := 1; b.region.s[i][0] < 'A'; i++ { // Base M49 indices on regionID. + b.groups[i] = index(len(b.groups)) + } + for _, g := range b.supp.TerritoryContainment.Group { + group := b.region.index(g.Type) + if _, ok := b.groups[group]; !ok { + b.groups[group] = index(len(b.groups)) + } + } + if len(b.groups) > 32 { + log.Fatalf("only 32 groups supported, found %d", len(b.groups)) + } + b.writeConst("nRegionGroups", len(b.groups)) +} + +var langConsts = []string{ + "af", "am", "ar", "az", "bg", "bn", "ca", "cs", "da", "de", "el", "en", "es", + "et", "fa", "fi", "fil", "fr", "gu", "he", "hi", "hr", "hu", "hy", "id", "is", + "it", "ja", "ka", "kk", "km", "kn", "ko", "ky", "lo", "lt", "lv", "mk", "ml", + "mn", "mo", "mr", "ms", "mul", "my", "nb", "ne", "nl", "no", "pa", "pl", "pt", + "ro", "ru", "sh", "si", "sk", "sl", "sq", "sr", "sv", "sw", "ta", "te", "th", + "tl", "tn", "tr", "uk", "ur", "uz", "vi", "zh", "zu", + + // constants for grandfathered tags (if not already defined) + "jbo", "ami", "bnn", "hak", "tlh", "lb", "nv", "pwn", "tao", "tay", "tsu", + "nn", "sfb", "vgt", "sgg", "cmn", "nan", "hsn", +} + +// writeLanguage generates all tables needed for language canonicalization. +func (b *builder) writeLanguage() { + meta := b.supp.Metadata + + b.writeConst("nonCanonicalUnd", b.lang.index("und")) + b.writeConsts(func(s string) int { return int(b.langIndex(s)) }, langConsts...) + b.writeConst("langPrivateStart", b.langIndex("qaa")) + b.writeConst("langPrivateEnd", b.langIndex("qtz")) + + // Get language codes that need to be mapped (overlong 3-letter codes, + // deprecated 2-letter codes, legacy and grandfathered tags.) + langAliasMap := stringSet{} + aliasTypeMap := map[string]langAliasType{} + + // altLangISO3 get the alternative ISO3 names that need to be mapped. + altLangISO3 := stringSet{} + // Add dummy start to avoid the use of index 0. + altLangISO3.add("---") + altLangISO3.updateLater("---", "aa") + + lang := b.lang.clone() + for _, a := range meta.Alias.LanguageAlias { + if a.Replacement == "" { + a.Replacement = "und" + } + // TODO: support mapping to tags + repl := strings.SplitN(a.Replacement, "_", 2)[0] + if a.Reason == "overlong" { + if len(a.Replacement) == 2 && len(a.Type) == 3 { + lang.updateLater(a.Replacement, a.Type) + } + } else if len(a.Type) <= 3 { + switch a.Reason { + case "macrolanguage": + aliasTypeMap[a.Type] = langMacro + case "deprecated": + // handled elsewhere + continue + case "bibliographic", "legacy": + if a.Type == "no" { + continue + } + aliasTypeMap[a.Type] = langLegacy + default: + log.Fatalf("new %s alias: %s", a.Reason, a.Type) + } + langAliasMap.add(a.Type) + langAliasMap.updateLater(a.Type, repl) + } + } + // Manually add the mapping of "nb" (Norwegian) to its macro language. + // This can be removed if CLDR adopts this change. + langAliasMap.add("nb") + langAliasMap.updateLater("nb", "no") + aliasTypeMap["nb"] = langMacro + + for k, v := range b.registry { + // Also add deprecated values for 3-letter ISO codes, which CLDR omits. + if v.typ == "language" && v.deprecated != "" && v.preferred != "" { + langAliasMap.add(k) + langAliasMap.updateLater(k, v.preferred) + aliasTypeMap[k] = langDeprecated + } + } + // Fix CLDR mappings. + lang.updateLater("tl", "tgl") + lang.updateLater("sh", "hbs") + lang.updateLater("mo", "mol") + lang.updateLater("no", "nor") + lang.updateLater("tw", "twi") + lang.updateLater("nb", "nob") + lang.updateLater("ak", "aka") + + // Ensure that each 2-letter code is matched with a 3-letter code. + for _, v := range lang.s[1:] { + s, ok := lang.update[v] + if !ok { + if s, ok = lang.update[langAliasMap.update[v]]; !ok { + continue + } + lang.update[v] = s + } + if v[0] != s[0] { + altLangISO3.add(s) + altLangISO3.updateLater(s, v) + } + } + + // Complete canonialized language tags. + lang.freeze() + for i, v := range lang.s { + // We can avoid these manual entries by using the IANI registry directly. + // Seems easier to update the list manually, as changes are rare. + // The panic in this loop will trigger if we miss an entry. + add := "" + if s, ok := lang.update[v]; ok { + if s[0] == v[0] { + add = s[1:] + } else { + add = string([]byte{0, byte(altLangISO3.index(s))}) + } + } else if len(v) == 3 { + add = "\x00" + } else { + log.Panicf("no data for long form of %q", v) + } + lang.s[i] += add + } + b.writeConst("lang", tag.Index(lang.join())) + + b.writeConst("langNoIndexOffset", len(b.lang.s)) + + // space of all valid 3-letter language identifiers. + b.writeBitVector("langNoIndex", b.langNoIndex.slice()) + + altLangIndex := []uint16{} + for i, s := range altLangISO3.slice() { + altLangISO3.s[i] += string([]byte{byte(len(altLangIndex))}) + if i > 0 { + idx := b.lang.index(altLangISO3.update[s]) + altLangIndex = append(altLangIndex, uint16(idx)) + } + } + b.writeConst("altLangISO3", tag.Index(altLangISO3.join())) + b.writeSlice("altLangIndex", altLangIndex) + + b.writeSortedMap("langAliasMap", &langAliasMap, b.langIndex) + types := make([]langAliasType, len(langAliasMap.s)) + for i, s := range langAliasMap.s { + types[i] = aliasTypeMap[s] + } + b.writeSlice("langAliasTypes", types) +} + +var scriptConsts = []string{ + "Latn", "Hani", "Hans", "Hant", "Qaaa", "Qaai", "Qabx", "Zinh", "Zyyy", + "Zzzz", +} + +func (b *builder) writeScript() { + b.writeConsts(b.script.index, scriptConsts...) + b.writeConst("script", tag.Index(b.script.join())) + + supp := make([]uint8, len(b.lang.slice())) + for i, v := range b.lang.slice()[1:] { + if sc := b.registry[v].suppressScript; sc != "" { + supp[i+1] = uint8(b.script.index(sc)) + } + } + b.writeSlice("suppressScript", supp) + + // There is only one deprecated script in CLDR. This value is hard-coded. + // We check here if the code must be updated. + for _, a := range b.supp.Metadata.Alias.ScriptAlias { + if a.Type != "Qaai" { + log.Panicf("unexpected deprecated stript %q", a.Type) + } + } +} + +func parseM49(s string) int16 { + if len(s) == 0 { + return 0 + } + v, err := strconv.ParseUint(s, 10, 10) + failOnError(err) + return int16(v) +} + +var regionConsts = []string{ + "001", "419", "BR", "CA", "ES", "GB", "MD", "PT", "UK", "US", + "ZZ", "XA", "XC", "XK", // Unofficial tag for Kosovo. +} + +func (b *builder) writeRegion() { + b.writeConsts(b.region.index, regionConsts...) + + isoOffset := b.region.index("AA") + m49map := make([]int16, len(b.region.slice())) + fromM49map := make(map[int16]int) + altRegionISO3 := "" + altRegionIDs := []uint16{} + + b.writeConst("isoRegionOffset", isoOffset) + + // 2-letter region lookup and mapping to numeric codes. + regionISO := b.region.clone() + regionISO.s = regionISO.s[isoOffset:] + regionISO.sorted = false + + regionTypes := make([]byte, len(b.region.s)) + + // Is the region valid BCP 47? + for s, e := range b.registry { + if len(s) == 2 && s == strings.ToUpper(s) { + i := b.region.index(s) + for _, d := range e.description { + if strings.Contains(d, "Private use") { + regionTypes[i] = iso3166UserAssgined + } + } + regionTypes[i] |= bcp47Region + } + } + + // Is the region a valid ccTLD? + r := gen.OpenIANAFile("domains/root/db") + defer r.Close() + + buf, err := ioutil.ReadAll(r) + failOnError(err) + re := regexp.MustCompile(`"/domains/root/db/([a-z]{2}).html"`) + for _, m := range re.FindAllSubmatch(buf, -1) { + i := b.region.index(strings.ToUpper(string(m[1]))) + regionTypes[i] |= ccTLD + } + + b.writeSlice("regionTypes", regionTypes) + + iso3Set := make(map[string]int) + update := func(iso2, iso3 string) { + i := regionISO.index(iso2) + if j, ok := iso3Set[iso3]; !ok && iso3[0] == iso2[0] { + regionISO.s[i] += iso3[1:] + iso3Set[iso3] = -1 + } else { + if ok && j >= 0 { + regionISO.s[i] += string([]byte{0, byte(j)}) + } else { + iso3Set[iso3] = len(altRegionISO3) + regionISO.s[i] += string([]byte{0, byte(len(altRegionISO3))}) + altRegionISO3 += iso3 + altRegionIDs = append(altRegionIDs, uint16(isoOffset+i)) + } + } + } + for _, tc := range b.supp.CodeMappings.TerritoryCodes { + i := regionISO.index(tc.Type) + isoOffset + if d := m49map[i]; d != 0 { + log.Panicf("%s found as a duplicate UN.M49 code of %03d", tc.Numeric, d) + } + m49 := parseM49(tc.Numeric) + m49map[i] = m49 + if r := fromM49map[m49]; r == 0 { + fromM49map[m49] = i + } else if r != i { + dep := b.registry[regionISO.s[r-isoOffset]].deprecated + if t := b.registry[tc.Type]; t != nil && dep != "" && (t.deprecated == "" || t.deprecated > dep) { + fromM49map[m49] = i + } + } + } + for _, ta := range b.supp.Metadata.Alias.TerritoryAlias { + if len(ta.Type) == 3 && ta.Type[0] <= '9' && len(ta.Replacement) == 2 { + from := parseM49(ta.Type) + if r := fromM49map[from]; r == 0 { + fromM49map[from] = regionISO.index(ta.Replacement) + isoOffset + } + } + } + for _, tc := range b.supp.CodeMappings.TerritoryCodes { + if len(tc.Alpha3) == 3 { + update(tc.Type, tc.Alpha3) + } + } + // This entries are not included in territoryCodes. Mostly 3-letter variants + // of deleted codes and an entry for QU. + for _, m := range []struct{ iso2, iso3 string }{ + {"CT", "CTE"}, + {"DY", "DHY"}, + {"HV", "HVO"}, + {"JT", "JTN"}, + {"MI", "MID"}, + {"NH", "NHB"}, + {"NQ", "ATN"}, + {"PC", "PCI"}, + {"PU", "PUS"}, + {"PZ", "PCZ"}, + {"RH", "RHO"}, + {"VD", "VDR"}, + {"WK", "WAK"}, + // These three-letter codes are used for others as well. + {"FQ", "ATF"}, + } { + update(m.iso2, m.iso3) + } + for i, s := range regionISO.s { + if len(s) != 4 { + regionISO.s[i] = s + " " + } + } + b.writeConst("regionISO", tag.Index(regionISO.join())) + b.writeConst("altRegionISO3", altRegionISO3) + b.writeSlice("altRegionIDs", altRegionIDs) + + // Create list of deprecated regions. + // TODO: consider inserting SF -> FI. Not included by CLDR, but is the only + // Transitionally-reserved mapping not included. + regionOldMap := stringSet{} + // Include regions in territoryAlias (not all are in the IANA registry!) + for _, reg := range b.supp.Metadata.Alias.TerritoryAlias { + if len(reg.Type) == 2 && reg.Reason == "deprecated" && len(reg.Replacement) == 2 { + regionOldMap.add(reg.Type) + regionOldMap.updateLater(reg.Type, reg.Replacement) + i, _ := regionISO.find(reg.Type) + j, _ := regionISO.find(reg.Replacement) + if k := m49map[i+isoOffset]; k == 0 { + m49map[i+isoOffset] = m49map[j+isoOffset] + } + } + } + b.writeSortedMap("regionOldMap", ®ionOldMap, func(s string) uint16 { + return uint16(b.region.index(s)) + }) + // 3-digit region lookup, groupings. + for i := 1; i < isoOffset; i++ { + m := parseM49(b.region.s[i]) + m49map[i] = m + fromM49map[m] = i + } + b.writeSlice("m49", m49map) + + const ( + searchBits = 7 + regionBits = 9 + ) + if len(m49map) >= 1<<regionBits { + log.Fatalf("Maximum number of regions exceeded: %d > %d", len(m49map), 1<<regionBits) + } + m49Index := [9]int16{} + fromM49 := []uint16{} + m49 := []int{} + for k, _ := range fromM49map { + m49 = append(m49, int(k)) + } + sort.Ints(m49) + for _, k := range m49[1:] { + val := (k & (1<<searchBits - 1)) << regionBits + fromM49 = append(fromM49, uint16(val|fromM49map[int16(k)])) + m49Index[1:][k>>searchBits] = int16(len(fromM49)) + } + b.writeSlice("m49Index", m49Index) + b.writeSlice("fromM49", fromM49) +} + +const ( + // TODO: put these lists in regionTypes as user data? Could be used for + // various optimizations and refinements and could be exposed in the API. + iso3166Except = "AC CP DG EA EU FX IC SU TA UK" + iso3166Trans = "AN BU CS NT TP YU ZR" // SF is not in our set of Regions. + // DY and RH are actually not deleted, but indeterminately reserved. + iso3166DelCLDR = "CT DD DY FQ HV JT MI NH NQ PC PU PZ RH VD WK YD" +) + +const ( + iso3166UserAssgined = 1 << iota + ccTLD + bcp47Region +) + +func find(list []string, s string) int { + for i, t := range list { + if t == s { + return i + } + } + return -1 +} + +// writeVariants generates per-variant information and creates a map from variant +// name to index value. We assign index values such that sorting multiple +// variants by index value will result in the correct order. +// There are two types of variants: specialized and general. Specialized variants +// are only applicable to certain language or language-script pairs. Generalized +// variants apply to any language. Generalized variants always sort after +// specialized variants. We will therefore always assign a higher index value +// to a generalized variant than any other variant. Generalized variants are +// sorted alphabetically among themselves. +// Specialized variants may also sort after other specialized variants. Such +// variants will be ordered after any of the variants they may follow. +// We assume that if a variant x is followed by a variant y, then for any prefix +// p of x, p-x is a prefix of y. This allows us to order tags based on the +// maximum of the length of any of its prefixes. +// TODO: it is possible to define a set of Prefix values on variants such that +// a total order cannot be defined to the point that this algorithm breaks. +// In other words, we cannot guarantee the same order of variants for the +// future using the same algorithm or for non-compliant combinations of +// variants. For this reason, consider using simple alphabetic sorting +// of variants and ignore Prefix restrictions altogether. +func (b *builder) writeVariant() { + generalized := stringSet{} + specialized := stringSet{} + specializedExtend := stringSet{} + // Collate the variants by type and check assumptions. + for _, v := range b.variant.slice() { + e := b.registry[v] + if len(e.prefix) == 0 { + generalized.add(v) + continue + } + c := strings.Split(e.prefix[0], "-") + hasScriptOrRegion := false + if len(c) > 1 { + _, hasScriptOrRegion = b.script.find(c[1]) + if !hasScriptOrRegion { + _, hasScriptOrRegion = b.region.find(c[1]) + + } + } + if len(c) == 1 || len(c) == 2 && hasScriptOrRegion { + // Variant is preceded by a language. + specialized.add(v) + continue + } + // Variant is preceded by another variant. + specializedExtend.add(v) + prefix := c[0] + "-" + if hasScriptOrRegion { + prefix += c[1] + } + for _, p := range e.prefix { + // Verify that the prefix minus the last element is a prefix of the + // predecessor element. + i := strings.LastIndex(p, "-") + pred := b.registry[p[i+1:]] + if find(pred.prefix, p[:i]) < 0 { + log.Fatalf("prefix %q for variant %q not consistent with predecessor spec", p, v) + } + // The sorting used below does not work in the general case. It works + // if we assume that variants that may be followed by others only have + // prefixes of the same length. Verify this. + count := strings.Count(p[:i], "-") + for _, q := range pred.prefix { + if c := strings.Count(q, "-"); c != count { + log.Fatalf("variant %q preceding %q has a prefix %q of size %d; want %d", p[i+1:], v, q, c, count) + } + } + if !strings.HasPrefix(p, prefix) { + log.Fatalf("prefix %q of variant %q should start with %q", p, v, prefix) + } + } + } + + // Sort extended variants. + a := specializedExtend.s + less := func(v, w string) bool { + // Sort by the maximum number of elements. + maxCount := func(s string) (max int) { + for _, p := range b.registry[s].prefix { + if c := strings.Count(p, "-"); c > max { + max = c + } + } + return + } + if cv, cw := maxCount(v), maxCount(w); cv != cw { + return cv < cw + } + // Sort by name as tie breaker. + return v < w + } + sort.Sort(funcSorter{less, sort.StringSlice(a)}) + specializedExtend.frozen = true + + // Create index from variant name to index. + variantIndex := make(map[string]uint8) + add := func(s []string) { + for _, v := range s { + variantIndex[v] = uint8(len(variantIndex)) + } + } + add(specialized.slice()) + add(specializedExtend.s) + numSpecialized := len(variantIndex) + add(generalized.slice()) + if n := len(variantIndex); n > 255 { + log.Fatalf("maximum number of variants exceeded: was %d; want <= 255", n) + } + b.writeMap("variantIndex", variantIndex) + b.writeConst("variantNumSpecialized", numSpecialized) +} + +func (b *builder) writeLanguageInfo() { +} + +// writeLikelyData writes tables that are used both for finding parent relations and for +// language matching. Each entry contains additional bits to indicate the status of the +// data to know when it cannot be used for parent relations. +func (b *builder) writeLikelyData() { + const ( + isList = 1 << iota + scriptInFrom + regionInFrom + ) + type ( // generated types + likelyScriptRegion struct { + region uint16 + script uint8 + flags uint8 + } + likelyLangScript struct { + lang uint16 + script uint8 + flags uint8 + } + likelyLangRegion struct { + lang uint16 + region uint16 + } + // likelyTag is used for getting likely tags for group regions, where + // the likely region might be a region contained in the group. + likelyTag struct { + lang uint16 + region uint16 + script uint8 + } + ) + var ( // generated variables + likelyRegionGroup = make([]likelyTag, len(b.groups)) + likelyLang = make([]likelyScriptRegion, len(b.lang.s)) + likelyRegion = make([]likelyLangScript, len(b.region.s)) + likelyScript = make([]likelyLangRegion, len(b.script.s)) + likelyLangList = []likelyScriptRegion{} + likelyRegionList = []likelyLangScript{} + ) + type fromTo struct { + from, to []string + } + langToOther := map[int][]fromTo{} + regionToOther := map[int][]fromTo{} + for _, m := range b.supp.LikelySubtags.LikelySubtag { + from := strings.Split(m.From, "_") + to := strings.Split(m.To, "_") + if len(to) != 3 { + log.Fatalf("invalid number of subtags in %q: found %d, want 3", m.To, len(to)) + } + if len(from) > 3 { + log.Fatalf("invalid number of subtags: found %d, want 1-3", len(from)) + } + if from[0] != to[0] && from[0] != "und" { + log.Fatalf("unexpected language change in expansion: %s -> %s", from, to) + } + if len(from) == 3 { + if from[2] != to[2] { + log.Fatalf("unexpected region change in expansion: %s -> %s", from, to) + } + if from[0] != "und" { + log.Fatalf("unexpected fully specified from tag: %s -> %s", from, to) + } + } + if len(from) == 1 || from[0] != "und" { + id := 0 + if from[0] != "und" { + id = b.lang.index(from[0]) + } + langToOther[id] = append(langToOther[id], fromTo{from, to}) + } else if len(from) == 2 && len(from[1]) == 4 { + sid := b.script.index(from[1]) + likelyScript[sid].lang = uint16(b.langIndex(to[0])) + likelyScript[sid].region = uint16(b.region.index(to[2])) + } else { + r := b.region.index(from[len(from)-1]) + if id, ok := b.groups[r]; ok { + if from[0] != "und" { + log.Fatalf("region changed unexpectedly: %s -> %s", from, to) + } + likelyRegionGroup[id].lang = uint16(b.langIndex(to[0])) + likelyRegionGroup[id].script = uint8(b.script.index(to[1])) + likelyRegionGroup[id].region = uint16(b.region.index(to[2])) + } else { + regionToOther[r] = append(regionToOther[r], fromTo{from, to}) + } + } + } + b.writeType(likelyLangRegion{}) + b.writeSlice("likelyScript", likelyScript) + + for id := range b.lang.s { + list := langToOther[id] + if len(list) == 1 { + likelyLang[id].region = uint16(b.region.index(list[0].to[2])) + likelyLang[id].script = uint8(b.script.index(list[0].to[1])) + } else if len(list) > 1 { + likelyLang[id].flags = isList + likelyLang[id].region = uint16(len(likelyLangList)) + likelyLang[id].script = uint8(len(list)) + for _, x := range list { + flags := uint8(0) + if len(x.from) > 1 { + if x.from[1] == x.to[2] { + flags = regionInFrom + } else { + flags = scriptInFrom + } + } + likelyLangList = append(likelyLangList, likelyScriptRegion{ + region: uint16(b.region.index(x.to[2])), + script: uint8(b.script.index(x.to[1])), + flags: flags, + }) + } + } + } + // TODO: merge suppressScript data with this table. + b.writeType(likelyScriptRegion{}) + b.writeSlice("likelyLang", likelyLang) + b.writeSlice("likelyLangList", likelyLangList) + + for id := range b.region.s { + list := regionToOther[id] + if len(list) == 1 { + likelyRegion[id].lang = uint16(b.langIndex(list[0].to[0])) + likelyRegion[id].script = uint8(b.script.index(list[0].to[1])) + if len(list[0].from) > 2 { + likelyRegion[id].flags = scriptInFrom + } + } else if len(list) > 1 { + likelyRegion[id].flags = isList + likelyRegion[id].lang = uint16(len(likelyRegionList)) + likelyRegion[id].script = uint8(len(list)) + for i, x := range list { + if len(x.from) == 2 && i != 0 || i > 0 && len(x.from) != 3 { + log.Fatalf("unspecified script must be first in list: %v at %d", x.from, i) + } + x := likelyLangScript{ + lang: uint16(b.langIndex(x.to[0])), + script: uint8(b.script.index(x.to[1])), + } + if len(list[0].from) > 2 { + x.flags = scriptInFrom + } + likelyRegionList = append(likelyRegionList, x) + } + } + } + b.writeType(likelyLangScript{}) + b.writeSlice("likelyRegion", likelyRegion) + b.writeSlice("likelyRegionList", likelyRegionList) + + b.writeType(likelyTag{}) + b.writeSlice("likelyRegionGroup", likelyRegionGroup) +} + +type mutualIntelligibility struct { + want, have uint16 + conf uint8 + oneway bool +} + +type scriptIntelligibility struct { + lang uint16 // langID or 0 if * + want, have uint8 + conf uint8 +} + +type sortByConf []mutualIntelligibility + +func (l sortByConf) Less(a, b int) bool { + return l[a].conf > l[b].conf +} + +func (l sortByConf) Swap(a, b int) { + l[a], l[b] = l[b], l[a] +} + +func (l sortByConf) Len() int { + return len(l) +} + +// toConf converts a percentage value [0, 100] to a confidence class. +func toConf(pct uint8) uint8 { + switch { + case pct == 100: + return 3 // Exact + case pct >= 90: + return 2 // High + case pct > 50: + return 1 // Low + default: + return 0 // No + } +} + +// writeMatchData writes tables with languages and scripts for which there is +// mutual intelligibility. The data is based on CLDR's languageMatching data. +// Note that we use a different algorithm than the one defined by CLDR and that +// we slightly modify the data. For example, we convert scores to confidence levels. +// We also drop all region-related data as we use a different algorithm to +// determine region equivalence. +func (b *builder) writeMatchData() { + b.writeType(mutualIntelligibility{}) + b.writeType(scriptIntelligibility{}) + lm := b.supp.LanguageMatching.LanguageMatches + cldr.MakeSlice(&lm).SelectAnyOf("type", "written") + + matchLang := []mutualIntelligibility{} + matchScript := []scriptIntelligibility{} + // Convert the languageMatch entries in lists keyed by desired language. + for _, m := range lm[0].LanguageMatch { + // Different versions of CLDR use different separators. + desired := strings.Replace(m.Desired, "-", "_", -1) + supported := strings.Replace(m.Supported, "-", "_", -1) + d := strings.Split(desired, "_") + s := strings.Split(supported, "_") + if len(d) != len(s) || len(d) > 2 { + // Skip all entries with regions and work around CLDR bug. + continue + } + pct, _ := strconv.ParseInt(m.Percent, 10, 8) + if len(d) == 2 && d[0] == s[0] && len(d[1]) == 4 { + // language-script pair. + lang := uint16(0) + if d[0] != "*" { + lang = uint16(b.langIndex(d[0])) + } + matchScript = append(matchScript, scriptIntelligibility{ + lang: lang, + want: uint8(b.script.index(d[1])), + have: uint8(b.script.index(s[1])), + conf: toConf(uint8(pct)), + }) + if m.Oneway != "true" { + matchScript = append(matchScript, scriptIntelligibility{ + lang: lang, + want: uint8(b.script.index(s[1])), + have: uint8(b.script.index(d[1])), + conf: toConf(uint8(pct)), + }) + } + } else if len(d) == 1 && d[0] != "*" { + if pct == 100 { + // nb == no is already handled by macro mapping. Check there + // really is only this case. + if d[0] != "no" || s[0] != "nb" { + log.Fatalf("unhandled equivalence %s == %s", s[0], d[0]) + } + continue + } + matchLang = append(matchLang, mutualIntelligibility{ + want: uint16(b.langIndex(d[0])), + have: uint16(b.langIndex(s[0])), + conf: uint8(pct), + oneway: m.Oneway == "true", + }) + } else { + // TODO: Handle other mappings. + a := []string{"*;*", "*_*;*_*", "es_MX;es_419"} + s := strings.Join([]string{desired, supported}, ";") + if i := sort.SearchStrings(a, s); i == len(a) || a[i] != s { + log.Printf("%q not handled", s) + } + } + } + sort.Stable(sortByConf(matchLang)) + // collapse percentage into confidence classes + for i, m := range matchLang { + matchLang[i].conf = toConf(m.conf) + } + b.writeSlice("matchLang", matchLang) + b.writeSlice("matchScript", matchScript) +} + +func (b *builder) writeRegionInclusionData() { + var ( + // mm holds for each group the set of groups with a distance of 1. + mm = make(map[int][]index) + + // containment holds for each group the transitive closure of + // containment of other groups. + containment = make(map[index][]index) + ) + for _, g := range b.supp.TerritoryContainment.Group { + group := b.region.index(g.Type) + groupIdx := b.groups[group] + for _, mem := range strings.Split(g.Contains, " ") { + r := b.region.index(mem) + mm[r] = append(mm[r], groupIdx) + if g, ok := b.groups[r]; ok { + mm[group] = append(mm[group], g) + containment[groupIdx] = append(containment[groupIdx], g) + } + } + } + + regionContainment := make([]uint32, len(b.groups)) + for _, g := range b.groups { + l := containment[g] + + // Compute the transitive closure of containment. + for i := 0; i < len(l); i++ { + l = append(l, containment[l[i]]...) + } + + // Compute the bitmask. + regionContainment[g] = 1 << g + for _, v := range l { + regionContainment[g] |= 1 << v + } + // log.Printf("%d: %X", g, regionContainment[g]) + } + b.writeSlice("regionContainment", regionContainment) + + regionInclusion := make([]uint8, len(b.region.s)) + bvs := make(map[uint32]index) + // Make the first bitvector positions correspond with the groups. + for r, i := range b.groups { + bv := uint32(1 << i) + for _, g := range mm[r] { + bv |= 1 << g + } + bvs[bv] = i + regionInclusion[r] = uint8(bvs[bv]) + } + for r := 1; r < len(b.region.s); r++ { + if _, ok := b.groups[r]; !ok { + bv := uint32(0) + for _, g := range mm[r] { + bv |= 1 << g + } + if bv == 0 { + // Pick the world for unspecified regions. + bv = 1 << b.groups[b.region.index("001")] + } + if _, ok := bvs[bv]; !ok { + bvs[bv] = index(len(bvs)) + } + regionInclusion[r] = uint8(bvs[bv]) + } + } + b.writeSlice("regionInclusion", regionInclusion) + regionInclusionBits := make([]uint32, len(bvs)) + for k, v := range bvs { + regionInclusionBits[v] = uint32(k) + } + // Add bit vectors for increasingly large distances until a fixed point is reached. + regionInclusionNext := []uint8{} + for i := 0; i < len(regionInclusionBits); i++ { + bits := regionInclusionBits[i] + next := bits + for i := uint(0); i < uint(len(b.groups)); i++ { + if bits&(1<<i) != 0 { + next |= regionInclusionBits[i] + } + } + if _, ok := bvs[next]; !ok { + bvs[next] = index(len(bvs)) + regionInclusionBits = append(regionInclusionBits, next) + } + regionInclusionNext = append(regionInclusionNext, uint8(bvs[next])) + } + b.writeSlice("regionInclusionBits", regionInclusionBits) + b.writeSlice("regionInclusionNext", regionInclusionNext) +} + +type parentRel struct { + lang uint16 + script uint8 + maxScript uint8 + toRegion uint16 + fromRegion []uint16 +} + +func (b *builder) writeParents() { + b.writeType(parentRel{}) + + parents := []parentRel{} + + // Construct parent overrides. + n := 0 + for _, p := range b.data.Supplemental().ParentLocales.ParentLocale { + // Skipping non-standard scripts to root is implemented using addTags. + if p.Parent == "root" { + continue + } + + sub := strings.Split(p.Parent, "_") + parent := parentRel{lang: b.langIndex(sub[0])} + if len(sub) == 2 { + // TODO: check that all undefined scripts are indeed Latn in these + // cases. + parent.maxScript = uint8(b.script.index("Latn")) + parent.toRegion = uint16(b.region.index(sub[1])) + } else { + parent.script = uint8(b.script.index(sub[1])) + parent.maxScript = parent.script + parent.toRegion = uint16(b.region.index(sub[2])) + } + for _, c := range strings.Split(p.Locales, " ") { + region := b.region.index(c[strings.LastIndex(c, "_")+1:]) + parent.fromRegion = append(parent.fromRegion, uint16(region)) + } + parents = append(parents, parent) + n += len(parent.fromRegion) + } + b.writeSliceAddSize("parents", n*2, parents) +} + +func main() { + gen.Init() + + gen.Repackage("gen_common.go", "common.go", "language") + + w := gen.NewCodeWriter() + defer w.WriteGoFile("tables.go", "language") + + fmt.Fprintln(w, `import "golang.org/x/text/internal/tag"`) + + b := newBuilder(w) + gen.WriteCLDRVersion(w) + + b.parseIndices() + b.writeType(fromTo{}) + b.writeLanguage() + b.writeScript() + b.writeRegion() + b.writeVariant() + // TODO: b.writeLocale() + b.computeRegionGroups() + b.writeLikelyData() + b.writeMatchData() + b.writeRegionInclusionData() + b.writeParents() +} diff --git a/vendor/golang.org/x/text/language/match.go b/vendor/golang.org/x/text/language/match.go new file mode 100644 index 0000000000..eec72bcc1f --- /dev/null +++ b/vendor/golang.org/x/text/language/match.go @@ -0,0 +1,840 @@ +// Copyright 2013 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 language + +import "errors" + +// Matcher is the interface that wraps the Match method. +// +// Match returns the best match for any of the given tags, along with +// a unique index associated with the returned tag and a confidence +// score. +type Matcher interface { + Match(t ...Tag) (tag Tag, index int, c Confidence) +} + +// Comprehends reports the confidence score for a speaker of a given language +// to being able to comprehend the written form of an alternative language. +func Comprehends(speaker, alternative Tag) Confidence { + _, _, c := NewMatcher([]Tag{alternative}).Match(speaker) + return c +} + +// NewMatcher returns a Matcher that matches an ordered list of preferred tags +// against a list of supported tags based on written intelligibility, closeness +// of dialect, equivalence of subtags and various other rules. It is initialized +// with the list of supported tags. The first element is used as the default +// value in case no match is found. +// +// Its Match method matches the first of the given Tags to reach a certain +// confidence threshold. The tags passed to Match should therefore be specified +// in order of preference. Extensions are ignored for matching. +// +// The index returned by the Match method corresponds to the index of the +// matched tag in t, but is augmented with the Unicode extension ('u')of the +// corresponding preferred tag. This allows user locale options to be passed +// transparently. +func NewMatcher(t []Tag) Matcher { + return newMatcher(t) +} + +func (m *matcher) Match(want ...Tag) (t Tag, index int, c Confidence) { + match, w, c := m.getBest(want...) + if match == nil { + t = m.default_.tag + } else { + t, index = match.tag, match.index + } + // Copy options from the user-provided tag into the result tag. This is hard + // to do after the fact, so we do it here. + // TODO: consider also adding in variants that are compatible with the + // matched language. + // TODO: Add back region if it is non-ambiguous? Or create another tag to + // preserve the region? + if u, ok := w.Extension('u'); ok { + t, _ = Raw.Compose(t, u) + } + return t, index, c +} + +type scriptRegionFlags uint8 + +const ( + isList = 1 << iota + scriptInFrom + regionInFrom +) + +func (t *Tag) setUndefinedLang(id langID) { + if t.lang == 0 { + t.lang = id + } +} + +func (t *Tag) setUndefinedScript(id scriptID) { + if t.script == 0 { + t.script = id + } +} + +func (t *Tag) setUndefinedRegion(id regionID) { + if t.region == 0 || t.region.contains(id) { + t.region = id + } +} + +// ErrMissingLikelyTagsData indicates no information was available +// to compute likely values of missing tags. +var ErrMissingLikelyTagsData = errors.New("missing likely tags data") + +// addLikelySubtags sets subtags to their most likely value, given the locale. +// In most cases this means setting fields for unknown values, but in some +// cases it may alter a value. It returns a ErrMissingLikelyTagsData error +// if the given locale cannot be expanded. +func (t Tag) addLikelySubtags() (Tag, error) { + id, err := addTags(t) + if err != nil { + return t, err + } else if id.equalTags(t) { + return t, nil + } + id.remakeString() + return id, nil +} + +// specializeRegion attempts to specialize a group region. +func specializeRegion(t *Tag) bool { + if i := regionInclusion[t.region]; i < nRegionGroups { + x := likelyRegionGroup[i] + if langID(x.lang) == t.lang && scriptID(x.script) == t.script { + t.region = regionID(x.region) + } + return true + } + return false +} + +func addTags(t Tag) (Tag, error) { + // We leave private use identifiers alone. + if t.private() { + return t, nil + } + if t.script != 0 && t.region != 0 { + if t.lang != 0 { + // already fully specified + specializeRegion(&t) + return t, nil + } + // Search matches for und-script-region. Note that for these cases + // region will never be a group so there is no need to check for this. + list := likelyRegion[t.region : t.region+1] + if x := list[0]; x.flags&isList != 0 { + list = likelyRegionList[x.lang : x.lang+uint16(x.script)] + } + for _, x := range list { + // Deviating from the spec. See match_test.go for details. + if scriptID(x.script) == t.script { + t.setUndefinedLang(langID(x.lang)) + return t, nil + } + } + } + if t.lang != 0 { + // Search matches for lang-script and lang-region, where lang != und. + if t.lang < langNoIndexOffset { + x := likelyLang[t.lang] + if x.flags&isList != 0 { + list := likelyLangList[x.region : x.region+uint16(x.script)] + if t.script != 0 { + for _, x := range list { + if scriptID(x.script) == t.script && x.flags&scriptInFrom != 0 { + t.setUndefinedRegion(regionID(x.region)) + return t, nil + } + } + } else if t.region != 0 { + count := 0 + goodScript := true + tt := t + for _, x := range list { + // We visit all entries for which the script was not + // defined, including the ones where the region was not + // defined. This allows for proper disambiguation within + // regions. + if x.flags&scriptInFrom == 0 && t.region.contains(regionID(x.region)) { + tt.region = regionID(x.region) + tt.setUndefinedScript(scriptID(x.script)) + goodScript = goodScript && tt.script == scriptID(x.script) + count++ + } + } + if count == 1 { + return tt, nil + } + // Even if we fail to find a unique Region, we might have + // an unambiguous script. + if goodScript { + t.script = tt.script + } + } + } + } + } else { + // Search matches for und-script. + if t.script != 0 { + x := likelyScript[t.script] + if x.region != 0 { + t.setUndefinedRegion(regionID(x.region)) + t.setUndefinedLang(langID(x.lang)) + return t, nil + } + } + // Search matches for und-region. If und-script-region exists, it would + // have been found earlier. + if t.region != 0 { + if i := regionInclusion[t.region]; i < nRegionGroups { + x := likelyRegionGroup[i] + if x.region != 0 { + t.setUndefinedLang(langID(x.lang)) + t.setUndefinedScript(scriptID(x.script)) + t.region = regionID(x.region) + } + } else { + x := likelyRegion[t.region] + if x.flags&isList != 0 { + x = likelyRegionList[x.lang] + } + if x.script != 0 && x.flags != scriptInFrom { + t.setUndefinedLang(langID(x.lang)) + t.setUndefinedScript(scriptID(x.script)) + return t, nil + } + } + } + } + + // Search matches for lang. + if t.lang < langNoIndexOffset { + x := likelyLang[t.lang] + if x.flags&isList != 0 { + x = likelyLangList[x.region] + } + if x.region != 0 { + t.setUndefinedScript(scriptID(x.script)) + t.setUndefinedRegion(regionID(x.region)) + } + specializeRegion(&t) + if t.lang == 0 { + t.lang = _en // default language + } + return t, nil + } + return t, ErrMissingLikelyTagsData +} + +func (t *Tag) setTagsFrom(id Tag) { + t.lang = id.lang + t.script = id.script + t.region = id.region +} + +// minimize removes the region or script subtags from t such that +// t.addLikelySubtags() == t.minimize().addLikelySubtags(). +func (t Tag) minimize() (Tag, error) { + t, err := minimizeTags(t) + if err != nil { + return t, err + } + t.remakeString() + return t, nil +} + +// minimizeTags mimics the behavior of the ICU 51 C implementation. +func minimizeTags(t Tag) (Tag, error) { + if t.equalTags(und) { + return t, nil + } + max, err := addTags(t) + if err != nil { + return t, err + } + for _, id := range [...]Tag{ + {lang: t.lang}, + {lang: t.lang, region: t.region}, + {lang: t.lang, script: t.script}, + } { + if x, err := addTags(id); err == nil && max.equalTags(x) { + t.setTagsFrom(id) + break + } + } + return t, nil +} + +// Tag Matching +// CLDR defines an algorithm for finding the best match between two sets of language +// tags. The basic algorithm defines how to score a possible match and then find +// the match with the best score +// (see http://www.unicode.org/reports/tr35/#LanguageMatching). +// Using scoring has several disadvantages. The scoring obfuscates the importance of +// the various factors considered, making the algorithm harder to understand. Using +// scoring also requires the full score to be computed for each pair of tags. +// +// We will use a different algorithm which aims to have the following properties: +// - clarity on the precedence of the various selection factors, and +// - improved performance by allowing early termination of a comparison. +// +// Matching algorithm (overview) +// Input: +// - supported: a set of supported tags +// - default: the default tag to return in case there is no match +// - desired: list of desired tags, ordered by preference, starting with +// the most-preferred. +// +// Algorithm: +// 1) Set the best match to the lowest confidence level +// 2) For each tag in "desired": +// a) For each tag in "supported": +// 1) compute the match between the two tags. +// 2) if the match is better than the previous best match, replace it +// with the new match. (see next section) +// b) if the current best match is above a certain threshold, return this +// match without proceeding to the next tag in "desired". [See Note 1] +// 3) If the best match so far is below a certain threshold, return "default". +// +// Ranking: +// We use two phases to determine whether one pair of tags are a better match +// than another pair of tags. First, we determine a rough confidence level. If the +// levels are different, the one with the highest confidence wins. +// Second, if the rough confidence levels are identical, we use a set of tie-breaker +// rules. +// +// The confidence level of matching a pair of tags is determined by finding the +// lowest confidence level of any matches of the corresponding subtags (the +// result is deemed as good as its weakest link). +// We define the following levels: +// Exact - An exact match of a subtag, before adding likely subtags. +// MaxExact - An exact match of a subtag, after adding likely subtags. +// [See Note 2]. +// High - High level of mutual intelligibility between different subtag +// variants. +// Low - Low level of mutual intelligibility between different subtag +// variants. +// No - No mutual intelligibility. +// +// The following levels can occur for each type of subtag: +// Base: Exact, MaxExact, High, Low, No +// Script: Exact, MaxExact [see Note 3], Low, No +// Region: Exact, MaxExact, High +// Variant: Exact, High +// Private: Exact, No +// +// Any result with a confidence level of Low or higher is deemed a possible match. +// Once a desired tag matches any of the supported tags with a level of MaxExact +// or higher, the next desired tag is not considered (see Step 2.b). +// Note that CLDR provides languageMatching data that defines close equivalence +// classes for base languages, scripts and regions. +// +// Tie-breaking +// If we get the same confidence level for two matches, we apply a sequence of +// tie-breaking rules. The first that succeeds defines the result. The rules are +// applied in the following order. +// 1) Original language was defined and was identical. +// 2) Original region was defined and was identical. +// 3) Distance between two maximized regions was the smallest. +// 4) Original script was defined and was identical. +// 5) Distance from want tag to have tag using the parent relation [see Note 5.] +// If there is still no winner after these rules are applied, the first match +// found wins. +// +// Notes: +// [1] Note that even if we may not have a perfect match, if a match is above a +// certain threshold, it is considered a better match than any other match +// to a tag later in the list of preferred language tags. +// [2] In practice, as matching of Exact is done in a separate phase from +// matching the other levels, we reuse the Exact level to mean MaxExact in +// the second phase. As a consequence, we only need the levels defined by +// the Confidence type. The MaxExact confidence level is mapped to High in +// the public API. +// [3] We do not differentiate between maximized script values that were derived +// from suppressScript versus most likely tag data. We determined that in +// ranking the two, one ranks just after the other. Moreover, the two cannot +// occur concurrently. As a consequence, they are identical for practical +// purposes. +// [4] In case of deprecated, macro-equivalents and legacy mappings, we assign +// the MaxExact level to allow iw vs he to still be a closer match than +// en-AU vs en-US, for example. +// [5] In CLDR a locale inherits fields that are unspecified for this locale +// from its parent. Therefore, if a locale is a parent of another locale, +// it is a strong measure for closeness, especially when no other tie +// breaker rule applies. One could also argue it is inconsistent, for +// example, when pt-AO matches pt (which CLDR equates with pt-BR), even +// though its parent is pt-PT according to the inheritance rules. +// +// Implementation Details: +// There are several performance considerations worth pointing out. Most notably, +// we preprocess as much as possible (within reason) at the time of creation of a +// matcher. This includes: +// - creating a per-language map, which includes data for the raw base language +// and its canonicalized variant (if applicable), +// - expanding entries for the equivalence classes defined in CLDR's +// languageMatch data. +// The per-language map ensures that typically only a very small number of tags +// need to be considered. The pre-expansion of canonicalized subtags and +// equivalence classes reduces the amount of map lookups that need to be done at +// runtime. + +// matcher keeps a set of supported language tags, indexed by language. +type matcher struct { + default_ *haveTag + index map[langID]*matchHeader + passSettings bool +} + +// matchHeader has the lists of tags for exact matches and matches based on +// maximized and canonicalized tags for a given language. +type matchHeader struct { + exact []haveTag + max []haveTag +} + +// haveTag holds a supported Tag and its maximized script and region. The maximized +// or canonicalized language is not stored as it is not needed during matching. +type haveTag struct { + tag Tag + + // index of this tag in the original list of supported tags. + index int + + // conf is the maximum confidence that can result from matching this haveTag. + // When conf < Exact this means it was inserted after applying a CLDR equivalence rule. + conf Confidence + + // Maximized region and script. + maxRegion regionID + maxScript scriptID + + // altScript may be checked as an alternative match to maxScript. If altScript + // matches, the confidence level for this match is Low. Theoretically there + // could be multiple alternative scripts. This does not occur in practice. + altScript scriptID + + // nextMax is the index of the next haveTag with the same maximized tags. + nextMax uint16 +} + +func makeHaveTag(tag Tag, index int) (haveTag, langID) { + max := tag + if tag.lang != 0 { + max, _ = max.canonicalize(All) + max, _ = addTags(max) + max.remakeString() + } + return haveTag{tag, index, Exact, max.region, max.script, altScript(max.lang, max.script), 0}, max.lang +} + +// altScript returns an alternative script that may match the given script with +// a low confidence. At the moment, the langMatch data allows for at most one +// script to map to another and we rely on this to keep the code simple. +func altScript(l langID, s scriptID) scriptID { + for _, alt := range matchScript { + if (alt.lang == 0 || langID(alt.lang) == l) && scriptID(alt.have) == s { + return scriptID(alt.want) + } + } + return 0 +} + +// addIfNew adds a haveTag to the list of tags only if it is a unique tag. +// Tags that have the same maximized values are linked by index. +func (h *matchHeader) addIfNew(n haveTag, exact bool) { + // Don't add new exact matches. + for _, v := range h.exact { + if v.tag.equalsRest(n.tag) { + return + } + } + if exact { + h.exact = append(h.exact, n) + } + // Allow duplicate maximized tags, but create a linked list to allow quickly + // comparing the equivalents and bail out. + for i, v := range h.max { + if v.maxScript == n.maxScript && + v.maxRegion == n.maxRegion && + v.tag.variantOrPrivateTagStr() == n.tag.variantOrPrivateTagStr() { + for h.max[i].nextMax != 0 { + i = int(h.max[i].nextMax) + } + h.max[i].nextMax = uint16(len(h.max)) + break + } + } + h.max = append(h.max, n) +} + +// header returns the matchHeader for the given language. It creates one if +// it doesn't already exist. +func (m *matcher) header(l langID) *matchHeader { + if h := m.index[l]; h != nil { + return h + } + h := &matchHeader{} + m.index[l] = h + return h +} + +// newMatcher builds an index for the given supported tags and returns it as +// a matcher. It also expands the index by considering various equivalence classes +// for a given tag. +func newMatcher(supported []Tag) *matcher { + m := &matcher{ + index: make(map[langID]*matchHeader), + } + if len(supported) == 0 { + m.default_ = &haveTag{} + return m + } + // Add supported languages to the index. Add exact matches first to give + // them precedence. + for i, tag := range supported { + pair, _ := makeHaveTag(tag, i) + m.header(tag.lang).addIfNew(pair, true) + } + m.default_ = &m.header(supported[0].lang).exact[0] + for i, tag := range supported { + pair, max := makeHaveTag(tag, i) + if max != tag.lang { + m.header(max).addIfNew(pair, false) + } + } + + // update is used to add indexes in the map for equivalent languages. + // If force is true, the update will also apply to derived entries. To + // avoid applying a "transitive closure", use false. + update := func(want, have uint16, conf Confidence, force bool) { + if hh := m.index[langID(have)]; hh != nil { + if !force && len(hh.exact) == 0 { + return + } + hw := m.header(langID(want)) + for _, v := range hh.max { + if conf < v.conf { + v.conf = conf + } + v.nextMax = 0 // this value needs to be recomputed + if v.altScript != 0 { + v.altScript = altScript(langID(want), v.maxScript) + } + hw.addIfNew(v, conf == Exact && len(hh.exact) > 0) + } + } + } + + // Add entries for languages with mutual intelligibility as defined by CLDR's + // languageMatch data. + for _, ml := range matchLang { + update(ml.want, ml.have, Confidence(ml.conf), false) + if !ml.oneway { + update(ml.have, ml.want, Confidence(ml.conf), false) + } + } + + // Add entries for possible canonicalizations. This is an optimization to + // ensure that only one map lookup needs to be done at runtime per desired tag. + // First we match deprecated equivalents. If they are perfect equivalents + // (their canonicalization simply substitutes a different language code, but + // nothing else), the match confidence is Exact, otherwise it is High. + for i, lm := range langAliasMap { + if lm.from == _sh { + continue + } + + // If deprecated codes match and there is no fiddling with the script or + // or region, we consider it an exact match. + conf := Exact + if langAliasTypes[i] != langMacro { + if !isExactEquivalent(langID(lm.from)) { + conf = High + } + update(lm.to, lm.from, conf, true) + } + update(lm.from, lm.to, conf, true) + } + return m +} + +// getBest gets the best matching tag in m for any of the given tags, taking into +// account the order of preference of the given tags. +func (m *matcher) getBest(want ...Tag) (got *haveTag, orig Tag, c Confidence) { + best := bestMatch{} + for _, w := range want { + var max Tag + // Check for exact match first. + h := m.index[w.lang] + if w.lang != 0 { + // Base language is defined. + if h == nil { + continue + } + for i := range h.exact { + have := &h.exact[i] + if have.tag.equalsRest(w) { + return have, w, Exact + } + } + max, _ = w.canonicalize(Legacy | Deprecated) + max, _ = addTags(max) + } else { + // Base language is not defined. + if h != nil { + for i := range h.exact { + have := &h.exact[i] + if have.tag.equalsRest(w) { + return have, w, Exact + } + } + } + if w.script == 0 && w.region == 0 { + // We skip all tags matching und for approximate matching, including + // private tags. + continue + } + max, _ = addTags(w) + if h = m.index[max.lang]; h == nil { + continue + } + } + // Check for match based on maximized tag. + for i := range h.max { + have := &h.max[i] + best.update(have, w, max.script, max.region) + if best.conf == Exact { + for have.nextMax != 0 { + have = &h.max[have.nextMax] + best.update(have, w, max.script, max.region) + } + return best.have, best.want, High + } + } + } + if best.conf <= No { + if len(want) != 0 { + return nil, want[0], No + } + return nil, Tag{}, No + } + return best.have, best.want, best.conf +} + +// bestMatch accumulates the best match so far. +type bestMatch struct { + have *haveTag + want Tag + conf Confidence + // Cached results from applying tie-breaking rules. + origLang bool + origReg bool + regDist uint8 + origScript bool + parentDist uint8 // 255 if have is not an ancestor of want tag. +} + +// update updates the existing best match if the new pair is considered to be a +// better match. +// To determine if the given pair is a better match, it first computes the rough +// confidence level. If this surpasses the current match, it will replace it and +// update the tie-breaker rule cache. If there is a tie, it proceeds with applying +// a series of tie-breaker rules. If there is no conclusive winner after applying +// the tie-breaker rules, it leaves the current match as the preferred match. +func (m *bestMatch) update(have *haveTag, tag Tag, maxScript scriptID, maxRegion regionID) { + // Bail if the maximum attainable confidence is below that of the current best match. + c := have.conf + if c < m.conf { + return + } + if have.maxScript != maxScript { + // There is usually very little comprehension between different scripts. + // In a few cases there may still be Low comprehension. This possibility is + // pre-computed and stored in have.altScript. + if Low < m.conf || have.altScript != maxScript { + return + } + c = Low + } else if have.maxRegion != maxRegion { + // There is usually a small difference between languages across regions. + // We use the region distance (below) to disambiguate between equal matches. + if High < c { + c = High + } + } + + // We store the results of the computations of the tie-breaker rules along + // with the best match. There is no need to do the checks once we determine + // we have a winner, but we do still need to do the tie-breaker computations. + // We use "beaten" to keep track if we still need to do the checks. + beaten := false // true if the new pair defeats the current one. + if c != m.conf { + if c < m.conf { + return + } + beaten = true + } + + // Tie-breaker rules: + // We prefer if the pre-maximized language was specified and identical. + origLang := have.tag.lang == tag.lang && tag.lang != 0 + if !beaten && m.origLang != origLang { + if m.origLang { + return + } + beaten = true + } + + // We prefer if the pre-maximized region was specified and identical. + origReg := have.tag.region == tag.region && tag.region != 0 + if !beaten && m.origReg != origReg { + if m.origReg { + return + } + beaten = true + } + + // Next we prefer smaller distances between regions, as defined by regionDist. + regDist := regionDist(have.maxRegion, maxRegion, tag.lang) + if !beaten && m.regDist != regDist { + if regDist > m.regDist { + return + } + beaten = true + } + + // Next we prefer if the pre-maximized script was specified and identical. + origScript := have.tag.script == tag.script && tag.script != 0 + if !beaten && m.origScript != origScript { + if m.origScript { + return + } + beaten = true + } + + // Finally we prefer tags which have a closer parent relationship. + parentDist := parentDistance(have.tag.region, tag) + if !beaten && m.parentDist != parentDist { + if parentDist > m.parentDist { + return + } + beaten = true + } + + // Update m to the newly found best match. + if beaten { + m.have = have + m.want = tag + m.conf = c + m.origLang = origLang + m.origReg = origReg + m.origScript = origScript + m.regDist = regDist + m.parentDist = parentDist + } +} + +// parentDistance returns the number of times Parent must be called before the +// regions match. It is assumed that it has already been checked that lang and +// script are identical. If haveRegion does not occur in the ancestor chain of +// tag, it returns 255. +func parentDistance(haveRegion regionID, tag Tag) uint8 { + p := tag.Parent() + d := uint8(1) + for haveRegion != p.region { + if p.region == 0 { + return 255 + } + p = p.Parent() + d++ + } + return d +} + +// regionDist wraps regionDistance with some exceptions to the algorithmic distance. +func regionDist(a, b regionID, lang langID) uint8 { + if lang == _en { + // Two variants of non-US English are close to each other, regardless of distance. + if a != _US && b != _US { + return 2 + } + } + return uint8(regionDistance(a, b)) +} + +// regionDistance computes the distance between two regions based on the +// distance in the graph of region containments as defined in CLDR. It iterates +// over increasingly inclusive sets of groups, represented as bit vectors, until +// the source bit vector has bits in common with the destination vector. +func regionDistance(a, b regionID) int { + if a == b { + return 0 + } + p, q := regionInclusion[a], regionInclusion[b] + if p < nRegionGroups { + p, q = q, p + } + set := regionInclusionBits + if q < nRegionGroups && set[p]&(1<<q) != 0 { + return 1 + } + d := 2 + for goal := set[q]; set[p]&goal == 0; p = regionInclusionNext[p] { + d++ + } + return d +} + +func (t Tag) variants() string { + if t.pVariant == 0 { + return "" + } + return t.str[t.pVariant:t.pExt] +} + +// variantOrPrivateTagStr returns variants or private use tags. +func (t Tag) variantOrPrivateTagStr() string { + if t.pExt > 0 { + return t.str[t.pVariant:t.pExt] + } + return t.str[t.pVariant:] +} + +// equalsRest compares everything except the language. +func (a Tag) equalsRest(b Tag) bool { + // TODO: don't include extensions in this comparison. To do this efficiently, + // though, we should handle private tags separately. + return a.script == b.script && a.region == b.region && a.variantOrPrivateTagStr() == b.variantOrPrivateTagStr() +} + +// isExactEquivalent returns true if canonicalizing the language will not alter +// the script or region of a tag. +func isExactEquivalent(l langID) bool { + for _, o := range notEquivalent { + if o == l { + return false + } + } + return true +} + +var notEquivalent []langID + +func init() { + // Create a list of all languages for which canonicalization may alter the + // script or region. + for _, lm := range langAliasMap { + tag := Tag{lang: langID(lm.from)} + if tag, _ = tag.canonicalize(All); tag.script != 0 || tag.region != 0 { + notEquivalent = append(notEquivalent, langID(lm.from)) + } + } +} diff --git a/vendor/golang.org/x/text/language/match_test.go b/vendor/golang.org/x/text/language/match_test.go new file mode 100644 index 0000000000..57b16442d5 --- /dev/null +++ b/vendor/golang.org/x/text/language/match_test.go @@ -0,0 +1,392 @@ +// Copyright 2013 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 language + +import ( + "bytes" + "flag" + "fmt" + "strings" + "testing" +) + +var verbose = flag.Bool("verbose", false, "set to true to print the internal tables of matchers") + +func TestAddLikelySubtags(t *testing.T) { + tests := []struct{ in, out string }{ + {"aa", "aa-Latn-ET"}, + {"aa-Latn", "aa-Latn-ET"}, + {"aa-Arab", "aa-Arab-ET"}, + {"aa-Arab-ER", "aa-Arab-ER"}, + {"kk", "kk-Cyrl-KZ"}, + {"kk-CN", "kk-Arab-CN"}, + {"cmn", "cmn"}, + {"zh-AU", "zh-Hant-AU"}, + {"zh-VN", "zh-Hant-VN"}, + {"zh-SG", "zh-Hans-SG"}, + {"zh-Hant", "zh-Hant-TW"}, + {"zh-Hani", "zh-Hani-CN"}, + {"und-Hani", "zh-Hani-CN"}, + {"und", "en-Latn-US"}, + {"und-GB", "en-Latn-GB"}, + {"und-CW", "pap-Latn-CW"}, + {"und-YT", "fr-Latn-YT"}, + {"und-Arab", "ar-Arab-EG"}, + {"und-AM", "hy-Armn-AM"}, + {"und-002", "en-Latn-NG"}, + {"und-Latn-002", "en-Latn-NG"}, + {"en-Latn-002", "en-Latn-NG"}, + {"en-002", "en-Latn-NG"}, + {"en-001", "en-Latn-US"}, + {"und-003", "en-Latn-US"}, + {"und-GB", "en-Latn-GB"}, + {"Latn-001", "en-Latn-US"}, + {"en-001", "en-Latn-US"}, + {"es-419", "es-Latn-419"}, + {"he-145", "he-Hebr-IL"}, + {"ky-145", "ky-Latn-TR"}, + {"kk", "kk-Cyrl-KZ"}, + // Don't specialize duplicate and ambiguous matches. + {"kk-034", "kk-Arab-034"}, // Matches IR and AF. Both are Arab. + {"ku-145", "ku-Latn-TR"}, // Matches IQ, TR, and LB, but kk -> TR. + {"und-Arab-CC", "ms-Arab-CC"}, + {"und-Arab-GB", "ks-Arab-GB"}, + {"und-Hans-CC", "zh-Hans-CC"}, + {"und-CC", "en-Latn-CC"}, + {"sr", "sr-Cyrl-RS"}, + {"sr-151", "sr-Latn-151"}, // Matches RO and RU. + // We would like addLikelySubtags to generate the same results if the input + // only changes by adding tags that would otherwise have been added + // by the expansion. + // In other words: + // und-AA -> xx-Scrp-AA implies und-Scrp-AA -> xx-Scrp-AA + // und-AA -> xx-Scrp-AA implies xx-AA -> xx-Scrp-AA + // und-Scrp -> xx-Scrp-AA implies und-Scrp-AA -> xx-Scrp-AA + // und-Scrp -> xx-Scrp-AA implies xx-Scrp -> xx-Scrp-AA + // xx -> xx-Scrp-AA implies xx-Scrp -> xx-Scrp-AA + // xx -> xx-Scrp-AA implies xx-AA -> xx-Scrp-AA + // + // The algorithm specified in + // http://unicode.org/reports/tr35/tr35-9.html#Supplemental_Data, + // Section C.10, does not handle the first case. For example, + // the CLDR data contains an entry und-BJ -> fr-Latn-BJ, but not + // there is no rule for und-Latn-BJ. According to spec, und-Latn-BJ + // would expand to en-Latn-BJ, violating the aforementioned principle. + // We deviate from the spec by letting und-Scrp-AA expand to xx-Scrp-AA + // if a rule of the form und-AA -> xx-Scrp-AA is defined. + // Note that as of version 23, CLDR has some explicitly specified + // entries that do not conform to these rules. The implementation + // will not correct these explicit inconsistencies. A later versions of CLDR + // is supposed to fix this. + {"und-Latn-BJ", "fr-Latn-BJ"}, + {"und-Bugi-ID", "bug-Bugi-ID"}, + // regions, scripts and languages without definitions + {"und-Arab-AA", "ar-Arab-AA"}, + {"und-Afak-RE", "fr-Afak-RE"}, + {"und-Arab-GB", "ks-Arab-GB"}, + {"abp-Arab-GB", "abp-Arab-GB"}, + // script has preference over region + {"und-Arab-NL", "ar-Arab-NL"}, + {"zza", "zza-Latn-TR"}, + // preserve variants and extensions + {"de-1901", "de-Latn-DE-1901"}, + {"de-x-abc", "de-Latn-DE-x-abc"}, + {"de-1901-x-abc", "de-Latn-DE-1901-x-abc"}, + {"x-abc", "x-abc"}, // TODO: is this the desired behavior? + } + for i, tt := range tests { + in, _ := Parse(tt.in) + out, _ := Parse(tt.out) + in, _ = in.addLikelySubtags() + if in.String() != out.String() { + t.Errorf("%d: add(%s) was %s; want %s", i, tt.in, in, tt.out) + } + } +} +func TestMinimize(t *testing.T) { + tests := []struct{ in, out string }{ + {"aa", "aa"}, + {"aa-Latn", "aa"}, + {"aa-Latn-ET", "aa"}, + {"aa-ET", "aa"}, + {"aa-Arab", "aa-Arab"}, + {"aa-Arab-ER", "aa-Arab-ER"}, + {"aa-Arab-ET", "aa-Arab"}, + {"und", "und"}, + {"und-Latn", "und"}, + {"und-Latn-US", "und"}, + {"en-Latn-US", "en"}, + {"cmn", "cmn"}, + {"cmn-Hans", "cmn-Hans"}, + {"cmn-Hant", "cmn-Hant"}, + {"zh-AU", "zh-AU"}, + {"zh-VN", "zh-VN"}, + {"zh-SG", "zh-SG"}, + {"zh-Hant", "zh-Hant"}, + {"zh-Hant-TW", "zh-TW"}, + {"zh-Hans", "zh"}, + {"zh-Hani", "zh-Hani"}, + {"und-Hans", "und-Hans"}, + {"und-Hani", "und-Hani"}, + + {"und-CW", "und-CW"}, + {"und-YT", "und-YT"}, + {"und-Arab", "und-Arab"}, + {"und-AM", "und-AM"}, + {"und-Arab-CC", "und-Arab-CC"}, + {"und-CC", "und-CC"}, + {"und-Latn-BJ", "und-BJ"}, + {"und-Bugi-ID", "und-Bugi"}, + {"bug-Bugi-ID", "bug-Bugi"}, + // regions, scripts and languages without definitions + {"und-Arab-AA", "und-Arab-AA"}, + // preserve variants and extensions + {"de-Latn-1901", "de-1901"}, + {"de-Latn-x-abc", "de-x-abc"}, + {"de-DE-1901-x-abc", "de-1901-x-abc"}, + {"x-abc", "x-abc"}, // TODO: is this the desired behavior? + } + for i, tt := range tests { + in, _ := Parse(tt.in) + out, _ := Parse(tt.out) + min, _ := in.minimize() + if min.String() != out.String() { + t.Errorf("%d: min(%s) was %s; want %s", i, tt.in, min, tt.out) + } + max, _ := min.addLikelySubtags() + if x, _ := in.addLikelySubtags(); x.String() != max.String() { + t.Errorf("%d: max(min(%s)) = %s; want %s", i, tt.in, max, x) + } + } +} + +func TestRegionDistance(t *testing.T) { + tests := []struct { + a, b string + d int + }{ + {"NL", "NL", 0}, + {"NL", "EU", 1}, + {"EU", "NL", 1}, + {"005", "005", 0}, + {"NL", "BE", 2}, + {"CO", "005", 1}, + {"005", "CO", 1}, + {"CO", "419", 2}, + {"419", "CO", 2}, + {"005", "419", 1}, + {"419", "005", 1}, + {"001", "013", 2}, + {"013", "001", 2}, + {"CO", "CW", 4}, + {"CO", "PW", 6}, + {"CO", "BV", 6}, + {"ZZ", "QQ", 2}, + } + for i, tt := range tests { + ra, _ := getRegionID([]byte(tt.a)) + rb, _ := getRegionID([]byte(tt.b)) + if d := regionDistance(ra, rb); d != tt.d { + t.Errorf("%d: d(%s, %s) = %v; want %v", i, tt.a, tt.b, d, tt.d) + } + } +} + +func TestParentDistance(t *testing.T) { + tests := []struct { + parent string + tag string + d uint8 + }{ + {"en-001", "en-AU", 1}, + {"pt-PT", "pt-AO", 1}, + {"pt", "pt-AO", 2}, + {"en-AU", "en-GB", 255}, + {"en-NL", "en-AU", 255}, + // Note that pt-BR and en-US are not automatically minimized. + {"pt-BR", "pt-AO", 255}, + {"en-US", "en-AU", 255}, + } + for _, tt := range tests { + r := Raw.MustParse(tt.parent).region + tag := Raw.MustParse(tt.tag) + if d := parentDistance(r, tag); d != tt.d { + t.Errorf("d(%s, %s) was %d; want %d", r, tag, d, tt.d) + } + } +} + +// Implementation of String methods for various types for debugging purposes. + +func (m *matcher) String() string { + w := &bytes.Buffer{} + fmt.Fprintln(w, "Default:", m.default_) + for tag, h := range m.index { + fmt.Fprintf(w, " %s: %v\n", tag, h) + } + return w.String() +} + +func (h *matchHeader) String() string { + w := &bytes.Buffer{} + fmt.Fprintf(w, "exact: ") + for _, h := range h.exact { + fmt.Fprintf(w, "%v, ", h) + } + fmt.Fprint(w, "; max: ") + for _, h := range h.max { + fmt.Fprintf(w, "%v, ", h) + } + return w.String() +} + +func (t haveTag) String() string { + return fmt.Sprintf("%v:%d:%v:%v-%v|%v", t.tag, t.index, t.conf, t.maxRegion, t.maxScript, t.altScript) +} + +// The test set for TestBestMatch is defined in data_test.go. +func TestBestMatch(t *testing.T) { + parse := func(list string) (out []Tag) { + for _, s := range strings.Split(list, ",") { + out = append(out, mk(strings.TrimSpace(s))) + } + return out + } + for i, tt := range matchTests { + supported := parse(tt.supported) + m := newMatcher(supported) + if *verbose { + fmt.Printf("%s:\n%v\n", tt.comment, m) + } + for _, tm := range tt.test { + tag, _, conf := m.Match(parse(tm.desired)...) + if tag.String() != tm.match { + t.Errorf("%d:%s: find %s in %q: have %s; want %s (%v)\n", i, tt.comment, tm.desired, tt.supported, tag, tm.match, conf) + } + } + } +} + +var benchHave = []Tag{ + mk("en"), + mk("en-GB"), + mk("za"), + mk("zh-Hant"), + mk("zh-Hans-CN"), + mk("zh"), + mk("zh-HK"), + mk("ar-MK"), + mk("en-CA"), + mk("fr-CA"), + mk("fr-US"), + mk("fr-CH"), + mk("fr"), + mk("lt"), + mk("lv"), + mk("iw"), + mk("iw-NL"), + mk("he"), + mk("he-IT"), + mk("tlh"), + mk("ja"), + mk("ja-Jpan"), + mk("ja-Jpan-JP"), + mk("de"), + mk("de-CH"), + mk("de-AT"), + mk("de-DE"), + mk("sr"), + mk("sr-Latn"), + mk("sr-Cyrl"), + mk("sr-ME"), +} + +var benchWant = [][]Tag{ + []Tag{ + mk("en"), + }, + []Tag{ + mk("en-AU"), + mk("de-HK"), + mk("nl"), + mk("fy"), + mk("lv"), + }, + []Tag{ + mk("en-AU"), + mk("de-HK"), + mk("nl"), + mk("fy"), + }, + []Tag{ + mk("ja-Hant"), + mk("da-HK"), + mk("nl"), + mk("zh-TW"), + }, + []Tag{ + mk("ja-Hant"), + mk("da-HK"), + mk("nl"), + mk("hr"), + }, +} + +func BenchmarkMatch(b *testing.B) { + m := newMatcher(benchHave) + for i := 0; i < b.N; i++ { + for _, want := range benchWant { + m.getBest(want...) + } + } +} + +func BenchmarkMatchExact(b *testing.B) { + want := mk("en") + m := newMatcher(benchHave) + for i := 0; i < b.N; i++ { + m.getBest(want) + } +} + +func BenchmarkMatchAltLanguagePresent(b *testing.B) { + want := mk("hr") + m := newMatcher(benchHave) + for i := 0; i < b.N; i++ { + m.getBest(want) + } +} + +func BenchmarkMatchAltLanguageNotPresent(b *testing.B) { + want := mk("nn") + m := newMatcher(benchHave) + for i := 0; i < b.N; i++ { + m.getBest(want) + } +} + +func BenchmarkMatchAltScriptPresent(b *testing.B) { + want := mk("zh-Hant-CN") + m := newMatcher(benchHave) + for i := 0; i < b.N; i++ { + m.getBest(want) + } +} + +func BenchmarkMatchAltScriptNotPresent(b *testing.B) { + want := mk("fr-Cyrl") + m := newMatcher(benchHave) + for i := 0; i < b.N; i++ { + m.getBest(want) + } +} + +func BenchmarkMatchLimitedExact(b *testing.B) { + want := []Tag{mk("he-NL"), mk("iw-NL")} + m := newMatcher(benchHave) + for i := 0; i < b.N; i++ { + m.getBest(want...) + } +} diff --git a/vendor/golang.org/x/text/language/parse.go b/vendor/golang.org/x/text/language/parse.go new file mode 100644 index 0000000000..cfa28f56e2 --- /dev/null +++ b/vendor/golang.org/x/text/language/parse.go @@ -0,0 +1,859 @@ +// Copyright 2013 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 language + +import ( + "bytes" + "errors" + "fmt" + "sort" + "strconv" + "strings" + + "golang.org/x/text/internal/tag" +) + +// isAlpha returns true if the byte is not a digit. +// b must be an ASCII letter or digit. +func isAlpha(b byte) bool { + return b > '9' +} + +// isAlphaNum returns true if the string contains only ASCII letters or digits. +func isAlphaNum(s []byte) bool { + for _, c := range s { + if !('a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9') { + return false + } + } + return true +} + +// errSyntax is returned by any of the parsing functions when the +// input is not well-formed, according to BCP 47. +// TODO: return the position at which the syntax error occurred? +var errSyntax = errors.New("language: tag is not well-formed") + +// ValueError is returned by any of the parsing functions when the +// input is well-formed but the respective subtag is not recognized +// as a valid value. +type ValueError struct { + v [8]byte +} + +func mkErrInvalid(s []byte) error { + var e ValueError + copy(e.v[:], s) + return e +} + +func (e ValueError) tag() []byte { + n := bytes.IndexByte(e.v[:], 0) + if n == -1 { + n = 8 + } + return e.v[:n] +} + +// Error implements the error interface. +func (e ValueError) Error() string { + return fmt.Sprintf("language: subtag %q is well-formed but unknown", e.tag()) +} + +// Subtag returns the subtag for which the error occurred. +func (e ValueError) Subtag() string { + return string(e.tag()) +} + +// scanner is used to scan BCP 47 tokens, which are separated by _ or -. +type scanner struct { + b []byte + bytes [max99thPercentileSize]byte + token []byte + start int // start position of the current token + end int // end position of the current token + next int // next point for scan + err error + done bool +} + +func makeScannerString(s string) scanner { + scan := scanner{} + if len(s) <= len(scan.bytes) { + scan.b = scan.bytes[:copy(scan.bytes[:], s)] + } else { + scan.b = []byte(s) + } + scan.init() + return scan +} + +// makeScanner returns a scanner using b as the input buffer. +// b is not copied and may be modified by the scanner routines. +func makeScanner(b []byte) scanner { + scan := scanner{b: b} + scan.init() + return scan +} + +func (s *scanner) init() { + for i, c := range s.b { + if c == '_' { + s.b[i] = '-' + } + } + s.scan() +} + +// restToLower converts the string between start and end to lower case. +func (s *scanner) toLower(start, end int) { + for i := start; i < end; i++ { + c := s.b[i] + if 'A' <= c && c <= 'Z' { + s.b[i] += 'a' - 'A' + } + } +} + +func (s *scanner) setError(e error) { + if s.err == nil || (e == errSyntax && s.err != errSyntax) { + s.err = e + } +} + +// resizeRange shrinks or grows the array at position oldStart such that +// a new string of size newSize can fit between oldStart and oldEnd. +// Sets the scan point to after the resized range. +func (s *scanner) resizeRange(oldStart, oldEnd, newSize int) { + s.start = oldStart + if end := oldStart + newSize; end != oldEnd { + diff := end - oldEnd + if end < cap(s.b) { + b := make([]byte, len(s.b)+diff) + copy(b, s.b[:oldStart]) + copy(b[end:], s.b[oldEnd:]) + s.b = b + } else { + s.b = append(s.b[end:], s.b[oldEnd:]...) + } + s.next = end + (s.next - s.end) + s.end = end + } +} + +// replace replaces the current token with repl. +func (s *scanner) replace(repl string) { + s.resizeRange(s.start, s.end, len(repl)) + copy(s.b[s.start:], repl) +} + +// gobble removes the current token from the input. +// Caller must call scan after calling gobble. +func (s *scanner) gobble(e error) { + s.setError(e) + if s.start == 0 { + s.b = s.b[:+copy(s.b, s.b[s.next:])] + s.end = 0 + } else { + s.b = s.b[:s.start-1+copy(s.b[s.start-1:], s.b[s.end:])] + s.end = s.start - 1 + } + s.next = s.start +} + +// deleteRange removes the given range from s.b before the current token. +func (s *scanner) deleteRange(start, end int) { + s.setError(errSyntax) + s.b = s.b[:start+copy(s.b[start:], s.b[end:])] + diff := end - start + s.next -= diff + s.start -= diff + s.end -= diff +} + +// scan parses the next token of a BCP 47 string. Tokens that are larger +// than 8 characters or include non-alphanumeric characters result in an error +// and are gobbled and removed from the output. +// It returns the end position of the last token consumed. +func (s *scanner) scan() (end int) { + end = s.end + s.token = nil + for s.start = s.next; s.next < len(s.b); { + i := bytes.IndexByte(s.b[s.next:], '-') + if i == -1 { + s.end = len(s.b) + s.next = len(s.b) + i = s.end - s.start + } else { + s.end = s.next + i + s.next = s.end + 1 + } + token := s.b[s.start:s.end] + if i < 1 || i > 8 || !isAlphaNum(token) { + s.gobble(errSyntax) + continue + } + s.token = token + return end + } + if n := len(s.b); n > 0 && s.b[n-1] == '-' { + s.setError(errSyntax) + s.b = s.b[:len(s.b)-1] + } + s.done = true + return end +} + +// acceptMinSize parses multiple tokens of the given size or greater. +// It returns the end position of the last token consumed. +func (s *scanner) acceptMinSize(min int) (end int) { + end = s.end + s.scan() + for ; len(s.token) >= min; s.scan() { + end = s.end + } + return end +} + +// Parse parses the given BCP 47 string and returns a valid Tag. If parsing +// failed it returns an error and any part of the tag that could be parsed. +// If parsing succeeded but an unknown value was found, it returns +// ValueError. The Tag returned in this case is just stripped of the unknown +// value. All other values are preserved. It accepts tags in the BCP 47 format +// and extensions to this standard defined in +// http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. +// The resulting tag is canonicalized using the default canonicalization type. +func Parse(s string) (t Tag, err error) { + return Default.Parse(s) +} + +// Parse parses the given BCP 47 string and returns a valid Tag. If parsing +// failed it returns an error and any part of the tag that could be parsed. +// If parsing succeeded but an unknown value was found, it returns +// ValueError. The Tag returned in this case is just stripped of the unknown +// value. All other values are preserved. It accepts tags in the BCP 47 format +// and extensions to this standard defined in +// http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. +// The resulting tag is canonicalized using the the canonicalization type c. +func (c CanonType) Parse(s string) (t Tag, err error) { + // TODO: consider supporting old-style locale key-value pairs. + if s == "" { + return und, errSyntax + } + if len(s) <= maxAltTaglen { + b := [maxAltTaglen]byte{} + for i, c := range s { + // Generating invalid UTF-8 is okay as it won't match. + if 'A' <= c && c <= 'Z' { + c += 'a' - 'A' + } else if c == '_' { + c = '-' + } + b[i] = byte(c) + } + if t, ok := grandfathered(b); ok { + return t, nil + } + } + scan := makeScannerString(s) + t, err = parse(&scan, s) + t, changed := t.canonicalize(c) + if changed { + t.remakeString() + } + return t, err +} + +func parse(scan *scanner, s string) (t Tag, err error) { + t = und + var end int + if n := len(scan.token); n <= 1 { + scan.toLower(0, len(scan.b)) + if n == 0 || scan.token[0] != 'x' { + return t, errSyntax + } + end = parseExtensions(scan) + } else if n >= 4 { + return und, errSyntax + } else { // the usual case + t, end = parseTag(scan) + if n := len(scan.token); n == 1 { + t.pExt = uint16(end) + end = parseExtensions(scan) + } else if end < len(scan.b) { + scan.setError(errSyntax) + scan.b = scan.b[:end] + } + } + if int(t.pVariant) < len(scan.b) { + if end < len(s) { + s = s[:end] + } + if len(s) > 0 && tag.Compare(s, scan.b) == 0 { + t.str = s + } else { + t.str = string(scan.b) + } + } else { + t.pVariant, t.pExt = 0, 0 + } + return t, scan.err +} + +// parseTag parses language, script, region and variants. +// It returns a Tag and the end position in the input that was parsed. +func parseTag(scan *scanner) (t Tag, end int) { + var e error + // TODO: set an error if an unknown lang, script or region is encountered. + t.lang, e = getLangID(scan.token) + scan.setError(e) + scan.replace(t.lang.String()) + langStart := scan.start + end = scan.scan() + for len(scan.token) == 3 && isAlpha(scan.token[0]) { + // From http://tools.ietf.org/html/bcp47, <lang>-<extlang> tags are equivalent + // to a tag of the form <extlang>. + lang, e := getLangID(scan.token) + if lang != 0 { + t.lang = lang + copy(scan.b[langStart:], lang.String()) + scan.b[langStart+3] = '-' + scan.start = langStart + 4 + } + scan.gobble(e) + end = scan.scan() + } + if len(scan.token) == 4 && isAlpha(scan.token[0]) { + t.script, e = getScriptID(script, scan.token) + if t.script == 0 { + scan.gobble(e) + } + end = scan.scan() + } + if n := len(scan.token); n >= 2 && n <= 3 { + t.region, e = getRegionID(scan.token) + if t.region == 0 { + scan.gobble(e) + } else { + scan.replace(t.region.String()) + } + end = scan.scan() + } + scan.toLower(scan.start, len(scan.b)) + t.pVariant = byte(end) + end = parseVariants(scan, end, t) + t.pExt = uint16(end) + return t, end +} + +var separator = []byte{'-'} + +// parseVariants scans tokens as long as each token is a valid variant string. +// Duplicate variants are removed. +func parseVariants(scan *scanner, end int, t Tag) int { + start := scan.start + varIDBuf := [4]uint8{} + variantBuf := [4][]byte{} + varID := varIDBuf[:0] + variant := variantBuf[:0] + last := -1 + needSort := false + for ; len(scan.token) >= 4; scan.scan() { + // TODO: measure the impact of needing this conversion and redesign + // the data structure if there is an issue. + v, ok := variantIndex[string(scan.token)] + if !ok { + // unknown variant + // TODO: allow user-defined variants? + scan.gobble(mkErrInvalid(scan.token)) + continue + } + varID = append(varID, v) + variant = append(variant, scan.token) + if !needSort { + if last < int(v) { + last = int(v) + } else { + needSort = true + // There is no legal combinations of more than 7 variants + // (and this is by no means a useful sequence). + const maxVariants = 8 + if len(varID) > maxVariants { + break + } + } + } + end = scan.end + } + if needSort { + sort.Sort(variantsSort{varID, variant}) + k, l := 0, -1 + for i, v := range varID { + w := int(v) + if l == w { + // Remove duplicates. + continue + } + varID[k] = varID[i] + variant[k] = variant[i] + k++ + l = w + } + if str := bytes.Join(variant[:k], separator); len(str) == 0 { + end = start - 1 + } else { + scan.resizeRange(start, end, len(str)) + copy(scan.b[scan.start:], str) + end = scan.end + } + } + return end +} + +type variantsSort struct { + i []uint8 + v [][]byte +} + +func (s variantsSort) Len() int { + return len(s.i) +} + +func (s variantsSort) Swap(i, j int) { + s.i[i], s.i[j] = s.i[j], s.i[i] + s.v[i], s.v[j] = s.v[j], s.v[i] +} + +func (s variantsSort) Less(i, j int) bool { + return s.i[i] < s.i[j] +} + +type bytesSort [][]byte + +func (b bytesSort) Len() int { + return len(b) +} + +func (b bytesSort) Swap(i, j int) { + b[i], b[j] = b[j], b[i] +} + +func (b bytesSort) Less(i, j int) bool { + return bytes.Compare(b[i], b[j]) == -1 +} + +// parseExtensions parses and normalizes the extensions in the buffer. +// It returns the last position of scan.b that is part of any extension. +// It also trims scan.b to remove excess parts accordingly. +func parseExtensions(scan *scanner) int { + start := scan.start + exts := [][]byte{} + private := []byte{} + end := scan.end + for len(scan.token) == 1 { + extStart := scan.start + ext := scan.token[0] + end = parseExtension(scan) + extension := scan.b[extStart:end] + if len(extension) < 3 || (ext != 'x' && len(extension) < 4) { + scan.setError(errSyntax) + end = extStart + continue + } else if start == extStart && (ext == 'x' || scan.start == len(scan.b)) { + scan.b = scan.b[:end] + return end + } else if ext == 'x' { + private = extension + break + } + exts = append(exts, extension) + } + sort.Sort(bytesSort(exts)) + if len(private) > 0 { + exts = append(exts, private) + } + scan.b = scan.b[:start] + if len(exts) > 0 { + scan.b = append(scan.b, bytes.Join(exts, separator)...) + } else if start > 0 { + // Strip trailing '-'. + scan.b = scan.b[:start-1] + } + return end +} + +// parseExtension parses a single extension and returns the position of +// the extension end. +func parseExtension(scan *scanner) int { + start, end := scan.start, scan.end + switch scan.token[0] { + case 'u': + attrStart := end + scan.scan() + for last := []byte{}; len(scan.token) > 2; scan.scan() { + if bytes.Compare(scan.token, last) != -1 { + // Attributes are unsorted. Start over from scratch. + p := attrStart + 1 + scan.next = p + attrs := [][]byte{} + for scan.scan(); len(scan.token) > 2; scan.scan() { + attrs = append(attrs, scan.token) + end = scan.end + } + sort.Sort(bytesSort(attrs)) + copy(scan.b[p:], bytes.Join(attrs, separator)) + break + } + last = scan.token + end = scan.end + } + var last, key []byte + for attrEnd := end; len(scan.token) == 2; last = key { + key = scan.token + keyEnd := scan.end + end = scan.acceptMinSize(3) + // TODO: check key value validity + if keyEnd == end || bytes.Compare(key, last) != 1 { + // We have an invalid key or the keys are not sorted. + // Start scanning keys from scratch and reorder. + p := attrEnd + 1 + scan.next = p + keys := [][]byte{} + for scan.scan(); len(scan.token) == 2; { + keyStart, keyEnd := scan.start, scan.end + end = scan.acceptMinSize(3) + if keyEnd != end { + keys = append(keys, scan.b[keyStart:end]) + } else { + scan.setError(errSyntax) + end = keyStart + } + } + sort.Sort(bytesSort(keys)) + reordered := bytes.Join(keys, separator) + if e := p + len(reordered); e < end { + scan.deleteRange(e, end) + end = e + } + copy(scan.b[p:], bytes.Join(keys, separator)) + break + } + } + case 't': + scan.scan() + if n := len(scan.token); n >= 2 && n <= 3 && isAlpha(scan.token[1]) { + _, end = parseTag(scan) + scan.toLower(start, end) + } + for len(scan.token) == 2 && !isAlpha(scan.token[1]) { + end = scan.acceptMinSize(3) + } + case 'x': + end = scan.acceptMinSize(1) + default: + end = scan.acceptMinSize(2) + } + return end +} + +// Compose creates a Tag from individual parts, which may be of type Tag, Base, +// Script, Region, Variant, []Variant, Extension, []Extension or error. If a +// Base, Script or Region or slice of type Variant or Extension is passed more +// than once, the latter will overwrite the former. Variants and Extensions are +// accumulated, but if two extensions of the same type are passed, the latter +// will replace the former. A Tag overwrites all former values and typically +// only makes sense as the first argument. The resulting tag is returned after +// canonicalizing using the Default CanonType. If one or more errors are +// encountered, one of the errors is returned. +func Compose(part ...interface{}) (t Tag, err error) { + return Default.Compose(part...) +} + +// Compose creates a Tag from individual parts, which may be of type Tag, Base, +// Script, Region, Variant, []Variant, Extension, []Extension or error. If a +// Base, Script or Region or slice of type Variant or Extension is passed more +// than once, the latter will overwrite the former. Variants and Extensions are +// accumulated, but if two extensions of the same type are passed, the latter +// will replace the former. A Tag overwrites all former values and typically +// only makes sense as the first argument. The resulting tag is returned after +// canonicalizing using CanonType c. If one or more errors are encountered, +// one of the errors is returned. +func (c CanonType) Compose(part ...interface{}) (t Tag, err error) { + var b builder + if err = b.update(part...); err != nil { + return und, err + } + t, _ = b.tag.canonicalize(c) + + if len(b.ext) > 0 || len(b.variant) > 0 { + sort.Sort(sortVariant(b.variant)) + sort.Strings(b.ext) + if b.private != "" { + b.ext = append(b.ext, b.private) + } + n := maxCoreSize + tokenLen(b.variant...) + tokenLen(b.ext...) + buf := make([]byte, n) + p := t.genCoreBytes(buf) + t.pVariant = byte(p) + p += appendTokens(buf[p:], b.variant...) + t.pExt = uint16(p) + p += appendTokens(buf[p:], b.ext...) + t.str = string(buf[:p]) + } else if b.private != "" { + t.str = b.private + t.remakeString() + } + return +} + +type builder struct { + tag Tag + + private string // the x extension + ext []string + variant []string + + err error +} + +func (b *builder) addExt(e string) { + if e == "" { + } else if e[0] == 'x' { + b.private = e + } else { + b.ext = append(b.ext, e) + } +} + +var errInvalidArgument = errors.New("invalid Extension or Variant") + +func (b *builder) update(part ...interface{}) (err error) { + replace := func(l *[]string, s string, eq func(a, b string) bool) bool { + if s == "" { + b.err = errInvalidArgument + return true + } + for i, v := range *l { + if eq(v, s) { + (*l)[i] = s + return true + } + } + return false + } + for _, x := range part { + switch v := x.(type) { + case Tag: + b.tag.lang = v.lang + b.tag.region = v.region + b.tag.script = v.script + if v.str != "" { + b.variant = nil + for x, s := "", v.str[v.pVariant:v.pExt]; s != ""; { + x, s = nextToken(s) + b.variant = append(b.variant, x) + } + b.ext, b.private = nil, "" + for i, e := int(v.pExt), ""; i < len(v.str); { + i, e = getExtension(v.str, i) + b.addExt(e) + } + } + case Base: + b.tag.lang = v.langID + case Script: + b.tag.script = v.scriptID + case Region: + b.tag.region = v.regionID + case Variant: + if !replace(&b.variant, v.variant, func(a, b string) bool { return a == b }) { + b.variant = append(b.variant, v.variant) + } + case Extension: + if !replace(&b.ext, v.s, func(a, b string) bool { return a[0] == b[0] }) { + b.addExt(v.s) + } + case []Variant: + b.variant = nil + for _, x := range v { + b.update(x) + } + case []Extension: + b.ext, b.private = nil, "" + for _, e := range v { + b.update(e) + } + // TODO: support parsing of raw strings based on morphology or just extensions? + case error: + err = v + } + } + return +} + +func tokenLen(token ...string) (n int) { + for _, t := range token { + n += len(t) + 1 + } + return +} + +func appendTokens(b []byte, token ...string) int { + p := 0 + for _, t := range token { + b[p] = '-' + copy(b[p+1:], t) + p += 1 + len(t) + } + return p +} + +type sortVariant []string + +func (s sortVariant) Len() int { + return len(s) +} + +func (s sortVariant) Swap(i, j int) { + s[j], s[i] = s[i], s[j] +} + +func (s sortVariant) Less(i, j int) bool { + return variantIndex[s[i]] < variantIndex[s[j]] +} + +func findExt(list []string, x byte) int { + for i, e := range list { + if e[0] == x { + return i + } + } + return -1 +} + +// getExtension returns the name, body and end position of the extension. +func getExtension(s string, p int) (end int, ext string) { + if s[p] == '-' { + p++ + } + if s[p] == 'x' { + return len(s), s[p:] + } + end = nextExtension(s, p) + return end, s[p:end] +} + +// nextExtension finds the next extension within the string, searching +// for the -<char>- pattern from position p. +// In the fast majority of cases, language tags will have at most +// one extension and extensions tend to be small. +func nextExtension(s string, p int) int { + for n := len(s) - 3; p < n; { + if s[p] == '-' { + if s[p+2] == '-' { + return p + } + p += 3 + } else { + p++ + } + } + return len(s) +} + +var errInvalidWeight = errors.New("ParseAcceptLanguage: invalid weight") + +// ParseAcceptLanguage parses the contents of a Accept-Language header as +// defined in http://www.ietf.org/rfc/rfc2616.txt and returns a list of Tags and +// a list of corresponding quality weights. It is more permissive than RFC 2616 +// and may return non-nil slices even if the input is not valid. +// The Tags will be sorted by highest weight first and then by first occurrence. +// Tags with a weight of zero will be dropped. An error will be returned if the +// input could not be parsed. +func ParseAcceptLanguage(s string) (tag []Tag, q []float32, err error) { + var entry string + for s != "" { + if entry, s = split(s, ','); entry == "" { + continue + } + + entry, weight := split(entry, ';') + + // Scan the language. + t, err := Parse(entry) + if err != nil { + id, ok := acceptFallback[entry] + if !ok { + return nil, nil, err + } + t = Tag{lang: id} + } + + // Scan the optional weight. + w := 1.0 + if weight != "" { + weight = consume(weight, 'q') + weight = consume(weight, '=') + // consume returns the empty string when a token could not be + // consumed, resulting in an error for ParseFloat. + if w, err = strconv.ParseFloat(weight, 32); err != nil { + return nil, nil, errInvalidWeight + } + // Drop tags with a quality weight of 0. + if w <= 0 { + continue + } + } + + tag = append(tag, t) + q = append(q, float32(w)) + } + sortStable(&tagSort{tag, q}) + return tag, q, nil +} + +// consume removes a leading token c from s and returns the result or the empty +// string if there is no such token. +func consume(s string, c byte) string { + if s == "" || s[0] != c { + return "" + } + return strings.TrimSpace(s[1:]) +} + +func split(s string, c byte) (head, tail string) { + if i := strings.IndexByte(s, c); i >= 0 { + return strings.TrimSpace(s[:i]), strings.TrimSpace(s[i+1:]) + } + return strings.TrimSpace(s), "" +} + +// Add hack mapping to deal with a small number of cases that that occur +// in Accept-Language (with reasonable frequency). +var acceptFallback = map[string]langID{ + "english": _en, + "deutsch": _de, + "italian": _it, + "french": _fr, + "*": _mul, // defined in the spec to match all languages. +} + +type tagSort struct { + tag []Tag + q []float32 +} + +func (s *tagSort) Len() int { + return len(s.q) +} + +func (s *tagSort) Less(i, j int) bool { + return s.q[i] > s.q[j] +} + +func (s *tagSort) Swap(i, j int) { + s.tag[i], s.tag[j] = s.tag[j], s.tag[i] + s.q[i], s.q[j] = s.q[j], s.q[i] +} diff --git a/vendor/golang.org/x/text/language/parse_test.go b/vendor/golang.org/x/text/language/parse_test.go new file mode 100644 index 0000000000..9b40eb444e --- /dev/null +++ b/vendor/golang.org/x/text/language/parse_test.go @@ -0,0 +1,517 @@ +// Copyright 2013 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 language + +import ( + "bytes" + "strings" + "testing" + + "golang.org/x/text/internal/tag" +) + +type scanTest struct { + ok bool // true if scanning does not result in an error + in string + tok []string // the expected tokens +} + +var tests = []scanTest{ + {true, "", []string{}}, + {true, "1", []string{"1"}}, + {true, "en", []string{"en"}}, + {true, "root", []string{"root"}}, + {true, "maxchars", []string{"maxchars"}}, + {false, "bad/", []string{}}, + {false, "morethan8", []string{}}, + {false, "-", []string{}}, + {false, "----", []string{}}, + {false, "_", []string{}}, + {true, "en-US", []string{"en", "US"}}, + {true, "en_US", []string{"en", "US"}}, + {false, "en-US-", []string{"en", "US"}}, + {false, "en-US--", []string{"en", "US"}}, + {false, "en-US---", []string{"en", "US"}}, + {false, "en--US", []string{"en", "US"}}, + {false, "-en-US", []string{"en", "US"}}, + {false, "-en--US-", []string{"en", "US"}}, + {false, "-en--US-", []string{"en", "US"}}, + {false, "en-.-US", []string{"en", "US"}}, + {false, ".-en--US-.", []string{"en", "US"}}, + {false, "en-u.-US", []string{"en", "US"}}, + {true, "en-u1-US", []string{"en", "u1", "US"}}, + {true, "maxchar1_maxchar2-maxchar3", []string{"maxchar1", "maxchar2", "maxchar3"}}, + {false, "moreThan8-moreThan8-e", []string{"e"}}, +} + +func TestScan(t *testing.T) { + for i, tt := range tests { + scan := makeScannerString(tt.in) + for j := 0; !scan.done; j++ { + if j >= len(tt.tok) { + t.Errorf("%d: extra token %q", i, scan.token) + } else if tag.Compare(tt.tok[j], scan.token) != 0 { + t.Errorf("%d: token %d: found %q; want %q", i, j, scan.token, tt.tok[j]) + break + } + scan.scan() + } + if s := strings.Join(tt.tok, "-"); tag.Compare(s, bytes.Replace(scan.b, b("_"), b("-"), -1)) != 0 { + t.Errorf("%d: input: found %q; want %q", i, scan.b, s) + } + if (scan.err == nil) != tt.ok { + t.Errorf("%d: ok: found %v; want %v", i, scan.err == nil, tt.ok) + } + } +} + +func TestAcceptMinSize(t *testing.T) { + for i, tt := range tests { + // count number of successive tokens with a minimum size. + for sz := 1; sz <= 8; sz++ { + scan := makeScannerString(tt.in) + scan.end, scan.next = 0, 0 + end := scan.acceptMinSize(sz) + n := 0 + for i := 0; i < len(tt.tok) && len(tt.tok[i]) >= sz; i++ { + n += len(tt.tok[i]) + if i > 0 { + n++ + } + } + if end != n { + t.Errorf("%d:%d: found len %d; want %d", i, sz, end, n) + } + } + } +} + +type parseTest struct { + i int // the index of this test + in string + lang, script, region string + variants, ext string + extList []string // only used when more than one extension is present + invalid bool + rewrite bool // special rewrite not handled by parseTag + changed bool // string needed to be reformatted +} + +func parseTests() []parseTest { + tests := []parseTest{ + {in: "root", lang: "und"}, + {in: "und", lang: "und"}, + {in: "en", lang: "en"}, + {in: "xy", lang: "und", invalid: true}, + {in: "en-ZY", lang: "en", invalid: true}, + {in: "gsw", lang: "gsw"}, + {in: "sr_Latn", lang: "sr", script: "Latn"}, + {in: "af-Arab", lang: "af", script: "Arab"}, + {in: "nl-BE", lang: "nl", region: "BE"}, + {in: "es-419", lang: "es", region: "419"}, + {in: "und-001", lang: "und", region: "001"}, + {in: "de-latn-be", lang: "de", script: "Latn", region: "BE"}, + // Variants + {in: "de-1901", lang: "de", variants: "1901"}, + // Accept with unsuppressed script. + {in: "de-Latn-1901", lang: "de", script: "Latn", variants: "1901"}, + // Specialized. + {in: "sl-rozaj", lang: "sl", variants: "rozaj"}, + {in: "sl-rozaj-lipaw", lang: "sl", variants: "rozaj-lipaw"}, + {in: "sl-rozaj-biske", lang: "sl", variants: "rozaj-biske"}, + {in: "sl-rozaj-biske-1994", lang: "sl", variants: "rozaj-biske-1994"}, + {in: "sl-rozaj-1994", lang: "sl", variants: "rozaj-1994"}, + // Maximum number of variants while adhering to prefix rules. + {in: "sl-rozaj-biske-1994-alalc97-fonipa-fonupa-fonxsamp", lang: "sl", variants: "rozaj-biske-1994-alalc97-fonipa-fonupa-fonxsamp"}, + + // Sorting. + {in: "sl-1994-biske-rozaj", lang: "sl", variants: "rozaj-biske-1994", changed: true}, + {in: "sl-rozaj-biske-1994-alalc97-fonupa-fonipa-fonxsamp", lang: "sl", variants: "rozaj-biske-1994-alalc97-fonipa-fonupa-fonxsamp", changed: true}, + {in: "nl-fonxsamp-alalc97-fonipa-fonupa", lang: "nl", variants: "alalc97-fonipa-fonupa-fonxsamp", changed: true}, + + // Duplicates variants are removed, but not an error. + {in: "nl-fonupa-fonupa", lang: "nl", variants: "fonupa"}, + + // Variants that do not have correct prefixes. We still accept these. + {in: "de-Cyrl-1901", lang: "de", script: "Cyrl", variants: "1901"}, + {in: "sl-rozaj-lipaw-1994", lang: "sl", variants: "rozaj-lipaw-1994"}, + {in: "sl-1994-biske-rozaj-1994-biske-rozaj", lang: "sl", variants: "rozaj-biske-1994", changed: true}, + {in: "de-Cyrl-1901", lang: "de", script: "Cyrl", variants: "1901"}, + + // Invalid variant. + {in: "de-1902", lang: "de", variants: "", invalid: true}, + + {in: "EN_CYRL", lang: "en", script: "Cyrl"}, + // private use and extensions + {in: "x-a-b-c-d", ext: "x-a-b-c-d"}, + {in: "x_A.-B-C_D", ext: "x-b-c-d", invalid: true, changed: true}, + {in: "x-aa-bbbb-cccccccc-d", ext: "x-aa-bbbb-cccccccc-d"}, + {in: "en-c_cc-b-bbb-a-aaa", lang: "en", changed: true, extList: []string{"a-aaa", "b-bbb", "c-cc"}}, + {in: "en-x_cc-b-bbb-a-aaa", lang: "en", ext: "x-cc-b-bbb-a-aaa", changed: true}, + {in: "en-c_cc-b-bbb-a-aaa-x-x", lang: "en", changed: true, extList: []string{"a-aaa", "b-bbb", "c-cc", "x-x"}}, + {in: "en-v-c", lang: "en", ext: "", invalid: true}, + {in: "en-v-abcdefghi", lang: "en", ext: "", invalid: true}, + {in: "en-v-abc-x", lang: "en", ext: "v-abc", invalid: true}, + {in: "en-v-abc-x-", lang: "en", ext: "v-abc", invalid: true}, + {in: "en-v-abc-w-x-xx", lang: "en", extList: []string{"v-abc", "x-xx"}, invalid: true, changed: true}, + {in: "en-v-abc-w-y-yx", lang: "en", extList: []string{"v-abc", "y-yx"}, invalid: true, changed: true}, + {in: "en-v-c-abc", lang: "en", ext: "c-abc", invalid: true, changed: true}, + {in: "en-v-w-abc", lang: "en", ext: "w-abc", invalid: true, changed: true}, + {in: "en-v-x-abc", lang: "en", ext: "x-abc", invalid: true, changed: true}, + {in: "en-v-x-a", lang: "en", ext: "x-a", invalid: true, changed: true}, + {in: "en-9-aa-0-aa-z-bb-x-a", lang: "en", extList: []string{"0-aa", "9-aa", "z-bb", "x-a"}, changed: true}, + {in: "en-u-c", lang: "en", ext: "", invalid: true}, + {in: "en-u-co-phonebk", lang: "en", ext: "u-co-phonebk"}, + {in: "en-u-co-phonebk-ca", lang: "en", ext: "u-co-phonebk", invalid: true}, + {in: "en-u-nu-arabic-co-phonebk-ca", lang: "en", ext: "u-co-phonebk-nu-arabic", invalid: true, changed: true}, + {in: "en-u-nu-arabic-co-phonebk-ca-x", lang: "en", ext: "u-co-phonebk-nu-arabic", invalid: true, changed: true}, + {in: "en-u-nu-arabic-co-phonebk-ca-s", lang: "en", ext: "u-co-phonebk-nu-arabic", invalid: true, changed: true}, + {in: "en-u-nu-arabic-co-phonebk-ca-a12345678", lang: "en", ext: "u-co-phonebk-nu-arabic", invalid: true, changed: true}, + {in: "en-u-co-phonebook", lang: "en", ext: "", invalid: true}, + {in: "en-u-co-phonebook-cu-xau", lang: "en", ext: "u-cu-xau", invalid: true, changed: true}, + {in: "en-Cyrl-u-co-phonebk", lang: "en", script: "Cyrl", ext: "u-co-phonebk"}, + {in: "en-US-u-co-phonebk", lang: "en", region: "US", ext: "u-co-phonebk"}, + {in: "en-US-u-co-phonebk-cu-xau", lang: "en", region: "US", ext: "u-co-phonebk-cu-xau"}, + {in: "en-scotland-u-co-phonebk", lang: "en", variants: "scotland", ext: "u-co-phonebk"}, + {in: "en-u-cu-xua-co-phonebk", lang: "en", ext: "u-co-phonebk-cu-xua", changed: true}, + {in: "en-u-def-abc-cu-xua-co-phonebk", lang: "en", ext: "u-abc-def-co-phonebk-cu-xua", changed: true}, + {in: "en-u-def-abc", lang: "en", ext: "u-abc-def", changed: true}, + {in: "en-u-cu-xua-co-phonebk-a-cd", lang: "en", extList: []string{"a-cd", "u-co-phonebk-cu-xua"}, changed: true}, + // Invalid "u" extension. Drop invalid parts. + {in: "en-u-cu-co-phonebk", lang: "en", extList: []string{"u-co-phonebk"}, invalid: true, changed: true}, + {in: "en-u-cu-xau-co", lang: "en", extList: []string{"u-cu-xau"}, invalid: true}, + // We allow duplicate keys as the LDML spec does not explicitly prohibit it. + // TODO: Consider eliminating duplicates and returning an error. + {in: "en-u-cu-xau-co-phonebk-cu-xau", lang: "en", ext: "u-co-phonebk-cu-xau-cu-xau", changed: true}, + {in: "en-t-en-Cyrl-NL-fonipa", lang: "en", ext: "t-en-cyrl-nl-fonipa", changed: true}, + {in: "en-t-en-Cyrl-NL-fonipa-t0-abc-def", lang: "en", ext: "t-en-cyrl-nl-fonipa-t0-abc-def", changed: true}, + {in: "en-t-t0-abcd", lang: "en", ext: "t-t0-abcd"}, + // Not necessary to have changed here. + {in: "en-t-nl-abcd", lang: "en", ext: "t-nl", invalid: true}, + {in: "en-t-nl-latn", lang: "en", ext: "t-nl-latn"}, + {in: "en-t-t0-abcd-x-a", lang: "en", extList: []string{"t-t0-abcd", "x-a"}}, + // invalid + {in: "", lang: "und", invalid: true}, + {in: "-", lang: "und", invalid: true}, + {in: "x", lang: "und", invalid: true}, + {in: "x-", lang: "und", invalid: true}, + {in: "x--", lang: "und", invalid: true}, + {in: "a-a-b-c-d", lang: "und", invalid: true}, + {in: "en-", lang: "en", invalid: true}, + {in: "enne-", lang: "und", invalid: true}, + {in: "en.", lang: "und", invalid: true}, + {in: "en.-latn", lang: "und", invalid: true}, + {in: "en.-en", lang: "en", invalid: true}, + {in: "x-a-tooManyChars-c-d", ext: "x-a-c-d", invalid: true, changed: true}, + {in: "a-tooManyChars-c-d", lang: "und", invalid: true}, + // TODO: check key-value validity + // { in: "en-u-cu-xd", lang: "en", ext: "u-cu-xd", invalid: true }, + {in: "en-t-abcd", lang: "en", invalid: true}, + {in: "en-Latn-US-en", lang: "en", script: "Latn", region: "US", invalid: true}, + // rewrites (more tests in TestGrandfathered) + {in: "zh-min-nan", lang: "nan"}, + {in: "zh-yue", lang: "yue"}, + {in: "zh-xiang", lang: "hsn", rewrite: true}, + {in: "zh-guoyu", lang: "cmn", rewrite: true}, + {in: "iw", lang: "iw"}, + {in: "sgn-BE-FR", lang: "sfb", rewrite: true}, + {in: "i-klingon", lang: "tlh", rewrite: true}, + } + for i, tt := range tests { + tests[i].i = i + if tt.extList != nil { + tests[i].ext = strings.Join(tt.extList, "-") + } + if tt.ext != "" && tt.extList == nil { + tests[i].extList = []string{tt.ext} + } + } + return tests +} + +func TestParseExtensions(t *testing.T) { + for i, tt := range parseTests() { + if tt.ext == "" || tt.rewrite { + continue + } + scan := makeScannerString(tt.in) + if len(scan.b) > 1 && scan.b[1] != '-' { + scan.end = nextExtension(string(scan.b), 0) + scan.next = scan.end + 1 + scan.scan() + } + start := scan.start + scan.toLower(start, len(scan.b)) + parseExtensions(&scan) + ext := string(scan.b[start:]) + if ext != tt.ext { + t.Errorf("%d(%s): ext was %v; want %v", i, tt.in, ext, tt.ext) + } + if changed := !strings.HasPrefix(tt.in[start:], ext); changed != tt.changed { + t.Errorf("%d(%s): changed was %v; want %v", i, tt.in, changed, tt.changed) + } + } +} + +// partChecks runs checks for each part by calling the function returned by f. +func partChecks(t *testing.T, f func(*parseTest) (Tag, bool)) { + for i, tt := range parseTests() { + tag, skip := f(&tt) + if skip { + continue + } + if l, _ := getLangID(b(tt.lang)); l != tag.lang { + t.Errorf("%d: lang was %q; want %q", i, tag.lang, l) + } + if sc, _ := getScriptID(script, b(tt.script)); sc != tag.script { + t.Errorf("%d: script was %q; want %q", i, tag.script, sc) + } + if r, _ := getRegionID(b(tt.region)); r != tag.region { + t.Errorf("%d: region was %q; want %q", i, tag.region, r) + } + if tag.str == "" { + continue + } + p := int(tag.pVariant) + if p < int(tag.pExt) { + p++ + } + if s, g := tag.str[p:tag.pExt], tt.variants; s != g { + t.Errorf("%d: variants was %q; want %q", i, s, g) + } + p = int(tag.pExt) + if p > 0 && p < len(tag.str) { + p++ + } + if s, g := (tag.str)[p:], tt.ext; s != g { + t.Errorf("%d: extensions were %q; want %q", i, s, g) + } + } +} + +func TestParseTag(t *testing.T) { + partChecks(t, func(tt *parseTest) (id Tag, skip bool) { + if strings.HasPrefix(tt.in, "x-") || tt.rewrite { + return Tag{}, true + } + scan := makeScannerString(tt.in) + id, end := parseTag(&scan) + id.str = string(scan.b[:end]) + tt.ext = "" + tt.extList = []string{} + return id, false + }) +} + +func TestParse(t *testing.T) { + partChecks(t, func(tt *parseTest) (id Tag, skip bool) { + id, err := Raw.Parse(tt.in) + ext := "" + if id.str != "" { + if strings.HasPrefix(id.str, "x-") { + ext = id.str + } else if int(id.pExt) < len(id.str) && id.pExt > 0 { + ext = id.str[id.pExt+1:] + } + } + if tag, _ := Raw.Parse(id.String()); tag.String() != id.String() { + t.Errorf("%d:%s: reparse was %q; want %q", tt.i, tt.in, id.String(), tag.String()) + } + if ext != tt.ext { + t.Errorf("%d:%s: ext was %q; want %q", tt.i, tt.in, ext, tt.ext) + } + changed := id.str != "" && !strings.HasPrefix(tt.in, id.str) + if changed != tt.changed { + t.Errorf("%d:%s: changed was %v; want %v", tt.i, tt.in, changed, tt.changed) + } + if (err != nil) != tt.invalid { + t.Errorf("%d:%s: invalid was %v; want %v. Error: %v", tt.i, tt.in, err != nil, tt.invalid, err) + } + return id, false + }) +} + +func TestErrors(t *testing.T) { + mkInvalid := func(s string) error { + return mkErrInvalid([]byte(s)) + } + tests := []struct { + in string + out error + }{ + // invalid subtags. + {"ac", mkInvalid("ac")}, + {"AC", mkInvalid("ac")}, + {"aa-Uuuu", mkInvalid("Uuuu")}, + {"aa-AB", mkInvalid("AB")}, + // ill-formed wins over invalid. + {"ac-u", errSyntax}, + {"ac-u-ca", errSyntax}, + {"ac-u-ca-co-pinyin", errSyntax}, + {"noob", errSyntax}, + } + for _, tt := range tests { + _, err := Parse(tt.in) + if err != tt.out { + t.Errorf("%s: was %q; want %q", tt.in, err, tt.out) + } + } +} + +func TestCompose1(t *testing.T) { + partChecks(t, func(tt *parseTest) (id Tag, skip bool) { + l, _ := ParseBase(tt.lang) + s, _ := ParseScript(tt.script) + r, _ := ParseRegion(tt.region) + v := []Variant{} + for _, x := range strings.Split(tt.variants, "-") { + p, _ := ParseVariant(x) + v = append(v, p) + } + e := []Extension{} + for _, x := range tt.extList { + p, _ := ParseExtension(x) + e = append(e, p) + } + id, _ = Raw.Compose(l, s, r, v, e) + return id, false + }) +} + +func TestCompose2(t *testing.T) { + partChecks(t, func(tt *parseTest) (id Tag, skip bool) { + l, _ := ParseBase(tt.lang) + s, _ := ParseScript(tt.script) + r, _ := ParseRegion(tt.region) + p := []interface{}{l, s, r, s, r, l} + for _, x := range strings.Split(tt.variants, "-") { + v, _ := ParseVariant(x) + p = append(p, v) + } + for _, x := range tt.extList { + e, _ := ParseExtension(x) + p = append(p, e) + } + id, _ = Raw.Compose(p...) + return id, false + }) +} + +func TestCompose3(t *testing.T) { + partChecks(t, func(tt *parseTest) (id Tag, skip bool) { + id, _ = Raw.Parse(tt.in) + id, _ = Raw.Compose(id) + return id, false + }) +} + +func mk(s string) Tag { + return Raw.Make(s) +} + +func TestParseAcceptLanguage(t *testing.T) { + type res struct { + t Tag + q float32 + } + en := []res{{mk("en"), 1.0}} + tests := []struct { + out []res + in string + ok bool + }{ + {en, "en", true}, + {en, " en", true}, + {en, "en ", true}, + {en, " en ", true}, + {en, "en,", true}, + {en, ",en", true}, + {en, ",,,en,,,", true}, + {en, ",en;q=1", true}, + + // We allow an empty input, contrary to spec. + {nil, "", true}, + {[]res{{mk("aa"), 1}}, "aa;", true}, // allow unspecified weight + + // errors + {nil, ";", false}, + {nil, "$", false}, + {nil, "e;", false}, + {nil, "x;", false}, + {nil, "x", false}, + {nil, "ac", false}, // non-existing language + {nil, "aa;q", false}, + {nil, "aa;q=", false}, + {nil, "aa;q=.", false}, + + // odd fallbacks + { + []res{{mk("en"), 0.1}}, + " english ;q=.1", + true, + }, + { + []res{{mk("it"), 1.0}, {mk("de"), 1.0}, {mk("fr"), 1.0}}, + " italian, deutsch, french", + true, + }, + + // lists + { + []res{{mk("en"), 0.1}}, + "en;q=.1", + true, + }, + { + []res{{mk("mul"), 1.0}}, + "*", + true, + }, + { + []res{{mk("en"), 1.0}, {mk("de"), 1.0}}, + "en,de", + true, + }, + { + []res{{mk("en"), 1.0}, {mk("de"), .5}}, + "en,de;q=0.5", + true, + }, + { + []res{{mk("de"), 0.8}, {mk("en"), 0.5}}, + " en ; q = 0.5 , , de;q=0.8", + true, + }, + { + []res{{mk("en"), 1.0}, {mk("de"), 1.0}, {mk("fr"), 1.0}, {mk("tlh"), 1.0}}, + "en,de,fr,i-klingon", + true, + }, + // sorting + { + []res{{mk("tlh"), 0.4}, {mk("de"), 0.2}, {mk("fr"), 0.2}, {mk("en"), 0.1}}, + "en;q=0.1,de;q=0.2,fr;q=0.2,i-klingon;q=0.4", + true, + }, + // dropping + { + []res{{mk("fr"), 0.2}, {mk("en"), 0.1}}, + "en;q=0.1,de;q=0,fr;q=0.2,i-klingon;q=0.0", + true, + }, + } + for i, tt := range tests { + tags, qs, e := ParseAcceptLanguage(tt.in) + if e == nil != tt.ok { + t.Errorf("%d:%s:err: was %v; want %v", i, tt.in, e == nil, tt.ok) + } + for j, tag := range tags { + if out := tt.out[j]; !tag.equalTags(out.t) || qs[j] != out.q { + t.Errorf("%d:%s: was %s, %1f; want %s, %1f", i, tt.in, tag, qs[j], out.t, out.q) + break + } + } + } +} diff --git a/vendor/golang.org/x/text/language/tables.go b/vendor/golang.org/x/text/language/tables.go new file mode 100644 index 0000000000..5868eed531 --- /dev/null +++ b/vendor/golang.org/x/text/language/tables.go @@ -0,0 +1,2742 @@ +// This file was generated by go generate; DO NOT EDIT + +package language + +import "golang.org/x/text/internal/tag" + +// CLDRVersion is the CLDR version from which the tables in this package are derived. +const CLDRVersion = "28" + +const numLanguages = 8632 + +const numScripts = 223 + +const numRegions = 354 + +type fromTo struct { + from uint16 + to uint16 +} + +const nonCanonicalUnd = 646 +const ( + _af = 10 + _am = 17 + _ar = 21 + _az = 36 + _bg = 56 + _bn = 75 + _ca = 97 + _cs = 121 + _da = 128 + _de = 133 + _el = 153 + _en = 154 + _es = 156 + _et = 158 + _fa = 163 + _fi = 167 + _fil = 169 + _fr = 174 + _gu = 210 + _he = 223 + _hi = 224 + _hr = 237 + _hu = 241 + _hy = 242 + _id = 247 + _is = 257 + _it = 258 + _ja = 262 + _ka = 272 + _kk = 302 + _km = 306 + _kn = 308 + _ko = 309 + _ky = 332 + _lo = 356 + _lt = 360 + _lv = 367 + _mk = 395 + _ml = 396 + _mn = 398 + _mo = 401 + _mr = 405 + _ms = 409 + _mul = 413 + _my = 420 + _nb = 430 + _ne = 435 + _nl = 444 + _no = 448 + _pa = 469 + _pl = 485 + _pt = 493 + _ro = 513 + _ru = 517 + _sh = 547 + _si = 550 + _sk = 552 + _sl = 554 + _sq = 568 + _sr = 569 + _sv = 581 + _sw = 582 + _ta = 591 + _te = 598 + _th = 603 + _tl = 614 + _tn = 617 + _tr = 621 + _uk = 643 + _ur = 649 + _uz = 650 + _vi = 655 + _zh = 704 + _zu = 706 + _jbo = 264 + _ami = 1029 + _bnn = 1736 + _hak = 220 + _tlh = 13846 + _lb = 339 + _nv = 457 + _pwn = 11434 + _tao = 13567 + _tay = 13577 + _tsu = 14041 + _nn = 446 + _sfb = 13008 + _vgt = 15080 + _sgg = 13039 + _cmn = 2386 + _nan = 427 + _hsn = 239 +) + +const langPrivateStart = 0x2d05 + +const langPrivateEnd = 0x2f0c + +// lang holds an alphabetically sorted list of ISO-639 language identifiers. +// All entries are 4 bytes. The index of the identifier (divided by 4) is the language tag. +// For 2-byte language identifiers, the two successive bytes have the following meaning: +// - if the first letter of the 2- and 3-letter ISO codes are the same: +// the second and third letter of the 3-letter ISO code. +// - otherwise: a 0 and a by 2 bits right-shifted index into altLangISO3. +// For 3-byte language identifiers the 4th byte is 0. +var lang tag.Index = "" + // Size: 2840 bytes + "---\x00aaarabbkabr\x00ace\x00ach\x00ada\x00ady\x00aeveaeb\x00affragq\x00" + + "aho\x00akkaakk\x00aln\x00alt\x00ammhamo\x00anrgaoz\x00arraarc\x00arn\x00" + + "aro\x00arq\x00ary\x00arz\x00assmasa\x00ase\x00ast\x00atj\x00avvaawa\x00a" + + "yymazzebaakbal\x00ban\x00bap\x00bar\x00bas\x00bax\x00bbc\x00bbj\x00bci" + + "\x00beelbej\x00bem\x00bew\x00bez\x00bfd\x00bfq\x00bft\x00bfy\x00bgulbgc" + + "\x00bgn\x00bgx\x00bhihbhb\x00bhi\x00bhk\x00bho\x00biisbik\x00bin\x00bjj" + + "\x00bjn\x00bkm\x00bku\x00blt\x00bmambmq\x00bnenboodbpy\x00bqi\x00bqv\x00" + + "brrebra\x00brh\x00brx\x00bsosbsq\x00bss\x00bto\x00btv\x00bua\x00buc\x00b" + + "ug\x00bum\x00bvb\x00byn\x00byv\x00bze\x00caatcch\x00ccp\x00ceheceb\x00cg" + + "g\x00chhachk\x00chm\x00cho\x00chp\x00chr\x00cja\x00cjm\x00ckb\x00cooscop" + + "\x00cps\x00crrecrj\x00crk\x00crl\x00crm\x00crs\x00csescsb\x00csw\x00ctd" + + "\x00cuhucvhvcyymdaandak\x00dar\x00dav\x00dcc\x00deeuden\x00dgr\x00dje" + + "\x00dnj\x00doi\x00dsb\x00dtm\x00dtp\x00dua\x00dvivdyo\x00dyu\x00dzzoebu" + + "\x00eeweefi\x00egl\x00egy\x00eky\x00elllenngeopoes\x00\x05esu\x00etstett" + + "\x00euusewo\x00ext\x00faasfan\x00ffulffm\x00fiinfia\x00fil\x00fit\x00fji" + + "jfoaofon\x00frrafrc\x00frp\x00frr\x00frs\x00fud\x00fuq\x00fur\x00fuv\x00" + + "fvr\x00fyrygalegaa\x00gag\x00gan\x00gay\x00gbm\x00gbz\x00gcr\x00gdlagez" + + "\x00ggn\x00gil\x00gjk\x00gju\x00gllgglk\x00gnrngom\x00gon\x00gor\x00gos" + + "\x00got\x00grc\x00grt\x00gsw\x00guujgub\x00guc\x00gur\x00guw\x00guz\x00g" + + "vlvgvr\x00gwi\x00haauhak\x00haw\x00haz\x00heebhiinhif\x00hil\x00hlu\x00h" + + "md\x00hnd\x00hne\x00hnj\x00hnn\x00hno\x00homohoc\x00hoj\x00hrrvhsb\x00hs" + + "n\x00htathuunhyyehzerianaiba\x00ibb\x00idndieleigboiiiiikpkikt\x00ilo" + + "\x00inndinh\x00iodoisslittaiukuiw\x00\x03izh\x00japnjam\x00jbo\x00jgo" + + "\x00ji\x00\x06jmc\x00jml\x00jut\x00jvavjwavkaatkaa\x00kab\x00kac\x00kaj" + + "\x00kam\x00kao\x00kbd\x00kcg\x00kck\x00kde\x00kdt\x00kea\x00ken\x00kfo" + + "\x00kfr\x00kfy\x00kgonkge\x00kgp\x00kha\x00khb\x00khn\x00khq\x00kht\x00k" + + "hw\x00kiikkiu\x00kjuakjg\x00kkazkkj\x00klalkln\x00kmhmkmb\x00knankoorkoi" + + "\x00kok\x00kos\x00kpe\x00kraukrc\x00kri\x00krj\x00krl\x00kru\x00ksasksb" + + "\x00ksf\x00ksh\x00kuurkum\x00kvomkvr\x00kvx\x00kw\x00\x01kxm\x00kxp\x00k" + + "yirlaatlab\x00lad\x00lag\x00lah\x00laj\x00lbtzlbe\x00lbw\x00lcp\x00lep" + + "\x00lez\x00lgugliimlif\x00lij\x00lis\x00ljp\x00lki\x00lkt\x00lmn\x00lmo" + + "\x00lninloaolol\x00loz\x00lrc\x00ltitltg\x00luublua\x00luo\x00luy\x00luz" + + "\x00lvavlwl\x00lzh\x00lzz\x00mad\x00maf\x00mag\x00mai\x00mak\x00man\x00m" + + "as\x00maz\x00mdf\x00mdh\x00mdr\x00men\x00mer\x00mfa\x00mfe\x00mglgmgh" + + "\x00mgo\x00mgp\x00mgy\x00mhahmirimin\x00mis\x00mkkdmlalmls\x00mnonmni" + + "\x00mnw\x00moolmoe\x00moh\x00mos\x00mrarmrd\x00mrj\x00mru\x00mssamtltmtr" + + "\x00mua\x00mul\x00mus\x00mvy\x00mwk\x00mwr\x00mwv\x00mxc\x00myyamyv\x00m" + + "yx\x00myz\x00mzn\x00naaunah\x00nan\x00nap\x00naq\x00nbobnch\x00nddendc" + + "\x00nds\x00neepnew\x00ngdongl\x00nhe\x00nhw\x00nij\x00niu\x00njo\x00nlld" + + "nmg\x00nnnonnh\x00noornod\x00noe\x00non\x00nqo\x00nrblnsk\x00nso\x00nus" + + "\x00nvavnxq\x00nyyanym\x00nyn\x00nzi\x00occiojjiomrmorriosssotk\x00paanp" + + "ag\x00pal\x00pam\x00pap\x00pau\x00pcd\x00pcm\x00pdc\x00pdt\x00peo\x00pfl" + + "\x00phn\x00pilipka\x00pko\x00plolpms\x00pnt\x00pon\x00pra\x00prd\x00prg" + + "\x00psusptorpuu\x00quuequc\x00qug\x00raj\x00rcf\x00rej\x00rgn\x00ria\x00" + + "rif\x00rjs\x00rkt\x00rmohrmf\x00rmo\x00rmt\x00rmu\x00rnunrng\x00roonrob" + + "\x00rof\x00rtm\x00ruusrue\x00rug\x00rw\x00\x04rwk\x00ryu\x00saansaf\x00s" + + "ah\x00saq\x00sas\x00sat\x00saz\x00sbp\x00scrdsck\x00scn\x00sco\x00scs" + + "\x00sdndsdc\x00sdh\x00semesef\x00seh\x00sei\x00ses\x00sgagsga\x00sgs\x00" + + "sh\x00\x02shi\x00shn\x00siinsid\x00sklkskr\x00sllvsli\x00sly\x00smmosma" + + "\x00smi\x00smj\x00smn\x00smp\x00sms\x00snnasnk\x00soomsou\x00sqqisrrpsrb" + + "\x00srn\x00srr\x00srx\x00ssswssy\x00stotstq\x00suunsuk\x00sus\x00svwesww" + + "aswb\x00swc\x00swg\x00swv\x00sxn\x00syl\x00syr\x00szl\x00taamtaj\x00tbw" + + "\x00tcy\x00tdd\x00tdg\x00tdh\x00teeltem\x00teo\x00tet\x00tggkthhathl\x00" + + "thq\x00thr\x00tiirtig\x00tiv\x00tkuktkl\x00tkr\x00tkt\x00tlgltly\x00tmh" + + "\x00tnsntoontog\x00tpi\x00trurtru\x00trv\x00tssotsd\x00tsf\x00tsg\x00tsj" + + "\x00ttatttj\x00tts\x00ttt\x00tum\x00tvl\x00twwitwq\x00tyahtyv\x00tzm\x00" + + "udm\x00ugiguga\x00ukkruli\x00umb\x00und\x00unr\x00unx\x00urrduzzbvai\x00" + + "veenvec\x00vep\x00viievic\x00vls\x00vmf\x00vmw\x00voolvot\x00vro\x00vun" + + "\x00walnwae\x00wal\x00war\x00wbp\x00wbq\x00wbr\x00wls\x00wni\x00woolwtm" + + "\x00wuu\x00xav\x00xcr\x00xhhoxlc\x00xld\x00xmf\x00xmn\x00xmr\x00xna\x00x" + + "nr\x00xog\x00xpr\x00xsa\x00xsr\x00yao\x00yap\x00yav\x00ybb\x00yiidyooryr" + + "l\x00yua\x00zahazag\x00zbl\x00zdj\x00zea\x00zgh\x00zhhozmi\x00zuulzxx" + + "\x00zza\x00\xff\xff\xff\xff" + +const langNoIndexOffset = 709 + +// langNoIndex is a bit vector of all 3-letter language codes that are not used as an index +// in lookup tables. The language ids for these language codes are derived directly +// from the letters and are not consecutive. +// Size: 2197 bytes, 2197 elements +var langNoIndex = [2197]uint8{ + // Entry 0 - 3F + 0xff, 0xfd, 0xfd, 0xfe, 0xef, 0xf7, 0xbf, 0xd2, + 0xfb, 0xbf, 0xfe, 0xfa, 0xb7, 0x1d, 0x3c, 0x57, + 0x6f, 0x97, 0x73, 0xf8, 0xff, 0xef, 0xff, 0x70, + 0xaf, 0x03, 0xff, 0xff, 0xcf, 0x05, 0x85, 0x62, + 0xe9, 0xbf, 0xfd, 0xff, 0xff, 0xf7, 0xfd, 0x77, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0xc9, 0xff, 0xff, 0xff, 0x4d, 0xb8, 0x0a, 0x6a, + 0x7e, 0xfa, 0xe3, 0xfe, 0x7e, 0xff, 0x77, 0xff, + // Entry 40 - 7F + 0xff, 0xff, 0xff, 0xdf, 0x2b, 0xf4, 0xf1, 0xe0, + 0x5d, 0xe7, 0x9f, 0x14, 0x07, 0x20, 0xdf, 0xed, + 0x9f, 0x3f, 0xc9, 0x21, 0xf8, 0x3f, 0x94, 0xf7, + 0x7e, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x5f, 0xfc, 0xdb, 0xfd, 0xbf, 0xb5, + 0x7b, 0xdf, 0x7f, 0xf7, 0xeb, 0xfe, 0xff, 0xa7, + 0xbd, 0xff, 0x7f, 0xf7, 0xff, 0xef, 0xef, 0xef, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xef, 0xff, 0xdf, + // Entry 80 - BF + 0xff, 0xff, 0xf3, 0xff, 0xfb, 0x2f, 0xff, 0xff, + 0xfb, 0xee, 0xff, 0xbd, 0xdb, 0xff, 0xdf, 0xf7, + 0xff, 0xfa, 0xfd, 0xff, 0x7e, 0xaf, 0x7b, 0xfe, + 0x7f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xdf, 0xfb, 0xff, 0xfd, 0xfc, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x7f, 0xbf, 0xfd, 0xd5, + 0xa5, 0x77, 0x40, 0xff, 0x9c, 0xc1, 0x41, 0x2c, + 0x08, 0x24, 0x41, 0x00, 0x50, 0x40, 0x00, 0x80, + // Entry C0 - FF + 0xfb, 0x4a, 0xf2, 0x9f, 0xb4, 0x42, 0x41, 0x96, + 0x9b, 0x14, 0x88, 0xf6, 0x7b, 0xe7, 0x17, 0x56, + 0x55, 0x7d, 0x0e, 0x1c, 0x37, 0x71, 0xf3, 0xef, + 0x97, 0xff, 0x5d, 0x38, 0x64, 0x08, 0x00, 0x10, + 0xbc, 0x87, 0xaf, 0xdf, 0xff, 0xf7, 0x73, 0x35, + 0x3e, 0x87, 0xc7, 0xdf, 0xff, 0x00, 0x81, 0x00, + 0xb0, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x40, 0x00, 0x40, 0x92, 0x21, 0xd0, 0xbf, 0x5d, + // Entry 100 - 13F + 0xfd, 0xde, 0xfe, 0x5e, 0x00, 0x00, 0x02, 0x64, + 0x8d, 0x19, 0xc1, 0xdf, 0x79, 0x22, 0x00, 0x00, + 0x00, 0xdf, 0x6d, 0xdc, 0x26, 0xe5, 0xd9, 0xf3, + 0xfe, 0xff, 0xfd, 0xcb, 0x9f, 0x14, 0x01, 0x0c, + 0x86, 0x00, 0xd1, 0x00, 0xf0, 0xc5, 0x67, 0x5f, + 0x56, 0x89, 0x5e, 0xb7, 0xec, 0xef, 0x03, 0x00, + 0x02, 0x00, 0x00, 0x00, 0xc0, 0x77, 0xda, 0x57, + 0x90, 0x69, 0x01, 0x2c, 0x16, 0x79, 0xe4, 0xff, + // Entry 140 - 17F + 0xff, 0x7f, 0x00, 0x00, 0x00, 0x01, 0x08, 0x46, + 0x00, 0x00, 0x00, 0xb0, 0x14, 0x03, 0x50, 0x16, + 0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x09, + 0x00, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x44, 0x00, 0x00, 0x10, 0x00, 0x04, + 0x08, 0x00, 0x00, 0x04, 0x00, 0x80, 0x28, 0x04, + 0x00, 0x00, 0x50, 0xd5, 0x2d, 0x00, 0x64, 0x35, + 0x24, 0x53, 0xf5, 0xd4, 0xbd, 0xe2, 0xcd, 0x03, + // Entry 180 - 1BF + 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x17, 0x39, 0x01, 0xd9, 0x57, 0x98, + 0x21, 0x98, 0xa5, 0x00, 0x00, 0x01, 0x40, 0x82, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x40, 0x00, 0x44, 0x00, 0x00, 0xb0, 0xfe, + 0xa9, 0x39, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + // Entry 1C0 - 1FF + 0x00, 0x01, 0x28, 0x05, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x20, 0x04, 0xa6, 0x08, 0x04, 0x00, 0x08, + 0x01, 0x50, 0x00, 0x00, 0x08, 0x11, 0x86, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x06, 0x55, + 0x02, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x60, + 0x3b, 0x83, 0x11, 0x00, 0x00, 0x00, 0x11, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xbe, 0xdf, 0xff, 0xfe, 0xbf, + // Entry 200 - 23F + 0xdf, 0xc7, 0x83, 0x82, 0xc0, 0xff, 0xdf, 0x27, + 0xcf, 0x5f, 0xe7, 0x01, 0x10, 0x20, 0xb2, 0xc5, + 0xa4, 0x45, 0x25, 0x9b, 0x03, 0xcf, 0xf0, 0xdf, + 0x03, 0xc4, 0x00, 0x10, 0x01, 0x0e, 0x01, 0xe3, + 0x92, 0x54, 0xdb, 0x38, 0xf1, 0x7f, 0xf7, 0x6d, + 0xf9, 0xff, 0x1c, 0x7d, 0x04, 0x08, 0x00, 0x01, + 0x21, 0x12, 0x6c, 0x5f, 0xdd, 0x0f, 0x85, 0x4f, + 0x40, 0x40, 0x00, 0x04, 0xf9, 0xfd, 0xbd, 0xd4, + // Entry 240 - 27F + 0xe8, 0x13, 0xf4, 0x27, 0xa3, 0x0d, 0x00, 0x00, + 0x20, 0x7b, 0x39, 0x02, 0x05, 0x84, 0x00, 0xf0, + 0xbf, 0x7f, 0xda, 0x00, 0x18, 0x04, 0x81, 0x00, + 0x00, 0x00, 0x80, 0x10, 0x94, 0x1c, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x04, + 0x08, 0xb4, 0x7c, 0xa5, 0x0c, 0x40, 0x00, 0x00, + 0x11, 0x04, 0x04, 0x6c, 0x00, 0x20, 0x70, 0xff, + 0xfb, 0x7f, 0x60, 0x00, 0x05, 0x9b, 0xdd, 0x6e, + // Entry 280 - 2BF + 0x03, 0x00, 0x11, 0x00, 0x00, 0x00, 0x40, 0x05, + 0xb5, 0xb6, 0x80, 0x08, 0x04, 0x00, 0x04, 0x51, + 0xe2, 0xff, 0xfd, 0x3f, 0x05, 0x09, 0x08, 0x05, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x02, 0x60, + 0xe5, 0x48, 0x14, 0x89, 0x20, 0xc0, 0x47, 0x80, + 0x07, 0x00, 0x00, 0x00, 0xcc, 0x50, 0x40, 0x24, + 0x85, 0x47, 0x84, 0x40, 0x20, 0x10, 0x00, 0x20, + // Entry 2C0 - 2FF + 0x02, 0x50, 0x88, 0x11, 0x00, 0xd1, 0x6c, 0xee, + 0x50, 0x03, 0x1d, 0x11, 0x69, 0x06, 0x59, 0xe9, + 0x33, 0x08, 0x00, 0x20, 0x05, 0x40, 0x10, 0x00, + 0x00, 0x00, 0x50, 0x44, 0x96, 0x49, 0xd6, 0x5d, + 0xa7, 0x81, 0x45, 0x97, 0xfb, 0x00, 0x10, 0x00, + 0x08, 0x00, 0x80, 0x00, 0x40, 0x45, 0x00, 0x01, + 0x02, 0x00, 0x01, 0x40, 0x80, 0x00, 0x04, 0x08, + 0xf8, 0xeb, 0xf6, 0x39, 0xc4, 0x89, 0x16, 0x00, + // Entry 300 - 33F + 0x00, 0x0c, 0x04, 0x01, 0x20, 0x20, 0xdd, 0xa2, + 0x01, 0x00, 0x00, 0x00, 0x12, 0x04, 0x00, 0x00, + 0x04, 0x10, 0xf0, 0x9d, 0x95, 0x13, 0x04, 0x80, + 0x00, 0x00, 0xd0, 0x12, 0x40, 0x00, 0x10, 0xb0, + 0x10, 0x62, 0x4c, 0xd2, 0x02, 0x01, 0x0a, 0x00, + 0x46, 0x04, 0x00, 0x08, 0x02, 0x00, 0x20, 0xc0, + 0x00, 0x80, 0x06, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xd8, 0x6f, 0x15, 0x02, 0x08, 0x00, + // Entry 340 - 37F + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, + 0x00, 0x10, 0x00, 0x00, 0x00, 0xf8, 0x85, 0xe3, + 0xdd, 0xff, 0xff, 0xff, 0xbb, 0xff, 0x7f, 0xfb, + 0xff, 0xfc, 0xfe, 0xdf, 0xff, 0xff, 0xff, 0xf6, + 0xfb, 0xfe, 0xf7, 0x1f, 0xff, 0xb3, 0xed, 0xff, + 0xdb, 0xed, 0xff, 0xfe, 0xff, 0xfe, 0xdf, 0xff, + 0xff, 0xff, 0xf7, 0xff, 0xfd, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xdf, 0xaf, 0x9c, 0xff, 0xfb, 0xff, + // Entry 380 - 3BF + 0xff, 0xff, 0xff, 0xff, 0xef, 0xd2, 0xbb, 0xdf, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, + 0xfd, 0xff, 0xff, 0xf7, 0xfd, 0xff, 0xff, 0xff, + 0xef, 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x5f, 0xd3, 0x7b, 0xfd, 0xd9, 0xdf, 0xef, + 0xbc, 0x18, 0x05, 0x2c, 0xff, 0x07, 0xf0, 0xff, + 0xf7, 0x5f, 0x00, 0x08, 0x00, 0xc3, 0x3d, 0x1b, + 0x06, 0xe6, 0x72, 0xf0, 0xdd, 0x3c, 0x7f, 0x44, + // Entry 3C0 - 3FF + 0x02, 0x30, 0x9f, 0x7a, 0x16, 0xfd, 0xff, 0x57, + 0xf2, 0xff, 0x39, 0xff, 0xf2, 0x1e, 0x95, 0xf7, + 0xf7, 0xff, 0x45, 0x80, 0x01, 0x02, 0x00, 0x00, + 0x40, 0x54, 0x9f, 0x8a, 0xd9, 0xd9, 0x0e, 0x11, + 0x84, 0x51, 0xc0, 0xf3, 0xfb, 0x47, 0x00, 0x01, + 0x05, 0xd1, 0x50, 0x58, 0x00, 0x00, 0x00, 0x10, + 0x04, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x17, 0xd2, + 0xf9, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + // Entry 400 - 43F + 0xd7, 0x6f, 0xff, 0xff, 0xdf, 0x7d, 0xbb, 0xff, + 0xff, 0xff, 0xf7, 0xf3, 0xef, 0xff, 0xff, 0xf7, + 0xff, 0xdf, 0xdb, 0x77, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xbc, 0xff, 0xff, 0xfb, + 0xff, 0xfb, 0xff, 0xde, 0x76, 0xbd, 0xff, 0xf7, + 0xff, 0xff, 0xf7, 0xff, 0xff, 0xdf, 0xf3, 0xbf, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xde, + 0xf7, 0xbb, 0xef, 0xf7, 0xff, 0xfb, 0xbf, 0xdf, + // Entry 440 - 47F + 0xfd, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0x5f, 0x7d, + 0x7f, 0xff, 0xff, 0xf7, 0xe5, 0xfc, 0xff, 0xfd, + 0x7f, 0x7f, 0xff, 0x9e, 0xae, 0xff, 0xee, 0xff, + 0x7f, 0xf7, 0x7b, 0x02, 0x82, 0x04, 0xff, 0xf7, + 0xff, 0xbf, 0xd7, 0xef, 0xfe, 0xdf, 0xf7, 0xfe, + 0xe2, 0x8e, 0xe7, 0xff, 0xf7, 0xff, 0x56, 0xbd, + 0xcd, 0xff, 0xfb, 0xff, 0xff, 0xdf, 0xef, 0xff, + 0xe5, 0xdf, 0x7d, 0x0f, 0xa7, 0x51, 0x04, 0x44, + // Entry 480 - 4BF + 0x13, 0xd0, 0x5d, 0xaf, 0xa6, 0xfd, 0xb9, 0xff, + 0x43, 0x5d, 0x5b, 0xff, 0xff, 0xbf, 0x3f, 0x20, + 0x14, 0x00, 0x57, 0x51, 0x82, 0x65, 0xf5, 0x49, + 0xe2, 0xff, 0xfc, 0xdf, 0x00, 0x05, 0xc5, 0x05, + 0x00, 0x22, 0x00, 0x74, 0x69, 0x10, 0x08, 0x04, + 0x41, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x51, 0x60, 0x05, 0x04, 0x01, 0x00, 0x00, + 0x06, 0x01, 0x20, 0x00, 0x18, 0x01, 0x92, 0xb1, + // Entry 4C0 - 4FF + 0xfd, 0x67, 0x4b, 0x06, 0x95, 0x02, 0x57, 0xed, + 0xfb, 0x4c, 0x9d, 0x7b, 0x83, 0x04, 0x62, 0x40, + 0x00, 0x15, 0x42, 0x00, 0x00, 0x00, 0x54, 0x83, + 0xf9, 0x5f, 0x10, 0x8c, 0xc9, 0x46, 0xde, 0xf7, + 0x13, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x10, 0x00, + 0x01, 0x40, 0x00, 0xf0, 0x5b, 0xf4, 0xbe, 0x7d, + 0xba, 0xcf, 0xf7, 0xaf, 0x42, 0x04, 0x84, 0x41, + // Entry 500 - 53F + 0xb0, 0xff, 0x79, 0x7a, 0x04, 0x00, 0x00, 0x49, + 0x2d, 0x14, 0x25, 0x77, 0xed, 0xf1, 0xbf, 0xef, + 0x3f, 0x00, 0x00, 0x02, 0xc6, 0xa0, 0x1e, 0xfc, + 0xbb, 0xff, 0xfd, 0xfb, 0xb7, 0xfd, 0xf5, 0xff, + 0xfd, 0xfc, 0xd5, 0xed, 0x47, 0xf4, 0x7f, 0x10, + 0x01, 0x01, 0x84, 0x6d, 0xff, 0xf7, 0xdd, 0xf9, + 0x5f, 0x05, 0x86, 0xef, 0xf5, 0x77, 0xbd, 0x3c, + 0x00, 0x00, 0x00, 0x43, 0x71, 0x42, 0x00, 0x40, + // Entry 540 - 57F + 0x00, 0x00, 0x01, 0x43, 0x19, 0x00, 0x08, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + // Entry 580 - 5BF + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xab, 0xbd, 0xe7, 0x57, 0xee, 0x13, 0x5d, + 0x09, 0xc1, 0x40, 0x21, 0xfa, 0x17, 0x01, 0x80, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0xde, 0xff, 0xbf, + 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x30, 0x95, 0xe3, 0x10, 0x00, 0x00, 0x00, + 0x11, 0x04, 0x16, 0x00, 0x01, 0x02, 0x00, 0x81, + 0xa3, 0x01, 0x50, 0x00, 0x00, 0x83, 0x11, 0x40, + // Entry 5C0 - 5FF + 0x00, 0x00, 0x00, 0xf0, 0xdd, 0x7b, 0x7e, 0x02, + 0xaa, 0x10, 0x5d, 0xd8, 0x52, 0x00, 0x80, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x02, 0x02, + 0x09, 0x00, 0x10, 0x02, 0x10, 0x61, 0x5a, 0x9d, + 0x31, 0x00, 0x00, 0x00, 0x01, 0x50, 0x02, 0x20, + 0x00, 0x00, 0x01, 0x00, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x1f, 0xdf, 0xf2, 0xfd, 0xff, 0xfd, 0x3f, + 0x9f, 0x18, 0xcf, 0x9c, 0xbf, 0xaf, 0x5f, 0xfe, + // Entry 600 - 63F + 0x7b, 0x4b, 0x40, 0x10, 0xe1, 0xfd, 0xaf, 0xfd, + 0xb7, 0xf7, 0xff, 0xf3, 0xdf, 0xff, 0x6f, 0xf1, + 0x7b, 0xf1, 0x7f, 0xdf, 0x7f, 0xbf, 0xfe, 0xb7, + 0xee, 0x1c, 0xfb, 0xdb, 0xef, 0xdf, 0xff, 0xfd, + 0x7e, 0xbe, 0x57, 0xff, 0x6f, 0x81, 0x76, 0x1f, + 0xd4, 0x77, 0xf5, 0xfd, 0xff, 0xff, 0xeb, 0xfe, + 0xbf, 0x5f, 0x57, 0x1b, 0xeb, 0x5f, 0x50, 0x18, + 0x02, 0xfa, 0xff, 0x9d, 0x15, 0x97, 0x15, 0x0f, + // Entry 640 - 67F + 0x75, 0xc4, 0x7d, 0x81, 0x82, 0xf1, 0xd7, 0x7e, + 0xff, 0xff, 0xff, 0xef, 0xff, 0xfd, 0xdd, 0xde, + 0xbc, 0xfd, 0xf6, 0x5f, 0x7a, 0x1f, 0x40, 0x98, + 0x02, 0xff, 0xe3, 0xff, 0xf3, 0xd6, 0xf2, 0xff, + 0xfb, 0xdf, 0x7d, 0x50, 0x1e, 0x15, 0x7b, 0xb4, + 0xf5, 0xbe, 0xff, 0xff, 0xf3, 0xf7, 0xff, 0xf7, + 0x7f, 0xff, 0xff, 0xbe, 0xdb, 0xf7, 0xd7, 0xf9, + 0xef, 0x2f, 0x80, 0xbf, 0xc5, 0xff, 0xff, 0xf3, + // Entry 680 - 6BF + 0x97, 0x9d, 0xff, 0xff, 0xf7, 0xcf, 0xfd, 0xbf, + 0xde, 0x7f, 0x06, 0x1d, 0x57, 0xff, 0xf8, 0xda, + 0x5d, 0xcf, 0x7d, 0x16, 0xb9, 0xea, 0x69, 0xa0, + 0x1a, 0x20, 0x00, 0x30, 0x02, 0x04, 0x24, 0x48, + 0x04, 0x00, 0x00, 0x40, 0xd4, 0x02, 0x04, 0x00, + 0x00, 0x04, 0x00, 0x04, 0x00, 0x20, 0x01, 0x06, + 0x50, 0x00, 0x08, 0x00, 0x00, 0x00, 0x24, 0x00, + 0x04, 0x00, 0x10, 0x8c, 0x58, 0xd5, 0x0d, 0x0f, + // Entry 6C0 - 6FF + 0x14, 0x4d, 0xf1, 0x16, 0x44, 0xd1, 0x42, 0x08, + 0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00, + 0x00, 0xdc, 0xff, 0xeb, 0x1f, 0x58, 0x08, 0x41, + 0x04, 0xa0, 0x04, 0x00, 0x30, 0x12, 0x40, 0x22, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x80, 0x10, 0x10, 0xaf, + 0x6f, 0x93, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x25, 0x00, 0x00, + // Entry 700 - 73F + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x80, 0x86, 0xc2, 0x02, 0x00, 0x00, 0x00, 0x01, + 0xdf, 0x18, 0x00, 0x00, 0x02, 0xf0, 0xfd, 0x79, + 0x3b, 0x00, 0x25, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x03, 0x00, 0x09, 0x20, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 740 - 77F + 0x00, 0x00, 0x00, 0xef, 0xf7, 0xfd, 0xcf, 0x7e, + 0xa0, 0x11, 0x10, 0x00, 0x00, 0x92, 0x01, 0x44, + 0xcd, 0xf9, 0x5e, 0x00, 0x01, 0x00, 0x30, 0x14, + 0x04, 0x55, 0x10, 0x01, 0x04, 0xf6, 0x3f, 0x7a, + 0x05, 0x04, 0x00, 0xb0, 0x80, 0x00, 0x55, 0x55, + 0x97, 0x7c, 0x9f, 0x71, 0xcc, 0x78, 0xd1, 0x43, + 0xf5, 0x57, 0x67, 0x14, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2c, 0xf7, 0xdb, 0x1f, 0x50, 0x60, + // Entry 780 - 7BF + 0x03, 0x68, 0x01, 0x10, 0x8b, 0x38, 0xaa, 0x01, + 0x00, 0x00, 0x30, 0x00, 0x24, 0x44, 0x00, 0x00, + 0x10, 0x03, 0x11, 0x02, 0x01, 0x00, 0x00, 0xf0, + 0xb5, 0xff, 0xd5, 0xd7, 0xbc, 0x70, 0xd6, 0x78, + 0x78, 0x15, 0x50, 0x00, 0xa4, 0x84, 0xe9, 0x41, + 0x00, 0x00, 0x00, 0x6b, 0x39, 0x52, 0x74, 0x00, + 0xe8, 0x30, 0x90, 0x6a, 0x92, 0x00, 0x00, 0x02, + 0xff, 0xef, 0xff, 0x4f, 0x85, 0x53, 0xf4, 0xed, + // Entry 7C0 - 7FF + 0xdd, 0xbf, 0x72, 0x19, 0xc7, 0x0c, 0xf5, 0x42, + 0x54, 0xdd, 0x77, 0x14, 0x00, 0x80, 0xc0, 0x56, + 0xcc, 0x16, 0x9e, 0xfb, 0x35, 0x7d, 0xef, 0xff, + 0xbd, 0xa4, 0xaf, 0x01, 0x44, 0x18, 0x01, 0x5d, + 0x4e, 0x4a, 0x08, 0x50, 0x28, 0x30, 0xe0, 0x80, + 0x10, 0x20, 0x24, 0x00, 0xff, 0x3f, 0xdf, 0x67, + 0xfe, 0x01, 0x06, 0x88, 0x0a, 0x40, 0x16, 0x01, + 0x01, 0x15, 0x2b, 0x3e, 0x01, 0x00, 0x00, 0x10, + // Entry 800 - 83F + 0x90, 0x69, 0x45, 0x02, 0x02, 0x01, 0xe1, 0xbf, + 0xbf, 0x03, 0x00, 0x00, 0x10, 0xd4, 0xa7, 0xd1, + 0x54, 0x9e, 0x44, 0xdf, 0xfd, 0x8f, 0x66, 0xb3, + 0x55, 0x20, 0xd4, 0xc3, 0xd8, 0x30, 0x3d, 0x80, + 0x00, 0x00, 0x00, 0x4c, 0xd4, 0x10, 0xc5, 0x84, + 0x6e, 0x50, 0x00, 0x22, 0x50, 0x7e, 0xbf, 0xdb, + 0x07, 0x00, 0x20, 0x10, 0x84, 0xb2, 0x45, 0x10, + 0x06, 0x44, 0x00, 0x00, 0x12, 0x02, 0x11, 0x00, + // Entry 840 - 87F + 0xf0, 0xfb, 0xfd, 0x3f, 0x05, 0x00, 0x12, 0x81, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x02, 0x28, + 0x84, 0x00, 0x33, 0xc0, 0x23, 0x24, 0x00, 0x00, + 0x00, 0xcb, 0xe4, 0x3a, 0x42, 0xc8, 0x14, 0xf1, + 0xef, 0xff, 0x7f, 0x16, 0x01, 0x01, 0x84, 0x50, + 0x07, 0xfc, 0xff, 0xff, 0x0f, 0x01, 0x00, 0x40, + 0x10, 0x38, 0x01, 0x01, 0x1c, 0x12, 0x40, 0xe1, + // Entry 880 - 8BF + 0x76, 0x16, 0x08, 0x03, 0x10, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x24, + 0x0a, 0x00, 0x80, 0x00, 0x00, +} + +// altLangISO3 holds an alphabetically sorted list of 3-letter language code alternatives +// to 2-letter language codes that cannot be derived using the method described above. +// Each 3-letter code is followed by its 1-byte langID. +var altLangISO3 tag.Index = "---\x00cor\x00hbs\x01heb\x02kin\x03spa\x04yid\x05\xff\xff\xff\xff" + +// altLangIndex is used to convert indexes in altLangISO3 to langIDs. +// Size: 12 bytes, 6 elements +var altLangIndex = [6]uint16{ + 0x0149, 0x0223, 0x0104, 0x0208, 0x009c, 0x010a, +} + +// langAliasMap maps langIDs to their suggested replacements. +// Size: 556 bytes, 139 elements +var langAliasMap = [139]fromTo{ + 0: {from: 0xfe, to: 0xf7}, + 1: {from: 0x104, to: 0xdf}, + 2: {from: 0x10a, to: 0x2b6}, + 3: {from: 0x10f, to: 0x10e}, + 4: {from: 0x191, to: 0x201}, + 5: {from: 0x1ae, to: 0x1c0}, + 6: {from: 0x223, to: 0x239}, + 7: {from: 0x266, to: 0xa9}, + 8: {from: 0x272, to: 0x250}, + 9: {from: 0x27b, to: 0xd}, + 10: {from: 0x2d1, to: 0x2d7}, + 11: {from: 0x322, to: 0x92}, + 12: {from: 0x3c3, to: 0x1c44}, + 13: {from: 0x3e4, to: 0x238}, + 14: {from: 0x3f5, to: 0x238}, + 15: {from: 0x480, to: 0x15}, + 16: {from: 0x48b, to: 0xf2}, + 17: {from: 0x4d1, to: 0x1f34}, + 18: {from: 0x546, to: 0x23}, + 19: {from: 0x54c, to: 0x272e}, + 20: {from: 0x558, to: 0x24}, + 21: {from: 0x579, to: 0xa0}, + 22: {from: 0x59f, to: 0x26}, + 23: {from: 0x5a8, to: 0x42}, + 24: {from: 0x656, to: 0xc76}, + 25: {from: 0x782, to: 0x1a4}, + 26: {from: 0x7c9, to: 0x16d}, + 27: {from: 0x7d0, to: 0x59}, + 28: {from: 0x851, to: 0x30b5}, + 29: {from: 0x8cb, to: 0x2c0}, + 30: {from: 0x908, to: 0x23ed}, + 31: {from: 0x911, to: 0x956}, + 32: {from: 0x92e, to: 0x24d}, + 33: {from: 0x94f, to: 0x3fbc}, + 34: {from: 0x952, to: 0x2c0}, + 35: {from: 0xa4c, to: 0x73}, + 36: {from: 0xa9b, to: 0x79}, + 37: {from: 0xb5b, to: 0x8a}, + 38: {from: 0xb6a, to: 0x1a1}, + 39: {from: 0xb8b, to: 0xb8e}, + 40: {from: 0xb91, to: 0x2c4}, + 41: {from: 0xc72, to: 0x1ded}, + 42: {from: 0xc81, to: 0x2c2d}, + 43: {from: 0xccc, to: 0x1bc}, + 44: {from: 0xe63, to: 0x9e}, + 45: {from: 0xe97, to: 0x178}, + 46: {from: 0xf33, to: 0xfb}, + 47: {from: 0x100c, to: 0xd}, + 48: {from: 0x11b7, to: 0xae}, + 49: {from: 0x1203, to: 0xa5}, + 50: {from: 0x12b2, to: 0xb2e}, + 51: {from: 0x12b6, to: 0x1d1}, + 52: {from: 0x12c5, to: 0x1458}, + 53: {from: 0x1313, to: 0x110}, + 54: {from: 0x1316, to: 0x85}, + 55: {from: 0x1336, to: 0x3a42}, + 56: {from: 0x13fd, to: 0xcb}, + 57: {from: 0x145b, to: 0x99}, + 58: {from: 0x1493, to: 0x278b}, + 59: {from: 0x14ab, to: 0xc9}, + 60: {from: 0x150d, to: 0x12b7}, + 61: {from: 0x159c, to: 0x1549}, + 62: {from: 0x15a9, to: 0x1686}, + 63: {from: 0x161d, to: 0x23d}, + 64: {from: 0x170c, to: 0x1a94}, + 65: {from: 0x1807, to: 0x2943}, + 66: {from: 0x181d, to: 0x101}, + 67: {from: 0x18ed, to: 0x103}, + 68: {from: 0x1919, to: 0x12a8}, + 69: {from: 0x1dd0, to: 0x1e70}, + 70: {from: 0x1ded, to: 0x18e}, + 71: {from: 0x1e76, to: 0x144}, + 72: {from: 0x1e81, to: 0x13a}, + 73: {from: 0x1e85, to: 0x121}, + 74: {from: 0x1e8c, to: 0x137}, + 75: {from: 0x1ea2, to: 0x1f7e}, + 76: {from: 0x1ec8, to: 0x146}, + 77: {from: 0x1f79, to: 0x4231}, + 78: {from: 0x1f87, to: 0x3716}, + 79: {from: 0x1ff5, to: 0x6bd}, + 80: {from: 0x20a9, to: 0x2fb9}, + 81: {from: 0x2115, to: 0x30f8}, + 82: {from: 0x2205, to: 0x16f}, + 83: {from: 0x2277, to: 0x18b}, + 84: {from: 0x2283, to: 0x188}, + 85: {from: 0x228d, to: 0x199}, + 86: {from: 0x22e3, to: 0x8ee}, + 87: {from: 0x233c, to: 0x69}, + 88: {from: 0x23d1, to: 0x178}, + 89: {from: 0x245c, to: 0x2447}, + 90: {from: 0x248c, to: 0x1f2}, + 91: {from: 0x24ba, to: 0x3a42}, + 92: {from: 0x24f8, to: 0x2447}, + 93: {from: 0x2682, to: 0x25ca}, + 94: {from: 0x26a7, to: 0x1b3}, + 95: {from: 0x28ad, to: 0x1d0}, + 96: {from: 0x298f, to: 0x1d2}, + 97: {from: 0x29d2, to: 0x3a42}, + 98: {from: 0x2a8f, to: 0x1ec}, + 99: {from: 0x2aa6, to: 0x32a}, + 100: {from: 0x2ada, to: 0xa3}, + 101: {from: 0x2adb, to: 0xa3}, + 102: {from: 0x2b92, to: 0x182}, + 103: {from: 0x2bad, to: 0x2b28}, + 104: {from: 0x2bb4, to: 0x151}, + 105: {from: 0x2bf8, to: 0x2015}, + 106: {from: 0x2c82, to: 0x2c6a}, + 107: {from: 0x2f26, to: 0x1ef}, + 108: {from: 0x30f9, to: 0x3121}, + 109: {from: 0x31bd, to: 0x201}, + 110: {from: 0x3281, to: 0x1663}, + 111: {from: 0x3379, to: 0x228}, + 112: {from: 0x33eb, to: 0x131}, + 113: {from: 0x3409, to: 0x213}, + 114: {from: 0x3490, to: 0x246}, + 115: {from: 0x35be, to: 0x2a2e}, + 116: {from: 0x35c2, to: 0x4c}, + 117: {from: 0x35c5, to: 0x2fbb}, + 118: {from: 0x35ff, to: 0x3739}, + 119: {from: 0x3625, to: 0x3d53}, + 120: {from: 0x3648, to: 0x2c2d}, + 121: {from: 0x36ef, to: 0x268}, + 122: {from: 0x38e1, to: 0xb24}, + 123: {from: 0x390b, to: 0xe8d}, + 124: {from: 0x3a2c, to: 0x28a}, + 125: {from: 0x3d50, to: 0x7f}, + 126: {from: 0x4051, to: 0x306}, + 127: {from: 0x410b, to: 0x139}, + 128: {from: 0x415e, to: 0x345e}, + 129: {from: 0x4160, to: 0x86}, + 130: {from: 0x4242, to: 0x30b5}, + 131: {from: 0x4276, to: 0x2b6}, + 132: {from: 0x435d, to: 0x219c}, + 133: {from: 0x4370, to: 0x246f}, + 134: {from: 0x43a3, to: 0x4641}, + 135: {from: 0x4441, to: 0x4433}, + 136: {from: 0x44d1, to: 0x44d8}, + 137: {from: 0x46a9, to: 0x199}, + 138: {from: 0x473a, to: 0x2ba}, +} + +// Size: 139 bytes, 139 elements +var langAliasTypes = [139]langAliasType{ + // Entry 0 - 3F + 0, 0, 0, 0, 0, 1, 2, 2, 0, 1, 0, 0, 1, 2, 1, 1, + 2, 0, 1, 0, 1, 2, 1, 1, 0, 2, 1, 1, 0, 2, 0, 0, + 1, 0, 1, 1, 2, 1, 1, 1, 1, 0, 0, 2, 1, 1, 1, 1, + 2, 1, 0, 1, 1, 2, 2, 0, 1, 2, 0, 1, 1, 1, 1, 1, + // Entry 40 - 7F + 0, 0, 2, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, + 0, 0, 1, 2, 2, 2, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, + 1, 0, 1, 0, 2, 1, 1, 0, 1, 0, 0, 1, 1, 2, 0, 2, + 1, 1, 1, 0, 2, 0, 0, 0, 0, 1, 1, 0, 1, 2, 0, 1, + // Entry 80 - BF + 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, +} + +const ( + _Latn = 79 + _Hani = 48 + _Hans = 50 + _Hant = 51 + _Qaaa = 125 + _Qaai = 133 + _Qabx = 174 + _Zinh = 218 + _Zyyy = 222 + _Zzzz = 223 +) + +// script is an alphabetically sorted list of ISO 15924 codes. The index +// of the script in the string, divided by 4, is the internal scriptID. +var script tag.Index = "" + // Size: 900 bytes + "----AdlmAfakAghbAhomArabAranArmiArmnAvstBaliBamuBassBatkBengBlisBopoBrah" + + "BraiBugiBuhdCakmCansCariChamCherCirtCoptCprtCyrlCyrsDevaDsrtDuplEgydEgyh" + + "EgypElbaEthiGeokGeorGlagGothGranGrekGujrGuruHangHaniHanoHansHantHatrHebr" + + "HiraHluwHmngHrktHungIndsItalJavaJpanJurcKaliKanaKharKhmrKhojKitlKitsKnda" + + "KoreKpelKthiLanaLaooLatfLatgLatnLepcLimbLinaLinbLisuLomaLyciLydiMahjMand" + + "ManiMarcMayaMendMercMeroMlymModiMongMoonMrooMteiMultMymrNarbNbatNkgbNkoo" + + "NshuOgamOlckOrkhOryaOsgeOsmaPalmPaucPermPhagPhliPhlpPhlvPhnxPlrdPrtiQaaa" + + "QaabQaacQaadQaaeQaafQaagQaahQaaiQaajQaakQaalQaamQaanQaaoQaapQaaqQaarQaas" + + "QaatQaauQaavQaawQaaxQaayQaazQabaQabbQabcQabdQabeQabfQabgQabhQabiQabjQabk" + + "QablQabmQabnQaboQabpQabqQabrQabsQabtQabuQabvQabwQabxRjngRoroRunrSamrSara" + + "SarbSaurSgnwShawShrdSiddSindSinhSoraSundSyloSyrcSyreSyrjSyrnTagbTakrTale" + + "TaluTamlTangTavtTeluTengTfngTglgThaaThaiTibtTirhUgarVaiiVispWaraWoleXpeo" + + "XsuxYiiiZinhZmthZsymZxxxZyyyZzzz\xff\xff\xff\xff" + +// suppressScript is an index from langID to the dominant script for that language, +// if it exists. If a script is given, it should be suppressed from the language tag. +// Size: 709 bytes, 709 elements +var suppressScript = [709]uint8{ + // Entry 0 - 3F + 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x26, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 40 - 7F + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, + // Entry 80 - BF + 0x4f, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0xce, + 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x2c, 0x4f, 0x4f, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x4f, + 0x00, 0x00, 0x00, 0x4f, 0x4f, 0x00, 0x4f, 0x00, + 0x00, 0x4f, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4f, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry C0 - FF + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, + 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x4f, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x4f, 0x00, + 0x4f, 0x4f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x4f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x00, + // Entry 100 - 13F + 0x00, 0x4f, 0x4f, 0x00, 0x35, 0x00, 0x3e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, + 0x4f, 0x00, 0x43, 0x00, 0x47, 0x48, 0x00, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 140 - 17F + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x4f, 0x4c, 0x00, 0x00, 0x00, + 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x00, + // Entry 180 - 1BF + 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x4f, + 0x00, 0x00, 0x00, 0x1d, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x4f, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, + 0x00, 0x4f, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, + 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x1f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + // Entry 1C0 - 1FF + 0x4f, 0x00, 0x00, 0x00, 0x6b, 0x4f, 0x00, 0x4f, + 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x4f, 0x70, 0x00, 0x00, 0x2e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x4f, 0x00, 0x4f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x4f, + // Entry 200 - 23F + 0x00, 0x4f, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, + 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x00, 0x4f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x00, + // Entry 240 - 27F + 0x4f, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x4f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc7, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xca, 0x4f, + 0x00, 0x00, 0x00, 0xcf, 0x00, 0x00, 0x00, 0x26, + 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x4f, 0x00, + 0x4f, 0x4f, 0x4f, 0x00, 0x4f, 0x4f, 0x00, 0x00, + 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, + // Entry 280 - 2BF + 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x05, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x4f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, + // Entry 2C0 - 2FF + 0x00, 0x00, 0x4f, 0x00, 0x00, +} + +const ( + _001 = 1 + _419 = 30 + _BR = 64 + _CA = 72 + _ES = 109 + _GB = 121 + _MD = 186 + _PT = 236 + _UK = 304 + _US = 306 + _ZZ = 354 + _XA = 320 + _XC = 322 + _XK = 330 +) + +// isoRegionOffset needs to be added to the index of regionISO to obtain the regionID +// for 2-letter ISO codes. (The first isoRegionOffset regionIDs are reserved for +// the UN.M49 codes used for groups.) +const isoRegionOffset = 31 + +// regionTypes defines the status of a region for various standards. +// Size: 355 bytes, 355 elements +var regionTypes = [355]uint8{ + // Entry 0 - 3F + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + // Entry 40 - 7F + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + // Entry 80 - BF + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x00, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, + // Entry C0 - FF + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, + 0x06, 0x06, 0x00, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, + 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + // Entry 100 - 13F + 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x02, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, + // Entry 140 - 17F + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x05, +} + +// regionISO holds a list of alphabetically sorted 2-letter ISO region codes. +// Each 2-letter codes is followed by two bytes with the following meaning: +// - [A-Z}{2}: the first letter of the 2-letter code plus these two +// letters form the 3-letter ISO code. +// - 0, n: index into altRegionISO3. +var regionISO tag.Index = "" + // Size: 1300 bytes + "AAAAACSCADNDAEREAFFGAGTGAIIAALLBAMRMANNTAOGOAQTAARRGASSMATUTAUUSAWBWAXLA" + + "AZZEBAIHBBRBBDGDBEELBFFABGGRBHHRBIDIBJENBLLMBMMUBNRNBOOLBQESBRRABSHSBTTN" + + "BUURBVVTBWWABYLRBZLZCAANCCCKCDODCFAFCGOGCHHECIIVCKOKCLHLCMMRCNHNCOOLCPPT" + + "CRRICS\x00\x00CTTECUUBCVPVCWUWCXXRCYYPCZZEDDDRDEEUDGGADJJIDKNKDMMADOOMDY" + + "HYDZZAEA ECCUEESTEGGYEHSHERRIESSPETTHEU\x00\x03FIINFJJIFKLKFMSMFOROFQ" + + "\x00\x18FRRAFXXXGAABGBBRGDRDGEEOGFUFGGGYGHHAGIIBGLRLGMMBGNINGPLPGQNQGRRC" + + "GS\x00\x06GTTMGUUMGWNBGYUYHKKGHMMDHNNDHRRVHTTIHUUNHVVOIC IDDNIERLILSRIM" + + "MNINNDIOOTIQRQIRRNISSLITTAJEEYJMAMJOORJPPNJTTNKEENKGGZKHHMKIIRKM\x00\x09" + + "KNNAKP\x00\x0cKRORKWWTKY\x00\x0fKZAZLAAOLBBNLCCALIIELKKALRBRLSSOLTTULUUX" + + "LVVALYBYMAARMCCOMDDAMENEMFAFMGDGMHHLMIIDMKKDMLLIMMMRMNNGMOACMPNPMQTQMRRT" + + "MSSRMTLTMUUSMVDVMWWIMXEXMYYSMZOZNAAMNCCLNEERNFFKNGGANHHBNIICNLLDNOORNPPL" + + "NQ\x00\x1eNRRUNTTZNUIUNZZLOMMNPAANPCCIPEERPFYFPGNGPHHLPKAKPLOLPM\x00\x12" + + "PNCNPRRIPSSEPTRTPUUSPWLWPYRYPZCZQAATQMMMQNNNQOOOQPPPQQQQQRRRQSSSQTTTQU" + + "\x00\x03QVVVQWWWQXXXQYYYQZZZREEURHHOROOURS\x00\x15RUUSRWWASAAUSBLBSCYCSD" + + "DNSEWESGGPSHHNSIVNSJJMSKVKSLLESMMRSNENSOOMSRURSSSDSTTPSUUNSVLVSXXMSYYRSZ" + + "WZTAAATCCATDCDTF\x00\x18TGGOTHHATJJKTKKLTLLSTMKMTNUNTOONTPMPTRURTTTOTVUV" + + "TWWNTZZAUAKRUGGAUK UMMIUSSAUYRYUZZBVAATVCCTVDDRVEENVGGBVIIRVNNMVUUTWFLF" + + "WKAKWSSMXAAAXBBBXCCCXDDDXEEEXFFFXGGGXHHHXIIIXJJJXKKKXLLLXMMMXNNNXOOOXPPP" + + "XQQQXRRRXSSSXTTTXUUUXVVVXWWWXXXXXYYYXZZZYDMDYEEMYT\x00\x1bYUUGZAAFZMMBZR" + + "ARZWWEZZZZ\xff\xff\xff\xff" + +// altRegionISO3 holds a list of 3-letter region codes that cannot be +// mapped to 2-letter codes using the default algorithm. This is a short list. +var altRegionISO3 string = "SCGQUUSGSCOMPRKCYMSPMSRBATFMYTATN" + +// altRegionIDs holds a list of regionIDs the positions of which match those +// of the 3-letter ISO codes in altRegionISO3. +// Size: 22 bytes, 11 elements +var altRegionIDs = [11]uint16{ + 0x0056, 0x006f, 0x0086, 0x00a6, 0x00a8, 0x00ab, 0x00e8, 0x0103, + 0x011f, 0x015c, 0x00da, +} + +// Size: 80 bytes, 20 elements +var regionOldMap = [20]fromTo{ + 0: {from: 0x43, to: 0xc2}, + 1: {from: 0x57, to: 0xa5}, + 2: {from: 0x5e, to: 0x5f}, + 3: {from: 0x65, to: 0x3a}, + 4: {from: 0x77, to: 0x76}, + 5: {from: 0x91, to: 0x36}, + 6: {from: 0xa1, to: 0x131}, + 7: {from: 0xbf, to: 0x131}, + 8: {from: 0xd5, to: 0x13c}, + 9: {from: 0xda, to: 0x2a}, + 10: {from: 0xed, to: 0x131}, + 11: {from: 0xf0, to: 0xe0}, + 12: {from: 0xfa, to: 0x6f}, + 13: {from: 0x101, to: 0x161}, + 14: {from: 0x128, to: 0x124}, + 15: {from: 0x130, to: 0x79}, + 16: {from: 0x137, to: 0x13b}, + 17: {from: 0x13e, to: 0x131}, + 18: {from: 0x15a, to: 0x15b}, + 19: {from: 0x160, to: 0x4a}, +} + +// m49 maps regionIDs to UN.M49 codes. The first isoRegionOffset entries are +// codes indicating collections of regions. +// Size: 710 bytes, 355 elements +var m49 = [355]int16{ + // Entry 0 - 3F + 0, 1, 2, 3, 5, 9, 11, 13, + 14, 15, 17, 18, 19, 21, 29, 30, + 34, 35, 39, 53, 54, 57, 61, 142, + 143, 145, 150, 151, 154, 155, 419, 958, + 0, 20, 784, 4, 28, 660, 8, 51, + 530, 24, 10, 32, 16, 40, 36, 533, + 248, 31, 70, 52, 50, 56, 854, 100, + 48, 108, 204, 652, 60, 96, 68, 535, + // Entry 40 - 7F + 76, 44, 64, 104, 74, 72, 112, 84, + 124, 166, 180, 140, 178, 756, 384, 184, + 152, 120, 156, 170, 0, 188, 891, 296, + 192, 132, 531, 162, 196, 203, 278, 276, + 0, 262, 208, 212, 214, 204, 12, 0, + 218, 233, 818, 732, 232, 724, 231, 967, + 246, 242, 238, 583, 234, 0, 250, 249, + 266, 826, 308, 268, 254, 831, 288, 292, + // Entry 80 - BF + 304, 270, 324, 312, 226, 300, 239, 320, + 316, 624, 328, 344, 334, 340, 191, 332, + 348, 854, 0, 360, 372, 376, 833, 356, + 86, 368, 364, 352, 380, 832, 388, 400, + 392, 581, 404, 417, 116, 296, 174, 659, + 408, 410, 414, 136, 398, 418, 422, 662, + 438, 144, 430, 426, 440, 442, 428, 434, + 504, 492, 498, 499, 663, 450, 584, 581, + // Entry C0 - FF + 807, 466, 104, 496, 446, 580, 474, 478, + 500, 470, 480, 462, 454, 484, 458, 508, + 516, 540, 562, 574, 566, 548, 558, 528, + 578, 524, 10, 520, 536, 570, 554, 512, + 591, 0, 604, 258, 598, 608, 586, 616, + 666, 612, 630, 275, 620, 581, 585, 600, + 591, 634, 959, 960, 961, 962, 963, 964, + 965, 966, 967, 968, 969, 970, 971, 972, + // Entry 100 - 13F + 638, 716, 642, 688, 643, 646, 682, 90, + 690, 729, 752, 702, 654, 705, 744, 703, + 694, 674, 686, 706, 740, 728, 678, 810, + 222, 534, 760, 748, 0, 796, 148, 260, + 768, 764, 762, 772, 626, 795, 788, 776, + 626, 792, 780, 798, 158, 834, 804, 800, + 826, 581, 840, 858, 860, 336, 670, 704, + 862, 92, 850, 704, 548, 876, 581, 882, + // Entry 140 - 17F + 973, 974, 975, 976, 977, 978, 979, 980, + 981, 982, 983, 984, 985, 986, 987, 988, + 989, 990, 991, 992, 993, 994, 995, 996, + 997, 998, 720, 887, 175, 891, 710, 894, + 180, 716, 999, +} + +// m49Index gives indexes into fromM49 based on the three most significant bits +// of a 10-bit UN.M49 code. To search an UN.M49 code in fromM49, search in +// fromM49[m49Index[msb39(code)]:m49Index[msb3(code)+1]] +// for an entry where the first 7 bits match the 7 lsb of the UN.M49 code. +// The region code is stored in the 9 lsb of the indexed value. +// Size: 18 bytes, 9 elements +var m49Index = [9]int16{ + 0, 59, 107, 142, 180, 219, 258, 290, + 332, +} + +// fromM49 contains entries to map UN.M49 codes to regions. See m49Index for details. +// Size: 664 bytes, 332 elements +var fromM49 = [332]uint16{ + // Entry 0 - 3F + 0x0201, 0x0402, 0x0603, 0x0823, 0x0a04, 0x1026, 0x1205, 0x142a, + 0x1606, 0x1866, 0x1a07, 0x1c08, 0x1e09, 0x202c, 0x220a, 0x240b, + 0x260c, 0x2821, 0x2a0d, 0x3029, 0x3824, 0x3a0e, 0x3c0f, 0x3e31, + 0x402b, 0x4410, 0x4611, 0x482e, 0x4e12, 0x502d, 0x5841, 0x6038, + 0x6434, 0x6627, 0x6833, 0x6a13, 0x6c14, 0x7035, 0x7215, 0x783c, + 0x7a16, 0x8042, 0x883e, 0x8c32, 0x9045, 0x9444, 0x9840, 0xa847, + 0xac98, 0xb507, 0xb939, 0xc03d, 0xc837, 0xd0c2, 0xd839, 0xe046, + 0xe8a4, 0xf051, 0xf848, 0x0859, 0x10ab, 0x184b, 0x1c17, 0x1e18, + // Entry 40 - 7F + 0x20b1, 0x2219, 0x291e, 0x2c1a, 0x2e1b, 0x3050, 0x341c, 0x361d, + 0x3852, 0x3d2c, 0x445b, 0x4c49, 0x5453, 0x5ca6, 0x5f5c, 0x644c, + 0x684a, 0x704f, 0x7855, 0x7e8e, 0x8058, 0x885c, 0x965d, 0x983a, + 0xa062, 0xa863, 0xac64, 0xb468, 0xbd18, 0xc484, 0xcc6e, 0xce6e, + 0xd06c, 0xd269, 0xd474, 0xdc72, 0xde86, 0xe471, 0xec70, 0xf030, + 0xf277, 0xf476, 0xfc7c, 0x04e3, 0x091f, 0x0c61, 0x1478, 0x187b, + 0x1c81, 0x26eb, 0x285f, 0x2c5e, 0x305f, 0x407e, 0x487f, 0x50a5, + 0x5885, 0x6080, 0x687a, 0x7083, 0x7888, 0x8087, 0x8882, 0x908a, + // Entry 80 - BF + 0x988f, 0x9c8c, 0xa135, 0xa88d, 0xb08b, 0xb890, 0xc09b, 0xc897, + 0xd093, 0xd89a, 0xe099, 0xe894, 0xf095, 0xf89c, 0x004e, 0x089e, + 0x10a0, 0x1cac, 0x209f, 0x28a2, 0x30a8, 0x34a9, 0x3caa, 0x42a3, + 0x44ad, 0x461e, 0x4cae, 0x54b3, 0x58b6, 0x5cb2, 0x64b7, 0x6cb0, + 0x70b4, 0x74b5, 0x7cc4, 0x84bd, 0x8ccc, 0x94ce, 0x9ccb, 0xa4c1, + 0xacc9, 0xb4c6, 0xbcc7, 0xc0ca, 0xc8cd, 0xd8b9, 0xe0c3, 0xe4ba, + 0xe6bb, 0xe8c8, 0xf0b8, 0xf8cf, 0x00df, 0x08d0, 0x10db, 0x18d9, + 0x20d7, 0x2428, 0x265a, 0x2a2f, 0x2d19, 0x2e3f, 0x30dc, 0x38d1, + // Entry C0 - FF + 0x493c, 0x54de, 0x5cd6, 0x64d2, 0x6cd4, 0x74dd, 0x7cd3, 0x84d8, + 0x88c5, 0x8b31, 0x8e73, 0x90be, 0x92ee, 0x94e6, 0x9ee0, 0xace4, + 0xb0ef, 0xb8e2, 0xc0e5, 0xc8e9, 0xd0e7, 0xd8ec, 0xe089, 0xe524, + 0xecea, 0xf4f1, 0xfd00, 0x0502, 0x0704, 0x0d05, 0x183b, 0x1d0c, + 0x26a7, 0x2825, 0x2caf, 0x2ebc, 0x34e8, 0x3d36, 0x4511, 0x4d16, + 0x5506, 0x5d12, 0x6103, 0x6508, 0x6d10, 0x7d0b, 0x7f0f, 0x813b, + 0x830d, 0x8513, 0x8d5e, 0x9961, 0xa15a, 0xa86d, 0xb115, 0xb309, + 0xb86b, 0xc109, 0xc914, 0xd10e, 0xd91b, 0xe10a, 0xe84d, 0xf11a, + // Entry 100 - 13F + 0xf522, 0xf921, 0x0120, 0x0923, 0x1127, 0x192a, 0x2022, 0x2926, + 0x3129, 0x3725, 0x391d, 0x3d2b, 0x412f, 0x492e, 0x4ec0, 0x5517, + 0x646a, 0x7479, 0x7e7d, 0x809d, 0x8296, 0x852d, 0x9132, 0xa53a, + 0xac36, 0xb533, 0xb934, 0xbd38, 0xd93d, 0xe53f, 0xed5b, 0xef5b, + 0xf656, 0xfd5f, 0x7c1f, 0x7ef2, 0x80f3, 0x82f4, 0x84f5, 0x86f6, + 0x88f7, 0x8af8, 0x8cf9, 0x8e6f, 0x90fb, 0x92fc, 0x94fd, 0x96fe, + 0x98ff, 0x9b40, 0x9d41, 0x9f42, 0xa143, 0xa344, 0xa545, 0xa746, + 0xa947, 0xab48, 0xad49, 0xaf4a, 0xb14b, 0xb34c, 0xb54d, 0xb74e, + // Entry 140 - 17F + 0xb94f, 0xbb50, 0xbd51, 0xbf52, 0xc153, 0xc354, 0xc555, 0xc756, + 0xc957, 0xcb58, 0xcd59, 0xcf62, +} + +// Size: 1311 bytes +var variantIndex = map[string]uint8{ + "1606nict": 0x0, + "1694acad": 0x1, + "1901": 0x2, + "1959acad": 0x3, + "1994": 0x3f, + "1996": 0x4, + "alalc97": 0x41, + "aluku": 0x5, + "arevela": 0x6, + "arevmda": 0x7, + "baku1926": 0x8, + "balanka": 0x9, + "barla": 0xa, + "bauddha": 0xb, + "biscayan": 0xc, + "biske": 0x3a, + "bohoric": 0xd, + "boont": 0xe, + "dajnko": 0xf, + "ekavsk": 0x10, + "emodeng": 0x11, + "fonipa": 0x42, + "fonupa": 0x43, + "fonxsamp": 0x44, + "hepburn": 0x12, + "heploc": 0x40, + "hognorsk": 0x13, + "ijekavsk": 0x14, + "itihasa": 0x15, + "jauer": 0x16, + "jyutping": 0x17, + "kkcor": 0x18, + "kociewie": 0x19, + "kscor": 0x1a, + "laukika": 0x1b, + "lipaw": 0x3b, + "luna1918": 0x1c, + "metelko": 0x1d, + "monoton": 0x1e, + "ndyuka": 0x1f, + "nedis": 0x20, + "njiva": 0x3c, + "nulik": 0x21, + "osojs": 0x3d, + "oxendict": 0x22, + "pamaka": 0x23, + "petr1708": 0x24, + "pinyin": 0x25, + "polyton": 0x26, + "puter": 0x27, + "rigik": 0x28, + "rozaj": 0x29, + "rumgr": 0x2a, + "scotland": 0x2b, + "scouse": 0x2c, + "solba": 0x3e, + "sotav": 0x2d, + "surmiran": 0x2e, + "sursilv": 0x2f, + "sutsilv": 0x30, + "tarask": 0x31, + "uccor": 0x32, + "ucrcor": 0x33, + "ulster": 0x34, + "unifon": 0x35, + "vaidika": 0x36, + "valencia": 0x37, + "vallader": 0x38, + "wadegile": 0x39, +} + +// variantNumSpecialized is the number of specialized variants in variants. +const variantNumSpecialized = 65 + +// nRegionGroups is the number of region groups. +const nRegionGroups = 32 + +type likelyLangRegion struct { + lang uint16 + region uint16 +} + +// likelyScript is a lookup table, indexed by scriptID, for the most likely +// languages and regions given a script. +// Size: 900 bytes, 225 elements +var likelyScript = [225]likelyLangRegion{ + 3: {lang: 0x158, region: 0x104}, + 4: {lang: 0xc, region: 0x97}, + 5: {lang: 0x15, region: 0x6a}, + 7: {lang: 0x16, region: 0x9a}, + 8: {lang: 0xf2, region: 0x27}, + 9: {lang: 0x8, region: 0x9a}, + 10: {lang: 0x27, region: 0x93}, + 11: {lang: 0x2b, region: 0x51}, + 12: {lang: 0x55, region: 0xb2}, + 13: {lang: 0x2c, region: 0x93}, + 14: {lang: 0x4b, region: 0x34}, + 16: {lang: 0x2c0, region: 0x12c}, + 17: {lang: 0x1e3, region: 0x97}, + 18: {lang: 0xae, region: 0x76}, + 19: {lang: 0x5b, region: 0x93}, + 20: {lang: 0x47, region: 0xe5}, + 21: {lang: 0x63, region: 0x34}, + 22: {lang: 0x73, region: 0x48}, + 23: {lang: 0x2a5, region: 0x129}, + 24: {lang: 0x6e, region: 0x13b}, + 25: {lang: 0x6c, region: 0x132}, + 27: {lang: 0x71, region: 0x6a}, + 28: {lang: 0xcf, region: 0x5c}, + 29: {lang: 0x205, region: 0x104}, + 31: {lang: 0xe0, region: 0x97}, + 33: {lang: 0xae, region: 0x76}, + 36: {lang: 0x97, region: 0x6a}, + 37: {lang: 0x238, region: 0x26}, + 38: {lang: 0x11, region: 0x6e}, + 40: {lang: 0x110, region: 0x7b}, + 41: {lang: 0x7d, region: 0x37}, + 42: {lang: 0xce, region: 0x12e}, + 43: {lang: 0x20b, region: 0x97}, + 44: {lang: 0x99, region: 0x85}, + 45: {lang: 0xd2, region: 0x97}, + 46: {lang: 0x1d5, region: 0x97}, + 47: {lang: 0x135, region: 0xa9}, + 48: {lang: 0x2c0, region: 0x52}, + 49: {lang: 0xe8, region: 0xe5}, + 50: {lang: 0x2c0, region: 0x52}, + 51: {lang: 0x2c0, region: 0x12c}, + 52: {lang: 0x18a, region: 0x99}, + 53: {lang: 0xdf, region: 0x95}, + 54: {lang: 0x106, region: 0xa0}, + 55: {lang: 0xe3, region: 0x129}, + 56: {lang: 0xe7, region: 0xad}, + 58: {lang: 0xf1, region: 0x90}, + 60: {lang: 0x9f, region: 0x9c}, + 61: {lang: 0x10e, region: 0x93}, + 62: {lang: 0x106, region: 0xa0}, + 64: {lang: 0x98, region: 0xc2}, + 65: {lang: 0x106, region: 0xa0}, + 66: {lang: 0x1e9, region: 0xe6}, + 67: {lang: 0x132, region: 0xa4}, + 68: {lang: 0x218, region: 0x97}, + 71: {lang: 0x134, region: 0x97}, + 72: {lang: 0x135, region: 0xa9}, + 74: {lang: 0x3c, region: 0x97}, + 75: {lang: 0x1c1, region: 0x121}, + 76: {lang: 0x164, region: 0xad}, + 80: {lang: 0x157, region: 0x97}, + 81: {lang: 0x15b, region: 0x97}, + 82: {lang: 0x14e, region: 0x85}, + 83: {lang: 0xcf, region: 0x85}, + 84: {lang: 0x15d, region: 0x52}, + 86: {lang: 0x2a7, region: 0x129}, + 87: {lang: 0x2a8, region: 0x129}, + 88: {lang: 0xe0, region: 0x97}, + 89: {lang: 0x1a7, region: 0x9a}, + 90: {lang: 0x2aa, region: 0x52}, + 93: {lang: 0x17e, region: 0x110}, + 94: {lang: 0x2ab, region: 0x109}, + 95: {lang: 0x2ab, region: 0x109}, + 96: {lang: 0x18c, region: 0x97}, + 97: {lang: 0x195, region: 0x97}, + 98: {lang: 0x18e, region: 0x52}, + 100: {lang: 0x198, region: 0x34}, + 101: {lang: 0x18f, region: 0x97}, + 102: {lang: 0x229, region: 0xe6}, + 103: {lang: 0x1a4, region: 0xc2}, + 104: {lang: 0x2ac, region: 0x106}, + 105: {lang: 0x16, region: 0x9f}, + 107: {lang: 0x178, region: 0x82}, + 109: {lang: 0x221, region: 0x94}, + 110: {lang: 0x210, region: 0x97}, + 111: {lang: 0x1d4, region: 0xc3}, + 112: {lang: 0x1d2, region: 0x97}, + 114: {lang: 0x236, region: 0x113}, + 115: {lang: 0x16, region: 0x11a}, + 116: {lang: 0x7c, region: 0xc2}, + 117: {lang: 0x146, region: 0x104}, + 118: {lang: 0x171, region: 0x52}, + 119: {lang: 0x1d7, region: 0x9a}, + 120: {lang: 0x1d7, region: 0x52}, + 122: {lang: 0x1e1, region: 0xae}, + 123: {lang: 0xe4, region: 0x52}, + 124: {lang: 0x2af, region: 0x9a}, + 175: {lang: 0x1f4, region: 0x93}, + 177: {lang: 0x1c3, region: 0x10a}, + 178: {lang: 0x232, region: 0x95}, + 180: {lang: 0x2b0, region: 0x15b}, + 181: {lang: 0x211, region: 0x97}, + 182: {lang: 0x1e, region: 0x132}, + 183: {lang: 0x9a, region: 0x79}, + 184: {lang: 0x20b, region: 0x97}, + 185: {lang: 0x20b, region: 0x97}, + 186: {lang: 0x218, region: 0x97}, + 187: {lang: 0x226, region: 0xb1}, + 188: {lang: 0x23a, region: 0x97}, + 189: {lang: 0x242, region: 0x93}, + 190: {lang: 0x24c, region: 0x34}, + 191: {lang: 0x24d, region: 0x99}, + 195: {lang: 0x251, region: 0xe5}, + 196: {lang: 0x8a, region: 0x97}, + 197: {lang: 0x253, region: 0x52}, + 198: {lang: 0x125, region: 0x52}, + 199: {lang: 0x24f, region: 0x97}, + 201: {lang: 0x48, region: 0x13b}, + 202: {lang: 0x256, region: 0x97}, + 204: {lang: 0x2bf, region: 0xb8}, + 205: {lang: 0xa9, region: 0xe5}, + 206: {lang: 0x8f, region: 0xcb}, + 207: {lang: 0x25b, region: 0x121}, + 208: {lang: 0x4c, region: 0x52}, + 209: {lang: 0x176, region: 0x97}, + 210: {lang: 0x282, region: 0x11a}, + 211: {lang: 0x28b, region: 0xb2}, + 213: {lang: 0xeb, region: 0x97}, + 215: {lang: 0x1df, region: 0x9a}, + 216: {lang: 0xe, region: 0x99}, + 217: {lang: 0xfa, region: 0x52}, +} + +type likelyScriptRegion struct { + region uint16 + script uint8 + flags uint8 +} + +// likelyLang is a lookup table, indexed by langID, for the most likely +// scripts and regions given incomplete information. If more entries exist for a +// given language, region and script are the index and size respectively +// of the list in likelyLangList. +// Size: 2836 bytes, 709 elements +var likelyLang = [709]likelyScriptRegion{ + 0: {region: 0x132, script: 0x4f, flags: 0x0}, + 1: {region: 0x6e, script: 0x4f, flags: 0x0}, + 2: {region: 0x7b, script: 0x1d, flags: 0x0}, + 3: {region: 0x7e, script: 0x4f, flags: 0x0}, + 4: {region: 0x93, script: 0x4f, flags: 0x0}, + 5: {region: 0x12f, script: 0x4f, flags: 0x0}, + 6: {region: 0x7e, script: 0x4f, flags: 0x0}, + 7: {region: 0x104, script: 0x1d, flags: 0x0}, + 8: {region: 0x9a, script: 0x9, flags: 0x0}, + 9: {region: 0x126, script: 0x5, flags: 0x0}, + 10: {region: 0x15e, script: 0x4f, flags: 0x0}, + 11: {region: 0x51, script: 0x4f, flags: 0x0}, + 12: {region: 0x97, script: 0x4, flags: 0x0}, + 13: {region: 0x7e, script: 0x4f, flags: 0x0}, + 14: {region: 0x99, script: 0xd8, flags: 0x0}, + 15: {region: 0x14a, script: 0x4f, flags: 0x0}, + 16: {region: 0x104, script: 0x1d, flags: 0x0}, + 17: {region: 0x6e, script: 0x26, flags: 0x0}, + 18: {region: 0xd4, script: 0x4f, flags: 0x0}, + 20: {region: 0x93, script: 0x4f, flags: 0x0}, + 21: {region: 0x6a, script: 0x5, flags: 0x0}, + 22: {region: 0x0, script: 0x3, flags: 0x1}, + 23: {region: 0x50, script: 0x4f, flags: 0x0}, + 24: {region: 0x3e, script: 0x4f, flags: 0x0}, + 25: {region: 0x66, script: 0x5, flags: 0x0}, + 26: {region: 0xb8, script: 0x5, flags: 0x0}, + 27: {region: 0x6a, script: 0x5, flags: 0x0}, + 28: {region: 0x97, script: 0xe, flags: 0x0}, + 29: {region: 0x12d, script: 0x4f, flags: 0x0}, + 30: {region: 0x132, script: 0xb6, flags: 0x0}, + 31: {region: 0x6d, script: 0x4f, flags: 0x0}, + 32: {region: 0x48, script: 0x4f, flags: 0x0}, + 33: {region: 0x104, script: 0x1d, flags: 0x0}, + 34: {region: 0x97, script: 0x1f, flags: 0x0}, + 35: {region: 0x3e, script: 0x4f, flags: 0x0}, + 36: {region: 0x3, script: 0x5, flags: 0x1}, + 37: {region: 0x104, script: 0x1d, flags: 0x0}, + 38: {region: 0xe6, script: 0x5, flags: 0x0}, + 39: {region: 0x93, script: 0x4f, flags: 0x0}, + 40: {region: 0xd9, script: 0x1f, flags: 0x0}, + 41: {region: 0x2d, script: 0x4f, flags: 0x0}, + 42: {region: 0x51, script: 0x4f, flags: 0x0}, + 43: {region: 0x51, script: 0xb, flags: 0x0}, + 44: {region: 0x93, script: 0x4f, flags: 0x0}, + 45: {region: 0x51, script: 0x4f, flags: 0x0}, + 46: {region: 0x4e, script: 0x4f, flags: 0x0}, + 47: {region: 0x46, script: 0x1d, flags: 0x0}, + 48: {region: 0x109, script: 0x5, flags: 0x0}, + 49: {region: 0x15f, script: 0x4f, flags: 0x0}, + 50: {region: 0x93, script: 0x4f, flags: 0x0}, + 51: {region: 0x12d, script: 0x4f, flags: 0x0}, + 52: {region: 0x51, script: 0x4f, flags: 0x0}, + 53: {region: 0x97, script: 0xc7, flags: 0x0}, + 54: {region: 0xe6, script: 0x5, flags: 0x0}, + 55: {region: 0x97, script: 0x1f, flags: 0x0}, + 56: {region: 0x37, script: 0x1d, flags: 0x0}, + 57: {region: 0x97, script: 0x1f, flags: 0x0}, + 58: {region: 0xe6, script: 0x5, flags: 0x0}, + 59: {region: 0x129, script: 0x2c, flags: 0x0}, + 60: {region: 0x97, script: 0x4a, flags: 0x0}, + 61: {region: 0x97, script: 0x1f, flags: 0x0}, + 62: {region: 0x97, script: 0x1f, flags: 0x0}, + 63: {region: 0xe5, script: 0x4f, flags: 0x0}, + 64: {region: 0x97, script: 0x1f, flags: 0x0}, + 65: {region: 0x13c, script: 0x4f, flags: 0x0}, + 66: {region: 0xe5, script: 0x4f, flags: 0x0}, + 67: {region: 0xd4, script: 0x4f, flags: 0x0}, + 68: {region: 0x97, script: 0x1f, flags: 0x0}, + 69: {region: 0x93, script: 0x4f, flags: 0x0}, + 70: {region: 0x51, script: 0x4f, flags: 0x0}, + 71: {region: 0xe5, script: 0x4f, flags: 0x0}, + 72: {region: 0x13b, script: 0xc9, flags: 0x0}, + 73: {region: 0xc1, script: 0x4f, flags: 0x0}, + 74: {region: 0xc1, script: 0x4f, flags: 0x0}, + 75: {region: 0x34, script: 0xe, flags: 0x0}, + 76: {region: 0x52, script: 0xd0, flags: 0x0}, + 77: {region: 0x97, script: 0xe, flags: 0x0}, + 78: {region: 0x9a, script: 0x5, flags: 0x0}, + 79: {region: 0x4e, script: 0x4f, flags: 0x0}, + 80: {region: 0x76, script: 0x4f, flags: 0x0}, + 81: {region: 0x97, script: 0x1f, flags: 0x0}, + 82: {region: 0xe6, script: 0x5, flags: 0x0}, + 83: {region: 0x97, script: 0x1f, flags: 0x0}, + 84: {region: 0x32, script: 0x4f, flags: 0x0}, + 85: {region: 0xb2, script: 0xc, flags: 0x0}, + 86: {region: 0x51, script: 0x4f, flags: 0x0}, + 87: {region: 0xe5, script: 0x4f, flags: 0x0}, + 88: {region: 0xe6, script: 0x1f, flags: 0x0}, + 89: {region: 0x104, script: 0x1d, flags: 0x0}, + 90: {region: 0x15c, script: 0x4f, flags: 0x0}, + 91: {region: 0x93, script: 0x4f, flags: 0x0}, + 92: {region: 0x51, script: 0x4f, flags: 0x0}, + 93: {region: 0x84, script: 0x4f, flags: 0x0}, + 94: {region: 0x6c, script: 0x26, flags: 0x0}, + 95: {region: 0x51, script: 0x4f, flags: 0x0}, + 96: {region: 0xc1, script: 0x4f, flags: 0x0}, + 97: {region: 0x6d, script: 0x4f, flags: 0x0}, + 98: {region: 0xd4, script: 0x4f, flags: 0x0}, + 99: {region: 0x8, script: 0x2, flags: 0x1}, + 100: {region: 0x104, script: 0x1d, flags: 0x0}, + 101: {region: 0xe5, script: 0x4f, flags: 0x0}, + 102: {region: 0x12f, script: 0x4f, flags: 0x0}, + 103: {region: 0x88, script: 0x4f, flags: 0x0}, + 104: {region: 0x73, script: 0x4f, flags: 0x0}, + 105: {region: 0x104, script: 0x1d, flags: 0x0}, + 106: {region: 0x132, script: 0x4f, flags: 0x0}, + 107: {region: 0x48, script: 0x4f, flags: 0x0}, + 108: {region: 0x132, script: 0x19, flags: 0x0}, + 109: {region: 0xa4, script: 0x5, flags: 0x0}, + 110: {region: 0x13b, script: 0x18, flags: 0x0}, + 111: {region: 0x99, script: 0x5, flags: 0x0}, + 112: {region: 0x76, script: 0x4f, flags: 0x0}, + 113: {region: 0x6a, script: 0x1b, flags: 0x0}, + 114: {region: 0xe5, script: 0x4f, flags: 0x0}, + 115: {region: 0x48, script: 0x16, flags: 0x0}, + 116: {region: 0x48, script: 0x16, flags: 0x0}, + 117: {region: 0x48, script: 0x16, flags: 0x0}, + 118: {region: 0x48, script: 0x16, flags: 0x0}, + 119: {region: 0x48, script: 0x16, flags: 0x0}, + 120: {region: 0x108, script: 0x4f, flags: 0x0}, + 121: {region: 0x5d, script: 0x4f, flags: 0x0}, + 122: {region: 0xe7, script: 0x4f, flags: 0x0}, + 123: {region: 0x48, script: 0x16, flags: 0x0}, + 124: {region: 0xc2, script: 0x74, flags: 0x0}, + 125: {region: 0xa, script: 0x2, flags: 0x1}, + 126: {region: 0x104, script: 0x1d, flags: 0x0}, + 127: {region: 0x79, script: 0x4f, flags: 0x0}, + 128: {region: 0x62, script: 0x4f, flags: 0x0}, + 129: {region: 0x132, script: 0x4f, flags: 0x0}, + 130: {region: 0x104, script: 0x1d, flags: 0x0}, + 131: {region: 0xa2, script: 0x4f, flags: 0x0}, + 132: {region: 0x97, script: 0x5, flags: 0x0}, + 133: {region: 0x5f, script: 0x4f, flags: 0x0}, + 134: {region: 0x48, script: 0x4f, flags: 0x0}, + 135: {region: 0x48, script: 0x4f, flags: 0x0}, + 136: {region: 0xd2, script: 0x4f, flags: 0x0}, + 137: {region: 0x4e, script: 0x4f, flags: 0x0}, + 138: {region: 0x97, script: 0x5, flags: 0x0}, + 139: {region: 0x5f, script: 0x4f, flags: 0x0}, + 140: {region: 0xc1, script: 0x4f, flags: 0x0}, + 141: {region: 0xce, script: 0x4f, flags: 0x0}, + 142: {region: 0x51, script: 0x4f, flags: 0x0}, + 143: {region: 0xcb, script: 0xce, flags: 0x0}, + 144: {region: 0x112, script: 0x4f, flags: 0x0}, + 145: {region: 0x36, script: 0x4f, flags: 0x0}, + 146: {region: 0x42, script: 0xd0, flags: 0x0}, + 147: {region: 0xa2, script: 0x4f, flags: 0x0}, + 148: {region: 0x7e, script: 0x4f, flags: 0x0}, + 149: {region: 0xd4, script: 0x4f, flags: 0x0}, + 150: {region: 0x9c, script: 0x4f, flags: 0x0}, + 151: {region: 0x6a, script: 0x24, flags: 0x0}, + 152: {region: 0xc2, script: 0x40, flags: 0x0}, + 153: {region: 0x85, script: 0x2c, flags: 0x0}, + 154: {region: 0xc, script: 0x2, flags: 0x1}, + 155: {region: 0x1, script: 0x4f, flags: 0x0}, + 156: {region: 0x6d, script: 0x4f, flags: 0x0}, + 157: {region: 0x132, script: 0x4f, flags: 0x0}, + 158: {region: 0x69, script: 0x4f, flags: 0x0}, + 159: {region: 0x9c, script: 0x3c, flags: 0x0}, + 160: {region: 0x6d, script: 0x4f, flags: 0x0}, + 161: {region: 0x51, script: 0x4f, flags: 0x0}, + 162: {region: 0x6d, script: 0x4f, flags: 0x0}, + 163: {region: 0x9a, script: 0x5, flags: 0x0}, + 164: {region: 0x84, script: 0x4f, flags: 0x0}, + 165: {region: 0x112, script: 0x4f, flags: 0x0}, + 166: {region: 0xc1, script: 0x4f, flags: 0x0}, + 167: {region: 0x70, script: 0x4f, flags: 0x0}, + 168: {region: 0x109, script: 0x5, flags: 0x0}, + 169: {region: 0xe5, script: 0x4f, flags: 0x0}, + 170: {region: 0x10a, script: 0x4f, flags: 0x0}, + 171: {region: 0x71, script: 0x4f, flags: 0x0}, + 172: {region: 0x74, script: 0x4f, flags: 0x0}, + 173: {region: 0x3a, script: 0x4f, flags: 0x0}, + 174: {region: 0x76, script: 0x4f, flags: 0x0}, + 175: {region: 0x132, script: 0x4f, flags: 0x0}, + 176: {region: 0x76, script: 0x4f, flags: 0x0}, + 177: {region: 0x5f, script: 0x4f, flags: 0x0}, + 178: {region: 0x5f, script: 0x4f, flags: 0x0}, + 179: {region: 0x13d, script: 0x4f, flags: 0x0}, + 180: {region: 0xd2, script: 0x4f, flags: 0x0}, + 181: {region: 0x9c, script: 0x4f, flags: 0x0}, + 182: {region: 0xd4, script: 0x4f, flags: 0x0}, + 183: {region: 0x109, script: 0x4f, flags: 0x0}, + 184: {region: 0xd7, script: 0x4f, flags: 0x0}, + 185: {region: 0x94, script: 0x4f, flags: 0x0}, + 186: {region: 0x7e, script: 0x4f, flags: 0x0}, + 187: {region: 0xba, script: 0x4f, flags: 0x0}, + 188: {region: 0x52, script: 0x32, flags: 0x0}, + 189: {region: 0x93, script: 0x4f, flags: 0x0}, + 190: {region: 0x97, script: 0x1f, flags: 0x0}, + 191: {region: 0x9a, script: 0x5, flags: 0x0}, + 192: {region: 0x7c, script: 0x4f, flags: 0x0}, + 193: {region: 0x79, script: 0x4f, flags: 0x0}, + 194: {region: 0x6e, script: 0x26, flags: 0x0}, + 195: {region: 0xd9, script: 0x1f, flags: 0x0}, + 196: {region: 0xa5, script: 0x4f, flags: 0x0}, + 197: {region: 0xe6, script: 0x5, flags: 0x0}, + 198: {region: 0xe6, script: 0x5, flags: 0x0}, + 199: {region: 0x6d, script: 0x4f, flags: 0x0}, + 200: {region: 0x9a, script: 0x5, flags: 0x0}, + 201: {region: 0xef, script: 0x4f, flags: 0x0}, + 202: {region: 0x97, script: 0x1f, flags: 0x0}, + 203: {region: 0x97, script: 0xca, flags: 0x0}, + 204: {region: 0x93, script: 0x4f, flags: 0x0}, + 205: {region: 0xd7, script: 0x4f, flags: 0x0}, + 206: {region: 0x12e, script: 0x2a, flags: 0x0}, + 207: {region: 0xe, script: 0x2, flags: 0x1}, + 208: {region: 0x97, script: 0xe, flags: 0x0}, + 209: {region: 0x4d, script: 0x4f, flags: 0x0}, + 210: {region: 0x97, script: 0x2d, flags: 0x0}, + 211: {region: 0x40, script: 0x4f, flags: 0x0}, + 212: {region: 0x53, script: 0x4f, flags: 0x0}, + 213: {region: 0x7e, script: 0x4f, flags: 0x0}, + 215: {region: 0xa2, script: 0x4f, flags: 0x0}, + 216: {region: 0x96, script: 0x4f, flags: 0x0}, + 217: {region: 0xd9, script: 0x1f, flags: 0x0}, + 218: {region: 0x48, script: 0x4f, flags: 0x0}, + 219: {region: 0x10, script: 0x3, flags: 0x1}, + 220: {region: 0x52, script: 0x32, flags: 0x0}, + 221: {region: 0x132, script: 0x4f, flags: 0x0}, + 222: {region: 0x23, script: 0x5, flags: 0x0}, + 223: {region: 0x95, script: 0x35, flags: 0x0}, + 224: {region: 0x97, script: 0x1f, flags: 0x0}, + 225: {region: 0x71, script: 0x4f, flags: 0x0}, + 226: {region: 0xe5, script: 0x4f, flags: 0x0}, + 227: {region: 0x129, script: 0x37, flags: 0x0}, + 228: {region: 0x52, script: 0x7b, flags: 0x0}, + 229: {region: 0xe6, script: 0x5, flags: 0x0}, + 230: {region: 0x97, script: 0x1f, flags: 0x0}, + 231: {region: 0xad, script: 0x38, flags: 0x0}, + 232: {region: 0xe5, script: 0x4f, flags: 0x0}, + 233: {region: 0xe6, script: 0x5, flags: 0x0}, + 234: {region: 0xe4, script: 0x4f, flags: 0x0}, + 235: {region: 0x97, script: 0x1f, flags: 0x0}, + 236: {region: 0x97, script: 0x1f, flags: 0x0}, + 237: {region: 0x8e, script: 0x4f, flags: 0x0}, + 238: {region: 0x5f, script: 0x4f, flags: 0x0}, + 239: {region: 0x52, script: 0x32, flags: 0x0}, + 240: {region: 0x8f, script: 0x4f, flags: 0x0}, + 241: {region: 0x90, script: 0x4f, flags: 0x0}, + 242: {region: 0x27, script: 0x8, flags: 0x0}, + 243: {region: 0xd0, script: 0x4f, flags: 0x0}, + 244: {region: 0x76, script: 0x4f, flags: 0x0}, + 245: {region: 0xce, script: 0x4f, flags: 0x0}, + 246: {region: 0xd4, script: 0x4f, flags: 0x0}, + 247: {region: 0x93, script: 0x4f, flags: 0x0}, + 249: {region: 0xd4, script: 0x4f, flags: 0x0}, + 250: {region: 0x52, script: 0xd9, flags: 0x0}, + 251: {region: 0x132, script: 0x4f, flags: 0x0}, + 252: {region: 0x48, script: 0x4f, flags: 0x0}, + 253: {region: 0xe5, script: 0x4f, flags: 0x0}, + 254: {region: 0x93, script: 0x4f, flags: 0x0}, + 255: {region: 0x104, script: 0x1d, flags: 0x0}, + 257: {region: 0x9b, script: 0x4f, flags: 0x0}, + 258: {region: 0x9c, script: 0x4f, flags: 0x0}, + 259: {region: 0x48, script: 0x16, flags: 0x0}, + 260: {region: 0x95, script: 0x35, flags: 0x0}, + 261: {region: 0x104, script: 0x4f, flags: 0x0}, + 262: {region: 0xa0, script: 0x3e, flags: 0x0}, + 263: {region: 0x9e, script: 0x4f, flags: 0x0}, + 265: {region: 0x51, script: 0x4f, flags: 0x0}, + 266: {region: 0x12e, script: 0x35, flags: 0x0}, + 267: {region: 0x12d, script: 0x4f, flags: 0x0}, + 268: {region: 0xd9, script: 0x1f, flags: 0x0}, + 269: {region: 0x62, script: 0x4f, flags: 0x0}, + 270: {region: 0x93, script: 0x4f, flags: 0x0}, + 271: {region: 0x93, script: 0x4f, flags: 0x0}, + 272: {region: 0x7b, script: 0x28, flags: 0x0}, + 273: {region: 0x134, script: 0x1d, flags: 0x0}, + 274: {region: 0x66, script: 0x4f, flags: 0x0}, + 275: {region: 0xc2, script: 0x4f, flags: 0x0}, + 276: {region: 0xd4, script: 0x4f, flags: 0x0}, + 277: {region: 0xa2, script: 0x4f, flags: 0x0}, + 278: {region: 0xc1, script: 0x4f, flags: 0x0}, + 279: {region: 0x104, script: 0x1d, flags: 0x0}, + 280: {region: 0xd4, script: 0x4f, flags: 0x0}, + 281: {region: 0x161, script: 0x4f, flags: 0x0}, + 282: {region: 0x12d, script: 0x4f, flags: 0x0}, + 283: {region: 0x121, script: 0xcf, flags: 0x0}, + 284: {region: 0x59, script: 0x4f, flags: 0x0}, + 285: {region: 0x51, script: 0x4f, flags: 0x0}, + 286: {region: 0x4e, script: 0x4f, flags: 0x0}, + 287: {region: 0x97, script: 0x1f, flags: 0x0}, + 288: {region: 0x97, script: 0x1f, flags: 0x0}, + 289: {region: 0x4a, script: 0x4f, flags: 0x0}, + 290: {region: 0x93, script: 0x4f, flags: 0x0}, + 291: {region: 0x40, script: 0x4f, flags: 0x0}, + 292: {region: 0x97, script: 0x4f, flags: 0x0}, + 293: {region: 0x52, script: 0xc6, flags: 0x0}, + 294: {region: 0x97, script: 0x1f, flags: 0x0}, + 295: {region: 0xc1, script: 0x4f, flags: 0x0}, + 296: {region: 0x97, script: 0x67, flags: 0x0}, + 297: {region: 0xe6, script: 0x5, flags: 0x0}, + 298: {region: 0xa2, script: 0x4f, flags: 0x0}, + 299: {region: 0x129, script: 0x4f, flags: 0x0}, + 300: {region: 0xd0, script: 0x4f, flags: 0x0}, + 301: {region: 0xad, script: 0x4c, flags: 0x0}, + 302: {region: 0x13, script: 0x6, flags: 0x1}, + 303: {region: 0x51, script: 0x4f, flags: 0x0}, + 304: {region: 0x80, script: 0x4f, flags: 0x0}, + 305: {region: 0xa2, script: 0x4f, flags: 0x0}, + 306: {region: 0xa4, script: 0x43, flags: 0x0}, + 307: {region: 0x29, script: 0x4f, flags: 0x0}, + 308: {region: 0x97, script: 0x47, flags: 0x0}, + 309: {region: 0xa9, script: 0x48, flags: 0x0}, + 310: {region: 0x104, script: 0x1d, flags: 0x0}, + 311: {region: 0x97, script: 0x1f, flags: 0x0}, + 312: {region: 0x73, script: 0x4f, flags: 0x0}, + 313: {region: 0xb2, script: 0x4f, flags: 0x0}, + 315: {region: 0x104, script: 0x1d, flags: 0x0}, + 316: {region: 0x110, script: 0x4f, flags: 0x0}, + 317: {region: 0xe5, script: 0x4f, flags: 0x0}, + 318: {region: 0x104, script: 0x4f, flags: 0x0}, + 319: {region: 0x97, script: 0x1f, flags: 0x0}, + 320: {region: 0x97, script: 0x5, flags: 0x0}, + 321: {region: 0x12d, script: 0x4f, flags: 0x0}, + 322: {region: 0x51, script: 0x4f, flags: 0x0}, + 323: {region: 0x5f, script: 0x4f, flags: 0x0}, + 324: {region: 0x19, script: 0x3, flags: 0x1}, + 325: {region: 0x104, script: 0x1d, flags: 0x0}, + 326: {region: 0x104, script: 0x1d, flags: 0x0}, + 327: {region: 0x93, script: 0x4f, flags: 0x0}, + 328: {region: 0xe6, script: 0x5, flags: 0x0}, + 329: {region: 0x79, script: 0x4f, flags: 0x0}, + 330: {region: 0x121, script: 0xcf, flags: 0x0}, + 331: {region: 0xe6, script: 0x5, flags: 0x0}, + 332: {region: 0x1c, script: 0x5, flags: 0x1}, + 333: {region: 0x135, script: 0x4f, flags: 0x0}, + 334: {region: 0x85, script: 0x52, flags: 0x0}, + 335: {region: 0x95, script: 0x35, flags: 0x0}, + 336: {region: 0x12d, script: 0x4f, flags: 0x0}, + 337: {region: 0xe6, script: 0x5, flags: 0x0}, + 338: {region: 0x12f, script: 0x4f, flags: 0x0}, + 339: {region: 0xb5, script: 0x4f, flags: 0x0}, + 340: {region: 0x104, script: 0x1d, flags: 0x0}, + 341: {region: 0x93, script: 0x4f, flags: 0x0}, + 342: {region: 0x52, script: 0xcf, flags: 0x0}, + 343: {region: 0x97, script: 0x50, flags: 0x0}, + 344: {region: 0x104, script: 0x1d, flags: 0x0}, + 345: {region: 0x12f, script: 0x4f, flags: 0x0}, + 346: {region: 0xd7, script: 0x4f, flags: 0x0}, + 347: {region: 0x21, script: 0x2, flags: 0x1}, + 348: {region: 0x9c, script: 0x4f, flags: 0x0}, + 349: {region: 0x52, script: 0x54, flags: 0x0}, + 350: {region: 0x93, script: 0x4f, flags: 0x0}, + 351: {region: 0x9a, script: 0x5, flags: 0x0}, + 352: {region: 0x132, script: 0x4f, flags: 0x0}, + 353: {region: 0x97, script: 0xca, flags: 0x0}, + 354: {region: 0x9c, script: 0x4f, flags: 0x0}, + 355: {region: 0x4a, script: 0x4f, flags: 0x0}, + 356: {region: 0xad, script: 0x4c, flags: 0x0}, + 357: {region: 0x4a, script: 0x4f, flags: 0x0}, + 358: {region: 0x15f, script: 0x4f, flags: 0x0}, + 359: {region: 0x9a, script: 0x5, flags: 0x0}, + 360: {region: 0xb4, script: 0x4f, flags: 0x0}, + 361: {region: 0xb6, script: 0x4f, flags: 0x0}, + 362: {region: 0x4a, script: 0x4f, flags: 0x0}, + 363: {region: 0x4a, script: 0x4f, flags: 0x0}, + 364: {region: 0xa2, script: 0x4f, flags: 0x0}, + 365: {region: 0xa2, script: 0x4f, flags: 0x0}, + 366: {region: 0x9a, script: 0x5, flags: 0x0}, + 367: {region: 0xb6, script: 0x4f, flags: 0x0}, + 368: {region: 0x121, script: 0xcf, flags: 0x0}, + 369: {region: 0x52, script: 0x32, flags: 0x0}, + 370: {region: 0x129, script: 0x4f, flags: 0x0}, + 371: {region: 0x93, script: 0x4f, flags: 0x0}, + 372: {region: 0x51, script: 0x4f, flags: 0x0}, + 373: {region: 0x97, script: 0x1f, flags: 0x0}, + 374: {region: 0x97, script: 0x1f, flags: 0x0}, + 375: {region: 0x93, script: 0x4f, flags: 0x0}, + 376: {region: 0x23, script: 0x3, flags: 0x1}, + 377: {region: 0xa2, script: 0x4f, flags: 0x0}, + 378: {region: 0xcd, script: 0x4f, flags: 0x0}, + 379: {region: 0x104, script: 0x1d, flags: 0x0}, + 380: {region: 0xe5, script: 0x4f, flags: 0x0}, + 381: {region: 0x93, script: 0x4f, flags: 0x0}, + 382: {region: 0x110, script: 0x4f, flags: 0x0}, + 383: {region: 0xa2, script: 0x4f, flags: 0x0}, + 384: {region: 0x121, script: 0x5, flags: 0x0}, + 385: {region: 0xca, script: 0x4f, flags: 0x0}, + 386: {region: 0xbd, script: 0x4f, flags: 0x0}, + 387: {region: 0xcf, script: 0x4f, flags: 0x0}, + 388: {region: 0x51, script: 0x4f, flags: 0x0}, + 389: {region: 0xd9, script: 0x1f, flags: 0x0}, + 390: {region: 0x12d, script: 0x4f, flags: 0x0}, + 391: {region: 0xbe, script: 0x4f, flags: 0x0}, + 392: {region: 0xde, script: 0x4f, flags: 0x0}, + 393: {region: 0x93, script: 0x4f, flags: 0x0}, + 394: {region: 0x99, script: 0x34, flags: 0x0}, + 395: {region: 0xc0, script: 0x1d, flags: 0x0}, + 396: {region: 0x97, script: 0x60, flags: 0x0}, + 397: {region: 0x109, script: 0x4f, flags: 0x0}, + 398: {region: 0x26, script: 0x3, flags: 0x1}, + 399: {region: 0x97, script: 0xe, flags: 0x0}, + 400: {region: 0xc2, script: 0x67, flags: 0x0}, + 402: {region: 0x48, script: 0x4f, flags: 0x0}, + 403: {region: 0x48, script: 0x4f, flags: 0x0}, + 404: {region: 0x36, script: 0x4f, flags: 0x0}, + 405: {region: 0x97, script: 0x1f, flags: 0x0}, + 406: {region: 0xd9, script: 0x1f, flags: 0x0}, + 407: {region: 0x104, script: 0x1d, flags: 0x0}, + 408: {region: 0x34, script: 0x64, flags: 0x0}, + 409: {region: 0x29, script: 0x3, flags: 0x1}, + 410: {region: 0xc9, script: 0x4f, flags: 0x0}, + 411: {region: 0x97, script: 0x1f, flags: 0x0}, + 412: {region: 0x51, script: 0x4f, flags: 0x0}, + 414: {region: 0x132, script: 0x4f, flags: 0x0}, + 415: {region: 0xe6, script: 0x5, flags: 0x0}, + 416: {region: 0xc1, script: 0x4f, flags: 0x0}, + 417: {region: 0x97, script: 0x1f, flags: 0x0}, + 418: {region: 0x93, script: 0x4f, flags: 0x0}, + 419: {region: 0x161, script: 0x4f, flags: 0x0}, + 420: {region: 0xc2, script: 0x67, flags: 0x0}, + 421: {region: 0x104, script: 0x1d, flags: 0x0}, + 422: {region: 0x12f, script: 0x4f, flags: 0x0}, + 423: {region: 0x9a, script: 0x59, flags: 0x0}, + 424: {region: 0x9a, script: 0x5, flags: 0x0}, + 425: {region: 0xdb, script: 0x4f, flags: 0x0}, + 427: {region: 0x52, script: 0x32, flags: 0x0}, + 428: {region: 0x9c, script: 0x4f, flags: 0x0}, + 429: {region: 0xd0, script: 0x4f, flags: 0x0}, + 430: {region: 0xd8, script: 0x4f, flags: 0x0}, + 431: {region: 0xcd, script: 0x4f, flags: 0x0}, + 432: {region: 0x161, script: 0x4f, flags: 0x0}, + 433: {region: 0xcf, script: 0x4f, flags: 0x0}, + 434: {region: 0x5f, script: 0x4f, flags: 0x0}, + 435: {region: 0xd9, script: 0x1f, flags: 0x0}, + 436: {region: 0xd9, script: 0x1f, flags: 0x0}, + 437: {region: 0xd0, script: 0x4f, flags: 0x0}, + 438: {region: 0xcf, script: 0x4f, flags: 0x0}, + 439: {region: 0xcd, script: 0x4f, flags: 0x0}, + 440: {region: 0xcd, script: 0x4f, flags: 0x0}, + 441: {region: 0x93, script: 0x4f, flags: 0x0}, + 442: {region: 0xdd, script: 0x4f, flags: 0x0}, + 443: {region: 0x97, script: 0x4f, flags: 0x0}, + 444: {region: 0xd7, script: 0x4f, flags: 0x0}, + 445: {region: 0x51, script: 0x4f, flags: 0x0}, + 446: {region: 0xd8, script: 0x4f, flags: 0x0}, + 447: {region: 0x51, script: 0x4f, flags: 0x0}, + 448: {region: 0xd8, script: 0x4f, flags: 0x0}, + 449: {region: 0x121, script: 0x4b, flags: 0x0}, + 450: {region: 0x97, script: 0x1f, flags: 0x0}, + 451: {region: 0x10a, script: 0xb1, flags: 0x0}, + 452: {region: 0x82, script: 0x6b, flags: 0x0}, + 453: {region: 0x15e, script: 0x4f, flags: 0x0}, + 454: {region: 0x48, script: 0x16, flags: 0x0}, + 455: {region: 0x15e, script: 0x4f, flags: 0x0}, + 456: {region: 0x115, script: 0x4f, flags: 0x0}, + 457: {region: 0x132, script: 0x4f, flags: 0x0}, + 458: {region: 0x52, script: 0x4f, flags: 0x0}, + 459: {region: 0xcc, script: 0x4f, flags: 0x0}, + 460: {region: 0x12d, script: 0x4f, flags: 0x0}, + 461: {region: 0x12f, script: 0x4f, flags: 0x0}, + 462: {region: 0x7e, script: 0x4f, flags: 0x0}, + 463: {region: 0x76, script: 0x4f, flags: 0x0}, + 465: {region: 0x6e, script: 0x4f, flags: 0x0}, + 466: {region: 0x97, script: 0x70, flags: 0x0}, + 467: {region: 0x7b, script: 0x1d, flags: 0x0}, + 468: {region: 0xc3, script: 0x6f, flags: 0x0}, + 469: {region: 0x2c, script: 0x3, flags: 0x1}, + 470: {region: 0xe5, script: 0x4f, flags: 0x0}, + 471: {region: 0x2f, script: 0x2, flags: 0x1}, + 472: {region: 0xe5, script: 0x4f, flags: 0x0}, + 473: {region: 0x2f, script: 0x4f, flags: 0x0}, + 474: {region: 0xee, script: 0x4f, flags: 0x0}, + 475: {region: 0x76, script: 0x4f, flags: 0x0}, + 476: {region: 0xd4, script: 0x4f, flags: 0x0}, + 477: {region: 0x132, script: 0x4f, flags: 0x0}, + 478: {region: 0x48, script: 0x4f, flags: 0x0}, + 479: {region: 0x9a, script: 0xd7, flags: 0x0}, + 480: {region: 0x5f, script: 0x4f, flags: 0x0}, + 481: {region: 0xae, script: 0x7a, flags: 0x0}, + 483: {region: 0x97, script: 0x11, flags: 0x0}, + 484: {region: 0xa2, script: 0x4f, flags: 0x0}, + 485: {region: 0xe7, script: 0x4f, flags: 0x0}, + 486: {region: 0x9c, script: 0x4f, flags: 0x0}, + 487: {region: 0x85, script: 0x2c, flags: 0x0}, + 488: {region: 0x73, script: 0x4f, flags: 0x0}, + 489: {region: 0xe6, script: 0x42, flags: 0x0}, + 490: {region: 0x9a, script: 0x5, flags: 0x0}, + 491: {region: 0x1, script: 0x4f, flags: 0x0}, + 492: {region: 0x23, script: 0x5, flags: 0x0}, + 493: {region: 0x40, script: 0x4f, flags: 0x0}, + 494: {region: 0x78, script: 0x4f, flags: 0x0}, + 495: {region: 0xe2, script: 0x4f, flags: 0x0}, + 496: {region: 0x87, script: 0x4f, flags: 0x0}, + 497: {region: 0x68, script: 0x4f, flags: 0x0}, + 498: {region: 0x97, script: 0x1f, flags: 0x0}, + 499: {region: 0x100, script: 0x4f, flags: 0x0}, + 500: {region: 0x93, script: 0x4f, flags: 0x0}, + 501: {region: 0x9c, script: 0x4f, flags: 0x0}, + 502: {region: 0x97, script: 0x4f, flags: 0x0}, + 503: {region: 0x31, script: 0x2, flags: 0x1}, + 504: {region: 0xd9, script: 0x1f, flags: 0x0}, + 505: {region: 0x34, script: 0xe, flags: 0x0}, + 506: {region: 0x4d, script: 0x4f, flags: 0x0}, + 507: {region: 0x70, script: 0x4f, flags: 0x0}, + 508: {region: 0x4d, script: 0x4f, flags: 0x0}, + 509: {region: 0x9a, script: 0x5, flags: 0x0}, + 510: {region: 0x10a, script: 0x4f, flags: 0x0}, + 511: {region: 0x39, script: 0x4f, flags: 0x0}, + 512: {region: 0xcf, script: 0x4f, flags: 0x0}, + 513: {region: 0x102, script: 0x4f, flags: 0x0}, + 514: {region: 0x93, script: 0x4f, flags: 0x0}, + 515: {region: 0x12d, script: 0x4f, flags: 0x0}, + 516: {region: 0x71, script: 0x4f, flags: 0x0}, + 517: {region: 0x104, script: 0x1d, flags: 0x0}, + 518: {region: 0x12e, script: 0x1d, flags: 0x0}, + 519: {region: 0x107, script: 0x4f, flags: 0x0}, + 520: {region: 0x105, script: 0x4f, flags: 0x0}, + 521: {region: 0x12d, script: 0x4f, flags: 0x0}, + 522: {region: 0xa0, script: 0x41, flags: 0x0}, + 523: {region: 0x97, script: 0x1f, flags: 0x0}, + 524: {region: 0x7e, script: 0x4f, flags: 0x0}, + 525: {region: 0x104, script: 0x1d, flags: 0x0}, + 526: {region: 0xa2, script: 0x4f, flags: 0x0}, + 527: {region: 0x93, script: 0x4f, flags: 0x0}, + 528: {region: 0x97, script: 0x4f, flags: 0x0}, + 529: {region: 0x97, script: 0xb5, flags: 0x0}, + 530: {region: 0x12d, script: 0x4f, flags: 0x0}, + 531: {region: 0x9c, script: 0x4f, flags: 0x0}, + 532: {region: 0x97, script: 0x1f, flags: 0x0}, + 533: {region: 0x9c, script: 0x4f, flags: 0x0}, + 534: {region: 0x79, script: 0x4f, flags: 0x0}, + 535: {region: 0x48, script: 0x4f, flags: 0x0}, + 536: {region: 0x33, script: 0x4, flags: 0x1}, + 537: {region: 0x9c, script: 0x4f, flags: 0x0}, + 538: {region: 0x9a, script: 0x5, flags: 0x0}, + 539: {region: 0xd8, script: 0x4f, flags: 0x0}, + 540: {region: 0x4e, script: 0x4f, flags: 0x0}, + 541: {region: 0xcf, script: 0x4f, flags: 0x0}, + 542: {region: 0xcd, script: 0x4f, flags: 0x0}, + 543: {region: 0xc1, script: 0x4f, flags: 0x0}, + 544: {region: 0x4b, script: 0x4f, flags: 0x0}, + 545: {region: 0x94, script: 0x6d, flags: 0x0}, + 546: {region: 0xb4, script: 0x4f, flags: 0x0}, + 548: {region: 0xb8, script: 0xcc, flags: 0x0}, + 549: {region: 0xc2, script: 0x67, flags: 0x0}, + 550: {region: 0xb1, script: 0xbb, flags: 0x0}, + 551: {region: 0x6e, script: 0x4f, flags: 0x0}, + 552: {region: 0x10f, script: 0x4f, flags: 0x0}, + 553: {region: 0xe6, script: 0x5, flags: 0x0}, + 554: {region: 0x10d, script: 0x4f, flags: 0x0}, + 555: {region: 0xe7, script: 0x4f, flags: 0x0}, + 556: {region: 0x93, script: 0x4f, flags: 0x0}, + 557: {region: 0x13f, script: 0x4f, flags: 0x0}, + 558: {region: 0x10a, script: 0x4f, flags: 0x0}, + 560: {region: 0x10a, script: 0x4f, flags: 0x0}, + 561: {region: 0x70, script: 0x4f, flags: 0x0}, + 562: {region: 0x95, script: 0xb2, flags: 0x0}, + 563: {region: 0x70, script: 0x4f, flags: 0x0}, + 564: {region: 0x161, script: 0x4f, flags: 0x0}, + 565: {region: 0xc1, script: 0x4f, flags: 0x0}, + 566: {region: 0x113, script: 0x4f, flags: 0x0}, + 567: {region: 0x121, script: 0xcf, flags: 0x0}, + 568: {region: 0x26, script: 0x4f, flags: 0x0}, + 569: {region: 0x37, script: 0x5, flags: 0x1}, + 570: {region: 0x97, script: 0xbc, flags: 0x0}, + 571: {region: 0x114, script: 0x4f, flags: 0x0}, + 572: {region: 0x112, script: 0x4f, flags: 0x0}, + 573: {region: 0x97, script: 0x1f, flags: 0x0}, + 574: {region: 0x15e, script: 0x4f, flags: 0x0}, + 575: {region: 0x6c, script: 0x4f, flags: 0x0}, + 576: {region: 0x15e, script: 0x4f, flags: 0x0}, + 577: {region: 0x5f, script: 0x4f, flags: 0x0}, + 578: {region: 0x93, script: 0x4f, flags: 0x0}, + 579: {region: 0x12d, script: 0x4f, flags: 0x0}, + 580: {region: 0x82, script: 0x4f, flags: 0x0}, + 581: {region: 0x10a, script: 0x4f, flags: 0x0}, + 582: {region: 0x12d, script: 0x4f, flags: 0x0}, + 583: {region: 0x15c, script: 0x5, flags: 0x0}, + 584: {region: 0x4a, script: 0x4f, flags: 0x0}, + 585: {region: 0x5f, script: 0x4f, flags: 0x0}, + 586: {region: 0x97, script: 0x1f, flags: 0x0}, + 587: {region: 0x93, script: 0x4f, flags: 0x0}, + 588: {region: 0x34, script: 0xe, flags: 0x0}, + 589: {region: 0x99, script: 0xbf, flags: 0x0}, + 590: {region: 0xe7, script: 0x4f, flags: 0x0}, + 591: {region: 0x97, script: 0xc7, flags: 0x0}, + 592: {region: 0xd9, script: 0x1f, flags: 0x0}, + 593: {region: 0xe5, script: 0x4f, flags: 0x0}, + 594: {region: 0x97, script: 0x47, flags: 0x0}, + 595: {region: 0x52, script: 0xc5, flags: 0x0}, + 596: {region: 0xd9, script: 0x1f, flags: 0x0}, + 597: {region: 0xd9, script: 0x1f, flags: 0x0}, + 598: {region: 0x97, script: 0xca, flags: 0x0}, + 599: {region: 0x110, script: 0x4f, flags: 0x0}, + 600: {region: 0x12f, script: 0x4f, flags: 0x0}, + 601: {region: 0x124, script: 0x4f, flags: 0x0}, + 602: {region: 0x3c, script: 0x3, flags: 0x1}, + 603: {region: 0x121, script: 0xcf, flags: 0x0}, + 604: {region: 0xd9, script: 0x1f, flags: 0x0}, + 605: {region: 0xd9, script: 0x1f, flags: 0x0}, + 606: {region: 0xd9, script: 0x1f, flags: 0x0}, + 607: {region: 0x6e, script: 0x26, flags: 0x0}, + 608: {region: 0x6c, script: 0x26, flags: 0x0}, + 609: {region: 0xd4, script: 0x4f, flags: 0x0}, + 610: {region: 0x125, script: 0x4f, flags: 0x0}, + 611: {region: 0x123, script: 0x4f, flags: 0x0}, + 612: {region: 0x31, script: 0x4f, flags: 0x0}, + 613: {region: 0xd9, script: 0x1f, flags: 0x0}, + 614: {region: 0xe5, script: 0x4f, flags: 0x0}, + 615: {region: 0x31, script: 0x4f, flags: 0x0}, + 616: {region: 0xd2, script: 0x4f, flags: 0x0}, + 617: {region: 0x15e, script: 0x4f, flags: 0x0}, + 618: {region: 0x127, script: 0x4f, flags: 0x0}, + 619: {region: 0xcc, script: 0x4f, flags: 0x0}, + 620: {region: 0xe4, script: 0x4f, flags: 0x0}, + 621: {region: 0x129, script: 0x4f, flags: 0x0}, + 622: {region: 0x129, script: 0x4f, flags: 0x0}, + 623: {region: 0x12c, script: 0x4f, flags: 0x0}, + 624: {region: 0x15e, script: 0x4f, flags: 0x0}, + 625: {region: 0x85, script: 0x2c, flags: 0x0}, + 626: {region: 0xd9, script: 0x1f, flags: 0x0}, + 627: {region: 0xe5, script: 0x4f, flags: 0x0}, + 628: {region: 0x42, script: 0xd0, flags: 0x0}, + 629: {region: 0x104, script: 0x1d, flags: 0x0}, + 630: {region: 0x12f, script: 0x4f, flags: 0x0}, + 631: {region: 0x121, script: 0xcf, flags: 0x0}, + 632: {region: 0x31, script: 0x4f, flags: 0x0}, + 633: {region: 0xcc, script: 0x4f, flags: 0x0}, + 634: {region: 0x12b, script: 0x4f, flags: 0x0}, + 636: {region: 0xd2, script: 0x4f, flags: 0x0}, + 637: {region: 0xe3, script: 0x4f, flags: 0x0}, + 638: {region: 0x104, script: 0x1d, flags: 0x0}, + 639: {region: 0xb8, script: 0x4f, flags: 0x0}, + 640: {region: 0x104, script: 0x1d, flags: 0x0}, + 641: {region: 0x3f, script: 0x4, flags: 0x1}, + 642: {region: 0x11a, script: 0xd2, flags: 0x0}, + 643: {region: 0x12e, script: 0x1d, flags: 0x0}, + 644: {region: 0x73, script: 0x4f, flags: 0x0}, + 645: {region: 0x29, script: 0x4f, flags: 0x0}, + 647: {region: 0x43, script: 0x3, flags: 0x1}, + 648: {region: 0x97, script: 0xe, flags: 0x0}, + 649: {region: 0xe6, script: 0x5, flags: 0x0}, + 650: {region: 0x46, script: 0x4, flags: 0x1}, + 651: {region: 0xb2, script: 0xd3, flags: 0x0}, + 652: {region: 0x15e, script: 0x4f, flags: 0x0}, + 653: {region: 0x9c, script: 0x4f, flags: 0x0}, + 654: {region: 0x104, script: 0x4f, flags: 0x0}, + 655: {region: 0x13b, script: 0x4f, flags: 0x0}, + 656: {region: 0x119, script: 0x4f, flags: 0x0}, + 657: {region: 0x35, script: 0x4f, flags: 0x0}, + 658: {region: 0x5f, script: 0x4f, flags: 0x0}, + 659: {region: 0xcf, script: 0x4f, flags: 0x0}, + 660: {region: 0x1, script: 0x4f, flags: 0x0}, + 661: {region: 0x104, script: 0x4f, flags: 0x0}, + 662: {region: 0x69, script: 0x4f, flags: 0x0}, + 663: {region: 0x12d, script: 0x4f, flags: 0x0}, + 664: {region: 0x35, script: 0x4f, flags: 0x0}, + 665: {region: 0x4d, script: 0x4f, flags: 0x0}, + 666: {region: 0x6e, script: 0x26, flags: 0x0}, + 667: {region: 0xe5, script: 0x4f, flags: 0x0}, + 668: {region: 0x2e, script: 0x4f, flags: 0x0}, + 669: {region: 0x97, script: 0xca, flags: 0x0}, + 670: {region: 0x97, script: 0x1f, flags: 0x0}, + 671: {region: 0x13d, script: 0x4f, flags: 0x0}, + 672: {region: 0xa6, script: 0x5, flags: 0x0}, + 673: {region: 0x112, script: 0x4f, flags: 0x0}, + 674: {region: 0x97, script: 0x1f, flags: 0x0}, + 675: {region: 0x52, script: 0x32, flags: 0x0}, + 676: {region: 0x40, script: 0x4f, flags: 0x0}, + 677: {region: 0x129, script: 0x17, flags: 0x0}, + 678: {region: 0x15e, script: 0x4f, flags: 0x0}, + 679: {region: 0x129, script: 0x56, flags: 0x0}, + 680: {region: 0x129, script: 0x57, flags: 0x0}, + 681: {region: 0x7b, script: 0x28, flags: 0x0}, + 682: {region: 0x52, script: 0x5a, flags: 0x0}, + 683: {region: 0x109, script: 0x5e, flags: 0x0}, + 684: {region: 0x106, script: 0x68, flags: 0x0}, + 685: {region: 0x97, script: 0x1f, flags: 0x0}, + 686: {region: 0x12f, script: 0x4f, flags: 0x0}, + 687: {region: 0x9a, script: 0x7c, flags: 0x0}, + 688: {region: 0x15b, script: 0xb4, flags: 0x0}, + 689: {region: 0xd9, script: 0x1f, flags: 0x0}, + 690: {region: 0xcf, script: 0x4f, flags: 0x0}, + 691: {region: 0x73, script: 0x4f, flags: 0x0}, + 692: {region: 0x51, script: 0x4f, flags: 0x0}, + 693: {region: 0x51, script: 0x4f, flags: 0x0}, + 694: {region: 0x1, script: 0x35, flags: 0x0}, + 695: {region: 0xd4, script: 0x4f, flags: 0x0}, + 696: {region: 0x40, script: 0x4f, flags: 0x0}, + 697: {region: 0xcd, script: 0x4f, flags: 0x0}, + 698: {region: 0x52, script: 0x4f, flags: 0x0}, + 699: {region: 0x109, script: 0x4f, flags: 0x0}, + 701: {region: 0xa6, script: 0x5, flags: 0x0}, + 702: {region: 0xd7, script: 0x4f, flags: 0x0}, + 703: {region: 0xb8, script: 0xcc, flags: 0x0}, + 704: {region: 0x4a, script: 0x13, flags: 0x1}, + 705: {region: 0xce, script: 0x4f, flags: 0x0}, + 706: {region: 0x15e, script: 0x4f, flags: 0x0}, + 708: {region: 0x129, script: 0x4f, flags: 0x0}, +} + +// likelyLangList holds lists info associated with likelyLang. +// Size: 372 bytes, 93 elements +var likelyLangList = [93]likelyScriptRegion{ + 0: {region: 0x9a, script: 0x7, flags: 0x0}, + 1: {region: 0x9f, script: 0x69, flags: 0x2}, + 2: {region: 0x11a, script: 0x73, flags: 0x2}, + 3: {region: 0x31, script: 0x4f, flags: 0x0}, + 4: {region: 0x99, script: 0x5, flags: 0x4}, + 5: {region: 0x9a, script: 0x5, flags: 0x4}, + 6: {region: 0x104, script: 0x1d, flags: 0x4}, + 7: {region: 0x9a, script: 0x5, flags: 0x2}, + 8: {region: 0x97, script: 0xe, flags: 0x0}, + 9: {region: 0x34, script: 0x15, flags: 0x2}, + 10: {region: 0x104, script: 0x1d, flags: 0x0}, + 11: {region: 0x37, script: 0x29, flags: 0x2}, + 12: {region: 0x132, script: 0x4f, flags: 0x0}, + 13: {region: 0x79, script: 0xb7, flags: 0x2}, + 14: {region: 0x5c, script: 0x1c, flags: 0x0}, + 15: {region: 0x85, script: 0x53, flags: 0x2}, + 16: {region: 0xd4, script: 0x4f, flags: 0x0}, + 17: {region: 0x51, script: 0x5, flags: 0x4}, + 18: {region: 0x109, script: 0x5, flags: 0x4}, + 19: {region: 0xac, script: 0x1d, flags: 0x0}, + 20: {region: 0x23, script: 0x5, flags: 0x4}, + 21: {region: 0x52, script: 0x5, flags: 0x4}, + 22: {region: 0x9a, script: 0x5, flags: 0x4}, + 23: {region: 0xc3, script: 0x5, flags: 0x4}, + 24: {region: 0x52, script: 0x5, flags: 0x2}, + 25: {region: 0x129, script: 0x4f, flags: 0x0}, + 26: {region: 0xae, script: 0x5, flags: 0x4}, + 27: {region: 0x99, script: 0x5, flags: 0x2}, + 28: {region: 0xa3, script: 0x1d, flags: 0x0}, + 29: {region: 0x52, script: 0x5, flags: 0x4}, + 30: {region: 0x129, script: 0x4f, flags: 0x4}, + 31: {region: 0x52, script: 0x5, flags: 0x2}, + 32: {region: 0x129, script: 0x4f, flags: 0x2}, + 33: {region: 0xd9, script: 0x1f, flags: 0x0}, + 34: {region: 0x97, script: 0x51, flags: 0x2}, + 35: {region: 0x81, script: 0x4f, flags: 0x0}, + 36: {region: 0x82, script: 0x6b, flags: 0x4}, + 37: {region: 0x82, script: 0x6b, flags: 0x2}, + 38: {region: 0xc3, script: 0x1d, flags: 0x0}, + 39: {region: 0x52, script: 0x62, flags: 0x4}, + 40: {region: 0x52, script: 0x62, flags: 0x2}, + 41: {region: 0xce, script: 0x4f, flags: 0x0}, + 42: {region: 0x49, script: 0x5, flags: 0x4}, + 43: {region: 0x93, script: 0x5, flags: 0x4}, + 44: {region: 0x97, script: 0x2e, flags: 0x0}, + 45: {region: 0xe6, script: 0x5, flags: 0x4}, + 46: {region: 0xe6, script: 0x5, flags: 0x2}, + 47: {region: 0x9a, script: 0x77, flags: 0x0}, + 48: {region: 0x52, script: 0x78, flags: 0x2}, + 49: {region: 0xb8, script: 0xcc, flags: 0x0}, + 50: {region: 0xd7, script: 0x4f, flags: 0x4}, + 51: {region: 0xe6, script: 0x5, flags: 0x0}, + 52: {region: 0x97, script: 0x1f, flags: 0x2}, + 53: {region: 0x97, script: 0x44, flags: 0x2}, + 54: {region: 0x97, script: 0xba, flags: 0x2}, + 55: {region: 0x103, script: 0x1d, flags: 0x0}, + 56: {region: 0xbb, script: 0x4f, flags: 0x4}, + 57: {region: 0x102, script: 0x4f, flags: 0x4}, + 58: {region: 0x104, script: 0x4f, flags: 0x4}, + 59: {region: 0x129, script: 0x4f, flags: 0x4}, + 60: {region: 0x122, script: 0x1d, flags: 0x0}, + 61: {region: 0xe6, script: 0x5, flags: 0x4}, + 62: {region: 0xe6, script: 0x5, flags: 0x2}, + 63: {region: 0x52, script: 0x5, flags: 0x0}, + 64: {region: 0xac, script: 0x1d, flags: 0x4}, + 65: {region: 0xc3, script: 0x1d, flags: 0x4}, + 66: {region: 0xac, script: 0x1d, flags: 0x2}, + 67: {region: 0x97, script: 0xe, flags: 0x0}, + 68: {region: 0xd9, script: 0x1f, flags: 0x4}, + 69: {region: 0xd9, script: 0x1f, flags: 0x2}, + 70: {region: 0x134, script: 0x4f, flags: 0x0}, + 71: {region: 0x23, script: 0x5, flags: 0x4}, + 72: {region: 0x52, script: 0x1d, flags: 0x4}, + 73: {region: 0x23, script: 0x5, flags: 0x2}, + 74: {region: 0x52, script: 0x32, flags: 0x0}, + 75: {region: 0x2e, script: 0x33, flags: 0x4}, + 76: {region: 0x3d, script: 0x33, flags: 0x4}, + 77: {region: 0x79, script: 0x33, flags: 0x4}, + 78: {region: 0x7c, script: 0x33, flags: 0x4}, + 79: {region: 0x8b, script: 0x33, flags: 0x4}, + 80: {region: 0x93, script: 0x33, flags: 0x4}, + 81: {region: 0xc4, script: 0x33, flags: 0x4}, + 82: {region: 0xce, script: 0x33, flags: 0x4}, + 83: {region: 0xe0, script: 0x33, flags: 0x4}, + 84: {region: 0xe3, script: 0x33, flags: 0x4}, + 85: {region: 0xe5, script: 0x33, flags: 0x4}, + 86: {region: 0x114, script: 0x33, flags: 0x4}, + 87: {region: 0x121, script: 0x33, flags: 0x4}, + 88: {region: 0x12c, script: 0x33, flags: 0x4}, + 89: {region: 0x132, script: 0x33, flags: 0x4}, + 90: {region: 0x13b, script: 0x33, flags: 0x4}, + 91: {region: 0x12c, script: 0x10, flags: 0x2}, + 92: {region: 0x12c, script: 0x33, flags: 0x2}, +} + +type likelyLangScript struct { + lang uint16 + script uint8 + flags uint8 +} + +// likelyRegion is a lookup table, indexed by regionID, for the most likely +// languages and scripts given incomplete information. If more entries exist +// for a given regionID, lang and script are the index and size respectively +// of the list in likelyRegionList. +// TODO: exclude containers and user-definable regions from the list. +// Size: 1420 bytes, 355 elements +var likelyRegion = [355]likelyLangScript{ + 33: {lang: 0x61, script: 0x4f, flags: 0x0}, + 34: {lang: 0x15, script: 0x5, flags: 0x0}, + 35: {lang: 0x0, script: 0x2, flags: 0x1}, + 38: {lang: 0x2, script: 0x2, flags: 0x1}, + 39: {lang: 0x4, script: 0x2, flags: 0x1}, + 41: {lang: 0x1ed, script: 0x4f, flags: 0x0}, + 42: {lang: 0x0, script: 0x4f, flags: 0x0}, + 43: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 44: {lang: 0x22d, script: 0x4f, flags: 0x0}, + 45: {lang: 0x85, script: 0x4f, flags: 0x0}, + 47: {lang: 0x1bc, script: 0x4f, flags: 0x0}, + 48: {lang: 0x245, script: 0x4f, flags: 0x0}, + 49: {lang: 0x24, script: 0x4f, flags: 0x0}, + 50: {lang: 0x6, script: 0x2, flags: 0x1}, + 52: {lang: 0x4b, script: 0xe, flags: 0x0}, + 53: {lang: 0x1bc, script: 0x4f, flags: 0x0}, + 54: {lang: 0xae, script: 0x4f, flags: 0x0}, + 55: {lang: 0x38, script: 0x1d, flags: 0x0}, + 56: {lang: 0x15, script: 0x5, flags: 0x0}, + 57: {lang: 0x1ff, script: 0x4f, flags: 0x0}, + 58: {lang: 0xae, script: 0x4f, flags: 0x0}, + 59: {lang: 0xae, script: 0x4f, flags: 0x0}, + 61: {lang: 0x199, script: 0x4f, flags: 0x0}, + 62: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 63: {lang: 0x1d9, script: 0x4f, flags: 0x0}, + 64: {lang: 0x1ed, script: 0x4f, flags: 0x0}, + 66: {lang: 0x8, script: 0x2, flags: 0x1}, + 68: {lang: 0x0, script: 0x4f, flags: 0x0}, + 70: {lang: 0x2f, script: 0x1d, flags: 0x0}, + 72: {lang: 0x2b6, script: 0x35, flags: 0x2}, + 73: {lang: 0x199, script: 0x5, flags: 0x2}, + 74: {lang: 0x246, script: 0x4f, flags: 0x0}, + 75: {lang: 0xae, script: 0x4f, flags: 0x0}, + 76: {lang: 0xae, script: 0x4f, flags: 0x0}, + 77: {lang: 0x85, script: 0x4f, flags: 0x0}, + 78: {lang: 0xae, script: 0x4f, flags: 0x0}, + 80: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 81: {lang: 0xae, script: 0x4f, flags: 0x0}, + 82: {lang: 0xa, script: 0x4, flags: 0x1}, + 83: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 84: {lang: 0x0, script: 0x4f, flags: 0x0}, + 85: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 88: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 89: {lang: 0x1ed, script: 0x4f, flags: 0x0}, + 90: {lang: 0x1d9, script: 0x4f, flags: 0x0}, + 92: {lang: 0xe, script: 0x2, flags: 0x1}, + 93: {lang: 0x79, script: 0x4f, flags: 0x0}, + 95: {lang: 0x85, script: 0x4f, flags: 0x0}, + 97: {lang: 0x1, script: 0x4f, flags: 0x0}, + 98: {lang: 0x80, script: 0x4f, flags: 0x0}, + 100: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 102: {lang: 0x10, script: 0x2, flags: 0x1}, + 103: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 104: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 105: {lang: 0x9e, script: 0x4f, flags: 0x0}, + 106: {lang: 0x15, script: 0x5, flags: 0x0}, + 107: {lang: 0x15, script: 0x5, flags: 0x0}, + 108: {lang: 0x25f, script: 0x26, flags: 0x0}, + 109: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 110: {lang: 0x12, script: 0x2, flags: 0x1}, + 112: {lang: 0xa7, script: 0x4f, flags: 0x0}, + 113: {lang: 0xe1, script: 0x1f, flags: 0x2}, + 116: {lang: 0xac, script: 0x4f, flags: 0x0}, + 118: {lang: 0xae, script: 0x4f, flags: 0x0}, + 120: {lang: 0xae, script: 0x4f, flags: 0x0}, + 121: {lang: 0x14, script: 0x2, flags: 0x1}, + 123: {lang: 0x16, script: 0x3, flags: 0x1}, + 124: {lang: 0xae, script: 0x4f, flags: 0x0}, + 126: {lang: 0xd, script: 0x4f, flags: 0x0}, + 128: {lang: 0x130, script: 0x4f, flags: 0x0}, + 130: {lang: 0xae, script: 0x4f, flags: 0x0}, + 131: {lang: 0xae, script: 0x4f, flags: 0x0}, + 132: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 133: {lang: 0x19, script: 0x2, flags: 0x1}, + 134: {lang: 0x0, script: 0x4f, flags: 0x0}, + 135: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 137: {lang: 0x1ed, script: 0x4f, flags: 0x0}, + 139: {lang: 0x2c0, script: 0x33, flags: 0x0}, + 140: {lang: 0x0, script: 0x4f, flags: 0x0}, + 141: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 142: {lang: 0xed, script: 0x4f, flags: 0x0}, + 143: {lang: 0xf0, script: 0x4f, flags: 0x0}, + 144: {lang: 0xf1, script: 0x4f, flags: 0x0}, + 146: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 147: {lang: 0x1b, script: 0x2, flags: 0x1}, + 149: {lang: 0xdf, script: 0x35, flags: 0x0}, + 151: {lang: 0x1d, script: 0x3, flags: 0x1}, + 153: {lang: 0x15, script: 0x5, flags: 0x0}, + 154: {lang: 0x20, script: 0x2, flags: 0x1}, + 155: {lang: 0x101, script: 0x4f, flags: 0x0}, + 156: {lang: 0x102, script: 0x4f, flags: 0x0}, + 159: {lang: 0x15, script: 0x5, flags: 0x0}, + 160: {lang: 0x106, script: 0x3e, flags: 0x0}, + 162: {lang: 0x246, script: 0x4f, flags: 0x0}, + 163: {lang: 0x14c, script: 0x1d, flags: 0x0}, + 164: {lang: 0x22, script: 0x3, flags: 0x1}, + 166: {lang: 0x25, script: 0x2, flags: 0x1}, + 168: {lang: 0x135, script: 0x48, flags: 0x0}, + 169: {lang: 0x135, script: 0x48, flags: 0x0}, + 170: {lang: 0x15, script: 0x5, flags: 0x0}, + 172: {lang: 0x205, script: 0x1d, flags: 0x0}, + 173: {lang: 0x27, script: 0x2, flags: 0x1}, + 174: {lang: 0x15, script: 0x5, flags: 0x0}, + 176: {lang: 0x85, script: 0x4f, flags: 0x0}, + 177: {lang: 0x226, script: 0xbb, flags: 0x0}, + 179: {lang: 0x240, script: 0x4f, flags: 0x0}, + 180: {lang: 0x168, script: 0x4f, flags: 0x0}, + 181: {lang: 0xae, script: 0x4f, flags: 0x0}, + 182: {lang: 0x16f, script: 0x4f, flags: 0x0}, + 183: {lang: 0x15, script: 0x5, flags: 0x0}, + 184: {lang: 0x29, script: 0x2, flags: 0x1}, + 185: {lang: 0xae, script: 0x4f, flags: 0x0}, + 186: {lang: 0x2b, script: 0x2, flags: 0x1}, + 187: {lang: 0x239, script: 0x4f, flags: 0x0}, + 188: {lang: 0xae, script: 0x4f, flags: 0x0}, + 189: {lang: 0x182, script: 0x4f, flags: 0x0}, + 192: {lang: 0x2d, script: 0x2, flags: 0x1}, + 193: {lang: 0x49, script: 0x4f, flags: 0x0}, + 194: {lang: 0x2f, script: 0x2, flags: 0x1}, + 195: {lang: 0x31, script: 0x2, flags: 0x1}, + 196: {lang: 0x33, script: 0x2, flags: 0x1}, + 198: {lang: 0xae, script: 0x4f, flags: 0x0}, + 199: {lang: 0x35, script: 0x2, flags: 0x1}, + 201: {lang: 0x19a, script: 0x4f, flags: 0x0}, + 202: {lang: 0x37, script: 0x3, flags: 0x1}, + 203: {lang: 0x8f, script: 0xce, flags: 0x0}, + 205: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 206: {lang: 0x199, script: 0x4f, flags: 0x0}, + 207: {lang: 0x1ed, script: 0x4f, flags: 0x0}, + 208: {lang: 0xa, script: 0x4f, flags: 0x0}, + 209: {lang: 0xae, script: 0x4f, flags: 0x0}, + 210: {lang: 0xdb, script: 0x4f, flags: 0x0}, + 212: {lang: 0xdb, script: 0x5, flags: 0x2}, + 214: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 215: {lang: 0x1bc, script: 0x4f, flags: 0x0}, + 216: {lang: 0x1ae, script: 0x4f, flags: 0x0}, + 217: {lang: 0x1b3, script: 0x1f, flags: 0x0}, + 223: {lang: 0x15, script: 0x5, flags: 0x0}, + 224: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 226: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 227: {lang: 0xae, script: 0x4f, flags: 0x0}, + 228: {lang: 0x26c, script: 0x4f, flags: 0x0}, + 229: {lang: 0xa9, script: 0x4f, flags: 0x0}, + 230: {lang: 0x3a, script: 0x3, flags: 0x1}, + 231: {lang: 0x3d, script: 0x2, flags: 0x1}, + 232: {lang: 0xae, script: 0x4f, flags: 0x0}, + 234: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 235: {lang: 0x15, script: 0x5, flags: 0x0}, + 236: {lang: 0x1ed, script: 0x4f, flags: 0x0}, + 238: {lang: 0x1da, script: 0x4f, flags: 0x0}, + 239: {lang: 0xc9, script: 0x4f, flags: 0x0}, + 241: {lang: 0x15, script: 0x5, flags: 0x0}, + 256: {lang: 0xae, script: 0x4f, flags: 0x0}, + 258: {lang: 0x3f, script: 0x2, flags: 0x1}, + 259: {lang: 0x239, script: 0x1d, flags: 0x0}, + 260: {lang: 0x41, script: 0x2, flags: 0x1}, + 261: {lang: 0x208, script: 0x4f, flags: 0x0}, + 262: {lang: 0x15, script: 0x5, flags: 0x0}, + 264: {lang: 0xae, script: 0x4f, flags: 0x0}, + 265: {lang: 0x15, script: 0x5, flags: 0x0}, + 266: {lang: 0x43, script: 0x2, flags: 0x1}, + 269: {lang: 0x22a, script: 0x4f, flags: 0x0}, + 270: {lang: 0x1ae, script: 0x4f, flags: 0x0}, + 271: {lang: 0x45, script: 0x2, flags: 0x1}, + 273: {lang: 0x102, script: 0x4f, flags: 0x0}, + 274: {lang: 0xae, script: 0x4f, flags: 0x0}, + 275: {lang: 0x236, script: 0x4f, flags: 0x0}, + 276: {lang: 0x1bc, script: 0x4f, flags: 0x0}, + 278: {lang: 0x1ed, script: 0x4f, flags: 0x0}, + 280: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 282: {lang: 0x47, script: 0x2, flags: 0x1}, + 286: {lang: 0xae, script: 0x4f, flags: 0x0}, + 287: {lang: 0xae, script: 0x4f, flags: 0x0}, + 288: {lang: 0xae, script: 0x4f, flags: 0x0}, + 289: {lang: 0x49, script: 0x3, flags: 0x1}, + 290: {lang: 0x4c, script: 0x2, flags: 0x1}, + 291: {lang: 0x263, script: 0x4f, flags: 0x0}, + 292: {lang: 0x1ed, script: 0x4f, flags: 0x0}, + 293: {lang: 0x262, script: 0x4f, flags: 0x0}, + 294: {lang: 0x4e, script: 0x2, flags: 0x1}, + 295: {lang: 0x26a, script: 0x4f, flags: 0x0}, + 297: {lang: 0x50, script: 0x4, flags: 0x1}, + 299: {lang: 0x27a, script: 0x4f, flags: 0x0}, + 300: {lang: 0x54, script: 0x2, flags: 0x1}, + 301: {lang: 0x246, script: 0x4f, flags: 0x0}, + 302: {lang: 0x56, script: 0x3, flags: 0x1}, + 303: {lang: 0x246, script: 0x4f, flags: 0x0}, + 306: {lang: 0x2b6, script: 0x35, flags: 0x2}, + 307: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 308: {lang: 0x28a, script: 0x4f, flags: 0x0}, + 309: {lang: 0x102, script: 0x4f, flags: 0x0}, + 312: {lang: 0x9c, script: 0x4f, flags: 0x0}, + 315: {lang: 0x28f, script: 0x4f, flags: 0x0}, + 316: {lang: 0x41, script: 0x4f, flags: 0x0}, + 317: {lang: 0xae, script: 0x4f, flags: 0x0}, + 319: {lang: 0x22d, script: 0x4f, flags: 0x0}, + 330: {lang: 0x59, script: 0x2, flags: 0x1}, + 347: {lang: 0x15, script: 0x5, flags: 0x0}, + 348: {lang: 0x5b, script: 0x2, flags: 0x1}, + 353: {lang: 0x234, script: 0x4f, flags: 0x0}, +} + +// likelyRegionList holds lists info associated with likelyRegion. +// Size: 372 bytes, 93 elements +var likelyRegionList = [93]likelyLangScript{ + 0: {lang: 0xa3, script: 0x5, flags: 0x0}, + 1: {lang: 0x262, script: 0x4f, flags: 0x0}, + 2: {lang: 0x238, script: 0x4f, flags: 0x0}, + 3: {lang: 0x18b, script: 0x1d, flags: 0x0}, + 4: {lang: 0xf2, script: 0x8, flags: 0x0}, + 5: {lang: 0x144, script: 0x4f, flags: 0x0}, + 6: {lang: 0x54, script: 0x4f, flags: 0x0}, + 7: {lang: 0x239, script: 0x1d, flags: 0x0}, + 8: {lang: 0x92, script: 0xd0, flags: 0x0}, + 9: {lang: 0x1b3, script: 0x1f, flags: 0x0}, + 10: {lang: 0x2c0, script: 0x32, flags: 0x0}, + 11: {lang: 0x281, script: 0x5, flags: 0x0}, + 12: {lang: 0x2ba, script: 0x4f, flags: 0x0}, + 13: {lang: 0x156, script: 0xcf, flags: 0x0}, + 14: {lang: 0x99, script: 0x2c, flags: 0x0}, + 15: {lang: 0x26d, script: 0x4f, flags: 0x0}, + 16: {lang: 0x15, script: 0x5, flags: 0x0}, + 17: {lang: 0xae, script: 0x4f, flags: 0x0}, + 18: {lang: 0x11, script: 0x26, flags: 0x0}, + 19: {lang: 0x9a, script: 0x4f, flags: 0x0}, + 20: {lang: 0x140, script: 0x5, flags: 0x2}, + 21: {lang: 0x2b6, script: 0x35, flags: 0x2}, + 22: {lang: 0x110, script: 0x28, flags: 0x0}, + 23: {lang: 0x2, script: 0x1d, flags: 0x0}, + 24: {lang: 0x144, script: 0x4f, flags: 0x0}, + 25: {lang: 0x99, script: 0x2c, flags: 0x0}, + 26: {lang: 0x18b, script: 0x1d, flags: 0x0}, + 27: {lang: 0xf7, script: 0x4f, flags: 0x0}, + 28: {lang: 0x199, script: 0x5, flags: 0x0}, + 29: {lang: 0xe0, script: 0x1f, flags: 0x0}, + 30: {lang: 0x289, script: 0x5, flags: 0x0}, + 31: {lang: 0x128, script: 0x67, flags: 0x0}, + 32: {lang: 0xa3, script: 0x5, flags: 0x0}, + 33: {lang: 0x262, script: 0x4f, flags: 0x0}, + 34: {lang: 0x132, script: 0x43, flags: 0x0}, + 35: {lang: 0x6d, script: 0x5, flags: 0x0}, + 36: {lang: 0x11b, script: 0xcf, flags: 0x0}, + 37: {lang: 0x15, script: 0x5, flags: 0x0}, + 38: {lang: 0xae, script: 0x4f, flags: 0x0}, + 39: {lang: 0x164, script: 0x4c, flags: 0x0}, + 40: {lang: 0x11b, script: 0xcf, flags: 0x0}, + 41: {lang: 0x15, script: 0x5, flags: 0x0}, + 42: {lang: 0xae, script: 0x4f, flags: 0x0}, + 43: {lang: 0x201, script: 0x4f, flags: 0x0}, + 44: {lang: 0x283, script: 0x1d, flags: 0x0}, + 45: {lang: 0x18b, script: 0x1d, flags: 0x0}, + 46: {lang: 0x238, script: 0x4f, flags: 0x0}, + 47: {lang: 0x1a4, script: 0x67, flags: 0x0}, + 48: {lang: 0x113, script: 0x4f, flags: 0x0}, + 49: {lang: 0x18e, script: 0x1d, flags: 0x0}, + 50: {lang: 0x12e, script: 0x5, flags: 0x0}, + 51: {lang: 0x2c0, script: 0x33, flags: 0x0}, + 52: {lang: 0x1ed, script: 0x4f, flags: 0x0}, + 53: {lang: 0x15, script: 0x5, flags: 0x0}, + 54: {lang: 0xae, script: 0x4f, flags: 0x0}, + 55: {lang: 0x181, script: 0x4f, flags: 0x0}, + 56: {lang: 0x289, script: 0x5, flags: 0x0}, + 57: {lang: 0x40, script: 0x1f, flags: 0x0}, + 58: {lang: 0x289, script: 0x5, flags: 0x0}, + 59: {lang: 0x289, script: 0x5, flags: 0x0}, + 60: {lang: 0x58, script: 0x1f, flags: 0x0}, + 61: {lang: 0x1e5, script: 0x4f, flags: 0x0}, + 62: {lang: 0x2f, script: 0x1d, flags: 0x0}, + 63: {lang: 0x201, script: 0x4f, flags: 0x0}, + 64: {lang: 0x38, script: 0x1d, flags: 0x0}, + 65: {lang: 0x205, script: 0x1d, flags: 0x0}, + 66: {lang: 0x13e, script: 0x4f, flags: 0x0}, + 67: {lang: 0x245, script: 0x4f, flags: 0x0}, + 68: {lang: 0x2b6, script: 0x35, flags: 0x0}, + 69: {lang: 0x228, script: 0x4f, flags: 0x0}, + 70: {lang: 0x283, script: 0x1d, flags: 0x0}, + 71: {lang: 0x15, script: 0x5, flags: 0x0}, + 72: {lang: 0xae, script: 0x4f, flags: 0x0}, + 73: {lang: 0x25b, script: 0xcf, flags: 0x0}, + 74: {lang: 0x180, script: 0x5, flags: 0x0}, + 75: {lang: 0x190, script: 0x67, flags: 0x0}, + 76: {lang: 0x25a, script: 0x1d, flags: 0x0}, + 77: {lang: 0xa3, script: 0x5, flags: 0x0}, + 78: {lang: 0x15, script: 0x5, flags: 0x0}, + 79: {lang: 0xae, script: 0x4f, flags: 0x0}, + 80: {lang: 0x26d, script: 0x4f, flags: 0x0}, + 81: {lang: 0x24, script: 0x5, flags: 0x0}, + 82: {lang: 0x117, script: 0x1d, flags: 0x0}, + 83: {lang: 0x3b, script: 0x2c, flags: 0x0}, + 84: {lang: 0x2c0, script: 0x33, flags: 0x0}, + 85: {lang: 0x26f, script: 0x4f, flags: 0x0}, + 86: {lang: 0x283, script: 0x1d, flags: 0x0}, + 87: {lang: 0x2b6, script: 0x35, flags: 0x0}, + 88: {lang: 0x1e5, script: 0x4f, flags: 0x0}, + 89: {lang: 0x238, script: 0x4f, flags: 0x0}, + 90: {lang: 0x239, script: 0x1d, flags: 0x0}, + 91: {lang: 0xae, script: 0x4f, flags: 0x0}, + 92: {lang: 0x247, script: 0x5, flags: 0x0}, +} + +type likelyTag struct { + lang uint16 + region uint16 + script uint8 +} + +// Size: 192 bytes, 32 elements +var likelyRegionGroup = [32]likelyTag{ + 1: {lang: 0x9a, region: 0xd4, script: 0x4f}, + 2: {lang: 0x9a, region: 0x132, script: 0x4f}, + 3: {lang: 0x1ed, region: 0x40, script: 0x4f}, + 4: {lang: 0x9a, region: 0x2e, script: 0x4f}, + 5: {lang: 0x9a, region: 0xd4, script: 0x4f}, + 6: {lang: 0x9c, region: 0xcd, script: 0x4f}, + 7: {lang: 0x246, region: 0x12d, script: 0x4f}, + 8: {lang: 0x15, region: 0x6a, script: 0x5}, + 9: {lang: 0x246, region: 0x4a, script: 0x4f}, + 10: {lang: 0x9a, region: 0x15e, script: 0x4f}, + 11: {lang: 0x9a, region: 0x132, script: 0x4f}, + 12: {lang: 0x9a, region: 0x132, script: 0x4f}, + 13: {lang: 0x9c, region: 0x58, script: 0x4f}, + 14: {lang: 0x2c0, region: 0x52, script: 0x32}, + 15: {lang: 0xe0, region: 0x97, script: 0x1f}, + 16: {lang: 0xf7, region: 0x93, script: 0x4f}, + 17: {lang: 0x102, region: 0x9c, script: 0x4f}, + 18: {lang: 0x9a, region: 0x2e, script: 0x4f}, + 19: {lang: 0x9a, region: 0xe4, script: 0x4f}, + 20: {lang: 0x9a, region: 0x88, script: 0x4f}, + 21: {lang: 0x22d, region: 0x13f, script: 0x4f}, + 22: {lang: 0x2c0, region: 0x52, script: 0x32}, + 23: {lang: 0x28a, region: 0x134, script: 0x4f}, + 24: {lang: 0x15, region: 0x106, script: 0x5}, + 25: {lang: 0x205, region: 0x104, script: 0x1d}, + 26: {lang: 0x205, region: 0x104, script: 0x1d}, + 27: {lang: 0x9a, region: 0x79, script: 0x4f}, + 28: {lang: 0x85, region: 0x5f, script: 0x4f}, + 29: {lang: 0x9c, region: 0x1e, script: 0x4f}, + 30: {lang: 0x9a, region: 0x98, script: 0x4f}, + 31: {lang: 0x9a, region: 0x79, script: 0x4f}, +} + +type mutualIntelligibility struct { + want uint16 + have uint16 + conf uint8 + oneway bool +} + +type scriptIntelligibility struct { + lang uint16 + want uint8 + have uint8 + conf uint8 +} + +// matchLang holds pairs of langIDs of base languages that are typically +// mutually intelligible. Each pair is associated with a confidence and +// whether the intelligibility goes one or both ways. +// Size: 708 bytes, 118 elements +var matchLang = [118]mutualIntelligibility{ + 0: {want: 0x1c0, have: 0x1ae, conf: 0x2, oneway: false}, + 1: {want: 0x144, have: 0x6f, conf: 0x2, oneway: false}, + 2: {want: 0xed, have: 0x54, conf: 0x2, oneway: false}, + 3: {want: 0x223, have: 0x54, conf: 0x2, oneway: false}, + 4: {want: 0x239, have: 0x54, conf: 0x2, oneway: false}, + 5: {want: 0x223, have: 0xed, conf: 0x2, oneway: false}, + 6: {want: 0x239, have: 0xed, conf: 0x2, oneway: false}, + 7: {want: 0x223, have: 0x239, conf: 0x2, oneway: false}, + 8: {want: 0x23f, have: 0x1, conf: 0x2, oneway: false}, + 9: {want: 0xd1, have: 0x85, conf: 0x2, oneway: true}, + 10: {want: 0x153, have: 0x85, conf: 0x2, oneway: true}, + 11: {want: 0x80, have: 0x1c0, conf: 0x2, oneway: false}, + 12: {want: 0x80, have: 0x1ae, conf: 0x2, oneway: false}, + 13: {want: 0x6f, have: 0x144, conf: 0x2, oneway: false}, + 14: {want: 0x2, have: 0x205, conf: 0x2, oneway: true}, + 15: {want: 0x5, have: 0x9a, conf: 0x2, oneway: true}, + 16: {want: 0xa, have: 0x1bc, conf: 0x2, oneway: true}, + 17: {want: 0xd, have: 0x9a, conf: 0x2, oneway: true}, + 18: {want: 0x23, have: 0x9c, conf: 0x2, oneway: true}, + 19: {want: 0x24, have: 0x205, conf: 0x2, oneway: true}, + 20: {want: 0x2f, have: 0x205, conf: 0x2, oneway: true}, + 21: {want: 0x31, have: 0x9a, conf: 0x2, oneway: true}, + 22: {want: 0x3c, have: 0xe0, conf: 0x2, oneway: true}, + 23: {want: 0x4b, have: 0x9a, conf: 0x2, oneway: true}, + 24: {want: 0x50, have: 0xae, conf: 0x2, oneway: true}, + 25: {want: 0x65, have: 0xa9, conf: 0x2, oneway: true}, + 26: {want: 0x6c, have: 0x9a, conf: 0x2, oneway: true}, + 27: {want: 0x6f, have: 0x15, conf: 0x2, oneway: true}, + 28: {want: 0x70, have: 0xae, conf: 0x2, oneway: true}, + 29: {want: 0x78, have: 0xae, conf: 0x2, oneway: true}, + 30: {want: 0x7f, have: 0x9a, conf: 0x2, oneway: true}, + 31: {want: 0x94, have: 0x9a, conf: 0x2, oneway: true}, + 32: {want: 0x9b, have: 0x9a, conf: 0x2, oneway: true}, + 33: {want: 0x9e, have: 0xa7, conf: 0x2, oneway: true}, + 34: {want: 0xa0, have: 0x9c, conf: 0x2, oneway: true}, + 35: {want: 0xac, have: 0x80, conf: 0x2, oneway: true}, + 36: {want: 0xb8, have: 0x1bc, conf: 0x2, oneway: true}, + 37: {want: 0xb9, have: 0x9a, conf: 0x2, oneway: true}, + 38: {want: 0xba, have: 0x9a, conf: 0x2, oneway: true}, + 39: {want: 0xc1, have: 0x9a, conf: 0x2, oneway: true}, + 40: {want: 0xc7, have: 0x9c, conf: 0x2, oneway: true}, + 41: {want: 0xc9, have: 0x9c, conf: 0x2, oneway: true}, + 42: {want: 0xd2, have: 0xe0, conf: 0x2, oneway: true}, + 43: {want: 0xdb, have: 0x9a, conf: 0x2, oneway: true}, + 44: {want: 0xdd, have: 0x9a, conf: 0x2, oneway: true}, + 45: {want: 0xf0, have: 0xae, conf: 0x2, oneway: true}, + 46: {want: 0xf2, have: 0x205, conf: 0x2, oneway: true}, + 47: {want: 0xf4, have: 0x9a, conf: 0x2, oneway: true}, + 48: {want: 0xf9, have: 0x9a, conf: 0x2, oneway: true}, + 49: {want: 0x101, have: 0x9a, conf: 0x2, oneway: true}, + 50: {want: 0x10e, have: 0xf7, conf: 0x2, oneway: true}, + 51: {want: 0x110, have: 0x9a, conf: 0x2, oneway: true}, + 52: {want: 0x121, have: 0xae, conf: 0x2, oneway: true}, + 53: {want: 0x12e, have: 0x205, conf: 0x2, oneway: true}, + 54: {want: 0x132, have: 0x9a, conf: 0x2, oneway: true}, + 55: {want: 0x134, have: 0x9a, conf: 0x2, oneway: true}, + 56: {want: 0x13c, have: 0x9a, conf: 0x2, oneway: true}, + 57: {want: 0x144, have: 0x26d, conf: 0x2, oneway: true}, + 58: {want: 0x14c, have: 0x205, conf: 0x2, oneway: true}, + 59: {want: 0x14d, have: 0x102, conf: 0x2, oneway: true}, + 60: {want: 0x159, have: 0x9a, conf: 0x2, oneway: true}, + 61: {want: 0x163, have: 0xae, conf: 0x2, oneway: true}, + 62: {want: 0x164, have: 0x9a, conf: 0x2, oneway: true}, + 63: {want: 0x166, have: 0x9a, conf: 0x2, oneway: true}, + 64: {want: 0x16b, have: 0xae, conf: 0x2, oneway: true}, + 65: {want: 0x181, have: 0x9a, conf: 0x2, oneway: true}, + 66: {want: 0x182, have: 0xae, conf: 0x2, oneway: true}, + 67: {want: 0x188, have: 0x9a, conf: 0x2, oneway: true}, + 68: {want: 0x18b, have: 0x38, conf: 0x2, oneway: true}, + 69: {want: 0x18c, have: 0x9a, conf: 0x2, oneway: true}, + 70: {want: 0x18e, have: 0x205, conf: 0x2, oneway: true}, + 71: {want: 0x195, have: 0xe0, conf: 0x2, oneway: true}, + 72: {want: 0x199, have: 0xf7, conf: 0x2, oneway: true}, + 73: {want: 0x19a, have: 0x9a, conf: 0x2, oneway: true}, + 74: {want: 0x1a4, have: 0x9a, conf: 0x2, oneway: true}, + 75: {want: 0x1b3, have: 0x9a, conf: 0x2, oneway: true}, + 76: {want: 0x1be, have: 0x1ae, conf: 0x2, oneway: false}, + 77: {want: 0x1be, have: 0x1c0, conf: 0x2, oneway: true}, + 78: {want: 0x1c7, have: 0x9a, conf: 0x2, oneway: true}, + 79: {want: 0x1cb, have: 0x9a, conf: 0x2, oneway: true}, + 80: {want: 0x1cd, have: 0x9a, conf: 0x2, oneway: true}, + 81: {want: 0x1cf, have: 0xae, conf: 0x2, oneway: true}, + 82: {want: 0x1d1, have: 0x9a, conf: 0x2, oneway: true}, + 83: {want: 0x1d2, have: 0x9a, conf: 0x2, oneway: true}, + 84: {want: 0x1d5, have: 0x9a, conf: 0x2, oneway: true}, + 85: {want: 0x1dc, have: 0x9a, conf: 0x2, oneway: true}, + 86: {want: 0x1ec, have: 0x9a, conf: 0x2, oneway: true}, + 87: {want: 0x1ef, have: 0x9c, conf: 0x2, oneway: true}, + 88: {want: 0x1fa, have: 0x85, conf: 0x2, oneway: true}, + 89: {want: 0x1ff, have: 0x9a, conf: 0x2, oneway: true}, + 90: {want: 0x208, have: 0xae, conf: 0x2, oneway: true}, + 91: {want: 0x20b, have: 0xe0, conf: 0x2, oneway: true}, + 92: {want: 0x218, have: 0x9a, conf: 0x2, oneway: true}, + 93: {want: 0x226, have: 0x9a, conf: 0x2, oneway: true}, + 94: {want: 0x234, have: 0x9a, conf: 0x2, oneway: true}, + 95: {want: 0x236, have: 0x9a, conf: 0x2, oneway: true}, + 96: {want: 0x238, have: 0x9a, conf: 0x2, oneway: true}, + 97: {want: 0x240, have: 0x9a, conf: 0x2, oneway: true}, + 98: {want: 0x242, have: 0xf7, conf: 0x2, oneway: true}, + 99: {want: 0x246, have: 0x9a, conf: 0x2, oneway: true}, + 100: {want: 0x24f, have: 0x9a, conf: 0x2, oneway: true}, + 101: {want: 0x256, have: 0x9a, conf: 0x2, oneway: true}, + 102: {want: 0x25a, have: 0x205, conf: 0x2, oneway: true}, + 103: {want: 0x25f, have: 0x9a, conf: 0x2, oneway: true}, + 104: {want: 0x262, have: 0x205, conf: 0x2, oneway: true}, + 105: {want: 0x3616, have: 0x9a, conf: 0x2, oneway: true}, + 106: {want: 0x269, have: 0x9a, conf: 0x2, oneway: true}, + 107: {want: 0x26a, have: 0x9a, conf: 0x2, oneway: true}, + 108: {want: 0x275, have: 0x205, conf: 0x2, oneway: true}, + 109: {want: 0x279, have: 0x9a, conf: 0x2, oneway: true}, + 110: {want: 0x281, have: 0x2c0, conf: 0x2, oneway: true}, + 111: {want: 0x289, have: 0x9a, conf: 0x2, oneway: true}, + 112: {want: 0x28a, have: 0x205, conf: 0x2, oneway: true}, + 113: {want: 0x2a1, have: 0xae, conf: 0x2, oneway: true}, + 114: {want: 0x2a6, have: 0x9a, conf: 0x2, oneway: true}, + 115: {want: 0x2b6, have: 0x9a, conf: 0x2, oneway: true}, + 116: {want: 0x2b7, have: 0x9a, conf: 0x2, oneway: true}, + 117: {want: 0x2c2, have: 0x9a, conf: 0x2, oneway: true}, +} + +// matchScript holds pairs of scriptIDs where readers of one script +// can typically also read the other. Each is associated with a confidence. +// Size: 24 bytes, 4 elements +var matchScript = [4]scriptIntelligibility{ + 0: {lang: 0x239, want: 0x4f, have: 0x1d, conf: 0x2}, + 1: {lang: 0x239, want: 0x1d, have: 0x4f, conf: 0x2}, + 2: {lang: 0x0, want: 0x32, have: 0x33, conf: 0x1}, + 3: {lang: 0x0, want: 0x33, have: 0x32, conf: 0x1}, +} + +// Size: 128 bytes, 32 elements +var regionContainment = [32]uint32{ + 0xffffffff, 0x000007a2, 0x00003044, 0x00000008, + 0x403c0010, 0x00000020, 0x00000040, 0x00000080, + 0x00000100, 0x00000200, 0x00000400, 0x2000384c, + 0x00001000, 0x00002000, 0x00004000, 0x00008000, + 0x00010000, 0x00020000, 0x00040000, 0x00080000, + 0x00100000, 0x00200000, 0x01c1c000, 0x00800000, + 0x01000000, 0x1e020000, 0x04000000, 0x08000000, + 0x10000000, 0x20002048, 0x40000000, 0x80000000, +} + +// regionInclusion maps region identifiers to sets of regions in regionInclusionBits, +// where each set holds all groupings that are directly connected in a region +// containment graph. +// Size: 355 bytes, 355 elements +var regionInclusion = [355]uint8{ + // Entry 0 - 3F + 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x20, + 0x21, 0x22, 0x23, 0x24, 0x25, 0x25, 0x22, 0x23, + 0x25, 0x26, 0x21, 0x27, 0x28, 0x29, 0x2a, 0x25, + 0x2b, 0x23, 0x22, 0x25, 0x24, 0x29, 0x2c, 0x2d, + 0x23, 0x2e, 0x2c, 0x25, 0x2f, 0x30, 0x27, 0x25, + // Entry 40 - 7F + 0x27, 0x25, 0x24, 0x30, 0x21, 0x31, 0x32, 0x33, + 0x2f, 0x21, 0x26, 0x26, 0x26, 0x34, 0x2c, 0x28, + 0x27, 0x26, 0x35, 0x27, 0x21, 0x33, 0x22, 0x20, + 0x25, 0x2c, 0x25, 0x21, 0x36, 0x2d, 0x34, 0x29, + 0x21, 0x2e, 0x37, 0x25, 0x25, 0x20, 0x38, 0x38, + 0x27, 0x37, 0x38, 0x38, 0x2e, 0x39, 0x2e, 0x1f, + 0x37, 0x3a, 0x27, 0x3b, 0x2b, 0x20, 0x29, 0x34, + 0x26, 0x37, 0x25, 0x23, 0x27, 0x2b, 0x2c, 0x22, + // Entry 80 - BF + 0x2f, 0x2c, 0x2c, 0x25, 0x26, 0x39, 0x21, 0x33, + 0x3b, 0x2c, 0x27, 0x35, 0x21, 0x33, 0x39, 0x25, + 0x2d, 0x20, 0x38, 0x30, 0x37, 0x23, 0x2b, 0x24, + 0x21, 0x23, 0x24, 0x2b, 0x39, 0x2b, 0x25, 0x23, + 0x35, 0x20, 0x2e, 0x3c, 0x30, 0x3b, 0x2e, 0x25, + 0x35, 0x35, 0x23, 0x25, 0x3c, 0x30, 0x23, 0x25, + 0x34, 0x24, 0x2c, 0x31, 0x37, 0x29, 0x37, 0x38, + 0x38, 0x34, 0x32, 0x22, 0x25, 0x2e, 0x3b, 0x20, + // Entry C0 - FF + 0x22, 0x2c, 0x30, 0x35, 0x35, 0x3b, 0x25, 0x2c, + 0x25, 0x39, 0x2e, 0x24, 0x2e, 0x33, 0x30, 0x2e, + 0x31, 0x3a, 0x2c, 0x2a, 0x2c, 0x20, 0x33, 0x29, + 0x2b, 0x24, 0x20, 0x3b, 0x23, 0x28, 0x2a, 0x23, + 0x33, 0x20, 0x27, 0x28, 0x3a, 0x30, 0x24, 0x2d, + 0x2f, 0x28, 0x25, 0x23, 0x39, 0x20, 0x3b, 0x27, + 0x20, 0x23, 0x20, 0x20, 0x1e, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + // Entry 100 - 13F + 0x2e, 0x20, 0x2d, 0x22, 0x32, 0x2e, 0x23, 0x3a, + 0x2e, 0x38, 0x37, 0x30, 0x2c, 0x39, 0x2b, 0x2d, + 0x2c, 0x22, 0x2c, 0x2e, 0x27, 0x38, 0x26, 0x32, + 0x33, 0x25, 0x23, 0x31, 0x21, 0x25, 0x26, 0x21, + 0x2c, 0x30, 0x3c, 0x28, 0x30, 0x3c, 0x38, 0x28, + 0x30, 0x23, 0x25, 0x28, 0x35, 0x2e, 0x32, 0x2e, + 0x20, 0x21, 0x2f, 0x27, 0x3c, 0x22, 0x25, 0x20, + 0x27, 0x25, 0x25, 0x30, 0x3a, 0x28, 0x20, 0x28, + // Entry 140 - 17F + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x23, 0x23, 0x2e, 0x22, 0x31, 0x2e, + 0x26, 0x2e, 0x20, +} + +// regionInclusionBits is an array of bit vectors where every vector represents +// a set of region groupings. These sets are used to compute the distance +// between two regions for the purpose of language matching. +// Size: 288 bytes, 72 elements +var regionInclusionBits = [72]uint32{ + // Entry 0 - 1F + 0x82400813, 0x000007a3, 0x00003844, 0x20000808, + 0x403c0011, 0x00000022, 0x20000844, 0x00000082, + 0x00000102, 0x00000202, 0x00000402, 0x2000384d, + 0x00001804, 0x20002804, 0x00404000, 0x00408000, + 0x00410000, 0x02020000, 0x00040010, 0x00080010, + 0x00100010, 0x00200010, 0x01c1c001, 0x00c00000, + 0x01400000, 0x1e020001, 0x06000000, 0x0a000000, + 0x12000000, 0x20002848, 0x40000010, 0x80000001, + // Entry 20 - 3F + 0x00000001, 0x40000000, 0x00020000, 0x01000000, + 0x00008000, 0x00002000, 0x00000200, 0x00000008, + 0x00200000, 0x90000000, 0x00040000, 0x08000000, + 0x00000020, 0x84000000, 0x00000080, 0x00001000, + 0x00010000, 0x00000400, 0x04000000, 0x00000040, + 0x10000000, 0x00004000, 0x81000000, 0x88000000, + 0x00000100, 0x80020000, 0x00080000, 0x00100000, + 0x00800000, 0xffffffff, 0x82400fb3, 0xc27c0813, + // Entry 40 - 5F + 0xa240385f, 0x83c1c813, 0x9e420813, 0x92000001, + 0x86000001, 0x81400001, 0x8a000001, 0x82020001, +} + +// regionInclusionNext marks, for each entry in regionInclusionBits, the set of +// all groups that are reachable from the groups set in the respective entry. +// Size: 72 bytes, 72 elements +var regionInclusionNext = [72]uint8{ + // Entry 0 - 3F + 0x3d, 0x3e, 0x0b, 0x0b, 0x3f, 0x01, 0x0b, 0x01, + 0x01, 0x01, 0x01, 0x40, 0x0b, 0x0b, 0x16, 0x16, + 0x16, 0x19, 0x04, 0x04, 0x04, 0x04, 0x41, 0x16, + 0x16, 0x42, 0x19, 0x19, 0x19, 0x0b, 0x04, 0x00, + 0x00, 0x1e, 0x11, 0x18, 0x0f, 0x0d, 0x09, 0x03, + 0x15, 0x43, 0x12, 0x1b, 0x05, 0x44, 0x07, 0x0c, + 0x10, 0x0a, 0x1a, 0x06, 0x1c, 0x0e, 0x45, 0x46, + 0x08, 0x47, 0x13, 0x14, 0x17, 0x3d, 0x3d, 0x3d, + // Entry 40 - 7F + 0x3d, 0x3d, 0x3d, 0x42, 0x42, 0x41, 0x42, 0x42, +} + +type parentRel struct { + lang uint16 + script uint8 + maxScript uint8 + toRegion uint16 + fromRegion []uint16 +} + +// Size: 404 bytes, 5 elements +var parents = [5]parentRel{ + 0: {lang: 0x9a, script: 0x0, maxScript: 0x4f, toRegion: 0x1, fromRegion: []uint16{0x1a, 0x24, 0x25, 0x2e, 0x33, 0x35, 0x3c, 0x41, 0x45, 0x47, 0x48, 0x49, 0x4f, 0x51, 0x5b, 0x5c, 0x60, 0x63, 0x6c, 0x71, 0x72, 0x73, 0x79, 0x7a, 0x7d, 0x7e, 0x7f, 0x81, 0x8a, 0x8b, 0x94, 0x95, 0x96, 0x97, 0x98, 0x9d, 0x9e, 0xa2, 0xa5, 0xa7, 0xab, 0xaf, 0xb2, 0xb3, 0xbd, 0xc4, 0xc8, 0xc9, 0xca, 0xcc, 0xce, 0xd0, 0xd3, 0xd4, 0xdb, 0xdd, 0xde, 0xe4, 0xe5, 0xe6, 0xe9, 0xee, 0x105, 0x107, 0x108, 0x109, 0x10b, 0x10c, 0x110, 0x115, 0x119, 0x11b, 0x11d, 0x123, 0x127, 0x12a, 0x12b, 0x12d, 0x12f, 0x136, 0x139, 0x13c, 0x13f, 0x15e, 0x15f, 0x161}}, + 1: {lang: 0x9a, script: 0x0, maxScript: 0x4f, toRegion: 0x1a, fromRegion: []uint16{0x2d, 0x4d, 0x5f, 0x62, 0x70, 0xd7, 0x10a, 0x10d}}, + 2: {lang: 0x9c, script: 0x0, maxScript: 0x4f, toRegion: 0x1e, fromRegion: []uint16{0x2b, 0x3e, 0x50, 0x53, 0x55, 0x58, 0x64, 0x68, 0x87, 0x8d, 0xcd, 0xd6, 0xe0, 0xe2, 0xea, 0xef, 0x118, 0x132, 0x133, 0x138}}, + 3: {lang: 0x1ed, script: 0x0, maxScript: 0x4f, toRegion: 0xec, fromRegion: []uint16{0x29, 0x59, 0x89, 0xc4, 0xcf, 0x116, 0x124}}, + 4: {lang: 0x2c0, script: 0x33, maxScript: 0x33, toRegion: 0x8b, fromRegion: []uint16{0xc4}}, +} + +// Total table size 19949 bytes (19KiB); checksum: 13F4A4EF diff --git a/vendor/golang.org/x/text/language/tags.go b/vendor/golang.org/x/text/language/tags.go new file mode 100644 index 0000000000..de30155a26 --- /dev/null +++ b/vendor/golang.org/x/text/language/tags.go @@ -0,0 +1,143 @@ +// Copyright 2013 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 language + +// TODO: Various sets of commonly use tags and regions. + +// MustParse is like Parse, but panics if the given BCP 47 tag cannot be parsed. +// It simplifies safe initialization of Tag values. +func MustParse(s string) Tag { + t, err := Parse(s) + if err != nil { + panic(err) + } + return t +} + +// MustParse is like Parse, but panics if the given BCP 47 tag cannot be parsed. +// It simplifies safe initialization of Tag values. +func (c CanonType) MustParse(s string) Tag { + t, err := c.Parse(s) + if err != nil { + panic(err) + } + return t +} + +// MustParseBase is like ParseBase, but panics if the given base cannot be parsed. +// It simplifies safe initialization of Base values. +func MustParseBase(s string) Base { + b, err := ParseBase(s) + if err != nil { + panic(err) + } + return b +} + +// MustParseScript is like ParseScript, but panics if the given script cannot be +// parsed. It simplifies safe initialization of Script values. +func MustParseScript(s string) Script { + scr, err := ParseScript(s) + if err != nil { + panic(err) + } + return scr +} + +// MustParseRegion is like ParseRegion, but panics if the given region cannot be +// parsed. It simplifies safe initialization of Region values. +func MustParseRegion(s string) Region { + r, err := ParseRegion(s) + if err != nil { + panic(err) + } + return r +} + +var ( + und = Tag{} + + Und Tag = Tag{} + + Afrikaans Tag = Tag{lang: _af} // af + Amharic Tag = Tag{lang: _am} // am + Arabic Tag = Tag{lang: _ar} // ar + ModernStandardArabic Tag = Tag{lang: _ar, region: _001} // ar-001 + Azerbaijani Tag = Tag{lang: _az} // az + Bulgarian Tag = Tag{lang: _bg} // bg + Bengali Tag = Tag{lang: _bn} // bn + Catalan Tag = Tag{lang: _ca} // ca + Czech Tag = Tag{lang: _cs} // cs + Danish Tag = Tag{lang: _da} // da + German Tag = Tag{lang: _de} // de + Greek Tag = Tag{lang: _el} // el + English Tag = Tag{lang: _en} // en + AmericanEnglish Tag = Tag{lang: _en, region: _US} // en-US + BritishEnglish Tag = Tag{lang: _en, region: _GB} // en-GB + Spanish Tag = Tag{lang: _es} // es + EuropeanSpanish Tag = Tag{lang: _es, region: _ES} // es-ES + LatinAmericanSpanish Tag = Tag{lang: _es, region: _419} // es-419 + Estonian Tag = Tag{lang: _et} // et + Persian Tag = Tag{lang: _fa} // fa + Finnish Tag = Tag{lang: _fi} // fi + Filipino Tag = Tag{lang: _fil} // fil + French Tag = Tag{lang: _fr} // fr + CanadianFrench Tag = Tag{lang: _fr, region: _CA} // fr-CA + Gujarati Tag = Tag{lang: _gu} // gu + Hebrew Tag = Tag{lang: _he} // he + Hindi Tag = Tag{lang: _hi} // hi + Croatian Tag = Tag{lang: _hr} // hr + Hungarian Tag = Tag{lang: _hu} // hu + Armenian Tag = Tag{lang: _hy} // hy + Indonesian Tag = Tag{lang: _id} // id + Icelandic Tag = Tag{lang: _is} // is + Italian Tag = Tag{lang: _it} // it + Japanese Tag = Tag{lang: _ja} // ja + Georgian Tag = Tag{lang: _ka} // ka + Kazakh Tag = Tag{lang: _kk} // kk + Khmer Tag = Tag{lang: _km} // km + Kannada Tag = Tag{lang: _kn} // kn + Korean Tag = Tag{lang: _ko} // ko + Kirghiz Tag = Tag{lang: _ky} // ky + Lao Tag = Tag{lang: _lo} // lo + Lithuanian Tag = Tag{lang: _lt} // lt + Latvian Tag = Tag{lang: _lv} // lv + Macedonian Tag = Tag{lang: _mk} // mk + Malayalam Tag = Tag{lang: _ml} // ml + Mongolian Tag = Tag{lang: _mn} // mn + Marathi Tag = Tag{lang: _mr} // mr + Malay Tag = Tag{lang: _ms} // ms + Burmese Tag = Tag{lang: _my} // my + Nepali Tag = Tag{lang: _ne} // ne + Dutch Tag = Tag{lang: _nl} // nl + Norwegian Tag = Tag{lang: _no} // no + Punjabi Tag = Tag{lang: _pa} // pa + Polish Tag = Tag{lang: _pl} // pl + Portuguese Tag = Tag{lang: _pt} // pt + BrazilianPortuguese Tag = Tag{lang: _pt, region: _BR} // pt-BR + EuropeanPortuguese Tag = Tag{lang: _pt, region: _PT} // pt-PT + Romanian Tag = Tag{lang: _ro} // ro + Russian Tag = Tag{lang: _ru} // ru + Sinhala Tag = Tag{lang: _si} // si + Slovak Tag = Tag{lang: _sk} // sk + Slovenian Tag = Tag{lang: _sl} // sl + Albanian Tag = Tag{lang: _sq} // sq + Serbian Tag = Tag{lang: _sr} // sr + SerbianLatin Tag = Tag{lang: _sr, script: _Latn} // sr-Latn + Swedish Tag = Tag{lang: _sv} // sv + Swahili Tag = Tag{lang: _sw} // sw + Tamil Tag = Tag{lang: _ta} // ta + Telugu Tag = Tag{lang: _te} // te + Thai Tag = Tag{lang: _th} // th + Turkish Tag = Tag{lang: _tr} // tr + Ukrainian Tag = Tag{lang: _uk} // uk + Urdu Tag = Tag{lang: _ur} // ur + Uzbek Tag = Tag{lang: _uz} // uz + Vietnamese Tag = Tag{lang: _vi} // vi + Chinese Tag = Tag{lang: _zh} // zh + SimplifiedChinese Tag = Tag{lang: _zh, script: _Hans} // zh-Hans + TraditionalChinese Tag = Tag{lang: _zh, script: _Hant} // zh-Hant + Zulu Tag = Tag{lang: _zu} // zu +) diff --git a/vendor/golang.org/x/text/message/catalog.go b/vendor/golang.org/x/text/message/catalog.go new file mode 100644 index 0000000000..41c31f4c65 --- /dev/null +++ b/vendor/golang.org/x/text/message/catalog.go @@ -0,0 +1,113 @@ +// 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 message + +// TODO: some types in this file will need to be made public at some time. +// Documentation and method names will reflect this by using the exported name. + +import ( + "sync" + + "golang.org/x/text/internal" + "golang.org/x/text/internal/format" + "golang.org/x/text/language" +) + +// DefaultCatalog is used by SetString. +var DefaultCatalog *Catalog = newCatalog() + +// SetString calls SetString on the default Catalog. +func SetString(tag language.Tag, key string, msg string) error { + return DefaultCatalog.SetString(tag, key, msg) +} + +// TODO: +// // SetSelect is a shorthand for DefaultCatalog.SetSelect. +// func SetSelect(tag language.Tag, key string, s ...format.Statement) error { +// return DefaultCatalog.SetSelect(tag, key, s...) +// } + +type msgMap map[string]format.Statement + +// A Catalog holds translations for messages for supported languages. +type Catalog struct { + index map[language.Tag]msgMap + + mutex sync.Mutex // For locking all operations. +} + +// Printer creates a Printer that uses c. +func (c *Catalog) Printer(tag language.Tag) *Printer { + // TODO: pre-create indexes for tag lookup. + return &Printer{ + tag: tag, + cat: c, + } +} + +// NewCatalog returns a new Catalog. If a message is not present in a Catalog, +// the fallback Catalogs will be used in order as an alternative source. +func newCatalog(fallback ...*Catalog) *Catalog { + // TODO: implement fallback. + return &Catalog{ + index: map[language.Tag]msgMap{}, + } +} + +// Languages returns a slice of all languages for which the Catalog contains +// variants. +func (c *Catalog) Languages() []language.Tag { + c.mutex.Lock() + defer c.mutex.Unlock() + + tags := []language.Tag{} + for t, _ := range c.index { + tags = append(tags, t) + } + internal.SortTags(tags) + return tags +} + +// SetString sets the translation for the given language and key. +func (c *Catalog) SetString(tag language.Tag, key string, msg string) error { + return c.set(tag, key, format.String(msg)) +} + +func (c *Catalog) get(tag language.Tag, key string) (msg string, ok bool) { + c.mutex.Lock() + defer c.mutex.Unlock() + + for ; ; tag = tag.Parent() { + if msgs, ok := c.index[tag]; ok { + if statement, ok := msgs[key]; ok { + // TODO: use type switches when we implement selecting. + msg := string(statement.(format.String)) + return msg, true + } + } + if tag == language.Und { + break + } + } + return "", false +} + +func (c *Catalog) set(tag language.Tag, key string, s ...format.Statement) error { + if len(s) != 1 { + // TODO: handle errors properly when we process statement sequences. + panic("statement sequence should be of length 1") + } + + c.mutex.Lock() + defer c.mutex.Unlock() + + m := c.index[tag] + if m == nil { + m = map[string]format.Statement{} + c.index[tag] = m + } + m[key] = s[0] + return nil +} diff --git a/vendor/golang.org/x/text/message/catalog_test.go b/vendor/golang.org/x/text/message/catalog_test.go new file mode 100644 index 0000000000..3b693c9569 --- /dev/null +++ b/vendor/golang.org/x/text/message/catalog_test.go @@ -0,0 +1,98 @@ +// 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 message + +import ( + "reflect" + "testing" + + "golang.org/x/text/internal" + "golang.org/x/text/language" +) + +type entry struct{ tag, key, msg string } + +var testCases = []struct { + desc string + cat []entry + lookup []entry +}{{ + desc: "empty catalog", + lookup: []entry{ + {"en", "key", ""}, + {"en", "", ""}, + {"nl", "", ""}, + }, +}, { + desc: "one entry", + cat: []entry{ + {"en", "hello", "Hello!"}, + }, + lookup: []entry{ + {"und", "hello", ""}, + {"nl", "hello", ""}, + {"en", "hello", "Hello!"}, + {"en-US", "hello", "Hello!"}, + {"en-GB", "hello", "Hello!"}, + {"en-oxendict", "hello", "Hello!"}, + {"en-oxendict-u-ms-metric", "hello", "Hello!"}, + }, +}, { + desc: "hierarchical languages", + cat: []entry{ + {"en", "hello", "Hello!"}, + {"en-GB", "hello", "Hellø!"}, + {"en-US", "hello", "Howdy!"}, + {"en", "greetings", "Greetings!"}, + }, + lookup: []entry{ + {"und", "hello", ""}, + {"nl", "hello", ""}, + {"en", "hello", "Hello!"}, + {"en-US", "hello", "Howdy!"}, + {"en-GB", "hello", "Hellø!"}, + {"en-oxendict", "hello", "Hello!"}, + {"en-US-oxendict-u-ms-metric", "hello", "Howdy!"}, + + {"und", "greetings", ""}, + {"nl", "greetings", ""}, + {"en", "greetings", "Greetings!"}, + {"en-US", "greetings", "Greetings!"}, + {"en-GB", "greetings", "Greetings!"}, + {"en-oxendict", "greetings", "Greetings!"}, + {"en-US-oxendict-u-ms-metric", "greetings", "Greetings!"}, + }, +}} + +func initCat(entries []entry) (*Catalog, []language.Tag) { + tags := []language.Tag{} + cat := newCatalog() + for _, e := range entries { + tag := language.MustParse(e.tag) + tags = append(tags, tag) + cat.SetString(tag, e.key, e.msg) + } + return cat, internal.UniqueTags(tags) +} + +func TestCatalog(t *testing.T) { + for _, tc := range testCases { + cat, wantTags := initCat(tc.cat) + + // languages + if got := cat.Languages(); !reflect.DeepEqual(got, wantTags) { + t.Errorf("%s:Languages: got %v; want %v", tc.desc, got, wantTags) + } + + // Lookup + for _, e := range tc.lookup { + tag := language.MustParse(e.tag) + msg, ok := cat.get(tag, e.key) + if okWant := e.msg != ""; ok != okWant || msg != e.msg { + t.Errorf("%s:Lookup(%s, %s) = %s, %v; want %s, %v", tc.desc, tag, e.key, msg, ok, e.msg, okWant) + } + } + } +} diff --git a/vendor/golang.org/x/text/message/message.go b/vendor/golang.org/x/text/message/message.go new file mode 100644 index 0000000000..5fec9c5157 --- /dev/null +++ b/vendor/golang.org/x/text/message/message.go @@ -0,0 +1,185 @@ +// 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 message implements formatted I/O for localized strings with functions +// analogous to the fmt's print functions. +// +// NOTE: Under construction. See https://golang.org/design/text/12750-localization +// and its corresponding proposal issue https://golang.org/issues/12750. +package message // import "golang.org/x/text/message" + +import ( + "fmt" + "io" + "strings" + + "golang.org/x/text/internal/format" + "golang.org/x/text/language" +) + +// A Printer implements language-specific formatted I/O analogous to the fmt +// package. Only one goroutine may use a Printer at the same time. +type Printer struct { + tag language.Tag + + cat *Catalog + + // NOTE: limiting one goroutine per Printer allows for many optimizations + // and simplifications. We can consider removing this restriction down the + // road if it the benefits do not seem to outweigh the disadvantages. +} + +// NewPrinter returns a Printer that formats messages tailored to language t. +func NewPrinter(t language.Tag) *Printer { + return DefaultCatalog.Printer(t) +} + +// Sprint is like fmt.Sprint, but using language-specific formatting. +func (p *Printer) Sprint(a ...interface{}) string { + return fmt.Sprint(p.bindArgs(a)...) +} + +// Fprint is like fmt.Fprint, but using language-specific formatting. +func (p *Printer) Fprint(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprint(w, p.bindArgs(a)...) +} + +// Print is like fmt.Print, but using language-specific formatting. +func (p *Printer) Print(a ...interface{}) (n int, err error) { + return fmt.Print(p.bindArgs(a)...) +} + +// Sprintln is like fmt.Sprintln, but using language-specific formatting. +func (p *Printer) Sprintln(a ...interface{}) string { + return fmt.Sprintln(p.bindArgs(a)...) +} + +// Fprintln is like fmt.Fprintln, but using language-specific formatting. +func (p *Printer) Fprintln(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprintln(w, p.bindArgs(a)...) +} + +// Println is like fmt.Println, but using language-specific formatting. +func (p *Printer) Println(a ...interface{}) (n int, err error) { + return fmt.Println(p.bindArgs(a)...) +} + +// Sprintf is like fmt.Sprintf, but using language-specific formatting. +func (p *Printer) Sprintf(key Reference, a ...interface{}) string { + msg, hasSub := p.lookup(key) + if !hasSub { + return fmt.Sprintf(msg) // work around limitation of fmt + } + return fmt.Sprintf(msg, p.bindArgs(a)...) +} + +// Fprintf is like fmt.Fprintf, but using language-specific formatting. +func (p *Printer) Fprintf(w io.Writer, key Reference, a ...interface{}) (n int, err error) { + msg, hasSub := p.lookup(key) + if !hasSub { + return fmt.Fprintf(w, msg) // work around limitation of fmt + } + return fmt.Fprintf(w, msg, p.bindArgs(a)...) +} + +// Printf is like fmt.Printf, but using language-specific formatting. +func (p *Printer) Printf(key Reference, a ...interface{}) (n int, err error) { + msg, hasSub := p.lookup(key) + if !hasSub { + return fmt.Printf(msg) // work around limitation of fmt + } + return fmt.Printf(msg, p.bindArgs(a)...) +} + +func (p *Printer) lookup(r Reference) (msg string, hasSub bool) { + var id string + switch v := r.(type) { + case string: + id, msg = v, v + case key: + id, msg = v.id, v.fallback + default: + panic("key argument is not a Reference") + } + if s, ok := p.cat.get(p.tag, id); ok { + msg = s + } + // fmt does not allow all arguments to be dropped in a format string. It + // only allows arguments to be dropped if at least one of the substitutions + // uses the positional marker (e.g. %[1]s). This hack works around this. + // TODO: This is only an approximation of the parsing of substitution + // patterns. Make more precise once we know if we can get by with fmt's + // formatting, which may not be the case. + for i := 0; i < len(msg)-1; i++ { + if msg[i] == '%' { + for i++; i < len(msg); i++ { + if strings.IndexByte("[]#+- *01234567890.", msg[i]) < 0 { + break + } + } + if i < len(msg) && msg[i] != '%' { + hasSub = true + break + } + } + } + return msg, hasSub +} + +// A Reference is a string or a message reference. +type Reference interface { +} + +// Key creates a message Reference for a message where the given id is used for +// message lookup and the fallback is returned when no matches are found. +func Key(id string, fallback string) Reference { + return key{id, fallback} +} + +type key struct { + id, fallback string +} + +// bindArgs wraps arguments with implementation of fmt.Formatter, if needed. +func (p *Printer) bindArgs(a []interface{}) []interface{} { + out := make([]interface{}, len(a)) + for i, x := range a { + switch v := x.(type) { + case fmt.Formatter: + // Wrap the value with a Formatter that augments the State with + // language-specific attributes. + out[i] = &value{v, p} + + // NOTE: as we use fmt.Formatter, we can't distinguish between + // regular and localized formatters, so we always need to wrap it. + + // TODO: handle + // - numbers + // - lists + // - time? + default: + out[i] = x + } + } + return out +} + +// state implements "golang.org/x/text/internal/format".State. +type state struct { + fmt.State + p *Printer +} + +func (s *state) Language() language.Tag { return s.p.tag } + +var _ format.State = &state{} + +type value struct { + x fmt.Formatter + p *Printer +} + +func (v *value) Format(s fmt.State, verb rune) { + v.x.Format(&state{s, v.p}, verb) +} diff --git a/vendor/golang.org/x/text/message/message_test.go b/vendor/golang.org/x/text/message/message_test.go new file mode 100644 index 0000000000..f7dba8d06d --- /dev/null +++ b/vendor/golang.org/x/text/message/message_test.go @@ -0,0 +1,149 @@ +// 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 message + +import ( + "bytes" + "fmt" + "io" + "testing" + + "golang.org/x/text/internal/format" + "golang.org/x/text/language" +) + +type formatFunc func(s fmt.State, v rune) + +func (f formatFunc) Format(s fmt.State, v rune) { f(s, v) } + +func TestBinding(t *testing.T) { + testCases := []struct { + tag string + value interface{} + want string + }{ + {"en", 1, "1"}, + {"en", "2", "2"}, + { // Language is passed. + "en", + formatFunc(func(fs fmt.State, v rune) { + s := fs.(format.State) + io.WriteString(s, s.Language().String()) + }), + "en", + }, + } + for i, tc := range testCases { + p := NewPrinter(language.MustParse(tc.tag)) + if got := p.Sprint(tc.value); got != tc.want { + t.Errorf("%d:%s:Sprint(%v) = %q; want %q", i, tc.tag, tc.value, got, tc.want) + } + var buf bytes.Buffer + p.Fprint(&buf, tc.value) + if got := buf.String(); got != tc.want { + t.Errorf("%d:%s:Fprint(%v) = %q; want %q", i, tc.tag, tc.value, got, tc.want) + } + } +} + +func TestFormatSelection(t *testing.T) { + type test struct { + tag string + key Reference + args []interface{} + want string + } + empty := []interface{}{} + joe := []interface{}{"Joe"} + joeAndMary := []interface{}{"Joe", "Mary"} + + testCases := []struct { + desc string + cat []entry + test []test + }{{ + desc: "empty", + test: []test{ + {"en", "key", empty, "key"}, + {"en", "", empty, ""}, + {"nl", "", empty, ""}, + }, + }, { + desc: "hierarchical languages", + cat: []entry{ + {"en", "hello %s", "Hello %s!"}, + {"en-GB", "hello %s", "Hellø %s!"}, + {"en-US", "hello %s", "Howdy %s!"}, + {"en", "greetings %s and %s", "Greetings %s and %s!"}, + }, + test: []test{ + {"und", "hello %s", joe, "hello Joe"}, + {"nl", "hello %s", joe, "hello Joe"}, + {"en", "hello %s", joe, "Hello Joe!"}, + {"en-US", "hello %s", joe, "Howdy Joe!"}, + {"en-GB", "hello %s", joe, "Hellø Joe!"}, + {"en-oxendict", "hello %s", joe, "Hello Joe!"}, + {"en-US-oxendict-u-ms-metric", "hello %s", joe, "Howdy Joe!"}, + + {"und", "greetings %s and %s", joeAndMary, "greetings Joe and Mary"}, + {"nl", "greetings %s and %s", joeAndMary, "greetings Joe and Mary"}, + {"en", "greetings %s and %s", joeAndMary, "Greetings Joe and Mary!"}, + {"en-US", "greetings %s and %s", joeAndMary, "Greetings Joe and Mary!"}, + {"en-GB", "greetings %s and %s", joeAndMary, "Greetings Joe and Mary!"}, + {"en-oxendict", "greetings %s and %s", joeAndMary, "Greetings Joe and Mary!"}, + {"en-US-oxendict-u-ms-metric", "greetings %s and %s", joeAndMary, "Greetings Joe and Mary!"}, + }, + }, { + desc: "references", + cat: []entry{ + {"en", "hello", "Hello!"}, + }, + test: []test{ + {"en", "hello", empty, "Hello!"}, + {"en", Key("hello", "fallback"), empty, "Hello!"}, + {"en", Key("xxx", "fallback"), empty, "fallback"}, + {"und", Key("hello", "fallback"), empty, "fallback"}, + }, + }, { + desc: "zero substitution", // work around limitation of fmt + cat: []entry{ + {"en", "hello %s", "Hello!"}, + {"en", "hi %s and %s", "Hello %[2]s!"}, + }, + test: []test{ + {"en", "hello %s", joe, "Hello!"}, + {"en", "hello %s", joeAndMary, "Hello!"}, + {"en", "hi %s and %s", joeAndMary, "Hello Mary!"}, + // The following tests resolve to the fallback string. + {"und", "hello", joeAndMary, "hello"}, + {"und", "hello %%%%", joeAndMary, "hello %%"}, + {"und", "hello %#%%4.2% ", joeAndMary, "hello %% "}, + {"und", "hello %s", joeAndMary, "hello Joe%!(EXTRA string=Mary)"}, + {"und", "hello %+%%s", joeAndMary, "hello %Joe%!(EXTRA string=Mary)"}, + {"und", "hello %-42%%s ", joeAndMary, "hello %Joe %!(EXTRA string=Mary)"}, + }, + }} + + for _, tc := range testCases { + cat, _ := initCat(tc.cat) + + for i, pt := range tc.test { + p := cat.Printer(language.MustParse(pt.tag)) + + if got := p.Sprintf(pt.key, pt.args...); got != pt.want { + t.Errorf("%s:%d:Sprintf(%s, %v) = %s; want %s", + tc.desc, i, pt.key, pt.args, got, pt.want) + continue // Next error will likely be the same. + } + + w := &bytes.Buffer{} + p.Fprintf(w, pt.key, pt.args...) + if got := w.String(); got != pt.want { + t.Errorf("%s:%d:Fprintf(%s, %v) = %s; want %s", + tc.desc, i, pt.key, pt.args, got, pt.want) + } + } + } +} diff --git a/vendor/golang.org/x/text/runes/cond.go b/vendor/golang.org/x/text/runes/cond.go new file mode 100644 index 0000000000..ae7a921585 --- /dev/null +++ b/vendor/golang.org/x/text/runes/cond.go @@ -0,0 +1,126 @@ +// 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 runes + +import ( + "unicode/utf8" + + "golang.org/x/text/transform" +) + +// Note: below we pass invalid UTF-8 to the tIn and tNotIn transformers as is. +// This is done for various reasons: +// - To retain the semantics of the Nop transformer: if input is passed to a Nop +// one would expect it to be unchanged. +// - It would be very expensive to pass a converted RuneError to a transformer: +// a transformer might need more source bytes after RuneError, meaning that +// the only way to pass it safely is to create a new buffer and manage the +// intermingling of RuneErrors and normal input. +// - Many transformers leave ill-formed UTF-8 as is, so this is not +// inconsistent. Generally ill-formed UTF-8 is only replaced if it is a +// logical consequence of the operation (as for Map) or if it otherwise would +// pose security concerns (as for Remove). +// - An alternative would be to return an error on ill-formed UTF-8, but this +// would be inconsistent with other operations. + +// If returns a transformer that applies tIn to consecutive runes for which +// s.Contains(r) and tNotIn to consecutive runes for which !s.Contains(r). Reset +// is called on tIn and tNotIn at the start of each run. A Nop transformer will +// substitute a nil value passed to tIn or tNotIn. Invalid UTF-8 is translated +// to RuneError to determine which transformer to apply, but is passed as is to +// the respective transformer. +func If(s Set, tIn, tNotIn transform.Transformer) Transformer { + if tIn == nil && tNotIn == nil { + return Transformer{transform.Nop} + } + if tIn == nil { + tIn = transform.Nop + } + if tNotIn == nil { + tNotIn = transform.Nop + } + a := &cond{ + tIn: tIn, + tNotIn: tNotIn, + f: s.Contains, + } + a.Reset() + return Transformer{a} +} + +type cond struct { + tIn, tNotIn transform.Transformer + f func(rune) bool + check func(rune) bool // current check to perform + t transform.Transformer // current transformer to use +} + +// Reset implements transform.Transformer. +func (t *cond) Reset() { + t.check = t.is + t.t = t.tIn + t.t.Reset() // notIn will be reset on first usage. +} + +func (t *cond) is(r rune) bool { + if t.f(r) { + return true + } + t.check = t.isNot + t.t = t.tNotIn + t.tNotIn.Reset() + return false +} + +func (t *cond) isNot(r rune) bool { + if !t.f(r) { + return true + } + t.check = t.is + t.t = t.tIn + t.tIn.Reset() + return false +} + +func (t *cond) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + p := 0 + for nSrc < len(src) && err == nil { + // Don't process too much at a time, as the work might be wasted if the + // destination buffer isn't large enough to hold the result or a + // transform returns an error early. + const maxChunk = 4096 + max := len(src) + if n := nSrc + maxChunk; n < len(src) { + max = n + } + atEnd := false + size := 0 + current := t.t + for ; p < max; p += size { + var r rune + r, size = utf8.DecodeRune(src[p:]) + if r == utf8.RuneError && size == 1 { + if !atEOF && !utf8.FullRune(src[p:]) { + err = transform.ErrShortSrc + break + } + } + if !t.check(r) { + // The next rune will be the start of a new run. + atEnd = true + break + } + } + nDst2, nSrc2, err2 := current.Transform(dst[nDst:], src[nSrc:p], atEnd || (atEOF && p == len(src))) + nDst += nDst2 + nSrc += nSrc2 + if err2 != nil { + return nDst, nSrc, err2 + } + // At this point either err != nil or t.check will pass for the rune at p. + p = nSrc + size + } + return nDst, nSrc, err +} diff --git a/vendor/golang.org/x/text/runes/cond_test.go b/vendor/golang.org/x/text/runes/cond_test.go new file mode 100644 index 0000000000..6b65cc7df0 --- /dev/null +++ b/vendor/golang.org/x/text/runes/cond_test.go @@ -0,0 +1,233 @@ +// 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 runes + +import ( + "strings" + "testing" + "unicode" + + "golang.org/x/text/cases" + "golang.org/x/text/language" + "golang.org/x/text/transform" +) + +var ( + toUpper = cases.Upper(language.Und) + toLower = cases.Lower(language.Und) +) + +func TestPredicate(t *testing.T) { + testConditional(t, func(rt *unicode.RangeTable, t, f transform.Transformer) transform.Transformer { + return If(Predicate(func(r rune) bool { + return unicode.Is(rt, r) + }), t, f) + }) +} + +func TestIn(t *testing.T) { + testConditional(t, func(rt *unicode.RangeTable, t, f transform.Transformer) transform.Transformer { + return If(In(rt), t, f) + }) +} + +func TestNotIn(t *testing.T) { + testConditional(t, func(rt *unicode.RangeTable, t, f transform.Transformer) transform.Transformer { + return If(NotIn(rt), f, t) + }) +} + +func testConditional(t *testing.T, f func(rt *unicode.RangeTable, t, f transform.Transformer) transform.Transformer) { + lower := f(unicode.Latin, toLower, toLower) + + for i, tt := range []transformTest{{ + desc: "empty", + szDst: large, + atEOF: true, + in: "", + out: "", + outFull: "", + t: lower, + }, { + desc: "small", + szDst: 1, + atEOF: true, + in: "B", + out: "b", + outFull: "b", + t: lower, + }, { + desc: "short dst", + szDst: 2, + atEOF: true, + in: "AAA", + out: "aa", + outFull: "aaa", + err: transform.ErrShortDst, + t: lower, + }, { + desc: "short dst writing error", + szDst: 1, + atEOF: false, + in: "A\x80", + out: "a", + outFull: "a\x80", + err: transform.ErrShortDst, + t: lower, + }, { + desc: "short dst writing incomplete rune", + szDst: 2, + atEOF: true, + in: "Σ\xc2", + out: "Σ", + outFull: "Σ\xc2", + err: transform.ErrShortDst, + t: f(unicode.Latin, toLower, nil), + }, { + desc: "short dst, longer", + szDst: 5, + atEOF: true, + in: "Hellø", + out: "Hell", + outFull: "Hellø", + err: transform.ErrShortDst, + // idem is used to test short buffers by forcing processing of full-rune increments. + t: f(unicode.Latin, Map(idem), nil), + }, { + desc: "short dst, longer, writing error", + szDst: 6, + atEOF: false, + in: "\x80Hello\x80", + out: "\x80Hello", + outFull: "\x80Hello\x80", + err: transform.ErrShortDst, + t: f(unicode.Latin, Map(idem), nil), + }, { + desc: "short src", + szDst: 2, + atEOF: false, + in: "A\xc2", + out: "a", + outFull: "a\xc2", + err: transform.ErrShortSrc, + t: lower, + }, { + desc: "invalid input, atEOF", + szDst: large, + atEOF: true, + in: "\x80", + out: "\x80", + outFull: "\x80", + t: lower, + }, { + desc: "invalid input, !atEOF", + szDst: large, + atEOF: false, + in: "\x80", + out: "\x80", + outFull: "\x80", + t: lower, + }, { + desc: "invalid input, incomplete rune atEOF", + szDst: large, + atEOF: true, + in: "\xc2", + out: "\xc2", + outFull: "\xc2", + t: lower, + }, { + desc: "nop", + szDst: large, + atEOF: true, + in: "Hello World!", + out: "Hello World!", + outFull: "Hello World!", + t: f(unicode.Latin, nil, nil), + }, { + desc: "nop in", + szDst: large, + atEOF: true, + in: "THIS IS α ΤΕΣΤ", + out: "this is α ΤΕΣΤ", + outFull: "this is α ΤΕΣΤ", + t: f(unicode.Greek, nil, toLower), + }, { + desc: "nop not in", + szDst: large, + atEOF: true, + in: "THIS IS α ΤΕΣΤ", + out: "this is α ΤΕΣΤ", + outFull: "this is α ΤΕΣΤ", + t: f(unicode.Latin, toLower, nil), + }, { + desc: "pass atEOF is true when at end", + szDst: large, + atEOF: true, + in: "hello", + out: "HELLO", + outFull: "HELLO", + t: f(unicode.Latin, upperAtEOF{}, nil), + }, { + desc: "pass atEOF is true when at end of segment", + szDst: large, + atEOF: true, + in: "hello ", + out: "HELLO ", + outFull: "HELLO ", + t: f(unicode.Latin, upperAtEOF{}, nil), + }, { + desc: "don't pass atEOF is true when atEOF is false", + szDst: large, + atEOF: false, + in: "hello", + out: "", + outFull: "HELLO", + t: f(unicode.Latin, upperAtEOF{}, nil), + err: transform.ErrShortSrc, + }, { + desc: "large input ASCII", + szDst: 12000, + atEOF: false, + in: strings.Repeat("HELLO", 2000), + out: strings.Repeat("hello", 2000), + outFull: strings.Repeat("hello", 2000), + t: lower, + err: nil, + }, { + desc: "large input non-ASCII", + szDst: 12000, + atEOF: false, + in: strings.Repeat("\u3333", 2000), + out: strings.Repeat("\u3333", 2000), + outFull: strings.Repeat("\u3333", 2000), + t: lower, + err: nil, + }} { + tt.check(t, i) + } +} + +// upperAtEOF is a strange Transformer that converts text to uppercase, but only +// if atEOF is true. +type upperAtEOF struct{ transform.NopResetter } + +func (upperAtEOF) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + if !atEOF { + return 0, 0, transform.ErrShortSrc + } + return toUpper.Transform(dst, src, atEOF) +} + +func BenchmarkConditional(b *testing.B) { + dst := make([]byte, len(input)) + src := []byte(input) + + r := If(In(unicode.Hangul), transform.Nop, transform.Nop) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + r.Transform(dst, src, true) + } +} diff --git a/vendor/golang.org/x/text/runes/example_test.go b/vendor/golang.org/x/text/runes/example_test.go new file mode 100644 index 0000000000..a60bfd9d25 --- /dev/null +++ b/vendor/golang.org/x/text/runes/example_test.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 runes_test + +import ( + "fmt" + "unicode" + + "golang.org/x/text/runes" + "golang.org/x/text/transform" + "golang.org/x/text/unicode/norm" + "golang.org/x/text/width" +) + +func ExampleRemove() { + t := transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC) + s, _, _ := transform.String(t, "résumé") + fmt.Println(s) + + // Output: + // resume +} + +func ExampleMap() { + replaceHyphens := runes.Map(func(r rune) rune { + if unicode.Is(unicode.Hyphen, r) { + return '|' + } + return r + }) + s, _, _ := transform.String(replaceHyphens, "a-b‐c⸗d﹣e") + fmt.Println(s) + + // Output: + // a|b|c|d|e +} + +func ExampleIn() { + // Convert Latin characters to their canonical form, while keeping other + // width distinctions. + t := runes.If(runes.In(unicode.Latin), width.Fold, nil) + s, _, _ := transform.String(t, "アルアノリウ tech / アルアノリウ tech") + fmt.Println(s) + + // Output: + // アルアノリウ tech / アルアノリウ tech +} + +func ExampleIf() { + // Widen everything but ASCII. + isASCII := func(r rune) bool { return r <= unicode.MaxASCII } + t := runes.If(runes.Predicate(isASCII), nil, width.Widen) + s, _, _ := transform.String(t, "アルアノリウ tech / 中國 / 5₩") + fmt.Println(s) + + // Output: + // アルアノリウ tech / 中國 / 5₩ +} diff --git a/vendor/golang.org/x/text/runes/runes.go b/vendor/golang.org/x/text/runes/runes.go new file mode 100644 index 0000000000..bb17f475b9 --- /dev/null +++ b/vendor/golang.org/x/text/runes/runes.go @@ -0,0 +1,278 @@ +// 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 runes provide transforms for UTF-8 encoded text. +package runes // import "golang.org/x/text/runes" + +import ( + "unicode" + "unicode/utf8" + + "golang.org/x/text/transform" +) + +// A Set is a collection of runes. +type Set interface { + // Contains returns true if r is contained in the set. + Contains(r rune) bool +} + +type setFunc func(rune) bool + +func (s setFunc) Contains(r rune) bool { + return s(r) +} + +// Note: using funcs here instead of wrapping types result in cleaner +// documentation and a smaller API. + +// In creates a Set with a Contains method that returns true for all runes in +// the given RangeTable. +func In(rt *unicode.RangeTable) Set { + return setFunc(func(r rune) bool { return unicode.Is(rt, r) }) +} + +// In creates a Set with a Contains method that returns true for all runes not +// in the given RangeTable. +func NotIn(rt *unicode.RangeTable) Set { + return setFunc(func(r rune) bool { return !unicode.Is(rt, r) }) +} + +// Predicate creates a Set with a Contains method that returns f(r). +func Predicate(f func(rune) bool) Set { + return setFunc(f) +} + +// Transformer implements the transform.Transformer interface. +type Transformer struct { + transform.Transformer +} + +// Bytes returns a new byte slice with the result of converting b using t. It +// calls Reset on t. It returns nil if any error was found. This can only happen +// if an error-producing Transformer is passed to If. +func (t Transformer) Bytes(b []byte) []byte { + b, _, err := transform.Bytes(t, b) + if err != nil { + return nil + } + return b +} + +// String returns a string with the result of converting s using t. It calls +// Reset on t. It returns the empty string if any error was found. This can only +// happen if an error-producing Transformer is passed to If. +func (t Transformer) String(s string) string { + s, _, err := transform.String(t, s) + if err != nil { + return "" + } + return s +} + +// TODO: +// - Copy: copying strings and bytes in whole-rune units. +// - Validation (maybe) +// - Well-formed-ness (maybe) + +const runeErrorString = string(utf8.RuneError) + +// Remove returns a Transformer that removes runes r for which s.Contains(r). +// Illegal input bytes are replaced by RuneError before being passed to f. +func Remove(s Set) Transformer { + if f, ok := s.(setFunc); ok { + // This little trick cuts the running time of BenchmarkRemove for sets + // created by Predicate roughly in half. + // TODO: special-case RangeTables as well. + return Transformer{remove(f)} + } + return Transformer{remove(s.Contains)} +} + +// TODO: remove transform.RemoveFunc. + +type remove func(r rune) bool + +func (remove) Reset() {} + +// Transform implements transform.Transformer. +func (t remove) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + for r, size := rune(0), 0; nSrc < len(src); { + if r = rune(src[nSrc]); r < utf8.RuneSelf { + size = 1 + } else { + r, size = utf8.DecodeRune(src[nSrc:]) + + if size == 1 { + // Invalid rune. + if !atEOF && !utf8.FullRune(src[nSrc:]) { + err = transform.ErrShortSrc + break + } + // We replace illegal bytes with RuneError. Not doing so might + // otherwise turn a sequence of invalid UTF-8 into valid UTF-8. + // The resulting byte sequence may subsequently contain runes + // for which t(r) is true that were passed unnoticed. + if !t(utf8.RuneError) { + if nDst+3 > len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst+0] = runeErrorString[0] + dst[nDst+1] = runeErrorString[1] + dst[nDst+2] = runeErrorString[2] + nDst += 3 + } + nSrc++ + continue + } + } + + if t(r) { + nSrc += size + continue + } + if nDst+size > len(dst) { + err = transform.ErrShortDst + break + } + for i := 0; i < size; i++ { + dst[nDst] = src[nSrc] + nDst++ + nSrc++ + } + } + return +} + +// Map returns a Transformer that maps the runes in the input using the given +// mapping. Illegal bytes in the input are converted to utf8.RuneError before +// being passed to the mapping func. +func Map(mapping func(rune) rune) Transformer { + return Transformer{mapper(mapping)} +} + +type mapper func(rune) rune + +func (mapper) Reset() {} + +// Transform implements transform.Transformer. +func (t mapper) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + var replacement rune + var b [utf8.UTFMax]byte + + for r, size := rune(0), 0; nSrc < len(src); { + if r = rune(src[nSrc]); r < utf8.RuneSelf { + if replacement = t(r); replacement < utf8.RuneSelf { + if nDst == len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst] = byte(replacement) + nDst++ + nSrc++ + continue + } + size = 1 + } else if r, size = utf8.DecodeRune(src[nSrc:]); size == 1 { + // Invalid rune. + if !atEOF && !utf8.FullRune(src[nSrc:]) { + err = transform.ErrShortSrc + break + } + + if replacement = t(utf8.RuneError); replacement == utf8.RuneError { + if nDst+3 > len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst+0] = runeErrorString[0] + dst[nDst+1] = runeErrorString[1] + dst[nDst+2] = runeErrorString[2] + nDst += 3 + nSrc++ + continue + } + } else if replacement = t(r); replacement == r { + if nDst+size > len(dst) { + err = transform.ErrShortDst + break + } + for i := 0; i < size; i++ { + dst[nDst] = src[nSrc] + nDst++ + nSrc++ + } + continue + } + + n := utf8.EncodeRune(b[:], replacement) + + if nDst+n > len(dst) { + err = transform.ErrShortDst + break + } + for i := 0; i < n; i++ { + dst[nDst] = b[i] + nDst++ + } + nSrc += size + } + return +} + +// ReplaceIllFormed returns a transformer that replaces all input bytes that are +// not part of a well-formed UTF-8 code sequence with utf8.RuneError. +func ReplaceIllFormed() Transformer { + return Transformer{&replaceIllFormed{}} +} + +type replaceIllFormed struct{ transform.NopResetter } + +func (t replaceIllFormed) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + for nSrc < len(src) { + r, size := utf8.DecodeRune(src[nSrc:]) + + // Look for an ASCII rune. + if r < utf8.RuneSelf { + if nDst == len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst] = byte(r) + nDst++ + nSrc++ + continue + } + + // Look for a valid non-ASCII rune. + if r != utf8.RuneError || size != 1 { + if size != copy(dst[nDst:], src[nSrc:nSrc+size]) { + err = transform.ErrShortDst + break + } + nDst += size + nSrc += size + continue + } + + // Look for short source data. + if !atEOF && !utf8.FullRune(src[nSrc:]) { + err = transform.ErrShortSrc + break + } + + // We have an invalid rune. + if nDst+3 > len(dst) { + err = transform.ErrShortDst + break + } + dst[nDst+0] = runeErrorString[0] + dst[nDst+1] = runeErrorString[1] + dst[nDst+2] = runeErrorString[2] + nDst += 3 + nSrc++ + } + return nDst, nSrc, err +} diff --git a/vendor/golang.org/x/text/runes/runes_test.go b/vendor/golang.org/x/text/runes/runes_test.go new file mode 100644 index 0000000000..f880b524c4 --- /dev/null +++ b/vendor/golang.org/x/text/runes/runes_test.go @@ -0,0 +1,582 @@ +// 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 runes + +import ( + "strings" + "testing" + "unicode/utf8" + + "golang.org/x/text/transform" +) + +type transformTest struct { + desc string + szDst int + atEOF bool + repl string + in string + out string // result string of first call to Transform + outFull string // transform of entire input string + err error + + t transform.Transformer +} + +const large = 10240 + +func (tt *transformTest) check(t *testing.T, i int) { + if tt.t == nil { + return + } + dst := make([]byte, tt.szDst) + src := []byte(tt.in) + nDst, nSrc, err := tt.t.Transform(dst, src, tt.atEOF) + if err != tt.err { + t.Errorf("%d:%s:error: got %v; want %v", i, tt.desc, err, tt.err) + } + if got := string(dst[:nDst]); got != tt.out { + t.Errorf("%d:%s:out: got %q; want %q", i, tt.desc, got, tt.out) + } + + // Calls tt.t.Transform for the remainder of the input. We use this to test + // the nSrc return value. + out := make([]byte, large) + n := copy(out, dst[:nDst]) + nDst, _, _ = tt.t.Transform(out[n:], src[nSrc:], true) + if got, want := string(out[:n+nDst]), tt.outFull; got != want { + t.Errorf("%d:%s:outFull: got %q; want %q", i, tt.desc, got, want) + } +} + +func idem(r rune) rune { return r } + +func TestMap(t *testing.T) { + runes := []rune{'a', 'ç', '中', '\U00012345', 'a'} + // Default mapper used for this test. + rotate := Map(func(r rune) rune { + for i, m := range runes { + if m == r { + return runes[i+1] + } + } + return r + }) + + for i, tt := range []transformTest{{ + desc: "empty", + szDst: large, + atEOF: true, + in: "", + out: "", + outFull: "", + t: rotate, + }, { + desc: "no change", + szDst: 1, + atEOF: true, + in: "b", + out: "b", + outFull: "b", + t: rotate, + }, { + desc: "short dst", + szDst: 2, + atEOF: true, + in: "aaaa", + out: "ç", + outFull: "çççç", + err: transform.ErrShortDst, + t: rotate, + }, { + desc: "short dst ascii, no change", + szDst: 2, + atEOF: true, + in: "bbb", + out: "bb", + outFull: "bbb", + err: transform.ErrShortDst, + t: rotate, + }, { + desc: "short dst writing error", + szDst: 2, + atEOF: false, + in: "a\x80", + out: "ç", + outFull: "ç\ufffd", + err: transform.ErrShortDst, + t: rotate, + }, { + desc: "short dst writing incomplete rune", + szDst: 2, + atEOF: true, + in: "a\xc0", + out: "ç", + outFull: "ç\ufffd", + err: transform.ErrShortDst, + t: rotate, + }, { + desc: "short dst, longer", + szDst: 5, + atEOF: true, + in: "Hellø", + out: "Hell", + outFull: "Hellø", + err: transform.ErrShortDst, + t: rotate, + }, { + desc: "short dst, single", + szDst: 1, + atEOF: false, + in: "ø", + out: "", + outFull: "ø", + err: transform.ErrShortDst, + t: Map(idem), + }, { + desc: "short dst, longer, writing error", + szDst: 8, + atEOF: false, + in: "\x80Hello\x80", + out: "\ufffdHello", + outFull: "\ufffdHello\ufffd", + err: transform.ErrShortDst, + t: rotate, + }, { + desc: "short src", + szDst: 2, + atEOF: false, + in: "a\xc2", + out: "ç", + outFull: "ç\ufffd", + err: transform.ErrShortSrc, + t: rotate, + }, { + desc: "invalid input, atEOF", + szDst: large, + atEOF: true, + in: "\x80", + out: "\ufffd", + outFull: "\ufffd", + t: rotate, + }, { + desc: "invalid input, !atEOF", + szDst: large, + atEOF: false, + in: "\x80", + out: "\ufffd", + outFull: "\ufffd", + t: rotate, + }, { + desc: "invalid input, incomplete rune atEOF", + szDst: large, + atEOF: true, + in: "\xc0", + out: "\ufffd", + outFull: "\ufffd", + t: rotate, + }, { + desc: "misc correct", + szDst: large, + atEOF: true, + in: "a\U00012345 ç!", + out: "ça 中!", + outFull: "ça 中!", + t: rotate, + }, { + desc: "misc correct and invalid", + szDst: large, + atEOF: true, + in: "Hello\x80 w\x80orl\xc0d!\xc0", + out: "Hello\ufffd w\ufffdorl\ufffdd!\ufffd", + outFull: "Hello\ufffd w\ufffdorl\ufffdd!\ufffd", + t: rotate, + }, { + desc: "misc correct and invalid, short src", + szDst: large, + atEOF: false, + in: "Hello\x80 w\x80orl\xc0d!\xc2", + out: "Hello\ufffd w\ufffdorl\ufffdd!", + outFull: "Hello\ufffd w\ufffdorl\ufffdd!\ufffd", + err: transform.ErrShortSrc, + t: rotate, + }, { + desc: "misc correct and invalid, short src, replacing RuneError", + szDst: large, + atEOF: false, + in: "Hel\ufffdlo\x80 w\x80orl\xc0d!\xc2", + out: "Hel?lo? w?orl?d!", + outFull: "Hel?lo? w?orl?d!?", + err: transform.ErrShortSrc, + t: Map(func(r rune) rune { + if r == utf8.RuneError { + return '?' + } + return r + }), + }} { + tt.check(t, i) + } +} + +func TestRemove(t *testing.T) { + remove := Remove(Predicate(func(r rune) bool { + return strings.ContainsRune("aeiou\u0300\uFF24\U00012345", r) + })) + + for i, tt := range []transformTest{ + 0: { + szDst: large, + atEOF: true, + in: "", + out: "", + outFull: "", + t: remove, + }, + 1: { + szDst: 0, + atEOF: true, + in: "aaaa", + out: "", + outFull: "", + t: remove, + }, + 2: { + szDst: 1, + atEOF: true, + in: "aaaa", + out: "", + outFull: "", + t: remove, + }, + 3: { + szDst: 1, + atEOF: true, + in: "baaaa", + out: "b", + outFull: "b", + t: remove, + }, + 4: { + szDst: 2, + atEOF: true, + in: "açaaa", + out: "ç", + outFull: "ç", + t: remove, + }, + 5: { + szDst: 2, + atEOF: true, + in: "aaaç", + out: "ç", + outFull: "ç", + t: remove, + }, + 6: { + szDst: 2, + atEOF: false, + in: "a\x80", + out: "", + outFull: "\ufffd", + err: transform.ErrShortDst, + t: remove, + }, + 7: { + szDst: 1, + atEOF: true, + in: "a\xc0", + out: "", + outFull: "\ufffd", + err: transform.ErrShortDst, + t: remove, + }, + 8: { + szDst: 1, + atEOF: false, + in: "a\xc2", + out: "", + outFull: "\ufffd", + err: transform.ErrShortSrc, + t: remove, + }, + 9: { + szDst: large, + atEOF: true, + in: "\x80", + out: "\ufffd", + outFull: "\ufffd", + t: remove, + }, + 10: { + szDst: large, + atEOF: false, + in: "\x80", + out: "\ufffd", + outFull: "\ufffd", + t: remove, + }, + 11: { + szDst: large, + atEOF: true, + in: "\xc0", + out: "\ufffd", + outFull: "\ufffd", + t: remove, + }, + 12: { + szDst: large, + atEOF: true, + in: "Hello \U00012345world!", + out: "Hll wrld!", + outFull: "Hll wrld!", + t: remove, + }, + 13: { + szDst: large, + atEOF: true, + in: "Hello\x80 w\x80orl\xc0d!\xc0", + out: "Hll\ufffd w\ufffdrl\ufffdd!\ufffd", + outFull: "Hll\ufffd w\ufffdrl\ufffdd!\ufffd", + t: remove, + }, + 14: { + szDst: large, + atEOF: false, + in: "Hello\x80 w\x80orl\xc0d!\xc2", + out: "Hll\ufffd w\ufffdrl\ufffdd!", + outFull: "Hll\ufffd w\ufffdrl\ufffdd!\ufffd", + err: transform.ErrShortSrc, + t: remove, + }, + 15: { + szDst: large, + atEOF: false, + in: "Hel\ufffdlo\x80 w\x80orl\xc0d!\xc2", + out: "Hello world!", + outFull: "Hello world!", + err: transform.ErrShortSrc, + t: Remove(Predicate(func(r rune) bool { return r == utf8.RuneError })), + }, + 16: { + szDst: 4, + atEOF: true, + in: "Hellø", + out: "Hll", + outFull: "Hllø", + err: transform.ErrShortDst, + t: remove, + }, + 17: { + szDst: 4, + atEOF: false, + in: "Hellø", + out: "Hll", + outFull: "Hllø", + err: transform.ErrShortDst, + t: remove, + }, + 18: { + szDst: 8, + atEOF: false, + in: "\x80Hello\uFF24\x80", + out: "\ufffdHll", + outFull: "\ufffdHll\ufffd", + err: transform.ErrShortDst, + t: remove, + }, + } { + tt.check(t, i) + } +} + +func TestReplaceIllFormed(t *testing.T) { + replace := ReplaceIllFormed() + + for i, tt := range []transformTest{ + 0: { + szDst: large, + atEOF: true, + in: "", + out: "", + outFull: "", + t: replace, + }, + 1: { + szDst: 1, + atEOF: true, + in: "aa", + out: "a", + outFull: "aa", + err: transform.ErrShortDst, + t: replace, + }, + 2: { + szDst: 1, + atEOF: true, + in: "a\x80", + out: "a", + outFull: "a\ufffd", + err: transform.ErrShortDst, + t: replace, + }, + 3: { + szDst: 1, + atEOF: true, + in: "a\xc0", + out: "a", + outFull: "a\ufffd", + err: transform.ErrShortDst, + t: replace, + }, + 4: { + szDst: large, + atEOF: true, + in: "\x80", + out: "\ufffd", + outFull: "\ufffd", + t: replace, + }, + 5: { + szDst: large, + atEOF: false, + in: "\x80", + out: "\ufffd", + outFull: "\ufffd", + t: replace, + }, + 6: { + szDst: large, + atEOF: true, + in: "\xc2", + out: "\ufffd", + outFull: "\ufffd", + t: replace, + }, + 7: { + szDst: large, + atEOF: false, + in: "\xc2", + out: "", + outFull: "\ufffd", + err: transform.ErrShortSrc, + t: replace, + }, + 8: { + szDst: large, + atEOF: true, + in: "Hello world!", + out: "Hello world!", + outFull: "Hello world!", + t: replace, + }, + 9: { + szDst: large, + atEOF: true, + in: "Hello\x80 w\x80orl\xc2d!\xc2", + out: "Hello\ufffd w\ufffdorl\ufffdd!\ufffd", + outFull: "Hello\ufffd w\ufffdorl\ufffdd!\ufffd", + t: replace, + }, + 10: { + szDst: large, + atEOF: false, + in: "Hello\x80 w\x80orl\xc2d!\xc2", + out: "Hello\ufffd w\ufffdorl\ufffdd!", + outFull: "Hello\ufffd w\ufffdorl\ufffdd!\ufffd", + err: transform.ErrShortSrc, + t: replace, + }, + 16: { + szDst: 10, + atEOF: false, + in: "\x80Hello\x80", + out: "\ufffdHello", + outFull: "\ufffdHello\ufffd", + err: transform.ErrShortDst, + t: replace, + }, + } { + tt.check(t, i) + } +} + +func TestMapAlloc(t *testing.T) { + if n := testing.AllocsPerRun(3, func() { + Map(idem).Transform(nil, nil, false) + }); n > 0 { + t.Errorf("got %f; want 0", n) + } +} + +func rmNop(r rune) bool { return false } + +func TestRemoveAlloc(t *testing.T) { + if n := testing.AllocsPerRun(3, func() { + Remove(Predicate(rmNop)).Transform(nil, nil, false) + }); n > 0 { + t.Errorf("got %f; want 0", n) + } +} + +func TestReplaceIllFormedAlloc(t *testing.T) { + if n := testing.AllocsPerRun(3, func() { + ReplaceIllFormed().Transform(nil, nil, false) + }); n > 0 { + t.Errorf("got %f; want 0", n) + } +} + +func BenchmarkRemove(b *testing.B) { + dst := make([]byte, len(input)) + src := []byte(input) + + r := Remove(Predicate(func(r rune) bool { return r == 'e' })) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + r.Transform(dst, src, true) + } +} + +func BenchmarkMapAll(b *testing.B) { + dst := make([]byte, 2*len(input)) + src := []byte(input) + + r := Map(func(r rune) rune { return 'a' }) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + r.Transform(dst, src, true) + } +} + +func BenchmarkMapNone(b *testing.B) { + dst := make([]byte, 2*len(input)) + src := []byte(input) + + r := Map(func(r rune) rune { return r }) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + r.Transform(dst, src, true) + } +} + +func BenchmarkReplaceIllFormed(b *testing.B) { + dst := make([]byte, 2*len(input)) + src := []byte(input) + + t := ReplaceIllFormed() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + t.Transform(dst, src, true) + } +} + +var ( + input = strings.Repeat("Thé qüick brøwn føx jumps øver the lazy døg. ", 100) +) diff --git a/vendor/golang.org/x/text/search/index.go b/vendor/golang.org/x/text/search/index.go new file mode 100644 index 0000000000..64820ad904 --- /dev/null +++ b/vendor/golang.org/x/text/search/index.go @@ -0,0 +1,47 @@ +// 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. + +// Note: this file is identical to the file text/collate/index.go. Both files +// will be removed when the new colltab package is finished and in use. + +package search + +// tableIndex holds information for constructing a table +// for a certain locale based on the main table. +type tableIndex struct { + lookupOffset uint32 + valuesOffset uint32 +} + +func (t tableIndex) TrieIndex() []uint16 { + return mainLookup[:] +} + +func (t tableIndex) TrieValues() []uint32 { + return mainValues[:] +} + +func (t tableIndex) FirstBlockOffsets() (lookup, value uint16) { + return uint16(t.lookupOffset), uint16(t.valuesOffset) +} + +func (t tableIndex) ExpandElems() []uint32 { + return mainExpandElem[:] +} + +func (t tableIndex) ContractTries() []struct{ l, h, n, i uint8 } { + return mainCTEntries[:] +} + +func (t tableIndex) ContractElems() []uint32 { + return mainContractElem[:] +} + +func (t tableIndex) MaxContractLen() int { + return 18 // TODO: generate +} + +func (t tableIndex) VariableTop() uint32 { + return varTop +} diff --git a/vendor/golang.org/x/text/search/pattern.go b/vendor/golang.org/x/text/search/pattern.go new file mode 100644 index 0000000000..439d1d7f7a --- /dev/null +++ b/vendor/golang.org/x/text/search/pattern.go @@ -0,0 +1,156 @@ +// 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 search + +import ( + "golang.org/x/text/collate/colltab" + newcolltab "golang.org/x/text/internal/colltab" +) + +// TODO: handle variable primary weights? + +func (p *Pattern) deleteEmptyElements() { + k := 0 + for _, e := range p.ce { + if !isIgnorable(p.m, e) { + p.ce[k] = e + k++ + } + } + p.ce = p.ce[:k] +} + +func isIgnorable(m *Matcher, e colltab.Elem) bool { + if e.Primary() > 0 { + return false + } + if e.Secondary() > 0 { + if !m.ignoreDiacritics { + return false + } + // Primary value is 0 and ignoreDiacritics is true. In this case we + // ignore the tertiary element, as it only pertains to the modifier. + return true + } + // TODO: further distinguish once we have the new implementation. + if !(m.ignoreWidth || m.ignoreCase) && e.Tertiary() > 0 { + return false + } + // TODO: we ignore the Quaternary level for now. + return true +} + +// TODO: Use a Boyer-Moore-like algorithm (probably Sunday) for searching. + +func (p *Pattern) forwardSearch(it *newcolltab.Iter) (start, end int) { + for start := 0; it.Next(); it.Reset(start) { + nextStart := it.End() + if end := p.searchOnce(it); end != -1 { + return start, end + } + start = nextStart + } + return -1, -1 +} + +func (p *Pattern) anchoredForwardSearch(it *newcolltab.Iter) (start, end int) { + if it.Next() { + if end := p.searchOnce(it); end != -1 { + return 0, end + } + } + return -1, -1 +} + +// next advances to the next weight in a pattern. f must return one of the +// weights of a collation element. next will advance to the first non-zero +// weight and return this weight and true if it exists, or 0, false otherwise. +func (p *Pattern) next(i *int, f func(colltab.Elem) int) (weight int, ok bool) { + for *i < len(p.ce) { + v := f(p.ce[*i]) + *i++ + if v != 0 { + // Skip successive ignorable values. + for ; *i < len(p.ce) && f(p.ce[*i]) == 0; *i++ { + } + return v, true + } + } + return 0, false +} + +// TODO: remove this function once Elem is internal and Tertiary returns int. +func tertiary(e colltab.Elem) int { + return int(e.Tertiary()) +} + +// searchOnce tries to match the pattern s.p at the text position i. s.buf needs +// to be filled with collation elements of the first segment, where n is the +// number of source bytes consumed for this segment. It will return the end +// position of the match or -1. +func (p *Pattern) searchOnce(it *newcolltab.Iter) (end int) { + var pLevel [4]int + + m := p.m + for { + k := 0 + for ; k < it.N; k++ { + if v := it.Elems[k].Primary(); v > 0 { + if w, ok := p.next(&pLevel[0], colltab.Elem.Primary); !ok || v != w { + return -1 + } + } + + if !m.ignoreDiacritics { + if v := it.Elems[k].Secondary(); v > 0 { + if w, ok := p.next(&pLevel[1], colltab.Elem.Secondary); !ok || v != w { + return -1 + } + } + } else if it.Elems[k].Primary() == 0 { + // We ignore tertiary values of collation elements of the + // secondary level. + continue + } + + // TODO: distinguish between case and width. This will be easier to + // implement after we moved to the new collation implementation. + if !m.ignoreWidth && !m.ignoreCase { + if v := it.Elems[k].Tertiary(); v > 0 { + if w, ok := p.next(&pLevel[2], tertiary); !ok || int(v) != w { + return -1 + } + } + } + // TODO: check quaternary weight + } + it.Discard() // Remove the current segment from the buffer. + + // Check for completion. + switch { + // If any of these cases match, we are not at the end. + case pLevel[0] < len(p.ce): + case !m.ignoreDiacritics && pLevel[1] < len(p.ce): + case !(m.ignoreWidth || m.ignoreCase) && pLevel[2] < len(p.ce): + default: + // At this point, both the segment and pattern has matched fully. + // However, the segment may still be have trailing modifiers. + // This can be verified by another call to next. + end = it.End() + if it.Next() && it.Elems[0].Primary() == 0 { + if !m.ignoreDiacritics { + return -1 + } + end = it.End() + } + return end + } + + // Fill the buffer with the next batch of collation elements. + if !it.Next() { + return -1 + } + } +} diff --git a/vendor/golang.org/x/text/search/pattern_test.go b/vendor/golang.org/x/text/search/pattern_test.go new file mode 100644 index 0000000000..931fa65628 --- /dev/null +++ b/vendor/golang.org/x/text/search/pattern_test.go @@ -0,0 +1,357 @@ +// 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 search + +import ( + "reflect" + "strings" + "testing" + + "golang.org/x/text/language" +) + +func TestCompile(t *testing.T) { + for i, tc := range []struct { + desc string + pattern string + options []Option + n int + }{{ + desc: "empty", + pattern: "", + n: 0, + }, { + desc: "single", + pattern: "a", + n: 1, + }, { + desc: "keep modifier", + pattern: "a\u0300", // U+0300: COMBINING GRAVE ACCENT + n: 2, + }, { + desc: "remove modifier", + pattern: "a\u0300", // U+0300: COMBINING GRAVE ACCENT + options: []Option{IgnoreDiacritics}, + n: 1, + }, { + desc: "single with double collation element", + pattern: "ä", + n: 2, + }, { + desc: "leading variable", + pattern: " a", + n: 2, + }, { + desc: "trailing variable", + pattern: "aa ", + n: 3, + }, { + desc: "leading and trailing variable", + pattern: " äb ", + n: 5, + }, { + desc: "keep interior variable", + pattern: " ä b ", + n: 6, + }, { + desc: "keep interior variables", + pattern: " b ä ", + n: 7, + }, { + desc: "remove ignoreables (zero-weights across the board)", + pattern: "\u009Db\u009Dä\u009D", // U+009D: OPERATING SYSTEM COMMAND + n: 3, + }} { + m := New(language.Und, tc.options...) + p := m.CompileString(tc.pattern) + if len(p.ce) != tc.n { + t.Errorf("%d:%s: Compile(%+q): got %d; want %d", i, tc.desc, tc.pattern, len(p.ce), tc.n) + } + } +} + +func TestNorm(t *testing.T) { + // U+0300: COMBINING GRAVE ACCENT (CCC=230) + // U+031B: COMBINING HORN (CCC=216) + for _, tc := range []struct { + desc string + a string + b string + want bool // a and b compile into the same pattern? + }{{ + "simple", + "eee\u0300\u031b", + "eee\u031b\u0300", + true, + }, { + "large number of modifiers in pattern", + strings.Repeat("\u0300", 29) + "\u0318", + "\u0318" + strings.Repeat("\u0300", 29), + true, + }, { + "modifier overflow in pattern", + strings.Repeat("\u0300", 30) + "\u0318", + "\u0318" + strings.Repeat("\u0300", 30), + false, + }} { + m := New(language.Und) + a := m.CompileString(tc.a) + b := m.CompileString(tc.b) + if got := reflect.DeepEqual(a, b); got != tc.want { + t.Errorf("Compile(a) == Compile(b) == %v; want %v", got, tc.want) + } + } +} + +func TestForwardSearch(t *testing.T) { + for i, tc := range []struct { + desc string + tag string + options []Option + pattern string + text string + want []int + }{{ + // The semantics of an empty search is to match nothing. + // TODO: change this to be in line with strings.Index? It is quite a + // different beast, so not sure yet. + + desc: "empty pattern and text", + tag: "und", + pattern: "", + text: "", + want: nil, // TODO: consider: []int{0, 0}, + }, { + desc: "non-empty pattern and empty text", + tag: "und", + pattern: " ", + text: "", + want: nil, + }, { + desc: "empty pattern and non-empty text", + tag: "und", + pattern: "", + text: "abc", + want: nil, // TODO: consider: []int{0, 0, 1, 1, 2, 2, 3, 3}, + }, { + // Variable-only patterns. We don't support variables at the moment, + // but verify that, given this, the behavior is indeed as expected. + + desc: "exact match of variable", + tag: "und", + pattern: " ", + text: " ", + want: []int{0, 1}, + }, { + desc: "variables not handled by default", + tag: "und", + pattern: "- ", + text: " -", + want: nil, // Would be (1, 2) for a median match with variable}. + }, { + desc: "multiple subsequent identical variables", + tag: "und", + pattern: " ", + text: " ", + want: []int{0, 1, 1, 2, 2, 3, 3, 4}, + }, { + desc: "text with variables", + tag: "und", + options: []Option{IgnoreDiacritics}, + pattern: "abc", + text: "3 abc 3", + want: []int{2, 5}, + }, { + desc: "pattern with interior variables", + tag: "und", + options: []Option{IgnoreDiacritics}, + pattern: "a b c", + text: "3 a b c abc a b c 3", + want: []int{2, 7}, // Would have 3 matches using variable. + + // TODO: Different variable handling settings. + }, { + // Options. + + desc: "match all levels", + tag: "und", + pattern: "Abc", + text: "abcAbcABCÁbcábc", + want: []int{3, 6}, + }, { + desc: "ignore diacritics in text", + tag: "und", + options: []Option{IgnoreDiacritics}, + pattern: "Abc", + text: "Ábc", + want: []int{0, 4}, + }, { + desc: "ignore diacritics in pattern", + tag: "und", + options: []Option{IgnoreDiacritics}, + pattern: "Ábc", + text: "Abc", + want: []int{0, 3}, + }, { + desc: "ignore diacritics", + tag: "und", + options: []Option{IgnoreDiacritics}, + pattern: "Abc", + text: "abcAbcABCÁbcábc", + want: []int{3, 6, 9, 13}, + }, { + desc: "ignore case", + tag: "und", + options: []Option{IgnoreCase}, + pattern: "Abc", + text: "abcAbcABCÁbcábc", + want: []int{0, 3, 3, 6, 6, 9}, + }, { + desc: "ignore case and diacritics", + tag: "und", + options: []Option{IgnoreCase, IgnoreDiacritics}, + pattern: "Abc", + text: "abcAbcABCÁbcábc", + want: []int{0, 3, 3, 6, 6, 9, 9, 13, 13, 17}, + }, { + desc: "ignore width to fullwidth", + tag: "und", + options: []Option{IgnoreWidth}, + pattern: "abc", + text: "123 \uFF41\uFF42\uFF43 123", // U+FF41-3: FULLWIDTH LATIN SMALL LETTER A-C + want: []int{4, 13}, + }, { + // TODO: distinguish between case and width. + desc: "don't ignore width to fullwidth, ignoring only case", + tag: "und", + options: []Option{IgnoreCase}, + pattern: "abc", + text: "123 \uFF41\uFF42\uFF43 123", // U+FF41-3: FULLWIDTH LATIN SMALL LETTER A-C + want: []int{4, 13}, + }, { + desc: "ignore width to fullwidth and diacritics", + tag: "und", + options: []Option{IgnoreWidth, IgnoreDiacritics}, + pattern: "abc", + text: "123 \uFF41\uFF42\uFF43 123", // U+FF41-3: FULLWIDTH LATIN SMALL LETTER A-C + want: []int{4, 13}, + }, { + desc: "whole grapheme, single rune", + tag: "und", + pattern: "eee", + text: "123 eeé 123", + want: nil, + }, { + // Note: rules on when to apply contractions may, for certain languages, + // differ between search and collation. For example, "ch" is not + // considered a contraction for the purpose of searching in Spanish. + // Therefore, be careful picking this test. + desc: "whole grapheme, contractions", + tag: "da", + pattern: "aba", + // Fails at the primary level, because "aa" is a contraction. + text: "123 abaa 123", + want: []int{}, + }, { + desc: "whole grapheme, trailing modifier", + tag: "und", + pattern: "eee", + text: "123 eee\u0300 123", // U+0300: COMBINING GRAVE ACCENT + want: nil, + }, { + // Language-specific matching. + + desc: "", + tag: "da", + options: []Option{IgnoreCase}, + pattern: "Århus", + text: "AarhusÅrhus Århus ", + want: []int{0, 6, 6, 12, 14, 20}, + }, { + desc: "", + tag: "da", + options: []Option{IgnoreCase}, + pattern: "Aarhus", + text: "Århus Aarhus", + want: []int{0, 6, 7, 13}, + }, { + desc: "", + tag: "en", // Å does not match A for English. + options: []Option{IgnoreCase}, + pattern: "Aarhus", + text: "Århus", + want: nil, + }, { + desc: "ignore modifier in text", + options: []Option{IgnoreDiacritics}, + tag: "und", + pattern: "eee", + text: "123 eee\u0300 123", // U+0300: COMBINING GRAVE ACCENT + want: []int{4, 9}, // Matches on grapheme boundary. + }, { + desc: "ignore multiple modifiers in text", + options: []Option{IgnoreDiacritics}, + tag: "und", + pattern: "eee", + text: "123 eee\u0300\u0300 123", // U+0300: COMBINING GRAVE ACCENT + want: []int{4, 11}, // Matches on grapheme boundary. + }, { + desc: "ignore modifier in pattern", + options: []Option{IgnoreDiacritics}, + tag: "und", + pattern: "eee\u0300", // U+0300: COMBINING GRAVE ACCENT + text: "123 eee 123", + want: []int{4, 7}, + }, { + desc: "ignore multiple modifiers in pattern", + options: []Option{IgnoreDiacritics}, + tag: "und", + pattern: "eee\u0300\u0300", // U+0300: COMBINING GRAVE ACCENT + text: "123 eee 123", + want: []int{4, 7}, + }, { + desc: "match non-normalized pattern", + tag: "und", + // U+0300: COMBINING GRAVE ACCENT (CCC=230) + // U+031B: COMBINING HORN (CCC=216) + pattern: "eee\u0300\u031b", + text: "123 eee\u031b\u0300 123", + want: []int{4, 11}, + }, { + desc: "match non-normalized text", + tag: "und", + // U+0300: COMBINING GRAVE ACCENT (CCC=230) + // U+031B: COMBINING HORN (CCC=216) + pattern: "eee\u031b\u0300", + text: "123 eee\u0300\u031b 123", + want: []int{4, 11}, + }} { + m := New(language.MustParse(tc.tag), tc.options...) + p := m.CompileString(tc.pattern) + for j := 0; j < len(tc.text); { + start, end := p.IndexString(tc.text[j:]) + if start == -1 && end == -1 { + j++ + continue + } + start += j + end += j + j = end + if len(tc.want) == 0 { + t.Errorf("%d:%s: found unexpected result [%d %d]", i, tc.desc, start, end) + break + } + if tc.want[0] != start || tc.want[1] != end { + t.Errorf("%d:%s: got [%d %d]; want %v", i, tc.desc, start, end, tc.want[:2]) + tc.want = tc.want[2:] + break + } + tc.want = tc.want[2:] + } + if len(tc.want) != 0 { + t.Errorf("%d:%s: %d extra results", i, tc.desc, len(tc.want)/2) + } + } +} diff --git a/vendor/golang.org/x/text/search/search.go b/vendor/golang.org/x/text/search/search.go new file mode 100644 index 0000000000..0ad153478e --- /dev/null +++ b/vendor/golang.org/x/text/search/search.go @@ -0,0 +1,238 @@ +// 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. + +//go:generate go run ../collate/maketables.go -cldr=23 -unicode=6.2.0 -types=search,searchjl -package=search + +// Package search provides language-specific search and string matching. +// +// Natural language matching can be intricate. For example, Danish will insist +// "Århus" and "Aarhus" are the same name and Turkish will match I to ı (note +// the lack of a dot) in a case-insensitive match. This package handles such +// language-specific details. +// +// Text passed to any of the calls in this message does not need to be +// normalized. +package search // import "golang.org/x/text/search" + +import ( + "strings" + + "golang.org/x/text/collate/colltab" + newcolltab "golang.org/x/text/internal/colltab" + "golang.org/x/text/language" +) + +// An Option configures a Matcher. +type Option func(*Matcher) + +var ( + // WholeWord restricts matches to complete words. The default is to match at + // the character level. + WholeWord Option = nil + + // Exact requires that two strings are their exact equivalent. For example + // å would not match aa in Danish. It overrides any of the ignore options. + Exact Option = nil + + // Loose causes case, diacritics and width to be ignored. + Loose Option = loose + + // IgnoreCase enables case-insensitive search. + IgnoreCase Option = ignoreCase + + // IgnoreDiacritics causes diacritics to be ignored ("ö" == "o"). + IgnoreDiacritics Option = ignoreDiacritics + + // IgnoreWidth equates narrow with wide variants. + IgnoreWidth Option = ignoreWidth +) + +func ignoreDiacritics(m *Matcher) { m.ignoreDiacritics = true } +func ignoreCase(m *Matcher) { m.ignoreCase = true } +func ignoreWidth(m *Matcher) { m.ignoreWidth = true } +func loose(m *Matcher) { + ignoreDiacritics(m) + ignoreCase(m) + ignoreWidth(m) +} + +var ( + // Supported lists the languages for which search differs from its parent. + Supported language.Coverage + + tags []language.Tag +) + +func init() { + ids := strings.Split(availableLocales, ",") + tags = make([]language.Tag, len(ids)) + for i, s := range ids { + tags[i] = language.Raw.MustParse(s) + } + Supported = language.NewCoverage(tags) +} + +// New returns a new Matcher for the given language and options. +func New(t language.Tag, opts ...Option) *Matcher { + m := &Matcher{ + w: colltab.Init(locales[newcolltab.MatchLang(t, tags)]), + } + for _, f := range opts { + f(m) + } + return m +} + +// A Matcher implements language-specific string matching. +type Matcher struct { + w colltab.Weighter + ignoreCase bool + ignoreWidth bool + ignoreDiacritics bool +} + +// An IndexOption specifies how the Index methods of Pattern or Matcher should +// match the input. +type IndexOption byte + +const ( + // Anchor restricts the search to the start (or end for Backwards) of the + // text. + Anchor IndexOption = 1 << iota + + // Backwards starts the search from the end of the text. + Backwards + + anchorBackwards = Anchor | Backwards +) + +// Index reports the start and end position of the first occurrence of pat in b +// or -1, -1 if pat is not present. +func (m *Matcher) Index(b, pat []byte, opts ...IndexOption) (start, end int) { + // TODO: implement optimized version that does not use a pattern. + return m.Compile(pat).Index(b, opts...) +} + +// IndexString reports the start and end position of the first occurrence of pat +// in s or -1, -1 if pat is not present. +func (m *Matcher) IndexString(s, pat string, opts ...IndexOption) (start, end int) { + // TODO: implement optimized version that does not use a pattern. + return m.CompileString(pat).IndexString(s, opts...) +} + +// Equal reports whether a and b are equivalent. +func (m *Matcher) Equal(a, b []byte) bool { + _, end := m.Index(a, b, Anchor) + return end == len(a) +} + +// EqualString reports whether a and b are equivalent. +func (m *Matcher) EqualString(a, b string) bool { + _, end := m.IndexString(a, b, Anchor) + return end == len(a) +} + +// Compile compiles and returns a pattern that can be used for faster searching. +func (m *Matcher) Compile(b []byte) *Pattern { + p := &Pattern{m: m} + iter := newcolltab.Iter{Weighter: m.w} + for iter.SetInput(b); iter.Next(); { + } + p.ce = iter.Elems + p.deleteEmptyElements() + return p +} + +// CompileString compiles and returns a pattern that can be used for faster +// searching. +func (m *Matcher) CompileString(s string) *Pattern { + p := &Pattern{m: m} + iter := newcolltab.Iter{Weighter: m.w} + for iter.SetInputString(s); iter.Next(); { + } + p.ce = iter.Elems + p.deleteEmptyElements() + return p +} + +// A Pattern is a compiled search string. It is safe for concurrent use. +type Pattern struct { + m *Matcher + ce []colltab.Elem +} + +// Design note (TODO remove): +// The cost of retrieving collation elements for each rune, which is used for +// search as well, is not trivial. Also, algorithms like Boyer-Moore and +// Sunday require some additional precomputing. + +// Index reports the start and end position of the first occurrence of p in b +// or -1, -1 if p is not present. +func (p *Pattern) Index(b []byte, opts ...IndexOption) (start, end int) { + // Pick a large enough buffer such that we likely do not need to allocate + // and small enough to not cause too much overhead initializing. + var buf [8]colltab.Elem + + it := &newcolltab.Iter{ + Weighter: p.m.w, + Elems: buf[:0], + } + it.SetInput(b) + + var optMask IndexOption + for _, o := range opts { + optMask |= o + } + + switch optMask { + case 0: + return p.forwardSearch(it) + case Anchor: + return p.anchoredForwardSearch(it) + case Backwards, anchorBackwards: + panic("TODO: implement") + default: + panic("unrecognized option") + } +} + +// IndexString reports the start and end position of the first occurrence of p +// in s or -1, -1 if p is not present. +func (p *Pattern) IndexString(s string, opts ...IndexOption) (start, end int) { + // Pick a large enough buffer such that we likely do not need to allocate + // and small enough to not cause too much overhead initializing. + var buf [8]colltab.Elem + + it := &newcolltab.Iter{ + Weighter: p.m.w, + Elems: buf[:0], + } + it.SetInputString(s) + + var optMask IndexOption + for _, o := range opts { + optMask |= o + } + + switch optMask { + case 0: + return p.forwardSearch(it) + case Anchor: + return p.anchoredForwardSearch(it) + case Backwards, anchorBackwards: + panic("TODO: implement") + default: + panic("unrecognized option") + } +} + +// TODO: +// - Maybe IndexAll methods (probably not necessary). +// - Some way to match patterns in a Reader (a bit tricky). +// - Some fold transformer that folds text to comparable text, based on the +// search options. This is a common technique, though very different from the +// collation-based design of this package. It has a somewhat different use +// case, so probably makes sense to support both. Should probably be in a +// different package, though, as it uses completely different kind of tables +// (based on norm, cases, width and range tables.) diff --git a/vendor/golang.org/x/text/search/tables.go b/vendor/golang.org/x/text/search/tables.go new file mode 100644 index 0000000000..3573b687cf --- /dev/null +++ b/vendor/golang.org/x/text/search/tables.go @@ -0,0 +1,12448 @@ +// This file was generated by go generate; DO NOT EDIT + +package search + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "6.2.0" + +// CLDRVersion is the CLDR version from which the tables in this package are derived. +const CLDRVersion = "23" + +var availableLocales = "und,az,bs,ca,cs,da,de,en,en-US,es,fi,fo,fr,he,hr,is,kl,ko,ko-u-co-searchjl,nb,nn,se,sk,sr-Latn,sv,tr" + +const varTop = 0x30e + +var locales = [...]tableIndex{ + { // und + lookupOffset: 0x1a, + valuesOffset: 0x1b4, + }, + { // az + lookupOffset: 0x20, + valuesOffset: 0x1c8, + }, + { // bs + lookupOffset: 0x15, + valuesOffset: 0x0, + }, + { // ca + lookupOffset: 0x21, + valuesOffset: 0x1da, + }, + { // cs + lookupOffset: 0x23, + valuesOffset: 0x1de, + }, + { // da + lookupOffset: 0x26, + valuesOffset: 0x1e8, + }, + { // de + lookupOffset: 0x28, + valuesOffset: 0x1f2, + }, + { // en + lookupOffset: 0x1a, + valuesOffset: 0x1b4, + }, + { // en-US + lookupOffset: 0x1a, + valuesOffset: 0x1b4, + }, + { // es + lookupOffset: 0x29, + valuesOffset: 0x1f8, + }, + { // fi + lookupOffset: 0x2f, + valuesOffset: 0x1fb, + }, + { // fo + lookupOffset: 0x26, + valuesOffset: 0x1e8, + }, + { // fr + lookupOffset: 0x1a, + valuesOffset: 0x1b4, + }, + { // he + lookupOffset: 0x31, + valuesOffset: 0x20b, + }, + { // hr + lookupOffset: 0x33, + valuesOffset: 0x210, + }, + { // is + lookupOffset: 0x35, + valuesOffset: 0x217, + }, + { // kl + lookupOffset: 0x36, + valuesOffset: 0x221, + }, + { // ko + lookupOffset: 0x38, + valuesOffset: 0x1b4, + }, + { // ko-u-co-searchjl + lookupOffset: 0x3b, + valuesOffset: 0x0, + }, + { // nb + lookupOffset: 0x26, + valuesOffset: 0x22f, + }, + { // nn + lookupOffset: 0x26, + valuesOffset: 0x22f, + }, + { // se + lookupOffset: 0x3e, + valuesOffset: 0x231, + }, + { // sk + lookupOffset: 0x40, + valuesOffset: 0x23d, + }, + { // sr-Latn + lookupOffset: 0x15, + valuesOffset: 0x0, + }, + { // sv + lookupOffset: 0x42, + valuesOffset: 0x244, + }, + { // tr + lookupOffset: 0x48, + valuesOffset: 0x24c, + }, +} + +// mainExpandElem: 10841 entries, 43364 bytes +var mainExpandElem = [10841]uint32{ + // Block 0, offset 0x0 + 0x00000002, 0xAE604702, 0xAE603202, 0x00000002, 0xA000A51A, 0xA000BA1A, + 0x00000002, 0xA000A91A, 0xA000BA1A, 0x00000002, 0xA000AD1A, 0xA000BA1A, + 0x00000002, 0xA000B21A, 0xA000BA1A, 0x00000002, 0xA000B61A, 0xA000BA1A, + 0x00000002, 0xA000BA1A, 0xA000D11A, 0x00000004, 0x0003F484, 0x0029CE84, + 0x0029CC84, 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, 0x0029CE84, + 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, 0x0029D084, 0x0003F69F, + 0x00000004, 0x0003F484, 0x0029CE84, 0x0029D284, 0x0003F69F, 0x00000004, + 0x0003F484, 0x0029CE84, 0x0029D484, 0x0003F69F, 0x00000004, 0x0003F484, + 0x0029CE84, 0x0029D684, 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, + 0x0029D884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, 0x0029DA84, + 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, + // Block 1, offset 0x40 + 0x0029DC84, 0x0003F69F, 0x00000004, 0x0003F484, 0x0029CE84, 0x0029DE84, + 0x0003F69F, 0x00000004, 0x0003F484, 0x0029D084, 0x0029CC84, 0x0003F69F, + 0x00000004, 0x0003F484, 0x0062AC84, 0x0063A884, 0x0003F69F, 0x00000004, + 0x0003F484, 0x0062B084, 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, + 0x0062B284, 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062B684, + 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062B884, 0x0063A884, + 0x0003F69F, 0x00000004, 0x0003F484, 0x0062BA84, 0x0063A884, 0x0003F69F, + 0x00000004, 0x0003F484, 0x0062BE84, 0x0063A884, 0x0003F69F, 0x00000004, + 0x0003F484, 0x0062C284, 0x0063A884, 0x0003F69F, 0x00000007, 0x0003F484, + 0x0062C284, 0x0063B884, 0x0062C484, 0x0063B084, 0x00646A84, 0x0003F69F, + 0x00000006, 0x0003F484, 0x0062C284, 0x0063B884, + // Block 2, offset 0x80 + 0x0062D084, 0x0063C284, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062C484, + 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062C484, 0x0063C284, + 0x0003F69F, 0x00000004, 0x0003F484, 0x0062C884, 0x0063A884, 0x0003F69F, + 0x00000004, 0x0003F484, 0x0062CA84, 0x0063A884, 0x0003F69F, 0x00000004, + 0x0003F484, 0x0062CC84, 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, + 0x0062CE84, 0x0063A884, 0x0003F69F, 0x00000004, 0x0003F484, 0x0062D084, + 0x0063A884, 0x0003F69F, 0x00000004, 0x00050E84, 0x00050E84, 0x00050E84, + 0x00050E9F, 0x00000002, 0x40062C20, 0xAE603202, 0x00000002, 0x40062C20, + 0xAE603502, 0x00000002, 0x40062C20, 0xAE604502, 0x00000002, 0x40063620, + 0xAE603202, 0x00000002, 0x40063620, 0xAE603502, 0x00000002, 0x40063620, + 0xAE604502, 0x00000002, 0x40063820, 0xAE603202, + // Block 3, offset 0xc0 + 0x00000002, 0x40063820, 0xAE603502, 0x00000002, 0x40063820, 0xAE604502, + 0x00000002, 0x40084420, 0xA0105402, 0x00000002, 0x40084620, 0xA0105402, + 0x00000002, 0x40084C20, 0xA0105402, 0x00000002, 0x4008B820, 0xA0105402, + 0x00000002, 0x4008BC20, 0xA0105402, 0x00000002, 0x4008C020, 0xA0105402, + 0x00000002, 0x40091E20, 0xA0105402, 0x00000002, 0x40092620, 0xA0105402, + 0x00000002, 0x40092A20, 0xA0105402, 0x00000002, 0x40094020, 0xA0105402, + 0x00000002, 0x40094220, 0xA0105402, 0x00000002, 0x40094420, 0xA0105402, + 0x00000002, 0x40097820, 0xA0105402, 0x00000002, 0x40097A20, 0xA0105402, + 0x00000004, 0x00098484, 0x00098484, 0x00098484, 0x0009849F, 0x00000002, + 0x40099E20, 0xA0105402, 0x00000002, 0x4009AA20, 0xA0105402, 0x00000002, + 0x4009AC20, 0xA0105402, 0x00000002, 0x4009B020, + // Block 4, offset 0x100 + 0xA0105402, 0x00000002, 0x4009B820, 0xA0105402, 0x00000002, 0x4009DE20, + 0xA0105402, 0x00000002, 0x4009E220, 0xA0105402, 0x00000002, 0x4009E420, + 0xA0105402, 0x00000002, 0x4009F420, 0xA0105402, 0x00000002, 0x4009F620, + 0xA0105402, 0x00000002, 0x4009F820, 0xA0105402, 0x00000002, 0x4009FA20, + 0xA0105402, 0x00000002, 0x4009FC20, 0xA0105402, 0x00000002, 0x4009FE20, + 0xA0105402, 0x00000002, 0x400A0020, 0xA0105402, 0x00000002, 0x400A0220, + 0xA0105402, 0x00000002, 0x400A0820, 0xA0105402, 0x00000002, 0x400A0A20, + 0xA0105402, 0x00000002, 0x400A0C20, 0xA0105402, 0x00000002, 0x400A0E20, + 0xA0105402, 0x00000002, 0x400A1E20, 0xA0105402, 0x00000002, 0x400A2020, + 0xA0105402, 0x00000002, 0x400A4020, 0xA0105402, 0x00000002, 0x400A4C20, + 0xA0105402, 0x00000002, 0x400A4E20, 0xA0105402, + // Block 5, offset 0x140 + 0x00000002, 0x400A5220, 0xA0105402, 0x00000002, 0x400A5820, 0xA0105402, + 0x00000002, 0x400A5A20, 0xA0105402, 0x00000002, 0x400A5C20, 0xA0105402, + 0x00000002, 0x400A5E20, 0xA0105402, 0x00000002, 0x40164620, 0xA0105402, + 0x00000002, 0x4027CE20, 0xA0012802, 0x00000002, 0x4027D020, 0xA0012802, + 0x00000002, 0x4027D420, 0xA0812802, 0x00000002, 0x4027D820, 0xA0812802, + 0x00000002, 0x4029CC20, 0xA0013F02, 0x00000002, 0x4029CC20, 0xA0014002, + 0x00000002, 0x4029CC20, 0xA0014202, 0x00000002, 0x4029CC20, 0xA0014402, + 0x00000002, 0x4029CC20, 0xA0014502, 0x00000002, 0x4029CC20, 0xA0014602, + 0x00000002, 0x4029CC20, 0xA0014702, 0x00000002, 0x4029CC20, 0xA0014802, + 0x00000002, 0x4029CC20, 0xA0014902, 0x00000002, 0x4029CC20, 0xA0014A02, + 0x00000002, 0x4029CC20, 0xA0014B02, 0x00000002, + // Block 6, offset 0x180 + 0x4029CC20, 0xA0014B02, 0x00000002, 0x4029CC20, 0xA0014C02, 0x00000002, + 0x4029CC20, 0xA0014D02, 0x00000002, 0x4029CC20, 0xA0014E02, 0x00000002, + 0x4029CC20, 0xA0014F02, 0x00000002, 0x4029CC20, 0xA0015002, 0x00000002, + 0x4029CC20, 0xA0015102, 0x00000002, 0x4029CC20, 0xA0015202, 0x00000002, + 0x4029CC20, 0xA0015302, 0x00000002, 0x4029CC20, 0xA0015402, 0x00000002, + 0x4029CC20, 0xA0015502, 0x00000002, 0x4029CC20, 0xA0015602, 0x00000002, + 0x0029CC84, 0xA0015604, 0x00000002, 0x4029CC20, 0xA0015702, 0x00000002, + 0x4029CC20, 0xA0015802, 0x00000002, 0x4029CC20, 0xA0015902, 0x00000002, + 0x4029CC20, 0xA0015A02, 0x00000002, 0x4029CC20, 0xA0015B02, 0x00000002, + 0x4029CC20, 0xA0015C02, 0x00000002, 0x4029CC20, 0xA0015D02, 0x00000002, + 0x4029CC20, 0xA0015E02, 0x00000002, 0x4029CC20, + // Block 7, offset 0x1c0 + 0xA0015F02, 0x00000002, 0x4029CC20, 0xA0016002, 0x00000002, 0x4029CC20, + 0xA0016102, 0x00000002, 0x4029CC20, 0xA0016202, 0x00000002, 0x4029CC20, + 0xA0016302, 0x00000002, 0x4029CC20, 0xA0016402, 0x00000002, 0x4029CC20, + 0xA0016502, 0x00000002, 0x4029CC20, 0xA0016602, 0x00000002, 0x4029CC20, + 0xA0016802, 0x00000002, 0x4029CC20, 0xA0017202, 0x00000002, 0x4029CC20, + 0xA0017302, 0x00000002, 0x4029CC20, 0xA0017402, 0x00000003, 0x0029CC9E, + 0x0009589E, 0x0029D29E, 0x00000002, 0x4029CE20, 0xA0013F02, 0x00000002, + 0x4029CE20, 0xA0014002, 0x00000002, 0x4029CE20, 0xA0014102, 0x00000002, + 0x4029CE20, 0xA0014202, 0x00000002, 0x4029CE20, 0xA0014302, 0x00000002, + 0x4029CE20, 0xA0014402, 0x00000002, 0x4029CE20, 0xA0014502, 0x00000002, + 0x4029CE20, 0xA0014602, 0x00000002, 0x4029CE20, + // Block 8, offset 0x200 + 0xA0014702, 0x00000002, 0x4029CE20, 0xA0014802, 0x00000002, 0x4029CE20, + 0xA0014902, 0x00000002, 0x4029CE20, 0xA0014A02, 0x00000002, 0x4029CE20, + 0xA0014B02, 0x00000002, 0x4029CE20, 0xA0014B02, 0x00000002, 0x4029CE20, + 0xA0014B02, 0x00000002, 0x4029CE20, 0xA0014C02, 0x00000002, 0x4029CE20, + 0xA0014D02, 0x00000002, 0x4029CE20, 0xA0014E02, 0x00000002, 0x4029CE20, + 0xA0014F02, 0x00000002, 0x4029CE20, 0xA0015002, 0x00000002, 0x4029CE20, + 0xA0015102, 0x00000002, 0x4029CE20, 0xA0015102, 0x00000002, 0x4029CE20, + 0xA0015202, 0x00000002, 0x4029CE20, 0xA0015302, 0x00000002, 0x4029CE20, + 0xA0015402, 0x00000002, 0x4029CE20, 0xA0015502, 0x00000002, 0x4029CE20, + 0xA0015602, 0x00000002, 0x0029CE84, 0xA0015604, 0x00000002, 0x4029CE20, + 0xA0015702, 0x00000002, 0x4029CE20, 0xA0015802, + // Block 9, offset 0x240 + 0x00000002, 0x4029CE20, 0xA0015902, 0x00000002, 0x4029CE20, 0xA0015A02, + 0x00000002, 0x4029CE20, 0xA0015B02, 0x00000002, 0x4029CE20, 0xA0015C02, + 0x00000002, 0x4029CE20, 0xA0015D02, 0x00000002, 0x4029CE20, 0xA0015E02, + 0x00000002, 0x4029CE20, 0xA0015F02, 0x00000002, 0x4029CE20, 0xA0016002, + 0x00000002, 0x4029CE20, 0xA0016102, 0x00000002, 0x4029CE20, 0xA0016202, + 0x00000002, 0x4029CE20, 0xA0016302, 0x00000002, 0x4029CE20, 0xA0016402, + 0x00000002, 0x4029CE20, 0xA0016502, 0x00000002, 0x4029CE20, 0xA0016602, + 0x00000002, 0x4029CE20, 0xA0016702, 0x00000002, 0x4029CE20, 0xA0016802, + 0x00000002, 0x4029CE20, 0xA0016802, 0x00000002, 0x4029CE20, 0xA0016802, + 0x00000002, 0x4029CE20, 0xA0016802, 0x00000002, 0x4029CE20, 0xA0016A02, + 0x00000002, 0x4029CE20, 0xA0016B02, 0x00000002, + // Block 10, offset 0x280 + 0x4029CE20, 0xA0016C02, 0x00000002, 0x4029CE20, 0xA0016C02, 0x00000002, + 0x4029CE20, 0xA0016C02, 0x00000002, 0x4029CE20, 0xA0016C02, 0x00000002, + 0x4029CE20, 0xA0016C02, 0x00000002, 0x4029CE20, 0xA0016C02, 0x00000002, + 0x4029CE20, 0xA0016D02, 0x00000002, 0x4029CE20, 0xA0016E02, 0x00000002, + 0x4029CE20, 0xA0016F02, 0x00000002, 0x4029CE20, 0xA0017002, 0x00000002, + 0x4029CE20, 0xA0017102, 0x00000002, 0x4029CE20, 0xA0017202, 0x00000002, + 0x4029CE20, 0xA0017302, 0x00000002, 0x4029CE20, 0xA0017402, 0x00000002, + 0x4029CE20, 0xA0017502, 0x00000002, 0x4029CE20, 0xA0017602, 0x00000002, + 0x4029CE20, 0xA0017702, 0x00000004, 0x0029CE9E, 0x0009589E, 0x0029CE9E, + 0x0029CC9E, 0x00000003, 0x0029CE9E, 0x0009589E, 0x0029D09E, 0x00000003, + 0x0029CE9E, 0x0009589E, 0x0029D29E, 0x00000003, + // Block 11, offset 0x2c0 + 0x0029CE9E, 0x0009589E, 0x0029D49E, 0x00000003, 0x0029CE9E, 0x0009589E, + 0x0029D69E, 0x00000003, 0x0029CE9E, 0x0009589E, 0x0029D89E, 0x00000003, + 0x0029CE9E, 0x0009589E, 0x0029DA9E, 0x00000003, 0x0029CE9E, 0x0009589E, + 0x0029DC9E, 0x00000003, 0x0029CE9E, 0x0009589E, 0x0029DE9E, 0x00000002, + 0x0029CE86, 0x0029CC86, 0x00000002, 0x0029CE86, 0x0029CC86, 0x00000002, + 0x0029CE86, 0x0029CC86, 0x00000002, 0x0029CE86, 0x0029CC86, 0x00000002, + 0x0029CE86, 0x0029CC86, 0x00000002, 0x0029CE86, 0x0029CE86, 0x00000002, + 0x0029CE86, 0x0029D086, 0x00000002, 0x0029CE86, 0x0029D286, 0x00000002, + 0x0029CE86, 0x0029D486, 0x00000002, 0x0029CE86, 0x0029D686, 0x00000002, + 0x0029CE86, 0x0029D886, 0x00000002, 0x0029CE86, 0x0029DA86, 0x00000002, + 0x0029CE86, 0x0029DC86, 0x00000002, 0x0029CE86, + // Block 12, offset 0x300 + 0x0029DE86, 0x00000002, 0x4029D020, 0xA0013F02, 0x00000002, 0x4029D020, + 0xA0014002, 0x00000002, 0x4029D020, 0xA0014102, 0x00000002, 0x4029D020, + 0xA0014202, 0x00000002, 0x4029D020, 0xA0014302, 0x00000002, 0x4029D020, + 0xA0014402, 0x00000002, 0x4029D020, 0xA0014502, 0x00000002, 0x4029D020, + 0xA0014602, 0x00000002, 0x4029D020, 0xA0014702, 0x00000002, 0x4029D020, + 0xA0014802, 0x00000002, 0x4029D020, 0xA0014902, 0x00000002, 0x4029D020, + 0xA0014A02, 0x00000002, 0x4029D020, 0xA0014B02, 0x00000002, 0x4029D020, + 0xA0014B02, 0x00000002, 0x4029D020, 0xA0014B02, 0x00000002, 0x4029D020, + 0xA0014C02, 0x00000002, 0x4029D020, 0xA0014D02, 0x00000002, 0x4029D020, + 0xA0014E02, 0x00000002, 0x4029D020, 0xA0014F02, 0x00000002, 0x4029D020, + 0xA0015002, 0x00000002, 0x4029D020, 0xA0015102, + // Block 13, offset 0x340 + 0x00000002, 0x4029D020, 0xA0015202, 0x00000002, 0x4029D020, 0xA0015302, + 0x00000002, 0x4029D020, 0xA0015402, 0x00000002, 0x4029D020, 0xA0015502, + 0x00000002, 0x4029D020, 0xA0015602, 0x00000002, 0x0029D084, 0xA0015604, + 0x00000002, 0x4029D020, 0xA0015702, 0x00000002, 0x4029D020, 0xA0015802, + 0x00000002, 0x4029D020, 0xA0015902, 0x00000002, 0x4029D020, 0xA0015A02, + 0x00000002, 0x4029D020, 0xA0015B02, 0x00000002, 0x4029D020, 0xA0015C02, + 0x00000002, 0x4029D020, 0xA0015D02, 0x00000002, 0x4029D020, 0xA0015E02, + 0x00000002, 0x4029D020, 0xA0015F02, 0x00000002, 0x4029D020, 0xA0016002, + 0x00000002, 0x4029D020, 0xA0016102, 0x00000002, 0x4029D020, 0xA0016202, + 0x00000002, 0x4029D020, 0xA0016302, 0x00000002, 0x4029D020, 0xA0016402, + 0x00000002, 0x4029D020, 0xA0016502, 0x00000002, + // Block 14, offset 0x380 + 0x4029D020, 0xA0016602, 0x00000002, 0x4029D020, 0xA0016702, 0x00000002, + 0x4029D020, 0xA0016802, 0x00000002, 0x4029D020, 0xA0016802, 0x00000002, + 0x4029D020, 0xA0016802, 0x00000002, 0x4029D020, 0xA0016802, 0x00000002, + 0x4029D020, 0xA0016B02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, + 0x4029D020, 0xA0016C02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, + 0x4029D020, 0xA0016C02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, + 0x4029D020, 0xA0016C02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, + 0x4029D020, 0xA0016C02, 0x00000002, 0x4029D020, 0xA0016C02, 0x00000002, + 0x4029D020, 0xA0016E02, 0x00000002, 0x4029D020, 0xA0016F02, 0x00000002, + 0x4029D020, 0xA0017002, 0x00000002, 0x4029D020, 0xA0017102, 0x00000002, + 0x4029D020, 0xA0017202, 0x00000002, 0x4029D020, + // Block 15, offset 0x3c0 + 0xA0017302, 0x00000002, 0x4029D020, 0xA0017402, 0x00000002, 0x4029D020, + 0xA0017502, 0x00000002, 0x4029D020, 0xA0017602, 0x00000002, 0x4029D020, + 0xA0017702, 0x00000003, 0x0029D09E, 0x0009589E, 0x0029D29E, 0x00000003, + 0x0029D09E, 0x0009589E, 0x0029D69E, 0x00000002, 0x0029D086, 0x0029CC86, + 0x00000002, 0x0029D086, 0x0029CC86, 0x00000002, 0x4029D220, 0xA0013F02, + 0x00000002, 0x4029D220, 0xA0014002, 0x00000002, 0x4029D220, 0xA0014102, + 0x00000002, 0x4029D220, 0xA0014202, 0x00000002, 0x4029D220, 0xA0014302, + 0x00000002, 0x4029D220, 0xA0014402, 0x00000002, 0x4029D220, 0xA0014502, + 0x00000002, 0x4029D220, 0xA0014602, 0x00000002, 0x4029D220, 0xA0014702, + 0x00000002, 0x4029D220, 0xA0014802, 0x00000002, 0x4029D220, 0xA0014902, + 0x00000002, 0x4029D220, 0xA0014A02, 0x00000002, + // Block 16, offset 0x400 + 0x4029D220, 0xA0014B02, 0x00000002, 0x4029D220, 0xA0014B02, 0x00000002, + 0x4029D220, 0xA0014B02, 0x00000002, 0x4029D220, 0xA0014C02, 0x00000002, + 0x4029D220, 0xA0014D02, 0x00000002, 0x4029D220, 0xA0014E02, 0x00000002, + 0x4029D220, 0xA0014F02, 0x00000002, 0x4029D220, 0xA0015002, 0x00000002, + 0x4029D220, 0xA0015102, 0x00000002, 0x4029D220, 0xA0015202, 0x00000002, + 0x4029D220, 0xA0015302, 0x00000002, 0x4029D220, 0xA0015402, 0x00000002, + 0x4029D220, 0xA0015502, 0x00000002, 0x4029D220, 0xA0015602, 0x00000002, + 0x0029D284, 0xA0015604, 0x00000002, 0x4029D220, 0xA0015702, 0x00000002, + 0x4029D220, 0xA0015802, 0x00000002, 0x4029D220, 0xA0015902, 0x00000002, + 0x4029D220, 0xA0015A02, 0x00000002, 0x4029D220, 0xA0015B02, 0x00000002, + 0x4029D220, 0xA0015C02, 0x00000002, 0x4029D220, + // Block 17, offset 0x440 + 0xA0015D02, 0x00000002, 0x4029D220, 0xA0015E02, 0x00000002, 0x4029D220, + 0xA0015F02, 0x00000002, 0x4029D220, 0xA0016002, 0x00000002, 0x4029D220, + 0xA0016102, 0x00000002, 0x4029D220, 0xA0016202, 0x00000002, 0x4029D220, + 0xA0016302, 0x00000002, 0x4029D220, 0xA0016402, 0x00000002, 0x4029D220, + 0xA0016502, 0x00000002, 0x4029D220, 0xA0016602, 0x00000002, 0x4029D220, + 0xA0016702, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, + 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, + 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, + 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, + 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, + 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, + // Block 18, offset 0x480 + 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016C02, + 0x00000002, 0x4029D220, 0xA0016C02, 0x00000002, 0x4029D220, 0xA0016E02, + 0x00000002, 0x4029D220, 0xA0016F02, 0x00000002, 0x4029D220, 0xA0017002, + 0x00000002, 0x4029D220, 0xA0017102, 0x00000002, 0x4029D220, 0xA0017202, + 0x00000002, 0x4029D220, 0xA0017302, 0x00000002, 0x4029D220, 0xA0017402, + 0x00000002, 0x4029D220, 0xA0017502, 0x00000002, 0x4029D220, 0xA0017602, + 0x00000002, 0x4029D220, 0xA0017702, 0x00000003, 0x0029D29E, 0x0009589E, + 0x0029D49E, 0x00000003, 0x0029D29E, 0x0009589E, 0x0029D69E, 0x00000003, + 0x0029D29E, 0x0009589E, 0x0029DC9E, 0x00000002, 0x0029D286, 0x0029CC86, + 0x00000002, 0x4029D420, 0xA0013F02, 0x00000002, 0x4029D420, 0xA0014002, + 0x00000002, 0x4029D420, 0xA0014102, 0x00000002, + // Block 19, offset 0x4c0 + 0x4029D420, 0xA0014202, 0x00000002, 0x4029D420, 0xA0014302, 0x00000002, + 0x4029D420, 0xA0014402, 0x00000002, 0x4029D420, 0xA0014502, 0x00000002, + 0x4029D420, 0xA0014602, 0x00000002, 0x4029D420, 0xA0014702, 0x00000002, + 0x4029D420, 0xA0014802, 0x00000002, 0x4029D420, 0xA0014902, 0x00000002, + 0x4029D420, 0xA0014A02, 0x00000002, 0x4029D420, 0xA0014B02, 0x00000002, + 0x4029D420, 0xA0014C02, 0x00000002, 0x4029D420, 0xA0014D02, 0x00000002, + 0x4029D420, 0xA0014E02, 0x00000002, 0x4029D420, 0xA0014F02, 0x00000002, + 0x4029D420, 0xA0015002, 0x00000002, 0x4029D420, 0xA0015102, 0x00000002, + 0x4029D420, 0xA0015202, 0x00000002, 0x4029D420, 0xA0015302, 0x00000002, + 0x4029D420, 0xA0015402, 0x00000002, 0x4029D420, 0xA0015502, 0x00000002, + 0x4029D420, 0xA0015602, 0x00000002, 0x0029D484, + // Block 20, offset 0x500 + 0xA0015604, 0x00000002, 0x4029D420, 0xA0015702, 0x00000002, 0x4029D420, + 0xA0015802, 0x00000002, 0x4029D420, 0xA0015902, 0x00000002, 0x4029D420, + 0xA0015A02, 0x00000002, 0x4029D420, 0xA0015B02, 0x00000002, 0x4029D420, + 0xA0015C02, 0x00000002, 0x4029D420, 0xA0015D02, 0x00000002, 0x4029D420, + 0xA0015E02, 0x00000002, 0x4029D420, 0xA0015F02, 0x00000002, 0x4029D420, + 0xA0016002, 0x00000002, 0x4029D420, 0xA0016102, 0x00000002, 0x4029D420, + 0xA0016202, 0x00000002, 0x4029D420, 0xA0016302, 0x00000002, 0x4029D420, + 0xA0016402, 0x00000002, 0x4029D420, 0xA0016502, 0x00000002, 0x4029D420, + 0xA0016602, 0x00000002, 0x4029D420, 0xA0016702, 0x00000002, 0x4029D420, + 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, + 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, + // Block 21, offset 0x540 + 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, + 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, + 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, + 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, + 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0016C02, + 0x00000002, 0x4029D420, 0xA0016C02, 0x00000002, 0x4029D420, 0xA0017002, + 0x00000002, 0x4029D420, 0xA0017102, 0x00000002, 0x4029D420, 0xA0017202, + 0x00000002, 0x4029D420, 0xA0017302, 0x00000002, 0x4029D420, 0xA0017402, + 0x00000002, 0x4029D420, 0xA0017502, 0x00000002, 0x4029D420, 0xA0017602, + 0x00000002, 0x4029D420, 0xA0017702, 0x00000003, 0x0029D49E, 0x0009589E, + 0x0029D69E, 0x00000002, 0x0029D486, 0x0029CC86, + // Block 22, offset 0x580 + 0x00000002, 0x4029D620, 0xA0013F02, 0x00000002, 0x4029D620, 0xA0014002, + 0x00000002, 0x4029D620, 0xA0014102, 0x00000002, 0x4029D620, 0xA0014202, + 0x00000002, 0x4029D620, 0xA0014302, 0x00000002, 0x4029D620, 0xA0014402, + 0x00000002, 0x4029D620, 0xA0014502, 0x00000002, 0x4029D620, 0xA0014602, + 0x00000002, 0x4029D620, 0xA0014702, 0x00000002, 0x4029D620, 0xA0014802, + 0x00000002, 0x4029D620, 0xA0014902, 0x00000002, 0x4029D620, 0xA0014A02, + 0x00000002, 0x4029D620, 0xA0014B02, 0x00000002, 0x4029D620, 0xA0014C02, + 0x00000002, 0x4029D620, 0xA0014D02, 0x00000002, 0x4029D620, 0xA0014E02, + 0x00000002, 0x4029D620, 0xA0014F02, 0x00000002, 0x4029D620, 0xA0015002, + 0x00000002, 0x4029D620, 0xA0015102, 0x00000002, 0x4029D620, 0xA0015202, + 0x00000002, 0x4029D620, 0xA0015302, 0x00000002, + // Block 23, offset 0x5c0 + 0x4029D620, 0xA0015402, 0x00000002, 0x4029D620, 0xA0015502, 0x00000002, + 0x4029D620, 0xA0015602, 0x00000002, 0x0029D684, 0xA0015604, 0x00000002, + 0x4029D620, 0xA0015702, 0x00000002, 0x4029D620, 0xA0015802, 0x00000002, + 0x4029D620, 0xA0015902, 0x00000002, 0x4029D620, 0xA0015A02, 0x00000002, + 0x4029D620, 0xA0015B02, 0x00000002, 0x4029D620, 0xA0015C02, 0x00000002, + 0x4029D620, 0xA0015D02, 0x00000002, 0x4029D620, 0xA0015E02, 0x00000002, + 0x4029D620, 0xA0015F02, 0x00000002, 0x4029D620, 0xA0016002, 0x00000002, + 0x4029D620, 0xA0016102, 0x00000002, 0x4029D620, 0xA0016202, 0x00000002, + 0x4029D620, 0xA0016302, 0x00000002, 0x4029D620, 0xA0016402, 0x00000002, + 0x4029D620, 0xA0016502, 0x00000002, 0x4029D620, 0xA0016602, 0x00000002, + 0x4029D620, 0xA0016702, 0x00000002, 0x4029D620, + // Block 24, offset 0x600 + 0xA0016802, 0x00000002, 0x4029D620, 0xA0016802, 0x00000002, 0x4029D620, + 0xA0016802, 0x00000002, 0x4029D620, 0xA0016802, 0x00000002, 0x4029D620, + 0xA0016802, 0x00000002, 0x4029D620, 0xA0016A02, 0x00000002, 0x4029D620, + 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, + 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, + 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, + 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, + 0xA0016C02, 0x00000002, 0x4029D620, 0xA0016C02, 0x00000002, 0x4029D620, + 0xA0016C02, 0x00000002, 0x4029D620, 0xA0017202, 0x00000002, 0x4029D620, + 0xA0017302, 0x00000002, 0x4029D620, 0xA0017402, 0x00000002, 0x4029D620, + 0xA0017502, 0x00000002, 0x4029D620, 0xA0017702, + // Block 25, offset 0x640 + 0x00000003, 0x0029D69E, 0x0009589E, 0x0029D89E, 0x00000003, 0x0029D69E, + 0x0009589E, 0x0029DC9E, 0x00000002, 0x0029D686, 0x0029CC86, 0x00000002, + 0x4029D820, 0xA0013F02, 0x00000002, 0x4029D820, 0xA0014002, 0x00000002, + 0x4029D820, 0xA0014102, 0x00000002, 0x4029D820, 0xA0014202, 0x00000002, + 0x4029D820, 0xA0014302, 0x00000002, 0x4029D820, 0xA0014402, 0x00000002, + 0x4029D820, 0xA0014502, 0x00000002, 0x4029D820, 0xA0014602, 0x00000002, + 0x4029D820, 0xA0014702, 0x00000002, 0x4029D820, 0xA0014802, 0x00000002, + 0x4029D820, 0xA0014902, 0x00000002, 0x4029D820, 0xA0014A02, 0x00000002, + 0x4029D820, 0xA0014B02, 0x00000002, 0x4029D820, 0xA0014C02, 0x00000002, + 0x4029D820, 0xA0014D02, 0x00000002, 0x4029D820, 0xA0014E02, 0x00000002, + 0x4029D820, 0xA0014F02, 0x00000002, 0x4029D820, + // Block 26, offset 0x680 + 0xA0015002, 0x00000002, 0x4029D820, 0xA0015102, 0x00000002, 0x4029D820, + 0xA0015202, 0x00000002, 0x4029D820, 0xA0015302, 0x00000002, 0x4029D820, + 0xA0015402, 0x00000002, 0x4029D820, 0xA0015502, 0x00000002, 0x4029D820, + 0xA0015602, 0x00000002, 0x0029D884, 0xA0015604, 0x00000002, 0x4029D820, + 0xA0015702, 0x00000002, 0x4029D820, 0xA0015802, 0x00000002, 0x4029D820, + 0xA0015902, 0x00000002, 0x4029D820, 0xA0015A02, 0x00000002, 0x4029D820, + 0xA0015B02, 0x00000002, 0x4029D820, 0xA0015C02, 0x00000002, 0x4029D820, + 0xA0015D02, 0x00000002, 0x4029D820, 0xA0015E02, 0x00000002, 0x4029D820, + 0xA0015F02, 0x00000002, 0x4029D820, 0xA0016002, 0x00000002, 0x4029D820, + 0xA0016102, 0x00000002, 0x4029D820, 0xA0016202, 0x00000002, 0x4029D820, + 0xA0016302, 0x00000002, 0x4029D820, 0xA0016402, + // Block 27, offset 0x6c0 + 0x00000002, 0x4029D820, 0xA0016502, 0x00000002, 0x4029D820, 0xA0016602, + 0x00000002, 0x4029D820, 0xA0016702, 0x00000002, 0x4029D820, 0xA0016902, + 0x00000002, 0x4029D820, 0xA0016C02, 0x00000002, 0x4029D820, 0xA0016C02, + 0x00000002, 0x4029D820, 0xA0016C02, 0x00000002, 0x4029D820, 0xA0016C02, + 0x00000002, 0x4029D820, 0xA0016C02, 0x00000002, 0x4029D820, 0xA0016C02, + 0x00000002, 0x4029D820, 0xA0016C02, 0x00000002, 0x4029D820, 0xA0017202, + 0x00000002, 0x4029D820, 0xA0017302, 0x00000002, 0x4029D820, 0xA0017402, + 0x00000002, 0x4029D820, 0xA0017502, 0x00000002, 0x4029D820, 0xA0017702, + 0x00000002, 0x0029D886, 0x0029CC86, 0x00000002, 0x4029DA20, 0xA0013F02, + 0x00000002, 0x4029DA20, 0xA0014002, 0x00000002, 0x4029DA20, 0xA0014102, + 0x00000002, 0x4029DA20, 0xA0014202, 0x00000002, + // Block 28, offset 0x700 + 0x4029DA20, 0xA0014302, 0x00000002, 0x4029DA20, 0xA0014402, 0x00000002, + 0x4029DA20, 0xA0014502, 0x00000002, 0x4029DA20, 0xA0014602, 0x00000002, + 0x4029DA20, 0xA0014702, 0x00000002, 0x4029DA20, 0xA0014802, 0x00000002, + 0x4029DA20, 0xA0014902, 0x00000002, 0x4029DA20, 0xA0014A02, 0x00000002, + 0x4029DA20, 0xA0014B02, 0x00000002, 0x4029DA20, 0xA0014C02, 0x00000002, + 0x4029DA20, 0xA0014D02, 0x00000002, 0x4029DA20, 0xA0014E02, 0x00000002, + 0x4029DA20, 0xA0014F02, 0x00000002, 0x4029DA20, 0xA0015002, 0x00000002, + 0x4029DA20, 0xA0015102, 0x00000002, 0x4029DA20, 0xA0015202, 0x00000002, + 0x4029DA20, 0xA0015302, 0x00000002, 0x4029DA20, 0xA0015402, 0x00000002, + 0x4029DA20, 0xA0015502, 0x00000002, 0x4029DA20, 0xA0015602, 0x00000002, + 0x0029DA84, 0xA0015604, 0x00000002, 0x4029DA20, + // Block 29, offset 0x740 + 0xA0015702, 0x00000002, 0x4029DA20, 0xA0015802, 0x00000002, 0x4029DA20, + 0xA0015902, 0x00000002, 0x4029DA20, 0xA0015A02, 0x00000002, 0x4029DA20, + 0xA0015B02, 0x00000002, 0x4029DA20, 0xA0015C02, 0x00000002, 0x4029DA20, + 0xA0015D02, 0x00000002, 0x4029DA20, 0xA0015E02, 0x00000002, 0x4029DA20, + 0xA0015F02, 0x00000002, 0x4029DA20, 0xA0016002, 0x00000002, 0x4029DA20, + 0xA0016102, 0x00000002, 0x4029DA20, 0xA0016202, 0x00000002, 0x4029DA20, + 0xA0016302, 0x00000002, 0x4029DA20, 0xA0016402, 0x00000002, 0x4029DA20, + 0xA0016502, 0x00000002, 0x4029DA20, 0xA0016602, 0x00000002, 0x4029DA20, + 0xA0016702, 0x00000002, 0x4029DA20, 0xA0016C02, 0x00000002, 0x4029DA20, + 0xA0016C02, 0x00000002, 0x4029DA20, 0xA0016C02, 0x00000002, 0x4029DA20, + 0xA0016C02, 0x00000002, 0x4029DA20, 0xA0016C02, + // Block 30, offset 0x780 + 0x00000002, 0x4029DA20, 0xA0016C02, 0x00000002, 0x4029DA20, 0xA0016C02, + 0x00000002, 0x4029DA20, 0xA0016C02, 0x00000002, 0x4029DA20, 0xA0017202, + 0x00000002, 0x4029DA20, 0xA0017302, 0x00000002, 0x4029DA20, 0xA0017402, + 0x00000002, 0x4029DA20, 0xA0017502, 0x00000002, 0x4029DA20, 0xA0017702, + 0x00000003, 0x0029DA9E, 0x0009589E, 0x0029DC9E, 0x00000002, 0x0029DA86, + 0x0029CC86, 0x00000002, 0x4029DC20, 0xA0013F02, 0x00000002, 0x4029DC20, + 0xA0014002, 0x00000002, 0x4029DC20, 0xA0014102, 0x00000002, 0x4029DC20, + 0xA0014202, 0x00000002, 0x4029DC20, 0xA0014302, 0x00000002, 0x4029DC20, + 0xA0014402, 0x00000002, 0x4029DC20, 0xA0014502, 0x00000002, 0x4029DC20, + 0xA0014602, 0x00000002, 0x4029DC20, 0xA0014702, 0x00000002, 0x4029DC20, + 0xA0014802, 0x00000002, 0x4029DC20, 0xA0014902, + // Block 31, offset 0x7c0 + 0x00000002, 0x4029DC20, 0xA0014A02, 0x00000002, 0x4029DC20, 0xA0014B02, + 0x00000002, 0x4029DC20, 0xA0014C02, 0x00000002, 0x4029DC20, 0xA0014D02, + 0x00000002, 0x4029DC20, 0xA0014E02, 0x00000002, 0x4029DC20, 0xA0014F02, + 0x00000002, 0x4029DC20, 0xA0015002, 0x00000002, 0x4029DC20, 0xA0015102, + 0x00000002, 0x4029DC20, 0xA0015202, 0x00000002, 0x4029DC20, 0xA0015302, + 0x00000002, 0x4029DC20, 0xA0015402, 0x00000002, 0x4029DC20, 0xA0015502, + 0x00000002, 0x4029DC20, 0xA0015602, 0x00000002, 0x0029DC84, 0xA0015604, + 0x00000002, 0x4029DC20, 0xA0015702, 0x00000002, 0x4029DC20, 0xA0015802, + 0x00000002, 0x4029DC20, 0xA0015902, 0x00000002, 0x4029DC20, 0xA0015A02, + 0x00000002, 0x4029DC20, 0xA0015B02, 0x00000002, 0x4029DC20, 0xA0015C02, + 0x00000002, 0x4029DC20, 0xA0015D02, 0x00000002, + // Block 32, offset 0x800 + 0x4029DC20, 0xA0015E02, 0x00000002, 0x4029DC20, 0xA0015F02, 0x00000002, + 0x4029DC20, 0xA0016002, 0x00000002, 0x4029DC20, 0xA0016102, 0x00000002, + 0x4029DC20, 0xA0016202, 0x00000002, 0x4029DC20, 0xA0016302, 0x00000002, + 0x4029DC20, 0xA0016402, 0x00000002, 0x4029DC20, 0xA0016502, 0x00000002, + 0x4029DC20, 0xA0016602, 0x00000002, 0x4029DC20, 0xA0016702, 0x00000002, + 0x4029DC20, 0xA0016C02, 0x00000002, 0x4029DC20, 0xA0016C02, 0x00000002, + 0x4029DC20, 0xA0016C02, 0x00000002, 0x4029DC20, 0xA0016C02, 0x00000002, + 0x4029DC20, 0xA0016C02, 0x00000002, 0x4029DC20, 0xA0016C02, 0x00000002, + 0x4029DC20, 0xA0016C02, 0x00000002, 0x4029DC20, 0xA0017202, 0x00000002, + 0x4029DC20, 0xA0017302, 0x00000002, 0x4029DC20, 0xA0017402, 0x00000002, + 0x4029DC20, 0xA0017502, 0x00000002, 0x4029DC20, + // Block 33, offset 0x840 + 0xA0017702, 0x00000002, 0x0029DC86, 0x0029CC86, 0x00000002, 0x4029DE20, + 0xA0013F02, 0x00000002, 0x4029DE20, 0xA0014002, 0x00000002, 0x4029DE20, + 0xA0014102, 0x00000002, 0x4029DE20, 0xA0014202, 0x00000002, 0x4029DE20, + 0xA0014302, 0x00000002, 0x4029DE20, 0xA0014402, 0x00000002, 0x4029DE20, + 0xA0014502, 0x00000002, 0x4029DE20, 0xA0014602, 0x00000002, 0x4029DE20, + 0xA0014702, 0x00000002, 0x4029DE20, 0xA0014802, 0x00000002, 0x4029DE20, + 0xA0014902, 0x00000002, 0x4029DE20, 0xA0014A02, 0x00000002, 0x4029DE20, + 0xA0014B02, 0x00000002, 0x4029DE20, 0xA0014C02, 0x00000002, 0x4029DE20, + 0xA0014D02, 0x00000002, 0x4029DE20, 0xA0014E02, 0x00000002, 0x4029DE20, + 0xA0014F02, 0x00000002, 0x4029DE20, 0xA0015002, 0x00000002, 0x4029DE20, + 0xA0015102, 0x00000002, 0x4029DE20, 0xA0015202, + // Block 34, offset 0x880 + 0x00000002, 0x4029DE20, 0xA0015302, 0x00000002, 0x4029DE20, 0xA0015402, + 0x00000002, 0x4029DE20, 0xA0015502, 0x00000002, 0x4029DE20, 0xA0015602, + 0x00000002, 0x0029DE84, 0xA0015604, 0x00000002, 0x4029DE20, 0xA0015702, + 0x00000002, 0x4029DE20, 0xA0015802, 0x00000002, 0x4029DE20, 0xA0015902, + 0x00000002, 0x4029DE20, 0xA0015A02, 0x00000002, 0x4029DE20, 0xA0015B02, + 0x00000002, 0x4029DE20, 0xA0015C02, 0x00000002, 0x4029DE20, 0xA0015D02, + 0x00000002, 0x4029DE20, 0xA0015E02, 0x00000002, 0x4029DE20, 0xA0015F02, + 0x00000002, 0x4029DE20, 0xA0016002, 0x00000002, 0x4029DE20, 0xA0016102, + 0x00000002, 0x4029DE20, 0xA0016202, 0x00000002, 0x4029DE20, 0xA0016302, + 0x00000002, 0x4029DE20, 0xA0016402, 0x00000002, 0x4029DE20, 0xA0016502, + 0x00000002, 0x4029DE20, 0xA0016602, 0x00000002, + // Block 35, offset 0x8c0 + 0x4029DE20, 0xA0016702, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, + 0x4029DE20, 0xA0016C02, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, + 0x4029DE20, 0xA0016C02, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, + 0x4029DE20, 0xA0016C02, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, + 0x4029DE20, 0xA0016C02, 0x00000002, 0x4029DE20, 0xA0016C02, 0x00000002, + 0x4029DE20, 0xA0017202, 0x00000002, 0x4029DE20, 0xA0017302, 0x00000002, + 0x4029DE20, 0xA0017402, 0x00000002, 0x4029DE20, 0xA0017502, 0x00000002, + 0x4029DE20, 0xA0017702, 0x00000002, 0x402BDE20, 0xAE603202, 0x00000002, + 0x002BDE88, 0xAE603202, 0x00000002, 0x402BDE20, 0xAE603502, 0x00000002, + 0x002BDE88, 0xAE603502, 0x00000002, 0x402BDE20, 0xAE603702, 0x00000002, + 0x002BDE88, 0xAE603702, 0x00000003, 0x402BDE20, + // Block 36, offset 0x900 + 0xAE603702, 0xAE603202, 0x00000003, 0x002BDE88, 0xAE603702, 0xAE603202, + 0x00000003, 0x402BDE20, 0xAE603702, 0xAE603502, 0x00000003, 0x002BDE88, + 0xAE603702, 0xAE603502, 0x00000003, 0x402BDE20, 0xAE603702, 0xAE604E02, + 0x00000003, 0x002BDE88, 0xAE603702, 0xAE604E02, 0x00000003, 0x402BDE20, + 0xAE603702, 0xAE606402, 0x00000003, 0x002BDE88, 0xAE603702, 0xAE606402, + 0x00000002, 0x402BDE20, 0xAE603C02, 0x00000002, 0x002BDE88, 0xAE603C02, + 0x00000003, 0x402BDE20, 0xAE603C02, 0xAE603202, 0x00000003, 0x002BDE88, + 0xAE603C02, 0xAE603202, 0x00000003, 0x402BDE20, 0xAE603C02, 0xAE603502, + 0x00000003, 0x002BDE88, 0xAE603C02, 0xAE603502, 0x00000003, 0x402BDE20, + 0xAE603C02, 0xAE604E02, 0x00000003, 0x002BDE88, 0xAE603C02, 0xAE604E02, + 0x00000003, 0x402BDE20, 0xAE603C02, 0xAE606402, + // Block 37, offset 0x940 + 0x00000003, 0x002BDE88, 0xAE603C02, 0xAE606402, 0x00000002, 0x402BDE20, + 0xAE604102, 0x00000002, 0x002BDE88, 0xAE604102, 0x00000002, 0x402BDE20, + 0xAE604302, 0x00000002, 0x002BDE88, 0xAE604302, 0x00000003, 0x402BDE20, + 0xAE604302, 0xAE603202, 0x00000003, 0x002BDE88, 0xAE604302, 0xAE603202, + 0x00000002, 0x402BDE20, 0xAE604702, 0x00000002, 0x002BDE88, 0xAE604702, + 0x00000003, 0x402BDE20, 0xAE604702, 0xAE605B02, 0x00000003, 0x002BDE88, + 0xAE604702, 0xAE605B02, 0x00000002, 0x402BDE20, 0xAE604E02, 0x00000002, + 0x002BDE88, 0xAE604E02, 0x00000002, 0x402BDE20, 0xAE605202, 0x00000002, + 0x002BDE88, 0xAE605202, 0x00000003, 0x402BDE20, 0xAE605202, 0xAE605B02, + 0x00000003, 0x002BDE88, 0xAE605202, 0xAE605B02, 0x00000002, 0x402BDE20, + 0xACA05902, 0x00000002, 0x002BDE88, 0xACA05902, + // Block 38, offset 0x980 + 0x00000002, 0x402BDE20, 0xAE605B02, 0x00000002, 0x002BDE88, 0xAE605B02, + 0x00000002, 0x402BDE20, 0xAE606402, 0x00000002, 0x002BDE88, 0xAE606402, + 0x00000002, 0x402BDE20, 0xAE606502, 0x00000002, 0x002BDE88, 0xAE606502, + 0x00000002, 0x402BDE20, 0xAE606702, 0x00000002, 0x002BDE88, 0xAE606702, + 0x00000002, 0x402BDE20, 0xADC07002, 0x00000002, 0x002BDE88, 0xADC07002, + 0x00000003, 0x402BDE20, 0xADC07002, 0xAE603702, 0x00000003, 0x002BDE88, + 0xADC07002, 0xAE603702, 0x00000003, 0x402BDE20, 0xADC07002, 0xAE603C02, + 0x00000003, 0x002BDE88, 0xADC07002, 0xAE603C02, 0x00000002, 0x402BDE20, + 0xADC07602, 0x00000002, 0x002BDE88, 0xADC07602, 0x00000002, 0x84E615EF, + 0xAE613904, 0x00000004, 0x002BDE9C, 0x0002E49C, 0x002E829C, 0x0002E49C, + 0x00000003, 0x002BDE84, 0x0004E284, 0x002C3A84, + // Block 39, offset 0x9c0 + 0x00000003, 0x002BDE84, 0x0004E284, 0x002FE684, 0x00000003, 0x002BDE8A, + 0x0004E284, 0x002FE68A, 0x00000003, 0x002BDE9D, 0x0009569C, 0x002E829C, + 0x00000002, 0x002BDE84, 0x002BDE84, 0x00000002, 0x002BDE8A, 0x002BDE8A, + 0x00000002, 0x002BDE9D, 0x002C0A9D, 0x00000003, 0x002BDE84, 0xA0013904, + 0x002C9884, 0x00000003, 0x84E615EF, 0xAE613904, 0x84E6164C, 0x00000003, + 0x002BDE8A, 0xA0013904, 0x002C988A, 0x00000003, 0x002BDE94, 0xA0013914, + 0x002C9894, 0x00000004, 0x002BDE84, 0xA0013904, 0x002C9884, 0xAE603202, + 0x00000004, 0x002BDE8A, 0xA0013904, 0x002C988A, 0xAE603202, 0x00000004, + 0x002BDE84, 0xA0013904, 0x002C9884, 0xAE605B02, 0x00000004, 0x002BDE8A, + 0xA0013904, 0x002C988A, 0xAE605B02, 0x00000002, 0x84E615EF, 0x84E61771, + 0x00000002, 0x002BDE84, 0x002EE284, 0x00000002, + // Block 40, offset 0xa00 + 0x002BDE8A, 0x002EE28A, 0x00000002, 0x002BDE84, 0x00306C84, 0x00000002, + 0x002BDE8A, 0x00306C8A, 0x00000002, 0x84E615EF, 0x84E6185F, 0x00000002, + 0x002BDE84, 0x0030BE84, 0x00000002, 0x002BDE8A, 0x0030BE8A, 0x00000003, + 0x002BDE84, 0xA0013904, 0x0030BE84, 0x00000003, 0x002BDE8A, 0xA0013904, + 0x0030BE8A, 0x00000002, 0x002BDE84, 0x00310084, 0x00000002, 0x002BDE8A, + 0x0031008A, 0x00000002, 0x402C0A20, 0xAE605202, 0x00000002, 0x002C0A88, + 0xAE605202, 0x00000002, 0x402C0A20, 0xADC07002, 0x00000002, 0x002C0A88, + 0xADC07002, 0x00000002, 0x402C0A20, 0xADC07B02, 0x00000002, 0x002C0A88, + 0xADC07B02, 0x00000003, 0x002C0A9C, 0x002BDE9C, 0x002F7A9C, 0x00000002, + 0x402C3A20, 0xAE603202, 0x00000002, 0x002C3A88, 0xAE603202, 0x00000002, + 0x402C3A20, 0xAE603C02, 0x00000002, 0x002C3A88, + // Block 41, offset 0xa40 + 0xAE603C02, 0x00000002, 0x402C3A20, 0xAE604102, 0x00000002, 0x002C3A88, + 0xAE604102, 0x00000002, 0x402C3A20, 0xAE605202, 0x00000002, 0x002C3A88, + 0xAE605202, 0x00000002, 0x402C3A20, 0xACA05602, 0x00000002, 0x84E6161D, + 0xAE605604, 0x00000002, 0x002C3A88, 0xACA05602, 0x00000003, 0x402C3A20, + 0xACA05602, 0xAE603202, 0x00000003, 0x002C3A88, 0xACA05602, 0xAE603202, + 0x00000003, 0x002C3A84, 0x0004E284, 0x002EE284, 0x00000003, 0x002C3A84, + 0x0004E284, 0x00306C84, 0x00000004, 0x002C3A9D, 0x0009569C, 0x002DFE9C, + 0x002D229C, 0x00000003, 0x002C3A9C, 0x002BDE9C, 0x002E229C, 0x00000002, + 0x002C3A9D, 0x002E229D, 0x00000003, 0x002C3A9C, 0x002E829C, 0x0029D09C, + 0x00000003, 0x002C3A9C, 0x002E829C, 0x0029D29C, 0x00000003, 0x002C3A9D, + 0x002EE29C, 0x0002E49C, 0x00000004, 0x002C3A9D, + // Block 42, offset 0xa80 + 0x002EE29D, 0x002EE29D, 0x002E229D, 0x00000002, 0x402C6220, 0xAE604102, + 0x00000002, 0x002C6288, 0xAE604102, 0x00000002, 0x402C6220, 0xAE605202, + 0x00000002, 0x002C6288, 0xAE605202, 0x00000002, 0x402C6220, 0xACA05602, + 0x00000002, 0x002C6288, 0xACA05602, 0x00000002, 0x402C6220, 0xADC07002, + 0x00000002, 0x002C6288, 0xADC07002, 0x00000002, 0x402C6220, 0xADC07802, + 0x00000002, 0x002C6288, 0xADC07802, 0x00000002, 0x402C6220, 0xADC07B02, + 0x00000002, 0x002C6288, 0xADC07B02, 0x00000002, 0x402C6220, 0xA0007D02, + 0x00000002, 0x002C6288, 0xA0007D02, 0x00000002, 0x002C6284, 0xA0013904, + 0x00000002, 0x84E61631, 0xAE613904, 0x00000002, 0x002C628A, 0xA0013904, + 0x00000002, 0x84E61631, 0xAE613A04, 0x00000002, 0x002C6284, 0xA0013A04, + 0x00000002, 0x002C628A, 0xA0013A04, 0x00000002, + // Block 43, offset 0xac0 + 0x002C6284, 0x002C0A84, 0x00000003, 0x002C629C, 0x002E829C, 0x0029D09C, + 0x00000003, 0x002C629C, 0x002E829C, 0x0029D29C, 0x00000002, 0x002C6284, + 0x00312A84, 0x00000003, 0x002C6284, 0x00312A84, 0xA0004104, 0x00000003, + 0x002C628A, 0x00312A84, 0xA0004104, 0x00000003, 0x002C628A, 0x00312A8A, + 0xA0004104, 0x00000002, 0x002C6284, 0x00315084, 0x00000002, 0x002C6284, + 0x00316484, 0x00000002, 0x402C9820, 0xAE603202, 0x00000002, 0x002C9888, + 0xAE603202, 0x00000002, 0x402C9820, 0xAE603502, 0x00000002, 0x002C9888, + 0xAE603502, 0x00000002, 0x402C9820, 0xAE603702, 0x00000002, 0x002C9888, + 0xAE603702, 0x00000002, 0x402C9820, 0xAE603C02, 0x00000002, 0x002C9888, + 0xAE603C02, 0x00000003, 0x402C9820, 0xAE603C02, 0xAE603202, 0x00000003, + 0x002C9888, 0xAE603C02, 0xAE603202, 0x00000003, + // Block 44, offset 0xb00 + 0x402C9820, 0xAE603C02, 0xAE603502, 0x00000003, 0x002C9888, 0xAE603C02, + 0xAE603502, 0x00000003, 0x402C9820, 0xAE603C02, 0xAE604E02, 0x00000003, + 0x002C9888, 0xAE603C02, 0xAE604E02, 0x00000003, 0x402C9820, 0xAE603C02, + 0xAE606402, 0x00000003, 0x002C9888, 0xAE603C02, 0xAE606402, 0x00000002, + 0x402C9820, 0xAE604102, 0x00000002, 0x002C9888, 0xAE604102, 0x00000002, + 0x402C9820, 0xAE604702, 0x00000002, 0x002C9888, 0xAE604702, 0x00000002, + 0x402C9820, 0xAE604E02, 0x00000002, 0x002C9888, 0xAE604E02, 0x00000002, + 0x402C9820, 0xAE605202, 0x00000002, 0x002C9888, 0xAE605202, 0x00000002, + 0x402C9820, 0xACA05602, 0x00000002, 0x002C9888, 0xACA05602, 0x00000003, + 0x402C9820, 0xACA05602, 0xAE603702, 0x00000003, 0x002C9888, 0xACA05602, + 0xAE603702, 0x00000002, 0x402C9820, 0xACA05902, + // Block 45, offset 0xb40 + 0x00000002, 0x002C9888, 0xACA05902, 0x00000002, 0x402C9820, 0xAE605B02, + 0x00000002, 0x002C9888, 0xAE605B02, 0x00000003, 0x402C9820, 0xAE605B02, + 0xAE603202, 0x00000003, 0x002C9888, 0xAE605B02, 0xAE603202, 0x00000003, + 0x402C9820, 0xAE605B02, 0xAE603502, 0x00000003, 0x002C9888, 0xAE605B02, + 0xAE603502, 0x00000002, 0x402C9820, 0xAE606402, 0x00000002, 0x002C9888, + 0xAE606402, 0x00000002, 0x402C9820, 0xAE606502, 0x00000002, 0x002C9888, + 0xAE606502, 0x00000002, 0x402C9820, 0xAE606702, 0x00000002, 0x002C9888, + 0xAE606702, 0x00000002, 0x402C9820, 0xADC07002, 0x00000002, 0x002C9888, + 0xADC07002, 0x00000003, 0x402C9820, 0xADC07002, 0xAE603C02, 0x00000003, + 0x002C9888, 0xADC07002, 0xAE603C02, 0x00000002, 0x402C9820, 0xADC07802, + 0x00000002, 0x002C9888, 0xADC07802, 0x00000002, + // Block 46, offset 0xb80 + 0x402C9820, 0xADC07A02, 0x00000002, 0x002C9888, 0xADC07A02, 0x00000003, + 0x002C989C, 0x002F7A9C, 0x002D229C, 0x00000002, 0x402D0820, 0xAE605202, + 0x00000002, 0x002D0888, 0xAE605202, 0x00000002, 0x002D0884, 0xA0013A04, + 0x00000002, 0x002D088A, 0xA0013A04, 0x00000003, 0x002D088A, 0x002BDE8A, + 0x0030F68A, 0x00000003, 0x002D0884, 0x002D0884, 0x002D9A84, 0x00000003, + 0x002D0884, 0x002D0884, 0x002E2284, 0x00000002, 0x002D0884, 0x002EDA84, + 0x00000004, 0x002D089D, 0x002F7A9D, 0x002C989D, 0x002C989D, 0x00000002, + 0x402D2220, 0xAE603202, 0x00000002, 0x002D2288, 0xAE603202, 0x00000002, + 0x402D2220, 0xAE603702, 0x00000002, 0x002D2288, 0xAE603702, 0x00000002, + 0x402D2220, 0xAE603C02, 0x00000002, 0x002D2288, 0xAE603C02, 0x00000002, + 0x402D2220, 0xAE604102, 0x00000002, 0x002D2288, + // Block 47, offset 0xbc0 + 0xAE604102, 0x00000002, 0x402D2220, 0xAE605202, 0x00000002, 0x002D2288, + 0xAE605202, 0x00000002, 0x402D2220, 0xACA05602, 0x00000002, 0x002D2288, + 0xACA05602, 0x00000002, 0x402D2220, 0xAE605B02, 0x00000002, 0x002D2288, + 0xAE605B02, 0x00000002, 0x002D2284, 0xA0006104, 0x00000002, 0x002D228A, + 0xA0006104, 0x00000002, 0x002D2284, 0xA0013A04, 0x00000002, 0x002D228A, + 0xA0013A04, 0x00000003, 0x002D229C, 0x002BDE9C, 0x002E229C, 0x00000003, + 0x002D229D, 0x002D689D, 0x00312A9C, 0x00000003, 0x002D229D, 0x002F2C9D, + 0x002BDE9C, 0x00000002, 0x402D6820, 0xAE603C02, 0x00000002, 0x002D6888, + 0xAE603C02, 0x00000002, 0x402D6820, 0xAE604102, 0x00000002, 0x002D6888, + 0xAE604102, 0x00000002, 0x402D6820, 0xAE604702, 0x00000002, 0x002D6888, + 0xAE604702, 0x00000002, 0x402D6820, 0xAE605202, + // Block 48, offset 0xc00 + 0x00000002, 0x002D6888, 0xAE605202, 0x00000002, 0x402D6820, 0xACA05602, + 0x00000002, 0x002D6888, 0xACA05602, 0x00000002, 0x402D6820, 0xADC07002, + 0x00000002, 0x002D6888, 0xADC07002, 0x00000002, 0x402D6820, 0xADC07902, + 0x00000002, 0x002D6888, 0xADC07902, 0x00000002, 0x402D6820, 0xADC07B02, + 0x00000002, 0x402D6820, 0xA0007D02, 0x00000002, 0x002D6888, 0xA0007D02, + 0x00000003, 0x002D689C, 0x002F2C9D, 0x002BDE9C, 0x00000002, 0x402D9A20, + 0xAE603202, 0x00000002, 0x002D9A88, 0xAE603202, 0x00000002, 0x402D9A20, + 0xAE603502, 0x00000002, 0x002D9A88, 0xAE603502, 0x00000002, 0x402D9A20, + 0xAE603702, 0x00000002, 0x002D9A88, 0xAE603702, 0x00000002, 0x402D9A20, + 0xAE603C02, 0x00000002, 0x002D9A88, 0xAE603C02, 0x00000002, 0x402D9A20, + 0xAE604102, 0x00000002, 0x002D9A88, 0xAE604102, + // Block 49, offset 0xc40 + 0x00000002, 0x402D9A20, 0xAE604702, 0x00000002, 0x002D9A88, 0xAE604702, + 0x00000003, 0x402D9A20, 0xAE604702, 0xAE603202, 0x00000003, 0x002D9A88, + 0xAE604702, 0xAE603202, 0x00000002, 0x402D9A20, 0xAE604E02, 0x00000002, + 0x002D9A88, 0xAE604E02, 0x00000002, 0x002D9A88, 0xAE605202, 0x00000002, + 0x402D9A20, 0xACA05902, 0x00000002, 0x002D9A88, 0xACA05902, 0x00000002, + 0x402D9A20, 0xAE605B02, 0x00000002, 0x002D9A88, 0xAE605B02, 0x00000002, + 0x402D9A20, 0xAE606402, 0x00000002, 0x002D9A88, 0xAE606402, 0x00000002, + 0x402D9A20, 0xAE606502, 0x00000002, 0x002D9A88, 0xAE606502, 0x00000002, + 0x402D9A20, 0xAE606702, 0x00000002, 0x002D9A88, 0xAE606702, 0x00000002, + 0x402D9A20, 0xADC07002, 0x00000002, 0x002D9A88, 0xADC07002, 0x00000002, + 0x402D9A20, 0xADC07A02, 0x00000002, 0x002D9A88, + // Block 50, offset 0xc80 + 0xADC07A02, 0x00000002, 0x002D9A9D, 0x002C3A9D, 0x00000002, 0x002D9A9D, + 0x002C629D, 0x00000002, 0x402DCC20, 0xAE603C02, 0x00000002, 0x002DCC88, + 0xAE603C02, 0x00000002, 0x402DCC20, 0xAE604102, 0x00000002, 0x402DFE20, + 0xAE603202, 0x00000002, 0x002DFE88, 0xAE603202, 0x00000002, 0x402DFE20, + 0xAE604102, 0x00000002, 0x002DFE88, 0xAE604102, 0x00000002, 0x402DFE20, + 0xACA05602, 0x00000002, 0x002DFE88, 0xACA05602, 0x00000002, 0x002DFE84, + 0xA0006104, 0x00000002, 0x002DFE8A, 0xA0006104, 0x00000002, 0x402DFE20, + 0xADC07002, 0x00000002, 0x002DFE88, 0xADC07002, 0x00000002, 0x402DFE20, + 0xADC07B02, 0x00000002, 0x002DFE88, 0xADC07B02, 0x00000004, 0x002DFE9C, + 0x002C3A9C, 0x002BDE9C, 0x002E229C, 0x00000003, 0x002DFE9C, 0x002D689D, + 0x00312A9C, 0x00000003, 0x002DFE9C, 0x002E829C, + // Block 51, offset 0xcc0 + 0x0029D09C, 0x00000003, 0x002DFE9C, 0x002E829C, 0x0029D29C, 0x00000003, + 0x002DFE9C, 0x002F2C9D, 0x002BDE9C, 0x00000002, 0x402E2220, 0xAE603202, + 0x00000002, 0x002E2288, 0xAE603202, 0x00000002, 0x402E2220, 0xAE604102, + 0x00000002, 0x002E2288, 0xAE604102, 0x00000002, 0x402E2220, 0xACA05602, + 0x00000002, 0x002E2288, 0xACA05602, 0x00000002, 0x402E2220, 0xADC07002, + 0x00000002, 0x002E2288, 0xADC07002, 0x00000003, 0x402E2220, 0xADC07002, + 0xAE605B02, 0x00000003, 0x002E2288, 0xADC07002, 0xAE605B02, 0x00000002, + 0x402E2220, 0xADC07802, 0x00000002, 0x002E2288, 0xADC07802, 0x00000002, + 0x402E2220, 0xADC07B02, 0x00000002, 0x002E2288, 0xADC07B02, 0x00000002, + 0x402E2220, 0xA0007D02, 0x00000002, 0x002E2288, 0xA0007D02, 0x00000002, + 0x402E2220, 0xA0013902, 0x00000002, 0x402E2220, + // Block 52, offset 0xd00 + 0xA0013902, 0x00000002, 0x002E2288, 0xA0013902, 0x00000002, 0x002E2288, + 0xA0013902, 0x00000002, 0x002E2284, 0x002E2284, 0x00000002, 0x002E228A, + 0x002E228A, 0x00000003, 0x002E229C, 0x002EE29C, 0x002D229C, 0x00000002, + 0x002E2284, 0x002FE684, 0x00000003, 0x002E229D, 0x00302C9D, 0x002C629D, + 0x00000002, 0x002E2284, 0x00312A84, 0x00000002, 0x402E8220, 0xAE603202, + 0x00000002, 0x002E8288, 0xAE603202, 0x00000002, 0x402E8220, 0xAE605202, + 0x00000002, 0x002E8288, 0xAE605202, 0x00000002, 0x402E8220, 0xADC07002, + 0x00000002, 0x002E8288, 0xADC07002, 0x00000003, 0x002E829C, 0x0009569C, + 0x002FE69C, 0x00000004, 0x002E829C, 0x0009569C, 0x002FE69C, 0x0029D09C, + 0x00000003, 0x002E829D, 0x002D689D, 0x00312A9C, 0x00000003, 0x002E829C, + 0x002D9A9C, 0x002E229C, 0x00000003, 0x002E829C, + // Block 53, offset 0xd40 + 0x002E829C, 0x0029D09C, 0x00000003, 0x002E829C, 0x002E829C, 0x0029D29C, + 0x00000003, 0x002E829C, 0x002EE29C, 0x002E229C, 0x00000003, 0x002E829D, + 0x002F2C9D, 0x002BDE9C, 0x00000002, 0x402E9E20, 0xAE603202, 0x00000002, + 0x002E9E88, 0xAE603202, 0x00000002, 0x402E9E20, 0xAE603502, 0x00000002, + 0x002E9E88, 0xAE603502, 0x00000002, 0x402E9E20, 0xAE604102, 0x00000002, + 0x002E9E88, 0xAE604102, 0x00000002, 0x402E9E20, 0xAE604E02, 0x00000002, + 0x002E9E88, 0xAE604E02, 0x00000002, 0x402E9E20, 0xAE605202, 0x00000002, + 0x002E9E88, 0xAE605202, 0x00000002, 0x402E9E20, 0xACA05602, 0x00000002, + 0x002E9E88, 0xACA05602, 0x00000002, 0x002E9E84, 0xA0006104, 0x00000002, + 0x002E9E8A, 0xA0006104, 0x00000002, 0x402E9E20, 0xADC07002, 0x00000002, + 0x002E9E88, 0xADC07002, 0x00000002, 0x402E9E20, + // Block 54, offset 0xd80 + 0xADC07802, 0x00000002, 0x002E9E88, 0xADC07802, 0x00000002, 0x402E9E20, + 0xADC07B02, 0x00000002, 0x002E9E88, 0xADC07B02, 0x00000003, 0x002E9E9D, + 0x002C989D, 0x0030E29D, 0x00000002, 0x002E9E9D, 0x002D229D, 0x00000002, + 0x402EE220, 0xAE603202, 0x00000002, 0x002EE288, 0xAE603202, 0x00000002, + 0x402EE220, 0xAE603502, 0x00000002, 0x002EE288, 0xAE603502, 0x00000002, + 0x402EE220, 0xAE603702, 0x00000002, 0x002EE288, 0xAE603702, 0x00000002, + 0x402EE220, 0xAE603C02, 0x00000002, 0x002EE288, 0xAE603C02, 0x00000003, + 0x402EE220, 0xAE603C02, 0xAE603202, 0x00000003, 0x002EE288, 0xAE603C02, + 0xAE603202, 0x00000003, 0x402EE220, 0xAE603C02, 0xAE603502, 0x00000003, + 0x002EE288, 0xAE603C02, 0xAE603502, 0x00000003, 0x402EE220, 0xAE603C02, + 0xAE604E02, 0x00000003, 0x002EE288, 0xAE603C02, + // Block 55, offset 0xdc0 + 0xAE604E02, 0x00000003, 0x402EE220, 0xAE603C02, 0xAE606402, 0x00000003, + 0x002EE288, 0xAE603C02, 0xAE606402, 0x00000002, 0x402EE220, 0xAE604102, + 0x00000002, 0x002EE288, 0xAE604102, 0x00000002, 0x402EE220, 0xAE604702, + 0x00000002, 0x002EE288, 0xAE604702, 0x00000003, 0x402EE220, 0xAE604702, + 0xAE605B02, 0x00000003, 0x002EE288, 0xAE604702, 0xAE605B02, 0x00000002, + 0x402EE220, 0xAE604D02, 0x00000002, 0x002EE288, 0xAE604D02, 0x00000002, + 0x402EE220, 0xAE604E02, 0x00000002, 0x002EE288, 0xAE604E02, 0x00000003, + 0x402EE220, 0xAE604E02, 0xAE603202, 0x00000003, 0x002EE288, 0xAE604E02, + 0xAE603202, 0x00000003, 0x402EE220, 0xAE604E02, 0xAE604702, 0x00000003, + 0x002EE288, 0xAE604E02, 0xAE604702, 0x00000003, 0x402EE220, 0xAE604E02, + 0xAE605B02, 0x00000003, 0x002EE288, 0xAE604E02, + // Block 56, offset 0xe00 + 0xAE605B02, 0x00000002, 0x402EE220, 0xAE605202, 0x00000002, 0x002EE288, + 0xAE605202, 0x00000003, 0x402EE220, 0xAE605202, 0xAE605B02, 0x00000003, + 0x002EE288, 0xAE605202, 0xAE605B02, 0x00000002, 0x402EE220, 0xA0005402, + 0x00000002, 0x002EE288, 0xA0005402, 0x00000003, 0x402EE220, 0xA0005402, + 0xAE603202, 0x00000003, 0x002EE288, 0xA0005402, 0xAE603202, 0x00000002, + 0x402EE220, 0xACA05902, 0x00000002, 0x002EE288, 0xACA05902, 0x00000003, + 0x402EE220, 0xACA05902, 0xAE605B02, 0x00000003, 0x002EE288, 0xACA05902, + 0xAE605B02, 0x00000002, 0x402EE220, 0xAE605B02, 0x00000002, 0x002EE288, + 0xAE605B02, 0x00000003, 0x402EE220, 0xAE605B02, 0xAE603202, 0x00000003, + 0x002EE288, 0xAE605B02, 0xAE603202, 0x00000003, 0x402EE220, 0xAE605B02, + 0xAE603502, 0x00000003, 0x002EE288, 0xAE605B02, + // Block 57, offset 0xe40 + 0xAE603502, 0x00000002, 0x402EE220, 0xAE606402, 0x00000002, 0x002EE288, + 0xAE606402, 0x00000002, 0x402EE220, 0xAE606502, 0x00000002, 0x002EE288, + 0xAE606502, 0x00000002, 0x402EE220, 0xAE606702, 0x00000002, 0x002EE288, + 0xAE606702, 0x00000002, 0x402EE220, 0xAD806802, 0x00000002, 0x002EE288, + 0xAD806802, 0x00000003, 0x402EE220, 0xAD806802, 0xAE603202, 0x00000003, + 0x002EE288, 0xAD806802, 0xAE603202, 0x00000003, 0x402EE220, 0xAD806802, + 0xAE603502, 0x00000003, 0x002EE288, 0xAD806802, 0xAE603502, 0x00000003, + 0x402EE220, 0xAD806802, 0xAE604E02, 0x00000003, 0x002EE288, 0xAD806802, + 0xAE604E02, 0x00000003, 0x402EE220, 0xAD806802, 0xAE606402, 0x00000003, + 0x002EE288, 0xAD806802, 0xAE606402, 0x00000003, 0x402EE220, 0xAD806802, + 0xADC07002, 0x00000003, 0x002EE288, 0xAD806802, + // Block 58, offset 0xe80 + 0xADC07002, 0x00000002, 0x402EE220, 0xADC07002, 0x00000002, 0x002EE288, + 0xADC07002, 0x00000003, 0x402EE220, 0xADC07002, 0xAE603C02, 0x00000003, + 0x002EE288, 0xADC07002, 0xAE603C02, 0x00000003, 0x002EE284, 0xA0013904, + 0x002C9884, 0x00000003, 0x002EE28A, 0xA0013904, 0x002C988A, 0x00000003, + 0x002EE294, 0xA0013914, 0x002C9894, 0x00000002, 0x002EE29D, 0x002DFE9D, + 0x00000002, 0x002EE284, 0x002EE284, 0x00000002, 0x002EE28A, 0x002EE28A, + 0x00000002, 0x402F2C20, 0xAE603202, 0x00000002, 0x002F2C88, 0xAE603202, + 0x00000002, 0x402F2C20, 0xAE605202, 0x00000002, 0x002F2C88, 0xAE605202, + 0x00000004, 0x002F2C9C, 0x0002E49C, 0x002E829C, 0x0002E49C, 0x00000002, + 0x002F2C9D, 0x002BDE9D, 0x00000003, 0x002F2C9D, 0x002F2C9D, 0x002E829D, + 0x00000003, 0x002F2C9D, 0x002F2C9D, 0x0030BE9D, + // Block 59, offset 0xec0 + 0x00000003, 0x002F2C9D, 0x00302C9D, 0x002C989D, 0x00000002, 0x002F5684, + 0x002F2C84, 0x00000002, 0x402F7A20, 0xAE603202, 0x00000002, 0x002F7A88, + 0xAE603202, 0x00000002, 0x402F7A20, 0xAE604102, 0x00000002, 0x002F7A88, + 0xAE604102, 0x00000002, 0x402F7A20, 0xAE605202, 0x00000002, 0x002F7A88, + 0xAE605202, 0x00000002, 0x402F7A20, 0xACA05602, 0x00000002, 0x002F7A88, + 0xACA05602, 0x00000002, 0x002F7A84, 0xA0006104, 0x00000002, 0x002F7A8A, + 0xA0006104, 0x00000002, 0x402F7A20, 0xAE606502, 0x00000002, 0x002F7A88, + 0xAE606502, 0x00000002, 0x402F7A20, 0xAE606702, 0x00000002, 0x002F7A88, + 0xAE606702, 0x00000002, 0x402F7A20, 0xADC07002, 0x00000002, 0x002F7A88, + 0xADC07002, 0x00000003, 0x402F7A20, 0xADC07002, 0xAE605B02, 0x00000003, + 0x002F7A88, 0xADC07002, 0xAE605B02, 0x00000002, + // Block 60, offset 0xf00 + 0x402F7A20, 0xADC07B02, 0x00000002, 0x002F7A88, 0xADC07B02, 0x00000002, + 0x002F7A84, 0xA0013A04, 0x00000002, 0x002F7A8A, 0xA0013A04, 0x00000003, + 0x002F7A9C, 0x002BDE9C, 0x002C629C, 0x00000005, 0x002F7A9C, 0x002BDE9C, + 0x002C629C, 0x0009569C, 0x002FE69C, 0x00000006, 0x002F7A9C, 0x002BDE9C, + 0x002C629C, 0x0009569C, 0x002FE69C, 0x0029D09C, 0x00000002, 0x402FE620, + 0xAE603202, 0x00000002, 0x002FE688, 0xAE603202, 0x00000003, 0x402FE620, + 0xAE603202, 0xAE605202, 0x00000003, 0x002FE688, 0xAE603202, 0xAE605202, + 0x00000002, 0x402FE620, 0xAE603C02, 0x00000002, 0x002FE688, 0xAE603C02, + 0x00000002, 0x402FE620, 0xAE604102, 0x00000002, 0x002FE688, 0xAE604102, + 0x00000003, 0x402FE620, 0xAE604102, 0xAE605202, 0x00000003, 0x002FE688, + 0xAE604102, 0xAE605202, 0x00000002, 0x402FE620, + // Block 61, offset 0xf40 + 0xAE605202, 0x00000002, 0x002FE688, 0xAE605202, 0x00000002, 0x402FE620, + 0xACA05602, 0x00000002, 0x002FE688, 0xACA05602, 0x00000002, 0x002FE684, + 0xA0006104, 0x00000002, 0x002FE68A, 0xA0006104, 0x00000002, 0x402FE620, + 0xADC07002, 0x00000002, 0x002FE688, 0xADC07002, 0x00000003, 0x402FE620, + 0xADC07002, 0xAE605202, 0x00000003, 0x002FE688, 0xADC07002, 0xAE605202, + 0x00000002, 0x402FE620, 0xADC07702, 0x00000002, 0x002FE688, 0xADC07702, + 0x00000002, 0x002FE684, 0xA0013A04, 0x00000002, 0x84E617F3, 0xAE613A04, + 0x00000002, 0x002FE684, 0xA0013A04, 0x00000002, 0x002FE68A, 0xA0013A04, + 0x00000003, 0x002FE684, 0xA0013A04, 0xAE605202, 0x00000002, 0x002FE69D, + 0x002BDE9D, 0x00000003, 0x002FE69D, 0x002EE29D, 0x002FE69D, 0x00000003, + 0x002FE684, 0xA0013904, 0x002FE684, 0x00000003, + // Block 62, offset 0xf80 + 0x002FE68A, 0xA0013904, 0x002FE68A, 0x00000003, 0x002FE684, 0xA0013A04, + 0x00302C84, 0x00000002, 0x40302C20, 0xAE604102, 0x00000002, 0x00302C88, + 0xAE604102, 0x00000002, 0x40302C20, 0xAE604702, 0x00000002, 0x40302C20, + 0xAE605202, 0x00000002, 0x00302C88, 0xAE605202, 0x00000002, 0x40302C20, + 0xACA05602, 0x00000002, 0x00302C88, 0xACA05602, 0x00000002, 0x40302C20, + 0xADC07002, 0x00000002, 0x00302C88, 0xADC07002, 0x00000002, 0x40302C20, + 0xADC07702, 0x00000002, 0x00302C88, 0xADC07702, 0x00000002, 0x40302C20, + 0xADC07802, 0x00000002, 0x00302C88, 0xADC07802, 0x00000002, 0x40302C20, + 0xADC07B02, 0x00000002, 0x00302C88, 0xADC07B02, 0x00000002, 0x00302C84, + 0xA0013A04, 0x00000002, 0x00302C8A, 0xA0013A04, 0x00000002, 0x00302C84, + 0x002C5684, 0x00000003, 0x00302C8A, 0x002C988A, + // Block 63, offset 0xfc0 + 0x002E228A, 0x00000003, 0x00302C84, 0xA0013904, 0x002D6884, 0x00000003, + 0x00302C9D, 0x002D689D, 0x00312A9C, 0x00000002, 0x00302C84, 0x002FE684, + 0x00000002, 0x00302C84, 0x002FE684, 0x00000002, 0x00302C84, 0x00300884, + 0x00000002, 0x00302C84, 0x00312A84, 0x00000002, 0x00302C8A, 0x00312A84, + 0x00000002, 0x40306C20, 0xAE603202, 0x00000002, 0x00306C88, 0xAE603202, + 0x00000002, 0x40306C20, 0xAE603502, 0x00000002, 0x00306C88, 0xAE603502, + 0x00000002, 0x40306C20, 0xAE603702, 0x00000002, 0x00306C88, 0xAE603702, + 0x00000002, 0x40306C20, 0xAE603C02, 0x00000002, 0x00306C88, 0xAE603C02, + 0x00000002, 0x40306C20, 0xAE604102, 0x00000002, 0x00306C88, 0xAE604102, + 0x00000002, 0x40306C20, 0xAE604302, 0x00000002, 0x00306C88, 0xAE604302, + 0x00000002, 0x40306C20, 0xAE604702, 0x00000002, + // Block 64, offset 0x1000 + 0x00306C88, 0xAE604702, 0x00000003, 0x40306C20, 0xAE604702, 0xAE603202, + 0x00000003, 0x00306C88, 0xAE604702, 0xAE603202, 0x00000003, 0x40306C20, + 0xAE604702, 0xAE603502, 0x00000003, 0x00306C88, 0xAE604702, 0xAE603502, + 0x00000003, 0x40306C20, 0xAE604702, 0xAE604102, 0x00000003, 0x00306C88, + 0xAE604702, 0xAE604102, 0x00000003, 0x40306C20, 0xAE604702, 0xAE605B02, + 0x00000003, 0x00306C88, 0xAE604702, 0xAE605B02, 0x00000002, 0x40306C20, + 0xAE604D02, 0x00000002, 0x00306C88, 0xAE604D02, 0x00000002, 0x40306C20, + 0xAE604E02, 0x00000002, 0x00306C88, 0xAE604E02, 0x00000003, 0x40306C20, + 0xAE604E02, 0xAE603202, 0x00000003, 0x00306C88, 0xAE604E02, 0xAE603202, + 0x00000002, 0x40306C20, 0xACA05902, 0x00000002, 0x00306C88, 0xACA05902, + 0x00000002, 0x40306C20, 0xAE605B02, 0x00000002, + // Block 65, offset 0x1040 + 0x00306C88, 0xAE605B02, 0x00000003, 0x40306C20, 0xAE605B02, 0xAE604702, + 0x00000003, 0x00306C88, 0xAE605B02, 0xAE604702, 0x00000002, 0x40306C20, + 0xAE606402, 0x00000002, 0x00306C88, 0xAE606402, 0x00000002, 0x40306C20, + 0xAE606502, 0x00000002, 0x00306C88, 0xAE606502, 0x00000002, 0x40306C20, + 0xAE606702, 0x00000002, 0x00306C88, 0xAE606702, 0x00000002, 0x40306C20, + 0xAD806802, 0x00000002, 0x00306C88, 0xAD806802, 0x00000003, 0x40306C20, + 0xAD806802, 0xAE603202, 0x00000003, 0x00306C88, 0xAD806802, 0xAE603202, + 0x00000003, 0x40306C20, 0xAD806802, 0xAE603502, 0x00000003, 0x00306C88, + 0xAD806802, 0xAE603502, 0x00000003, 0x40306C20, 0xAD806802, 0xAE604E02, + 0x00000003, 0x00306C88, 0xAD806802, 0xAE604E02, 0x00000003, 0x40306C20, + 0xAD806802, 0xAE606402, 0x00000003, 0x00306C88, + // Block 66, offset 0x1080 + 0xAD806802, 0xAE606402, 0x00000003, 0x40306C20, 0xAD806802, 0xADC07002, + 0x00000003, 0x00306C88, 0xAD806802, 0xADC07002, 0x00000002, 0x40306C20, + 0xADC07002, 0x00000002, 0x00306C88, 0xADC07002, 0x00000002, 0x40306C20, + 0xADC07502, 0x00000002, 0x00306C88, 0xADC07502, 0x00000002, 0x40306C20, + 0xADC07802, 0x00000002, 0x00306C88, 0xADC07802, 0x00000002, 0x40306C20, + 0xADC07A02, 0x00000002, 0x00306C88, 0xADC07A02, 0x00000003, 0x00306C9D, + 0x002F2C9D, 0x0002BA9C, 0x00000002, 0x4030BE20, 0xAE604E02, 0x00000002, + 0x0030BE88, 0xAE604E02, 0x00000002, 0x4030BE20, 0xADC07002, 0x00000002, + 0x0030BE88, 0xADC07002, 0x00000003, 0x0030BE9D, 0x0009569C, 0x002E829C, + 0x00000004, 0x0030BE84, 0x002D9A84, 0x002D9A84, 0x002D9A9F, 0x00000004, + 0x0030BE8A, 0x002D9A8A, 0x002D9A8A, 0x002D9A9F, + // Block 67, offset 0x10c0 + 0x00000002, 0x0030BE9D, 0x002FE69D, 0x00000002, 0x0030BE84, 0x00310084, + 0x00000002, 0x0030BE8A, 0x0031008A, 0x00000002, 0x4030E220, 0xAE603202, + 0x00000002, 0x0030E288, 0xAE603202, 0x00000002, 0x4030E220, 0xAE603502, + 0x00000002, 0x0030E288, 0xAE603502, 0x00000002, 0x4030E220, 0xAE603C02, + 0x00000002, 0x0030E288, 0xAE603C02, 0x00000002, 0x4030E220, 0xAE604302, + 0x00000002, 0x4030E220, 0xAE604702, 0x00000002, 0x0030E288, 0xAE604702, + 0x00000002, 0x4030E220, 0xAE605202, 0x00000002, 0x0030E288, 0xAE605202, + 0x00000002, 0x4030E220, 0xADC07002, 0x00000002, 0x0030E288, 0xADC07002, + 0x00000002, 0x0030E29D, 0x002C3A9D, 0x00000002, 0x4030F620, 0xAE604702, + 0x00000002, 0x0030F688, 0xAE604702, 0x00000002, 0x4030F620, 0xAE605202, + 0x00000002, 0x0030F688, 0xAE605202, 0x00000002, + // Block 68, offset 0x1100 + 0x40310020, 0xAE603202, 0x00000002, 0x00310088, 0xAE603202, 0x00000002, + 0x40310020, 0xAE603502, 0x00000002, 0x00310088, 0xAE603502, 0x00000002, + 0x40310020, 0xAE603C02, 0x00000002, 0x00310088, 0xAE603C02, 0x00000002, + 0x40310020, 0xAE604302, 0x00000002, 0x40310020, 0xAE604702, 0x00000002, + 0x00310088, 0xAE604702, 0x00000002, 0x40310020, 0xAE604E02, 0x00000002, + 0x00310088, 0xAE604E02, 0x00000002, 0x40310020, 0xAE605202, 0x00000002, + 0x00310088, 0xAE605202, 0x00000002, 0x40310020, 0xAE605B02, 0x00000002, + 0x00310088, 0xAE605B02, 0x00000002, 0x40310020, 0xAE606402, 0x00000002, + 0x00310088, 0xAE606402, 0x00000002, 0x40310020, 0xADC07002, 0x00000002, + 0x00310088, 0xADC07002, 0x00000002, 0x40312A20, 0xAE603202, 0x00000002, + 0x00312A88, 0xAE603202, 0x00000002, 0x40312A20, + // Block 69, offset 0x1140 + 0xAE603C02, 0x00000002, 0x00312A88, 0xAE603C02, 0x00000002, 0x40312A20, + 0xAE604102, 0x00000002, 0x00312A88, 0xAE604102, 0x00000002, 0x40312A20, + 0xAE605202, 0x00000002, 0x00312A88, 0xAE605202, 0x00000002, 0x40312A20, + 0xADC07002, 0x00000002, 0x00312A88, 0xADC07002, 0x00000002, 0x40312A20, + 0xADC07B02, 0x00000002, 0x00312A88, 0xADC07B02, 0x00000002, 0x00312A84, + 0x0030E284, 0x00000002, 0x40316420, 0xAE604102, 0x00000002, 0x00316488, + 0xAE604102, 0x00000002, 0x40325220, 0xAE602202, 0x00000002, 0x00325288, + 0xAE602202, 0x00000003, 0x40325220, 0xAE602202, 0xAE603202, 0x00000003, + 0x00325288, 0xAE602202, 0xAE603202, 0x00000004, 0x40325220, 0xAE602202, + 0xAE603202, 0xAF007F02, 0x00000004, 0x00325288, 0xAE602202, 0xAE603202, + 0xAF007F02, 0x00000003, 0x40325220, 0xAE602202, + // Block 70, offset 0x1180 + 0xAE603502, 0x00000003, 0x00325288, 0xAE602202, 0xAE603502, 0x00000004, + 0x40325220, 0xAE602202, 0xAE603502, 0xAF007F02, 0x00000004, 0x00325288, + 0xAE602202, 0xAE603502, 0xAF007F02, 0x00000003, 0x40325220, 0xAE602202, + 0xAE604502, 0x00000003, 0x00325288, 0xAE602202, 0xAE604502, 0x00000004, + 0x40325220, 0xAE602202, 0xAE604502, 0xAF007F02, 0x00000004, 0x00325288, + 0xAE602202, 0xAE604502, 0xAF007F02, 0x00000003, 0x40325220, 0xAE602202, + 0xAF007F02, 0x00000003, 0x00325288, 0xAE602202, 0xAF007F02, 0x00000002, + 0x40325220, 0xAE602A02, 0x00000002, 0x00325288, 0xAE602A02, 0x00000003, + 0x40325220, 0xAE602A02, 0xAE603202, 0x00000003, 0x00325288, 0xAE602A02, + 0xAE603202, 0x00000004, 0x40325220, 0xAE602A02, 0xAE603202, 0xAF007F02, + 0x00000004, 0x00325288, 0xAE602A02, 0xAE603202, + // Block 71, offset 0x11c0 + 0xAF007F02, 0x00000003, 0x40325220, 0xAE602A02, 0xAE603502, 0x00000003, + 0x00325288, 0xAE602A02, 0xAE603502, 0x00000004, 0x40325220, 0xAE602A02, + 0xAE603502, 0xAF007F02, 0x00000004, 0x00325288, 0xAE602A02, 0xAE603502, + 0xAF007F02, 0x00000003, 0x40325220, 0xAE602A02, 0xAE604502, 0x00000003, + 0x00325288, 0xAE602A02, 0xAE604502, 0x00000004, 0x40325220, 0xAE602A02, + 0xAE604502, 0xAF007F02, 0x00000004, 0x00325288, 0xAE602A02, 0xAE604502, + 0xAF007F02, 0x00000003, 0x40325220, 0xAE602A02, 0xAF007F02, 0x00000003, + 0x00325288, 0xAE602A02, 0xAF007F02, 0x00000002, 0x40325220, 0xAE603202, + 0x00000002, 0x00325288, 0xAE603202, 0x00000003, 0x40325220, 0xAE603202, + 0xAF007F02, 0x00000002, 0x40325220, 0xAE603502, 0x00000002, 0x00325288, + 0xAE603502, 0x00000003, 0x40325220, 0xAE603502, + // Block 72, offset 0x1200 + 0xAF007F02, 0x00000002, 0x40325220, 0xAE603702, 0x00000002, 0x00325288, + 0xAE603702, 0x00000002, 0x40325220, 0xAE604502, 0x00000003, 0x40325220, + 0xAE604502, 0xAF007F02, 0x00000002, 0x40325220, 0xAE605B02, 0x00000002, + 0x00325288, 0xAE605B02, 0x00000002, 0x40325220, 0xAF007F02, 0x00000002, + 0x00325288, 0xAF007F02, 0x00000002, 0x40325C20, 0xAE602202, 0x00000002, + 0x00325C88, 0xAE602202, 0x00000003, 0x40325C20, 0xAE602202, 0xAE603202, + 0x00000003, 0x00325C88, 0xAE602202, 0xAE603202, 0x00000003, 0x40325C20, + 0xAE602202, 0xAE603502, 0x00000003, 0x00325C88, 0xAE602202, 0xAE603502, + 0x00000002, 0x40325C20, 0xAE602A02, 0x00000002, 0x00325C88, 0xAE602A02, + 0x00000003, 0x40325C20, 0xAE602A02, 0xAE603202, 0x00000003, 0x00325C88, + 0xAE602A02, 0xAE603202, 0x00000003, 0x40325C20, + // Block 73, offset 0x1240 + 0xAE602A02, 0xAE603502, 0x00000003, 0x00325C88, 0xAE602A02, 0xAE603502, + 0x00000002, 0x40325C20, 0xAE603202, 0x00000002, 0x00325C88, 0xAE603202, + 0x00000002, 0x40325C20, 0xAE603502, 0x00000002, 0x00325C88, 0xAE603502, + 0x00000002, 0x40326820, 0xAE602202, 0x00000002, 0x00326888, 0xAE602202, + 0x00000003, 0x40326820, 0xAE602202, 0xAE603202, 0x00000003, 0x00326888, + 0xAE602202, 0xAE603202, 0x00000004, 0x40326820, 0xAE602202, 0xAE603202, + 0xAF007F02, 0x00000004, 0x00326888, 0xAE602202, 0xAE603202, 0xAF007F02, + 0x00000003, 0x40326820, 0xAE602202, 0xAE603502, 0x00000003, 0x00326888, + 0xAE602202, 0xAE603502, 0x00000004, 0x40326820, 0xAE602202, 0xAE603502, + 0xAF007F02, 0x00000004, 0x00326888, 0xAE602202, 0xAE603502, 0xAF007F02, + 0x00000003, 0x40326820, 0xAE602202, 0xAE604502, + // Block 74, offset 0x1280 + 0x00000003, 0x00326888, 0xAE602202, 0xAE604502, 0x00000004, 0x40326820, + 0xAE602202, 0xAE604502, 0xAF007F02, 0x00000004, 0x00326888, 0xAE602202, + 0xAE604502, 0xAF007F02, 0x00000003, 0x40326820, 0xAE602202, 0xAF007F02, + 0x00000003, 0x00326888, 0xAE602202, 0xAF007F02, 0x00000002, 0x40326820, + 0xAE602A02, 0x00000002, 0x00326888, 0xAE602A02, 0x00000003, 0x40326820, + 0xAE602A02, 0xAE603202, 0x00000003, 0x00326888, 0xAE602A02, 0xAE603202, + 0x00000004, 0x40326820, 0xAE602A02, 0xAE603202, 0xAF007F02, 0x00000004, + 0x00326888, 0xAE602A02, 0xAE603202, 0xAF007F02, 0x00000003, 0x40326820, + 0xAE602A02, 0xAE603502, 0x00000003, 0x00326888, 0xAE602A02, 0xAE603502, + 0x00000004, 0x40326820, 0xAE602A02, 0xAE603502, 0xAF007F02, 0x00000004, + 0x00326888, 0xAE602A02, 0xAE603502, 0xAF007F02, + // Block 75, offset 0x12c0 + 0x00000003, 0x40326820, 0xAE602A02, 0xAE604502, 0x00000003, 0x00326888, + 0xAE602A02, 0xAE604502, 0x00000004, 0x40326820, 0xAE602A02, 0xAE604502, + 0xAF007F02, 0x00000004, 0x00326888, 0xAE602A02, 0xAE604502, 0xAF007F02, + 0x00000003, 0x40326820, 0xAE602A02, 0xAF007F02, 0x00000003, 0x00326888, + 0xAE602A02, 0xAF007F02, 0x00000002, 0x40326820, 0xAE603202, 0x00000002, + 0x00326888, 0xAE603202, 0x00000003, 0x40326820, 0xAE603202, 0xAF007F02, + 0x00000002, 0x40326820, 0xAE603502, 0x00000002, 0x00326888, 0xAE603502, + 0x00000003, 0x40326820, 0xAE603502, 0xAF007F02, 0x00000002, 0x40326820, + 0xAE604502, 0x00000003, 0x40326820, 0xAE604502, 0xAF007F02, 0x00000002, + 0x40326820, 0xAF007F02, 0x00000002, 0x00326888, 0xAF007F02, 0x00000002, + 0x40326C20, 0xAE602202, 0x00000002, 0x00326C88, + // Block 76, offset 0x1300 + 0xAE602202, 0x00000003, 0x40326C20, 0xAE602202, 0xAE603202, 0x00000003, + 0x00326C88, 0xAE602202, 0xAE603202, 0x00000003, 0x40326C20, 0xAE602202, + 0xAE603502, 0x00000003, 0x00326C88, 0xAE602202, 0xAE603502, 0x00000003, + 0x40326C20, 0xAE602202, 0xAE604502, 0x00000003, 0x00326C88, 0xAE602202, + 0xAE604502, 0x00000002, 0x40326C20, 0xAE602A02, 0x00000002, 0x00326C88, + 0xAE602A02, 0x00000003, 0x40326C20, 0xAE602A02, 0xAE603202, 0x00000003, + 0x00326C88, 0xAE602A02, 0xAE603202, 0x00000003, 0x40326C20, 0xAE602A02, + 0xAE603502, 0x00000003, 0x00326C88, 0xAE602A02, 0xAE603502, 0x00000003, + 0x40326C20, 0xAE602A02, 0xAE604502, 0x00000003, 0x00326C88, 0xAE602A02, + 0xAE604502, 0x00000002, 0x40326C20, 0xAE603202, 0x00000002, 0x00326C88, + 0xAE603202, 0x00000002, 0x40326C20, 0xAE603502, + // Block 77, offset 0x1340 + 0x00000002, 0x00326C88, 0xAE603502, 0x00000002, 0x40326C20, 0xAE603702, + 0x00000002, 0x00326C88, 0xAE603702, 0x00000002, 0x40326C20, 0xAE604502, + 0x00000002, 0x40326C20, 0xAE604702, 0x00000002, 0x00326C88, 0xAE604702, + 0x00000003, 0x40326C20, 0xAE604702, 0xAE603202, 0x00000003, 0x40326C20, + 0xAE604702, 0xAE603502, 0x00000003, 0x40326C20, 0xAE604702, 0xAE604502, + 0x00000002, 0x40326C20, 0xAE605B02, 0x00000002, 0x00326C88, 0xAE605B02, + 0x00000003, 0x00327084, 0x00325284, 0x00326C84, 0x00000003, 0x0032708A, + 0x00325284, 0x00326C84, 0x00000002, 0x40327C20, 0xAE602202, 0x00000002, + 0x00327C88, 0xAE602202, 0x00000003, 0x40327C20, 0xAE602202, 0xAE603202, + 0x00000003, 0x00327C88, 0xAE602202, 0xAE603202, 0x00000003, 0x40327C20, + 0xAE602202, 0xAE603502, 0x00000003, 0x00327C88, + // Block 78, offset 0x1380 + 0xAE602202, 0xAE603502, 0x00000002, 0x40327C20, 0xAE602A02, 0x00000002, + 0x00327C88, 0xAE602A02, 0x00000003, 0x40327C20, 0xAE602A02, 0xAE603202, + 0x00000003, 0x00327C88, 0xAE602A02, 0xAE603202, 0x00000003, 0x40327C20, + 0xAE602A02, 0xAE603502, 0x00000003, 0x00327C88, 0xAE602A02, 0xAE603502, + 0x00000002, 0x40327C20, 0xAE603202, 0x00000002, 0x00327C88, 0xAE603202, + 0x00000002, 0x40327C20, 0xAE603502, 0x00000002, 0x00327C88, 0xAE603502, + 0x00000002, 0x40328820, 0xAE602202, 0x00000002, 0x40328820, 0xAE602A02, + 0x00000002, 0x00328888, 0xAE602A02, 0x00000002, 0x40329820, 0xAE602202, + 0x00000003, 0x40329820, 0xAE602202, 0xAE603202, 0x00000003, 0x40329820, + 0xAE602202, 0xAE603502, 0x00000003, 0x40329820, 0xAE602202, 0xAE604502, + 0x00000002, 0x40329820, 0xAE602A02, 0x00000002, + // Block 79, offset 0x13c0 + 0x00329888, 0xAE602A02, 0x00000003, 0x40329820, 0xAE602A02, 0xAE603202, + 0x00000003, 0x00329888, 0xAE602A02, 0xAE603202, 0x00000003, 0x40329820, + 0xAE602A02, 0xAE603502, 0x00000003, 0x00329888, 0xAE602A02, 0xAE603502, + 0x00000003, 0x40329820, 0xAE602A02, 0xAE604502, 0x00000003, 0x00329888, + 0xAE602A02, 0xAE604502, 0x00000002, 0x40329820, 0xAE603202, 0x00000002, + 0x00329888, 0xAE603202, 0x00000002, 0x40329820, 0xAE603502, 0x00000002, + 0x00329888, 0xAE603502, 0x00000002, 0x40329820, 0xAE603702, 0x00000002, + 0x00329888, 0xAE603702, 0x00000002, 0x40329820, 0xAE604502, 0x00000002, + 0x40329820, 0xAE604702, 0x00000002, 0x00329888, 0xAE604702, 0x00000003, + 0x40329820, 0xAE604702, 0xAE603202, 0x00000003, 0x40329820, 0xAE604702, + 0xAE603502, 0x00000003, 0x40329820, 0xAE604702, + // Block 80, offset 0x1400 + 0xAE604502, 0x00000002, 0x40329820, 0xAE605B02, 0x00000002, 0x00329888, + 0xAE605B02, 0x00000002, 0x4032A220, 0xAE602202, 0x00000002, 0x0032A288, + 0xAE602202, 0x00000003, 0x4032A220, 0xAE602202, 0xAE603202, 0x00000003, + 0x0032A288, 0xAE602202, 0xAE603202, 0x00000004, 0x4032A220, 0xAE602202, + 0xAE603202, 0xAF007F02, 0x00000004, 0x0032A288, 0xAE602202, 0xAE603202, + 0xAF007F02, 0x00000003, 0x4032A220, 0xAE602202, 0xAE603502, 0x00000003, + 0x0032A288, 0xAE602202, 0xAE603502, 0x00000004, 0x4032A220, 0xAE602202, + 0xAE603502, 0xAF007F02, 0x00000004, 0x0032A288, 0xAE602202, 0xAE603502, + 0xAF007F02, 0x00000003, 0x4032A220, 0xAE602202, 0xAE604502, 0x00000003, + 0x0032A288, 0xAE602202, 0xAE604502, 0x00000004, 0x4032A220, 0xAE602202, + 0xAE604502, 0xAF007F02, 0x00000004, 0x0032A288, + // Block 81, offset 0x1440 + 0xAE602202, 0xAE604502, 0xAF007F02, 0x00000003, 0x4032A220, 0xAE602202, + 0xAF007F02, 0x00000003, 0x0032A288, 0xAE602202, 0xAF007F02, 0x00000002, + 0x4032A220, 0xAE602A02, 0x00000002, 0x0032A288, 0xAE602A02, 0x00000003, + 0x4032A220, 0xAE602A02, 0xAE603202, 0x00000003, 0x0032A288, 0xAE602A02, + 0xAE603202, 0x00000004, 0x4032A220, 0xAE602A02, 0xAE603202, 0xAF007F02, + 0x00000004, 0x0032A288, 0xAE602A02, 0xAE603202, 0xAF007F02, 0x00000003, + 0x4032A220, 0xAE602A02, 0xAE603502, 0x00000003, 0x0032A288, 0xAE602A02, + 0xAE603502, 0x00000004, 0x4032A220, 0xAE602A02, 0xAE603502, 0xAF007F02, + 0x00000004, 0x0032A288, 0xAE602A02, 0xAE603502, 0xAF007F02, 0x00000003, + 0x4032A220, 0xAE602A02, 0xAE604502, 0x00000003, 0x0032A288, 0xAE602A02, + 0xAE604502, 0x00000004, 0x4032A220, 0xAE602A02, + // Block 82, offset 0x1480 + 0xAE604502, 0xAF007F02, 0x00000004, 0x0032A288, 0xAE602A02, 0xAE604502, + 0xAF007F02, 0x00000003, 0x4032A220, 0xAE602A02, 0xAF007F02, 0x00000003, + 0x0032A288, 0xAE602A02, 0xAF007F02, 0x00000002, 0x4032A220, 0xAE603202, + 0x00000002, 0x0032A288, 0xAE603202, 0x00000003, 0x4032A220, 0xAE603202, + 0xAF007F02, 0x00000002, 0x4032A220, 0xAE603502, 0x00000002, 0x0032A288, + 0xAE603502, 0x00000003, 0x4032A220, 0xAE603502, 0xAF007F02, 0x00000002, + 0x4032A220, 0xAE604502, 0x00000003, 0x4032A220, 0xAE604502, 0xAF007F02, + 0x00000002, 0x4032A220, 0xAF007F02, 0x00000002, 0x0032A288, 0xAF007F02, + 0x00000003, 0x0032C084, 0x0032AA84, 0x0032BE84, 0x00000002, 0x00336284, + 0xA0013A04, 0x00000002, 0x0033628A, 0xA0013A04, 0x00000002, 0x4033B220, + 0xAE603502, 0x00000002, 0x0033B288, 0xAE603502, + // Block 83, offset 0x14c0 + 0x00000002, 0x4033B220, 0xAE604702, 0x00000002, 0x0033B288, 0xAE604702, + 0x00000002, 0x4033CA20, 0xAE603702, 0x00000002, 0x0033CA88, 0xAE603702, + 0x00000002, 0x40341420, 0xAE603502, 0x00000002, 0x00341488, 0xAE603502, + 0x00000002, 0x40341420, 0xAE605B02, 0x00000002, 0x00341488, 0xAE605B02, + 0x00000002, 0x84E61A9D, 0x84E61AA6, 0x00000002, 0x40357220, 0xAE605B02, + 0x00000002, 0x00357288, 0xAE605B02, 0x00000002, 0x40389020, 0xA1108C02, + 0x00000002, 0x40389020, 0xA1208D02, 0x00000002, 0x40389020, 0xA1509202, + 0x00000002, 0x40389220, 0xA1509202, 0x00000002, 0x40389220, 0xA1709502, + 0x00000002, 0x40389420, 0xA1509202, 0x00000002, 0x40389620, 0xA1509202, + 0x00000002, 0x40389820, 0xA1509202, 0x00000002, 0x40389A20, 0xA1308E02, + 0x00000002, 0x40389A20, 0xA1509202, 0x00000002, + // Block 84, offset 0x1500 + 0x00389A84, 0x00389A84, 0x00000002, 0x00389A84, 0x0038A284, 0x00000002, + 0x40389C20, 0xA1509202, 0x00000002, 0x4038A020, 0xA1509202, 0x00000002, + 0x4038A220, 0xA0E08902, 0x00000002, 0x4038A220, 0xA1509202, 0x00000002, + 0x0038A284, 0x0038A284, 0x00000003, 0x0038A284, 0x0038A284, 0xA1108C02, + 0x00000002, 0x4038A420, 0xA1509202, 0x00000002, 0x0038A499, 0xA1509202, + 0x00000002, 0x4038A420, 0xA1709502, 0x00000002, 0x4038A620, 0xA1509202, + 0x00000002, 0x4038A820, 0xA1509202, 0x00000002, 0x4038AA20, 0xA1509202, + 0x00000002, 0x4038AC20, 0xA1509202, 0x00000002, 0x4038B020, 0xA1509202, + 0x00000002, 0x0038B099, 0xA1509202, 0x00000002, 0x4038B020, 0xA1709502, + 0x00000002, 0x4038B220, 0xA1509202, 0x00000002, 0x4038B420, 0xA1509202, + 0x00000002, 0x4038B620, 0xA1509202, 0x00000002, + // Block 85, offset 0x1540 + 0x4038B820, 0xA1909002, 0x00000002, 0x4038B820, 0xA1809102, 0x00000002, + 0x4038B820, 0xA1509202, 0x00000003, 0x4038B820, 0xA1509202, 0xA1909002, + 0x00000003, 0x4038B820, 0xA1509202, 0xA1809102, 0x00000002, 0x4038BA20, + 0xA1509202, 0x00000002, 0x00391C84, 0xA0013A04, 0x00000002, 0x00393099, + 0x00393899, 0x00000002, 0x0039309A, 0x0039389A, 0x00000002, 0x00393097, + 0x00396497, 0x00000002, 0x0039309A, 0x0039649A, 0x00000002, 0x00393097, + 0x00397297, 0x00000002, 0x0039309A, 0x0039729A, 0x00000002, 0x00393097, + 0x00397497, 0x00000002, 0x00393099, 0x0039A499, 0x00000002, 0x00393099, + 0x0039A699, 0x00000002, 0x00393097, 0x003A4E97, 0x00000002, 0x00393098, + 0x003A4E98, 0x00000002, 0x00393099, 0x003A4E99, 0x00000002, 0x0039309A, + 0x003A4E9A, 0x00000002, 0x00393099, 0x003A5699, + // Block 86, offset 0x1580 + 0x00000002, 0x00393097, 0x003A6897, 0x00000002, 0x00393098, 0x003A6898, + 0x00000002, 0x00393099, 0x003A7299, 0x00000002, 0x0039309A, 0x003A729A, + 0x00000002, 0x00393099, 0x003A7499, 0x00000002, 0x0039309A, 0x003A749A, + 0x00000002, 0x00393099, 0x003A7A99, 0x00000002, 0x0039309A, 0x003A7A9A, + 0x00000002, 0x00393099, 0x003A7C99, 0x00000002, 0x0039309A, 0x003A7C9A, + 0x00000002, 0x00393099, 0x003A7E99, 0x00000002, 0x0039309A, 0x003A7E9A, + 0x00000002, 0x00393097, 0x003A8E97, 0x00000002, 0x00393099, 0x003A8E99, + 0x00000002, 0x00393099, 0x003A8E99, 0x00000002, 0x0039309A, 0x003A8E9A, + 0x00000002, 0x0039309A, 0x003A8E9A, 0x00000002, 0x00393099, 0x003A9099, + 0x00000002, 0x0039309A, 0x003A909A, 0x00000002, 0x00393097, 0x003A9897, + 0x00000002, 0x00393099, 0x003A9899, 0x00000002, + // Block 87, offset 0x15c0 + 0x0039309A, 0x003A989A, 0x00000004, 0x0039389A, 0x003A1A9A, 0x00393C9A, + 0x0039A49A, 0x00000004, 0x0039389A, 0x003A409A, 0x003A409A, 0x003A689A, + 0x00000003, 0x00393C99, 0x00397299, 0x003A9099, 0x00000003, 0x00393C99, + 0x00397499, 0x003A9099, 0x00000003, 0x00395697, 0x00396497, 0x003A4E97, + 0x00000003, 0x00395699, 0x00396499, 0x003A8E99, 0x00000003, 0x00395699, + 0x00396499, 0x003A9099, 0x00000003, 0x00395697, 0x00397297, 0x00396497, + 0x00000003, 0x00395699, 0x00397299, 0x00396499, 0x00000003, 0x00395697, + 0x00397297, 0x003A4E97, 0x00000003, 0x00395697, 0x00397497, 0x003A4E97, + 0x00000003, 0x00395699, 0x00397499, 0x003A8E99, 0x00000003, 0x00395699, + 0x00397499, 0x003A9099, 0x00000003, 0x00395697, 0x003A4E97, 0x00396497, + 0x00000003, 0x00395697, 0x003A4E97, 0x00397297, + // Block 88, offset 0x1600 + 0x00000003, 0x00395697, 0x003A4E97, 0x00397497, 0x00000003, 0x00395699, + 0x003A4E99, 0x003A8E99, 0x00000003, 0x00395699, 0x003A4E99, 0x003A9099, + 0x00000003, 0x00396499, 0x00397299, 0x003A8E99, 0x00000003, 0x00396499, + 0x00397299, 0x003A9099, 0x00000008, 0x0039649A, 0x003A409A, 0x0002129A, + 0x0039649A, 0x003A409A, 0x0039389A, 0x003A409A, 0x003A689A, 0x00000003, + 0x00396497, 0x003A4E97, 0x00397297, 0x00000003, 0x00396499, 0x003A4E99, + 0x00397299, 0x00000003, 0x00396499, 0x003A4E99, 0x003A8E99, 0x00000003, + 0x00396499, 0x003A4E99, 0x003A9099, 0x00000003, 0x00397299, 0x00396499, + 0x003A9099, 0x00000003, 0x00397299, 0x003A4E99, 0x003A8E99, 0x00000003, + 0x00397299, 0x003A4E99, 0x003A9099, 0x00000004, 0x0039A49A, 0x0039C69A, + 0x003A749A, 0x003A409A, 0x00000003, 0x0039C697, + // Block 89, offset 0x1640 + 0x00396497, 0x00397297, 0x00000003, 0x0039C699, 0x00396499, 0x003A8E99, + 0x00000003, 0x0039C697, 0x00397297, 0x00396497, 0x00000003, 0x0039C699, + 0x00397499, 0x003A8E99, 0x00000003, 0x0039C699, 0x00397499, 0x003A9099, + 0x00000003, 0x0039C697, 0x003A4E97, 0x00396497, 0x00000003, 0x0039C697, + 0x003A4E97, 0x00397297, 0x00000003, 0x0039C699, 0x003A4E99, 0x00397299, + 0x00000003, 0x0039C697, 0x003A4E97, 0x003A4E97, 0x00000003, 0x0039C699, + 0x003A4E99, 0x003A4E99, 0x00000003, 0x0039C899, 0x00396499, 0x003A9099, + 0x00000003, 0x0039C897, 0x00397297, 0x003A4E97, 0x00000003, 0x0039C899, + 0x00397299, 0x003A4E99, 0x00000003, 0x0039C899, 0x00397299, 0x003A9099, + 0x00000003, 0x0039C897, 0x003A4E97, 0x00397497, 0x00000003, 0x0039C899, + 0x003A4E99, 0x00397499, 0x00000003, 0x0039C897, + // Block 90, offset 0x1680 + 0x003A4E97, 0x003A4E97, 0x00000003, 0x0039C899, 0x003A4E99, 0x003A4E99, + 0x00000003, 0x0039DC97, 0x00397297, 0x00397297, 0x00000003, 0x0039DC99, + 0x00397299, 0x00397299, 0x00000003, 0x0039DC99, 0x00397299, 0x003A9099, + 0x00000004, 0x0039DC9A, 0x003A409A, 0x0039EE9A, 0x003A4E9A, 0x00000003, + 0x0039DC9A, 0x003A409A, 0x003A8E9A, 0x00000012, 0x0039DC9A, 0x003A409A, + 0x003A8E9A, 0x0002129A, 0x0039389A, 0x003A409A, 0x003A409A, 0x003A689A, + 0x0002129A, 0x0039EE9A, 0x003A409A, 0x003A909A, 0x003A689A, 0x0002129A, + 0x003A749A, 0x0039C69A, 0x003A409A, 0x003A4E9A, 0x00000003, 0x0039DC9A, + 0x003A409A, 0x003AAA9A, 0x00000003, 0x0039DC97, 0x003A4E97, 0x003A4E97, + 0x00000003, 0x0039DC99, 0x003A4E99, 0x003A4E99, 0x00000003, 0x0039DE99, + 0x00397299, 0x003A8E99, 0x00000003, 0x0039DE99, + // Block 91, offset 0x16c0 + 0x00397299, 0x003A9099, 0x00000003, 0x0039DE97, 0x00397497, 0x003A4E97, + 0x00000003, 0x0039DE99, 0x00397499, 0x003A4E99, 0x00000003, 0x0039E697, + 0x003A4E97, 0x00397297, 0x00000003, 0x0039E699, 0x003A4E99, 0x00397299, + 0x00000003, 0x0039E697, 0x003A4E97, 0x003A4E97, 0x00000003, 0x0039E699, + 0x003A4E99, 0x003A9099, 0x00000003, 0x0039EE97, 0x00396497, 0x003A4E97, + 0x00000003, 0x0039EE99, 0x00396499, 0x003A4E99, 0x00000004, 0x0039EE9A, + 0x003A409A, 0x003A909A, 0x003A689A, 0x00000003, 0x0039EE97, 0x003A4E97, + 0x003A4E97, 0x00000003, 0x0039EE99, 0x003A4E99, 0x003A4E99, 0x00000003, + 0x0039EE99, 0x003A4E99, 0x003A8E99, 0x00000003, 0x0039EE99, 0x003A4E99, + 0x003A9099, 0x00000003, 0x0039F099, 0x003A4E99, 0x003A4E99, 0x00000003, + 0x0039F099, 0x003A4E99, 0x003A8E99, 0x00000003, + // Block 92, offset 0x1700 + 0x0039F099, 0x003A4E99, 0x003A9099, 0x00000003, 0x0039FC97, 0x00397497, + 0x003A4E97, 0x00000003, 0x0039FC99, 0x00397499, 0x003A4E99, 0x00000003, + 0x0039FC99, 0x003A4E99, 0x003A9099, 0x00000003, 0x003A129A, 0x003A409A, + 0x003AAA9A, 0x00000003, 0x003A1297, 0x003A4E97, 0x00397297, 0x00000003, + 0x003A1299, 0x003A4E99, 0x00397299, 0x00000003, 0x003A1299, 0x003A4E99, + 0x003A4E99, 0x00000003, 0x003A1299, 0x003A4E99, 0x003A9099, 0x00000003, + 0x003A1A97, 0x003A4E97, 0x003A4E97, 0x00000003, 0x003A1A99, 0x003A4E99, + 0x003A4E99, 0x00000003, 0x003A1A99, 0x003A4E99, 0x003A9099, 0x00000002, + 0x003A4099, 0x00391E99, 0x00000002, 0x003A409A, 0x00391E9A, 0x00000002, + 0x003A4099, 0x00392099, 0x00000002, 0x003A409A, 0x0039209A, 0x00000002, + 0x003A4099, 0x00392899, 0x00000002, 0x003A409A, + // Block 93, offset 0x1740 + 0x0039289A, 0x00000003, 0x003A4097, 0x00396497, 0x00396497, 0x00000003, + 0x003A4099, 0x00396499, 0x00396499, 0x00000003, 0x003A4097, 0x00396497, + 0x003A4E97, 0x00000003, 0x003A4099, 0x00396499, 0x003A4E99, 0x00000003, + 0x003A4099, 0x00396499, 0x003A9099, 0x00000003, 0x003A4097, 0x00397297, + 0x003A4E97, 0x00000003, 0x003A4099, 0x00397299, 0x003A4E99, 0x00000003, + 0x003A4099, 0x00397299, 0x003A8E99, 0x00000003, 0x003A4099, 0x00397299, + 0x003A9099, 0x00000003, 0x003A4097, 0x00397497, 0x003A4E97, 0x00000003, + 0x003A4099, 0x00397499, 0x003A4E99, 0x00000003, 0x003A4097, 0x003A4E97, + 0x00397297, 0x00000003, 0x003A4099, 0x003A4E99, 0x00397299, 0x00000003, + 0x003A4099, 0x003A4E99, 0x003A9099, 0x00000002, 0x003A4E84, 0xA0013A04, + 0x00000003, 0x003A4E97, 0x00396497, 0x00397297, + // Block 94, offset 0x1780 + 0x00000003, 0x003A4E97, 0x00396497, 0x00397497, 0x00000003, 0x003A4E97, + 0x00396497, 0x003A4E97, 0x00000003, 0x003A4E99, 0x00396499, 0x003A9099, + 0x00000003, 0x003A4E97, 0x00397297, 0x00396497, 0x00000003, 0x003A4E97, + 0x00397297, 0x003A4E97, 0x00000004, 0x003A4E9A, 0x0039729A, 0x003A4E9A, + 0x0039889A, 0x00000003, 0x003A4E99, 0x00397299, 0x003A9099, 0x00000003, + 0x003A4E97, 0x00397497, 0x00396497, 0x00000003, 0x003A4E97, 0x00397497, + 0x003A4E97, 0x00000003, 0x003A4E99, 0x00397499, 0x003A9099, 0x00000003, + 0x003A4E99, 0x003A4E99, 0x003A9099, 0x00000003, 0x003A5697, 0x00396497, + 0x00397297, 0x00000003, 0x003A5699, 0x00396499, 0x00397299, 0x00000003, + 0x003A5697, 0x00396497, 0x003A4E97, 0x00000003, 0x003A5699, 0x00396499, + 0x003A4E99, 0x00000003, 0x003A5699, 0x00396499, + // Block 95, offset 0x17c0 + 0x003A8E99, 0x00000003, 0x003A5699, 0x00396499, 0x003A9099, 0x00000003, + 0x003A5697, 0x00397297, 0x003A4E97, 0x00000003, 0x003A5699, 0x00397299, + 0x003A8E99, 0x00000003, 0x003A5699, 0x00397299, 0x003A9099, 0x00000003, + 0x003A5699, 0x003A4E99, 0x003A8E99, 0x00000003, 0x003A5699, 0x003A4E99, + 0x003A9099, 0x00000003, 0x003A6897, 0x003A4E97, 0x00396497, 0x00000003, + 0x003A6897, 0x003A4E97, 0x003A4E97, 0x00000002, 0x403A6C20, 0xAE60BE02, + 0x00000002, 0x403A7220, 0xAE60BE02, 0x00000004, 0x003A749A, 0x0039C69A, + 0x003A409A, 0x003A4E9A, 0x00000003, 0x003A9099, 0x00396499, 0x003A9099, + 0x00000003, 0x003A9099, 0x00397299, 0x003A9099, 0x00000003, 0x003A9097, + 0x003A4E97, 0x003A4E97, 0x00000003, 0x003A9099, 0x003A4E99, 0x003A4E99, + 0x00000003, 0x003A9099, 0x003A4E99, 0x003A9099, + // Block 96, offset 0x1800 + 0x00000002, 0x403AAA20, 0xAE60BE02, 0x00000002, 0x003AB284, 0xA0013C04, + 0x00000002, 0x003AB484, 0xA0013A04, 0x00000002, 0x003AB484, 0xA0013C04, + 0x00000002, 0x003AB884, 0xA0013C04, 0x00000002, 0x003AC484, 0xA0013A04, + 0x00000002, 0x003AD884, 0xA0013A04, 0x00000002, 0x003B9484, 0xA0013904, + 0x00000002, 0x003B9684, 0xA0013904, 0x00000002, 0x003B9A84, 0xA0013904, + 0x00000002, 0x403FEC20, 0xA070F102, 0x00000002, 0x403FEE20, 0xA070F102, + 0x00000002, 0x403FF020, 0xA070F102, 0x00000002, 0x403FFC20, 0xA070F102, + 0x00000002, 0x40400A20, 0xA070F102, 0x00000002, 0x40400E20, 0xA070F102, + 0x00000002, 0x40401A20, 0xA070F102, 0x00000002, 0x40401E20, 0xA070F102, + 0x00000002, 0x40402820, 0xA070F102, 0x00000002, 0x40402C20, 0xA070F102, + 0x00000002, 0x40403020, 0xA070F102, 0x00000002, + // Block 97, offset 0x1840 + 0x4040B020, 0xA070F102, 0x00000002, 0x4040B220, 0xA070F102, 0x00000002, + 0x0040B684, 0x0040F884, 0x00000002, 0x4040CA20, 0xA070F102, 0x00000002, + 0x40411620, 0xA070F102, 0x00000002, 0x40411E20, 0xA070F102, 0x00000002, + 0x40412020, 0xA070F102, 0x00000002, 0x40412A20, 0xA070F102, 0x00000002, + 0x40414620, 0xA070F102, 0x00000002, 0x40415420, 0xA070F102, 0x00000002, + 0x40422A20, 0xA070F102, 0x00000002, 0x40422C20, 0xA070F102, 0x00000002, + 0x00442284, 0x00449084, 0x00000002, 0x00443E84, 0x00449084, 0x00000002, + 0x00444884, 0x00449084, 0x00000002, 0x00445884, 0x00449084, 0x00000002, + 0x00445884, 0x00449084, 0x00000002, 0x00445A84, 0x00449084, 0x00000002, + 0x00446684, 0x00449084, 0x00000002, 0x4046AA20, 0xA070F102, 0x00000002, + 0x4046AC20, 0xA070F102, 0x00000002, 0x4046BE20, + // Block 98, offset 0x1880 + 0xA070F102, 0x00000002, 0x40491020, 0x40498420, 0x00000002, 0x40491020, + 0x40498620, 0x00000002, 0x40491020, 0x40498820, 0x00000002, 0x40491020, + 0x40498A20, 0x00000002, 0x40491020, 0x40498C20, 0x00000002, 0x40491220, + 0x40498420, 0x00000002, 0x40491220, 0x40498620, 0x00000002, 0x40491220, + 0x40498820, 0x00000002, 0x40491220, 0x40498A20, 0x00000002, 0x40491220, + 0x40498C20, 0x00000002, 0x40491420, 0x40498420, 0x00000002, 0x40491420, + 0x40498620, 0x00000002, 0x40491420, 0x40498820, 0x00000002, 0x40491420, + 0x40498A20, 0x00000002, 0x40491420, 0x40498C20, 0x00000002, 0x40491620, + 0x40498420, 0x00000002, 0x40491620, 0x40498620, 0x00000002, 0x40491620, + 0x40498820, 0x00000002, 0x40491620, 0x40498A20, 0x00000002, 0x40491620, + 0x40498C20, 0x00000002, 0x40491820, 0x40498420, + // Block 99, offset 0x18c0 + 0x00000002, 0x40491820, 0x40498620, 0x00000002, 0x40491820, 0x40498820, + 0x00000002, 0x40491820, 0x40498A20, 0x00000002, 0x40491820, 0x40498C20, + 0x00000002, 0x40491A20, 0x40498420, 0x00000002, 0x40491A20, 0x40498620, + 0x00000002, 0x40491A20, 0x40498820, 0x00000002, 0x40491A20, 0x40498A20, + 0x00000002, 0x40491A20, 0x40498C20, 0x00000002, 0x40491C20, 0x40498420, + 0x00000002, 0x40491C20, 0x40498620, 0x00000002, 0x40491C20, 0x40498820, + 0x00000002, 0x40491C20, 0x40498A20, 0x00000002, 0x40491C20, 0x40498C20, + 0x00000002, 0x40491E20, 0x40498420, 0x00000002, 0x40491E20, 0x40498620, + 0x00000002, 0x40491E20, 0x40498820, 0x00000002, 0x40491E20, 0x40498A20, + 0x00000002, 0x40491E20, 0x40498C20, 0x00000002, 0x40492020, 0x40498420, + 0x00000002, 0x40492020, 0x40498620, 0x00000002, + // Block 100, offset 0x1900 + 0x40492020, 0x40498820, 0x00000002, 0x40492020, 0x40498A20, 0x00000002, + 0x40492020, 0x40498C20, 0x00000002, 0x40492220, 0x40498420, 0x00000002, + 0x40492220, 0x40498620, 0x00000002, 0x40492220, 0x40498820, 0x00000002, + 0x40492220, 0x40498A20, 0x00000002, 0x40492220, 0x40498C20, 0x00000002, + 0x40492420, 0x40498420, 0x00000002, 0x40492420, 0x40498620, 0x00000002, + 0x40492420, 0x40498820, 0x00000002, 0x40492420, 0x40498A20, 0x00000002, + 0x40492420, 0x40498C20, 0x00000002, 0x40492620, 0x40498420, 0x00000002, + 0x40492620, 0x40498620, 0x00000002, 0x40492620, 0x40498820, 0x00000002, + 0x40492620, 0x40498A20, 0x00000002, 0x40492620, 0x40498C20, 0x00000002, + 0x40492820, 0x40498420, 0x00000002, 0x40492820, 0x40498620, 0x00000002, + 0x40492820, 0x40498820, 0x00000002, 0x40492820, + // Block 101, offset 0x1940 + 0x40498A20, 0x00000002, 0x40492820, 0x40498C20, 0x00000002, 0x40492A20, + 0x40498420, 0x00000002, 0x40492A20, 0x40498620, 0x00000002, 0x40492A20, + 0x40498820, 0x00000002, 0x40492A20, 0x40498A20, 0x00000002, 0x40492A20, + 0x40498C20, 0x00000002, 0x40492C20, 0x40498420, 0x00000002, 0x40492C20, + 0x40498620, 0x00000002, 0x40492C20, 0x40498820, 0x00000002, 0x40492C20, + 0x40498A20, 0x00000002, 0x40492C20, 0x40498C20, 0x00000002, 0x40492E20, + 0x40498420, 0x00000002, 0x40492E20, 0x40498620, 0x00000002, 0x40492E20, + 0x40498820, 0x00000002, 0x40492E20, 0x40498A20, 0x00000002, 0x40492E20, + 0x40498C20, 0x00000002, 0x40493020, 0x40498420, 0x00000002, 0x40493020, + 0x40498620, 0x00000002, 0x40493020, 0x40498820, 0x00000002, 0x40493020, + 0x40498A20, 0x00000002, 0x40493020, 0x40498C20, + // Block 102, offset 0x1980 + 0x00000002, 0x40493220, 0x40498420, 0x00000002, 0x40493220, 0x40498620, + 0x00000002, 0x40493220, 0x40498820, 0x00000002, 0x40493220, 0x40498A20, + 0x00000002, 0x40493220, 0x40498C20, 0x00000002, 0x40493420, 0x40498420, + 0x00000002, 0x40493420, 0x40498620, 0x00000002, 0x40493420, 0x40498820, + 0x00000002, 0x40493420, 0x40498A20, 0x00000002, 0x40493420, 0x40498C20, + 0x00000002, 0x40493620, 0x40498420, 0x00000002, 0x40493620, 0x40498620, + 0x00000002, 0x40493620, 0x40498820, 0x00000002, 0x40493620, 0x40498A20, + 0x00000002, 0x40493620, 0x40498C20, 0x00000002, 0x40493820, 0x40498420, + 0x00000002, 0x40493820, 0x40498620, 0x00000002, 0x40493820, 0x40498820, + 0x00000002, 0x40493820, 0x40498A20, 0x00000002, 0x40493820, 0x40498C20, + 0x00000002, 0x40493A20, 0x40498420, 0x00000002, + // Block 103, offset 0x19c0 + 0x40493A20, 0x40498620, 0x00000002, 0x40493A20, 0x40498820, 0x00000002, + 0x40493A20, 0x40498A20, 0x00000002, 0x40493A20, 0x40498C20, 0x00000002, + 0x40493C20, 0x40498420, 0x00000002, 0x40493C20, 0x40498620, 0x00000002, + 0x40493C20, 0x40498820, 0x00000002, 0x40493C20, 0x40498A20, 0x00000002, + 0x40493C20, 0x40498C20, 0x00000002, 0x40493E20, 0x40498420, 0x00000002, + 0x40493E20, 0x40498620, 0x00000002, 0x40493E20, 0x40498820, 0x00000002, + 0x40493E20, 0x40498A20, 0x00000002, 0x40493E20, 0x40498C20, 0x00000002, + 0x40494020, 0x40498420, 0x00000002, 0x40494020, 0x40498620, 0x00000002, + 0x40494020, 0x40498820, 0x00000002, 0x40494020, 0x40498A20, 0x00000002, + 0x40494020, 0x40498C20, 0x00000002, 0x40494220, 0x40498420, 0x00000002, + 0x40494220, 0x40498620, 0x00000002, 0x40494220, + // Block 104, offset 0x1a00 + 0x40498820, 0x00000002, 0x40494220, 0x40498A20, 0x00000002, 0x40494220, + 0x40498C20, 0x00000002, 0x40494420, 0x40498420, 0x00000002, 0x40494420, + 0x40498620, 0x00000002, 0x40494420, 0x40498820, 0x00000002, 0x40494420, + 0x40498A20, 0x00000002, 0x40494420, 0x40498C20, 0x00000002, 0x40494620, + 0x40498420, 0x00000002, 0x40494620, 0x40498620, 0x00000002, 0x40494620, + 0x40498820, 0x00000002, 0x40494620, 0x40498A20, 0x00000002, 0x40494620, + 0x40498C20, 0x00000002, 0x40494820, 0x40498420, 0x00000002, 0x40494820, + 0x40498620, 0x00000002, 0x40494820, 0x40498820, 0x00000002, 0x40494820, + 0x40498A20, 0x00000002, 0x40494820, 0x40498C20, 0x00000002, 0x40494A20, + 0x40498420, 0x00000002, 0x40494A20, 0x40498620, 0x00000002, 0x40494A20, + 0x40498820, 0x00000002, 0x40494A20, 0x40498A20, + // Block 105, offset 0x1a40 + 0x00000002, 0x40494A20, 0x40498C20, 0x00000002, 0x40494C20, 0x40498420, + 0x00000002, 0x40494C20, 0x40498620, 0x00000002, 0x40494C20, 0x40498820, + 0x00000002, 0x40494C20, 0x40498A20, 0x00000002, 0x40494C20, 0x40498C20, + 0x00000002, 0x40494E20, 0x40498420, 0x00000002, 0x40494E20, 0x40498620, + 0x00000002, 0x40494E20, 0x40498820, 0x00000002, 0x40494E20, 0x40498A20, + 0x00000002, 0x40494E20, 0x40498C20, 0x00000002, 0x40495020, 0x40498420, + 0x00000002, 0x40495020, 0x40498620, 0x00000002, 0x40495020, 0x40498820, + 0x00000002, 0x40495020, 0x40498A20, 0x00000002, 0x40495020, 0x40498C20, + 0x00000002, 0x40495220, 0x40498420, 0x00000002, 0x40495220, 0x40498620, + 0x00000002, 0x40495220, 0x40498820, 0x00000002, 0x40495220, 0x40498A20, + 0x00000002, 0x40495220, 0x40498C20, 0x00000002, + // Block 106, offset 0x1a80 + 0x40495420, 0x40498420, 0x00000002, 0x40495420, 0x40498620, 0x00000002, + 0x40495420, 0x40498820, 0x00000002, 0x40495420, 0x40498A20, 0x00000002, + 0x40495420, 0x40498C20, 0x00000002, 0x40495620, 0x40498420, 0x00000002, + 0x40495620, 0x40498620, 0x00000002, 0x40495620, 0x40498820, 0x00000002, + 0x40495620, 0x40498A20, 0x00000002, 0x40495620, 0x40498C20, 0x00000002, + 0x40495820, 0x40498420, 0x00000002, 0x40495820, 0x40498620, 0x00000002, + 0x40495820, 0x40498820, 0x00000002, 0x40495820, 0x40498A20, 0x00000002, + 0x40495820, 0x40498C20, 0x00000002, 0x40495A20, 0x40498420, 0x00000002, + 0x40495A20, 0x40498620, 0x00000002, 0x40495A20, 0x40498820, 0x00000002, + 0x40495A20, 0x40498A20, 0x00000002, 0x40495A20, 0x40498C20, 0x00000002, + 0x40495C20, 0x40498420, 0x00000002, 0x40495C20, + // Block 107, offset 0x1ac0 + 0x40498620, 0x00000002, 0x40495C20, 0x40498820, 0x00000002, 0x40495C20, + 0x40498A20, 0x00000002, 0x40495C20, 0x40498C20, 0x00000002, 0x40495E20, + 0x40498420, 0x00000002, 0x40495E20, 0x40498620, 0x00000002, 0x40495E20, + 0x40498820, 0x00000002, 0x40495E20, 0x40498A20, 0x00000002, 0x40495E20, + 0x40498C20, 0x00000002, 0x40496020, 0x40498420, 0x00000002, 0x40496020, + 0x40498620, 0x00000002, 0x40496020, 0x40498820, 0x00000002, 0x40496020, + 0x40498A20, 0x00000002, 0x40496020, 0x40498C20, 0x00000002, 0x40496220, + 0x40498420, 0x00000002, 0x40496220, 0x40498620, 0x00000002, 0x40496220, + 0x40498820, 0x00000002, 0x40496220, 0x40498A20, 0x00000002, 0x40496220, + 0x40498C20, 0x00000002, 0x40496420, 0x40498420, 0x00000002, 0x40496420, + 0x40498620, 0x00000002, 0x40496420, 0x40498820, + // Block 108, offset 0x1b00 + 0x00000002, 0x40496420, 0x40498A20, 0x00000002, 0x40496420, 0x40498C20, + 0x00000002, 0x40496620, 0x40498420, 0x00000002, 0x40496620, 0x40498620, + 0x00000002, 0x40496620, 0x40498820, 0x00000002, 0x40496620, 0x40498A20, + 0x00000002, 0x40496620, 0x40498C20, 0x00000002, 0x40496820, 0x40498420, + 0x00000002, 0x40496820, 0x40498620, 0x00000002, 0x40496820, 0x40498820, + 0x00000002, 0x40496820, 0x40498A20, 0x00000002, 0x40496820, 0x40498C20, + 0x00000002, 0x40496A20, 0x40498420, 0x00000002, 0x40496A20, 0x40498620, + 0x00000002, 0x40496A20, 0x40498820, 0x00000002, 0x40496A20, 0x40498A20, + 0x00000002, 0x40496A20, 0x40498C20, 0x00000002, 0x40499020, 0x4049E620, + 0x00000002, 0x40499020, 0x4049E820, 0x00000002, 0x40499020, 0x4049EA20, + 0x00000002, 0x40499020, 0x4049EC20, 0x00000002, + // Block 109, offset 0x1b40 + 0x40499020, 0x4049EE20, 0x00000002, 0x40499220, 0x4049E620, 0x00000002, + 0x40499220, 0x4049E820, 0x00000002, 0x40499220, 0x4049EA20, 0x00000002, + 0x40499220, 0x4049EC20, 0x00000002, 0x40499220, 0x4049EE20, 0x00000002, + 0x40499420, 0x4049E620, 0x00000002, 0x40499420, 0x4049E820, 0x00000002, + 0x40499420, 0x4049EA20, 0x00000002, 0x40499420, 0x4049EC20, 0x00000002, + 0x40499420, 0x4049EE20, 0x00000002, 0x40499620, 0x4049E620, 0x00000002, + 0x40499620, 0x4049E820, 0x00000002, 0x40499620, 0x4049EA20, 0x00000002, + 0x40499620, 0x4049EC20, 0x00000002, 0x40499620, 0x4049EE20, 0x00000002, + 0x40499820, 0x4049E620, 0x00000002, 0x40499820, 0x4049E820, 0x00000002, + 0x40499820, 0x4049EA20, 0x00000002, 0x40499820, 0x4049EC20, 0x00000002, + 0x40499820, 0x4049EE20, 0x00000002, 0x40499A20, + // Block 110, offset 0x1b80 + 0x4049E620, 0x00000002, 0x40499A20, 0x4049E820, 0x00000002, 0x40499A20, + 0x4049EA20, 0x00000002, 0x40499A20, 0x4049EC20, 0x00000002, 0x40499A20, + 0x4049EE20, 0x00000002, 0x40499C20, 0x4049E620, 0x00000002, 0x40499C20, + 0x4049E820, 0x00000002, 0x40499C20, 0x4049EA20, 0x00000002, 0x40499C20, + 0x4049EC20, 0x00000002, 0x40499C20, 0x4049EE20, 0x00000002, 0x40499E20, + 0x4049E620, 0x00000002, 0x40499E20, 0x4049E820, 0x00000002, 0x40499E20, + 0x4049EA20, 0x00000002, 0x40499E20, 0x4049EC20, 0x00000002, 0x40499E20, + 0x4049EE20, 0x00000002, 0x4049A020, 0x4049E620, 0x00000002, 0x4049A020, + 0x4049E820, 0x00000002, 0x4049A020, 0x4049EA20, 0x00000002, 0x4049A020, + 0x4049EC20, 0x00000002, 0x4049A020, 0x4049EE20, 0x00000002, 0x4049A220, + 0x4049E620, 0x00000002, 0x4049A220, 0x4049E820, + // Block 111, offset 0x1bc0 + 0x00000002, 0x4049A220, 0x4049EA20, 0x00000002, 0x4049A220, 0x4049EC20, + 0x00000002, 0x4049A220, 0x4049EE20, 0x00000002, 0x4049A420, 0x4049E620, + 0x00000002, 0x4049A420, 0x4049E820, 0x00000002, 0x4049A420, 0x4049EA20, + 0x00000002, 0x4049A420, 0x4049EC20, 0x00000002, 0x4049A420, 0x4049EE20, + 0x00000002, 0x4049A620, 0x4049E620, 0x00000002, 0x4049A620, 0x4049E820, + 0x00000002, 0x4049A620, 0x4049EA20, 0x00000002, 0x4049A620, 0x4049EC20, + 0x00000002, 0x4049A620, 0x4049EE20, 0x00000002, 0x4049A820, 0x4049E620, + 0x00000002, 0x4049A820, 0x4049E820, 0x00000002, 0x4049A820, 0x4049EA20, + 0x00000002, 0x4049A820, 0x4049EC20, 0x00000002, 0x4049A820, 0x4049EE20, + 0x00000002, 0x4049AA20, 0x4049E620, 0x00000002, 0x4049AA20, 0x4049E820, + 0x00000002, 0x4049AA20, 0x4049EA20, 0x00000002, + // Block 112, offset 0x1c00 + 0x4049AA20, 0x4049EC20, 0x00000002, 0x4049AA20, 0x4049EE20, 0x00000002, + 0x4049AC20, 0x4049E620, 0x00000002, 0x4049AC20, 0x4049E820, 0x00000002, + 0x4049AC20, 0x4049EA20, 0x00000002, 0x4049AC20, 0x4049EC20, 0x00000002, + 0x4049AC20, 0x4049EE20, 0x00000002, 0x4049AE20, 0x4049E620, 0x00000002, + 0x4049AE20, 0x4049E820, 0x00000002, 0x4049AE20, 0x4049EA20, 0x00000002, + 0x4049AE20, 0x4049EC20, 0x00000002, 0x4049AE20, 0x4049EE20, 0x00000002, + 0x4049B020, 0x4049E620, 0x00000002, 0x4049B020, 0x4049E820, 0x00000002, + 0x4049B020, 0x4049EA20, 0x00000002, 0x4049B020, 0x4049EC20, 0x00000002, + 0x4049B020, 0x4049EE20, 0x00000002, 0x4049B220, 0x4049E620, 0x00000002, + 0x4049B220, 0x4049E820, 0x00000002, 0x4049B220, 0x4049EA20, 0x00000002, + 0x4049B220, 0x4049EC20, 0x00000002, 0x4049B220, + // Block 113, offset 0x1c40 + 0x4049EE20, 0x00000002, 0x4049B420, 0x4049E620, 0x00000002, 0x4049B420, + 0x4049E820, 0x00000002, 0x4049B420, 0x4049EA20, 0x00000002, 0x4049B420, + 0x4049EC20, 0x00000002, 0x4049B420, 0x4049EE20, 0x00000002, 0x4049B620, + 0x4049E620, 0x00000002, 0x4049B620, 0x4049E820, 0x00000002, 0x4049B620, + 0x4049EA20, 0x00000002, 0x4049B620, 0x4049EC20, 0x00000002, 0x4049B620, + 0x4049EE20, 0x00000002, 0x4049B820, 0x4049E620, 0x00000002, 0x4049B820, + 0x4049E820, 0x00000002, 0x4049B820, 0x4049EA20, 0x00000002, 0x4049B820, + 0x4049EC20, 0x00000002, 0x4049B820, 0x4049EE20, 0x00000002, 0x4049BA20, + 0x4049E620, 0x00000002, 0x4049BA20, 0x4049E820, 0x00000002, 0x4049BA20, + 0x4049EA20, 0x00000002, 0x4049BA20, 0x4049EC20, 0x00000002, 0x4049BA20, + 0x4049EE20, 0x00000002, 0x4049BC20, 0x4049E620, + // Block 114, offset 0x1c80 + 0x00000002, 0x4049BC20, 0x4049E820, 0x00000002, 0x4049BC20, 0x4049EA20, + 0x00000002, 0x4049BC20, 0x4049EC20, 0x00000002, 0x4049BC20, 0x4049EE20, + 0x00000002, 0x4049BE20, 0x4049E620, 0x00000002, 0x4049BE20, 0x4049E820, + 0x00000002, 0x4049BE20, 0x4049EA20, 0x00000002, 0x4049BE20, 0x4049EC20, + 0x00000002, 0x4049BE20, 0x4049EE20, 0x00000002, 0x4049C020, 0x4049E620, + 0x00000002, 0x4049C020, 0x4049E820, 0x00000002, 0x4049C020, 0x4049EA20, + 0x00000002, 0x4049C020, 0x4049EC20, 0x00000002, 0x4049C020, 0x4049EE20, + 0x00000002, 0x4049C220, 0x4049E620, 0x00000002, 0x4049C220, 0x4049E820, + 0x00000002, 0x4049C220, 0x4049EA20, 0x00000002, 0x4049C220, 0x4049EC20, + 0x00000002, 0x4049C220, 0x4049EE20, 0x00000003, 0x0049C484, 0x0049AC84, + 0x4049E620, 0x00000003, 0x0049C484, 0x0049AC84, + // Block 115, offset 0x1cc0 + 0x4049E820, 0x00000003, 0x0049C484, 0x0049AC84, 0x4049EA20, 0x00000003, + 0x0049C484, 0x0049AC84, 0x4049EC20, 0x00000003, 0x0049C484, 0x0049AC84, + 0x4049EE20, 0x00000003, 0x0049C484, 0x0049BA84, 0x4049E620, 0x00000003, + 0x0049C484, 0x0049BA84, 0x4049E820, 0x00000003, 0x0049C484, 0x0049BA84, + 0x4049EA20, 0x00000003, 0x0049C484, 0x0049BA84, 0x4049EC20, 0x00000003, + 0x0049C484, 0x0049BA84, 0x4049EE20, 0x00000002, 0x4049C420, 0x4049E620, + 0x00000002, 0x4049C420, 0x4049E820, 0x00000002, 0x4049C420, 0x4049EA20, + 0x00000002, 0x4049C420, 0x4049EC20, 0x00000002, 0x4049C420, 0x4049EE20, + 0x00000002, 0x4049C620, 0x4049E620, 0x00000002, 0x4049C620, 0x4049E820, + 0x00000002, 0x4049C620, 0x4049EA20, 0x00000002, 0x4049C620, 0x4049EC20, + 0x00000002, 0x4049C620, 0x4049EE20, 0x00000002, + // Block 116, offset 0x1d00 + 0x4049C820, 0x4049E620, 0x00000002, 0x4049C820, 0x4049E820, 0x00000002, + 0x4049C820, 0x4049EA20, 0x00000002, 0x4049C820, 0x4049EC20, 0x00000002, + 0x4049C820, 0x4049EE20, 0x00000002, 0x4049F020, 0x404A5A20, 0x00000002, + 0x4049F020, 0x404A5C20, 0x00000002, 0x4049F020, 0x404A6220, 0x00000002, + 0x4049F020, 0x404A6620, 0x00000002, 0x4049F020, 0x404A6820, 0x00000002, + 0x4049F220, 0x404A5A20, 0x00000002, 0x4049F220, 0x404A5C20, 0x00000002, + 0x4049F220, 0x404A6220, 0x00000002, 0x4049F220, 0x404A6620, 0x00000002, + 0x4049F220, 0x404A6820, 0x00000002, 0x4049F420, 0x404A5A20, 0x00000002, + 0x4049F420, 0x404A5C20, 0x00000002, 0x4049F420, 0x404A6220, 0x00000002, + 0x4049F420, 0x404A6620, 0x00000002, 0x4049F420, 0x404A6820, 0x00000002, + 0x4049F620, 0x404A5A20, 0x00000002, 0x4049F620, + // Block 117, offset 0x1d40 + 0x404A5C20, 0x00000002, 0x4049F620, 0x404A6220, 0x00000002, 0x4049F620, + 0x404A6620, 0x00000002, 0x4049F620, 0x404A6820, 0x00000002, 0x4049F820, + 0x404A5A20, 0x00000002, 0x4049F820, 0x404A5C20, 0x00000002, 0x4049F820, + 0x404A6220, 0x00000002, 0x4049F820, 0x404A6620, 0x00000002, 0x4049F820, + 0x404A6820, 0x00000002, 0x4049FA20, 0x404A5A20, 0x00000002, 0x4049FA20, + 0x404A5C20, 0x00000002, 0x4049FA20, 0x404A6220, 0x00000002, 0x4049FA20, + 0x404A6620, 0x00000002, 0x4049FA20, 0x404A6820, 0x00000002, 0x4049FC20, + 0x404A5A20, 0x00000002, 0x4049FC20, 0x404A5C20, 0x00000002, 0x4049FC20, + 0x404A6220, 0x00000002, 0x4049FC20, 0x404A6620, 0x00000002, 0x4049FC20, + 0x404A6820, 0x00000002, 0x4049FE20, 0x404A5A20, 0x00000002, 0x4049FE20, + 0x404A5C20, 0x00000002, 0x4049FE20, 0x404A6220, + // Block 118, offset 0x1d80 + 0x00000002, 0x4049FE20, 0x404A6620, 0x00000002, 0x4049FE20, 0x404A6820, + 0x00000002, 0x404A0020, 0x404A5A20, 0x00000002, 0x404A0020, 0x404A5C20, + 0x00000002, 0x404A0020, 0x404A6220, 0x00000002, 0x404A0020, 0x404A6620, + 0x00000002, 0x404A0020, 0x404A6820, 0x00000002, 0x404A0220, 0x404A5A20, + 0x00000002, 0x404A0220, 0x404A5C20, 0x00000002, 0x404A0220, 0x404A6220, + 0x00000002, 0x404A0220, 0x404A6620, 0x00000002, 0x404A0220, 0x404A6820, + 0x00000002, 0x404A0420, 0x404A5A20, 0x00000002, 0x404A0420, 0x404A5C20, + 0x00000002, 0x404A0420, 0x404A6220, 0x00000002, 0x404A0420, 0x404A6620, + 0x00000002, 0x404A0420, 0x404A6820, 0x00000002, 0x404A0620, 0x404A5A20, + 0x00000002, 0x404A0620, 0x404A5C20, 0x00000002, 0x404A0620, 0x404A6220, + 0x00000002, 0x404A0620, 0x404A6620, 0x00000002, + // Block 119, offset 0x1dc0 + 0x404A0620, 0x404A6820, 0x00000002, 0x404A0820, 0x404A5A20, 0x00000002, + 0x404A0820, 0x404A5C20, 0x00000002, 0x404A0820, 0x404A6220, 0x00000002, + 0x404A0820, 0x404A6620, 0x00000002, 0x404A0820, 0x404A6820, 0x00000002, + 0x404A0A20, 0x404A5A20, 0x00000002, 0x404A0A20, 0x404A5C20, 0x00000002, + 0x404A0A20, 0x404A6220, 0x00000002, 0x404A0A20, 0x404A6620, 0x00000002, + 0x404A0A20, 0x404A6820, 0x00000002, 0x404A0C20, 0x404A5A20, 0x00000002, + 0x404A0C20, 0x404A5C20, 0x00000002, 0x404A0C20, 0x404A6220, 0x00000002, + 0x404A0C20, 0x404A6620, 0x00000002, 0x404A0C20, 0x404A6820, 0x00000002, + 0x404A0E20, 0x404A5A20, 0x00000002, 0x404A0E20, 0x404A5C20, 0x00000002, + 0x404A0E20, 0x404A6220, 0x00000002, 0x404A0E20, 0x404A6620, 0x00000002, + 0x404A0E20, 0x404A6820, 0x00000002, 0x404A1020, + // Block 120, offset 0x1e00 + 0x404A5A20, 0x00000002, 0x404A1020, 0x404A5C20, 0x00000002, 0x404A1020, + 0x404A6220, 0x00000002, 0x404A1020, 0x404A6620, 0x00000002, 0x404A1020, + 0x404A6820, 0x00000002, 0x404A1220, 0x404A5A20, 0x00000002, 0x404A1220, + 0x404A5C20, 0x00000002, 0x404A1220, 0x404A6220, 0x00000002, 0x404A1220, + 0x404A6620, 0x00000002, 0x404A1220, 0x404A6820, 0x00000002, 0x404A1420, + 0x404A5A20, 0x00000002, 0x404A1420, 0x404A5C20, 0x00000002, 0x404A1420, + 0x404A6220, 0x00000002, 0x404A1420, 0x404A6620, 0x00000002, 0x404A1420, + 0x404A6820, 0x00000002, 0x404A1620, 0x404A5A20, 0x00000002, 0x404A1620, + 0x404A5C20, 0x00000002, 0x404A1620, 0x404A6220, 0x00000002, 0x404A1620, + 0x404A6620, 0x00000002, 0x404A1620, 0x404A6820, 0x00000002, 0x404A1820, + 0x404A5A20, 0x00000002, 0x404A1820, 0x404A5C20, + // Block 121, offset 0x1e40 + 0x00000002, 0x404A1820, 0x404A6220, 0x00000002, 0x404A1820, 0x404A6620, + 0x00000002, 0x404A1820, 0x404A6820, 0x00000002, 0x404A1A20, 0x404A5A20, + 0x00000002, 0x404A1A20, 0x404A5C20, 0x00000002, 0x404A1A20, 0x404A6220, + 0x00000002, 0x404A1A20, 0x404A6620, 0x00000002, 0x404A1A20, 0x404A6820, + 0x00000002, 0x404A1C20, 0x404A5A20, 0x00000002, 0x404A1C20, 0x404A5C20, + 0x00000002, 0x404A1C20, 0x404A6220, 0x00000002, 0x404A1C20, 0x404A6620, + 0x00000002, 0x404A1C20, 0x404A6820, 0x00000002, 0x404A1E20, 0x404A5A20, + 0x00000002, 0x404A1E20, 0x404A5C20, 0x00000002, 0x404A1E20, 0x404A6220, + 0x00000002, 0x404A1E20, 0x404A6620, 0x00000002, 0x404A1E20, 0x404A6820, + 0x00000002, 0x404A2020, 0x404A5A20, 0x00000002, 0x404A2020, 0x404A5C20, + 0x00000002, 0x404A2020, 0x404A6220, 0x00000002, + // Block 122, offset 0x1e80 + 0x404A2020, 0x404A6620, 0x00000002, 0x404A2020, 0x404A6820, 0x00000002, + 0x404A2220, 0x404A5A20, 0x00000002, 0x404A2220, 0x404A5C20, 0x00000002, + 0x404A2220, 0x404A6220, 0x00000002, 0x404A2220, 0x404A6620, 0x00000002, + 0x404A2220, 0x404A6820, 0x00000002, 0x404A2420, 0x404A5A20, 0x00000002, + 0x404A2420, 0x404A5C20, 0x00000002, 0x404A2420, 0x404A6220, 0x00000002, + 0x404A2420, 0x404A6620, 0x00000002, 0x404A2420, 0x404A6820, 0x00000002, + 0x404A2620, 0x404A5A20, 0x00000002, 0x404A2620, 0x404A5C20, 0x00000002, + 0x404A2620, 0x404A6220, 0x00000002, 0x404A2620, 0x404A6620, 0x00000002, + 0x404A2620, 0x404A6820, 0x00000002, 0x404A2820, 0x404A5A20, 0x00000002, + 0x404A2820, 0x404A5C20, 0x00000002, 0x404A2820, 0x404A6220, 0x00000002, + 0x404A2820, 0x404A6620, 0x00000002, 0x404A2820, + // Block 123, offset 0x1ec0 + 0x404A6820, 0x00000002, 0x404A2A20, 0x404A5A20, 0x00000002, 0x404A2A20, + 0x404A5C20, 0x00000002, 0x404A2A20, 0x404A6220, 0x00000002, 0x404A2A20, + 0x404A6620, 0x00000002, 0x404A2A20, 0x404A6820, 0x00000002, 0x404A2C20, + 0x404A5A20, 0x00000002, 0x404A2C20, 0x404A5C20, 0x00000002, 0x404A2C20, + 0x404A6220, 0x00000002, 0x404A2C20, 0x404A6620, 0x00000002, 0x404A2C20, + 0x404A6820, 0x00000002, 0x404A2E20, 0x404A5A20, 0x00000002, 0x404A2E20, + 0x404A5C20, 0x00000002, 0x404A2E20, 0x404A6220, 0x00000002, 0x404A2E20, + 0x404A6620, 0x00000002, 0x404A2E20, 0x404A6820, 0x00000002, 0x404A3020, + 0x404A5A20, 0x00000002, 0x404A3020, 0x404A5C20, 0x00000002, 0x404A3020, + 0x404A6220, 0x00000002, 0x404A3020, 0x404A6620, 0x00000002, 0x404A3020, + 0x404A6820, 0x00000002, 0x404A3220, 0x404A5A20, + // Block 124, offset 0x1f00 + 0x00000002, 0x404A3220, 0x404A5C20, 0x00000002, 0x404A3220, 0x404A6220, + 0x00000002, 0x404A3220, 0x404A6620, 0x00000002, 0x404A3220, 0x404A6820, + 0x00000002, 0x404A3420, 0x404A5A20, 0x00000002, 0x404A3420, 0x404A5C20, + 0x00000002, 0x404A3420, 0x404A6220, 0x00000002, 0x404A3420, 0x404A6620, + 0x00000002, 0x404A3420, 0x404A6820, 0x00000002, 0x404A3620, 0x404A5A20, + 0x00000002, 0x404A3620, 0x404A5C20, 0x00000002, 0x404A3620, 0x404A6220, + 0x00000002, 0x404A3620, 0x404A6620, 0x00000002, 0x404A3620, 0x404A6820, + 0x00000002, 0x404A3820, 0x404A5A20, 0x00000002, 0x404A3820, 0x404A5C20, + 0x00000002, 0x404A3820, 0x404A6220, 0x00000002, 0x404A3820, 0x404A6620, + 0x00000002, 0x404A3820, 0x404A6820, 0x00000002, 0x404A3A20, 0x404A5A20, + 0x00000002, 0x404A3A20, 0x404A5C20, 0x00000002, + // Block 125, offset 0x1f40 + 0x404A3A20, 0x404A6220, 0x00000002, 0x404A3A20, 0x404A6620, 0x00000002, + 0x404A3A20, 0x404A6820, 0x00000002, 0x404A3C20, 0x404A5A20, 0x00000002, + 0x404A3C20, 0x404A5C20, 0x00000002, 0x404A3C20, 0x404A6220, 0x00000002, + 0x404A3C20, 0x404A6620, 0x00000002, 0x404A3C20, 0x404A6820, 0x00000002, + 0x404A3E20, 0x404A5A20, 0x00000002, 0x404A3E20, 0x404A5C20, 0x00000002, + 0x404A3E20, 0x404A6220, 0x00000002, 0x404A3E20, 0x404A6620, 0x00000002, + 0x404A3E20, 0x404A6820, 0x00000002, 0x404A4020, 0x404A5A20, 0x00000002, + 0x404A4020, 0x404A5C20, 0x00000002, 0x404A4020, 0x404A6220, 0x00000002, + 0x404A4020, 0x404A6620, 0x00000002, 0x404A4020, 0x404A6820, 0x00000002, + 0x404A4220, 0x404A5A20, 0x00000002, 0x404A4220, 0x404A5C20, 0x00000002, + 0x404A4220, 0x404A6220, 0x00000002, 0x404A4220, + // Block 126, offset 0x1f80 + 0x404A6620, 0x00000002, 0x404A4220, 0x404A6820, 0x00000002, 0x404A4420, + 0x404A5A20, 0x00000002, 0x404A4420, 0x404A5C20, 0x00000002, 0x404A4420, + 0x404A6220, 0x00000002, 0x404A4420, 0x404A6620, 0x00000002, 0x404A4420, + 0x404A6820, 0x00000002, 0x404A4620, 0x404A5A20, 0x00000002, 0x404A4620, + 0x404A5C20, 0x00000002, 0x404A4620, 0x404A6220, 0x00000002, 0x404A4620, + 0x404A6620, 0x00000002, 0x404A4620, 0x404A6820, 0x00000002, 0x404A4820, + 0x404A5A20, 0x00000002, 0x404A4820, 0x404A5C20, 0x00000002, 0x404A4820, + 0x404A6220, 0x00000002, 0x404A4820, 0x404A6620, 0x00000002, 0x404A4820, + 0x404A6820, 0x00000002, 0x404A4A20, 0x404A5A20, 0x00000002, 0x404A4A20, + 0x404A5C20, 0x00000002, 0x404A4A20, 0x404A6220, 0x00000002, 0x404A4A20, + 0x404A6620, 0x00000002, 0x404A4A20, 0x404A6820, + // Block 127, offset 0x1fc0 + 0x00000002, 0x404A4C20, 0x404A5A20, 0x00000002, 0x404A4C20, 0x404A5C20, + 0x00000002, 0x404A4C20, 0x404A6220, 0x00000002, 0x404A4C20, 0x404A6620, + 0x00000002, 0x404A4C20, 0x404A6820, 0x00000002, 0x404A4E20, 0x404A5A20, + 0x00000002, 0x404A4E20, 0x404A5C20, 0x00000002, 0x404A4E20, 0x404A6220, + 0x00000002, 0x404A4E20, 0x404A6620, 0x00000002, 0x404A4E20, 0x404A6820, + 0x00000002, 0x404A7620, 0x404AF820, 0x00000002, 0x404A7820, 0x404AF820, + 0x00000002, 0x404A8020, 0x404B0020, 0x00000002, 0x404A8220, 0x404B0020, + 0x00000002, 0x404AA020, 0x404B0020, 0x00000002, 0x404AA220, 0x404B0020, + 0x00000002, 0x404AB020, 0x404B0020, 0x00000002, 0x404AB220, 0x404B0020, + 0x00000002, 0x404AC020, 0x404B0020, 0x00000002, 0x404AC220, 0x404B0020, + 0x00000002, 0x404AD020, 0x404B0020, 0x00000002, + // Block 128, offset 0x2000 + 0x404AD220, 0x404B0020, 0x00000002, 0x004AD684, 0xA0013A04, 0x00000002, + 0x004AE684, 0xA0013A04, 0x00000002, 0x004AE884, 0xA0013A04, 0x00000002, + 0x004AEA84, 0xA0013A04, 0x00000002, 0x404AEA20, 0x8281258D, 0x00000002, + 0x404AEA20, 0x82812591, 0x00000002, 0x404AF020, 0x8281258D, 0x00000002, + 0x404AF020, 0x82812591, 0x00000003, 0x004B0284, 0x004B3084, 0xA000F304, + 0x00000003, 0x004EA684, 0x004F1484, 0x004EA684, 0x00000002, 0x0050AE84, + 0x0050DA84, 0x00000003, 0x0050AE84, 0x0050DA84, 0x0050F084, 0x00000003, + 0x00514E84, 0x00519A84, 0x00514E84, 0x00000002, 0x005ADA84, 0xA0013904, + 0x00000002, 0x005ADC84, 0xA0013904, 0x00000002, 0x005ADC84, 0xA0013A04, + 0x00000002, 0x005ADE84, 0xA0013904, 0x00000002, 0x005ADE84, 0x005ADE84, + 0x00000002, 0x005AE084, 0xA0013904, 0x00000002, + // Block 129, offset 0x2040 + 0x005AE084, 0xA0013A04, 0x00000002, 0x005AE084, 0xA0013C04, 0x00000002, + 0x005AE084, 0xA0013D04, 0x00000002, 0x005AE884, 0xA0013904, 0x00000002, + 0x005AE884, 0xA0013A04, 0x00000002, 0x005AE884, 0xA0013C04, 0x00000002, + 0x005AE884, 0xA0013D04, 0x00000002, 0x005AEC84, 0xA0013904, 0x00000002, + 0x005AEE84, 0xA0013904, 0x00000002, 0x005AEE84, 0xA0013A04, 0x00000002, + 0x005AEE84, 0xA0013C04, 0x00000002, 0x005AF084, 0xA0013904, 0x00000002, + 0x005AF084, 0xA0013A04, 0x00000002, 0x005AF284, 0xA0013904, 0x00000002, + 0x005AF484, 0xA0013904, 0x00000002, 0x005AF684, 0xA0013904, 0x00000002, + 0x005AF684, 0x005B0884, 0x00000002, 0x005AFA84, 0xA0013904, 0x00000002, + 0x005AFE84, 0xA0013904, 0x00000002, 0x005AFE84, 0xA0013A04, 0x00000002, + 0x005AFE84, 0xA0013C04, 0x00000002, 0x005AFE84, + // Block 130, offset 0x2080 + 0xA0013D04, 0x00000002, 0x005AFE84, 0xA0013E04, 0x00000002, 0x005B0084, + 0xA0013904, 0x00000002, 0x005B0084, 0xA0013A04, 0x00000002, 0x005B0284, + 0xA0013904, 0x00000002, 0x005B0284, 0xA0013A04, 0x00000002, 0x005B0684, + 0xA0013904, 0x00000002, 0x005B0684, 0xA0013A04, 0x00000004, 0x005B0684, + 0xA0013904, 0x005B0684, 0xA0013904, 0x00000002, 0x005B0884, 0xA0013904, + 0x00000002, 0x005B0A84, 0xA0013904, 0x00000002, 0x005B2484, 0xA0013904, + 0x00000002, 0x005B2484, 0xA0013A04, 0x00000002, 0x005B2684, 0xA0013904, + 0x00000002, 0x005B2A84, 0xA0013904, 0x00000002, 0x005B3084, 0xA0013904, + 0x00000002, 0x005B3284, 0xA0013904, 0x00000002, 0x005B3484, 0xA0013904, + 0x00000002, 0x005B3684, 0xA0013904, 0x00000002, 0x005B3884, 0xA0013904, + 0x00000002, 0x005B3A84, 0xA0013904, 0x00000002, + // Block 131, offset 0x20c0 + 0x005B3E84, 0xA0013904, 0x00000002, 0x005B4084, 0xA0013904, 0x00000002, + 0x005B4284, 0xA0013904, 0x00000002, 0x005B4484, 0xA0013904, 0x00000002, + 0x005B4684, 0xA0013904, 0x00000002, 0x005B4884, 0xA0013904, 0x00000002, + 0x005B5284, 0xA0013904, 0x00000002, 0x005B5484, 0xA0013904, 0x00000002, + 0x005B5684, 0xA0013904, 0x00000002, 0x005B5884, 0xA0013904, 0x00000002, + 0x005B5C84, 0xA0013904, 0x00000002, 0x005B6484, 0xA0013904, 0x00000002, + 0x005B6684, 0xA0013904, 0x00000002, 0x005B6884, 0xA0013904, 0x00000002, + 0x005B6A84, 0xA0013904, 0x00000002, 0x005B6C84, 0xA0013904, 0x00000002, + 0x005B7484, 0xA0013904, 0x00000002, 0x005B7684, 0xA0013904, 0x00000002, + 0x005B7884, 0xA0013904, 0x00000002, 0x005B7A84, 0xA0013904, 0x00000002, + 0x005B9884, 0x005D9684, 0x00000002, 0x005BBC84, + // Block 132, offset 0x2100 + 0x005D9684, 0x00000002, 0x005BE684, 0x005D9684, 0x00000002, 0x005C0E84, + 0x005D9884, 0x00000002, 0x005C2484, 0x005D9684, 0x00000002, 0x005C3084, + 0x005D9884, 0x00000002, 0x005C3484, 0x005D9884, 0x00000002, 0x005C4084, + 0x005D9684, 0x00000002, 0x005C8A84, 0x005D9684, 0x00000002, 0x005CE884, + 0x005D9684, 0x00000002, 0x005D1684, 0x005D9684, 0x00000002, 0x005D2284, + 0x005D9884, 0x00000002, 0x005D3084, 0x005D9684, 0x00000004, 0x0062C486, + 0x0063C286, 0x0062C286, 0x0063CE86, 0x00000005, 0x0062C886, 0x0063A886, + 0x00648286, 0x0062AC86, 0x0063B886, 0x00000003, 0x0065769C, 0x0027D69C, + 0x0065CA9C, 0x00000005, 0x0065769C, 0x0065AA9C, 0xA001291C, 0x0027D69C, + 0x00659E9C, 0x00000004, 0x0065769C, 0x0065CA9C, 0x0065AE9C, 0x0065769C, + 0x00000005, 0x0065769C, 0x0065D89C, 0x0065B09C, + // Block 133, offset 0x2140 + 0xA001291C, 0x0065769C, 0x00000005, 0x0065789C, 0x0065A29C, 0x0065D89C, + 0x0065869C, 0xA001281C, 0x00000003, 0x0065789C, 0x0065D89C, 0x0065989C, + 0x00000002, 0x00657A8E, 0xA0812802, 0x00000002, 0x00657A91, 0xA0812802, + 0x00000003, 0x00657A9C, 0x0065809C, 0x0065D89C, 0x00000004, 0x00657E9C, + 0x0027D69C, 0x0065829C, 0x0027D69C, 0x00000006, 0x00657E9C, 0x0065909C, + 0x0065869C, 0x0027D69C, 0x00659E9C, 0xA001281C, 0x00000003, 0x0065809C, + 0x0027D69C, 0x0065B89C, 0x00000003, 0x0065809C, 0x0065D89C, 0x0065909C, + 0x00000002, 0x0065828E, 0xA0812802, 0x00000002, 0x00658291, 0xA0812802, + 0x00000003, 0x0065829C, 0x0065789C, 0x0065C89C, 0x00000004, 0x0065829C, + 0x0065C69C, 0x00659A9C, 0x00659E9C, 0x00000004, 0x0065829C, 0x0065CE9C, + 0x0065C89C, 0x0027D69C, 0x00000004, 0x0065829C, + // Block 134, offset 0x2180 + 0xA001281C, 0x0065CE9C, 0x0065D89C, 0x00000004, 0x0065829C, 0xA001281C, + 0x0065D89C, 0x0065B49C, 0x00000002, 0x0065848E, 0xA0812802, 0x00000002, + 0x00658491, 0xA0812802, 0x00000004, 0x0065849C, 0xA001281C, 0x0065829C, + 0xA001281C, 0x00000004, 0x0065849C, 0xA001281C, 0x0065A29C, 0x0027D69C, + 0x00000004, 0x0065849C, 0x0065C09C, 0x0065C89C, 0x0027D69C, 0x00000006, + 0x0065849C, 0xA001281C, 0x0065CA9C, 0x0065969C, 0xA001281C, 0x0027D69C, + 0x00000006, 0x0065849C, 0x0065CE9C, 0x0065869C, 0xA001281C, 0x0065C69C, + 0x0065B89C, 0x00000006, 0x0065849C, 0x0065CE9C, 0x0065BA9C, 0x0027D69C, + 0x00659E9C, 0x0065CA9C, 0x00000005, 0x0065849C, 0x0065CE9C, 0x0065D09C, + 0x00659A9C, 0x00659E9C, 0x00000002, 0x0065868E, 0xA0812802, 0x00000002, + 0x00658691, 0xA0812802, 0x00000004, 0x0065869C, + // Block 135, offset 0x21c0 + 0xA001281C, 0x0065C69C, 0x0065B89C, 0x00000006, 0x0065869C, 0xA001281C, + 0x0065C69C, 0x0065B89C, 0x00659E9C, 0x0065D89C, 0x00000006, 0x0065869C, + 0x0065CA9C, 0x0065929C, 0xA001281C, 0x0065789C, 0x0065CE9C, 0x00000004, + 0x0065869C, 0x0065CE9C, 0x0027D69C, 0x0065A69C, 0x00000002, 0x0065888E, + 0xA0812802, 0x00000002, 0x00658891, 0xA0812802, 0x00000003, 0x0065889C, + 0x0027D69C, 0x0065909C, 0x00000002, 0x00658A8E, 0xA0812802, 0x00000002, + 0x00658A91, 0xA0812802, 0x00000004, 0x00658A9C, 0x0027D69C, 0x0065B29C, + 0xA001291C, 0x00000003, 0x00658A9C, 0x0065CA9C, 0x0065A09C, 0x00000002, + 0x00658C8E, 0xA0812802, 0x00000002, 0x00658C91, 0xA0812802, 0x00000004, + 0x00658C9C, 0x0065789C, 0x0065869C, 0x0065CA9C, 0x00000005, 0x00658C9C, + 0x0065D89C, 0x0065989C, 0x0027D69C, 0x0065B89C, + // Block 136, offset 0x2200 + 0x00000002, 0x00658E8E, 0xA0812802, 0x00000002, 0x00658E91, 0xA0812802, + 0x00000002, 0x00658E84, 0x0065BA84, 0x00000005, 0x00658E9C, 0x0065C89C, + 0x0065D89C, 0x0065869C, 0xA001281C, 0x00000002, 0x0065908E, 0xA0812802, + 0x00000002, 0x00659091, 0xA0812802, 0x00000002, 0x0065928E, 0xA0812802, + 0x00000002, 0x00659291, 0xA0812802, 0x00000003, 0x0065929C, 0x0065D89C, + 0x0065989C, 0x00000003, 0x0065929C, 0x0065D89C, 0x00659E9C, 0x00000002, + 0x0065948E, 0xA0812802, 0x00000002, 0x00659491, 0xA0812802, 0x00000002, + 0x0065968E, 0xA0812802, 0x00000002, 0x00659691, 0xA0812802, 0x00000004, + 0x0065969C, 0xA001281C, 0x0027D69C, 0x0065909C, 0x00000002, 0x0065988E, + 0xA0812802, 0x00000002, 0x00659891, 0xA0812802, 0x00000002, 0x00659A8E, + 0xA0812802, 0x00000002, 0x00659A91, 0xA0812802, + // Block 137, offset 0x2240 + 0x00000002, 0x00659C8E, 0xA0812802, 0x00000002, 0x00659C91, 0xA0812802, + 0x00000003, 0x00659C9C, 0xA001281C, 0x00658E9C, 0x00000002, 0x00659E8E, + 0xA0812802, 0x00000002, 0x00659E91, 0xA0812802, 0x00000003, 0x00659E9C, + 0xA001281C, 0x0065CA9C, 0x00000003, 0x0065A89C, 0x00659A9C, 0x00659E9C, + 0x00000002, 0x0065AA8E, 0xA0812802, 0x00000002, 0x0065AA91, 0xA0812802, + 0x00000002, 0x0065AA8E, 0xA0812902, 0x00000002, 0x0065AA91, 0xA0812902, + 0x00000006, 0x0065AA9C, 0xA001291C, 0x0027D69C, 0x0065929C, 0x0065D89C, + 0x00659E9C, 0x00000004, 0x0065AA9C, 0xA001291C, 0x0027D69C, 0x00659A9C, + 0x00000005, 0x0065AA9C, 0xA001281C, 0x0027D69C, 0x0065CC9C, 0x0065CA9C, + 0x00000003, 0x0065AA9C, 0x0065789C, 0x00659A9C, 0x00000002, 0x0065AC8E, + 0xA0812802, 0x00000002, 0x0065AC91, 0xA0812802, + // Block 138, offset 0x2280 + 0x00000002, 0x0065AC8E, 0xA0812902, 0x00000002, 0x0065AC91, 0xA0812902, + 0x00000006, 0x0065AC9C, 0xA001291C, 0x0065769C, 0x0065909C, 0x00659E9C, + 0x0065CA9C, 0x00000004, 0x0065AC9C, 0xA001291C, 0x0065869C, 0x0065CA9C, + 0x00000003, 0x0065AC9C, 0xA001291C, 0x00658A9C, 0x00000003, 0x0065AC9C, + 0xA001281C, 0x0065CA9C, 0x00000002, 0x0065AE8E, 0xA0812802, 0x00000002, + 0x0065AE91, 0xA0812802, 0x00000002, 0x0065AE8E, 0xA0812902, 0x00000002, + 0x0065AE91, 0xA0812902, 0x00000006, 0x0065AE9C, 0x0065769C, 0x0065C69C, + 0x00659A9C, 0x00659E9C, 0xA001281C, 0x00000004, 0x0065AE9C, 0x0065789C, + 0x0027D69C, 0x00659E9C, 0x00000006, 0x0065AE9C, 0xA001281C, 0x00659A9C, + 0x00658E9C, 0x00657E9C, 0x0065CA9C, 0x00000003, 0x0065AE9C, 0x0065C69C, + 0x0065D89C, 0x00000002, 0x0065B08E, 0xA0812802, + // Block 139, offset 0x22c0 + 0x00000002, 0x0065B091, 0xA0812802, 0x00000002, 0x0065B08E, 0xA0812902, + 0x00000002, 0x0065B091, 0xA0812902, 0x00000005, 0x0065B09C, 0xA001291C, + 0x0027D69C, 0x00658E9C, 0xA001281C, 0x00000004, 0x0065B09C, 0xA001281C, + 0x0027D69C, 0x0065969C, 0x00000005, 0x0065B09C, 0x0065869C, 0x0065969C, + 0x0027D69C, 0x0065CA9C, 0x00000003, 0x0065B09C, 0xA001291C, 0x0065949C, + 0x00000004, 0x0065B09C, 0xA001291C, 0x0065A29C, 0x0065AC9C, 0x00000003, + 0x0065B09C, 0x0065CA9C, 0x00659A9C, 0x00000004, 0x0065B09C, 0xA001291C, + 0x0065D89C, 0x0065909C, 0x00000002, 0x0065B28E, 0xA0812802, 0x00000002, + 0x0065B291, 0xA0812802, 0x00000002, 0x0065B28E, 0xA0812902, 0x00000002, + 0x0065B291, 0xA0812902, 0x00000003, 0x0065B29C, 0x0027D69C, 0x0065CA9C, + 0x00000003, 0x0065B29C, 0x0027D69C, 0x0065D89C, + // Block 140, offset 0x2300 + 0x00000005, 0x0065B29C, 0xA001291C, 0x0065789C, 0x0065D89C, 0x00659E9C, + 0x00000004, 0x0065B29C, 0xA001281C, 0x0065CA9C, 0x00659E9C, 0x00000005, + 0x0065B29C, 0xA001291C, 0x0065D89C, 0x00659E9C, 0xA001281C, 0x00000004, + 0x0065B49C, 0x0065789C, 0x0065869C, 0x0065CE9C, 0x00000003, 0x0065B49C, + 0x0065789C, 0x0065CA9C, 0x00000002, 0x0065B484, 0x00659084, 0x00000003, + 0x0065B49C, 0x00659A9C, 0x0065AA9C, 0x00000003, 0x0065B49C, 0x0065CA9C, + 0x0065869C, 0x00000005, 0x0065B49C, 0x0065D89C, 0x00658E9C, 0x0065C49C, + 0x0065D89C, 0x00000004, 0x0065B69C, 0x0065869C, 0x0065CE9C, 0x0065D89C, + 0x00000006, 0x0065B69C, 0x0065C89C, 0x0065AA9C, 0xA001281C, 0x0027D69C, + 0x0065CA9C, 0x00000004, 0x0065BA9C, 0x0027D69C, 0x00659E9C, 0x0065CA9C, + 0x00000003, 0x0065BA9C, 0x0065829C, 0xA001281C, + // Block 141, offset 0x2340 + 0x00000005, 0x0065BA9C, 0x0065829C, 0xA001281C, 0x00659E9C, 0x0065D89C, + 0x00000004, 0x0065BE9C, 0x0027D69C, 0x00659E9C, 0xA001281C, 0x00000003, + 0x0065BE9C, 0x0027D69C, 0x0065CA9C, 0x00000003, 0x0065C09C, 0x0065769C, + 0x0065D89C, 0x00000004, 0x0065C89C, 0x00659A9C, 0x00659E9C, 0x0065CA9C, + 0x00000005, 0x0065CA9C, 0x0027D69C, 0x0065AE9C, 0xA001281C, 0x0065CA9C, + 0x00000004, 0x0065CA9C, 0x0065AC9C, 0xA001291C, 0x0027D69C, 0x00000006, + 0x0065CC9C, 0x0065D89C, 0x00659E9C, 0x0065889C, 0xA001281C, 0x0065D89C, + 0x00000002, 0x0065D091, 0xA0812802, 0x00000003, 0x0065D09C, 0x00659A9C, + 0x00659E9C, 0x00000002, 0x0065D291, 0xA0812802, 0x00000002, 0x0065D491, + 0xA0812802, 0x00000002, 0x0065D691, 0xA0812802, 0x00000002, 0x0065DA84, + 0xA0013A04, 0x00000002, 0x0065EC84, 0xA0013A04, + // Block 142, offset 0x2380 + 0x00000002, 0x0065F684, 0xA0013A04, 0x00000002, 0x00660684, 0xA0013A04, + 0x00000002, 0x00661284, 0xA0013A04, 0x00000002, 0x00661484, 0xA0013A04, + 0x00000002, 0x00661C84, 0xA0013A04, 0x00000002, 0x00661E84, 0xA0013A04, + 0x00000002, 0x00662284, 0xA0013A04, 0x00000002, 0x00663884, 0xA0013A04, + 0x00000002, 0x00663896, 0xA0013A16, 0x00000002, 0x00663A84, 0xA0013A04, + 0x00000002, 0x00663A84, 0xA0013C04, 0x00000002, 0x0075C284, 0xA0013904, + 0x00000002, 0x00862084, 0xA0013904, 0x00000002, 0x00862284, 0xA0013904, + 0x00000002, 0x00862484, 0xA0013904, 0x00000002, 0x00862684, 0xA0013904, + 0x00000002, 0x00862884, 0xA0013904, 0x00000002, 0x00862A84, 0xA0013904, + 0x00000002, 0x00862C84, 0xA0013904, 0x00000002, 0x00862C84, 0xA0013A04, + 0x00000002, 0x00862E84, 0xA0013904, 0x00000002, + // Block 143, offset 0x23c0 + 0x00863084, 0xA0013904, 0x00000002, 0x00863284, 0xA0013904, 0x00000002, + 0x00863284, 0xA0013A04, 0x00000002, 0x00863484, 0xA0013904, 0x00000002, + 0x00863484, 0xA0013A04, 0x00000002, 0x00863684, 0xA0013904, 0x00000002, + 0x00863684, 0xA0013A04, 0x00000002, 0x00863884, 0xA0013904, 0x00000002, + 0x00863A84, 0xA0013904, 0x00000002, 0x00863C84, 0xA0013904, 0x00000002, + 0x00863E84, 0xA0013904, 0x00000002, 0x00863E84, 0xA0013A04, 0x00000002, + 0x00863E84, 0xA0013C04, 0x00000002, 0x00864084, 0xA0013904, 0x00000002, + 0x00864284, 0xA0013904, 0x00000002, 0x00864484, 0xA0013904, 0x00000002, + 0x00864684, 0xA0013904, 0x00000002, 0x00864684, 0xA0013A04, 0x00000002, + 0x00864884, 0xA0013904, 0x00000002, 0x00864884, 0xA0013A04, 0x00000002, + 0x00864A84, 0xA0013904, 0x00000002, 0x00864C84, + // Block 144, offset 0x2400 + 0xA0013904, 0x00000002, 0x029C6C84, 0xA0013904, 0x00000002, 0x029CB284, + 0xA0013904, 0x00000002, 0x02A30484, 0xA0013904, 0x00000002, 0x02A3C084, + 0xA0013904, 0x00000002, 0x02A40084, 0xA0013904, 0x00000002, 0x02A6B884, + 0xA0013904, 0x00000002, 0x02A6D284, 0xA0013904, 0x00000002, 0x02A70484, + 0xA0013904, 0x00000002, 0x02B81E84, 0xA0013904, 0x00000002, 0x02B81E84, + 0xA0013A04, 0x00000002, 0x02B84484, 0xA0013904, 0x00000002, 0x02B84684, + 0xA0013904, 0x00000002, 0x02BEA084, 0xA0013904, 0x00000002, 0x02BF8684, + 0xA0013904, 0x00000002, 0x02CBCA84, 0xA0013904, 0x00000002, 0x02CE1084, + 0xA0013904, 0x00000004, 0x02D0549C, 0x02BE1E9C, 0x029E349C, 0x02F27C9C, + 0x00000002, 0x02D6F484, 0xA0013904, 0x00000002, 0x02E45684, 0xA0013904, + 0x00000002, 0x02E4B684, 0xA0013904, 0x00000002, + // Block 145, offset 0x2440 + 0x02E71684, 0xA0013904, 0x00000002, 0x02EB1684, 0xA0013904, 0x00000002, + 0x02EDDC84, 0xA0013904, 0x00000002, 0x02F27484, 0xA0013904, 0x00000002, + 0x02F5F284, 0xA0013904, 0x00000002, 0x02FEA484, 0xA0013904, 0x00000002, + 0x02FEA684, 0xA0013904, 0x00000002, 0x02FEA684, 0xA0013A04, 0x00000002, + 0x02FF1484, 0xA0013904, 0x00000002, 0x02FF1484, 0xA0013A04, 0x00000002, + 0x0300FE84, 0xA0013904, 0x00000002, 0x03011284, 0xA0013904, 0x00000002, + 0x0303F884, 0xA0013904, 0x00000002, 0x0304F284, 0xA0013904, 0x00000002, + 0x0304F284, 0xA0013A04, 0x00000002, 0x0313A484, 0xA0013904, 0x00000002, + 0x031B6684, 0xA0013904, 0x00000002, 0x031F6C84, 0xA0013904, 0x00000002, + 0x031F6C84, 0xA0013A04, 0x00000002, 0x03212284, 0xA0013904, 0x00000002, + 0x032C3884, 0xA0013904, 0x00000002, 0x032DD084, + // Block 146, offset 0x2480 + 0xA0013904, 0x00000002, 0x0331C084, 0xA0013904, 0x00000002, 0x03332C84, + 0xA0013904, 0x00000002, 0x03355084, 0xA0013904, 0x00000002, 0x03367884, + 0xA0013904, 0x00000002, 0x033CEA84, 0xA0013904, 0x00000002, 0x033E9484, + 0xA0013904, 0x00000002, 0x033EA484, 0xA0013904, 0x00000002, 0x033F1A84, + 0xA0013904, 0x00000002, 0x033F3884, 0xA0013904, 0x00000002, 0x033F3884, + 0xA0013A04, 0x00000002, 0xA000AD18, 0xA000BA18, 0x00000002, 0xA000B218, + 0xA000BA18, 0x00000002, 0xA000B618, 0xA000BA18, 0x00000002, 0x00393C99, + 0x003A8E99, 0x00000002, 0x00393C9A, 0x003A8E9A, 0x00000002, 0x00395699, + 0x003A8E99, 0x00000002, 0x0039569A, 0x003A8E9A, 0x00000002, 0x00395899, + 0x003A8E99, 0x00000002, 0x0039589A, 0x003A8E9A, 0x00000002, 0x00396499, + 0x003A8E99, 0x00000002, 0x0039649A, 0x003A8E9A, + // Block 147, offset 0x24c0 + 0x00000002, 0x00397299, 0x003A8E99, 0x00000002, 0x0039729A, 0x003A8E9A, + 0x00000002, 0x00397499, 0x003A8E99, 0x00000002, 0x0039749A, 0x003A8E9A, + 0x00000002, 0x0039C699, 0x003A8E99, 0x00000002, 0x0039C69A, 0x003A8E9A, + 0x00000002, 0x0039C899, 0x003A8E99, 0x00000002, 0x0039C89A, 0x003A8E9A, + 0x00000002, 0x0039DC99, 0x003A8E99, 0x00000002, 0x0039DC9A, 0x003A8E9A, + 0x00000002, 0x0039DE99, 0x003A8E99, 0x00000002, 0x0039DE9A, 0x003A8E9A, + 0x00000002, 0x0039E699, 0x003A8E99, 0x00000002, 0x0039E69A, 0x003A8E9A, + 0x00000002, 0x0039EE99, 0x003A8E99, 0x00000002, 0x0039EE9A, 0x003A8E9A, + 0x00000002, 0x0039F099, 0x003A8E99, 0x00000002, 0x0039F09A, 0x003A8E9A, + 0x00000002, 0x0039FC99, 0x003A8E99, 0x00000002, 0x0039FC9A, 0x003A8E9A, + 0x00000002, 0x003A1299, 0x003A8E99, 0x00000002, + // Block 148, offset 0x2500 + 0x003A129A, 0x003A8E9A, 0x00000002, 0x003A1A99, 0x003A8E99, 0x00000002, + 0x003A1A9A, 0x003A8E9A, 0x00000002, 0x003A4099, 0x003A8E99, 0x00000002, + 0x003A409A, 0x003A8E9A, 0x00000002, 0x003A4E9A, 0x003A8E9A, 0x00000002, + 0x003A5699, 0x003A8E99, 0x00000002, 0x003A569A, 0x003A8E9A, 0x00000002, + 0x003A689A, 0x003A8E9A, 0x00000002, 0x003A8E99, 0xA000D119, 0x00000002, + 0x003A8E9A, 0xA000D11A, 0x00000002, 0x003A9099, 0x003A8E99, 0x00000002, + 0x003A909A, 0x003A8E9A, 0x00000002, 0x4062AC20, 0x4062AC20, 0x00000002, + 0x4062AC20, 0x4062BE20, 0x00000002, 0x4062B020, 0x4062C420, 0x00000002, + 0x4062B020, 0x4062D020, 0x00000002, 0x4062B220, 0x4062B220, 0x00000002, + 0x4062B620, 0x4062AC20, 0x00000002, 0x4062B620, 0x4062B820, 0x00000002, + 0x4062B620, 0x4062BA20, 0x00000002, 0x4062B620, + // Block 149, offset 0x2540 + 0x4062BE20, 0x00000002, 0x4062B620, 0x4062CC20, 0x00000002, 0x4062B620, + 0x4062CE20, 0x00000002, 0x4062B620, 0x4062D020, 0x00000002, 0x4062BA20, + 0x4062BA20, 0x00000002, 0x4062BA20, 0x4062BE20, 0x00000002, 0x4062BE20, + 0x4062BE20, 0x00000002, 0x4062C420, 0x4062C420, 0x00000002, 0x4063A820, + 0x4063D020, 0x00000002, 0x4063AC20, 0x4063D020, 0x00000002, 0x4063B020, + 0x4063D020, 0x00000002, 0x4063B420, 0x4063D020, 0x00000002, 0x4063B820, + 0x4063A820, 0x00000003, 0x4063B820, 0x4063A820, 0x4063D020, 0x00000002, + 0x4063B820, 0x4063D020, 0x00000002, 0x4063C220, 0x4063CE20, 0x00000003, + 0x4063C220, 0x4063CE20, 0x4063D020, 0x00000002, 0x4063C220, 0x4063D020, + 0x00000003, 0x0003F484, 0x002D9A8A, 0x0003F69F, 0x00000003, 0x0003F484, + 0x002F5684, 0x0003F69F, 0x00000003, 0x0003F484, + // Block 150, offset 0x2580 + 0x002F568A, 0x0003F69F, 0x00000003, 0x0003F484, 0x0030F684, 0x0003F69F, + 0x00000003, 0x0003F484, 0x0030F68A, 0x0003F69F, 0x00000002, 0x002C0A9D, + 0x002F569C, 0x00000002, 0x402C3C20, 0xAE603202, 0x00000002, 0x002C3C83, + 0xAE603202, 0x00000002, 0x402D6A20, 0xAE604702, 0x00000002, 0x002D6A83, + 0xAE604702, 0x00000002, 0x402D6A20, 0xAE605202, 0x00000002, 0x002D6A83, + 0xAE605202, 0x00000002, 0x002D9883, 0xAE603202, 0x00000002, 0x002D9883, + 0xAE603502, 0x00000002, 0x002D9883, 0xAE603702, 0x00000002, 0x002D9883, + 0xAE603C02, 0x00000002, 0x002D9883, 0xAE604102, 0x00000002, 0x002D9883, + 0xAE604702, 0x00000003, 0x002D9883, 0xAE604702, 0xAE603202, 0x00000002, + 0x002D9883, 0xAE604E02, 0x00000002, 0x002D9883, 0xACA05902, 0x00000002, + 0x002D9883, 0xAE605B02, 0x00000002, 0x002D9883, + // Block 151, offset 0x25c0 + 0xAE606402, 0x00000002, 0x002D9883, 0xAE606502, 0x00000002, 0x002D9883, + 0xAE606702, 0x00000002, 0x002D9883, 0xADC07002, 0x00000002, 0x002D9883, + 0xADC07A02, 0x00000002, 0x002D9A8A, 0x002D9A9F, 0x00000003, 0x002D9A8A, + 0x002D9A8A, 0x002D9A9F, 0x00000002, 0x002D9A8A, 0x002DCC8A, 0x00000002, + 0x002D9A9D, 0x00306C9D, 0x00000002, 0x002D9A8A, 0x0030BE9F, 0x00000002, + 0x002D9A84, 0x0030F69F, 0x00000002, 0x002D9A8A, 0x0030F69F, 0x00000002, + 0x002E229C, 0x0030F69C, 0x00000002, 0x402EE420, 0xAE604E02, 0x00000002, + 0x002EE483, 0xAE604E02, 0x00000002, 0x402EE420, 0xAE605B02, 0x00000002, + 0x002EE483, 0xAE605B02, 0x00000002, 0x40306E20, 0xAE603202, 0x00000002, + 0x00306E83, 0xAE603202, 0x00000002, 0x40306E20, 0xAE603502, 0x00000002, + 0x00306E83, 0xAE603502, 0x00000002, 0x40306E20, + // Block 152, offset 0x2600 + 0xAE604102, 0x00000002, 0x00306E83, 0xAE604102, 0x00000002, 0x40306E20, + 0xAE605B02, 0x00000002, 0x00306E83, 0xAE605B02, 0x00000002, 0x0030BE8A, + 0x002D9A9F, 0x00000003, 0x0030BE8A, 0x002D9A8A, 0x002D9A9F, 0x00000002, + 0x0030F684, 0x002D9A9F, 0x00000002, 0x0030F68A, 0x002D9A9F, 0x00000003, + 0x0030F684, 0x002D9A84, 0x002D9A9F, 0x00000003, 0x0030F68A, 0x002D9A8A, + 0x002D9A9F, 0x00000002, 0x402BE020, 0xAE603702, 0x00000002, 0x002BE083, + 0xAE603702, 0x00000002, 0x402BE020, 0xAE603C02, 0x00000002, 0x002BE083, + 0xAE603C02, 0x00000002, 0x402BE020, 0xAE604302, 0x00000002, 0x002BE083, + 0xAE604302, 0x00000002, 0x402C9A20, 0xAE603C02, 0x00000002, 0x002C9A83, + 0xAE603C02, 0x00000002, 0x402C9A20, 0xAE605B02, 0x00000002, 0x002C9A83, + 0xAE605B02, 0x00000002, 0x402D9C20, 0xAE604702, + // Block 153, offset 0x2640 + 0x00000002, 0x002D9C83, 0xAE604702, 0x00000002, 0x402EE420, 0xAE603C02, + 0x00000002, 0x002EE483, 0xAE603C02, 0x00000002, 0x402EE420, 0xAD806802, + 0x00000002, 0x002EE483, 0xAD806802, 0x00000002, 0x402FE820, 0xAE605202, + 0x00000002, 0x002FE883, 0xAE605202, 0x00000002, 0x40306E20, 0xAE604702, + 0x00000002, 0x00306E83, 0xAE604702, 0x00000002, 0x40306E20, 0xAE604E02, + 0x00000002, 0x00306E83, 0xAE604E02, 0x00000002, 0x40306E20, 0xAD806802, + 0x00000002, 0x00306E83, 0xAD806802, 0x00000002, 0x002C6294, 0xA0013914, + 0x00000002, 0x00302C83, 0x402D6820, 0x00000002, 0x00302C89, 0x002D6888, + 0x00000002, 0x40310021, 0xAE603202, 0x00000002, 0x003100A3, 0xAE603202, + 0x00000002, 0x40310021, 0xAE603502, 0x00000002, 0x003100A3, 0xAE603502, + 0x00000002, 0x40310021, 0xAE604102, 0x00000002, + // Block 154, offset 0x2680 + 0x003100A3, 0xAE604102, 0x00000002, 0x40310021, 0xAE605B02, 0x00000002, + 0x003100A3, 0xAE605B02, 0x00000002, 0x40320C20, 0xAE603202, 0x00000002, + 0x00320C83, 0xAE603202, 0x00000002, 0x40320C20, 0xAE605B02, 0x00000002, + 0x00320C83, 0xAE605B02, 0x00000002, 0x40320C21, 0xAE605B02, 0x00000002, + 0x00320CA3, 0xAE605B02, 0x00000002, 0x40320E20, 0xAE603202, 0x00000002, + 0x00320E83, 0xAE603202, 0x00000002, 0x40320E21, 0xAE604E02, 0x00000002, + 0x00320EA3, 0xAE604E02, 0x00000002, 0x40320E21, 0xAE605B02, 0x00000002, + 0x00320EA3, 0xAE605B02, 0x00000002, 0x40321020, 0xAE603202, 0x00000002, + 0x00321083, 0xAE603202, 0x00000002, 0x402BDE21, 0x002C9888, 0x00000002, + 0x002BDEA3, 0x002C9888, 0x00000003, 0x402BDE21, 0x002C9888, 0xAE605B02, + 0x00000003, 0x002BDEA3, 0x002C9888, 0xAE605B02, + // Block 155, offset 0x26c0 + 0x00000002, 0x402EE221, 0x002C9888, 0x00000002, 0x002EE2A3, 0x002C9888, + 0x00000003, 0x402EE221, 0x002C9888, 0xAE604E02, 0x00000003, 0x002EE2A3, + 0x002C9888, 0xAE604E02, 0x00000003, 0x402EE221, 0x002C9888, 0xAE605B02, + 0x00000003, 0x002EE2A3, 0x002C9888, 0xAE605B02, 0x00000002, 0x40306C21, + 0x002C9888, 0x00000002, 0x00306CA3, 0x002C9888, 0x00000003, 0x40306C21, + 0x002C9888, 0xAE603202, 0x00000003, 0x00306CA3, 0x002C9888, 0xAE603202, + 0x00000003, 0x40306C21, 0x002C9888, 0xAE603502, 0x00000003, 0x00306CA3, + 0x002C9888, 0xAE603502, 0x00000003, 0x40306C21, 0x002C9888, 0xAE604102, + 0x00000003, 0x00306CA3, 0x002C9888, 0xAE604102, 0x00000003, 0x40306C21, + 0x002C9888, 0xAE605B02, 0x00000003, 0x00306CA3, 0x002C9888, 0xAE605B02, + 0x00000003, 0x0003F484, 0x0030E284, 0x0003F69F, + // Block 156, offset 0x2700 + 0x00000003, 0x0003F484, 0x0030E28A, 0x0003F69F, 0x00000002, 0x002DFE9C, + 0x0030E29D, 0x00000002, 0x002E829C, 0x0030E29D, 0x00000002, 0x002E829D, + 0x0030E29D, 0x00000002, 0x002E9E9C, 0x0030E29D, 0x00000002, 0x002F2C9C, + 0x0030E29D, 0x00000002, 0x40302C21, 0x402D6820, 0x00000002, 0x00302CA3, + 0x402D6820, 0x00000002, 0x4030BE21, 0xAE603202, 0x00000002, 0x0030BEA3, + 0xAE603202, 0x00000002, 0x4030BE21, 0xAE603502, 0x00000002, 0x0030BEA3, + 0xAE603502, 0x00000002, 0x4030BE21, 0xAE603C02, 0x00000002, 0x0030BEA3, + 0xAE603C02, 0x00000002, 0x4030BE21, 0xAE604302, 0x00000002, 0x4030BE21, + 0xAE604702, 0x00000002, 0x0030BEA3, 0xAE604702, 0x00000002, 0x4030BE21, + 0xAE605202, 0x00000002, 0x0030BEA3, 0xAE605202, 0x00000002, 0x4030BE21, + 0xADC07002, 0x00000002, 0x0030BEA3, 0xADC07002, + // Block 157, offset 0x2740 + 0x00000002, 0x0030E29D, 0x002C0A9C, 0x00000002, 0x0030E29D, 0x002C3A9D, + 0x00000002, 0x0030E28C, 0x00312A8C, 0x00000002, 0x40320E20, 0xAE605B02, + 0x00000002, 0x00320E83, 0xAE605B02, 0x00000002, 0x40320E21, 0xAE603202, + 0x00000002, 0x00320EA3, 0xAE603202, 0x00000002, 0x40321020, 0xAE605B02, + 0x00000002, 0x00321083, 0xAE605B02, 0x00000002, 0x40321021, 0xAE603202, + 0x00000002, 0x003210A3, 0xAE603202, 0x00000002, 0x40321023, 0xAE603202, + 0x00000002, 0x003210E3, 0xAE603202, 0x00000002, 0x40321023, 0xAE603C02, + 0x00000002, 0x003210E3, 0xAE603C02, 0x00000002, 0x40321023, 0xAE604702, + 0x00000002, 0x003210E3, 0xAE604702, 0x00000002, 0x40321023, 0xAE605B02, + 0x00000002, 0x003210E3, 0xAE605B02, 0x00000002, 0x40321023, 0xAD806802, + 0x00000002, 0x003210E3, 0xAD806802, 0x00000002, + // Block 158, offset 0x2780 + 0x0032769C, 0x0030E29D, 0x00000002, 0x402C3E20, 0xACA05602, 0x00000002, + 0x002C3E83, 0xACA05602, 0x00000002, 0x402C0820, 0xAE603702, 0x00000002, + 0x002C0883, 0xAE603702, 0x00000002, 0x402C0820, 0xAE603C02, 0x00000002, + 0x002C0883, 0xAE603C02, 0x00000002, 0x402D0620, 0xAE603C02, 0x00000002, + 0x002D0683, 0xAE603C02, 0x00000002, 0x402D0620, 0xAE605B02, 0x00000002, + 0x002D0683, 0xAE605B02, 0x00000002, 0x402DCA20, 0xAE604702, 0x00000002, + 0x002DCA83, 0xAE604702, 0x00000002, 0x402F2A20, 0xAE603C02, 0x00000002, + 0x002F2A83, 0xAE603C02, 0x00000002, 0x402F2A20, 0xAE604E02, 0x00000002, + 0x002F2A83, 0xAE604E02, 0x00000002, 0x402F2A20, 0xAE605B02, 0x00000002, + 0x002F2A83, 0xAE605B02, 0x00000002, 0x402F2A20, 0xAD806802, 0x00000002, + 0x002F2A83, 0xAD806802, 0x00000002, 0x4030BC20, + // Block 159, offset 0x27c0 + 0xAE604702, 0x00000002, 0x0030BC83, 0xAE604702, 0x00000002, 0x4030BC20, + 0xAE604E02, 0x00000002, 0x0030BC83, 0xAE604E02, 0x00000002, 0x4030BC20, + 0xAD806802, 0x00000002, 0x0030BC83, 0xAD806802, 0x00000002, 0x40320E20, + 0xAE604E02, 0x00000002, 0x00320E83, 0xAE604E02, 0x00000002, 0x4062AC20, + 0x4062B020, 0x00000002, 0x4062AC20, 0x4062B220, 0x00000002, 0x4062AC20, + 0x4062B620, 0x00000002, 0x4062AC20, 0x4062BA20, 0x00000003, 0x4062AC20, + 0x4062BE20, 0x4062AC20, 0x00000002, 0x4062AC20, 0x4062C820, 0x00000002, + 0x4062AC20, 0x4062CA20, 0x00000002, 0x4062AC20, 0x4062D020, 0x00000002, + 0x4062B020, 0x4062AC20, 0x00000002, 0x4062B020, 0x4062B020, 0x00000002, + 0x4062B020, 0x4062B220, 0x00000002, 0x4062B020, 0x4062BA20, 0x00000002, + 0x4062B020, 0x4062BE20, 0x00000002, 0x4062B020, + // Block 160, offset 0x2800 + 0x4062CC20, 0x00000002, 0x4062B220, 0x4062AC20, 0x00000002, 0x4062B220, + 0x4062B620, 0x00000003, 0x4062B620, 0x4062AC20, 0x4062BE20, 0x00000002, + 0x4062B620, 0x4062B020, 0x00000002, 0x4062B620, 0x4062B220, 0x00000003, + 0x4062B620, 0x4062B220, 0x4062D020, 0x00000002, 0x4062B620, 0x4062B620, + 0x00000003, 0x4062B620, 0x4062B820, 0x4062AC20, 0x00000003, 0x4062B620, + 0x4062B820, 0x4062BE20, 0x00000003, 0x4062B620, 0x4062BA20, 0x4062BE20, + 0x00000003, 0x4062B620, 0x4062BA20, 0x4062C220, 0x00000003, 0x4062B620, + 0x4062BA20, 0x4062D020, 0x00000003, 0x4062B620, 0x4062BE20, 0x4062BE20, + 0x00000002, 0x4062B620, 0x4062C220, 0x00000002, 0x4062B620, 0x4062CA20, + 0x00000002, 0x4062B820, 0x4062AC20, 0x00000002, 0x4062B820, 0x4062B620, + 0x00000002, 0x4062B820, 0x4062BA20, 0x00000002, + // Block 161, offset 0x2840 + 0x4062B820, 0x4062BE20, 0x00000003, 0x4062B820, 0x4062BE20, 0x4062BE20, + 0x00000002, 0x4062B820, 0x4062C220, 0x00000002, 0x4062B820, 0x4062C820, + 0x00000002, 0x4062B820, 0x4062D020, 0x00000002, 0x4062BA20, 0x4062AC20, + 0x00000002, 0x4062BA20, 0x4062B020, 0x00000002, 0x4062BA20, 0x4062B220, + 0x00000002, 0x4062BA20, 0x4062B620, 0x00000003, 0x4062BA20, 0x4062BA20, + 0x4062C220, 0x00000003, 0x4062BA20, 0x4062BE20, 0x4062AC20, 0x00000003, + 0x4062BA20, 0x4062BE20, 0x4062B220, 0x00000003, 0x4062BA20, 0x4062BE20, + 0x4062BA20, 0x00000003, 0x4062BA20, 0x4062BE20, 0x4062BE20, 0x00000003, + 0x4062BA20, 0x4062BE20, 0x4062C420, 0x00000002, 0x4062BA20, 0x4062C220, + 0x00000002, 0x4062BA20, 0x4062C420, 0x00000002, 0x4062BA20, 0x4062C820, + 0x00000002, 0x4062BA20, 0x4062CC20, 0x00000002, + // Block 162, offset 0x2880 + 0x4062BA20, 0x4062CE20, 0x00000002, 0x4062BA20, 0x4062D020, 0x00000002, + 0x4062BE20, 0x4062AC20, 0x00000002, 0x4062BE20, 0x4062B020, 0x00000002, + 0x4062BE20, 0x4062B220, 0x00000002, 0x4062BE20, 0x4062B620, 0x00000002, + 0x4062BE20, 0x4062B820, 0x00000002, 0x4062BE20, 0x4062BA20, 0x00000003, + 0x4062BE20, 0x4062BA20, 0x4062AC20, 0x00000003, 0x4062BE20, 0x4062BE20, + 0x4062BE20, 0x00000002, 0x4062BE20, 0x4062C220, 0x00000002, 0x4062BE20, + 0x4062C420, 0x00000002, 0x4062BE20, 0x4062C820, 0x00000002, 0x4062BE20, + 0x4062CA20, 0x00000002, 0x4062BE20, 0x4062CC20, 0x00000002, 0x4062BE20, + 0x4062CE20, 0x00000002, 0x4062BE20, 0x4062D020, 0x00000002, 0x4062C220, + 0x4062AC20, 0x00000003, 0x4062C220, 0x4062AC20, 0x4062AC20, 0x00000002, + 0x4062C220, 0x4062B220, 0x00000002, 0x4062C220, + // Block 163, offset 0x28c0 + 0x4062B820, 0x00000002, 0x4062C220, 0x4062BA20, 0x00000002, 0x4062C220, + 0x4062BE20, 0x00000002, 0x4062C220, 0x4062C220, 0x00000002, 0x4062C220, + 0x4062C420, 0x00000002, 0x4062C220, 0x4062C820, 0x00000002, 0x4062C220, + 0x4062CA20, 0x00000002, 0x4062C220, 0x4062CC20, 0x00000002, 0x4062C220, + 0x4062CE20, 0x00000002, 0x4062C420, 0x4062C220, 0x00000002, 0x4062C820, + 0x4062CA20, 0x00000002, 0x4062C820, 0x4062D020, 0x00000002, 0x4062CE20, + 0x4062BA20, 0x00000002, 0x4062CE20, 0x4062C220, 0x00000002, 0x4062D020, + 0x4062B020, 0x00000002, 0x4062D020, 0x4062B620, 0x00000002, 0x4062D020, + 0x4062B820, 0x00000002, 0x4062D020, 0x4062BA20, 0x00000002, 0x4062D020, + 0x4062D020, 0x00000002, 0x4063A820, 0x4063B820, 0x00000002, 0x4063A820, + 0x4063C220, 0x00000002, 0x4063A820, 0x4063CC20, + // Block 164, offset 0x2900 + 0x00000002, 0x4063AC20, 0x4063B820, 0x00000002, 0x4063AC20, 0x4063C020, + 0x00000002, 0x4063AC20, 0x4063C220, 0x00000002, 0x4063B020, 0x4063B820, + 0x00000002, 0x4063B020, 0x4063C220, 0x00000002, 0x4063B020, 0x4063CC20, + 0x00000002, 0x4063B420, 0x4063AC20, 0x00000002, 0x4063B420, 0x4063B820, + 0x00000002, 0x4063B420, 0x4063C220, 0x00000002, 0x4063B820, 0x4063AC20, + 0x00000003, 0x4063B820, 0x4063AC20, 0x4063D020, 0x00000002, 0x4063B820, + 0x4063B020, 0x00000003, 0x4063B820, 0x4063B020, 0x4063D020, 0x00000003, + 0x4063B820, 0x4063B420, 0x4063D020, 0x00000002, 0x4063B820, 0x4063B820, + 0x00000002, 0x4063B820, 0x4063C220, 0x00000002, 0x4063C020, 0x4063AC20, + 0x00000003, 0x4063C020, 0x4063AC20, 0x4063D020, 0x00000002, 0x4063C020, + 0x4063B420, 0x00000002, 0x4063C020, 0x4063B820, + // Block 165, offset 0x2940 + 0x00000002, 0x4063C020, 0x4063D020, 0x00000002, 0x4063C220, 0x4063A820, + 0x00000003, 0x4063C220, 0x4063A820, 0x4063D020, 0x00000003, 0x4063C220, + 0x4063B020, 0x4063CC20, 0x00000003, 0x4063C220, 0x4063B420, 0x4063D020, + 0x00000002, 0x4063C220, 0x4063C220, 0x00000002, 0x4063CA20, 0x4063A820, + 0x00000002, 0x4063CA20, 0x4063B020, 0x00000003, 0x4063CA20, 0x4063B020, + 0x4063D020, 0x00000002, 0x4063CA20, 0x4063B420, 0x00000003, 0x4063CA20, + 0x4063B420, 0x4063D020, 0x00000002, 0x4063CA20, 0x4063C220, 0x00000002, + 0x4063CA20, 0x4063D020, 0x00000002, 0x4063CC20, 0x4063C220, 0x00000002, + 0x4063CC20, 0x4063CC20, 0x00000002, 0x4063CE20, 0x4063C220, 0x00000002, + 0x4063D020, 0x4063A820, 0x00000002, 0x4063D020, 0x4063AC20, 0x00000002, + 0x4063D020, 0x4063B820, 0x00000002, 0x4063D020, + // Block 166, offset 0x2980 + 0x4063C220, 0x00000002, 0x4063D020, 0x4063CC20, 0x00000002, 0x0062AC86, + 0x0063A886, 0x00000002, 0x0062B086, 0x0063A886, 0x00000002, 0x0062B286, + 0x0063A886, 0x00000002, 0x0062B686, 0x0063A886, 0x00000002, 0x0062B886, + 0x0063A886, 0x00000002, 0x0062BA86, 0x0063A886, 0x00000002, 0x0062BE86, + 0x0063A886, 0x00000002, 0x0062C286, 0x0063A886, 0x00000002, 0x0062C286, + 0x0063C286, 0x00000002, 0x0062C486, 0x0063A886, 0x00000002, 0x0062C886, + 0x0063A886, 0x00000002, 0x0062CA86, 0x0063A886, 0x00000002, 0x0062CC86, + 0x0063A886, 0x00000002, 0x0062CE86, 0x0063A886, 0x00000002, 0x0062D086, + 0x0063A886, 0x00000002, 0x40302A20, 0xAE605202, 0x00000002, 0x00302A83, + 0xAE605202, 0x00000002, 0x40320820, 0xAE603202, 0x00000002, 0x00320883, + 0xAE603202, 0x00000002, 0x40320A20, 0xAE603202, + // Block 167, offset 0x29c0 + 0x00000002, 0x00320A83, 0xAE603202, 0x00000002, 0x40320A20, 0xAE605B02, + 0x00000002, 0x00320A83, 0xAE605B02, 0x00000002, 0x40320E21, 0xAE603702, + 0x00000002, 0x00320EA3, 0xAE603702, 0x00000002, 0x40320E21, 0xAE603C02, + 0x00000002, 0x00320EA3, 0xAE603C02, 0x00000002, 0x40321022, 0xAE603202, + 0x00000002, 0x003210C3, 0xAE603202, 0x00000002, 0x40321022, 0xAE604702, + 0x00000002, 0x003210C3, 0xAE604702, 0x00000002, 0x40321022, 0xAE605B02, + 0x00000002, 0x003210C3, 0xAE605B02, 0x00000002, 0x40321022, 0xAD806802, + 0x00000002, 0x003210C3, 0xAD806802, 0x00000002, 0x40321023, 0xAE603502, + 0x00000002, 0x003210E3, 0xAE603502, 0x00000002, 0x40321023, 0xAE604E02, + 0x00000002, 0x003210E3, 0xAE604E02, 0x00000002, 0x40321023, 0xAE606402, + 0x00000002, 0x003210E3, 0xAE606402, 0x00000002, + // Block 168, offset 0x2a00 + 0x40321023, 0xADC07002, 0x00000002, 0x003210E3, 0xADC07002, 0x00000002, + 0x40321024, 0xAE605B02, 0x00000002, 0x00321103, 0xAE605B02, 0x00000002, + 0x402BE220, 0xAE605B02, 0x00000002, 0x002BE283, 0xAE605B02, 0x00000002, + 0x402EE620, 0xAE603202, 0x00000002, 0x002EE683, 0xAE603202, 0x00000002, + 0x402EE620, 0xAE603502, 0x00000002, 0x002EE683, 0xAE603502, 0x00000002, + 0x402EE620, 0xAE604E02, 0x00000002, 0x002EE683, 0xAE604E02, 0x00000002, + 0x402EE620, 0xAE606402, 0x00000002, 0x002EE683, 0xAE606402, 0x00000002, + 0x402EE620, 0xADC07002, 0x00000002, 0x002EE683, 0xADC07002, 0x00000002, + 0x0030BE83, 0xAE604E02, 0x00000002, 0x0030BE83, 0xADC07002, 0x00000002, + 0x40321020, 0xAE604E02, 0x00000002, 0x00321083, 0xAE604E02, 0x00000002, + 0x40321024, 0xAE603202, 0x00000002, 0x00321103, + // Block 169, offset 0x2a40 + 0xAE603202, 0x00000002, 0x40321024, 0xAE603502, 0x00000002, 0x00321103, + 0xAE603502, 0x00000002, 0x40321024, 0xAE604E02, 0x00000002, 0x00321103, + 0xAE604E02, 0x00000002, 0x40321024, 0xAE606402, 0x00000002, 0x00321103, + 0xAE606402, 0x00000002, 0x40321024, 0xADC07002, 0x00000002, 0x00321103, + 0xADC07002, +} + +// mainContractElem: 1125 entries, 4500 bytes +var mainContractElem = [1125]uint32{ + // Block 0, offset 0x0 + 0x402E2220, 0xE0000CFB, 0xE0000CFB, 0x002E2288, 0xE0000D01, 0xE0000D01, + 0x40332220, 0x40332A20, 0x40333220, 0x00332288, 0x00332A88, 0x00333288, + 0x40333A20, 0x40334220, 0x00333A88, 0x00334288, 0x40336220, 0x4033A220, + 0x4033A220, 0x00336288, 0x0033A288, 0x0033A288, 0x4033B220, 0x4033BA20, + 0x0033B288, 0x0033BA88, 0x4033CA20, 0x4033D420, 0x0033CA88, 0x0033D488, + 0x4033E420, 0x4033F220, 0x0033E488, 0x0033F288, 0x40341420, 0x40343E20, + 0x40342420, 0x00341488, 0x00343E88, 0x00342488, 0x40342C20, 0x40343620, + 0x00342C88, 0x00343688, 0x4034EE20, 0x4034F620, 0x0034EE88, 0x0034F688, + 0x4034FE20, 0x40350620, 0x0034FE88, 0x00350688, 0x40345020, 0x40356A20, + 0x40356A20, 0x00345088, 0x00356A88, 0x00356A88, 0x40357220, 0x40357A20, + 0x40358220, 0x40358A20, 0x00357288, 0x00357A88, + // Block 1, offset 0x40 + 0x00358288, 0x00358A88, 0x40361820, 0x40362220, 0x00361888, 0x00362288, + 0x40367E20, 0x40368620, 0x00367E88, 0x00368688, 0x4036A820, 0x4036B020, + 0x0036A888, 0x0036B088, 0x40371420, 0x40371C20, 0x00371488, 0x00371C88, + 0x40393820, 0x40391E20, 0x40392020, 0x40392820, 0x403A7420, 0x40392620, + 0x403A9020, 0x40393020, 0x4040F020, 0x4040F420, 0x4040F620, 0x40426E20, + 0x40427220, 0x40427020, 0x40427420, 0x40429020, 0x40429420, 0x4042D020, + 0x4042D620, 0x4042DA20, 0x4042D220, 0x4042D820, 0x40435E20, 0x40436220, + 0x4043E020, 0x4043E220, 0x4043F020, 0x4043F820, 0x4043F620, 0x4043F220, + 0x4043F420, 0x4043F620, 0x4043F820, 0x40448220, 0x40448820, 0x40448C20, + 0x40448420, 0x40448A20, 0x40451E20, 0x40452620, 0x40452020, 0x40452420, + 0x40452820, 0x40452420, 0x40452620, 0x40498420, + // Block 2, offset 0x80 + 0xE0001881, 0xE0001890, 0xE000189F, 0xE00018AE, 0xE00018BD, 0xE00018CC, + 0xE00018DB, 0xE00018EA, 0xE00018F9, 0xE0001908, 0xE0001917, 0xE0001926, + 0xE0001935, 0xE0001944, 0xE0001953, 0xE0001962, 0xE0001971, 0xE0001980, + 0xE000198F, 0xE000199E, 0xE00019AD, 0xE00019BC, 0xE00019CB, 0xE00019DA, + 0xE00019E9, 0xE00019F8, 0xE0001A07, 0xE0001A16, 0xE0001A25, 0xE0001A34, + 0xE0001A43, 0xE0001A52, 0xE0001A61, 0xE0001A70, 0xE0001A7F, 0xE0001A8E, + 0xE0001A9D, 0xE0001AAC, 0xE0001ABB, 0xE0001ACA, 0xE0001AD9, 0xE0001AE8, + 0xE0001AF7, 0xE0001B06, 0xE0001B15, 0xE0001B24, 0x40498620, 0xE0001884, + 0xE0001893, 0xE00018A2, 0xE00018B1, 0xE00018C0, 0xE00018CF, 0xE00018DE, + 0xE00018ED, 0xE00018FC, 0xE000190B, 0xE000191A, 0xE0001929, 0xE0001938, + 0xE0001947, 0xE0001956, 0xE0001965, 0xE0001974, + // Block 3, offset 0xc0 + 0xE0001983, 0xE0001992, 0xE00019A1, 0xE00019B0, 0xE00019BF, 0xE00019CE, + 0xE00019DD, 0xE00019EC, 0xE00019FB, 0xE0001A0A, 0xE0001A19, 0xE0001A28, + 0xE0001A37, 0xE0001A46, 0xE0001A55, 0xE0001A64, 0xE0001A73, 0xE0001A82, + 0xE0001A91, 0xE0001AA0, 0xE0001AAF, 0xE0001ABE, 0xE0001ACD, 0xE0001ADC, + 0xE0001AEB, 0xE0001AFA, 0xE0001B09, 0xE0001B18, 0xE0001B27, 0x40498820, + 0xE0001887, 0xE0001896, 0xE00018A5, 0xE00018B4, 0xE00018C3, 0xE00018D2, + 0xE00018E1, 0xE00018F0, 0xE00018FF, 0xE000190E, 0xE000191D, 0xE000192C, + 0xE000193B, 0xE000194A, 0xE0001959, 0xE0001968, 0xE0001977, 0xE0001986, + 0xE0001995, 0xE00019A4, 0xE00019B3, 0xE00019C2, 0xE00019D1, 0xE00019E0, + 0xE00019EF, 0xE00019FE, 0xE0001A0D, 0xE0001A1C, 0xE0001A2B, 0xE0001A3A, + 0xE0001A49, 0xE0001A58, 0xE0001A67, 0xE0001A76, + // Block 4, offset 0x100 + 0xE0001A85, 0xE0001A94, 0xE0001AA3, 0xE0001AB2, 0xE0001AC1, 0xE0001AD0, + 0xE0001ADF, 0xE0001AEE, 0xE0001AFD, 0xE0001B0C, 0xE0001B1B, 0xE0001B2A, + 0x40498A20, 0xE000188A, 0xE0001899, 0xE00018A8, 0xE00018B7, 0xE00018C6, + 0xE00018D5, 0xE00018E4, 0xE00018F3, 0xE0001902, 0xE0001911, 0xE0001920, + 0xE000192F, 0xE000193E, 0xE000194D, 0xE000195C, 0xE000196B, 0xE000197A, + 0xE0001989, 0xE0001998, 0xE00019A7, 0xE00019B6, 0xE00019C5, 0xE00019D4, + 0xE00019E3, 0xE00019F2, 0xE0001A01, 0xE0001A10, 0xE0001A1F, 0xE0001A2E, + 0xE0001A3D, 0xE0001A4C, 0xE0001A5B, 0xE0001A6A, 0xE0001A79, 0xE0001A88, + 0xE0001A97, 0xE0001AA6, 0xE0001AB5, 0xE0001AC4, 0xE0001AD3, 0xE0001AE2, + 0xE0001AF1, 0xE0001B00, 0xE0001B0F, 0xE0001B1E, 0xE0001B2D, 0x40498C20, + 0xE000188D, 0xE000189C, 0xE00018AB, 0xE00018BA, + // Block 5, offset 0x140 + 0xE00018C9, 0xE00018D8, 0xE00018E7, 0xE00018F6, 0xE0001905, 0xE0001914, + 0xE0001923, 0xE0001932, 0xE0001941, 0xE0001950, 0xE000195F, 0xE000196E, + 0xE000197D, 0xE000198C, 0xE000199B, 0xE00019AA, 0xE00019B9, 0xE00019C8, + 0xE00019D7, 0xE00019E6, 0xE00019F5, 0xE0001A04, 0xE0001A13, 0xE0001A22, + 0xE0001A31, 0xE0001A40, 0xE0001A4F, 0xE0001A5E, 0xE0001A6D, 0xE0001A7C, + 0xE0001A8B, 0xE0001A9A, 0xE0001AA9, 0xE0001AB8, 0xE0001AC7, 0xE0001AD6, + 0xE0001AE5, 0xE0001AF4, 0xE0001B03, 0xE0001B12, 0xE0001B21, 0xE0001B30, + 0xA0010502, 0x40497420, 0x4049E620, 0xE0001B42, 0xE0001B51, 0xE0001B60, + 0xE0001B6F, 0xE0001B7E, 0xE0001B9C, 0xE0001BBA, 0xE0001BC9, 0xE0001BD8, + 0xE0001BE7, 0xE0001BF6, 0xE0001C05, 0xE0001C14, 0xE0001C23, 0xE0001C32, + 0xE0001C41, 0xE0001C50, 0xE0001C5F, 0xE0001C6E, + // Block 6, offset 0x180 + 0xE0001C7D, 0xE0001C8C, 0xE0001C9B, 0xE0001CAA, 0xE0001B8D, 0xE0001CE1, + 0xE0001CF0, 0xE0001CFF, 0xE0001CB9, 0xE0001CCD, 0xE0001B33, 0xE0001BAB, + 0x4049E820, 0xE0001B45, 0xE0001B54, 0xE0001B63, 0xE0001B72, 0xE0001B81, + 0xE0001B9F, 0xE0001BBD, 0xE0001BCC, 0xE0001BDB, 0xE0001BEA, 0xE0001BF9, + 0xE0001C08, 0xE0001C17, 0xE0001C26, 0xE0001C35, 0xE0001C44, 0xE0001C53, + 0xE0001C62, 0xE0001C71, 0xE0001C80, 0xE0001C8F, 0xE0001C9E, 0xE0001CAD, + 0xE0001B90, 0xE0001CE4, 0xE0001CF3, 0xE0001D02, 0xE0001CBD, 0xE0001CD1, + 0xE0001B36, 0xE0001BAE, 0x4049EA20, 0xE0001B48, 0xE0001B57, 0xE0001B66, + 0xE0001B75, 0xE0001B84, 0xE0001BA2, 0xE0001BC0, 0xE0001BCF, 0xE0001BDE, + 0xE0001BED, 0xE0001BFC, 0xE0001C0B, 0xE0001C1A, 0xE0001C29, 0xE0001C38, + 0xE0001C47, 0xE0001C56, 0xE0001C65, 0xE0001C74, + // Block 7, offset 0x1c0 + 0xE0001C83, 0xE0001C92, 0xE0001CA1, 0xE0001CB0, 0xE0001B93, 0xE0001CE7, + 0xE0001CF6, 0xE0001D05, 0xE0001CC1, 0xE0001CD5, 0xE0001B39, 0xE0001BB1, + 0x4049EC20, 0xE0001B4B, 0xE0001B5A, 0xE0001B69, 0xE0001B78, 0xE0001B87, + 0xE0001BA5, 0xE0001BC3, 0xE0001BD2, 0xE0001BE1, 0xE0001BF0, 0xE0001BFF, + 0xE0001C0E, 0xE0001C1D, 0xE0001C2C, 0xE0001C3B, 0xE0001C4A, 0xE0001C59, + 0xE0001C68, 0xE0001C77, 0xE0001C86, 0xE0001C95, 0xE0001CA4, 0xE0001CB3, + 0xE0001B96, 0xE0001CEA, 0xE0001CF9, 0xE0001D08, 0xE0001CC5, 0xE0001CD9, + 0xE0001B3C, 0xE0001BB4, 0x4049EE20, 0xE0001B4E, 0xE0001B5D, 0xE0001B6C, + 0xE0001B7B, 0xE0001B8A, 0xE0001BA8, 0xE0001BC6, 0xE0001BD5, 0xE0001BE4, + 0xE0001BF3, 0xE0001C02, 0xE0001C11, 0xE0001C20, 0xE0001C2F, 0xE0001C3E, + 0xE0001C4D, 0xE0001C5C, 0xE0001C6B, 0xE0001C7A, + // Block 8, offset 0x200 + 0xE0001C89, 0xE0001C98, 0xE0001CA7, 0xE0001CB6, 0xE0001B99, 0xE0001CED, + 0xE0001CFC, 0xE0001D0B, 0xE0001CC9, 0xE0001CDD, 0xE0001B3F, 0xE0001BB7, + 0xA0010B02, 0x4049D220, 0x404A5A20, 0xE0001D0E, 0xE0001D1D, 0xE0001D2C, + 0xE0001D3B, 0xE0001D4A, 0xE0001D59, 0xE0001D68, 0xE0001D77, 0xE0001D86, + 0xE0001D95, 0xE0001DA4, 0xE0001DB3, 0xE0001DC2, 0xE0001DD1, 0xE0001DE0, + 0xE0001DEF, 0xE0001DFE, 0xE0001E0D, 0xE0001E1C, 0xE0001E2B, 0xE0001E3A, + 0xE0001E49, 0xE0001E58, 0xE0001E67, 0xE0001E76, 0xE0001E85, 0xE0001E94, + 0xE0001EA3, 0xE0001EB2, 0xE0001EC1, 0xE0001ED0, 0xE0001EDF, 0xE0001EEE, + 0xE0001EFD, 0xE0001F0C, 0xE0001F1B, 0xE0001F2A, 0xE0001F39, 0xE0001F48, + 0xE0001F57, 0xE0001F66, 0xE0001F75, 0xE0001F84, 0xE0001F93, 0xE0001FA2, + 0xE0001FB1, 0xE0001FC0, 0xE0001FCF, 0x404A5C20, + // Block 9, offset 0x240 + 0xE0001D11, 0xE0001D20, 0xE0001D2F, 0xE0001D3E, 0xE0001D4D, 0xE0001D5C, + 0xE0001D6B, 0xE0001D7A, 0xE0001D89, 0xE0001D98, 0xE0001DA7, 0xE0001DB6, + 0xE0001DC5, 0xE0001DD4, 0xE0001DE3, 0xE0001DF2, 0xE0001E01, 0xE0001E10, + 0xE0001E1F, 0xE0001E2E, 0xE0001E3D, 0xE0001E4C, 0xE0001E5B, 0xE0001E6A, + 0xE0001E79, 0xE0001E88, 0xE0001E97, 0xE0001EA6, 0xE0001EB5, 0xE0001EC4, + 0xE0001ED3, 0xE0001EE2, 0xE0001EF1, 0xE0001F00, 0xE0001F0F, 0xE0001F1E, + 0xE0001F2D, 0xE0001F3C, 0xE0001F4B, 0xE0001F5A, 0xE0001F69, 0xE0001F78, + 0xE0001F87, 0xE0001F96, 0xE0001FA5, 0xE0001FB4, 0xE0001FC3, 0xE0001FD2, + 0x404A6220, 0xE0001D14, 0xE0001D23, 0xE0001D32, 0xE0001D41, 0xE0001D50, + 0xE0001D5F, 0xE0001D6E, 0xE0001D7D, 0xE0001D8C, 0xE0001D9B, 0xE0001DAA, + 0xE0001DB9, 0xE0001DC8, 0xE0001DD7, 0xE0001DE6, + // Block 10, offset 0x280 + 0xE0001DF5, 0xE0001E04, 0xE0001E13, 0xE0001E22, 0xE0001E31, 0xE0001E40, + 0xE0001E4F, 0xE0001E5E, 0xE0001E6D, 0xE0001E7C, 0xE0001E8B, 0xE0001E9A, + 0xE0001EA9, 0xE0001EB8, 0xE0001EC7, 0xE0001ED6, 0xE0001EE5, 0xE0001EF4, + 0xE0001F03, 0xE0001F12, 0xE0001F21, 0xE0001F30, 0xE0001F3F, 0xE0001F4E, + 0xE0001F5D, 0xE0001F6C, 0xE0001F7B, 0xE0001F8A, 0xE0001F99, 0xE0001FA8, + 0xE0001FB7, 0xE0001FC6, 0xE0001FD5, 0x404A6620, 0xE0001D17, 0xE0001D26, + 0xE0001D35, 0xE0001D44, 0xE0001D53, 0xE0001D62, 0xE0001D71, 0xE0001D80, + 0xE0001D8F, 0xE0001D9E, 0xE0001DAD, 0xE0001DBC, 0xE0001DCB, 0xE0001DDA, + 0xE0001DE9, 0xE0001DF8, 0xE0001E07, 0xE0001E16, 0xE0001E25, 0xE0001E34, + 0xE0001E43, 0xE0001E52, 0xE0001E61, 0xE0001E70, 0xE0001E7F, 0xE0001E8E, + 0xE0001E9D, 0xE0001EAC, 0xE0001EBB, 0xE0001ECA, + // Block 11, offset 0x2c0 + 0xE0001ED9, 0xE0001EE8, 0xE0001EF7, 0xE0001F06, 0xE0001F15, 0xE0001F24, + 0xE0001F33, 0xE0001F42, 0xE0001F51, 0xE0001F60, 0xE0001F6F, 0xE0001F7E, + 0xE0001F8D, 0xE0001F9C, 0xE0001FAB, 0xE0001FBA, 0xE0001FC9, 0xE0001FD8, + 0x404A6820, 0xE0001D1A, 0xE0001D29, 0xE0001D38, 0xE0001D47, 0xE0001D56, + 0xE0001D65, 0xE0001D74, 0xE0001D83, 0xE0001D92, 0xE0001DA1, 0xE0001DB0, + 0xE0001DBF, 0xE0001DCE, 0xE0001DDD, 0xE0001DEC, 0xE0001DFB, 0xE0001E0A, + 0xE0001E19, 0xE0001E28, 0xE0001E37, 0xE0001E46, 0xE0001E55, 0xE0001E64, + 0xE0001E73, 0xE0001E82, 0xE0001E91, 0xE0001EA0, 0xE0001EAF, 0xE0001EBE, + 0xE0001ECD, 0xE0001EDC, 0xE0001EEB, 0xE0001EFA, 0xE0001F09, 0xE0001F18, + 0xE0001F27, 0xE0001F36, 0xE0001F45, 0xE0001F54, 0xE0001F63, 0xE0001F72, + 0xE0001F81, 0xE0001F90, 0xE0001F9F, 0xE0001FAE, + // Block 12, offset 0x300 + 0xE0001FBD, 0xE0001FCC, 0xE0001FDB, 0x404AEA20, 0xE000200E, 0xE0002011, + 0x404B2620, 0x404B2420, 0x404B2620, 0x404AF020, 0xE0002014, 0xE0002017, + 0x404B2A20, 0x404B2820, 0x404B2A20, 0x8281258B, 0x8281258D, 0x82812591, + 0x8281258F, 0x404ECA20, 0x404ECC20, 0x404F9C20, 0x404F9620, 0x404F9E20, + 0x404F9820, 0x40522620, 0x40522820, 0x40522A20, 0x40522C20, 0x40522E20, + 0x40523020, 0x40523220, 0x40523420, 0x40523620, 0x40523820, 0x40523E20, + 0x40524020, 0x40529C20, 0x40529E20, 0x4052A020, 0x4052A220, 0x4052A420, + 0x4052A820, 0x4052A620, 0x4052AA20, 0x4052AC20, 0x4052AE20, 0x40094220, + 0x40094420, 0x40393820, 0x40393A21, 0x40393A22, 0x40393A23, 0x403A7420, + 0x403A7621, 0x403A9020, 0x403A9221, 0x402C3A20, 0x402C3C20, 0x002C3A88, + 0x002C3C83, 0x402D2220, 0x402D2420, 0x002D2288, + // Block 13, offset 0x340 + 0x002D2483, 0x002D9883, 0x002D9A83, 0x402EE220, 0x402EE420, 0x002EE288, + 0x002EE483, 0x402FE620, 0x402FE820, 0x002FE688, 0x002FE883, 0x40306C20, + 0x40306E20, 0x00306C88, 0x00306E83, 0x402E2220, 0x402E2420, 0x402E2420, + 0x002E2288, 0x002E2483, 0x002E2483, 0x402BDE20, 0x402BE020, 0x002BDE88, + 0x002BE083, 0x402C6220, 0x402C6420, 0x002C6288, 0x002C6483, 0x402C9820, + 0x402C9A20, 0x402C9C20, 0x002C9888, 0x002C9A83, 0x002C9C83, 0x402D9A20, + 0x402D9C20, 0x002D9A88, 0x002D9C83, 0x402E9E20, 0x402EA020, 0x002E9E88, + 0x002EA083, 0x402F7A20, 0x402F7C20, 0x002F7A88, 0x002F7C83, 0x40302C20, + 0x40302E20, 0x00302C88, 0x00302E83, 0x40306C20, 0x40306E20, 0x40307020, + 0x00306C88, 0x00306E83, 0x00307083, 0x40310020, 0x40310220, 0x00310088, + 0x00310283, 0x40312A20, 0x40312C20, 0x00312A88, + // Block 14, offset 0x380 + 0x00312C83, 0x40306C20, 0x40310021, 0x40310022, 0x00306C88, 0x003100A3, + 0x003100C3, 0x402BDE20, 0x40320C21, 0x40321020, 0x00321084, 0x002BDE88, + 0x00320CA3, 0x00321083, 0x00321086, 0x00321085, 0x402C9820, 0x40320C22, + 0x002C9888, 0x00320CC3, 0x402EE220, 0x40320E21, 0x40320E22, 0x002EE288, + 0x00320EA3, 0x00320EC3, 0x402BDE20, 0xE00026B2, 0x002BDE88, 0xE00026B5, + 0x402EE220, 0xE00026C0, 0x002EE288, 0xE00026C3, 0x40306C20, 0xE00026D6, + 0x00306C88, 0xE00026D9, 0x402BDE20, 0x40320E20, 0x40320C20, 0x002BDE88, + 0x00320E83, 0x00320C83, 0x402EE220, 0x40321023, 0x40321020, 0x40321022, + 0x002EE288, 0x003210E3, 0x00321083, 0x003210C3, 0x402C3A20, 0x402C3E20, + 0x402C3C20, 0x002C3A88, 0x002C3E83, 0x002C3C83, 0x402C6220, 0x402C6420, + 0x402C6420, 0x002C6288, 0x002C6486, 0x002C6484, + // Block 15, offset 0x3c0 + 0x002C6486, 0x002C6484, 0x402E2220, 0xE0000CFB, 0xE0000CFB, 0x402E2420, + 0x002E2288, 0xE0000D01, 0xE0000D01, 0x002E2486, 0x002E2484, 0x002E9E88, + 0x002EA086, 0x002EA084, 0x402BDE20, 0x402C0820, 0x40320C21, 0x40321020, + 0x002BDE88, 0x002C0883, 0x00320CA3, 0x00321083, 0x402C9820, 0x402D0620, + 0x002C9888, 0x002D0683, 0x402D9A20, 0x402DCA20, 0x002D9A88, 0x002DCA83, + 0x402EE220, 0x402F2A20, 0x40320E20, 0x002EE288, 0x002F2A83, 0x00320E83, + 0x40306C20, 0x4030BC20, 0x00306C88, 0x0030BC83, 0x40310020, 0x40312820, + 0x00310088, 0x00312883, 0x002DFE88, 0x002F56A3, 0x402BDE20, 0x40320C21, + 0x40321020, 0x002BDE88, 0x00320CA3, 0x00321083, 0x4062AC20, 0x4062AC21, + 0x4062B220, 0x4062B221, 0x4062BA20, 0x4062BA21, 0x4062BE20, 0x4062BE21, + 0x4062C420, 0x4062C421, 0x402BDE20, 0x40320C21, + // Block 16, offset 0x400 + 0x40321020, 0x40321021, 0x002BDE88, 0x00320CA3, 0x00321083, 0x003210A4, + 0x003210A3, 0x402BDE20, 0x402C0820, 0x40320E21, 0x40320C21, 0x40320E20, + 0x40320C20, 0x002BDE88, 0x002C0883, 0x00320EA3, 0x00320CA3, 0x00320E83, + 0x00320C83, 0x402C3A20, 0x402C5C20, 0x002C3A88, 0x002C5C83, 0x402C5E20, + 0x402C6020, 0x002C5E83, 0x002C6083, 0x402D2220, 0x402D6420, 0x002D2288, + 0x002D6483, 0x402DFE20, 0x402E2020, 0x002DFE88, 0x002E2083, 0x402E9E20, + 0x402EE021, 0x402EE022, 0x002E9E88, 0x002EE0A3, 0x002EE0C3, 0x402FE620, + 0x40302A20, 0x002FE688, 0x00302A83, 0x40312A20, 0x40320620, 0x00312A88, + 0x00320683, 0x402EE220, 0x40321023, 0x40321022, 0x40321020, 0x40321021, + 0x40321024, 0x002EE288, 0x003210E3, 0x003210C3, 0x00321083, 0x003210A3, + 0x00321103, 0x402BDE20, 0x402BE020, 0x402BE220, + // Block 17, offset 0x440 + 0x002BDE88, 0x002BE083, 0x002BE283, 0x402E2220, 0xE0000CFB, 0x402E2420, + 0x402E2620, 0xE0000CFB, 0x002E2288, 0xE0000D01, 0x002E2483, 0x002E2683, + 0xE0000D01, 0x402EE220, 0x402EE420, 0x402EE620, 0x002EE288, 0x002EE483, + 0x002EE683, 0x402F7A20, 0x402F7C20, 0x402F7E20, 0x002F7A88, 0x002F7C83, + 0x002F7E83, 0x402C9820, 0x40320E22, 0x002C9888, 0x00320EC3, 0x402EE220, + 0x40321024, 0x40321020, 0x40321022, 0x002EE288, 0x00321103, 0x00321083, + 0x003210C3, +} + +// mainValues: 37888 entries, 151552 bytes +// Block 2 is the null block. +var mainValues = [37888]uint32{ + // Block 0x0, offset 0x0 + 0x0000: 0xa0000000, 0x0001: 0xa0000000, 0x0002: 0xa0000000, 0x0003: 0xa0000000, + 0x0004: 0xa0000000, 0x0005: 0xa0000000, 0x0006: 0xa0000000, 0x0007: 0xa0000000, + 0x0008: 0xa0000000, 0x0009: 0x40020020, 0x000a: 0x40020220, 0x000b: 0x40020420, + 0x000c: 0x40020620, 0x000d: 0x40020820, 0x000e: 0xa0000000, 0x000f: 0xa0000000, + 0x0010: 0xa0000000, 0x0011: 0xa0000000, 0x0012: 0xa0000000, 0x0013: 0xa0000000, + 0x0014: 0xa0000000, 0x0015: 0xa0000000, 0x0016: 0xa0000000, 0x0017: 0xa0000000, + 0x0018: 0xa0000000, 0x0019: 0xa0000000, 0x001a: 0xa0000000, 0x001b: 0xa0000000, + 0x001c: 0xa0000000, 0x001d: 0xa0000000, 0x001e: 0xa0000000, 0x001f: 0xa0000000, + 0x0020: 0x40021220, 0x0021: 0x4002ba20, 0x0022: 0x4003e020, 0x0023: 0x4004ea20, + 0x0024: 0x4027de20, 0x0025: 0x4004ec20, 0x0026: 0x4004e620, 0x0027: 0x4003d220, + 0x0028: 0x4003f420, 0x0029: 0x4003f620, 0x002a: 0x4004d820, 0x002b: 0x40093820, + 0x002c: 0x40024020, 0x002d: 0x40021a20, 0x002e: 0x4002e420, 0x002f: 0x4004e220, + 0x0030: 0x4029cc20, 0x0031: 0x4029ce20, 0x0032: 0x4029d020, 0x0033: 0x4029d220, + 0x0034: 0x4029d420, 0x0035: 0x4029d620, 0x0036: 0x4029d820, 0x0037: 0x4029da20, + 0x0038: 0x4029dc20, 0x0039: 0x4029de20, 0x003a: 0x40026c20, 0x003b: 0x40026220, + 0x003c: 0x40094020, 0x003d: 0x40094220, 0x003e: 0x40094420, 0x003f: 0x4002c420, + // Block 0x1, offset 0x40 + 0x0040: 0x4004d620, 0x0041: 0x002bde88, 0x0042: 0x002c0a88, 0x0043: 0x002c3a88, + 0x0044: 0x002c6288, 0x0045: 0x002c9888, 0x0046: 0x002d0888, 0x0047: 0x002d2288, + 0x0048: 0x002d6888, 0x0049: 0x002d9a88, 0x004a: 0x002dcc88, 0x004b: 0x002dfe88, + 0x004c: 0xc0030002, 0x004d: 0x002e8288, 0x004e: 0x002e9e88, 0x004f: 0x002ee288, + 0x0050: 0x002f2c88, 0x0051: 0x002f5688, 0x0052: 0x002f7a88, 0x0053: 0x002fe688, + 0x0054: 0x00302c88, 0x0055: 0x00306c88, 0x0056: 0x0030be88, 0x0057: 0x0030e288, + 0x0058: 0x0030f688, 0x0059: 0x00310088, 0x005a: 0x00312a88, 0x005b: 0x4003f820, + 0x005c: 0x4004e420, 0x005d: 0x4003fa20, 0x005e: 0x40062420, 0x005f: 0x40021620, + 0x0060: 0x40061e20, 0x0061: 0x402bde20, 0x0062: 0x402c0a20, 0x0063: 0x402c3a20, + 0x0064: 0x402c6220, 0x0065: 0x402c9820, 0x0066: 0x402d0820, 0x0067: 0x402d2220, + 0x0068: 0x402d6820, 0x0069: 0x402d9a20, 0x006a: 0x402dcc20, 0x006b: 0x402dfe20, + 0x006c: 0xc0000002, 0x006d: 0x402e8220, 0x006e: 0x402e9e20, 0x006f: 0x402ee220, + 0x0070: 0x402f2c20, 0x0071: 0x402f5620, 0x0072: 0x402f7a20, 0x0073: 0x402fe620, + 0x0074: 0x40302c20, 0x0075: 0x40306c20, 0x0076: 0x4030be20, 0x0077: 0x4030e220, + 0x0078: 0x4030f620, 0x0079: 0x40310020, 0x007a: 0x40312a20, 0x007b: 0x4003fc20, + 0x007c: 0x40094820, 0x007d: 0x4003fe20, 0x007e: 0x40094c20, 0x007f: 0xa0000000, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0x00c0: 0xa0000000, 0x00c1: 0xa0000000, 0x00c2: 0xa0000000, 0x00c3: 0xa0000000, + 0x00c4: 0xa0000000, 0x00c5: 0x40020a20, 0x00c6: 0xa0000000, 0x00c7: 0xa0000000, + 0x00c8: 0xa0000000, 0x00c9: 0xa0000000, 0x00ca: 0xa0000000, 0x00cb: 0xa0000000, + 0x00cc: 0xa0000000, 0x00cd: 0xa0000000, 0x00ce: 0xa0000000, 0x00cf: 0xa0000000, + 0x00d0: 0xa0000000, 0x00d1: 0xa0000000, 0x00d2: 0xa0000000, 0x00d3: 0xa0000000, + 0x00d4: 0xa0000000, 0x00d5: 0xa0000000, 0x00d6: 0xa0000000, 0x00d7: 0xa0000000, + 0x00d8: 0xa0000000, 0x00d9: 0xa0000000, 0x00da: 0xa0000000, 0x00db: 0xa0000000, + 0x00dc: 0xa0000000, 0x00dd: 0xa0000000, 0x00de: 0xa0000000, 0x00df: 0xa0000000, + 0x00e0: 0x0002129b, 0x00e1: 0x4002bc20, 0x00e2: 0x4027dc20, 0x00e3: 0x4027e020, + 0x00e4: 0x4027da20, 0x00e5: 0x4027e220, 0x00e6: 0x40094a20, 0x00e7: 0x4004ce20, + 0x00e8: 0x40062c20, 0x00e9: 0x40081820, 0x00ea: 0x002bde94, 0x00eb: 0x4003f020, + 0x00ec: 0x40094620, 0x00ed: 0xa0000000, 0x00ee: 0x40081a20, 0x00ef: 0x40062620, + 0x00f0: 0x40070420, 0x00f1: 0x40093a20, 0x00f2: 0x0029d094, 0x00f3: 0x0029d294, + 0x00f4: 0x40062020, 0x00f5: 0x00327684, 0x00f6: 0x4004d220, 0x00f7: 0x40030620, + 0x00f8: 0x40063220, 0x00f9: 0x0029ce94, 0x00fa: 0x002ee294, 0x00fb: 0x4003f220, + 0x00fc: 0xe00002bf, 0x00fd: 0xe00002b7, 0x00fe: 0xe00004a7, 0x00ff: 0x4002c620, + // Block 0x4, offset 0x100 + 0x0100: 0xe00008f5, 0x0101: 0xe00008ef, 0x0102: 0xe0000921, 0x0103: 0xe0000969, + 0x0104: 0xe000095b, 0x0105: 0xe000094d, 0x0106: 0xe00009dd, 0x0107: 0xe0000a53, + 0x0108: 0xe0000ae8, 0x0109: 0xe0000ae2, 0x010a: 0xe0000af4, 0x010b: 0xe0000b20, + 0x010c: 0xe0000c2b, 0x010d: 0xe0000c25, 0x010e: 0xe0000c37, 0x010f: 0xe0000c43, + 0x0110: 0xe0000ab3, 0x0111: 0xe0000d63, 0x0112: 0xe0000d9a, 0x0113: 0xe0000d94, + 0x0114: 0xe0000da6, 0x0115: 0xe0000de6, 0x0116: 0xe0000dd2, 0x0117: 0x40093e20, + 0x0118: 0xe0000e12, 0x0119: 0xe0000fe1, 0x011a: 0xe0000fdb, 0x011b: 0xe0000fed, + 0x011c: 0xe0000fff, 0x011d: 0xe0001102, 0x011e: 0x00318888, 0x011f: 0xe0000f7b, + 0x0120: 0xe00008f2, 0x0121: 0xe00008ec, 0x0122: 0xe000091e, 0x0123: 0xe0000966, + 0x0124: 0xe0000958, 0x0125: 0xe000094a, 0x0126: 0xe00009d5, 0x0127: 0xe0000a4d, + 0x0128: 0xe0000ae5, 0x0129: 0xe0000adf, 0x012a: 0xe0000af1, 0x012b: 0xe0000b1d, + 0x012c: 0xe0000c28, 0x012d: 0xe0000c22, 0x012e: 0xe0000c34, 0x012f: 0xe0000c40, + 0x0130: 0xe0000aad, 0x0131: 0xe0000d60, 0x0132: 0xe0000d97, 0x0133: 0xe0000d91, + 0x0134: 0xe0000da3, 0x0135: 0xe0000de3, 0x0136: 0xe0000dcf, 0x0137: 0x40093c20, + 0x0138: 0xe0000e0f, 0x0139: 0xe0000fde, 0x013a: 0xe0000fd8, 0x013b: 0xe0000fea, + 0x013c: 0xe0000ffc, 0x013d: 0xe00010ff, 0x013e: 0x40318820, 0x013f: 0xe0001114, + // Block 0x5, offset 0x140 + 0x0140: 0xe0000983, 0x0141: 0xe0000980, 0x0142: 0xe00008fb, 0x0143: 0xe00008f8, + 0x0144: 0xe000097d, 0x0145: 0xe000097a, 0x0146: 0xe0000a38, 0x0147: 0xe0000a35, + 0x0148: 0xe0000a3e, 0x0149: 0xe0000a3b, 0x014a: 0xe0000a4a, 0x014b: 0xe0000a47, + 0x014c: 0xe0000a44, 0x014d: 0xe0000a41, 0x014e: 0xe0000a86, 0x014f: 0xe0000a83, + 0x0150: 0xe0000aaa, 0x0151: 0xe0000aa7, 0x0152: 0xe0000b46, 0x0153: 0xe0000b43, + 0x0154: 0xe0000aee, 0x0155: 0xe0000aeb, 0x0156: 0xe0000b2c, 0x0157: 0xe0000b29, + 0x0158: 0xe0000b40, 0x0159: 0xe0000b3d, 0x015a: 0xe0000b1a, 0x015b: 0xe0000b17, + 0x015c: 0xe0000bb8, 0x015d: 0xe0000bb5, 0x015e: 0xe0000bb2, 0x015f: 0xe0000baf, + 0x0160: 0xe0000bc4, 0x0161: 0xe0000bc1, 0x0162: 0xe0000bca, 0x0163: 0xe0000bc7, + 0x0164: 0xe0000bee, 0x0165: 0xe0000beb, 0x0166: 0xe0000c1b, 0x0167: 0xe0000c18, + 0x0168: 0xe0000c51, 0x0169: 0xe0000c4e, 0x016a: 0xe0000c60, 0x016b: 0xe0000c5d, + 0x016c: 0xe0000c31, 0x016d: 0xe0000c2e, 0x016e: 0xe0000c5a, 0x016f: 0xe0000c57, + 0x0170: 0xe0000c54, 0x0171: 0x402da220, 0x0172: 0xf0000a0a, 0x0173: 0xf0000404, + 0x0174: 0xe0000c8a, 0x0175: 0xe0000c87, 0x0176: 0xe0000c9f, 0x0177: 0xe0000c9c, + 0x0178: 0x402f7220, 0x0179: 0xe0000ccc, 0x017a: 0xe0000cc9, 0x017b: 0xe0000cd8, + 0x017c: 0xe0000cd5, 0x017d: 0xe0000cd2, 0x017e: 0xe0000ccf, 0x017f: 0xe0000d04, + // Block 0x6, offset 0x180 + 0x0180: 0xe0000cfe, 0x0181: 0xe0000cf8, 0x0182: 0xe0000cf5, 0x0183: 0xe0000d51, + 0x0184: 0xe0000d4e, 0x0185: 0xe0000d6f, 0x0186: 0xe0000d6c, 0x0187: 0xe0000d5d, + 0x0188: 0xe0000d5a, 0x0189: 0xf0000404, 0x018a: 0x002eda88, 0x018b: 0x402eda20, + 0x018c: 0xe0000e2e, 0x018d: 0xe0000e2b, 0x018e: 0xe0000da0, 0x018f: 0xe0000d9d, + 0x0190: 0xe0000de0, 0x0191: 0xe0000ddd, 0x0192: 0xe0000e93, 0x0193: 0xe0000e8f, + 0x0194: 0xe0000eca, 0x0195: 0xe0000ec7, 0x0196: 0xe0000edc, 0x0197: 0xe0000ed9, + 0x0198: 0xe0000ed0, 0x0199: 0xe0000ecd, 0x019a: 0xe0000f1f, 0x019b: 0xe0000f1c, + 0x019c: 0xe0000f2d, 0x019d: 0xe0000f2a, 0x019e: 0xe0000f47, 0x019f: 0xe0000f44, + 0x01a0: 0xe0000f33, 0x01a1: 0xe0000f30, 0x01a2: 0xe0000f99, 0x01a3: 0xe0000f96, + 0x01a4: 0xe0000f8a, 0x01a5: 0xe0000f87, 0x01a6: 0x00303688, 0x01a7: 0x40303620, + 0x01a8: 0xe000102b, 0x01a9: 0xe0001028, 0x01aa: 0xe000103f, 0x01ab: 0xe000103c, + 0x01ac: 0xe0000fe7, 0x01ad: 0xe0000fe4, 0x01ae: 0xe0000ff9, 0x01af: 0xe0000ff6, + 0x01b0: 0xe0001025, 0x01b1: 0xe0001022, 0x01b2: 0xe0001039, 0x01b3: 0xe0001036, + 0x01b4: 0xe00010d8, 0x01b5: 0xe00010d5, 0x01b6: 0xe000110e, 0x01b7: 0xe000110b, + 0x01b8: 0xe0001117, 0x01b9: 0xe000113b, 0x01ba: 0xe0001138, 0x01bb: 0xe000114d, + 0x01bc: 0xe000114a, 0x01bd: 0xe0001147, 0x01be: 0xe0001144, 0x01bf: 0xe0000f64, + // Block 0x7, offset 0x1c0 + 0x01c0: 0x402c1a20, 0x01c1: 0x002c2a88, 0x01c2: 0x002c3288, 0x01c3: 0x402c3220, + 0x01c4: 0x0031c488, 0x01c5: 0x4031c420, 0x01c6: 0x002efa88, 0x01c7: 0x002c4e88, + 0x01c8: 0x402c4e20, 0x01c9: 0x002c7288, 0x01ca: 0x002c7a88, 0x01cb: 0x002c8488, + 0x01cc: 0x402c8420, 0x01cd: 0xe000115c, 0x01ce: 0x002cae88, 0x01cf: 0x002cb888, + 0x01d0: 0x002cc288, 0x01d1: 0x002d1688, 0x01d2: 0x402d1620, 0x01d3: 0x002d4488, + 0x01d4: 0x002d5888, 0x01d5: 0x402d7820, 0x01d6: 0x002dc288, 0x01d7: 0x002db688, + 0x01d8: 0x002e0a88, 0x01d9: 0x402e0a20, 0x01da: 0x402e3820, 0x01db: 0x402e7220, + 0x01dc: 0x0030a088, 0x01dd: 0x002eb488, 0x01de: 0x402ebc20, 0x01df: 0x002f1088, + 0x01e0: 0xe0000e56, 0x01e1: 0xe0000e53, 0x01e2: 0x002d6088, 0x01e3: 0x402d6020, + 0x01e4: 0x002f3e88, 0x01e5: 0x402f3e20, 0x01e6: 0x002f8288, 0x01e7: 0x0031b488, + 0x01e8: 0x4031b420, 0x01e9: 0x00300888, 0x01ea: 0x40301220, 0x01eb: 0x40304220, + 0x01ec: 0x00304a88, 0x01ed: 0x40304a20, 0x01ee: 0x00305288, 0x01ef: 0xe000105f, + 0x01f0: 0xe000105c, 0x01f1: 0x0030b488, 0x01f2: 0x0030cc88, 0x01f3: 0x00311888, + 0x01f4: 0x40311820, 0x01f5: 0x00313488, 0x01f6: 0x40313420, 0x01f7: 0x00316488, + 0x01f8: 0x00316e88, 0x01f9: 0x40316e20, 0x01fa: 0x40317820, 0x01fb: 0x4031a620, + 0x01fc: 0x0031bc88, 0x01fd: 0x4031bc20, 0x01fe: 0xe0000fc9, 0x01ff: 0x40319420, + // Block 0x8, offset 0x200 + 0x0200: 0x40321220, 0x0201: 0x40321a20, 0x0202: 0x40322220, 0x0203: 0x40322a20, + 0x0204: 0xe0000ad5, 0x0205: 0xe0000ad1, 0x0206: 0xe0000acd, 0x0207: 0xf0000a0a, + 0x0208: 0xf000040a, 0x0209: 0xf0000404, 0x020a: 0xf0000a0a, 0x020b: 0xf000040a, + 0x020c: 0xf0000404, 0x020d: 0xe0000947, 0x020e: 0xe0000944, 0x020f: 0xe0000c3d, + 0x0210: 0xe0000c3a, 0x0211: 0xe0000dcc, 0x0212: 0xe0000dc9, 0x0213: 0xe0000ff3, + 0x0214: 0xe0000ff0, 0x0215: 0xe000101e, 0x0216: 0xe000101a, 0x0217: 0xe0001006, + 0x0218: 0xe0001002, 0x0219: 0xe0001016, 0x021a: 0xe0001012, 0x021b: 0xe000100e, + 0x021c: 0xe000100a, 0x021d: 0x402cae20, 0x021e: 0xe0000962, 0x021f: 0xe000095e, + 0x0220: 0xe0000976, 0x0221: 0xe0000972, 0x0222: 0xe00009f4, 0x0223: 0xe00009ef, + 0x0224: 0x002d3a88, 0x0225: 0x402d3a20, 0x0226: 0xe0000bbe, 0x0227: 0xe0000bbb, + 0x0228: 0xe0000c99, 0x0229: 0xe0000c96, 0x022a: 0xe0000e20, 0x022b: 0xe0000e1d, + 0x022c: 0xe0000e27, 0x022d: 0xe0000e23, 0x022e: 0xe0001162, 0x022f: 0xe000115f, + 0x0230: 0xe0000c8d, 0x0231: 0xf0000a0a, 0x0232: 0xf000040a, 0x0233: 0xf0000404, + 0x0234: 0xe0000bac, 0x0235: 0xe0000ba9, 0x0236: 0x002d7888, 0x0237: 0x00319488, + 0x0238: 0xe0000d57, 0x0239: 0xe0000d54, 0x023a: 0xe0000954, 0x023b: 0xe0000950, + 0x023c: 0xe00009ea, 0x023d: 0xe00009e5, 0x023e: 0xe0000e19, 0x023f: 0xe0000e15, + // Block 0x9, offset 0x240 + 0x0240: 0xe000098f, 0x0241: 0xe000098c, 0x0242: 0xe0000995, 0x0243: 0xe0000992, + 0x0244: 0xe0000b62, 0x0245: 0xe0000b5f, 0x0246: 0xe0000b68, 0x0247: 0xe0000b65, + 0x0248: 0xe0000c6c, 0x0249: 0xe0000c69, 0x024a: 0xe0000c72, 0x024b: 0xe0000c6f, + 0x024c: 0xe0000e4a, 0x024d: 0xe0000e47, 0x024e: 0xe0000e50, 0x024f: 0xe0000e4d, + 0x0250: 0xe0000ee8, 0x0251: 0xe0000ee5, 0x0252: 0xe0000eee, 0x0253: 0xe0000eeb, + 0x0254: 0xe0001053, 0x0255: 0xe0001050, 0x0256: 0xe0001059, 0x0257: 0xe0001056, + 0x0258: 0xe0000f61, 0x0259: 0xe0000f5e, 0x025a: 0xe0000fa5, 0x025b: 0xe0000fa2, + 0x025c: 0x00312288, 0x025d: 0x40312220, 0x025e: 0xe0000bf4, 0x025f: 0xe0000bf1, + 0x0260: 0x002ebc88, 0x0261: 0x402c8c20, 0x0262: 0x002f2288, 0x0263: 0x402f2220, + 0x0264: 0x00314088, 0x0265: 0x40314020, 0x0266: 0xe000096f, 0x0267: 0xe000096c, + 0x0268: 0xe0000b32, 0x0269: 0xe0000b2f, 0x026a: 0xe0000dd9, 0x026b: 0xe0000dd5, + 0x026c: 0xe0000dfd, 0x026d: 0xe0000df9, 0x026e: 0xe0000e04, 0x026f: 0xe0000e01, + 0x0270: 0xe0000e0b, 0x0271: 0xe0000e07, 0x0272: 0xe0001129, 0x0273: 0xe0001126, + 0x0274: 0x402e5e20, 0x0275: 0x402ed020, 0x0276: 0x40305a20, 0x0277: 0x402dd420, + 0x0278: 0xe0000abf, 0x0279: 0xe0000ec4, 0x027a: 0x002be888, 0x027b: 0x002c4488, + 0x027c: 0x402c4420, 0x027d: 0x002e3888, 0x027e: 0x00303e88, 0x027f: 0x402ffc20, + // Block 0xa, offset 0x280 + 0x0280: 0x40315820, 0x0281: 0x0031d488, 0x0282: 0x4031d420, 0x0283: 0x002c1a88, + 0x0284: 0x00307c88, 0x0285: 0x0030da88, 0x0286: 0x002ca288, 0x0287: 0x402ca220, + 0x0288: 0x002dde88, 0x0289: 0x402dde20, 0x028a: 0x002f6a88, 0x028b: 0x402f6a20, + 0x028c: 0x002f8e88, 0x028d: 0x402f8e20, 0x028e: 0x00311088, 0x028f: 0x40311020, + 0x0290: 0x402bf020, 0x0291: 0x402bf820, 0x0292: 0x402c0220, 0x0293: 0x402c2a20, + 0x0294: 0x402efa20, 0x0295: 0x402c5620, 0x0296: 0x402c7220, 0x0297: 0x402c7a20, + 0x0298: 0x402ccc20, 0x0299: 0x402cb820, 0x029a: 0x402cd420, 0x029b: 0x402cc220, + 0x029c: 0x402cdc20, 0x029d: 0x402ce820, 0x029e: 0x402cf020, 0x029f: 0x402dee20, + 0x02a0: 0x402d4420, 0x02a1: 0x402d2a20, 0x02a2: 0x402d3220, 0x02a3: 0x402d5820, + 0x02a4: 0x402d0020, 0x02a5: 0x40308820, 0x02a6: 0x402d8020, 0x02a7: 0x402d8e20, + 0x02a8: 0x402db620, 0x02a9: 0x402dc220, 0x02aa: 0x402daa20, 0x02ab: 0x402e4220, + 0x02ac: 0x402e4a20, 0x02ad: 0x402e5420, 0x02ae: 0x402e6820, 0x02af: 0x4030a020, + 0x02b0: 0x4030ac20, 0x02b1: 0x402e9020, 0x02b2: 0x402eb420, 0x02b3: 0x402ec820, + 0x02b4: 0x402ea620, 0x02b5: 0x402f1020, 0x02b6: 0x402eee20, 0x02b7: 0x402f1a20, + 0x02b8: 0x402f4c20, 0x02b9: 0x402f9820, 0x02ba: 0x402fa220, 0x02bb: 0x402fac20, + 0x02bc: 0x402fb620, 0x02bd: 0x402fbe20, 0x02be: 0x402fc620, 0x02bf: 0x402fd020, + // Block 0xb, offset 0x2c0 + 0x02c0: 0x402f8220, 0x02c1: 0x402fd820, 0x02c2: 0x402ff420, 0x02c3: 0x40300820, + 0x02c4: 0x402df620, 0x02c5: 0x40301a20, 0x02c6: 0x40302420, 0x02c7: 0x40306420, + 0x02c8: 0x40305220, 0x02c9: 0x40307c20, 0x02ca: 0x4030b420, 0x02cb: 0x4030cc20, + 0x02cc: 0x4030da20, 0x02cd: 0x4030ee20, 0x02ce: 0x402e7a20, 0x02cf: 0x40310820, + 0x02d0: 0x40314820, 0x02d1: 0x40315020, 0x02d2: 0x40316420, 0x02d3: 0x40318020, + 0x02d4: 0x4031cc20, 0x02d5: 0x4031e820, 0x02d6: 0x40320a20, 0x02d7: 0x40323220, + 0x02d8: 0x40323a20, 0x02d9: 0x402c1220, 0x02da: 0x402cf820, 0x02db: 0x402d4c20, + 0x02dc: 0x402d7020, 0x02dd: 0x402de620, 0x02de: 0x402e1a20, 0x02df: 0x402e2a20, + 0x02e0: 0x402f6220, 0x02e1: 0x4031fa20, 0x02e2: 0x40320220, 0x02e3: 0xe0000aca, + 0x02e4: 0xe0000adc, 0x02e5: 0xe0000ad9, 0x02e6: 0xe0000fcc, 0x02e7: 0xe0000fcf, + 0x02e8: 0xe0000fba, 0x02e9: 0xe0000ba1, 0x02ea: 0xe0000d11, 0x02eb: 0xe0000d18, + 0x02ec: 0x40324220, 0x02ed: 0x40324a20, 0x02ee: 0x40309020, 0x02ef: 0x40309820, + 0x02f0: 0x002d6894, 0x02f1: 0x002d8094, 0x02f2: 0x002dcc94, 0x02f3: 0x002f7a94, + 0x02f4: 0x002f9894, 0x02f5: 0x002fac94, 0x02f6: 0x002fd894, 0x02f7: 0x0030e294, + 0x02f8: 0x00310094, 0x02f9: 0x40064020, 0x02fa: 0x40064420, 0x02fb: 0x402d9620, + 0x02fc: 0x4031de20, 0x02fd: 0x402d9820, 0x02fe: 0x4031e220, 0x02ff: 0x4031f020, + // Block 0xc, offset 0x300 + 0x0300: 0x4031dc20, 0x0301: 0x4031f220, 0x0302: 0x40064620, 0x0303: 0x40064820, + 0x0304: 0x40064a20, 0x0305: 0x40064c20, 0x0306: 0x40064e20, 0x0307: 0x40065020, + 0x0308: 0x40065220, 0x0309: 0x40065420, 0x030a: 0x40065620, 0x030b: 0x40065820, + 0x030c: 0x40065a20, 0x030d: 0x40065c20, 0x030e: 0x40065e20, 0x030f: 0x40066020, + 0x0310: 0x4027b220, 0x0311: 0x4027b420, 0x0312: 0x40066220, 0x0313: 0x40066420, + 0x0314: 0x40066620, 0x0315: 0x40066820, 0x0316: 0x40066a20, 0x0317: 0x40066c20, + 0x0318: 0x40062820, 0x0319: 0x40062a20, 0x031a: 0x40062e20, 0x031b: 0x40063420, + 0x031c: 0x40062220, 0x031d: 0x40063020, 0x031e: 0x40066e20, 0x031f: 0x40067020, + 0x0320: 0x002d5894, 0x0321: 0x002e2294, 0x0322: 0x002fe694, 0x0323: 0x0030f694, + 0x0324: 0x0031e894, 0x0325: 0x40067220, 0x0326: 0x40067420, 0x0327: 0x40067620, + 0x0328: 0x40067820, 0x0329: 0x40067a20, 0x032a: 0x40067c20, 0x032b: 0x40067e20, + 0x032c: 0x40068020, 0x032d: 0x40068220, 0x032e: 0x4031e020, 0x032f: 0x40068420, + 0x0330: 0x40068620, 0x0331: 0x40068820, 0x0332: 0x40068a20, 0x0333: 0x40068c20, + 0x0334: 0x40068e20, 0x0335: 0x40069020, 0x0336: 0x40069220, 0x0337: 0x40069420, + 0x0338: 0x40069620, 0x0339: 0x40069820, 0x033a: 0x40069a20, 0x033b: 0x40069c20, + 0x033c: 0x40069e20, 0x033d: 0x4006a020, 0x033e: 0x4006a220, 0x033f: 0x4006a420, + // Block 0xd, offset 0x340 + 0x0340: 0xae603502, 0x0341: 0xae603202, 0x0342: 0xae603c02, 0x0343: 0xae604e02, + 0x0344: 0xae605b02, 0x0345: 0xae606302, 0x0346: 0xae603702, 0x0347: 0xae605202, + 0x0348: 0xae604702, 0x0349: 0xae606402, 0x034a: 0xae604302, 0x034b: 0xae604d02, + 0x034c: 0xae604102, 0x034d: 0xae605f02, 0x034e: 0xae605f02, 0x034f: 0xae606502, + 0x0350: 0xae606602, 0x0351: 0xae606702, 0x0352: 0xae605f02, 0x0353: 0xae602202, + 0x0354: 0xae602a02, 0x0355: 0xae805f02, 0x0356: 0xadc06002, 0x0357: 0xadc06002, + 0x0358: 0xadc06002, 0x0359: 0xadc06002, 0x035a: 0xae805f02, 0x035b: 0xad806802, + 0x035c: 0xadc06002, 0x035d: 0xadc06002, 0x035e: 0xadc06002, 0x035f: 0xadc06002, + 0x0360: 0xadc06002, 0x0361: 0xaca06e02, 0x0362: 0xaca06f02, 0x0363: 0xadc07002, + 0x0364: 0xadc07502, 0x0365: 0xadc07602, 0x0366: 0xadc07702, 0x0367: 0xaca05602, + 0x0368: 0xaca05902, 0x0369: 0xadc06002, 0x036a: 0xadc06002, 0x036b: 0xadc06002, + 0x036c: 0xadc06002, 0x036d: 0xadc07802, 0x036e: 0xadc07902, 0x036f: 0xadc06002, + 0x0370: 0xadc07a02, 0x0371: 0xadc07b02, 0x0372: 0xadc02102, 0x0373: 0xadc06002, + 0x0374: 0xa0107c02, 0x0375: 0xa0107d02, 0x0376: 0xa0106102, 0x0377: 0xa0106102, + 0x0378: 0xa0105402, 0x0379: 0xadc07e02, 0x037a: 0xadc06002, 0x037b: 0xadc06002, + 0x037c: 0xadc06002, 0x037d: 0xae605f02, 0x037e: 0xae605f02, 0x037f: 0xae605f02, + // Block 0xe, offset 0x380 + 0x0380: 0xae603502, 0x0381: 0xae603202, 0x0382: 0xae604502, 0x0383: 0xae602202, + 0x0384: 0xe0000000, 0x0385: 0xaf007f02, 0x0386: 0xae605f02, 0x0387: 0xadc06002, + 0x0388: 0xadc06002, 0x0389: 0xadc06002, 0x038a: 0xae605f02, 0x038b: 0xae605f02, + 0x038c: 0xae605f02, 0x038d: 0xadc06002, 0x038e: 0xadc06002, 0x038f: 0xa0000000, + 0x0390: 0xae605f02, 0x0391: 0xae605f02, 0x0392: 0xae605f02, 0x0393: 0xadc06002, + 0x0394: 0xadc06002, 0x0395: 0xadc06002, 0x0396: 0xadc06002, 0x0397: 0xae605f02, + 0x0398: 0xae808002, 0x0399: 0xadc06002, 0x039a: 0xadc06002, 0x039b: 0xae605f02, + 0x039c: 0xae906002, 0x039d: 0xaea05f02, 0x039e: 0xaea05f02, 0x039f: 0xae906002, + 0x03a0: 0xaea08102, 0x03a1: 0xaea08202, 0x03a2: 0xae906002, 0x03a3: 0x84e615ef, + 0x03a4: 0x84e6164c, 0x03a5: 0x84e616cd, 0x03a6: 0x84e61771, 0x03a7: 0x84e61836, + 0x03a8: 0x84e6161d, 0x03a9: 0x84e61631, 0x03aa: 0x84e616b4, 0x03ab: 0x84e61741, + 0x03ac: 0x84e617bd, 0x03ad: 0x84e61816, 0x03ae: 0x84e6185f, 0x03af: 0x84e6187b, + 0x03b0: 0x00326688, 0x03b1: 0x40326620, 0x03b2: 0x0032a688, 0x03b3: 0x4032a620, + 0x03b4: 0x40064020, 0x03b5: 0x40064220, 0x03b6: 0x00326088, 0x03b7: 0x40326020, + 0x03ba: 0x00326c84, 0x03bb: 0x40329220, + 0x03bc: 0x40329020, 0x03bd: 0x40329420, 0x03be: 0x40026220, + // Block 0xf, offset 0x3c0 + 0x03c4: 0x40062020, 0x03c5: 0xe00000ab, 0x03c6: 0xe00011f0, 0x03c7: 0x40030620, + 0x03c8: 0xe0001249, 0x03c9: 0xe00012dd, 0x03ca: 0xe000133a, + 0x03cc: 0xe000139b, 0x03ce: 0xe00013dd, 0x03cf: 0xe0001492, + 0x03d0: 0xe0001352, 0x03d1: 0x00325288, 0x03d2: 0x00325488, 0x03d3: 0x00325688, + 0x03d4: 0x00325a88, 0x03d5: 0x00325c88, 0x03d6: 0x00326488, 0x03d7: 0x00326888, + 0x03d8: 0x00326a88, 0x03d9: 0x00326c88, 0x03da: 0x00327088, 0x03db: 0x00327288, + 0x03dc: 0x00327688, 0x03dd: 0x00327888, 0x03de: 0x00327a88, 0x03df: 0x00327c88, + 0x03e0: 0x00327e88, 0x03e1: 0x00328888, 0x03e3: 0x00328e88, + 0x03e4: 0x00329688, 0x03e5: 0x00329888, 0x03e6: 0x00329a88, 0x03e7: 0x00329c88, + 0x03e8: 0x00329e88, 0x03e9: 0x0032a288, 0x03ea: 0xe000134f, 0x03eb: 0xe00013f2, + 0x03ec: 0xe00011ed, 0x03ed: 0xe0001246, 0x03ee: 0xe00012da, 0x03ef: 0xe0001337, + 0x03f0: 0xe00013f5, 0x03f1: 0x40325220, 0x03f2: 0x40325420, 0x03f3: 0x40325620, + 0x03f4: 0x40325a20, 0x03f5: 0x40325c20, 0x03f6: 0x40326420, 0x03f7: 0x40326820, + 0x03f8: 0x40326a20, 0x03f9: 0x40326c20, 0x03fa: 0x40327020, 0x03fb: 0x40327220, + 0x03fc: 0x40327620, 0x03fd: 0x40327820, 0x03fe: 0x40327a20, 0x03ff: 0x40327c20, + // Block 0x10, offset 0x400 + 0x0400: 0x40327e20, 0x0401: 0x40328820, 0x0402: 0x00328e99, 0x0403: 0x40328e20, + 0x0404: 0x40329620, 0x0405: 0x40329820, 0x0406: 0x40329a20, 0x0407: 0x40329c20, + 0x0408: 0x40329e20, 0x0409: 0x4032a220, 0x040a: 0xe000134c, 0x040b: 0xe00013ef, + 0x040c: 0xe0001398, 0x040d: 0xe00013da, 0x040e: 0xe000148f, 0x040f: 0xe0001368, + 0x0410: 0x00325484, 0x0411: 0x00326a84, 0x0412: 0x0032988a, 0x0413: 0xf000020a, + 0x0414: 0xf000020a, 0x0415: 0x00329a84, 0x0416: 0x00327e84, 0x0417: 0xe0001364, + 0x0418: 0x00328688, 0x0419: 0x40328620, 0x041a: 0x00326288, 0x041b: 0x40326220, + 0x041c: 0x00325e88, 0x041d: 0x40325e20, 0x041e: 0x00328488, 0x041f: 0x40328420, + 0x0420: 0x0032a488, 0x0421: 0x4032a420, 0x0422: 0x0032e888, 0x0423: 0x4032e820, + 0x0424: 0x0032f288, 0x0425: 0x4032f220, 0x0426: 0x0032f488, 0x0427: 0x4032f420, + 0x0428: 0x0032fa88, 0x0429: 0x4032fa20, 0x042a: 0x00330888, 0x042b: 0x40330820, + 0x042c: 0x00330e88, 0x042d: 0x40330e20, 0x042e: 0x00331688, 0x042f: 0x40331620, + 0x0430: 0x00327084, 0x0431: 0x00328884, 0x0432: 0x00328e84, 0x0433: 0x40326e20, + 0x0434: 0x00326a8a, 0x0435: 0x00325c84, 0x0436: 0x40092e20, 0x0437: 0x0032a888, + 0x0438: 0x4032a820, 0x0439: 0x00328e8a, 0x043a: 0x00328288, 0x043b: 0x40328220, + 0x043c: 0x40328c20, 0x043d: 0x00329288, 0x043e: 0x00329088, 0x043f: 0x00329488, + // Block 0x11, offset 0x440 + 0x0440: 0xe00014bd, 0x0441: 0xe00014c3, 0x0442: 0x00339688, 0x0443: 0x0033a288, + 0x0444: 0x0033c288, 0x0445: 0x0033fc88, 0x0446: 0xc02a0071, 0x0447: 0x00343688, + 0x0448: 0x00344688, 0x0449: 0x00349a88, 0x044a: 0x0034e488, 0x044b: 0x00356288, + 0x044c: 0x00356a88, 0x044d: 0xe00014cf, 0x044e: 0x00357a88, 0x044f: 0x00365488, + 0x0450: 0xc0090041, 0x0451: 0x00335288, 0x0452: 0x00335a88, 0x0453: 0xc0130092, + 0x0454: 0x00338a88, 0x0455: 0xc01800d1, 0x0456: 0xc01c0071, 0x0457: 0xc0200071, + 0x0458: 0xc0250041, 0x0459: 0x00343e88, 0x045a: 0xc0370092, 0x045b: 0x00348488, + 0x045c: 0x0034a888, 0x045d: 0x0034ba88, 0x045e: 0xc02e0071, 0x045f: 0x00350e88, + 0x0460: 0x00352888, 0x0461: 0x00353a88, 0x0462: 0x00354c88, 0x0463: 0xc03e00f1, + 0x0464: 0x0035ac88, 0x0465: 0x0035b488, 0x0466: 0x00360288, 0x0467: 0xc0440071, + 0x0468: 0x00365c88, 0x0469: 0x00366688, 0x046a: 0x00367488, 0x046b: 0xc0480071, + 0x046c: 0x00368e88, 0x046d: 0xc04c0071, 0x046e: 0x0036b888, 0x046f: 0x0036c488, + 0x0470: 0xc0060041, 0x0471: 0x40335220, 0x0472: 0x40335a20, 0x0473: 0xc0100092, + 0x0474: 0x40338a20, 0x0475: 0xc01600d1, 0x0476: 0xc01a0071, 0x0477: 0xc01e0071, + 0x0478: 0xc0220041, 0x0479: 0x40343e20, 0x047a: 0xc0340092, 0x047b: 0x40348420, + 0x047c: 0x4034a820, 0x047d: 0x4034ba20, 0x047e: 0xc02c0071, 0x047f: 0x40350e20, + // Block 0x12, offset 0x480 + 0x0480: 0x40352820, 0x0481: 0x40353a20, 0x0482: 0x40354c20, 0x0483: 0xc03a00f1, + 0x0484: 0x4035ac20, 0x0485: 0x4035b420, 0x0486: 0x40360220, 0x0487: 0xc0420071, + 0x0488: 0x40365c20, 0x0489: 0x40366620, 0x048a: 0x40367420, 0x048b: 0xc0460071, + 0x048c: 0x40368e20, 0x048d: 0xc04a0071, 0x048e: 0x4036b820, 0x048f: 0x4036c420, + 0x0490: 0xe00014ba, 0x0491: 0xe00014c0, 0x0492: 0x40339620, 0x0493: 0x4033a220, + 0x0494: 0x4033c220, 0x0495: 0x4033fc20, 0x0496: 0xc0280071, 0x0497: 0x40343620, + 0x0498: 0x40344620, 0x0499: 0x40349a20, 0x049a: 0x4034e420, 0x049b: 0x40356220, + 0x049c: 0x40356a20, 0x049d: 0xe00014cc, 0x049e: 0x40357a20, 0x049f: 0x40365420, + 0x04a0: 0x0035e088, 0x04a1: 0x4035e020, 0x04a2: 0x00369e88, 0x04a3: 0x40369e20, + 0x04a4: 0x0036ce88, 0x04a5: 0x4036ce20, 0x04a6: 0x0036d688, 0x04a7: 0x4036d620, + 0x04a8: 0x0036ea88, 0x04a9: 0x4036ea20, 0x04aa: 0x0036e088, 0x04ab: 0x4036e020, + 0x04ac: 0x0036f488, 0x04ad: 0x4036f420, 0x04ae: 0x0036fc88, 0x04af: 0x4036fc20, + 0x04b0: 0x00370488, 0x04b1: 0x40370420, 0x04b2: 0x00370c88, 0x04b3: 0x40370c20, + 0x04b4: 0xc0500131, 0x04b5: 0xc04e0131, 0x04b6: 0x00371c88, 0x04b7: 0x40371c20, + 0x04b8: 0x0035a488, 0x04b9: 0x4035a420, 0x04ba: 0x0035fa88, 0x04bb: 0x4035fa20, + 0x04bc: 0x0035f288, 0x04bd: 0x4035f220, 0x04be: 0x0035e888, 0x04bf: 0x4035e820, + // Block 0x13, offset 0x4c0 + 0x04c0: 0x00352088, 0x04c1: 0x40352020, 0x04c2: 0x40070620, 0x04c3: 0xae608302, + 0x04c4: 0xae605f02, 0x04c5: 0xae602a02, 0x04c6: 0xae602202, 0x04c7: 0xae605f02, + 0x04c8: 0xa0000000, 0x04c9: 0xa0000000, 0x04ca: 0x00341c88, 0x04cb: 0x40341c20, + 0x04cc: 0x00369688, 0x04cd: 0x40369620, 0x04ce: 0x00353088, 0x04cf: 0x40353020, + 0x04d0: 0xe00014b7, 0x04d1: 0xe00014b4, 0x04d2: 0x00336a88, 0x04d3: 0x40336a20, + 0x04d4: 0x00337a88, 0x04d5: 0x40337a20, 0x04d6: 0x0033dc88, 0x04d7: 0x4033dc20, + 0x04d8: 0x0033aa88, 0x04d9: 0x4033aa20, 0x04da: 0x00345888, 0x04db: 0x40345820, + 0x04dc: 0x00347888, 0x04dd: 0x40347820, 0x04de: 0x00347088, 0x04df: 0x40347020, + 0x04e0: 0x00346888, 0x04e1: 0x40346820, 0x04e2: 0x0034ca88, 0x04e3: 0x4034ca20, + 0x04e4: 0x0034dc88, 0x04e5: 0x4034dc20, 0x04e6: 0x00351888, 0x04e7: 0x40351820, + 0x04e8: 0x00372688, 0x04e9: 0x40372620, 0x04ea: 0x00354488, 0x04eb: 0x40354420, + 0x04ec: 0x00355888, 0x04ed: 0x40355820, 0x04ee: 0x00359288, 0x04ef: 0x40359220, + 0x04f0: 0x00359a88, 0x04f1: 0x40359a20, 0x04f2: 0x0035cc88, 0x04f3: 0x4035cc20, + 0x04f4: 0x00360e88, 0x04f5: 0x40360e20, 0x04f6: 0x00362a88, 0x04f7: 0x40362a20, + 0x04f8: 0x00363a88, 0x04f9: 0x40363a20, 0x04fa: 0x0035d488, 0x04fb: 0x4035d420, + 0x04fc: 0x00364488, 0x04fd: 0x40364420, 0x04fe: 0x00364c88, 0x04ff: 0x40364c20, + // Block 0x14, offset 0x500 + 0x0500: 0x00373088, 0x0501: 0xe00014c9, 0x0502: 0xe00014c6, 0x0503: 0x00346088, + 0x0504: 0x40346020, 0x0505: 0x00348e88, 0x0506: 0x40348e20, 0x0507: 0x0034d288, + 0x0508: 0x4034d220, 0x0509: 0x0034c288, 0x050a: 0x4034c220, 0x050b: 0x00363288, + 0x050c: 0x40363220, 0x050d: 0x0034b088, 0x050e: 0x4034b020, 0x050f: 0x40373020, + 0x0510: 0x00332a88, 0x0511: 0x40332a20, 0x0512: 0x00333288, 0x0513: 0x40333220, + 0x0514: 0x00334a88, 0x0515: 0x40334a20, 0x0516: 0x0033ba88, 0x0517: 0x4033ba20, + 0x0518: 0xc00e0071, 0x0519: 0xc00c0071, 0x051a: 0x00334288, 0x051b: 0x40334220, + 0x051c: 0x0033d488, 0x051d: 0x4033d420, 0x051e: 0x0033f288, 0x051f: 0x4033f220, + 0x0520: 0x00340688, 0x0521: 0x40340620, 0x0522: 0xe00014d5, 0x0523: 0xe00014d2, + 0x0524: 0x00342488, 0x0525: 0x40342420, 0x0526: 0x0034f688, 0x0527: 0x4034f620, + 0x0528: 0xc0320071, 0x0529: 0xc0300071, 0x052a: 0x00350688, 0x052b: 0x40350620, + 0x052c: 0x0036b088, 0x052d: 0x4036b020, 0x052e: 0xe00014de, 0x052f: 0xe00014db, + 0x0530: 0x00358288, 0x0531: 0x40358220, 0x0532: 0x00358a88, 0x0533: 0x40358a20, + 0x0534: 0x00362288, 0x0535: 0x40362220, 0x0536: 0x00338288, 0x0537: 0x40338220, + 0x0538: 0x00368688, 0x0539: 0x40368620, 0x053a: 0x00337288, 0x053b: 0x40337220, + 0x053c: 0x0035bc88, 0x053d: 0x4035bc20, 0x053e: 0x0035c488, 0x053f: 0x4035c420, + // Block 0x15, offset 0x540 + 0x0540: 0x00339288, 0x0541: 0x40339220, 0x0542: 0x0033a088, 0x0543: 0x4033a020, + 0x0544: 0x0033ee88, 0x0545: 0x4033ee20, 0x0546: 0x00341088, 0x0547: 0x40341020, + 0x0548: 0x0034a488, 0x0549: 0x4034a420, 0x054a: 0x0034ec88, 0x054b: 0x4034ec20, + 0x054c: 0x00354288, 0x054d: 0x40354220, 0x054e: 0x00355688, 0x054f: 0x40355620, + 0x0550: 0x0033f088, 0x0551: 0x4033f020, 0x0552: 0x00349688, 0x0553: 0x40349620, + 0x0554: 0x0034a688, 0x0555: 0x4034a620, 0x0556: 0x00353888, 0x0557: 0x40353820, + 0x0558: 0x0036cc88, 0x0559: 0x4036cc20, 0x055a: 0x00348288, 0x055b: 0x40348220, + 0x055c: 0x00372e88, 0x055d: 0x40372e20, 0x055e: 0x00348088, 0x055f: 0x40348020, + 0x0560: 0x00349888, 0x0561: 0x40349820, 0x0562: 0x0034da88, 0x0563: 0x4034da20, + 0x0564: 0x00351688, 0x0565: 0x40351620, 0x0566: 0x0035dc88, 0x0567: 0x4035dc20, + 0x0571: 0x00384288, 0x0572: 0x00384488, 0x0573: 0x00384688, + 0x0574: 0x00384888, 0x0575: 0x00384a88, 0x0576: 0x00384c88, 0x0577: 0x00384e88, + 0x0578: 0x00385088, 0x0579: 0x00385288, 0x057a: 0x00385488, 0x057b: 0x00385688, + 0x057c: 0x00385888, 0x057d: 0x00385a88, 0x057e: 0x00385c88, 0x057f: 0x00385e88, + // Block 0x16, offset 0x580 + 0x0580: 0x00386088, 0x0581: 0x00386288, 0x0582: 0x00386488, 0x0583: 0x00386688, + 0x0584: 0x00386888, 0x0585: 0x00386a88, 0x0586: 0x00386c88, 0x0587: 0x00386e88, + 0x0588: 0x00387088, 0x0589: 0x00387288, 0x058a: 0x00387488, 0x058b: 0x00387688, + 0x058c: 0x00387888, 0x058d: 0x00387a88, 0x058e: 0x00387c88, 0x058f: 0x00387e88, + 0x0590: 0x00388088, 0x0591: 0x00388288, 0x0592: 0x00388488, 0x0593: 0x00388688, + 0x0594: 0x00388888, 0x0595: 0x00388a88, 0x0596: 0x00388c88, + 0x0599: 0x40388e20, 0x059a: 0x40054e20, 0x059b: 0x40055020, + 0x059c: 0x4002be20, 0x059d: 0x40024620, 0x059e: 0x4002ca20, 0x059f: 0x40055220, + 0x05a1: 0x40384220, 0x05a2: 0x40384420, 0x05a3: 0x40384620, + 0x05a4: 0x40384820, 0x05a5: 0x40384a20, 0x05a6: 0x40384c20, 0x05a7: 0x40384e20, + 0x05a8: 0x40385020, 0x05a9: 0x40385220, 0x05aa: 0x40385420, 0x05ab: 0x40385620, + 0x05ac: 0x40385820, 0x05ad: 0x40385a20, 0x05ae: 0x40385c20, 0x05af: 0x40385e20, + 0x05b0: 0x40386020, 0x05b1: 0x40386220, 0x05b2: 0x40386420, 0x05b3: 0x40386620, + 0x05b4: 0x40386820, 0x05b5: 0x40386a20, 0x05b6: 0x40386c20, 0x05b7: 0x40386e20, + 0x05b8: 0x40387020, 0x05b9: 0x40387220, 0x05ba: 0x40387420, 0x05bb: 0x40387620, + 0x05bc: 0x40387820, 0x05bd: 0x40387a20, 0x05be: 0x40387c20, 0x05bf: 0x40387e20, + // Block 0x17, offset 0x5c0 + 0x05c0: 0x40388020, 0x05c1: 0x40388220, 0x05c2: 0x40388420, 0x05c3: 0x40388620, + 0x05c4: 0x40388820, 0x05c5: 0x40388a20, 0x05c6: 0x40388c20, 0x05c7: 0xf0000404, + 0x05c9: 0x40026e20, 0x05ca: 0x40021c20, + 0x05cf: 0x4027e420, + 0x05d1: 0xadc00000, 0x05d2: 0xae600000, 0x05d3: 0xae600000, + 0x05d4: 0xae600000, 0x05d5: 0xae600000, 0x05d6: 0xadc00000, 0x05d7: 0xae600000, + 0x05d8: 0xae600000, 0x05d9: 0xae600000, 0x05da: 0xade00000, 0x05db: 0xadc00000, + 0x05dc: 0xae600000, 0x05dd: 0xae600000, 0x05de: 0xae600000, 0x05df: 0xae600000, + 0x05e0: 0xae600000, 0x05e1: 0xae600000, 0x05e2: 0xadc00000, 0x05e3: 0xadc00000, + 0x05e4: 0xadc00000, 0x05e5: 0xadc00000, 0x05e6: 0xadc00000, 0x05e7: 0xadc00000, + 0x05e8: 0xae600000, 0x05e9: 0xae600000, 0x05ea: 0xadc00000, 0x05eb: 0xae600000, + 0x05ec: 0xae600000, 0x05ed: 0xade00000, 0x05ee: 0xae400000, 0x05ef: 0xae600000, + 0x05f0: 0xa0a08502, 0x05f1: 0xa0b08602, 0x05f2: 0xa0c08702, 0x05f3: 0xa0d08802, + 0x05f4: 0xa0e08902, 0x05f5: 0xa0f08a02, 0x05f6: 0xa1008b02, 0x05f7: 0xa1108c02, + 0x05f8: 0xa1208d02, 0x05f9: 0xa1308e02, 0x05fa: 0xa1308e02, 0x05fb: 0xa1408f02, + 0x05fc: 0xa1509202, 0x05fd: 0xa1600000, 0x05fe: 0x40055420, 0x05ff: 0xa1709502, + // Block 0x18, offset 0x600 + 0x0600: 0x40055620, 0x0601: 0xa1809102, 0x0602: 0xa1909002, 0x0603: 0x40055820, + 0x0604: 0xae600000, 0x0605: 0xadc00000, 0x0606: 0x40055a20, 0x0607: 0xa1208d02, + 0x0610: 0x40389020, 0x0611: 0x40389220, 0x0612: 0x40389420, 0x0613: 0x40389620, + 0x0614: 0x40389820, 0x0615: 0x40389a20, 0x0616: 0x40389c20, 0x0617: 0x40389e20, + 0x0618: 0x4038a020, 0x0619: 0x4038a220, 0x061a: 0x0038a499, 0x061b: 0x4038a420, + 0x061c: 0x4038a620, 0x061d: 0x0038a899, 0x061e: 0x4038a820, 0x061f: 0x0038aa99, + 0x0620: 0x4038aa20, 0x0621: 0x4038ac20, 0x0622: 0x4038ae20, 0x0623: 0x0038b099, + 0x0624: 0x4038b020, 0x0625: 0x0038b299, 0x0626: 0x4038b220, 0x0627: 0x4038b420, + 0x0628: 0x4038b620, 0x0629: 0x4038b820, 0x062a: 0x4038ba20, + 0x0630: 0xe00014ff, 0x0631: 0xe0001502, 0x0632: 0xe0001511, 0x0633: 0x40055c20, + 0x0634: 0x40055e20, + // Block 0x19, offset 0x640 + 0x0640: 0xa0000000, 0x0641: 0xa0000000, 0x0642: 0xa0000000, 0x0643: 0xa0000000, + 0x0644: 0xa0000000, 0x0646: 0x40096620, 0x0647: 0x40096a20, + 0x0648: 0x40070820, 0x0649: 0x4004f220, 0x064a: 0x4004f620, 0x064b: 0x4027e620, + 0x064c: 0x40024820, 0x064d: 0x40024a20, 0x064e: 0x40070e20, 0x064f: 0x40071020, + 0x0650: 0xae600000, 0x0651: 0xae600000, 0x0652: 0xae600000, 0x0653: 0xae600000, + 0x0654: 0xae600000, 0x0655: 0xae600000, 0x0656: 0xae600000, 0x0657: 0xae600000, + 0x0658: 0xa1e00000, 0x0659: 0xa1f00000, 0x065a: 0xa2000000, 0x065b: 0x40026420, + 0x065e: 0x40027020, 0x065f: 0x4002cc20, + 0x0660: 0x403aa220, 0x0661: 0x40391c20, 0x0662: 0x40391e20, 0x0663: 0x40392020, + 0x0664: 0x40392620, 0x0665: 0x40392820, 0x0666: 0x40393020, 0x0667: 0xc0520151, + 0x0668: 0x40393c20, 0x0669: 0x40395420, 0x066a: 0x40395620, 0x066b: 0x40395820, + 0x066c: 0x40396420, 0x066d: 0x40397220, 0x066e: 0x40397420, 0x066f: 0x40398820, + 0x0670: 0x40398a20, 0x0671: 0x4039a420, 0x0672: 0x4039a620, 0x0673: 0x4039c620, + 0x0674: 0x4039c820, 0x0675: 0x4039dc20, 0x0676: 0x4039de20, 0x0677: 0x4039e620, + 0x0678: 0x4039e820, 0x0679: 0x4039ee20, 0x067a: 0x4039f020, 0x067b: 0x403a3820, + 0x067c: 0x403a3a20, 0x067d: 0x403a9c20, 0x067e: 0x403a9e20, 0x067f: 0x403aa020, + // Block 0x1a, offset 0x680 + 0x0680: 0xa0000000, 0x0681: 0x4039fc20, 0x0682: 0x403a1220, 0x0683: 0x403a1a20, + 0x0684: 0x403a4020, 0x0685: 0x403a4e20, 0x0686: 0x403a5620, 0x0687: 0x403a6820, + 0x0688: 0xc0560171, 0x0689: 0x403a8e20, 0x068a: 0xc0580171, 0x068b: 0xa1b0a202, + 0x068c: 0xa1c0a502, 0x068d: 0xa1d0a902, 0x068e: 0xa1e0ad02, 0x068f: 0xa1f0b202, + 0x0690: 0xa200b602, 0x0691: 0xa210ba02, 0x0692: 0xa220bc02, 0x0693: 0xae60bd02, + 0x0694: 0xae60be02, 0x0695: 0xadc0bf02, 0x0696: 0xadc0c102, 0x0697: 0xae60c202, + 0x0698: 0xae60c302, 0x0699: 0xae60c402, 0x069a: 0xae60c502, 0x069b: 0xae60c602, + 0x069c: 0xadc0c702, 0x069d: 0xae60c802, 0x069e: 0xae60c902, 0x069f: 0xadc0c002, + 0x06a0: 0xe000015e, 0x06a1: 0xe00001e6, 0x06a2: 0xe0000301, 0x06a3: 0xe00003db, + 0x06a4: 0xe00004b6, 0x06a5: 0xe0000580, 0x06a6: 0xe000064b, 0x06a7: 0xe00006f3, + 0x06a8: 0xe000079f, 0x06a9: 0xe0000844, 0x06aa: 0x4004ee20, 0x06ab: 0x40024c20, + 0x06ac: 0x40024e20, 0x06ad: 0x4004de20, 0x06ae: 0x40393a20, 0x06af: 0x403a1020, + 0x06b0: 0xa230d102, 0x06b1: 0x40392420, 0x06b2: 0x40392220, 0x06b3: 0x40392a20, + 0x06b4: 0x00391c84, 0x06b5: 0xf0000404, 0x06b6: 0xf0000404, 0x06b7: 0xf0000404, + 0x06b8: 0xf0000404, 0x06b9: 0x40395a20, 0x06ba: 0x40395c20, 0x06bb: 0x40393e20, + 0x06bc: 0x40395e20, 0x06bd: 0x40396020, 0x06be: 0x40394020, 0x06bf: 0x40396220, + // Block 0x1b, offset 0x6c0 + 0x06c0: 0x40394220, 0x06c1: 0x40397620, 0x06c2: 0x40397820, 0x06c3: 0x40396620, + 0x06c4: 0x40396820, 0x06c5: 0x40397a20, 0x06c6: 0x40396a20, 0x06c7: 0x40396e20, + 0x06c8: 0x40398c20, 0x06c9: 0x40398e20, 0x06ca: 0x40399020, 0x06cb: 0x40399220, + 0x06cc: 0x40399420, 0x06cd: 0x40399620, 0x06ce: 0x40399820, 0x06cf: 0x40399a20, + 0x06d0: 0x40399c20, 0x06d1: 0x4039a820, 0x06d2: 0x4039aa20, 0x06d3: 0x4039ac20, + 0x06d4: 0x4039ae20, 0x06d5: 0x4039b020, 0x06d6: 0x4039b220, 0x06d7: 0x4039b420, + 0x06d8: 0x4039b620, 0x06d9: 0x4039b820, 0x06da: 0x4039ca20, 0x06db: 0x4039cc20, + 0x06dc: 0x4039ce20, 0x06dd: 0x4039e020, 0x06de: 0x4039e220, 0x06df: 0x4039ea20, + 0x06e0: 0x4039f220, 0x06e1: 0x4039fe20, 0x06e2: 0x403a0020, 0x06e3: 0x403a0220, + 0x06e4: 0x403a0420, 0x06e5: 0x403a0820, 0x06e6: 0x403a0a20, 0x06e7: 0x403a1420, + 0x06e8: 0x403a1620, 0x06e9: 0x403a1c20, 0x06ea: 0x403a1e20, 0x06eb: 0x403a2020, + 0x06ec: 0x403a2220, 0x06ed: 0x403a2620, 0x06ee: 0x403a2820, 0x06ef: 0x403a2a20, + 0x06f0: 0x403a2c20, 0x06f1: 0x403a2e20, 0x06f2: 0x403a3020, 0x06f3: 0x403a3220, + 0x06f4: 0x403a3420, 0x06f5: 0x403a4220, 0x06f6: 0x403a4420, 0x06f7: 0x403a4620, + 0x06f8: 0x403a4820, 0x06f9: 0x403a6020, 0x06fa: 0x403a5820, 0x06fb: 0x403a5a20, + 0x06fc: 0x403a5c20, 0x06fd: 0x403a5e20, 0x06fe: 0x403a6a20, 0x06ff: 0x40396c20, + // Block 0x1c, offset 0x700 + 0x0700: 0xe00017e4, 0x0701: 0x403a6c20, 0x0702: 0xe00017e1, 0x0703: 0x403a6e20, + 0x0704: 0x403a7620, 0x0705: 0x403a7820, 0x0706: 0x403a7a20, 0x0707: 0x403a7c20, + 0x0708: 0x403a7e20, 0x0709: 0x403a8020, 0x070a: 0x403a8220, 0x070b: 0x403a8420, + 0x070c: 0x403a9220, 0x070d: 0x403a9420, 0x070e: 0x403a9620, 0x070f: 0x403a8620, + 0x0710: 0x403a9820, 0x0711: 0x403a9a20, 0x0712: 0x403aaa20, 0x0713: 0xe0001800, + 0x0714: 0x4002e820, 0x0715: 0x403a7220, 0x0716: 0xae600000, 0x0717: 0xae600000, + 0x0718: 0xae600000, 0x0719: 0xae600000, 0x071a: 0xae600000, 0x071b: 0xae600000, + 0x071c: 0xae600000, 0x071d: 0xa0000000, 0x071e: 0x40071220, 0x071f: 0xae600000, + 0x0720: 0xae600000, 0x0721: 0xae600000, 0x0722: 0xae600000, 0x0723: 0xadc00000, + 0x0724: 0xae600000, 0x0725: 0x003a7484, 0x0726: 0x003a9084, 0x0727: 0xae600000, + 0x0728: 0xae600000, 0x0729: 0x40071420, 0x072a: 0xadc00000, 0x072b: 0xae600000, + 0x072c: 0xae600000, 0x072d: 0xadc00000, 0x072e: 0x40399e20, 0x072f: 0x4039ba20, + 0x0730: 0xe0000161, 0x0731: 0xe00001e9, 0x0732: 0xe0000304, 0x0733: 0xe00003de, + 0x0734: 0xe00004b9, 0x0735: 0xe0000583, 0x0736: 0xe000064e, 0x0737: 0xe00006f6, + 0x0738: 0xe00007a2, 0x0739: 0xe0000847, 0x073a: 0x4039d020, 0x073b: 0x4039e420, + 0x073c: 0x4039f420, 0x073d: 0xe0001553, 0x073e: 0xe0001779, 0x073f: 0x403a7020, + // Block 0x1d, offset 0x740 + 0x0740: 0x40035c20, 0x0741: 0x4002ea20, 0x0742: 0x4002ec20, 0x0743: 0x40027220, + 0x0744: 0x40027420, 0x0745: 0x40027620, 0x0746: 0x40027820, 0x0747: 0x40027a20, + 0x0748: 0x40027c20, 0x0749: 0x4002ce20, 0x074a: 0x40056020, 0x074b: 0x40056220, + 0x074c: 0x40056420, 0x074d: 0x40056620, 0x074f: 0xa0000000, + 0x0750: 0x403ab020, 0x0751: 0xa240d202, 0x0752: 0x403ab220, 0x0753: 0x403ab420, + 0x0754: 0xe0001806, 0x0755: 0x403ab820, 0x0756: 0x403ab620, 0x0757: 0x403aba20, + 0x0758: 0x403abc20, 0x0759: 0x403abe20, 0x075a: 0x403ac220, 0x075b: 0x403ac420, + 0x075c: 0xe000180f, 0x075d: 0x403ac620, 0x075e: 0x403ac820, 0x075f: 0x403aca20, + 0x0760: 0x403ace20, 0x0761: 0x403ad020, 0x0762: 0x403ad220, 0x0763: 0x403ad420, + 0x0764: 0x003ad499, 0x0765: 0x403ad620, 0x0766: 0x403ad820, 0x0767: 0xe0001812, + 0x0768: 0x403adc20, 0x0769: 0x403ade20, 0x076a: 0x403ae020, 0x076b: 0x403ae220, + 0x076c: 0x403ae420, 0x076d: 0xe0001803, 0x076e: 0xe0001809, 0x076f: 0xe000180c, + 0x0770: 0xae60d302, 0x0771: 0xadc0d402, 0x0772: 0xae60d502, 0x0773: 0xae60d602, + 0x0774: 0xadc0d702, 0x0775: 0xae60d802, 0x0776: 0xae60d902, 0x0777: 0xadc0da02, + 0x0778: 0xadc0db02, 0x0779: 0xadc0dc02, 0x077a: 0xae60dd02, 0x077b: 0xadc0de02, + 0x077c: 0xadc0df02, 0x077d: 0xae60e002, 0x077e: 0xadc0e102, 0x077f: 0xae60e202, + // Block 0x1e, offset 0x780 + 0x0780: 0xae600000, 0x0781: 0xae605f02, 0x0782: 0xadc06002, 0x0783: 0xae600000, + 0x0784: 0xadc00000, 0x0785: 0xae605f02, 0x0786: 0xadc06002, 0x0787: 0xae600000, + 0x0788: 0xadc00000, 0x0789: 0xae600000, 0x078a: 0xae600000, + 0x078d: 0x403ac020, 0x078e: 0x403acc20, 0x078f: 0x403ada20, + 0x0790: 0x40394420, 0x0791: 0x40394620, 0x0792: 0x40394820, 0x0793: 0x40394a20, + 0x0794: 0x40394c20, 0x0795: 0x40394e20, 0x0796: 0x40395220, 0x0797: 0x40397c20, + 0x0798: 0x40397e20, 0x0799: 0x4039a020, 0x079a: 0x4039a220, 0x079b: 0x4039bc20, + 0x079c: 0x4039d220, 0x079d: 0x4039f620, 0x079e: 0x4039f820, 0x079f: 0x4039fa20, + 0x07a0: 0x403a0c20, 0x07a1: 0x403a0e20, 0x07a2: 0x403a3620, 0x07a3: 0x403a3c20, + 0x07a4: 0x403a3e20, 0x07a5: 0x403a5020, 0x07a6: 0x403a5220, 0x07a7: 0x403a6220, + 0x07a8: 0x403a6420, 0x07a9: 0x403a6620, 0x07aa: 0x403a4a20, 0x07ab: 0x4039be20, + 0x07ac: 0x4039c020, 0x07ad: 0x4039d420, 0x07ae: 0x40398020, 0x07af: 0x40398220, + 0x07b0: 0x4039d620, 0x07b1: 0x4039c220, 0x07b2: 0x40398420, 0x07b3: 0x40392c20, + 0x07b4: 0x40392e20, 0x07b5: 0x403aa420, 0x07b6: 0x403aa620, 0x07b7: 0x403aa820, + 0x07b8: 0x403a8820, 0x07b9: 0x403a8a20, 0x07ba: 0x403aac20, 0x07bb: 0x403aae20, + 0x07bc: 0x40398620, 0x07bd: 0x4039d820, 0x07be: 0x4039da20, 0x07bf: 0x403a2420, + // Block 0x1f, offset 0x7c0 + 0x07c0: 0x403b1820, 0x07c1: 0x403b1e20, 0x07c2: 0x403b2020, 0x07c3: 0x403b2220, + 0x07c4: 0x403b2620, 0x07c5: 0x403b2820, 0x07c6: 0x403b2a20, 0x07c7: 0x403b2c20, + 0x07c8: 0x403b3220, 0x07c9: 0x403b3620, 0x07ca: 0x403b3820, 0x07cb: 0x403b3a20, + 0x07cc: 0x403b3e20, 0x07cd: 0x403b4620, 0x07ce: 0x403b4820, 0x07cf: 0x403b4c20, + 0x07d0: 0x403b4e20, 0x07d1: 0x403b5620, 0x07d2: 0x403b5820, 0x07d3: 0x403b5a20, + 0x07d4: 0x403b5c20, 0x07d5: 0x403b5e20, 0x07d6: 0x403b6020, 0x07d7: 0x403b6220, + 0x07d8: 0x403b4020, 0x07d9: 0x403b1a20, 0x07da: 0x403b1c20, 0x07db: 0x403b3c20, + 0x07dc: 0x403b2420, 0x07dd: 0x403b5020, 0x07de: 0x403b5220, 0x07df: 0x403b5420, + 0x07e0: 0x403b4220, 0x07e1: 0x403b4420, 0x07e2: 0x403b2e20, 0x07e3: 0x403b3020, + 0x07e4: 0x403b4a20, 0x07e5: 0x403b3420, 0x07e6: 0x403b6620, 0x07e7: 0x403b6820, + 0x07e8: 0x403b6a20, 0x07e9: 0x403b6c20, 0x07ea: 0x403b6e20, 0x07eb: 0x403b7020, + 0x07ec: 0x403b7220, 0x07ed: 0x403b7420, 0x07ee: 0x403b7620, 0x07ef: 0x403b7820, + 0x07f0: 0x403b7a20, 0x07f1: 0x403b6420, + // Block 0x20, offset 0x800 + 0x0800: 0xe0000164, 0x0801: 0xe00001ef, 0x0802: 0xe000030a, 0x0803: 0xe00003e4, + 0x0804: 0xe00004bf, 0x0805: 0xe0000589, 0x0806: 0xe0000654, 0x0807: 0xe00006fc, + 0x0808: 0xe00007a8, 0x0809: 0xe000084d, 0x080a: 0x403b7c20, 0x080b: 0x403b7e20, + 0x080c: 0x403b8020, 0x080d: 0x403b8220, 0x080e: 0x403b8420, 0x080f: 0x403b8620, + 0x0810: 0x403b8820, 0x0811: 0x403b8a20, 0x0812: 0x403b8c20, 0x0813: 0x403b8e20, + 0x0814: 0x403b9020, 0x0815: 0x403b9220, 0x0816: 0x403b9420, 0x0817: 0x403b9620, + 0x0818: 0x403b9820, 0x0819: 0x403b9a20, 0x081a: 0x403b9c20, 0x081b: 0x403b9e20, + 0x081c: 0x403ba020, 0x081d: 0x403ba220, 0x081e: 0x403ba420, 0x081f: 0x403ba620, + 0x0820: 0x403ba820, 0x0821: 0x403baa20, 0x0822: 0x403bac20, 0x0823: 0x403bae20, + 0x0824: 0x403bb020, 0x0825: 0x403bb220, 0x0826: 0x403bb420, 0x0827: 0x403bb620, + 0x0828: 0xe0001815, 0x0829: 0xe0001818, 0x082a: 0xe000181b, 0x082b: 0xae60e302, + 0x082c: 0xae60e402, 0x082d: 0xae60e502, 0x082e: 0xae60e602, 0x082f: 0xae60e702, + 0x0830: 0xae60e802, 0x0831: 0xae60e902, 0x0832: 0xadc0ea02, 0x0833: 0xae60eb02, + 0x0834: 0x403bb820, 0x0835: 0x403bba20, 0x0836: 0x40073820, 0x0837: 0x40035e20, + 0x0838: 0x40025020, 0x0839: 0x4002c020, 0x083a: 0xa0000000, + // Block 0x21, offset 0x840 + 0x0840: 0x4038e820, 0x0841: 0x4038ea20, 0x0842: 0x4038ec20, 0x0843: 0x4038ee20, + 0x0844: 0x4038f020, 0x0845: 0x4038f220, 0x0846: 0x4038f420, 0x0847: 0x4038f620, + 0x0848: 0x4038f820, 0x0849: 0x4038fa20, 0x084a: 0x4038fc20, 0x084b: 0x4038fe20, + 0x084c: 0x40390020, 0x084d: 0x40390220, 0x084e: 0x40390420, 0x084f: 0x40390620, + 0x0850: 0x40390820, 0x0851: 0x40390a20, 0x0852: 0x40390c20, 0x0853: 0x40390e20, + 0x0854: 0x40391020, 0x0855: 0x40391220, 0x0856: 0x82e61c8a, 0x0857: 0x82e61c8b, + 0x0858: 0xae609f02, 0x0859: 0xae60a002, 0x085a: 0x40391820, 0x085b: 0x82e61c8d, + 0x085c: 0xae609702, 0x085d: 0xae609702, 0x085e: 0xae609802, 0x085f: 0xae609802, + 0x0860: 0xae609802, 0x0861: 0xae609902, 0x0862: 0xae609902, 0x0863: 0xae609902, + 0x0864: 0xa0009a02, 0x0865: 0xae609a02, 0x0866: 0xae609b02, 0x0867: 0xae609b02, + 0x0868: 0xa0009c02, 0x0869: 0xae609c02, 0x086a: 0xae609c02, 0x086b: 0xae609d02, + 0x086c: 0xae609e02, 0x086d: 0xae60a102, + 0x0870: 0x40027e20, 0x0871: 0x40028020, 0x0872: 0x40028220, 0x0873: 0x40028420, + 0x0874: 0x40028620, 0x0875: 0x40028820, 0x0876: 0x40028a20, 0x0877: 0x40028c20, + 0x0878: 0x40028e20, 0x0879: 0x40029020, 0x087a: 0x40029220, 0x087b: 0x40029420, + 0x087c: 0x40029620, 0x087d: 0x40029820, 0x087e: 0x40029a20, + // Block 0x22, offset 0x880 + 0x0880: 0x403ae620, 0x0881: 0x403ae820, 0x0882: 0x403aea20, 0x0883: 0x403aec20, + 0x0884: 0x403aee20, 0x0885: 0x403af020, 0x0886: 0x403af220, 0x0887: 0x403af420, + 0x0888: 0x403af620, 0x0889: 0x403af820, 0x088a: 0x403afa20, 0x088b: 0x403afc20, + 0x088c: 0x403afe20, 0x088d: 0x403b0020, 0x088e: 0x403b0220, 0x088f: 0x403b0420, + 0x0890: 0x403b0620, 0x0891: 0x403b0820, 0x0892: 0x403b0a20, 0x0893: 0x403b0c20, + 0x0894: 0x403b0e20, 0x0895: 0x403b1020, 0x0896: 0x403b1220, 0x0897: 0x403b1420, + 0x0898: 0x403b1620, 0x0899: 0xadc06002, 0x089a: 0xadc06002, 0x089b: 0xadc06002, + 0x089e: 0x40056820, + // Block 0x23, offset 0x8c0 + 0x08e0: 0x40395020, 0x08e2: 0x40397020, 0x08e3: 0x4039ec20, + 0x08e4: 0x403a0620, 0x08e5: 0x403a1820, 0x08e6: 0x403a4c20, 0x08e7: 0x403a5420, + 0x08e8: 0x40393220, 0x08e9: 0x40393420, 0x08ea: 0x4039c420, 0x08eb: 0x403a8c20, + 0x08ec: 0x40393620, + // Block 0x24, offset 0x900 + 0x0924: 0xae60af02, 0x0925: 0xae60b402, 0x0926: 0xadc0b802, 0x0927: 0xae60a402, + 0x0928: 0xae60a802, 0x0929: 0xadc0ac02, 0x092a: 0xae600000, 0x092b: 0xae600000, + 0x092c: 0xae600000, 0x092d: 0xadc00000, 0x092e: 0xadc00000, 0x092f: 0xadc00000, + 0x0930: 0xa1b0a302, 0x0931: 0xa1c0a702, 0x0932: 0xa1d0ab02, 0x0933: 0xae600000, + 0x0934: 0xae60b002, 0x0935: 0xae60b102, 0x0936: 0xadc0b902, 0x0937: 0xae60ca02, + 0x0938: 0xae60cb02, 0x0939: 0xadc0cf02, 0x093a: 0xadc0d002, 0x093b: 0xae60cd02, + 0x093c: 0xae60ce02, 0x093d: 0xae60cc02, 0x093e: 0xae60b502, + // Block 0x25, offset 0x940 + 0x0940: 0xa000f202, 0x0941: 0xa000f202, 0x0942: 0xa000f302, 0x0943: 0xa000f402, + 0x0944: 0x403fbc20, 0x0945: 0x403fbe20, 0x0946: 0x403fc020, 0x0947: 0x403fcc20, + 0x0948: 0x403fce20, 0x0949: 0x403fd020, 0x094a: 0x403fd220, 0x094b: 0x403fd420, + 0x094c: 0x403fd820, 0x094d: 0x403fdc20, 0x094e: 0x403fde20, 0x094f: 0x403fe020, + 0x0950: 0x403fe220, 0x0951: 0x403fe420, 0x0952: 0x403fe620, 0x0953: 0x403fe820, + 0x0954: 0x403fea20, 0x0955: 0x403fec20, 0x0956: 0x403fee20, 0x0957: 0x403ff020, + 0x0958: 0x403ff420, 0x0959: 0x403ff620, 0x095a: 0x403ff820, 0x095b: 0x403ffa20, + 0x095c: 0x403ffc20, 0x095d: 0x40400220, 0x095e: 0x40400420, 0x095f: 0x40400620, + 0x0960: 0x40400820, 0x0961: 0x40400a20, 0x0962: 0x40400e20, 0x0963: 0x40401020, + 0x0964: 0x40401220, 0x0965: 0x40401420, 0x0966: 0x40401620, 0x0967: 0x40401820, + 0x0968: 0x40401a20, 0x0969: 0xe0001830, 0x096a: 0x40401c20, 0x096b: 0x40401e20, + 0x096c: 0x40402020, 0x096d: 0x40402420, 0x096e: 0x40402620, 0x096f: 0x40402820, + 0x0970: 0x40402c20, 0x0971: 0xe0001839, 0x0972: 0x40402e20, 0x0973: 0x40403020, + 0x0974: 0xe000183c, 0x0975: 0x40403220, 0x0976: 0x40403420, 0x0977: 0x40403620, + 0x0978: 0x40403820, 0x0979: 0x40403a20, 0x097a: 0x40404c20, 0x097b: 0x40404e20, + 0x097c: 0xa070f102, 0x097d: 0x40403c20, 0x097e: 0x40404a20, 0x097f: 0x40405620, + // Block 0x26, offset 0x980 + 0x0980: 0x40405820, 0x0981: 0x40405a20, 0x0982: 0x40405c20, 0x0983: 0x40405e20, + 0x0984: 0x40406020, 0x0985: 0x40406620, 0x0986: 0x40406a20, 0x0987: 0x40406c20, + 0x0988: 0x40407020, 0x0989: 0x40407220, 0x098a: 0x40407420, 0x098b: 0x40407620, + 0x098c: 0x40407820, 0x098d: 0x8209203d, 0x098e: 0x40406e20, 0x098f: 0x40405020, + 0x0990: 0x403fb820, 0x0991: 0xae600000, 0x0992: 0xadc00000, 0x0993: 0xae603502, + 0x0994: 0xae603202, 0x0995: 0x40406820, 0x0996: 0x40405220, 0x0997: 0x40405420, + 0x0998: 0xe000181e, 0x0999: 0xe0001821, 0x099a: 0xe0001824, 0x099b: 0xe0001827, + 0x099c: 0xe000182a, 0x099d: 0xe000182d, 0x099e: 0xe0001833, 0x099f: 0xe0001836, + 0x09a0: 0x403fd620, 0x09a1: 0x403fda20, 0x09a2: 0x40406220, 0x09a3: 0x40406420, + 0x09a4: 0x40030c20, 0x09a5: 0x40030e20, 0x09a6: 0xe000016a, 0x09a7: 0xe00001f8, + 0x09a8: 0xe0000313, 0x09a9: 0xe00003ed, 0x09aa: 0xe00004c8, 0x09ab: 0xe0000592, + 0x09ac: 0xe000065d, 0x09ad: 0xe0000705, 0x09ae: 0xe00007b1, 0x09af: 0xe0000856, + 0x09b0: 0x40056c20, 0x09b1: 0x4027b620, 0x09b2: 0x403fba20, 0x09b3: 0x403fc220, + 0x09b4: 0x403fc420, 0x09b5: 0x403fc620, 0x09b6: 0x403fc820, 0x09b7: 0x403fca20, + 0x09b9: 0x403ffe20, 0x09ba: 0x40402a20, 0x09bb: 0x403ff220, + 0x09bc: 0x40400020, 0x09bd: 0x40403e20, 0x09be: 0x40400c20, 0x09bf: 0x40402220, + // Block 0x27, offset 0x9c0 + 0x09c1: 0xa000f202, 0x09c2: 0xa000f302, 0x09c3: 0xa000f402, + 0x09c5: 0x40407c20, 0x09c6: 0x40407e20, 0x09c7: 0x40408020, + 0x09c8: 0x40408220, 0x09c9: 0x40408420, 0x09ca: 0x40408620, 0x09cb: 0x40408820, + 0x09cc: 0x40408c20, 0x09cf: 0x40409020, + 0x09d0: 0x40409220, 0x09d3: 0x40409420, + 0x09d4: 0x40409620, 0x09d5: 0x40409820, 0x09d6: 0x40409a20, 0x09d7: 0x40409c20, + 0x09d8: 0x40409e20, 0x09d9: 0x4040a020, 0x09da: 0x4040a220, 0x09db: 0x4040a420, + 0x09dc: 0x4040a620, 0x09dd: 0x4040a820, 0x09de: 0x4040aa20, 0x09df: 0x4040ac20, + 0x09e0: 0x4040ae20, 0x09e1: 0x4040b020, 0x09e2: 0x4040b220, 0x09e3: 0x4040b420, + 0x09e4: 0x4040b620, 0x09e5: 0x4040b820, 0x09e6: 0x4040ba20, 0x09e7: 0x4040bc20, + 0x09e8: 0x4040be20, 0x09ea: 0x4040c020, 0x09eb: 0x4040c220, + 0x09ec: 0x4040c420, 0x09ed: 0x4040c620, 0x09ee: 0x4040c820, 0x09ef: 0x4040ca20, + 0x09f0: 0x4040cc20, 0x09f2: 0x4040d020, + 0x09f6: 0x4040d420, 0x09f7: 0x4040d620, + 0x09f8: 0x4040d820, 0x09f9: 0x4040da20, + 0x09fc: 0xa070f102, 0x09fd: 0x4040dc20, 0x09fe: 0x4040de20, 0x09ff: 0x4040e020, + // Block 0x28, offset 0xa00 + 0x0a00: 0x4040e220, 0x0a01: 0x4040e420, 0x0a02: 0x4040e620, 0x0a03: 0x4040e820, + 0x0a04: 0x4040ea20, 0x0a07: 0xc05a0191, + 0x0a08: 0x4040f220, 0x0a0b: 0x4040f420, + 0x0a0c: 0x4040f620, 0x0a0d: 0x8209207c, 0x0a0e: 0xe0001845, + 0x0a17: 0x4040fa20, + 0x0a1c: 0xe000183f, 0x0a1d: 0xe0001842, 0x0a1f: 0xe0001848, + 0x0a20: 0x40408a20, 0x0a21: 0x40408e20, 0x0a22: 0x4040ec20, 0x0a23: 0x4040ee20, + 0x0a26: 0xe000016d, 0x0a27: 0xe00001fb, + 0x0a28: 0xe0000316, 0x0a29: 0xe00003f0, 0x0a2a: 0xe00004cb, 0x0a2b: 0xe0000595, + 0x0a2c: 0xe0000660, 0x0a2d: 0xe0000708, 0x0a2e: 0xe00007b4, 0x0a2f: 0xe0000859, + 0x0a30: 0x4040ce20, 0x0a31: 0x4040d220, 0x0a32: 0x4027e820, 0x0a33: 0x4027ea20, + 0x0a34: 0x40283020, 0x0a35: 0x40283220, 0x0a36: 0x40283420, 0x0a37: 0x40283620, + 0x0a38: 0x40283820, 0x0a39: 0x40283a20, 0x0a3a: 0x40073a20, 0x0a3b: 0x4027ec20, + // Block 0x29, offset 0xa40 + 0x0a41: 0xa000f202, 0x0a42: 0xa000f302, 0x0a43: 0xa000f402, + 0x0a45: 0x40410620, 0x0a46: 0x40410820, 0x0a47: 0x40411020, + 0x0a48: 0x40411220, 0x0a49: 0x40410020, 0x0a4a: 0x40410220, + 0x0a4f: 0x40411420, + 0x0a50: 0x40410a20, 0x0a53: 0x40410420, + 0x0a54: 0x40410c20, 0x0a55: 0x40411c20, 0x0a56: 0x40411e20, 0x0a57: 0x40412020, + 0x0a58: 0x40412220, 0x0a59: 0x40412420, 0x0a5a: 0x40412620, 0x0a5b: 0x40412820, + 0x0a5c: 0x40412a20, 0x0a5d: 0x40412c20, 0x0a5e: 0x40412e20, 0x0a5f: 0x40413020, + 0x0a60: 0x40413220, 0x0a61: 0x40413420, 0x0a62: 0x40413620, 0x0a63: 0x40413820, + 0x0a64: 0x40413a20, 0x0a65: 0x40413c20, 0x0a66: 0x40413e20, 0x0a67: 0x40414020, + 0x0a68: 0x40414220, 0x0a6a: 0x40414420, 0x0a6b: 0x40414620, + 0x0a6c: 0x40414820, 0x0a6d: 0x40414a20, 0x0a6e: 0x40414c20, 0x0a6f: 0x40414e20, + 0x0a70: 0x40415220, 0x0a72: 0x40415420, 0x0a73: 0xe000185a, + 0x0a75: 0x40415620, 0x0a76: 0xe000184b, + 0x0a78: 0x40411620, 0x0a79: 0x40411820, + 0x0a7c: 0xa070f102, 0x0a7e: 0x40415a20, 0x0a7f: 0x40415c20, + // Block 0x2a, offset 0xa80 + 0x0a80: 0x40415e20, 0x0a81: 0x40416020, 0x0a82: 0x40416220, + 0x0a87: 0x40416420, + 0x0a88: 0x40416620, 0x0a8b: 0x40416820, + 0x0a8c: 0x40416a20, 0x0a8d: 0x820920b6, + 0x0a91: 0x40411a20, + 0x0a99: 0xe000184e, 0x0a9a: 0xe0001851, 0x0a9b: 0xe0001854, + 0x0a9c: 0x40415820, 0x0a9e: 0xe0001857, + 0x0aa6: 0xe0000170, 0x0aa7: 0xe00001fe, + 0x0aa8: 0xe0000319, 0x0aa9: 0xe00003f3, 0x0aaa: 0xe00004ce, 0x0aab: 0xe0000598, + 0x0aac: 0xe0000663, 0x0aad: 0xe000070b, 0x0aae: 0xe00007b7, 0x0aaf: 0xe000085c, + 0x0ab0: 0xa000f502, 0x0ab1: 0xa000f602, 0x0ab2: 0x40410e20, 0x0ab3: 0x4040fe20, + 0x0ab4: 0x4040fc20, 0x0ab5: 0x40415020, + // Block 0x2b, offset 0xac0 + 0x0ac1: 0xa000f202, 0x0ac2: 0xa000f302, 0x0ac3: 0xa000f402, + 0x0ac5: 0x40417020, 0x0ac6: 0x40417220, 0x0ac7: 0x40417420, + 0x0ac8: 0x40417620, 0x0ac9: 0x40417820, 0x0aca: 0x40417a20, 0x0acb: 0x40417c20, + 0x0acc: 0x40418020, 0x0acd: 0x40418420, 0x0acf: 0x40418620, + 0x0ad0: 0x40418820, 0x0ad1: 0x40418a20, 0x0ad3: 0x40418c20, + 0x0ad4: 0x40418e20, 0x0ad5: 0x40419020, 0x0ad6: 0x40419220, 0x0ad7: 0x40419420, + 0x0ad8: 0x40419620, 0x0ad9: 0x40419820, 0x0ada: 0x40419a20, 0x0adb: 0x40419c20, + 0x0adc: 0x40419e20, 0x0add: 0x4041a020, 0x0ade: 0x4041a220, 0x0adf: 0x4041a420, + 0x0ae0: 0x4041a620, 0x0ae1: 0x4041a820, 0x0ae2: 0x4041aa20, 0x0ae3: 0x4041ac20, + 0x0ae4: 0x4041ae20, 0x0ae5: 0x4041b020, 0x0ae6: 0x4041b220, 0x0ae7: 0x4041b420, + 0x0ae8: 0x4041b620, 0x0aea: 0x4041b820, 0x0aeb: 0x4041ba20, + 0x0aec: 0x4041bc20, 0x0aed: 0x4041be20, 0x0aee: 0x4041c020, 0x0aef: 0x4041c220, + 0x0af0: 0x4041c420, 0x0af2: 0x4041c620, 0x0af3: 0x4041d220, + 0x0af5: 0x4041c820, 0x0af6: 0x4041ca20, 0x0af7: 0x4041cc20, + 0x0af8: 0x4041ce20, 0x0af9: 0x4041d020, + 0x0afc: 0xa070f102, 0x0afd: 0x4041d420, 0x0afe: 0x4041d620, 0x0aff: 0x4041d820, + // Block 0x2c, offset 0xb00 + 0x0b00: 0x4041da20, 0x0b01: 0x4041dc20, 0x0b02: 0x4041de20, 0x0b03: 0x4041e020, + 0x0b04: 0x4041e220, 0x0b05: 0x4041e820, 0x0b07: 0x4041ea20, + 0x0b08: 0x4041ec20, 0x0b09: 0x4041ee20, 0x0b0b: 0x4041f020, + 0x0b0c: 0x4041f220, 0x0b0d: 0x820920fa, + 0x0b10: 0x40416e20, + 0x0b20: 0x40417e20, 0x0b21: 0x40418220, 0x0b22: 0x4041e420, 0x0b23: 0x4041e620, + 0x0b26: 0xe0000173, 0x0b27: 0xe0000201, + 0x0b28: 0xe000031c, 0x0b29: 0xe00003f6, 0x0b2a: 0xe00004d1, 0x0b2b: 0xe000059b, + 0x0b2c: 0xe0000666, 0x0b2d: 0xe000070e, 0x0b2e: 0xe00007ba, 0x0b2f: 0xe000085f, + 0x0b30: 0x40057420, 0x0b31: 0x4027ee20, + // Block 0x2d, offset 0xb40 + 0x0b41: 0xa000f202, 0x0b42: 0xa000f302, 0x0b43: 0xa000f402, + 0x0b45: 0x4041f620, 0x0b46: 0x4041f820, 0x0b47: 0x4041fa20, + 0x0b48: 0x4041fc20, 0x0b49: 0x4041fe20, 0x0b4a: 0x40420020, 0x0b4b: 0x40420220, + 0x0b4c: 0x40420620, 0x0b4f: 0x40420a20, + 0x0b50: 0x40420c20, 0x0b53: 0x40420e20, + 0x0b54: 0x40421020, 0x0b55: 0x40421220, 0x0b56: 0x40421420, 0x0b57: 0x40421620, + 0x0b58: 0x40421820, 0x0b59: 0x40421a20, 0x0b5a: 0x40421c20, 0x0b5b: 0x40421e20, + 0x0b5c: 0x40422020, 0x0b5d: 0x40422220, 0x0b5e: 0x40422420, 0x0b5f: 0x40422620, + 0x0b60: 0x40422820, 0x0b61: 0x40422a20, 0x0b62: 0x40422c20, 0x0b63: 0x40422e20, + 0x0b64: 0x40423020, 0x0b65: 0x40423220, 0x0b66: 0x40423420, 0x0b67: 0x40423620, + 0x0b68: 0x40423820, 0x0b6a: 0x40423a20, 0x0b6b: 0x40423c20, + 0x0b6c: 0x40423e20, 0x0b6d: 0x40424020, 0x0b6e: 0x40424220, 0x0b6f: 0x40424420, + 0x0b70: 0x40424820, 0x0b72: 0x40424a20, 0x0b73: 0x40424c20, + 0x0b75: 0x40424e20, 0x0b76: 0x40425220, 0x0b77: 0x40425420, + 0x0b78: 0x40425620, 0x0b79: 0x40425820, + 0x0b7c: 0xa070f102, 0x0b7d: 0x40425a20, 0x0b7e: 0x40425c20, 0x0b7f: 0x40425e20, + // Block 0x2e, offset 0xb80 + 0x0b80: 0x40426020, 0x0b81: 0x40426220, 0x0b82: 0x40426420, 0x0b83: 0x40426620, + 0x0b84: 0x40426820, 0x0b87: 0xc05d01e1, + 0x0b88: 0x40427020, 0x0b8b: 0x40427220, + 0x0b8c: 0x40427420, 0x0b8d: 0x8209213b, + 0x0b96: 0x40427820, 0x0b97: 0x40427a20, + 0x0b9c: 0xe000185d, 0x0b9d: 0xe0001860, 0x0b9f: 0x40424620, + 0x0ba0: 0x40420420, 0x0ba1: 0x40420820, 0x0ba2: 0x40426a20, 0x0ba3: 0x40426c20, + 0x0ba6: 0xe0000176, 0x0ba7: 0xe0000204, + 0x0ba8: 0xe000031f, 0x0ba9: 0xe00003f9, 0x0baa: 0xe00004d4, 0x0bab: 0xe000059e, + 0x0bac: 0xe0000669, 0x0bad: 0xe0000711, 0x0bae: 0xe00007bd, 0x0baf: 0xe0000862, + 0x0bb0: 0x40073c20, 0x0bb1: 0x40425020, 0x0bb2: 0x40283c20, 0x0bb3: 0x40283e20, + 0x0bb4: 0x40284020, 0x0bb5: 0x40284220, 0x0bb6: 0x40284420, 0x0bb7: 0x40284620, + // Block 0x2f, offset 0xbc0 + 0x0bc2: 0xa000f302, 0x0bc3: 0x40429620, + 0x0bc5: 0x40427e20, 0x0bc6: 0x40428020, 0x0bc7: 0x40428220, + 0x0bc8: 0x40428420, 0x0bc9: 0x40428620, 0x0bca: 0x40428820, + 0x0bce: 0x40428a20, 0x0bcf: 0x40428c20, + 0x0bd0: 0x40428e20, 0x0bd2: 0xc0610231, 0x0bd3: 0x40429220, + 0x0bd4: 0x40429420, 0x0bd5: 0x40429820, + 0x0bd9: 0x40429a20, 0x0bda: 0x40429c20, + 0x0bdc: 0x4042bc20, 0x0bde: 0x40429e20, 0x0bdf: 0x4042a020, + 0x0be3: 0x4042a220, + 0x0be4: 0x4042a420, + 0x0be8: 0x4042a620, 0x0be9: 0x4042ba20, 0x0bea: 0x4042a820, + 0x0bee: 0x4042aa20, 0x0bef: 0x4042ac20, + 0x0bf0: 0x4042ae20, 0x0bf1: 0x4042b820, 0x0bf2: 0x4042b020, 0x0bf3: 0x4042b620, + 0x0bf4: 0x4042b420, 0x0bf5: 0x4042b220, 0x0bf6: 0x4042be20, 0x0bf7: 0x4042c020, + 0x0bf8: 0x4042c220, 0x0bf9: 0x4042c420, + 0x0bfe: 0x4042c620, 0x0bff: 0x4042c820, + // Block 0x30, offset 0xc00 + 0x0c00: 0x4042ca20, 0x0c01: 0x4042cc20, 0x0c02: 0x4042ce20, + 0x0c06: 0xc0630261, 0x0c07: 0xc06602b1, + 0x0c08: 0x4042d420, 0x0c0a: 0x4042d620, 0x0c0b: 0x4042d820, + 0x0c0c: 0x4042da20, 0x0c0d: 0x8209216e, + 0x0c10: 0x40427c20, + 0x0c17: 0x4042de20, + 0x0c26: 0xe0000179, 0x0c27: 0xe0000207, + 0x0c28: 0xe0000322, 0x0c29: 0xe00003fc, 0x0c2a: 0xe00004d7, 0x0c2b: 0xe00005a1, + 0x0c2c: 0xe000066c, 0x0c2d: 0xe0000714, 0x0c2e: 0xe00007c0, 0x0c2f: 0xe0000865, + 0x0c30: 0x40285420, 0x0c31: 0x40285620, 0x0c32: 0x40285820, 0x0c33: 0x40073e20, + 0x0c34: 0x40074020, 0x0c35: 0x40074220, 0x0c36: 0x40074420, 0x0c37: 0x40074620, + 0x0c38: 0x40074820, 0x0c39: 0x4027f220, 0x0c3a: 0x40074a20, + // Block 0x31, offset 0xc40 + 0x0c41: 0xa000f202, 0x0c42: 0xa000f302, 0x0c43: 0xa000f402, + 0x0c45: 0x4042e020, 0x0c46: 0x4042e220, 0x0c47: 0x4042e420, + 0x0c48: 0x4042e620, 0x0c49: 0x4042e820, 0x0c4a: 0x4042ea20, 0x0c4b: 0x4042ec20, + 0x0c4c: 0x4042f020, 0x0c4e: 0x4042f420, 0x0c4f: 0x4042f620, + 0x0c50: 0x4042f820, 0x0c52: 0x4042fa20, 0x0c53: 0x4042fc20, + 0x0c54: 0x4042fe20, 0x0c55: 0x40430020, 0x0c56: 0x40430220, 0x0c57: 0x40430420, + 0x0c58: 0x40430620, 0x0c59: 0x40430820, 0x0c5a: 0x40430a20, 0x0c5b: 0x40430e20, + 0x0c5c: 0x40431020, 0x0c5d: 0x40431420, 0x0c5e: 0x40431620, 0x0c5f: 0x40431820, + 0x0c60: 0x40431a20, 0x0c61: 0x40431c20, 0x0c62: 0x40431e20, 0x0c63: 0x40432020, + 0x0c64: 0x40432220, 0x0c65: 0x40432420, 0x0c66: 0x40432620, 0x0c67: 0x40432820, + 0x0c68: 0x40432a20, 0x0c6a: 0x40432c20, 0x0c6b: 0x40432e20, + 0x0c6c: 0x40433020, 0x0c6d: 0x40433220, 0x0c6e: 0x40433420, 0x0c6f: 0x40433620, + 0x0c70: 0x40433820, 0x0c71: 0x40433a20, 0x0c72: 0x40433c20, 0x0c73: 0x40434820, + 0x0c75: 0x40433e20, 0x0c76: 0x40434020, 0x0c77: 0x40434220, + 0x0c78: 0x40434420, 0x0c79: 0x40434620, + 0x0c7d: 0x40434a20, 0x0c7e: 0x40434c20, 0x0c7f: 0x40434e20, + // Block 0x32, offset 0xc80 + 0x0c80: 0x40435020, 0x0c81: 0x40435220, 0x0c82: 0x40435420, 0x0c83: 0x40435620, + 0x0c84: 0x40435820, 0x0c86: 0xc06802e1, 0x0c87: 0x40436020, + 0x0c88: 0x40436220, 0x0c8a: 0x40436420, 0x0c8b: 0x40436620, + 0x0c8c: 0x40436820, 0x0c8d: 0x820921b5, + 0x0c95: 0x825421b6, 0x0c96: 0x825b21b7, + 0x0c98: 0x40430c20, 0x0c99: 0x40431220, + 0x0ca0: 0x4042ee20, 0x0ca1: 0x4042f220, 0x0ca2: 0x40435a20, 0x0ca3: 0x40435c20, + 0x0ca6: 0xe000017c, 0x0ca7: 0xe000020a, + 0x0ca8: 0xe0000325, 0x0ca9: 0xe00003ff, 0x0caa: 0xe00004da, 0x0cab: 0xe00005a4, + 0x0cac: 0xe000066f, 0x0cad: 0xe0000717, 0x0cae: 0xe00007c3, 0x0caf: 0xe0000868, + 0x0cb8: 0xe000017f, 0x0cb9: 0xe000020d, 0x0cba: 0xe0000328, 0x0cbb: 0xe0000402, + 0x0cbc: 0xe0000210, 0x0cbd: 0xe000032b, 0x0cbe: 0xe0000405, 0x0cbf: 0x40074c20, + // Block 0x33, offset 0xcc0 + 0x0cc2: 0xa000f302, 0x0cc3: 0xa000f402, + 0x0cc5: 0x40437020, 0x0cc6: 0x40437220, 0x0cc7: 0x40437420, + 0x0cc8: 0x40437620, 0x0cc9: 0x40437820, 0x0cca: 0x40437a20, 0x0ccb: 0x40437c20, + 0x0ccc: 0x40438020, 0x0cce: 0x40438420, 0x0ccf: 0x40438620, + 0x0cd0: 0x40438820, 0x0cd2: 0x40438a20, 0x0cd3: 0x40438c20, + 0x0cd4: 0x40438e20, 0x0cd5: 0x40439020, 0x0cd6: 0x40439220, 0x0cd7: 0x40439420, + 0x0cd8: 0x40439620, 0x0cd9: 0x40439820, 0x0cda: 0x40439a20, 0x0cdb: 0x40439c20, + 0x0cdc: 0x40439e20, 0x0cdd: 0x4043a020, 0x0cde: 0x4043a220, 0x0cdf: 0x4043a420, + 0x0ce0: 0x4043a620, 0x0ce1: 0x4043a820, 0x0ce2: 0x4043aa20, 0x0ce3: 0x4043ac20, + 0x0ce4: 0x4043ae20, 0x0ce5: 0x4043b020, 0x0ce6: 0x4043b220, 0x0ce7: 0x4043b420, + 0x0ce8: 0x4043b620, 0x0cea: 0x4043b820, 0x0ceb: 0x4043ba20, + 0x0cec: 0x4043bc20, 0x0ced: 0x4043be20, 0x0cee: 0x4043c020, 0x0cef: 0x4043c220, + 0x0cf0: 0x4043c420, 0x0cf1: 0x4043c620, 0x0cf2: 0x4043c820, 0x0cf3: 0x4043d420, + 0x0cf5: 0x4043ca20, 0x0cf6: 0x4043cc20, 0x0cf7: 0x4043ce20, + 0x0cf8: 0x4043d020, 0x0cf9: 0x4043d220, + 0x0cfc: 0xa070f102, 0x0cfd: 0x4043d820, 0x0cfe: 0x4043de20, 0x0cff: 0xc06a0311, + // Block 0x34, offset 0xd00 + 0x0d00: 0x4043e220, 0x0d01: 0x4043e420, 0x0d02: 0x4043e620, 0x0d03: 0x4043e820, + 0x0d04: 0x4043ea20, 0x0d06: 0xc06c0341, 0x0d07: 0x4043f220, + 0x0d08: 0x4043f420, 0x0d0a: 0xc0710311, 0x0d0b: 0x4043f820, + 0x0d0c: 0x4043fa20, 0x0d0d: 0x820921fe, + 0x0d15: 0x4043fe20, 0x0d16: 0x40440020, + 0x0d1e: 0x4043d620, + 0x0d20: 0x40437e20, 0x0d21: 0x40438220, 0x0d22: 0x4043ec20, 0x0d23: 0x4043ee20, + 0x0d26: 0xe0000182, 0x0d27: 0xe0000213, + 0x0d28: 0xe000032e, 0x0d29: 0xe0000408, 0x0d2a: 0xe00004dd, 0x0d2b: 0xe00005a7, + 0x0d2c: 0xe0000672, 0x0d2d: 0xe000071a, 0x0d2e: 0xe00007c6, 0x0d2f: 0xe000086b, + 0x0d31: 0x4043da20, 0x0d32: 0x4043dc20, + // Block 0x35, offset 0xd40 + 0x0d42: 0xa000f302, 0x0d43: 0xa000f402, + 0x0d45: 0x40440220, 0x0d46: 0x40440420, 0x0d47: 0x40440620, + 0x0d48: 0x40440820, 0x0d49: 0x40440a20, 0x0d4a: 0x40440c20, 0x0d4b: 0x40440e20, + 0x0d4c: 0x40441220, 0x0d4e: 0x40441620, 0x0d4f: 0x40441820, + 0x0d50: 0x40441a20, 0x0d52: 0x40441c20, 0x0d53: 0x40441e20, + 0x0d54: 0x40442020, 0x0d55: 0x40442220, 0x0d56: 0x40442420, 0x0d57: 0x40442620, + 0x0d58: 0x40442820, 0x0d59: 0x40442a20, 0x0d5a: 0x40442c20, 0x0d5b: 0x40442e20, + 0x0d5c: 0x40443020, 0x0d5d: 0x40443220, 0x0d5e: 0x40443420, 0x0d5f: 0x40443620, + 0x0d60: 0x40443820, 0x0d61: 0x40443a20, 0x0d62: 0x40443c20, 0x0d63: 0x40443e20, + 0x0d64: 0x40444020, 0x0d65: 0x40444220, 0x0d66: 0x40444420, 0x0d67: 0x40444620, + 0x0d68: 0x40444820, 0x0d69: 0x40444a20, 0x0d6a: 0x40444c20, 0x0d6b: 0x40444e20, + 0x0d6c: 0x40445020, 0x0d6d: 0x40445220, 0x0d6e: 0x40445420, 0x0d6f: 0x40445620, + 0x0d70: 0x40445820, 0x0d71: 0x40446a20, 0x0d72: 0x40445a20, 0x0d73: 0x40446620, + 0x0d74: 0x40446820, 0x0d75: 0x40445c20, 0x0d76: 0x40445e20, 0x0d77: 0x40446020, + 0x0d78: 0x40446220, 0x0d79: 0x40446420, 0x0d7a: 0x40446c20, + 0x0d7d: 0x40446e20, 0x0d7e: 0x40447020, 0x0d7f: 0x40447220, + // Block 0x36, offset 0xd80 + 0x0d80: 0x40447420, 0x0d81: 0x40447620, 0x0d82: 0x40447820, 0x0d83: 0x40447a20, + 0x0d84: 0x40447c20, 0x0d86: 0xc07303b1, 0x0d87: 0xc0760401, + 0x0d88: 0x40448620, 0x0d8a: 0x40448820, 0x0d8b: 0x40448a20, + 0x0d8c: 0x40448c20, 0x0d8d: 0x82092248, 0x0d8e: 0xe000186c, + 0x0d97: 0x40448e20, + 0x0da0: 0x40441020, 0x0da1: 0x40441420, 0x0da2: 0x40447e20, 0x0da3: 0x40448020, + 0x0da6: 0xe0000185, 0x0da7: 0xe0000216, + 0x0da8: 0xe0000331, 0x0da9: 0xe000040b, 0x0daa: 0xe00004e0, 0x0dab: 0xe00005aa, + 0x0dac: 0xe0000675, 0x0dad: 0xe000071d, 0x0dae: 0xe00007c9, 0x0daf: 0xe000086e, + 0x0db0: 0x40285a20, 0x0db1: 0x40285c20, 0x0db2: 0x40285e20, 0x0db3: 0x40286020, + 0x0db4: 0x40286220, 0x0db5: 0x40286420, + 0x0db9: 0x40074e20, 0x0dba: 0xe0001866, 0x0dbb: 0xe0001869, + 0x0dbc: 0xe000186f, 0x0dbd: 0xe0001872, 0x0dbe: 0xe0001875, 0x0dbf: 0xe0001863, + // Block 0x37, offset 0xdc0 + 0x0dc2: 0xa000f302, 0x0dc3: 0xa000f402, + 0x0dc5: 0x40449220, 0x0dc6: 0x40449420, 0x0dc7: 0x40449620, + 0x0dc8: 0x40449820, 0x0dc9: 0x40449a20, 0x0dca: 0x40449c20, 0x0dcb: 0x40449e20, + 0x0dcc: 0x4044a020, 0x0dcd: 0x4044a220, 0x0dce: 0x4044a420, 0x0dcf: 0x4044a620, + 0x0dd0: 0x4044a820, 0x0dd1: 0x4044aa20, 0x0dd2: 0x4044ac20, 0x0dd3: 0x4044ae20, + 0x0dd4: 0x4044b020, 0x0dd5: 0x4044b220, 0x0dd6: 0x4044b420, + 0x0dda: 0x4044b620, 0x0ddb: 0x4044b820, + 0x0ddc: 0x4044ba20, 0x0ddd: 0x4044bc20, 0x0dde: 0x4044be20, 0x0ddf: 0x4044c020, + 0x0de0: 0x4044c220, 0x0de1: 0x4044c420, 0x0de2: 0x4044c620, 0x0de3: 0x4044c820, + 0x0de4: 0x4044ca20, 0x0de5: 0x4044cc20, 0x0de6: 0x4044ce20, 0x0de7: 0x4044d020, + 0x0de8: 0x4044d220, 0x0de9: 0x4044d420, 0x0dea: 0x4044d620, 0x0deb: 0x4044d820, + 0x0dec: 0x4044da20, 0x0ded: 0x4044dc20, 0x0dee: 0x4044de20, 0x0def: 0x4044e020, + 0x0df0: 0x4044e220, 0x0df1: 0x4044e420, 0x0df3: 0x4044e620, + 0x0df4: 0x4044e820, 0x0df5: 0x4044ea20, 0x0df6: 0x4044ec20, 0x0df7: 0x4044ee20, + 0x0df8: 0x4044f020, 0x0df9: 0x4044f220, 0x0dfa: 0x4044f420, 0x0dfb: 0x4044f620, + 0x0dfd: 0x4044f820, + // Block 0x38, offset 0xe00 + 0x0e00: 0x4044fa20, 0x0e01: 0x4044fc20, 0x0e02: 0x4044fe20, 0x0e03: 0x40450020, + 0x0e04: 0x40450220, 0x0e05: 0x40450420, 0x0e06: 0x40450620, + 0x0e0a: 0x82092295, + 0x0e0f: 0x40450820, + 0x0e10: 0x40450a20, 0x0e11: 0x40450c20, 0x0e12: 0x40450e20, 0x0e13: 0x40451020, + 0x0e14: 0x40451220, 0x0e16: 0x40451420, + 0x0e18: 0x40451620, 0x0e19: 0xc0780431, 0x0e1a: 0x40452020, 0x0e1b: 0x40452220, + 0x0e1c: 0xc07d04b1, 0x0e1d: 0x40452620, 0x0e1e: 0x40452820, 0x0e1f: 0x40451a20, + 0x0e32: 0x40451820, 0x0e33: 0x40451c20, + 0x0e34: 0x40057620, + // Block 0x39, offset 0xe40 + 0x0e41: 0x40491020, 0x0e42: 0x40491220, 0x0e43: 0x40491420, + 0x0e44: 0x40491620, 0x0e45: 0x40491820, 0x0e46: 0x40491a20, 0x0e47: 0x40491c20, + 0x0e48: 0x40491e20, 0x0e49: 0x40492020, 0x0e4a: 0x40492220, 0x0e4b: 0x40492420, + 0x0e4c: 0x40492620, 0x0e4d: 0x40492820, 0x0e4e: 0x40492a20, 0x0e4f: 0x40492c20, + 0x0e50: 0x40492e20, 0x0e51: 0x40493020, 0x0e52: 0x40493220, 0x0e53: 0x40493420, + 0x0e54: 0x40493620, 0x0e55: 0x40493820, 0x0e56: 0x40493a20, 0x0e57: 0x40493c20, + 0x0e58: 0x40493e20, 0x0e59: 0x40494020, 0x0e5a: 0x40494220, 0x0e5b: 0x40494420, + 0x0e5c: 0x40494620, 0x0e5d: 0x40494820, 0x0e5e: 0x40494a20, 0x0e5f: 0x40494c20, + 0x0e60: 0x40494e20, 0x0e61: 0x40495020, 0x0e62: 0x40495220, 0x0e63: 0x40495420, + 0x0e64: 0x40495620, 0x0e65: 0x40495820, 0x0e66: 0x40495a20, 0x0e67: 0x40495c20, + 0x0e68: 0x40495e20, 0x0e69: 0x40496020, 0x0e6a: 0x40496220, 0x0e6b: 0x40496420, + 0x0e6c: 0x40496620, 0x0e6d: 0x40496820, 0x0e6e: 0x40496a20, 0x0e6f: 0x40496c20, + 0x0e70: 0x40496e20, 0x0e71: 0x40497020, 0x0e72: 0x40497220, 0x0e73: 0x40497420, + 0x0e74: 0x40497620, 0x0e75: 0x40497820, 0x0e76: 0x40497a20, 0x0e77: 0x40497c20, + 0x0e78: 0x826724bf, 0x0e79: 0x826724c0, 0x0e7a: 0x820924c1, + 0x0e7f: 0x4027f420, + // Block 0x3a, offset 0xe80 + 0x0e80: 0xc07f04e1, 0x0e81: 0xc0ae04e1, 0x0e82: 0xc0dd04e1, 0x0e83: 0xc10c04e1, + 0x0e84: 0xc13b04e1, 0x0e85: 0x40498e20, 0x0e86: 0x4027b820, 0x0e87: 0xa000ff02, + 0x0e88: 0xa6b10002, 0x0e89: 0xa6b10102, 0x0e8a: 0xa6b10202, 0x0e8b: 0xa6b10302, + 0x0e8c: 0xa0010402, 0x0e8d: 0xc16a0511, 0x0e8e: 0xa000fe02, 0x0e8f: 0x40057820, + 0x0e90: 0xe000019a, 0x0e91: 0xe000022e, 0x0e92: 0xe0000346, 0x0e93: 0xe0000420, + 0x0e94: 0xe00004f5, 0x0e95: 0xe00005bf, 0x0e96: 0xe000068a, 0x0e97: 0xe0000732, + 0x0e98: 0xe00007de, 0x0e99: 0xe0000883, 0x0e9a: 0x40057a20, 0x0e9b: 0x40057c20, + // Block 0x3b, offset 0xec0 + 0x0ec1: 0x40499220, 0x0ec2: 0x40499420, + 0x0ec4: 0x40499620, 0x0ec7: 0x40499820, + 0x0ec8: 0x40499a20, 0x0eca: 0x40499e20, + 0x0ecd: 0x4049a220, + 0x0ed4: 0x4049a420, 0x0ed5: 0x4049a620, 0x0ed6: 0x4049a820, 0x0ed7: 0x4049aa20, + 0x0ed9: 0x4049ac20, 0x0eda: 0x4049ae20, 0x0edb: 0x4049b020, + 0x0edc: 0x4049b220, 0x0edd: 0x4049b420, 0x0ede: 0x4049b620, 0x0edf: 0x4049b820, + 0x0ee1: 0x4049ba20, 0x0ee2: 0x4049bc20, 0x0ee3: 0x4049be20, + 0x0ee5: 0x4049c020, 0x0ee7: 0x4049c220, + 0x0eea: 0x40499c20, 0x0eeb: 0x4049c420, + 0x0eed: 0x4049c620, 0x0eee: 0x4049c820, 0x0eef: 0x4049ca20, + 0x0ef0: 0x4049cc20, 0x0ef1: 0x4049ce20, 0x0ef2: 0x4049d020, 0x0ef3: 0x4049d220, + 0x0ef4: 0x4049d420, 0x0ef5: 0x4049d620, 0x0ef6: 0x4049d820, 0x0ef7: 0x4049da20, + 0x0ef8: 0x827624ee, 0x0ef9: 0x827624ef, 0x0efb: 0x4049e020, + 0x0efc: 0x4049e220, 0x0efd: 0x4049e420, + // Block 0x3c, offset 0xf00 + 0x0f00: 0xc16c0541, 0x0f01: 0xc18c0541, 0x0f02: 0xc1ac0541, 0x0f03: 0xc1cc0541, + 0x0f04: 0xc1ec0541, 0x0f06: 0x4027ba20, + 0x0f08: 0xa7a10602, 0x0f09: 0xa7a10702, 0x0f0a: 0xa7a10802, 0x0f0b: 0xa7a10902, + 0x0f0c: 0xa0010a02, 0x0f0d: 0xc20c0641, + 0x0f10: 0xe000019d, 0x0f11: 0xe0000231, 0x0f12: 0xe0000349, 0x0f13: 0xe0000423, + 0x0f14: 0xe00004f8, 0x0f15: 0xe00005c2, 0x0f16: 0xe000068d, 0x0f17: 0xe0000735, + 0x0f18: 0xe00007e1, 0x0f19: 0xe0000886, + 0x0f1c: 0xf0000404, 0x0f1d: 0xf0000404, 0x0f1e: 0x40499020, 0x0f1f: 0x4049a020, + // Block 0x3d, offset 0xf40 + 0x0f40: 0xe000201a, 0x0f41: 0x40075e20, 0x0f42: 0x40076020, 0x0f43: 0x40076220, + 0x0f44: 0x40058220, 0x0f45: 0x40058420, 0x0f46: 0x40058620, 0x0f47: 0x40058820, + 0x0f48: 0x40058a20, 0x0f49: 0x40058c20, 0x0f4a: 0x40058e20, 0x0f4b: 0x40059420, + 0x0f4c: 0x0005949b, 0x0f4d: 0x40059620, 0x0f4e: 0x40059820, 0x0f4f: 0x40059a20, + 0x0f50: 0x40059c20, 0x0f51: 0x40059e20, 0x0f52: 0x4005a020, 0x0f53: 0x40076420, + 0x0f54: 0x4002aa20, 0x0f55: 0x40076620, 0x0f56: 0x40076820, 0x0f57: 0x40076a20, + 0x0f58: 0xadc00000, 0x0f59: 0xadc00000, 0x0f5a: 0x40076c20, 0x0f5b: 0x40076e20, + 0x0f5c: 0x40077020, 0x0f5d: 0x40077220, 0x0f5e: 0x40077420, 0x0f5f: 0x40077620, + 0x0f60: 0xe00001a0, 0x0f61: 0xe0000234, 0x0f62: 0xe000034c, 0x0f63: 0xe0000426, + 0x0f64: 0xe00004fb, 0x0f65: 0xe00005c5, 0x0f66: 0xe0000690, 0x0f67: 0xe0000738, + 0x0f68: 0xe00007e4, 0x0f69: 0xe0000889, 0x0f6a: 0xe0000237, 0x0f6b: 0xe000034f, + 0x0f6c: 0xe0000429, 0x0f6d: 0xe00004fe, 0x0f6e: 0xe00005c8, 0x0f6f: 0xe0000693, + 0x0f70: 0xe000073b, 0x0f71: 0xe00007e7, 0x0f72: 0xe000088c, 0x0f73: 0xe00001a3, + 0x0f74: 0x40077820, 0x0f75: 0xadc00000, 0x0f76: 0x40077a20, 0x0f77: 0xadc00000, + 0x0f78: 0x40077c20, 0x0f79: 0xad810e02, 0x0f7a: 0x40040020, 0x0f7b: 0x40040220, + 0x0f7c: 0x40040420, 0x0f7d: 0x40040620, 0x0f7e: 0xa0000000, 0x0f7f: 0xa0000000, + // Block 0x3e, offset 0xf80 + 0x0f80: 0x404a7620, 0x0f81: 0x404a7c20, 0x0f82: 0x404a8020, 0x0f83: 0xe0001fe4, + 0x0f84: 0x404a8420, 0x0f85: 0x404a8820, 0x0f86: 0x404a8c20, 0x0f87: 0x404a9020, + 0x0f89: 0x404a9420, 0x0f8a: 0x404a9820, 0x0f8b: 0x404a9c20, + 0x0f8c: 0x404aa020, 0x0f8d: 0xe0001fea, 0x0f8e: 0x404aa420, 0x0f8f: 0x404aa820, + 0x0f90: 0x404aac20, 0x0f91: 0x404ab020, 0x0f92: 0xe0001ff0, 0x0f93: 0x404ab420, + 0x0f94: 0x404ab820, 0x0f95: 0x404abc20, 0x0f96: 0x404ac020, 0x0f97: 0xe0001ff6, + 0x0f98: 0x404ac420, 0x0f99: 0x404ac820, 0x0f9a: 0x404acc20, 0x0f9b: 0x404ad020, + 0x0f9c: 0xe0001ffc, 0x0f9d: 0x404ad420, 0x0f9e: 0x404ad820, 0x0f9f: 0x404adc20, + 0x0fa0: 0x404ae020, 0x0fa1: 0x404ae420, 0x0fa2: 0x404ae820, 0x0fa3: 0x404aee20, + 0x0fa4: 0x404af220, 0x0fa5: 0x404af620, 0x0fa6: 0x404afa20, 0x0fa7: 0x404afe20, + 0x0fa8: 0x404b0220, 0x0fa9: 0xe0001fde, 0x0faa: 0xe0002008, 0x0fab: 0x404a7a20, + 0x0fac: 0x404aec20, + 0x0fb1: 0xc30f0751, 0x0fb2: 0x8282258c, 0x0fb3: 0x8281258d, + 0x0fb4: 0x82842590, 0x0fb5: 0x82812591, 0x0fb6: 0x404b2420, 0x0fb7: 0x404b2620, + 0x0fb8: 0x404b2820, 0x0fb9: 0x404b2a20, 0x0fba: 0x82822596, 0x0fbb: 0x82822597, + 0x0fbc: 0x82822598, 0x0fbd: 0x82822599, 0x0fbe: 0xa000f302, 0x0fbf: 0xa000f402, + // Block 0x3f, offset 0xfc0 + 0x0fc0: 0x8282258e, 0x0fc1: 0x8281258f, 0x0fc2: 0xae600000, 0x0fc3: 0xae600000, + 0x0fc4: 0x8209259a, 0x0fc5: 0x4005a220, 0x0fc6: 0xae600000, 0x0fc7: 0xae600000, + 0x0fc8: 0x404b0620, 0x0fc9: 0x404b0a20, 0x0fca: 0x404b1220, 0x0fcb: 0x404b1420, + 0x0fcc: 0x404b0e20, 0x0fcd: 0x404b0820, 0x0fce: 0x404b0c20, 0x0fcf: 0x404b1020, + 0x0fd0: 0x404a7820, 0x0fd1: 0x404a7e20, 0x0fd2: 0x404a8220, 0x0fd3: 0xe0001fe7, + 0x0fd4: 0x404a8620, 0x0fd5: 0x404a8a20, 0x0fd6: 0x404a8e20, 0x0fd7: 0x404a9220, + 0x0fd9: 0x404a9620, 0x0fda: 0x404a9a20, 0x0fdb: 0x404a9e20, + 0x0fdc: 0x404aa220, 0x0fdd: 0xe0001fed, 0x0fde: 0x404aa620, 0x0fdf: 0x404aaa20, + 0x0fe0: 0x404aae20, 0x0fe1: 0x404ab220, 0x0fe2: 0xe0001ff3, 0x0fe3: 0x404ab620, + 0x0fe4: 0x404aba20, 0x0fe5: 0x404abe20, 0x0fe6: 0x404ac220, 0x0fe7: 0xe0001ff9, + 0x0fe8: 0x404ac620, 0x0fe9: 0x404aca20, 0x0fea: 0x404ace20, 0x0feb: 0x404ad220, + 0x0fec: 0xe0001fff, 0x0fed: 0x404ad620, 0x0fee: 0x404ada20, 0x0fef: 0x404ade20, + 0x0ff0: 0x404ae220, 0x0ff1: 0x404ae620, 0x0ff2: 0xc30306a1, 0x0ff3: 0xc30906a1, + 0x0ff4: 0x404af420, 0x0ff5: 0x404af820, 0x0ff6: 0x404afc20, 0x0ff7: 0x404b0020, + 0x0ff8: 0x404b0420, 0x0ff9: 0xe0001fe1, 0x0ffa: 0xe0002002, 0x0ffb: 0xe0002005, + 0x0ffc: 0xe000200b, 0x0ffe: 0x40077e20, 0x0fff: 0x40078020, + // Block 0x40, offset 0x1000 + 0x1000: 0x40078220, 0x1001: 0x40078420, 0x1002: 0x40078620, 0x1003: 0x40078820, + 0x1004: 0x40078a20, 0x1005: 0x40078c20, 0x1006: 0xadc00000, 0x1007: 0x40078e20, + 0x1008: 0x40079020, 0x1009: 0x40079220, 0x100a: 0x40079420, 0x100b: 0x40079620, + 0x100c: 0x40079820, 0x100e: 0x40079a20, 0x100f: 0x40079c20, + 0x1010: 0x40059020, 0x1011: 0x40059220, 0x1012: 0x4005a420, 0x1013: 0x4005a620, + 0x1014: 0x4005a820, 0x1015: 0x40079e20, 0x1016: 0x4007a020, 0x1017: 0x4007a220, + 0x1018: 0x4007a420, 0x1019: 0x4005aa20, 0x101a: 0x4005ac20, + // Block 0x41, offset 0x1040 + 0x1040: 0x404e1420, 0x1041: 0x404e1820, 0x1042: 0x404e1c20, 0x1043: 0x404e2220, + 0x1044: 0x404e2420, 0x1045: 0x404e2820, 0x1046: 0x404e2e20, 0x1047: 0x404e3220, + 0x1048: 0x404e3a20, 0x1049: 0x404e4220, 0x104a: 0x404e4820, 0x104b: 0x404e4a20, + 0x104c: 0x404e4e20, 0x104d: 0x404e5220, 0x104e: 0x404e5620, 0x104f: 0x404e5a20, + 0x1050: 0x404e5e20, 0x1051: 0x404e6020, 0x1052: 0x404e6220, 0x1053: 0x404e6620, + 0x1054: 0x404e6a20, 0x1055: 0x404e7220, 0x1056: 0x404e7420, 0x1057: 0x404e7e20, + 0x1058: 0x404e8220, 0x1059: 0x404e8420, 0x105a: 0x404e8820, 0x105b: 0x404e8c20, + 0x105c: 0x404e9420, 0x105d: 0x404e9820, 0x105e: 0x404ea620, 0x105f: 0x404eaa20, + 0x1060: 0x404eb620, 0x1061: 0x404ec220, 0x1062: 0x404ec420, 0x1063: 0x404ec620, + 0x1064: 0x404ec820, 0x1065: 0xc31307b1, 0x1066: 0x404ecc20, 0x1067: 0x404ed620, + 0x1068: 0x404ed820, 0x1069: 0x404eda20, 0x106a: 0x404edc20, 0x106b: 0x004ede84, + 0x106c: 0x404ede20, 0x106d: 0x404ee620, 0x106e: 0x404eea20, 0x106f: 0x404eee20, + 0x1070: 0x404ef420, 0x1071: 0x404efe20, 0x1072: 0x404f0620, 0x1073: 0x404eec20, + 0x1074: 0x404f0a20, 0x1075: 0x404f0220, 0x1076: 0xa000f302, 0x1077: 0xa0711202, + 0x1078: 0xa000f402, 0x1079: 0x8209278a, 0x107a: 0x8209278b, 0x107b: 0x404e8a20, + 0x107c: 0x404e9220, 0x107d: 0x404e9a20, 0x107e: 0x404eb020, 0x107f: 0xe000201e, + // Block 0x42, offset 0x1080 + 0x1080: 0xe00001ac, 0x1081: 0xe0000240, 0x1082: 0xe0000358, 0x1083: 0xe0000432, + 0x1084: 0xe0000507, 0x1085: 0xe00005d1, 0x1086: 0xe000069c, 0x1087: 0xe0000744, + 0x1088: 0xe00007f0, 0x1089: 0xe0000895, 0x108a: 0x40032220, 0x108b: 0x40032420, + 0x108c: 0x4005b420, 0x108d: 0x4005b620, 0x108e: 0x4005b820, 0x108f: 0x4005ba20, + 0x1090: 0x404ea020, 0x1091: 0x404ea220, 0x1092: 0x404ece20, 0x1093: 0x404ed020, + 0x1094: 0x404ed220, 0x1095: 0x404ed420, 0x1096: 0x404ef620, 0x1097: 0x404ef820, + 0x1098: 0x404efa20, 0x1099: 0x404efc20, 0x109a: 0x404e2620, 0x109b: 0x404e3c20, + 0x109c: 0x404eb820, 0x109d: 0x404eba20, 0x109e: 0x404e7020, 0x109f: 0x404e8620, + 0x10a0: 0x404e9620, 0x10a1: 0x404e4020, 0x10a2: 0x404f0c20, 0x10a3: 0x404f1820, + 0x10a4: 0x404f1a20, 0x10a5: 0x404ea420, 0x10a6: 0x404ec020, 0x10a7: 0x404f0e20, + 0x10a8: 0x404f1020, 0x10a9: 0x404f1c20, 0x10aa: 0x404f1e20, 0x10ab: 0x404f2020, + 0x10ac: 0x404f2220, 0x10ad: 0x404f2420, 0x10ae: 0x404e5c20, 0x10af: 0x404ebc20, + 0x10b0: 0x404ebe20, 0x10b1: 0x404ee820, 0x10b2: 0x404ee220, 0x10b3: 0x404ef020, + 0x10b4: 0x404ef220, 0x10b5: 0x404e1620, 0x10b6: 0x404e1a20, 0x10b7: 0x404e1e20, + 0x10b8: 0x404e2a20, 0x10b9: 0x404e3620, 0x10ba: 0x404e4420, 0x10bb: 0x404e6420, + 0x10bc: 0x404e6c20, 0x10bd: 0x404e7620, 0x10be: 0x404e7820, 0x10bf: 0x404e8020, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x404e9e20, 0x10c1: 0x404eac20, 0x10c2: 0x404e9c20, 0x10c3: 0x404ee020, + 0x10c4: 0x404f0020, 0x10c5: 0x404f0420, 0x10c6: 0x404f1220, 0x10c7: 0x404f2620, + 0x10c8: 0x404f2a20, 0x10c9: 0x404f2e20, 0x10ca: 0x404f3020, 0x10cb: 0x404f2820, + 0x10cc: 0x404f2c20, 0x10cd: 0xadc11302, 0x10ce: 0x404e7c20, 0x10cf: 0x404f3220, + 0x10d0: 0xe00001af, 0x10d1: 0xe0000243, 0x10d2: 0xe000035b, 0x10d3: 0xe0000435, + 0x10d4: 0xe000050a, 0x10d5: 0xe00005d4, 0x10d6: 0xe000069f, 0x10d7: 0xe0000747, + 0x10d8: 0xe00007f3, 0x10d9: 0xe0000898, 0x10da: 0x404f3420, 0x10db: 0x404f3620, + 0x10dc: 0x404ee420, 0x10dd: 0x404f0820, 0x10de: 0x4007a820, 0x10df: 0x4007aa20, + 0x10e0: 0x00379888, 0x10e1: 0x00379c88, 0x10e2: 0x0037a088, 0x10e3: 0x0037a488, + 0x10e4: 0x0037a888, 0x10e5: 0x0037ac88, 0x10e6: 0x0037b088, 0x10e7: 0x0037b888, + 0x10e8: 0x0037bc88, 0x10e9: 0x0037c088, 0x10ea: 0x0037c488, 0x10eb: 0x0037c888, + 0x10ec: 0x0037cc88, 0x10ed: 0x0037d488, 0x10ee: 0x0037d888, 0x10ef: 0x0037dc88, + 0x10f0: 0x0037e088, 0x10f1: 0x0037e488, 0x10f2: 0x0037e888, 0x10f3: 0x0037f088, + 0x10f4: 0x0037f488, 0x10f5: 0x0037f888, 0x10f6: 0x0037fc88, 0x10f7: 0x00380088, + 0x10f8: 0x00380488, 0x10f9: 0x00380888, 0x10fa: 0x00380c88, 0x10fb: 0x00381088, + 0x10fc: 0x00381488, 0x10fd: 0x00381888, 0x10fe: 0x00381c88, 0x10ff: 0x00382488, + // Block 0x44, offset 0x1100 + 0x1100: 0x00382888, 0x1101: 0x0037b488, 0x1102: 0x0037d088, 0x1103: 0x0037ec88, + 0x1104: 0x00382088, 0x1105: 0x00382c88, 0x1107: 0x00383288, + 0x110d: 0x00383c88, + 0x1110: 0x40379620, 0x1111: 0x40379a20, 0x1112: 0x40379e20, 0x1113: 0x4037a220, + 0x1114: 0x4037a620, 0x1115: 0x4037aa20, 0x1116: 0x4037ae20, 0x1117: 0x4037b620, + 0x1118: 0x4037ba20, 0x1119: 0x4037be20, 0x111a: 0x4037c220, 0x111b: 0x4037c620, + 0x111c: 0x4037ca20, 0x111d: 0x4037d220, 0x111e: 0x4037d620, 0x111f: 0x4037da20, + 0x1120: 0x4037de20, 0x1121: 0x4037e220, 0x1122: 0x4037e620, 0x1123: 0x4037ee20, + 0x1124: 0x4037f220, 0x1125: 0x4037f620, 0x1126: 0x4037fa20, 0x1127: 0x4037fe20, + 0x1128: 0x40380220, 0x1129: 0x40380620, 0x112a: 0x40380a20, 0x112b: 0x40380e20, + 0x112c: 0x40381220, 0x112d: 0x40381620, 0x112e: 0x40381a20, 0x112f: 0x40382220, + 0x1130: 0x40382620, 0x1131: 0x4037b220, 0x1132: 0x4037ce20, 0x1133: 0x4037ea20, + 0x1134: 0x40381e20, 0x1135: 0x40382a20, 0x1136: 0x40382e20, 0x1137: 0x40383020, + 0x1138: 0x40383420, 0x1139: 0x40383620, 0x113a: 0x40383820, 0x113b: 0x40036020, + 0x113c: 0x0037ca94, 0x113d: 0x40383a20, 0x113e: 0x40383e20, 0x113f: 0x40384020, + // Block 0x45, offset 0x1140 + 0x1140: 0x4062ac20, 0x1141: 0x4062ae20, 0x1142: 0x4062b020, 0x1143: 0x4062b220, + 0x1144: 0x4062b420, 0x1145: 0x4062b620, 0x1146: 0x4062b820, 0x1147: 0x4062ba20, + 0x1148: 0x4062bc20, 0x1149: 0x4062be20, 0x114a: 0x4062c020, 0x114b: 0x4062c220, + 0x114c: 0x4062c420, 0x114d: 0x4062c620, 0x114e: 0x4062c820, 0x114f: 0x4062ca20, + 0x1150: 0x4062cc20, 0x1151: 0x4062ce20, 0x1152: 0x4062d020, 0x1153: 0x4062d220, + 0x1154: 0x4062d420, 0x1155: 0x4062d620, 0x1156: 0x4062d820, 0x1157: 0x4062da20, + 0x1158: 0x4062dc20, 0x1159: 0x4062de20, 0x115a: 0x4062e020, 0x115b: 0x4062e220, + 0x115c: 0x4062e420, 0x115d: 0x4062e620, 0x115e: 0x4062e820, 0x115f: 0x4062ea20, + 0x1160: 0x4062ec20, 0x1161: 0x4062ee20, 0x1162: 0x4062f020, 0x1163: 0x4062f220, + 0x1164: 0x4062f420, 0x1165: 0x4062f620, 0x1166: 0x4062f820, 0x1167: 0x4062fa20, + 0x1168: 0x4062fc20, 0x1169: 0x4062fe20, 0x116a: 0x40630020, 0x116b: 0x40630220, + 0x116c: 0x40630420, 0x116d: 0x40630620, 0x116e: 0x40630820, 0x116f: 0x40630a20, + 0x1170: 0x40630c20, 0x1171: 0x40630e20, 0x1172: 0x40631020, 0x1173: 0x40631220, + 0x1174: 0x40631420, 0x1175: 0x40631620, 0x1176: 0x40631820, 0x1177: 0x40631a20, + 0x1178: 0x40631c20, 0x1179: 0x40631e20, 0x117a: 0x40632020, 0x117b: 0x40632220, + 0x117c: 0x40632420, 0x117d: 0x40632620, 0x117e: 0x40632820, 0x117f: 0x40632a20, + // Block 0x46, offset 0x1180 + 0x1180: 0x40632c20, 0x1181: 0x40632e20, 0x1182: 0x40633020, 0x1183: 0x40633220, + 0x1184: 0x40633420, 0x1185: 0x40633620, 0x1186: 0x40633820, 0x1187: 0x40633a20, + 0x1188: 0x40633c20, 0x1189: 0x40633e20, 0x118a: 0x40634020, 0x118b: 0x40634220, + 0x118c: 0x40634420, 0x118d: 0x40634620, 0x118e: 0x40634820, 0x118f: 0x40634a20, + 0x1190: 0x40634c20, 0x1191: 0x40634e20, 0x1192: 0x40635020, 0x1193: 0x40635220, + 0x1194: 0x40635420, 0x1195: 0x40635620, 0x1196: 0x40635820, 0x1197: 0x40635a20, + 0x1198: 0x40635c20, 0x1199: 0x40635e20, 0x119a: 0x40636020, 0x119b: 0x40636220, + 0x119c: 0x40636420, 0x119d: 0x40636620, 0x119e: 0x40636820, 0x119f: 0x4063a420, + 0x11a0: 0x4063a620, 0x11a1: 0x4063a820, 0x11a2: 0x4063aa20, 0x11a3: 0x4063ac20, + 0x11a4: 0x4063ae20, 0x11a5: 0x4063b020, 0x11a6: 0x4063b220, 0x11a7: 0x4063b420, + 0x11a8: 0x4063b620, 0x11a9: 0x4063b820, 0x11aa: 0x4063ba20, 0x11ab: 0x4063bc20, + 0x11ac: 0x4063be20, 0x11ad: 0x4063c020, 0x11ae: 0x4063c220, 0x11af: 0x4063c420, + 0x11b0: 0x4063c620, 0x11b1: 0x4063c820, 0x11b2: 0x4063ca20, 0x11b3: 0x4063cc20, + 0x11b4: 0x4063ce20, 0x11b5: 0x4063d020, 0x11b6: 0x4063d220, 0x11b7: 0x4063d420, + 0x11b8: 0x4063d620, 0x11b9: 0x4063d820, 0x11ba: 0x4063da20, 0x11bb: 0x4063dc20, + 0x11bc: 0x4063de20, 0x11bd: 0x4063e020, 0x11be: 0x4063e220, 0x11bf: 0x4063e420, + // Block 0x47, offset 0x11c0 + 0x11c0: 0x4063e620, 0x11c1: 0x4063e820, 0x11c2: 0x4063ea20, 0x11c3: 0x4063ec20, + 0x11c4: 0x4063ee20, 0x11c5: 0x4063f020, 0x11c6: 0x4063f220, 0x11c7: 0x4063f420, + 0x11c8: 0x4063f620, 0x11c9: 0x4063f820, 0x11ca: 0x4063fa20, 0x11cb: 0x4063fc20, + 0x11cc: 0x4063fe20, 0x11cd: 0x40640020, 0x11ce: 0x40640220, 0x11cf: 0x40640420, + 0x11d0: 0x40640620, 0x11d1: 0x40640820, 0x11d2: 0x40640a20, 0x11d3: 0x40640c20, + 0x11d4: 0x40640e20, 0x11d5: 0x40641020, 0x11d6: 0x40641220, 0x11d7: 0x40641420, + 0x11d8: 0x40641620, 0x11d9: 0x40641820, 0x11da: 0x40641a20, 0x11db: 0x40641c20, + 0x11dc: 0x40641e20, 0x11dd: 0x40642020, 0x11de: 0x40642220, 0x11df: 0x40642420, + 0x11e0: 0x40642620, 0x11e1: 0x40642820, 0x11e2: 0x40642a20, 0x11e3: 0x40642c20, + 0x11e4: 0x40642e20, 0x11e5: 0x40643020, 0x11e6: 0x40643220, 0x11e7: 0x40643420, + 0x11e8: 0x40646420, 0x11e9: 0x40646620, 0x11ea: 0x40646820, 0x11eb: 0x40646a20, + 0x11ec: 0x40646c20, 0x11ed: 0x40646e20, 0x11ee: 0x40647020, 0x11ef: 0x40647220, + 0x11f0: 0x40647420, 0x11f1: 0x40647620, 0x11f2: 0x40647820, 0x11f3: 0x40647a20, + 0x11f4: 0x40647c20, 0x11f5: 0x40647e20, 0x11f6: 0x40648020, 0x11f7: 0x40648220, + 0x11f8: 0x40648420, 0x11f9: 0x40648620, 0x11fa: 0x40648820, 0x11fb: 0x40648a20, + 0x11fc: 0x40648c20, 0x11fd: 0x40648e20, 0x11fe: 0x40649020, 0x11ff: 0x40649220, + // Block 0x48, offset 0x1200 + 0x1200: 0x40649420, 0x1201: 0x40649620, 0x1202: 0x40649820, 0x1203: 0x40649a20, + 0x1204: 0x40649c20, 0x1205: 0x40649e20, 0x1206: 0x4064a020, 0x1207: 0x4064a220, + 0x1208: 0x4064a420, 0x1209: 0x4064a620, 0x120a: 0x4064a820, 0x120b: 0x4064aa20, + 0x120c: 0x4064ac20, 0x120d: 0x4064ae20, 0x120e: 0x4064b020, 0x120f: 0x4064b220, + 0x1210: 0x4064b420, 0x1211: 0x4064b620, 0x1212: 0x4064b820, 0x1213: 0x4064ba20, + 0x1214: 0x4064bc20, 0x1215: 0x4064be20, 0x1216: 0x4064c020, 0x1217: 0x4064c220, + 0x1218: 0x4064c420, 0x1219: 0x4064c620, 0x121a: 0x4064c820, 0x121b: 0x4064ca20, + 0x121c: 0x4064cc20, 0x121d: 0x4064ce20, 0x121e: 0x4064d020, 0x121f: 0x4064d220, + 0x1220: 0x4064d420, 0x1221: 0x4064d620, 0x1222: 0x4064d820, 0x1223: 0x4064da20, + 0x1224: 0x4064dc20, 0x1225: 0x4064de20, 0x1226: 0x4064e020, 0x1227: 0x4064e220, + 0x1228: 0x4064e420, 0x1229: 0x4064e620, 0x122a: 0x4064e820, 0x122b: 0x4064ea20, + 0x122c: 0x4064ec20, 0x122d: 0x4064ee20, 0x122e: 0x4064f020, 0x122f: 0x4064f220, + 0x1230: 0x4064f420, 0x1231: 0x4064f620, 0x1232: 0x4064f820, 0x1233: 0x4064fa20, + 0x1234: 0x4064fc20, 0x1235: 0x4064fe20, 0x1236: 0x40650020, 0x1237: 0x40650220, + 0x1238: 0x40650420, 0x1239: 0x40650620, 0x123a: 0x40650820, 0x123b: 0x40650a20, + 0x123c: 0x40650c20, 0x123d: 0x40650e20, 0x123e: 0x40651020, 0x123f: 0x40651220, + // Block 0x49, offset 0x1240 + 0x1240: 0x403c2e20, 0x1241: 0x403c3020, 0x1242: 0x403c3220, 0x1243: 0x403c3420, + 0x1244: 0x403c3620, 0x1245: 0x403c3820, 0x1246: 0x403c3a20, 0x1247: 0x403c3c20, + 0x1248: 0x403c3e20, 0x1249: 0x403c4020, 0x124a: 0x403c4220, 0x124b: 0x403c4420, + 0x124c: 0x403c4620, 0x124d: 0x403c4820, 0x124e: 0x403c4a20, 0x124f: 0x403c4c20, + 0x1250: 0x403c5020, 0x1251: 0x403c5220, 0x1252: 0x403c5420, 0x1253: 0x403c5620, + 0x1254: 0x403c5820, 0x1255: 0x403c5a20, 0x1256: 0x403c5c20, 0x1257: 0x403c5e20, + 0x1258: 0x403c6020, 0x1259: 0x403c6220, 0x125a: 0x403c6420, 0x125b: 0x403c6620, + 0x125c: 0x403c6820, 0x125d: 0x403c6a20, 0x125e: 0x403c6c20, 0x125f: 0x403c6e20, + 0x1260: 0x403c7a20, 0x1261: 0x403c7c20, 0x1262: 0x403c7e20, 0x1263: 0x403c8020, + 0x1264: 0x403c8220, 0x1265: 0x403c8420, 0x1266: 0x403c8620, 0x1267: 0x403c8820, + 0x1268: 0x403c8a20, 0x1269: 0x403c8c20, 0x126a: 0x403c8e20, 0x126b: 0x403c9020, + 0x126c: 0x403c9220, 0x126d: 0x403c9420, 0x126e: 0x403c9620, 0x126f: 0x403c9820, + 0x1270: 0x403c9c20, 0x1271: 0x403c9e20, 0x1272: 0x403ca020, 0x1273: 0x403ca220, + 0x1274: 0x403ca420, 0x1275: 0x403ca620, 0x1276: 0x403ca820, 0x1277: 0x403caa20, + 0x1278: 0x403cba20, 0x1279: 0x403cbc20, 0x127a: 0x403cbe20, 0x127b: 0x403cc020, + 0x127c: 0x403cc220, 0x127d: 0x403cc420, 0x127e: 0x403cc620, 0x127f: 0x403cc820, + // Block 0x4a, offset 0x1280 + 0x1280: 0x403ccc20, 0x1281: 0x403cce20, 0x1282: 0x403cd020, 0x1283: 0x403cd220, + 0x1284: 0x403cd420, 0x1285: 0x403cd620, 0x1286: 0x403cd820, 0x1287: 0x403cda20, + 0x1288: 0x403cdc20, 0x128a: 0x403cde20, 0x128b: 0x403ce020, + 0x128c: 0x403ce220, 0x128d: 0x403ce420, + 0x1290: 0x403ce620, 0x1291: 0x403ce820, 0x1292: 0x403cea20, 0x1293: 0x403cec20, + 0x1294: 0x403cee20, 0x1295: 0x403cf020, 0x1296: 0x403cf220, + 0x1298: 0x403cf420, 0x129a: 0x403cf620, 0x129b: 0x403cf820, + 0x129c: 0x403cfa20, 0x129d: 0x403cfc20, + 0x12a0: 0x403cfe20, 0x12a1: 0x403d0020, 0x12a2: 0x403d0220, 0x12a3: 0x403d0420, + 0x12a4: 0x403d0620, 0x12a5: 0x403d0820, 0x12a6: 0x403d0a20, 0x12a7: 0x403d0c20, + 0x12a8: 0x403d1820, 0x12a9: 0x403d1a20, 0x12aa: 0x403d1c20, 0x12ab: 0x403d1e20, + 0x12ac: 0x403d2020, 0x12ad: 0x403d2220, 0x12ae: 0x403d2420, 0x12af: 0x403d2620, + 0x12b0: 0x403d2820, 0x12b1: 0x403d2a20, 0x12b2: 0x403d2c20, 0x12b3: 0x403d2e20, + 0x12b4: 0x403d3020, 0x12b5: 0x403d3220, 0x12b6: 0x403d3420, 0x12b7: 0x403d3620, + 0x12b8: 0x403d3a20, 0x12b9: 0x403d3c20, 0x12ba: 0x403d3e20, 0x12bb: 0x403d4020, + 0x12bc: 0x403d4220, 0x12bd: 0x403d4420, 0x12be: 0x403d4620, 0x12bf: 0x403d4820, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x403d4c20, 0x12c1: 0x403d4e20, 0x12c2: 0x403d5020, 0x12c3: 0x403d5220, + 0x12c4: 0x403d5420, 0x12c5: 0x403d5620, 0x12c6: 0x403d5820, 0x12c7: 0x403d5a20, + 0x12c8: 0x403d5c20, 0x12ca: 0x403d5e20, 0x12cb: 0x403d6020, + 0x12cc: 0x403d6220, 0x12cd: 0x403d6420, + 0x12d0: 0x403d6620, 0x12d1: 0x403d6820, 0x12d2: 0x403d6a20, 0x12d3: 0x403d6c20, + 0x12d4: 0x403d6e20, 0x12d5: 0x403d7020, 0x12d6: 0x403d7220, 0x12d7: 0x403d7420, + 0x12d8: 0x403d7820, 0x12d9: 0x403d7a20, 0x12da: 0x403d7c20, 0x12db: 0x403d7e20, + 0x12dc: 0x403d8020, 0x12dd: 0x403d8220, 0x12de: 0x403d8420, 0x12df: 0x403d8620, + 0x12e0: 0x403d8a20, 0x12e1: 0x403d8c20, 0x12e2: 0x403d8e20, 0x12e3: 0x403d9020, + 0x12e4: 0x403d9220, 0x12e5: 0x403d9420, 0x12e6: 0x403d9620, 0x12e7: 0x403d9820, + 0x12e8: 0x403d9c20, 0x12e9: 0x403d9e20, 0x12ea: 0x403da020, 0x12eb: 0x403da220, + 0x12ec: 0x403da420, 0x12ed: 0x403da620, 0x12ee: 0x403da820, 0x12ef: 0x403daa20, + 0x12f0: 0x403dac20, 0x12f2: 0x403dae20, 0x12f3: 0x403db020, + 0x12f4: 0x403db220, 0x12f5: 0x403db420, + 0x12f8: 0x403db620, 0x12f9: 0x403db820, 0x12fa: 0x403dba20, 0x12fb: 0x403dbc20, + 0x12fc: 0x403dbe20, 0x12fd: 0x403dc020, 0x12fe: 0x403dc220, + // Block 0x4c, offset 0x1300 + 0x1300: 0x403dc420, 0x1302: 0x403dc620, 0x1303: 0x403dc820, + 0x1304: 0x403dca20, 0x1305: 0x403dcc20, + 0x1308: 0x403dce20, 0x1309: 0x403dd020, 0x130a: 0x403dd220, 0x130b: 0x403dd420, + 0x130c: 0x403dd620, 0x130d: 0x403dd820, 0x130e: 0x403dda20, 0x130f: 0x403ddc20, + 0x1310: 0x403dde20, 0x1311: 0x403de020, 0x1312: 0x403de220, 0x1313: 0x403de420, + 0x1314: 0x403de620, 0x1315: 0x403de820, 0x1316: 0x403dea20, + 0x1318: 0x403dec20, 0x1319: 0x403dee20, 0x131a: 0x403df020, 0x131b: 0x403df220, + 0x131c: 0x403df420, 0x131d: 0x403df620, 0x131e: 0x403df820, 0x131f: 0x403dfa20, + 0x1320: 0x403e0a20, 0x1321: 0x403e0c20, 0x1322: 0x403e0e20, 0x1323: 0x403e1020, + 0x1324: 0x403e1220, 0x1325: 0x403e1420, 0x1326: 0x403e1620, 0x1327: 0x403e1820, + 0x1328: 0x403e1a20, 0x1329: 0x403e1c20, 0x132a: 0x403e1e20, 0x132b: 0x403e2020, + 0x132c: 0x403e2220, 0x132d: 0x403e2420, 0x132e: 0x403e2620, 0x132f: 0x403e2820, + 0x1330: 0x403e2a20, 0x1331: 0x403e2c20, 0x1332: 0x403e2e20, 0x1333: 0x403e3020, + 0x1334: 0x403e3220, 0x1335: 0x403e3420, 0x1336: 0x403e3620, 0x1337: 0x403e3820, + 0x1338: 0x403e4820, 0x1339: 0x403e4a20, 0x133a: 0x403e4c20, 0x133b: 0x403e4e20, + 0x133c: 0x403e5020, 0x133d: 0x403e5220, 0x133e: 0x403e5420, 0x133f: 0x403e5620, + // Block 0x4d, offset 0x1340 + 0x1340: 0x403e5a20, 0x1341: 0x403e5c20, 0x1342: 0x403e5e20, 0x1343: 0x403e6020, + 0x1344: 0x403e6220, 0x1345: 0x403e6420, 0x1346: 0x403e6620, 0x1347: 0x403e6820, + 0x1348: 0x403e6c20, 0x1349: 0x403e6e20, 0x134a: 0x403e7020, 0x134b: 0x403e7220, + 0x134c: 0x403e7420, 0x134d: 0x403e7620, 0x134e: 0x403e7820, 0x134f: 0x403e7a20, + 0x1350: 0x403e7c20, 0x1352: 0x403e7e20, 0x1353: 0x403e8020, + 0x1354: 0x403e8220, 0x1355: 0x403e8420, + 0x1358: 0x403e8620, 0x1359: 0x403e8820, 0x135a: 0x403e8a20, 0x135b: 0x403e8c20, + 0x135c: 0x403e8e20, 0x135d: 0x403e9020, 0x135e: 0x403e9220, 0x135f: 0x403e9420, + 0x1360: 0x403e9e20, 0x1361: 0x403ea020, 0x1362: 0x403ea220, 0x1363: 0x403ea420, + 0x1364: 0x403ea620, 0x1365: 0x403ea820, 0x1366: 0x403eaa20, 0x1367: 0x403eac20, + 0x1368: 0x403eb020, 0x1369: 0x403eb220, 0x136a: 0x403eb420, 0x136b: 0x403eb620, + 0x136c: 0x403eb820, 0x136d: 0x403eba20, 0x136e: 0x403ebc20, 0x136f: 0x403ebe20, + 0x1370: 0x403ed020, 0x1371: 0x403ed220, 0x1372: 0x403ed420, 0x1373: 0x403ed620, + 0x1374: 0x403ed820, 0x1375: 0x403eda20, 0x1376: 0x403edc20, 0x1377: 0x403ede20, + 0x1378: 0x403ee220, 0x1379: 0x403ee420, 0x137a: 0x403ee620, 0x137b: 0x403ee820, + 0x137c: 0x403eea20, 0x137d: 0x403eec20, 0x137e: 0x403eee20, 0x137f: 0x403ef020, + // Block 0x4e, offset 0x1380 + 0x1380: 0x403f0020, 0x1381: 0x403f0220, 0x1382: 0x403f0420, 0x1383: 0x403f0620, + 0x1384: 0x403f0820, 0x1385: 0x403f0a20, 0x1386: 0x403f0c20, 0x1387: 0x403f0e20, + 0x1388: 0x403f1020, 0x1389: 0x403f1220, 0x138a: 0x403f1420, 0x138b: 0x403f1620, + 0x138c: 0x403f1820, 0x138d: 0x403f1a20, 0x138e: 0x403f1c20, 0x138f: 0x403f1e20, + 0x1390: 0x403f2820, 0x1391: 0x403f2a20, 0x1392: 0x403f2c20, 0x1393: 0x403f2e20, + 0x1394: 0x403f3020, 0x1395: 0x403f3220, 0x1396: 0x403f3420, 0x1397: 0x403f3620, + 0x1398: 0x403f4220, 0x1399: 0x403f4420, 0x139a: 0x403f4620, + 0x139d: 0xae60ee02, 0x139e: 0xae60ed02, 0x139f: 0xae60ec02, + 0x13a0: 0x40036220, 0x13a1: 0x40029c20, 0x13a2: 0x4002ee20, 0x13a3: 0x40029e20, + 0x13a4: 0x4002a020, 0x13a5: 0x4002a220, 0x13a6: 0x4002a420, 0x13a7: 0x4002d020, + 0x13a8: 0x40036420, 0x13a9: 0xe00001f2, 0x13aa: 0xe000030d, 0x13ab: 0xe00003e7, + 0x13ac: 0xe00004c2, 0x13ad: 0xe000058c, 0x13ae: 0xe0000657, 0x13af: 0xe00006ff, + 0x13b0: 0xe00007ab, 0x13b1: 0xe0000850, 0x13b2: 0x40286620, 0x13b3: 0x40286820, + 0x13b4: 0x40286a20, 0x13b5: 0x40286c20, 0x13b6: 0x40286e20, 0x13b7: 0x40287020, + 0x13b8: 0x40287220, 0x13b9: 0x40287420, 0x13ba: 0x40287620, 0x13bb: 0x40287820, + 0x13bc: 0x40287a20, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x403c7020, 0x13c1: 0x403c7220, 0x13c2: 0x403c7420, 0x13c3: 0x403c7620, + 0x13c4: 0x403d0e20, 0x13c5: 0x403d1020, 0x13c6: 0x403d1220, 0x13c7: 0x403d1420, + 0x13c8: 0x403f2020, 0x13c9: 0x403f2220, 0x13ca: 0x403f2420, 0x13cb: 0x403f2620, + 0x13cc: 0x403f3820, 0x13cd: 0x403f3a20, 0x13ce: 0x403f3c20, 0x13cf: 0x403f3e20, + 0x13d0: 0x4006a620, 0x13d1: 0x4006a820, 0x13d2: 0x4006aa20, 0x13d3: 0x4006ac20, + 0x13d4: 0x4006ae20, 0x13d5: 0x4006b020, 0x13d6: 0x4006b220, 0x13d7: 0x4006b420, + 0x13d8: 0x4006b620, 0x13d9: 0x4006b820, + 0x13e0: 0x40547620, 0x13e1: 0x40547820, 0x13e2: 0x40547a20, 0x13e3: 0x40547c20, + 0x13e4: 0x40547e20, 0x13e5: 0x40548020, 0x13e6: 0x40548220, 0x13e7: 0x40548420, + 0x13e8: 0x40548620, 0x13e9: 0x40548820, 0x13ea: 0x40548a20, 0x13eb: 0x40548c20, + 0x13ec: 0x40548e20, 0x13ed: 0x40549020, 0x13ee: 0x40549220, 0x13ef: 0x40549420, + 0x13f0: 0x40549620, 0x13f1: 0x40549820, 0x13f2: 0x40549a20, 0x13f3: 0x40549c20, + 0x13f4: 0x40549e20, 0x13f5: 0x4054a020, 0x13f6: 0x4054a220, 0x13f7: 0x4054a420, + 0x13f8: 0x4054a620, 0x13f9: 0x4054a820, 0x13fa: 0x4054aa20, 0x13fb: 0x4054ac20, + 0x13fc: 0x4054ae20, 0x13fd: 0x4054b020, 0x13fe: 0x4054b220, 0x13ff: 0x4054b420, + // Block 0x50, offset 0x1400 + 0x1400: 0x4054b620, 0x1401: 0x4054b820, 0x1402: 0x4054ba20, 0x1403: 0x4054bc20, + 0x1404: 0x4054be20, 0x1405: 0x4054c020, 0x1406: 0x4054c220, 0x1407: 0x4054c420, + 0x1408: 0x4054c620, 0x1409: 0x4054c820, 0x140a: 0x4054ca20, 0x140b: 0x4054cc20, + 0x140c: 0x4054ce20, 0x140d: 0x4054d020, 0x140e: 0x4054d220, 0x140f: 0x4054d420, + 0x1410: 0x4054d620, 0x1411: 0x4054d820, 0x1412: 0x4054da20, 0x1413: 0x4054dc20, + 0x1414: 0x4054de20, 0x1415: 0x4054e020, 0x1416: 0x4054e220, 0x1417: 0x4054e420, + 0x1418: 0x4054e620, 0x1419: 0x4054e820, 0x141a: 0x4054ea20, 0x141b: 0x4054ec20, + 0x141c: 0x4054ee20, 0x141d: 0x4054f020, 0x141e: 0x4054f220, 0x141f: 0x4054f420, + 0x1420: 0x4054f620, 0x1421: 0x4054f820, 0x1422: 0x4054fa20, 0x1423: 0x4054fc20, + 0x1424: 0x4054fe20, 0x1425: 0x40550020, 0x1426: 0x40550220, 0x1427: 0x40550420, + 0x1428: 0x40550620, 0x1429: 0x40550820, 0x142a: 0x40550a20, 0x142b: 0x40550c20, + 0x142c: 0x40550e20, 0x142d: 0x40551020, 0x142e: 0x40551220, 0x142f: 0x40551420, + 0x1430: 0x40551620, 0x1431: 0x40551820, 0x1432: 0x40551a20, 0x1433: 0x40551c20, + 0x1434: 0x40551e20, + // Block 0x51, offset 0x1440 + 0x1440: 0x40021e20, 0x1441: 0x40552020, 0x1442: 0x40552220, 0x1443: 0x40552420, + 0x1444: 0x40552620, 0x1445: 0x40552820, 0x1446: 0x40552a20, 0x1447: 0x40552c20, + 0x1448: 0x40552e20, 0x1449: 0x40553020, 0x144a: 0x40553220, 0x144b: 0x40553420, + 0x144c: 0x40553620, 0x144d: 0x40553820, 0x144e: 0x40553a20, 0x144f: 0x40553c20, + 0x1450: 0x40553e20, 0x1451: 0x40554020, 0x1452: 0x40554220, 0x1453: 0x40554420, + 0x1454: 0x40554620, 0x1455: 0x40554820, 0x1456: 0x40554a20, 0x1457: 0x40554c20, + 0x1458: 0x40554e20, 0x1459: 0x40555020, 0x145a: 0x40555220, 0x145b: 0x40555420, + 0x145c: 0x40555620, 0x145d: 0x40555820, 0x145e: 0x40555a20, 0x145f: 0x40555c20, + 0x1460: 0x40555e20, 0x1461: 0x40556020, 0x1462: 0x40556220, 0x1463: 0x40556420, + 0x1464: 0x40556620, 0x1465: 0x40556820, 0x1466: 0x40556a20, 0x1467: 0x40556c20, + 0x1468: 0x40556e20, 0x1469: 0x40557020, 0x146a: 0x40557220, 0x146b: 0x40557420, + 0x146c: 0x40557620, 0x146d: 0x40557820, 0x146e: 0x40557a20, 0x146f: 0x40557c20, + 0x1470: 0x40557e20, 0x1471: 0x40558020, 0x1472: 0x40558220, 0x1473: 0x40558420, + 0x1474: 0x40558620, 0x1475: 0x40558820, 0x1476: 0x40558a20, 0x1477: 0x40558c20, + 0x1478: 0x40558e20, 0x1479: 0x40559020, 0x147a: 0x40559220, 0x147b: 0x40559420, + 0x147c: 0x40559620, 0x147d: 0x40559820, 0x147e: 0x40559a20, 0x147f: 0x40559c20, + // Block 0x52, offset 0x1480 + 0x1480: 0x40559e20, 0x1481: 0x4055a020, 0x1482: 0x4055a220, 0x1483: 0x4055a420, + 0x1484: 0x4055a620, 0x1485: 0x4055a820, 0x1486: 0x4055aa20, 0x1487: 0x4055ac20, + 0x1488: 0x4055ae20, 0x1489: 0x4055b020, 0x148a: 0x4055b220, 0x148b: 0x4055b420, + 0x148c: 0x4055b620, 0x148d: 0x4055b820, 0x148e: 0x4055ba20, 0x148f: 0x4055bc20, + 0x1490: 0x4055be20, 0x1491: 0x4055c020, 0x1492: 0x4055c220, 0x1493: 0x4055c420, + 0x1494: 0x4055c620, 0x1495: 0x4055c820, 0x1496: 0x4055ca20, 0x1497: 0x4055cc20, + 0x1498: 0x4055ce20, 0x1499: 0x4055d020, 0x149a: 0x4055d220, 0x149b: 0x4055d420, + 0x149c: 0x4055d620, 0x149d: 0x4055d820, 0x149e: 0x4055da20, 0x149f: 0x4055dc20, + 0x14a0: 0x4055de20, 0x14a1: 0x4055e020, 0x14a2: 0x4055e220, 0x14a3: 0x4055e420, + 0x14a4: 0x4055e620, 0x14a5: 0x4055e820, 0x14a6: 0x4055ea20, 0x14a7: 0x4055ec20, + 0x14a8: 0x4055ee20, 0x14a9: 0x4055f020, 0x14aa: 0x4055f220, 0x14ab: 0x4055f420, + 0x14ac: 0x4055f620, 0x14ad: 0x4055f820, 0x14ae: 0x4055fa20, 0x14af: 0x4055fc20, + 0x14b0: 0x4055fe20, 0x14b1: 0x40560020, 0x14b2: 0x40560220, 0x14b3: 0x40560420, + 0x14b4: 0x40560620, 0x14b5: 0x40560820, 0x14b6: 0x40560a20, 0x14b7: 0x40560c20, + 0x14b8: 0x40560e20, 0x14b9: 0x40561020, 0x14ba: 0x40561220, 0x14bb: 0x40561420, + 0x14bc: 0x40561620, 0x14bd: 0x40561820, 0x14be: 0x40561a20, 0x14bf: 0x40561c20, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x40561e20, 0x14c1: 0x40562020, 0x14c2: 0x40562220, 0x14c3: 0x40562420, + 0x14c4: 0x40562620, 0x14c5: 0x40562820, 0x14c6: 0x40562a20, 0x14c7: 0x40562c20, + 0x14c8: 0x40562e20, 0x14c9: 0x40563020, 0x14ca: 0x40563220, 0x14cb: 0x40563420, + 0x14cc: 0x40563620, 0x14cd: 0x40563820, 0x14ce: 0x40563a20, 0x14cf: 0x40563c20, + 0x14d0: 0x40563e20, 0x14d1: 0x40564020, 0x14d2: 0x40564220, 0x14d3: 0x40564420, + 0x14d4: 0x40564620, 0x14d5: 0x40564820, 0x14d6: 0x40564a20, 0x14d7: 0x40564c20, + 0x14d8: 0x40564e20, 0x14d9: 0x40565020, 0x14da: 0x40565220, 0x14db: 0x40565420, + 0x14dc: 0x40565620, 0x14dd: 0x40565820, 0x14de: 0x40565a20, 0x14df: 0x40565c20, + 0x14e0: 0x40565e20, 0x14e1: 0x40566020, 0x14e2: 0x40566220, 0x14e3: 0x40566420, + 0x14e4: 0x40566620, 0x14e5: 0x40566820, 0x14e6: 0x40566a20, 0x14e7: 0x40566c20, + 0x14e8: 0x40566e20, 0x14e9: 0x40567020, 0x14ea: 0x40567220, 0x14eb: 0x40567420, + 0x14ec: 0x40567620, 0x14ed: 0x40567820, 0x14ee: 0x40567a20, 0x14ef: 0x40567c20, + 0x14f0: 0x40567e20, 0x14f1: 0x40568020, 0x14f2: 0x40568220, 0x14f3: 0x40568420, + 0x14f4: 0x40568620, 0x14f5: 0x40568820, 0x14f6: 0x40568a20, 0x14f7: 0x40568c20, + 0x14f8: 0x40568e20, 0x14f9: 0x40569020, 0x14fa: 0x40569220, 0x14fb: 0x40569420, + 0x14fc: 0x40569620, 0x14fd: 0x40569820, 0x14fe: 0x40569a20, 0x14ff: 0x40569c20, + // Block 0x54, offset 0x1500 + 0x1500: 0x40569e20, 0x1501: 0x4056a020, 0x1502: 0x4056a220, 0x1503: 0x4056a420, + 0x1504: 0x4056a620, 0x1505: 0x4056a820, 0x1506: 0x4056aa20, 0x1507: 0x4056ac20, + 0x1508: 0x4056ae20, 0x1509: 0x4056b020, 0x150a: 0x4056b220, 0x150b: 0x4056b420, + 0x150c: 0x4056b620, 0x150d: 0x4056b820, 0x150e: 0x4056ba20, 0x150f: 0x4056bc20, + 0x1510: 0x4056be20, 0x1511: 0x4056c020, 0x1512: 0x4056c220, 0x1513: 0x4056c420, + 0x1514: 0x4056c620, 0x1515: 0x4056c820, 0x1516: 0x4056ca20, 0x1517: 0x4056cc20, + 0x1518: 0x4056ce20, 0x1519: 0x4056d020, 0x151a: 0x4056d220, 0x151b: 0x4056d420, + 0x151c: 0x4056d620, 0x151d: 0x4056d820, 0x151e: 0x4056da20, 0x151f: 0x4056dc20, + 0x1520: 0x4056de20, 0x1521: 0x4056e020, 0x1522: 0x4056e220, 0x1523: 0x4056e420, + 0x1524: 0x4056e620, 0x1525: 0x4056e820, 0x1526: 0x4056ea20, 0x1527: 0x4056ec20, + 0x1528: 0x4056ee20, 0x1529: 0x4056f020, 0x152a: 0x4056f220, 0x152b: 0x4056f420, + 0x152c: 0x4056f620, 0x152d: 0x4056f820, 0x152e: 0x4056fa20, 0x152f: 0x4056fc20, + 0x1530: 0x4056fe20, 0x1531: 0x40570020, 0x1532: 0x40570220, 0x1533: 0x40570420, + 0x1534: 0x40570620, 0x1535: 0x40570820, 0x1536: 0x40570a20, 0x1537: 0x40570c20, + 0x1538: 0x40570e20, 0x1539: 0x40571020, 0x153a: 0x40571220, 0x153b: 0x40571420, + 0x153c: 0x40571620, 0x153d: 0x40571820, 0x153e: 0x40571a20, 0x153f: 0x40571c20, + // Block 0x55, offset 0x1540 + 0x1540: 0x40571e20, 0x1541: 0x40572020, 0x1542: 0x40572220, 0x1543: 0x40572420, + 0x1544: 0x40572620, 0x1545: 0x40572820, 0x1546: 0x40572a20, 0x1547: 0x40572c20, + 0x1548: 0x40572e20, 0x1549: 0x40573020, 0x154a: 0x40573220, 0x154b: 0x40573420, + 0x154c: 0x40573620, 0x154d: 0x40573820, 0x154e: 0x40573a20, 0x154f: 0x40573c20, + 0x1550: 0x40573e20, 0x1551: 0x40574020, 0x1552: 0x40574220, 0x1553: 0x40574420, + 0x1554: 0x40574620, 0x1555: 0x40574820, 0x1556: 0x40574a20, 0x1557: 0x40574c20, + 0x1558: 0x40574e20, 0x1559: 0x40575020, 0x155a: 0x40575220, 0x155b: 0x40575420, + 0x155c: 0x40575620, 0x155d: 0x40575820, 0x155e: 0x40575a20, 0x155f: 0x40575c20, + 0x1560: 0x40575e20, 0x1561: 0x40576020, 0x1562: 0x40576220, 0x1563: 0x40576420, + 0x1564: 0x40576620, 0x1565: 0x40576820, 0x1566: 0x40576a20, 0x1567: 0x40576c20, + 0x1568: 0x40576e20, 0x1569: 0x40577020, 0x156a: 0x40577220, 0x156b: 0x40577420, + 0x156c: 0x40577620, 0x156d: 0x40577820, 0x156e: 0x40577a20, 0x156f: 0x40577c20, + 0x1570: 0x40577e20, 0x1571: 0x40578020, 0x1572: 0x40578220, 0x1573: 0x40578420, + 0x1574: 0x40578620, 0x1575: 0x40578820, 0x1576: 0x40578a20, 0x1577: 0x40578c20, + 0x1578: 0x40578e20, 0x1579: 0x40579020, 0x157a: 0x40579220, 0x157b: 0x40579420, + 0x157c: 0x40579620, 0x157d: 0x40579820, 0x157e: 0x40579a20, 0x157f: 0x40579c20, + // Block 0x56, offset 0x1580 + 0x1580: 0x40579e20, 0x1581: 0x4057a020, 0x1582: 0x4057a220, 0x1583: 0x4057a420, + 0x1584: 0x4057a620, 0x1585: 0x4057a820, 0x1586: 0x4057aa20, 0x1587: 0x4057ac20, + 0x1588: 0x4057ae20, 0x1589: 0x4057b020, 0x158a: 0x4057b220, 0x158b: 0x4057b420, + 0x158c: 0x4057b620, 0x158d: 0x4057b820, 0x158e: 0x4057ba20, 0x158f: 0x4057bc20, + 0x1590: 0x4057be20, 0x1591: 0x4057c020, 0x1592: 0x4057c220, 0x1593: 0x4057c420, + 0x1594: 0x4057c620, 0x1595: 0x4057c820, 0x1596: 0x4057ca20, 0x1597: 0x4057cc20, + 0x1598: 0x4057ce20, 0x1599: 0x4057d020, 0x159a: 0x4057d220, 0x159b: 0x4057d420, + 0x159c: 0x4057d620, 0x159d: 0x4057d820, 0x159e: 0x4057da20, 0x159f: 0x4057dc20, + 0x15a0: 0x4057de20, 0x15a1: 0x4057e020, 0x15a2: 0x4057e220, 0x15a3: 0x4057e420, + 0x15a4: 0x4057e620, 0x15a5: 0x4057e820, 0x15a6: 0x4057ea20, 0x15a7: 0x4057ec20, + 0x15a8: 0x4057ee20, 0x15a9: 0x4057f020, 0x15aa: 0x4057f220, 0x15ab: 0x4057f420, + 0x15ac: 0x4057f620, 0x15ad: 0x4057f820, 0x15ae: 0x4057fa20, 0x15af: 0x4057fc20, + 0x15b0: 0x4057fe20, 0x15b1: 0x40580020, 0x15b2: 0x40580220, 0x15b3: 0x40580420, + 0x15b4: 0x40580620, 0x15b5: 0x40580820, 0x15b6: 0x40580a20, 0x15b7: 0x40580c20, + 0x15b8: 0x40580e20, 0x15b9: 0x40581020, 0x15ba: 0x40581220, 0x15bb: 0x40581420, + 0x15bc: 0x40587a20, 0x15bd: 0x40581620, 0x15be: 0x40581a20, 0x15bf: 0x40581c20, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x40581e20, 0x15c1: 0x40582020, 0x15c2: 0x40582220, 0x15c3: 0x40582420, + 0x15c4: 0x40582620, 0x15c5: 0x40582820, 0x15c6: 0x40582a20, 0x15c7: 0x40582c20, + 0x15c8: 0x40582e20, 0x15c9: 0x40583020, 0x15ca: 0x40583220, 0x15cb: 0x40583420, + 0x15cc: 0x40583620, 0x15cd: 0x40583820, 0x15ce: 0x40583c20, 0x15cf: 0x40583e20, + 0x15d0: 0x40584020, 0x15d1: 0x40584220, 0x15d2: 0x40584420, 0x15d3: 0x40584620, + 0x15d4: 0x40584820, 0x15d5: 0x40584a20, 0x15d6: 0x40585820, 0x15d7: 0x40585a20, + 0x15d8: 0x40585c20, 0x15d9: 0x40585e20, 0x15da: 0x40586020, 0x15db: 0x40586220, + 0x15dc: 0x40586420, 0x15dd: 0x40586620, 0x15de: 0x40586820, 0x15df: 0x40586a20, + 0x15e0: 0x40586c20, 0x15e1: 0x40586e20, 0x15e2: 0x40587020, 0x15e3: 0x40587220, + 0x15e4: 0x40587420, 0x15e5: 0x40587620, 0x15e6: 0x40587820, 0x15e7: 0x40587c20, + 0x15e8: 0x40587e20, 0x15e9: 0x40588020, 0x15ea: 0x40588220, 0x15eb: 0x40588420, + 0x15ec: 0x40588620, 0x15ed: 0x40588820, 0x15ee: 0x40588a20, 0x15ef: 0x40588c20, + 0x15f0: 0x40588e20, 0x15f1: 0x40589020, 0x15f2: 0x40589220, 0x15f3: 0x40589420, + 0x15f4: 0x40589620, 0x15f5: 0x40589820, 0x15f6: 0x40589a20, 0x15f7: 0x40589c20, + 0x15f8: 0x40589e20, 0x15f9: 0x4058a020, 0x15fa: 0x4058a220, 0x15fb: 0x4058a420, + 0x15fc: 0x4058a620, 0x15fd: 0x4058a820, 0x15fe: 0x4058aa20, 0x15ff: 0x4058ac20, + // Block 0x58, offset 0x1600 + 0x1600: 0x4058ae20, 0x1601: 0x4058b020, 0x1602: 0x4058b220, 0x1603: 0x4058b420, + 0x1604: 0x4058b620, 0x1605: 0x4058b820, 0x1606: 0x4058ba20, 0x1607: 0x4058bc20, + 0x1608: 0x4058be20, 0x1609: 0x4058c020, 0x160a: 0x4058c220, 0x160b: 0x4058c420, + 0x160c: 0x4058c620, 0x160d: 0x4058c820, 0x160e: 0x4058ca20, 0x160f: 0x4058cc20, + 0x1610: 0x4058ce20, 0x1611: 0x4058d020, 0x1612: 0x4058d220, 0x1613: 0x4058d420, + 0x1614: 0x4058d620, 0x1615: 0x4058d820, 0x1616: 0x4058da20, 0x1617: 0x4058dc20, + 0x1618: 0x4058de20, 0x1619: 0x4058e020, 0x161a: 0x4058e220, 0x161b: 0x4058e420, + 0x161c: 0x4058e620, 0x161d: 0x4058e820, 0x161e: 0x4058ea20, 0x161f: 0x4058ec20, + 0x1620: 0x4058ee20, 0x1621: 0x4058f020, 0x1622: 0x4058f220, 0x1623: 0x4058f420, + 0x1624: 0x4058f620, 0x1625: 0x4058f820, 0x1626: 0x4058fa20, 0x1627: 0x4058fc20, + 0x1628: 0x4058fe20, 0x1629: 0x40590020, 0x162a: 0x40590220, 0x162b: 0x40590420, + 0x162c: 0x40590620, 0x162d: 0x40590820, 0x162e: 0x40590a20, 0x162f: 0x40590c20, + 0x1630: 0x40590e20, 0x1631: 0x40591020, 0x1632: 0x40591220, 0x1633: 0x40591420, + 0x1634: 0x40591620, 0x1635: 0x40591820, 0x1636: 0x40591a20, 0x1637: 0x40591c20, + 0x1638: 0x40591e20, 0x1639: 0x40592020, 0x163a: 0x40592220, 0x163b: 0x40592420, + 0x163c: 0x40592620, 0x163d: 0x40592820, 0x163e: 0x40592a20, 0x163f: 0x40592c20, + // Block 0x59, offset 0x1640 + 0x1640: 0x40592e20, 0x1641: 0x40593020, 0x1642: 0x40593220, 0x1643: 0x40593420, + 0x1644: 0x40593620, 0x1645: 0x40593820, 0x1646: 0x40593a20, 0x1647: 0x40593c20, + 0x1648: 0x40593e20, 0x1649: 0x40594020, 0x164a: 0x40594220, 0x164b: 0x40594420, + 0x164c: 0x40594620, 0x164d: 0x40594820, 0x164e: 0x40594a20, 0x164f: 0x40594c20, + 0x1650: 0x40594e20, 0x1651: 0x40595020, 0x1652: 0x40595220, 0x1653: 0x40595420, + 0x1654: 0x40595620, 0x1655: 0x40595820, 0x1656: 0x40595a20, 0x1657: 0x40595c20, + 0x1658: 0x40595e20, 0x1659: 0x40596020, 0x165a: 0x40596220, 0x165b: 0x40596420, + 0x165c: 0x40596620, 0x165d: 0x40596820, 0x165e: 0x40596a20, 0x165f: 0x40596c20, + 0x1660: 0x40596e20, 0x1661: 0x40597020, 0x1662: 0x40597220, 0x1663: 0x40597420, + 0x1664: 0x40597620, 0x1665: 0x40597820, 0x1666: 0x40597a20, 0x1667: 0x40597c20, + 0x1668: 0x40597e20, 0x1669: 0x40598020, 0x166a: 0x40598220, 0x166b: 0x40598420, + 0x166c: 0x40598620, 0x166d: 0x40598820, 0x166e: 0x40598a20, 0x166f: 0x40598c20, + 0x1670: 0x40598e20, 0x1671: 0x40599020, 0x1672: 0x40599220, 0x1673: 0x40599420, + 0x1674: 0x40599620, 0x1675: 0x40599820, 0x1676: 0x40599a20, 0x1677: 0x40599c20, + 0x1678: 0x40599e20, 0x1679: 0x4059a020, 0x167a: 0x4059a220, 0x167b: 0x4059a420, + 0x167c: 0x4059a620, 0x167d: 0x4059a820, 0x167e: 0x4059aa20, 0x167f: 0x4059ac20, + // Block 0x5a, offset 0x1680 + 0x1680: 0x4059ae20, 0x1681: 0x4059b020, 0x1682: 0x4059b220, 0x1683: 0x4059b420, + 0x1684: 0x4059b620, 0x1685: 0x4059b820, 0x1686: 0x4059ba20, 0x1687: 0x4059bc20, + 0x1688: 0x4059be20, 0x1689: 0x4059c020, 0x168a: 0x4059c220, 0x168b: 0x4059c420, + 0x168c: 0x4059c620, 0x168d: 0x4059c820, 0x168e: 0x4059ca20, 0x168f: 0x4059cc20, + 0x1690: 0x4059ce20, 0x1691: 0x4059d020, 0x1692: 0x4059d220, 0x1693: 0x4059d420, + 0x1694: 0x4059d620, 0x1695: 0x4059d820, 0x1696: 0x4059da20, 0x1697: 0x4059dc20, + 0x1698: 0x4059de20, 0x1699: 0x4059e020, 0x169a: 0x4059e220, 0x169b: 0x4059e420, + 0x169c: 0x4059e620, 0x169d: 0x4059e820, 0x169e: 0x4059ea20, 0x169f: 0x4059ec20, + 0x16a0: 0x4059ee20, 0x16a1: 0x4059f020, 0x16a2: 0x4059f220, 0x16a3: 0x4059f420, + 0x16a4: 0x4059f620, 0x16a5: 0x4059f820, 0x16a6: 0x4059fa20, 0x16a7: 0x4059fc20, + 0x16a8: 0x4059fe20, 0x16a9: 0x405a0020, 0x16aa: 0x405a0220, 0x16ab: 0x405a0420, + 0x16ac: 0x405a0620, 0x16ad: 0x4005d420, 0x16ae: 0x4002f420, 0x16af: 0x40581820, + 0x16b0: 0x40583a20, 0x16b1: 0x40584c20, 0x16b2: 0x40584e20, 0x16b3: 0x40585020, + 0x16b4: 0x40585220, 0x16b5: 0x40585420, 0x16b6: 0x40585620, 0x16b7: 0x405a0820, + 0x16b8: 0x405a0a20, 0x16b9: 0x405a0c20, 0x16ba: 0x405a0e20, 0x16bb: 0x405a1020, + 0x16bc: 0x405a1220, 0x16bd: 0x405a1420, 0x16be: 0x405a1620, 0x16bf: 0x405a1820, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x00021284, 0x16c1: 0x405aa620, 0x16c2: 0x405aa820, 0x16c3: 0x405aaa20, + 0x16c4: 0x405aac20, 0x16c5: 0x405aae20, 0x16c6: 0x405ab020, 0x16c7: 0x405ab220, + 0x16c8: 0x405ab420, 0x16c9: 0x405ab620, 0x16ca: 0x405ab820, 0x16cb: 0x405aba20, + 0x16cc: 0x405abc20, 0x16cd: 0x405abe20, 0x16ce: 0x405ac020, 0x16cf: 0x405ac220, + 0x16d0: 0x405ac420, 0x16d1: 0x405ac620, 0x16d2: 0x405ac820, 0x16d3: 0x405aca20, + 0x16d4: 0x405acc20, 0x16d5: 0x405ace20, 0x16d6: 0x405ad020, 0x16d7: 0x405ad220, + 0x16d8: 0x405ad420, 0x16d9: 0x405ad620, 0x16da: 0x405ad820, 0x16db: 0x40040820, + 0x16dc: 0x40040a20, + 0x16e0: 0x405ada20, 0x16e1: 0xe000202d, 0x16e2: 0x405adc20, 0x16e3: 0x405b1420, + 0x16e4: 0xe0002030, 0x16e5: 0xe0002033, 0x16e6: 0x405ade20, 0x16e7: 0xe0002036, + 0x16e8: 0x405ae020, 0x16e9: 0xe000203c, 0x16ea: 0x405b1020, 0x16eb: 0x405b1220, + 0x16ec: 0xe000203f, 0x16ed: 0xe0002042, 0x16ee: 0xe0002045, 0x16ef: 0x405ae220, + 0x16f0: 0x405ae420, 0x16f1: 0x405ae620, 0x16f2: 0x405ae820, 0x16f3: 0xe0002048, + 0x16f4: 0xe000204b, 0x16f5: 0xe000204e, 0x16f6: 0xe0002051, 0x16f7: 0x405aea20, + 0x16f8: 0x405b1a20, 0x16f9: 0x405aec20, 0x16fa: 0x405aee20, 0x16fb: 0xe0002057, + 0x16fc: 0xe000205a, 0x16fd: 0xe000205d, 0x16fe: 0x405af020, 0x16ff: 0xe0002060, + // Block 0x5c, offset 0x1700 + 0x1700: 0xe0002063, 0x1701: 0x405af220, 0x1702: 0xe0002066, 0x1703: 0x405af420, + 0x1704: 0xe0002069, 0x1705: 0x405af620, 0x1706: 0xe000206c, 0x1707: 0x405af820, + 0x1708: 0x405afa20, 0x1709: 0x405afc20, 0x170a: 0x405afe20, 0x170b: 0xe0002075, + 0x170c: 0xe000207b, 0x170d: 0xe000207e, 0x170e: 0xe0002081, 0x170f: 0x405b0020, + 0x1710: 0xe0002084, 0x1711: 0xe0002087, 0x1712: 0x405b0220, 0x1713: 0xe000208a, + 0x1714: 0xe000208d, 0x1715: 0xe0002072, 0x1716: 0x405b0420, 0x1717: 0x405b0620, + 0x1718: 0xe0002090, 0x1719: 0xe0002093, 0x171a: 0x405b0820, 0x171b: 0xe000209b, + 0x171c: 0x405b0a20, 0x171d: 0xe000209e, 0x171e: 0x405b0c20, 0x171f: 0x405b0e20, + 0x1720: 0x405b1620, 0x1721: 0x405b1e20, 0x1722: 0x405b2020, 0x1723: 0x405b1820, + 0x1724: 0x405b1c20, 0x1725: 0x405b2220, 0x1726: 0x405b2420, 0x1727: 0xe00020a1, + 0x1728: 0xe00020a4, 0x1729: 0xe0002054, 0x172a: 0xe0002078, 0x172b: 0x4002b220, + 0x172c: 0x4002b420, 0x172d: 0x4002b620, 0x172e: 0xe000206f, 0x172f: 0xe0002096, + 0x1730: 0xe0002039, + // Block 0x5d, offset 0x1740 + 0x1740: 0x404c7620, 0x1741: 0x404c7820, 0x1742: 0x404c7a20, 0x1743: 0x404c7c20, + 0x1744: 0x404c7e20, 0x1745: 0x404c8020, 0x1746: 0x404c8220, 0x1747: 0x404c8420, + 0x1748: 0x404c8620, 0x1749: 0x404c8820, 0x174a: 0x404c8a20, 0x174b: 0x404c8c20, + 0x174c: 0x404c8e20, 0x174e: 0x404c9020, 0x174f: 0x404c9220, + 0x1750: 0x404c9420, 0x1751: 0x404c9620, 0x1752: 0x404c9820, 0x1753: 0x404c9a20, + 0x1754: 0x8209264e, + 0x1760: 0x404c9e20, 0x1761: 0x404ca020, 0x1762: 0x404ca220, 0x1763: 0x404ca420, + 0x1764: 0x404ca620, 0x1765: 0x404ca820, 0x1766: 0x404caa20, 0x1767: 0x404cac20, + 0x1768: 0x404cae20, 0x1769: 0x404cb020, 0x176a: 0x404cb220, 0x176b: 0x404cb420, + 0x176c: 0x404cb620, 0x176d: 0x404cb820, 0x176e: 0x404cba20, 0x176f: 0x404cbc20, + 0x1770: 0x404cbe20, 0x1771: 0x404cc020, 0x1772: 0x404cc220, 0x1773: 0x404cc420, + 0x1774: 0x82092663, 0x1775: 0x40031c20, 0x1776: 0x40031e20, + // Block 0x5e, offset 0x1780 + 0x1780: 0x404cc820, 0x1781: 0x404cca20, 0x1782: 0x404ccc20, 0x1783: 0x404cce20, + 0x1784: 0x404cd020, 0x1785: 0x404cd220, 0x1786: 0x404cd420, 0x1787: 0x404cd620, + 0x1788: 0x404cd820, 0x1789: 0x404cda20, 0x178a: 0x404cdc20, 0x178b: 0x404cde20, + 0x178c: 0x404ce020, 0x178d: 0x404ce220, 0x178e: 0x404ce420, 0x178f: 0x404ce620, + 0x1790: 0x404ce820, 0x1791: 0x404cea20, 0x1792: 0x404cec20, 0x1793: 0x404cee20, + 0x17a0: 0x404cf020, 0x17a1: 0x404cf220, 0x17a2: 0x404cf420, 0x17a3: 0x404cf620, + 0x17a4: 0x404cf820, 0x17a5: 0x404cfa20, 0x17a6: 0x404cfc20, 0x17a7: 0x404cfe20, + 0x17a8: 0x404d0020, 0x17a9: 0x404d0220, 0x17aa: 0x404d0420, 0x17ab: 0x404d0620, + 0x17ac: 0x404d0820, 0x17ae: 0x404d0a20, 0x17af: 0x404d0c20, + 0x17b0: 0x404d0e20, 0x17b2: 0x404d1020, 0x17b3: 0x404d1220, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x404fa420, 0x17c1: 0x404fa620, 0x17c2: 0x404fa820, 0x17c3: 0x404faa20, + 0x17c4: 0x404fac20, 0x17c5: 0x404fae20, 0x17c6: 0x404fb020, 0x17c7: 0x404fb220, + 0x17c8: 0x404fb420, 0x17c9: 0x404fb620, 0x17ca: 0x404fb820, 0x17cb: 0x404fba20, + 0x17cc: 0x404fbc20, 0x17cd: 0x404fbe20, 0x17ce: 0x404fc020, 0x17cf: 0x404fc220, + 0x17d0: 0x404fc420, 0x17d1: 0x404fc620, 0x17d2: 0x404fc820, 0x17d3: 0x404fca20, + 0x17d4: 0x404fcc20, 0x17d5: 0x404fce20, 0x17d6: 0x404fd020, 0x17d7: 0x404fd220, + 0x17d8: 0x404fd420, 0x17d9: 0x404fd620, 0x17da: 0x404fd820, 0x17db: 0x404fda20, + 0x17dc: 0x404fdc20, 0x17dd: 0x404fde20, 0x17de: 0x404fe020, 0x17df: 0x404fe220, + 0x17e0: 0x404fe420, 0x17e1: 0x404fe620, 0x17e2: 0x404fe820, 0x17e3: 0x404fec20, + 0x17e4: 0x404fee20, 0x17e5: 0x404ff020, 0x17e6: 0x404ff220, 0x17e7: 0x404ff420, + 0x17e8: 0x404ff620, 0x17e9: 0x404ff820, 0x17ea: 0x404ffa20, 0x17eb: 0x404ffc20, + 0x17ec: 0x404ffe20, 0x17ed: 0x40500020, 0x17ee: 0x40500220, 0x17ef: 0x40500420, + 0x17f0: 0x40500620, 0x17f1: 0x40500820, 0x17f2: 0x40500a20, 0x17f3: 0x40500c20, + 0x17f4: 0xa0000000, 0x17f5: 0xa0000000, 0x17f6: 0x40500e20, 0x17f7: 0x40501020, + 0x17f8: 0x40501220, 0x17f9: 0x40501420, 0x17fa: 0x40501620, 0x17fb: 0x40501820, + 0x17fc: 0x40501a20, 0x17fd: 0x40501c20, 0x17fe: 0x40501e20, 0x17ff: 0x40502020, + // Block 0x60, offset 0x1800 + 0x1800: 0x40502220, 0x1801: 0x40502420, 0x1802: 0x40502620, 0x1803: 0x40502820, + 0x1804: 0x40502a20, 0x1805: 0x40502c20, 0x1806: 0xa000f302, 0x1807: 0xa000f402, + 0x1808: 0xa0011402, 0x1809: 0xa0011502, 0x180a: 0xa0011602, 0x180b: 0xa0005f02, + 0x180c: 0xa0005f02, 0x180d: 0xa0005f02, 0x180e: 0xa0005f02, 0x180f: 0xa0005f02, + 0x1810: 0xa0005f02, 0x1811: 0xa0005f02, 0x1812: 0x82092817, 0x1813: 0xa0000000, + 0x1814: 0x40032620, 0x1815: 0x40032820, 0x1816: 0x4002ac20, 0x1817: 0x4027bc20, + 0x1818: 0x4005bc20, 0x1819: 0x4005be20, 0x181a: 0x4005c020, 0x181b: 0x4027f620, + 0x181c: 0x404fea20, 0x181d: 0xae605f02, + 0x1820: 0xe00001b5, 0x1821: 0xe0000249, 0x1822: 0xe0000361, 0x1823: 0xe000043b, + 0x1824: 0xe0000510, 0x1825: 0xe00005da, 0x1826: 0xe00006a5, 0x1827: 0xe000074d, + 0x1828: 0xe00007f9, 0x1829: 0xe000089e, + 0x1830: 0xe00001b8, 0x1831: 0xe000024c, 0x1832: 0xe0000364, 0x1833: 0xe000043e, + 0x1834: 0xe0000513, 0x1835: 0xe00005dd, 0x1836: 0xe00006a8, 0x1837: 0xe0000750, + 0x1838: 0xe00007fc, 0x1839: 0xe00008a1, + // Block 0x61, offset 0x1840 + 0x1840: 0x40056a20, 0x1841: 0x4002e620, 0x1842: 0x40025220, 0x1843: 0x4002f020, + 0x1844: 0x4002a620, 0x1845: 0x4002a820, 0x1846: 0x40022220, 0x1847: 0x40022420, + 0x1848: 0x40025420, 0x1849: 0x4002f220, 0x184a: 0xa0000000, 0x184b: 0xa0000000, + 0x184c: 0xa0000000, 0x184d: 0xa0000000, 0x184e: 0x40020c20, + 0x1850: 0xe00001c7, 0x1851: 0xe000025b, 0x1852: 0xe0000373, 0x1853: 0xe000044d, + 0x1854: 0xe0000522, 0x1855: 0xe00005ec, 0x1856: 0xe00006b7, 0x1857: 0xe000075f, + 0x1858: 0xe000080b, 0x1859: 0xe00008b0, + 0x1860: 0x40533820, 0x1861: 0x40533c20, 0x1862: 0x40534220, 0x1863: 0x40534e20, + 0x1864: 0x40535220, 0x1865: 0x40535820, 0x1866: 0x40535c20, 0x1867: 0x40536220, + 0x1868: 0x40536420, 0x1869: 0x40536620, 0x186a: 0x40537020, 0x186b: 0x40537420, + 0x186c: 0x40537a20, 0x186d: 0x40537e20, 0x186e: 0x40538820, 0x186f: 0x40538c20, + 0x1870: 0x40538e20, 0x1871: 0x40539020, 0x1872: 0x40539e20, 0x1873: 0x4053a420, + 0x1874: 0x4053aa20, 0x1875: 0x4053b420, 0x1876: 0x4053bc20, 0x1877: 0x4053c220, + 0x1878: 0x4053c620, 0x1879: 0x4053ca20, 0x187a: 0x4053d020, 0x187b: 0x4053da20, + 0x187c: 0x4053dc20, 0x187d: 0x4053e220, 0x187e: 0x4053ea20, 0x187f: 0x4053f020, + // Block 0x62, offset 0x1880 + 0x1880: 0x4053f220, 0x1881: 0x4053f420, 0x1882: 0x4053f620, 0x1883: 0x40533620, + 0x1884: 0x40533e20, 0x1885: 0x40534420, 0x1886: 0x40535020, 0x1887: 0x40535420, + 0x1888: 0x40535a20, 0x1889: 0x40535e20, 0x188a: 0x40536820, 0x188b: 0x40537220, + 0x188c: 0x40537620, 0x188d: 0x40537c20, 0x188e: 0x40538020, 0x188f: 0x40538a20, + 0x1890: 0x4053a020, 0x1891: 0x4053a620, 0x1892: 0x4053ac20, 0x1893: 0x4053b620, + 0x1894: 0x4053de20, 0x1895: 0x4053be20, 0x1896: 0x4053c820, 0x1897: 0x4053d220, + 0x1898: 0x4053e620, 0x1899: 0x4053ec20, 0x189a: 0x4053f820, 0x189b: 0x4053fa20, + 0x189c: 0x4053b020, 0x189d: 0x40534020, 0x189e: 0x40534620, 0x189f: 0x40534c20, + 0x18a0: 0x40536020, 0x18a1: 0x40535620, 0x18a2: 0x40536a20, 0x18a3: 0x4053d420, + 0x18a4: 0x40538220, 0x18a5: 0x40538620, 0x18a6: 0x40537820, 0x18a7: 0x40539220, + 0x18a8: 0x4053a220, 0x18a9: 0x4053a820, 0x18aa: 0x4053b820, 0x18ab: 0x4053cc20, + 0x18ac: 0x4053e820, 0x18ad: 0x4053ee20, 0x18ae: 0x4053e020, 0x18af: 0x4053e420, + 0x18b0: 0x4053fc20, 0x18b1: 0x4053ae20, 0x18b2: 0x4053c020, 0x18b3: 0x40534820, + 0x18b4: 0x4053d620, 0x18b5: 0x4053c420, 0x18b6: 0x4053ce20, 0x18b7: 0x4053ba20, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x40532820, 0x18c1: 0x40532a20, 0x18c2: 0x40532c20, 0x18c3: 0x40532e20, + 0x18c4: 0x40533020, 0x18c5: 0x40533220, 0x18c6: 0x40533420, 0x18c7: 0x40533a20, + 0x18c8: 0x40534a20, 0x18c9: 0x4053d820, 0x18ca: 0x40536c20, 0x18cb: 0x4053b220, + 0x18cc: 0x4053fe20, 0x18cd: 0x40540220, 0x18ce: 0x40540420, 0x18cf: 0x40540820, + 0x18d0: 0x40540a20, 0x18d1: 0x40541020, 0x18d2: 0x40541420, 0x18d3: 0x40541620, + 0x18d4: 0x40541a20, 0x18d5: 0x40541e20, 0x18d6: 0x40542220, 0x18d7: 0x40542420, + 0x18d8: 0x40540c20, 0x18d9: 0x40542020, 0x18da: 0x40538420, 0x18db: 0x40536e20, + 0x18dc: 0x40539420, 0x18dd: 0x40539620, 0x18de: 0x40540020, 0x18df: 0x40540620, + 0x18e0: 0x40540e20, 0x18e1: 0x40541220, 0x18e2: 0x40539820, 0x18e3: 0x40541c20, + 0x18e4: 0x40539a20, 0x18e5: 0x40539c20, 0x18e6: 0x40542620, 0x18e7: 0x40542820, + 0x18e8: 0x40541820, 0x18e9: 0x82e42a16, 0x18ea: 0x40542a20, + 0x18f0: 0x405a1a20, 0x18f1: 0x405a1c20, 0x18f2: 0x405a1e20, 0x18f3: 0x405a2020, + 0x18f4: 0x405a2220, 0x18f5: 0x405a2420, 0x18f6: 0x405a2620, 0x18f7: 0x405a2820, + 0x18f8: 0x405a2a20, 0x18f9: 0x405a2c20, 0x18fa: 0x405a2e20, 0x18fb: 0x405a3020, + 0x18fc: 0x405a3220, 0x18fd: 0x405a3420, 0x18fe: 0x405a3620, 0x18ff: 0x405a3820, + // Block 0x64, offset 0x1900 + 0x1900: 0x405a3a20, 0x1901: 0x405a3c20, 0x1902: 0x405a3e20, 0x1903: 0x405a4020, + 0x1904: 0x405a4220, 0x1905: 0x405a4420, 0x1906: 0x405a4620, 0x1907: 0x405a4820, + 0x1908: 0x405a4a20, 0x1909: 0x405a4c20, 0x190a: 0x405a4e20, 0x190b: 0x405a5020, + 0x190c: 0x405a5220, 0x190d: 0x405a5420, 0x190e: 0x405a5620, 0x190f: 0x405a5820, + 0x1910: 0x405a5a20, 0x1911: 0x405a5c20, 0x1912: 0x405a5e20, 0x1913: 0x405a6020, + 0x1914: 0x405a6220, 0x1915: 0x405a6420, 0x1916: 0x405a6620, 0x1917: 0x405a6820, + 0x1918: 0x405a6a20, 0x1919: 0x405a6c20, 0x191a: 0x405a6e20, 0x191b: 0x405a7020, + 0x191c: 0x405a7220, 0x191d: 0x405a7420, 0x191e: 0x405a7620, 0x191f: 0x405a7820, + 0x1920: 0x405a7a20, 0x1921: 0x405a7c20, 0x1922: 0x405a7e20, 0x1923: 0x405a8020, + 0x1924: 0x405a8220, 0x1925: 0x405a8420, 0x1926: 0x405a8620, 0x1927: 0x405a8820, + 0x1928: 0x405a8a20, 0x1929: 0x405a8c20, 0x192a: 0x405a8e20, 0x192b: 0x405a9020, + 0x192c: 0x405a9220, 0x192d: 0x405a9420, 0x192e: 0x405a9620, 0x192f: 0x405a9820, + 0x1930: 0x405a9a20, 0x1931: 0x405a9c20, 0x1932: 0x405a9e20, 0x1933: 0x405aa020, + 0x1934: 0x405aa220, 0x1935: 0x405aa420, + // Block 0x65, offset 0x1940 + 0x1940: 0x404c1220, 0x1941: 0x404c1420, 0x1942: 0x404c1620, 0x1943: 0x404c1820, + 0x1944: 0x404c1a20, 0x1945: 0x404c1c20, 0x1946: 0x404c1e20, 0x1947: 0x404c2020, + 0x1948: 0x404c2220, 0x1949: 0x404c2420, 0x194a: 0x404c2620, 0x194b: 0x404c2820, + 0x194c: 0x404c2a20, 0x194d: 0x404c2c20, 0x194e: 0x404c2e20, 0x194f: 0x404c3020, + 0x1950: 0x404c3220, 0x1951: 0x404c3420, 0x1952: 0x404c3620, 0x1953: 0x404c3820, + 0x1954: 0x404c3a20, 0x1955: 0x404c3c20, 0x1956: 0x404c3e20, 0x1957: 0x404c4020, + 0x1958: 0x404c4220, 0x1959: 0x404c4420, 0x195a: 0x404c4620, 0x195b: 0x404c4820, + 0x195c: 0x404c4a20, + 0x1960: 0x404c4c20, 0x1961: 0x404c4e20, 0x1962: 0x404c5020, 0x1963: 0x404c5220, + 0x1964: 0x404c5420, 0x1965: 0x404c5620, 0x1966: 0x404c5820, 0x1967: 0x404c5a20, + 0x1968: 0x404c5c20, 0x1969: 0x404c5e20, 0x196a: 0x404c6020, 0x196b: 0x404c6220, + 0x1970: 0x404c6420, 0x1971: 0x404c6620, 0x1972: 0x404c6820, 0x1973: 0x404c6a20, + 0x1974: 0x404c6c20, 0x1975: 0x404c6e20, 0x1976: 0x404c7020, 0x1977: 0x404c7220, + 0x1978: 0x404c7420, 0x1979: 0xade11f02, 0x197a: 0xae612002, 0x197b: 0xadc12102, + // Block 0x66, offset 0x1980 + 0x1980: 0x4007a620, + 0x1984: 0x4002c220, 0x1985: 0x4002d220, 0x1986: 0xe000018e, 0x1987: 0xe000021f, + 0x1988: 0xe000033a, 0x1989: 0xe0000414, 0x198a: 0xe00004e9, 0x198b: 0xe00005b3, + 0x198c: 0xe000067e, 0x198d: 0xe0000726, 0x198e: 0xe00007d2, 0x198f: 0xe0000877, + 0x1990: 0x40503020, 0x1991: 0x40503220, 0x1992: 0x40503420, 0x1993: 0x40503620, + 0x1994: 0x40503820, 0x1995: 0x40503a20, 0x1996: 0x40503c20, 0x1997: 0x40503e20, + 0x1998: 0x40504020, 0x1999: 0x40504220, 0x199a: 0x40504420, 0x199b: 0x40504620, + 0x199c: 0x40504820, 0x199d: 0x40504a20, 0x199e: 0x40504c20, 0x199f: 0x40504e20, + 0x19a0: 0x40505020, 0x19a1: 0x40505220, 0x19a2: 0x40505420, 0x19a3: 0x40505620, + 0x19a4: 0x40505820, 0x19a5: 0x40505a20, 0x19a6: 0x40505c20, 0x19a7: 0x40505e20, + 0x19a8: 0x40506020, 0x19a9: 0x40506220, 0x19aa: 0x40506420, 0x19ab: 0x40506620, + 0x19ac: 0x40506820, 0x19ad: 0x40506a20, + 0x19b0: 0x40506c20, 0x19b1: 0x40506e20, 0x19b2: 0x40507020, 0x19b3: 0x40507220, + 0x19b4: 0x40507420, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x40507620, 0x19c1: 0x40507820, 0x19c2: 0x40507a20, 0x19c3: 0x40507c20, + 0x19c4: 0x40507e20, 0x19c5: 0x40508020, 0x19c6: 0x40508220, 0x19c7: 0x40508420, + 0x19c8: 0x40508620, 0x19c9: 0x40508820, 0x19ca: 0x40508a20, 0x19cb: 0x40508c20, + 0x19cc: 0x40508e20, 0x19cd: 0x40509020, 0x19ce: 0x40509220, 0x19cf: 0x40509420, + 0x19d0: 0x40509620, 0x19d1: 0x40509820, 0x19d2: 0x40509a20, 0x19d3: 0x40509c20, + 0x19d4: 0x40509e20, 0x19d5: 0x4050a020, 0x19d6: 0x4050a220, 0x19d7: 0x4050a420, + 0x19d8: 0x4050a620, 0x19d9: 0x4050a820, 0x19da: 0x4050aa20, 0x19db: 0x4050ac20, + 0x19dc: 0x4050ae20, 0x19dd: 0x4050b020, 0x19de: 0x4050b220, 0x19df: 0x4050b420, + 0x19e0: 0x4050b620, 0x19e1: 0x4050b820, 0x19e2: 0x4050ba20, 0x19e3: 0x4050bc20, + 0x19e4: 0x4050be20, 0x19e5: 0x4050c020, 0x19e6: 0x4050c220, 0x19e7: 0x4050c420, + 0x19e8: 0x4050c620, 0x19e9: 0x4050c820, 0x19ea: 0x4050ca20, 0x19eb: 0x4050cc20, + 0x19f0: 0x4050ce20, 0x19f1: 0x4050d020, 0x19f2: 0x4050d220, 0x19f3: 0x4050d420, + 0x19f4: 0x4050d620, 0x19f5: 0x4050d820, 0x19f6: 0x4050da20, 0x19f7: 0x4050dc20, + 0x19f8: 0x4050de20, 0x19f9: 0x4050e020, 0x19fa: 0x4050e220, 0x19fb: 0x4050e420, + 0x19fc: 0x4050e620, 0x19fd: 0x4050e820, 0x19fe: 0x4050ea20, 0x19ff: 0x4050ec20, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x4050ee20, 0x1a01: 0x4050f020, 0x1a02: 0x4050f220, 0x1a03: 0x4050f420, + 0x1a04: 0x4050f620, 0x1a05: 0x4050f820, 0x1a06: 0x4050fa20, 0x1a07: 0x4050fc20, + 0x1a08: 0x4050fe20, 0x1a09: 0x40510020, + 0x1a10: 0xe0000191, 0x1a11: 0xe0000222, 0x1a12: 0xe000033d, 0x1a13: 0xe0000417, + 0x1a14: 0xe00004ec, 0x1a15: 0xe00005b6, 0x1a16: 0xe0000681, 0x1a17: 0xe0000729, + 0x1a18: 0xe00007d5, 0x1a19: 0xe000087a, 0x1a1a: 0xe0000225, + 0x1a1e: 0xe0002022, 0x1a1f: 0xe0002025, + 0x1a20: 0x4007b220, 0x1a21: 0x4007b420, 0x1a22: 0x4007b620, 0x1a23: 0x4007b820, + 0x1a24: 0x4007ba20, 0x1a25: 0x4007bc20, 0x1a26: 0x4007be20, 0x1a27: 0x4007c020, + 0x1a28: 0x4007c220, 0x1a29: 0x4007c420, 0x1a2a: 0x4007c620, 0x1a2b: 0x4007c820, + 0x1a2c: 0x4007ca20, 0x1a2d: 0x4007cc20, 0x1a2e: 0x4007ce20, 0x1a2f: 0x4007d020, + 0x1a30: 0x4007d220, 0x1a31: 0x4007d420, 0x1a32: 0x4007d620, 0x1a33: 0x4007d820, + 0x1a34: 0x4007da20, 0x1a35: 0x4007dc20, 0x1a36: 0x4007de20, 0x1a37: 0x4007e020, + 0x1a38: 0x4007e220, 0x1a39: 0x4007e420, 0x1a3a: 0x4007e620, 0x1a3b: 0x4007e820, + 0x1a3c: 0x4007ea20, 0x1a3d: 0x4007ec20, 0x1a3e: 0x4007ee20, 0x1a3f: 0x4007f020, + // Block 0x69, offset 0x1a40 + 0x1a40: 0x404d1420, 0x1a41: 0x404d1620, 0x1a42: 0x404d1820, 0x1a43: 0x404d1a20, + 0x1a44: 0x404d1c20, 0x1a45: 0x404d1e20, 0x1a46: 0x404d2020, 0x1a47: 0x404d2220, + 0x1a48: 0x404d2420, 0x1a49: 0x404d2620, 0x1a4a: 0x404d2820, 0x1a4b: 0x404d2a20, + 0x1a4c: 0x404d2c20, 0x1a4d: 0x404d2e20, 0x1a4e: 0x404d3020, 0x1a4f: 0x404d3220, + 0x1a50: 0x404d3420, 0x1a51: 0x404d3620, 0x1a52: 0x404d3820, 0x1a53: 0x404d3a20, + 0x1a54: 0x404d3c20, 0x1a55: 0x404d3e20, 0x1a56: 0x404d4020, 0x1a57: 0x82e626a1, + 0x1a58: 0x82dc26a2, 0x1a59: 0x404d4620, 0x1a5a: 0x404d4820, 0x1a5b: 0x404d4a20, + 0x1a5e: 0x40036620, 0x1a5f: 0x40036820, + 0x1a60: 0x40510220, 0x1a61: 0x40510420, 0x1a62: 0x40510620, 0x1a63: 0x40510820, + 0x1a64: 0x40510a20, 0x1a65: 0x40510c20, 0x1a66: 0x40510e20, 0x1a67: 0x40511020, + 0x1a68: 0x40511220, 0x1a69: 0x40511420, 0x1a6a: 0x40511620, 0x1a6b: 0x40511820, + 0x1a6c: 0x40511a20, 0x1a6d: 0x40511c20, 0x1a6e: 0x40511e20, 0x1a6f: 0x40512020, + 0x1a70: 0x40512220, 0x1a71: 0x40512420, 0x1a72: 0x40512620, 0x1a73: 0x40512820, + 0x1a74: 0x40512a20, 0x1a75: 0x40512c20, 0x1a76: 0x40512e20, 0x1a77: 0x40513020, + 0x1a78: 0x40513220, 0x1a79: 0x40513420, 0x1a7a: 0x40513620, 0x1a7b: 0x40513820, + 0x1a7c: 0x40513a20, 0x1a7d: 0x40513c20, 0x1a7e: 0x40513e20, 0x1a7f: 0x40514020, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x40514220, 0x1a81: 0x40514420, 0x1a82: 0x40514620, 0x1a83: 0x40514820, + 0x1a84: 0x40514a20, 0x1a85: 0x40514c20, 0x1a86: 0x40514e20, 0x1a87: 0x40515020, + 0x1a88: 0x40515220, 0x1a89: 0x40515420, 0x1a8a: 0x40515620, 0x1a8b: 0x40515820, + 0x1a8c: 0x40515a20, 0x1a8d: 0x40516c20, 0x1a8e: 0x40516e20, 0x1a8f: 0x40517020, + 0x1a90: 0x40517220, 0x1a91: 0x40517420, 0x1a92: 0x40517620, 0x1a93: 0x40515c20, + 0x1a94: 0xe0002029, 0x1a95: 0x40516020, 0x1a96: 0x40516220, 0x1a97: 0x40516420, + 0x1a98: 0x00510e84, 0x1a99: 0x00510e84, 0x1a9a: 0x00513884, 0x1a9b: 0x00513884, + 0x1a9c: 0x40516620, 0x1a9d: 0x40516820, 0x1a9e: 0x40516a20, + 0x1aa0: 0x820928cd, 0x1aa1: 0x40517820, 0x1aa2: 0x40517c20, 0x1aa3: 0x40517e20, + 0x1aa4: 0x00517e84, 0x1aa5: 0x40518020, 0x1aa6: 0x40518220, 0x1aa7: 0x40518420, + 0x1aa8: 0x40518620, 0x1aa9: 0x40518820, 0x1aaa: 0x40518a20, 0x1aab: 0x40515e20, + 0x1aac: 0x40517a20, 0x1aad: 0x40519820, 0x1aae: 0x40518c20, 0x1aaf: 0x40518e20, + 0x1ab0: 0x40519220, 0x1ab1: 0x40519420, 0x1ab2: 0x40519620, 0x1ab3: 0x40519020, + 0x1ab4: 0xa000f302, 0x1ab5: 0xae611702, 0x1ab6: 0xae611802, 0x1ab7: 0xae611902, + 0x1ab8: 0xae611a02, 0x1ab9: 0xae611b02, 0x1aba: 0xae611c02, 0x1abb: 0xae611d02, + 0x1abc: 0xae611e02, 0x1abf: 0xadc00000, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0xe0000194, 0x1ac1: 0xe0000228, 0x1ac2: 0xe0000340, 0x1ac3: 0xe000041a, + 0x1ac4: 0xe00004ef, 0x1ac5: 0xe00005b9, 0x1ac6: 0xe0000684, 0x1ac7: 0xe000072c, + 0x1ac8: 0xe00007d8, 0x1ac9: 0xe000087d, + 0x1ad0: 0xe0000197, 0x1ad1: 0xe000022b, 0x1ad2: 0xe0000343, 0x1ad3: 0xe000041d, + 0x1ad4: 0xe00004f2, 0x1ad5: 0xe00005bc, 0x1ad6: 0xe0000687, 0x1ad7: 0xe000072f, + 0x1ad8: 0xe00007db, 0x1ad9: 0xe0000880, + 0x1ae0: 0x4005c220, 0x1ae1: 0x4005c420, 0x1ae2: 0x4005c620, 0x1ae3: 0x4005c820, + 0x1ae4: 0x4005ca20, 0x1ae5: 0x4005cc20, 0x1ae6: 0x4005ce20, 0x1ae7: 0x4027be20, + 0x1ae8: 0x40032a20, 0x1ae9: 0x40032c20, 0x1aea: 0x40032e20, 0x1aeb: 0x40033020, + 0x1aec: 0x4005d020, 0x1aed: 0x4005d220, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0xa000f202, 0x1b01: 0xa000f202, 0x1b02: 0xa000f302, 0x1b03: 0xa000f702, + 0x1b04: 0xa000f402, 0x1b05: 0xc3190821, 0x1b06: 0x40522820, 0x1b07: 0xc31b0821, + 0x1b08: 0x40522c20, 0x1b09: 0xc31d0821, 0x1b0a: 0x40523020, 0x1b0b: 0xc31f0821, + 0x1b0c: 0x40523420, 0x1b0d: 0xc3210821, 0x1b0e: 0x40523820, 0x1b0f: 0x40523a20, + 0x1b10: 0x40523c20, 0x1b11: 0xc3230821, 0x1b12: 0x40524020, 0x1b13: 0x40524220, + 0x1b14: 0x40524820, 0x1b15: 0x40524a20, 0x1b16: 0x40524c20, 0x1b17: 0x40524e20, + 0x1b18: 0x40525020, 0x1b19: 0x40525220, 0x1b1a: 0x40525420, 0x1b1b: 0x40525620, + 0x1b1c: 0x40525820, 0x1b1d: 0x40525a20, 0x1b1e: 0x40525c20, 0x1b1f: 0x40525e20, + 0x1b20: 0x40526020, 0x1b21: 0x40526220, 0x1b22: 0x40526420, 0x1b23: 0x40526820, + 0x1b24: 0x40526a20, 0x1b25: 0x40526c20, 0x1b26: 0x40526e20, 0x1b27: 0x40527020, + 0x1b28: 0x40527420, 0x1b29: 0x40527620, 0x1b2a: 0x40527820, 0x1b2b: 0x40527a20, + 0x1b2c: 0x40527c20, 0x1b2d: 0x40527e20, 0x1b2e: 0x40528020, 0x1b2f: 0x40528220, + 0x1b30: 0x40528620, 0x1b31: 0x40528820, 0x1b32: 0x40528a20, 0x1b33: 0x40529020, + 0x1b34: 0xa070f102, 0x1b35: 0x40529220, 0x1b36: 0x40529420, 0x1b37: 0x40529620, + 0x1b38: 0x40529820, 0x1b39: 0x40529a20, 0x1b3a: 0xc3250821, 0x1b3b: 0x40529e20, + 0x1b3c: 0xc3270821, 0x1b3d: 0x4052a220, 0x1b3e: 0xc3290821, 0x1b3f: 0xc32b0821, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0x4052a820, 0x1b41: 0x4052aa20, 0x1b42: 0xc32d0821, 0x1b43: 0x4052ae20, + 0x1b44: 0x82092958, 0x1b45: 0x40524420, 0x1b46: 0x40524620, 0x1b47: 0x40526620, + 0x1b48: 0x40527220, 0x1b49: 0x40528420, 0x1b4a: 0x40528c20, 0x1b4b: 0x40528e20, + 0x1b50: 0xe00001be, 0x1b51: 0xe0000252, 0x1b52: 0xe000036a, 0x1b53: 0xe0000444, + 0x1b54: 0xe0000519, 0x1b55: 0xe00005e3, 0x1b56: 0xe00006ae, 0x1b57: 0xe0000756, + 0x1b58: 0xe0000802, 0x1b59: 0xe00008a7, 0x1b5a: 0x40036a20, 0x1b5b: 0x40036c20, + 0x1b5c: 0x4002f620, 0x1b5d: 0x4002ae20, 0x1b5e: 0x40033220, 0x1b5f: 0x40033420, + 0x1b60: 0x40022020, 0x1b61: 0x4007f220, 0x1b62: 0x4007f420, 0x1b63: 0x4007f620, + 0x1b64: 0x4007f820, 0x1b65: 0x4007fa20, 0x1b66: 0x4007fc20, 0x1b67: 0x4007fe20, + 0x1b68: 0x40080020, 0x1b69: 0x40080220, 0x1b6a: 0x40080420, 0x1b6b: 0xae600000, + 0x1b6c: 0xadc00000, 0x1b6d: 0xae600000, 0x1b6e: 0xae600000, 0x1b6f: 0xae600000, + 0x1b70: 0xae600000, 0x1b71: 0xae600000, 0x1b72: 0xae600000, 0x1b73: 0xae600000, + 0x1b74: 0x40080620, 0x1b75: 0x40080820, 0x1b76: 0x40080a20, 0x1b77: 0x40080c20, + 0x1b78: 0x40080e20, 0x1b79: 0x40081020, 0x1b7a: 0x40081220, 0x1b7b: 0x40081420, + 0x1b7c: 0x40081620, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0xa000f302, 0x1b81: 0xa000f902, 0x1b82: 0xa000f402, 0x1b83: 0x4047d420, + 0x1b84: 0x4047d620, 0x1b85: 0x4047d820, 0x1b86: 0x4047da20, 0x1b87: 0x4047dc20, + 0x1b88: 0x4047de20, 0x1b89: 0x4047e020, 0x1b8a: 0x4047e220, 0x1b8b: 0x4047e620, + 0x1b8c: 0x4047e820, 0x1b8d: 0x4047ea20, 0x1b8e: 0x4047ec20, 0x1b8f: 0x4047ee20, + 0x1b90: 0x4047f020, 0x1b91: 0x4047f220, 0x1b92: 0x4047f420, 0x1b93: 0x4047f620, + 0x1b94: 0x4047f820, 0x1b95: 0x4047fa20, 0x1b96: 0x4047fc20, 0x1b97: 0x4047fe20, + 0x1b98: 0x40480020, 0x1b99: 0x40480420, 0x1b9a: 0x40480820, 0x1b9b: 0x40480c20, + 0x1b9c: 0x40481220, 0x1b9d: 0x40481820, 0x1b9e: 0x40481c20, 0x1b9f: 0x40481e20, + 0x1ba0: 0x40482220, 0x1ba1: 0x40480a20, 0x1ba2: 0x40480e20, 0x1ba3: 0x40481420, + 0x1ba4: 0x40482420, 0x1ba5: 0x40482620, 0x1ba6: 0x40482820, 0x1ba7: 0x40482a20, + 0x1ba8: 0x40482c20, 0x1ba9: 0x40482e20, 0x1baa: 0x82092418, 0x1bab: 0x82092419, + 0x1bac: 0x40480620, 0x1bad: 0x40481a20, 0x1bae: 0x4047e420, 0x1baf: 0x40482020, + 0x1bb0: 0xe00001c4, 0x1bb1: 0xe0000258, 0x1bb2: 0xe0000370, 0x1bb3: 0xe000044a, + 0x1bb4: 0xe000051f, 0x1bb5: 0xe00005e9, 0x1bb6: 0xe00006b4, 0x1bb7: 0xe000075c, + 0x1bb8: 0xe0000808, 0x1bb9: 0xe00008ad, 0x1bba: 0x0047d484, 0x1bbb: 0x40481020, + 0x1bbc: 0x40481620, 0x1bbd: 0x40480220, 0x1bbe: 0x0047e299, 0x1bbf: 0x00480499, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x404d4c20, 0x1bc1: 0x004d4c84, 0x1bc2: 0x404d4e20, 0x1bc3: 0x004d4e84, + 0x1bc4: 0x004d4e84, 0x1bc5: 0x404d5020, 0x1bc6: 0x004d5084, 0x1bc7: 0x404d5220, + 0x1bc8: 0x004d5284, 0x1bc9: 0x404d5420, 0x1bca: 0x004d5484, 0x1bcb: 0x404d5620, + 0x1bcc: 0x004d5684, 0x1bcd: 0x004d5684, 0x1bce: 0x404d5820, 0x1bcf: 0x004d5884, + 0x1bd0: 0x404d5a20, 0x1bd1: 0x404d5c20, 0x1bd2: 0x404d5e20, 0x1bd3: 0x004d5e84, + 0x1bd4: 0x404d6020, 0x1bd5: 0x004d6084, 0x1bd6: 0x404d6220, 0x1bd7: 0x004d6284, + 0x1bd8: 0x404d6420, 0x1bd9: 0x004d6484, 0x1bda: 0x004d6484, 0x1bdb: 0x404d6620, + 0x1bdc: 0x004d6684, 0x1bdd: 0x404d6820, 0x1bde: 0x404d6a20, 0x1bdf: 0x004d6a84, + 0x1be0: 0x404d6c20, 0x1be1: 0x404d6e20, 0x1be2: 0x404d7020, 0x1be3: 0x404d7220, + 0x1be4: 0x404d7420, 0x1be5: 0x404d7620, 0x1be6: 0xa070f102, 0x1be7: 0x404d7820, + 0x1be8: 0x004d7884, 0x1be9: 0x404d7a20, 0x1bea: 0x404d7c20, 0x1beb: 0x004d7c84, + 0x1bec: 0x404d7e20, 0x1bed: 0x004d7e84, 0x1bee: 0x404d8020, 0x1bef: 0x004d8084, + 0x1bf0: 0x404d8220, 0x1bf1: 0x404d8420, 0x1bf2: 0x820926c3, 0x1bf3: 0x820926c4, + 0x1bfc: 0x4005ec20, 0x1bfd: 0x4005ee20, 0x1bfe: 0x4005f020, 0x1bff: 0x4005f220, + // Block 0x70, offset 0x1c00 + 0x1c00: 0x404b3620, 0x1c01: 0x404b3820, 0x1c02: 0x404b3a20, 0x1c03: 0x404b3c20, + 0x1c04: 0x404b3e20, 0x1c05: 0x404b4020, 0x1c06: 0x404b4220, 0x1c07: 0x404b4420, + 0x1c08: 0x404b4620, 0x1c09: 0x404b4820, 0x1c0a: 0x404b5020, 0x1c0b: 0x404b5220, + 0x1c0c: 0x404b5420, 0x1c0d: 0x404b5620, 0x1c0e: 0x404b5820, 0x1c0f: 0x404b5a20, + 0x1c10: 0x404b5c20, 0x1c11: 0x404b5e20, 0x1c12: 0x404b6020, 0x1c13: 0x404b6220, + 0x1c14: 0x404b6420, 0x1c15: 0x404b6620, 0x1c16: 0x404b6820, 0x1c17: 0x404b6a20, + 0x1c18: 0x404b6c20, 0x1c19: 0x404b6e20, 0x1c1a: 0x404b7020, 0x1c1b: 0x404b7420, + 0x1c1c: 0x404b7820, 0x1c1d: 0x404b7a20, 0x1c1e: 0x404b7c20, 0x1c1f: 0x404b7e20, + 0x1c20: 0x404b8020, 0x1c21: 0x404b8220, 0x1c22: 0x404b8420, 0x1c23: 0x404b8620, + 0x1c24: 0x404b7220, 0x1c25: 0x404b7620, 0x1c26: 0x404b8a20, 0x1c27: 0x404b8c20, + 0x1c28: 0x404b8e20, 0x1c29: 0x404b9020, 0x1c2a: 0x404b9220, 0x1c2b: 0x404b9420, + 0x1c2c: 0x404b9620, 0x1c2d: 0x404b9820, 0x1c2e: 0x404b9a20, 0x1c2f: 0x404b9c20, + 0x1c30: 0x404b9e20, 0x1c31: 0x404ba020, 0x1c32: 0x404ba220, 0x1c33: 0x404ba420, + 0x1c34: 0x404ba620, 0x1c35: 0x404ba820, 0x1c36: 0x404b8820, 0x1c37: 0xa070f102, + 0x1c3b: 0x40031420, + 0x1c3c: 0x40031620, 0x1c3d: 0x4005ae20, 0x1c3e: 0x4005b020, 0x1c3f: 0x4005b220, + // Block 0x71, offset 0x1c40 + 0x1c40: 0xe00001a6, 0x1c41: 0xe000023a, 0x1c42: 0xe0000352, 0x1c43: 0xe000042c, + 0x1c44: 0xe0000501, 0x1c45: 0xe00005cb, 0x1c46: 0xe0000696, 0x1c47: 0xe000073e, + 0x1c48: 0xe00007ea, 0x1c49: 0xe000088f, + 0x1c4d: 0x404b4a20, 0x1c4e: 0x404b4c20, 0x1c4f: 0x404b4e20, + 0x1c50: 0xe00001ca, 0x1c51: 0xe000025e, 0x1c52: 0xe0000376, 0x1c53: 0xe0000450, + 0x1c54: 0xe0000525, 0x1c55: 0xe00005ef, 0x1c56: 0xe00006ba, 0x1c57: 0xe0000762, + 0x1c58: 0xe000080e, 0x1c59: 0xe00008b3, 0x1c5a: 0x40542e20, 0x1c5b: 0x40543020, + 0x1c5c: 0x40543220, 0x1c5d: 0x40543420, 0x1c5e: 0x40543620, 0x1c5f: 0x40543820, + 0x1c60: 0x40543a20, 0x1c61: 0x40543c20, 0x1c62: 0x40543e20, 0x1c63: 0x40544020, + 0x1c64: 0x40544220, 0x1c65: 0x40544420, 0x1c66: 0x40544620, 0x1c67: 0x40544820, + 0x1c68: 0x40544a20, 0x1c69: 0x40544c20, 0x1c6a: 0x40544e20, 0x1c6b: 0x40545020, + 0x1c6c: 0x40545220, 0x1c6d: 0x40545420, 0x1c6e: 0x40545620, 0x1c6f: 0x40545820, + 0x1c70: 0x40545a20, 0x1c71: 0x40545c20, 0x1c72: 0x40545e20, 0x1c73: 0x40546020, + 0x1c74: 0x40546220, 0x1c75: 0x40546420, 0x1c76: 0x40546620, 0x1c77: 0x40546820, + 0x1c78: 0x40546a20, 0x1c79: 0x40546c20, 0x1c7a: 0x40546e20, 0x1c7b: 0x40547020, + 0x1c7c: 0x40547220, 0x1c7d: 0x40547420, 0x1c7e: 0x40035820, 0x1c7f: 0x40035a20, + // Block 0x72, offset 0x1c80 + 0x1c80: 0x4005d620, 0x1c81: 0x4005d820, 0x1c82: 0x4005da20, 0x1c83: 0x4005dc20, + 0x1c84: 0x4005de20, 0x1c85: 0x4005e020, 0x1c86: 0x4005e220, 0x1c87: 0x4005e420, + 0x1c90: 0xae600000, 0x1c91: 0xae600000, 0x1c92: 0xae600000, 0x1c93: 0xa0000000, + 0x1c94: 0xa0100000, 0x1c95: 0xadc00000, 0x1c96: 0xadc00000, 0x1c97: 0xadc00000, + 0x1c98: 0xadc00000, 0x1c99: 0xadc00000, 0x1c9a: 0xae600000, 0x1c9b: 0xae600000, + 0x1c9c: 0xadc00000, 0x1c9d: 0xadc00000, 0x1c9e: 0xadc00000, 0x1c9f: 0xadc00000, + 0x1ca0: 0xae600000, 0x1ca1: 0xa0000000, 0x1ca2: 0xa0100000, 0x1ca3: 0xa0100000, + 0x1ca4: 0xa0100000, 0x1ca5: 0xa0100000, 0x1ca6: 0xa0100000, 0x1ca7: 0xa0100000, + 0x1ca8: 0xa0100000, 0x1ca9: 0x40404020, 0x1caa: 0x00404084, 0x1cab: 0x00404084, + 0x1cac: 0x00404084, 0x1cad: 0xadc0f302, 0x1cae: 0x00404084, 0x1caf: 0x00404084, + 0x1cb0: 0x00404084, 0x1cb1: 0x00404084, 0x1cb2: 0xa000f402, 0x1cb3: 0xa000f402, + 0x1cb4: 0xae600000, 0x1cb5: 0x40404220, 0x1cb6: 0x40404420, + // Block 0x73, offset 0x1cc0 + 0x1cc0: 0x402be620, 0x1cc1: 0x402bec20, 0x1cc2: 0x402bee20, 0x1cc3: 0x402c2420, + 0x1cc4: 0x402c4220, 0x1cc5: 0x402c6a20, 0x1cc6: 0x402c6c20, 0x1cc7: 0x402ca020, + 0x1cc8: 0x402ce620, 0x1cc9: 0x402db420, 0x1cca: 0x402ddc20, 0x1ccb: 0x402e0620, + 0x1ccc: 0x402e3420, 0x1ccd: 0x402e8a20, 0x1cce: 0x402eb020, 0x1ccf: 0x402eea20, + 0x1cd0: 0x402f0220, 0x1cd1: 0x402eec20, 0x1cd2: 0x402f0420, 0x1cd3: 0x402ef820, + 0x1cd4: 0x402ef620, 0x1cd5: 0x402f2a20, 0x1cd6: 0x402f0a20, 0x1cd7: 0x402f0c20, + 0x1cd8: 0x402f3420, 0x1cd9: 0x402f8c20, 0x1cda: 0x402fa020, 0x1cdb: 0x40303420, + 0x1cdc: 0x40307420, 0x1cdd: 0x40307620, 0x1cde: 0x40307820, 0x1cdf: 0x4030aa20, + 0x1ce0: 0x4030c620, 0x1ce1: 0x4030ea20, 0x1ce2: 0x40313220, 0x1ce3: 0x40316c20, + 0x1ce4: 0x4031f420, 0x1ce5: 0x4031f620, 0x1ce6: 0x40325820, 0x1ce7: 0x40327420, + 0x1ce8: 0x40328020, 0x1ce9: 0x40328a20, 0x1cea: 0x4032a020, 0x1ceb: 0x40348c20, + 0x1cec: 0x002bde9d, 0x1ced: 0xe00009e1, 0x1cee: 0x002c0a9d, 0x1cef: 0x402c2220, + 0x1cf0: 0x002c629d, 0x1cf1: 0x002c989d, 0x1cf2: 0x002cae9d, 0x1cf3: 0x002d229d, + 0x1cf4: 0x002d689d, 0x1cf5: 0x002d9a9d, 0x1cf6: 0x002dcc9d, 0x1cf7: 0x002dfe9d, + 0x1cf8: 0x002e229d, 0x1cf9: 0x002e829d, 0x1cfa: 0x002e9e9d, 0x1cfb: 0x402eae20, + 0x1cfc: 0x002ee29d, 0x1cfd: 0x002f229d, 0x1cfe: 0x002f2c9d, 0x1cff: 0x002f7a9d, + // Block 0x74, offset 0x1d00 + 0x1d00: 0x00302c9d, 0x1d01: 0x00306c9d, 0x1d02: 0x0030e29d, 0x1d03: 0x002bde94, + 0x1d04: 0x002bf094, 0x1d05: 0x002bf894, 0x1d06: 0x002bee94, 0x1d07: 0x002c0a94, + 0x1d08: 0x002c6294, 0x1d09: 0x002c9894, 0x1d0a: 0x002cb894, 0x1d0b: 0x002cc294, + 0x1d0c: 0x002ce694, 0x1d0d: 0x002d2294, 0x1d0e: 0x002db494, 0x1d0f: 0x002dfe94, + 0x1d10: 0x002e8294, 0x1d11: 0x002eda94, 0x1d12: 0x002ee294, 0x1d13: 0x002efa94, + 0x1d14: 0x002f0a94, 0x1d15: 0x002f0c94, 0x1d16: 0x002f2c94, 0x1d17: 0x00302c94, + 0x1d18: 0x00306c94, 0x1d19: 0x00307694, 0x1d1a: 0x0030a094, 0x1d1b: 0x0030be94, + 0x1d1c: 0x0031f694, 0x1d1d: 0x00325494, 0x1d1e: 0x00325694, 0x1d1f: 0x00325a94, + 0x1d20: 0x00329a94, 0x1d21: 0x00329c94, 0x1d22: 0x002d9a95, 0x1d23: 0x002f7a95, + 0x1d24: 0x00306c95, 0x1d25: 0x0030be95, 0x1d26: 0x00325495, 0x1d27: 0x00325695, + 0x1d28: 0x00328895, 0x1d29: 0x00329a95, 0x1d2a: 0x00329c95, 0x1d2b: 0x40307a20, + 0x1d2c: 0x402c2620, 0x1d2d: 0x402c6e20, 0x1d2e: 0x402d1220, 0x1d2f: 0x402e8c20, + 0x1d30: 0x402eb220, 0x1d31: 0x402f3a20, 0x1d32: 0x402f9620, 0x1d33: 0x402fce20, + 0x1d34: 0x402ff020, 0x1d35: 0x40304020, 0x1d36: 0x40313c20, 0x1d37: 0x402d5420, + 0x1d38: 0x0034ba94, 0x1d39: 0xe0000bd9, 0x1d3a: 0xe0000fc1, 0x1d3b: 0x402dbe20, + 0x1d3c: 0x402dca20, 0x1d3d: 0x402f3620, 0x1d3e: 0x40308420, 0x1d3f: 0x4030bc20, + // Block 0x75, offset 0x1d40 + 0x1d40: 0x402c2820, 0x1d41: 0x402c7020, 0x1d42: 0x402d1420, 0x1d43: 0x402d4220, + 0x1d44: 0x402e0820, 0x1d45: 0x402e5220, 0x1d46: 0x402e8e20, 0x1d47: 0x402ec620, + 0x1d48: 0x402f3c20, 0x1d49: 0x402faa20, 0x1d4a: 0x402ff220, 0x1d4b: 0x40301020, + 0x1d4c: 0x4030ca20, 0x1d4d: 0x4030fe20, 0x1d4e: 0x40313e20, 0x1d4f: 0x402bea20, + 0x1d50: 0x402c0020, 0x1d51: 0x402c8220, 0x1d52: 0x402caa20, 0x1d53: 0x402cca20, + 0x1d54: 0x402ce420, 0x1d55: 0x402cc020, 0x1d56: 0x402dc020, 0x1d57: 0x402f0620, + 0x1d58: 0x40302220, 0x1d59: 0x40308620, 0x1d5a: 0x40317620, 0x1d5b: 0x002c0294, + 0x1d5c: 0x002c3a94, 0x1d5d: 0x002c5694, 0x1d5e: 0xf0001414, 0x1d5f: 0x002cdc94, + 0x1d60: 0x002d0894, 0x1d61: 0x002dee94, 0x1d62: 0x002d2a94, 0x1d63: 0x00308894, + 0x1d64: 0x002db694, 0x1d65: 0x002dc294, 0x1d66: 0x002daa94, 0x1d67: 0x002dbe94, + 0x1d68: 0x002de694, 0x1d69: 0x002e5494, 0x1d6a: 0x002e5294, 0x1d6b: 0x002e2a94, + 0x1d6c: 0x002e9094, 0x1d6d: 0x0030ac94, 0x1d6e: 0x002eb494, 0x1d6f: 0x002ec894, + 0x1d70: 0x002ea694, 0x1d71: 0x002f1094, 0x1d72: 0x002f4c94, 0x1d73: 0x002ff494, + 0x1d74: 0x00300894, 0x1d75: 0x00304294, 0x1d76: 0x00307c94, 0x1d77: 0x0030b494, + 0x1d78: 0x00307494, 0x1d79: 0x0030cc94, 0x1d7a: 0x0030da94, 0x1d7b: 0x00312a94, + 0x1d7c: 0x00314894, 0x1d7d: 0x00315094, 0x1d7e: 0x00316494, 0x1d7f: 0x00326a94, + // Block 0x76, offset 0x1d80 + 0x1d80: 0xae605f02, 0x1d81: 0xae605f02, 0x1d82: 0xadc06002, 0x1d83: 0xae605f02, + 0x1d84: 0xae605f02, 0x1d85: 0xae605f02, 0x1d86: 0xae605f02, 0x1d87: 0xae605f02, + 0x1d88: 0xae605f02, 0x1d89: 0xae605f02, 0x1d8a: 0x84dc17bd, 0x1d8b: 0xae605f02, + 0x1d8c: 0xae605f02, 0x1d8d: 0xaea05f02, 0x1d8e: 0xad605f02, 0x1d8f: 0xadc06002, + 0x1d90: 0xaca06002, 0x1d91: 0xae605f02, 0x1d92: 0x84e618d1, 0x1d93: 0xe00009b4, + 0x1d94: 0xe00009d9, 0x1d95: 0xe00009f9, 0x1d96: 0xe0000a08, 0x1d97: 0xe0000a50, + 0x1d98: 0xe0000ab6, 0x1d99: 0xe0000ab0, 0x1d9a: 0x84e61691, 0x1d9b: 0x84e61699, + 0x1d9c: 0x84e616ff, 0x1d9d: 0x84e61711, 0x1d9e: 0x84e61715, 0x1d9f: 0x84e61745, + 0x1da0: 0x84e6174f, 0x1da1: 0x84e61753, 0x1da2: 0x84e617c1, 0x1da3: 0x84e617c5, + 0x1da4: 0x84e617f3, 0x1da5: 0xe0000f67, 0x1da6: 0x84e61895, + 0x1dbc: 0xae906002, 0x1dbd: 0xadc06002, 0x1dbe: 0xae605f02, 0x1dbf: 0xadc06002, + // Block 0x77, offset 0x1dc0 + 0x1dc0: 0xe00009b1, 0x1dc1: 0xe00009ae, 0x1dc2: 0xe0000a22, 0x1dc3: 0xe0000a1f, + 0x1dc4: 0xe0000a28, 0x1dc5: 0xe0000a25, 0x1dc6: 0xe0000a2e, 0x1dc7: 0xe0000a2b, + 0x1dc8: 0xe0000a5a, 0x1dc9: 0xe0000a56, 0x1dca: 0xe0000a8c, 0x1dcb: 0xe0000a89, + 0x1dcc: 0xe0000a98, 0x1dcd: 0xe0000a95, 0x1dce: 0xe0000aa4, 0x1dcf: 0xe0000aa1, + 0x1dd0: 0xe0000a92, 0x1dd1: 0xe0000a8f, 0x1dd2: 0xe0000a9e, 0x1dd3: 0xe0000a9b, + 0x1dd4: 0xe0000b55, 0x1dd5: 0xe0000b51, 0x1dd6: 0xe0000b4d, 0x1dd7: 0xe0000b49, + 0x1dd8: 0xe0000b7c, 0x1dd9: 0xe0000b79, 0x1dda: 0xe0000b82, 0x1ddb: 0xe0000b7f, + 0x1ddc: 0xe0000b39, 0x1ddd: 0xe0000b35, 0x1dde: 0xe0000b8c, 0x1ddf: 0xe0000b89, + 0x1de0: 0xe0000bd0, 0x1de1: 0xe0000bcd, 0x1de2: 0xe0000c00, 0x1de3: 0xe0000bfd, + 0x1de4: 0xe0000c0c, 0x1de5: 0xe0000c09, 0x1de6: 0xe0000bfa, 0x1de7: 0xe0000bf7, + 0x1de8: 0xe0000c06, 0x1de9: 0xe0000c03, 0x1dea: 0xe0000c12, 0x1deb: 0xe0000c0f, + 0x1dec: 0xe0000c7e, 0x1ded: 0xe0000c7b, 0x1dee: 0xe0000c4a, 0x1def: 0xe0000c46, + 0x1df0: 0xe0000c93, 0x1df1: 0xe0000c90, 0x1df2: 0xe0000cab, 0x1df3: 0xe0000ca8, + 0x1df4: 0xe0000cb1, 0x1df5: 0xe0000cae, 0x1df6: 0xe0000cde, 0x1df7: 0xe0000cdb, + 0x1df8: 0xe0000ce5, 0x1df9: 0xe0000ce1, 0x1dfa: 0xe0000cf2, 0x1dfb: 0xe0000cef, + 0x1dfc: 0xe0000cec, 0x1dfd: 0xe0000ce9, 0x1dfe: 0xe0000d1e, 0x1dff: 0xe0000d1b, + // Block 0x78, offset 0x1e00 + 0x1e00: 0xe0000d24, 0x1e01: 0xe0000d21, 0x1e02: 0xe0000d2a, 0x1e03: 0xe0000d27, + 0x1e04: 0xe0000d69, 0x1e05: 0xe0000d66, 0x1e06: 0xe0000d7b, 0x1e07: 0xe0000d78, + 0x1e08: 0xe0000d87, 0x1e09: 0xe0000d84, 0x1e0a: 0xe0000d81, 0x1e0b: 0xe0000d7e, + 0x1e0c: 0xe0000ded, 0x1e0d: 0xe0000de9, 0x1e0e: 0xe0000df5, 0x1e0f: 0xe0000df1, + 0x1e10: 0xe0000e3d, 0x1e11: 0xe0000e39, 0x1e12: 0xe0000e35, 0x1e13: 0xe0000e31, + 0x1e14: 0xe0000ea7, 0x1e15: 0xe0000ea4, 0x1e16: 0xe0000ead, 0x1e17: 0xe0000eaa, + 0x1e18: 0xe0000ed6, 0x1e19: 0xe0000ed3, 0x1e1a: 0xe0000ef4, 0x1e1b: 0xe0000ef1, + 0x1e1c: 0xe0000efb, 0x1e1d: 0xe0000ef7, 0x1e1e: 0xe0000f02, 0x1e1f: 0xe0000eff, + 0x1e20: 0xe0000f41, 0x1e21: 0xe0000f3e, 0x1e22: 0xe0000f53, 0x1e23: 0xe0000f50, + 0x1e24: 0xe0000f26, 0x1e25: 0xe0000f22, 0x1e26: 0xe0000f3a, 0x1e27: 0xe0000f36, + 0x1e28: 0xe0000f5a, 0x1e29: 0xe0000f56, 0x1e2a: 0xe0000f93, 0x1e2b: 0xe0000f90, + 0x1e2c: 0xe0000f9f, 0x1e2d: 0xe0000f9c, 0x1e2e: 0xe0000fb1, 0x1e2f: 0xe0000fae, + 0x1e30: 0xe0000fab, 0x1e31: 0xe0000fa8, 0x1e32: 0xe0001093, 0x1e33: 0xe0001090, + 0x1e34: 0xe000109f, 0x1e35: 0xe000109c, 0x1e36: 0xe0001099, 0x1e37: 0xe0001096, + 0x1e38: 0xe0001032, 0x1e39: 0xe000102e, 0x1e3a: 0xe0001046, 0x1e3b: 0xe0001042, + 0x1e3c: 0xe00010a9, 0x1e3d: 0xe00010a6, 0x1e3e: 0xe00010af, 0x1e3f: 0xe00010ac, + // Block 0x79, offset 0x1e40 + 0x1e40: 0xe00010d2, 0x1e41: 0xe00010cf, 0x1e42: 0xe00010cc, 0x1e43: 0xe00010c9, + 0x1e44: 0xe00010e1, 0x1e45: 0xe00010de, 0x1e46: 0xe00010e7, 0x1e47: 0xe00010e4, + 0x1e48: 0xe00010ed, 0x1e49: 0xe00010ea, 0x1e4a: 0xe00010fc, 0x1e4b: 0xe00010f9, + 0x1e4c: 0xe00010f6, 0x1e4d: 0xe00010f3, 0x1e4e: 0xe0001123, 0x1e4f: 0xe0001120, + 0x1e50: 0xe0001141, 0x1e51: 0xe000113e, 0x1e52: 0xe0001153, 0x1e53: 0xe0001150, + 0x1e54: 0xe0001159, 0x1e55: 0xe0001156, 0x1e56: 0xe0000c15, 0x1e57: 0xe0000f8d, + 0x1e58: 0xe00010db, 0x1e59: 0xe0001111, 0x1e5a: 0xf0000404, 0x1e5b: 0xe0000f70, + 0x1e5c: 0x40300420, 0x1e5d: 0x40300620, 0x1e5e: 0xe0000f7f, 0x1e5f: 0x402c9620, + 0x1e60: 0xe000099b, 0x1e61: 0xe0000998, 0x1e62: 0xe0000989, 0x1e63: 0xe0000986, + 0x1e64: 0xe0000928, 0x1e65: 0xe0000924, 0x1e66: 0xe0000930, 0x1e67: 0xe000092c, + 0x1e68: 0xe0000940, 0x1e69: 0xe000093c, 0x1e6a: 0xe0000938, 0x1e6b: 0xe0000934, + 0x1e6c: 0xe00009aa, 0x1e6d: 0xe00009a6, 0x1e6e: 0xe0000902, 0x1e6f: 0xe00008fe, + 0x1e70: 0xe000090a, 0x1e71: 0xe0000906, 0x1e72: 0xe000091a, 0x1e73: 0xe0000916, + 0x1e74: 0xe0000912, 0x1e75: 0xe000090e, 0x1e76: 0xe00009a2, 0x1e77: 0xe000099e, + 0x1e78: 0xe0000b6e, 0x1e79: 0xe0000b6b, 0x1e7a: 0xe0000b5c, 0x1e7b: 0xe0000b59, + 0x1e7c: 0xe0000b26, 0x1e7d: 0xe0000b23, 0x1e7e: 0xe0000afb, 0x1e7f: 0xe0000af7, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0xe0000b03, 0x1e81: 0xe0000aff, 0x1e82: 0xe0000b13, 0x1e83: 0xe0000b0f, + 0x1e84: 0xe0000b0b, 0x1e85: 0xe0000b07, 0x1e86: 0xe0000b75, 0x1e87: 0xe0000b71, + 0x1e88: 0xe0000c66, 0x1e89: 0xe0000c63, 0x1e8a: 0xe0000c78, 0x1e8b: 0xe0000c75, + 0x1e8c: 0xe0000e84, 0x1e8d: 0xe0000e81, 0x1e8e: 0xe0000e44, 0x1e8f: 0xe0000e41, + 0x1e90: 0xe0000dad, 0x1e91: 0xe0000da9, 0x1e92: 0xe0000db5, 0x1e93: 0xe0000db1, + 0x1e94: 0xe0000dc5, 0x1e95: 0xe0000dc1, 0x1e96: 0xe0000dbd, 0x1e97: 0xe0000db9, + 0x1e98: 0xe0000e8b, 0x1e99: 0xe0000e87, 0x1e9a: 0xe0000e5d, 0x1e9b: 0xe0000e59, + 0x1e9c: 0xe0000e65, 0x1e9d: 0xe0000e61, 0x1e9e: 0xe0000e75, 0x1e9f: 0xe0000e71, + 0x1ea0: 0xe0000e6d, 0x1ea1: 0xe0000e69, 0x1ea2: 0xe0000e7d, 0x1ea3: 0xe0000e79, + 0x1ea4: 0xe000108d, 0x1ea5: 0xe000108a, 0x1ea6: 0xe000104d, 0x1ea7: 0xe000104a, + 0x1ea8: 0xe0001066, 0x1ea9: 0xe0001062, 0x1eaa: 0xe000106e, 0x1eab: 0xe000106a, + 0x1eac: 0xe000107e, 0x1ead: 0xe000107a, 0x1eae: 0xe0001076, 0x1eaf: 0xe0001072, + 0x1eb0: 0xe0001086, 0x1eb1: 0xe0001082, 0x1eb2: 0xe0001108, 0x1eb3: 0xe0001105, + 0x1eb4: 0xe0001135, 0x1eb5: 0xe0001132, 0x1eb6: 0xe000112f, 0x1eb7: 0xe000112c, + 0x1eb8: 0xe000111d, 0x1eb9: 0xe000111a, 0x1eba: 0xe0000d0a, 0x1ebb: 0xe0000d07, + 0x1ebc: 0x0030d888, 0x1ebd: 0x4030d820, 0x1ebe: 0x00312088, 0x1ebf: 0x40312020, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0xe0001165, 0x1ec1: 0xe00011a9, 0x1ec2: 0xe000117d, 0x1ec3: 0xe00011c1, + 0x1ec4: 0xe000116b, 0x1ec5: 0xe00011af, 0x1ec6: 0xe000118f, 0x1ec7: 0xe00011d3, + 0x1ec8: 0xe0001168, 0x1ec9: 0xe00011ac, 0x1eca: 0xe0001181, 0x1ecb: 0xe00011c5, + 0x1ecc: 0xe000116f, 0x1ecd: 0xe00011b3, 0x1ece: 0xe0001193, 0x1ecf: 0xe00011d7, + 0x1ed0: 0xe000121a, 0x1ed1: 0xe0001230, 0x1ed2: 0xe0001228, 0x1ed3: 0xe000123e, + 0x1ed4: 0xe0001220, 0x1ed5: 0xe0001236, + 0x1ed8: 0xe000121d, 0x1ed9: 0xe0001233, 0x1eda: 0xe000122c, 0x1edb: 0xe0001242, + 0x1edc: 0xe0001224, 0x1edd: 0xe000123a, + 0x1ee0: 0xe0001252, 0x1ee1: 0xe0001296, 0x1ee2: 0xe000126a, 0x1ee3: 0xe00012ae, + 0x1ee4: 0xe0001258, 0x1ee5: 0xe000129c, 0x1ee6: 0xe000127c, 0x1ee7: 0xe00012c0, + 0x1ee8: 0xe0001255, 0x1ee9: 0xe0001299, 0x1eea: 0xe000126e, 0x1eeb: 0xe00012b2, + 0x1eec: 0xe000125c, 0x1eed: 0xe00012a0, 0x1eee: 0xe0001280, 0x1eef: 0xe00012c4, + 0x1ef0: 0xe00012fb, 0x1ef1: 0xe0001319, 0x1ef2: 0xe0001309, 0x1ef3: 0xe0001327, + 0x1ef4: 0xe0001301, 0x1ef5: 0xe000131f, 0x1ef6: 0xe0001311, 0x1ef7: 0xe000132f, + 0x1ef8: 0xe00012fe, 0x1ef9: 0xe000131c, 0x1efa: 0xe000130d, 0x1efb: 0xe000132b, + 0x1efc: 0xe0001305, 0x1efd: 0xe0001323, 0x1efe: 0xe0001315, 0x1eff: 0xe0001333, + // Block 0x7c, offset 0x1f00 + 0x1f00: 0xe000136c, 0x1f01: 0xe0001382, 0x1f02: 0xe000137a, 0x1f03: 0xe0001390, + 0x1f04: 0xe0001372, 0x1f05: 0xe0001388, + 0x1f08: 0xe000136f, 0x1f09: 0xe0001385, 0x1f0a: 0xe000137e, 0x1f0b: 0xe0001394, + 0x1f0c: 0xe0001376, 0x1f0d: 0xe000138c, + 0x1f10: 0xe00013ad, 0x1f11: 0xe00013bc, 0x1f12: 0xe00013b4, 0x1f13: 0xe00013ca, + 0x1f14: 0xe00013b0, 0x1f15: 0xe00013c2, 0x1f16: 0xe00013b8, 0x1f17: 0xe00013d2, + 0x1f19: 0xe00013bf, 0x1f1b: 0xe00013ce, + 0x1f1d: 0xe00013c6, 0x1f1f: 0xe00013d6, + 0x1f20: 0xe0001407, 0x1f21: 0xe000144b, 0x1f22: 0xe000141f, 0x1f23: 0xe0001463, + 0x1f24: 0xe000140d, 0x1f25: 0xe0001451, 0x1f26: 0xe0001431, 0x1f27: 0xe0001475, + 0x1f28: 0xe000140a, 0x1f29: 0xe000144e, 0x1f2a: 0xe0001423, 0x1f2b: 0xe0001467, + 0x1f2c: 0xe0001411, 0x1f2d: 0xe0001455, 0x1f2e: 0xe0001435, 0x1f2f: 0xe0001479, + 0x1f30: 0xe00011f7, 0x1f31: 0xe00011ed, 0x1f32: 0xe000124c, 0x1f33: 0xe0001246, + 0x1f34: 0xe00012e4, 0x1f35: 0xe00012da, 0x1f36: 0xe000133d, 0x1f37: 0xe0001337, + 0x1f38: 0xe000139e, 0x1f39: 0xe0001398, 0x1f3a: 0xe00013e0, 0x1f3b: 0xe00013da, + 0x1f3c: 0xe0001499, 0x1f3d: 0xe000148f, + // Block 0x7d, offset 0x1f40 + 0x1f40: 0xe00011a1, 0x1f41: 0xe00011e5, 0x1f42: 0xe0001185, 0x1f43: 0xe00011c9, + 0x1f44: 0xe0001173, 0x1f45: 0xe00011b7, 0x1f46: 0xe0001197, 0x1f47: 0xe00011db, + 0x1f48: 0xe00011a5, 0x1f49: 0xe00011e9, 0x1f4a: 0xe000118a, 0x1f4b: 0xe00011ce, + 0x1f4c: 0xe0001178, 0x1f4d: 0xe00011bc, 0x1f4e: 0xe000119c, 0x1f4f: 0xe00011e0, + 0x1f50: 0xe000128e, 0x1f51: 0xe00012d2, 0x1f52: 0xe0001272, 0x1f53: 0xe00012b6, + 0x1f54: 0xe0001260, 0x1f55: 0xe00012a4, 0x1f56: 0xe0001284, 0x1f57: 0xe00012c8, + 0x1f58: 0xe0001292, 0x1f59: 0xe00012d6, 0x1f5a: 0xe0001277, 0x1f5b: 0xe00012bb, + 0x1f5c: 0xe0001265, 0x1f5d: 0xe00012a9, 0x1f5e: 0xe0001289, 0x1f5f: 0xe00012cd, + 0x1f60: 0xe0001443, 0x1f61: 0xe0001487, 0x1f62: 0xe0001427, 0x1f63: 0xe000146b, + 0x1f64: 0xe0001415, 0x1f65: 0xe0001459, 0x1f66: 0xe0001439, 0x1f67: 0xe000147d, + 0x1f68: 0xe0001447, 0x1f69: 0xe000148b, 0x1f6a: 0xe000142c, 0x1f6b: 0xe0001470, + 0x1f6c: 0xe000141a, 0x1f6d: 0xe000145e, 0x1f6e: 0xe000143e, 0x1f6f: 0xe0001482, + 0x1f70: 0xe0001201, 0x1f71: 0xe000120e, 0x1f72: 0xe00011fd, 0x1f73: 0xe0001214, + 0x1f74: 0xe00011f3, 0x1f76: 0xe0001207, 0x1f77: 0xe000120a, + 0x1f78: 0xe0001204, 0x1f79: 0xe0001211, 0x1f7a: 0xe00011fa, 0x1f7b: 0xe00011f0, + 0x1f7c: 0xe0001217, 0x1f7d: 0x40063620, 0x1f7e: 0x40326c20, 0x1f7f: 0x40063620, + // Block 0x7e, offset 0x1f80 + 0x1f80: 0x40063a20, 0x1f81: 0xe00000b1, 0x1f82: 0xe00012ea, 0x1f83: 0xe00012f5, + 0x1f84: 0xe00012e0, 0x1f86: 0xe00012ee, 0x1f87: 0xe00012f1, + 0x1f88: 0xe000124f, 0x1f89: 0xe0001249, 0x1f8a: 0xe00012e7, 0x1f8b: 0xe00012dd, + 0x1f8c: 0xe00012f8, 0x1f8d: 0xe00000b7, 0x1f8e: 0xe00000b4, 0x1f8f: 0xe00000ba, + 0x1f90: 0xe0001343, 0x1f91: 0xe000135e, 0x1f92: 0xe0001356, 0x1f93: 0xe0001352, + 0x1f96: 0xe0001349, 0x1f97: 0xe000135a, + 0x1f98: 0xe0001346, 0x1f99: 0xe0001361, 0x1f9a: 0xe0001340, 0x1f9b: 0xe000133a, + 0x1f9d: 0xe00000c0, 0x1f9e: 0xe00000bd, 0x1f9f: 0xe00000c3, + 0x1fa0: 0xe00013e6, 0x1fa1: 0xe0001401, 0x1fa2: 0xe00013f9, 0x1fa3: 0xe00013f5, + 0x1fa4: 0xe00013a4, 0x1fa5: 0xe00013a7, 0x1fa6: 0xe00013ec, 0x1fa7: 0xe00013fd, + 0x1fa8: 0xe00013e9, 0x1fa9: 0xe0001404, 0x1faa: 0xe00013e3, 0x1fab: 0xe00013dd, + 0x1fac: 0xe00013aa, 0x1fad: 0xe00000ae, 0x1fae: 0xe00000ab, 0x1faf: 0x40061e20, + 0x1fb2: 0xe000149f, 0x1fb3: 0xe00014aa, + 0x1fb4: 0xe0001495, 0x1fb6: 0xe00014a3, 0x1fb7: 0xe00014a6, + 0x1fb8: 0xe00013a1, 0x1fb9: 0xe000139b, 0x1fba: 0xe000149c, 0x1fbb: 0xe0001492, + 0x1fbc: 0xe00014ad, 0x1fbd: 0x40062020, 0x1fbe: 0x40063820, + // Block 0x7f, offset 0x1fc0 + 0x1fc0: 0x00021284, 0x1fc1: 0x00021284, 0x1fc2: 0x00021284, 0x1fc3: 0x00021284, + 0x1fc4: 0x00021284, 0x1fc5: 0x00021284, 0x1fc6: 0x00021284, 0x1fc7: 0x0002129b, + 0x1fc8: 0x00021284, 0x1fc9: 0x00021284, 0x1fca: 0x00021284, 0x1fcb: 0xa0000000, + 0x1fcc: 0xa0000000, 0x1fcd: 0xa0000000, 0x1fce: 0xa0000000, 0x1fcf: 0xa0000000, + 0x1fd0: 0x40022620, 0x1fd1: 0x0002269b, 0x1fd2: 0x40022820, 0x1fd3: 0x40022a20, + 0x1fd4: 0x40022c20, 0x1fd5: 0x40022e20, 0x1fd6: 0x4004c420, 0x1fd7: 0x40021820, + 0x1fd8: 0x4003d420, 0x1fd9: 0x4003d620, 0x1fda: 0x4003d820, 0x1fdb: 0x4003da20, + 0x1fdc: 0x4003e220, 0x1fdd: 0x4003e420, 0x1fde: 0x4003e620, 0x1fdf: 0x4003e820, + 0x1fe0: 0x4004f820, 0x1fe1: 0x4004fa20, 0x1fe2: 0x40050220, 0x1fe3: 0x40050420, + 0x1fe4: 0x0002e484, 0x1fe5: 0xf0001f04, 0x1fe6: 0xf0000404, 0x1fe7: 0x40050620, + 0x1fe8: 0x40020e20, 0x1fe9: 0x40021020, 0x1fea: 0xa0000000, 0x1feb: 0xa0000000, + 0x1fec: 0xa0000000, 0x1fed: 0xa0000000, 0x1fee: 0xa0000000, 0x1fef: 0x0002129b, + 0x1ff0: 0x4004f020, 0x1ff1: 0x4004f420, 0x1ff2: 0x40050e20, 0x1ff3: 0xf0001f04, + 0x1ff4: 0xf0000404, 0x1ff5: 0x40051020, 0x1ff6: 0xf0001f04, 0x1ff7: 0xf0000404, + 0x1ff8: 0x40051620, 0x1ff9: 0x4003dc20, 0x1ffa: 0x4003de20, 0x1ffb: 0x40051820, + 0x1ffc: 0xf0001f04, 0x1ffd: 0x4002e020, 0x1ffe: 0x40021420, 0x1fff: 0x40051a20, + // Block 0x80, offset 0x2000 + 0x2000: 0x40051e20, 0x2001: 0x40052220, 0x2002: 0x40052420, 0x2003: 0x40050820, + 0x2004: 0x40095820, 0x2005: 0x40040c20, 0x2006: 0x40040e20, 0x2007: 0xf0001f04, + 0x2008: 0xf0001f04, 0x2009: 0xf0001f04, 0x200a: 0x4004e820, 0x200b: 0x4004d420, + 0x200c: 0x40050a20, 0x200d: 0x40050c20, 0x200e: 0x4004da20, 0x200f: 0x40026620, + 0x2010: 0x40052020, 0x2011: 0x4004dc20, 0x2012: 0x40095020, 0x2013: 0x40023420, + 0x2014: 0x40051c20, 0x2015: 0x40039c20, 0x2016: 0x40039e20, 0x2017: 0xe00000a6, + 0x2018: 0x4003a020, 0x2019: 0x4003a220, 0x201a: 0x4003a420, 0x201b: 0x4003a620, + 0x201c: 0x4003a820, 0x201d: 0x4003aa20, 0x201e: 0x4003ac20, 0x201f: 0x00021284, + 0x2020: 0xa0000000, 0x2021: 0xa0000000, 0x2022: 0xa0000000, 0x2023: 0xa0000000, + 0x2024: 0xa0000000, + 0x202a: 0xa0000000, 0x202b: 0xa0000000, + 0x202c: 0xa0000000, 0x202d: 0xa0000000, 0x202e: 0xa0000000, 0x202f: 0xa0000000, + 0x2030: 0x0029cc94, 0x2031: 0x002d9a94, + 0x2034: 0x0029d494, 0x2035: 0x0029d694, 0x2036: 0x0029d894, 0x2037: 0x0029da94, + 0x2038: 0x0029dc94, 0x2039: 0x0029de94, 0x203a: 0x00093894, 0x203b: 0x00094e94, + 0x203c: 0x00094294, 0x203d: 0x0003f494, 0x203e: 0x0003f694, 0x203f: 0x002e9e94, + // Block 0x81, offset 0x2040 + 0x2040: 0x0029cc95, 0x2041: 0x0029ce95, 0x2042: 0x0029d095, 0x2043: 0x0029d295, + 0x2044: 0x0029d495, 0x2045: 0x0029d695, 0x2046: 0x0029d895, 0x2047: 0x0029da95, + 0x2048: 0x0029dc95, 0x2049: 0x0029de95, 0x204a: 0x00093895, 0x204b: 0x00094e95, + 0x204c: 0x00094295, 0x204d: 0x0003f495, 0x204e: 0x0003f695, + 0x2050: 0x002bde95, 0x2051: 0x002c9895, 0x2052: 0x002ee295, 0x2053: 0x0030f695, + 0x2054: 0x002cb895, 0x2055: 0x002d6895, 0x2056: 0x002dfe95, 0x2057: 0x002e2295, + 0x2058: 0x002e8295, 0x2059: 0x002e9e95, 0x205a: 0x002f2c95, 0x205b: 0x002fe695, + 0x205c: 0x00302c95, + 0x2060: 0x4027f820, 0x2061: 0x4027fa20, 0x2062: 0x4027fc20, 0x2063: 0x4027fe20, + 0x2064: 0x40280020, 0x2065: 0x40280220, 0x2066: 0x40280420, 0x2067: 0x40280620, + 0x2068: 0x40282c20, 0x2069: 0x40280820, 0x206a: 0x40280a20, 0x206b: 0x40280c20, + 0x206c: 0x40280e20, 0x206d: 0x40281020, 0x206e: 0x40281220, 0x206f: 0x40281420, + 0x2070: 0x40281620, 0x2071: 0x40281820, 0x2072: 0x40281a20, 0x2073: 0x40281c20, + 0x2074: 0x40281e20, 0x2075: 0x40282020, 0x2076: 0x40282220, 0x2077: 0x40282420, + 0x2078: 0x40282620, 0x2079: 0x40282820, 0x207a: 0x40282a20, + // Block 0x82, offset 0x2080 + 0x2090: 0xae612a02, 0x2091: 0xae612b02, 0x2092: 0xa0112c02, 0x2093: 0xa0112c02, + 0x2094: 0xae612d02, 0x2095: 0xae612e02, 0x2096: 0xae612f02, 0x2097: 0xae613002, + 0x2098: 0xa0106102, 0x2099: 0xa0106102, 0x209a: 0xa0106102, 0x209b: 0xae613102, + 0x209c: 0xae613202, 0x209d: 0xa0006202, 0x209e: 0xa0006202, 0x209f: 0xa0006202, + 0x20a0: 0xa0006202, 0x20a1: 0xae613302, 0x20a2: 0xa0006202, 0x20a3: 0xa0006202, + 0x20a4: 0xa0006202, 0x20a5: 0xa0106102, 0x20a6: 0xa0113402, 0x20a7: 0xae613502, + 0x20a8: 0xadc13602, 0x20a9: 0xae613702, 0x20aa: 0xa0106102, 0x20ab: 0xa0106102, + 0x20ac: 0xadc06002, 0x20ad: 0xadc06002, 0x20ae: 0xadc06002, 0x20af: 0xadc06002, + 0x20b0: 0xae605f02, + // Block 0x83, offset 0x20c0 + 0x20c0: 0xe00009bc, 0x20c1: 0xe00009c0, 0x20c2: 0x002c3a8b, 0x20c3: 0xf0000a04, + 0x20c4: 0x40081c20, 0x20c5: 0xe0000a5e, 0x20c6: 0xe0000a62, 0x20c7: 0x002cc28a, + 0x20c8: 0x40081e20, 0x20c9: 0xf0000a04, 0x20ca: 0x002d2285, 0x20cb: 0x002d688b, + 0x20cc: 0x002d688b, 0x20cd: 0x002d688b, 0x20ce: 0x002d6885, 0x20cf: 0xf0000202, + 0x20d0: 0x002d9a8b, 0x20d1: 0x002d9a8b, 0x20d2: 0x002e228b, 0x20d3: 0x002e2285, + 0x20d4: 0x40082020, 0x20d5: 0x002e9e8b, 0x20d6: 0xf000040a, 0x20d7: 0x40082220, + 0x20d8: 0x40082420, 0x20d9: 0x002f2c8b, 0x20da: 0x002f568b, 0x20db: 0x002f7a8b, + 0x20dc: 0x002f7a8b, 0x20dd: 0x002f7a8b, 0x20de: 0x40082620, 0x20df: 0x40082820, + 0x20e0: 0xf0001414, 0x20e1: 0xe0000fbd, 0x20e2: 0xf0001414, 0x20e3: 0x40082a20, + 0x20e4: 0x00312a8b, 0x20e5: 0x40082c20, 0x20e6: 0x0032a288, 0x20e7: 0x40082e20, + 0x20e8: 0x00312a8b, 0x20e9: 0x40083020, 0x20ea: 0x002dfe88, 0x20eb: 0xe000094d, + 0x20ec: 0x002c0a8b, 0x20ed: 0x002c3a8b, 0x20ee: 0x40083220, 0x20ef: 0x002c9885, + 0x20f0: 0x002c988b, 0x20f1: 0x002d088b, 0x20f2: 0x002d1e88, 0x20f3: 0x002e828b, + 0x20f4: 0x002ee285, 0x20f5: 0x00389084, 0x20f6: 0x00389284, 0x20f7: 0x00389484, + 0x20f8: 0x00389684, 0x20f9: 0x002d9a85, 0x20fa: 0x40083420, 0x20fb: 0xe0000b95, + 0x20fc: 0x00327e85, 0x20fd: 0x00325685, 0x20fe: 0x0032568b, 0x20ff: 0x00327e8b, + // Block 0x84, offset 0x2100 + 0x2100: 0x00093685, 0x2101: 0x40083620, 0x2102: 0x40083820, 0x2103: 0x40083a20, + 0x2104: 0x40083c20, 0x2105: 0x002c628b, 0x2106: 0x002c6285, 0x2107: 0x002c9885, + 0x2108: 0x002d9a85, 0x2109: 0x002dcc85, 0x210a: 0x40083e20, 0x210b: 0x400a6e20, + 0x210c: 0x40084020, 0x210d: 0xe00009c4, 0x210e: 0x402d1e20, 0x210f: 0x40084220, + 0x2110: 0xe00002cb, 0x2111: 0xe00002d3, 0x2112: 0xe00002b2, 0x2113: 0xe00002bb, + 0x2114: 0xe00003cd, 0x2115: 0xe00002c3, 0x2116: 0xe00003d1, 0x2117: 0xe00004ab, + 0x2118: 0xe0000579, 0x2119: 0xe00002c7, 0x211a: 0xe0000640, 0x211b: 0xe00002cf, + 0x211c: 0xe00004af, 0x211d: 0xe0000644, 0x211e: 0xe0000798, 0x211f: 0xf0001e1e, + 0x2120: 0x002d9a8a, 0x2121: 0xf0001f0a, 0x2122: 0xf0000a0a, 0x2123: 0xf0001f0a, + 0x2124: 0x0030be8a, 0x2125: 0xf0001f0a, 0x2126: 0xf0000a0a, 0x2127: 0xe00010bb, + 0x2128: 0xf0001f0a, 0x2129: 0x0030f68a, 0x212a: 0xf0001f0a, 0x212b: 0xf0000a0a, + 0x212c: 0x002e228a, 0x212d: 0x002c3a8a, 0x212e: 0x002c628a, 0x212f: 0x002e828a, + 0x2130: 0x002d9a84, 0x2131: 0xf0001f04, 0x2132: 0xf0000404, 0x2133: 0xf0001f04, + 0x2134: 0x0030be84, 0x2135: 0xf0001f04, 0x2136: 0xf0000404, 0x2137: 0xe00010b6, + 0x2138: 0xf0001f04, 0x2139: 0x0030f684, 0x213a: 0xf0001f04, 0x213b: 0xf0000404, + 0x213c: 0x002e2284, 0x213d: 0x002c3a84, 0x213e: 0x002c6284, 0x213f: 0x002e8284, + // Block 0x85, offset 0x2140 + 0x2140: 0x40287c20, 0x2141: 0x40287e20, 0x2142: 0x40288020, 0x2143: 0x002c5e88, + 0x2144: 0x402c5e20, 0x2145: 0xe00006c9, 0x2146: 0x40288220, 0x2147: 0x40288420, + 0x2148: 0x40288620, 0x2149: 0xe00001e2, + 0x2150: 0x40084420, 0x2151: 0x40084820, 0x2152: 0x40084620, 0x2153: 0x40084a20, + 0x2154: 0x40084c20, 0x2155: 0x40084e20, 0x2156: 0x40085020, 0x2157: 0x40085220, + 0x2158: 0x40085420, 0x2159: 0x40085620, 0x215a: 0xe00000c6, 0x215b: 0xe00000c9, + 0x215c: 0x40085820, 0x215d: 0x40085a20, 0x215e: 0x40085c20, 0x215f: 0x40085e20, + 0x2160: 0x40086020, 0x2161: 0x40086220, 0x2162: 0x40086420, 0x2163: 0x40086620, + 0x2164: 0x40086820, 0x2165: 0x40086a20, 0x2166: 0x40086c20, 0x2167: 0x40086e20, + 0x2168: 0x40087020, 0x2169: 0x40087220, 0x216a: 0x40087420, 0x216b: 0x40087620, + 0x216c: 0x40087820, 0x216d: 0x40087a20, 0x216e: 0xe00000cc, 0x216f: 0x40087c20, + 0x2170: 0x40087e20, 0x2171: 0x40088020, 0x2172: 0x40088220, 0x2173: 0x40088420, + 0x2174: 0x40088620, 0x2175: 0x40088820, 0x2176: 0x40088a20, 0x2177: 0x40088c20, + 0x2178: 0x40088e20, 0x2179: 0x40089020, 0x217a: 0x40089220, 0x217b: 0x40089420, + 0x217c: 0x40089620, 0x217d: 0x40089820, 0x217e: 0x40089a20, 0x217f: 0x40089c20, + // Block 0x86, offset 0x2180 + 0x2180: 0x40089e20, 0x2181: 0x4008a020, 0x2182: 0x4008a220, 0x2183: 0x4008a420, + 0x2184: 0x4008a620, 0x2185: 0x4008a820, 0x2186: 0x4008aa20, 0x2187: 0x4008ac20, + 0x2188: 0x4008ae20, 0x2189: 0x4008b020, 0x218a: 0x4008b220, 0x218b: 0x4008b420, + 0x218c: 0x4008b620, 0x218d: 0xe00000cf, 0x218e: 0xe00000d5, 0x218f: 0xe00000d2, + 0x2190: 0x4008b820, 0x2191: 0x4008ba20, 0x2192: 0x4008bc20, 0x2193: 0x4008be20, + 0x2194: 0x4008c020, 0x2195: 0x4008c220, 0x2196: 0x4008c420, 0x2197: 0x4008c620, + 0x2198: 0x4008c820, 0x2199: 0x4008ca20, 0x219a: 0x4008cc20, 0x219b: 0x4008ce20, + 0x219c: 0x4008d020, 0x219d: 0x4008d220, 0x219e: 0x4008d420, 0x219f: 0x4008d620, + 0x21a0: 0x4008d820, 0x21a1: 0x4008da20, 0x21a2: 0x4008dc20, 0x21a3: 0x4008de20, + 0x21a4: 0x4008e020, 0x21a5: 0x4008e220, 0x21a6: 0x4008e420, 0x21a7: 0x4008e620, + 0x21a8: 0x4008e820, 0x21a9: 0x4008ea20, 0x21aa: 0x4008ec20, 0x21ab: 0x4008ee20, + 0x21ac: 0x4008f020, 0x21ad: 0x4008f220, 0x21ae: 0x4008f420, 0x21af: 0x4008f620, + 0x21b0: 0x4008f820, 0x21b1: 0x4008fa20, 0x21b2: 0x4008fc20, 0x21b3: 0x4008fe20, + 0x21b4: 0x40090020, 0x21b5: 0x40090220, 0x21b6: 0x40090420, 0x21b7: 0x40090620, + 0x21b8: 0x40090820, 0x21b9: 0x40090a20, 0x21ba: 0x40090c20, 0x21bb: 0x40090e20, + 0x21bc: 0x40091020, 0x21bd: 0x40091220, 0x21be: 0x40091420, 0x21bf: 0x40091620, + // Block 0x87, offset 0x21c0 + 0x21c0: 0x40091820, 0x21c1: 0x40091a20, 0x21c2: 0x40091c20, 0x21c3: 0x40091e20, + 0x21c4: 0xe00000d8, 0x21c5: 0x40092020, 0x21c6: 0x40092220, 0x21c7: 0x40092420, + 0x21c8: 0x40092620, 0x21c9: 0xe00000db, 0x21ca: 0x40092820, 0x21cb: 0x40092a20, + 0x21cc: 0xe00000de, 0x21cd: 0x40092c20, 0x21ce: 0x40093020, 0x21cf: 0x40093220, + 0x21d0: 0x40093420, 0x21d1: 0x40093620, 0x21d2: 0x40094e20, 0x21d3: 0x40095220, + 0x21d4: 0x40095420, 0x21d5: 0x40095620, 0x21d6: 0x40095a20, 0x21d7: 0x40095c20, + 0x21d8: 0x40095e20, 0x21d9: 0x40096020, 0x21da: 0x40096220, 0x21db: 0x40096420, + 0x21dc: 0x40096820, 0x21dd: 0x40096c20, 0x21de: 0x40096e20, 0x21df: 0x40097020, + 0x21e0: 0x40097220, 0x21e1: 0x40097420, 0x21e2: 0x40097620, 0x21e3: 0x40097820, + 0x21e4: 0xe00000ea, 0x21e5: 0x40097a20, 0x21e6: 0xe00000ed, 0x21e7: 0x40097c20, + 0x21e8: 0x40097e20, 0x21e9: 0x40098020, 0x21ea: 0x40098220, 0x21eb: 0x40098420, + 0x21ec: 0xf0001f04, 0x21ed: 0xf0000404, 0x21ee: 0x40098620, 0x21ef: 0xf0001f04, + 0x21f0: 0xf0000404, 0x21f1: 0x40098820, 0x21f2: 0x40098a20, 0x21f3: 0x40098c20, + 0x21f4: 0x40098e20, 0x21f5: 0x40099020, 0x21f6: 0x40099220, 0x21f7: 0x40099420, + 0x21f8: 0x40099620, 0x21f9: 0x40099820, 0x21fa: 0x40099a20, 0x21fb: 0x40099c20, + 0x21fc: 0x40099e20, 0x21fd: 0x4009a020, 0x21fe: 0x4009a220, 0x21ff: 0x4009a420, + // Block 0x88, offset 0x2200 + 0x2200: 0x4009a620, 0x2201: 0xe00000f5, 0x2202: 0x4009a820, 0x2203: 0x4009aa20, + 0x2204: 0xe00000f8, 0x2205: 0x4009ac20, 0x2206: 0x4009ae20, 0x2207: 0xe00000fb, + 0x2208: 0x4009b020, 0x2209: 0xe00000fe, 0x220a: 0x4009b220, 0x220b: 0x4009b420, + 0x220c: 0x4009b620, 0x220d: 0x4009b820, 0x220e: 0x4009ba20, 0x220f: 0x4009bc20, + 0x2210: 0x4009be20, 0x2211: 0x4009c020, 0x2212: 0x4009c220, 0x2213: 0x4009c420, + 0x2214: 0x4009c620, 0x2215: 0x4009c820, 0x2216: 0x4009ca20, 0x2217: 0x4009cc20, + 0x2218: 0x4009ce20, 0x2219: 0x4009d020, 0x221a: 0x4009d220, 0x221b: 0x4009d420, + 0x221c: 0x4009d620, 0x221d: 0x4009d820, 0x221e: 0x4009da20, 0x221f: 0x4009dc20, + 0x2220: 0xe00000e4, 0x2221: 0x4009de20, 0x2222: 0xe0000104, 0x2223: 0x4009e020, + 0x2224: 0x4009e220, 0x2225: 0x4009e420, 0x2226: 0x4009e620, 0x2227: 0x4009e820, + 0x2228: 0x4009ea20, 0x2229: 0x4009ec20, 0x222a: 0x4009ee20, 0x222b: 0x4009f020, + 0x222c: 0x4009f220, 0x222d: 0xe0000101, 0x222e: 0xe00000e1, 0x222f: 0xe00000e7, + 0x2230: 0xe0000107, 0x2231: 0xe000010a, 0x2232: 0x4009f420, 0x2233: 0x4009f620, + 0x2234: 0xe000010d, 0x2235: 0xe0000110, 0x2236: 0x4009f820, 0x2237: 0x4009fa20, + 0x2238: 0xe0000113, 0x2239: 0xe0000116, 0x223a: 0x4009fc20, 0x223b: 0x4009fe20, + 0x223c: 0x400a0020, 0x223d: 0x400a0220, 0x223e: 0x400a0420, 0x223f: 0x400a0620, + // Block 0x89, offset 0x2240 + 0x2240: 0xe0000119, 0x2241: 0xe000011c, 0x2242: 0x400a0820, 0x2243: 0x400a0a20, + 0x2244: 0xe0000125, 0x2245: 0xe0000128, 0x2246: 0x400a0c20, 0x2247: 0x400a0e20, + 0x2248: 0xe000012b, 0x2249: 0xe000012e, 0x224a: 0x400a1020, 0x224b: 0x400a1220, + 0x224c: 0x400a1420, 0x224d: 0x400a1620, 0x224e: 0x400a1820, 0x224f: 0x400a1a20, + 0x2250: 0x400a1c20, 0x2251: 0x400a1e20, 0x2252: 0x400a2020, 0x2253: 0x400a2220, + 0x2254: 0x400a2420, 0x2255: 0x400a2620, 0x2256: 0x400a2820, 0x2257: 0x400a2a20, + 0x2258: 0x400a2c20, 0x2259: 0x400a2e20, 0x225a: 0x400a3020, 0x225b: 0x400a3220, + 0x225c: 0x400a3420, 0x225d: 0x400a3620, 0x225e: 0x400a3820, 0x225f: 0x400a3a20, + 0x2260: 0x400a3c20, 0x2261: 0x400a3e20, 0x2262: 0x400a4020, 0x2263: 0x400a4220, + 0x2264: 0x400a4420, 0x2265: 0x400a4620, 0x2266: 0x400a4820, 0x2267: 0x400a4a20, + 0x2268: 0x400a4c20, 0x2269: 0x400a4e20, 0x226a: 0x400a5020, 0x226b: 0x400a5220, + 0x226c: 0xe0000137, 0x226d: 0xe000013a, 0x226e: 0xe000013d, 0x226f: 0xe0000140, + 0x2270: 0x400a5420, 0x2271: 0x400a5620, 0x2272: 0x400a5820, 0x2273: 0x400a5a20, + 0x2274: 0x400a5c20, 0x2275: 0x400a5e20, 0x2276: 0x400a6020, 0x2277: 0x400a6220, + 0x2278: 0x400a6420, 0x2279: 0x400a6620, 0x227a: 0x400a6820, 0x227b: 0x400a6a20, + 0x227c: 0x400a6c20, 0x227d: 0x400a7020, 0x227e: 0x400a7220, 0x227f: 0x400a7420, + // Block 0x8a, offset 0x2280 + 0x2280: 0x400a7620, 0x2281: 0x400a7820, 0x2282: 0x400a7a20, 0x2283: 0x400a7c20, + 0x2284: 0x400a7e20, 0x2285: 0x400a8020, 0x2286: 0x400a8220, 0x2287: 0x400a8420, + 0x2288: 0x400a8620, 0x2289: 0x400a8820, 0x228a: 0x400a8a20, 0x228b: 0x400a8c20, + 0x228c: 0x400a8e20, 0x228d: 0x400a9020, 0x228e: 0x400a9220, 0x228f: 0x400a9420, + 0x2290: 0x400a9620, 0x2291: 0x400a9820, 0x2292: 0x400a9a20, 0x2293: 0x400a9c20, + 0x2294: 0x400a9e20, 0x2295: 0x400aa020, 0x2296: 0x400aa220, 0x2297: 0x400aa420, + 0x2298: 0x400aa620, 0x2299: 0x400aa820, 0x229a: 0x400aaa20, 0x229b: 0x400aac20, + 0x229c: 0x400aae20, 0x229d: 0x400ab020, 0x229e: 0x400ab220, 0x229f: 0x400ab420, + 0x22a0: 0xe000011f, 0x22a1: 0xe0000122, 0x22a2: 0xe0000131, 0x22a3: 0xe0000134, + 0x22a4: 0x400ab620, 0x22a5: 0x400ab820, 0x22a6: 0x400aba20, 0x22a7: 0x400abc20, + 0x22a8: 0x400abe20, 0x22a9: 0x400ac020, 0x22aa: 0xe0000143, 0x22ab: 0xe0000146, + 0x22ac: 0xe0000149, 0x22ad: 0xe000014c, 0x22ae: 0x400ac220, 0x22af: 0x400ac420, + 0x22b0: 0x400ac620, 0x22b1: 0x400ac820, 0x22b2: 0x400aca20, 0x22b3: 0x400acc20, + 0x22b4: 0x400ace20, 0x22b5: 0x400ad020, 0x22b6: 0x400ad220, 0x22b7: 0x400ad420, + 0x22b8: 0x400ad620, 0x22b9: 0x400ad820, 0x22ba: 0x400ada20, 0x22bb: 0x400adc20, + 0x22bc: 0x400ade20, 0x22bd: 0x400ae020, 0x22be: 0x400ae220, 0x22bf: 0x400ae420, + // Block 0x8b, offset 0x22c0 + 0x22c0: 0x400ae620, 0x22c1: 0x400ae820, 0x22c2: 0x400aea20, 0x22c3: 0x400aec20, + 0x22c4: 0x400aee20, 0x22c5: 0x400af020, 0x22c6: 0x400af220, 0x22c7: 0x400af420, + 0x22c8: 0x400af620, 0x22c9: 0x400af820, 0x22ca: 0x400afa20, 0x22cb: 0x400afc20, + 0x22cc: 0x400afe20, 0x22cd: 0x400b0020, 0x22ce: 0x400b0220, 0x22cf: 0x400b0420, + 0x22d0: 0x400b0620, 0x22d1: 0x400b0820, 0x22d2: 0x400b0a20, 0x22d3: 0x400b0c20, + 0x22d4: 0x400b0e20, 0x22d5: 0x400b1020, 0x22d6: 0x400b1220, 0x22d7: 0x400b1420, + 0x22d8: 0x400b1620, 0x22d9: 0x400b1820, 0x22da: 0x400b1a20, 0x22db: 0x400b1c20, + 0x22dc: 0x400b1e20, 0x22dd: 0x400b2020, 0x22de: 0x400b2220, 0x22df: 0x400b2420, + 0x22e0: 0x400b2620, 0x22e1: 0x400b2820, 0x22e2: 0x400b2a20, 0x22e3: 0x400b2c20, + 0x22e4: 0x400b2e20, 0x22e5: 0x400b3020, 0x22e6: 0x400b3220, 0x22e7: 0x400b3420, + 0x22e8: 0x400b3620, 0x22e9: 0x40049c20, 0x22ea: 0x40049e20, 0x22eb: 0x400b3820, + 0x22ec: 0x400b3a20, 0x22ed: 0x400b3c20, 0x22ee: 0x400b3e20, 0x22ef: 0x400b4020, + 0x22f0: 0x400b4220, 0x22f1: 0x400b4420, 0x22f2: 0x400b4620, 0x22f3: 0x400b4820, + 0x22f4: 0x400b4a20, 0x22f5: 0x400b4c20, 0x22f6: 0x400b4e20, 0x22f7: 0x400b5020, + 0x22f8: 0x400b5220, 0x22f9: 0x400b5420, 0x22fa: 0x400b5620, 0x22fb: 0x400b5820, + 0x22fc: 0x400b5a20, 0x22fd: 0x400b5c20, 0x22fe: 0x400b5e20, 0x22ff: 0x400b6020, + // Block 0x8c, offset 0x2300 + 0x2300: 0x400b6220, 0x2301: 0x400b6420, 0x2302: 0x400b6620, 0x2303: 0x400b6820, + 0x2304: 0x400b6a20, 0x2305: 0x400b6c20, 0x2306: 0x400b6e20, 0x2307: 0x400b7020, + 0x2308: 0x400b7220, 0x2309: 0x400b7420, 0x230a: 0x400b7620, 0x230b: 0x400b7820, + 0x230c: 0x400b7a20, 0x230d: 0x400b7c20, 0x230e: 0x400b7e20, 0x230f: 0x400b8020, + 0x2310: 0x400b8220, 0x2311: 0x400b8420, 0x2312: 0x400b8620, 0x2313: 0x400b8820, + 0x2314: 0x400b8a20, 0x2315: 0x400b8c20, 0x2316: 0x400b8e20, 0x2317: 0x400b9020, + 0x2318: 0x400b9220, 0x2319: 0x400b9420, 0x231a: 0x400b9620, 0x231b: 0x400b9820, + 0x231c: 0x400b9a20, 0x231d: 0x400b9c20, 0x231e: 0x400b9e20, 0x231f: 0x400ba020, + 0x2320: 0x400ba220, 0x2321: 0x400ba420, 0x2322: 0x400ba620, 0x2323: 0x400ba820, + 0x2324: 0x400baa20, 0x2325: 0x400bac20, 0x2326: 0x400bae20, 0x2327: 0x400bb020, + 0x2328: 0x400bb220, 0x2329: 0x400bb420, 0x232a: 0x400bb620, 0x232b: 0x400bb820, + 0x232c: 0x400bba20, 0x232d: 0x400bbc20, 0x232e: 0x400bbe20, 0x232f: 0x400bc020, + 0x2330: 0x400bc220, 0x2331: 0x400bc420, 0x2332: 0x400bc620, 0x2333: 0x400bc820, + 0x2334: 0x400bca20, 0x2335: 0x400bcc20, 0x2336: 0x400bce20, 0x2337: 0x400bd020, + 0x2338: 0x400bd220, 0x2339: 0x400bd420, 0x233a: 0x400bd620, 0x233b: 0x400bd820, + 0x233c: 0x400bda20, 0x233d: 0x400bdc20, 0x233e: 0x400bde20, 0x233f: 0x400be020, + // Block 0x8d, offset 0x2340 + 0x2340: 0x400be220, 0x2341: 0x400be420, 0x2342: 0x400be620, 0x2343: 0x400be820, + 0x2344: 0x400bea20, 0x2345: 0x400bec20, 0x2346: 0x400bee20, 0x2347: 0x400bf020, + 0x2348: 0x400bf220, 0x2349: 0x400bf420, 0x234a: 0x400bf620, 0x234b: 0x400bf820, + 0x234c: 0x400bfa20, 0x234d: 0x400bfc20, 0x234e: 0x400bfe20, 0x234f: 0x400c0020, + 0x2350: 0x400c0220, 0x2351: 0x400c0420, 0x2352: 0x400c0620, 0x2353: 0x400c0820, + 0x2354: 0x400c0a20, 0x2355: 0x400c0c20, 0x2356: 0x400c0e20, 0x2357: 0x400c1020, + 0x2358: 0x400c1220, 0x2359: 0x400c1420, 0x235a: 0x400c1620, 0x235b: 0x400c1820, + 0x235c: 0x400c1a20, 0x235d: 0x400c1c20, 0x235e: 0x400c1e20, 0x235f: 0x400c2020, + 0x2360: 0x400c2220, 0x2361: 0x400c2420, 0x2362: 0x400c2620, 0x2363: 0x400c2820, + 0x2364: 0x400c2a20, 0x2365: 0x400c2c20, 0x2366: 0x400c2e20, 0x2367: 0x400c3020, + 0x2368: 0x400c3220, 0x2369: 0x400c3420, 0x236a: 0x400c3620, 0x236b: 0x400c3820, + 0x236c: 0x400c3a20, 0x236d: 0x400c3c20, 0x236e: 0x400c3e20, 0x236f: 0x400c4020, + 0x2370: 0x400c4220, 0x2371: 0x400c4420, 0x2372: 0x400c4620, 0x2373: 0x400c4820, + 0x2374: 0x400c4a20, 0x2375: 0x400c4c20, 0x2376: 0x400c4e20, 0x2377: 0x400c5020, + 0x2378: 0x400c5220, 0x2379: 0x400c5420, 0x237a: 0x400c5620, 0x237b: 0x400c5820, + 0x237c: 0x400c5a20, 0x237d: 0x400c5c20, 0x237e: 0x400c5e20, 0x237f: 0x400c6020, + // Block 0x8e, offset 0x2380 + 0x2380: 0x400c6220, 0x2381: 0x400c6420, 0x2382: 0x400c6620, 0x2383: 0x400c6820, + 0x2384: 0x400c6a20, 0x2385: 0x400c6c20, 0x2386: 0x400c6e20, 0x2387: 0x400c7020, + 0x2388: 0x400c7220, 0x2389: 0x400c7420, 0x238a: 0x400c7620, 0x238b: 0x400c7820, + 0x238c: 0x400c7a20, 0x238d: 0x400c7c20, 0x238e: 0x400c7e20, 0x238f: 0x400c8020, + 0x2390: 0x400c8220, 0x2391: 0x400c8420, 0x2392: 0x400c8620, 0x2393: 0x400c8820, + 0x2394: 0x400c8a20, 0x2395: 0x400c8c20, 0x2396: 0x400c8e20, 0x2397: 0x400c9020, + 0x2398: 0x400c9220, 0x2399: 0x400c9420, 0x239a: 0x400c9620, 0x239b: 0x400c9820, + 0x239c: 0x400c9a20, 0x239d: 0x400c9c20, 0x239e: 0x400c9e20, 0x239f: 0x400ca020, + 0x23a0: 0x400ca220, 0x23a1: 0x400ca420, 0x23a2: 0x400ca620, 0x23a3: 0x400ca820, + 0x23a4: 0x400caa20, 0x23a5: 0x400cac20, 0x23a6: 0x400cae20, 0x23a7: 0x400cb020, + 0x23a8: 0x400cb220, 0x23a9: 0x400cb420, 0x23aa: 0x400cb620, 0x23ab: 0x400cb820, + 0x23ac: 0x400cba20, 0x23ad: 0x400cbc20, 0x23ae: 0x400cbe20, 0x23af: 0x400cc020, + 0x23b0: 0x400cc220, 0x23b1: 0x400cc420, 0x23b2: 0x400cc620, 0x23b3: 0x400cc820, + // Block 0x8f, offset 0x23c0 + 0x23c0: 0x400cca20, 0x23c1: 0x400ccc20, 0x23c2: 0x400cce20, 0x23c3: 0x400cd020, + 0x23c4: 0x400cd220, 0x23c5: 0x400cd420, 0x23c6: 0x400cd620, 0x23c7: 0x400cd820, + 0x23c8: 0x400cda20, 0x23c9: 0x400cdc20, 0x23ca: 0x400cde20, 0x23cb: 0x400ce020, + 0x23cc: 0x400ce220, 0x23cd: 0x400ce420, 0x23ce: 0x400ce620, 0x23cf: 0x400ce820, + 0x23d0: 0x400cea20, 0x23d1: 0x400cec20, 0x23d2: 0x400cee20, 0x23d3: 0x400cf020, + 0x23d4: 0x400cf220, 0x23d5: 0x400cf420, 0x23d6: 0x400cf620, 0x23d7: 0x400cf820, + 0x23d8: 0x400cfa20, 0x23d9: 0x400cfc20, 0x23da: 0x400cfe20, 0x23db: 0x400d0020, + 0x23dc: 0x400d0220, 0x23dd: 0x400d0420, 0x23de: 0x400d0620, 0x23df: 0x400d0820, + 0x23e0: 0x400d0a20, 0x23e1: 0x400d0c20, 0x23e2: 0x400d0e20, 0x23e3: 0x400d1020, + 0x23e4: 0x400d1220, 0x23e5: 0x400d1420, 0x23e6: 0x400d1620, + // Block 0x90, offset 0x2400 + 0x2400: 0x400d1820, 0x2401: 0x400d1a20, 0x2402: 0x400d1c20, 0x2403: 0x400d1e20, + 0x2404: 0x400d2020, 0x2405: 0x400d2220, 0x2406: 0x400d2420, 0x2407: 0x400d2620, + 0x2408: 0x400d2820, 0x2409: 0x400d2a20, 0x240a: 0x400d2c20, + 0x2420: 0x0029ce86, 0x2421: 0x0029d086, 0x2422: 0x0029d286, 0x2423: 0x0029d486, + 0x2424: 0x0029d686, 0x2425: 0x0029d886, 0x2426: 0x0029da86, 0x2427: 0x0029dc86, + 0x2428: 0x0029de86, 0x2429: 0xf0000606, 0x242a: 0xf0000606, 0x242b: 0xf0000606, + 0x242c: 0xf0000606, 0x242d: 0xf0000606, 0x242e: 0xf0000606, 0x242f: 0xf0000606, + 0x2430: 0xf0000606, 0x2431: 0xf0000606, 0x2432: 0xf0000606, 0x2433: 0xf0000606, + 0x2434: 0xf0000404, 0x2435: 0xf0000404, 0x2436: 0xf0000404, 0x2437: 0xf0000404, + 0x2438: 0xf0000404, 0x2439: 0xf0000404, 0x243a: 0xf0000404, 0x243b: 0xf0000404, + 0x243c: 0xf0000404, 0x243d: 0xe0000015, 0x243e: 0xe000001a, 0x243f: 0xe000001f, + // Block 0x91, offset 0x2440 + 0x2440: 0xe0000024, 0x2441: 0xe0000029, 0x2442: 0xe000002e, 0x2443: 0xe0000033, + 0x2444: 0xe0000038, 0x2445: 0xe000003d, 0x2446: 0xe0000042, 0x2447: 0xe0000047, + 0x2448: 0xf0001f04, 0x2449: 0xf0001f04, 0x244a: 0xf0001f04, 0x244b: 0xf0001f04, + 0x244c: 0xf0001f04, 0x244d: 0xf0001f04, 0x244e: 0xf0001f04, 0x244f: 0xf0001f04, + 0x2450: 0xf0001f04, 0x2451: 0xf0000404, 0x2452: 0xf0000404, 0x2453: 0xf0000404, + 0x2454: 0xf0000404, 0x2455: 0xf0000404, 0x2456: 0xf0000404, 0x2457: 0xf0000404, + 0x2458: 0xf0000404, 0x2459: 0xf0000404, 0x245a: 0xf0000404, 0x245b: 0xf0000404, + 0x245c: 0xf0000404, 0x245d: 0xf0000404, 0x245e: 0xf0000404, 0x245f: 0xf0000404, + 0x2460: 0xf0000404, 0x2461: 0xf0000404, 0x2462: 0xf0000404, 0x2463: 0xf0000404, + 0x2464: 0xf0000404, 0x2465: 0xf0000404, 0x2466: 0xf0000404, 0x2467: 0xf0000404, + 0x2468: 0xf0000404, 0x2469: 0xf0000404, 0x246a: 0xf0000404, 0x246b: 0xf0000404, + 0x246c: 0xf0000404, 0x246d: 0xf0000404, 0x246e: 0xf0000404, 0x246f: 0xf0000404, + 0x2470: 0xf0000404, 0x2471: 0xf0000404, 0x2472: 0xf0000404, 0x2473: 0xf0000404, + 0x2474: 0xf0000404, 0x2475: 0xf0000404, 0x2476: 0x002bde8c, 0x2477: 0x002c0a8c, + 0x2478: 0x002c3a8c, 0x2479: 0x002c628c, 0x247a: 0x002c988c, 0x247b: 0x002d088c, + 0x247c: 0x002d228c, 0x247d: 0x002d688c, 0x247e: 0x002d9a8c, 0x247f: 0x002dcc8c, + // Block 0x92, offset 0x2480 + 0x2480: 0x002dfe8c, 0x2481: 0x002e228c, 0x2482: 0x002e828c, 0x2483: 0x002e9e8c, + 0x2484: 0x002ee28c, 0x2485: 0x002f2c8c, 0x2486: 0x002f568c, 0x2487: 0x002f7a8c, + 0x2488: 0x002fe68c, 0x2489: 0x00302c8c, 0x248a: 0x00306c8c, 0x248b: 0x0030be8c, + 0x248c: 0x0030e28c, 0x248d: 0x0030f68c, 0x248e: 0x0031008c, 0x248f: 0x00312a8c, + 0x2490: 0x002bde86, 0x2491: 0x002c0a86, 0x2492: 0x002c3a86, 0x2493: 0x002c6286, + 0x2494: 0x002c9886, 0x2495: 0x002d0886, 0x2496: 0x002d2286, 0x2497: 0x002d6886, + 0x2498: 0x002d9a86, 0x2499: 0x002dcc86, 0x249a: 0x002dfe86, 0x249b: 0x002e2286, + 0x249c: 0x002e8286, 0x249d: 0x002e9e86, 0x249e: 0x002ee286, 0x249f: 0x002f2c86, + 0x24a0: 0x002f5686, 0x24a1: 0x002f7a86, 0x24a2: 0x002fe686, 0x24a3: 0x00302c86, + 0x24a4: 0x00306c86, 0x24a5: 0x0030be86, 0x24a6: 0x0030e286, 0x24a7: 0x0030f686, + 0x24a8: 0x00310086, 0x24a9: 0x00312a86, 0x24aa: 0x0029cc86, 0x24ab: 0xe00002e6, + 0x24ac: 0xe00002e9, 0x24ad: 0xe00002ec, 0x24ae: 0xe00002ef, 0x24af: 0xe00002f2, + 0x24b0: 0xe00002f5, 0x24b1: 0xe00002f8, 0x24b2: 0xe00002fb, 0x24b3: 0xe00002fe, + 0x24b4: 0xe00003d5, 0x24b5: 0x0029ce86, 0x24b6: 0x0029d086, 0x24b7: 0x0029d286, + 0x24b8: 0x0029d486, 0x24b9: 0x0029d686, 0x24ba: 0x0029d886, 0x24bb: 0x0029da86, + 0x24bc: 0x0029dc86, 0x24bd: 0x0029de86, 0x24be: 0xe00002d7, 0x24bf: 0x0029cc86, + // Block 0x93, offset 0x24c0 + 0x24c0: 0x400d2e20, 0x24c1: 0x400d3020, 0x24c2: 0x400d3220, 0x24c3: 0x400d3420, + 0x24c4: 0x400d3620, 0x24c5: 0x400d3820, 0x24c6: 0x400d3a20, 0x24c7: 0x400d3c20, + 0x24c8: 0x400d3e20, 0x24c9: 0x400d4020, 0x24ca: 0x400d4220, 0x24cb: 0x400d4420, + 0x24cc: 0x400d4620, 0x24cd: 0x400d4820, 0x24ce: 0x400d4a20, 0x24cf: 0x400d4c20, + 0x24d0: 0x400d4e20, 0x24d1: 0x400d5020, 0x24d2: 0x400d5220, 0x24d3: 0x400d5420, + 0x24d4: 0x400d5620, 0x24d5: 0x400d5820, 0x24d6: 0x400d5a20, 0x24d7: 0x400d5c20, + 0x24d8: 0x400d5e20, 0x24d9: 0x400d6020, 0x24da: 0x400d6220, 0x24db: 0x400d6420, + 0x24dc: 0x400d6620, 0x24dd: 0x400d6820, 0x24de: 0x400d6a20, 0x24df: 0x400d6c20, + 0x24e0: 0x400d6e20, 0x24e1: 0x400d7020, 0x24e2: 0x400d7220, 0x24e3: 0x400d7420, + 0x24e4: 0x400d7620, 0x24e5: 0x400d7820, 0x24e6: 0x400d7a20, 0x24e7: 0x400d7c20, + 0x24e8: 0x400d7e20, 0x24e9: 0x400d8020, 0x24ea: 0x400d8220, 0x24eb: 0x400d8420, + 0x24ec: 0x400d8620, 0x24ed: 0x400d8820, 0x24ee: 0x400d8a20, 0x24ef: 0x400d8c20, + 0x24f0: 0x400d8e20, 0x24f1: 0x400d9020, 0x24f2: 0x400d9220, 0x24f3: 0x400d9420, + 0x24f4: 0x400d9620, 0x24f5: 0x400d9820, 0x24f6: 0x400d9a20, 0x24f7: 0x400d9c20, + 0x24f8: 0x400d9e20, 0x24f9: 0x400da020, 0x24fa: 0x400da220, 0x24fb: 0x400da420, + 0x24fc: 0x400da620, 0x24fd: 0x400da820, 0x24fe: 0x400daa20, 0x24ff: 0x400dac20, + // Block 0x94, offset 0x2500 + 0x2500: 0x400dae20, 0x2501: 0x400db020, 0x2502: 0x400db220, 0x2503: 0x400db420, + 0x2504: 0x400db620, 0x2505: 0x400db820, 0x2506: 0x400dba20, 0x2507: 0x400dbc20, + 0x2508: 0x400dbe20, 0x2509: 0x400dc020, 0x250a: 0x400dc220, 0x250b: 0x400dc420, + 0x250c: 0x400dc620, 0x250d: 0x400dc820, 0x250e: 0x400dca20, 0x250f: 0x400dcc20, + 0x2510: 0x400dce20, 0x2511: 0x400dd020, 0x2512: 0x400dd220, 0x2513: 0x400dd420, + 0x2514: 0x400dd620, 0x2515: 0x400dd820, 0x2516: 0x400dda20, 0x2517: 0x400ddc20, + 0x2518: 0x400dde20, 0x2519: 0x400de020, 0x251a: 0x400de220, 0x251b: 0x400de420, + 0x251c: 0x400de620, 0x251d: 0x400de820, 0x251e: 0x400dea20, 0x251f: 0x400dec20, + 0x2520: 0x400dee20, 0x2521: 0x400df020, 0x2522: 0x400df220, 0x2523: 0x400df420, + 0x2524: 0x400df620, 0x2525: 0x400df820, 0x2526: 0x400dfa20, 0x2527: 0x400dfc20, + 0x2528: 0x400dfe20, 0x2529: 0x400e0020, 0x252a: 0x400e0220, 0x252b: 0x400e0420, + 0x252c: 0x400e0620, 0x252d: 0x400e0820, 0x252e: 0x400e0a20, 0x252f: 0x400e0c20, + 0x2530: 0x400e0e20, 0x2531: 0x400e1020, 0x2532: 0x400e1220, 0x2533: 0x400e1420, + 0x2534: 0x400e1620, 0x2535: 0x400e1820, 0x2536: 0x400e1a20, 0x2537: 0x400e1c20, + 0x2538: 0x400e1e20, 0x2539: 0x400e2020, 0x253a: 0x400e2220, 0x253b: 0x400e2420, + 0x253c: 0x400e2620, 0x253d: 0x400e2820, 0x253e: 0x400e2a20, 0x253f: 0x400e2c20, + // Block 0x95, offset 0x2540 + 0x2540: 0x400e2e20, 0x2541: 0x400e3020, 0x2542: 0x400e3220, 0x2543: 0x400e3420, + 0x2544: 0x400e3620, 0x2545: 0x400e3820, 0x2546: 0x400e3a20, 0x2547: 0x400e3c20, + 0x2548: 0x400e3e20, 0x2549: 0x400e4020, 0x254a: 0x400e4220, 0x254b: 0x400e4420, + 0x254c: 0x400e4620, 0x254d: 0x400e4820, 0x254e: 0x400e4a20, 0x254f: 0x400e4c20, + 0x2550: 0x400e4e20, 0x2551: 0x400e5020, 0x2552: 0x400e5220, 0x2553: 0x400e5420, + 0x2554: 0x400e5620, 0x2555: 0x400e5820, 0x2556: 0x400e5a20, 0x2557: 0x400e5c20, + 0x2558: 0x400e5e20, 0x2559: 0x400e6020, 0x255a: 0x400e6220, 0x255b: 0x400e6420, + 0x255c: 0x400e6620, 0x255d: 0x400e6820, 0x255e: 0x400e6a20, 0x255f: 0x400e6c20, + 0x2560: 0x400e6e20, 0x2561: 0x400e7020, 0x2562: 0x400e7220, 0x2563: 0x400e7420, + 0x2564: 0x400e7620, 0x2565: 0x400e7820, 0x2566: 0x400e7a20, 0x2567: 0x400e7c20, + 0x2568: 0x400e7e20, 0x2569: 0x400e8020, 0x256a: 0x400e8220, 0x256b: 0x400e8420, + 0x256c: 0x400e8620, 0x256d: 0x400e8820, 0x256e: 0x400e8a20, 0x256f: 0x400e8c20, + 0x2570: 0x400e8e20, 0x2571: 0x400e9020, 0x2572: 0x400e9220, 0x2573: 0x400e9420, + 0x2574: 0x400e9620, 0x2575: 0x400e9820, 0x2576: 0x400e9a20, 0x2577: 0x400e9c20, + 0x2578: 0x400e9e20, 0x2579: 0x400ea020, 0x257a: 0x400ea220, 0x257b: 0x400ea420, + 0x257c: 0x400ea620, 0x257d: 0x400ea820, 0x257e: 0x400eaa20, 0x257f: 0x400eac20, + // Block 0x96, offset 0x2580 + 0x2580: 0x400eae20, 0x2581: 0x400eb020, 0x2582: 0x400eb220, 0x2583: 0x400eb420, + 0x2584: 0x400eb620, 0x2585: 0x400eb820, 0x2586: 0x400eba20, 0x2587: 0x400ebc20, + 0x2588: 0x400ebe20, 0x2589: 0x400ec020, 0x258a: 0x400ec220, 0x258b: 0x400ec420, + 0x258c: 0x400ec620, 0x258d: 0x400ec820, 0x258e: 0x400eca20, 0x258f: 0x400ecc20, + 0x2590: 0x400ece20, 0x2591: 0x400ed020, 0x2592: 0x400ed220, 0x2593: 0x400ed420, + 0x2594: 0x400ed620, 0x2595: 0x400ed820, 0x2596: 0x400eda20, 0x2597: 0x400edc20, + 0x2598: 0x400ede20, 0x2599: 0x400ee020, 0x259a: 0x400ee220, 0x259b: 0x400ee420, + 0x259c: 0x400ee620, 0x259d: 0x400ee820, 0x259e: 0x400eea20, 0x259f: 0x400eec20, + 0x25a0: 0x400eee20, 0x25a1: 0x400ef020, 0x25a2: 0x400ef220, 0x25a3: 0x400ef420, + 0x25a4: 0x400ef620, 0x25a5: 0x400ef820, 0x25a6: 0x400efa20, 0x25a7: 0x400efc20, + 0x25a8: 0x400efe20, 0x25a9: 0x400f0020, 0x25aa: 0x400f0220, 0x25ab: 0x400f0420, + 0x25ac: 0x400f0620, 0x25ad: 0x400f0820, 0x25ae: 0x400f0a20, 0x25af: 0x400f0c20, + 0x25b0: 0x400f0e20, 0x25b1: 0x400f1020, 0x25b2: 0x400f1220, 0x25b3: 0x400f1420, + 0x25b4: 0x400f1620, 0x25b5: 0x400f1820, 0x25b6: 0x400f1a20, 0x25b7: 0x400f1c20, + 0x25b8: 0x400f1e20, 0x25b9: 0x400f2020, 0x25ba: 0x400f2220, 0x25bb: 0x400f2420, + 0x25bc: 0x400f2620, 0x25bd: 0x400f2820, 0x25be: 0x400f2a20, 0x25bf: 0x400f2c20, + // Block 0x97, offset 0x25c0 + 0x25c0: 0x400f2e20, 0x25c1: 0x400f3020, 0x25c2: 0x400f3220, 0x25c3: 0x400f3420, + 0x25c4: 0x400f3620, 0x25c5: 0x400f3820, 0x25c6: 0x400f3a20, 0x25c7: 0x400f3c20, + 0x25c8: 0x400f3e20, 0x25c9: 0x400f4020, 0x25ca: 0x400f4220, 0x25cb: 0x400f4420, + 0x25cc: 0x400f4620, 0x25cd: 0x400f4820, 0x25ce: 0x400f4a20, 0x25cf: 0x400f4c20, + 0x25d0: 0x400f4e20, 0x25d1: 0x400f5020, 0x25d2: 0x400f5220, 0x25d3: 0x400f5420, + 0x25d4: 0x400f5620, 0x25d5: 0x400f5820, 0x25d6: 0x400f5a20, 0x25d7: 0x400f5c20, + 0x25d8: 0x400f5e20, 0x25d9: 0x400f6020, 0x25da: 0x400f6220, 0x25db: 0x400f6420, + 0x25dc: 0x400f6620, 0x25dd: 0x400f6820, 0x25de: 0x400f6a20, 0x25df: 0x400f6c20, + 0x25e0: 0x400f6e20, 0x25e1: 0x400f7020, 0x25e2: 0x400f7220, 0x25e3: 0x400f7420, + 0x25e4: 0x400f7620, 0x25e5: 0x400f7820, 0x25e6: 0x400f7a20, 0x25e7: 0x400f7c20, + 0x25e8: 0x400f7e20, 0x25e9: 0x400f8020, 0x25ea: 0x400f8220, 0x25eb: 0x400f8420, + 0x25ec: 0x400f8620, 0x25ed: 0x400f8820, 0x25ee: 0x400f8a20, 0x25ef: 0x400f8c20, + 0x25f0: 0x40195220, 0x25f1: 0x40195420, 0x25f2: 0x40195620, 0x25f3: 0x40195820, + 0x25f4: 0x40195a20, 0x25f5: 0x40195c20, 0x25f6: 0x40195e20, 0x25f7: 0x40196020, + 0x25f8: 0x400f8e20, 0x25f9: 0x400f9020, 0x25fa: 0x400f9220, 0x25fb: 0x400f9420, + 0x25fc: 0x400f9620, 0x25fd: 0x400f9820, 0x25fe: 0x400f9a20, 0x25ff: 0x400f9c20, + // Block 0x98, offset 0x2600 + 0x2600: 0x400f9e20, 0x2601: 0x400fa020, 0x2602: 0x400fa220, 0x2603: 0x400fa420, + 0x2604: 0x400fa620, 0x2605: 0x400fa820, 0x2606: 0x400faa20, 0x2607: 0x400fac20, + 0x2608: 0x400fae20, 0x2609: 0x400fb020, 0x260a: 0x400fb220, 0x260b: 0x400fb420, + 0x260c: 0x400fb620, 0x260d: 0x400fb820, 0x260e: 0x400fba20, 0x260f: 0x400fbc20, + 0x2610: 0x400fbe20, 0x2611: 0x400fc020, 0x2612: 0x400fc220, 0x2613: 0x400fc420, + 0x2614: 0x400fc620, 0x2615: 0x400fc820, 0x2616: 0x400fca20, 0x2617: 0x400fcc20, + 0x2618: 0x400fce20, 0x2619: 0x400fd020, 0x261a: 0x400fd220, 0x261b: 0x400fd420, + 0x261c: 0x400fd620, 0x261d: 0x400fd820, 0x261e: 0x400fda20, 0x261f: 0x400fdc20, + 0x2620: 0x400fde20, 0x2621: 0x400fe020, 0x2622: 0x400fe220, 0x2623: 0x400fe420, + 0x2624: 0x400fe620, 0x2625: 0x400fe820, 0x2626: 0x400fea20, 0x2627: 0x400fec20, + 0x2628: 0x400fee20, 0x2629: 0x400ff020, 0x262a: 0x400ff220, 0x262b: 0x400ff420, + 0x262c: 0x400ff620, 0x262d: 0x401dde20, 0x262e: 0x401de020, 0x262f: 0x401de220, + 0x2630: 0x400ff820, 0x2631: 0x400ffa20, 0x2632: 0x400ffc20, 0x2633: 0x400ffe20, + 0x2634: 0x40100020, 0x2635: 0x40100220, 0x2636: 0x40100420, 0x2637: 0x40100620, + 0x2638: 0x40100820, 0x2639: 0x40100a20, 0x263a: 0x40100c20, 0x263b: 0x40100e20, + 0x263c: 0x40101020, 0x263d: 0x40101220, 0x263e: 0x40101420, 0x263f: 0x40101620, + // Block 0x99, offset 0x2640 + 0x2640: 0x40101820, 0x2641: 0x40101a20, 0x2642: 0x40101c20, 0x2643: 0x40101e20, + 0x2644: 0x40102020, 0x2645: 0x40102220, 0x2646: 0x40102420, 0x2647: 0x40102620, + 0x2648: 0x40102820, 0x2649: 0x40102a20, 0x264a: 0x40194620, 0x264b: 0x40194820, + 0x264c: 0x40194a20, 0x264d: 0x40194c20, 0x264e: 0x40194e20, 0x264f: 0x40195020, + 0x2650: 0x40102c20, 0x2651: 0x40102e20, 0x2652: 0x40103020, 0x2653: 0x40103220, + 0x2654: 0x40103420, 0x2655: 0x40103620, 0x2656: 0x40103820, 0x2657: 0x40103a20, + 0x2658: 0x40103c20, 0x2659: 0x40103e20, 0x265a: 0x40104020, 0x265b: 0x40104220, + 0x265c: 0x40104420, 0x265d: 0x40104620, 0x265e: 0x40104820, 0x265f: 0x40104a20, + 0x2660: 0x40104c20, 0x2661: 0x40104e20, 0x2662: 0x40105020, 0x2663: 0x40105220, + 0x2664: 0x40105420, 0x2665: 0x40105620, 0x2666: 0x40105820, 0x2667: 0x40105a20, + 0x2668: 0x40105c20, 0x2669: 0x40105e20, 0x266a: 0x40106020, 0x266b: 0x40106220, + 0x266c: 0x40106420, 0x266d: 0x40106620, 0x266e: 0x40106820, 0x266f: 0x40106a20, + 0x2670: 0x40106c20, 0x2671: 0x40106e20, 0x2672: 0x40107020, 0x2673: 0x40107220, + 0x2674: 0x40107420, 0x2675: 0x40107620, 0x2676: 0x40107820, 0x2677: 0x40107a20, + 0x2678: 0x40107c20, 0x2679: 0x40107e20, 0x267a: 0x40108020, 0x267b: 0x40108220, + 0x267c: 0x40108420, 0x267d: 0x40108620, 0x267e: 0x40108820, 0x267f: 0x40108a20, + // Block 0x9a, offset 0x2680 + 0x2680: 0x40108c20, 0x2681: 0x40108e20, 0x2682: 0x40109020, 0x2683: 0x40109220, + 0x2684: 0x40109420, 0x2685: 0x40109620, 0x2686: 0x40109820, 0x2687: 0x40109a20, + 0x2688: 0x40109c20, 0x2689: 0x40109e20, 0x268a: 0x4010a020, 0x268b: 0x4010a220, + 0x268c: 0x4010a420, 0x268d: 0x4010a620, 0x268e: 0x4010a820, 0x268f: 0x4010aa20, + 0x2690: 0x4010ac20, 0x2691: 0x4010ae20, 0x2692: 0x4010b020, 0x2693: 0x4010b220, + 0x2694: 0x4010b420, 0x2695: 0x4010b620, 0x2696: 0x4010b820, 0x2697: 0x4010ba20, + 0x2698: 0x4010bc20, 0x2699: 0x4010be20, 0x269a: 0x4010c020, 0x269b: 0x4010c220, + 0x269c: 0x4010c420, 0x269d: 0x4010c620, 0x269e: 0x4010c820, 0x269f: 0x4010ca20, + 0x26a0: 0x4010cc20, 0x26a1: 0x4010ce20, 0x26a2: 0x4010d020, 0x26a3: 0x4010d220, + 0x26a4: 0x4010d420, 0x26a5: 0x4010d620, 0x26a6: 0x4010d820, 0x26a7: 0x4010da20, + 0x26a8: 0x4010dc20, 0x26a9: 0x4010de20, 0x26aa: 0x4010e020, 0x26ab: 0x4010e220, + 0x26ac: 0x4010e420, 0x26ad: 0x4010e620, 0x26ae: 0x4010e820, 0x26af: 0x4010ea20, + 0x26b0: 0x4010ec20, 0x26b1: 0x4010ee20, 0x26b2: 0x4010f020, 0x26b3: 0x4010f220, + 0x26b4: 0x4010f420, 0x26b5: 0x4010f620, 0x26b6: 0x4010f820, 0x26b7: 0x4010fa20, + 0x26b8: 0x4010fc20, 0x26b9: 0x4010fe20, 0x26ba: 0x40110020, 0x26bb: 0x40110220, + 0x26bc: 0x40110420, 0x26bd: 0x40110620, 0x26be: 0x40110820, 0x26bf: 0x40110a20, + // Block 0x9b, offset 0x26c0 + 0x26c1: 0x40114020, 0x26c2: 0x40114220, 0x26c3: 0x40114420, + 0x26c4: 0x40114620, 0x26c5: 0x40114820, 0x26c6: 0x40114a20, 0x26c7: 0x40114c20, + 0x26c8: 0x40114e20, 0x26c9: 0x40115020, 0x26ca: 0x40115220, 0x26cb: 0x40115420, + 0x26cc: 0x40115620, 0x26cd: 0x40115820, 0x26ce: 0x40115a20, 0x26cf: 0x40115c20, + 0x26d0: 0x40115e20, 0x26d1: 0x40116020, 0x26d2: 0x40116220, 0x26d3: 0x40116420, + 0x26d4: 0x40116620, 0x26d5: 0x40116820, 0x26d6: 0x40116a20, 0x26d7: 0x40116c20, + 0x26d8: 0x40116e20, 0x26d9: 0x40117020, 0x26da: 0x40117220, 0x26db: 0x40117420, + 0x26dc: 0x40117620, 0x26dd: 0x40117820, 0x26de: 0x40117a20, 0x26df: 0x40117c20, + 0x26e0: 0x40117e20, 0x26e1: 0x40118020, 0x26e2: 0x40118220, 0x26e3: 0x40118420, + 0x26e4: 0x40118620, 0x26e5: 0x40118820, 0x26e6: 0x40118a20, 0x26e7: 0x40118c20, + 0x26e8: 0x40118e20, 0x26e9: 0x40119020, 0x26ea: 0x40119220, 0x26eb: 0x40119420, + 0x26ec: 0x40119620, 0x26ed: 0x40119820, 0x26ee: 0x40119a20, 0x26ef: 0x40119c20, + 0x26f0: 0x40119e20, 0x26f1: 0x4011a020, 0x26f2: 0x4011a220, 0x26f3: 0x4011a420, + 0x26f4: 0x4011a620, 0x26f5: 0x4011a820, 0x26f6: 0x4011aa20, 0x26f7: 0x4011ac20, + 0x26f8: 0x4011ae20, 0x26f9: 0x4011b020, 0x26fa: 0x4011b220, 0x26fb: 0x4011b420, + 0x26fc: 0x4011b620, 0x26fd: 0x4011b820, 0x26fe: 0x4011ba20, 0x26ff: 0x4011bc20, + // Block 0x9c, offset 0x2700 + 0x2700: 0x4011be20, 0x2701: 0x4011c020, 0x2702: 0x4011c220, 0x2703: 0x4011c420, + 0x2704: 0x4011c620, 0x2705: 0x4011c820, 0x2706: 0x4011ca20, 0x2707: 0x4011cc20, + 0x2708: 0x4011ce20, 0x2709: 0x4011d020, 0x270a: 0x4011d220, 0x270b: 0x4011d420, + 0x270c: 0x4011d620, 0x270d: 0x4011d820, 0x270e: 0x4011da20, 0x270f: 0x4011dc20, + 0x2710: 0x4011de20, 0x2711: 0x4011e020, 0x2712: 0x4011e220, 0x2713: 0x4011e420, + 0x2714: 0x4011e620, 0x2715: 0x4011e820, 0x2716: 0x4011ea20, 0x2717: 0x4011ec20, + 0x2718: 0x4011ee20, 0x2719: 0x4011f020, 0x271a: 0x4011f220, 0x271b: 0x4011f420, + 0x271c: 0x4011f620, 0x271d: 0x4011f820, 0x271e: 0x4011fa20, 0x271f: 0x4011fc20, + 0x2720: 0x4011fe20, 0x2721: 0x40120020, 0x2722: 0x40120220, 0x2723: 0x40120420, + 0x2724: 0x40120620, 0x2725: 0x40120820, 0x2726: 0x40120a20, 0x2727: 0x40120c20, + 0x2728: 0x40045820, 0x2729: 0x40045a20, 0x272a: 0x40045c20, 0x272b: 0x40045e20, + 0x272c: 0x40046020, 0x272d: 0x40046220, 0x272e: 0x40046420, 0x272f: 0x40046620, + 0x2730: 0x40046820, 0x2731: 0x40046a20, 0x2732: 0x40046c20, 0x2733: 0x40046e20, + 0x2734: 0x40047020, 0x2735: 0x40047220, 0x2736: 0x0029ce86, 0x2737: 0x0029d086, + 0x2738: 0x0029d286, 0x2739: 0x0029d486, 0x273a: 0x0029d686, 0x273b: 0x0029d886, + 0x273c: 0x0029da86, 0x273d: 0x0029dc86, 0x273e: 0x0029de86, 0x273f: 0xe00002da, + // Block 0x9d, offset 0x2740 + 0x2740: 0x0029ce86, 0x2741: 0x0029d086, 0x2742: 0x0029d286, 0x2743: 0x0029d486, + 0x2744: 0x0029d686, 0x2745: 0x0029d886, 0x2746: 0x0029da86, 0x2747: 0x0029dc86, + 0x2748: 0x0029de86, 0x2749: 0xe00002dd, 0x274a: 0x0029ce86, 0x274b: 0x0029d086, + 0x274c: 0x0029d286, 0x274d: 0x0029d486, 0x274e: 0x0029d686, 0x274f: 0x0029d886, + 0x2750: 0x0029da86, 0x2751: 0x0029dc86, 0x2752: 0x0029de86, 0x2753: 0xe00002e0, + 0x2754: 0x40120e20, 0x2755: 0x40121020, 0x2756: 0x40121220, 0x2757: 0x40121420, + 0x2758: 0x40121620, 0x2759: 0x40121820, 0x275a: 0x40121a20, 0x275b: 0x40121c20, + 0x275c: 0x40121e20, 0x275d: 0x40122020, 0x275e: 0x40122220, 0x275f: 0x40122420, + 0x2760: 0x40122620, 0x2761: 0x40122820, 0x2762: 0x40122a20, 0x2763: 0x40122c20, + 0x2764: 0x40122e20, 0x2765: 0x40123020, 0x2766: 0x40123220, 0x2767: 0x40123420, + 0x2768: 0x40123620, 0x2769: 0x40123820, 0x276a: 0x40123a20, 0x276b: 0x40123c20, + 0x276c: 0x40123e20, 0x276d: 0x40124020, 0x276e: 0x40124220, 0x276f: 0x40124420, + 0x2770: 0x40124620, 0x2771: 0x40124820, 0x2772: 0x40124a20, 0x2773: 0x40124c20, + 0x2774: 0x40124e20, 0x2775: 0x40125020, 0x2776: 0x40125220, 0x2777: 0x40125420, + 0x2778: 0x40125620, 0x2779: 0x40125820, 0x277a: 0x40125a20, 0x277b: 0x40125c20, + 0x277c: 0x40125e20, 0x277d: 0x40126020, 0x277e: 0x40126220, 0x277f: 0x40126420, + // Block 0x9e, offset 0x2780 + 0x2780: 0x40126620, 0x2781: 0x40126820, 0x2782: 0x40126a20, 0x2783: 0x40126c20, + 0x2784: 0x40126e20, 0x2785: 0x40044020, 0x2786: 0x40044220, 0x2787: 0x40127020, + 0x2788: 0x40127220, 0x2789: 0x40127420, 0x278a: 0x40127620, 0x278b: 0x40127820, + 0x278c: 0x40127a20, 0x278d: 0x40127c20, 0x278e: 0x40127e20, 0x278f: 0x40128020, + 0x2790: 0x40128220, 0x2791: 0x40128420, 0x2792: 0x40128620, 0x2793: 0x40128820, + 0x2794: 0x40128a20, 0x2795: 0x40128c20, 0x2796: 0x40128e20, 0x2797: 0x40129020, + 0x2798: 0x40129220, 0x2799: 0x40129420, 0x279a: 0x40129620, 0x279b: 0x40129820, + 0x279c: 0x40129a20, 0x279d: 0x40129c20, 0x279e: 0x40129e20, 0x279f: 0x4012a020, + 0x27a0: 0x4012a220, 0x27a1: 0x4012a420, 0x27a2: 0x4012a620, 0x27a3: 0x4012a820, + 0x27a4: 0x4012aa20, 0x27a5: 0x4012ac20, 0x27a6: 0x40044420, 0x27a7: 0x40044620, + 0x27a8: 0x40044820, 0x27a9: 0x40044a20, 0x27aa: 0x40044c20, 0x27ab: 0x40044e20, + 0x27ac: 0x40045020, 0x27ad: 0x40045220, 0x27ae: 0x40045420, 0x27af: 0x40045620, + 0x27b0: 0x4012ae20, 0x27b1: 0x4012b020, 0x27b2: 0x4012b220, 0x27b3: 0x4012b420, + 0x27b4: 0x4012b620, 0x27b5: 0x4012b820, 0x27b6: 0x4012ba20, 0x27b7: 0x4012bc20, + 0x27b8: 0x4012be20, 0x27b9: 0x4012c020, 0x27ba: 0x4012c220, 0x27bb: 0x4012c420, + 0x27bc: 0x4012c620, 0x27bd: 0x4012c820, 0x27be: 0x4012ca20, 0x27bf: 0x4012cc20, + // Block 0x9f, offset 0x27c0 + 0x27c0: 0x40174620, 0x27c1: 0x40174820, 0x27c2: 0x40174a20, 0x27c3: 0x40174c20, + 0x27c4: 0x40174e20, 0x27c5: 0x40175020, 0x27c6: 0x40175220, 0x27c7: 0x40175420, + 0x27c8: 0x40175620, 0x27c9: 0x40175820, 0x27ca: 0x40175a20, 0x27cb: 0x40175c20, + 0x27cc: 0x40175e20, 0x27cd: 0x40176020, 0x27ce: 0x40176220, 0x27cf: 0x40176420, + 0x27d0: 0x40176620, 0x27d1: 0x40176820, 0x27d2: 0x40176a20, 0x27d3: 0x40176c20, + 0x27d4: 0x40176e20, 0x27d5: 0x40177020, 0x27d6: 0x40177220, 0x27d7: 0x40177420, + 0x27d8: 0x40177620, 0x27d9: 0x40177820, 0x27da: 0x40177a20, 0x27db: 0x40177c20, + 0x27dc: 0x40177e20, 0x27dd: 0x40178020, 0x27de: 0x40178220, 0x27df: 0x40178420, + 0x27e0: 0x40178620, 0x27e1: 0x40178820, 0x27e2: 0x40178a20, 0x27e3: 0x40178c20, + 0x27e4: 0x40178e20, 0x27e5: 0x40179020, 0x27e6: 0x40179220, 0x27e7: 0x40179420, + 0x27e8: 0x40179620, 0x27e9: 0x40179820, 0x27ea: 0x40179a20, 0x27eb: 0x40179c20, + 0x27ec: 0x40179e20, 0x27ed: 0x4017a020, 0x27ee: 0x4017a220, 0x27ef: 0x4017a420, + 0x27f0: 0x4017a620, 0x27f1: 0x4017a820, 0x27f2: 0x4017aa20, 0x27f3: 0x4017ac20, + 0x27f4: 0x4017ae20, 0x27f5: 0x4017b020, 0x27f6: 0x4017b220, 0x27f7: 0x4017b420, + 0x27f8: 0x4017b620, 0x27f9: 0x4017b820, 0x27fa: 0x4017ba20, 0x27fb: 0x4017bc20, + 0x27fc: 0x4017be20, 0x27fd: 0x4017c020, 0x27fe: 0x4017c220, 0x27ff: 0x4017c420, + // Block 0xa0, offset 0x2800 + 0x2800: 0x4017c620, 0x2801: 0x4017c820, 0x2802: 0x4017ca20, 0x2803: 0x4017cc20, + 0x2804: 0x4017ce20, 0x2805: 0x4017d020, 0x2806: 0x4017d220, 0x2807: 0x4017d420, + 0x2808: 0x4017d620, 0x2809: 0x4017d820, 0x280a: 0x4017da20, 0x280b: 0x4017dc20, + 0x280c: 0x4017de20, 0x280d: 0x4017e020, 0x280e: 0x4017e220, 0x280f: 0x4017e420, + 0x2810: 0x4017e620, 0x2811: 0x4017e820, 0x2812: 0x4017ea20, 0x2813: 0x4017ec20, + 0x2814: 0x4017ee20, 0x2815: 0x4017f020, 0x2816: 0x4017f220, 0x2817: 0x4017f420, + 0x2818: 0x4017f620, 0x2819: 0x4017f820, 0x281a: 0x4017fa20, 0x281b: 0x4017fc20, + 0x281c: 0x4017fe20, 0x281d: 0x40180020, 0x281e: 0x40180220, 0x281f: 0x40180420, + 0x2820: 0x40180620, 0x2821: 0x40180820, 0x2822: 0x40180a20, 0x2823: 0x40180c20, + 0x2824: 0x40180e20, 0x2825: 0x40181020, 0x2826: 0x40181220, 0x2827: 0x40181420, + 0x2828: 0x40181620, 0x2829: 0x40181820, 0x282a: 0x40181a20, 0x282b: 0x40181c20, + 0x282c: 0x40181e20, 0x282d: 0x40182020, 0x282e: 0x40182220, 0x282f: 0x40182420, + 0x2830: 0x40182620, 0x2831: 0x40182820, 0x2832: 0x40182a20, 0x2833: 0x40182c20, + 0x2834: 0x40182e20, 0x2835: 0x40183020, 0x2836: 0x40183220, 0x2837: 0x40183420, + 0x2838: 0x40183620, 0x2839: 0x40183820, 0x283a: 0x40183a20, 0x283b: 0x40183c20, + 0x283c: 0x40183e20, 0x283d: 0x40184020, 0x283e: 0x40184220, 0x283f: 0x40184420, + // Block 0xa1, offset 0x2840 + 0x2840: 0x40184620, 0x2841: 0x40184820, 0x2842: 0x40184a20, 0x2843: 0x40184c20, + 0x2844: 0x40184e20, 0x2845: 0x40185020, 0x2846: 0x40185220, 0x2847: 0x40185420, + 0x2848: 0x40185620, 0x2849: 0x40185820, 0x284a: 0x40185a20, 0x284b: 0x40185c20, + 0x284c: 0x40185e20, 0x284d: 0x40186020, 0x284e: 0x40186220, 0x284f: 0x40186420, + 0x2850: 0x40186620, 0x2851: 0x40186820, 0x2852: 0x40186a20, 0x2853: 0x40186c20, + 0x2854: 0x40186e20, 0x2855: 0x40187020, 0x2856: 0x40187220, 0x2857: 0x40187420, + 0x2858: 0x40187620, 0x2859: 0x40187820, 0x285a: 0x40187a20, 0x285b: 0x40187c20, + 0x285c: 0x40187e20, 0x285d: 0x40188020, 0x285e: 0x40188220, 0x285f: 0x40188420, + 0x2860: 0x40188620, 0x2861: 0x40188820, 0x2862: 0x40188a20, 0x2863: 0x40188c20, + 0x2864: 0x40188e20, 0x2865: 0x40189020, 0x2866: 0x40189220, 0x2867: 0x40189420, + 0x2868: 0x40189620, 0x2869: 0x40189820, 0x286a: 0x40189a20, 0x286b: 0x40189c20, + 0x286c: 0x40189e20, 0x286d: 0x4018a020, 0x286e: 0x4018a220, 0x286f: 0x4018a420, + 0x2870: 0x4018a620, 0x2871: 0x4018a820, 0x2872: 0x4018aa20, 0x2873: 0x4018ac20, + 0x2874: 0x4018ae20, 0x2875: 0x4018b020, 0x2876: 0x4018b220, 0x2877: 0x4018b420, + 0x2878: 0x4018b620, 0x2879: 0x4018b820, 0x287a: 0x4018ba20, 0x287b: 0x4018bc20, + 0x287c: 0x4018be20, 0x287d: 0x4018c020, 0x287e: 0x4018c220, 0x287f: 0x4018c420, + // Block 0xa2, offset 0x2880 + 0x2880: 0x4018c620, 0x2881: 0x4018c820, 0x2882: 0x4018ca20, 0x2883: 0x4018cc20, + 0x2884: 0x4018ce20, 0x2885: 0x4018d020, 0x2886: 0x4018d220, 0x2887: 0x4018d420, + 0x2888: 0x4018d620, 0x2889: 0x4018d820, 0x288a: 0x4018da20, 0x288b: 0x4018dc20, + 0x288c: 0x4018de20, 0x288d: 0x4018e020, 0x288e: 0x4018e220, 0x288f: 0x4018e420, + 0x2890: 0x4018e620, 0x2891: 0x4018e820, 0x2892: 0x4018ea20, 0x2893: 0x4018ec20, + 0x2894: 0x4018ee20, 0x2895: 0x4018f020, 0x2896: 0x4018f220, 0x2897: 0x4018f420, + 0x2898: 0x4018f620, 0x2899: 0x4018f820, 0x289a: 0x4018fa20, 0x289b: 0x4018fc20, + 0x289c: 0x4018fe20, 0x289d: 0x40190020, 0x289e: 0x40190220, 0x289f: 0x40190420, + 0x28a0: 0x40190620, 0x28a1: 0x40190820, 0x28a2: 0x40190a20, 0x28a3: 0x40190c20, + 0x28a4: 0x40190e20, 0x28a5: 0x40191020, 0x28a6: 0x40191220, 0x28a7: 0x40191420, + 0x28a8: 0x40191620, 0x28a9: 0x40191820, 0x28aa: 0x40191a20, 0x28ab: 0x40191c20, + 0x28ac: 0x40191e20, 0x28ad: 0x40192020, 0x28ae: 0x40192220, 0x28af: 0x40192420, + 0x28b0: 0x40192620, 0x28b1: 0x40192820, 0x28b2: 0x40192a20, 0x28b3: 0x40192c20, + 0x28b4: 0x40192e20, 0x28b5: 0x40193020, 0x28b6: 0x40193220, 0x28b7: 0x40193420, + 0x28b8: 0x40193620, 0x28b9: 0x40193820, 0x28ba: 0x40193a20, 0x28bb: 0x40193c20, + 0x28bc: 0x40193e20, 0x28bd: 0x40194020, 0x28be: 0x40194220, 0x28bf: 0x40194420, + // Block 0xa3, offset 0x28c0 + 0x28c0: 0x4012ce20, 0x28c1: 0x4012d020, 0x28c2: 0x4012d220, 0x28c3: 0x4012d420, + 0x28c4: 0x4012d620, 0x28c5: 0x4012d820, 0x28c6: 0x4012da20, 0x28c7: 0x4012dc20, + 0x28c8: 0x4012de20, 0x28c9: 0x4012e020, 0x28ca: 0x4012e220, 0x28cb: 0x4012e420, + 0x28cc: 0x4012e620, 0x28cd: 0x4012e820, 0x28ce: 0x4012ea20, 0x28cf: 0x4012ec20, + 0x28d0: 0x4012ee20, 0x28d1: 0x4012f020, 0x28d2: 0x4012f220, 0x28d3: 0x4012f420, + 0x28d4: 0x4012f620, 0x28d5: 0x4012f820, 0x28d6: 0x4012fa20, 0x28d7: 0x4012fc20, + 0x28d8: 0x4012fe20, 0x28d9: 0x40130020, 0x28da: 0x40130220, 0x28db: 0x40130420, + 0x28dc: 0x40130620, 0x28dd: 0x40130820, 0x28de: 0x40130a20, 0x28df: 0x40130c20, + 0x28e0: 0x40130e20, 0x28e1: 0x40131020, 0x28e2: 0x40131220, 0x28e3: 0x40131420, + 0x28e4: 0x40131620, 0x28e5: 0x40131820, 0x28e6: 0x40131a20, 0x28e7: 0x40131c20, + 0x28e8: 0x40131e20, 0x28e9: 0x40132020, 0x28ea: 0x40132220, 0x28eb: 0x40132420, + 0x28ec: 0x40132620, 0x28ed: 0x40132820, 0x28ee: 0x40132a20, 0x28ef: 0x40132c20, + 0x28f0: 0x40132e20, 0x28f1: 0x40133020, 0x28f2: 0x40133220, 0x28f3: 0x40133420, + 0x28f4: 0x40133620, 0x28f5: 0x40133820, 0x28f6: 0x40133a20, 0x28f7: 0x40133c20, + 0x28f8: 0x40133e20, 0x28f9: 0x40134020, 0x28fa: 0x40134220, 0x28fb: 0x40134420, + 0x28fc: 0x40134620, 0x28fd: 0x40134820, 0x28fe: 0x40134a20, 0x28ff: 0x40134c20, + // Block 0xa4, offset 0x2900 + 0x2900: 0x40134e20, 0x2901: 0x40135020, 0x2902: 0x40135220, 0x2903: 0x40135420, + 0x2904: 0x40135620, 0x2905: 0x40135820, 0x2906: 0x40135a20, 0x2907: 0x40135c20, + 0x2908: 0x40135e20, 0x2909: 0x40136020, 0x290a: 0x40136220, 0x290b: 0x40136420, + 0x290c: 0x40136620, 0x290d: 0x40136820, 0x290e: 0x40136a20, 0x290f: 0x40136c20, + 0x2910: 0x40136e20, 0x2911: 0x40137020, 0x2912: 0x40137220, 0x2913: 0x40137420, + 0x2914: 0x40137620, 0x2915: 0x40137820, 0x2916: 0x40137a20, 0x2917: 0x40137c20, + 0x2918: 0x40137e20, 0x2919: 0x40138020, 0x291a: 0x40138220, 0x291b: 0x40138420, + 0x291c: 0x40138620, 0x291d: 0x40138820, 0x291e: 0x40138a20, 0x291f: 0x40138c20, + 0x2920: 0x40138e20, 0x2921: 0x40139020, 0x2922: 0x40139220, 0x2923: 0x40139420, + 0x2924: 0x40139620, 0x2925: 0x40139820, 0x2926: 0x40139a20, 0x2927: 0x40139c20, + 0x2928: 0x40139e20, 0x2929: 0x4013a020, 0x292a: 0x4013a220, 0x292b: 0x4013a420, + 0x292c: 0x4013a620, 0x292d: 0x4013a820, 0x292e: 0x4013aa20, 0x292f: 0x4013ac20, + 0x2930: 0x4013ae20, 0x2931: 0x4013b020, 0x2932: 0x4013b220, 0x2933: 0x4013b420, + 0x2934: 0x4013b620, 0x2935: 0x4013b820, 0x2936: 0x4013ba20, 0x2937: 0x4013bc20, + 0x2938: 0x4013be20, 0x2939: 0x4013c020, 0x293a: 0x4013c220, 0x293b: 0x4013c420, + 0x293c: 0x4013c620, 0x293d: 0x4013c820, 0x293e: 0x4013ca20, 0x293f: 0x4013cc20, + // Block 0xa5, offset 0x2940 + 0x2940: 0x4013ce20, 0x2941: 0x4013d020, 0x2942: 0x4013d220, 0x2943: 0x40041420, + 0x2944: 0x40041620, 0x2945: 0x40041820, 0x2946: 0x40041a20, 0x2947: 0x40041c20, + 0x2948: 0x40041e20, 0x2949: 0x40042020, 0x294a: 0x40042220, 0x294b: 0x40042420, + 0x294c: 0x40042620, 0x294d: 0x40042820, 0x294e: 0x40042a20, 0x294f: 0x40042c20, + 0x2950: 0x40042e20, 0x2951: 0x40043020, 0x2952: 0x40043220, 0x2953: 0x40043420, + 0x2954: 0x40043620, 0x2955: 0x40043820, 0x2956: 0x40043a20, 0x2957: 0x40043c20, + 0x2958: 0x40043e20, 0x2959: 0x4013d420, 0x295a: 0x4013d620, 0x295b: 0x4013d820, + 0x295c: 0x4013da20, 0x295d: 0x4013dc20, 0x295e: 0x4013de20, 0x295f: 0x4013e020, + 0x2960: 0x4013e220, 0x2961: 0x4013e420, 0x2962: 0x4013e620, 0x2963: 0x4013e820, + 0x2964: 0x4013ea20, 0x2965: 0x4013ec20, 0x2966: 0x4013ee20, 0x2967: 0x4013f020, + 0x2968: 0x4013f220, 0x2969: 0x4013f420, 0x296a: 0x4013f620, 0x296b: 0x4013f820, + 0x296c: 0x4013fa20, 0x296d: 0x4013fc20, 0x296e: 0x4013fe20, 0x296f: 0x40140020, + 0x2970: 0x40140220, 0x2971: 0x40140420, 0x2972: 0x40140620, 0x2973: 0x40140820, + 0x2974: 0x40140a20, 0x2975: 0x40140c20, 0x2976: 0x40140e20, 0x2977: 0x40141020, + 0x2978: 0x40141220, 0x2979: 0x40141420, 0x297a: 0x40141620, 0x297b: 0x40141820, + 0x297c: 0x40141a20, 0x297d: 0x40141c20, 0x297e: 0x40141e20, 0x297f: 0x40142020, + // Block 0xa6, offset 0x2980 + 0x2980: 0x40142220, 0x2981: 0x40142420, 0x2982: 0x40142620, 0x2983: 0x40142820, + 0x2984: 0x40142a20, 0x2985: 0x40142c20, 0x2986: 0x40142e20, 0x2987: 0x40143020, + 0x2988: 0x40143220, 0x2989: 0x40143420, 0x298a: 0x40143620, 0x298b: 0x40143820, + 0x298c: 0x40143a20, 0x298d: 0x40143c20, 0x298e: 0x40143e20, 0x298f: 0x40144020, + 0x2990: 0x40144220, 0x2991: 0x40144420, 0x2992: 0x40144620, 0x2993: 0x40144820, + 0x2994: 0x40144a20, 0x2995: 0x40144c20, 0x2996: 0x40144e20, 0x2997: 0x40145020, + 0x2998: 0x4004c620, 0x2999: 0x4004c820, 0x299a: 0x4004ca20, 0x299b: 0x4004cc20, + 0x299c: 0x40145220, 0x299d: 0x40145420, 0x299e: 0x40145620, 0x299f: 0x40145820, + 0x29a0: 0x40145a20, 0x29a1: 0x40145c20, 0x29a2: 0x40145e20, 0x29a3: 0x40146020, + 0x29a4: 0x40146220, 0x29a5: 0x40146420, 0x29a6: 0x40146620, 0x29a7: 0x40146820, + 0x29a8: 0x40146a20, 0x29a9: 0x40146c20, 0x29aa: 0x40146e20, 0x29ab: 0x40147020, + 0x29ac: 0x40147220, 0x29ad: 0x40147420, 0x29ae: 0x40147620, 0x29af: 0x40147820, + 0x29b0: 0x40147a20, 0x29b1: 0x40147c20, 0x29b2: 0x40147e20, 0x29b3: 0x40148020, + 0x29b4: 0x40148220, 0x29b5: 0x40148420, 0x29b6: 0x40148620, 0x29b7: 0x40148820, + 0x29b8: 0x40148a20, 0x29b9: 0x40148c20, 0x29ba: 0x40148e20, 0x29bb: 0x40149020, + 0x29bc: 0x40041020, 0x29bd: 0x40041220, 0x29be: 0x40149220, 0x29bf: 0x40149420, + // Block 0xa7, offset 0x29c0 + 0x29c0: 0x40149620, 0x29c1: 0x40149820, 0x29c2: 0x40149a20, 0x29c3: 0x40149c20, + 0x29c4: 0x40149e20, 0x29c5: 0x4014a020, 0x29c6: 0x4014a220, 0x29c7: 0x4014a420, + 0x29c8: 0x4014a620, 0x29c9: 0x4014a820, 0x29ca: 0x4014aa20, 0x29cb: 0x4014ac20, + 0x29cc: 0xe00000f0, 0x29cd: 0x4014ae20, 0x29ce: 0x4014b020, 0x29cf: 0x4014b220, + 0x29d0: 0x4014b420, 0x29d1: 0x4014b620, 0x29d2: 0x4014b820, 0x29d3: 0x4014ba20, + 0x29d4: 0x4014bc20, 0x29d5: 0x4014be20, 0x29d6: 0x4014c020, 0x29d7: 0x4014c220, + 0x29d8: 0x4014c420, 0x29d9: 0x4014c620, 0x29da: 0x4014c820, 0x29db: 0x4014ca20, + 0x29dc: 0x4014cc20, 0x29dd: 0x4014ce20, 0x29de: 0x4014d020, 0x29df: 0x4014d220, + 0x29e0: 0x4014d420, 0x29e1: 0x4014d620, 0x29e2: 0x4014d820, 0x29e3: 0x4014da20, + 0x29e4: 0x4014dc20, 0x29e5: 0x4014de20, 0x29e6: 0x4014e020, 0x29e7: 0x4014e220, + 0x29e8: 0x4014e420, 0x29e9: 0x4014e620, 0x29ea: 0x4014e820, 0x29eb: 0x4014ea20, + 0x29ec: 0x4014ec20, 0x29ed: 0x4014ee20, 0x29ee: 0x4014f020, 0x29ef: 0x4014f220, + 0x29f0: 0x4014f420, 0x29f1: 0x4014f620, 0x29f2: 0x4014f820, 0x29f3: 0x4014fa20, + 0x29f4: 0x4014fc20, 0x29f5: 0x4014fe20, 0x29f6: 0x40150020, 0x29f7: 0x40150220, + 0x29f8: 0x40150420, 0x29f9: 0x40150620, 0x29fa: 0x40150820, 0x29fb: 0x40150a20, + 0x29fc: 0x40150c20, 0x29fd: 0x40150e20, 0x29fe: 0x40151020, 0x29ff: 0x40151220, + // Block 0xa8, offset 0x2a00 + 0x2a00: 0x40151420, 0x2a01: 0x40151620, 0x2a02: 0x40151820, 0x2a03: 0x40151a20, + 0x2a04: 0x40151c20, 0x2a05: 0x40151e20, 0x2a06: 0x40152020, 0x2a07: 0x40152220, + 0x2a08: 0x40152420, 0x2a09: 0x40152620, 0x2a0a: 0x40152820, 0x2a0b: 0x40152a20, + 0x2a0c: 0x40152c20, 0x2a0d: 0x40152e20, 0x2a0e: 0x40153020, 0x2a0f: 0x40153220, + 0x2a10: 0x40153420, 0x2a11: 0x40153620, 0x2a12: 0x40153820, 0x2a13: 0x40153a20, + 0x2a14: 0x40153c20, 0x2a15: 0x40153e20, 0x2a16: 0x40154020, 0x2a17: 0x40154220, + 0x2a18: 0x40154420, 0x2a19: 0x40154620, 0x2a1a: 0x40154820, 0x2a1b: 0x40154a20, + 0x2a1c: 0x40154c20, 0x2a1d: 0x40154e20, 0x2a1e: 0x40155020, 0x2a1f: 0x40155220, + 0x2a20: 0x40155420, 0x2a21: 0x40155620, 0x2a22: 0x40155820, 0x2a23: 0x40155a20, + 0x2a24: 0x40155c20, 0x2a25: 0x40155e20, 0x2a26: 0x40156020, 0x2a27: 0x40156220, + 0x2a28: 0x40156420, 0x2a29: 0x40156620, 0x2a2a: 0x40156820, 0x2a2b: 0x40156a20, + 0x2a2c: 0x40156c20, 0x2a2d: 0x40156e20, 0x2a2e: 0x40157020, 0x2a2f: 0x40157220, + 0x2a30: 0x40157420, 0x2a31: 0x40157620, 0x2a32: 0x40157820, 0x2a33: 0x40157a20, + 0x2a34: 0xf0000404, 0x2a35: 0xf0001f04, 0x2a36: 0xf0000404, 0x2a37: 0x40157c20, + 0x2a38: 0x40157e20, 0x2a39: 0x40158020, 0x2a3a: 0x40158220, 0x2a3b: 0x40158420, + 0x2a3c: 0x40158620, 0x2a3d: 0x40158820, 0x2a3e: 0x40158a20, 0x2a3f: 0x40158c20, + // Block 0xa9, offset 0x2a40 + 0x2a40: 0x40158e20, 0x2a41: 0x40159020, 0x2a42: 0x40159220, 0x2a43: 0x40159420, + 0x2a44: 0x40159620, 0x2a45: 0x40159820, 0x2a46: 0x40159a20, 0x2a47: 0x40159c20, + 0x2a48: 0x40159e20, 0x2a49: 0x4015a020, 0x2a4a: 0x4015a220, 0x2a4b: 0x4015a420, + 0x2a4c: 0x4015a620, 0x2a4d: 0x4015a820, 0x2a4e: 0x4015aa20, 0x2a4f: 0x4015ac20, + 0x2a50: 0x4015ae20, 0x2a51: 0x4015b020, 0x2a52: 0x4015b220, 0x2a53: 0x4015b420, + 0x2a54: 0x4015b620, 0x2a55: 0x4015b820, 0x2a56: 0x4015ba20, 0x2a57: 0x4015bc20, + 0x2a58: 0x4015be20, 0x2a59: 0x4015c020, 0x2a5a: 0x4015c220, 0x2a5b: 0x4015c420, + 0x2a5c: 0x4015c620, 0x2a5d: 0x4015c820, 0x2a5e: 0x4015ca20, 0x2a5f: 0x4015cc20, + 0x2a60: 0x4015ce20, 0x2a61: 0x4015d020, 0x2a62: 0x4015d220, 0x2a63: 0x4015d420, + 0x2a64: 0x4015d620, 0x2a65: 0x4015d820, 0x2a66: 0x4015da20, 0x2a67: 0x4015dc20, + 0x2a68: 0x4015de20, 0x2a69: 0x4015e020, 0x2a6a: 0x4015e220, 0x2a6b: 0x4015e420, + 0x2a6c: 0x4015e620, 0x2a6d: 0x4015e820, 0x2a6e: 0x4015ea20, 0x2a6f: 0x4015ec20, + 0x2a70: 0x4015ee20, 0x2a71: 0x4015f020, 0x2a72: 0x4015f220, 0x2a73: 0x4015f420, + 0x2a74: 0x4015f620, 0x2a75: 0x4015f820, 0x2a76: 0x4015fa20, 0x2a77: 0x4015fc20, + 0x2a78: 0x4015fe20, 0x2a79: 0x40160020, 0x2a7a: 0x40160220, 0x2a7b: 0x40160420, + 0x2a7c: 0x40160620, 0x2a7d: 0x40160820, 0x2a7e: 0x40160a20, 0x2a7f: 0x40160c20, + // Block 0xaa, offset 0x2a80 + 0x2a80: 0x40160e20, 0x2a81: 0x40161020, 0x2a82: 0x40161220, 0x2a83: 0x40161420, + 0x2a84: 0x40161620, 0x2a85: 0x40161820, 0x2a86: 0x40161a20, 0x2a87: 0x40161c20, + 0x2a88: 0x40161e20, 0x2a89: 0x40162020, 0x2a8a: 0x40162220, 0x2a8b: 0x40162420, + 0x2a8c: 0x40162620, 0x2a8d: 0x40162820, 0x2a8e: 0x40162a20, 0x2a8f: 0x40162c20, + 0x2a90: 0x40162e20, 0x2a91: 0x40163020, 0x2a92: 0x40163220, 0x2a93: 0x40163420, + 0x2a94: 0x40163620, 0x2a95: 0x40163820, 0x2a96: 0x40163a20, 0x2a97: 0x40163c20, + 0x2a98: 0x40163e20, 0x2a99: 0x40164020, 0x2a9a: 0x40164220, 0x2a9b: 0x40164420, + 0x2a9c: 0xe000014f, 0x2a9d: 0x40164620, 0x2a9e: 0x40164820, 0x2a9f: 0x40164a20, + 0x2aa0: 0x40164c20, 0x2aa1: 0x40164e20, 0x2aa2: 0x40165020, 0x2aa3: 0x40165220, + 0x2aa4: 0x40165420, 0x2aa5: 0x40165620, 0x2aa6: 0x40165820, 0x2aa7: 0x40165a20, + 0x2aa8: 0x40165c20, 0x2aa9: 0x40165e20, 0x2aaa: 0x40166020, 0x2aab: 0x40166220, + 0x2aac: 0x40166420, 0x2aad: 0x40166620, 0x2aae: 0x40166820, 0x2aaf: 0x40166a20, + 0x2ab0: 0x40166c20, 0x2ab1: 0x40166e20, 0x2ab2: 0x40167020, 0x2ab3: 0x40167220, + 0x2ab4: 0x40167420, 0x2ab5: 0x40167620, 0x2ab6: 0x40167820, 0x2ab7: 0x40167a20, + 0x2ab8: 0x40167c20, 0x2ab9: 0x40167e20, 0x2aba: 0x40168020, 0x2abb: 0x40168220, + 0x2abc: 0x40168420, 0x2abd: 0x40168620, 0x2abe: 0x40168820, 0x2abf: 0x40168a20, + // Block 0xab, offset 0x2ac0 + 0x2ac0: 0x40168c20, 0x2ac1: 0x40168e20, 0x2ac2: 0x40169020, 0x2ac3: 0x40169220, + 0x2ac4: 0x40169420, 0x2ac5: 0x40169620, 0x2ac6: 0x40169820, 0x2ac7: 0x40169a20, + 0x2ac8: 0x40169c20, 0x2ac9: 0x40169e20, 0x2aca: 0x4016a020, 0x2acb: 0x4016a220, + 0x2acc: 0x4016a420, 0x2acd: 0x4016a620, 0x2ace: 0x4016a820, 0x2acf: 0x4016aa20, + 0x2ad0: 0x4016ac20, 0x2ad1: 0x4016ae20, 0x2ad2: 0x4016b020, 0x2ad3: 0x4016b220, + 0x2ad4: 0x4016b420, 0x2ad5: 0x4016b620, 0x2ad6: 0x4016b820, 0x2ad7: 0x4016ba20, + 0x2ad8: 0x4016bc20, 0x2ad9: 0x4016be20, 0x2ada: 0x4016c020, 0x2adb: 0x4016c220, + 0x2adc: 0x4016c420, 0x2add: 0x4016c620, 0x2ade: 0x4016c820, 0x2adf: 0x4016ca20, + 0x2ae0: 0x4016cc20, 0x2ae1: 0x4016ce20, 0x2ae2: 0x4016d020, 0x2ae3: 0x4016d220, + 0x2ae4: 0x4016d420, 0x2ae5: 0x4016d620, 0x2ae6: 0x4016d820, 0x2ae7: 0x4016da20, + 0x2ae8: 0x4016dc20, 0x2ae9: 0x4016de20, 0x2aea: 0x4016e020, 0x2aeb: 0x4016e220, + 0x2aec: 0x4016e420, 0x2aed: 0x4016e620, 0x2aee: 0x4016e820, 0x2aef: 0x4016ea20, + 0x2af0: 0x4016ec20, 0x2af1: 0x4016ee20, 0x2af2: 0x4016f020, 0x2af3: 0x4016f220, + 0x2af4: 0x4016f420, 0x2af5: 0x4016f620, 0x2af6: 0x4016f820, 0x2af7: 0x4016fa20, + 0x2af8: 0x4016fc20, 0x2af9: 0x4016fe20, 0x2afa: 0x40170020, 0x2afb: 0x40170220, + 0x2afc: 0x40170420, 0x2afd: 0x40170620, 0x2afe: 0x40170820, 0x2aff: 0x40170a20, + // Block 0xac, offset 0x2b00 + 0x2b00: 0x40170c20, 0x2b01: 0x40170e20, 0x2b02: 0x40171020, 0x2b03: 0x40171220, + 0x2b04: 0x40171420, 0x2b05: 0x40171620, 0x2b06: 0x40171820, 0x2b07: 0x40171a20, + 0x2b08: 0x40171c20, 0x2b09: 0x40171e20, 0x2b0a: 0x40172020, 0x2b0b: 0x40172220, + 0x2b0c: 0x40172420, + 0x2b10: 0x40172620, 0x2b11: 0x40172820, 0x2b12: 0x40172a20, 0x2b13: 0x40172c20, + 0x2b14: 0x40172e20, 0x2b15: 0x40173020, 0x2b16: 0x40173220, 0x2b17: 0x40173420, + 0x2b18: 0x40173620, 0x2b19: 0x40173820, + // Block 0xad, offset 0x2b40 + 0x2b40: 0x00373888, 0x2b41: 0x00373a88, 0x2b42: 0x00373c88, 0x2b43: 0x00373e88, + 0x2b44: 0x00374088, 0x2b45: 0x00374288, 0x2b46: 0x00374488, 0x2b47: 0x00374688, + 0x2b48: 0x00374888, 0x2b49: 0x00374a88, 0x2b4a: 0x00374c88, 0x2b4b: 0x00374e88, + 0x2b4c: 0x00375088, 0x2b4d: 0x00375288, 0x2b4e: 0x00375488, 0x2b4f: 0x00375688, + 0x2b50: 0x00375888, 0x2b51: 0x00375a88, 0x2b52: 0x00375c88, 0x2b53: 0x00375e88, + 0x2b54: 0x00376088, 0x2b55: 0x00376288, 0x2b56: 0x00376488, 0x2b57: 0x00376688, + 0x2b58: 0x00376888, 0x2b59: 0x00376a88, 0x2b5a: 0x00376c88, 0x2b5b: 0x00376e88, + 0x2b5c: 0x00377088, 0x2b5d: 0x00377288, 0x2b5e: 0x00377488, 0x2b5f: 0x00377688, + 0x2b60: 0x00377888, 0x2b61: 0x00377a88, 0x2b62: 0x00377c88, 0x2b63: 0x00377e88, + 0x2b64: 0x00378088, 0x2b65: 0x00378288, 0x2b66: 0x00378488, 0x2b67: 0x00378688, + 0x2b68: 0x00378888, 0x2b69: 0x00378a88, 0x2b6a: 0x00378c88, 0x2b6b: 0x00378e88, + 0x2b6c: 0x00379088, 0x2b6d: 0x00379288, 0x2b6e: 0x00379488, + 0x2b70: 0x40373820, 0x2b71: 0x40373a20, 0x2b72: 0x40373c20, 0x2b73: 0x40373e20, + 0x2b74: 0x40374020, 0x2b75: 0x40374220, 0x2b76: 0x40374420, 0x2b77: 0x40374620, + 0x2b78: 0x40374820, 0x2b79: 0x40374a20, 0x2b7a: 0x40374c20, 0x2b7b: 0x40374e20, + 0x2b7c: 0x40375020, 0x2b7d: 0x40375220, 0x2b7e: 0x40375420, 0x2b7f: 0x40375620, + // Block 0xae, offset 0x2b80 + 0x2b80: 0x40375820, 0x2b81: 0x40375a20, 0x2b82: 0x40375c20, 0x2b83: 0x40375e20, + 0x2b84: 0x40376020, 0x2b85: 0x40376220, 0x2b86: 0x40376420, 0x2b87: 0x40376620, + 0x2b88: 0x40376820, 0x2b89: 0x40376a20, 0x2b8a: 0x40376c20, 0x2b8b: 0x40376e20, + 0x2b8c: 0x40377020, 0x2b8d: 0x40377220, 0x2b8e: 0x40377420, 0x2b8f: 0x40377620, + 0x2b90: 0x40377820, 0x2b91: 0x40377a20, 0x2b92: 0x40377c20, 0x2b93: 0x40377e20, + 0x2b94: 0x40378020, 0x2b95: 0x40378220, 0x2b96: 0x40378420, 0x2b97: 0x40378620, + 0x2b98: 0x40378820, 0x2b99: 0x40378a20, 0x2b9a: 0x40378c20, 0x2b9b: 0x40378e20, + 0x2b9c: 0x40379020, 0x2b9d: 0x40379220, 0x2b9e: 0x40379420, + 0x2ba0: 0x002e4088, 0x2ba1: 0x402e4020, 0x2ba2: 0x002e4288, 0x2ba3: 0x002f3688, + 0x2ba4: 0x002fbe88, 0x2ba5: 0x402be820, 0x2ba6: 0x40303e20, 0x2ba7: 0x002d8888, + 0x2ba8: 0x402d8820, 0x2ba9: 0x002e1288, 0x2baa: 0x402e1220, 0x2bab: 0x00316088, + 0x2bac: 0x40316020, 0x2bad: 0x002bf888, 0x2bae: 0x002e9088, 0x2baf: 0x002bf088, + 0x2bb0: 0x002c0288, 0x2bb1: 0x4030d420, 0x2bb2: 0x0030ec88, 0x2bb3: 0x4030ec20, + 0x2bb4: 0x4030d620, 0x2bb5: 0x002d8a88, 0x2bb6: 0x402d8a20, 0x2bb7: 0x402f5420, + 0x2bb8: 0x402cac20, 0x2bb9: 0x402fb420, 0x2bba: 0x402f0e20, 0x2bbb: 0x402cb620, + 0x2bbc: 0x002dcc95, 0x2bbd: 0x0030be9d, 0x2bbe: 0x002ffc88, 0x2bbf: 0x00315888, + // Block 0xaf, offset 0x2bc0 + 0x2bc0: 0x0032aa88, 0x2bc1: 0x4032aa20, 0x2bc2: 0x0032ac88, 0x2bc3: 0x4032ac20, + 0x2bc4: 0x0032ae88, 0x2bc5: 0x4032ae20, 0x2bc6: 0x0032b088, 0x2bc7: 0x4032b020, + 0x2bc8: 0x0032b288, 0x2bc9: 0x4032b220, 0x2bca: 0x0032b688, 0x2bcb: 0x4032b620, + 0x2bcc: 0x0032b888, 0x2bcd: 0x4032b820, 0x2bce: 0x0032ba88, 0x2bcf: 0x4032ba20, + 0x2bd0: 0x0032bc88, 0x2bd1: 0x4032bc20, 0x2bd2: 0x0032be88, 0x2bd3: 0x4032be20, + 0x2bd4: 0x0032c088, 0x2bd5: 0x4032c020, 0x2bd6: 0x0032c488, 0x2bd7: 0x4032c420, + 0x2bd8: 0x0032c688, 0x2bd9: 0x4032c620, 0x2bda: 0x0032c888, 0x2bdb: 0x4032c820, + 0x2bdc: 0x0032ce88, 0x2bdd: 0x4032ce20, 0x2bde: 0x0032d088, 0x2bdf: 0x4032d020, + 0x2be0: 0x0032d288, 0x2be1: 0x4032d220, 0x2be2: 0x0032d488, 0x2be3: 0x4032d420, + 0x2be4: 0x0032d688, 0x2be5: 0x4032d620, 0x2be6: 0x0032d888, 0x2be7: 0x4032d820, + 0x2be8: 0x0032da88, 0x2be9: 0x4032da20, 0x2bea: 0x0032dc88, 0x2beb: 0x4032dc20, + 0x2bec: 0x0032de88, 0x2bed: 0x4032de20, 0x2bee: 0x0032e088, 0x2bef: 0x4032e020, + 0x2bf0: 0x0032e288, 0x2bf1: 0x4032e220, 0x2bf2: 0x00331888, 0x2bf3: 0x40331820, + 0x2bf4: 0x00331a88, 0x2bf5: 0x40331a20, 0x2bf6: 0x0032b488, 0x2bf7: 0x4032b420, + 0x2bf8: 0x0032c288, 0x2bf9: 0x4032c220, 0x2bfa: 0x0032ca88, 0x2bfb: 0x4032ca20, + 0x2bfc: 0x0032cc88, 0x2bfd: 0x4032cc20, 0x2bfe: 0x0032e488, 0x2bff: 0x4032e420, + // Block 0xb0, offset 0x2c00 + 0x2c00: 0x0032e688, 0x2c01: 0x4032e620, 0x2c02: 0x0032ec88, 0x2c03: 0x4032ec20, + 0x2c04: 0x0032ee88, 0x2c05: 0x4032ee20, 0x2c06: 0x0032f088, 0x2c07: 0x4032f020, + 0x2c08: 0x0032f888, 0x2c09: 0x4032f820, 0x2c0a: 0x0032fc88, 0x2c0b: 0x4032fc20, + 0x2c0c: 0x0032fe88, 0x2c0d: 0x4032fe20, 0x2c0e: 0x00330088, 0x2c0f: 0x40330020, + 0x2c10: 0x00330288, 0x2c11: 0x40330220, 0x2c12: 0x00330488, 0x2c13: 0x40330420, + 0x2c14: 0x00330688, 0x2c15: 0x40330620, 0x2c16: 0x00330c88, 0x2c17: 0x40330c20, + 0x2c18: 0x00331088, 0x2c19: 0x40331020, 0x2c1a: 0x00331288, 0x2c1b: 0x40331220, + 0x2c1c: 0x00331488, 0x2c1d: 0x40331420, 0x2c1e: 0x00331c88, 0x2c1f: 0x40331c20, + 0x2c20: 0x00331e88, 0x2c21: 0x40331e20, 0x2c22: 0x00332088, 0x2c23: 0x40332020, + 0x2c24: 0xe00014b0, 0x2c25: 0x40173a20, 0x2c26: 0x40173c20, 0x2c27: 0x40173e20, + 0x2c28: 0x40174020, 0x2c29: 0x40174220, 0x2c2a: 0x40174420, 0x2c2b: 0x0032ea88, + 0x2c2c: 0x4032ea20, 0x2c2d: 0x00330a88, 0x2c2e: 0x40330a20, 0x2c2f: 0xae605f02, + 0x2c30: 0xae602a02, 0x2c31: 0xae602202, 0x2c32: 0x0032f688, 0x2c33: 0x4032f620, + 0x2c39: 0x4002f820, 0x2c3a: 0x4002d420, 0x2c3b: 0x4002d620, + 0x2c3c: 0x4003b620, 0x2c3d: 0x4028b420, 0x2c3e: 0x4002fa20, 0x2c3f: 0x4003b820, + // Block 0xb1, offset 0x2c40 + 0x2c40: 0x40379820, 0x2c41: 0x40379c20, 0x2c42: 0x4037a020, 0x2c43: 0x4037a420, + 0x2c44: 0x4037a820, 0x2c45: 0x4037ac20, 0x2c46: 0x4037b020, 0x2c47: 0x4037b820, + 0x2c48: 0x4037bc20, 0x2c49: 0x4037c020, 0x2c4a: 0x4037c420, 0x2c4b: 0x4037c820, + 0x2c4c: 0x4037cc20, 0x2c4d: 0x4037d420, 0x2c4e: 0x4037d820, 0x2c4f: 0x4037dc20, + 0x2c50: 0x4037e020, 0x2c51: 0x4037e420, 0x2c52: 0x4037e820, 0x2c53: 0x4037f020, + 0x2c54: 0x4037f420, 0x2c55: 0x4037f820, 0x2c56: 0x4037fc20, 0x2c57: 0x40380020, + 0x2c58: 0x40380420, 0x2c59: 0x40380820, 0x2c5a: 0x40380c20, 0x2c5b: 0x40381020, + 0x2c5c: 0x40381420, 0x2c5d: 0x40381820, 0x2c5e: 0x40381c20, 0x2c5f: 0x40382420, + 0x2c60: 0x40382820, 0x2c61: 0x4037b420, 0x2c62: 0x4037d020, 0x2c63: 0x4037ec20, + 0x2c64: 0x40382020, 0x2c65: 0x40382c20, 0x2c67: 0x40383220, + 0x2c6d: 0x40383c20, + 0x2c70: 0x403bbc20, 0x2c71: 0x403bbe20, 0x2c72: 0x403bc020, 0x2c73: 0x403bc220, + 0x2c74: 0x403bc420, 0x2c75: 0x403bc620, 0x2c76: 0x403bc820, 0x2c77: 0x403bca20, + 0x2c78: 0x403bcc20, 0x2c79: 0x403bce20, 0x2c7a: 0x403bd020, 0x2c7b: 0x403bd220, + 0x2c7c: 0x403bd620, 0x2c7d: 0x403bd820, 0x2c7e: 0x403bda20, 0x2c7f: 0x403bdc20, + // Block 0xb2, offset 0x2c80 + 0x2c80: 0x403bde20, 0x2c81: 0x403be020, 0x2c82: 0x403be220, 0x2c83: 0x403be420, + 0x2c84: 0x403be620, 0x2c85: 0x403be820, 0x2c86: 0x403bea20, 0x2c87: 0x403bec20, + 0x2c88: 0x403bee20, 0x2c89: 0x403bf020, 0x2c8a: 0x403bf220, 0x2c8b: 0x403bf420, + 0x2c8c: 0x403bf620, 0x2c8d: 0x403bf820, 0x2c8e: 0x403bfa20, 0x2c8f: 0x403bfc20, + 0x2c90: 0x403bfe20, 0x2c91: 0x403c0020, 0x2c92: 0x403c0220, 0x2c93: 0x403c0420, + 0x2c94: 0x403c0820, 0x2c95: 0x403c0a20, 0x2c96: 0x403c0c20, 0x2c97: 0x403c0e20, + 0x2c98: 0x403c1020, 0x2c99: 0x403c1220, 0x2c9a: 0x403c1420, 0x2c9b: 0x403c1620, + 0x2c9c: 0x403c1820, 0x2c9d: 0x403c1a20, 0x2c9e: 0x403c1c20, 0x2c9f: 0x403c1e20, + 0x2ca0: 0x403c2020, 0x2ca1: 0x403c2220, 0x2ca2: 0x403c2420, 0x2ca3: 0x403c2620, + 0x2ca4: 0x403c2820, 0x2ca5: 0x403c2a20, 0x2ca6: 0x403bd420, 0x2ca7: 0x403c0620, + 0x2caf: 0x403c2c20, + 0x2cb0: 0x4005e620, + 0x2cbf: 0xa0900000, + // Block 0xb3, offset 0x2cc0 + 0x2cc0: 0x403c4e20, 0x2cc1: 0x403c7820, 0x2cc2: 0x403c9a20, 0x2cc3: 0x403cac20, + 0x2cc4: 0x403cca20, 0x2cc5: 0x403d1620, 0x2cc6: 0x403d3820, 0x2cc7: 0x403d4a20, + 0x2cc8: 0x403d7620, 0x2cc9: 0x403d8820, 0x2cca: 0x403d9a20, 0x2ccb: 0x403dfc20, + 0x2ccc: 0x403e3a20, 0x2ccd: 0x403e5820, 0x2cce: 0x403e6a20, 0x2ccf: 0x403eae20, + 0x2cd0: 0x403ec020, 0x2cd1: 0x403ee020, 0x2cd2: 0x403f4020, 0x2cd3: 0x403e9620, + 0x2cd4: 0x403e9820, 0x2cd5: 0x403e9a20, 0x2cd6: 0x403e9c20, + 0x2ce0: 0x403f4820, 0x2ce1: 0x403f4a20, 0x2ce2: 0x403f4c20, 0x2ce3: 0x403f4e20, + 0x2ce4: 0x403f5020, 0x2ce5: 0x403f5220, 0x2ce6: 0x403f5420, + 0x2ce8: 0x403f5620, 0x2ce9: 0x403f5820, 0x2cea: 0x403f5a20, 0x2ceb: 0x403f5c20, + 0x2cec: 0x403f5e20, 0x2ced: 0x403f6020, 0x2cee: 0x403f6220, + 0x2cf0: 0x403f6420, 0x2cf1: 0x403f6620, 0x2cf2: 0x403f6820, 0x2cf3: 0x403f6a20, + 0x2cf4: 0x403f6c20, 0x2cf5: 0x403f6e20, 0x2cf6: 0x403f7020, + 0x2cf8: 0x403f7220, 0x2cf9: 0x403f7420, 0x2cfa: 0x403f7620, 0x2cfb: 0x403f7820, + 0x2cfc: 0x403f7a20, 0x2cfd: 0x403f7c20, 0x2cfe: 0x403f7e20, + // Block 0xb4, offset 0x2d00 + 0x2d00: 0x403f8020, 0x2d01: 0x403f8220, 0x2d02: 0x403f8420, 0x2d03: 0x403f8620, + 0x2d04: 0x403f8820, 0x2d05: 0x403f8a20, 0x2d06: 0x403f8c20, + 0x2d08: 0x403f8e20, 0x2d09: 0x403f9020, 0x2d0a: 0x403f9220, 0x2d0b: 0x403f9420, + 0x2d0c: 0x403f9620, 0x2d0d: 0x403f9820, 0x2d0e: 0x403f9a20, + 0x2d10: 0x403f9c20, 0x2d11: 0x403f9e20, 0x2d12: 0x403fa020, 0x2d13: 0x403fa220, + 0x2d14: 0x403fa420, 0x2d15: 0x403fa620, 0x2d16: 0x403fa820, + 0x2d18: 0x403faa20, 0x2d19: 0x403fac20, 0x2d1a: 0x403fae20, 0x2d1b: 0x403fb020, + 0x2d1c: 0x403fb220, 0x2d1d: 0x403fb420, 0x2d1e: 0x403fb620, + 0x2d20: 0x84e619a9, 0x2d21: 0x84e619ad, 0x2d22: 0x84e619b1, 0x2d23: 0x84e619c5, + 0x2d24: 0x84e619e5, 0x2d25: 0x84e619f2, 0x2d26: 0x84e61a28, 0x2d27: 0x84e61a42, + 0x2d28: 0x84e61a54, 0x2d29: 0x84e61a5d, 0x2d2a: 0x84e61a77, 0x2d2b: 0x84e61a87, + 0x2d2c: 0x84e61a94, 0x2d2d: 0x84e61a9d, 0x2d2e: 0x84e61aa6, 0x2d2f: 0x84e61ada, + 0x2d30: 0x84e61b01, 0x2d31: 0x84e61b0c, 0x2d32: 0x84e61b2e, 0x2d33: 0x84e61b33, + 0x2d34: 0x84e61b86, 0x2d35: 0xe00014d8, 0x2d36: 0x84e61991, 0x2d37: 0x84e619d9, + 0x2d38: 0x84e61a27, 0x2d39: 0x84e61ad1, 0x2d3a: 0x84e61b4f, 0x2d3b: 0x84e61b5c, + 0x2d3c: 0x84e61b61, 0x2d3d: 0x84e61b6b, 0x2d3e: 0x84e61b70, 0x2d3f: 0x84e61b7a, + // Block 0xb5, offset 0x2d40 + 0x2d40: 0x40052620, 0x2d41: 0x40052820, 0x2d42: 0x40047420, 0x2d43: 0x40047620, + 0x2d44: 0x40047820, 0x2d45: 0x40047a20, 0x2d46: 0x40052a20, 0x2d47: 0x40052c20, + 0x2d48: 0x40052e20, 0x2d49: 0x40047c20, 0x2d4a: 0x40047e20, 0x2d4b: 0x40053020, + 0x2d4c: 0x40048020, 0x2d4d: 0x40048220, 0x2d4e: 0x40053220, 0x2d4f: 0x40053420, + 0x2d50: 0x40053620, 0x2d51: 0x40053820, 0x2d52: 0x40053a20, 0x2d53: 0x40053c20, + 0x2d54: 0x40053e20, 0x2d55: 0x40054020, 0x2d56: 0x40054220, 0x2d57: 0x40023620, + 0x2d58: 0x4002e220, 0x2d59: 0x4003ba20, 0x2d5a: 0x40054420, 0x2d5b: 0x40054620, + 0x2d5c: 0x40048420, 0x2d5d: 0x40048620, 0x2d5e: 0x40054820, 0x2d5f: 0x40054a20, + 0x2d60: 0x40048820, 0x2d61: 0x40048a20, 0x2d62: 0x40048c20, 0x2d63: 0x40048e20, + 0x2d64: 0x40049020, 0x2d65: 0x40049220, 0x2d66: 0x40049420, 0x2d67: 0x40049620, + 0x2d68: 0x40049820, 0x2d69: 0x40049a20, 0x2d6a: 0x4003ae20, 0x2d6b: 0x4003b020, + 0x2d6c: 0x4003b220, 0x2d6d: 0x4003b420, 0x2d6e: 0x4002c820, 0x2d6f: 0x40367020, + 0x2d70: 0x4002fc20, 0x2d71: 0x40030820, 0x2d72: 0x40024420, 0x2d73: 0x40030a20, + 0x2d74: 0x40024220, 0x2d75: 0x40026820, 0x2d76: 0x4004fc20, 0x2d77: 0x4004fe20, + 0x2d78: 0x40050020, 0x2d79: 0x4004d020, 0x2d7a: 0x40023020, 0x2d7b: 0x40023220, + // Block 0xb6, offset 0x2d80 + 0x2d80: 0xe0002401, 0x2d81: 0xe0002416, 0x2d82: 0x029cb684, 0x2d83: 0x029cb484, + 0x2d84: 0xe0002404, 0x2d85: 0x029d7684, 0x2d86: 0xe0002407, 0x2d87: 0xe000240a, + 0x2d88: 0xe000240d, 0x2d89: 0x02a40484, 0x2d8a: 0xe0002410, 0x2d8b: 0xe0002413, + 0x2d8c: 0xe0002419, 0x2d8d: 0xe000241c, 0x2d8e: 0xe000241f, 0x2d8f: 0x02b84684, + 0x2d90: 0x02b84484, 0x2d91: 0xe0002422, 0x2d92: 0x02bbe684, 0x2d93: 0x02bcf484, + 0x2d94: 0x02bea284, 0x2d95: 0xe0002425, 0x2d96: 0x02bf8884, 0x2d97: 0xe0002428, + 0x2d98: 0x02c49884, 0x2d99: 0x02ca6a84, 0x2d9b: 0x02cbc284, + 0x2d9c: 0xe000242b, 0x2d9d: 0xe000242e, 0x2d9e: 0xe0002436, 0x2d9f: 0x02d79a84, + 0x2da0: 0x02d82284, 0x2da1: 0x02d86a84, 0x2da2: 0x02d87484, 0x2da3: 0x02e0d884, + 0x2da4: 0x02e45684, 0x2da5: 0xe0002439, 0x2da6: 0x029c5884, 0x2da7: 0xe000243c, + 0x2da8: 0x02e55a84, 0x2da9: 0xe000243f, 0x2daa: 0xe0002442, 0x2dab: 0xe0002445, + 0x2dac: 0xe0002448, 0x2dad: 0x02f27684, 0x2dae: 0xe000244b, 0x2daf: 0x02f9f284, + 0x2db0: 0x02fd3e84, 0x2db1: 0x02fea684, 0x2db2: 0x02fea484, 0x2db3: 0xe0002451, + 0x2db4: 0xe0002454, 0x2db5: 0xe000244e, 0x2db6: 0xe0002457, 0x2db7: 0xe000245a, + 0x2db8: 0x02ff1684, 0x2db9: 0x03000484, 0x2dba: 0x03010084, 0x2dbb: 0xe000245d, + 0x2dbc: 0xe0002460, 0x2dbd: 0xe0002463, 0x2dbe: 0x0304f284, 0x2dbf: 0xe0002466, + // Block 0xb7, offset 0x2dc0 + 0x2dc0: 0xe0002469, 0x2dc1: 0x030c9c84, 0x2dc2: 0x0310c884, 0x2dc3: 0x03130084, + 0x2dc4: 0x0312fe84, 0x2dc5: 0x03138284, 0x2dc6: 0x0313a484, 0x2dc7: 0xe000246c, + 0x2dc8: 0x03174084, 0x2dc9: 0x031a3a84, 0x2dca: 0xe000246f, 0x2dcb: 0x031ecc84, + 0x2dcc: 0x031f6c84, 0x2dcd: 0xe0002472, 0x2dce: 0xe0002475, 0x2dcf: 0xe0002478, + 0x2dd0: 0x03290a84, 0x2dd1: 0x032aee84, 0x2dd2: 0x032af084, 0x2dd3: 0x032afe84, + 0x2dd4: 0x032bd084, 0x2dd5: 0xe000247b, 0x2dd6: 0x032c3a84, 0x2dd7: 0xe000247e, + 0x2dd8: 0x032ea484, 0x2dd9: 0x032fcc84, 0x2dda: 0x0330ea84, 0x2ddb: 0x03319c84, + 0x2ddc: 0x0331bc84, 0x2ddd: 0x0331be84, 0x2dde: 0xe0002481, 0x2ddf: 0x0331c084, + 0x2de0: 0x0332c684, 0x2de1: 0xe0002484, 0x2de2: 0x0334d884, 0x2de3: 0xe0002487, + 0x2de4: 0xe000248a, 0x2de5: 0x0338f884, 0x2de6: 0x033c3e84, 0x2de7: 0xe000248d, + 0x2de8: 0x033d4c84, 0x2de9: 0x033d8884, 0x2dea: 0x033dfc84, 0x2deb: 0xe0002490, + 0x2dec: 0x033ea084, 0x2ded: 0xe0002493, 0x2dee: 0x033efe84, 0x2def: 0xe0002496, + 0x2df0: 0x033f3284, 0x2df1: 0xe0002499, 0x2df2: 0xe000249c, 0x2df3: 0x033f3e84, + // Block 0xb8, offset 0x2e00 + 0x2e00: 0x029c0084, 0x2e01: 0x029c5084, 0x2e02: 0x029c6c84, 0x2e03: 0x029c7e84, + 0x2e04: 0x029cb284, 0x2e05: 0x029d0a84, 0x2e06: 0x029d1884, 0x2e07: 0x029d4084, + 0x2e08: 0x029d7484, 0x2e09: 0x02a27e84, 0x2e0a: 0x02a2ca84, 0x2e0b: 0x02a2d684, + 0x2e0c: 0x02a30484, 0x2e0d: 0x02a32c84, 0x2e0e: 0x02a35684, 0x2e0f: 0x02a3c084, + 0x2e10: 0x02a3ea84, 0x2e11: 0x02a40084, 0x2e12: 0x02a53684, 0x2e13: 0x02a5f284, + 0x2e14: 0x02a62a84, 0x2e15: 0x02a63484, 0x2e16: 0x02a67084, 0x2e17: 0x02a68284, + 0x2e18: 0x02a6b884, 0x2e19: 0x02a6d284, 0x2e1a: 0x02a70484, 0x2e1b: 0x02a76c84, + 0x2e1c: 0x02a79084, 0x2e1d: 0x02a7c684, 0x2e1e: 0x02adae84, 0x2e1f: 0x02ae3e84, + 0x2e20: 0x02b1d684, 0x2e21: 0x02b20484, 0x2e22: 0x02b21484, 0x2e23: 0x02b22a84, + 0x2e24: 0x02b24e84, 0x2e25: 0x02b2e684, 0x2e26: 0x02b6a084, 0x2e27: 0x02b70084, + 0x2e28: 0x02b7f084, 0x2e29: 0x02b81e84, 0x2e2a: 0x02b84484, 0x2e2b: 0x02b87084, + 0x2e2c: 0x02b8dc84, 0x2e2d: 0x02b8e284, 0x2e2e: 0x02bbb684, 0x2e2f: 0x02bbca84, + 0x2e30: 0x02bbe284, 0x2e31: 0x02bbfc84, 0x2e32: 0x02bce484, 0x2e33: 0x02bcf484, + 0x2e34: 0x02bcfe84, 0x2e35: 0x02bde884, 0x2e36: 0x02bdfc84, 0x2e37: 0x02be1684, + 0x2e38: 0x02be2684, 0x2e39: 0x02bea084, 0x2e3a: 0x02bec284, 0x2e3b: 0x02bee684, + 0x2e3c: 0x02bf8684, 0x2e3d: 0x02c41084, 0x2e3e: 0x02c46c84, 0x2e3f: 0x02c49684, + // Block 0xb9, offset 0x2e40 + 0x2e40: 0x02ca5e84, 0x2e41: 0x02ca6884, 0x2e42: 0x02cb0e84, 0x2e43: 0x02cb2e84, + 0x2e44: 0x02cb4884, 0x2e45: 0x02cb7284, 0x2e46: 0x02cbc084, 0x2e47: 0x02cbca84, + 0x2e48: 0x02cde084, 0x2e49: 0x02ce1084, 0x2e4a: 0x02ce5084, 0x2e4b: 0x02d64084, + 0x2e4c: 0x02d6c484, 0x2e4d: 0x02d6f284, 0x2e4e: 0x02d76684, 0x2e4f: 0x02d79684, + 0x2e50: 0x02d7a884, 0x2e51: 0x02d7b684, 0x2e52: 0x02d81e84, 0x2e53: 0x02d82884, + 0x2e54: 0x02d86884, 0x2e55: 0x02e0d684, 0x2e56: 0x02e45484, 0x2e57: 0x02e46c84, + 0x2e58: 0x02e47684, 0x2e59: 0x02e47e84, 0x2e5a: 0x02e48e84, 0x2e5b: 0x02e4b284, + 0x2e5c: 0x02e4b684, 0x2e5d: 0x02e55884, 0x2e5e: 0x02e70884, 0x2e5f: 0x02e71284, + 0x2e60: 0x02e9b884, 0x2e61: 0x02e9cc84, 0x2e62: 0x02ea3084, 0x2e63: 0x02ea3e84, + 0x2e64: 0x02ea5084, 0x2e65: 0x02ea6084, 0x2e66: 0x02eb1684, 0x2e67: 0x02eb2484, + 0x2e68: 0x02ecec84, 0x2e69: 0x02ecfa84, 0x2e6a: 0x02ed5c84, 0x2e6b: 0x02ed7e84, + 0x2e6c: 0x02eddc84, 0x2e6d: 0x02efb684, 0x2e6e: 0x02efc484, 0x2e6f: 0x02efe684, + 0x2e70: 0x02f27484, 0x2e71: 0x02f37084, 0x2e72: 0x02f37c84, 0x2e73: 0x02f4e884, + 0x2e74: 0x02f59684, 0x2e75: 0x02f5f284, 0x2e76: 0x02f8e684, 0x2e77: 0x02f9f084, + 0x2e78: 0x02fe6c84, 0x2e79: 0x02fea284, 0x2e7a: 0x02ff1484, 0x2e7b: 0x02ff7a84, + 0x2e7c: 0x03000284, 0x2e7d: 0x03001884, 0x2e7e: 0x03002484, 0x2e7f: 0x03006684, + // Block 0xba, offset 0x2e80 + 0x2e80: 0x0300fe84, 0x2e81: 0x03011284, 0x2e82: 0x0303c684, 0x2e83: 0x0303d484, + 0x2e84: 0x0303e684, 0x2e85: 0x0303f884, 0x2e86: 0x03041884, 0x2e87: 0x03043684, + 0x2e88: 0x03043e84, 0x2e89: 0x0304dc84, 0x2e8a: 0x0304e484, 0x2e8b: 0x0304f084, + 0x2e8c: 0x030c9a84, 0x2e8d: 0x030cd684, 0x2e8e: 0x03108084, 0x2e8f: 0x03109884, + 0x2e90: 0x0310c684, 0x2e91: 0x0312fc84, 0x2e92: 0x03131684, 0x2e93: 0x0313a484, + 0x2e94: 0x03140084, 0x2e95: 0x03186e84, 0x2e96: 0x03188c84, 0x2e97: 0x0318aa84, + 0x2e98: 0x0318f084, 0x2e99: 0x03193a84, 0x2e9a: 0x031ac884, 0x2e9b: 0x031ae084, + 0x2e9c: 0x031b6684, 0x2e9d: 0x031d5684, 0x2e9e: 0x031d9484, 0x2e9f: 0x031f3684, + 0x2ea0: 0x031f6084, 0x2ea1: 0x031f6a84, 0x2ea2: 0x03212284, 0x2ea3: 0x03229284, + 0x2ea4: 0x03238c84, 0x2ea5: 0x03239884, 0x2ea6: 0x0323a284, 0x2ea7: 0x032aee84, + 0x2ea8: 0x032b0084, 0x2ea9: 0x032c3884, 0x2eaa: 0x032d6c84, 0x2eab: 0x032d7284, + 0x2eac: 0x032dd084, 0x2ead: 0x032ea284, 0x2eae: 0x032ebc84, 0x2eaf: 0x032ec484, + 0x2eb0: 0x032ed284, 0x2eb1: 0x032f9684, 0x2eb2: 0x032fda84, 0x2eb3: 0x032fe684, + 0x2eb4: 0x03300284, 0x2eb5: 0x03315084, 0x2eb6: 0x0331b684, 0x2eb7: 0x0331be84, + 0x2eb8: 0x03332c84, 0x2eb9: 0x03333284, 0x2eba: 0x03335884, 0x2ebb: 0x03355084, + 0x2ebc: 0x0335b084, 0x2ebd: 0x0335be84, 0x2ebe: 0x03364a84, 0x2ebf: 0x03365e84, + // Block 0xbb, offset 0x2ec0 + 0x2ec0: 0x03366484, 0x2ec1: 0x03367884, 0x2ec2: 0x0336b484, 0x2ec3: 0x0339ca84, + 0x2ec4: 0x033cea84, 0x2ec5: 0x033cfe84, 0x2ec6: 0x033d4a84, 0x2ec7: 0x033d7684, + 0x2ec8: 0x033d8684, 0x2ec9: 0x033d9a84, 0x2eca: 0x033da284, 0x2ecb: 0x033df284, + 0x2ecc: 0x033dfa84, 0x2ecd: 0x033e1c84, 0x2ece: 0x033e2684, 0x2ecf: 0x033e4084, + 0x2ed0: 0x033e7684, 0x2ed1: 0x033e9484, 0x2ed2: 0x033ea484, 0x2ed3: 0x033f1a84, + 0x2ed4: 0x033f3884, 0x2ed5: 0x033f4084, + 0x2ef0: 0x40273a20, 0x2ef1: 0x40273c20, 0x2ef2: 0x40273e20, 0x2ef3: 0x40274020, + 0x2ef4: 0x40274220, 0x2ef5: 0x40274420, 0x2ef6: 0x40274620, 0x2ef7: 0x40274820, + 0x2ef8: 0x40274a20, 0x2ef9: 0x40274c20, 0x2efa: 0x40274e20, 0x2efb: 0x40275020, + // Block 0xbc, offset 0x2f00 + 0x2f00: 0x00021283, 0x2f01: 0x40025c20, 0x2f02: 0x40030420, 0x2f03: 0x40051220, + 0x2f04: 0x40279a20, 0x2f05: 0x4027ca20, 0x2f06: 0xe0002206, 0x2f07: 0xe00001d3, + 0x2f08: 0x40049c20, 0x2f09: 0x40049e20, 0x2f0a: 0x4004a020, 0x2f0b: 0x4004a220, + 0x2f0c: 0x4004a420, 0x2f0d: 0x4004a620, 0x2f0e: 0x4004a820, 0x2f0f: 0x4004aa20, + 0x2f10: 0x4004ac20, 0x2f11: 0x4004ae20, 0x2f12: 0x40279c20, 0x2f13: 0x40279e20, + 0x2f14: 0x4004b020, 0x2f15: 0x4004b220, 0x2f16: 0x4004b420, 0x2f17: 0x4004b620, + 0x2f18: 0x4004b820, 0x2f19: 0x4004ba20, 0x2f1a: 0x4004bc20, 0x2f1b: 0x4004be20, + 0x2f1c: 0x40023820, 0x2f1d: 0x4003ea20, 0x2f1e: 0x4003ec20, 0x2f1f: 0x4003ee20, + 0x2f20: 0x4027a020, 0x2f21: 0xe0000267, 0x2f22: 0xe000037f, 0x2f23: 0xe0000459, + 0x2f24: 0xe000052e, 0x2f25: 0xe00005f8, 0x2f26: 0xe00006c3, 0x2f27: 0xe000076b, + 0x2f28: 0xe0000817, 0x2f29: 0xe00008bc, 0x2f2a: 0xada12202, 0x2f2b: 0xae412302, + 0x2f2c: 0xae812402, 0x2f2d: 0xade12502, 0x2f2e: 0xae012602, 0x2f2f: 0xae012702, + 0x2f30: 0x40023a20, 0x2f31: 0x4027ce20, 0x2f32: 0xe0000152, 0x2f33: 0x4027d020, + 0x2f34: 0xe0000155, 0x2f35: 0x4027d220, 0x2f36: 0x00279c84, 0x2f37: 0x4027a220, + 0x2f38: 0x02a68284, 0x2f39: 0x02a68884, 0x2f3a: 0x02a68a84, 0x2f3b: 0x4027cc20, + 0x2f3c: 0xe000231a, 0x2f3d: 0x40051420, 0x2f3e: 0x4027a420, 0x2f3f: 0x4027a620, + // Block 0xbd, offset 0x2f40 + 0x2f41: 0x0065768d, 0x2f42: 0x0065768e, 0x2f43: 0x0065788d, + 0x2f44: 0x0065788e, 0x2f45: 0x00657a8d, 0x2f46: 0x00657a8e, 0x2f47: 0x00657e8d, + 0x2f48: 0x00657e8e, 0x2f49: 0x0065808d, 0x2f4a: 0x0065808e, 0x2f4b: 0x0065828e, + 0x2f4c: 0xe000216a, 0x2f4d: 0x0065848e, 0x2f4e: 0xe0002188, 0x2f4f: 0x0065868e, + 0x2f50: 0xe00021b8, 0x2f51: 0x0065888e, 0x2f52: 0xe00021d6, 0x2f53: 0x00658a8e, + 0x2f54: 0xe00021e0, 0x2f55: 0x00658c8e, 0x2f56: 0xe00021ef, 0x2f57: 0x00658e8e, + 0x2f58: 0xe0002200, 0x2f59: 0x0065908e, 0x2f5a: 0xe000220f, 0x2f5b: 0x0065928e, + 0x2f5c: 0xe0002215, 0x2f5d: 0x0065948e, 0x2f5e: 0xe0002223, 0x2f5f: 0x0065968e, + 0x2f60: 0xe0002229, 0x2f61: 0x0065988e, 0x2f62: 0xe0002234, 0x2f63: 0x00659a8d, + 0x2f64: 0x00659a8e, 0x2f65: 0xe000223a, 0x2f66: 0x00659c8e, 0x2f67: 0xe0002240, + 0x2f68: 0x00659e8e, 0x2f69: 0xe000224a, 0x2f6a: 0x0065a08e, 0x2f6b: 0x0065a28e, + 0x2f6c: 0x0065a48e, 0x2f6d: 0x0065a68e, 0x2f6e: 0x0065a88e, 0x2f6f: 0x0065aa8e, + 0x2f70: 0xe0002258, 0x2f71: 0xe000225e, 0x2f72: 0x0065ac8e, 0x2f73: 0xe000227a, + 0x2f74: 0xe0002280, 0x2f75: 0x0065ae8e, 0x2f76: 0xe000229a, 0x2f77: 0xe00022a0, + 0x2f78: 0x0065b08e, 0x2f79: 0xe00022bd, 0x2f7a: 0xe00022c3, 0x2f7b: 0x0065b28e, + 0x2f7c: 0xe00022ec, 0x2f7d: 0xe00022f2, 0x2f7e: 0x0065b48e, 0x2f7f: 0x0065b68e, + // Block 0xbe, offset 0x2f80 + 0x2f80: 0x0065b88e, 0x2f81: 0x0065ba8e, 0x2f82: 0x0065bc8e, 0x2f83: 0x0065be8d, + 0x2f84: 0x0065be8e, 0x2f85: 0x0065c08d, 0x2f86: 0x0065c08e, 0x2f87: 0x0065c48d, + 0x2f88: 0x0065c48e, 0x2f89: 0x0065c68e, 0x2f8a: 0x0065c88e, 0x2f8b: 0x0065ca8e, + 0x2f8c: 0x0065cc8e, 0x2f8d: 0x0065ce8e, 0x2f8e: 0x0065d08d, 0x2f8f: 0x0065d08e, + 0x2f90: 0x0065d28e, 0x2f91: 0x0065d48e, 0x2f92: 0x0065d68e, 0x2f93: 0x0065d88e, + 0x2f94: 0xe000214c, 0x2f95: 0x0065828d, 0x2f96: 0x0065888d, + 0x2f99: 0xa0812802, 0x2f9a: 0xa0812902, 0x2f9b: 0x40063c20, + 0x2f9c: 0x40063e20, 0x2f9d: 0x4027d420, 0x2f9e: 0xe0000158, 0x2f9f: 0xf0001616, + 0x2fa0: 0x40023c20, 0x2fa1: 0x0065768f, 0x2fa2: 0x00657691, 0x2fa3: 0x0065788f, + 0x2fa4: 0x00657891, 0x2fa5: 0x00657a8f, 0x2fa6: 0x00657a91, 0x2fa7: 0x00657e8f, + 0x2fa8: 0x00657e91, 0x2fa9: 0x0065808f, 0x2faa: 0x00658091, 0x2fab: 0x00658291, + 0x2fac: 0xe000216d, 0x2fad: 0x00658491, 0x2fae: 0xe000218b, 0x2faf: 0x00658691, + 0x2fb0: 0xe00021bb, 0x2fb1: 0x00658891, 0x2fb2: 0xe00021d9, 0x2fb3: 0x00658a91, + 0x2fb4: 0xe00021e3, 0x2fb5: 0x00658c91, 0x2fb6: 0xe00021f2, 0x2fb7: 0x00658e91, + 0x2fb8: 0xe0002203, 0x2fb9: 0x00659091, 0x2fba: 0xe0002212, 0x2fbb: 0x00659291, + 0x2fbc: 0xe0002218, 0x2fbd: 0x00659491, 0x2fbe: 0xe0002226, 0x2fbf: 0x00659691, + // Block 0xbf, offset 0x2fc0 + 0x2fc0: 0xe000222c, 0x2fc1: 0x00659891, 0x2fc2: 0xe0002237, 0x2fc3: 0x00659a8f, + 0x2fc4: 0x00659a91, 0x2fc5: 0xe000223d, 0x2fc6: 0x00659c91, 0x2fc7: 0xe0002243, + 0x2fc8: 0x00659e91, 0x2fc9: 0xe000224d, 0x2fca: 0x0065a091, 0x2fcb: 0x0065a291, + 0x2fcc: 0x0065a491, 0x2fcd: 0x0065a691, 0x2fce: 0x0065a891, 0x2fcf: 0x0065aa91, + 0x2fd0: 0xe000225b, 0x2fd1: 0xe0002261, 0x2fd2: 0x0065ac91, 0x2fd3: 0xe000227d, + 0x2fd4: 0xe0002283, 0x2fd5: 0x0065ae91, 0x2fd6: 0xe000229d, 0x2fd7: 0xe00022a3, + 0x2fd8: 0x0065b091, 0x2fd9: 0xe00022c0, 0x2fda: 0xe00022c6, 0x2fdb: 0x0065b291, + 0x2fdc: 0xe00022ef, 0x2fdd: 0xe00022f5, 0x2fde: 0x0065b491, 0x2fdf: 0x0065b691, + 0x2fe0: 0x0065b891, 0x2fe1: 0x0065ba91, 0x2fe2: 0x0065bc91, 0x2fe3: 0x0065be8f, + 0x2fe4: 0x0065be91, 0x2fe5: 0x0065c08f, 0x2fe6: 0x0065c091, 0x2fe7: 0x0065c48f, + 0x2fe8: 0x0065c491, 0x2fe9: 0x0065c691, 0x2fea: 0x0065c891, 0x2feb: 0x0065ca91, + 0x2fec: 0x0065cc91, 0x2fed: 0x0065ce91, 0x2fee: 0x0065d08f, 0x2fef: 0x0065d091, + 0x2ff0: 0x0065d291, 0x2ff1: 0x0065d491, 0x2ff2: 0x0065d691, 0x2ff3: 0x0065d891, + 0x2ff4: 0xe000214f, 0x2ff5: 0x0065828f, 0x2ff6: 0x0065888f, 0x2ff7: 0xe000236a, + 0x2ff8: 0xe0002371, 0x2ff9: 0xe0002374, 0x2ffa: 0xe0002377, 0x2ffb: 0x40023e20, + 0x2ffc: 0x4027d620, 0x2ffd: 0x4027d820, 0x2ffe: 0xe000015b, 0x2fff: 0xf0001616, + // Block 0xc0, offset 0x3000 + 0x3005: 0x4065da20, 0x3006: 0x4065dc20, 0x3007: 0x4065de20, + 0x3008: 0x4065e020, 0x3009: 0x4065e420, 0x300a: 0x4065e620, 0x300b: 0x4065e820, + 0x300c: 0x4065ea20, 0x300d: 0x4065ec20, 0x300e: 0x4065ee20, 0x300f: 0x4065f420, + 0x3010: 0x4065f620, 0x3011: 0x4065f820, 0x3012: 0x4065fa20, 0x3013: 0x4065fe20, + 0x3014: 0x40660020, 0x3015: 0x40660220, 0x3016: 0x40660420, 0x3017: 0x40660620, + 0x3018: 0x40660820, 0x3019: 0x40660a20, 0x301a: 0x40661220, 0x301b: 0x40661420, + 0x301c: 0x40661820, 0x301d: 0x40661a20, 0x301e: 0x40661e20, 0x301f: 0x40662020, + 0x3020: 0x40662220, 0x3021: 0x40662420, 0x3022: 0x40662620, 0x3023: 0x40662820, + 0x3024: 0x40662a20, 0x3025: 0x40662e20, 0x3026: 0x40663620, 0x3027: 0x40663820, + 0x3028: 0x40663a20, 0x3029: 0x40663c20, 0x302a: 0x4065e220, 0x302b: 0x4065f020, + 0x302c: 0x4065fc20, 0x302d: 0x40663e20, + 0x3031: 0x0062ac84, 0x3032: 0x0062ae84, 0x3033: 0x00646884, + 0x3034: 0x0062b084, 0x3035: 0x00646c84, 0x3036: 0x00646e84, 0x3037: 0x0062b284, + 0x3038: 0x0062b484, 0x3039: 0x0062b684, 0x303a: 0x00647484, 0x303b: 0x00647684, + 0x303c: 0x00647884, 0x303d: 0x00647a84, 0x303e: 0x00647c84, 0x303f: 0x00647e84, + // Block 0xc1, offset 0x3040 + 0x3040: 0x0062e084, 0x3041: 0x0062b884, 0x3042: 0x0062ba84, 0x3043: 0x0062bc84, + 0x3044: 0x0062ee84, 0x3045: 0x0062be84, 0x3046: 0x0062c084, 0x3047: 0x0062c284, + 0x3048: 0x0062c484, 0x3049: 0x0062c684, 0x304a: 0x0062c884, 0x304b: 0x0062ca84, + 0x304c: 0x0062cc84, 0x304d: 0x0062ce84, 0x304e: 0x0062d084, 0x304f: 0x0063a884, + 0x3050: 0x0063aa84, 0x3051: 0x0063ac84, 0x3052: 0x0063ae84, 0x3053: 0x0063b084, + 0x3054: 0x0063b284, 0x3055: 0x0063b484, 0x3056: 0x0063b684, 0x3057: 0x0063b884, + 0x3058: 0x0063ba84, 0x3059: 0x0063bc84, 0x305a: 0x0063be84, 0x305b: 0x0063c084, + 0x305c: 0x0063c284, 0x305d: 0x0063c484, 0x305e: 0x0063c684, 0x305f: 0x0063c884, + 0x3060: 0x0063ca84, 0x3061: 0x0063cc84, 0x3062: 0x0063ce84, 0x3063: 0x0063d084, + 0x3064: 0x0063a684, 0x3065: 0x0062d484, 0x3066: 0x0062d684, 0x3067: 0x0064a284, + 0x3068: 0x0064a484, 0x3069: 0x0064ac84, 0x306a: 0x0064b084, 0x306b: 0x0064ba84, + 0x306c: 0x0064c284, 0x306d: 0x0064c684, 0x306e: 0x0062e484, 0x306f: 0x0064ce84, + 0x3070: 0x0064d284, 0x3071: 0x0062e684, 0x3072: 0x0062e884, 0x3073: 0x0062ec84, + 0x3074: 0x0062f084, 0x3075: 0x0062f284, 0x3076: 0x0062fa84, 0x3077: 0x0062fe84, + 0x3078: 0x00630284, 0x3079: 0x00630484, 0x307a: 0x00630684, 0x307b: 0x00630884, + 0x307c: 0x00630a84, 0x307d: 0x00631084, 0x307e: 0x00631884, 0x307f: 0x00632c84, + // Block 0xc2, offset 0x3080 + 0x3080: 0x00633a84, 0x3081: 0x00634484, 0x3082: 0x0064f684, 0x3083: 0x0064f884, + 0x3084: 0x00635a84, 0x3085: 0x00635c84, 0x3086: 0x00635e84, 0x3087: 0x0063ee84, + 0x3088: 0x0063f084, 0x3089: 0x0063f684, 0x308a: 0x00640884, 0x308b: 0x00640a84, + 0x308c: 0x00640e84, 0x308d: 0x00642284, 0x308e: 0x00642884, + 0x3090: 0x4027a820, 0x3091: 0x4027aa20, 0x3092: 0x029c0094, 0x3093: 0x029d1894, + 0x3094: 0x029c1294, 0x3095: 0x02adb694, 0x3096: 0x029c1494, 0x3097: 0x029c5a94, + 0x3098: 0x029c1694, 0x3099: 0x02ea6494, 0x309a: 0x029cb294, 0x309b: 0x029c3294, + 0x309c: 0x029c0294, 0x309d: 0x02b25294, 0x309e: 0x02ae6094, 0x309f: 0x029d7494, + 0x30a0: 0xe000237a, 0x30a1: 0xe0002383, 0x30a2: 0xe0002380, 0x30a3: 0xe000237d, + 0x30a4: 0x40661c20, 0x30a5: 0xe000238c, 0x30a6: 0x40661620, 0x30a7: 0xe0002389, + 0x30a8: 0xe000239e, 0x30a9: 0xe0002386, 0x30aa: 0xe0002395, 0x30ab: 0xe000239b, + 0x30ac: 0x40663420, 0x30ad: 0x4065f220, 0x30ae: 0xe000238f, 0x30af: 0xe0002392, + 0x30b0: 0x40663020, 0x30b1: 0x40663220, 0x30b2: 0x40662c20, 0x30b3: 0xe0002398, + 0x30b4: 0x0065dc99, 0x30b5: 0x0065e699, 0x30b6: 0x0065ee99, 0x30b7: 0x0065f499, + 0x30b8: 0x40660c20, 0x30b9: 0x40660e20, 0x30ba: 0x40661020, + // Block 0xc3, offset 0x30c0 + 0x30c0: 0x40275220, 0x30c1: 0x40275420, 0x30c2: 0x40275620, 0x30c3: 0x40275820, + 0x30c4: 0x40275a20, 0x30c5: 0x40275c20, 0x30c6: 0x40275e20, 0x30c7: 0x40276020, + 0x30c8: 0x40276220, 0x30c9: 0x40276420, 0x30ca: 0x40276620, 0x30cb: 0x40276820, + 0x30cc: 0x40276a20, 0x30cd: 0x40276c20, 0x30ce: 0x40276e20, 0x30cf: 0x40277020, + 0x30d0: 0x40277220, 0x30d1: 0x40277420, 0x30d2: 0x40277620, 0x30d3: 0x40277820, + 0x30d4: 0x40277a20, 0x30d5: 0x40277c20, 0x30d6: 0x40277e20, 0x30d7: 0x40278020, + 0x30d8: 0x40278220, 0x30d9: 0x40278420, 0x30da: 0x40278620, 0x30db: 0x40278820, + 0x30dc: 0x40278a20, 0x30dd: 0x40278c20, 0x30de: 0x40278e20, 0x30df: 0x40279020, + 0x30e0: 0x40279220, 0x30e1: 0x40279420, 0x30e2: 0x40279620, 0x30e3: 0x40279820, + 0x30f0: 0x0065868f, 0x30f1: 0x00658e8f, 0x30f2: 0x0065908f, 0x30f3: 0x00659e8f, + 0x30f4: 0x0065a48f, 0x30f5: 0x0065aa8f, 0x30f6: 0x0065ac8f, 0x30f7: 0x0065ae8f, + 0x30f8: 0x0065b08f, 0x30f9: 0x0065b28f, 0x30fa: 0x0065b88f, 0x30fb: 0x0065c68f, + 0x30fc: 0x0065c88f, 0x30fd: 0x0065ca8f, 0x30fe: 0x0065cc8f, 0x30ff: 0x0065ce8f, + // Block 0xc4, offset 0x3100 + 0x3100: 0xf0000404, 0x3101: 0xf0000404, 0x3102: 0xf0000404, 0x3103: 0xf0000404, + 0x3104: 0xf0000404, 0x3105: 0xf0000404, 0x3106: 0xf0000404, 0x3107: 0xf0000404, + 0x3108: 0xf0000404, 0x3109: 0xf0000404, 0x310a: 0xf0000404, 0x310b: 0xf0000404, + 0x310c: 0xf0000404, 0x310d: 0xf0000404, 0x310e: 0xe000004c, 0x310f: 0xe0000051, + 0x3110: 0xe0000056, 0x3111: 0xe000005b, 0x3112: 0xe0000060, 0x3113: 0xe0000065, + 0x3114: 0xe000006a, 0x3115: 0xe000006f, 0x3116: 0xe0000083, 0x3117: 0xe000008d, + 0x3118: 0xe0000092, 0x3119: 0xe0000097, 0x311a: 0xe000009c, 0x311b: 0xe00000a1, + 0x311c: 0xe0000088, 0x311d: 0xe0000074, 0x311e: 0xe000007c, + 0x3120: 0xf0000404, 0x3121: 0xf0000404, 0x3122: 0xf0000404, 0x3123: 0xf0000404, + 0x3124: 0xf0000404, 0x3125: 0xf0000404, 0x3126: 0xf0000404, 0x3127: 0xf0000404, + 0x3128: 0xf0000404, 0x3129: 0xf0000404, 0x312a: 0xf0000404, 0x312b: 0xf0000404, + 0x312c: 0xf0000404, 0x312d: 0xf0000404, 0x312e: 0xf0000404, 0x312f: 0xf0000404, + 0x3130: 0xf0000404, 0x3131: 0xf0000404, 0x3132: 0xf0000404, 0x3133: 0xf0000404, + 0x3134: 0xf0000404, 0x3135: 0xf0000404, 0x3136: 0xf0000404, 0x3137: 0xf0000404, + 0x3138: 0xf0000404, 0x3139: 0xf0000404, 0x313a: 0xf0000404, 0x313b: 0xf0000404, + 0x313c: 0xf0000404, 0x313d: 0xf0000404, 0x313e: 0xf0000404, 0x313f: 0xf0000404, + // Block 0xc5, offset 0x3140 + 0x3140: 0xf0000404, 0x3141: 0xf0000404, 0x3142: 0xf0000404, 0x3143: 0xf0000404, + 0x3144: 0x02aa9e86, 0x3145: 0x02bcf886, 0x3146: 0x02cb0e86, 0x3147: 0x02f71e86, + 0x3148: 0xe00002e3, 0x3149: 0xe00003d8, 0x314a: 0xe00004b3, 0x314b: 0xe000057d, + 0x314c: 0xe0000648, 0x314d: 0xe00006f0, 0x314e: 0xe000079c, 0x314f: 0xe0000841, + 0x3150: 0xe0000ec0, 0x3151: 0xf0000606, 0x3152: 0xf0000606, 0x3153: 0xf0000606, + 0x3154: 0xf0000606, 0x3155: 0xf0000606, 0x3156: 0xf0000606, 0x3157: 0xf0000606, + 0x3158: 0xf0000606, 0x3159: 0xf0000606, 0x315a: 0xf0000606, 0x315b: 0xf0000606, + 0x315c: 0xf0000606, 0x315d: 0xf0000606, 0x315e: 0xf0000606, 0x315f: 0xf0000606, + 0x3160: 0x0062ac86, 0x3161: 0x0062b086, 0x3162: 0x0062b286, 0x3163: 0x0062b686, + 0x3164: 0x0062b886, 0x3165: 0x0062ba86, 0x3166: 0x0062be86, 0x3167: 0x0062c286, + 0x3168: 0x0062c486, 0x3169: 0x0062c886, 0x316a: 0x0062ca86, 0x316b: 0x0062cc86, + 0x316c: 0x0062ce86, 0x316d: 0x0062d086, 0x316e: 0xf0000606, 0x316f: 0xf0000606, + 0x3170: 0xf0000606, 0x3171: 0xf0000606, 0x3172: 0xf0000606, 0x3173: 0xf0000606, + 0x3174: 0xf0000606, 0x3175: 0xf0000606, 0x3176: 0xf0000606, 0x3177: 0xf0000606, + 0x3178: 0xf0000606, 0x3179: 0xf0000606, 0x317a: 0xf0000606, 0x317b: 0xf0000606, + 0x317c: 0xe0002127, 0x317d: 0xe0002122, 0x317e: 0xf0000606, 0x317f: 0x4027ac20, + // Block 0xc6, offset 0x3180 + 0x3180: 0x029c0086, 0x3181: 0x029d1886, 0x3182: 0x029c1286, 0x3183: 0x02adb686, + 0x3184: 0x029d2886, 0x3185: 0x02a2da86, 0x3186: 0x029c0686, 0x3187: 0x02a2d686, + 0x3188: 0x029cba86, 0x3189: 0x02a68286, 0x318a: 0x02ce1086, 0x318b: 0x02e0d686, + 0x318c: 0x02d86886, 0x318d: 0x02ce5086, 0x318e: 0x0323a286, 0x318f: 0x02ae3e86, + 0x3190: 0x02cbca86, 0x3191: 0x02d05486, 0x3192: 0x02ce1286, 0x3193: 0x02f27c86, + 0x3194: 0x02a81a86, 0x3195: 0x02e4f286, 0x3196: 0x03194286, 0x3197: 0x02f2ba86, + 0x3198: 0x02a56886, 0x3199: 0x02f3b086, 0x319a: 0x02ea6e86, 0x319b: 0x02b2e686, + 0x319c: 0x0320d286, 0x319d: 0x02a25486, 0x319e: 0x02a6e086, 0x319f: 0x02d9d086, + 0x31a0: 0x03300a86, 0x31a1: 0x029e2286, 0x31a2: 0x02a33286, 0x31a3: 0x02d6c686, + 0x31a4: 0x029c1486, 0x31a5: 0x029c5a86, 0x31a6: 0x029c1686, 0x31a7: 0x02bbcc86, + 0x31a8: 0x02a7e686, 0x31a9: 0x02a67686, 0x31aa: 0x02b72e86, 0x31ab: 0x02b6cc86, + 0x31ac: 0x02edc686, 0x31ad: 0x029e0286, 0x31ae: 0x03198e86, 0x31af: 0x02a6a886, + 0x31b0: 0x02b23886, 0x31b1: 0xf0000606, 0x31b2: 0xf0000606, 0x31b3: 0xf0000606, + 0x31b4: 0xf0000606, 0x31b5: 0xf0000606, 0x31b6: 0xf0000606, 0x31b7: 0xf0000606, + 0x31b8: 0xf0000606, 0x31b9: 0xf0000606, 0x31ba: 0xf0000606, 0x31bb: 0xf0000606, + 0x31bc: 0xf0000606, 0x31bd: 0xf0000606, 0x31be: 0xf0000606, 0x31bf: 0xf0000606, + // Block 0xc7, offset 0x31c0 + 0x31c0: 0xf0001f04, 0x31c1: 0xf0001f04, 0x31c2: 0xf0001f04, 0x31c3: 0xf0001f04, + 0x31c4: 0xf0001f04, 0x31c5: 0xf0001f04, 0x31c6: 0xf0001f04, 0x31c7: 0xf0001f04, + 0x31c8: 0xf0001f04, 0x31c9: 0xf0000404, 0x31ca: 0xf0000404, 0x31cb: 0xf0000404, + 0x31cc: 0xf0001c1d, 0x31cd: 0xe0000b85, 0x31ce: 0xf0001d1c, 0x31cf: 0xe0000d14, + 0x31d0: 0x00657693, 0x31d1: 0x00657893, 0x31d2: 0x00657a93, 0x31d3: 0x00657e93, + 0x31d4: 0x00658093, 0x31d5: 0x00658293, 0x31d6: 0x00658493, 0x31d7: 0x00658693, + 0x31d8: 0x00658893, 0x31d9: 0x00658a93, 0x31da: 0x00658c93, 0x31db: 0x00658e93, + 0x31dc: 0x00659093, 0x31dd: 0x00659293, 0x31de: 0x00659493, 0x31df: 0x00659693, + 0x31e0: 0x00659893, 0x31e1: 0x00659a93, 0x31e2: 0x00659c93, 0x31e3: 0x00659e93, + 0x31e4: 0x0065a093, 0x31e5: 0x0065a293, 0x31e6: 0x0065a493, 0x31e7: 0x0065a693, + 0x31e8: 0x0065a893, 0x31e9: 0x0065aa93, 0x31ea: 0x0065ac93, 0x31eb: 0x0065ae93, + 0x31ec: 0x0065b093, 0x31ed: 0x0065b293, 0x31ee: 0x0065b493, 0x31ef: 0x0065b693, + 0x31f0: 0x0065b893, 0x31f1: 0x0065ba93, 0x31f2: 0x0065bc93, 0x31f3: 0x0065be93, + 0x31f4: 0x0065c093, 0x31f5: 0x0065c493, 0x31f6: 0x0065c693, 0x31f7: 0x0065c893, + 0x31f8: 0x0065ca93, 0x31f9: 0x0065cc93, 0x31fa: 0x0065ce93, 0x31fb: 0x0065d093, + 0x31fc: 0x0065d293, 0x31fd: 0x0065d493, 0x31fe: 0x0065d693, + // Block 0xc8, offset 0x3200 + 0x3200: 0xe0002131, 0x3201: 0xe0002137, 0x3202: 0xe000213c, 0x3203: 0xe000212d, + 0x3204: 0xe0002142, 0x3205: 0xe0002148, 0x3206: 0xe0002152, 0x3207: 0xe000215b, + 0x3208: 0xe0002156, 0x3209: 0xe0002166, 0x320a: 0xe0002162, 0x320b: 0xe0002170, + 0x320c: 0xe0002174, 0x320d: 0xe0002179, 0x320e: 0xe000217e, 0x320f: 0xe0002183, + 0x3210: 0xe000218e, 0x3211: 0xe0002193, 0x3212: 0xe0002198, 0x3213: 0xe000219d, + 0x3214: 0xf0001c1c, 0x3215: 0xe00021a4, 0x3216: 0xe00021ab, 0x3217: 0xe00021b2, + 0x3218: 0xe00021be, 0x3219: 0xe00021c3, 0x321a: 0xe00021ca, 0x321b: 0xe00021d1, + 0x321c: 0xe00021dc, 0x321d: 0xe00021eb, 0x321e: 0xe00021e6, 0x321f: 0xe00021f5, + 0x3220: 0xe00021fa, 0x3221: 0xe0002209, 0x3222: 0xe000221b, 0x3223: 0xe000221f, + 0x3224: 0xe000222f, 0x3225: 0xe0002246, 0x3226: 0xe0002250, 0x3227: 0xf0001c1c, + 0x3228: 0xf0001c1c, 0x3229: 0xe0002254, 0x322a: 0xe0002276, 0x322b: 0xe0002264, + 0x322c: 0xe000226b, 0x322d: 0xe0002270, 0x322e: 0xe0002286, 0x322f: 0xe000228d, + 0x3230: 0xe0002292, 0x3231: 0xe0002296, 0x3232: 0xe00022a6, 0x3233: 0xe00022ad, + 0x3234: 0xe00022b2, 0x3235: 0xe00022b9, 0x3236: 0xe00022d4, 0x3237: 0xe00022da, + 0x3238: 0xe00022de, 0x3239: 0xe00022e3, 0x323a: 0xe00022e7, 0x323b: 0xe00022c9, + 0x323c: 0xe00022cf, 0x323d: 0xe0002300, 0x323e: 0xe0002306, 0x323f: 0xf0001c1c, + // Block 0xc9, offset 0x3240 + 0x3240: 0xe000230b, 0x3241: 0xe00022f8, 0x3242: 0xe00022fc, 0x3243: 0xe0002311, + 0x3244: 0xe0002316, 0x3245: 0xe000231d, 0x3246: 0xe0002321, 0x3247: 0xe0002325, + 0x3248: 0xe000232b, 0x3249: 0xf0001c1c, 0x324a: 0xe0002330, 0x324b: 0xe000233c, + 0x324c: 0xe0002340, 0x324d: 0xe0002337, 0x324e: 0xe0002346, 0x324f: 0xe000234b, + 0x3250: 0xe000234f, 0x3251: 0xe0002353, 0x3252: 0xf0001c1c, 0x3253: 0xe000235e, + 0x3254: 0xe0002358, 0x3255: 0xf0001c1c, 0x3256: 0xe0002363, 0x3257: 0xe000236d, + 0x3258: 0xf0001f04, 0x3259: 0xf0001f04, 0x325a: 0xf0001f04, 0x325b: 0xf0001f04, + 0x325c: 0xf0001f04, 0x325d: 0xf0001f04, 0x325e: 0xf0001f04, 0x325f: 0xf0001f04, + 0x3260: 0xf0001f04, 0x3261: 0xf0001f04, 0x3262: 0xf0000404, 0x3263: 0xf0000404, + 0x3264: 0xf0000404, 0x3265: 0xf0000404, 0x3266: 0xf0000404, 0x3267: 0xf0000404, + 0x3268: 0xf0000404, 0x3269: 0xf0000404, 0x326a: 0xf0000404, 0x326b: 0xf0000404, + 0x326c: 0xf0000404, 0x326d: 0xf0000404, 0x326e: 0xf0000404, 0x326f: 0xf0000404, + 0x3270: 0xf0000404, 0x3271: 0xe0000c1e, 0x3272: 0xf0001c1c, 0x3273: 0xf0001d1d, + 0x3274: 0xe0000a31, 0x3275: 0xf0001d1c, 0x3276: 0xf0001c1c, 0x3277: 0xf0001c1c, + 0x3278: 0xe0000ac2, 0x3279: 0xe0000ac6, 0x327a: 0xf0001d1d, 0x327b: 0xf0001c1c, + 0x327c: 0xf0001c1c, 0x327d: 0xf0001c1c, 0x327e: 0xf0001c1c, 0x327f: 0xe0002431, + // Block 0xca, offset 0x3280 + 0x3280: 0xf0001d1c, 0x3281: 0xf0001d1c, 0x3282: 0xf0001d1c, 0x3283: 0xf0001d1c, + 0x3284: 0xf0001d1c, 0x3285: 0xf0001d1d, 0x3286: 0xf0001d1d, 0x3287: 0xf0001d1d, + 0x3288: 0xe0000a6b, 0x3289: 0xe0000cb4, 0x328a: 0xf0001d1c, 0x328b: 0xf0001d1c, + 0x328c: 0xf0001d1c, 0x328d: 0xf0001c1c, 0x328e: 0xf0001c1c, 0x328f: 0xf0001c1c, + 0x3290: 0xf0001c1d, 0x3291: 0xe0000cb9, 0x3292: 0xe0000d36, 0x3293: 0xe0000be3, + 0x3294: 0xe0000fc5, 0x3295: 0xf0001c1c, 0x3296: 0xf0001c1c, 0x3297: 0xf0001c1c, + 0x3298: 0xf0001c1c, 0x3299: 0xf0001c1c, 0x329a: 0xf0001c1c, 0x329b: 0xf0001c1c, + 0x329c: 0xf0001c1c, 0x329d: 0xf0001c1c, 0x329e: 0xf0001c1c, 0x329f: 0xe0000d3e, + 0x32a0: 0xe0000a72, 0x32a1: 0xf0001c1c, 0x32a2: 0xe0000cbd, 0x32a3: 0xe0000d42, + 0x32a4: 0xe0000a76, 0x32a5: 0xf0001c1c, 0x32a6: 0xe0000cc1, 0x32a7: 0xe0000d2d, + 0x32a8: 0xe0000d31, 0x32a9: 0xf0001c1d, 0x32aa: 0xe0000cc5, 0x32ab: 0xe0000d4a, + 0x32ac: 0xe0000be7, 0x32ad: 0xe0000f0b, 0x32ae: 0xe0000f0f, 0x32af: 0xe0000f15, + 0x32b0: 0xf0001c1c, 0x32b1: 0xf0001c1c, 0x32b2: 0xf0001c1c, 0x32b3: 0xf0001c1c, + 0x32b4: 0xf0001d1c, 0x32b5: 0xf0001d1c, 0x32b6: 0xf0001d1c, 0x32b7: 0xf0001d1c, + 0x32b8: 0xf0001d1c, 0x32b9: 0xf0001d1d, 0x32ba: 0xf0001d1c, 0x32bb: 0xf0001d1c, + 0x32bc: 0xf0001d1c, 0x32bd: 0xf0001d1c, 0x32be: 0xf0001d1c, 0x32bf: 0xf0001d1d, + // Block 0xcb, offset 0x32c0 + 0x32c0: 0xf0001d1c, 0x32c1: 0xf0001d1d, 0x32c2: 0xe00009b7, 0x32c3: 0xf0001c1d, + 0x32c4: 0xf0001c1c, 0x32c5: 0xf0001c1c, 0x32c6: 0xe0000a66, 0x32c7: 0xe0000a7a, + 0x32c8: 0xf0001d1c, 0x32c9: 0xf0001c1d, 0x32ca: 0xf0001c1c, 0x32cb: 0xf0001d1d, + 0x32cc: 0xf0001c1c, 0x32cd: 0xf0001d1d, 0x32ce: 0xf0001d1d, 0x32cf: 0xf0001c1c, + 0x32d0: 0xf0001c1c, 0x32d1: 0xf0001c1c, 0x32d2: 0xe0000d0d, 0x32d3: 0xf0001c1c, + 0x32d4: 0xf0001c1c, 0x32d5: 0xe0000d3a, 0x32d6: 0xe0000d46, 0x32d7: 0xf0001d1d, + 0x32d8: 0xe0000eb0, 0x32d9: 0xe0000eb8, 0x32da: 0xf0001d1d, 0x32db: 0xf0001c1c, + 0x32dc: 0xf0001c1d, 0x32dd: 0xf0001c1d, 0x32de: 0xe00010b2, 0x32df: 0xe00009c8, + 0x32e0: 0xf0001f04, 0x32e1: 0xf0001f04, 0x32e2: 0xf0001f04, 0x32e3: 0xf0001f04, + 0x32e4: 0xf0001f04, 0x32e5: 0xf0001f04, 0x32e6: 0xf0001f04, 0x32e7: 0xf0001f04, + 0x32e8: 0xf0001f04, 0x32e9: 0xf0000404, 0x32ea: 0xf0000404, 0x32eb: 0xf0000404, + 0x32ec: 0xf0000404, 0x32ed: 0xf0000404, 0x32ee: 0xf0000404, 0x32ef: 0xf0000404, + 0x32f0: 0xf0000404, 0x32f1: 0xf0000404, 0x32f2: 0xf0000404, 0x32f3: 0xf0000404, + 0x32f4: 0xf0000404, 0x32f5: 0xf0000404, 0x32f6: 0xf0000404, 0x32f7: 0xf0000404, + 0x32f8: 0xf0000404, 0x32f9: 0xf0000404, 0x32fa: 0xf0000404, 0x32fb: 0xf0000404, + 0x32fc: 0xf0000404, 0x32fd: 0xf0000404, 0x32fe: 0xf0000404, 0x32ff: 0xe0000bdf, + // Block 0xcc, offset 0x3300 + 0x3300: 0x40196220, 0x3301: 0x40196420, 0x3302: 0x40196620, 0x3303: 0x40196820, + 0x3304: 0x40196a20, 0x3305: 0x40196c20, 0x3306: 0x40196e20, 0x3307: 0x40197020, + 0x3308: 0x40197220, 0x3309: 0x40197420, 0x330a: 0x40197620, 0x330b: 0x40197820, + 0x330c: 0x40197a20, 0x330d: 0x40197c20, 0x330e: 0x40197e20, 0x330f: 0x40198020, + 0x3310: 0x40198220, 0x3311: 0x40198420, 0x3312: 0x40198620, 0x3313: 0x40198820, + 0x3314: 0x40198a20, 0x3315: 0x40198c20, 0x3316: 0x40198e20, 0x3317: 0x40199020, + 0x3318: 0x40199220, 0x3319: 0x40199420, 0x331a: 0x40199620, 0x331b: 0x40199820, + 0x331c: 0x40199a20, 0x331d: 0x40199c20, 0x331e: 0x40199e20, 0x331f: 0x4019a020, + 0x3320: 0x4019a220, 0x3321: 0x4019a420, 0x3322: 0x4019a620, 0x3323: 0x4019a820, + 0x3324: 0x4019aa20, 0x3325: 0x4019ac20, 0x3326: 0x4019ae20, 0x3327: 0x4019b020, + 0x3328: 0x4019b220, 0x3329: 0x4019b420, 0x332a: 0x4019b620, 0x332b: 0x4019b820, + 0x332c: 0x4019ba20, 0x332d: 0x4019bc20, 0x332e: 0x4019be20, 0x332f: 0x4019c020, + 0x3330: 0x4019c220, 0x3331: 0x4019c420, 0x3332: 0x4019c620, 0x3333: 0x4019c820, + 0x3334: 0x4019ca20, 0x3335: 0x4019cc20, 0x3336: 0x4019ce20, 0x3337: 0x4019d020, + 0x3338: 0x4019d220, 0x3339: 0x4019d420, 0x333a: 0x4019d620, 0x333b: 0x4019d820, + 0x333c: 0x4019da20, 0x333d: 0x4019dc20, 0x333e: 0x4019de20, 0x333f: 0x4019e020, + // Block 0xcd, offset 0x3340 + 0x3340: 0x40664020, 0x3341: 0x40664220, 0x3342: 0x40664420, 0x3343: 0x40664620, + 0x3344: 0x40664820, 0x3345: 0x40664a20, 0x3346: 0x40664c20, 0x3347: 0x40664e20, + 0x3348: 0x40665020, 0x3349: 0x40665220, 0x334a: 0x40665420, 0x334b: 0x40665620, + 0x334c: 0x40665820, 0x334d: 0x40665a20, 0x334e: 0x40665c20, 0x334f: 0x40665e20, + 0x3350: 0x40666020, 0x3351: 0x40666220, 0x3352: 0x40666420, 0x3353: 0x40666620, + 0x3354: 0x40666820, 0x3355: 0x40666a20, 0x3356: 0x40666c20, 0x3357: 0x40666e20, + 0x3358: 0x40667020, 0x3359: 0x40667220, 0x335a: 0x40667420, 0x335b: 0x40667620, + 0x335c: 0x40667820, 0x335d: 0x40667a20, 0x335e: 0x40667c20, 0x335f: 0x40667e20, + 0x3360: 0x40668020, 0x3361: 0x40668220, 0x3362: 0x40668420, 0x3363: 0x40668620, + 0x3364: 0x40668820, 0x3365: 0x40668a20, 0x3366: 0x40668c20, 0x3367: 0x40668e20, + 0x3368: 0x40669020, 0x3369: 0x40669220, 0x336a: 0x40669420, 0x336b: 0x40669620, + 0x336c: 0x40669820, 0x336d: 0x40669a20, 0x336e: 0x40669c20, 0x336f: 0x40669e20, + 0x3370: 0x4066a020, 0x3371: 0x4066a220, 0x3372: 0x4066a420, 0x3373: 0x4066a620, + 0x3374: 0x4066a820, 0x3375: 0x4066aa20, 0x3376: 0x4066ac20, 0x3377: 0x4066ae20, + 0x3378: 0x4066b020, 0x3379: 0x4066b220, 0x337a: 0x4066b420, 0x337b: 0x4066b620, + 0x337c: 0x4066b820, 0x337d: 0x4066ba20, 0x337e: 0x4066bc20, 0x337f: 0x4066be20, + // Block 0xce, offset 0x3380 + 0x3380: 0x4066c020, 0x3381: 0x4066c220, 0x3382: 0x4066c420, 0x3383: 0x4066c620, + 0x3384: 0x4066c820, 0x3385: 0x4066ca20, 0x3386: 0x4066cc20, 0x3387: 0x4066ce20, + 0x3388: 0x4066d020, 0x3389: 0x4066d220, 0x338a: 0x4066d420, 0x338b: 0x4066d620, + 0x338c: 0x4066d820, 0x338d: 0x4066da20, 0x338e: 0x4066dc20, 0x338f: 0x4066de20, + 0x3390: 0x4066e020, 0x3391: 0x4066e220, 0x3392: 0x4066e420, 0x3393: 0x4066e620, + 0x3394: 0x4066e820, 0x3395: 0x4066ea20, 0x3396: 0x4066ec20, 0x3397: 0x4066ee20, + 0x3398: 0x4066f020, 0x3399: 0x4066f220, 0x339a: 0x4066f420, 0x339b: 0x4066f620, + 0x339c: 0x4066f820, 0x339d: 0x4066fa20, 0x339e: 0x4066fc20, 0x339f: 0x4066fe20, + 0x33a0: 0x40670020, 0x33a1: 0x40670220, 0x33a2: 0x40670420, 0x33a3: 0x40670620, + 0x33a4: 0x40670820, 0x33a5: 0x40670a20, 0x33a6: 0x40670c20, 0x33a7: 0x40670e20, + 0x33a8: 0x40671020, 0x33a9: 0x40671220, 0x33aa: 0x40671420, 0x33ab: 0x40671620, + 0x33ac: 0x40671820, 0x33ad: 0x40671a20, 0x33ae: 0x40671c20, 0x33af: 0x40671e20, + 0x33b0: 0x40672020, 0x33b1: 0x40672220, 0x33b2: 0x40672420, 0x33b3: 0x40672620, + 0x33b4: 0x40672820, 0x33b5: 0x40672a20, 0x33b6: 0x40672c20, 0x33b7: 0x40672e20, + 0x33b8: 0x40673020, 0x33b9: 0x40673220, 0x33ba: 0x40673420, 0x33bb: 0x40673620, + 0x33bc: 0x40673820, 0x33bd: 0x40673a20, 0x33be: 0x40673c20, 0x33bf: 0x40673e20, + // Block 0xcf, offset 0x33c0 + 0x33c0: 0x40674020, 0x33c1: 0x40674220, 0x33c2: 0x40674420, 0x33c3: 0x40674620, + 0x33c4: 0x40674820, 0x33c5: 0x40674a20, 0x33c6: 0x40674c20, 0x33c7: 0x40674e20, + 0x33c8: 0x40675020, 0x33c9: 0x40675220, 0x33ca: 0x40675420, 0x33cb: 0x40675620, + 0x33cc: 0x40675820, 0x33cd: 0x40675a20, 0x33ce: 0x40675c20, 0x33cf: 0x40675e20, + 0x33d0: 0x40676020, 0x33d1: 0x40676220, 0x33d2: 0x40676420, 0x33d3: 0x40676620, + 0x33d4: 0x40676820, 0x33d5: 0x40676a20, 0x33d6: 0x40676c20, 0x33d7: 0x40676e20, + 0x33d8: 0x40677020, 0x33d9: 0x40677220, 0x33da: 0x40677420, 0x33db: 0x40677620, + 0x33dc: 0x40677820, 0x33dd: 0x40677a20, 0x33de: 0x40677c20, 0x33df: 0x40677e20, + 0x33e0: 0x40678020, 0x33e1: 0x40678220, 0x33e2: 0x40678420, 0x33e3: 0x40678620, + 0x33e4: 0x40678820, 0x33e5: 0x40678a20, 0x33e6: 0x40678c20, 0x33e7: 0x40678e20, + 0x33e8: 0x40679020, 0x33e9: 0x40679220, 0x33ea: 0x40679420, 0x33eb: 0x40679620, + 0x33ec: 0x40679820, 0x33ed: 0x40679a20, 0x33ee: 0x40679c20, 0x33ef: 0x40679e20, + 0x33f0: 0x4067a020, 0x33f1: 0x4067a220, 0x33f2: 0x4067a420, 0x33f3: 0x4067a620, + 0x33f4: 0x4067a820, 0x33f5: 0x4067aa20, 0x33f6: 0x4067ac20, 0x33f7: 0x4067ae20, + 0x33f8: 0x4067b020, 0x33f9: 0x4067b220, 0x33fa: 0x4067b420, 0x33fb: 0x4067b620, + 0x33fc: 0x4067b820, 0x33fd: 0x4067ba20, 0x33fe: 0x4067bc20, 0x33ff: 0x4067be20, + // Block 0xd0, offset 0x3400 + 0x3400: 0x4067c020, 0x3401: 0x4067c220, 0x3402: 0x4067c420, 0x3403: 0x4067c620, + 0x3404: 0x4067c820, 0x3405: 0x4067ca20, 0x3406: 0x4067cc20, 0x3407: 0x4067ce20, + 0x3408: 0x4067d020, 0x3409: 0x4067d220, 0x340a: 0x4067d420, 0x340b: 0x4067d620, + 0x340c: 0x4067d820, 0x340d: 0x4067da20, 0x340e: 0x4067dc20, 0x340f: 0x4067de20, + 0x3410: 0x4067e020, 0x3411: 0x4067e220, 0x3412: 0x4067e420, 0x3413: 0x4067e620, + 0x3414: 0x4067e820, 0x3415: 0x4067ea20, 0x3416: 0x4067ec20, 0x3417: 0x4067ee20, + 0x3418: 0x4067f020, 0x3419: 0x4067f220, 0x341a: 0x4067f420, 0x341b: 0x4067f620, + 0x341c: 0x4067f820, 0x341d: 0x4067fa20, 0x341e: 0x4067fc20, 0x341f: 0x4067fe20, + 0x3420: 0x40680020, 0x3421: 0x40680220, 0x3422: 0x40680420, 0x3423: 0x40680620, + 0x3424: 0x40680820, 0x3425: 0x40680a20, 0x3426: 0x40680c20, 0x3427: 0x40680e20, + 0x3428: 0x40681020, 0x3429: 0x40681220, 0x342a: 0x40681420, 0x342b: 0x40681620, + 0x342c: 0x40681820, 0x342d: 0x40681a20, 0x342e: 0x40681c20, 0x342f: 0x40681e20, + 0x3430: 0x40682020, 0x3431: 0x40682220, 0x3432: 0x40682420, 0x3433: 0x40682620, + 0x3434: 0x40682820, 0x3435: 0x40682a20, 0x3436: 0x40682c20, 0x3437: 0x40682e20, + 0x3438: 0x40683020, 0x3439: 0x40683220, 0x343a: 0x40683420, 0x343b: 0x40683620, + 0x343c: 0x40683820, 0x343d: 0x40683a20, 0x343e: 0x40683c20, 0x343f: 0x40683e20, + // Block 0xd1, offset 0x3440 + 0x3440: 0x40684020, 0x3441: 0x40684220, 0x3442: 0x40684420, 0x3443: 0x40684620, + 0x3444: 0x40684820, 0x3445: 0x40684a20, 0x3446: 0x40684c20, 0x3447: 0x40684e20, + 0x3448: 0x40685020, 0x3449: 0x40685220, 0x344a: 0x40685420, 0x344b: 0x40685620, + 0x344c: 0x40685820, 0x344d: 0x40685a20, 0x344e: 0x40685c20, 0x344f: 0x40685e20, + 0x3450: 0x40686020, 0x3451: 0x40686220, 0x3452: 0x40686420, 0x3453: 0x40686620, + 0x3454: 0x40686820, 0x3455: 0x40686a20, 0x3456: 0x40686c20, 0x3457: 0x40686e20, + 0x3458: 0x40687020, 0x3459: 0x40687220, 0x345a: 0x40687420, 0x345b: 0x40687620, + 0x345c: 0x40687820, 0x345d: 0x40687a20, 0x345e: 0x40687c20, 0x345f: 0x40687e20, + 0x3460: 0x40688020, 0x3461: 0x40688220, 0x3462: 0x40688420, 0x3463: 0x40688620, + 0x3464: 0x40688820, 0x3465: 0x40688a20, 0x3466: 0x40688c20, 0x3467: 0x40688e20, + 0x3468: 0x40689020, 0x3469: 0x40689220, 0x346a: 0x40689420, 0x346b: 0x40689620, + 0x346c: 0x40689820, 0x346d: 0x40689a20, 0x346e: 0x40689c20, 0x346f: 0x40689e20, + 0x3470: 0x4068a020, 0x3471: 0x4068a220, 0x3472: 0x4068a420, 0x3473: 0x4068a620, + 0x3474: 0x4068a820, 0x3475: 0x4068aa20, 0x3476: 0x4068ac20, 0x3477: 0x4068ae20, + 0x3478: 0x4068b020, 0x3479: 0x4068b220, 0x347a: 0x4068b420, 0x347b: 0x4068b620, + 0x347c: 0x4068b820, 0x347d: 0x4068ba20, 0x347e: 0x4068bc20, 0x347f: 0x4068be20, + // Block 0xd2, offset 0x3480 + 0x3480: 0x4068c020, 0x3481: 0x4068c220, 0x3482: 0x4068c420, 0x3483: 0x4068c620, + 0x3484: 0x4068c820, 0x3485: 0x4068ca20, 0x3486: 0x4068cc20, 0x3487: 0x4068ce20, + 0x3488: 0x4068d020, 0x3489: 0x4068d220, 0x348a: 0x4068d420, 0x348b: 0x4068d620, + 0x348c: 0x4068d820, 0x348d: 0x4068da20, 0x348e: 0x4068dc20, 0x348f: 0x4068de20, + 0x3490: 0x4068e020, 0x3491: 0x4068e220, 0x3492: 0x4068e420, 0x3493: 0x4068e620, + 0x3494: 0x4068e820, 0x3495: 0x4068ea20, 0x3496: 0x4068ec20, 0x3497: 0x4068ee20, + 0x3498: 0x4068f020, 0x3499: 0x4068f220, 0x349a: 0x4068f420, 0x349b: 0x4068f620, + 0x349c: 0x4068f820, 0x349d: 0x4068fa20, 0x349e: 0x4068fc20, 0x349f: 0x4068fe20, + 0x34a0: 0x40690020, 0x34a1: 0x40690220, 0x34a2: 0x40690420, 0x34a3: 0x40690620, + 0x34a4: 0x40690820, 0x34a5: 0x40690a20, 0x34a6: 0x40690c20, 0x34a7: 0x40690e20, + 0x34a8: 0x40691020, 0x34a9: 0x40691220, 0x34aa: 0x40691420, 0x34ab: 0x40691620, + 0x34ac: 0x40691820, 0x34ad: 0x40691a20, 0x34ae: 0x40691c20, 0x34af: 0x40691e20, + 0x34b0: 0x40692020, 0x34b1: 0x40692220, 0x34b2: 0x40692420, 0x34b3: 0x40692620, + 0x34b4: 0x40692820, 0x34b5: 0x40692a20, 0x34b6: 0x40692c20, 0x34b7: 0x40692e20, + 0x34b8: 0x40693020, 0x34b9: 0x40693220, 0x34ba: 0x40693420, 0x34bb: 0x40693620, + 0x34bc: 0x40693820, 0x34bd: 0x40693a20, 0x34be: 0x40693c20, 0x34bf: 0x40693e20, + // Block 0xd3, offset 0x34c0 + 0x34c0: 0x40694020, 0x34c1: 0x40694220, 0x34c2: 0x40694420, 0x34c3: 0x40694620, + 0x34c4: 0x40694820, 0x34c5: 0x40694a20, 0x34c6: 0x40694c20, 0x34c7: 0x40694e20, + 0x34c8: 0x40695020, 0x34c9: 0x40695220, 0x34ca: 0x40695420, 0x34cb: 0x40695620, + 0x34cc: 0x40695820, 0x34cd: 0x40695a20, 0x34ce: 0x40695c20, 0x34cf: 0x40695e20, + 0x34d0: 0x40696020, 0x34d1: 0x40696220, 0x34d2: 0x40696420, 0x34d3: 0x40696620, + 0x34d4: 0x40696820, 0x34d5: 0x40696a20, 0x34d6: 0x40696c20, 0x34d7: 0x40696e20, + 0x34d8: 0x40697020, 0x34d9: 0x40697220, 0x34da: 0x40697420, 0x34db: 0x40697620, + 0x34dc: 0x40697820, 0x34dd: 0x40697a20, 0x34de: 0x40697c20, 0x34df: 0x40697e20, + 0x34e0: 0x40698020, 0x34e1: 0x40698220, 0x34e2: 0x40698420, 0x34e3: 0x40698620, + 0x34e4: 0x40698820, 0x34e5: 0x40698a20, 0x34e6: 0x40698c20, 0x34e7: 0x40698e20, + 0x34e8: 0x40699020, 0x34e9: 0x40699220, 0x34ea: 0x40699420, 0x34eb: 0x40699620, + 0x34ec: 0x40699820, 0x34ed: 0x40699a20, 0x34ee: 0x40699c20, 0x34ef: 0x40699e20, + 0x34f0: 0x4069a020, 0x34f1: 0x4069a220, 0x34f2: 0x4069a420, 0x34f3: 0x4069a620, + 0x34f4: 0x4069a820, 0x34f5: 0x4069aa20, 0x34f6: 0x4069ac20, 0x34f7: 0x4069ae20, + 0x34f8: 0x4069b020, 0x34f9: 0x4069b220, 0x34fa: 0x4069b420, 0x34fb: 0x4069b620, + 0x34fc: 0x4069b820, 0x34fd: 0x4069ba20, 0x34fe: 0x4069bc20, 0x34ff: 0x4069be20, + // Block 0xd4, offset 0x3500 + 0x3500: 0x4069c020, 0x3501: 0x4069c220, 0x3502: 0x4069c420, 0x3503: 0x4069c620, + 0x3504: 0x4069c820, 0x3505: 0x4069ca20, 0x3506: 0x4069cc20, 0x3507: 0x4069ce20, + 0x3508: 0x4069d020, 0x3509: 0x4069d220, 0x350a: 0x4069d420, 0x350b: 0x4069d620, + 0x350c: 0x4069d820, 0x350d: 0x4069da20, 0x350e: 0x4069dc20, 0x350f: 0x4069de20, + 0x3510: 0x4069e020, 0x3511: 0x4069e220, 0x3512: 0x4069e420, 0x3513: 0x4069e620, + 0x3514: 0x4069e820, 0x3515: 0x4069ea20, 0x3516: 0x4069ec20, 0x3517: 0x4069ee20, + 0x3518: 0x4069f020, 0x3519: 0x4069f220, 0x351a: 0x4069f420, 0x351b: 0x4069f620, + 0x351c: 0x4069f820, 0x351d: 0x4069fa20, 0x351e: 0x4069fc20, 0x351f: 0x4069fe20, + 0x3520: 0x406a0020, 0x3521: 0x406a0220, 0x3522: 0x406a0420, 0x3523: 0x406a0620, + 0x3524: 0x406a0820, 0x3525: 0x406a0a20, 0x3526: 0x406a0c20, 0x3527: 0x406a0e20, + 0x3528: 0x406a1020, 0x3529: 0x406a1220, 0x352a: 0x406a1420, 0x352b: 0x406a1620, + 0x352c: 0x406a1820, 0x352d: 0x406a1a20, 0x352e: 0x406a1c20, 0x352f: 0x406a1e20, + 0x3530: 0x406a2020, 0x3531: 0x406a2220, 0x3532: 0x406a2420, 0x3533: 0x406a2620, + 0x3534: 0x406a2820, 0x3535: 0x406a2a20, 0x3536: 0x406a2c20, 0x3537: 0x406a2e20, + 0x3538: 0x406a3020, 0x3539: 0x406a3220, 0x353a: 0x406a3420, 0x353b: 0x406a3620, + 0x353c: 0x406a3820, 0x353d: 0x406a3a20, 0x353e: 0x406a3c20, 0x353f: 0x406a3e20, + // Block 0xd5, offset 0x3540 + 0x3540: 0x406a4020, 0x3541: 0x406a4220, 0x3542: 0x406a4420, 0x3543: 0x406a4620, + 0x3544: 0x406a4820, 0x3545: 0x406a4a20, 0x3546: 0x406a4c20, 0x3547: 0x406a4e20, + 0x3548: 0x406a5020, 0x3549: 0x406a5220, 0x354a: 0x406a5420, 0x354b: 0x406a5620, + 0x354c: 0x406a5820, 0x354d: 0x406a5a20, 0x354e: 0x406a5c20, 0x354f: 0x406a5e20, + 0x3550: 0x406a6020, 0x3551: 0x406a6220, 0x3552: 0x406a6420, 0x3553: 0x406a6620, + 0x3554: 0x406a6820, 0x3555: 0x406a6a20, 0x3556: 0x406a6c20, 0x3557: 0x406a6e20, + 0x3558: 0x406a7020, 0x3559: 0x406a7220, 0x355a: 0x406a7420, 0x355b: 0x406a7620, + 0x355c: 0x406a7820, 0x355d: 0x406a7a20, 0x355e: 0x406a7c20, 0x355f: 0x406a7e20, + 0x3560: 0x406a8020, 0x3561: 0x406a8220, 0x3562: 0x406a8420, 0x3563: 0x406a8620, + 0x3564: 0x406a8820, 0x3565: 0x406a8a20, 0x3566: 0x406a8c20, 0x3567: 0x406a8e20, + 0x3568: 0x406a9020, 0x3569: 0x406a9220, 0x356a: 0x406a9420, 0x356b: 0x406a9620, + 0x356c: 0x406a9820, 0x356d: 0x406a9a20, 0x356e: 0x406a9c20, 0x356f: 0x406a9e20, + 0x3570: 0x406aa020, 0x3571: 0x406aa220, 0x3572: 0x406aa420, 0x3573: 0x406aa620, + 0x3574: 0x406aa820, 0x3575: 0x406aaa20, 0x3576: 0x406aac20, 0x3577: 0x406aae20, + 0x3578: 0x406ab020, 0x3579: 0x406ab220, 0x357a: 0x406ab420, 0x357b: 0x406ab620, + 0x357c: 0x406ab820, 0x357d: 0x406aba20, 0x357e: 0x406abc20, 0x357f: 0x406abe20, + // Block 0xd6, offset 0x3580 + 0x3580: 0x406ac020, 0x3581: 0x406ac220, 0x3582: 0x406ac420, 0x3583: 0x406ac620, + 0x3584: 0x406ac820, 0x3585: 0x406aca20, 0x3586: 0x406acc20, 0x3587: 0x406ace20, + 0x3588: 0x406ad020, 0x3589: 0x406ad220, 0x358a: 0x406ad420, 0x358b: 0x406ad620, + 0x358c: 0x406ad820, 0x358d: 0x406ada20, 0x358e: 0x406adc20, 0x358f: 0x406ade20, + 0x3590: 0x406ae020, 0x3591: 0x406ae220, 0x3592: 0x406ae420, 0x3593: 0x406ae620, + 0x3594: 0x406ae820, 0x3595: 0x406aea20, 0x3596: 0x406aec20, 0x3597: 0x406aee20, + 0x3598: 0x406af020, 0x3599: 0x406af220, 0x359a: 0x406af420, 0x359b: 0x406af620, + 0x359c: 0x406af820, 0x359d: 0x406afa20, 0x359e: 0x406afc20, 0x359f: 0x406afe20, + 0x35a0: 0x406b0020, 0x35a1: 0x406b0220, 0x35a2: 0x406b0420, 0x35a3: 0x406b0620, + 0x35a4: 0x406b0820, 0x35a5: 0x406b0a20, 0x35a6: 0x406b0c20, 0x35a7: 0x406b0e20, + 0x35a8: 0x406b1020, 0x35a9: 0x406b1220, 0x35aa: 0x406b1420, 0x35ab: 0x406b1620, + 0x35ac: 0x406b1820, 0x35ad: 0x406b1a20, 0x35ae: 0x406b1c20, 0x35af: 0x406b1e20, + 0x35b0: 0x406b2020, 0x35b1: 0x406b2220, 0x35b2: 0x406b2420, 0x35b3: 0x406b2620, + 0x35b4: 0x406b2820, 0x35b5: 0x406b2a20, 0x35b6: 0x406b2c20, 0x35b7: 0x406b2e20, + 0x35b8: 0x406b3020, 0x35b9: 0x406b3220, 0x35ba: 0x406b3420, 0x35bb: 0x406b3620, + 0x35bc: 0x406b3820, 0x35bd: 0x406b3a20, 0x35be: 0x406b3c20, 0x35bf: 0x406b3e20, + // Block 0xd7, offset 0x35c0 + 0x35c0: 0x406b4020, 0x35c1: 0x406b4220, 0x35c2: 0x406b4420, 0x35c3: 0x406b4620, + 0x35c4: 0x406b4820, 0x35c5: 0x406b4a20, 0x35c6: 0x406b4c20, 0x35c7: 0x406b4e20, + 0x35c8: 0x406b5020, 0x35c9: 0x406b5220, 0x35ca: 0x406b5420, 0x35cb: 0x406b5620, + 0x35cc: 0x406b5820, 0x35cd: 0x406b5a20, 0x35ce: 0x406b5c20, 0x35cf: 0x406b5e20, + 0x35d0: 0x406b6020, 0x35d1: 0x406b6220, 0x35d2: 0x406b6420, 0x35d3: 0x406b6620, + 0x35d4: 0x406b6820, 0x35d5: 0x406b6a20, 0x35d6: 0x406b6c20, 0x35d7: 0x406b6e20, + 0x35d8: 0x406b7020, 0x35d9: 0x406b7220, 0x35da: 0x406b7420, 0x35db: 0x406b7620, + 0x35dc: 0x406b7820, 0x35dd: 0x406b7a20, 0x35de: 0x406b7c20, 0x35df: 0x406b7e20, + 0x35e0: 0x406b8020, 0x35e1: 0x406b8220, 0x35e2: 0x406b8420, 0x35e3: 0x406b8620, + 0x35e4: 0x406b8820, 0x35e5: 0x406b8a20, 0x35e6: 0x406b8c20, 0x35e7: 0x406b8e20, + 0x35e8: 0x406b9020, 0x35e9: 0x406b9220, 0x35ea: 0x406b9420, 0x35eb: 0x406b9620, + 0x35ec: 0x406b9820, 0x35ed: 0x406b9a20, 0x35ee: 0x406b9c20, 0x35ef: 0x406b9e20, + 0x35f0: 0x406ba020, 0x35f1: 0x406ba220, 0x35f2: 0x406ba420, 0x35f3: 0x406ba620, + 0x35f4: 0x406ba820, 0x35f5: 0x406baa20, 0x35f6: 0x406bac20, 0x35f7: 0x406bae20, + 0x35f8: 0x406bb020, 0x35f9: 0x406bb220, 0x35fa: 0x406bb420, 0x35fb: 0x406bb620, + 0x35fc: 0x406bb820, 0x35fd: 0x406bba20, 0x35fe: 0x406bbc20, 0x35ff: 0x406bbe20, + // Block 0xd8, offset 0x3600 + 0x3600: 0x406bc020, 0x3601: 0x406bc220, 0x3602: 0x406bc420, 0x3603: 0x406bc620, + 0x3604: 0x406bc820, 0x3605: 0x406bca20, 0x3606: 0x406bcc20, 0x3607: 0x406bce20, + 0x3608: 0x406bd020, 0x3609: 0x406bd220, 0x360a: 0x406bd420, 0x360b: 0x406bd620, + 0x360c: 0x406bd820, 0x360d: 0x406bda20, 0x360e: 0x406bdc20, 0x360f: 0x406bde20, + 0x3610: 0x406be020, 0x3611: 0x406be220, 0x3612: 0x406be420, 0x3613: 0x406be620, + 0x3614: 0x406be820, 0x3615: 0x406bea20, 0x3616: 0x406bec20, 0x3617: 0x406bee20, + 0x3618: 0x406bf020, 0x3619: 0x406bf220, 0x361a: 0x406bf420, 0x361b: 0x406bf620, + 0x361c: 0x406bf820, 0x361d: 0x406bfa20, 0x361e: 0x406bfc20, 0x361f: 0x406bfe20, + 0x3620: 0x406c0020, 0x3621: 0x406c0220, 0x3622: 0x406c0420, 0x3623: 0x406c0620, + 0x3624: 0x406c0820, 0x3625: 0x406c0a20, 0x3626: 0x406c0c20, 0x3627: 0x406c0e20, + 0x3628: 0x406c1020, 0x3629: 0x406c1220, 0x362a: 0x406c1420, 0x362b: 0x406c1620, + 0x362c: 0x406c1820, 0x362d: 0x406c1a20, 0x362e: 0x406c1c20, 0x362f: 0x406c1e20, + 0x3630: 0x406c2020, 0x3631: 0x406c2220, 0x3632: 0x406c2420, 0x3633: 0x406c2620, + 0x3634: 0x406c2820, 0x3635: 0x406c2a20, 0x3636: 0x406c2c20, 0x3637: 0x406c2e20, + 0x3638: 0x406c3020, 0x3639: 0x406c3220, 0x363a: 0x406c3420, 0x363b: 0x406c3620, + 0x363c: 0x406c3820, 0x363d: 0x406c3a20, 0x363e: 0x406c3c20, 0x363f: 0x406c3e20, + // Block 0xd9, offset 0x3640 + 0x3640: 0x406c4020, 0x3641: 0x406c4220, 0x3642: 0x406c4420, 0x3643: 0x406c4620, + 0x3644: 0x406c4820, 0x3645: 0x406c4a20, 0x3646: 0x406c4c20, 0x3647: 0x406c4e20, + 0x3648: 0x406c5020, 0x3649: 0x406c5220, 0x364a: 0x406c5420, 0x364b: 0x406c5620, + 0x364c: 0x406c5820, 0x364d: 0x406c5a20, 0x364e: 0x406c5c20, 0x364f: 0x406c5e20, + 0x3650: 0x406c6020, 0x3651: 0x406c6220, 0x3652: 0x406c6420, 0x3653: 0x406c6620, + 0x3654: 0x406c6820, 0x3655: 0x406c6a20, 0x3656: 0x406c6c20, 0x3657: 0x406c6e20, + 0x3658: 0x406c7020, 0x3659: 0x406c7220, 0x365a: 0x406c7420, 0x365b: 0x406c7620, + 0x365c: 0x406c7820, 0x365d: 0x406c7a20, 0x365e: 0x406c7c20, 0x365f: 0x406c7e20, + 0x3660: 0x406c8020, 0x3661: 0x406c8220, 0x3662: 0x406c8420, 0x3663: 0x406c8620, + 0x3664: 0x406c8820, 0x3665: 0x406c8a20, 0x3666: 0x406c8c20, 0x3667: 0x406c8e20, + 0x3668: 0x406c9020, 0x3669: 0x406c9220, 0x366a: 0x406c9420, 0x366b: 0x406c9620, + 0x366c: 0x406c9820, 0x366d: 0x406c9a20, 0x366e: 0x406c9c20, 0x366f: 0x406c9e20, + 0x3670: 0x406ca020, 0x3671: 0x406ca220, 0x3672: 0x406ca420, 0x3673: 0x406ca620, + 0x3674: 0x406ca820, 0x3675: 0x406caa20, 0x3676: 0x406cac20, 0x3677: 0x406cae20, + 0x3678: 0x406cb020, 0x3679: 0x406cb220, 0x367a: 0x406cb420, 0x367b: 0x406cb620, + 0x367c: 0x406cb820, 0x367d: 0x406cba20, 0x367e: 0x406cbc20, 0x367f: 0x406cbe20, + // Block 0xda, offset 0x3680 + 0x3680: 0x406cc020, 0x3681: 0x406cc220, 0x3682: 0x406cc420, 0x3683: 0x406cc620, + 0x3684: 0x406cc820, 0x3685: 0x406cca20, 0x3686: 0x406ccc20, 0x3687: 0x406cce20, + 0x3688: 0x406cd020, 0x3689: 0x406cd220, 0x368a: 0x406cd420, 0x368b: 0x406cd620, + 0x368c: 0x406cd820, 0x368d: 0x406cda20, 0x368e: 0x406cdc20, 0x368f: 0x406cde20, + 0x3690: 0x406ce020, 0x3691: 0x406ce220, 0x3692: 0x406ce420, 0x3693: 0x406ce620, + 0x3694: 0x406ce820, 0x3695: 0x406cea20, 0x3696: 0x406cec20, 0x3697: 0x406cee20, + 0x3698: 0x406cf020, 0x3699: 0x406cf220, 0x369a: 0x406cf420, 0x369b: 0x406cf620, + 0x369c: 0x406cf820, 0x369d: 0x406cfa20, 0x369e: 0x406cfc20, 0x369f: 0x406cfe20, + 0x36a0: 0x406d0020, 0x36a1: 0x406d0220, 0x36a2: 0x406d0420, 0x36a3: 0x406d0620, + 0x36a4: 0x406d0820, 0x36a5: 0x406d0a20, 0x36a6: 0x406d0c20, 0x36a7: 0x406d0e20, + 0x36a8: 0x406d1020, 0x36a9: 0x406d1220, 0x36aa: 0x406d1420, 0x36ab: 0x406d1620, + 0x36ac: 0x406d1820, 0x36ad: 0x406d1a20, 0x36ae: 0x406d1c20, 0x36af: 0x406d1e20, + 0x36b0: 0x406d2020, 0x36b1: 0x406d2220, 0x36b2: 0x406d2420, 0x36b3: 0x406d2620, + 0x36b4: 0x406d2820, 0x36b5: 0x406d2a20, 0x36b6: 0x406d2c20, 0x36b7: 0x406d2e20, + 0x36b8: 0x406d3020, 0x36b9: 0x406d3220, 0x36ba: 0x406d3420, 0x36bb: 0x406d3620, + 0x36bc: 0x406d3820, 0x36bd: 0x406d3a20, 0x36be: 0x406d3c20, 0x36bf: 0x406d3e20, + // Block 0xdb, offset 0x36c0 + 0x36c0: 0x406d4020, 0x36c1: 0x406d4220, 0x36c2: 0x406d4420, 0x36c3: 0x406d4620, + 0x36c4: 0x406d4820, 0x36c5: 0x406d4a20, 0x36c6: 0x406d4c20, 0x36c7: 0x406d4e20, + 0x36c8: 0x406d5020, 0x36c9: 0x406d5220, 0x36ca: 0x406d5420, 0x36cb: 0x406d5620, + 0x36cc: 0x406d5820, 0x36cd: 0x406d5a20, 0x36ce: 0x406d5c20, 0x36cf: 0x406d5e20, + 0x36d0: 0x406d6020, 0x36d1: 0x406d6220, 0x36d2: 0x406d6420, 0x36d3: 0x406d6620, + 0x36d4: 0x406d6820, 0x36d5: 0x406d6a20, 0x36d6: 0x406d6c20, 0x36d7: 0x406d6e20, + 0x36d8: 0x406d7020, 0x36d9: 0x406d7220, 0x36da: 0x406d7420, 0x36db: 0x406d7620, + 0x36dc: 0x406d7820, 0x36dd: 0x406d7a20, 0x36de: 0x406d7c20, 0x36df: 0x406d7e20, + 0x36e0: 0x406d8020, 0x36e1: 0x406d8220, 0x36e2: 0x406d8420, 0x36e3: 0x406d8620, + 0x36e4: 0x406d8820, 0x36e5: 0x406d8a20, 0x36e6: 0x406d8c20, 0x36e7: 0x406d8e20, + 0x36e8: 0x406d9020, 0x36e9: 0x406d9220, 0x36ea: 0x406d9420, 0x36eb: 0x406d9620, + 0x36ec: 0x406d9820, 0x36ed: 0x406d9a20, 0x36ee: 0x406d9c20, 0x36ef: 0x406d9e20, + 0x36f0: 0x406da020, 0x36f1: 0x406da220, 0x36f2: 0x406da420, 0x36f3: 0x406da620, + 0x36f4: 0x406da820, 0x36f5: 0x406daa20, 0x36f6: 0x406dac20, 0x36f7: 0x406dae20, + 0x36f8: 0x406db020, 0x36f9: 0x406db220, 0x36fa: 0x406db420, 0x36fb: 0x406db620, + 0x36fc: 0x406db820, 0x36fd: 0x406dba20, 0x36fe: 0x406dbc20, 0x36ff: 0x406dbe20, + // Block 0xdc, offset 0x3700 + 0x3700: 0x406dc020, 0x3701: 0x406dc220, 0x3702: 0x406dc420, 0x3703: 0x406dc620, + 0x3704: 0x406dc820, 0x3705: 0x406dca20, 0x3706: 0x406dcc20, 0x3707: 0x406dce20, + 0x3708: 0x406dd020, 0x3709: 0x406dd220, 0x370a: 0x406dd420, 0x370b: 0x406dd620, + 0x370c: 0x406dd820, 0x370d: 0x406dda20, 0x370e: 0x406ddc20, 0x370f: 0x406dde20, + 0x3710: 0x406de020, 0x3711: 0x406de220, 0x3712: 0x406de420, 0x3713: 0x406de620, + 0x3714: 0x406de820, 0x3715: 0x406dea20, 0x3716: 0x406dec20, 0x3717: 0x406dee20, + 0x3718: 0x406df020, 0x3719: 0x406df220, 0x371a: 0x406df420, 0x371b: 0x406df620, + 0x371c: 0x406df820, 0x371d: 0x406dfa20, 0x371e: 0x406dfc20, 0x371f: 0x406dfe20, + 0x3720: 0x406e0020, 0x3721: 0x406e0220, 0x3722: 0x406e0420, 0x3723: 0x406e0620, + 0x3724: 0x406e0820, 0x3725: 0x406e0a20, 0x3726: 0x406e0c20, 0x3727: 0x406e0e20, + 0x3728: 0x406e1020, 0x3729: 0x406e1220, 0x372a: 0x406e1420, 0x372b: 0x406e1620, + 0x372c: 0x406e1820, 0x372d: 0x406e1a20, 0x372e: 0x406e1c20, 0x372f: 0x406e1e20, + 0x3730: 0x406e2020, 0x3731: 0x406e2220, 0x3732: 0x406e2420, 0x3733: 0x406e2620, + 0x3734: 0x406e2820, 0x3735: 0x406e2a20, 0x3736: 0x406e2c20, 0x3737: 0x406e2e20, + 0x3738: 0x406e3020, 0x3739: 0x406e3220, 0x373a: 0x406e3420, 0x373b: 0x406e3620, + 0x373c: 0x406e3820, 0x373d: 0x406e3a20, 0x373e: 0x406e3c20, 0x373f: 0x406e3e20, + // Block 0xdd, offset 0x3740 + 0x3740: 0x406e4020, 0x3741: 0x406e4220, 0x3742: 0x406e4420, 0x3743: 0x406e4620, + 0x3744: 0x406e4820, 0x3745: 0x406e4a20, 0x3746: 0x406e4c20, 0x3747: 0x406e4e20, + 0x3748: 0x406e5020, 0x3749: 0x406e5220, 0x374a: 0x406e5420, 0x374b: 0x406e5620, + 0x374c: 0x406e5820, 0x374d: 0x406e5a20, 0x374e: 0x406e5c20, 0x374f: 0x406e5e20, + 0x3750: 0x406e6020, 0x3751: 0x406e6220, 0x3752: 0x406e6420, 0x3753: 0x406e6620, + 0x3754: 0x406e6820, 0x3755: 0x406e6a20, 0x3756: 0x406e6c20, 0x3757: 0x406e6e20, + 0x3758: 0x406e7020, 0x3759: 0x406e7220, 0x375a: 0x406e7420, 0x375b: 0x406e7620, + 0x375c: 0x406e7820, 0x375d: 0x406e7a20, 0x375e: 0x406e7c20, 0x375f: 0x406e7e20, + 0x3760: 0x406e8020, 0x3761: 0x406e8220, 0x3762: 0x406e8420, 0x3763: 0x406e8620, + 0x3764: 0x406e8820, 0x3765: 0x406e8a20, 0x3766: 0x406e8c20, 0x3767: 0x406e8e20, + 0x3768: 0x406e9020, 0x3769: 0x406e9220, 0x376a: 0x406e9420, 0x376b: 0x406e9620, + 0x376c: 0x406e9820, 0x376d: 0x406e9a20, 0x376e: 0x406e9c20, 0x376f: 0x406e9e20, + 0x3770: 0x406ea020, 0x3771: 0x406ea220, 0x3772: 0x406ea420, 0x3773: 0x406ea620, + 0x3774: 0x406ea820, 0x3775: 0x406eaa20, 0x3776: 0x406eac20, 0x3777: 0x406eae20, + 0x3778: 0x406eb020, 0x3779: 0x406eb220, 0x377a: 0x406eb420, 0x377b: 0x406eb620, + 0x377c: 0x406eb820, 0x377d: 0x406eba20, 0x377e: 0x406ebc20, 0x377f: 0x406ebe20, + // Block 0xde, offset 0x3780 + 0x3780: 0x406ec020, 0x3781: 0x406ec220, 0x3782: 0x406ec420, 0x3783: 0x406ec620, + 0x3784: 0x406ec820, 0x3785: 0x406eca20, 0x3786: 0x406ecc20, 0x3787: 0x406ece20, + 0x3788: 0x406ed020, 0x3789: 0x406ed220, 0x378a: 0x406ed420, 0x378b: 0x406ed620, + 0x378c: 0x406ed820, 0x378d: 0x406eda20, 0x378e: 0x406edc20, 0x378f: 0x406ede20, + 0x3790: 0x406ee020, 0x3791: 0x406ee220, 0x3792: 0x406ee420, 0x3793: 0x406ee620, + 0x3794: 0x406ee820, 0x3795: 0x406eea20, 0x3796: 0x406eec20, 0x3797: 0x406eee20, + 0x3798: 0x406ef020, 0x3799: 0x406ef220, 0x379a: 0x406ef420, 0x379b: 0x406ef620, + 0x379c: 0x406ef820, 0x379d: 0x406efa20, 0x379e: 0x406efc20, 0x379f: 0x406efe20, + 0x37a0: 0x406f0020, 0x37a1: 0x406f0220, 0x37a2: 0x406f0420, 0x37a3: 0x406f0620, + 0x37a4: 0x406f0820, 0x37a5: 0x406f0a20, 0x37a6: 0x406f0c20, 0x37a7: 0x406f0e20, + 0x37a8: 0x406f1020, 0x37a9: 0x406f1220, 0x37aa: 0x406f1420, 0x37ab: 0x406f1620, + 0x37ac: 0x406f1820, 0x37ad: 0x406f1a20, 0x37ae: 0x406f1c20, 0x37af: 0x406f1e20, + 0x37b0: 0x406f2020, 0x37b1: 0x406f2220, 0x37b2: 0x406f2420, 0x37b3: 0x406f2620, + 0x37b4: 0x406f2820, 0x37b5: 0x406f2a20, 0x37b6: 0x406f2c20, 0x37b7: 0x406f2e20, + 0x37b8: 0x406f3020, 0x37b9: 0x406f3220, 0x37ba: 0x406f3420, 0x37bb: 0x406f3620, + 0x37bc: 0x406f3820, 0x37bd: 0x406f3a20, 0x37be: 0x406f3c20, 0x37bf: 0x406f3e20, + // Block 0xdf, offset 0x37c0 + 0x37c0: 0x406f4020, 0x37c1: 0x406f4220, 0x37c2: 0x406f4420, 0x37c3: 0x406f4620, + 0x37c4: 0x406f4820, 0x37c5: 0x406f4a20, 0x37c6: 0x406f4c20, 0x37c7: 0x406f4e20, + 0x37c8: 0x406f5020, 0x37c9: 0x406f5220, 0x37ca: 0x406f5420, 0x37cb: 0x406f5620, + 0x37cc: 0x406f5820, + 0x37d0: 0x401a9020, 0x37d1: 0x401a9220, 0x37d2: 0x401a9420, 0x37d3: 0x401a9620, + 0x37d4: 0x401a9820, 0x37d5: 0x401a9a20, 0x37d6: 0x401a9c20, 0x37d7: 0x401a9e20, + 0x37d8: 0x401aa020, 0x37d9: 0x401aa220, 0x37da: 0x401aa420, 0x37db: 0x401aa620, + 0x37dc: 0x401aa820, 0x37dd: 0x401aaa20, 0x37de: 0x401aac20, 0x37df: 0x401aae20, + 0x37e0: 0x401ab020, 0x37e1: 0x401ab220, 0x37e2: 0x401ab420, 0x37e3: 0x401ab620, + 0x37e4: 0x401ab820, 0x37e5: 0x401aba20, 0x37e6: 0x401abc20, 0x37e7: 0x401abe20, + 0x37e8: 0x401ac020, 0x37e9: 0x401ac220, 0x37ea: 0x401ac420, 0x37eb: 0x401ac620, + 0x37ec: 0x401ac820, 0x37ed: 0x401aca20, 0x37ee: 0x401acc20, 0x37ef: 0x401ace20, + 0x37f0: 0x401ad020, 0x37f1: 0x401ad220, 0x37f2: 0x401ad420, 0x37f3: 0x401ad620, + 0x37f4: 0x401ad820, 0x37f5: 0x401ada20, 0x37f6: 0x401adc20, 0x37f7: 0x401ade20, + 0x37f8: 0x401ae020, 0x37f9: 0x401ae220, 0x37fa: 0x401ae420, 0x37fb: 0x401ae620, + 0x37fc: 0x401ae820, 0x37fd: 0x401aea20, 0x37fe: 0x401aec20, 0x37ff: 0x401aee20, + // Block 0xe0, offset 0x3800 + 0x3800: 0x401af020, 0x3801: 0x401af220, 0x3802: 0x401af420, 0x3803: 0x401af620, + 0x3804: 0x401af820, 0x3805: 0x401afa20, 0x3806: 0x401afc20, + 0x3810: 0x406f6620, 0x3811: 0x406f6820, 0x3812: 0x406f6a20, 0x3813: 0x406f6c20, + 0x3814: 0x406f6e20, 0x3815: 0x406f7020, 0x3816: 0x406f7220, 0x3817: 0x406f7420, + 0x3818: 0x406f7620, 0x3819: 0x406f7820, 0x381a: 0x406f7a20, 0x381b: 0x406f7c20, + 0x381c: 0x406f7e20, 0x381d: 0x406f8020, 0x381e: 0x406f8220, 0x381f: 0x406f8420, + 0x3820: 0x406f8620, 0x3821: 0x406f8820, 0x3822: 0x406f8a20, 0x3823: 0x406f8c20, + 0x3824: 0x406f8e20, 0x3825: 0x406f9020, 0x3826: 0x406f9220, 0x3827: 0x406f9420, + 0x3828: 0x406f9620, 0x3829: 0x406f9820, 0x382a: 0x406f9e20, 0x382b: 0x406f9a20, + 0x382c: 0x406fa020, 0x382d: 0x406f9c20, 0x382e: 0x406fa220, 0x382f: 0x406fa420, + 0x3830: 0x406fa620, 0x3831: 0x406fa820, 0x3832: 0x406faa20, 0x3833: 0x406fac20, + 0x3834: 0x406fae20, 0x3835: 0x406fb020, 0x3836: 0x406fb220, 0x3837: 0x406fb420, + 0x3838: 0x406f5a20, 0x3839: 0x406f5c20, 0x383a: 0x406f5e20, 0x383b: 0x406f6020, + 0x383c: 0x406f6420, 0x383d: 0x406f6220, 0x383e: 0x40025620, 0x383f: 0x4002fe20, + // Block 0xe1, offset 0x3840 + 0x3840: 0x405b8020, 0x3841: 0x405b8220, 0x3842: 0x405b8420, 0x3843: 0x405b8620, + 0x3844: 0x405b8820, 0x3845: 0x405b8a20, 0x3846: 0x405b8c20, 0x3847: 0x405b8e20, + 0x3848: 0x405b9020, 0x3849: 0x405b9220, 0x384a: 0x405b9420, 0x384b: 0x405b9620, + 0x384c: 0x405b9820, 0x384d: 0x405b9a20, 0x384e: 0x405b9c20, 0x384f: 0x405b9e20, + 0x3850: 0x405ba020, 0x3851: 0x405ba220, 0x3852: 0x405ba420, 0x3853: 0x405ba620, + 0x3854: 0x405ba820, 0x3855: 0x405baa20, 0x3856: 0x405bac20, 0x3857: 0x405bae20, + 0x3858: 0x405bb020, 0x3859: 0x405bb220, 0x385a: 0x405bb420, 0x385b: 0x405bb620, + 0x385c: 0x405bb820, 0x385d: 0x405bba20, 0x385e: 0x405bbc20, 0x385f: 0x405bbe20, + 0x3860: 0x405bc020, 0x3861: 0x405bc220, 0x3862: 0x405bc420, 0x3863: 0x405bc620, + 0x3864: 0x405bc820, 0x3865: 0x405bca20, 0x3866: 0x405bcc20, 0x3867: 0x405bce20, + 0x3868: 0x405bd020, 0x3869: 0x405bd220, 0x386a: 0x405bd420, 0x386b: 0x405bd620, + 0x386c: 0x405bd820, 0x386d: 0x405bda20, 0x386e: 0x405bdc20, 0x386f: 0x405bde20, + 0x3870: 0x405be020, 0x3871: 0x405be220, 0x3872: 0x405be420, 0x3873: 0x405be620, + 0x3874: 0x405be820, 0x3875: 0x405bea20, 0x3876: 0x405bec20, 0x3877: 0x405bee20, + 0x3878: 0x405bf020, 0x3879: 0x405bf220, 0x387a: 0x405bf420, 0x387b: 0x405bf620, + 0x387c: 0x405bf820, 0x387d: 0x405bfa20, 0x387e: 0x405bfc20, 0x387f: 0x405bfe20, + // Block 0xe2, offset 0x3880 + 0x3880: 0x405c0020, 0x3881: 0x405c0220, 0x3882: 0x405c0420, 0x3883: 0x405c0620, + 0x3884: 0x405c0820, 0x3885: 0x405c0a20, 0x3886: 0x405c0c20, 0x3887: 0x405c0e20, + 0x3888: 0x405c1020, 0x3889: 0x405c1220, 0x388a: 0x405c1420, 0x388b: 0x405c1620, + 0x388c: 0x405c1820, 0x388d: 0x405c1a20, 0x388e: 0x405c1c20, 0x388f: 0x405c1e20, + 0x3890: 0x405c2020, 0x3891: 0x405c2220, 0x3892: 0x405c2420, 0x3893: 0x405c2620, + 0x3894: 0x405c2820, 0x3895: 0x405c2a20, 0x3896: 0x405c2c20, 0x3897: 0x405c2e20, + 0x3898: 0x405c3020, 0x3899: 0x405c3220, 0x389a: 0x405c3420, 0x389b: 0x405c3620, + 0x389c: 0x405c3820, 0x389d: 0x405c3a20, 0x389e: 0x405c3c20, 0x389f: 0x405c3e20, + 0x38a0: 0x405c4020, 0x38a1: 0x405c4220, 0x38a2: 0x405c4420, 0x38a3: 0x405c4620, + 0x38a4: 0x405c4820, 0x38a5: 0x405c4a20, 0x38a6: 0x405c4c20, 0x38a7: 0x405c4e20, + 0x38a8: 0x405c5020, 0x38a9: 0x405c5220, 0x38aa: 0x405c5420, 0x38ab: 0x405c5620, + 0x38ac: 0x405c5820, 0x38ad: 0x405c5a20, 0x38ae: 0x405c5c20, 0x38af: 0x405c5e20, + 0x38b0: 0x405c6020, 0x38b1: 0x405c6220, 0x38b2: 0x405c6420, 0x38b3: 0x405c6620, + 0x38b4: 0x405c6820, 0x38b5: 0x405c6a20, 0x38b6: 0x405c6c20, 0x38b7: 0x405c6e20, + 0x38b8: 0x405c7020, 0x38b9: 0x405c7220, 0x38ba: 0x405c7420, 0x38bb: 0x405c7620, + 0x38bc: 0x405c7820, 0x38bd: 0x405c7a20, 0x38be: 0x405c7c20, 0x38bf: 0x405c7e20, + // Block 0xe3, offset 0x38c0 + 0x38c0: 0x405c8020, 0x38c1: 0x405c8220, 0x38c2: 0x405c8420, 0x38c3: 0x405c8620, + 0x38c4: 0x405c8820, 0x38c5: 0x405c8a20, 0x38c6: 0x405c8c20, 0x38c7: 0x405c8e20, + 0x38c8: 0x405c9020, 0x38c9: 0x405c9220, 0x38ca: 0x405c9420, 0x38cb: 0x405c9620, + 0x38cc: 0x405c9820, 0x38cd: 0x405c9a20, 0x38ce: 0x405c9c20, 0x38cf: 0x405c9e20, + 0x38d0: 0x405ca020, 0x38d1: 0x405ca220, 0x38d2: 0x405ca420, 0x38d3: 0x405ca620, + 0x38d4: 0x405ca820, 0x38d5: 0x405caa20, 0x38d6: 0x405cac20, 0x38d7: 0x405cae20, + 0x38d8: 0x405cb020, 0x38d9: 0x405cb220, 0x38da: 0x405cb420, 0x38db: 0x405cb620, + 0x38dc: 0x405cb820, 0x38dd: 0x405cba20, 0x38de: 0x405cbc20, 0x38df: 0x405cbe20, + 0x38e0: 0x405cc020, 0x38e1: 0x405cc220, 0x38e2: 0x405cc420, 0x38e3: 0x405cc620, + 0x38e4: 0x405cc820, 0x38e5: 0x405cca20, 0x38e6: 0x405ccc20, 0x38e7: 0x405cce20, + 0x38e8: 0x405cd020, 0x38e9: 0x405cd220, 0x38ea: 0x405cd420, 0x38eb: 0x405cd620, + 0x38ec: 0x405cd820, 0x38ed: 0x405cda20, 0x38ee: 0x405cdc20, 0x38ef: 0x405cde20, + 0x38f0: 0x405ce020, 0x38f1: 0x405ce220, 0x38f2: 0x405ce420, 0x38f3: 0x405ce620, + 0x38f4: 0x405ce820, 0x38f5: 0x405cea20, 0x38f6: 0x405cec20, 0x38f7: 0x405cee20, + 0x38f8: 0x405cf020, 0x38f9: 0x405cf220, 0x38fa: 0x405cf420, 0x38fb: 0x405cf620, + 0x38fc: 0x405cf820, 0x38fd: 0x405cfa20, 0x38fe: 0x405cfc20, 0x38ff: 0x405cfe20, + // Block 0xe4, offset 0x3900 + 0x3900: 0x405d0020, 0x3901: 0x405d0220, 0x3902: 0x405d0420, 0x3903: 0x405d0620, + 0x3904: 0x405d0820, 0x3905: 0x405d0a20, 0x3906: 0x405d0c20, 0x3907: 0x405d0e20, + 0x3908: 0x405d1020, 0x3909: 0x405d1220, 0x390a: 0x405d1420, 0x390b: 0x405d1620, + 0x390c: 0x405d1820, 0x390d: 0x405d1a20, 0x390e: 0x405d1c20, 0x390f: 0x405d1e20, + 0x3910: 0x405d2020, 0x3911: 0x405d2220, 0x3912: 0x405d2420, 0x3913: 0x405d2620, + 0x3914: 0x405d2820, 0x3915: 0x405d2a20, 0x3916: 0x405d2c20, 0x3917: 0x405d2e20, + 0x3918: 0x405d3020, 0x3919: 0x405d3220, 0x391a: 0x405d3420, 0x391b: 0x405d3620, + 0x391c: 0x405d3820, 0x391d: 0x405d3a20, 0x391e: 0x405d3c20, 0x391f: 0x405d3e20, + 0x3920: 0x405d4020, 0x3921: 0x405d4220, 0x3922: 0x405d4420, 0x3923: 0x405d4620, + 0x3924: 0x405d4820, 0x3925: 0x405d4a20, 0x3926: 0x405d4c20, 0x3927: 0x405d4e20, + 0x3928: 0x405d5020, 0x3929: 0x405d5220, 0x392a: 0x405d5420, 0x392b: 0x405d5620, + 0x392c: 0x405d5820, 0x392d: 0x405d5a20, 0x392e: 0x405d5c20, 0x392f: 0x405d5e20, + 0x3930: 0x405d6020, 0x3931: 0x405d6220, 0x3932: 0x405d6420, 0x3933: 0x405d6620, + 0x3934: 0x405d6820, 0x3935: 0x405d6a20, 0x3936: 0x405d6c20, 0x3937: 0x405d6e20, + 0x3938: 0x405d7020, 0x3939: 0x405d7220, 0x393a: 0x405d7420, 0x393b: 0x405d7620, + 0x393c: 0x405d7820, 0x393d: 0x405d7a20, 0x393e: 0x405d7c20, 0x393f: 0x405d7e20, + // Block 0xe5, offset 0x3940 + 0x3940: 0x405d8020, 0x3941: 0x405d8220, 0x3942: 0x405d8420, 0x3943: 0x405d8620, + 0x3944: 0x405d8820, 0x3945: 0x405d8a20, 0x3946: 0x405d8c20, 0x3947: 0x405d8e20, + 0x3948: 0x405d9020, 0x3949: 0x405d9220, 0x394a: 0x405d9420, 0x394b: 0x405d9620, + 0x394c: 0x405d9820, 0x394d: 0x40025820, 0x394e: 0x40030020, 0x394f: 0x4002d820, + 0x3950: 0x005c3084, 0x3951: 0x005c5484, 0x3952: 0x005c8e84, 0x3953: 0xe00020fb, + 0x3954: 0xe00020fe, 0x3955: 0xe0002101, 0x3956: 0xe0002104, 0x3957: 0xe0002107, + 0x3958: 0xe000210a, 0x3959: 0xe000210d, 0x395a: 0xe0002110, 0x395b: 0xe0002113, + 0x395c: 0xe0002116, 0x395d: 0xe0002119, 0x395e: 0xe000211c, 0x395f: 0xe000211f, + 0x3960: 0xe00001cd, 0x3961: 0xe0000261, 0x3962: 0xe0000379, 0x3963: 0xe0000453, + 0x3964: 0xe0000528, 0x3965: 0xe00005f2, 0x3966: 0xe00006bd, 0x3967: 0xe0000765, + 0x3968: 0xe0000811, 0x3969: 0xe00008b6, 0x396a: 0x005c5c84, 0x396b: 0x005d2284, + // Block 0xe6, offset 0x3980 + 0x3980: 0x0033ec88, 0x3981: 0x4033ec20, 0x3982: 0x0033fa88, 0x3983: 0x4033fa20, + 0x3984: 0x00340488, 0x3985: 0x40340420, 0x3986: 0x00343488, 0x3987: 0x40343420, + 0x3988: 0x00344e88, 0x3989: 0x40344e20, 0x398a: 0x0035a288, 0x398b: 0x4035a220, + 0x398c: 0x0035f088, 0x398d: 0x4035f020, 0x398e: 0x00366e88, 0x398f: 0x40366e20, + 0x3990: 0x00367c88, 0x3991: 0x40367c20, 0x3992: 0x0036a688, 0x3993: 0x4036a620, + 0x3994: 0x0036c088, 0x3995: 0x4036c020, 0x3996: 0x0036c288, 0x3997: 0x4036c220, + 0x3998: 0x0036de88, 0x3999: 0x4036de20, 0x399a: 0x0036e888, 0x399b: 0x4036e820, + 0x399c: 0x0036f288, 0x399d: 0x4036f220, 0x399e: 0x00372488, 0x399f: 0x40372420, + 0x39a0: 0x00360a88, 0x39a1: 0x40360a20, 0x39a2: 0x00339e88, 0x39a3: 0x40339e20, + 0x39a4: 0x0034a288, 0x39a5: 0x4034a220, 0x39a6: 0x0034b888, 0x39a7: 0x4034b820, + 0x39a8: 0x0034ee8a, 0x39a9: 0x0034ee84, 0x39aa: 0x0034ee8a, 0x39ab: 0x0034ee84, + 0x39ac: 0x0034ee8a, 0x39ad: 0x0034ee84, 0x39ae: 0x0034ee84, 0x39af: 0xae608402, + 0x39b0: 0xa0000000, 0x39b1: 0xa0000000, 0x39b2: 0xa0000000, 0x39b3: 0x4004e020, + 0x39b4: 0x84e619e1, 0x39b5: 0x84e61a0a, 0x39b6: 0x84e61a1b, 0x39b7: 0x84e61ab9, + 0x39b8: 0x84e61b3a, 0x39b9: 0x84e61b3f, 0x39ba: 0x84e61b47, 0x39bb: 0x84e61af0, + 0x39bc: 0xae605f02, 0x39bd: 0xae605f02, 0x39be: 0x40054c20, 0x39bf: 0x40367220, + // Block 0xe7, offset 0x39c0 + 0x39c0: 0x00339488, 0x39c1: 0x40339420, 0x39c2: 0x00341288, 0x39c3: 0x40341220, + 0x39c4: 0x0033d288, 0x39c5: 0x4033d220, 0x39c6: 0x00364288, 0x39c7: 0x40364220, + 0x39c8: 0x00340e88, 0x39c9: 0x40340e20, 0x39ca: 0x00356088, 0x39cb: 0x40356020, + 0x39cc: 0x00355488, 0x39cd: 0x40355420, 0x39ce: 0x00360c88, 0x39cf: 0x40360c20, + 0x39d0: 0x00361688, 0x39d1: 0x40361620, 0x39d2: 0x00362088, 0x39d3: 0x40362020, + 0x39d4: 0x0035de88, 0x39d5: 0x4035de20, 0x39d6: 0x00366488, 0x39d7: 0x40366420, + 0x39df: 0x84e61b67, + 0x39e0: 0x405d9a20, 0x39e1: 0x405d9c20, 0x39e2: 0x405d9e20, 0x39e3: 0x405da020, + 0x39e4: 0x405da220, 0x39e5: 0x405da420, 0x39e6: 0x405da620, 0x39e7: 0x405da820, + 0x39e8: 0x405daa20, 0x39e9: 0x405dac20, 0x39ea: 0x405dae20, 0x39eb: 0x405db020, + 0x39ec: 0x405db220, 0x39ed: 0x405db420, 0x39ee: 0x405db620, 0x39ef: 0x405db820, + 0x39f0: 0x405dba20, 0x39f1: 0x405dbc20, 0x39f2: 0x405dbe20, 0x39f3: 0x405dc020, + 0x39f4: 0x405dc220, 0x39f5: 0x405dc420, 0x39f6: 0x405dc620, 0x39f7: 0x405dc820, + 0x39f8: 0x405dca20, 0x39f9: 0x405dcc20, 0x39fa: 0x405dce20, 0x39fb: 0x405dd020, + 0x39fc: 0x405dd220, 0x39fd: 0x405dd420, 0x39fe: 0x405dd620, 0x39ff: 0x405dd820, + // Block 0xe8, offset 0x3a00 + 0x3a00: 0x405dda20, 0x3a01: 0x405ddc20, 0x3a02: 0x405dde20, 0x3a03: 0x405de020, + 0x3a04: 0x405de220, 0x3a05: 0x405de420, 0x3a06: 0x405de620, 0x3a07: 0x405de820, + 0x3a08: 0x405dea20, 0x3a09: 0x405dec20, 0x3a0a: 0x405dee20, 0x3a0b: 0x405df020, + 0x3a0c: 0x405df220, 0x3a0d: 0x405df420, 0x3a0e: 0x405df620, 0x3a0f: 0x405df820, + 0x3a10: 0x405dfa20, 0x3a11: 0x405dfc20, 0x3a12: 0x405dfe20, 0x3a13: 0x405e0020, + 0x3a14: 0x405e0220, 0x3a15: 0x405e0420, 0x3a16: 0x405e0620, 0x3a17: 0x405e0820, + 0x3a18: 0x405e0a20, 0x3a19: 0x405e0c20, 0x3a1a: 0x405e0e20, 0x3a1b: 0x405e1020, + 0x3a1c: 0x405e1220, 0x3a1d: 0x405e1420, 0x3a1e: 0x405e1620, 0x3a1f: 0x405e1820, + 0x3a20: 0x405e1a20, 0x3a21: 0x405e1c20, 0x3a22: 0x405e1e20, 0x3a23: 0x405e2020, + 0x3a24: 0x405e2220, 0x3a25: 0x405e2420, 0x3a26: 0x405e2620, 0x3a27: 0x405e2820, + 0x3a28: 0x405e2a20, 0x3a29: 0x405e2c20, 0x3a2a: 0x405e2e20, 0x3a2b: 0x405e3020, + 0x3a2c: 0x405e3220, 0x3a2d: 0x405e3420, 0x3a2e: 0x405e3620, 0x3a2f: 0x405e3820, + 0x3a30: 0xae60ef02, 0x3a31: 0xae60f002, 0x3a32: 0x40038220, 0x3a33: 0x40030220, + 0x3a34: 0x4002b820, 0x3a35: 0x40025a20, 0x3a36: 0x40026a20, 0x3a37: 0x4002da20, + // Block 0xe9, offset 0x3a40 + 0x3a40: 0x4006ba20, 0x3a41: 0x4006bc20, 0x3a42: 0x4006be20, 0x3a43: 0x4006c020, + 0x3a44: 0x4006c220, 0x3a45: 0x4006c420, 0x3a46: 0x4006c620, 0x3a47: 0x4006c820, + 0x3a48: 0x4006ca20, 0x3a49: 0x4006cc20, 0x3a4a: 0x4006ce20, 0x3a4b: 0x4006d020, + 0x3a4c: 0x4006d220, 0x3a4d: 0x4006d420, 0x3a4e: 0x4006d620, 0x3a4f: 0x4006d820, + 0x3a50: 0x4006da20, 0x3a51: 0x4006dc20, 0x3a52: 0x4006de20, 0x3a53: 0x4006e020, + 0x3a54: 0x4006e220, 0x3a55: 0x4006e420, 0x3a56: 0x4006e620, 0x3a57: 0x4006e820, + 0x3a58: 0x4006ea20, 0x3a59: 0x4006ec20, 0x3a5a: 0x4006ee20, 0x3a5b: 0x4006f020, + 0x3a5c: 0x4006f220, 0x3a5d: 0x4006f420, 0x3a5e: 0x4006f620, 0x3a5f: 0x4006f820, + 0x3a60: 0x4006fa20, 0x3a61: 0x4006fc20, 0x3a62: 0x0031e488, 0x3a63: 0x4031e420, + 0x3a64: 0x0031f888, 0x3a65: 0x4031f820, 0x3a66: 0x002d8c88, 0x3a67: 0x402d8c20, + 0x3a68: 0xe0000fd5, 0x3a69: 0xe0000fd2, 0x3a6a: 0x0031ae88, 0x3a6b: 0x4031ae20, + 0x3a6c: 0x0031b088, 0x3a6d: 0x4031b020, 0x3a6e: 0x0031b288, 0x3a6f: 0x4031b220, + 0x3a70: 0x402d1020, 0x3a71: 0x402fee20, 0x3a72: 0xe00009cf, 0x3a73: 0xe00009cc, + 0x3a74: 0xe00009ff, 0x3a75: 0xe00009fc, 0x3a76: 0xe0000a05, 0x3a77: 0xe0000a02, + 0x3a78: 0xe0000a0e, 0x3a79: 0xe0000a0b, 0x3a7a: 0xe0000a15, 0x3a7b: 0xe0000a11, + 0x3a7c: 0xe0000a1c, 0x3a7d: 0xe0000a19, 0x3a7e: 0x002c6088, 0x3a7f: 0x402c6020, + // Block 0xea, offset 0x3a80 + 0x3a80: 0x002e1488, 0x3a81: 0x402e1420, 0x3a82: 0x002e1688, 0x3a83: 0x402e1620, + 0x3a84: 0x002e1888, 0x3a85: 0x402e1820, 0x3a86: 0x002e3288, 0x3a87: 0x402e3220, + 0x3a88: 0x002e3688, 0x3a89: 0x402e3620, 0x3a8a: 0x002f1888, 0x3a8b: 0x402f1820, + 0x3a8c: 0x002f0888, 0x3a8d: 0x402f0820, 0x3a8e: 0xe0000ea1, 0x3a8f: 0xe0000e9e, + 0x3a90: 0x002f3888, 0x3a91: 0x402f3820, 0x3a92: 0x002f4688, 0x3a93: 0x402f4620, + 0x3a94: 0x002f4888, 0x3a95: 0x402f4820, 0x3a96: 0x002f5e88, 0x3a97: 0x402f5e20, + 0x3a98: 0x002f6088, 0x3a99: 0x402f6020, 0x3a9a: 0x002f8a88, 0x3a9b: 0x402f8a20, + 0x3a9c: 0x002fe488, 0x3a9d: 0x402fe420, 0x3a9e: 0x0030c888, 0x3a9f: 0x4030c820, + 0x3aa0: 0xe00010c6, 0x3aa1: 0xe00010c3, 0x3aa2: 0x00316288, 0x3aa3: 0x40316220, + 0x3aa4: 0x00319088, 0x3aa5: 0x40319020, 0x3aa6: 0x00319288, 0x3aa7: 0x40319220, + 0x3aa8: 0x00319c88, 0x3aa9: 0x40319c20, 0x3aaa: 0x00319e88, 0x3aab: 0x40319e20, + 0x3aac: 0x0031a088, 0x3aad: 0x4031a020, 0x3aae: 0x0031a288, 0x3aaf: 0x4031a220, + 0x3ab0: 0x0031a294, 0x3ab1: 0x402c9420, 0x3ab2: 0x402e6620, 0x3ab3: 0x402e9c20, + 0x3ab4: 0x402ed820, 0x3ab5: 0x402fe020, 0x3ab6: 0x402fe220, 0x3ab7: 0x40306220, + 0x3ab8: 0x4031a420, 0x3ab9: 0xe0000abc, 0x3aba: 0xe0000ab9, 0x3abb: 0xe0000b92, + 0x3abc: 0xe0000b8f, 0x3abd: 0xe0000bdc, 0x3abe: 0x002d5688, 0x3abf: 0x402d5620, + // Block 0xeb, offset 0x3ac0 + 0x3ac0: 0x002e7088, 0x3ac1: 0x402e7020, 0x3ac2: 0xe0000f08, 0x3ac3: 0xe0000f05, + 0x3ac4: 0xe0000f6d, 0x3ac5: 0xe0000f6a, 0x3ac6: 0xe0000fb7, 0x3ac7: 0xe0000fb4, + 0x3ac8: 0x4006fe20, 0x3ac9: 0x40070020, 0x3aca: 0x40070220, 0x3acb: 0x0031e688, + 0x3acc: 0x4031e620, 0x3acd: 0x00308888, 0x3ace: 0x402e5c20, + 0x3ad0: 0x002ec488, 0x3ad1: 0x402ec420, 0x3ad2: 0x002c4c88, 0x3ad3: 0x402c4c20, + 0x3ae0: 0xe0000bd6, 0x3ae1: 0xe0000bd3, 0x3ae2: 0xe0000ca5, 0x3ae3: 0xe0000ca2, + 0x3ae4: 0xe0000d75, 0x3ae5: 0xe0000d72, 0x3ae6: 0xe0000ee2, 0x3ae7: 0xe0000edf, + 0x3ae8: 0xe0000f4d, 0x3ae9: 0xe0000f4a, 0x3aea: 0x002d8088, + // Block 0xec, offset 0x3b00 + 0x3b38: 0xf0001414, 0x3b39: 0xe0000e97, 0x3b3a: 0x4030a820, 0x3b3b: 0x402d2020, + 0x3b3c: 0x402f4a20, 0x3b3d: 0x402e9820, 0x3b3e: 0x402db220, 0x3b3f: 0x402e9a20, + // Block 0xed, offset 0x3b40 + 0x3b40: 0x4045aa20, 0x3b41: 0x4045ac20, 0x3b42: 0x4045ae20, 0x3b43: 0x4045b020, + 0x3b44: 0x4045b220, 0x3b45: 0x4045b420, 0x3b46: 0x820922db, 0x3b47: 0x4045b820, + 0x3b48: 0x4045ba20, 0x3b49: 0x4045bc20, 0x3b4a: 0x4045be20, 0x3b4b: 0xa000f302, + 0x3b4c: 0x4045c020, 0x3b4d: 0x4045c220, 0x3b4e: 0x4045c420, 0x3b4f: 0x4045c620, + 0x3b50: 0x4045c820, 0x3b51: 0x4045ca20, 0x3b52: 0x4045cc20, 0x3b53: 0x4045ce20, + 0x3b54: 0x4045d020, 0x3b55: 0x4045d220, 0x3b56: 0x4045d420, 0x3b57: 0x4045d620, + 0x3b58: 0x4045d820, 0x3b59: 0x4045da20, 0x3b5a: 0x4045dc20, 0x3b5b: 0x4045de20, + 0x3b5c: 0x4045e020, 0x3b5d: 0x4045e220, 0x3b5e: 0x4045e420, 0x3b5f: 0x4045e620, + 0x3b60: 0x4045e820, 0x3b61: 0x4045ea20, 0x3b62: 0x4045ec20, 0x3b63: 0x4045ee20, + 0x3b64: 0x4045f020, 0x3b65: 0x4045f220, 0x3b66: 0x4045f420, 0x3b67: 0x4045f620, + 0x3b68: 0x40075020, 0x3b69: 0x40075220, 0x3b6a: 0x40075420, 0x3b6b: 0x40075620, + 0x3b70: 0x40284820, 0x3b71: 0x40284a20, 0x3b72: 0x40284c20, 0x3b73: 0x40284e20, + 0x3b74: 0x40285020, 0x3b75: 0x40285220, 0x3b76: 0x40075820, 0x3b77: 0x40075a20, + 0x3b78: 0x4027f020, 0x3b79: 0x40075c20, + // Block 0xee, offset 0x3b80 + 0x3b80: 0x404baa20, 0x3b81: 0x404bac20, 0x3b82: 0x404bae20, 0x3b83: 0x404bb020, + 0x3b84: 0x404bb220, 0x3b85: 0x404bb420, 0x3b86: 0x404bb620, 0x3b87: 0x404bb820, + 0x3b88: 0x404bc220, 0x3b89: 0x404bc420, 0x3b8a: 0x404bc620, 0x3b8b: 0x404bc820, + 0x3b8c: 0x404bca20, 0x3b8d: 0x404bcc20, 0x3b8e: 0x404bce20, 0x3b8f: 0x404bd020, + 0x3b90: 0x404bd220, 0x3b91: 0x404bd420, 0x3b92: 0x404bd620, 0x3b93: 0x404bd820, + 0x3b94: 0x404bdc20, 0x3b95: 0x404bde20, 0x3b96: 0x404be020, 0x3b97: 0x404be220, + 0x3b98: 0x404be820, 0x3b99: 0x404bee20, 0x3b9a: 0x404bf020, 0x3b9b: 0x404bf420, + 0x3b9c: 0x404bf620, 0x3b9d: 0x404bfc20, 0x3b9e: 0x404c0620, 0x3b9f: 0x404c0820, + 0x3ba0: 0x404c0a20, 0x3ba1: 0x404c0c20, 0x3ba2: 0x404bfe20, 0x3ba3: 0x404c0020, + 0x3ba4: 0x404c0220, 0x3ba5: 0x404c0420, 0x3ba6: 0x404c0e20, 0x3ba7: 0x404bda20, + 0x3ba8: 0x404be420, 0x3ba9: 0x404bba20, 0x3baa: 0x404bbc20, 0x3bab: 0x404bbe20, + 0x3bac: 0x404bc020, 0x3bad: 0x404be620, 0x3bae: 0x404bf220, 0x3baf: 0x404bf820, + 0x3bb0: 0x404bfa20, 0x3bb1: 0x404bea20, 0x3bb2: 0x404bec20, 0x3bb3: 0x404c1020, + 0x3bb4: 0x4005e820, 0x3bb5: 0x4005ea20, 0x3bb6: 0x40031820, 0x3bb7: 0x40031a20, + // Block 0xef, offset 0x3bc0 + 0x3bc0: 0xa000f302, 0x3bc1: 0xa000f402, 0x3bc2: 0x4045f820, 0x3bc3: 0x4045fa20, + 0x3bc4: 0x4045fc20, 0x3bc5: 0x4045fe20, 0x3bc6: 0x40460020, 0x3bc7: 0x40460220, + 0x3bc8: 0x40460420, 0x3bc9: 0x40460620, 0x3bca: 0x40460820, 0x3bcb: 0x40460a20, + 0x3bcc: 0x40460c20, 0x3bcd: 0x40460e20, 0x3bce: 0x40461020, 0x3bcf: 0x40461220, + 0x3bd0: 0x40461420, 0x3bd1: 0x40461620, 0x3bd2: 0x40461820, 0x3bd3: 0x40461a20, + 0x3bd4: 0x40461c20, 0x3bd5: 0x40461e20, 0x3bd6: 0x40462020, 0x3bd7: 0x40462220, + 0x3bd8: 0x40462420, 0x3bd9: 0x40462620, 0x3bda: 0x40462820, 0x3bdb: 0x40462a20, + 0x3bdc: 0x40462c20, 0x3bdd: 0x40462e20, 0x3bde: 0x40463020, 0x3bdf: 0x40463220, + 0x3be0: 0x40463420, 0x3be1: 0x40463620, 0x3be2: 0x40463820, 0x3be3: 0x40463a20, + 0x3be4: 0x40463c20, 0x3be5: 0x40463e20, 0x3be6: 0x40464020, 0x3be7: 0x40464220, + 0x3be8: 0x40464420, 0x3be9: 0x40464620, 0x3bea: 0x40464820, 0x3beb: 0x40464a20, + 0x3bec: 0x40464c20, 0x3bed: 0x40464e20, 0x3bee: 0x40465020, 0x3bef: 0x40465220, + 0x3bf0: 0x40465420, 0x3bf1: 0x40465620, 0x3bf2: 0x40465820, 0x3bf3: 0x40465a20, + 0x3bf4: 0x40465c20, 0x3bf5: 0x40465e20, 0x3bf6: 0x40466020, 0x3bf7: 0x40466220, + 0x3bf8: 0x40466420, 0x3bf9: 0x40466620, 0x3bfa: 0x40466820, 0x3bfb: 0x40466a20, + 0x3bfc: 0x40466c20, 0x3bfd: 0x40466e20, 0x3bfe: 0x40467020, 0x3bff: 0x40467220, + // Block 0xf0, offset 0x3c00 + 0x3c00: 0x40467420, 0x3c01: 0x40467620, 0x3c02: 0x40467820, 0x3c03: 0x40467a20, + 0x3c04: 0x8209233e, + 0x3c0e: 0x40031020, 0x3c0f: 0x40031220, + 0x3c10: 0xe000018b, 0x3c11: 0xe000021c, 0x3c12: 0xe0000337, 0x3c13: 0xe0000411, + 0x3c14: 0xe00004e6, 0x3c15: 0xe00005b0, 0x3c16: 0xe000067b, 0x3c17: 0xe0000723, + 0x3c18: 0xe00007cf, 0x3c19: 0xe0000874, + 0x3c20: 0xae600000, 0x3c21: 0xae600000, 0x3c22: 0xae600000, 0x3c23: 0xae600000, + 0x3c24: 0xae600000, 0x3c25: 0xae600000, 0x3c26: 0xae600000, 0x3c27: 0xae600000, + 0x3c28: 0xae600000, 0x3c29: 0xae600000, 0x3c2a: 0xae600000, 0x3c2b: 0xae600000, + 0x3c2c: 0xae600000, 0x3c2d: 0xae600000, 0x3c2e: 0xae600000, 0x3c2f: 0xae600000, + 0x3c30: 0xae600000, 0x3c31: 0xae600000, 0x3c32: 0x40404620, 0x3c33: 0x00404684, + 0x3c34: 0x00404684, 0x3c35: 0x00404684, 0x3c36: 0x00404684, 0x3c37: 0x00404684, + 0x3c38: 0x40056e20, 0x3c39: 0x40057020, 0x3c3a: 0x40057220, 0x3c3b: 0x40404820, + // Block 0xf1, offset 0x3c40 + 0x3c40: 0xe00001a9, 0x3c41: 0xe000023d, 0x3c42: 0xe0000355, 0x3c43: 0xe000042f, + 0x3c44: 0xe0000504, 0x3c45: 0xe00005ce, 0x3c46: 0xe0000699, 0x3c47: 0xe0000741, + 0x3c48: 0xe00007ed, 0x3c49: 0xe0000892, 0x3c4a: 0x404dd220, 0x3c4b: 0x404dd420, + 0x3c4c: 0x404dd620, 0x3c4d: 0x404dd820, 0x3c4e: 0x404dda20, 0x3c4f: 0x404ddc20, + 0x3c50: 0x404dde20, 0x3c51: 0x404de020, 0x3c52: 0x404de220, 0x3c53: 0x404de420, + 0x3c54: 0x404de620, 0x3c55: 0x404de820, 0x3c56: 0x404dea20, 0x3c57: 0x404dec20, + 0x3c58: 0x404dee20, 0x3c59: 0x404df020, 0x3c5a: 0x404df220, 0x3c5b: 0x404df420, + 0x3c5c: 0x404df620, 0x3c5d: 0x404df820, 0x3c5e: 0x404dfa20, 0x3c5f: 0x404dfc20, + 0x3c60: 0x404dfe20, 0x3c61: 0x404e0020, 0x3c62: 0x404e0220, 0x3c63: 0x404e0420, + 0x3c64: 0x404e0620, 0x3c65: 0x404e0820, 0x3c66: 0x404e0a20, 0x3c67: 0x404e0c20, + 0x3c68: 0x404e0e20, 0x3c69: 0x404e1020, 0x3c6a: 0x404e1220, 0x3c6b: 0xadc10f02, + 0x3c6c: 0xadc11002, 0x3c6d: 0xadc11102, 0x3c6e: 0x4005f420, 0x3c6f: 0x40032020, + 0x3c70: 0x404d8a20, 0x3c71: 0x404d8c20, 0x3c72: 0x404d8e20, 0x3c73: 0x404d9020, + 0x3c74: 0x404d9220, 0x3c75: 0x404d9420, 0x3c76: 0x404d9620, 0x3c77: 0x404d9820, + 0x3c78: 0x404d9a20, 0x3c79: 0x404d9c20, 0x3c7a: 0x404d9e20, 0x3c7b: 0x404da020, + 0x3c7c: 0x404da220, 0x3c7d: 0x404da420, 0x3c7e: 0x404da620, 0x3c7f: 0x404da820, + // Block 0xf2, offset 0x3c80 + 0x3c80: 0x404daa20, 0x3c81: 0x404dac20, 0x3c82: 0x404dae20, 0x3c83: 0x404db020, + 0x3c84: 0x404db220, 0x3c85: 0x404db420, 0x3c86: 0x404db620, 0x3c87: 0x404db820, + 0x3c88: 0x404dba20, 0x3c89: 0x404dbc20, 0x3c8a: 0x404dbe20, 0x3c8b: 0x404dc020, + 0x3c8c: 0x404dc220, 0x3c8d: 0x404dc420, 0x3c8e: 0x404dc620, 0x3c8f: 0x404dc820, + 0x3c90: 0x404dca20, 0x3c91: 0x404dcc20, 0x3c92: 0x404dce20, 0x3c93: 0x820926e8, + 0x3c9f: 0x40038420, + 0x3ca0: 0x40636a20, 0x3ca1: 0x40636c20, 0x3ca2: 0x40636e20, 0x3ca3: 0x40637020, + 0x3ca4: 0x40637220, 0x3ca5: 0x40637420, 0x3ca6: 0x40637620, 0x3ca7: 0x40637820, + 0x3ca8: 0x40637a20, 0x3ca9: 0x40637c20, 0x3caa: 0x40637e20, 0x3cab: 0x40638020, + 0x3cac: 0x40638220, 0x3cad: 0x40638420, 0x3cae: 0x40638620, 0x3caf: 0x40638820, + 0x3cb0: 0x40638a20, 0x3cb1: 0x40638c20, 0x3cb2: 0x40638e20, 0x3cb3: 0x40639020, + 0x3cb4: 0x40639220, 0x3cb5: 0x40639420, 0x3cb6: 0x40639620, 0x3cb7: 0x40639820, + 0x3cb8: 0x40639a20, 0x3cb9: 0x40639c20, 0x3cba: 0x40639e20, 0x3cbb: 0x4063a020, + 0x3cbc: 0x4063a220, + // Block 0xf3, offset 0x3cc0 + 0x3cc0: 0xa000f202, 0x3cc1: 0xa000f302, 0x3cc2: 0xa000f802, 0x3cc3: 0xa000f402, + 0x3cc4: 0x4052b220, 0x3cc5: 0x4052b420, 0x3cc6: 0x4052b620, 0x3cc7: 0x4052b820, + 0x3cc8: 0x4052ba20, 0x3cc9: 0x4052bc20, 0x3cca: 0x4052be20, 0x3ccb: 0x4052c020, + 0x3ccc: 0x4052c220, 0x3ccd: 0x4052c420, 0x3cce: 0x4052c620, 0x3ccf: 0x4052c820, + 0x3cd0: 0x4052ca20, 0x3cd1: 0x4052cc20, 0x3cd2: 0x4052ce20, 0x3cd3: 0x4052d020, + 0x3cd4: 0x4052d220, 0x3cd5: 0x4052d420, 0x3cd6: 0x4052d620, 0x3cd7: 0x4052d820, + 0x3cd8: 0x4052da20, 0x3cd9: 0x4052dc20, 0x3cda: 0x4052de20, 0x3cdb: 0x4052e020, + 0x3cdc: 0x4052e220, 0x3cdd: 0x4052e420, 0x3cde: 0x4052e620, 0x3cdf: 0x4052e820, + 0x3ce0: 0x4052ea20, 0x3ce1: 0x4052ec20, 0x3ce2: 0x4052ee20, 0x3ce3: 0x4052f020, + 0x3ce4: 0x4052f220, 0x3ce5: 0x4052f420, 0x3ce6: 0x4052f620, 0x3ce7: 0x4052f820, + 0x3ce8: 0x4052fa20, 0x3ce9: 0x4052fc20, 0x3cea: 0x4052fe20, 0x3ceb: 0x40530220, + 0x3cec: 0x00530284, 0x3ced: 0x40530620, 0x3cee: 0x40530820, 0x3cef: 0x40530a20, + 0x3cf0: 0x40530c20, 0x3cf1: 0x40530e20, 0x3cf2: 0x40531020, 0x3cf3: 0xa070f102, + 0x3cf4: 0x40531220, 0x3cf5: 0x40532420, 0x3cf6: 0x40531620, 0x3cf7: 0x40531820, + 0x3cf8: 0x40531a20, 0x3cf9: 0x40531c20, 0x3cfa: 0x40532020, 0x3cfb: 0x40532220, + 0x3cfc: 0x40531420, 0x3cfd: 0x40531e20, 0x3cfe: 0x40530020, 0x3cff: 0x40530420, + // Block 0xf4, offset 0x3d00 + 0x3d00: 0x82092993, 0x3d01: 0x40036e20, 0x3d02: 0x40037020, 0x3d03: 0x40037220, + 0x3d04: 0x40037420, 0x3d05: 0x40037620, 0x3d06: 0x40037820, 0x3d07: 0x4002b020, + 0x3d08: 0x40033620, 0x3d09: 0x40033820, 0x3d0a: 0x40037a20, 0x3d0b: 0x40037c20, + 0x3d0c: 0x40037e20, 0x3d0d: 0x40038020, 0x3d0f: 0x4027c020, + 0x3d10: 0xe00001c1, 0x3d11: 0xe0000255, 0x3d12: 0xe000036d, 0x3d13: 0xe0000447, + 0x3d14: 0xe000051c, 0x3d15: 0xe00005e6, 0x3d16: 0xe00006b1, 0x3d17: 0xe0000759, + 0x3d18: 0xe0000805, 0x3d19: 0xe00008aa, + 0x3d1e: 0x4005f620, 0x3d1f: 0x4005f820, + // Block 0xf5, offset 0x3d40 + 0x3d40: 0x40519c20, 0x3d41: 0x40519e20, 0x3d42: 0x4051a020, 0x3d43: 0x4051a220, + 0x3d44: 0x4051a420, 0x3d45: 0x4051a620, 0x3d46: 0x4051a820, 0x3d47: 0x4051aa20, + 0x3d48: 0x4051ac20, 0x3d49: 0x4051ae20, 0x3d4a: 0x4051b020, 0x3d4b: 0x4051b220, + 0x3d4c: 0x4051b420, 0x3d4d: 0x4051b620, 0x3d4e: 0x4051b820, 0x3d4f: 0x4051ba20, + 0x3d50: 0x4051bc20, 0x3d51: 0x4051be20, 0x3d52: 0x4051c020, 0x3d53: 0x4051c220, + 0x3d54: 0x4051c420, 0x3d55: 0x4051c620, 0x3d56: 0x4051c820, 0x3d57: 0x4051ca20, + 0x3d58: 0x4051cc20, 0x3d59: 0x4051ce20, 0x3d5a: 0x4051d020, 0x3d5b: 0x4051d220, + 0x3d5c: 0x4051d420, 0x3d5d: 0x4051d620, 0x3d5e: 0x4051d820, 0x3d5f: 0x4051da20, + 0x3d60: 0x4051dc20, 0x3d61: 0x4051de20, 0x3d62: 0x4051e020, 0x3d63: 0x4051e220, + 0x3d64: 0x4051e420, 0x3d65: 0x4051e620, 0x3d66: 0x4051e820, 0x3d67: 0x4051ea20, + 0x3d68: 0x4051ec20, 0x3d69: 0x4051f620, 0x3d6a: 0x4051f820, 0x3d6b: 0x4051fa20, + 0x3d6c: 0x4051fc20, 0x3d6d: 0x4051fe20, 0x3d6e: 0x40520020, 0x3d6f: 0x40520220, + 0x3d70: 0x40520420, 0x3d71: 0x40520620, 0x3d72: 0x40520820, 0x3d73: 0x4051ee20, + 0x3d74: 0x4051f020, 0x3d75: 0x4051f220, 0x3d76: 0x4051f420, + // Block 0xf6, offset 0x3d80 + 0x3d80: 0x40520a20, 0x3d81: 0x40520c20, 0x3d82: 0x40520e20, 0x3d83: 0x40521020, + 0x3d84: 0x40521220, 0x3d85: 0x40521420, 0x3d86: 0x40521620, 0x3d87: 0x40521820, + 0x3d88: 0x40521a20, 0x3d89: 0x40521c20, 0x3d8a: 0x40521e20, 0x3d8b: 0x40522020, + 0x3d8c: 0x40522220, 0x3d8d: 0x40522420, + 0x3d90: 0xe00001bb, 0x3d91: 0xe000024f, 0x3d92: 0xe0000367, 0x3d93: 0xe0000441, + 0x3d94: 0xe0000516, 0x3d95: 0xe00005e0, 0x3d96: 0xe00006ab, 0x3d97: 0xe0000753, + 0x3d98: 0xe00007ff, 0x3d99: 0xe00008a4, + 0x3d9c: 0x4005fa20, 0x3d9d: 0x40033a20, 0x3d9e: 0x40033c20, 0x3d9f: 0x40033e20, + 0x3da0: 0x404e2020, 0x3da1: 0x404e2c20, 0x3da2: 0x404e3020, 0x3da3: 0x404e3420, + 0x3da4: 0x404e3e20, 0x3da5: 0x404e4620, 0x3da6: 0x404e4c20, 0x3da7: 0x404e5020, + 0x3da8: 0x404e5420, 0x3da9: 0x404e5820, 0x3daa: 0x404e6820, 0x3dab: 0x404e6e20, + 0x3dac: 0x404ea820, 0x3dad: 0x404eae20, 0x3dae: 0x404eb220, 0x3daf: 0x404e7a20, + 0x3db0: 0x4027c220, 0x3db1: 0x404eb420, 0x3db2: 0x404e3820, 0x3db3: 0x404e8e20, + 0x3db4: 0x404f3a20, 0x3db5: 0x404f3c20, 0x3db6: 0x404f3e20, 0x3db7: 0x4007ac20, + 0x3db8: 0x4007ae20, 0x3db9: 0x4007b020, 0x3dba: 0x404e9020, 0x3dbb: 0x404f3820, + // Block 0xf7, offset 0x3dc0 + 0x3dc0: 0x4049f020, 0x3dc1: 0x4049f220, 0x3dc2: 0x4049f420, 0x3dc3: 0x4049f620, + 0x3dc4: 0x4049f820, 0x3dc5: 0x4049fa20, 0x3dc6: 0x4049fc20, 0x3dc7: 0x4049fe20, + 0x3dc8: 0x404a0020, 0x3dc9: 0x404a0220, 0x3dca: 0x404a0420, 0x3dcb: 0x404a0620, + 0x3dcc: 0x404a0820, 0x3dcd: 0x404a0a20, 0x3dce: 0x404a0c20, 0x3dcf: 0x404a0e20, + 0x3dd0: 0x404a1020, 0x3dd1: 0x404a1220, 0x3dd2: 0x404a1420, 0x3dd3: 0x404a1620, + 0x3dd4: 0x404a1820, 0x3dd5: 0x404a1a20, 0x3dd6: 0x404a1c20, 0x3dd7: 0x404a1e20, + 0x3dd8: 0x404a2020, 0x3dd9: 0x404a2220, 0x3dda: 0x404a2420, 0x3ddb: 0x404a2620, + 0x3ddc: 0x404a2820, 0x3ddd: 0x404a2a20, 0x3dde: 0x404a2c20, 0x3ddf: 0x404a2e20, + 0x3de0: 0x404a3020, 0x3de1: 0x404a3220, 0x3de2: 0x404a3420, 0x3de3: 0x404a3620, + 0x3de4: 0x404a3820, 0x3de5: 0x404a3a20, 0x3de6: 0x404a3c20, 0x3de7: 0x404a3e20, + 0x3de8: 0x404a4020, 0x3de9: 0x404a4220, 0x3dea: 0x404a4420, 0x3deb: 0x404a4620, + 0x3dec: 0x404a4820, 0x3ded: 0x404a4a20, 0x3dee: 0x404a4c20, 0x3def: 0x404a4e20, + 0x3df0: 0x82e62528, 0x3df1: 0x404a5220, 0x3df2: 0x82e6252a, 0x3df3: 0x82e6252b, + 0x3df4: 0x82dc252c, 0x3df5: 0xc20e0671, 0x3df6: 0xc23f0671, 0x3df7: 0x82e6252f, + 0x3df8: 0x82e62530, 0x3df9: 0xc2700671, 0x3dfa: 0x404a6420, 0x3dfb: 0xc2a10671, + 0x3dfc: 0xc2d20671, 0x3dfd: 0x404a6a20, 0x3dfe: 0x82e62536, 0x3dff: 0xae610c02, + // Block 0xf8, offset 0x3e00 + 0x3e00: 0x404a6e20, 0x3e01: 0xae610d02, 0x3e02: 0x404a7020, + 0x3e1b: 0x404a7220, + 0x3e1c: 0x404a7420, 0x3e1d: 0x4027c420, 0x3e1e: 0x40057e20, 0x3e1f: 0x40058020, + 0x3e20: 0x40456420, 0x3e21: 0x40456620, 0x3e22: 0x40456820, 0x3e23: 0x40456a20, + 0x3e24: 0x40456c20, 0x3e25: 0x40456e20, 0x3e26: 0x40457020, 0x3e27: 0x40457220, + 0x3e28: 0x40457420, 0x3e29: 0x40457620, 0x3e2a: 0x40457820, 0x3e2b: 0x40458a20, + 0x3e2c: 0x40458c20, 0x3e2d: 0x40458e20, 0x3e2e: 0x40459020, 0x3e2f: 0x40459220, + 0x3e30: 0x40034020, 0x3e31: 0x4002dc20, 0x3e32: 0x40452c20, 0x3e33: 0x4027c620, + 0x3e34: 0x4027c820, 0x3e35: 0x40459420, 0x3e36: 0x820922d4, + // Block 0xf9, offset 0x3e40 + 0x3e41: 0x403cae20, 0x3e42: 0x403cb020, 0x3e43: 0x403cb220, + 0x3e44: 0x403cb420, 0x3e45: 0x403cb620, 0x3e46: 0x403cb820, + 0x3e49: 0x403e3c20, 0x3e4a: 0x403e3e20, 0x3e4b: 0x403e4020, + 0x3e4c: 0x403e4220, 0x3e4d: 0x403e4420, 0x3e4e: 0x403e4620, + 0x3e51: 0x403dfe20, 0x3e52: 0x403e0020, 0x3e53: 0x403e0220, + 0x3e54: 0x403e0420, 0x3e55: 0x403e0620, 0x3e56: 0x403e0820, + 0x3e60: 0x403ec220, 0x3e61: 0x403ec420, 0x3e62: 0x403ec620, 0x3e63: 0x403ec820, + 0x3e64: 0x403eca20, 0x3e65: 0x403ecc20, 0x3e66: 0x403ece20, + 0x3e68: 0x403ef220, 0x3e69: 0x403ef420, 0x3e6a: 0x403ef620, 0x3e6b: 0x403ef820, + 0x3e6c: 0x403efa20, 0x3e6d: 0x403efc20, 0x3e6e: 0x403efe20, + // Block 0xfa, offset 0x3e80 + 0x3e80: 0x40452e20, 0x3e81: 0x40453020, 0x3e82: 0x40453220, 0x3e83: 0x40453420, + 0x3e84: 0x40453620, 0x3e85: 0x40453820, 0x3e86: 0x40453a20, 0x3e87: 0x40453c20, + 0x3e88: 0x40453e20, 0x3e89: 0x40454020, 0x3e8a: 0x40454220, 0x3e8b: 0x40454420, + 0x3e8c: 0x40454620, 0x3e8d: 0x40454820, 0x3e8e: 0x40454a20, 0x3e8f: 0x40454c20, + 0x3e90: 0x40454e20, 0x3e91: 0x40455020, 0x3e92: 0x40455220, 0x3e93: 0x40455420, + 0x3e94: 0x40455620, 0x3e95: 0x40455820, 0x3e96: 0x40455a20, 0x3e97: 0x40455c20, + 0x3e98: 0x40455e20, 0x3e99: 0x40456020, 0x3e9a: 0x40456220, 0x3e9b: 0x40459620, + 0x3e9c: 0x40459820, 0x3e9d: 0x40459a20, 0x3e9e: 0x40459c20, 0x3e9f: 0x40459e20, + 0x3ea0: 0x4045a020, 0x3ea1: 0x4045a220, 0x3ea2: 0x4045a420, 0x3ea3: 0x40457a20, + 0x3ea4: 0x40457c20, 0x3ea5: 0x40457e20, 0x3ea6: 0x40458020, 0x3ea7: 0x40458220, + 0x3ea8: 0x40458420, 0x3ea9: 0x40458620, 0x3eaa: 0x40458820, 0x3eab: 0x40034220, + 0x3eac: 0xa000fa02, 0x3ead: 0x820922d3, + 0x3eb0: 0xe0000188, 0x3eb1: 0xe0000219, 0x3eb2: 0xe0000334, 0x3eb3: 0xe000040e, + 0x3eb4: 0xe00004e3, 0x3eb5: 0xe00005ad, 0x3eb6: 0xe0000678, 0x3eb7: 0xe0000720, + 0x3eb8: 0xe00007cc, 0x3eb9: 0xe0000871, + // Block 0xfb, offset 0x3ec0 + 0x3ef0: 0x40643620, 0x3ef1: 0x40643820, 0x3ef2: 0x40643a20, 0x3ef3: 0x40643c20, + 0x3ef4: 0x40643e20, 0x3ef5: 0x40644020, 0x3ef6: 0x40644220, 0x3ef7: 0x40644420, + 0x3ef8: 0x40644620, 0x3ef9: 0x40644820, 0x3efa: 0x40644a20, 0x3efb: 0x40644c20, + 0x3efc: 0x40644e20, 0x3efd: 0x40645020, 0x3efe: 0x40645220, 0x3eff: 0x40645420, + // Block 0xfc, offset 0x3f00 + 0x3f00: 0x40645620, 0x3f01: 0x40645820, 0x3f02: 0x40645a20, 0x3f03: 0x40645c20, + 0x3f04: 0x40645e20, 0x3f05: 0x40646020, 0x3f06: 0x40646220, + 0x3f0b: 0x40651420, + 0x3f0c: 0x40651620, 0x3f0d: 0x40651820, 0x3f0e: 0x40651a20, 0x3f0f: 0x40651c20, + 0x3f10: 0x40651e20, 0x3f11: 0x40652020, 0x3f12: 0x40652220, 0x3f13: 0x40652420, + 0x3f14: 0x40652620, 0x3f15: 0x40652820, 0x3f16: 0x40652a20, 0x3f17: 0x40652c20, + 0x3f18: 0x40652e20, 0x3f19: 0x40653020, 0x3f1a: 0x40653220, 0x3f1b: 0x40653420, + 0x3f1c: 0x40653620, 0x3f1d: 0x40653820, 0x3f1e: 0x40653a20, 0x3f1f: 0x40653c20, + 0x3f20: 0x40653e20, 0x3f21: 0x40654020, 0x3f22: 0x40654220, 0x3f23: 0x40654420, + 0x3f24: 0x40654620, 0x3f25: 0x40654820, 0x3f26: 0x40654a20, 0x3f27: 0x40654c20, + 0x3f28: 0x40654e20, 0x3f29: 0x40655020, 0x3f2a: 0x40655220, 0x3f2b: 0x40655420, + 0x3f2c: 0x40655620, 0x3f2d: 0x40655820, 0x3f2e: 0x40655a20, 0x3f2f: 0x40655c20, + 0x3f30: 0x40655e20, 0x3f31: 0x40656020, 0x3f32: 0x40656220, 0x3f33: 0x40656420, + 0x3f34: 0x40656620, 0x3f35: 0x40656820, 0x3f36: 0x40656a20, 0x3f37: 0x40656c20, + 0x3f38: 0x40656e20, 0x3f39: 0x40657020, 0x3f3a: 0x40657220, 0x3f3b: 0x40657420, + // Block 0xfd, offset 0x3f40 + 0x3f40: 0x43189020, 0x3f41: 0x42cde820, 0x3f42: 0x431d9420, 0x3f43: 0x43199020, + 0x3f44: 0x42dda220, 0x3f45: 0x429c6420, 0x3f46: 0x42a7ca20, 0x3f47: 0x433f3820, + 0x3f48: 0x433f3820, 0x3f49: 0x42b2a220, 0x3f4a: 0x4323a220, 0x3f4b: 0x42ab0e20, + 0x3f4c: 0x42b29020, 0x3f4d: 0x42c3ec20, 0x3f4e: 0x42ecd220, 0x3f4f: 0x42ff0a20, + 0x3f50: 0x430c7e20, 0x3f51: 0x430f7420, 0x3f52: 0x4311f020, 0x3f53: 0x43211e20, + 0x3f54: 0x42d40420, 0x3f55: 0x42da3620, 0x3f56: 0x42e1b220, 0x3f57: 0x42e7bc20, + 0x3f58: 0x43087a20, 0x3f59: 0x4322d420, 0x3f5a: 0x4333e220, 0x3f5b: 0x429d0420, + 0x3f5c: 0x42a6ea20, 0x3f5d: 0x42d60820, 0x3f5e: 0x42e43620, 0x3f5f: 0x430c5a20, + 0x3f60: 0x433c3c20, 0x3f61: 0x42baa020, 0x3f62: 0x42dfd620, 0x3f63: 0x430b9a20, + 0x3f64: 0x4312c820, 0x3f65: 0x42c59220, 0x3f66: 0x4303b020, 0x3f67: 0x43103e20, + 0x3f68: 0x42bd9420, 0x3f69: 0x42ce2e20, 0x3f6a: 0x42dad420, 0x3f6b: 0x42e5f820, + 0x3f6c: 0x43219c20, 0x3f6d: 0x429f0c20, 0x3f6e: 0x42a36e20, 0x3f6f: 0x42a5bc20, + 0x3f70: 0x42c98820, 0x3f71: 0x42d5a620, 0x3f72: 0x42e42020, 0x3f73: 0x42edce20, + 0x3f74: 0x43000220, 0x3f75: 0x430c0c20, 0x3f76: 0x430cb820, 0x3f77: 0x431bde20, + 0x3f78: 0x432e6420, 0x3f79: 0x4336de20, 0x3f7a: 0x433bf420, 0x3f7b: 0x42f11820, + 0x3f7c: 0x42f2fe20, 0x3f7d: 0x42fb4020, 0x3f7e: 0x43079220, 0x3f7f: 0x43260820, + // Block 0xfe, offset 0x3f80 + 0x3f80: 0x433cfe20, 0x3f81: 0x4315ac20, 0x3f82: 0x42b1be20, 0x3f83: 0x42be0820, + 0x3f84: 0x42f8c020, 0x3f85: 0x4300fc20, 0x3f86: 0x42e4c420, 0x3f87: 0x42f19420, + 0x3f88: 0x43198420, 0x3f89: 0x432dee20, 0x3f8a: 0x42b1b020, 0x3f8b: 0x42b8c420, + 0x3f8c: 0x42d42620, 0x3f8d: 0x42dbb420, 0x3f8e: 0x42de1e20, 0x3f8f: 0x42fa5e20, + 0x3f90: 0x42fc6e20, 0x3f91: 0x432c9620, 0x3f92: 0x42a5a420, 0x3f93: 0x43011620, + 0x3f94: 0x42a3b820, 0x3f95: 0x42a39820, 0x3f96: 0x42f43820, 0x3f97: 0x42fb7c20, + 0x3f98: 0x4307e220, 0x3f99: 0x432cea20, 0x3f9a: 0x43170020, 0x3f9b: 0x42c59e20, + 0x3f9c: 0x42d40420, 0x3f9d: 0x4315fc20, 0x3f9e: 0x429c7220, 0x3f9f: 0x42b7ce20, + 0x3fa0: 0x42c02420, 0x3fa1: 0x42e70e20, 0x3fa2: 0x42eae020, 0x3fa3: 0x42a62e20, + 0x3fa4: 0x42f1f620, 0x3fa5: 0x429f7e20, 0x3fa6: 0x42bf5220, 0x3fa7: 0x429c1a20, + 0x3fa8: 0x42d99820, 0x3fa9: 0x42caf020, 0x3faa: 0x42fa4420, 0x3fab: 0x42a78620, + 0x3fac: 0x42b0bc20, 0x3fad: 0x42ee0220, 0x3fae: 0x43089220, 0x3faf: 0x43155420, + 0x3fb0: 0x42d77420, 0x3fb1: 0x431f6020, 0x3fb2: 0x42d91020, 0x3fb3: 0x42c5fc20, + 0x3fb4: 0x4305ca20, 0x3fb5: 0x42c74020, 0x3fb6: 0x42eaca20, 0x3fb7: 0x429d5c20, + 0x3fb8: 0x42a2d220, 0x3fb9: 0x42a39220, 0x3fba: 0x42d10220, 0x3fbb: 0x42f9ce20, + 0x3fbc: 0x4304de20, 0x3fbd: 0x4315a420, 0x3fbe: 0x43239e20, 0x3fbf: 0x42a5ea20, + // Block 0xff, offset 0x3fc0 + 0x3fc0: 0x42a88420, 0x3fc1: 0x42b2e620, 0x3fc2: 0x42bdd820, 0x3fc3: 0x42cb8a20, + 0x3fc4: 0x42dffc20, 0x3fc5: 0x42f25420, 0x3fc6: 0x432b5a20, 0x3fc7: 0x4334d420, + 0x3fc8: 0x433d2e20, 0x3fc9: 0x433d9c20, 0x3fca: 0x42a53620, 0x3fcb: 0x42cd8c20, + 0x3fcc: 0x42d6ee20, 0x3fcd: 0x431ec420, 0x3fce: 0x42bce820, 0x3fcf: 0x42c32020, + 0x3fd0: 0x42c40020, 0x3fd1: 0x42c93420, 0x3fd2: 0x42de4620, 0x3fd3: 0x42e29220, + 0x3fd4: 0x42e91220, 0x3fd5: 0x42f39420, 0x3fd6: 0x42fbe820, 0x3fd7: 0x4300de20, + 0x3fd8: 0x431e4c20, 0x3fd9: 0x4309dc20, 0x3fda: 0x43204620, 0x3fdb: 0x43269420, + 0x3fdc: 0x42a42e20, 0x3fdd: 0x42a54620, 0x3fde: 0x42a97a20, 0x3fdf: 0x42e19020, + 0x3fe0: 0x43118420, 0x3fe1: 0x43155420, 0x3fe2: 0x42bd9220, 0x3fe3: 0x42bfea20, + 0x3fe4: 0x42c6f620, 0x3fe5: 0x42d75c20, 0x3fe6: 0x42f87c20, 0x3fe7: 0x42e6ea20, + 0x3fe8: 0x429dc820, 0x3fe9: 0x42adf220, 0x3fea: 0x42b7ce20, 0x3feb: 0x42bb7420, + 0x3fec: 0x42c03820, 0x3fed: 0x42e76420, 0x3fee: 0x42e8d220, 0x3fef: 0x42ff3420, + 0x3ff0: 0x43008c20, 0x3ff1: 0x43246820, 0x3ff2: 0x432dec20, 0x3ff3: 0x432e9020, + 0x3ff4: 0x43303020, 0x3ff5: 0x429f1620, 0x3ff6: 0x42f35c20, 0x3ff7: 0x43236820, + 0x3ff8: 0x432d7020, 0x3ff9: 0x42c1c220, 0x3ffa: 0x429d0c20, 0x3ffb: 0x42a1b420, + 0x3ffc: 0x42b7dc20, 0x3ffd: 0x42b87e20, 0x3ffe: 0x42cb3220, 0x3fff: 0x42d40420, + // Block 0x100, offset 0x4000 + 0x4000: 0x42e39c20, 0x4001: 0x42ec8420, 0x4002: 0x4309f820, 0x4003: 0x4320f820, + 0x4004: 0x433f1a20, 0x4005: 0x42cd1020, 0x4006: 0x432c5c20, 0x4007: 0x42a51220, + 0x4008: 0x42cef620, 0x4009: 0x42cfe620, 0x400a: 0x42da8220, 0x400b: 0x42dd3820, + 0x400c: 0x42e81220, 0x400d: 0x42eab220, 0x400e: 0x42f0d620, 0x400f: 0x42fa2020, + 0x4010: 0x4330bc20, 0x4011: 0x42a2da20, 0x4012: 0x42c45c20, 0x4013: 0x432cf020, + 0x4014: 0x42a05620, 0x4015: 0x42ba3220, 0x4016: 0x42dbd420, 0x4017: 0x431e5420, + 0x4018: 0x42bf1620, 0x4019: 0x42c28820, 0x401a: 0x42d02e20, 0x401b: 0x42e70e20, + 0x401c: 0x432d0c20, 0x401d: 0x42a45220, 0x401e: 0x42a81e20, 0x401f: 0x42b8ca20, + 0x4020: 0x42cc2620, 0x4021: 0x42ce9c20, 0x4022: 0x42d15020, 0x4023: 0x42d9ca20, + 0x4024: 0x42e80c20, 0x4025: 0x42ebc420, 0x4026: 0x42fef220, 0x4027: 0x43119e20, + 0x4028: 0x4311c220, 0x4029: 0x43239820, 0x402a: 0x432dc420, 0x402b: 0x42a67e20, + 0x402c: 0x42dd7420, 0x402d: 0x42a83a20, 0x402e: 0x42e3a020, 0x402f: 0x42e93020, + 0x4030: 0x430bf420, 0x4031: 0x432d4620, 0x4032: 0x4338ae20, 0x4033: 0x433d3e20, + 0x4034: 0x42cf2e20, 0x4035: 0x42db9620, 0x4036: 0x4303d020, 0x4037: 0x42f59620, + 0x4038: 0x42f64020, 0x4039: 0x42f92420, 0x403a: 0x42e58020, 0x403b: 0x42e13220, + 0x403c: 0x4316b020, 0x403d: 0x429d8020, 0x403e: 0x43066c20, 0x403f: 0x42a47420, + // Block 0x101, offset 0x4040 + 0x4040: 0x42a40e20, 0x4041: 0x42bd4c20, 0x4042: 0x42c5a620, 0x4043: 0x42f9ac20, + 0x4044: 0x42b70a20, 0x4045: 0x42da3c20, 0x4046: 0x42cd6820, 0x4047: 0x431e7620, + 0x4048: 0x43109820, 0x4049: 0x432c9a20, 0x404a: 0x43131620, 0x404b: 0x42bda620, + 0x404c: 0x42a28020, 0x404d: 0x42ab8020, 0x404e: 0x43f41c20, 0x404f: 0x43f41e20, + 0x4050: 0x42b0b420, 0x4051: 0x43f42220, 0x4052: 0x42cce820, 0x4053: 0x43f42620, + 0x4054: 0x43f42820, 0x4055: 0x42a3bc20, 0x4056: 0x42e65420, 0x4057: 0x42ed9420, + 0x4058: 0x42f27820, 0x4059: 0x42f2bc20, 0x405a: 0x42f2ca20, 0x405b: 0x42f31e20, + 0x405c: 0x432eac20, 0x405d: 0x42f97c20, 0x405e: 0x42ff7a20, 0x405f: 0x43f43e20, + 0x4060: 0x430c2420, 0x4061: 0x43f44220, 0x4062: 0x4315f020, 0x4063: 0x43f44620, + 0x4064: 0x43f44820, 0x4065: 0x43207020, 0x4066: 0x4321fa20, 0x4067: 0x43f44e20, + 0x4068: 0x43f45020, 0x4069: 0x43f45220, 0x406a: 0x4331de20, 0x406b: 0x4331f820, + 0x406c: 0x43325020, 0x406d: 0x433b6820, 0x406e: 0x4321bc20, 0x406f: 0x432d6e20, + 0x4070: 0x429f5c20, 0x4071: 0x42a1ce20, 0x4072: 0x42a29a20, 0x4073: 0x42a59220, + 0x4074: 0x42a5c820, 0x4075: 0x42a6a220, 0x4076: 0x42ab3a20, 0x4077: 0x42ac0c20, + 0x4078: 0x42acd020, 0x4079: 0x42b08020, 0x407a: 0x42b15020, 0x407b: 0x42b8c820, + 0x407c: 0x42b8dc20, 0x407d: 0x42c12820, 0x407e: 0x42c2d020, 0x407f: 0x42c31c20, + // Block 0x102, offset 0x4080 + 0x4080: 0x42c3e420, 0x4081: 0x42ca9e20, 0x4082: 0x42cbc420, 0x4083: 0x42cd2220, + 0x4084: 0x42d10a20, 0x4085: 0x42daee20, 0x4086: 0x42dc3420, 0x4087: 0x42de4420, + 0x4088: 0x42e2dc20, 0x4089: 0x42e45620, 0x408a: 0x42e84420, 0x408b: 0x42f12220, + 0x408c: 0x42f27c20, 0x408d: 0x42f29220, 0x408e: 0x42f29020, 0x408f: 0x42f2a020, + 0x4090: 0x42f2ac20, 0x4091: 0x42f2ba20, 0x4092: 0x42f31a20, 0x4093: 0x42f31c20, + 0x4094: 0x42f48020, 0x4095: 0x42f50220, 0x4096: 0x42f78020, 0x4097: 0x42fbe820, + 0x4098: 0x42fc1220, 0x4099: 0x42fc8220, 0x409a: 0x42fee420, 0x409b: 0x43000a20, + 0x409c: 0x4303da20, 0x409d: 0x4304f220, 0x409e: 0x4304f220, 0x409f: 0x4308ae20, + 0x40a0: 0x43122020, 0x40a1: 0x43132c20, 0x40a2: 0x43160220, 0x40a3: 0x43167220, + 0x40a4: 0x4319a620, 0x40a5: 0x431a1020, 0x40a6: 0x431f6c20, 0x40a7: 0x43207020, + 0x40a8: 0x432dc620, 0x40a9: 0x432ffe20, 0x40aa: 0x43307620, 0x40ab: 0x42c0ea20, + 0x40ac: 0x4885dc20, 0x40ad: 0x43043020, + 0x40b0: 0x429c4c20, 0x40b1: 0x42a36a20, 0x40b2: 0x42a2d020, 0x40b3: 0x429f0020, + 0x40b4: 0x42a28a20, 0x40b5: 0x42a30020, 0x40b6: 0x42a58e20, 0x40b7: 0x42a5f420, + 0x40b8: 0x42ab3a20, 0x40b9: 0x42aaaa20, 0x40ba: 0x42ab3220, 0x40bb: 0x42abc420, + 0x40bc: 0x42b0b420, 0x40bd: 0x42b16620, 0x40be: 0x42b28820, 0x40bf: 0x42b2a820, + // Block 0x103, offset 0x40c0 + 0x40c0: 0x42b4c420, 0x40c1: 0x42b65020, 0x40c2: 0x42bda420, 0x40c3: 0x42bdb220, + 0x40c4: 0x42bed220, 0x40c5: 0x42bf5a20, 0x40c6: 0x42c1b020, 0x40c7: 0x42c29c20, + 0x40c8: 0x42c21020, 0x40c9: 0x42c31c20, 0x40ca: 0x42c2c020, 0x40cb: 0x42c3e420, + 0x40cc: 0x42c46820, 0x40cd: 0x42c78820, 0x40ce: 0x42c83820, 0x40cf: 0x42c8a420, + 0x40d0: 0x42caac20, 0x40d1: 0x42cce820, 0x40d2: 0x42ce2e20, 0x40d3: 0x42ce3620, + 0x40d4: 0x42ceac20, 0x40d5: 0x42d6f220, 0x40d6: 0x42d77420, 0x40d7: 0x42da8220, + 0x40d8: 0x42ddb620, 0x40d9: 0x42dd9620, 0x40da: 0x42de4420, 0x40db: 0x42e03c20, + 0x40dc: 0x42e2dc20, 0x40dd: 0x42ef4e20, 0x40de: 0x42e46a20, 0x40df: 0x42e55e20, + 0x40e0: 0x42e65420, 0x40e1: 0x42e8e220, 0x40e2: 0x42ea0c20, 0x40e3: 0x42ea7620, + 0x40e4: 0x42ec3a20, 0x40e5: 0x42ec3e20, 0x40e6: 0x42ed9420, 0x40e7: 0x42edb620, + 0x40e8: 0x42ede820, 0x40e9: 0x42ee9420, 0x40ea: 0x42ee8020, 0x40eb: 0x42f19820, + 0x40ec: 0x42f56220, 0x40ed: 0x42f78020, 0x40ee: 0x42f8f620, 0x40ef: 0x42fab620, + 0x40f0: 0x42fbe820, 0x40f1: 0x42fe7c20, 0x40f2: 0x43000a20, 0x40f3: 0x4306a420, + 0x40f4: 0x4307de20, 0x40f5: 0x430ef220, 0x40f6: 0x43128220, 0x40f7: 0x43130c20, + 0x40f8: 0x43132c20, 0x40f9: 0x43157e20, 0x40fa: 0x4315f020, 0x40fb: 0x43159620, + 0x40fc: 0x43160220, 0x40fd: 0x4315fc20, 0x40fe: 0x4315da20, 0x40ff: 0x43167220, + // Block 0x104, offset 0x4100 + 0x4100: 0x43171420, 0x4101: 0x431a1020, 0x4102: 0x431e7020, 0x4103: 0x4320e420, + 0x4104: 0x43233220, 0x4105: 0x4324ec20, 0x4106: 0x432cf820, 0x4107: 0x432dc620, + 0x4108: 0x432eac20, 0x4109: 0x432fb620, 0x410a: 0x432ffe20, 0x410b: 0x43301620, + 0x410c: 0x43307620, 0x410d: 0x43362420, 0x410e: 0x433f3820, 0x410f: 0x48509420, + 0x4110: 0x48508820, 0x4111: 0x4867aa20, 0x4112: 0x44773a20, 0x4113: 0x44803020, + 0x4114: 0x44807220, 0x4115: 0x48a49220, 0x4116: 0x48b9a020, 0x4117: 0x48fda620, + 0x4118: 0x433e8620, 0x4119: 0x433f1c20, + // Block 0x105, offset 0x4140 + 0x4140: 0xf0000404, 0x4141: 0xf0000404, 0x4142: 0xf0000404, 0x4143: 0xe0000b99, + 0x4144: 0xe0000b9d, 0x4145: 0xe0000f83, 0x4146: 0xf0000404, + 0x4153: 0xf0000404, + 0x4154: 0xf0000404, 0x4155: 0xf0000404, 0x4156: 0xf0000404, 0x4157: 0xf0000404, + 0x415d: 0xe000150b, 0x415e: 0xa1a09602, 0x415f: 0xe0001514, + 0x4160: 0x0038ae85, 0x4161: 0x00389085, 0x4162: 0x00389685, 0x4163: 0x00389885, + 0x4164: 0x0038a485, 0x4165: 0x0038a685, 0x4166: 0x0038a885, 0x4167: 0x0038b685, + 0x4168: 0x0038ba85, 0x4169: 0x00093885, 0x416a: 0xe0001542, 0x416b: 0xe000153f, + 0x416c: 0xe000154c, 0x416d: 0xe0001548, 0x416e: 0xe00014e1, 0x416f: 0xe00014e4, + 0x4170: 0xe00014e7, 0x4171: 0xe00014ea, 0x4172: 0xe00014f0, 0x4173: 0xe00014f3, + 0x4174: 0xe00014f6, 0x4175: 0xe00014fc, 0x4176: 0xe0001505, + 0x4178: 0xe0001508, 0x4179: 0xe000150e, 0x417a: 0xe000151b, 0x417b: 0xe0001518, + 0x417c: 0xe0001521, 0x417e: 0xe0001524, + // Block 0x106, offset 0x4180 + 0x4180: 0xe0001527, 0x4181: 0xe000152a, 0x4183: 0xe0001530, + 0x4184: 0xe000152d, 0x4186: 0xe0001536, 0x4187: 0xe0001539, + 0x4188: 0xe000153c, 0x4189: 0xe0001545, 0x418a: 0xe0001550, 0x418b: 0xe00014f9, + 0x418c: 0xe00014ed, 0x418d: 0xe000151e, 0x418e: 0xe0001533, 0x418f: 0xf0000404, + 0x4190: 0x0039249a, 0x4191: 0x00392499, 0x4192: 0x00393e9a, 0x4193: 0x00393e99, + 0x4194: 0x00393e97, 0x4195: 0x00393e98, 0x4196: 0x0039409a, 0x4197: 0x00394099, + 0x4198: 0x00394097, 0x4199: 0x00394098, 0x419a: 0x0039429a, 0x419b: 0x00394299, + 0x419c: 0x00394297, 0x419d: 0x00394298, 0x419e: 0x00395c9a, 0x419f: 0x00395c99, + 0x41a0: 0x00395c97, 0x41a1: 0x00395c98, 0x41a2: 0x0039629a, 0x41a3: 0x00396299, + 0x41a4: 0x00396297, 0x41a5: 0x00396298, 0x41a6: 0x00395a9a, 0x41a7: 0x00395a99, + 0x41a8: 0x00395a97, 0x41a9: 0x00395a98, 0x41aa: 0x003a049a, 0x41ab: 0x003a0499, + 0x41ac: 0x003a0497, 0x41ad: 0x003a0498, 0x41ae: 0x003a0a9a, 0x41af: 0x003a0a99, + 0x41b0: 0x003a0a97, 0x41b1: 0x003a0a98, 0x41b2: 0x0039689a, 0x41b3: 0x00396899, + 0x41b4: 0x00396897, 0x41b5: 0x00396898, 0x41b6: 0x0039669a, 0x41b7: 0x00396699, + 0x41b8: 0x00396697, 0x41b9: 0x00396698, 0x41ba: 0x00396a9a, 0x41bb: 0x00396a99, + 0x41bc: 0x00396a97, 0x41bd: 0x00396a98, 0x41be: 0x00396e9a, 0x41bf: 0x00396e99, + // Block 0x107, offset 0x41c0 + 0x41c0: 0x00396e97, 0x41c1: 0x00396e98, 0x41c2: 0x0039969a, 0x41c3: 0x00399699, + 0x41c4: 0x0039949a, 0x41c5: 0x00399499, 0x41c6: 0x0039989a, 0x41c7: 0x00399899, + 0x41c8: 0x00398c9a, 0x41c9: 0x00398c99, 0x41ca: 0x0039b69a, 0x41cb: 0x0039b699, + 0x41cc: 0x0039a89a, 0x41cd: 0x0039a899, 0x41ce: 0x003a1c9a, 0x41cf: 0x003a1c99, + 0x41d0: 0x003a1c97, 0x41d1: 0x003a1c98, 0x41d2: 0x003a2a9a, 0x41d3: 0x003a2a99, + 0x41d4: 0x003a2a97, 0x41d5: 0x003a2a98, 0x41d6: 0x003a329a, 0x41d7: 0x003a3299, + 0x41d8: 0x003a3297, 0x41d9: 0x003a3298, 0x41da: 0x003a2e9a, 0x41db: 0x003a2e99, + 0x41dc: 0x003a2e97, 0x41dd: 0x003a2e98, 0x41de: 0x003a589a, 0x41df: 0x003a5899, + 0x41e0: 0x003a5a9a, 0x41e1: 0x003a5a99, 0x41e2: 0x003a5a97, 0x41e3: 0x003a5a98, + 0x41e4: 0xf0001a1a, 0x41e5: 0xf0001919, 0x41e6: 0x003a6c9a, 0x41e7: 0x003a6c99, + 0x41e8: 0x003a6c97, 0x41e9: 0x003a6c98, 0x41ea: 0x003a6a9a, 0x41eb: 0x003a6a99, + 0x41ec: 0x003a6a97, 0x41ed: 0x003a6a98, 0x41ee: 0x003aaa9a, 0x41ef: 0x003aaa99, + 0x41f0: 0xf0001a1a, 0x41f1: 0xf0001919, 0x41f2: 0x40071820, 0x41f3: 0x40071a20, + 0x41f4: 0x40071c20, 0x41f5: 0x40071e20, 0x41f6: 0x40072020, 0x41f7: 0x40072220, + 0x41f8: 0x40072420, 0x41f9: 0x40072620, 0x41fa: 0x40072820, 0x41fb: 0x40072a20, + 0x41fc: 0x40072c20, 0x41fd: 0x40072e20, 0x41fe: 0x40073020, 0x41ff: 0x40073220, + // Block 0x108, offset 0x4200 + 0x4200: 0x40073420, 0x4201: 0x40073620, + 0x4213: 0x003a269a, + 0x4214: 0x003a2699, 0x4215: 0x003a2697, 0x4216: 0x003a2698, 0x4217: 0x003a7c9a, + 0x4218: 0x003a7c99, 0x4219: 0x003a7a9a, 0x421a: 0x003a7a99, 0x421b: 0x003a7e9a, + 0x421c: 0x003a7e99, 0x421d: 0xf0001a1a, 0x421e: 0x003a849a, 0x421f: 0x003a8499, + 0x4220: 0x003a789a, 0x4221: 0x003a7899, 0x4222: 0x003a809a, 0x4223: 0x003a8099, + 0x4224: 0x003a989a, 0x4225: 0x003a9899, 0x4226: 0x003a9897, 0x4227: 0x003a9898, + 0x4228: 0x003a8e97, 0x4229: 0x003a8e98, 0x422a: 0xe0001559, 0x422b: 0xe0001556, + 0x422c: 0xe0001589, 0x422d: 0xe0001586, 0x422e: 0xe000158f, 0x422f: 0xe000158c, + 0x4230: 0xe000159b, 0x4231: 0xe0001598, 0x4232: 0xe0001595, 0x4233: 0xe0001592, + 0x4234: 0xe00015a1, 0x4235: 0xe000159e, 0x4236: 0xe00015bf, 0x4237: 0xe00015bc, + 0x4238: 0xe00015b9, 0x4239: 0xe00015ad, 0x423a: 0xe00015a7, 0x423b: 0xe00015a4, + 0x423c: 0x003a929a, 0x423d: 0x003a9299, 0x423e: 0x003a9297, 0x423f: 0x003a9298, + // Block 0x109, offset 0x4240 + 0x4240: 0xe000155f, 0x4241: 0xe0001565, 0x4242: 0xe000157a, 0x4243: 0xe00015b0, + 0x4244: 0xe00015b6, 0x4245: 0xf0001a1a, 0x4246: 0xf0001a1a, 0x4247: 0xf0001a1a, + 0x4248: 0xf0001a1a, 0x4249: 0xf0001a1a, 0x424a: 0xf0001a1a, 0x424b: 0xf0001a1a, + 0x424c: 0xf0001a1a, 0x424d: 0xf0001a1a, 0x424e: 0xf0001a1a, 0x424f: 0xf0001a1a, + 0x4250: 0xf0001a1a, 0x4251: 0xf0001a1a, 0x4252: 0xf0001a1a, 0x4253: 0xf0001a1a, + 0x4254: 0xf0001a1a, 0x4255: 0xf0001a1a, 0x4256: 0xf0001a1a, 0x4257: 0xf0001a1a, + 0x4258: 0xf0001a1a, 0x4259: 0xf0001a1a, 0x425a: 0xf0001a1a, 0x425b: 0xf0001a1a, + 0x425c: 0xf0001a1a, 0x425d: 0xf0001a1a, 0x425e: 0xf0001a1a, 0x425f: 0xf0001a1a, + 0x4260: 0xf0001a1a, 0x4261: 0xf0001a1a, 0x4262: 0xf0001a1a, 0x4263: 0xf0001a1a, + 0x4264: 0xf0001a1a, 0x4265: 0xf0001a1a, 0x4266: 0xf0001a1a, 0x4267: 0xf0001a1a, + 0x4268: 0xf0001a1a, 0x4269: 0xf0001a1a, 0x426a: 0xf0001a1a, 0x426b: 0xf0001a1a, + 0x426c: 0xf0001a1a, 0x426d: 0xf0001a1a, 0x426e: 0xf0001a1a, 0x426f: 0xf0001a1a, + 0x4270: 0xf0001a1a, 0x4271: 0xf0001a1a, 0x4272: 0xf0001a1a, 0x4273: 0xf0001a1a, + 0x4274: 0xf0001a1a, 0x4275: 0xf0001a1a, 0x4276: 0xf0001a1a, 0x4277: 0xf0001a1a, + 0x4278: 0xf0001a1a, 0x4279: 0xf0001a1a, 0x427a: 0xf0001a1a, 0x427b: 0xf0001a1a, + 0x427c: 0xf0001a1a, 0x427d: 0xf0001a1a, 0x427e: 0xf0001a1a, 0x427f: 0xf0001a1a, + // Block 0x10a, offset 0x4280 + 0x4280: 0xf0001a1a, 0x4281: 0xf0001a1a, 0x4282: 0xf0001a1a, 0x4283: 0xf0001a1a, + 0x4284: 0xf0001a1a, 0x4285: 0xf0001a1a, 0x4286: 0xf0001a1a, 0x4287: 0xf0001a1a, + 0x4288: 0xf0001a1a, 0x4289: 0xf0001a1a, 0x428a: 0xf0001a1a, 0x428b: 0xf0001a1a, + 0x428c: 0xf0001a1a, 0x428d: 0xf0001a1a, 0x428e: 0xf0001a1a, 0x428f: 0xf0001a1a, + 0x4290: 0xf0001a1a, 0x4291: 0xf0001a1a, 0x4292: 0xf0001a1a, 0x4293: 0xf0001a1a, + 0x4294: 0xf0001a1a, 0x4295: 0xf0001a1a, 0x4296: 0xf0001a1a, 0x4297: 0xf0001a1a, + 0x4298: 0xf0001a1a, 0x4299: 0xf0001a1a, 0x429a: 0xf0001a1a, 0x429b: 0xf0001a1a, + 0x429c: 0xf0001a1a, 0x429d: 0xf0001a1a, 0x429e: 0xe0000003, 0x429f: 0xe0000006, + 0x42a0: 0xe0000009, 0x42a1: 0xe000000c, 0x42a2: 0xe000000f, 0x42a3: 0xe0000012, + 0x42a4: 0xe000156b, 0x42a5: 0xe000156e, 0x42a6: 0xe0001577, 0x42a7: 0xe000157d, + 0x42a8: 0xe00015aa, 0x42a9: 0xe00015b3, 0x42aa: 0xf0001919, 0x42ab: 0xf0001919, + 0x42ac: 0xf0001919, 0x42ad: 0xf0001919, 0x42ae: 0xf0001919, 0x42af: 0xf0001919, + 0x42b0: 0xf0001919, 0x42b1: 0xf0001919, 0x42b2: 0xf0001919, 0x42b3: 0xf0001919, + 0x42b4: 0xf0001919, 0x42b5: 0xf0001919, 0x42b6: 0xf0001919, 0x42b7: 0xf0001919, + 0x42b8: 0xf0001919, 0x42b9: 0xf0001919, 0x42ba: 0xf0001919, 0x42bb: 0xf0001919, + 0x42bc: 0xf0001919, 0x42bd: 0xf0001919, 0x42be: 0xf0001919, 0x42bf: 0xf0001919, + // Block 0x10b, offset 0x42c0 + 0x42c0: 0xf0001919, 0x42c1: 0xf0001919, 0x42c2: 0xf0001919, 0x42c3: 0xf0001919, + 0x42c4: 0xf0001919, 0x42c5: 0xf0001919, 0x42c6: 0xf0001919, 0x42c7: 0xf0001919, + 0x42c8: 0xf0001919, 0x42c9: 0xf0001919, 0x42ca: 0xf0001919, 0x42cb: 0xf0001919, + 0x42cc: 0xf0001919, 0x42cd: 0xf0001919, 0x42ce: 0xf0001919, 0x42cf: 0xf0001919, + 0x42d0: 0xf0001919, 0x42d1: 0xf0001919, 0x42d2: 0xf0001919, 0x42d3: 0xf0001919, + 0x42d4: 0xf0001919, 0x42d5: 0xf0001919, 0x42d6: 0xf0001919, 0x42d7: 0xe000155c, + 0x42d8: 0xe0001562, 0x42d9: 0xe0001568, 0x42da: 0xe0001571, 0x42db: 0xe0001580, + 0x42dc: 0xf0001717, 0x42dd: 0xf0001717, 0x42de: 0xf0001717, 0x42df: 0xf0001717, + 0x42e0: 0xf0001717, 0x42e1: 0xf0001717, 0x42e2: 0xf0001717, 0x42e3: 0xf0001717, + 0x42e4: 0xf0001717, 0x42e5: 0xf0001717, 0x42e6: 0xf0001717, 0x42e7: 0xf0001717, + 0x42e8: 0xf0001717, 0x42e9: 0xf0001717, 0x42ea: 0xf0001717, 0x42eb: 0xf0001717, + 0x42ec: 0xf0001717, 0x42ed: 0xf0001717, 0x42ee: 0xf0001717, 0x42ef: 0xf0001717, + 0x42f0: 0xf0001717, 0x42f1: 0xf0001717, 0x42f2: 0xf0001717, 0x42f3: 0xf0001717, + 0x42f4: 0xf0001717, 0x42f5: 0xf0001717, 0x42f6: 0xf0001717, 0x42f7: 0xf0001717, + 0x42f8: 0xf0001717, 0x42f9: 0xf0001717, 0x42fa: 0xf0001717, 0x42fb: 0xf0001717, + 0x42fc: 0xf0001717, 0x42fd: 0xf0001717, 0x42fe: 0xf0001717, 0x42ff: 0xf0001717, + // Block 0x10c, offset 0x4300 + 0x4300: 0xf0001717, 0x4301: 0xf0001717, 0x4302: 0xf0001717, 0x4303: 0xf0001717, + 0x4304: 0xf0001717, 0x4305: 0xf0001717, 0x4306: 0xf0001717, 0x4307: 0xf0001717, + 0x4308: 0xf0001717, 0x4309: 0xf0001717, 0x430a: 0xf0001717, 0x430b: 0xf0001717, + 0x430c: 0xf0001717, 0x430d: 0xf0001717, 0x430e: 0xf0001717, 0x430f: 0xf0001717, + 0x4310: 0xf0001717, 0x4311: 0xf0001717, 0x4312: 0xf0001717, 0x4313: 0xf0001717, + 0x4314: 0xf0001717, 0x4315: 0xf0001717, 0x4316: 0xf0001717, 0x4317: 0xf0001717, + 0x4318: 0xf0001717, 0x4319: 0xf0001717, 0x431a: 0xf0001717, 0x431b: 0xf0001717, + 0x431c: 0xf0001717, 0x431d: 0xf0001717, 0x431e: 0xf0001717, 0x431f: 0xe0001574, + 0x4320: 0xe0001583, 0x4321: 0xf0001818, 0x4322: 0xf0001818, 0x4323: 0xf0001818, + 0x4324: 0xf0001818, 0x4325: 0xf0001818, 0x4326: 0xf0001818, 0x4327: 0xf0001818, + 0x4328: 0xf0001818, 0x4329: 0xf0001818, 0x432a: 0xf0001818, 0x432b: 0xf0001818, + 0x432c: 0xf0001818, 0x432d: 0xf0001818, 0x432e: 0xf0001818, 0x432f: 0xf0001818, + 0x4330: 0xf0001818, 0x4331: 0xf0001818, 0x4332: 0xf0001818, 0x4333: 0xf0001818, + 0x4334: 0xf0001818, 0x4335: 0xf0001a1a, 0x4336: 0xf0001a1a, 0x4337: 0xf0001a1a, + 0x4338: 0xf0001a1a, 0x4339: 0xf0001a1a, 0x433a: 0xf0001a1a, 0x433b: 0xf0001a1a, + 0x433c: 0xf0001a1a, 0x433d: 0xf0001a1a, 0x433e: 0xf0001a1a, 0x433f: 0xf0001a1a, + // Block 0x10d, offset 0x4340 + 0x4340: 0xf0001a1a, 0x4341: 0xf0001a1a, 0x4342: 0xf0001a1a, 0x4343: 0xf0001a1a, + 0x4344: 0xf0001a1a, 0x4345: 0xf0001a1a, 0x4346: 0xf0001a1a, 0x4347: 0xf0001a1a, + 0x4348: 0xf0001a1a, 0x4349: 0xf0001a1a, 0x434a: 0xf0001a1a, 0x434b: 0xf0001a1a, + 0x434c: 0xf0001a1a, 0x434d: 0xf0001a1a, 0x434e: 0xf0001a1a, 0x434f: 0xf0001a1a, + 0x4350: 0xf0001a1a, 0x4351: 0xf0001919, 0x4352: 0xf0001919, 0x4353: 0xf0001919, + 0x4354: 0xf0001919, 0x4355: 0xf0001919, 0x4356: 0xf0001919, 0x4357: 0xf0001919, + 0x4358: 0xf0001919, 0x4359: 0xf0001919, 0x435a: 0xf0001919, 0x435b: 0xf0001919, + 0x435c: 0xf0001919, 0x435d: 0xf0001919, 0x435e: 0xf0001919, 0x435f: 0xf0001919, + 0x4360: 0xf0001919, 0x4361: 0xf0001919, 0x4362: 0xf0001919, 0x4363: 0xf0001919, + 0x4364: 0xf0001919, 0x4365: 0xf0001919, 0x4366: 0xf0001919, 0x4367: 0xf0001919, + 0x4368: 0xf0001919, 0x4369: 0xf0001919, 0x436a: 0xf0001919, 0x436b: 0xf0001919, + 0x436c: 0xf0001919, 0x436d: 0xf0001717, 0x436e: 0xf0001717, 0x436f: 0xf0001717, + 0x4370: 0xf0001717, 0x4371: 0xf0001717, 0x4372: 0xf0001717, 0x4373: 0xf0001717, + 0x4374: 0xf0001818, 0x4375: 0xf0001818, 0x4376: 0xf0001818, 0x4377: 0xf0001818, + 0x4378: 0xf0001818, 0x4379: 0xf0001818, 0x437a: 0xf0001818, 0x437b: 0xf0001818, + 0x437c: 0xf0001919, 0x437d: 0xf0001a1a, 0x437e: 0x4004c020, 0x437f: 0x4004c220, + // Block 0x10e, offset 0x4380 + 0x4390: 0xe00015d4, 0x4391: 0xe00015e4, 0x4392: 0xe00015e0, 0x4393: 0xe00015e8, + 0x4394: 0xe00015ec, 0x4395: 0xe00015f8, 0x4396: 0xe00015fc, 0x4397: 0xe0001600, + 0x4398: 0xe0001621, 0x4399: 0xe000161d, 0x439a: 0xe0001635, 0x439b: 0xe0001631, + 0x439c: 0xe0001646, 0x439d: 0xe000163e, 0x439e: 0xe0001642, 0x439f: 0xe000165a, + 0x43a0: 0xe0001656, 0x43a1: 0xe0001652, 0x43a2: 0xe0001662, 0x43a3: 0xe000165e, + 0x43a4: 0xe000168a, 0x43a5: 0xe0001686, 0x43a6: 0xe00016b6, 0x43a7: 0xe000166e, + 0x43a8: 0xe000166a, 0x43a9: 0xe0001666, 0x43aa: 0xe000167a, 0x43ab: 0xe0001676, + 0x43ac: 0xe0001682, 0x43ad: 0xe000167e, 0x43ae: 0xe00016ba, 0x43af: 0xe00016c6, + 0x43b0: 0xe00016c2, 0x43b1: 0xe00016ce, 0x43b2: 0xe00016ca, 0x43b3: 0xe00016d2, + 0x43b4: 0xe00016d6, 0x43b5: 0xe00016de, 0x43b6: 0xe00016eb, 0x43b7: 0xe00016e7, + 0x43b8: 0xe00016ef, 0x43b9: 0xe00016f7, 0x43ba: 0xe00016ff, 0x43bb: 0xe00016fb, + 0x43bc: 0xe0001707, 0x43bd: 0xe0001703, 0x43be: 0xe0001717, 0x43bf: 0xe000171b, + // Block 0x10f, offset 0x43c0 + 0x43c0: 0xe0001759, 0x43c1: 0xe0001761, 0x43c2: 0xe000175d, 0x43c3: 0xe0001741, + 0x43c4: 0xe0001745, 0x43c5: 0xe0001769, 0x43c6: 0xe0001765, 0x43c7: 0xe0001771, + 0x43c8: 0xe000176d, 0x43c9: 0xe000178c, 0x43ca: 0xe0001790, 0x43cb: 0xe0001799, + 0x43cc: 0xe000177c, 0x43cd: 0xe0001784, 0x43ce: 0xe000179d, 0x43cf: 0xe00017a1, + 0x43d2: 0xe0001780, 0x43d3: 0xe00017d9, + 0x43d4: 0xe00017dd, 0x43d5: 0xe00017c5, 0x43d6: 0xe00017c9, 0x43d7: 0xe00017b9, + 0x43d8: 0xe00017b5, 0x43d9: 0xe00017bd, 0x43da: 0xe00017d5, 0x43db: 0xe00017d1, + 0x43dc: 0xe00017f8, 0x43dd: 0xe00017f4, 0x43de: 0xe00015d0, 0x43df: 0xe00015dc, + 0x43e0: 0xe00015d8, 0x43e1: 0xe00015f4, 0x43e2: 0xe00015f0, 0x43e3: 0xe0001608, + 0x43e4: 0xe0001604, 0x43e5: 0xe0001629, 0x43e6: 0xe000160c, 0x43e7: 0xe0001625, + 0x43e8: 0xe000164a, 0x43e9: 0xe000168e, 0x43ea: 0xe0001672, 0x43eb: 0xe00016be, + 0x43ec: 0xe0001751, 0x43ed: 0xe0001775, 0x43ee: 0xe00017f0, 0x43ef: 0xe00017ec, + 0x43f0: 0xe00017fc, 0x43f1: 0xe00017a9, 0x43f2: 0xe000171f, 0x43f3: 0xe00017cd, + 0x43f4: 0xe0001713, 0x43f5: 0xe0001755, 0x43f6: 0xe00016f3, 0x43f7: 0xe000172b, + 0x43f8: 0xe00017ad, 0x43f9: 0xe00017a5, 0x43fa: 0xe0001749, 0x43fb: 0xe0001727, + 0x43fc: 0xe000174d, 0x43fd: 0xe00017b1, 0x43fe: 0xe0001610, 0x43ff: 0xe000162d, + // Block 0x110, offset 0x4400 + 0x4400: 0xe0001788, 0x4401: 0xe000170b, 0x4402: 0xe00015cc, 0x4403: 0xe0001723, + 0x4404: 0xe00016da, 0x4405: 0xe00016b2, 0x4406: 0xe000164e, 0x4407: 0xe00017c1, + 0x4430: 0xe00016ae, 0x4431: 0xe000170f, 0x4432: 0xe00015c7, 0x4433: 0xe00015c2, + 0x4434: 0xe0001794, 0x4435: 0xe0001692, 0x4436: 0xe0001639, 0x4437: 0xe00016e2, + 0x4438: 0xe00017e7, 0x4439: 0xe0001697, 0x443a: 0xe000169b, 0x443b: 0xe0001614, + 0x443c: 0x40282e20, 0x443d: 0x40071620, + // Block 0x111, offset 0x4440 + 0x4440: 0xa0000000, 0x4441: 0xa0000000, 0x4442: 0xa0000000, 0x4443: 0xa0000000, + 0x4444: 0xa0000000, 0x4445: 0xa0000000, 0x4446: 0xa0000000, 0x4447: 0xa0000000, + 0x4448: 0xa0000000, 0x4449: 0xa0000000, 0x444a: 0xa0000000, 0x444b: 0xa0000000, + 0x444c: 0xa0000000, 0x444d: 0xa0000000, 0x444e: 0xa0000000, 0x444f: 0xa0000000, + 0x4450: 0x00024096, 0x4451: 0x00025c96, 0x4452: 0x00030496, 0x4453: 0x00026c96, + 0x4454: 0x00026296, 0x4455: 0x0002ba96, 0x4456: 0x0002c496, 0x4457: 0x0004b496, + 0x4458: 0x0004b696, 0x4459: 0xf0001616, + 0x4460: 0xae608202, 0x4461: 0xae600000, 0x4462: 0xae608102, 0x4463: 0xae600000, + 0x4464: 0xae600000, 0x4465: 0xae600000, 0x4466: 0xae600000, + 0x4470: 0xf0001f16, 0x4471: 0x00022c96, 0x4472: 0x00022a96, 0x4473: 0x00021696, + 0x4474: 0x00021696, 0x4475: 0x0003f496, 0x4476: 0x0003f696, 0x4477: 0x0003fc96, + 0x4478: 0x0003fe96, 0x4479: 0x0004b096, 0x447a: 0x0004b296, 0x447b: 0x0004ac96, + 0x447c: 0x0004ae96, 0x447d: 0x0004a096, 0x447e: 0x0004a296, 0x447f: 0x00049c96, + // Block 0x112, offset 0x4480 + 0x4480: 0x00049e96, 0x4481: 0x0004a496, 0x4482: 0x0004a696, 0x4483: 0x0004a896, + 0x4484: 0x0004aa96, 0x4485: 0x40025e20, 0x4486: 0x40026020, 0x4487: 0x0003f896, + 0x4488: 0x0003fa96, 0x4489: 0x00021484, 0x448a: 0x00021484, 0x448b: 0x00021484, + 0x448c: 0x00021484, 0x448d: 0x00021684, 0x448e: 0x00021684, 0x448f: 0x00021684, + 0x4490: 0x0002408f, 0x4491: 0x00025c8f, 0x4492: 0x0002e48f, + 0x4494: 0x0002628f, 0x4495: 0x00026c8f, 0x4496: 0x0002c48f, 0x4497: 0x0002ba8f, + 0x4498: 0x00022c8f, 0x4499: 0x0003f48f, 0x449a: 0x0003f68f, 0x449b: 0x0003fc8f, + 0x449c: 0x0003fe8f, 0x449d: 0x0004b08f, 0x449e: 0x0004b28f, 0x449f: 0x0004ea8f, + 0x44a0: 0x0004e68f, 0x44a1: 0x0004d88f, 0x44a2: 0x0009388f, 0x44a3: 0x00021a8f, + 0x44a4: 0x0009408f, 0x44a5: 0x0009448f, 0x44a6: 0x0009428f, + 0x44a8: 0x0004e48f, 0x44a9: 0x0027de8f, 0x44aa: 0x0004ec8f, 0x44ab: 0x0004d68f, + 0x44b0: 0xa000a21a, 0x44b1: 0xa000a218, 0x44b2: 0xa000a51a, 0x44b3: 0xa0000000, + 0x44b4: 0xa000a91a, 0x44b6: 0xa000ad1a, 0x44b7: 0xa000ad18, + 0x44b8: 0xa000b21a, 0x44b9: 0xa000b218, 0x44ba: 0xa000b61a, 0x44bb: 0xa000b618, + 0x44bc: 0xa000ba1a, 0x44bd: 0xa000ba18, 0x44be: 0xa000bc1a, 0x44bf: 0xa000bc18, + // Block 0x113, offset 0x44c0 + 0x44c0: 0x00391c9a, 0x44c1: 0x00391e9a, 0x44c2: 0x00391e99, 0x44c3: 0x0039209a, + 0x44c4: 0x00392099, 0x44c5: 0x0039269a, 0x44c6: 0x00392699, 0x44c7: 0x0039289a, + 0x44c8: 0x00392899, 0x44c9: 0x0039309a, 0x44ca: 0x00393099, 0x44cb: 0x00393097, + 0x44cc: 0x00393098, 0x44cd: 0x0039389a, 0x44ce: 0x00393899, 0x44cf: 0x00393c9a, + 0x44d0: 0x00393c99, 0x44d1: 0x00393c97, 0x44d2: 0x00393c98, 0x44d3: 0x0039549a, + 0x44d4: 0x00395499, 0x44d5: 0x0039569a, 0x44d6: 0x00395699, 0x44d7: 0x00395697, + 0x44d8: 0x00395698, 0x44d9: 0x0039589a, 0x44da: 0x00395899, 0x44db: 0x00395897, + 0x44dc: 0x00395898, 0x44dd: 0x0039649a, 0x44de: 0x00396499, 0x44df: 0x00396497, + 0x44e0: 0x00396498, 0x44e1: 0x0039729a, 0x44e2: 0x00397299, 0x44e3: 0x00397297, + 0x44e4: 0x00397298, 0x44e5: 0x0039749a, 0x44e6: 0x00397499, 0x44e7: 0x00397497, + 0x44e8: 0x00397498, 0x44e9: 0x0039889a, 0x44ea: 0x00398899, 0x44eb: 0x00398a9a, + 0x44ec: 0x00398a99, 0x44ed: 0x0039a49a, 0x44ee: 0x0039a499, 0x44ef: 0x0039a69a, + 0x44f0: 0x0039a699, 0x44f1: 0x0039c69a, 0x44f2: 0x0039c699, 0x44f3: 0x0039c697, + 0x44f4: 0x0039c698, 0x44f5: 0x0039c89a, 0x44f6: 0x0039c899, 0x44f7: 0x0039c897, + 0x44f8: 0x0039c898, 0x44f9: 0x0039dc9a, 0x44fa: 0x0039dc99, 0x44fb: 0x0039dc97, + 0x44fc: 0x0039dc98, 0x44fd: 0x0039de9a, 0x44fe: 0x0039de99, 0x44ff: 0x0039de97, + // Block 0x114, offset 0x4500 + 0x4500: 0x0039de98, 0x4501: 0x0039e69a, 0x4502: 0x0039e699, 0x4503: 0x0039e697, + 0x4504: 0x0039e698, 0x4505: 0x0039e89a, 0x4506: 0x0039e899, 0x4507: 0x0039e897, + 0x4508: 0x0039e898, 0x4509: 0x0039ee9a, 0x450a: 0x0039ee99, 0x450b: 0x0039ee97, + 0x450c: 0x0039ee98, 0x450d: 0x0039f09a, 0x450e: 0x0039f099, 0x450f: 0x0039f097, + 0x4510: 0x0039f098, 0x4511: 0x0039fc9a, 0x4512: 0x0039fc99, 0x4513: 0x0039fc97, + 0x4514: 0x0039fc98, 0x4515: 0x003a129a, 0x4516: 0x003a1299, 0x4517: 0x003a1297, + 0x4518: 0x003a1298, 0x4519: 0x003a1a9a, 0x451a: 0x003a1a99, 0x451b: 0x003a1a97, + 0x451c: 0x003a1a98, 0x451d: 0x003a409a, 0x451e: 0x003a4099, 0x451f: 0x003a4097, + 0x4520: 0x003a4098, 0x4521: 0x003a4e9a, 0x4522: 0x003a4e99, 0x4523: 0x003a4e97, + 0x4524: 0x003a4e98, 0x4525: 0x003a569a, 0x4526: 0x003a5699, 0x4527: 0x003a5697, + 0x4528: 0x003a5698, 0x4529: 0x003a689a, 0x452a: 0x003a6899, 0x452b: 0x003a6897, + 0x452c: 0x003a6898, 0x452d: 0x003a749a, 0x452e: 0x003a7499, 0x452f: 0x003a8e9a, + 0x4530: 0x003a8e99, 0x4531: 0x003a909a, 0x4532: 0x003a9099, 0x4533: 0x003a9097, + 0x4534: 0x003a9098, 0x4535: 0xe0001732, 0x4536: 0xe000172f, 0x4537: 0xe0001738, + 0x4538: 0xe0001735, 0x4539: 0xe000173e, 0x453a: 0xe000173b, 0x453b: 0xf0001a1a, + 0x453c: 0xf0001919, 0x453f: 0xa0000000, + // Block 0x115, offset 0x4540 + 0x4541: 0x0002ba83, 0x4542: 0x0003e083, 0x4543: 0x0004ea83, + 0x4544: 0x0027de83, 0x4545: 0x0004ec83, 0x4546: 0x0004e683, 0x4547: 0x0003d283, + 0x4548: 0x0003f483, 0x4549: 0x0003f683, 0x454a: 0x0004d883, 0x454b: 0x00093883, + 0x454c: 0x00024083, 0x454d: 0x00021a83, 0x454e: 0x0002e483, 0x454f: 0x0004e283, + 0x4550: 0x0029cc83, 0x4551: 0x0029ce83, 0x4552: 0x0029d083, 0x4553: 0x0029d283, + 0x4554: 0x0029d483, 0x4555: 0x0029d683, 0x4556: 0x0029d883, 0x4557: 0x0029da83, + 0x4558: 0x0029dc83, 0x4559: 0x0029de83, 0x455a: 0x00026c83, 0x455b: 0x00026283, + 0x455c: 0x00094083, 0x455d: 0x00094283, 0x455e: 0x00094483, 0x455f: 0x0002c483, + 0x4560: 0x0004d683, 0x4561: 0x002bde89, 0x4562: 0x002c0a89, 0x4563: 0x002c3a89, + 0x4564: 0x002c6289, 0x4565: 0x002c9889, 0x4566: 0x002d0889, 0x4567: 0x002d2289, + 0x4568: 0x002d6889, 0x4569: 0x002d9a89, 0x456a: 0x002dcc89, 0x456b: 0x002dfe89, + 0x456c: 0x002e2289, 0x456d: 0x002e8289, 0x456e: 0x002e9e89, 0x456f: 0x002ee289, + 0x4570: 0x002f2c89, 0x4571: 0x002f5689, 0x4572: 0x002f7a89, 0x4573: 0x002fe689, + 0x4574: 0x00302c89, 0x4575: 0x00306c89, 0x4576: 0x0030be89, 0x4577: 0x0030e289, + 0x4578: 0x0030f689, 0x4579: 0x00310089, 0x457a: 0x00312a89, 0x457b: 0x0003f883, + 0x457c: 0x0004e483, 0x457d: 0x0003fa83, 0x457e: 0x00062483, 0x457f: 0x00021683, + // Block 0x116, offset 0x4580 + 0x4580: 0x00061e83, 0x4581: 0x002bde83, 0x4582: 0x002c0a83, 0x4583: 0x002c3a83, + 0x4584: 0x002c6283, 0x4585: 0x002c9883, 0x4586: 0x002d0883, 0x4587: 0x002d2283, + 0x4588: 0x002d6883, 0x4589: 0x002d9a83, 0x458a: 0x002dcc83, 0x458b: 0x002dfe83, + 0x458c: 0x002e2283, 0x458d: 0x002e8283, 0x458e: 0x002e9e83, 0x458f: 0x002ee283, + 0x4590: 0x002f2c83, 0x4591: 0x002f5683, 0x4592: 0x002f7a83, 0x4593: 0x002fe683, + 0x4594: 0x00302c83, 0x4595: 0x00306c83, 0x4596: 0x0030be83, 0x4597: 0x0030e283, + 0x4598: 0x0030f683, 0x4599: 0x00310083, 0x459a: 0x00312a83, 0x459b: 0x0003fc83, + 0x459c: 0x00094883, 0x459d: 0x0003fe83, 0x459e: 0x00094c83, 0x459f: 0x00041883, + 0x45a0: 0x00041a83, 0x45a1: 0x00030492, 0x45a2: 0x0004a492, 0x45a3: 0x0004a692, + 0x45a4: 0x00025c92, 0x45a5: 0x00023e92, 0x45a6: 0x0065d692, 0x45a7: 0x00657690, + 0x45a8: 0x00657890, 0x45a9: 0x00657a90, 0x45aa: 0x00657e90, 0x45ab: 0x00658090, + 0x45ac: 0x0065be90, 0x45ad: 0x0065c090, 0x45ae: 0x0065c490, 0x45af: 0x00659a90, + 0x45b0: 0x0027d692, 0x45b1: 0x00657692, 0x45b2: 0x00657892, 0x45b3: 0x00657a92, + 0x45b4: 0x00657e92, 0x45b5: 0x00658092, 0x45b6: 0x00658292, 0x45b7: 0x00658492, + 0x45b8: 0x00658692, 0x45b9: 0x00658892, 0x45ba: 0x00658a92, 0x45bb: 0x00658c92, + 0x45bc: 0x00658e92, 0x45bd: 0x00659092, 0x45be: 0x00659292, 0x45bf: 0x00659492, + // Block 0x117, offset 0x45c0 + 0x45c0: 0x00659692, 0x45c1: 0x00659892, 0x45c2: 0x00659a92, 0x45c3: 0x00659c92, + 0x45c4: 0x00659e92, 0x45c5: 0x0065a092, 0x45c6: 0x0065a292, 0x45c7: 0x0065a492, + 0x45c8: 0x0065a692, 0x45c9: 0x0065a892, 0x45ca: 0x0065aa92, 0x45cb: 0x0065ac92, + 0x45cc: 0x0065ae92, 0x45cd: 0x0065b092, 0x45ce: 0x0065b292, 0x45cf: 0x0065b492, + 0x45d0: 0x0065b692, 0x45d1: 0x0065b892, 0x45d2: 0x0065ba92, 0x45d3: 0x0065bc92, + 0x45d4: 0x0065be92, 0x45d5: 0x0065c092, 0x45d6: 0x0065c492, 0x45d7: 0x0065c692, + 0x45d8: 0x0065c892, 0x45d9: 0x0065ca92, 0x45da: 0x0065cc92, 0x45db: 0x0065ce92, + 0x45dc: 0x0065d092, 0x45dd: 0x0065d892, 0x45de: 0xa0012812, 0x45df: 0xa0012912, + 0x45e0: 0x0063a692, 0x45e1: 0x0062ac92, 0x45e2: 0x0062ae92, 0x45e3: 0x00646892, + 0x45e4: 0x0062b092, 0x45e5: 0x00646c92, 0x45e6: 0x00646e92, 0x45e7: 0x0062b292, + 0x45e8: 0x0062b492, 0x45e9: 0x0062b692, 0x45ea: 0x00647492, 0x45eb: 0x00647692, + 0x45ec: 0x00647892, 0x45ed: 0x00647a92, 0x45ee: 0x00647c92, 0x45ef: 0x00647e92, + 0x45f0: 0x0062e092, 0x45f1: 0x0062b892, 0x45f2: 0x0062ba92, 0x45f3: 0x0062bc92, + 0x45f4: 0x0062ee92, 0x45f5: 0x0062be92, 0x45f6: 0x0062c092, 0x45f7: 0x0062c292, + 0x45f8: 0x0062c492, 0x45f9: 0x0062c692, 0x45fa: 0x0062c892, 0x45fb: 0x0062ca92, + 0x45fc: 0x0062cc92, 0x45fd: 0x0062ce92, 0x45fe: 0x0062d092, + // Block 0x118, offset 0x4600 + 0x4602: 0x0063a892, 0x4603: 0x0063aa92, + 0x4604: 0x0063ac92, 0x4605: 0x0063ae92, 0x4606: 0x0063b092, 0x4607: 0x0063b292, + 0x460a: 0x0063b492, 0x460b: 0x0063b692, + 0x460c: 0x0063b892, 0x460d: 0x0063ba92, 0x460e: 0x0063bc92, 0x460f: 0x0063be92, + 0x4612: 0x0063c092, 0x4613: 0x0063c292, + 0x4614: 0x0063c492, 0x4615: 0x0063c692, 0x4616: 0x0063c892, 0x4617: 0x0063ca92, + 0x461a: 0x0063cc92, 0x461b: 0x0063ce92, + 0x461c: 0x0063d092, + 0x4620: 0x0027dc83, 0x4621: 0x0027e083, 0x4622: 0x00094683, 0x4623: 0x00062683, + 0x4624: 0x00094a83, 0x4625: 0x0027e283, 0x4626: 0x00280883, + 0x4628: 0x000d3292, 0x4629: 0x00084492, 0x462a: 0x00084892, 0x462b: 0x00084692, + 0x462c: 0x00084a92, 0x462d: 0x000e6e92, 0x462e: 0x000ec492, + 0x4639: 0xa0000000, 0x463a: 0xa0000000, 0x463b: 0xa0000000, + 0x463c: 0x4027ae20, 0x463d: 0x4027b020, 0x463e: 0x00000285, 0x463f: 0x2bfffe85, + // Block 0x119, offset 0x4640 + 0x4640: 0x40731a20, 0x4641: 0x40731c20, 0x4642: 0x40731e20, 0x4643: 0x40732020, + 0x4644: 0x40732220, 0x4645: 0x40732420, 0x4646: 0x40732620, 0x4647: 0x40732820, + 0x4648: 0x40732a20, 0x4649: 0x40732c20, 0x464a: 0x40732e20, 0x464b: 0x40733020, + 0x464d: 0x40733220, 0x464e: 0x40733420, 0x464f: 0x40733620, + 0x4650: 0x40733820, 0x4651: 0x40733a20, 0x4652: 0x40733c20, 0x4653: 0x40733e20, + 0x4654: 0x40734020, 0x4655: 0x40734220, 0x4656: 0x40734420, 0x4657: 0x40734620, + 0x4658: 0x40734820, 0x4659: 0x40734a20, 0x465a: 0x40734c20, 0x465b: 0x40734e20, + 0x465c: 0x40735020, 0x465d: 0x40735220, 0x465e: 0x40735420, 0x465f: 0x40735620, + 0x4660: 0x40735820, 0x4661: 0x40735a20, 0x4662: 0x40735c20, 0x4663: 0x40735e20, + 0x4664: 0x40736020, 0x4665: 0x40736220, 0x4666: 0x40736420, + 0x4668: 0x40736620, 0x4669: 0x40736820, 0x466a: 0x40736a20, 0x466b: 0x40736c20, + 0x466c: 0x40736e20, 0x466d: 0x40737020, 0x466e: 0x40737220, 0x466f: 0x40737420, + 0x4670: 0x40737620, 0x4671: 0x40737820, 0x4672: 0x40737a20, 0x4673: 0x40737c20, + 0x4674: 0x40737e20, 0x4675: 0x40738020, 0x4676: 0x40738220, 0x4677: 0x40738420, + 0x4678: 0x40738620, 0x4679: 0x40738820, 0x467a: 0x40738a20, + 0x467c: 0x40738c20, 0x467d: 0x40738e20, 0x467f: 0x40739020, + // Block 0x11a, offset 0x4680 + 0x4680: 0x40739220, 0x4681: 0x40739420, 0x4682: 0x40739620, 0x4683: 0x40739820, + 0x4684: 0x40739a20, 0x4685: 0x40739c20, 0x4686: 0x40739e20, 0x4687: 0x4073a020, + 0x4688: 0x4073a220, 0x4689: 0x4073a420, 0x468a: 0x4073a620, 0x468b: 0x4073a820, + 0x468c: 0x4073aa20, 0x468d: 0x4073ac20, + 0x4690: 0x4073ae20, 0x4691: 0x4073b020, 0x4692: 0x4073b220, 0x4693: 0x4073b420, + 0x4694: 0x4073b620, 0x4695: 0x4073b820, 0x4696: 0x4073ba20, 0x4697: 0x4073bc20, + 0x4698: 0x4073be20, 0x4699: 0x4073c020, 0x469a: 0x4073c220, 0x469b: 0x4073c420, + 0x469c: 0x4073c620, 0x469d: 0x4073c820, + // Block 0x11b, offset 0x46c0 + 0x46c0: 0x4073ca20, 0x46c1: 0x4073cc20, 0x46c2: 0x4073ce20, 0x46c3: 0x4073d020, + 0x46c4: 0x4073d220, 0x46c5: 0x4073d420, 0x46c6: 0x4073d620, 0x46c7: 0x4073d820, + 0x46c8: 0x4073da20, 0x46c9: 0x4073dc20, 0x46ca: 0x4073de20, 0x46cb: 0x4073e020, + 0x46cc: 0x4073e220, 0x46cd: 0x4073e420, 0x46ce: 0x4073e620, 0x46cf: 0x4073e820, + 0x46d0: 0x4073ea20, 0x46d1: 0x4073ec20, 0x46d2: 0x4073ee20, 0x46d3: 0x4073f020, + 0x46d4: 0x4073f220, 0x46d5: 0x4073f420, 0x46d6: 0x4073f620, 0x46d7: 0x4073f820, + 0x46d8: 0x4073fa20, 0x46d9: 0x4073fc20, 0x46da: 0x4073fe20, 0x46db: 0x40740020, + 0x46dc: 0x40740220, 0x46dd: 0x40740420, 0x46de: 0x40740620, 0x46df: 0x40740820, + 0x46e0: 0x40740a20, 0x46e1: 0x40740c20, 0x46e2: 0x40740e20, 0x46e3: 0x40741020, + 0x46e4: 0x40741220, 0x46e5: 0x40741420, 0x46e6: 0x40741620, 0x46e7: 0x40741820, + 0x46e8: 0x40741a20, 0x46e9: 0x40741c20, 0x46ea: 0x40741e20, 0x46eb: 0x40742020, + 0x46ec: 0x40742220, 0x46ed: 0x40742420, 0x46ee: 0x40742620, 0x46ef: 0x40742820, + 0x46f0: 0x40742a20, 0x46f1: 0x40742c20, 0x46f2: 0x40742e20, 0x46f3: 0x40743020, + 0x46f4: 0x40743220, 0x46f5: 0x40743420, 0x46f6: 0x40743620, 0x46f7: 0x40743820, + 0x46f8: 0x40743a20, 0x46f9: 0x40743c20, 0x46fa: 0x40743e20, 0x46fb: 0x40744020, + 0x46fc: 0x40744220, 0x46fd: 0x40744420, 0x46fe: 0x40744620, 0x46ff: 0x40744820, + // Block 0x11c, offset 0x4700 + 0x4700: 0x40744a20, 0x4701: 0x40744c20, 0x4702: 0x40744e20, 0x4703: 0x40745020, + 0x4704: 0x40745220, 0x4705: 0x40745420, 0x4706: 0x40745620, 0x4707: 0x40745820, + 0x4708: 0x40745a20, 0x4709: 0x40745c20, 0x470a: 0x40745e20, 0x470b: 0x40746020, + 0x470c: 0x40746220, 0x470d: 0x40746420, 0x470e: 0x40746620, 0x470f: 0x40746820, + 0x4710: 0x40746a20, 0x4711: 0x40746c20, 0x4712: 0x40746e20, 0x4713: 0x40747020, + 0x4714: 0x40747220, 0x4715: 0x40747420, 0x4716: 0x40747620, 0x4717: 0x40747820, + 0x4718: 0x40747a20, 0x4719: 0x40747c20, 0x471a: 0x40747e20, 0x471b: 0x40748020, + 0x471c: 0x40748220, 0x471d: 0x40748420, 0x471e: 0x40748620, 0x471f: 0x40748820, + 0x4720: 0x40748a20, 0x4721: 0x40748c20, 0x4722: 0x40748e20, 0x4723: 0x40749020, + 0x4724: 0x40749220, 0x4725: 0x40749420, 0x4726: 0x40749620, 0x4727: 0x40749820, + 0x4728: 0x40749a20, 0x4729: 0x40749c20, 0x472a: 0x40749e20, 0x472b: 0x4074a020, + 0x472c: 0x4074a220, 0x472d: 0x4074a420, 0x472e: 0x4074a620, 0x472f: 0x4074a820, + 0x4730: 0x4074aa20, 0x4731: 0x4074ac20, 0x4732: 0x4074ae20, 0x4733: 0x4074b020, + 0x4734: 0x4074b220, 0x4735: 0x4074b420, 0x4736: 0x4074b620, 0x4737: 0x4074b820, + 0x4738: 0x4074ba20, 0x4739: 0x4074bc20, 0x473a: 0x4074be20, + // Block 0x11d, offset 0x4740 + 0x4740: 0x4003be20, 0x4741: 0x4003c020, 0x4742: 0x4003c220, + 0x4747: 0xe000026a, + 0x4748: 0xe0000382, 0x4749: 0xe000045c, 0x474a: 0xe0000531, 0x474b: 0xe00005fb, + 0x474c: 0xe00006c6, 0x474d: 0xe000076e, 0x474e: 0xe000081a, 0x474f: 0xe00008bf, + 0x4750: 0x4028ba20, 0x4751: 0x4028bc20, 0x4752: 0x4028be20, 0x4753: 0x4028c020, + 0x4754: 0x4028c220, 0x4755: 0x4028c420, 0x4756: 0x4028c620, 0x4757: 0x4028c820, + 0x4758: 0x4028ca20, 0x4759: 0x4028cc20, 0x475a: 0x4028ce20, 0x475b: 0x4028d020, + 0x475c: 0x4028d220, 0x475d: 0x4028d420, 0x475e: 0x4028d620, 0x475f: 0x4028d820, + 0x4760: 0x4028da20, 0x4761: 0x4028dc20, 0x4762: 0x4028de20, 0x4763: 0x4028e020, + 0x4764: 0x4028e220, 0x4765: 0x4028e420, 0x4766: 0x4028e620, 0x4767: 0x4028e820, + 0x4768: 0x4028ea20, 0x4769: 0x4028ec20, 0x476a: 0x4028ee20, 0x476b: 0x4028f020, + 0x476c: 0x4028f220, 0x476d: 0x4028f420, 0x476e: 0x4028f620, 0x476f: 0x4028f820, + 0x4770: 0x4028fa20, 0x4771: 0x4028fc20, 0x4772: 0x4028fe20, 0x4773: 0x40290020, + 0x4777: 0x401afe20, + 0x4778: 0x401b0020, 0x4779: 0x401b0220, 0x477a: 0x401b0420, 0x477b: 0x401b0620, + 0x477c: 0x401b0820, 0x477d: 0x401b0a20, 0x477e: 0x401b0c20, 0x477f: 0x401b0e20, + // Block 0x11e, offset 0x4780 + 0x4780: 0x40290220, 0x4781: 0x40290420, 0x4782: 0xe000026d, 0x4783: 0xe00005fe, + 0x4784: 0x40290620, 0x4785: 0x40290820, 0x4786: 0x40290a20, 0x4787: 0x40290c20, + 0x4788: 0xe0000601, 0x4789: 0x40290e20, 0x478a: 0x40291020, 0x478b: 0x40291220, + 0x478c: 0x40291420, 0x478d: 0x40291620, 0x478e: 0x40291820, 0x478f: 0xe0000604, + 0x4790: 0x40291a20, 0x4791: 0x40291c20, 0x4792: 0x40291e20, 0x4793: 0x40292020, + 0x4794: 0x40292220, 0x4795: 0x40292420, 0x4796: 0x40292620, 0x4797: 0x40292820, + 0x4798: 0xe0000270, 0x4799: 0xe0000273, 0x479a: 0xe0000276, 0x479b: 0xe0000385, + 0x479c: 0xe0000388, 0x479d: 0xe000038b, 0x479e: 0xe000038e, 0x479f: 0xe0000607, + 0x47a0: 0x40292a20, 0x47a1: 0x40292c20, 0x47a2: 0x40292e20, 0x47a3: 0x40293020, + 0x47a4: 0x40293220, 0x47a5: 0x40293420, 0x47a6: 0x40293620, 0x47a7: 0x40293820, + 0x47a8: 0x40293a20, 0x47a9: 0x40293c20, 0x47aa: 0x40293e20, 0x47ab: 0x40294020, + 0x47ac: 0x40294220, 0x47ad: 0x40294420, 0x47ae: 0x40294620, 0x47af: 0x40294820, + 0x47b0: 0x40294a20, 0x47b1: 0x40294c20, 0x47b2: 0x40294e20, 0x47b3: 0xe000060a, + 0x47b4: 0x40295020, 0x47b5: 0x40295220, 0x47b6: 0x40295420, 0x47b7: 0x40295620, + 0x47b8: 0x40295820, 0x47b9: 0x401b1020, 0x47ba: 0x401b1220, 0x47bb: 0x401b1420, + 0x47bc: 0x401b1620, 0x47bd: 0x401b1820, 0x47be: 0x401b1a20, 0x47bf: 0x401b1c20, + // Block 0x11f, offset 0x47c0 + 0x47c0: 0x401b1e20, 0x47c1: 0x401b2020, 0x47c2: 0x401b2220, 0x47c3: 0x401b2420, + 0x47c4: 0x401b2620, 0x47c5: 0x401b2820, 0x47c6: 0x401b2a20, 0x47c7: 0x401b2c20, + 0x47c8: 0x401b2e20, 0x47c9: 0x401b3020, 0x47ca: 0xe00001d6, + 0x47d0: 0x401b3220, 0x47d1: 0x401b3420, 0x47d2: 0x401b3620, 0x47d3: 0x401b3820, + 0x47d4: 0x401b3a20, 0x47d5: 0x401b3c20, 0x47d6: 0x401b3e20, 0x47d7: 0x401b4020, + 0x47d8: 0x401b4220, 0x47d9: 0x401b4420, 0x47da: 0x401b4620, 0x47db: 0x401b4820, + // Block 0x120, offset 0x4800 + 0x4810: 0x401b4a20, 0x4811: 0x401b4c20, 0x4812: 0x401b4e20, 0x4813: 0x401b5020, + 0x4814: 0x401b5220, 0x4815: 0x401b5420, 0x4816: 0x401b5620, 0x4817: 0x401b5820, + 0x4818: 0x401b5a20, 0x4819: 0x401b5c20, 0x481a: 0x401b5e20, 0x481b: 0x401b6020, + 0x481c: 0x401b6220, 0x481d: 0x401b6420, 0x481e: 0x401b6620, 0x481f: 0x401b6820, + 0x4820: 0x401b6a20, 0x4821: 0x401b6c20, 0x4822: 0x401b6e20, 0x4823: 0x401b7020, + 0x4824: 0x401b7220, 0x4825: 0x401b7420, 0x4826: 0x401b7620, 0x4827: 0x401b7820, + 0x4828: 0x401b7a20, 0x4829: 0x401b7c20, 0x482a: 0x401b7e20, 0x482b: 0x401b8020, + 0x482c: 0x401b8220, 0x482d: 0x401b8420, 0x482e: 0x401b8620, 0x482f: 0x401b8820, + 0x4830: 0x401b8a20, 0x4831: 0x401b8c20, 0x4832: 0x401b8e20, 0x4833: 0x401b9020, + 0x4834: 0x401b9220, 0x4835: 0x401b9420, 0x4836: 0x401b9620, 0x4837: 0x401b9820, + 0x4838: 0x401b9a20, 0x4839: 0x401b9c20, 0x483a: 0x401b9e20, 0x483b: 0x401ba020, + 0x483c: 0x401ba220, 0x483d: 0xadc13802, + // Block 0x121, offset 0x4840 + 0x4840: 0x4070b820, 0x4841: 0x4070ba20, 0x4842: 0x4070bc20, 0x4843: 0x4070be20, + 0x4844: 0x4070c020, 0x4845: 0x4070c220, 0x4846: 0x4070c420, 0x4847: 0x4070c620, + 0x4848: 0x4070c820, 0x4849: 0x4070ca20, 0x484a: 0x4070cc20, 0x484b: 0x4070ce20, + 0x484c: 0x4070d020, 0x484d: 0x4070d220, 0x484e: 0x4070d420, 0x484f: 0x4070d620, + 0x4850: 0x4070d820, 0x4851: 0x4070da20, 0x4852: 0x4070dc20, 0x4853: 0x4070de20, + 0x4854: 0x4070e020, 0x4855: 0x4070e220, 0x4856: 0x4070e420, 0x4857: 0x4070e620, + 0x4858: 0x4070e820, 0x4859: 0x4070ea20, 0x485a: 0x4070ec20, 0x485b: 0x4070ee20, + 0x485c: 0x4070f020, + 0x4860: 0x4070f220, 0x4861: 0x4070f420, 0x4862: 0x4070f620, 0x4863: 0x4070f820, + 0x4864: 0x4070fa20, 0x4865: 0x4070fc20, 0x4866: 0x4070fe20, 0x4867: 0x40710020, + 0x4868: 0x40710220, 0x4869: 0x40710420, 0x486a: 0x40710620, 0x486b: 0x40710820, + 0x486c: 0x40710a20, 0x486d: 0x40710c20, 0x486e: 0x40710e20, 0x486f: 0x40711020, + 0x4870: 0x40711220, 0x4871: 0x40711420, 0x4872: 0x40711620, 0x4873: 0x40711820, + 0x4874: 0x40711a20, 0x4875: 0x40711c20, 0x4876: 0x40711e20, 0x4877: 0x40712020, + 0x4878: 0x40712220, 0x4879: 0x40712420, 0x487a: 0x40712620, 0x487b: 0x40712820, + 0x487c: 0x40712a20, 0x487d: 0x40712c20, 0x487e: 0x40712e20, 0x487f: 0x40713020, + // Block 0x122, offset 0x4880 + 0x4880: 0x40713220, 0x4881: 0x40713420, 0x4882: 0x40713620, 0x4883: 0x40713820, + 0x4884: 0x40713a20, 0x4885: 0x40713c20, 0x4886: 0x40713e20, 0x4887: 0x40714020, + 0x4888: 0x40714220, 0x4889: 0x40714420, 0x488a: 0x40714620, 0x488b: 0x40714820, + 0x488c: 0x40714a20, 0x488d: 0x40714c20, 0x488e: 0x40714e20, 0x488f: 0x40715020, + 0x4890: 0x40715220, + // Block 0x123, offset 0x48c0 + 0x48c0: 0x40718820, 0x48c1: 0x40718a20, 0x48c2: 0x40718c20, 0x48c3: 0x40718e20, + 0x48c4: 0x40719020, 0x48c5: 0x40719220, 0x48c6: 0x40719420, 0x48c7: 0x40719620, + 0x48c8: 0x40719820, 0x48c9: 0x40719a20, 0x48ca: 0x40719c20, 0x48cb: 0x40719e20, + 0x48cc: 0x4071a020, 0x48cd: 0x4071a220, 0x48ce: 0x4071a420, 0x48cf: 0x4071a620, + 0x48d0: 0x4071a820, 0x48d1: 0x4071aa20, 0x48d2: 0x4071ac20, 0x48d3: 0x4071ae20, + 0x48d4: 0x4071b020, 0x48d5: 0x4071b220, 0x48d6: 0x4071b420, 0x48d7: 0x4071b620, + 0x48d8: 0x4071b820, 0x48d9: 0x4071ba20, 0x48da: 0x4071bc20, 0x48db: 0x4071be20, + 0x48dc: 0x4071c020, 0x48dd: 0x4071c220, 0x48de: 0x4071c420, + 0x48e0: 0xe0000279, 0x48e1: 0xe000060d, 0x48e2: 0x4028b620, 0x48e3: 0x4028b820, + 0x48f0: 0x4071c620, 0x48f1: 0x4071c820, 0x48f2: 0x4071ca20, 0x48f3: 0x4071cc20, + 0x48f4: 0x4071ce20, 0x48f5: 0x4071d020, 0x48f6: 0x4071d220, 0x48f7: 0x4071d420, + 0x48f8: 0x4071d620, 0x48f9: 0x4071d820, 0x48fa: 0x4071da20, 0x48fb: 0x4071dc20, + 0x48fc: 0x4071de20, 0x48fd: 0x4071e020, 0x48fe: 0x4071e220, 0x48ff: 0x4071e420, + // Block 0x124, offset 0x4900 + 0x4900: 0x4071e620, 0x4901: 0x4071e820, 0x4902: 0x4071ea20, 0x4903: 0x4071ec20, + 0x4904: 0x4071ee20, 0x4905: 0x4071f020, 0x4906: 0x4071f220, 0x4907: 0x4071f420, + 0x4908: 0x4071f620, 0x4909: 0x4071f820, 0x490a: 0x4071fa20, + // Block 0x125, offset 0x4940 + 0x4940: 0x40765020, 0x4941: 0x40765220, 0x4942: 0x40765420, 0x4943: 0x40765620, + 0x4944: 0x40765820, 0x4945: 0x40765a20, 0x4946: 0x40765c20, 0x4947: 0x40765e20, + 0x4948: 0x40766020, 0x4949: 0x40766220, 0x494a: 0x40766420, 0x494b: 0x40766620, + 0x494c: 0x40766820, 0x494d: 0x40766a20, 0x494e: 0x40766c20, 0x494f: 0x40766e20, + 0x4950: 0x40767020, 0x4951: 0x40767220, 0x4952: 0x40767420, 0x4953: 0x40767620, + 0x4954: 0x40767820, 0x4955: 0x40767a20, 0x4956: 0x40767c20, 0x4957: 0x40767e20, + 0x4958: 0x40768020, 0x4959: 0x40768220, 0x495a: 0x40768420, 0x495b: 0x40768620, + 0x495c: 0x40768820, 0x495d: 0x40768a20, 0x495f: 0x4003c420, + 0x4960: 0x40768c20, 0x4961: 0x40768e20, 0x4962: 0x40769020, 0x4963: 0x40769220, + 0x4964: 0x40769420, 0x4965: 0x40769620, 0x4966: 0x40769820, 0x4967: 0x40769a20, + 0x4968: 0x40769c20, 0x4969: 0x40769e20, 0x496a: 0x4076a020, 0x496b: 0x4076a220, + 0x496c: 0x4076a420, 0x496d: 0x4076a620, 0x496e: 0x4076a820, 0x496f: 0x4076aa20, + 0x4970: 0x4076ac20, 0x4971: 0x4076ae20, 0x4972: 0x4076b020, 0x4973: 0x4076b220, + 0x4974: 0x4076b420, 0x4975: 0x4076b620, 0x4976: 0x4076b820, 0x4977: 0x4076ba20, + 0x4978: 0x4076bc20, 0x4979: 0x4076be20, 0x497a: 0x4076c020, 0x497b: 0x4076c220, + 0x497c: 0x4076c420, 0x497d: 0x4076c620, 0x497e: 0x4076c820, 0x497f: 0x4076ca20, + // Block 0x126, offset 0x4980 + 0x4980: 0x4076cc20, 0x4981: 0x4076ce20, 0x4982: 0x4076d020, 0x4983: 0x4076d220, + 0x4988: 0x4076d420, 0x4989: 0x4076d620, 0x498a: 0x4076d820, 0x498b: 0x4076da20, + 0x498c: 0x4076dc20, 0x498d: 0x4076de20, 0x498e: 0x4076e020, 0x498f: 0x4076e220, + 0x4990: 0x4003c620, 0x4991: 0xe000027c, 0x4992: 0xe0000391, 0x4993: 0x40295a20, + 0x4994: 0x40295c20, 0x4995: 0x40295e20, + // Block 0x127, offset 0x49c0 + 0x49c0: 0x0071fc88, 0x49c1: 0x0071fe88, 0x49c2: 0x00720088, 0x49c3: 0x00720288, + 0x49c4: 0x00720488, 0x49c5: 0x00720688, 0x49c6: 0x00720888, 0x49c7: 0x00720a88, + 0x49c8: 0x00720c88, 0x49c9: 0x00720e88, 0x49ca: 0x00721088, 0x49cb: 0x00721288, + 0x49cc: 0x00721488, 0x49cd: 0x00721688, 0x49ce: 0x00721888, 0x49cf: 0x00721a88, + 0x49d0: 0x00721c88, 0x49d1: 0x00721e88, 0x49d2: 0x00722088, 0x49d3: 0x00722288, + 0x49d4: 0x00722488, 0x49d5: 0x00722688, 0x49d6: 0x00722888, 0x49d7: 0x00722a88, + 0x49d8: 0x00722c88, 0x49d9: 0x00722e88, 0x49da: 0x00723088, 0x49db: 0x00723288, + 0x49dc: 0x00723488, 0x49dd: 0x00723688, 0x49de: 0x00723888, 0x49df: 0x00723a88, + 0x49e0: 0x00723c88, 0x49e1: 0x00723e88, 0x49e2: 0x00724088, 0x49e3: 0x00724288, + 0x49e4: 0x00724488, 0x49e5: 0x00724688, 0x49e6: 0x00724888, 0x49e7: 0x00724a88, + 0x49e8: 0x4071fc20, 0x49e9: 0x4071fe20, 0x49ea: 0x40720020, 0x49eb: 0x40720220, + 0x49ec: 0x40720420, 0x49ed: 0x40720620, 0x49ee: 0x40720820, 0x49ef: 0x40720a20, + 0x49f0: 0x40720c20, 0x49f1: 0x40720e20, 0x49f2: 0x40721020, 0x49f3: 0x40721220, + 0x49f4: 0x40721420, 0x49f5: 0x40721620, 0x49f6: 0x40721820, 0x49f7: 0x40721a20, + 0x49f8: 0x40721c20, 0x49f9: 0x40721e20, 0x49fa: 0x40722020, 0x49fb: 0x40722220, + 0x49fc: 0x40722420, 0x49fd: 0x40722620, 0x49fe: 0x40722820, 0x49ff: 0x40722a20, + // Block 0x128, offset 0x4a00 + 0x4a00: 0x40722c20, 0x4a01: 0x40722e20, 0x4a02: 0x40723020, 0x4a03: 0x40723220, + 0x4a04: 0x40723420, 0x4a05: 0x40723620, 0x4a06: 0x40723820, 0x4a07: 0x40723a20, + 0x4a08: 0x40723c20, 0x4a09: 0x40723e20, 0x4a0a: 0x40724020, 0x4a0b: 0x40724220, + 0x4a0c: 0x40724420, 0x4a0d: 0x40724620, 0x4a0e: 0x40724820, 0x4a0f: 0x40724a20, + 0x4a10: 0x40724c20, 0x4a11: 0x40724e20, 0x4a12: 0x40725020, 0x4a13: 0x40725220, + 0x4a14: 0x40725420, 0x4a15: 0x40725620, 0x4a16: 0x40725820, 0x4a17: 0x40725a20, + 0x4a18: 0x40725c20, 0x4a19: 0x40725e20, 0x4a1a: 0x40726020, 0x4a1b: 0x40726220, + 0x4a1c: 0x40726420, 0x4a1d: 0x40726620, 0x4a1e: 0x40726820, 0x4a1f: 0x40726a20, + 0x4a20: 0x40726c20, 0x4a21: 0x40726e20, 0x4a22: 0x40727020, 0x4a23: 0x40727220, + 0x4a24: 0x40727420, 0x4a25: 0x40727620, 0x4a26: 0x40727820, 0x4a27: 0x40727a20, + 0x4a28: 0x40727c20, 0x4a29: 0x40727e20, 0x4a2a: 0x40728020, 0x4a2b: 0x40728220, + 0x4a2c: 0x40728420, 0x4a2d: 0x40728620, 0x4a2e: 0x40728820, 0x4a2f: 0x40728a20, + 0x4a30: 0x40728c20, 0x4a31: 0x40728e20, 0x4a32: 0x40729020, 0x4a33: 0x40729220, + 0x4a34: 0x40729420, 0x4a35: 0x40729620, 0x4a36: 0x40729820, 0x4a37: 0x40729a20, + 0x4a38: 0x40729c20, 0x4a39: 0x40729e20, 0x4a3a: 0x4072a020, 0x4a3b: 0x4072a220, + 0x4a3c: 0x4072a420, 0x4a3d: 0x4072a620, 0x4a3e: 0x4072a820, 0x4a3f: 0x4072aa20, + // Block 0x129, offset 0x4a40 + 0x4a40: 0x4072ac20, 0x4a41: 0x4072ae20, 0x4a42: 0x4072b020, 0x4a43: 0x4072b220, + 0x4a44: 0x4072b420, 0x4a45: 0x4072b620, 0x4a46: 0x4072b820, 0x4a47: 0x4072ba20, + 0x4a48: 0x4072bc20, 0x4a49: 0x4072be20, 0x4a4a: 0x4072c020, 0x4a4b: 0x4072c220, + 0x4a4c: 0x4072c420, 0x4a4d: 0x4072c620, 0x4a4e: 0x4072c820, 0x4a4f: 0x4072ca20, + 0x4a50: 0x4072cc20, 0x4a51: 0x4072ce20, 0x4a52: 0x4072d020, 0x4a53: 0x4072d220, + 0x4a54: 0x4072d420, 0x4a55: 0x4072d620, 0x4a56: 0x4072d820, 0x4a57: 0x4072da20, + 0x4a58: 0x4072dc20, 0x4a59: 0x4072de20, 0x4a5a: 0x4072e020, 0x4a5b: 0x4072e220, + 0x4a5c: 0x4072e420, 0x4a5d: 0x4072e620, + 0x4a60: 0xe0000167, 0x4a61: 0xe00001f5, 0x4a62: 0xe0000310, 0x4a63: 0xe00003ea, + 0x4a64: 0xe00004c5, 0x4a65: 0xe000058f, 0x4a66: 0xe000065a, 0x4a67: 0xe0000702, + 0x4a68: 0xe00007ae, 0x4a69: 0xe0000853, + // Block 0x12a, offset 0x4a80 + 0x4a80: 0x4074c020, 0x4a81: 0x4074c220, 0x4a82: 0x4074c420, 0x4a83: 0x4074c620, + 0x4a84: 0x4074c820, 0x4a85: 0x4074ca20, + 0x4a88: 0x4074cc20, 0x4a8a: 0x4074ce20, 0x4a8b: 0x4074d020, + 0x4a8c: 0x4074d220, 0x4a8d: 0x4074d420, 0x4a8e: 0x4074d620, 0x4a8f: 0x4074d820, + 0x4a90: 0x4074da20, 0x4a91: 0x4074dc20, 0x4a92: 0x4074de20, 0x4a93: 0x4074e020, + 0x4a94: 0x4074e220, 0x4a95: 0x4074e420, 0x4a96: 0x4074e620, 0x4a97: 0x4074e820, + 0x4a98: 0x4074ea20, 0x4a99: 0x4074ec20, 0x4a9a: 0x4074ee20, 0x4a9b: 0x4074f020, + 0x4a9c: 0x4074f220, 0x4a9d: 0x4074f420, 0x4a9e: 0x4074f620, 0x4a9f: 0x4074f820, + 0x4aa0: 0x4074fa20, 0x4aa1: 0x4074fc20, 0x4aa2: 0x4074fe20, 0x4aa3: 0x40750020, + 0x4aa4: 0x40750220, 0x4aa5: 0x40750420, 0x4aa6: 0x40750620, 0x4aa7: 0x40750820, + 0x4aa8: 0x40750a20, 0x4aa9: 0x40750c20, 0x4aaa: 0x40750e20, 0x4aab: 0x40751020, + 0x4aac: 0x40751220, 0x4aad: 0x40751420, 0x4aae: 0x40751620, 0x4aaf: 0x40751820, + 0x4ab0: 0x40751a20, 0x4ab1: 0x40751c20, 0x4ab2: 0x40751e20, 0x4ab3: 0x40752020, + 0x4ab4: 0x40752220, 0x4ab5: 0x40752420, 0x4ab7: 0x40752620, + 0x4ab8: 0x40752820, + 0x4abc: 0x40752a20, 0x4abf: 0x40752c20, + // Block 0x12b, offset 0x4ac0 + 0x4ac0: 0x4075d220, 0x4ac1: 0x4075d420, 0x4ac2: 0x4075d620, 0x4ac3: 0x4075d820, + 0x4ac4: 0x4075da20, 0x4ac5: 0x4075dc20, 0x4ac6: 0x4075de20, 0x4ac7: 0x4075e020, + 0x4ac8: 0x4075e220, 0x4ac9: 0x4075e420, 0x4aca: 0x4075e620, 0x4acb: 0x4075e820, + 0x4acc: 0x4075ea20, 0x4acd: 0x4075ec20, 0x4ace: 0x4075ee20, 0x4acf: 0x4075f020, + 0x4ad0: 0x4075f220, 0x4ad1: 0x4075f420, 0x4ad2: 0x4075f620, 0x4ad3: 0x4075f820, + 0x4ad4: 0x4075fa20, 0x4ad5: 0x4075fc20, 0x4ad7: 0x40038620, + 0x4ad8: 0xe0000297, 0x4ad9: 0xe00003b2, 0x4ada: 0xe000048c, 0x4adb: 0x40296820, + 0x4adc: 0x40296a20, 0x4add: 0x40296c20, 0x4ade: 0x40296e20, 0x4adf: 0x40297020, + // Block 0x12c, offset 0x4b00 + 0x4b00: 0x4038bc20, 0x4b01: 0x4038be20, 0x4b02: 0x4038c020, 0x4b03: 0x4038c220, + 0x4b04: 0x4038c420, 0x4b05: 0x4038c620, 0x4b06: 0x4038c820, 0x4b07: 0x4038ca20, + 0x4b08: 0x4038cc20, 0x4b09: 0x4038ce20, 0x4b0a: 0x4038d020, 0x4b0b: 0x4038d220, + 0x4b0c: 0x4038d420, 0x4b0d: 0x4038d620, 0x4b0e: 0x4038d820, 0x4b0f: 0x4038da20, + 0x4b10: 0x4038dc20, 0x4b11: 0x4038de20, 0x4b12: 0x4038e020, 0x4b13: 0x4038e220, + 0x4b14: 0x4038e420, 0x4b15: 0x4038e620, 0x4b16: 0xe0000294, 0x4b17: 0x40296220, + 0x4b18: 0x40296420, 0x4b19: 0x40296620, 0x4b1a: 0xe00003af, 0x4b1b: 0xe0000489, + 0x4b1f: 0x4003c820, + 0x4b20: 0x40715420, 0x4b21: 0x40715620, 0x4b22: 0x40715820, 0x4b23: 0x40715a20, + 0x4b24: 0x40715c20, 0x4b25: 0x40715e20, 0x4b26: 0x40716020, 0x4b27: 0x40716220, + 0x4b28: 0x40716420, 0x4b29: 0x40716620, 0x4b2a: 0x40716820, 0x4b2b: 0x40716a20, + 0x4b2c: 0x40716c20, 0x4b2d: 0x40716e20, 0x4b2e: 0x40717020, 0x4b2f: 0x40717220, + 0x4b30: 0x40717420, 0x4b31: 0x40717620, 0x4b32: 0x40717820, 0x4b33: 0x40717a20, + 0x4b34: 0x40717c20, 0x4b35: 0x40717e20, 0x4b36: 0x40718020, 0x4b37: 0x40718220, + 0x4b38: 0x40718420, 0x4b39: 0x40718620, + 0x4b3f: 0x4003bc20, + // Block 0x12d, offset 0x4b40 + 0x4b40: 0xe00023a4, 0x4b41: 0xe00023a7, 0x4b42: 0xe00023aa, 0x4b43: 0xe00023ad, + 0x4b44: 0xe00023b0, 0x4b45: 0xe00023b3, 0x4b46: 0xe00023b6, 0x4b47: 0xe00023b9, + 0x4b48: 0xe00023bc, 0x4b49: 0xe00023bf, 0x4b4a: 0xe00023c2, 0x4b4b: 0xe00023c5, + 0x4b4c: 0xe00023c8, 0x4b4d: 0xe00023cb, 0x4b4e: 0xe00023ce, 0x4b4f: 0xe00023d1, + 0x4b50: 0xe00023d4, 0x4b51: 0xe00023d7, 0x4b52: 0xe00023da, 0x4b53: 0xe00023e0, + 0x4b54: 0xe00023e3, 0x4b55: 0xe00023e6, 0x4b56: 0xe00023e9, 0x4b57: 0xe00023ec, + 0x4b58: 0xe00023ef, 0x4b59: 0xe00023f2, 0x4b5a: 0xe00023f5, 0x4b5b: 0xe00023f8, + 0x4b5c: 0xe00023fb, 0x4b5d: 0xe00023fe, 0x4b5e: 0x40865220, 0x4b5f: 0x40865420, + 0x4b60: 0x40862020, 0x4b61: 0x40862220, 0x4b62: 0x40862420, 0x4b63: 0x40862620, + 0x4b64: 0x40862820, 0x4b65: 0x40862a20, 0x4b66: 0x40862c20, 0x4b67: 0x40862e20, + 0x4b68: 0x40863020, 0x4b69: 0x40863220, 0x4b6a: 0x40863420, 0x4b6b: 0x40863620, + 0x4b6c: 0x40863820, 0x4b6d: 0x40863a20, 0x4b6e: 0x40863c20, 0x4b6f: 0x40863e20, + 0x4b70: 0xe00023dd, 0x4b71: 0x40864020, 0x4b72: 0x40864220, 0x4b73: 0x40864420, + 0x4b74: 0x40864620, 0x4b75: 0x40864820, 0x4b76: 0x40864a20, 0x4b77: 0x40864c20, + 0x4b7e: 0x40864e20, 0x4b7f: 0x40865020, + // Block 0x12e, offset 0x4b80 + 0x4b80: 0x4048bc20, 0x4b81: 0x4048be20, 0x4b82: 0x4048c020, 0x4b83: 0x4048c220, + 0x4b85: 0x4048c420, 0x4b86: 0x4048c620, + 0x4b8c: 0x4048c820, 0x4b8d: 0xadc06002, 0x4b8e: 0xa000f302, 0x4b8f: 0xae60f402, + 0x4b90: 0x4048ca20, 0x4b91: 0x4048cc20, 0x4b92: 0x4048ce20, 0x4b93: 0x4048d020, + 0x4b95: 0x4048d220, 0x4b96: 0x4048d420, 0x4b97: 0x4048d620, + 0x4b99: 0x4048d820, 0x4b9a: 0x4048da20, 0x4b9b: 0x4048dc20, + 0x4b9c: 0x4048de20, 0x4b9d: 0x4048e020, 0x4b9e: 0x4048e220, 0x4b9f: 0x4048e420, + 0x4ba0: 0x4048e620, 0x4ba1: 0x4048e820, 0x4ba2: 0x4048ea20, 0x4ba3: 0x4048ec20, + 0x4ba4: 0x4048ee20, 0x4ba5: 0x4048f020, 0x4ba6: 0x4048f220, 0x4ba7: 0x4048f420, + 0x4ba8: 0x4048f620, 0x4ba9: 0x4048f820, 0x4baa: 0x4048fa20, 0x4bab: 0x4048fc20, + 0x4bac: 0x4048fe20, 0x4bad: 0x40490020, 0x4bae: 0x40490220, 0x4baf: 0x40490420, + 0x4bb0: 0x40490620, 0x4bb1: 0x40490820, 0x4bb2: 0x40490a20, 0x4bb3: 0x40490c20, + 0x4bb8: 0xae60fb02, 0x4bb9: 0xa010fc02, 0x4bba: 0xadc0fd02, + 0x4bbf: 0x82092487, + // Block 0x12f, offset 0x4bc0 + 0x4bc0: 0xe00002ac, 0x4bc1: 0xe00003c7, 0x4bc2: 0xe00004a1, 0x4bc3: 0xe0000573, + 0x4bc4: 0x40299820, 0x4bc5: 0x40299a20, 0x4bc6: 0x40299c20, 0x4bc7: 0x40299e20, + 0x4bd0: 0x40060620, 0x4bd1: 0x40060820, 0x4bd2: 0x40060a20, 0x4bd3: 0x40060c20, + 0x4bd4: 0x40060e20, 0x4bd5: 0x40061020, 0x4bd6: 0x40034420, 0x4bd7: 0x40034620, + 0x4bd8: 0x40061220, + 0x4be0: 0x40752e20, 0x4be1: 0x40753020, 0x4be2: 0x40753220, 0x4be3: 0x40753420, + 0x4be4: 0x40753620, 0x4be5: 0x40753820, 0x4be6: 0x40753a20, 0x4be7: 0x40753c20, + 0x4be8: 0x40753e20, 0x4be9: 0x40754020, 0x4bea: 0x40754220, 0x4beb: 0x40754420, + 0x4bec: 0x40754620, 0x4bed: 0x40754820, 0x4bee: 0x40754a20, 0x4bef: 0x40754c20, + 0x4bf0: 0x40754e20, 0x4bf1: 0x40755020, 0x4bf2: 0x40755220, 0x4bf3: 0x40755420, + 0x4bf4: 0x40755620, 0x4bf5: 0x40755820, 0x4bf6: 0x40755a20, 0x4bf7: 0x40755c20, + 0x4bf8: 0x40755e20, 0x4bf9: 0x40756020, 0x4bfa: 0x40756220, 0x4bfb: 0x40756420, + 0x4bfc: 0x40756620, 0x4bfd: 0xe0000291, 0x4bfe: 0x40296020, 0x4bff: 0x40061c20, + // Block 0x130, offset 0x4c00 + 0x4c00: 0x40756820, 0x4c01: 0x40756a20, 0x4c02: 0x40756c20, 0x4c03: 0x40756e20, + 0x4c04: 0x40757020, 0x4c05: 0x40757220, 0x4c06: 0x40757420, 0x4c07: 0x40757620, + 0x4c08: 0x40757820, 0x4c09: 0x40757a20, 0x4c0a: 0x40757c20, 0x4c0b: 0x40757e20, + 0x4c0c: 0x40758020, 0x4c0d: 0x40758220, 0x4c0e: 0x40758420, 0x4c0f: 0x40758620, + 0x4c10: 0x40758820, 0x4c11: 0x40758a20, 0x4c12: 0x40758c20, 0x4c13: 0x40758e20, + 0x4c14: 0x40759020, 0x4c15: 0x40759220, 0x4c16: 0x40759420, 0x4c17: 0x40759620, + 0x4c18: 0x40759820, 0x4c19: 0x40759a20, 0x4c1a: 0x40759c20, 0x4c1b: 0x40759e20, + 0x4c1c: 0x4075a020, 0x4c1d: 0x4075a220, 0x4c1e: 0x4075a420, 0x4c1f: 0x4075a620, + 0x4c20: 0x4075a820, 0x4c21: 0x4075aa20, 0x4c22: 0x4075ac20, 0x4c23: 0x4075ae20, + 0x4c24: 0x4075b020, 0x4c25: 0x4075b220, 0x4c26: 0x4075b420, 0x4c27: 0x4075b620, + 0x4c28: 0x4075b820, 0x4c29: 0x4075ba20, 0x4c2a: 0x4075bc20, 0x4c2b: 0x4075be20, + 0x4c2c: 0x4075c020, 0x4c2d: 0x4075c220, 0x4c2e: 0xe00023a1, 0x4c2f: 0x4075c420, + 0x4c30: 0x4075c620, 0x4c31: 0x4075c820, 0x4c32: 0x4075ca20, 0x4c33: 0x4075cc20, + 0x4c34: 0x4075ce20, 0x4c35: 0x4075d020, + 0x4c39: 0x40061420, 0x4c3a: 0x40038820, 0x4c3b: 0x40038a20, + 0x4c3c: 0x40038c20, 0x4c3d: 0x40038e20, 0x4c3e: 0x40039020, 0x4c3f: 0x40039220, + // Block 0x131, offset 0x4c40 + 0x4c40: 0x4075fe20, 0x4c41: 0x40760020, 0x4c42: 0x40760220, 0x4c43: 0x40760420, + 0x4c44: 0x40760620, 0x4c45: 0x40760820, 0x4c46: 0x40760a20, 0x4c47: 0x40760c20, + 0x4c48: 0x40760e20, 0x4c49: 0x40761020, 0x4c4a: 0x40761220, 0x4c4b: 0x40761420, + 0x4c4c: 0x40761620, 0x4c4d: 0x40761820, 0x4c4e: 0x40761a20, 0x4c4f: 0x40761c20, + 0x4c50: 0x40761e20, 0x4c51: 0x40762020, 0x4c52: 0x40762220, 0x4c53: 0x40762420, + 0x4c54: 0x40762620, 0x4c55: 0x40762820, + 0x4c58: 0xe000029a, 0x4c59: 0xe00003b5, 0x4c5a: 0xe000048f, 0x4c5b: 0xe0000561, + 0x4c5c: 0x40297220, 0x4c5d: 0x40297420, 0x4c5e: 0x40297620, 0x4c5f: 0x40297820, + 0x4c60: 0x40762a20, 0x4c61: 0x40762c20, 0x4c62: 0x40762e20, 0x4c63: 0x40763020, + 0x4c64: 0x40763220, 0x4c65: 0x40763420, 0x4c66: 0x40763620, 0x4c67: 0x40763820, + 0x4c68: 0x40763a20, 0x4c69: 0x40763c20, 0x4c6a: 0x40763e20, 0x4c6b: 0x40764020, + 0x4c6c: 0x40764220, 0x4c6d: 0x40764420, 0x4c6e: 0x40764620, 0x4c6f: 0x40764820, + 0x4c70: 0x40764a20, 0x4c71: 0x40764c20, 0x4c72: 0x40764e20, + 0x4c78: 0xe000029d, 0x4c79: 0xe00003b8, 0x4c7a: 0xe0000492, 0x4c7b: 0xe0000564, + 0x4c7c: 0x40297a20, 0x4c7d: 0x40297c20, 0x4c7e: 0x40297e20, 0x4c7f: 0x40298020, + // Block 0x132, offset 0x4c80 + 0x4c80: 0x405b2620, 0x4c81: 0xe00020a7, 0x4c82: 0x405b2820, 0x4c83: 0x405b2a20, + 0x4c84: 0xe00020aa, 0x4c85: 0x405b2c20, 0x4c86: 0x405b2e20, 0x4c87: 0x405b3020, + 0x4c88: 0xe00020ad, 0x4c89: 0x405b3220, 0x4c8a: 0xe00020b0, 0x4c8b: 0x405b3420, + 0x4c8c: 0xe00020b3, 0x4c8d: 0x405b3620, 0x4c8e: 0xe00020b6, 0x4c8f: 0x405b3820, + 0x4c90: 0xe00020b9, 0x4c91: 0x405b3a20, 0x4c92: 0xe00020bc, 0x4c93: 0x405b3c20, + 0x4c94: 0x405b3e20, 0x4c95: 0xe00020bf, 0x4c96: 0x405b4020, 0x4c97: 0xe00020c2, + 0x4c98: 0x405b4220, 0x4c99: 0xe00020c5, 0x4c9a: 0x405b4420, 0x4c9b: 0xe00020c8, + 0x4c9c: 0x405b4620, 0x4c9d: 0xe00020cb, 0x4c9e: 0x405b4820, 0x4c9f: 0xe00020ce, + 0x4ca0: 0x405b4a20, 0x4ca1: 0x405b4c20, 0x4ca2: 0x405b4e20, 0x4ca3: 0x405b5020, + 0x4ca4: 0x405b5220, 0x4ca5: 0xe00020d1, 0x4ca6: 0x405b5420, 0x4ca7: 0xe00020d4, + 0x4ca8: 0x405b5620, 0x4ca9: 0xe00020d7, 0x4caa: 0x405b5820, 0x4cab: 0xe00020da, + 0x4cac: 0x405b5a20, 0x4cad: 0x405b5c20, 0x4cae: 0xe00020dd, 0x4caf: 0x405b5e20, + 0x4cb0: 0x405b6020, 0x4cb1: 0x405b6220, 0x4cb2: 0x405b6420, 0x4cb3: 0xe00020e0, + 0x4cb4: 0x405b6620, 0x4cb5: 0xe00020e3, 0x4cb6: 0x405b6820, 0x4cb7: 0xe00020e6, + 0x4cb8: 0x405b6a20, 0x4cb9: 0xe00020e9, 0x4cba: 0x405b6c20, 0x4cbb: 0xe00020ec, + 0x4cbc: 0x405b6e20, 0x4cbd: 0x405b7020, 0x4cbe: 0x405b7220, 0x4cbf: 0x405b7420, + // Block 0x133, offset 0x4cc0 + 0x4cc0: 0xe00020ef, 0x4cc1: 0x405b7620, 0x4cc2: 0xe00020f2, 0x4cc3: 0x405b7820, + 0x4cc4: 0xe00020f5, 0x4cc5: 0x405b7a20, 0x4cc6: 0xe00020f8, 0x4cc7: 0x405b7c20, + 0x4cc8: 0x405b7e20, + // Block 0x134, offset 0x4d00 + 0x4d20: 0xe00001ec, 0x4d21: 0xe0000307, 0x4d22: 0xe00003e1, 0x4d23: 0xe00004bc, + 0x4d24: 0xe0000586, 0x4d25: 0xe0000651, 0x4d26: 0xe00006f9, 0x4d27: 0xe00007a5, + 0x4d28: 0xe000084a, 0x4d29: 0x40288820, 0x4d2a: 0x40288a20, 0x4d2b: 0x40288c20, + 0x4d2c: 0x40288e20, 0x4d2d: 0x40289020, 0x4d2e: 0x40289220, 0x4d2f: 0x40289420, + 0x4d30: 0x40289620, 0x4d31: 0x40289820, 0x4d32: 0x40289a20, 0x4d33: 0x40289c20, + 0x4d34: 0x40289e20, 0x4d35: 0x4028a020, 0x4d36: 0x4028a220, 0x4d37: 0x4028a420, + 0x4d38: 0x4028a620, 0x4d39: 0x4028a820, 0x4d3a: 0x4028aa20, 0x4d3b: 0x4028ac20, + 0x4d3c: 0x4028ae20, 0x4d3d: 0x4028b020, 0x4d3e: 0x4028b220, + // Block 0x135, offset 0x4d40 + 0x4d40: 0xa000f202, 0x4d41: 0xa000f302, 0x4d42: 0xa000f402, 0x4d43: 0x40489220, + 0x4d44: 0x40489420, 0x4d45: 0x40483420, 0x4d46: 0x40483620, 0x4d47: 0x40483820, + 0x4d48: 0x40483a20, 0x4d49: 0x40483c20, 0x4d4a: 0x40483e20, 0x4d4b: 0x40484020, + 0x4d4c: 0x40484220, 0x4d4d: 0x40484420, 0x4d4e: 0x40484620, 0x4d4f: 0x40484820, + 0x4d50: 0x40484a20, 0x4d51: 0x40484c20, 0x4d52: 0x40484e20, 0x4d53: 0x40485020, + 0x4d54: 0x40485220, 0x4d55: 0x40485420, 0x4d56: 0x40485620, 0x4d57: 0x40485820, + 0x4d58: 0x40485a20, 0x4d59: 0x40485c20, 0x4d5a: 0x40485e20, 0x4d5b: 0x40486020, + 0x4d5c: 0x40486220, 0x4d5d: 0x40486420, 0x4d5e: 0x40486620, 0x4d5f: 0x40486820, + 0x4d60: 0x40486a20, 0x4d61: 0x40486c20, 0x4d62: 0x40486e20, 0x4d63: 0x40487020, + 0x4d64: 0x40487220, 0x4d65: 0x40487420, 0x4d66: 0x40487620, 0x4d67: 0x40487820, + 0x4d68: 0x40487a20, 0x4d69: 0x40487c20, 0x4d6a: 0x40487e20, 0x4d6b: 0x40488020, + 0x4d6c: 0x40488220, 0x4d6d: 0x40488420, 0x4d6e: 0x40488620, 0x4d6f: 0x40488820, + 0x4d70: 0x40488a20, 0x4d71: 0x40488c20, 0x4d72: 0x40488e20, 0x4d73: 0x40489020, + 0x4d74: 0x40489620, 0x4d75: 0x40489820, 0x4d76: 0x40489a20, 0x4d77: 0x40489c20, + 0x4d78: 0x40489e20, 0x4d79: 0x4048a020, 0x4d7a: 0x4048a220, 0x4d7b: 0x4048a420, + 0x4d7c: 0x4048a620, 0x4d7d: 0x4048a820, 0x4d7e: 0x4048aa20, 0x4d7f: 0x4048ac20, + // Block 0x136, offset 0x4d80 + 0x4d80: 0x4048ae20, 0x4d81: 0x4048b020, 0x4d82: 0x4048b220, 0x4d83: 0x4048b420, + 0x4d84: 0x4048b620, 0x4d85: 0x4048b820, 0x4d86: 0x8209245d, 0x4d87: 0x40034820, + 0x4d88: 0x40034a20, 0x4d89: 0x4005fc20, 0x4d8a: 0x4005fe20, 0x4d8b: 0x40060020, + 0x4d8c: 0x40060220, 0x4d8d: 0x40060420, + 0x4d92: 0xe00002a9, 0x4d93: 0xe00003c4, + 0x4d94: 0xe000049e, 0x4d95: 0xe0000570, 0x4d96: 0xe000063a, 0x4d97: 0xe00006ea, + 0x4d98: 0xe0000792, 0x4d99: 0xe000083b, 0x4d9a: 0xe00008e6, 0x4d9b: 0x40298220, + 0x4d9c: 0x40298420, 0x4d9d: 0x40298620, 0x4d9e: 0x40298820, 0x4d9f: 0x40298a20, + 0x4da0: 0x40298c20, 0x4da1: 0x40298e20, 0x4da2: 0x40299020, 0x4da3: 0x40299220, + 0x4da4: 0x40299420, 0x4da5: 0x40299620, 0x4da6: 0xe00001df, 0x4da7: 0xe00002a6, + 0x4da8: 0xe00003c1, 0x4da9: 0xe000049b, 0x4daa: 0xe000056d, 0x4dab: 0xe0000637, + 0x4dac: 0xe00006e7, 0x4dad: 0xe000078f, 0x4dae: 0xe0000838, 0x4daf: 0xe00008e3, + // Block 0x137, offset 0x4dc0 + 0x4dc0: 0xa000f202, 0x4dc1: 0xa000f302, 0x4dc2: 0xa000f402, 0x4dc3: 0x40467e20, + 0x4dc4: 0x40468020, 0x4dc5: 0x40468220, 0x4dc6: 0x40468420, 0x4dc7: 0x40468620, + 0x4dc8: 0x40468820, 0x4dc9: 0x40468a20, 0x4dca: 0x40468c20, 0x4dcb: 0x40468e20, + 0x4dcc: 0x40469020, 0x4dcd: 0x40469220, 0x4dce: 0x40469420, 0x4dcf: 0x40469620, + 0x4dd0: 0x40469820, 0x4dd1: 0x40469a20, 0x4dd2: 0x40469c20, 0x4dd3: 0x40469e20, + 0x4dd4: 0x4046a020, 0x4dd5: 0x4046a220, 0x4dd6: 0x4046a420, 0x4dd7: 0x4046a620, + 0x4dd8: 0x4046a820, 0x4dd9: 0x4046aa20, 0x4dda: 0xe0001878, 0x4ddb: 0x4046ac20, + 0x4ddc: 0xe000187b, 0x4ddd: 0x4046ae20, 0x4dde: 0x4046b020, 0x4ddf: 0x4046b220, + 0x4de0: 0x4046b420, 0x4de1: 0x4046b620, 0x4de2: 0x4046b820, 0x4de3: 0x4046ba20, + 0x4de4: 0x4046bc20, 0x4de5: 0x4046be20, 0x4de6: 0x4046c020, 0x4de7: 0x4046c220, + 0x4de8: 0x4046c420, 0x4de9: 0x4046c620, 0x4dea: 0x4046c820, 0x4deb: 0xe000187e, + 0x4dec: 0x4046ca20, 0x4ded: 0x4046cc20, 0x4dee: 0x4046ce20, 0x4def: 0x4046d020, + 0x4df0: 0x4046d220, 0x4df1: 0x4046d420, 0x4df2: 0x4046d620, 0x4df3: 0x4046d820, + 0x4df4: 0x4046da20, 0x4df5: 0x4046dc20, 0x4df6: 0x4046de20, 0x4df7: 0x4046e020, + 0x4df8: 0x4046e220, 0x4df9: 0x82092372, 0x4dfa: 0xa070f102, 0x4dfb: 0x40061620, + 0x4dfc: 0x40061820, 0x4dfd: 0xa0000000, 0x4dfe: 0x40039420, 0x4dff: 0x40039620, + // Block 0x138, offset 0x4e00 + 0x4e00: 0x40034c20, 0x4e01: 0x40034e20, + 0x4e10: 0x4072e820, 0x4e11: 0x4072ea20, 0x4e12: 0x4072ec20, 0x4e13: 0x4072ee20, + 0x4e14: 0x4072f020, 0x4e15: 0x4072f220, 0x4e16: 0x4072f420, 0x4e17: 0x4072f620, + 0x4e18: 0x4072f820, 0x4e19: 0x4072fa20, 0x4e1a: 0x4072fc20, 0x4e1b: 0x4072fe20, + 0x4e1c: 0x40730020, 0x4e1d: 0x40730220, 0x4e1e: 0x40730420, 0x4e1f: 0x40730620, + 0x4e20: 0x40730820, 0x4e21: 0x40730a20, 0x4e22: 0x40730c20, 0x4e23: 0x40730e20, + 0x4e24: 0x40731020, 0x4e25: 0x40731220, 0x4e26: 0x40731420, 0x4e27: 0x40731620, + 0x4e28: 0x40731820, + 0x4e30: 0xe00001d0, 0x4e31: 0xe0000264, 0x4e32: 0xe000037c, 0x4e33: 0xe0000456, + 0x4e34: 0xe000052b, 0x4e35: 0xe00005f5, 0x4e36: 0xe00006c0, 0x4e37: 0xe0000768, + 0x4e38: 0xe0000814, 0x4e39: 0xe00008b9, + // Block 0x139, offset 0x4e40 + 0x4e40: 0xae60f202, 0x4e41: 0xae60f302, 0x4e42: 0xae60f402, 0x4e43: 0x404f4020, + 0x4e44: 0x404f4220, 0x4e45: 0x404f4420, 0x4e46: 0x404f4620, 0x4e47: 0x404f4820, + 0x4e48: 0x404f4a20, 0x4e49: 0x404f4c20, 0x4e4a: 0x404f4e20, 0x4e4b: 0x404f5020, + 0x4e4c: 0x404f5220, 0x4e4d: 0x404f5420, 0x4e4e: 0x404f5620, 0x4e4f: 0x404f5820, + 0x4e50: 0x404f5a20, 0x4e51: 0x404f5c20, 0x4e52: 0x404f5e20, 0x4e53: 0x404f6020, + 0x4e54: 0x404f6220, 0x4e55: 0x404f6420, 0x4e56: 0x404f6620, 0x4e57: 0x404f6820, + 0x4e58: 0x404f6a20, 0x4e59: 0x404f6c20, 0x4e5a: 0x404f6e20, 0x4e5b: 0x404f7020, + 0x4e5c: 0x404f7220, 0x4e5d: 0x404f7420, 0x4e5e: 0x404f7620, 0x4e5f: 0x404f7820, + 0x4e60: 0x404f7a20, 0x4e61: 0x404f7c20, 0x4e62: 0x404f7e20, 0x4e63: 0x404f8020, + 0x4e64: 0x404f8220, 0x4e65: 0x404f8420, 0x4e66: 0x404f8620, 0x4e67: 0x404f8820, + 0x4e68: 0x404f8a20, 0x4e69: 0x404f8c20, 0x4e6a: 0x404f8e20, 0x4e6b: 0x404f9020, + 0x4e6c: 0x404f9220, 0x4e6d: 0x404f9420, 0x4e6e: 0x404f9620, 0x4e6f: 0x404f9820, + 0x4e70: 0x404f9a20, 0x4e71: 0xc31507e1, 0x4e72: 0xc31707e1, 0x4e73: 0x820927d0, + 0x4e74: 0x820927d1, 0x4e76: 0xe00001b2, 0x4e77: 0xe0000246, + 0x4e78: 0xe000035e, 0x4e79: 0xe0000438, 0x4e7a: 0xe000050d, 0x4e7b: 0xe00005d7, + 0x4e7c: 0xe00006a2, 0x4e7d: 0xe000074a, 0x4e7e: 0xe00007f6, 0x4e7f: 0xe000089b, + // Block 0x13a, offset 0x4e80 + 0x4e80: 0x40039820, 0x4e81: 0x40035020, 0x4e82: 0x40035220, 0x4e83: 0x4002de20, + // Block 0x13b, offset 0x4ec0 + 0x4ec0: 0xa000f202, 0x4ec1: 0xa000f302, 0x4ec2: 0xa000f402, 0x4ec3: 0x4046e820, + 0x4ec4: 0x4046ea20, 0x4ec5: 0x4046ec20, 0x4ec6: 0x4046ee20, 0x4ec7: 0x4046f020, + 0x4ec8: 0x4046f220, 0x4ec9: 0x4046f420, 0x4eca: 0x4046f620, 0x4ecb: 0x4046f820, + 0x4ecc: 0x4046fa20, 0x4ecd: 0x4046fc20, 0x4ece: 0x4046fe20, 0x4ecf: 0x40470020, + 0x4ed0: 0x40470220, 0x4ed1: 0x40470420, 0x4ed2: 0x40470620, 0x4ed3: 0x40470820, + 0x4ed4: 0x40470a20, 0x4ed5: 0x40470c20, 0x4ed6: 0x40470e20, 0x4ed7: 0x40471020, + 0x4ed8: 0x40471220, 0x4ed9: 0x40471420, 0x4eda: 0x40471620, 0x4edb: 0x40471820, + 0x4edc: 0x40471a20, 0x4edd: 0x40471c20, 0x4ede: 0x40471e20, 0x4edf: 0x40472020, + 0x4ee0: 0x40472220, 0x4ee1: 0x40472420, 0x4ee2: 0x40472620, 0x4ee3: 0x40472820, + 0x4ee4: 0x40472a20, 0x4ee5: 0x40472c20, 0x4ee6: 0x40472e20, 0x4ee7: 0x40473020, + 0x4ee8: 0x40473220, 0x4ee9: 0x40473420, 0x4eea: 0x40473620, 0x4eeb: 0x40473820, + 0x4eec: 0x40473a20, 0x4eed: 0x40473c20, 0x4eee: 0x40473e20, 0x4eef: 0x40474020, + 0x4ef0: 0x40474220, 0x4ef1: 0x40474420, 0x4ef2: 0x40474620, 0x4ef3: 0x40474820, + 0x4ef4: 0x40474a20, 0x4ef5: 0x40474c20, 0x4ef6: 0x40474e20, 0x4ef7: 0x40475020, + 0x4ef8: 0x40475220, 0x4ef9: 0x40475420, 0x4efa: 0x40475620, 0x4efb: 0x40475820, + 0x4efc: 0x40475a20, 0x4efd: 0x40475c20, 0x4efe: 0x40475e20, 0x4eff: 0x40476020, + // Block 0x13c, offset 0x4f00 + 0x4f00: 0x820923b1, 0x4f01: 0x40476420, 0x4f02: 0x40476620, 0x4f03: 0x40476820, + 0x4f04: 0x4046e620, 0x4f05: 0x40035420, 0x4f06: 0x40035620, 0x4f07: 0x40061a20, + 0x4f08: 0x40039a20, + 0x4f10: 0xe00001d9, 0x4f11: 0xe00002a0, 0x4f12: 0xe00003bb, 0x4f13: 0xe0000495, + 0x4f14: 0xe0000567, 0x4f15: 0xe0000631, 0x4f16: 0xe00006e1, 0x4f17: 0xe0000789, + 0x4f18: 0xe0000832, 0x4f19: 0xe00008dd, + // Block 0x13d, offset 0x4f40 + 0x4f40: 0x40476a20, 0x4f41: 0x40476c20, 0x4f42: 0x40476e20, 0x4f43: 0x40477020, + 0x4f44: 0x40477220, 0x4f45: 0x40477420, 0x4f46: 0x40477620, 0x4f47: 0x40477820, + 0x4f48: 0x40477a20, 0x4f49: 0x40477c20, 0x4f4a: 0x40478420, 0x4f4b: 0x40478620, + 0x4f4c: 0x40478820, 0x4f4d: 0x40478a20, 0x4f4e: 0x40478c20, 0x4f4f: 0x40478e20, + 0x4f50: 0x40479020, 0x4f51: 0x40479220, 0x4f52: 0x40479420, 0x4f53: 0x40479620, + 0x4f54: 0x40479820, 0x4f55: 0x40479a20, 0x4f56: 0x40479c20, 0x4f57: 0x40479e20, + 0x4f58: 0x4047a020, 0x4f59: 0x4047a220, 0x4f5a: 0x4047a420, 0x4f5b: 0x4047a620, + 0x4f5c: 0x4047a820, 0x4f5d: 0x4047aa20, 0x4f5e: 0x4047ac20, 0x4f5f: 0x4047ae20, + 0x4f60: 0x4047b020, 0x4f61: 0x4047b220, 0x4f62: 0x4047b420, 0x4f63: 0x4047b620, + 0x4f64: 0x4047b820, 0x4f65: 0x4047ba20, 0x4f66: 0x4047bc20, 0x4f67: 0x40478020, + 0x4f68: 0x40477e20, 0x4f69: 0x40478220, 0x4f6a: 0x4047be20, 0x4f6b: 0xa000f302, + 0x4f6c: 0xa000f402, 0x4f6d: 0x4047c020, 0x4f6e: 0x4047c220, 0x4f6f: 0x4047c420, + 0x4f70: 0x4047c620, 0x4f71: 0x4047c820, 0x4f72: 0x4047ca20, 0x4f73: 0x4047cc20, + 0x4f74: 0x4047ce20, 0x4f75: 0x4047d020, 0x4f76: 0x820923e9, 0x4f77: 0xa070f102, + // Block 0x13e, offset 0x4f80 + 0x4f80: 0xe00001dc, 0x4f81: 0xe00002a3, 0x4f82: 0xe00003be, 0x4f83: 0xe0000498, + 0x4f84: 0xe000056a, 0x4f85: 0xe0000634, 0x4f86: 0xe00006e4, 0x4f87: 0xe000078c, + 0x4f88: 0xe0000835, 0x4f89: 0xe00008e0, + // Block 0x13f, offset 0x4fc0 + 0x4fc0: 0x4076e420, 0x4fc1: 0x4076e620, 0x4fc2: 0x4076e820, 0x4fc3: 0x4076ea20, + 0x4fc4: 0x4076ec20, 0x4fc5: 0x4076ee20, 0x4fc6: 0x4076f020, 0x4fc7: 0x4076f220, + 0x4fc8: 0x4076f420, 0x4fc9: 0x4076f620, 0x4fca: 0x4076f820, 0x4fcb: 0x4076fa20, + 0x4fcc: 0x4076fc20, 0x4fcd: 0x4076fe20, 0x4fce: 0x40770020, 0x4fcf: 0x40770220, + 0x4fd0: 0x40770420, 0x4fd1: 0x40770620, 0x4fd2: 0x40770820, 0x4fd3: 0x40770a20, + 0x4fd4: 0x40770c20, 0x4fd5: 0x40770e20, 0x4fd6: 0x40771020, 0x4fd7: 0x40771220, + 0x4fd8: 0x40771420, 0x4fd9: 0x40771620, 0x4fda: 0x40771820, 0x4fdb: 0x40771a20, + 0x4fdc: 0x40771c20, 0x4fdd: 0x40771e20, 0x4fde: 0x40772020, 0x4fdf: 0x40772220, + 0x4fe0: 0x40772420, 0x4fe1: 0x40772620, 0x4fe2: 0x40772820, 0x4fe3: 0x40772a20, + 0x4fe4: 0x40772c20, 0x4fe5: 0x40772e20, 0x4fe6: 0x40773020, 0x4fe7: 0x40773220, + 0x4fe8: 0x40773420, 0x4fe9: 0x40773620, 0x4fea: 0x40773820, 0x4feb: 0x40773a20, + 0x4fec: 0x40773c20, 0x4fed: 0x40773e20, 0x4fee: 0x40774020, 0x4fef: 0x40774220, + 0x4ff0: 0x40774420, 0x4ff1: 0x40774620, 0x4ff2: 0x40774820, 0x4ff3: 0x40774a20, + 0x4ff4: 0x40774c20, 0x4ff5: 0x40774e20, 0x4ff6: 0x40775020, 0x4ff7: 0x40775220, + 0x4ff8: 0x40775420, 0x4ff9: 0x40775620, 0x4ffa: 0x40775820, 0x4ffb: 0x40775a20, + 0x4ffc: 0x40775c20, 0x4ffd: 0x40775e20, 0x4ffe: 0x40776020, 0x4fff: 0x40776220, + // Block 0x140, offset 0x5000 + 0x5000: 0x40776420, 0x5001: 0x40776620, 0x5002: 0x40776820, 0x5003: 0x40776a20, + 0x5004: 0x40776c20, 0x5005: 0x40776e20, 0x5006: 0x40777020, 0x5007: 0x40777220, + 0x5008: 0x40777420, 0x5009: 0x40777620, 0x500a: 0x40777820, 0x500b: 0x40777a20, + 0x500c: 0x40777c20, 0x500d: 0x40777e20, 0x500e: 0x40778020, 0x500f: 0x40778220, + 0x5010: 0x40778420, 0x5011: 0x40778620, 0x5012: 0x40778820, 0x5013: 0x40778a20, + 0x5014: 0x40778c20, 0x5015: 0x40778e20, 0x5016: 0x40779020, 0x5017: 0x40779220, + 0x5018: 0x40779420, 0x5019: 0x40779620, 0x501a: 0x40779820, 0x501b: 0x40779a20, + 0x501c: 0x40779c20, 0x501d: 0x40779e20, 0x501e: 0x4077a020, 0x501f: 0x4077a220, + 0x5020: 0x4077a420, 0x5021: 0x4077a620, 0x5022: 0x4077a820, 0x5023: 0x4077aa20, + 0x5024: 0x4077ac20, 0x5025: 0x4077ae20, 0x5026: 0x4077b020, 0x5027: 0x4077b220, + 0x5028: 0x4077b420, 0x5029: 0x4077b620, 0x502a: 0x4077b820, 0x502b: 0x4077ba20, + 0x502c: 0x4077bc20, 0x502d: 0x4077be20, 0x502e: 0x4077c020, 0x502f: 0x4077c220, + 0x5030: 0x4077c420, 0x5031: 0x4077c620, 0x5032: 0x4077c820, 0x5033: 0x4077ca20, + 0x5034: 0x4077cc20, 0x5035: 0x4077ce20, 0x5036: 0x4077d020, 0x5037: 0x4077d220, + 0x5038: 0x4077d420, 0x5039: 0x4077d620, 0x503a: 0x4077d820, 0x503b: 0x4077da20, + 0x503c: 0x4077dc20, 0x503d: 0x4077de20, 0x503e: 0x4077e020, 0x503f: 0x4077e220, + // Block 0x141, offset 0x5040 + 0x5040: 0x4077e420, 0x5041: 0x4077e620, 0x5042: 0x4077e820, 0x5043: 0x4077ea20, + 0x5044: 0x4077ec20, 0x5045: 0x4077ee20, 0x5046: 0x4077f020, 0x5047: 0x4077f220, + 0x5048: 0x4077f420, 0x5049: 0x4077f620, 0x504a: 0x4077f820, 0x504b: 0x4077fa20, + 0x504c: 0x4077fc20, 0x504d: 0x4077fe20, 0x504e: 0x40780020, 0x504f: 0x40780220, + 0x5050: 0x40780420, 0x5051: 0x40780620, 0x5052: 0x40780820, 0x5053: 0x40780a20, + 0x5054: 0x40780c20, 0x5055: 0x40780e20, 0x5056: 0x40781020, 0x5057: 0x40781220, + 0x5058: 0x40781420, 0x5059: 0x40781620, 0x505a: 0x40781820, 0x505b: 0x40781a20, + 0x505c: 0x40781c20, 0x505d: 0x40781e20, 0x505e: 0x40782020, 0x505f: 0x40782220, + 0x5060: 0x40782420, 0x5061: 0x40782620, 0x5062: 0x40782820, 0x5063: 0x40782a20, + 0x5064: 0x40782c20, 0x5065: 0x40782e20, 0x5066: 0x40783020, 0x5067: 0x40783220, + 0x5068: 0x40783420, 0x5069: 0x40783620, 0x506a: 0x40783820, 0x506b: 0x40783a20, + 0x506c: 0x40783c20, 0x506d: 0x40783e20, 0x506e: 0x40784020, 0x506f: 0x40784220, + 0x5070: 0x40784420, 0x5071: 0x40784620, 0x5072: 0x40784820, 0x5073: 0x40784a20, + 0x5074: 0x40784c20, 0x5075: 0x40784e20, 0x5076: 0x40785020, 0x5077: 0x40785220, + 0x5078: 0x40785420, 0x5079: 0x40785620, 0x507a: 0x40785820, 0x507b: 0x40785a20, + 0x507c: 0x40785c20, 0x507d: 0x40785e20, 0x507e: 0x40786020, 0x507f: 0x40786220, + // Block 0x142, offset 0x5080 + 0x5080: 0x40786420, 0x5081: 0x40786620, 0x5082: 0x40786820, 0x5083: 0x40786a20, + 0x5084: 0x40786c20, 0x5085: 0x40786e20, 0x5086: 0x40787020, 0x5087: 0x40787220, + 0x5088: 0x40787420, 0x5089: 0x40787620, 0x508a: 0x40787820, 0x508b: 0x40787a20, + 0x508c: 0x40787c20, 0x508d: 0x40787e20, 0x508e: 0x40788020, 0x508f: 0x40788220, + 0x5090: 0x40788420, 0x5091: 0x40788620, 0x5092: 0x40788820, 0x5093: 0x40788a20, + 0x5094: 0x40788c20, 0x5095: 0x40788e20, 0x5096: 0x40789020, 0x5097: 0x40789220, + 0x5098: 0x40789420, 0x5099: 0x40789620, 0x509a: 0x40789820, 0x509b: 0x40789a20, + 0x509c: 0x40789c20, 0x509d: 0x40789e20, 0x509e: 0x4078a020, 0x509f: 0x4078a220, + 0x50a0: 0x4078a420, 0x50a1: 0x4078a620, 0x50a2: 0x4078a820, 0x50a3: 0x4078aa20, + 0x50a4: 0x4078ac20, 0x50a5: 0x4078ae20, 0x50a6: 0x4078b020, 0x50a7: 0x4078b220, + 0x50a8: 0x4078b420, 0x50a9: 0x4078b620, 0x50aa: 0x4078b820, 0x50ab: 0x4078ba20, + 0x50ac: 0x4078bc20, 0x50ad: 0x4078be20, 0x50ae: 0x4078c020, 0x50af: 0x4078c220, + 0x50b0: 0x4078c420, 0x50b1: 0x4078c620, 0x50b2: 0x4078c820, 0x50b3: 0x4078ca20, + 0x50b4: 0x4078cc20, 0x50b5: 0x4078ce20, 0x50b6: 0x4078d020, 0x50b7: 0x4078d220, + 0x50b8: 0x4078d420, 0x50b9: 0x4078d620, 0x50ba: 0x4078d820, 0x50bb: 0x4078da20, + 0x50bc: 0x4078dc20, 0x50bd: 0x4078de20, 0x50be: 0x4078e020, 0x50bf: 0x4078e220, + // Block 0x143, offset 0x50c0 + 0x50c0: 0x4078e420, 0x50c1: 0x4078e620, 0x50c2: 0x4078e820, 0x50c3: 0x4078ea20, + 0x50c4: 0x4078ec20, 0x50c5: 0x4078ee20, 0x50c6: 0x4078f020, 0x50c7: 0x4078f220, + 0x50c8: 0x4078f420, 0x50c9: 0x4078f620, 0x50ca: 0x4078f820, 0x50cb: 0x4078fa20, + 0x50cc: 0x4078fc20, 0x50cd: 0x4078fe20, 0x50ce: 0x40790020, 0x50cf: 0x40790220, + 0x50d0: 0x40790420, 0x50d1: 0x40790620, 0x50d2: 0x40790820, 0x50d3: 0x40790a20, + 0x50d4: 0x40790c20, 0x50d5: 0x40790e20, 0x50d6: 0x40791020, 0x50d7: 0x40791220, + 0x50d8: 0x40791420, 0x50d9: 0x40791620, 0x50da: 0x40791820, 0x50db: 0x40791a20, + 0x50dc: 0x40791c20, 0x50dd: 0x40791e20, 0x50de: 0x40792020, 0x50df: 0x40792220, + 0x50e0: 0x40792420, 0x50e1: 0x40792620, 0x50e2: 0x40792820, 0x50e3: 0x40792a20, + 0x50e4: 0x40792c20, 0x50e5: 0x40792e20, 0x50e6: 0x40793020, 0x50e7: 0x40793220, + 0x50e8: 0x40793420, 0x50e9: 0x40793620, 0x50ea: 0x40793820, 0x50eb: 0x40793a20, + 0x50ec: 0x40793c20, 0x50ed: 0x40793e20, 0x50ee: 0x40794020, 0x50ef: 0x40794220, + 0x50f0: 0x40794420, 0x50f1: 0x40794620, 0x50f2: 0x40794820, 0x50f3: 0x40794a20, + 0x50f4: 0x40794c20, 0x50f5: 0x40794e20, 0x50f6: 0x40795020, 0x50f7: 0x40795220, + 0x50f8: 0x40795420, 0x50f9: 0x40795620, 0x50fa: 0x40795820, 0x50fb: 0x40795a20, + 0x50fc: 0x40795c20, 0x50fd: 0x40795e20, 0x50fe: 0x40796020, 0x50ff: 0x40796220, + // Block 0x144, offset 0x5100 + 0x5100: 0x40796420, 0x5101: 0x40796620, 0x5102: 0x40796820, 0x5103: 0x40796a20, + 0x5104: 0x40796c20, 0x5105: 0x40796e20, 0x5106: 0x40797020, 0x5107: 0x40797220, + 0x5108: 0x40797420, 0x5109: 0x40797620, 0x510a: 0x40797820, 0x510b: 0x40797a20, + 0x510c: 0x40797c20, 0x510d: 0x40797e20, 0x510e: 0x40798020, 0x510f: 0x40798220, + 0x5110: 0x40798420, 0x5111: 0x40798620, 0x5112: 0x40798820, 0x5113: 0x40798a20, + 0x5114: 0x40798c20, 0x5115: 0x40798e20, 0x5116: 0x40799020, 0x5117: 0x40799220, + 0x5118: 0x40799420, 0x5119: 0x40799620, 0x511a: 0x40799820, 0x511b: 0x40799a20, + 0x511c: 0x40799c20, 0x511d: 0x40799e20, 0x511e: 0x4079a020, 0x511f: 0x4079a220, + 0x5120: 0x4079a420, 0x5121: 0x4079a620, 0x5122: 0x4079a820, 0x5123: 0x4079aa20, + 0x5124: 0x4079ac20, 0x5125: 0x4079ae20, 0x5126: 0x4079b020, 0x5127: 0x4079b220, + 0x5128: 0x4079b420, 0x5129: 0x4079b620, 0x512a: 0x4079b820, 0x512b: 0x4079ba20, + 0x512c: 0x4079bc20, 0x512d: 0x4079be20, 0x512e: 0x4079c020, 0x512f: 0x4079c220, + 0x5130: 0x4079c420, 0x5131: 0x4079c620, 0x5132: 0x4079c820, 0x5133: 0x4079ca20, + 0x5134: 0x4079cc20, 0x5135: 0x4079ce20, 0x5136: 0x4079d020, 0x5137: 0x4079d220, + 0x5138: 0x4079d420, 0x5139: 0x4079d620, 0x513a: 0x4079d820, 0x513b: 0x4079da20, + 0x513c: 0x4079dc20, 0x513d: 0x4079de20, 0x513e: 0x4079e020, 0x513f: 0x4079e220, + // Block 0x145, offset 0x5140 + 0x5140: 0x4079e420, 0x5141: 0x4079e620, 0x5142: 0x4079e820, 0x5143: 0x4079ea20, + 0x5144: 0x4079ec20, 0x5145: 0x4079ee20, 0x5146: 0x4079f020, 0x5147: 0x4079f220, + 0x5148: 0x4079f420, 0x5149: 0x4079f620, 0x514a: 0x4079f820, 0x514b: 0x4079fa20, + 0x514c: 0x4079fc20, 0x514d: 0x4079fe20, 0x514e: 0x407a0020, 0x514f: 0x407a0220, + 0x5150: 0x407a0420, 0x5151: 0x407a0620, 0x5152: 0x407a0820, 0x5153: 0x407a0a20, + 0x5154: 0x407a0c20, 0x5155: 0x407a0e20, 0x5156: 0x407a1020, 0x5157: 0x407a1220, + 0x5158: 0x407a1420, 0x5159: 0x407a1620, 0x515a: 0x407a1820, 0x515b: 0x407a1a20, + 0x515c: 0x407a1c20, 0x515d: 0x407a1e20, 0x515e: 0x407a2020, 0x515f: 0x407a2220, + 0x5160: 0x407a2420, 0x5161: 0x407a2620, 0x5162: 0x407a2820, 0x5163: 0x407a2a20, + 0x5164: 0x407a2c20, 0x5165: 0x407a2e20, 0x5166: 0x407a3020, 0x5167: 0x407a3220, + 0x5168: 0x407a3420, 0x5169: 0x407a3620, 0x516a: 0x407a3820, 0x516b: 0x407a3a20, + 0x516c: 0x407a3c20, 0x516d: 0x407a3e20, 0x516e: 0x407a4020, 0x516f: 0x407a4220, + 0x5170: 0x407a4420, 0x5171: 0x407a4620, 0x5172: 0x407a4820, 0x5173: 0x407a4a20, + 0x5174: 0x407a4c20, 0x5175: 0x407a4e20, 0x5176: 0x407a5020, 0x5177: 0x407a5220, + 0x5178: 0x407a5420, 0x5179: 0x407a5620, 0x517a: 0x407a5820, 0x517b: 0x407a5a20, + 0x517c: 0x407a5c20, 0x517d: 0x407a5e20, 0x517e: 0x407a6020, 0x517f: 0x407a6220, + // Block 0x146, offset 0x5180 + 0x5180: 0x407a6420, 0x5181: 0x407a6620, 0x5182: 0x407a6820, 0x5183: 0x407a6a20, + 0x5184: 0x407a6c20, 0x5185: 0x407a6e20, 0x5186: 0x407a7020, 0x5187: 0x407a7220, + 0x5188: 0x407a7420, 0x5189: 0x407a7620, 0x518a: 0x407a7820, 0x518b: 0x407a7a20, + 0x518c: 0x407a7c20, 0x518d: 0x407a7e20, 0x518e: 0x407a8020, 0x518f: 0x407a8220, + 0x5190: 0x407a8420, 0x5191: 0x407a8620, 0x5192: 0x407a8820, 0x5193: 0x407a8a20, + 0x5194: 0x407a8c20, 0x5195: 0x407a8e20, 0x5196: 0x407a9020, 0x5197: 0x407a9220, + 0x5198: 0x407a9420, 0x5199: 0x407a9620, 0x519a: 0x407a9820, 0x519b: 0x407a9a20, + 0x519c: 0x407a9c20, 0x519d: 0x407a9e20, 0x519e: 0x407aa020, 0x519f: 0x407aa220, + 0x51a0: 0x407aa420, 0x51a1: 0x407aa620, 0x51a2: 0x407aa820, 0x51a3: 0x407aaa20, + 0x51a4: 0x407aac20, 0x51a5: 0x407aae20, 0x51a6: 0x407ab020, 0x51a7: 0x407ab220, + 0x51a8: 0x407ab420, 0x51a9: 0x407ab620, 0x51aa: 0x407ab820, 0x51ab: 0x407aba20, + 0x51ac: 0x407abc20, 0x51ad: 0x407abe20, 0x51ae: 0x407ac020, 0x51af: 0x407ac220, + 0x51b0: 0x407ac420, 0x51b1: 0x407ac620, 0x51b2: 0x407ac820, 0x51b3: 0x407aca20, + 0x51b4: 0x407acc20, 0x51b5: 0x407ace20, 0x51b6: 0x407ad020, 0x51b7: 0x407ad220, + 0x51b8: 0x407ad420, 0x51b9: 0x407ad620, 0x51ba: 0x407ad820, 0x51bb: 0x407ada20, + 0x51bc: 0x407adc20, 0x51bd: 0x407ade20, 0x51be: 0x407ae020, 0x51bf: 0x407ae220, + // Block 0x147, offset 0x51c0 + 0x51c0: 0x407ae420, 0x51c1: 0x407ae620, 0x51c2: 0x407ae820, 0x51c3: 0x407aea20, + 0x51c4: 0x407aec20, 0x51c5: 0x407aee20, 0x51c6: 0x407af020, 0x51c7: 0x407af220, + 0x51c8: 0x407af420, 0x51c9: 0x407af620, 0x51ca: 0x407af820, 0x51cb: 0x407afa20, + 0x51cc: 0x407afc20, 0x51cd: 0x407afe20, 0x51ce: 0x407b0020, 0x51cf: 0x407b0220, + 0x51d0: 0x407b0420, 0x51d1: 0x407b0620, 0x51d2: 0x407b0820, 0x51d3: 0x407b0a20, + 0x51d4: 0x407b0c20, 0x51d5: 0x407b0e20, 0x51d6: 0x407b1020, 0x51d7: 0x407b1220, + 0x51d8: 0x407b1420, 0x51d9: 0x407b1620, 0x51da: 0x407b1820, 0x51db: 0x407b1a20, + 0x51dc: 0x407b1c20, 0x51dd: 0x407b1e20, 0x51de: 0x407b2020, 0x51df: 0x407b2220, + 0x51e0: 0x407b2420, 0x51e1: 0x407b2620, 0x51e2: 0x407b2820, 0x51e3: 0x407b2a20, + 0x51e4: 0x407b2c20, 0x51e5: 0x407b2e20, 0x51e6: 0x407b3020, 0x51e7: 0x407b3220, + 0x51e8: 0x407b3420, 0x51e9: 0x407b3620, 0x51ea: 0x407b3820, 0x51eb: 0x407b3a20, + 0x51ec: 0x407b3c20, 0x51ed: 0x407b3e20, 0x51ee: 0x407b4020, 0x51ef: 0x407b4220, + 0x51f0: 0x407b4420, 0x51f1: 0x407b4620, 0x51f2: 0x407b4820, 0x51f3: 0x407b4a20, + 0x51f4: 0x407b4c20, 0x51f5: 0x407b4e20, 0x51f6: 0x407b5020, 0x51f7: 0x407b5220, + 0x51f8: 0x407b5420, 0x51f9: 0x407b5620, 0x51fa: 0x407b5820, 0x51fb: 0x407b5a20, + 0x51fc: 0x407b5c20, 0x51fd: 0x407b5e20, 0x51fe: 0x407b6020, 0x51ff: 0x407b6220, + // Block 0x148, offset 0x5200 + 0x5200: 0x407b6420, 0x5201: 0x407b6620, 0x5202: 0x407b6820, 0x5203: 0x407b6a20, + 0x5204: 0x407b6c20, 0x5205: 0x407b6e20, 0x5206: 0x407b7020, 0x5207: 0x407b7220, + 0x5208: 0x407b7420, 0x5209: 0x407b7620, 0x520a: 0x407b7820, 0x520b: 0x407b7a20, + 0x520c: 0x407b7c20, 0x520d: 0x407b7e20, 0x520e: 0x407b8020, 0x520f: 0x407b8220, + 0x5210: 0x407b8420, 0x5211: 0x407b8620, 0x5212: 0x407b8820, 0x5213: 0x407b8a20, + 0x5214: 0x407b8c20, 0x5215: 0x407b8e20, 0x5216: 0x407b9020, 0x5217: 0x407b9220, + 0x5218: 0x407b9420, 0x5219: 0x407b9620, 0x521a: 0x407b9820, 0x521b: 0x407b9a20, + 0x521c: 0x407b9c20, 0x521d: 0x407b9e20, 0x521e: 0x407ba020, 0x521f: 0x407ba220, + 0x5220: 0x407ba420, 0x5221: 0x407ba620, 0x5222: 0x407ba820, 0x5223: 0x407baa20, + 0x5224: 0x407bac20, 0x5225: 0x407bae20, 0x5226: 0x407bb020, 0x5227: 0x407bb220, + 0x5228: 0x407bb420, 0x5229: 0x407bb620, 0x522a: 0x407bb820, 0x522b: 0x407bba20, + 0x522c: 0x407bbc20, 0x522d: 0x407bbe20, 0x522e: 0x407bc020, 0x522f: 0x407bc220, + 0x5230: 0x407bc420, 0x5231: 0x407bc620, 0x5232: 0x407bc820, 0x5233: 0x407bca20, + 0x5234: 0x407bcc20, 0x5235: 0x407bce20, 0x5236: 0x407bd020, 0x5237: 0x407bd220, + 0x5238: 0x407bd420, 0x5239: 0x407bd620, 0x523a: 0x407bd820, 0x523b: 0x407bda20, + 0x523c: 0x407bdc20, 0x523d: 0x407bde20, 0x523e: 0x407be020, 0x523f: 0x407be220, + // Block 0x149, offset 0x5240 + 0x5240: 0x407be420, 0x5241: 0x407be620, 0x5242: 0x407be820, 0x5243: 0x407bea20, + 0x5244: 0x407bec20, 0x5245: 0x407bee20, 0x5246: 0x407bf020, 0x5247: 0x407bf220, + 0x5248: 0x407bf420, 0x5249: 0x407bf620, 0x524a: 0x407bf820, 0x524b: 0x407bfa20, + 0x524c: 0x407bfc20, 0x524d: 0x407bfe20, 0x524e: 0x407c0020, 0x524f: 0x407c0220, + 0x5250: 0x407c0420, 0x5251: 0x407c0620, 0x5252: 0x407c0820, 0x5253: 0x407c0a20, + 0x5254: 0x407c0c20, 0x5255: 0x407c0e20, 0x5256: 0x407c1020, 0x5257: 0x407c1220, + 0x5258: 0x407c1420, 0x5259: 0x407c1620, 0x525a: 0x407c1820, 0x525b: 0x407c1a20, + 0x525c: 0x407c1c20, 0x525d: 0x407c1e20, 0x525e: 0x407c2020, 0x525f: 0x407c2220, + 0x5260: 0x407c2420, 0x5261: 0x407c2620, 0x5262: 0x407c2820, 0x5263: 0x407c2a20, + 0x5264: 0x407c2c20, 0x5265: 0x407c2e20, 0x5266: 0x407c3020, 0x5267: 0x407c3220, + 0x5268: 0x407c3420, 0x5269: 0x407c3620, 0x526a: 0x407c3820, 0x526b: 0x407c3a20, + 0x526c: 0x407c3c20, 0x526d: 0x407c3e20, 0x526e: 0x407c4020, 0x526f: 0x407c4220, + 0x5270: 0x407c4420, 0x5271: 0x407c4620, 0x5272: 0x407c4820, 0x5273: 0x407c4a20, + 0x5274: 0x407c4c20, 0x5275: 0x407c4e20, 0x5276: 0x407c5020, 0x5277: 0x407c5220, + 0x5278: 0x407c5420, 0x5279: 0x407c5620, 0x527a: 0x407c5820, 0x527b: 0x407c5a20, + 0x527c: 0x407c5c20, 0x527d: 0x407c5e20, 0x527e: 0x407c6020, 0x527f: 0x407c6220, + // Block 0x14a, offset 0x5280 + 0x5280: 0x407c6420, 0x5281: 0x407c6620, 0x5282: 0x407c6820, 0x5283: 0x407c6a20, + 0x5284: 0x407c6c20, 0x5285: 0x407c6e20, 0x5286: 0x407c7020, 0x5287: 0x407c7220, + 0x5288: 0x407c7420, 0x5289: 0x407c7620, 0x528a: 0x407c7820, 0x528b: 0x407c7a20, + 0x528c: 0x407c7c20, 0x528d: 0x407c7e20, 0x528e: 0x407c8020, 0x528f: 0x407c8220, + 0x5290: 0x407c8420, 0x5291: 0x407c8620, 0x5292: 0x407c8820, 0x5293: 0x407c8a20, + 0x5294: 0x407c8c20, 0x5295: 0x407c8e20, 0x5296: 0x407c9020, 0x5297: 0x407c9220, + 0x5298: 0x407c9420, 0x5299: 0x407c9620, 0x529a: 0x407c9820, 0x529b: 0x407c9a20, + 0x529c: 0x407c9c20, 0x529d: 0x407c9e20, 0x529e: 0x407ca020, 0x529f: 0x407ca220, + 0x52a0: 0x407ca420, 0x52a1: 0x407ca620, 0x52a2: 0x407ca820, 0x52a3: 0x407caa20, + 0x52a4: 0x407cac20, 0x52a5: 0x407cae20, 0x52a6: 0x407cb020, 0x52a7: 0x407cb220, + 0x52a8: 0x407cb420, 0x52a9: 0x407cb620, 0x52aa: 0x407cb820, 0x52ab: 0x407cba20, + 0x52ac: 0x407cbc20, 0x52ad: 0x407cbe20, 0x52ae: 0x407cc020, 0x52af: 0x407cc220, + 0x52b0: 0x407cc420, 0x52b1: 0x407cc620, 0x52b2: 0x407cc820, 0x52b3: 0x407cca20, + 0x52b4: 0x407ccc20, 0x52b5: 0x407cce20, 0x52b6: 0x407cd020, 0x52b7: 0x407cd220, + 0x52b8: 0x407cd420, 0x52b9: 0x407cd620, 0x52ba: 0x407cd820, 0x52bb: 0x407cda20, + 0x52bc: 0x407cdc20, 0x52bd: 0x407cde20, 0x52be: 0x407ce020, 0x52bf: 0x407ce220, + // Block 0x14b, offset 0x52c0 + 0x52c0: 0x407ce420, 0x52c1: 0x407ce620, 0x52c2: 0x407ce820, 0x52c3: 0x407cea20, + 0x52c4: 0x407cec20, 0x52c5: 0x407cee20, 0x52c6: 0x407cf020, 0x52c7: 0x407cf220, + 0x52c8: 0x407cf420, 0x52c9: 0x407cf620, 0x52ca: 0x407cf820, 0x52cb: 0x407cfa20, + 0x52cc: 0x407cfc20, 0x52cd: 0x407cfe20, 0x52ce: 0x407d0020, 0x52cf: 0x407d0220, + 0x52d0: 0x407d0420, 0x52d1: 0x407d0620, 0x52d2: 0x407d0820, 0x52d3: 0x407d0a20, + 0x52d4: 0x407d0c20, 0x52d5: 0x407d0e20, 0x52d6: 0x407d1020, 0x52d7: 0x407d1220, + 0x52d8: 0x407d1420, 0x52d9: 0x407d1620, 0x52da: 0x407d1820, 0x52db: 0x407d1a20, + 0x52dc: 0x407d1c20, 0x52dd: 0x407d1e20, 0x52de: 0x407d2020, 0x52df: 0x407d2220, + 0x52e0: 0x407d2420, 0x52e1: 0x407d2620, 0x52e2: 0x407d2820, 0x52e3: 0x407d2a20, + 0x52e4: 0x407d2c20, 0x52e5: 0x407d2e20, 0x52e6: 0x407d3020, 0x52e7: 0x407d3220, + 0x52e8: 0x407d3420, 0x52e9: 0x407d3620, 0x52ea: 0x407d3820, 0x52eb: 0x407d3a20, + 0x52ec: 0x407d3c20, 0x52ed: 0x407d3e20, 0x52ee: 0x407d4020, 0x52ef: 0x407d4220, + 0x52f0: 0x407d4420, 0x52f1: 0x407d4620, 0x52f2: 0x407d4820, 0x52f3: 0x407d4a20, + 0x52f4: 0x407d4c20, 0x52f5: 0x407d4e20, 0x52f6: 0x407d5020, 0x52f7: 0x407d5220, + 0x52f8: 0x407d5420, 0x52f9: 0x407d5620, 0x52fa: 0x407d5820, 0x52fb: 0x407d5a20, + 0x52fc: 0x407d5c20, 0x52fd: 0x407d5e20, 0x52fe: 0x407d6020, 0x52ff: 0x407d6220, + // Block 0x14c, offset 0x5300 + 0x5300: 0x407d6420, 0x5301: 0x407d6620, 0x5302: 0x407d6820, 0x5303: 0x407d6a20, + 0x5304: 0x407d6c20, 0x5305: 0x407d6e20, 0x5306: 0x407d7020, 0x5307: 0x407d7220, + 0x5308: 0x407d7420, 0x5309: 0x407d7620, 0x530a: 0x407d7820, 0x530b: 0x407d7a20, + 0x530c: 0x407d7c20, 0x530d: 0x407d7e20, 0x530e: 0x407d8020, 0x530f: 0x407d8220, + 0x5310: 0x407d8420, 0x5311: 0x407d8620, 0x5312: 0x407d8820, 0x5313: 0x407d8a20, + 0x5314: 0x407d8c20, 0x5315: 0x407d8e20, 0x5316: 0x407d9020, 0x5317: 0x407d9220, + 0x5318: 0x407d9420, 0x5319: 0x407d9620, 0x531a: 0x407d9820, 0x531b: 0x407d9a20, + 0x531c: 0x407d9c20, 0x531d: 0x407d9e20, 0x531e: 0x407da020, 0x531f: 0x407da220, + 0x5320: 0x407da420, 0x5321: 0x407da620, 0x5322: 0x407da820, 0x5323: 0x407daa20, + 0x5324: 0x407dac20, 0x5325: 0x407dae20, 0x5326: 0x407db020, 0x5327: 0x407db220, + 0x5328: 0x407db420, 0x5329: 0x407db620, 0x532a: 0x407db820, 0x532b: 0x407dba20, + 0x532c: 0x407dbc20, 0x532d: 0x407dbe20, 0x532e: 0x407dc020, + // Block 0x14d, offset 0x5340 + 0x5340: 0xe0000394, 0x5341: 0xe000045f, 0x5342: 0xe0000534, 0x5343: 0xe0000610, + 0x5344: 0xe00006cc, 0x5345: 0xe0000771, 0x5346: 0xe000081d, 0x5347: 0xe00008c2, + 0x5348: 0xe0000462, 0x5349: 0xe0000537, 0x534a: 0xe0000613, 0x534b: 0xe00006cf, + 0x534c: 0xe0000774, 0x534d: 0xe0000820, 0x534e: 0xe00008c5, 0x534f: 0xe000053a, + 0x5350: 0xe0000616, 0x5351: 0xe00006d2, 0x5352: 0xe0000777, 0x5353: 0xe0000823, + 0x5354: 0xe00008c8, 0x5355: 0xe000027f, 0x5356: 0xe0000397, 0x5357: 0xe0000465, + 0x5358: 0xe000053d, 0x5359: 0xe0000619, 0x535a: 0xe00006d5, 0x535b: 0xe000077a, + 0x535c: 0xe0000826, 0x535d: 0xe00008cb, 0x535e: 0xe0000282, 0x535f: 0xe000039a, + 0x5360: 0xe0000468, 0x5361: 0xe0000540, 0x5362: 0xe000061c, 0x5363: 0xe000039d, + 0x5364: 0xe000046b, 0x5365: 0xe000046e, 0x5366: 0xe0000543, 0x5367: 0xe000061f, + 0x5368: 0xe00006d8, 0x5369: 0xe000077d, 0x536a: 0xe0000829, 0x536b: 0xe00008ce, + 0x536c: 0xe0000285, 0x536d: 0xe00003a0, 0x536e: 0xe0000471, 0x536f: 0xe0000474, + 0x5370: 0xe0000546, 0x5371: 0xe0000622, 0x5372: 0x4029a020, 0x5373: 0x4029a220, + 0x5374: 0xe0000288, 0x5375: 0xe00003a3, 0x5376: 0xe0000477, 0x5377: 0xe000047a, + 0x5378: 0xe0000549, 0x5379: 0xe0000625, 0x537a: 0xe000047d, 0x537b: 0xe0000480, + 0x537c: 0xe000054c, 0x537d: 0xe000054f, 0x537e: 0xe0000552, 0x537f: 0xe0000555, + // Block 0x14e, offset 0x5380 + 0x5380: 0xe00006db, 0x5381: 0xe0000780, 0x5382: 0xe0000783, 0x5383: 0xe0000786, + 0x5384: 0xe000082c, 0x5385: 0xe000082f, 0x5386: 0xe00008d1, 0x5387: 0xe00008d4, + 0x5388: 0xe00008d7, 0x5389: 0xe00008da, 0x538a: 0xe00003a6, 0x538b: 0xe0000483, + 0x538c: 0xe0000558, 0x538d: 0xe0000628, 0x538e: 0xe00006de, 0x538f: 0xe000028b, + 0x5390: 0xe00003a9, 0x5391: 0xe0000486, 0x5392: 0xe000055b, 0x5393: 0xe000055e, + 0x5394: 0xe000062b, 0x5395: 0xe000062e, 0x5396: 0x4029a420, 0x5397: 0x4029a620, + 0x5398: 0xe000028e, 0x5399: 0xe00003ac, 0x539a: 0x4029a820, 0x539b: 0x4029aa20, + 0x539c: 0x4029ac20, 0x539d: 0x4029ae20, 0x539e: 0x4029b020, 0x539f: 0x4029b220, + 0x53a0: 0x4029b420, 0x53a1: 0x4029b620, 0x53a2: 0x4029b820, + 0x53b0: 0x4003ca20, 0x53b1: 0x4003cc20, 0x53b2: 0x4003ce20, 0x53b3: 0x4003d020, + // Block 0x14f, offset 0x53c0 + 0x53c0: 0x407dc220, 0x53c1: 0x407dc420, 0x53c2: 0x407dc620, 0x53c3: 0x407dc820, + 0x53c4: 0x407dca20, 0x53c5: 0x407dcc20, 0x53c6: 0x407dce20, 0x53c7: 0x407dd020, + 0x53c8: 0x407dd220, 0x53c9: 0x407dd420, 0x53ca: 0x407dd620, 0x53cb: 0x407dd820, + 0x53cc: 0x407dda20, 0x53cd: 0x407ddc20, 0x53ce: 0x407dde20, 0x53cf: 0x407de020, + 0x53d0: 0x407de220, 0x53d1: 0x407de420, 0x53d2: 0x407de620, 0x53d3: 0x407de820, + 0x53d4: 0x407dea20, 0x53d5: 0x407dec20, 0x53d6: 0x407dee20, 0x53d7: 0x407df020, + 0x53d8: 0x407df220, 0x53d9: 0x407df420, 0x53da: 0x407df620, 0x53db: 0x407df820, + 0x53dc: 0x407dfa20, 0x53dd: 0x407dfc20, 0x53de: 0x407dfe20, 0x53df: 0x407e0020, + 0x53e0: 0x407e0220, 0x53e1: 0x407e0420, 0x53e2: 0x407e0620, 0x53e3: 0x407e0820, + 0x53e4: 0x407e0a20, 0x53e5: 0x407e0c20, 0x53e6: 0x407e0e20, 0x53e7: 0x407e1020, + 0x53e8: 0x407e1220, 0x53e9: 0x407e1420, 0x53ea: 0x407e1620, 0x53eb: 0x407e1820, + 0x53ec: 0x407e1a20, 0x53ed: 0x407e1c20, 0x53ee: 0x407e1e20, 0x53ef: 0x407e2020, + 0x53f0: 0x407e2220, 0x53f1: 0x407e2420, 0x53f2: 0x407e2620, 0x53f3: 0x407e2820, + 0x53f4: 0x407e2a20, 0x53f5: 0x407e2c20, 0x53f6: 0x407e2e20, 0x53f7: 0x407e3020, + 0x53f8: 0x407e3220, 0x53f9: 0x407e3420, 0x53fa: 0x407e3620, 0x53fb: 0x407e3820, + 0x53fc: 0x407e3a20, 0x53fd: 0x407e3c20, 0x53fe: 0x407e3e20, 0x53ff: 0x407e4020, + // Block 0x150, offset 0x5400 + 0x5400: 0x407e4220, 0x5401: 0x407e4420, 0x5402: 0x407e4620, 0x5403: 0x407e4820, + 0x5404: 0x407e4a20, 0x5405: 0x407e4c20, 0x5406: 0x407e4e20, 0x5407: 0x407e5020, + 0x5408: 0x407e5220, 0x5409: 0x407e5420, 0x540a: 0x407e5620, 0x540b: 0x407e5820, + 0x540c: 0x407e5a20, 0x540d: 0x407e5c20, 0x540e: 0x407e5e20, 0x540f: 0x407e6020, + 0x5410: 0x407e6220, 0x5411: 0x407e6420, 0x5412: 0x407e6620, 0x5413: 0x407e6820, + 0x5414: 0x407e6a20, 0x5415: 0x407e6c20, 0x5416: 0x407e6e20, 0x5417: 0x407e7020, + 0x5418: 0x407e7220, 0x5419: 0x407e7420, 0x541a: 0x407e7620, 0x541b: 0x407e7820, + 0x541c: 0x407e7a20, 0x541d: 0x407e7c20, 0x541e: 0x407e7e20, 0x541f: 0x407e8020, + 0x5420: 0x407e8220, 0x5421: 0x407e8420, 0x5422: 0x407e8620, 0x5423: 0x407e8820, + 0x5424: 0x407e8a20, 0x5425: 0x407e8c20, 0x5426: 0x407e8e20, 0x5427: 0x407e9020, + 0x5428: 0x407e9220, 0x5429: 0x407e9420, 0x542a: 0x407e9620, 0x542b: 0x407e9820, + 0x542c: 0x407e9a20, 0x542d: 0x407e9c20, 0x542e: 0x407e9e20, 0x542f: 0x407ea020, + 0x5430: 0x407ea220, 0x5431: 0x407ea420, 0x5432: 0x407ea620, 0x5433: 0x407ea820, + 0x5434: 0x407eaa20, 0x5435: 0x407eac20, 0x5436: 0x407eae20, 0x5437: 0x407eb020, + 0x5438: 0x407eb220, 0x5439: 0x407eb420, 0x543a: 0x407eb620, 0x543b: 0x407eb820, + 0x543c: 0x407eba20, 0x543d: 0x407ebc20, 0x543e: 0x407ebe20, 0x543f: 0x407ec020, + // Block 0x151, offset 0x5440 + 0x5440: 0x407ec220, 0x5441: 0x407ec420, 0x5442: 0x407ec620, 0x5443: 0x407ec820, + 0x5444: 0x407eca20, 0x5445: 0x407ecc20, 0x5446: 0x407ece20, 0x5447: 0x407ed020, + 0x5448: 0x407ed220, 0x5449: 0x407ed420, 0x544a: 0x407ed620, 0x544b: 0x407ed820, + 0x544c: 0x407eda20, 0x544d: 0x407edc20, 0x544e: 0x407ede20, 0x544f: 0x407ee020, + 0x5450: 0x407ee220, 0x5451: 0x407ee420, 0x5452: 0x407ee620, 0x5453: 0x407ee820, + 0x5454: 0x407eea20, 0x5455: 0x407eec20, 0x5456: 0x407eee20, 0x5457: 0x407ef020, + 0x5458: 0x407ef220, 0x5459: 0x407ef420, 0x545a: 0x407ef620, 0x545b: 0x407ef820, + 0x545c: 0x407efa20, 0x545d: 0x407efc20, 0x545e: 0x407efe20, 0x545f: 0x407f0020, + 0x5460: 0x407f0220, 0x5461: 0x407f0420, 0x5462: 0x407f0620, 0x5463: 0x407f0820, + 0x5464: 0x407f0a20, 0x5465: 0x407f0c20, 0x5466: 0x407f0e20, 0x5467: 0x407f1020, + 0x5468: 0x407f1220, 0x5469: 0x407f1420, 0x546a: 0x407f1620, 0x546b: 0x407f1820, + 0x546c: 0x407f1a20, 0x546d: 0x407f1c20, 0x546e: 0x407f1e20, 0x546f: 0x407f2020, + 0x5470: 0x407f2220, 0x5471: 0x407f2420, 0x5472: 0x407f2620, 0x5473: 0x407f2820, + 0x5474: 0x407f2a20, 0x5475: 0x407f2c20, 0x5476: 0x407f2e20, 0x5477: 0x407f3020, + 0x5478: 0x407f3220, 0x5479: 0x407f3420, 0x547a: 0x407f3620, 0x547b: 0x407f3820, + 0x547c: 0x407f3a20, 0x547d: 0x407f3c20, 0x547e: 0x407f3e20, 0x547f: 0x407f4020, + // Block 0x152, offset 0x5480 + 0x5480: 0x407f4220, 0x5481: 0x407f4420, 0x5482: 0x407f4620, 0x5483: 0x407f4820, + 0x5484: 0x407f4a20, 0x5485: 0x407f4c20, 0x5486: 0x407f4e20, 0x5487: 0x407f5020, + 0x5488: 0x407f5220, 0x5489: 0x407f5420, 0x548a: 0x407f5620, 0x548b: 0x407f5820, + 0x548c: 0x407f5a20, 0x548d: 0x407f5c20, 0x548e: 0x407f5e20, 0x548f: 0x407f6020, + 0x5490: 0x407f6220, 0x5491: 0x407f6420, 0x5492: 0x407f6620, 0x5493: 0x407f6820, + 0x5494: 0x407f6a20, 0x5495: 0x407f6c20, 0x5496: 0x407f6e20, 0x5497: 0x407f7020, + 0x5498: 0x407f7220, 0x5499: 0x407f7420, 0x549a: 0x407f7620, 0x549b: 0x407f7820, + 0x549c: 0x407f7a20, 0x549d: 0x407f7c20, 0x549e: 0x407f7e20, 0x549f: 0x407f8020, + 0x54a0: 0x407f8220, 0x54a1: 0x407f8420, 0x54a2: 0x407f8620, 0x54a3: 0x407f8820, + 0x54a4: 0x407f8a20, 0x54a5: 0x407f8c20, 0x54a6: 0x407f8e20, 0x54a7: 0x407f9020, + 0x54a8: 0x407f9220, 0x54a9: 0x407f9420, 0x54aa: 0x407f9620, 0x54ab: 0x407f9820, + 0x54ac: 0x407f9a20, 0x54ad: 0x407f9c20, 0x54ae: 0x407f9e20, 0x54af: 0x407fa020, + 0x54b0: 0x407fa220, 0x54b1: 0x407fa420, 0x54b2: 0x407fa620, 0x54b3: 0x407fa820, + 0x54b4: 0x407faa20, 0x54b5: 0x407fac20, 0x54b6: 0x407fae20, 0x54b7: 0x407fb020, + 0x54b8: 0x407fb220, 0x54b9: 0x407fb420, 0x54ba: 0x407fb620, 0x54bb: 0x407fb820, + 0x54bc: 0x407fba20, 0x54bd: 0x407fbc20, 0x54be: 0x407fbe20, 0x54bf: 0x407fc020, + // Block 0x153, offset 0x54c0 + 0x54c0: 0x407fc220, 0x54c1: 0x407fc420, 0x54c2: 0x407fc620, 0x54c3: 0x407fc820, + 0x54c4: 0x407fca20, 0x54c5: 0x407fcc20, 0x54c6: 0x407fce20, 0x54c7: 0x407fd020, + 0x54c8: 0x407fd220, 0x54c9: 0x407fd420, 0x54ca: 0x407fd620, 0x54cb: 0x407fd820, + 0x54cc: 0x407fda20, 0x54cd: 0x407fdc20, 0x54ce: 0x407fde20, 0x54cf: 0x407fe020, + 0x54d0: 0x407fe220, 0x54d1: 0x407fe420, 0x54d2: 0x407fe620, 0x54d3: 0x407fe820, + 0x54d4: 0x407fea20, 0x54d5: 0x407fec20, 0x54d6: 0x407fee20, 0x54d7: 0x407ff020, + 0x54d8: 0x407ff220, 0x54d9: 0x407ff420, 0x54da: 0x407ff620, 0x54db: 0x407ff820, + 0x54dc: 0x407ffa20, 0x54dd: 0x407ffc20, 0x54de: 0x407ffe20, 0x54df: 0x40800020, + 0x54e0: 0x40800220, 0x54e1: 0x40800420, 0x54e2: 0x40800620, 0x54e3: 0x40800820, + 0x54e4: 0x40800a20, 0x54e5: 0x40800c20, 0x54e6: 0x40800e20, 0x54e7: 0x40801020, + 0x54e8: 0x40801220, 0x54e9: 0x40801420, 0x54ea: 0x40801620, 0x54eb: 0x40801820, + 0x54ec: 0x40801a20, 0x54ed: 0x40801c20, 0x54ee: 0x40801e20, 0x54ef: 0x40802020, + 0x54f0: 0x40802220, 0x54f1: 0x40802420, 0x54f2: 0x40802620, 0x54f3: 0x40802820, + 0x54f4: 0x40802a20, 0x54f5: 0x40802c20, 0x54f6: 0x40802e20, 0x54f7: 0x40803020, + 0x54f8: 0x40803220, 0x54f9: 0x40803420, 0x54fa: 0x40803620, 0x54fb: 0x40803820, + 0x54fc: 0x40803a20, 0x54fd: 0x40803c20, 0x54fe: 0x40803e20, 0x54ff: 0x40804020, + // Block 0x154, offset 0x5500 + 0x5500: 0x40804220, 0x5501: 0x40804420, 0x5502: 0x40804620, 0x5503: 0x40804820, + 0x5504: 0x40804a20, 0x5505: 0x40804c20, 0x5506: 0x40804e20, 0x5507: 0x40805020, + 0x5508: 0x40805220, 0x5509: 0x40805420, 0x550a: 0x40805620, 0x550b: 0x40805820, + 0x550c: 0x40805a20, 0x550d: 0x40805c20, 0x550e: 0x40805e20, 0x550f: 0x40806020, + 0x5510: 0x40806220, 0x5511: 0x40806420, 0x5512: 0x40806620, 0x5513: 0x40806820, + 0x5514: 0x40806a20, 0x5515: 0x40806c20, 0x5516: 0x40806e20, 0x5517: 0x40807020, + 0x5518: 0x40807220, 0x5519: 0x40807420, 0x551a: 0x40807620, 0x551b: 0x40807820, + 0x551c: 0x40807a20, 0x551d: 0x40807c20, 0x551e: 0x40807e20, 0x551f: 0x40808020, + 0x5520: 0x40808220, 0x5521: 0x40808420, 0x5522: 0x40808620, 0x5523: 0x40808820, + 0x5524: 0x40808a20, 0x5525: 0x40808c20, 0x5526: 0x40808e20, 0x5527: 0x40809020, + 0x5528: 0x40809220, 0x5529: 0x40809420, 0x552a: 0x40809620, 0x552b: 0x40809820, + 0x552c: 0x40809a20, 0x552d: 0x40809c20, 0x552e: 0x40809e20, 0x552f: 0x4080a020, + 0x5530: 0x4080a220, 0x5531: 0x4080a420, 0x5532: 0x4080a620, 0x5533: 0x4080a820, + 0x5534: 0x4080aa20, 0x5535: 0x4080ac20, 0x5536: 0x4080ae20, 0x5537: 0x4080b020, + 0x5538: 0x4080b220, 0x5539: 0x4080b420, 0x553a: 0x4080b620, 0x553b: 0x4080b820, + 0x553c: 0x4080ba20, 0x553d: 0x4080bc20, 0x553e: 0x4080be20, 0x553f: 0x4080c020, + // Block 0x155, offset 0x5540 + 0x5540: 0x4080c220, 0x5541: 0x4080c420, 0x5542: 0x4080c620, 0x5543: 0x4080c820, + 0x5544: 0x4080ca20, 0x5545: 0x4080cc20, 0x5546: 0x4080ce20, 0x5547: 0x4080d020, + 0x5548: 0x4080d220, 0x5549: 0x4080d420, 0x554a: 0x4080d620, 0x554b: 0x4080d820, + 0x554c: 0x4080da20, 0x554d: 0x4080dc20, 0x554e: 0x4080de20, 0x554f: 0x4080e020, + 0x5550: 0x4080e220, 0x5551: 0x4080e420, 0x5552: 0x4080e620, 0x5553: 0x4080e820, + 0x5554: 0x4080ea20, 0x5555: 0x4080ec20, 0x5556: 0x4080ee20, 0x5557: 0x4080f020, + 0x5558: 0x4080f220, 0x5559: 0x4080f420, 0x555a: 0x4080f620, 0x555b: 0x4080f820, + 0x555c: 0x4080fa20, 0x555d: 0x4080fc20, 0x555e: 0x4080fe20, 0x555f: 0x40810020, + 0x5560: 0x40810220, 0x5561: 0x40810420, 0x5562: 0x40810620, 0x5563: 0x40810820, + 0x5564: 0x40810a20, 0x5565: 0x40810c20, 0x5566: 0x40810e20, 0x5567: 0x40811020, + 0x5568: 0x40811220, 0x5569: 0x40811420, 0x556a: 0x40811620, 0x556b: 0x40811820, + 0x556c: 0x40811a20, 0x556d: 0x40811c20, 0x556e: 0x40811e20, 0x556f: 0x40812020, + 0x5570: 0x40812220, 0x5571: 0x40812420, 0x5572: 0x40812620, 0x5573: 0x40812820, + 0x5574: 0x40812a20, 0x5575: 0x40812c20, 0x5576: 0x40812e20, 0x5577: 0x40813020, + 0x5578: 0x40813220, 0x5579: 0x40813420, 0x557a: 0x40813620, 0x557b: 0x40813820, + 0x557c: 0x40813a20, 0x557d: 0x40813c20, 0x557e: 0x40813e20, 0x557f: 0x40814020, + // Block 0x156, offset 0x5580 + 0x5580: 0x40814220, 0x5581: 0x40814420, 0x5582: 0x40814620, 0x5583: 0x40814820, + 0x5584: 0x40814a20, 0x5585: 0x40814c20, 0x5586: 0x40814e20, 0x5587: 0x40815020, + 0x5588: 0x40815220, 0x5589: 0x40815420, 0x558a: 0x40815620, 0x558b: 0x40815820, + 0x558c: 0x40815a20, 0x558d: 0x40815c20, 0x558e: 0x40815e20, 0x558f: 0x40816020, + 0x5590: 0x40816220, 0x5591: 0x40816420, 0x5592: 0x40816620, 0x5593: 0x40816820, + 0x5594: 0x40816a20, 0x5595: 0x40816c20, 0x5596: 0x40816e20, 0x5597: 0x40817020, + 0x5598: 0x40817220, 0x5599: 0x40817420, 0x559a: 0x40817620, 0x559b: 0x40817820, + 0x559c: 0x40817a20, 0x559d: 0x40817c20, 0x559e: 0x40817e20, 0x559f: 0x40818020, + 0x55a0: 0x40818220, 0x55a1: 0x40818420, 0x55a2: 0x40818620, 0x55a3: 0x40818820, + 0x55a4: 0x40818a20, 0x55a5: 0x40818c20, 0x55a6: 0x40818e20, 0x55a7: 0x40819020, + 0x55a8: 0x40819220, 0x55a9: 0x40819420, 0x55aa: 0x40819620, 0x55ab: 0x40819820, + 0x55ac: 0x40819a20, 0x55ad: 0x40819c20, 0x55ae: 0x40819e20, 0x55af: 0x4081a020, + 0x55b0: 0x4081a220, 0x55b1: 0x4081a420, 0x55b2: 0x4081a620, 0x55b3: 0x4081a820, + 0x55b4: 0x4081aa20, 0x55b5: 0x4081ac20, 0x55b6: 0x4081ae20, 0x55b7: 0x4081b020, + 0x55b8: 0x4081b220, 0x55b9: 0x4081b420, 0x55ba: 0x4081b620, 0x55bb: 0x4081b820, + 0x55bc: 0x4081ba20, 0x55bd: 0x4081bc20, 0x55be: 0x4081be20, 0x55bf: 0x4081c020, + // Block 0x157, offset 0x55c0 + 0x55c0: 0x4081c220, 0x55c1: 0x4081c420, 0x55c2: 0x4081c620, 0x55c3: 0x4081c820, + 0x55c4: 0x4081ca20, 0x55c5: 0x4081cc20, 0x55c6: 0x4081ce20, 0x55c7: 0x4081d020, + 0x55c8: 0x4081d220, 0x55c9: 0x4081d420, 0x55ca: 0x4081d620, 0x55cb: 0x4081d820, + 0x55cc: 0x4081da20, 0x55cd: 0x4081dc20, 0x55ce: 0x4081de20, 0x55cf: 0x4081e020, + 0x55d0: 0x4081e220, 0x55d1: 0x4081e420, 0x55d2: 0x4081e620, 0x55d3: 0x4081e820, + 0x55d4: 0x4081ea20, 0x55d5: 0x4081ec20, 0x55d6: 0x4081ee20, 0x55d7: 0x4081f020, + 0x55d8: 0x4081f220, 0x55d9: 0x4081f420, 0x55da: 0x4081f620, 0x55db: 0x4081f820, + 0x55dc: 0x4081fa20, 0x55dd: 0x4081fc20, 0x55de: 0x4081fe20, 0x55df: 0x40820020, + 0x55e0: 0x40820220, 0x55e1: 0x40820420, 0x55e2: 0x40820620, 0x55e3: 0x40820820, + 0x55e4: 0x40820a20, 0x55e5: 0x40820c20, 0x55e6: 0x40820e20, 0x55e7: 0x40821020, + 0x55e8: 0x40821220, 0x55e9: 0x40821420, 0x55ea: 0x40821620, 0x55eb: 0x40821820, + 0x55ec: 0x40821a20, 0x55ed: 0x40821c20, 0x55ee: 0x40821e20, 0x55ef: 0x40822020, + 0x55f0: 0x40822220, 0x55f1: 0x40822420, 0x55f2: 0x40822620, 0x55f3: 0x40822820, + 0x55f4: 0x40822a20, 0x55f5: 0x40822c20, 0x55f6: 0x40822e20, 0x55f7: 0x40823020, + 0x55f8: 0x40823220, 0x55f9: 0x40823420, 0x55fa: 0x40823620, 0x55fb: 0x40823820, + 0x55fc: 0x40823a20, 0x55fd: 0x40823c20, 0x55fe: 0x40823e20, 0x55ff: 0x40824020, + // Block 0x158, offset 0x5600 + 0x5600: 0x40824220, 0x5601: 0x40824420, 0x5602: 0x40824620, 0x5603: 0x40824820, + 0x5604: 0x40824a20, 0x5605: 0x40824c20, 0x5606: 0x40824e20, 0x5607: 0x40825020, + 0x5608: 0x40825220, 0x5609: 0x40825420, 0x560a: 0x40825620, 0x560b: 0x40825820, + 0x560c: 0x40825a20, 0x560d: 0x40825c20, 0x560e: 0x40825e20, 0x560f: 0x40826020, + 0x5610: 0x40826220, 0x5611: 0x40826420, 0x5612: 0x40826620, 0x5613: 0x40826820, + 0x5614: 0x40826a20, 0x5615: 0x40826c20, 0x5616: 0x40826e20, 0x5617: 0x40827020, + 0x5618: 0x40827220, 0x5619: 0x40827420, 0x561a: 0x40827620, 0x561b: 0x40827820, + 0x561c: 0x40827a20, 0x561d: 0x40827c20, 0x561e: 0x40827e20, 0x561f: 0x40828020, + 0x5620: 0x40828220, 0x5621: 0x40828420, 0x5622: 0x40828620, 0x5623: 0x40828820, + 0x5624: 0x40828a20, 0x5625: 0x40828c20, 0x5626: 0x40828e20, 0x5627: 0x40829020, + 0x5628: 0x40829220, 0x5629: 0x40829420, 0x562a: 0x40829620, 0x562b: 0x40829820, + 0x562c: 0x40829a20, 0x562d: 0x40829c20, 0x562e: 0x40829e20, 0x562f: 0x4082a020, + 0x5630: 0x4082a220, 0x5631: 0x4082a420, 0x5632: 0x4082a620, 0x5633: 0x4082a820, + 0x5634: 0x4082aa20, 0x5635: 0x4082ac20, 0x5636: 0x4082ae20, 0x5637: 0x4082b020, + 0x5638: 0x4082b220, 0x5639: 0x4082b420, 0x563a: 0x4082b620, 0x563b: 0x4082b820, + 0x563c: 0x4082ba20, 0x563d: 0x4082bc20, 0x563e: 0x4082be20, 0x563f: 0x4082c020, + // Block 0x159, offset 0x5640 + 0x5640: 0x4082c220, 0x5641: 0x4082c420, 0x5642: 0x4082c620, 0x5643: 0x4082c820, + 0x5644: 0x4082ca20, 0x5645: 0x4082cc20, 0x5646: 0x4082ce20, 0x5647: 0x4082d020, + 0x5648: 0x4082d220, 0x5649: 0x4082d420, 0x564a: 0x4082d620, 0x564b: 0x4082d820, + 0x564c: 0x4082da20, 0x564d: 0x4082dc20, 0x564e: 0x4082de20, 0x564f: 0x4082e020, + 0x5650: 0x4082e220, 0x5651: 0x4082e420, 0x5652: 0x4082e620, 0x5653: 0x4082e820, + 0x5654: 0x4082ea20, 0x5655: 0x4082ec20, 0x5656: 0x4082ee20, 0x5657: 0x4082f020, + 0x5658: 0x4082f220, 0x5659: 0x4082f420, 0x565a: 0x4082f620, 0x565b: 0x4082f820, + 0x565c: 0x4082fa20, 0x565d: 0x4082fc20, 0x565e: 0x4082fe20, 0x565f: 0x40830020, + 0x5660: 0x40830220, 0x5661: 0x40830420, 0x5662: 0x40830620, 0x5663: 0x40830820, + 0x5664: 0x40830a20, 0x5665: 0x40830c20, 0x5666: 0x40830e20, 0x5667: 0x40831020, + 0x5668: 0x40831220, 0x5669: 0x40831420, 0x566a: 0x40831620, 0x566b: 0x40831820, + 0x566c: 0x40831a20, 0x566d: 0x40831c20, 0x566e: 0x40831e20, 0x566f: 0x40832020, + 0x5670: 0x40832220, 0x5671: 0x40832420, 0x5672: 0x40832620, 0x5673: 0x40832820, + 0x5674: 0x40832a20, 0x5675: 0x40832c20, 0x5676: 0x40832e20, 0x5677: 0x40833020, + 0x5678: 0x40833220, 0x5679: 0x40833420, 0x567a: 0x40833620, 0x567b: 0x40833820, + 0x567c: 0x40833a20, 0x567d: 0x40833c20, 0x567e: 0x40833e20, 0x567f: 0x40834020, + // Block 0x15a, offset 0x5680 + 0x5680: 0x40834220, 0x5681: 0x40834420, 0x5682: 0x40834620, 0x5683: 0x40834820, + 0x5684: 0x40834a20, 0x5685: 0x40834c20, 0x5686: 0x40834e20, 0x5687: 0x40835020, + 0x5688: 0x40835220, 0x5689: 0x40835420, 0x568a: 0x40835620, 0x568b: 0x40835820, + 0x568c: 0x40835a20, 0x568d: 0x40835c20, 0x568e: 0x40835e20, 0x568f: 0x40836020, + 0x5690: 0x40836220, 0x5691: 0x40836420, 0x5692: 0x40836620, 0x5693: 0x40836820, + 0x5694: 0x40836a20, 0x5695: 0x40836c20, 0x5696: 0x40836e20, 0x5697: 0x40837020, + 0x5698: 0x40837220, 0x5699: 0x40837420, 0x569a: 0x40837620, 0x569b: 0x40837820, + 0x569c: 0x40837a20, 0x569d: 0x40837c20, 0x569e: 0x40837e20, 0x569f: 0x40838020, + 0x56a0: 0x40838220, 0x56a1: 0x40838420, 0x56a2: 0x40838620, 0x56a3: 0x40838820, + 0x56a4: 0x40838a20, 0x56a5: 0x40838c20, 0x56a6: 0x40838e20, 0x56a7: 0x40839020, + 0x56a8: 0x40839220, 0x56a9: 0x40839420, 0x56aa: 0x40839620, 0x56ab: 0x40839820, + 0x56ac: 0x40839a20, 0x56ad: 0x40839c20, 0x56ae: 0x40839e20, 0x56af: 0x4083a020, + 0x56b0: 0x4083a220, 0x56b1: 0x4083a420, 0x56b2: 0x4083a620, 0x56b3: 0x4083a820, + 0x56b4: 0x4083aa20, 0x56b5: 0x4083ac20, 0x56b6: 0x4083ae20, 0x56b7: 0x4083b020, + 0x56b8: 0x4083b220, 0x56b9: 0x4083b420, 0x56ba: 0x4083b620, 0x56bb: 0x4083b820, + 0x56bc: 0x4083ba20, 0x56bd: 0x4083bc20, 0x56be: 0x4083be20, 0x56bf: 0x4083c020, + // Block 0x15b, offset 0x56c0 + 0x56c0: 0x4083c220, 0x56c1: 0x4083c420, 0x56c2: 0x4083c620, 0x56c3: 0x4083c820, + 0x56c4: 0x4083ca20, 0x56c5: 0x4083cc20, 0x56c6: 0x4083ce20, 0x56c7: 0x4083d020, + 0x56c8: 0x4083d220, 0x56c9: 0x4083d420, 0x56ca: 0x4083d620, 0x56cb: 0x4083d820, + 0x56cc: 0x4083da20, 0x56cd: 0x4083dc20, 0x56ce: 0x4083de20, 0x56cf: 0x4083e020, + 0x56d0: 0x4083e220, 0x56d1: 0x4083e420, 0x56d2: 0x4083e620, 0x56d3: 0x4083e820, + 0x56d4: 0x4083ea20, 0x56d5: 0x4083ec20, 0x56d6: 0x4083ee20, 0x56d7: 0x4083f020, + 0x56d8: 0x4083f220, 0x56d9: 0x4083f420, 0x56da: 0x4083f620, 0x56db: 0x4083f820, + 0x56dc: 0x4083fa20, 0x56dd: 0x4083fc20, 0x56de: 0x4083fe20, 0x56df: 0x40840020, + 0x56e0: 0x40840220, 0x56e1: 0x40840420, 0x56e2: 0x40840620, 0x56e3: 0x40840820, + 0x56e4: 0x40840a20, 0x56e5: 0x40840c20, 0x56e6: 0x40840e20, 0x56e7: 0x40841020, + 0x56e8: 0x40841220, 0x56e9: 0x40841420, 0x56ea: 0x40841620, 0x56eb: 0x40841820, + 0x56ec: 0x40841a20, 0x56ed: 0x40841c20, 0x56ee: 0x40841e20, 0x56ef: 0x40842020, + 0x56f0: 0x40842220, 0x56f1: 0x40842420, 0x56f2: 0x40842620, 0x56f3: 0x40842820, + 0x56f4: 0x40842a20, 0x56f5: 0x40842c20, 0x56f6: 0x40842e20, 0x56f7: 0x40843020, + 0x56f8: 0x40843220, 0x56f9: 0x40843420, 0x56fa: 0x40843620, 0x56fb: 0x40843820, + 0x56fc: 0x40843a20, 0x56fd: 0x40843c20, 0x56fe: 0x40843e20, 0x56ff: 0x40844020, + // Block 0x15c, offset 0x5700 + 0x5700: 0x40844220, 0x5701: 0x40844420, 0x5702: 0x40844620, 0x5703: 0x40844820, + 0x5704: 0x40844a20, 0x5705: 0x40844c20, 0x5706: 0x40844e20, 0x5707: 0x40845020, + 0x5708: 0x40845220, 0x5709: 0x40845420, 0x570a: 0x40845620, 0x570b: 0x40845820, + 0x570c: 0x40845a20, 0x570d: 0x40845c20, 0x570e: 0x40845e20, 0x570f: 0x40846020, + 0x5710: 0x40846220, 0x5711: 0x40846420, 0x5712: 0x40846620, 0x5713: 0x40846820, + 0x5714: 0x40846a20, 0x5715: 0x40846c20, 0x5716: 0x40846e20, 0x5717: 0x40847020, + 0x5718: 0x40847220, 0x5719: 0x40847420, 0x571a: 0x40847620, 0x571b: 0x40847820, + 0x571c: 0x40847a20, 0x571d: 0x40847c20, 0x571e: 0x40847e20, 0x571f: 0x40848020, + 0x5720: 0x40848220, 0x5721: 0x40848420, 0x5722: 0x40848620, 0x5723: 0x40848820, + 0x5724: 0x40848a20, 0x5725: 0x40848c20, 0x5726: 0x40848e20, 0x5727: 0x40849020, + 0x5728: 0x40849220, 0x5729: 0x40849420, 0x572a: 0x40849620, 0x572b: 0x40849820, + 0x572c: 0x40849a20, 0x572d: 0x40849c20, 0x572e: 0x40849e20, 0x572f: 0x4084a020, + 0x5730: 0x4084a220, 0x5731: 0x4084a420, 0x5732: 0x4084a620, 0x5733: 0x4084a820, + 0x5734: 0x4084aa20, 0x5735: 0x4084ac20, 0x5736: 0x4084ae20, 0x5737: 0x4084b020, + 0x5738: 0x4084b220, 0x5739: 0x4084b420, 0x573a: 0x4084b620, 0x573b: 0x4084b820, + 0x573c: 0x4084ba20, 0x573d: 0x4084bc20, 0x573e: 0x4084be20, 0x573f: 0x4084c020, + // Block 0x15d, offset 0x5740 + 0x5740: 0x4084c220, 0x5741: 0x4084c420, 0x5742: 0x4084c620, 0x5743: 0x4084c820, + 0x5744: 0x4084ca20, 0x5745: 0x4084cc20, 0x5746: 0x4084ce20, 0x5747: 0x4084d020, + 0x5748: 0x4084d220, 0x5749: 0x4084d420, 0x574a: 0x4084d620, 0x574b: 0x4084d820, + 0x574c: 0x4084da20, 0x574d: 0x4084dc20, 0x574e: 0x4084de20, 0x574f: 0x4084e020, + 0x5750: 0x4084e220, 0x5751: 0x4084e420, 0x5752: 0x4084e620, 0x5753: 0x4084e820, + 0x5754: 0x4084ea20, 0x5755: 0x4084ec20, 0x5756: 0x4084ee20, 0x5757: 0x4084f020, + 0x5758: 0x4084f220, 0x5759: 0x4084f420, 0x575a: 0x4084f620, 0x575b: 0x4084f820, + 0x575c: 0x4084fa20, 0x575d: 0x4084fc20, 0x575e: 0x4084fe20, 0x575f: 0x40850020, + 0x5760: 0x40850220, 0x5761: 0x40850420, 0x5762: 0x40850620, 0x5763: 0x40850820, + 0x5764: 0x40850a20, 0x5765: 0x40850c20, 0x5766: 0x40850e20, 0x5767: 0x40851020, + 0x5768: 0x40851220, 0x5769: 0x40851420, 0x576a: 0x40851620, 0x576b: 0x40851820, + 0x576c: 0x40851a20, 0x576d: 0x40851c20, 0x576e: 0x40851e20, 0x576f: 0x40852020, + 0x5770: 0x40852220, 0x5771: 0x40852420, 0x5772: 0x40852620, 0x5773: 0x40852820, + 0x5774: 0x40852a20, 0x5775: 0x40852c20, 0x5776: 0x40852e20, 0x5777: 0x40853020, + 0x5778: 0x40853220, 0x5779: 0x40853420, 0x577a: 0x40853620, 0x577b: 0x40853820, + 0x577c: 0x40853a20, 0x577d: 0x40853c20, 0x577e: 0x40853e20, 0x577f: 0x40854020, + // Block 0x15e, offset 0x5780 + 0x5780: 0x40854220, 0x5781: 0x40854420, 0x5782: 0x40854620, 0x5783: 0x40854820, + 0x5784: 0x40854a20, 0x5785: 0x40854c20, 0x5786: 0x40854e20, 0x5787: 0x40855020, + 0x5788: 0x40855220, 0x5789: 0x40855420, 0x578a: 0x40855620, 0x578b: 0x40855820, + 0x578c: 0x40855a20, 0x578d: 0x40855c20, 0x578e: 0x40855e20, 0x578f: 0x40856020, + 0x5790: 0x40856220, 0x5791: 0x40856420, 0x5792: 0x40856620, 0x5793: 0x40856820, + 0x5794: 0x40856a20, 0x5795: 0x40856c20, 0x5796: 0x40856e20, 0x5797: 0x40857020, + 0x5798: 0x40857220, 0x5799: 0x40857420, 0x579a: 0x40857620, 0x579b: 0x40857820, + 0x579c: 0x40857a20, 0x579d: 0x40857c20, 0x579e: 0x40857e20, 0x579f: 0x40858020, + 0x57a0: 0x40858220, 0x57a1: 0x40858420, 0x57a2: 0x40858620, 0x57a3: 0x40858820, + 0x57a4: 0x40858a20, 0x57a5: 0x40858c20, 0x57a6: 0x40858e20, 0x57a7: 0x40859020, + 0x57a8: 0x40859220, 0x57a9: 0x40859420, 0x57aa: 0x40859620, 0x57ab: 0x40859820, + 0x57ac: 0x40859a20, 0x57ad: 0x40859c20, 0x57ae: 0x40859e20, 0x57af: 0x4085a020, + 0x57b0: 0x4085a220, 0x57b1: 0x4085a420, 0x57b2: 0x4085a620, 0x57b3: 0x4085a820, + 0x57b4: 0x4085aa20, 0x57b5: 0x4085ac20, 0x57b6: 0x4085ae20, 0x57b7: 0x4085b020, + 0x57b8: 0x4085b220, 0x57b9: 0x4085b420, 0x57ba: 0x4085b620, 0x57bb: 0x4085b820, + 0x57bc: 0x4085ba20, 0x57bd: 0x4085bc20, 0x57be: 0x4085be20, 0x57bf: 0x4085c020, + // Block 0x15f, offset 0x57c0 + 0x57c0: 0x4085c220, 0x57c1: 0x4085c420, 0x57c2: 0x4085c620, 0x57c3: 0x4085c820, + 0x57c4: 0x4085ca20, 0x57c5: 0x4085cc20, 0x57c6: 0x4085ce20, 0x57c7: 0x4085d020, + 0x57c8: 0x4085d220, 0x57c9: 0x4085d420, 0x57ca: 0x4085d620, 0x57cb: 0x4085d820, + 0x57cc: 0x4085da20, 0x57cd: 0x4085dc20, 0x57ce: 0x4085de20, 0x57cf: 0x4085e020, + 0x57d0: 0x4085e220, 0x57d1: 0x4085e420, 0x57d2: 0x4085e620, 0x57d3: 0x4085e820, + 0x57d4: 0x4085ea20, 0x57d5: 0x4085ec20, 0x57d6: 0x4085ee20, 0x57d7: 0x4085f020, + 0x57d8: 0x4085f220, 0x57d9: 0x4085f420, 0x57da: 0x4085f620, 0x57db: 0x4085f820, + 0x57dc: 0x4085fa20, 0x57dd: 0x4085fc20, 0x57de: 0x4085fe20, 0x57df: 0x40860020, + 0x57e0: 0x40860220, 0x57e1: 0x40860420, 0x57e2: 0x40860620, 0x57e3: 0x40860820, + 0x57e4: 0x40860a20, 0x57e5: 0x40860c20, 0x57e6: 0x40860e20, 0x57e7: 0x40861020, + 0x57e8: 0x40861220, 0x57e9: 0x40861420, 0x57ea: 0x40861620, 0x57eb: 0x40861820, + 0x57ec: 0x40861a20, 0x57ed: 0x40861c20, 0x57ee: 0x40861e20, + // Block 0x160, offset 0x5800 + 0x5800: 0x405e3a20, 0x5801: 0x405e3c20, 0x5802: 0x405e3e20, 0x5803: 0x405e4020, + 0x5804: 0x405e4220, 0x5805: 0x405e4420, 0x5806: 0x405e4620, 0x5807: 0x405e4820, + 0x5808: 0x405e4a20, 0x5809: 0x405e4c20, 0x580a: 0x405e4e20, 0x580b: 0x405e5020, + 0x580c: 0x405e5220, 0x580d: 0x405e5420, 0x580e: 0x405e5620, 0x580f: 0x405e5820, + 0x5810: 0x405e5a20, 0x5811: 0x405e5c20, 0x5812: 0x405e5e20, 0x5813: 0x405e6020, + 0x5814: 0x405e6220, 0x5815: 0x405e6420, 0x5816: 0x405e6620, 0x5817: 0x405e6820, + 0x5818: 0x405e6a20, 0x5819: 0x405e6c20, 0x581a: 0x405e6e20, 0x581b: 0x405e7020, + 0x581c: 0x405e7220, 0x581d: 0x405e7420, 0x581e: 0x405e7620, 0x581f: 0x405e7820, + 0x5820: 0x405e7a20, 0x5821: 0x405e7c20, 0x5822: 0x405e7e20, 0x5823: 0x405e8020, + 0x5824: 0x405e8220, 0x5825: 0x405e8420, 0x5826: 0x405e8620, 0x5827: 0x405e8820, + 0x5828: 0x405e8a20, 0x5829: 0x405e8c20, 0x582a: 0x405e8e20, 0x582b: 0x405e9020, + 0x582c: 0x405e9220, 0x582d: 0x405e9420, 0x582e: 0x405e9620, 0x582f: 0x405e9820, + 0x5830: 0x405e9a20, 0x5831: 0x405e9c20, 0x5832: 0x405e9e20, 0x5833: 0x405ea020, + 0x5834: 0x405ea220, 0x5835: 0x405ea420, 0x5836: 0x405ea620, 0x5837: 0x405ea820, + 0x5838: 0x405eaa20, 0x5839: 0x405eac20, 0x583a: 0x405eae20, 0x583b: 0x405eb020, + 0x583c: 0x405eb220, 0x583d: 0x405eb420, 0x583e: 0x405eb620, 0x583f: 0x405eb820, + // Block 0x161, offset 0x5840 + 0x5840: 0x405eba20, 0x5841: 0x405ebc20, 0x5842: 0x405ebe20, 0x5843: 0x405ec020, + 0x5844: 0x405ec220, 0x5845: 0x405ec420, 0x5846: 0x405ec620, 0x5847: 0x405ec820, + 0x5848: 0x405eca20, 0x5849: 0x405ecc20, 0x584a: 0x405ece20, 0x584b: 0x405ed020, + 0x584c: 0x405ed220, 0x584d: 0x405ed420, 0x584e: 0x405ed620, 0x584f: 0x405ed820, + 0x5850: 0x405eda20, 0x5851: 0x405edc20, 0x5852: 0x405ede20, 0x5853: 0x405ee020, + 0x5854: 0x405ee220, 0x5855: 0x405ee420, 0x5856: 0x405ee620, 0x5857: 0x405ee820, + 0x5858: 0x405eea20, 0x5859: 0x405eec20, 0x585a: 0x405eee20, 0x585b: 0x405ef020, + 0x585c: 0x405ef220, 0x585d: 0x405ef420, 0x585e: 0x405ef620, 0x585f: 0x405ef820, + 0x5860: 0x405efa20, 0x5861: 0x405efc20, 0x5862: 0x405efe20, 0x5863: 0x405f0020, + 0x5864: 0x405f0220, 0x5865: 0x405f0420, 0x5866: 0x405f0620, 0x5867: 0x405f0820, + 0x5868: 0x405f0a20, 0x5869: 0x405f0c20, 0x586a: 0x405f0e20, 0x586b: 0x405f1020, + 0x586c: 0x405f1220, 0x586d: 0x405f1420, 0x586e: 0x405f1620, 0x586f: 0x405f1820, + 0x5870: 0x405f1a20, 0x5871: 0x405f1c20, 0x5872: 0x405f1e20, 0x5873: 0x405f2020, + 0x5874: 0x405f2220, 0x5875: 0x405f2420, 0x5876: 0x405f2620, 0x5877: 0x405f2820, + 0x5878: 0x405f2a20, 0x5879: 0x405f2c20, 0x587a: 0x405f2e20, 0x587b: 0x405f3020, + 0x587c: 0x405f3220, 0x587d: 0x405f3420, 0x587e: 0x405f3620, 0x587f: 0x405f3820, + // Block 0x162, offset 0x5880 + 0x5880: 0x405f3a20, 0x5881: 0x405f3c20, 0x5882: 0x405f3e20, 0x5883: 0x405f4020, + 0x5884: 0x405f4220, 0x5885: 0x405f4420, 0x5886: 0x405f4620, 0x5887: 0x405f4820, + 0x5888: 0x405f4a20, 0x5889: 0x405f4c20, 0x588a: 0x405f4e20, 0x588b: 0x405f5020, + 0x588c: 0x405f5220, 0x588d: 0x405f5420, 0x588e: 0x405f5620, 0x588f: 0x405f5820, + 0x5890: 0x405f5a20, 0x5891: 0x405f5c20, 0x5892: 0x405f5e20, 0x5893: 0x405f6020, + 0x5894: 0x405f6220, 0x5895: 0x405f6420, 0x5896: 0x405f6620, 0x5897: 0x405f6820, + 0x5898: 0x405f6a20, 0x5899: 0x405f6c20, 0x589a: 0x405f6e20, 0x589b: 0x405f7020, + 0x589c: 0x405f7220, 0x589d: 0x405f7420, 0x589e: 0x405f7620, 0x589f: 0x405f7820, + 0x58a0: 0x405f7a20, 0x58a1: 0x405f7c20, 0x58a2: 0x405f7e20, 0x58a3: 0x405f8020, + 0x58a4: 0x405f8220, 0x58a5: 0x405f8420, 0x58a6: 0x405f8620, 0x58a7: 0x405f8820, + 0x58a8: 0x405f8a20, 0x58a9: 0x405f8c20, 0x58aa: 0x405f8e20, 0x58ab: 0x405f9020, + 0x58ac: 0x405f9220, 0x58ad: 0x405f9420, 0x58ae: 0x405f9620, 0x58af: 0x405f9820, + 0x58b0: 0x405f9a20, 0x58b1: 0x405f9c20, 0x58b2: 0x405f9e20, 0x58b3: 0x405fa020, + 0x58b4: 0x405fa220, 0x58b5: 0x405fa420, 0x58b6: 0x405fa620, 0x58b7: 0x405fa820, + 0x58b8: 0x405faa20, 0x58b9: 0x405fac20, 0x58ba: 0x405fae20, 0x58bb: 0x405fb020, + 0x58bc: 0x405fb220, 0x58bd: 0x405fb420, 0x58be: 0x405fb620, 0x58bf: 0x405fb820, + // Block 0x163, offset 0x58c0 + 0x58c0: 0x405fba20, 0x58c1: 0x405fbc20, 0x58c2: 0x405fbe20, 0x58c3: 0x405fc020, + 0x58c4: 0x405fc220, 0x58c5: 0x405fc420, 0x58c6: 0x405fc620, 0x58c7: 0x405fc820, + 0x58c8: 0x405fca20, 0x58c9: 0x405fcc20, 0x58ca: 0x405fce20, 0x58cb: 0x405fd020, + 0x58cc: 0x405fd220, 0x58cd: 0x405fd420, 0x58ce: 0x405fd620, 0x58cf: 0x405fd820, + 0x58d0: 0x405fda20, 0x58d1: 0x405fdc20, 0x58d2: 0x405fde20, 0x58d3: 0x405fe020, + 0x58d4: 0x405fe220, 0x58d5: 0x405fe420, 0x58d6: 0x405fe620, 0x58d7: 0x405fe820, + 0x58d8: 0x405fea20, 0x58d9: 0x405fec20, 0x58da: 0x405fee20, 0x58db: 0x405ff020, + 0x58dc: 0x405ff220, 0x58dd: 0x405ff420, 0x58de: 0x405ff620, 0x58df: 0x405ff820, + 0x58e0: 0x405ffa20, 0x58e1: 0x405ffc20, 0x58e2: 0x405ffe20, 0x58e3: 0x40600020, + 0x58e4: 0x40600220, 0x58e5: 0x40600420, 0x58e6: 0x40600620, 0x58e7: 0x40600820, + 0x58e8: 0x40600a20, 0x58e9: 0x40600c20, 0x58ea: 0x40600e20, 0x58eb: 0x40601020, + 0x58ec: 0x40601220, 0x58ed: 0x40601420, 0x58ee: 0x40601620, 0x58ef: 0x40601820, + 0x58f0: 0x40601a20, 0x58f1: 0x40601c20, 0x58f2: 0x40601e20, 0x58f3: 0x40602020, + 0x58f4: 0x40602220, 0x58f5: 0x40602420, 0x58f6: 0x40602620, 0x58f7: 0x40602820, + 0x58f8: 0x40602a20, 0x58f9: 0x40602c20, 0x58fa: 0x40602e20, 0x58fb: 0x40603020, + 0x58fc: 0x40603220, 0x58fd: 0x40603420, 0x58fe: 0x40603620, 0x58ff: 0x40603820, + // Block 0x164, offset 0x5900 + 0x5900: 0x40603a20, 0x5901: 0x40603c20, 0x5902: 0x40603e20, 0x5903: 0x40604020, + 0x5904: 0x40604220, 0x5905: 0x40604420, 0x5906: 0x40604620, 0x5907: 0x40604820, + 0x5908: 0x40604a20, 0x5909: 0x40604c20, 0x590a: 0x40604e20, 0x590b: 0x40605020, + 0x590c: 0x40605220, 0x590d: 0x40605420, 0x590e: 0x40605620, 0x590f: 0x40605820, + 0x5910: 0x40605a20, 0x5911: 0x40605c20, 0x5912: 0x40605e20, 0x5913: 0x40606020, + 0x5914: 0x40606220, 0x5915: 0x40606420, 0x5916: 0x40606620, 0x5917: 0x40606820, + 0x5918: 0x40606a20, 0x5919: 0x40606c20, 0x591a: 0x40606e20, 0x591b: 0x40607020, + 0x591c: 0x40607220, 0x591d: 0x40607420, 0x591e: 0x40607620, 0x591f: 0x40607820, + 0x5920: 0x40607a20, 0x5921: 0x40607c20, 0x5922: 0x40607e20, 0x5923: 0x40608020, + 0x5924: 0x40608220, 0x5925: 0x40608420, 0x5926: 0x40608620, 0x5927: 0x40608820, + 0x5928: 0x40608a20, 0x5929: 0x40608c20, 0x592a: 0x40608e20, 0x592b: 0x40609020, + 0x592c: 0x40609220, 0x592d: 0x40609420, 0x592e: 0x40609620, 0x592f: 0x40609820, + 0x5930: 0x40609a20, 0x5931: 0x40609c20, 0x5932: 0x40609e20, 0x5933: 0x4060a020, + 0x5934: 0x4060a220, 0x5935: 0x4060a420, 0x5936: 0x4060a620, 0x5937: 0x4060a820, + 0x5938: 0x4060aa20, 0x5939: 0x4060ac20, 0x593a: 0x4060ae20, 0x593b: 0x4060b020, + 0x593c: 0x4060b220, 0x593d: 0x4060b420, 0x593e: 0x4060b620, 0x593f: 0x4060b820, + // Block 0x165, offset 0x5940 + 0x5940: 0x4060ba20, 0x5941: 0x4060bc20, 0x5942: 0x4060be20, 0x5943: 0x4060c020, + 0x5944: 0x4060c220, 0x5945: 0x4060c420, 0x5946: 0x4060c620, 0x5947: 0x4060c820, + 0x5948: 0x4060ca20, 0x5949: 0x4060cc20, 0x594a: 0x4060ce20, 0x594b: 0x4060d020, + 0x594c: 0x4060d220, 0x594d: 0x4060d420, 0x594e: 0x4060d620, 0x594f: 0x4060d820, + 0x5950: 0x4060da20, 0x5951: 0x4060dc20, 0x5952: 0x4060de20, 0x5953: 0x4060e020, + 0x5954: 0x4060e220, 0x5955: 0x4060e420, 0x5956: 0x4060e620, 0x5957: 0x4060e820, + 0x5958: 0x4060ea20, 0x5959: 0x4060ec20, 0x595a: 0x4060ee20, 0x595b: 0x4060f020, + 0x595c: 0x4060f220, 0x595d: 0x4060f420, 0x595e: 0x4060f620, 0x595f: 0x4060f820, + 0x5960: 0x4060fa20, 0x5961: 0x4060fc20, 0x5962: 0x4060fe20, 0x5963: 0x40610020, + 0x5964: 0x40610220, 0x5965: 0x40610420, 0x5966: 0x40610620, 0x5967: 0x40610820, + 0x5968: 0x40610a20, 0x5969: 0x40610c20, 0x596a: 0x40610e20, 0x596b: 0x40611020, + 0x596c: 0x40611220, 0x596d: 0x40611420, 0x596e: 0x40611620, 0x596f: 0x40611820, + 0x5970: 0x40611a20, 0x5971: 0x40611c20, 0x5972: 0x40611e20, 0x5973: 0x40612020, + 0x5974: 0x40612220, 0x5975: 0x40612420, 0x5976: 0x40612620, 0x5977: 0x40612820, + 0x5978: 0x40612a20, 0x5979: 0x40612c20, 0x597a: 0x40612e20, 0x597b: 0x40613020, + 0x597c: 0x40613220, 0x597d: 0x40613420, 0x597e: 0x40613620, 0x597f: 0x40613820, + // Block 0x166, offset 0x5980 + 0x5980: 0x40613a20, 0x5981: 0x40613c20, 0x5982: 0x40613e20, 0x5983: 0x40614020, + 0x5984: 0x40614220, 0x5985: 0x40614420, 0x5986: 0x40614620, 0x5987: 0x40614820, + 0x5988: 0x40614a20, 0x5989: 0x40614c20, 0x598a: 0x40614e20, 0x598b: 0x40615020, + 0x598c: 0x40615220, 0x598d: 0x40615420, 0x598e: 0x40615620, 0x598f: 0x40615820, + 0x5990: 0x40615a20, 0x5991: 0x40615c20, 0x5992: 0x40615e20, 0x5993: 0x40616020, + 0x5994: 0x40616220, 0x5995: 0x40616420, 0x5996: 0x40616620, 0x5997: 0x40616820, + 0x5998: 0x40616a20, 0x5999: 0x40616c20, 0x599a: 0x40616e20, 0x599b: 0x40617020, + 0x599c: 0x40617220, 0x599d: 0x40617420, 0x599e: 0x40617620, 0x599f: 0x40617820, + 0x59a0: 0x40617a20, 0x59a1: 0x40617c20, 0x59a2: 0x40617e20, 0x59a3: 0x40618020, + 0x59a4: 0x40618220, 0x59a5: 0x40618420, 0x59a6: 0x40618620, 0x59a7: 0x40618820, + 0x59a8: 0x40618a20, 0x59a9: 0x40618c20, 0x59aa: 0x40618e20, 0x59ab: 0x40619020, + 0x59ac: 0x40619220, 0x59ad: 0x40619420, 0x59ae: 0x40619620, 0x59af: 0x40619820, + 0x59b0: 0x40619a20, 0x59b1: 0x40619c20, 0x59b2: 0x40619e20, 0x59b3: 0x4061a020, + 0x59b4: 0x4061a220, 0x59b5: 0x4061a420, 0x59b6: 0x4061a620, 0x59b7: 0x4061a820, + 0x59b8: 0x4061aa20, 0x59b9: 0x4061ac20, 0x59ba: 0x4061ae20, 0x59bb: 0x4061b020, + 0x59bc: 0x4061b220, 0x59bd: 0x4061b420, 0x59be: 0x4061b620, 0x59bf: 0x4061b820, + // Block 0x167, offset 0x59c0 + 0x59c0: 0x4061ba20, 0x59c1: 0x4061bc20, 0x59c2: 0x4061be20, 0x59c3: 0x4061c020, + 0x59c4: 0x4061c220, 0x59c5: 0x4061c420, 0x59c6: 0x4061c620, 0x59c7: 0x4061c820, + 0x59c8: 0x4061ca20, 0x59c9: 0x4061cc20, 0x59ca: 0x4061ce20, 0x59cb: 0x4061d020, + 0x59cc: 0x4061d220, 0x59cd: 0x4061d420, 0x59ce: 0x4061d620, 0x59cf: 0x4061d820, + 0x59d0: 0x4061da20, 0x59d1: 0x4061dc20, 0x59d2: 0x4061de20, 0x59d3: 0x4061e020, + 0x59d4: 0x4061e220, 0x59d5: 0x4061e420, 0x59d6: 0x4061e620, 0x59d7: 0x4061e820, + 0x59d8: 0x4061ea20, 0x59d9: 0x4061ec20, 0x59da: 0x4061ee20, 0x59db: 0x4061f020, + 0x59dc: 0x4061f220, 0x59dd: 0x4061f420, 0x59de: 0x4061f620, 0x59df: 0x4061f820, + 0x59e0: 0x4061fa20, 0x59e1: 0x4061fc20, 0x59e2: 0x4061fe20, 0x59e3: 0x40620020, + 0x59e4: 0x40620220, 0x59e5: 0x40620420, 0x59e6: 0x40620620, 0x59e7: 0x40620820, + 0x59e8: 0x40620a20, 0x59e9: 0x40620c20, 0x59ea: 0x40620e20, 0x59eb: 0x40621020, + 0x59ec: 0x40621220, 0x59ed: 0x40621420, 0x59ee: 0x40621620, 0x59ef: 0x40621820, + 0x59f0: 0x40621a20, 0x59f1: 0x40621c20, 0x59f2: 0x40621e20, 0x59f3: 0x40622020, + 0x59f4: 0x40622220, 0x59f5: 0x40622420, 0x59f6: 0x40622620, 0x59f7: 0x40622820, + 0x59f8: 0x40622a20, 0x59f9: 0x40622c20, 0x59fa: 0x40622e20, 0x59fb: 0x40623020, + 0x59fc: 0x40623220, 0x59fd: 0x40623420, 0x59fe: 0x40623620, 0x59ff: 0x40623820, + // Block 0x168, offset 0x5a00 + 0x5a00: 0x40623a20, 0x5a01: 0x40623c20, 0x5a02: 0x40623e20, 0x5a03: 0x40624020, + 0x5a04: 0x40624220, 0x5a05: 0x40624420, 0x5a06: 0x40624620, 0x5a07: 0x40624820, + 0x5a08: 0x40624a20, 0x5a09: 0x40624c20, 0x5a0a: 0x40624e20, 0x5a0b: 0x40625020, + 0x5a0c: 0x40625220, 0x5a0d: 0x40625420, 0x5a0e: 0x40625620, 0x5a0f: 0x40625820, + 0x5a10: 0x40625a20, 0x5a11: 0x40625c20, 0x5a12: 0x40625e20, 0x5a13: 0x40626020, + 0x5a14: 0x40626220, 0x5a15: 0x40626420, 0x5a16: 0x40626620, 0x5a17: 0x40626820, + 0x5a18: 0x40626a20, 0x5a19: 0x40626c20, 0x5a1a: 0x40626e20, 0x5a1b: 0x40627020, + 0x5a1c: 0x40627220, 0x5a1d: 0x40627420, 0x5a1e: 0x40627620, 0x5a1f: 0x40627820, + 0x5a20: 0x40627a20, 0x5a21: 0x40627c20, 0x5a22: 0x40627e20, 0x5a23: 0x40628020, + 0x5a24: 0x40628220, 0x5a25: 0x40628420, 0x5a26: 0x40628620, 0x5a27: 0x40628820, + 0x5a28: 0x40628a20, 0x5a29: 0x40628c20, 0x5a2a: 0x40628e20, 0x5a2b: 0x40629020, + 0x5a2c: 0x40629220, 0x5a2d: 0x40629420, 0x5a2e: 0x40629620, 0x5a2f: 0x40629820, + 0x5a30: 0x40629a20, 0x5a31: 0x40629c20, 0x5a32: 0x40629e20, 0x5a33: 0x4062a020, + 0x5a34: 0x4062a220, 0x5a35: 0x4062a420, 0x5a36: 0x4062a620, 0x5a37: 0x4062a820, + 0x5a38: 0x4062aa20, + // Block 0x169, offset 0x5a40 + 0x5a40: 0x406fb620, 0x5a41: 0x406fb820, 0x5a42: 0x406fba20, 0x5a43: 0x406fbc20, + 0x5a44: 0x406fbe20, 0x5a45: 0x406fc020, 0x5a46: 0x006fbe84, 0x5a47: 0x406fc220, + 0x5a48: 0x406fc420, 0x5a49: 0x406fc620, 0x5a4a: 0x406fc820, 0x5a4b: 0x406fca20, + 0x5a4c: 0x406fcc20, 0x5a4d: 0x406fce20, 0x5a4e: 0x406fd020, 0x5a4f: 0x406fd220, + 0x5a50: 0x406fd420, 0x5a51: 0x406fd620, 0x5a52: 0x406fd820, 0x5a53: 0x006fd484, + 0x5a54: 0x406fda20, 0x5a55: 0x406fdc20, 0x5a56: 0x406fde20, 0x5a57: 0x406fe020, + 0x5a58: 0x406fe220, 0x5a59: 0x406fe420, 0x5a5a: 0x406fe620, 0x5a5b: 0x406fe820, + 0x5a5c: 0x406fea20, 0x5a5d: 0x406fec20, 0x5a5e: 0x406fee20, 0x5a5f: 0x406ff020, + 0x5a60: 0x406ff220, 0x5a61: 0x406ff420, 0x5a62: 0x406ff620, 0x5a63: 0x406ff820, + 0x5a64: 0x406ffa20, 0x5a65: 0x006ff884, 0x5a66: 0x406ffc20, 0x5a67: 0x406ffe20, + 0x5a68: 0x40700020, 0x5a69: 0x40700220, 0x5a6a: 0x40700420, 0x5a6b: 0x40700620, + 0x5a6c: 0x40700820, 0x5a6d: 0x40700a20, 0x5a6e: 0x40700c20, 0x5a6f: 0x40700e20, + 0x5a70: 0x40701020, 0x5a71: 0x40701220, 0x5a72: 0x40701420, 0x5a73: 0x40701620, + 0x5a74: 0x40701820, 0x5a75: 0x40701a20, 0x5a76: 0x40701c20, 0x5a77: 0x40701e20, + 0x5a78: 0x40702020, 0x5a79: 0x40702220, 0x5a7a: 0x40702420, 0x5a7b: 0x40702620, + 0x5a7c: 0x40702820, 0x5a7d: 0x40702a20, 0x5a7e: 0x40702c20, 0x5a7f: 0x00702a84, + // Block 0x16a, offset 0x5a80 + 0x5a80: 0x40702e20, 0x5a81: 0x40703020, 0x5a82: 0x40703220, 0x5a83: 0x40703420, + 0x5a84: 0x40703620, + 0x5a90: 0x40703820, 0x5a91: 0x40703a20, 0x5a92: 0x40703c20, 0x5a93: 0x40703e20, + 0x5a94: 0x40704020, 0x5a95: 0x40704220, 0x5a96: 0x40704420, 0x5a97: 0x40704620, + 0x5a98: 0x40704820, 0x5a99: 0x40704a20, 0x5a9a: 0x40704c20, 0x5a9b: 0x40704e20, + 0x5a9c: 0x40705020, 0x5a9d: 0x40705220, 0x5a9e: 0x40705420, 0x5a9f: 0x40705620, + 0x5aa0: 0x40705820, 0x5aa1: 0x40705a20, 0x5aa2: 0x40705c20, 0x5aa3: 0x40705e20, + 0x5aa4: 0x40706020, 0x5aa5: 0x40706220, 0x5aa6: 0x40706420, 0x5aa7: 0x40706620, + 0x5aa8: 0x40706820, 0x5aa9: 0x40706a20, 0x5aaa: 0x40706c20, 0x5aab: 0x40706e20, + 0x5aac: 0x40707020, 0x5aad: 0x40707220, 0x5aae: 0x40707420, 0x5aaf: 0x40707620, + 0x5ab0: 0x40707820, 0x5ab1: 0x40707a20, 0x5ab2: 0x40707c20, 0x5ab3: 0x40707e20, + 0x5ab4: 0x40708020, 0x5ab5: 0x40708220, 0x5ab6: 0x40708420, 0x5ab7: 0x40708620, + 0x5ab8: 0x40708820, 0x5ab9: 0x40708a20, 0x5aba: 0x40708c20, 0x5abb: 0x40708e20, + 0x5abc: 0x40709020, 0x5abd: 0x40709220, 0x5abe: 0x40709420, + // Block 0x16b, offset 0x5ac0 + 0x5acf: 0x40709620, + 0x5ad0: 0x40709820, 0x5ad1: 0x40709a20, 0x5ad2: 0x40709c20, 0x5ad3: 0x40709e20, + 0x5ad4: 0x4070a020, 0x5ad5: 0x4070a220, 0x5ad6: 0x4070a420, 0x5ad7: 0x4070a620, + 0x5ad8: 0x4070a820, 0x5ad9: 0x4070aa20, 0x5ada: 0x4070ac20, 0x5adb: 0x4070ae20, + 0x5adc: 0x4070b020, 0x5add: 0x4070b220, 0x5ade: 0x4070b420, 0x5adf: 0x4070b620, + // Block 0x16c, offset 0x5b00 + 0x5b00: 0x00657c91, 0x5b01: 0x0065c28e, + // Block 0x16d, offset 0x5b40 + 0x5b40: 0x401ba420, 0x5b41: 0x401ba620, 0x5b42: 0x401ba820, 0x5b43: 0x401baa20, + 0x5b44: 0x401bac20, 0x5b45: 0x401bae20, 0x5b46: 0x401bb020, 0x5b47: 0x401bb220, + 0x5b48: 0x401bb420, 0x5b49: 0x401bb620, 0x5b4a: 0x401bb820, 0x5b4b: 0x401bba20, + 0x5b4c: 0x401bbc20, 0x5b4d: 0x401bbe20, 0x5b4e: 0x401bc020, 0x5b4f: 0x401bc220, + 0x5b50: 0x401bc420, 0x5b51: 0x401bc620, 0x5b52: 0x401bc820, 0x5b53: 0x401bca20, + 0x5b54: 0x401bcc20, 0x5b55: 0x401bce20, 0x5b56: 0x401bd020, 0x5b57: 0x401bd220, + 0x5b58: 0x401bd420, 0x5b59: 0x401bd620, 0x5b5a: 0x401bd820, 0x5b5b: 0x401bda20, + 0x5b5c: 0x401bdc20, 0x5b5d: 0x401bde20, 0x5b5e: 0x401be020, 0x5b5f: 0x401be220, + 0x5b60: 0x401be420, 0x5b61: 0x401be620, 0x5b62: 0x401be820, 0x5b63: 0x401bea20, + 0x5b64: 0x401bec20, 0x5b65: 0x401bee20, 0x5b66: 0x401bf020, 0x5b67: 0x401bf220, + 0x5b68: 0x401bf420, 0x5b69: 0x401bf620, 0x5b6a: 0x401bf820, 0x5b6b: 0x401bfa20, + 0x5b6c: 0x401bfc20, 0x5b6d: 0x401bfe20, 0x5b6e: 0x401c0020, 0x5b6f: 0x401c0220, + 0x5b70: 0x401c0420, 0x5b71: 0x401c0620, 0x5b72: 0x401c0820, 0x5b73: 0x401c0a20, + 0x5b74: 0x401c0c20, 0x5b75: 0x401c0e20, 0x5b76: 0x401c1020, 0x5b77: 0x401c1220, + 0x5b78: 0x401c1420, 0x5b79: 0x401c1620, 0x5b7a: 0x401c1820, 0x5b7b: 0x401c1a20, + 0x5b7c: 0x401c1c20, 0x5b7d: 0x401c1e20, 0x5b7e: 0x401c2020, 0x5b7f: 0x401c2220, + // Block 0x16e, offset 0x5b80 + 0x5b80: 0x401c2420, 0x5b81: 0x401c2620, 0x5b82: 0x401c2820, 0x5b83: 0x401c2a20, + 0x5b84: 0x401c2c20, 0x5b85: 0x401c2e20, 0x5b86: 0x401c3020, 0x5b87: 0x401c3220, + 0x5b88: 0x401c3420, 0x5b89: 0x401c3620, 0x5b8a: 0x401c3820, 0x5b8b: 0x401c3a20, + 0x5b8c: 0x401c3c20, 0x5b8d: 0x401c3e20, 0x5b8e: 0x401c4020, 0x5b8f: 0x401c4220, + 0x5b90: 0x401c4420, 0x5b91: 0x401c4620, 0x5b92: 0x401c4820, 0x5b93: 0x401c4a20, + 0x5b94: 0x401c4c20, 0x5b95: 0x401c4e20, 0x5b96: 0x401c5020, 0x5b97: 0x401c5220, + 0x5b98: 0x401c5420, 0x5b99: 0x401c5620, 0x5b9a: 0x401c5820, 0x5b9b: 0x401c5a20, + 0x5b9c: 0x401c5c20, 0x5b9d: 0x401c5e20, 0x5b9e: 0x401c6020, 0x5b9f: 0x401c6220, + 0x5ba0: 0x401c6420, 0x5ba1: 0x401c6620, 0x5ba2: 0x401c6820, 0x5ba3: 0x401c6a20, + 0x5ba4: 0x401c6c20, 0x5ba5: 0x401c6e20, 0x5ba6: 0x401c7020, 0x5ba7: 0x401c7220, + 0x5ba8: 0x401c7420, 0x5ba9: 0x401c7620, 0x5baa: 0x401c7820, 0x5bab: 0x401c7a20, + 0x5bac: 0x401c7c20, 0x5bad: 0x401c7e20, 0x5bae: 0x401c8020, 0x5baf: 0x401c8220, + 0x5bb0: 0x401c8420, 0x5bb1: 0x401c8620, 0x5bb2: 0x401c8820, 0x5bb3: 0x401c8a20, + 0x5bb4: 0x401c8c20, 0x5bb5: 0x401c8e20, 0x5bb6: 0x401c9020, 0x5bb7: 0x401c9220, + 0x5bb8: 0x401c9420, 0x5bb9: 0x401c9620, 0x5bba: 0x401c9820, 0x5bbb: 0x401c9a20, + 0x5bbc: 0x401c9c20, 0x5bbd: 0x401c9e20, 0x5bbe: 0x401ca020, 0x5bbf: 0x401ca220, + // Block 0x16f, offset 0x5bc0 + 0x5bc0: 0x401ca420, 0x5bc1: 0x401ca620, 0x5bc2: 0x401ca820, 0x5bc3: 0x401caa20, + 0x5bc4: 0x401cac20, 0x5bc5: 0x401cae20, 0x5bc6: 0x401cb020, 0x5bc7: 0x401cb220, + 0x5bc8: 0x401cb420, 0x5bc9: 0x401cb620, 0x5bca: 0x401cb820, 0x5bcb: 0x401cba20, + 0x5bcc: 0x401cbc20, 0x5bcd: 0x401cbe20, 0x5bce: 0x401cc020, 0x5bcf: 0x401cc220, + 0x5bd0: 0x401cc420, 0x5bd1: 0x401cc620, 0x5bd2: 0x401cc820, 0x5bd3: 0x401cca20, + 0x5bd4: 0x401ccc20, 0x5bd5: 0x401cce20, 0x5bd6: 0x401cd020, 0x5bd7: 0x401cd220, + 0x5bd8: 0x401cd420, 0x5bd9: 0x401cd620, 0x5bda: 0x401cd820, 0x5bdb: 0x401cda20, + 0x5bdc: 0x401cdc20, 0x5bdd: 0x401cde20, 0x5bde: 0x401ce020, 0x5bdf: 0x401ce220, + 0x5be0: 0x401ce420, 0x5be1: 0x401ce620, 0x5be2: 0x401ce820, 0x5be3: 0x401cea20, + 0x5be4: 0x401cec20, 0x5be5: 0x401cee20, 0x5be6: 0x401cf020, 0x5be7: 0x401cf220, + 0x5be8: 0x401cf420, 0x5be9: 0x401cf620, 0x5bea: 0x401cf820, 0x5beb: 0x401cfa20, + 0x5bec: 0x401cfc20, 0x5bed: 0x401cfe20, 0x5bee: 0x401d0020, 0x5bef: 0x401d0220, + 0x5bf0: 0x401d0420, 0x5bf1: 0x401d0620, 0x5bf2: 0x401d0820, 0x5bf3: 0x401d0a20, + 0x5bf4: 0x401d0c20, 0x5bf5: 0x401d0e20, 0x5bf6: 0x401d1020, 0x5bf7: 0x401d1220, + 0x5bf8: 0x401d1420, 0x5bf9: 0x401d1620, 0x5bfa: 0x401d1820, 0x5bfb: 0x401d1a20, + 0x5bfc: 0x401d1c20, 0x5bfd: 0x401d1e20, 0x5bfe: 0x401d2020, 0x5bff: 0x401d2220, + // Block 0x170, offset 0x5c00 + 0x5c00: 0x401d2420, 0x5c01: 0x401d2620, 0x5c02: 0x401d2820, 0x5c03: 0x401d2a20, + 0x5c04: 0x401d2c20, 0x5c05: 0x401d2e20, 0x5c06: 0x401d3020, 0x5c07: 0x401d3220, + 0x5c08: 0x401d3420, 0x5c09: 0x401d3620, 0x5c0a: 0x401d3820, 0x5c0b: 0x401d3a20, + 0x5c0c: 0x401d3c20, 0x5c0d: 0x401d3e20, 0x5c0e: 0x401d4020, 0x5c0f: 0x401d4220, + 0x5c10: 0x401d4420, 0x5c11: 0x401d4620, 0x5c12: 0x401d4820, 0x5c13: 0x401d4a20, + 0x5c14: 0x401d4c20, 0x5c15: 0x401d4e20, 0x5c16: 0x401d5020, 0x5c17: 0x401d5220, + 0x5c18: 0x401d5420, 0x5c19: 0x401d5620, 0x5c1a: 0x401d5820, 0x5c1b: 0x401d5a20, + 0x5c1c: 0x401d5c20, 0x5c1d: 0x401d5e20, 0x5c1e: 0x401d6020, 0x5c1f: 0x401d6220, + 0x5c20: 0x401d6420, 0x5c21: 0x401d6620, 0x5c22: 0x401d6820, 0x5c23: 0x401d6a20, + 0x5c24: 0x401d6c20, 0x5c25: 0x401d6e20, 0x5c26: 0x401d7020, 0x5c27: 0x401d7220, + 0x5c28: 0x401d7420, 0x5c29: 0x401d7620, 0x5c2a: 0x401d7820, 0x5c2b: 0x401d7a20, + 0x5c2c: 0x401d7c20, 0x5c2d: 0x401d7e20, 0x5c2e: 0x401d8020, 0x5c2f: 0x401d8220, + 0x5c30: 0x401d8420, 0x5c31: 0x401d8620, 0x5c32: 0x401d8820, 0x5c33: 0x401d8a20, + 0x5c34: 0x401d8c20, 0x5c35: 0x401d8e20, + // Block 0x171, offset 0x5c40 + 0x5c40: 0x401d9020, 0x5c41: 0x401d9220, 0x5c42: 0x401d9420, 0x5c43: 0x401d9620, + 0x5c44: 0x401d9820, 0x5c45: 0x401d9a20, 0x5c46: 0x401d9c20, 0x5c47: 0x401d9e20, + 0x5c48: 0x401da020, 0x5c49: 0x401da220, 0x5c4a: 0x401da420, 0x5c4b: 0x401da620, + 0x5c4c: 0x401da820, 0x5c4d: 0x401daa20, 0x5c4e: 0x401dac20, 0x5c4f: 0x401dae20, + 0x5c50: 0x401db020, 0x5c51: 0x401db220, 0x5c52: 0x401db420, 0x5c53: 0x401db620, + 0x5c54: 0x401db820, 0x5c55: 0x401dba20, 0x5c56: 0x401dbc20, 0x5c57: 0x401dbe20, + 0x5c58: 0x401dc020, 0x5c59: 0x401dc220, 0x5c5a: 0x401dc420, 0x5c5b: 0x401dc620, + 0x5c5c: 0x401dc820, 0x5c5d: 0x401dca20, 0x5c5e: 0x401dcc20, 0x5c5f: 0x401dce20, + 0x5c60: 0x401dd020, 0x5c61: 0x401dd220, 0x5c62: 0x401dd420, 0x5c63: 0x401dd620, + 0x5c64: 0x401dd820, 0x5c65: 0x401dda20, 0x5c66: 0x401ddc20, + 0x5c69: 0x401e0420, 0x5c6a: 0x401de420, 0x5c6b: 0x401de620, + 0x5c6c: 0x401de820, 0x5c6d: 0x401dea20, 0x5c6e: 0x401dec20, 0x5c6f: 0x401dee20, + 0x5c70: 0x401df020, 0x5c71: 0x401df220, 0x5c72: 0x401df420, 0x5c73: 0x401df620, + 0x5c74: 0x401df820, 0x5c75: 0x401dfa20, 0x5c76: 0x401dfc20, 0x5c77: 0x401dfe20, + 0x5c78: 0x401e0020, 0x5c79: 0x401e0220, 0x5c7a: 0x401e0620, 0x5c7b: 0x401e0820, + 0x5c7c: 0x401e0a20, 0x5c7d: 0x401e0c20, 0x5c7e: 0x401e0e20, 0x5c7f: 0x401e1020, + // Block 0x172, offset 0x5c80 + 0x5c80: 0x401e1220, 0x5c81: 0x401e1420, 0x5c82: 0x401e1620, 0x5c83: 0x401e1820, + 0x5c84: 0x401e1a20, 0x5c85: 0x401e1c20, 0x5c86: 0x401e1e20, 0x5c87: 0x401e2020, + 0x5c88: 0x401e2220, 0x5c89: 0x401e2420, 0x5c8a: 0x401e2620, 0x5c8b: 0x401e2820, + 0x5c8c: 0x401e2a20, 0x5c8d: 0x401e2c20, 0x5c8e: 0x401e2e20, 0x5c8f: 0x401e3020, + 0x5c90: 0x401e3220, 0x5c91: 0x401e3420, 0x5c92: 0x401e3620, 0x5c93: 0x401e3820, + 0x5c94: 0x401e3a20, 0x5c95: 0x401e3c20, 0x5c96: 0x401e3e20, 0x5c97: 0x401e4020, + 0x5c98: 0x401e4220, 0x5c99: 0x401e4420, 0x5c9a: 0x401e4620, 0x5c9b: 0x401e4820, + 0x5c9c: 0x401e4a20, 0x5c9d: 0x401e4c20, 0x5c9e: 0x401e4020, 0x5c9f: 0x401e4220, + 0x5ca0: 0x401e4220, 0x5ca1: 0x401e4220, 0x5ca2: 0x401e4220, 0x5ca3: 0x401e4220, + 0x5ca4: 0x401e4220, 0x5ca5: 0xad800000, 0x5ca6: 0xad800000, 0x5ca7: 0xa0100000, + 0x5ca8: 0xa0100000, 0x5ca9: 0xa0100000, 0x5caa: 0x401e4e20, 0x5cab: 0x401e5020, + 0x5cac: 0x401e5220, 0x5cad: 0xae200000, 0x5cae: 0xad800000, 0x5caf: 0xad800000, + 0x5cb0: 0xad800000, 0x5cb1: 0xad800000, 0x5cb2: 0xad800000, 0x5cb3: 0xa0000000, + 0x5cb4: 0xa0000000, 0x5cb5: 0xa0000000, 0x5cb6: 0xa0000000, 0x5cb7: 0xa0000000, + 0x5cb8: 0xa0000000, 0x5cb9: 0xa0000000, 0x5cba: 0xa0000000, 0x5cbb: 0xadc00000, + 0x5cbc: 0xadc00000, 0x5cbd: 0xadc00000, 0x5cbe: 0xadc00000, 0x5cbf: 0xadc00000, + // Block 0x173, offset 0x5cc0 + 0x5cc0: 0xadc00000, 0x5cc1: 0xadc00000, 0x5cc2: 0xadc00000, 0x5cc3: 0x401e5420, + 0x5cc4: 0x401e5620, 0x5cc5: 0xae600000, 0x5cc6: 0xae600000, 0x5cc7: 0xae600000, + 0x5cc8: 0xae600000, 0x5cc9: 0xae600000, 0x5cca: 0xadc00000, 0x5ccb: 0xadc00000, + 0x5ccc: 0x401e5820, 0x5ccd: 0x401e5a20, 0x5cce: 0x401e5c20, 0x5ccf: 0x401e5e20, + 0x5cd0: 0x401e6020, 0x5cd1: 0x401e6220, 0x5cd2: 0x401e6420, 0x5cd3: 0x401e6620, + 0x5cd4: 0x401e6820, 0x5cd5: 0x401e6a20, 0x5cd6: 0x401e6c20, 0x5cd7: 0x401e6e20, + 0x5cd8: 0x401e7020, 0x5cd9: 0x401e7220, 0x5cda: 0x401e7420, 0x5cdb: 0x401e7620, + 0x5cdc: 0x401e7820, 0x5cdd: 0x401e7a20, 0x5cde: 0x401e7c20, 0x5cdf: 0x401e7e20, + 0x5ce0: 0x401e8020, 0x5ce1: 0x401e8220, 0x5ce2: 0x401e8420, 0x5ce3: 0x401e8620, + 0x5ce4: 0x401e8820, 0x5ce5: 0x401e8a20, 0x5ce6: 0x401e8c20, 0x5ce7: 0x401e8e20, + 0x5ce8: 0x401e9020, 0x5ce9: 0x401e9220, 0x5cea: 0xae600000, 0x5ceb: 0xae600000, + 0x5cec: 0xae600000, 0x5ced: 0xae600000, 0x5cee: 0x401e9420, 0x5cef: 0x401e9620, + 0x5cf0: 0x401e9820, 0x5cf1: 0x401e9a20, 0x5cf2: 0x401e9c20, 0x5cf3: 0x401e9e20, + 0x5cf4: 0x401ea020, 0x5cf5: 0x401ea220, 0x5cf6: 0x401ea420, 0x5cf7: 0x401ea620, + 0x5cf8: 0x401ea820, 0x5cf9: 0x401eaa20, 0x5cfa: 0x401eac20, 0x5cfb: 0x401eaa20, + 0x5cfc: 0x401eac20, 0x5cfd: 0x401eaa20, 0x5cfe: 0x401eac20, 0x5cff: 0x401eaa20, + // Block 0x174, offset 0x5d00 + 0x5d00: 0x401eac20, 0x5d01: 0x401eae20, 0x5d02: 0x401eb020, 0x5d03: 0x401eb220, + 0x5d04: 0x401eb420, 0x5d05: 0x401eb620, 0x5d06: 0x401eb820, 0x5d07: 0x401eba20, + 0x5d08: 0x401ebc20, 0x5d09: 0x401ebe20, 0x5d0a: 0x401ec020, 0x5d0b: 0x401ec220, + 0x5d0c: 0x401ec420, 0x5d0d: 0x401ec620, 0x5d0e: 0x401ec820, 0x5d0f: 0x401eca20, + 0x5d10: 0x401ecc20, 0x5d11: 0x401ece20, 0x5d12: 0x401ed020, 0x5d13: 0x401ed220, + 0x5d14: 0x401ed420, 0x5d15: 0x401ed620, 0x5d16: 0x401ed820, 0x5d17: 0x401eda20, + 0x5d18: 0x401edc20, 0x5d19: 0x401ede20, 0x5d1a: 0x401ee020, 0x5d1b: 0x401ee220, + 0x5d1c: 0x401ee420, 0x5d1d: 0x401ee620, + // Block 0x175, offset 0x5d40 + 0x5d40: 0x401ee820, 0x5d41: 0x401eea20, 0x5d42: 0x401eec20, 0x5d43: 0x401eee20, + 0x5d44: 0x401ef020, 0x5d45: 0x401ef220, 0x5d46: 0x401ef420, 0x5d47: 0x401ef620, + 0x5d48: 0x401ef820, 0x5d49: 0x401efa20, 0x5d4a: 0x401efc20, 0x5d4b: 0x401efe20, + 0x5d4c: 0x401f0020, 0x5d4d: 0x401f0220, 0x5d4e: 0x401f0420, 0x5d4f: 0x401f0620, + 0x5d50: 0x401f0820, 0x5d51: 0x401f0a20, 0x5d52: 0x401f0c20, 0x5d53: 0x401f0e20, + 0x5d54: 0x401f1020, 0x5d55: 0x401f1220, 0x5d56: 0x401f1420, 0x5d57: 0x401f1620, + 0x5d58: 0x401f1820, 0x5d59: 0x401f1a20, 0x5d5a: 0x401f1c20, 0x5d5b: 0x401f1e20, + 0x5d5c: 0x401f2020, 0x5d5d: 0x401f2220, 0x5d5e: 0x401f2420, 0x5d5f: 0x401f2620, + 0x5d60: 0x401f2820, 0x5d61: 0x401f2a20, 0x5d62: 0x401f2c20, 0x5d63: 0x401f2e20, + 0x5d64: 0x401f3020, 0x5d65: 0x401f3220, 0x5d66: 0x401f3420, 0x5d67: 0x401f3620, + 0x5d68: 0x401f3820, 0x5d69: 0x401f3a20, 0x5d6a: 0x401f3c20, 0x5d6b: 0x401f3e20, + 0x5d6c: 0x401f4020, 0x5d6d: 0x401f4220, 0x5d6e: 0x401f4420, 0x5d6f: 0x401f4620, + 0x5d70: 0x401f4820, 0x5d71: 0x401f4a20, 0x5d72: 0x401f4c20, 0x5d73: 0x401f4e20, + 0x5d74: 0x401f5020, 0x5d75: 0x401f5220, 0x5d76: 0x401f5420, 0x5d77: 0x401f5620, + 0x5d78: 0x401f5820, 0x5d79: 0x401f5a20, 0x5d7a: 0x401f5c20, 0x5d7b: 0x401f5e20, + 0x5d7c: 0x401f6020, 0x5d7d: 0x401f6220, 0x5d7e: 0x401f6420, 0x5d7f: 0x401f6620, + // Block 0x176, offset 0x5d80 + 0x5d80: 0x401f6820, 0x5d81: 0x401f6a20, 0x5d82: 0xae600000, 0x5d83: 0xae600000, + 0x5d84: 0xae600000, 0x5d85: 0x401f6c20, + // Block 0x177, offset 0x5dc0 + 0x5dc0: 0x4019e220, 0x5dc1: 0x4019e420, 0x5dc2: 0x4019e620, 0x5dc3: 0x4019e820, + 0x5dc4: 0x4019ea20, 0x5dc5: 0x4019ec20, 0x5dc6: 0x4019ee20, 0x5dc7: 0x4019f020, + 0x5dc8: 0x4019f220, 0x5dc9: 0x4019f420, 0x5dca: 0x4019f620, 0x5dcb: 0x4019f820, + 0x5dcc: 0x4019fa20, 0x5dcd: 0x4019fc20, 0x5dce: 0x4019fe20, 0x5dcf: 0x401a0020, + 0x5dd0: 0x401a0220, 0x5dd1: 0x401a0420, 0x5dd2: 0x401a0620, 0x5dd3: 0x401a0820, + 0x5dd4: 0x401a0a20, 0x5dd5: 0x401a0c20, 0x5dd6: 0x401a0e20, 0x5dd7: 0x401a1020, + 0x5dd8: 0x401a1220, 0x5dd9: 0x401a1420, 0x5dda: 0x401a1620, 0x5ddb: 0x401a1820, + 0x5ddc: 0x401a1a20, 0x5ddd: 0x401a1c20, 0x5dde: 0x401a1e20, 0x5ddf: 0x401a2020, + 0x5de0: 0x401a2220, 0x5de1: 0x401a2420, 0x5de2: 0x401a2620, 0x5de3: 0x401a2820, + 0x5de4: 0x401a2a20, 0x5de5: 0x401a2c20, 0x5de6: 0x401a2e20, 0x5de7: 0x401a3020, + 0x5de8: 0x401a3220, 0x5de9: 0x401a3420, 0x5dea: 0x401a3620, 0x5deb: 0x401a3820, + 0x5dec: 0x401a3a20, 0x5ded: 0x401a3c20, 0x5dee: 0x401a3e20, 0x5def: 0x401a4020, + 0x5df0: 0x401a4220, 0x5df1: 0x401a4420, 0x5df2: 0x401a4620, 0x5df3: 0x401a4820, + 0x5df4: 0x401a4a20, 0x5df5: 0x401a4c20, 0x5df6: 0x401a4e20, 0x5df7: 0x401a5020, + 0x5df8: 0x401a5220, 0x5df9: 0x401a5420, 0x5dfa: 0x401a5620, 0x5dfb: 0x401a5820, + 0x5dfc: 0x401a5a20, 0x5dfd: 0x401a5c20, 0x5dfe: 0x401a5e20, 0x5dff: 0x401a6020, + // Block 0x178, offset 0x5e00 + 0x5e00: 0x401a6220, 0x5e01: 0x401a6420, 0x5e02: 0x401a6620, 0x5e03: 0x401a6820, + 0x5e04: 0x401a6a20, 0x5e05: 0x401a6c20, 0x5e06: 0x401a6e20, 0x5e07: 0x401a7020, + 0x5e08: 0x401a7220, 0x5e09: 0x401a7420, 0x5e0a: 0x401a7620, 0x5e0b: 0x401a7820, + 0x5e0c: 0x401a7a20, 0x5e0d: 0x401a7c20, 0x5e0e: 0x401a7e20, 0x5e0f: 0x401a8020, + 0x5e10: 0x401a8220, 0x5e11: 0x401a8420, 0x5e12: 0x401a8620, 0x5e13: 0x401a8820, + 0x5e14: 0x401a8a20, 0x5e15: 0x401a8c20, 0x5e16: 0x401a8e20, + 0x5e20: 0xe00002af, 0x5e21: 0xe00003ca, 0x5e22: 0xe00004a4, 0x5e23: 0xe0000576, + 0x5e24: 0xe000063d, 0x5e25: 0xe00006ed, 0x5e26: 0xe0000795, 0x5e27: 0xe000083e, + 0x5e28: 0xe00008e9, 0x5e29: 0x4029ba20, 0x5e2a: 0x4029bc20, 0x5e2b: 0x4029be20, + 0x5e2c: 0x4029c020, 0x5e2d: 0x4029c220, 0x5e2e: 0x4029c420, 0x5e2f: 0x4029c620, + 0x5e30: 0x4029c820, 0x5e31: 0x4029ca20, + // Block 0x179, offset 0x5e40 + 0x5e40: 0x002bde8b, 0x5e41: 0x002c0a8b, 0x5e42: 0x002c3a8b, 0x5e43: 0x002c628b, + 0x5e44: 0x002c988b, 0x5e45: 0x002d088b, 0x5e46: 0x002d228b, 0x5e47: 0x002d688b, + 0x5e48: 0x002d9a8b, 0x5e49: 0x002dcc8b, 0x5e4a: 0x002dfe8b, 0x5e4b: 0x002e228b, + 0x5e4c: 0x002e828b, 0x5e4d: 0x002e9e8b, 0x5e4e: 0x002ee28b, 0x5e4f: 0x002f2c8b, + 0x5e50: 0x002f568b, 0x5e51: 0x002f7a8b, 0x5e52: 0x002fe68b, 0x5e53: 0x00302c8b, + 0x5e54: 0x00306c8b, 0x5e55: 0x0030be8b, 0x5e56: 0x0030e28b, 0x5e57: 0x0030f68b, + 0x5e58: 0x0031008b, 0x5e59: 0x00312a8b, 0x5e5a: 0x002bde85, 0x5e5b: 0x002c0a85, + 0x5e5c: 0x002c3a85, 0x5e5d: 0x002c6285, 0x5e5e: 0x002c9885, 0x5e5f: 0x002d0885, + 0x5e60: 0x002d2285, 0x5e61: 0x002d6885, 0x5e62: 0x002d9a85, 0x5e63: 0x002dcc85, + 0x5e64: 0x002dfe85, 0x5e65: 0x002e2285, 0x5e66: 0x002e8285, 0x5e67: 0x002e9e85, + 0x5e68: 0x002ee285, 0x5e69: 0x002f2c85, 0x5e6a: 0x002f5685, 0x5e6b: 0x002f7a85, + 0x5e6c: 0x002fe685, 0x5e6d: 0x00302c85, 0x5e6e: 0x00306c85, 0x5e6f: 0x0030be85, + 0x5e70: 0x0030e285, 0x5e71: 0x0030f685, 0x5e72: 0x00310085, 0x5e73: 0x00312a85, + 0x5e74: 0x002bde8b, 0x5e75: 0x002c0a8b, 0x5e76: 0x002c3a8b, 0x5e77: 0x002c628b, + 0x5e78: 0x002c988b, 0x5e79: 0x002d088b, 0x5e7a: 0x002d228b, 0x5e7b: 0x002d688b, + 0x5e7c: 0x002d9a8b, 0x5e7d: 0x002dcc8b, 0x5e7e: 0x002dfe8b, 0x5e7f: 0x002e228b, + // Block 0x17a, offset 0x5e80 + 0x5e80: 0x002e828b, 0x5e81: 0x002e9e8b, 0x5e82: 0x002ee28b, 0x5e83: 0x002f2c8b, + 0x5e84: 0x002f568b, 0x5e85: 0x002f7a8b, 0x5e86: 0x002fe68b, 0x5e87: 0x00302c8b, + 0x5e88: 0x00306c8b, 0x5e89: 0x0030be8b, 0x5e8a: 0x0030e28b, 0x5e8b: 0x0030f68b, + 0x5e8c: 0x0031008b, 0x5e8d: 0x00312a8b, 0x5e8e: 0x002bde85, 0x5e8f: 0x002c0a85, + 0x5e90: 0x002c3a85, 0x5e91: 0x002c6285, 0x5e92: 0x002c9885, 0x5e93: 0x002d0885, + 0x5e94: 0x002d2285, 0x5e96: 0x002d9a85, 0x5e97: 0x002dcc85, + 0x5e98: 0x002dfe85, 0x5e99: 0x002e2285, 0x5e9a: 0x002e8285, 0x5e9b: 0x002e9e85, + 0x5e9c: 0x002ee285, 0x5e9d: 0x002f2c85, 0x5e9e: 0x002f5685, 0x5e9f: 0x002f7a85, + 0x5ea0: 0x002fe685, 0x5ea1: 0x00302c85, 0x5ea2: 0x00306c85, 0x5ea3: 0x0030be85, + 0x5ea4: 0x0030e285, 0x5ea5: 0x0030f685, 0x5ea6: 0x00310085, 0x5ea7: 0x00312a85, + 0x5ea8: 0x002bde8b, 0x5ea9: 0x002c0a8b, 0x5eaa: 0x002c3a8b, 0x5eab: 0x002c628b, + 0x5eac: 0x002c988b, 0x5ead: 0x002d088b, 0x5eae: 0x002d228b, 0x5eaf: 0x002d688b, + 0x5eb0: 0x002d9a8b, 0x5eb1: 0x002dcc8b, 0x5eb2: 0x002dfe8b, 0x5eb3: 0x002e228b, + 0x5eb4: 0x002e828b, 0x5eb5: 0x002e9e8b, 0x5eb6: 0x002ee28b, 0x5eb7: 0x002f2c8b, + 0x5eb8: 0x002f568b, 0x5eb9: 0x002f7a8b, 0x5eba: 0x002fe68b, 0x5ebb: 0x00302c8b, + 0x5ebc: 0x00306c8b, 0x5ebd: 0x0030be8b, 0x5ebe: 0x0030e28b, 0x5ebf: 0x0030f68b, + // Block 0x17b, offset 0x5ec0 + 0x5ec0: 0x0031008b, 0x5ec1: 0x00312a8b, 0x5ec2: 0x002bde85, 0x5ec3: 0x002c0a85, + 0x5ec4: 0x002c3a85, 0x5ec5: 0x002c6285, 0x5ec6: 0x002c9885, 0x5ec7: 0x002d0885, + 0x5ec8: 0x002d2285, 0x5ec9: 0x002d6885, 0x5eca: 0x002d9a85, 0x5ecb: 0x002dcc85, + 0x5ecc: 0x002dfe85, 0x5ecd: 0x002e2285, 0x5ece: 0x002e8285, 0x5ecf: 0x002e9e85, + 0x5ed0: 0x002ee285, 0x5ed1: 0x002f2c85, 0x5ed2: 0x002f5685, 0x5ed3: 0x002f7a85, + 0x5ed4: 0x002fe685, 0x5ed5: 0x00302c85, 0x5ed6: 0x00306c85, 0x5ed7: 0x0030be85, + 0x5ed8: 0x0030e285, 0x5ed9: 0x0030f685, 0x5eda: 0x00310085, 0x5edb: 0x00312a85, + 0x5edc: 0x002bde8b, 0x5ede: 0x002c3a8b, 0x5edf: 0x002c628b, + 0x5ee2: 0x002d228b, + 0x5ee5: 0x002dcc8b, 0x5ee6: 0x002dfe8b, + 0x5ee9: 0x002e9e8b, 0x5eea: 0x002ee28b, 0x5eeb: 0x002f2c8b, + 0x5eec: 0x002f568b, 0x5eee: 0x002fe68b, 0x5eef: 0x00302c8b, + 0x5ef0: 0x00306c8b, 0x5ef1: 0x0030be8b, 0x5ef2: 0x0030e28b, 0x5ef3: 0x0030f68b, + 0x5ef4: 0x0031008b, 0x5ef5: 0x00312a8b, 0x5ef6: 0x002bde85, 0x5ef7: 0x002c0a85, + 0x5ef8: 0x002c3a85, 0x5ef9: 0x002c6285, 0x5efb: 0x002d0885, + 0x5efd: 0x002d6885, 0x5efe: 0x002d9a85, 0x5eff: 0x002dcc85, + // Block 0x17c, offset 0x5f00 + 0x5f00: 0x002dfe85, 0x5f01: 0x002e2285, 0x5f02: 0x002e8285, 0x5f03: 0x002e9e85, + 0x5f05: 0x002f2c85, 0x5f06: 0x002f5685, 0x5f07: 0x002f7a85, + 0x5f08: 0x002fe685, 0x5f09: 0x00302c85, 0x5f0a: 0x00306c85, 0x5f0b: 0x0030be85, + 0x5f0c: 0x0030e285, 0x5f0d: 0x0030f685, 0x5f0e: 0x00310085, 0x5f0f: 0x00312a85, + 0x5f10: 0x002bde8b, 0x5f11: 0x002c0a8b, 0x5f12: 0x002c3a8b, 0x5f13: 0x002c628b, + 0x5f14: 0x002c988b, 0x5f15: 0x002d088b, 0x5f16: 0x002d228b, 0x5f17: 0x002d688b, + 0x5f18: 0x002d9a8b, 0x5f19: 0x002dcc8b, 0x5f1a: 0x002dfe8b, 0x5f1b: 0x002e228b, + 0x5f1c: 0x002e828b, 0x5f1d: 0x002e9e8b, 0x5f1e: 0x002ee28b, 0x5f1f: 0x002f2c8b, + 0x5f20: 0x002f568b, 0x5f21: 0x002f7a8b, 0x5f22: 0x002fe68b, 0x5f23: 0x00302c8b, + 0x5f24: 0x00306c8b, 0x5f25: 0x0030be8b, 0x5f26: 0x0030e28b, 0x5f27: 0x0030f68b, + 0x5f28: 0x0031008b, 0x5f29: 0x00312a8b, 0x5f2a: 0x002bde85, 0x5f2b: 0x002c0a85, + 0x5f2c: 0x002c3a85, 0x5f2d: 0x002c6285, 0x5f2e: 0x002c9885, 0x5f2f: 0x002d0885, + 0x5f30: 0x002d2285, 0x5f31: 0x002d6885, 0x5f32: 0x002d9a85, 0x5f33: 0x002dcc85, + 0x5f34: 0x002dfe85, 0x5f35: 0x002e2285, 0x5f36: 0x002e8285, 0x5f37: 0x002e9e85, + 0x5f38: 0x002ee285, 0x5f39: 0x002f2c85, 0x5f3a: 0x002f5685, 0x5f3b: 0x002f7a85, + 0x5f3c: 0x002fe685, 0x5f3d: 0x00302c85, 0x5f3e: 0x00306c85, 0x5f3f: 0x0030be85, + // Block 0x17d, offset 0x5f40 + 0x5f40: 0x0030e285, 0x5f41: 0x0030f685, 0x5f42: 0x00310085, 0x5f43: 0x00312a85, + 0x5f44: 0x002bde8b, 0x5f45: 0x002c0a8b, 0x5f47: 0x002c628b, + 0x5f48: 0x002c988b, 0x5f49: 0x002d088b, 0x5f4a: 0x002d228b, + 0x5f4d: 0x002dcc8b, 0x5f4e: 0x002dfe8b, 0x5f4f: 0x002e228b, + 0x5f50: 0x002e828b, 0x5f51: 0x002e9e8b, 0x5f52: 0x002ee28b, 0x5f53: 0x002f2c8b, + 0x5f54: 0x002f568b, 0x5f56: 0x002fe68b, 0x5f57: 0x00302c8b, + 0x5f58: 0x00306c8b, 0x5f59: 0x0030be8b, 0x5f5a: 0x0030e28b, 0x5f5b: 0x0030f68b, + 0x5f5c: 0x0031008b, 0x5f5e: 0x002bde85, 0x5f5f: 0x002c0a85, + 0x5f60: 0x002c3a85, 0x5f61: 0x002c6285, 0x5f62: 0x002c9885, 0x5f63: 0x002d0885, + 0x5f64: 0x002d2285, 0x5f65: 0x002d6885, 0x5f66: 0x002d9a85, 0x5f67: 0x002dcc85, + 0x5f68: 0x002dfe85, 0x5f69: 0x002e2285, 0x5f6a: 0x002e8285, 0x5f6b: 0x002e9e85, + 0x5f6c: 0x002ee285, 0x5f6d: 0x002f2c85, 0x5f6e: 0x002f5685, 0x5f6f: 0x002f7a85, + 0x5f70: 0x002fe685, 0x5f71: 0x00302c85, 0x5f72: 0x00306c85, 0x5f73: 0x0030be85, + 0x5f74: 0x0030e285, 0x5f75: 0x0030f685, 0x5f76: 0x00310085, 0x5f77: 0x00312a85, + 0x5f78: 0x002bde8b, 0x5f79: 0x002c0a8b, 0x5f7b: 0x002c628b, + 0x5f7c: 0x002c988b, 0x5f7d: 0x002d088b, 0x5f7e: 0x002d228b, + // Block 0x17e, offset 0x5f80 + 0x5f80: 0x002d9a8b, 0x5f81: 0x002dcc8b, 0x5f82: 0x002dfe8b, 0x5f83: 0x002e228b, + 0x5f84: 0x002e828b, 0x5f86: 0x002ee28b, + 0x5f8a: 0x002fe68b, 0x5f8b: 0x00302c8b, + 0x5f8c: 0x00306c8b, 0x5f8d: 0x0030be8b, 0x5f8e: 0x0030e28b, 0x5f8f: 0x0030f68b, + 0x5f90: 0x0031008b, 0x5f92: 0x002bde85, 0x5f93: 0x002c0a85, + 0x5f94: 0x002c3a85, 0x5f95: 0x002c6285, 0x5f96: 0x002c9885, 0x5f97: 0x002d0885, + 0x5f98: 0x002d2285, 0x5f99: 0x002d6885, 0x5f9a: 0x002d9a85, 0x5f9b: 0x002dcc85, + 0x5f9c: 0x002dfe85, 0x5f9d: 0x002e2285, 0x5f9e: 0x002e8285, 0x5f9f: 0x002e9e85, + 0x5fa0: 0x002ee285, 0x5fa1: 0x002f2c85, 0x5fa2: 0x002f5685, 0x5fa3: 0x002f7a85, + 0x5fa4: 0x002fe685, 0x5fa5: 0x00302c85, 0x5fa6: 0x00306c85, 0x5fa7: 0x0030be85, + 0x5fa8: 0x0030e285, 0x5fa9: 0x0030f685, 0x5faa: 0x00310085, 0x5fab: 0x00312a85, + 0x5fac: 0x002bde8b, 0x5fad: 0x002c0a8b, 0x5fae: 0x002c3a8b, 0x5faf: 0x002c628b, + 0x5fb0: 0x002c988b, 0x5fb1: 0x002d088b, 0x5fb2: 0x002d228b, 0x5fb3: 0x002d688b, + 0x5fb4: 0x002d9a8b, 0x5fb5: 0x002dcc8b, 0x5fb6: 0x002dfe8b, 0x5fb7: 0x002e228b, + 0x5fb8: 0x002e828b, 0x5fb9: 0x002e9e8b, 0x5fba: 0x002ee28b, 0x5fbb: 0x002f2c8b, + 0x5fbc: 0x002f568b, 0x5fbd: 0x002f7a8b, 0x5fbe: 0x002fe68b, 0x5fbf: 0x00302c8b, + // Block 0x17f, offset 0x5fc0 + 0x5fc0: 0x00306c8b, 0x5fc1: 0x0030be8b, 0x5fc2: 0x0030e28b, 0x5fc3: 0x0030f68b, + 0x5fc4: 0x0031008b, 0x5fc5: 0x00312a8b, 0x5fc6: 0x002bde85, 0x5fc7: 0x002c0a85, + 0x5fc8: 0x002c3a85, 0x5fc9: 0x002c6285, 0x5fca: 0x002c9885, 0x5fcb: 0x002d0885, + 0x5fcc: 0x002d2285, 0x5fcd: 0x002d6885, 0x5fce: 0x002d9a85, 0x5fcf: 0x002dcc85, + 0x5fd0: 0x002dfe85, 0x5fd1: 0x002e2285, 0x5fd2: 0x002e8285, 0x5fd3: 0x002e9e85, + 0x5fd4: 0x002ee285, 0x5fd5: 0x002f2c85, 0x5fd6: 0x002f5685, 0x5fd7: 0x002f7a85, + 0x5fd8: 0x002fe685, 0x5fd9: 0x00302c85, 0x5fda: 0x00306c85, 0x5fdb: 0x0030be85, + 0x5fdc: 0x0030e285, 0x5fdd: 0x0030f685, 0x5fde: 0x00310085, 0x5fdf: 0x00312a85, + 0x5fe0: 0x002bde8b, 0x5fe1: 0x002c0a8b, 0x5fe2: 0x002c3a8b, 0x5fe3: 0x002c628b, + 0x5fe4: 0x002c988b, 0x5fe5: 0x002d088b, 0x5fe6: 0x002d228b, 0x5fe7: 0x002d688b, + 0x5fe8: 0x002d9a8b, 0x5fe9: 0x002dcc8b, 0x5fea: 0x002dfe8b, 0x5feb: 0x002e228b, + 0x5fec: 0x002e828b, 0x5fed: 0x002e9e8b, 0x5fee: 0x002ee28b, 0x5fef: 0x002f2c8b, + 0x5ff0: 0x002f568b, 0x5ff1: 0x002f7a8b, 0x5ff2: 0x002fe68b, 0x5ff3: 0x00302c8b, + 0x5ff4: 0x00306c8b, 0x5ff5: 0x0030be8b, 0x5ff6: 0x0030e28b, 0x5ff7: 0x0030f68b, + 0x5ff8: 0x0031008b, 0x5ff9: 0x00312a8b, 0x5ffa: 0x002bde85, 0x5ffb: 0x002c0a85, + 0x5ffc: 0x002c3a85, 0x5ffd: 0x002c6285, 0x5ffe: 0x002c9885, 0x5fff: 0x002d0885, + // Block 0x180, offset 0x6000 + 0x6000: 0x002d2285, 0x6001: 0x002d6885, 0x6002: 0x002d9a85, 0x6003: 0x002dcc85, + 0x6004: 0x002dfe85, 0x6005: 0x002e2285, 0x6006: 0x002e8285, 0x6007: 0x002e9e85, + 0x6008: 0x002ee285, 0x6009: 0x002f2c85, 0x600a: 0x002f5685, 0x600b: 0x002f7a85, + 0x600c: 0x002fe685, 0x600d: 0x00302c85, 0x600e: 0x00306c85, 0x600f: 0x0030be85, + 0x6010: 0x0030e285, 0x6011: 0x0030f685, 0x6012: 0x00310085, 0x6013: 0x00312a85, + 0x6014: 0x002bde8b, 0x6015: 0x002c0a8b, 0x6016: 0x002c3a8b, 0x6017: 0x002c628b, + 0x6018: 0x002c988b, 0x6019: 0x002d088b, 0x601a: 0x002d228b, 0x601b: 0x002d688b, + 0x601c: 0x002d9a8b, 0x601d: 0x002dcc8b, 0x601e: 0x002dfe8b, 0x601f: 0x002e228b, + 0x6020: 0x002e828b, 0x6021: 0x002e9e8b, 0x6022: 0x002ee28b, 0x6023: 0x002f2c8b, + 0x6024: 0x002f568b, 0x6025: 0x002f7a8b, 0x6026: 0x002fe68b, 0x6027: 0x00302c8b, + 0x6028: 0x00306c8b, 0x6029: 0x0030be8b, 0x602a: 0x0030e28b, 0x602b: 0x0030f68b, + 0x602c: 0x0031008b, 0x602d: 0x00312a8b, 0x602e: 0x002bde85, 0x602f: 0x002c0a85, + 0x6030: 0x002c3a85, 0x6031: 0x002c6285, 0x6032: 0x002c9885, 0x6033: 0x002d0885, + 0x6034: 0x002d2285, 0x6035: 0x002d6885, 0x6036: 0x002d9a85, 0x6037: 0x002dcc85, + 0x6038: 0x002dfe85, 0x6039: 0x002e2285, 0x603a: 0x002e8285, 0x603b: 0x002e9e85, + 0x603c: 0x002ee285, 0x603d: 0x002f2c85, 0x603e: 0x002f5685, 0x603f: 0x002f7a85, + // Block 0x181, offset 0x6040 + 0x6040: 0x002fe685, 0x6041: 0x00302c85, 0x6042: 0x00306c85, 0x6043: 0x0030be85, + 0x6044: 0x0030e285, 0x6045: 0x0030f685, 0x6046: 0x00310085, 0x6047: 0x00312a85, + 0x6048: 0x002bde8b, 0x6049: 0x002c0a8b, 0x604a: 0x002c3a8b, 0x604b: 0x002c628b, + 0x604c: 0x002c988b, 0x604d: 0x002d088b, 0x604e: 0x002d228b, 0x604f: 0x002d688b, + 0x6050: 0x002d9a8b, 0x6051: 0x002dcc8b, 0x6052: 0x002dfe8b, 0x6053: 0x002e228b, + 0x6054: 0x002e828b, 0x6055: 0x002e9e8b, 0x6056: 0x002ee28b, 0x6057: 0x002f2c8b, + 0x6058: 0x002f568b, 0x6059: 0x002f7a8b, 0x605a: 0x002fe68b, 0x605b: 0x00302c8b, + 0x605c: 0x00306c8b, 0x605d: 0x0030be8b, 0x605e: 0x0030e28b, 0x605f: 0x0030f68b, + 0x6060: 0x0031008b, 0x6061: 0x00312a8b, 0x6062: 0x002bde85, 0x6063: 0x002c0a85, + 0x6064: 0x002c3a85, 0x6065: 0x002c6285, 0x6066: 0x002c9885, 0x6067: 0x002d0885, + 0x6068: 0x002d2285, 0x6069: 0x002d6885, 0x606a: 0x002d9a85, 0x606b: 0x002dcc85, + 0x606c: 0x002dfe85, 0x606d: 0x002e2285, 0x606e: 0x002e8285, 0x606f: 0x002e9e85, + 0x6070: 0x002ee285, 0x6071: 0x002f2c85, 0x6072: 0x002f5685, 0x6073: 0x002f7a85, + 0x6074: 0x002fe685, 0x6075: 0x00302c85, 0x6076: 0x00306c85, 0x6077: 0x0030be85, + 0x6078: 0x0030e285, 0x6079: 0x0030f685, 0x607a: 0x00310085, 0x607b: 0x00312a85, + 0x607c: 0x002bde8b, 0x607d: 0x002c0a8b, 0x607e: 0x002c3a8b, 0x607f: 0x002c628b, + // Block 0x182, offset 0x6080 + 0x6080: 0x002c988b, 0x6081: 0x002d088b, 0x6082: 0x002d228b, 0x6083: 0x002d688b, + 0x6084: 0x002d9a8b, 0x6085: 0x002dcc8b, 0x6086: 0x002dfe8b, 0x6087: 0x002e228b, + 0x6088: 0x002e828b, 0x6089: 0x002e9e8b, 0x608a: 0x002ee28b, 0x608b: 0x002f2c8b, + 0x608c: 0x002f568b, 0x608d: 0x002f7a8b, 0x608e: 0x002fe68b, 0x608f: 0x00302c8b, + 0x6090: 0x00306c8b, 0x6091: 0x0030be8b, 0x6092: 0x0030e28b, 0x6093: 0x0030f68b, + 0x6094: 0x0031008b, 0x6095: 0x00312a8b, 0x6096: 0x002bde85, 0x6097: 0x002c0a85, + 0x6098: 0x002c3a85, 0x6099: 0x002c6285, 0x609a: 0x002c9885, 0x609b: 0x002d0885, + 0x609c: 0x002d2285, 0x609d: 0x002d6885, 0x609e: 0x002d9a85, 0x609f: 0x002dcc85, + 0x60a0: 0x002dfe85, 0x60a1: 0x002e2285, 0x60a2: 0x002e8285, 0x60a3: 0x002e9e85, + 0x60a4: 0x002ee285, 0x60a5: 0x002f2c85, 0x60a6: 0x002f5685, 0x60a7: 0x002f7a85, + 0x60a8: 0x002fe685, 0x60a9: 0x00302c85, 0x60aa: 0x00306c85, 0x60ab: 0x0030be85, + 0x60ac: 0x0030e285, 0x60ad: 0x0030f685, 0x60ae: 0x00310085, 0x60af: 0x00312a85, + 0x60b0: 0x002bde8b, 0x60b1: 0x002c0a8b, 0x60b2: 0x002c3a8b, 0x60b3: 0x002c628b, + 0x60b4: 0x002c988b, 0x60b5: 0x002d088b, 0x60b6: 0x002d228b, 0x60b7: 0x002d688b, + 0x60b8: 0x002d9a8b, 0x60b9: 0x002dcc8b, 0x60ba: 0x002dfe8b, 0x60bb: 0x002e228b, + 0x60bc: 0x002e828b, 0x60bd: 0x002e9e8b, 0x60be: 0x002ee28b, 0x60bf: 0x002f2c8b, + // Block 0x183, offset 0x60c0 + 0x60c0: 0x002f568b, 0x60c1: 0x002f7a8b, 0x60c2: 0x002fe68b, 0x60c3: 0x00302c8b, + 0x60c4: 0x00306c8b, 0x60c5: 0x0030be8b, 0x60c6: 0x0030e28b, 0x60c7: 0x0030f68b, + 0x60c8: 0x0031008b, 0x60c9: 0x00312a8b, 0x60ca: 0x002bde85, 0x60cb: 0x002c0a85, + 0x60cc: 0x002c3a85, 0x60cd: 0x002c6285, 0x60ce: 0x002c9885, 0x60cf: 0x002d0885, + 0x60d0: 0x002d2285, 0x60d1: 0x002d6885, 0x60d2: 0x002d9a85, 0x60d3: 0x002dcc85, + 0x60d4: 0x002dfe85, 0x60d5: 0x002e2285, 0x60d6: 0x002e8285, 0x60d7: 0x002e9e85, + 0x60d8: 0x002ee285, 0x60d9: 0x002f2c85, 0x60da: 0x002f5685, 0x60db: 0x002f7a85, + 0x60dc: 0x002fe685, 0x60dd: 0x00302c85, 0x60de: 0x00306c85, 0x60df: 0x0030be85, + 0x60e0: 0x0030e285, 0x60e1: 0x0030f685, 0x60e2: 0x00310085, 0x60e3: 0x00312a85, + 0x60e4: 0x002da285, 0x60e5: 0x002dd485, + 0x60e8: 0x0032528b, 0x60e9: 0x0032548b, 0x60ea: 0x0032568b, 0x60eb: 0x00325a8b, + 0x60ec: 0x00325c8b, 0x60ed: 0x0032648b, 0x60ee: 0x0032688b, 0x60ef: 0x00326a8b, + 0x60f0: 0x00326c8b, 0x60f1: 0x0032708b, 0x60f2: 0x0032728b, 0x60f3: 0x0032768b, + 0x60f4: 0x0032788b, 0x60f5: 0x00327a8b, 0x60f6: 0x00327c8b, 0x60f7: 0x00327e8b, + 0x60f8: 0x0032888b, 0x60f9: 0x00326a8b, 0x60fa: 0x00328e8b, 0x60fb: 0x0032968b, + 0x60fc: 0x0032988b, 0x60fd: 0x00329a8b, 0x60fe: 0x00329c8b, 0x60ff: 0x00329e8b, + // Block 0x184, offset 0x6100 + 0x6100: 0x0032a28b, 0x6101: 0x00092485, 0x6102: 0x00325285, 0x6103: 0x00325485, + 0x6104: 0x00325685, 0x6105: 0x00325a85, 0x6106: 0x00325c85, 0x6107: 0x00326485, + 0x6108: 0x00326885, 0x6109: 0x00326a85, 0x610a: 0x00326c85, 0x610b: 0x00327085, + 0x610c: 0x00327285, 0x610d: 0x00327685, 0x610e: 0x00327885, 0x610f: 0x00327a85, + 0x6110: 0x00327c85, 0x6111: 0x00327e85, 0x6112: 0x00328885, 0x6113: 0x00328e85, + 0x6114: 0x00328e85, 0x6115: 0x00329685, 0x6116: 0x00329885, 0x6117: 0x00329a85, + 0x6118: 0x00329c85, 0x6119: 0x00329e85, 0x611a: 0x0032a285, 0x611b: 0x00091c85, + 0x611c: 0x00325c85, 0x611d: 0x00326a85, 0x611e: 0x00327085, 0x611f: 0x00329a85, + 0x6120: 0x00328885, 0x6121: 0x00327e85, 0x6122: 0x0032528b, 0x6123: 0x0032548b, + 0x6124: 0x0032568b, 0x6125: 0x00325a8b, 0x6126: 0x00325c8b, 0x6127: 0x0032648b, + 0x6128: 0x0032688b, 0x6129: 0x00326a8b, 0x612a: 0x00326c8b, 0x612b: 0x0032708b, + 0x612c: 0x0032728b, 0x612d: 0x0032768b, 0x612e: 0x0032788b, 0x612f: 0x00327a8b, + 0x6130: 0x00327c8b, 0x6131: 0x00327e8b, 0x6132: 0x0032888b, 0x6133: 0x00326a8b, + 0x6134: 0x00328e8b, 0x6135: 0x0032968b, 0x6136: 0x0032988b, 0x6137: 0x00329a8b, + 0x6138: 0x00329c8b, 0x6139: 0x00329e8b, 0x613a: 0x0032a28b, 0x613b: 0x00092485, + 0x613c: 0x00325285, 0x613d: 0x00325485, 0x613e: 0x00325685, 0x613f: 0x00325a85, + // Block 0x185, offset 0x6140 + 0x6140: 0x00325c85, 0x6141: 0x00326485, 0x6142: 0x00326885, 0x6143: 0x00326a85, + 0x6144: 0x00326c85, 0x6145: 0x00327085, 0x6146: 0x00327285, 0x6147: 0x00327685, + 0x6148: 0x00327885, 0x6149: 0x00327a85, 0x614a: 0x00327c85, 0x614b: 0x00327e85, + 0x614c: 0x00328885, 0x614d: 0x00328e85, 0x614e: 0x00328e85, 0x614f: 0x00329685, + 0x6150: 0x00329885, 0x6151: 0x00329a85, 0x6152: 0x00329c85, 0x6153: 0x00329e85, + 0x6154: 0x0032a285, 0x6155: 0x00091c85, 0x6156: 0x00325c85, 0x6157: 0x00326a85, + 0x6158: 0x00327085, 0x6159: 0x00329a85, 0x615a: 0x00328885, 0x615b: 0x00327e85, + 0x615c: 0x0032528b, 0x615d: 0x0032548b, 0x615e: 0x0032568b, 0x615f: 0x00325a8b, + 0x6160: 0x00325c8b, 0x6161: 0x0032648b, 0x6162: 0x0032688b, 0x6163: 0x00326a8b, + 0x6164: 0x00326c8b, 0x6165: 0x0032708b, 0x6166: 0x0032728b, 0x6167: 0x0032768b, + 0x6168: 0x0032788b, 0x6169: 0x00327a8b, 0x616a: 0x00327c8b, 0x616b: 0x00327e8b, + 0x616c: 0x0032888b, 0x616d: 0x00326a8b, 0x616e: 0x00328e8b, 0x616f: 0x0032968b, + 0x6170: 0x0032988b, 0x6171: 0x00329a8b, 0x6172: 0x00329c8b, 0x6173: 0x00329e8b, + 0x6174: 0x0032a28b, 0x6175: 0x00092485, 0x6176: 0x00325285, 0x6177: 0x00325485, + 0x6178: 0x00325685, 0x6179: 0x00325a85, 0x617a: 0x00325c85, 0x617b: 0x00326485, + 0x617c: 0x00326885, 0x617d: 0x00326a85, 0x617e: 0x00326c85, 0x617f: 0x00327085, + // Block 0x186, offset 0x6180 + 0x6180: 0x00327285, 0x6181: 0x00327685, 0x6182: 0x00327885, 0x6183: 0x00327a85, + 0x6184: 0x00327c85, 0x6185: 0x00327e85, 0x6186: 0x00328885, 0x6187: 0x00328e85, + 0x6188: 0x00328e85, 0x6189: 0x00329685, 0x618a: 0x00329885, 0x618b: 0x00329a85, + 0x618c: 0x00329c85, 0x618d: 0x00329e85, 0x618e: 0x0032a285, 0x618f: 0x00091c85, + 0x6190: 0x00325c85, 0x6191: 0x00326a85, 0x6192: 0x00327085, 0x6193: 0x00329a85, + 0x6194: 0x00328885, 0x6195: 0x00327e85, 0x6196: 0x0032528b, 0x6197: 0x0032548b, + 0x6198: 0x0032568b, 0x6199: 0x00325a8b, 0x619a: 0x00325c8b, 0x619b: 0x0032648b, + 0x619c: 0x0032688b, 0x619d: 0x00326a8b, 0x619e: 0x00326c8b, 0x619f: 0x0032708b, + 0x61a0: 0x0032728b, 0x61a1: 0x0032768b, 0x61a2: 0x0032788b, 0x61a3: 0x00327a8b, + 0x61a4: 0x00327c8b, 0x61a5: 0x00327e8b, 0x61a6: 0x0032888b, 0x61a7: 0x00326a8b, + 0x61a8: 0x00328e8b, 0x61a9: 0x0032968b, 0x61aa: 0x0032988b, 0x61ab: 0x00329a8b, + 0x61ac: 0x00329c8b, 0x61ad: 0x00329e8b, 0x61ae: 0x0032a28b, 0x61af: 0x00092485, + 0x61b0: 0x00325285, 0x61b1: 0x00325485, 0x61b2: 0x00325685, 0x61b3: 0x00325a85, + 0x61b4: 0x00325c85, 0x61b5: 0x00326485, 0x61b6: 0x00326885, 0x61b7: 0x00326a85, + 0x61b8: 0x00326c85, 0x61b9: 0x00327085, 0x61ba: 0x00327285, 0x61bb: 0x00327685, + 0x61bc: 0x00327885, 0x61bd: 0x00327a85, 0x61be: 0x00327c85, 0x61bf: 0x00327e85, + // Block 0x187, offset 0x61c0 + 0x61c0: 0x00328885, 0x61c1: 0x00328e85, 0x61c2: 0x00328e85, 0x61c3: 0x00329685, + 0x61c4: 0x00329885, 0x61c5: 0x00329a85, 0x61c6: 0x00329c85, 0x61c7: 0x00329e85, + 0x61c8: 0x0032a285, 0x61c9: 0x00091c85, 0x61ca: 0x00325c85, 0x61cb: 0x00326a85, + 0x61cc: 0x00327085, 0x61cd: 0x00329a85, 0x61ce: 0x00328885, 0x61cf: 0x00327e85, + 0x61d0: 0x0032528b, 0x61d1: 0x0032548b, 0x61d2: 0x0032568b, 0x61d3: 0x00325a8b, + 0x61d4: 0x00325c8b, 0x61d5: 0x0032648b, 0x61d6: 0x0032688b, 0x61d7: 0x00326a8b, + 0x61d8: 0x00326c8b, 0x61d9: 0x0032708b, 0x61da: 0x0032728b, 0x61db: 0x0032768b, + 0x61dc: 0x0032788b, 0x61dd: 0x00327a8b, 0x61de: 0x00327c8b, 0x61df: 0x00327e8b, + 0x61e0: 0x0032888b, 0x61e1: 0x00326a8b, 0x61e2: 0x00328e8b, 0x61e3: 0x0032968b, + 0x61e4: 0x0032988b, 0x61e5: 0x00329a8b, 0x61e6: 0x00329c8b, 0x61e7: 0x00329e8b, + 0x61e8: 0x0032a28b, 0x61e9: 0x00092485, 0x61ea: 0x00325285, 0x61eb: 0x00325485, + 0x61ec: 0x00325685, 0x61ed: 0x00325a85, 0x61ee: 0x00325c85, 0x61ef: 0x00326485, + 0x61f0: 0x00326885, 0x61f1: 0x00326a85, 0x61f2: 0x00326c85, 0x61f3: 0x00327085, + 0x61f4: 0x00327285, 0x61f5: 0x00327685, 0x61f6: 0x00327885, 0x61f7: 0x00327a85, + 0x61f8: 0x00327c85, 0x61f9: 0x00327e85, 0x61fa: 0x00328885, 0x61fb: 0x00328e85, + 0x61fc: 0x00328e85, 0x61fd: 0x00329685, 0x61fe: 0x00329885, 0x61ff: 0x00329a85, + // Block 0x188, offset 0x6200 + 0x6200: 0x00329c85, 0x6201: 0x00329e85, 0x6202: 0x0032a285, 0x6203: 0x00091c85, + 0x6204: 0x00325c85, 0x6205: 0x00326a85, 0x6206: 0x00327085, 0x6207: 0x00329a85, + 0x6208: 0x00328885, 0x6209: 0x00327e85, 0x620a: 0x00325e8b, 0x620b: 0x00325e85, + 0x620e: 0x0029cc85, 0x620f: 0x0029ce85, + 0x6210: 0x0029d085, 0x6211: 0x0029d285, 0x6212: 0x0029d485, 0x6213: 0x0029d685, + 0x6214: 0x0029d885, 0x6215: 0x0029da85, 0x6216: 0x0029dc85, 0x6217: 0x0029de85, + 0x6218: 0x0029cc85, 0x6219: 0x0029ce85, 0x621a: 0x0029d085, 0x621b: 0x0029d285, + 0x621c: 0x0029d485, 0x621d: 0x0029d685, 0x621e: 0x0029d885, 0x621f: 0x0029da85, + 0x6220: 0x0029dc85, 0x6221: 0x0029de85, 0x6222: 0x0029cc85, 0x6223: 0x0029ce85, + 0x6224: 0x0029d085, 0x6225: 0x0029d285, 0x6226: 0x0029d485, 0x6227: 0x0029d685, + 0x6228: 0x0029d885, 0x6229: 0x0029da85, 0x622a: 0x0029dc85, 0x622b: 0x0029de85, + 0x622c: 0x0029cc85, 0x622d: 0x0029ce85, 0x622e: 0x0029d085, 0x622f: 0x0029d285, + 0x6230: 0x0029d485, 0x6231: 0x0029d685, 0x6232: 0x0029d885, 0x6233: 0x0029da85, + 0x6234: 0x0029dc85, 0x6235: 0x0029de85, 0x6236: 0x0029cc85, 0x6237: 0x0029ce85, + 0x6238: 0x0029d085, 0x6239: 0x0029d285, 0x623a: 0x0029d485, 0x623b: 0x0029d685, + 0x623c: 0x0029d885, 0x623d: 0x0029da85, 0x623e: 0x0029dc85, 0x623f: 0x0029de85, + // Block 0x189, offset 0x6240 + 0x6240: 0x00393885, 0x6241: 0x00393c85, 0x6242: 0x00396485, 0x6243: 0x00398885, + 0x6245: 0x003a7485, 0x6246: 0x0039a685, 0x6247: 0x00397285, + 0x6248: 0x0039e685, 0x6249: 0x003a9085, 0x624a: 0x003a1a85, 0x624b: 0x003a4085, + 0x624c: 0x003a4e85, 0x624d: 0x003a5685, 0x624e: 0x0039c685, 0x624f: 0x0039ee85, + 0x6250: 0x0039fc85, 0x6251: 0x0039dc85, 0x6252: 0x003a1285, 0x6253: 0x0039a485, + 0x6254: 0x0039c885, 0x6255: 0x00395685, 0x6256: 0x00395885, 0x6257: 0x00397485, + 0x6258: 0x00398a85, 0x6259: 0x0039de85, 0x625a: 0x0039e885, 0x625b: 0x0039f085, + 0x625c: 0x00393a85, 0x625d: 0x003a5885, 0x625e: 0x0039fe85, 0x625f: 0x003a1085, + 0x6261: 0x00393c85, 0x6262: 0x00396485, + 0x6264: 0x003a6885, 0x6267: 0x00397285, + 0x6269: 0x003a9085, 0x626a: 0x003a1a85, 0x626b: 0x003a4085, + 0x626c: 0x003a4e85, 0x626d: 0x003a5685, 0x626e: 0x0039c685, 0x626f: 0x0039ee85, + 0x6270: 0x0039fc85, 0x6271: 0x0039dc85, 0x6272: 0x003a1285, + 0x6274: 0x0039c885, 0x6275: 0x00395685, 0x6276: 0x00395885, 0x6277: 0x00397485, + 0x6279: 0x0039de85, 0x627b: 0x0039f085, + // Block 0x18a, offset 0x6280 + 0x6282: 0x00396485, + 0x6287: 0x00397285, + 0x6289: 0x003a9085, 0x628b: 0x003a4085, + 0x628d: 0x003a5685, 0x628e: 0x0039c685, 0x628f: 0x0039ee85, + 0x6291: 0x0039dc85, 0x6292: 0x003a1285, + 0x6294: 0x0039c885, 0x6297: 0x00397485, + 0x6299: 0x0039de85, 0x629b: 0x0039f085, + 0x629d: 0x003a5885, 0x629f: 0x003a1085, + 0x62a1: 0x00393c85, 0x62a2: 0x00396485, + 0x62a4: 0x003a6885, 0x62a7: 0x00397285, + 0x62a8: 0x0039e685, 0x62a9: 0x003a9085, 0x62aa: 0x003a1a85, + 0x62ac: 0x003a4e85, 0x62ad: 0x003a5685, 0x62ae: 0x0039c685, 0x62af: 0x0039ee85, + 0x62b0: 0x0039fc85, 0x62b1: 0x0039dc85, 0x62b2: 0x003a1285, + 0x62b4: 0x0039c885, 0x62b5: 0x00395685, 0x62b6: 0x00395885, 0x62b7: 0x00397485, + 0x62b9: 0x0039de85, 0x62ba: 0x0039e885, 0x62bb: 0x0039f085, + 0x62bc: 0x00393a85, 0x62be: 0x0039fe85, + // Block 0x18b, offset 0x62c0 + 0x62c0: 0x00393885, 0x62c1: 0x00393c85, 0x62c2: 0x00396485, 0x62c3: 0x00398885, + 0x62c4: 0x003a6885, 0x62c5: 0x003a7485, 0x62c6: 0x0039a685, 0x62c7: 0x00397285, + 0x62c8: 0x0039e685, 0x62c9: 0x003a9085, 0x62cb: 0x003a4085, + 0x62cc: 0x003a4e85, 0x62cd: 0x003a5685, 0x62ce: 0x0039c685, 0x62cf: 0x0039ee85, + 0x62d0: 0x0039fc85, 0x62d1: 0x0039dc85, 0x62d2: 0x003a1285, 0x62d3: 0x0039a485, + 0x62d4: 0x0039c885, 0x62d5: 0x00395685, 0x62d6: 0x00395885, 0x62d7: 0x00397485, + 0x62d8: 0x00398a85, 0x62d9: 0x0039de85, 0x62da: 0x0039e885, 0x62db: 0x0039f085, + 0x62e1: 0x00393c85, 0x62e2: 0x00396485, 0x62e3: 0x00398885, + 0x62e5: 0x003a7485, 0x62e6: 0x0039a685, 0x62e7: 0x00397285, + 0x62e8: 0x0039e685, 0x62e9: 0x003a9085, 0x62eb: 0x003a4085, + 0x62ec: 0x003a4e85, 0x62ed: 0x003a5685, 0x62ee: 0x0039c685, 0x62ef: 0x0039ee85, + 0x62f0: 0x0039fc85, 0x62f1: 0x0039dc85, 0x62f2: 0x003a1285, 0x62f3: 0x0039a485, + 0x62f4: 0x0039c885, 0x62f5: 0x00395685, 0x62f6: 0x00395885, 0x62f7: 0x00397485, + 0x62f8: 0x00398a85, 0x62f9: 0x0039de85, 0x62fa: 0x0039e885, 0x62fb: 0x0039f085, + // Block 0x18c, offset 0x6300 + 0x6330: 0x40070a20, 0x6331: 0x40070c20, + // Block 0x18d, offset 0x6340 + 0x6340: 0x401f6e20, 0x6341: 0x401f7020, 0x6342: 0x401f7220, 0x6343: 0x401f7420, + 0x6344: 0x401f7620, 0x6345: 0x401f7820, 0x6346: 0x401f7a20, 0x6347: 0x401f7c20, + 0x6348: 0x401f7e20, 0x6349: 0x401f8020, 0x634a: 0x401f8220, 0x634b: 0x401f8420, + 0x634c: 0x401f8620, 0x634d: 0x401f8820, 0x634e: 0x401f8a20, 0x634f: 0x401f8c20, + 0x6350: 0x401f8e20, 0x6351: 0x401f9020, 0x6352: 0x401f9220, 0x6353: 0x401f9420, + 0x6354: 0x401f9620, 0x6355: 0x401f9820, 0x6356: 0x401f9a20, 0x6357: 0x401f9c20, + 0x6358: 0x401f9e20, 0x6359: 0x401fa020, 0x635a: 0x401fa220, 0x635b: 0x401fa420, + 0x635c: 0x401fa620, 0x635d: 0x401fa820, 0x635e: 0x401faa20, 0x635f: 0x401fac20, + 0x6360: 0x401fae20, 0x6361: 0x401fb020, 0x6362: 0x401fb220, 0x6363: 0x401fb420, + 0x6364: 0x401fb620, 0x6365: 0x401fb820, 0x6366: 0x401fba20, 0x6367: 0x401fbc20, + 0x6368: 0x401fbe20, 0x6369: 0x401fc020, 0x636a: 0x401fc220, 0x636b: 0x401fc420, + 0x6370: 0x401fc620, 0x6371: 0x401fc820, 0x6372: 0x401fca20, 0x6373: 0x401fcc20, + 0x6374: 0x401fce20, 0x6375: 0x401fd020, 0x6376: 0x401fd220, 0x6377: 0x401fd420, + 0x6378: 0x401fd620, 0x6379: 0x401fd820, 0x637a: 0x401fda20, 0x637b: 0x401fdc20, + 0x637c: 0x401fde20, 0x637d: 0x401fe020, 0x637e: 0x401fe220, 0x637f: 0x401fe420, + // Block 0x18e, offset 0x6380 + 0x6380: 0x401fe620, 0x6381: 0x401fe820, 0x6382: 0x401fea20, 0x6383: 0x401fec20, + 0x6384: 0x401fee20, 0x6385: 0x401ff020, 0x6386: 0x401ff220, 0x6387: 0x401ff420, + 0x6388: 0x401ff620, 0x6389: 0x401ff820, 0x638a: 0x401ffa20, 0x638b: 0x401ffc20, + 0x638c: 0x401ffe20, 0x638d: 0x40200020, 0x638e: 0x40200220, 0x638f: 0x40200420, + 0x6390: 0x40200620, 0x6391: 0x40200820, 0x6392: 0x40200a20, 0x6393: 0x40200c20, + 0x6394: 0x40200e20, 0x6395: 0x40201020, 0x6396: 0x40201220, 0x6397: 0x40201420, + 0x6398: 0x40201620, 0x6399: 0x40201820, 0x639a: 0x40201a20, 0x639b: 0x40201c20, + 0x639c: 0x40201e20, 0x639d: 0x40202020, 0x639e: 0x40202220, 0x639f: 0x40202420, + 0x63a0: 0x40202620, 0x63a1: 0x40202820, 0x63a2: 0x40202a20, 0x63a3: 0x40202c20, + 0x63a4: 0x40202e20, 0x63a5: 0x40203020, 0x63a6: 0x40203220, 0x63a7: 0x40203420, + 0x63a8: 0x40203620, 0x63a9: 0x40203820, 0x63aa: 0x40203a20, 0x63ab: 0x40203c20, + 0x63ac: 0x40203e20, 0x63ad: 0x40204020, 0x63ae: 0x40204220, 0x63af: 0x40204420, + 0x63b0: 0x40204620, 0x63b1: 0x40204820, 0x63b2: 0x40204a20, 0x63b3: 0x40204c20, + 0x63b4: 0x40204e20, 0x63b5: 0x40205020, 0x63b6: 0x40205220, 0x63b7: 0x40205420, + 0x63b8: 0x40205620, 0x63b9: 0x40205820, 0x63ba: 0x40205a20, 0x63bb: 0x40205c20, + 0x63bc: 0x40205e20, 0x63bd: 0x40206020, 0x63be: 0x40206220, 0x63bf: 0x40206420, + // Block 0x18f, offset 0x63c0 + 0x63c0: 0x40206620, 0x63c1: 0x40206820, 0x63c2: 0x40206a20, 0x63c3: 0x40206c20, + 0x63c4: 0x40206e20, 0x63c5: 0x40207020, 0x63c6: 0x40207220, 0x63c7: 0x40207420, + 0x63c8: 0x40207620, 0x63c9: 0x40207820, 0x63ca: 0x40207a20, 0x63cb: 0x40207c20, + 0x63cc: 0x40207e20, 0x63cd: 0x40208020, 0x63ce: 0x40208220, 0x63cf: 0x40208420, + 0x63d0: 0x40208620, 0x63d1: 0x40208820, 0x63d2: 0x40208a20, 0x63d3: 0x40208c20, + 0x63e0: 0x40208e20, 0x63e1: 0x40209020, 0x63e2: 0x40209220, 0x63e3: 0x40209420, + 0x63e4: 0x40209620, 0x63e5: 0x40209820, 0x63e6: 0x40209a20, 0x63e7: 0x40209c20, + 0x63e8: 0x40209e20, 0x63e9: 0x4020a020, 0x63ea: 0x4020a220, 0x63eb: 0x4020a420, + 0x63ec: 0x4020a620, 0x63ed: 0x4020a820, 0x63ee: 0x4020aa20, + 0x63f1: 0x4020ac20, 0x63f2: 0x4020ae20, 0x63f3: 0x4020b020, + 0x63f4: 0x4020b220, 0x63f5: 0x4020b420, 0x63f6: 0x4020b620, 0x63f7: 0x4020b820, + 0x63f8: 0x4020ba20, 0x63f9: 0x4020bc20, 0x63fa: 0x4020be20, 0x63fb: 0x4020c020, + 0x63fc: 0x4020c220, 0x63fd: 0x4020c420, 0x63fe: 0x4020c620, + // Block 0x190, offset 0x6400 + 0x6401: 0x4020c820, 0x6402: 0x4020ca20, 0x6403: 0x4020cc20, + 0x6404: 0x4020ce20, 0x6405: 0x4020d020, 0x6406: 0x4020d220, 0x6407: 0x4020d420, + 0x6408: 0x4020d620, 0x6409: 0x4020d820, 0x640a: 0x4020da20, 0x640b: 0x4020dc20, + 0x640c: 0x4020de20, 0x640d: 0x4020e020, 0x640e: 0x4020e220, 0x640f: 0x4020e420, + 0x6411: 0x4020e620, 0x6412: 0x4020e820, 0x6413: 0x4020ea20, + 0x6414: 0x4020ec20, 0x6415: 0x4020ee20, 0x6416: 0x4020f020, 0x6417: 0x4020f220, + 0x6418: 0x4020f420, 0x6419: 0x4020f620, 0x641a: 0x4020f820, 0x641b: 0x4020fa20, + 0x641c: 0x4020fc20, 0x641d: 0x4020fe20, 0x641e: 0x40210020, 0x641f: 0x40210220, + // Block 0x191, offset 0x6440 + 0x6440: 0xf0001f04, 0x6441: 0xf0001f04, 0x6442: 0xf0001f04, 0x6443: 0xf0001f04, + 0x6444: 0xf0001f04, 0x6445: 0xf0001f04, 0x6446: 0xf0001f04, 0x6447: 0xf0001f04, + 0x6448: 0xf0001f04, 0x6449: 0xf0001f04, 0x644a: 0xf0001f04, + 0x6450: 0xf0000a04, 0x6451: 0xf0000a04, 0x6452: 0xf0000a04, 0x6453: 0xf0000a04, + 0x6454: 0xf0000a04, 0x6455: 0xf0000a04, 0x6456: 0xf0000a04, 0x6457: 0xf0000a04, + 0x6458: 0xf0000a04, 0x6459: 0xf0000a04, 0x645a: 0xf0000a04, 0x645b: 0xf0000a04, + 0x645c: 0xf0000a04, 0x645d: 0xf0000a04, 0x645e: 0xf0000a04, 0x645f: 0xf0000a04, + 0x6460: 0xf0000a04, 0x6461: 0xf0000a04, 0x6462: 0xf0000a04, 0x6463: 0xf0000a04, + 0x6464: 0xf0000a04, 0x6465: 0xf0000a04, 0x6466: 0xf0000a04, 0x6467: 0xf0000a04, + 0x6468: 0xf0000a04, 0x6469: 0xf0000a04, 0x646a: 0xf0000a04, 0x646b: 0x002c3a8c, + 0x646c: 0x002f7a8c, 0x646d: 0xf0000c0c, 0x646e: 0xf0000c0c, + 0x6470: 0x002bde9d, 0x6471: 0x002c0a9d, 0x6472: 0x002c3a9d, 0x6473: 0x002c629d, + 0x6474: 0x002c989d, 0x6475: 0x002d089d, 0x6476: 0x002d229d, 0x6477: 0x002d689d, + 0x6478: 0x002d9a9d, 0x6479: 0x002dcc9d, 0x647a: 0x002dfe9d, 0x647b: 0x002e229d, + 0x647c: 0x002e829d, 0x647d: 0x002e9e9d, 0x647e: 0x002ee29d, 0x647f: 0x002f2c9d, + // Block 0x192, offset 0x6480 + 0x6480: 0x002f569d, 0x6481: 0x002f7a9d, 0x6482: 0x002fe69d, 0x6483: 0x00302c9d, + 0x6484: 0x00306c9d, 0x6485: 0x0030be9d, 0x6486: 0x0030e29d, 0x6487: 0x0030f69d, + 0x6488: 0x0031009d, 0x6489: 0x00312a9d, 0x648a: 0xf0001d1d, 0x648b: 0xf0001d1d, + 0x648c: 0xf0001d1d, 0x648d: 0xf0001d1d, 0x648e: 0xe0000ebc, 0x648f: 0xf0001d1d, + 0x6490: 0x002bde8c, 0x6491: 0x002c0a8c, 0x6492: 0x002c3a8c, 0x6493: 0x002c628c, + 0x6494: 0x002c988c, 0x6495: 0x002d088c, 0x6496: 0x002d228c, 0x6497: 0x002d688c, + 0x6498: 0x002d9a8c, 0x6499: 0x002dcc8c, 0x649a: 0x002dfe8c, 0x649b: 0x002e228c, + 0x649c: 0x002e828c, 0x649d: 0x002e9e8c, 0x649e: 0x002ee28c, 0x649f: 0x002f2c8c, + 0x64a0: 0x002f568c, 0x64a1: 0x002f7a8c, 0x64a2: 0x002fe68c, 0x64a3: 0x00302c8c, + 0x64a4: 0x00306c8c, 0x64a5: 0x0030be8c, 0x64a6: 0x0030e28c, 0x64a7: 0x0030f68c, + 0x64a8: 0x0031008c, 0x64a9: 0x00312a8c, 0x64aa: 0xf0001414, 0x64ab: 0xf0001414, + 0x64b0: 0x002bde9d, 0x64b1: 0x002c0a9d, 0x64b2: 0x002c3a9d, 0x64b3: 0x002c629d, + 0x64b4: 0x002c989d, 0x64b5: 0x002d089d, 0x64b6: 0x002d229d, 0x64b7: 0x002d689d, + 0x64b8: 0x002d9a9d, 0x64b9: 0x002dcc9d, 0x64ba: 0x002dfe9d, 0x64bb: 0x002e229d, + 0x64bc: 0x002e829d, 0x64bd: 0x002e9e9d, 0x64be: 0x002ee29d, 0x64bf: 0x002f2c9d, + // Block 0x193, offset 0x64c0 + 0x64c0: 0x002f569d, 0x64c1: 0x002f7a9d, 0x64c2: 0x002fe69d, 0x64c3: 0x00302c9d, + 0x64c4: 0x00306c9d, 0x64c5: 0x0030be9d, 0x64c6: 0x0030e29d, 0x64c7: 0x0030f69d, + 0x64c8: 0x0031009d, 0x64c9: 0x00312a9d, 0x64ca: 0x002f2c9d, 0x64cb: 0xe0000c81, + 0x64cc: 0xe0000eb5, 0x64cd: 0xe0000f74, 0x64ce: 0xe00009d2, 0x64cf: 0xe00010f0, + 0x64d0: 0xf0001d1d, 0x64d1: 0xe0000a6f, 0x64d2: 0xe0000a7e, 0x64d3: 0xe0000ba4, + 0x64d4: 0xe0000c84, 0x64d5: 0xe0000d8a, 0x64d6: 0xe0000d8e, 0x64d7: 0xe0000e9b, + 0x64d8: 0xe0000f77, 0x64d9: 0xe00010a2, 0x64da: 0xe00010c0, + // Block 0x194, offset 0x6500 + 0x6526: 0x40110c20, 0x6527: 0x40110e20, + 0x6528: 0x40111020, 0x6529: 0x40111220, 0x652a: 0x40111420, 0x652b: 0x40111620, + 0x652c: 0x40111820, 0x652d: 0x40111a20, 0x652e: 0x40111c20, 0x652f: 0x40111e20, + 0x6530: 0x40112020, 0x6531: 0x40112220, 0x6532: 0x40112420, 0x6533: 0x40112620, + 0x6534: 0x40112820, 0x6535: 0x40112a20, 0x6536: 0x40112c20, 0x6537: 0x40112e20, + 0x6538: 0x40113020, 0x6539: 0x40113220, 0x653a: 0x40113420, 0x653b: 0x40113620, + 0x653c: 0x40113820, 0x653d: 0x40113a20, 0x653e: 0x40113c20, 0x653f: 0x40113e20, + // Block 0x195, offset 0x6540 + 0x6540: 0xf0001c1c, 0x6541: 0xf0001c1c, 0x6542: 0x00658c9c, + 0x6550: 0x02c4969c, 0x6551: 0x02b6ae9c, 0x6552: 0x02a7989c, 0x6553: 0xf0001c1c, + 0x6554: 0x029d189c, 0x6555: 0x02b2349c, 0x6556: 0x0313c69c, 0x6557: 0x02b2529c, + 0x6558: 0x029d489c, 0x6559: 0x02cc409c, 0x655a: 0x02e2429c, 0x655b: 0x02cb329c, + 0x655c: 0x02a49a9c, 0x655d: 0x02bf189c, 0x655e: 0x02a31a9c, 0x655f: 0x02cb609c, + 0x6560: 0x02a43a9c, 0x6561: 0x02fa849c, 0x6562: 0x02ea3e9c, 0x6563: 0x0319529c, + 0x6564: 0x02b1e09c, 0x6565: 0x02a8729c, 0x6566: 0x02de289c, 0x6567: 0x02c52a9c, + 0x6568: 0x02c6aa9c, 0x6569: 0x029c009c, 0x656a: 0x029c129c, 0x656b: 0x0320949c, + 0x656c: 0x02bbcc9c, 0x656d: 0x029c5a9c, 0x656e: 0x02a7e69c, 0x656f: 0x02c60e9c, + 0x6570: 0x031ae09c, 0x6571: 0x02c4a69c, 0x6572: 0x02f3029c, 0x6573: 0x02f4f49c, + 0x6574: 0x02a8109c, 0x6575: 0x02dd009c, 0x6576: 0x02ce129c, 0x6577: 0x02ce109c, + 0x6578: 0x02ea669c, 0x6579: 0x02a4e49c, 0x657a: 0x02ab6c9c, + // Block 0x196, offset 0x6580 + 0x6580: 0xf0000404, 0x6581: 0xf0000404, 0x6582: 0xf0000404, 0x6583: 0xf0000404, + 0x6584: 0xf0000404, 0x6585: 0xf0000404, 0x6586: 0xf0000404, 0x6587: 0xf0000404, + 0x6588: 0xf0000404, + 0x6590: 0x02bf2e86, 0x6591: 0x02a7de86, + // Block 0x197, offset 0x65c0 + 0x65c0: 0x40210420, 0x65c1: 0x40210620, 0x65c2: 0x40210820, 0x65c3: 0x40210a20, + 0x65c4: 0x40210c20, 0x65c5: 0x40210e20, 0x65c6: 0x40211020, 0x65c7: 0x40211220, + 0x65c8: 0x40211420, 0x65c9: 0x40211620, 0x65ca: 0x40211820, 0x65cb: 0x40211a20, + 0x65cc: 0x40211c20, 0x65cd: 0x40211e20, 0x65ce: 0x40212020, 0x65cf: 0x40212220, + 0x65d0: 0x40212420, 0x65d1: 0x40212620, 0x65d2: 0x40212820, 0x65d3: 0x40212a20, + 0x65d4: 0x40212c20, 0x65d5: 0x40212e20, 0x65d6: 0x40213020, 0x65d7: 0x40213220, + 0x65d8: 0x40213420, 0x65d9: 0x40213620, 0x65da: 0x40213820, 0x65db: 0x40213a20, + 0x65dc: 0x40213c20, 0x65dd: 0x40213e20, 0x65de: 0x40214020, 0x65df: 0x40214220, + 0x65e0: 0x40214420, + 0x65f0: 0x40214620, 0x65f1: 0x40214820, 0x65f2: 0x40214a20, 0x65f3: 0x40214c20, + 0x65f4: 0x40214e20, 0x65f5: 0x40215020, 0x65f7: 0x40215220, + 0x65f8: 0x40215420, 0x65f9: 0x40215620, 0x65fa: 0x40215820, 0x65fb: 0x40215a20, + 0x65fc: 0x40215c20, 0x65fd: 0x40215e20, 0x65fe: 0x40216020, 0x65ff: 0x40216220, + // Block 0x198, offset 0x6600 + 0x6600: 0x40216420, 0x6601: 0x40216620, 0x6602: 0x40216820, 0x6603: 0x40216a20, + 0x6604: 0x40216c20, 0x6605: 0x40216e20, 0x6606: 0x40217020, 0x6607: 0x40217220, + 0x6608: 0x40217420, 0x6609: 0x40217620, 0x660a: 0x40217820, 0x660b: 0x40217a20, + 0x660c: 0x40217c20, 0x660d: 0x40217e20, 0x660e: 0x40218020, 0x660f: 0x40218220, + 0x6610: 0x40218420, 0x6611: 0x40218620, 0x6612: 0x40218820, 0x6613: 0x40218a20, + 0x6614: 0x40218c20, 0x6615: 0x40218e20, 0x6616: 0x40219020, 0x6617: 0x40219220, + 0x6618: 0x40219420, 0x6619: 0x40219620, 0x661a: 0x40219820, 0x661b: 0x40219a20, + 0x661c: 0x40219c20, 0x661d: 0x40219e20, 0x661e: 0x4021a020, 0x661f: 0x4021a220, + 0x6620: 0x4021a420, 0x6621: 0x4021a620, 0x6622: 0x4021a820, 0x6623: 0x4021aa20, + 0x6624: 0x4021ac20, 0x6625: 0x4021ae20, 0x6626: 0x4021b020, 0x6627: 0x4021b220, + 0x6628: 0x4021b420, 0x6629: 0x4021b620, 0x662a: 0x4021b820, 0x662b: 0x4021ba20, + 0x662c: 0x4021bc20, 0x662d: 0x4021be20, 0x662e: 0x4021c020, 0x662f: 0x4021c220, + 0x6630: 0x4021c420, 0x6631: 0x4021c620, 0x6632: 0x4021c820, 0x6633: 0x4021ca20, + 0x6634: 0x4021cc20, 0x6635: 0x4021ce20, 0x6636: 0x4021d020, 0x6637: 0x4021d220, + 0x6638: 0x4021d420, 0x6639: 0x4021d620, 0x663a: 0x4021d820, 0x663b: 0x4021da20, + 0x663c: 0x4021dc20, + // Block 0x199, offset 0x6640 + 0x6640: 0x4021de20, 0x6641: 0x4021e020, 0x6642: 0x4021e220, 0x6643: 0x4021e420, + 0x6644: 0x4021e620, 0x6645: 0x4021e820, 0x6646: 0x4021ea20, 0x6647: 0x4021ec20, + 0x6648: 0x4021ee20, 0x6649: 0x4021f020, 0x664a: 0x4021f220, 0x664b: 0x4021f420, + 0x664c: 0x4021f620, 0x664d: 0x4021f820, 0x664e: 0x4021fa20, 0x664f: 0x4021fc20, + 0x6650: 0x4021fe20, 0x6651: 0x40220020, 0x6652: 0x40220220, 0x6653: 0x40220420, + 0x6660: 0x40220620, 0x6661: 0x40220820, 0x6662: 0x40220a20, 0x6663: 0x40220c20, + 0x6664: 0x40220e20, 0x6665: 0x40221020, 0x6666: 0x40221220, 0x6667: 0x40221420, + 0x6668: 0x40221620, 0x6669: 0x40221820, 0x666a: 0x40221a20, 0x666b: 0x40221c20, + 0x666c: 0x40221e20, 0x666d: 0x40222020, 0x666e: 0x40222220, 0x666f: 0x40222420, + 0x6670: 0x40222620, 0x6671: 0x40222820, 0x6672: 0x40222a20, 0x6673: 0x40222c20, + 0x6674: 0x40222e20, 0x6675: 0x40223020, 0x6676: 0x40223220, 0x6677: 0x40223420, + 0x6678: 0x40223620, 0x6679: 0x40223820, 0x667a: 0x40223a20, 0x667b: 0x40223c20, + 0x667c: 0x40223e20, 0x667d: 0x40224020, 0x667e: 0x40224220, 0x667f: 0x40224420, + // Block 0x19a, offset 0x6680 + 0x6680: 0x40224620, 0x6681: 0x40224820, 0x6682: 0x40224a20, 0x6683: 0x40224c20, + 0x6684: 0x40224e20, 0x6686: 0x40225020, 0x6687: 0x40225220, + 0x6688: 0x40225420, 0x6689: 0x40225620, 0x668a: 0x40225820, + 0x66a0: 0x40225a20, 0x66a1: 0x40225c20, 0x66a2: 0x40225e20, 0x66a3: 0x40226020, + 0x66a4: 0x40226220, 0x66a5: 0x40226420, 0x66a6: 0x40226620, 0x66a7: 0x40226820, + 0x66a8: 0x40226a20, 0x66a9: 0x40226c20, 0x66aa: 0x40226e20, 0x66ab: 0x40227020, + 0x66ac: 0x40227220, 0x66ad: 0x40227420, 0x66ae: 0x40227620, 0x66af: 0x40227820, + 0x66b0: 0x40227a20, + // Block 0x19b, offset 0x66c0 + 0x66c0: 0x40227c20, 0x66c1: 0x40227e20, 0x66c2: 0x40228020, 0x66c3: 0x40228220, + 0x66c4: 0x40228420, 0x66c5: 0x40228620, 0x66c6: 0x40228820, 0x66c7: 0x40228a20, + 0x66c8: 0x40228c20, 0x66c9: 0x40228e20, 0x66ca: 0x40229020, 0x66cb: 0x40229220, + 0x66cc: 0x40229420, 0x66cd: 0x40229620, 0x66ce: 0x40229820, 0x66cf: 0x40229a20, + 0x66d0: 0x40229c20, 0x66d1: 0x40229e20, 0x66d2: 0x4022a020, 0x66d3: 0x4022a220, + 0x66d4: 0x4022a420, 0x66d5: 0x4022a620, 0x66d6: 0x4022a820, 0x66d7: 0x4022aa20, + 0x66d8: 0x4022ac20, 0x66d9: 0x4022ae20, 0x66da: 0x4022b020, 0x66db: 0x4022b220, + 0x66dc: 0x4022b420, 0x66dd: 0x4022b620, 0x66de: 0x4022b820, 0x66df: 0x4022ba20, + 0x66e0: 0x4022bc20, 0x66e1: 0x4022be20, 0x66e2: 0x4022c020, 0x66e3: 0x4022c220, + 0x66e4: 0x4022c420, 0x66e5: 0x4022c620, 0x66e6: 0x4022c820, 0x66e7: 0x4022ca20, + 0x66e8: 0x4022cc20, 0x66e9: 0x4022ce20, 0x66ea: 0x4022d020, 0x66eb: 0x4022d220, + 0x66ec: 0x4022d420, 0x66ed: 0x4022d620, 0x66ee: 0x4022d820, 0x66ef: 0x4022da20, + 0x66f0: 0x4022dc20, 0x66f1: 0x4022de20, 0x66f2: 0x4022e020, 0x66f3: 0x4022e220, + 0x66f4: 0x4022e420, 0x66f5: 0x4022e620, 0x66f6: 0x4022e820, 0x66f7: 0x4022ea20, + 0x66f8: 0x4022ec20, 0x66f9: 0x4022ee20, 0x66fa: 0x4022f020, 0x66fb: 0x4022f220, + 0x66fc: 0x4022f420, 0x66fd: 0x4022f620, 0x66fe: 0x4022f820, + // Block 0x19c, offset 0x6700 + 0x6700: 0x4022fa20, 0x6702: 0x4022fc20, 0x6703: 0x4022fe20, + 0x6704: 0x40230020, 0x6705: 0x40230220, 0x6706: 0x40230420, 0x6707: 0x40230620, + 0x6708: 0x40230820, 0x6709: 0x40230a20, 0x670a: 0x40230c20, 0x670b: 0x40230e20, + 0x670c: 0x40231020, 0x670d: 0x40231220, 0x670e: 0x40231420, 0x670f: 0x40231620, + 0x6710: 0x40231820, 0x6711: 0x40231a20, 0x6712: 0x40231c20, 0x6713: 0x40231e20, + 0x6714: 0x40232020, 0x6715: 0x40232220, 0x6716: 0x40232420, 0x6717: 0x40232620, + 0x6718: 0x40232820, 0x6719: 0x40232a20, 0x671a: 0x40232c20, 0x671b: 0x40232e20, + 0x671c: 0x40233020, 0x671d: 0x40233220, 0x671e: 0x40233420, 0x671f: 0x40233620, + 0x6720: 0x40233820, 0x6721: 0x40233a20, 0x6722: 0x40233c20, 0x6723: 0x40233e20, + 0x6724: 0x40234020, 0x6725: 0x40234220, 0x6726: 0x40234420, 0x6727: 0x40234620, + 0x6728: 0x40234820, 0x6729: 0x40234a20, 0x672a: 0x40234c20, 0x672b: 0x40234e20, + 0x672c: 0x40235020, 0x672d: 0x40235220, 0x672e: 0x40235420, 0x672f: 0x40235620, + 0x6730: 0x40235820, 0x6731: 0x40235a20, 0x6732: 0x40235c20, 0x6733: 0x40235e20, + 0x6734: 0x40236020, 0x6735: 0x40236220, 0x6736: 0x40236420, 0x6737: 0x40236620, + 0x6738: 0x40236820, 0x6739: 0x40236a20, 0x673a: 0x40236c20, 0x673b: 0x40236e20, + 0x673c: 0x40237020, 0x673d: 0x40237220, 0x673e: 0x40237420, 0x673f: 0x40237620, + // Block 0x19d, offset 0x6740 + 0x6740: 0x40237820, 0x6741: 0x40237a20, 0x6742: 0x40237c20, 0x6743: 0x40237e20, + 0x6744: 0x40238020, 0x6745: 0x40238220, 0x6746: 0x40238420, 0x6747: 0x40238620, + 0x6748: 0x40238820, 0x6749: 0x40238a20, 0x674a: 0x40238c20, 0x674b: 0x40238e20, + 0x674c: 0x40239020, 0x674d: 0x40239220, 0x674e: 0x40239420, 0x674f: 0x40239620, + 0x6750: 0x40239820, 0x6751: 0x40239a20, 0x6752: 0x40239c20, 0x6753: 0x40239e20, + 0x6754: 0x4023a020, 0x6755: 0x4023a220, 0x6756: 0x4023a420, 0x6757: 0x4023a620, + 0x6758: 0x4023a820, 0x6759: 0x4023aa20, 0x675a: 0x4023ac20, 0x675b: 0x4023ae20, + 0x675c: 0x4023b020, 0x675d: 0x4023b220, 0x675e: 0x4023b420, 0x675f: 0x4023b620, + 0x6760: 0x4023b820, 0x6761: 0x4023ba20, 0x6762: 0x4023bc20, 0x6763: 0x4023be20, + 0x6764: 0x4023c020, 0x6765: 0x4023c220, 0x6766: 0x4023c420, 0x6767: 0x4023c620, + 0x6768: 0x4023c820, 0x6769: 0x4023ca20, 0x676a: 0x4023cc20, 0x676b: 0x4023ce20, + 0x676c: 0x4023d020, 0x676d: 0x4023d220, 0x676e: 0x4023d420, 0x676f: 0x4023d620, + 0x6770: 0x4023d820, 0x6771: 0x4023da20, 0x6772: 0x4023dc20, 0x6773: 0x4023de20, + 0x6774: 0x4023e020, 0x6775: 0x4023e220, 0x6776: 0x4023e420, 0x6777: 0x4023e620, + 0x6778: 0x4023e820, 0x6779: 0x4023ea20, 0x677a: 0x4023ec20, 0x677b: 0x4023ee20, + 0x677c: 0x4023f020, 0x677d: 0x4023f220, 0x677e: 0x4023f420, 0x677f: 0x4023f620, + // Block 0x19e, offset 0x6780 + 0x6780: 0x4023f820, 0x6781: 0x4023fa20, 0x6782: 0x4023fc20, 0x6783: 0x4023fe20, + 0x6784: 0x40240020, 0x6785: 0x40240220, 0x6786: 0x40240420, 0x6787: 0x40240620, + 0x6788: 0x40240820, 0x6789: 0x40240a20, 0x678a: 0x40240c20, 0x678b: 0x40240e20, + 0x678c: 0x40241020, 0x678d: 0x40241220, 0x678e: 0x40241420, 0x678f: 0x40241620, + 0x6790: 0x40241820, 0x6791: 0x40241a20, 0x6792: 0x40241c20, 0x6793: 0x40241e20, + 0x6794: 0x40242020, 0x6795: 0x40242220, 0x6796: 0x40242420, 0x6797: 0x40242620, + 0x6798: 0x40242820, 0x6799: 0x40242a20, 0x679a: 0x40242c20, 0x679b: 0x40242e20, + 0x679c: 0x40243020, 0x679d: 0x40243220, 0x679e: 0x40243420, 0x679f: 0x40243620, + 0x67a0: 0x40243820, 0x67a1: 0x40243a20, 0x67a2: 0x40243c20, 0x67a3: 0x40243e20, + 0x67a4: 0x40244020, 0x67a5: 0x40244220, 0x67a6: 0x40244420, 0x67a7: 0x40244620, + 0x67a8: 0x40244820, 0x67a9: 0x40244a20, 0x67aa: 0x40244c20, 0x67ab: 0x40244e20, + 0x67ac: 0x40245020, 0x67ad: 0x40245220, 0x67ae: 0x40245420, 0x67af: 0x40245620, + 0x67b0: 0x40245820, 0x67b1: 0x40245a20, 0x67b2: 0x40245c20, 0x67b3: 0x40245e20, + 0x67b4: 0x40246020, 0x67b5: 0x40246220, 0x67b6: 0x40246420, 0x67b7: 0x40246620, + 0x67b9: 0x40246820, 0x67ba: 0x40246a20, 0x67bb: 0x40246c20, + 0x67bc: 0x40246e20, + // Block 0x19f, offset 0x67c0 + 0x67c0: 0x40247020, 0x67c1: 0x40247220, 0x67c2: 0x40247420, 0x67c3: 0x40247620, + 0x67c4: 0x40247820, 0x67c5: 0x40247a20, 0x67c6: 0x40247c20, 0x67c7: 0x40247e20, + 0x67c8: 0x40248020, 0x67c9: 0x40248220, 0x67ca: 0x40248420, 0x67cb: 0x40248620, + 0x67cc: 0x40248820, 0x67cd: 0x40248a20, 0x67ce: 0x40248c20, 0x67cf: 0x40248e20, + 0x67d0: 0x40249020, 0x67d1: 0x40249220, 0x67d2: 0x40249420, 0x67d3: 0x40249620, + 0x67d4: 0x40249820, 0x67d5: 0x40249a20, 0x67d6: 0x40249c20, 0x67d7: 0x40249e20, + 0x67d8: 0x4024a020, 0x67d9: 0x4024a220, 0x67da: 0x4024a420, 0x67db: 0x4024a620, + 0x67dc: 0x4024a820, 0x67dd: 0x4024aa20, 0x67de: 0x4024ac20, 0x67df: 0x4024ae20, + 0x67e0: 0x4024b020, 0x67e1: 0x4024b220, 0x67e2: 0x4024b420, 0x67e3: 0x4024b620, + 0x67e4: 0x4024b820, 0x67e5: 0x4024ba20, 0x67e6: 0x4024bc20, 0x67e7: 0x4024be20, + 0x67e8: 0x4024c020, 0x67e9: 0x4024c220, 0x67ea: 0x4024c420, 0x67eb: 0x4024c620, + 0x67ec: 0x4024c820, 0x67ed: 0x4024ca20, 0x67ee: 0x4024cc20, 0x67ef: 0x4024ce20, + 0x67f0: 0x4024d020, 0x67f1: 0x4024d220, 0x67f2: 0x4024d420, 0x67f3: 0x4024d620, + 0x67f4: 0x4024d820, 0x67f5: 0x4024da20, 0x67f6: 0x4024dc20, 0x67f7: 0x4024de20, + 0x67f8: 0x4024e020, 0x67f9: 0x4024e220, 0x67fa: 0x4024e420, 0x67fb: 0x4024e620, + 0x67fc: 0x4024e820, 0x67fd: 0x4024ea20, + // Block 0x1a0, offset 0x6800 + 0x6800: 0x4024ec20, 0x6801: 0x4024ee20, 0x6802: 0x4024f020, 0x6803: 0x4024f220, + 0x6810: 0x4024f420, 0x6811: 0x4024f620, 0x6812: 0x4024f820, 0x6813: 0x4024fa20, + 0x6814: 0x4024fc20, 0x6815: 0x4024fe20, 0x6816: 0x40250020, 0x6817: 0x40250220, + 0x6818: 0x40250420, 0x6819: 0x40250620, 0x681a: 0x40250820, 0x681b: 0x40250a20, + 0x681c: 0x40250c20, 0x681d: 0x40250e20, 0x681e: 0x40251020, 0x681f: 0x40251220, + 0x6820: 0x40251420, 0x6821: 0x40251620, 0x6822: 0x40251820, 0x6823: 0x40251a20, + 0x6824: 0x40251c20, 0x6825: 0x40251e20, 0x6826: 0x40252020, 0x6827: 0x40252220, + // Block 0x1a1, offset 0x6840 + 0x687b: 0x40252420, + 0x687c: 0x40252620, 0x687d: 0x40252820, 0x687e: 0x40252a20, 0x687f: 0x40252c20, + // Block 0x1a2, offset 0x6880 + 0x6880: 0x40252e20, 0x6881: 0x40253020, 0x6882: 0x40253220, 0x6883: 0x40253420, + 0x6884: 0x40253620, 0x6885: 0x40253820, 0x6886: 0x40253a20, 0x6887: 0x40253c20, + 0x6888: 0x40253e20, 0x6889: 0x40254020, 0x688a: 0x40254220, 0x688b: 0x40254420, + 0x688c: 0x40254620, 0x688d: 0x40254820, 0x688e: 0x40254a20, 0x688f: 0x40254c20, + 0x6890: 0x40254e20, 0x6891: 0x40255020, 0x6892: 0x40255220, 0x6893: 0x40255420, + 0x6894: 0x40255620, 0x6895: 0x40255820, 0x6896: 0x40255a20, 0x6897: 0x40255c20, + 0x6898: 0x40255e20, 0x6899: 0x40256020, 0x689a: 0x40256220, 0x689b: 0x40256420, + 0x689c: 0x40256620, 0x689d: 0x40256820, 0x689e: 0x40256a20, 0x689f: 0x40256c20, + 0x68a0: 0x40256e20, 0x68a1: 0x40257020, 0x68a2: 0x40257220, 0x68a3: 0x40257420, + 0x68a4: 0x40257620, 0x68a5: 0x40257820, 0x68a6: 0x40257a20, 0x68a7: 0x40257c20, + 0x68a8: 0x40257e20, 0x68a9: 0x40258020, 0x68aa: 0x40258220, 0x68ab: 0x40258420, + 0x68ac: 0x40258620, 0x68ad: 0x40258820, 0x68ae: 0x40258a20, 0x68af: 0x40258c20, + 0x68b0: 0x40258e20, 0x68b1: 0x40259020, 0x68b2: 0x40259220, 0x68b3: 0x40259420, + 0x68b4: 0x40259620, 0x68b5: 0x40259820, 0x68b6: 0x40259a20, 0x68b7: 0x40259c20, + 0x68b8: 0x40259e20, 0x68b9: 0x4025a020, 0x68ba: 0x4025a220, 0x68bb: 0x4025a420, + 0x68bc: 0x4025a620, 0x68bd: 0x4025a820, 0x68be: 0x4025aa20, 0x68bf: 0x4025ac20, + // Block 0x1a3, offset 0x68c0 + 0x68c0: 0x4025ae20, + 0x68c5: 0x4025b020, 0x68c6: 0x4025b220, 0x68c7: 0x4025b420, + 0x68c8: 0x4025b620, 0x68c9: 0x4025b820, 0x68ca: 0x4025ba20, 0x68cb: 0x4025bc20, + 0x68cc: 0x4025be20, 0x68cd: 0x4025c020, 0x68ce: 0x4025c220, 0x68cf: 0x4025c420, + // Block 0x1a4, offset 0x6900 + 0x6900: 0x4025c620, 0x6901: 0x4025c820, 0x6902: 0x4025ca20, 0x6903: 0x4025cc20, + 0x6904: 0x4025ce20, 0x6905: 0x4025d020, 0x6906: 0x4025d220, 0x6907: 0x4025d420, + 0x6908: 0x4025d620, 0x6909: 0x4025d820, 0x690a: 0x4025da20, 0x690b: 0x4025dc20, + 0x690c: 0x4025de20, 0x690d: 0x4025e020, 0x690e: 0x4025e220, 0x690f: 0x4025e420, + 0x6910: 0x4025e620, 0x6911: 0x4025e820, 0x6912: 0x4025ea20, 0x6913: 0x4025ec20, + 0x6914: 0x4025ee20, 0x6915: 0x4025f020, 0x6916: 0x4025f220, 0x6917: 0x4025f420, + 0x6918: 0x4025f620, 0x6919: 0x4025f820, 0x691a: 0x4025fa20, 0x691b: 0x4025fc20, + 0x691c: 0x4025fe20, 0x691d: 0x40260020, 0x691e: 0x40260220, 0x691f: 0x40260420, + 0x6920: 0x40260620, 0x6921: 0x40260820, 0x6922: 0x40260a20, 0x6923: 0x40260c20, + 0x6924: 0x40260e20, 0x6925: 0x40261020, 0x6926: 0x40261220, 0x6927: 0x40261420, + 0x6928: 0x40261620, 0x6929: 0x40261820, 0x692a: 0x40261a20, 0x692b: 0x40261c20, + 0x692c: 0x40261e20, 0x692d: 0x40262020, 0x692e: 0x40262220, 0x692f: 0x40262420, + 0x6930: 0x40262620, 0x6931: 0x40262820, 0x6932: 0x40262a20, 0x6933: 0x40262c20, + 0x6934: 0x40262e20, 0x6935: 0x40263020, 0x6936: 0x40263220, 0x6937: 0x40263420, + 0x6938: 0x40263620, 0x6939: 0x40263820, 0x693a: 0x40263a20, 0x693b: 0x40263c20, + 0x693c: 0x40263e20, 0x693d: 0x40264020, 0x693e: 0x40264220, 0x693f: 0x40264420, + // Block 0x1a5, offset 0x6940 + 0x6940: 0x40264620, 0x6941: 0x40264820, 0x6942: 0x40264a20, 0x6943: 0x40264c20, + 0x6944: 0x40264e20, 0x6945: 0x40265020, + // Block 0x1a6, offset 0x6980 + 0x6980: 0x40265220, 0x6981: 0x40265420, 0x6982: 0x40265620, 0x6983: 0x40265820, + 0x6984: 0x40265a20, 0x6985: 0x40265c20, 0x6986: 0x40265e20, 0x6987: 0x40266020, + 0x6988: 0x40266220, 0x6989: 0x40266420, 0x698a: 0x40266620, 0x698b: 0x40266820, + 0x698c: 0x40266a20, 0x698d: 0x40266c20, 0x698e: 0x40266e20, 0x698f: 0x40267020, + 0x6990: 0x40267220, 0x6991: 0x40267420, 0x6992: 0x40267620, 0x6993: 0x40267820, + 0x6994: 0x40267a20, 0x6995: 0x40267c20, 0x6996: 0x40267e20, 0x6997: 0x40268020, + 0x6998: 0x40268220, 0x6999: 0x40268420, 0x699a: 0x40268620, 0x699b: 0x40268820, + 0x699c: 0x40268a20, 0x699d: 0x40268c20, 0x699e: 0x40268e20, 0x699f: 0x40269020, + 0x69a0: 0x40269220, 0x69a1: 0x40269420, 0x69a2: 0x40269620, 0x69a3: 0x40269820, + 0x69a4: 0x40269a20, 0x69a5: 0x40269c20, 0x69a6: 0x40269e20, 0x69a7: 0x4026a020, + 0x69a8: 0x4026a220, 0x69a9: 0x4026a420, 0x69aa: 0x4026a620, 0x69ab: 0x4026a820, + 0x69ac: 0x4026aa20, 0x69ad: 0x4026ac20, 0x69ae: 0x4026ae20, 0x69af: 0x4026b020, + 0x69b0: 0x4026b220, 0x69b1: 0x4026b420, 0x69b2: 0x4026b620, 0x69b3: 0x4026b820, + 0x69b4: 0x4026ba20, 0x69b5: 0x4026bc20, 0x69b6: 0x4026be20, 0x69b7: 0x4026c020, + 0x69b8: 0x4026c220, 0x69b9: 0x4026c420, 0x69ba: 0x4026c620, 0x69bb: 0x4026c820, + 0x69bc: 0x4026ca20, 0x69bd: 0x4026cc20, 0x69be: 0x4026ce20, 0x69bf: 0x4026d020, + // Block 0x1a7, offset 0x69c0 + 0x69c0: 0x4026d220, 0x69c1: 0x4026d420, 0x69c2: 0x4026d620, 0x69c3: 0x4026d820, + 0x69c4: 0x4026da20, 0x69c5: 0x4026dc20, 0x69c6: 0x4026de20, 0x69c7: 0x4026e020, + 0x69c8: 0x4026e220, 0x69c9: 0x4026e420, 0x69ca: 0x4026e620, 0x69cb: 0x4026e820, + 0x69cc: 0x4026ea20, 0x69cd: 0x4026ec20, 0x69ce: 0x4026ee20, 0x69cf: 0x4026f020, + 0x69d0: 0x4026f220, 0x69d1: 0x4026f420, 0x69d2: 0x4026f620, 0x69d3: 0x4026f820, + 0x69d4: 0x4026fa20, 0x69d5: 0x4026fc20, 0x69d6: 0x4026fe20, 0x69d7: 0x40270020, + 0x69d8: 0x40270220, 0x69d9: 0x40270420, 0x69da: 0x40270620, 0x69db: 0x40270820, + 0x69dc: 0x40270a20, 0x69dd: 0x40270c20, 0x69de: 0x40270e20, 0x69df: 0x40271020, + 0x69e0: 0x40271220, 0x69e1: 0x40271420, 0x69e2: 0x40271620, 0x69e3: 0x40271820, + 0x69e4: 0x40271a20, 0x69e5: 0x40271c20, 0x69e6: 0x40271e20, 0x69e7: 0x40272020, + 0x69e8: 0x40272220, 0x69e9: 0x40272420, 0x69ea: 0x40272620, 0x69eb: 0x40272820, + 0x69ec: 0x40272a20, 0x69ed: 0x40272c20, 0x69ee: 0x40272e20, 0x69ef: 0x40273020, + 0x69f0: 0x40273220, 0x69f1: 0x40273420, 0x69f2: 0x40273620, 0x69f3: 0x40273820, + // Block 0x1a8, offset 0x6a00 + 0x6a00: 0x429c7a20, 0x6a01: 0x429c7020, 0x6a02: 0x429c8220, 0x6a03: 0x48024420, + 0x6a04: 0x429ec020, 0x6a05: 0x429f5c20, 0x6a06: 0x429f7620, 0x6a07: 0x42a00420, + 0x6a08: 0x42a0f420, 0x6a09: 0x42a13220, 0x6a0a: 0x42a1ce20, 0x6a0b: 0x42a19e20, + 0x6a0c: 0x44693c20, 0x6a0d: 0x480c7420, 0x6a0e: 0x42a29a20, 0x6a0f: 0x42a2a820, + 0x6a10: 0x42a2c820, 0x6a11: 0x42a2ee20, 0x6a12: 0x480a3820, 0x6a13: 0x44697220, + 0x6a14: 0x42a2ce20, 0x6a15: 0x42a31a20, 0x6a16: 0x480a9620, 0x6a17: 0x42a32e20, + 0x6a18: 0x42a34820, 0x6a19: 0x429d9820, 0x6a1a: 0x42a35820, 0x6a1b: 0x42a36a20, + 0x6a1c: 0x4923be20, 0x6a1d: 0x42a3ea20, 0x6a1e: 0x42a40620, 0x6a1f: 0x4469be20, + 0x6a20: 0x42a47620, 0x6a21: 0x42a48c20, 0x6a22: 0x42a4e420, 0x6a23: 0x42a4ee20, + 0x6a24: 0x446a2a20, 0x6a25: 0x42a58e20, 0x6a26: 0x42a59220, 0x6a27: 0x42a5c820, + 0x6a28: 0x42a5f420, 0x6a29: 0x42a60a20, 0x6a2a: 0x42a60c20, 0x6a2b: 0x42a62e20, + 0x6a2c: 0x42a69220, 0x6a2d: 0x42a6a220, 0x6a2e: 0x42a6b420, 0x6a2f: 0x42a6e620, + 0x6a30: 0x42a6fa20, 0x6a31: 0x42a6fe20, 0x6a32: 0x42a6fe20, 0x6a33: 0x42a6fe20, + 0x6a34: 0x48145820, 0x6a35: 0x42e0e020, 0x6a36: 0x42a79420, 0x6a37: 0x42a7be20, + 0x6a38: 0x4816c620, 0x6a39: 0x42a7d620, 0x6a3a: 0x42a7e220, 0x6a3b: 0x42a80c20, + 0x6a3c: 0x42a93c20, 0x6a3d: 0x42a87020, 0x6a3e: 0x42a89020, 0x6a3f: 0x42a8d020, + // Block 0x1a9, offset 0x6a40 + 0x6a40: 0x42a94420, 0x6a41: 0x42a9ec20, 0x6a42: 0x42aa2020, 0x6a43: 0x42aaa620, + 0x6a44: 0x42aac620, 0x6a45: 0x42ab0820, 0x6a46: 0x42ab0820, 0x6a47: 0x42ab3220, + 0x6a48: 0x42ab5620, 0x6a49: 0x42ab6620, 0x6a4a: 0x42ab8420, 0x6a4b: 0x42ae2c20, + 0x6a4c: 0x42ac0c20, 0x6a4d: 0x42ae2e20, 0x6a4e: 0x42aca220, 0x6a4f: 0x42ace820, + 0x6a50: 0x42a40e20, 0x6a51: 0x42b1dc20, 0x6a52: 0x42af9c20, 0x6a53: 0x42afe820, + 0x6a54: 0x42b01a20, 0x6a55: 0x42af1620, 0x6a56: 0x42b06420, 0x6a57: 0x42b06220, + 0x6a58: 0x42b15820, 0x6a59: 0x4829c820, 0x6a5a: 0x42b1e420, 0x6a5b: 0x42b1ee20, + 0x6a5c: 0x42b20c20, 0x6a5d: 0x42b23420, 0x6a5e: 0x42b24420, 0x6a5f: 0x42b2c420, + 0x6a60: 0x482d5020, 0x6a61: 0x482dd420, 0x6a62: 0x42b3d820, 0x6a63: 0x42b43620, + 0x6a64: 0x42b44e20, 0x6a65: 0x42b3b020, 0x6a66: 0x42b4cc20, 0x6a67: 0x446ddc20, + 0x6a68: 0x446df820, 0x6a69: 0x42b61020, 0x6a6a: 0x42b67c20, 0x6a6b: 0x42b67c20, + 0x6a6c: 0x48339020, 0x6a6d: 0x42b78620, 0x6a6e: 0x42b7b020, 0x6a6f: 0x42b7ce20, + 0x6a70: 0x42b7e620, 0x6a71: 0x48363020, 0x6a72: 0x42b7fe20, 0x6a73: 0x42b80c20, + 0x6a74: 0x42bea620, 0x6a75: 0x42b84420, 0x6a76: 0x446f0220, 0x6a77: 0x42b8c020, + 0x6a78: 0x42b8dc20, 0x6a79: 0x42b98020, 0x6a7a: 0x42b91a20, 0x6a7b: 0x483bc820, + 0x6a7c: 0x42ba8620, 0x6a7d: 0x483bcc20, 0x6a7e: 0x42badc20, 0x6a7f: 0x42bad620, + // Block 0x1aa, offset 0x6a80 + 0x6a80: 0x42baf820, 0x6a81: 0x42bbc220, 0x6a82: 0x42bbc420, 0x6a83: 0x44705e20, + 0x6a84: 0x42bbfa20, 0x6a85: 0x42bc5020, 0x6a86: 0x42bc7a20, 0x6a87: 0x42bcd220, + 0x6a88: 0x4470c420, 0x6a89: 0x48430620, 0x6a8a: 0x4470f820, 0x6a8b: 0x42bd6020, + 0x6a8c: 0x42bd6620, 0x6a8d: 0x42bd6c20, 0x6a8e: 0x42bd9420, 0x6a8f: 0x49472420, + 0x6a90: 0x42bdfc20, 0x6a91: 0x48466220, 0x6a92: 0x48466220, 0x6a93: 0x43040220, + 0x6a94: 0x42be4420, 0x6a95: 0x42be4420, 0x6a96: 0x44718e20, 0x6a97: 0x48657020, + 0x6a98: 0x48c3b420, 0x6a99: 0x42bec420, 0x6a9a: 0x42bed620, 0x6a9b: 0x4471c620, + 0x6a9c: 0x42bf3420, 0x6a9d: 0x42bf9a20, 0x6a9e: 0x42bfae20, 0x6a9f: 0x42bff220, + 0x6aa0: 0x42c10220, 0x6aa1: 0x44727420, 0x6aa2: 0x44723820, 0x6aa3: 0x42c12820, + 0x6aa4: 0x484da820, 0x6aa5: 0x42c18e20, 0x6aa6: 0x42c29020, 0x6aa7: 0x42c29820, + 0x6aa8: 0x42c29c20, 0x6aa9: 0x42c29820, 0x6aaa: 0x42c2f420, 0x6aab: 0x42c31c20, + 0x6aac: 0x42c36420, 0x6aad: 0x42c34820, 0x6aae: 0x42c35e20, 0x6aaf: 0x42c3bc20, + 0x6ab0: 0x42c3e420, 0x6ab1: 0x42c3ec20, 0x6ab2: 0x42c42020, 0x6ab3: 0x42c43620, + 0x6ab4: 0x42c4ba20, 0x6ab5: 0x42c56220, 0x6ab6: 0x42c5a820, 0x6ab7: 0x42c6a020, + 0x6ab8: 0x48561820, 0x6ab9: 0x42c67a20, 0x6aba: 0x42c5f820, 0x6abb: 0x42c6d020, + 0x6abc: 0x42c70620, 0x6abd: 0x42c7c820, 0x6abe: 0x4857e220, 0x6abf: 0x42c84420, + // Block 0x1ab, offset 0x6ac0 + 0x6ac0: 0x42c78a20, 0x6ac1: 0x42c75220, 0x6ac2: 0x44745c20, 0x6ac3: 0x42c8d220, + 0x6ac4: 0x42c8fc20, 0x6ac5: 0x42c93a20, 0x6ac6: 0x42c8ee20, 0x6ac7: 0x4474d820, + 0x6ac8: 0x42ca9e20, 0x6ac9: 0x42cad820, 0x6aca: 0x48601420, 0x6acb: 0x42cbc620, + 0x6acc: 0x42cdf020, 0x6acd: 0x42cc9220, 0x6ace: 0x44763220, 0x6acf: 0x42cd2220, + 0x6ad0: 0x44761020, 0x6ad1: 0x4475c820, 0x6ad2: 0x42a32420, 0x6ad3: 0x42a32a20, + 0x6ad4: 0x42ce0020, 0x6ad5: 0x42cd3820, 0x6ad6: 0x43015a20, 0x6ad7: 0x4487b220, + 0x6ad8: 0x42ce2e20, 0x6ad9: 0x42ce3620, 0x6ada: 0x42ce4220, 0x6adb: 0x42cebc20, + 0x6adc: 0x42cea620, 0x6add: 0x48678620, 0x6ade: 0x44769220, 0x6adf: 0x42cff420, + 0x6ae0: 0x42cf0a20, 0x6ae1: 0x42d0a420, 0x6ae2: 0x42d10a20, 0x6ae3: 0x4868da20, + 0x6ae4: 0x42d11c20, 0x6ae5: 0x42d03e20, 0x6ae6: 0x42d22820, 0x6ae7: 0x44773a20, + 0x6ae8: 0x42d28420, 0x6ae9: 0x42d34620, 0x6aea: 0x42d3d420, 0x6aeb: 0x42d55020, + 0x6aec: 0x486d4620, 0x6aed: 0x42d5b620, 0x6aee: 0x44783020, 0x6aef: 0x42d64220, + 0x6af0: 0x48714e20, 0x6af1: 0x42d6a820, 0x6af2: 0x44789c20, 0x6af3: 0x42d6e420, + 0x6af4: 0x42d73e20, 0x6af5: 0x42d77420, 0x6af6: 0x42d77620, 0x6af7: 0x48751a20, + 0x6af8: 0x483a1620, 0x6af9: 0x4875f420, 0x6afa: 0x42d89c20, 0x6afb: 0x48797820, + 0x6afc: 0x42d97e20, 0x6afd: 0x42d99a20, 0x6afe: 0x42d8ce20, 0x6aff: 0x42da2c20, + // Block 0x1ac, offset 0x6b00 + 0x6b00: 0x42da7c20, 0x6b01: 0x42daee20, 0x6b02: 0x42da8220, 0x6b03: 0x42dad220, + 0x6b04: 0x42daf020, 0x6b05: 0x42db0a20, 0x6b06: 0x487a3c20, 0x6b07: 0x42da6820, + 0x6b08: 0x42dc5e20, 0x6b09: 0x42dcdc20, 0x6b0a: 0x447a6620, 0x6b0b: 0x42dd9620, + 0x6b0c: 0x42dd8e20, 0x6b0d: 0x487da220, 0x6b0e: 0x42dbf220, 0x6b0f: 0x42dedc20, + 0x6b10: 0x487ebc20, 0x6b11: 0x487f1c20, 0x6b12: 0x42df8c20, 0x6b13: 0x42e07220, + 0x6b14: 0x42e03c20, 0x6b15: 0x42e03620, 0x6b16: 0x447b2c20, 0x6b17: 0x42e09420, + 0x6b18: 0x42e0fa20, 0x6b19: 0x42e0ee20, 0x6b1a: 0x42e15a20, 0x6b1b: 0x480a4a20, + 0x6b1c: 0x42e28a20, 0x6b1d: 0x4884c620, 0x6b1e: 0x42e33820, 0x6b1f: 0x48875620, + 0x6b20: 0x42e45020, 0x6b21: 0x42e46a20, 0x6b22: 0x42e4a020, 0x6b23: 0x488c1020, + 0x6b24: 0x42e50020, 0x6b25: 0x42e52a20, 0x6b26: 0x488e6a20, 0x6b27: 0x48902820, + 0x6b28: 0x42e6f420, 0x6b29: 0x42e71620, 0x6b2a: 0x447d5820, 0x6b2b: 0x42e74a20, + 0x6b2c: 0x447d7020, 0x6b2d: 0x447d7020, 0x6b2e: 0x42e88e20, 0x6b2f: 0x42e8b820, + 0x6b30: 0x42e8e220, 0x6b31: 0x42e90a20, 0x6b32: 0x42e99420, 0x6b33: 0x447e3620, + 0x6b34: 0x42ea4820, 0x6b35: 0x48986c20, 0x6b36: 0x42ea7c20, 0x6b37: 0x48992420, + 0x6b38: 0x42eae020, 0x6b39: 0x48433e20, 0x6b3a: 0x42ec2020, 0x6b3b: 0x489f4220, + 0x6b3c: 0x489f7020, 0x6b3d: 0x48a08820, 0x6b3e: 0x447ff820, 0x6b3f: 0x44801020, + // Block 0x1ad, offset 0x6b40 + 0x6b40: 0x42ede820, 0x6b41: 0x48a1e620, 0x6b42: 0x48a1e420, 0x6b43: 0x48a23220, + 0x6b44: 0x48a26620, 0x6b45: 0x42ee3c20, 0x6b46: 0x42ee3e20, 0x6b47: 0x42ee3e20, + 0x6b48: 0x42ee9420, 0x6b49: 0x44807220, 0x6b4a: 0x42ef1620, 0x6b4b: 0x44808c20, + 0x6b4c: 0x44812c20, 0x6b4d: 0x48a83a20, 0x6b4e: 0x42f09c20, 0x6b4f: 0x42f11820, + 0x6b50: 0x42f19820, 0x6b51: 0x4481c620, 0x6b52: 0x48ac4c20, 0x6b53: 0x42f2ac20, + 0x6b54: 0x48ad3420, 0x6b55: 0x48ad8a20, 0x6b56: 0x42f31e20, 0x6b57: 0x42f3d620, + 0x6b58: 0x44825e20, 0x6b59: 0x42f48020, 0x6b5a: 0x42f49420, 0x6b5b: 0x42f49e20, + 0x6b5c: 0x48b2f820, 0x6b5d: 0x48b54e20, 0x6b5e: 0x48b54e20, 0x6b5f: 0x42f5dc20, + 0x6b60: 0x44840420, 0x6b61: 0x48b75620, 0x6b62: 0x42f78c20, 0x6b63: 0x42f79220, + 0x6b64: 0x44844e20, 0x6b65: 0x48b90020, 0x6b66: 0x42f9a420, 0x6b67: 0x44854020, + 0x6b68: 0x42f9d020, 0x6b69: 0x42f9c620, 0x6b6a: 0x42fa0020, 0x6b6b: 0x48bf0c20, + 0x6b6c: 0x42fac620, 0x6b6d: 0x44860220, 0x6b6e: 0x42fb8e20, 0x6b6f: 0x42fc0420, + 0x6b70: 0x42fc8a20, 0x6b71: 0x44866820, 0x6b72: 0x48c45020, 0x6b73: 0x48c48e20, + 0x6b74: 0x4486b220, 0x6b75: 0x48c5b220, 0x6b76: 0x42fef420, 0x6b77: 0x48c67c20, + 0x6b78: 0x42ff2a20, 0x6b79: 0x42fff420, 0x6b7a: 0x43000a20, 0x6b7b: 0x48c9b420, + 0x6b7c: 0x48ca4620, 0x6b7d: 0x4300c020, 0x6b7e: 0x48cb5020, 0x6b7f: 0x4300e020, + // Block 0x1ae, offset 0x6b80 + 0x6b80: 0x4866be20, 0x6b81: 0x4487aa20, 0x6b82: 0x43016420, 0x6b83: 0x43020620, + 0x6b84: 0x44881620, 0x6b85: 0x43027c20, 0x6b86: 0x42b56a20, 0x6b87: 0x48cf4e20, + 0x6b88: 0x48cf6a20, 0x6b89: 0x48672620, 0x6b8a: 0x48673820, 0x6b8b: 0x43040220, + 0x6b8c: 0x43040820, 0x6b8d: 0x431f3c20, 0x6b8e: 0x4488d620, 0x6b8f: 0x43052220, + 0x6b90: 0x43051620, 0x6b91: 0x43053a20, 0x6b92: 0x42a56620, 0x6b93: 0x43056220, + 0x6b94: 0x43056620, 0x6b95: 0x43057a20, 0x6b96: 0x4305cc20, 0x6b97: 0x48d67820, + 0x6b98: 0x4305ca20, 0x6b99: 0x43063a20, 0x6b9a: 0x4306c620, 0x6b9b: 0x43075a20, + 0x6b9c: 0x43064620, 0x6b9d: 0x43077a20, 0x6b9e: 0x4307ce20, 0x6b9f: 0x4308ae20, + 0x6ba0: 0x4306a620, 0x6ba1: 0x43079420, 0x6ba2: 0x43079820, 0x6ba3: 0x4307b820, + 0x6ba4: 0x48d86c20, 0x6ba5: 0x48dad620, 0x6ba6: 0x48d9aa20, 0x6ba7: 0x448a5620, + 0x6ba8: 0x4309e220, 0x6ba9: 0x4309e620, 0x6baa: 0x430a2c20, 0x6bab: 0x48e79420, + 0x6bac: 0x430ac820, 0x6bad: 0x48de5820, 0x6bae: 0x448aba20, 0x6baf: 0x448ac220, + 0x6bb0: 0x48df6220, 0x6bb1: 0x48e1a420, 0x6bb2: 0x448ad620, 0x6bb3: 0x430ca020, + 0x6bb4: 0x430cb820, 0x6bb5: 0x430cce20, 0x6bb6: 0x430cd220, 0x6bb7: 0x430d5220, + 0x6bb8: 0x430d1020, 0x6bb9: 0x430e1c20, 0x6bba: 0x430dc420, 0x6bbb: 0x430ef220, + 0x6bbc: 0x430e5020, 0x6bbd: 0x430ed620, 0x6bbe: 0x430f0c20, 0x6bbf: 0x448bae20, + // Block 0x1af, offset 0x6bc0 + 0x6bc0: 0x430fc220, 0x6bc1: 0x43100220, 0x6bc2: 0x448bf220, 0x6bc3: 0x4310c020, + 0x6bc4: 0x4310c620, 0x6bc5: 0x48ecce20, 0x6bc6: 0x4311ae20, 0x6bc7: 0x4311bc20, + 0x6bc8: 0x448c6a20, 0x6bc9: 0x4311f420, 0x6bca: 0x44697620, 0x6bcb: 0x48f15c20, + 0x6bcc: 0x48f2cc20, 0x6bcd: 0x448d7c20, 0x6bce: 0x448d8e20, 0x6bcf: 0x43154020, + 0x6bd0: 0x4315da20, 0x6bd1: 0x43171420, 0x6bd2: 0x4318aa20, 0x6bd3: 0x48f95020, + 0x6bd4: 0x43195620, 0x6bd5: 0x43198220, 0x6bd6: 0x431a3620, 0x6bd7: 0x431aee20, + 0x6bd8: 0x48fe5e20, 0x6bd9: 0x48100820, 0x6bda: 0x431b9620, 0x6bdb: 0x431b7820, + 0x6bdc: 0x431be020, 0x6bdd: 0x4811bc20, 0x6bde: 0x431da820, 0x6bdf: 0x431e7020, + 0x6be0: 0x490ba420, 0x6be1: 0x490bda20, 0x6be2: 0x43212820, 0x6be3: 0x4321e220, + 0x6be4: 0x43222220, 0x6be5: 0x490e5c20, 0x6be6: 0x43223620, 0x6be7: 0x43247020, + 0x6be8: 0x4325ae20, 0x6be9: 0x4325b020, 0x6bea: 0x4324f820, 0x6beb: 0x4327f220, + 0x6bec: 0x43282a20, 0x6bed: 0x4917f420, 0x6bee: 0x432b1620, 0x6bef: 0x44932a20, + 0x6bf0: 0x432b6e20, 0x6bf1: 0x491aee20, 0x6bf2: 0x4493cc20, 0x6bf3: 0x432d8620, + 0x6bf4: 0x42bb6420, 0x6bf5: 0x432e4620, 0x6bf6: 0x49228a20, 0x6bf7: 0x49243420, + 0x6bf8: 0x4494dc20, 0x6bf9: 0x4494ec20, 0x6bfa: 0x432fc020, 0x6bfb: 0x49281420, + 0x6bfc: 0x44956420, 0x6bfd: 0x49292c20, 0x6bfe: 0x43301620, 0x6bff: 0x43301620, + // Block 0x1b0, offset 0x6c00 + 0x6c00: 0x43305220, 0x6c01: 0x492b6c20, 0x6c02: 0x4331c420, 0x6c03: 0x44966620, + 0x6c04: 0x43325220, 0x6c05: 0x43334e20, 0x6c06: 0x43338420, 0x6c07: 0x4333fc20, + 0x6c08: 0x44979c20, 0x6c09: 0x49366020, 0x6c0a: 0x43362420, 0x6c0b: 0x43388020, + 0x6c0c: 0x4339fa20, 0x6c0d: 0x44999c20, 0x6c0e: 0x4499da20, 0x6c0f: 0x433ace20, + 0x6c10: 0x49419c20, 0x6c11: 0x4499f020, 0x6c12: 0x49420a20, 0x6c13: 0x49441c20, + 0x6c14: 0x49452220, 0x6c15: 0x433d7620, 0x6c16: 0x449aac20, 0x6c17: 0x433df220, + 0x6c18: 0x433dfc20, 0x6c19: 0x433e0a20, 0x6c1a: 0x433e1e20, 0x6c1b: 0x433e2c20, + 0x6c1c: 0x433e7620, 0x6c1d: 0x494c0020, + // Block 0x1b1, offset 0x6c40 + 0x6c41: 0xa0000000, + 0x6c60: 0xa0000000, 0x6c61: 0xa0000000, 0x6c62: 0xa0000000, 0x6c63: 0xa0000000, + 0x6c64: 0xa0000000, 0x6c65: 0xa0000000, 0x6c66: 0xa0000000, 0x6c67: 0xa0000000, + 0x6c68: 0xa0000000, 0x6c69: 0xa0000000, 0x6c6a: 0xa0000000, 0x6c6b: 0xa0000000, + 0x6c6c: 0xa0000000, 0x6c6d: 0xa0000000, 0x6c6e: 0xa0000000, 0x6c6f: 0xa0000000, + 0x6c70: 0xa0000000, 0x6c71: 0xa0000000, 0x6c72: 0xa0000000, 0x6c73: 0xa0000000, + 0x6c74: 0xa0000000, 0x6c75: 0xa0000000, 0x6c76: 0xa0000000, 0x6c77: 0xa0000000, + 0x6c78: 0xa0000000, 0x6c79: 0xa0000000, 0x6c7a: 0xa0000000, 0x6c7b: 0xa0000000, + 0x6c7c: 0xa0000000, 0x6c7d: 0xa0000000, 0x6c7e: 0xa0000000, 0x6c7f: 0xa0000000, + // Block 0x1b2, offset 0x6c80 + 0x6c80: 0xa0000000, 0x6c81: 0xa0000000, 0x6c82: 0xa0000000, 0x6c83: 0xa0000000, + 0x6c84: 0xa0000000, 0x6c85: 0xa0000000, 0x6c86: 0xa0000000, 0x6c87: 0xa0000000, + 0x6c88: 0xa0000000, 0x6c89: 0xa0000000, 0x6c8a: 0xa0000000, 0x6c8b: 0xa0000000, + 0x6c8c: 0xa0000000, 0x6c8d: 0xa0000000, 0x6c8e: 0xa0000000, 0x6c8f: 0xa0000000, + 0x6c90: 0xa0000000, 0x6c91: 0xa0000000, 0x6c92: 0xa0000000, 0x6c93: 0xa0000000, + 0x6c94: 0xa0000000, 0x6c95: 0xa0000000, 0x6c96: 0xa0000000, 0x6c97: 0xa0000000, + 0x6c98: 0xa0000000, 0x6c99: 0xa0000000, 0x6c9a: 0xa0000000, 0x6c9b: 0xa0000000, + 0x6c9c: 0xa0000000, 0x6c9d: 0xa0000000, 0x6c9e: 0xa0000000, 0x6c9f: 0xa0000000, + 0x6ca0: 0xa0000000, 0x6ca1: 0xa0000000, 0x6ca2: 0xa0000000, 0x6ca3: 0xa0000000, + 0x6ca4: 0xa0000000, 0x6ca5: 0xa0000000, 0x6ca6: 0xa0000000, 0x6ca7: 0xa0000000, + 0x6ca8: 0xa0000000, 0x6ca9: 0xa0000000, 0x6caa: 0xa0000000, 0x6cab: 0xa0000000, + 0x6cac: 0xa0000000, 0x6cad: 0xa0000000, 0x6cae: 0xa0000000, 0x6caf: 0xa0000000, + 0x6cb0: 0xa0000000, 0x6cb1: 0xa0000000, 0x6cb2: 0xa0000000, 0x6cb3: 0xa0000000, + 0x6cb4: 0xa0000000, 0x6cb5: 0xa0000000, 0x6cb6: 0xa0000000, 0x6cb7: 0xa0000000, + 0x6cb8: 0xa0000000, 0x6cb9: 0xa0000000, 0x6cba: 0xa0000000, 0x6cbb: 0xa0000000, + 0x6cbc: 0xa0000000, 0x6cbd: 0xa0000000, 0x6cbe: 0xa0000000, 0x6cbf: 0xa0000000, + // Block 0x1b3, offset 0x6cc0 + 0x6cc0: 0xa0000000, 0x6cc1: 0xa0000000, 0x6cc2: 0xa0000000, 0x6cc3: 0xa0000000, + 0x6cc4: 0xa0000000, 0x6cc5: 0xa0000000, 0x6cc6: 0xa0000000, 0x6cc7: 0xa0000000, + 0x6cc8: 0xa0000000, 0x6cc9: 0xa0000000, 0x6cca: 0xa0000000, 0x6ccb: 0xa0000000, + 0x6ccc: 0xa0000000, 0x6ccd: 0xa0000000, 0x6cce: 0xa0000000, 0x6ccf: 0xa0000000, + 0x6cd0: 0xa0000000, 0x6cd1: 0xa0000000, 0x6cd2: 0xa0000000, 0x6cd3: 0xa0000000, + 0x6cd4: 0xa0000000, 0x6cd5: 0xa0000000, 0x6cd6: 0xa0000000, 0x6cd7: 0xa0000000, + 0x6cd8: 0xa0000000, 0x6cd9: 0xa0000000, 0x6cda: 0xa0000000, 0x6cdb: 0xa0000000, + 0x6cdc: 0xa0000000, 0x6cdd: 0xa0000000, 0x6cde: 0xa0000000, 0x6cdf: 0xa0000000, + 0x6ce0: 0xa0000000, 0x6ce1: 0xa0000000, 0x6ce2: 0xa0000000, 0x6ce3: 0xa0000000, + 0x6ce4: 0xa0000000, 0x6ce5: 0xa0000000, 0x6ce6: 0xa0000000, 0x6ce7: 0xa0000000, + 0x6ce8: 0xa0000000, 0x6ce9: 0xa0000000, 0x6cea: 0xa0000000, 0x6ceb: 0xa0000000, + 0x6cec: 0xa0000000, 0x6ced: 0xa0000000, 0x6cee: 0xa0000000, 0x6cef: 0xa0000000, + // Block 0x1b4, offset 0x6d00 + 0x6d00: 0xa0000000, 0x6d01: 0xa0000000, 0x6d02: 0xa0000000, 0x6d03: 0xa0000000, + 0x6d04: 0xa0000000, 0x6d05: 0xa0000000, 0x6d06: 0xa0000000, 0x6d07: 0xa0000000, + 0x6d08: 0xa0000000, 0x6d09: 0x40020020, 0x6d0a: 0x40020220, 0x6d0b: 0x40020420, + 0x6d0c: 0x40020620, 0x6d0d: 0x40020820, 0x6d0e: 0xa0000000, 0x6d0f: 0xa0000000, + 0x6d10: 0xa0000000, 0x6d11: 0xa0000000, 0x6d12: 0xa0000000, 0x6d13: 0xa0000000, + 0x6d14: 0xa0000000, 0x6d15: 0xa0000000, 0x6d16: 0xa0000000, 0x6d17: 0xa0000000, + 0x6d18: 0xa0000000, 0x6d19: 0xa0000000, 0x6d1a: 0xa0000000, 0x6d1b: 0xa0000000, + 0x6d1c: 0xa0000000, 0x6d1d: 0xa0000000, 0x6d1e: 0xa0000000, 0x6d1f: 0xa0000000, + 0x6d20: 0x40021220, 0x6d21: 0x4002ba20, 0x6d22: 0x4003e020, 0x6d23: 0x4004ea20, + 0x6d24: 0x4027de20, 0x6d25: 0x4004ec20, 0x6d26: 0x4004e620, 0x6d27: 0x4003d220, + 0x6d28: 0x4003f420, 0x6d29: 0x4003f620, 0x6d2a: 0x4004d820, 0x6d2b: 0x40093820, + 0x6d2c: 0x40024020, 0x6d2d: 0x40021a20, 0x6d2e: 0x4002e420, 0x6d2f: 0x4004e220, + 0x6d30: 0x4029cc20, 0x6d31: 0x4029ce20, 0x6d32: 0x4029d020, 0x6d33: 0x4029d220, + 0x6d34: 0x4029d420, 0x6d35: 0x4029d620, 0x6d36: 0x4029d820, 0x6d37: 0x4029da20, + 0x6d38: 0x4029dc20, 0x6d39: 0x4029de20, 0x6d3a: 0x40026c20, 0x6d3b: 0x40026220, + 0x6d3c: 0x40094020, 0x6d3d: 0xc32f0851, 0x6d3e: 0x40094420, 0x6d3f: 0x4002c420, + // Block 0x1b5, offset 0x6d40 + 0x6d40: 0x4004d620, 0x6d41: 0x002bde88, 0x6d42: 0x002c0a88, 0x6d43: 0x002c3a88, + 0x6d44: 0x002c6288, 0x6d45: 0x002c9888, 0x6d46: 0x002d0888, 0x6d47: 0x002d2288, + 0x6d48: 0x002d6888, 0x6d49: 0x002d9a88, 0x6d4a: 0x002dcc88, 0x6d4b: 0x002dfe88, + 0x6d4c: 0xc0030002, 0x6d4d: 0x002e8288, 0x6d4e: 0x002e9e88, 0x6d4f: 0x002ee288, + 0x6d50: 0x002f2c88, 0x6d51: 0x002f5688, 0x6d52: 0x002f7a88, 0x6d53: 0x002fe688, + 0x6d54: 0x00302c88, 0x6d55: 0x00306c88, 0x6d56: 0x0030be88, 0x6d57: 0x0030e288, + 0x6d58: 0x0030f688, 0x6d59: 0x00310088, 0x6d5a: 0x00312a88, 0x6d5b: 0x4003f820, + 0x6d5c: 0x4004e420, 0x6d5d: 0x4003fa20, 0x6d5e: 0x40062420, 0x6d5f: 0x40021620, + 0x6d60: 0x40061e20, 0x6d61: 0x402bde20, 0x6d62: 0x402c0a20, 0x6d63: 0x402c3a20, + 0x6d64: 0x402c6220, 0x6d65: 0x402c9820, 0x6d66: 0x402d0820, 0x6d67: 0x402d2220, + 0x6d68: 0x402d6820, 0x6d69: 0x402d9a20, 0x6d6a: 0x402dcc20, 0x6d6b: 0x402dfe20, + 0x6d6c: 0xc0000002, 0x6d6d: 0x402e8220, 0x6d6e: 0x402e9e20, 0x6d6f: 0x402ee220, + 0x6d70: 0x402f2c20, 0x6d71: 0x402f5620, 0x6d72: 0x402f7a20, 0x6d73: 0x402fe620, + 0x6d74: 0x40302c20, 0x6d75: 0x40306c20, 0x6d76: 0x4030be20, 0x6d77: 0x4030e220, + 0x6d78: 0x4030f620, 0x6d79: 0x40310020, 0x6d7a: 0x40312a20, 0x6d7b: 0x4003fc20, + 0x6d7c: 0x40094820, 0x6d7d: 0x4003fe20, 0x6d7e: 0x40094c20, 0x6d7f: 0xa0000000, + // Block 0x1b6, offset 0x6d80 + 0x6d80: 0x40055620, 0x6d81: 0xa1809102, 0x6d82: 0xa1909002, 0x6d83: 0x40055820, + 0x6d84: 0xae600000, 0x6d85: 0xadc00000, 0x6d86: 0x40055a20, 0x6d87: 0xa1208d02, + 0x6d90: 0x40389020, 0x6d91: 0x40389220, 0x6d92: 0x40389420, 0x6d93: 0x40389620, + 0x6d94: 0x40389820, 0x6d95: 0x40389a20, 0x6d96: 0x40389c20, 0x6d97: 0x40389e20, + 0x6d98: 0x4038a020, 0x6d99: 0x4038a220, 0x6d9a: 0x0038a499, 0x6d9b: 0x4038a420, + 0x6d9c: 0x4038a620, 0x6d9d: 0x0038a899, 0x6d9e: 0x4038a820, 0x6d9f: 0x0038aa99, + 0x6da0: 0x4038aa20, 0x6da1: 0x4038ac20, 0x6da2: 0x4038ae20, 0x6da3: 0x0038b099, + 0x6da4: 0x4038b020, 0x6da5: 0x0038b299, 0x6da6: 0x4038b220, 0x6da7: 0x4038b420, + 0x6da8: 0x4038b620, 0x6da9: 0x4038b820, 0x6daa: 0x4038ba20, + 0x6db0: 0xe00014ff, 0x6db1: 0xe0001502, 0x6db2: 0xe0001511, 0x6db3: 0xa0002102, + 0x6db4: 0xa0002202, + // Block 0x1b7, offset 0x6dc0 + 0x6dc0: 0xa0000000, 0x6dc1: 0xa0000000, 0x6dc2: 0xa0000000, 0x6dc3: 0xa0000000, + 0x6dc4: 0xa0000000, 0x6dc6: 0x40096620, 0x6dc7: 0x40096a20, + 0x6dc8: 0x40070820, 0x6dc9: 0x4004f220, 0x6dca: 0x4004f620, 0x6dcb: 0x4027e620, + 0x6dcc: 0x40024820, 0x6dcd: 0x40024a20, 0x6dce: 0x40070e20, 0x6dcf: 0x40071020, + 0x6dd0: 0xae600000, 0x6dd1: 0xae600000, 0x6dd2: 0xae600000, 0x6dd3: 0xae600000, + 0x6dd4: 0xae600000, 0x6dd5: 0xae600000, 0x6dd6: 0xae600000, 0x6dd7: 0xae600000, + 0x6dd8: 0xa1e00000, 0x6dd9: 0xa1f00000, 0x6dda: 0xa2000000, 0x6ddb: 0x40026420, + 0x6dde: 0x40027020, 0x6ddf: 0x4002cc20, + 0x6de0: 0x403aa220, 0x6de1: 0x40391c20, 0x6de2: 0x40393a21, 0x6de3: 0x40393a22, + 0x6de4: 0x403a7621, 0x6de5: 0x40393a23, 0x6de6: 0x403a9221, 0x6de7: 0xc3310151, + 0x6de8: 0x40393c20, 0x6de9: 0x403a6a21, 0x6dea: 0x40395620, 0x6deb: 0x40395820, + 0x6dec: 0x40396420, 0x6ded: 0x40397220, 0x6dee: 0x40397420, 0x6def: 0x40398820, + 0x6df0: 0x40398a20, 0x6df1: 0x4039a420, 0x6df2: 0x4039a620, 0x6df3: 0x4039c620, + 0x6df4: 0x4039c820, 0x6df5: 0x4039dc20, 0x6df6: 0x4039de20, 0x6df7: 0x4039e620, + 0x6df8: 0x4039e820, 0x6df9: 0x4039ee20, 0x6dfa: 0x4039f020, 0x6dfb: 0x403a3820, + 0x6dfc: 0x403a3a20, 0x6dfd: 0x403a9c20, 0x6dfe: 0x403a9e20, 0x6dff: 0x403aa020, + // Block 0x1b8, offset 0x6e00 + 0x6e00: 0xa0002302, 0x6e01: 0x4039fc20, 0x6e02: 0x403a1220, 0x6e03: 0x403a1a20, + 0x6e04: 0x403a4020, 0x6e05: 0x403a4e20, 0x6e06: 0x403a5620, 0x6e07: 0x403a6820, + 0x6e08: 0xc3350171, 0x6e09: 0x403a9222, 0x6e0a: 0xc3370171, 0x6e0b: 0xa1b0a202, + 0x6e0c: 0xa1c0a502, 0x6e0d: 0xa1d0a902, 0x6e0e: 0xa1e0ad02, 0x6e0f: 0xa1f0b202, + 0x6e10: 0xa200b602, 0x6e11: 0xa210ba02, 0x6e12: 0xa220bc02, 0x6e13: 0xae60bd02, + 0x6e14: 0xae60be02, 0x6e15: 0xadc0bf02, 0x6e16: 0xadc0c102, 0x6e17: 0xae60c202, + 0x6e18: 0xae60c302, 0x6e19: 0xae60c402, 0x6e1a: 0xae60c502, 0x6e1b: 0xae60c602, + 0x6e1c: 0xadc0c702, 0x6e1d: 0xae60c802, 0x6e1e: 0xae60c902, 0x6e1f: 0xadc0c002, + 0x6e20: 0xe000015e, 0x6e21: 0xe00001e6, 0x6e22: 0xe0000301, 0x6e23: 0xe00003db, + 0x6e24: 0xe00004b6, 0x6e25: 0xe0000580, 0x6e26: 0xe000064b, 0x6e27: 0xe00006f3, + 0x6e28: 0xe000079f, 0x6e29: 0xe0000844, 0x6e2a: 0x4004ee20, 0x6e2b: 0x40024c20, + 0x6e2c: 0x40024e20, 0x6e2d: 0x4004de20, 0x6e2e: 0x40393a20, 0x6e2f: 0x403a1020, + 0x6e30: 0xa230d102, 0x6e31: 0x40392420, 0x6e32: 0x40392220, 0x6e33: 0x40392a20, + 0x6e34: 0x00391c84, 0x6e35: 0xf0000404, 0x6e36: 0xf0000404, 0x6e37: 0xf0000404, + 0x6e38: 0xf0000404, 0x6e39: 0x40395a20, 0x6e3a: 0x40395c20, 0x6e3b: 0x40393e20, + 0x6e3c: 0x40395e20, 0x6e3d: 0x40396020, 0x6e3e: 0x40394020, 0x6e3f: 0x40396220, + // Block 0x1b9, offset 0x6e40 + 0x6e40: 0xe00017e4, 0x6e41: 0x403a6c20, 0x6e42: 0xe00017e1, 0x6e43: 0x403a6e20, + 0x6e44: 0x403a7620, 0x6e45: 0x403a7820, 0x6e46: 0x403a7a20, 0x6e47: 0x403a7c20, + 0x6e48: 0x403a7e20, 0x6e49: 0x403a8020, 0x6e4a: 0x403a8220, 0x6e4b: 0x403a8420, + 0x6e4c: 0x403a9220, 0x6e4d: 0x403a9420, 0x6e4e: 0x403a9620, 0x6e4f: 0x403a8620, + 0x6e50: 0x403a9820, 0x6e51: 0x403a9a20, 0x6e52: 0x403aaa20, 0x6e53: 0xe0001800, + 0x6e54: 0x4002e820, 0x6e55: 0x403a7220, 0x6e56: 0xae600000, 0x6e57: 0xae600000, + 0x6e58: 0xae600000, 0x6e59: 0xae600000, 0x6e5a: 0xae600000, 0x6e5b: 0xae600000, + 0x6e5c: 0xae600000, 0x6e5d: 0xa0000000, 0x6e5e: 0x40071220, 0x6e5f: 0xae600000, + 0x6e60: 0xae600000, 0x6e61: 0xae600000, 0x6e62: 0xae600000, 0x6e63: 0xadc00000, + 0x6e64: 0xae600000, 0x6e65: 0x003a7483, 0x6e66: 0x003a9083, 0x6e67: 0xae600000, + 0x6e68: 0xae600000, 0x6e69: 0x40071420, 0x6e6a: 0xadc00000, 0x6e6b: 0xae600000, + 0x6e6c: 0xae600000, 0x6e6d: 0xadc00000, 0x6e6e: 0x40399e20, 0x6e6f: 0x4039ba20, + 0x6e70: 0xe0000161, 0x6e71: 0xe00001e9, 0x6e72: 0xe0000304, 0x6e73: 0xe00003de, + 0x6e74: 0xe00004b9, 0x6e75: 0xe0000583, 0x6e76: 0xe000064e, 0x6e77: 0xe00006f6, + 0x6e78: 0xe00007a2, 0x6e79: 0xe0000847, 0x6e7a: 0x4039d020, 0x6e7b: 0x4039e420, + 0x6e7c: 0x4039f420, 0x6e7d: 0xe0001553, 0x6e7e: 0xe0001779, 0x6e7f: 0x403a7020, + // Block 0x1ba, offset 0x6e80 + 0x6e81: 0x40491020, 0x6e82: 0x40491220, 0x6e83: 0x40491420, + 0x6e84: 0x40491620, 0x6e85: 0x40491820, 0x6e86: 0x40491a20, 0x6e87: 0x40491c20, + 0x6e88: 0x40491e20, 0x6e89: 0x40492020, 0x6e8a: 0x40492220, 0x6e8b: 0x40492420, + 0x6e8c: 0x40492620, 0x6e8d: 0x40492820, 0x6e8e: 0x40492a20, 0x6e8f: 0x40492c20, + 0x6e90: 0x40492e20, 0x6e91: 0x40493020, 0x6e92: 0x40493220, 0x6e93: 0x40493420, + 0x6e94: 0x40493620, 0x6e95: 0x40493820, 0x6e96: 0x40493a20, 0x6e97: 0x40493c20, + 0x6e98: 0x40493e20, 0x6e99: 0x40494020, 0x6e9a: 0x40494220, 0x6e9b: 0x40494420, + 0x6e9c: 0x40494620, 0x6e9d: 0x40494820, 0x6e9e: 0x40494a20, 0x6e9f: 0x40494c20, + 0x6ea0: 0x40494e20, 0x6ea1: 0x40495020, 0x6ea2: 0x40495220, 0x6ea3: 0x40495420, + 0x6ea4: 0x40495620, 0x6ea5: 0x40495820, 0x6ea6: 0x40495a20, 0x6ea7: 0x40495c20, + 0x6ea8: 0x40495e20, 0x6ea9: 0x40496020, 0x6eaa: 0x40496220, 0x6eab: 0x40496420, + 0x6eac: 0x40496620, 0x6ead: 0x40496820, 0x6eae: 0x40496a20, 0x6eaf: 0x40496c20, + 0x6eb0: 0x40496e20, 0x6eb1: 0x40497020, 0x6eb2: 0x40497220, 0x6eb3: 0x40497420, + 0x6eb4: 0x40497620, 0x6eb5: 0x40497820, 0x6eb6: 0x40497a20, 0x6eb7: 0x40497c20, + 0x6eb8: 0x826724bf, 0x6eb9: 0x826724c0, 0x6eba: 0xa0002402, + 0x6ebf: 0x4027f420, + // Block 0x1bb, offset 0x6ec0 + 0x6ec0: 0x4062ac20, 0x6ec1: 0xe0002526, 0x6ec2: 0x4062b020, 0x6ec3: 0x4062b220, + 0x6ec4: 0xe0002532, 0x6ec5: 0x4062b620, 0x6ec6: 0x4062b820, 0x6ec7: 0x4062ba20, + 0x6ec8: 0xe000254a, 0x6ec9: 0x4062be20, 0x6eca: 0xe0002550, 0x6ecb: 0x4062c220, + 0x6ecc: 0x4062c420, 0x6ecd: 0xe0002553, 0x6ece: 0x4062c820, 0x6ecf: 0x4062ca20, + 0x6ed0: 0x4062cc20, 0x6ed1: 0x4062ce20, 0x6ed2: 0x4062d020, 0x6ed3: 0x4062d220, + 0x6ed4: 0x4062d420, 0x6ed5: 0x4062d620, 0x6ed6: 0x4062d820, 0x6ed7: 0x4062da20, + 0x6ed8: 0x4062dc20, 0x6ed9: 0x4062de20, 0x6eda: 0x4062e020, 0x6edb: 0x4062e220, + 0x6edc: 0x4062e420, 0x6edd: 0x4062e620, 0x6ede: 0x4062e820, 0x6edf: 0x4062ea20, + 0x6ee0: 0x4062ec20, 0x6ee1: 0x4062ee20, 0x6ee2: 0x4062f020, 0x6ee3: 0x4062f220, + 0x6ee4: 0x4062f420, 0x6ee5: 0x4062f620, 0x6ee6: 0x4062f820, 0x6ee7: 0x4062fa20, + 0x6ee8: 0x4062fc20, 0x6ee9: 0x4062fe20, 0x6eea: 0x40630020, 0x6eeb: 0x40630220, + 0x6eec: 0x40630420, 0x6eed: 0x40630620, 0x6eee: 0x40630820, 0x6eef: 0x40630a20, + 0x6ef0: 0x40630c20, 0x6ef1: 0x40630e20, 0x6ef2: 0x40631020, 0x6ef3: 0x40631220, + 0x6ef4: 0x40631420, 0x6ef5: 0x40631620, 0x6ef6: 0x40631820, 0x6ef7: 0x40631a20, + 0x6ef8: 0x40631c20, 0x6ef9: 0x40631e20, 0x6efa: 0x40632020, 0x6efb: 0x40632220, + 0x6efc: 0x40632420, 0x6efd: 0x40632620, 0x6efe: 0x40632820, 0x6eff: 0x40632a20, + // Block 0x1bc, offset 0x6f00 + 0x6f00: 0x40632c20, 0x6f01: 0x40632e20, 0x6f02: 0x40633020, 0x6f03: 0x40633220, + 0x6f04: 0x40633420, 0x6f05: 0x40633620, 0x6f06: 0x40633820, 0x6f07: 0x40633a20, + 0x6f08: 0x40633c20, 0x6f09: 0x40633e20, 0x6f0a: 0x40634020, 0x6f0b: 0x40634220, + 0x6f0c: 0x40634420, 0x6f0d: 0x40634620, 0x6f0e: 0x40634820, 0x6f0f: 0x40634a20, + 0x6f10: 0x40634c20, 0x6f11: 0x40634e20, 0x6f12: 0x40635020, 0x6f13: 0x40635220, + 0x6f14: 0x40635420, 0x6f15: 0x40635620, 0x6f16: 0x40635820, 0x6f17: 0x40635a20, + 0x6f18: 0x40635c20, 0x6f19: 0x40635e20, 0x6f1a: 0x40636020, 0x6f1b: 0x40636220, + 0x6f1c: 0x40636420, 0x6f1d: 0x40636620, 0x6f1e: 0x40636820, 0x6f1f: 0x4063a420, + 0x6f20: 0x4063a620, 0x6f21: 0x4063a820, 0x6f22: 0xe0002556, 0x6f23: 0x4063ac20, + 0x6f24: 0xe0002559, 0x6f25: 0x4063b020, 0x6f26: 0xe000255c, 0x6f27: 0x4063b420, + 0x6f28: 0xe000255f, 0x6f29: 0x4063b820, 0x6f2a: 0xe0002562, 0x6f2b: 0xe0002565, + 0x6f2c: 0xe0002569, 0x6f2d: 0x4063c020, 0x6f2e: 0x4063c220, 0x6f2f: 0xe000256c, + 0x6f30: 0xe000256f, 0x6f31: 0xe0002573, 0x6f32: 0x4063ca20, 0x6f33: 0x4063cc20, + 0x6f34: 0x4063ce20, 0x6f35: 0x4063d020, 0x6f36: 0x4063d220, 0x6f37: 0x4063d420, + 0x6f38: 0x4063d620, 0x6f39: 0x4063d820, 0x6f3a: 0x4063da20, 0x6f3b: 0x4063dc20, + 0x6f3c: 0x4063de20, 0x6f3d: 0x4063e020, 0x6f3e: 0x4063e220, 0x6f3f: 0x4063e420, + // Block 0x1bd, offset 0x6f40 + 0x6f40: 0x4063e620, 0x6f41: 0x4063e820, 0x6f42: 0x4063ea20, 0x6f43: 0x4063ec20, + 0x6f44: 0x4063ee20, 0x6f45: 0x4063f020, 0x6f46: 0x4063f220, 0x6f47: 0x4063f420, + 0x6f48: 0x4063f620, 0x6f49: 0x4063f820, 0x6f4a: 0x4063fa20, 0x6f4b: 0x4063fc20, + 0x6f4c: 0x4063fe20, 0x6f4d: 0x40640020, 0x6f4e: 0x40640220, 0x6f4f: 0x40640420, + 0x6f50: 0x40640620, 0x6f51: 0x40640820, 0x6f52: 0x40640a20, 0x6f53: 0x40640c20, + 0x6f54: 0x40640e20, 0x6f55: 0x40641020, 0x6f56: 0x40641220, 0x6f57: 0x40641420, + 0x6f58: 0x40641620, 0x6f59: 0x40641820, 0x6f5a: 0x40641a20, 0x6f5b: 0x40641c20, + 0x6f5c: 0x40641e20, 0x6f5d: 0x40642020, 0x6f5e: 0x40642220, 0x6f5f: 0x40642420, + 0x6f60: 0x40642620, 0x6f61: 0x40642820, 0x6f62: 0x40642a20, 0x6f63: 0x40642c20, + 0x6f64: 0x40642e20, 0x6f65: 0x40643020, 0x6f66: 0x40643220, 0x6f67: 0x40643420, + 0x6f68: 0x4062ac20, 0x6f69: 0xe0002526, 0x6f6a: 0xe0002529, 0x6f6b: 0x4062b020, + 0x6f6c: 0xe000252c, 0x6f6d: 0xe000252f, 0x6f6e: 0x4062b220, 0x6f6f: 0x4062b620, + 0x6f70: 0xe0002535, 0x6f71: 0xe0002538, 0x6f72: 0xe000253b, 0x6f73: 0xe000253e, + 0x6f74: 0xe0002541, 0x6f75: 0xe0002544, 0x6f76: 0xe0002547, 0x6f77: 0x4062b820, + 0x6f78: 0x4062ba20, 0x6f79: 0xe000254d, 0x6f7a: 0x4062be20, 0x6f7b: 0xe0002550, + 0x6f7c: 0x4062c220, 0x6f7d: 0x4062c420, 0x6f7e: 0x4062c820, 0x6f7f: 0x4062ca20, + // Block 0x1be, offset 0x6f80 + 0x6f80: 0x4062cc20, 0x6f81: 0x4062ce20, 0x6f82: 0x4062d020, 0x6f83: 0x40649a20, + 0x6f84: 0x40649c20, 0x6f85: 0x40649e20, 0x6f86: 0x4064a020, 0x6f87: 0x4064a220, + 0x6f88: 0x4064a420, 0x6f89: 0x4064a620, 0x6f8a: 0x4064a820, 0x6f8b: 0x4064aa20, + 0x6f8c: 0x4064ac20, 0x6f8d: 0x4064ae20, 0x6f8e: 0x4064b020, 0x6f8f: 0x4064b220, + 0x6f90: 0x4064b420, 0x6f91: 0x4064b620, 0x6f92: 0x4064b820, 0x6f93: 0x4064ba20, + 0x6f94: 0x4064bc20, 0x6f95: 0x4064be20, 0x6f96: 0x4064c020, 0x6f97: 0x4064c220, + 0x6f98: 0x4064c420, 0x6f99: 0x4064c620, 0x6f9a: 0x4064c820, 0x6f9b: 0x4064ca20, + 0x6f9c: 0x4064cc20, 0x6f9d: 0x4064ce20, 0x6f9e: 0x4064d020, 0x6f9f: 0x4064d220, + 0x6fa0: 0x4064d420, 0x6fa1: 0x4064d620, 0x6fa2: 0x4064d820, 0x6fa3: 0x4064da20, + 0x6fa4: 0x4064dc20, 0x6fa5: 0x4064de20, 0x6fa6: 0x4064e020, 0x6fa7: 0x4064e220, + 0x6fa8: 0x4064e420, 0x6fa9: 0x4064e620, 0x6faa: 0x4064e820, 0x6fab: 0x4064ea20, + 0x6fac: 0x4064ec20, 0x6fad: 0x4064ee20, 0x6fae: 0x4064f020, 0x6faf: 0x4064f220, + 0x6fb0: 0x4064f420, 0x6fb1: 0x4064f620, 0x6fb2: 0x4064f820, 0x6fb3: 0x4064fa20, + 0x6fb4: 0x4064fc20, 0x6fb5: 0x4064fe20, 0x6fb6: 0x40650020, 0x6fb7: 0x40650220, + 0x6fb8: 0x40650420, 0x6fb9: 0x40650620, 0x6fba: 0x40650820, 0x6fbb: 0x40650a20, + 0x6fbc: 0x40650c20, 0x6fbd: 0x40650e20, 0x6fbe: 0x40651020, 0x6fbf: 0x40651220, + // Block 0x1bf, offset 0x6fc0 + 0x6fc0: 0x4009a620, 0x6fc1: 0xe00000f5, 0x6fc2: 0x4009a820, 0x6fc3: 0x4009aa20, + 0x6fc4: 0xe00000f8, 0x6fc5: 0x4009ac20, 0x6fc6: 0x4009ae20, 0x6fc7: 0xe00000fb, + 0x6fc8: 0x4009b020, 0x6fc9: 0xe00000fe, 0x6fca: 0x4009b220, 0x6fcb: 0x4009b420, + 0x6fcc: 0x4009b620, 0x6fcd: 0x4009b820, 0x6fce: 0x4009ba20, 0x6fcf: 0x4009bc20, + 0x6fd0: 0x4009be20, 0x6fd1: 0x4009c020, 0x6fd2: 0x4009c220, 0x6fd3: 0x4009c420, + 0x6fd4: 0x4009c620, 0x6fd5: 0x4009c820, 0x6fd6: 0x4009ca20, 0x6fd7: 0x4009cc20, + 0x6fd8: 0x4009ce20, 0x6fd9: 0x4009d020, 0x6fda: 0x4009d220, 0x6fdb: 0x4009d420, + 0x6fdc: 0x4009d620, 0x6fdd: 0x4009d820, 0x6fde: 0x4009da20, 0x6fdf: 0x4009dc20, + 0x6fe0: 0x40094420, 0x6fe1: 0x4009de20, 0x6fe2: 0xe0000104, 0x6fe3: 0x4009e020, + 0x6fe4: 0x4009e220, 0x6fe5: 0x4009e420, 0x6fe6: 0x4009e620, 0x6fe7: 0x4009e820, + 0x6fe8: 0x4009ea20, 0x6fe9: 0x4009ec20, 0x6fea: 0x4009ee20, 0x6feb: 0x4009f020, + 0x6fec: 0x4009f220, 0x6fed: 0xe0000101, 0x6fee: 0xe00000e1, 0x6fef: 0xe00000e7, + 0x6ff0: 0xe0000107, 0x6ff1: 0xe000010a, 0x6ff2: 0x4009f420, 0x6ff3: 0x4009f620, + 0x6ff4: 0xe000010d, 0x6ff5: 0xe0000110, 0x6ff6: 0x4009f820, 0x6ff7: 0x4009fa20, + 0x6ff8: 0xe0000113, 0x6ff9: 0xe0000116, 0x6ffa: 0x4009fc20, 0x6ffb: 0x4009fe20, + 0x6ffc: 0x400a0020, 0x6ffd: 0x400a0220, 0x6ffe: 0x400a0420, 0x6fff: 0x400a0620, + // Block 0x1c0, offset 0x7000 + 0x7000: 0x40073420, 0x7001: 0x40073620, + 0x7013: 0x003a269a, + 0x7014: 0x003a2699, 0x7015: 0x003a2697, 0x7016: 0x003a2698, 0x7017: 0x003a7c9a, + 0x7018: 0x003a7c99, 0x7019: 0x003a7a9a, 0x701a: 0x003a7a99, 0x701b: 0x003a7e9a, + 0x701c: 0x003a7e99, 0x701d: 0xf0001a1a, 0x701e: 0x003a849a, 0x701f: 0x003a8499, + 0x7020: 0x003a789a, 0x7021: 0x003a7899, 0x7022: 0x003a809a, 0x7023: 0x003a8099, + 0x7024: 0x003a989a, 0x7025: 0x003a9899, 0x7026: 0x003a9897, 0x7027: 0x003a9898, + 0x7028: 0x003a92c3, 0x7029: 0x003a92c4, 0x702a: 0xe0001559, 0x702b: 0xe0001556, + 0x702c: 0xe0001589, 0x702d: 0xe0001586, 0x702e: 0xe000158f, 0x702f: 0xe000158c, + 0x7030: 0xe000159b, 0x7031: 0xe0001598, 0x7032: 0xe0001595, 0x7033: 0xe0001592, + 0x7034: 0xe00015a1, 0x7035: 0xe000159e, 0x7036: 0xe00015bf, 0x7037: 0xe00015bc, + 0x7038: 0xe00015b9, 0x7039: 0xe00015ad, 0x703a: 0xe00015a7, 0x703b: 0xe00015a4, + 0x703c: 0x003a929a, 0x703d: 0x003a9299, 0x703e: 0x003a9297, 0x703f: 0x003a9298, + // Block 0x1c1, offset 0x7040 + 0x7040: 0xe000155f, 0x7041: 0xe0001565, 0x7042: 0xe000157a, 0x7043: 0xe00015b0, + 0x7044: 0xe00015b6, 0x7045: 0xf0001a1a, 0x7046: 0xf0001a1a, 0x7047: 0xf0001a1a, + 0x7048: 0xf0001a1a, 0x7049: 0xe00024ab, 0x704a: 0xf0001a1a, 0x704b: 0xf0001a1a, + 0x704c: 0xf0001a1a, 0x704d: 0xf0001a1a, 0x704e: 0xf0001a1a, 0x704f: 0xe00024b1, + 0x7050: 0xf0001a1a, 0x7051: 0xf0001a1a, 0x7052: 0xf0001a1a, 0x7053: 0xe00024b7, + 0x7054: 0xf0001a1a, 0x7055: 0xf0001a1a, 0x7056: 0xf0001a1a, 0x7057: 0xf0001a1a, + 0x7058: 0xf0001a1a, 0x7059: 0xf0001a1a, 0x705a: 0xf0001a1a, 0x705b: 0xf0001a1a, + 0x705c: 0xf0001a1a, 0x705d: 0xf0001a1a, 0x705e: 0xf0001a1a, 0x705f: 0xf0001a1a, + 0x7060: 0xf0001a1a, 0x7061: 0xf0001a1a, 0x7062: 0xf0001a1a, 0x7063: 0xf0001a1a, + 0x7064: 0xf0001a1a, 0x7065: 0xf0001a1a, 0x7066: 0xf0001a1a, 0x7067: 0xf0001a1a, + 0x7068: 0xf0001a1a, 0x7069: 0xf0001a1a, 0x706a: 0xf0001a1a, 0x706b: 0xf0001a1a, + 0x706c: 0xf0001a1a, 0x706d: 0xf0001a1a, 0x706e: 0xf0001a1a, 0x706f: 0xf0001a1a, + 0x7070: 0xf0001a1a, 0x7071: 0xe00024f9, 0x7072: 0xf0001a1a, 0x7073: 0xf0001a1a, + 0x7074: 0xf0001a1a, 0x7075: 0xe00024ff, 0x7076: 0xf0001a1a, 0x7077: 0xf0001a1a, + 0x7078: 0xf0001a1a, 0x7079: 0xf0001a1a, 0x707a: 0xf0001a1a, 0x707b: 0xf0001a1a, + 0x707c: 0xf0001a1a, 0x707d: 0xe0002505, 0x707e: 0xf0001a1a, 0x707f: 0xf0001a1a, + // Block 0x1c2, offset 0x7080 + 0x7080: 0xf0001a1a, 0x7081: 0xf0001a1a, 0x7082: 0xf0001a1a, 0x7083: 0xe000250b, + 0x7084: 0xf0001a1a, 0x7085: 0xf0001a1a, 0x7086: 0xf0001a1a, 0x7087: 0xf0001a1a, + 0x7088: 0xf0001a1a, 0x7089: 0xe000250e, 0x708a: 0xf0001a1a, 0x708b: 0xf0001a1a, + 0x708c: 0xf0001a1a, 0x708d: 0xf0001a1a, 0x708e: 0xf0001a1a, 0x708f: 0xe0002514, + 0x7090: 0xf0001a1a, 0x7091: 0xf0001a1a, 0x7092: 0xf0001a1a, 0x7093: 0xe0002517, + 0x7094: 0xf0001a1a, 0x7095: 0xf0001a1a, 0x7096: 0xf0001a1a, 0x7097: 0xf0001a1a, + 0x7098: 0xf0001a1a, 0x7099: 0xe0002523, 0x709a: 0xf0001a1a, 0x709b: 0xf0001a1a, + 0x709c: 0xf0001a1a, 0x709d: 0xe000251d, 0x709e: 0xe0000003, 0x709f: 0xe0000006, + 0x70a0: 0xe0000009, 0x70a1: 0xe000000c, 0x70a2: 0xe000000f, 0x70a3: 0xe0000012, + 0x70a4: 0xe000156b, 0x70a5: 0xe000156e, 0x70a6: 0xe0001577, 0x70a7: 0xe000157d, + 0x70a8: 0xe00015aa, 0x70a9: 0xe00015b3, 0x70aa: 0xf0001919, 0x70ab: 0xf0001919, + 0x70ac: 0xf0001919, 0x70ad: 0xf0001919, 0x70ae: 0xe00024a8, 0x70af: 0xf0001919, + 0x70b0: 0xf0001919, 0x70b1: 0xf0001919, 0x70b2: 0xf0001919, 0x70b3: 0xf0001919, + 0x70b4: 0xe00024ae, 0x70b5: 0xf0001919, 0x70b6: 0xf0001919, 0x70b7: 0xf0001919, + 0x70b8: 0xf0001919, 0x70b9: 0xf0001919, 0x70ba: 0xe00024b4, 0x70bb: 0xf0001919, + 0x70bc: 0xe00024f6, 0x70bd: 0xf0001919, 0x70be: 0xe00024fc, 0x70bf: 0xf0001919, + // Block 0x1c3, offset 0x70c0 + 0x70c0: 0xf0001919, 0x70c1: 0xf0001919, 0x70c2: 0xf0001919, 0x70c3: 0xe0002502, + 0x70c4: 0xf0001919, 0x70c5: 0xf0001919, 0x70c6: 0xe0002508, 0x70c7: 0xf0001919, + 0x70c8: 0xf0001919, 0x70c9: 0xf0001919, 0x70ca: 0xf0001919, 0x70cb: 0xf0001919, + 0x70cc: 0xf0001919, 0x70cd: 0xf0001919, 0x70ce: 0xe0002511, 0x70cf: 0xf0001919, + 0x70d0: 0xe000251a, 0x70d1: 0xf0001919, 0x70d2: 0xf0001919, 0x70d3: 0xf0001919, + 0x70d4: 0xf0001919, 0x70d5: 0xe0002520, 0x70d6: 0xf0001919, 0x70d7: 0xe000155c, + 0x70d8: 0xe0001562, 0x70d9: 0xe0001568, 0x70da: 0xe0001571, 0x70db: 0xe0001580, + 0x70dc: 0xf0001717, 0x70dd: 0xf0001717, 0x70de: 0xf0001717, 0x70df: 0xf0001717, + 0x70e0: 0xf0001717, 0x70e1: 0xf0001717, 0x70e2: 0xf0001717, 0x70e3: 0xf0001717, + 0x70e4: 0xf0001717, 0x70e5: 0xf0001717, 0x70e6: 0xf0001717, 0x70e7: 0xf0001717, + 0x70e8: 0xf0001717, 0x70e9: 0xf0001717, 0x70ea: 0xf0001717, 0x70eb: 0xf0001717, + 0x70ec: 0xf0001717, 0x70ed: 0xf0001717, 0x70ee: 0xf0001717, 0x70ef: 0xf0001717, + 0x70f0: 0xf0001717, 0x70f1: 0xf0001717, 0x70f2: 0xf0001717, 0x70f3: 0xf0001717, + 0x70f4: 0xf0001717, 0x70f5: 0xf0001717, 0x70f6: 0xf0001717, 0x70f7: 0xf0001717, + 0x70f8: 0xf0001717, 0x70f9: 0xf0001717, 0x70fa: 0xf0001717, 0x70fb: 0xf0001717, + 0x70fc: 0xf0001717, 0x70fd: 0xf0001717, 0x70fe: 0xf0001717, 0x70ff: 0xf0001717, + // Block 0x1c4, offset 0x7100 + 0x7100: 0xf0001717, 0x7101: 0xf0001717, 0x7102: 0xf0001717, 0x7103: 0xf0001717, + 0x7104: 0xf0001717, 0x7105: 0xf0001717, 0x7106: 0xf0001717, 0x7107: 0xf0001717, + 0x7108: 0xf0001717, 0x7109: 0xf0001717, 0x710a: 0xf0001717, 0x710b: 0xf0001717, + 0x710c: 0xf0001717, 0x710d: 0xf0001717, 0x710e: 0xf0001717, 0x710f: 0xf0001717, + 0x7110: 0xf0001717, 0x7111: 0xf0001717, 0x7112: 0xf0001717, 0x7113: 0xf0001717, + 0x7114: 0xf0001717, 0x7115: 0xf0001717, 0x7116: 0xf0001717, 0x7117: 0xf0001717, + 0x7118: 0xf0001717, 0x7119: 0xf0001717, 0x711a: 0xf0001717, 0x711b: 0xf0001717, + 0x711c: 0xf0001717, 0x711d: 0xf0001717, 0x711e: 0xf0001717, 0x711f: 0xe0001574, + 0x7120: 0xe0001583, 0x7121: 0xf0001818, 0x7122: 0xf0001818, 0x7123: 0xf0001818, + 0x7124: 0xf0001818, 0x7125: 0xf0001818, 0x7126: 0xf0001818, 0x7127: 0xf0001818, + 0x7128: 0xf0001818, 0x7129: 0xf0001818, 0x712a: 0xf0001818, 0x712b: 0xf0001818, + 0x712c: 0xf0001818, 0x712d: 0xf0001818, 0x712e: 0xf0001818, 0x712f: 0xf0001818, + 0x7130: 0xf0001818, 0x7131: 0xf0001818, 0x7132: 0xe000249f, 0x7133: 0xe00024a2, + 0x7134: 0xe00024a5, 0x7135: 0xe00024e7, 0x7136: 0xf0001a1a, 0x7137: 0xe00024ed, + 0x7138: 0xf0001a1a, 0x7139: 0xe00024f3, 0x713a: 0xf0001a1a, 0x713b: 0xe00024cf, + 0x713c: 0xf0001a1a, 0x713d: 0xe00024d5, 0x713e: 0xf0001a1a, 0x713f: 0xe00024c3, + // Block 0x1c5, offset 0x7140 + 0x7140: 0xf0001a1a, 0x7141: 0xe00024bd, 0x7142: 0xf0001a1a, 0x7143: 0xe00024c9, + 0x7144: 0xf0001a1a, 0x7145: 0xe00024db, 0x7146: 0xf0001a1a, 0x7147: 0xe00024e1, + 0x7148: 0xf0001a1a, 0x7149: 0xf0001a1a, 0x714a: 0xf0001a1a, 0x714b: 0xf0001a1a, + 0x714c: 0xf0001a1a, 0x714d: 0xf0001a1a, 0x714e: 0xf0001a1a, 0x714f: 0xf0001a1a, + 0x7150: 0xf0001a1a, 0x7151: 0xe00024e4, 0x7152: 0xf0001919, 0x7153: 0xe00024ea, + 0x7154: 0xf0001919, 0x7155: 0xe00024f0, 0x7156: 0xf0001919, 0x7157: 0xe00024cc, + 0x7158: 0xf0001919, 0x7159: 0xe00024d2, 0x715a: 0xf0001919, 0x715b: 0xe00024c0, + 0x715c: 0xf0001919, 0x715d: 0xe00024ba, 0x715e: 0xf0001919, 0x715f: 0xe00024c6, + 0x7160: 0xf0001919, 0x7161: 0xe00024d8, 0x7162: 0xf0001919, 0x7163: 0xe00024de, + 0x7164: 0xf0001919, 0x7165: 0xf0001919, 0x7166: 0xf0001919, 0x7167: 0xf0001919, + 0x7168: 0xf0001919, 0x7169: 0xf0001919, 0x716a: 0xf0001919, 0x716b: 0xf0001919, + 0x716c: 0xf0001919, 0x716d: 0xf0001717, 0x716e: 0xf0001717, 0x716f: 0xf0001717, + 0x7170: 0xf0001717, 0x7171: 0xf0001717, 0x7172: 0xf0001717, 0x7173: 0xf0001717, + 0x7174: 0xf0001818, 0x7175: 0xf0001818, 0x7176: 0xf0001818, 0x7177: 0xf0001818, + 0x7178: 0xf0001818, 0x7179: 0xf0001818, 0x717a: 0xf0001818, 0x717b: 0xf0001818, + 0x717c: 0xf0001919, 0x717d: 0xf0001a1a, 0x717e: 0x4004c020, 0x717f: 0x4004c220, + // Block 0x1c6, offset 0x7180 + 0x7180: 0x00391c9a, 0x7181: 0x00393aa4, 0x7182: 0x00393aa3, 0x7183: 0x00393ac4, + 0x7184: 0x00393ac3, 0x7185: 0x003a76a4, 0x7186: 0x003a76a3, 0x7187: 0x00393ae4, + 0x7188: 0x00393ae3, 0x7189: 0x003a92a6, 0x718a: 0x003a92a5, 0x718b: 0x003a92a3, + 0x718c: 0x003a92a4, 0x718d: 0x00393884, 0x718e: 0x00393883, 0x718f: 0x00393c9a, + 0x7190: 0x00393c99, 0x7191: 0x00393c97, 0x7192: 0x00393c98, 0x7193: 0x003a6aa4, + 0x7194: 0x003a6aa3, 0x7195: 0x0039569a, 0x7196: 0x00395699, 0x7197: 0x00395697, + 0x7198: 0x00395698, 0x7199: 0x0039589a, 0x719a: 0x00395899, 0x719b: 0x00395897, + 0x719c: 0x00395898, 0x719d: 0x0039649a, 0x719e: 0x00396499, 0x719f: 0x00396497, + 0x71a0: 0x00396498, 0x71a1: 0x0039729a, 0x71a2: 0x00397299, 0x71a3: 0x00397297, + 0x71a4: 0x00397298, 0x71a5: 0x0039749a, 0x71a6: 0x00397499, 0x71a7: 0x00397497, + 0x71a8: 0x00397498, 0x71a9: 0x0039889a, 0x71aa: 0x00398899, 0x71ab: 0x00398a9a, + 0x71ac: 0x00398a99, 0x71ad: 0x0039a49a, 0x71ae: 0x0039a499, 0x71af: 0x0039a69a, + 0x71b0: 0x0039a699, 0x71b1: 0x0039c69a, 0x71b2: 0x0039c699, 0x71b3: 0x0039c697, + 0x71b4: 0x0039c698, 0x71b5: 0x0039c89a, 0x71b6: 0x0039c899, 0x71b7: 0x0039c897, + 0x71b8: 0x0039c898, 0x71b9: 0x0039dc9a, 0x71ba: 0x0039dc99, 0x71bb: 0x0039dc97, + 0x71bc: 0x0039dc98, 0x71bd: 0x0039de9a, 0x71be: 0x0039de99, 0x71bf: 0x0039de97, + // Block 0x1c7, offset 0x71c0 + 0x71c0: 0x0039de98, 0x71c1: 0x0039e69a, 0x71c2: 0x0039e699, 0x71c3: 0x0039e697, + 0x71c4: 0x0039e698, 0x71c5: 0x0039e89a, 0x71c6: 0x0039e899, 0x71c7: 0x0039e897, + 0x71c8: 0x0039e898, 0x71c9: 0x0039ee9a, 0x71ca: 0x0039ee99, 0x71cb: 0x0039ee97, + 0x71cc: 0x0039ee98, 0x71cd: 0x0039f09a, 0x71ce: 0x0039f099, 0x71cf: 0x0039f097, + 0x71d0: 0x0039f098, 0x71d1: 0x0039fc9a, 0x71d2: 0x0039fc99, 0x71d3: 0x0039fc97, + 0x71d4: 0x0039fc98, 0x71d5: 0x003a129a, 0x71d6: 0x003a1299, 0x71d7: 0x003a1297, + 0x71d8: 0x003a1298, 0x71d9: 0x003a1a9a, 0x71da: 0x003a1a99, 0x71db: 0x003a1a97, + 0x71dc: 0x003a1a98, 0x71dd: 0x003a409a, 0x71de: 0x003a4099, 0x71df: 0x003a4097, + 0x71e0: 0x003a4098, 0x71e1: 0x003a4e9a, 0x71e2: 0x003a4e99, 0x71e3: 0x003a4e97, + 0x71e4: 0x003a4e98, 0x71e5: 0x003a569a, 0x71e6: 0x003a5699, 0x71e7: 0x003a5697, + 0x71e8: 0x003a5698, 0x71e9: 0x003a6886, 0x71ea: 0x003a6885, 0x71eb: 0x003a6883, + 0x71ec: 0x003a6884, 0x71ed: 0x003a7485, 0x71ee: 0x003a7484, 0x71ef: 0x003a92c6, + 0x71f0: 0x003a92c5, 0x71f1: 0x003a9087, 0x71f2: 0x003a9086, 0x71f3: 0x003a9084, + 0x71f4: 0x003a9085, 0x71f5: 0xe0001732, 0x71f6: 0xe000172f, 0x71f7: 0xe0001738, + 0x71f8: 0xe0001735, 0x71f9: 0xe000173e, 0x71fa: 0xe000173b, 0x71fb: 0xf0001a1a, + 0x71fc: 0xf0001919, 0x71ff: 0xa0000000, + // Block 0x1c8, offset 0x7200 + 0x7200: 0xa0000000, 0x7201: 0xa0000000, 0x7202: 0xa0000000, 0x7203: 0xa0000000, + 0x7204: 0xa0000000, 0x7205: 0xa0000000, 0x7206: 0xa0000000, 0x7207: 0xa0000000, + 0x7208: 0xa0000000, 0x7209: 0x40020020, 0x720a: 0x40020220, 0x720b: 0x40020420, + 0x720c: 0x40020620, 0x720d: 0x40020820, 0x720e: 0xa0000000, 0x720f: 0xa0000000, + 0x7210: 0xa0000000, 0x7211: 0xa0000000, 0x7212: 0xa0000000, 0x7213: 0xa0000000, + 0x7214: 0xa0000000, 0x7215: 0xa0000000, 0x7216: 0xa0000000, 0x7217: 0xa0000000, + 0x7218: 0xa0000000, 0x7219: 0xa0000000, 0x721a: 0xa0000000, 0x721b: 0xa0000000, + 0x721c: 0xa0000000, 0x721d: 0xa0000000, 0x721e: 0xa0000000, 0x721f: 0xa0000000, + 0x7220: 0x40021220, 0x7221: 0x4002ba20, 0x7222: 0x4003e020, 0x7223: 0x4004ea20, + 0x7224: 0x4027de20, 0x7225: 0x4004ec20, 0x7226: 0x4004e620, 0x7227: 0x4003d220, + 0x7228: 0x4003f420, 0x7229: 0x4003f620, 0x722a: 0x4004d820, 0x722b: 0x40093820, + 0x722c: 0x40024020, 0x722d: 0x40021a20, 0x722e: 0x4002e420, 0x722f: 0x4004e220, + 0x7230: 0x4029cc20, 0x7231: 0x4029ce20, 0x7232: 0x4029d020, 0x7233: 0x4029d220, + 0x7234: 0x4029d420, 0x7235: 0x4029d620, 0x7236: 0x4029d820, 0x7237: 0x4029da20, + 0x7238: 0x4029dc20, 0x7239: 0x4029de20, 0x723a: 0x40026c20, 0x723b: 0x40026220, + 0x723c: 0x40094020, 0x723d: 0xc32f0851, 0x723e: 0x40094420, 0x723f: 0x4002c420, + // Block 0x1c9, offset 0x7240 + 0x7240: 0x4004d620, 0x7241: 0x002bde88, 0x7242: 0x002c0a88, 0x7243: 0xc33b0871, + 0x7244: 0x002c6288, 0x7245: 0x002c9888, 0x7246: 0x002d0888, 0x7247: 0xc33f00d1, + 0x7248: 0x002d6888, 0x7249: 0xc3410891, 0x724a: 0x002dcc88, 0x724b: 0x002dfe88, + 0x724c: 0xc0030002, 0x724d: 0x002e8288, 0x724e: 0x002e9e88, 0x724f: 0xc3450071, + 0x7250: 0x002f2c88, 0x7251: 0x002e0083, 0x7252: 0x002f7a88, 0x7253: 0xc3490871, + 0x7254: 0x00302c88, 0x7255: 0xc34d0071, 0x7256: 0x0030be88, 0x7257: 0x0030e288, + 0x7258: 0x002d6a83, 0x7259: 0x00310088, 0x725a: 0x00312a88, 0x725b: 0x4003f820, + 0x725c: 0x4004e420, 0x725d: 0x4003fa20, 0x725e: 0x40062420, 0x725f: 0x40021620, + 0x7260: 0x40061e20, 0x7261: 0x402bde20, 0x7262: 0x402c0a20, 0x7263: 0xc3390871, + 0x7264: 0x402c6220, 0x7265: 0x402c9820, 0x7266: 0x402d0820, 0x7267: 0xc33d00d1, + 0x7268: 0x402d6820, 0x7269: 0x402d9a20, 0x726a: 0x402dcc20, 0x726b: 0x402dfe20, + 0x726c: 0xc0000002, 0x726d: 0x402e8220, 0x726e: 0x402e9e20, 0x726f: 0xc3430071, + 0x7270: 0x402f2c20, 0x7271: 0x402e0020, 0x7272: 0x402f7a20, 0x7273: 0xc3470871, + 0x7274: 0x40302c20, 0x7275: 0xc34b0071, 0x7276: 0x4030be20, 0x7277: 0x4030e220, + 0x7278: 0x402d6a20, 0x7279: 0x40310020, 0x727a: 0x40312a20, 0x727b: 0x4003fc20, + 0x727c: 0x40094820, 0x727d: 0x4003fe20, 0x727e: 0x40094c20, 0x727f: 0xa0000000, + // Block 0x1ca, offset 0x7280 + 0x7280: 0xe00008f5, 0x7281: 0xe00008ef, 0x7282: 0xe0000921, 0x7283: 0xe0000969, + 0x7284: 0xe000095b, 0x7285: 0xe000094d, 0x7286: 0xe00009dd, 0x7287: 0x002c3c83, + 0x7288: 0xe0000ae8, 0x7289: 0xe0000ae2, 0x728a: 0xe0000af4, 0x728b: 0xe0000b20, + 0x728c: 0xe00025a2, 0x728d: 0xe000259f, 0x728e: 0xe00025a8, 0x728f: 0xe00025ae, + 0x7290: 0xe0000ab3, 0x7291: 0xe0000d63, 0x7292: 0xe0000d9a, 0x7293: 0xe0000d94, + 0x7294: 0xe0000da6, 0x7295: 0xe0000de6, 0x7296: 0x002ee483, 0x7297: 0x40093e20, + 0x7298: 0xe0000e12, 0x7299: 0xe0000fe1, 0x729a: 0xe0000fdb, 0x729b: 0xe0000fed, + 0x729c: 0x00306e83, 0x729d: 0xe0001102, 0x729e: 0x00318888, 0x729f: 0xe0000f7b, + 0x72a0: 0xe00008f2, 0x72a1: 0xe00008ec, 0x72a2: 0xe000091e, 0x72a3: 0xe0000966, + 0x72a4: 0xe0000958, 0x72a5: 0xe000094a, 0x72a6: 0xe00009d5, 0x72a7: 0x402c3c20, + 0x72a8: 0xe0000ae5, 0x72a9: 0xe0000adf, 0x72aa: 0xe0000af1, 0x72ab: 0xe0000b1d, + 0x72ac: 0xe0000c28, 0x72ad: 0xe0000c22, 0x72ae: 0xe0000c34, 0x72af: 0xe0000c40, + 0x72b0: 0xe0000aad, 0x72b1: 0xe0000d60, 0x72b2: 0xe0000d97, 0x72b3: 0xe0000d91, + 0x72b4: 0xe0000da3, 0x72b5: 0xe0000de3, 0x72b6: 0x402ee420, 0x72b7: 0x40093c20, + 0x72b8: 0xe0000e0f, 0x72b9: 0xe0000fde, 0x72ba: 0xe0000fd8, 0x72bb: 0xe0000fea, + 0x72bc: 0x40306e20, 0x72bd: 0xe00010ff, 0x72be: 0x40318820, 0x72bf: 0xe0001114, + // Block 0x1cb, offset 0x72c0 + 0x72c0: 0xe0000983, 0x72c1: 0xe0000980, 0x72c2: 0xe00008fb, 0x72c3: 0xe00008f8, + 0x72c4: 0xe000097d, 0x72c5: 0xe000097a, 0x72c6: 0xe0000a38, 0x72c7: 0xe0000a35, + 0x72c8: 0xe0000a3e, 0x72c9: 0xe0000a3b, 0x72ca: 0xe0000a4a, 0x72cb: 0xe0000a47, + 0x72cc: 0xe0000a44, 0x72cd: 0xe0000a41, 0x72ce: 0xe0000a86, 0x72cf: 0xe0000a83, + 0x72d0: 0xe0000aaa, 0x72d1: 0xe0000aa7, 0x72d2: 0xe0000b46, 0x72d3: 0xe0000b43, + 0x72d4: 0xe0000aee, 0x72d5: 0xe0000aeb, 0x72d6: 0xe0000b2c, 0x72d7: 0xe0000b29, + 0x72d8: 0xe0000b40, 0x72d9: 0xe0000b3d, 0x72da: 0xe0000b1a, 0x72db: 0xe0000b17, + 0x72dc: 0xe0000bb8, 0x72dd: 0xe0000bb5, 0x72de: 0x002d2483, 0x72df: 0x402d2420, + 0x72e0: 0xe0000bc4, 0x72e1: 0xe0000bc1, 0x72e2: 0xe0000bca, 0x72e3: 0xe0000bc7, + 0x72e4: 0xe0000bee, 0x72e5: 0xe0000beb, 0x72e6: 0xe0000c1b, 0x72e7: 0xe0000c18, + 0x72e8: 0xe00025b5, 0x72e9: 0xe0000c4e, 0x72ea: 0xe00025bb, 0x72eb: 0xe0000c5d, + 0x72ec: 0xe00025a5, 0x72ed: 0xe0000c2e, 0x72ee: 0xe00025b8, 0x72ef: 0xe0000c57, + 0x72f0: 0x002d9a83, 0x72f1: 0x402d9820, 0x72f2: 0xe00025d4, 0x72f3: 0xf0000404, + 0x72f4: 0xe0000c8a, 0x72f5: 0xe0000c87, 0x72f6: 0xe0000c9f, 0x72f7: 0xe0000c9c, + 0x72f8: 0x402f7220, 0x72f9: 0xe0000ccc, 0x72fa: 0xe0000cc9, 0x72fb: 0xe0000cd8, + 0x72fc: 0xe0000cd5, 0x72fd: 0xe0000cd2, 0x72fe: 0xe0000ccf, 0x72ff: 0xe0000d04, + // Block 0x1cc, offset 0x7300 + 0x7300: 0xe0000cfe, 0x7301: 0xe0000cf8, 0x7302: 0xe0000cf5, 0x7303: 0xe0000d51, + 0x7304: 0xe0000d4e, 0x7305: 0xe0000d6f, 0x7306: 0xe0000d6c, 0x7307: 0xe0000d5d, + 0x7308: 0xe0000d5a, 0x7309: 0xf0000404, 0x730a: 0x002eda88, 0x730b: 0x402eda20, + 0x730c: 0xe0000e2e, 0x730d: 0xe0000e2b, 0x730e: 0xe0000da0, 0x730f: 0xe0000d9d, + 0x7310: 0xe0000de0, 0x7311: 0xe0000ddd, 0x7312: 0xe0000e93, 0x7313: 0xe0000e8f, + 0x7314: 0xe0000eca, 0x7315: 0xe0000ec7, 0x7316: 0xe0000edc, 0x7317: 0xe0000ed9, + 0x7318: 0xe0000ed0, 0x7319: 0xe0000ecd, 0x731a: 0xe0000f1f, 0x731b: 0xe0000f1c, + 0x731c: 0xe0000f2d, 0x731d: 0xe0000f2a, 0x731e: 0x002fe883, 0x731f: 0x402fe820, + 0x7320: 0xe0000f33, 0x7321: 0xe0000f30, 0x7322: 0xe0000f99, 0x7323: 0xe0000f96, + 0x7324: 0xe0000f8a, 0x7325: 0xe0000f87, 0x7326: 0x00303688, 0x7327: 0x40303620, + 0x7328: 0xe000102b, 0x7329: 0xe0001028, 0x732a: 0xe000103f, 0x732b: 0xe000103c, + 0x732c: 0xe0000fe7, 0x732d: 0xe0000fe4, 0x732e: 0xe0000ff9, 0x732f: 0xe0000ff6, + 0x7330: 0xe0001025, 0x7331: 0xe0001022, 0x7332: 0xe0001039, 0x7333: 0xe0001036, + 0x7334: 0xe00010d8, 0x7335: 0xe00010d5, 0x7336: 0xe000110e, 0x7337: 0xe000110b, + 0x7338: 0xe0001117, 0x7339: 0xe000113b, 0x733a: 0xe0001138, 0x733b: 0xe000114d, + 0x733c: 0xe000114a, 0x733d: 0xe0001147, 0x733e: 0xe0001144, 0x733f: 0xe0000f64, + // Block 0x1cd, offset 0x7340 + 0x7340: 0x402c1a20, 0x7341: 0x002c2a88, 0x7342: 0x002c3288, 0x7343: 0x402c3220, + 0x7344: 0x0031c488, 0x7345: 0x4031c420, 0x7346: 0x002efa88, 0x7347: 0x002c4e88, + 0x7348: 0x402c4e20, 0x7349: 0x002c7288, 0x734a: 0x002c7a88, 0x734b: 0x002c8488, + 0x734c: 0x402c8420, 0x734d: 0xe000115c, 0x734e: 0x002cae88, 0x734f: 0x002c9a83, + 0x7350: 0x002cc288, 0x7351: 0x002d1688, 0x7352: 0x402d1620, 0x7353: 0x002d4488, + 0x7354: 0x002d5888, 0x7355: 0x402d7820, 0x7356: 0x002dc288, 0x7357: 0x002db688, + 0x7358: 0x002e0a88, 0x7359: 0x402e0a20, 0x735a: 0x402e3820, 0x735b: 0x402e7220, + 0x735c: 0x0030a088, 0x735d: 0x002eb488, 0x735e: 0x402ebc20, 0x735f: 0x002f1088, + 0x7360: 0xe0000e56, 0x7361: 0xe0000e53, 0x7362: 0x002d6088, 0x7363: 0x402d6020, + 0x7364: 0x002f3e88, 0x7365: 0x402f3e20, 0x7366: 0x002f8288, 0x7367: 0x0031b488, + 0x7368: 0x4031b420, 0x7369: 0x00300888, 0x736a: 0x40301220, 0x736b: 0x40304220, + 0x736c: 0x00304a88, 0x736d: 0x40304a20, 0x736e: 0x00305288, 0x736f: 0xe000105f, + 0x7370: 0xe000105c, 0x7371: 0x0030b488, 0x7372: 0x0030cc88, 0x7373: 0x00311888, + 0x7374: 0x40311820, 0x7375: 0x00313488, 0x7376: 0x40313420, 0x7377: 0x00316488, + 0x7378: 0x00316e88, 0x7379: 0x40316e20, 0x737a: 0x40317820, 0x737b: 0x4031a620, + 0x737c: 0x0031bc88, 0x737d: 0x4031bc20, 0x737e: 0xe0000fc9, 0x737f: 0x40319420, + // Block 0x1ce, offset 0x7380 + 0x7380: 0x40321220, 0x7381: 0x40321a20, 0x7382: 0x40322220, 0x7383: 0x40322a20, + 0x7384: 0xe0000ad5, 0x7385: 0xe0000ad1, 0x7386: 0xe0000acd, 0x7387: 0xf0000a0a, + 0x7388: 0xf000040a, 0x7389: 0xf0000404, 0x738a: 0xf0000a0a, 0x738b: 0xf000040a, + 0x738c: 0xf0000404, 0x738d: 0xe0000947, 0x738e: 0xe0000944, 0x738f: 0xe00025ab, + 0x7390: 0xe0000c3a, 0x7391: 0xe0000dcc, 0x7392: 0xe0000dc9, 0x7393: 0xe0000ff3, + 0x7394: 0xe0000ff0, 0x7395: 0xe0002607, 0x7396: 0xe0002604, 0x7397: 0xe00025f5, + 0x7398: 0xe00025f2, 0x7399: 0xe0002601, 0x739a: 0xe00025fe, 0x739b: 0xe00025fb, + 0x739c: 0xe00025f8, 0x739d: 0x402cae20, 0x739e: 0xe0000962, 0x739f: 0xe000095e, + 0x73a0: 0xe0000976, 0x73a1: 0xe0000972, 0x73a2: 0xe00009f4, 0x73a3: 0xe00009ef, + 0x73a4: 0x002d3a88, 0x73a5: 0x402d3a20, 0x73a6: 0xe0000bbe, 0x73a7: 0xe0000bbb, + 0x73a8: 0xe0000c99, 0x73a9: 0xe0000c96, 0x73aa: 0xe0000e20, 0x73ab: 0xe0000e1d, + 0x73ac: 0xe0000e27, 0x73ad: 0xe0000e23, 0x73ae: 0xe0001162, 0x73af: 0xe000115f, + 0x73b0: 0xe0000c8d, 0x73b1: 0xf0000a0a, 0x73b2: 0xf000040a, 0x73b3: 0xf0000404, + 0x73b4: 0xe0000bac, 0x73b5: 0xe0000ba9, 0x73b6: 0x002d7888, 0x73b7: 0x00319488, + 0x73b8: 0xe0000d57, 0x73b9: 0xe0000d54, 0x73ba: 0xe0000954, 0x73bb: 0xe0000950, + 0x73bc: 0xe00009ea, 0x73bd: 0xe00009e5, 0x73be: 0xe0000e19, 0x73bf: 0xe0000e15, + // Block 0x1cf, offset 0x73c0 + 0x73c0: 0xe000098f, 0x73c1: 0xe000098c, 0x73c2: 0xe0000995, 0x73c3: 0xe0000992, + 0x73c4: 0xe0000b62, 0x73c5: 0xe0000b5f, 0x73c6: 0xe0000b68, 0x73c7: 0xe0000b65, + 0x73c8: 0xe00025c1, 0x73c9: 0xe0000c69, 0x73ca: 0xe00025c4, 0x73cb: 0xe0000c6f, + 0x73cc: 0xe0000e4a, 0x73cd: 0xe0000e47, 0x73ce: 0xe0000e50, 0x73cf: 0xe0000e4d, + 0x73d0: 0xe0000ee8, 0x73d1: 0xe0000ee5, 0x73d2: 0xe0000eee, 0x73d3: 0xe0000eeb, + 0x73d4: 0xe0001053, 0x73d5: 0xe0001050, 0x73d6: 0xe0001059, 0x73d7: 0xe0001056, + 0x73d8: 0xe0000f61, 0x73d9: 0xe0000f5e, 0x73da: 0xe0000fa5, 0x73db: 0xe0000fa2, + 0x73dc: 0x00312288, 0x73dd: 0x40312220, 0x73de: 0xe0000bf4, 0x73df: 0xe0000bf1, + 0x73e0: 0x002ebc88, 0x73e1: 0x402c8c20, 0x73e2: 0x002f2288, 0x73e3: 0x402f2220, + 0x73e4: 0x00314088, 0x73e5: 0x40314020, 0x73e6: 0xe000096f, 0x73e7: 0xe000096c, + 0x73e8: 0xe0000b32, 0x73e9: 0xe0000b2f, 0x73ea: 0xe00025ef, 0x73eb: 0xe00025ec, + 0x73ec: 0xe0000dfd, 0x73ed: 0xe0000df9, 0x73ee: 0xe0000e04, 0x73ef: 0xe0000e01, + 0x73f0: 0xe0000e0b, 0x73f1: 0xe0000e07, 0x73f2: 0xe0001129, 0x73f3: 0xe0001126, + 0x73f4: 0x402e5e20, 0x73f5: 0x402ed020, 0x73f6: 0x40305a20, 0x73f7: 0x402dd420, + 0x73f8: 0xe0000abf, 0x73f9: 0xe0000ec4, 0x73fa: 0x002be888, 0x73fb: 0x002c4488, + 0x73fc: 0x402c4420, 0x73fd: 0x002e3888, 0x73fe: 0x00303e88, 0x73ff: 0x402ffc20, + // Block 0x1d0, offset 0x7400 + 0x7400: 0x40315820, 0x7401: 0x0031d488, 0x7402: 0x4031d420, 0x7403: 0x002c1a88, + 0x7404: 0x00307c88, 0x7405: 0x0030da88, 0x7406: 0x002ca288, 0x7407: 0x402ca220, + 0x7408: 0x002dde88, 0x7409: 0x402dde20, 0x740a: 0x002f6a88, 0x740b: 0x402f6a20, + 0x740c: 0x002f8e88, 0x740d: 0x402f8e20, 0x740e: 0x00311088, 0x740f: 0x40311020, + 0x7410: 0x402bf020, 0x7411: 0x402bf820, 0x7412: 0x402c0220, 0x7413: 0x402c2a20, + 0x7414: 0x402efa20, 0x7415: 0x402c5620, 0x7416: 0x402c7220, 0x7417: 0x402c7a20, + 0x7418: 0x402ccc20, 0x7419: 0x402c9a20, 0x741a: 0x402cd420, 0x741b: 0x402cc220, + 0x741c: 0x402cdc20, 0x741d: 0x402ce820, 0x741e: 0x402cf020, 0x741f: 0x402dee20, + 0x7420: 0x402d4420, 0x7421: 0x402d2a20, 0x7422: 0x402d3220, 0x7423: 0x402d5820, + 0x7424: 0x402d0020, 0x7425: 0x40308820, 0x7426: 0x402d8020, 0x7427: 0x402d8e20, + 0x7428: 0x402db620, 0x7429: 0x402dc220, 0x742a: 0x402daa20, 0x742b: 0x402e4220, + 0x742c: 0x402e4a20, 0x742d: 0x402e5420, 0x742e: 0x402e6820, 0x742f: 0x4030a020, + 0x7430: 0x4030ac20, 0x7431: 0x402e9020, 0x7432: 0x402eb420, 0x7433: 0x402ec820, + 0x7434: 0x402ea620, 0x7435: 0x402f1020, 0x7436: 0x402eee20, 0x7437: 0x402f1a20, + 0x7438: 0x402f4c20, 0x7439: 0x402f9820, 0x743a: 0x402fa220, 0x743b: 0x402fac20, + 0x743c: 0x402fb620, 0x743d: 0x402fbe20, 0x743e: 0x402fc620, 0x743f: 0x402fd020, + // Block 0x1d1, offset 0x7440 + 0x7440: 0xe00009b1, 0x7441: 0xe00009ae, 0x7442: 0xe0000a22, 0x7443: 0xe0000a1f, + 0x7444: 0xe0000a28, 0x7445: 0xe0000a25, 0x7446: 0xe0000a2e, 0x7447: 0xe0000a2b, + 0x7448: 0xe0002590, 0x7449: 0xe000258d, 0x744a: 0xe0000a8c, 0x744b: 0xe0000a89, + 0x744c: 0xe0000a98, 0x744d: 0xe0000a95, 0x744e: 0xe0000aa4, 0x744f: 0xe0000aa1, + 0x7450: 0xe0000a92, 0x7451: 0xe0000a8f, 0x7452: 0xe0000a9e, 0x7453: 0xe0000a9b, + 0x7454: 0xe0000b55, 0x7455: 0xe0000b51, 0x7456: 0xe0000b4d, 0x7457: 0xe0000b49, + 0x7458: 0xe0000b7c, 0x7459: 0xe0000b79, 0x745a: 0xe0000b82, 0x745b: 0xe0000b7f, + 0x745c: 0xe0000b39, 0x745d: 0xe0000b35, 0x745e: 0xe0000b8c, 0x745f: 0xe0000b89, + 0x7460: 0xe0000bd0, 0x7461: 0xe0000bcd, 0x7462: 0xe0000c00, 0x7463: 0xe0000bfd, + 0x7464: 0xe0000c0c, 0x7465: 0xe0000c09, 0x7466: 0xe0000bfa, 0x7467: 0xe0000bf7, + 0x7468: 0xe0000c06, 0x7469: 0xe0000c03, 0x746a: 0xe0000c12, 0x746b: 0xe0000c0f, + 0x746c: 0xe00025ca, 0x746d: 0xe0000c7b, 0x746e: 0xe00025b1, 0x746f: 0xe0000c46, + 0x7470: 0xe0000c93, 0x7471: 0xe0000c90, 0x7472: 0xe0000cab, 0x7473: 0xe0000ca8, + 0x7474: 0xe0000cb1, 0x7475: 0xe0000cae, 0x7476: 0xe0000cde, 0x7477: 0xe0000cdb, + 0x7478: 0xe0000ce5, 0x7479: 0xe0000ce1, 0x747a: 0xe0000cf2, 0x747b: 0xe0000cef, + 0x747c: 0xe0000cec, 0x747d: 0xe0000ce9, 0x747e: 0xe0000d1e, 0x747f: 0xe0000d1b, + // Block 0x1d2, offset 0x7480 + 0x7480: 0xe0000d24, 0x7481: 0xe0000d21, 0x7482: 0xe0000d2a, 0x7483: 0xe0000d27, + 0x7484: 0xe0000d69, 0x7485: 0xe0000d66, 0x7486: 0xe0000d7b, 0x7487: 0xe0000d78, + 0x7488: 0xe0000d87, 0x7489: 0xe0000d84, 0x748a: 0xe0000d81, 0x748b: 0xe0000d7e, + 0x748c: 0xe0000ded, 0x748d: 0xe0000de9, 0x748e: 0xe00025e9, 0x748f: 0xe00025e6, + 0x7490: 0xe0000e3d, 0x7491: 0xe0000e39, 0x7492: 0xe0000e35, 0x7493: 0xe0000e31, + 0x7494: 0xe0000ea7, 0x7495: 0xe0000ea4, 0x7496: 0xe0000ead, 0x7497: 0xe0000eaa, + 0x7498: 0xe0000ed6, 0x7499: 0xe0000ed3, 0x749a: 0xe0000ef4, 0x749b: 0xe0000ef1, + 0x749c: 0xe0000efb, 0x749d: 0xe0000ef7, 0x749e: 0xe0000f02, 0x749f: 0xe0000eff, + 0x74a0: 0xe0000f41, 0x74a1: 0xe0000f3e, 0x74a2: 0xe0000f53, 0x74a3: 0xe0000f50, + 0x74a4: 0xe0000f26, 0x74a5: 0xe0000f22, 0x74a6: 0xe0000f3a, 0x74a7: 0xe0000f36, + 0x74a8: 0xe0000f5a, 0x74a9: 0xe0000f56, 0x74aa: 0xe0000f93, 0x74ab: 0xe0000f90, + 0x74ac: 0xe0000f9f, 0x74ad: 0xe0000f9c, 0x74ae: 0xe0000fb1, 0x74af: 0xe0000fae, + 0x74b0: 0xe0000fab, 0x74b1: 0xe0000fa8, 0x74b2: 0xe0001093, 0x74b3: 0xe0001090, + 0x74b4: 0xe000109f, 0x74b5: 0xe000109c, 0x74b6: 0xe0001099, 0x74b7: 0xe0001096, + 0x74b8: 0xe0001032, 0x74b9: 0xe000102e, 0x74ba: 0xe0002607, 0x74bb: 0xe0002604, + 0x74bc: 0xe00010a9, 0x74bd: 0xe00010a6, 0x74be: 0xe00010af, 0x74bf: 0xe00010ac, + // Block 0x1d3, offset 0x74c0 + 0x74c0: 0xe00010d2, 0x74c1: 0xe00010cf, 0x74c2: 0xe00010cc, 0x74c3: 0xe00010c9, + 0x74c4: 0xe00010e1, 0x74c5: 0xe00010de, 0x74c6: 0xe00010e7, 0x74c7: 0xe00010e4, + 0x74c8: 0xe00010ed, 0x74c9: 0xe00010ea, 0x74ca: 0xe000259c, 0x74cb: 0xe0002599, + 0x74cc: 0xe0002596, 0x74cd: 0xe0002593, 0x74ce: 0xe0001123, 0x74cf: 0xe0001120, + 0x74d0: 0xe0001141, 0x74d1: 0xe000113e, 0x74d2: 0xe0001153, 0x74d3: 0xe0001150, + 0x74d4: 0xe0001159, 0x74d5: 0xe0001156, 0x74d6: 0xe0000c15, 0x74d7: 0xe0000f8d, + 0x74d8: 0xe00010db, 0x74d9: 0xe0001111, 0x74da: 0xf0000404, 0x74db: 0xe0000f70, + 0x74dc: 0x40300420, 0x74dd: 0x40300620, 0x74de: 0xe0000f7f, 0x74df: 0x402c9620, + 0x74e0: 0xe000099b, 0x74e1: 0xe0000998, 0x74e2: 0xe0000989, 0x74e3: 0xe0000986, + 0x74e4: 0xe0000928, 0x74e5: 0xe0000924, 0x74e6: 0xe0000930, 0x74e7: 0xe000092c, + 0x74e8: 0xe0000940, 0x74e9: 0xe000093c, 0x74ea: 0xe0000938, 0x74eb: 0xe0000934, + 0x74ec: 0xe00009aa, 0x74ed: 0xe00009a6, 0x74ee: 0xe0000902, 0x74ef: 0xe00008fe, + 0x74f0: 0xe000090a, 0x74f1: 0xe0000906, 0x74f2: 0xe000091a, 0x74f3: 0xe0000916, + 0x74f4: 0xe0000912, 0x74f5: 0xe000090e, 0x74f6: 0xe00009a2, 0x74f7: 0xe000099e, + 0x74f8: 0xe0000b6e, 0x74f9: 0xe0000b6b, 0x74fa: 0xe0000b5c, 0x74fb: 0xe0000b59, + 0x74fc: 0xe0000b26, 0x74fd: 0xe0000b23, 0x74fe: 0xe0000afb, 0x74ff: 0xe0000af7, + // Block 0x1d4, offset 0x7500 + 0x7500: 0xe0000b03, 0x7501: 0xe0000aff, 0x7502: 0xe0000b13, 0x7503: 0xe0000b0f, + 0x7504: 0xe0000b0b, 0x7505: 0xe0000b07, 0x7506: 0xe0000b75, 0x7507: 0xe0000b71, + 0x7508: 0xe00025be, 0x7509: 0xe0000c63, 0x750a: 0xe00025c7, 0x750b: 0xe0000c75, + 0x750c: 0xe0000e84, 0x750d: 0xe0000e81, 0x750e: 0xe0000e44, 0x750f: 0xe0000e41, + 0x7510: 0xe0000dad, 0x7511: 0xe0000da9, 0x7512: 0xe0000db5, 0x7513: 0xe0000db1, + 0x7514: 0xe0000dc5, 0x7515: 0xe0000dc1, 0x7516: 0xe0000dbd, 0x7517: 0xe0000db9, + 0x7518: 0xe0000e8b, 0x7519: 0xe0000e87, 0x751a: 0xe0000e5d, 0x751b: 0xe0000e59, + 0x751c: 0xe0000e65, 0x751d: 0xe0000e61, 0x751e: 0xe0000e75, 0x751f: 0xe0000e71, + 0x7520: 0xe0000e6d, 0x7521: 0xe0000e69, 0x7522: 0xe0000e7d, 0x7523: 0xe0000e79, + 0x7524: 0xe000108d, 0x7525: 0xe000108a, 0x7526: 0xe000104d, 0x7527: 0xe000104a, + 0x7528: 0xe0001066, 0x7529: 0xe0001062, 0x752a: 0xe000106e, 0x752b: 0xe000106a, + 0x752c: 0xe000107e, 0x752d: 0xe000107a, 0x752e: 0xe0001076, 0x752f: 0xe0001072, + 0x7530: 0xe0001086, 0x7531: 0xe0001082, 0x7532: 0xe0001108, 0x7533: 0xe0001105, + 0x7534: 0xe0001135, 0x7535: 0xe0001132, 0x7536: 0xe000112f, 0x7537: 0xe000112c, + 0x7538: 0xe000111d, 0x7539: 0xe000111a, 0x753a: 0xe0000d0a, 0x753b: 0xe0000d07, + 0x753c: 0x0030d888, 0x753d: 0x4030d820, 0x753e: 0x00312088, 0x753f: 0x40312020, + // Block 0x1d5, offset 0x7540 + 0x7540: 0x00093685, 0x7541: 0x40083620, 0x7542: 0x40083820, 0x7543: 0x40083a20, + 0x7544: 0x40083c20, 0x7545: 0x002c628b, 0x7546: 0x002c6285, 0x7547: 0x002c9885, + 0x7548: 0x002d9a85, 0x7549: 0x002dcc85, 0x754a: 0x40083e20, 0x754b: 0x400a6e20, + 0x754c: 0x40084020, 0x754d: 0xe00009c4, 0x754e: 0x402d1e20, 0x754f: 0x40084220, + 0x7550: 0xe00002cb, 0x7551: 0xe00002d3, 0x7552: 0xe00002b2, 0x7553: 0xe00002bb, + 0x7554: 0xe00003cd, 0x7555: 0xe00002c3, 0x7556: 0xe00003d1, 0x7557: 0xe00004ab, + 0x7558: 0xe0000579, 0x7559: 0xe00002c7, 0x755a: 0xe0000640, 0x755b: 0xe00002cf, + 0x755c: 0xe00004af, 0x755d: 0xe0000644, 0x755e: 0xe0000798, 0x755f: 0xf0001e1e, + 0x7560: 0x002d9a8a, 0x7561: 0xe00025cd, 0x7562: 0xe00025d0, 0x7563: 0xe00025da, + 0x7564: 0x0030be8a, 0x7565: 0xe000260a, 0x7566: 0xe000260d, 0x7567: 0xe00010bb, + 0x7568: 0xe00025e0, 0x7569: 0x0030f68a, 0x756a: 0xe0002614, 0x756b: 0xe000261b, + 0x756c: 0x002e228a, 0x756d: 0x002c3a8a, 0x756e: 0x002c628a, 0x756f: 0x002e828a, + 0x7570: 0x002d9a84, 0x7571: 0xf0001f04, 0x7572: 0xf0000404, 0x7573: 0xf0001f04, + 0x7574: 0x0030be84, 0x7575: 0xf0001f04, 0x7576: 0xf0000404, 0x7577: 0xe00010b6, + 0x7578: 0xe00025dd, 0x7579: 0x0030f684, 0x757a: 0xe0002611, 0x757b: 0xe0002617, + 0x757c: 0x002e2284, 0x757d: 0x002c3a84, 0x757e: 0x002c6284, 0x757f: 0x002e8284, + // Block 0x1d6, offset 0x7580 + 0x7580: 0xe0000024, 0x7581: 0xe0000029, 0x7582: 0xe000002e, 0x7583: 0xe0000033, + 0x7584: 0xe0000038, 0x7585: 0xe000003d, 0x7586: 0xe0000042, 0x7587: 0xe0000047, + 0x7588: 0xf0001f04, 0x7589: 0xf0001f04, 0x758a: 0xf0001f04, 0x758b: 0xf0001f04, + 0x758c: 0xf0001f04, 0x758d: 0xf0001f04, 0x758e: 0xf0001f04, 0x758f: 0xf0001f04, + 0x7590: 0xf0001f04, 0x7591: 0xf0000404, 0x7592: 0xf0000404, 0x7593: 0xf0000404, + 0x7594: 0xf0000404, 0x7595: 0xf0000404, 0x7596: 0xf0000404, 0x7597: 0xf0000404, + 0x7598: 0xf0000404, 0x7599: 0xf0000404, 0x759a: 0xf0000404, 0x759b: 0xf0000404, + 0x759c: 0xf0000404, 0x759d: 0xf0000404, 0x759e: 0xf0000404, 0x759f: 0xf0000404, + 0x75a0: 0xf0000404, 0x75a1: 0xf0000404, 0x75a2: 0xf0000404, 0x75a3: 0xf0000404, + 0x75a4: 0xf0000404, 0x75a5: 0xf0000404, 0x75a6: 0xf0000404, 0x75a7: 0xf0000404, + 0x75a8: 0xf0000404, 0x75a9: 0xf0000404, 0x75aa: 0xf0000404, 0x75ab: 0xf0000404, + 0x75ac: 0xe000257a, 0x75ad: 0xf0000404, 0x75ae: 0xf0000404, 0x75af: 0xf0000404, + 0x75b0: 0xf0000404, 0x75b1: 0xf0000404, 0x75b2: 0xf0000404, 0x75b3: 0xe0002582, + 0x75b4: 0xf0000404, 0x75b5: 0xf0000404, 0x75b6: 0x002bde8c, 0x75b7: 0x002c0a8c, + 0x75b8: 0x002c3a8c, 0x75b9: 0x002c628c, 0x75ba: 0x002c988c, 0x75bb: 0x002d088c, + 0x75bc: 0x002d228c, 0x75bd: 0x002d688c, 0x75be: 0x002d9a8c, 0x75bf: 0x002dcc8c, + // Block 0x1d7, offset 0x75c0 + 0x75c0: 0xe000230b, 0x75c1: 0xe00022f8, 0x75c2: 0xe00022fc, 0x75c3: 0xe0002311, + 0x75c4: 0xe0002316, 0x75c5: 0xe000231d, 0x75c6: 0xe0002321, 0x75c7: 0xe0002325, + 0x75c8: 0xe000232b, 0x75c9: 0xf0001c1c, 0x75ca: 0xe0002330, 0x75cb: 0xe000233c, + 0x75cc: 0xe0002340, 0x75cd: 0xe0002337, 0x75ce: 0xe0002346, 0x75cf: 0xe000234b, + 0x75d0: 0xe000234f, 0x75d1: 0xe0002353, 0x75d2: 0xf0001c1c, 0x75d3: 0xe000235e, + 0x75d4: 0xe0002358, 0x75d5: 0xf0001c1c, 0x75d6: 0xe0002363, 0x75d7: 0xe000236d, + 0x75d8: 0xf0001f04, 0x75d9: 0xf0001f04, 0x75da: 0xf0001f04, 0x75db: 0xf0001f04, + 0x75dc: 0xf0001f04, 0x75dd: 0xf0001f04, 0x75de: 0xf0001f04, 0x75df: 0xf0001f04, + 0x75e0: 0xf0001f04, 0x75e1: 0xf0001f04, 0x75e2: 0xf0000404, 0x75e3: 0xf0000404, + 0x75e4: 0xf0000404, 0x75e5: 0xf0000404, 0x75e6: 0xf0000404, 0x75e7: 0xf0000404, + 0x75e8: 0xf0000404, 0x75e9: 0xf0000404, 0x75ea: 0xf0000404, 0x75eb: 0xf0000404, + 0x75ec: 0xf0000404, 0x75ed: 0xf0000404, 0x75ee: 0xf0000404, 0x75ef: 0xf0000404, + 0x75f0: 0xf0000404, 0x75f1: 0xe0000c1e, 0x75f2: 0xf0001c1c, 0x75f3: 0xf0001d1d, + 0x75f4: 0xe0000a31, 0x75f5: 0xf0001d1c, 0x75f6: 0xf0001c1c, 0x75f7: 0xf0001c1c, + 0x75f8: 0xe0000ac2, 0x75f9: 0xe0000ac6, 0x75fa: 0xe00025d7, 0x75fb: 0xf0001c1c, + 0x75fc: 0xf0001c1c, 0x75fd: 0xf0001c1c, 0x75fe: 0xf0001c1c, 0x75ff: 0xe0002431, + // Block 0x1d8, offset 0x7600 + 0x7600: 0xf0001d1c, 0x7601: 0xf0001d1d, 0x7602: 0xe00009b7, 0x7603: 0xe000258a, + 0x7604: 0xf0001c1c, 0x7605: 0xf0001c1c, 0x7606: 0xe0000a66, 0x7607: 0xe0000a7a, + 0x7608: 0xf0001d1c, 0x7609: 0xf0001c1d, 0x760a: 0xf0001c1c, 0x760b: 0xf0001d1d, + 0x760c: 0xf0001c1c, 0x760d: 0xf0001d1d, 0x760e: 0xf0001d1d, 0x760f: 0xf0001c1c, + 0x7610: 0xf0001c1c, 0x7611: 0xf0001c1c, 0x7612: 0xe0000d0d, 0x7613: 0xe00025e3, + 0x7614: 0xf0001c1c, 0x7615: 0xe0000d3a, 0x7616: 0xe0000d46, 0x7617: 0xf0001d1d, + 0x7618: 0xe0000eb0, 0x7619: 0xe0000eb8, 0x761a: 0xf0001d1d, 0x761b: 0xf0001c1c, + 0x761c: 0xf0001c1d, 0x761d: 0xf0001c1d, 0x761e: 0xe00010b2, 0x761f: 0xe00009c8, + 0x7620: 0xf0001f04, 0x7621: 0xf0001f04, 0x7622: 0xf0001f04, 0x7623: 0xf0001f04, + 0x7624: 0xf0001f04, 0x7625: 0xf0001f04, 0x7626: 0xf0001f04, 0x7627: 0xf0001f04, + 0x7628: 0xf0001f04, 0x7629: 0xf0000404, 0x762a: 0xf0000404, 0x762b: 0xf0000404, + 0x762c: 0xf0000404, 0x762d: 0xf0000404, 0x762e: 0xf0000404, 0x762f: 0xf0000404, + 0x7630: 0xf0000404, 0x7631: 0xf0000404, 0x7632: 0xf0000404, 0x7633: 0xf0000404, + 0x7634: 0xf0000404, 0x7635: 0xf0000404, 0x7636: 0xf0000404, 0x7637: 0xf0000404, + 0x7638: 0xf0000404, 0x7639: 0xf0000404, 0x763a: 0xf0000404, 0x763b: 0xf0000404, + 0x763c: 0xf0000404, 0x763d: 0xf0000404, 0x763e: 0xf0000404, 0x763f: 0xe0000bdf, + // Block 0x1d9, offset 0x7640 + 0x7640: 0xf0001f04, 0x7641: 0xf0001f04, 0x7642: 0xf0001f04, 0x7643: 0xf0001f04, + 0x7644: 0xf0001f04, 0x7645: 0xf0001f04, 0x7646: 0xf0001f04, 0x7647: 0xf0001f04, + 0x7648: 0xf0001f04, 0x7649: 0xf0001f04, 0x764a: 0xf0001f04, + 0x7650: 0xf0000a04, 0x7651: 0xf0000a04, 0x7652: 0xf0000a04, 0x7653: 0xf0000a04, + 0x7654: 0xf0000a04, 0x7655: 0xf0000a04, 0x7656: 0xf0000a04, 0x7657: 0xf0000a04, + 0x7658: 0xe0002576, 0x7659: 0xf0000a04, 0x765a: 0xf0000a04, 0x765b: 0xf0000a04, + 0x765c: 0xf0000a04, 0x765d: 0xf0000a04, 0x765e: 0xf0000a04, 0x765f: 0xf0000a04, + 0x7660: 0xe000257e, 0x7661: 0xf0000a04, 0x7662: 0xf0000a04, 0x7663: 0xf0000a04, + 0x7664: 0xf0000a04, 0x7665: 0xf0000a04, 0x7666: 0xf0000a04, 0x7667: 0xe0002586, + 0x7668: 0xf0000a04, 0x7669: 0xf0000a04, 0x766a: 0xf0000a04, 0x766b: 0x002c3a8c, + 0x766c: 0x002f7a8c, 0x766d: 0xf0000c0c, 0x766e: 0xf0000c0c, + 0x7670: 0x002bde9d, 0x7671: 0x002c0a9d, 0x7672: 0x002c3a9d, 0x7673: 0x002c629d, + 0x7674: 0x002c989d, 0x7675: 0x002d089d, 0x7676: 0x002d229d, 0x7677: 0x002d689d, + 0x7678: 0x002d9a9d, 0x7679: 0x002dcc9d, 0x767a: 0x002dfe9d, 0x767b: 0x002e229d, + 0x767c: 0x002e829d, 0x767d: 0x002e9e9d, 0x767e: 0x002ee29d, 0x767f: 0x002f2c9d, + // Block 0x1da, offset 0x7680 + 0x7680: 0xa0000000, 0x7681: 0xa0000000, 0x7682: 0xa0000000, 0x7683: 0xa0000000, + 0x7684: 0xa0000000, 0x7685: 0xa0000000, 0x7686: 0xa0000000, 0x7687: 0xa0000000, + 0x7688: 0xa0000000, 0x7689: 0x40020020, 0x768a: 0x40020220, 0x768b: 0x40020420, + 0x768c: 0x40020620, 0x768d: 0x40020820, 0x768e: 0xa0000000, 0x768f: 0xa0000000, + 0x7690: 0xa0000000, 0x7691: 0xa0000000, 0x7692: 0xa0000000, 0x7693: 0xa0000000, + 0x7694: 0xa0000000, 0x7695: 0xa0000000, 0x7696: 0xa0000000, 0x7697: 0xa0000000, + 0x7698: 0xa0000000, 0x7699: 0xa0000000, 0x769a: 0xa0000000, 0x769b: 0xa0000000, + 0x769c: 0xa0000000, 0x769d: 0xa0000000, 0x769e: 0xa0000000, 0x769f: 0xa0000000, + 0x76a0: 0x40021220, 0x76a1: 0x4002ba20, 0x76a2: 0x4003e020, 0x76a3: 0x4004ea20, + 0x76a4: 0x4027de20, 0x76a5: 0x4004ec20, 0x76a6: 0x4004e620, 0x76a7: 0x4003d220, + 0x76a8: 0x4003f420, 0x76a9: 0x4003f620, 0x76aa: 0x4004d820, 0x76ab: 0x40093820, + 0x76ac: 0x40024020, 0x76ad: 0x40021a20, 0x76ae: 0x4002e420, 0x76af: 0x4004e220, + 0x76b0: 0x4029cc20, 0x76b1: 0x4029ce20, 0x76b2: 0x4029d020, 0x76b3: 0x4029d220, + 0x76b4: 0x4029d420, 0x76b5: 0x4029d620, 0x76b6: 0x4029d820, 0x76b7: 0x4029da20, + 0x76b8: 0x4029dc20, 0x76b9: 0x4029de20, 0x76ba: 0x40026c20, 0x76bb: 0x40026220, + 0x76bc: 0x40094020, 0x76bd: 0xc32f0851, 0x76be: 0x40094420, 0x76bf: 0x4002c420, + // Block 0x1db, offset 0x76c0 + 0x76c0: 0x4004d620, 0x76c1: 0x002bde88, 0x76c2: 0x002c0a88, 0x76c3: 0x002c3a88, + 0x76c4: 0x002c6288, 0x76c5: 0x002c9888, 0x76c6: 0x002d0888, 0x76c7: 0x002d2288, + 0x76c8: 0x002d6888, 0x76c9: 0x002d9a88, 0x76ca: 0x002dcc88, 0x76cb: 0x002dfe88, + 0x76cc: 0xc3520002, 0x76cd: 0x002e8288, 0x76ce: 0x002e9e88, 0x76cf: 0x002ee288, + 0x76d0: 0x002f2c88, 0x76d1: 0x002f5688, 0x76d2: 0x002f7a88, 0x76d3: 0x002fe688, + 0x76d4: 0x00302c88, 0x76d5: 0x00306c88, 0x76d6: 0x0030be88, 0x76d7: 0x0030e288, + 0x76d8: 0x0030f688, 0x76d9: 0x00310088, 0x76da: 0x00312a88, 0x76db: 0x4003f820, + 0x76dc: 0x4004e420, 0x76dd: 0x4003fa20, 0x76de: 0x40062420, 0x76df: 0x40021620, + 0x76e0: 0x40061e20, 0x76e1: 0x402bde20, 0x76e2: 0x402c0a20, 0x76e3: 0x402c3a20, + 0x76e4: 0x402c6220, 0x76e5: 0x402c9820, 0x76e6: 0x402d0820, 0x76e7: 0x402d2220, + 0x76e8: 0x402d6820, 0x76e9: 0x402d9a20, 0x76ea: 0x402dcc20, 0x76eb: 0x402dfe20, + 0x76ec: 0xc34f0002, 0x76ed: 0x402e8220, 0x76ee: 0x402e9e20, 0x76ef: 0x402ee220, + 0x76f0: 0x402f2c20, 0x76f1: 0x402f5620, 0x76f2: 0x402f7a20, 0x76f3: 0x402fe620, + 0x76f4: 0x40302c20, 0x76f5: 0x40306c20, 0x76f6: 0x4030be20, 0x76f7: 0x4030e220, + 0x76f8: 0x4030f620, 0x76f9: 0x40310020, 0x76fa: 0x40312a20, 0x76fb: 0x4003fc20, + 0x76fc: 0x40094820, 0x76fd: 0x4003fe20, 0x76fe: 0x40094c20, 0x76ff: 0xa0000000, + // Block 0x1dc, offset 0x7700 + 0x7700: 0xe0000983, 0x7701: 0xe0000980, 0x7702: 0xe00008fb, 0x7703: 0xe00008f8, + 0x7704: 0xe000097d, 0x7705: 0xe000097a, 0x7706: 0xe0000a38, 0x7707: 0xe0000a35, + 0x7708: 0xe0000a3e, 0x7709: 0xe0000a3b, 0x770a: 0xe0000a4a, 0x770b: 0xe0000a47, + 0x770c: 0xe0000a44, 0x770d: 0xe0000a41, 0x770e: 0xe0000a86, 0x770f: 0xe0000a83, + 0x7710: 0xe0000aaa, 0x7711: 0xe0000aa7, 0x7712: 0xe0000b46, 0x7713: 0xe0000b43, + 0x7714: 0xe0000aee, 0x7715: 0xe0000aeb, 0x7716: 0xe0000b2c, 0x7717: 0xe0000b29, + 0x7718: 0xe0000b40, 0x7719: 0xe0000b3d, 0x771a: 0xe0000b1a, 0x771b: 0xe0000b17, + 0x771c: 0xe0000bb8, 0x771d: 0xe0000bb5, 0x771e: 0xe0000bb2, 0x771f: 0xe0000baf, + 0x7720: 0xe0000bc4, 0x7721: 0xe0000bc1, 0x7722: 0xe0000bca, 0x7723: 0xe0000bc7, + 0x7724: 0xe0000bee, 0x7725: 0xe0000beb, 0x7726: 0xe0000c1b, 0x7727: 0xe0000c18, + 0x7728: 0xe0000c51, 0x7729: 0xe0000c4e, 0x772a: 0xe0000c60, 0x772b: 0xe0000c5d, + 0x772c: 0xe0000c31, 0x772d: 0xe0000c2e, 0x772e: 0xe0000c5a, 0x772f: 0xe0000c57, + 0x7730: 0xe0000c54, 0x7731: 0x402da220, 0x7732: 0xf0000a0a, 0x7733: 0xf0000404, + 0x7734: 0xe0000c8a, 0x7735: 0xe0000c87, 0x7736: 0xe0000c9f, 0x7737: 0xe0000c9c, + 0x7738: 0x402f7220, 0x7739: 0xe0000ccc, 0x773a: 0xe0000cc9, 0x773b: 0xe0000cd8, + 0x773c: 0xe0000cd5, 0x773d: 0xe0000cd2, 0x773e: 0xe0000ccf, 0x773f: 0x002e2483, + // Block 0x1dd, offset 0x7740 + 0x7740: 0x402e2420, 0x7741: 0xe0000cf8, 0x7742: 0xe0000cf5, 0x7743: 0xe0000d51, + 0x7744: 0xe0000d4e, 0x7745: 0xe0000d6f, 0x7746: 0xe0000d6c, 0x7747: 0xe0000d5d, + 0x7748: 0xe0000d5a, 0x7749: 0xf0000404, 0x774a: 0x002eda88, 0x774b: 0x402eda20, + 0x774c: 0xe0000e2e, 0x774d: 0xe0000e2b, 0x774e: 0xe0000da0, 0x774f: 0xe0000d9d, + 0x7750: 0xe0000de0, 0x7751: 0xe0000ddd, 0x7752: 0xe0000e93, 0x7753: 0xe0000e8f, + 0x7754: 0xe0000eca, 0x7755: 0xe0000ec7, 0x7756: 0xe0000edc, 0x7757: 0xe0000ed9, + 0x7758: 0xe0000ed0, 0x7759: 0xe0000ecd, 0x775a: 0xe0000f1f, 0x775b: 0xe0000f1c, + 0x775c: 0xe0000f2d, 0x775d: 0xe0000f2a, 0x775e: 0xe0000f47, 0x775f: 0xe0000f44, + 0x7760: 0xe0000f33, 0x7761: 0xe0000f30, 0x7762: 0xe0000f99, 0x7763: 0xe0000f96, + 0x7764: 0xe0000f8a, 0x7765: 0xe0000f87, 0x7766: 0x00303688, 0x7767: 0x40303620, + 0x7768: 0xe000102b, 0x7769: 0xe0001028, 0x776a: 0xe000103f, 0x776b: 0xe000103c, + 0x776c: 0xe0000fe7, 0x776d: 0xe0000fe4, 0x776e: 0xe0000ff9, 0x776f: 0xe0000ff6, + 0x7770: 0xe0001025, 0x7771: 0xe0001022, 0x7772: 0xe0001039, 0x7773: 0xe0001036, + 0x7774: 0xe00010d8, 0x7775: 0xe00010d5, 0x7776: 0xe000110e, 0x7777: 0xe000110b, + 0x7778: 0xe0001117, 0x7779: 0xe000113b, 0x777a: 0xe0001138, 0x777b: 0xe000114d, + 0x777c: 0xe000114a, 0x777d: 0xe0001147, 0x777e: 0xe0001144, 0x777f: 0xe0000f64, + // Block 0x1de, offset 0x7780 + 0x7780: 0xa0000000, 0x7781: 0xa0000000, 0x7782: 0xa0000000, 0x7783: 0xa0000000, + 0x7784: 0xa0000000, 0x7785: 0xa0000000, 0x7786: 0xa0000000, 0x7787: 0xa0000000, + 0x7788: 0xa0000000, 0x7789: 0x40020020, 0x778a: 0x40020220, 0x778b: 0x40020420, + 0x778c: 0x40020620, 0x778d: 0x40020820, 0x778e: 0xa0000000, 0x778f: 0xa0000000, + 0x7790: 0xa0000000, 0x7791: 0xa0000000, 0x7792: 0xa0000000, 0x7793: 0xa0000000, + 0x7794: 0xa0000000, 0x7795: 0xa0000000, 0x7796: 0xa0000000, 0x7797: 0xa0000000, + 0x7798: 0xa0000000, 0x7799: 0xa0000000, 0x779a: 0xa0000000, 0x779b: 0xa0000000, + 0x779c: 0xa0000000, 0x779d: 0xa0000000, 0x779e: 0xa0000000, 0x779f: 0xa0000000, + 0x77a0: 0x40021220, 0x77a1: 0x4002ba20, 0x77a2: 0x4003e020, 0x77a3: 0x4004ea20, + 0x77a4: 0x4027de20, 0x77a5: 0x4004ec20, 0x77a6: 0x4004e620, 0x77a7: 0x4003d220, + 0x77a8: 0x4003f420, 0x77a9: 0x4003f620, 0x77aa: 0x4004d820, 0x77ab: 0x40093820, + 0x77ac: 0x40024020, 0x77ad: 0x40021a20, 0x77ae: 0x4002e420, 0x77af: 0x4004e220, + 0x77b0: 0x4029cc20, 0x77b1: 0x4029ce20, 0x77b2: 0x4029d020, 0x77b3: 0x4029d220, + 0x77b4: 0x4029d420, 0x77b5: 0x4029d620, 0x77b6: 0x4029d820, 0x77b7: 0x4029da20, + 0x77b8: 0x4029dc20, 0x77b9: 0x4029de20, 0x77ba: 0x40026c20, 0x77bb: 0x40026220, + 0x77bc: 0x40094020, 0x77bd: 0xc32f0851, 0x77be: 0x40094420, 0x77bf: 0x4002c420, + // Block 0x1df, offset 0x77c0 + 0x77c0: 0x4004d620, 0x77c1: 0xc35708b1, 0x77c2: 0x002c0a88, 0x77c3: 0xc33b08d1, + 0x77c4: 0xc35b08d1, 0x77c5: 0xc36008f1, 0x77c6: 0x002d0888, 0x77c7: 0x002d2288, + 0x77c8: 0x002d6888, 0x77c9: 0xc36508b1, 0x77ca: 0x002dcc88, 0x77cb: 0x002dfe88, + 0x77cc: 0xc0030002, 0x77cd: 0x002e8288, 0x77ce: 0xc36908d1, 0x77cf: 0xc34508b1, + 0x77d0: 0x002f2c88, 0x77d1: 0x002f5688, 0x77d2: 0xc36d08d1, 0x77d3: 0xc34908d1, + 0x77d4: 0xc37108d1, 0x77d5: 0xc3760921, 0x77d6: 0x0030be88, 0x77d7: 0x0030e288, + 0x77d8: 0x0030f688, 0x77d9: 0xc37b08b1, 0x77da: 0xc37f08d1, 0x77db: 0x4003f820, + 0x77dc: 0x4004e420, 0x77dd: 0x4003fa20, 0x77de: 0x40062420, 0x77df: 0x40021620, + 0x77e0: 0x40061e20, 0x77e1: 0xc35508b1, 0x77e2: 0x402c0a20, 0x77e3: 0xc33908d1, + 0x77e4: 0xc35908d1, 0x77e5: 0xc35d08f1, 0x77e6: 0x402d0820, 0x77e7: 0x402d2220, + 0x77e8: 0x402d6820, 0x77e9: 0xc36308b1, 0x77ea: 0x402dcc20, 0x77eb: 0x402dfe20, + 0x77ec: 0xc0000002, 0x77ed: 0x402e8220, 0x77ee: 0xc36708d1, 0x77ef: 0xc34308b1, + 0x77f0: 0x402f2c20, 0x77f1: 0x402f5620, 0x77f2: 0xc36b08d1, 0x77f3: 0xc34708d1, + 0x77f4: 0xc36f08d1, 0x77f5: 0xc3730921, 0x77f6: 0x4030be20, 0x77f7: 0x4030e220, + 0x77f8: 0x4030f620, 0x77f9: 0xc37908b1, 0x77fa: 0xc37d08d1, 0x77fb: 0x4003fc20, + 0x77fc: 0x40094820, 0x77fd: 0x4003fe20, 0x77fe: 0x40094c20, 0x77ff: 0xa0000000, + // Block 0x1e0, offset 0x7800 + 0x7800: 0xe00008f5, 0x7801: 0x002be083, 0x7802: 0xe0000921, 0x7803: 0xe0000969, + 0x7804: 0xe000095b, 0x7805: 0xe000094d, 0x7806: 0xe00009dd, 0x7807: 0xe0000a53, + 0x7808: 0xe0000ae8, 0x7809: 0x002c9a83, 0x780a: 0xe0000af4, 0x780b: 0xe0000b20, + 0x780c: 0xe0000c2b, 0x780d: 0x002d9c83, 0x780e: 0xe0000c37, 0x780f: 0xe0000c43, + 0x7810: 0xe0000ab3, 0x7811: 0xe0000d63, 0x7812: 0xe0000d9a, 0x7813: 0x002ee483, + 0x7814: 0xe0000da6, 0x7815: 0xe0000de6, 0x7816: 0xe0000dd2, 0x7817: 0x40093e20, + 0x7818: 0xe0000e12, 0x7819: 0xe0000fe1, 0x781a: 0x00306e83, 0x781b: 0xe0000fed, + 0x781c: 0xe0000fff, 0x781d: 0x00310283, 0x781e: 0x00318888, 0x781f: 0xe0000f7b, + 0x7820: 0xe00008f2, 0x7821: 0x402be020, 0x7822: 0xe000091e, 0x7823: 0xe0000966, + 0x7824: 0xe0000958, 0x7825: 0xe000094a, 0x7826: 0xe00009d5, 0x7827: 0xe0000a4d, + 0x7828: 0xe0000ae5, 0x7829: 0x402c9a20, 0x782a: 0xe0000af1, 0x782b: 0xe0000b1d, + 0x782c: 0xe0000c28, 0x782d: 0x402d9c20, 0x782e: 0xe0000c34, 0x782f: 0xe0000c40, + 0x7830: 0xe0000aad, 0x7831: 0xe0000d60, 0x7832: 0xe0000d97, 0x7833: 0x402ee420, + 0x7834: 0xe0000da3, 0x7835: 0xe0000de3, 0x7836: 0xe0000dcf, 0x7837: 0x40093c20, + 0x7838: 0xe0000e0f, 0x7839: 0xe0000fde, 0x783a: 0x40306e20, 0x783b: 0xe0000fea, + 0x783c: 0xe0000ffc, 0x783d: 0x40310220, 0x783e: 0x40318820, 0x783f: 0xe0001114, + // Block 0x1e1, offset 0x7840 + 0x7840: 0xe0000983, 0x7841: 0xe0000980, 0x7842: 0xe00008fb, 0x7843: 0xe00008f8, + 0x7844: 0xe000097d, 0x7845: 0xe000097a, 0x7846: 0xe0000a38, 0x7847: 0xe0000a35, + 0x7848: 0xe0000a3e, 0x7849: 0xe0000a3b, 0x784a: 0xe0000a4a, 0x784b: 0xe0000a47, + 0x784c: 0x002c3c83, 0x784d: 0x402c3c20, 0x784e: 0x002c6483, 0x784f: 0x402c6420, + 0x7850: 0xe0000aaa, 0x7851: 0xe0000aa7, 0x7852: 0xe0000b46, 0x7853: 0xe0000b43, + 0x7854: 0xe0000aee, 0x7855: 0xe0000aeb, 0x7856: 0xe0000b2c, 0x7857: 0xe0000b29, + 0x7858: 0xe0000b40, 0x7859: 0xe0000b3d, 0x785a: 0x002c9c83, 0x785b: 0x402c9c20, + 0x785c: 0xe0000bb8, 0x785d: 0xe0000bb5, 0x785e: 0xe0000bb2, 0x785f: 0xe0000baf, + 0x7860: 0xe0000bc4, 0x7861: 0xe0000bc1, 0x7862: 0xe0000bca, 0x7863: 0xe0000bc7, + 0x7864: 0xe0000bee, 0x7865: 0xe0000beb, 0x7866: 0xe0000c1b, 0x7867: 0xe0000c18, + 0x7868: 0xe0000c51, 0x7869: 0xe0000c4e, 0x786a: 0xe0000c60, 0x786b: 0xe0000c5d, + 0x786c: 0xe0000c31, 0x786d: 0xe0000c2e, 0x786e: 0xe0000c5a, 0x786f: 0xe0000c57, + 0x7870: 0xe0000c54, 0x7871: 0x402da220, 0x7872: 0xf0000a0a, 0x7873: 0xf0000404, + 0x7874: 0xe0000c8a, 0x7875: 0xe0000c87, 0x7876: 0xe0000c9f, 0x7877: 0xe0000c9c, + 0x7878: 0x402f7220, 0x7879: 0xe0000ccc, 0x787a: 0xe0000cc9, 0x787b: 0xe0000cd8, + 0x787c: 0xe0000cd5, 0x787d: 0xe0000cd2, 0x787e: 0xe0000ccf, 0x787f: 0xe0000d04, + // Block 0x1e2, offset 0x7880 + 0x7880: 0xe0000cfe, 0x7881: 0xe0000cf8, 0x7882: 0xe0000cf5, 0x7883: 0xe0000d51, + 0x7884: 0xe0000d4e, 0x7885: 0xe0000d6f, 0x7886: 0xe0000d6c, 0x7887: 0x002ea083, + 0x7888: 0x402ea020, 0x7889: 0xf0000404, 0x788a: 0x002eda88, 0x788b: 0x402eda20, + 0x788c: 0xe0000e2e, 0x788d: 0xe0000e2b, 0x788e: 0xe0000da0, 0x788f: 0xe0000d9d, + 0x7890: 0xe0000de0, 0x7891: 0xe0000ddd, 0x7892: 0xe0000e93, 0x7893: 0xe0000e8f, + 0x7894: 0xe0000eca, 0x7895: 0xe0000ec7, 0x7896: 0xe0000edc, 0x7897: 0xe0000ed9, + 0x7898: 0x002f7c83, 0x7899: 0x402f7c20, 0x789a: 0xe0000f1f, 0x789b: 0xe0000f1c, + 0x789c: 0xe0000f2d, 0x789d: 0xe0000f2a, 0x789e: 0xe0000f47, 0x789f: 0xe0000f44, + 0x78a0: 0x002fe883, 0x78a1: 0x402fe820, 0x78a2: 0xe0000f99, 0x78a3: 0xe0000f96, + 0x78a4: 0x00302e83, 0x78a5: 0x40302e20, 0x78a6: 0x00303688, 0x78a7: 0x40303620, + 0x78a8: 0xe000102b, 0x78a9: 0xe0001028, 0x78aa: 0xe000103f, 0x78ab: 0xe000103c, + 0x78ac: 0xe0000fe7, 0x78ad: 0xe0000fe4, 0x78ae: 0x00307083, 0x78af: 0x40307020, + 0x78b0: 0xe0001025, 0x78b1: 0xe0001022, 0x78b2: 0xe0001039, 0x78b3: 0xe0001036, + 0x78b4: 0xe00010d8, 0x78b5: 0xe00010d5, 0x78b6: 0xe000110e, 0x78b7: 0xe000110b, + 0x78b8: 0xe0001117, 0x78b9: 0xe000113b, 0x78ba: 0xe0001138, 0x78bb: 0xe000114d, + 0x78bc: 0xe000114a, 0x78bd: 0x00312c83, 0x78be: 0x40312c20, 0x78bf: 0xe0000f64, + // Block 0x1e3, offset 0x78c0 + 0x78c0: 0x40321220, 0x78c1: 0x40321a20, 0x78c2: 0x40322220, 0x78c3: 0x40322a20, + 0x78c4: 0xe0000ad5, 0x78c5: 0xe0000ad1, 0x78c6: 0xe0000acd, 0x78c7: 0xf0000a0a, + 0x78c8: 0xf000040a, 0x78c9: 0xf0000404, 0x78ca: 0xf0000a0a, 0x78cb: 0xf000040a, + 0x78cc: 0xf0000404, 0x78cd: 0xe0000947, 0x78ce: 0xe0000944, 0x78cf: 0xe0000c3d, + 0x78d0: 0xe0000c3a, 0x78d1: 0xe0000dcc, 0x78d2: 0xe0000dc9, 0x78d3: 0xe0000ff3, + 0x78d4: 0xe0000ff0, 0x78d5: 0xe000101e, 0x78d6: 0xe000101a, 0x78d7: 0xe0002658, + 0x78d8: 0xe0002655, 0x78d9: 0xe0001016, 0x78da: 0xe0001012, 0x78db: 0xe000100e, + 0x78dc: 0xe000100a, 0x78dd: 0x402cae20, 0x78de: 0xe0000962, 0x78df: 0xe000095e, + 0x78e0: 0xe0000976, 0x78e1: 0xe0000972, 0x78e2: 0xe00009f4, 0x78e3: 0xe00009ef, + 0x78e4: 0x002d3a88, 0x78e5: 0x402d3a20, 0x78e6: 0xe0000bbe, 0x78e7: 0xe0000bbb, + 0x78e8: 0xe0000c99, 0x78e9: 0xe0000c96, 0x78ea: 0xe0000e20, 0x78eb: 0xe0000e1d, + 0x78ec: 0xe0000e27, 0x78ed: 0xe0000e23, 0x78ee: 0xe0001162, 0x78ef: 0xe000115f, + 0x78f0: 0xe0000c8d, 0x78f1: 0xf0000a0a, 0x78f2: 0xf000040a, 0x78f3: 0xf0000404, + 0x78f4: 0xe0000bac, 0x78f5: 0xe0000ba9, 0x78f6: 0x002d7888, 0x78f7: 0x00319488, + 0x78f8: 0xe0000d57, 0x78f9: 0xe0000d54, 0x78fa: 0xe000262e, 0x78fb: 0xe000262b, + 0x78fc: 0xe00009ea, 0x78fd: 0xe00009e5, 0x78fe: 0xe0000e19, 0x78ff: 0xe0000e15, + // Block 0x1e4, offset 0x7900 + 0x7900: 0xe00009b1, 0x7901: 0xe00009ae, 0x7902: 0xe0000a22, 0x7903: 0xe0000a1f, + 0x7904: 0xe0000a28, 0x7905: 0xe0000a25, 0x7906: 0xe0000a2e, 0x7907: 0xe0000a2b, + 0x7908: 0xe0000a5a, 0x7909: 0xe0000a56, 0x790a: 0xe0000a8c, 0x790b: 0xe0000a89, + 0x790c: 0xe0000a98, 0x790d: 0xe0000a95, 0x790e: 0xe0000aa4, 0x790f: 0xe0000aa1, + 0x7910: 0xe0000a92, 0x7911: 0xe0000a8f, 0x7912: 0xe0000a9e, 0x7913: 0xe0000a9b, + 0x7914: 0xe0000b55, 0x7915: 0xe0000b51, 0x7916: 0xe000263a, 0x7917: 0xe0002637, + 0x7918: 0xe0000b7c, 0x7919: 0xe0000b79, 0x791a: 0xe0000b82, 0x791b: 0xe0000b7f, + 0x791c: 0xe0000b39, 0x791d: 0xe0000b35, 0x791e: 0xe0000b8c, 0x791f: 0xe0000b89, + 0x7920: 0xe0000bd0, 0x7921: 0xe0000bcd, 0x7922: 0xe0000c00, 0x7923: 0xe0000bfd, + 0x7924: 0xe0000c0c, 0x7925: 0xe0000c09, 0x7926: 0xe0000bfa, 0x7927: 0xe0000bf7, + 0x7928: 0xe0000c06, 0x7929: 0xe0000c03, 0x792a: 0xe0000c12, 0x792b: 0xe0000c0f, + 0x792c: 0xe0000c7e, 0x792d: 0xe0000c7b, 0x792e: 0xe0002640, 0x792f: 0xe000263d, + 0x7930: 0xe0000c93, 0x7931: 0xe0000c90, 0x7932: 0xe0000cab, 0x7933: 0xe0000ca8, + 0x7934: 0xe0000cb1, 0x7935: 0xe0000cae, 0x7936: 0xe0000cde, 0x7937: 0xe0000cdb, + 0x7938: 0xe0000ce5, 0x7939: 0xe0000ce1, 0x793a: 0xe0000cf2, 0x793b: 0xe0000cef, + 0x793c: 0xe0000cec, 0x793d: 0xe0000ce9, 0x793e: 0xe0000d1e, 0x793f: 0xe0000d1b, + // Block 0x1e5, offset 0x7940 + 0x7940: 0xe0000d24, 0x7941: 0xe0000d21, 0x7942: 0xe0000d2a, 0x7943: 0xe0000d27, + 0x7944: 0xe0000d69, 0x7945: 0xe0000d66, 0x7946: 0xe0000d7b, 0x7947: 0xe0000d78, + 0x7948: 0xe0000d87, 0x7949: 0xe0000d84, 0x794a: 0xe0000d81, 0x794b: 0xe0000d7e, + 0x794c: 0xe00025e9, 0x794d: 0xe00025e6, 0x794e: 0xe0000df5, 0x794f: 0xe0000df1, + 0x7950: 0xe0000e3d, 0x7951: 0xe0000e39, 0x7952: 0xe00025ef, 0x7953: 0xe00025ec, + 0x7954: 0xe0000ea7, 0x7955: 0xe0000ea4, 0x7956: 0xe0000ead, 0x7957: 0xe0000eaa, + 0x7958: 0xe0000ed6, 0x7959: 0xe0000ed3, 0x795a: 0xe0000ef4, 0x795b: 0xe0000ef1, + 0x795c: 0xe0000efb, 0x795d: 0xe0000ef7, 0x795e: 0xe0000f02, 0x795f: 0xe0000eff, + 0x7960: 0xe0000f41, 0x7961: 0xe0000f3e, 0x7962: 0xe0000f53, 0x7963: 0xe0000f50, + 0x7964: 0xe0000f26, 0x7965: 0xe0000f22, 0x7966: 0xe0002652, 0x7967: 0xe000264f, + 0x7968: 0xe0000f5a, 0x7969: 0xe0000f56, 0x796a: 0xe0000f93, 0x796b: 0xe0000f90, + 0x796c: 0xe0000f9f, 0x796d: 0xe0000f9c, 0x796e: 0xe0000fb1, 0x796f: 0xe0000fae, + 0x7970: 0xe0000fab, 0x7971: 0xe0000fa8, 0x7972: 0xe0001093, 0x7973: 0xe0001090, + 0x7974: 0xe000109f, 0x7975: 0xe000109c, 0x7976: 0xe0001099, 0x7977: 0xe0001096, + 0x7978: 0xe000265e, 0x7979: 0xe000265b, 0x797a: 0xe0001046, 0x797b: 0xe0001042, + 0x797c: 0xe00010a9, 0x797d: 0xe00010a6, 0x797e: 0xe00010af, 0x797f: 0xe00010ac, + // Block 0x1e6, offset 0x7980 + 0x7980: 0xe00010d2, 0x7981: 0xe00010cf, 0x7982: 0xe00010cc, 0x7983: 0xe00010c9, + 0x7984: 0xe00010e1, 0x7985: 0xe00010de, 0x7986: 0xe00010e7, 0x7987: 0xe00010e4, + 0x7988: 0xe00010ed, 0x7989: 0xe00010ea, 0x798a: 0xe00010fc, 0x798b: 0xe00010f9, + 0x798c: 0xe00010f6, 0x798d: 0xe00010f3, 0x798e: 0xe0001123, 0x798f: 0xe0001120, + 0x7990: 0xe0001141, 0x7991: 0xe000113e, 0x7992: 0xe0001153, 0x7993: 0xe0001150, + 0x7994: 0xe0001159, 0x7995: 0xe0001156, 0x7996: 0xe0000c15, 0x7997: 0xe0000f8d, + 0x7998: 0xe00010db, 0x7999: 0xe0001111, 0x799a: 0xf0000404, 0x799b: 0xe0000f70, + 0x799c: 0x40300420, 0x799d: 0x40300620, 0x799e: 0xe0000f7f, 0x799f: 0x402c9620, + 0x79a0: 0xe000099b, 0x79a1: 0xe0000998, 0x79a2: 0xe0000989, 0x79a3: 0xe0000986, + 0x79a4: 0xe0002628, 0x79a5: 0xe0002625, 0x79a6: 0xe0000930, 0x79a7: 0xe000092c, + 0x79a8: 0xe0000940, 0x79a9: 0xe000093c, 0x79aa: 0xe0000938, 0x79ab: 0xe0000934, + 0x79ac: 0xe00009aa, 0x79ad: 0xe00009a6, 0x79ae: 0xe0002622, 0x79af: 0xe000261f, + 0x79b0: 0xe000090a, 0x79b1: 0xe0000906, 0x79b2: 0xe000091a, 0x79b3: 0xe0000916, + 0x79b4: 0xe0000912, 0x79b5: 0xe000090e, 0x79b6: 0xe00009a2, 0x79b7: 0xe000099e, + 0x79b8: 0xe0000b6e, 0x79b9: 0xe0000b6b, 0x79ba: 0xe0000b5c, 0x79bb: 0xe0000b59, + 0x79bc: 0xe0000b26, 0x79bd: 0xe0000b23, 0x79be: 0xe0002634, 0x79bf: 0xe0002631, + // Block 0x1e7, offset 0x79c0 + 0x79c0: 0xe0000b03, 0x79c1: 0xe0000aff, 0x79c2: 0xe0000b13, 0x79c3: 0xe0000b0f, + 0x79c4: 0xe0000b0b, 0x79c5: 0xe0000b07, 0x79c6: 0xe0000b75, 0x79c7: 0xe0000b71, + 0x79c8: 0xe0000c66, 0x79c9: 0xe0000c63, 0x79ca: 0xe0000c78, 0x79cb: 0xe0000c75, + 0x79cc: 0xe0000e84, 0x79cd: 0xe0000e81, 0x79ce: 0xe0000e44, 0x79cf: 0xe0000e41, + 0x79d0: 0xe0002646, 0x79d1: 0xe0002643, 0x79d2: 0xe0000db5, 0x79d3: 0xe0000db1, + 0x79d4: 0xe0000dc5, 0x79d5: 0xe0000dc1, 0x79d6: 0xe0000dbd, 0x79d7: 0xe0000db9, + 0x79d8: 0xe0000e8b, 0x79d9: 0xe0000e87, 0x79da: 0xe000264c, 0x79db: 0xe0002649, + 0x79dc: 0xe0000e65, 0x79dd: 0xe0000e61, 0x79de: 0xe0000e75, 0x79df: 0xe0000e71, + 0x79e0: 0xe0000e6d, 0x79e1: 0xe0000e69, 0x79e2: 0xe0000e7d, 0x79e3: 0xe0000e79, + 0x79e4: 0xe000108d, 0x79e5: 0xe000108a, 0x79e6: 0xe000104d, 0x79e7: 0xe000104a, + 0x79e8: 0xe0002664, 0x79e9: 0xe0002661, 0x79ea: 0xe000106e, 0x79eb: 0xe000106a, + 0x79ec: 0xe000107e, 0x79ed: 0xe000107a, 0x79ee: 0xe0001076, 0x79ef: 0xe0001072, + 0x79f0: 0xe0001086, 0x79f1: 0xe0001082, 0x79f2: 0xe0001108, 0x79f3: 0xe0001105, + 0x79f4: 0xe0001135, 0x79f5: 0xe0001132, 0x79f6: 0xe000112f, 0x79f7: 0xe000112c, + 0x79f8: 0xe000111d, 0x79f9: 0xe000111a, 0x79fa: 0xe0000d0a, 0x79fb: 0xe0000d07, + 0x79fc: 0x0030d888, 0x79fd: 0x4030d820, 0x79fe: 0x00312088, 0x79ff: 0x40312020, + // Block 0x1e8, offset 0x7a00 + 0x7a00: 0xa0000000, 0x7a01: 0xa0000000, 0x7a02: 0xa0000000, 0x7a03: 0xa0000000, + 0x7a04: 0xa0000000, 0x7a05: 0xa0000000, 0x7a06: 0xa0000000, 0x7a07: 0xa0000000, + 0x7a08: 0xa0000000, 0x7a09: 0x40020020, 0x7a0a: 0x40020220, 0x7a0b: 0x40020420, + 0x7a0c: 0x40020620, 0x7a0d: 0x40020820, 0x7a0e: 0xa0000000, 0x7a0f: 0xa0000000, + 0x7a10: 0xa0000000, 0x7a11: 0xa0000000, 0x7a12: 0xa0000000, 0x7a13: 0xa0000000, + 0x7a14: 0xa0000000, 0x7a15: 0xa0000000, 0x7a16: 0xa0000000, 0x7a17: 0xa0000000, + 0x7a18: 0xa0000000, 0x7a19: 0xa0000000, 0x7a1a: 0xa0000000, 0x7a1b: 0xa0000000, + 0x7a1c: 0xa0000000, 0x7a1d: 0xa0000000, 0x7a1e: 0xa0000000, 0x7a1f: 0xa0000000, + 0x7a20: 0x40021220, 0x7a21: 0x4002ba20, 0x7a22: 0x4003e020, 0x7a23: 0x4004ea20, + 0x7a24: 0x4027de20, 0x7a25: 0x4004ec20, 0x7a26: 0x4004e620, 0x7a27: 0x4003d220, + 0x7a28: 0x4003f420, 0x7a29: 0x4003f620, 0x7a2a: 0x4004d820, 0x7a2b: 0x40093820, + 0x7a2c: 0x40024020, 0x7a2d: 0x40021a20, 0x7a2e: 0x4002e420, 0x7a2f: 0x4004e220, + 0x7a30: 0x4029cc20, 0x7a31: 0x4029ce20, 0x7a32: 0x4029d020, 0x7a33: 0x4029d220, + 0x7a34: 0x4029d420, 0x7a35: 0x4029d620, 0x7a36: 0x4029d820, 0x7a37: 0x4029da20, + 0x7a38: 0x4029dc20, 0x7a39: 0x4029de20, 0x7a3a: 0x40026c20, 0x7a3b: 0x40026220, + 0x7a3c: 0x40094020, 0x7a3d: 0xc32f0851, 0x7a3e: 0x40094420, 0x7a3f: 0x4002c420, + // Block 0x1e9, offset 0x7a40 + 0x7a40: 0x4004d620, 0x7a41: 0xc38b09c3, 0x7a42: 0x002c0a88, 0x7a43: 0x002c3a88, + 0x7a44: 0x002c6288, 0x7a45: 0xc3920a11, 0x7a46: 0x002d0888, 0x7a47: 0x002d2288, + 0x7a48: 0x002d6888, 0x7a49: 0x002d9a88, 0x7a4a: 0x002dcc88, 0x7a4b: 0x002dfe88, + 0x7a4c: 0xc0030002, 0x7a4d: 0x002e8288, 0x7a4e: 0x002e9e88, 0x7a4f: 0xc3970951, + 0x7a50: 0x002f2c88, 0x7a51: 0x002f5688, 0x7a52: 0x002f7a88, 0x7a53: 0x002fe688, + 0x7a54: 0x00302c88, 0x7a55: 0xc3840951, 0x7a56: 0x0030be88, 0x7a57: 0x0030e288, + 0x7a58: 0x0030f688, 0x7a59: 0x00310088, 0x7a5a: 0x00312a88, 0x7a5b: 0x4003f820, + 0x7a5c: 0x4004e420, 0x7a5d: 0x4003fa20, 0x7a5e: 0x40062420, 0x7a5f: 0x40021620, + 0x7a60: 0x40061e20, 0x7a61: 0xc3870982, 0x7a62: 0x402c0a20, 0x7a63: 0x402c3a20, + 0x7a64: 0x402c6220, 0x7a65: 0xc3900a11, 0x7a66: 0x402d0820, 0x7a67: 0x402d2220, + 0x7a68: 0x402d6820, 0x7a69: 0x402d9a20, 0x7a6a: 0x402dcc20, 0x7a6b: 0x402dfe20, + 0x7a6c: 0xc0000002, 0x7a6d: 0x402e8220, 0x7a6e: 0x402e9e20, 0x7a6f: 0xc3940951, + 0x7a70: 0x402f2c20, 0x7a71: 0x402f5620, 0x7a72: 0x402f7a20, 0x7a73: 0x402fe620, + 0x7a74: 0x40302c20, 0x7a75: 0xc3810951, 0x7a76: 0x4030be20, 0x7a77: 0x4030e220, + 0x7a78: 0x4030f620, 0x7a79: 0x40310020, 0x7a7a: 0x40312a20, 0x7a7b: 0x4003fc20, + 0x7a7c: 0x40094820, 0x7a7d: 0x4003fe20, 0x7a7e: 0x40094c20, 0x7a7f: 0xa0000000, + // Block 0x1ea, offset 0x7a80 + 0x7a80: 0xe00008f5, 0x7a81: 0xe00008ef, 0x7a82: 0xe0000921, 0x7a83: 0xe0000969, + 0x7a84: 0x00320ca3, 0x7a85: 0x00321083, 0x7a86: 0x00320c83, 0x7a87: 0xe0000a53, + 0x7a88: 0xe0000ae8, 0x7a89: 0xe0000ae2, 0x7a8a: 0xe0000af4, 0x7a8b: 0xe0000b20, + 0x7a8c: 0xe0000c2b, 0x7a8d: 0xe0000c25, 0x7a8e: 0xe0000c37, 0x7a8f: 0xe0000c43, + 0x7a90: 0x002c62c3, 0x7a91: 0xe0000d63, 0x7a92: 0xe0000d9a, 0x7a93: 0xe0000d94, + 0x7a94: 0xe0000da6, 0x7a95: 0xe0000de6, 0x7a96: 0x00320ea3, 0x7a97: 0x40093e20, + 0x7a98: 0x00320e83, 0x7a99: 0xe0000fe1, 0x7a9a: 0xe0000fdb, 0x7a9b: 0xe0000fed, + 0x7a9c: 0x003100a3, 0x7a9d: 0xe0001102, 0x7a9e: 0xe000266d, 0x7a9f: 0xe0000f7b, + 0x7aa0: 0xe00008f2, 0x7aa1: 0xe00008ec, 0x7aa2: 0xe000091e, 0x7aa3: 0xe0000966, + 0x7aa4: 0x40320c21, 0x7aa5: 0x40321020, 0x7aa6: 0x40320c20, 0x7aa7: 0xe0000a4d, + 0x7aa8: 0xe0000ae5, 0x7aa9: 0xe0000adf, 0x7aaa: 0xe0000af1, 0x7aab: 0xe0000b1d, + 0x7aac: 0xe0000c28, 0x7aad: 0xe0000c22, 0x7aae: 0xe0000c34, 0x7aaf: 0xe0000c40, + 0x7ab0: 0x402c6222, 0x7ab1: 0xe0000d60, 0x7ab2: 0xe0000d97, 0x7ab3: 0xe0000d91, + 0x7ab4: 0xe0000da3, 0x7ab5: 0xe0000de3, 0x7ab6: 0x40320e21, 0x7ab7: 0x40093c20, + 0x7ab8: 0x40320e20, 0x7ab9: 0xe0000fde, 0x7aba: 0xe0000fd8, 0x7abb: 0xe0000fea, + 0x7abc: 0x40310021, 0x7abd: 0xe00010ff, 0x7abe: 0xe000266a, 0x7abf: 0xe0001114, + // Block 0x1eb, offset 0x7ac0 + 0x7ac0: 0xe0000983, 0x7ac1: 0xe0000980, 0x7ac2: 0xe00008fb, 0x7ac3: 0xe00008f8, + 0x7ac4: 0xe000097d, 0x7ac5: 0xe000097a, 0x7ac6: 0xe0000a38, 0x7ac7: 0xe0000a35, + 0x7ac8: 0xe0000a3e, 0x7ac9: 0xe0000a3b, 0x7aca: 0xe0000a4a, 0x7acb: 0xe0000a47, + 0x7acc: 0xe0000a44, 0x7acd: 0xe0000a41, 0x7ace: 0xe0000a86, 0x7acf: 0xe0000a83, + 0x7ad0: 0x002c62a3, 0x7ad1: 0x402c6221, 0x7ad2: 0xe0000b46, 0x7ad3: 0xe0000b43, + 0x7ad4: 0xe0000aee, 0x7ad5: 0xe0000aeb, 0x7ad6: 0xe0000b2c, 0x7ad7: 0xe0000b29, + 0x7ad8: 0x00320cc3, 0x7ad9: 0x40320c22, 0x7ada: 0xe0000b1a, 0x7adb: 0xe0000b17, + 0x7adc: 0xe0000bb8, 0x7add: 0xe0000bb5, 0x7ade: 0xe0000bb2, 0x7adf: 0xe0000baf, + 0x7ae0: 0xe0000bc4, 0x7ae1: 0xe0000bc1, 0x7ae2: 0xe0000bca, 0x7ae3: 0xe0000bc7, + 0x7ae4: 0xe0000bee, 0x7ae5: 0xe0000beb, 0x7ae6: 0xe0000c1b, 0x7ae7: 0xe0000c18, + 0x7ae8: 0xe0000c51, 0x7ae9: 0xe0000c4e, 0x7aea: 0xe0000c60, 0x7aeb: 0xe0000c5d, + 0x7aec: 0xe0000c31, 0x7aed: 0xe0000c2e, 0x7aee: 0xe0000c5a, 0x7aef: 0xe0000c57, + 0x7af0: 0xe0000c54, 0x7af1: 0x402da220, 0x7af2: 0xf0000a0a, 0x7af3: 0xf0000404, + 0x7af4: 0xe0000c8a, 0x7af5: 0xe0000c87, 0x7af6: 0xe0000c9f, 0x7af7: 0xe0000c9c, + 0x7af8: 0x402f7220, 0x7af9: 0xe0000ccc, 0x7afa: 0xe0000cc9, 0x7afb: 0xe0000cd8, + 0x7afc: 0xe0000cd5, 0x7afd: 0xe0000cd2, 0x7afe: 0xe0000ccf, 0x7aff: 0xe0000d04, + // Block 0x1ec, offset 0x7b00 + 0x7b00: 0xe0000cfe, 0x7b01: 0xe0000cf8, 0x7b02: 0xe0000cf5, 0x7b03: 0xe0000d51, + 0x7b04: 0xe0000d4e, 0x7b05: 0xe0000d6f, 0x7b06: 0xe0000d6c, 0x7b07: 0xe0000d5d, + 0x7b08: 0xe0000d5a, 0x7b09: 0xf0000404, 0x7b0a: 0x002eda88, 0x7b0b: 0x402eda20, + 0x7b0c: 0xe0000e2e, 0x7b0d: 0xe0000e2b, 0x7b0e: 0xe0000da0, 0x7b0f: 0xe0000d9d, + 0x7b10: 0x00320ec3, 0x7b11: 0x40320e22, 0x7b12: 0x00320ee3, 0x7b13: 0x40320e23, + 0x7b14: 0xe0000eca, 0x7b15: 0xe0000ec7, 0x7b16: 0xe0000edc, 0x7b17: 0xe0000ed9, + 0x7b18: 0xe0000ed0, 0x7b19: 0xe0000ecd, 0x7b1a: 0xe0000f1f, 0x7b1b: 0xe0000f1c, + 0x7b1c: 0xe0000f2d, 0x7b1d: 0xe0000f2a, 0x7b1e: 0xe0000f47, 0x7b1f: 0xe0000f44, + 0x7b20: 0xe0000f33, 0x7b21: 0xe0000f30, 0x7b22: 0xe0000f99, 0x7b23: 0xe0000f96, + 0x7b24: 0xe0000f8a, 0x7b25: 0xe0000f87, 0x7b26: 0x00303688, 0x7b27: 0x40303620, + 0x7b28: 0xe000102b, 0x7b29: 0xe0001028, 0x7b2a: 0xe000103f, 0x7b2b: 0xe000103c, + 0x7b2c: 0xe0000fe7, 0x7b2d: 0xe0000fe4, 0x7b2e: 0xe0000ff9, 0x7b2f: 0xe0000ff6, + 0x7b30: 0x003100c3, 0x7b31: 0x40310022, 0x7b32: 0xe0001039, 0x7b33: 0xe0001036, + 0x7b34: 0xe00010d8, 0x7b35: 0xe00010d5, 0x7b36: 0xe000110e, 0x7b37: 0xe000110b, + 0x7b38: 0xe0001117, 0x7b39: 0xe000113b, 0x7b3a: 0xe0001138, 0x7b3b: 0xe000114d, + 0x7b3c: 0xe000114a, 0x7b3d: 0xe0001147, 0x7b3e: 0xe0001144, 0x7b3f: 0xe0000f64, + // Block 0x1ed, offset 0x7b40 + 0x7b40: 0x40321220, 0x7b41: 0x40321a20, 0x7b42: 0x40322220, 0x7b43: 0x40322a20, + 0x7b44: 0xe0000ad5, 0x7b45: 0xe0000ad1, 0x7b46: 0xe0000acd, 0x7b47: 0xf0000a0a, + 0x7b48: 0xf000040a, 0x7b49: 0xf0000404, 0x7b4a: 0xf0000a0a, 0x7b4b: 0xf000040a, + 0x7b4c: 0xf0000404, 0x7b4d: 0xe0000947, 0x7b4e: 0xe0000944, 0x7b4f: 0xe0000c3d, + 0x7b50: 0xe0000c3a, 0x7b51: 0xe0000dcc, 0x7b52: 0xe0000dc9, 0x7b53: 0xe0000ff3, + 0x7b54: 0xe0000ff0, 0x7b55: 0xe0002685, 0x7b56: 0xe0002682, 0x7b57: 0xe0002673, + 0x7b58: 0xe0002670, 0x7b59: 0xe000267f, 0x7b5a: 0xe000267c, 0x7b5b: 0xe0002679, + 0x7b5c: 0xe0002676, 0x7b5d: 0x402cae20, 0x7b5e: 0xe0002697, 0x7b5f: 0xe0002694, + 0x7b60: 0xe0000976, 0x7b61: 0xe0000972, 0x7b62: 0xe0002691, 0x7b63: 0xe000268e, + 0x7b64: 0x002d3a88, 0x7b65: 0x402d3a20, 0x7b66: 0xe0000bbe, 0x7b67: 0xe0000bbb, + 0x7b68: 0xe0000c99, 0x7b69: 0xe0000c96, 0x7b6a: 0xe0000e20, 0x7b6b: 0xe0000e1d, + 0x7b6c: 0xe0000e27, 0x7b6d: 0xe0000e23, 0x7b6e: 0xe0001162, 0x7b6f: 0xe000115f, + 0x7b70: 0xe0000c8d, 0x7b71: 0xf0000a0a, 0x7b72: 0xf000040a, 0x7b73: 0xf0000404, + 0x7b74: 0xe0000bac, 0x7b75: 0xe0000ba9, 0x7b76: 0x002d7888, 0x7b77: 0x00319488, + 0x7b78: 0xe0000d57, 0x7b79: 0xe0000d54, 0x7b7a: 0xe00026af, 0x7b7b: 0xe00026ac, + 0x7b7c: 0xe000268b, 0x7b7d: 0xe0002688, 0x7b7e: 0xe000269d, 0x7b7f: 0xe000269a, + // Block 0x1ee, offset 0x7b80 + 0x7b80: 0xe000098f, 0x7b81: 0xe000098c, 0x7b82: 0xe0000995, 0x7b83: 0xe0000992, + 0x7b84: 0xe0000b62, 0x7b85: 0xe0000b5f, 0x7b86: 0xe0000b68, 0x7b87: 0xe0000b65, + 0x7b88: 0xe0000c6c, 0x7b89: 0xe0000c69, 0x7b8a: 0xe0000c72, 0x7b8b: 0xe0000c6f, + 0x7b8c: 0xe0000e4a, 0x7b8d: 0xe0000e47, 0x7b8e: 0xe0000e50, 0x7b8f: 0xe0000e4d, + 0x7b90: 0xe0000ee8, 0x7b91: 0xe0000ee5, 0x7b92: 0xe0000eee, 0x7b93: 0xe0000eeb, + 0x7b94: 0xe0001053, 0x7b95: 0xe0001050, 0x7b96: 0xe0001059, 0x7b97: 0xe0001056, + 0x7b98: 0xe0000f61, 0x7b99: 0xe0000f5e, 0x7b9a: 0xe0000fa5, 0x7b9b: 0xe0000fa2, + 0x7b9c: 0x00312288, 0x7b9d: 0x40312220, 0x7b9e: 0xe0000bf4, 0x7b9f: 0xe0000bf1, + 0x7ba0: 0x002ebc88, 0x7ba1: 0x402c8c20, 0x7ba2: 0x002f2288, 0x7ba3: 0x402f2220, + 0x7ba4: 0x00314088, 0x7ba5: 0x40314020, 0x7ba6: 0xe000096f, 0x7ba7: 0xe000096c, + 0x7ba8: 0xe0000b32, 0x7ba9: 0xe0000b2f, 0x7baa: 0xe00026a9, 0x7bab: 0xe00026a6, + 0x7bac: 0xe0000dfd, 0x7bad: 0xe0000df9, 0x7bae: 0xe0000e04, 0x7baf: 0xe0000e01, + 0x7bb0: 0xe0000e0b, 0x7bb1: 0xe0000e07, 0x7bb2: 0xe0001129, 0x7bb3: 0xe0001126, + 0x7bb4: 0x402e5e20, 0x7bb5: 0x402ed020, 0x7bb6: 0x40305a20, 0x7bb7: 0x402dd420, + 0x7bb8: 0xe0000abf, 0x7bb9: 0xe0000ec4, 0x7bba: 0x002be888, 0x7bbb: 0x002c4488, + 0x7bbc: 0x402c4420, 0x7bbd: 0x002e3888, 0x7bbe: 0x00303e88, 0x7bbf: 0x402ffc20, + // Block 0x1ef, offset 0x7bc0 + 0x7bc0: 0x402c2820, 0x7bc1: 0x402c7020, 0x7bc2: 0x402d1420, 0x7bc3: 0x402d4220, + 0x7bc4: 0x402e0820, 0x7bc5: 0x402e5220, 0x7bc6: 0x402e8e20, 0x7bc7: 0x402ec620, + 0x7bc8: 0x402f3c20, 0x7bc9: 0x402faa20, 0x7bca: 0x402ff220, 0x7bcb: 0x40301020, + 0x7bcc: 0x4030ca20, 0x7bcd: 0x4030fe20, 0x7bce: 0x40313e20, 0x7bcf: 0x402bea20, + 0x7bd0: 0x402c0020, 0x7bd1: 0x402c8220, 0x7bd2: 0x402caa20, 0x7bd3: 0x402cca20, + 0x7bd4: 0x402ce420, 0x7bd5: 0x402cc020, 0x7bd6: 0x402dc020, 0x7bd7: 0x402f0620, + 0x7bd8: 0x40302220, 0x7bd9: 0x40308620, 0x7bda: 0x40317620, 0x7bdb: 0x002c0294, + 0x7bdc: 0x002c3a94, 0x7bdd: 0x002c5694, 0x7bde: 0xe0002667, 0x7bdf: 0x002cdc94, + 0x7be0: 0x002d0894, 0x7be1: 0x002dee94, 0x7be2: 0x002d2a94, 0x7be3: 0x00308894, + 0x7be4: 0x002db694, 0x7be5: 0x002dc294, 0x7be6: 0x002daa94, 0x7be7: 0x002dbe94, + 0x7be8: 0x002de694, 0x7be9: 0x002e5494, 0x7bea: 0x002e5294, 0x7beb: 0x002e2a94, + 0x7bec: 0x002e9094, 0x7bed: 0x0030ac94, 0x7bee: 0x002eb494, 0x7bef: 0x002ec894, + 0x7bf0: 0x002ea694, 0x7bf1: 0x002f1094, 0x7bf2: 0x002f4c94, 0x7bf3: 0x002ff494, + 0x7bf4: 0x00300894, 0x7bf5: 0x00304294, 0x7bf6: 0x00307c94, 0x7bf7: 0x0030b494, + 0x7bf8: 0x00307494, 0x7bf9: 0x0030cc94, 0x7bfa: 0x0030da94, 0x7bfb: 0x00312a94, + 0x7bfc: 0x00314894, 0x7bfd: 0x00315094, 0x7bfe: 0x00316494, 0x7bff: 0x00326a94, + // Block 0x1f0, offset 0x7c00 + 0x7c00: 0xe0000d24, 0x7c01: 0xe0000d21, 0x7c02: 0xe0000d2a, 0x7c03: 0xe0000d27, + 0x7c04: 0xe0000d69, 0x7c05: 0xe0000d66, 0x7c06: 0xe0000d7b, 0x7c07: 0xe0000d78, + 0x7c08: 0xe0000d87, 0x7c09: 0xe0000d84, 0x7c0a: 0xe0000d81, 0x7c0b: 0xe0000d7e, + 0x7c0c: 0xe0000ded, 0x7c0d: 0xe0000de9, 0x7c0e: 0xe00026a3, 0x7c0f: 0xe00026a0, + 0x7c10: 0xe0000e3d, 0x7c11: 0xe0000e39, 0x7c12: 0xe0000e35, 0x7c13: 0xe0000e31, + 0x7c14: 0xe0000ea7, 0x7c15: 0xe0000ea4, 0x7c16: 0xe0000ead, 0x7c17: 0xe0000eaa, + 0x7c18: 0xe0000ed6, 0x7c19: 0xe0000ed3, 0x7c1a: 0xe0000ef4, 0x7c1b: 0xe0000ef1, + 0x7c1c: 0xe0000efb, 0x7c1d: 0xe0000ef7, 0x7c1e: 0xe0000f02, 0x7c1f: 0xe0000eff, + 0x7c20: 0xe0000f41, 0x7c21: 0xe0000f3e, 0x7c22: 0xe0000f53, 0x7c23: 0xe0000f50, + 0x7c24: 0xe0000f26, 0x7c25: 0xe0000f22, 0x7c26: 0xe0000f3a, 0x7c27: 0xe0000f36, + 0x7c28: 0xe0000f5a, 0x7c29: 0xe0000f56, 0x7c2a: 0xe0000f93, 0x7c2b: 0xe0000f90, + 0x7c2c: 0xe0000f9f, 0x7c2d: 0xe0000f9c, 0x7c2e: 0xe0000fb1, 0x7c2f: 0xe0000fae, + 0x7c30: 0xe0000fab, 0x7c31: 0xe0000fa8, 0x7c32: 0xe0001093, 0x7c33: 0xe0001090, + 0x7c34: 0xe000109f, 0x7c35: 0xe000109c, 0x7c36: 0xe0001099, 0x7c37: 0xe0001096, + 0x7c38: 0xe0001032, 0x7c39: 0xe000102e, 0x7c3a: 0xe0002685, 0x7c3b: 0xe0002682, + 0x7c3c: 0xe00010a9, 0x7c3d: 0xe00010a6, 0x7c3e: 0xe00010af, 0x7c3f: 0xe00010ac, + // Block 0x1f1, offset 0x7c40 + 0x7c40: 0xe00009bc, 0x7c41: 0xe00009c0, 0x7c42: 0x002c3a8b, 0x7c43: 0xf0000a04, + 0x7c44: 0x40081c20, 0x7c45: 0xe0000a5e, 0x7c46: 0xe0000a62, 0x7c47: 0x002cc28a, + 0x7c48: 0x40081e20, 0x7c49: 0xf0000a04, 0x7c4a: 0x002d2285, 0x7c4b: 0x002d688b, + 0x7c4c: 0x002d688b, 0x7c4d: 0x002d688b, 0x7c4e: 0x002d6885, 0x7c4f: 0xf0000202, + 0x7c50: 0x002d9a8b, 0x7c51: 0x002d9a8b, 0x7c52: 0x002e228b, 0x7c53: 0x002e2285, + 0x7c54: 0x40082020, 0x7c55: 0x002e9e8b, 0x7c56: 0xf000040a, 0x7c57: 0x40082220, + 0x7c58: 0x40082420, 0x7c59: 0x002f2c8b, 0x7c5a: 0x002f568b, 0x7c5b: 0x002f7a8b, + 0x7c5c: 0x002f7a8b, 0x7c5d: 0x002f7a8b, 0x7c5e: 0x40082620, 0x7c5f: 0x40082820, + 0x7c60: 0xf0001414, 0x7c61: 0xe0000fbd, 0x7c62: 0xf0001414, 0x7c63: 0x40082a20, + 0x7c64: 0x00312a8b, 0x7c65: 0x40082c20, 0x7c66: 0x0032a288, 0x7c67: 0x40082e20, + 0x7c68: 0x00312a8b, 0x7c69: 0x40083020, 0x7c6a: 0x002dfe88, 0x7c6b: 0x00321083, + 0x7c6c: 0x002c0a8b, 0x7c6d: 0x002c3a8b, 0x7c6e: 0x40083220, 0x7c6f: 0x002c9885, + 0x7c70: 0x002c988b, 0x7c71: 0x002d088b, 0x7c72: 0x002d1e88, 0x7c73: 0x002e828b, + 0x7c74: 0x002ee285, 0x7c75: 0x00389084, 0x7c76: 0x00389284, 0x7c77: 0x00389484, + 0x7c78: 0x00389684, 0x7c79: 0x002d9a85, 0x7c7a: 0x40083420, 0x7c7b: 0xe0000b95, + 0x7c7c: 0x00327e85, 0x7c7d: 0x00325685, 0x7c7e: 0x0032568b, 0x7c7f: 0x00327e8b, + // Block 0x1f2, offset 0x7c80 + 0x7c80: 0xa0000000, 0x7c81: 0xa0000000, 0x7c82: 0xa0000000, 0x7c83: 0xa0000000, + 0x7c84: 0xa0000000, 0x7c85: 0xa0000000, 0x7c86: 0xa0000000, 0x7c87: 0xa0000000, + 0x7c88: 0xa0000000, 0x7c89: 0x40020020, 0x7c8a: 0x40020220, 0x7c8b: 0x40020420, + 0x7c8c: 0x40020620, 0x7c8d: 0x40020820, 0x7c8e: 0xa0000000, 0x7c8f: 0xa0000000, + 0x7c90: 0xa0000000, 0x7c91: 0xa0000000, 0x7c92: 0xa0000000, 0x7c93: 0xa0000000, + 0x7c94: 0xa0000000, 0x7c95: 0xa0000000, 0x7c96: 0xa0000000, 0x7c97: 0xa0000000, + 0x7c98: 0xa0000000, 0x7c99: 0xa0000000, 0x7c9a: 0xa0000000, 0x7c9b: 0xa0000000, + 0x7c9c: 0xa0000000, 0x7c9d: 0xa0000000, 0x7c9e: 0xa0000000, 0x7c9f: 0xa0000000, + 0x7ca0: 0x40021220, 0x7ca1: 0x4002ba20, 0x7ca2: 0x4003e020, 0x7ca3: 0x4004ea20, + 0x7ca4: 0x4027de20, 0x7ca5: 0x4004ec20, 0x7ca6: 0x4004e620, 0x7ca7: 0x4003d220, + 0x7ca8: 0x4003f420, 0x7ca9: 0x4003f620, 0x7caa: 0x4004d820, 0x7cab: 0x40093820, + 0x7cac: 0x40024020, 0x7cad: 0x40021a20, 0x7cae: 0x4002e420, 0x7caf: 0x4004e220, + 0x7cb0: 0x4029cc20, 0x7cb1: 0x4029ce20, 0x7cb2: 0x4029d020, 0x7cb3: 0x4029d220, + 0x7cb4: 0x4029d420, 0x7cb5: 0x4029d620, 0x7cb6: 0x4029d820, 0x7cb7: 0x4029da20, + 0x7cb8: 0x4029dc20, 0x7cb9: 0x4029de20, 0x7cba: 0x40026c20, 0x7cbb: 0x40026220, + 0x7cbc: 0x40094020, 0x7cbd: 0xc32f0851, 0x7cbe: 0x40094420, 0x7cbf: 0x4002c420, + // Block 0x1f3, offset 0x7cc0 + 0x7cc0: 0x4004d620, 0x7cc1: 0xc39c0071, 0x7cc2: 0x002c0a88, 0x7cc3: 0x002c3a88, + 0x7cc4: 0x002c6288, 0x7cc5: 0x002c9888, 0x7cc6: 0x002d0888, 0x7cc7: 0x002d2288, + 0x7cc8: 0x002d6888, 0x7cc9: 0x002d9a88, 0x7cca: 0x002dcc88, 0x7ccb: 0x002dfe88, + 0x7ccc: 0xc0030002, 0x7ccd: 0x002e8288, 0x7cce: 0x002e9e88, 0x7ccf: 0xc3a00071, + 0x7cd0: 0x002f2c88, 0x7cd1: 0x002f5688, 0x7cd2: 0x002f7a88, 0x7cd3: 0x002fe688, + 0x7cd4: 0x00302c88, 0x7cd5: 0xc3a40071, 0x7cd6: 0x0030be88, 0x7cd7: 0x0030e288, + 0x7cd8: 0x0030f688, 0x7cd9: 0x00310088, 0x7cda: 0x00312a88, 0x7cdb: 0x4003f820, + 0x7cdc: 0x4004e420, 0x7cdd: 0x4003fa20, 0x7cde: 0x40062420, 0x7cdf: 0x40021620, + 0x7ce0: 0x40061e20, 0x7ce1: 0xc39a0071, 0x7ce2: 0x402c0a20, 0x7ce3: 0x402c3a20, + 0x7ce4: 0x402c6220, 0x7ce5: 0x402c9820, 0x7ce6: 0x402d0820, 0x7ce7: 0x402d2220, + 0x7ce8: 0x402d6820, 0x7ce9: 0x402d9a20, 0x7cea: 0x402dcc20, 0x7ceb: 0x402dfe20, + 0x7cec: 0xc0000002, 0x7ced: 0x402e8220, 0x7cee: 0x402e9e20, 0x7cef: 0xc39e0071, + 0x7cf0: 0x402f2c20, 0x7cf1: 0x402f5620, 0x7cf2: 0x402f7a20, 0x7cf3: 0x402fe620, + 0x7cf4: 0x40302c20, 0x7cf5: 0xc3a20071, 0x7cf6: 0x4030be20, 0x7cf7: 0x4030e220, + 0x7cf8: 0x4030f620, 0x7cf9: 0x40310020, 0x7cfa: 0x40312a20, 0x7cfb: 0x4003fc20, + 0x7cfc: 0x40094820, 0x7cfd: 0x4003fe20, 0x7cfe: 0x40094c20, 0x7cff: 0xa0000000, + // Block 0x1f4, offset 0x7d00 + 0x7d00: 0xe00008f5, 0x7d01: 0xe00008ef, 0x7d02: 0xe0000921, 0x7d03: 0xe0000969, + 0x7d04: 0xe00026b5, 0x7d05: 0xe000094d, 0x7d06: 0xe00009dd, 0x7d07: 0xe0000a53, + 0x7d08: 0xe0000ae8, 0x7d09: 0xe0000ae2, 0x7d0a: 0xe0000af4, 0x7d0b: 0xe0000b20, + 0x7d0c: 0xe0000c2b, 0x7d0d: 0xe0000c25, 0x7d0e: 0xe0000c37, 0x7d0f: 0xe0000c43, + 0x7d10: 0xe0000ab3, 0x7d11: 0xe0000d63, 0x7d12: 0xe0000d9a, 0x7d13: 0xe0000d94, + 0x7d14: 0xe0000da6, 0x7d15: 0xe0000de6, 0x7d16: 0xe00026c3, 0x7d17: 0x40093e20, + 0x7d18: 0xe0000e12, 0x7d19: 0xe0000fe1, 0x7d1a: 0xe0000fdb, 0x7d1b: 0xe0000fed, + 0x7d1c: 0xe00026d9, 0x7d1d: 0xe0001102, 0x7d1e: 0x00318888, 0x7d1f: 0xe0000f7b, + 0x7d20: 0xe00008f2, 0x7d21: 0xe00008ec, 0x7d22: 0xe000091e, 0x7d23: 0xe0000966, + 0x7d24: 0xe00026b2, 0x7d25: 0xe000094a, 0x7d26: 0xe00009d5, 0x7d27: 0xe0000a4d, + 0x7d28: 0xe0000ae5, 0x7d29: 0xe0000adf, 0x7d2a: 0xe0000af1, 0x7d2b: 0xe0000b1d, + 0x7d2c: 0xe0000c28, 0x7d2d: 0xe0000c22, 0x7d2e: 0xe0000c34, 0x7d2f: 0xe0000c40, + 0x7d30: 0xe0000aad, 0x7d31: 0xe0000d60, 0x7d32: 0xe0000d97, 0x7d33: 0xe0000d91, + 0x7d34: 0xe0000da3, 0x7d35: 0xe0000de3, 0x7d36: 0xe00026c0, 0x7d37: 0x40093c20, + 0x7d38: 0xe0000e0f, 0x7d39: 0xe0000fde, 0x7d3a: 0xe0000fd8, 0x7d3b: 0xe0000fea, + 0x7d3c: 0xe00026d6, 0x7d3d: 0xe00010ff, 0x7d3e: 0x40318820, 0x7d3f: 0xe0001114, + // Block 0x1f5, offset 0x7d40 + 0x7d40: 0x40321220, 0x7d41: 0x40321a20, 0x7d42: 0x40322220, 0x7d43: 0x40322a20, + 0x7d44: 0xe0000ad5, 0x7d45: 0xe0000ad1, 0x7d46: 0xe0000acd, 0x7d47: 0xf0000a0a, + 0x7d48: 0xf000040a, 0x7d49: 0xf0000404, 0x7d4a: 0xf0000a0a, 0x7d4b: 0xf000040a, + 0x7d4c: 0xf0000404, 0x7d4d: 0xe0000947, 0x7d4e: 0xe0000944, 0x7d4f: 0xe0000c3d, + 0x7d50: 0xe0000c3a, 0x7d51: 0xe0000dcc, 0x7d52: 0xe0000dc9, 0x7d53: 0xe0000ff3, + 0x7d54: 0xe0000ff0, 0x7d55: 0xe00026f8, 0x7d56: 0xe00026f4, 0x7d57: 0xe00026e0, + 0x7d58: 0xe00026dc, 0x7d59: 0xe00026f0, 0x7d5a: 0xe00026ec, 0x7d5b: 0xe00026e8, + 0x7d5c: 0xe00026e4, 0x7d5d: 0x402cae20, 0x7d5e: 0xe00026bc, 0x7d5f: 0xe00026b8, + 0x7d60: 0xe0000976, 0x7d61: 0xe0000972, 0x7d62: 0xe00009f4, 0x7d63: 0xe00009ef, + 0x7d64: 0x002d3a88, 0x7d65: 0x402d3a20, 0x7d66: 0xe0000bbe, 0x7d67: 0xe0000bbb, + 0x7d68: 0xe0000c99, 0x7d69: 0xe0000c96, 0x7d6a: 0xe0000e20, 0x7d6b: 0xe0000e1d, + 0x7d6c: 0xe0000e27, 0x7d6d: 0xe0000e23, 0x7d6e: 0xe0001162, 0x7d6f: 0xe000115f, + 0x7d70: 0xe0000c8d, 0x7d71: 0xf0000a0a, 0x7d72: 0xf000040a, 0x7d73: 0xf0000404, + 0x7d74: 0xe0000bac, 0x7d75: 0xe0000ba9, 0x7d76: 0x002d7888, 0x7d77: 0x00319488, + 0x7d78: 0xe0000d57, 0x7d79: 0xe0000d54, 0x7d7a: 0xe0000954, 0x7d7b: 0xe0000950, + 0x7d7c: 0xe00009ea, 0x7d7d: 0xe00009e5, 0x7d7e: 0xe0000e19, 0x7d7f: 0xe0000e15, + // Block 0x1f6, offset 0x7d80 + 0x7d80: 0xe000098f, 0x7d81: 0xe000098c, 0x7d82: 0xe0000995, 0x7d83: 0xe0000992, + 0x7d84: 0xe0000b62, 0x7d85: 0xe0000b5f, 0x7d86: 0xe0000b68, 0x7d87: 0xe0000b65, + 0x7d88: 0xe0000c6c, 0x7d89: 0xe0000c69, 0x7d8a: 0xe0000c72, 0x7d8b: 0xe0000c6f, + 0x7d8c: 0xe0000e4a, 0x7d8d: 0xe0000e47, 0x7d8e: 0xe0000e50, 0x7d8f: 0xe0000e4d, + 0x7d90: 0xe0000ee8, 0x7d91: 0xe0000ee5, 0x7d92: 0xe0000eee, 0x7d93: 0xe0000eeb, + 0x7d94: 0xe0001053, 0x7d95: 0xe0001050, 0x7d96: 0xe0001059, 0x7d97: 0xe0001056, + 0x7d98: 0xe0000f61, 0x7d99: 0xe0000f5e, 0x7d9a: 0xe0000fa5, 0x7d9b: 0xe0000fa2, + 0x7d9c: 0x00312288, 0x7d9d: 0x40312220, 0x7d9e: 0xe0000bf4, 0x7d9f: 0xe0000bf1, + 0x7da0: 0x002ebc88, 0x7da1: 0x402c8c20, 0x7da2: 0x002f2288, 0x7da3: 0x402f2220, + 0x7da4: 0x00314088, 0x7da5: 0x40314020, 0x7da6: 0xe000096f, 0x7da7: 0xe000096c, + 0x7da8: 0xe0000b32, 0x7da9: 0xe0000b2f, 0x7daa: 0xe00026d2, 0x7dab: 0xe00026ce, + 0x7dac: 0xe0000dfd, 0x7dad: 0xe0000df9, 0x7dae: 0xe0000e04, 0x7daf: 0xe0000e01, + 0x7db0: 0xe0000e0b, 0x7db1: 0xe0000e07, 0x7db2: 0xe0001129, 0x7db3: 0xe0001126, + 0x7db4: 0x402e5e20, 0x7db5: 0x402ed020, 0x7db6: 0x40305a20, 0x7db7: 0x402dd420, + 0x7db8: 0xe0000abf, 0x7db9: 0xe0000ec4, 0x7dba: 0x002be888, 0x7dbb: 0x002c4488, + 0x7dbc: 0x402c4420, 0x7dbd: 0x002e3888, 0x7dbe: 0x00303e88, 0x7dbf: 0x402ffc20, + // Block 0x1f7, offset 0x7dc0 + 0x7dc0: 0xe0000d24, 0x7dc1: 0xe0000d21, 0x7dc2: 0xe0000d2a, 0x7dc3: 0xe0000d27, + 0x7dc4: 0xe0000d69, 0x7dc5: 0xe0000d66, 0x7dc6: 0xe0000d7b, 0x7dc7: 0xe0000d78, + 0x7dc8: 0xe0000d87, 0x7dc9: 0xe0000d84, 0x7dca: 0xe0000d81, 0x7dcb: 0xe0000d7e, + 0x7dcc: 0xe0000ded, 0x7dcd: 0xe0000de9, 0x7dce: 0xe00026ca, 0x7dcf: 0xe00026c6, + 0x7dd0: 0xe0000e3d, 0x7dd1: 0xe0000e39, 0x7dd2: 0xe0000e35, 0x7dd3: 0xe0000e31, + 0x7dd4: 0xe0000ea7, 0x7dd5: 0xe0000ea4, 0x7dd6: 0xe0000ead, 0x7dd7: 0xe0000eaa, + 0x7dd8: 0xe0000ed6, 0x7dd9: 0xe0000ed3, 0x7dda: 0xe0000ef4, 0x7ddb: 0xe0000ef1, + 0x7ddc: 0xe0000efb, 0x7ddd: 0xe0000ef7, 0x7dde: 0xe0000f02, 0x7ddf: 0xe0000eff, + 0x7de0: 0xe0000f41, 0x7de1: 0xe0000f3e, 0x7de2: 0xe0000f53, 0x7de3: 0xe0000f50, + 0x7de4: 0xe0000f26, 0x7de5: 0xe0000f22, 0x7de6: 0xe0000f3a, 0x7de7: 0xe0000f36, + 0x7de8: 0xe0000f5a, 0x7de9: 0xe0000f56, 0x7dea: 0xe0000f93, 0x7deb: 0xe0000f90, + 0x7dec: 0xe0000f9f, 0x7ded: 0xe0000f9c, 0x7dee: 0xe0000fb1, 0x7def: 0xe0000fae, + 0x7df0: 0xe0000fab, 0x7df1: 0xe0000fa8, 0x7df2: 0xe0001093, 0x7df3: 0xe0001090, + 0x7df4: 0xe000109f, 0x7df5: 0xe000109c, 0x7df6: 0xe0001099, 0x7df7: 0xe0001096, + 0x7df8: 0xe0001032, 0x7df9: 0xe000102e, 0x7dfa: 0xe00026f8, 0x7dfb: 0xe00026f4, + 0x7dfc: 0xe00010a9, 0x7dfd: 0xe00010a6, 0x7dfe: 0xe00010af, 0x7dff: 0xe00010ac, + // Block 0x1f8, offset 0x7e00 + 0x7e00: 0xa0000000, 0x7e01: 0xa0000000, 0x7e02: 0xa0000000, 0x7e03: 0xa0000000, + 0x7e04: 0xa0000000, 0x7e05: 0xa0000000, 0x7e06: 0xa0000000, 0x7e07: 0xa0000000, + 0x7e08: 0xa0000000, 0x7e09: 0x40020020, 0x7e0a: 0x40020220, 0x7e0b: 0x40020420, + 0x7e0c: 0x40020620, 0x7e0d: 0x40020820, 0x7e0e: 0xa0000000, 0x7e0f: 0xa0000000, + 0x7e10: 0xa0000000, 0x7e11: 0xa0000000, 0x7e12: 0xa0000000, 0x7e13: 0xa0000000, + 0x7e14: 0xa0000000, 0x7e15: 0xa0000000, 0x7e16: 0xa0000000, 0x7e17: 0xa0000000, + 0x7e18: 0xa0000000, 0x7e19: 0xa0000000, 0x7e1a: 0xa0000000, 0x7e1b: 0xa0000000, + 0x7e1c: 0xa0000000, 0x7e1d: 0xa0000000, 0x7e1e: 0xa0000000, 0x7e1f: 0xa0000000, + 0x7e20: 0x40021220, 0x7e21: 0x4002ba20, 0x7e22: 0x4003e020, 0x7e23: 0x4004ea20, + 0x7e24: 0x4027de20, 0x7e25: 0x4004ec20, 0x7e26: 0x4004e620, 0x7e27: 0x4003d220, + 0x7e28: 0x4003f420, 0x7e29: 0x4003f620, 0x7e2a: 0x4004d820, 0x7e2b: 0x40093820, + 0x7e2c: 0x40024020, 0x7e2d: 0x40021a20, 0x7e2e: 0x4002e420, 0x7e2f: 0x4004e220, + 0x7e30: 0x4029cc20, 0x7e31: 0x4029ce20, 0x7e32: 0x4029d020, 0x7e33: 0x4029d220, + 0x7e34: 0x4029d420, 0x7e35: 0x4029d620, 0x7e36: 0x4029d820, 0x7e37: 0x4029da20, + 0x7e38: 0x4029dc20, 0x7e39: 0x4029de20, 0x7e3a: 0x40026c20, 0x7e3b: 0x40026220, + 0x7e3c: 0x40094020, 0x7e3d: 0xc32f0851, 0x7e3e: 0x40094420, 0x7e3f: 0x4002c420, + // Block 0x1f9, offset 0x7e40 + 0x7e40: 0x4004d620, 0x7e41: 0x002bde88, 0x7e42: 0x002c0a88, 0x7e43: 0x002c3a88, + 0x7e44: 0x002c6288, 0x7e45: 0x002c9888, 0x7e46: 0x002d0888, 0x7e47: 0x002d2288, + 0x7e48: 0x002d6888, 0x7e49: 0x002d9a88, 0x7e4a: 0x002dcc88, 0x7e4b: 0x002dfe88, + 0x7e4c: 0xc0030002, 0x7e4d: 0x002e8288, 0x7e4e: 0xc3690a31, 0x7e4f: 0x002ee288, + 0x7e50: 0x002f2c88, 0x7e51: 0x002f5688, 0x7e52: 0x002f7a88, 0x7e53: 0x002fe688, + 0x7e54: 0x00302c88, 0x7e55: 0x00306c88, 0x7e56: 0x0030be88, 0x7e57: 0x0030e288, + 0x7e58: 0x0030f688, 0x7e59: 0x00310088, 0x7e5a: 0x00312a88, 0x7e5b: 0x4003f820, + 0x7e5c: 0x4004e420, 0x7e5d: 0x4003fa20, 0x7e5e: 0x40062420, 0x7e5f: 0x40021620, + 0x7e60: 0x40061e20, 0x7e61: 0x402bde20, 0x7e62: 0x402c0a20, 0x7e63: 0x402c3a20, + 0x7e64: 0x402c6220, 0x7e65: 0x402c9820, 0x7e66: 0x402d0820, 0x7e67: 0x402d2220, + 0x7e68: 0x402d6820, 0x7e69: 0x402d9a20, 0x7e6a: 0x402dcc20, 0x7e6b: 0x402dfe20, + 0x7e6c: 0xc0000002, 0x7e6d: 0x402e8220, 0x7e6e: 0xc3670a31, 0x7e6f: 0x402ee220, + 0x7e70: 0x402f2c20, 0x7e71: 0x402f5620, 0x7e72: 0x402f7a20, 0x7e73: 0x402fe620, + 0x7e74: 0x40302c20, 0x7e75: 0x40306c20, 0x7e76: 0x4030be20, 0x7e77: 0x4030e220, + 0x7e78: 0x4030f620, 0x7e79: 0x40310020, 0x7e7a: 0x40312a20, 0x7e7b: 0x4003fc20, + 0x7e7c: 0x40094820, 0x7e7d: 0x4003fe20, 0x7e7e: 0x40094c20, 0x7e7f: 0xa0000000, + // Block 0x1fa, offset 0x7e80 + 0x7e80: 0xe00008f5, 0x7e81: 0xe00008ef, 0x7e82: 0xe0000921, 0x7e83: 0xe0000969, + 0x7e84: 0xe000095b, 0x7e85: 0xe000094d, 0x7e86: 0xe00009dd, 0x7e87: 0xe0000a53, + 0x7e88: 0xe0000ae8, 0x7e89: 0xe0000ae2, 0x7e8a: 0xe0000af4, 0x7e8b: 0xe0000b20, + 0x7e8c: 0xe0000c2b, 0x7e8d: 0xe0000c25, 0x7e8e: 0xe0000c37, 0x7e8f: 0xe0000c43, + 0x7e90: 0xe0000ab3, 0x7e91: 0x002ea083, 0x7e92: 0xe0000d9a, 0x7e93: 0xe0000d94, + 0x7e94: 0xe0000da6, 0x7e95: 0xe0000de6, 0x7e96: 0xe0000dd2, 0x7e97: 0x40093e20, + 0x7e98: 0xe0000e12, 0x7e99: 0xe0000fe1, 0x7e9a: 0xe0000fdb, 0x7e9b: 0xe0000fed, + 0x7e9c: 0xe0000fff, 0x7e9d: 0xe0001102, 0x7e9e: 0x00318888, 0x7e9f: 0xe0000f7b, + 0x7ea0: 0xe00008f2, 0x7ea1: 0xe00008ec, 0x7ea2: 0xe000091e, 0x7ea3: 0xe0000966, + 0x7ea4: 0xe0000958, 0x7ea5: 0xe000094a, 0x7ea6: 0xe00009d5, 0x7ea7: 0xe0000a4d, + 0x7ea8: 0xe0000ae5, 0x7ea9: 0xe0000adf, 0x7eaa: 0xe0000af1, 0x7eab: 0xe0000b1d, + 0x7eac: 0xe0000c28, 0x7ead: 0xe0000c22, 0x7eae: 0xe0000c34, 0x7eaf: 0xe0000c40, + 0x7eb0: 0xe0000aad, 0x7eb1: 0x402ea020, 0x7eb2: 0xe0000d97, 0x7eb3: 0xe0000d91, + 0x7eb4: 0xe0000da3, 0x7eb5: 0xe0000de3, 0x7eb6: 0xe0000dcf, 0x7eb7: 0x40093c20, + 0x7eb8: 0xe0000e0f, 0x7eb9: 0xe0000fde, 0x7eba: 0xe0000fd8, 0x7ebb: 0xe0000fea, + 0x7ebc: 0xe0000ffc, 0x7ebd: 0xe00010ff, 0x7ebe: 0x40318820, 0x7ebf: 0xe0001114, + // Block 0x1fb, offset 0x7ec0 + 0x7ec0: 0xa0000000, 0x7ec1: 0xa0000000, 0x7ec2: 0xa0000000, 0x7ec3: 0xa0000000, + 0x7ec4: 0xa0000000, 0x7ec5: 0xa0000000, 0x7ec6: 0xa0000000, 0x7ec7: 0xa0000000, + 0x7ec8: 0xa0000000, 0x7ec9: 0x40020020, 0x7eca: 0x40020220, 0x7ecb: 0x40020420, + 0x7ecc: 0x40020620, 0x7ecd: 0x40020820, 0x7ece: 0xa0000000, 0x7ecf: 0xa0000000, + 0x7ed0: 0xa0000000, 0x7ed1: 0xa0000000, 0x7ed2: 0xa0000000, 0x7ed3: 0xa0000000, + 0x7ed4: 0xa0000000, 0x7ed5: 0xa0000000, 0x7ed6: 0xa0000000, 0x7ed7: 0xa0000000, + 0x7ed8: 0xa0000000, 0x7ed9: 0xa0000000, 0x7eda: 0xa0000000, 0x7edb: 0xa0000000, + 0x7edc: 0xa0000000, 0x7edd: 0xa0000000, 0x7ede: 0xa0000000, 0x7edf: 0xa0000000, + 0x7ee0: 0x40021220, 0x7ee1: 0x4002ba20, 0x7ee2: 0x4003e020, 0x7ee3: 0x4004ea20, + 0x7ee4: 0x4027de20, 0x7ee5: 0x4004ec20, 0x7ee6: 0x4004e620, 0x7ee7: 0x4003d220, + 0x7ee8: 0x4003f420, 0x7ee9: 0x4003f620, 0x7eea: 0x4004d820, 0x7eeb: 0x40093820, + 0x7eec: 0x40024020, 0x7eed: 0x40021a20, 0x7eee: 0x4002e420, 0x7eef: 0x4004e220, + 0x7ef0: 0x4029cc20, 0x7ef1: 0x4029ce20, 0x7ef2: 0x4029d020, 0x7ef3: 0x4029d220, + 0x7ef4: 0x4029d420, 0x7ef5: 0x4029d620, 0x7ef6: 0x4029d820, 0x7ef7: 0x4029da20, + 0x7ef8: 0x4029dc20, 0x7ef9: 0x4029de20, 0x7efa: 0x40026c20, 0x7efb: 0x40026220, + 0x7efc: 0x40094020, 0x7efd: 0xc32f0851, 0x7efe: 0x40094420, 0x7eff: 0x4002c420, + // Block 0x1fc, offset 0x7f00 + 0x7f00: 0x4004d620, 0x7f01: 0xc3a90a51, 0x7f02: 0x002c0a88, 0x7f03: 0x002c3a88, + 0x7f04: 0x002c6288, 0x7f05: 0x002c9888, 0x7f06: 0x002d0888, 0x7f07: 0x002d2288, + 0x7f08: 0x002d6888, 0x7f09: 0x002d9a88, 0x7f0a: 0x002dcc88, 0x7f0b: 0x002dfe88, + 0x7f0c: 0xc0030002, 0x7f0d: 0x002e8288, 0x7f0e: 0x002e9e88, 0x7f0f: 0xc3b00a81, + 0x7f10: 0x002f2c88, 0x7f11: 0x002f5688, 0x7f12: 0x002f7a88, 0x7f13: 0x002fe688, + 0x7f14: 0x00302c88, 0x7f15: 0xc3840951, 0x7f16: 0x0030be88, 0x7f17: 0x0030bea3, + 0x7f18: 0x0030f688, 0x7f19: 0x00310088, 0x7f1a: 0x00312a88, 0x7f1b: 0x4003f820, + 0x7f1c: 0x4004e420, 0x7f1d: 0x4003fa20, 0x7f1e: 0x40062420, 0x7f1f: 0x40021620, + 0x7f20: 0x40061e20, 0x7f21: 0xc3a60a51, 0x7f22: 0x402c0a20, 0x7f23: 0x402c3a20, + 0x7f24: 0x402c6220, 0x7f25: 0x402c9820, 0x7f26: 0x402d0820, 0x7f27: 0x402d2220, + 0x7f28: 0x402d6820, 0x7f29: 0x402d9a20, 0x7f2a: 0x402dcc20, 0x7f2b: 0x402dfe20, + 0x7f2c: 0xc0000002, 0x7f2d: 0x402e8220, 0x7f2e: 0x402e9e20, 0x7f2f: 0xc3ac0a81, + 0x7f30: 0x402f2c20, 0x7f31: 0x402f5620, 0x7f32: 0x402f7a20, 0x7f33: 0x402fe620, + 0x7f34: 0x40302c20, 0x7f35: 0xc3810951, 0x7f36: 0x4030be20, 0x7f37: 0x4030be21, + 0x7f38: 0x4030f620, 0x7f39: 0x40310020, 0x7f3a: 0x40312a20, 0x7f3b: 0x4003fc20, + 0x7f3c: 0x40094820, 0x7f3d: 0x4003fe20, 0x7f3e: 0x40094c20, 0x7f3f: 0xa0000000, + // Block 0x1fd, offset 0x7f40 + 0x7f40: 0xe00008f5, 0x7f41: 0xe00008ef, 0x7f42: 0xe0000921, 0x7f43: 0xe0000969, + 0x7f44: 0x00320e83, 0x7f45: 0x00320c83, 0x7f46: 0x00320ea3, 0x7f47: 0xe0000a53, + 0x7f48: 0xe0000ae8, 0x7f49: 0xe0000ae2, 0x7f4a: 0xe0000af4, 0x7f4b: 0xe0000b20, + 0x7f4c: 0xe0000c2b, 0x7f4d: 0xe0000c25, 0x7f4e: 0xe0000c37, 0x7f4f: 0xe0000c43, + 0x7f50: 0x002c62a3, 0x7f51: 0xe0000d63, 0x7f52: 0xe0000d9a, 0x7f53: 0xe0000d94, + 0x7f54: 0xe0000da6, 0x7f55: 0x003210e3, 0x7f56: 0x00321083, 0x7f57: 0x40093e20, + 0x7f58: 0x003210a3, 0x7f59: 0xe0000fe1, 0x7f5a: 0xe0000fdb, 0x7f5b: 0xe0000fed, + 0x7f5c: 0x003100a3, 0x7f5d: 0xe0001102, 0x7f5e: 0xe0002716, 0x7f5f: 0xe0000f7b, + 0x7f60: 0xe00008f2, 0x7f61: 0xe00008ec, 0x7f62: 0xe000091e, 0x7f63: 0xe0000966, + 0x7f64: 0x40320e20, 0x7f65: 0x40320c20, 0x7f66: 0x40320e21, 0x7f67: 0xe0000a4d, + 0x7f68: 0xe0000ae5, 0x7f69: 0xe0000adf, 0x7f6a: 0xe0000af1, 0x7f6b: 0xe0000b1d, + 0x7f6c: 0xe0000c28, 0x7f6d: 0xe0000c22, 0x7f6e: 0xe0000c34, 0x7f6f: 0xe0000c40, + 0x7f70: 0x402c6221, 0x7f71: 0xe0000d60, 0x7f72: 0xe0000d97, 0x7f73: 0xe0000d91, + 0x7f74: 0xe0000da3, 0x7f75: 0x40321023, 0x7f76: 0x40321020, 0x7f77: 0x40093c20, + 0x7f78: 0x40321021, 0x7f79: 0xe0000fde, 0x7f7a: 0xe0000fd8, 0x7f7b: 0xe0000fea, + 0x7f7c: 0x40310021, 0x7f7d: 0xe00010ff, 0x7f7e: 0xe0002713, 0x7f7f: 0xe0001114, + // Block 0x1fe, offset 0x7f80 + 0x7f80: 0xe0000983, 0x7f81: 0xe0000980, 0x7f82: 0xe00008fb, 0x7f83: 0xe00008f8, + 0x7f84: 0xe000097d, 0x7f85: 0xe000097a, 0x7f86: 0xe0000a38, 0x7f87: 0xe0000a35, + 0x7f88: 0xe0000a3e, 0x7f89: 0xe0000a3b, 0x7f8a: 0xe0000a4a, 0x7f8b: 0xe0000a47, + 0x7f8c: 0xe0000a44, 0x7f8d: 0xe0000a41, 0x7f8e: 0xe0000a86, 0x7f8f: 0xe0000a83, + 0x7f90: 0x002c62c3, 0x7f91: 0x402c6222, 0x7f92: 0xe0000b46, 0x7f93: 0xe0000b43, + 0x7f94: 0xe0000aee, 0x7f95: 0xe0000aeb, 0x7f96: 0xe0000b2c, 0x7f97: 0xe0000b29, + 0x7f98: 0xe0000b40, 0x7f99: 0xe0000b3d, 0x7f9a: 0xe0000b1a, 0x7f9b: 0xe0000b17, + 0x7f9c: 0xe0000bb8, 0x7f9d: 0xe0000bb5, 0x7f9e: 0xe0000bb2, 0x7f9f: 0xe0000baf, + 0x7fa0: 0xe0000bc4, 0x7fa1: 0xe0000bc1, 0x7fa2: 0xe0000bca, 0x7fa3: 0xe0000bc7, + 0x7fa4: 0xe0000bee, 0x7fa5: 0xe0000beb, 0x7fa6: 0xe0000c1b, 0x7fa7: 0xe0000c18, + 0x7fa8: 0xe0000c51, 0x7fa9: 0xe0000c4e, 0x7faa: 0xe0000c60, 0x7fab: 0xe0000c5d, + 0x7fac: 0xe0000c31, 0x7fad: 0xe0000c2e, 0x7fae: 0xe0000c5a, 0x7faf: 0xe0000c57, + 0x7fb0: 0xe0000c54, 0x7fb1: 0x402da220, 0x7fb2: 0xf0000a0a, 0x7fb3: 0xf0000404, + 0x7fb4: 0xe0000c8a, 0x7fb5: 0xe0000c87, 0x7fb6: 0xe0000c9f, 0x7fb7: 0xe0000c9c, + 0x7fb8: 0x402f7220, 0x7fb9: 0xe0000ccc, 0x7fba: 0xe0000cc9, 0x7fbb: 0xe0000cd8, + 0x7fbc: 0xe0000cd5, 0x7fbd: 0xe0000cd2, 0x7fbe: 0xe0000ccf, 0x7fbf: 0xe0000d04, + // Block 0x1ff, offset 0x7fc0 + 0x7fc0: 0xe0000cfe, 0x7fc1: 0xe0000cf8, 0x7fc2: 0xe0000cf5, 0x7fc3: 0xe0000d51, + 0x7fc4: 0xe0000d4e, 0x7fc5: 0xe0000d6f, 0x7fc6: 0xe0000d6c, 0x7fc7: 0xe0000d5d, + 0x7fc8: 0xe0000d5a, 0x7fc9: 0xf0000404, 0x7fca: 0x002e9ea3, 0x7fcb: 0x402e9e21, + 0x7fcc: 0xe0000e2e, 0x7fcd: 0xe0000e2b, 0x7fce: 0xe0000da0, 0x7fcf: 0xe0000d9d, + 0x7fd0: 0x003210c3, 0x7fd1: 0x40321022, 0x7fd2: 0x00321103, 0x7fd3: 0x40321024, + 0x7fd4: 0xe0000eca, 0x7fd5: 0xe0000ec7, 0x7fd6: 0xe0000edc, 0x7fd7: 0xe0000ed9, + 0x7fd8: 0xe0000ed0, 0x7fd9: 0xe0000ecd, 0x7fda: 0xe0000f1f, 0x7fdb: 0xe0000f1c, + 0x7fdc: 0xe0000f2d, 0x7fdd: 0xe0000f2a, 0x7fde: 0xe0000f47, 0x7fdf: 0xe0000f44, + 0x7fe0: 0xe0000f33, 0x7fe1: 0xe0000f30, 0x7fe2: 0xe0000f99, 0x7fe3: 0xe0000f96, + 0x7fe4: 0xe0000f8a, 0x7fe5: 0xe0000f87, 0x7fe6: 0x00303688, 0x7fe7: 0x40303620, + 0x7fe8: 0xe000102b, 0x7fe9: 0xe0001028, 0x7fea: 0xe000103f, 0x7feb: 0xe000103c, + 0x7fec: 0xe0000fe7, 0x7fed: 0xe0000fe4, 0x7fee: 0xe0000ff9, 0x7fef: 0xe0000ff6, + 0x7ff0: 0x003100c3, 0x7ff1: 0x40310022, 0x7ff2: 0xe0001039, 0x7ff3: 0xe0001036, + 0x7ff4: 0xe0002728, 0x7ff5: 0xe0002725, 0x7ff6: 0xe000110e, 0x7ff7: 0xe000110b, + 0x7ff8: 0xe0001117, 0x7ff9: 0xe000113b, 0x7ffa: 0xe0001138, 0x7ffb: 0xe000114d, + 0x7ffc: 0xe000114a, 0x7ffd: 0xe0001147, 0x7ffe: 0xe0001144, 0x7fff: 0xe0000f64, + // Block 0x200, offset 0x8000 + 0x8000: 0x40321220, 0x8001: 0x40321a20, 0x8002: 0x40322220, 0x8003: 0x40322a20, + 0x8004: 0xe0000ad5, 0x8005: 0xe0000ad1, 0x8006: 0xe0000acd, 0x8007: 0xf0000a0a, + 0x8008: 0xf000040a, 0x8009: 0xf0000404, 0x800a: 0xf0000a0a, 0x800b: 0xf000040a, + 0x800c: 0xf0000404, 0x800d: 0xe0000947, 0x800e: 0xe0000944, 0x800f: 0xe0000c3d, + 0x8010: 0xe0000c3a, 0x8011: 0xe0000dcc, 0x8012: 0xe0000dc9, 0x8013: 0xe0000ff3, + 0x8014: 0xe0000ff0, 0x8015: 0xe0002685, 0x8016: 0xe0002682, 0x8017: 0xe0002673, + 0x8018: 0xe0002670, 0x8019: 0xe000267f, 0x801a: 0xe000267c, 0x801b: 0xe0002679, + 0x801c: 0xe0002676, 0x801d: 0x402cae20, 0x801e: 0xe000274c, 0x801f: 0xe0002749, + 0x8020: 0xe0000976, 0x8021: 0xe0000972, 0x8022: 0xe00026a9, 0x8023: 0xe00026a6, + 0x8024: 0x002d3a88, 0x8025: 0x402d3a20, 0x8026: 0xe0000bbe, 0x8027: 0xe0000bbb, + 0x8028: 0xe0000c99, 0x8029: 0xe0000c96, 0x802a: 0xe0000e20, 0x802b: 0xe0000e1d, + 0x802c: 0xe0000e27, 0x802d: 0xe0000e23, 0x802e: 0xe0001162, 0x802f: 0xe000115f, + 0x8030: 0xe0000c8d, 0x8031: 0xf0000a0a, 0x8032: 0xf000040a, 0x8033: 0xf0000404, + 0x8034: 0xe0000bac, 0x8035: 0xe0000ba9, 0x8036: 0x002d7888, 0x8037: 0x00319488, + 0x8038: 0xe0000d57, 0x8039: 0xe0000d54, 0x803a: 0xe000268b, 0x803b: 0xe0002688, + 0x803c: 0xe0002752, 0x803d: 0xe000274f, 0x803e: 0xe000275e, 0x803f: 0xe000275b, + // Block 0x201, offset 0x8040 + 0x8040: 0xe000098f, 0x8041: 0xe000098c, 0x8042: 0xe0000995, 0x8043: 0xe0000992, + 0x8044: 0xe0000b62, 0x8045: 0xe0000b5f, 0x8046: 0xe0000b68, 0x8047: 0xe0000b65, + 0x8048: 0xe0000c6c, 0x8049: 0xe0000c69, 0x804a: 0xe0000c72, 0x804b: 0xe0000c6f, + 0x804c: 0xe0000e4a, 0x804d: 0xe0000e47, 0x804e: 0xe0000e50, 0x804f: 0xe0000e4d, + 0x8050: 0xe0000ee8, 0x8051: 0xe0000ee5, 0x8052: 0xe0000eee, 0x8053: 0xe0000eeb, + 0x8054: 0xe0001053, 0x8055: 0xe0001050, 0x8056: 0xe0001059, 0x8057: 0xe0001056, + 0x8058: 0xe0000f61, 0x8059: 0xe0000f5e, 0x805a: 0xe0000fa5, 0x805b: 0xe0000fa2, + 0x805c: 0x00312288, 0x805d: 0x40312220, 0x805e: 0xe0000bf4, 0x805f: 0xe0000bf1, + 0x8060: 0x002ebc88, 0x8061: 0x402c8c20, 0x8062: 0x002f2288, 0x8063: 0x402f2220, + 0x8064: 0x00314088, 0x8065: 0x40314020, 0x8066: 0xe000096f, 0x8067: 0xe000096c, + 0x8068: 0xe0000b32, 0x8069: 0xe0000b2f, 0x806a: 0xe0002758, 0x806b: 0xe0002755, + 0x806c: 0xe0002776, 0x806d: 0xe0002773, 0x806e: 0xe0000e04, 0x806f: 0xe0000e01, + 0x8070: 0xe0000e0b, 0x8071: 0xe0000e07, 0x8072: 0xe0001129, 0x8073: 0xe0001126, + 0x8074: 0x402e5e20, 0x8075: 0x402ed020, 0x8076: 0x40305a20, 0x8077: 0x402dd420, + 0x8078: 0xe0000abf, 0x8079: 0xe0000ec4, 0x807a: 0x002be888, 0x807b: 0x002c4488, + 0x807c: 0x402c4420, 0x807d: 0x002e3888, 0x807e: 0x00303e88, 0x807f: 0x402ffc20, + // Block 0x202, offset 0x8080 + 0x8080: 0xe0000d24, 0x8081: 0xe0000d21, 0x8082: 0xe0000d2a, 0x8083: 0xe0000d27, + 0x8084: 0xe0000d69, 0x8085: 0xe0000d66, 0x8086: 0xe0000d7b, 0x8087: 0xe0000d78, + 0x8088: 0xe0000d87, 0x8089: 0xe0000d84, 0x808a: 0xe0000d81, 0x808b: 0xe0000d7e, + 0x808c: 0xe0002764, 0x808d: 0xe0002761, 0x808e: 0xe0002770, 0x808f: 0xe000276d, + 0x8090: 0xe0000e3d, 0x8091: 0xe0000e39, 0x8092: 0xe0000e35, 0x8093: 0xe0000e31, + 0x8094: 0xe0000ea7, 0x8095: 0xe0000ea4, 0x8096: 0xe0000ead, 0x8097: 0xe0000eaa, + 0x8098: 0xe0000ed6, 0x8099: 0xe0000ed3, 0x809a: 0xe0000ef4, 0x809b: 0xe0000ef1, + 0x809c: 0xe0000efb, 0x809d: 0xe0000ef7, 0x809e: 0xe0000f02, 0x809f: 0xe0000eff, + 0x80a0: 0xe0000f41, 0x80a1: 0xe0000f3e, 0x80a2: 0xe0000f53, 0x80a3: 0xe0000f50, + 0x80a4: 0xe0000f26, 0x80a5: 0xe0000f22, 0x80a6: 0xe0000f3a, 0x80a7: 0xe0000f36, + 0x80a8: 0xe0000f5a, 0x80a9: 0xe0000f56, 0x80aa: 0xe0000f93, 0x80ab: 0xe0000f90, + 0x80ac: 0xe0000f9f, 0x80ad: 0xe0000f9c, 0x80ae: 0xe0000fb1, 0x80af: 0xe0000fae, + 0x80b0: 0xe0000fab, 0x80b1: 0xe0000fa8, 0x80b2: 0xe0001093, 0x80b3: 0xe0001090, + 0x80b4: 0xe000109f, 0x80b5: 0xe000109c, 0x80b6: 0xe0001099, 0x80b7: 0xe0001096, + 0x80b8: 0xe0001032, 0x80b9: 0xe000102e, 0x80ba: 0xe0002685, 0x80bb: 0xe0002682, + 0x80bc: 0xe00010a9, 0x80bd: 0xe00010a6, 0x80be: 0xe00010af, 0x80bf: 0xe00010ac, + // Block 0x203, offset 0x80c0 + 0x80c0: 0xe0002722, 0x80c1: 0xe000271f, 0x80c2: 0xe000271c, 0x80c3: 0xe0002719, + 0x80c4: 0xe0002731, 0x80c5: 0xe000272e, 0x80c6: 0xe0002737, 0x80c7: 0xe0002734, + 0x80c8: 0xe000273d, 0x80c9: 0xe000273a, 0x80ca: 0xe00010fc, 0x80cb: 0xe00010f9, + 0x80cc: 0xe00010f6, 0x80cd: 0xe00010f3, 0x80ce: 0xe0001123, 0x80cf: 0xe0001120, + 0x80d0: 0xe0001141, 0x80d1: 0xe000113e, 0x80d2: 0xe0001153, 0x80d3: 0xe0001150, + 0x80d4: 0xe0001159, 0x80d5: 0xe0001156, 0x80d6: 0xe0000c15, 0x80d7: 0xe0000f8d, + 0x80d8: 0xe000272b, 0x80d9: 0xe0001111, 0x80da: 0xf0000404, 0x80db: 0xe0000f70, + 0x80dc: 0x40300420, 0x80dd: 0x40300620, 0x80de: 0xe0000f7f, 0x80df: 0x402c9620, + 0x80e0: 0xe000099b, 0x80e1: 0xe0000998, 0x80e2: 0xe0000989, 0x80e3: 0xe0000986, + 0x80e4: 0xe0000928, 0x80e5: 0xe0000924, 0x80e6: 0xe0000930, 0x80e7: 0xe000092c, + 0x80e8: 0xe0000940, 0x80e9: 0xe000093c, 0x80ea: 0xe0000938, 0x80eb: 0xe0000934, + 0x80ec: 0xe00009aa, 0x80ed: 0xe00009a6, 0x80ee: 0xe0000902, 0x80ef: 0xe00008fe, + 0x80f0: 0xe000090a, 0x80f1: 0xe0000906, 0x80f2: 0xe000091a, 0x80f3: 0xe0000916, + 0x80f4: 0xe0000912, 0x80f5: 0xe000090e, 0x80f6: 0xe00009a2, 0x80f7: 0xe000099e, + 0x80f8: 0xe0000b6e, 0x80f9: 0xe0000b6b, 0x80fa: 0xe0000b5c, 0x80fb: 0xe0000b59, + 0x80fc: 0xe0000b26, 0x80fd: 0xe0000b23, 0x80fe: 0xe0000afb, 0x80ff: 0xe0000af7, + // Block 0x204, offset 0x8100 + 0x8100: 0xe0000b03, 0x8101: 0xe0000aff, 0x8102: 0xe0000b13, 0x8103: 0xe0000b0f, + 0x8104: 0xe0000b0b, 0x8105: 0xe0000b07, 0x8106: 0xe0000b75, 0x8107: 0xe0000b71, + 0x8108: 0xe0000c66, 0x8109: 0xe0000c63, 0x810a: 0xe0000c78, 0x810b: 0xe0000c75, + 0x810c: 0xe0000e84, 0x810d: 0xe0000e81, 0x810e: 0xe0000e44, 0x810f: 0xe0000e41, + 0x8110: 0xe0000dad, 0x8111: 0xe0000da9, 0x8112: 0xe0000db5, 0x8113: 0xe0000db1, + 0x8114: 0xe0000dc5, 0x8115: 0xe0000dc1, 0x8116: 0xe000276a, 0x8117: 0xe0002767, + 0x8118: 0xe0000e8b, 0x8119: 0xe0000e87, 0x811a: 0xe0000e5d, 0x811b: 0xe0000e59, + 0x811c: 0xe0000e65, 0x811d: 0xe0000e61, 0x811e: 0xe0000e75, 0x811f: 0xe0000e71, + 0x8120: 0xe000277c, 0x8121: 0xe0002779, 0x8122: 0xe0000e7d, 0x8123: 0xe0000e79, + 0x8124: 0xe000108d, 0x8125: 0xe000108a, 0x8126: 0xe000104d, 0x8127: 0xe000104a, + 0x8128: 0xe0001066, 0x8129: 0xe0001062, 0x812a: 0xe000106e, 0x812b: 0xe000106a, + 0x812c: 0xe000107e, 0x812d: 0xe000107a, 0x812e: 0xe0001076, 0x812f: 0xe0001072, + 0x8130: 0xe0001086, 0x8131: 0xe0001082, 0x8132: 0xe0001108, 0x8133: 0xe0001105, + 0x8134: 0xe0001135, 0x8135: 0xe0001132, 0x8136: 0xe000112f, 0x8137: 0xe000112c, + 0x8138: 0xe000111d, 0x8139: 0xe000111a, 0x813a: 0xe0000d0a, 0x813b: 0xe0000d07, + 0x813c: 0x0030d888, 0x813d: 0x4030d820, 0x813e: 0x00312088, 0x813f: 0x40312020, + // Block 0x205, offset 0x8140 + 0x8140: 0xe00009bc, 0x8141: 0xe00009c0, 0x8142: 0x002c3a8b, 0x8143: 0xf0000a04, + 0x8144: 0x40081c20, 0x8145: 0xe0000a5e, 0x8146: 0xe0000a62, 0x8147: 0x002cc28a, + 0x8148: 0x40081e20, 0x8149: 0xf0000a04, 0x814a: 0x002d2285, 0x814b: 0x002d688b, + 0x814c: 0x002d688b, 0x814d: 0x002d688b, 0x814e: 0x002d6885, 0x814f: 0xf0000202, + 0x8150: 0x002d9a8b, 0x8151: 0x002d9a8b, 0x8152: 0x002e228b, 0x8153: 0x002e2285, + 0x8154: 0x40082020, 0x8155: 0x002e9e8b, 0x8156: 0xf000040a, 0x8157: 0x40082220, + 0x8158: 0x40082420, 0x8159: 0x002f2c8b, 0x815a: 0x002f568b, 0x815b: 0x002f7a8b, + 0x815c: 0x002f7a8b, 0x815d: 0x002f7a8b, 0x815e: 0x40082620, 0x815f: 0x40082820, + 0x8160: 0xf0001414, 0x8161: 0xe0000fbd, 0x8162: 0xf0001414, 0x8163: 0x40082a20, + 0x8164: 0x00312a8b, 0x8165: 0x40082c20, 0x8166: 0x0032a288, 0x8167: 0x40082e20, + 0x8168: 0x00312a8b, 0x8169: 0x40083020, 0x816a: 0x002dfe88, 0x816b: 0x00320c83, + 0x816c: 0x002c0a8b, 0x816d: 0x002c3a8b, 0x816e: 0x40083220, 0x816f: 0x002c9885, + 0x8170: 0x002c988b, 0x8171: 0x002d088b, 0x8172: 0x002d1e88, 0x8173: 0x002e828b, + 0x8174: 0x002ee285, 0x8175: 0x00389084, 0x8176: 0x00389284, 0x8177: 0x00389484, + 0x8178: 0x00389684, 0x8179: 0x002d9a85, 0x817a: 0x40083420, 0x817b: 0xe0000b95, + 0x817c: 0x00327e85, 0x817d: 0x00325685, 0x817e: 0x0032568b, 0x817f: 0x00327e8b, + // Block 0x206, offset 0x8180 + 0x8180: 0xe0000024, 0x8181: 0xe0000029, 0x8182: 0xe000002e, 0x8183: 0xe0000033, + 0x8184: 0xe0000038, 0x8185: 0xe000003d, 0x8186: 0xe0000042, 0x8187: 0xe0000047, + 0x8188: 0xf0001f04, 0x8189: 0xf0001f04, 0x818a: 0xf0001f04, 0x818b: 0xf0001f04, + 0x818c: 0xf0001f04, 0x818d: 0xf0001f04, 0x818e: 0xf0001f04, 0x818f: 0xf0001f04, + 0x8190: 0xf0001f04, 0x8191: 0xf0000404, 0x8192: 0xf0000404, 0x8193: 0xf0000404, + 0x8194: 0xf0000404, 0x8195: 0xf0000404, 0x8196: 0xf0000404, 0x8197: 0xf0000404, + 0x8198: 0xf0000404, 0x8199: 0xf0000404, 0x819a: 0xf0000404, 0x819b: 0xf0000404, + 0x819c: 0xf0000404, 0x819d: 0xf0000404, 0x819e: 0xf0000404, 0x819f: 0xf0000404, + 0x81a0: 0xf0000404, 0x81a1: 0xf0000404, 0x81a2: 0xf0000404, 0x81a3: 0xf0000404, + 0x81a4: 0xf0000404, 0x81a5: 0xf0000404, 0x81a6: 0xf0000404, 0x81a7: 0xf0000404, + 0x81a8: 0xf0000404, 0x81a9: 0xf0000404, 0x81aa: 0xf0000404, 0x81ab: 0xf0000404, + 0x81ac: 0xf0000404, 0x81ad: 0xf0000404, 0x81ae: 0xf0000404, 0x81af: 0xf0000404, + 0x81b0: 0xf0000404, 0x81b1: 0xf0000404, 0x81b2: 0xe00026fc, 0x81b3: 0xf0000404, + 0x81b4: 0xf0000404, 0x81b5: 0xf0000404, 0x81b6: 0x002bde8c, 0x81b7: 0x002c0a8c, + 0x81b8: 0x002c3a8c, 0x81b9: 0x002c628c, 0x81ba: 0x002c988c, 0x81bb: 0x002d088c, + 0x81bc: 0x002d228c, 0x81bd: 0x002d688c, 0x81be: 0x002d9a8c, 0x81bf: 0x002dcc8c, + // Block 0x207, offset 0x81c0 + 0x81c0: 0xf0001d1c, 0x81c1: 0xf0001d1c, 0x81c2: 0xf0001d1c, 0x81c3: 0xf0001d1c, + 0x81c4: 0xf0001d1c, 0x81c5: 0xf0001d1d, 0x81c6: 0xf0001d1d, 0x81c7: 0xf0001d1d, + 0x81c8: 0xe0000a6b, 0x81c9: 0xe0000cb4, 0x81ca: 0xf0001d1c, 0x81cb: 0xf0001d1c, + 0x81cc: 0xf0001d1c, 0x81cd: 0xf0001c1c, 0x81ce: 0xf0001c1c, 0x81cf: 0xf0001c1c, + 0x81d0: 0xf0001c1d, 0x81d1: 0xe0000cb9, 0x81d2: 0xe0000d36, 0x81d3: 0xe0000be3, + 0x81d4: 0xe0000fc5, 0x81d5: 0xf0001c1c, 0x81d6: 0xf0001c1c, 0x81d7: 0xf0001c1c, + 0x81d8: 0xf0001c1c, 0x81d9: 0xf0001c1c, 0x81da: 0xf0001c1c, 0x81db: 0xf0001c1c, + 0x81dc: 0xf0001c1c, 0x81dd: 0xf0001c1c, 0x81de: 0xf0001c1c, 0x81df: 0xe0000d3e, + 0x81e0: 0xe0000a72, 0x81e1: 0xf0001c1c, 0x81e2: 0xe0000cbd, 0x81e3: 0xe0000d42, + 0x81e4: 0xe0000a76, 0x81e5: 0xf0001c1c, 0x81e6: 0xe0000cc1, 0x81e7: 0xe0000d2d, + 0x81e8: 0xe0000d31, 0x81e9: 0xf0001c1d, 0x81ea: 0xe0000cc5, 0x81eb: 0xe0000d4a, + 0x81ec: 0xe0000be7, 0x81ed: 0xe0000f0b, 0x81ee: 0xe0000f0f, 0x81ef: 0xe0000f15, + 0x81f0: 0xf0001c1c, 0x81f1: 0xf0001c1c, 0x81f2: 0xf0001c1c, 0x81f3: 0xf0001c1c, + 0x81f4: 0xf0001d1c, 0x81f5: 0xf0001d1c, 0x81f6: 0xf0001d1c, 0x81f7: 0xf0001d1c, + 0x81f8: 0xf0001d1c, 0x81f9: 0xf0001d1d, 0x81fa: 0xe0002710, 0x81fb: 0xe000270d, + 0x81fc: 0xe000277f, 0x81fd: 0xe0002707, 0x81fe: 0xe0002704, 0x81ff: 0xe000270a, + // Block 0x208, offset 0x8200 + 0x8200: 0xf0001d1c, 0x8201: 0xf0001d1d, 0x8202: 0xe00009b7, 0x8203: 0xf0001c1d, + 0x8204: 0xf0001c1c, 0x8205: 0xf0001c1c, 0x8206: 0xe0000a66, 0x8207: 0xe0000a7a, + 0x8208: 0xf0001d1c, 0x8209: 0xf0001c1d, 0x820a: 0xf0001c1c, 0x820b: 0xf0001d1d, + 0x820c: 0xf0001c1c, 0x820d: 0xf0001d1d, 0x820e: 0xf0001d1d, 0x820f: 0xf0001c1c, + 0x8210: 0xf0001c1c, 0x8211: 0xf0001c1c, 0x8212: 0xe0000d0d, 0x8213: 0xf0001c1c, + 0x8214: 0xf0001c1c, 0x8215: 0xe0000d3a, 0x8216: 0xe0000d46, 0x8217: 0xf0001d1d, + 0x8218: 0xe0000eb0, 0x8219: 0xe0000eb8, 0x821a: 0xf0001d1d, 0x821b: 0xf0001c1c, + 0x821c: 0xf0001c1d, 0x821d: 0xe0002740, 0x821e: 0xe00010b2, 0x821f: 0xe00009c8, + 0x8220: 0xf0001f04, 0x8221: 0xf0001f04, 0x8222: 0xf0001f04, 0x8223: 0xf0001f04, + 0x8224: 0xf0001f04, 0x8225: 0xf0001f04, 0x8226: 0xf0001f04, 0x8227: 0xf0001f04, + 0x8228: 0xf0001f04, 0x8229: 0xf0000404, 0x822a: 0xf0000404, 0x822b: 0xf0000404, + 0x822c: 0xf0000404, 0x822d: 0xf0000404, 0x822e: 0xf0000404, 0x822f: 0xf0000404, + 0x8230: 0xf0000404, 0x8231: 0xf0000404, 0x8232: 0xf0000404, 0x8233: 0xf0000404, + 0x8234: 0xf0000404, 0x8235: 0xf0000404, 0x8236: 0xf0000404, 0x8237: 0xf0000404, + 0x8238: 0xf0000404, 0x8239: 0xf0000404, 0x823a: 0xf0000404, 0x823b: 0xf0000404, + 0x823c: 0xf0000404, 0x823d: 0xf0000404, 0x823e: 0xf0000404, 0x823f: 0xe0000bdf, + // Block 0x209, offset 0x8240 + 0x8240: 0xf0001f04, 0x8241: 0xf0001f04, 0x8242: 0xf0001f04, 0x8243: 0xf0001f04, + 0x8244: 0xf0001f04, 0x8245: 0xf0001f04, 0x8246: 0xf0001f04, 0x8247: 0xf0001f04, + 0x8248: 0xf0001f04, 0x8249: 0xf0001f04, 0x824a: 0xf0001f04, + 0x8250: 0xf0000a04, 0x8251: 0xf0000a04, 0x8252: 0xf0000a04, 0x8253: 0xf0000a04, + 0x8254: 0xf0000a04, 0x8255: 0xf0000a04, 0x8256: 0xf0000a04, 0x8257: 0xf0000a04, + 0x8258: 0xf0000a04, 0x8259: 0xf0000a04, 0x825a: 0xf0000a04, 0x825b: 0xf0000a04, + 0x825c: 0xf0000a04, 0x825d: 0xf0000a04, 0x825e: 0xf0000a04, 0x825f: 0xf0000a04, + 0x8260: 0xf0000a04, 0x8261: 0xf0000a04, 0x8262: 0xf0000a04, 0x8263: 0xf0000a04, + 0x8264: 0xf0000a04, 0x8265: 0xf0000a04, 0x8266: 0xe0002700, 0x8267: 0xf0000a04, + 0x8268: 0xf0000a04, 0x8269: 0xf0000a04, 0x826a: 0xf0000a04, 0x826b: 0x002c3a8c, + 0x826c: 0x002f7a8c, 0x826d: 0xf0000c0c, 0x826e: 0xe0002746, + 0x8270: 0x002bde9d, 0x8271: 0x002c0a9d, 0x8272: 0x002c3a9d, 0x8273: 0x002c629d, + 0x8274: 0x002c989d, 0x8275: 0x002d089d, 0x8276: 0x002d229d, 0x8277: 0x002d689d, + 0x8278: 0x002d9a9d, 0x8279: 0x002dcc9d, 0x827a: 0x002dfe9d, 0x827b: 0x002e229d, + 0x827c: 0x002e829d, 0x827d: 0x002e9e9d, 0x827e: 0x002ee29d, 0x827f: 0x002f2c9d, + // Block 0x20a, offset 0x8280 + 0x8280: 0x002f569d, 0x8281: 0x002f7a9d, 0x8282: 0x002fe69d, 0x8283: 0x00302c9d, + 0x8284: 0x00306c9d, 0x8285: 0x0030be9d, 0x8286: 0x0030e29d, 0x8287: 0x0030f69d, + 0x8288: 0x0031009d, 0x8289: 0x00312a9d, 0x828a: 0xf0001d1d, 0x828b: 0xf0001d1d, + 0x828c: 0xf0001d1d, 0x828d: 0xf0001d1d, 0x828e: 0xe0000ebc, 0x828f: 0xe0002743, + 0x8290: 0x002bde8c, 0x8291: 0x002c0a8c, 0x8292: 0x002c3a8c, 0x8293: 0x002c628c, + 0x8294: 0x002c988c, 0x8295: 0x002d088c, 0x8296: 0x002d228c, 0x8297: 0x002d688c, + 0x8298: 0x002d9a8c, 0x8299: 0x002dcc8c, 0x829a: 0x002dfe8c, 0x829b: 0x002e228c, + 0x829c: 0x002e828c, 0x829d: 0x002e9e8c, 0x829e: 0x002ee28c, 0x829f: 0x002f2c8c, + 0x82a0: 0x002f568c, 0x82a1: 0x002f7a8c, 0x82a2: 0x002fe68c, 0x82a3: 0x00302c8c, + 0x82a4: 0x00306c8c, 0x82a5: 0x0030be8c, 0x82a6: 0x0030e28c, 0x82a7: 0x0030f68c, + 0x82a8: 0x0031008c, 0x82a9: 0x00312a8c, 0x82aa: 0xf0001414, 0x82ab: 0xf0001414, + 0x82b0: 0x002bde9d, 0x82b1: 0x002c0a9d, 0x82b2: 0x002c3a9d, 0x82b3: 0x002c629d, + 0x82b4: 0x002c989d, 0x82b5: 0x002d089d, 0x82b6: 0x002d229d, 0x82b7: 0x002d689d, + 0x82b8: 0x002d9a9d, 0x82b9: 0x002dcc9d, 0x82ba: 0x002dfe9d, 0x82bb: 0x002e229d, + 0x82bc: 0x002e829d, 0x82bd: 0x002e9e9d, 0x82be: 0x002ee29d, 0x82bf: 0x002f2c9d, + // Block 0x20b, offset 0x82c0 + 0x82c0: 0xa0000000, 0x82c1: 0xa0000000, 0x82c2: 0xa0000000, 0x82c3: 0xa0000000, + 0x82c4: 0xa0000000, 0x82c5: 0xa0000000, 0x82c6: 0xa0000000, 0x82c7: 0xa0000000, + 0x82c8: 0xa0000000, 0x82c9: 0x40020020, 0x82ca: 0x40020220, 0x82cb: 0x40020420, + 0x82cc: 0x40020620, 0x82cd: 0x40020820, 0x82ce: 0xa0000000, 0x82cf: 0xa0000000, + 0x82d0: 0xa0000000, 0x82d1: 0xa0000000, 0x82d2: 0xa0000000, 0x82d3: 0xa0000000, + 0x82d4: 0xa0000000, 0x82d5: 0xa0000000, 0x82d6: 0xa0000000, 0x82d7: 0xa0000000, + 0x82d8: 0xa0000000, 0x82d9: 0xa0000000, 0x82da: 0xa0000000, 0x82db: 0xa0000000, + 0x82dc: 0xa0000000, 0x82dd: 0xa0000000, 0x82de: 0xa0000000, 0x82df: 0xa0000000, + 0x82e0: 0x40021220, 0x82e1: 0x4002ba20, 0x82e2: 0xa0002402, 0x82e3: 0x4004ea20, + 0x82e4: 0x4027de20, 0x82e5: 0x4004ec20, 0x82e6: 0x4004e620, 0x82e7: 0xa0002202, + 0x82e8: 0x4003f420, 0x82e9: 0x4003f620, 0x82ea: 0x4004d820, 0x82eb: 0x40093820, + 0x82ec: 0x40024020, 0x82ed: 0x40021a20, 0x82ee: 0x4002e420, 0x82ef: 0x4004e220, + 0x82f0: 0x4029cc20, 0x82f1: 0x4029ce20, 0x82f2: 0x4029d020, 0x82f3: 0x4029d220, + 0x82f4: 0x4029d420, 0x82f5: 0x4029d620, 0x82f6: 0x4029d820, 0x82f7: 0x4029da20, + 0x82f8: 0x4029dc20, 0x82f9: 0x4029de20, 0x82fa: 0x40026c20, 0x82fb: 0x40026220, + 0x82fc: 0x40094020, 0x82fd: 0xc32f0851, 0x82fe: 0x40094420, 0x82ff: 0x4002c420, + // Block 0x20c, offset 0x8300 + 0x8300: 0x4004d620, 0x8301: 0x002bde88, 0x8302: 0x002c0a88, 0x8303: 0x002c3a88, + 0x8304: 0x002c6288, 0x8305: 0x002c9888, 0x8306: 0x002d0888, 0x8307: 0x002d2288, + 0x8308: 0x002d6888, 0x8309: 0x002d9a88, 0x830a: 0x002dcc88, 0x830b: 0x002dfe88, + 0x830c: 0xc0030002, 0x830d: 0x002e8288, 0x830e: 0x002e9e88, 0x830f: 0x002ee288, + 0x8310: 0x002f2c88, 0x8311: 0x002f5688, 0x8312: 0x002f7a88, 0x8313: 0x002fe688, + 0x8314: 0x00302c88, 0x8315: 0x00306c88, 0x8316: 0x0030be88, 0x8317: 0x0030e288, + 0x8318: 0x0030f688, 0x8319: 0x00310088, 0x831a: 0x00312a88, 0x831b: 0x4003f820, + 0x831c: 0x4004e420, 0x831d: 0x4003fa20, 0x831e: 0x40062420, 0x831f: 0x40021620, + 0x8320: 0x40061e20, 0x8321: 0x402bde20, 0x8322: 0x402c0a20, 0x8323: 0x402c3a20, + 0x8324: 0x402c6220, 0x8325: 0x402c9820, 0x8326: 0x402d0820, 0x8327: 0x402d2220, + 0x8328: 0x402d6820, 0x8329: 0x402d9a20, 0x832a: 0x402dcc20, 0x832b: 0x402dfe20, + 0x832c: 0xc0000002, 0x832d: 0x402e8220, 0x832e: 0x402e9e20, 0x832f: 0x402ee220, + 0x8330: 0x402f2c20, 0x8331: 0x402f5620, 0x8332: 0x402f7a20, 0x8333: 0x402fe620, + 0x8334: 0x40302c20, 0x8335: 0x40306c20, 0x8336: 0x4030be20, 0x8337: 0x4030e220, + 0x8338: 0x4030f620, 0x8339: 0x40310020, 0x833a: 0x40312a20, 0x833b: 0x4003fc20, + 0x833c: 0x40094820, 0x833d: 0x4003fe20, 0x833e: 0x40094c20, 0x833f: 0xa0000000, + // Block 0x20d, offset 0x8340 + 0x8340: 0x40055620, 0x8341: 0xa1809102, 0x8342: 0xa1909002, 0x8343: 0x40055820, + 0x8344: 0xae600000, 0x8345: 0xadc00000, 0x8346: 0x40055a20, 0x8347: 0xa1208d02, + 0x8350: 0x40389020, 0x8351: 0x40389220, 0x8352: 0x40389420, 0x8353: 0x40389620, + 0x8354: 0x40389820, 0x8355: 0x40389a20, 0x8356: 0x40389c20, 0x8357: 0x40389e20, + 0x8358: 0x4038a020, 0x8359: 0x4038a220, 0x835a: 0x0038a499, 0x835b: 0x4038a420, + 0x835c: 0x4038a620, 0x835d: 0x0038a899, 0x835e: 0x4038a820, 0x835f: 0x0038aa99, + 0x8360: 0x4038aa20, 0x8361: 0x4038ac20, 0x8362: 0x4038ae20, 0x8363: 0x0038b099, + 0x8364: 0x4038b020, 0x8365: 0x0038b299, 0x8366: 0x4038b220, 0x8367: 0x4038b420, + 0x8368: 0x4038b620, 0x8369: 0x4038b820, 0x836a: 0x4038ba20, + 0x8370: 0xe00014ff, 0x8371: 0xe0001502, 0x8372: 0xe0001511, 0x8373: 0xa0002102, + 0x8374: 0xa0002302, + // Block 0x20e, offset 0x8380 + 0x8380: 0xa0002502, 0x8381: 0x4039fc20, 0x8382: 0x403a1220, 0x8383: 0x403a1a20, + 0x8384: 0x403a4020, 0x8385: 0x403a4e20, 0x8386: 0x403a5620, 0x8387: 0x403a6820, + 0x8388: 0xc3350171, 0x8389: 0x403a9222, 0x838a: 0xc3370171, 0x838b: 0xa1b0a202, + 0x838c: 0xa1c0a502, 0x838d: 0xa1d0a902, 0x838e: 0xa1e0ad02, 0x838f: 0xa1f0b202, + 0x8390: 0xa200b602, 0x8391: 0xa210ba02, 0x8392: 0xa220bc02, 0x8393: 0xae60bd02, + 0x8394: 0xae60be02, 0x8395: 0xadc0bf02, 0x8396: 0xadc0c102, 0x8397: 0xae60c202, + 0x8398: 0xae60c302, 0x8399: 0xae60c402, 0x839a: 0xae60c502, 0x839b: 0xae60c602, + 0x839c: 0xadc0c702, 0x839d: 0xae60c802, 0x839e: 0xae60c902, 0x839f: 0xadc0c002, + 0x83a0: 0xe000015e, 0x83a1: 0xe00001e6, 0x83a2: 0xe0000301, 0x83a3: 0xe00003db, + 0x83a4: 0xe00004b6, 0x83a5: 0xe0000580, 0x83a6: 0xe000064b, 0x83a7: 0xe00006f3, + 0x83a8: 0xe000079f, 0x83a9: 0xe0000844, 0x83aa: 0x4004ee20, 0x83ab: 0x40024c20, + 0x83ac: 0x40024e20, 0x83ad: 0x4004de20, 0x83ae: 0x40393a20, 0x83af: 0x403a1020, + 0x83b0: 0xa230d102, 0x83b1: 0x40392420, 0x83b2: 0x40392220, 0x83b3: 0x40392a20, + 0x83b4: 0x00391c84, 0x83b5: 0xf0000404, 0x83b6: 0xf0000404, 0x83b7: 0xf0000404, + 0x83b8: 0xf0000404, 0x83b9: 0x40395a20, 0x83ba: 0x40395c20, 0x83bb: 0x40393e20, + 0x83bc: 0x40395e20, 0x83bd: 0x40396020, 0x83be: 0x40394020, 0x83bf: 0x40396220, + // Block 0x20f, offset 0x83c0 + 0x83c1: 0x40491020, 0x83c2: 0x40491220, 0x83c3: 0x40491420, + 0x83c4: 0x40491620, 0x83c5: 0x40491820, 0x83c6: 0x40491a20, 0x83c7: 0x40491c20, + 0x83c8: 0x40491e20, 0x83c9: 0x40492020, 0x83ca: 0x40492220, 0x83cb: 0x40492420, + 0x83cc: 0x40492620, 0x83cd: 0x40492820, 0x83ce: 0x40492a20, 0x83cf: 0x40492c20, + 0x83d0: 0x40492e20, 0x83d1: 0x40493020, 0x83d2: 0x40493220, 0x83d3: 0x40493420, + 0x83d4: 0x40493620, 0x83d5: 0x40493820, 0x83d6: 0x40493a20, 0x83d7: 0x40493c20, + 0x83d8: 0x40493e20, 0x83d9: 0x40494020, 0x83da: 0x40494220, 0x83db: 0x40494420, + 0x83dc: 0x40494620, 0x83dd: 0x40494820, 0x83de: 0x40494a20, 0x83df: 0x40494c20, + 0x83e0: 0x40494e20, 0x83e1: 0x40495020, 0x83e2: 0x40495220, 0x83e3: 0x40495420, + 0x83e4: 0x40495620, 0x83e5: 0x40495820, 0x83e6: 0x40495a20, 0x83e7: 0x40495c20, + 0x83e8: 0x40495e20, 0x83e9: 0x40496020, 0x83ea: 0x40496220, 0x83eb: 0x40496420, + 0x83ec: 0x40496620, 0x83ed: 0x40496820, 0x83ee: 0x40496a20, 0x83ef: 0x40496c20, + 0x83f0: 0x40496e20, 0x83f1: 0x40497020, 0x83f2: 0x40497220, 0x83f3: 0x40497420, + 0x83f4: 0x40497620, 0x83f5: 0x40497820, 0x83f6: 0x40497a20, 0x83f7: 0x40497c20, + 0x83f8: 0x826724bf, 0x83f9: 0x826724c0, 0x83fa: 0xa0002602, + 0x83ff: 0x4027f420, + // Block 0x210, offset 0x8400 + 0x8400: 0xa0000000, 0x8401: 0xa0000000, 0x8402: 0xa0000000, 0x8403: 0xa0000000, + 0x8404: 0xa0000000, 0x8405: 0xa0000000, 0x8406: 0xa0000000, 0x8407: 0xa0000000, + 0x8408: 0xa0000000, 0x8409: 0x40020020, 0x840a: 0x40020220, 0x840b: 0x40020420, + 0x840c: 0x40020620, 0x840d: 0x40020820, 0x840e: 0xa0000000, 0x840f: 0xa0000000, + 0x8410: 0xa0000000, 0x8411: 0xa0000000, 0x8412: 0xa0000000, 0x8413: 0xa0000000, + 0x8414: 0xa0000000, 0x8415: 0xa0000000, 0x8416: 0xa0000000, 0x8417: 0xa0000000, + 0x8418: 0xa0000000, 0x8419: 0xa0000000, 0x841a: 0xa0000000, 0x841b: 0xa0000000, + 0x841c: 0xa0000000, 0x841d: 0xa0000000, 0x841e: 0xa0000000, 0x841f: 0xa0000000, + 0x8420: 0x40021220, 0x8421: 0x4002ba20, 0x8422: 0x4003e020, 0x8423: 0x4004ea20, + 0x8424: 0x4027de20, 0x8425: 0x4004ec20, 0x8426: 0x4004e620, 0x8427: 0x4003d220, + 0x8428: 0x4003f420, 0x8429: 0x4003f620, 0x842a: 0x4004d820, 0x842b: 0x40093820, + 0x842c: 0x40024020, 0x842d: 0x40021a20, 0x842e: 0x4002e420, 0x842f: 0x4004e220, + 0x8430: 0x4029cc20, 0x8431: 0x4029ce20, 0x8432: 0x4029d020, 0x8433: 0x4029d220, + 0x8434: 0x4029d420, 0x8435: 0x4029d620, 0x8436: 0x4029d820, 0x8437: 0x4029da20, + 0x8438: 0x4029dc20, 0x8439: 0x4029de20, 0x843a: 0x40026c20, 0x843b: 0x40026220, + 0x843c: 0x40094020, 0x843d: 0xc32f0851, 0x843e: 0x40094420, 0x843f: 0x4002c420, + // Block 0x211, offset 0x8440 + 0x8440: 0x4004d620, 0x8441: 0x002bde88, 0x8442: 0x002c0a88, 0x8443: 0xc3b708f1, + 0x8444: 0xc3bd0b13, 0x8445: 0x002c9888, 0x8446: 0x002d0888, 0x8447: 0x002d2288, + 0x8448: 0x002d6888, 0x8449: 0x002d9a88, 0x844a: 0x002dcc88, 0x844b: 0x002dfe88, + 0x844c: 0xc3c60be4, 0x844d: 0x002e8288, 0x844e: 0xc3cb0c52, 0x844f: 0x002ee288, + 0x8450: 0x002f2c88, 0x8451: 0x002f5688, 0x8452: 0x002f7a88, 0x8453: 0xc34908d1, + 0x8454: 0x00302c88, 0x8455: 0x00306c88, 0x8456: 0x0030be88, 0x8457: 0x0030e288, + 0x8458: 0x0030f688, 0x8459: 0x00310088, 0x845a: 0xc37f08d1, 0x845b: 0x4003f820, + 0x845c: 0x4004e420, 0x845d: 0x4003fa20, 0x845e: 0x40062420, 0x845f: 0x40021620, + 0x8460: 0x40061e20, 0x8461: 0x402bde20, 0x8462: 0x402c0a20, 0x8463: 0xc3b408f1, + 0x8464: 0xc3ba0ac2, 0x8465: 0x402c9820, 0x8466: 0x402d0820, 0x8467: 0x402d2220, + 0x8468: 0x402d6820, 0x8469: 0x402d9a20, 0x846a: 0x402dcc20, 0x846b: 0x402dfe20, + 0x846c: 0xc3c20b93, 0x846d: 0x402e8220, 0x846e: 0xc3670c41, 0x846f: 0x402ee220, + 0x8470: 0x402f2c20, 0x8471: 0x402f5620, 0x8472: 0x402f7a20, 0x8473: 0xc34708d1, + 0x8474: 0x40302c20, 0x8475: 0x40306c20, 0x8476: 0x4030be20, 0x8477: 0x4030e220, + 0x8478: 0x4030f620, 0x8479: 0x40310020, 0x847a: 0xc37d08d1, 0x847b: 0x4003fc20, + 0x847c: 0x40094820, 0x847d: 0x4003fe20, 0x847e: 0x40094c20, 0x847f: 0xa0000000, + // Block 0x212, offset 0x8480 + 0x8480: 0xe0000983, 0x8481: 0xe0000980, 0x8482: 0xe00008fb, 0x8483: 0xe00008f8, + 0x8484: 0xe000097d, 0x8485: 0xe000097a, 0x8486: 0x002c3e83, 0x8487: 0x402c3e20, + 0x8488: 0xe0000a3e, 0x8489: 0xe0000a3b, 0x848a: 0xe0000a4a, 0x848b: 0xe0000a47, + 0x848c: 0x002c3c83, 0x848d: 0x402c3c20, 0x848e: 0xe0000a86, 0x848f: 0xe0000a83, + 0x8490: 0x002c6683, 0x8491: 0x402c6620, 0x8492: 0xe0000b46, 0x8493: 0xe0000b43, + 0x8494: 0xe0000aee, 0x8495: 0xe0000aeb, 0x8496: 0xe0000b2c, 0x8497: 0xe0000b29, + 0x8498: 0xe0000b40, 0x8499: 0xe0000b3d, 0x849a: 0xe0000b1a, 0x849b: 0xe0000b17, + 0x849c: 0xe0000bb8, 0x849d: 0xe0000bb5, 0x849e: 0xe0000bb2, 0x849f: 0xe0000baf, + 0x84a0: 0xe0000bc4, 0x84a1: 0xe0000bc1, 0x84a2: 0xe0000bca, 0x84a3: 0xe0000bc7, + 0x84a4: 0xe0000bee, 0x84a5: 0xe0000beb, 0x84a6: 0xe0000c1b, 0x84a7: 0xe0000c18, + 0x84a8: 0xe0000c51, 0x84a9: 0xe0000c4e, 0x84aa: 0xe0000c60, 0x84ab: 0xe0000c5d, + 0x84ac: 0xe0000c31, 0x84ad: 0xe0000c2e, 0x84ae: 0xe0000c5a, 0x84af: 0xe0000c57, + 0x84b0: 0xe0000c54, 0x84b1: 0x402da220, 0x84b2: 0xf0000a0a, 0x84b3: 0xf0000404, + 0x84b4: 0xe0000c8a, 0x84b5: 0xe0000c87, 0x84b6: 0xe0000c9f, 0x84b7: 0xe0000c9c, + 0x84b8: 0x402f7220, 0x84b9: 0xe0000ccc, 0x84ba: 0xe0000cc9, 0x84bb: 0xe0000cd8, + 0x84bc: 0xe0000cd5, 0x84bd: 0xe0000cd2, 0x84be: 0xe0000ccf, 0x84bf: 0xe0000d04, + // Block 0x213, offset 0x84c0 + 0x84c0: 0xe0000cfe, 0x84c1: 0xe0000cf8, 0x84c2: 0xe0000cf5, 0x84c3: 0xe0000d51, + 0x84c4: 0xe0000d4e, 0x84c5: 0xe0000d6f, 0x84c6: 0xe0000d6c, 0x84c7: 0xe0000d5d, + 0x84c8: 0xe0000d5a, 0x84c9: 0xf0000404, 0x84ca: 0x002eda88, 0x84cb: 0x402eda20, + 0x84cc: 0xe0000e2e, 0x84cd: 0xe0000e2b, 0x84ce: 0xe0000da0, 0x84cf: 0xe0000d9d, + 0x84d0: 0xe0000de0, 0x84d1: 0xe0000ddd, 0x84d2: 0xe0000e93, 0x84d3: 0xe0000e8f, + 0x84d4: 0xe0000eca, 0x84d5: 0xe0000ec7, 0x84d6: 0xe0000edc, 0x84d7: 0xe0000ed9, + 0x84d8: 0xe0000ed0, 0x84d9: 0xe0000ecd, 0x84da: 0xe0000f1f, 0x84db: 0xe0000f1c, + 0x84dc: 0xe0000f2d, 0x84dd: 0xe0000f2a, 0x84de: 0xe0000f47, 0x84df: 0xe0000f44, + 0x84e0: 0x002fe883, 0x84e1: 0x402fe820, 0x84e2: 0xe0000f99, 0x84e3: 0xe0000f96, + 0x84e4: 0xe0000f8a, 0x84e5: 0xe0000f87, 0x84e6: 0x00303688, 0x84e7: 0x40303620, + 0x84e8: 0xe000102b, 0x84e9: 0xe0001028, 0x84ea: 0xe000103f, 0x84eb: 0xe000103c, + 0x84ec: 0xe0000fe7, 0x84ed: 0xe0000fe4, 0x84ee: 0xe0000ff9, 0x84ef: 0xe0000ff6, + 0x84f0: 0xe0001025, 0x84f1: 0xe0001022, 0x84f2: 0xe0001039, 0x84f3: 0xe0001036, + 0x84f4: 0xe00010d8, 0x84f5: 0xe00010d5, 0x84f6: 0xe000110e, 0x84f7: 0xe000110b, + 0x84f8: 0xe0001117, 0x84f9: 0xe000113b, 0x84fa: 0xe0001138, 0x84fb: 0xe000114d, + 0x84fc: 0xe000114a, 0x84fd: 0x00312c83, 0x84fe: 0x40312c20, 0x84ff: 0xe0000f64, + // Block 0x214, offset 0x8500 + 0x8500: 0x40321220, 0x8501: 0x40321a20, 0x8502: 0x40322220, 0x8503: 0x40322a20, + 0x8504: 0x002c6487, 0x8505: 0x002c6485, 0x8506: 0x002c6483, 0x8507: 0x002e2487, + 0x8508: 0x002e2485, 0x8509: 0x002e2483, 0x850a: 0x002ea087, 0x850b: 0x002ea085, + 0x850c: 0x002ea083, 0x850d: 0xe0000947, 0x850e: 0xe0000944, 0x850f: 0xe0000c3d, + 0x8510: 0xe0000c3a, 0x8511: 0xe0000dcc, 0x8512: 0xe0000dc9, 0x8513: 0xe0000ff3, + 0x8514: 0xe0000ff0, 0x8515: 0xe000101e, 0x8516: 0xe000101a, 0x8517: 0xe0001006, + 0x8518: 0xe0001002, 0x8519: 0xe0001016, 0x851a: 0xe0001012, 0x851b: 0xe000100e, + 0x851c: 0xe000100a, 0x851d: 0x402cae20, 0x851e: 0xe0000962, 0x851f: 0xe000095e, + 0x8520: 0xe0000976, 0x8521: 0xe0000972, 0x8522: 0xe00009f4, 0x8523: 0xe00009ef, + 0x8524: 0x002d3a88, 0x8525: 0x402d3a20, 0x8526: 0xe0000bbe, 0x8527: 0xe0000bbb, + 0x8528: 0xe0000c99, 0x8529: 0xe0000c96, 0x852a: 0xe0000e20, 0x852b: 0xe0000e1d, + 0x852c: 0xe0000e27, 0x852d: 0xe0000e23, 0x852e: 0xe0001162, 0x852f: 0xe000115f, + 0x8530: 0xe0000c8d, 0x8531: 0xf0000a0a, 0x8532: 0xf000040a, 0x8533: 0xf0000404, + 0x8534: 0xe0000bac, 0x8535: 0xe0000ba9, 0x8536: 0x002d7888, 0x8537: 0x00319488, + 0x8538: 0xe0000d57, 0x8539: 0xe0000d54, 0x853a: 0xe0000954, 0x853b: 0xe0000950, + 0x853c: 0xe00009ea, 0x853d: 0xe00009e5, 0x853e: 0xe0000e19, 0x853f: 0xe0000e15, + // Block 0x215, offset 0x8540 + 0x8540: 0xe00009b1, 0x8541: 0xe00009ae, 0x8542: 0xe0000a22, 0x8543: 0xe0000a1f, + 0x8544: 0xe0000a28, 0x8545: 0xe0000a25, 0x8546: 0xe0000a2e, 0x8547: 0xe0000a2b, + 0x8548: 0xe0002785, 0x8549: 0xe0002782, 0x854a: 0xe0000a8c, 0x854b: 0xe0000a89, + 0x854c: 0xe0000a98, 0x854d: 0xe0000a95, 0x854e: 0xe0000aa4, 0x854f: 0xe0000aa1, + 0x8550: 0xe0000a92, 0x8551: 0xe0000a8f, 0x8552: 0xe0000a9e, 0x8553: 0xe0000a9b, + 0x8554: 0xe0000b55, 0x8555: 0xe0000b51, 0x8556: 0xe0000b4d, 0x8557: 0xe0000b49, + 0x8558: 0xe0000b7c, 0x8559: 0xe0000b79, 0x855a: 0xe0000b82, 0x855b: 0xe0000b7f, + 0x855c: 0xe0000b39, 0x855d: 0xe0000b35, 0x855e: 0xe0000b8c, 0x855f: 0xe0000b89, + 0x8560: 0xe0000bd0, 0x8561: 0xe0000bcd, 0x8562: 0xe0000c00, 0x8563: 0xe0000bfd, + 0x8564: 0xe0000c0c, 0x8565: 0xe0000c09, 0x8566: 0xe0000bfa, 0x8567: 0xe0000bf7, + 0x8568: 0xe0000c06, 0x8569: 0xe0000c03, 0x856a: 0xe0000c12, 0x856b: 0xe0000c0f, + 0x856c: 0xe0000c7e, 0x856d: 0xe0000c7b, 0x856e: 0xe0000c4a, 0x856f: 0xe0000c46, + 0x8570: 0xe0000c93, 0x8571: 0xe0000c90, 0x8572: 0xe0000cab, 0x8573: 0xe0000ca8, + 0x8574: 0xe0000cb1, 0x8575: 0xe0000cae, 0x8576: 0xe0000cde, 0x8577: 0xe0000cdb, + 0x8578: 0xe0000ce5, 0x8579: 0xe0000ce1, 0x857a: 0xe0000cf2, 0x857b: 0xe0000cef, + 0x857c: 0xe0000cec, 0x857d: 0xe0000ce9, 0x857e: 0xe0000d1e, 0x857f: 0xe0000d1b, + // Block 0x216, offset 0x8580 + 0x8580: 0xe0000d24, 0x8581: 0xe0000d21, 0x8582: 0xe0000d2a, 0x8583: 0xe0000d27, + 0x8584: 0xe0000d69, 0x8585: 0xe0000d66, 0x8586: 0xe0000d7b, 0x8587: 0xe0000d78, + 0x8588: 0xe0000d87, 0x8589: 0xe0000d84, 0x858a: 0xe0000d81, 0x858b: 0xe0000d7e, + 0x858c: 0xe0000ded, 0x858d: 0xe0000de9, 0x858e: 0xe0000df5, 0x858f: 0xe0000df1, + 0x8590: 0xe0000e3d, 0x8591: 0xe0000e39, 0x8592: 0xe0000e35, 0x8593: 0xe0000e31, + 0x8594: 0xe0000ea7, 0x8595: 0xe0000ea4, 0x8596: 0xe0000ead, 0x8597: 0xe0000eaa, + 0x8598: 0xe0000ed6, 0x8599: 0xe0000ed3, 0x859a: 0xe0000ef4, 0x859b: 0xe0000ef1, + 0x859c: 0xe0000efb, 0x859d: 0xe0000ef7, 0x859e: 0xe0000f02, 0x859f: 0xe0000eff, + 0x85a0: 0xe0000f41, 0x85a1: 0xe0000f3e, 0x85a2: 0xe0000f53, 0x85a3: 0xe0000f50, + 0x85a4: 0xe0000f26, 0x85a5: 0xe0000f22, 0x85a6: 0xe0002652, 0x85a7: 0xe000264f, + 0x85a8: 0xe0000f5a, 0x85a9: 0xe0000f56, 0x85aa: 0xe0000f93, 0x85ab: 0xe0000f90, + 0x85ac: 0xe0000f9f, 0x85ad: 0xe0000f9c, 0x85ae: 0xe0000fb1, 0x85af: 0xe0000fae, + 0x85b0: 0xe0000fab, 0x85b1: 0xe0000fa8, 0x85b2: 0xe0001093, 0x85b3: 0xe0001090, + 0x85b4: 0xe000109f, 0x85b5: 0xe000109c, 0x85b6: 0xe0001099, 0x85b7: 0xe0001096, + 0x85b8: 0xe0001032, 0x85b9: 0xe000102e, 0x85ba: 0xe0001046, 0x85bb: 0xe0001042, + 0x85bc: 0xe00010a9, 0x85bd: 0xe00010a6, 0x85be: 0xe00010af, 0x85bf: 0xe00010ac, + // Block 0x217, offset 0x85c0 + 0x85c0: 0xa0000000, 0x85c1: 0xa0000000, 0x85c2: 0xa0000000, 0x85c3: 0xa0000000, + 0x85c4: 0xa0000000, 0x85c5: 0xa0000000, 0x85c6: 0xa0000000, 0x85c7: 0xa0000000, + 0x85c8: 0xa0000000, 0x85c9: 0x40020020, 0x85ca: 0x40020220, 0x85cb: 0x40020420, + 0x85cc: 0x40020620, 0x85cd: 0x40020820, 0x85ce: 0xa0000000, 0x85cf: 0xa0000000, + 0x85d0: 0xa0000000, 0x85d1: 0xa0000000, 0x85d2: 0xa0000000, 0x85d3: 0xa0000000, + 0x85d4: 0xa0000000, 0x85d5: 0xa0000000, 0x85d6: 0xa0000000, 0x85d7: 0xa0000000, + 0x85d8: 0xa0000000, 0x85d9: 0xa0000000, 0x85da: 0xa0000000, 0x85db: 0xa0000000, + 0x85dc: 0xa0000000, 0x85dd: 0xa0000000, 0x85de: 0xa0000000, 0x85df: 0xa0000000, + 0x85e0: 0x40021220, 0x85e1: 0x4002ba20, 0x85e2: 0x4003e020, 0x85e3: 0x4004ea20, + 0x85e4: 0x4027de20, 0x85e5: 0x4004ec20, 0x85e6: 0x4004e620, 0x85e7: 0x4003d220, + 0x85e8: 0x4003f420, 0x85e9: 0x4003f620, 0x85ea: 0x4004d820, 0x85eb: 0x40093820, + 0x85ec: 0x40024020, 0x85ed: 0x40021a20, 0x85ee: 0x4002e420, 0x85ef: 0x4004e220, + 0x85f0: 0x4029cc20, 0x85f1: 0x4029ce20, 0x85f2: 0x4029d020, 0x85f3: 0x4029d220, + 0x85f4: 0x4029d420, 0x85f5: 0x4029d620, 0x85f6: 0x4029d820, 0x85f7: 0x4029da20, + 0x85f8: 0x4029dc20, 0x85f9: 0x4029de20, 0x85fa: 0x40026c20, 0x85fb: 0x40026220, + 0x85fc: 0x40094020, 0x85fd: 0xc32f0851, 0x85fe: 0x40094420, 0x85ff: 0x4002c420, + // Block 0x218, offset 0x8600 + 0x8600: 0x4004d620, 0x8601: 0xc3d20c71, 0x8602: 0x002c0a88, 0x8603: 0x002c3a88, + 0x8604: 0x002c6288, 0x8605: 0xc3d808b1, 0x8606: 0x002d0888, 0x8607: 0x002d2288, + 0x8608: 0x002d6888, 0x8609: 0xc3dc08b1, 0x860a: 0x002dcc88, 0x860b: 0x002dfe88, + 0x860c: 0xc0030002, 0x860d: 0x002e8288, 0x860e: 0x002e9e88, 0x860f: 0xc3e10cb1, + 0x8610: 0x002f2c88, 0x8611: 0x002f5688, 0x8612: 0x002f7a88, 0x8613: 0x002fe688, + 0x8614: 0x00302c88, 0x8615: 0xc3e608b1, 0x8616: 0x0030be88, 0x8617: 0x0030e288, + 0x8618: 0x0030f688, 0x8619: 0xc3ea08b1, 0x861a: 0x00312a88, 0x861b: 0x4003f820, + 0x861c: 0x4004e420, 0x861d: 0x4003fa20, 0x861e: 0x40062420, 0x861f: 0x40021620, + 0x8620: 0x40061e20, 0x8621: 0xc3ce0c71, 0x8622: 0x402c0a20, 0x8623: 0x402c3a20, + 0x8624: 0x402c6220, 0x8625: 0xc3d608b1, 0x8626: 0x402d0820, 0x8627: 0x402d2220, + 0x8628: 0x402d6820, 0x8629: 0xc3da08b1, 0x862a: 0x402dcc20, 0x862b: 0x402dfe20, + 0x862c: 0xc0000002, 0x862d: 0x402e8220, 0x862e: 0x402e9e20, 0x862f: 0xc3de0cb1, + 0x8630: 0x402f2c20, 0x8631: 0x402f5620, 0x8632: 0x402f7a20, 0x8633: 0x402fe620, + 0x8634: 0x40302c20, 0x8635: 0xc3e408b1, 0x8636: 0x4030be20, 0x8637: 0x4030e220, + 0x8638: 0x4030f620, 0x8639: 0xc3e808b1, 0x863a: 0x40312a20, 0x863b: 0x4003fc20, + 0x863c: 0x40094820, 0x863d: 0x4003fe20, 0x863e: 0x40094c20, 0x863f: 0xa0000000, + // Block 0x219, offset 0x8640 + 0x8640: 0xe00008f5, 0x8641: 0x002c0883, 0x8642: 0xe0000921, 0x8643: 0xe0000969, + 0x8644: 0x00320ca3, 0x8645: 0x00321083, 0x8646: 0x00320c83, 0x8647: 0xe0000a53, + 0x8648: 0xe0000ae8, 0x8649: 0x002d0683, 0x864a: 0xe0000af4, 0x864b: 0xe0000b20, + 0x864c: 0xe0000c2b, 0x864d: 0x002dca83, 0x864e: 0xe0000c37, 0x864f: 0xe0000c43, + 0x8650: 0x002c6483, 0x8651: 0xe0000d63, 0x8652: 0xe0000d9a, 0x8653: 0x002f2a83, + 0x8654: 0xe0000da6, 0x8655: 0xe0000de6, 0x8656: 0x00320e83, 0x8657: 0x40093e20, + 0x8658: 0x00320ea3, 0x8659: 0xe0000fe1, 0x865a: 0x0030bc83, 0x865b: 0xe0000fed, + 0x865c: 0xe0000fff, 0x865d: 0x00312883, 0x865e: 0x00318888, 0x865f: 0xe0000f7b, + 0x8660: 0xe00008f2, 0x8661: 0x402c0820, 0x8662: 0xe000091e, 0x8663: 0xe0000966, + 0x8664: 0x40320c21, 0x8665: 0x40321020, 0x8666: 0x40320c20, 0x8667: 0xe0000a4d, + 0x8668: 0xe0000ae5, 0x8669: 0x402d0620, 0x866a: 0xe0000af1, 0x866b: 0xe0000b1d, + 0x866c: 0xe0000c28, 0x866d: 0x402dca20, 0x866e: 0xe0000c34, 0x866f: 0xe0000c40, + 0x8670: 0x402c6420, 0x8671: 0xe0000d60, 0x8672: 0xe0000d97, 0x8673: 0x402f2a20, + 0x8674: 0xe0000da3, 0x8675: 0xe0000de3, 0x8676: 0x40320e20, 0x8677: 0x40093c20, + 0x8678: 0x40320e21, 0x8679: 0xe0000fde, 0x867a: 0x4030bc20, 0x867b: 0xe0000fea, + 0x867c: 0xe0000ffc, 0x867d: 0x40312820, 0x867e: 0x40318820, 0x867f: 0xe0001114, + // Block 0x21a, offset 0x8680 + 0x8680: 0xe0000983, 0x8681: 0xe0000980, 0x8682: 0xe00008fb, 0x8683: 0xe00008f8, + 0x8684: 0xe000097d, 0x8685: 0xe000097a, 0x8686: 0xe0000a38, 0x8687: 0xe0000a35, + 0x8688: 0xe0000a3e, 0x8689: 0xe0000a3b, 0x868a: 0xe0000a4a, 0x868b: 0xe0000a47, + 0x868c: 0xe0000a44, 0x868d: 0xe0000a41, 0x868e: 0xe0000a86, 0x868f: 0xe0000a83, + 0x8690: 0x002c62a3, 0x8691: 0x402c6221, 0x8692: 0xe0000b46, 0x8693: 0xe0000b43, + 0x8694: 0xe0000aee, 0x8695: 0xe0000aeb, 0x8696: 0xe0000b2c, 0x8697: 0xe0000b29, + 0x8698: 0xe0000b40, 0x8699: 0xe0000b3d, 0x869a: 0xe0000b1a, 0x869b: 0xe0000b17, + 0x869c: 0xe0000bb8, 0x869d: 0xe0000bb5, 0x869e: 0xe0000bb2, 0x869f: 0xe0000baf, + 0x86a0: 0xe0000bc4, 0x86a1: 0xe0000bc1, 0x86a2: 0xe0000bca, 0x86a3: 0xe0000bc7, + 0x86a4: 0xe0000bee, 0x86a5: 0xe0000beb, 0x86a6: 0xe0000c1b, 0x86a7: 0xe0000c18, + 0x86a8: 0xe0000c51, 0x86a9: 0xe0000c4e, 0x86aa: 0xe0000c60, 0x86ab: 0xe0000c5d, + 0x86ac: 0xe0000c31, 0x86ad: 0xe0000c2e, 0x86ae: 0xe0000c5a, 0x86af: 0xe0000c57, + 0x86b0: 0xe0000c54, 0x86b1: 0x402da220, 0x86b2: 0xf0000a0a, 0x86b3: 0xf0000404, + 0x86b4: 0xe0000c8a, 0x86b5: 0xe0000c87, 0x86b6: 0xe0000c9f, 0x86b7: 0xe0000c9c, + 0x86b8: 0x402f7220, 0x86b9: 0xe0000ccc, 0x86ba: 0xe0000cc9, 0x86bb: 0xe0000cd8, + 0x86bc: 0xe0000cd5, 0x86bd: 0xe0000cd2, 0x86be: 0xe0000ccf, 0x86bf: 0xe0000d04, + // Block 0x21b, offset 0x86c0 + 0x86c0: 0x40321220, 0x86c1: 0x40321a20, 0x86c2: 0x40322220, 0x86c3: 0x40322a20, + 0x86c4: 0xe0000ad5, 0x86c5: 0xe0000ad1, 0x86c6: 0xe0000acd, 0x86c7: 0xf0000a0a, + 0x86c8: 0xf000040a, 0x86c9: 0xf0000404, 0x86ca: 0xf0000a0a, 0x86cb: 0xf000040a, + 0x86cc: 0xf0000404, 0x86cd: 0xe0000947, 0x86ce: 0xe0000944, 0x86cf: 0xe0000c3d, + 0x86d0: 0xe0000c3a, 0x86d1: 0xe0000dcc, 0x86d2: 0xe0000dc9, 0x86d3: 0xe0000ff3, + 0x86d4: 0xe0000ff0, 0x86d5: 0xe000101e, 0x86d6: 0xe000101a, 0x86d7: 0xe00027c1, + 0x86d8: 0xe00027be, 0x86d9: 0xe0001016, 0x86da: 0xe0001012, 0x86db: 0xe000100e, + 0x86dc: 0xe000100a, 0x86dd: 0x402cae20, 0x86de: 0xe0002697, 0x86df: 0xe0002694, + 0x86e0: 0xe0000976, 0x86e1: 0xe0000972, 0x86e2: 0xe0002691, 0x86e3: 0xe000268e, + 0x86e4: 0x002d3a88, 0x86e5: 0x402d3a20, 0x86e6: 0xe0000bbe, 0x86e7: 0xe0000bbb, + 0x86e8: 0xe0000c99, 0x86e9: 0xe0000c96, 0x86ea: 0xe0000e20, 0x86eb: 0xe0000e1d, + 0x86ec: 0xe0000e27, 0x86ed: 0xe0000e23, 0x86ee: 0xe0001162, 0x86ef: 0xe000115f, + 0x86f0: 0xe0000c8d, 0x86f1: 0xf0000a0a, 0x86f2: 0xf000040a, 0x86f3: 0xf0000404, + 0x86f4: 0xe0000bac, 0x86f5: 0xe0000ba9, 0x86f6: 0x002d7888, 0x86f7: 0x00319488, + 0x86f8: 0xe0000d57, 0x86f9: 0xe0000d54, 0x86fa: 0xe00026af, 0x86fb: 0xe00026ac, + 0x86fc: 0xe000268b, 0x86fd: 0xe0002688, 0x86fe: 0xe0002752, 0x86ff: 0xe000274f, + // Block 0x21c, offset 0x8700 + 0x8700: 0xe000098f, 0x8701: 0xe000098c, 0x8702: 0xe0000995, 0x8703: 0xe0000992, + 0x8704: 0xe0000b62, 0x8705: 0xe0000b5f, 0x8706: 0xe0000b68, 0x8707: 0xe0000b65, + 0x8708: 0xe0000c6c, 0x8709: 0xe0000c69, 0x870a: 0xe0000c72, 0x870b: 0xe0000c6f, + 0x870c: 0xe0000e4a, 0x870d: 0xe0000e47, 0x870e: 0xe0000e50, 0x870f: 0xe0000e4d, + 0x8710: 0xe0000ee8, 0x8711: 0xe0000ee5, 0x8712: 0xe0000eee, 0x8713: 0xe0000eeb, + 0x8714: 0xe0001053, 0x8715: 0xe0001050, 0x8716: 0xe0001059, 0x8717: 0xe0001056, + 0x8718: 0xe0000f61, 0x8719: 0xe0000f5e, 0x871a: 0xe0000fa5, 0x871b: 0xe0000fa2, + 0x871c: 0x00312288, 0x871d: 0x40312220, 0x871e: 0xe0000bf4, 0x871f: 0xe0000bf1, + 0x8720: 0x002ebc88, 0x8721: 0x402c8c20, 0x8722: 0x002f2288, 0x8723: 0x402f2220, + 0x8724: 0x00314088, 0x8725: 0x40314020, 0x8726: 0xe000096f, 0x8727: 0xe000096c, + 0x8728: 0xe0000b32, 0x8729: 0xe0000b2f, 0x872a: 0xe000274c, 0x872b: 0xe0002749, + 0x872c: 0xe0000dfd, 0x872d: 0xe0000df9, 0x872e: 0xe0000e04, 0x872f: 0xe0000e01, + 0x8730: 0xe0000e0b, 0x8731: 0xe0000e07, 0x8732: 0xe0001129, 0x8733: 0xe0001126, + 0x8734: 0x402e5e20, 0x8735: 0x402ed020, 0x8736: 0x40305a20, 0x8737: 0x402dd420, + 0x8738: 0xe0000abf, 0x8739: 0xe0000ec4, 0x873a: 0x002be888, 0x873b: 0x002c4488, + 0x873c: 0x402c4420, 0x873d: 0x002e3888, 0x873e: 0x00303e88, 0x873f: 0x402ffc20, + // Block 0x21d, offset 0x8740 + 0x8740: 0xe00009b1, 0x8741: 0xe00009ae, 0x8742: 0xe0000a22, 0x8743: 0xe0000a1f, + 0x8744: 0xe0000a28, 0x8745: 0xe0000a25, 0x8746: 0xe0000a2e, 0x8747: 0xe0000a2b, + 0x8748: 0xe0000a5a, 0x8749: 0xe0000a56, 0x874a: 0xe0000a8c, 0x874b: 0xe0000a89, + 0x874c: 0xe0000a98, 0x874d: 0xe0000a95, 0x874e: 0xe0000aa4, 0x874f: 0xe0000aa1, + 0x8750: 0xe0000a92, 0x8751: 0xe0000a8f, 0x8752: 0xe0000a9e, 0x8753: 0xe0000a9b, + 0x8754: 0xe0000b55, 0x8755: 0xe0000b51, 0x8756: 0xe000279d, 0x8757: 0xe000279a, + 0x8758: 0xe0000b7c, 0x8759: 0xe0000b79, 0x875a: 0xe0000b82, 0x875b: 0xe0000b7f, + 0x875c: 0xe0000b39, 0x875d: 0xe0000b35, 0x875e: 0xe0000b8c, 0x875f: 0xe0000b89, + 0x8760: 0xe0000bd0, 0x8761: 0xe0000bcd, 0x8762: 0xe0000c00, 0x8763: 0xe0000bfd, + 0x8764: 0xe0000c0c, 0x8765: 0xe0000c09, 0x8766: 0xe0000bfa, 0x8767: 0xe0000bf7, + 0x8768: 0xe0000c06, 0x8769: 0xe0000c03, 0x876a: 0xe0000c12, 0x876b: 0xe0000c0f, + 0x876c: 0xe0000c7e, 0x876d: 0xe0000c7b, 0x876e: 0xe00027a3, 0x876f: 0xe00027a0, + 0x8770: 0xe0000c93, 0x8771: 0xe0000c90, 0x8772: 0xe0000cab, 0x8773: 0xe0000ca8, + 0x8774: 0xe0000cb1, 0x8775: 0xe0000cae, 0x8776: 0xe0000cde, 0x8777: 0xe0000cdb, + 0x8778: 0xe0000ce5, 0x8779: 0xe0000ce1, 0x877a: 0xe0000cf2, 0x877b: 0xe0000cef, + 0x877c: 0xe0000cec, 0x877d: 0xe0000ce9, 0x877e: 0xe0000d1e, 0x877f: 0xe0000d1b, + // Block 0x21e, offset 0x8780 + 0x8780: 0xe0000d24, 0x8781: 0xe0000d21, 0x8782: 0xe0000d2a, 0x8783: 0xe0000d27, + 0x8784: 0xe0000d69, 0x8785: 0xe0000d66, 0x8786: 0xe0000d7b, 0x8787: 0xe0000d78, + 0x8788: 0xe0000d87, 0x8789: 0xe0000d84, 0x878a: 0xe0000d81, 0x878b: 0xe0000d7e, + 0x878c: 0xe00027af, 0x878d: 0xe00027ac, 0x878e: 0xe00027d3, 0x878f: 0xe00027d0, + 0x8790: 0xe0000e3d, 0x8791: 0xe0000e39, 0x8792: 0xe00027b5, 0x8793: 0xe00027b2, + 0x8794: 0xe0000ea7, 0x8795: 0xe0000ea4, 0x8796: 0xe0000ead, 0x8797: 0xe0000eaa, + 0x8798: 0xe0000ed6, 0x8799: 0xe0000ed3, 0x879a: 0xe0000ef4, 0x879b: 0xe0000ef1, + 0x879c: 0xe0000efb, 0x879d: 0xe0000ef7, 0x879e: 0xe0000f02, 0x879f: 0xe0000eff, + 0x87a0: 0xe0000f41, 0x87a1: 0xe0000f3e, 0x87a2: 0xe0000f53, 0x87a3: 0xe0000f50, + 0x87a4: 0xe0000f26, 0x87a5: 0xe0000f22, 0x87a6: 0xe0000f3a, 0x87a7: 0xe0000f36, + 0x87a8: 0xe0000f5a, 0x87a9: 0xe0000f56, 0x87aa: 0xe0000f93, 0x87ab: 0xe0000f90, + 0x87ac: 0xe0000f9f, 0x87ad: 0xe0000f9c, 0x87ae: 0xe0000fb1, 0x87af: 0xe0000fae, + 0x87b0: 0xe0000fab, 0x87b1: 0xe0000fa8, 0x87b2: 0xe0001093, 0x87b3: 0xe0001090, + 0x87b4: 0xe000109f, 0x87b5: 0xe000109c, 0x87b6: 0xe0001099, 0x87b7: 0xe0001096, + 0x87b8: 0xe00027c7, 0x87b9: 0xe00027c4, 0x87ba: 0xe0001046, 0x87bb: 0xe0001042, + 0x87bc: 0xe00010a9, 0x87bd: 0xe00010a6, 0x87be: 0xe00010af, 0x87bf: 0xe00010ac, + // Block 0x21f, offset 0x87c0 + 0x87c0: 0xe00010d2, 0x87c1: 0xe00010cf, 0x87c2: 0xe00010cc, 0x87c3: 0xe00010c9, + 0x87c4: 0xe00010e1, 0x87c5: 0xe00010de, 0x87c6: 0xe00010e7, 0x87c7: 0xe00010e4, + 0x87c8: 0xe00010ed, 0x87c9: 0xe00010ea, 0x87ca: 0xe00010fc, 0x87cb: 0xe00010f9, + 0x87cc: 0xe00010f6, 0x87cd: 0xe00010f3, 0x87ce: 0xe0001123, 0x87cf: 0xe0001120, + 0x87d0: 0xe0001141, 0x87d1: 0xe000113e, 0x87d2: 0xe0001153, 0x87d3: 0xe0001150, + 0x87d4: 0xe0001159, 0x87d5: 0xe0001156, 0x87d6: 0xe0000c15, 0x87d7: 0xe0000f8d, + 0x87d8: 0xe00010db, 0x87d9: 0xe0001111, 0x87da: 0xf0000404, 0x87db: 0xe0000f70, + 0x87dc: 0x40300420, 0x87dd: 0x40300620, 0x87de: 0xe0000f7f, 0x87df: 0x402c9620, + 0x87e0: 0xe000099b, 0x87e1: 0xe0000998, 0x87e2: 0xe0000989, 0x87e3: 0xe0000986, + 0x87e4: 0xe0002791, 0x87e5: 0xe000278e, 0x87e6: 0xe0000930, 0x87e7: 0xe000092c, + 0x87e8: 0xe0000940, 0x87e9: 0xe000093c, 0x87ea: 0xe0000938, 0x87eb: 0xe0000934, + 0x87ec: 0xe00009aa, 0x87ed: 0xe00009a6, 0x87ee: 0xe000278b, 0x87ef: 0xe0002788, + 0x87f0: 0xe000090a, 0x87f1: 0xe0000906, 0x87f2: 0xe000091a, 0x87f3: 0xe0000916, + 0x87f4: 0xe0000912, 0x87f5: 0xe000090e, 0x87f6: 0xe00009a2, 0x87f7: 0xe000099e, + 0x87f8: 0xe0000b6e, 0x87f9: 0xe0000b6b, 0x87fa: 0xe0000b5c, 0x87fb: 0xe0000b59, + 0x87fc: 0xe0000b26, 0x87fd: 0xe0000b23, 0x87fe: 0xe0002797, 0x87ff: 0xe0002794, + // Block 0x220, offset 0x8800 + 0x8800: 0xe0000b03, 0x8801: 0xe0000aff, 0x8802: 0xe0000b13, 0x8803: 0xe0000b0f, + 0x8804: 0xe0000b0b, 0x8805: 0xe0000b07, 0x8806: 0xe0000b75, 0x8807: 0xe0000b71, + 0x8808: 0xe0000c66, 0x8809: 0xe0000c63, 0x880a: 0xe0000c78, 0x880b: 0xe0000c75, + 0x880c: 0xe0000e84, 0x880d: 0xe0000e81, 0x880e: 0xe0000e44, 0x880f: 0xe0000e41, + 0x8810: 0xe00027a9, 0x8811: 0xe00027a6, 0x8812: 0xe0000db5, 0x8813: 0xe0000db1, + 0x8814: 0xe0000dc5, 0x8815: 0xe0000dc1, 0x8816: 0xe0000dbd, 0x8817: 0xe0000db9, + 0x8818: 0xe0000e8b, 0x8819: 0xe0000e87, 0x881a: 0xe00027bb, 0x881b: 0xe00027b8, + 0x881c: 0xe0000e65, 0x881d: 0xe0000e61, 0x881e: 0xe0000e75, 0x881f: 0xe0000e71, + 0x8820: 0xe0000e6d, 0x8821: 0xe0000e69, 0x8822: 0xe0000e7d, 0x8823: 0xe0000e79, + 0x8824: 0xe000108d, 0x8825: 0xe000108a, 0x8826: 0xe000104d, 0x8827: 0xe000104a, + 0x8828: 0xe00027cd, 0x8829: 0xe00027ca, 0x882a: 0xe000106e, 0x882b: 0xe000106a, + 0x882c: 0xe000107e, 0x882d: 0xe000107a, 0x882e: 0xe0001076, 0x882f: 0xe0001072, + 0x8830: 0xe0001086, 0x8831: 0xe0001082, 0x8832: 0xe0001108, 0x8833: 0xe0001105, + 0x8834: 0xe0001135, 0x8835: 0xe0001132, 0x8836: 0xe000112f, 0x8837: 0xe000112c, + 0x8838: 0xe000111d, 0x8839: 0xe000111a, 0x883a: 0xe0000d0a, 0x883b: 0xe0000d07, + 0x883c: 0x0030d888, 0x883d: 0x4030d820, 0x883e: 0x00312088, 0x883f: 0x40312020, + // Block 0x221, offset 0x8840 + 0x8840: 0xa0000000, 0x8841: 0xa0000000, 0x8842: 0xa0000000, 0x8843: 0xa0000000, + 0x8844: 0xa0000000, 0x8845: 0xa0000000, 0x8846: 0xa0000000, 0x8847: 0xa0000000, + 0x8848: 0xa0000000, 0x8849: 0x40020020, 0x884a: 0x40020220, 0x884b: 0x40020420, + 0x884c: 0x40020620, 0x884d: 0x40020820, 0x884e: 0xa0000000, 0x884f: 0xa0000000, + 0x8850: 0xa0000000, 0x8851: 0xa0000000, 0x8852: 0xa0000000, 0x8853: 0xa0000000, + 0x8854: 0xa0000000, 0x8855: 0xa0000000, 0x8856: 0xa0000000, 0x8857: 0xa0000000, + 0x8858: 0xa0000000, 0x8859: 0xa0000000, 0x885a: 0xa0000000, 0x885b: 0xa0000000, + 0x885c: 0xa0000000, 0x885d: 0xa0000000, 0x885e: 0xa0000000, 0x885f: 0xa0000000, + 0x8860: 0x40021220, 0x8861: 0x4002ba20, 0x8862: 0x4003e020, 0x8863: 0x4004ea20, + 0x8864: 0x4027de20, 0x8865: 0x4004ec20, 0x8866: 0x4004e620, 0x8867: 0x4003d220, + 0x8868: 0x4003f420, 0x8869: 0x4003f620, 0x886a: 0x4004d820, 0x886b: 0x40093820, + 0x886c: 0x40024020, 0x886d: 0x40021a20, 0x886e: 0x4002e420, 0x886f: 0x4004e220, + 0x8870: 0x4029cc20, 0x8871: 0x4029ce20, 0x8872: 0x4029d020, 0x8873: 0x4029d220, + 0x8874: 0x4029d420, 0x8875: 0x4029d620, 0x8876: 0x4029d820, 0x8877: 0x4029da20, + 0x8878: 0x4029dc20, 0x8879: 0x4029de20, 0x887a: 0x40026c20, 0x887b: 0x40026220, + 0x887c: 0x40094020, 0x887d: 0xc32f0851, 0x887e: 0x40094420, 0x887f: 0x4002c420, + // Block 0x222, offset 0x8880 + 0x8880: 0x4004d620, 0x8881: 0xc3f10a51, 0x8882: 0x002c0a88, 0x8883: 0x002c3a88, + 0x8884: 0x002c6288, 0x8885: 0xc3920a11, 0x8886: 0x002d0888, 0x8887: 0x002d2288, + 0x8888: 0x002d6888, 0x8889: 0x002d9a88, 0x888a: 0x002dcc88, 0x888b: 0xc3ec0ce1, + 0x888c: 0xc0030002, 0x888d: 0x002e8288, 0x888e: 0x002e9e88, 0x888f: 0xc3970951, + 0x8890: 0x002f2c88, 0x8891: 0x002f5688, 0x8892: 0x002f7a88, 0x8893: 0x002fe688, + 0x8894: 0x00302c88, 0x8895: 0xc3840951, 0x8896: 0x0030be88, 0x8897: 0x0030e288, + 0x8898: 0x0030f688, 0x8899: 0x00310088, 0x889a: 0x00312a88, 0x889b: 0x4003f820, + 0x889c: 0x4004e420, 0x889d: 0x4003fa20, 0x889e: 0x40062420, 0x889f: 0x40021620, + 0x88a0: 0x40061e20, 0x88a1: 0xc3ee0a51, 0x88a2: 0x402c0a20, 0x88a3: 0x402c3a20, + 0x88a4: 0x402c6220, 0x88a5: 0xc3900a11, 0x88a6: 0x402d0820, 0x88a7: 0x402d2220, + 0x88a8: 0x402d6820, 0x88a9: 0x402d9a20, 0x88aa: 0x402dcc20, 0x88ab: 0x402dfe20, + 0x88ac: 0xc0000002, 0x88ad: 0x402e8220, 0x88ae: 0x402e9e20, 0x88af: 0xc3940951, + 0x88b0: 0x402f2c20, 0x88b1: 0x402f5620, 0x88b2: 0x402f7a20, 0x88b3: 0x402fe620, + 0x88b4: 0x40302c20, 0x88b5: 0xc3810951, 0x88b6: 0x4030be20, 0x88b7: 0x4030e220, + 0x88b8: 0x4030f620, 0x88b9: 0x40310020, 0x88ba: 0x40312a20, 0x88bb: 0x4003fc20, + 0x88bc: 0x40094820, 0x88bd: 0x4003fe20, 0x88be: 0x40094c20, 0x88bf: 0xa0000000, + // Block 0x223, offset 0x88c0 + 0x88c0: 0xe0000983, 0x88c1: 0xe0000980, 0x88c2: 0xe00008fb, 0x88c3: 0xe00008f8, + 0x88c4: 0xe000097d, 0x88c5: 0xe000097a, 0x88c6: 0xe0000a38, 0x88c7: 0xe0000a35, + 0x88c8: 0xe0000a3e, 0x88c9: 0xe0000a3b, 0x88ca: 0xe0000a4a, 0x88cb: 0xe0000a47, + 0x88cc: 0xe0000a44, 0x88cd: 0xe0000a41, 0x88ce: 0xe0000a86, 0x88cf: 0xe0000a83, + 0x88d0: 0x002c62a3, 0x88d1: 0x402c6221, 0x88d2: 0xe0000b46, 0x88d3: 0xe0000b43, + 0x88d4: 0xe0000aee, 0x88d5: 0xe0000aeb, 0x88d6: 0xe0000b2c, 0x88d7: 0xe0000b29, + 0x88d8: 0x00320cc3, 0x88d9: 0x40320c22, 0x88da: 0xe0000b1a, 0x88db: 0xe0000b17, + 0x88dc: 0xe0000bb8, 0x88dd: 0xe0000bb5, 0x88de: 0xe0000bb2, 0x88df: 0xe0000baf, + 0x88e0: 0xe0000bc4, 0x88e1: 0xe0000bc1, 0x88e2: 0xe0000bca, 0x88e3: 0xe0000bc7, + 0x88e4: 0xe0000bee, 0x88e5: 0xe0000beb, 0x88e6: 0xe0000c1b, 0x88e7: 0xe0000c18, + 0x88e8: 0xe0000c51, 0x88e9: 0xe0000c4e, 0x88ea: 0xe0000c60, 0x88eb: 0xe0000c5d, + 0x88ec: 0xe0000c31, 0x88ed: 0xe0000c2e, 0x88ee: 0xe0000c5a, 0x88ef: 0xe0000c57, + 0x88f0: 0xe0000c54, 0x88f1: 0x402da220, 0x88f2: 0xf0000a0a, 0x88f3: 0xf0000404, + 0x88f4: 0xe0000c8a, 0x88f5: 0xe0000c87, 0x88f6: 0xe0000c9f, 0x88f7: 0xe0000c9c, + 0x88f8: 0x402f5621, 0x88f9: 0xe0000ccc, 0x88fa: 0xe0000cc9, 0x88fb: 0xe0000cd8, + 0x88fc: 0xe0000cd5, 0x88fd: 0xe0000cd2, 0x88fe: 0xe0000ccf, 0x88ff: 0xe0000d04, + // Block 0x224, offset 0x8900 + 0x8900: 0x4062ac20, 0x8901: 0xe0002526, 0x8902: 0x4062b020, 0x8903: 0x4062b220, + 0x8904: 0xe0002532, 0x8905: 0x4062b620, 0x8906: 0x4062b820, 0x8907: 0x4062ba20, + 0x8908: 0xe000254a, 0x8909: 0x4062be20, 0x890a: 0xe0002550, 0x890b: 0x4062c220, + 0x890c: 0x4062c420, 0x890d: 0xe0002553, 0x890e: 0x4062c820, 0x890f: 0x4062ca20, + 0x8910: 0x4062cc20, 0x8911: 0x4062ce20, 0x8912: 0x4062d020, 0x8913: 0xe00027ef, + 0x8914: 0xe00027f2, 0x8915: 0xe00027f5, 0x8916: 0xe00027f8, 0x8917: 0xe0002801, + 0x8918: 0xe000280b, 0x8919: 0xe0002815, 0x891a: 0xe0002547, 0x891b: 0xe0002830, + 0x891c: 0xe000283c, 0x891d: 0xe0002846, 0x891e: 0xe000284f, 0x891f: 0xe0002852, + 0x8920: 0xe0002855, 0x8921: 0xe000254d, 0x8922: 0xe000285f, 0x8923: 0xe0002863, + 0x8924: 0xe0002867, 0x8925: 0xe000286b, 0x8926: 0xe000286f, 0x8927: 0xe0002876, + 0x8928: 0xe0002879, 0x8929: 0xe000287c, 0x892a: 0xe000287f, 0x892b: 0xe0002873, + 0x892c: 0xe000285b, 0x892d: 0xe0002885, 0x892e: 0xe0002888, 0x892f: 0xe000288b, + 0x8930: 0xe000288e, 0x8931: 0xe0002891, 0x8932: 0xe0002894, 0x8933: 0xe0002897, + 0x8934: 0xe000289b, 0x8935: 0xe000289f, 0x8936: 0xe00028a2, 0x8937: 0xe00028a5, + 0x8938: 0xe00028a8, 0x8939: 0xe00028ab, 0x893a: 0xe00028ae, 0x893b: 0xe00028b1, + 0x893c: 0x40632420, 0x893d: 0x40632620, 0x893e: 0x40632820, 0x893f: 0x40632a20, + // Block 0x225, offset 0x8940 + 0x8940: 0x40632c20, 0x8941: 0xe00028b4, 0x8942: 0xe00028bb, 0x8943: 0xe00028be, + 0x8944: 0xe00028c1, 0x8945: 0xe00028c4, 0x8946: 0x40633820, 0x8947: 0xe00028c7, + 0x8948: 0xe00028ca, 0x8949: 0xe00028cd, 0x894a: 0xe00028d3, 0x894b: 0xe00028d6, + 0x894c: 0x40634420, 0x894d: 0xe00028d9, 0x894e: 0x40634820, 0x894f: 0x40634a20, + 0x8950: 0x40634c20, 0x8951: 0x40634e20, 0x8952: 0xe00028dc, 0x8953: 0xe00028df, + 0x8954: 0x40635420, 0x8955: 0x40635620, 0x8956: 0xe00028e2, 0x8957: 0xe00028e5, + 0x8958: 0xe00028f4, 0x8959: 0x40635e20, 0x895a: 0xe00027d9, 0x895b: 0xe00027fb, + 0x895c: 0xe000252c, 0x895d: 0xe000252f, 0x895e: 0xe0002804, 0x895f: 0x4063a420, + 0x8960: 0x4063a620, 0x8961: 0x4063a820, 0x8962: 0xe0002556, 0x8963: 0x4063ac20, + 0x8964: 0xe0002559, 0x8965: 0x4063b020, 0x8966: 0xe000255c, 0x8967: 0x4063b420, + 0x8968: 0xe000255f, 0x8969: 0x4063b820, 0x896a: 0xe0002562, 0x896b: 0xe0002565, + 0x896c: 0xe0002569, 0x896d: 0x4063c020, 0x896e: 0x4063c220, 0x896f: 0xe000256c, + 0x8970: 0xe000256f, 0x8971: 0xe0002573, 0x8972: 0x4063ca20, 0x8973: 0x4063cc20, + 0x8974: 0x4063ce20, 0x8975: 0x4063d020, 0x8976: 0xe00028f7, 0x8977: 0xe00028fa, + 0x8978: 0xe0002900, 0x8979: 0xe0002903, 0x897a: 0xe0002909, 0x897b: 0xe000290c, + 0x897c: 0xe000290f, 0x897d: 0xe0002915, 0x897e: 0xe0002918, 0x897f: 0xe0002922, + // Block 0x226, offset 0x8980 + 0x8980: 0xe0002925, 0x8981: 0xe0002929, 0x8982: 0xe000292d, 0x8983: 0xe0002930, + 0x8984: 0xe0002933, 0x8985: 0xe0002936, 0x8986: 0xe000293a, 0x8987: 0xe000293d, + 0x8988: 0xe0002940, 0x8989: 0xe0002943, 0x898a: 0xe0002946, 0x898b: 0xe000294a, + 0x898c: 0xe000294e, 0x898d: 0xe0002952, 0x898e: 0xe0002955, 0x898f: 0xe0002958, + 0x8990: 0xe000295b, 0x8991: 0xe000295f, 0x8992: 0xe0002962, 0x8993: 0xe0002966, + 0x8994: 0xe0002969, 0x8995: 0xe000296c, 0x8996: 0xe000296f, 0x8997: 0xe0002972, + 0x8998: 0xe0002975, 0x8999: 0xe0002978, 0x899a: 0xe000297b, 0x899b: 0xe000297e, + 0x899c: 0xe0002981, 0x899d: 0x40642020, 0x899e: 0x40642220, 0x899f: 0x40642420, + 0x89a0: 0x40642620, 0x89a1: 0x40642820, 0x89a2: 0x40642a20, 0x89a3: 0xe00028fd, + 0x89a4: 0xe0002906, 0x89a5: 0xe0002912, 0x89a6: 0xe000291b, 0x89a7: 0xe000291e, + 0x89a8: 0x4062ac20, 0x89a9: 0xe0002526, 0x89aa: 0xe0002529, 0x89ab: 0x4062b020, + 0x89ac: 0xe000252c, 0x89ad: 0xe000252f, 0x89ae: 0x4062b220, 0x89af: 0x4062b620, + 0x89b0: 0xe0002535, 0x89b1: 0xe0002538, 0x89b2: 0xe000253b, 0x89b3: 0xe000253e, + 0x89b4: 0xe0002541, 0x89b5: 0xe0002544, 0x89b6: 0xe0002547, 0x89b7: 0x4062b820, + 0x89b8: 0x4062ba20, 0x89b9: 0xe000254d, 0x89ba: 0x4062be20, 0x89bb: 0xe0002550, + 0x89bc: 0x4062c220, 0x89bd: 0x4062c420, 0x89be: 0x4062c820, 0x89bf: 0x4062ca20, + // Block 0x227, offset 0x89c0 + 0x89c0: 0x4062cc20, 0x89c1: 0x4062ce20, 0x89c2: 0x4062d020, 0x89c3: 0xe00027dc, + 0x89c4: 0xe00027e2, 0x89c5: 0xe00027ef, 0x89c6: 0xe00027f5, 0x89c7: 0xe00027fb, + 0x89c8: 0x4064a420, 0x89c9: 0xe00027fe, 0x89ca: 0xe0002801, 0x89cb: 0xe0002804, + 0x89cc: 0xe0002807, 0x89cd: 0xe000280b, 0x89ce: 0xe000280e, 0x89cf: 0xe0002811, + 0x89d0: 0xe0002815, 0x89d1: 0xe0002818, 0x89d2: 0xe000281c, 0x89d3: 0xe0002820, + 0x89d4: 0xe0002828, 0x89d5: 0xe0002824, 0x89d6: 0xe000282c, 0x89d7: 0x4064c220, + 0x89d8: 0xe0002833, 0x89d9: 0x4064c620, 0x89da: 0xe0002836, 0x89db: 0xe0002839, + 0x89dc: 0xe000283c, 0x89dd: 0xe000283f, 0x89de: 0xe0002842, 0x89df: 0x4064d220, + 0x89e0: 0xe0002849, 0x89e1: 0xe000284c, 0x89e2: 0xe0002846, 0x89e3: 0xe0002858, + 0x89e4: 0xe000287f, 0x89e5: 0xe0002882, 0x89e6: 0xe0002873, 0x89e7: 0xe0002885, + 0x89e8: 0xe000288b, 0x89e9: 0xe000288e, 0x89ea: 0xe0002894, 0x89eb: 0x4064ea20, + 0x89ec: 0xe00028b4, 0x89ed: 0xe00028b7, 0x89ee: 0xe00028c7, 0x89ef: 0xe00028d0, + 0x89f0: 0x4064f420, 0x89f1: 0x4064f620, 0x89f2: 0x4064f820, 0x89f3: 0xe00028e2, + 0x89f4: 0xe00028e5, 0x89f5: 0xe00028e8, 0x89f6: 0xe00028eb, 0x89f7: 0xe00028ee, + 0x89f8: 0xe00028f1, 0x89f9: 0x40650620, 0x89fa: 0xe00027d6, 0x89fb: 0xe00027df, + 0x89fc: 0xe00027e6, 0x89fd: 0xe00027e9, 0x89fe: 0xe00027ec, 0x89ff: 0xe00027f2, + // Block 0x228, offset 0x8a00 + 0x8a00: 0xc3f40cf1, 0x8a01: 0x4062ac21, 0x8a02: 0x4062b020, 0x8a03: 0xc3f60d21, + 0x8a04: 0x4062b221, 0x8a05: 0x4062b620, 0x8a06: 0x4062b820, 0x8a07: 0xc3f80d51, + 0x8a08: 0x4062ba21, 0x8a09: 0xc3fa0d81, 0x8a0a: 0x4062be21, 0x8a0b: 0x4062c220, + 0x8a0c: 0xc3fc0db1, 0x8a0d: 0x4062c421, 0x8a0e: 0x4062c820, 0x8a0f: 0x4062ca20, + 0x8a10: 0x4062cc20, 0x8a11: 0x4062ce20, 0x8a12: 0x4062d020, 0x8a13: 0x4062d220, + 0x8a14: 0x4062d420, 0x8a15: 0x4062d620, 0x8a16: 0x4062d820, 0x8a17: 0x4062da20, + 0x8a18: 0x4062dc20, 0x8a19: 0x4062de20, 0x8a1a: 0x4062e020, 0x8a1b: 0x4062e220, + 0x8a1c: 0x4062e420, 0x8a1d: 0x4062e620, 0x8a1e: 0x4062e820, 0x8a1f: 0x4062ea20, + 0x8a20: 0x4062ec20, 0x8a21: 0x4062ee20, 0x8a22: 0x4062f020, 0x8a23: 0x4062f220, + 0x8a24: 0x4062f420, 0x8a25: 0x4062f620, 0x8a26: 0x4062f820, 0x8a27: 0x4062fa20, + 0x8a28: 0x4062fc20, 0x8a29: 0x4062fe20, 0x8a2a: 0x40630020, 0x8a2b: 0x40630220, + 0x8a2c: 0x40630420, 0x8a2d: 0x40630620, 0x8a2e: 0x40630820, 0x8a2f: 0x40630a20, + 0x8a30: 0x40630c20, 0x8a31: 0x40630e20, 0x8a32: 0x40631020, 0x8a33: 0x40631220, + 0x8a34: 0x40631420, 0x8a35: 0x40631620, 0x8a36: 0x40631820, 0x8a37: 0x40631a20, + 0x8a38: 0x40631c20, 0x8a39: 0x40631e20, 0x8a3a: 0x40632020, 0x8a3b: 0x40632220, + 0x8a3c: 0x40632420, 0x8a3d: 0x40632620, 0x8a3e: 0x40632820, 0x8a3f: 0x40632a20, + // Block 0x229, offset 0x8a40 + 0x8a40: 0x40632c20, 0x8a41: 0x40632e20, 0x8a42: 0x40633020, 0x8a43: 0x40633220, + 0x8a44: 0x40633420, 0x8a45: 0x40633620, 0x8a46: 0x40633820, 0x8a47: 0x40633a20, + 0x8a48: 0x40633c20, 0x8a49: 0x40633e20, 0x8a4a: 0x40634020, 0x8a4b: 0x40634220, + 0x8a4c: 0x40634420, 0x8a4d: 0x40634620, 0x8a4e: 0x40634820, 0x8a4f: 0x40634a20, + 0x8a50: 0x40634c20, 0x8a51: 0x40634e20, 0x8a52: 0x40635020, 0x8a53: 0x40635220, + 0x8a54: 0x40635420, 0x8a55: 0x40635620, 0x8a56: 0x40635820, 0x8a57: 0x40635a20, + 0x8a58: 0x40635c20, 0x8a59: 0x40635e20, 0x8a5a: 0x40636020, 0x8a5b: 0x40636220, + 0x8a5c: 0x40636420, 0x8a5d: 0x40636620, 0x8a5e: 0x40636820, 0x8a5f: 0x4063a420, + 0x8a60: 0x4063a620, 0x8a61: 0xa0002502, 0x8a62: 0xa0002602, 0x8a63: 0xa0002702, + 0x8a64: 0xa0002802, 0x8a65: 0xa0002902, 0x8a66: 0xa0002a02, 0x8a67: 0xa0002b02, + 0x8a68: 0xa0002c02, 0x8a69: 0xa0002d02, 0x8a6a: 0xa0002e02, 0x8a6b: 0xa0002f02, + 0x8a6c: 0xa0003002, 0x8a6d: 0xa0003102, 0x8a6e: 0xa0003202, 0x8a6f: 0xa0003302, + 0x8a70: 0xa0003402, 0x8a71: 0xa0003502, 0x8a72: 0xa0003602, 0x8a73: 0xa0003702, + 0x8a74: 0xa0003802, 0x8a75: 0xa0003902, 0x8a76: 0x4063d220, 0x8a77: 0x4063d420, + 0x8a78: 0x4063d620, 0x8a79: 0x4063d820, 0x8a7a: 0x4063da20, 0x8a7b: 0x4063dc20, + 0x8a7c: 0x4063de20, 0x8a7d: 0x4063e020, 0x8a7e: 0x4063e220, 0x8a7f: 0x4063e420, + // Block 0x22a, offset 0x8a80 + 0x8a80: 0x4063e620, 0x8a81: 0x4063e820, 0x8a82: 0x4063ea20, 0x8a83: 0x4063ec20, + 0x8a84: 0x4063ee20, 0x8a85: 0x4063f020, 0x8a86: 0x4063f220, 0x8a87: 0x4063f420, + 0x8a88: 0x4063f620, 0x8a89: 0x4063f820, 0x8a8a: 0x4063fa20, 0x8a8b: 0x4063fc20, + 0x8a8c: 0x4063fe20, 0x8a8d: 0x40640020, 0x8a8e: 0x40640220, 0x8a8f: 0x40640420, + 0x8a90: 0x40640620, 0x8a91: 0x40640820, 0x8a92: 0x40640a20, 0x8a93: 0x40640c20, + 0x8a94: 0x40640e20, 0x8a95: 0x40641020, 0x8a96: 0x40641220, 0x8a97: 0x40641420, + 0x8a98: 0x40641620, 0x8a99: 0x40641820, 0x8a9a: 0x40641a20, 0x8a9b: 0x40641c20, + 0x8a9c: 0x40641e20, 0x8a9d: 0x40642020, 0x8a9e: 0x40642220, 0x8a9f: 0x40642420, + 0x8aa0: 0x40642620, 0x8aa1: 0x40642820, 0x8aa2: 0x40642a20, 0x8aa3: 0x40642c20, + 0x8aa4: 0x40642e20, 0x8aa5: 0x40643020, 0x8aa6: 0x40643220, 0x8aa7: 0x40643420, + 0x8aa8: 0xa0003a02, 0x8aa9: 0xa0003b02, 0x8aaa: 0xa0003c02, 0x8aab: 0xa0003d02, + 0x8aac: 0xa0003e02, 0x8aad: 0xa0003f02, 0x8aae: 0xa0004002, 0x8aaf: 0xa0004102, + 0x8ab0: 0xa0004202, 0x8ab1: 0xa0004302, 0x8ab2: 0xa0004402, 0x8ab3: 0xa0004502, + 0x8ab4: 0xa0004602, 0x8ab5: 0xa0004702, 0x8ab6: 0xa0004802, 0x8ab7: 0xa0004902, + 0x8ab8: 0xa0004a02, 0x8ab9: 0xa0004b02, 0x8aba: 0xa0004c02, 0x8abb: 0xa0004d02, + 0x8abc: 0xa0004e02, 0x8abd: 0xa0004f02, 0x8abe: 0xa0005002, 0x8abf: 0xa0005102, + // Block 0x22b, offset 0x8ac0 + 0x8ac0: 0xa0005202, 0x8ac1: 0xa0005302, 0x8ac2: 0xa0005402, 0x8ac3: 0x40649a20, + 0x8ac4: 0x40649c20, 0x8ac5: 0x40649e20, 0x8ac6: 0x4064a020, 0x8ac7: 0x4064a220, + 0x8ac8: 0x4064a420, 0x8ac9: 0x4064a620, 0x8aca: 0x4064a820, 0x8acb: 0x4064aa20, + 0x8acc: 0x4064ac20, 0x8acd: 0x4064ae20, 0x8ace: 0x4064b020, 0x8acf: 0x4064b220, + 0x8ad0: 0x4064b420, 0x8ad1: 0x4064b620, 0x8ad2: 0x4064b820, 0x8ad3: 0x4064ba20, + 0x8ad4: 0x4064bc20, 0x8ad5: 0x4064be20, 0x8ad6: 0x4064c020, 0x8ad7: 0x4064c220, + 0x8ad8: 0x4064c420, 0x8ad9: 0x4064c620, 0x8ada: 0x4064c820, 0x8adb: 0x4064ca20, + 0x8adc: 0x4064cc20, 0x8add: 0x4064ce20, 0x8ade: 0x4064d020, 0x8adf: 0x4064d220, + 0x8ae0: 0x4064d420, 0x8ae1: 0x4064d620, 0x8ae2: 0x4064d820, 0x8ae3: 0x4064da20, + 0x8ae4: 0x4064dc20, 0x8ae5: 0x4064de20, 0x8ae6: 0x4064e020, 0x8ae7: 0x4064e220, + 0x8ae8: 0x4064e420, 0x8ae9: 0x4064e620, 0x8aea: 0x4064e820, 0x8aeb: 0x4064ea20, + 0x8aec: 0x4064ec20, 0x8aed: 0x4064ee20, 0x8aee: 0x4064f020, 0x8aef: 0x4064f220, + 0x8af0: 0x4064f420, 0x8af1: 0x4064f620, 0x8af2: 0x4064f820, 0x8af3: 0x4064fa20, + 0x8af4: 0x4064fc20, 0x8af5: 0x4064fe20, 0x8af6: 0x40650020, 0x8af7: 0x40650220, + 0x8af8: 0x40650420, 0x8af9: 0x40650620, 0x8afa: 0x40650820, 0x8afb: 0x40650a20, + 0x8afc: 0x40650c20, 0x8afd: 0x40650e20, 0x8afe: 0x40651020, 0x8aff: 0x40651220, + // Block 0x22c, offset 0x8b00 + 0x8b05: 0x4065da20, 0x8b06: 0x4065dc20, 0x8b07: 0x4065de20, + 0x8b08: 0x4065e020, 0x8b09: 0x4065e420, 0x8b0a: 0x4065e620, 0x8b0b: 0x4065e820, + 0x8b0c: 0x4065ea20, 0x8b0d: 0x4065ec20, 0x8b0e: 0x4065ee20, 0x8b0f: 0x4065f420, + 0x8b10: 0x4065f620, 0x8b11: 0x4065f820, 0x8b12: 0x4065fa20, 0x8b13: 0x4065fe20, + 0x8b14: 0x40660020, 0x8b15: 0x40660220, 0x8b16: 0x40660420, 0x8b17: 0x40660620, + 0x8b18: 0x40660820, 0x8b19: 0x40660a20, 0x8b1a: 0x40661220, 0x8b1b: 0x40661420, + 0x8b1c: 0x40661820, 0x8b1d: 0x40661a20, 0x8b1e: 0x40661e20, 0x8b1f: 0x40662020, + 0x8b20: 0x40662220, 0x8b21: 0x40662420, 0x8b22: 0x40662620, 0x8b23: 0x40662820, + 0x8b24: 0x40662a20, 0x8b25: 0x40662e20, 0x8b26: 0x40663620, 0x8b27: 0x40663820, + 0x8b28: 0x40663a20, 0x8b29: 0x40663c20, 0x8b2a: 0x4065e220, 0x8b2b: 0x4065f020, + 0x8b2c: 0x4065fc20, 0x8b2d: 0x40663e20, + 0x8b31: 0x0062ac84, 0x8b32: 0x0062aca3, 0x8b33: 0x00646884, + 0x8b34: 0x0062b084, 0x8b35: 0x00646c84, 0x8b36: 0x00646e84, 0x8b37: 0x0062b284, + 0x8b38: 0x0062b2a3, 0x8b39: 0x0062b684, 0x8b3a: 0x00647484, 0x8b3b: 0x00647684, + 0x8b3c: 0x00647884, 0x8b3d: 0x00647a84, 0x8b3e: 0x00647c84, 0x8b3f: 0x00647e84, + // Block 0x22d, offset 0x8b40 + 0x8b40: 0x0062e084, 0x8b41: 0x0062b884, 0x8b42: 0x0062ba84, 0x8b43: 0x0062baa3, + 0x8b44: 0x0062ee84, 0x8b45: 0x0062be84, 0x8b46: 0x0062bea3, 0x8b47: 0x0062c284, + 0x8b48: 0x0062c484, 0x8b49: 0x0062c4a3, 0x8b4a: 0x0062c884, 0x8b4b: 0x0062ca84, + 0x8b4c: 0x0062cc84, 0x8b4d: 0x0062ce84, 0x8b4e: 0x0062d084, 0x8b4f: 0x0063a884, + 0x8b50: 0x0063aa84, 0x8b51: 0x0063ac84, 0x8b52: 0x0063ae84, 0x8b53: 0x0063b084, + 0x8b54: 0x0063b284, 0x8b55: 0x0063b484, 0x8b56: 0x0063b684, 0x8b57: 0x0063b884, + 0x8b58: 0x0063ba84, 0x8b59: 0x0063bc84, 0x8b5a: 0x0063be84, 0x8b5b: 0x0063c084, + 0x8b5c: 0x0063c284, 0x8b5d: 0x0063c484, 0x8b5e: 0x0063c684, 0x8b5f: 0x0063c884, + 0x8b60: 0x0063ca84, 0x8b61: 0x0063cc84, 0x8b62: 0x0063ce84, 0x8b63: 0x0063d084, + 0x8b64: 0x0063a684, 0x8b65: 0x0062d484, 0x8b66: 0x0062d684, 0x8b67: 0x0064a284, + 0x8b68: 0x0064a484, 0x8b69: 0x0064ac84, 0x8b6a: 0x0064b084, 0x8b6b: 0x0064ba84, + 0x8b6c: 0x0064c284, 0x8b6d: 0x0064c684, 0x8b6e: 0x0062e484, 0x8b6f: 0x0064ce84, + 0x8b70: 0x0064d284, 0x8b71: 0x0062e684, 0x8b72: 0x0062e884, 0x8b73: 0x0062ec84, + 0x8b74: 0x0062f084, 0x8b75: 0x0062f284, 0x8b76: 0x0062fa84, 0x8b77: 0x0062fe84, + 0x8b78: 0x00630284, 0x8b79: 0x00630484, 0x8b7a: 0x00630684, 0x8b7b: 0x00630884, + 0x8b7c: 0x00630a84, 0x8b7d: 0x00631084, 0x8b7e: 0x00631884, 0x8b7f: 0x00632c84, + // Block 0x22e, offset 0x8b80 + 0x8b80: 0xf0000404, 0x8b81: 0xf0000404, 0x8b82: 0xf0000404, 0x8b83: 0xf0000404, + 0x8b84: 0x02aa9e86, 0x8b85: 0x02bcf886, 0x8b86: 0x02cb0e86, 0x8b87: 0x02f71e86, + 0x8b88: 0xe00002e3, 0x8b89: 0xe00003d8, 0x8b8a: 0xe00004b3, 0x8b8b: 0xe000057d, + 0x8b8c: 0xe0000648, 0x8b8d: 0xe00006f0, 0x8b8e: 0xe000079c, 0x8b8f: 0xe0000841, + 0x8b90: 0xe0000ec0, 0x8b91: 0xf0000606, 0x8b92: 0xf0000606, 0x8b93: 0xf0000606, + 0x8b94: 0xf0000606, 0x8b95: 0xf0000606, 0x8b96: 0xf0000606, 0x8b97: 0xf0000606, + 0x8b98: 0xf0000606, 0x8b99: 0xf0000606, 0x8b9a: 0xf0000606, 0x8b9b: 0xf0000606, + 0x8b9c: 0xf0000606, 0x8b9d: 0xf0000606, 0x8b9e: 0xf0000606, 0x8b9f: 0xf0000606, + 0x8ba0: 0x0062ac86, 0x8ba1: 0x0062b086, 0x8ba2: 0x0062b286, 0x8ba3: 0x0062b686, + 0x8ba4: 0x0062b886, 0x8ba5: 0x0062ba86, 0x8ba6: 0x0062be86, 0x8ba7: 0x0062c286, + 0x8ba8: 0x0062c486, 0x8ba9: 0x0062c886, 0x8baa: 0x0062ca86, 0x8bab: 0x0062cc86, + 0x8bac: 0x0062ce86, 0x8bad: 0x0062d086, 0x8bae: 0xe0002984, 0x8baf: 0xe0002987, + 0x8bb0: 0xe000298a, 0x8bb1: 0xe000298d, 0x8bb2: 0xe0002990, 0x8bb3: 0xe0002993, + 0x8bb4: 0xe0002996, 0x8bb5: 0xe0002999, 0x8bb6: 0xe000299f, 0x8bb7: 0xe00029a2, + 0x8bb8: 0xe00029a5, 0x8bb9: 0xe00029a8, 0x8bba: 0xe00029ab, 0x8bbb: 0xe00029ae, + 0x8bbc: 0xe0002127, 0x8bbd: 0xe0002122, 0x8bbe: 0xe000299c, 0x8bbf: 0x4027ac20, + // Block 0x22f, offset 0x8bc0 + 0x8bc0: 0xa0000000, 0x8bc1: 0xa0000000, 0x8bc2: 0xa0000000, 0x8bc3: 0xa0000000, + 0x8bc4: 0xa0000000, 0x8bc5: 0xa0000000, 0x8bc6: 0xa0000000, 0x8bc7: 0xa0000000, + 0x8bc8: 0xa0000000, 0x8bc9: 0x40020020, 0x8bca: 0x40020220, 0x8bcb: 0x40020420, + 0x8bcc: 0x40020620, 0x8bcd: 0x40020820, 0x8bce: 0xa0000000, 0x8bcf: 0xa0000000, + 0x8bd0: 0xa0000000, 0x8bd1: 0xa0000000, 0x8bd2: 0xa0000000, 0x8bd3: 0xa0000000, + 0x8bd4: 0xa0000000, 0x8bd5: 0xa0000000, 0x8bd6: 0xa0000000, 0x8bd7: 0xa0000000, + 0x8bd8: 0xa0000000, 0x8bd9: 0xa0000000, 0x8bda: 0xa0000000, 0x8bdb: 0xa0000000, + 0x8bdc: 0xa0000000, 0x8bdd: 0xa0000000, 0x8bde: 0xa0000000, 0x8bdf: 0xa0000000, + 0x8be0: 0x40021220, 0x8be1: 0x4002ba20, 0x8be2: 0x4003e020, 0x8be3: 0x4004ea20, + 0x8be4: 0x4027de20, 0x8be5: 0x4004ec20, 0x8be6: 0x4004e620, 0x8be7: 0x4003d220, + 0x8be8: 0x4003f420, 0x8be9: 0x4003f620, 0x8bea: 0x4004d820, 0x8beb: 0x40093820, + 0x8bec: 0x40024020, 0x8bed: 0x40021a20, 0x8bee: 0x4002e420, 0x8bef: 0x4004e220, + 0x8bf0: 0x4029cc20, 0x8bf1: 0x4029ce20, 0x8bf2: 0x4029d020, 0x8bf3: 0x4029d220, + 0x8bf4: 0x4029d420, 0x8bf5: 0x4029d620, 0x8bf6: 0x4029d820, 0x8bf7: 0x4029da20, + 0x8bf8: 0x4029dc20, 0x8bf9: 0x4029de20, 0x8bfa: 0x40026c20, 0x8bfb: 0x40026220, + 0x8bfc: 0x40094020, 0x8bfd: 0xc32f0851, 0x8bfe: 0x40094420, 0x8bff: 0x4002c420, + // Block 0x230, offset 0x8c00 + 0x8c00: 0x4004d620, 0x8c01: 0xc40209c3, 0x8c02: 0x002c0a88, 0x8c03: 0x002c3a88, + 0x8c04: 0x002c6288, 0x8c05: 0xc3920a11, 0x8c06: 0x002d0888, 0x8c07: 0x002d2288, + 0x8c08: 0x002d6888, 0x8c09: 0x002d9a88, 0x8c0a: 0x002dcc88, 0x8c0b: 0x002dfe88, + 0x8c0c: 0xc0030002, 0x8c0d: 0x002e8288, 0x8c0e: 0x002e9e88, 0x8c0f: 0xc3970951, + 0x8c10: 0x002f2c88, 0x8c11: 0x002f5688, 0x8c12: 0x002f7a88, 0x8c13: 0x002fe688, + 0x8c14: 0x00302c88, 0x8c15: 0xc3840951, 0x8c16: 0x0030be88, 0x8c17: 0x0030e288, + 0x8c18: 0x0030f688, 0x8c19: 0x00310088, 0x8c1a: 0x00312a88, 0x8c1b: 0x4003f820, + 0x8c1c: 0x4004e420, 0x8c1d: 0x4003fa20, 0x8c1e: 0x40062420, 0x8c1f: 0x40021620, + 0x8c20: 0x40061e20, 0x8c21: 0xc3fe0982, 0x8c22: 0x402c0a20, 0x8c23: 0x402c3a20, + 0x8c24: 0x402c6220, 0x8c25: 0xc3900a11, 0x8c26: 0x402d0820, 0x8c27: 0x402d2220, + 0x8c28: 0x402d6820, 0x8c29: 0x402d9a20, 0x8c2a: 0x402dcc20, 0x8c2b: 0x402dfe20, + 0x8c2c: 0xc0000002, 0x8c2d: 0x402e8220, 0x8c2e: 0x402e9e20, 0x8c2f: 0xc3940951, + 0x8c30: 0x402f2c20, 0x8c31: 0x402f5620, 0x8c32: 0x402f7a20, 0x8c33: 0x402fe620, + 0x8c34: 0x40302c20, 0x8c35: 0xc3810951, 0x8c36: 0x4030be20, 0x8c37: 0x4030e220, + 0x8c38: 0x4030f620, 0x8c39: 0x40310020, 0x8c3a: 0x40312a20, 0x8c3b: 0x4003fc20, + 0x8c3c: 0x40094820, 0x8c3d: 0x4003fe20, 0x8c3e: 0x40094c20, 0x8c3f: 0xa0000000, + // Block 0x231, offset 0x8c40 + 0x8c40: 0xa0000000, 0x8c41: 0xa0000000, 0x8c42: 0xa0000000, 0x8c43: 0xa0000000, + 0x8c44: 0xa0000000, 0x8c45: 0xa0000000, 0x8c46: 0xa0000000, 0x8c47: 0xa0000000, + 0x8c48: 0xa0000000, 0x8c49: 0x40020020, 0x8c4a: 0x40020220, 0x8c4b: 0x40020420, + 0x8c4c: 0x40020620, 0x8c4d: 0x40020820, 0x8c4e: 0xa0000000, 0x8c4f: 0xa0000000, + 0x8c50: 0xa0000000, 0x8c51: 0xa0000000, 0x8c52: 0xa0000000, 0x8c53: 0xa0000000, + 0x8c54: 0xa0000000, 0x8c55: 0xa0000000, 0x8c56: 0xa0000000, 0x8c57: 0xa0000000, + 0x8c58: 0xa0000000, 0x8c59: 0xa0000000, 0x8c5a: 0xa0000000, 0x8c5b: 0xa0000000, + 0x8c5c: 0xa0000000, 0x8c5d: 0xa0000000, 0x8c5e: 0xa0000000, 0x8c5f: 0xa0000000, + 0x8c60: 0x40021220, 0x8c61: 0x4002ba20, 0x8c62: 0x4003e020, 0x8c63: 0x4004ea20, + 0x8c64: 0x4027de20, 0x8c65: 0x4004ec20, 0x8c66: 0x4004e620, 0x8c67: 0x4003d220, + 0x8c68: 0x4003f420, 0x8c69: 0x4003f620, 0x8c6a: 0x4004d820, 0x8c6b: 0x40093820, + 0x8c6c: 0x40024020, 0x8c6d: 0x40021a20, 0x8c6e: 0x4002e420, 0x8c6f: 0x4004e220, + 0x8c70: 0x4029cc20, 0x8c71: 0x4029ce20, 0x8c72: 0x4029d020, 0x8c73: 0x4029d220, + 0x8c74: 0x4029d420, 0x8c75: 0x4029d620, 0x8c76: 0x4029d820, 0x8c77: 0x4029da20, + 0x8c78: 0x4029dc20, 0x8c79: 0x4029de20, 0x8c7a: 0x40026c20, 0x8c7b: 0x40026220, + 0x8c7c: 0x40094020, 0x8c7d: 0xc32f0851, 0x8c7e: 0x40094420, 0x8c7f: 0x4002c420, + // Block 0x232, offset 0x8c80 + 0x8c80: 0x4004d620, 0x8c81: 0xc40d0de1, 0x8c82: 0x002c0a88, 0x8c83: 0xc41508d1, + 0x8c84: 0x002c6288, 0x8c85: 0x002c9888, 0x8c86: 0x002d0888, 0x8c87: 0xc41d08d1, + 0x8c88: 0x002d6888, 0x8c89: 0x002d9a88, 0x8c8a: 0x002dcc88, 0x8c8b: 0xc42108d1, + 0x8c8c: 0xc0030002, 0x8c8d: 0x002e8288, 0x8c8e: 0xc4260e31, 0x8c8f: 0xc4370e61, + 0x8c90: 0x002f2c88, 0x8c91: 0x002f5688, 0x8c92: 0x002f7a88, 0x8c93: 0xc42b08d1, + 0x8c94: 0x00302c88, 0x8c95: 0xc3840951, 0x8c96: 0x0030be88, 0x8c97: 0x0030e288, + 0x8c98: 0x0030f688, 0x8c99: 0x00310088, 0x8c9a: 0xc42f08d1, 0x8c9b: 0x4003f820, + 0x8c9c: 0x4004e420, 0x8c9d: 0x4003fa20, 0x8c9e: 0x40062420, 0x8c9f: 0x40021620, + 0x8ca0: 0x40061e20, 0x8ca1: 0xc4070de1, 0x8ca2: 0x402c0a20, 0x8ca3: 0xc41308d1, + 0x8ca4: 0x402c6220, 0x8ca5: 0x402c9820, 0x8ca6: 0x402d0820, 0x8ca7: 0xc41b08d1, + 0x8ca8: 0x402d6820, 0x8ca9: 0x402d9a20, 0x8caa: 0x402dcc20, 0x8cab: 0xc41f08d1, + 0x8cac: 0xc0000002, 0x8cad: 0x402e8220, 0x8cae: 0xc4230e31, 0x8caf: 0xc4310e61, + 0x8cb0: 0x402f2c20, 0x8cb1: 0x402f5620, 0x8cb2: 0x402f7a20, 0x8cb3: 0xc42908d1, + 0x8cb4: 0x40302c20, 0x8cb5: 0xc3810951, 0x8cb6: 0x4030be20, 0x8cb7: 0x4030e220, + 0x8cb8: 0x4030f620, 0x8cb9: 0x40310020, 0x8cba: 0xc42d08d1, 0x8cbb: 0x4003fc20, + 0x8cbc: 0x40094820, 0x8cbd: 0x4003fe20, 0x8cbe: 0x40094c20, 0x8cbf: 0xa0000000, + // Block 0x233, offset 0x8cc0 + 0x8cc0: 0xe00008f5, 0x8cc1: 0x002c0883, 0x8cc2: 0xe0000921, 0x8cc3: 0x00320ea3, + 0x8cc4: 0x00320e83, 0x8cc5: 0x00320c83, 0x8cc6: 0x00320a83, 0x8cc7: 0xe0000a53, + 0x8cc8: 0xe0000ae8, 0x8cc9: 0xe0000ae2, 0x8cca: 0xe0000af4, 0x8ccb: 0xe0000b20, + 0x8ccc: 0xe0000c2b, 0x8ccd: 0xe0000c25, 0x8cce: 0xe0000c37, 0x8ccf: 0xe0000c43, + 0x8cd0: 0x002c96a3, 0x8cd1: 0x002ee0c3, 0x8cd2: 0xe0000d9a, 0x8cd3: 0xe0000d94, + 0x8cd4: 0x003210e3, 0x8cd5: 0x003210c3, 0x8cd6: 0x00321083, 0x8cd7: 0x40093e20, + 0x8cd8: 0x00320883, 0x8cd9: 0xe0000fe1, 0x8cda: 0xe0000fdb, 0x8cdb: 0xe0000fed, + 0x8cdc: 0x003100a3, 0x8cdd: 0xe0001102, 0x8cde: 0x00306aa3, 0x8cdf: 0xe0000f7b, + 0x8ce0: 0xe00008f2, 0x8ce1: 0x402c0820, 0x8ce2: 0xe000091e, 0x8ce3: 0x40320e21, + 0x8ce4: 0x40320e20, 0x8ce5: 0x40320c20, 0x8ce6: 0x40320a20, 0x8ce7: 0xe0000a4d, + 0x8ce8: 0xe0000ae5, 0x8ce9: 0xe0000adf, 0x8cea: 0xe0000af1, 0x8ceb: 0xe0000b1d, + 0x8cec: 0xe0000c28, 0x8ced: 0xe0000c22, 0x8cee: 0xe0000c34, 0x8cef: 0xe0000c40, + 0x8cf0: 0x402c9621, 0x8cf1: 0x402ee022, 0x8cf2: 0xe0000d97, 0x8cf3: 0xe0000d91, + 0x8cf4: 0x40321023, 0x8cf5: 0x40321022, 0x8cf6: 0x40321020, 0x8cf7: 0x40093c20, + 0x8cf8: 0x40320820, 0x8cf9: 0xe0000fde, 0x8cfa: 0xe0000fd8, 0x8cfb: 0xe0000fea, + 0x8cfc: 0x40310021, 0x8cfd: 0xe00010ff, 0x8cfe: 0x40306a21, 0x8cff: 0xe0001114, + // Block 0x234, offset 0x8d00 + 0x8d00: 0xe0000983, 0x8d01: 0xe0000980, 0x8d02: 0xe00008fb, 0x8d03: 0xe00008f8, + 0x8d04: 0xe000097d, 0x8d05: 0xe000097a, 0x8d06: 0xe0000a38, 0x8d07: 0xe0000a35, + 0x8d08: 0xe0000a3e, 0x8d09: 0xe0000a3b, 0x8d0a: 0xe0000a4a, 0x8d0b: 0xe0000a47, + 0x8d0c: 0x002c5c83, 0x8d0d: 0x402c5c20, 0x8d0e: 0xe0000a86, 0x8d0f: 0xe0000a83, + 0x8d10: 0x002c9683, 0x8d11: 0x402c9620, 0x8d12: 0xe0000b46, 0x8d13: 0xe0000b43, + 0x8d14: 0xe0000aee, 0x8d15: 0xe0000aeb, 0x8d16: 0xe0000b2c, 0x8d17: 0xe0000b29, + 0x8d18: 0xe0000b40, 0x8d19: 0xe0000b3d, 0x8d1a: 0xe0000b1a, 0x8d1b: 0xe0000b17, + 0x8d1c: 0xe0000bb8, 0x8d1d: 0xe0000bb5, 0x8d1e: 0xe0000bb2, 0x8d1f: 0xe0000baf, + 0x8d20: 0xe0000bc4, 0x8d21: 0xe0000bc1, 0x8d22: 0xe0000bca, 0x8d23: 0xe0000bc7, + 0x8d24: 0xe0000bee, 0x8d25: 0xe0000beb, 0x8d26: 0xe0000c1b, 0x8d27: 0xe0000c18, + 0x8d28: 0xe0000c51, 0x8d29: 0xe0000c4e, 0x8d2a: 0xe0000c60, 0x8d2b: 0xe0000c5d, + 0x8d2c: 0xe0000c31, 0x8d2d: 0xe0000c2e, 0x8d2e: 0xe0000c5a, 0x8d2f: 0xe0000c57, + 0x8d30: 0xe0000c54, 0x8d31: 0x402da220, 0x8d32: 0xf0000a0a, 0x8d33: 0xf0000404, + 0x8d34: 0xe0000c8a, 0x8d35: 0xe0000c87, 0x8d36: 0xe0000c9f, 0x8d37: 0xe0000c9c, + 0x8d38: 0x402f7220, 0x8d39: 0xe0000ccc, 0x8d3a: 0xe0000cc9, 0x8d3b: 0xe0000cd8, + 0x8d3c: 0xe0000cd5, 0x8d3d: 0xe0000cd2, 0x8d3e: 0xe0000ccf, 0x8d3f: 0xe0000d04, + // Block 0x235, offset 0x8d40 + 0x8d40: 0xe0000cfe, 0x8d41: 0xe0000cf8, 0x8d42: 0xe0000cf5, 0x8d43: 0x002ee0a3, + 0x8d44: 0x402ee021, 0x8d45: 0xe0000d6f, 0x8d46: 0xe0000d6c, 0x8d47: 0xe0000d5d, + 0x8d48: 0xe0000d5a, 0x8d49: 0xf0000404, 0x8d4a: 0x002ee083, 0x8d4b: 0x402ee020, + 0x8d4c: 0xe0000e2e, 0x8d4d: 0xe0000e2b, 0x8d4e: 0xe0000da0, 0x8d4f: 0xe0000d9d, + 0x8d50: 0x003210a3, 0x8d51: 0x40321021, 0x8d52: 0x003208a3, 0x8d53: 0x40320821, + 0x8d54: 0xe0000eca, 0x8d55: 0xe0000ec7, 0x8d56: 0xe0000edc, 0x8d57: 0xe0000ed9, + 0x8d58: 0xe0000ed0, 0x8d59: 0xe0000ecd, 0x8d5a: 0xe0000f1f, 0x8d5b: 0xe0000f1c, + 0x8d5c: 0xe0000f2d, 0x8d5d: 0xe0000f2a, 0x8d5e: 0xe0000f47, 0x8d5f: 0xe0000f44, + 0x8d60: 0x00302a83, 0x8d61: 0x40302a20, 0x8d62: 0xe0000f99, 0x8d63: 0xe0000f96, + 0x8d64: 0xe0000f8a, 0x8d65: 0xe0000f87, 0x8d66: 0x00306a83, 0x8d67: 0x40306a20, + 0x8d68: 0xe000102b, 0x8d69: 0xe0001028, 0x8d6a: 0xe000103f, 0x8d6b: 0xe000103c, + 0x8d6c: 0xe0000fe7, 0x8d6d: 0xe0000fe4, 0x8d6e: 0xe0000ff9, 0x8d6f: 0xe0000ff6, + 0x8d70: 0x003100c3, 0x8d71: 0x40310022, 0x8d72: 0xe0001039, 0x8d73: 0xe0001036, + 0x8d74: 0xe00010d8, 0x8d75: 0xe00010d5, 0x8d76: 0xe000110e, 0x8d77: 0xe000110b, + 0x8d78: 0xe0001117, 0x8d79: 0xe000113b, 0x8d7a: 0xe0001138, 0x8d7b: 0xe000114d, + 0x8d7c: 0xe000114a, 0x8d7d: 0x00320683, 0x8d7e: 0x40320620, 0x8d7f: 0xe0000f64, + // Block 0x236, offset 0x8d80 + 0x8d80: 0x402c1a20, 0x8d81: 0x002c2a88, 0x8d82: 0x002c3288, 0x8d83: 0x402c3220, + 0x8d84: 0x0031c488, 0x8d85: 0x4031c420, 0x8d86: 0x002efa88, 0x8d87: 0x002c4e88, + 0x8d88: 0x402c4e20, 0x8d89: 0x002c7288, 0x8d8a: 0x002c7a88, 0x8d8b: 0x002c8488, + 0x8d8c: 0x402c8420, 0x8d8d: 0xe000115c, 0x8d8e: 0x002cae88, 0x8d8f: 0x002cb888, + 0x8d90: 0x002cc288, 0x8d91: 0x002d1688, 0x8d92: 0x402d1620, 0x8d93: 0x002d4488, + 0x8d94: 0x002d5888, 0x8d95: 0x402d7820, 0x8d96: 0x002dc288, 0x8d97: 0x002db688, + 0x8d98: 0x002e0a88, 0x8d99: 0x402e0a20, 0x8d9a: 0x402e3820, 0x8d9b: 0x402e7220, + 0x8d9c: 0x0030a088, 0x8d9d: 0x002eb488, 0x8d9e: 0x402ebc20, 0x8d9f: 0x002f1088, + 0x8da0: 0xe0000e56, 0x8da1: 0xe0000e53, 0x8da2: 0x002d6088, 0x8da3: 0x402d6020, + 0x8da4: 0x002f3e88, 0x8da5: 0x402f3e20, 0x8da6: 0x002f8288, 0x8da7: 0x0031b488, + 0x8da8: 0x4031b420, 0x8da9: 0x00300888, 0x8daa: 0x40301220, 0x8dab: 0x40304220, + 0x8dac: 0x00304a88, 0x8dad: 0x40304a20, 0x8dae: 0x00305288, 0x8daf: 0xe000105f, + 0x8db0: 0xe000105c, 0x8db1: 0x0030b488, 0x8db2: 0x0030cc88, 0x8db3: 0x00311888, + 0x8db4: 0x40311820, 0x8db5: 0x00313488, 0x8db6: 0x40313420, 0x8db7: 0xc41908d1, + 0x8db8: 0x00316e88, 0x8db9: 0x40316e20, 0x8dba: 0x40317820, 0x8dbb: 0x4031a620, + 0x8dbc: 0x0031bc88, 0x8dbd: 0x4031bc20, 0x8dbe: 0xe0000fc9, 0x8dbf: 0x40319420, + // Block 0x237, offset 0x8dc0 + 0x8dc0: 0x40321220, 0x8dc1: 0x40321a20, 0x8dc2: 0x40322220, 0x8dc3: 0x40322a20, + 0x8dc4: 0xe0000ad5, 0x8dc5: 0xe0000ad1, 0x8dc6: 0xe0000acd, 0x8dc7: 0xf0000a0a, + 0x8dc8: 0xf000040a, 0x8dc9: 0xf0000404, 0x8dca: 0xf0000a0a, 0x8dcb: 0xf000040a, + 0x8dcc: 0xf0000404, 0x8dcd: 0xe0000947, 0x8dce: 0xe0000944, 0x8dcf: 0xe0000c3d, + 0x8dd0: 0xe0000c3a, 0x8dd1: 0xe0000dcc, 0x8dd2: 0xe0000dc9, 0x8dd3: 0xe0000ff3, + 0x8dd4: 0xe0000ff0, 0x8dd5: 0xe0002685, 0x8dd6: 0xe0002682, 0x8dd7: 0xe0002673, + 0x8dd8: 0xe0002670, 0x8dd9: 0xe000267f, 0x8dda: 0xe000267c, 0x8ddb: 0xe0002679, + 0x8ddc: 0xe0002676, 0x8ddd: 0x402cae20, 0x8dde: 0xe000274c, 0x8ddf: 0xe0002749, + 0x8de0: 0xe0002697, 0x8de1: 0xe0002694, 0x8de2: 0xe00029c6, 0x8de3: 0xe00029c3, + 0x8de4: 0x002d6683, 0x8de5: 0x402d6620, 0x8de6: 0x002d6483, 0x8de7: 0x402d6420, + 0x8de8: 0x002e2083, 0x8de9: 0x402e2020, 0x8dea: 0x00321103, 0x8deb: 0x40321024, + 0x8dec: 0xe0002a08, 0x8ded: 0xe0002a05, 0x8dee: 0x002c6083, 0x8def: 0x402c6020, + 0x8df0: 0xe0000c8d, 0x8df1: 0xf0000a0a, 0x8df2: 0xf000040a, 0x8df3: 0xf0000404, + 0x8df4: 0xe0000bac, 0x8df5: 0xe0000ba9, 0x8df6: 0x002d7888, 0x8df7: 0x00319488, + 0x8df8: 0xe0000d57, 0x8df9: 0xe0000d54, 0x8dfa: 0xe000268b, 0x8dfb: 0xe0002688, + 0x8dfc: 0xe00029c0, 0x8dfd: 0xe00029bd, 0x8dfe: 0xe00029ba, 0x8dff: 0xe00029b7, + // Block 0x238, offset 0x8e00 + 0x8e00: 0xe000098f, 0x8e01: 0xe000098c, 0x8e02: 0xe0000995, 0x8e03: 0xe0000992, + 0x8e04: 0xe0000b62, 0x8e05: 0xe0000b5f, 0x8e06: 0xe0000b68, 0x8e07: 0xe0000b65, + 0x8e08: 0xe0000c6c, 0x8e09: 0xe0000c69, 0x8e0a: 0xe0000c72, 0x8e0b: 0xe0000c6f, + 0x8e0c: 0xe0000e4a, 0x8e0d: 0xe0000e47, 0x8e0e: 0xe0000e50, 0x8e0f: 0xe0000e4d, + 0x8e10: 0xe0000ee8, 0x8e11: 0xe0000ee5, 0x8e12: 0xe0000eee, 0x8e13: 0xe0000eeb, + 0x8e14: 0xe0001053, 0x8e15: 0xe0001050, 0x8e16: 0xe0001059, 0x8e17: 0xe0001056, + 0x8e18: 0xe0000f61, 0x8e19: 0xe0000f5e, 0x8e1a: 0xe0000fa5, 0x8e1b: 0xe0000fa2, + 0x8e1c: 0x00312288, 0x8e1d: 0x40312220, 0x8e1e: 0xe0000bf4, 0x8e1f: 0xe0000bf1, + 0x8e20: 0x002ebc88, 0x8e21: 0x402c8c20, 0x8e22: 0x002f2288, 0x8e23: 0x402f2220, + 0x8e24: 0x00314088, 0x8e25: 0x40314020, 0x8e26: 0x00320ca3, 0x8e27: 0x40320c21, + 0x8e28: 0xe0000b32, 0x8e29: 0xe0000b2f, 0x8e2a: 0xe0002758, 0x8e2b: 0xe0002755, + 0x8e2c: 0xe00029e4, 0x8e2d: 0xe00029e1, 0x8e2e: 0xe0000e04, 0x8e2f: 0xe0000e01, + 0x8e30: 0xe0000e0b, 0x8e31: 0xe0000e07, 0x8e32: 0xe0001129, 0x8e33: 0xe0001126, + 0x8e34: 0x402e5e20, 0x8e35: 0x402ed020, 0x8e36: 0x40305a20, 0x8e37: 0x402dd420, + 0x8e38: 0xe0000abf, 0x8e39: 0xe0000ec4, 0x8e3a: 0x002be888, 0x8e3b: 0x002c4488, + 0x8e3c: 0x402c4420, 0x8e3d: 0x002e3888, 0x8e3e: 0x00303e88, 0x8e3f: 0x402ffc20, + // Block 0x239, offset 0x8e40 + 0x8e40: 0x402f8220, 0x8e41: 0x402fd820, 0x8e42: 0x402ff420, 0x8e43: 0x40300820, + 0x8e44: 0x402df620, 0x8e45: 0x40301a20, 0x8e46: 0x40302420, 0x8e47: 0x40306420, + 0x8e48: 0x40305220, 0x8e49: 0x40307c20, 0x8e4a: 0x4030b420, 0x8e4b: 0x4030cc20, + 0x8e4c: 0x4030da20, 0x8e4d: 0x4030ee20, 0x8e4e: 0x402e7a20, 0x8e4f: 0x40310820, + 0x8e50: 0x40314820, 0x8e51: 0x40315020, 0x8e52: 0xc41708d1, 0x8e53: 0x40318020, + 0x8e54: 0x4031cc20, 0x8e55: 0x4031e820, 0x8e56: 0x40320a20, 0x8e57: 0x40323220, + 0x8e58: 0x40323a20, 0x8e59: 0x402c1220, 0x8e5a: 0x402cf820, 0x8e5b: 0x402d4c20, + 0x8e5c: 0x402d7020, 0x8e5d: 0x402de620, 0x8e5e: 0x402e1a20, 0x8e5f: 0x402e2a20, + 0x8e60: 0x402f6220, 0x8e61: 0x4031fa20, 0x8e62: 0x40320220, 0x8e63: 0xe0000aca, + 0x8e64: 0xe0000adc, 0x8e65: 0xe0000ad9, 0x8e66: 0xe0000fcc, 0x8e67: 0xe0000fcf, + 0x8e68: 0xe0000fba, 0x8e69: 0xe0000ba1, 0x8e6a: 0xe0000d11, 0x8e6b: 0xe0000d18, + 0x8e6c: 0x40324220, 0x8e6d: 0x40324a20, 0x8e6e: 0x40309020, 0x8e6f: 0x40309820, + 0x8e70: 0x002d6894, 0x8e71: 0x002d8094, 0x8e72: 0x002dcc94, 0x8e73: 0x002f7a94, + 0x8e74: 0x002f9894, 0x8e75: 0x002fac94, 0x8e76: 0x002fd894, 0x8e77: 0x0030e294, + 0x8e78: 0x00310094, 0x8e79: 0x40064020, 0x8e7a: 0x40064420, 0x8e7b: 0x402d9620, + 0x8e7c: 0x4031de20, 0x8e7d: 0x402d9820, 0x8e7e: 0x4031e220, 0x8e7f: 0x4031f020, + // Block 0x23a, offset 0x8e80 + 0x8e80: 0xe0000d24, 0x8e81: 0xe0000d21, 0x8e82: 0xe0000d2a, 0x8e83: 0xe0000d27, + 0x8e84: 0xe0000d69, 0x8e85: 0xe0000d66, 0x8e86: 0xe0000d7b, 0x8e87: 0xe0000d78, + 0x8e88: 0xe0000d87, 0x8e89: 0xe0000d84, 0x8e8a: 0xe0000d81, 0x8e8b: 0xe0000d7e, + 0x8e8c: 0xe00029d8, 0x8e8d: 0xe00029d5, 0x8e8e: 0xe00029de, 0x8e8f: 0xe00029db, + 0x8e90: 0xe0000e3d, 0x8e91: 0xe0000e39, 0x8e92: 0xe0000e35, 0x8e93: 0xe0000e31, + 0x8e94: 0xe0000ea7, 0x8e95: 0xe0000ea4, 0x8e96: 0xe0000ead, 0x8e97: 0xe0000eaa, + 0x8e98: 0xe0000ed6, 0x8e99: 0xe0000ed3, 0x8e9a: 0xe0000ef4, 0x8e9b: 0xe0000ef1, + 0x8e9c: 0xe0000efb, 0x8e9d: 0xe0000ef7, 0x8e9e: 0xe0000f02, 0x8e9f: 0xe0000eff, + 0x8ea0: 0xe0000f41, 0x8ea1: 0xe0000f3e, 0x8ea2: 0xe0000f53, 0x8ea3: 0xe0000f50, + 0x8ea4: 0xe0000f26, 0x8ea5: 0xe0000f22, 0x8ea6: 0xe00029b4, 0x8ea7: 0xe00029b1, + 0x8ea8: 0xe0000f5a, 0x8ea9: 0xe0000f56, 0x8eaa: 0xe0000f93, 0x8eab: 0xe0000f90, + 0x8eac: 0xe0000f9f, 0x8ead: 0xe0000f9c, 0x8eae: 0xe0000fb1, 0x8eaf: 0xe0000fae, + 0x8eb0: 0xe0000fab, 0x8eb1: 0xe0000fa8, 0x8eb2: 0xe0001093, 0x8eb3: 0xe0001090, + 0x8eb4: 0xe000109f, 0x8eb5: 0xe000109c, 0x8eb6: 0xe0001099, 0x8eb7: 0xe0001096, + 0x8eb8: 0xe0001032, 0x8eb9: 0xe000102e, 0x8eba: 0xe0002685, 0x8ebb: 0xe0002682, + 0x8ebc: 0xe00010a9, 0x8ebd: 0xe00010a6, 0x8ebe: 0xe00010af, 0x8ebf: 0xe00010ac, + // Block 0x23b, offset 0x8ec0 + 0x8ec0: 0xe00010d2, 0x8ec1: 0xe00010cf, 0x8ec2: 0xe00010cc, 0x8ec3: 0xe00010c9, + 0x8ec4: 0xe00010e1, 0x8ec5: 0xe00010de, 0x8ec6: 0xe00010e7, 0x8ec7: 0xe00010e4, + 0x8ec8: 0xe00010ed, 0x8ec9: 0xe00010ea, 0x8eca: 0xe00010fc, 0x8ecb: 0xe00010f9, + 0x8ecc: 0xe00010f6, 0x8ecd: 0xe00010f3, 0x8ece: 0xe0001123, 0x8ecf: 0xe0001120, + 0x8ed0: 0xe0001141, 0x8ed1: 0xe000113e, 0x8ed2: 0xe0001153, 0x8ed3: 0xe0001150, + 0x8ed4: 0xe0001159, 0x8ed5: 0xe0001156, 0x8ed6: 0xe0000c15, 0x8ed7: 0xe0000f8d, + 0x8ed8: 0xe00010db, 0x8ed9: 0xe0001111, 0x8eda: 0xf0000404, 0x8edb: 0xe0000f70, + 0x8edc: 0x40300420, 0x8edd: 0x40300620, 0x8ede: 0xe0000f7f, 0x8edf: 0x402c9620, + 0x8ee0: 0xe000099b, 0x8ee1: 0xe0000998, 0x8ee2: 0xe0000989, 0x8ee3: 0xe0000986, + 0x8ee4: 0xe0002791, 0x8ee5: 0xe000278e, 0x8ee6: 0xe0000930, 0x8ee7: 0xe000092c, + 0x8ee8: 0xe0000940, 0x8ee9: 0xe000093c, 0x8eea: 0xe00029d2, 0x8eeb: 0xe00029cf, + 0x8eec: 0xe00009aa, 0x8eed: 0xe00009a6, 0x8eee: 0xe000278b, 0x8eef: 0xe0002788, + 0x8ef0: 0xe000090a, 0x8ef1: 0xe0000906, 0x8ef2: 0xe000091a, 0x8ef3: 0xe0000916, + 0x8ef4: 0xe00029cc, 0x8ef5: 0xe00029c9, 0x8ef6: 0xe00009a2, 0x8ef7: 0xe000099e, + 0x8ef8: 0xe0000b6e, 0x8ef9: 0xe0000b6b, 0x8efa: 0xe0000b5c, 0x8efb: 0xe0000b59, + 0x8efc: 0xe0000b26, 0x8efd: 0xe0000b23, 0x8efe: 0xe0000afb, 0x8eff: 0xe0000af7, + // Block 0x23c, offset 0x8f00 + 0x8f00: 0xe0000b03, 0x8f01: 0xe0000aff, 0x8f02: 0xe0000b13, 0x8f03: 0xe0000b0f, + 0x8f04: 0xe0000b0b, 0x8f05: 0xe0000b07, 0x8f06: 0xe0000b75, 0x8f07: 0xe0000b71, + 0x8f08: 0xe0000c66, 0x8f09: 0xe0000c63, 0x8f0a: 0xe0000c78, 0x8f0b: 0xe0000c75, + 0x8f0c: 0xe0000e84, 0x8f0d: 0xe0000e81, 0x8f0e: 0xe0000e44, 0x8f0f: 0xe0000e41, + 0x8f10: 0xe0002764, 0x8f11: 0xe0002761, 0x8f12: 0xe00029f0, 0x8f13: 0xe00029ed, + 0x8f14: 0xe00029fc, 0x8f15: 0xe00029f9, 0x8f16: 0xe00029f6, 0x8f17: 0xe00029f3, + 0x8f18: 0xe0002a02, 0x8f19: 0xe00029ff, 0x8f1a: 0xe0000e5d, 0x8f1b: 0xe0000e59, + 0x8f1c: 0xe0000e65, 0x8f1d: 0xe0000e61, 0x8f1e: 0xe0000e75, 0x8f1f: 0xe0000e71, + 0x8f20: 0xe00029ea, 0x8f21: 0xe00029e7, 0x8f22: 0xe0000e7d, 0x8f23: 0xe0000e79, + 0x8f24: 0xe000108d, 0x8f25: 0xe000108a, 0x8f26: 0xe000104d, 0x8f27: 0xe000104a, + 0x8f28: 0xe0001066, 0x8f29: 0xe0001062, 0x8f2a: 0xe000106e, 0x8f2b: 0xe000106a, + 0x8f2c: 0xe000107e, 0x8f2d: 0xe000107a, 0x8f2e: 0xe0001076, 0x8f2f: 0xe0001072, + 0x8f30: 0xe0001086, 0x8f31: 0xe0001082, 0x8f32: 0xe0001108, 0x8f33: 0xe0001105, + 0x8f34: 0xe0001135, 0x8f35: 0xe0001132, 0x8f36: 0xe000112f, 0x8f37: 0xe000112c, + 0x8f38: 0xe000111d, 0x8f39: 0xe000111a, 0x8f3a: 0xe0000d0a, 0x8f3b: 0xe0000d07, + 0x8f3c: 0x0030d888, 0x8f3d: 0x4030d820, 0x8f3e: 0x00312088, 0x8f3f: 0x40312020, + // Block 0x23d, offset 0x8f40 + 0x8f40: 0xa0000000, 0x8f41: 0xa0000000, 0x8f42: 0xa0000000, 0x8f43: 0xa0000000, + 0x8f44: 0xa0000000, 0x8f45: 0xa0000000, 0x8f46: 0xa0000000, 0x8f47: 0xa0000000, + 0x8f48: 0xa0000000, 0x8f49: 0x40020020, 0x8f4a: 0x40020220, 0x8f4b: 0x40020420, + 0x8f4c: 0x40020620, 0x8f4d: 0x40020820, 0x8f4e: 0xa0000000, 0x8f4f: 0xa0000000, + 0x8f50: 0xa0000000, 0x8f51: 0xa0000000, 0x8f52: 0xa0000000, 0x8f53: 0xa0000000, + 0x8f54: 0xa0000000, 0x8f55: 0xa0000000, 0x8f56: 0xa0000000, 0x8f57: 0xa0000000, + 0x8f58: 0xa0000000, 0x8f59: 0xa0000000, 0x8f5a: 0xa0000000, 0x8f5b: 0xa0000000, + 0x8f5c: 0xa0000000, 0x8f5d: 0xa0000000, 0x8f5e: 0xa0000000, 0x8f5f: 0xa0000000, + 0x8f60: 0x40021220, 0x8f61: 0x4002ba20, 0x8f62: 0x4003e020, 0x8f63: 0x4004ea20, + 0x8f64: 0x4027de20, 0x8f65: 0x4004ec20, 0x8f66: 0x4004e620, 0x8f67: 0x4003d220, + 0x8f68: 0x4003f420, 0x8f69: 0x4003f620, 0x8f6a: 0x4004d820, 0x8f6b: 0x40093820, + 0x8f6c: 0x40024020, 0x8f6d: 0x40021a20, 0x8f6e: 0x4002e420, 0x8f6f: 0x4004e220, + 0x8f70: 0x4029cc20, 0x8f71: 0x4029ce20, 0x8f72: 0x4029d020, 0x8f73: 0x4029d220, + 0x8f74: 0x4029d420, 0x8f75: 0x4029d620, 0x8f76: 0x4029d820, 0x8f77: 0x4029da20, + 0x8f78: 0x4029dc20, 0x8f79: 0x4029de20, 0x8f7a: 0x40026c20, 0x8f7b: 0x40026220, + 0x8f7c: 0x40094020, 0x8f7d: 0xc32f0851, 0x8f7e: 0x40094420, 0x8f7f: 0x4002c420, + // Block 0x23e, offset 0x8f80 + 0x8f80: 0x4004d620, 0x8f81: 0xc4400cb1, 0x8f82: 0x002c0a88, 0x8f83: 0xc33b08d1, + 0x8f84: 0xc35b08d1, 0x8f85: 0xc36008f1, 0x8f86: 0x002d0888, 0x8f87: 0x002d2288, + 0x8f88: 0x002d6888, 0x8f89: 0xc36508b1, 0x8f8a: 0x002dcc88, 0x8f8b: 0x002dfe88, + 0x8f8c: 0xc4480eb3, 0x8f8d: 0x002e8288, 0x8f8e: 0xc36908d1, 0x8f8f: 0xc4500f21, + 0x8f90: 0x002f2c88, 0x8f91: 0x002f5688, 0x8f92: 0xc45608f1, 0x8f93: 0xc34908d1, + 0x8f94: 0xc37108d1, 0x8f95: 0xc3760921, 0x8f96: 0x0030be88, 0x8f97: 0x0030e288, + 0x8f98: 0x0030f688, 0x8f99: 0xc37b08b1, 0x8f9a: 0xc37f08d1, 0x8f9b: 0x4003f820, + 0x8f9c: 0x4004e420, 0x8f9d: 0x4003fa20, 0x8f9e: 0x40062420, 0x8f9f: 0x40021620, + 0x8fa0: 0x40061e20, 0x8fa1: 0xc43d0cb1, 0x8fa2: 0x402c0a20, 0x8fa3: 0xc33908d1, + 0x8fa4: 0xc35908d1, 0x8fa5: 0xc35d08f1, 0x8fa6: 0x402d0820, 0x8fa7: 0x402d2220, + 0x8fa8: 0x402d6820, 0x8fa9: 0xc36308b1, 0x8faa: 0x402dcc20, 0x8fab: 0x402dfe20, + 0x8fac: 0xc4430eb3, 0x8fad: 0x402e8220, 0x8fae: 0xc36708d1, 0x8faf: 0xc44d0f21, + 0x8fb0: 0x402f2c20, 0x8fb1: 0x402f5620, 0x8fb2: 0xc45308f1, 0x8fb3: 0xc34708d1, + 0x8fb4: 0xc36f08d1, 0x8fb5: 0xc3730921, 0x8fb6: 0x4030be20, 0x8fb7: 0x4030e220, + 0x8fb8: 0x4030f620, 0x8fb9: 0xc37908b1, 0x8fba: 0xc37d08d1, 0x8fbb: 0x4003fc20, + 0x8fbc: 0x40094820, 0x8fbd: 0x4003fe20, 0x8fbe: 0x40094c20, 0x8fbf: 0xa0000000, + // Block 0x23f, offset 0x8fc0 + 0x8fc0: 0xe00008f5, 0x8fc1: 0x002be083, 0x8fc2: 0xe0000921, 0x8fc3: 0xe0000969, + 0x8fc4: 0x002be283, 0x8fc5: 0xe000094d, 0x8fc6: 0xe00009dd, 0x8fc7: 0xe0000a53, + 0x8fc8: 0xe0000ae8, 0x8fc9: 0x002c9a83, 0x8fca: 0xe0000af4, 0x8fcb: 0xe0000b20, + 0x8fcc: 0xe0000c2b, 0x8fcd: 0x002d9c83, 0x8fce: 0xe0000c37, 0x8fcf: 0xe0000c43, + 0x8fd0: 0xe0000ab3, 0x8fd1: 0xe0000d63, 0x8fd2: 0xe0000d9a, 0x8fd3: 0x002ee483, + 0x8fd4: 0x002ee683, 0x8fd5: 0xe0000de6, 0x8fd6: 0xe0000dd2, 0x8fd7: 0x40093e20, + 0x8fd8: 0xe0000e12, 0x8fd9: 0xe0000fe1, 0x8fda: 0x00306e83, 0x8fdb: 0xe0000fed, + 0x8fdc: 0xe0000fff, 0x8fdd: 0x00310283, 0x8fde: 0x00318888, 0x8fdf: 0xe0000f7b, + 0x8fe0: 0xe00008f2, 0x8fe1: 0x402be020, 0x8fe2: 0xe000091e, 0x8fe3: 0xe0000966, + 0x8fe4: 0x402be220, 0x8fe5: 0xe000094a, 0x8fe6: 0xe00009d5, 0x8fe7: 0xe0000a4d, + 0x8fe8: 0xe0000ae5, 0x8fe9: 0x402c9a20, 0x8fea: 0xe0000af1, 0x8feb: 0xe0000b1d, + 0x8fec: 0xe0000c28, 0x8fed: 0x402d9c20, 0x8fee: 0xe0000c34, 0x8fef: 0xe0000c40, + 0x8ff0: 0xe0000aad, 0x8ff1: 0xe0000d60, 0x8ff2: 0xe0000d97, 0x8ff3: 0x402ee420, + 0x8ff4: 0x402ee620, 0x8ff5: 0xe0000de3, 0x8ff6: 0xe0000dcf, 0x8ff7: 0x40093c20, + 0x8ff8: 0xe0000e0f, 0x8ff9: 0xe0000fde, 0x8ffa: 0x40306e20, 0x8ffb: 0xe0000fea, + 0x8ffc: 0xe0000ffc, 0x8ffd: 0x40310220, 0x8ffe: 0x40318820, 0x8fff: 0xe0001114, + // Block 0x240, offset 0x9000 + 0x9000: 0xe0000983, 0x9001: 0xe0000980, 0x9002: 0xe00008fb, 0x9003: 0xe00008f8, + 0x9004: 0xe000097d, 0x9005: 0xe000097a, 0x9006: 0xe0000a38, 0x9007: 0xe0000a35, + 0x9008: 0xe0000a3e, 0x9009: 0xe0000a3b, 0x900a: 0xe0000a4a, 0x900b: 0xe0000a47, + 0x900c: 0x002c3c83, 0x900d: 0x402c3c20, 0x900e: 0x002c6483, 0x900f: 0x402c6420, + 0x9010: 0xe0000aaa, 0x9011: 0xe0000aa7, 0x9012: 0xe0000b46, 0x9013: 0xe0000b43, + 0x9014: 0xe0000aee, 0x9015: 0xe0000aeb, 0x9016: 0xe0000b2c, 0x9017: 0xe0000b29, + 0x9018: 0xe0000b40, 0x9019: 0xe0000b3d, 0x901a: 0x002c9c83, 0x901b: 0x402c9c20, + 0x901c: 0xe0000bb8, 0x901d: 0xe0000bb5, 0x901e: 0xe0000bb2, 0x901f: 0xe0000baf, + 0x9020: 0xe0000bc4, 0x9021: 0xe0000bc1, 0x9022: 0xe0000bca, 0x9023: 0xe0000bc7, + 0x9024: 0xe0000bee, 0x9025: 0xe0000beb, 0x9026: 0xe0000c1b, 0x9027: 0xe0000c18, + 0x9028: 0xe0000c51, 0x9029: 0xe0000c4e, 0x902a: 0xe0000c60, 0x902b: 0xe0000c5d, + 0x902c: 0xe0000c31, 0x902d: 0xe0000c2e, 0x902e: 0xe0000c5a, 0x902f: 0xe0000c57, + 0x9030: 0xe0000c54, 0x9031: 0x402da220, 0x9032: 0xf0000a0a, 0x9033: 0xf0000404, + 0x9034: 0xe0000c8a, 0x9035: 0xe0000c87, 0x9036: 0xe0000c9f, 0x9037: 0xe0000c9c, + 0x9038: 0x402f7220, 0x9039: 0x002e2483, 0x903a: 0x402e2420, 0x903b: 0xe0000cd8, + 0x903c: 0xe0000cd5, 0x903d: 0x002e2683, 0x903e: 0x402e2620, 0x903f: 0xe0000d04, + // Block 0x241, offset 0x9040 + 0x9040: 0xe0000cfe, 0x9041: 0xe0000cf8, 0x9042: 0xe0000cf5, 0x9043: 0xe0000d51, + 0x9044: 0xe0000d4e, 0x9045: 0xe0000d6f, 0x9046: 0xe0000d6c, 0x9047: 0x002ea083, + 0x9048: 0x402ea020, 0x9049: 0xf0000404, 0x904a: 0x002eda88, 0x904b: 0x402eda20, + 0x904c: 0xe0000e2e, 0x904d: 0xe0000e2b, 0x904e: 0xe0000da0, 0x904f: 0xe0000d9d, + 0x9050: 0xe0000de0, 0x9051: 0xe0000ddd, 0x9052: 0xe0000e93, 0x9053: 0xe0000e8f, + 0x9054: 0x002f7c83, 0x9055: 0x402f7c20, 0x9056: 0xe0000edc, 0x9057: 0xe0000ed9, + 0x9058: 0x002f7e83, 0x9059: 0x402f7e20, 0x905a: 0xe0000f1f, 0x905b: 0xe0000f1c, + 0x905c: 0xe0000f2d, 0x905d: 0xe0000f2a, 0x905e: 0xe0000f47, 0x905f: 0xe0000f44, + 0x9060: 0x002fe883, 0x9061: 0x402fe820, 0x9062: 0xe0000f99, 0x9063: 0xe0000f96, + 0x9064: 0x00302e83, 0x9065: 0x40302e20, 0x9066: 0x00303688, 0x9067: 0x40303620, + 0x9068: 0xe000102b, 0x9069: 0xe0001028, 0x906a: 0xe000103f, 0x906b: 0xe000103c, + 0x906c: 0xe0000fe7, 0x906d: 0xe0000fe4, 0x906e: 0x00307083, 0x906f: 0x40307020, + 0x9070: 0xe0001025, 0x9071: 0xe0001022, 0x9072: 0xe0001039, 0x9073: 0xe0001036, + 0x9074: 0xe00010d8, 0x9075: 0xe00010d5, 0x9076: 0xe000110e, 0x9077: 0xe000110b, + 0x9078: 0xe0001117, 0x9079: 0xe000113b, 0x907a: 0xe0001138, 0x907b: 0xe000114d, + 0x907c: 0xe000114a, 0x907d: 0x00312c83, 0x907e: 0x40312c20, 0x907f: 0xe0000f64, + // Block 0x242, offset 0x9080 + 0x9080: 0x40321220, 0x9081: 0x40321a20, 0x9082: 0x40322220, 0x9083: 0x40322a20, + 0x9084: 0xe0000ad5, 0x9085: 0xe0000ad1, 0x9086: 0xe0000acd, 0x9087: 0xf0000a0a, + 0x9088: 0xf000040a, 0x9089: 0xf0000404, 0x908a: 0xf0000a0a, 0x908b: 0xf000040a, + 0x908c: 0xf0000404, 0x908d: 0xe0000947, 0x908e: 0xe0000944, 0x908f: 0xe0000c3d, + 0x9090: 0xe0000c3a, 0x9091: 0xe0000dcc, 0x9092: 0xe0000dc9, 0x9093: 0xe0000ff3, + 0x9094: 0xe0000ff0, 0x9095: 0xe000101e, 0x9096: 0xe000101a, 0x9097: 0xe0002658, + 0x9098: 0xe0002655, 0x9099: 0xe0001016, 0x909a: 0xe0001012, 0x909b: 0xe000100e, + 0x909c: 0xe000100a, 0x909d: 0x402cae20, 0x909e: 0xe0002a0e, 0x909f: 0xe0002a0b, + 0x90a0: 0xe0000976, 0x90a1: 0xe0000972, 0x90a2: 0xe00009f4, 0x90a3: 0xe00009ef, + 0x90a4: 0x002d3a88, 0x90a5: 0x402d3a20, 0x90a6: 0xe0000bbe, 0x90a7: 0xe0000bbb, + 0x90a8: 0xe0000c99, 0x90a9: 0xe0000c96, 0x90aa: 0xe0000e20, 0x90ab: 0xe0000e1d, + 0x90ac: 0xe0000e27, 0x90ad: 0xe0000e23, 0x90ae: 0xe0001162, 0x90af: 0xe000115f, + 0x90b0: 0xe0000c8d, 0x90b1: 0xf0000a0a, 0x90b2: 0xf000040a, 0x90b3: 0xf0000404, + 0x90b4: 0xe0000bac, 0x90b5: 0xe0000ba9, 0x90b6: 0x002d7888, 0x90b7: 0x00319488, + 0x90b8: 0xe0000d57, 0x90b9: 0xe0000d54, 0x90ba: 0xe000262e, 0x90bb: 0xe000262b, + 0x90bc: 0xe00009ea, 0x90bd: 0xe00009e5, 0x90be: 0xe0000e19, 0x90bf: 0xe0000e15, + // Block 0x243, offset 0x90c0 + 0x90c0: 0xe0000b03, 0x90c1: 0xe0000aff, 0x90c2: 0xe0000b13, 0x90c3: 0xe0000b0f, + 0x90c4: 0xe0000b0b, 0x90c5: 0xe0000b07, 0x90c6: 0xe0000b75, 0x90c7: 0xe0000b71, + 0x90c8: 0xe0000c66, 0x90c9: 0xe0000c63, 0x90ca: 0xe0000c78, 0x90cb: 0xe0000c75, + 0x90cc: 0xe0000e84, 0x90cd: 0xe0000e81, 0x90ce: 0xe0000e44, 0x90cf: 0xe0000e41, + 0x90d0: 0xe0002a14, 0x90d1: 0xe0002a11, 0x90d2: 0xe0002a1a, 0x90d3: 0xe0002a17, + 0x90d4: 0xe0002a26, 0x90d5: 0xe0002a23, 0x90d6: 0xe0002a20, 0x90d7: 0xe0002a1d, + 0x90d8: 0xe0002a2c, 0x90d9: 0xe0002a29, 0x90da: 0xe000264c, 0x90db: 0xe0002649, + 0x90dc: 0xe0000e65, 0x90dd: 0xe0000e61, 0x90de: 0xe0000e75, 0x90df: 0xe0000e71, + 0x90e0: 0xe0000e6d, 0x90e1: 0xe0000e69, 0x90e2: 0xe0000e7d, 0x90e3: 0xe0000e79, + 0x90e4: 0xe000108d, 0x90e5: 0xe000108a, 0x90e6: 0xe000104d, 0x90e7: 0xe000104a, + 0x90e8: 0xe0002664, 0x90e9: 0xe0002661, 0x90ea: 0xe000106e, 0x90eb: 0xe000106a, + 0x90ec: 0xe000107e, 0x90ed: 0xe000107a, 0x90ee: 0xe0001076, 0x90ef: 0xe0001072, + 0x90f0: 0xe0001086, 0x90f1: 0xe0001082, 0x90f2: 0xe0001108, 0x90f3: 0xe0001105, + 0x90f4: 0xe0001135, 0x90f5: 0xe0001132, 0x90f6: 0xe000112f, 0x90f7: 0xe000112c, + 0x90f8: 0xe000111d, 0x90f9: 0xe000111a, 0x90fa: 0xe0000d0a, 0x90fb: 0xe0000d07, + 0x90fc: 0x0030d888, 0x90fd: 0x4030d820, 0x90fe: 0x00312088, 0x90ff: 0x40312020, + // Block 0x244, offset 0x9100 + 0x9100: 0xa0000000, 0x9101: 0xa0000000, 0x9102: 0xa0000000, 0x9103: 0xa0000000, + 0x9104: 0xa0000000, 0x9105: 0xa0000000, 0x9106: 0xa0000000, 0x9107: 0xa0000000, + 0x9108: 0xa0000000, 0x9109: 0x40020020, 0x910a: 0x40020220, 0x910b: 0x40020420, + 0x910c: 0x40020620, 0x910d: 0x40020820, 0x910e: 0xa0000000, 0x910f: 0xa0000000, + 0x9110: 0xa0000000, 0x9111: 0xa0000000, 0x9112: 0xa0000000, 0x9113: 0xa0000000, + 0x9114: 0xa0000000, 0x9115: 0xa0000000, 0x9116: 0xa0000000, 0x9117: 0xa0000000, + 0x9118: 0xa0000000, 0x9119: 0xa0000000, 0x911a: 0xa0000000, 0x911b: 0xa0000000, + 0x911c: 0xa0000000, 0x911d: 0xa0000000, 0x911e: 0xa0000000, 0x911f: 0xa0000000, + 0x9120: 0x40021220, 0x9121: 0x4002ba20, 0x9122: 0x4003e020, 0x9123: 0x4004ea20, + 0x9124: 0x4027de20, 0x9125: 0x4004ec20, 0x9126: 0x4004e620, 0x9127: 0x4003d220, + 0x9128: 0x4003f420, 0x9129: 0x4003f620, 0x912a: 0x4004d820, 0x912b: 0x40093820, + 0x912c: 0x40024020, 0x912d: 0x40021a20, 0x912e: 0x4002e420, 0x912f: 0x4004e220, + 0x9130: 0x4029cc20, 0x9131: 0x4029ce20, 0x9132: 0x4029d020, 0x9133: 0x4029d220, + 0x9134: 0x4029d420, 0x9135: 0x4029d620, 0x9136: 0x4029d820, 0x9137: 0x4029da20, + 0x9138: 0x4029dc20, 0x9139: 0x4029de20, 0x913a: 0x40026c20, 0x913b: 0x40026220, + 0x913c: 0x40094020, 0x913d: 0xc32f0851, 0x913e: 0x40094420, 0x913f: 0x4002c420, + // Block 0x245, offset 0x9140 + 0x9140: 0x4004d620, 0x9141: 0xc3a90a51, 0x9142: 0x002c0a88, 0x9143: 0x002c3a88, + 0x9144: 0x002c6288, 0x9145: 0xc45b0a11, 0x9146: 0x002d0888, 0x9147: 0x002d2288, + 0x9148: 0x002d6888, 0x9149: 0x002d9a88, 0x914a: 0x002dcc88, 0x914b: 0x002dfe88, + 0x914c: 0xc0030002, 0x914d: 0x002e8288, 0x914e: 0x002e9e88, 0x914f: 0xc4610f41, + 0x9150: 0x002f2c88, 0x9151: 0x002f5688, 0x9152: 0x002f7a88, 0x9153: 0x002fe688, + 0x9154: 0x00302c88, 0x9155: 0xc3840951, 0x9156: 0x0030be83, 0x9157: 0x0030bea3, + 0x9158: 0x0030f688, 0x9159: 0x00310088, 0x915a: 0x00312a88, 0x915b: 0x4003f820, + 0x915c: 0x4004e420, 0x915d: 0x4003fa20, 0x915e: 0x40062420, 0x915f: 0x40021620, + 0x9160: 0x40061e20, 0x9161: 0xc3a60a51, 0x9162: 0x402c0a20, 0x9163: 0x402c3a20, + 0x9164: 0x402c6220, 0x9165: 0xc4590a11, 0x9166: 0x402d0820, 0x9167: 0x402d2220, + 0x9168: 0x402d6820, 0x9169: 0x402d9a20, 0x916a: 0x402dcc20, 0x916b: 0x402dfe20, + 0x916c: 0xc0000002, 0x916d: 0x402e8220, 0x916e: 0x402e9e20, 0x916f: 0xc45d0f41, + 0x9170: 0x402f2c20, 0x9171: 0x402f5620, 0x9172: 0x402f7a20, 0x9173: 0x402fe620, + 0x9174: 0x40302c20, 0x9175: 0xc3810951, 0x9176: 0x4030be20, 0x9177: 0x4030be21, + 0x9178: 0x4030f620, 0x9179: 0x40310020, 0x917a: 0x40312a20, 0x917b: 0x4003fc20, + 0x917c: 0x40094820, 0x917d: 0x4003fe20, 0x917e: 0x40094c20, 0x917f: 0xa0000000, + // Block 0x246, offset 0x9180 + 0x9180: 0xe00008f5, 0x9181: 0xe00008ef, 0x9182: 0xe0000921, 0x9183: 0xe0000969, + 0x9184: 0x00320e83, 0x9185: 0x00320c83, 0x9186: 0x00320ea3, 0x9187: 0xe0000a53, + 0x9188: 0xe0000ae8, 0x9189: 0xe0000ae2, 0x918a: 0xe0000af4, 0x918b: 0xe0000b20, + 0x918c: 0xe0000c2b, 0x918d: 0xe0000c25, 0x918e: 0xe0000c37, 0x918f: 0xe0000c43, + 0x9190: 0x002c62c3, 0x9191: 0xe0000d63, 0x9192: 0xe0000d9a, 0x9193: 0xe0000d94, + 0x9194: 0x00321103, 0x9195: 0xe0000de6, 0x9196: 0x00321083, 0x9197: 0x40093e20, + 0x9198: 0x003210a3, 0x9199: 0xe0000fe1, 0x919a: 0xe0000fdb, 0x919b: 0xe0000fed, + 0x919c: 0x003100a3, 0x919d: 0xe0001102, 0x919e: 0xe000266d, 0x919f: 0xe0000f7b, + 0x91a0: 0xe00008f2, 0x91a1: 0xe00008ec, 0x91a2: 0xe000091e, 0x91a3: 0xe0000966, + 0x91a4: 0x40320e20, 0x91a5: 0x40320c20, 0x91a6: 0x40320e21, 0x91a7: 0xe0000a4d, + 0x91a8: 0xe0000ae5, 0x91a9: 0xe0000adf, 0x91aa: 0xe0000af1, 0x91ab: 0xe0000b1d, + 0x91ac: 0xe0000c28, 0x91ad: 0xe0000c22, 0x91ae: 0xe0000c34, 0x91af: 0xe0000c40, + 0x91b0: 0x402c6222, 0x91b1: 0xe0000d60, 0x91b2: 0xe0000d97, 0x91b3: 0xe0000d91, + 0x91b4: 0x40321024, 0x91b5: 0xe0000de3, 0x91b6: 0x40321020, 0x91b7: 0x40093c20, + 0x91b8: 0x40321021, 0x91b9: 0xe0000fde, 0x91ba: 0xe0000fd8, 0x91bb: 0xe0000fea, + 0x91bc: 0x40310021, 0x91bd: 0xe00010ff, 0x91be: 0xe000266a, 0x91bf: 0xe0001114, + // Block 0x247, offset 0x91c0 + 0x91c0: 0xe0000983, 0x91c1: 0xe0000980, 0x91c2: 0xe00008fb, 0x91c3: 0xe00008f8, + 0x91c4: 0xe000097d, 0x91c5: 0xe000097a, 0x91c6: 0xe0000a38, 0x91c7: 0xe0000a35, + 0x91c8: 0xe0000a3e, 0x91c9: 0xe0000a3b, 0x91ca: 0xe0000a4a, 0x91cb: 0xe0000a47, + 0x91cc: 0xe0000a44, 0x91cd: 0xe0000a41, 0x91ce: 0xe0000a86, 0x91cf: 0xe0000a83, + 0x91d0: 0x002c62a3, 0x91d1: 0x402c6221, 0x91d2: 0xe0000b46, 0x91d3: 0xe0000b43, + 0x91d4: 0xe0000aee, 0x91d5: 0xe0000aeb, 0x91d6: 0xe0000b2c, 0x91d7: 0xe0000b29, + 0x91d8: 0x00320ec3, 0x91d9: 0x40320e22, 0x91da: 0xe0000b1a, 0x91db: 0xe0000b17, + 0x91dc: 0xe0000bb8, 0x91dd: 0xe0000bb5, 0x91de: 0xe0000bb2, 0x91df: 0xe0000baf, + 0x91e0: 0xe0000bc4, 0x91e1: 0xe0000bc1, 0x91e2: 0xe0000bca, 0x91e3: 0xe0000bc7, + 0x91e4: 0xe0000bee, 0x91e5: 0xe0000beb, 0x91e6: 0xe0000c1b, 0x91e7: 0xe0000c18, + 0x91e8: 0xe0000c51, 0x91e9: 0xe0000c4e, 0x91ea: 0xe0000c60, 0x91eb: 0xe0000c5d, + 0x91ec: 0xe0000c31, 0x91ed: 0xe0000c2e, 0x91ee: 0xe0000c5a, 0x91ef: 0xe0000c57, + 0x91f0: 0xe0000c54, 0x91f1: 0x402da220, 0x91f2: 0xf0000a0a, 0x91f3: 0xf0000404, + 0x91f4: 0xe0000c8a, 0x91f5: 0xe0000c87, 0x91f6: 0xe0000c9f, 0x91f7: 0xe0000c9c, + 0x91f8: 0x402f7220, 0x91f9: 0xe0000ccc, 0x91fa: 0xe0000cc9, 0x91fb: 0xe0000cd8, + 0x91fc: 0xe0000cd5, 0x91fd: 0xe0000cd2, 0x91fe: 0xe0000ccf, 0x91ff: 0xe0000d04, + // Block 0x248, offset 0x9200 + 0x9200: 0xe0000cfe, 0x9201: 0xe0000cf8, 0x9202: 0xe0000cf5, 0x9203: 0xe0000d51, + 0x9204: 0xe0000d4e, 0x9205: 0xe0000d6f, 0x9206: 0xe0000d6c, 0x9207: 0xe0000d5d, + 0x9208: 0xe0000d5a, 0x9209: 0xf0000404, 0x920a: 0x002eda88, 0x920b: 0x402eda20, + 0x920c: 0xe0000e2e, 0x920d: 0xe0000e2b, 0x920e: 0xe0000da0, 0x920f: 0xe0000d9d, + 0x9210: 0x003210c3, 0x9211: 0x40321022, 0x9212: 0x003210e3, 0x9213: 0x40321023, + 0x9214: 0xe0000eca, 0x9215: 0xe0000ec7, 0x9216: 0xe0000edc, 0x9217: 0xe0000ed9, + 0x9218: 0xe0000ed0, 0x9219: 0xe0000ecd, 0x921a: 0xe0000f1f, 0x921b: 0xe0000f1c, + 0x921c: 0xe0000f2d, 0x921d: 0xe0000f2a, 0x921e: 0xe0000f47, 0x921f: 0xe0000f44, + 0x9220: 0xe0000f33, 0x9221: 0xe0000f30, 0x9222: 0xe0000f99, 0x9223: 0xe0000f96, + 0x9224: 0xe0000f8a, 0x9225: 0xe0000f87, 0x9226: 0x00303688, 0x9227: 0x40303620, + 0x9228: 0xe000102b, 0x9229: 0xe0001028, 0x922a: 0xe000103f, 0x922b: 0xe000103c, + 0x922c: 0xe0000fe7, 0x922d: 0xe0000fe4, 0x922e: 0xe0000ff9, 0x922f: 0xe0000ff6, + 0x9230: 0x003100c3, 0x9231: 0x40310022, 0x9232: 0xe0001039, 0x9233: 0xe0001036, + 0x9234: 0xe0002728, 0x9235: 0xe0002725, 0x9236: 0xe000110e, 0x9237: 0xe000110b, + 0x9238: 0xe0001117, 0x9239: 0xe000113b, 0x923a: 0xe0001138, 0x923b: 0xe000114d, + 0x923c: 0xe000114a, 0x923d: 0xe0001147, 0x923e: 0xe0001144, 0x923f: 0xe0000f64, + // Block 0x249, offset 0x9240 + 0x9240: 0xe000098f, 0x9241: 0xe000098c, 0x9242: 0xe0000995, 0x9243: 0xe0000992, + 0x9244: 0xe0000b62, 0x9245: 0xe0000b5f, 0x9246: 0xe0000b68, 0x9247: 0xe0000b65, + 0x9248: 0xe0000c6c, 0x9249: 0xe0000c69, 0x924a: 0xe0000c72, 0x924b: 0xe0000c6f, + 0x924c: 0xe0000e4a, 0x924d: 0xe0000e47, 0x924e: 0xe0000e50, 0x924f: 0xe0000e4d, + 0x9250: 0xe0000ee8, 0x9251: 0xe0000ee5, 0x9252: 0xe0000eee, 0x9253: 0xe0000eeb, + 0x9254: 0xe0001053, 0x9255: 0xe0001050, 0x9256: 0xe0001059, 0x9257: 0xe0001056, + 0x9258: 0xe0000f61, 0x9259: 0xe0000f5e, 0x925a: 0xe0000fa5, 0x925b: 0xe0000fa2, + 0x925c: 0x00312288, 0x925d: 0x40312220, 0x925e: 0xe0000bf4, 0x925f: 0xe0000bf1, + 0x9260: 0x002ebc88, 0x9261: 0x402c8c20, 0x9262: 0x002f2288, 0x9263: 0x402f2220, + 0x9264: 0x00314088, 0x9265: 0x40314020, 0x9266: 0xe000096f, 0x9267: 0xe000096c, + 0x9268: 0xe0000b32, 0x9269: 0xe0000b2f, 0x926a: 0xe0002758, 0x926b: 0xe0002755, + 0x926c: 0xe0000dfd, 0x926d: 0xe0000df9, 0x926e: 0xe0000e04, 0x926f: 0xe0000e01, + 0x9270: 0xe0000e0b, 0x9271: 0xe0000e07, 0x9272: 0xe0001129, 0x9273: 0xe0001126, + 0x9274: 0x402e5e20, 0x9275: 0x402ed020, 0x9276: 0x40305a20, 0x9277: 0x402dd420, + 0x9278: 0xe0000abf, 0x9279: 0xe0000ec4, 0x927a: 0x002be888, 0x927b: 0x002c4488, + 0x927c: 0x402c4420, 0x927d: 0x002e3888, 0x927e: 0x00303e88, 0x927f: 0x402ffc20, + // Block 0x24a, offset 0x9280 + 0x9280: 0xe0000d24, 0x9281: 0xe0000d21, 0x9282: 0xe0000d2a, 0x9283: 0xe0000d27, + 0x9284: 0xe0000d69, 0x9285: 0xe0000d66, 0x9286: 0xe0000d7b, 0x9287: 0xe0000d78, + 0x9288: 0xe0000d87, 0x9289: 0xe0000d84, 0x928a: 0xe0000d81, 0x928b: 0xe0000d7e, + 0x928c: 0xe0000ded, 0x928d: 0xe0000de9, 0x928e: 0xe0002a38, 0x928f: 0xe0002a35, + 0x9290: 0xe0000e3d, 0x9291: 0xe0000e39, 0x9292: 0xe0000e35, 0x9293: 0xe0000e31, + 0x9294: 0xe0000ea7, 0x9295: 0xe0000ea4, 0x9296: 0xe0000ead, 0x9297: 0xe0000eaa, + 0x9298: 0xe0000ed6, 0x9299: 0xe0000ed3, 0x929a: 0xe0000ef4, 0x929b: 0xe0000ef1, + 0x929c: 0xe0000efb, 0x929d: 0xe0000ef7, 0x929e: 0xe0000f02, 0x929f: 0xe0000eff, + 0x92a0: 0xe0000f41, 0x92a1: 0xe0000f3e, 0x92a2: 0xe0000f53, 0x92a3: 0xe0000f50, + 0x92a4: 0xe0000f26, 0x92a5: 0xe0000f22, 0x92a6: 0xe0000f3a, 0x92a7: 0xe0000f36, + 0x92a8: 0xe0000f5a, 0x92a9: 0xe0000f56, 0x92aa: 0xe0000f93, 0x92ab: 0xe0000f90, + 0x92ac: 0xe0000f9f, 0x92ad: 0xe0000f9c, 0x92ae: 0xe0000fb1, 0x92af: 0xe0000fae, + 0x92b0: 0xe0000fab, 0x92b1: 0xe0000fa8, 0x92b2: 0xe0001093, 0x92b3: 0xe0001090, + 0x92b4: 0xe000109f, 0x92b5: 0xe000109c, 0x92b6: 0xe0001099, 0x92b7: 0xe0001096, + 0x92b8: 0xe0001032, 0x92b9: 0xe000102e, 0x92ba: 0xe0002685, 0x92bb: 0xe0002682, + 0x92bc: 0xe0002a2f, 0x92bd: 0xe00010a6, 0x92be: 0xe0002a32, 0x92bf: 0xe00010ac, + // Block 0x24b, offset 0x92c0 + 0x92c0: 0xe0000b03, 0x92c1: 0xe0000aff, 0x92c2: 0xe0000b13, 0x92c3: 0xe0000b0f, + 0x92c4: 0xe0000b0b, 0x92c5: 0xe0000b07, 0x92c6: 0xe0000b75, 0x92c7: 0xe0000b71, + 0x92c8: 0xe0000c66, 0x92c9: 0xe0000c63, 0x92ca: 0xe0000c78, 0x92cb: 0xe0000c75, + 0x92cc: 0xe0000e84, 0x92cd: 0xe0000e81, 0x92ce: 0xe0000e44, 0x92cf: 0xe0000e41, + 0x92d0: 0xe0002a3e, 0x92d1: 0xe0002a3b, 0x92d2: 0xe0002a44, 0x92d3: 0xe0002a41, + 0x92d4: 0xe0002a50, 0x92d5: 0xe0002a4d, 0x92d6: 0xe0002a4a, 0x92d7: 0xe0002a47, + 0x92d8: 0xe0002a56, 0x92d9: 0xe0002a53, 0x92da: 0xe0000e5d, 0x92db: 0xe0000e59, + 0x92dc: 0xe0000e65, 0x92dd: 0xe0000e61, 0x92de: 0xe0000e75, 0x92df: 0xe0000e71, + 0x92e0: 0xe0000e6d, 0x92e1: 0xe0000e69, 0x92e2: 0xe0000e7d, 0x92e3: 0xe0000e79, + 0x92e4: 0xe000108d, 0x92e5: 0xe000108a, 0x92e6: 0xe000104d, 0x92e7: 0xe000104a, + 0x92e8: 0xe0001066, 0x92e9: 0xe0001062, 0x92ea: 0xe000106e, 0x92eb: 0xe000106a, + 0x92ec: 0xe000107e, 0x92ed: 0xe000107a, 0x92ee: 0xe0001076, 0x92ef: 0xe0001072, + 0x92f0: 0xe0001086, 0x92f1: 0xe0001082, 0x92f2: 0xe0001108, 0x92f3: 0xe0001105, + 0x92f4: 0xe0001135, 0x92f5: 0xe0001132, 0x92f6: 0xe000112f, 0x92f7: 0xe000112c, + 0x92f8: 0xe000111d, 0x92f9: 0xe000111a, 0x92fa: 0xe0000d0a, 0x92fb: 0xe0000d07, + 0x92fc: 0x0030d888, 0x92fd: 0x4030d820, 0x92fe: 0x00312088, 0x92ff: 0x40312020, + // Block 0x24c, offset 0x9300 + 0x9300: 0xa0000000, 0x9301: 0xa0000000, 0x9302: 0xa0000000, 0x9303: 0xa0000000, + 0x9304: 0xa0000000, 0x9305: 0xa0000000, 0x9306: 0xa0000000, 0x9307: 0xa0000000, + 0x9308: 0xa0000000, 0x9309: 0x40020020, 0x930a: 0x40020220, 0x930b: 0x40020420, + 0x930c: 0x40020620, 0x930d: 0x40020820, 0x930e: 0xa0000000, 0x930f: 0xa0000000, + 0x9310: 0xa0000000, 0x9311: 0xa0000000, 0x9312: 0xa0000000, 0x9313: 0xa0000000, + 0x9314: 0xa0000000, 0x9315: 0xa0000000, 0x9316: 0xa0000000, 0x9317: 0xa0000000, + 0x9318: 0xa0000000, 0x9319: 0xa0000000, 0x931a: 0xa0000000, 0x931b: 0xa0000000, + 0x931c: 0xa0000000, 0x931d: 0xa0000000, 0x931e: 0xa0000000, 0x931f: 0xa0000000, + 0x9320: 0x40021220, 0x9321: 0x4002ba20, 0x9322: 0x4003e020, 0x9323: 0x4004ea20, + 0x9324: 0x4027de20, 0x9325: 0x4004ec20, 0x9326: 0x4004e620, 0x9327: 0x4003d220, + 0x9328: 0x4003f420, 0x9329: 0x4003f620, 0x932a: 0x4004d820, 0x932b: 0x40093820, + 0x932c: 0x40024020, 0x932d: 0x40021a20, 0x932e: 0x4002e420, 0x932f: 0x4004e220, + 0x9330: 0x4029cc20, 0x9331: 0x4029ce20, 0x9332: 0x4029d020, 0x9333: 0x4029d220, + 0x9334: 0x4029d420, 0x9335: 0x4029d620, 0x9336: 0x4029d820, 0x9337: 0x4029da20, + 0x9338: 0x4029dc20, 0x9339: 0x4029de20, 0x933a: 0x40026c20, 0x933b: 0x40026220, + 0x933c: 0x40094020, 0x933d: 0xc32f0851, 0x933e: 0x40094420, 0x933f: 0x4002c420, + // Block 0x24d, offset 0x9340 + 0x9340: 0x4004d620, 0x9341: 0x002bde88, 0x9342: 0x002c0a88, 0x9343: 0xc33b0871, + 0x9344: 0x002c6288, 0x9345: 0x002c9888, 0x9346: 0x002d0888, 0x9347: 0xc33f00d1, + 0x9348: 0x002d6888, 0x9349: 0xc3410891, 0x934a: 0x002dcc88, 0x934b: 0x002dfe88, + 0x934c: 0xc0030002, 0x934d: 0x002e8288, 0x934e: 0x002e9e88, 0x934f: 0xc3450071, + 0x9350: 0x002f2c88, 0x9351: 0x002f5688, 0x9352: 0x002f7a88, 0x9353: 0xc3490871, + 0x9354: 0x00302c88, 0x9355: 0xc34d0071, 0x9356: 0x0030be88, 0x9357: 0x0030e288, + 0x9358: 0x0030f688, 0x9359: 0x00310088, 0x935a: 0x00312a88, 0x935b: 0x4003f820, + 0x935c: 0x4004e420, 0x935d: 0x4003fa20, 0x935e: 0x40062420, 0x935f: 0x40021620, + 0x9360: 0x40061e20, 0x9361: 0x402bde20, 0x9362: 0x402c0a20, 0x9363: 0xc3390871, + 0x9364: 0x402c6220, 0x9365: 0x402c9820, 0x9366: 0x402d0820, 0x9367: 0xc33d00d1, + 0x9368: 0x402d6820, 0x9369: 0x402d9a20, 0x936a: 0x402dcc20, 0x936b: 0x402dfe20, + 0x936c: 0xc0000002, 0x936d: 0x402e8220, 0x936e: 0x402e9e20, 0x936f: 0xc3430071, + 0x9370: 0x402f2c20, 0x9371: 0x402f5620, 0x9372: 0x402f7a20, 0x9373: 0xc3470871, + 0x9374: 0x40302c20, 0x9375: 0xc34b0071, 0x9376: 0x4030be20, 0x9377: 0x4030e220, + 0x9378: 0x4030f620, 0x9379: 0x40310020, 0x937a: 0x40312a20, 0x937b: 0x4003fc20, + 0x937c: 0x40094820, 0x937d: 0x4003fe20, 0x937e: 0x40094c20, 0x937f: 0xa0000000, + // Block 0x24e, offset 0x9380 + 0x9380: 0x00093685, 0x9381: 0x40083620, 0x9382: 0x40083820, 0x9383: 0x40083a20, + 0x9384: 0x40083c20, 0x9385: 0x002c628b, 0x9386: 0x002c6285, 0x9387: 0x002c9885, + 0x9388: 0x002d9a85, 0x9389: 0x002dcc85, 0x938a: 0x40083e20, 0x938b: 0x400a6e20, + 0x938c: 0x40084020, 0x938d: 0xe00009c4, 0x938e: 0x402d1e20, 0x938f: 0x40084220, + 0x9390: 0xe00002cb, 0x9391: 0xe00002d3, 0x9392: 0xe00002b2, 0x9393: 0xe00002bb, + 0x9394: 0xe00003cd, 0x9395: 0xe00002c3, 0x9396: 0xe00003d1, 0x9397: 0xe00004ab, + 0x9398: 0xe0000579, 0x9399: 0xe00002c7, 0x939a: 0xe0000640, 0x939b: 0xe00002cf, + 0x939c: 0xe00004af, 0x939d: 0xe0000644, 0x939e: 0xe0000798, 0x939f: 0xf0001e1e, + 0x93a0: 0x002d9a8a, 0x93a1: 0xe00025cd, 0x93a2: 0xe00025d0, 0x93a3: 0xe00025da, + 0x93a4: 0x0030be8a, 0x93a5: 0xe000260a, 0x93a6: 0xe000260d, 0x93a7: 0xe00010bb, + 0x93a8: 0xe00025e0, 0x93a9: 0x0030f68a, 0x93aa: 0xe0002614, 0x93ab: 0xe000261b, + 0x93ac: 0x002e228a, 0x93ad: 0x002c3a8a, 0x93ae: 0x002c628a, 0x93af: 0x002e828a, + 0x93b0: 0x002d9a84, 0x93b1: 0xf0001f04, 0x93b2: 0xf0000404, 0x93b3: 0xf0001f04, + 0x93b4: 0x0030be84, 0x93b5: 0xf0001f04, 0x93b6: 0xf0000404, 0x93b7: 0xe00010b6, + 0x93b8: 0xf0001f04, 0x93b9: 0x0030f684, 0x93ba: 0xf0001f04, 0x93bb: 0xf0000404, + 0x93bc: 0x002e2284, 0x93bd: 0x002c3a84, 0x93be: 0x002c6284, 0x93bf: 0x002e8284, + // Block 0x24f, offset 0x93c0 + 0x93c0: 0xf0001f04, 0x93c1: 0xf0001f04, 0x93c2: 0xf0001f04, 0x93c3: 0xf0001f04, + 0x93c4: 0xf0001f04, 0x93c5: 0xf0001f04, 0x93c6: 0xf0001f04, 0x93c7: 0xf0001f04, + 0x93c8: 0xf0001f04, 0x93c9: 0xf0001f04, 0x93ca: 0xf0001f04, + 0x93d0: 0xf0000a04, 0x93d1: 0xf0000a04, 0x93d2: 0xf0000a04, 0x93d3: 0xf0000a04, + 0x93d4: 0xf0000a04, 0x93d5: 0xf0000a04, 0x93d6: 0xf0000a04, 0x93d7: 0xf0000a04, + 0x93d8: 0xe0002576, 0x93d9: 0xf0000a04, 0x93da: 0xf0000a04, 0x93db: 0xf0000a04, + 0x93dc: 0xf0000a04, 0x93dd: 0xf0000a04, 0x93de: 0xf0000a04, 0x93df: 0xf0000a04, + 0x93e0: 0xf0000a04, 0x93e1: 0xf0000a04, 0x93e2: 0xf0000a04, 0x93e3: 0xf0000a04, + 0x93e4: 0xf0000a04, 0x93e5: 0xf0000a04, 0x93e6: 0xf0000a04, 0x93e7: 0xf0000a04, + 0x93e8: 0xf0000a04, 0x93e9: 0xf0000a04, 0x93ea: 0xf0000a04, 0x93eb: 0x002c3a8c, + 0x93ec: 0x002f7a8c, 0x93ed: 0xf0000c0c, 0x93ee: 0xf0000c0c, + 0x93f0: 0x002bde9d, 0x93f1: 0x002c0a9d, 0x93f2: 0x002c3a9d, 0x93f3: 0x002c629d, + 0x93f4: 0x002c989d, 0x93f5: 0x002d089d, 0x93f6: 0x002d229d, 0x93f7: 0x002d689d, + 0x93f8: 0x002d9a9d, 0x93f9: 0x002dcc9d, 0x93fa: 0x002dfe9d, 0x93fb: 0x002e229d, + 0x93fc: 0x002e829d, 0x93fd: 0x002e9e9d, 0x93fe: 0x002ee29d, 0x93ff: 0x002f2c9d, +} + +// mainLookup: 4864 entries, 9728 bytes +// Block 0 is the null block. +var mainLookup = [4864]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0x0e0: 0x1f, 0x0e1: 0x20, 0x0e2: 0x21, 0x0e3: 0x22, 0x0e4: 0x23, 0x0e5: 0x24, 0x0e6: 0x25, 0x0e7: 0x26, + 0x0e8: 0x27, 0x0e9: 0x28, 0x0ea: 0x29, 0x0eb: 0x2a, 0x0ec: 0x2b, 0x0ed: 0x2c, 0x0ee: 0x2d, 0x0ef: 0x2e, + 0x0f0: 0x2f, 0x0f1: 0x30, 0x0f2: 0x31, 0x0f3: 0x32, 0x0f4: 0x33, 0x0f5: 0x34, 0x0f6: 0x35, 0x0f7: 0x36, + 0x0f8: 0x37, 0x0f9: 0x38, 0x0fa: 0x39, 0x0fb: 0x3a, 0x0fc: 0x3b, 0x0fd: 0x3c, 0x0fe: 0x3d, 0x0ff: 0x3e, + // Block 0x4, offset 0x100 + 0x100: 0x3f, 0x101: 0x40, 0x102: 0x41, 0x103: 0x42, 0x104: 0x43, 0x105: 0x44, 0x106: 0x45, 0x107: 0x46, + 0x108: 0x47, 0x109: 0x48, 0x10a: 0x49, 0x10b: 0x4a, 0x10c: 0x4b, 0x10d: 0x4c, 0x10e: 0x4d, 0x10f: 0x4e, + 0x110: 0x4f, 0x111: 0x50, 0x112: 0x51, 0x113: 0x52, 0x114: 0x53, 0x115: 0x54, 0x116: 0x55, 0x117: 0x56, + 0x118: 0x57, 0x119: 0x58, 0x11a: 0x59, 0x11b: 0x5a, 0x11c: 0x5b, 0x11d: 0x5c, 0x11e: 0x5d, 0x11f: 0x5e, + 0x120: 0x5f, 0x121: 0x60, 0x122: 0x61, 0x123: 0x62, 0x124: 0x63, 0x125: 0x64, 0x126: 0x65, 0x127: 0x66, + 0x128: 0x67, 0x129: 0x68, 0x12a: 0x69, 0x12c: 0x6a, 0x12d: 0x6b, 0x12e: 0x6c, 0x12f: 0x6d, + 0x130: 0x6e, 0x131: 0x6f, 0x133: 0x70, 0x134: 0x71, 0x135: 0x72, 0x136: 0x73, 0x137: 0x74, + 0x138: 0x75, 0x139: 0x76, 0x13a: 0x77, 0x13b: 0x78, 0x13c: 0x79, 0x13d: 0x7a, 0x13e: 0x7b, 0x13f: 0x7c, + // Block 0x5, offset 0x140 + 0x140: 0x7d, 0x141: 0x7e, 0x142: 0x7f, 0x143: 0x80, 0x144: 0x81, 0x145: 0x82, 0x146: 0x83, 0x147: 0x84, + 0x148: 0x85, 0x149: 0x86, 0x14a: 0x87, 0x14b: 0x88, 0x14c: 0x89, 0x14d: 0x8a, 0x14e: 0x8b, 0x14f: 0x8c, + 0x150: 0x8d, 0x151: 0x8e, 0x152: 0x8f, 0x153: 0x90, 0x154: 0x91, 0x155: 0x92, 0x156: 0x93, 0x157: 0x94, + 0x158: 0x95, 0x159: 0x96, 0x15a: 0x97, 0x15b: 0x98, 0x15c: 0x99, 0x15d: 0x9a, 0x15e: 0x9b, 0x15f: 0x9c, + 0x160: 0x9d, 0x161: 0x9e, 0x162: 0x9f, 0x163: 0xa0, 0x164: 0xa1, 0x165: 0xa2, 0x166: 0xa3, 0x167: 0xa4, + 0x168: 0xa5, 0x169: 0xa6, 0x16a: 0xa7, 0x16b: 0xa8, 0x16c: 0xa9, 0x16d: 0xaa, + 0x170: 0xab, 0x171: 0xac, 0x172: 0xad, 0x173: 0xae, 0x174: 0xaf, 0x175: 0xb0, 0x176: 0xb1, 0x177: 0xb2, + 0x178: 0xb3, 0x17a: 0xb4, 0x17b: 0xb5, 0x17c: 0xb6, 0x17d: 0xb7, 0x17e: 0xb8, 0x17f: 0xb9, + // Block 0x6, offset 0x180 + 0x180: 0xba, 0x181: 0xbb, 0x182: 0xbc, 0x183: 0xbd, 0x184: 0xbe, 0x185: 0xbf, 0x186: 0xc0, 0x187: 0xc1, + 0x188: 0xc2, 0x189: 0xc3, 0x18a: 0xc4, 0x18b: 0xc5, 0x18c: 0xc6, 0x18d: 0xc7, 0x18e: 0xc8, 0x18f: 0xc9, + // Block 0x7, offset 0x1c0 + 0x1f7: 0xca, + // Block 0x8, offset 0x200 + 0x200: 0xcb, 0x201: 0xcc, 0x202: 0xcd, 0x203: 0xce, 0x204: 0xcf, 0x205: 0xd0, 0x206: 0xd1, 0x207: 0xd2, + 0x208: 0xd3, 0x209: 0xd4, 0x20a: 0xd5, 0x20b: 0xd6, 0x20c: 0xd7, 0x20d: 0xd8, 0x20e: 0xd9, 0x20f: 0xda, + 0x210: 0xdb, 0x211: 0xdc, 0x212: 0xdd, 0x213: 0xde, 0x214: 0xdf, 0x215: 0xe0, 0x216: 0xe1, 0x217: 0xe2, + 0x218: 0xe3, 0x219: 0xe4, 0x21a: 0xe5, 0x21b: 0xe6, 0x21c: 0xe7, 0x21d: 0xe8, 0x21e: 0xe9, 0x21f: 0xea, + 0x220: 0xeb, 0x221: 0xec, 0x222: 0xed, 0x223: 0xee, 0x224: 0xef, 0x225: 0xf0, 0x226: 0xf1, 0x227: 0xf2, + 0x228: 0xf3, 0x229: 0xf4, 0x22a: 0xf5, 0x22b: 0xf6, 0x22c: 0xf7, 0x22f: 0xf8, + // Block 0x9, offset 0x240 + 0x25e: 0xf9, 0x25f: 0xfa, + // Block 0xa, offset 0x280 + 0x2a4: 0xfb, 0x2a5: 0xfc, 0x2a6: 0xfd, 0x2a7: 0xfe, + 0x2a8: 0xff, 0x2a9: 0x100, 0x2aa: 0x101, 0x2ab: 0x102, 0x2ac: 0x103, 0x2ad: 0x104, 0x2ae: 0x105, 0x2af: 0x106, + 0x2b0: 0x107, 0x2b1: 0x108, 0x2b2: 0x109, 0x2b3: 0x10a, 0x2b4: 0x10b, 0x2b5: 0x10c, 0x2b6: 0x10d, 0x2b7: 0x10e, + 0x2b8: 0x10f, 0x2b9: 0x110, 0x2ba: 0x111, 0x2bb: 0x112, 0x2bc: 0x113, 0x2bd: 0x114, 0x2be: 0x115, 0x2bf: 0x116, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x117, 0x2c1: 0x118, 0x2c2: 0x119, 0x2c3: 0x11a, 0x2c4: 0x11b, 0x2c5: 0x11c, 0x2c6: 0x11d, 0x2c7: 0x11e, + 0x2ca: 0x11f, 0x2cb: 0x120, 0x2cc: 0x121, 0x2cd: 0x122, 0x2ce: 0x123, 0x2cf: 0x124, + 0x2d0: 0x125, 0x2d1: 0x126, 0x2d2: 0x127, + 0x2e0: 0x128, 0x2e1: 0x129, 0x2e4: 0x12a, 0x2e6: 0x12b, + 0x2e8: 0x12c, 0x2e9: 0x12d, 0x2ec: 0x12e, 0x2ed: 0x12f, + 0x2f0: 0x130, 0x2f1: 0x131, + 0x2f9: 0x132, + // Block 0xc, offset 0x300 + 0x300: 0x133, 0x301: 0x134, 0x302: 0x135, 0x303: 0x136, 0x304: 0x137, 0x305: 0x138, 0x306: 0x139, 0x307: 0x13a, + 0x31a: 0x13b, 0x31b: 0x13c, + // Block 0xd, offset 0x340 + 0x340: 0x13d, 0x341: 0x13e, 0x342: 0x13f, 0x343: 0x140, 0x344: 0x141, 0x345: 0x142, 0x346: 0x143, 0x347: 0x144, + 0x348: 0x145, 0x349: 0x146, 0x34a: 0x147, 0x34b: 0x148, 0x34c: 0x149, 0x34d: 0x14a, + 0x350: 0x14b, 0x351: 0x14c, + // Block 0xe, offset 0x380 + 0x380: 0x14d, 0x381: 0x14e, 0x382: 0x14f, 0x383: 0x150, 0x384: 0x151, 0x385: 0x152, 0x386: 0x153, 0x387: 0x154, + 0x388: 0x155, 0x389: 0x156, 0x38a: 0x157, 0x38b: 0x158, 0x38c: 0x159, 0x38d: 0x15a, 0x38e: 0x15b, 0x38f: 0x15c, + 0x390: 0x15d, + // Block 0xf, offset 0x3c0 + 0x3e0: 0x15e, 0x3e1: 0x15f, 0x3e2: 0x160, 0x3e3: 0x161, 0x3e4: 0x162, 0x3e5: 0x163, 0x3e6: 0x164, 0x3e7: 0x165, + 0x3e8: 0x166, + 0x3fc: 0x167, 0x3fd: 0x168, 0x3fe: 0x169, + // Block 0x10, offset 0x400 + 0x400: 0x16a, + // Block 0x11, offset 0x440 + 0x440: 0x16b, 0x441: 0x16c, 0x442: 0x16d, 0x443: 0x16e, 0x444: 0x16f, 0x445: 0x170, 0x446: 0x171, 0x447: 0x172, + 0x448: 0x173, 0x449: 0x174, 0x44c: 0x175, 0x44d: 0x176, + 0x450: 0x177, 0x451: 0x178, 0x452: 0x179, 0x453: 0x17a, 0x454: 0x17b, 0x455: 0x17c, 0x456: 0x17d, 0x457: 0x17e, + 0x458: 0x17f, 0x459: 0x180, 0x45a: 0x181, 0x45b: 0x182, 0x45c: 0x183, 0x45d: 0x184, 0x45e: 0x185, 0x45f: 0x186, + // Block 0x12, offset 0x480 + 0x4b8: 0x187, 0x4b9: 0x188, 0x4ba: 0x189, 0x4bb: 0x18a, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x18b, 0x4c1: 0x18c, 0x4c2: 0x18d, 0x4c3: 0x18e, 0x4c4: 0x18f, 0x4c5: 0x190, 0x4c6: 0x191, 0x4c7: 0x192, + 0x4c8: 0x193, 0x4c9: 0x194, 0x4cc: 0x195, 0x4cd: 0x196, 0x4ce: 0x197, 0x4cf: 0x198, + 0x4d0: 0x199, 0x4d1: 0x19a, 0x4d2: 0x19b, 0x4d3: 0x19c, 0x4d4: 0x19d, 0x4d5: 0x19e, 0x4d7: 0x19f, + 0x4d8: 0x1a0, 0x4d9: 0x1a1, 0x4da: 0x1a2, 0x4db: 0x1a3, 0x4dc: 0x1a4, 0x4dd: 0x1a5, + // Block 0x14, offset 0x500 + 0x520: 0x1a6, 0x521: 0x1a7, 0x522: 0x1a8, 0x523: 0x1a9, 0x524: 0x1aa, 0x525: 0x1ab, 0x526: 0x1ac, 0x527: 0x1ad, + 0x528: 0x1ae, + // Block 0x15, offset 0x540 + 0x550: 0x09, 0x551: 0x0a, 0x552: 0x0b, 0x553: 0x0c, 0x556: 0x0d, + 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, + // Block 0x16, offset 0x580 + 0x580: 0x1af, 0x581: 0x1b0, 0x584: 0x1b0, 0x585: 0x1b0, 0x586: 0x1b0, 0x587: 0x1b1, + // Block 0x17, offset 0x5c0 + 0x5e0: 0x14, + // Block 0x18, offset 0x600 + 0x602: 0x01, 0x603: 0x02, 0x604: 0x03, 0x605: 0x04, 0x606: 0x05, 0x607: 0x06, + 0x608: 0x07, 0x609: 0x08, 0x60a: 0x09, 0x60b: 0x0a, 0x60c: 0x0b, 0x60d: 0x0c, 0x60e: 0x0d, 0x60f: 0x0e, + 0x610: 0x0f, 0x611: 0x10, 0x612: 0x11, 0x613: 0x12, 0x614: 0x13, 0x615: 0x14, 0x616: 0x15, 0x617: 0x16, + 0x618: 0x17, 0x619: 0x18, 0x61a: 0x19, 0x61b: 0x1a, 0x61c: 0x1b, 0x61d: 0x1c, 0x61e: 0x1d, 0x61f: 0x1e, + 0x620: 0x01, 0x621: 0x02, 0x622: 0x03, 0x623: 0x04, 0x624: 0x05, + 0x62a: 0x06, 0x62d: 0x07, 0x62f: 0x08, + 0x630: 0x13, 0x633: 0x15, + // Block 0x19, offset 0x640 + 0x660: 0x1f, 0x661: 0x20, 0x662: 0x21, 0x663: 0x22, 0x664: 0x23, 0x665: 0x24, 0x666: 0x25, 0x667: 0x26, + 0x668: 0x27, 0x669: 0x28, 0x66a: 0x29, 0x66b: 0x2a, 0x66c: 0x2b, 0x66d: 0x2c, 0x66e: 0x2d, 0x66f: 0x2e, + 0x670: 0x2f, 0x671: 0x30, 0x672: 0x31, 0x673: 0x32, 0x674: 0x33, 0x675: 0x34, 0x676: 0x35, 0x677: 0x36, + 0x678: 0x1b8, 0x679: 0x38, 0x67a: 0x39, 0x67b: 0x3a, 0x67c: 0x3b, 0x67d: 0x3c, 0x67e: 0x3d, 0x67f: 0x3e, + // Block 0x1a, offset 0x680 + 0x680: 0x3f, 0x681: 0x40, 0x682: 0x41, 0x683: 0x42, 0x684: 0x1b9, 0x685: 0x1ba, 0x686: 0x1bb, 0x687: 0x1bc, + 0x688: 0x47, 0x689: 0x48, 0x68a: 0x49, 0x68b: 0x4a, 0x68c: 0x4b, 0x68d: 0x4c, 0x68e: 0x4d, 0x68f: 0x4e, + 0x690: 0x4f, 0x691: 0x50, 0x692: 0x51, 0x693: 0x52, 0x694: 0x53, 0x695: 0x54, 0x696: 0x55, 0x697: 0x56, + 0x698: 0x57, 0x699: 0x58, 0x69a: 0x59, 0x69b: 0x5a, 0x69c: 0x5b, 0x69d: 0x5c, 0x69e: 0x5d, 0x69f: 0x5e, + 0x6a0: 0x5f, 0x6a1: 0x60, 0x6a2: 0x61, 0x6a3: 0x62, 0x6a4: 0x63, 0x6a5: 0x64, 0x6a6: 0x65, 0x6a7: 0x66, + 0x6a8: 0x67, 0x6a9: 0x68, 0x6aa: 0x69, 0x6ac: 0x6a, 0x6ad: 0x6b, 0x6ae: 0x6c, 0x6af: 0x6d, + 0x6b0: 0x6e, 0x6b1: 0x6f, 0x6b3: 0x70, 0x6b4: 0x71, 0x6b5: 0x72, 0x6b6: 0x73, 0x6b7: 0x74, + 0x6b8: 0x75, 0x6b9: 0x76, 0x6ba: 0x77, 0x6bb: 0x78, 0x6bc: 0x79, 0x6bd: 0x7a, 0x6be: 0x7b, 0x6bf: 0x7c, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x7d, 0x6c1: 0x7e, 0x6c2: 0x7f, 0x6c3: 0x80, 0x6c4: 0x81, 0x6c5: 0x82, 0x6c6: 0x83, 0x6c7: 0x84, + 0x6c8: 0x85, 0x6c9: 0x1bd, 0x6ca: 0x87, 0x6cb: 0x88, 0x6cc: 0x89, 0x6cd: 0x8a, 0x6ce: 0x8b, 0x6cf: 0x8c, + 0x6d0: 0x8d, 0x6d1: 0x8e, 0x6d2: 0x8f, 0x6d3: 0x90, 0x6d4: 0x91, 0x6d5: 0x92, 0x6d6: 0x93, 0x6d7: 0x94, + 0x6d8: 0x95, 0x6d9: 0x96, 0x6da: 0x97, 0x6db: 0x98, 0x6dc: 0x99, 0x6dd: 0x9a, 0x6de: 0x9b, 0x6df: 0x9c, + 0x6e0: 0x9d, 0x6e1: 0x9e, 0x6e2: 0x9f, 0x6e3: 0xa0, 0x6e4: 0xa1, 0x6e5: 0xa2, 0x6e6: 0xa3, 0x6e7: 0xa4, + 0x6e8: 0xa5, 0x6e9: 0xa6, 0x6ea: 0xa7, 0x6eb: 0xa8, 0x6ec: 0xa9, 0x6ed: 0xaa, + 0x6f0: 0xab, 0x6f1: 0xac, 0x6f2: 0xad, 0x6f3: 0xae, 0x6f4: 0xaf, 0x6f5: 0xb0, 0x6f6: 0xb1, 0x6f7: 0xb2, + 0x6f8: 0xb3, 0x6fa: 0xb4, 0x6fb: 0xb5, 0x6fc: 0xb6, 0x6fd: 0xb7, 0x6fe: 0xb8, 0x6ff: 0xb9, + // Block 0x1c, offset 0x700 + 0x724: 0xfb, 0x725: 0xfc, 0x726: 0xfd, 0x727: 0xfe, + 0x728: 0xff, 0x729: 0x100, 0x72a: 0x101, 0x72b: 0x102, 0x72c: 0x103, 0x72d: 0x104, 0x72e: 0x105, 0x72f: 0x1be, + 0x730: 0x1bf, 0x731: 0x1c0, 0x732: 0x1c1, 0x733: 0x1c2, 0x734: 0x1c3, 0x735: 0x10c, 0x736: 0x10d, 0x737: 0x10e, + 0x738: 0x10f, 0x739: 0x110, 0x73a: 0x1c4, 0x73b: 0x1c5, 0x73c: 0x113, 0x73d: 0x114, 0x73e: 0x115, 0x73f: 0x116, + // Block 0x1d, offset 0x740 + 0x742: 0x01, 0x743: 0x02, 0x744: 0x03, 0x745: 0x04, 0x746: 0x05, 0x747: 0x06, + 0x748: 0x07, 0x749: 0x08, 0x74a: 0x09, 0x74b: 0x0a, 0x74c: 0x0b, 0x74d: 0x0c, 0x74e: 0x0d, 0x74f: 0x0e, + 0x750: 0x0f, 0x751: 0x10, 0x752: 0x11, 0x753: 0x12, 0x754: 0x13, 0x755: 0x14, 0x756: 0x15, 0x757: 0x1b4, + 0x758: 0x1b5, 0x759: 0x1b6, 0x75a: 0x19, 0x75b: 0x1b7, 0x75c: 0x1b, 0x75d: 0x1c, 0x75e: 0x1d, 0x75f: 0x1e, + 0x760: 0x17, 0x761: 0x18, 0x762: 0x19, 0x763: 0x04, 0x764: 0x05, + 0x76a: 0x06, 0x76d: 0x07, 0x76f: 0x1a, + 0x770: 0x13, 0x773: 0x15, + // Block 0x1e, offset 0x780 + 0x780: 0x3f, 0x781: 0x40, 0x782: 0x41, 0x783: 0x42, 0x784: 0x1b9, 0x785: 0x1ba, 0x786: 0x1bb, 0x787: 0x1bc, + 0x788: 0x47, 0x789: 0x48, 0x78a: 0x49, 0x78b: 0x4a, 0x78c: 0x4b, 0x78d: 0x4c, 0x78e: 0x4d, 0x78f: 0x4e, + 0x790: 0x4f, 0x791: 0x50, 0x792: 0x51, 0x793: 0x52, 0x794: 0x53, 0x795: 0x54, 0x796: 0x55, 0x797: 0x56, + 0x798: 0x57, 0x799: 0x58, 0x79a: 0x59, 0x79b: 0x5a, 0x79c: 0x5b, 0x79d: 0x5c, 0x79e: 0x5d, 0x79f: 0x5e, + 0x7a0: 0x5f, 0x7a1: 0x60, 0x7a2: 0x61, 0x7a3: 0x62, 0x7a4: 0x63, 0x7a5: 0x64, 0x7a6: 0x65, 0x7a7: 0x66, + 0x7a8: 0x67, 0x7a9: 0x68, 0x7aa: 0x69, 0x7ac: 0x6a, 0x7ad: 0x6b, 0x7ae: 0x6c, 0x7af: 0x6d, + 0x7b0: 0x6e, 0x7b1: 0x6f, 0x7b3: 0x70, 0x7b4: 0x71, 0x7b5: 0x72, 0x7b6: 0x73, 0x7b7: 0x74, + 0x7b8: 0x1cf, 0x7b9: 0x1d0, 0x7ba: 0x1d1, 0x7bb: 0x1d2, 0x7bc: 0x79, 0x7bd: 0x7a, 0x7be: 0x7b, 0x7bf: 0x7c, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x7d, 0x7c1: 0x7e, 0x7c2: 0x7f, 0x7c3: 0x80, 0x7c4: 0x81, 0x7c5: 0x1d3, 0x7c6: 0x83, 0x7c7: 0x84, + 0x7c8: 0x85, 0x7c9: 0x1bd, 0x7ca: 0x87, 0x7cb: 0x88, 0x7cc: 0x89, 0x7cd: 0x8a, 0x7ce: 0x8b, 0x7cf: 0x8c, + 0x7d0: 0x8d, 0x7d1: 0x8e, 0x7d2: 0x1d4, 0x7d3: 0x90, 0x7d4: 0x91, 0x7d5: 0x92, 0x7d6: 0x93, 0x7d7: 0x94, + 0x7d8: 0x95, 0x7d9: 0x96, 0x7da: 0x97, 0x7db: 0x98, 0x7dc: 0x99, 0x7dd: 0x9a, 0x7de: 0x9b, 0x7df: 0x9c, + 0x7e0: 0x9d, 0x7e1: 0x9e, 0x7e2: 0x9f, 0x7e3: 0xa0, 0x7e4: 0xa1, 0x7e5: 0xa2, 0x7e6: 0xa3, 0x7e7: 0xa4, + 0x7e8: 0xa5, 0x7e9: 0xa6, 0x7ea: 0xa7, 0x7eb: 0xa8, 0x7ec: 0xa9, 0x7ed: 0xaa, + 0x7f0: 0xab, 0x7f1: 0xac, 0x7f2: 0xad, 0x7f3: 0xae, 0x7f4: 0xaf, 0x7f5: 0xb0, 0x7f6: 0xb1, 0x7f7: 0xb2, + 0x7f8: 0xb3, 0x7fa: 0xb4, 0x7fb: 0xb5, 0x7fc: 0xb6, 0x7fd: 0xb7, 0x7fe: 0xb8, 0x7ff: 0xb9, + // Block 0x20, offset 0x800 + 0x800: 0xba, 0x801: 0xbb, 0x802: 0xbc, 0x803: 0xbd, 0x804: 0xbe, 0x805: 0xbf, 0x806: 0xc0, 0x807: 0xc1, + 0x808: 0xc2, 0x809: 0xc3, 0x80a: 0xc4, 0x80b: 0xc5, 0x80c: 0xc6, 0x80d: 0x1d5, 0x80e: 0xc8, 0x80f: 0x1d6, + // Block 0x21, offset 0x840 + 0x840: 0x18b, 0x841: 0x18c, 0x842: 0x18d, 0x843: 0x18e, 0x844: 0x1d7, 0x845: 0x190, 0x846: 0x191, 0x847: 0x192, + 0x848: 0x193, 0x849: 0x194, 0x84c: 0x195, 0x84d: 0x196, 0x84e: 0x197, 0x84f: 0x198, + 0x850: 0x199, 0x851: 0x19a, 0x852: 0x19b, 0x853: 0x19c, 0x854: 0x19d, 0x855: 0x19e, 0x857: 0x19f, + 0x858: 0x1a0, 0x859: 0x1a1, 0x85a: 0x1a2, 0x85b: 0x1a3, 0x85c: 0x1a4, 0x85d: 0x1a5, + // Block 0x22, offset 0x880 + 0x890: 0x09, 0x891: 0x0a, 0x892: 0x0b, 0x893: 0x0c, 0x896: 0x0d, + 0x89b: 0x0e, 0x89d: 0x0f, 0x89e: 0x10, 0x89f: 0x1f, + 0x8af: 0x12, + // Block 0x23, offset 0x8c0 + 0x8c2: 0x01, 0x8c3: 0x1c8, 0x8c4: 0x1c9, 0x8c5: 0x1ca, 0x8c6: 0x1cb, 0x8c7: 0x1cc, + 0x8c8: 0x1cd, 0x8c9: 0x1ce, 0x8ca: 0x09, 0x8cb: 0x0a, 0x8cc: 0x0b, 0x8cd: 0x0c, 0x8ce: 0x0d, 0x8cf: 0x0e, + 0x8d0: 0x0f, 0x8d1: 0x10, 0x8d2: 0x11, 0x8d3: 0x12, 0x8d4: 0x13, 0x8d5: 0x14, 0x8d6: 0x15, 0x8d7: 0x1b4, + 0x8d8: 0x1b5, 0x8d9: 0x1b6, 0x8da: 0x19, 0x8db: 0x1b7, 0x8dc: 0x1b, 0x8dd: 0x1c, 0x8de: 0x1d, 0x8df: 0x1e, + 0x8e0: 0x17, 0x8e1: 0x1c, 0x8e2: 0x1d, 0x8e3: 0x1e, 0x8e4: 0x05, + 0x8ea: 0x06, 0x8ed: 0x07, 0x8ef: 0x1a, + 0x8f0: 0x20, 0x8f3: 0x15, + // Block 0x24, offset 0x900 + 0x902: 0x01, 0x903: 0x02, 0x904: 0x1da, 0x905: 0x1db, 0x906: 0x05, 0x907: 0x06, + 0x908: 0x07, 0x909: 0x08, 0x90a: 0x09, 0x90b: 0x0a, 0x90c: 0x0b, 0x90d: 0x0c, 0x90e: 0x0d, 0x90f: 0x0e, + 0x910: 0x0f, 0x911: 0x10, 0x912: 0x11, 0x913: 0x12, 0x914: 0x13, 0x915: 0x14, 0x916: 0x15, 0x917: 0x1b4, + 0x918: 0x1b5, 0x919: 0x1b6, 0x91a: 0x19, 0x91b: 0x1b7, 0x91c: 0x1b, 0x91d: 0x1c, 0x91e: 0x1d, 0x91f: 0x1e, + 0x920: 0x17, 0x921: 0x18, 0x922: 0x19, 0x923: 0x04, 0x924: 0x05, + 0x92a: 0x06, 0x92d: 0x07, 0x92f: 0x1a, + 0x930: 0x13, 0x933: 0x15, + // Block 0x25, offset 0x940 + 0x940: 0x3f, 0x941: 0x40, 0x942: 0x41, 0x943: 0x42, 0x944: 0x1b9, 0x945: 0x1ba, 0x946: 0x1bb, 0x947: 0x1bc, + 0x948: 0x47, 0x949: 0x48, 0x94a: 0x49, 0x94b: 0x4a, 0x94c: 0x4b, 0x94d: 0x4c, 0x94e: 0x4d, 0x94f: 0x4e, + 0x950: 0x4f, 0x951: 0x50, 0x952: 0x51, 0x953: 0x52, 0x954: 0x53, 0x955: 0x54, 0x956: 0x55, 0x957: 0x56, + 0x958: 0x57, 0x959: 0x58, 0x95a: 0x59, 0x95b: 0x5a, 0x95c: 0x5b, 0x95d: 0x5c, 0x95e: 0x5d, 0x95f: 0x5e, + 0x960: 0x5f, 0x961: 0x60, 0x962: 0x61, 0x963: 0x62, 0x964: 0x63, 0x965: 0x64, 0x966: 0x65, 0x967: 0x66, + 0x968: 0x67, 0x969: 0x68, 0x96a: 0x69, 0x96c: 0x6a, 0x96d: 0x6b, 0x96e: 0x6c, 0x96f: 0x6d, + 0x970: 0x6e, 0x971: 0x6f, 0x973: 0x70, 0x974: 0x71, 0x975: 0x72, 0x976: 0x73, 0x977: 0x74, + 0x978: 0x1e2, 0x979: 0x1e3, 0x97a: 0x1e4, 0x97b: 0x1e5, 0x97c: 0x79, 0x97d: 0x7a, 0x97e: 0x7b, 0x97f: 0x7c, + // Block 0x26, offset 0x980 + 0x982: 0x01, 0x983: 0x1de, 0x984: 0x1df, 0x985: 0x1e0, 0x986: 0x05, 0x987: 0x1e1, + 0x988: 0x07, 0x989: 0x08, 0x98a: 0x09, 0x98b: 0x0a, 0x98c: 0x0b, 0x98d: 0x0c, 0x98e: 0x0d, 0x98f: 0x0e, + 0x990: 0x0f, 0x991: 0x10, 0x992: 0x11, 0x993: 0x12, 0x994: 0x13, 0x995: 0x14, 0x996: 0x15, 0x997: 0x1b4, + 0x998: 0x1b5, 0x999: 0x1b6, 0x99a: 0x19, 0x99b: 0x1b7, 0x99c: 0x1b, 0x99d: 0x1c, 0x99e: 0x1d, 0x99f: 0x1e, + 0x9a0: 0x17, 0x9a1: 0x23, 0x9a2: 0x19, 0x9a3: 0x04, 0x9a4: 0x05, + 0x9aa: 0x06, 0x9ad: 0x07, 0x9af: 0x1a, + 0x9b0: 0x13, 0x9b3: 0x15, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x3f, 0x9c1: 0x40, 0x9c2: 0x41, 0x9c3: 0x42, 0x9c4: 0x1b9, 0x9c5: 0x1ba, 0x9c6: 0x1bb, 0x9c7: 0x1bc, + 0x9c8: 0x47, 0x9c9: 0x48, 0x9ca: 0x49, 0x9cb: 0x4a, 0x9cc: 0x4b, 0x9cd: 0x4c, 0x9ce: 0x4d, 0x9cf: 0x4e, + 0x9d0: 0x4f, 0x9d1: 0x50, 0x9d2: 0x51, 0x9d3: 0x52, 0x9d4: 0x53, 0x9d5: 0x54, 0x9d6: 0x55, 0x9d7: 0x56, + 0x9d8: 0x57, 0x9d9: 0x58, 0x9da: 0x59, 0x9db: 0x5a, 0x9dc: 0x5b, 0x9dd: 0x5c, 0x9de: 0x5d, 0x9df: 0x5e, + 0x9e0: 0x5f, 0x9e1: 0x60, 0x9e2: 0x61, 0x9e3: 0x62, 0x9e4: 0x63, 0x9e5: 0x64, 0x9e6: 0x65, 0x9e7: 0x66, + 0x9e8: 0x67, 0x9e9: 0x68, 0x9ea: 0x69, 0x9ec: 0x6a, 0x9ed: 0x6b, 0x9ee: 0x6c, 0x9ef: 0x6d, + 0x9f0: 0x6e, 0x9f1: 0x6f, 0x9f3: 0x70, 0x9f4: 0x71, 0x9f5: 0x72, 0x9f6: 0x1ed, 0x9f7: 0x74, + 0x9f8: 0x75, 0x9f9: 0x1ee, 0x9fa: 0x77, 0x9fb: 0x78, 0x9fc: 0x79, 0x9fd: 0x7a, 0x9fe: 0x7b, 0x9ff: 0x7c, + // Block 0x28, offset 0xa00 + 0xa00: 0x7d, 0xa01: 0x7e, 0xa02: 0x7f, 0xa03: 0x80, 0xa04: 0x1ef, 0xa05: 0x82, 0xa06: 0x83, 0xa07: 0x84, + 0xa08: 0x85, 0xa09: 0x1bd, 0xa0a: 0x87, 0xa0b: 0x88, 0xa0c: 0x89, 0xa0d: 0x8a, 0xa0e: 0x8b, 0xa0f: 0x8c, + 0xa10: 0x8d, 0xa11: 0x8e, 0xa12: 0x8f, 0xa13: 0x90, 0xa14: 0x91, 0xa15: 0x92, 0xa16: 0x93, 0xa17: 0x94, + 0xa18: 0x95, 0xa19: 0x96, 0xa1a: 0x97, 0xa1b: 0x98, 0xa1c: 0x99, 0xa1d: 0x9a, 0xa1e: 0x9b, 0xa1f: 0x9c, + 0xa20: 0x9d, 0xa21: 0x9e, 0xa22: 0x9f, 0xa23: 0xa0, 0xa24: 0xa1, 0xa25: 0xa2, 0xa26: 0xa3, 0xa27: 0xa4, + 0xa28: 0xa5, 0xa29: 0xa6, 0xa2a: 0xa7, 0xa2b: 0xa8, 0xa2c: 0xa9, 0xa2d: 0xaa, + 0xa30: 0xab, 0xa31: 0xac, 0xa32: 0xad, 0xa33: 0xae, 0xa34: 0xaf, 0xa35: 0xb0, 0xa36: 0xb1, 0xa37: 0xb2, + 0xa38: 0xb3, 0xa3a: 0xb4, 0xa3b: 0xb5, 0xa3c: 0xb6, 0xa3d: 0xb7, 0xa3e: 0xb8, 0xa3f: 0xb9, + // Block 0x29, offset 0xa40 + 0xa42: 0x01, 0xa43: 0x1e8, 0xa44: 0x1e9, 0xa45: 0x1ea, 0xa46: 0x05, 0xa47: 0x1eb, + 0xa48: 0x1ec, 0xa49: 0x08, 0xa4a: 0x09, 0xa4b: 0x0a, 0xa4c: 0x0b, 0xa4d: 0x0c, 0xa4e: 0x0d, 0xa4f: 0x0e, + 0xa50: 0x0f, 0xa51: 0x10, 0xa52: 0x11, 0xa53: 0x12, 0xa54: 0x13, 0xa55: 0x14, 0xa56: 0x15, 0xa57: 0x1b4, + 0xa58: 0x1b5, 0xa59: 0x1b6, 0xa5a: 0x19, 0xa5b: 0x1b7, 0xa5c: 0x1b, 0xa5d: 0x1c, 0xa5e: 0x1d, 0xa5f: 0x1e, + 0xa60: 0x17, 0xa61: 0x25, 0xa62: 0x26, 0xa63: 0x04, 0xa64: 0x05, + 0xa6a: 0x06, 0xa6d: 0x07, 0xa6f: 0x1a, + 0xa70: 0x13, 0xa73: 0x15, + // Block 0x2a, offset 0xa80 + 0xa80: 0x3f, 0xa81: 0x40, 0xa82: 0x41, 0xa83: 0x42, 0xa84: 0x1b9, 0xa85: 0x1ba, 0xa86: 0x1bb, 0xa87: 0x1bc, + 0xa88: 0x47, 0xa89: 0x48, 0xa8a: 0x49, 0xa8b: 0x4a, 0xa8c: 0x4b, 0xa8d: 0x4c, 0xa8e: 0x4d, 0xa8f: 0x4e, + 0xa90: 0x4f, 0xa91: 0x50, 0xa92: 0x51, 0xa93: 0x52, 0xa94: 0x53, 0xa95: 0x54, 0xa96: 0x55, 0xa97: 0x56, + 0xa98: 0x57, 0xa99: 0x58, 0xa9a: 0x59, 0xa9b: 0x5a, 0xa9c: 0x5b, 0xa9d: 0x5c, 0xa9e: 0x5d, 0xa9f: 0x5e, + 0xaa0: 0x5f, 0xaa1: 0x60, 0xaa2: 0x61, 0xaa3: 0x62, 0xaa4: 0x63, 0xaa5: 0x64, 0xaa6: 0x65, 0xaa7: 0x66, + 0xaa8: 0x67, 0xaa9: 0x68, 0xaaa: 0x69, 0xaac: 0x6a, 0xaad: 0x6b, 0xaae: 0x6c, 0xaaf: 0x6d, + 0xab0: 0x6e, 0xab1: 0x6f, 0xab3: 0x70, 0xab4: 0x71, 0xab5: 0x72, 0xab6: 0x73, 0xab7: 0x74, + 0xab8: 0x75, 0xab9: 0x1f5, 0xaba: 0x77, 0xabb: 0x78, 0xabc: 0x79, 0xabd: 0x7a, 0xabe: 0x7b, 0xabf: 0x7c, + // Block 0x2b, offset 0xac0 + 0xac2: 0x01, 0xac3: 0x1f2, 0xac4: 0x03, 0xac5: 0x04, 0xac6: 0x05, 0xac7: 0x1f3, + 0xac8: 0x1f4, 0xac9: 0x08, 0xaca: 0x09, 0xacb: 0x0a, 0xacc: 0x0b, 0xacd: 0x0c, 0xace: 0x0d, 0xacf: 0x0e, + 0xad0: 0x0f, 0xad1: 0x10, 0xad2: 0x11, 0xad3: 0x12, 0xad4: 0x13, 0xad5: 0x14, 0xad6: 0x15, 0xad7: 0x1b4, + 0xad8: 0x1b5, 0xad9: 0x1b6, 0xada: 0x19, 0xadb: 0x1b7, 0xadc: 0x1b, 0xadd: 0x1c, 0xade: 0x1d, 0xadf: 0x1e, + 0xae0: 0x17, 0xae1: 0x28, 0xae2: 0x19, 0xae3: 0x04, 0xae4: 0x05, + 0xaea: 0x06, 0xaed: 0x07, 0xaef: 0x1a, + 0xaf0: 0x13, 0xaf3: 0x15, + // Block 0x2c, offset 0xb00 + 0xb02: 0x01, 0xb03: 0x1f8, 0xb04: 0x03, 0xb05: 0x04, 0xb06: 0x05, 0xb07: 0x06, + 0xb08: 0x07, 0xb09: 0x08, 0xb0a: 0x09, 0xb0b: 0x0a, 0xb0c: 0x0b, 0xb0d: 0x0c, 0xb0e: 0x0d, 0xb0f: 0x0e, + 0xb10: 0x0f, 0xb11: 0x10, 0xb12: 0x11, 0xb13: 0x12, 0xb14: 0x13, 0xb15: 0x14, 0xb16: 0x15, 0xb17: 0x1b4, + 0xb18: 0x1b5, 0xb19: 0x1b6, 0xb1a: 0x19, 0xb1b: 0x1b7, 0xb1c: 0x1b, 0xb1d: 0x1c, 0xb1e: 0x1d, 0xb1f: 0x1e, + 0xb20: 0x17, 0xb21: 0x18, 0xb22: 0x19, 0xb23: 0x04, 0xb24: 0x05, + 0xb2a: 0x06, 0xb2d: 0x07, 0xb2f: 0x1a, + 0xb30: 0x13, 0xb33: 0x15, + // Block 0x2d, offset 0xb40 + 0xb40: 0x3f, 0xb41: 0x40, 0xb42: 0x41, 0xb43: 0x42, 0xb44: 0x1b9, 0xb45: 0x1ba, 0xb46: 0x1bb, 0xb47: 0x1bc, + 0xb48: 0x47, 0xb49: 0x48, 0xb4a: 0x49, 0xb4b: 0x4a, 0xb4c: 0x4b, 0xb4d: 0x4c, 0xb4e: 0x4d, 0xb4f: 0x4e, + 0xb50: 0x4f, 0xb51: 0x50, 0xb52: 0x51, 0xb53: 0x52, 0xb54: 0x53, 0xb55: 0x54, 0xb56: 0x55, 0xb57: 0x56, + 0xb58: 0x57, 0xb59: 0x58, 0xb5a: 0x59, 0xb5b: 0x5a, 0xb5c: 0x5b, 0xb5d: 0x5c, 0xb5e: 0x5d, 0xb5f: 0x5e, + 0xb60: 0x5f, 0xb61: 0x60, 0xb62: 0x61, 0xb63: 0x62, 0xb64: 0x63, 0xb65: 0x64, 0xb66: 0x65, 0xb67: 0x66, + 0xb68: 0x67, 0xb69: 0x68, 0xb6a: 0x69, 0xb6c: 0x6a, 0xb6d: 0x6b, 0xb6e: 0x6c, 0xb6f: 0x6d, + 0xb70: 0x6e, 0xb71: 0x6f, 0xb73: 0x70, 0xb74: 0x71, 0xb75: 0x72, 0xb76: 0x1ed, 0xb77: 0x74, + 0xb78: 0x75, 0xb79: 0x200, 0xb7a: 0x201, 0xb7b: 0x202, 0xb7c: 0x79, 0xb7d: 0x7a, 0xb7e: 0x7b, 0xb7f: 0x7c, + // Block 0x2e, offset 0xb80 + 0xb80: 0x7d, 0xb81: 0x7e, 0xb82: 0x7f, 0xb83: 0x80, 0xb84: 0x203, 0xb85: 0x82, 0xb86: 0x83, 0xb87: 0x84, + 0xb88: 0x85, 0xb89: 0x1bd, 0xb8a: 0x87, 0xb8b: 0x88, 0xb8c: 0x89, 0xb8d: 0x8a, 0xb8e: 0x8b, 0xb8f: 0x8c, + 0xb90: 0x8d, 0xb91: 0x8e, 0xb92: 0x204, 0xb93: 0x90, 0xb94: 0x91, 0xb95: 0x92, 0xb96: 0x93, 0xb97: 0x94, + 0xb98: 0x95, 0xb99: 0x96, 0xb9a: 0x97, 0xb9b: 0x98, 0xb9c: 0x99, 0xb9d: 0x9a, 0xb9e: 0x9b, 0xb9f: 0x9c, + 0xba0: 0x9d, 0xba1: 0x9e, 0xba2: 0x9f, 0xba3: 0xa0, 0xba4: 0xa1, 0xba5: 0xa2, 0xba6: 0xa3, 0xba7: 0xa4, + 0xba8: 0xa5, 0xba9: 0xa6, 0xbaa: 0xa7, 0xbab: 0xa8, 0xbac: 0xa9, 0xbad: 0xaa, + 0xbb0: 0xab, 0xbb1: 0xac, 0xbb2: 0xad, 0xbb3: 0xae, 0xbb4: 0xaf, 0xbb5: 0xb0, 0xbb6: 0xb1, 0xbb7: 0xb2, + 0xbb8: 0xb3, 0xbba: 0xb4, 0xbbb: 0xb5, 0xbbc: 0xb6, 0xbbd: 0xb7, 0xbbe: 0xb8, 0xbbf: 0xb9, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0xba, 0xbc1: 0xbb, 0xbc2: 0xbc, 0xbc3: 0xbd, 0xbc4: 0xbe, 0xbc5: 0xbf, 0xbc6: 0xc0, 0xbc7: 0xc1, + 0xbc8: 0xc2, 0xbc9: 0xc3, 0xbca: 0xc4, 0xbcb: 0xc5, 0xbcc: 0xc6, 0xbcd: 0xc7, 0xbce: 0x205, 0xbcf: 0x206, + // Block 0x30, offset 0xc00 + 0xc00: 0x18b, 0xc01: 0x18c, 0xc02: 0x18d, 0xc03: 0x18e, 0xc04: 0x207, 0xc05: 0x208, 0xc06: 0x191, 0xc07: 0x192, + 0xc08: 0x193, 0xc09: 0x194, 0xc0c: 0x195, 0xc0d: 0x196, 0xc0e: 0x197, 0xc0f: 0x198, + 0xc10: 0x199, 0xc11: 0x19a, 0xc12: 0x19b, 0xc13: 0x19c, 0xc14: 0x19d, 0xc15: 0x19e, 0xc17: 0x19f, + 0xc18: 0x1a0, 0xc19: 0x1a1, 0xc1a: 0x1a2, 0xc1b: 0x1a3, 0xc1c: 0x1a4, 0xc1d: 0x1a5, + // Block 0x31, offset 0xc40 + 0xc50: 0x09, 0xc51: 0x0a, 0xc52: 0x0b, 0xc53: 0x0c, 0xc56: 0x0d, + 0xc5b: 0x0e, 0xc5d: 0x0f, 0xc5e: 0x10, 0xc5f: 0x2e, + 0xc6f: 0x12, + // Block 0x32, offset 0xc80 + 0xc82: 0x01, 0xc83: 0x1fb, 0xc84: 0x1fc, 0xc85: 0x1fd, 0xc86: 0x05, 0xc87: 0x1fe, + 0xc88: 0x1ff, 0xc89: 0x08, 0xc8a: 0x09, 0xc8b: 0x0a, 0xc8c: 0x0b, 0xc8d: 0x0c, 0xc8e: 0x0d, 0xc8f: 0x0e, + 0xc90: 0x0f, 0xc91: 0x10, 0xc92: 0x11, 0xc93: 0x12, 0xc94: 0x13, 0xc95: 0x14, 0xc96: 0x15, 0xc97: 0x1b4, + 0xc98: 0x1b5, 0xc99: 0x1b6, 0xc9a: 0x19, 0xc9b: 0x1b7, 0xc9c: 0x1b, 0xc9d: 0x1c, 0xc9e: 0x1d, 0xc9f: 0x1e, + 0xca0: 0x17, 0xca1: 0x2b, 0xca2: 0x2c, 0xca3: 0x2d, 0xca4: 0x05, + 0xcaa: 0x06, 0xcad: 0x07, 0xcaf: 0x1a, + 0xcb0: 0x2f, 0xcb3: 0x15, + // Block 0x33, offset 0xcc0 + 0xce0: 0x1f, 0xce1: 0x20, 0xce2: 0x21, 0xce3: 0x22, 0xce4: 0x23, 0xce5: 0x24, 0xce6: 0x25, 0xce7: 0x26, + 0xce8: 0x27, 0xce9: 0x28, 0xcea: 0x29, 0xceb: 0x2a, 0xcec: 0x2b, 0xced: 0x2c, 0xcee: 0x2d, 0xcef: 0x2e, + 0xcf0: 0x2f, 0xcf1: 0x30, 0xcf2: 0x31, 0xcf3: 0x32, 0xcf4: 0x33, 0xcf5: 0x34, 0xcf6: 0x35, 0xcf7: 0x36, + 0xcf8: 0x20d, 0xcf9: 0x38, 0xcfa: 0x39, 0xcfb: 0x3a, 0xcfc: 0x3b, 0xcfd: 0x3c, 0xcfe: 0x3d, 0xcff: 0x3e, + // Block 0x34, offset 0xd00 + 0xd02: 0x01, 0xd03: 0x02, 0xd04: 0x03, 0xd05: 0x04, 0xd06: 0x05, 0xd07: 0x06, + 0xd08: 0x07, 0xd09: 0x08, 0xd0a: 0x09, 0xd0b: 0x0a, 0xd0c: 0x0b, 0xd0d: 0x0c, 0xd0e: 0x0d, 0xd0f: 0x0e, + 0xd10: 0x0f, 0xd11: 0x10, 0xd12: 0x11, 0xd13: 0x12, 0xd14: 0x13, 0xd15: 0x14, 0xd16: 0x15, 0xd17: 0x20b, + 0xd18: 0x1b5, 0xd19: 0x20c, 0xd1a: 0x19, 0xd1b: 0x1b7, 0xd1c: 0x1b, 0xd1d: 0x1c, 0xd1e: 0x1d, 0xd1f: 0x1e, + 0xd20: 0x31, 0xd21: 0x18, 0xd22: 0x19, 0xd23: 0x04, 0xd24: 0x05, + 0xd2a: 0x06, 0xd2d: 0x07, 0xd2f: 0x1a, + 0xd30: 0x13, 0xd33: 0x15, + // Block 0x35, offset 0xd40 + 0xd40: 0x3f, 0xd41: 0x40, 0xd42: 0x41, 0xd43: 0x42, 0xd44: 0x1b9, 0xd45: 0x1ba, 0xd46: 0x1bb, 0xd47: 0x1bc, + 0xd48: 0x47, 0xd49: 0x48, 0xd4a: 0x49, 0xd4b: 0x4a, 0xd4c: 0x4b, 0xd4d: 0x4c, 0xd4e: 0x4d, 0xd4f: 0x4e, + 0xd50: 0x4f, 0xd51: 0x50, 0xd52: 0x51, 0xd53: 0x52, 0xd54: 0x53, 0xd55: 0x54, 0xd56: 0x55, 0xd57: 0x56, + 0xd58: 0x57, 0xd59: 0x58, 0xd5a: 0x59, 0xd5b: 0x5a, 0xd5c: 0x5b, 0xd5d: 0x5c, 0xd5e: 0x5d, 0xd5f: 0x5e, + 0xd60: 0x5f, 0xd61: 0x60, 0xd62: 0x61, 0xd63: 0x62, 0xd64: 0x63, 0xd65: 0x64, 0xd66: 0x65, 0xd67: 0x66, + 0xd68: 0x67, 0xd69: 0x68, 0xd6a: 0x69, 0xd6c: 0x6a, 0xd6d: 0x6b, 0xd6e: 0x6c, 0xd6f: 0x6d, + 0xd70: 0x6e, 0xd71: 0x6f, 0xd73: 0x70, 0xd74: 0x71, 0xd75: 0x72, 0xd76: 0x73, 0xd77: 0x74, + 0xd78: 0x213, 0xd79: 0x214, 0xd7a: 0x77, 0xd7b: 0x78, 0xd7c: 0x79, 0xd7d: 0x7a, 0xd7e: 0x7b, 0xd7f: 0x7c, + // Block 0x36, offset 0xd80 + 0xd82: 0x01, 0xd83: 0x02, 0xd84: 0x210, 0xd85: 0x211, 0xd86: 0x05, 0xd87: 0x212, + 0xd88: 0x07, 0xd89: 0x08, 0xd8a: 0x09, 0xd8b: 0x0a, 0xd8c: 0x0b, 0xd8d: 0x0c, 0xd8e: 0x0d, 0xd8f: 0x0e, + 0xd90: 0x0f, 0xd91: 0x10, 0xd92: 0x11, 0xd93: 0x12, 0xd94: 0x13, 0xd95: 0x14, 0xd96: 0x15, 0xd97: 0x1b4, + 0xd98: 0x1b5, 0xd99: 0x1b6, 0xd9a: 0x19, 0xd9b: 0x1b7, 0xd9c: 0x1b, 0xd9d: 0x1c, 0xd9e: 0x1d, 0xd9f: 0x1e, + 0xda0: 0x17, 0xda1: 0x33, 0xda2: 0x19, 0xda3: 0x04, 0xda4: 0x05, + 0xdaa: 0x06, 0xdad: 0x07, 0xdaf: 0x1a, + 0xdb0: 0x13, 0xdb3: 0x15, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x3f, 0xdc1: 0x40, 0xdc2: 0x41, 0xdc3: 0x42, 0xdc4: 0x1b9, 0xdc5: 0x1ba, 0xdc6: 0x1bb, 0xdc7: 0x1bc, + 0xdc8: 0x47, 0xdc9: 0x48, 0xdca: 0x49, 0xdcb: 0x4a, 0xdcc: 0x4b, 0xdcd: 0x4c, 0xdce: 0x4d, 0xdcf: 0x4e, + 0xdd0: 0x4f, 0xdd1: 0x50, 0xdd2: 0x51, 0xdd3: 0x52, 0xdd4: 0x53, 0xdd5: 0x54, 0xdd6: 0x55, 0xdd7: 0x56, + 0xdd8: 0x57, 0xdd9: 0x58, 0xdda: 0x59, 0xddb: 0x5a, 0xddc: 0x5b, 0xddd: 0x5c, 0xdde: 0x5d, 0xddf: 0x5e, + 0xde0: 0x5f, 0xde1: 0x60, 0xde2: 0x61, 0xde3: 0x62, 0xde4: 0x63, 0xde5: 0x64, 0xde6: 0x65, 0xde7: 0x66, + 0xde8: 0x67, 0xde9: 0x68, 0xdea: 0x69, 0xdec: 0x6a, 0xded: 0x6b, 0xdee: 0x6c, 0xdef: 0x6d, + 0xdf0: 0x6e, 0xdf1: 0x6f, 0xdf3: 0x70, 0xdf4: 0x71, 0xdf5: 0x72, 0xdf6: 0x1ed, 0xdf7: 0x74, + 0xdf8: 0x21b, 0xdf9: 0x21c, 0xdfa: 0x21d, 0xdfb: 0x21e, 0xdfc: 0x79, 0xdfd: 0x7a, 0xdfe: 0x7b, 0xdff: 0x7c, + // Block 0x38, offset 0xe00 + 0xe02: 0x01, 0xe03: 0x217, 0xe04: 0x218, 0xe05: 0x04, 0xe06: 0x05, 0xe07: 0x219, + 0xe08: 0x21a, 0xe09: 0x08, 0xe0a: 0x09, 0xe0b: 0x0a, 0xe0c: 0x0b, 0xe0d: 0x0c, 0xe0e: 0x0d, 0xe0f: 0x0e, + 0xe10: 0x0f, 0xe11: 0x10, 0xe12: 0x11, 0xe13: 0x12, 0xe14: 0x13, 0xe15: 0x14, 0xe16: 0x15, 0xe17: 0x1b4, + 0xe18: 0x1b5, 0xe19: 0x1b6, 0xe1a: 0x19, 0xe1b: 0x1b7, 0xe1c: 0x1b, 0xe1d: 0x1c, 0xe1e: 0x1d, 0xe1f: 0x1e, + 0xe20: 0x17, 0xe21: 0x35, 0xe22: 0x26, 0xe23: 0x04, 0xe24: 0x05, + 0xe2a: 0x06, 0xe2d: 0x07, 0xe2f: 0x1a, + 0xe30: 0x13, 0xe33: 0x15, + // Block 0x39, offset 0xe40 + 0xe42: 0x01, 0xe43: 0x1e8, 0xe44: 0x221, 0xe45: 0x1ea, 0xe46: 0x05, 0xe47: 0x1eb, + 0xe48: 0x1ec, 0xe49: 0x08, 0xe4a: 0x09, 0xe4b: 0x0a, 0xe4c: 0x0b, 0xe4d: 0x0c, 0xe4e: 0x0d, 0xe4f: 0x0e, + 0xe50: 0x0f, 0xe51: 0x10, 0xe52: 0x11, 0xe53: 0x12, 0xe54: 0x13, 0xe55: 0x14, 0xe56: 0x15, 0xe57: 0x1b4, + 0xe58: 0x1b5, 0xe59: 0x1b6, 0xe5a: 0x19, 0xe5b: 0x1b7, 0xe5c: 0x1b, 0xe5d: 0x1c, 0xe5e: 0x1d, 0xe5f: 0x1e, + 0xe60: 0x17, 0xe61: 0x25, 0xe62: 0x26, 0xe63: 0x04, 0xe64: 0x05, + 0xe6a: 0x06, 0xe6d: 0x07, 0xe6f: 0x1a, + 0xe70: 0x13, 0xe73: 0x15, + // Block 0x3a, offset 0xe80 + 0xe80: 0x3f, 0xe81: 0x40, 0xe82: 0x41, 0xe83: 0x42, 0xe84: 0x222, 0xe85: 0x223, 0xe86: 0x224, 0xe87: 0x225, + 0xe88: 0x47, 0xe89: 0x48, 0xe8a: 0x49, 0xe8b: 0x4a, 0xe8c: 0x4b, 0xe8d: 0x4c, 0xe8e: 0x4d, 0xe8f: 0x4e, + 0xe90: 0x4f, 0xe91: 0x50, 0xe92: 0x51, 0xe93: 0x52, 0xe94: 0x53, 0xe95: 0x54, 0xe96: 0x55, 0xe97: 0x56, + 0xe98: 0x57, 0xe99: 0x58, 0xe9a: 0x59, 0xe9b: 0x5a, 0xe9c: 0x5b, 0xe9d: 0x5c, 0xe9e: 0x5d, 0xe9f: 0x5e, + 0xea0: 0x5f, 0xea1: 0x60, 0xea2: 0x61, 0xea3: 0x62, 0xea4: 0x63, 0xea5: 0x64, 0xea6: 0x65, 0xea7: 0x66, + 0xea8: 0x67, 0xea9: 0x68, 0xeaa: 0x69, 0xeac: 0x6a, 0xead: 0x6b, 0xeae: 0x6c, 0xeaf: 0x6d, + 0xeb0: 0x6e, 0xeb1: 0x6f, 0xeb3: 0x70, 0xeb4: 0x71, 0xeb5: 0x72, 0xeb6: 0x73, 0xeb7: 0x74, + 0xeb8: 0x75, 0xeb9: 0x76, 0xeba: 0x77, 0xebb: 0x78, 0xebc: 0x79, 0xebd: 0x7a, 0xebe: 0x7b, 0xebf: 0x7c, + // Block 0x3b, offset 0xec0 + 0xec2: 0x01, 0xec3: 0x02, 0xec4: 0x03, 0xec5: 0x04, 0xec6: 0x05, 0xec7: 0x06, + 0xec8: 0x07, 0xec9: 0x08, 0xeca: 0x09, 0xecb: 0x0a, 0xecc: 0x0b, 0xecd: 0x0c, 0xece: 0x0d, 0xecf: 0x0e, + 0xed0: 0x0f, 0xed1: 0x10, 0xed2: 0x11, 0xed3: 0x12, 0xed4: 0x13, 0xed5: 0x14, 0xed6: 0x15, 0xed7: 0x1b4, + 0xed8: 0x1b5, 0xed9: 0x1b6, 0xeda: 0x19, 0xedb: 0x1b7, 0xedc: 0x1b, 0xedd: 0x1c, 0xede: 0x1d, 0xedf: 0x1e, + 0xee0: 0x17, 0xee1: 0x38, 0xee2: 0x19, 0xee3: 0x04, 0xee4: 0x05, + 0xeea: 0x06, 0xeed: 0x07, 0xeef: 0x1a, + 0xef0: 0x13, 0xef3: 0x15, + // Block 0x3c, offset 0xf00 + 0xf00: 0x3f, 0xf01: 0x40, 0xf02: 0x41, 0xf03: 0x42, 0xf04: 0x226, 0xf05: 0x227, 0xf06: 0x228, 0xf07: 0x229, + 0xf08: 0x47, 0xf09: 0x48, 0xf0a: 0x49, 0xf0b: 0x4a, 0xf0c: 0x4b, 0xf0d: 0x4c, 0xf0e: 0x4d, 0xf0f: 0x4e, + 0xf10: 0x4f, 0xf11: 0x50, 0xf12: 0x51, 0xf13: 0x52, 0xf14: 0x53, 0xf15: 0x54, 0xf16: 0x55, 0xf17: 0x56, + 0xf18: 0x57, 0xf19: 0x58, 0xf1a: 0x59, 0xf1b: 0x5a, 0xf1c: 0x5b, 0xf1d: 0x5c, 0xf1e: 0x5d, 0xf1f: 0x5e, + 0xf20: 0x5f, 0xf21: 0x60, 0xf22: 0x61, 0xf23: 0x62, 0xf24: 0x63, 0xf25: 0x64, 0xf26: 0x65, 0xf27: 0x66, + 0xf28: 0x67, 0xf29: 0x68, 0xf2a: 0x69, 0xf2c: 0x6a, 0xf2d: 0x6b, 0xf2e: 0x6c, 0xf2f: 0x6d, + 0xf30: 0x6e, 0xf31: 0x6f, 0xf33: 0x70, 0xf34: 0x71, 0xf35: 0x72, 0xf36: 0x73, 0xf37: 0x74, + 0xf38: 0x75, 0xf39: 0x76, 0xf3a: 0x77, 0xf3b: 0x78, 0xf3c: 0x79, 0xf3d: 0x7a, 0xf3e: 0x7b, 0xf3f: 0x7c, + // Block 0x3d, offset 0xf40 + 0xf40: 0xba, 0xf41: 0xbb, 0xf42: 0xbc, 0xf43: 0xbd, 0xf44: 0x22a, 0xf45: 0x22b, 0xf46: 0xc0, 0xf47: 0xc1, + 0xf48: 0xc2, 0xf49: 0x22c, 0xf4a: 0xc4, 0xf4b: 0xc5, 0xf4c: 0xc6, 0xf4d: 0xc7, 0xf4e: 0xc8, 0xf4f: 0xc9, + // Block 0x3e, offset 0xf80 + 0xf82: 0x01, 0xf83: 0x02, 0xf84: 0x03, 0xf85: 0x04, 0xf86: 0x05, 0xf87: 0x06, + 0xf88: 0x07, 0xf89: 0x08, 0xf8a: 0x09, 0xf8b: 0x0a, 0xf8c: 0x0b, 0xf8d: 0x0c, 0xf8e: 0x0d, 0xf8f: 0x0e, + 0xf90: 0x0f, 0xf91: 0x10, 0xf92: 0x11, 0xf93: 0x12, 0xf94: 0x13, 0xf95: 0x14, 0xf96: 0x15, 0xf97: 0x1b4, + 0xf98: 0x1b5, 0xf99: 0x1b6, 0xf9a: 0x19, 0xf9b: 0x1b7, 0xf9c: 0x1b, 0xf9d: 0x1c, 0xf9e: 0x1d, 0xf9f: 0x1e, + 0xfa0: 0x17, 0xfa1: 0x3a, 0xfa2: 0x03, 0xfa3: 0x3b, 0xfa4: 0x05, + 0xfaa: 0x06, 0xfad: 0x07, 0xfaf: 0x1a, + 0xfb0: 0x13, 0xfb3: 0x15, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x3f, 0xfc1: 0x40, 0xfc2: 0x41, 0xfc3: 0x42, 0xfc4: 0x1b9, 0xfc5: 0x1ba, 0xfc6: 0x1bb, 0xfc7: 0x1bc, + 0xfc8: 0x47, 0xfc9: 0x48, 0xfca: 0x49, 0xfcb: 0x4a, 0xfcc: 0x4b, 0xfcd: 0x4c, 0xfce: 0x4d, 0xfcf: 0x4e, + 0xfd0: 0x4f, 0xfd1: 0x50, 0xfd2: 0x51, 0xfd3: 0x52, 0xfd4: 0x53, 0xfd5: 0x54, 0xfd6: 0x55, 0xfd7: 0x56, + 0xfd8: 0x57, 0xfd9: 0x58, 0xfda: 0x59, 0xfdb: 0x5a, 0xfdc: 0x5b, 0xfdd: 0x5c, 0xfde: 0x5d, 0xfdf: 0x5e, + 0xfe0: 0x5f, 0xfe1: 0x60, 0xfe2: 0x61, 0xfe3: 0x62, 0xfe4: 0x63, 0xfe5: 0x64, 0xfe6: 0x65, 0xfe7: 0x66, + 0xfe8: 0x67, 0xfe9: 0x68, 0xfea: 0x69, 0xfec: 0x6a, 0xfed: 0x6b, 0xfee: 0x6c, 0xfef: 0x6d, + 0xff0: 0x6e, 0xff1: 0x6f, 0xff3: 0x70, 0xff4: 0x71, 0xff5: 0x72, 0xff6: 0x1ed, 0xff7: 0x74, + 0xff8: 0x75, 0xff9: 0x238, 0xffa: 0x239, 0xffb: 0x23a, 0xffc: 0x79, 0xffd: 0x7a, 0xffe: 0x7b, 0xfff: 0x7c, + // Block 0x40, offset 0x1000 + 0x1000: 0x7d, 0x1001: 0x7e, 0x1002: 0x7f, 0x1003: 0x80, 0x1004: 0x203, 0x1005: 0x82, 0x1006: 0x83, 0x1007: 0x84, + 0x1008: 0x85, 0x1009: 0x1bd, 0x100a: 0x87, 0x100b: 0x88, 0x100c: 0x89, 0x100d: 0x8a, 0x100e: 0x8b, 0x100f: 0x8c, + 0x1010: 0x8d, 0x1011: 0x8e, 0x1012: 0x8f, 0x1013: 0x90, 0x1014: 0x91, 0x1015: 0x92, 0x1016: 0x93, 0x1017: 0x94, + 0x1018: 0x95, 0x1019: 0x96, 0x101a: 0x97, 0x101b: 0x98, 0x101c: 0x99, 0x101d: 0x9a, 0x101e: 0x9b, 0x101f: 0x9c, + 0x1020: 0x9d, 0x1021: 0x9e, 0x1022: 0x9f, 0x1023: 0xa0, 0x1024: 0xa1, 0x1025: 0xa2, 0x1026: 0xa3, 0x1027: 0xa4, + 0x1028: 0xa5, 0x1029: 0xa6, 0x102a: 0xa7, 0x102b: 0xa8, 0x102c: 0xa9, 0x102d: 0xaa, + 0x1030: 0xab, 0x1031: 0xac, 0x1032: 0xad, 0x1033: 0xae, 0x1034: 0xaf, 0x1035: 0xb0, 0x1036: 0xb1, 0x1037: 0xb2, + 0x1038: 0xb3, 0x103a: 0xb4, 0x103b: 0xb5, 0x103c: 0xb6, 0x103d: 0xb7, 0x103e: 0xb8, 0x103f: 0xb9, + // Block 0x41, offset 0x1040 + 0x1042: 0x01, 0x1043: 0x231, 0x1044: 0x232, 0x1045: 0x233, 0x1046: 0x234, 0x1047: 0x235, + 0x1048: 0x236, 0x1049: 0x08, 0x104a: 0x237, 0x104b: 0x0a, 0x104c: 0x0b, 0x104d: 0x0c, 0x104e: 0x0d, 0x104f: 0x0e, + 0x1050: 0x0f, 0x1051: 0x10, 0x1052: 0x11, 0x1053: 0x12, 0x1054: 0x13, 0x1055: 0x14, 0x1056: 0x15, 0x1057: 0x1b4, + 0x1058: 0x1b5, 0x1059: 0x1b6, 0x105a: 0x19, 0x105b: 0x1b7, 0x105c: 0x1b, 0x105d: 0x1c, 0x105e: 0x1d, 0x105f: 0x1e, + 0x1060: 0x17, 0x1061: 0x3d, 0x1062: 0x3e, 0x1063: 0x04, 0x1064: 0x05, + 0x106a: 0x06, 0x106d: 0x07, 0x106f: 0x1a, + 0x1070: 0x13, 0x1073: 0x15, + // Block 0x42, offset 0x1080 + 0x1080: 0x3f, 0x1081: 0x40, 0x1082: 0x41, 0x1083: 0x42, 0x1084: 0x1b9, 0x1085: 0x1ba, 0x1086: 0x1bb, 0x1087: 0x1bc, + 0x1088: 0x47, 0x1089: 0x48, 0x108a: 0x49, 0x108b: 0x4a, 0x108c: 0x4b, 0x108d: 0x4c, 0x108e: 0x4d, 0x108f: 0x4e, + 0x1090: 0x4f, 0x1091: 0x50, 0x1092: 0x51, 0x1093: 0x52, 0x1094: 0x53, 0x1095: 0x54, 0x1096: 0x55, 0x1097: 0x56, + 0x1098: 0x57, 0x1099: 0x58, 0x109a: 0x59, 0x109b: 0x5a, 0x109c: 0x5b, 0x109d: 0x5c, 0x109e: 0x5d, 0x109f: 0x5e, + 0x10a0: 0x5f, 0x10a1: 0x60, 0x10a2: 0x61, 0x10a3: 0x62, 0x10a4: 0x63, 0x10a5: 0x64, 0x10a6: 0x65, 0x10a7: 0x66, + 0x10a8: 0x67, 0x10a9: 0x68, 0x10aa: 0x69, 0x10ac: 0x6a, 0x10ad: 0x6b, 0x10ae: 0x6c, 0x10af: 0x6d, + 0x10b0: 0x6e, 0x10b1: 0x6f, 0x10b3: 0x70, 0x10b4: 0x71, 0x10b5: 0x72, 0x10b6: 0x73, 0x10b7: 0x74, + 0x10b8: 0x1e2, 0x10b9: 0x1e3, 0x10ba: 0x1e4, 0x10bb: 0x241, 0x10bc: 0x79, 0x10bd: 0x7a, 0x10be: 0x7b, 0x10bf: 0x7c, + // Block 0x43, offset 0x10c0 + 0x10c2: 0x01, 0x10c3: 0x23d, 0x10c4: 0x23e, 0x10c5: 0x23f, 0x10c6: 0x05, 0x10c7: 0x240, + 0x10c8: 0x07, 0x10c9: 0x08, 0x10ca: 0x09, 0x10cb: 0x0a, 0x10cc: 0x0b, 0x10cd: 0x0c, 0x10ce: 0x0d, 0x10cf: 0x0e, + 0x10d0: 0x0f, 0x10d1: 0x10, 0x10d2: 0x11, 0x10d3: 0x12, 0x10d4: 0x13, 0x10d5: 0x14, 0x10d6: 0x15, 0x10d7: 0x1b4, + 0x10d8: 0x1b5, 0x10d9: 0x1b6, 0x10da: 0x19, 0x10db: 0x1b7, 0x10dc: 0x1b, 0x10dd: 0x1c, 0x10de: 0x1d, 0x10df: 0x1e, + 0x10e0: 0x17, 0x10e1: 0x40, 0x10e2: 0x19, 0x10e3: 0x04, 0x10e4: 0x05, + 0x10ea: 0x06, 0x10ed: 0x07, 0x10ef: 0x1a, + 0x10f0: 0x13, 0x10f3: 0x15, + // Block 0x44, offset 0x1100 + 0x1100: 0x3f, 0x1101: 0x40, 0x1102: 0x41, 0x1103: 0x42, 0x1104: 0x1b9, 0x1105: 0x1ba, 0x1106: 0x1bb, 0x1107: 0x1bc, + 0x1108: 0x47, 0x1109: 0x48, 0x110a: 0x49, 0x110b: 0x4a, 0x110c: 0x4b, 0x110d: 0x4c, 0x110e: 0x4d, 0x110f: 0x4e, + 0x1110: 0x4f, 0x1111: 0x50, 0x1112: 0x51, 0x1113: 0x52, 0x1114: 0x53, 0x1115: 0x54, 0x1116: 0x55, 0x1117: 0x56, + 0x1118: 0x57, 0x1119: 0x58, 0x111a: 0x59, 0x111b: 0x5a, 0x111c: 0x5b, 0x111d: 0x5c, 0x111e: 0x5d, 0x111f: 0x5e, + 0x1120: 0x5f, 0x1121: 0x60, 0x1122: 0x61, 0x1123: 0x62, 0x1124: 0x63, 0x1125: 0x64, 0x1126: 0x65, 0x1127: 0x66, + 0x1128: 0x67, 0x1129: 0x68, 0x112a: 0x69, 0x112c: 0x6a, 0x112d: 0x6b, 0x112e: 0x6c, 0x112f: 0x6d, + 0x1130: 0x6e, 0x1131: 0x6f, 0x1133: 0x70, 0x1134: 0x71, 0x1135: 0x72, 0x1136: 0x1ed, 0x1137: 0x74, + 0x1138: 0x75, 0x1139: 0x248, 0x113a: 0x201, 0x113b: 0x249, 0x113c: 0x79, 0x113d: 0x7a, 0x113e: 0x7b, 0x113f: 0x7c, + // Block 0x45, offset 0x1140 + 0x1142: 0x01, 0x1143: 0x244, 0x1144: 0x245, 0x1145: 0x246, 0x1146: 0x05, 0x1147: 0x1fe, + 0x1148: 0x247, 0x1149: 0x08, 0x114a: 0x09, 0x114b: 0x0a, 0x114c: 0x0b, 0x114d: 0x0c, 0x114e: 0x0d, 0x114f: 0x0e, + 0x1150: 0x0f, 0x1151: 0x10, 0x1152: 0x11, 0x1153: 0x12, 0x1154: 0x13, 0x1155: 0x14, 0x1156: 0x15, 0x1157: 0x1b4, + 0x1158: 0x1b5, 0x1159: 0x1b6, 0x115a: 0x19, 0x115b: 0x1b7, 0x115c: 0x1b, 0x115d: 0x1c, 0x115e: 0x1d, 0x115f: 0x1e, + 0x1160: 0x17, 0x1161: 0x42, 0x1162: 0x2c, 0x1163: 0x2d, 0x1164: 0x05, + 0x116a: 0x06, 0x116d: 0x07, 0x116f: 0x1a, + 0x1170: 0x2f, 0x1173: 0x15, + // Block 0x46, offset 0x1180 + 0x1180: 0x3f, 0x1181: 0x40, 0x1182: 0x41, 0x1183: 0x42, 0x1184: 0x1b9, 0x1185: 0x1ba, 0x1186: 0x1bb, 0x1187: 0x1bc, + 0x1188: 0x47, 0x1189: 0x48, 0x118a: 0x49, 0x118b: 0x4a, 0x118c: 0x4b, 0x118d: 0x4c, 0x118e: 0x4d, 0x118f: 0x4e, + 0x1190: 0x4f, 0x1191: 0x50, 0x1192: 0x51, 0x1193: 0x52, 0x1194: 0x53, 0x1195: 0x54, 0x1196: 0x55, 0x1197: 0x56, + 0x1198: 0x57, 0x1199: 0x58, 0x119a: 0x59, 0x119b: 0x5a, 0x119c: 0x5b, 0x119d: 0x5c, 0x119e: 0x5d, 0x119f: 0x5e, + 0x11a0: 0x5f, 0x11a1: 0x60, 0x11a2: 0x61, 0x11a3: 0x62, 0x11a4: 0x63, 0x11a5: 0x64, 0x11a6: 0x65, 0x11a7: 0x66, + 0x11a8: 0x67, 0x11a9: 0x68, 0x11aa: 0x69, 0x11ac: 0x6a, 0x11ad: 0x6b, 0x11ae: 0x6c, 0x11af: 0x6d, + 0x11b0: 0x6e, 0x11b1: 0x6f, 0x11b3: 0x70, 0x11b4: 0x71, 0x11b5: 0x72, 0x11b6: 0x73, 0x11b7: 0x74, + 0x11b8: 0x1cf, 0x11b9: 0x1d0, 0x11ba: 0x77, 0x11bb: 0x1d2, 0x11bc: 0x79, 0x11bd: 0x7a, 0x11be: 0x7b, 0x11bf: 0x7c, + // Block 0x47, offset 0x11c0 + 0x11c0: 0x7d, 0x11c1: 0x7e, 0x11c2: 0x7f, 0x11c3: 0x80, 0x11c4: 0x81, 0x11c5: 0x24c, 0x11c6: 0x83, 0x11c7: 0x84, + 0x11c8: 0x85, 0x11c9: 0x1bd, 0x11ca: 0x87, 0x11cb: 0x88, 0x11cc: 0x89, 0x11cd: 0x8a, 0x11ce: 0x8b, 0x11cf: 0x8c, + 0x11d0: 0x8d, 0x11d1: 0x8e, 0x11d2: 0x8f, 0x11d3: 0x90, 0x11d4: 0x91, 0x11d5: 0x92, 0x11d6: 0x93, 0x11d7: 0x94, + 0x11d8: 0x95, 0x11d9: 0x96, 0x11da: 0x97, 0x11db: 0x98, 0x11dc: 0x99, 0x11dd: 0x9a, 0x11de: 0x9b, 0x11df: 0x9c, + 0x11e0: 0x9d, 0x11e1: 0x9e, 0x11e2: 0x9f, 0x11e3: 0xa0, 0x11e4: 0xa1, 0x11e5: 0xa2, 0x11e6: 0xa3, 0x11e7: 0xa4, + 0x11e8: 0xa5, 0x11e9: 0xa6, 0x11ea: 0xa7, 0x11eb: 0xa8, 0x11ec: 0xa9, 0x11ed: 0xaa, + 0x11f0: 0xab, 0x11f1: 0xac, 0x11f2: 0xad, 0x11f3: 0xae, 0x11f4: 0xaf, 0x11f5: 0xb0, 0x11f6: 0xb1, 0x11f7: 0xb2, + 0x11f8: 0xb3, 0x11fa: 0xb4, 0x11fb: 0xb5, 0x11fc: 0xb6, 0x11fd: 0xb7, 0x11fe: 0xb8, 0x11ff: 0xb9, + // Block 0x48, offset 0x1200 + 0x1200: 0xba, 0x1201: 0xbb, 0x1202: 0xbc, 0x1203: 0xbd, 0x1204: 0xbe, 0x1205: 0xbf, 0x1206: 0xc0, 0x1207: 0xc1, + 0x1208: 0xc2, 0x1209: 0xc3, 0x120a: 0xc4, 0x120b: 0xc5, 0x120c: 0xc6, 0x120d: 0x1d5, 0x120e: 0xc8, 0x120f: 0xc9, + // Block 0x49, offset 0x1240 + 0x1240: 0x18b, 0x1241: 0x18c, 0x1242: 0x18d, 0x1243: 0x18e, 0x1244: 0x24d, 0x1245: 0x190, 0x1246: 0x191, 0x1247: 0x192, + 0x1248: 0x193, 0x1249: 0x194, 0x124c: 0x195, 0x124d: 0x196, 0x124e: 0x197, 0x124f: 0x198, + 0x1250: 0x199, 0x1251: 0x19a, 0x1252: 0x19b, 0x1253: 0x19c, 0x1254: 0x19d, 0x1255: 0x19e, 0x1257: 0x19f, + 0x1258: 0x1a0, 0x1259: 0x1a1, 0x125a: 0x1a2, 0x125b: 0x1a3, 0x125c: 0x1a4, 0x125d: 0x1a5, + // Block 0x4a, offset 0x1280 + 0x1290: 0x09, 0x1291: 0x0a, 0x1292: 0x0b, 0x1293: 0x0c, 0x1296: 0x0d, + 0x129b: 0x0e, 0x129d: 0x0f, 0x129e: 0x10, 0x129f: 0x47, + 0x12af: 0x12, + // Block 0x4b, offset 0x12c0 + 0x12c2: 0x01, 0x12c3: 0x1c8, 0x12c4: 0x1c9, 0x12c5: 0x1ca, 0x12c6: 0x05, 0x12c7: 0x1cc, + 0x12c8: 0x1cd, 0x12c9: 0x08, 0x12ca: 0x09, 0x12cb: 0x0a, 0x12cc: 0x0b, 0x12cd: 0x0c, 0x12ce: 0x0d, 0x12cf: 0x0e, + 0x12d0: 0x0f, 0x12d1: 0x10, 0x12d2: 0x11, 0x12d3: 0x12, 0x12d4: 0x13, 0x12d5: 0x14, 0x12d6: 0x15, 0x12d7: 0x1b4, + 0x12d8: 0x1b5, 0x12d9: 0x1b6, 0x12da: 0x19, 0x12db: 0x1b7, 0x12dc: 0x1b, 0x12dd: 0x1c, 0x12de: 0x1d, 0x12df: 0x1e, + 0x12e0: 0x17, 0x12e1: 0x44, 0x12e2: 0x45, 0x12e3: 0x46, 0x12e4: 0x05, + 0x12ea: 0x06, 0x12ed: 0x07, 0x12ef: 0x1a, + 0x12f0: 0x48, 0x12f3: 0x15, +} + +// mainCTEntries: 248 entries, 992 bytes +var mainCTEntries = [248]struct{ l, h, n, i uint8 }{ + {0xCE, 0x1, 1, 255}, + {0xC2, 0x0, 1, 255}, + {0xB7, 0xB7, 0, 1}, + {0x87, 0x87, 0, 2}, + {0xCC, 0x0, 2, 255}, + {0x88, 0x88, 0, 2}, + {0x86, 0x86, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x88, 0x88, 0, 1}, + {0xCD, 0x1, 1, 255}, + {0xCC, 0x0, 1, 255}, + {0x81, 0x81, 0, 1}, + {0x81, 0x81, 0, 2}, + {0xCC, 0x0, 1, 255}, + {0x86, 0x86, 0, 1}, + {0xCC, 0x0, 3, 255}, + {0x8B, 0x8B, 0, 3}, + {0x88, 0x88, 0, 2}, + {0x86, 0x86, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x8F, 0x8F, 0, 1}, + {0xD9, 0x0, 1, 255}, + {0x93, 0x95, 0, 1}, + {0xD9, 0x0, 1, 255}, + {0x94, 0x94, 0, 1}, + {0xE0, 0x0, 2, 255}, + {0xA7, 0x1, 1, 255}, + {0xA6, 0x0, 1, 255}, + {0xBE, 0xBE, 0, 1}, + {0x97, 0x97, 0, 2}, + {0xE0, 0x0, 2, 255}, + {0xAD, 0x1, 1, 255}, + {0xAC, 0x0, 1, 255}, + {0xBE, 0xBE, 0, 1}, + {0x96, 0x97, 0, 2}, + {0xE0, 0x0, 1, 255}, + {0xAF, 0x0, 1, 255}, + {0x97, 0x97, 0, 1}, + {0xE0, 0x0, 2, 255}, + {0xAF, 0x1, 1, 255}, + {0xAE, 0x0, 1, 255}, + {0xBE, 0xBE, 0, 1}, + {0x97, 0x97, 0, 2}, + {0xE0, 0x0, 1, 255}, + {0xAE, 0x0, 1, 255}, + {0xBE, 0xBE, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xB1, 0x0, 1, 255}, + {0x96, 0x96, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xB3, 0x0, 1, 255}, + {0x95, 0x95, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xB3, 0x0, 2, 255}, + {0x95, 0x96, 0, 3}, + {0x82, 0x0, 1, 2}, + {0xE0, 0x0, 1, 255}, + {0xB3, 0x0, 1, 255}, + {0x95, 0x95, 0, 1}, + {0xE0, 0x0, 2, 255}, + {0xB5, 0x1, 1, 255}, + {0xB4, 0x0, 1, 255}, + {0xBE, 0xBE, 0, 1}, + {0x97, 0x97, 0, 2}, + {0xE0, 0x0, 1, 255}, + {0xB4, 0x0, 1, 255}, + {0xBE, 0xBE, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xB7, 0x0, 3, 255}, + {0x9F, 0x9F, 0, 4}, + {0x8F, 0x0, 1, 3}, + {0x8A, 0x8A, 0, 2}, + {0xE0, 0x0, 1, 255}, + {0xB7, 0x0, 1, 255}, + {0x8A, 0x8A, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xB7, 0x0, 1, 255}, + {0x8A, 0x8A, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xB8, 0x0, 1, 255}, + {0x81, 0xAE, 0, 1}, + {0xE0, 0x0, 1, 255}, + {0xB8, 0x0, 1, 255}, + {0xB2, 0xB2, 0, 1}, + {0xE0, 0x0, 2, 255}, + {0xBB, 0xC, 1, 255}, + {0xBA, 0x0, 12, 255}, + {0xAD, 0xAE, 0, 26}, + {0xAA, 0xAB, 0, 24}, + {0xA7, 0xA7, 0, 23}, + {0xA5, 0xA5, 0, 22}, + {0xA1, 0xA3, 0, 19}, + {0x99, 0x9F, 0, 12}, + {0x94, 0x97, 0, 8}, + {0x8D, 0x8D, 0, 7}, + {0x8A, 0x8A, 0, 6}, + {0x87, 0x88, 0, 4}, + {0x84, 0x84, 0, 3}, + {0x81, 0x82, 0, 1}, + {0x9C, 0x9F, 0, 28}, + {0xE0, 0x0, 1, 255}, + {0xBA, 0x0, 1, 255}, + {0xB2, 0xB2, 0, 1}, + {0xEA, 0x0, 1, 255}, + {0xAA, 0x0, 1, 255}, + {0x80, 0xAF, 0, 1}, + {0xE0, 0x0, 2, 255}, + {0xBE, 0x7, 1, 255}, + {0xBD, 0x0, 1, 255}, + {0xB1, 0x0, 1, 255}, + {0xE0, 0x0, 2, 255}, + {0xBE, 0x2, 1, 255}, + {0xBD, 0x0, 2, 255}, + {0xB4, 0xB4, 0, 2}, + {0xB2, 0xB2, 0, 1}, + {0x80, 0x80, 0, 3}, + {0x80, 0x81, 0, 4}, + {0xE0, 0x0, 2, 255}, + {0xBE, 0x2, 1, 255}, + {0xBD, 0x0, 2, 255}, + {0xB4, 0xB4, 0, 2}, + {0xB2, 0xB2, 0, 1}, + {0x80, 0x80, 0, 3}, + {0xE1, 0x0, 1, 255}, + {0x80, 0x0, 1, 255}, + {0xAE, 0xAE, 0, 1}, + {0xF0, 0x0, 1, 255}, + {0x91, 0x0, 1, 255}, + {0x84, 0x0, 1, 255}, + {0xA7, 0xA7, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0xAC, 0x0, 1, 255}, + {0xB5, 0xB5, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0xB8, 0xB8, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0xA7, 0xA7, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x87, 0x87, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x81, 0x81, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x8C, 0x8C, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x8C, 0x8C, 0, 2}, + {0x81, 0x81, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x8A, 0x8A, 0, 2}, + {0x81, 0x81, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x8B, 0x8B, 0, 2}, + {0x88, 0x88, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x61, 0x61, 0, 3}, + {0x8A, 0x8A, 0, 2}, + {0x88, 0x88, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x61, 0x61, 0, 4}, + {0x41, 0x41, 0, 3}, + {0x8A, 0x8A, 0, 2}, + {0x88, 0x88, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0xA8, 0xA8, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x83, 0x83, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x8A, 0x8A, 0, 2}, + {0x88, 0x88, 0, 1}, + {0xCC, 0x0, 3, 255}, + {0x8B, 0x8B, 0, 3}, + {0x88, 0x88, 0, 2}, + {0x83, 0x83, 0, 1}, + {0xC5, 0x2, 1, 255}, + {0x7A, 0x0, 1, 255}, + {0xCC, 0x0, 1, 255}, + {0x8C, 0x8C, 0, 1}, + {0xBE, 0xBE, 0, 2}, + {0xC5, 0x4, 1, 255}, + {0x7A, 0x2, 1, 255}, + {0x5A, 0x0, 1, 255}, + {0xCC, 0x0, 1, 255}, + {0x8C, 0x8C, 0, 1}, + {0xCC, 0x0, 1, 255}, + {0x8C, 0x8C, 0, 2}, + {0xBD, 0xBE, 0, 3}, + {0xCE, 0x1, 1, 255}, + {0xC2, 0x0, 1, 255}, + {0x6A, 0x6A, 0, 3}, + {0xB7, 0xB7, 0, 1}, + {0x87, 0x87, 0, 2}, + {0xCE, 0x1, 1, 255}, + {0xC2, 0x0, 1, 255}, + {0x6A, 0x6A, 0, 4}, + {0x4A, 0x4A, 0, 3}, + {0xB7, 0xB7, 0, 1}, + {0x87, 0x87, 0, 2}, + {0x6A, 0x6A, 0, 1}, + {0x6A, 0x6A, 0, 2}, + {0x4A, 0x4A, 0, 1}, + {0xCC, 0x0, 3, 255}, + {0x8A, 0x8A, 0, 3}, + {0x88, 0x88, 0, 2}, + {0x81, 0x81, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x88, 0x88, 0, 2}, + {0x81, 0x81, 0, 1}, + {0x27, 0x27, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x84, 0x0, 1, 255}, + {0x80, 0x80, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x84, 0x0, 1, 255}, + {0x83, 0x83, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x84, 0x0, 1, 255}, + {0x87, 0x87, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x84, 0x0, 1, 255}, + {0x89, 0x89, 0, 1}, + {0xE1, 0x0, 1, 255}, + {0x84, 0x0, 1, 255}, + {0x8C, 0x8C, 0, 1}, + {0xCC, 0x0, 4, 255}, + {0x8A, 0x8A, 0, 5}, + {0x87, 0x88, 0, 3}, + {0x83, 0x83, 0, 2}, + {0x81, 0x81, 0, 1}, + {0xCC, 0x0, 2, 255}, + {0x83, 0x83, 0, 2}, + {0x81, 0x81, 0, 1}, + {0xCC, 0x0, 4, 255}, + {0xA8, 0xA8, 0, 5}, + {0x8B, 0x8B, 0, 4}, + {0x88, 0x88, 0, 3}, + {0x82, 0x83, 0, 1}, + {0xCE, 0x3, 1, 255}, + {0xCC, 0x1, 2, 255}, + {0xC2, 0x0, 1, 255}, + {0xB7, 0xB7, 0, 1}, + {0x8C, 0x8C, 0, 3}, + {0x81, 0x81, 0, 2}, + {0x87, 0x87, 0, 4}, + {0xCC, 0x0, 1, 255}, + {0x81, 0x82, 0, 1}, + {0xCC, 0x0, 3, 255}, + {0x8B, 0x8B, 0, 3}, + {0x88, 0x88, 0, 2}, + {0x82, 0x82, 0, 1}, +} + +// Total size of mainTable is 210136 bytes diff --git a/vendor/golang.org/x/text/secure/doc.go b/vendor/golang.org/x/text/secure/doc.go new file mode 100644 index 0000000000..e531c35435 --- /dev/null +++ b/vendor/golang.org/x/text/secure/doc.go @@ -0,0 +1,6 @@ +// Copyright 2016 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. + +// secure is a repository of text security related packages. +package secure // import "golang.org/x/text/secure" diff --git a/vendor/golang.org/x/text/secure/precis/benchmark_test.go b/vendor/golang.org/x/text/secure/precis/benchmark_test.go new file mode 100644 index 0000000000..619eebbdf1 --- /dev/null +++ b/vendor/golang.org/x/text/secure/precis/benchmark_test.go @@ -0,0 +1,33 @@ +// 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 precis + +import ( + "testing" +) + +func BenchmarkUsernameCaseMapped(b *testing.B) { + for i := 0; i < b.N; i++ { + UsernameCaseMapped.String("Malvolio") + } +} + +func BenchmarkUsernameCasePreserved(b *testing.B) { + for i := 0; i < b.N; i++ { + UsernameCasePreserved.String("Malvolio") + } +} + +func BenchmarkOpaqueString(b *testing.B) { + for i := 0; i < b.N; i++ { + OpaqueString.String("Malvolio") + } +} + +func BenchmarkNickname(b *testing.B) { + for i := 0; i < b.N; i++ { + Nickname.String("Malvolio") + } +} diff --git a/vendor/golang.org/x/text/secure/precis/class.go b/vendor/golang.org/x/text/secure/precis/class.go new file mode 100644 index 0000000000..8f45b66612 --- /dev/null +++ b/vendor/golang.org/x/text/secure/precis/class.go @@ -0,0 +1,52 @@ +// 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 precis + +import ( + "unicode/utf8" +) + +// TODO: Add contextual character rules from Appendix A of RFC5892. + +// A class is a set of characters that match certain derived properties. The +// PRECIS framework defines two classes: The Freeform class and the Identifier +// class. The freeform class should be used for profiles where expressiveness is +// prioritized over safety such as nicknames or passwords. The identifier class +// should be used for profiles where safety is the first priority such as +// addressable network labels and usernames. +type class struct { + extraAllowed property + extraDisallowed property +} + +// Contains satisfies the runes.Set interface and returns whether the given rune +// is a member of the class. +func (c class) Contains(r rune) bool { + b := make([]byte, 4) + n := utf8.EncodeRune(b, r) + + trieval, _ := dpTrie.lookup(b[:n]) + switch p := property(trieval); { + case p&c.extraDisallowed != 0: + return false + case p&c.extraAllowed != 0: + return true + case p&disallowed != 0, p&unassigned != 0: + return false + case p&pValid != 0: + return true + default: + return false + } +} + +var ( + identifier = &class{ + extraDisallowed: idDis, + } + freeform = &class{ + extraAllowed: freePVal, + } +) diff --git a/vendor/golang.org/x/text/secure/precis/class_test.go b/vendor/golang.org/x/text/secure/precis/class_test.go new file mode 100644 index 0000000000..beaf55dae4 --- /dev/null +++ b/vendor/golang.org/x/text/secure/precis/class_test.go @@ -0,0 +1,47 @@ +// 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 precis + +import ( + "testing" + + "golang.org/x/text/runes" +) + +// Compile-time regression test to ensure that Class is a Set +var _ runes.Set = (*class)(nil) + +// Ensure that certain characters are (or are not) in the identifer class. +func TestClassContains(t *testing.T) { + tests := []struct { + class *class + allowed []rune + disallowed []rune + }{ + { + class: identifier, + allowed: []rune("Aa0\u0021\u007e\u00df\u3007"), + disallowed: []rune("\u2150\u2100\u2200\u3164\u2190\u2600\u303b"), + }, + { + class: freeform, + allowed: []rune("Aa0\u0021\u007e\u00df\u3007 \u2150\u2100\u2200\u2190\u2600"), + disallowed: []rune("\u3164\u303b"), + }, + } + + for _, rt := range tests { + for _, r := range rt.allowed { + if !rt.class.Contains(r) { + t.Errorf("Class %d should contain \"%U\"", rt.class, r) + } + } + for _, r := range rt.disallowed { + if rt.class.Contains(r) { + t.Errorf("Class %d should not contain \"%U\"", rt.class, r) + } + } + } +} diff --git a/vendor/golang.org/x/text/secure/precis/doc.go b/vendor/golang.org/x/text/secure/precis/doc.go new file mode 100644 index 0000000000..48500fe1cd --- /dev/null +++ b/vendor/golang.org/x/text/secure/precis/doc.go @@ -0,0 +1,14 @@ +// 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 precis contains types and functions for the preparation, +// enforcement, and comparison of internationalized strings ("PRECIS") as +// defined in RFC 7564. It also contains several pre-defined profiles for +// passwords, nicknames, and usernames as defined in RFC 7613 and RFC 7700. +// +// BE ADVISED: This package is under construction and the API may change in +// backwards incompatible ways and without notice. +package precis // import "golang.org/x/text/secure/precis" + +//go:generate go run gen.go gen_trieval.go diff --git a/vendor/golang.org/x/text/secure/precis/enforce_test.go b/vendor/golang.org/x/text/secure/precis/enforce_test.go new file mode 100644 index 0000000000..6a97a44682 --- /dev/null +++ b/vendor/golang.org/x/text/secure/precis/enforce_test.go @@ -0,0 +1,133 @@ +// 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 precis + +import ( + "testing" +) + +func TestEnforce(t *testing.T) { + var data = []struct { + prof Profile + input, output string + isErr bool + }{ + // Nickname profile + {Nickname, " Swan of Avon ", "Swan of Avon", false}, + {Nickname, "", "", true}, + {Nickname, " ", "", true}, + {Nickname, " ", "", true}, + {Nickname, "a\u00A0a\u1680a\u2000a\u2001a\u2002a\u2003a\u2004a\u2005a\u2006a\u2007a\u2008a\u2009a\u200Aa\u202Fa\u205Fa\u3000a", "a a a a a a a a a a a a a a a a a", false}, + {Nickname, "Foo", "Foo", false}, + {Nickname, "foo", "foo", false}, + {Nickname, "Foo Bar", "Foo Bar", false}, + {Nickname, "foo bar", "foo bar", false}, + {Nickname, "\u03C3", "\u03C3", false}, + // TODO: Figure out why this is failing. + // {Nickname, "\u03C2", "\u03C3", false}, + {Nickname, "\u265A", "♚", false}, + {Nickname, "Richard \u2163", "Richard IV", false}, + {Nickname, "\u212B", "Å", false}, + // Opaque string profile + {OpaqueString, " Swan of Avon ", " Swan of Avon ", false}, + {OpaqueString, "", "", true}, + {OpaqueString, " ", " ", false}, + {OpaqueString, " ", " ", false}, + {OpaqueString, "a\u00A0a\u1680a\u2000a\u2001a\u2002a\u2003a\u2004a\u2005a\u2006a\u2007a\u2008a\u2009a\u200Aa\u202Fa\u205Fa\u3000a", "a a a a a a a a a a a a a a a a a", false}, + {OpaqueString, "Foo", "Foo", false}, + {OpaqueString, "foo", "foo", false}, + {OpaqueString, "Foo Bar", "Foo Bar", false}, + {OpaqueString, "foo bar", "foo bar", false}, + {OpaqueString, "\u03C3", "\u03C3", false}, + {OpaqueString, "Richard \u2163", "Richard \u2163", false}, + {OpaqueString, "\u212B", "Å", false}, + {OpaqueString, "Jack of \u2666s", "Jack of \u2666s", false}, + {OpaqueString, "my cat is a \u0009by", "", true}, + {OpaqueString, "·", "", true}, // Middle dot + {OpaqueString, "͵", "", true}, // Keraia + {OpaqueString, "׳", "", true}, + {OpaqueString, "׳ה", "", true}, + {OpaqueString, "a׳b", "", true}, + // TOOD: This should be allowed right? Lack of Bidi rule? + // {OpaqueString, "ש׳", "", false}, + + // Katakana Middle Dot + {OpaqueString, "abc・def", "", true}, + // TODO: These should not be disallowed, methinks? + // {OpaqueString, "aヅc・def", "", false}, + // {OpaqueString, "abc・dぶf", "", false}, + // {OpaqueString, "⺐bc・def", "", false}, + + // Arabic Indic Digit + // TODO: I think these two should be allowed? + // {OpaqueString, "١٢٣٤٥", "١٢٣٤٥", false}, + // {OpaqueString, "۱۲۳۴۵", "۱۲۳۴۵", false}, + {OpaqueString, "١٢٣٤٥۶", "", true}, + {OpaqueString, "۱۲۳۴۵٦", "", true}, + + // UsernameCaseMapped profile + {UsernameCaseMapped, "juliet@example.com", "juliet@example.com", false}, + {UsernameCaseMapped, "fussball", "fussball", false}, + {UsernameCaseMapped, "fu\u00DFball", "fussball", false}, + {UsernameCaseMapped, "\u03C0", "\u03C0", false}, + {UsernameCaseMapped, "\u03A3", "\u03C3", false}, + {UsernameCaseMapped, "\u03C3", "\u03C3", false}, + {UsernameCaseMapped, "\u03C2", "\u03C3", false}, + {UsernameCaseMapped, "\u0049", "\u0069", false}, + {UsernameCaseMapped, "\u0049", "\u0069", false}, + // TODO: Should this be disallowed? + // {UsernameCaseMapped, "\u03D2", "\u03C5", false}, + {UsernameCaseMapped, "\u03B0", "\u03B0", false}, + {UsernameCaseMapped, "foo bar", "", true}, + {UsernameCaseMapped, "♚", "", true}, + {UsernameCaseMapped, "\u007E", "\u007E", false}, + {UsernameCaseMapped, "a", "a", false}, + {UsernameCaseMapped, "!", "!", false}, + {UsernameCaseMapped, "²", "", true}, + // TODO: Should this work? + // {UsernameCaseMapped, "", "", true}, + {UsernameCaseMapped, "\t", "", true}, + {UsernameCaseMapped, "\n", "", true}, + {UsernameCaseMapped, "\u26D6", "", true}, + {UsernameCaseMapped, "\u26FF", "", true}, + {UsernameCaseMapped, "\uFB00", "", true}, + {UsernameCaseMapped, "\u1680", "", true}, + {UsernameCaseMapped, " ", "", true}, + {UsernameCaseMapped, " ", "", true}, + {UsernameCaseMapped, "\u01C5", "", true}, + {UsernameCaseMapped, "\u16EE", "", true}, // Nl RUNIC ARLAUG SYMBOL + {UsernameCaseMapped, "\u0488", "", true}, // Me COMBINING CYRILLIC HUNDRED THOUSANDS SIGN + // TODO: Should this be disallowed and/or case mapped? + // {UsernameCaseMapped, "\u212B", "å", false}, // angstrom sign + {UsernameCaseMapped, "A\u030A", "å", false}, // A + ring + {UsernameCaseMapped, "\u00C5", "å", false}, // A with ring + {UsernameCaseMapped, "\u00E7", "ç", false}, // c cedille + {UsernameCaseMapped, "\u0063\u0327", "ç", false}, // c + cedille + {UsernameCaseMapped, "\u0158", "ř", false}, + {UsernameCaseMapped, "\u0052\u030C", "ř", false}, + + {UsernameCaseMapped, "\u1E61", "\u1E61", false}, // LATIN SMALL LETTER S WITH DOT ABOVE + // TODO: Why is this disallowed? + // {UsernameCaseMapped, "ẛ", "\u1E61", false}, // LATIN SMALL LETTER LONG S WITH DOT ABOVE + + // Confusable characters ARE allowed and should NOT be mapped. + {UsernameCaseMapped, "\u0410", "\u0430", false}, // CYRILLIC CAPITAL LETTER A + + // Full width should be mapped to the narrow or canonical decomposition… no + // idea which, but either way in this case it should be the same: + {UsernameCaseMapped, "AB", "ab", false}, + + {UsernameCasePreserved, "ABC", "ABC", false}, + {UsernameCasePreserved, "AB", "AB", false}, + } + + for _, d := range data { + if e, err := d.prof.String(d.input); (d.isErr && err == nil) || + !d.isErr && (err != nil || e != d.output) { + t.Log("Expected '"+d.output+"'", "but got", "'"+e+"'", "with error:", err) + t.Fail() + } + } +} diff --git a/vendor/golang.org/x/text/secure/precis/gen.go b/vendor/golang.org/x/text/secure/precis/gen.go new file mode 100644 index 0000000000..14ebf8f0a6 --- /dev/null +++ b/vendor/golang.org/x/text/secure/precis/gen.go @@ -0,0 +1,161 @@ +// 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. + +// Unicode table generator. +// Data read from the web. + +// +build ignore + +package main + +import ( + "flag" + "log" + "unicode" + "unicode/utf8" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/triegen" + "golang.org/x/text/internal/ucd" + "golang.org/x/text/unicode/norm" + "golang.org/x/text/unicode/rangetable" +) + +var assigned, disallowedRunes *unicode.RangeTable + +func main() { + gen.Init() + + // Load data + runes := []rune{} + ucd.Parse(gen.OpenUCDFile("DerivedCoreProperties.txt"), func(p *ucd.Parser) { + if p.String(1) == "Default_Ignorable_Code_Point" { + runes = append(runes, p.Rune(0)) + } + }) + ucd.Parse(gen.OpenUCDFile("HangulSyllableType.txt"), func(p *ucd.Parser) { + if p.String(1) == "LVT" { + runes = append(runes, p.Rune(0)) + } + }) + + disallowedRunes = rangetable.New(runes...) + assigned = rangetable.Assigned(unicode.Version) + + writeTables() + gen.Repackage("gen_trieval.go", "trieval.go", "precis") +} + +var outputFile = flag.String("output", "tables.go", "output file for generated tables; default tables.go") + +// The Exceptions class as defined in RFC 5892 +var exceptions = map[uint32]property{ + 0x00DF: pValid, + 0x03C2: pValid, + 0x06FD: pValid, + 0x06FE: pValid, + 0x0F0B: pValid, + 0x3007: pValid, + 0x00B7: contextO, + 0x0375: contextO, + 0x05F3: contextO, + 0x05F4: contextO, + 0x30FB: contextO, + 0x0660: contextO, + 0x0661: contextO, + 0x0662: contextO, + 0x0663: contextO, + 0x0664: contextO, + 0x0665: contextO, + 0x0666: contextO, + 0x0667: contextO, + 0x0668: contextO, + 0x0669: contextO, + 0x06F0: contextO, + 0x06F1: contextO, + 0x06F2: contextO, + 0x06F3: contextO, + 0x06F4: contextO, + 0x06F5: contextO, + 0x06F6: contextO, + 0x06F7: contextO, + 0x06F8: contextO, + 0x06F9: contextO, + 0x0640: disallowed, + 0x07FA: disallowed, + 0x302E: disallowed, + 0x302F: disallowed, + 0x3031: disallowed, + 0x3032: disallowed, + 0x3033: disallowed, + 0x3034: disallowed, + 0x3035: disallowed, + 0x303B: disallowed, +} + +func isLetterDigits(r rune) bool { + return unicode.In(r, + unicode.Ll, unicode.Lu, unicode.Lm, unicode.Lo, // Letters + unicode.Mn, unicode.Mc, // Modifiers + unicode.Nd, // Digits + ) +} + +func isIdDisAndFreePVal(r rune) bool { + return unicode.In(r, + unicode.Lt, unicode.Nl, unicode.No, // Other letters / numbers + unicode.Me, // Modifiers + unicode.Zs, // Spaces + unicode.Sm, unicode.Sc, unicode.Sk, unicode.So, // Symbols + unicode.Pc, unicode.Pd, unicode.Ps, unicode.Pe, + unicode.Pi, unicode.Pf, unicode.Po, // Punctuation + ) +} + +func isHasCompat(r rune) bool { + return !norm.NFKC.IsNormalString(string(r)) +} + +func writeTables() { + propTrie := triegen.NewTrie("derivedProperties") + w := gen.NewCodeWriter() + defer w.WriteGoFile(*outputFile, "precis") + gen.WriteUnicodeVersion(w) + + // Iterate over all the runes... + for i := uint32(0); i < unicode.MaxRune; i++ { + r := rune(i) + + if !utf8.ValidRune(r) { + continue + } + + p, ok := exceptions[i] + switch { + case ok: + case !unicode.In(r, assigned): + p = unassigned + case r >= 33 && r <= 126: // Is ASCII 7 + p = pValid + case r == 0x200C || r == 0x200D: // Is join control + p = contextJ + case unicode.In(r, disallowedRunes, unicode.Cc): + p = disallowed + case isHasCompat(r): + p = idDis | freePVal + case isLetterDigits(r): + p = pValid + case isIdDisAndFreePVal(r): + p = idDis | freePVal + default: + p = disallowed + } + propTrie.Insert(r, uint64(p)) + } + sz, err := propTrie.Gen(w) + if err != nil { + log.Fatal(err) + } + w.Size += sz +} diff --git a/vendor/golang.org/x/text/secure/precis/gen_trieval.go b/vendor/golang.org/x/text/secure/precis/gen_trieval.go new file mode 100644 index 0000000000..a60ca73c56 --- /dev/null +++ b/vendor/golang.org/x/text/secure/precis/gen_trieval.go @@ -0,0 +1,19 @@ +// 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 ignore + +package main + +type property int + +const ( + pValid property = 1 << iota + contextO + contextJ + disallowed + unassigned + freePVal + idDis +) diff --git a/vendor/golang.org/x/text/secure/precis/nickname.go b/vendor/golang.org/x/text/secure/precis/nickname.go new file mode 100644 index 0000000000..cd54b9e697 --- /dev/null +++ b/vendor/golang.org/x/text/secure/precis/nickname.go @@ -0,0 +1,70 @@ +// 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 precis + +import ( + "unicode" + "unicode/utf8" + + "golang.org/x/text/transform" +) + +type nickAdditionalMapping struct { + // TODO: This transformer needs to be stateless somehow… + notStart bool + prevSpace bool +} + +func (t *nickAdditionalMapping) Reset() { + t.prevSpace = false + t.notStart = false +} + +func (t *nickAdditionalMapping) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + // RFC 7700 §2.1. Rules + // + // 2. Additional Mapping Rule: The additional mapping rule consists of + // the following sub-rules. + // + // 1. Any instances of non-ASCII space MUST be mapped to ASCII + // space (U+0020); a non-ASCII space is any Unicode code point + // having a general category of "Zs", naturally with the + // exception of U+0020. + // + // 2. Any instances of the ASCII space character at the beginning + // or end of a nickname MUST be removed (e.g., "stpeter " is + // mapped to "stpeter"). + // + // 3. Interior sequences of more than one ASCII space character + // MUST be mapped to a single ASCII space character (e.g., + // "St Peter" is mapped to "St Peter"). + + for nSrc < len(src) { + r, size := utf8.DecodeRune(src[nSrc:]) + if size == 0 { // Incomplete UTF-8 encoding + if !atEOF { + return nDst, nSrc, transform.ErrShortSrc + } + size = 1 + } + if unicode.Is(unicode.Zs, r) { + t.prevSpace = true + } else { + if t.prevSpace && t.notStart { + dst[nDst] = ' ' + nDst += 1 + } + if size != copy(dst[nDst:], src[nSrc:nSrc+size]) { + nDst += size + return nDst, nSrc, transform.ErrShortDst + } + nDst += size + t.prevSpace = false + t.notStart = true + } + nSrc += size + } + return nDst, nSrc, nil +} diff --git a/vendor/golang.org/x/text/secure/precis/options.go b/vendor/golang.org/x/text/secure/precis/options.go new file mode 100644 index 0000000000..22705d5c88 --- /dev/null +++ b/vendor/golang.org/x/text/secure/precis/options.go @@ -0,0 +1,114 @@ +// 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 precis + +import ( + "golang.org/x/text/cases" + "golang.org/x/text/runes" + "golang.org/x/text/transform" + "golang.org/x/text/unicode/norm" + "golang.org/x/text/width" +) + +// An Option is used to define the behavior and rules of a Profile. +type Option func(*options) + +type options struct { + // Preparation options + allowwidechars bool + + // Enforcement options + cases transform.Transformer + disallow runes.Set + norm norm.Form + additional []func() transform.Transformer + width *width.Transformer + disallowEmpty bool + + // Comparison options + ignorecase bool +} + +func getOpts(o ...Option) (res options) { + for _, f := range o { + f(&res) + } + return +} + +var ( + // The IgnoreCase option causes the profile to perform a case insensitive + // comparison during the PRECIS comparison step. + IgnoreCase Option = ignoreCase + + // The AllowWide option causes the profile to allow full-width and half-width + // characters by mapping them to their decomposition mappings. This is useful + // for profiles that are based on the identifier class which would otherwise + // disallow wide characters. + AllowWide Option = allowWide + + // The DisallowEmpty option causes the enforcement step to return an error if + // the resulting string would be empty. + DisallowEmpty Option = disallowEmpty +) + +var ( + ignoreCase = func(o *options) { + o.ignorecase = true + } + allowWide = func(o *options) { + o.allowwidechars = true + } + disallowEmpty = func(o *options) { + o.disallowEmpty = true + } +) + +// The AdditionalMapping option defines the additional mapping rule for the +// Profile by applying Transformer's in sequence. +func AdditionalMapping(t ...func() transform.Transformer) Option { + return func(o *options) { + o.additional = t + } +} + +// The Norm option defines a Profile's normalization rule. Defaults to NFC. +func Norm(f norm.Form) Option { + return func(o *options) { + o.norm = f + } +} + +// The Width option defines a Profile's width mapping rule. +func Width(w width.Transformer) Option { + return func(o *options) { + o.width = &w + } +} + +// The FoldCase option defines a Profile's case mapping rule. Options can be +// provided to determine the type of case folding used. +func FoldCase(opts ...cases.Option) Option { + return func(o *options) { + o.cases = cases.Fold(opts...) + } +} + +// The Disallow option further restricts a Profile's allowed characters beyond +// what is disallowed by the underlying string class. +func Disallow(set runes.Set) Option { + return func(o *options) { + o.disallow = set + } +} + +// TODO: Pending finalization of the unicode/bidi API +// // The Dir option defines a Profile's directionality mapping rule. Generally +// // profiles based on the Identifier string class will want to use the "Bidi +// // Rule" defined in RFC5893, and profiles based on the Freeform string class +// // will want to use the Unicode bidirectional algorithm defined in UAX9. +// func Dir() Option { +// panic("unimplemented") +// } diff --git a/vendor/golang.org/x/text/secure/precis/profile.go b/vendor/golang.org/x/text/secure/precis/profile.go new file mode 100644 index 0000000000..f2177a845d --- /dev/null +++ b/vendor/golang.org/x/text/secure/precis/profile.go @@ -0,0 +1,163 @@ +// 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 precis + +import ( + "errors" + "unicode/utf8" + + "golang.org/x/text/runes" + "golang.org/x/text/transform" + "golang.org/x/text/width" +) + +var ( + disallowedRune = errors.New("disallowed rune encountered") +) + +var dpTrie = newDerivedPropertiesTrie(0) + +// A Profile represents a set of rules for normalizing and validating strings in +// the PRECIS framework. +type Profile struct { + options + class *class + transform.NopResetter +} + +// NewIdentifier creates a new PRECIS profile based on the Identifier string +// class. Profiles created from this class are suitable for use where safety is +// prioritized over expressiveness like network identifiers, user accounts, chat +// rooms, and file names. +func NewIdentifier(opts ...Option) Profile { + return Profile{ + options: getOpts(opts...), + class: identifier, + } +} + +// NewFreeform creates a new PRECIS profile based on the Freeform string class. +// Profiles created from this class are suitable for use where expressiveness is +// prioritized over safety like passwords, and display-elements such as +// nicknames in a chat room. +func NewFreeform(opts ...Option) Profile { + return Profile{ + options: getOpts(opts...), + class: freeform, + } +} + +// NewTransformer creates a new transform.Transformer that performs the PRECIS +// preparation and enforcement steps on the given UTF-8 encoded bytes. +func (p Profile) NewTransformer() *Transformer { + var ts []transform.Transformer + + if p.options.allowwidechars { + ts = append(ts, width.Fold) + } + + ts = append(ts, checker{p: p}) + + if p.options.width != nil { + ts = append(ts, width.Fold) + } + + for _, f := range p.options.additional { + ts = append(ts, f()) + } + + if p.options.cases != nil { + ts = append(ts, p.options.cases) + } + + ts = append(ts, p.options.norm) + + // TODO: Apply directionality rule (blocking on the Bidi package) + // TODO: Add the disallow empty rule with a dummy transformer? + + return &Transformer{transform.Chain(ts...)} +} + +// Bytes returns a new byte slice with the result of applying the profile to b. +func (p Profile) Bytes(b []byte) ([]byte, error) { + b, _, err := transform.Bytes(p.NewTransformer(), b) + if err == nil && p.options.disallowEmpty && len(b) == 0 { + return b, errors.New("enforce resulted in empty string") + } + return b, err +} + +// String returns a string with the result of applying the profile to s. +func (p Profile) String(s string) (string, error) { + s, _, err := transform.String(p.NewTransformer(), s) + if err == nil && p.options.disallowEmpty && len(s) == 0 { + return s, errors.New("enforce resulted in empty string") + } + return s, err +} + +// Compare enforces both strings, and then compares them for bit-string identity +// (byte-for-byte equality). If either string cannot be enforced, the comparison +// is false. +func (p Profile) Compare(a, b string) bool { + a, err := p.String(a) + if err != nil { + return false + } + b, err = p.String(b) + if err != nil { + return false + } + + // TODO: This is out of order. Need to extract the transformation logic and + // put this in where the normal case folding would go (but only for + // comparison). + if p.options.ignorecase { + a = width.Fold.String(a) + b = width.Fold.String(a) + } + + return a == b +} + +// Allowed returns a runes.Set containing every rune that is a member of the +// underlying profile's string class and not disallowed by any profile specific +// rules. +func (p Profile) Allowed() runes.Set { + return runes.Predicate(func(r rune) bool { + if p.options.disallow != nil { + return p.class.Contains(r) && !p.options.disallow.Contains(r) + } else { + return p.class.Contains(r) + } + }) +} + +type checker struct { + p Profile + transform.NopResetter +} + +func (c checker) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + for nSrc < len(src) { + r, size := utf8.DecodeRune(src[nSrc:]) + if size == 0 { // Incomplete UTF-8 encoding + if !atEOF { + return nDst, nSrc, transform.ErrShortSrc + } + size = 1 + } + if c.p.Allowed().Contains(r) { + if size != copy(dst[nDst:], src[nSrc:nSrc+size]) { + return nDst, nSrc, transform.ErrShortDst + } + nDst += size + } else { + return nDst, nSrc, disallowedRune + } + nSrc += size + } + return nDst, nSrc, nil +} diff --git a/vendor/golang.org/x/text/secure/precis/profiles.go b/vendor/golang.org/x/text/secure/precis/profiles.go new file mode 100644 index 0000000000..d2224d6be8 --- /dev/null +++ b/vendor/golang.org/x/text/secure/precis/profiles.go @@ -0,0 +1,58 @@ +// 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 precis + +import ( + "unicode" + + "golang.org/x/text/runes" + "golang.org/x/text/transform" + "golang.org/x/text/unicode/norm" + "golang.org/x/text/width" +) + +var ( + Nickname Profile = nickname // Implements the Nickname profile specified in RFC 7700. + UsernameCaseMapped Profile = usernamecasemap // Implements the UsernameCaseMapped profile specified in RFC 7613. + UsernameCasePreserved Profile = usernamenocasemap // Implements the UsernameCasePreserved profile specified in RFC 7613. + OpaqueString Profile = opaquestring // Implements the OpaqueString profile defined in RFC 7613 for passwords and other secure labels. +) + +// TODO: mvl: "Ultimately, I would manually define the structs for the internal +// profiles. This avoid pulling in unneeded tables when they are not used." +var ( + nickname Profile = NewFreeform( + AdditionalMapping(func() transform.Transformer { + return &nickAdditionalMapping{} + }), + IgnoreCase, + Norm(norm.NFKC), + DisallowEmpty, + ) + usernamecasemap Profile = NewIdentifier( + AllowWide, + FoldCase(), + Norm(norm.NFC), + // TODO: BIDI rule + ) + usernamenocasemap Profile = NewIdentifier( + AllowWide, + Norm(norm.NFC), + Width(width.Fold), // TODO: Is this correct? + // TODO: BIDI rule + ) + opaquestring Profile = NewFreeform( + AdditionalMapping(func() transform.Transformer { + return runes.Map(func(r rune) rune { + if unicode.Is(unicode.Zs, r) { + return ' ' + } + return r + }) + }), + Norm(norm.NFC), + DisallowEmpty, + ) +) diff --git a/vendor/golang.org/x/text/secure/precis/tables.go b/vendor/golang.org/x/text/secure/precis/tables.go new file mode 100644 index 0000000000..41cc5ee85f --- /dev/null +++ b/vendor/golang.org/x/text/secure/precis/tables.go @@ -0,0 +1,4138 @@ +// This file was generated by go generate; DO NOT EDIT + +package precis + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "8.0.0" + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *derivedPropertiesTrie) lookup(s []byte) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return derivedPropertiesValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := derivedPropertiesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := derivedPropertiesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = derivedPropertiesIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := derivedPropertiesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = derivedPropertiesIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = derivedPropertiesIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *derivedPropertiesTrie) lookupUnsafe(s []byte) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return derivedPropertiesValues[c0] + } + i := derivedPropertiesIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = derivedPropertiesIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = derivedPropertiesIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *derivedPropertiesTrie) lookupString(s string) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return derivedPropertiesValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := derivedPropertiesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := derivedPropertiesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = derivedPropertiesIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := derivedPropertiesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = derivedPropertiesIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = derivedPropertiesIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *derivedPropertiesTrie) lookupStringUnsafe(s string) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return derivedPropertiesValues[c0] + } + i := derivedPropertiesIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = derivedPropertiesIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = derivedPropertiesIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// derivedPropertiesTrie. Total size: 24384 bytes (23.81 KiB). Checksum: 358a74c074474dab. +type derivedPropertiesTrie struct{} + +func newDerivedPropertiesTrie(i int) *derivedPropertiesTrie { + return &derivedPropertiesTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *derivedPropertiesTrie) lookupValue(n uint32, b byte) uint8 { + switch { + default: + return uint8(derivedPropertiesValues[n<<6+uint32(b)]) + } +} + +// derivedPropertiesValues: 303 blocks, 19392 entries, 19392 bytes +// The third block is the zero block. +var derivedPropertiesValues = [19392]uint8{ + // Block 0x0, offset 0x0 + 0x00: 0x0008, 0x01: 0x0008, 0x02: 0x0008, 0x03: 0x0008, 0x04: 0x0008, 0x05: 0x0008, + 0x06: 0x0008, 0x07: 0x0008, 0x08: 0x0008, 0x09: 0x0008, 0x0a: 0x0008, 0x0b: 0x0008, + 0x0c: 0x0008, 0x0d: 0x0008, 0x0e: 0x0008, 0x0f: 0x0008, 0x10: 0x0008, 0x11: 0x0008, + 0x12: 0x0008, 0x13: 0x0008, 0x14: 0x0008, 0x15: 0x0008, 0x16: 0x0008, 0x17: 0x0008, + 0x18: 0x0008, 0x19: 0x0008, 0x1a: 0x0008, 0x1b: 0x0008, 0x1c: 0x0008, 0x1d: 0x0008, + 0x1e: 0x0008, 0x1f: 0x0008, 0x20: 0x0060, 0x21: 0x0001, 0x22: 0x0001, 0x23: 0x0001, + 0x24: 0x0001, 0x25: 0x0001, 0x26: 0x0001, 0x27: 0x0001, 0x28: 0x0001, 0x29: 0x0001, + 0x2a: 0x0001, 0x2b: 0x0001, 0x2c: 0x0001, 0x2d: 0x0001, 0x2e: 0x0001, 0x2f: 0x0001, + 0x30: 0x0001, 0x31: 0x0001, 0x32: 0x0001, 0x33: 0x0001, 0x34: 0x0001, 0x35: 0x0001, + 0x36: 0x0001, 0x37: 0x0001, 0x38: 0x0001, 0x39: 0x0001, 0x3a: 0x0001, 0x3b: 0x0001, + 0x3c: 0x0001, 0x3d: 0x0001, 0x3e: 0x0001, 0x3f: 0x0001, + // Block 0x1, offset 0x40 + 0x40: 0x0001, 0x41: 0x0001, 0x42: 0x0001, 0x43: 0x0001, 0x44: 0x0001, 0x45: 0x0001, + 0x46: 0x0001, 0x47: 0x0001, 0x48: 0x0001, 0x49: 0x0001, 0x4a: 0x0001, 0x4b: 0x0001, + 0x4c: 0x0001, 0x4d: 0x0001, 0x4e: 0x0001, 0x4f: 0x0001, 0x50: 0x0001, 0x51: 0x0001, + 0x52: 0x0001, 0x53: 0x0001, 0x54: 0x0001, 0x55: 0x0001, 0x56: 0x0001, 0x57: 0x0001, + 0x58: 0x0001, 0x59: 0x0001, 0x5a: 0x0001, 0x5b: 0x0001, 0x5c: 0x0001, 0x5d: 0x0001, + 0x5e: 0x0001, 0x5f: 0x0001, 0x60: 0x0001, 0x61: 0x0001, 0x62: 0x0001, 0x63: 0x0001, + 0x64: 0x0001, 0x65: 0x0001, 0x66: 0x0001, 0x67: 0x0001, 0x68: 0x0001, 0x69: 0x0001, + 0x6a: 0x0001, 0x6b: 0x0001, 0x6c: 0x0001, 0x6d: 0x0001, 0x6e: 0x0001, 0x6f: 0x0001, + 0x70: 0x0001, 0x71: 0x0001, 0x72: 0x0001, 0x73: 0x0001, 0x74: 0x0001, 0x75: 0x0001, + 0x76: 0x0001, 0x77: 0x0001, 0x78: 0x0001, 0x79: 0x0001, 0x7a: 0x0001, 0x7b: 0x0001, + 0x7c: 0x0001, 0x7d: 0x0001, 0x7e: 0x0001, 0x7f: 0x0008, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x0008, 0xc1: 0x0008, 0xc2: 0x0008, 0xc3: 0x0008, 0xc4: 0x0008, 0xc5: 0x0008, + 0xc6: 0x0008, 0xc7: 0x0008, 0xc8: 0x0008, 0xc9: 0x0008, 0xca: 0x0008, 0xcb: 0x0008, + 0xcc: 0x0008, 0xcd: 0x0008, 0xce: 0x0008, 0xcf: 0x0008, 0xd0: 0x0008, 0xd1: 0x0008, + 0xd2: 0x0008, 0xd3: 0x0008, 0xd4: 0x0008, 0xd5: 0x0008, 0xd6: 0x0008, 0xd7: 0x0008, + 0xd8: 0x0008, 0xd9: 0x0008, 0xda: 0x0008, 0xdb: 0x0008, 0xdc: 0x0008, 0xdd: 0x0008, + 0xde: 0x0008, 0xdf: 0x0008, 0xe0: 0x0060, 0xe1: 0x0060, 0xe2: 0x0060, 0xe3: 0x0060, + 0xe4: 0x0060, 0xe5: 0x0060, 0xe6: 0x0060, 0xe7: 0x0060, 0xe8: 0x0060, 0xe9: 0x0060, + 0xea: 0x0060, 0xeb: 0x0060, 0xec: 0x0060, 0xed: 0x0008, 0xee: 0x0060, 0xef: 0x0060, + 0xf0: 0x0060, 0xf1: 0x0060, 0xf2: 0x0060, 0xf3: 0x0060, 0xf4: 0x0060, 0xf5: 0x0060, + 0xf6: 0x0060, 0xf7: 0x0002, 0xf8: 0x0060, 0xf9: 0x0060, 0xfa: 0x0060, 0xfb: 0x0060, + 0xfc: 0x0060, 0xfd: 0x0060, 0xfe: 0x0060, 0xff: 0x0060, + // Block 0x4, offset 0x100 + 0x100: 0x0001, 0x101: 0x0001, 0x102: 0x0001, 0x103: 0x0001, 0x104: 0x0001, 0x105: 0x0001, + 0x106: 0x0001, 0x107: 0x0001, 0x108: 0x0001, 0x109: 0x0001, 0x10a: 0x0001, 0x10b: 0x0001, + 0x10c: 0x0001, 0x10d: 0x0001, 0x10e: 0x0001, 0x10f: 0x0001, 0x110: 0x0001, 0x111: 0x0001, + 0x112: 0x0001, 0x113: 0x0001, 0x114: 0x0001, 0x115: 0x0001, 0x116: 0x0001, 0x117: 0x0060, + 0x118: 0x0001, 0x119: 0x0001, 0x11a: 0x0001, 0x11b: 0x0001, 0x11c: 0x0001, 0x11d: 0x0001, + 0x11e: 0x0001, 0x11f: 0x0001, 0x120: 0x0001, 0x121: 0x0001, 0x122: 0x0001, 0x123: 0x0001, + 0x124: 0x0001, 0x125: 0x0001, 0x126: 0x0001, 0x127: 0x0001, 0x128: 0x0001, 0x129: 0x0001, + 0x12a: 0x0001, 0x12b: 0x0001, 0x12c: 0x0001, 0x12d: 0x0001, 0x12e: 0x0001, 0x12f: 0x0001, + 0x130: 0x0001, 0x131: 0x0001, 0x132: 0x0001, 0x133: 0x0001, 0x134: 0x0001, 0x135: 0x0001, + 0x136: 0x0001, 0x137: 0x0060, 0x138: 0x0001, 0x139: 0x0001, 0x13a: 0x0001, 0x13b: 0x0001, + 0x13c: 0x0001, 0x13d: 0x0001, 0x13e: 0x0001, 0x13f: 0x0001, + // Block 0x5, offset 0x140 + 0x140: 0x0001, 0x141: 0x0001, 0x142: 0x0001, 0x143: 0x0001, 0x144: 0x0001, 0x145: 0x0001, + 0x146: 0x0001, 0x147: 0x0001, 0x148: 0x0001, 0x149: 0x0001, 0x14a: 0x0001, 0x14b: 0x0001, + 0x14c: 0x0001, 0x14d: 0x0001, 0x14e: 0x0001, 0x14f: 0x0001, 0x150: 0x0001, 0x151: 0x0001, + 0x152: 0x0001, 0x153: 0x0001, 0x154: 0x0001, 0x155: 0x0001, 0x156: 0x0001, 0x157: 0x0001, + 0x158: 0x0001, 0x159: 0x0001, 0x15a: 0x0001, 0x15b: 0x0001, 0x15c: 0x0001, 0x15d: 0x0001, + 0x15e: 0x0001, 0x15f: 0x0001, 0x160: 0x0001, 0x161: 0x0001, 0x162: 0x0001, 0x163: 0x0001, + 0x164: 0x0001, 0x165: 0x0001, 0x166: 0x0001, 0x167: 0x0001, 0x168: 0x0001, 0x169: 0x0001, + 0x16a: 0x0001, 0x16b: 0x0001, 0x16c: 0x0001, 0x16d: 0x0001, 0x16e: 0x0001, 0x16f: 0x0001, + 0x170: 0x0001, 0x171: 0x0001, 0x172: 0x0060, 0x173: 0x0060, 0x174: 0x0001, 0x175: 0x0001, + 0x176: 0x0001, 0x177: 0x0001, 0x178: 0x0001, 0x179: 0x0001, 0x17a: 0x0001, 0x17b: 0x0001, + 0x17c: 0x0001, 0x17d: 0x0001, 0x17e: 0x0001, 0x17f: 0x0060, + // Block 0x6, offset 0x180 + 0x180: 0x0060, 0x181: 0x0001, 0x182: 0x0001, 0x183: 0x0001, 0x184: 0x0001, 0x185: 0x0001, + 0x186: 0x0001, 0x187: 0x0001, 0x188: 0x0001, 0x189: 0x0060, 0x18a: 0x0001, 0x18b: 0x0001, + 0x18c: 0x0001, 0x18d: 0x0001, 0x18e: 0x0001, 0x18f: 0x0001, 0x190: 0x0001, 0x191: 0x0001, + 0x192: 0x0001, 0x193: 0x0001, 0x194: 0x0001, 0x195: 0x0001, 0x196: 0x0001, 0x197: 0x0001, + 0x198: 0x0001, 0x199: 0x0001, 0x19a: 0x0001, 0x19b: 0x0001, 0x19c: 0x0001, 0x19d: 0x0001, + 0x19e: 0x0001, 0x19f: 0x0001, 0x1a0: 0x0001, 0x1a1: 0x0001, 0x1a2: 0x0001, 0x1a3: 0x0001, + 0x1a4: 0x0001, 0x1a5: 0x0001, 0x1a6: 0x0001, 0x1a7: 0x0001, 0x1a8: 0x0001, 0x1a9: 0x0001, + 0x1aa: 0x0001, 0x1ab: 0x0001, 0x1ac: 0x0001, 0x1ad: 0x0001, 0x1ae: 0x0001, 0x1af: 0x0001, + 0x1b0: 0x0001, 0x1b1: 0x0001, 0x1b2: 0x0001, 0x1b3: 0x0001, 0x1b4: 0x0001, 0x1b5: 0x0001, + 0x1b6: 0x0001, 0x1b7: 0x0001, 0x1b8: 0x0001, 0x1b9: 0x0001, 0x1ba: 0x0001, 0x1bb: 0x0001, + 0x1bc: 0x0001, 0x1bd: 0x0001, 0x1be: 0x0001, 0x1bf: 0x0060, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x0001, 0x1c1: 0x0001, 0x1c2: 0x0001, 0x1c3: 0x0001, 0x1c4: 0x0001, 0x1c5: 0x0001, + 0x1c6: 0x0001, 0x1c7: 0x0001, 0x1c8: 0x0001, 0x1c9: 0x0001, 0x1ca: 0x0001, 0x1cb: 0x0001, + 0x1cc: 0x0001, 0x1cd: 0x0001, 0x1ce: 0x0001, 0x1cf: 0x0001, 0x1d0: 0x0001, 0x1d1: 0x0001, + 0x1d2: 0x0001, 0x1d3: 0x0001, 0x1d4: 0x0001, 0x1d5: 0x0001, 0x1d6: 0x0001, 0x1d7: 0x0001, + 0x1d8: 0x0001, 0x1d9: 0x0001, 0x1da: 0x0001, 0x1db: 0x0001, 0x1dc: 0x0001, 0x1dd: 0x0001, + 0x1de: 0x0001, 0x1df: 0x0001, 0x1e0: 0x0001, 0x1e1: 0x0001, 0x1e2: 0x0001, 0x1e3: 0x0001, + 0x1e4: 0x0001, 0x1e5: 0x0001, 0x1e6: 0x0001, 0x1e7: 0x0001, 0x1e8: 0x0001, 0x1e9: 0x0001, + 0x1ea: 0x0001, 0x1eb: 0x0001, 0x1ec: 0x0001, 0x1ed: 0x0001, 0x1ee: 0x0001, 0x1ef: 0x0001, + 0x1f0: 0x0001, 0x1f1: 0x0001, 0x1f2: 0x0001, 0x1f3: 0x0001, 0x1f4: 0x0001, 0x1f5: 0x0001, + 0x1f6: 0x0001, 0x1f7: 0x0001, 0x1f8: 0x0001, 0x1f9: 0x0001, 0x1fa: 0x0001, 0x1fb: 0x0001, + 0x1fc: 0x0001, 0x1fd: 0x0001, 0x1fe: 0x0001, 0x1ff: 0x0001, + // Block 0x8, offset 0x200 + 0x200: 0x0001, 0x201: 0x0001, 0x202: 0x0001, 0x203: 0x0001, 0x204: 0x0060, 0x205: 0x0060, + 0x206: 0x0060, 0x207: 0x0060, 0x208: 0x0060, 0x209: 0x0060, 0x20a: 0x0060, 0x20b: 0x0060, + 0x20c: 0x0060, 0x20d: 0x0001, 0x20e: 0x0001, 0x20f: 0x0001, 0x210: 0x0001, 0x211: 0x0001, + 0x212: 0x0001, 0x213: 0x0001, 0x214: 0x0001, 0x215: 0x0001, 0x216: 0x0001, 0x217: 0x0001, + 0x218: 0x0001, 0x219: 0x0001, 0x21a: 0x0001, 0x21b: 0x0001, 0x21c: 0x0001, 0x21d: 0x0001, + 0x21e: 0x0001, 0x21f: 0x0001, 0x220: 0x0001, 0x221: 0x0001, 0x222: 0x0001, 0x223: 0x0001, + 0x224: 0x0001, 0x225: 0x0001, 0x226: 0x0001, 0x227: 0x0001, 0x228: 0x0001, 0x229: 0x0001, + 0x22a: 0x0001, 0x22b: 0x0001, 0x22c: 0x0001, 0x22d: 0x0001, 0x22e: 0x0001, 0x22f: 0x0001, + 0x230: 0x0001, 0x231: 0x0060, 0x232: 0x0060, 0x233: 0x0060, 0x234: 0x0001, 0x235: 0x0001, + 0x236: 0x0001, 0x237: 0x0001, 0x238: 0x0001, 0x239: 0x0001, 0x23a: 0x0001, 0x23b: 0x0001, + 0x23c: 0x0001, 0x23d: 0x0001, 0x23e: 0x0001, 0x23f: 0x0001, + // Block 0x9, offset 0x240 + 0x240: 0x0001, 0x241: 0x0001, 0x242: 0x0001, 0x243: 0x0001, 0x244: 0x0001, 0x245: 0x0001, + 0x246: 0x0001, 0x247: 0x0001, 0x248: 0x0001, 0x249: 0x0001, 0x24a: 0x0001, 0x24b: 0x0001, + 0x24c: 0x0001, 0x24d: 0x0001, 0x24e: 0x0001, 0x24f: 0x0001, 0x250: 0x0001, 0x251: 0x0001, + 0x252: 0x0001, 0x253: 0x0001, 0x254: 0x0001, 0x255: 0x0001, 0x256: 0x0001, 0x257: 0x0001, + 0x258: 0x0001, 0x259: 0x0001, 0x25a: 0x0001, 0x25b: 0x0001, 0x25c: 0x0001, 0x25d: 0x0001, + 0x25e: 0x0001, 0x25f: 0x0001, 0x260: 0x0001, 0x261: 0x0001, 0x262: 0x0001, 0x263: 0x0001, + 0x264: 0x0001, 0x265: 0x0001, 0x266: 0x0001, 0x267: 0x0001, 0x268: 0x0001, 0x269: 0x0001, + 0x26a: 0x0001, 0x26b: 0x0001, 0x26c: 0x0001, 0x26d: 0x0001, 0x26e: 0x0001, 0x26f: 0x0001, + 0x270: 0x0060, 0x271: 0x0060, 0x272: 0x0060, 0x273: 0x0060, 0x274: 0x0060, 0x275: 0x0060, + 0x276: 0x0060, 0x277: 0x0060, 0x278: 0x0060, 0x279: 0x0001, 0x27a: 0x0001, 0x27b: 0x0001, + 0x27c: 0x0001, 0x27d: 0x0001, 0x27e: 0x0001, 0x27f: 0x0001, + // Block 0xa, offset 0x280 + 0x280: 0x0001, 0x281: 0x0001, 0x282: 0x0060, 0x283: 0x0060, 0x284: 0x0060, 0x285: 0x0060, + 0x286: 0x0001, 0x287: 0x0001, 0x288: 0x0001, 0x289: 0x0001, 0x28a: 0x0001, 0x28b: 0x0001, + 0x28c: 0x0001, 0x28d: 0x0001, 0x28e: 0x0001, 0x28f: 0x0001, 0x290: 0x0001, 0x291: 0x0001, + 0x292: 0x0060, 0x293: 0x0060, 0x294: 0x0060, 0x295: 0x0060, 0x296: 0x0060, 0x297: 0x0060, + 0x298: 0x0060, 0x299: 0x0060, 0x29a: 0x0060, 0x29b: 0x0060, 0x29c: 0x0060, 0x29d: 0x0060, + 0x29e: 0x0060, 0x29f: 0x0060, 0x2a0: 0x0060, 0x2a1: 0x0060, 0x2a2: 0x0060, 0x2a3: 0x0060, + 0x2a4: 0x0060, 0x2a5: 0x0060, 0x2a6: 0x0060, 0x2a7: 0x0060, 0x2a8: 0x0060, 0x2a9: 0x0060, + 0x2aa: 0x0060, 0x2ab: 0x0060, 0x2ac: 0x0001, 0x2ad: 0x0060, 0x2ae: 0x0001, 0x2af: 0x0060, + 0x2b0: 0x0060, 0x2b1: 0x0060, 0x2b2: 0x0060, 0x2b3: 0x0060, 0x2b4: 0x0060, 0x2b5: 0x0060, + 0x2b6: 0x0060, 0x2b7: 0x0060, 0x2b8: 0x0060, 0x2b9: 0x0060, 0x2ba: 0x0060, 0x2bb: 0x0060, + 0x2bc: 0x0060, 0x2bd: 0x0060, 0x2be: 0x0060, 0x2bf: 0x0060, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x0060, 0x2c1: 0x0060, 0x2c2: 0x0001, 0x2c3: 0x0060, 0x2c4: 0x0060, 0x2c5: 0x0001, + 0x2c6: 0x0001, 0x2c7: 0x0001, 0x2c8: 0x0001, 0x2c9: 0x0001, 0x2ca: 0x0001, 0x2cb: 0x0001, + 0x2cc: 0x0001, 0x2cd: 0x0001, 0x2ce: 0x0001, 0x2cf: 0x0008, 0x2d0: 0x0001, 0x2d1: 0x0001, + 0x2d2: 0x0001, 0x2d3: 0x0001, 0x2d4: 0x0001, 0x2d5: 0x0001, 0x2d6: 0x0001, 0x2d7: 0x0001, + 0x2d8: 0x0001, 0x2d9: 0x0001, 0x2da: 0x0001, 0x2db: 0x0001, 0x2dc: 0x0001, 0x2dd: 0x0001, + 0x2de: 0x0001, 0x2df: 0x0001, 0x2e0: 0x0001, 0x2e1: 0x0001, 0x2e2: 0x0001, 0x2e3: 0x0001, + 0x2e4: 0x0001, 0x2e5: 0x0001, 0x2e6: 0x0001, 0x2e7: 0x0001, 0x2e8: 0x0001, 0x2e9: 0x0001, + 0x2ea: 0x0001, 0x2eb: 0x0001, 0x2ec: 0x0001, 0x2ed: 0x0001, 0x2ee: 0x0001, 0x2ef: 0x0001, + 0x2f0: 0x0001, 0x2f1: 0x0001, 0x2f2: 0x0001, 0x2f3: 0x0001, 0x2f4: 0x0060, 0x2f5: 0x0002, + 0x2f6: 0x0001, 0x2f7: 0x0001, 0x2f8: 0x0010, 0x2f9: 0x0010, 0x2fa: 0x0060, 0x2fb: 0x0001, + 0x2fc: 0x0001, 0x2fd: 0x0001, 0x2fe: 0x0060, 0x2ff: 0x0001, + // Block 0xc, offset 0x300 + 0x300: 0x0010, 0x301: 0x0010, 0x302: 0x0010, 0x303: 0x0010, 0x304: 0x0060, 0x305: 0x0060, + 0x306: 0x0001, 0x307: 0x0060, 0x308: 0x0001, 0x309: 0x0001, 0x30a: 0x0001, 0x30b: 0x0010, + 0x30c: 0x0001, 0x30d: 0x0010, 0x30e: 0x0001, 0x30f: 0x0001, 0x310: 0x0001, 0x311: 0x0001, + 0x312: 0x0001, 0x313: 0x0001, 0x314: 0x0001, 0x315: 0x0001, 0x316: 0x0001, 0x317: 0x0001, + 0x318: 0x0001, 0x319: 0x0001, 0x31a: 0x0001, 0x31b: 0x0001, 0x31c: 0x0001, 0x31d: 0x0001, + 0x31e: 0x0001, 0x31f: 0x0001, 0x320: 0x0001, 0x321: 0x0001, 0x322: 0x0010, 0x323: 0x0001, + 0x324: 0x0001, 0x325: 0x0001, 0x326: 0x0001, 0x327: 0x0001, 0x328: 0x0001, 0x329: 0x0001, + 0x32a: 0x0001, 0x32b: 0x0001, 0x32c: 0x0001, 0x32d: 0x0001, 0x32e: 0x0001, 0x32f: 0x0001, + 0x330: 0x0001, 0x331: 0x0001, 0x332: 0x0001, 0x333: 0x0001, 0x334: 0x0001, 0x335: 0x0001, + 0x336: 0x0001, 0x337: 0x0001, 0x338: 0x0001, 0x339: 0x0001, 0x33a: 0x0001, 0x33b: 0x0001, + 0x33c: 0x0001, 0x33d: 0x0001, 0x33e: 0x0001, 0x33f: 0x0001, + // Block 0xd, offset 0x340 + 0x340: 0x0001, 0x341: 0x0001, 0x342: 0x0001, 0x343: 0x0001, 0x344: 0x0001, 0x345: 0x0001, + 0x346: 0x0001, 0x347: 0x0001, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001, + 0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0060, 0x351: 0x0060, + 0x352: 0x0060, 0x353: 0x0060, 0x354: 0x0060, 0x355: 0x0060, 0x356: 0x0060, 0x357: 0x0001, + 0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001, + 0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001, + 0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001, + 0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001, + 0x370: 0x0060, 0x371: 0x0060, 0x372: 0x0060, 0x373: 0x0001, 0x374: 0x0060, 0x375: 0x0060, + 0x376: 0x0060, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0060, 0x37a: 0x0001, 0x37b: 0x0001, + 0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001, + // Block 0xe, offset 0x380 + 0x380: 0x0001, 0x381: 0x0001, 0x382: 0x0060, 0x383: 0x0001, 0x384: 0x0001, 0x385: 0x0001, + 0x386: 0x0001, 0x387: 0x0001, 0x388: 0x0060, 0x389: 0x0060, 0x38a: 0x0001, 0x38b: 0x0001, + 0x38c: 0x0001, 0x38d: 0x0001, 0x38e: 0x0001, 0x38f: 0x0001, 0x390: 0x0001, 0x391: 0x0001, + 0x392: 0x0001, 0x393: 0x0001, 0x394: 0x0001, 0x395: 0x0001, 0x396: 0x0001, 0x397: 0x0001, + 0x398: 0x0001, 0x399: 0x0001, 0x39a: 0x0001, 0x39b: 0x0001, 0x39c: 0x0001, 0x39d: 0x0001, + 0x39e: 0x0001, 0x39f: 0x0001, 0x3a0: 0x0001, 0x3a1: 0x0001, 0x3a2: 0x0001, 0x3a3: 0x0001, + 0x3a4: 0x0001, 0x3a5: 0x0001, 0x3a6: 0x0001, 0x3a7: 0x0001, 0x3a8: 0x0001, 0x3a9: 0x0001, + 0x3aa: 0x0001, 0x3ab: 0x0001, 0x3ac: 0x0001, 0x3ad: 0x0001, 0x3ae: 0x0001, 0x3af: 0x0001, + 0x3b0: 0x0001, 0x3b1: 0x0001, 0x3b2: 0x0001, 0x3b3: 0x0001, 0x3b4: 0x0001, 0x3b5: 0x0001, + 0x3b6: 0x0001, 0x3b7: 0x0001, 0x3b8: 0x0001, 0x3b9: 0x0001, 0x3ba: 0x0001, 0x3bb: 0x0001, + 0x3bc: 0x0001, 0x3bd: 0x0001, 0x3be: 0x0001, 0x3bf: 0x0001, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x0001, 0x3c1: 0x0001, 0x3c2: 0x0001, 0x3c3: 0x0001, 0x3c4: 0x0001, 0x3c5: 0x0001, + 0x3c6: 0x0001, 0x3c7: 0x0001, 0x3c8: 0x0001, 0x3c9: 0x0001, 0x3ca: 0x0001, 0x3cb: 0x0001, + 0x3cc: 0x0001, 0x3cd: 0x0001, 0x3ce: 0x0001, 0x3cf: 0x0001, 0x3d0: 0x0001, 0x3d1: 0x0001, + 0x3d2: 0x0001, 0x3d3: 0x0001, 0x3d4: 0x0001, 0x3d5: 0x0001, 0x3d6: 0x0001, 0x3d7: 0x0001, + 0x3d8: 0x0001, 0x3d9: 0x0001, 0x3da: 0x0001, 0x3db: 0x0001, 0x3dc: 0x0001, 0x3dd: 0x0001, + 0x3de: 0x0001, 0x3df: 0x0001, 0x3e0: 0x0001, 0x3e1: 0x0001, 0x3e2: 0x0001, 0x3e3: 0x0001, + 0x3e4: 0x0001, 0x3e5: 0x0001, 0x3e6: 0x0001, 0x3e7: 0x0001, 0x3e8: 0x0001, 0x3e9: 0x0001, + 0x3ea: 0x0001, 0x3eb: 0x0001, 0x3ec: 0x0001, 0x3ed: 0x0001, 0x3ee: 0x0001, 0x3ef: 0x0001, + 0x3f0: 0x0010, 0x3f1: 0x0001, 0x3f2: 0x0001, 0x3f3: 0x0001, 0x3f4: 0x0001, 0x3f5: 0x0001, + 0x3f6: 0x0001, 0x3f7: 0x0001, 0x3f8: 0x0001, 0x3f9: 0x0001, 0x3fa: 0x0001, 0x3fb: 0x0001, + 0x3fc: 0x0001, 0x3fd: 0x0001, 0x3fe: 0x0001, 0x3ff: 0x0001, + // Block 0x10, offset 0x400 + 0x400: 0x0001, 0x401: 0x0001, 0x402: 0x0001, 0x403: 0x0001, 0x404: 0x0001, 0x405: 0x0001, + 0x406: 0x0001, 0x407: 0x0001, 0x408: 0x0001, 0x409: 0x0001, 0x40a: 0x0001, 0x40b: 0x0001, + 0x40c: 0x0001, 0x40d: 0x0001, 0x40e: 0x0001, 0x40f: 0x0001, 0x410: 0x0001, 0x411: 0x0001, + 0x412: 0x0001, 0x413: 0x0001, 0x414: 0x0001, 0x415: 0x0001, 0x416: 0x0001, 0x417: 0x0010, + 0x418: 0x0010, 0x419: 0x0001, 0x41a: 0x0060, 0x41b: 0x0060, 0x41c: 0x0060, 0x41d: 0x0060, + 0x41e: 0x0060, 0x41f: 0x0060, 0x420: 0x0010, 0x421: 0x0001, 0x422: 0x0001, 0x423: 0x0001, + 0x424: 0x0001, 0x425: 0x0001, 0x426: 0x0001, 0x427: 0x0001, 0x428: 0x0001, 0x429: 0x0001, + 0x42a: 0x0001, 0x42b: 0x0001, 0x42c: 0x0001, 0x42d: 0x0001, 0x42e: 0x0001, 0x42f: 0x0001, + 0x430: 0x0001, 0x431: 0x0001, 0x432: 0x0001, 0x433: 0x0001, 0x434: 0x0001, 0x435: 0x0001, + 0x436: 0x0001, 0x437: 0x0001, 0x438: 0x0001, 0x439: 0x0001, 0x43a: 0x0001, 0x43b: 0x0001, + 0x43c: 0x0001, 0x43d: 0x0001, 0x43e: 0x0001, 0x43f: 0x0001, + // Block 0x11, offset 0x440 + 0x440: 0x0001, 0x441: 0x0001, 0x442: 0x0001, 0x443: 0x0001, 0x444: 0x0001, 0x445: 0x0001, + 0x446: 0x0001, 0x447: 0x0060, 0x448: 0x0010, 0x449: 0x0060, 0x44a: 0x0060, 0x44b: 0x0010, + 0x44c: 0x0010, 0x44d: 0x0060, 0x44e: 0x0060, 0x44f: 0x0060, 0x450: 0x0010, 0x451: 0x0001, + 0x452: 0x0001, 0x453: 0x0001, 0x454: 0x0001, 0x455: 0x0001, 0x456: 0x0001, 0x457: 0x0001, + 0x458: 0x0001, 0x459: 0x0001, 0x45a: 0x0001, 0x45b: 0x0001, 0x45c: 0x0001, 0x45d: 0x0001, + 0x45e: 0x0001, 0x45f: 0x0001, 0x460: 0x0001, 0x461: 0x0001, 0x462: 0x0001, 0x463: 0x0001, + 0x464: 0x0001, 0x465: 0x0001, 0x466: 0x0001, 0x467: 0x0001, 0x468: 0x0001, 0x469: 0x0001, + 0x46a: 0x0001, 0x46b: 0x0001, 0x46c: 0x0001, 0x46d: 0x0001, 0x46e: 0x0001, 0x46f: 0x0001, + 0x470: 0x0001, 0x471: 0x0001, 0x472: 0x0001, 0x473: 0x0001, 0x474: 0x0001, 0x475: 0x0001, + 0x476: 0x0001, 0x477: 0x0001, 0x478: 0x0001, 0x479: 0x0001, 0x47a: 0x0001, 0x47b: 0x0001, + 0x47c: 0x0001, 0x47d: 0x0001, 0x47e: 0x0060, 0x47f: 0x0001, + // Block 0x12, offset 0x480 + 0x480: 0x0060, 0x481: 0x0001, 0x482: 0x0001, 0x483: 0x0060, 0x484: 0x0001, 0x485: 0x0001, + 0x486: 0x0060, 0x487: 0x0001, 0x488: 0x0010, 0x489: 0x0010, 0x48a: 0x0010, 0x48b: 0x0010, + 0x48c: 0x0010, 0x48d: 0x0010, 0x48e: 0x0010, 0x48f: 0x0010, 0x490: 0x0001, 0x491: 0x0001, + 0x492: 0x0001, 0x493: 0x0001, 0x494: 0x0001, 0x495: 0x0001, 0x496: 0x0001, 0x497: 0x0001, + 0x498: 0x0001, 0x499: 0x0001, 0x49a: 0x0001, 0x49b: 0x0001, 0x49c: 0x0001, 0x49d: 0x0001, + 0x49e: 0x0001, 0x49f: 0x0001, 0x4a0: 0x0001, 0x4a1: 0x0001, 0x4a2: 0x0001, 0x4a3: 0x0001, + 0x4a4: 0x0001, 0x4a5: 0x0001, 0x4a6: 0x0001, 0x4a7: 0x0001, 0x4a8: 0x0001, 0x4a9: 0x0001, + 0x4aa: 0x0001, 0x4ab: 0x0010, 0x4ac: 0x0010, 0x4ad: 0x0010, 0x4ae: 0x0010, 0x4af: 0x0010, + 0x4b0: 0x0001, 0x4b1: 0x0001, 0x4b2: 0x0001, 0x4b3: 0x0002, 0x4b4: 0x0002, 0x4b5: 0x0010, + 0x4b6: 0x0010, 0x4b7: 0x0010, 0x4b8: 0x0010, 0x4b9: 0x0010, 0x4ba: 0x0010, 0x4bb: 0x0010, + 0x4bc: 0x0010, 0x4bd: 0x0010, 0x4be: 0x0010, 0x4bf: 0x0010, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x0008, 0x4c1: 0x0008, 0x4c2: 0x0008, 0x4c3: 0x0008, 0x4c4: 0x0008, 0x4c5: 0x0008, + 0x4c6: 0x0060, 0x4c7: 0x0060, 0x4c8: 0x0060, 0x4c9: 0x0060, 0x4ca: 0x0060, 0x4cb: 0x0060, + 0x4cc: 0x0060, 0x4cd: 0x0060, 0x4ce: 0x0060, 0x4cf: 0x0060, 0x4d0: 0x0001, 0x4d1: 0x0001, + 0x4d2: 0x0001, 0x4d3: 0x0001, 0x4d4: 0x0001, 0x4d5: 0x0001, 0x4d6: 0x0001, 0x4d7: 0x0001, + 0x4d8: 0x0001, 0x4d9: 0x0001, 0x4da: 0x0001, 0x4db: 0x0060, 0x4dc: 0x0008, 0x4dd: 0x0010, + 0x4de: 0x0060, 0x4df: 0x0060, 0x4e0: 0x0001, 0x4e1: 0x0001, 0x4e2: 0x0001, 0x4e3: 0x0001, + 0x4e4: 0x0001, 0x4e5: 0x0001, 0x4e6: 0x0001, 0x4e7: 0x0001, 0x4e8: 0x0001, 0x4e9: 0x0001, + 0x4ea: 0x0001, 0x4eb: 0x0001, 0x4ec: 0x0001, 0x4ed: 0x0001, 0x4ee: 0x0001, 0x4ef: 0x0001, + 0x4f0: 0x0001, 0x4f1: 0x0001, 0x4f2: 0x0001, 0x4f3: 0x0001, 0x4f4: 0x0001, 0x4f5: 0x0001, + 0x4f6: 0x0001, 0x4f7: 0x0001, 0x4f8: 0x0001, 0x4f9: 0x0001, 0x4fa: 0x0001, 0x4fb: 0x0001, + 0x4fc: 0x0001, 0x4fd: 0x0001, 0x4fe: 0x0001, 0x4ff: 0x0001, + // Block 0x14, offset 0x500 + 0x500: 0x0008, 0x501: 0x0001, 0x502: 0x0001, 0x503: 0x0001, 0x504: 0x0001, 0x505: 0x0001, + 0x506: 0x0001, 0x507: 0x0001, 0x508: 0x0001, 0x509: 0x0001, 0x50a: 0x0001, 0x50b: 0x0001, + 0x50c: 0x0001, 0x50d: 0x0001, 0x50e: 0x0001, 0x50f: 0x0001, 0x510: 0x0001, 0x511: 0x0001, + 0x512: 0x0001, 0x513: 0x0001, 0x514: 0x0001, 0x515: 0x0001, 0x516: 0x0001, 0x517: 0x0001, + 0x518: 0x0001, 0x519: 0x0001, 0x51a: 0x0001, 0x51b: 0x0001, 0x51c: 0x0001, 0x51d: 0x0001, + 0x51e: 0x0001, 0x51f: 0x0001, 0x520: 0x0002, 0x521: 0x0002, 0x522: 0x0002, 0x523: 0x0002, + 0x524: 0x0002, 0x525: 0x0002, 0x526: 0x0002, 0x527: 0x0002, 0x528: 0x0002, 0x529: 0x0002, + 0x52a: 0x0060, 0x52b: 0x0060, 0x52c: 0x0060, 0x52d: 0x0060, 0x52e: 0x0001, 0x52f: 0x0001, + 0x530: 0x0001, 0x531: 0x0001, 0x532: 0x0001, 0x533: 0x0001, 0x534: 0x0001, 0x535: 0x0060, + 0x536: 0x0060, 0x537: 0x0060, 0x538: 0x0060, 0x539: 0x0001, 0x53a: 0x0001, 0x53b: 0x0001, + 0x53c: 0x0001, 0x53d: 0x0001, 0x53e: 0x0001, 0x53f: 0x0001, + // Block 0x15, offset 0x540 + 0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001, + 0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001, + 0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001, + 0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0060, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001, + 0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0008, + 0x55e: 0x0060, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001, + 0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0060, + 0x56a: 0x0001, 0x56b: 0x0001, 0x56c: 0x0001, 0x56d: 0x0001, 0x56e: 0x0001, 0x56f: 0x0001, + 0x570: 0x0002, 0x571: 0x0002, 0x572: 0x0002, 0x573: 0x0002, 0x574: 0x0002, 0x575: 0x0002, + 0x576: 0x0002, 0x577: 0x0002, 0x578: 0x0002, 0x579: 0x0002, 0x57a: 0x0001, 0x57b: 0x0001, + 0x57c: 0x0001, 0x57d: 0x0001, 0x57e: 0x0001, 0x57f: 0x0001, + // Block 0x16, offset 0x580 + 0x580: 0x0060, 0x581: 0x0060, 0x582: 0x0060, 0x583: 0x0060, 0x584: 0x0060, 0x585: 0x0060, + 0x586: 0x0060, 0x587: 0x0060, 0x588: 0x0060, 0x589: 0x0060, 0x58a: 0x0060, 0x58b: 0x0060, + 0x58c: 0x0060, 0x58d: 0x0060, 0x58e: 0x0010, 0x58f: 0x0008, 0x590: 0x0001, 0x591: 0x0001, + 0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x0001, 0x597: 0x0001, + 0x598: 0x0001, 0x599: 0x0001, 0x59a: 0x0001, 0x59b: 0x0001, 0x59c: 0x0001, 0x59d: 0x0001, + 0x59e: 0x0001, 0x59f: 0x0001, 0x5a0: 0x0001, 0x5a1: 0x0001, 0x5a2: 0x0001, 0x5a3: 0x0001, + 0x5a4: 0x0001, 0x5a5: 0x0001, 0x5a6: 0x0001, 0x5a7: 0x0001, 0x5a8: 0x0001, 0x5a9: 0x0001, + 0x5aa: 0x0001, 0x5ab: 0x0001, 0x5ac: 0x0001, 0x5ad: 0x0001, 0x5ae: 0x0001, 0x5af: 0x0001, + 0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001, + 0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001, + 0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001, + 0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0010, + 0x5cc: 0x0010, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001, + 0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001, + 0x5d8: 0x0001, 0x5d9: 0x0001, 0x5da: 0x0001, 0x5db: 0x0001, 0x5dc: 0x0001, 0x5dd: 0x0001, + 0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x0001, 0x5e1: 0x0001, 0x5e2: 0x0001, 0x5e3: 0x0001, + 0x5e4: 0x0001, 0x5e5: 0x0001, 0x5e6: 0x0001, 0x5e7: 0x0001, 0x5e8: 0x0001, 0x5e9: 0x0001, + 0x5ea: 0x0001, 0x5eb: 0x0001, 0x5ec: 0x0001, 0x5ed: 0x0001, 0x5ee: 0x0001, 0x5ef: 0x0001, + 0x5f0: 0x0001, 0x5f1: 0x0001, 0x5f2: 0x0001, 0x5f3: 0x0001, 0x5f4: 0x0001, 0x5f5: 0x0001, + 0x5f6: 0x0001, 0x5f7: 0x0001, 0x5f8: 0x0001, 0x5f9: 0x0001, 0x5fa: 0x0001, 0x5fb: 0x0001, + 0x5fc: 0x0001, 0x5fd: 0x0001, 0x5fe: 0x0001, 0x5ff: 0x0001, + // Block 0x18, offset 0x600 + 0x600: 0x0001, 0x601: 0x0001, 0x602: 0x0001, 0x603: 0x0001, 0x604: 0x0001, 0x605: 0x0001, + 0x606: 0x0001, 0x607: 0x0001, 0x608: 0x0001, 0x609: 0x0001, 0x60a: 0x0001, 0x60b: 0x0001, + 0x60c: 0x0001, 0x60d: 0x0001, 0x60e: 0x0001, 0x60f: 0x0001, 0x610: 0x0001, 0x611: 0x0001, + 0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001, + 0x618: 0x0001, 0x619: 0x0001, 0x61a: 0x0001, 0x61b: 0x0001, 0x61c: 0x0001, 0x61d: 0x0001, + 0x61e: 0x0001, 0x61f: 0x0001, 0x620: 0x0001, 0x621: 0x0001, 0x622: 0x0001, 0x623: 0x0001, + 0x624: 0x0001, 0x625: 0x0001, 0x626: 0x0001, 0x627: 0x0001, 0x628: 0x0001, 0x629: 0x0001, + 0x62a: 0x0001, 0x62b: 0x0001, 0x62c: 0x0001, 0x62d: 0x0001, 0x62e: 0x0001, 0x62f: 0x0001, + 0x630: 0x0001, 0x631: 0x0001, 0x632: 0x0010, 0x633: 0x0010, 0x634: 0x0010, 0x635: 0x0010, + 0x636: 0x0010, 0x637: 0x0010, 0x638: 0x0010, 0x639: 0x0010, 0x63a: 0x0010, 0x63b: 0x0010, + 0x63c: 0x0010, 0x63d: 0x0010, 0x63e: 0x0010, 0x63f: 0x0010, + // Block 0x19, offset 0x640 + 0x640: 0x0001, 0x641: 0x0001, 0x642: 0x0001, 0x643: 0x0001, 0x644: 0x0001, 0x645: 0x0001, + 0x646: 0x0001, 0x647: 0x0001, 0x648: 0x0001, 0x649: 0x0001, 0x64a: 0x0001, 0x64b: 0x0001, + 0x64c: 0x0001, 0x64d: 0x0001, 0x64e: 0x0001, 0x64f: 0x0001, 0x650: 0x0001, 0x651: 0x0001, + 0x652: 0x0001, 0x653: 0x0001, 0x654: 0x0001, 0x655: 0x0001, 0x656: 0x0001, 0x657: 0x0001, + 0x658: 0x0001, 0x659: 0x0001, 0x65a: 0x0001, 0x65b: 0x0001, 0x65c: 0x0001, 0x65d: 0x0001, + 0x65e: 0x0001, 0x65f: 0x0001, 0x660: 0x0001, 0x661: 0x0001, 0x662: 0x0001, 0x663: 0x0001, + 0x664: 0x0001, 0x665: 0x0001, 0x666: 0x0001, 0x667: 0x0001, 0x668: 0x0001, 0x669: 0x0001, + 0x66a: 0x0001, 0x66b: 0x0001, 0x66c: 0x0001, 0x66d: 0x0001, 0x66e: 0x0001, 0x66f: 0x0001, + 0x670: 0x0001, 0x671: 0x0001, 0x672: 0x0001, 0x673: 0x0001, 0x674: 0x0001, 0x675: 0x0001, + 0x676: 0x0060, 0x677: 0x0060, 0x678: 0x0060, 0x679: 0x0060, 0x67a: 0x0008, 0x67b: 0x0010, + 0x67c: 0x0010, 0x67d: 0x0010, 0x67e: 0x0010, 0x67f: 0x0010, + // Block 0x1a, offset 0x680 + 0x680: 0x0001, 0x681: 0x0001, 0x682: 0x0001, 0x683: 0x0001, 0x684: 0x0001, 0x685: 0x0001, + 0x686: 0x0001, 0x687: 0x0001, 0x688: 0x0001, 0x689: 0x0001, 0x68a: 0x0001, 0x68b: 0x0001, + 0x68c: 0x0001, 0x68d: 0x0001, 0x68e: 0x0001, 0x68f: 0x0001, 0x690: 0x0001, 0x691: 0x0001, + 0x692: 0x0001, 0x693: 0x0001, 0x694: 0x0001, 0x695: 0x0001, 0x696: 0x0001, 0x697: 0x0001, + 0x698: 0x0001, 0x699: 0x0001, 0x69a: 0x0001, 0x69b: 0x0001, 0x69c: 0x0001, 0x69d: 0x0001, + 0x69e: 0x0001, 0x69f: 0x0001, 0x6a0: 0x0001, 0x6a1: 0x0001, 0x6a2: 0x0001, 0x6a3: 0x0001, + 0x6a4: 0x0001, 0x6a5: 0x0001, 0x6a6: 0x0001, 0x6a7: 0x0001, 0x6a8: 0x0001, 0x6a9: 0x0001, + 0x6aa: 0x0001, 0x6ab: 0x0001, 0x6ac: 0x0001, 0x6ad: 0x0001, 0x6ae: 0x0010, 0x6af: 0x0010, + 0x6b0: 0x0060, 0x6b1: 0x0060, 0x6b2: 0x0060, 0x6b3: 0x0060, 0x6b4: 0x0060, 0x6b5: 0x0060, + 0x6b6: 0x0060, 0x6b7: 0x0060, 0x6b8: 0x0060, 0x6b9: 0x0060, 0x6ba: 0x0060, 0x6bb: 0x0060, + 0x6bc: 0x0060, 0x6bd: 0x0060, 0x6be: 0x0060, 0x6bf: 0x0010, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x0001, 0x6c1: 0x0001, 0x6c2: 0x0001, 0x6c3: 0x0001, 0x6c4: 0x0001, 0x6c5: 0x0001, + 0x6c6: 0x0001, 0x6c7: 0x0001, 0x6c8: 0x0001, 0x6c9: 0x0001, 0x6ca: 0x0001, 0x6cb: 0x0001, + 0x6cc: 0x0001, 0x6cd: 0x0001, 0x6ce: 0x0001, 0x6cf: 0x0001, 0x6d0: 0x0001, 0x6d1: 0x0001, + 0x6d2: 0x0001, 0x6d3: 0x0001, 0x6d4: 0x0001, 0x6d5: 0x0001, 0x6d6: 0x0001, 0x6d7: 0x0001, + 0x6d8: 0x0001, 0x6d9: 0x0001, 0x6da: 0x0001, 0x6db: 0x0001, 0x6dc: 0x0010, 0x6dd: 0x0010, + 0x6de: 0x0060, 0x6df: 0x0010, 0x6e0: 0x0010, 0x6e1: 0x0010, 0x6e2: 0x0010, 0x6e3: 0x0010, + 0x6e4: 0x0010, 0x6e5: 0x0010, 0x6e6: 0x0010, 0x6e7: 0x0010, 0x6e8: 0x0010, 0x6e9: 0x0010, + 0x6ea: 0x0010, 0x6eb: 0x0010, 0x6ec: 0x0010, 0x6ed: 0x0010, 0x6ee: 0x0010, 0x6ef: 0x0010, + 0x6f0: 0x0010, 0x6f1: 0x0010, 0x6f2: 0x0010, 0x6f3: 0x0010, 0x6f4: 0x0010, 0x6f5: 0x0010, + 0x6f6: 0x0010, 0x6f7: 0x0010, 0x6f8: 0x0010, 0x6f9: 0x0010, 0x6fa: 0x0010, 0x6fb: 0x0010, + 0x6fc: 0x0010, 0x6fd: 0x0010, 0x6fe: 0x0010, 0x6ff: 0x0010, + // Block 0x1c, offset 0x700 + 0x700: 0x0010, 0x701: 0x0010, 0x702: 0x0010, 0x703: 0x0010, 0x704: 0x0010, 0x705: 0x0010, + 0x706: 0x0010, 0x707: 0x0010, 0x708: 0x0010, 0x709: 0x0010, 0x70a: 0x0010, 0x70b: 0x0010, + 0x70c: 0x0010, 0x70d: 0x0010, 0x70e: 0x0010, 0x70f: 0x0010, 0x710: 0x0010, 0x711: 0x0010, + 0x712: 0x0010, 0x713: 0x0010, 0x714: 0x0010, 0x715: 0x0010, 0x716: 0x0010, 0x717: 0x0010, + 0x718: 0x0010, 0x719: 0x0010, 0x71a: 0x0010, 0x71b: 0x0010, 0x71c: 0x0010, 0x71d: 0x0010, + 0x71e: 0x0010, 0x71f: 0x0010, 0x720: 0x0001, 0x721: 0x0001, 0x722: 0x0001, 0x723: 0x0001, + 0x724: 0x0001, 0x725: 0x0001, 0x726: 0x0001, 0x727: 0x0001, 0x728: 0x0001, 0x729: 0x0001, + 0x72a: 0x0001, 0x72b: 0x0001, 0x72c: 0x0001, 0x72d: 0x0001, 0x72e: 0x0001, 0x72f: 0x0001, + 0x730: 0x0001, 0x731: 0x0001, 0x732: 0x0001, 0x733: 0x0001, 0x734: 0x0001, 0x735: 0x0010, + 0x736: 0x0010, 0x737: 0x0010, 0x738: 0x0010, 0x739: 0x0010, 0x73a: 0x0010, 0x73b: 0x0010, + 0x73c: 0x0010, 0x73d: 0x0010, 0x73e: 0x0010, 0x73f: 0x0010, + // Block 0x1d, offset 0x740 + 0x740: 0x0010, 0x741: 0x0010, 0x742: 0x0010, 0x743: 0x0010, 0x744: 0x0010, 0x745: 0x0010, + 0x746: 0x0010, 0x747: 0x0010, 0x748: 0x0010, 0x749: 0x0010, 0x74a: 0x0010, 0x74b: 0x0010, + 0x74c: 0x0010, 0x74d: 0x0010, 0x74e: 0x0010, 0x74f: 0x0010, 0x750: 0x0010, 0x751: 0x0010, + 0x752: 0x0010, 0x753: 0x0010, 0x754: 0x0010, 0x755: 0x0010, 0x756: 0x0010, 0x757: 0x0010, + 0x758: 0x0010, 0x759: 0x0010, 0x75a: 0x0010, 0x75b: 0x0010, 0x75c: 0x0010, 0x75d: 0x0010, + 0x75e: 0x0010, 0x75f: 0x0010, 0x760: 0x0010, 0x761: 0x0010, 0x762: 0x0010, 0x763: 0x0001, + 0x764: 0x0001, 0x765: 0x0001, 0x766: 0x0001, 0x767: 0x0001, 0x768: 0x0001, 0x769: 0x0001, + 0x76a: 0x0001, 0x76b: 0x0001, 0x76c: 0x0001, 0x76d: 0x0001, 0x76e: 0x0001, 0x76f: 0x0001, + 0x770: 0x0001, 0x771: 0x0001, 0x772: 0x0001, 0x773: 0x0001, 0x774: 0x0001, 0x775: 0x0001, + 0x776: 0x0001, 0x777: 0x0001, 0x778: 0x0001, 0x779: 0x0001, 0x77a: 0x0001, 0x77b: 0x0001, + 0x77c: 0x0001, 0x77d: 0x0001, 0x77e: 0x0001, 0x77f: 0x0001, + // Block 0x1e, offset 0x780 + 0x780: 0x0001, 0x781: 0x0001, 0x782: 0x0001, 0x783: 0x0001, 0x784: 0x0001, 0x785: 0x0001, + 0x786: 0x0001, 0x787: 0x0001, 0x788: 0x0001, 0x789: 0x0001, 0x78a: 0x0001, 0x78b: 0x0001, + 0x78c: 0x0001, 0x78d: 0x0001, 0x78e: 0x0001, 0x78f: 0x0001, 0x790: 0x0001, 0x791: 0x0001, + 0x792: 0x0001, 0x793: 0x0001, 0x794: 0x0001, 0x795: 0x0001, 0x796: 0x0001, 0x797: 0x0001, + 0x798: 0x0060, 0x799: 0x0060, 0x79a: 0x0060, 0x79b: 0x0060, 0x79c: 0x0060, 0x79d: 0x0060, + 0x79e: 0x0060, 0x79f: 0x0060, 0x7a0: 0x0001, 0x7a1: 0x0001, 0x7a2: 0x0001, 0x7a3: 0x0001, + 0x7a4: 0x0060, 0x7a5: 0x0060, 0x7a6: 0x0001, 0x7a7: 0x0001, 0x7a8: 0x0001, 0x7a9: 0x0001, + 0x7aa: 0x0001, 0x7ab: 0x0001, 0x7ac: 0x0001, 0x7ad: 0x0001, 0x7ae: 0x0001, 0x7af: 0x0001, + 0x7b0: 0x0060, 0x7b1: 0x0001, 0x7b2: 0x0001, 0x7b3: 0x0001, 0x7b4: 0x0001, 0x7b5: 0x0001, + 0x7b6: 0x0001, 0x7b7: 0x0001, 0x7b8: 0x0001, 0x7b9: 0x0001, 0x7ba: 0x0001, 0x7bb: 0x0001, + 0x7bc: 0x0001, 0x7bd: 0x0001, 0x7be: 0x0001, 0x7bf: 0x0001, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x0001, 0x7c1: 0x0001, 0x7c2: 0x0001, 0x7c3: 0x0001, 0x7c4: 0x0010, 0x7c5: 0x0001, + 0x7c6: 0x0001, 0x7c7: 0x0001, 0x7c8: 0x0001, 0x7c9: 0x0001, 0x7ca: 0x0001, 0x7cb: 0x0001, + 0x7cc: 0x0001, 0x7cd: 0x0010, 0x7ce: 0x0010, 0x7cf: 0x0001, 0x7d0: 0x0001, 0x7d1: 0x0010, + 0x7d2: 0x0010, 0x7d3: 0x0001, 0x7d4: 0x0001, 0x7d5: 0x0001, 0x7d6: 0x0001, 0x7d7: 0x0001, + 0x7d8: 0x0001, 0x7d9: 0x0001, 0x7da: 0x0001, 0x7db: 0x0001, 0x7dc: 0x0001, 0x7dd: 0x0001, + 0x7de: 0x0001, 0x7df: 0x0001, 0x7e0: 0x0001, 0x7e1: 0x0001, 0x7e2: 0x0001, 0x7e3: 0x0001, + 0x7e4: 0x0001, 0x7e5: 0x0001, 0x7e6: 0x0001, 0x7e7: 0x0001, 0x7e8: 0x0001, 0x7e9: 0x0010, + 0x7ea: 0x0001, 0x7eb: 0x0001, 0x7ec: 0x0001, 0x7ed: 0x0001, 0x7ee: 0x0001, 0x7ef: 0x0001, + 0x7f0: 0x0001, 0x7f1: 0x0010, 0x7f2: 0x0001, 0x7f3: 0x0010, 0x7f4: 0x0010, 0x7f5: 0x0010, + 0x7f6: 0x0001, 0x7f7: 0x0001, 0x7f8: 0x0001, 0x7f9: 0x0001, 0x7fa: 0x0010, 0x7fb: 0x0010, + 0x7fc: 0x0001, 0x7fd: 0x0001, 0x7fe: 0x0001, 0x7ff: 0x0001, + // Block 0x20, offset 0x800 + 0x800: 0x0001, 0x801: 0x0001, 0x802: 0x0001, 0x803: 0x0001, 0x804: 0x0001, 0x805: 0x0010, + 0x806: 0x0010, 0x807: 0x0001, 0x808: 0x0001, 0x809: 0x0010, 0x80a: 0x0010, 0x80b: 0x0001, + 0x80c: 0x0001, 0x80d: 0x0001, 0x80e: 0x0001, 0x80f: 0x0010, 0x810: 0x0010, 0x811: 0x0010, + 0x812: 0x0010, 0x813: 0x0010, 0x814: 0x0010, 0x815: 0x0010, 0x816: 0x0010, 0x817: 0x0001, + 0x818: 0x0010, 0x819: 0x0010, 0x81a: 0x0010, 0x81b: 0x0010, 0x81c: 0x0060, 0x81d: 0x0060, + 0x81e: 0x0010, 0x81f: 0x0060, 0x820: 0x0001, 0x821: 0x0001, 0x822: 0x0001, 0x823: 0x0001, + 0x824: 0x0010, 0x825: 0x0010, 0x826: 0x0001, 0x827: 0x0001, 0x828: 0x0001, 0x829: 0x0001, + 0x82a: 0x0001, 0x82b: 0x0001, 0x82c: 0x0001, 0x82d: 0x0001, 0x82e: 0x0001, 0x82f: 0x0001, + 0x830: 0x0001, 0x831: 0x0001, 0x832: 0x0060, 0x833: 0x0060, 0x834: 0x0060, 0x835: 0x0060, + 0x836: 0x0060, 0x837: 0x0060, 0x838: 0x0060, 0x839: 0x0060, 0x83a: 0x0060, 0x83b: 0x0060, + 0x83c: 0x0010, 0x83d: 0x0010, 0x83e: 0x0010, 0x83f: 0x0010, + // Block 0x21, offset 0x840 + 0x840: 0x0010, 0x841: 0x0001, 0x842: 0x0001, 0x843: 0x0001, 0x844: 0x0010, 0x845: 0x0001, + 0x846: 0x0001, 0x847: 0x0001, 0x848: 0x0001, 0x849: 0x0001, 0x84a: 0x0001, 0x84b: 0x0010, + 0x84c: 0x0010, 0x84d: 0x0010, 0x84e: 0x0010, 0x84f: 0x0001, 0x850: 0x0001, 0x851: 0x0010, + 0x852: 0x0010, 0x853: 0x0001, 0x854: 0x0001, 0x855: 0x0001, 0x856: 0x0001, 0x857: 0x0001, + 0x858: 0x0001, 0x859: 0x0001, 0x85a: 0x0001, 0x85b: 0x0001, 0x85c: 0x0001, 0x85d: 0x0001, + 0x85e: 0x0001, 0x85f: 0x0001, 0x860: 0x0001, 0x861: 0x0001, 0x862: 0x0001, 0x863: 0x0001, + 0x864: 0x0001, 0x865: 0x0001, 0x866: 0x0001, 0x867: 0x0001, 0x868: 0x0001, 0x869: 0x0010, + 0x86a: 0x0001, 0x86b: 0x0001, 0x86c: 0x0001, 0x86d: 0x0001, 0x86e: 0x0001, 0x86f: 0x0001, + 0x870: 0x0001, 0x871: 0x0010, 0x872: 0x0001, 0x873: 0x0060, 0x874: 0x0010, 0x875: 0x0001, + 0x876: 0x0060, 0x877: 0x0010, 0x878: 0x0001, 0x879: 0x0001, 0x87a: 0x0010, 0x87b: 0x0010, + 0x87c: 0x0001, 0x87d: 0x0010, 0x87e: 0x0001, 0x87f: 0x0001, + // Block 0x22, offset 0x880 + 0x880: 0x0001, 0x881: 0x0001, 0x882: 0x0001, 0x883: 0x0010, 0x884: 0x0010, 0x885: 0x0010, + 0x886: 0x0010, 0x887: 0x0001, 0x888: 0x0001, 0x889: 0x0010, 0x88a: 0x0010, 0x88b: 0x0001, + 0x88c: 0x0001, 0x88d: 0x0001, 0x88e: 0x0010, 0x88f: 0x0010, 0x890: 0x0010, 0x891: 0x0001, + 0x892: 0x0010, 0x893: 0x0010, 0x894: 0x0010, 0x895: 0x0010, 0x896: 0x0010, 0x897: 0x0010, + 0x898: 0x0010, 0x899: 0x0060, 0x89a: 0x0060, 0x89b: 0x0060, 0x89c: 0x0001, 0x89d: 0x0010, + 0x89e: 0x0060, 0x89f: 0x0010, 0x8a0: 0x0010, 0x8a1: 0x0010, 0x8a2: 0x0010, 0x8a3: 0x0010, + 0x8a4: 0x0010, 0x8a5: 0x0010, 0x8a6: 0x0001, 0x8a7: 0x0001, 0x8a8: 0x0001, 0x8a9: 0x0001, + 0x8aa: 0x0001, 0x8ab: 0x0001, 0x8ac: 0x0001, 0x8ad: 0x0001, 0x8ae: 0x0001, 0x8af: 0x0001, + 0x8b0: 0x0001, 0x8b1: 0x0001, 0x8b2: 0x0001, 0x8b3: 0x0001, 0x8b4: 0x0001, 0x8b5: 0x0001, + 0x8b6: 0x0010, 0x8b7: 0x0010, 0x8b8: 0x0010, 0x8b9: 0x0010, 0x8ba: 0x0010, 0x8bb: 0x0010, + 0x8bc: 0x0010, 0x8bd: 0x0010, 0x8be: 0x0010, 0x8bf: 0x0010, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x0010, 0x8c1: 0x0001, 0x8c2: 0x0001, 0x8c3: 0x0001, 0x8c4: 0x0010, 0x8c5: 0x0001, + 0x8c6: 0x0001, 0x8c7: 0x0001, 0x8c8: 0x0001, 0x8c9: 0x0001, 0x8ca: 0x0001, 0x8cb: 0x0001, + 0x8cc: 0x0001, 0x8cd: 0x0001, 0x8ce: 0x0010, 0x8cf: 0x0001, 0x8d0: 0x0001, 0x8d1: 0x0001, + 0x8d2: 0x0010, 0x8d3: 0x0001, 0x8d4: 0x0001, 0x8d5: 0x0001, 0x8d6: 0x0001, 0x8d7: 0x0001, + 0x8d8: 0x0001, 0x8d9: 0x0001, 0x8da: 0x0001, 0x8db: 0x0001, 0x8dc: 0x0001, 0x8dd: 0x0001, + 0x8de: 0x0001, 0x8df: 0x0001, 0x8e0: 0x0001, 0x8e1: 0x0001, 0x8e2: 0x0001, 0x8e3: 0x0001, + 0x8e4: 0x0001, 0x8e5: 0x0001, 0x8e6: 0x0001, 0x8e7: 0x0001, 0x8e8: 0x0001, 0x8e9: 0x0010, + 0x8ea: 0x0001, 0x8eb: 0x0001, 0x8ec: 0x0001, 0x8ed: 0x0001, 0x8ee: 0x0001, 0x8ef: 0x0001, + 0x8f0: 0x0001, 0x8f1: 0x0010, 0x8f2: 0x0001, 0x8f3: 0x0001, 0x8f4: 0x0010, 0x8f5: 0x0001, + 0x8f6: 0x0001, 0x8f7: 0x0001, 0x8f8: 0x0001, 0x8f9: 0x0001, 0x8fa: 0x0010, 0x8fb: 0x0010, + 0x8fc: 0x0001, 0x8fd: 0x0001, 0x8fe: 0x0001, 0x8ff: 0x0001, + // Block 0x24, offset 0x900 + 0x900: 0x0001, 0x901: 0x0001, 0x902: 0x0001, 0x903: 0x0001, 0x904: 0x0001, 0x905: 0x0001, + 0x906: 0x0010, 0x907: 0x0001, 0x908: 0x0001, 0x909: 0x0001, 0x90a: 0x0010, 0x90b: 0x0001, + 0x90c: 0x0001, 0x90d: 0x0001, 0x90e: 0x0010, 0x90f: 0x0010, 0x910: 0x0001, 0x911: 0x0010, + 0x912: 0x0010, 0x913: 0x0010, 0x914: 0x0010, 0x915: 0x0010, 0x916: 0x0010, 0x917: 0x0010, + 0x918: 0x0010, 0x919: 0x0010, 0x91a: 0x0010, 0x91b: 0x0010, 0x91c: 0x0010, 0x91d: 0x0010, + 0x91e: 0x0010, 0x91f: 0x0010, 0x920: 0x0001, 0x921: 0x0001, 0x922: 0x0001, 0x923: 0x0001, + 0x924: 0x0010, 0x925: 0x0010, 0x926: 0x0001, 0x927: 0x0001, 0x928: 0x0001, 0x929: 0x0001, + 0x92a: 0x0001, 0x92b: 0x0001, 0x92c: 0x0001, 0x92d: 0x0001, 0x92e: 0x0001, 0x92f: 0x0001, + 0x930: 0x0060, 0x931: 0x0060, 0x932: 0x0010, 0x933: 0x0010, 0x934: 0x0010, 0x935: 0x0010, + 0x936: 0x0010, 0x937: 0x0010, 0x938: 0x0010, 0x939: 0x0001, 0x93a: 0x0010, 0x93b: 0x0010, + 0x93c: 0x0010, 0x93d: 0x0010, 0x93e: 0x0010, 0x93f: 0x0010, + // Block 0x25, offset 0x940 + 0x940: 0x0010, 0x941: 0x0001, 0x942: 0x0001, 0x943: 0x0001, 0x944: 0x0010, 0x945: 0x0001, + 0x946: 0x0001, 0x947: 0x0001, 0x948: 0x0001, 0x949: 0x0001, 0x94a: 0x0001, 0x94b: 0x0001, + 0x94c: 0x0001, 0x94d: 0x0010, 0x94e: 0x0010, 0x94f: 0x0001, 0x950: 0x0001, 0x951: 0x0010, + 0x952: 0x0010, 0x953: 0x0001, 0x954: 0x0001, 0x955: 0x0001, 0x956: 0x0001, 0x957: 0x0001, + 0x958: 0x0001, 0x959: 0x0001, 0x95a: 0x0001, 0x95b: 0x0001, 0x95c: 0x0001, 0x95d: 0x0001, + 0x95e: 0x0001, 0x95f: 0x0001, 0x960: 0x0001, 0x961: 0x0001, 0x962: 0x0001, 0x963: 0x0001, + 0x964: 0x0001, 0x965: 0x0001, 0x966: 0x0001, 0x967: 0x0001, 0x968: 0x0001, 0x969: 0x0010, + 0x96a: 0x0001, 0x96b: 0x0001, 0x96c: 0x0001, 0x96d: 0x0001, 0x96e: 0x0001, 0x96f: 0x0001, + 0x970: 0x0001, 0x971: 0x0010, 0x972: 0x0001, 0x973: 0x0001, 0x974: 0x0010, 0x975: 0x0001, + 0x976: 0x0001, 0x977: 0x0001, 0x978: 0x0001, 0x979: 0x0001, 0x97a: 0x0010, 0x97b: 0x0010, + 0x97c: 0x0001, 0x97d: 0x0001, 0x97e: 0x0001, 0x97f: 0x0001, + // Block 0x26, offset 0x980 + 0x980: 0x0001, 0x981: 0x0001, 0x982: 0x0001, 0x983: 0x0001, 0x984: 0x0001, 0x985: 0x0010, + 0x986: 0x0010, 0x987: 0x0001, 0x988: 0x0001, 0x989: 0x0010, 0x98a: 0x0010, 0x98b: 0x0001, + 0x98c: 0x0001, 0x98d: 0x0001, 0x98e: 0x0010, 0x98f: 0x0010, 0x990: 0x0010, 0x991: 0x0010, + 0x992: 0x0010, 0x993: 0x0010, 0x994: 0x0010, 0x995: 0x0010, 0x996: 0x0001, 0x997: 0x0001, + 0x998: 0x0010, 0x999: 0x0010, 0x99a: 0x0010, 0x99b: 0x0010, 0x99c: 0x0060, 0x99d: 0x0060, + 0x99e: 0x0010, 0x99f: 0x0001, 0x9a0: 0x0001, 0x9a1: 0x0001, 0x9a2: 0x0001, 0x9a3: 0x0001, + 0x9a4: 0x0010, 0x9a5: 0x0010, 0x9a6: 0x0001, 0x9a7: 0x0001, 0x9a8: 0x0001, 0x9a9: 0x0001, + 0x9aa: 0x0001, 0x9ab: 0x0001, 0x9ac: 0x0001, 0x9ad: 0x0001, 0x9ae: 0x0001, 0x9af: 0x0001, + 0x9b0: 0x0060, 0x9b1: 0x0001, 0x9b2: 0x0060, 0x9b3: 0x0060, 0x9b4: 0x0060, 0x9b5: 0x0060, + 0x9b6: 0x0060, 0x9b7: 0x0060, 0x9b8: 0x0010, 0x9b9: 0x0010, 0x9ba: 0x0010, 0x9bb: 0x0010, + 0x9bc: 0x0010, 0x9bd: 0x0010, 0x9be: 0x0010, 0x9bf: 0x0010, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x0010, 0x9c1: 0x0010, 0x9c2: 0x0001, 0x9c3: 0x0001, 0x9c4: 0x0010, 0x9c5: 0x0001, + 0x9c6: 0x0001, 0x9c7: 0x0001, 0x9c8: 0x0001, 0x9c9: 0x0001, 0x9ca: 0x0001, 0x9cb: 0x0010, + 0x9cc: 0x0010, 0x9cd: 0x0010, 0x9ce: 0x0001, 0x9cf: 0x0001, 0x9d0: 0x0001, 0x9d1: 0x0010, + 0x9d2: 0x0001, 0x9d3: 0x0001, 0x9d4: 0x0001, 0x9d5: 0x0001, 0x9d6: 0x0010, 0x9d7: 0x0010, + 0x9d8: 0x0010, 0x9d9: 0x0001, 0x9da: 0x0001, 0x9db: 0x0010, 0x9dc: 0x0001, 0x9dd: 0x0010, + 0x9de: 0x0001, 0x9df: 0x0001, 0x9e0: 0x0010, 0x9e1: 0x0010, 0x9e2: 0x0010, 0x9e3: 0x0001, + 0x9e4: 0x0001, 0x9e5: 0x0010, 0x9e6: 0x0010, 0x9e7: 0x0010, 0x9e8: 0x0001, 0x9e9: 0x0001, + 0x9ea: 0x0001, 0x9eb: 0x0010, 0x9ec: 0x0010, 0x9ed: 0x0010, 0x9ee: 0x0001, 0x9ef: 0x0001, + 0x9f0: 0x0001, 0x9f1: 0x0001, 0x9f2: 0x0001, 0x9f3: 0x0001, 0x9f4: 0x0001, 0x9f5: 0x0001, + 0x9f6: 0x0001, 0x9f7: 0x0001, 0x9f8: 0x0001, 0x9f9: 0x0001, 0x9fa: 0x0010, 0x9fb: 0x0010, + 0x9fc: 0x0010, 0x9fd: 0x0010, 0x9fe: 0x0001, 0x9ff: 0x0001, + // Block 0x28, offset 0xa00 + 0xa00: 0x0001, 0xa01: 0x0001, 0xa02: 0x0001, 0xa03: 0x0010, 0xa04: 0x0010, 0xa05: 0x0010, + 0xa06: 0x0001, 0xa07: 0x0001, 0xa08: 0x0001, 0xa09: 0x0010, 0xa0a: 0x0001, 0xa0b: 0x0001, + 0xa0c: 0x0001, 0xa0d: 0x0001, 0xa0e: 0x0010, 0xa0f: 0x0010, 0xa10: 0x0001, 0xa11: 0x0010, + 0xa12: 0x0010, 0xa13: 0x0010, 0xa14: 0x0010, 0xa15: 0x0010, 0xa16: 0x0010, 0xa17: 0x0001, + 0xa18: 0x0010, 0xa19: 0x0010, 0xa1a: 0x0010, 0xa1b: 0x0010, 0xa1c: 0x0010, 0xa1d: 0x0010, + 0xa1e: 0x0010, 0xa1f: 0x0010, 0xa20: 0x0010, 0xa21: 0x0010, 0xa22: 0x0010, 0xa23: 0x0010, + 0xa24: 0x0010, 0xa25: 0x0010, 0xa26: 0x0001, 0xa27: 0x0001, 0xa28: 0x0001, 0xa29: 0x0001, + 0xa2a: 0x0001, 0xa2b: 0x0001, 0xa2c: 0x0001, 0xa2d: 0x0001, 0xa2e: 0x0001, 0xa2f: 0x0001, + 0xa30: 0x0060, 0xa31: 0x0060, 0xa32: 0x0060, 0xa33: 0x0060, 0xa34: 0x0060, 0xa35: 0x0060, + 0xa36: 0x0060, 0xa37: 0x0060, 0xa38: 0x0060, 0xa39: 0x0060, 0xa3a: 0x0060, 0xa3b: 0x0010, + 0xa3c: 0x0010, 0xa3d: 0x0010, 0xa3e: 0x0010, 0xa3f: 0x0010, + // Block 0x29, offset 0xa40 + 0xa40: 0x0001, 0xa41: 0x0001, 0xa42: 0x0001, 0xa43: 0x0001, 0xa44: 0x0010, 0xa45: 0x0001, + 0xa46: 0x0001, 0xa47: 0x0001, 0xa48: 0x0001, 0xa49: 0x0001, 0xa4a: 0x0001, 0xa4b: 0x0001, + 0xa4c: 0x0001, 0xa4d: 0x0010, 0xa4e: 0x0001, 0xa4f: 0x0001, 0xa50: 0x0001, 0xa51: 0x0010, + 0xa52: 0x0001, 0xa53: 0x0001, 0xa54: 0x0001, 0xa55: 0x0001, 0xa56: 0x0001, 0xa57: 0x0001, + 0xa58: 0x0001, 0xa59: 0x0001, 0xa5a: 0x0001, 0xa5b: 0x0001, 0xa5c: 0x0001, 0xa5d: 0x0001, + 0xa5e: 0x0001, 0xa5f: 0x0001, 0xa60: 0x0001, 0xa61: 0x0001, 0xa62: 0x0001, 0xa63: 0x0001, + 0xa64: 0x0001, 0xa65: 0x0001, 0xa66: 0x0001, 0xa67: 0x0001, 0xa68: 0x0001, 0xa69: 0x0010, + 0xa6a: 0x0001, 0xa6b: 0x0001, 0xa6c: 0x0001, 0xa6d: 0x0001, 0xa6e: 0x0001, 0xa6f: 0x0001, + 0xa70: 0x0001, 0xa71: 0x0001, 0xa72: 0x0001, 0xa73: 0x0001, 0xa74: 0x0001, 0xa75: 0x0001, + 0xa76: 0x0001, 0xa77: 0x0001, 0xa78: 0x0001, 0xa79: 0x0001, 0xa7a: 0x0010, 0xa7b: 0x0010, + 0xa7c: 0x0010, 0xa7d: 0x0001, 0xa7e: 0x0001, 0xa7f: 0x0001, + // Block 0x2a, offset 0xa80 + 0xa80: 0x0001, 0xa81: 0x0001, 0xa82: 0x0001, 0xa83: 0x0001, 0xa84: 0x0001, 0xa85: 0x0010, + 0xa86: 0x0001, 0xa87: 0x0001, 0xa88: 0x0001, 0xa89: 0x0010, 0xa8a: 0x0001, 0xa8b: 0x0001, + 0xa8c: 0x0001, 0xa8d: 0x0001, 0xa8e: 0x0010, 0xa8f: 0x0010, 0xa90: 0x0010, 0xa91: 0x0010, + 0xa92: 0x0010, 0xa93: 0x0010, 0xa94: 0x0010, 0xa95: 0x0001, 0xa96: 0x0001, 0xa97: 0x0010, + 0xa98: 0x0001, 0xa99: 0x0001, 0xa9a: 0x0001, 0xa9b: 0x0010, 0xa9c: 0x0010, 0xa9d: 0x0010, + 0xa9e: 0x0010, 0xa9f: 0x0010, 0xaa0: 0x0001, 0xaa1: 0x0001, 0xaa2: 0x0001, 0xaa3: 0x0001, + 0xaa4: 0x0010, 0xaa5: 0x0010, 0xaa6: 0x0001, 0xaa7: 0x0001, 0xaa8: 0x0001, 0xaa9: 0x0001, + 0xaaa: 0x0001, 0xaab: 0x0001, 0xaac: 0x0001, 0xaad: 0x0001, 0xaae: 0x0001, 0xaaf: 0x0001, + 0xab0: 0x0010, 0xab1: 0x0010, 0xab2: 0x0010, 0xab3: 0x0010, 0xab4: 0x0010, 0xab5: 0x0010, + 0xab6: 0x0010, 0xab7: 0x0010, 0xab8: 0x0060, 0xab9: 0x0060, 0xaba: 0x0060, 0xabb: 0x0060, + 0xabc: 0x0060, 0xabd: 0x0060, 0xabe: 0x0060, 0xabf: 0x0060, + // Block 0x2b, offset 0xac0 + 0xac0: 0x0010, 0xac1: 0x0001, 0xac2: 0x0001, 0xac3: 0x0001, 0xac4: 0x0010, 0xac5: 0x0001, + 0xac6: 0x0001, 0xac7: 0x0001, 0xac8: 0x0001, 0xac9: 0x0001, 0xaca: 0x0001, 0xacb: 0x0001, + 0xacc: 0x0001, 0xacd: 0x0010, 0xace: 0x0001, 0xacf: 0x0001, 0xad0: 0x0001, 0xad1: 0x0010, + 0xad2: 0x0001, 0xad3: 0x0001, 0xad4: 0x0001, 0xad5: 0x0001, 0xad6: 0x0001, 0xad7: 0x0001, + 0xad8: 0x0001, 0xad9: 0x0001, 0xada: 0x0001, 0xadb: 0x0001, 0xadc: 0x0001, 0xadd: 0x0001, + 0xade: 0x0001, 0xadf: 0x0001, 0xae0: 0x0001, 0xae1: 0x0001, 0xae2: 0x0001, 0xae3: 0x0001, + 0xae4: 0x0001, 0xae5: 0x0001, 0xae6: 0x0001, 0xae7: 0x0001, 0xae8: 0x0001, 0xae9: 0x0010, + 0xaea: 0x0001, 0xaeb: 0x0001, 0xaec: 0x0001, 0xaed: 0x0001, 0xaee: 0x0001, 0xaef: 0x0001, + 0xaf0: 0x0001, 0xaf1: 0x0001, 0xaf2: 0x0001, 0xaf3: 0x0001, 0xaf4: 0x0010, 0xaf5: 0x0001, + 0xaf6: 0x0001, 0xaf7: 0x0001, 0xaf8: 0x0001, 0xaf9: 0x0001, 0xafa: 0x0010, 0xafb: 0x0010, + 0xafc: 0x0001, 0xafd: 0x0001, 0xafe: 0x0001, 0xaff: 0x0001, + // Block 0x2c, offset 0xb00 + 0xb00: 0x0001, 0xb01: 0x0001, 0xb02: 0x0001, 0xb03: 0x0001, 0xb04: 0x0001, 0xb05: 0x0010, + 0xb06: 0x0001, 0xb07: 0x0001, 0xb08: 0x0001, 0xb09: 0x0010, 0xb0a: 0x0001, 0xb0b: 0x0001, + 0xb0c: 0x0001, 0xb0d: 0x0001, 0xb0e: 0x0010, 0xb0f: 0x0010, 0xb10: 0x0010, 0xb11: 0x0010, + 0xb12: 0x0010, 0xb13: 0x0010, 0xb14: 0x0010, 0xb15: 0x0001, 0xb16: 0x0001, 0xb17: 0x0010, + 0xb18: 0x0010, 0xb19: 0x0010, 0xb1a: 0x0010, 0xb1b: 0x0010, 0xb1c: 0x0010, 0xb1d: 0x0010, + 0xb1e: 0x0001, 0xb1f: 0x0010, 0xb20: 0x0001, 0xb21: 0x0001, 0xb22: 0x0001, 0xb23: 0x0001, + 0xb24: 0x0010, 0xb25: 0x0010, 0xb26: 0x0001, 0xb27: 0x0001, 0xb28: 0x0001, 0xb29: 0x0001, + 0xb2a: 0x0001, 0xb2b: 0x0001, 0xb2c: 0x0001, 0xb2d: 0x0001, 0xb2e: 0x0001, 0xb2f: 0x0001, + 0xb30: 0x0010, 0xb31: 0x0001, 0xb32: 0x0001, 0xb33: 0x0010, 0xb34: 0x0010, 0xb35: 0x0010, + 0xb36: 0x0010, 0xb37: 0x0010, 0xb38: 0x0010, 0xb39: 0x0010, 0xb3a: 0x0010, 0xb3b: 0x0010, + 0xb3c: 0x0010, 0xb3d: 0x0010, 0xb3e: 0x0010, 0xb3f: 0x0010, + // Block 0x2d, offset 0xb40 + 0xb40: 0x0010, 0xb41: 0x0001, 0xb42: 0x0001, 0xb43: 0x0001, 0xb44: 0x0010, 0xb45: 0x0001, + 0xb46: 0x0001, 0xb47: 0x0001, 0xb48: 0x0001, 0xb49: 0x0001, 0xb4a: 0x0001, 0xb4b: 0x0001, + 0xb4c: 0x0001, 0xb4d: 0x0010, 0xb4e: 0x0001, 0xb4f: 0x0001, 0xb50: 0x0001, 0xb51: 0x0010, + 0xb52: 0x0001, 0xb53: 0x0001, 0xb54: 0x0001, 0xb55: 0x0001, 0xb56: 0x0001, 0xb57: 0x0001, + 0xb58: 0x0001, 0xb59: 0x0001, 0xb5a: 0x0001, 0xb5b: 0x0001, 0xb5c: 0x0001, 0xb5d: 0x0001, + 0xb5e: 0x0001, 0xb5f: 0x0001, 0xb60: 0x0001, 0xb61: 0x0001, 0xb62: 0x0001, 0xb63: 0x0001, + 0xb64: 0x0001, 0xb65: 0x0001, 0xb66: 0x0001, 0xb67: 0x0001, 0xb68: 0x0001, 0xb69: 0x0001, + 0xb6a: 0x0001, 0xb6b: 0x0001, 0xb6c: 0x0001, 0xb6d: 0x0001, 0xb6e: 0x0001, 0xb6f: 0x0001, + 0xb70: 0x0001, 0xb71: 0x0001, 0xb72: 0x0001, 0xb73: 0x0001, 0xb74: 0x0001, 0xb75: 0x0001, + 0xb76: 0x0001, 0xb77: 0x0001, 0xb78: 0x0001, 0xb79: 0x0001, 0xb7a: 0x0001, 0xb7b: 0x0010, + 0xb7c: 0x0010, 0xb7d: 0x0001, 0xb7e: 0x0001, 0xb7f: 0x0001, + // Block 0x2e, offset 0xb80 + 0xb80: 0x0001, 0xb81: 0x0001, 0xb82: 0x0001, 0xb83: 0x0001, 0xb84: 0x0001, 0xb85: 0x0010, + 0xb86: 0x0001, 0xb87: 0x0001, 0xb88: 0x0001, 0xb89: 0x0010, 0xb8a: 0x0001, 0xb8b: 0x0001, + 0xb8c: 0x0001, 0xb8d: 0x0001, 0xb8e: 0x0001, 0xb8f: 0x0010, 0xb90: 0x0010, 0xb91: 0x0010, + 0xb92: 0x0010, 0xb93: 0x0010, 0xb94: 0x0010, 0xb95: 0x0010, 0xb96: 0x0010, 0xb97: 0x0001, + 0xb98: 0x0010, 0xb99: 0x0010, 0xb9a: 0x0010, 0xb9b: 0x0010, 0xb9c: 0x0010, 0xb9d: 0x0010, + 0xb9e: 0x0010, 0xb9f: 0x0001, 0xba0: 0x0001, 0xba1: 0x0001, 0xba2: 0x0001, 0xba3: 0x0001, + 0xba4: 0x0010, 0xba5: 0x0010, 0xba6: 0x0001, 0xba7: 0x0001, 0xba8: 0x0001, 0xba9: 0x0001, + 0xbaa: 0x0001, 0xbab: 0x0001, 0xbac: 0x0001, 0xbad: 0x0001, 0xbae: 0x0001, 0xbaf: 0x0001, + 0xbb0: 0x0060, 0xbb1: 0x0060, 0xbb2: 0x0060, 0xbb3: 0x0060, 0xbb4: 0x0060, 0xbb5: 0x0060, + 0xbb6: 0x0010, 0xbb7: 0x0010, 0xbb8: 0x0010, 0xbb9: 0x0060, 0xbba: 0x0001, 0xbbb: 0x0001, + 0xbbc: 0x0001, 0xbbd: 0x0001, 0xbbe: 0x0001, 0xbbf: 0x0001, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x0010, 0xbc1: 0x0010, 0xbc2: 0x0001, 0xbc3: 0x0001, 0xbc4: 0x0010, 0xbc5: 0x0001, + 0xbc6: 0x0001, 0xbc7: 0x0001, 0xbc8: 0x0001, 0xbc9: 0x0001, 0xbca: 0x0001, 0xbcb: 0x0001, + 0xbcc: 0x0001, 0xbcd: 0x0001, 0xbce: 0x0001, 0xbcf: 0x0001, 0xbd0: 0x0001, 0xbd1: 0x0001, + 0xbd2: 0x0001, 0xbd3: 0x0001, 0xbd4: 0x0001, 0xbd5: 0x0001, 0xbd6: 0x0001, 0xbd7: 0x0010, + 0xbd8: 0x0010, 0xbd9: 0x0010, 0xbda: 0x0001, 0xbdb: 0x0001, 0xbdc: 0x0001, 0xbdd: 0x0001, + 0xbde: 0x0001, 0xbdf: 0x0001, 0xbe0: 0x0001, 0xbe1: 0x0001, 0xbe2: 0x0001, 0xbe3: 0x0001, + 0xbe4: 0x0001, 0xbe5: 0x0001, 0xbe6: 0x0001, 0xbe7: 0x0001, 0xbe8: 0x0001, 0xbe9: 0x0001, + 0xbea: 0x0001, 0xbeb: 0x0001, 0xbec: 0x0001, 0xbed: 0x0001, 0xbee: 0x0001, 0xbef: 0x0001, + 0xbf0: 0x0001, 0xbf1: 0x0001, 0xbf2: 0x0010, 0xbf3: 0x0001, 0xbf4: 0x0001, 0xbf5: 0x0001, + 0xbf6: 0x0001, 0xbf7: 0x0001, 0xbf8: 0x0001, 0xbf9: 0x0001, 0xbfa: 0x0001, 0xbfb: 0x0001, + 0xbfc: 0x0010, 0xbfd: 0x0001, 0xbfe: 0x0010, 0xbff: 0x0010, + // Block 0x30, offset 0xc00 + 0xc00: 0x0001, 0xc01: 0x0001, 0xc02: 0x0001, 0xc03: 0x0001, 0xc04: 0x0001, 0xc05: 0x0001, + 0xc06: 0x0001, 0xc07: 0x0010, 0xc08: 0x0010, 0xc09: 0x0010, 0xc0a: 0x0001, 0xc0b: 0x0010, + 0xc0c: 0x0010, 0xc0d: 0x0010, 0xc0e: 0x0010, 0xc0f: 0x0001, 0xc10: 0x0001, 0xc11: 0x0001, + 0xc12: 0x0001, 0xc13: 0x0001, 0xc14: 0x0001, 0xc15: 0x0010, 0xc16: 0x0001, 0xc17: 0x0010, + 0xc18: 0x0001, 0xc19: 0x0001, 0xc1a: 0x0001, 0xc1b: 0x0001, 0xc1c: 0x0001, 0xc1d: 0x0001, + 0xc1e: 0x0001, 0xc1f: 0x0001, 0xc20: 0x0010, 0xc21: 0x0010, 0xc22: 0x0010, 0xc23: 0x0010, + 0xc24: 0x0010, 0xc25: 0x0010, 0xc26: 0x0001, 0xc27: 0x0001, 0xc28: 0x0001, 0xc29: 0x0001, + 0xc2a: 0x0001, 0xc2b: 0x0001, 0xc2c: 0x0001, 0xc2d: 0x0001, 0xc2e: 0x0001, 0xc2f: 0x0001, + 0xc30: 0x0010, 0xc31: 0x0010, 0xc32: 0x0001, 0xc33: 0x0001, 0xc34: 0x0060, 0xc35: 0x0010, + 0xc36: 0x0010, 0xc37: 0x0010, 0xc38: 0x0010, 0xc39: 0x0010, 0xc3a: 0x0010, 0xc3b: 0x0010, + 0xc3c: 0x0010, 0xc3d: 0x0010, 0xc3e: 0x0010, 0xc3f: 0x0010, + // Block 0x31, offset 0xc40 + 0xc40: 0x0010, 0xc41: 0x0001, 0xc42: 0x0001, 0xc43: 0x0001, 0xc44: 0x0001, 0xc45: 0x0001, + 0xc46: 0x0001, 0xc47: 0x0001, 0xc48: 0x0001, 0xc49: 0x0001, 0xc4a: 0x0001, 0xc4b: 0x0001, + 0xc4c: 0x0001, 0xc4d: 0x0001, 0xc4e: 0x0001, 0xc4f: 0x0001, 0xc50: 0x0001, 0xc51: 0x0001, + 0xc52: 0x0001, 0xc53: 0x0001, 0xc54: 0x0001, 0xc55: 0x0001, 0xc56: 0x0001, 0xc57: 0x0001, + 0xc58: 0x0001, 0xc59: 0x0001, 0xc5a: 0x0001, 0xc5b: 0x0001, 0xc5c: 0x0001, 0xc5d: 0x0001, + 0xc5e: 0x0001, 0xc5f: 0x0001, 0xc60: 0x0001, 0xc61: 0x0001, 0xc62: 0x0001, 0xc63: 0x0001, + 0xc64: 0x0001, 0xc65: 0x0001, 0xc66: 0x0001, 0xc67: 0x0001, 0xc68: 0x0001, 0xc69: 0x0001, + 0xc6a: 0x0001, 0xc6b: 0x0001, 0xc6c: 0x0001, 0xc6d: 0x0001, 0xc6e: 0x0001, 0xc6f: 0x0001, + 0xc70: 0x0001, 0xc71: 0x0001, 0xc72: 0x0001, 0xc73: 0x0060, 0xc74: 0x0001, 0xc75: 0x0001, + 0xc76: 0x0001, 0xc77: 0x0001, 0xc78: 0x0001, 0xc79: 0x0001, 0xc7a: 0x0001, 0xc7b: 0x0010, + 0xc7c: 0x0010, 0xc7d: 0x0010, 0xc7e: 0x0010, 0xc7f: 0x0060, + // Block 0x32, offset 0xc80 + 0xc80: 0x0001, 0xc81: 0x0001, 0xc82: 0x0001, 0xc83: 0x0001, 0xc84: 0x0001, 0xc85: 0x0001, + 0xc86: 0x0001, 0xc87: 0x0001, 0xc88: 0x0001, 0xc89: 0x0001, 0xc8a: 0x0001, 0xc8b: 0x0001, + 0xc8c: 0x0001, 0xc8d: 0x0001, 0xc8e: 0x0001, 0xc8f: 0x0060, 0xc90: 0x0001, 0xc91: 0x0001, + 0xc92: 0x0001, 0xc93: 0x0001, 0xc94: 0x0001, 0xc95: 0x0001, 0xc96: 0x0001, 0xc97: 0x0001, + 0xc98: 0x0001, 0xc99: 0x0001, 0xc9a: 0x0060, 0xc9b: 0x0060, 0xc9c: 0x0010, 0xc9d: 0x0010, + 0xc9e: 0x0010, 0xc9f: 0x0010, 0xca0: 0x0010, 0xca1: 0x0010, 0xca2: 0x0010, 0xca3: 0x0010, + 0xca4: 0x0010, 0xca5: 0x0010, 0xca6: 0x0010, 0xca7: 0x0010, 0xca8: 0x0010, 0xca9: 0x0010, + 0xcaa: 0x0010, 0xcab: 0x0010, 0xcac: 0x0010, 0xcad: 0x0010, 0xcae: 0x0010, 0xcaf: 0x0010, + 0xcb0: 0x0010, 0xcb1: 0x0010, 0xcb2: 0x0010, 0xcb3: 0x0010, 0xcb4: 0x0010, 0xcb5: 0x0010, + 0xcb6: 0x0010, 0xcb7: 0x0010, 0xcb8: 0x0010, 0xcb9: 0x0010, 0xcba: 0x0010, 0xcbb: 0x0010, + 0xcbc: 0x0010, 0xcbd: 0x0010, 0xcbe: 0x0010, 0xcbf: 0x0010, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x0010, 0xcc1: 0x0001, 0xcc2: 0x0001, 0xcc3: 0x0010, 0xcc4: 0x0001, 0xcc5: 0x0010, + 0xcc6: 0x0010, 0xcc7: 0x0001, 0xcc8: 0x0001, 0xcc9: 0x0010, 0xcca: 0x0001, 0xccb: 0x0010, + 0xccc: 0x0010, 0xccd: 0x0001, 0xcce: 0x0010, 0xccf: 0x0010, 0xcd0: 0x0010, 0xcd1: 0x0010, + 0xcd2: 0x0010, 0xcd3: 0x0010, 0xcd4: 0x0001, 0xcd5: 0x0001, 0xcd6: 0x0001, 0xcd7: 0x0001, + 0xcd8: 0x0010, 0xcd9: 0x0001, 0xcda: 0x0001, 0xcdb: 0x0001, 0xcdc: 0x0001, 0xcdd: 0x0001, + 0xcde: 0x0001, 0xcdf: 0x0001, 0xce0: 0x0010, 0xce1: 0x0001, 0xce2: 0x0001, 0xce3: 0x0001, + 0xce4: 0x0010, 0xce5: 0x0001, 0xce6: 0x0010, 0xce7: 0x0001, 0xce8: 0x0010, 0xce9: 0x0010, + 0xcea: 0x0001, 0xceb: 0x0001, 0xcec: 0x0010, 0xced: 0x0001, 0xcee: 0x0001, 0xcef: 0x0001, + 0xcf0: 0x0001, 0xcf1: 0x0001, 0xcf2: 0x0001, 0xcf3: 0x0060, 0xcf4: 0x0001, 0xcf5: 0x0001, + 0xcf6: 0x0001, 0xcf7: 0x0001, 0xcf8: 0x0001, 0xcf9: 0x0001, 0xcfa: 0x0010, 0xcfb: 0x0001, + 0xcfc: 0x0001, 0xcfd: 0x0001, 0xcfe: 0x0010, 0xcff: 0x0010, + // Block 0x34, offset 0xd00 + 0xd00: 0x0001, 0xd01: 0x0001, 0xd02: 0x0001, 0xd03: 0x0001, 0xd04: 0x0001, 0xd05: 0x0010, + 0xd06: 0x0001, 0xd07: 0x0010, 0xd08: 0x0001, 0xd09: 0x0001, 0xd0a: 0x0001, 0xd0b: 0x0001, + 0xd0c: 0x0001, 0xd0d: 0x0001, 0xd0e: 0x0010, 0xd0f: 0x0010, 0xd10: 0x0001, 0xd11: 0x0001, + 0xd12: 0x0001, 0xd13: 0x0001, 0xd14: 0x0001, 0xd15: 0x0001, 0xd16: 0x0001, 0xd17: 0x0001, + 0xd18: 0x0001, 0xd19: 0x0001, 0xd1a: 0x0010, 0xd1b: 0x0010, 0xd1c: 0x0060, 0xd1d: 0x0060, + 0xd1e: 0x0001, 0xd1f: 0x0001, 0xd20: 0x0010, 0xd21: 0x0010, 0xd22: 0x0010, 0xd23: 0x0010, + 0xd24: 0x0010, 0xd25: 0x0010, 0xd26: 0x0010, 0xd27: 0x0010, 0xd28: 0x0010, 0xd29: 0x0010, + 0xd2a: 0x0010, 0xd2b: 0x0010, 0xd2c: 0x0010, 0xd2d: 0x0010, 0xd2e: 0x0010, 0xd2f: 0x0010, + 0xd30: 0x0010, 0xd31: 0x0010, 0xd32: 0x0010, 0xd33: 0x0010, 0xd34: 0x0010, 0xd35: 0x0010, + 0xd36: 0x0010, 0xd37: 0x0010, 0xd38: 0x0010, 0xd39: 0x0010, 0xd3a: 0x0010, 0xd3b: 0x0010, + 0xd3c: 0x0010, 0xd3d: 0x0010, 0xd3e: 0x0010, 0xd3f: 0x0010, + // Block 0x35, offset 0xd40 + 0xd40: 0x0001, 0xd41: 0x0060, 0xd42: 0x0060, 0xd43: 0x0060, 0xd44: 0x0060, 0xd45: 0x0060, + 0xd46: 0x0060, 0xd47: 0x0060, 0xd48: 0x0060, 0xd49: 0x0060, 0xd4a: 0x0060, 0xd4b: 0x0001, + 0xd4c: 0x0060, 0xd4d: 0x0060, 0xd4e: 0x0060, 0xd4f: 0x0060, 0xd50: 0x0060, 0xd51: 0x0060, + 0xd52: 0x0060, 0xd53: 0x0060, 0xd54: 0x0060, 0xd55: 0x0060, 0xd56: 0x0060, 0xd57: 0x0060, + 0xd58: 0x0001, 0xd59: 0x0001, 0xd5a: 0x0060, 0xd5b: 0x0060, 0xd5c: 0x0060, 0xd5d: 0x0060, + 0xd5e: 0x0060, 0xd5f: 0x0060, 0xd60: 0x0001, 0xd61: 0x0001, 0xd62: 0x0001, 0xd63: 0x0001, + 0xd64: 0x0001, 0xd65: 0x0001, 0xd66: 0x0001, 0xd67: 0x0001, 0xd68: 0x0001, 0xd69: 0x0001, + 0xd6a: 0x0060, 0xd6b: 0x0060, 0xd6c: 0x0060, 0xd6d: 0x0060, 0xd6e: 0x0060, 0xd6f: 0x0060, + 0xd70: 0x0060, 0xd71: 0x0060, 0xd72: 0x0060, 0xd73: 0x0060, 0xd74: 0x0060, 0xd75: 0x0001, + 0xd76: 0x0060, 0xd77: 0x0001, 0xd78: 0x0060, 0xd79: 0x0001, 0xd7a: 0x0060, 0xd7b: 0x0060, + 0xd7c: 0x0060, 0xd7d: 0x0060, 0xd7e: 0x0001, 0xd7f: 0x0001, + // Block 0x36, offset 0xd80 + 0xd80: 0x0001, 0xd81: 0x0001, 0xd82: 0x0001, 0xd83: 0x0060, 0xd84: 0x0001, 0xd85: 0x0001, + 0xd86: 0x0001, 0xd87: 0x0001, 0xd88: 0x0010, 0xd89: 0x0001, 0xd8a: 0x0001, 0xd8b: 0x0001, + 0xd8c: 0x0001, 0xd8d: 0x0060, 0xd8e: 0x0001, 0xd8f: 0x0001, 0xd90: 0x0001, 0xd91: 0x0001, + 0xd92: 0x0060, 0xd93: 0x0001, 0xd94: 0x0001, 0xd95: 0x0001, 0xd96: 0x0001, 0xd97: 0x0060, + 0xd98: 0x0001, 0xd99: 0x0001, 0xd9a: 0x0001, 0xd9b: 0x0001, 0xd9c: 0x0060, 0xd9d: 0x0001, + 0xd9e: 0x0001, 0xd9f: 0x0001, 0xda0: 0x0001, 0xda1: 0x0001, 0xda2: 0x0001, 0xda3: 0x0001, + 0xda4: 0x0001, 0xda5: 0x0001, 0xda6: 0x0001, 0xda7: 0x0001, 0xda8: 0x0001, 0xda9: 0x0060, + 0xdaa: 0x0001, 0xdab: 0x0001, 0xdac: 0x0001, 0xdad: 0x0010, 0xdae: 0x0010, 0xdaf: 0x0010, + 0xdb0: 0x0010, 0xdb1: 0x0001, 0xdb2: 0x0001, 0xdb3: 0x0060, 0xdb4: 0x0001, 0xdb5: 0x0060, + 0xdb6: 0x0060, 0xdb7: 0x0060, 0xdb8: 0x0060, 0xdb9: 0x0060, 0xdba: 0x0001, 0xdbb: 0x0001, + 0xdbc: 0x0001, 0xdbd: 0x0001, 0xdbe: 0x0001, 0xdbf: 0x0001, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x0001, 0xdc1: 0x0060, 0xdc2: 0x0001, 0xdc3: 0x0001, 0xdc4: 0x0001, 0xdc5: 0x0060, + 0xdc6: 0x0001, 0xdc7: 0x0001, 0xdc8: 0x0001, 0xdc9: 0x0001, 0xdca: 0x0001, 0xdcb: 0x0001, + 0xdcc: 0x0001, 0xdcd: 0x0001, 0xdce: 0x0001, 0xdcf: 0x0001, 0xdd0: 0x0001, 0xdd1: 0x0001, + 0xdd2: 0x0001, 0xdd3: 0x0060, 0xdd4: 0x0001, 0xdd5: 0x0001, 0xdd6: 0x0001, 0xdd7: 0x0001, + 0xdd8: 0x0010, 0xdd9: 0x0001, 0xdda: 0x0001, 0xddb: 0x0001, 0xddc: 0x0001, 0xddd: 0x0060, + 0xdde: 0x0001, 0xddf: 0x0001, 0xde0: 0x0001, 0xde1: 0x0001, 0xde2: 0x0060, 0xde3: 0x0001, + 0xde4: 0x0001, 0xde5: 0x0001, 0xde6: 0x0001, 0xde7: 0x0060, 0xde8: 0x0001, 0xde9: 0x0001, + 0xdea: 0x0001, 0xdeb: 0x0001, 0xdec: 0x0060, 0xded: 0x0001, 0xdee: 0x0001, 0xdef: 0x0001, + 0xdf0: 0x0001, 0xdf1: 0x0001, 0xdf2: 0x0001, 0xdf3: 0x0001, 0xdf4: 0x0001, 0xdf5: 0x0001, + 0xdf6: 0x0001, 0xdf7: 0x0001, 0xdf8: 0x0001, 0xdf9: 0x0060, 0xdfa: 0x0001, 0xdfb: 0x0001, + 0xdfc: 0x0001, 0xdfd: 0x0010, 0xdfe: 0x0060, 0xdff: 0x0060, + // Block 0x38, offset 0xe00 + 0xe00: 0x0060, 0xe01: 0x0060, 0xe02: 0x0060, 0xe03: 0x0060, 0xe04: 0x0060, 0xe05: 0x0060, + 0xe06: 0x0001, 0xe07: 0x0060, 0xe08: 0x0060, 0xe09: 0x0060, 0xe0a: 0x0060, 0xe0b: 0x0060, + 0xe0c: 0x0060, 0xe0d: 0x0010, 0xe0e: 0x0060, 0xe0f: 0x0060, 0xe10: 0x0060, 0xe11: 0x0060, + 0xe12: 0x0060, 0xe13: 0x0060, 0xe14: 0x0060, 0xe15: 0x0060, 0xe16: 0x0060, 0xe17: 0x0060, + 0xe18: 0x0060, 0xe19: 0x0060, 0xe1a: 0x0060, 0xe1b: 0x0010, 0xe1c: 0x0010, 0xe1d: 0x0010, + 0xe1e: 0x0010, 0xe1f: 0x0010, 0xe20: 0x0010, 0xe21: 0x0010, 0xe22: 0x0010, 0xe23: 0x0010, + 0xe24: 0x0010, 0xe25: 0x0010, 0xe26: 0x0010, 0xe27: 0x0010, 0xe28: 0x0010, 0xe29: 0x0010, + 0xe2a: 0x0010, 0xe2b: 0x0010, 0xe2c: 0x0010, 0xe2d: 0x0010, 0xe2e: 0x0010, 0xe2f: 0x0010, + 0xe30: 0x0010, 0xe31: 0x0010, 0xe32: 0x0010, 0xe33: 0x0010, 0xe34: 0x0010, 0xe35: 0x0010, + 0xe36: 0x0010, 0xe37: 0x0010, 0xe38: 0x0010, 0xe39: 0x0010, 0xe3a: 0x0010, 0xe3b: 0x0010, + 0xe3c: 0x0010, 0xe3d: 0x0010, 0xe3e: 0x0010, 0xe3f: 0x0010, + // Block 0x39, offset 0xe40 + 0xe40: 0x0001, 0xe41: 0x0001, 0xe42: 0x0001, 0xe43: 0x0001, 0xe44: 0x0001, 0xe45: 0x0001, + 0xe46: 0x0001, 0xe47: 0x0001, 0xe48: 0x0001, 0xe49: 0x0001, 0xe4a: 0x0060, 0xe4b: 0x0060, + 0xe4c: 0x0060, 0xe4d: 0x0060, 0xe4e: 0x0060, 0xe4f: 0x0060, 0xe50: 0x0001, 0xe51: 0x0001, + 0xe52: 0x0001, 0xe53: 0x0001, 0xe54: 0x0001, 0xe55: 0x0001, 0xe56: 0x0001, 0xe57: 0x0001, + 0xe58: 0x0001, 0xe59: 0x0001, 0xe5a: 0x0001, 0xe5b: 0x0001, 0xe5c: 0x0001, 0xe5d: 0x0001, + 0xe5e: 0x0001, 0xe5f: 0x0001, 0xe60: 0x0001, 0xe61: 0x0001, 0xe62: 0x0001, 0xe63: 0x0001, + 0xe64: 0x0001, 0xe65: 0x0001, 0xe66: 0x0001, 0xe67: 0x0001, 0xe68: 0x0001, 0xe69: 0x0001, + 0xe6a: 0x0001, 0xe6b: 0x0001, 0xe6c: 0x0001, 0xe6d: 0x0001, 0xe6e: 0x0001, 0xe6f: 0x0001, + 0xe70: 0x0001, 0xe71: 0x0001, 0xe72: 0x0001, 0xe73: 0x0001, 0xe74: 0x0001, 0xe75: 0x0001, + 0xe76: 0x0001, 0xe77: 0x0001, 0xe78: 0x0001, 0xe79: 0x0001, 0xe7a: 0x0001, 0xe7b: 0x0001, + 0xe7c: 0x0001, 0xe7d: 0x0001, 0xe7e: 0x0001, 0xe7f: 0x0001, + // Block 0x3a, offset 0xe80 + 0xe80: 0x0001, 0xe81: 0x0001, 0xe82: 0x0001, 0xe83: 0x0001, 0xe84: 0x0001, 0xe85: 0x0001, + 0xe86: 0x0001, 0xe87: 0x0001, 0xe88: 0x0001, 0xe89: 0x0001, 0xe8a: 0x0001, 0xe8b: 0x0001, + 0xe8c: 0x0001, 0xe8d: 0x0001, 0xe8e: 0x0001, 0xe8f: 0x0001, 0xe90: 0x0001, 0xe91: 0x0001, + 0xe92: 0x0001, 0xe93: 0x0001, 0xe94: 0x0001, 0xe95: 0x0001, 0xe96: 0x0001, 0xe97: 0x0001, + 0xe98: 0x0001, 0xe99: 0x0001, 0xe9a: 0x0001, 0xe9b: 0x0001, 0xe9c: 0x0001, 0xe9d: 0x0001, + 0xe9e: 0x0060, 0xe9f: 0x0060, 0xea0: 0x0001, 0xea1: 0x0001, 0xea2: 0x0001, 0xea3: 0x0001, + 0xea4: 0x0001, 0xea5: 0x0001, 0xea6: 0x0001, 0xea7: 0x0001, 0xea8: 0x0001, 0xea9: 0x0001, + 0xeaa: 0x0001, 0xeab: 0x0001, 0xeac: 0x0001, 0xead: 0x0001, 0xeae: 0x0001, 0xeaf: 0x0001, + 0xeb0: 0x0001, 0xeb1: 0x0001, 0xeb2: 0x0001, 0xeb3: 0x0001, 0xeb4: 0x0001, 0xeb5: 0x0001, + 0xeb6: 0x0001, 0xeb7: 0x0001, 0xeb8: 0x0001, 0xeb9: 0x0001, 0xeba: 0x0001, 0xebb: 0x0001, + 0xebc: 0x0001, 0xebd: 0x0001, 0xebe: 0x0001, 0xebf: 0x0001, + // Block 0x3b, offset 0xec0 + 0xec0: 0x0001, 0xec1: 0x0001, 0xec2: 0x0001, 0xec3: 0x0001, 0xec4: 0x0001, 0xec5: 0x0001, + 0xec6: 0x0010, 0xec7: 0x0001, 0xec8: 0x0010, 0xec9: 0x0010, 0xeca: 0x0010, 0xecb: 0x0010, + 0xecc: 0x0010, 0xecd: 0x0001, 0xece: 0x0010, 0xecf: 0x0010, 0xed0: 0x0001, 0xed1: 0x0001, + 0xed2: 0x0001, 0xed3: 0x0001, 0xed4: 0x0001, 0xed5: 0x0001, 0xed6: 0x0001, 0xed7: 0x0001, + 0xed8: 0x0001, 0xed9: 0x0001, 0xeda: 0x0001, 0xedb: 0x0001, 0xedc: 0x0001, 0xedd: 0x0001, + 0xede: 0x0001, 0xedf: 0x0001, 0xee0: 0x0001, 0xee1: 0x0001, 0xee2: 0x0001, 0xee3: 0x0001, + 0xee4: 0x0001, 0xee5: 0x0001, 0xee6: 0x0001, 0xee7: 0x0001, 0xee8: 0x0001, 0xee9: 0x0001, + 0xeea: 0x0001, 0xeeb: 0x0001, 0xeec: 0x0001, 0xeed: 0x0001, 0xeee: 0x0001, 0xeef: 0x0001, + 0xef0: 0x0001, 0xef1: 0x0001, 0xef2: 0x0001, 0xef3: 0x0001, 0xef4: 0x0001, 0xef5: 0x0001, + 0xef6: 0x0001, 0xef7: 0x0001, 0xef8: 0x0001, 0xef9: 0x0001, 0xefa: 0x0001, 0xefb: 0x0060, + 0xefc: 0x0060, 0xefd: 0x0001, 0xefe: 0x0001, 0xeff: 0x0001, + // Block 0x3c, offset 0xf00 + 0xf00: 0x0001, 0xf01: 0x0001, 0xf02: 0x0001, 0xf03: 0x0001, 0xf04: 0x0001, 0xf05: 0x0001, + 0xf06: 0x0001, 0xf07: 0x0001, 0xf08: 0x0001, 0xf09: 0x0001, 0xf0a: 0x0001, 0xf0b: 0x0001, + 0xf0c: 0x0001, 0xf0d: 0x0001, 0xf0e: 0x0001, 0xf0f: 0x0001, 0xf10: 0x0001, 0xf11: 0x0001, + 0xf12: 0x0001, 0xf13: 0x0001, 0xf14: 0x0001, 0xf15: 0x0001, 0xf16: 0x0001, 0xf17: 0x0001, + 0xf18: 0x0001, 0xf19: 0x0001, 0xf1a: 0x0001, 0xf1b: 0x0001, 0xf1c: 0x0001, 0xf1d: 0x0001, + 0xf1e: 0x0001, 0xf1f: 0x0008, 0xf20: 0x0008, 0xf21: 0x0001, 0xf22: 0x0001, 0xf23: 0x0001, + 0xf24: 0x0001, 0xf25: 0x0001, 0xf26: 0x0001, 0xf27: 0x0001, 0xf28: 0x0001, 0xf29: 0x0001, + 0xf2a: 0x0001, 0xf2b: 0x0001, 0xf2c: 0x0001, 0xf2d: 0x0001, 0xf2e: 0x0001, 0xf2f: 0x0001, + 0xf30: 0x0001, 0xf31: 0x0001, 0xf32: 0x0001, 0xf33: 0x0001, 0xf34: 0x0001, 0xf35: 0x0001, + 0xf36: 0x0001, 0xf37: 0x0001, 0xf38: 0x0001, 0xf39: 0x0001, 0xf3a: 0x0001, 0xf3b: 0x0001, + 0xf3c: 0x0001, 0xf3d: 0x0001, 0xf3e: 0x0001, 0xf3f: 0x0001, + // Block 0x3d, offset 0xf40 + 0xf40: 0x0001, 0xf41: 0x0001, 0xf42: 0x0001, 0xf43: 0x0001, 0xf44: 0x0001, 0xf45: 0x0001, + 0xf46: 0x0001, 0xf47: 0x0001, 0xf48: 0x0001, 0xf49: 0x0010, 0xf4a: 0x0001, 0xf4b: 0x0001, + 0xf4c: 0x0001, 0xf4d: 0x0001, 0xf4e: 0x0010, 0xf4f: 0x0010, 0xf50: 0x0001, 0xf51: 0x0001, + 0xf52: 0x0001, 0xf53: 0x0001, 0xf54: 0x0001, 0xf55: 0x0001, 0xf56: 0x0001, 0xf57: 0x0010, + 0xf58: 0x0001, 0xf59: 0x0010, 0xf5a: 0x0001, 0xf5b: 0x0001, 0xf5c: 0x0001, 0xf5d: 0x0001, + 0xf5e: 0x0010, 0xf5f: 0x0010, 0xf60: 0x0001, 0xf61: 0x0001, 0xf62: 0x0001, 0xf63: 0x0001, + 0xf64: 0x0001, 0xf65: 0x0001, 0xf66: 0x0001, 0xf67: 0x0001, 0xf68: 0x0001, 0xf69: 0x0001, + 0xf6a: 0x0001, 0xf6b: 0x0001, 0xf6c: 0x0001, 0xf6d: 0x0001, 0xf6e: 0x0001, 0xf6f: 0x0001, + 0xf70: 0x0001, 0xf71: 0x0001, 0xf72: 0x0001, 0xf73: 0x0001, 0xf74: 0x0001, 0xf75: 0x0001, + 0xf76: 0x0001, 0xf77: 0x0001, 0xf78: 0x0001, 0xf79: 0x0001, 0xf7a: 0x0001, 0xf7b: 0x0001, + 0xf7c: 0x0001, 0xf7d: 0x0001, 0xf7e: 0x0001, 0xf7f: 0x0001, + // Block 0x3e, offset 0xf80 + 0xf80: 0x0001, 0xf81: 0x0001, 0xf82: 0x0001, 0xf83: 0x0001, 0xf84: 0x0001, 0xf85: 0x0001, + 0xf86: 0x0001, 0xf87: 0x0001, 0xf88: 0x0001, 0xf89: 0x0010, 0xf8a: 0x0001, 0xf8b: 0x0001, + 0xf8c: 0x0001, 0xf8d: 0x0001, 0xf8e: 0x0010, 0xf8f: 0x0010, 0xf90: 0x0001, 0xf91: 0x0001, + 0xf92: 0x0001, 0xf93: 0x0001, 0xf94: 0x0001, 0xf95: 0x0001, 0xf96: 0x0001, 0xf97: 0x0001, + 0xf98: 0x0001, 0xf99: 0x0001, 0xf9a: 0x0001, 0xf9b: 0x0001, 0xf9c: 0x0001, 0xf9d: 0x0001, + 0xf9e: 0x0001, 0xf9f: 0x0001, 0xfa0: 0x0001, 0xfa1: 0x0001, 0xfa2: 0x0001, 0xfa3: 0x0001, + 0xfa4: 0x0001, 0xfa5: 0x0001, 0xfa6: 0x0001, 0xfa7: 0x0001, 0xfa8: 0x0001, 0xfa9: 0x0001, + 0xfaa: 0x0001, 0xfab: 0x0001, 0xfac: 0x0001, 0xfad: 0x0001, 0xfae: 0x0001, 0xfaf: 0x0001, + 0xfb0: 0x0001, 0xfb1: 0x0010, 0xfb2: 0x0001, 0xfb3: 0x0001, 0xfb4: 0x0001, 0xfb5: 0x0001, + 0xfb6: 0x0010, 0xfb7: 0x0010, 0xfb8: 0x0001, 0xfb9: 0x0001, 0xfba: 0x0001, 0xfbb: 0x0001, + 0xfbc: 0x0001, 0xfbd: 0x0001, 0xfbe: 0x0001, 0xfbf: 0x0010, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x0001, 0xfc1: 0x0010, 0xfc2: 0x0001, 0xfc3: 0x0001, 0xfc4: 0x0001, 0xfc5: 0x0001, + 0xfc6: 0x0010, 0xfc7: 0x0010, 0xfc8: 0x0001, 0xfc9: 0x0001, 0xfca: 0x0001, 0xfcb: 0x0001, + 0xfcc: 0x0001, 0xfcd: 0x0001, 0xfce: 0x0001, 0xfcf: 0x0001, 0xfd0: 0x0001, 0xfd1: 0x0001, + 0xfd2: 0x0001, 0xfd3: 0x0001, 0xfd4: 0x0001, 0xfd5: 0x0001, 0xfd6: 0x0001, 0xfd7: 0x0010, + 0xfd8: 0x0001, 0xfd9: 0x0001, 0xfda: 0x0001, 0xfdb: 0x0001, 0xfdc: 0x0001, 0xfdd: 0x0001, + 0xfde: 0x0001, 0xfdf: 0x0001, 0xfe0: 0x0001, 0xfe1: 0x0001, 0xfe2: 0x0001, 0xfe3: 0x0001, + 0xfe4: 0x0001, 0xfe5: 0x0001, 0xfe6: 0x0001, 0xfe7: 0x0001, 0xfe8: 0x0001, 0xfe9: 0x0001, + 0xfea: 0x0001, 0xfeb: 0x0001, 0xfec: 0x0001, 0xfed: 0x0001, 0xfee: 0x0001, 0xfef: 0x0001, + 0xff0: 0x0001, 0xff1: 0x0001, 0xff2: 0x0001, 0xff3: 0x0001, 0xff4: 0x0001, 0xff5: 0x0001, + 0xff6: 0x0001, 0xff7: 0x0001, 0xff8: 0x0001, 0xff9: 0x0001, 0xffa: 0x0001, 0xffb: 0x0001, + 0xffc: 0x0001, 0xffd: 0x0001, 0xffe: 0x0001, 0xfff: 0x0001, + // Block 0x40, offset 0x1000 + 0x1000: 0x0001, 0x1001: 0x0001, 0x1002: 0x0001, 0x1003: 0x0001, 0x1004: 0x0001, 0x1005: 0x0001, + 0x1006: 0x0001, 0x1007: 0x0001, 0x1008: 0x0001, 0x1009: 0x0001, 0x100a: 0x0001, 0x100b: 0x0001, + 0x100c: 0x0001, 0x100d: 0x0001, 0x100e: 0x0001, 0x100f: 0x0001, 0x1010: 0x0001, 0x1011: 0x0010, + 0x1012: 0x0001, 0x1013: 0x0001, 0x1014: 0x0001, 0x1015: 0x0001, 0x1016: 0x0010, 0x1017: 0x0010, + 0x1018: 0x0001, 0x1019: 0x0001, 0x101a: 0x0001, 0x101b: 0x0001, 0x101c: 0x0001, 0x101d: 0x0001, + 0x101e: 0x0001, 0x101f: 0x0001, 0x1020: 0x0001, 0x1021: 0x0001, 0x1022: 0x0001, 0x1023: 0x0001, + 0x1024: 0x0001, 0x1025: 0x0001, 0x1026: 0x0001, 0x1027: 0x0001, 0x1028: 0x0001, 0x1029: 0x0001, + 0x102a: 0x0001, 0x102b: 0x0001, 0x102c: 0x0001, 0x102d: 0x0001, 0x102e: 0x0001, 0x102f: 0x0001, + 0x1030: 0x0001, 0x1031: 0x0001, 0x1032: 0x0001, 0x1033: 0x0001, 0x1034: 0x0001, 0x1035: 0x0001, + 0x1036: 0x0001, 0x1037: 0x0001, 0x1038: 0x0001, 0x1039: 0x0001, 0x103a: 0x0001, 0x103b: 0x0001, + 0x103c: 0x0001, 0x103d: 0x0001, 0x103e: 0x0001, 0x103f: 0x0001, + // Block 0x41, offset 0x1040 + 0x1040: 0x0001, 0x1041: 0x0001, 0x1042: 0x0001, 0x1043: 0x0001, 0x1044: 0x0001, 0x1045: 0x0001, + 0x1046: 0x0001, 0x1047: 0x0001, 0x1048: 0x0001, 0x1049: 0x0001, 0x104a: 0x0001, 0x104b: 0x0001, + 0x104c: 0x0001, 0x104d: 0x0001, 0x104e: 0x0001, 0x104f: 0x0001, 0x1050: 0x0001, 0x1051: 0x0001, + 0x1052: 0x0001, 0x1053: 0x0001, 0x1054: 0x0001, 0x1055: 0x0001, 0x1056: 0x0001, 0x1057: 0x0001, + 0x1058: 0x0001, 0x1059: 0x0001, 0x105a: 0x0001, 0x105b: 0x0010, 0x105c: 0x0010, 0x105d: 0x0001, + 0x105e: 0x0001, 0x105f: 0x0001, 0x1060: 0x0060, 0x1061: 0x0060, 0x1062: 0x0060, 0x1063: 0x0060, + 0x1064: 0x0060, 0x1065: 0x0060, 0x1066: 0x0060, 0x1067: 0x0060, 0x1068: 0x0060, 0x1069: 0x0060, + 0x106a: 0x0060, 0x106b: 0x0060, 0x106c: 0x0060, 0x106d: 0x0060, 0x106e: 0x0060, 0x106f: 0x0060, + 0x1070: 0x0060, 0x1071: 0x0060, 0x1072: 0x0060, 0x1073: 0x0060, 0x1074: 0x0060, 0x1075: 0x0060, + 0x1076: 0x0060, 0x1077: 0x0060, 0x1078: 0x0060, 0x1079: 0x0060, 0x107a: 0x0060, 0x107b: 0x0060, + 0x107c: 0x0060, 0x107d: 0x0010, 0x107e: 0x0010, 0x107f: 0x0010, + // Block 0x42, offset 0x1080 + 0x1080: 0x0001, 0x1081: 0x0001, 0x1082: 0x0001, 0x1083: 0x0001, 0x1084: 0x0001, 0x1085: 0x0001, + 0x1086: 0x0001, 0x1087: 0x0001, 0x1088: 0x0001, 0x1089: 0x0001, 0x108a: 0x0001, 0x108b: 0x0001, + 0x108c: 0x0001, 0x108d: 0x0001, 0x108e: 0x0001, 0x108f: 0x0001, 0x1090: 0x0060, 0x1091: 0x0060, + 0x1092: 0x0060, 0x1093: 0x0060, 0x1094: 0x0060, 0x1095: 0x0060, 0x1096: 0x0060, 0x1097: 0x0060, + 0x1098: 0x0060, 0x1099: 0x0060, 0x109a: 0x0010, 0x109b: 0x0010, 0x109c: 0x0010, 0x109d: 0x0010, + 0x109e: 0x0010, 0x109f: 0x0010, 0x10a0: 0x0001, 0x10a1: 0x0001, 0x10a2: 0x0001, 0x10a3: 0x0001, + 0x10a4: 0x0001, 0x10a5: 0x0001, 0x10a6: 0x0001, 0x10a7: 0x0001, 0x10a8: 0x0001, 0x10a9: 0x0001, + 0x10aa: 0x0001, 0x10ab: 0x0001, 0x10ac: 0x0001, 0x10ad: 0x0001, 0x10ae: 0x0001, 0x10af: 0x0001, + 0x10b0: 0x0001, 0x10b1: 0x0001, 0x10b2: 0x0001, 0x10b3: 0x0001, 0x10b4: 0x0001, 0x10b5: 0x0001, + 0x10b6: 0x0001, 0x10b7: 0x0001, 0x10b8: 0x0001, 0x10b9: 0x0001, 0x10ba: 0x0001, 0x10bb: 0x0001, + 0x10bc: 0x0001, 0x10bd: 0x0001, 0x10be: 0x0001, 0x10bf: 0x0001, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x0001, 0x10c1: 0x0001, 0x10c2: 0x0001, 0x10c3: 0x0001, 0x10c4: 0x0001, 0x10c5: 0x0001, + 0x10c6: 0x0001, 0x10c7: 0x0001, 0x10c8: 0x0001, 0x10c9: 0x0001, 0x10ca: 0x0001, 0x10cb: 0x0001, + 0x10cc: 0x0001, 0x10cd: 0x0001, 0x10ce: 0x0001, 0x10cf: 0x0001, 0x10d0: 0x0001, 0x10d1: 0x0001, + 0x10d2: 0x0001, 0x10d3: 0x0001, 0x10d4: 0x0001, 0x10d5: 0x0001, 0x10d6: 0x0001, 0x10d7: 0x0001, + 0x10d8: 0x0001, 0x10d9: 0x0001, 0x10da: 0x0001, 0x10db: 0x0001, 0x10dc: 0x0001, 0x10dd: 0x0001, + 0x10de: 0x0001, 0x10df: 0x0001, 0x10e0: 0x0001, 0x10e1: 0x0001, 0x10e2: 0x0001, 0x10e3: 0x0001, + 0x10e4: 0x0001, 0x10e5: 0x0001, 0x10e6: 0x0001, 0x10e7: 0x0001, 0x10e8: 0x0001, 0x10e9: 0x0001, + 0x10ea: 0x0001, 0x10eb: 0x0001, 0x10ec: 0x0001, 0x10ed: 0x0001, 0x10ee: 0x0001, 0x10ef: 0x0001, + 0x10f0: 0x0001, 0x10f1: 0x0001, 0x10f2: 0x0001, 0x10f3: 0x0001, 0x10f4: 0x0001, 0x10f5: 0x0001, + 0x10f6: 0x0010, 0x10f7: 0x0010, 0x10f8: 0x0001, 0x10f9: 0x0001, 0x10fa: 0x0001, 0x10fb: 0x0001, + 0x10fc: 0x0001, 0x10fd: 0x0001, 0x10fe: 0x0010, 0x10ff: 0x0010, + // Block 0x44, offset 0x1100 + 0x1100: 0x0060, 0x1101: 0x0001, 0x1102: 0x0001, 0x1103: 0x0001, 0x1104: 0x0001, 0x1105: 0x0001, + 0x1106: 0x0001, 0x1107: 0x0001, 0x1108: 0x0001, 0x1109: 0x0001, 0x110a: 0x0001, 0x110b: 0x0001, + 0x110c: 0x0001, 0x110d: 0x0001, 0x110e: 0x0001, 0x110f: 0x0001, 0x1110: 0x0001, 0x1111: 0x0001, + 0x1112: 0x0001, 0x1113: 0x0001, 0x1114: 0x0001, 0x1115: 0x0001, 0x1116: 0x0001, 0x1117: 0x0001, + 0x1118: 0x0001, 0x1119: 0x0001, 0x111a: 0x0001, 0x111b: 0x0001, 0x111c: 0x0001, 0x111d: 0x0001, + 0x111e: 0x0001, 0x111f: 0x0001, 0x1120: 0x0001, 0x1121: 0x0001, 0x1122: 0x0001, 0x1123: 0x0001, + 0x1124: 0x0001, 0x1125: 0x0001, 0x1126: 0x0001, 0x1127: 0x0001, 0x1128: 0x0001, 0x1129: 0x0001, + 0x112a: 0x0001, 0x112b: 0x0001, 0x112c: 0x0001, 0x112d: 0x0001, 0x112e: 0x0001, 0x112f: 0x0001, + 0x1130: 0x0001, 0x1131: 0x0001, 0x1132: 0x0001, 0x1133: 0x0001, 0x1134: 0x0001, 0x1135: 0x0001, + 0x1136: 0x0001, 0x1137: 0x0001, 0x1138: 0x0001, 0x1139: 0x0001, 0x113a: 0x0001, 0x113b: 0x0001, + 0x113c: 0x0001, 0x113d: 0x0001, 0x113e: 0x0001, 0x113f: 0x0001, + // Block 0x45, offset 0x1140 + 0x1140: 0x0001, 0x1141: 0x0001, 0x1142: 0x0001, 0x1143: 0x0001, 0x1144: 0x0001, 0x1145: 0x0001, + 0x1146: 0x0001, 0x1147: 0x0001, 0x1148: 0x0001, 0x1149: 0x0001, 0x114a: 0x0001, 0x114b: 0x0001, + 0x114c: 0x0001, 0x114d: 0x0001, 0x114e: 0x0001, 0x114f: 0x0001, 0x1150: 0x0001, 0x1151: 0x0001, + 0x1152: 0x0001, 0x1153: 0x0001, 0x1154: 0x0001, 0x1155: 0x0001, 0x1156: 0x0001, 0x1157: 0x0001, + 0x1158: 0x0001, 0x1159: 0x0001, 0x115a: 0x0001, 0x115b: 0x0001, 0x115c: 0x0001, 0x115d: 0x0001, + 0x115e: 0x0001, 0x115f: 0x0001, 0x1160: 0x0001, 0x1161: 0x0001, 0x1162: 0x0001, 0x1163: 0x0001, + 0x1164: 0x0001, 0x1165: 0x0001, 0x1166: 0x0001, 0x1167: 0x0001, 0x1168: 0x0001, 0x1169: 0x0001, + 0x116a: 0x0001, 0x116b: 0x0001, 0x116c: 0x0001, 0x116d: 0x0060, 0x116e: 0x0060, 0x116f: 0x0001, + 0x1170: 0x0001, 0x1171: 0x0001, 0x1172: 0x0001, 0x1173: 0x0001, 0x1174: 0x0001, 0x1175: 0x0001, + 0x1176: 0x0001, 0x1177: 0x0001, 0x1178: 0x0001, 0x1179: 0x0001, 0x117a: 0x0001, 0x117b: 0x0001, + 0x117c: 0x0001, 0x117d: 0x0001, 0x117e: 0x0001, 0x117f: 0x0001, + // Block 0x46, offset 0x1180 + 0x1180: 0x0060, 0x1181: 0x0001, 0x1182: 0x0001, 0x1183: 0x0001, 0x1184: 0x0001, 0x1185: 0x0001, + 0x1186: 0x0001, 0x1187: 0x0001, 0x1188: 0x0001, 0x1189: 0x0001, 0x118a: 0x0001, 0x118b: 0x0001, + 0x118c: 0x0001, 0x118d: 0x0001, 0x118e: 0x0001, 0x118f: 0x0001, 0x1190: 0x0001, 0x1191: 0x0001, + 0x1192: 0x0001, 0x1193: 0x0001, 0x1194: 0x0001, 0x1195: 0x0001, 0x1196: 0x0001, 0x1197: 0x0001, + 0x1198: 0x0001, 0x1199: 0x0001, 0x119a: 0x0001, 0x119b: 0x0060, 0x119c: 0x0060, 0x119d: 0x0010, + 0x119e: 0x0010, 0x119f: 0x0010, 0x11a0: 0x0001, 0x11a1: 0x0001, 0x11a2: 0x0001, 0x11a3: 0x0001, + 0x11a4: 0x0001, 0x11a5: 0x0001, 0x11a6: 0x0001, 0x11a7: 0x0001, 0x11a8: 0x0001, 0x11a9: 0x0001, + 0x11aa: 0x0001, 0x11ab: 0x0001, 0x11ac: 0x0001, 0x11ad: 0x0001, 0x11ae: 0x0001, 0x11af: 0x0001, + 0x11b0: 0x0001, 0x11b1: 0x0001, 0x11b2: 0x0001, 0x11b3: 0x0001, 0x11b4: 0x0001, 0x11b5: 0x0001, + 0x11b6: 0x0001, 0x11b7: 0x0001, 0x11b8: 0x0001, 0x11b9: 0x0001, 0x11ba: 0x0001, 0x11bb: 0x0001, + 0x11bc: 0x0001, 0x11bd: 0x0001, 0x11be: 0x0001, 0x11bf: 0x0001, + // Block 0x47, offset 0x11c0 + 0x11c0: 0x0001, 0x11c1: 0x0001, 0x11c2: 0x0001, 0x11c3: 0x0001, 0x11c4: 0x0001, 0x11c5: 0x0001, + 0x11c6: 0x0001, 0x11c7: 0x0001, 0x11c8: 0x0001, 0x11c9: 0x0001, 0x11ca: 0x0001, 0x11cb: 0x0001, + 0x11cc: 0x0001, 0x11cd: 0x0001, 0x11ce: 0x0001, 0x11cf: 0x0001, 0x11d0: 0x0001, 0x11d1: 0x0001, + 0x11d2: 0x0001, 0x11d3: 0x0001, 0x11d4: 0x0001, 0x11d5: 0x0001, 0x11d6: 0x0001, 0x11d7: 0x0001, + 0x11d8: 0x0001, 0x11d9: 0x0001, 0x11da: 0x0001, 0x11db: 0x0001, 0x11dc: 0x0001, 0x11dd: 0x0001, + 0x11de: 0x0001, 0x11df: 0x0001, 0x11e0: 0x0001, 0x11e1: 0x0001, 0x11e2: 0x0001, 0x11e3: 0x0001, + 0x11e4: 0x0001, 0x11e5: 0x0001, 0x11e6: 0x0001, 0x11e7: 0x0001, 0x11e8: 0x0001, 0x11e9: 0x0001, + 0x11ea: 0x0001, 0x11eb: 0x0060, 0x11ec: 0x0060, 0x11ed: 0x0060, 0x11ee: 0x0060, 0x11ef: 0x0060, + 0x11f0: 0x0060, 0x11f1: 0x0001, 0x11f2: 0x0001, 0x11f3: 0x0001, 0x11f4: 0x0001, 0x11f5: 0x0001, + 0x11f6: 0x0001, 0x11f7: 0x0001, 0x11f8: 0x0001, 0x11f9: 0x0010, 0x11fa: 0x0010, 0x11fb: 0x0010, + 0x11fc: 0x0010, 0x11fd: 0x0010, 0x11fe: 0x0010, 0x11ff: 0x0010, + // Block 0x48, offset 0x1200 + 0x1200: 0x0001, 0x1201: 0x0001, 0x1202: 0x0001, 0x1203: 0x0001, 0x1204: 0x0001, 0x1205: 0x0001, + 0x1206: 0x0001, 0x1207: 0x0001, 0x1208: 0x0001, 0x1209: 0x0001, 0x120a: 0x0001, 0x120b: 0x0001, + 0x120c: 0x0001, 0x120d: 0x0010, 0x120e: 0x0001, 0x120f: 0x0001, 0x1210: 0x0001, 0x1211: 0x0001, + 0x1212: 0x0001, 0x1213: 0x0001, 0x1214: 0x0001, 0x1215: 0x0010, 0x1216: 0x0010, 0x1217: 0x0010, + 0x1218: 0x0010, 0x1219: 0x0010, 0x121a: 0x0010, 0x121b: 0x0010, 0x121c: 0x0010, 0x121d: 0x0010, + 0x121e: 0x0010, 0x121f: 0x0010, 0x1220: 0x0001, 0x1221: 0x0001, 0x1222: 0x0001, 0x1223: 0x0001, + 0x1224: 0x0001, 0x1225: 0x0001, 0x1226: 0x0001, 0x1227: 0x0001, 0x1228: 0x0001, 0x1229: 0x0001, + 0x122a: 0x0001, 0x122b: 0x0001, 0x122c: 0x0001, 0x122d: 0x0001, 0x122e: 0x0001, 0x122f: 0x0001, + 0x1230: 0x0001, 0x1231: 0x0001, 0x1232: 0x0001, 0x1233: 0x0001, 0x1234: 0x0001, 0x1235: 0x0060, + 0x1236: 0x0060, 0x1237: 0x0010, 0x1238: 0x0010, 0x1239: 0x0010, 0x123a: 0x0010, 0x123b: 0x0010, + 0x123c: 0x0010, 0x123d: 0x0010, 0x123e: 0x0010, 0x123f: 0x0010, + // Block 0x49, offset 0x1240 + 0x1240: 0x0001, 0x1241: 0x0001, 0x1242: 0x0001, 0x1243: 0x0001, 0x1244: 0x0001, 0x1245: 0x0001, + 0x1246: 0x0001, 0x1247: 0x0001, 0x1248: 0x0001, 0x1249: 0x0001, 0x124a: 0x0001, 0x124b: 0x0001, + 0x124c: 0x0001, 0x124d: 0x0001, 0x124e: 0x0001, 0x124f: 0x0001, 0x1250: 0x0001, 0x1251: 0x0001, + 0x1252: 0x0001, 0x1253: 0x0001, 0x1254: 0x0010, 0x1255: 0x0010, 0x1256: 0x0010, 0x1257: 0x0010, + 0x1258: 0x0010, 0x1259: 0x0010, 0x125a: 0x0010, 0x125b: 0x0010, 0x125c: 0x0010, 0x125d: 0x0010, + 0x125e: 0x0010, 0x125f: 0x0010, 0x1260: 0x0001, 0x1261: 0x0001, 0x1262: 0x0001, 0x1263: 0x0001, + 0x1264: 0x0001, 0x1265: 0x0001, 0x1266: 0x0001, 0x1267: 0x0001, 0x1268: 0x0001, 0x1269: 0x0001, + 0x126a: 0x0001, 0x126b: 0x0001, 0x126c: 0x0001, 0x126d: 0x0010, 0x126e: 0x0001, 0x126f: 0x0001, + 0x1270: 0x0001, 0x1271: 0x0010, 0x1272: 0x0001, 0x1273: 0x0001, 0x1274: 0x0010, 0x1275: 0x0010, + 0x1276: 0x0010, 0x1277: 0x0010, 0x1278: 0x0010, 0x1279: 0x0010, 0x127a: 0x0010, 0x127b: 0x0010, + 0x127c: 0x0010, 0x127d: 0x0010, 0x127e: 0x0010, 0x127f: 0x0010, + // Block 0x4a, offset 0x1280 + 0x1280: 0x0001, 0x1281: 0x0001, 0x1282: 0x0001, 0x1283: 0x0001, 0x1284: 0x0001, 0x1285: 0x0001, + 0x1286: 0x0001, 0x1287: 0x0001, 0x1288: 0x0001, 0x1289: 0x0001, 0x128a: 0x0001, 0x128b: 0x0001, + 0x128c: 0x0001, 0x128d: 0x0001, 0x128e: 0x0001, 0x128f: 0x0001, 0x1290: 0x0001, 0x1291: 0x0001, + 0x1292: 0x0001, 0x1293: 0x0001, 0x1294: 0x0001, 0x1295: 0x0001, 0x1296: 0x0001, 0x1297: 0x0001, + 0x1298: 0x0001, 0x1299: 0x0001, 0x129a: 0x0001, 0x129b: 0x0001, 0x129c: 0x0001, 0x129d: 0x0001, + 0x129e: 0x0001, 0x129f: 0x0001, 0x12a0: 0x0001, 0x12a1: 0x0001, 0x12a2: 0x0001, 0x12a3: 0x0001, + 0x12a4: 0x0001, 0x12a5: 0x0001, 0x12a6: 0x0001, 0x12a7: 0x0001, 0x12a8: 0x0001, 0x12a9: 0x0001, + 0x12aa: 0x0001, 0x12ab: 0x0001, 0x12ac: 0x0001, 0x12ad: 0x0001, 0x12ae: 0x0001, 0x12af: 0x0001, + 0x12b0: 0x0001, 0x12b1: 0x0001, 0x12b2: 0x0001, 0x12b3: 0x0001, 0x12b4: 0x0008, 0x12b5: 0x0008, + 0x12b6: 0x0001, 0x12b7: 0x0001, 0x12b8: 0x0001, 0x12b9: 0x0001, 0x12ba: 0x0001, 0x12bb: 0x0001, + 0x12bc: 0x0001, 0x12bd: 0x0001, 0x12be: 0x0001, 0x12bf: 0x0001, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x0001, 0x12c1: 0x0001, 0x12c2: 0x0001, 0x12c3: 0x0001, 0x12c4: 0x0001, 0x12c5: 0x0001, + 0x12c6: 0x0001, 0x12c7: 0x0001, 0x12c8: 0x0001, 0x12c9: 0x0001, 0x12ca: 0x0001, 0x12cb: 0x0001, + 0x12cc: 0x0001, 0x12cd: 0x0001, 0x12ce: 0x0001, 0x12cf: 0x0001, 0x12d0: 0x0001, 0x12d1: 0x0001, + 0x12d2: 0x0001, 0x12d3: 0x0001, 0x12d4: 0x0060, 0x12d5: 0x0060, 0x12d6: 0x0060, 0x12d7: 0x0001, + 0x12d8: 0x0060, 0x12d9: 0x0060, 0x12da: 0x0060, 0x12db: 0x0060, 0x12dc: 0x0001, 0x12dd: 0x0001, + 0x12de: 0x0010, 0x12df: 0x0010, 0x12e0: 0x0001, 0x12e1: 0x0001, 0x12e2: 0x0001, 0x12e3: 0x0001, + 0x12e4: 0x0001, 0x12e5: 0x0001, 0x12e6: 0x0001, 0x12e7: 0x0001, 0x12e8: 0x0001, 0x12e9: 0x0001, + 0x12ea: 0x0010, 0x12eb: 0x0010, 0x12ec: 0x0010, 0x12ed: 0x0010, 0x12ee: 0x0010, 0x12ef: 0x0010, + 0x12f0: 0x0060, 0x12f1: 0x0060, 0x12f2: 0x0060, 0x12f3: 0x0060, 0x12f4: 0x0060, 0x12f5: 0x0060, + 0x12f6: 0x0060, 0x12f7: 0x0060, 0x12f8: 0x0060, 0x12f9: 0x0060, 0x12fa: 0x0010, 0x12fb: 0x0010, + 0x12fc: 0x0010, 0x12fd: 0x0010, 0x12fe: 0x0010, 0x12ff: 0x0010, + // Block 0x4c, offset 0x1300 + 0x1300: 0x0060, 0x1301: 0x0060, 0x1302: 0x0060, 0x1303: 0x0060, 0x1304: 0x0060, 0x1305: 0x0060, + 0x1306: 0x0060, 0x1307: 0x0060, 0x1308: 0x0060, 0x1309: 0x0060, 0x130a: 0x0060, 0x130b: 0x0008, + 0x130c: 0x0008, 0x130d: 0x0008, 0x130e: 0x0008, 0x130f: 0x0010, 0x1310: 0x0001, 0x1311: 0x0001, + 0x1312: 0x0001, 0x1313: 0x0001, 0x1314: 0x0001, 0x1315: 0x0001, 0x1316: 0x0001, 0x1317: 0x0001, + 0x1318: 0x0001, 0x1319: 0x0001, 0x131a: 0x0010, 0x131b: 0x0010, 0x131c: 0x0010, 0x131d: 0x0010, + 0x131e: 0x0010, 0x131f: 0x0010, 0x1320: 0x0001, 0x1321: 0x0001, 0x1322: 0x0001, 0x1323: 0x0001, + 0x1324: 0x0001, 0x1325: 0x0001, 0x1326: 0x0001, 0x1327: 0x0001, 0x1328: 0x0001, 0x1329: 0x0001, + 0x132a: 0x0001, 0x132b: 0x0001, 0x132c: 0x0001, 0x132d: 0x0001, 0x132e: 0x0001, 0x132f: 0x0001, + 0x1330: 0x0001, 0x1331: 0x0001, 0x1332: 0x0001, 0x1333: 0x0001, 0x1334: 0x0001, 0x1335: 0x0001, + 0x1336: 0x0001, 0x1337: 0x0001, 0x1338: 0x0001, 0x1339: 0x0001, 0x133a: 0x0001, 0x133b: 0x0001, + 0x133c: 0x0001, 0x133d: 0x0001, 0x133e: 0x0001, 0x133f: 0x0001, + // Block 0x4d, offset 0x1340 + 0x1340: 0x0001, 0x1341: 0x0001, 0x1342: 0x0001, 0x1343: 0x0001, 0x1344: 0x0001, 0x1345: 0x0001, + 0x1346: 0x0001, 0x1347: 0x0001, 0x1348: 0x0001, 0x1349: 0x0001, 0x134a: 0x0001, 0x134b: 0x0001, + 0x134c: 0x0001, 0x134d: 0x0001, 0x134e: 0x0001, 0x134f: 0x0001, 0x1350: 0x0001, 0x1351: 0x0001, + 0x1352: 0x0001, 0x1353: 0x0001, 0x1354: 0x0001, 0x1355: 0x0001, 0x1356: 0x0001, 0x1357: 0x0001, + 0x1358: 0x0001, 0x1359: 0x0001, 0x135a: 0x0001, 0x135b: 0x0001, 0x135c: 0x0001, 0x135d: 0x0001, + 0x135e: 0x0001, 0x135f: 0x0001, 0x1360: 0x0001, 0x1361: 0x0001, 0x1362: 0x0001, 0x1363: 0x0001, + 0x1364: 0x0001, 0x1365: 0x0001, 0x1366: 0x0001, 0x1367: 0x0001, 0x1368: 0x0001, 0x1369: 0x0001, + 0x136a: 0x0001, 0x136b: 0x0001, 0x136c: 0x0001, 0x136d: 0x0001, 0x136e: 0x0001, 0x136f: 0x0001, + 0x1370: 0x0001, 0x1371: 0x0001, 0x1372: 0x0001, 0x1373: 0x0001, 0x1374: 0x0001, 0x1375: 0x0001, + 0x1376: 0x0001, 0x1377: 0x0001, 0x1378: 0x0010, 0x1379: 0x0010, 0x137a: 0x0010, 0x137b: 0x0010, + 0x137c: 0x0010, 0x137d: 0x0010, 0x137e: 0x0010, 0x137f: 0x0010, + // Block 0x4e, offset 0x1380 + 0x1380: 0x0001, 0x1381: 0x0001, 0x1382: 0x0001, 0x1383: 0x0001, 0x1384: 0x0001, 0x1385: 0x0001, + 0x1386: 0x0001, 0x1387: 0x0001, 0x1388: 0x0001, 0x1389: 0x0001, 0x138a: 0x0001, 0x138b: 0x0001, + 0x138c: 0x0001, 0x138d: 0x0001, 0x138e: 0x0001, 0x138f: 0x0001, 0x1390: 0x0001, 0x1391: 0x0001, + 0x1392: 0x0001, 0x1393: 0x0001, 0x1394: 0x0001, 0x1395: 0x0001, 0x1396: 0x0001, 0x1397: 0x0001, + 0x1398: 0x0001, 0x1399: 0x0001, 0x139a: 0x0001, 0x139b: 0x0001, 0x139c: 0x0001, 0x139d: 0x0001, + 0x139e: 0x0001, 0x139f: 0x0001, 0x13a0: 0x0001, 0x13a1: 0x0001, 0x13a2: 0x0001, 0x13a3: 0x0001, + 0x13a4: 0x0001, 0x13a5: 0x0001, 0x13a6: 0x0001, 0x13a7: 0x0001, 0x13a8: 0x0001, 0x13a9: 0x0001, + 0x13aa: 0x0001, 0x13ab: 0x0010, 0x13ac: 0x0010, 0x13ad: 0x0010, 0x13ae: 0x0010, 0x13af: 0x0010, + 0x13b0: 0x0001, 0x13b1: 0x0001, 0x13b2: 0x0001, 0x13b3: 0x0001, 0x13b4: 0x0001, 0x13b5: 0x0001, + 0x13b6: 0x0001, 0x13b7: 0x0001, 0x13b8: 0x0001, 0x13b9: 0x0001, 0x13ba: 0x0001, 0x13bb: 0x0001, + 0x13bc: 0x0001, 0x13bd: 0x0001, 0x13be: 0x0001, 0x13bf: 0x0001, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x0001, 0x13c1: 0x0001, 0x13c2: 0x0001, 0x13c3: 0x0001, 0x13c4: 0x0001, 0x13c5: 0x0001, + 0x13c6: 0x0001, 0x13c7: 0x0001, 0x13c8: 0x0001, 0x13c9: 0x0001, 0x13ca: 0x0001, 0x13cb: 0x0001, + 0x13cc: 0x0001, 0x13cd: 0x0001, 0x13ce: 0x0001, 0x13cf: 0x0001, 0x13d0: 0x0001, 0x13d1: 0x0001, + 0x13d2: 0x0001, 0x13d3: 0x0001, 0x13d4: 0x0001, 0x13d5: 0x0001, 0x13d6: 0x0001, 0x13d7: 0x0001, + 0x13d8: 0x0001, 0x13d9: 0x0001, 0x13da: 0x0001, 0x13db: 0x0001, 0x13dc: 0x0001, 0x13dd: 0x0001, + 0x13de: 0x0001, 0x13df: 0x0001, 0x13e0: 0x0001, 0x13e1: 0x0001, 0x13e2: 0x0001, 0x13e3: 0x0001, + 0x13e4: 0x0001, 0x13e5: 0x0001, 0x13e6: 0x0001, 0x13e7: 0x0001, 0x13e8: 0x0001, 0x13e9: 0x0001, + 0x13ea: 0x0001, 0x13eb: 0x0001, 0x13ec: 0x0001, 0x13ed: 0x0001, 0x13ee: 0x0001, 0x13ef: 0x0001, + 0x13f0: 0x0001, 0x13f1: 0x0001, 0x13f2: 0x0001, 0x13f3: 0x0001, 0x13f4: 0x0001, 0x13f5: 0x0001, + 0x13f6: 0x0010, 0x13f7: 0x0010, 0x13f8: 0x0010, 0x13f9: 0x0010, 0x13fa: 0x0010, 0x13fb: 0x0010, + 0x13fc: 0x0010, 0x13fd: 0x0010, 0x13fe: 0x0010, 0x13ff: 0x0010, + // Block 0x50, offset 0x1400 + 0x1400: 0x0001, 0x1401: 0x0001, 0x1402: 0x0001, 0x1403: 0x0001, 0x1404: 0x0001, 0x1405: 0x0001, + 0x1406: 0x0001, 0x1407: 0x0001, 0x1408: 0x0001, 0x1409: 0x0001, 0x140a: 0x0001, 0x140b: 0x0001, + 0x140c: 0x0001, 0x140d: 0x0001, 0x140e: 0x0001, 0x140f: 0x0001, 0x1410: 0x0001, 0x1411: 0x0001, + 0x1412: 0x0001, 0x1413: 0x0001, 0x1414: 0x0001, 0x1415: 0x0001, 0x1416: 0x0001, 0x1417: 0x0001, + 0x1418: 0x0001, 0x1419: 0x0001, 0x141a: 0x0001, 0x141b: 0x0001, 0x141c: 0x0001, 0x141d: 0x0001, + 0x141e: 0x0001, 0x141f: 0x0010, 0x1420: 0x0001, 0x1421: 0x0001, 0x1422: 0x0001, 0x1423: 0x0001, + 0x1424: 0x0001, 0x1425: 0x0001, 0x1426: 0x0001, 0x1427: 0x0001, 0x1428: 0x0001, 0x1429: 0x0001, + 0x142a: 0x0001, 0x142b: 0x0001, 0x142c: 0x0010, 0x142d: 0x0010, 0x142e: 0x0010, 0x142f: 0x0010, + 0x1430: 0x0001, 0x1431: 0x0001, 0x1432: 0x0001, 0x1433: 0x0001, 0x1434: 0x0001, 0x1435: 0x0001, + 0x1436: 0x0001, 0x1437: 0x0001, 0x1438: 0x0001, 0x1439: 0x0001, 0x143a: 0x0001, 0x143b: 0x0001, + 0x143c: 0x0010, 0x143d: 0x0010, 0x143e: 0x0010, 0x143f: 0x0010, + // Block 0x51, offset 0x1440 + 0x1440: 0x0060, 0x1441: 0x0010, 0x1442: 0x0010, 0x1443: 0x0010, 0x1444: 0x0060, 0x1445: 0x0060, + 0x1446: 0x0001, 0x1447: 0x0001, 0x1448: 0x0001, 0x1449: 0x0001, 0x144a: 0x0001, 0x144b: 0x0001, + 0x144c: 0x0001, 0x144d: 0x0001, 0x144e: 0x0001, 0x144f: 0x0001, 0x1450: 0x0001, 0x1451: 0x0001, + 0x1452: 0x0001, 0x1453: 0x0001, 0x1454: 0x0001, 0x1455: 0x0001, 0x1456: 0x0001, 0x1457: 0x0001, + 0x1458: 0x0001, 0x1459: 0x0001, 0x145a: 0x0001, 0x145b: 0x0001, 0x145c: 0x0001, 0x145d: 0x0001, + 0x145e: 0x0001, 0x145f: 0x0001, 0x1460: 0x0001, 0x1461: 0x0001, 0x1462: 0x0001, 0x1463: 0x0001, + 0x1464: 0x0001, 0x1465: 0x0001, 0x1466: 0x0001, 0x1467: 0x0001, 0x1468: 0x0001, 0x1469: 0x0001, + 0x146a: 0x0001, 0x146b: 0x0001, 0x146c: 0x0001, 0x146d: 0x0001, 0x146e: 0x0010, 0x146f: 0x0010, + 0x1470: 0x0001, 0x1471: 0x0001, 0x1472: 0x0001, 0x1473: 0x0001, 0x1474: 0x0001, 0x1475: 0x0010, + 0x1476: 0x0010, 0x1477: 0x0010, 0x1478: 0x0010, 0x1479: 0x0010, 0x147a: 0x0010, 0x147b: 0x0010, + 0x147c: 0x0010, 0x147d: 0x0010, 0x147e: 0x0010, 0x147f: 0x0010, + // Block 0x52, offset 0x1480 + 0x1480: 0x0001, 0x1481: 0x0001, 0x1482: 0x0001, 0x1483: 0x0001, 0x1484: 0x0001, 0x1485: 0x0001, + 0x1486: 0x0001, 0x1487: 0x0001, 0x1488: 0x0001, 0x1489: 0x0001, 0x148a: 0x0001, 0x148b: 0x0001, + 0x148c: 0x0001, 0x148d: 0x0001, 0x148e: 0x0001, 0x148f: 0x0001, 0x1490: 0x0001, 0x1491: 0x0001, + 0x1492: 0x0001, 0x1493: 0x0001, 0x1494: 0x0001, 0x1495: 0x0001, 0x1496: 0x0001, 0x1497: 0x0001, + 0x1498: 0x0001, 0x1499: 0x0001, 0x149a: 0x0001, 0x149b: 0x0001, 0x149c: 0x0001, 0x149d: 0x0001, + 0x149e: 0x0001, 0x149f: 0x0001, 0x14a0: 0x0001, 0x14a1: 0x0001, 0x14a2: 0x0001, 0x14a3: 0x0001, + 0x14a4: 0x0001, 0x14a5: 0x0001, 0x14a6: 0x0001, 0x14a7: 0x0001, 0x14a8: 0x0001, 0x14a9: 0x0001, + 0x14aa: 0x0001, 0x14ab: 0x0001, 0x14ac: 0x0010, 0x14ad: 0x0010, 0x14ae: 0x0010, 0x14af: 0x0010, + 0x14b0: 0x0001, 0x14b1: 0x0001, 0x14b2: 0x0001, 0x14b3: 0x0001, 0x14b4: 0x0001, 0x14b5: 0x0001, + 0x14b6: 0x0001, 0x14b7: 0x0001, 0x14b8: 0x0001, 0x14b9: 0x0001, 0x14ba: 0x0001, 0x14bb: 0x0001, + 0x14bc: 0x0001, 0x14bd: 0x0001, 0x14be: 0x0001, 0x14bf: 0x0001, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x0001, 0x14c1: 0x0001, 0x14c2: 0x0001, 0x14c3: 0x0001, 0x14c4: 0x0001, 0x14c5: 0x0001, + 0x14c6: 0x0001, 0x14c7: 0x0001, 0x14c8: 0x0001, 0x14c9: 0x0001, 0x14ca: 0x0010, 0x14cb: 0x0010, + 0x14cc: 0x0010, 0x14cd: 0x0010, 0x14ce: 0x0010, 0x14cf: 0x0010, 0x14d0: 0x0001, 0x14d1: 0x0001, + 0x14d2: 0x0001, 0x14d3: 0x0001, 0x14d4: 0x0001, 0x14d5: 0x0001, 0x14d6: 0x0001, 0x14d7: 0x0001, + 0x14d8: 0x0001, 0x14d9: 0x0001, 0x14da: 0x0060, 0x14db: 0x0010, 0x14dc: 0x0010, 0x14dd: 0x0010, + 0x14de: 0x0060, 0x14df: 0x0060, 0x14e0: 0x0060, 0x14e1: 0x0060, 0x14e2: 0x0060, 0x14e3: 0x0060, + 0x14e4: 0x0060, 0x14e5: 0x0060, 0x14e6: 0x0060, 0x14e7: 0x0060, 0x14e8: 0x0060, 0x14e9: 0x0060, + 0x14ea: 0x0060, 0x14eb: 0x0060, 0x14ec: 0x0060, 0x14ed: 0x0060, 0x14ee: 0x0060, 0x14ef: 0x0060, + 0x14f0: 0x0060, 0x14f1: 0x0060, 0x14f2: 0x0060, 0x14f3: 0x0060, 0x14f4: 0x0060, 0x14f5: 0x0060, + 0x14f6: 0x0060, 0x14f7: 0x0060, 0x14f8: 0x0060, 0x14f9: 0x0060, 0x14fa: 0x0060, 0x14fb: 0x0060, + 0x14fc: 0x0060, 0x14fd: 0x0060, 0x14fe: 0x0060, 0x14ff: 0x0060, + // Block 0x54, offset 0x1500 + 0x1500: 0x0001, 0x1501: 0x0001, 0x1502: 0x0001, 0x1503: 0x0001, 0x1504: 0x0001, 0x1505: 0x0001, + 0x1506: 0x0001, 0x1507: 0x0001, 0x1508: 0x0001, 0x1509: 0x0001, 0x150a: 0x0001, 0x150b: 0x0001, + 0x150c: 0x0001, 0x150d: 0x0001, 0x150e: 0x0001, 0x150f: 0x0001, 0x1510: 0x0001, 0x1511: 0x0001, + 0x1512: 0x0001, 0x1513: 0x0001, 0x1514: 0x0001, 0x1515: 0x0001, 0x1516: 0x0001, 0x1517: 0x0001, + 0x1518: 0x0001, 0x1519: 0x0001, 0x151a: 0x0001, 0x151b: 0x0001, 0x151c: 0x0010, 0x151d: 0x0010, + 0x151e: 0x0060, 0x151f: 0x0060, 0x1520: 0x0001, 0x1521: 0x0001, 0x1522: 0x0001, 0x1523: 0x0001, + 0x1524: 0x0001, 0x1525: 0x0001, 0x1526: 0x0001, 0x1527: 0x0001, 0x1528: 0x0001, 0x1529: 0x0001, + 0x152a: 0x0001, 0x152b: 0x0001, 0x152c: 0x0001, 0x152d: 0x0001, 0x152e: 0x0001, 0x152f: 0x0001, + 0x1530: 0x0001, 0x1531: 0x0001, 0x1532: 0x0001, 0x1533: 0x0001, 0x1534: 0x0001, 0x1535: 0x0001, + 0x1536: 0x0001, 0x1537: 0x0001, 0x1538: 0x0001, 0x1539: 0x0001, 0x153a: 0x0001, 0x153b: 0x0001, + 0x153c: 0x0001, 0x153d: 0x0001, 0x153e: 0x0001, 0x153f: 0x0001, + // Block 0x55, offset 0x1540 + 0x1540: 0x0001, 0x1541: 0x0001, 0x1542: 0x0001, 0x1543: 0x0001, 0x1544: 0x0001, 0x1545: 0x0001, + 0x1546: 0x0001, 0x1547: 0x0001, 0x1548: 0x0001, 0x1549: 0x0001, 0x154a: 0x0001, 0x154b: 0x0001, + 0x154c: 0x0001, 0x154d: 0x0001, 0x154e: 0x0001, 0x154f: 0x0001, 0x1550: 0x0001, 0x1551: 0x0001, + 0x1552: 0x0001, 0x1553: 0x0001, 0x1554: 0x0001, 0x1555: 0x0001, 0x1556: 0x0001, 0x1557: 0x0001, + 0x1558: 0x0001, 0x1559: 0x0001, 0x155a: 0x0001, 0x155b: 0x0001, 0x155c: 0x0001, 0x155d: 0x0001, + 0x155e: 0x0001, 0x155f: 0x0010, 0x1560: 0x0001, 0x1561: 0x0001, 0x1562: 0x0001, 0x1563: 0x0001, + 0x1564: 0x0001, 0x1565: 0x0001, 0x1566: 0x0001, 0x1567: 0x0001, 0x1568: 0x0001, 0x1569: 0x0001, + 0x156a: 0x0001, 0x156b: 0x0001, 0x156c: 0x0001, 0x156d: 0x0001, 0x156e: 0x0001, 0x156f: 0x0001, + 0x1570: 0x0001, 0x1571: 0x0001, 0x1572: 0x0001, 0x1573: 0x0001, 0x1574: 0x0001, 0x1575: 0x0001, + 0x1576: 0x0001, 0x1577: 0x0001, 0x1578: 0x0001, 0x1579: 0x0001, 0x157a: 0x0001, 0x157b: 0x0001, + 0x157c: 0x0001, 0x157d: 0x0010, 0x157e: 0x0010, 0x157f: 0x0001, + // Block 0x56, offset 0x1580 + 0x1580: 0x0001, 0x1581: 0x0001, 0x1582: 0x0001, 0x1583: 0x0001, 0x1584: 0x0001, 0x1585: 0x0001, + 0x1586: 0x0001, 0x1587: 0x0001, 0x1588: 0x0001, 0x1589: 0x0001, 0x158a: 0x0010, 0x158b: 0x0010, + 0x158c: 0x0010, 0x158d: 0x0010, 0x158e: 0x0010, 0x158f: 0x0010, 0x1590: 0x0001, 0x1591: 0x0001, + 0x1592: 0x0001, 0x1593: 0x0001, 0x1594: 0x0001, 0x1595: 0x0001, 0x1596: 0x0001, 0x1597: 0x0001, + 0x1598: 0x0001, 0x1599: 0x0001, 0x159a: 0x0010, 0x159b: 0x0010, 0x159c: 0x0010, 0x159d: 0x0010, + 0x159e: 0x0010, 0x159f: 0x0010, 0x15a0: 0x0060, 0x15a1: 0x0060, 0x15a2: 0x0060, 0x15a3: 0x0060, + 0x15a4: 0x0060, 0x15a5: 0x0060, 0x15a6: 0x0060, 0x15a7: 0x0001, 0x15a8: 0x0060, 0x15a9: 0x0060, + 0x15aa: 0x0060, 0x15ab: 0x0060, 0x15ac: 0x0060, 0x15ad: 0x0060, 0x15ae: 0x0010, 0x15af: 0x0010, + 0x15b0: 0x0001, 0x15b1: 0x0001, 0x15b2: 0x0001, 0x15b3: 0x0001, 0x15b4: 0x0001, 0x15b5: 0x0001, + 0x15b6: 0x0001, 0x15b7: 0x0001, 0x15b8: 0x0001, 0x15b9: 0x0001, 0x15ba: 0x0001, 0x15bb: 0x0001, + 0x15bc: 0x0001, 0x15bd: 0x0001, 0x15be: 0x0060, 0x15bf: 0x0010, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x0010, 0x15c1: 0x0010, 0x15c2: 0x0010, 0x15c3: 0x0010, 0x15c4: 0x0010, 0x15c5: 0x0010, + 0x15c6: 0x0010, 0x15c7: 0x0010, 0x15c8: 0x0010, 0x15c9: 0x0010, 0x15ca: 0x0010, 0x15cb: 0x0010, + 0x15cc: 0x0010, 0x15cd: 0x0010, 0x15ce: 0x0010, 0x15cf: 0x0010, 0x15d0: 0x0010, 0x15d1: 0x0010, + 0x15d2: 0x0010, 0x15d3: 0x0010, 0x15d4: 0x0010, 0x15d5: 0x0010, 0x15d6: 0x0010, 0x15d7: 0x0010, + 0x15d8: 0x0010, 0x15d9: 0x0010, 0x15da: 0x0010, 0x15db: 0x0010, 0x15dc: 0x0010, 0x15dd: 0x0010, + 0x15de: 0x0010, 0x15df: 0x0010, 0x15e0: 0x0010, 0x15e1: 0x0010, 0x15e2: 0x0010, 0x15e3: 0x0010, + 0x15e4: 0x0010, 0x15e5: 0x0010, 0x15e6: 0x0010, 0x15e7: 0x0010, 0x15e8: 0x0010, 0x15e9: 0x0010, + 0x15ea: 0x0010, 0x15eb: 0x0010, 0x15ec: 0x0010, 0x15ed: 0x0010, 0x15ee: 0x0010, 0x15ef: 0x0010, + 0x15f0: 0x0010, 0x15f1: 0x0010, 0x15f2: 0x0010, 0x15f3: 0x0010, 0x15f4: 0x0010, 0x15f5: 0x0010, + 0x15f6: 0x0010, 0x15f7: 0x0010, 0x15f8: 0x0010, 0x15f9: 0x0010, 0x15fa: 0x0010, 0x15fb: 0x0010, + 0x15fc: 0x0010, 0x15fd: 0x0010, 0x15fe: 0x0010, 0x15ff: 0x0010, + // Block 0x58, offset 0x1600 + 0x1600: 0x0001, 0x1601: 0x0001, 0x1602: 0x0001, 0x1603: 0x0001, 0x1604: 0x0001, 0x1605: 0x0001, + 0x1606: 0x0001, 0x1607: 0x0001, 0x1608: 0x0001, 0x1609: 0x0001, 0x160a: 0x0001, 0x160b: 0x0001, + 0x160c: 0x0010, 0x160d: 0x0010, 0x160e: 0x0010, 0x160f: 0x0010, 0x1610: 0x0001, 0x1611: 0x0001, + 0x1612: 0x0001, 0x1613: 0x0001, 0x1614: 0x0001, 0x1615: 0x0001, 0x1616: 0x0001, 0x1617: 0x0001, + 0x1618: 0x0001, 0x1619: 0x0001, 0x161a: 0x0060, 0x161b: 0x0060, 0x161c: 0x0060, 0x161d: 0x0060, + 0x161e: 0x0060, 0x161f: 0x0060, 0x1620: 0x0060, 0x1621: 0x0060, 0x1622: 0x0060, 0x1623: 0x0060, + 0x1624: 0x0060, 0x1625: 0x0060, 0x1626: 0x0060, 0x1627: 0x0060, 0x1628: 0x0060, 0x1629: 0x0060, + 0x162a: 0x0060, 0x162b: 0x0001, 0x162c: 0x0001, 0x162d: 0x0001, 0x162e: 0x0001, 0x162f: 0x0001, + 0x1630: 0x0001, 0x1631: 0x0001, 0x1632: 0x0001, 0x1633: 0x0001, 0x1634: 0x0060, 0x1635: 0x0060, + 0x1636: 0x0060, 0x1637: 0x0060, 0x1638: 0x0060, 0x1639: 0x0060, 0x163a: 0x0060, 0x163b: 0x0060, + 0x163c: 0x0060, 0x163d: 0x0010, 0x163e: 0x0010, 0x163f: 0x0010, + // Block 0x59, offset 0x1640 + 0x1640: 0x0001, 0x1641: 0x0001, 0x1642: 0x0001, 0x1643: 0x0001, 0x1644: 0x0001, 0x1645: 0x0001, + 0x1646: 0x0001, 0x1647: 0x0001, 0x1648: 0x0001, 0x1649: 0x0001, 0x164a: 0x0001, 0x164b: 0x0001, + 0x164c: 0x0001, 0x164d: 0x0001, 0x164e: 0x0001, 0x164f: 0x0001, 0x1650: 0x0001, 0x1651: 0x0001, + 0x1652: 0x0001, 0x1653: 0x0001, 0x1654: 0x0001, 0x1655: 0x0001, 0x1656: 0x0001, 0x1657: 0x0001, + 0x1658: 0x0001, 0x1659: 0x0001, 0x165a: 0x0001, 0x165b: 0x0001, 0x165c: 0x0001, 0x165d: 0x0001, + 0x165e: 0x0001, 0x165f: 0x0001, 0x1660: 0x0001, 0x1661: 0x0001, 0x1662: 0x0001, 0x1663: 0x0001, + 0x1664: 0x0001, 0x1665: 0x0001, 0x1666: 0x0001, 0x1667: 0x0001, 0x1668: 0x0001, 0x1669: 0x0001, + 0x166a: 0x0001, 0x166b: 0x0001, 0x166c: 0x0001, 0x166d: 0x0001, 0x166e: 0x0001, 0x166f: 0x0001, + 0x1670: 0x0001, 0x1671: 0x0001, 0x1672: 0x0001, 0x1673: 0x0001, 0x1674: 0x0010, 0x1675: 0x0010, + 0x1676: 0x0010, 0x1677: 0x0010, 0x1678: 0x0010, 0x1679: 0x0010, 0x167a: 0x0010, 0x167b: 0x0010, + 0x167c: 0x0060, 0x167d: 0x0060, 0x167e: 0x0060, 0x167f: 0x0060, + // Block 0x5a, offset 0x1680 + 0x1680: 0x0001, 0x1681: 0x0001, 0x1682: 0x0001, 0x1683: 0x0001, 0x1684: 0x0001, 0x1685: 0x0001, + 0x1686: 0x0001, 0x1687: 0x0001, 0x1688: 0x0001, 0x1689: 0x0001, 0x168a: 0x0001, 0x168b: 0x0001, + 0x168c: 0x0001, 0x168d: 0x0001, 0x168e: 0x0001, 0x168f: 0x0001, 0x1690: 0x0001, 0x1691: 0x0001, + 0x1692: 0x0001, 0x1693: 0x0001, 0x1694: 0x0001, 0x1695: 0x0001, 0x1696: 0x0001, 0x1697: 0x0001, + 0x1698: 0x0001, 0x1699: 0x0001, 0x169a: 0x0001, 0x169b: 0x0001, 0x169c: 0x0001, 0x169d: 0x0001, + 0x169e: 0x0001, 0x169f: 0x0001, 0x16a0: 0x0001, 0x16a1: 0x0001, 0x16a2: 0x0001, 0x16a3: 0x0001, + 0x16a4: 0x0001, 0x16a5: 0x0001, 0x16a6: 0x0001, 0x16a7: 0x0001, 0x16a8: 0x0001, 0x16a9: 0x0001, + 0x16aa: 0x0001, 0x16ab: 0x0001, 0x16ac: 0x0001, 0x16ad: 0x0001, 0x16ae: 0x0001, 0x16af: 0x0001, + 0x16b0: 0x0001, 0x16b1: 0x0001, 0x16b2: 0x0001, 0x16b3: 0x0001, 0x16b4: 0x0001, 0x16b5: 0x0001, + 0x16b6: 0x0001, 0x16b7: 0x0001, 0x16b8: 0x0010, 0x16b9: 0x0010, 0x16ba: 0x0010, 0x16bb: 0x0060, + 0x16bc: 0x0060, 0x16bd: 0x0060, 0x16be: 0x0060, 0x16bf: 0x0060, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x0001, 0x16c1: 0x0001, 0x16c2: 0x0001, 0x16c3: 0x0001, 0x16c4: 0x0001, 0x16c5: 0x0001, + 0x16c6: 0x0001, 0x16c7: 0x0001, 0x16c8: 0x0001, 0x16c9: 0x0001, 0x16ca: 0x0010, 0x16cb: 0x0010, + 0x16cc: 0x0010, 0x16cd: 0x0001, 0x16ce: 0x0001, 0x16cf: 0x0001, 0x16d0: 0x0001, 0x16d1: 0x0001, + 0x16d2: 0x0001, 0x16d3: 0x0001, 0x16d4: 0x0001, 0x16d5: 0x0001, 0x16d6: 0x0001, 0x16d7: 0x0001, + 0x16d8: 0x0001, 0x16d9: 0x0001, 0x16da: 0x0001, 0x16db: 0x0001, 0x16dc: 0x0001, 0x16dd: 0x0001, + 0x16de: 0x0001, 0x16df: 0x0001, 0x16e0: 0x0001, 0x16e1: 0x0001, 0x16e2: 0x0001, 0x16e3: 0x0001, + 0x16e4: 0x0001, 0x16e5: 0x0001, 0x16e6: 0x0001, 0x16e7: 0x0001, 0x16e8: 0x0001, 0x16e9: 0x0001, + 0x16ea: 0x0001, 0x16eb: 0x0001, 0x16ec: 0x0001, 0x16ed: 0x0001, 0x16ee: 0x0001, 0x16ef: 0x0001, + 0x16f0: 0x0001, 0x16f1: 0x0001, 0x16f2: 0x0001, 0x16f3: 0x0001, 0x16f4: 0x0001, 0x16f5: 0x0001, + 0x16f6: 0x0001, 0x16f7: 0x0001, 0x16f8: 0x0001, 0x16f9: 0x0001, 0x16fa: 0x0001, 0x16fb: 0x0001, + 0x16fc: 0x0001, 0x16fd: 0x0001, 0x16fe: 0x0060, 0x16ff: 0x0060, + // Block 0x5c, offset 0x1700 + 0x1700: 0x0060, 0x1701: 0x0060, 0x1702: 0x0060, 0x1703: 0x0060, 0x1704: 0x0060, 0x1705: 0x0060, + 0x1706: 0x0060, 0x1707: 0x0060, 0x1708: 0x0010, 0x1709: 0x0010, 0x170a: 0x0010, 0x170b: 0x0010, + 0x170c: 0x0010, 0x170d: 0x0010, 0x170e: 0x0010, 0x170f: 0x0010, 0x1710: 0x0001, 0x1711: 0x0001, + 0x1712: 0x0001, 0x1713: 0x0060, 0x1714: 0x0001, 0x1715: 0x0001, 0x1716: 0x0001, 0x1717: 0x0001, + 0x1718: 0x0001, 0x1719: 0x0001, 0x171a: 0x0001, 0x171b: 0x0001, 0x171c: 0x0001, 0x171d: 0x0001, + 0x171e: 0x0001, 0x171f: 0x0001, 0x1720: 0x0001, 0x1721: 0x0001, 0x1722: 0x0001, 0x1723: 0x0001, + 0x1724: 0x0001, 0x1725: 0x0001, 0x1726: 0x0001, 0x1727: 0x0001, 0x1728: 0x0001, 0x1729: 0x0001, + 0x172a: 0x0001, 0x172b: 0x0001, 0x172c: 0x0001, 0x172d: 0x0001, 0x172e: 0x0001, 0x172f: 0x0001, + 0x1730: 0x0001, 0x1731: 0x0001, 0x1732: 0x0001, 0x1733: 0x0001, 0x1734: 0x0001, 0x1735: 0x0001, + 0x1736: 0x0001, 0x1737: 0x0010, 0x1738: 0x0001, 0x1739: 0x0001, 0x173a: 0x0010, 0x173b: 0x0010, + 0x173c: 0x0010, 0x173d: 0x0010, 0x173e: 0x0010, 0x173f: 0x0010, + // Block 0x5d, offset 0x1740 + 0x1740: 0x0001, 0x1741: 0x0001, 0x1742: 0x0001, 0x1743: 0x0001, 0x1744: 0x0001, 0x1745: 0x0001, + 0x1746: 0x0001, 0x1747: 0x0001, 0x1748: 0x0001, 0x1749: 0x0001, 0x174a: 0x0001, 0x174b: 0x0001, + 0x174c: 0x0001, 0x174d: 0x0001, 0x174e: 0x0001, 0x174f: 0x0001, 0x1750: 0x0001, 0x1751: 0x0001, + 0x1752: 0x0001, 0x1753: 0x0001, 0x1754: 0x0001, 0x1755: 0x0001, 0x1756: 0x0001, 0x1757: 0x0001, + 0x1758: 0x0001, 0x1759: 0x0001, 0x175a: 0x0001, 0x175b: 0x0001, 0x175c: 0x0001, 0x175d: 0x0001, + 0x175e: 0x0001, 0x175f: 0x0001, 0x1760: 0x0001, 0x1761: 0x0001, 0x1762: 0x0001, 0x1763: 0x0001, + 0x1764: 0x0001, 0x1765: 0x0001, 0x1766: 0x0001, 0x1767: 0x0001, 0x1768: 0x0001, 0x1769: 0x0001, + 0x176a: 0x0001, 0x176b: 0x0001, 0x176c: 0x0060, 0x176d: 0x0060, 0x176e: 0x0060, 0x176f: 0x0001, + 0x1770: 0x0060, 0x1771: 0x0060, 0x1772: 0x0060, 0x1773: 0x0060, 0x1774: 0x0060, 0x1775: 0x0060, + 0x1776: 0x0060, 0x1777: 0x0060, 0x1778: 0x0060, 0x1779: 0x0060, 0x177a: 0x0060, 0x177b: 0x0001, + 0x177c: 0x0060, 0x177d: 0x0060, 0x177e: 0x0060, 0x177f: 0x0060, + // Block 0x5e, offset 0x1780 + 0x1780: 0x0060, 0x1781: 0x0060, 0x1782: 0x0060, 0x1783: 0x0060, 0x1784: 0x0060, 0x1785: 0x0060, + 0x1786: 0x0060, 0x1787: 0x0060, 0x1788: 0x0060, 0x1789: 0x0060, 0x178a: 0x0060, 0x178b: 0x0060, + 0x178c: 0x0060, 0x178d: 0x0060, 0x178e: 0x0001, 0x178f: 0x0060, 0x1790: 0x0060, 0x1791: 0x0060, + 0x1792: 0x0060, 0x1793: 0x0060, 0x1794: 0x0060, 0x1795: 0x0060, 0x1796: 0x0060, 0x1797: 0x0060, + 0x1798: 0x0060, 0x1799: 0x0060, 0x179a: 0x0060, 0x179b: 0x0060, 0x179c: 0x0060, 0x179d: 0x0060, + 0x179e: 0x0060, 0x179f: 0x0060, 0x17a0: 0x0060, 0x17a1: 0x0060, 0x17a2: 0x0060, 0x17a3: 0x0060, + 0x17a4: 0x0060, 0x17a5: 0x0060, 0x17a6: 0x0060, 0x17a7: 0x0060, 0x17a8: 0x0060, 0x17a9: 0x0060, + 0x17aa: 0x0060, 0x17ab: 0x0001, 0x17ac: 0x0001, 0x17ad: 0x0001, 0x17ae: 0x0001, 0x17af: 0x0001, + 0x17b0: 0x0001, 0x17b1: 0x0001, 0x17b2: 0x0001, 0x17b3: 0x0001, 0x17b4: 0x0001, 0x17b5: 0x0001, + 0x17b6: 0x0001, 0x17b7: 0x0001, 0x17b8: 0x0060, 0x17b9: 0x0001, 0x17ba: 0x0001, 0x17bb: 0x0001, + 0x17bc: 0x0001, 0x17bd: 0x0001, 0x17be: 0x0001, 0x17bf: 0x0001, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x0001, 0x17c1: 0x0001, 0x17c2: 0x0001, 0x17c3: 0x0001, 0x17c4: 0x0001, 0x17c5: 0x0001, + 0x17c6: 0x0001, 0x17c7: 0x0001, 0x17c8: 0x0001, 0x17c9: 0x0001, 0x17ca: 0x0001, 0x17cb: 0x0001, + 0x17cc: 0x0001, 0x17cd: 0x0001, 0x17ce: 0x0001, 0x17cf: 0x0001, 0x17d0: 0x0001, 0x17d1: 0x0001, + 0x17d2: 0x0001, 0x17d3: 0x0001, 0x17d4: 0x0001, 0x17d5: 0x0001, 0x17d6: 0x0001, 0x17d7: 0x0001, + 0x17d8: 0x0001, 0x17d9: 0x0001, 0x17da: 0x0001, 0x17db: 0x0060, 0x17dc: 0x0060, 0x17dd: 0x0060, + 0x17de: 0x0060, 0x17df: 0x0060, 0x17e0: 0x0060, 0x17e1: 0x0060, 0x17e2: 0x0060, 0x17e3: 0x0060, + 0x17e4: 0x0060, 0x17e5: 0x0060, 0x17e6: 0x0060, 0x17e7: 0x0060, 0x17e8: 0x0060, 0x17e9: 0x0060, + 0x17ea: 0x0060, 0x17eb: 0x0060, 0x17ec: 0x0060, 0x17ed: 0x0060, 0x17ee: 0x0060, 0x17ef: 0x0060, + 0x17f0: 0x0060, 0x17f1: 0x0060, 0x17f2: 0x0060, 0x17f3: 0x0060, 0x17f4: 0x0060, 0x17f5: 0x0060, + 0x17f6: 0x0060, 0x17f7: 0x0060, 0x17f8: 0x0060, 0x17f9: 0x0060, 0x17fa: 0x0060, 0x17fb: 0x0060, + 0x17fc: 0x0060, 0x17fd: 0x0060, 0x17fe: 0x0060, 0x17ff: 0x0060, + // Block 0x60, offset 0x1800 + 0x1800: 0x0001, 0x1801: 0x0001, 0x1802: 0x0001, 0x1803: 0x0001, 0x1804: 0x0001, 0x1805: 0x0001, + 0x1806: 0x0001, 0x1807: 0x0001, 0x1808: 0x0001, 0x1809: 0x0001, 0x180a: 0x0001, 0x180b: 0x0001, + 0x180c: 0x0001, 0x180d: 0x0001, 0x180e: 0x0001, 0x180f: 0x0001, 0x1810: 0x0001, 0x1811: 0x0001, + 0x1812: 0x0001, 0x1813: 0x0001, 0x1814: 0x0001, 0x1815: 0x0001, 0x1816: 0x0001, 0x1817: 0x0001, + 0x1818: 0x0001, 0x1819: 0x0001, 0x181a: 0x0001, 0x181b: 0x0001, 0x181c: 0x0001, 0x181d: 0x0001, + 0x181e: 0x0001, 0x181f: 0x0001, 0x1820: 0x0001, 0x1821: 0x0001, 0x1822: 0x0001, 0x1823: 0x0001, + 0x1824: 0x0001, 0x1825: 0x0001, 0x1826: 0x0001, 0x1827: 0x0001, 0x1828: 0x0001, 0x1829: 0x0001, + 0x182a: 0x0001, 0x182b: 0x0001, 0x182c: 0x0001, 0x182d: 0x0001, 0x182e: 0x0001, 0x182f: 0x0001, + 0x1830: 0x0001, 0x1831: 0x0001, 0x1832: 0x0001, 0x1833: 0x0001, 0x1834: 0x0001, 0x1835: 0x0001, + 0x1836: 0x0010, 0x1837: 0x0010, 0x1838: 0x0010, 0x1839: 0x0010, 0x183a: 0x0010, 0x183b: 0x0010, + 0x183c: 0x0001, 0x183d: 0x0001, 0x183e: 0x0001, 0x183f: 0x0001, + // Block 0x61, offset 0x1840 + 0x1840: 0x0001, 0x1841: 0x0001, 0x1842: 0x0001, 0x1843: 0x0001, 0x1844: 0x0001, 0x1845: 0x0001, + 0x1846: 0x0001, 0x1847: 0x0001, 0x1848: 0x0001, 0x1849: 0x0001, 0x184a: 0x0001, 0x184b: 0x0001, + 0x184c: 0x0001, 0x184d: 0x0001, 0x184e: 0x0001, 0x184f: 0x0001, 0x1850: 0x0001, 0x1851: 0x0001, + 0x1852: 0x0001, 0x1853: 0x0001, 0x1854: 0x0001, 0x1855: 0x0001, 0x1856: 0x0001, 0x1857: 0x0001, + 0x1858: 0x0001, 0x1859: 0x0001, 0x185a: 0x0060, 0x185b: 0x0060, 0x185c: 0x0001, 0x185d: 0x0001, + 0x185e: 0x0001, 0x185f: 0x0001, 0x1860: 0x0001, 0x1861: 0x0001, 0x1862: 0x0001, 0x1863: 0x0001, + 0x1864: 0x0001, 0x1865: 0x0001, 0x1866: 0x0001, 0x1867: 0x0001, 0x1868: 0x0001, 0x1869: 0x0001, + 0x186a: 0x0001, 0x186b: 0x0001, 0x186c: 0x0001, 0x186d: 0x0001, 0x186e: 0x0001, 0x186f: 0x0001, + 0x1870: 0x0001, 0x1871: 0x0001, 0x1872: 0x0001, 0x1873: 0x0001, 0x1874: 0x0001, 0x1875: 0x0001, + 0x1876: 0x0001, 0x1877: 0x0001, 0x1878: 0x0001, 0x1879: 0x0001, 0x187a: 0x0001, 0x187b: 0x0001, + 0x187c: 0x0001, 0x187d: 0x0001, 0x187e: 0x0001, 0x187f: 0x0001, + // Block 0x62, offset 0x1880 + 0x1880: 0x0001, 0x1881: 0x0001, 0x1882: 0x0001, 0x1883: 0x0001, 0x1884: 0x0001, 0x1885: 0x0001, + 0x1886: 0x0001, 0x1887: 0x0001, 0x1888: 0x0001, 0x1889: 0x0001, 0x188a: 0x0001, 0x188b: 0x0001, + 0x188c: 0x0001, 0x188d: 0x0001, 0x188e: 0x0001, 0x188f: 0x0001, 0x1890: 0x0001, 0x1891: 0x0001, + 0x1892: 0x0001, 0x1893: 0x0001, 0x1894: 0x0001, 0x1895: 0x0001, 0x1896: 0x0010, 0x1897: 0x0010, + 0x1898: 0x0001, 0x1899: 0x0001, 0x189a: 0x0001, 0x189b: 0x0001, 0x189c: 0x0001, 0x189d: 0x0001, + 0x189e: 0x0010, 0x189f: 0x0010, 0x18a0: 0x0001, 0x18a1: 0x0001, 0x18a2: 0x0001, 0x18a3: 0x0001, + 0x18a4: 0x0001, 0x18a5: 0x0001, 0x18a6: 0x0001, 0x18a7: 0x0001, 0x18a8: 0x0001, 0x18a9: 0x0001, + 0x18aa: 0x0001, 0x18ab: 0x0001, 0x18ac: 0x0001, 0x18ad: 0x0001, 0x18ae: 0x0001, 0x18af: 0x0001, + 0x18b0: 0x0001, 0x18b1: 0x0001, 0x18b2: 0x0001, 0x18b3: 0x0001, 0x18b4: 0x0001, 0x18b5: 0x0001, + 0x18b6: 0x0001, 0x18b7: 0x0001, 0x18b8: 0x0001, 0x18b9: 0x0001, 0x18ba: 0x0001, 0x18bb: 0x0001, + 0x18bc: 0x0001, 0x18bd: 0x0001, 0x18be: 0x0001, 0x18bf: 0x0001, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x0001, 0x18c1: 0x0001, 0x18c2: 0x0001, 0x18c3: 0x0001, 0x18c4: 0x0001, 0x18c5: 0x0001, + 0x18c6: 0x0010, 0x18c7: 0x0010, 0x18c8: 0x0001, 0x18c9: 0x0001, 0x18ca: 0x0001, 0x18cb: 0x0001, + 0x18cc: 0x0001, 0x18cd: 0x0001, 0x18ce: 0x0010, 0x18cf: 0x0010, 0x18d0: 0x0001, 0x18d1: 0x0001, + 0x18d2: 0x0001, 0x18d3: 0x0001, 0x18d4: 0x0001, 0x18d5: 0x0001, 0x18d6: 0x0001, 0x18d7: 0x0001, + 0x18d8: 0x0010, 0x18d9: 0x0001, 0x18da: 0x0010, 0x18db: 0x0001, 0x18dc: 0x0010, 0x18dd: 0x0001, + 0x18de: 0x0010, 0x18df: 0x0001, 0x18e0: 0x0001, 0x18e1: 0x0001, 0x18e2: 0x0001, 0x18e3: 0x0001, + 0x18e4: 0x0001, 0x18e5: 0x0001, 0x18e6: 0x0001, 0x18e7: 0x0001, 0x18e8: 0x0001, 0x18e9: 0x0001, + 0x18ea: 0x0001, 0x18eb: 0x0001, 0x18ec: 0x0001, 0x18ed: 0x0001, 0x18ee: 0x0001, 0x18ef: 0x0001, + 0x18f0: 0x0001, 0x18f1: 0x0060, 0x18f2: 0x0001, 0x18f3: 0x0060, 0x18f4: 0x0001, 0x18f5: 0x0060, + 0x18f6: 0x0001, 0x18f7: 0x0060, 0x18f8: 0x0001, 0x18f9: 0x0060, 0x18fa: 0x0001, 0x18fb: 0x0060, + 0x18fc: 0x0001, 0x18fd: 0x0060, 0x18fe: 0x0010, 0x18ff: 0x0010, + // Block 0x64, offset 0x1900 + 0x1900: 0x0001, 0x1901: 0x0001, 0x1902: 0x0001, 0x1903: 0x0001, 0x1904: 0x0001, 0x1905: 0x0001, + 0x1906: 0x0001, 0x1907: 0x0001, 0x1908: 0x0060, 0x1909: 0x0060, 0x190a: 0x0060, 0x190b: 0x0060, + 0x190c: 0x0060, 0x190d: 0x0060, 0x190e: 0x0060, 0x190f: 0x0060, 0x1910: 0x0001, 0x1911: 0x0001, + 0x1912: 0x0001, 0x1913: 0x0001, 0x1914: 0x0001, 0x1915: 0x0001, 0x1916: 0x0001, 0x1917: 0x0001, + 0x1918: 0x0060, 0x1919: 0x0060, 0x191a: 0x0060, 0x191b: 0x0060, 0x191c: 0x0060, 0x191d: 0x0060, + 0x191e: 0x0060, 0x191f: 0x0060, 0x1920: 0x0001, 0x1921: 0x0001, 0x1922: 0x0001, 0x1923: 0x0001, + 0x1924: 0x0001, 0x1925: 0x0001, 0x1926: 0x0001, 0x1927: 0x0001, 0x1928: 0x0060, 0x1929: 0x0060, + 0x192a: 0x0060, 0x192b: 0x0060, 0x192c: 0x0060, 0x192d: 0x0060, 0x192e: 0x0060, 0x192f: 0x0060, + 0x1930: 0x0001, 0x1931: 0x0001, 0x1932: 0x0001, 0x1933: 0x0001, 0x1934: 0x0001, 0x1935: 0x0010, + 0x1936: 0x0001, 0x1937: 0x0001, 0x1938: 0x0001, 0x1939: 0x0001, 0x193a: 0x0001, 0x193b: 0x0060, + 0x193c: 0x0060, 0x193d: 0x0060, 0x193e: 0x0060, 0x193f: 0x0060, + // Block 0x65, offset 0x1940 + 0x1940: 0x0060, 0x1941: 0x0060, 0x1942: 0x0001, 0x1943: 0x0001, 0x1944: 0x0001, 0x1945: 0x0010, + 0x1946: 0x0001, 0x1947: 0x0001, 0x1948: 0x0001, 0x1949: 0x0060, 0x194a: 0x0001, 0x194b: 0x0060, + 0x194c: 0x0060, 0x194d: 0x0060, 0x194e: 0x0060, 0x194f: 0x0060, 0x1950: 0x0001, 0x1951: 0x0001, + 0x1952: 0x0001, 0x1953: 0x0060, 0x1954: 0x0010, 0x1955: 0x0010, 0x1956: 0x0001, 0x1957: 0x0001, + 0x1958: 0x0001, 0x1959: 0x0001, 0x195a: 0x0001, 0x195b: 0x0060, 0x195c: 0x0010, 0x195d: 0x0060, + 0x195e: 0x0060, 0x195f: 0x0060, 0x1960: 0x0001, 0x1961: 0x0001, 0x1962: 0x0001, 0x1963: 0x0060, + 0x1964: 0x0001, 0x1965: 0x0001, 0x1966: 0x0001, 0x1967: 0x0001, 0x1968: 0x0001, 0x1969: 0x0001, + 0x196a: 0x0001, 0x196b: 0x0060, 0x196c: 0x0001, 0x196d: 0x0060, 0x196e: 0x0060, 0x196f: 0x0060, + 0x1970: 0x0010, 0x1971: 0x0010, 0x1972: 0x0001, 0x1973: 0x0001, 0x1974: 0x0001, 0x1975: 0x0010, + 0x1976: 0x0001, 0x1977: 0x0001, 0x1978: 0x0001, 0x1979: 0x0060, 0x197a: 0x0001, 0x197b: 0x0060, + 0x197c: 0x0060, 0x197d: 0x0060, 0x197e: 0x0060, 0x197f: 0x0010, + // Block 0x66, offset 0x1980 + 0x1980: 0x0060, 0x1981: 0x0060, 0x1982: 0x0060, 0x1983: 0x0060, 0x1984: 0x0060, 0x1985: 0x0060, + 0x1986: 0x0060, 0x1987: 0x0060, 0x1988: 0x0060, 0x1989: 0x0060, 0x198a: 0x0060, 0x198b: 0x0008, + 0x198c: 0x0004, 0x198d: 0x0004, 0x198e: 0x0008, 0x198f: 0x0008, 0x1990: 0x0060, 0x1991: 0x0060, + 0x1992: 0x0060, 0x1993: 0x0060, 0x1994: 0x0060, 0x1995: 0x0060, 0x1996: 0x0060, 0x1997: 0x0060, + 0x1998: 0x0060, 0x1999: 0x0060, 0x199a: 0x0060, 0x199b: 0x0060, 0x199c: 0x0060, 0x199d: 0x0060, + 0x199e: 0x0060, 0x199f: 0x0060, 0x19a0: 0x0060, 0x19a1: 0x0060, 0x19a2: 0x0060, 0x19a3: 0x0060, + 0x19a4: 0x0060, 0x19a5: 0x0060, 0x19a6: 0x0060, 0x19a7: 0x0060, 0x19a8: 0x0008, 0x19a9: 0x0008, + 0x19aa: 0x0008, 0x19ab: 0x0008, 0x19ac: 0x0008, 0x19ad: 0x0008, 0x19ae: 0x0008, 0x19af: 0x0060, + 0x19b0: 0x0060, 0x19b1: 0x0060, 0x19b2: 0x0060, 0x19b3: 0x0060, 0x19b4: 0x0060, 0x19b5: 0x0060, + 0x19b6: 0x0060, 0x19b7: 0x0060, 0x19b8: 0x0060, 0x19b9: 0x0060, 0x19ba: 0x0060, 0x19bb: 0x0060, + 0x19bc: 0x0060, 0x19bd: 0x0060, 0x19be: 0x0060, 0x19bf: 0x0060, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x0060, 0x19c1: 0x0060, 0x19c2: 0x0060, 0x19c3: 0x0060, 0x19c4: 0x0060, 0x19c5: 0x0060, + 0x19c6: 0x0060, 0x19c7: 0x0060, 0x19c8: 0x0060, 0x19c9: 0x0060, 0x19ca: 0x0060, 0x19cb: 0x0060, + 0x19cc: 0x0060, 0x19cd: 0x0060, 0x19ce: 0x0060, 0x19cf: 0x0060, 0x19d0: 0x0060, 0x19d1: 0x0060, + 0x19d2: 0x0060, 0x19d3: 0x0060, 0x19d4: 0x0060, 0x19d5: 0x0060, 0x19d6: 0x0060, 0x19d7: 0x0060, + 0x19d8: 0x0060, 0x19d9: 0x0060, 0x19da: 0x0060, 0x19db: 0x0060, 0x19dc: 0x0060, 0x19dd: 0x0060, + 0x19de: 0x0060, 0x19df: 0x0060, 0x19e0: 0x0008, 0x19e1: 0x0008, 0x19e2: 0x0008, 0x19e3: 0x0008, + 0x19e4: 0x0008, 0x19e5: 0x0010, 0x19e6: 0x0008, 0x19e7: 0x0008, 0x19e8: 0x0008, 0x19e9: 0x0008, + 0x19ea: 0x0008, 0x19eb: 0x0008, 0x19ec: 0x0008, 0x19ed: 0x0008, 0x19ee: 0x0008, 0x19ef: 0x0008, + 0x19f0: 0x0060, 0x19f1: 0x0060, 0x19f2: 0x0010, 0x19f3: 0x0010, 0x19f4: 0x0060, 0x19f5: 0x0060, + 0x19f6: 0x0060, 0x19f7: 0x0060, 0x19f8: 0x0060, 0x19f9: 0x0060, 0x19fa: 0x0060, 0x19fb: 0x0060, + 0x19fc: 0x0060, 0x19fd: 0x0060, 0x19fe: 0x0060, 0x19ff: 0x0060, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x0060, 0x1a01: 0x0060, 0x1a02: 0x0060, 0x1a03: 0x0060, 0x1a04: 0x0060, 0x1a05: 0x0060, + 0x1a06: 0x0060, 0x1a07: 0x0060, 0x1a08: 0x0060, 0x1a09: 0x0060, 0x1a0a: 0x0060, 0x1a0b: 0x0060, + 0x1a0c: 0x0060, 0x1a0d: 0x0060, 0x1a0e: 0x0060, 0x1a0f: 0x0010, 0x1a10: 0x0060, 0x1a11: 0x0060, + 0x1a12: 0x0060, 0x1a13: 0x0060, 0x1a14: 0x0060, 0x1a15: 0x0060, 0x1a16: 0x0060, 0x1a17: 0x0060, + 0x1a18: 0x0060, 0x1a19: 0x0060, 0x1a1a: 0x0060, 0x1a1b: 0x0060, 0x1a1c: 0x0060, 0x1a1d: 0x0010, + 0x1a1e: 0x0010, 0x1a1f: 0x0010, 0x1a20: 0x0060, 0x1a21: 0x0060, 0x1a22: 0x0060, 0x1a23: 0x0060, + 0x1a24: 0x0060, 0x1a25: 0x0060, 0x1a26: 0x0060, 0x1a27: 0x0060, 0x1a28: 0x0060, 0x1a29: 0x0060, + 0x1a2a: 0x0060, 0x1a2b: 0x0060, 0x1a2c: 0x0060, 0x1a2d: 0x0060, 0x1a2e: 0x0060, 0x1a2f: 0x0060, + 0x1a30: 0x0060, 0x1a31: 0x0060, 0x1a32: 0x0060, 0x1a33: 0x0060, 0x1a34: 0x0060, 0x1a35: 0x0060, + 0x1a36: 0x0060, 0x1a37: 0x0060, 0x1a38: 0x0060, 0x1a39: 0x0060, 0x1a3a: 0x0060, 0x1a3b: 0x0060, + 0x1a3c: 0x0060, 0x1a3d: 0x0060, 0x1a3e: 0x0060, 0x1a3f: 0x0010, + // Block 0x69, offset 0x1a40 + 0x1a40: 0x0010, 0x1a41: 0x0010, 0x1a42: 0x0010, 0x1a43: 0x0010, 0x1a44: 0x0010, 0x1a45: 0x0010, + 0x1a46: 0x0010, 0x1a47: 0x0010, 0x1a48: 0x0010, 0x1a49: 0x0010, 0x1a4a: 0x0010, 0x1a4b: 0x0010, + 0x1a4c: 0x0010, 0x1a4d: 0x0010, 0x1a4e: 0x0010, 0x1a4f: 0x0010, 0x1a50: 0x0001, 0x1a51: 0x0001, + 0x1a52: 0x0001, 0x1a53: 0x0001, 0x1a54: 0x0001, 0x1a55: 0x0001, 0x1a56: 0x0001, 0x1a57: 0x0001, + 0x1a58: 0x0001, 0x1a59: 0x0001, 0x1a5a: 0x0001, 0x1a5b: 0x0001, 0x1a5c: 0x0001, 0x1a5d: 0x0060, + 0x1a5e: 0x0060, 0x1a5f: 0x0060, 0x1a60: 0x0060, 0x1a61: 0x0001, 0x1a62: 0x0060, 0x1a63: 0x0060, + 0x1a64: 0x0060, 0x1a65: 0x0001, 0x1a66: 0x0001, 0x1a67: 0x0001, 0x1a68: 0x0001, 0x1a69: 0x0001, + 0x1a6a: 0x0001, 0x1a6b: 0x0001, 0x1a6c: 0x0001, 0x1a6d: 0x0001, 0x1a6e: 0x0001, 0x1a6f: 0x0001, + 0x1a70: 0x0001, 0x1a71: 0x0010, 0x1a72: 0x0010, 0x1a73: 0x0010, 0x1a74: 0x0010, 0x1a75: 0x0010, + 0x1a76: 0x0010, 0x1a77: 0x0010, 0x1a78: 0x0010, 0x1a79: 0x0010, 0x1a7a: 0x0010, 0x1a7b: 0x0010, + 0x1a7c: 0x0010, 0x1a7d: 0x0010, 0x1a7e: 0x0010, 0x1a7f: 0x0010, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x0060, 0x1a81: 0x0060, 0x1a82: 0x0060, 0x1a83: 0x0060, 0x1a84: 0x0060, 0x1a85: 0x0060, + 0x1a86: 0x0060, 0x1a87: 0x0060, 0x1a88: 0x0060, 0x1a89: 0x0060, 0x1a8a: 0x0060, 0x1a8b: 0x0060, + 0x1a8c: 0x0060, 0x1a8d: 0x0060, 0x1a8e: 0x0060, 0x1a8f: 0x0060, 0x1a90: 0x0060, 0x1a91: 0x0060, + 0x1a92: 0x0060, 0x1a93: 0x0060, 0x1a94: 0x0060, 0x1a95: 0x0060, 0x1a96: 0x0060, 0x1a97: 0x0060, + 0x1a98: 0x0060, 0x1a99: 0x0060, 0x1a9a: 0x0060, 0x1a9b: 0x0060, 0x1a9c: 0x0060, 0x1a9d: 0x0060, + 0x1a9e: 0x0060, 0x1a9f: 0x0060, 0x1aa0: 0x0060, 0x1aa1: 0x0060, 0x1aa2: 0x0060, 0x1aa3: 0x0060, + 0x1aa4: 0x0060, 0x1aa5: 0x0060, 0x1aa6: 0x0060, 0x1aa7: 0x0060, 0x1aa8: 0x0060, 0x1aa9: 0x0060, + 0x1aaa: 0x0060, 0x1aab: 0x0060, 0x1aac: 0x0060, 0x1aad: 0x0060, 0x1aae: 0x0060, 0x1aaf: 0x0060, + 0x1ab0: 0x0060, 0x1ab1: 0x0060, 0x1ab2: 0x0001, 0x1ab3: 0x0060, 0x1ab4: 0x0060, 0x1ab5: 0x0060, + 0x1ab6: 0x0060, 0x1ab7: 0x0060, 0x1ab8: 0x0060, 0x1ab9: 0x0060, 0x1aba: 0x0060, 0x1abb: 0x0060, + 0x1abc: 0x0060, 0x1abd: 0x0060, 0x1abe: 0x0060, 0x1abf: 0x0060, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x0060, 0x1ac1: 0x0060, 0x1ac2: 0x0060, 0x1ac3: 0x0060, 0x1ac4: 0x0060, 0x1ac5: 0x0060, + 0x1ac6: 0x0060, 0x1ac7: 0x0060, 0x1ac8: 0x0060, 0x1ac9: 0x0060, 0x1aca: 0x0060, 0x1acb: 0x0060, + 0x1acc: 0x0060, 0x1acd: 0x0060, 0x1ace: 0x0001, 0x1acf: 0x0060, 0x1ad0: 0x0060, 0x1ad1: 0x0060, + 0x1ad2: 0x0060, 0x1ad3: 0x0060, 0x1ad4: 0x0060, 0x1ad5: 0x0060, 0x1ad6: 0x0060, 0x1ad7: 0x0060, + 0x1ad8: 0x0060, 0x1ad9: 0x0060, 0x1ada: 0x0060, 0x1adb: 0x0060, 0x1adc: 0x0060, 0x1add: 0x0060, + 0x1ade: 0x0060, 0x1adf: 0x0060, 0x1ae0: 0x0060, 0x1ae1: 0x0060, 0x1ae2: 0x0060, 0x1ae3: 0x0060, + 0x1ae4: 0x0060, 0x1ae5: 0x0060, 0x1ae6: 0x0060, 0x1ae7: 0x0060, 0x1ae8: 0x0060, 0x1ae9: 0x0060, + 0x1aea: 0x0060, 0x1aeb: 0x0060, 0x1aec: 0x0060, 0x1aed: 0x0060, 0x1aee: 0x0060, 0x1aef: 0x0060, + 0x1af0: 0x0060, 0x1af1: 0x0060, 0x1af2: 0x0060, 0x1af3: 0x0060, 0x1af4: 0x0060, 0x1af5: 0x0060, + 0x1af6: 0x0060, 0x1af7: 0x0060, 0x1af8: 0x0060, 0x1af9: 0x0060, 0x1afa: 0x0060, 0x1afb: 0x0060, + 0x1afc: 0x0060, 0x1afd: 0x0060, 0x1afe: 0x0060, 0x1aff: 0x0060, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x0060, 0x1b01: 0x0060, 0x1b02: 0x0060, 0x1b03: 0x0001, 0x1b04: 0x0001, 0x1b05: 0x0060, + 0x1b06: 0x0060, 0x1b07: 0x0060, 0x1b08: 0x0060, 0x1b09: 0x0060, 0x1b0a: 0x0060, 0x1b0b: 0x0060, + 0x1b0c: 0x0010, 0x1b0d: 0x0010, 0x1b0e: 0x0010, 0x1b0f: 0x0010, 0x1b10: 0x0060, 0x1b11: 0x0060, + 0x1b12: 0x0060, 0x1b13: 0x0060, 0x1b14: 0x0060, 0x1b15: 0x0060, 0x1b16: 0x0060, 0x1b17: 0x0060, + 0x1b18: 0x0060, 0x1b19: 0x0060, 0x1b1a: 0x0060, 0x1b1b: 0x0060, 0x1b1c: 0x0060, 0x1b1d: 0x0060, + 0x1b1e: 0x0060, 0x1b1f: 0x0060, 0x1b20: 0x0060, 0x1b21: 0x0060, 0x1b22: 0x0060, 0x1b23: 0x0060, + 0x1b24: 0x0060, 0x1b25: 0x0060, 0x1b26: 0x0060, 0x1b27: 0x0060, 0x1b28: 0x0060, 0x1b29: 0x0060, + 0x1b2a: 0x0060, 0x1b2b: 0x0060, 0x1b2c: 0x0060, 0x1b2d: 0x0060, 0x1b2e: 0x0060, 0x1b2f: 0x0060, + 0x1b30: 0x0060, 0x1b31: 0x0060, 0x1b32: 0x0060, 0x1b33: 0x0060, 0x1b34: 0x0060, 0x1b35: 0x0060, + 0x1b36: 0x0060, 0x1b37: 0x0060, 0x1b38: 0x0060, 0x1b39: 0x0060, 0x1b3a: 0x0060, 0x1b3b: 0x0060, + 0x1b3c: 0x0060, 0x1b3d: 0x0060, 0x1b3e: 0x0060, 0x1b3f: 0x0060, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0x0060, 0x1b41: 0x0060, 0x1b42: 0x0060, 0x1b43: 0x0060, 0x1b44: 0x0060, 0x1b45: 0x0060, + 0x1b46: 0x0060, 0x1b47: 0x0060, 0x1b48: 0x0060, 0x1b49: 0x0060, 0x1b4a: 0x0060, 0x1b4b: 0x0060, + 0x1b4c: 0x0060, 0x1b4d: 0x0060, 0x1b4e: 0x0060, 0x1b4f: 0x0060, 0x1b50: 0x0060, 0x1b51: 0x0060, + 0x1b52: 0x0060, 0x1b53: 0x0060, 0x1b54: 0x0060, 0x1b55: 0x0060, 0x1b56: 0x0060, 0x1b57: 0x0060, + 0x1b58: 0x0060, 0x1b59: 0x0060, 0x1b5a: 0x0060, 0x1b5b: 0x0060, 0x1b5c: 0x0060, 0x1b5d: 0x0060, + 0x1b5e: 0x0060, 0x1b5f: 0x0060, 0x1b60: 0x0060, 0x1b61: 0x0060, 0x1b62: 0x0060, 0x1b63: 0x0060, + 0x1b64: 0x0060, 0x1b65: 0x0060, 0x1b66: 0x0060, 0x1b67: 0x0060, 0x1b68: 0x0060, 0x1b69: 0x0060, + 0x1b6a: 0x0060, 0x1b6b: 0x0060, 0x1b6c: 0x0060, 0x1b6d: 0x0060, 0x1b6e: 0x0060, 0x1b6f: 0x0060, + 0x1b70: 0x0060, 0x1b71: 0x0060, 0x1b72: 0x0060, 0x1b73: 0x0060, 0x1b74: 0x0060, 0x1b75: 0x0060, + 0x1b76: 0x0060, 0x1b77: 0x0060, 0x1b78: 0x0060, 0x1b79: 0x0060, 0x1b7a: 0x0060, 0x1b7b: 0x0060, + 0x1b7c: 0x0060, 0x1b7d: 0x0060, 0x1b7e: 0x0060, 0x1b7f: 0x0060, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0x0060, 0x1b81: 0x0060, 0x1b82: 0x0060, 0x1b83: 0x0060, 0x1b84: 0x0060, 0x1b85: 0x0060, + 0x1b86: 0x0060, 0x1b87: 0x0060, 0x1b88: 0x0060, 0x1b89: 0x0060, 0x1b8a: 0x0060, 0x1b8b: 0x0060, + 0x1b8c: 0x0060, 0x1b8d: 0x0060, 0x1b8e: 0x0060, 0x1b8f: 0x0060, 0x1b90: 0x0060, 0x1b91: 0x0060, + 0x1b92: 0x0060, 0x1b93: 0x0060, 0x1b94: 0x0060, 0x1b95: 0x0060, 0x1b96: 0x0060, 0x1b97: 0x0060, + 0x1b98: 0x0060, 0x1b99: 0x0060, 0x1b9a: 0x0060, 0x1b9b: 0x0060, 0x1b9c: 0x0060, 0x1b9d: 0x0060, + 0x1b9e: 0x0060, 0x1b9f: 0x0060, 0x1ba0: 0x0060, 0x1ba1: 0x0060, 0x1ba2: 0x0060, 0x1ba3: 0x0060, + 0x1ba4: 0x0060, 0x1ba5: 0x0060, 0x1ba6: 0x0060, 0x1ba7: 0x0060, 0x1ba8: 0x0060, 0x1ba9: 0x0060, + 0x1baa: 0x0060, 0x1bab: 0x0060, 0x1bac: 0x0060, 0x1bad: 0x0060, 0x1bae: 0x0060, 0x1baf: 0x0060, + 0x1bb0: 0x0060, 0x1bb1: 0x0060, 0x1bb2: 0x0060, 0x1bb3: 0x0060, 0x1bb4: 0x0060, 0x1bb5: 0x0060, + 0x1bb6: 0x0060, 0x1bb7: 0x0060, 0x1bb8: 0x0060, 0x1bb9: 0x0060, 0x1bba: 0x0060, 0x1bbb: 0x0010, + 0x1bbc: 0x0010, 0x1bbd: 0x0010, 0x1bbe: 0x0010, 0x1bbf: 0x0010, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x0060, 0x1bc1: 0x0060, 0x1bc2: 0x0060, 0x1bc3: 0x0060, 0x1bc4: 0x0060, 0x1bc5: 0x0060, + 0x1bc6: 0x0060, 0x1bc7: 0x0060, 0x1bc8: 0x0060, 0x1bc9: 0x0060, 0x1bca: 0x0060, 0x1bcb: 0x0060, + 0x1bcc: 0x0060, 0x1bcd: 0x0060, 0x1bce: 0x0060, 0x1bcf: 0x0060, 0x1bd0: 0x0060, 0x1bd1: 0x0060, + 0x1bd2: 0x0060, 0x1bd3: 0x0060, 0x1bd4: 0x0060, 0x1bd5: 0x0060, 0x1bd6: 0x0060, 0x1bd7: 0x0060, + 0x1bd8: 0x0060, 0x1bd9: 0x0060, 0x1bda: 0x0060, 0x1bdb: 0x0060, 0x1bdc: 0x0060, 0x1bdd: 0x0060, + 0x1bde: 0x0060, 0x1bdf: 0x0060, 0x1be0: 0x0060, 0x1be1: 0x0060, 0x1be2: 0x0060, 0x1be3: 0x0060, + 0x1be4: 0x0060, 0x1be5: 0x0060, 0x1be6: 0x0060, 0x1be7: 0x0010, 0x1be8: 0x0010, 0x1be9: 0x0010, + 0x1bea: 0x0010, 0x1beb: 0x0010, 0x1bec: 0x0010, 0x1bed: 0x0010, 0x1bee: 0x0010, 0x1bef: 0x0010, + 0x1bf0: 0x0010, 0x1bf1: 0x0010, 0x1bf2: 0x0010, 0x1bf3: 0x0010, 0x1bf4: 0x0010, 0x1bf5: 0x0010, + 0x1bf6: 0x0010, 0x1bf7: 0x0010, 0x1bf8: 0x0010, 0x1bf9: 0x0010, 0x1bfa: 0x0010, 0x1bfb: 0x0010, + 0x1bfc: 0x0010, 0x1bfd: 0x0010, 0x1bfe: 0x0010, 0x1bff: 0x0010, + // Block 0x70, offset 0x1c00 + 0x1c00: 0x0060, 0x1c01: 0x0060, 0x1c02: 0x0060, 0x1c03: 0x0060, 0x1c04: 0x0060, 0x1c05: 0x0060, + 0x1c06: 0x0060, 0x1c07: 0x0060, 0x1c08: 0x0060, 0x1c09: 0x0060, 0x1c0a: 0x0060, 0x1c0b: 0x0010, + 0x1c0c: 0x0010, 0x1c0d: 0x0010, 0x1c0e: 0x0010, 0x1c0f: 0x0010, 0x1c10: 0x0010, 0x1c11: 0x0010, + 0x1c12: 0x0010, 0x1c13: 0x0010, 0x1c14: 0x0010, 0x1c15: 0x0010, 0x1c16: 0x0010, 0x1c17: 0x0010, + 0x1c18: 0x0010, 0x1c19: 0x0010, 0x1c1a: 0x0010, 0x1c1b: 0x0010, 0x1c1c: 0x0010, 0x1c1d: 0x0010, + 0x1c1e: 0x0010, 0x1c1f: 0x0010, 0x1c20: 0x0060, 0x1c21: 0x0060, 0x1c22: 0x0060, 0x1c23: 0x0060, + 0x1c24: 0x0060, 0x1c25: 0x0060, 0x1c26: 0x0060, 0x1c27: 0x0060, 0x1c28: 0x0060, 0x1c29: 0x0060, + 0x1c2a: 0x0060, 0x1c2b: 0x0060, 0x1c2c: 0x0060, 0x1c2d: 0x0060, 0x1c2e: 0x0060, 0x1c2f: 0x0060, + 0x1c30: 0x0060, 0x1c31: 0x0060, 0x1c32: 0x0060, 0x1c33: 0x0060, 0x1c34: 0x0060, 0x1c35: 0x0060, + 0x1c36: 0x0060, 0x1c37: 0x0060, 0x1c38: 0x0060, 0x1c39: 0x0060, 0x1c3a: 0x0060, 0x1c3b: 0x0060, + 0x1c3c: 0x0060, 0x1c3d: 0x0060, 0x1c3e: 0x0060, 0x1c3f: 0x0060, + // Block 0x71, offset 0x1c40 + 0x1c40: 0x0060, 0x1c41: 0x0060, 0x1c42: 0x0060, 0x1c43: 0x0060, 0x1c44: 0x0060, 0x1c45: 0x0060, + 0x1c46: 0x0060, 0x1c47: 0x0060, 0x1c48: 0x0060, 0x1c49: 0x0060, 0x1c4a: 0x0060, 0x1c4b: 0x0060, + 0x1c4c: 0x0060, 0x1c4d: 0x0060, 0x1c4e: 0x0060, 0x1c4f: 0x0060, 0x1c50: 0x0060, 0x1c51: 0x0060, + 0x1c52: 0x0060, 0x1c53: 0x0060, 0x1c54: 0x0060, 0x1c55: 0x0060, 0x1c56: 0x0060, 0x1c57: 0x0060, + 0x1c58: 0x0060, 0x1c59: 0x0060, 0x1c5a: 0x0060, 0x1c5b: 0x0060, 0x1c5c: 0x0060, 0x1c5d: 0x0060, + 0x1c5e: 0x0060, 0x1c5f: 0x0060, 0x1c60: 0x0060, 0x1c61: 0x0060, 0x1c62: 0x0060, 0x1c63: 0x0060, + 0x1c64: 0x0060, 0x1c65: 0x0060, 0x1c66: 0x0060, 0x1c67: 0x0060, 0x1c68: 0x0060, 0x1c69: 0x0060, + 0x1c6a: 0x0060, 0x1c6b: 0x0060, 0x1c6c: 0x0060, 0x1c6d: 0x0060, 0x1c6e: 0x0060, 0x1c6f: 0x0060, + 0x1c70: 0x0060, 0x1c71: 0x0060, 0x1c72: 0x0060, 0x1c73: 0x0060, 0x1c74: 0x0010, 0x1c75: 0x0010, + 0x1c76: 0x0060, 0x1c77: 0x0060, 0x1c78: 0x0060, 0x1c79: 0x0060, 0x1c7a: 0x0060, 0x1c7b: 0x0060, + 0x1c7c: 0x0060, 0x1c7d: 0x0060, 0x1c7e: 0x0060, 0x1c7f: 0x0060, + // Block 0x72, offset 0x1c80 + 0x1c80: 0x0060, 0x1c81: 0x0060, 0x1c82: 0x0060, 0x1c83: 0x0060, 0x1c84: 0x0060, 0x1c85: 0x0060, + 0x1c86: 0x0060, 0x1c87: 0x0060, 0x1c88: 0x0060, 0x1c89: 0x0060, 0x1c8a: 0x0060, 0x1c8b: 0x0060, + 0x1c8c: 0x0060, 0x1c8d: 0x0060, 0x1c8e: 0x0060, 0x1c8f: 0x0060, 0x1c90: 0x0060, 0x1c91: 0x0060, + 0x1c92: 0x0060, 0x1c93: 0x0060, 0x1c94: 0x0060, 0x1c95: 0x0060, 0x1c96: 0x0010, 0x1c97: 0x0010, + 0x1c98: 0x0060, 0x1c99: 0x0060, 0x1c9a: 0x0060, 0x1c9b: 0x0060, 0x1c9c: 0x0060, 0x1c9d: 0x0060, + 0x1c9e: 0x0060, 0x1c9f: 0x0060, 0x1ca0: 0x0060, 0x1ca1: 0x0060, 0x1ca2: 0x0060, 0x1ca3: 0x0060, + 0x1ca4: 0x0060, 0x1ca5: 0x0060, 0x1ca6: 0x0060, 0x1ca7: 0x0060, 0x1ca8: 0x0060, 0x1ca9: 0x0060, + 0x1caa: 0x0060, 0x1cab: 0x0060, 0x1cac: 0x0060, 0x1cad: 0x0060, 0x1cae: 0x0060, 0x1caf: 0x0060, + 0x1cb0: 0x0060, 0x1cb1: 0x0060, 0x1cb2: 0x0060, 0x1cb3: 0x0060, 0x1cb4: 0x0060, 0x1cb5: 0x0060, + 0x1cb6: 0x0060, 0x1cb7: 0x0060, 0x1cb8: 0x0060, 0x1cb9: 0x0060, 0x1cba: 0x0010, 0x1cbb: 0x0010, + 0x1cbc: 0x0010, 0x1cbd: 0x0060, 0x1cbe: 0x0060, 0x1cbf: 0x0060, + // Block 0x73, offset 0x1cc0 + 0x1cc0: 0x0060, 0x1cc1: 0x0060, 0x1cc2: 0x0060, 0x1cc3: 0x0060, 0x1cc4: 0x0060, 0x1cc5: 0x0060, + 0x1cc6: 0x0060, 0x1cc7: 0x0060, 0x1cc8: 0x0060, 0x1cc9: 0x0010, 0x1cca: 0x0060, 0x1ccb: 0x0060, + 0x1ccc: 0x0060, 0x1ccd: 0x0060, 0x1cce: 0x0060, 0x1ccf: 0x0060, 0x1cd0: 0x0060, 0x1cd1: 0x0060, + 0x1cd2: 0x0010, 0x1cd3: 0x0010, 0x1cd4: 0x0010, 0x1cd5: 0x0010, 0x1cd6: 0x0010, 0x1cd7: 0x0010, + 0x1cd8: 0x0010, 0x1cd9: 0x0010, 0x1cda: 0x0010, 0x1cdb: 0x0010, 0x1cdc: 0x0010, 0x1cdd: 0x0010, + 0x1cde: 0x0010, 0x1cdf: 0x0010, 0x1ce0: 0x0010, 0x1ce1: 0x0010, 0x1ce2: 0x0010, 0x1ce3: 0x0010, + 0x1ce4: 0x0010, 0x1ce5: 0x0010, 0x1ce6: 0x0010, 0x1ce7: 0x0010, 0x1ce8: 0x0010, 0x1ce9: 0x0010, + 0x1cea: 0x0010, 0x1ceb: 0x0010, 0x1cec: 0x0060, 0x1ced: 0x0060, 0x1cee: 0x0060, 0x1cef: 0x0060, + 0x1cf0: 0x0010, 0x1cf1: 0x0010, 0x1cf2: 0x0010, 0x1cf3: 0x0010, 0x1cf4: 0x0010, 0x1cf5: 0x0010, + 0x1cf6: 0x0010, 0x1cf7: 0x0010, 0x1cf8: 0x0010, 0x1cf9: 0x0010, 0x1cfa: 0x0010, 0x1cfb: 0x0010, + 0x1cfc: 0x0010, 0x1cfd: 0x0010, 0x1cfe: 0x0010, 0x1cff: 0x0010, + // Block 0x74, offset 0x1d00 + 0x1d00: 0x0001, 0x1d01: 0x0001, 0x1d02: 0x0001, 0x1d03: 0x0001, 0x1d04: 0x0001, 0x1d05: 0x0001, + 0x1d06: 0x0001, 0x1d07: 0x0001, 0x1d08: 0x0001, 0x1d09: 0x0001, 0x1d0a: 0x0001, 0x1d0b: 0x0001, + 0x1d0c: 0x0001, 0x1d0d: 0x0001, 0x1d0e: 0x0001, 0x1d0f: 0x0001, 0x1d10: 0x0001, 0x1d11: 0x0001, + 0x1d12: 0x0001, 0x1d13: 0x0001, 0x1d14: 0x0001, 0x1d15: 0x0001, 0x1d16: 0x0001, 0x1d17: 0x0001, + 0x1d18: 0x0001, 0x1d19: 0x0001, 0x1d1a: 0x0001, 0x1d1b: 0x0001, 0x1d1c: 0x0001, 0x1d1d: 0x0001, + 0x1d1e: 0x0001, 0x1d1f: 0x0001, 0x1d20: 0x0001, 0x1d21: 0x0001, 0x1d22: 0x0001, 0x1d23: 0x0001, + 0x1d24: 0x0001, 0x1d25: 0x0001, 0x1d26: 0x0001, 0x1d27: 0x0001, 0x1d28: 0x0001, 0x1d29: 0x0001, + 0x1d2a: 0x0001, 0x1d2b: 0x0001, 0x1d2c: 0x0001, 0x1d2d: 0x0001, 0x1d2e: 0x0001, 0x1d2f: 0x0010, + 0x1d30: 0x0001, 0x1d31: 0x0001, 0x1d32: 0x0001, 0x1d33: 0x0001, 0x1d34: 0x0001, 0x1d35: 0x0001, + 0x1d36: 0x0001, 0x1d37: 0x0001, 0x1d38: 0x0001, 0x1d39: 0x0001, 0x1d3a: 0x0001, 0x1d3b: 0x0001, + 0x1d3c: 0x0001, 0x1d3d: 0x0001, 0x1d3e: 0x0001, 0x1d3f: 0x0001, + // Block 0x75, offset 0x1d40 + 0x1d40: 0x0001, 0x1d41: 0x0001, 0x1d42: 0x0001, 0x1d43: 0x0001, 0x1d44: 0x0001, 0x1d45: 0x0001, + 0x1d46: 0x0001, 0x1d47: 0x0001, 0x1d48: 0x0001, 0x1d49: 0x0001, 0x1d4a: 0x0001, 0x1d4b: 0x0001, + 0x1d4c: 0x0001, 0x1d4d: 0x0001, 0x1d4e: 0x0001, 0x1d4f: 0x0001, 0x1d50: 0x0001, 0x1d51: 0x0001, + 0x1d52: 0x0001, 0x1d53: 0x0001, 0x1d54: 0x0001, 0x1d55: 0x0001, 0x1d56: 0x0001, 0x1d57: 0x0001, + 0x1d58: 0x0001, 0x1d59: 0x0001, 0x1d5a: 0x0001, 0x1d5b: 0x0001, 0x1d5c: 0x0001, 0x1d5d: 0x0001, + 0x1d5e: 0x0001, 0x1d5f: 0x0010, 0x1d60: 0x0001, 0x1d61: 0x0001, 0x1d62: 0x0001, 0x1d63: 0x0001, + 0x1d64: 0x0001, 0x1d65: 0x0001, 0x1d66: 0x0001, 0x1d67: 0x0001, 0x1d68: 0x0001, 0x1d69: 0x0001, + 0x1d6a: 0x0001, 0x1d6b: 0x0001, 0x1d6c: 0x0001, 0x1d6d: 0x0001, 0x1d6e: 0x0001, 0x1d6f: 0x0001, + 0x1d70: 0x0001, 0x1d71: 0x0001, 0x1d72: 0x0001, 0x1d73: 0x0001, 0x1d74: 0x0001, 0x1d75: 0x0001, + 0x1d76: 0x0001, 0x1d77: 0x0001, 0x1d78: 0x0001, 0x1d79: 0x0001, 0x1d7a: 0x0001, 0x1d7b: 0x0001, + 0x1d7c: 0x0060, 0x1d7d: 0x0060, 0x1d7e: 0x0001, 0x1d7f: 0x0001, + // Block 0x76, offset 0x1d80 + 0x1d80: 0x0001, 0x1d81: 0x0001, 0x1d82: 0x0001, 0x1d83: 0x0001, 0x1d84: 0x0001, 0x1d85: 0x0001, + 0x1d86: 0x0001, 0x1d87: 0x0001, 0x1d88: 0x0001, 0x1d89: 0x0001, 0x1d8a: 0x0001, 0x1d8b: 0x0001, + 0x1d8c: 0x0001, 0x1d8d: 0x0001, 0x1d8e: 0x0001, 0x1d8f: 0x0001, 0x1d90: 0x0001, 0x1d91: 0x0001, + 0x1d92: 0x0001, 0x1d93: 0x0001, 0x1d94: 0x0001, 0x1d95: 0x0001, 0x1d96: 0x0001, 0x1d97: 0x0001, + 0x1d98: 0x0001, 0x1d99: 0x0001, 0x1d9a: 0x0001, 0x1d9b: 0x0001, 0x1d9c: 0x0001, 0x1d9d: 0x0001, + 0x1d9e: 0x0001, 0x1d9f: 0x0001, 0x1da0: 0x0001, 0x1da1: 0x0001, 0x1da2: 0x0001, 0x1da3: 0x0001, + 0x1da4: 0x0001, 0x1da5: 0x0060, 0x1da6: 0x0060, 0x1da7: 0x0060, 0x1da8: 0x0060, 0x1da9: 0x0060, + 0x1daa: 0x0060, 0x1dab: 0x0001, 0x1dac: 0x0001, 0x1dad: 0x0001, 0x1dae: 0x0001, 0x1daf: 0x0001, + 0x1db0: 0x0001, 0x1db1: 0x0001, 0x1db2: 0x0001, 0x1db3: 0x0001, 0x1db4: 0x0010, 0x1db5: 0x0010, + 0x1db6: 0x0010, 0x1db7: 0x0010, 0x1db8: 0x0010, 0x1db9: 0x0060, 0x1dba: 0x0060, 0x1dbb: 0x0060, + 0x1dbc: 0x0060, 0x1dbd: 0x0060, 0x1dbe: 0x0060, 0x1dbf: 0x0060, + // Block 0x77, offset 0x1dc0 + 0x1dc0: 0x0001, 0x1dc1: 0x0001, 0x1dc2: 0x0001, 0x1dc3: 0x0001, 0x1dc4: 0x0001, 0x1dc5: 0x0001, + 0x1dc6: 0x0001, 0x1dc7: 0x0001, 0x1dc8: 0x0001, 0x1dc9: 0x0001, 0x1dca: 0x0001, 0x1dcb: 0x0001, + 0x1dcc: 0x0001, 0x1dcd: 0x0001, 0x1dce: 0x0001, 0x1dcf: 0x0001, 0x1dd0: 0x0001, 0x1dd1: 0x0001, + 0x1dd2: 0x0001, 0x1dd3: 0x0001, 0x1dd4: 0x0001, 0x1dd5: 0x0001, 0x1dd6: 0x0001, 0x1dd7: 0x0001, + 0x1dd8: 0x0001, 0x1dd9: 0x0001, 0x1dda: 0x0001, 0x1ddb: 0x0001, 0x1ddc: 0x0001, 0x1ddd: 0x0001, + 0x1dde: 0x0001, 0x1ddf: 0x0001, 0x1de0: 0x0001, 0x1de1: 0x0001, 0x1de2: 0x0001, 0x1de3: 0x0001, + 0x1de4: 0x0001, 0x1de5: 0x0001, 0x1de6: 0x0010, 0x1de7: 0x0001, 0x1de8: 0x0010, 0x1de9: 0x0010, + 0x1dea: 0x0010, 0x1deb: 0x0010, 0x1dec: 0x0010, 0x1ded: 0x0001, 0x1dee: 0x0010, 0x1def: 0x0010, + 0x1df0: 0x0001, 0x1df1: 0x0001, 0x1df2: 0x0001, 0x1df3: 0x0001, 0x1df4: 0x0001, 0x1df5: 0x0001, + 0x1df6: 0x0001, 0x1df7: 0x0001, 0x1df8: 0x0001, 0x1df9: 0x0001, 0x1dfa: 0x0001, 0x1dfb: 0x0001, + 0x1dfc: 0x0001, 0x1dfd: 0x0001, 0x1dfe: 0x0001, 0x1dff: 0x0001, + // Block 0x78, offset 0x1e00 + 0x1e00: 0x0001, 0x1e01: 0x0001, 0x1e02: 0x0001, 0x1e03: 0x0001, 0x1e04: 0x0001, 0x1e05: 0x0001, + 0x1e06: 0x0001, 0x1e07: 0x0001, 0x1e08: 0x0001, 0x1e09: 0x0001, 0x1e0a: 0x0001, 0x1e0b: 0x0001, + 0x1e0c: 0x0001, 0x1e0d: 0x0001, 0x1e0e: 0x0001, 0x1e0f: 0x0001, 0x1e10: 0x0001, 0x1e11: 0x0001, + 0x1e12: 0x0001, 0x1e13: 0x0001, 0x1e14: 0x0001, 0x1e15: 0x0001, 0x1e16: 0x0001, 0x1e17: 0x0001, + 0x1e18: 0x0001, 0x1e19: 0x0001, 0x1e1a: 0x0001, 0x1e1b: 0x0001, 0x1e1c: 0x0001, 0x1e1d: 0x0001, + 0x1e1e: 0x0001, 0x1e1f: 0x0001, 0x1e20: 0x0001, 0x1e21: 0x0001, 0x1e22: 0x0001, 0x1e23: 0x0001, + 0x1e24: 0x0001, 0x1e25: 0x0001, 0x1e26: 0x0001, 0x1e27: 0x0001, 0x1e28: 0x0010, 0x1e29: 0x0010, + 0x1e2a: 0x0010, 0x1e2b: 0x0010, 0x1e2c: 0x0010, 0x1e2d: 0x0010, 0x1e2e: 0x0010, 0x1e2f: 0x0060, + 0x1e30: 0x0060, 0x1e31: 0x0010, 0x1e32: 0x0010, 0x1e33: 0x0010, 0x1e34: 0x0010, 0x1e35: 0x0010, + 0x1e36: 0x0010, 0x1e37: 0x0010, 0x1e38: 0x0010, 0x1e39: 0x0010, 0x1e3a: 0x0010, 0x1e3b: 0x0010, + 0x1e3c: 0x0010, 0x1e3d: 0x0010, 0x1e3e: 0x0010, 0x1e3f: 0x0001, + // Block 0x79, offset 0x1e40 + 0x1e40: 0x0001, 0x1e41: 0x0001, 0x1e42: 0x0001, 0x1e43: 0x0001, 0x1e44: 0x0001, 0x1e45: 0x0001, + 0x1e46: 0x0001, 0x1e47: 0x0001, 0x1e48: 0x0001, 0x1e49: 0x0001, 0x1e4a: 0x0001, 0x1e4b: 0x0001, + 0x1e4c: 0x0001, 0x1e4d: 0x0001, 0x1e4e: 0x0001, 0x1e4f: 0x0001, 0x1e50: 0x0001, 0x1e51: 0x0001, + 0x1e52: 0x0001, 0x1e53: 0x0001, 0x1e54: 0x0001, 0x1e55: 0x0001, 0x1e56: 0x0001, 0x1e57: 0x0010, + 0x1e58: 0x0010, 0x1e59: 0x0010, 0x1e5a: 0x0010, 0x1e5b: 0x0010, 0x1e5c: 0x0010, 0x1e5d: 0x0010, + 0x1e5e: 0x0010, 0x1e5f: 0x0010, 0x1e60: 0x0001, 0x1e61: 0x0001, 0x1e62: 0x0001, 0x1e63: 0x0001, + 0x1e64: 0x0001, 0x1e65: 0x0001, 0x1e66: 0x0001, 0x1e67: 0x0010, 0x1e68: 0x0001, 0x1e69: 0x0001, + 0x1e6a: 0x0001, 0x1e6b: 0x0001, 0x1e6c: 0x0001, 0x1e6d: 0x0001, 0x1e6e: 0x0001, 0x1e6f: 0x0010, + 0x1e70: 0x0001, 0x1e71: 0x0001, 0x1e72: 0x0001, 0x1e73: 0x0001, 0x1e74: 0x0001, 0x1e75: 0x0001, + 0x1e76: 0x0001, 0x1e77: 0x0010, 0x1e78: 0x0001, 0x1e79: 0x0001, 0x1e7a: 0x0001, 0x1e7b: 0x0001, + 0x1e7c: 0x0001, 0x1e7d: 0x0001, 0x1e7e: 0x0001, 0x1e7f: 0x0010, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0x0001, 0x1e81: 0x0001, 0x1e82: 0x0001, 0x1e83: 0x0001, 0x1e84: 0x0001, 0x1e85: 0x0001, + 0x1e86: 0x0001, 0x1e87: 0x0010, 0x1e88: 0x0001, 0x1e89: 0x0001, 0x1e8a: 0x0001, 0x1e8b: 0x0001, + 0x1e8c: 0x0001, 0x1e8d: 0x0001, 0x1e8e: 0x0001, 0x1e8f: 0x0010, 0x1e90: 0x0001, 0x1e91: 0x0001, + 0x1e92: 0x0001, 0x1e93: 0x0001, 0x1e94: 0x0001, 0x1e95: 0x0001, 0x1e96: 0x0001, 0x1e97: 0x0010, + 0x1e98: 0x0001, 0x1e99: 0x0001, 0x1e9a: 0x0001, 0x1e9b: 0x0001, 0x1e9c: 0x0001, 0x1e9d: 0x0001, + 0x1e9e: 0x0001, 0x1e9f: 0x0010, 0x1ea0: 0x0001, 0x1ea1: 0x0001, 0x1ea2: 0x0001, 0x1ea3: 0x0001, + 0x1ea4: 0x0001, 0x1ea5: 0x0001, 0x1ea6: 0x0001, 0x1ea7: 0x0001, 0x1ea8: 0x0001, 0x1ea9: 0x0001, + 0x1eaa: 0x0001, 0x1eab: 0x0001, 0x1eac: 0x0001, 0x1ead: 0x0001, 0x1eae: 0x0001, 0x1eaf: 0x0001, + 0x1eb0: 0x0001, 0x1eb1: 0x0001, 0x1eb2: 0x0001, 0x1eb3: 0x0001, 0x1eb4: 0x0001, 0x1eb5: 0x0001, + 0x1eb6: 0x0001, 0x1eb7: 0x0001, 0x1eb8: 0x0001, 0x1eb9: 0x0001, 0x1eba: 0x0001, 0x1ebb: 0x0001, + 0x1ebc: 0x0001, 0x1ebd: 0x0001, 0x1ebe: 0x0001, 0x1ebf: 0x0001, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0x0060, 0x1ec1: 0x0060, 0x1ec2: 0x0060, 0x1ec3: 0x0060, 0x1ec4: 0x0060, 0x1ec5: 0x0060, + 0x1ec6: 0x0060, 0x1ec7: 0x0060, 0x1ec8: 0x0060, 0x1ec9: 0x0060, 0x1eca: 0x0060, 0x1ecb: 0x0060, + 0x1ecc: 0x0060, 0x1ecd: 0x0060, 0x1ece: 0x0060, 0x1ecf: 0x0060, 0x1ed0: 0x0060, 0x1ed1: 0x0060, + 0x1ed2: 0x0060, 0x1ed3: 0x0060, 0x1ed4: 0x0060, 0x1ed5: 0x0060, 0x1ed6: 0x0060, 0x1ed7: 0x0060, + 0x1ed8: 0x0060, 0x1ed9: 0x0060, 0x1eda: 0x0060, 0x1edb: 0x0060, 0x1edc: 0x0060, 0x1edd: 0x0060, + 0x1ede: 0x0060, 0x1edf: 0x0060, 0x1ee0: 0x0060, 0x1ee1: 0x0060, 0x1ee2: 0x0060, 0x1ee3: 0x0060, + 0x1ee4: 0x0060, 0x1ee5: 0x0060, 0x1ee6: 0x0060, 0x1ee7: 0x0060, 0x1ee8: 0x0060, 0x1ee9: 0x0060, + 0x1eea: 0x0060, 0x1eeb: 0x0060, 0x1eec: 0x0060, 0x1eed: 0x0060, 0x1eee: 0x0060, 0x1eef: 0x0001, + 0x1ef0: 0x0060, 0x1ef1: 0x0060, 0x1ef2: 0x0060, 0x1ef3: 0x0060, 0x1ef4: 0x0060, 0x1ef5: 0x0060, + 0x1ef6: 0x0060, 0x1ef7: 0x0060, 0x1ef8: 0x0060, 0x1ef9: 0x0060, 0x1efa: 0x0060, 0x1efb: 0x0060, + 0x1efc: 0x0060, 0x1efd: 0x0060, 0x1efe: 0x0060, 0x1eff: 0x0060, + // Block 0x7c, offset 0x1f00 + 0x1f00: 0x0060, 0x1f01: 0x0060, 0x1f02: 0x0060, 0x1f03: 0x0010, 0x1f04: 0x0010, 0x1f05: 0x0010, + 0x1f06: 0x0010, 0x1f07: 0x0010, 0x1f08: 0x0010, 0x1f09: 0x0010, 0x1f0a: 0x0010, 0x1f0b: 0x0010, + 0x1f0c: 0x0010, 0x1f0d: 0x0010, 0x1f0e: 0x0010, 0x1f0f: 0x0010, 0x1f10: 0x0010, 0x1f11: 0x0010, + 0x1f12: 0x0010, 0x1f13: 0x0010, 0x1f14: 0x0010, 0x1f15: 0x0010, 0x1f16: 0x0010, 0x1f17: 0x0010, + 0x1f18: 0x0010, 0x1f19: 0x0010, 0x1f1a: 0x0010, 0x1f1b: 0x0010, 0x1f1c: 0x0010, 0x1f1d: 0x0010, + 0x1f1e: 0x0010, 0x1f1f: 0x0010, 0x1f20: 0x0010, 0x1f21: 0x0010, 0x1f22: 0x0010, 0x1f23: 0x0010, + 0x1f24: 0x0010, 0x1f25: 0x0010, 0x1f26: 0x0010, 0x1f27: 0x0010, 0x1f28: 0x0010, 0x1f29: 0x0010, + 0x1f2a: 0x0010, 0x1f2b: 0x0010, 0x1f2c: 0x0010, 0x1f2d: 0x0010, 0x1f2e: 0x0010, 0x1f2f: 0x0010, + 0x1f30: 0x0010, 0x1f31: 0x0010, 0x1f32: 0x0010, 0x1f33: 0x0010, 0x1f34: 0x0010, 0x1f35: 0x0010, + 0x1f36: 0x0010, 0x1f37: 0x0010, 0x1f38: 0x0010, 0x1f39: 0x0010, 0x1f3a: 0x0010, 0x1f3b: 0x0010, + 0x1f3c: 0x0010, 0x1f3d: 0x0010, 0x1f3e: 0x0010, 0x1f3f: 0x0010, + // Block 0x7d, offset 0x1f40 + 0x1f40: 0x0060, 0x1f41: 0x0060, 0x1f42: 0x0060, 0x1f43: 0x0060, 0x1f44: 0x0060, 0x1f45: 0x0060, + 0x1f46: 0x0060, 0x1f47: 0x0060, 0x1f48: 0x0060, 0x1f49: 0x0060, 0x1f4a: 0x0060, 0x1f4b: 0x0060, + 0x1f4c: 0x0060, 0x1f4d: 0x0060, 0x1f4e: 0x0060, 0x1f4f: 0x0060, 0x1f50: 0x0060, 0x1f51: 0x0060, + 0x1f52: 0x0060, 0x1f53: 0x0060, 0x1f54: 0x0060, 0x1f55: 0x0060, 0x1f56: 0x0060, 0x1f57: 0x0060, + 0x1f58: 0x0060, 0x1f59: 0x0060, 0x1f5a: 0x0010, 0x1f5b: 0x0060, 0x1f5c: 0x0060, 0x1f5d: 0x0060, + 0x1f5e: 0x0060, 0x1f5f: 0x0060, 0x1f60: 0x0060, 0x1f61: 0x0060, 0x1f62: 0x0060, 0x1f63: 0x0060, + 0x1f64: 0x0060, 0x1f65: 0x0060, 0x1f66: 0x0060, 0x1f67: 0x0060, 0x1f68: 0x0060, 0x1f69: 0x0060, + 0x1f6a: 0x0060, 0x1f6b: 0x0060, 0x1f6c: 0x0060, 0x1f6d: 0x0060, 0x1f6e: 0x0060, 0x1f6f: 0x0060, + 0x1f70: 0x0060, 0x1f71: 0x0060, 0x1f72: 0x0060, 0x1f73: 0x0060, 0x1f74: 0x0060, 0x1f75: 0x0060, + 0x1f76: 0x0060, 0x1f77: 0x0060, 0x1f78: 0x0060, 0x1f79: 0x0060, 0x1f7a: 0x0060, 0x1f7b: 0x0060, + 0x1f7c: 0x0060, 0x1f7d: 0x0060, 0x1f7e: 0x0060, 0x1f7f: 0x0060, + // Block 0x7e, offset 0x1f80 + 0x1f80: 0x0060, 0x1f81: 0x0060, 0x1f82: 0x0060, 0x1f83: 0x0060, 0x1f84: 0x0060, 0x1f85: 0x0060, + 0x1f86: 0x0060, 0x1f87: 0x0060, 0x1f88: 0x0060, 0x1f89: 0x0060, 0x1f8a: 0x0060, 0x1f8b: 0x0060, + 0x1f8c: 0x0060, 0x1f8d: 0x0060, 0x1f8e: 0x0060, 0x1f8f: 0x0060, 0x1f90: 0x0060, 0x1f91: 0x0060, + 0x1f92: 0x0060, 0x1f93: 0x0060, 0x1f94: 0x0060, 0x1f95: 0x0060, 0x1f96: 0x0060, 0x1f97: 0x0060, + 0x1f98: 0x0060, 0x1f99: 0x0060, 0x1f9a: 0x0060, 0x1f9b: 0x0060, 0x1f9c: 0x0060, 0x1f9d: 0x0060, + 0x1f9e: 0x0060, 0x1f9f: 0x0060, 0x1fa0: 0x0060, 0x1fa1: 0x0060, 0x1fa2: 0x0060, 0x1fa3: 0x0060, + 0x1fa4: 0x0060, 0x1fa5: 0x0060, 0x1fa6: 0x0060, 0x1fa7: 0x0060, 0x1fa8: 0x0060, 0x1fa9: 0x0060, + 0x1faa: 0x0060, 0x1fab: 0x0060, 0x1fac: 0x0060, 0x1fad: 0x0060, 0x1fae: 0x0060, 0x1faf: 0x0060, + 0x1fb0: 0x0060, 0x1fb1: 0x0060, 0x1fb2: 0x0060, 0x1fb3: 0x0060, 0x1fb4: 0x0010, 0x1fb5: 0x0010, + 0x1fb6: 0x0010, 0x1fb7: 0x0010, 0x1fb8: 0x0010, 0x1fb9: 0x0010, 0x1fba: 0x0010, 0x1fbb: 0x0010, + 0x1fbc: 0x0010, 0x1fbd: 0x0010, 0x1fbe: 0x0010, 0x1fbf: 0x0010, + // Block 0x7f, offset 0x1fc0 + 0x1fc0: 0x0060, 0x1fc1: 0x0060, 0x1fc2: 0x0060, 0x1fc3: 0x0060, 0x1fc4: 0x0060, 0x1fc5: 0x0060, + 0x1fc6: 0x0060, 0x1fc7: 0x0060, 0x1fc8: 0x0060, 0x1fc9: 0x0060, 0x1fca: 0x0060, 0x1fcb: 0x0060, + 0x1fcc: 0x0060, 0x1fcd: 0x0060, 0x1fce: 0x0060, 0x1fcf: 0x0060, 0x1fd0: 0x0060, 0x1fd1: 0x0060, + 0x1fd2: 0x0060, 0x1fd3: 0x0060, 0x1fd4: 0x0060, 0x1fd5: 0x0060, 0x1fd6: 0x0010, 0x1fd7: 0x0010, + 0x1fd8: 0x0010, 0x1fd9: 0x0010, 0x1fda: 0x0010, 0x1fdb: 0x0010, 0x1fdc: 0x0010, 0x1fdd: 0x0010, + 0x1fde: 0x0010, 0x1fdf: 0x0010, 0x1fe0: 0x0010, 0x1fe1: 0x0010, 0x1fe2: 0x0010, 0x1fe3: 0x0010, + 0x1fe4: 0x0010, 0x1fe5: 0x0010, 0x1fe6: 0x0010, 0x1fe7: 0x0010, 0x1fe8: 0x0010, 0x1fe9: 0x0010, + 0x1fea: 0x0010, 0x1feb: 0x0010, 0x1fec: 0x0010, 0x1fed: 0x0010, 0x1fee: 0x0010, 0x1fef: 0x0010, + 0x1ff0: 0x0060, 0x1ff1: 0x0060, 0x1ff2: 0x0060, 0x1ff3: 0x0060, 0x1ff4: 0x0060, 0x1ff5: 0x0060, + 0x1ff6: 0x0060, 0x1ff7: 0x0060, 0x1ff8: 0x0060, 0x1ff9: 0x0060, 0x1ffa: 0x0060, 0x1ffb: 0x0060, + 0x1ffc: 0x0010, 0x1ffd: 0x0010, 0x1ffe: 0x0010, 0x1fff: 0x0010, + // Block 0x80, offset 0x2000 + 0x2000: 0x0060, 0x2001: 0x0060, 0x2002: 0x0060, 0x2003: 0x0060, 0x2004: 0x0060, 0x2005: 0x0001, + 0x2006: 0x0001, 0x2007: 0x0001, 0x2008: 0x0060, 0x2009: 0x0060, 0x200a: 0x0060, 0x200b: 0x0060, + 0x200c: 0x0060, 0x200d: 0x0060, 0x200e: 0x0060, 0x200f: 0x0060, 0x2010: 0x0060, 0x2011: 0x0060, + 0x2012: 0x0060, 0x2013: 0x0060, 0x2014: 0x0060, 0x2015: 0x0060, 0x2016: 0x0060, 0x2017: 0x0060, + 0x2018: 0x0060, 0x2019: 0x0060, 0x201a: 0x0060, 0x201b: 0x0060, 0x201c: 0x0060, 0x201d: 0x0060, + 0x201e: 0x0060, 0x201f: 0x0060, 0x2020: 0x0060, 0x2021: 0x0060, 0x2022: 0x0060, 0x2023: 0x0060, + 0x2024: 0x0060, 0x2025: 0x0060, 0x2026: 0x0060, 0x2027: 0x0060, 0x2028: 0x0060, 0x2029: 0x0060, + 0x202a: 0x0001, 0x202b: 0x0001, 0x202c: 0x0001, 0x202d: 0x0001, 0x202e: 0x0008, 0x202f: 0x0008, + 0x2030: 0x0060, 0x2031: 0x0008, 0x2032: 0x0008, 0x2033: 0x0008, 0x2034: 0x0008, 0x2035: 0x0008, + 0x2036: 0x0060, 0x2037: 0x0060, 0x2038: 0x0060, 0x2039: 0x0060, 0x203a: 0x0060, 0x203b: 0x0008, + 0x203c: 0x0001, 0x203d: 0x0060, 0x203e: 0x0060, 0x203f: 0x0060, + // Block 0x81, offset 0x2040 + 0x2040: 0x0010, 0x2041: 0x0001, 0x2042: 0x0001, 0x2043: 0x0001, 0x2044: 0x0001, 0x2045: 0x0001, + 0x2046: 0x0001, 0x2047: 0x0001, 0x2048: 0x0001, 0x2049: 0x0001, 0x204a: 0x0001, 0x204b: 0x0001, + 0x204c: 0x0001, 0x204d: 0x0001, 0x204e: 0x0001, 0x204f: 0x0001, 0x2050: 0x0001, 0x2051: 0x0001, + 0x2052: 0x0001, 0x2053: 0x0001, 0x2054: 0x0001, 0x2055: 0x0001, 0x2056: 0x0001, 0x2057: 0x0001, + 0x2058: 0x0001, 0x2059: 0x0001, 0x205a: 0x0001, 0x205b: 0x0001, 0x205c: 0x0001, 0x205d: 0x0001, + 0x205e: 0x0001, 0x205f: 0x0001, 0x2060: 0x0001, 0x2061: 0x0001, 0x2062: 0x0001, 0x2063: 0x0001, + 0x2064: 0x0001, 0x2065: 0x0001, 0x2066: 0x0001, 0x2067: 0x0001, 0x2068: 0x0001, 0x2069: 0x0001, + 0x206a: 0x0001, 0x206b: 0x0001, 0x206c: 0x0001, 0x206d: 0x0001, 0x206e: 0x0001, 0x206f: 0x0001, + 0x2070: 0x0001, 0x2071: 0x0001, 0x2072: 0x0001, 0x2073: 0x0001, 0x2074: 0x0001, 0x2075: 0x0001, + 0x2076: 0x0001, 0x2077: 0x0001, 0x2078: 0x0001, 0x2079: 0x0001, 0x207a: 0x0001, 0x207b: 0x0001, + 0x207c: 0x0001, 0x207d: 0x0001, 0x207e: 0x0001, 0x207f: 0x0001, + // Block 0x82, offset 0x2080 + 0x2080: 0x0001, 0x2081: 0x0001, 0x2082: 0x0001, 0x2083: 0x0001, 0x2084: 0x0001, 0x2085: 0x0001, + 0x2086: 0x0001, 0x2087: 0x0001, 0x2088: 0x0001, 0x2089: 0x0001, 0x208a: 0x0001, 0x208b: 0x0001, + 0x208c: 0x0001, 0x208d: 0x0001, 0x208e: 0x0001, 0x208f: 0x0001, 0x2090: 0x0001, 0x2091: 0x0001, + 0x2092: 0x0001, 0x2093: 0x0001, 0x2094: 0x0001, 0x2095: 0x0001, 0x2096: 0x0001, 0x2097: 0x0010, + 0x2098: 0x0010, 0x2099: 0x0001, 0x209a: 0x0001, 0x209b: 0x0060, 0x209c: 0x0060, 0x209d: 0x0001, + 0x209e: 0x0001, 0x209f: 0x0060, 0x20a0: 0x0060, 0x20a1: 0x0001, 0x20a2: 0x0001, 0x20a3: 0x0001, + 0x20a4: 0x0001, 0x20a5: 0x0001, 0x20a6: 0x0001, 0x20a7: 0x0001, 0x20a8: 0x0001, 0x20a9: 0x0001, + 0x20aa: 0x0001, 0x20ab: 0x0001, 0x20ac: 0x0001, 0x20ad: 0x0001, 0x20ae: 0x0001, 0x20af: 0x0001, + 0x20b0: 0x0001, 0x20b1: 0x0001, 0x20b2: 0x0001, 0x20b3: 0x0001, 0x20b4: 0x0001, 0x20b5: 0x0001, + 0x20b6: 0x0001, 0x20b7: 0x0001, 0x20b8: 0x0001, 0x20b9: 0x0001, 0x20ba: 0x0001, 0x20bb: 0x0001, + 0x20bc: 0x0001, 0x20bd: 0x0001, 0x20be: 0x0001, 0x20bf: 0x0001, + // Block 0x83, offset 0x20c0 + 0x20c0: 0x0001, 0x20c1: 0x0001, 0x20c2: 0x0001, 0x20c3: 0x0001, 0x20c4: 0x0001, 0x20c5: 0x0001, + 0x20c6: 0x0001, 0x20c7: 0x0001, 0x20c8: 0x0001, 0x20c9: 0x0001, 0x20ca: 0x0001, 0x20cb: 0x0001, + 0x20cc: 0x0001, 0x20cd: 0x0001, 0x20ce: 0x0001, 0x20cf: 0x0001, 0x20d0: 0x0001, 0x20d1: 0x0001, + 0x20d2: 0x0001, 0x20d3: 0x0001, 0x20d4: 0x0001, 0x20d5: 0x0001, 0x20d6: 0x0001, 0x20d7: 0x0001, + 0x20d8: 0x0001, 0x20d9: 0x0001, 0x20da: 0x0001, 0x20db: 0x0001, 0x20dc: 0x0001, 0x20dd: 0x0001, + 0x20de: 0x0001, 0x20df: 0x0001, 0x20e0: 0x0001, 0x20e1: 0x0001, 0x20e2: 0x0001, 0x20e3: 0x0001, + 0x20e4: 0x0001, 0x20e5: 0x0001, 0x20e6: 0x0001, 0x20e7: 0x0001, 0x20e8: 0x0001, 0x20e9: 0x0001, + 0x20ea: 0x0001, 0x20eb: 0x0001, 0x20ec: 0x0001, 0x20ed: 0x0001, 0x20ee: 0x0001, 0x20ef: 0x0001, + 0x20f0: 0x0001, 0x20f1: 0x0001, 0x20f2: 0x0001, 0x20f3: 0x0001, 0x20f4: 0x0001, 0x20f5: 0x0001, + 0x20f6: 0x0001, 0x20f7: 0x0001, 0x20f8: 0x0001, 0x20f9: 0x0001, 0x20fa: 0x0001, 0x20fb: 0x0002, + 0x20fc: 0x0001, 0x20fd: 0x0001, 0x20fe: 0x0001, 0x20ff: 0x0060, + // Block 0x84, offset 0x2100 + 0x2100: 0x0010, 0x2101: 0x0010, 0x2102: 0x0010, 0x2103: 0x0010, 0x2104: 0x0010, 0x2105: 0x0001, + 0x2106: 0x0001, 0x2107: 0x0001, 0x2108: 0x0001, 0x2109: 0x0001, 0x210a: 0x0001, 0x210b: 0x0001, + 0x210c: 0x0001, 0x210d: 0x0001, 0x210e: 0x0001, 0x210f: 0x0001, 0x2110: 0x0001, 0x2111: 0x0001, + 0x2112: 0x0001, 0x2113: 0x0001, 0x2114: 0x0001, 0x2115: 0x0001, 0x2116: 0x0001, 0x2117: 0x0001, + 0x2118: 0x0001, 0x2119: 0x0001, 0x211a: 0x0001, 0x211b: 0x0001, 0x211c: 0x0001, 0x211d: 0x0001, + 0x211e: 0x0001, 0x211f: 0x0001, 0x2120: 0x0001, 0x2121: 0x0001, 0x2122: 0x0001, 0x2123: 0x0001, + 0x2124: 0x0001, 0x2125: 0x0001, 0x2126: 0x0001, 0x2127: 0x0001, 0x2128: 0x0001, 0x2129: 0x0001, + 0x212a: 0x0001, 0x212b: 0x0001, 0x212c: 0x0001, 0x212d: 0x0001, 0x212e: 0x0010, 0x212f: 0x0010, + 0x2130: 0x0010, 0x2131: 0x0060, 0x2132: 0x0060, 0x2133: 0x0060, 0x2134: 0x0060, 0x2135: 0x0060, + 0x2136: 0x0060, 0x2137: 0x0060, 0x2138: 0x0060, 0x2139: 0x0060, 0x213a: 0x0060, 0x213b: 0x0060, + 0x213c: 0x0060, 0x213d: 0x0060, 0x213e: 0x0060, 0x213f: 0x0060, + // Block 0x85, offset 0x2140 + 0x2140: 0x0060, 0x2141: 0x0060, 0x2142: 0x0060, 0x2143: 0x0060, 0x2144: 0x0060, 0x2145: 0x0060, + 0x2146: 0x0060, 0x2147: 0x0060, 0x2148: 0x0060, 0x2149: 0x0060, 0x214a: 0x0060, 0x214b: 0x0060, + 0x214c: 0x0060, 0x214d: 0x0060, 0x214e: 0x0060, 0x214f: 0x0060, 0x2150: 0x0060, 0x2151: 0x0060, + 0x2152: 0x0060, 0x2153: 0x0060, 0x2154: 0x0060, 0x2155: 0x0060, 0x2156: 0x0060, 0x2157: 0x0060, + 0x2158: 0x0060, 0x2159: 0x0060, 0x215a: 0x0060, 0x215b: 0x0060, 0x215c: 0x0060, 0x215d: 0x0060, + 0x215e: 0x0060, 0x215f: 0x0060, 0x2160: 0x0060, 0x2161: 0x0060, 0x2162: 0x0060, 0x2163: 0x0060, + 0x2164: 0x0008, 0x2165: 0x0060, 0x2166: 0x0060, 0x2167: 0x0060, 0x2168: 0x0060, 0x2169: 0x0060, + 0x216a: 0x0060, 0x216b: 0x0060, 0x216c: 0x0060, 0x216d: 0x0060, 0x216e: 0x0060, 0x216f: 0x0060, + 0x2170: 0x0060, 0x2171: 0x0060, 0x2172: 0x0060, 0x2173: 0x0060, 0x2174: 0x0060, 0x2175: 0x0060, + 0x2176: 0x0060, 0x2177: 0x0060, 0x2178: 0x0060, 0x2179: 0x0060, 0x217a: 0x0060, 0x217b: 0x0060, + 0x217c: 0x0060, 0x217d: 0x0060, 0x217e: 0x0060, 0x217f: 0x0060, + // Block 0x86, offset 0x2180 + 0x2180: 0x0060, 0x2181: 0x0060, 0x2182: 0x0060, 0x2183: 0x0060, 0x2184: 0x0060, 0x2185: 0x0060, + 0x2186: 0x0060, 0x2187: 0x0060, 0x2188: 0x0060, 0x2189: 0x0060, 0x218a: 0x0060, 0x218b: 0x0060, + 0x218c: 0x0060, 0x218d: 0x0060, 0x218e: 0x0060, 0x218f: 0x0010, 0x2190: 0x0060, 0x2191: 0x0060, + 0x2192: 0x0060, 0x2193: 0x0060, 0x2194: 0x0060, 0x2195: 0x0060, 0x2196: 0x0060, 0x2197: 0x0060, + 0x2198: 0x0060, 0x2199: 0x0060, 0x219a: 0x0060, 0x219b: 0x0060, 0x219c: 0x0060, 0x219d: 0x0060, + 0x219e: 0x0060, 0x219f: 0x0060, 0x21a0: 0x0001, 0x21a1: 0x0001, 0x21a2: 0x0001, 0x21a3: 0x0001, + 0x21a4: 0x0001, 0x21a5: 0x0001, 0x21a6: 0x0001, 0x21a7: 0x0001, 0x21a8: 0x0001, 0x21a9: 0x0001, + 0x21aa: 0x0001, 0x21ab: 0x0001, 0x21ac: 0x0001, 0x21ad: 0x0001, 0x21ae: 0x0001, 0x21af: 0x0001, + 0x21b0: 0x0001, 0x21b1: 0x0001, 0x21b2: 0x0001, 0x21b3: 0x0001, 0x21b4: 0x0001, 0x21b5: 0x0001, + 0x21b6: 0x0001, 0x21b7: 0x0001, 0x21b8: 0x0001, 0x21b9: 0x0001, 0x21ba: 0x0001, 0x21bb: 0x0010, + 0x21bc: 0x0010, 0x21bd: 0x0010, 0x21be: 0x0010, 0x21bf: 0x0010, + // Block 0x87, offset 0x21c0 + 0x21c0: 0x0060, 0x21c1: 0x0060, 0x21c2: 0x0060, 0x21c3: 0x0060, 0x21c4: 0x0060, 0x21c5: 0x0060, + 0x21c6: 0x0060, 0x21c7: 0x0060, 0x21c8: 0x0060, 0x21c9: 0x0060, 0x21ca: 0x0060, 0x21cb: 0x0060, + 0x21cc: 0x0060, 0x21cd: 0x0060, 0x21ce: 0x0060, 0x21cf: 0x0060, 0x21d0: 0x0060, 0x21d1: 0x0060, + 0x21d2: 0x0060, 0x21d3: 0x0060, 0x21d4: 0x0060, 0x21d5: 0x0060, 0x21d6: 0x0060, 0x21d7: 0x0060, + 0x21d8: 0x0060, 0x21d9: 0x0060, 0x21da: 0x0060, 0x21db: 0x0060, 0x21dc: 0x0060, 0x21dd: 0x0060, + 0x21de: 0x0060, 0x21df: 0x0060, 0x21e0: 0x0060, 0x21e1: 0x0060, 0x21e2: 0x0060, 0x21e3: 0x0060, + 0x21e4: 0x0010, 0x21e5: 0x0010, 0x21e6: 0x0010, 0x21e7: 0x0010, 0x21e8: 0x0010, 0x21e9: 0x0010, + 0x21ea: 0x0010, 0x21eb: 0x0010, 0x21ec: 0x0010, 0x21ed: 0x0010, 0x21ee: 0x0010, 0x21ef: 0x0010, + 0x21f0: 0x0001, 0x21f1: 0x0001, 0x21f2: 0x0001, 0x21f3: 0x0001, 0x21f4: 0x0001, 0x21f5: 0x0001, + 0x21f6: 0x0001, 0x21f7: 0x0001, 0x21f8: 0x0001, 0x21f9: 0x0001, 0x21fa: 0x0001, 0x21fb: 0x0001, + 0x21fc: 0x0001, 0x21fd: 0x0001, 0x21fe: 0x0001, 0x21ff: 0x0001, + // Block 0x88, offset 0x2200 + 0x2200: 0x0060, 0x2201: 0x0060, 0x2202: 0x0060, 0x2203: 0x0060, 0x2204: 0x0060, 0x2205: 0x0060, + 0x2206: 0x0060, 0x2207: 0x0060, 0x2208: 0x0060, 0x2209: 0x0060, 0x220a: 0x0060, 0x220b: 0x0060, + 0x220c: 0x0060, 0x220d: 0x0060, 0x220e: 0x0060, 0x220f: 0x0060, 0x2210: 0x0060, 0x2211: 0x0060, + 0x2212: 0x0060, 0x2213: 0x0060, 0x2214: 0x0060, 0x2215: 0x0060, 0x2216: 0x0060, 0x2217: 0x0060, + 0x2218: 0x0060, 0x2219: 0x0060, 0x221a: 0x0060, 0x221b: 0x0060, 0x221c: 0x0060, 0x221d: 0x0060, + 0x221e: 0x0060, 0x221f: 0x0010, 0x2220: 0x0060, 0x2221: 0x0060, 0x2222: 0x0060, 0x2223: 0x0060, + 0x2224: 0x0060, 0x2225: 0x0060, 0x2226: 0x0060, 0x2227: 0x0060, 0x2228: 0x0060, 0x2229: 0x0060, + 0x222a: 0x0060, 0x222b: 0x0060, 0x222c: 0x0060, 0x222d: 0x0060, 0x222e: 0x0060, 0x222f: 0x0060, + 0x2230: 0x0060, 0x2231: 0x0060, 0x2232: 0x0060, 0x2233: 0x0060, 0x2234: 0x0060, 0x2235: 0x0060, + 0x2236: 0x0060, 0x2237: 0x0060, 0x2238: 0x0060, 0x2239: 0x0060, 0x223a: 0x0060, 0x223b: 0x0060, + 0x223c: 0x0060, 0x223d: 0x0060, 0x223e: 0x0060, 0x223f: 0x0060, + // Block 0x89, offset 0x2240 + 0x2240: 0x0060, 0x2241: 0x0060, 0x2242: 0x0060, 0x2243: 0x0060, 0x2244: 0x0060, 0x2245: 0x0060, + 0x2246: 0x0060, 0x2247: 0x0060, 0x2248: 0x0060, 0x2249: 0x0060, 0x224a: 0x0060, 0x224b: 0x0060, + 0x224c: 0x0060, 0x224d: 0x0060, 0x224e: 0x0060, 0x224f: 0x0060, 0x2250: 0x0060, 0x2251: 0x0060, + 0x2252: 0x0060, 0x2253: 0x0060, 0x2254: 0x0060, 0x2255: 0x0060, 0x2256: 0x0060, 0x2257: 0x0060, + 0x2258: 0x0060, 0x2259: 0x0060, 0x225a: 0x0060, 0x225b: 0x0060, 0x225c: 0x0060, 0x225d: 0x0060, + 0x225e: 0x0060, 0x225f: 0x0060, 0x2260: 0x0060, 0x2261: 0x0060, 0x2262: 0x0060, 0x2263: 0x0060, + 0x2264: 0x0060, 0x2265: 0x0060, 0x2266: 0x0060, 0x2267: 0x0060, 0x2268: 0x0060, 0x2269: 0x0060, + 0x226a: 0x0060, 0x226b: 0x0060, 0x226c: 0x0060, 0x226d: 0x0060, 0x226e: 0x0060, 0x226f: 0x0060, + 0x2270: 0x0060, 0x2271: 0x0060, 0x2272: 0x0060, 0x2273: 0x0060, 0x2274: 0x0060, 0x2275: 0x0060, + 0x2276: 0x0060, 0x2277: 0x0060, 0x2278: 0x0060, 0x2279: 0x0060, 0x227a: 0x0060, 0x227b: 0x0060, + 0x227c: 0x0060, 0x227d: 0x0060, 0x227e: 0x0060, 0x227f: 0x0010, + // Block 0x8a, offset 0x2280 + 0x2280: 0x0001, 0x2281: 0x0001, 0x2282: 0x0001, 0x2283: 0x0001, 0x2284: 0x0001, 0x2285: 0x0001, + 0x2286: 0x0001, 0x2287: 0x0001, 0x2288: 0x0001, 0x2289: 0x0001, 0x228a: 0x0001, 0x228b: 0x0001, + 0x228c: 0x0001, 0x228d: 0x0001, 0x228e: 0x0001, 0x228f: 0x0001, 0x2290: 0x0001, 0x2291: 0x0001, + 0x2292: 0x0001, 0x2293: 0x0001, 0x2294: 0x0001, 0x2295: 0x0001, 0x2296: 0x0010, 0x2297: 0x0010, + 0x2298: 0x0010, 0x2299: 0x0010, 0x229a: 0x0010, 0x229b: 0x0010, 0x229c: 0x0010, 0x229d: 0x0010, + 0x229e: 0x0010, 0x229f: 0x0010, 0x22a0: 0x0010, 0x22a1: 0x0010, 0x22a2: 0x0010, 0x22a3: 0x0010, + 0x22a4: 0x0010, 0x22a5: 0x0010, 0x22a6: 0x0010, 0x22a7: 0x0010, 0x22a8: 0x0010, 0x22a9: 0x0010, + 0x22aa: 0x0010, 0x22ab: 0x0010, 0x22ac: 0x0010, 0x22ad: 0x0010, 0x22ae: 0x0010, 0x22af: 0x0010, + 0x22b0: 0x0010, 0x22b1: 0x0010, 0x22b2: 0x0010, 0x22b3: 0x0010, 0x22b4: 0x0010, 0x22b5: 0x0010, + 0x22b6: 0x0010, 0x22b7: 0x0010, 0x22b8: 0x0010, 0x22b9: 0x0010, 0x22ba: 0x0010, 0x22bb: 0x0010, + 0x22bc: 0x0010, 0x22bd: 0x0010, 0x22be: 0x0010, 0x22bf: 0x0010, + // Block 0x8b, offset 0x22c0 + 0x22c0: 0x0001, 0x22c1: 0x0001, 0x22c2: 0x0001, 0x22c3: 0x0001, 0x22c4: 0x0001, 0x22c5: 0x0001, + 0x22c6: 0x0001, 0x22c7: 0x0001, 0x22c8: 0x0001, 0x22c9: 0x0001, 0x22ca: 0x0001, 0x22cb: 0x0001, + 0x22cc: 0x0001, 0x22cd: 0x0010, 0x22ce: 0x0010, 0x22cf: 0x0010, 0x22d0: 0x0060, 0x22d1: 0x0060, + 0x22d2: 0x0060, 0x22d3: 0x0060, 0x22d4: 0x0060, 0x22d5: 0x0060, 0x22d6: 0x0060, 0x22d7: 0x0060, + 0x22d8: 0x0060, 0x22d9: 0x0060, 0x22da: 0x0060, 0x22db: 0x0060, 0x22dc: 0x0060, 0x22dd: 0x0060, + 0x22de: 0x0060, 0x22df: 0x0060, 0x22e0: 0x0060, 0x22e1: 0x0060, 0x22e2: 0x0060, 0x22e3: 0x0060, + 0x22e4: 0x0060, 0x22e5: 0x0060, 0x22e6: 0x0060, 0x22e7: 0x0060, 0x22e8: 0x0060, 0x22e9: 0x0060, + 0x22ea: 0x0060, 0x22eb: 0x0060, 0x22ec: 0x0060, 0x22ed: 0x0060, 0x22ee: 0x0060, 0x22ef: 0x0060, + 0x22f0: 0x0060, 0x22f1: 0x0060, 0x22f2: 0x0060, 0x22f3: 0x0060, 0x22f4: 0x0060, 0x22f5: 0x0060, + 0x22f6: 0x0060, 0x22f7: 0x0060, 0x22f8: 0x0060, 0x22f9: 0x0060, 0x22fa: 0x0060, 0x22fb: 0x0060, + 0x22fc: 0x0060, 0x22fd: 0x0060, 0x22fe: 0x0060, 0x22ff: 0x0060, + // Block 0x8c, offset 0x2300 + 0x2300: 0x0060, 0x2301: 0x0060, 0x2302: 0x0060, 0x2303: 0x0060, 0x2304: 0x0060, 0x2305: 0x0060, + 0x2306: 0x0060, 0x2307: 0x0010, 0x2308: 0x0010, 0x2309: 0x0010, 0x230a: 0x0010, 0x230b: 0x0010, + 0x230c: 0x0010, 0x230d: 0x0010, 0x230e: 0x0010, 0x230f: 0x0010, 0x2310: 0x0001, 0x2311: 0x0001, + 0x2312: 0x0001, 0x2313: 0x0001, 0x2314: 0x0001, 0x2315: 0x0001, 0x2316: 0x0001, 0x2317: 0x0001, + 0x2318: 0x0001, 0x2319: 0x0001, 0x231a: 0x0001, 0x231b: 0x0001, 0x231c: 0x0001, 0x231d: 0x0001, + 0x231e: 0x0001, 0x231f: 0x0001, 0x2320: 0x0001, 0x2321: 0x0001, 0x2322: 0x0001, 0x2323: 0x0001, + 0x2324: 0x0001, 0x2325: 0x0001, 0x2326: 0x0001, 0x2327: 0x0001, 0x2328: 0x0001, 0x2329: 0x0001, + 0x232a: 0x0001, 0x232b: 0x0001, 0x232c: 0x0001, 0x232d: 0x0001, 0x232e: 0x0001, 0x232f: 0x0001, + 0x2330: 0x0001, 0x2331: 0x0001, 0x2332: 0x0001, 0x2333: 0x0001, 0x2334: 0x0001, 0x2335: 0x0001, + 0x2336: 0x0001, 0x2337: 0x0001, 0x2338: 0x0001, 0x2339: 0x0001, 0x233a: 0x0001, 0x233b: 0x0001, + 0x233c: 0x0001, 0x233d: 0x0001, 0x233e: 0x0060, 0x233f: 0x0060, + // Block 0x8d, offset 0x2340 + 0x2340: 0x0001, 0x2341: 0x0001, 0x2342: 0x0001, 0x2343: 0x0001, 0x2344: 0x0001, 0x2345: 0x0001, + 0x2346: 0x0001, 0x2347: 0x0001, 0x2348: 0x0001, 0x2349: 0x0001, 0x234a: 0x0001, 0x234b: 0x0001, + 0x234c: 0x0001, 0x234d: 0x0060, 0x234e: 0x0060, 0x234f: 0x0060, 0x2350: 0x0001, 0x2351: 0x0001, + 0x2352: 0x0001, 0x2353: 0x0001, 0x2354: 0x0001, 0x2355: 0x0001, 0x2356: 0x0001, 0x2357: 0x0001, + 0x2358: 0x0001, 0x2359: 0x0001, 0x235a: 0x0001, 0x235b: 0x0001, 0x235c: 0x0001, 0x235d: 0x0001, + 0x235e: 0x0001, 0x235f: 0x0001, 0x2360: 0x0001, 0x2361: 0x0001, 0x2362: 0x0001, 0x2363: 0x0001, + 0x2364: 0x0001, 0x2365: 0x0001, 0x2366: 0x0001, 0x2367: 0x0001, 0x2368: 0x0001, 0x2369: 0x0001, + 0x236a: 0x0001, 0x236b: 0x0001, 0x236c: 0x0010, 0x236d: 0x0010, 0x236e: 0x0010, 0x236f: 0x0010, + 0x2370: 0x0010, 0x2371: 0x0010, 0x2372: 0x0010, 0x2373: 0x0010, 0x2374: 0x0010, 0x2375: 0x0010, + 0x2376: 0x0010, 0x2377: 0x0010, 0x2378: 0x0010, 0x2379: 0x0010, 0x237a: 0x0010, 0x237b: 0x0010, + 0x237c: 0x0010, 0x237d: 0x0010, 0x237e: 0x0010, 0x237f: 0x0010, + // Block 0x8e, offset 0x2380 + 0x2380: 0x0001, 0x2381: 0x0001, 0x2382: 0x0001, 0x2383: 0x0001, 0x2384: 0x0001, 0x2385: 0x0001, + 0x2386: 0x0001, 0x2387: 0x0001, 0x2388: 0x0001, 0x2389: 0x0001, 0x238a: 0x0001, 0x238b: 0x0001, + 0x238c: 0x0001, 0x238d: 0x0001, 0x238e: 0x0001, 0x238f: 0x0001, 0x2390: 0x0001, 0x2391: 0x0001, + 0x2392: 0x0001, 0x2393: 0x0001, 0x2394: 0x0001, 0x2395: 0x0001, 0x2396: 0x0001, 0x2397: 0x0001, + 0x2398: 0x0001, 0x2399: 0x0001, 0x239a: 0x0001, 0x239b: 0x0001, 0x239c: 0x0001, 0x239d: 0x0001, + 0x239e: 0x0001, 0x239f: 0x0001, 0x23a0: 0x0001, 0x23a1: 0x0001, 0x23a2: 0x0001, 0x23a3: 0x0001, + 0x23a4: 0x0001, 0x23a5: 0x0001, 0x23a6: 0x0001, 0x23a7: 0x0001, 0x23a8: 0x0001, 0x23a9: 0x0001, + 0x23aa: 0x0001, 0x23ab: 0x0001, 0x23ac: 0x0001, 0x23ad: 0x0001, 0x23ae: 0x0001, 0x23af: 0x0001, + 0x23b0: 0x0060, 0x23b1: 0x0060, 0x23b2: 0x0060, 0x23b3: 0x0060, 0x23b4: 0x0001, 0x23b5: 0x0001, + 0x23b6: 0x0001, 0x23b7: 0x0001, 0x23b8: 0x0001, 0x23b9: 0x0001, 0x23ba: 0x0001, 0x23bb: 0x0001, + 0x23bc: 0x0001, 0x23bd: 0x0001, 0x23be: 0x0060, 0x23bf: 0x0001, + // Block 0x8f, offset 0x23c0 + 0x23c0: 0x0001, 0x23c1: 0x0001, 0x23c2: 0x0001, 0x23c3: 0x0001, 0x23c4: 0x0001, 0x23c5: 0x0001, + 0x23c6: 0x0001, 0x23c7: 0x0001, 0x23c8: 0x0001, 0x23c9: 0x0001, 0x23ca: 0x0001, 0x23cb: 0x0001, + 0x23cc: 0x0001, 0x23cd: 0x0001, 0x23ce: 0x0001, 0x23cf: 0x0001, 0x23d0: 0x0001, 0x23d1: 0x0001, + 0x23d2: 0x0001, 0x23d3: 0x0001, 0x23d4: 0x0001, 0x23d5: 0x0001, 0x23d6: 0x0001, 0x23d7: 0x0001, + 0x23d8: 0x0001, 0x23d9: 0x0001, 0x23da: 0x0001, 0x23db: 0x0001, 0x23dc: 0x0060, 0x23dd: 0x0060, + 0x23de: 0x0001, 0x23df: 0x0001, 0x23e0: 0x0001, 0x23e1: 0x0001, 0x23e2: 0x0001, 0x23e3: 0x0001, + 0x23e4: 0x0001, 0x23e5: 0x0001, 0x23e6: 0x0001, 0x23e7: 0x0001, 0x23e8: 0x0001, 0x23e9: 0x0001, + 0x23ea: 0x0001, 0x23eb: 0x0001, 0x23ec: 0x0001, 0x23ed: 0x0001, 0x23ee: 0x0001, 0x23ef: 0x0001, + 0x23f0: 0x0001, 0x23f1: 0x0001, 0x23f2: 0x0001, 0x23f3: 0x0001, 0x23f4: 0x0001, 0x23f5: 0x0001, + 0x23f6: 0x0001, 0x23f7: 0x0001, 0x23f8: 0x0001, 0x23f9: 0x0001, 0x23fa: 0x0001, 0x23fb: 0x0001, + 0x23fc: 0x0001, 0x23fd: 0x0001, 0x23fe: 0x0001, 0x23ff: 0x0001, + // Block 0x90, offset 0x2400 + 0x2400: 0x0001, 0x2401: 0x0001, 0x2402: 0x0001, 0x2403: 0x0001, 0x2404: 0x0001, 0x2405: 0x0001, + 0x2406: 0x0001, 0x2407: 0x0001, 0x2408: 0x0001, 0x2409: 0x0001, 0x240a: 0x0001, 0x240b: 0x0001, + 0x240c: 0x0001, 0x240d: 0x0001, 0x240e: 0x0001, 0x240f: 0x0001, 0x2410: 0x0001, 0x2411: 0x0001, + 0x2412: 0x0001, 0x2413: 0x0001, 0x2414: 0x0001, 0x2415: 0x0001, 0x2416: 0x0001, 0x2417: 0x0001, + 0x2418: 0x0001, 0x2419: 0x0001, 0x241a: 0x0001, 0x241b: 0x0001, 0x241c: 0x0001, 0x241d: 0x0001, + 0x241e: 0x0001, 0x241f: 0x0001, 0x2420: 0x0001, 0x2421: 0x0001, 0x2422: 0x0001, 0x2423: 0x0001, + 0x2424: 0x0001, 0x2425: 0x0001, 0x2426: 0x0060, 0x2427: 0x0060, 0x2428: 0x0060, 0x2429: 0x0060, + 0x242a: 0x0060, 0x242b: 0x0060, 0x242c: 0x0060, 0x242d: 0x0060, 0x242e: 0x0060, 0x242f: 0x0060, + 0x2430: 0x0001, 0x2431: 0x0001, 0x2432: 0x0060, 0x2433: 0x0060, 0x2434: 0x0060, 0x2435: 0x0060, + 0x2436: 0x0060, 0x2437: 0x0060, 0x2438: 0x0010, 0x2439: 0x0010, 0x243a: 0x0010, 0x243b: 0x0010, + 0x243c: 0x0010, 0x243d: 0x0010, 0x243e: 0x0010, 0x243f: 0x0010, + // Block 0x91, offset 0x2440 + 0x2440: 0x0060, 0x2441: 0x0060, 0x2442: 0x0060, 0x2443: 0x0060, 0x2444: 0x0060, 0x2445: 0x0060, + 0x2446: 0x0060, 0x2447: 0x0060, 0x2448: 0x0060, 0x2449: 0x0060, 0x244a: 0x0060, 0x244b: 0x0060, + 0x244c: 0x0060, 0x244d: 0x0060, 0x244e: 0x0060, 0x244f: 0x0060, 0x2450: 0x0060, 0x2451: 0x0060, + 0x2452: 0x0060, 0x2453: 0x0060, 0x2454: 0x0060, 0x2455: 0x0060, 0x2456: 0x0060, 0x2457: 0x0001, + 0x2458: 0x0001, 0x2459: 0x0001, 0x245a: 0x0001, 0x245b: 0x0001, 0x245c: 0x0001, 0x245d: 0x0001, + 0x245e: 0x0001, 0x245f: 0x0001, 0x2460: 0x0060, 0x2461: 0x0060, 0x2462: 0x0001, 0x2463: 0x0001, + 0x2464: 0x0001, 0x2465: 0x0001, 0x2466: 0x0001, 0x2467: 0x0001, 0x2468: 0x0001, 0x2469: 0x0001, + 0x246a: 0x0001, 0x246b: 0x0001, 0x246c: 0x0001, 0x246d: 0x0001, 0x246e: 0x0001, 0x246f: 0x0001, + 0x2470: 0x0001, 0x2471: 0x0001, 0x2472: 0x0001, 0x2473: 0x0001, 0x2474: 0x0001, 0x2475: 0x0001, + 0x2476: 0x0001, 0x2477: 0x0001, 0x2478: 0x0001, 0x2479: 0x0001, 0x247a: 0x0001, 0x247b: 0x0001, + 0x247c: 0x0001, 0x247d: 0x0001, 0x247e: 0x0001, 0x247f: 0x0001, + // Block 0x92, offset 0x2480 + 0x2480: 0x0001, 0x2481: 0x0001, 0x2482: 0x0001, 0x2483: 0x0001, 0x2484: 0x0001, 0x2485: 0x0001, + 0x2486: 0x0001, 0x2487: 0x0001, 0x2488: 0x0001, 0x2489: 0x0001, 0x248a: 0x0001, 0x248b: 0x0001, + 0x248c: 0x0001, 0x248d: 0x0001, 0x248e: 0x0001, 0x248f: 0x0001, 0x2490: 0x0001, 0x2491: 0x0001, + 0x2492: 0x0001, 0x2493: 0x0001, 0x2494: 0x0001, 0x2495: 0x0001, 0x2496: 0x0001, 0x2497: 0x0001, + 0x2498: 0x0001, 0x2499: 0x0001, 0x249a: 0x0001, 0x249b: 0x0001, 0x249c: 0x0001, 0x249d: 0x0001, + 0x249e: 0x0001, 0x249f: 0x0001, 0x24a0: 0x0001, 0x24a1: 0x0001, 0x24a2: 0x0001, 0x24a3: 0x0001, + 0x24a4: 0x0001, 0x24a5: 0x0001, 0x24a6: 0x0001, 0x24a7: 0x0001, 0x24a8: 0x0001, 0x24a9: 0x0001, + 0x24aa: 0x0001, 0x24ab: 0x0001, 0x24ac: 0x0001, 0x24ad: 0x0001, 0x24ae: 0x0001, 0x24af: 0x0001, + 0x24b0: 0x0060, 0x24b1: 0x0001, 0x24b2: 0x0001, 0x24b3: 0x0001, 0x24b4: 0x0001, 0x24b5: 0x0001, + 0x24b6: 0x0001, 0x24b7: 0x0001, 0x24b8: 0x0001, 0x24b9: 0x0001, 0x24ba: 0x0001, 0x24bb: 0x0001, + 0x24bc: 0x0001, 0x24bd: 0x0001, 0x24be: 0x0001, 0x24bf: 0x0001, + // Block 0x93, offset 0x24c0 + 0x24c0: 0x0001, 0x24c1: 0x0001, 0x24c2: 0x0001, 0x24c3: 0x0001, 0x24c4: 0x0001, 0x24c5: 0x0001, + 0x24c6: 0x0001, 0x24c7: 0x0001, 0x24c8: 0x0001, 0x24c9: 0x0060, 0x24ca: 0x0060, 0x24cb: 0x0001, + 0x24cc: 0x0001, 0x24cd: 0x0001, 0x24ce: 0x0001, 0x24cf: 0x0001, 0x24d0: 0x0001, 0x24d1: 0x0001, + 0x24d2: 0x0001, 0x24d3: 0x0001, 0x24d4: 0x0001, 0x24d5: 0x0001, 0x24d6: 0x0001, 0x24d7: 0x0001, + 0x24d8: 0x0001, 0x24d9: 0x0001, 0x24da: 0x0001, 0x24db: 0x0001, 0x24dc: 0x0001, 0x24dd: 0x0001, + 0x24de: 0x0001, 0x24df: 0x0001, 0x24e0: 0x0001, 0x24e1: 0x0001, 0x24e2: 0x0001, 0x24e3: 0x0001, + 0x24e4: 0x0001, 0x24e5: 0x0001, 0x24e6: 0x0001, 0x24e7: 0x0001, 0x24e8: 0x0001, 0x24e9: 0x0001, + 0x24ea: 0x0001, 0x24eb: 0x0001, 0x24ec: 0x0001, 0x24ed: 0x0001, 0x24ee: 0x0010, 0x24ef: 0x0010, + 0x24f0: 0x0001, 0x24f1: 0x0001, 0x24f2: 0x0001, 0x24f3: 0x0001, 0x24f4: 0x0001, 0x24f5: 0x0001, + 0x24f6: 0x0001, 0x24f7: 0x0001, 0x24f8: 0x0010, 0x24f9: 0x0010, 0x24fa: 0x0010, 0x24fb: 0x0010, + 0x24fc: 0x0010, 0x24fd: 0x0010, 0x24fe: 0x0010, 0x24ff: 0x0010, + // Block 0x94, offset 0x2500 + 0x2500: 0x0010, 0x2501: 0x0010, 0x2502: 0x0010, 0x2503: 0x0010, 0x2504: 0x0010, 0x2505: 0x0010, + 0x2506: 0x0010, 0x2507: 0x0010, 0x2508: 0x0010, 0x2509: 0x0010, 0x250a: 0x0010, 0x250b: 0x0010, + 0x250c: 0x0010, 0x250d: 0x0010, 0x250e: 0x0010, 0x250f: 0x0010, 0x2510: 0x0010, 0x2511: 0x0010, + 0x2512: 0x0010, 0x2513: 0x0010, 0x2514: 0x0010, 0x2515: 0x0010, 0x2516: 0x0010, 0x2517: 0x0010, + 0x2518: 0x0010, 0x2519: 0x0010, 0x251a: 0x0010, 0x251b: 0x0010, 0x251c: 0x0010, 0x251d: 0x0010, + 0x251e: 0x0010, 0x251f: 0x0010, 0x2520: 0x0010, 0x2521: 0x0010, 0x2522: 0x0010, 0x2523: 0x0010, + 0x2524: 0x0010, 0x2525: 0x0010, 0x2526: 0x0010, 0x2527: 0x0010, 0x2528: 0x0010, 0x2529: 0x0010, + 0x252a: 0x0010, 0x252b: 0x0010, 0x252c: 0x0010, 0x252d: 0x0010, 0x252e: 0x0010, 0x252f: 0x0010, + 0x2530: 0x0010, 0x2531: 0x0010, 0x2532: 0x0010, 0x2533: 0x0010, 0x2534: 0x0010, 0x2535: 0x0010, + 0x2536: 0x0010, 0x2537: 0x0001, 0x2538: 0x0060, 0x2539: 0x0060, 0x253a: 0x0001, 0x253b: 0x0001, + 0x253c: 0x0001, 0x253d: 0x0001, 0x253e: 0x0001, 0x253f: 0x0001, + // Block 0x95, offset 0x2540 + 0x2540: 0x0001, 0x2541: 0x0001, 0x2542: 0x0001, 0x2543: 0x0001, 0x2544: 0x0001, 0x2545: 0x0001, + 0x2546: 0x0001, 0x2547: 0x0001, 0x2548: 0x0001, 0x2549: 0x0001, 0x254a: 0x0001, 0x254b: 0x0001, + 0x254c: 0x0001, 0x254d: 0x0001, 0x254e: 0x0001, 0x254f: 0x0001, 0x2550: 0x0001, 0x2551: 0x0001, + 0x2552: 0x0001, 0x2553: 0x0001, 0x2554: 0x0001, 0x2555: 0x0001, 0x2556: 0x0001, 0x2557: 0x0001, + 0x2558: 0x0001, 0x2559: 0x0001, 0x255a: 0x0001, 0x255b: 0x0001, 0x255c: 0x0001, 0x255d: 0x0001, + 0x255e: 0x0001, 0x255f: 0x0001, 0x2560: 0x0001, 0x2561: 0x0001, 0x2562: 0x0001, 0x2563: 0x0001, + 0x2564: 0x0001, 0x2565: 0x0001, 0x2566: 0x0001, 0x2567: 0x0001, 0x2568: 0x0060, 0x2569: 0x0060, + 0x256a: 0x0060, 0x256b: 0x0060, 0x256c: 0x0010, 0x256d: 0x0010, 0x256e: 0x0010, 0x256f: 0x0010, + 0x2570: 0x0060, 0x2571: 0x0060, 0x2572: 0x0060, 0x2573: 0x0060, 0x2574: 0x0060, 0x2575: 0x0060, + 0x2576: 0x0060, 0x2577: 0x0060, 0x2578: 0x0060, 0x2579: 0x0060, 0x257a: 0x0010, 0x257b: 0x0010, + 0x257c: 0x0010, 0x257d: 0x0010, 0x257e: 0x0010, 0x257f: 0x0010, + // Block 0x96, offset 0x2580 + 0x2580: 0x0001, 0x2581: 0x0001, 0x2582: 0x0001, 0x2583: 0x0001, 0x2584: 0x0001, 0x2585: 0x0001, + 0x2586: 0x0001, 0x2587: 0x0001, 0x2588: 0x0001, 0x2589: 0x0001, 0x258a: 0x0001, 0x258b: 0x0001, + 0x258c: 0x0001, 0x258d: 0x0001, 0x258e: 0x0001, 0x258f: 0x0001, 0x2590: 0x0001, 0x2591: 0x0001, + 0x2592: 0x0001, 0x2593: 0x0001, 0x2594: 0x0001, 0x2595: 0x0001, 0x2596: 0x0001, 0x2597: 0x0001, + 0x2598: 0x0001, 0x2599: 0x0001, 0x259a: 0x0001, 0x259b: 0x0001, 0x259c: 0x0001, 0x259d: 0x0001, + 0x259e: 0x0001, 0x259f: 0x0001, 0x25a0: 0x0001, 0x25a1: 0x0001, 0x25a2: 0x0001, 0x25a3: 0x0001, + 0x25a4: 0x0001, 0x25a5: 0x0001, 0x25a6: 0x0001, 0x25a7: 0x0001, 0x25a8: 0x0001, 0x25a9: 0x0001, + 0x25aa: 0x0001, 0x25ab: 0x0001, 0x25ac: 0x0001, 0x25ad: 0x0001, 0x25ae: 0x0001, 0x25af: 0x0001, + 0x25b0: 0x0001, 0x25b1: 0x0001, 0x25b2: 0x0001, 0x25b3: 0x0001, 0x25b4: 0x0060, 0x25b5: 0x0060, + 0x25b6: 0x0060, 0x25b7: 0x0060, 0x25b8: 0x0010, 0x25b9: 0x0010, 0x25ba: 0x0010, 0x25bb: 0x0010, + 0x25bc: 0x0010, 0x25bd: 0x0010, 0x25be: 0x0010, 0x25bf: 0x0010, + // Block 0x97, offset 0x25c0 + 0x25c0: 0x0001, 0x25c1: 0x0001, 0x25c2: 0x0001, 0x25c3: 0x0001, 0x25c4: 0x0001, 0x25c5: 0x0010, + 0x25c6: 0x0010, 0x25c7: 0x0010, 0x25c8: 0x0010, 0x25c9: 0x0010, 0x25ca: 0x0010, 0x25cb: 0x0010, + 0x25cc: 0x0010, 0x25cd: 0x0010, 0x25ce: 0x0060, 0x25cf: 0x0060, 0x25d0: 0x0001, 0x25d1: 0x0001, + 0x25d2: 0x0001, 0x25d3: 0x0001, 0x25d4: 0x0001, 0x25d5: 0x0001, 0x25d6: 0x0001, 0x25d7: 0x0001, + 0x25d8: 0x0001, 0x25d9: 0x0001, 0x25da: 0x0010, 0x25db: 0x0010, 0x25dc: 0x0010, 0x25dd: 0x0010, + 0x25de: 0x0010, 0x25df: 0x0010, 0x25e0: 0x0001, 0x25e1: 0x0001, 0x25e2: 0x0001, 0x25e3: 0x0001, + 0x25e4: 0x0001, 0x25e5: 0x0001, 0x25e6: 0x0001, 0x25e7: 0x0001, 0x25e8: 0x0001, 0x25e9: 0x0001, + 0x25ea: 0x0001, 0x25eb: 0x0001, 0x25ec: 0x0001, 0x25ed: 0x0001, 0x25ee: 0x0001, 0x25ef: 0x0001, + 0x25f0: 0x0001, 0x25f1: 0x0001, 0x25f2: 0x0001, 0x25f3: 0x0001, 0x25f4: 0x0001, 0x25f5: 0x0001, + 0x25f6: 0x0001, 0x25f7: 0x0001, 0x25f8: 0x0060, 0x25f9: 0x0060, 0x25fa: 0x0060, 0x25fb: 0x0001, + 0x25fc: 0x0060, 0x25fd: 0x0001, 0x25fe: 0x0010, 0x25ff: 0x0010, + // Block 0x98, offset 0x2600 + 0x2600: 0x0001, 0x2601: 0x0001, 0x2602: 0x0001, 0x2603: 0x0001, 0x2604: 0x0001, 0x2605: 0x0001, + 0x2606: 0x0001, 0x2607: 0x0001, 0x2608: 0x0001, 0x2609: 0x0001, 0x260a: 0x0001, 0x260b: 0x0001, + 0x260c: 0x0001, 0x260d: 0x0001, 0x260e: 0x0001, 0x260f: 0x0001, 0x2610: 0x0001, 0x2611: 0x0001, + 0x2612: 0x0001, 0x2613: 0x0001, 0x2614: 0x0001, 0x2615: 0x0001, 0x2616: 0x0001, 0x2617: 0x0001, + 0x2618: 0x0001, 0x2619: 0x0001, 0x261a: 0x0001, 0x261b: 0x0001, 0x261c: 0x0001, 0x261d: 0x0001, + 0x261e: 0x0001, 0x261f: 0x0001, 0x2620: 0x0001, 0x2621: 0x0001, 0x2622: 0x0001, 0x2623: 0x0001, + 0x2624: 0x0001, 0x2625: 0x0001, 0x2626: 0x0001, 0x2627: 0x0001, 0x2628: 0x0001, 0x2629: 0x0001, + 0x262a: 0x0001, 0x262b: 0x0001, 0x262c: 0x0001, 0x262d: 0x0001, 0x262e: 0x0060, 0x262f: 0x0060, + 0x2630: 0x0001, 0x2631: 0x0001, 0x2632: 0x0001, 0x2633: 0x0001, 0x2634: 0x0001, 0x2635: 0x0001, + 0x2636: 0x0001, 0x2637: 0x0001, 0x2638: 0x0001, 0x2639: 0x0001, 0x263a: 0x0001, 0x263b: 0x0001, + 0x263c: 0x0001, 0x263d: 0x0001, 0x263e: 0x0001, 0x263f: 0x0001, + // Block 0x99, offset 0x2640 + 0x2640: 0x0001, 0x2641: 0x0001, 0x2642: 0x0001, 0x2643: 0x0001, 0x2644: 0x0001, 0x2645: 0x0001, + 0x2646: 0x0001, 0x2647: 0x0001, 0x2648: 0x0001, 0x2649: 0x0001, 0x264a: 0x0001, 0x264b: 0x0001, + 0x264c: 0x0001, 0x264d: 0x0001, 0x264e: 0x0001, 0x264f: 0x0001, 0x2650: 0x0001, 0x2651: 0x0001, + 0x2652: 0x0001, 0x2653: 0x0001, 0x2654: 0x0010, 0x2655: 0x0010, 0x2656: 0x0010, 0x2657: 0x0010, + 0x2658: 0x0010, 0x2659: 0x0010, 0x265a: 0x0010, 0x265b: 0x0010, 0x265c: 0x0010, 0x265d: 0x0010, + 0x265e: 0x0010, 0x265f: 0x0060, 0x2660: 0x0001, 0x2661: 0x0001, 0x2662: 0x0001, 0x2663: 0x0001, + 0x2664: 0x0001, 0x2665: 0x0001, 0x2666: 0x0001, 0x2667: 0x0001, 0x2668: 0x0001, 0x2669: 0x0001, + 0x266a: 0x0001, 0x266b: 0x0001, 0x266c: 0x0001, 0x266d: 0x0001, 0x266e: 0x0001, 0x266f: 0x0001, + 0x2670: 0x0001, 0x2671: 0x0001, 0x2672: 0x0001, 0x2673: 0x0001, 0x2674: 0x0001, 0x2675: 0x0001, + 0x2676: 0x0001, 0x2677: 0x0001, 0x2678: 0x0001, 0x2679: 0x0001, 0x267a: 0x0001, 0x267b: 0x0001, + 0x267c: 0x0001, 0x267d: 0x0010, 0x267e: 0x0010, 0x267f: 0x0010, + // Block 0x9a, offset 0x2680 + 0x2680: 0x0001, 0x2681: 0x0060, 0x2682: 0x0060, 0x2683: 0x0060, 0x2684: 0x0060, 0x2685: 0x0060, + 0x2686: 0x0060, 0x2687: 0x0060, 0x2688: 0x0060, 0x2689: 0x0060, 0x268a: 0x0060, 0x268b: 0x0060, + 0x268c: 0x0060, 0x268d: 0x0060, 0x268e: 0x0010, 0x268f: 0x0001, 0x2690: 0x0001, 0x2691: 0x0001, + 0x2692: 0x0001, 0x2693: 0x0001, 0x2694: 0x0001, 0x2695: 0x0001, 0x2696: 0x0001, 0x2697: 0x0001, + 0x2698: 0x0001, 0x2699: 0x0001, 0x269a: 0x0010, 0x269b: 0x0010, 0x269c: 0x0010, 0x269d: 0x0010, + 0x269e: 0x0060, 0x269f: 0x0060, 0x26a0: 0x0001, 0x26a1: 0x0001, 0x26a2: 0x0001, 0x26a3: 0x0001, + 0x26a4: 0x0001, 0x26a5: 0x0001, 0x26a6: 0x0001, 0x26a7: 0x0001, 0x26a8: 0x0001, 0x26a9: 0x0001, + 0x26aa: 0x0001, 0x26ab: 0x0001, 0x26ac: 0x0001, 0x26ad: 0x0001, 0x26ae: 0x0001, 0x26af: 0x0001, + 0x26b0: 0x0001, 0x26b1: 0x0001, 0x26b2: 0x0001, 0x26b3: 0x0001, 0x26b4: 0x0001, 0x26b5: 0x0001, + 0x26b6: 0x0001, 0x26b7: 0x0001, 0x26b8: 0x0001, 0x26b9: 0x0001, 0x26ba: 0x0001, 0x26bb: 0x0001, + 0x26bc: 0x0001, 0x26bd: 0x0001, 0x26be: 0x0001, 0x26bf: 0x0010, + // Block 0x9b, offset 0x26c0 + 0x26c0: 0x0001, 0x26c1: 0x0001, 0x26c2: 0x0001, 0x26c3: 0x0001, 0x26c4: 0x0001, 0x26c5: 0x0001, + 0x26c6: 0x0001, 0x26c7: 0x0001, 0x26c8: 0x0001, 0x26c9: 0x0001, 0x26ca: 0x0001, 0x26cb: 0x0001, + 0x26cc: 0x0001, 0x26cd: 0x0001, 0x26ce: 0x0001, 0x26cf: 0x0001, 0x26d0: 0x0001, 0x26d1: 0x0001, + 0x26d2: 0x0001, 0x26d3: 0x0001, 0x26d4: 0x0001, 0x26d5: 0x0001, 0x26d6: 0x0001, 0x26d7: 0x0001, + 0x26d8: 0x0001, 0x26d9: 0x0001, 0x26da: 0x0001, 0x26db: 0x0001, 0x26dc: 0x0001, 0x26dd: 0x0001, + 0x26de: 0x0001, 0x26df: 0x0001, 0x26e0: 0x0001, 0x26e1: 0x0001, 0x26e2: 0x0001, 0x26e3: 0x0001, + 0x26e4: 0x0001, 0x26e5: 0x0001, 0x26e6: 0x0001, 0x26e7: 0x0001, 0x26e8: 0x0001, 0x26e9: 0x0001, + 0x26ea: 0x0001, 0x26eb: 0x0001, 0x26ec: 0x0001, 0x26ed: 0x0001, 0x26ee: 0x0001, 0x26ef: 0x0001, + 0x26f0: 0x0001, 0x26f1: 0x0001, 0x26f2: 0x0001, 0x26f3: 0x0001, 0x26f4: 0x0001, 0x26f5: 0x0001, + 0x26f6: 0x0001, 0x26f7: 0x0010, 0x26f8: 0x0010, 0x26f9: 0x0010, 0x26fa: 0x0010, 0x26fb: 0x0010, + 0x26fc: 0x0010, 0x26fd: 0x0010, 0x26fe: 0x0010, 0x26ff: 0x0010, + // Block 0x9c, offset 0x2700 + 0x2700: 0x0001, 0x2701: 0x0001, 0x2702: 0x0001, 0x2703: 0x0001, 0x2704: 0x0001, 0x2705: 0x0001, + 0x2706: 0x0001, 0x2707: 0x0001, 0x2708: 0x0001, 0x2709: 0x0001, 0x270a: 0x0001, 0x270b: 0x0001, + 0x270c: 0x0001, 0x270d: 0x0001, 0x270e: 0x0010, 0x270f: 0x0010, 0x2710: 0x0001, 0x2711: 0x0001, + 0x2712: 0x0001, 0x2713: 0x0001, 0x2714: 0x0001, 0x2715: 0x0001, 0x2716: 0x0001, 0x2717: 0x0001, + 0x2718: 0x0001, 0x2719: 0x0001, 0x271a: 0x0010, 0x271b: 0x0010, 0x271c: 0x0060, 0x271d: 0x0060, + 0x271e: 0x0060, 0x271f: 0x0060, 0x2720: 0x0001, 0x2721: 0x0001, 0x2722: 0x0001, 0x2723: 0x0001, + 0x2724: 0x0001, 0x2725: 0x0001, 0x2726: 0x0001, 0x2727: 0x0001, 0x2728: 0x0001, 0x2729: 0x0001, + 0x272a: 0x0001, 0x272b: 0x0001, 0x272c: 0x0001, 0x272d: 0x0001, 0x272e: 0x0001, 0x272f: 0x0001, + 0x2730: 0x0001, 0x2731: 0x0001, 0x2732: 0x0001, 0x2733: 0x0001, 0x2734: 0x0001, 0x2735: 0x0001, + 0x2736: 0x0001, 0x2737: 0x0060, 0x2738: 0x0060, 0x2739: 0x0060, 0x273a: 0x0001, 0x273b: 0x0001, + 0x273c: 0x0001, 0x273d: 0x0001, 0x273e: 0x0001, 0x273f: 0x0001, + // Block 0x9d, offset 0x2740 + 0x2740: 0x0001, 0x2741: 0x0001, 0x2742: 0x0001, 0x2743: 0x0010, 0x2744: 0x0010, 0x2745: 0x0010, + 0x2746: 0x0010, 0x2747: 0x0010, 0x2748: 0x0010, 0x2749: 0x0010, 0x274a: 0x0010, 0x274b: 0x0010, + 0x274c: 0x0010, 0x274d: 0x0010, 0x274e: 0x0010, 0x274f: 0x0010, 0x2750: 0x0010, 0x2751: 0x0010, + 0x2752: 0x0010, 0x2753: 0x0010, 0x2754: 0x0010, 0x2755: 0x0010, 0x2756: 0x0010, 0x2757: 0x0010, + 0x2758: 0x0010, 0x2759: 0x0010, 0x275a: 0x0010, 0x275b: 0x0001, 0x275c: 0x0001, 0x275d: 0x0001, + 0x275e: 0x0060, 0x275f: 0x0060, 0x2760: 0x0001, 0x2761: 0x0001, 0x2762: 0x0001, 0x2763: 0x0001, + 0x2764: 0x0001, 0x2765: 0x0001, 0x2766: 0x0001, 0x2767: 0x0001, 0x2768: 0x0001, 0x2769: 0x0001, + 0x276a: 0x0001, 0x276b: 0x0001, 0x276c: 0x0001, 0x276d: 0x0001, 0x276e: 0x0001, 0x276f: 0x0001, + 0x2770: 0x0060, 0x2771: 0x0060, 0x2772: 0x0001, 0x2773: 0x0001, 0x2774: 0x0001, 0x2775: 0x0001, + 0x2776: 0x0001, 0x2777: 0x0010, 0x2778: 0x0010, 0x2779: 0x0010, 0x277a: 0x0010, 0x277b: 0x0010, + 0x277c: 0x0010, 0x277d: 0x0010, 0x277e: 0x0010, 0x277f: 0x0010, + // Block 0x9e, offset 0x2780 + 0x2780: 0x0010, 0x2781: 0x0001, 0x2782: 0x0001, 0x2783: 0x0001, 0x2784: 0x0001, 0x2785: 0x0001, + 0x2786: 0x0001, 0x2787: 0x0010, 0x2788: 0x0010, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001, + 0x278c: 0x0001, 0x278d: 0x0001, 0x278e: 0x0001, 0x278f: 0x0010, 0x2790: 0x0010, 0x2791: 0x0001, + 0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0010, + 0x2798: 0x0010, 0x2799: 0x0010, 0x279a: 0x0010, 0x279b: 0x0010, 0x279c: 0x0010, 0x279d: 0x0010, + 0x279e: 0x0010, 0x279f: 0x0010, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001, + 0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0010, 0x27a8: 0x0001, 0x27a9: 0x0001, + 0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0010, + 0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001, + 0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x0001, 0x27b9: 0x0001, 0x27ba: 0x0001, 0x27bb: 0x0001, + 0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x0001, + // Block 0x9f, offset 0x27c0 + 0x27c0: 0x0001, 0x27c1: 0x0001, 0x27c2: 0x0001, 0x27c3: 0x0001, 0x27c4: 0x0001, 0x27c5: 0x0001, + 0x27c6: 0x0001, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001, + 0x27cc: 0x0001, 0x27cd: 0x0001, 0x27ce: 0x0001, 0x27cf: 0x0001, 0x27d0: 0x0001, 0x27d1: 0x0001, + 0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001, + 0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0060, 0x27dc: 0x0060, 0x27dd: 0x0060, + 0x27de: 0x0060, 0x27df: 0x0060, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001, + 0x27e4: 0x0001, 0x27e5: 0x0001, 0x27e6: 0x0010, 0x27e7: 0x0010, 0x27e8: 0x0010, 0x27e9: 0x0010, + 0x27ea: 0x0010, 0x27eb: 0x0010, 0x27ec: 0x0010, 0x27ed: 0x0010, 0x27ee: 0x0010, 0x27ef: 0x0010, + 0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001, + 0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x0001, 0x27f9: 0x0001, 0x27fa: 0x0001, 0x27fb: 0x0001, + 0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x0001, + // Block 0xa0, offset 0x2800 + 0x2800: 0x0001, 0x2801: 0x0001, 0x2802: 0x0001, 0x2803: 0x0001, 0x2804: 0x0001, 0x2805: 0x0001, + 0x2806: 0x0001, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001, + 0x280c: 0x0001, 0x280d: 0x0001, 0x280e: 0x0001, 0x280f: 0x0001, 0x2810: 0x0001, 0x2811: 0x0001, + 0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001, + 0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001, + 0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001, + 0x2824: 0x0001, 0x2825: 0x0001, 0x2826: 0x0001, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001, + 0x282a: 0x0001, 0x282b: 0x0060, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0010, 0x282f: 0x0010, + 0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001, + 0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x0001, 0x2839: 0x0001, 0x283a: 0x0010, 0x283b: 0x0010, + 0x283c: 0x0010, 0x283d: 0x0010, 0x283e: 0x0010, 0x283f: 0x0010, + // Block 0xa1, offset 0x2840 + 0x2840: 0x0001, 0x2841: 0x0008, 0x2842: 0x0008, 0x2843: 0x0008, 0x2844: 0x0008, 0x2845: 0x0008, + 0x2846: 0x0008, 0x2847: 0x0008, 0x2848: 0x0008, 0x2849: 0x0008, 0x284a: 0x0008, 0x284b: 0x0008, + 0x284c: 0x0008, 0x284d: 0x0008, 0x284e: 0x0008, 0x284f: 0x0008, 0x2850: 0x0008, 0x2851: 0x0008, + 0x2852: 0x0008, 0x2853: 0x0008, 0x2854: 0x0008, 0x2855: 0x0008, 0x2856: 0x0008, 0x2857: 0x0008, + 0x2858: 0x0008, 0x2859: 0x0008, 0x285a: 0x0008, 0x285b: 0x0008, 0x285c: 0x0001, 0x285d: 0x0008, + 0x285e: 0x0008, 0x285f: 0x0008, 0x2860: 0x0008, 0x2861: 0x0008, 0x2862: 0x0008, 0x2863: 0x0008, + 0x2864: 0x0008, 0x2865: 0x0008, 0x2866: 0x0008, 0x2867: 0x0008, 0x2868: 0x0008, 0x2869: 0x0008, + 0x286a: 0x0008, 0x286b: 0x0008, 0x286c: 0x0008, 0x286d: 0x0008, 0x286e: 0x0008, 0x286f: 0x0008, + 0x2870: 0x0008, 0x2871: 0x0008, 0x2872: 0x0008, 0x2873: 0x0008, 0x2874: 0x0008, 0x2875: 0x0008, + 0x2876: 0x0008, 0x2877: 0x0008, 0x2878: 0x0001, 0x2879: 0x0008, 0x287a: 0x0008, 0x287b: 0x0008, + 0x287c: 0x0008, 0x287d: 0x0008, 0x287e: 0x0008, 0x287f: 0x0008, + // Block 0xa2, offset 0x2880 + 0x2880: 0x0008, 0x2881: 0x0008, 0x2882: 0x0008, 0x2883: 0x0008, 0x2884: 0x0008, 0x2885: 0x0008, + 0x2886: 0x0008, 0x2887: 0x0008, 0x2888: 0x0008, 0x2889: 0x0008, 0x288a: 0x0008, 0x288b: 0x0008, + 0x288c: 0x0008, 0x288d: 0x0008, 0x288e: 0x0008, 0x288f: 0x0008, 0x2890: 0x0008, 0x2891: 0x0008, + 0x2892: 0x0008, 0x2893: 0x0008, 0x2894: 0x0001, 0x2895: 0x0008, 0x2896: 0x0008, 0x2897: 0x0008, + 0x2898: 0x0008, 0x2899: 0x0008, 0x289a: 0x0008, 0x289b: 0x0008, 0x289c: 0x0008, 0x289d: 0x0008, + 0x289e: 0x0008, 0x289f: 0x0008, 0x28a0: 0x0008, 0x28a1: 0x0008, 0x28a2: 0x0008, 0x28a3: 0x0008, + 0x28a4: 0x0008, 0x28a5: 0x0008, 0x28a6: 0x0008, 0x28a7: 0x0008, 0x28a8: 0x0008, 0x28a9: 0x0008, + 0x28aa: 0x0008, 0x28ab: 0x0008, 0x28ac: 0x0008, 0x28ad: 0x0008, 0x28ae: 0x0008, 0x28af: 0x0008, + 0x28b0: 0x0001, 0x28b1: 0x0008, 0x28b2: 0x0008, 0x28b3: 0x0008, 0x28b4: 0x0008, 0x28b5: 0x0008, + 0x28b6: 0x0008, 0x28b7: 0x0008, 0x28b8: 0x0008, 0x28b9: 0x0008, 0x28ba: 0x0008, 0x28bb: 0x0008, + 0x28bc: 0x0008, 0x28bd: 0x0008, 0x28be: 0x0008, 0x28bf: 0x0008, + // Block 0xa3, offset 0x28c0 + 0x28c0: 0x0008, 0x28c1: 0x0008, 0x28c2: 0x0008, 0x28c3: 0x0008, 0x28c4: 0x0008, 0x28c5: 0x0008, + 0x28c6: 0x0008, 0x28c7: 0x0008, 0x28c8: 0x0008, 0x28c9: 0x0008, 0x28ca: 0x0008, 0x28cb: 0x0008, + 0x28cc: 0x0001, 0x28cd: 0x0008, 0x28ce: 0x0008, 0x28cf: 0x0008, 0x28d0: 0x0008, 0x28d1: 0x0008, + 0x28d2: 0x0008, 0x28d3: 0x0008, 0x28d4: 0x0008, 0x28d5: 0x0008, 0x28d6: 0x0008, 0x28d7: 0x0008, + 0x28d8: 0x0008, 0x28d9: 0x0008, 0x28da: 0x0008, 0x28db: 0x0008, 0x28dc: 0x0008, 0x28dd: 0x0008, + 0x28de: 0x0008, 0x28df: 0x0008, 0x28e0: 0x0008, 0x28e1: 0x0008, 0x28e2: 0x0008, 0x28e3: 0x0008, + 0x28e4: 0x0008, 0x28e5: 0x0008, 0x28e6: 0x0008, 0x28e7: 0x0008, 0x28e8: 0x0001, 0x28e9: 0x0008, + 0x28ea: 0x0008, 0x28eb: 0x0008, 0x28ec: 0x0008, 0x28ed: 0x0008, 0x28ee: 0x0008, 0x28ef: 0x0008, + 0x28f0: 0x0008, 0x28f1: 0x0008, 0x28f2: 0x0008, 0x28f3: 0x0008, 0x28f4: 0x0008, 0x28f5: 0x0008, + 0x28f6: 0x0008, 0x28f7: 0x0008, 0x28f8: 0x0008, 0x28f9: 0x0008, 0x28fa: 0x0008, 0x28fb: 0x0008, + 0x28fc: 0x0008, 0x28fd: 0x0008, 0x28fe: 0x0008, 0x28ff: 0x0008, + // Block 0xa4, offset 0x2900 + 0x2900: 0x0008, 0x2901: 0x0008, 0x2902: 0x0008, 0x2903: 0x0008, 0x2904: 0x0001, 0x2905: 0x0008, + 0x2906: 0x0008, 0x2907: 0x0008, 0x2908: 0x0008, 0x2909: 0x0008, 0x290a: 0x0008, 0x290b: 0x0008, + 0x290c: 0x0008, 0x290d: 0x0008, 0x290e: 0x0008, 0x290f: 0x0008, 0x2910: 0x0008, 0x2911: 0x0008, + 0x2912: 0x0008, 0x2913: 0x0008, 0x2914: 0x0008, 0x2915: 0x0008, 0x2916: 0x0008, 0x2917: 0x0008, + 0x2918: 0x0008, 0x2919: 0x0008, 0x291a: 0x0008, 0x291b: 0x0008, 0x291c: 0x0008, 0x291d: 0x0008, + 0x291e: 0x0008, 0x291f: 0x0008, 0x2920: 0x0001, 0x2921: 0x0008, 0x2922: 0x0008, 0x2923: 0x0008, + 0x2924: 0x0008, 0x2925: 0x0008, 0x2926: 0x0008, 0x2927: 0x0008, 0x2928: 0x0008, 0x2929: 0x0008, + 0x292a: 0x0008, 0x292b: 0x0008, 0x292c: 0x0008, 0x292d: 0x0008, 0x292e: 0x0008, 0x292f: 0x0008, + 0x2930: 0x0008, 0x2931: 0x0008, 0x2932: 0x0008, 0x2933: 0x0008, 0x2934: 0x0008, 0x2935: 0x0008, + 0x2936: 0x0008, 0x2937: 0x0008, 0x2938: 0x0008, 0x2939: 0x0008, 0x293a: 0x0008, 0x293b: 0x0008, + 0x293c: 0x0001, 0x293d: 0x0008, 0x293e: 0x0008, 0x293f: 0x0008, + // Block 0xa5, offset 0x2940 + 0x2940: 0x0008, 0x2941: 0x0008, 0x2942: 0x0008, 0x2943: 0x0008, 0x2944: 0x0008, 0x2945: 0x0008, + 0x2946: 0x0008, 0x2947: 0x0008, 0x2948: 0x0008, 0x2949: 0x0008, 0x294a: 0x0008, 0x294b: 0x0008, + 0x294c: 0x0008, 0x294d: 0x0008, 0x294e: 0x0008, 0x294f: 0x0008, 0x2950: 0x0008, 0x2951: 0x0008, + 0x2952: 0x0008, 0x2953: 0x0008, 0x2954: 0x0008, 0x2955: 0x0008, 0x2956: 0x0008, 0x2957: 0x0008, + 0x2958: 0x0001, 0x2959: 0x0008, 0x295a: 0x0008, 0x295b: 0x0008, 0x295c: 0x0008, 0x295d: 0x0008, + 0x295e: 0x0008, 0x295f: 0x0008, 0x2960: 0x0008, 0x2961: 0x0008, 0x2962: 0x0008, 0x2963: 0x0008, + 0x2964: 0x0008, 0x2965: 0x0008, 0x2966: 0x0008, 0x2967: 0x0008, 0x2968: 0x0008, 0x2969: 0x0008, + 0x296a: 0x0008, 0x296b: 0x0008, 0x296c: 0x0008, 0x296d: 0x0008, 0x296e: 0x0008, 0x296f: 0x0008, + 0x2970: 0x0008, 0x2971: 0x0008, 0x2972: 0x0008, 0x2973: 0x0008, 0x2974: 0x0001, 0x2975: 0x0008, + 0x2976: 0x0008, 0x2977: 0x0008, 0x2978: 0x0008, 0x2979: 0x0008, 0x297a: 0x0008, 0x297b: 0x0008, + 0x297c: 0x0008, 0x297d: 0x0008, 0x297e: 0x0008, 0x297f: 0x0008, + // Block 0xa6, offset 0x2980 + 0x2980: 0x0008, 0x2981: 0x0008, 0x2982: 0x0008, 0x2983: 0x0008, 0x2984: 0x0008, 0x2985: 0x0008, + 0x2986: 0x0008, 0x2987: 0x0008, 0x2988: 0x0008, 0x2989: 0x0008, 0x298a: 0x0008, 0x298b: 0x0008, + 0x298c: 0x0008, 0x298d: 0x0008, 0x298e: 0x0008, 0x298f: 0x0008, 0x2990: 0x0001, 0x2991: 0x0008, + 0x2992: 0x0008, 0x2993: 0x0008, 0x2994: 0x0008, 0x2995: 0x0008, 0x2996: 0x0008, 0x2997: 0x0008, + 0x2998: 0x0008, 0x2999: 0x0008, 0x299a: 0x0008, 0x299b: 0x0008, 0x299c: 0x0008, 0x299d: 0x0008, + 0x299e: 0x0008, 0x299f: 0x0008, 0x29a0: 0x0008, 0x29a1: 0x0008, 0x29a2: 0x0008, 0x29a3: 0x0008, + 0x29a4: 0x0008, 0x29a5: 0x0008, 0x29a6: 0x0008, 0x29a7: 0x0008, 0x29a8: 0x0008, 0x29a9: 0x0008, + 0x29aa: 0x0008, 0x29ab: 0x0008, 0x29ac: 0x0001, 0x29ad: 0x0008, 0x29ae: 0x0008, 0x29af: 0x0008, + 0x29b0: 0x0008, 0x29b1: 0x0008, 0x29b2: 0x0008, 0x29b3: 0x0008, 0x29b4: 0x0008, 0x29b5: 0x0008, + 0x29b6: 0x0008, 0x29b7: 0x0008, 0x29b8: 0x0008, 0x29b9: 0x0008, 0x29ba: 0x0008, 0x29bb: 0x0008, + 0x29bc: 0x0008, 0x29bd: 0x0008, 0x29be: 0x0008, 0x29bf: 0x0008, + // Block 0xa7, offset 0x29c0 + 0x29c0: 0x0008, 0x29c1: 0x0008, 0x29c2: 0x0008, 0x29c3: 0x0008, 0x29c4: 0x0008, 0x29c5: 0x0008, + 0x29c6: 0x0008, 0x29c7: 0x0008, 0x29c8: 0x0001, 0x29c9: 0x0008, 0x29ca: 0x0008, 0x29cb: 0x0008, + 0x29cc: 0x0008, 0x29cd: 0x0008, 0x29ce: 0x0008, 0x29cf: 0x0008, 0x29d0: 0x0008, 0x29d1: 0x0008, + 0x29d2: 0x0008, 0x29d3: 0x0008, 0x29d4: 0x0008, 0x29d5: 0x0008, 0x29d6: 0x0008, 0x29d7: 0x0008, + 0x29d8: 0x0008, 0x29d9: 0x0008, 0x29da: 0x0008, 0x29db: 0x0008, 0x29dc: 0x0008, 0x29dd: 0x0008, + 0x29de: 0x0008, 0x29df: 0x0008, 0x29e0: 0x0008, 0x29e1: 0x0008, 0x29e2: 0x0008, 0x29e3: 0x0008, + 0x29e4: 0x0001, 0x29e5: 0x0008, 0x29e6: 0x0008, 0x29e7: 0x0008, 0x29e8: 0x0008, 0x29e9: 0x0008, + 0x29ea: 0x0008, 0x29eb: 0x0008, 0x29ec: 0x0008, 0x29ed: 0x0008, 0x29ee: 0x0008, 0x29ef: 0x0008, + 0x29f0: 0x0008, 0x29f1: 0x0008, 0x29f2: 0x0008, 0x29f3: 0x0008, 0x29f4: 0x0008, 0x29f5: 0x0008, + 0x29f6: 0x0008, 0x29f7: 0x0008, 0x29f8: 0x0008, 0x29f9: 0x0008, 0x29fa: 0x0008, 0x29fb: 0x0008, + 0x29fc: 0x0008, 0x29fd: 0x0008, 0x29fe: 0x0008, 0x29ff: 0x0008, + // Block 0xa8, offset 0x2a00 + 0x2a00: 0x0008, 0x2a01: 0x0008, 0x2a02: 0x0008, 0x2a03: 0x0008, 0x2a04: 0x0008, 0x2a05: 0x0008, + 0x2a06: 0x0008, 0x2a07: 0x0008, 0x2a08: 0x0001, 0x2a09: 0x0008, 0x2a0a: 0x0008, 0x2a0b: 0x0008, + 0x2a0c: 0x0008, 0x2a0d: 0x0008, 0x2a0e: 0x0008, 0x2a0f: 0x0008, 0x2a10: 0x0008, 0x2a11: 0x0008, + 0x2a12: 0x0008, 0x2a13: 0x0008, 0x2a14: 0x0008, 0x2a15: 0x0008, 0x2a16: 0x0008, 0x2a17: 0x0008, + 0x2a18: 0x0008, 0x2a19: 0x0008, 0x2a1a: 0x0008, 0x2a1b: 0x0008, 0x2a1c: 0x0008, 0x2a1d: 0x0008, + 0x2a1e: 0x0008, 0x2a1f: 0x0008, 0x2a20: 0x0008, 0x2a21: 0x0008, 0x2a22: 0x0008, 0x2a23: 0x0008, + 0x2a24: 0x0010, 0x2a25: 0x0010, 0x2a26: 0x0010, 0x2a27: 0x0010, 0x2a28: 0x0010, 0x2a29: 0x0010, + 0x2a2a: 0x0010, 0x2a2b: 0x0010, 0x2a2c: 0x0010, 0x2a2d: 0x0010, 0x2a2e: 0x0010, 0x2a2f: 0x0010, + 0x2a30: 0x0001, 0x2a31: 0x0001, 0x2a32: 0x0001, 0x2a33: 0x0001, 0x2a34: 0x0001, 0x2a35: 0x0001, + 0x2a36: 0x0001, 0x2a37: 0x0001, 0x2a38: 0x0001, 0x2a39: 0x0001, 0x2a3a: 0x0001, 0x2a3b: 0x0001, + 0x2a3c: 0x0001, 0x2a3d: 0x0001, 0x2a3e: 0x0001, 0x2a3f: 0x0001, + // Block 0xa9, offset 0x2a40 + 0x2a40: 0x0001, 0x2a41: 0x0001, 0x2a42: 0x0001, 0x2a43: 0x0001, 0x2a44: 0x0001, 0x2a45: 0x0001, + 0x2a46: 0x0001, 0x2a47: 0x0010, 0x2a48: 0x0010, 0x2a49: 0x0010, 0x2a4a: 0x0010, 0x2a4b: 0x0001, + 0x2a4c: 0x0001, 0x2a4d: 0x0001, 0x2a4e: 0x0001, 0x2a4f: 0x0001, 0x2a50: 0x0001, 0x2a51: 0x0001, + 0x2a52: 0x0001, 0x2a53: 0x0001, 0x2a54: 0x0001, 0x2a55: 0x0001, 0x2a56: 0x0001, 0x2a57: 0x0001, + 0x2a58: 0x0001, 0x2a59: 0x0001, 0x2a5a: 0x0001, 0x2a5b: 0x0001, 0x2a5c: 0x0001, 0x2a5d: 0x0001, + 0x2a5e: 0x0001, 0x2a5f: 0x0001, 0x2a60: 0x0001, 0x2a61: 0x0001, 0x2a62: 0x0001, 0x2a63: 0x0001, + 0x2a64: 0x0001, 0x2a65: 0x0001, 0x2a66: 0x0001, 0x2a67: 0x0001, 0x2a68: 0x0001, 0x2a69: 0x0001, + 0x2a6a: 0x0001, 0x2a6b: 0x0001, 0x2a6c: 0x0001, 0x2a6d: 0x0001, 0x2a6e: 0x0001, 0x2a6f: 0x0001, + 0x2a70: 0x0001, 0x2a71: 0x0001, 0x2a72: 0x0001, 0x2a73: 0x0001, 0x2a74: 0x0001, 0x2a75: 0x0001, + 0x2a76: 0x0001, 0x2a77: 0x0001, 0x2a78: 0x0001, 0x2a79: 0x0001, 0x2a7a: 0x0001, 0x2a7b: 0x0001, + 0x2a7c: 0x0010, 0x2a7d: 0x0010, 0x2a7e: 0x0010, 0x2a7f: 0x0010, + // Block 0xaa, offset 0x2a80 + 0x2a80: 0x0008, 0x2a81: 0x0008, 0x2a82: 0x0008, 0x2a83: 0x0008, 0x2a84: 0x0008, 0x2a85: 0x0008, + 0x2a86: 0x0008, 0x2a87: 0x0008, 0x2a88: 0x0008, 0x2a89: 0x0008, 0x2a8a: 0x0008, 0x2a8b: 0x0008, + 0x2a8c: 0x0008, 0x2a8d: 0x0008, 0x2a8e: 0x0008, 0x2a8f: 0x0008, 0x2a90: 0x0008, 0x2a91: 0x0008, + 0x2a92: 0x0008, 0x2a93: 0x0008, 0x2a94: 0x0008, 0x2a95: 0x0008, 0x2a96: 0x0008, 0x2a97: 0x0008, + 0x2a98: 0x0008, 0x2a99: 0x0008, 0x2a9a: 0x0008, 0x2a9b: 0x0008, 0x2a9c: 0x0008, 0x2a9d: 0x0008, + 0x2a9e: 0x0008, 0x2a9f: 0x0008, 0x2aa0: 0x0008, 0x2aa1: 0x0008, 0x2aa2: 0x0008, 0x2aa3: 0x0008, + 0x2aa4: 0x0008, 0x2aa5: 0x0008, 0x2aa6: 0x0008, 0x2aa7: 0x0008, 0x2aa8: 0x0008, 0x2aa9: 0x0008, + 0x2aaa: 0x0008, 0x2aab: 0x0008, 0x2aac: 0x0008, 0x2aad: 0x0008, 0x2aae: 0x0008, 0x2aaf: 0x0008, + 0x2ab0: 0x0008, 0x2ab1: 0x0008, 0x2ab2: 0x0008, 0x2ab3: 0x0008, 0x2ab4: 0x0008, 0x2ab5: 0x0008, + 0x2ab6: 0x0008, 0x2ab7: 0x0008, 0x2ab8: 0x0008, 0x2ab9: 0x0008, 0x2aba: 0x0008, 0x2abb: 0x0008, + 0x2abc: 0x0008, 0x2abd: 0x0008, 0x2abe: 0x0008, 0x2abf: 0x0008, + // Block 0xab, offset 0x2ac0 + 0x2ac0: 0x0060, 0x2ac1: 0x0060, 0x2ac2: 0x0060, 0x2ac3: 0x0060, 0x2ac4: 0x0060, 0x2ac5: 0x0060, + 0x2ac6: 0x0060, 0x2ac7: 0x0060, 0x2ac8: 0x0060, 0x2ac9: 0x0060, 0x2aca: 0x0060, 0x2acb: 0x0060, + 0x2acc: 0x0060, 0x2acd: 0x0060, 0x2ace: 0x0001, 0x2acf: 0x0001, 0x2ad0: 0x0060, 0x2ad1: 0x0001, + 0x2ad2: 0x0060, 0x2ad3: 0x0001, 0x2ad4: 0x0001, 0x2ad5: 0x0060, 0x2ad6: 0x0060, 0x2ad7: 0x0060, + 0x2ad8: 0x0060, 0x2ad9: 0x0060, 0x2ada: 0x0060, 0x2adb: 0x0060, 0x2adc: 0x0060, 0x2add: 0x0060, + 0x2ade: 0x0060, 0x2adf: 0x0001, 0x2ae0: 0x0060, 0x2ae1: 0x0001, 0x2ae2: 0x0060, 0x2ae3: 0x0001, + 0x2ae4: 0x0001, 0x2ae5: 0x0060, 0x2ae6: 0x0060, 0x2ae7: 0x0001, 0x2ae8: 0x0001, 0x2ae9: 0x0001, + 0x2aea: 0x0060, 0x2aeb: 0x0060, 0x2aec: 0x0060, 0x2aed: 0x0060, 0x2aee: 0x0060, 0x2aef: 0x0060, + 0x2af0: 0x0060, 0x2af1: 0x0060, 0x2af2: 0x0060, 0x2af3: 0x0060, 0x2af4: 0x0060, 0x2af5: 0x0060, + 0x2af6: 0x0060, 0x2af7: 0x0060, 0x2af8: 0x0060, 0x2af9: 0x0060, 0x2afa: 0x0060, 0x2afb: 0x0060, + 0x2afc: 0x0060, 0x2afd: 0x0060, 0x2afe: 0x0060, 0x2aff: 0x0060, + // Block 0xac, offset 0x2b00 + 0x2b00: 0x0060, 0x2b01: 0x0060, 0x2b02: 0x0060, 0x2b03: 0x0060, 0x2b04: 0x0060, 0x2b05: 0x0060, + 0x2b06: 0x0060, 0x2b07: 0x0060, 0x2b08: 0x0060, 0x2b09: 0x0060, 0x2b0a: 0x0060, 0x2b0b: 0x0060, + 0x2b0c: 0x0060, 0x2b0d: 0x0060, 0x2b0e: 0x0060, 0x2b0f: 0x0060, 0x2b10: 0x0060, 0x2b11: 0x0060, + 0x2b12: 0x0060, 0x2b13: 0x0060, 0x2b14: 0x0060, 0x2b15: 0x0060, 0x2b16: 0x0060, 0x2b17: 0x0060, + 0x2b18: 0x0060, 0x2b19: 0x0060, 0x2b1a: 0x0060, 0x2b1b: 0x0060, 0x2b1c: 0x0060, 0x2b1d: 0x0060, + 0x2b1e: 0x0060, 0x2b1f: 0x0060, 0x2b20: 0x0060, 0x2b21: 0x0060, 0x2b22: 0x0060, 0x2b23: 0x0060, + 0x2b24: 0x0060, 0x2b25: 0x0060, 0x2b26: 0x0060, 0x2b27: 0x0060, 0x2b28: 0x0060, 0x2b29: 0x0060, + 0x2b2a: 0x0060, 0x2b2b: 0x0060, 0x2b2c: 0x0060, 0x2b2d: 0x0060, 0x2b2e: 0x0010, 0x2b2f: 0x0010, + 0x2b30: 0x0060, 0x2b31: 0x0060, 0x2b32: 0x0060, 0x2b33: 0x0060, 0x2b34: 0x0060, 0x2b35: 0x0060, + 0x2b36: 0x0060, 0x2b37: 0x0060, 0x2b38: 0x0060, 0x2b39: 0x0060, 0x2b3a: 0x0060, 0x2b3b: 0x0060, + 0x2b3c: 0x0060, 0x2b3d: 0x0060, 0x2b3e: 0x0060, 0x2b3f: 0x0060, + // Block 0xad, offset 0x2b40 + 0x2b40: 0x0060, 0x2b41: 0x0060, 0x2b42: 0x0060, 0x2b43: 0x0060, 0x2b44: 0x0060, 0x2b45: 0x0060, + 0x2b46: 0x0060, 0x2b47: 0x0060, 0x2b48: 0x0060, 0x2b49: 0x0060, 0x2b4a: 0x0060, 0x2b4b: 0x0060, + 0x2b4c: 0x0060, 0x2b4d: 0x0060, 0x2b4e: 0x0060, 0x2b4f: 0x0060, 0x2b50: 0x0060, 0x2b51: 0x0060, + 0x2b52: 0x0060, 0x2b53: 0x0060, 0x2b54: 0x0060, 0x2b55: 0x0060, 0x2b56: 0x0060, 0x2b57: 0x0060, + 0x2b58: 0x0060, 0x2b59: 0x0060, 0x2b5a: 0x0010, 0x2b5b: 0x0010, 0x2b5c: 0x0010, 0x2b5d: 0x0010, + 0x2b5e: 0x0010, 0x2b5f: 0x0010, 0x2b60: 0x0010, 0x2b61: 0x0010, 0x2b62: 0x0010, 0x2b63: 0x0010, + 0x2b64: 0x0010, 0x2b65: 0x0010, 0x2b66: 0x0010, 0x2b67: 0x0010, 0x2b68: 0x0010, 0x2b69: 0x0010, + 0x2b6a: 0x0010, 0x2b6b: 0x0010, 0x2b6c: 0x0010, 0x2b6d: 0x0010, 0x2b6e: 0x0010, 0x2b6f: 0x0010, + 0x2b70: 0x0010, 0x2b71: 0x0010, 0x2b72: 0x0010, 0x2b73: 0x0010, 0x2b74: 0x0010, 0x2b75: 0x0010, + 0x2b76: 0x0010, 0x2b77: 0x0010, 0x2b78: 0x0010, 0x2b79: 0x0010, 0x2b7a: 0x0010, 0x2b7b: 0x0010, + 0x2b7c: 0x0010, 0x2b7d: 0x0010, 0x2b7e: 0x0010, 0x2b7f: 0x0010, + // Block 0xae, offset 0x2b80 + 0x2b80: 0x0060, 0x2b81: 0x0060, 0x2b82: 0x0060, 0x2b83: 0x0060, 0x2b84: 0x0060, 0x2b85: 0x0060, + 0x2b86: 0x0060, 0x2b87: 0x0010, 0x2b88: 0x0010, 0x2b89: 0x0010, 0x2b8a: 0x0010, 0x2b8b: 0x0010, + 0x2b8c: 0x0010, 0x2b8d: 0x0010, 0x2b8e: 0x0010, 0x2b8f: 0x0010, 0x2b90: 0x0010, 0x2b91: 0x0010, + 0x2b92: 0x0010, 0x2b93: 0x0060, 0x2b94: 0x0060, 0x2b95: 0x0060, 0x2b96: 0x0060, 0x2b97: 0x0060, + 0x2b98: 0x0010, 0x2b99: 0x0010, 0x2b9a: 0x0010, 0x2b9b: 0x0010, 0x2b9c: 0x0010, 0x2b9d: 0x0060, + 0x2b9e: 0x0001, 0x2b9f: 0x0060, 0x2ba0: 0x0060, 0x2ba1: 0x0060, 0x2ba2: 0x0060, 0x2ba3: 0x0060, + 0x2ba4: 0x0060, 0x2ba5: 0x0060, 0x2ba6: 0x0060, 0x2ba7: 0x0060, 0x2ba8: 0x0060, 0x2ba9: 0x0060, + 0x2baa: 0x0060, 0x2bab: 0x0060, 0x2bac: 0x0060, 0x2bad: 0x0060, 0x2bae: 0x0060, 0x2baf: 0x0060, + 0x2bb0: 0x0060, 0x2bb1: 0x0060, 0x2bb2: 0x0060, 0x2bb3: 0x0060, 0x2bb4: 0x0060, 0x2bb5: 0x0060, + 0x2bb6: 0x0060, 0x2bb7: 0x0010, 0x2bb8: 0x0060, 0x2bb9: 0x0060, 0x2bba: 0x0060, 0x2bbb: 0x0060, + 0x2bbc: 0x0060, 0x2bbd: 0x0010, 0x2bbe: 0x0060, 0x2bbf: 0x0010, + // Block 0xaf, offset 0x2bc0 + 0x2bc0: 0x0060, 0x2bc1: 0x0060, 0x2bc2: 0x0010, 0x2bc3: 0x0060, 0x2bc4: 0x0060, 0x2bc5: 0x0010, + 0x2bc6: 0x0060, 0x2bc7: 0x0060, 0x2bc8: 0x0060, 0x2bc9: 0x0060, 0x2bca: 0x0060, 0x2bcb: 0x0060, + 0x2bcc: 0x0060, 0x2bcd: 0x0060, 0x2bce: 0x0060, 0x2bcf: 0x0060, 0x2bd0: 0x0060, 0x2bd1: 0x0060, + 0x2bd2: 0x0060, 0x2bd3: 0x0060, 0x2bd4: 0x0060, 0x2bd5: 0x0060, 0x2bd6: 0x0060, 0x2bd7: 0x0060, + 0x2bd8: 0x0060, 0x2bd9: 0x0060, 0x2bda: 0x0060, 0x2bdb: 0x0060, 0x2bdc: 0x0060, 0x2bdd: 0x0060, + 0x2bde: 0x0060, 0x2bdf: 0x0060, 0x2be0: 0x0060, 0x2be1: 0x0060, 0x2be2: 0x0060, 0x2be3: 0x0060, + 0x2be4: 0x0060, 0x2be5: 0x0060, 0x2be6: 0x0060, 0x2be7: 0x0060, 0x2be8: 0x0060, 0x2be9: 0x0060, + 0x2bea: 0x0060, 0x2beb: 0x0060, 0x2bec: 0x0060, 0x2bed: 0x0060, 0x2bee: 0x0060, 0x2bef: 0x0060, + 0x2bf0: 0x0060, 0x2bf1: 0x0060, 0x2bf2: 0x0060, 0x2bf3: 0x0060, 0x2bf4: 0x0060, 0x2bf5: 0x0060, + 0x2bf6: 0x0060, 0x2bf7: 0x0060, 0x2bf8: 0x0060, 0x2bf9: 0x0060, 0x2bfa: 0x0060, 0x2bfb: 0x0060, + 0x2bfc: 0x0060, 0x2bfd: 0x0060, 0x2bfe: 0x0060, 0x2bff: 0x0060, + // Block 0xb0, offset 0x2c00 + 0x2c00: 0x0060, 0x2c01: 0x0060, 0x2c02: 0x0010, 0x2c03: 0x0010, 0x2c04: 0x0010, 0x2c05: 0x0010, + 0x2c06: 0x0010, 0x2c07: 0x0010, 0x2c08: 0x0010, 0x2c09: 0x0010, 0x2c0a: 0x0010, 0x2c0b: 0x0010, + 0x2c0c: 0x0010, 0x2c0d: 0x0010, 0x2c0e: 0x0010, 0x2c0f: 0x0010, 0x2c10: 0x0010, 0x2c11: 0x0010, + 0x2c12: 0x0010, 0x2c13: 0x0060, 0x2c14: 0x0060, 0x2c15: 0x0060, 0x2c16: 0x0060, 0x2c17: 0x0060, + 0x2c18: 0x0060, 0x2c19: 0x0060, 0x2c1a: 0x0060, 0x2c1b: 0x0060, 0x2c1c: 0x0060, 0x2c1d: 0x0060, + 0x2c1e: 0x0060, 0x2c1f: 0x0060, 0x2c20: 0x0060, 0x2c21: 0x0060, 0x2c22: 0x0060, 0x2c23: 0x0060, + 0x2c24: 0x0060, 0x2c25: 0x0060, 0x2c26: 0x0060, 0x2c27: 0x0060, 0x2c28: 0x0060, 0x2c29: 0x0060, + 0x2c2a: 0x0060, 0x2c2b: 0x0060, 0x2c2c: 0x0060, 0x2c2d: 0x0060, 0x2c2e: 0x0060, 0x2c2f: 0x0060, + 0x2c30: 0x0060, 0x2c31: 0x0060, 0x2c32: 0x0060, 0x2c33: 0x0060, 0x2c34: 0x0060, 0x2c35: 0x0060, + 0x2c36: 0x0060, 0x2c37: 0x0060, 0x2c38: 0x0060, 0x2c39: 0x0060, 0x2c3a: 0x0060, 0x2c3b: 0x0060, + 0x2c3c: 0x0060, 0x2c3d: 0x0060, 0x2c3e: 0x0060, 0x2c3f: 0x0060, + // Block 0xb1, offset 0x2c40 + 0x2c40: 0x0010, 0x2c41: 0x0010, 0x2c42: 0x0010, 0x2c43: 0x0010, 0x2c44: 0x0010, 0x2c45: 0x0010, + 0x2c46: 0x0010, 0x2c47: 0x0010, 0x2c48: 0x0010, 0x2c49: 0x0010, 0x2c4a: 0x0010, 0x2c4b: 0x0010, + 0x2c4c: 0x0010, 0x2c4d: 0x0010, 0x2c4e: 0x0010, 0x2c4f: 0x0010, 0x2c50: 0x0060, 0x2c51: 0x0060, + 0x2c52: 0x0060, 0x2c53: 0x0060, 0x2c54: 0x0060, 0x2c55: 0x0060, 0x2c56: 0x0060, 0x2c57: 0x0060, + 0x2c58: 0x0060, 0x2c59: 0x0060, 0x2c5a: 0x0060, 0x2c5b: 0x0060, 0x2c5c: 0x0060, 0x2c5d: 0x0060, + 0x2c5e: 0x0060, 0x2c5f: 0x0060, 0x2c60: 0x0060, 0x2c61: 0x0060, 0x2c62: 0x0060, 0x2c63: 0x0060, + 0x2c64: 0x0060, 0x2c65: 0x0060, 0x2c66: 0x0060, 0x2c67: 0x0060, 0x2c68: 0x0060, 0x2c69: 0x0060, + 0x2c6a: 0x0060, 0x2c6b: 0x0060, 0x2c6c: 0x0060, 0x2c6d: 0x0060, 0x2c6e: 0x0060, 0x2c6f: 0x0060, + 0x2c70: 0x0060, 0x2c71: 0x0060, 0x2c72: 0x0060, 0x2c73: 0x0060, 0x2c74: 0x0060, 0x2c75: 0x0060, + 0x2c76: 0x0060, 0x2c77: 0x0060, 0x2c78: 0x0060, 0x2c79: 0x0060, 0x2c7a: 0x0060, 0x2c7b: 0x0060, + 0x2c7c: 0x0060, 0x2c7d: 0x0060, 0x2c7e: 0x0060, 0x2c7f: 0x0060, + // Block 0xb2, offset 0x2c80 + 0x2c80: 0x0060, 0x2c81: 0x0060, 0x2c82: 0x0060, 0x2c83: 0x0060, 0x2c84: 0x0060, 0x2c85: 0x0060, + 0x2c86: 0x0060, 0x2c87: 0x0060, 0x2c88: 0x0060, 0x2c89: 0x0060, 0x2c8a: 0x0060, 0x2c8b: 0x0060, + 0x2c8c: 0x0060, 0x2c8d: 0x0060, 0x2c8e: 0x0060, 0x2c8f: 0x0060, 0x2c90: 0x0010, 0x2c91: 0x0010, + 0x2c92: 0x0060, 0x2c93: 0x0060, 0x2c94: 0x0060, 0x2c95: 0x0060, 0x2c96: 0x0060, 0x2c97: 0x0060, + 0x2c98: 0x0060, 0x2c99: 0x0060, 0x2c9a: 0x0060, 0x2c9b: 0x0060, 0x2c9c: 0x0060, 0x2c9d: 0x0060, + 0x2c9e: 0x0060, 0x2c9f: 0x0060, 0x2ca0: 0x0060, 0x2ca1: 0x0060, 0x2ca2: 0x0060, 0x2ca3: 0x0060, + 0x2ca4: 0x0060, 0x2ca5: 0x0060, 0x2ca6: 0x0060, 0x2ca7: 0x0060, 0x2ca8: 0x0060, 0x2ca9: 0x0060, + 0x2caa: 0x0060, 0x2cab: 0x0060, 0x2cac: 0x0060, 0x2cad: 0x0060, 0x2cae: 0x0060, 0x2caf: 0x0060, + 0x2cb0: 0x0060, 0x2cb1: 0x0060, 0x2cb2: 0x0060, 0x2cb3: 0x0060, 0x2cb4: 0x0060, 0x2cb5: 0x0060, + 0x2cb6: 0x0060, 0x2cb7: 0x0060, 0x2cb8: 0x0060, 0x2cb9: 0x0060, 0x2cba: 0x0060, 0x2cbb: 0x0060, + 0x2cbc: 0x0060, 0x2cbd: 0x0060, 0x2cbe: 0x0060, 0x2cbf: 0x0060, + // Block 0xb3, offset 0x2cc0 + 0x2cc0: 0x0060, 0x2cc1: 0x0060, 0x2cc2: 0x0060, 0x2cc3: 0x0060, 0x2cc4: 0x0060, 0x2cc5: 0x0060, + 0x2cc6: 0x0060, 0x2cc7: 0x0060, 0x2cc8: 0x0010, 0x2cc9: 0x0010, 0x2cca: 0x0010, 0x2ccb: 0x0010, + 0x2ccc: 0x0010, 0x2ccd: 0x0010, 0x2cce: 0x0010, 0x2ccf: 0x0010, 0x2cd0: 0x0010, 0x2cd1: 0x0010, + 0x2cd2: 0x0010, 0x2cd3: 0x0010, 0x2cd4: 0x0010, 0x2cd5: 0x0010, 0x2cd6: 0x0010, 0x2cd7: 0x0010, + 0x2cd8: 0x0010, 0x2cd9: 0x0010, 0x2cda: 0x0010, 0x2cdb: 0x0010, 0x2cdc: 0x0010, 0x2cdd: 0x0010, + 0x2cde: 0x0010, 0x2cdf: 0x0010, 0x2ce0: 0x0010, 0x2ce1: 0x0010, 0x2ce2: 0x0010, 0x2ce3: 0x0010, + 0x2ce4: 0x0010, 0x2ce5: 0x0010, 0x2ce6: 0x0010, 0x2ce7: 0x0010, 0x2ce8: 0x0010, 0x2ce9: 0x0010, + 0x2cea: 0x0010, 0x2ceb: 0x0010, 0x2cec: 0x0010, 0x2ced: 0x0010, 0x2cee: 0x0010, 0x2cef: 0x0010, + 0x2cf0: 0x0060, 0x2cf1: 0x0060, 0x2cf2: 0x0060, 0x2cf3: 0x0060, 0x2cf4: 0x0060, 0x2cf5: 0x0060, + 0x2cf6: 0x0060, 0x2cf7: 0x0060, 0x2cf8: 0x0060, 0x2cf9: 0x0060, 0x2cfa: 0x0060, 0x2cfb: 0x0060, + 0x2cfc: 0x0060, 0x2cfd: 0x0060, 0x2cfe: 0x0010, 0x2cff: 0x0010, + // Block 0xb4, offset 0x2d00 + 0x2d00: 0x0008, 0x2d01: 0x0008, 0x2d02: 0x0008, 0x2d03: 0x0008, 0x2d04: 0x0008, 0x2d05: 0x0008, + 0x2d06: 0x0008, 0x2d07: 0x0008, 0x2d08: 0x0008, 0x2d09: 0x0008, 0x2d0a: 0x0008, 0x2d0b: 0x0008, + 0x2d0c: 0x0008, 0x2d0d: 0x0008, 0x2d0e: 0x0008, 0x2d0f: 0x0008, 0x2d10: 0x0060, 0x2d11: 0x0060, + 0x2d12: 0x0060, 0x2d13: 0x0060, 0x2d14: 0x0060, 0x2d15: 0x0060, 0x2d16: 0x0060, 0x2d17: 0x0060, + 0x2d18: 0x0060, 0x2d19: 0x0060, 0x2d1a: 0x0010, 0x2d1b: 0x0010, 0x2d1c: 0x0010, 0x2d1d: 0x0010, + 0x2d1e: 0x0010, 0x2d1f: 0x0010, 0x2d20: 0x0001, 0x2d21: 0x0001, 0x2d22: 0x0001, 0x2d23: 0x0001, + 0x2d24: 0x0001, 0x2d25: 0x0001, 0x2d26: 0x0001, 0x2d27: 0x0001, 0x2d28: 0x0001, 0x2d29: 0x0001, + 0x2d2a: 0x0001, 0x2d2b: 0x0001, 0x2d2c: 0x0001, 0x2d2d: 0x0001, 0x2d2e: 0x0001, 0x2d2f: 0x0001, + 0x2d30: 0x0060, 0x2d31: 0x0060, 0x2d32: 0x0060, 0x2d33: 0x0060, 0x2d34: 0x0060, 0x2d35: 0x0060, + 0x2d36: 0x0060, 0x2d37: 0x0060, 0x2d38: 0x0060, 0x2d39: 0x0060, 0x2d3a: 0x0060, 0x2d3b: 0x0060, + 0x2d3c: 0x0060, 0x2d3d: 0x0060, 0x2d3e: 0x0060, 0x2d3f: 0x0060, + // Block 0xb5, offset 0x2d40 + 0x2d40: 0x0060, 0x2d41: 0x0060, 0x2d42: 0x0060, 0x2d43: 0x0060, 0x2d44: 0x0060, 0x2d45: 0x0060, + 0x2d46: 0x0060, 0x2d47: 0x0060, 0x2d48: 0x0060, 0x2d49: 0x0060, 0x2d4a: 0x0060, 0x2d4b: 0x0060, + 0x2d4c: 0x0060, 0x2d4d: 0x0060, 0x2d4e: 0x0060, 0x2d4f: 0x0060, 0x2d50: 0x0060, 0x2d51: 0x0060, + 0x2d52: 0x0060, 0x2d53: 0x0010, 0x2d54: 0x0060, 0x2d55: 0x0060, 0x2d56: 0x0060, 0x2d57: 0x0060, + 0x2d58: 0x0060, 0x2d59: 0x0060, 0x2d5a: 0x0060, 0x2d5b: 0x0060, 0x2d5c: 0x0060, 0x2d5d: 0x0060, + 0x2d5e: 0x0060, 0x2d5f: 0x0060, 0x2d60: 0x0060, 0x2d61: 0x0060, 0x2d62: 0x0060, 0x2d63: 0x0060, + 0x2d64: 0x0060, 0x2d65: 0x0060, 0x2d66: 0x0060, 0x2d67: 0x0010, 0x2d68: 0x0060, 0x2d69: 0x0060, + 0x2d6a: 0x0060, 0x2d6b: 0x0060, 0x2d6c: 0x0010, 0x2d6d: 0x0010, 0x2d6e: 0x0010, 0x2d6f: 0x0010, + 0x2d70: 0x0060, 0x2d71: 0x0060, 0x2d72: 0x0060, 0x2d73: 0x0001, 0x2d74: 0x0060, 0x2d75: 0x0010, + 0x2d76: 0x0060, 0x2d77: 0x0060, 0x2d78: 0x0060, 0x2d79: 0x0060, 0x2d7a: 0x0060, 0x2d7b: 0x0060, + 0x2d7c: 0x0060, 0x2d7d: 0x0060, 0x2d7e: 0x0060, 0x2d7f: 0x0060, + // Block 0xb6, offset 0x2d80 + 0x2d80: 0x0060, 0x2d81: 0x0060, 0x2d82: 0x0060, 0x2d83: 0x0060, 0x2d84: 0x0060, 0x2d85: 0x0060, + 0x2d86: 0x0060, 0x2d87: 0x0060, 0x2d88: 0x0060, 0x2d89: 0x0060, 0x2d8a: 0x0060, 0x2d8b: 0x0060, + 0x2d8c: 0x0060, 0x2d8d: 0x0060, 0x2d8e: 0x0060, 0x2d8f: 0x0060, 0x2d90: 0x0060, 0x2d91: 0x0060, + 0x2d92: 0x0060, 0x2d93: 0x0060, 0x2d94: 0x0060, 0x2d95: 0x0060, 0x2d96: 0x0060, 0x2d97: 0x0060, + 0x2d98: 0x0060, 0x2d99: 0x0060, 0x2d9a: 0x0060, 0x2d9b: 0x0060, 0x2d9c: 0x0060, 0x2d9d: 0x0060, + 0x2d9e: 0x0060, 0x2d9f: 0x0060, 0x2da0: 0x0060, 0x2da1: 0x0060, 0x2da2: 0x0060, 0x2da3: 0x0060, + 0x2da4: 0x0060, 0x2da5: 0x0060, 0x2da6: 0x0060, 0x2da7: 0x0060, 0x2da8: 0x0060, 0x2da9: 0x0060, + 0x2daa: 0x0060, 0x2dab: 0x0060, 0x2dac: 0x0060, 0x2dad: 0x0060, 0x2dae: 0x0060, 0x2daf: 0x0060, + 0x2db0: 0x0060, 0x2db1: 0x0060, 0x2db2: 0x0060, 0x2db3: 0x0060, 0x2db4: 0x0060, 0x2db5: 0x0060, + 0x2db6: 0x0060, 0x2db7: 0x0060, 0x2db8: 0x0060, 0x2db9: 0x0060, 0x2dba: 0x0060, 0x2dbb: 0x0060, + 0x2dbc: 0x0060, 0x2dbd: 0x0010, 0x2dbe: 0x0010, 0x2dbf: 0x0008, + // Block 0xb7, offset 0x2dc0 + 0x2dc0: 0x0010, 0x2dc1: 0x0060, 0x2dc2: 0x0060, 0x2dc3: 0x0060, 0x2dc4: 0x0060, 0x2dc5: 0x0060, + 0x2dc6: 0x0060, 0x2dc7: 0x0060, 0x2dc8: 0x0060, 0x2dc9: 0x0060, 0x2dca: 0x0060, 0x2dcb: 0x0060, + 0x2dcc: 0x0060, 0x2dcd: 0x0060, 0x2dce: 0x0060, 0x2dcf: 0x0060, 0x2dd0: 0x0060, 0x2dd1: 0x0060, + 0x2dd2: 0x0060, 0x2dd3: 0x0060, 0x2dd4: 0x0060, 0x2dd5: 0x0060, 0x2dd6: 0x0060, 0x2dd7: 0x0060, + 0x2dd8: 0x0060, 0x2dd9: 0x0060, 0x2dda: 0x0060, 0x2ddb: 0x0060, 0x2ddc: 0x0060, 0x2ddd: 0x0060, + 0x2dde: 0x0060, 0x2ddf: 0x0060, 0x2de0: 0x0060, 0x2de1: 0x0060, 0x2de2: 0x0060, 0x2de3: 0x0060, + 0x2de4: 0x0060, 0x2de5: 0x0060, 0x2de6: 0x0060, 0x2de7: 0x0060, 0x2de8: 0x0060, 0x2de9: 0x0060, + 0x2dea: 0x0060, 0x2deb: 0x0060, 0x2dec: 0x0060, 0x2ded: 0x0060, 0x2dee: 0x0060, 0x2def: 0x0060, + 0x2df0: 0x0060, 0x2df1: 0x0060, 0x2df2: 0x0060, 0x2df3: 0x0060, 0x2df4: 0x0060, 0x2df5: 0x0060, + 0x2df6: 0x0060, 0x2df7: 0x0060, 0x2df8: 0x0060, 0x2df9: 0x0060, 0x2dfa: 0x0060, 0x2dfb: 0x0060, + 0x2dfc: 0x0060, 0x2dfd: 0x0060, 0x2dfe: 0x0060, 0x2dff: 0x0060, + // Block 0xb8, offset 0x2e00 + 0x2e00: 0x0060, 0x2e01: 0x0060, 0x2e02: 0x0060, 0x2e03: 0x0060, 0x2e04: 0x0060, 0x2e05: 0x0060, + 0x2e06: 0x0060, 0x2e07: 0x0060, 0x2e08: 0x0060, 0x2e09: 0x0060, 0x2e0a: 0x0060, 0x2e0b: 0x0060, + 0x2e0c: 0x0060, 0x2e0d: 0x0060, 0x2e0e: 0x0060, 0x2e0f: 0x0060, 0x2e10: 0x0060, 0x2e11: 0x0060, + 0x2e12: 0x0060, 0x2e13: 0x0060, 0x2e14: 0x0060, 0x2e15: 0x0060, 0x2e16: 0x0060, 0x2e17: 0x0060, + 0x2e18: 0x0060, 0x2e19: 0x0060, 0x2e1a: 0x0060, 0x2e1b: 0x0060, 0x2e1c: 0x0060, 0x2e1d: 0x0060, + 0x2e1e: 0x0060, 0x2e1f: 0x0060, 0x2e20: 0x0008, 0x2e21: 0x0060, 0x2e22: 0x0060, 0x2e23: 0x0060, + 0x2e24: 0x0060, 0x2e25: 0x0060, 0x2e26: 0x0060, 0x2e27: 0x0060, 0x2e28: 0x0060, 0x2e29: 0x0060, + 0x2e2a: 0x0060, 0x2e2b: 0x0060, 0x2e2c: 0x0060, 0x2e2d: 0x0060, 0x2e2e: 0x0060, 0x2e2f: 0x0060, + 0x2e30: 0x0060, 0x2e31: 0x0060, 0x2e32: 0x0060, 0x2e33: 0x0060, 0x2e34: 0x0060, 0x2e35: 0x0060, + 0x2e36: 0x0060, 0x2e37: 0x0060, 0x2e38: 0x0060, 0x2e39: 0x0060, 0x2e3a: 0x0060, 0x2e3b: 0x0060, + 0x2e3c: 0x0060, 0x2e3d: 0x0060, 0x2e3e: 0x0060, 0x2e3f: 0x0010, + // Block 0xb9, offset 0x2e40 + 0x2e40: 0x0010, 0x2e41: 0x0010, 0x2e42: 0x0060, 0x2e43: 0x0060, 0x2e44: 0x0060, 0x2e45: 0x0060, + 0x2e46: 0x0060, 0x2e47: 0x0060, 0x2e48: 0x0010, 0x2e49: 0x0010, 0x2e4a: 0x0060, 0x2e4b: 0x0060, + 0x2e4c: 0x0060, 0x2e4d: 0x0060, 0x2e4e: 0x0060, 0x2e4f: 0x0060, 0x2e50: 0x0010, 0x2e51: 0x0010, + 0x2e52: 0x0060, 0x2e53: 0x0060, 0x2e54: 0x0060, 0x2e55: 0x0060, 0x2e56: 0x0060, 0x2e57: 0x0060, + 0x2e58: 0x0010, 0x2e59: 0x0010, 0x2e5a: 0x0060, 0x2e5b: 0x0060, 0x2e5c: 0x0060, 0x2e5d: 0x0010, + 0x2e5e: 0x0010, 0x2e5f: 0x0010, 0x2e60: 0x0060, 0x2e61: 0x0060, 0x2e62: 0x0060, 0x2e63: 0x0060, + 0x2e64: 0x0060, 0x2e65: 0x0060, 0x2e66: 0x0060, 0x2e67: 0x0010, 0x2e68: 0x0060, 0x2e69: 0x0060, + 0x2e6a: 0x0060, 0x2e6b: 0x0060, 0x2e6c: 0x0060, 0x2e6d: 0x0060, 0x2e6e: 0x0060, 0x2e6f: 0x0010, + 0x2e70: 0x0010, 0x2e71: 0x0010, 0x2e72: 0x0010, 0x2e73: 0x0010, 0x2e74: 0x0010, 0x2e75: 0x0010, + 0x2e76: 0x0010, 0x2e77: 0x0010, 0x2e78: 0x0010, 0x2e79: 0x0008, 0x2e7a: 0x0008, 0x2e7b: 0x0008, + 0x2e7c: 0x0060, 0x2e7d: 0x0060, 0x2e7e: 0x0010, 0x2e7f: 0x0010, + // Block 0xba, offset 0x2e80 + 0x2e80: 0x0001, 0x2e81: 0x0001, 0x2e82: 0x0001, 0x2e83: 0x0001, 0x2e84: 0x0001, 0x2e85: 0x0001, + 0x2e86: 0x0001, 0x2e87: 0x0001, 0x2e88: 0x0001, 0x2e89: 0x0001, 0x2e8a: 0x0001, 0x2e8b: 0x0001, + 0x2e8c: 0x0010, 0x2e8d: 0x0001, 0x2e8e: 0x0001, 0x2e8f: 0x0001, 0x2e90: 0x0001, 0x2e91: 0x0001, + 0x2e92: 0x0001, 0x2e93: 0x0001, 0x2e94: 0x0001, 0x2e95: 0x0001, 0x2e96: 0x0001, 0x2e97: 0x0001, + 0x2e98: 0x0001, 0x2e99: 0x0001, 0x2e9a: 0x0001, 0x2e9b: 0x0001, 0x2e9c: 0x0001, 0x2e9d: 0x0001, + 0x2e9e: 0x0001, 0x2e9f: 0x0001, 0x2ea0: 0x0001, 0x2ea1: 0x0001, 0x2ea2: 0x0001, 0x2ea3: 0x0001, + 0x2ea4: 0x0001, 0x2ea5: 0x0001, 0x2ea6: 0x0001, 0x2ea7: 0x0010, 0x2ea8: 0x0001, 0x2ea9: 0x0001, + 0x2eaa: 0x0001, 0x2eab: 0x0001, 0x2eac: 0x0001, 0x2ead: 0x0001, 0x2eae: 0x0001, 0x2eaf: 0x0001, + 0x2eb0: 0x0001, 0x2eb1: 0x0001, 0x2eb2: 0x0001, 0x2eb3: 0x0001, 0x2eb4: 0x0001, 0x2eb5: 0x0001, + 0x2eb6: 0x0001, 0x2eb7: 0x0001, 0x2eb8: 0x0001, 0x2eb9: 0x0001, 0x2eba: 0x0001, 0x2ebb: 0x0010, + 0x2ebc: 0x0001, 0x2ebd: 0x0001, 0x2ebe: 0x0010, 0x2ebf: 0x0001, + // Block 0xbb, offset 0x2ec0 + 0x2ec0: 0x0001, 0x2ec1: 0x0001, 0x2ec2: 0x0001, 0x2ec3: 0x0001, 0x2ec4: 0x0001, 0x2ec5: 0x0001, + 0x2ec6: 0x0001, 0x2ec7: 0x0001, 0x2ec8: 0x0001, 0x2ec9: 0x0001, 0x2eca: 0x0001, 0x2ecb: 0x0001, + 0x2ecc: 0x0001, 0x2ecd: 0x0001, 0x2ece: 0x0010, 0x2ecf: 0x0010, 0x2ed0: 0x0001, 0x2ed1: 0x0001, + 0x2ed2: 0x0001, 0x2ed3: 0x0001, 0x2ed4: 0x0001, 0x2ed5: 0x0001, 0x2ed6: 0x0001, 0x2ed7: 0x0001, + 0x2ed8: 0x0001, 0x2ed9: 0x0001, 0x2eda: 0x0001, 0x2edb: 0x0001, 0x2edc: 0x0001, 0x2edd: 0x0001, + 0x2ede: 0x0010, 0x2edf: 0x0010, 0x2ee0: 0x0010, 0x2ee1: 0x0010, 0x2ee2: 0x0010, 0x2ee3: 0x0010, + 0x2ee4: 0x0010, 0x2ee5: 0x0010, 0x2ee6: 0x0010, 0x2ee7: 0x0010, 0x2ee8: 0x0010, 0x2ee9: 0x0010, + 0x2eea: 0x0010, 0x2eeb: 0x0010, 0x2eec: 0x0010, 0x2eed: 0x0010, 0x2eee: 0x0010, 0x2eef: 0x0010, + 0x2ef0: 0x0010, 0x2ef1: 0x0010, 0x2ef2: 0x0010, 0x2ef3: 0x0010, 0x2ef4: 0x0010, 0x2ef5: 0x0010, + 0x2ef6: 0x0010, 0x2ef7: 0x0010, 0x2ef8: 0x0010, 0x2ef9: 0x0010, 0x2efa: 0x0010, 0x2efb: 0x0010, + 0x2efc: 0x0010, 0x2efd: 0x0010, 0x2efe: 0x0010, 0x2eff: 0x0010, + // Block 0xbc, offset 0x2f00 + 0x2f00: 0x0001, 0x2f01: 0x0001, 0x2f02: 0x0001, 0x2f03: 0x0001, 0x2f04: 0x0001, 0x2f05: 0x0001, + 0x2f06: 0x0001, 0x2f07: 0x0001, 0x2f08: 0x0001, 0x2f09: 0x0001, 0x2f0a: 0x0001, 0x2f0b: 0x0001, + 0x2f0c: 0x0001, 0x2f0d: 0x0001, 0x2f0e: 0x0001, 0x2f0f: 0x0001, 0x2f10: 0x0001, 0x2f11: 0x0001, + 0x2f12: 0x0001, 0x2f13: 0x0001, 0x2f14: 0x0001, 0x2f15: 0x0001, 0x2f16: 0x0001, 0x2f17: 0x0001, + 0x2f18: 0x0001, 0x2f19: 0x0001, 0x2f1a: 0x0001, 0x2f1b: 0x0001, 0x2f1c: 0x0001, 0x2f1d: 0x0001, + 0x2f1e: 0x0001, 0x2f1f: 0x0001, 0x2f20: 0x0001, 0x2f21: 0x0001, 0x2f22: 0x0001, 0x2f23: 0x0001, + 0x2f24: 0x0001, 0x2f25: 0x0001, 0x2f26: 0x0001, 0x2f27: 0x0001, 0x2f28: 0x0001, 0x2f29: 0x0001, + 0x2f2a: 0x0001, 0x2f2b: 0x0001, 0x2f2c: 0x0001, 0x2f2d: 0x0001, 0x2f2e: 0x0001, 0x2f2f: 0x0001, + 0x2f30: 0x0001, 0x2f31: 0x0001, 0x2f32: 0x0001, 0x2f33: 0x0001, 0x2f34: 0x0001, 0x2f35: 0x0001, + 0x2f36: 0x0001, 0x2f37: 0x0001, 0x2f38: 0x0001, 0x2f39: 0x0001, 0x2f3a: 0x0001, 0x2f3b: 0x0010, + 0x2f3c: 0x0010, 0x2f3d: 0x0010, 0x2f3e: 0x0010, 0x2f3f: 0x0010, + // Block 0xbd, offset 0x2f40 + 0x2f40: 0x0060, 0x2f41: 0x0060, 0x2f42: 0x0060, 0x2f43: 0x0010, 0x2f44: 0x0010, 0x2f45: 0x0010, + 0x2f46: 0x0010, 0x2f47: 0x0060, 0x2f48: 0x0060, 0x2f49: 0x0060, 0x2f4a: 0x0060, 0x2f4b: 0x0060, + 0x2f4c: 0x0060, 0x2f4d: 0x0060, 0x2f4e: 0x0060, 0x2f4f: 0x0060, 0x2f50: 0x0060, 0x2f51: 0x0060, + 0x2f52: 0x0060, 0x2f53: 0x0060, 0x2f54: 0x0060, 0x2f55: 0x0060, 0x2f56: 0x0060, 0x2f57: 0x0060, + 0x2f58: 0x0060, 0x2f59: 0x0060, 0x2f5a: 0x0060, 0x2f5b: 0x0060, 0x2f5c: 0x0060, 0x2f5d: 0x0060, + 0x2f5e: 0x0060, 0x2f5f: 0x0060, 0x2f60: 0x0060, 0x2f61: 0x0060, 0x2f62: 0x0060, 0x2f63: 0x0060, + 0x2f64: 0x0060, 0x2f65: 0x0060, 0x2f66: 0x0060, 0x2f67: 0x0060, 0x2f68: 0x0060, 0x2f69: 0x0060, + 0x2f6a: 0x0060, 0x2f6b: 0x0060, 0x2f6c: 0x0060, 0x2f6d: 0x0060, 0x2f6e: 0x0060, 0x2f6f: 0x0060, + 0x2f70: 0x0060, 0x2f71: 0x0060, 0x2f72: 0x0060, 0x2f73: 0x0060, 0x2f74: 0x0010, 0x2f75: 0x0010, + 0x2f76: 0x0010, 0x2f77: 0x0060, 0x2f78: 0x0060, 0x2f79: 0x0060, 0x2f7a: 0x0060, 0x2f7b: 0x0060, + 0x2f7c: 0x0060, 0x2f7d: 0x0060, 0x2f7e: 0x0060, 0x2f7f: 0x0060, + // Block 0xbe, offset 0x2f80 + 0x2f80: 0x0060, 0x2f81: 0x0060, 0x2f82: 0x0060, 0x2f83: 0x0060, 0x2f84: 0x0060, 0x2f85: 0x0060, + 0x2f86: 0x0060, 0x2f87: 0x0060, 0x2f88: 0x0060, 0x2f89: 0x0060, 0x2f8a: 0x0060, 0x2f8b: 0x0060, + 0x2f8c: 0x0060, 0x2f8d: 0x0010, 0x2f8e: 0x0010, 0x2f8f: 0x0010, 0x2f90: 0x0060, 0x2f91: 0x0060, + 0x2f92: 0x0060, 0x2f93: 0x0060, 0x2f94: 0x0060, 0x2f95: 0x0060, 0x2f96: 0x0060, 0x2f97: 0x0060, + 0x2f98: 0x0060, 0x2f99: 0x0060, 0x2f9a: 0x0060, 0x2f9b: 0x0060, 0x2f9c: 0x0010, 0x2f9d: 0x0010, + 0x2f9e: 0x0010, 0x2f9f: 0x0010, 0x2fa0: 0x0060, 0x2fa1: 0x0010, 0x2fa2: 0x0010, 0x2fa3: 0x0010, + 0x2fa4: 0x0010, 0x2fa5: 0x0010, 0x2fa6: 0x0010, 0x2fa7: 0x0010, 0x2fa8: 0x0010, 0x2fa9: 0x0010, + 0x2faa: 0x0010, 0x2fab: 0x0010, 0x2fac: 0x0010, 0x2fad: 0x0010, 0x2fae: 0x0010, 0x2faf: 0x0010, + 0x2fb0: 0x0010, 0x2fb1: 0x0010, 0x2fb2: 0x0010, 0x2fb3: 0x0010, 0x2fb4: 0x0010, 0x2fb5: 0x0010, + 0x2fb6: 0x0010, 0x2fb7: 0x0010, 0x2fb8: 0x0010, 0x2fb9: 0x0010, 0x2fba: 0x0010, 0x2fbb: 0x0010, + 0x2fbc: 0x0010, 0x2fbd: 0x0010, 0x2fbe: 0x0010, 0x2fbf: 0x0010, + // Block 0xbf, offset 0x2fc0 + 0x2fc0: 0x0010, 0x2fc1: 0x0010, 0x2fc2: 0x0010, 0x2fc3: 0x0010, 0x2fc4: 0x0010, 0x2fc5: 0x0010, + 0x2fc6: 0x0010, 0x2fc7: 0x0010, 0x2fc8: 0x0010, 0x2fc9: 0x0010, 0x2fca: 0x0010, 0x2fcb: 0x0010, + 0x2fcc: 0x0010, 0x2fcd: 0x0010, 0x2fce: 0x0010, 0x2fcf: 0x0010, 0x2fd0: 0x0060, 0x2fd1: 0x0060, + 0x2fd2: 0x0060, 0x2fd3: 0x0060, 0x2fd4: 0x0060, 0x2fd5: 0x0060, 0x2fd6: 0x0060, 0x2fd7: 0x0060, + 0x2fd8: 0x0060, 0x2fd9: 0x0060, 0x2fda: 0x0060, 0x2fdb: 0x0060, 0x2fdc: 0x0060, 0x2fdd: 0x0060, + 0x2fde: 0x0060, 0x2fdf: 0x0060, 0x2fe0: 0x0060, 0x2fe1: 0x0060, 0x2fe2: 0x0060, 0x2fe3: 0x0060, + 0x2fe4: 0x0060, 0x2fe5: 0x0060, 0x2fe6: 0x0060, 0x2fe7: 0x0060, 0x2fe8: 0x0060, 0x2fe9: 0x0060, + 0x2fea: 0x0060, 0x2feb: 0x0060, 0x2fec: 0x0060, 0x2fed: 0x0060, 0x2fee: 0x0060, 0x2fef: 0x0060, + 0x2ff0: 0x0060, 0x2ff1: 0x0060, 0x2ff2: 0x0060, 0x2ff3: 0x0060, 0x2ff4: 0x0060, 0x2ff5: 0x0060, + 0x2ff6: 0x0060, 0x2ff7: 0x0060, 0x2ff8: 0x0060, 0x2ff9: 0x0060, 0x2ffa: 0x0060, 0x2ffb: 0x0060, + 0x2ffc: 0x0060, 0x2ffd: 0x0001, 0x2ffe: 0x0010, 0x2fff: 0x0010, + // Block 0xc0, offset 0x3000 + 0x3000: 0x0001, 0x3001: 0x0001, 0x3002: 0x0001, 0x3003: 0x0001, 0x3004: 0x0001, 0x3005: 0x0001, + 0x3006: 0x0001, 0x3007: 0x0001, 0x3008: 0x0001, 0x3009: 0x0001, 0x300a: 0x0001, 0x300b: 0x0001, + 0x300c: 0x0001, 0x300d: 0x0001, 0x300e: 0x0001, 0x300f: 0x0001, 0x3010: 0x0001, 0x3011: 0x0001, + 0x3012: 0x0001, 0x3013: 0x0001, 0x3014: 0x0001, 0x3015: 0x0001, 0x3016: 0x0001, 0x3017: 0x0001, + 0x3018: 0x0001, 0x3019: 0x0001, 0x301a: 0x0001, 0x301b: 0x0001, 0x301c: 0x0001, 0x301d: 0x0010, + 0x301e: 0x0010, 0x301f: 0x0010, 0x3020: 0x0001, 0x3021: 0x0001, 0x3022: 0x0001, 0x3023: 0x0001, + 0x3024: 0x0001, 0x3025: 0x0001, 0x3026: 0x0001, 0x3027: 0x0001, 0x3028: 0x0001, 0x3029: 0x0001, + 0x302a: 0x0001, 0x302b: 0x0001, 0x302c: 0x0001, 0x302d: 0x0001, 0x302e: 0x0001, 0x302f: 0x0001, + 0x3030: 0x0001, 0x3031: 0x0001, 0x3032: 0x0001, 0x3033: 0x0001, 0x3034: 0x0001, 0x3035: 0x0001, + 0x3036: 0x0001, 0x3037: 0x0001, 0x3038: 0x0001, 0x3039: 0x0001, 0x303a: 0x0001, 0x303b: 0x0001, + 0x303c: 0x0001, 0x303d: 0x0001, 0x303e: 0x0001, 0x303f: 0x0001, + // Block 0xc1, offset 0x3040 + 0x3040: 0x0001, 0x3041: 0x0001, 0x3042: 0x0001, 0x3043: 0x0001, 0x3044: 0x0001, 0x3045: 0x0001, + 0x3046: 0x0001, 0x3047: 0x0001, 0x3048: 0x0001, 0x3049: 0x0001, 0x304a: 0x0001, 0x304b: 0x0001, + 0x304c: 0x0001, 0x304d: 0x0001, 0x304e: 0x0001, 0x304f: 0x0001, 0x3050: 0x0001, 0x3051: 0x0010, + 0x3052: 0x0010, 0x3053: 0x0010, 0x3054: 0x0010, 0x3055: 0x0010, 0x3056: 0x0010, 0x3057: 0x0010, + 0x3058: 0x0010, 0x3059: 0x0010, 0x305a: 0x0010, 0x305b: 0x0010, 0x305c: 0x0010, 0x305d: 0x0010, + 0x305e: 0x0010, 0x305f: 0x0010, 0x3060: 0x0001, 0x3061: 0x0060, 0x3062: 0x0060, 0x3063: 0x0060, + 0x3064: 0x0060, 0x3065: 0x0060, 0x3066: 0x0060, 0x3067: 0x0060, 0x3068: 0x0060, 0x3069: 0x0060, + 0x306a: 0x0060, 0x306b: 0x0060, 0x306c: 0x0060, 0x306d: 0x0060, 0x306e: 0x0060, 0x306f: 0x0060, + 0x3070: 0x0060, 0x3071: 0x0060, 0x3072: 0x0060, 0x3073: 0x0060, 0x3074: 0x0060, 0x3075: 0x0060, + 0x3076: 0x0060, 0x3077: 0x0060, 0x3078: 0x0060, 0x3079: 0x0060, 0x307a: 0x0060, 0x307b: 0x0060, + 0x307c: 0x0010, 0x307d: 0x0010, 0x307e: 0x0010, 0x307f: 0x0010, + // Block 0xc2, offset 0x3080 + 0x3080: 0x0001, 0x3081: 0x0001, 0x3082: 0x0001, 0x3083: 0x0001, 0x3084: 0x0001, 0x3085: 0x0001, + 0x3086: 0x0001, 0x3087: 0x0001, 0x3088: 0x0001, 0x3089: 0x0001, 0x308a: 0x0001, 0x308b: 0x0001, + 0x308c: 0x0001, 0x308d: 0x0001, 0x308e: 0x0001, 0x308f: 0x0001, 0x3090: 0x0001, 0x3091: 0x0001, + 0x3092: 0x0001, 0x3093: 0x0001, 0x3094: 0x0001, 0x3095: 0x0001, 0x3096: 0x0001, 0x3097: 0x0001, + 0x3098: 0x0001, 0x3099: 0x0001, 0x309a: 0x0001, 0x309b: 0x0001, 0x309c: 0x0001, 0x309d: 0x0001, + 0x309e: 0x0001, 0x309f: 0x0001, 0x30a0: 0x0060, 0x30a1: 0x0060, 0x30a2: 0x0060, 0x30a3: 0x0060, + 0x30a4: 0x0010, 0x30a5: 0x0010, 0x30a6: 0x0010, 0x30a7: 0x0010, 0x30a8: 0x0010, 0x30a9: 0x0010, + 0x30aa: 0x0010, 0x30ab: 0x0010, 0x30ac: 0x0010, 0x30ad: 0x0010, 0x30ae: 0x0010, 0x30af: 0x0010, + 0x30b0: 0x0001, 0x30b1: 0x0001, 0x30b2: 0x0001, 0x30b3: 0x0001, 0x30b4: 0x0001, 0x30b5: 0x0001, + 0x30b6: 0x0001, 0x30b7: 0x0001, 0x30b8: 0x0001, 0x30b9: 0x0001, 0x30ba: 0x0001, 0x30bb: 0x0001, + 0x30bc: 0x0001, 0x30bd: 0x0001, 0x30be: 0x0001, 0x30bf: 0x0001, + // Block 0xc3, offset 0x30c0 + 0x30c0: 0x0001, 0x30c1: 0x0060, 0x30c2: 0x0001, 0x30c3: 0x0001, 0x30c4: 0x0001, 0x30c5: 0x0001, + 0x30c6: 0x0001, 0x30c7: 0x0001, 0x30c8: 0x0001, 0x30c9: 0x0001, 0x30ca: 0x0060, 0x30cb: 0x0010, + 0x30cc: 0x0010, 0x30cd: 0x0010, 0x30ce: 0x0010, 0x30cf: 0x0010, 0x30d0: 0x0001, 0x30d1: 0x0001, + 0x30d2: 0x0001, 0x30d3: 0x0001, 0x30d4: 0x0001, 0x30d5: 0x0001, 0x30d6: 0x0001, 0x30d7: 0x0001, + 0x30d8: 0x0001, 0x30d9: 0x0001, 0x30da: 0x0001, 0x30db: 0x0001, 0x30dc: 0x0001, 0x30dd: 0x0001, + 0x30de: 0x0001, 0x30df: 0x0001, 0x30e0: 0x0001, 0x30e1: 0x0001, 0x30e2: 0x0001, 0x30e3: 0x0001, + 0x30e4: 0x0001, 0x30e5: 0x0001, 0x30e6: 0x0001, 0x30e7: 0x0001, 0x30e8: 0x0001, 0x30e9: 0x0001, + 0x30ea: 0x0001, 0x30eb: 0x0001, 0x30ec: 0x0001, 0x30ed: 0x0001, 0x30ee: 0x0001, 0x30ef: 0x0001, + 0x30f0: 0x0001, 0x30f1: 0x0001, 0x30f2: 0x0001, 0x30f3: 0x0001, 0x30f4: 0x0001, 0x30f5: 0x0001, + 0x30f6: 0x0001, 0x30f7: 0x0001, 0x30f8: 0x0001, 0x30f9: 0x0001, 0x30fa: 0x0001, 0x30fb: 0x0010, + 0x30fc: 0x0010, 0x30fd: 0x0010, 0x30fe: 0x0010, 0x30ff: 0x0010, + // Block 0xc4, offset 0x3100 + 0x3100: 0x0001, 0x3101: 0x0001, 0x3102: 0x0001, 0x3103: 0x0001, 0x3104: 0x0001, 0x3105: 0x0001, + 0x3106: 0x0001, 0x3107: 0x0001, 0x3108: 0x0001, 0x3109: 0x0001, 0x310a: 0x0001, 0x310b: 0x0001, + 0x310c: 0x0001, 0x310d: 0x0001, 0x310e: 0x0001, 0x310f: 0x0001, 0x3110: 0x0001, 0x3111: 0x0001, + 0x3112: 0x0001, 0x3113: 0x0001, 0x3114: 0x0001, 0x3115: 0x0001, 0x3116: 0x0001, 0x3117: 0x0001, + 0x3118: 0x0001, 0x3119: 0x0001, 0x311a: 0x0001, 0x311b: 0x0001, 0x311c: 0x0001, 0x311d: 0x0001, + 0x311e: 0x0010, 0x311f: 0x0060, 0x3120: 0x0001, 0x3121: 0x0001, 0x3122: 0x0001, 0x3123: 0x0001, + 0x3124: 0x0001, 0x3125: 0x0001, 0x3126: 0x0001, 0x3127: 0x0001, 0x3128: 0x0001, 0x3129: 0x0001, + 0x312a: 0x0001, 0x312b: 0x0001, 0x312c: 0x0001, 0x312d: 0x0001, 0x312e: 0x0001, 0x312f: 0x0001, + 0x3130: 0x0001, 0x3131: 0x0001, 0x3132: 0x0001, 0x3133: 0x0001, 0x3134: 0x0001, 0x3135: 0x0001, + 0x3136: 0x0001, 0x3137: 0x0001, 0x3138: 0x0001, 0x3139: 0x0001, 0x313a: 0x0001, 0x313b: 0x0001, + 0x313c: 0x0001, 0x313d: 0x0001, 0x313e: 0x0001, 0x313f: 0x0001, + // Block 0xc5, offset 0x3140 + 0x3140: 0x0001, 0x3141: 0x0001, 0x3142: 0x0001, 0x3143: 0x0001, 0x3144: 0x0010, 0x3145: 0x0010, + 0x3146: 0x0010, 0x3147: 0x0010, 0x3148: 0x0001, 0x3149: 0x0001, 0x314a: 0x0001, 0x314b: 0x0001, + 0x314c: 0x0001, 0x314d: 0x0001, 0x314e: 0x0001, 0x314f: 0x0001, 0x3150: 0x0060, 0x3151: 0x0060, + 0x3152: 0x0060, 0x3153: 0x0060, 0x3154: 0x0060, 0x3155: 0x0060, 0x3156: 0x0010, 0x3157: 0x0010, + 0x3158: 0x0010, 0x3159: 0x0010, 0x315a: 0x0010, 0x315b: 0x0010, 0x315c: 0x0010, 0x315d: 0x0010, + 0x315e: 0x0010, 0x315f: 0x0010, 0x3160: 0x0010, 0x3161: 0x0010, 0x3162: 0x0010, 0x3163: 0x0010, + 0x3164: 0x0010, 0x3165: 0x0010, 0x3166: 0x0010, 0x3167: 0x0010, 0x3168: 0x0010, 0x3169: 0x0010, + 0x316a: 0x0010, 0x316b: 0x0010, 0x316c: 0x0010, 0x316d: 0x0010, 0x316e: 0x0010, 0x316f: 0x0010, + 0x3170: 0x0010, 0x3171: 0x0010, 0x3172: 0x0010, 0x3173: 0x0010, 0x3174: 0x0010, 0x3175: 0x0010, + 0x3176: 0x0010, 0x3177: 0x0010, 0x3178: 0x0010, 0x3179: 0x0010, 0x317a: 0x0010, 0x317b: 0x0010, + 0x317c: 0x0010, 0x317d: 0x0010, 0x317e: 0x0010, 0x317f: 0x0010, + // Block 0xc6, offset 0x3180 + 0x3180: 0x0001, 0x3181: 0x0001, 0x3182: 0x0001, 0x3183: 0x0001, 0x3184: 0x0001, 0x3185: 0x0001, + 0x3186: 0x0001, 0x3187: 0x0001, 0x3188: 0x0001, 0x3189: 0x0001, 0x318a: 0x0001, 0x318b: 0x0001, + 0x318c: 0x0001, 0x318d: 0x0001, 0x318e: 0x0001, 0x318f: 0x0001, 0x3190: 0x0001, 0x3191: 0x0001, + 0x3192: 0x0001, 0x3193: 0x0001, 0x3194: 0x0001, 0x3195: 0x0001, 0x3196: 0x0001, 0x3197: 0x0001, + 0x3198: 0x0001, 0x3199: 0x0001, 0x319a: 0x0001, 0x319b: 0x0001, 0x319c: 0x0001, 0x319d: 0x0001, + 0x319e: 0x0010, 0x319f: 0x0010, 0x31a0: 0x0001, 0x31a1: 0x0001, 0x31a2: 0x0001, 0x31a3: 0x0001, + 0x31a4: 0x0001, 0x31a5: 0x0001, 0x31a6: 0x0001, 0x31a7: 0x0001, 0x31a8: 0x0001, 0x31a9: 0x0001, + 0x31aa: 0x0010, 0x31ab: 0x0010, 0x31ac: 0x0010, 0x31ad: 0x0010, 0x31ae: 0x0010, 0x31af: 0x0010, + 0x31b0: 0x0010, 0x31b1: 0x0010, 0x31b2: 0x0010, 0x31b3: 0x0010, 0x31b4: 0x0010, 0x31b5: 0x0010, + 0x31b6: 0x0010, 0x31b7: 0x0010, 0x31b8: 0x0010, 0x31b9: 0x0010, 0x31ba: 0x0010, 0x31bb: 0x0010, + 0x31bc: 0x0010, 0x31bd: 0x0010, 0x31be: 0x0010, 0x31bf: 0x0010, + // Block 0xc7, offset 0x31c0 + 0x31c0: 0x0001, 0x31c1: 0x0001, 0x31c2: 0x0001, 0x31c3: 0x0001, 0x31c4: 0x0001, 0x31c5: 0x0001, + 0x31c6: 0x0001, 0x31c7: 0x0001, 0x31c8: 0x0001, 0x31c9: 0x0001, 0x31ca: 0x0001, 0x31cb: 0x0001, + 0x31cc: 0x0001, 0x31cd: 0x0001, 0x31ce: 0x0001, 0x31cf: 0x0001, 0x31d0: 0x0001, 0x31d1: 0x0001, + 0x31d2: 0x0001, 0x31d3: 0x0001, 0x31d4: 0x0001, 0x31d5: 0x0001, 0x31d6: 0x0001, 0x31d7: 0x0001, + 0x31d8: 0x0001, 0x31d9: 0x0001, 0x31da: 0x0001, 0x31db: 0x0001, 0x31dc: 0x0001, 0x31dd: 0x0001, + 0x31de: 0x0001, 0x31df: 0x0001, 0x31e0: 0x0001, 0x31e1: 0x0001, 0x31e2: 0x0001, 0x31e3: 0x0001, + 0x31e4: 0x0001, 0x31e5: 0x0001, 0x31e6: 0x0001, 0x31e7: 0x0001, 0x31e8: 0x0010, 0x31e9: 0x0010, + 0x31ea: 0x0010, 0x31eb: 0x0010, 0x31ec: 0x0010, 0x31ed: 0x0010, 0x31ee: 0x0010, 0x31ef: 0x0010, + 0x31f0: 0x0001, 0x31f1: 0x0001, 0x31f2: 0x0001, 0x31f3: 0x0001, 0x31f4: 0x0001, 0x31f5: 0x0001, + 0x31f6: 0x0001, 0x31f7: 0x0001, 0x31f8: 0x0001, 0x31f9: 0x0001, 0x31fa: 0x0001, 0x31fb: 0x0001, + 0x31fc: 0x0001, 0x31fd: 0x0001, 0x31fe: 0x0001, 0x31ff: 0x0001, + // Block 0xc8, offset 0x3200 + 0x3200: 0x0001, 0x3201: 0x0001, 0x3202: 0x0001, 0x3203: 0x0001, 0x3204: 0x0001, 0x3205: 0x0001, + 0x3206: 0x0001, 0x3207: 0x0001, 0x3208: 0x0001, 0x3209: 0x0001, 0x320a: 0x0001, 0x320b: 0x0001, + 0x320c: 0x0001, 0x320d: 0x0001, 0x320e: 0x0001, 0x320f: 0x0001, 0x3210: 0x0001, 0x3211: 0x0001, + 0x3212: 0x0001, 0x3213: 0x0001, 0x3214: 0x0001, 0x3215: 0x0001, 0x3216: 0x0001, 0x3217: 0x0001, + 0x3218: 0x0001, 0x3219: 0x0001, 0x321a: 0x0001, 0x321b: 0x0001, 0x321c: 0x0001, 0x321d: 0x0001, + 0x321e: 0x0001, 0x321f: 0x0001, 0x3220: 0x0001, 0x3221: 0x0001, 0x3222: 0x0001, 0x3223: 0x0001, + 0x3224: 0x0010, 0x3225: 0x0010, 0x3226: 0x0010, 0x3227: 0x0010, 0x3228: 0x0010, 0x3229: 0x0010, + 0x322a: 0x0010, 0x322b: 0x0010, 0x322c: 0x0010, 0x322d: 0x0010, 0x322e: 0x0010, 0x322f: 0x0060, + 0x3230: 0x0010, 0x3231: 0x0010, 0x3232: 0x0010, 0x3233: 0x0010, 0x3234: 0x0010, 0x3235: 0x0010, + 0x3236: 0x0010, 0x3237: 0x0010, 0x3238: 0x0010, 0x3239: 0x0010, 0x323a: 0x0010, 0x323b: 0x0010, + 0x323c: 0x0010, 0x323d: 0x0010, 0x323e: 0x0010, 0x323f: 0x0010, + // Block 0xc9, offset 0x3240 + 0x3240: 0x0001, 0x3241: 0x0001, 0x3242: 0x0001, 0x3243: 0x0001, 0x3244: 0x0001, 0x3245: 0x0001, + 0x3246: 0x0001, 0x3247: 0x0001, 0x3248: 0x0001, 0x3249: 0x0001, 0x324a: 0x0001, 0x324b: 0x0001, + 0x324c: 0x0001, 0x324d: 0x0001, 0x324e: 0x0001, 0x324f: 0x0001, 0x3250: 0x0001, 0x3251: 0x0001, + 0x3252: 0x0001, 0x3253: 0x0001, 0x3254: 0x0001, 0x3255: 0x0001, 0x3256: 0x0010, 0x3257: 0x0010, + 0x3258: 0x0010, 0x3259: 0x0010, 0x325a: 0x0010, 0x325b: 0x0010, 0x325c: 0x0010, 0x325d: 0x0010, + 0x325e: 0x0010, 0x325f: 0x0010, 0x3260: 0x0001, 0x3261: 0x0001, 0x3262: 0x0001, 0x3263: 0x0001, + 0x3264: 0x0001, 0x3265: 0x0001, 0x3266: 0x0001, 0x3267: 0x0001, 0x3268: 0x0010, 0x3269: 0x0010, + 0x326a: 0x0010, 0x326b: 0x0010, 0x326c: 0x0010, 0x326d: 0x0010, 0x326e: 0x0010, 0x326f: 0x0010, + 0x3270: 0x0010, 0x3271: 0x0010, 0x3272: 0x0010, 0x3273: 0x0010, 0x3274: 0x0010, 0x3275: 0x0010, + 0x3276: 0x0010, 0x3277: 0x0010, 0x3278: 0x0010, 0x3279: 0x0010, 0x327a: 0x0010, 0x327b: 0x0010, + 0x327c: 0x0010, 0x327d: 0x0010, 0x327e: 0x0010, 0x327f: 0x0010, + // Block 0xca, offset 0x3280 + 0x3280: 0x0001, 0x3281: 0x0001, 0x3282: 0x0001, 0x3283: 0x0001, 0x3284: 0x0001, 0x3285: 0x0001, + 0x3286: 0x0010, 0x3287: 0x0010, 0x3288: 0x0001, 0x3289: 0x0010, 0x328a: 0x0001, 0x328b: 0x0001, + 0x328c: 0x0001, 0x328d: 0x0001, 0x328e: 0x0001, 0x328f: 0x0001, 0x3290: 0x0001, 0x3291: 0x0001, + 0x3292: 0x0001, 0x3293: 0x0001, 0x3294: 0x0001, 0x3295: 0x0001, 0x3296: 0x0001, 0x3297: 0x0001, + 0x3298: 0x0001, 0x3299: 0x0001, 0x329a: 0x0001, 0x329b: 0x0001, 0x329c: 0x0001, 0x329d: 0x0001, + 0x329e: 0x0001, 0x329f: 0x0001, 0x32a0: 0x0001, 0x32a1: 0x0001, 0x32a2: 0x0001, 0x32a3: 0x0001, + 0x32a4: 0x0001, 0x32a5: 0x0001, 0x32a6: 0x0001, 0x32a7: 0x0001, 0x32a8: 0x0001, 0x32a9: 0x0001, + 0x32aa: 0x0001, 0x32ab: 0x0001, 0x32ac: 0x0001, 0x32ad: 0x0001, 0x32ae: 0x0001, 0x32af: 0x0001, + 0x32b0: 0x0001, 0x32b1: 0x0001, 0x32b2: 0x0001, 0x32b3: 0x0001, 0x32b4: 0x0001, 0x32b5: 0x0001, + 0x32b6: 0x0010, 0x32b7: 0x0001, 0x32b8: 0x0001, 0x32b9: 0x0010, 0x32ba: 0x0010, 0x32bb: 0x0010, + 0x32bc: 0x0001, 0x32bd: 0x0010, 0x32be: 0x0010, 0x32bf: 0x0001, + // Block 0xcb, offset 0x32c0 + 0x32c0: 0x0001, 0x32c1: 0x0001, 0x32c2: 0x0001, 0x32c3: 0x0001, 0x32c4: 0x0001, 0x32c5: 0x0001, + 0x32c6: 0x0001, 0x32c7: 0x0001, 0x32c8: 0x0001, 0x32c9: 0x0001, 0x32ca: 0x0001, 0x32cb: 0x0001, + 0x32cc: 0x0001, 0x32cd: 0x0001, 0x32ce: 0x0001, 0x32cf: 0x0001, 0x32d0: 0x0001, 0x32d1: 0x0001, + 0x32d2: 0x0001, 0x32d3: 0x0001, 0x32d4: 0x0001, 0x32d5: 0x0001, 0x32d6: 0x0010, 0x32d7: 0x0060, + 0x32d8: 0x0060, 0x32d9: 0x0060, 0x32da: 0x0060, 0x32db: 0x0060, 0x32dc: 0x0060, 0x32dd: 0x0060, + 0x32de: 0x0060, 0x32df: 0x0060, 0x32e0: 0x0001, 0x32e1: 0x0001, 0x32e2: 0x0001, 0x32e3: 0x0001, + 0x32e4: 0x0001, 0x32e5: 0x0001, 0x32e6: 0x0001, 0x32e7: 0x0001, 0x32e8: 0x0001, 0x32e9: 0x0001, + 0x32ea: 0x0001, 0x32eb: 0x0001, 0x32ec: 0x0001, 0x32ed: 0x0001, 0x32ee: 0x0001, 0x32ef: 0x0001, + 0x32f0: 0x0001, 0x32f1: 0x0001, 0x32f2: 0x0001, 0x32f3: 0x0001, 0x32f4: 0x0001, 0x32f5: 0x0001, + 0x32f6: 0x0001, 0x32f7: 0x0060, 0x32f8: 0x0060, 0x32f9: 0x0060, 0x32fa: 0x0060, 0x32fb: 0x0060, + 0x32fc: 0x0060, 0x32fd: 0x0060, 0x32fe: 0x0060, 0x32ff: 0x0060, + // Block 0xcc, offset 0x3300 + 0x3300: 0x0001, 0x3301: 0x0001, 0x3302: 0x0001, 0x3303: 0x0001, 0x3304: 0x0001, 0x3305: 0x0001, + 0x3306: 0x0001, 0x3307: 0x0001, 0x3308: 0x0001, 0x3309: 0x0001, 0x330a: 0x0001, 0x330b: 0x0001, + 0x330c: 0x0001, 0x330d: 0x0001, 0x330e: 0x0001, 0x330f: 0x0001, 0x3310: 0x0001, 0x3311: 0x0001, + 0x3312: 0x0001, 0x3313: 0x0001, 0x3314: 0x0001, 0x3315: 0x0001, 0x3316: 0x0001, 0x3317: 0x0001, + 0x3318: 0x0001, 0x3319: 0x0001, 0x331a: 0x0001, 0x331b: 0x0001, 0x331c: 0x0001, 0x331d: 0x0001, + 0x331e: 0x0001, 0x331f: 0x0010, 0x3320: 0x0010, 0x3321: 0x0010, 0x3322: 0x0010, 0x3323: 0x0010, + 0x3324: 0x0010, 0x3325: 0x0010, 0x3326: 0x0010, 0x3327: 0x0060, 0x3328: 0x0060, 0x3329: 0x0060, + 0x332a: 0x0060, 0x332b: 0x0060, 0x332c: 0x0060, 0x332d: 0x0060, 0x332e: 0x0060, 0x332f: 0x0060, + 0x3330: 0x0010, 0x3331: 0x0010, 0x3332: 0x0010, 0x3333: 0x0010, 0x3334: 0x0010, 0x3335: 0x0010, + 0x3336: 0x0010, 0x3337: 0x0010, 0x3338: 0x0010, 0x3339: 0x0010, 0x333a: 0x0010, 0x333b: 0x0010, + 0x333c: 0x0010, 0x333d: 0x0010, 0x333e: 0x0010, 0x333f: 0x0010, + // Block 0xcd, offset 0x3340 + 0x3340: 0x0010, 0x3341: 0x0010, 0x3342: 0x0010, 0x3343: 0x0010, 0x3344: 0x0010, 0x3345: 0x0010, + 0x3346: 0x0010, 0x3347: 0x0010, 0x3348: 0x0010, 0x3349: 0x0010, 0x334a: 0x0010, 0x334b: 0x0010, + 0x334c: 0x0010, 0x334d: 0x0010, 0x334e: 0x0010, 0x334f: 0x0010, 0x3350: 0x0010, 0x3351: 0x0010, + 0x3352: 0x0010, 0x3353: 0x0010, 0x3354: 0x0010, 0x3355: 0x0010, 0x3356: 0x0010, 0x3357: 0x0010, + 0x3358: 0x0010, 0x3359: 0x0010, 0x335a: 0x0010, 0x335b: 0x0010, 0x335c: 0x0010, 0x335d: 0x0010, + 0x335e: 0x0010, 0x335f: 0x0010, 0x3360: 0x0001, 0x3361: 0x0001, 0x3362: 0x0001, 0x3363: 0x0001, + 0x3364: 0x0001, 0x3365: 0x0001, 0x3366: 0x0001, 0x3367: 0x0001, 0x3368: 0x0001, 0x3369: 0x0001, + 0x336a: 0x0001, 0x336b: 0x0001, 0x336c: 0x0001, 0x336d: 0x0001, 0x336e: 0x0001, 0x336f: 0x0001, + 0x3370: 0x0001, 0x3371: 0x0001, 0x3372: 0x0001, 0x3373: 0x0010, 0x3374: 0x0001, 0x3375: 0x0001, + 0x3376: 0x0010, 0x3377: 0x0010, 0x3378: 0x0010, 0x3379: 0x0010, 0x337a: 0x0010, 0x337b: 0x0060, + 0x337c: 0x0060, 0x337d: 0x0060, 0x337e: 0x0060, 0x337f: 0x0060, + // Block 0xce, offset 0x3380 + 0x3380: 0x0001, 0x3381: 0x0001, 0x3382: 0x0001, 0x3383: 0x0001, 0x3384: 0x0001, 0x3385: 0x0001, + 0x3386: 0x0001, 0x3387: 0x0001, 0x3388: 0x0001, 0x3389: 0x0001, 0x338a: 0x0001, 0x338b: 0x0001, + 0x338c: 0x0001, 0x338d: 0x0001, 0x338e: 0x0001, 0x338f: 0x0001, 0x3390: 0x0001, 0x3391: 0x0001, + 0x3392: 0x0001, 0x3393: 0x0001, 0x3394: 0x0001, 0x3395: 0x0001, 0x3396: 0x0060, 0x3397: 0x0060, + 0x3398: 0x0060, 0x3399: 0x0060, 0x339a: 0x0060, 0x339b: 0x0060, 0x339c: 0x0010, 0x339d: 0x0010, + 0x339e: 0x0010, 0x339f: 0x0060, 0x33a0: 0x0001, 0x33a1: 0x0001, 0x33a2: 0x0001, 0x33a3: 0x0001, + 0x33a4: 0x0001, 0x33a5: 0x0001, 0x33a6: 0x0001, 0x33a7: 0x0001, 0x33a8: 0x0001, 0x33a9: 0x0001, + 0x33aa: 0x0001, 0x33ab: 0x0001, 0x33ac: 0x0001, 0x33ad: 0x0001, 0x33ae: 0x0001, 0x33af: 0x0001, + 0x33b0: 0x0001, 0x33b1: 0x0001, 0x33b2: 0x0001, 0x33b3: 0x0001, 0x33b4: 0x0001, 0x33b5: 0x0001, + 0x33b6: 0x0001, 0x33b7: 0x0001, 0x33b8: 0x0001, 0x33b9: 0x0001, 0x33ba: 0x0010, 0x33bb: 0x0010, + 0x33bc: 0x0010, 0x33bd: 0x0010, 0x33be: 0x0010, 0x33bf: 0x0060, + // Block 0xcf, offset 0x33c0 + 0x33c0: 0x0001, 0x33c1: 0x0001, 0x33c2: 0x0001, 0x33c3: 0x0001, 0x33c4: 0x0001, 0x33c5: 0x0001, + 0x33c6: 0x0001, 0x33c7: 0x0001, 0x33c8: 0x0001, 0x33c9: 0x0001, 0x33ca: 0x0001, 0x33cb: 0x0001, + 0x33cc: 0x0001, 0x33cd: 0x0001, 0x33ce: 0x0001, 0x33cf: 0x0001, 0x33d0: 0x0001, 0x33d1: 0x0001, + 0x33d2: 0x0001, 0x33d3: 0x0001, 0x33d4: 0x0001, 0x33d5: 0x0001, 0x33d6: 0x0001, 0x33d7: 0x0001, + 0x33d8: 0x0001, 0x33d9: 0x0001, 0x33da: 0x0001, 0x33db: 0x0001, 0x33dc: 0x0001, 0x33dd: 0x0001, + 0x33de: 0x0001, 0x33df: 0x0001, 0x33e0: 0x0001, 0x33e1: 0x0001, 0x33e2: 0x0001, 0x33e3: 0x0001, + 0x33e4: 0x0001, 0x33e5: 0x0001, 0x33e6: 0x0001, 0x33e7: 0x0001, 0x33e8: 0x0001, 0x33e9: 0x0001, + 0x33ea: 0x0001, 0x33eb: 0x0001, 0x33ec: 0x0001, 0x33ed: 0x0001, 0x33ee: 0x0001, 0x33ef: 0x0001, + 0x33f0: 0x0001, 0x33f1: 0x0001, 0x33f2: 0x0001, 0x33f3: 0x0001, 0x33f4: 0x0001, 0x33f5: 0x0001, + 0x33f6: 0x0001, 0x33f7: 0x0001, 0x33f8: 0x0010, 0x33f9: 0x0010, 0x33fa: 0x0010, 0x33fb: 0x0010, + 0x33fc: 0x0060, 0x33fd: 0x0060, 0x33fe: 0x0001, 0x33ff: 0x0001, + // Block 0xd0, offset 0x3400 + 0x3400: 0x0001, 0x3401: 0x0001, 0x3402: 0x0001, 0x3403: 0x0001, 0x3404: 0x0010, 0x3405: 0x0001, + 0x3406: 0x0001, 0x3407: 0x0010, 0x3408: 0x0010, 0x3409: 0x0010, 0x340a: 0x0010, 0x340b: 0x0010, + 0x340c: 0x0001, 0x340d: 0x0001, 0x340e: 0x0001, 0x340f: 0x0001, 0x3410: 0x0001, 0x3411: 0x0001, + 0x3412: 0x0001, 0x3413: 0x0001, 0x3414: 0x0010, 0x3415: 0x0001, 0x3416: 0x0001, 0x3417: 0x0001, + 0x3418: 0x0010, 0x3419: 0x0001, 0x341a: 0x0001, 0x341b: 0x0001, 0x341c: 0x0001, 0x341d: 0x0001, + 0x341e: 0x0001, 0x341f: 0x0001, 0x3420: 0x0001, 0x3421: 0x0001, 0x3422: 0x0001, 0x3423: 0x0001, + 0x3424: 0x0001, 0x3425: 0x0001, 0x3426: 0x0001, 0x3427: 0x0001, 0x3428: 0x0001, 0x3429: 0x0001, + 0x342a: 0x0001, 0x342b: 0x0001, 0x342c: 0x0001, 0x342d: 0x0001, 0x342e: 0x0001, 0x342f: 0x0001, + 0x3430: 0x0001, 0x3431: 0x0001, 0x3432: 0x0001, 0x3433: 0x0001, 0x3434: 0x0010, 0x3435: 0x0010, + 0x3436: 0x0010, 0x3437: 0x0010, 0x3438: 0x0001, 0x3439: 0x0001, 0x343a: 0x0001, 0x343b: 0x0010, + 0x343c: 0x0010, 0x343d: 0x0010, 0x343e: 0x0010, 0x343f: 0x0001, + // Block 0xd1, offset 0x3440 + 0x3440: 0x0060, 0x3441: 0x0060, 0x3442: 0x0060, 0x3443: 0x0060, 0x3444: 0x0060, 0x3445: 0x0060, + 0x3446: 0x0060, 0x3447: 0x0060, 0x3448: 0x0010, 0x3449: 0x0010, 0x344a: 0x0010, 0x344b: 0x0010, + 0x344c: 0x0010, 0x344d: 0x0010, 0x344e: 0x0010, 0x344f: 0x0010, 0x3450: 0x0060, 0x3451: 0x0060, + 0x3452: 0x0060, 0x3453: 0x0060, 0x3454: 0x0060, 0x3455: 0x0060, 0x3456: 0x0060, 0x3457: 0x0060, + 0x3458: 0x0060, 0x3459: 0x0010, 0x345a: 0x0010, 0x345b: 0x0010, 0x345c: 0x0010, 0x345d: 0x0010, + 0x345e: 0x0010, 0x345f: 0x0010, 0x3460: 0x0001, 0x3461: 0x0001, 0x3462: 0x0001, 0x3463: 0x0001, + 0x3464: 0x0001, 0x3465: 0x0001, 0x3466: 0x0001, 0x3467: 0x0001, 0x3468: 0x0001, 0x3469: 0x0001, + 0x346a: 0x0001, 0x346b: 0x0001, 0x346c: 0x0001, 0x346d: 0x0001, 0x346e: 0x0001, 0x346f: 0x0001, + 0x3470: 0x0001, 0x3471: 0x0001, 0x3472: 0x0001, 0x3473: 0x0001, 0x3474: 0x0001, 0x3475: 0x0001, + 0x3476: 0x0001, 0x3477: 0x0001, 0x3478: 0x0001, 0x3479: 0x0001, 0x347a: 0x0001, 0x347b: 0x0001, + 0x347c: 0x0001, 0x347d: 0x0060, 0x347e: 0x0060, 0x347f: 0x0060, + // Block 0xd2, offset 0x3480 + 0x3480: 0x0001, 0x3481: 0x0001, 0x3482: 0x0001, 0x3483: 0x0001, 0x3484: 0x0001, 0x3485: 0x0001, + 0x3486: 0x0001, 0x3487: 0x0001, 0x3488: 0x0001, 0x3489: 0x0001, 0x348a: 0x0001, 0x348b: 0x0001, + 0x348c: 0x0001, 0x348d: 0x0001, 0x348e: 0x0001, 0x348f: 0x0001, 0x3490: 0x0001, 0x3491: 0x0001, + 0x3492: 0x0001, 0x3493: 0x0001, 0x3494: 0x0001, 0x3495: 0x0001, 0x3496: 0x0001, 0x3497: 0x0001, + 0x3498: 0x0001, 0x3499: 0x0001, 0x349a: 0x0001, 0x349b: 0x0001, 0x349c: 0x0001, 0x349d: 0x0060, + 0x349e: 0x0060, 0x349f: 0x0060, 0x34a0: 0x0010, 0x34a1: 0x0010, 0x34a2: 0x0010, 0x34a3: 0x0010, + 0x34a4: 0x0010, 0x34a5: 0x0010, 0x34a6: 0x0010, 0x34a7: 0x0010, 0x34a8: 0x0010, 0x34a9: 0x0010, + 0x34aa: 0x0010, 0x34ab: 0x0010, 0x34ac: 0x0010, 0x34ad: 0x0010, 0x34ae: 0x0010, 0x34af: 0x0010, + 0x34b0: 0x0010, 0x34b1: 0x0010, 0x34b2: 0x0010, 0x34b3: 0x0010, 0x34b4: 0x0010, 0x34b5: 0x0010, + 0x34b6: 0x0010, 0x34b7: 0x0010, 0x34b8: 0x0010, 0x34b9: 0x0010, 0x34ba: 0x0010, 0x34bb: 0x0010, + 0x34bc: 0x0010, 0x34bd: 0x0010, 0x34be: 0x0010, 0x34bf: 0x0010, + // Block 0xd3, offset 0x34c0 + 0x34c0: 0x0001, 0x34c1: 0x0001, 0x34c2: 0x0001, 0x34c3: 0x0001, 0x34c4: 0x0001, 0x34c5: 0x0001, + 0x34c6: 0x0001, 0x34c7: 0x0001, 0x34c8: 0x0060, 0x34c9: 0x0001, 0x34ca: 0x0001, 0x34cb: 0x0001, + 0x34cc: 0x0001, 0x34cd: 0x0001, 0x34ce: 0x0001, 0x34cf: 0x0001, 0x34d0: 0x0001, 0x34d1: 0x0001, + 0x34d2: 0x0001, 0x34d3: 0x0001, 0x34d4: 0x0001, 0x34d5: 0x0001, 0x34d6: 0x0001, 0x34d7: 0x0001, + 0x34d8: 0x0001, 0x34d9: 0x0001, 0x34da: 0x0001, 0x34db: 0x0001, 0x34dc: 0x0001, 0x34dd: 0x0001, + 0x34de: 0x0001, 0x34df: 0x0001, 0x34e0: 0x0001, 0x34e1: 0x0001, 0x34e2: 0x0001, 0x34e3: 0x0001, + 0x34e4: 0x0001, 0x34e5: 0x0001, 0x34e6: 0x0001, 0x34e7: 0x0010, 0x34e8: 0x0010, 0x34e9: 0x0010, + 0x34ea: 0x0010, 0x34eb: 0x0060, 0x34ec: 0x0060, 0x34ed: 0x0060, 0x34ee: 0x0060, 0x34ef: 0x0060, + 0x34f0: 0x0060, 0x34f1: 0x0060, 0x34f2: 0x0060, 0x34f3: 0x0060, 0x34f4: 0x0060, 0x34f5: 0x0060, + 0x34f6: 0x0060, 0x34f7: 0x0010, 0x34f8: 0x0010, 0x34f9: 0x0010, 0x34fa: 0x0010, 0x34fb: 0x0010, + 0x34fc: 0x0010, 0x34fd: 0x0010, 0x34fe: 0x0010, 0x34ff: 0x0010, + // Block 0xd4, offset 0x3500 + 0x3500: 0x0001, 0x3501: 0x0001, 0x3502: 0x0001, 0x3503: 0x0001, 0x3504: 0x0001, 0x3505: 0x0001, + 0x3506: 0x0001, 0x3507: 0x0001, 0x3508: 0x0001, 0x3509: 0x0001, 0x350a: 0x0001, 0x350b: 0x0001, + 0x350c: 0x0001, 0x350d: 0x0001, 0x350e: 0x0001, 0x350f: 0x0001, 0x3510: 0x0001, 0x3511: 0x0001, + 0x3512: 0x0001, 0x3513: 0x0001, 0x3514: 0x0001, 0x3515: 0x0001, 0x3516: 0x0001, 0x3517: 0x0001, + 0x3518: 0x0001, 0x3519: 0x0001, 0x351a: 0x0001, 0x351b: 0x0001, 0x351c: 0x0001, 0x351d: 0x0001, + 0x351e: 0x0001, 0x351f: 0x0001, 0x3520: 0x0001, 0x3521: 0x0001, 0x3522: 0x0001, 0x3523: 0x0001, + 0x3524: 0x0001, 0x3525: 0x0001, 0x3526: 0x0001, 0x3527: 0x0001, 0x3528: 0x0001, 0x3529: 0x0001, + 0x352a: 0x0001, 0x352b: 0x0001, 0x352c: 0x0001, 0x352d: 0x0001, 0x352e: 0x0001, 0x352f: 0x0001, + 0x3530: 0x0001, 0x3531: 0x0001, 0x3532: 0x0001, 0x3533: 0x0001, 0x3534: 0x0001, 0x3535: 0x0001, + 0x3536: 0x0010, 0x3537: 0x0010, 0x3538: 0x0010, 0x3539: 0x0060, 0x353a: 0x0060, 0x353b: 0x0060, + 0x353c: 0x0060, 0x353d: 0x0060, 0x353e: 0x0060, 0x353f: 0x0060, + // Block 0xd5, offset 0x3540 + 0x3540: 0x0001, 0x3541: 0x0001, 0x3542: 0x0001, 0x3543: 0x0001, 0x3544: 0x0001, 0x3545: 0x0001, + 0x3546: 0x0001, 0x3547: 0x0001, 0x3548: 0x0001, 0x3549: 0x0001, 0x354a: 0x0001, 0x354b: 0x0001, + 0x354c: 0x0001, 0x354d: 0x0001, 0x354e: 0x0001, 0x354f: 0x0001, 0x3550: 0x0001, 0x3551: 0x0001, + 0x3552: 0x0001, 0x3553: 0x0001, 0x3554: 0x0001, 0x3555: 0x0001, 0x3556: 0x0010, 0x3557: 0x0010, + 0x3558: 0x0060, 0x3559: 0x0060, 0x355a: 0x0060, 0x355b: 0x0060, 0x355c: 0x0060, 0x355d: 0x0060, + 0x355e: 0x0060, 0x355f: 0x0060, 0x3560: 0x0001, 0x3561: 0x0001, 0x3562: 0x0001, 0x3563: 0x0001, + 0x3564: 0x0001, 0x3565: 0x0001, 0x3566: 0x0001, 0x3567: 0x0001, 0x3568: 0x0001, 0x3569: 0x0001, + 0x356a: 0x0001, 0x356b: 0x0001, 0x356c: 0x0001, 0x356d: 0x0001, 0x356e: 0x0001, 0x356f: 0x0001, + 0x3570: 0x0001, 0x3571: 0x0001, 0x3572: 0x0001, 0x3573: 0x0010, 0x3574: 0x0010, 0x3575: 0x0010, + 0x3576: 0x0010, 0x3577: 0x0010, 0x3578: 0x0060, 0x3579: 0x0060, 0x357a: 0x0060, 0x357b: 0x0060, + 0x357c: 0x0060, 0x357d: 0x0060, 0x357e: 0x0060, 0x357f: 0x0060, + // Block 0xd6, offset 0x3580 + 0x3580: 0x0001, 0x3581: 0x0001, 0x3582: 0x0001, 0x3583: 0x0001, 0x3584: 0x0001, 0x3585: 0x0001, + 0x3586: 0x0001, 0x3587: 0x0001, 0x3588: 0x0001, 0x3589: 0x0001, 0x358a: 0x0001, 0x358b: 0x0001, + 0x358c: 0x0001, 0x358d: 0x0001, 0x358e: 0x0001, 0x358f: 0x0001, 0x3590: 0x0001, 0x3591: 0x0001, + 0x3592: 0x0010, 0x3593: 0x0010, 0x3594: 0x0010, 0x3595: 0x0010, 0x3596: 0x0010, 0x3597: 0x0010, + 0x3598: 0x0010, 0x3599: 0x0060, 0x359a: 0x0060, 0x359b: 0x0060, 0x359c: 0x0060, 0x359d: 0x0010, + 0x359e: 0x0010, 0x359f: 0x0010, 0x35a0: 0x0010, 0x35a1: 0x0010, 0x35a2: 0x0010, 0x35a3: 0x0010, + 0x35a4: 0x0010, 0x35a5: 0x0010, 0x35a6: 0x0010, 0x35a7: 0x0010, 0x35a8: 0x0010, 0x35a9: 0x0060, + 0x35aa: 0x0060, 0x35ab: 0x0060, 0x35ac: 0x0060, 0x35ad: 0x0060, 0x35ae: 0x0060, 0x35af: 0x0060, + 0x35b0: 0x0010, 0x35b1: 0x0010, 0x35b2: 0x0010, 0x35b3: 0x0010, 0x35b4: 0x0010, 0x35b5: 0x0010, + 0x35b6: 0x0010, 0x35b7: 0x0010, 0x35b8: 0x0010, 0x35b9: 0x0010, 0x35ba: 0x0010, 0x35bb: 0x0010, + 0x35bc: 0x0010, 0x35bd: 0x0010, 0x35be: 0x0010, 0x35bf: 0x0010, + // Block 0xd7, offset 0x35c0 + 0x35c0: 0x0001, 0x35c1: 0x0001, 0x35c2: 0x0001, 0x35c3: 0x0001, 0x35c4: 0x0001, 0x35c5: 0x0001, + 0x35c6: 0x0001, 0x35c7: 0x0001, 0x35c8: 0x0001, 0x35c9: 0x0010, 0x35ca: 0x0010, 0x35cb: 0x0010, + 0x35cc: 0x0010, 0x35cd: 0x0010, 0x35ce: 0x0010, 0x35cf: 0x0010, 0x35d0: 0x0010, 0x35d1: 0x0010, + 0x35d2: 0x0010, 0x35d3: 0x0010, 0x35d4: 0x0010, 0x35d5: 0x0010, 0x35d6: 0x0010, 0x35d7: 0x0010, + 0x35d8: 0x0010, 0x35d9: 0x0010, 0x35da: 0x0010, 0x35db: 0x0010, 0x35dc: 0x0010, 0x35dd: 0x0010, + 0x35de: 0x0010, 0x35df: 0x0010, 0x35e0: 0x0010, 0x35e1: 0x0010, 0x35e2: 0x0010, 0x35e3: 0x0010, + 0x35e4: 0x0010, 0x35e5: 0x0010, 0x35e6: 0x0010, 0x35e7: 0x0010, 0x35e8: 0x0010, 0x35e9: 0x0010, + 0x35ea: 0x0010, 0x35eb: 0x0010, 0x35ec: 0x0010, 0x35ed: 0x0010, 0x35ee: 0x0010, 0x35ef: 0x0010, + 0x35f0: 0x0010, 0x35f1: 0x0010, 0x35f2: 0x0010, 0x35f3: 0x0010, 0x35f4: 0x0010, 0x35f5: 0x0010, + 0x35f6: 0x0010, 0x35f7: 0x0010, 0x35f8: 0x0010, 0x35f9: 0x0010, 0x35fa: 0x0010, 0x35fb: 0x0010, + 0x35fc: 0x0010, 0x35fd: 0x0010, 0x35fe: 0x0010, 0x35ff: 0x0010, + // Block 0xd8, offset 0x3600 + 0x3600: 0x0001, 0x3601: 0x0001, 0x3602: 0x0001, 0x3603: 0x0001, 0x3604: 0x0001, 0x3605: 0x0001, + 0x3606: 0x0001, 0x3607: 0x0001, 0x3608: 0x0001, 0x3609: 0x0001, 0x360a: 0x0001, 0x360b: 0x0001, + 0x360c: 0x0001, 0x360d: 0x0001, 0x360e: 0x0001, 0x360f: 0x0001, 0x3610: 0x0001, 0x3611: 0x0001, + 0x3612: 0x0001, 0x3613: 0x0001, 0x3614: 0x0001, 0x3615: 0x0001, 0x3616: 0x0001, 0x3617: 0x0001, + 0x3618: 0x0001, 0x3619: 0x0001, 0x361a: 0x0001, 0x361b: 0x0001, 0x361c: 0x0001, 0x361d: 0x0001, + 0x361e: 0x0001, 0x361f: 0x0001, 0x3620: 0x0001, 0x3621: 0x0001, 0x3622: 0x0001, 0x3623: 0x0001, + 0x3624: 0x0001, 0x3625: 0x0001, 0x3626: 0x0001, 0x3627: 0x0001, 0x3628: 0x0001, 0x3629: 0x0001, + 0x362a: 0x0001, 0x362b: 0x0001, 0x362c: 0x0001, 0x362d: 0x0001, 0x362e: 0x0001, 0x362f: 0x0001, + 0x3630: 0x0001, 0x3631: 0x0001, 0x3632: 0x0001, 0x3633: 0x0010, 0x3634: 0x0010, 0x3635: 0x0010, + 0x3636: 0x0010, 0x3637: 0x0010, 0x3638: 0x0010, 0x3639: 0x0010, 0x363a: 0x0010, 0x363b: 0x0010, + 0x363c: 0x0010, 0x363d: 0x0010, 0x363e: 0x0010, 0x363f: 0x0010, + // Block 0xd9, offset 0x3640 + 0x3640: 0x0001, 0x3641: 0x0001, 0x3642: 0x0001, 0x3643: 0x0001, 0x3644: 0x0001, 0x3645: 0x0001, + 0x3646: 0x0001, 0x3647: 0x0001, 0x3648: 0x0001, 0x3649: 0x0001, 0x364a: 0x0001, 0x364b: 0x0001, + 0x364c: 0x0001, 0x364d: 0x0001, 0x364e: 0x0001, 0x364f: 0x0001, 0x3650: 0x0001, 0x3651: 0x0001, + 0x3652: 0x0001, 0x3653: 0x0001, 0x3654: 0x0001, 0x3655: 0x0001, 0x3656: 0x0001, 0x3657: 0x0001, + 0x3658: 0x0001, 0x3659: 0x0001, 0x365a: 0x0001, 0x365b: 0x0001, 0x365c: 0x0001, 0x365d: 0x0001, + 0x365e: 0x0001, 0x365f: 0x0001, 0x3660: 0x0001, 0x3661: 0x0001, 0x3662: 0x0001, 0x3663: 0x0001, + 0x3664: 0x0001, 0x3665: 0x0001, 0x3666: 0x0001, 0x3667: 0x0001, 0x3668: 0x0001, 0x3669: 0x0001, + 0x366a: 0x0001, 0x366b: 0x0001, 0x366c: 0x0001, 0x366d: 0x0001, 0x366e: 0x0001, 0x366f: 0x0001, + 0x3670: 0x0001, 0x3671: 0x0001, 0x3672: 0x0001, 0x3673: 0x0010, 0x3674: 0x0010, 0x3675: 0x0010, + 0x3676: 0x0010, 0x3677: 0x0010, 0x3678: 0x0010, 0x3679: 0x0010, 0x367a: 0x0060, 0x367b: 0x0060, + 0x367c: 0x0060, 0x367d: 0x0060, 0x367e: 0x0060, 0x367f: 0x0060, + // Block 0xda, offset 0x3680 + 0x3680: 0x0010, 0x3681: 0x0010, 0x3682: 0x0010, 0x3683: 0x0010, 0x3684: 0x0010, 0x3685: 0x0010, + 0x3686: 0x0010, 0x3687: 0x0010, 0x3688: 0x0010, 0x3689: 0x0010, 0x368a: 0x0010, 0x368b: 0x0010, + 0x368c: 0x0010, 0x368d: 0x0010, 0x368e: 0x0010, 0x368f: 0x0010, 0x3690: 0x0010, 0x3691: 0x0010, + 0x3692: 0x0010, 0x3693: 0x0010, 0x3694: 0x0010, 0x3695: 0x0010, 0x3696: 0x0010, 0x3697: 0x0010, + 0x3698: 0x0010, 0x3699: 0x0010, 0x369a: 0x0010, 0x369b: 0x0010, 0x369c: 0x0010, 0x369d: 0x0010, + 0x369e: 0x0010, 0x369f: 0x0010, 0x36a0: 0x0060, 0x36a1: 0x0060, 0x36a2: 0x0060, 0x36a3: 0x0060, + 0x36a4: 0x0060, 0x36a5: 0x0060, 0x36a6: 0x0060, 0x36a7: 0x0060, 0x36a8: 0x0060, 0x36a9: 0x0060, + 0x36aa: 0x0060, 0x36ab: 0x0060, 0x36ac: 0x0060, 0x36ad: 0x0060, 0x36ae: 0x0060, 0x36af: 0x0060, + 0x36b0: 0x0060, 0x36b1: 0x0060, 0x36b2: 0x0060, 0x36b3: 0x0060, 0x36b4: 0x0060, 0x36b5: 0x0060, + 0x36b6: 0x0060, 0x36b7: 0x0060, 0x36b8: 0x0060, 0x36b9: 0x0060, 0x36ba: 0x0060, 0x36bb: 0x0060, + 0x36bc: 0x0060, 0x36bd: 0x0060, 0x36be: 0x0060, 0x36bf: 0x0010, + // Block 0xdb, offset 0x36c0 + 0x36c0: 0x0001, 0x36c1: 0x0001, 0x36c2: 0x0001, 0x36c3: 0x0001, 0x36c4: 0x0001, 0x36c5: 0x0001, + 0x36c6: 0x0001, 0x36c7: 0x0060, 0x36c8: 0x0060, 0x36c9: 0x0060, 0x36ca: 0x0060, 0x36cb: 0x0060, + 0x36cc: 0x0060, 0x36cd: 0x0060, 0x36ce: 0x0010, 0x36cf: 0x0010, 0x36d0: 0x0010, 0x36d1: 0x0010, + 0x36d2: 0x0060, 0x36d3: 0x0060, 0x36d4: 0x0060, 0x36d5: 0x0060, 0x36d6: 0x0060, 0x36d7: 0x0060, + 0x36d8: 0x0060, 0x36d9: 0x0060, 0x36da: 0x0060, 0x36db: 0x0060, 0x36dc: 0x0060, 0x36dd: 0x0060, + 0x36de: 0x0060, 0x36df: 0x0060, 0x36e0: 0x0060, 0x36e1: 0x0060, 0x36e2: 0x0060, 0x36e3: 0x0060, + 0x36e4: 0x0060, 0x36e5: 0x0060, 0x36e6: 0x0001, 0x36e7: 0x0001, 0x36e8: 0x0001, 0x36e9: 0x0001, + 0x36ea: 0x0001, 0x36eb: 0x0001, 0x36ec: 0x0001, 0x36ed: 0x0001, 0x36ee: 0x0001, 0x36ef: 0x0001, + 0x36f0: 0x0010, 0x36f1: 0x0010, 0x36f2: 0x0010, 0x36f3: 0x0010, 0x36f4: 0x0010, 0x36f5: 0x0010, + 0x36f6: 0x0010, 0x36f7: 0x0010, 0x36f8: 0x0010, 0x36f9: 0x0010, 0x36fa: 0x0010, 0x36fb: 0x0010, + 0x36fc: 0x0010, 0x36fd: 0x0010, 0x36fe: 0x0010, 0x36ff: 0x0001, + // Block 0xdc, offset 0x3700 + 0x3700: 0x0001, 0x3701: 0x0001, 0x3702: 0x0001, 0x3703: 0x0001, 0x3704: 0x0001, 0x3705: 0x0001, + 0x3706: 0x0001, 0x3707: 0x0001, 0x3708: 0x0001, 0x3709: 0x0001, 0x370a: 0x0001, 0x370b: 0x0001, + 0x370c: 0x0001, 0x370d: 0x0001, 0x370e: 0x0001, 0x370f: 0x0001, 0x3710: 0x0001, 0x3711: 0x0001, + 0x3712: 0x0001, 0x3713: 0x0001, 0x3714: 0x0001, 0x3715: 0x0001, 0x3716: 0x0001, 0x3717: 0x0001, + 0x3718: 0x0001, 0x3719: 0x0001, 0x371a: 0x0001, 0x371b: 0x0001, 0x371c: 0x0001, 0x371d: 0x0001, + 0x371e: 0x0001, 0x371f: 0x0001, 0x3720: 0x0001, 0x3721: 0x0001, 0x3722: 0x0001, 0x3723: 0x0001, + 0x3724: 0x0001, 0x3725: 0x0001, 0x3726: 0x0001, 0x3727: 0x0001, 0x3728: 0x0001, 0x3729: 0x0001, + 0x372a: 0x0001, 0x372b: 0x0001, 0x372c: 0x0001, 0x372d: 0x0001, 0x372e: 0x0001, 0x372f: 0x0001, + 0x3730: 0x0001, 0x3731: 0x0001, 0x3732: 0x0001, 0x3733: 0x0001, 0x3734: 0x0001, 0x3735: 0x0001, + 0x3736: 0x0001, 0x3737: 0x0001, 0x3738: 0x0001, 0x3739: 0x0001, 0x373a: 0x0001, 0x373b: 0x0060, + 0x373c: 0x0060, 0x373d: 0x0008, 0x373e: 0x0060, 0x373f: 0x0060, + // Block 0xdd, offset 0x3740 + 0x3740: 0x0060, 0x3741: 0x0060, 0x3742: 0x0010, 0x3743: 0x0010, 0x3744: 0x0010, 0x3745: 0x0010, + 0x3746: 0x0010, 0x3747: 0x0010, 0x3748: 0x0010, 0x3749: 0x0010, 0x374a: 0x0010, 0x374b: 0x0010, + 0x374c: 0x0010, 0x374d: 0x0010, 0x374e: 0x0010, 0x374f: 0x0010, 0x3750: 0x0001, 0x3751: 0x0001, + 0x3752: 0x0001, 0x3753: 0x0001, 0x3754: 0x0001, 0x3755: 0x0001, 0x3756: 0x0001, 0x3757: 0x0001, + 0x3758: 0x0001, 0x3759: 0x0001, 0x375a: 0x0001, 0x375b: 0x0001, 0x375c: 0x0001, 0x375d: 0x0001, + 0x375e: 0x0001, 0x375f: 0x0001, 0x3760: 0x0001, 0x3761: 0x0001, 0x3762: 0x0001, 0x3763: 0x0001, + 0x3764: 0x0001, 0x3765: 0x0001, 0x3766: 0x0001, 0x3767: 0x0001, 0x3768: 0x0001, 0x3769: 0x0010, + 0x376a: 0x0010, 0x376b: 0x0010, 0x376c: 0x0010, 0x376d: 0x0010, 0x376e: 0x0010, 0x376f: 0x0010, + 0x3770: 0x0001, 0x3771: 0x0001, 0x3772: 0x0001, 0x3773: 0x0001, 0x3774: 0x0001, 0x3775: 0x0001, + 0x3776: 0x0001, 0x3777: 0x0001, 0x3778: 0x0001, 0x3779: 0x0001, 0x377a: 0x0010, 0x377b: 0x0010, + 0x377c: 0x0010, 0x377d: 0x0010, 0x377e: 0x0010, 0x377f: 0x0010, + // Block 0xde, offset 0x3780 + 0x3780: 0x0001, 0x3781: 0x0001, 0x3782: 0x0001, 0x3783: 0x0001, 0x3784: 0x0001, 0x3785: 0x0001, + 0x3786: 0x0001, 0x3787: 0x0001, 0x3788: 0x0001, 0x3789: 0x0001, 0x378a: 0x0001, 0x378b: 0x0001, + 0x378c: 0x0001, 0x378d: 0x0001, 0x378e: 0x0001, 0x378f: 0x0001, 0x3790: 0x0001, 0x3791: 0x0001, + 0x3792: 0x0001, 0x3793: 0x0001, 0x3794: 0x0001, 0x3795: 0x0001, 0x3796: 0x0001, 0x3797: 0x0001, + 0x3798: 0x0001, 0x3799: 0x0001, 0x379a: 0x0001, 0x379b: 0x0001, 0x379c: 0x0001, 0x379d: 0x0001, + 0x379e: 0x0001, 0x379f: 0x0001, 0x37a0: 0x0001, 0x37a1: 0x0001, 0x37a2: 0x0001, 0x37a3: 0x0001, + 0x37a4: 0x0001, 0x37a5: 0x0001, 0x37a6: 0x0001, 0x37a7: 0x0001, 0x37a8: 0x0001, 0x37a9: 0x0001, + 0x37aa: 0x0001, 0x37ab: 0x0001, 0x37ac: 0x0001, 0x37ad: 0x0001, 0x37ae: 0x0001, 0x37af: 0x0001, + 0x37b0: 0x0001, 0x37b1: 0x0001, 0x37b2: 0x0001, 0x37b3: 0x0001, 0x37b4: 0x0001, 0x37b5: 0x0010, + 0x37b6: 0x0001, 0x37b7: 0x0001, 0x37b8: 0x0001, 0x37b9: 0x0001, 0x37ba: 0x0001, 0x37bb: 0x0001, + 0x37bc: 0x0001, 0x37bd: 0x0001, 0x37be: 0x0001, 0x37bf: 0x0001, + // Block 0xdf, offset 0x37c0 + 0x37c0: 0x0060, 0x37c1: 0x0060, 0x37c2: 0x0060, 0x37c3: 0x0060, 0x37c4: 0x0010, 0x37c5: 0x0010, + 0x37c6: 0x0010, 0x37c7: 0x0010, 0x37c8: 0x0010, 0x37c9: 0x0010, 0x37ca: 0x0010, 0x37cb: 0x0010, + 0x37cc: 0x0010, 0x37cd: 0x0010, 0x37ce: 0x0010, 0x37cf: 0x0010, 0x37d0: 0x0001, 0x37d1: 0x0001, + 0x37d2: 0x0001, 0x37d3: 0x0001, 0x37d4: 0x0001, 0x37d5: 0x0001, 0x37d6: 0x0001, 0x37d7: 0x0001, + 0x37d8: 0x0001, 0x37d9: 0x0001, 0x37da: 0x0001, 0x37db: 0x0001, 0x37dc: 0x0001, 0x37dd: 0x0001, + 0x37de: 0x0001, 0x37df: 0x0001, 0x37e0: 0x0001, 0x37e1: 0x0001, 0x37e2: 0x0001, 0x37e3: 0x0001, + 0x37e4: 0x0001, 0x37e5: 0x0001, 0x37e6: 0x0001, 0x37e7: 0x0001, 0x37e8: 0x0001, 0x37e9: 0x0001, + 0x37ea: 0x0001, 0x37eb: 0x0001, 0x37ec: 0x0001, 0x37ed: 0x0001, 0x37ee: 0x0001, 0x37ef: 0x0001, + 0x37f0: 0x0001, 0x37f1: 0x0001, 0x37f2: 0x0001, 0x37f3: 0x0001, 0x37f4: 0x0060, 0x37f5: 0x0060, + 0x37f6: 0x0001, 0x37f7: 0x0010, 0x37f8: 0x0010, 0x37f9: 0x0010, 0x37fa: 0x0010, 0x37fb: 0x0010, + 0x37fc: 0x0010, 0x37fd: 0x0010, 0x37fe: 0x0010, 0x37ff: 0x0010, + // Block 0xe0, offset 0x3800 + 0x3800: 0x0001, 0x3801: 0x0001, 0x3802: 0x0001, 0x3803: 0x0001, 0x3804: 0x0001, 0x3805: 0x0060, + 0x3806: 0x0060, 0x3807: 0x0060, 0x3808: 0x0060, 0x3809: 0x0060, 0x380a: 0x0001, 0x380b: 0x0001, + 0x380c: 0x0001, 0x380d: 0x0060, 0x380e: 0x0010, 0x380f: 0x0010, 0x3810: 0x0001, 0x3811: 0x0001, + 0x3812: 0x0001, 0x3813: 0x0001, 0x3814: 0x0001, 0x3815: 0x0001, 0x3816: 0x0001, 0x3817: 0x0001, + 0x3818: 0x0001, 0x3819: 0x0001, 0x381a: 0x0001, 0x381b: 0x0060, 0x381c: 0x0001, 0x381d: 0x0060, + 0x381e: 0x0060, 0x381f: 0x0060, 0x3820: 0x0010, 0x3821: 0x0060, 0x3822: 0x0060, 0x3823: 0x0060, + 0x3824: 0x0060, 0x3825: 0x0060, 0x3826: 0x0060, 0x3827: 0x0060, 0x3828: 0x0060, 0x3829: 0x0060, + 0x382a: 0x0060, 0x382b: 0x0060, 0x382c: 0x0060, 0x382d: 0x0060, 0x382e: 0x0060, 0x382f: 0x0060, + 0x3830: 0x0060, 0x3831: 0x0060, 0x3832: 0x0060, 0x3833: 0x0060, 0x3834: 0x0060, 0x3835: 0x0010, + 0x3836: 0x0010, 0x3837: 0x0010, 0x3838: 0x0010, 0x3839: 0x0010, 0x383a: 0x0010, 0x383b: 0x0010, + 0x383c: 0x0010, 0x383d: 0x0010, 0x383e: 0x0010, 0x383f: 0x0010, + // Block 0xe1, offset 0x3840 + 0x3840: 0x0001, 0x3841: 0x0001, 0x3842: 0x0001, 0x3843: 0x0001, 0x3844: 0x0001, 0x3845: 0x0001, + 0x3846: 0x0001, 0x3847: 0x0001, 0x3848: 0x0001, 0x3849: 0x0001, 0x384a: 0x0001, 0x384b: 0x0001, + 0x384c: 0x0001, 0x384d: 0x0001, 0x384e: 0x0001, 0x384f: 0x0001, 0x3850: 0x0001, 0x3851: 0x0001, + 0x3852: 0x0010, 0x3853: 0x0001, 0x3854: 0x0001, 0x3855: 0x0001, 0x3856: 0x0001, 0x3857: 0x0001, + 0x3858: 0x0001, 0x3859: 0x0001, 0x385a: 0x0001, 0x385b: 0x0001, 0x385c: 0x0001, 0x385d: 0x0001, + 0x385e: 0x0001, 0x385f: 0x0001, 0x3860: 0x0001, 0x3861: 0x0001, 0x3862: 0x0001, 0x3863: 0x0001, + 0x3864: 0x0001, 0x3865: 0x0001, 0x3866: 0x0001, 0x3867: 0x0001, 0x3868: 0x0001, 0x3869: 0x0001, + 0x386a: 0x0001, 0x386b: 0x0001, 0x386c: 0x0001, 0x386d: 0x0001, 0x386e: 0x0001, 0x386f: 0x0001, + 0x3870: 0x0001, 0x3871: 0x0001, 0x3872: 0x0001, 0x3873: 0x0001, 0x3874: 0x0001, 0x3875: 0x0001, + 0x3876: 0x0001, 0x3877: 0x0001, 0x3878: 0x0060, 0x3879: 0x0060, 0x387a: 0x0060, 0x387b: 0x0060, + 0x387c: 0x0060, 0x387d: 0x0060, 0x387e: 0x0010, 0x387f: 0x0010, + // Block 0xe2, offset 0x3880 + 0x3880: 0x0001, 0x3881: 0x0001, 0x3882: 0x0001, 0x3883: 0x0001, 0x3884: 0x0001, 0x3885: 0x0001, + 0x3886: 0x0001, 0x3887: 0x0010, 0x3888: 0x0001, 0x3889: 0x0010, 0x388a: 0x0001, 0x388b: 0x0001, + 0x388c: 0x0001, 0x388d: 0x0001, 0x388e: 0x0010, 0x388f: 0x0001, 0x3890: 0x0001, 0x3891: 0x0001, + 0x3892: 0x0001, 0x3893: 0x0001, 0x3894: 0x0001, 0x3895: 0x0001, 0x3896: 0x0001, 0x3897: 0x0001, + 0x3898: 0x0001, 0x3899: 0x0001, 0x389a: 0x0001, 0x389b: 0x0001, 0x389c: 0x0001, 0x389d: 0x0001, + 0x389e: 0x0010, 0x389f: 0x0001, 0x38a0: 0x0001, 0x38a1: 0x0001, 0x38a2: 0x0001, 0x38a3: 0x0001, + 0x38a4: 0x0001, 0x38a5: 0x0001, 0x38a6: 0x0001, 0x38a7: 0x0001, 0x38a8: 0x0001, 0x38a9: 0x0060, + 0x38aa: 0x0010, 0x38ab: 0x0010, 0x38ac: 0x0010, 0x38ad: 0x0010, 0x38ae: 0x0010, 0x38af: 0x0010, + 0x38b0: 0x0001, 0x38b1: 0x0001, 0x38b2: 0x0001, 0x38b3: 0x0001, 0x38b4: 0x0001, 0x38b5: 0x0001, + 0x38b6: 0x0001, 0x38b7: 0x0001, 0x38b8: 0x0001, 0x38b9: 0x0001, 0x38ba: 0x0001, 0x38bb: 0x0001, + 0x38bc: 0x0001, 0x38bd: 0x0001, 0x38be: 0x0001, 0x38bf: 0x0001, + // Block 0xe3, offset 0x38c0 + 0x38c0: 0x0001, 0x38c1: 0x0001, 0x38c2: 0x0001, 0x38c3: 0x0001, 0x38c4: 0x0001, 0x38c5: 0x0001, + 0x38c6: 0x0001, 0x38c7: 0x0001, 0x38c8: 0x0001, 0x38c9: 0x0001, 0x38ca: 0x0001, 0x38cb: 0x0001, + 0x38cc: 0x0001, 0x38cd: 0x0001, 0x38ce: 0x0001, 0x38cf: 0x0001, 0x38d0: 0x0001, 0x38d1: 0x0001, + 0x38d2: 0x0001, 0x38d3: 0x0001, 0x38d4: 0x0001, 0x38d5: 0x0001, 0x38d6: 0x0001, 0x38d7: 0x0001, + 0x38d8: 0x0001, 0x38d9: 0x0001, 0x38da: 0x0001, 0x38db: 0x0001, 0x38dc: 0x0001, 0x38dd: 0x0001, + 0x38de: 0x0001, 0x38df: 0x0001, 0x38e0: 0x0001, 0x38e1: 0x0001, 0x38e2: 0x0001, 0x38e3: 0x0001, + 0x38e4: 0x0001, 0x38e5: 0x0001, 0x38e6: 0x0001, 0x38e7: 0x0001, 0x38e8: 0x0001, 0x38e9: 0x0001, + 0x38ea: 0x0001, 0x38eb: 0x0010, 0x38ec: 0x0010, 0x38ed: 0x0010, 0x38ee: 0x0010, 0x38ef: 0x0010, + 0x38f0: 0x0001, 0x38f1: 0x0001, 0x38f2: 0x0001, 0x38f3: 0x0001, 0x38f4: 0x0001, 0x38f5: 0x0001, + 0x38f6: 0x0001, 0x38f7: 0x0001, 0x38f8: 0x0001, 0x38f9: 0x0001, 0x38fa: 0x0010, 0x38fb: 0x0010, + 0x38fc: 0x0010, 0x38fd: 0x0010, 0x38fe: 0x0010, 0x38ff: 0x0010, + // Block 0xe4, offset 0x3900 + 0x3900: 0x0001, 0x3901: 0x0001, 0x3902: 0x0001, 0x3903: 0x0001, 0x3904: 0x0010, 0x3905: 0x0001, + 0x3906: 0x0001, 0x3907: 0x0001, 0x3908: 0x0001, 0x3909: 0x0001, 0x390a: 0x0001, 0x390b: 0x0001, + 0x390c: 0x0001, 0x390d: 0x0010, 0x390e: 0x0010, 0x390f: 0x0001, 0x3910: 0x0001, 0x3911: 0x0010, + 0x3912: 0x0010, 0x3913: 0x0001, 0x3914: 0x0001, 0x3915: 0x0001, 0x3916: 0x0001, 0x3917: 0x0001, + 0x3918: 0x0001, 0x3919: 0x0001, 0x391a: 0x0001, 0x391b: 0x0001, 0x391c: 0x0001, 0x391d: 0x0001, + 0x391e: 0x0001, 0x391f: 0x0001, 0x3920: 0x0001, 0x3921: 0x0001, 0x3922: 0x0001, 0x3923: 0x0001, + 0x3924: 0x0001, 0x3925: 0x0001, 0x3926: 0x0001, 0x3927: 0x0001, 0x3928: 0x0001, 0x3929: 0x0010, + 0x392a: 0x0001, 0x392b: 0x0001, 0x392c: 0x0001, 0x392d: 0x0001, 0x392e: 0x0001, 0x392f: 0x0001, + 0x3930: 0x0001, 0x3931: 0x0010, 0x3932: 0x0001, 0x3933: 0x0001, 0x3934: 0x0010, 0x3935: 0x0001, + 0x3936: 0x0001, 0x3937: 0x0001, 0x3938: 0x0001, 0x3939: 0x0001, 0x393a: 0x0010, 0x393b: 0x0010, + 0x393c: 0x0001, 0x393d: 0x0001, 0x393e: 0x0001, 0x393f: 0x0001, + // Block 0xe5, offset 0x3940 + 0x3940: 0x0001, 0x3941: 0x0001, 0x3942: 0x0001, 0x3943: 0x0001, 0x3944: 0x0001, 0x3945: 0x0010, + 0x3946: 0x0010, 0x3947: 0x0001, 0x3948: 0x0001, 0x3949: 0x0010, 0x394a: 0x0010, 0x394b: 0x0001, + 0x394c: 0x0001, 0x394d: 0x0001, 0x394e: 0x0010, 0x394f: 0x0010, 0x3950: 0x0001, 0x3951: 0x0010, + 0x3952: 0x0010, 0x3953: 0x0010, 0x3954: 0x0010, 0x3955: 0x0010, 0x3956: 0x0010, 0x3957: 0x0001, + 0x3958: 0x0010, 0x3959: 0x0010, 0x395a: 0x0010, 0x395b: 0x0010, 0x395c: 0x0010, 0x395d: 0x0001, + 0x395e: 0x0001, 0x395f: 0x0001, 0x3960: 0x0001, 0x3961: 0x0001, 0x3962: 0x0001, 0x3963: 0x0001, + 0x3964: 0x0010, 0x3965: 0x0010, 0x3966: 0x0001, 0x3967: 0x0001, 0x3968: 0x0001, 0x3969: 0x0001, + 0x396a: 0x0001, 0x396b: 0x0001, 0x396c: 0x0001, 0x396d: 0x0010, 0x396e: 0x0010, 0x396f: 0x0010, + 0x3970: 0x0001, 0x3971: 0x0001, 0x3972: 0x0001, 0x3973: 0x0001, 0x3974: 0x0001, 0x3975: 0x0010, + 0x3976: 0x0010, 0x3977: 0x0010, 0x3978: 0x0010, 0x3979: 0x0010, 0x397a: 0x0010, 0x397b: 0x0010, + 0x397c: 0x0010, 0x397d: 0x0010, 0x397e: 0x0010, 0x397f: 0x0010, + // Block 0xe6, offset 0x3980 + 0x3980: 0x0001, 0x3981: 0x0001, 0x3982: 0x0001, 0x3983: 0x0001, 0x3984: 0x0001, 0x3985: 0x0001, + 0x3986: 0x0060, 0x3987: 0x0001, 0x3988: 0x0010, 0x3989: 0x0010, 0x398a: 0x0010, 0x398b: 0x0010, + 0x398c: 0x0010, 0x398d: 0x0010, 0x398e: 0x0010, 0x398f: 0x0010, 0x3990: 0x0001, 0x3991: 0x0001, + 0x3992: 0x0001, 0x3993: 0x0001, 0x3994: 0x0001, 0x3995: 0x0001, 0x3996: 0x0001, 0x3997: 0x0001, + 0x3998: 0x0001, 0x3999: 0x0001, 0x399a: 0x0010, 0x399b: 0x0010, 0x399c: 0x0010, 0x399d: 0x0010, + 0x399e: 0x0010, 0x399f: 0x0010, 0x39a0: 0x0010, 0x39a1: 0x0010, 0x39a2: 0x0010, 0x39a3: 0x0010, + 0x39a4: 0x0010, 0x39a5: 0x0010, 0x39a6: 0x0010, 0x39a7: 0x0010, 0x39a8: 0x0010, 0x39a9: 0x0010, + 0x39aa: 0x0010, 0x39ab: 0x0010, 0x39ac: 0x0010, 0x39ad: 0x0010, 0x39ae: 0x0010, 0x39af: 0x0010, + 0x39b0: 0x0010, 0x39b1: 0x0010, 0x39b2: 0x0010, 0x39b3: 0x0010, 0x39b4: 0x0010, 0x39b5: 0x0010, + 0x39b6: 0x0010, 0x39b7: 0x0010, 0x39b8: 0x0010, 0x39b9: 0x0010, 0x39ba: 0x0010, 0x39bb: 0x0010, + 0x39bc: 0x0010, 0x39bd: 0x0010, 0x39be: 0x0010, 0x39bf: 0x0010, + // Block 0xe7, offset 0x39c0 + 0x39c0: 0x0001, 0x39c1: 0x0001, 0x39c2: 0x0001, 0x39c3: 0x0001, 0x39c4: 0x0001, 0x39c5: 0x0001, + 0x39c6: 0x0001, 0x39c7: 0x0001, 0x39c8: 0x0001, 0x39c9: 0x0001, 0x39ca: 0x0001, 0x39cb: 0x0001, + 0x39cc: 0x0001, 0x39cd: 0x0001, 0x39ce: 0x0001, 0x39cf: 0x0001, 0x39d0: 0x0001, 0x39d1: 0x0001, + 0x39d2: 0x0001, 0x39d3: 0x0001, 0x39d4: 0x0001, 0x39d5: 0x0001, 0x39d6: 0x0001, 0x39d7: 0x0001, + 0x39d8: 0x0001, 0x39d9: 0x0001, 0x39da: 0x0001, 0x39db: 0x0001, 0x39dc: 0x0001, 0x39dd: 0x0001, + 0x39de: 0x0001, 0x39df: 0x0001, 0x39e0: 0x0001, 0x39e1: 0x0001, 0x39e2: 0x0001, 0x39e3: 0x0001, + 0x39e4: 0x0001, 0x39e5: 0x0001, 0x39e6: 0x0001, 0x39e7: 0x0001, 0x39e8: 0x0001, 0x39e9: 0x0001, + 0x39ea: 0x0001, 0x39eb: 0x0001, 0x39ec: 0x0001, 0x39ed: 0x0001, 0x39ee: 0x0001, 0x39ef: 0x0001, + 0x39f0: 0x0001, 0x39f1: 0x0001, 0x39f2: 0x0001, 0x39f3: 0x0001, 0x39f4: 0x0001, 0x39f5: 0x0001, + 0x39f6: 0x0010, 0x39f7: 0x0010, 0x39f8: 0x0001, 0x39f9: 0x0001, 0x39fa: 0x0001, 0x39fb: 0x0001, + 0x39fc: 0x0001, 0x39fd: 0x0001, 0x39fe: 0x0001, 0x39ff: 0x0001, + // Block 0xe8, offset 0x3a00 + 0x3a00: 0x0001, 0x3a01: 0x0060, 0x3a02: 0x0060, 0x3a03: 0x0060, 0x3a04: 0x0060, 0x3a05: 0x0060, + 0x3a06: 0x0060, 0x3a07: 0x0060, 0x3a08: 0x0060, 0x3a09: 0x0060, 0x3a0a: 0x0060, 0x3a0b: 0x0060, + 0x3a0c: 0x0060, 0x3a0d: 0x0060, 0x3a0e: 0x0060, 0x3a0f: 0x0060, 0x3a10: 0x0060, 0x3a11: 0x0060, + 0x3a12: 0x0060, 0x3a13: 0x0060, 0x3a14: 0x0060, 0x3a15: 0x0060, 0x3a16: 0x0060, 0x3a17: 0x0060, + 0x3a18: 0x0001, 0x3a19: 0x0001, 0x3a1a: 0x0001, 0x3a1b: 0x0001, 0x3a1c: 0x0001, 0x3a1d: 0x0001, + 0x3a1e: 0x0010, 0x3a1f: 0x0010, 0x3a20: 0x0010, 0x3a21: 0x0010, 0x3a22: 0x0010, 0x3a23: 0x0010, + 0x3a24: 0x0010, 0x3a25: 0x0010, 0x3a26: 0x0010, 0x3a27: 0x0010, 0x3a28: 0x0010, 0x3a29: 0x0010, + 0x3a2a: 0x0010, 0x3a2b: 0x0010, 0x3a2c: 0x0010, 0x3a2d: 0x0010, 0x3a2e: 0x0010, 0x3a2f: 0x0010, + 0x3a30: 0x0010, 0x3a31: 0x0010, 0x3a32: 0x0010, 0x3a33: 0x0010, 0x3a34: 0x0010, 0x3a35: 0x0010, + 0x3a36: 0x0010, 0x3a37: 0x0010, 0x3a38: 0x0010, 0x3a39: 0x0010, 0x3a3a: 0x0010, 0x3a3b: 0x0010, + 0x3a3c: 0x0010, 0x3a3d: 0x0010, 0x3a3e: 0x0010, 0x3a3f: 0x0010, + // Block 0xe9, offset 0x3a40 + 0x3a40: 0x0001, 0x3a41: 0x0060, 0x3a42: 0x0060, 0x3a43: 0x0060, 0x3a44: 0x0001, 0x3a45: 0x0010, + 0x3a46: 0x0010, 0x3a47: 0x0010, 0x3a48: 0x0010, 0x3a49: 0x0010, 0x3a4a: 0x0010, 0x3a4b: 0x0010, + 0x3a4c: 0x0010, 0x3a4d: 0x0010, 0x3a4e: 0x0010, 0x3a4f: 0x0010, 0x3a50: 0x0001, 0x3a51: 0x0001, + 0x3a52: 0x0001, 0x3a53: 0x0001, 0x3a54: 0x0001, 0x3a55: 0x0001, 0x3a56: 0x0001, 0x3a57: 0x0001, + 0x3a58: 0x0001, 0x3a59: 0x0001, 0x3a5a: 0x0010, 0x3a5b: 0x0010, 0x3a5c: 0x0010, 0x3a5d: 0x0010, + 0x3a5e: 0x0010, 0x3a5f: 0x0010, 0x3a60: 0x0010, 0x3a61: 0x0010, 0x3a62: 0x0010, 0x3a63: 0x0010, + 0x3a64: 0x0010, 0x3a65: 0x0010, 0x3a66: 0x0010, 0x3a67: 0x0010, 0x3a68: 0x0010, 0x3a69: 0x0010, + 0x3a6a: 0x0010, 0x3a6b: 0x0010, 0x3a6c: 0x0010, 0x3a6d: 0x0010, 0x3a6e: 0x0010, 0x3a6f: 0x0010, + 0x3a70: 0x0010, 0x3a71: 0x0010, 0x3a72: 0x0010, 0x3a73: 0x0010, 0x3a74: 0x0010, 0x3a75: 0x0010, + 0x3a76: 0x0010, 0x3a77: 0x0010, 0x3a78: 0x0010, 0x3a79: 0x0010, 0x3a7a: 0x0010, 0x3a7b: 0x0010, + 0x3a7c: 0x0010, 0x3a7d: 0x0010, 0x3a7e: 0x0010, 0x3a7f: 0x0010, + // Block 0xea, offset 0x3a80 + 0x3a80: 0x0001, 0x3a81: 0x0001, 0x3a82: 0x0001, 0x3a83: 0x0001, 0x3a84: 0x0001, 0x3a85: 0x0001, + 0x3a86: 0x0001, 0x3a87: 0x0001, 0x3a88: 0x0001, 0x3a89: 0x0001, 0x3a8a: 0x0010, 0x3a8b: 0x0010, + 0x3a8c: 0x0010, 0x3a8d: 0x0010, 0x3a8e: 0x0010, 0x3a8f: 0x0010, 0x3a90: 0x0010, 0x3a91: 0x0010, + 0x3a92: 0x0010, 0x3a93: 0x0010, 0x3a94: 0x0010, 0x3a95: 0x0010, 0x3a96: 0x0010, 0x3a97: 0x0010, + 0x3a98: 0x0010, 0x3a99: 0x0010, 0x3a9a: 0x0010, 0x3a9b: 0x0010, 0x3a9c: 0x0010, 0x3a9d: 0x0010, + 0x3a9e: 0x0010, 0x3a9f: 0x0010, 0x3aa0: 0x0010, 0x3aa1: 0x0010, 0x3aa2: 0x0010, 0x3aa3: 0x0010, + 0x3aa4: 0x0010, 0x3aa5: 0x0010, 0x3aa6: 0x0010, 0x3aa7: 0x0010, 0x3aa8: 0x0010, 0x3aa9: 0x0010, + 0x3aaa: 0x0010, 0x3aab: 0x0010, 0x3aac: 0x0010, 0x3aad: 0x0010, 0x3aae: 0x0010, 0x3aaf: 0x0010, + 0x3ab0: 0x0010, 0x3ab1: 0x0010, 0x3ab2: 0x0010, 0x3ab3: 0x0010, 0x3ab4: 0x0010, 0x3ab5: 0x0010, + 0x3ab6: 0x0010, 0x3ab7: 0x0010, 0x3ab8: 0x0010, 0x3ab9: 0x0010, 0x3aba: 0x0010, 0x3abb: 0x0010, + 0x3abc: 0x0010, 0x3abd: 0x0010, 0x3abe: 0x0010, 0x3abf: 0x0010, + // Block 0xeb, offset 0x3ac0 + 0x3ac0: 0x0001, 0x3ac1: 0x0001, 0x3ac2: 0x0001, 0x3ac3: 0x0001, 0x3ac4: 0x0001, 0x3ac5: 0x0001, + 0x3ac6: 0x0001, 0x3ac7: 0x0001, 0x3ac8: 0x0001, 0x3ac9: 0x0001, 0x3aca: 0x0001, 0x3acb: 0x0001, + 0x3acc: 0x0001, 0x3acd: 0x0001, 0x3ace: 0x0001, 0x3acf: 0x0001, 0x3ad0: 0x0001, 0x3ad1: 0x0001, + 0x3ad2: 0x0001, 0x3ad3: 0x0001, 0x3ad4: 0x0001, 0x3ad5: 0x0001, 0x3ad6: 0x0001, 0x3ad7: 0x0001, + 0x3ad8: 0x0001, 0x3ad9: 0x0001, 0x3ada: 0x0010, 0x3adb: 0x0010, 0x3adc: 0x0010, 0x3add: 0x0001, + 0x3ade: 0x0001, 0x3adf: 0x0001, 0x3ae0: 0x0001, 0x3ae1: 0x0001, 0x3ae2: 0x0001, 0x3ae3: 0x0001, + 0x3ae4: 0x0001, 0x3ae5: 0x0001, 0x3ae6: 0x0001, 0x3ae7: 0x0001, 0x3ae8: 0x0001, 0x3ae9: 0x0001, + 0x3aea: 0x0001, 0x3aeb: 0x0001, 0x3aec: 0x0010, 0x3aed: 0x0010, 0x3aee: 0x0010, 0x3aef: 0x0010, + 0x3af0: 0x0001, 0x3af1: 0x0001, 0x3af2: 0x0001, 0x3af3: 0x0001, 0x3af4: 0x0001, 0x3af5: 0x0001, + 0x3af6: 0x0001, 0x3af7: 0x0001, 0x3af8: 0x0001, 0x3af9: 0x0001, 0x3afa: 0x0060, 0x3afb: 0x0060, + 0x3afc: 0x0060, 0x3afd: 0x0060, 0x3afe: 0x0060, 0x3aff: 0x0060, + // Block 0xec, offset 0x3b00 + 0x3b00: 0x0010, 0x3b01: 0x0010, 0x3b02: 0x0010, 0x3b03: 0x0010, 0x3b04: 0x0010, 0x3b05: 0x0010, + 0x3b06: 0x0010, 0x3b07: 0x0010, 0x3b08: 0x0010, 0x3b09: 0x0010, 0x3b0a: 0x0010, 0x3b0b: 0x0010, + 0x3b0c: 0x0010, 0x3b0d: 0x0010, 0x3b0e: 0x0010, 0x3b0f: 0x0010, 0x3b10: 0x0010, 0x3b11: 0x0010, + 0x3b12: 0x0010, 0x3b13: 0x0010, 0x3b14: 0x0010, 0x3b15: 0x0010, 0x3b16: 0x0010, 0x3b17: 0x0010, + 0x3b18: 0x0010, 0x3b19: 0x0010, 0x3b1a: 0x0010, 0x3b1b: 0x0010, 0x3b1c: 0x0010, 0x3b1d: 0x0010, + 0x3b1e: 0x0010, 0x3b1f: 0x0010, 0x3b20: 0x0001, 0x3b21: 0x0001, 0x3b22: 0x0001, 0x3b23: 0x0001, + 0x3b24: 0x0001, 0x3b25: 0x0001, 0x3b26: 0x0001, 0x3b27: 0x0001, 0x3b28: 0x0001, 0x3b29: 0x0001, + 0x3b2a: 0x0001, 0x3b2b: 0x0001, 0x3b2c: 0x0001, 0x3b2d: 0x0001, 0x3b2e: 0x0001, 0x3b2f: 0x0001, + 0x3b30: 0x0001, 0x3b31: 0x0001, 0x3b32: 0x0001, 0x3b33: 0x0001, 0x3b34: 0x0001, 0x3b35: 0x0001, + 0x3b36: 0x0001, 0x3b37: 0x0001, 0x3b38: 0x0001, 0x3b39: 0x0001, 0x3b3a: 0x0001, 0x3b3b: 0x0001, + 0x3b3c: 0x0001, 0x3b3d: 0x0001, 0x3b3e: 0x0001, 0x3b3f: 0x0001, + // Block 0xed, offset 0x3b40 + 0x3b40: 0x0001, 0x3b41: 0x0001, 0x3b42: 0x0001, 0x3b43: 0x0001, 0x3b44: 0x0001, 0x3b45: 0x0001, + 0x3b46: 0x0001, 0x3b47: 0x0001, 0x3b48: 0x0001, 0x3b49: 0x0001, 0x3b4a: 0x0001, 0x3b4b: 0x0001, + 0x3b4c: 0x0001, 0x3b4d: 0x0001, 0x3b4e: 0x0001, 0x3b4f: 0x0001, 0x3b50: 0x0001, 0x3b51: 0x0001, + 0x3b52: 0x0001, 0x3b53: 0x0001, 0x3b54: 0x0001, 0x3b55: 0x0001, 0x3b56: 0x0001, 0x3b57: 0x0001, + 0x3b58: 0x0001, 0x3b59: 0x0001, 0x3b5a: 0x0001, 0x3b5b: 0x0001, 0x3b5c: 0x0001, 0x3b5d: 0x0001, + 0x3b5e: 0x0001, 0x3b5f: 0x0001, 0x3b60: 0x0001, 0x3b61: 0x0001, 0x3b62: 0x0001, 0x3b63: 0x0001, + 0x3b64: 0x0001, 0x3b65: 0x0001, 0x3b66: 0x0001, 0x3b67: 0x0001, 0x3b68: 0x0001, 0x3b69: 0x0001, + 0x3b6a: 0x0060, 0x3b6b: 0x0060, 0x3b6c: 0x0060, 0x3b6d: 0x0060, 0x3b6e: 0x0060, 0x3b6f: 0x0060, + 0x3b70: 0x0060, 0x3b71: 0x0060, 0x3b72: 0x0060, 0x3b73: 0x0010, 0x3b74: 0x0010, 0x3b75: 0x0010, + 0x3b76: 0x0010, 0x3b77: 0x0010, 0x3b78: 0x0010, 0x3b79: 0x0010, 0x3b7a: 0x0010, 0x3b7b: 0x0010, + 0x3b7c: 0x0010, 0x3b7d: 0x0010, 0x3b7e: 0x0010, 0x3b7f: 0x0001, + // Block 0xee, offset 0x3b80 + 0x3b80: 0x0001, 0x3b81: 0x0001, 0x3b82: 0x0001, 0x3b83: 0x0001, 0x3b84: 0x0001, 0x3b85: 0x0001, + 0x3b86: 0x0001, 0x3b87: 0x0001, 0x3b88: 0x0001, 0x3b89: 0x0001, 0x3b8a: 0x0001, 0x3b8b: 0x0001, + 0x3b8c: 0x0001, 0x3b8d: 0x0001, 0x3b8e: 0x0001, 0x3b8f: 0x0001, 0x3b90: 0x0001, 0x3b91: 0x0001, + 0x3b92: 0x0001, 0x3b93: 0x0001, 0x3b94: 0x0001, 0x3b95: 0x0001, 0x3b96: 0x0001, 0x3b97: 0x0001, + 0x3b98: 0x0001, 0x3b99: 0x0001, 0x3b9a: 0x0001, 0x3b9b: 0x0001, 0x3b9c: 0x0001, 0x3b9d: 0x0001, + 0x3b9e: 0x0001, 0x3b9f: 0x0001, 0x3ba0: 0x0001, 0x3ba1: 0x0001, 0x3ba2: 0x0001, 0x3ba3: 0x0001, + 0x3ba4: 0x0001, 0x3ba5: 0x0001, 0x3ba6: 0x0001, 0x3ba7: 0x0001, 0x3ba8: 0x0001, 0x3ba9: 0x0001, + 0x3baa: 0x0001, 0x3bab: 0x0001, 0x3bac: 0x0001, 0x3bad: 0x0001, 0x3bae: 0x0001, 0x3baf: 0x0001, + 0x3bb0: 0x0001, 0x3bb1: 0x0001, 0x3bb2: 0x0001, 0x3bb3: 0x0001, 0x3bb4: 0x0001, 0x3bb5: 0x0001, + 0x3bb6: 0x0001, 0x3bb7: 0x0001, 0x3bb8: 0x0001, 0x3bb9: 0x0010, 0x3bba: 0x0010, 0x3bbb: 0x0010, + 0x3bbc: 0x0010, 0x3bbd: 0x0010, 0x3bbe: 0x0010, 0x3bbf: 0x0010, + // Block 0xef, offset 0x3bc0 + 0x3bc0: 0x0001, 0x3bc1: 0x0001, 0x3bc2: 0x0001, 0x3bc3: 0x0001, 0x3bc4: 0x0001, 0x3bc5: 0x0001, + 0x3bc6: 0x0001, 0x3bc7: 0x0001, 0x3bc8: 0x0001, 0x3bc9: 0x0001, 0x3bca: 0x0001, 0x3bcb: 0x0001, + 0x3bcc: 0x0001, 0x3bcd: 0x0001, 0x3bce: 0x0001, 0x3bcf: 0x0001, 0x3bd0: 0x0001, 0x3bd1: 0x0001, + 0x3bd2: 0x0001, 0x3bd3: 0x0001, 0x3bd4: 0x0001, 0x3bd5: 0x0001, 0x3bd6: 0x0001, 0x3bd7: 0x0001, + 0x3bd8: 0x0001, 0x3bd9: 0x0001, 0x3bda: 0x0010, 0x3bdb: 0x0010, 0x3bdc: 0x0010, 0x3bdd: 0x0010, + 0x3bde: 0x0010, 0x3bdf: 0x0010, 0x3be0: 0x0010, 0x3be1: 0x0010, 0x3be2: 0x0010, 0x3be3: 0x0010, + 0x3be4: 0x0010, 0x3be5: 0x0010, 0x3be6: 0x0010, 0x3be7: 0x0010, 0x3be8: 0x0010, 0x3be9: 0x0010, + 0x3bea: 0x0010, 0x3beb: 0x0010, 0x3bec: 0x0010, 0x3bed: 0x0010, 0x3bee: 0x0010, 0x3bef: 0x0010, + 0x3bf0: 0x0010, 0x3bf1: 0x0010, 0x3bf2: 0x0010, 0x3bf3: 0x0010, 0x3bf4: 0x0010, 0x3bf5: 0x0010, + 0x3bf6: 0x0010, 0x3bf7: 0x0010, 0x3bf8: 0x0010, 0x3bf9: 0x0010, 0x3bfa: 0x0010, 0x3bfb: 0x0010, + 0x3bfc: 0x0010, 0x3bfd: 0x0010, 0x3bfe: 0x0010, 0x3bff: 0x0010, + // Block 0xf0, offset 0x3c00 + 0x3c00: 0x0060, 0x3c01: 0x0060, 0x3c02: 0x0060, 0x3c03: 0x0060, 0x3c04: 0x0060, 0x3c05: 0x0060, + 0x3c06: 0x0060, 0x3c07: 0x0060, 0x3c08: 0x0060, 0x3c09: 0x0060, 0x3c0a: 0x0060, 0x3c0b: 0x0060, + 0x3c0c: 0x0060, 0x3c0d: 0x0060, 0x3c0e: 0x0060, 0x3c0f: 0x0060, 0x3c10: 0x0060, 0x3c11: 0x0060, + 0x3c12: 0x0060, 0x3c13: 0x0060, 0x3c14: 0x0060, 0x3c15: 0x0060, 0x3c16: 0x0060, 0x3c17: 0x0060, + 0x3c18: 0x0060, 0x3c19: 0x0060, 0x3c1a: 0x0060, 0x3c1b: 0x0060, 0x3c1c: 0x0060, 0x3c1d: 0x0060, + 0x3c1e: 0x0060, 0x3c1f: 0x0060, 0x3c20: 0x0060, 0x3c21: 0x0060, 0x3c22: 0x0060, 0x3c23: 0x0060, + 0x3c24: 0x0060, 0x3c25: 0x0060, 0x3c26: 0x0060, 0x3c27: 0x0060, 0x3c28: 0x0060, 0x3c29: 0x0060, + 0x3c2a: 0x0060, 0x3c2b: 0x0060, 0x3c2c: 0x0060, 0x3c2d: 0x0060, 0x3c2e: 0x0060, 0x3c2f: 0x0010, + 0x3c30: 0x0060, 0x3c31: 0x0060, 0x3c32: 0x0060, 0x3c33: 0x0060, 0x3c34: 0x0060, 0x3c35: 0x0010, + 0x3c36: 0x0010, 0x3c37: 0x0010, 0x3c38: 0x0010, 0x3c39: 0x0010, 0x3c3a: 0x0010, 0x3c3b: 0x0010, + 0x3c3c: 0x0010, 0x3c3d: 0x0010, 0x3c3e: 0x0010, 0x3c3f: 0x0010, + // Block 0xf1, offset 0x3c40 + 0x3c40: 0x0001, 0x3c41: 0x0001, 0x3c42: 0x0001, 0x3c43: 0x0001, 0x3c44: 0x0010, 0x3c45: 0x0010, + 0x3c46: 0x0010, 0x3c47: 0x0010, 0x3c48: 0x0010, 0x3c49: 0x0010, 0x3c4a: 0x0010, 0x3c4b: 0x0010, + 0x3c4c: 0x0010, 0x3c4d: 0x0010, 0x3c4e: 0x0010, 0x3c4f: 0x0010, 0x3c50: 0x0010, 0x3c51: 0x0010, + 0x3c52: 0x0010, 0x3c53: 0x0010, 0x3c54: 0x0010, 0x3c55: 0x0010, 0x3c56: 0x0010, 0x3c57: 0x0010, + 0x3c58: 0x0010, 0x3c59: 0x0010, 0x3c5a: 0x0010, 0x3c5b: 0x0010, 0x3c5c: 0x0010, 0x3c5d: 0x0010, + 0x3c5e: 0x0010, 0x3c5f: 0x0010, 0x3c60: 0x0010, 0x3c61: 0x0010, 0x3c62: 0x0010, 0x3c63: 0x0010, + 0x3c64: 0x0010, 0x3c65: 0x0010, 0x3c66: 0x0010, 0x3c67: 0x0010, 0x3c68: 0x0010, 0x3c69: 0x0010, + 0x3c6a: 0x0010, 0x3c6b: 0x0010, 0x3c6c: 0x0010, 0x3c6d: 0x0010, 0x3c6e: 0x0010, 0x3c6f: 0x0010, + 0x3c70: 0x0010, 0x3c71: 0x0010, 0x3c72: 0x0010, 0x3c73: 0x0010, 0x3c74: 0x0010, 0x3c75: 0x0010, + 0x3c76: 0x0010, 0x3c77: 0x0010, 0x3c78: 0x0010, 0x3c79: 0x0010, 0x3c7a: 0x0010, 0x3c7b: 0x0010, + 0x3c7c: 0x0010, 0x3c7d: 0x0010, 0x3c7e: 0x0010, 0x3c7f: 0x0010, + // Block 0xf2, offset 0x3c80 + 0x3c80: 0x0001, 0x3c81: 0x0001, 0x3c82: 0x0001, 0x3c83: 0x0001, 0x3c84: 0x0001, 0x3c85: 0x0001, + 0x3c86: 0x0001, 0x3c87: 0x0001, 0x3c88: 0x0001, 0x3c89: 0x0001, 0x3c8a: 0x0001, 0x3c8b: 0x0001, + 0x3c8c: 0x0001, 0x3c8d: 0x0001, 0x3c8e: 0x0001, 0x3c8f: 0x0001, 0x3c90: 0x0001, 0x3c91: 0x0001, + 0x3c92: 0x0001, 0x3c93: 0x0001, 0x3c94: 0x0001, 0x3c95: 0x0001, 0x3c96: 0x0001, 0x3c97: 0x0001, + 0x3c98: 0x0001, 0x3c99: 0x0001, 0x3c9a: 0x0001, 0x3c9b: 0x0001, 0x3c9c: 0x0001, 0x3c9d: 0x0001, + 0x3c9e: 0x0001, 0x3c9f: 0x0001, 0x3ca0: 0x0001, 0x3ca1: 0x0001, 0x3ca2: 0x0001, 0x3ca3: 0x0001, + 0x3ca4: 0x0001, 0x3ca5: 0x0001, 0x3ca6: 0x0001, 0x3ca7: 0x0001, 0x3ca8: 0x0001, 0x3ca9: 0x0001, + 0x3caa: 0x0001, 0x3cab: 0x0001, 0x3cac: 0x0001, 0x3cad: 0x0001, 0x3cae: 0x0001, 0x3caf: 0x0010, + 0x3cb0: 0x0010, 0x3cb1: 0x0010, 0x3cb2: 0x0010, 0x3cb3: 0x0010, 0x3cb4: 0x0010, 0x3cb5: 0x0010, + 0x3cb6: 0x0010, 0x3cb7: 0x0010, 0x3cb8: 0x0010, 0x3cb9: 0x0010, 0x3cba: 0x0010, 0x3cbb: 0x0010, + 0x3cbc: 0x0010, 0x3cbd: 0x0010, 0x3cbe: 0x0010, 0x3cbf: 0x0010, + // Block 0xf3, offset 0x3cc0 + 0x3cc0: 0x0001, 0x3cc1: 0x0001, 0x3cc2: 0x0001, 0x3cc3: 0x0001, 0x3cc4: 0x0001, 0x3cc5: 0x0001, + 0x3cc6: 0x0001, 0x3cc7: 0x0010, 0x3cc8: 0x0010, 0x3cc9: 0x0010, 0x3cca: 0x0010, 0x3ccb: 0x0010, + 0x3ccc: 0x0010, 0x3ccd: 0x0010, 0x3cce: 0x0010, 0x3ccf: 0x0010, 0x3cd0: 0x0010, 0x3cd1: 0x0010, + 0x3cd2: 0x0010, 0x3cd3: 0x0010, 0x3cd4: 0x0010, 0x3cd5: 0x0010, 0x3cd6: 0x0010, 0x3cd7: 0x0010, + 0x3cd8: 0x0010, 0x3cd9: 0x0010, 0x3cda: 0x0010, 0x3cdb: 0x0010, 0x3cdc: 0x0010, 0x3cdd: 0x0010, + 0x3cde: 0x0010, 0x3cdf: 0x0010, 0x3ce0: 0x0010, 0x3ce1: 0x0010, 0x3ce2: 0x0010, 0x3ce3: 0x0010, + 0x3ce4: 0x0010, 0x3ce5: 0x0010, 0x3ce6: 0x0010, 0x3ce7: 0x0010, 0x3ce8: 0x0010, 0x3ce9: 0x0010, + 0x3cea: 0x0010, 0x3ceb: 0x0010, 0x3cec: 0x0010, 0x3ced: 0x0010, 0x3cee: 0x0010, 0x3cef: 0x0010, + 0x3cf0: 0x0010, 0x3cf1: 0x0010, 0x3cf2: 0x0010, 0x3cf3: 0x0010, 0x3cf4: 0x0010, 0x3cf5: 0x0010, + 0x3cf6: 0x0010, 0x3cf7: 0x0010, 0x3cf8: 0x0010, 0x3cf9: 0x0010, 0x3cfa: 0x0010, 0x3cfb: 0x0010, + 0x3cfc: 0x0010, 0x3cfd: 0x0010, 0x3cfe: 0x0010, 0x3cff: 0x0010, + // Block 0xf4, offset 0x3d00 + 0x3d00: 0x0001, 0x3d01: 0x0001, 0x3d02: 0x0001, 0x3d03: 0x0001, 0x3d04: 0x0001, 0x3d05: 0x0001, + 0x3d06: 0x0001, 0x3d07: 0x0001, 0x3d08: 0x0001, 0x3d09: 0x0001, 0x3d0a: 0x0001, 0x3d0b: 0x0001, + 0x3d0c: 0x0001, 0x3d0d: 0x0001, 0x3d0e: 0x0001, 0x3d0f: 0x0001, 0x3d10: 0x0001, 0x3d11: 0x0001, + 0x3d12: 0x0001, 0x3d13: 0x0001, 0x3d14: 0x0001, 0x3d15: 0x0001, 0x3d16: 0x0001, 0x3d17: 0x0001, + 0x3d18: 0x0001, 0x3d19: 0x0001, 0x3d1a: 0x0001, 0x3d1b: 0x0001, 0x3d1c: 0x0001, 0x3d1d: 0x0001, + 0x3d1e: 0x0001, 0x3d1f: 0x0010, 0x3d20: 0x0001, 0x3d21: 0x0001, 0x3d22: 0x0001, 0x3d23: 0x0001, + 0x3d24: 0x0001, 0x3d25: 0x0001, 0x3d26: 0x0001, 0x3d27: 0x0001, 0x3d28: 0x0001, 0x3d29: 0x0001, + 0x3d2a: 0x0010, 0x3d2b: 0x0010, 0x3d2c: 0x0010, 0x3d2d: 0x0010, 0x3d2e: 0x0060, 0x3d2f: 0x0060, + 0x3d30: 0x0010, 0x3d31: 0x0010, 0x3d32: 0x0010, 0x3d33: 0x0010, 0x3d34: 0x0010, 0x3d35: 0x0010, + 0x3d36: 0x0010, 0x3d37: 0x0010, 0x3d38: 0x0010, 0x3d39: 0x0010, 0x3d3a: 0x0010, 0x3d3b: 0x0010, + 0x3d3c: 0x0010, 0x3d3d: 0x0010, 0x3d3e: 0x0010, 0x3d3f: 0x0010, + // Block 0xf5, offset 0x3d40 + 0x3d40: 0x0010, 0x3d41: 0x0010, 0x3d42: 0x0010, 0x3d43: 0x0010, 0x3d44: 0x0010, 0x3d45: 0x0010, + 0x3d46: 0x0010, 0x3d47: 0x0010, 0x3d48: 0x0010, 0x3d49: 0x0010, 0x3d4a: 0x0010, 0x3d4b: 0x0010, + 0x3d4c: 0x0010, 0x3d4d: 0x0010, 0x3d4e: 0x0010, 0x3d4f: 0x0010, 0x3d50: 0x0001, 0x3d51: 0x0001, + 0x3d52: 0x0001, 0x3d53: 0x0001, 0x3d54: 0x0001, 0x3d55: 0x0001, 0x3d56: 0x0001, 0x3d57: 0x0001, + 0x3d58: 0x0001, 0x3d59: 0x0001, 0x3d5a: 0x0001, 0x3d5b: 0x0001, 0x3d5c: 0x0001, 0x3d5d: 0x0001, + 0x3d5e: 0x0001, 0x3d5f: 0x0001, 0x3d60: 0x0001, 0x3d61: 0x0001, 0x3d62: 0x0001, 0x3d63: 0x0001, + 0x3d64: 0x0001, 0x3d65: 0x0001, 0x3d66: 0x0001, 0x3d67: 0x0001, 0x3d68: 0x0001, 0x3d69: 0x0001, + 0x3d6a: 0x0001, 0x3d6b: 0x0001, 0x3d6c: 0x0001, 0x3d6d: 0x0001, 0x3d6e: 0x0010, 0x3d6f: 0x0010, + 0x3d70: 0x0001, 0x3d71: 0x0001, 0x3d72: 0x0001, 0x3d73: 0x0001, 0x3d74: 0x0001, 0x3d75: 0x0060, + 0x3d76: 0x0010, 0x3d77: 0x0010, 0x3d78: 0x0010, 0x3d79: 0x0010, 0x3d7a: 0x0010, 0x3d7b: 0x0010, + 0x3d7c: 0x0010, 0x3d7d: 0x0010, 0x3d7e: 0x0010, 0x3d7f: 0x0010, + // Block 0xf6, offset 0x3d80 + 0x3d80: 0x0001, 0x3d81: 0x0001, 0x3d82: 0x0001, 0x3d83: 0x0001, 0x3d84: 0x0001, 0x3d85: 0x0001, + 0x3d86: 0x0001, 0x3d87: 0x0001, 0x3d88: 0x0001, 0x3d89: 0x0001, 0x3d8a: 0x0001, 0x3d8b: 0x0001, + 0x3d8c: 0x0001, 0x3d8d: 0x0001, 0x3d8e: 0x0001, 0x3d8f: 0x0001, 0x3d90: 0x0001, 0x3d91: 0x0001, + 0x3d92: 0x0001, 0x3d93: 0x0001, 0x3d94: 0x0001, 0x3d95: 0x0001, 0x3d96: 0x0001, 0x3d97: 0x0001, + 0x3d98: 0x0001, 0x3d99: 0x0001, 0x3d9a: 0x0001, 0x3d9b: 0x0001, 0x3d9c: 0x0001, 0x3d9d: 0x0001, + 0x3d9e: 0x0001, 0x3d9f: 0x0001, 0x3da0: 0x0001, 0x3da1: 0x0001, 0x3da2: 0x0001, 0x3da3: 0x0001, + 0x3da4: 0x0001, 0x3da5: 0x0001, 0x3da6: 0x0001, 0x3da7: 0x0001, 0x3da8: 0x0001, 0x3da9: 0x0001, + 0x3daa: 0x0001, 0x3dab: 0x0001, 0x3dac: 0x0001, 0x3dad: 0x0001, 0x3dae: 0x0001, 0x3daf: 0x0001, + 0x3db0: 0x0001, 0x3db1: 0x0001, 0x3db2: 0x0001, 0x3db3: 0x0001, 0x3db4: 0x0001, 0x3db5: 0x0001, + 0x3db6: 0x0001, 0x3db7: 0x0060, 0x3db8: 0x0060, 0x3db9: 0x0060, 0x3dba: 0x0060, 0x3dbb: 0x0060, + 0x3dbc: 0x0060, 0x3dbd: 0x0060, 0x3dbe: 0x0060, 0x3dbf: 0x0060, + // Block 0xf7, offset 0x3dc0 + 0x3dc0: 0x0001, 0x3dc1: 0x0001, 0x3dc2: 0x0001, 0x3dc3: 0x0001, 0x3dc4: 0x0060, 0x3dc5: 0x0060, + 0x3dc6: 0x0010, 0x3dc7: 0x0010, 0x3dc8: 0x0010, 0x3dc9: 0x0010, 0x3dca: 0x0010, 0x3dcb: 0x0010, + 0x3dcc: 0x0010, 0x3dcd: 0x0010, 0x3dce: 0x0010, 0x3dcf: 0x0010, 0x3dd0: 0x0001, 0x3dd1: 0x0001, + 0x3dd2: 0x0001, 0x3dd3: 0x0001, 0x3dd4: 0x0001, 0x3dd5: 0x0001, 0x3dd6: 0x0001, 0x3dd7: 0x0001, + 0x3dd8: 0x0001, 0x3dd9: 0x0001, 0x3dda: 0x0010, 0x3ddb: 0x0060, 0x3ddc: 0x0060, 0x3ddd: 0x0060, + 0x3dde: 0x0060, 0x3ddf: 0x0060, 0x3de0: 0x0060, 0x3de1: 0x0060, 0x3de2: 0x0010, 0x3de3: 0x0001, + 0x3de4: 0x0001, 0x3de5: 0x0001, 0x3de6: 0x0001, 0x3de7: 0x0001, 0x3de8: 0x0001, 0x3de9: 0x0001, + 0x3dea: 0x0001, 0x3deb: 0x0001, 0x3dec: 0x0001, 0x3ded: 0x0001, 0x3dee: 0x0001, 0x3def: 0x0001, + 0x3df0: 0x0001, 0x3df1: 0x0001, 0x3df2: 0x0001, 0x3df3: 0x0001, 0x3df4: 0x0001, 0x3df5: 0x0001, + 0x3df6: 0x0001, 0x3df7: 0x0001, 0x3df8: 0x0010, 0x3df9: 0x0010, 0x3dfa: 0x0010, 0x3dfb: 0x0010, + 0x3dfc: 0x0010, 0x3dfd: 0x0001, 0x3dfe: 0x0001, 0x3dff: 0x0001, + // Block 0xf8, offset 0x3e00 + 0x3e00: 0x0001, 0x3e01: 0x0001, 0x3e02: 0x0001, 0x3e03: 0x0001, 0x3e04: 0x0001, 0x3e05: 0x0001, + 0x3e06: 0x0001, 0x3e07: 0x0001, 0x3e08: 0x0001, 0x3e09: 0x0001, 0x3e0a: 0x0001, 0x3e0b: 0x0001, + 0x3e0c: 0x0001, 0x3e0d: 0x0001, 0x3e0e: 0x0001, 0x3e0f: 0x0001, 0x3e10: 0x0010, 0x3e11: 0x0010, + 0x3e12: 0x0010, 0x3e13: 0x0010, 0x3e14: 0x0010, 0x3e15: 0x0010, 0x3e16: 0x0010, 0x3e17: 0x0010, + 0x3e18: 0x0010, 0x3e19: 0x0010, 0x3e1a: 0x0010, 0x3e1b: 0x0010, 0x3e1c: 0x0010, 0x3e1d: 0x0010, + 0x3e1e: 0x0010, 0x3e1f: 0x0010, 0x3e20: 0x0010, 0x3e21: 0x0010, 0x3e22: 0x0010, 0x3e23: 0x0010, + 0x3e24: 0x0010, 0x3e25: 0x0010, 0x3e26: 0x0010, 0x3e27: 0x0010, 0x3e28: 0x0010, 0x3e29: 0x0010, + 0x3e2a: 0x0010, 0x3e2b: 0x0010, 0x3e2c: 0x0010, 0x3e2d: 0x0010, 0x3e2e: 0x0010, 0x3e2f: 0x0010, + 0x3e30: 0x0010, 0x3e31: 0x0010, 0x3e32: 0x0010, 0x3e33: 0x0010, 0x3e34: 0x0010, 0x3e35: 0x0010, + 0x3e36: 0x0010, 0x3e37: 0x0010, 0x3e38: 0x0010, 0x3e39: 0x0010, 0x3e3a: 0x0010, 0x3e3b: 0x0010, + 0x3e3c: 0x0010, 0x3e3d: 0x0010, 0x3e3e: 0x0010, 0x3e3f: 0x0010, + // Block 0xf9, offset 0x3e40 + 0x3e40: 0x0001, 0x3e41: 0x0001, 0x3e42: 0x0001, 0x3e43: 0x0001, 0x3e44: 0x0001, 0x3e45: 0x0010, + 0x3e46: 0x0010, 0x3e47: 0x0010, 0x3e48: 0x0010, 0x3e49: 0x0010, 0x3e4a: 0x0010, 0x3e4b: 0x0010, + 0x3e4c: 0x0010, 0x3e4d: 0x0010, 0x3e4e: 0x0010, 0x3e4f: 0x0010, 0x3e50: 0x0001, 0x3e51: 0x0001, + 0x3e52: 0x0001, 0x3e53: 0x0001, 0x3e54: 0x0001, 0x3e55: 0x0001, 0x3e56: 0x0001, 0x3e57: 0x0001, + 0x3e58: 0x0001, 0x3e59: 0x0001, 0x3e5a: 0x0001, 0x3e5b: 0x0001, 0x3e5c: 0x0001, 0x3e5d: 0x0001, + 0x3e5e: 0x0001, 0x3e5f: 0x0001, 0x3e60: 0x0001, 0x3e61: 0x0001, 0x3e62: 0x0001, 0x3e63: 0x0001, + 0x3e64: 0x0001, 0x3e65: 0x0001, 0x3e66: 0x0001, 0x3e67: 0x0001, 0x3e68: 0x0001, 0x3e69: 0x0001, + 0x3e6a: 0x0001, 0x3e6b: 0x0001, 0x3e6c: 0x0001, 0x3e6d: 0x0001, 0x3e6e: 0x0001, 0x3e6f: 0x0001, + 0x3e70: 0x0001, 0x3e71: 0x0001, 0x3e72: 0x0001, 0x3e73: 0x0001, 0x3e74: 0x0001, 0x3e75: 0x0001, + 0x3e76: 0x0001, 0x3e77: 0x0001, 0x3e78: 0x0001, 0x3e79: 0x0001, 0x3e7a: 0x0001, 0x3e7b: 0x0001, + 0x3e7c: 0x0001, 0x3e7d: 0x0001, 0x3e7e: 0x0001, 0x3e7f: 0x0010, + // Block 0xfa, offset 0x3e80 + 0x3e80: 0x0010, 0x3e81: 0x0010, 0x3e82: 0x0010, 0x3e83: 0x0010, 0x3e84: 0x0010, 0x3e85: 0x0010, + 0x3e86: 0x0010, 0x3e87: 0x0010, 0x3e88: 0x0010, 0x3e89: 0x0010, 0x3e8a: 0x0010, 0x3e8b: 0x0010, + 0x3e8c: 0x0010, 0x3e8d: 0x0010, 0x3e8e: 0x0010, 0x3e8f: 0x0001, 0x3e90: 0x0001, 0x3e91: 0x0001, + 0x3e92: 0x0001, 0x3e93: 0x0001, 0x3e94: 0x0001, 0x3e95: 0x0001, 0x3e96: 0x0001, 0x3e97: 0x0001, + 0x3e98: 0x0001, 0x3e99: 0x0001, 0x3e9a: 0x0001, 0x3e9b: 0x0001, 0x3e9c: 0x0001, 0x3e9d: 0x0001, + 0x3e9e: 0x0001, 0x3e9f: 0x0001, 0x3ea0: 0x0010, 0x3ea1: 0x0010, 0x3ea2: 0x0010, 0x3ea3: 0x0010, + 0x3ea4: 0x0010, 0x3ea5: 0x0010, 0x3ea6: 0x0010, 0x3ea7: 0x0010, 0x3ea8: 0x0010, 0x3ea9: 0x0010, + 0x3eaa: 0x0010, 0x3eab: 0x0010, 0x3eac: 0x0010, 0x3ead: 0x0010, 0x3eae: 0x0010, 0x3eaf: 0x0010, + 0x3eb0: 0x0010, 0x3eb1: 0x0010, 0x3eb2: 0x0010, 0x3eb3: 0x0010, 0x3eb4: 0x0010, 0x3eb5: 0x0010, + 0x3eb6: 0x0010, 0x3eb7: 0x0010, 0x3eb8: 0x0010, 0x3eb9: 0x0010, 0x3eba: 0x0010, 0x3ebb: 0x0010, + 0x3ebc: 0x0010, 0x3ebd: 0x0010, 0x3ebe: 0x0010, 0x3ebf: 0x0010, + // Block 0xfb, offset 0x3ec0 + 0x3ec0: 0x0001, 0x3ec1: 0x0001, 0x3ec2: 0x0010, 0x3ec3: 0x0010, 0x3ec4: 0x0010, 0x3ec5: 0x0010, + 0x3ec6: 0x0010, 0x3ec7: 0x0010, 0x3ec8: 0x0010, 0x3ec9: 0x0010, 0x3eca: 0x0010, 0x3ecb: 0x0010, + 0x3ecc: 0x0010, 0x3ecd: 0x0010, 0x3ece: 0x0010, 0x3ecf: 0x0010, 0x3ed0: 0x0010, 0x3ed1: 0x0010, + 0x3ed2: 0x0010, 0x3ed3: 0x0010, 0x3ed4: 0x0010, 0x3ed5: 0x0010, 0x3ed6: 0x0010, 0x3ed7: 0x0010, + 0x3ed8: 0x0010, 0x3ed9: 0x0010, 0x3eda: 0x0010, 0x3edb: 0x0010, 0x3edc: 0x0010, 0x3edd: 0x0010, + 0x3ede: 0x0010, 0x3edf: 0x0010, 0x3ee0: 0x0010, 0x3ee1: 0x0010, 0x3ee2: 0x0010, 0x3ee3: 0x0010, + 0x3ee4: 0x0010, 0x3ee5: 0x0010, 0x3ee6: 0x0010, 0x3ee7: 0x0010, 0x3ee8: 0x0010, 0x3ee9: 0x0010, + 0x3eea: 0x0010, 0x3eeb: 0x0010, 0x3eec: 0x0010, 0x3eed: 0x0010, 0x3eee: 0x0010, 0x3eef: 0x0010, + 0x3ef0: 0x0010, 0x3ef1: 0x0010, 0x3ef2: 0x0010, 0x3ef3: 0x0010, 0x3ef4: 0x0010, 0x3ef5: 0x0010, + 0x3ef6: 0x0010, 0x3ef7: 0x0010, 0x3ef8: 0x0010, 0x3ef9: 0x0010, 0x3efa: 0x0010, 0x3efb: 0x0010, + 0x3efc: 0x0010, 0x3efd: 0x0010, 0x3efe: 0x0010, 0x3eff: 0x0010, + // Block 0xfc, offset 0x3f00 + 0x3f00: 0x0001, 0x3f01: 0x0001, 0x3f02: 0x0001, 0x3f03: 0x0001, 0x3f04: 0x0001, 0x3f05: 0x0001, + 0x3f06: 0x0001, 0x3f07: 0x0001, 0x3f08: 0x0001, 0x3f09: 0x0001, 0x3f0a: 0x0001, 0x3f0b: 0x0001, + 0x3f0c: 0x0001, 0x3f0d: 0x0001, 0x3f0e: 0x0001, 0x3f0f: 0x0001, 0x3f10: 0x0001, 0x3f11: 0x0001, + 0x3f12: 0x0001, 0x3f13: 0x0001, 0x3f14: 0x0001, 0x3f15: 0x0001, 0x3f16: 0x0001, 0x3f17: 0x0001, + 0x3f18: 0x0001, 0x3f19: 0x0001, 0x3f1a: 0x0001, 0x3f1b: 0x0001, 0x3f1c: 0x0001, 0x3f1d: 0x0001, + 0x3f1e: 0x0001, 0x3f1f: 0x0001, 0x3f20: 0x0001, 0x3f21: 0x0001, 0x3f22: 0x0001, 0x3f23: 0x0001, + 0x3f24: 0x0001, 0x3f25: 0x0001, 0x3f26: 0x0001, 0x3f27: 0x0001, 0x3f28: 0x0001, 0x3f29: 0x0001, + 0x3f2a: 0x0001, 0x3f2b: 0x0010, 0x3f2c: 0x0010, 0x3f2d: 0x0010, 0x3f2e: 0x0010, 0x3f2f: 0x0010, + 0x3f30: 0x0001, 0x3f31: 0x0001, 0x3f32: 0x0001, 0x3f33: 0x0001, 0x3f34: 0x0001, 0x3f35: 0x0001, + 0x3f36: 0x0001, 0x3f37: 0x0001, 0x3f38: 0x0001, 0x3f39: 0x0001, 0x3f3a: 0x0001, 0x3f3b: 0x0001, + 0x3f3c: 0x0001, 0x3f3d: 0x0010, 0x3f3e: 0x0010, 0x3f3f: 0x0010, + // Block 0xfd, offset 0x3f40 + 0x3f40: 0x0001, 0x3f41: 0x0001, 0x3f42: 0x0001, 0x3f43: 0x0001, 0x3f44: 0x0001, 0x3f45: 0x0001, + 0x3f46: 0x0001, 0x3f47: 0x0001, 0x3f48: 0x0001, 0x3f49: 0x0010, 0x3f4a: 0x0010, 0x3f4b: 0x0010, + 0x3f4c: 0x0010, 0x3f4d: 0x0010, 0x3f4e: 0x0010, 0x3f4f: 0x0010, 0x3f50: 0x0001, 0x3f51: 0x0001, + 0x3f52: 0x0001, 0x3f53: 0x0001, 0x3f54: 0x0001, 0x3f55: 0x0001, 0x3f56: 0x0001, 0x3f57: 0x0001, + 0x3f58: 0x0001, 0x3f59: 0x0001, 0x3f5a: 0x0010, 0x3f5b: 0x0010, 0x3f5c: 0x0060, 0x3f5d: 0x0001, + 0x3f5e: 0x0001, 0x3f5f: 0x0060, 0x3f60: 0x0008, 0x3f61: 0x0008, 0x3f62: 0x0008, 0x3f63: 0x0008, + 0x3f64: 0x0010, 0x3f65: 0x0010, 0x3f66: 0x0010, 0x3f67: 0x0010, 0x3f68: 0x0010, 0x3f69: 0x0010, + 0x3f6a: 0x0010, 0x3f6b: 0x0010, 0x3f6c: 0x0010, 0x3f6d: 0x0010, 0x3f6e: 0x0010, 0x3f6f: 0x0010, + 0x3f70: 0x0010, 0x3f71: 0x0010, 0x3f72: 0x0010, 0x3f73: 0x0010, 0x3f74: 0x0010, 0x3f75: 0x0010, + 0x3f76: 0x0010, 0x3f77: 0x0010, 0x3f78: 0x0010, 0x3f79: 0x0010, 0x3f7a: 0x0010, 0x3f7b: 0x0010, + 0x3f7c: 0x0010, 0x3f7d: 0x0010, 0x3f7e: 0x0010, 0x3f7f: 0x0010, + // Block 0xfe, offset 0x3f80 + 0x3f80: 0x0060, 0x3f81: 0x0060, 0x3f82: 0x0060, 0x3f83: 0x0060, 0x3f84: 0x0060, 0x3f85: 0x0060, + 0x3f86: 0x0060, 0x3f87: 0x0060, 0x3f88: 0x0060, 0x3f89: 0x0060, 0x3f8a: 0x0060, 0x3f8b: 0x0060, + 0x3f8c: 0x0060, 0x3f8d: 0x0060, 0x3f8e: 0x0060, 0x3f8f: 0x0060, 0x3f90: 0x0060, 0x3f91: 0x0060, + 0x3f92: 0x0060, 0x3f93: 0x0060, 0x3f94: 0x0060, 0x3f95: 0x0060, 0x3f96: 0x0060, 0x3f97: 0x0060, + 0x3f98: 0x0060, 0x3f99: 0x0060, 0x3f9a: 0x0060, 0x3f9b: 0x0060, 0x3f9c: 0x0060, 0x3f9d: 0x0060, + 0x3f9e: 0x0060, 0x3f9f: 0x0060, 0x3fa0: 0x0060, 0x3fa1: 0x0060, 0x3fa2: 0x0060, 0x3fa3: 0x0060, + 0x3fa4: 0x0060, 0x3fa5: 0x0060, 0x3fa6: 0x0060, 0x3fa7: 0x0060, 0x3fa8: 0x0060, 0x3fa9: 0x0060, + 0x3faa: 0x0060, 0x3fab: 0x0060, 0x3fac: 0x0060, 0x3fad: 0x0060, 0x3fae: 0x0060, 0x3faf: 0x0060, + 0x3fb0: 0x0060, 0x3fb1: 0x0060, 0x3fb2: 0x0060, 0x3fb3: 0x0060, 0x3fb4: 0x0060, 0x3fb5: 0x0060, + 0x3fb6: 0x0010, 0x3fb7: 0x0010, 0x3fb8: 0x0010, 0x3fb9: 0x0010, 0x3fba: 0x0010, 0x3fbb: 0x0010, + 0x3fbc: 0x0010, 0x3fbd: 0x0010, 0x3fbe: 0x0010, 0x3fbf: 0x0010, + // Block 0xff, offset 0x3fc0 + 0x3fc0: 0x0060, 0x3fc1: 0x0060, 0x3fc2: 0x0060, 0x3fc3: 0x0060, 0x3fc4: 0x0060, 0x3fc5: 0x0060, + 0x3fc6: 0x0060, 0x3fc7: 0x0060, 0x3fc8: 0x0060, 0x3fc9: 0x0060, 0x3fca: 0x0060, 0x3fcb: 0x0060, + 0x3fcc: 0x0060, 0x3fcd: 0x0060, 0x3fce: 0x0060, 0x3fcf: 0x0060, 0x3fd0: 0x0060, 0x3fd1: 0x0060, + 0x3fd2: 0x0060, 0x3fd3: 0x0060, 0x3fd4: 0x0060, 0x3fd5: 0x0060, 0x3fd6: 0x0060, 0x3fd7: 0x0060, + 0x3fd8: 0x0060, 0x3fd9: 0x0060, 0x3fda: 0x0060, 0x3fdb: 0x0060, 0x3fdc: 0x0060, 0x3fdd: 0x0060, + 0x3fde: 0x0060, 0x3fdf: 0x0060, 0x3fe0: 0x0060, 0x3fe1: 0x0060, 0x3fe2: 0x0060, 0x3fe3: 0x0060, + 0x3fe4: 0x0060, 0x3fe5: 0x0060, 0x3fe6: 0x0060, 0x3fe7: 0x0010, 0x3fe8: 0x0010, 0x3fe9: 0x0060, + 0x3fea: 0x0060, 0x3feb: 0x0060, 0x3fec: 0x0060, 0x3fed: 0x0060, 0x3fee: 0x0060, 0x3fef: 0x0060, + 0x3ff0: 0x0060, 0x3ff1: 0x0060, 0x3ff2: 0x0060, 0x3ff3: 0x0060, 0x3ff4: 0x0060, 0x3ff5: 0x0060, + 0x3ff6: 0x0060, 0x3ff7: 0x0060, 0x3ff8: 0x0060, 0x3ff9: 0x0060, 0x3ffa: 0x0060, 0x3ffb: 0x0060, + 0x3ffc: 0x0060, 0x3ffd: 0x0060, 0x3ffe: 0x0060, 0x3fff: 0x0060, + // Block 0x100, offset 0x4000 + 0x4000: 0x0060, 0x4001: 0x0060, 0x4002: 0x0060, 0x4003: 0x0060, 0x4004: 0x0060, 0x4005: 0x0060, + 0x4006: 0x0060, 0x4007: 0x0060, 0x4008: 0x0060, 0x4009: 0x0060, 0x400a: 0x0060, 0x400b: 0x0060, + 0x400c: 0x0060, 0x400d: 0x0060, 0x400e: 0x0060, 0x400f: 0x0060, 0x4010: 0x0060, 0x4011: 0x0060, + 0x4012: 0x0060, 0x4013: 0x0060, 0x4014: 0x0060, 0x4015: 0x0060, 0x4016: 0x0060, 0x4017: 0x0060, + 0x4018: 0x0060, 0x4019: 0x0060, 0x401a: 0x0060, 0x401b: 0x0060, 0x401c: 0x0060, 0x401d: 0x0060, + 0x401e: 0x0060, 0x401f: 0x0060, 0x4020: 0x0060, 0x4021: 0x0060, 0x4022: 0x0060, 0x4023: 0x0060, + 0x4024: 0x0060, 0x4025: 0x0001, 0x4026: 0x0001, 0x4027: 0x0001, 0x4028: 0x0001, 0x4029: 0x0001, + 0x402a: 0x0060, 0x402b: 0x0060, 0x402c: 0x0060, 0x402d: 0x0001, 0x402e: 0x0001, 0x402f: 0x0001, + 0x4030: 0x0001, 0x4031: 0x0001, 0x4032: 0x0001, 0x4033: 0x0008, 0x4034: 0x0008, 0x4035: 0x0008, + 0x4036: 0x0008, 0x4037: 0x0008, 0x4038: 0x0008, 0x4039: 0x0008, 0x403a: 0x0008, 0x403b: 0x0001, + 0x403c: 0x0001, 0x403d: 0x0001, 0x403e: 0x0001, 0x403f: 0x0001, + // Block 0x101, offset 0x4040 + 0x4040: 0x0001, 0x4041: 0x0001, 0x4042: 0x0001, 0x4043: 0x0060, 0x4044: 0x0060, 0x4045: 0x0001, + 0x4046: 0x0001, 0x4047: 0x0001, 0x4048: 0x0001, 0x4049: 0x0001, 0x404a: 0x0001, 0x404b: 0x0001, + 0x404c: 0x0060, 0x404d: 0x0060, 0x404e: 0x0060, 0x404f: 0x0060, 0x4050: 0x0060, 0x4051: 0x0060, + 0x4052: 0x0060, 0x4053: 0x0060, 0x4054: 0x0060, 0x4055: 0x0060, 0x4056: 0x0060, 0x4057: 0x0060, + 0x4058: 0x0060, 0x4059: 0x0060, 0x405a: 0x0060, 0x405b: 0x0060, 0x405c: 0x0060, 0x405d: 0x0060, + 0x405e: 0x0060, 0x405f: 0x0060, 0x4060: 0x0060, 0x4061: 0x0060, 0x4062: 0x0060, 0x4063: 0x0060, + 0x4064: 0x0060, 0x4065: 0x0060, 0x4066: 0x0060, 0x4067: 0x0060, 0x4068: 0x0060, 0x4069: 0x0060, + 0x406a: 0x0001, 0x406b: 0x0001, 0x406c: 0x0001, 0x406d: 0x0001, 0x406e: 0x0060, 0x406f: 0x0060, + 0x4070: 0x0060, 0x4071: 0x0060, 0x4072: 0x0060, 0x4073: 0x0060, 0x4074: 0x0060, 0x4075: 0x0060, + 0x4076: 0x0060, 0x4077: 0x0060, 0x4078: 0x0060, 0x4079: 0x0060, 0x407a: 0x0060, 0x407b: 0x0060, + 0x407c: 0x0060, 0x407d: 0x0060, 0x407e: 0x0060, 0x407f: 0x0060, + // Block 0x102, offset 0x4080 + 0x4080: 0x0060, 0x4081: 0x0060, 0x4082: 0x0060, 0x4083: 0x0060, 0x4084: 0x0060, 0x4085: 0x0060, + 0x4086: 0x0060, 0x4087: 0x0060, 0x4088: 0x0060, 0x4089: 0x0060, 0x408a: 0x0060, 0x408b: 0x0060, + 0x408c: 0x0060, 0x408d: 0x0060, 0x408e: 0x0060, 0x408f: 0x0060, 0x4090: 0x0060, 0x4091: 0x0060, + 0x4092: 0x0060, 0x4093: 0x0060, 0x4094: 0x0060, 0x4095: 0x0060, 0x4096: 0x0060, 0x4097: 0x0060, + 0x4098: 0x0060, 0x4099: 0x0060, 0x409a: 0x0060, 0x409b: 0x0060, 0x409c: 0x0060, 0x409d: 0x0060, + 0x409e: 0x0060, 0x409f: 0x0060, 0x40a0: 0x0060, 0x40a1: 0x0060, 0x40a2: 0x0060, 0x40a3: 0x0060, + 0x40a4: 0x0060, 0x40a5: 0x0060, 0x40a6: 0x0060, 0x40a7: 0x0060, 0x40a8: 0x0060, 0x40a9: 0x0010, + 0x40aa: 0x0010, 0x40ab: 0x0010, 0x40ac: 0x0010, 0x40ad: 0x0010, 0x40ae: 0x0010, 0x40af: 0x0010, + 0x40b0: 0x0010, 0x40b1: 0x0010, 0x40b2: 0x0010, 0x40b3: 0x0010, 0x40b4: 0x0010, 0x40b5: 0x0010, + 0x40b6: 0x0010, 0x40b7: 0x0010, 0x40b8: 0x0010, 0x40b9: 0x0010, 0x40ba: 0x0010, 0x40bb: 0x0010, + 0x40bc: 0x0010, 0x40bd: 0x0010, 0x40be: 0x0010, 0x40bf: 0x0010, + // Block 0x103, offset 0x40c0 + 0x40c0: 0x0060, 0x40c1: 0x0060, 0x40c2: 0x0001, 0x40c3: 0x0001, 0x40c4: 0x0001, 0x40c5: 0x0060, + 0x40c6: 0x0010, 0x40c7: 0x0010, 0x40c8: 0x0010, 0x40c9: 0x0010, 0x40ca: 0x0010, 0x40cb: 0x0010, + 0x40cc: 0x0010, 0x40cd: 0x0010, 0x40ce: 0x0010, 0x40cf: 0x0010, 0x40d0: 0x0010, 0x40d1: 0x0010, + 0x40d2: 0x0010, 0x40d3: 0x0010, 0x40d4: 0x0010, 0x40d5: 0x0010, 0x40d6: 0x0010, 0x40d7: 0x0010, + 0x40d8: 0x0010, 0x40d9: 0x0010, 0x40da: 0x0010, 0x40db: 0x0010, 0x40dc: 0x0010, 0x40dd: 0x0010, + 0x40de: 0x0010, 0x40df: 0x0010, 0x40e0: 0x0010, 0x40e1: 0x0010, 0x40e2: 0x0010, 0x40e3: 0x0010, + 0x40e4: 0x0010, 0x40e5: 0x0010, 0x40e6: 0x0010, 0x40e7: 0x0010, 0x40e8: 0x0010, 0x40e9: 0x0010, + 0x40ea: 0x0010, 0x40eb: 0x0010, 0x40ec: 0x0010, 0x40ed: 0x0010, 0x40ee: 0x0010, 0x40ef: 0x0010, + 0x40f0: 0x0010, 0x40f1: 0x0010, 0x40f2: 0x0010, 0x40f3: 0x0010, 0x40f4: 0x0010, 0x40f5: 0x0010, + 0x40f6: 0x0010, 0x40f7: 0x0010, 0x40f8: 0x0010, 0x40f9: 0x0010, 0x40fa: 0x0010, 0x40fb: 0x0010, + 0x40fc: 0x0010, 0x40fd: 0x0010, 0x40fe: 0x0010, 0x40ff: 0x0010, + // Block 0x104, offset 0x4100 + 0x4100: 0x0060, 0x4101: 0x0060, 0x4102: 0x0060, 0x4103: 0x0060, 0x4104: 0x0060, 0x4105: 0x0060, + 0x4106: 0x0060, 0x4107: 0x0060, 0x4108: 0x0060, 0x4109: 0x0060, 0x410a: 0x0060, 0x410b: 0x0060, + 0x410c: 0x0060, 0x410d: 0x0060, 0x410e: 0x0060, 0x410f: 0x0060, 0x4110: 0x0060, 0x4111: 0x0060, + 0x4112: 0x0060, 0x4113: 0x0060, 0x4114: 0x0060, 0x4115: 0x0060, 0x4116: 0x0060, 0x4117: 0x0010, + 0x4118: 0x0010, 0x4119: 0x0010, 0x411a: 0x0010, 0x411b: 0x0010, 0x411c: 0x0010, 0x411d: 0x0010, + 0x411e: 0x0010, 0x411f: 0x0010, 0x4120: 0x0060, 0x4121: 0x0060, 0x4122: 0x0060, 0x4123: 0x0060, + 0x4124: 0x0060, 0x4125: 0x0060, 0x4126: 0x0060, 0x4127: 0x0060, 0x4128: 0x0060, 0x4129: 0x0060, + 0x412a: 0x0060, 0x412b: 0x0060, 0x412c: 0x0060, 0x412d: 0x0060, 0x412e: 0x0060, 0x412f: 0x0060, + 0x4130: 0x0060, 0x4131: 0x0060, 0x4132: 0x0010, 0x4133: 0x0010, 0x4134: 0x0010, 0x4135: 0x0010, + 0x4136: 0x0010, 0x4137: 0x0010, 0x4138: 0x0010, 0x4139: 0x0010, 0x413a: 0x0010, 0x413b: 0x0010, + 0x413c: 0x0010, 0x413d: 0x0010, 0x413e: 0x0010, 0x413f: 0x0010, + // Block 0x105, offset 0x4140 + 0x4140: 0x0060, 0x4141: 0x0060, 0x4142: 0x0060, 0x4143: 0x0060, 0x4144: 0x0060, 0x4145: 0x0060, + 0x4146: 0x0060, 0x4147: 0x0060, 0x4148: 0x0060, 0x4149: 0x0060, 0x414a: 0x0060, 0x414b: 0x0060, + 0x414c: 0x0060, 0x414d: 0x0060, 0x414e: 0x0060, 0x414f: 0x0060, 0x4150: 0x0060, 0x4151: 0x0060, + 0x4152: 0x0060, 0x4153: 0x0060, 0x4154: 0x0060, 0x4155: 0x0010, 0x4156: 0x0060, 0x4157: 0x0060, + 0x4158: 0x0060, 0x4159: 0x0060, 0x415a: 0x0060, 0x415b: 0x0060, 0x415c: 0x0060, 0x415d: 0x0060, + 0x415e: 0x0060, 0x415f: 0x0060, 0x4160: 0x0060, 0x4161: 0x0060, 0x4162: 0x0060, 0x4163: 0x0060, + 0x4164: 0x0060, 0x4165: 0x0060, 0x4166: 0x0060, 0x4167: 0x0060, 0x4168: 0x0060, 0x4169: 0x0060, + 0x416a: 0x0060, 0x416b: 0x0060, 0x416c: 0x0060, 0x416d: 0x0060, 0x416e: 0x0060, 0x416f: 0x0060, + 0x4170: 0x0060, 0x4171: 0x0060, 0x4172: 0x0060, 0x4173: 0x0060, 0x4174: 0x0060, 0x4175: 0x0060, + 0x4176: 0x0060, 0x4177: 0x0060, 0x4178: 0x0060, 0x4179: 0x0060, 0x417a: 0x0060, 0x417b: 0x0060, + 0x417c: 0x0060, 0x417d: 0x0060, 0x417e: 0x0060, 0x417f: 0x0060, + // Block 0x106, offset 0x4180 + 0x4180: 0x0060, 0x4181: 0x0060, 0x4182: 0x0060, 0x4183: 0x0060, 0x4184: 0x0060, 0x4185: 0x0060, + 0x4186: 0x0060, 0x4187: 0x0060, 0x4188: 0x0060, 0x4189: 0x0060, 0x418a: 0x0060, 0x418b: 0x0060, + 0x418c: 0x0060, 0x418d: 0x0060, 0x418e: 0x0060, 0x418f: 0x0060, 0x4190: 0x0060, 0x4191: 0x0060, + 0x4192: 0x0060, 0x4193: 0x0060, 0x4194: 0x0060, 0x4195: 0x0060, 0x4196: 0x0060, 0x4197: 0x0060, + 0x4198: 0x0060, 0x4199: 0x0060, 0x419a: 0x0060, 0x419b: 0x0060, 0x419c: 0x0060, 0x419d: 0x0010, + 0x419e: 0x0060, 0x419f: 0x0060, 0x41a0: 0x0010, 0x41a1: 0x0010, 0x41a2: 0x0060, 0x41a3: 0x0010, + 0x41a4: 0x0010, 0x41a5: 0x0060, 0x41a6: 0x0060, 0x41a7: 0x0010, 0x41a8: 0x0010, 0x41a9: 0x0060, + 0x41aa: 0x0060, 0x41ab: 0x0060, 0x41ac: 0x0060, 0x41ad: 0x0010, 0x41ae: 0x0060, 0x41af: 0x0060, + 0x41b0: 0x0060, 0x41b1: 0x0060, 0x41b2: 0x0060, 0x41b3: 0x0060, 0x41b4: 0x0060, 0x41b5: 0x0060, + 0x41b6: 0x0060, 0x41b7: 0x0060, 0x41b8: 0x0060, 0x41b9: 0x0060, 0x41ba: 0x0010, 0x41bb: 0x0060, + 0x41bc: 0x0010, 0x41bd: 0x0060, 0x41be: 0x0060, 0x41bf: 0x0060, + // Block 0x107, offset 0x41c0 + 0x41c0: 0x0060, 0x41c1: 0x0060, 0x41c2: 0x0060, 0x41c3: 0x0060, 0x41c4: 0x0010, 0x41c5: 0x0060, + 0x41c6: 0x0060, 0x41c7: 0x0060, 0x41c8: 0x0060, 0x41c9: 0x0060, 0x41ca: 0x0060, 0x41cb: 0x0060, + 0x41cc: 0x0060, 0x41cd: 0x0060, 0x41ce: 0x0060, 0x41cf: 0x0060, 0x41d0: 0x0060, 0x41d1: 0x0060, + 0x41d2: 0x0060, 0x41d3: 0x0060, 0x41d4: 0x0060, 0x41d5: 0x0060, 0x41d6: 0x0060, 0x41d7: 0x0060, + 0x41d8: 0x0060, 0x41d9: 0x0060, 0x41da: 0x0060, 0x41db: 0x0060, 0x41dc: 0x0060, 0x41dd: 0x0060, + 0x41de: 0x0060, 0x41df: 0x0060, 0x41e0: 0x0060, 0x41e1: 0x0060, 0x41e2: 0x0060, 0x41e3: 0x0060, + 0x41e4: 0x0060, 0x41e5: 0x0060, 0x41e6: 0x0060, 0x41e7: 0x0060, 0x41e8: 0x0060, 0x41e9: 0x0060, + 0x41ea: 0x0060, 0x41eb: 0x0060, 0x41ec: 0x0060, 0x41ed: 0x0060, 0x41ee: 0x0060, 0x41ef: 0x0060, + 0x41f0: 0x0060, 0x41f1: 0x0060, 0x41f2: 0x0060, 0x41f3: 0x0060, 0x41f4: 0x0060, 0x41f5: 0x0060, + 0x41f6: 0x0060, 0x41f7: 0x0060, 0x41f8: 0x0060, 0x41f9: 0x0060, 0x41fa: 0x0060, 0x41fb: 0x0060, + 0x41fc: 0x0060, 0x41fd: 0x0060, 0x41fe: 0x0060, 0x41ff: 0x0060, + // Block 0x108, offset 0x4200 + 0x4200: 0x0060, 0x4201: 0x0060, 0x4202: 0x0060, 0x4203: 0x0060, 0x4204: 0x0060, 0x4205: 0x0060, + 0x4206: 0x0010, 0x4207: 0x0060, 0x4208: 0x0060, 0x4209: 0x0060, 0x420a: 0x0060, 0x420b: 0x0010, + 0x420c: 0x0010, 0x420d: 0x0060, 0x420e: 0x0060, 0x420f: 0x0060, 0x4210: 0x0060, 0x4211: 0x0060, + 0x4212: 0x0060, 0x4213: 0x0060, 0x4214: 0x0060, 0x4215: 0x0010, 0x4216: 0x0060, 0x4217: 0x0060, + 0x4218: 0x0060, 0x4219: 0x0060, 0x421a: 0x0060, 0x421b: 0x0060, 0x421c: 0x0060, 0x421d: 0x0010, + 0x421e: 0x0060, 0x421f: 0x0060, 0x4220: 0x0060, 0x4221: 0x0060, 0x4222: 0x0060, 0x4223: 0x0060, + 0x4224: 0x0060, 0x4225: 0x0060, 0x4226: 0x0060, 0x4227: 0x0060, 0x4228: 0x0060, 0x4229: 0x0060, + 0x422a: 0x0060, 0x422b: 0x0060, 0x422c: 0x0060, 0x422d: 0x0060, 0x422e: 0x0060, 0x422f: 0x0060, + 0x4230: 0x0060, 0x4231: 0x0060, 0x4232: 0x0060, 0x4233: 0x0060, 0x4234: 0x0060, 0x4235: 0x0060, + 0x4236: 0x0060, 0x4237: 0x0060, 0x4238: 0x0060, 0x4239: 0x0060, 0x423a: 0x0010, 0x423b: 0x0060, + 0x423c: 0x0060, 0x423d: 0x0060, 0x423e: 0x0060, 0x423f: 0x0010, + // Block 0x109, offset 0x4240 + 0x4240: 0x0060, 0x4241: 0x0060, 0x4242: 0x0060, 0x4243: 0x0060, 0x4244: 0x0060, 0x4245: 0x0010, + 0x4246: 0x0060, 0x4247: 0x0010, 0x4248: 0x0010, 0x4249: 0x0010, 0x424a: 0x0060, 0x424b: 0x0060, + 0x424c: 0x0060, 0x424d: 0x0060, 0x424e: 0x0060, 0x424f: 0x0060, 0x4250: 0x0060, 0x4251: 0x0010, + 0x4252: 0x0060, 0x4253: 0x0060, 0x4254: 0x0060, 0x4255: 0x0060, 0x4256: 0x0060, 0x4257: 0x0060, + 0x4258: 0x0060, 0x4259: 0x0060, 0x425a: 0x0060, 0x425b: 0x0060, 0x425c: 0x0060, 0x425d: 0x0060, + 0x425e: 0x0060, 0x425f: 0x0060, 0x4260: 0x0060, 0x4261: 0x0060, 0x4262: 0x0060, 0x4263: 0x0060, + 0x4264: 0x0060, 0x4265: 0x0060, 0x4266: 0x0060, 0x4267: 0x0060, 0x4268: 0x0060, 0x4269: 0x0060, + 0x426a: 0x0060, 0x426b: 0x0060, 0x426c: 0x0060, 0x426d: 0x0060, 0x426e: 0x0060, 0x426f: 0x0060, + 0x4270: 0x0060, 0x4271: 0x0060, 0x4272: 0x0060, 0x4273: 0x0060, 0x4274: 0x0060, 0x4275: 0x0060, + 0x4276: 0x0060, 0x4277: 0x0060, 0x4278: 0x0060, 0x4279: 0x0060, 0x427a: 0x0060, 0x427b: 0x0060, + 0x427c: 0x0060, 0x427d: 0x0060, 0x427e: 0x0060, 0x427f: 0x0060, + // Block 0x10a, offset 0x4280 + 0x4280: 0x0060, 0x4281: 0x0060, 0x4282: 0x0060, 0x4283: 0x0060, 0x4284: 0x0060, 0x4285: 0x0060, + 0x4286: 0x0060, 0x4287: 0x0060, 0x4288: 0x0060, 0x4289: 0x0060, 0x428a: 0x0060, 0x428b: 0x0060, + 0x428c: 0x0060, 0x428d: 0x0060, 0x428e: 0x0060, 0x428f: 0x0060, 0x4290: 0x0060, 0x4291: 0x0060, + 0x4292: 0x0060, 0x4293: 0x0060, 0x4294: 0x0060, 0x4295: 0x0060, 0x4296: 0x0060, 0x4297: 0x0060, + 0x4298: 0x0060, 0x4299: 0x0060, 0x429a: 0x0060, 0x429b: 0x0060, 0x429c: 0x0060, 0x429d: 0x0060, + 0x429e: 0x0060, 0x429f: 0x0060, 0x42a0: 0x0060, 0x42a1: 0x0060, 0x42a2: 0x0060, 0x42a3: 0x0060, + 0x42a4: 0x0060, 0x42a5: 0x0060, 0x42a6: 0x0010, 0x42a7: 0x0010, 0x42a8: 0x0060, 0x42a9: 0x0060, + 0x42aa: 0x0060, 0x42ab: 0x0060, 0x42ac: 0x0060, 0x42ad: 0x0060, 0x42ae: 0x0060, 0x42af: 0x0060, + 0x42b0: 0x0060, 0x42b1: 0x0060, 0x42b2: 0x0060, 0x42b3: 0x0060, 0x42b4: 0x0060, 0x42b5: 0x0060, + 0x42b6: 0x0060, 0x42b7: 0x0060, 0x42b8: 0x0060, 0x42b9: 0x0060, 0x42ba: 0x0060, 0x42bb: 0x0060, + 0x42bc: 0x0060, 0x42bd: 0x0060, 0x42be: 0x0060, 0x42bf: 0x0060, + // Block 0x10b, offset 0x42c0 + 0x42c0: 0x0060, 0x42c1: 0x0060, 0x42c2: 0x0060, 0x42c3: 0x0060, 0x42c4: 0x0060, 0x42c5: 0x0060, + 0x42c6: 0x0060, 0x42c7: 0x0060, 0x42c8: 0x0060, 0x42c9: 0x0060, 0x42ca: 0x0060, 0x42cb: 0x0060, + 0x42cc: 0x0010, 0x42cd: 0x0010, 0x42ce: 0x0060, 0x42cf: 0x0060, 0x42d0: 0x0060, 0x42d1: 0x0060, + 0x42d2: 0x0060, 0x42d3: 0x0060, 0x42d4: 0x0060, 0x42d5: 0x0060, 0x42d6: 0x0060, 0x42d7: 0x0060, + 0x42d8: 0x0060, 0x42d9: 0x0060, 0x42da: 0x0060, 0x42db: 0x0060, 0x42dc: 0x0060, 0x42dd: 0x0060, + 0x42de: 0x0060, 0x42df: 0x0060, 0x42e0: 0x0060, 0x42e1: 0x0060, 0x42e2: 0x0060, 0x42e3: 0x0060, + 0x42e4: 0x0060, 0x42e5: 0x0060, 0x42e6: 0x0060, 0x42e7: 0x0060, 0x42e8: 0x0060, 0x42e9: 0x0060, + 0x42ea: 0x0060, 0x42eb: 0x0060, 0x42ec: 0x0060, 0x42ed: 0x0060, 0x42ee: 0x0060, 0x42ef: 0x0060, + 0x42f0: 0x0060, 0x42f1: 0x0060, 0x42f2: 0x0060, 0x42f3: 0x0060, 0x42f4: 0x0060, 0x42f5: 0x0060, + 0x42f6: 0x0060, 0x42f7: 0x0060, 0x42f8: 0x0060, 0x42f9: 0x0060, 0x42fa: 0x0060, 0x42fb: 0x0060, + 0x42fc: 0x0060, 0x42fd: 0x0060, 0x42fe: 0x0060, 0x42ff: 0x0060, + // Block 0x10c, offset 0x4300 + 0x4300: 0x0001, 0x4301: 0x0001, 0x4302: 0x0001, 0x4303: 0x0001, 0x4304: 0x0001, 0x4305: 0x0001, + 0x4306: 0x0001, 0x4307: 0x0001, 0x4308: 0x0001, 0x4309: 0x0001, 0x430a: 0x0001, 0x430b: 0x0001, + 0x430c: 0x0001, 0x430d: 0x0001, 0x430e: 0x0001, 0x430f: 0x0001, 0x4310: 0x0001, 0x4311: 0x0001, + 0x4312: 0x0001, 0x4313: 0x0001, 0x4314: 0x0001, 0x4315: 0x0001, 0x4316: 0x0001, 0x4317: 0x0001, + 0x4318: 0x0001, 0x4319: 0x0001, 0x431a: 0x0001, 0x431b: 0x0001, 0x431c: 0x0001, 0x431d: 0x0001, + 0x431e: 0x0001, 0x431f: 0x0001, 0x4320: 0x0001, 0x4321: 0x0001, 0x4322: 0x0001, 0x4323: 0x0001, + 0x4324: 0x0001, 0x4325: 0x0001, 0x4326: 0x0001, 0x4327: 0x0001, 0x4328: 0x0001, 0x4329: 0x0001, + 0x432a: 0x0001, 0x432b: 0x0001, 0x432c: 0x0001, 0x432d: 0x0001, 0x432e: 0x0001, 0x432f: 0x0001, + 0x4330: 0x0001, 0x4331: 0x0001, 0x4332: 0x0001, 0x4333: 0x0001, 0x4334: 0x0001, 0x4335: 0x0001, + 0x4336: 0x0001, 0x4337: 0x0060, 0x4338: 0x0060, 0x4339: 0x0060, 0x433a: 0x0060, 0x433b: 0x0001, + 0x433c: 0x0001, 0x433d: 0x0001, 0x433e: 0x0001, 0x433f: 0x0001, + // Block 0x10d, offset 0x4340 + 0x4340: 0x0001, 0x4341: 0x0001, 0x4342: 0x0001, 0x4343: 0x0001, 0x4344: 0x0001, 0x4345: 0x0001, + 0x4346: 0x0001, 0x4347: 0x0001, 0x4348: 0x0001, 0x4349: 0x0001, 0x434a: 0x0001, 0x434b: 0x0001, + 0x434c: 0x0001, 0x434d: 0x0001, 0x434e: 0x0001, 0x434f: 0x0001, 0x4350: 0x0001, 0x4351: 0x0001, + 0x4352: 0x0001, 0x4353: 0x0001, 0x4354: 0x0001, 0x4355: 0x0001, 0x4356: 0x0001, 0x4357: 0x0001, + 0x4358: 0x0001, 0x4359: 0x0001, 0x435a: 0x0001, 0x435b: 0x0001, 0x435c: 0x0001, 0x435d: 0x0001, + 0x435e: 0x0001, 0x435f: 0x0001, 0x4360: 0x0001, 0x4361: 0x0001, 0x4362: 0x0001, 0x4363: 0x0001, + 0x4364: 0x0001, 0x4365: 0x0001, 0x4366: 0x0001, 0x4367: 0x0001, 0x4368: 0x0001, 0x4369: 0x0001, + 0x436a: 0x0001, 0x436b: 0x0001, 0x436c: 0x0001, 0x436d: 0x0060, 0x436e: 0x0060, 0x436f: 0x0060, + 0x4370: 0x0060, 0x4371: 0x0060, 0x4372: 0x0060, 0x4373: 0x0060, 0x4374: 0x0060, 0x4375: 0x0001, + 0x4376: 0x0060, 0x4377: 0x0060, 0x4378: 0x0060, 0x4379: 0x0060, 0x437a: 0x0060, 0x437b: 0x0060, + 0x437c: 0x0060, 0x437d: 0x0060, 0x437e: 0x0060, 0x437f: 0x0060, + // Block 0x10e, offset 0x4380 + 0x4380: 0x0060, 0x4381: 0x0060, 0x4382: 0x0060, 0x4383: 0x0060, 0x4384: 0x0001, 0x4385: 0x0060, + 0x4386: 0x0060, 0x4387: 0x0060, 0x4388: 0x0060, 0x4389: 0x0060, 0x438a: 0x0060, 0x438b: 0x0060, + 0x438c: 0x0010, 0x438d: 0x0010, 0x438e: 0x0010, 0x438f: 0x0010, 0x4390: 0x0010, 0x4391: 0x0010, + 0x4392: 0x0010, 0x4393: 0x0010, 0x4394: 0x0010, 0x4395: 0x0010, 0x4396: 0x0010, 0x4397: 0x0010, + 0x4398: 0x0010, 0x4399: 0x0010, 0x439a: 0x0010, 0x439b: 0x0001, 0x439c: 0x0001, 0x439d: 0x0001, + 0x439e: 0x0001, 0x439f: 0x0001, 0x43a0: 0x0010, 0x43a1: 0x0001, 0x43a2: 0x0001, 0x43a3: 0x0001, + 0x43a4: 0x0001, 0x43a5: 0x0001, 0x43a6: 0x0001, 0x43a7: 0x0001, 0x43a8: 0x0001, 0x43a9: 0x0001, + 0x43aa: 0x0001, 0x43ab: 0x0001, 0x43ac: 0x0001, 0x43ad: 0x0001, 0x43ae: 0x0001, 0x43af: 0x0001, + 0x43b0: 0x0010, 0x43b1: 0x0010, 0x43b2: 0x0010, 0x43b3: 0x0010, 0x43b4: 0x0010, 0x43b5: 0x0010, + 0x43b6: 0x0010, 0x43b7: 0x0010, 0x43b8: 0x0010, 0x43b9: 0x0010, 0x43ba: 0x0010, 0x43bb: 0x0010, + 0x43bc: 0x0010, 0x43bd: 0x0010, 0x43be: 0x0010, 0x43bf: 0x0010, + // Block 0x10f, offset 0x43c0 + 0x43c0: 0x0001, 0x43c1: 0x0001, 0x43c2: 0x0001, 0x43c3: 0x0001, 0x43c4: 0x0001, 0x43c5: 0x0010, + 0x43c6: 0x0010, 0x43c7: 0x0060, 0x43c8: 0x0060, 0x43c9: 0x0060, 0x43ca: 0x0060, 0x43cb: 0x0060, + 0x43cc: 0x0060, 0x43cd: 0x0060, 0x43ce: 0x0060, 0x43cf: 0x0060, 0x43d0: 0x0001, 0x43d1: 0x0001, + 0x43d2: 0x0001, 0x43d3: 0x0001, 0x43d4: 0x0001, 0x43d5: 0x0001, 0x43d6: 0x0001, 0x43d7: 0x0010, + 0x43d8: 0x0010, 0x43d9: 0x0010, 0x43da: 0x0010, 0x43db: 0x0010, 0x43dc: 0x0010, 0x43dd: 0x0010, + 0x43de: 0x0010, 0x43df: 0x0010, 0x43e0: 0x0010, 0x43e1: 0x0010, 0x43e2: 0x0010, 0x43e3: 0x0010, + 0x43e4: 0x0010, 0x43e5: 0x0010, 0x43e6: 0x0010, 0x43e7: 0x0010, 0x43e8: 0x0010, 0x43e9: 0x0010, + 0x43ea: 0x0010, 0x43eb: 0x0010, 0x43ec: 0x0010, 0x43ed: 0x0010, 0x43ee: 0x0010, 0x43ef: 0x0010, + 0x43f0: 0x0010, 0x43f1: 0x0010, 0x43f2: 0x0010, 0x43f3: 0x0010, 0x43f4: 0x0010, 0x43f5: 0x0010, + 0x43f6: 0x0010, 0x43f7: 0x0010, 0x43f8: 0x0010, 0x43f9: 0x0010, 0x43fa: 0x0010, 0x43fb: 0x0010, + 0x43fc: 0x0010, 0x43fd: 0x0010, 0x43fe: 0x0010, 0x43ff: 0x0010, + // Block 0x110, offset 0x4400 + 0x4400: 0x0060, 0x4401: 0x0060, 0x4402: 0x0060, 0x4403: 0x0060, 0x4404: 0x0010, 0x4405: 0x0060, + 0x4406: 0x0060, 0x4407: 0x0060, 0x4408: 0x0060, 0x4409: 0x0060, 0x440a: 0x0060, 0x440b: 0x0060, + 0x440c: 0x0060, 0x440d: 0x0060, 0x440e: 0x0060, 0x440f: 0x0060, 0x4410: 0x0060, 0x4411: 0x0060, + 0x4412: 0x0060, 0x4413: 0x0060, 0x4414: 0x0060, 0x4415: 0x0060, 0x4416: 0x0060, 0x4417: 0x0060, + 0x4418: 0x0060, 0x4419: 0x0060, 0x441a: 0x0060, 0x441b: 0x0060, 0x441c: 0x0060, 0x441d: 0x0060, + 0x441e: 0x0060, 0x441f: 0x0060, 0x4420: 0x0010, 0x4421: 0x0060, 0x4422: 0x0060, 0x4423: 0x0010, + 0x4424: 0x0060, 0x4425: 0x0010, 0x4426: 0x0010, 0x4427: 0x0060, 0x4428: 0x0010, 0x4429: 0x0060, + 0x442a: 0x0060, 0x442b: 0x0060, 0x442c: 0x0060, 0x442d: 0x0060, 0x442e: 0x0060, 0x442f: 0x0060, + 0x4430: 0x0060, 0x4431: 0x0060, 0x4432: 0x0060, 0x4433: 0x0010, 0x4434: 0x0060, 0x4435: 0x0060, + 0x4436: 0x0060, 0x4437: 0x0060, 0x4438: 0x0010, 0x4439: 0x0060, 0x443a: 0x0010, 0x443b: 0x0060, + 0x443c: 0x0010, 0x443d: 0x0010, 0x443e: 0x0010, 0x443f: 0x0010, + // Block 0x111, offset 0x4440 + 0x4440: 0x0010, 0x4441: 0x0010, 0x4442: 0x0060, 0x4443: 0x0010, 0x4444: 0x0010, 0x4445: 0x0010, + 0x4446: 0x0010, 0x4447: 0x0060, 0x4448: 0x0010, 0x4449: 0x0060, 0x444a: 0x0010, 0x444b: 0x0060, + 0x444c: 0x0010, 0x444d: 0x0060, 0x444e: 0x0060, 0x444f: 0x0060, 0x4450: 0x0010, 0x4451: 0x0060, + 0x4452: 0x0060, 0x4453: 0x0010, 0x4454: 0x0060, 0x4455: 0x0010, 0x4456: 0x0010, 0x4457: 0x0060, + 0x4458: 0x0010, 0x4459: 0x0060, 0x445a: 0x0010, 0x445b: 0x0060, 0x445c: 0x0010, 0x445d: 0x0060, + 0x445e: 0x0010, 0x445f: 0x0060, 0x4460: 0x0010, 0x4461: 0x0060, 0x4462: 0x0060, 0x4463: 0x0010, + 0x4464: 0x0060, 0x4465: 0x0010, 0x4466: 0x0010, 0x4467: 0x0060, 0x4468: 0x0060, 0x4469: 0x0060, + 0x446a: 0x0060, 0x446b: 0x0010, 0x446c: 0x0060, 0x446d: 0x0060, 0x446e: 0x0060, 0x446f: 0x0060, + 0x4470: 0x0060, 0x4471: 0x0060, 0x4472: 0x0060, 0x4473: 0x0010, 0x4474: 0x0060, 0x4475: 0x0060, + 0x4476: 0x0060, 0x4477: 0x0060, 0x4478: 0x0010, 0x4479: 0x0060, 0x447a: 0x0060, 0x447b: 0x0060, + 0x447c: 0x0060, 0x447d: 0x0010, 0x447e: 0x0060, 0x447f: 0x0010, + // Block 0x112, offset 0x4480 + 0x4480: 0x0060, 0x4481: 0x0060, 0x4482: 0x0060, 0x4483: 0x0060, 0x4484: 0x0060, 0x4485: 0x0060, + 0x4486: 0x0060, 0x4487: 0x0060, 0x4488: 0x0060, 0x4489: 0x0060, 0x448a: 0x0010, 0x448b: 0x0060, + 0x448c: 0x0060, 0x448d: 0x0060, 0x448e: 0x0060, 0x448f: 0x0060, 0x4490: 0x0060, 0x4491: 0x0060, + 0x4492: 0x0060, 0x4493: 0x0060, 0x4494: 0x0060, 0x4495: 0x0060, 0x4496: 0x0060, 0x4497: 0x0060, + 0x4498: 0x0060, 0x4499: 0x0060, 0x449a: 0x0060, 0x449b: 0x0060, 0x449c: 0x0010, 0x449d: 0x0010, + 0x449e: 0x0010, 0x449f: 0x0010, 0x44a0: 0x0010, 0x44a1: 0x0060, 0x44a2: 0x0060, 0x44a3: 0x0060, + 0x44a4: 0x0010, 0x44a5: 0x0060, 0x44a6: 0x0060, 0x44a7: 0x0060, 0x44a8: 0x0060, 0x44a9: 0x0060, + 0x44aa: 0x0010, 0x44ab: 0x0060, 0x44ac: 0x0060, 0x44ad: 0x0060, 0x44ae: 0x0060, 0x44af: 0x0060, + 0x44b0: 0x0060, 0x44b1: 0x0060, 0x44b2: 0x0060, 0x44b3: 0x0060, 0x44b4: 0x0060, 0x44b5: 0x0060, + 0x44b6: 0x0060, 0x44b7: 0x0060, 0x44b8: 0x0060, 0x44b9: 0x0060, 0x44ba: 0x0060, 0x44bb: 0x0060, + 0x44bc: 0x0010, 0x44bd: 0x0010, 0x44be: 0x0010, 0x44bf: 0x0010, + // Block 0x113, offset 0x44c0 + 0x44c0: 0x0010, 0x44c1: 0x0010, 0x44c2: 0x0010, 0x44c3: 0x0010, 0x44c4: 0x0010, 0x44c5: 0x0010, + 0x44c6: 0x0010, 0x44c7: 0x0010, 0x44c8: 0x0010, 0x44c9: 0x0010, 0x44ca: 0x0010, 0x44cb: 0x0010, + 0x44cc: 0x0010, 0x44cd: 0x0010, 0x44ce: 0x0010, 0x44cf: 0x0010, 0x44d0: 0x0010, 0x44d1: 0x0010, + 0x44d2: 0x0010, 0x44d3: 0x0010, 0x44d4: 0x0010, 0x44d5: 0x0010, 0x44d6: 0x0010, 0x44d7: 0x0010, + 0x44d8: 0x0010, 0x44d9: 0x0010, 0x44da: 0x0010, 0x44db: 0x0010, 0x44dc: 0x0010, 0x44dd: 0x0010, + 0x44de: 0x0010, 0x44df: 0x0010, 0x44e0: 0x0010, 0x44e1: 0x0010, 0x44e2: 0x0010, 0x44e3: 0x0010, + 0x44e4: 0x0010, 0x44e5: 0x0010, 0x44e6: 0x0010, 0x44e7: 0x0010, 0x44e8: 0x0010, 0x44e9: 0x0010, + 0x44ea: 0x0010, 0x44eb: 0x0010, 0x44ec: 0x0010, 0x44ed: 0x0010, 0x44ee: 0x0010, 0x44ef: 0x0010, + 0x44f0: 0x0060, 0x44f1: 0x0060, 0x44f2: 0x0010, 0x44f3: 0x0010, 0x44f4: 0x0010, 0x44f5: 0x0010, + 0x44f6: 0x0010, 0x44f7: 0x0010, 0x44f8: 0x0010, 0x44f9: 0x0010, 0x44fa: 0x0010, 0x44fb: 0x0010, + 0x44fc: 0x0010, 0x44fd: 0x0010, 0x44fe: 0x0010, 0x44ff: 0x0010, + // Block 0x114, offset 0x4500 + 0x4500: 0x0060, 0x4501: 0x0060, 0x4502: 0x0060, 0x4503: 0x0060, 0x4504: 0x0060, 0x4505: 0x0060, + 0x4506: 0x0060, 0x4507: 0x0060, 0x4508: 0x0060, 0x4509: 0x0060, 0x450a: 0x0060, 0x450b: 0x0060, + 0x450c: 0x0060, 0x450d: 0x0060, 0x450e: 0x0060, 0x450f: 0x0060, 0x4510: 0x0060, 0x4511: 0x0060, + 0x4512: 0x0060, 0x4513: 0x0060, 0x4514: 0x0060, 0x4515: 0x0060, 0x4516: 0x0060, 0x4517: 0x0060, + 0x4518: 0x0060, 0x4519: 0x0060, 0x451a: 0x0060, 0x451b: 0x0060, 0x451c: 0x0060, 0x451d: 0x0060, + 0x451e: 0x0060, 0x451f: 0x0060, 0x4520: 0x0060, 0x4521: 0x0060, 0x4522: 0x0060, 0x4523: 0x0060, + 0x4524: 0x0060, 0x4525: 0x0060, 0x4526: 0x0060, 0x4527: 0x0060, 0x4528: 0x0060, 0x4529: 0x0060, + 0x452a: 0x0060, 0x452b: 0x0060, 0x452c: 0x0010, 0x452d: 0x0010, 0x452e: 0x0010, 0x452f: 0x0010, + 0x4530: 0x0060, 0x4531: 0x0060, 0x4532: 0x0060, 0x4533: 0x0060, 0x4534: 0x0060, 0x4535: 0x0060, + 0x4536: 0x0060, 0x4537: 0x0060, 0x4538: 0x0060, 0x4539: 0x0060, 0x453a: 0x0060, 0x453b: 0x0060, + 0x453c: 0x0060, 0x453d: 0x0060, 0x453e: 0x0060, 0x453f: 0x0060, + // Block 0x115, offset 0x4540 + 0x4540: 0x0060, 0x4541: 0x0060, 0x4542: 0x0060, 0x4543: 0x0060, 0x4544: 0x0060, 0x4545: 0x0060, + 0x4546: 0x0060, 0x4547: 0x0060, 0x4548: 0x0060, 0x4549: 0x0060, 0x454a: 0x0060, 0x454b: 0x0060, + 0x454c: 0x0060, 0x454d: 0x0060, 0x454e: 0x0060, 0x454f: 0x0060, 0x4550: 0x0060, 0x4551: 0x0060, + 0x4552: 0x0060, 0x4553: 0x0060, 0x4554: 0x0010, 0x4555: 0x0010, 0x4556: 0x0010, 0x4557: 0x0010, + 0x4558: 0x0010, 0x4559: 0x0010, 0x455a: 0x0010, 0x455b: 0x0010, 0x455c: 0x0010, 0x455d: 0x0010, + 0x455e: 0x0010, 0x455f: 0x0010, 0x4560: 0x0060, 0x4561: 0x0060, 0x4562: 0x0060, 0x4563: 0x0060, + 0x4564: 0x0060, 0x4565: 0x0060, 0x4566: 0x0060, 0x4567: 0x0060, 0x4568: 0x0060, 0x4569: 0x0060, + 0x456a: 0x0060, 0x456b: 0x0060, 0x456c: 0x0060, 0x456d: 0x0060, 0x456e: 0x0060, 0x456f: 0x0010, + 0x4570: 0x0010, 0x4571: 0x0060, 0x4572: 0x0060, 0x4573: 0x0060, 0x4574: 0x0060, 0x4575: 0x0060, + 0x4576: 0x0060, 0x4577: 0x0060, 0x4578: 0x0060, 0x4579: 0x0060, 0x457a: 0x0060, 0x457b: 0x0060, + 0x457c: 0x0060, 0x457d: 0x0060, 0x457e: 0x0060, 0x457f: 0x0060, + // Block 0x116, offset 0x4580 + 0x4580: 0x0010, 0x4581: 0x0060, 0x4582: 0x0060, 0x4583: 0x0060, 0x4584: 0x0060, 0x4585: 0x0060, + 0x4586: 0x0060, 0x4587: 0x0060, 0x4588: 0x0060, 0x4589: 0x0060, 0x458a: 0x0060, 0x458b: 0x0060, + 0x458c: 0x0060, 0x458d: 0x0060, 0x458e: 0x0060, 0x458f: 0x0060, 0x4590: 0x0010, 0x4591: 0x0060, + 0x4592: 0x0060, 0x4593: 0x0060, 0x4594: 0x0060, 0x4595: 0x0060, 0x4596: 0x0060, 0x4597: 0x0060, + 0x4598: 0x0060, 0x4599: 0x0060, 0x459a: 0x0060, 0x459b: 0x0060, 0x459c: 0x0060, 0x459d: 0x0060, + 0x459e: 0x0060, 0x459f: 0x0060, 0x45a0: 0x0060, 0x45a1: 0x0060, 0x45a2: 0x0060, 0x45a3: 0x0060, + 0x45a4: 0x0060, 0x45a5: 0x0060, 0x45a6: 0x0060, 0x45a7: 0x0060, 0x45a8: 0x0060, 0x45a9: 0x0060, + 0x45aa: 0x0060, 0x45ab: 0x0060, 0x45ac: 0x0060, 0x45ad: 0x0060, 0x45ae: 0x0060, 0x45af: 0x0060, + 0x45b0: 0x0060, 0x45b1: 0x0060, 0x45b2: 0x0060, 0x45b3: 0x0060, 0x45b4: 0x0060, 0x45b5: 0x0060, + 0x45b6: 0x0010, 0x45b7: 0x0010, 0x45b8: 0x0010, 0x45b9: 0x0010, 0x45ba: 0x0010, 0x45bb: 0x0010, + 0x45bc: 0x0010, 0x45bd: 0x0010, 0x45be: 0x0010, 0x45bf: 0x0010, + // Block 0x117, offset 0x45c0 + 0x45c0: 0x0060, 0x45c1: 0x0060, 0x45c2: 0x0060, 0x45c3: 0x0060, 0x45c4: 0x0060, 0x45c5: 0x0060, + 0x45c6: 0x0060, 0x45c7: 0x0060, 0x45c8: 0x0060, 0x45c9: 0x0060, 0x45ca: 0x0060, 0x45cb: 0x0060, + 0x45cc: 0x0060, 0x45cd: 0x0010, 0x45ce: 0x0010, 0x45cf: 0x0010, 0x45d0: 0x0060, 0x45d1: 0x0060, + 0x45d2: 0x0060, 0x45d3: 0x0060, 0x45d4: 0x0060, 0x45d5: 0x0060, 0x45d6: 0x0060, 0x45d7: 0x0060, + 0x45d8: 0x0060, 0x45d9: 0x0060, 0x45da: 0x0060, 0x45db: 0x0060, 0x45dc: 0x0060, 0x45dd: 0x0060, + 0x45de: 0x0060, 0x45df: 0x0060, 0x45e0: 0x0060, 0x45e1: 0x0060, 0x45e2: 0x0060, 0x45e3: 0x0060, + 0x45e4: 0x0060, 0x45e5: 0x0060, 0x45e6: 0x0060, 0x45e7: 0x0060, 0x45e8: 0x0060, 0x45e9: 0x0060, + 0x45ea: 0x0060, 0x45eb: 0x0060, 0x45ec: 0x0060, 0x45ed: 0x0060, 0x45ee: 0x0060, 0x45ef: 0x0010, + 0x45f0: 0x0060, 0x45f1: 0x0060, 0x45f2: 0x0060, 0x45f3: 0x0060, 0x45f4: 0x0060, 0x45f5: 0x0060, + 0x45f6: 0x0060, 0x45f7: 0x0060, 0x45f8: 0x0060, 0x45f9: 0x0060, 0x45fa: 0x0060, 0x45fb: 0x0060, + 0x45fc: 0x0060, 0x45fd: 0x0060, 0x45fe: 0x0060, 0x45ff: 0x0060, + // Block 0x118, offset 0x4600 + 0x4600: 0x0060, 0x4601: 0x0060, 0x4602: 0x0060, 0x4603: 0x0060, 0x4604: 0x0060, 0x4605: 0x0060, + 0x4606: 0x0060, 0x4607: 0x0060, 0x4608: 0x0060, 0x4609: 0x0060, 0x460a: 0x0060, 0x460b: 0x0060, + 0x460c: 0x0060, 0x460d: 0x0060, 0x460e: 0x0060, 0x460f: 0x0060, 0x4610: 0x0060, 0x4611: 0x0060, + 0x4612: 0x0060, 0x4613: 0x0060, 0x4614: 0x0060, 0x4615: 0x0060, 0x4616: 0x0060, 0x4617: 0x0060, + 0x4618: 0x0060, 0x4619: 0x0060, 0x461a: 0x0060, 0x461b: 0x0010, 0x461c: 0x0010, 0x461d: 0x0010, + 0x461e: 0x0010, 0x461f: 0x0010, 0x4620: 0x0010, 0x4621: 0x0010, 0x4622: 0x0010, 0x4623: 0x0010, + 0x4624: 0x0010, 0x4625: 0x0010, 0x4626: 0x0010, 0x4627: 0x0010, 0x4628: 0x0010, 0x4629: 0x0010, + 0x462a: 0x0010, 0x462b: 0x0010, 0x462c: 0x0010, 0x462d: 0x0010, 0x462e: 0x0010, 0x462f: 0x0010, + 0x4630: 0x0010, 0x4631: 0x0010, 0x4632: 0x0010, 0x4633: 0x0010, 0x4634: 0x0010, 0x4635: 0x0010, + 0x4636: 0x0010, 0x4637: 0x0010, 0x4638: 0x0010, 0x4639: 0x0010, 0x463a: 0x0010, 0x463b: 0x0010, + 0x463c: 0x0010, 0x463d: 0x0010, 0x463e: 0x0010, 0x463f: 0x0010, + // Block 0x119, offset 0x4640 + 0x4640: 0x0010, 0x4641: 0x0010, 0x4642: 0x0010, 0x4643: 0x0010, 0x4644: 0x0010, 0x4645: 0x0010, + 0x4646: 0x0010, 0x4647: 0x0010, 0x4648: 0x0010, 0x4649: 0x0010, 0x464a: 0x0010, 0x464b: 0x0010, + 0x464c: 0x0010, 0x464d: 0x0010, 0x464e: 0x0010, 0x464f: 0x0010, 0x4650: 0x0010, 0x4651: 0x0010, + 0x4652: 0x0010, 0x4653: 0x0010, 0x4654: 0x0010, 0x4655: 0x0010, 0x4656: 0x0010, 0x4657: 0x0010, + 0x4658: 0x0010, 0x4659: 0x0010, 0x465a: 0x0010, 0x465b: 0x0010, 0x465c: 0x0010, 0x465d: 0x0010, + 0x465e: 0x0010, 0x465f: 0x0010, 0x4660: 0x0010, 0x4661: 0x0010, 0x4662: 0x0010, 0x4663: 0x0010, + 0x4664: 0x0010, 0x4665: 0x0010, 0x4666: 0x0060, 0x4667: 0x0060, 0x4668: 0x0060, 0x4669: 0x0060, + 0x466a: 0x0060, 0x466b: 0x0060, 0x466c: 0x0060, 0x466d: 0x0060, 0x466e: 0x0060, 0x466f: 0x0060, + 0x4670: 0x0060, 0x4671: 0x0060, 0x4672: 0x0060, 0x4673: 0x0060, 0x4674: 0x0060, 0x4675: 0x0060, + 0x4676: 0x0060, 0x4677: 0x0060, 0x4678: 0x0060, 0x4679: 0x0060, 0x467a: 0x0060, 0x467b: 0x0060, + 0x467c: 0x0060, 0x467d: 0x0060, 0x467e: 0x0060, 0x467f: 0x0060, + // Block 0x11a, offset 0x4680 + 0x4680: 0x0060, 0x4681: 0x0060, 0x4682: 0x0060, 0x4683: 0x0010, 0x4684: 0x0010, 0x4685: 0x0010, + 0x4686: 0x0010, 0x4687: 0x0010, 0x4688: 0x0010, 0x4689: 0x0010, 0x468a: 0x0010, 0x468b: 0x0010, + 0x468c: 0x0010, 0x468d: 0x0010, 0x468e: 0x0010, 0x468f: 0x0010, 0x4690: 0x0060, 0x4691: 0x0060, + 0x4692: 0x0060, 0x4693: 0x0060, 0x4694: 0x0060, 0x4695: 0x0060, 0x4696: 0x0060, 0x4697: 0x0060, + 0x4698: 0x0060, 0x4699: 0x0060, 0x469a: 0x0060, 0x469b: 0x0060, 0x469c: 0x0060, 0x469d: 0x0060, + 0x469e: 0x0060, 0x469f: 0x0060, 0x46a0: 0x0060, 0x46a1: 0x0060, 0x46a2: 0x0060, 0x46a3: 0x0060, + 0x46a4: 0x0060, 0x46a5: 0x0060, 0x46a6: 0x0060, 0x46a7: 0x0060, 0x46a8: 0x0060, 0x46a9: 0x0060, + 0x46aa: 0x0060, 0x46ab: 0x0060, 0x46ac: 0x0060, 0x46ad: 0x0060, 0x46ae: 0x0060, 0x46af: 0x0060, + 0x46b0: 0x0060, 0x46b1: 0x0060, 0x46b2: 0x0060, 0x46b3: 0x0060, 0x46b4: 0x0060, 0x46b5: 0x0060, + 0x46b6: 0x0060, 0x46b7: 0x0060, 0x46b8: 0x0060, 0x46b9: 0x0060, 0x46ba: 0x0060, 0x46bb: 0x0010, + 0x46bc: 0x0010, 0x46bd: 0x0010, 0x46be: 0x0010, 0x46bf: 0x0010, + // Block 0x11b, offset 0x46c0 + 0x46c0: 0x0060, 0x46c1: 0x0060, 0x46c2: 0x0060, 0x46c3: 0x0060, 0x46c4: 0x0060, 0x46c5: 0x0060, + 0x46c6: 0x0060, 0x46c7: 0x0060, 0x46c8: 0x0060, 0x46c9: 0x0010, 0x46ca: 0x0010, 0x46cb: 0x0010, + 0x46cc: 0x0010, 0x46cd: 0x0010, 0x46ce: 0x0010, 0x46cf: 0x0010, 0x46d0: 0x0060, 0x46d1: 0x0060, + 0x46d2: 0x0010, 0x46d3: 0x0010, 0x46d4: 0x0010, 0x46d5: 0x0010, 0x46d6: 0x0010, 0x46d7: 0x0010, + 0x46d8: 0x0010, 0x46d9: 0x0010, 0x46da: 0x0010, 0x46db: 0x0010, 0x46dc: 0x0010, 0x46dd: 0x0010, + 0x46de: 0x0010, 0x46df: 0x0010, 0x46e0: 0x0010, 0x46e1: 0x0010, 0x46e2: 0x0010, 0x46e3: 0x0010, + 0x46e4: 0x0010, 0x46e5: 0x0010, 0x46e6: 0x0010, 0x46e7: 0x0010, 0x46e8: 0x0010, 0x46e9: 0x0010, + 0x46ea: 0x0010, 0x46eb: 0x0010, 0x46ec: 0x0010, 0x46ed: 0x0010, 0x46ee: 0x0010, 0x46ef: 0x0010, + 0x46f0: 0x0010, 0x46f1: 0x0010, 0x46f2: 0x0010, 0x46f3: 0x0010, 0x46f4: 0x0010, 0x46f5: 0x0010, + 0x46f6: 0x0010, 0x46f7: 0x0010, 0x46f8: 0x0010, 0x46f9: 0x0010, 0x46fa: 0x0010, 0x46fb: 0x0010, + 0x46fc: 0x0010, 0x46fd: 0x0010, 0x46fe: 0x0010, 0x46ff: 0x0010, + // Block 0x11c, offset 0x4700 + 0x4700: 0x0060, 0x4701: 0x0060, 0x4702: 0x0060, 0x4703: 0x0060, 0x4704: 0x0060, 0x4705: 0x0060, + 0x4706: 0x0060, 0x4707: 0x0060, 0x4708: 0x0060, 0x4709: 0x0060, 0x470a: 0x0060, 0x470b: 0x0060, + 0x470c: 0x0060, 0x470d: 0x0060, 0x470e: 0x0060, 0x470f: 0x0060, 0x4710: 0x0060, 0x4711: 0x0060, + 0x4712: 0x0060, 0x4713: 0x0060, 0x4714: 0x0060, 0x4715: 0x0060, 0x4716: 0x0060, 0x4717: 0x0060, + 0x4718: 0x0060, 0x4719: 0x0060, 0x471a: 0x0060, 0x471b: 0x0060, 0x471c: 0x0060, 0x471d: 0x0060, + 0x471e: 0x0060, 0x471f: 0x0060, 0x4720: 0x0060, 0x4721: 0x0060, 0x4722: 0x0060, 0x4723: 0x0060, + 0x4724: 0x0060, 0x4725: 0x0060, 0x4726: 0x0060, 0x4727: 0x0060, 0x4728: 0x0060, 0x4729: 0x0060, + 0x472a: 0x0060, 0x472b: 0x0060, 0x472c: 0x0060, 0x472d: 0x0060, 0x472e: 0x0060, 0x472f: 0x0060, + 0x4730: 0x0060, 0x4731: 0x0060, 0x4732: 0x0060, 0x4733: 0x0060, 0x4734: 0x0060, 0x4735: 0x0060, + 0x4736: 0x0060, 0x4737: 0x0060, 0x4738: 0x0060, 0x4739: 0x0060, 0x473a: 0x0010, 0x473b: 0x0060, + 0x473c: 0x0060, 0x473d: 0x0060, 0x473e: 0x0060, 0x473f: 0x0060, + // Block 0x11d, offset 0x4740 + 0x4740: 0x0060, 0x4741: 0x0060, 0x4742: 0x0060, 0x4743: 0x0060, 0x4744: 0x0060, 0x4745: 0x0060, + 0x4746: 0x0060, 0x4747: 0x0060, 0x4748: 0x0060, 0x4749: 0x0060, 0x474a: 0x0060, 0x474b: 0x0060, + 0x474c: 0x0060, 0x474d: 0x0060, 0x474e: 0x0060, 0x474f: 0x0060, 0x4750: 0x0060, 0x4751: 0x0060, + 0x4752: 0x0060, 0x4753: 0x0060, 0x4754: 0x0060, 0x4755: 0x0060, 0x4756: 0x0060, 0x4757: 0x0060, + 0x4758: 0x0060, 0x4759: 0x0060, 0x475a: 0x0060, 0x475b: 0x0060, 0x475c: 0x0060, 0x475d: 0x0060, + 0x475e: 0x0060, 0x475f: 0x0060, 0x4760: 0x0060, 0x4761: 0x0060, 0x4762: 0x0060, 0x4763: 0x0060, + 0x4764: 0x0010, 0x4765: 0x0060, 0x4766: 0x0060, 0x4767: 0x0060, 0x4768: 0x0060, 0x4769: 0x0060, + 0x476a: 0x0060, 0x476b: 0x0060, 0x476c: 0x0060, 0x476d: 0x0060, 0x476e: 0x0060, 0x476f: 0x0060, + 0x4770: 0x0060, 0x4771: 0x0060, 0x4772: 0x0060, 0x4773: 0x0060, 0x4774: 0x0060, 0x4775: 0x0060, + 0x4776: 0x0060, 0x4777: 0x0060, 0x4778: 0x0060, 0x4779: 0x0060, 0x477a: 0x0060, 0x477b: 0x0060, + 0x477c: 0x0060, 0x477d: 0x0060, 0x477e: 0x0060, 0x477f: 0x0060, + // Block 0x11e, offset 0x4780 + 0x4780: 0x0060, 0x4781: 0x0060, 0x4782: 0x0060, 0x4783: 0x0060, 0x4784: 0x0060, 0x4785: 0x0060, + 0x4786: 0x0060, 0x4787: 0x0060, 0x4788: 0x0060, 0x4789: 0x0060, 0x478a: 0x0060, 0x478b: 0x0060, + 0x478c: 0x0060, 0x478d: 0x0060, 0x478e: 0x0060, 0x478f: 0x0060, 0x4790: 0x0060, 0x4791: 0x0010, + 0x4792: 0x0010, 0x4793: 0x0010, 0x4794: 0x0010, 0x4795: 0x0010, 0x4796: 0x0010, 0x4797: 0x0010, + 0x4798: 0x0010, 0x4799: 0x0010, 0x479a: 0x0010, 0x479b: 0x0010, 0x479c: 0x0010, 0x479d: 0x0010, + 0x479e: 0x0010, 0x479f: 0x0010, 0x47a0: 0x0060, 0x47a1: 0x0060, 0x47a2: 0x0060, 0x47a3: 0x0060, + 0x47a4: 0x0060, 0x47a5: 0x0060, 0x47a6: 0x0060, 0x47a7: 0x0060, 0x47a8: 0x0060, 0x47a9: 0x0060, + 0x47aa: 0x0060, 0x47ab: 0x0060, 0x47ac: 0x0060, 0x47ad: 0x0010, 0x47ae: 0x0010, 0x47af: 0x0010, + 0x47b0: 0x0060, 0x47b1: 0x0060, 0x47b2: 0x0060, 0x47b3: 0x0060, 0x47b4: 0x0010, 0x47b5: 0x0010, + 0x47b6: 0x0010, 0x47b7: 0x0010, 0x47b8: 0x0010, 0x47b9: 0x0010, 0x47ba: 0x0010, 0x47bb: 0x0010, + 0x47bc: 0x0010, 0x47bd: 0x0010, 0x47be: 0x0010, 0x47bf: 0x0010, + // Block 0x11f, offset 0x47c0 + 0x47c0: 0x0060, 0x47c1: 0x0060, 0x47c2: 0x0060, 0x47c3: 0x0060, 0x47c4: 0x0060, 0x47c5: 0x0060, + 0x47c6: 0x0060, 0x47c7: 0x0060, 0x47c8: 0x0060, 0x47c9: 0x0060, 0x47ca: 0x0060, 0x47cb: 0x0060, + 0x47cc: 0x0060, 0x47cd: 0x0060, 0x47ce: 0x0060, 0x47cf: 0x0060, 0x47d0: 0x0060, 0x47d1: 0x0060, + 0x47d2: 0x0060, 0x47d3: 0x0060, 0x47d4: 0x0060, 0x47d5: 0x0010, 0x47d6: 0x0010, 0x47d7: 0x0010, + 0x47d8: 0x0010, 0x47d9: 0x0010, 0x47da: 0x0010, 0x47db: 0x0010, 0x47dc: 0x0010, 0x47dd: 0x0010, + 0x47de: 0x0010, 0x47df: 0x0010, 0x47e0: 0x0010, 0x47e1: 0x0010, 0x47e2: 0x0010, 0x47e3: 0x0010, + 0x47e4: 0x0010, 0x47e5: 0x0010, 0x47e6: 0x0010, 0x47e7: 0x0010, 0x47e8: 0x0010, 0x47e9: 0x0010, + 0x47ea: 0x0010, 0x47eb: 0x0010, 0x47ec: 0x0010, 0x47ed: 0x0010, 0x47ee: 0x0010, 0x47ef: 0x0010, + 0x47f0: 0x0010, 0x47f1: 0x0010, 0x47f2: 0x0010, 0x47f3: 0x0010, 0x47f4: 0x0010, 0x47f5: 0x0010, + 0x47f6: 0x0010, 0x47f7: 0x0010, 0x47f8: 0x0010, 0x47f9: 0x0010, 0x47fa: 0x0010, 0x47fb: 0x0010, + 0x47fc: 0x0010, 0x47fd: 0x0010, 0x47fe: 0x0010, 0x47ff: 0x0010, + // Block 0x120, offset 0x4800 + 0x4800: 0x0060, 0x4801: 0x0060, 0x4802: 0x0060, 0x4803: 0x0060, 0x4804: 0x0060, 0x4805: 0x0060, + 0x4806: 0x0060, 0x4807: 0x0060, 0x4808: 0x0060, 0x4809: 0x0060, 0x480a: 0x0060, 0x480b: 0x0060, + 0x480c: 0x0010, 0x480d: 0x0010, 0x480e: 0x0010, 0x480f: 0x0010, 0x4810: 0x0060, 0x4811: 0x0060, + 0x4812: 0x0060, 0x4813: 0x0060, 0x4814: 0x0060, 0x4815: 0x0060, 0x4816: 0x0060, 0x4817: 0x0060, + 0x4818: 0x0060, 0x4819: 0x0060, 0x481a: 0x0060, 0x481b: 0x0060, 0x481c: 0x0060, 0x481d: 0x0060, + 0x481e: 0x0060, 0x481f: 0x0060, 0x4820: 0x0060, 0x4821: 0x0060, 0x4822: 0x0060, 0x4823: 0x0060, + 0x4824: 0x0060, 0x4825: 0x0060, 0x4826: 0x0060, 0x4827: 0x0060, 0x4828: 0x0060, 0x4829: 0x0060, + 0x482a: 0x0060, 0x482b: 0x0060, 0x482c: 0x0060, 0x482d: 0x0060, 0x482e: 0x0060, 0x482f: 0x0060, + 0x4830: 0x0060, 0x4831: 0x0060, 0x4832: 0x0060, 0x4833: 0x0060, 0x4834: 0x0060, 0x4835: 0x0060, + 0x4836: 0x0060, 0x4837: 0x0060, 0x4838: 0x0060, 0x4839: 0x0060, 0x483a: 0x0060, 0x483b: 0x0060, + 0x483c: 0x0060, 0x483d: 0x0060, 0x483e: 0x0060, 0x483f: 0x0060, + // Block 0x121, offset 0x4840 + 0x4840: 0x0060, 0x4841: 0x0060, 0x4842: 0x0060, 0x4843: 0x0060, 0x4844: 0x0060, 0x4845: 0x0060, + 0x4846: 0x0060, 0x4847: 0x0060, 0x4848: 0x0010, 0x4849: 0x0010, 0x484a: 0x0010, 0x484b: 0x0010, + 0x484c: 0x0010, 0x484d: 0x0010, 0x484e: 0x0010, 0x484f: 0x0010, 0x4850: 0x0060, 0x4851: 0x0060, + 0x4852: 0x0060, 0x4853: 0x0060, 0x4854: 0x0060, 0x4855: 0x0060, 0x4856: 0x0060, 0x4857: 0x0060, + 0x4858: 0x0060, 0x4859: 0x0060, 0x485a: 0x0010, 0x485b: 0x0010, 0x485c: 0x0010, 0x485d: 0x0010, + 0x485e: 0x0010, 0x485f: 0x0010, 0x4860: 0x0060, 0x4861: 0x0060, 0x4862: 0x0060, 0x4863: 0x0060, + 0x4864: 0x0060, 0x4865: 0x0060, 0x4866: 0x0060, 0x4867: 0x0060, 0x4868: 0x0060, 0x4869: 0x0060, + 0x486a: 0x0060, 0x486b: 0x0060, 0x486c: 0x0060, 0x486d: 0x0060, 0x486e: 0x0060, 0x486f: 0x0060, + 0x4870: 0x0060, 0x4871: 0x0060, 0x4872: 0x0060, 0x4873: 0x0060, 0x4874: 0x0060, 0x4875: 0x0060, + 0x4876: 0x0060, 0x4877: 0x0060, 0x4878: 0x0060, 0x4879: 0x0060, 0x487a: 0x0060, 0x487b: 0x0060, + 0x487c: 0x0060, 0x487d: 0x0060, 0x487e: 0x0060, 0x487f: 0x0060, + // Block 0x122, offset 0x4880 + 0x4880: 0x0060, 0x4881: 0x0060, 0x4882: 0x0060, 0x4883: 0x0060, 0x4884: 0x0060, 0x4885: 0x0060, + 0x4886: 0x0060, 0x4887: 0x0060, 0x4888: 0x0010, 0x4889: 0x0010, 0x488a: 0x0010, 0x488b: 0x0010, + 0x488c: 0x0010, 0x488d: 0x0010, 0x488e: 0x0010, 0x488f: 0x0010, 0x4890: 0x0060, 0x4891: 0x0060, + 0x4892: 0x0060, 0x4893: 0x0060, 0x4894: 0x0060, 0x4895: 0x0060, 0x4896: 0x0060, 0x4897: 0x0060, + 0x4898: 0x0060, 0x4899: 0x0060, 0x489a: 0x0060, 0x489b: 0x0060, 0x489c: 0x0060, 0x489d: 0x0060, + 0x489e: 0x0060, 0x489f: 0x0060, 0x48a0: 0x0060, 0x48a1: 0x0060, 0x48a2: 0x0060, 0x48a3: 0x0060, + 0x48a4: 0x0060, 0x48a5: 0x0060, 0x48a6: 0x0060, 0x48a7: 0x0060, 0x48a8: 0x0060, 0x48a9: 0x0060, + 0x48aa: 0x0060, 0x48ab: 0x0060, 0x48ac: 0x0060, 0x48ad: 0x0060, 0x48ae: 0x0010, 0x48af: 0x0010, + 0x48b0: 0x0010, 0x48b1: 0x0010, 0x48b2: 0x0010, 0x48b3: 0x0010, 0x48b4: 0x0010, 0x48b5: 0x0010, + 0x48b6: 0x0010, 0x48b7: 0x0010, 0x48b8: 0x0010, 0x48b9: 0x0010, 0x48ba: 0x0010, 0x48bb: 0x0010, + 0x48bc: 0x0010, 0x48bd: 0x0010, 0x48be: 0x0010, 0x48bf: 0x0010, + // Block 0x123, offset 0x48c0 + 0x48c0: 0x0010, 0x48c1: 0x0010, 0x48c2: 0x0010, 0x48c3: 0x0010, 0x48c4: 0x0010, 0x48c5: 0x0010, + 0x48c6: 0x0010, 0x48c7: 0x0010, 0x48c8: 0x0010, 0x48c9: 0x0010, 0x48ca: 0x0010, 0x48cb: 0x0010, + 0x48cc: 0x0010, 0x48cd: 0x0010, 0x48ce: 0x0010, 0x48cf: 0x0010, 0x48d0: 0x0060, 0x48d1: 0x0060, + 0x48d2: 0x0060, 0x48d3: 0x0060, 0x48d4: 0x0060, 0x48d5: 0x0060, 0x48d6: 0x0060, 0x48d7: 0x0060, + 0x48d8: 0x0060, 0x48d9: 0x0010, 0x48da: 0x0010, 0x48db: 0x0010, 0x48dc: 0x0010, 0x48dd: 0x0010, + 0x48de: 0x0010, 0x48df: 0x0010, 0x48e0: 0x0010, 0x48e1: 0x0010, 0x48e2: 0x0010, 0x48e3: 0x0010, + 0x48e4: 0x0010, 0x48e5: 0x0010, 0x48e6: 0x0010, 0x48e7: 0x0010, 0x48e8: 0x0010, 0x48e9: 0x0010, + 0x48ea: 0x0010, 0x48eb: 0x0010, 0x48ec: 0x0010, 0x48ed: 0x0010, 0x48ee: 0x0010, 0x48ef: 0x0010, + 0x48f0: 0x0010, 0x48f1: 0x0010, 0x48f2: 0x0010, 0x48f3: 0x0010, 0x48f4: 0x0010, 0x48f5: 0x0010, + 0x48f6: 0x0010, 0x48f7: 0x0010, 0x48f8: 0x0010, 0x48f9: 0x0010, 0x48fa: 0x0010, 0x48fb: 0x0010, + 0x48fc: 0x0010, 0x48fd: 0x0010, 0x48fe: 0x0010, 0x48ff: 0x0010, + // Block 0x124, offset 0x4900 + 0x4900: 0x0060, 0x4901: 0x0060, 0x4902: 0x0060, 0x4903: 0x0060, 0x4904: 0x0060, 0x4905: 0x0010, + 0x4906: 0x0010, 0x4907: 0x0010, 0x4908: 0x0010, 0x4909: 0x0010, 0x490a: 0x0010, 0x490b: 0x0010, + 0x490c: 0x0010, 0x490d: 0x0010, 0x490e: 0x0010, 0x490f: 0x0010, 0x4910: 0x0010, 0x4911: 0x0010, + 0x4912: 0x0010, 0x4913: 0x0010, 0x4914: 0x0010, 0x4915: 0x0010, 0x4916: 0x0010, 0x4917: 0x0010, + 0x4918: 0x0010, 0x4919: 0x0010, 0x491a: 0x0010, 0x491b: 0x0010, 0x491c: 0x0010, 0x491d: 0x0010, + 0x491e: 0x0010, 0x491f: 0x0010, 0x4920: 0x0010, 0x4921: 0x0010, 0x4922: 0x0010, 0x4923: 0x0010, + 0x4924: 0x0010, 0x4925: 0x0010, 0x4926: 0x0010, 0x4927: 0x0010, 0x4928: 0x0010, 0x4929: 0x0010, + 0x492a: 0x0010, 0x492b: 0x0010, 0x492c: 0x0010, 0x492d: 0x0010, 0x492e: 0x0010, 0x492f: 0x0010, + 0x4930: 0x0010, 0x4931: 0x0010, 0x4932: 0x0010, 0x4933: 0x0010, 0x4934: 0x0010, 0x4935: 0x0010, + 0x4936: 0x0010, 0x4937: 0x0010, 0x4938: 0x0010, 0x4939: 0x0010, 0x493a: 0x0010, 0x493b: 0x0010, + 0x493c: 0x0010, 0x493d: 0x0010, 0x493e: 0x0010, 0x493f: 0x0010, + // Block 0x125, offset 0x4940 + 0x4940: 0x0060, 0x4941: 0x0010, 0x4942: 0x0010, 0x4943: 0x0010, 0x4944: 0x0010, 0x4945: 0x0010, + 0x4946: 0x0010, 0x4947: 0x0010, 0x4948: 0x0010, 0x4949: 0x0010, 0x494a: 0x0010, 0x494b: 0x0010, + 0x494c: 0x0010, 0x494d: 0x0010, 0x494e: 0x0010, 0x494f: 0x0010, 0x4950: 0x0010, 0x4951: 0x0010, + 0x4952: 0x0010, 0x4953: 0x0010, 0x4954: 0x0010, 0x4955: 0x0010, 0x4956: 0x0010, 0x4957: 0x0010, + 0x4958: 0x0010, 0x4959: 0x0010, 0x495a: 0x0010, 0x495b: 0x0010, 0x495c: 0x0010, 0x495d: 0x0010, + 0x495e: 0x0010, 0x495f: 0x0010, 0x4960: 0x0010, 0x4961: 0x0010, 0x4962: 0x0010, 0x4963: 0x0010, + 0x4964: 0x0010, 0x4965: 0x0010, 0x4966: 0x0010, 0x4967: 0x0010, 0x4968: 0x0010, 0x4969: 0x0010, + 0x496a: 0x0010, 0x496b: 0x0010, 0x496c: 0x0010, 0x496d: 0x0010, 0x496e: 0x0010, 0x496f: 0x0010, + 0x4970: 0x0010, 0x4971: 0x0010, 0x4972: 0x0010, 0x4973: 0x0010, 0x4974: 0x0010, 0x4975: 0x0010, + 0x4976: 0x0010, 0x4977: 0x0010, 0x4978: 0x0010, 0x4979: 0x0010, 0x497a: 0x0010, 0x497b: 0x0010, + 0x497c: 0x0010, 0x497d: 0x0010, 0x497e: 0x0010, 0x497f: 0x0010, + // Block 0x126, offset 0x4980 + 0x4980: 0x0001, 0x4981: 0x0001, 0x4982: 0x0001, 0x4983: 0x0001, 0x4984: 0x0001, 0x4985: 0x0001, + 0x4986: 0x0001, 0x4987: 0x0001, 0x4988: 0x0001, 0x4989: 0x0001, 0x498a: 0x0001, 0x498b: 0x0001, + 0x498c: 0x0001, 0x498d: 0x0001, 0x498e: 0x0001, 0x498f: 0x0001, 0x4990: 0x0001, 0x4991: 0x0001, + 0x4992: 0x0001, 0x4993: 0x0001, 0x4994: 0x0001, 0x4995: 0x0001, 0x4996: 0x0001, 0x4997: 0x0010, + 0x4998: 0x0010, 0x4999: 0x0010, 0x499a: 0x0010, 0x499b: 0x0010, 0x499c: 0x0010, 0x499d: 0x0010, + 0x499e: 0x0010, 0x499f: 0x0010, 0x49a0: 0x0010, 0x49a1: 0x0010, 0x49a2: 0x0010, 0x49a3: 0x0010, + 0x49a4: 0x0010, 0x49a5: 0x0010, 0x49a6: 0x0010, 0x49a7: 0x0010, 0x49a8: 0x0010, 0x49a9: 0x0010, + 0x49aa: 0x0010, 0x49ab: 0x0010, 0x49ac: 0x0010, 0x49ad: 0x0010, 0x49ae: 0x0010, 0x49af: 0x0010, + 0x49b0: 0x0010, 0x49b1: 0x0010, 0x49b2: 0x0010, 0x49b3: 0x0010, 0x49b4: 0x0010, 0x49b5: 0x0010, + 0x49b6: 0x0010, 0x49b7: 0x0010, 0x49b8: 0x0010, 0x49b9: 0x0010, 0x49ba: 0x0010, 0x49bb: 0x0010, + 0x49bc: 0x0010, 0x49bd: 0x0010, 0x49be: 0x0010, 0x49bf: 0x0010, + // Block 0x127, offset 0x49c0 + 0x49c0: 0x0001, 0x49c1: 0x0001, 0x49c2: 0x0001, 0x49c3: 0x0001, 0x49c4: 0x0001, 0x49c5: 0x0001, + 0x49c6: 0x0001, 0x49c7: 0x0001, 0x49c8: 0x0001, 0x49c9: 0x0001, 0x49ca: 0x0001, 0x49cb: 0x0001, + 0x49cc: 0x0001, 0x49cd: 0x0001, 0x49ce: 0x0001, 0x49cf: 0x0001, 0x49d0: 0x0001, 0x49d1: 0x0001, + 0x49d2: 0x0001, 0x49d3: 0x0001, 0x49d4: 0x0001, 0x49d5: 0x0001, 0x49d6: 0x0001, 0x49d7: 0x0001, + 0x49d8: 0x0001, 0x49d9: 0x0001, 0x49da: 0x0001, 0x49db: 0x0001, 0x49dc: 0x0001, 0x49dd: 0x0001, + 0x49de: 0x0001, 0x49df: 0x0001, 0x49e0: 0x0001, 0x49e1: 0x0001, 0x49e2: 0x0001, 0x49e3: 0x0001, + 0x49e4: 0x0001, 0x49e5: 0x0001, 0x49e6: 0x0001, 0x49e7: 0x0001, 0x49e8: 0x0001, 0x49e9: 0x0001, + 0x49ea: 0x0001, 0x49eb: 0x0001, 0x49ec: 0x0001, 0x49ed: 0x0001, 0x49ee: 0x0001, 0x49ef: 0x0001, + 0x49f0: 0x0001, 0x49f1: 0x0001, 0x49f2: 0x0001, 0x49f3: 0x0001, 0x49f4: 0x0001, 0x49f5: 0x0010, + 0x49f6: 0x0010, 0x49f7: 0x0010, 0x49f8: 0x0010, 0x49f9: 0x0010, 0x49fa: 0x0010, 0x49fb: 0x0010, + 0x49fc: 0x0010, 0x49fd: 0x0010, 0x49fe: 0x0010, 0x49ff: 0x0010, + // Block 0x128, offset 0x4a00 + 0x4a00: 0x0001, 0x4a01: 0x0001, 0x4a02: 0x0001, 0x4a03: 0x0001, 0x4a04: 0x0001, 0x4a05: 0x0001, + 0x4a06: 0x0001, 0x4a07: 0x0001, 0x4a08: 0x0001, 0x4a09: 0x0001, 0x4a0a: 0x0001, 0x4a0b: 0x0001, + 0x4a0c: 0x0001, 0x4a0d: 0x0001, 0x4a0e: 0x0001, 0x4a0f: 0x0001, 0x4a10: 0x0001, 0x4a11: 0x0001, + 0x4a12: 0x0001, 0x4a13: 0x0001, 0x4a14: 0x0001, 0x4a15: 0x0001, 0x4a16: 0x0001, 0x4a17: 0x0001, + 0x4a18: 0x0001, 0x4a19: 0x0001, 0x4a1a: 0x0001, 0x4a1b: 0x0001, 0x4a1c: 0x0001, 0x4a1d: 0x0001, + 0x4a1e: 0x0010, 0x4a1f: 0x0010, 0x4a20: 0x0001, 0x4a21: 0x0001, 0x4a22: 0x0001, 0x4a23: 0x0001, + 0x4a24: 0x0001, 0x4a25: 0x0001, 0x4a26: 0x0001, 0x4a27: 0x0001, 0x4a28: 0x0001, 0x4a29: 0x0001, + 0x4a2a: 0x0001, 0x4a2b: 0x0001, 0x4a2c: 0x0001, 0x4a2d: 0x0001, 0x4a2e: 0x0001, 0x4a2f: 0x0001, + 0x4a30: 0x0001, 0x4a31: 0x0001, 0x4a32: 0x0001, 0x4a33: 0x0001, 0x4a34: 0x0001, 0x4a35: 0x0001, + 0x4a36: 0x0001, 0x4a37: 0x0001, 0x4a38: 0x0001, 0x4a39: 0x0001, 0x4a3a: 0x0001, 0x4a3b: 0x0001, + 0x4a3c: 0x0001, 0x4a3d: 0x0001, 0x4a3e: 0x0001, 0x4a3f: 0x0001, + // Block 0x129, offset 0x4a40 + 0x4a40: 0x0001, 0x4a41: 0x0001, 0x4a42: 0x0001, 0x4a43: 0x0001, 0x4a44: 0x0001, 0x4a45: 0x0001, + 0x4a46: 0x0001, 0x4a47: 0x0001, 0x4a48: 0x0001, 0x4a49: 0x0001, 0x4a4a: 0x0001, 0x4a4b: 0x0001, + 0x4a4c: 0x0001, 0x4a4d: 0x0001, 0x4a4e: 0x0001, 0x4a4f: 0x0001, 0x4a50: 0x0001, 0x4a51: 0x0001, + 0x4a52: 0x0001, 0x4a53: 0x0001, 0x4a54: 0x0001, 0x4a55: 0x0001, 0x4a56: 0x0001, 0x4a57: 0x0001, + 0x4a58: 0x0001, 0x4a59: 0x0001, 0x4a5a: 0x0001, 0x4a5b: 0x0001, 0x4a5c: 0x0001, 0x4a5d: 0x0001, + 0x4a5e: 0x0001, 0x4a5f: 0x0001, 0x4a60: 0x0001, 0x4a61: 0x0001, 0x4a62: 0x0010, 0x4a63: 0x0010, + 0x4a64: 0x0010, 0x4a65: 0x0010, 0x4a66: 0x0010, 0x4a67: 0x0010, 0x4a68: 0x0010, 0x4a69: 0x0010, + 0x4a6a: 0x0010, 0x4a6b: 0x0010, 0x4a6c: 0x0010, 0x4a6d: 0x0010, 0x4a6e: 0x0010, 0x4a6f: 0x0010, + 0x4a70: 0x0010, 0x4a71: 0x0010, 0x4a72: 0x0010, 0x4a73: 0x0010, 0x4a74: 0x0010, 0x4a75: 0x0010, + 0x4a76: 0x0010, 0x4a77: 0x0010, 0x4a78: 0x0010, 0x4a79: 0x0010, 0x4a7a: 0x0010, 0x4a7b: 0x0010, + 0x4a7c: 0x0010, 0x4a7d: 0x0010, 0x4a7e: 0x0010, 0x4a7f: 0x0010, + // Block 0x12a, offset 0x4a80 + 0x4a80: 0x0060, 0x4a81: 0x0060, 0x4a82: 0x0060, 0x4a83: 0x0060, 0x4a84: 0x0060, 0x4a85: 0x0060, + 0x4a86: 0x0060, 0x4a87: 0x0060, 0x4a88: 0x0060, 0x4a89: 0x0060, 0x4a8a: 0x0060, 0x4a8b: 0x0060, + 0x4a8c: 0x0060, 0x4a8d: 0x0060, 0x4a8e: 0x0060, 0x4a8f: 0x0060, 0x4a90: 0x0060, 0x4a91: 0x0060, + 0x4a92: 0x0060, 0x4a93: 0x0060, 0x4a94: 0x0060, 0x4a95: 0x0060, 0x4a96: 0x0060, 0x4a97: 0x0060, + 0x4a98: 0x0060, 0x4a99: 0x0060, 0x4a9a: 0x0060, 0x4a9b: 0x0060, 0x4a9c: 0x0060, 0x4a9d: 0x0060, + 0x4a9e: 0x0010, 0x4a9f: 0x0010, 0x4aa0: 0x0010, 0x4aa1: 0x0010, 0x4aa2: 0x0010, 0x4aa3: 0x0010, + 0x4aa4: 0x0010, 0x4aa5: 0x0010, 0x4aa6: 0x0010, 0x4aa7: 0x0010, 0x4aa8: 0x0010, 0x4aa9: 0x0010, + 0x4aaa: 0x0010, 0x4aab: 0x0010, 0x4aac: 0x0010, 0x4aad: 0x0010, 0x4aae: 0x0010, 0x4aaf: 0x0010, + 0x4ab0: 0x0010, 0x4ab1: 0x0010, 0x4ab2: 0x0010, 0x4ab3: 0x0010, 0x4ab4: 0x0010, 0x4ab5: 0x0010, + 0x4ab6: 0x0010, 0x4ab7: 0x0010, 0x4ab8: 0x0010, 0x4ab9: 0x0010, 0x4aba: 0x0010, 0x4abb: 0x0010, + 0x4abc: 0x0010, 0x4abd: 0x0010, 0x4abe: 0x0010, 0x4abf: 0x0010, + // Block 0x12b, offset 0x4ac0 + 0x4ac0: 0x0010, 0x4ac1: 0x0008, 0x4ac2: 0x0010, 0x4ac3: 0x0010, 0x4ac4: 0x0010, 0x4ac5: 0x0010, + 0x4ac6: 0x0010, 0x4ac7: 0x0010, 0x4ac8: 0x0010, 0x4ac9: 0x0010, 0x4aca: 0x0010, 0x4acb: 0x0010, + 0x4acc: 0x0010, 0x4acd: 0x0010, 0x4ace: 0x0010, 0x4acf: 0x0010, 0x4ad0: 0x0010, 0x4ad1: 0x0010, + 0x4ad2: 0x0010, 0x4ad3: 0x0010, 0x4ad4: 0x0010, 0x4ad5: 0x0010, 0x4ad6: 0x0010, 0x4ad7: 0x0010, + 0x4ad8: 0x0010, 0x4ad9: 0x0010, 0x4ada: 0x0010, 0x4adb: 0x0010, 0x4adc: 0x0010, 0x4add: 0x0010, + 0x4ade: 0x0010, 0x4adf: 0x0010, 0x4ae0: 0x0008, 0x4ae1: 0x0008, 0x4ae2: 0x0008, 0x4ae3: 0x0008, + 0x4ae4: 0x0008, 0x4ae5: 0x0008, 0x4ae6: 0x0008, 0x4ae7: 0x0008, 0x4ae8: 0x0008, 0x4ae9: 0x0008, + 0x4aea: 0x0008, 0x4aeb: 0x0008, 0x4aec: 0x0008, 0x4aed: 0x0008, 0x4aee: 0x0008, 0x4aef: 0x0008, + 0x4af0: 0x0008, 0x4af1: 0x0008, 0x4af2: 0x0008, 0x4af3: 0x0008, 0x4af4: 0x0008, 0x4af5: 0x0008, + 0x4af6: 0x0008, 0x4af7: 0x0008, 0x4af8: 0x0008, 0x4af9: 0x0008, 0x4afa: 0x0008, 0x4afb: 0x0008, + 0x4afc: 0x0008, 0x4afd: 0x0008, 0x4afe: 0x0008, 0x4aff: 0x0008, + // Block 0x12c, offset 0x4b00 + 0x4b00: 0x0008, 0x4b01: 0x0008, 0x4b02: 0x0008, 0x4b03: 0x0008, 0x4b04: 0x0008, 0x4b05: 0x0008, + 0x4b06: 0x0008, 0x4b07: 0x0008, 0x4b08: 0x0008, 0x4b09: 0x0008, 0x4b0a: 0x0008, 0x4b0b: 0x0008, + 0x4b0c: 0x0008, 0x4b0d: 0x0008, 0x4b0e: 0x0008, 0x4b0f: 0x0008, 0x4b10: 0x0008, 0x4b11: 0x0008, + 0x4b12: 0x0008, 0x4b13: 0x0008, 0x4b14: 0x0008, 0x4b15: 0x0008, 0x4b16: 0x0008, 0x4b17: 0x0008, + 0x4b18: 0x0008, 0x4b19: 0x0008, 0x4b1a: 0x0008, 0x4b1b: 0x0008, 0x4b1c: 0x0008, 0x4b1d: 0x0008, + 0x4b1e: 0x0008, 0x4b1f: 0x0008, 0x4b20: 0x0008, 0x4b21: 0x0008, 0x4b22: 0x0008, 0x4b23: 0x0008, + 0x4b24: 0x0008, 0x4b25: 0x0008, 0x4b26: 0x0008, 0x4b27: 0x0008, 0x4b28: 0x0008, 0x4b29: 0x0008, + 0x4b2a: 0x0008, 0x4b2b: 0x0008, 0x4b2c: 0x0008, 0x4b2d: 0x0008, 0x4b2e: 0x0008, 0x4b2f: 0x0008, + 0x4b30: 0x0010, 0x4b31: 0x0010, 0x4b32: 0x0010, 0x4b33: 0x0010, 0x4b34: 0x0010, 0x4b35: 0x0010, + 0x4b36: 0x0010, 0x4b37: 0x0010, 0x4b38: 0x0010, 0x4b39: 0x0010, 0x4b3a: 0x0010, 0x4b3b: 0x0010, + 0x4b3c: 0x0010, 0x4b3d: 0x0010, 0x4b3e: 0x0010, 0x4b3f: 0x0010, + // Block 0x12d, offset 0x4b40 + 0x4b40: 0x0008, 0x4b41: 0x0008, 0x4b42: 0x0008, 0x4b43: 0x0008, 0x4b44: 0x0008, 0x4b45: 0x0008, + 0x4b46: 0x0008, 0x4b47: 0x0008, 0x4b48: 0x0008, 0x4b49: 0x0008, 0x4b4a: 0x0008, 0x4b4b: 0x0008, + 0x4b4c: 0x0008, 0x4b4d: 0x0008, 0x4b4e: 0x0008, 0x4b4f: 0x0008, 0x4b50: 0x0008, 0x4b51: 0x0008, + 0x4b52: 0x0008, 0x4b53: 0x0008, 0x4b54: 0x0008, 0x4b55: 0x0008, 0x4b56: 0x0008, 0x4b57: 0x0008, + 0x4b58: 0x0008, 0x4b59: 0x0008, 0x4b5a: 0x0008, 0x4b5b: 0x0008, 0x4b5c: 0x0008, 0x4b5d: 0x0008, + 0x4b5e: 0x0008, 0x4b5f: 0x0008, 0x4b60: 0x0008, 0x4b61: 0x0008, 0x4b62: 0x0008, 0x4b63: 0x0008, + 0x4b64: 0x0008, 0x4b65: 0x0008, 0x4b66: 0x0008, 0x4b67: 0x0008, 0x4b68: 0x0008, 0x4b69: 0x0008, + 0x4b6a: 0x0008, 0x4b6b: 0x0008, 0x4b6c: 0x0008, 0x4b6d: 0x0008, 0x4b6e: 0x0008, 0x4b6f: 0x0008, + 0x4b70: 0x0008, 0x4b71: 0x0008, 0x4b72: 0x0008, 0x4b73: 0x0008, 0x4b74: 0x0008, 0x4b75: 0x0008, + 0x4b76: 0x0008, 0x4b77: 0x0008, 0x4b78: 0x0008, 0x4b79: 0x0008, 0x4b7a: 0x0008, 0x4b7b: 0x0008, + 0x4b7c: 0x0008, 0x4b7d: 0x0008, 0x4b7e: 0x0010, 0x4b7f: 0x0010, + // Block 0x12e, offset 0x4b80 + 0x4b80: 0x0008, 0x4b81: 0x0008, 0x4b82: 0x0008, 0x4b83: 0x0008, 0x4b84: 0x0008, 0x4b85: 0x0008, + 0x4b86: 0x0008, 0x4b87: 0x0008, 0x4b88: 0x0008, 0x4b89: 0x0008, 0x4b8a: 0x0008, 0x4b8b: 0x0008, + 0x4b8c: 0x0008, 0x4b8d: 0x0008, 0x4b8e: 0x0008, 0x4b8f: 0x0008, 0x4b90: 0x0008, 0x4b91: 0x0008, + 0x4b92: 0x0008, 0x4b93: 0x0008, 0x4b94: 0x0008, 0x4b95: 0x0008, 0x4b96: 0x0008, 0x4b97: 0x0008, + 0x4b98: 0x0008, 0x4b99: 0x0008, 0x4b9a: 0x0008, 0x4b9b: 0x0008, 0x4b9c: 0x0008, 0x4b9d: 0x0008, + 0x4b9e: 0x0008, 0x4b9f: 0x0008, 0x4ba0: 0x0008, 0x4ba1: 0x0008, 0x4ba2: 0x0008, 0x4ba3: 0x0008, + 0x4ba4: 0x0008, 0x4ba5: 0x0008, 0x4ba6: 0x0008, 0x4ba7: 0x0008, 0x4ba8: 0x0008, 0x4ba9: 0x0008, + 0x4baa: 0x0008, 0x4bab: 0x0008, 0x4bac: 0x0008, 0x4bad: 0x0008, 0x4bae: 0x0008, 0x4baf: 0x0008, + 0x4bb0: 0x0008, 0x4bb1: 0x0008, 0x4bb2: 0x0008, 0x4bb3: 0x0008, 0x4bb4: 0x0008, 0x4bb5: 0x0008, + 0x4bb6: 0x0008, 0x4bb7: 0x0008, 0x4bb8: 0x0008, 0x4bb9: 0x0008, 0x4bba: 0x0008, 0x4bbb: 0x0008, + 0x4bbc: 0x0008, 0x4bbd: 0x0008, 0x4bbe: 0x0010, +} + +// derivedPropertiesIndex: 39 blocks, 2496 entries, 4992 bytes +// Block 0 is the zero block. +var derivedPropertiesIndex = [2496]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x02, 0xc4: 0x03, 0xc5: 0x04, 0xc6: 0x05, 0xc7: 0x06, + 0xc8: 0x05, 0xc9: 0x05, 0xca: 0x07, 0xcb: 0x08, 0xcc: 0x05, 0xcd: 0x09, 0xce: 0x0a, 0xcf: 0x0b, + 0xd0: 0x05, 0xd1: 0x05, 0xd2: 0x0c, 0xd3: 0x05, 0xd4: 0x0d, 0xd5: 0x0e, 0xd6: 0x0f, 0xd7: 0x10, + 0xd8: 0x11, 0xd9: 0x12, 0xda: 0x05, 0xdb: 0x13, 0xdc: 0x14, 0xdd: 0x15, 0xde: 0x16, 0xdf: 0x17, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07, + 0xe8: 0x07, 0xe9: 0x08, 0xea: 0x09, 0xeb: 0x0a, 0xec: 0x0b, 0xed: 0x0c, 0xee: 0x0d, 0xef: 0x0e, + 0xf0: 0x1e, 0xf1: 0x1f, 0xf2: 0x1f, 0xf3: 0x22, 0xf4: 0x24, + // Block 0x4, offset 0x100 + 0x120: 0x18, 0x121: 0x19, 0x122: 0x1a, 0x123: 0x1b, 0x124: 0x05, 0x125: 0x1c, 0x126: 0x1d, 0x127: 0x1e, + 0x128: 0x1f, 0x129: 0x20, 0x12a: 0x21, 0x12b: 0x22, 0x12c: 0x23, 0x12d: 0x24, 0x12e: 0x25, 0x12f: 0x26, + 0x130: 0x27, 0x131: 0x28, 0x132: 0x29, 0x133: 0x2a, 0x134: 0x2b, 0x135: 0x2c, 0x136: 0x2d, 0x137: 0x2e, + 0x138: 0x2f, 0x139: 0x30, 0x13a: 0x31, 0x13b: 0x32, 0x13c: 0x33, 0x13d: 0x34, 0x13e: 0x35, 0x13f: 0x36, + // Block 0x5, offset 0x140 + 0x140: 0x05, 0x141: 0x37, 0x142: 0x38, 0x143: 0x39, 0x144: 0x05, 0x145: 0x3a, 0x146: 0x05, 0x147: 0x05, + 0x148: 0x05, 0x149: 0x3b, 0x14a: 0x3c, 0x14b: 0x3d, 0x14c: 0x3e, 0x14d: 0x3f, 0x14e: 0x40, 0x14f: 0x41, + 0x150: 0x42, 0x151: 0x05, 0x152: 0x05, 0x153: 0x05, 0x154: 0x05, 0x155: 0x05, 0x156: 0x05, 0x157: 0x05, + 0x158: 0x05, 0x159: 0x43, 0x15a: 0x44, 0x15b: 0x45, 0x15c: 0x46, 0x15d: 0x47, 0x15e: 0x48, 0x15f: 0x49, + 0x160: 0x4a, 0x161: 0x4b, 0x162: 0x4c, 0x163: 0x4d, 0x164: 0x4e, 0x165: 0x4f, 0x166: 0x50, 0x167: 0x51, + 0x168: 0x52, 0x169: 0x53, 0x16a: 0x54, 0x16b: 0x55, 0x16c: 0x05, 0x16d: 0x56, 0x16e: 0x05, 0x16f: 0x57, + 0x170: 0x58, 0x171: 0x59, 0x172: 0x55, 0x173: 0x5a, 0x174: 0x5b, 0x175: 0x5c, 0x176: 0x5d, 0x177: 0x5e, + 0x178: 0x05, 0x179: 0x05, 0x17a: 0x5f, 0x17b: 0x05, 0x17c: 0x60, 0x17d: 0x61, 0x17e: 0x62, 0x17f: 0x63, + // Block 0x6, offset 0x180 + 0x180: 0x64, 0x181: 0x65, 0x182: 0x66, 0x183: 0x67, 0x184: 0x68, 0x185: 0x69, 0x186: 0x6a, 0x187: 0x6b, + 0x188: 0x6b, 0x189: 0x6b, 0x18a: 0x6b, 0x18b: 0x6b, 0x18c: 0x6b, 0x18d: 0x6b, 0x18e: 0x6b, 0x18f: 0x6c, + 0x190: 0x6d, 0x191: 0x6e, 0x192: 0x6b, 0x193: 0x6b, 0x194: 0x6b, 0x195: 0x6b, 0x196: 0x6b, 0x197: 0x6b, + 0x198: 0x6b, 0x199: 0x6b, 0x19a: 0x6b, 0x19b: 0x6b, 0x19c: 0x6b, 0x19d: 0x6b, 0x19e: 0x6b, 0x19f: 0x6b, + 0x1a0: 0x6b, 0x1a1: 0x6b, 0x1a2: 0x6b, 0x1a3: 0x6b, 0x1a4: 0x6b, 0x1a5: 0x6b, 0x1a6: 0x6b, 0x1a7: 0x6b, + 0x1a8: 0x6b, 0x1a9: 0x6b, 0x1aa: 0x6b, 0x1ab: 0x6b, 0x1ac: 0x6b, 0x1ad: 0x6f, 0x1ae: 0x70, 0x1af: 0x71, + 0x1b0: 0x72, 0x1b1: 0x73, 0x1b2: 0x05, 0x1b3: 0x74, 0x1b4: 0x75, 0x1b5: 0x76, 0x1b6: 0x77, 0x1b7: 0x78, + 0x1b8: 0x79, 0x1b9: 0x7a, 0x1ba: 0x7b, 0x1bb: 0x7c, 0x1bc: 0x6b, 0x1bd: 0x6b, 0x1be: 0x6b, 0x1bf: 0x7d, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x7e, 0x1c1: 0x7f, 0x1c2: 0x80, 0x1c3: 0x81, 0x1c4: 0x82, 0x1c5: 0x83, 0x1c6: 0x84, 0x1c7: 0x85, + 0x1c8: 0x86, 0x1c9: 0x6b, 0x1ca: 0x6b, 0x1cb: 0x87, 0x1cc: 0x6b, 0x1cd: 0x6b, 0x1ce: 0x6b, 0x1cf: 0x6b, + 0x1d0: 0x05, 0x1d1: 0x05, 0x1d2: 0x05, 0x1d3: 0x05, 0x1d4: 0x05, 0x1d5: 0x05, 0x1d6: 0x05, 0x1d7: 0x05, + 0x1d8: 0x05, 0x1d9: 0x05, 0x1da: 0x05, 0x1db: 0x05, 0x1dc: 0x05, 0x1dd: 0x05, 0x1de: 0x05, 0x1df: 0x05, + 0x1e0: 0x05, 0x1e1: 0x05, 0x1e2: 0x05, 0x1e3: 0x05, 0x1e4: 0x05, 0x1e5: 0x05, 0x1e6: 0x05, 0x1e7: 0x05, + 0x1e8: 0x05, 0x1e9: 0x05, 0x1ea: 0x05, 0x1eb: 0x05, 0x1ec: 0x05, 0x1ed: 0x05, 0x1ee: 0x05, 0x1ef: 0x05, + 0x1f0: 0x05, 0x1f1: 0x05, 0x1f2: 0x05, 0x1f3: 0x05, 0x1f4: 0x05, 0x1f5: 0x05, 0x1f6: 0x05, 0x1f7: 0x05, + 0x1f8: 0x05, 0x1f9: 0x05, 0x1fa: 0x05, 0x1fb: 0x05, 0x1fc: 0x05, 0x1fd: 0x05, 0x1fe: 0x05, 0x1ff: 0x05, + // Block 0x8, offset 0x200 + 0x200: 0x05, 0x201: 0x05, 0x202: 0x05, 0x203: 0x05, 0x204: 0x05, 0x205: 0x05, 0x206: 0x05, 0x207: 0x05, + 0x208: 0x05, 0x209: 0x05, 0x20a: 0x05, 0x20b: 0x05, 0x20c: 0x05, 0x20d: 0x05, 0x20e: 0x05, 0x20f: 0x05, + 0x210: 0x05, 0x211: 0x05, 0x212: 0x05, 0x213: 0x05, 0x214: 0x05, 0x215: 0x05, 0x216: 0x05, 0x217: 0x05, + 0x218: 0x05, 0x219: 0x05, 0x21a: 0x05, 0x21b: 0x05, 0x21c: 0x05, 0x21d: 0x05, 0x21e: 0x05, 0x21f: 0x05, + 0x220: 0x05, 0x221: 0x05, 0x222: 0x05, 0x223: 0x05, 0x224: 0x05, 0x225: 0x05, 0x226: 0x05, 0x227: 0x05, + 0x228: 0x05, 0x229: 0x05, 0x22a: 0x05, 0x22b: 0x05, 0x22c: 0x05, 0x22d: 0x05, 0x22e: 0x05, 0x22f: 0x05, + 0x230: 0x05, 0x231: 0x05, 0x232: 0x05, 0x233: 0x05, 0x234: 0x05, 0x235: 0x05, 0x236: 0x4d, 0x237: 0x6b, + 0x238: 0x05, 0x239: 0x05, 0x23a: 0x05, 0x23b: 0x05, 0x23c: 0x05, 0x23d: 0x05, 0x23e: 0x05, 0x23f: 0x05, + // Block 0x9, offset 0x240 + 0x240: 0x05, 0x241: 0x05, 0x242: 0x05, 0x243: 0x05, 0x244: 0x05, 0x245: 0x05, 0x246: 0x05, 0x247: 0x05, + 0x248: 0x05, 0x249: 0x05, 0x24a: 0x05, 0x24b: 0x05, 0x24c: 0x05, 0x24d: 0x05, 0x24e: 0x05, 0x24f: 0x05, + 0x250: 0x05, 0x251: 0x05, 0x252: 0x05, 0x253: 0x05, 0x254: 0x05, 0x255: 0x05, 0x256: 0x05, 0x257: 0x05, + 0x258: 0x05, 0x259: 0x05, 0x25a: 0x05, 0x25b: 0x05, 0x25c: 0x05, 0x25d: 0x05, 0x25e: 0x05, 0x25f: 0x05, + 0x260: 0x05, 0x261: 0x05, 0x262: 0x05, 0x263: 0x05, 0x264: 0x05, 0x265: 0x05, 0x266: 0x05, 0x267: 0x05, + 0x268: 0x05, 0x269: 0x05, 0x26a: 0x05, 0x26b: 0x05, 0x26c: 0x05, 0x26d: 0x05, 0x26e: 0x05, 0x26f: 0x05, + 0x270: 0x05, 0x271: 0x05, 0x272: 0x05, 0x273: 0x05, 0x274: 0x05, 0x275: 0x05, 0x276: 0x05, 0x277: 0x05, + 0x278: 0x05, 0x279: 0x05, 0x27a: 0x05, 0x27b: 0x05, 0x27c: 0x05, 0x27d: 0x05, 0x27e: 0x05, 0x27f: 0x05, + // Block 0xa, offset 0x280 + 0x280: 0x05, 0x281: 0x05, 0x282: 0x05, 0x283: 0x05, 0x284: 0x05, 0x285: 0x05, 0x286: 0x05, 0x287: 0x05, + 0x288: 0x05, 0x289: 0x05, 0x28a: 0x05, 0x28b: 0x05, 0x28c: 0x05, 0x28d: 0x05, 0x28e: 0x05, 0x28f: 0x05, + 0x290: 0x05, 0x291: 0x05, 0x292: 0x05, 0x293: 0x05, 0x294: 0x05, 0x295: 0x05, 0x296: 0x05, 0x297: 0x05, + 0x298: 0x05, 0x299: 0x05, 0x29a: 0x05, 0x29b: 0x05, 0x29c: 0x05, 0x29d: 0x05, 0x29e: 0x05, 0x29f: 0x05, + 0x2a0: 0x05, 0x2a1: 0x05, 0x2a2: 0x05, 0x2a3: 0x05, 0x2a4: 0x05, 0x2a5: 0x05, 0x2a6: 0x05, 0x2a7: 0x05, + 0x2a8: 0x05, 0x2a9: 0x05, 0x2aa: 0x05, 0x2ab: 0x05, 0x2ac: 0x05, 0x2ad: 0x05, 0x2ae: 0x05, 0x2af: 0x05, + 0x2b0: 0x05, 0x2b1: 0x05, 0x2b2: 0x05, 0x2b3: 0x05, 0x2b4: 0x05, 0x2b5: 0x05, 0x2b6: 0x05, 0x2b7: 0x05, + 0x2b8: 0x05, 0x2b9: 0x05, 0x2ba: 0x05, 0x2bb: 0x05, 0x2bc: 0x05, 0x2bd: 0x05, 0x2be: 0x05, 0x2bf: 0x88, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x05, 0x2c1: 0x05, 0x2c2: 0x05, 0x2c3: 0x05, 0x2c4: 0x05, 0x2c5: 0x05, 0x2c6: 0x05, 0x2c7: 0x05, + 0x2c8: 0x05, 0x2c9: 0x05, 0x2ca: 0x05, 0x2cb: 0x05, 0x2cc: 0x05, 0x2cd: 0x05, 0x2ce: 0x05, 0x2cf: 0x05, + 0x2d0: 0x05, 0x2d1: 0x05, 0x2d2: 0x89, 0x2d3: 0x8a, 0x2d4: 0x05, 0x2d5: 0x05, 0x2d6: 0x05, 0x2d7: 0x05, + 0x2d8: 0x8b, 0x2d9: 0x8c, 0x2da: 0x8d, 0x2db: 0x8e, 0x2dc: 0x8f, 0x2dd: 0x90, 0x2de: 0x91, 0x2df: 0x92, + 0x2e0: 0x93, 0x2e1: 0x94, 0x2e2: 0x05, 0x2e3: 0x95, 0x2e4: 0x96, 0x2e5: 0x97, 0x2e6: 0x05, 0x2e7: 0x98, + 0x2e8: 0x99, 0x2e9: 0x9a, 0x2ea: 0x05, 0x2eb: 0x9b, 0x2ec: 0x9c, 0x2ed: 0x9d, 0x2ee: 0x05, 0x2ef: 0x9e, + 0x2f0: 0x9f, 0x2f1: 0xa0, 0x2f2: 0xa1, 0x2f3: 0xa2, 0x2f4: 0xa3, 0x2f5: 0xa4, 0x2f6: 0xa5, 0x2f7: 0x9f, + 0x2f8: 0xa0, 0x2f9: 0xa1, 0x2fa: 0xa2, 0x2fb: 0xa3, 0x2fc: 0xa4, 0x2fd: 0xa5, 0x2fe: 0x9f, 0x2ff: 0xa0, + // Block 0xc, offset 0x300 + 0x300: 0xa1, 0x301: 0xa2, 0x302: 0xa3, 0x303: 0xa4, 0x304: 0xa5, 0x305: 0x9f, 0x306: 0xa0, 0x307: 0xa1, + 0x308: 0xa2, 0x309: 0xa3, 0x30a: 0xa4, 0x30b: 0xa5, 0x30c: 0x9f, 0x30d: 0xa0, 0x30e: 0xa1, 0x30f: 0xa2, + 0x310: 0xa3, 0x311: 0xa4, 0x312: 0xa5, 0x313: 0x9f, 0x314: 0xa0, 0x315: 0xa1, 0x316: 0xa2, 0x317: 0xa3, + 0x318: 0xa4, 0x319: 0xa5, 0x31a: 0x9f, 0x31b: 0xa0, 0x31c: 0xa1, 0x31d: 0xa2, 0x31e: 0xa3, 0x31f: 0xa4, + 0x320: 0xa5, 0x321: 0x9f, 0x322: 0xa0, 0x323: 0xa1, 0x324: 0xa2, 0x325: 0xa3, 0x326: 0xa4, 0x327: 0xa5, + 0x328: 0x9f, 0x329: 0xa0, 0x32a: 0xa1, 0x32b: 0xa2, 0x32c: 0xa3, 0x32d: 0xa4, 0x32e: 0xa5, 0x32f: 0x9f, + 0x330: 0xa0, 0x331: 0xa1, 0x332: 0xa2, 0x333: 0xa3, 0x334: 0xa4, 0x335: 0xa5, 0x336: 0x9f, 0x337: 0xa0, + 0x338: 0xa1, 0x339: 0xa2, 0x33a: 0xa3, 0x33b: 0xa4, 0x33c: 0xa5, 0x33d: 0x9f, 0x33e: 0xa0, 0x33f: 0xa1, + // Block 0xd, offset 0x340 + 0x340: 0xa2, 0x341: 0xa3, 0x342: 0xa4, 0x343: 0xa5, 0x344: 0x9f, 0x345: 0xa0, 0x346: 0xa1, 0x347: 0xa2, + 0x348: 0xa3, 0x349: 0xa4, 0x34a: 0xa5, 0x34b: 0x9f, 0x34c: 0xa0, 0x34d: 0xa1, 0x34e: 0xa2, 0x34f: 0xa3, + 0x350: 0xa4, 0x351: 0xa5, 0x352: 0x9f, 0x353: 0xa0, 0x354: 0xa1, 0x355: 0xa2, 0x356: 0xa3, 0x357: 0xa4, + 0x358: 0xa5, 0x359: 0x9f, 0x35a: 0xa0, 0x35b: 0xa1, 0x35c: 0xa2, 0x35d: 0xa3, 0x35e: 0xa4, 0x35f: 0xa5, + 0x360: 0x9f, 0x361: 0xa0, 0x362: 0xa1, 0x363: 0xa2, 0x364: 0xa3, 0x365: 0xa4, 0x366: 0xa5, 0x367: 0x9f, + 0x368: 0xa0, 0x369: 0xa1, 0x36a: 0xa2, 0x36b: 0xa3, 0x36c: 0xa4, 0x36d: 0xa5, 0x36e: 0x9f, 0x36f: 0xa0, + 0x370: 0xa1, 0x371: 0xa2, 0x372: 0xa3, 0x373: 0xa4, 0x374: 0xa5, 0x375: 0x9f, 0x376: 0xa0, 0x377: 0xa1, + 0x378: 0xa2, 0x379: 0xa3, 0x37a: 0xa4, 0x37b: 0xa5, 0x37c: 0x9f, 0x37d: 0xa0, 0x37e: 0xa1, 0x37f: 0xa2, + // Block 0xe, offset 0x380 + 0x380: 0xa3, 0x381: 0xa4, 0x382: 0xa5, 0x383: 0x9f, 0x384: 0xa0, 0x385: 0xa1, 0x386: 0xa2, 0x387: 0xa3, + 0x388: 0xa4, 0x389: 0xa5, 0x38a: 0x9f, 0x38b: 0xa0, 0x38c: 0xa1, 0x38d: 0xa2, 0x38e: 0xa3, 0x38f: 0xa4, + 0x390: 0xa5, 0x391: 0x9f, 0x392: 0xa0, 0x393: 0xa1, 0x394: 0xa2, 0x395: 0xa3, 0x396: 0xa4, 0x397: 0xa5, + 0x398: 0x9f, 0x399: 0xa0, 0x39a: 0xa1, 0x39b: 0xa2, 0x39c: 0xa3, 0x39d: 0xa4, 0x39e: 0xa6, 0x39f: 0xa7, + // Block 0xf, offset 0x3c0 + 0x3c0: 0xa8, 0x3c1: 0xa8, 0x3c2: 0xa8, 0x3c3: 0xa8, 0x3c4: 0xa8, 0x3c5: 0xa8, 0x3c6: 0xa8, 0x3c7: 0xa8, + 0x3c8: 0xa8, 0x3c9: 0xa8, 0x3ca: 0xa8, 0x3cb: 0xa8, 0x3cc: 0xa8, 0x3cd: 0xa8, 0x3ce: 0xa8, 0x3cf: 0xa8, + 0x3d0: 0xa8, 0x3d1: 0xa8, 0x3d2: 0xa8, 0x3d3: 0xa8, 0x3d4: 0xa8, 0x3d5: 0xa8, 0x3d6: 0xa8, 0x3d7: 0xa8, + 0x3d8: 0xa8, 0x3d9: 0xa8, 0x3da: 0xa8, 0x3db: 0xa8, 0x3dc: 0xa8, 0x3dd: 0xa8, 0x3de: 0xa8, 0x3df: 0xa8, + 0x3e0: 0xa8, 0x3e1: 0xa8, 0x3e2: 0xa8, 0x3e3: 0xa8, 0x3e4: 0xa8, 0x3e5: 0xa8, 0x3e6: 0xa8, 0x3e7: 0xa8, + 0x3e8: 0xa8, 0x3e9: 0xa8, 0x3ea: 0xa8, 0x3eb: 0xa8, 0x3ec: 0xa8, 0x3ed: 0xa8, 0x3ee: 0xa8, 0x3ef: 0xa8, + 0x3f0: 0xa8, 0x3f1: 0xa8, 0x3f2: 0xa8, 0x3f3: 0xa8, 0x3f4: 0xa8, 0x3f5: 0xa8, 0x3f6: 0xa8, 0x3f7: 0xa8, + 0x3f8: 0xa8, 0x3f9: 0xa8, 0x3fa: 0xa8, 0x3fb: 0xa8, 0x3fc: 0xa8, 0x3fd: 0xa8, 0x3fe: 0xa8, 0x3ff: 0xa8, + // Block 0x10, offset 0x400 + 0x400: 0xa8, 0x401: 0xa8, 0x402: 0xa8, 0x403: 0xa8, 0x404: 0xa8, 0x405: 0xa8, 0x406: 0xa8, 0x407: 0xa8, + 0x408: 0xa8, 0x409: 0xa8, 0x40a: 0xa8, 0x40b: 0xa8, 0x40c: 0xa8, 0x40d: 0xa8, 0x40e: 0xa8, 0x40f: 0xa8, + 0x410: 0xa8, 0x411: 0xa8, 0x412: 0xa8, 0x413: 0xa8, 0x414: 0xa8, 0x415: 0xa8, 0x416: 0xa8, 0x417: 0xa8, + 0x418: 0xa8, 0x419: 0xa8, 0x41a: 0xa8, 0x41b: 0xa8, 0x41c: 0xa8, 0x41d: 0xa8, 0x41e: 0xa8, 0x41f: 0xa8, + 0x420: 0xa8, 0x421: 0xa8, 0x422: 0xa8, 0x423: 0xa8, 0x424: 0x6b, 0x425: 0x6b, 0x426: 0x6b, 0x427: 0x6b, + 0x428: 0xa9, 0x429: 0xaa, 0x42a: 0x6b, 0x42b: 0xab, 0x42c: 0xac, 0x42d: 0xad, 0x42e: 0x6b, 0x42f: 0xae, + 0x430: 0x6b, 0x431: 0x6b, 0x432: 0x6b, 0x433: 0x6b, 0x434: 0x6b, 0x435: 0xaf, 0x436: 0xb0, 0x437: 0xb1, + 0x438: 0xb2, 0x439: 0xb3, 0x43a: 0x6b, 0x43b: 0xb4, 0x43c: 0xb5, 0x43d: 0x6b, 0x43e: 0xb6, 0x43f: 0xb7, + // Block 0x11, offset 0x440 + 0x440: 0xb8, 0x441: 0xb9, 0x442: 0x05, 0x443: 0xba, 0x444: 0xbb, 0x445: 0x6b, 0x446: 0xbc, 0x447: 0xbd, + 0x448: 0x55, 0x449: 0x55, 0x44a: 0xbe, 0x44b: 0xbf, 0x44c: 0xc0, 0x44d: 0xc1, 0x44e: 0xc2, 0x44f: 0xc3, + 0x450: 0x05, 0x451: 0x05, 0x452: 0xc4, 0x453: 0x55, 0x454: 0xc5, 0x455: 0xc6, 0x456: 0x55, 0x457: 0x55, + 0x458: 0x05, 0x459: 0x05, 0x45a: 0x05, 0x45b: 0x05, 0x45c: 0x99, 0x45d: 0xc7, 0x45e: 0x55, 0x45f: 0x55, + 0x460: 0xc8, 0x461: 0xc9, 0x462: 0xca, 0x463: 0xcb, 0x464: 0xcc, 0x465: 0x55, 0x466: 0xcd, 0x467: 0xb0, + 0x468: 0xce, 0x469: 0xcf, 0x46a: 0xd0, 0x46b: 0xd1, 0x46c: 0xd2, 0x46d: 0xd3, 0x46e: 0xd4, 0x46f: 0x55, + 0x470: 0x05, 0x471: 0xd5, 0x472: 0xd6, 0x473: 0xd7, 0x474: 0x55, 0x475: 0x55, 0x476: 0x55, 0x477: 0x55, + 0x478: 0x55, 0x479: 0xd8, 0x47a: 0x55, 0x47b: 0x55, 0x47c: 0x55, 0x47d: 0x55, 0x47e: 0x55, 0x47f: 0x55, + // Block 0x12, offset 0x480 + 0x480: 0x05, 0x481: 0xd9, 0x482: 0xda, 0x483: 0xdb, 0x484: 0xdc, 0x485: 0xdd, 0x486: 0x05, 0x487: 0xde, + 0x488: 0xdf, 0x489: 0x55, 0x48a: 0xe0, 0x48b: 0xe1, 0x48c: 0xe2, 0x48d: 0xe3, 0x48e: 0x55, 0x48f: 0x55, + 0x490: 0x55, 0x491: 0x55, 0x492: 0x05, 0x493: 0xe4, 0x494: 0x55, 0x495: 0x55, 0x496: 0xe5, 0x497: 0xe6, + 0x498: 0x05, 0x499: 0xe7, 0x49a: 0x4b, 0x49b: 0xe8, 0x49c: 0xe9, 0x49d: 0x55, 0x49e: 0x55, 0x49f: 0x55, + 0x4a0: 0x55, 0x4a1: 0x55, 0x4a2: 0xea, 0x4a3: 0xeb, 0x4a4: 0x55, 0x4a5: 0x55, 0x4a6: 0x55, 0x4a7: 0x55, + 0x4a8: 0x55, 0x4a9: 0x55, 0x4aa: 0x55, 0x4ab: 0xec, 0x4ac: 0x55, 0x4ad: 0x55, 0x4ae: 0x55, 0x4af: 0x55, + 0x4b0: 0x55, 0x4b1: 0x55, 0x4b2: 0x55, 0x4b3: 0x55, 0x4b4: 0x55, 0x4b5: 0x55, 0x4b6: 0x55, 0x4b7: 0x55, + 0x4b8: 0x55, 0x4b9: 0x55, 0x4ba: 0x55, 0x4bb: 0x55, 0x4bc: 0x55, 0x4bd: 0x55, 0x4be: 0x55, 0x4bf: 0x55, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x05, 0x4c1: 0x05, 0x4c2: 0x05, 0x4c3: 0x05, 0x4c4: 0x05, 0x4c5: 0x05, 0x4c6: 0x05, 0x4c7: 0x05, + 0x4c8: 0x05, 0x4c9: 0x05, 0x4ca: 0x05, 0x4cb: 0x05, 0x4cc: 0x05, 0x4cd: 0x05, 0x4ce: 0xed, 0x4cf: 0x55, + 0x4d0: 0x6b, 0x4d1: 0xee, 0x4d2: 0x05, 0x4d3: 0x05, 0x4d4: 0x05, 0x4d5: 0xef, 0x4d6: 0x55, 0x4d7: 0x55, + 0x4d8: 0x55, 0x4d9: 0x55, 0x4da: 0x55, 0x4db: 0x55, 0x4dc: 0x55, 0x4dd: 0x55, 0x4de: 0x55, 0x4df: 0x55, + 0x4e0: 0x55, 0x4e1: 0x55, 0x4e2: 0x55, 0x4e3: 0x55, 0x4e4: 0x55, 0x4e5: 0x55, 0x4e6: 0x55, 0x4e7: 0x55, + 0x4e8: 0x55, 0x4e9: 0x55, 0x4ea: 0x55, 0x4eb: 0x55, 0x4ec: 0x55, 0x4ed: 0x55, 0x4ee: 0x55, 0x4ef: 0x55, + 0x4f0: 0x55, 0x4f1: 0x55, 0x4f2: 0x55, 0x4f3: 0x55, 0x4f4: 0x55, 0x4f5: 0x55, 0x4f6: 0x55, 0x4f7: 0x55, + 0x4f8: 0x55, 0x4f9: 0x55, 0x4fa: 0x55, 0x4fb: 0x55, 0x4fc: 0x55, 0x4fd: 0x55, 0x4fe: 0x55, 0x4ff: 0x55, + // Block 0x14, offset 0x500 + 0x500: 0x05, 0x501: 0x05, 0x502: 0x05, 0x503: 0x05, 0x504: 0x05, 0x505: 0x05, 0x506: 0x05, 0x507: 0x05, + 0x508: 0x05, 0x509: 0x05, 0x50a: 0x05, 0x50b: 0x05, 0x50c: 0x05, 0x50d: 0x05, 0x50e: 0x05, 0x50f: 0x05, + 0x510: 0xf0, 0x511: 0x55, 0x512: 0x55, 0x513: 0x55, 0x514: 0x55, 0x515: 0x55, 0x516: 0x55, 0x517: 0x55, + 0x518: 0x55, 0x519: 0x55, 0x51a: 0x55, 0x51b: 0x55, 0x51c: 0x55, 0x51d: 0x55, 0x51e: 0x55, 0x51f: 0x55, + 0x520: 0x55, 0x521: 0x55, 0x522: 0x55, 0x523: 0x55, 0x524: 0x55, 0x525: 0x55, 0x526: 0x55, 0x527: 0x55, + 0x528: 0x55, 0x529: 0x55, 0x52a: 0x55, 0x52b: 0x55, 0x52c: 0x55, 0x52d: 0x55, 0x52e: 0x55, 0x52f: 0x55, + 0x530: 0x55, 0x531: 0x55, 0x532: 0x55, 0x533: 0x55, 0x534: 0x55, 0x535: 0x55, 0x536: 0x55, 0x537: 0x55, + 0x538: 0x55, 0x539: 0x55, 0x53a: 0x55, 0x53b: 0x55, 0x53c: 0x55, 0x53d: 0x55, 0x53e: 0x55, 0x53f: 0x55, + // Block 0x15, offset 0x540 + 0x540: 0x55, 0x541: 0x55, 0x542: 0x55, 0x543: 0x55, 0x544: 0x55, 0x545: 0x55, 0x546: 0x55, 0x547: 0x55, + 0x548: 0x55, 0x549: 0x55, 0x54a: 0x55, 0x54b: 0x55, 0x54c: 0x55, 0x54d: 0x55, 0x54e: 0x55, 0x54f: 0x55, + 0x550: 0x05, 0x551: 0x05, 0x552: 0x05, 0x553: 0x05, 0x554: 0x05, 0x555: 0x05, 0x556: 0x05, 0x557: 0x05, + 0x558: 0x05, 0x559: 0xf1, 0x55a: 0x55, 0x55b: 0x55, 0x55c: 0x55, 0x55d: 0x55, 0x55e: 0x55, 0x55f: 0x55, + 0x560: 0x55, 0x561: 0x55, 0x562: 0x55, 0x563: 0x55, 0x564: 0x55, 0x565: 0x55, 0x566: 0x55, 0x567: 0x55, + 0x568: 0x55, 0x569: 0x55, 0x56a: 0x55, 0x56b: 0x55, 0x56c: 0x55, 0x56d: 0x55, 0x56e: 0x55, 0x56f: 0x55, + 0x570: 0x55, 0x571: 0x55, 0x572: 0x55, 0x573: 0x55, 0x574: 0x55, 0x575: 0x55, 0x576: 0x55, 0x577: 0x55, + 0x578: 0x55, 0x579: 0x55, 0x57a: 0x55, 0x57b: 0x55, 0x57c: 0x55, 0x57d: 0x55, 0x57e: 0x55, 0x57f: 0x55, + // Block 0x16, offset 0x580 + 0x580: 0x55, 0x581: 0x55, 0x582: 0x55, 0x583: 0x55, 0x584: 0x55, 0x585: 0x55, 0x586: 0x55, 0x587: 0x55, + 0x588: 0x55, 0x589: 0x55, 0x58a: 0x55, 0x58b: 0x55, 0x58c: 0x55, 0x58d: 0x55, 0x58e: 0x55, 0x58f: 0x55, + 0x590: 0x55, 0x591: 0x55, 0x592: 0x55, 0x593: 0x55, 0x594: 0x55, 0x595: 0x55, 0x596: 0x55, 0x597: 0x55, + 0x598: 0x55, 0x599: 0x55, 0x59a: 0x55, 0x59b: 0x55, 0x59c: 0x55, 0x59d: 0x55, 0x59e: 0x55, 0x59f: 0x55, + 0x5a0: 0x55, 0x5a1: 0x55, 0x5a2: 0x55, 0x5a3: 0x55, 0x5a4: 0x55, 0x5a5: 0x55, 0x5a6: 0x55, 0x5a7: 0x55, + 0x5a8: 0x55, 0x5a9: 0x55, 0x5aa: 0x55, 0x5ab: 0x55, 0x5ac: 0x55, 0x5ad: 0x55, 0x5ae: 0x55, 0x5af: 0x55, + 0x5b0: 0x55, 0x5b1: 0x55, 0x5b2: 0x55, 0x5b3: 0x55, 0x5b4: 0x55, 0x5b5: 0x55, 0x5b6: 0x55, 0x5b7: 0x55, + 0x5b8: 0x55, 0x5b9: 0x55, 0x5ba: 0x55, 0x5bb: 0x55, 0x5bc: 0x55, 0x5bd: 0x55, 0x5be: 0x55, 0x5bf: 0x55, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x55, 0x5c1: 0x55, 0x5c2: 0x55, 0x5c3: 0x55, 0x5c4: 0x55, 0x5c5: 0x55, 0x5c6: 0x55, 0x5c7: 0x55, + 0x5c8: 0x55, 0x5c9: 0x55, 0x5ca: 0x55, 0x5cb: 0x55, 0x5cc: 0x55, 0x5cd: 0x55, 0x5ce: 0x55, 0x5cf: 0x55, + 0x5d0: 0x55, 0x5d1: 0x55, 0x5d2: 0x55, 0x5d3: 0x55, 0x5d4: 0x55, 0x5d5: 0x55, 0x5d6: 0x55, 0x5d7: 0x55, + 0x5d8: 0x55, 0x5d9: 0x55, 0x5da: 0x55, 0x5db: 0x55, 0x5dc: 0x55, 0x5dd: 0x55, 0x5de: 0x55, 0x5df: 0x55, + 0x5e0: 0x05, 0x5e1: 0x05, 0x5e2: 0x05, 0x5e3: 0x05, 0x5e4: 0x05, 0x5e5: 0x05, 0x5e6: 0x05, 0x5e7: 0x05, + 0x5e8: 0xec, 0x5e9: 0xf2, 0x5ea: 0x55, 0x5eb: 0xf3, 0x5ec: 0xf4, 0x5ed: 0xf5, 0x5ee: 0xf6, 0x5ef: 0x55, + 0x5f0: 0x55, 0x5f1: 0x55, 0x5f2: 0x55, 0x5f3: 0x55, 0x5f4: 0x55, 0x5f5: 0x55, 0x5f6: 0x55, 0x5f7: 0x55, + 0x5f8: 0x55, 0x5f9: 0x55, 0x5fa: 0x55, 0x5fb: 0x55, 0x5fc: 0x05, 0x5fd: 0xf7, 0x5fe: 0xf8, 0x5ff: 0x55, + // Block 0x18, offset 0x600 + 0x600: 0xf9, 0x601: 0x55, 0x602: 0x55, 0x603: 0x55, 0x604: 0x55, 0x605: 0x55, 0x606: 0x55, 0x607: 0x55, + 0x608: 0x55, 0x609: 0x55, 0x60a: 0x55, 0x60b: 0x55, 0x60c: 0x55, 0x60d: 0x55, 0x60e: 0x55, 0x60f: 0x55, + 0x610: 0x55, 0x611: 0x55, 0x612: 0x55, 0x613: 0x55, 0x614: 0x55, 0x615: 0x55, 0x616: 0x55, 0x617: 0x55, + 0x618: 0x55, 0x619: 0x55, 0x61a: 0x55, 0x61b: 0x55, 0x61c: 0x55, 0x61d: 0x55, 0x61e: 0x55, 0x61f: 0x55, + 0x620: 0x55, 0x621: 0x55, 0x622: 0x55, 0x623: 0x55, 0x624: 0x55, 0x625: 0x55, 0x626: 0x55, 0x627: 0x55, + 0x628: 0x55, 0x629: 0x55, 0x62a: 0x55, 0x62b: 0x55, 0x62c: 0x55, 0x62d: 0x55, 0x62e: 0x55, 0x62f: 0x55, + 0x630: 0x05, 0x631: 0xfa, 0x632: 0xfb, 0x633: 0x55, 0x634: 0x55, 0x635: 0x55, 0x636: 0x55, 0x637: 0x55, + 0x638: 0x55, 0x639: 0x55, 0x63a: 0x55, 0x63b: 0x55, 0x63c: 0x55, 0x63d: 0x55, 0x63e: 0x55, 0x63f: 0x55, + // Block 0x19, offset 0x640 + 0x640: 0x6b, 0x641: 0x6b, 0x642: 0x6b, 0x643: 0xfc, 0x644: 0xfd, 0x645: 0xfe, 0x646: 0xff, 0x647: 0x100, + 0x648: 0x6b, 0x649: 0x101, 0x64a: 0x55, 0x64b: 0x55, 0x64c: 0x6b, 0x64d: 0x102, 0x64e: 0x55, 0x64f: 0x55, + 0x650: 0x6b, 0x651: 0x103, 0x652: 0x104, 0x653: 0x105, 0x654: 0x106, 0x655: 0x107, 0x656: 0x6b, 0x657: 0x6b, + 0x658: 0x6b, 0x659: 0x6b, 0x65a: 0x108, 0x65b: 0x6b, 0x65c: 0x6b, 0x65d: 0x6b, 0x65e: 0x6b, 0x65f: 0x109, + 0x660: 0x6b, 0x661: 0x6b, 0x662: 0x6b, 0x663: 0x6b, 0x664: 0x6b, 0x665: 0x6b, 0x666: 0x6b, 0x667: 0x6b, + 0x668: 0x10a, 0x669: 0x10b, 0x66a: 0x10c, 0x66b: 0x55, 0x66c: 0x55, 0x66d: 0x55, 0x66e: 0x55, 0x66f: 0x55, + 0x670: 0x55, 0x671: 0x55, 0x672: 0x55, 0x673: 0x55, 0x674: 0x55, 0x675: 0x55, 0x676: 0x55, 0x677: 0x55, + 0x678: 0x55, 0x679: 0x55, 0x67a: 0x55, 0x67b: 0x55, 0x67c: 0x55, 0x67d: 0x55, 0x67e: 0x55, 0x67f: 0x55, + // Block 0x1a, offset 0x680 + 0x680: 0x55, 0x681: 0x55, 0x682: 0x55, 0x683: 0x55, 0x684: 0x55, 0x685: 0x55, 0x686: 0x55, 0x687: 0x55, + 0x688: 0x55, 0x689: 0x55, 0x68a: 0x55, 0x68b: 0x55, 0x68c: 0x55, 0x68d: 0x55, 0x68e: 0x55, 0x68f: 0x55, + 0x690: 0x55, 0x691: 0x55, 0x692: 0x55, 0x693: 0x55, 0x694: 0x55, 0x695: 0x55, 0x696: 0x55, 0x697: 0x55, + 0x698: 0x55, 0x699: 0x55, 0x69a: 0x55, 0x69b: 0x55, 0x69c: 0x55, 0x69d: 0x55, 0x69e: 0x55, 0x69f: 0x55, + 0x6a0: 0x05, 0x6a1: 0x05, 0x6a2: 0x05, 0x6a3: 0x10d, 0x6a4: 0x55, 0x6a5: 0x55, 0x6a6: 0x55, 0x6a7: 0x55, + 0x6a8: 0x55, 0x6a9: 0x55, 0x6aa: 0x55, 0x6ab: 0x55, 0x6ac: 0x55, 0x6ad: 0x55, 0x6ae: 0x55, 0x6af: 0x55, + 0x6b0: 0x55, 0x6b1: 0x55, 0x6b2: 0x55, 0x6b3: 0x55, 0x6b4: 0x55, 0x6b5: 0x55, 0x6b6: 0x55, 0x6b7: 0x55, + 0x6b8: 0x10e, 0x6b9: 0x10f, 0x6ba: 0x110, 0x6bb: 0x111, 0x6bc: 0x55, 0x6bd: 0x55, 0x6be: 0x55, 0x6bf: 0x55, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x112, 0x6c1: 0x6b, 0x6c2: 0x113, 0x6c3: 0x114, 0x6c4: 0x115, 0x6c5: 0x112, 0x6c6: 0x116, 0x6c7: 0x117, + 0x6c8: 0x118, 0x6c9: 0x119, 0x6ca: 0x55, 0x6cb: 0x55, 0x6cc: 0x6b, 0x6cd: 0x6b, 0x6ce: 0x6b, 0x6cf: 0x6b, + 0x6d0: 0x6b, 0x6d1: 0x6b, 0x6d2: 0x6b, 0x6d3: 0x6b, 0x6d4: 0x6b, 0x6d5: 0x11a, 0x6d6: 0x11b, 0x6d7: 0x6b, + 0x6d8: 0x6b, 0x6d9: 0x6b, 0x6da: 0x6b, 0x6db: 0x11c, 0x6dc: 0x6b, 0x6dd: 0x7c, 0x6de: 0x6b, 0x6df: 0x11d, + 0x6e0: 0x11e, 0x6e1: 0x11f, 0x6e2: 0x120, 0x6e3: 0x55, 0x6e4: 0x121, 0x6e5: 0x55, 0x6e6: 0x122, 0x6e7: 0x123, + 0x6e8: 0x55, 0x6e9: 0x55, 0x6ea: 0x55, 0x6eb: 0x55, 0x6ec: 0x55, 0x6ed: 0x55, 0x6ee: 0x55, 0x6ef: 0x55, + 0x6f0: 0x55, 0x6f1: 0x55, 0x6f2: 0x55, 0x6f3: 0x55, 0x6f4: 0x55, 0x6f5: 0x55, 0x6f6: 0x55, 0x6f7: 0x55, + 0x6f8: 0x55, 0x6f9: 0x55, 0x6fa: 0x55, 0x6fb: 0x55, 0x6fc: 0x55, 0x6fd: 0x55, 0x6fe: 0x55, 0x6ff: 0x55, + // Block 0x1c, offset 0x700 + 0x700: 0x05, 0x701: 0x05, 0x702: 0x05, 0x703: 0x05, 0x704: 0x05, 0x705: 0x05, 0x706: 0x05, 0x707: 0x05, + 0x708: 0x05, 0x709: 0x05, 0x70a: 0x05, 0x70b: 0x05, 0x70c: 0x05, 0x70d: 0x05, 0x70e: 0x05, 0x70f: 0x05, + 0x710: 0x05, 0x711: 0x05, 0x712: 0x05, 0x713: 0x05, 0x714: 0x05, 0x715: 0x05, 0x716: 0x05, 0x717: 0x05, + 0x718: 0x05, 0x719: 0x05, 0x71a: 0x05, 0x71b: 0x124, 0x71c: 0x05, 0x71d: 0x05, 0x71e: 0x05, 0x71f: 0x05, + 0x720: 0x05, 0x721: 0x05, 0x722: 0x05, 0x723: 0x05, 0x724: 0x05, 0x725: 0x05, 0x726: 0x05, 0x727: 0x05, + 0x728: 0x05, 0x729: 0x05, 0x72a: 0x05, 0x72b: 0x05, 0x72c: 0x05, 0x72d: 0x05, 0x72e: 0x05, 0x72f: 0x05, + 0x730: 0x05, 0x731: 0x05, 0x732: 0x05, 0x733: 0x05, 0x734: 0x05, 0x735: 0x05, 0x736: 0x05, 0x737: 0x05, + 0x738: 0x05, 0x739: 0x05, 0x73a: 0x05, 0x73b: 0x05, 0x73c: 0x05, 0x73d: 0x05, 0x73e: 0x05, 0x73f: 0x05, + // Block 0x1d, offset 0x740 + 0x740: 0x05, 0x741: 0x05, 0x742: 0x05, 0x743: 0x05, 0x744: 0x05, 0x745: 0x05, 0x746: 0x05, 0x747: 0x05, + 0x748: 0x05, 0x749: 0x05, 0x74a: 0x05, 0x74b: 0x05, 0x74c: 0x05, 0x74d: 0x05, 0x74e: 0x05, 0x74f: 0x05, + 0x750: 0x05, 0x751: 0x05, 0x752: 0x05, 0x753: 0x05, 0x754: 0x05, 0x755: 0x05, 0x756: 0x05, 0x757: 0x05, + 0x758: 0x05, 0x759: 0x05, 0x75a: 0x05, 0x75b: 0x05, 0x75c: 0x125, 0x75d: 0x05, 0x75e: 0x05, 0x75f: 0x05, + 0x760: 0x126, 0x761: 0x05, 0x762: 0x05, 0x763: 0x05, 0x764: 0x05, 0x765: 0x05, 0x766: 0x05, 0x767: 0x05, + 0x768: 0x05, 0x769: 0x05, 0x76a: 0x05, 0x76b: 0x05, 0x76c: 0x05, 0x76d: 0x05, 0x76e: 0x05, 0x76f: 0x05, + 0x770: 0x05, 0x771: 0x05, 0x772: 0x05, 0x773: 0x05, 0x774: 0x05, 0x775: 0x05, 0x776: 0x05, 0x777: 0x05, + 0x778: 0x05, 0x779: 0x05, 0x77a: 0x05, 0x77b: 0x05, 0x77c: 0x05, 0x77d: 0x05, 0x77e: 0x05, 0x77f: 0x05, + // Block 0x1e, offset 0x780 + 0x780: 0x05, 0x781: 0x05, 0x782: 0x05, 0x783: 0x05, 0x784: 0x05, 0x785: 0x05, 0x786: 0x05, 0x787: 0x05, + 0x788: 0x05, 0x789: 0x05, 0x78a: 0x05, 0x78b: 0x05, 0x78c: 0x05, 0x78d: 0x05, 0x78e: 0x05, 0x78f: 0x05, + 0x790: 0x05, 0x791: 0x05, 0x792: 0x05, 0x793: 0x05, 0x794: 0x05, 0x795: 0x05, 0x796: 0x05, 0x797: 0x05, + 0x798: 0x05, 0x799: 0x05, 0x79a: 0x05, 0x79b: 0x05, 0x79c: 0x05, 0x79d: 0x05, 0x79e: 0x05, 0x79f: 0x05, + 0x7a0: 0x05, 0x7a1: 0x05, 0x7a2: 0x05, 0x7a3: 0x05, 0x7a4: 0x05, 0x7a5: 0x05, 0x7a6: 0x05, 0x7a7: 0x05, + 0x7a8: 0x05, 0x7a9: 0x05, 0x7aa: 0x05, 0x7ab: 0x05, 0x7ac: 0x05, 0x7ad: 0x05, 0x7ae: 0x05, 0x7af: 0x05, + 0x7b0: 0x05, 0x7b1: 0x05, 0x7b2: 0x05, 0x7b3: 0x05, 0x7b4: 0x05, 0x7b5: 0x05, 0x7b6: 0x05, 0x7b7: 0x05, + 0x7b8: 0x05, 0x7b9: 0x05, 0x7ba: 0x127, 0x7bb: 0x55, 0x7bc: 0x55, 0x7bd: 0x55, 0x7be: 0x55, 0x7bf: 0x55, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x55, 0x7c1: 0x55, 0x7c2: 0x55, 0x7c3: 0x55, 0x7c4: 0x55, 0x7c5: 0x55, 0x7c6: 0x55, 0x7c7: 0x55, + 0x7c8: 0x55, 0x7c9: 0x55, 0x7ca: 0x55, 0x7cb: 0x55, 0x7cc: 0x55, 0x7cd: 0x55, 0x7ce: 0x55, 0x7cf: 0x55, + 0x7d0: 0x55, 0x7d1: 0x55, 0x7d2: 0x55, 0x7d3: 0x55, 0x7d4: 0x55, 0x7d5: 0x55, 0x7d6: 0x55, 0x7d7: 0x55, + 0x7d8: 0x55, 0x7d9: 0x55, 0x7da: 0x55, 0x7db: 0x55, 0x7dc: 0x55, 0x7dd: 0x55, 0x7de: 0x55, 0x7df: 0x55, + 0x7e0: 0x6b, 0x7e1: 0x6b, 0x7e2: 0x6b, 0x7e3: 0x6b, 0x7e4: 0x6b, 0x7e5: 0x6b, 0x7e6: 0x6b, 0x7e7: 0x6b, + 0x7e8: 0x128, 0x7e9: 0x55, 0x7ea: 0x55, 0x7eb: 0x55, 0x7ec: 0x55, 0x7ed: 0x55, 0x7ee: 0x55, 0x7ef: 0x55, + 0x7f0: 0x55, 0x7f1: 0x55, 0x7f2: 0x55, 0x7f3: 0x55, 0x7f4: 0x55, 0x7f5: 0x55, 0x7f6: 0x55, 0x7f7: 0x55, + 0x7f8: 0x55, 0x7f9: 0x55, 0x7fa: 0x55, 0x7fb: 0x55, 0x7fc: 0x55, 0x7fd: 0x55, 0x7fe: 0x55, 0x7ff: 0x55, + // Block 0x20, offset 0x800 + 0x810: 0x0f, 0x811: 0x10, 0x812: 0x11, 0x813: 0x12, 0x814: 0x13, 0x815: 0x14, 0x816: 0x15, 0x817: 0x14, + 0x818: 0x14, 0x819: 0x14, 0x81a: 0x14, 0x81b: 0x16, 0x81c: 0x14, 0x81d: 0x17, 0x81e: 0x18, 0x81f: 0x19, + 0x820: 0x07, 0x821: 0x07, 0x822: 0x07, 0x823: 0x07, 0x824: 0x07, 0x825: 0x07, 0x826: 0x07, 0x827: 0x07, + 0x828: 0x07, 0x829: 0x07, 0x82a: 0x1a, 0x82b: 0x1b, 0x82c: 0x1c, 0x82d: 0x14, 0x82e: 0x14, 0x82f: 0x1d, + 0x830: 0x14, 0x831: 0x14, 0x832: 0x14, 0x833: 0x14, 0x834: 0x14, 0x835: 0x14, 0x836: 0x14, 0x837: 0x14, + 0x838: 0x14, 0x839: 0x14, 0x83a: 0x14, 0x83b: 0x14, 0x83c: 0x14, 0x83d: 0x14, 0x83e: 0x14, 0x83f: 0x14, + // Block 0x21, offset 0x840 + 0x840: 0x14, 0x841: 0x14, 0x842: 0x14, 0x843: 0x14, 0x844: 0x14, 0x845: 0x14, 0x846: 0x14, 0x847: 0x14, + 0x848: 0x14, 0x849: 0x14, 0x84a: 0x14, 0x84b: 0x14, 0x84c: 0x14, 0x84d: 0x14, 0x84e: 0x14, 0x84f: 0x14, + 0x850: 0x14, 0x851: 0x14, 0x852: 0x14, 0x853: 0x14, 0x854: 0x14, 0x855: 0x14, 0x856: 0x14, 0x857: 0x14, + 0x858: 0x14, 0x859: 0x14, 0x85a: 0x14, 0x85b: 0x14, 0x85c: 0x14, 0x85d: 0x14, 0x85e: 0x14, 0x85f: 0x14, + 0x860: 0x14, 0x861: 0x14, 0x862: 0x14, 0x863: 0x14, 0x864: 0x14, 0x865: 0x14, 0x866: 0x14, 0x867: 0x14, + 0x868: 0x14, 0x869: 0x14, 0x86a: 0x14, 0x86b: 0x14, 0x86c: 0x14, 0x86d: 0x14, 0x86e: 0x14, 0x86f: 0x14, + 0x870: 0x14, 0x871: 0x14, 0x872: 0x14, 0x873: 0x14, 0x874: 0x14, 0x875: 0x14, 0x876: 0x14, 0x877: 0x14, + 0x878: 0x14, 0x879: 0x14, 0x87a: 0x14, 0x87b: 0x14, 0x87c: 0x14, 0x87d: 0x14, 0x87e: 0x14, 0x87f: 0x14, + // Block 0x22, offset 0x880 + 0x880: 0x129, 0x881: 0xa8, 0x882: 0x55, 0x883: 0x55, 0x884: 0xa8, 0x885: 0xa8, 0x886: 0xa8, 0x887: 0x12a, + 0x888: 0x55, 0x889: 0x55, 0x88a: 0x55, 0x88b: 0x55, 0x88c: 0x55, 0x88d: 0x55, 0x88e: 0x55, 0x88f: 0x55, + 0x890: 0x55, 0x891: 0x55, 0x892: 0x55, 0x893: 0x55, 0x894: 0x55, 0x895: 0x55, 0x896: 0x55, 0x897: 0x55, + 0x898: 0x55, 0x899: 0x55, 0x89a: 0x55, 0x89b: 0x55, 0x89c: 0x55, 0x89d: 0x55, 0x89e: 0x55, 0x89f: 0x55, + 0x8a0: 0x55, 0x8a1: 0x55, 0x8a2: 0x55, 0x8a3: 0x55, 0x8a4: 0x55, 0x8a5: 0x55, 0x8a6: 0x55, 0x8a7: 0x55, + 0x8a8: 0x55, 0x8a9: 0x55, 0x8aa: 0x55, 0x8ab: 0x55, 0x8ac: 0x55, 0x8ad: 0x55, 0x8ae: 0x55, 0x8af: 0x55, + 0x8b0: 0x55, 0x8b1: 0x55, 0x8b2: 0x55, 0x8b3: 0x55, 0x8b4: 0x55, 0x8b5: 0x55, 0x8b6: 0x55, 0x8b7: 0x55, + 0x8b8: 0x55, 0x8b9: 0x55, 0x8ba: 0x55, 0x8bb: 0x55, 0x8bc: 0x55, 0x8bd: 0x55, 0x8be: 0x55, 0x8bf: 0x55, + // Block 0x23, offset 0x8c0 + 0x8c0: 0xa8, 0x8c1: 0xa8, 0x8c2: 0xa8, 0x8c3: 0xa8, 0x8c4: 0xa8, 0x8c5: 0xa8, 0x8c6: 0xa8, 0x8c7: 0xa8, + 0x8c8: 0xa8, 0x8c9: 0xa8, 0x8ca: 0xa8, 0x8cb: 0xa8, 0x8cc: 0xa8, 0x8cd: 0xa8, 0x8ce: 0xa8, 0x8cf: 0xa8, + 0x8d0: 0xa8, 0x8d1: 0xa8, 0x8d2: 0xa8, 0x8d3: 0xa8, 0x8d4: 0xa8, 0x8d5: 0xa8, 0x8d6: 0xa8, 0x8d7: 0xa8, + 0x8d8: 0xa8, 0x8d9: 0xa8, 0x8da: 0xa8, 0x8db: 0xa8, 0x8dc: 0xa8, 0x8dd: 0xa8, 0x8de: 0xa8, 0x8df: 0xa8, + 0x8e0: 0xa8, 0x8e1: 0xa8, 0x8e2: 0xa8, 0x8e3: 0xa8, 0x8e4: 0xa8, 0x8e5: 0xa8, 0x8e6: 0xa8, 0x8e7: 0xa8, + 0x8e8: 0xa8, 0x8e9: 0xa8, 0x8ea: 0xa8, 0x8eb: 0xa8, 0x8ec: 0xa8, 0x8ed: 0xa8, 0x8ee: 0xa8, 0x8ef: 0xa8, + 0x8f0: 0xa8, 0x8f1: 0xa8, 0x8f2: 0xa8, 0x8f3: 0xa8, 0x8f4: 0xa8, 0x8f5: 0xa8, 0x8f6: 0xa8, 0x8f7: 0xa8, + 0x8f8: 0xa8, 0x8f9: 0xa8, 0x8fa: 0xa8, 0x8fb: 0xa8, 0x8fc: 0xa8, 0x8fd: 0xa8, 0x8fe: 0xa8, 0x8ff: 0x12b, + // Block 0x24, offset 0x900 + 0x900: 0x14, 0x901: 0x14, 0x902: 0x14, 0x903: 0x14, 0x904: 0x14, 0x905: 0x14, 0x906: 0x14, 0x907: 0x14, + 0x908: 0x14, 0x909: 0x14, 0x90a: 0x14, 0x90b: 0x14, 0x90c: 0x14, 0x90d: 0x14, 0x90e: 0x14, 0x90f: 0x14, + 0x910: 0x14, 0x911: 0x14, 0x912: 0x14, 0x913: 0x14, 0x914: 0x14, 0x915: 0x14, 0x916: 0x14, 0x917: 0x14, + 0x918: 0x14, 0x919: 0x14, 0x91a: 0x14, 0x91b: 0x14, 0x91c: 0x14, 0x91d: 0x14, 0x91e: 0x14, 0x91f: 0x14, + 0x920: 0x20, 0x921: 0x14, 0x922: 0x14, 0x923: 0x14, 0x924: 0x14, 0x925: 0x14, 0x926: 0x14, 0x927: 0x14, + 0x928: 0x14, 0x929: 0x14, 0x92a: 0x14, 0x92b: 0x14, 0x92c: 0x14, 0x92d: 0x14, 0x92e: 0x14, 0x92f: 0x14, + 0x930: 0x0d, 0x931: 0x0d, 0x932: 0x0d, 0x933: 0x0d, 0x934: 0x0d, 0x935: 0x0d, 0x936: 0x0d, 0x937: 0x0d, + 0x938: 0x0d, 0x939: 0x0d, 0x93a: 0x0d, 0x93b: 0x0d, 0x93c: 0x0d, 0x93d: 0x0d, 0x93e: 0x0d, 0x93f: 0x21, + // Block 0x25, offset 0x940 + 0x940: 0xa8, 0x941: 0xa8, 0x942: 0xa8, 0x943: 0xa8, 0x944: 0xa8, 0x945: 0xa8, 0x946: 0xa8, 0x947: 0xa8, + 0x948: 0xa8, 0x949: 0xa8, 0x94a: 0xa8, 0x94b: 0xa8, 0x94c: 0xa8, 0x94d: 0xa8, 0x94e: 0xa8, 0x94f: 0xa8, + 0x950: 0xa8, 0x951: 0xa8, 0x952: 0xa8, 0x953: 0xa8, 0x954: 0xa8, 0x955: 0xa8, 0x956: 0xa8, 0x957: 0xa8, + 0x958: 0xa8, 0x959: 0xa8, 0x95a: 0xa8, 0x95b: 0xa8, 0x95c: 0xa8, 0x95d: 0xa8, 0x95e: 0xa8, 0x95f: 0xa8, + 0x960: 0xa8, 0x961: 0xa8, 0x962: 0xa8, 0x963: 0xa8, 0x964: 0xa8, 0x965: 0xa8, 0x966: 0xa8, 0x967: 0xa8, + 0x968: 0xa8, 0x969: 0xa8, 0x96a: 0xa8, 0x96b: 0xa8, 0x96c: 0xa8, 0x96d: 0xa8, 0x96e: 0xa8, 0x96f: 0xa8, + 0x970: 0xa8, 0x971: 0xa8, 0x972: 0xa8, 0x973: 0xa8, 0x974: 0xa8, 0x975: 0xa8, 0x976: 0xa8, 0x977: 0xa8, + 0x978: 0xa8, 0x979: 0xa8, 0x97a: 0xa8, 0x97b: 0xa8, 0x97c: 0xa8, 0x97d: 0xa8, 0x97e: 0xa8, 0x97f: 0x12c, + // Block 0x26, offset 0x980 + 0x980: 0x0d, 0x981: 0x0d, 0x982: 0x0d, 0x983: 0x0d, 0x984: 0x0d, 0x985: 0x0d, 0x986: 0x0d, 0x987: 0x0d, + 0x988: 0x0d, 0x989: 0x0d, 0x98a: 0x0d, 0x98b: 0x0d, 0x98c: 0x0d, 0x98d: 0x0d, 0x98e: 0x0d, 0x98f: 0x23, +} + +// Total table size 24384 bytes (23KiB); checksum: 811C9DC5 diff --git a/vendor/golang.org/x/text/secure/precis/tables_test.go b/vendor/golang.org/x/text/secure/precis/tables_test.go new file mode 100644 index 0000000000..13ad2a5c3a --- /dev/null +++ b/vendor/golang.org/x/text/secure/precis/tables_test.go @@ -0,0 +1,68 @@ +// 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 precis + +import ( + "testing" + "unicode" + "unicode/utf8" + + "golang.org/x/text/runes" + "golang.org/x/text/unicode/rangetable" +) + +type tableTest struct { + rangeTable *unicode.RangeTable + prop property +} + +var exceptions = runes.Predicate(func(r rune) bool { + switch uint32(r) { + case 0x00DF, 0x03C2, 0x06FD, 0x06FE, 0x0F0B, 0x3007, 0x00B7, 0x0375, 0x05F3, + 0x05F4, 0x30FB, 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, + 0x0667, 0x0668, 0x0669, 0x06F0, 0x06F1, 0x06F2, 0x06F3, 0x06F4, 0x06F5, + 0x06F6, 0x06F7, 0x06F8, 0x06F9, 0x0640, 0x07FA, 0x302E, 0x302F, 0x3031, + 0x3032, 0x3033, 0x3034, 0x3035, 0x303B: + return true + default: + return false + } +}) + +func (tt *tableTest) run(t *testing.T) { + rangetable.Visit(tt.rangeTable, func(r rune) { + b := make([]byte, 4) + n := utf8.EncodeRune(b, r) + trieval, _ := dpTrie.lookup(b[:n]) + p := property(trieval) + if p != tt.prop && !exceptions.Contains(r) { + t.Fail() + } + }) +} + +// Ensure that ceratain properties were generated correctly. +func TestTable(t *testing.T) { + tests := []tableTest{ + tableTest{ + rangetable.Merge( + unicode.Lt, unicode.Nl, unicode.No, // Other letter digits + unicode.Me, // Modifiers + unicode.Zs, // Spaces + unicode.So, // Symbols + unicode.Pi, unicode.Pf, // Punctuation + ), + freePVal | idDis, + }, + tableTest{ + rangetable.New(0x30000, 0x30101, 0xDFFFF), + unassigned, + }, + } + + for _, test := range tests { + test.run(t) + } +} diff --git a/vendor/golang.org/x/text/secure/precis/transformer.go b/vendor/golang.org/x/text/secure/precis/transformer.go new file mode 100644 index 0000000000..1f403226c3 --- /dev/null +++ b/vendor/golang.org/x/text/secure/precis/transformer.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 precis + +import ( + "golang.org/x/text/transform" +) + +// Transformer implements the transform.Transformer interface. +type Transformer struct { + t transform.Transformer +} + +// Reset implements the transform.Transformer interface. +func (t Transformer) Reset() { t.t.Reset() } + +// Transform implements the transform.Transformer interface. +func (t Transformer) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + return t.t.Transform(dst, src, atEOF) +} + +// Bytes returns a new byte slice with the result of applying t to b. +func (t Transformer) Bytes(b []byte) []byte { + b, _, _ = transform.Bytes(t, b) + return b +} + +// String returns a string with the result of applying t to s. +func (t Transformer) String(s string) string { + s, _, _ = transform.String(t, s) + return s +} diff --git a/vendor/golang.org/x/text/secure/precis/trieval.go b/vendor/golang.org/x/text/secure/precis/trieval.go new file mode 100644 index 0000000000..d1e011af56 --- /dev/null +++ b/vendor/golang.org/x/text/secure/precis/trieval.go @@ -0,0 +1,15 @@ +// This file was generated by go generate; DO NOT EDIT + +package precis + +type property int + +const ( + pValid property = 1 << iota + contextO + contextJ + disallowed + unassigned + freePVal + idDis +) diff --git a/vendor/golang.org/x/text/transform/examples_test.go b/vendor/golang.org/x/text/transform/examples_test.go new file mode 100644 index 0000000000..f2e284dba5 --- /dev/null +++ b/vendor/golang.org/x/text/transform/examples_test.go @@ -0,0 +1,37 @@ +// Copyright 2013 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 transform_test + +import ( + "fmt" + "unicode" + + "golang.org/x/text/transform" + "golang.org/x/text/unicode/norm" +) + +func ExampleRemoveFunc() { + input := []byte(`tschüß; до свидания`) + + b := make([]byte, len(input)) + + t := transform.RemoveFunc(unicode.IsSpace) + n, _, _ := t.Transform(b, input, true) + fmt.Println(string(b[:n])) + + t = transform.RemoveFunc(func(r rune) bool { + return !unicode.Is(unicode.Latin, r) + }) + n, _, _ = t.Transform(b, input, true) + fmt.Println(string(b[:n])) + + n, _, _ = t.Transform(b, norm.NFD.Bytes(input), true) + fmt.Println(string(b[:n])) + + // Output: + // tschüß;досвидания + // tschüß + // tschuß +} diff --git a/vendor/golang.org/x/text/transform/transform.go b/vendor/golang.org/x/text/transform/transform.go new file mode 100644 index 0000000000..b46829143a --- /dev/null +++ b/vendor/golang.org/x/text/transform/transform.go @@ -0,0 +1,630 @@ +// Copyright 2013 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 transform provides reader and writer wrappers that transform the +// bytes passing through as well as various transformations. Example +// transformations provided by other packages include normalization and +// conversion between character sets. +package transform // import "golang.org/x/text/transform" + +import ( + "bytes" + "errors" + "io" + "unicode/utf8" +) + +var ( + // ErrShortDst means that the destination buffer was too short to + // receive all of the transformed bytes. + ErrShortDst = errors.New("transform: short destination buffer") + + // ErrShortSrc means that the source buffer has insufficient data to + // complete the transformation. + ErrShortSrc = errors.New("transform: short source buffer") + + // errInconsistentByteCount means that Transform returned success (nil + // error) but also returned nSrc inconsistent with the src argument. + errInconsistentByteCount = errors.New("transform: inconsistent byte count returned") + + // errShortInternal means that an internal buffer is not large enough + // to make progress and the Transform operation must be aborted. + errShortInternal = errors.New("transform: short internal buffer") +) + +// Transformer transforms bytes. +type Transformer interface { + // Transform writes to dst the transformed bytes read from src, and + // returns the number of dst bytes written and src bytes read. The + // atEOF argument tells whether src represents the last bytes of the + // input. + // + // Callers should always process the nDst bytes produced and account + // for the nSrc bytes consumed before considering the error err. + // + // A nil error means that all of the transformed bytes (whether freshly + // transformed from src or left over from previous Transform calls) + // were written to dst. A nil error can be returned regardless of + // whether atEOF is true. If err is nil then nSrc must equal len(src); + // the converse is not necessarily true. + // + // ErrShortDst means that dst was too short to receive all of the + // transformed bytes. ErrShortSrc means that src had insufficient data + // to complete the transformation. If both conditions apply, then + // either error may be returned. Other than the error conditions listed + // here, implementations are free to report other errors that arise. + Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) + + // Reset resets the state and allows a Transformer to be reused. + Reset() +} + +// NopResetter can be embedded by implementations of Transformer to add a nop +// Reset method. +type NopResetter struct{} + +// Reset implements the Reset method of the Transformer interface. +func (NopResetter) Reset() {} + +// Reader wraps another io.Reader by transforming the bytes read. +type Reader struct { + r io.Reader + t Transformer + err error + + // dst[dst0:dst1] contains bytes that have been transformed by t but + // not yet copied out via Read. + dst []byte + dst0, dst1 int + + // src[src0:src1] contains bytes that have been read from r but not + // yet transformed through t. + src []byte + src0, src1 int + + // transformComplete is whether the transformation is complete, + // regardless of whether or not it was successful. + transformComplete bool +} + +const defaultBufSize = 4096 + +// NewReader returns a new Reader that wraps r by transforming the bytes read +// via t. It calls Reset on t. +func NewReader(r io.Reader, t Transformer) *Reader { + t.Reset() + return &Reader{ + r: r, + t: t, + dst: make([]byte, defaultBufSize), + src: make([]byte, defaultBufSize), + } +} + +// Read implements the io.Reader interface. +func (r *Reader) Read(p []byte) (int, error) { + n, err := 0, error(nil) + for { + // Copy out any transformed bytes and return the final error if we are done. + if r.dst0 != r.dst1 { + n = copy(p, r.dst[r.dst0:r.dst1]) + r.dst0 += n + if r.dst0 == r.dst1 && r.transformComplete { + return n, r.err + } + return n, nil + } else if r.transformComplete { + return 0, r.err + } + + // Try to transform some source bytes, or to flush the transformer if we + // are out of source bytes. We do this even if r.r.Read returned an error. + // As the io.Reader documentation says, "process the n > 0 bytes returned + // before considering the error". + if r.src0 != r.src1 || r.err != nil { + r.dst0 = 0 + r.dst1, n, err = r.t.Transform(r.dst, r.src[r.src0:r.src1], r.err == io.EOF) + r.src0 += n + + switch { + case err == nil: + if r.src0 != r.src1 { + r.err = errInconsistentByteCount + } + // The Transform call was successful; we are complete if we + // cannot read more bytes into src. + r.transformComplete = r.err != nil + continue + case err == ErrShortDst && (r.dst1 != 0 || n != 0): + // Make room in dst by copying out, and try again. + continue + case err == ErrShortSrc && r.src1-r.src0 != len(r.src) && r.err == nil: + // Read more bytes into src via the code below, and try again. + default: + r.transformComplete = true + // The reader error (r.err) takes precedence over the + // transformer error (err) unless r.err is nil or io.EOF. + if r.err == nil || r.err == io.EOF { + r.err = err + } + continue + } + } + + // Move any untransformed source bytes to the start of the buffer + // and read more bytes. + if r.src0 != 0 { + r.src0, r.src1 = 0, copy(r.src, r.src[r.src0:r.src1]) + } + n, r.err = r.r.Read(r.src[r.src1:]) + r.src1 += n + } +} + +// TODO: implement ReadByte (and ReadRune??). + +// Writer wraps another io.Writer by transforming the bytes read. +// The user needs to call Close to flush unwritten bytes that may +// be buffered. +type Writer struct { + w io.Writer + t Transformer + dst []byte + + // src[:n] contains bytes that have not yet passed through t. + src []byte + n int +} + +// NewWriter returns a new Writer that wraps w by transforming the bytes written +// via t. It calls Reset on t. +func NewWriter(w io.Writer, t Transformer) *Writer { + t.Reset() + return &Writer{ + w: w, + t: t, + dst: make([]byte, defaultBufSize), + src: make([]byte, defaultBufSize), + } +} + +// Write implements the io.Writer interface. If there are not enough +// bytes available to complete a Transform, the bytes will be buffered +// for the next write. Call Close to convert the remaining bytes. +func (w *Writer) Write(data []byte) (n int, err error) { + src := data + if w.n > 0 { + // Append bytes from data to the last remainder. + // TODO: limit the amount copied on first try. + n = copy(w.src[w.n:], data) + w.n += n + src = w.src[:w.n] + } + for { + nDst, nSrc, err := w.t.Transform(w.dst, src, false) + if _, werr := w.w.Write(w.dst[:nDst]); werr != nil { + return n, werr + } + src = src[nSrc:] + if w.n > 0 && len(src) <= n { + // Enough bytes from w.src have been consumed. We make src point + // to data instead to reduce the copying. + w.n = 0 + n -= len(src) + src = data[n:] + if n < len(data) && (err == nil || err == ErrShortSrc) { + continue + } + } else { + n += nSrc + } + switch { + case err == ErrShortDst && (nDst > 0 || nSrc > 0): + case err == ErrShortSrc && len(src) < len(w.src): + m := copy(w.src, src) + // If w.n > 0, bytes from data were already copied to w.src and n + // was already set to the number of bytes consumed. + if w.n == 0 { + n += m + } + w.n = m + return n, nil + case err == nil && w.n > 0: + return n, errInconsistentByteCount + default: + return n, err + } + } +} + +// Close implements the io.Closer interface. +func (w *Writer) Close() error { + for src := w.src[:w.n]; len(src) > 0; { + nDst, nSrc, err := w.t.Transform(w.dst, src, true) + if nDst == 0 { + return err + } + if _, werr := w.w.Write(w.dst[:nDst]); werr != nil { + return werr + } + if err != ErrShortDst { + return err + } + src = src[nSrc:] + } + return nil +} + +type nop struct{ NopResetter } + +func (nop) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + n := copy(dst, src) + if n < len(src) { + err = ErrShortDst + } + return n, n, err +} + +type discard struct{ NopResetter } + +func (discard) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + return 0, len(src), nil +} + +var ( + // Discard is a Transformer for which all Transform calls succeed + // by consuming all bytes and writing nothing. + Discard Transformer = discard{} + + // Nop is a Transformer that copies src to dst. + Nop Transformer = nop{} +) + +// chain is a sequence of links. A chain with N Transformers has N+1 links and +// N+1 buffers. Of those N+1 buffers, the first and last are the src and dst +// buffers given to chain.Transform and the middle N-1 buffers are intermediate +// buffers owned by the chain. The i'th link transforms bytes from the i'th +// buffer chain.link[i].b at read offset chain.link[i].p to the i+1'th buffer +// chain.link[i+1].b at write offset chain.link[i+1].n, for i in [0, N). +type chain struct { + link []link + err error + // errStart is the index at which the error occurred plus 1. Processing + // errStart at this level at the next call to Transform. As long as + // errStart > 0, chain will not consume any more source bytes. + errStart int +} + +func (c *chain) fatalError(errIndex int, err error) { + if i := errIndex + 1; i > c.errStart { + c.errStart = i + c.err = err + } +} + +type link struct { + t Transformer + // b[p:n] holds the bytes to be transformed by t. + b []byte + p int + n int +} + +func (l *link) src() []byte { + return l.b[l.p:l.n] +} + +func (l *link) dst() []byte { + return l.b[l.n:] +} + +// Chain returns a Transformer that applies t in sequence. +func Chain(t ...Transformer) Transformer { + if len(t) == 0 { + return nop{} + } + c := &chain{link: make([]link, len(t)+1)} + for i, tt := range t { + c.link[i].t = tt + } + // Allocate intermediate buffers. + b := make([][defaultBufSize]byte, len(t)-1) + for i := range b { + c.link[i+1].b = b[i][:] + } + return c +} + +// Reset resets the state of Chain. It calls Reset on all the Transformers. +func (c *chain) Reset() { + for i, l := range c.link { + if l.t != nil { + l.t.Reset() + } + c.link[i].p, c.link[i].n = 0, 0 + } +} + +// Transform applies the transformers of c in sequence. +func (c *chain) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + // Set up src and dst in the chain. + srcL := &c.link[0] + dstL := &c.link[len(c.link)-1] + srcL.b, srcL.p, srcL.n = src, 0, len(src) + dstL.b, dstL.n = dst, 0 + var lastFull, needProgress bool // for detecting progress + + // i is the index of the next Transformer to apply, for i in [low, high]. + // low is the lowest index for which c.link[low] may still produce bytes. + // high is the highest index for which c.link[high] has a Transformer. + // The error returned by Transform determines whether to increase or + // decrease i. We try to completely fill a buffer before converting it. + for low, i, high := c.errStart, c.errStart, len(c.link)-2; low <= i && i <= high; { + in, out := &c.link[i], &c.link[i+1] + nDst, nSrc, err0 := in.t.Transform(out.dst(), in.src(), atEOF && low == i) + out.n += nDst + in.p += nSrc + if i > 0 && in.p == in.n { + in.p, in.n = 0, 0 + } + needProgress, lastFull = lastFull, false + switch err0 { + case ErrShortDst: + // Process the destination buffer next. Return if we are already + // at the high index. + if i == high { + return dstL.n, srcL.p, ErrShortDst + } + if out.n != 0 { + i++ + // If the Transformer at the next index is not able to process any + // source bytes there is nothing that can be done to make progress + // and the bytes will remain unprocessed. lastFull is used to + // detect this and break out of the loop with a fatal error. + lastFull = true + continue + } + // The destination buffer was too small, but is completely empty. + // Return a fatal error as this transformation can never complete. + c.fatalError(i, errShortInternal) + case ErrShortSrc: + if i == 0 { + // Save ErrShortSrc in err. All other errors take precedence. + err = ErrShortSrc + break + } + // Source bytes were depleted before filling up the destination buffer. + // Verify we made some progress, move the remaining bytes to the errStart + // and try to get more source bytes. + if needProgress && nSrc == 0 || in.n-in.p == len(in.b) { + // There were not enough source bytes to proceed while the source + // buffer cannot hold any more bytes. Return a fatal error as this + // transformation can never complete. + c.fatalError(i, errShortInternal) + break + } + // in.b is an internal buffer and we can make progress. + in.p, in.n = 0, copy(in.b, in.src()) + fallthrough + case nil: + // if i == low, we have depleted the bytes at index i or any lower levels. + // In that case we increase low and i. In all other cases we decrease i to + // fetch more bytes before proceeding to the next index. + if i > low { + i-- + continue + } + default: + c.fatalError(i, err0) + } + // Exhausted level low or fatal error: increase low and continue + // to process the bytes accepted so far. + i++ + low = i + } + + // If c.errStart > 0, this means we found a fatal error. We will clear + // all upstream buffers. At this point, no more progress can be made + // downstream, as Transform would have bailed while handling ErrShortDst. + if c.errStart > 0 { + for i := 1; i < c.errStart; i++ { + c.link[i].p, c.link[i].n = 0, 0 + } + err, c.errStart, c.err = c.err, 0, nil + } + return dstL.n, srcL.p, err +} + +// RemoveFunc returns a Transformer that removes from the input all runes r for +// which f(r) is true. Illegal bytes in the input are replaced by RuneError. +func RemoveFunc(f func(r rune) bool) Transformer { + return removeF(f) +} + +type removeF func(r rune) bool + +func (removeF) Reset() {} + +// Transform implements the Transformer interface. +func (t removeF) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + for r, sz := rune(0), 0; len(src) > 0; src = src[sz:] { + + if r = rune(src[0]); r < utf8.RuneSelf { + sz = 1 + } else { + r, sz = utf8.DecodeRune(src) + + if sz == 1 { + // Invalid rune. + if !atEOF && !utf8.FullRune(src) { + err = ErrShortSrc + break + } + // We replace illegal bytes with RuneError. Not doing so might + // otherwise turn a sequence of invalid UTF-8 into valid UTF-8. + // The resulting byte sequence may subsequently contain runes + // for which t(r) is true that were passed unnoticed. + if !t(r) { + if nDst+3 > len(dst) { + err = ErrShortDst + break + } + nDst += copy(dst[nDst:], "\uFFFD") + } + nSrc++ + continue + } + } + + if !t(r) { + if nDst+sz > len(dst) { + err = ErrShortDst + break + } + nDst += copy(dst[nDst:], src[:sz]) + } + nSrc += sz + } + return +} + +// grow returns a new []byte that is longer than b, and copies the first n bytes +// of b to the start of the new slice. +func grow(b []byte, n int) []byte { + m := len(b) + if m <= 256 { + m *= 2 + } else { + m += m >> 1 + } + buf := make([]byte, m) + copy(buf, b[:n]) + return buf +} + +const initialBufSize = 128 + +// String returns a string with the result of converting s[:n] using t, where +// n <= len(s). If err == nil, n will be len(s). It calls Reset on t. +func String(t Transformer, s string) (result string, n int, err error) { + if s == "" { + return "", 0, nil + } + + t.Reset() + + // Allocate only once. Note that both dst and src escape when passed to + // Transform. + buf := [2 * initialBufSize]byte{} + dst := buf[:initialBufSize:initialBufSize] + src := buf[initialBufSize : 2*initialBufSize] + + // Avoid allocation if the transformed string is identical to the original. + // After this loop, pDst will point to the furthest point in s for which it + // could be detected that t gives equal results, src[:nSrc] will + // indicated the last processed chunk of s for which the output is not equal + // and dst[:nDst] will be the transform of this chunk. + var nDst, nSrc int + pDst := 0 // Used as index in both src and dst in this loop. + for { + n := copy(src, s[pDst:]) + nDst, nSrc, err = t.Transform(dst, src[:n], pDst+n == len(s)) + + // Note 1: we will not enter the loop with pDst == len(s) and we will + // not end the loop with it either. So if nSrc is 0, this means there is + // some kind of error from which we cannot recover given the current + // buffer sizes. We will give up in this case. + // Note 2: it is not entirely correct to simply do a bytes.Equal as + // a Transformer may buffer internally. It will work in most cases, + // though, and no harm is done if it doesn't work. + // TODO: let transformers implement an optional Spanner interface, akin + // to norm's QuickSpan. This would even allow us to avoid any allocation. + if nSrc == 0 || !bytes.Equal(dst[:nDst], src[:nSrc]) { + break + } + + if pDst += nDst; pDst == len(s) { + return s, pDst, nil + } + } + + // Move the bytes seen so far to dst. + pSrc := pDst + nSrc + if pDst+nDst <= initialBufSize { + copy(dst[pDst:], dst[:nDst]) + } else { + b := make([]byte, len(s)+nDst-nSrc) + copy(b[pDst:], dst[:nDst]) + dst = b + } + copy(dst, s[:pDst]) + pDst += nDst + + if err != nil && err != ErrShortDst && err != ErrShortSrc { + return string(dst[:pDst]), pSrc, err + } + + // Complete the string with the remainder. + for { + n := copy(src, s[pSrc:]) + nDst, nSrc, err = t.Transform(dst[pDst:], src[:n], pSrc+n == len(s)) + pDst += nDst + pSrc += nSrc + + switch err { + case nil: + if pSrc == len(s) { + return string(dst[:pDst]), pSrc, nil + } + case ErrShortDst: + // Do not grow as long as we can make progress. This may avoid + // excessive allocations. + if nDst == 0 { + dst = grow(dst, pDst) + } + case ErrShortSrc: + if nSrc == 0 { + src = grow(src, 0) + } + default: + return string(dst[:pDst]), pSrc, err + } + } +} + +// Bytes returns a new byte slice with the result of converting b[:n] using t, +// where n <= len(b). If err == nil, n will be len(b). It calls Reset on t. +func Bytes(t Transformer, b []byte) (result []byte, n int, err error) { + return doAppend(t, 0, make([]byte, len(b)), b) +} + +// Append appends the result of converting src[:n] using t to dst, where +// n <= len(src), If err == nil, n will be len(src). It calls Reset on t. +func Append(t Transformer, dst, src []byte) (result []byte, n int, err error) { + if len(dst) == cap(dst) { + n := len(src) + len(dst) // It is okay for this to be 0. + b := make([]byte, n) + dst = b[:copy(b, dst)] + } + return doAppend(t, len(dst), dst[:cap(dst)], src) +} + +func doAppend(t Transformer, pDst int, dst, src []byte) (result []byte, n int, err error) { + t.Reset() + pSrc := 0 + for { + nDst, nSrc, err := t.Transform(dst[pDst:], src[pSrc:], true) + pDst += nDst + pSrc += nSrc + if err != ErrShortDst { + return dst[:pDst], pSrc, err + } + + // Grow the destination buffer, but do not grow as long as we can make + // progress. This may avoid excessive allocations. + if nDst == 0 { + dst = grow(dst, pDst) + } + } +} diff --git a/vendor/golang.org/x/text/transform/transform_test.go b/vendor/golang.org/x/text/transform/transform_test.go new file mode 100644 index 0000000000..9dd9713b48 --- /dev/null +++ b/vendor/golang.org/x/text/transform/transform_test.go @@ -0,0 +1,1101 @@ +// Copyright 2013 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 transform + +import ( + "bytes" + "errors" + "fmt" + "io/ioutil" + "strconv" + "strings" + "testing" + "time" + "unicode/utf8" +) + +type lowerCaseASCII struct{ NopResetter } + +func (lowerCaseASCII) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + n := len(src) + if n > len(dst) { + n, err = len(dst), ErrShortDst + } + for i, c := range src[:n] { + if 'A' <= c && c <= 'Z' { + c += 'a' - 'A' + } + dst[i] = c + } + return n, n, err +} + +var errYouMentionedX = errors.New("you mentioned X") + +type dontMentionX struct{ NopResetter } + +func (dontMentionX) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + n := len(src) + if n > len(dst) { + n, err = len(dst), ErrShortDst + } + for i, c := range src[:n] { + if c == 'X' { + return i, i, errYouMentionedX + } + dst[i] = c + } + return n, n, err +} + +// doublerAtEOF is a strange Transformer that transforms "this" to "tthhiiss", +// but only if atEOF is true. +type doublerAtEOF struct{ NopResetter } + +func (doublerAtEOF) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + if !atEOF { + return 0, 0, ErrShortSrc + } + for i, c := range src { + if 2*i+2 >= len(dst) { + return 2 * i, i, ErrShortDst + } + dst[2*i+0] = c + dst[2*i+1] = c + } + return 2 * len(src), len(src), nil +} + +// rleDecode and rleEncode implement a toy run-length encoding: "aabbbbbbbbbb" +// is encoded as "2a10b". The decoding is assumed to not contain any numbers. + +type rleDecode struct{ NopResetter } + +func (rleDecode) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { +loop: + for len(src) > 0 { + n := 0 + for i, c := range src { + if '0' <= c && c <= '9' { + n = 10*n + int(c-'0') + continue + } + if i == 0 { + return nDst, nSrc, errors.New("rleDecode: bad input") + } + if n > len(dst) { + return nDst, nSrc, ErrShortDst + } + for j := 0; j < n; j++ { + dst[j] = c + } + dst, src = dst[n:], src[i+1:] + nDst, nSrc = nDst+n, nSrc+i+1 + continue loop + } + if atEOF { + return nDst, nSrc, errors.New("rleDecode: bad input") + } + return nDst, nSrc, ErrShortSrc + } + return nDst, nSrc, nil +} + +type rleEncode struct { + NopResetter + + // allowStutter means that "xxxxxxxx" can be encoded as "5x3x" + // instead of always as "8x". + allowStutter bool +} + +func (e rleEncode) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + for len(src) > 0 { + n, c0 := len(src), src[0] + for i, c := range src[1:] { + if c != c0 { + n = i + 1 + break + } + } + if n == len(src) && !atEOF && !e.allowStutter { + return nDst, nSrc, ErrShortSrc + } + s := strconv.Itoa(n) + if len(s) >= len(dst) { + return nDst, nSrc, ErrShortDst + } + copy(dst, s) + dst[len(s)] = c0 + dst, src = dst[len(s)+1:], src[n:] + nDst, nSrc = nDst+len(s)+1, nSrc+n + } + return nDst, nSrc, nil +} + +// trickler consumes all input bytes, but writes a single byte at a time to dst. +type trickler []byte + +func (t *trickler) Reset() { + *t = nil +} + +func (t *trickler) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + *t = append(*t, src...) + if len(*t) == 0 { + return 0, 0, nil + } + if len(dst) == 0 { + return 0, len(src), ErrShortDst + } + dst[0] = (*t)[0] + *t = (*t)[1:] + if len(*t) > 0 { + err = ErrShortDst + } + return 1, len(src), err +} + +// delayedTrickler is like trickler, but delays writing output to dst. This is +// highly unlikely to be relevant in practice, but it seems like a good idea +// to have some tolerance as long as progress can be detected. +type delayedTrickler []byte + +func (t *delayedTrickler) Reset() { + *t = nil +} +func (t *delayedTrickler) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + if len(*t) > 0 && len(dst) > 0 { + dst[0] = (*t)[0] + *t = (*t)[1:] + nDst = 1 + } + *t = append(*t, src...) + if len(*t) > 0 { + err = ErrShortDst + } + return nDst, len(src), err +} + +type testCase struct { + desc string + t Transformer + src string + dstSize int + srcSize int + ioSize int + wantStr string + wantErr error + wantIter int // number of iterations taken; 0 means we don't care. +} + +func (t testCase) String() string { + return tstr(t.t) + "; " + t.desc +} + +func tstr(t Transformer) string { + if stringer, ok := t.(fmt.Stringer); ok { + return stringer.String() + } + s := fmt.Sprintf("%T", t) + return s[1+strings.Index(s, "."):] +} + +func (c chain) String() string { + buf := &bytes.Buffer{} + buf.WriteString("Chain(") + for i, l := range c.link[:len(c.link)-1] { + if i != 0 { + fmt.Fprint(buf, ", ") + } + buf.WriteString(tstr(l.t)) + } + buf.WriteString(")") + return buf.String() +} + +var testCases = []testCase{ + { + desc: "empty", + t: lowerCaseASCII{}, + src: "", + dstSize: 100, + srcSize: 100, + wantStr: "", + }, + + { + desc: "basic", + t: lowerCaseASCII{}, + src: "Hello WORLD.", + dstSize: 100, + srcSize: 100, + wantStr: "hello world.", + }, + + { + desc: "small dst", + t: lowerCaseASCII{}, + src: "Hello WORLD.", + dstSize: 3, + srcSize: 100, + wantStr: "hello world.", + }, + + { + desc: "small src", + t: lowerCaseASCII{}, + src: "Hello WORLD.", + dstSize: 100, + srcSize: 4, + wantStr: "hello world.", + }, + + { + desc: "small buffers", + t: lowerCaseASCII{}, + src: "Hello WORLD.", + dstSize: 3, + srcSize: 4, + wantStr: "hello world.", + }, + + { + desc: "very small buffers", + t: lowerCaseASCII{}, + src: "Hello WORLD.", + dstSize: 1, + srcSize: 1, + wantStr: "hello world.", + }, + + { + desc: "basic", + t: dontMentionX{}, + src: "The First Rule of Transform Club: don't mention Mister X, ever.", + dstSize: 100, + srcSize: 100, + wantStr: "The First Rule of Transform Club: don't mention Mister ", + wantErr: errYouMentionedX, + }, + + { + desc: "small buffers", + t: dontMentionX{}, + src: "The First Rule of Transform Club: don't mention Mister X, ever.", + dstSize: 10, + srcSize: 10, + wantStr: "The First Rule of Transform Club: don't mention Mister ", + wantErr: errYouMentionedX, + }, + + { + desc: "very small buffers", + t: dontMentionX{}, + src: "The First Rule of Transform Club: don't mention Mister X, ever.", + dstSize: 1, + srcSize: 1, + wantStr: "The First Rule of Transform Club: don't mention Mister ", + wantErr: errYouMentionedX, + }, + + { + desc: "only transform at EOF", + t: doublerAtEOF{}, + src: "this", + dstSize: 100, + srcSize: 100, + wantStr: "tthhiiss", + }, + + { + desc: "basic", + t: rleDecode{}, + src: "1a2b3c10d11e0f1g", + dstSize: 100, + srcSize: 100, + wantStr: "abbcccddddddddddeeeeeeeeeeeg", + }, + + { + desc: "long", + t: rleDecode{}, + src: "12a23b34c45d56e99z", + dstSize: 100, + srcSize: 100, + wantStr: strings.Repeat("a", 12) + + strings.Repeat("b", 23) + + strings.Repeat("c", 34) + + strings.Repeat("d", 45) + + strings.Repeat("e", 56) + + strings.Repeat("z", 99), + }, + + { + desc: "tight buffers", + t: rleDecode{}, + src: "1a2b3c10d11e0f1g", + dstSize: 11, + srcSize: 3, + wantStr: "abbcccddddddddddeeeeeeeeeeeg", + }, + + { + desc: "short dst", + t: rleDecode{}, + src: "1a2b3c10d11e0f1g", + dstSize: 10, + srcSize: 3, + wantStr: "abbcccdddddddddd", + wantErr: ErrShortDst, + }, + + { + desc: "short src", + t: rleDecode{}, + src: "1a2b3c10d11e0f1g", + dstSize: 11, + srcSize: 2, + ioSize: 2, + wantStr: "abbccc", + wantErr: ErrShortSrc, + }, + + { + desc: "basic", + t: rleEncode{}, + src: "abbcccddddddddddeeeeeeeeeeeg", + dstSize: 100, + srcSize: 100, + wantStr: "1a2b3c10d11e1g", + }, + + { + desc: "long", + t: rleEncode{}, + src: strings.Repeat("a", 12) + + strings.Repeat("b", 23) + + strings.Repeat("c", 34) + + strings.Repeat("d", 45) + + strings.Repeat("e", 56) + + strings.Repeat("z", 99), + dstSize: 100, + srcSize: 100, + wantStr: "12a23b34c45d56e99z", + }, + + { + desc: "tight buffers", + t: rleEncode{}, + src: "abbcccddddddddddeeeeeeeeeeeg", + dstSize: 3, + srcSize: 12, + wantStr: "1a2b3c10d11e1g", + }, + + { + desc: "short dst", + t: rleEncode{}, + src: "abbcccddddddddddeeeeeeeeeeeg", + dstSize: 2, + srcSize: 12, + wantStr: "1a2b3c", + wantErr: ErrShortDst, + }, + + { + desc: "short src", + t: rleEncode{}, + src: "abbcccddddddddddeeeeeeeeeeeg", + dstSize: 3, + srcSize: 11, + ioSize: 11, + wantStr: "1a2b3c10d", + wantErr: ErrShortSrc, + }, + + { + desc: "allowStutter = false", + t: rleEncode{allowStutter: false}, + src: "aaaabbbbbbbbccccddddd", + dstSize: 10, + srcSize: 10, + wantStr: "4a8b4c5d", + }, + + { + desc: "allowStutter = true", + t: rleEncode{allowStutter: true}, + src: "aaaabbbbbbbbccccddddd", + dstSize: 10, + srcSize: 10, + ioSize: 10, + wantStr: "4a6b2b4c4d1d", + }, + + { + desc: "trickler", + t: &trickler{}, + src: "abcdefghijklm", + dstSize: 3, + srcSize: 15, + wantStr: "abcdefghijklm", + }, + + { + desc: "delayedTrickler", + t: &delayedTrickler{}, + src: "abcdefghijklm", + dstSize: 3, + srcSize: 15, + wantStr: "abcdefghijklm", + }, +} + +func TestReader(t *testing.T) { + for _, tc := range testCases { + r := NewReader(strings.NewReader(tc.src), tc.t) + // Differently sized dst and src buffers are not part of the + // exported API. We override them manually. + r.dst = make([]byte, tc.dstSize) + r.src = make([]byte, tc.srcSize) + got, err := ioutil.ReadAll(r) + str := string(got) + if str != tc.wantStr || err != tc.wantErr { + t.Errorf("%s:\ngot %q, %v\nwant %q, %v", tc, str, err, tc.wantStr, tc.wantErr) + } + } +} + +func TestWriter(t *testing.T) { + tests := append(testCases, chainTests()...) + for _, tc := range tests { + sizes := []int{1, 2, 3, 4, 5, 10, 100, 1000} + if tc.ioSize > 0 { + sizes = []int{tc.ioSize} + } + for _, sz := range sizes { + bb := &bytes.Buffer{} + w := NewWriter(bb, tc.t) + // Differently sized dst and src buffers are not part of the + // exported API. We override them manually. + w.dst = make([]byte, tc.dstSize) + w.src = make([]byte, tc.srcSize) + src := make([]byte, sz) + var err error + for b := tc.src; len(b) > 0 && err == nil; { + n := copy(src, b) + b = b[n:] + m := 0 + m, err = w.Write(src[:n]) + if m != n && err == nil { + t.Errorf("%s:%d: did not consume all bytes %d < %d", tc, sz, m, n) + } + } + if err == nil { + err = w.Close() + } + str := bb.String() + if str != tc.wantStr || err != tc.wantErr { + t.Errorf("%s:%d:\ngot %q, %v\nwant %q, %v", tc, sz, str, err, tc.wantStr, tc.wantErr) + } + } + } +} + +func TestNop(t *testing.T) { + testCases := []struct { + str string + dstSize int + err error + }{ + {"", 0, nil}, + {"", 10, nil}, + {"a", 0, ErrShortDst}, + {"a", 1, nil}, + {"a", 10, nil}, + } + for i, tc := range testCases { + dst := make([]byte, tc.dstSize) + nDst, nSrc, err := Nop.Transform(dst, []byte(tc.str), true) + want := tc.str + if tc.dstSize < len(want) { + want = want[:tc.dstSize] + } + if got := string(dst[:nDst]); got != want || err != tc.err || nSrc != nDst { + t.Errorf("%d:\ngot %q, %d, %v\nwant %q, %d, %v", i, got, nSrc, err, want, nDst, tc.err) + } + } +} + +func TestDiscard(t *testing.T) { + testCases := []struct { + str string + dstSize int + }{ + {"", 0}, + {"", 10}, + {"a", 0}, + {"ab", 10}, + } + for i, tc := range testCases { + nDst, nSrc, err := Discard.Transform(make([]byte, tc.dstSize), []byte(tc.str), true) + if nDst != 0 || nSrc != len(tc.str) || err != nil { + t.Errorf("%d:\ngot %q, %d, %v\nwant 0, %d, nil", i, nDst, nSrc, err, len(tc.str)) + } + } +} + +// mkChain creates a Chain transformer. x must be alternating between transformer +// and bufSize, like T, (sz, T)* +func mkChain(x ...interface{}) *chain { + t := []Transformer{} + for i := 0; i < len(x); i += 2 { + t = append(t, x[i].(Transformer)) + } + c := Chain(t...).(*chain) + for i, j := 1, 1; i < len(x); i, j = i+2, j+1 { + c.link[j].b = make([]byte, x[i].(int)) + } + return c +} + +func chainTests() []testCase { + return []testCase{ + { + desc: "nil error", + t: mkChain(rleEncode{}, 100, lowerCaseASCII{}), + src: "ABB", + dstSize: 100, + srcSize: 100, + wantStr: "1a2b", + wantErr: nil, + wantIter: 1, + }, + + { + desc: "short dst buffer", + t: mkChain(lowerCaseASCII{}, 3, rleDecode{}), + src: "1a2b3c10d11e0f1g", + dstSize: 10, + srcSize: 3, + wantStr: "abbcccdddddddddd", + wantErr: ErrShortDst, + }, + + { + desc: "short internal dst buffer", + t: mkChain(lowerCaseASCII{}, 3, rleDecode{}, 10, Nop), + src: "1a2b3c10d11e0f1g", + dstSize: 100, + srcSize: 3, + wantStr: "abbcccdddddddddd", + wantErr: errShortInternal, + }, + + { + desc: "short internal dst buffer from input", + t: mkChain(rleDecode{}, 10, Nop), + src: "1a2b3c10d11e0f1g", + dstSize: 100, + srcSize: 3, + wantStr: "abbcccdddddddddd", + wantErr: errShortInternal, + }, + + { + desc: "empty short internal dst buffer", + t: mkChain(lowerCaseASCII{}, 3, rleDecode{}, 10, Nop), + src: "4a7b11e0f1g", + dstSize: 100, + srcSize: 3, + wantStr: "aaaabbbbbbb", + wantErr: errShortInternal, + }, + + { + desc: "empty short internal dst buffer from input", + t: mkChain(rleDecode{}, 10, Nop), + src: "4a7b11e0f1g", + dstSize: 100, + srcSize: 3, + wantStr: "aaaabbbbbbb", + wantErr: errShortInternal, + }, + + { + desc: "short internal src buffer after full dst buffer", + t: mkChain(Nop, 5, rleEncode{}, 10, Nop), + src: "cccccddddd", + dstSize: 100, + srcSize: 100, + wantStr: "", + wantErr: errShortInternal, + wantIter: 1, + }, + + { + desc: "short internal src buffer after short dst buffer; test lastFull", + t: mkChain(rleDecode{}, 5, rleEncode{}, 4, Nop), + src: "2a1b4c6d", + dstSize: 100, + srcSize: 100, + wantStr: "2a1b", + wantErr: errShortInternal, + }, + + { + desc: "short internal src buffer after successful complete fill", + t: mkChain(Nop, 3, rleDecode{}), + src: "123a4b", + dstSize: 4, + srcSize: 3, + wantStr: "", + wantErr: errShortInternal, + wantIter: 1, + }, + + { + desc: "short internal src buffer after short dst buffer; test lastFull", + t: mkChain(rleDecode{}, 5, rleEncode{}), + src: "2a1b4c6d", + dstSize: 4, + srcSize: 100, + wantStr: "2a1b", + wantErr: errShortInternal, + }, + + { + desc: "short src buffer", + t: mkChain(rleEncode{}, 5, Nop), + src: "abbcccddddeeeee", + dstSize: 4, + srcSize: 4, + ioSize: 4, + wantStr: "1a2b3c", + wantErr: ErrShortSrc, + }, + + { + desc: "process all in one go", + t: mkChain(rleEncode{}, 5, Nop), + src: "abbcccddddeeeeeffffff", + dstSize: 100, + srcSize: 100, + wantStr: "1a2b3c4d5e6f", + wantErr: nil, + wantIter: 1, + }, + + { + desc: "complete processing downstream after error", + t: mkChain(dontMentionX{}, 2, rleDecode{}, 5, Nop), + src: "3a4b5eX", + dstSize: 100, + srcSize: 100, + ioSize: 100, + wantStr: "aaabbbbeeeee", + wantErr: errYouMentionedX, + }, + + { + desc: "return downstream fatal errors first (followed by short dst)", + t: mkChain(dontMentionX{}, 8, rleDecode{}, 4, Nop), + src: "3a4b5eX", + dstSize: 100, + srcSize: 100, + ioSize: 100, + wantStr: "aaabbbb", + wantErr: errShortInternal, + }, + + { + desc: "return downstream fatal errors first (followed by short src)", + t: mkChain(dontMentionX{}, 5, Nop, 1, rleDecode{}), + src: "1a5bX", + dstSize: 100, + srcSize: 100, + ioSize: 100, + wantStr: "", + wantErr: errShortInternal, + }, + + { + desc: "short internal", + t: mkChain(Nop, 11, rleEncode{}, 3, Nop), + src: "abbcccddddddddddeeeeeeeeeeeg", + dstSize: 3, + srcSize: 100, + wantStr: "1a2b3c10d", + wantErr: errShortInternal, + }, + } +} + +func doTransform(tc testCase) (res string, iter int, err error) { + tc.t.Reset() + dst := make([]byte, tc.dstSize) + out, in := make([]byte, 0, 2*len(tc.src)), []byte(tc.src) + for { + iter++ + src, atEOF := in, true + if len(src) > tc.srcSize { + src, atEOF = src[:tc.srcSize], false + } + nDst, nSrc, err := tc.t.Transform(dst, src, atEOF) + out = append(out, dst[:nDst]...) + in = in[nSrc:] + switch { + case err == nil && len(in) != 0: + case err == ErrShortSrc && nSrc > 0: + case err == ErrShortDst && (nDst > 0 || nSrc > 0): + default: + return string(out), iter, err + } + } +} + +func TestChain(t *testing.T) { + if c, ok := Chain().(nop); !ok { + t.Errorf("empty chain: %v; want Nop", c) + } + + // Test Chain for a single Transformer. + for _, tc := range testCases { + tc.t = Chain(tc.t) + str, _, err := doTransform(tc) + if str != tc.wantStr || err != tc.wantErr { + t.Errorf("%s:\ngot %q, %v\nwant %q, %v", tc, str, err, tc.wantStr, tc.wantErr) + } + } + + tests := chainTests() + sizes := []int{1, 2, 3, 4, 5, 7, 10, 100, 1000} + addTest := func(tc testCase, t *chain) { + if t.link[0].t != tc.t && tc.wantErr == ErrShortSrc { + tc.wantErr = errShortInternal + } + if t.link[len(t.link)-2].t != tc.t && tc.wantErr == ErrShortDst { + tc.wantErr = errShortInternal + } + tc.t = t + tests = append(tests, tc) + } + for _, tc := range testCases { + for _, sz := range sizes { + tt := tc + tt.dstSize = sz + addTest(tt, mkChain(tc.t, tc.dstSize, Nop)) + addTest(tt, mkChain(tc.t, tc.dstSize, Nop, 2, Nop)) + addTest(tt, mkChain(Nop, tc.srcSize, tc.t, tc.dstSize, Nop)) + if sz >= tc.dstSize && (tc.wantErr != ErrShortDst || sz == tc.dstSize) { + addTest(tt, mkChain(Nop, tc.srcSize, tc.t)) + addTest(tt, mkChain(Nop, 100, Nop, tc.srcSize, tc.t)) + } + } + } + for _, tc := range testCases { + tt := tc + tt.dstSize = 1 + tt.wantStr = "" + addTest(tt, mkChain(tc.t, tc.dstSize, Discard)) + addTest(tt, mkChain(Nop, tc.srcSize, tc.t, tc.dstSize, Discard)) + addTest(tt, mkChain(Nop, tc.srcSize, tc.t, tc.dstSize, Nop, tc.dstSize, Discard)) + } + for _, tc := range testCases { + tt := tc + tt.dstSize = 100 + tt.wantStr = strings.Replace(tc.src, "0f", "", -1) + // Chain encoders and decoders. + if _, ok := tc.t.(rleEncode); ok && tc.wantErr == nil { + addTest(tt, mkChain(tc.t, tc.dstSize, Nop, 1000, rleDecode{})) + addTest(tt, mkChain(tc.t, tc.dstSize, Nop, tc.dstSize, rleDecode{})) + addTest(tt, mkChain(Nop, tc.srcSize, tc.t, tc.dstSize, Nop, 100, rleDecode{})) + // decoding needs larger destinations + addTest(tt, mkChain(Nop, tc.srcSize, tc.t, tc.dstSize, rleDecode{}, 100, Nop)) + addTest(tt, mkChain(Nop, tc.srcSize, tc.t, tc.dstSize, Nop, 100, rleDecode{}, 100, Nop)) + } else if _, ok := tc.t.(rleDecode); ok && tc.wantErr == nil { + // The internal buffer size may need to be the sum of the maximum segment + // size of the two encoders! + addTest(tt, mkChain(tc.t, 2*tc.dstSize, rleEncode{})) + addTest(tt, mkChain(tc.t, tc.dstSize, Nop, 101, rleEncode{})) + addTest(tt, mkChain(Nop, tc.srcSize, tc.t, tc.dstSize, Nop, 100, rleEncode{})) + addTest(tt, mkChain(Nop, tc.srcSize, tc.t, tc.dstSize, Nop, 200, rleEncode{}, 100, Nop)) + } + } + for _, tc := range tests { + str, iter, err := doTransform(tc) + mi := tc.wantIter != 0 && tc.wantIter != iter + if str != tc.wantStr || err != tc.wantErr || mi { + t.Errorf("%s:\ngot iter:%d, %q, %v\nwant iter:%d, %q, %v", tc, iter, str, err, tc.wantIter, tc.wantStr, tc.wantErr) + } + break + } +} + +func TestRemoveFunc(t *testing.T) { + filter := RemoveFunc(func(r rune) bool { + return strings.IndexRune("ab\u0300\u1234,", r) != -1 + }) + tests := []testCase{ + { + src: ",", + wantStr: "", + }, + + { + src: "c", + wantStr: "c", + }, + + { + src: "\u2345", + wantStr: "\u2345", + }, + + { + src: "tschüß", + wantStr: "tschüß", + }, + + { + src: ",до,свидания,", + wantStr: "досвидания", + }, + + { + src: "a\xbd\xb2=\xbc ⌘", + wantStr: "\uFFFD\uFFFD=\uFFFD ⌘", + }, + + { + // If we didn't replace illegal bytes with RuneError, the result + // would be \u0300 or the code would need to be more complex. + src: "\xcc\u0300\x80", + wantStr: "\uFFFD\uFFFD", + }, + + { + src: "\xcc\u0300\x80", + dstSize: 3, + wantStr: "\uFFFD\uFFFD", + wantIter: 2, + }, + + { + // Test a long buffer greater than the internal buffer size + src: "hello\xcc\xcc\xccworld", + srcSize: 13, + wantStr: "hello\uFFFD\uFFFD\uFFFDworld", + wantIter: 1, + }, + + { + src: "\u2345", + dstSize: 2, + wantStr: "", + wantErr: ErrShortDst, + }, + + { + src: "\xcc", + dstSize: 2, + wantStr: "", + wantErr: ErrShortDst, + }, + + { + src: "\u0300", + dstSize: 2, + srcSize: 1, + wantStr: "", + wantErr: ErrShortSrc, + }, + + { + t: RemoveFunc(func(r rune) bool { + return r == utf8.RuneError + }), + src: "\xcc\u0300\x80", + wantStr: "\u0300", + }, + } + + for _, tc := range tests { + tc.desc = tc.src + if tc.t == nil { + tc.t = filter + } + if tc.dstSize == 0 { + tc.dstSize = 100 + } + if tc.srcSize == 0 { + tc.srcSize = 100 + } + str, iter, err := doTransform(tc) + mi := tc.wantIter != 0 && tc.wantIter != iter + if str != tc.wantStr || err != tc.wantErr || mi { + t.Errorf("%+q:\ngot iter:%d, %+q, %v\nwant iter:%d, %+q, %v", tc.src, iter, str, err, tc.wantIter, tc.wantStr, tc.wantErr) + } + + tc.src = str + idem, _, _ := doTransform(tc) + if str != idem { + t.Errorf("%+q: found %+q; want %+q", tc.src, idem, str) + } + } +} + +func testString(t *testing.T, f func(Transformer, string) (string, int, error)) { + for _, tt := range append(testCases, chainTests()...) { + if tt.desc == "allowStutter = true" { + // We don't have control over the buffer size, so we eliminate tests + // that depend on a specific buffer size being set. + continue + } + if tt.wantErr == ErrShortDst || tt.wantErr == ErrShortSrc { + // The result string will be different. + continue + } + got, n, err := f(tt.t, tt.src) + if tt.wantErr != err { + t.Errorf("%s:error: got %v; want %v", tt.desc, err, tt.wantErr) + } + if got, want := err == nil, n == len(tt.src); got != want { + t.Errorf("%s:n: got %v; want %v", tt.desc, got, want) + } + if got != tt.wantStr { + t.Errorf("%s:string: got %q; want %q", tt.desc, got, tt.wantStr) + } + } +} + +func TestBytes(t *testing.T) { + testString(t, func(z Transformer, s string) (string, int, error) { + b, n, err := Bytes(z, []byte(s)) + return string(b), n, err + }) +} + +func TestAppend(t *testing.T) { + // Create a bunch of subtests for different buffer sizes. + testCases := [][]byte{ + nil, + make([]byte, 0, 0), + make([]byte, 0, 1), + make([]byte, 1, 1), + make([]byte, 1, 5), + make([]byte, 100, 100), + make([]byte, 100, 200), + } + for _, tc := range testCases { + testString(t, func(z Transformer, s string) (string, int, error) { + b, n, err := Append(z, tc, []byte(s)) + return string(b[len(tc):]), n, err + }) + } +} + +func TestString(t *testing.T) { + testString(t, String) + + // Overrun the internal destination buffer. + for i, s := range []string{ + strings.Repeat("a", initialBufSize-1), + strings.Repeat("a", initialBufSize+0), + strings.Repeat("a", initialBufSize+1), + strings.Repeat("A", initialBufSize-1), + strings.Repeat("A", initialBufSize+0), + strings.Repeat("A", initialBufSize+1), + strings.Repeat("A", 2*initialBufSize-1), + strings.Repeat("A", 2*initialBufSize+0), + strings.Repeat("A", 2*initialBufSize+1), + strings.Repeat("a", initialBufSize-2) + "A", + strings.Repeat("a", initialBufSize-1) + "A", + strings.Repeat("a", initialBufSize+0) + "A", + strings.Repeat("a", initialBufSize+1) + "A", + } { + got, _, _ := String(lowerCaseASCII{}, s) + if want := strings.ToLower(s); got != want { + t.Errorf("%d:dst buffer test: got %s (%d); want %s (%d)", i, got, len(got), want, len(want)) + } + } + + // Overrun the internal source buffer. + for i, s := range []string{ + strings.Repeat("a", initialBufSize-1), + strings.Repeat("a", initialBufSize+0), + strings.Repeat("a", initialBufSize+1), + strings.Repeat("a", 2*initialBufSize+1), + strings.Repeat("a", 2*initialBufSize+0), + strings.Repeat("a", 2*initialBufSize+1), + } { + got, _, _ := String(rleEncode{}, s) + if want := fmt.Sprintf("%da", len(s)); got != want { + t.Errorf("%d:src buffer test: got %s (%d); want %s (%d)", i, got, len(got), want, len(want)) + } + } + + // Test allocations for non-changing strings. + // Note we still need to allocate a single buffer. + for i, s := range []string{ + "", + "123", + "123456789", + strings.Repeat("a", initialBufSize), + strings.Repeat("a", 10*initialBufSize), + } { + if n := testing.AllocsPerRun(5, func() { String(&lowerCaseASCII{}, s) }); n > 1 { + t.Errorf("%d: #allocs was %f; want 1", i, n) + } + } +} + +// TestBytesAllocation tests that buffer growth stays limited with the trickler +// transformer, which behaves oddly but within spec. In case buffer growth is +// not correctly handled, the test will either panic with a failed allocation or +// thrash. To ensure the tests terminate under the last condition, we time out +// after some sufficiently long period of time. +func TestBytesAllocation(t *testing.T) { + done := make(chan bool) + go func() { + in := bytes.Repeat([]byte{'a'}, 1000) + tr := trickler(make([]byte, 1)) + Bytes(&tr, in) + done <- true + }() + select { + case <-done: + case <-time.After(3 * time.Second): + t.Error("time out, likely due to excessive allocation") + } +} + +// TestStringAllocation tests that buffer growth stays limited with the trickler +// transformer, which behaves oddly but within spec. In case buffer growth is +// not correctly handled, the test will either panic with a failed allocation or +// thrash. To ensure the tests terminate under the last condition, we time out +// after some sufficiently long period of time. +func TestStringAllocation(t *testing.T) { + done := make(chan bool) + go func() { + in := strings.Repeat("a", 1000) + tr := trickler(make([]byte, 1)) + String(&tr, in) + done <- true + }() + select { + case <-done: + case <-time.After(3 * time.Second): + t.Error("time out, likely due to excessive allocation") + } +} + +func BenchmarkStringLower(b *testing.B) { + in := strings.Repeat("a", 4096) + for i := 0; i < b.N; i++ { + String(&lowerCaseASCII{}, in) + } +} diff --git a/vendor/golang.org/x/text/unicode/bidi/bidi.go b/vendor/golang.org/x/text/unicode/bidi/bidi.go new file mode 100644 index 0000000000..3fc4a62521 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/bidi.go @@ -0,0 +1,198 @@ +// 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. + +//go:generate go run gen.go gen_trieval.go gen_ranges.go + +// Package bidi contains functionality for bidirectional text support. +// +// See http://www.unicode.org/reports/tr9. +// +// NOTE: UNDER CONSTRUCTION. This API may change in backwards incompatible ways +// and without notice. +package bidi // import "golang.org/x/text/unicode/bidi" + +// TODO: +// The following functionality would not be hard to implement, but hinges on +// the definition of a Segmenter interface. For now this is up to the user. +// - Iterate over paragraphs +// - Segmenter to iterate over runs directly from a given text. +// Also: +// - Transformer for reordering? +// - Transformer (validator, really) for Bidi Rule. + +// This API tries to avoid dealing with embedding levels for now. Under the hood +// these will be computed, but the question is to which extent the user should +// know they exist. We should at some point allow the user to specify an +// embedding hierarchy, though. + +// A Direction indicates the overall flow of text. +type Direction int + +const ( + // LeftToRight indicates the text contains no right-to-left characters and + // that either there are some left-to-right characters or the option + // DefaultDirection(LeftToRight) was passed. + LeftToRight Direction = iota + + // RightToLeft indicates the text contains no left-to-right characters and + // that either there are some right-to-left characters or the option + // DefaultDirection(RightToLeft) was passed. + RightToLeft + + // Mixed indicates text contains both left-to-right and right-to-left + // characters. + Mixed + + // Neutral means that text contains no left-to-right and right-to-left + // characters and that no default direction has been set. + Neutral +) + +type options struct{} + +// An Option is an option for Bidi processing. +type Option func(*options) + +// ICU allows the user to define embedding levels. This may be used, for example, +// to use hierarchical structure of markup languages to define embeddings. +// The following option may be a way to expose this functionality in this API. +// // LevelFunc sets a function that associates nesting levels with the given text. +// // The levels function will be called with monotonically increasing values for p. +// func LevelFunc(levels func(p int) int) Option { +// panic("unimplemented") +// } + +// DefaultDirection sets the default direction for a Paragraph. The direction is +// overridden if the text contains directional characters. +func DefaultDirection(d Direction) Option { + panic("unimplemented") +} + +// A Paragraph holds a single Paragraph for Bidi processing. +type Paragraph struct { + // buffers +} + +// SetBytes configures p for the given paragraph text. It replaces text +// previously set by SetBytes or SetString. If b contains a paragraph separator +// it will only process the first paragraph and report the number of bytes +// consumed from b including this separator. Error may be non-nil if options are +// given. +func (p *Paragraph) SetBytes(b []byte, opts ...Option) (n int, err error) { + panic("unimplemented") +} + +// SetString configures p for the given paragraph text. It replaces text +// previously set by SetBytes or SetString. If b contains a paragraph separator +// it will only process the first paragraph and report the number of bytes +// consumed from b including this separator. Error may be non-nil if options are +// given. +func (p *Paragraph) SetString(s string, opts ...Option) (n int, err error) { + panic("unimplemented") +} + +// IsLeftToRight reports whether the principle direction of rendering for this +// paragraphs is left-to-right. If this returns false, the principle direction +// of rendering is right-to-left. +func (p *Paragraph) IsLeftToRight() bool { + panic("unimplemented") +} + +// Direction returns the direction of the text of this paragraph. +// +// The direction may be LeftToRight, RightToLeft, Mixed, or Neutral. +func (p *Paragraph) Direction() Direction { + panic("unimplemented") +} + +// RunAt reports the Run at the given position of the input text. +// +// This method can be used for computing line breaks on paragraphs. +func (p *Paragraph) RunAt(pos int) Run { + panic("unimplemented") +} + +// Order computes the visual ordering of all the runs in a Paragraph. +func (p *Paragraph) Order() (Ordering, error) { + panic("unimplemented") +} + +// Line computes the visual ordering of runs for a single line starting and +// ending at the given positions in the original text. +func (p *Paragraph) Line(start, end int) (Ordering, error) { + panic("unimplemented") +} + +// An Ordering holds the computed visual order of runs of a Paragraph. Calling +// SetBytes or SetString on the originating Paragraph invalidates an Ordering. +// The methods of an Ordering should only be called by one goroutine at a time. +type Ordering struct{} + +// Direction reports the directionality of the runs. +// +// The direction may be LeftToRight, RightToLeft, Mixed, or Neutral. +func (o *Ordering) Direction() Direction { + panic("unimplemented") +} + +// NumRuns returns the number of runs. +func (o *Ordering) NumRuns() int { + panic("unimplemented") +} + +// Run returns the ith run within the ordering. +func (o *Ordering) Run(i int) Run { + panic("unimplemented") +} + +// TODO: perhaps with options. +// // Reorder creates a reader that reads the runes in visual order per character. +// // Modifiers remain after the runes they modify. +// func (l *Runs) Reorder() io.Reader { +// panic("unimplemented") +// } + +// A Run is a continuous sequence of characters of a single direction. +type Run struct { +} + +// String returns the text of the run in its original order. +func (r *Run) String() string { + panic("unimplemented") +} + +// Bytes returns the text of the run in its original order. +func (r *Run) Bytes() []byte { + panic("unimplemented") +} + +// TODO: methods for +// - Display order +// - headers and footers +// - bracket replacement. + +// Direction reports the direction of the run. +func (r *Run) Direction() Direction { + panic("unimplemented") +} + +// Position of the Run within the text passed to SetBytes or SetString of the +// originating Paragraph value. +func (r *Run) Pos() (start, end int) { + panic("unimplemented") +} + +// AppendReverse reverses the order of characters of in, appends them to out, +// and returns the result. Modifiers will still follow the runes they modify. +// Brackets are replaced with their counterparts. +func AppendReverse(out, in []byte) []byte { + panic("unimplemented") +} + +// ReverseString reverses the order of characters in s and returns a new string. +// Modifiers will still follow the runes they modify. Brackets are replaced with +// their counterparts. +func ReverseString(s string) string { + panic("unimplemented") +} diff --git a/vendor/golang.org/x/text/unicode/bidi/bracket.go b/vendor/golang.org/x/text/unicode/bidi/bracket.go new file mode 100644 index 0000000000..3b160de36a --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/bracket.go @@ -0,0 +1,307 @@ +// 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 bidi + +import ( + "container/list" + "fmt" + "sort" +) + +// This file contains a port of the reference implementation of the +// Bidi Parentheses Algorithm: +// http://www.unicode.org/Public/PROGRAMS/BidiReferenceJava/BidiPBAReference.java +// +// The implementation in this file covers definitions BD14-BD16 and rule N0 +// of UAX#9. +// +// Some preprocessing is done for each rune before data is passed to this +// algorithm: +// - opening and closing brackets are identified +// - a bracket pair type, like '(' and ')' is assigned a unique identifier that +// is identical for the opening and closing bracket. It is left to do these +// mappings. +// - The BPA algorithm requires that bracket characters that are canonical +// equivalents of each other be able to be substituted for each other. +// It is the responsibility of the caller to do this canonicalization. +// +// In implementing BD16, this implementation departs slightly from the "logical" +// algorithm defined in UAX#9. In particular, the stack referenced there +// supports operations that go beyond a "basic" stack. An equivalent +// implementation based on a linked list is used here. + +// Bidi_Paired_Bracket_Type +// BD14. An opening paired bracket is a character whose +// Bidi_Paired_Bracket_Type property value is Open. +// +// BD15. A closing paired bracket is a character whose +// Bidi_Paired_Bracket_Type property value is Close. +type bracketType byte + +const ( + bpNone bracketType = iota + bpOpen + bpClose +) + +// bracketPair holds a pair of index values for opening and closing bracket +// location of a bracket pair. +type bracketPair struct { + opener int + closer int +} + +func (b *bracketPair) String() string { + return fmt.Sprintf("(%v, %v)", b.opener, b.closer) +} + +// bracketPairs is a slice of bracketPairs with a sort.Interface implementation. +type bracketPairs []bracketPair + +func (b bracketPairs) Len() int { return len(b) } +func (b bracketPairs) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b bracketPairs) Less(i, j int) bool { return b[i].opener < b[j].opener } + +// resolvePairedBrackets runs the paired bracket part of the UBA algorithm. +// +// For each rune, it takes the indexes into the original string, the class the +// bracket type (in pairTypes) and the bracket identifier (pairValues). It also +// takes the direction type for the start-of-sentence and the embedding level. +// +// The identifiers for bracket types are the rune of the canonicalized opening +// bracket for brackets (open or close) or 0 for runes that are not brackets. +func resolvePairedBrackets(s *isolatingRunSequence) { + p := bracketPairer{ + sos: s.sos, + openers: list.New(), + codesIsolatedRun: s.types, + indexes: s.indexes, + } + dirEmbed := _L + if s.level&1 != 0 { + dirEmbed = _R + } + p.locateBrackets(s.p.pairTypes, s.p.pairValues) + p.resolveBrackets(dirEmbed) +} + +type bracketPairer struct { + sos class // direction corresponding to start of sequence + + // The following is a restatement of BD 16 using non-algorithmic language. + // + // A bracket pair is a pair of characters consisting of an opening + // paired bracket and a closing paired bracket such that the + // Bidi_Paired_Bracket property value of the former equals the latter, + // subject to the following constraints. + // - both characters of a pair occur in the same isolating run sequence + // - the closing character of a pair follows the opening character + // - any bracket character can belong at most to one pair, the earliest possible one + // - any bracket character not part of a pair is treated like an ordinary character + // - pairs may nest properly, but their spans may not overlap otherwise + + // Bracket characters with canonical decompositions are supposed to be + // treated as if they had been normalized, to allow normalized and non- + // normalized text to give the same result. In this implementation that step + // is pushed out to the caller. The caller has to ensure that the pairValue + // slices contain the rune of the opening bracket after normalization for + // any opening or closing bracket. + + openers *list.List // list of positions for opening brackets + + // bracket pair positions sorted by location of opening bracket + pairPositions bracketPairs + + codesIsolatedRun []class // directional bidi codes for an isolated run + indexes []int // array of index values into the original string + +} + +// matchOpener reports whether characters at given positions form a matching +// bracket pair. +func (p *bracketPairer) matchOpener(pairValues []rune, opener, closer int) bool { + return pairValues[p.indexes[opener]] == pairValues[p.indexes[closer]] +} + +// locateBrackets locates matching bracket pairs according to BD16. +// +// This implementation uses a linked list instead of a stack, because, while +// elements are added at the front (like a push) they are not generally removed +// in atomic 'pop' operations, reducing the benefit of the stack archetype. +func (p *bracketPairer) locateBrackets(pairTypes []bracketType, pairValues []rune) { + // traverse the run + // do that explicitly (not in a for-each) so we can record position + for i, index := range p.indexes { + + // look at the bracket type for each character + switch pairTypes[index] { + case bpNone: + // continue scanning + + case bpOpen: + // remember opener location, most recent first + p.openers.PushFront(i) + + case bpClose: + // see if there is a match + count := 0 + for elem := p.openers.Front(); elem != nil; elem = elem.Next() { + count++ + opener := elem.Value.(int) + if p.matchOpener(pairValues, opener, i) { + // if the opener matches, add nested pair to the ordered list + p.pairPositions = append(p.pairPositions, bracketPair{opener, i}) + // remove up to and including matched opener + for ; count > 0; count-- { + p.openers.Remove(p.openers.Front()) + } + break + } + } + sort.Sort(p.pairPositions) + // if we get here, the closing bracket matched no openers + // and gets ignored + } + } +} + +// Bracket pairs within an isolating run sequence are processed as units so +// that both the opening and the closing paired bracket in a pair resolve to +// the same direction. +// +// N0. Process bracket pairs in an isolating run sequence sequentially in +// the logical order of the text positions of the opening paired brackets +// using the logic given below. Within this scope, bidirectional types EN +// and AN are treated as R. +// +// Identify the bracket pairs in the current isolating run sequence +// according to BD16. For each bracket-pair element in the list of pairs of +// text positions: +// +// a Inspect the bidirectional types of the characters enclosed within the +// bracket pair. +// +// b If any strong type (either L or R) matching the embedding direction is +// found, set the type for both brackets in the pair to match the embedding +// direction. +// +// o [ e ] o -> o e e e o +// +// o [ o e ] -> o e o e e +// +// o [ NI e ] -> o e NI e e +// +// c Otherwise, if a strong type (opposite the embedding direction) is +// found, test for adjacent strong types as follows: 1 First, check +// backwards before the opening paired bracket until the first strong type +// (L, R, or sos) is found. If that first preceding strong type is opposite +// the embedding direction, then set the type for both brackets in the pair +// to that type. 2 Otherwise, set the type for both brackets in the pair to +// the embedding direction. +// +// o [ o ] e -> o o o o e +// +// o [ o NI ] o -> o o o NI o o +// +// e [ o ] o -> e e o e o +// +// e [ o ] e -> e e o e e +// +// e ( o [ o ] NI ) e -> e e o o o o NI e e +// +// d Otherwise, do not set the type for the current bracket pair. Note that +// if the enclosed text contains no strong types the paired brackets will +// both resolve to the same level when resolved individually using rules N1 +// and N2. +// +// e ( NI ) o -> e ( NI ) o + +// getStrongTypeN0 maps character's directional code to strong type as required +// by rule N0. +// +// TODO: have separate type for "strong" directionality. +func (p *bracketPairer) getStrongTypeN0(index int) class { + switch p.codesIsolatedRun[index] { + // in the scope of N0, number types are treated as R + case _EN, _AN, _AL, _R: + return _R + case _L: + return _L + default: + return _ON + } +} + +// classifyPairContent reports the strong types contained inside a Bracket Pair, +// assuming the given embedding direction. +// +// It returns _ON if no strong type is found. If a single strong type is found, +// it returns this this type. Otherwise it returns the embedding direction. +// +// TODO: use separate type for "strong" directionality. +func (p *bracketPairer) classifyPairContent(loc bracketPair, dirEmbed class) class { + dirOpposite := _ON + for i := loc.opener + 1; i < loc.closer; i++ { + dir := p.getStrongTypeN0(i) + if dir == _ON { + continue + } + if dir == dirEmbed { + return dir // type matching embedding direction found + } + dirOpposite = dir + } + // return ON if no strong type found, or class opposite to dirEmbed + return dirOpposite +} + +// classBeforePair determines which strong types are present before a Bracket +// Pair. Return R or L if strong type found, otherwise ON. +func (p *bracketPairer) classBeforePair(loc bracketPair) class { + for i := loc.opener - 1; i >= 0; i-- { + if dir := p.getStrongTypeN0(i); dir != _ON { + return dir + } + } + // no strong types found, return sos + return p.sos +} + +// assignBracketType implements rule N0 for a single bracket pair. +func (p *bracketPairer) assignBracketType(loc bracketPair, dirEmbed class) { + // rule "N0, a", inspect contents of pair + dirPair := p.classifyPairContent(loc, dirEmbed) + + // dirPair is now L, R, or N (no strong type found) + + // the following logical tests are performed out of order compared to + // the statement of the rules but yield the same results + if dirPair == _ON { + return // case "d" - nothing to do + } + + if dirPair != dirEmbed { + // case "c": strong type found, opposite - check before (c.1) + dirPair = p.classBeforePair(loc) + if dirPair == dirEmbed || dirPair == _ON { + // no strong opposite type found before - use embedding (c.2) + dirPair = dirEmbed + } + } + // else: case "b", strong type found matching embedding, + // no explicit action needed, as dirPair is already set to embedding + // direction + + // set the bracket types to the type found + p.codesIsolatedRun[loc.opener] = dirPair + p.codesIsolatedRun[loc.closer] = dirPair +} + +// resolveBrackets implements rule N0 for a list of pairs. +func (p *bracketPairer) resolveBrackets(dirEmbed class) { + for _, loc := range p.pairPositions { + p.assignBracketType(loc, dirEmbed) + } +} diff --git a/vendor/golang.org/x/text/unicode/bidi/core.go b/vendor/golang.org/x/text/unicode/bidi/core.go new file mode 100644 index 0000000000..85f091c569 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/core.go @@ -0,0 +1,1055 @@ +// 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 bidi + +import "log" + +// This implementation is a port based on the reference implementation found at: +// http://www.unicode.org/Public/PROGRAMS/BidiReferenceJava/ +// +// described in Unicode Bidirectional Algorithm (UAX #9). +// +// Input: +// There are two levels of input to the algorithm, since clients may prefer to +// supply some information from out-of-band sources rather than relying on the +// default behavior. +// +// - Bidi class array +// - Bidi class array, with externally supplied base line direction +// +// Output: +// Output is separated into several stages: +// +// - levels array over entire paragraph +// - reordering array over entire paragraph +// - levels array over line +// - reordering array over line +// +// Note that for conformance to the Unicode Bidirectional Algorithm, +// implementations are only required to generate correct reordering and +// character directionality (odd or even levels) over a line. Generating +// identical level arrays over a line is not required. Bidi explicit format +// codes (LRE, RLE, LRO, RLO, PDF) and BN can be assigned arbitrary levels and +// positions as long as the rest of the input is properly reordered. +// +// As the algorithm is defined to operate on a single paragraph at a time, this +// implementation is written to handle single paragraphs. Thus rule P1 is +// presumed by this implementation-- the data provided to the implementation is +// assumed to be a single paragraph, and either contains no 'B' codes, or a +// single 'B' code at the end of the input. 'B' is allowed as input to +// illustrate how the algorithm assigns it a level. +// +// Also note that rules L3 and L4 depend on the rendering engine that uses the +// result of the bidi algorithm. This implementation assumes that the rendering +// engine expects combining marks in visual order (e.g. to the left of their +// base character in RTL runs) and that it adjusts the glyphs used to render +// mirrored characters that are in RTL runs so that they render appropriately. + +// level is the embedding level of a character. Even embedding levels indicate +// left-to-right order and odd levels indicate right-to-left order. The special +// level of -1 is reserved for undefined order. +type level int8 + +const implicitLevel level = -1 + +// in returns if x is equal to any of the values in set. +func (c class) in(set ...class) bool { + for _, s := range set { + if c == s { + return true + } + } + return false +} + +// A paragraph contains the state of a paragraph. +type paragraph struct { + initialTypes []class + + // Arrays of properties needed for paired bracket evaluation in N0 + pairTypes []bracketType // paired Bracket types for paragraph + pairValues []rune // rune for opening bracket or pbOpen and pbClose; 0 for pbNone + + embeddingLevel level // default: = implicitLevel; + + // at the paragraph levels + resultTypes []class + resultLevels []level + + // Index of matching PDI for isolate initiator characters. For other + // characters, the value of matchingPDI will be set to -1. For isolate + // initiators with no matching PDI, matchingPDI will be set to the length of + // the input string. + matchingPDI []int + + // Index of matching isolate initiator for PDI characters. For other + // characters, and for PDIs with no matching isolate initiator, the value of + // matchingIsolateInitiator will be set to -1. + matchingIsolateInitiator []int +} + +// newParagraph initializes a paragraph. The user needs to supply a few arrays +// corresponding to the preprocessed text input. The types correspond to the +// Unicode BiDi classes for each rune. pairTypes indicates the bracket type for +// each rune. pairValues provides a unique bracket class identifier for each +// rune (suggested is the rune of the open bracket for opening and matching +// close brackets, after normalization). The embedding levels are optional, but +// may be supplied to encode embedding levels of styled text. +// +// TODO: return an error. +func newParagraph(types []class, pairTypes []bracketType, pairValues []rune, levels level) *paragraph { + validateTypes(types) + validatePbTypes(pairTypes) + validatePbValues(pairValues, pairTypes) + validateParagraphEmbeddingLevel(levels) + + p := ¶graph{ + initialTypes: append([]class(nil), types...), + embeddingLevel: levels, + + pairTypes: pairTypes, + pairValues: pairValues, + + resultTypes: append([]class(nil), types...), + } + p.run() + return p +} + +func (p *paragraph) Len() int { return len(p.initialTypes) } + +// The algorithm. Does not include line-based processing (Rules L1, L2). +// These are applied later in the line-based phase of the algorithm. +func (p *paragraph) run() { + p.determineMatchingIsolates() + + // 1) determining the paragraph level + // Rule P1 is the requirement for entering this algorithm. + // Rules P2, P3. + // If no externally supplied paragraph embedding level, use default. + if p.embeddingLevel == implicitLevel { + p.embeddingLevel = p.determineParagraphEmbeddingLevel(0, p.Len()) + } + + // Initialize result levels to paragraph embedding level. + p.resultLevels = make([]level, p.Len()) + setLevels(p.resultLevels, p.embeddingLevel) + + // 2) Explicit levels and directions + // Rules X1-X8. + p.determineExplicitEmbeddingLevels() + + // Rule X9. + // We do not remove the embeddings, the overrides, the PDFs, and the BNs + // from the string explicitly. But they are not copied into isolating run + // sequences when they are created, so they are removed for all + // practical purposes. + + // Rule X10. + // Run remainder of algorithm one isolating run sequence at a time + for _, seq := range p.determineIsolatingRunSequences() { + // 3) resolving weak types + // Rules W1-W7. + seq.resolveWeakTypes() + + // 4a) resolving paired brackets + // Rule N0 + resolvePairedBrackets(seq) + + // 4b) resolving neutral types + // Rules N1-N3. + seq.resolveNeutralTypes() + + // 5) resolving implicit embedding levels + // Rules I1, I2. + seq.resolveImplicitLevels() + + // Apply the computed levels and types + seq.applyLevelsAndTypes() + } + + // Assign appropriate levels to 'hide' LREs, RLEs, LROs, RLOs, PDFs, and + // BNs. This is for convenience, so the resulting level array will have + // a value for every character. + p.assignLevelsToCharactersRemovedByX9() +} + +// determineMatchingIsolates determines the matching PDI for each isolate +// initiator and vice versa. +// +// Definition BD9. +// +// At the end of this function: +// +// - The member variable matchingPDI is set to point to the index of the +// matching PDI character for each isolate initiator character. If there is +// no matching PDI, it is set to the length of the input text. For other +// characters, it is set to -1. +// - The member variable matchingIsolateInitiator is set to point to the +// index of the matching isolate initiator character for each PDI character. +// If there is no matching isolate initiator, or the character is not a PDI, +// it is set to -1. +func (p *paragraph) determineMatchingIsolates() { + p.matchingPDI = make([]int, p.Len()) + p.matchingIsolateInitiator = make([]int, p.Len()) + + for i := range p.matchingIsolateInitiator { + p.matchingIsolateInitiator[i] = -1 + } + + for i := range p.matchingPDI { + p.matchingPDI[i] = -1 + + if t := p.resultTypes[i]; t.in(_LRI, _RLI, _FSI) { + depthCounter := 1 + for j := i + 1; j < p.Len(); j++ { + if u := p.resultTypes[j]; u.in(_LRI, _RLI, _FSI) { + depthCounter++ + } else if u == _PDI { + if depthCounter--; depthCounter == 0 { + p.matchingPDI[i] = j + p.matchingIsolateInitiator[j] = i + break + } + } + } + if p.matchingPDI[i] == -1 { + p.matchingPDI[i] = p.Len() + } + } + } +} + +// determineParagraphEmbeddingLevel reports the resolved paragraph direction of +// the substring limited by the given range [start, end). +// +// Determines the paragraph level based on rules P2, P3. This is also used +// in rule X5c to find if an FSI should resolve to LRI or RLI. +func (p *paragraph) determineParagraphEmbeddingLevel(start, end int) level { + var strongType class = -1 // unknown + + // Rule P2. + for i := start; i < end; i++ { + if t := p.resultTypes[i]; t.in(_L, _AL, _R) { + strongType = t + break + } else if t.in(_FSI, _LRI, _RLI) { + i = p.matchingPDI[i] // skip over to the matching PDI + if i > end { + log.Panic("assert (i <= end)") + } + } + } + // Rule P3. + switch strongType { + case -1: // none found + // default embedding level when no strong types found is 0. + return 0 + case _L: + return 0 + default: // AL, R + return 1 + } +} + +const maxDepth = 125 + +// This stack will store the embedding levels and override and isolated +// statuses +type directionalStatusStack struct { + stackCounter int + embeddingLevelStack [maxDepth + 1]level + overrideStatusStack [maxDepth + 1]class + isolateStatusStack [maxDepth + 1]bool +} + +func (s *directionalStatusStack) empty() { s.stackCounter = 0 } +func (s *directionalStatusStack) pop() { s.stackCounter-- } +func (s *directionalStatusStack) depth() int { return s.stackCounter } + +func (s *directionalStatusStack) push(level level, overrideStatus class, isolateStatus bool) { + s.embeddingLevelStack[s.stackCounter] = level + s.overrideStatusStack[s.stackCounter] = overrideStatus + s.isolateStatusStack[s.stackCounter] = isolateStatus + s.stackCounter++ +} + +func (s *directionalStatusStack) lastEmbeddingLevel() level { + return s.embeddingLevelStack[s.stackCounter-1] +} + +func (s *directionalStatusStack) lastDirectionalOverrideStatus() class { + return s.overrideStatusStack[s.stackCounter-1] +} + +func (s *directionalStatusStack) lastDirectionalIsolateStatus() bool { + return s.isolateStatusStack[s.stackCounter-1] +} + +// Determine explicit levels using rules X1 - X8 +func (p *paragraph) determineExplicitEmbeddingLevels() { + var stack directionalStatusStack + var overflowIsolateCount, overflowEmbeddingCount, validIsolateCount int + + // Rule X1. + stack.push(p.embeddingLevel, _ON, false) + + for i, t := range p.resultTypes { + // Rules X2, X3, X4, X5, X5a, X5b, X5c + switch t { + case _RLE, _LRE, _RLO, _LRO, _RLI, _LRI, _FSI: + isIsolate := t.in(_RLI, _LRI, _FSI) + isRTL := t.in(_RLE, _RLO, _RLI) + + // override if this is an FSI that resolves to RLI + if t == _FSI { + isRTL = (p.determineParagraphEmbeddingLevel(i+1, p.matchingPDI[i]) == 1) + } + if isIsolate { + p.resultLevels[i] = stack.lastEmbeddingLevel() + } + + var newLevel level + if isRTL { + // least greater odd + newLevel = (stack.lastEmbeddingLevel() + 1) | 1 + } else { + // least greater even + newLevel = (stack.lastEmbeddingLevel() + 2) &^ 1 + } + + if newLevel <= maxDepth && overflowIsolateCount == 0 && overflowEmbeddingCount == 0 { + if isIsolate { + validIsolateCount++ + } + // Push new embedding level, override status, and isolated + // status. + // No check for valid stack counter, since the level check + // suffices. + switch t { + case _LRO: + stack.push(newLevel, _L, isIsolate) + case _RLO: + stack.push(newLevel, _R, isIsolate) + default: + stack.push(newLevel, _ON, isIsolate) + } + // Not really part of the spec + if !isIsolate { + p.resultLevels[i] = newLevel + } + } else { + // This is an invalid explicit formatting character, + // so apply the "Otherwise" part of rules X2-X5b. + if isIsolate { + overflowIsolateCount++ + } else { // !isIsolate + if overflowIsolateCount == 0 { + overflowEmbeddingCount++ + } + } + } + + // Rule X6a + case _PDI: + if overflowIsolateCount > 0 { + overflowIsolateCount-- + } else if validIsolateCount == 0 { + // do nothing + } else { + overflowEmbeddingCount = 0 + for !stack.lastDirectionalIsolateStatus() { + stack.pop() + } + stack.pop() + validIsolateCount-- + } + p.resultLevels[i] = stack.lastEmbeddingLevel() + + // Rule X7 + case _PDF: + // Not really part of the spec + p.resultLevels[i] = stack.lastEmbeddingLevel() + + if overflowIsolateCount > 0 { + // do nothing + } else if overflowEmbeddingCount > 0 { + overflowEmbeddingCount-- + } else if !stack.lastDirectionalIsolateStatus() && stack.depth() >= 2 { + stack.pop() + } + + case _B: // paragraph separator. + // Rule X8. + + // These values are reset for clarity, in this implementation B + // can only occur as the last code in the array. + stack.empty() + overflowIsolateCount = 0 + overflowEmbeddingCount = 0 + validIsolateCount = 0 + p.resultLevels[i] = p.embeddingLevel + + default: + p.resultLevels[i] = stack.lastEmbeddingLevel() + if stack.lastDirectionalOverrideStatus() != _ON { + p.resultTypes[i] = stack.lastDirectionalOverrideStatus() + } + } + } +} + +type isolatingRunSequence struct { + p *paragraph + + indexes []int // indexes to the original string + + types []class // type of each character using the index + resolvedLevels []level // resolved levels after application of rules + level level + sos, eos class +} + +func (i *isolatingRunSequence) Len() int { return len(i.indexes) } + +func maxLevel(a, b level) level { + if a > b { + return a + } + return b +} + +// Rule X10, second bullet: Determine the start-of-sequence (sos) and end-of-sequence (eos) types, +// either L or R, for each isolating run sequence. +func (p *paragraph) isolatingRunSequence(indexes []int) *isolatingRunSequence { + length := len(indexes) + types := make([]class, length) + for i, x := range indexes { + types[i] = p.resultTypes[x] + } + + // assign level, sos and eos + prevChar := indexes[0] - 1 + for prevChar >= 0 && isRemovedByX9(p.initialTypes[prevChar]) { + prevChar-- + } + prevLevel := p.embeddingLevel + if prevChar >= 0 { + prevLevel = p.resultLevels[prevChar] + } + + var succLevel level + lastType := types[length-1] + if lastType.in(_LRI, _RLI, _FSI) { + succLevel = p.embeddingLevel + } else { + // the first character after the end of run sequence + limit := indexes[length-1] + 1 + for ; limit < p.Len() && isRemovedByX9(p.initialTypes[limit]); limit++ { + + } + succLevel = p.embeddingLevel + if limit < p.Len() { + succLevel = p.resultLevels[limit] + } + } + level := p.resultLevels[indexes[0]] + return &isolatingRunSequence{ + p: p, + indexes: indexes, + types: types, + level: level, + sos: typeForLevel(maxLevel(prevLevel, level)), + eos: typeForLevel(maxLevel(succLevel, level)), + } +} + +// Resolving weak types Rules W1-W7. +// +// Note that some weak types (EN, AN) remain after this processing is +// complete. +func (s *isolatingRunSequence) resolveWeakTypes() { + + // on entry, only these types remain + s.assertOnly(_L, _R, _AL, _EN, _ES, _ET, _AN, _CS, _B, _S, _WS, _ON, _NSM, _LRI, _RLI, _FSI, _PDI) + + // Rule W1. + // Changes all NSMs. + preceedingCharacterType := s.sos + for i, t := range s.types { + if t == _NSM { + s.types[i] = preceedingCharacterType + } else { + if t.in(_LRI, _RLI, _FSI, _PDI) { + preceedingCharacterType = _ON + } + preceedingCharacterType = t + } + } + + // Rule W2. + // EN does not change at the start of the run, because sos != AL. + for i, t := range s.types { + if t == _EN { + for j := i - 1; j >= 0; j-- { + if t := s.types[j]; t.in(_L, _R, _AL) { + if t == _AL { + s.types[i] = _AN + } + break + } + } + } + } + + // Rule W3. + for i, t := range s.types { + if t == _AL { + s.types[i] = _R + } + } + + // Rule W4. + // Since there must be values on both sides for this rule to have an + // effect, the scan skips the first and last value. + // + // Although the scan proceeds left to right, and changes the type + // values in a way that would appear to affect the computations + // later in the scan, there is actually no problem. A change in the + // current value can only affect the value to its immediate right, + // and only affect it if it is ES or CS. But the current value can + // only change if the value to its right is not ES or CS. Thus + // either the current value will not change, or its change will have + // no effect on the remainder of the analysis. + + for i := 1; i < s.Len()-1; i++ { + t := s.types[i] + if t == _ES || t == _CS { + prevSepType := s.types[i-1] + succSepType := s.types[i+1] + if prevSepType == _EN && succSepType == _EN { + s.types[i] = _EN + } else if s.types[i] == _CS && prevSepType == _AN && succSepType == _AN { + s.types[i] = _AN + } + } + } + + // Rule W5. + for i, t := range s.types { + if t == _ET { + // locate end of sequence + runStart := i + runEnd := s.findRunLimit(runStart, _ET) + + // check values at ends of sequence + t := s.sos + if runStart > 0 { + t = s.types[runStart-1] + } + if t != _EN { + t = s.eos + if runEnd < len(s.types) { + t = s.types[runEnd] + } + } + if t == _EN { + setTypes(s.types[runStart:runEnd], _EN) + } + // continue at end of sequence + i = runEnd + } + } + + // Rule W6. + for i, t := range s.types { + if t.in(_ES, _ET, _CS) { + s.types[i] = _ON + } + } + + // Rule W7. + for i, t := range s.types { + if t == _EN { + // set default if we reach start of run + prevStrongType := s.sos + for j := i - 1; j >= 0; j-- { + t = s.types[j] + if t == _L || t == _R { // AL's have been changed to R + prevStrongType = t + break + } + } + if prevStrongType == _L { + s.types[i] = _L + } + } + } +} + +// 6) resolving neutral types Rules N1-N2. +func (s *isolatingRunSequence) resolveNeutralTypes() { + + // on entry, only these types can be in resultTypes + s.assertOnly(_L, _R, _EN, _AN, _B, _S, _WS, _ON, _RLI, _LRI, _FSI, _PDI) + + for i, t := range s.types { + switch t { + case _WS, _ON, _B, _S, _RLI, _LRI, _FSI, _PDI: + // find bounds of run of neutrals + runStart := i + runEnd := s.findRunLimit(runStart, _B, _S, _WS, _ON, _RLI, _LRI, _FSI, _PDI) + + // determine effective types at ends of run + var leadType, trailType class + + // Note that the character found can only be L, R, AN, or + // EN. + if runStart == 0 { + leadType = s.sos + } else { + leadType = s.types[runStart-1] + if leadType.in(_AN, _EN) { + leadType = _R + } + } + if runEnd == len(s.types) { + trailType = s.eos + } else { + trailType = s.types[runEnd] + if trailType.in(_AN, _EN) { + trailType = _R + } + } + + var resolvedType class + if leadType == trailType { + // Rule N1. + resolvedType = leadType + } else { + // Rule N2. + // Notice the embedding level of the run is used, not + // the paragraph embedding level. + resolvedType = typeForLevel(s.level) + } + + setTypes(s.types[runStart:runEnd], resolvedType) + + // skip over run of (former) neutrals + i = runEnd + } + } +} + +func setLevels(levels []level, newLevel level) { + for i := range levels { + levels[i] = newLevel + } +} + +func setTypes(types []class, newType class) { + for i := range types { + types[i] = newType + } +} + +// 7) resolving implicit embedding levels Rules I1, I2. +func (s *isolatingRunSequence) resolveImplicitLevels() { + + // on entry, only these types can be in resultTypes + s.assertOnly(_L, _R, _EN, _AN) + + s.resolvedLevels = make([]level, len(s.types)) + setLevels(s.resolvedLevels, s.level) + + if (s.level & 1) == 0 { // even level + for i, t := range s.types { + // Rule I1. + if t == _L { + // no change + } else if t == _R { + s.resolvedLevels[i] += 1 + } else { // t == _AN || t == _EN + s.resolvedLevels[i] += 2 + } + } + } else { // odd level + for i, t := range s.types { + // Rule I2. + if t == _R { + // no change + } else { // t == _L || t == _AN || t == _EN + s.resolvedLevels[i] += 1 + } + } + } +} + +// Applies the levels and types resolved in rules W1-I2 to the +// resultLevels array. +func (s *isolatingRunSequence) applyLevelsAndTypes() { + for i, x := range s.indexes { + s.p.resultTypes[x] = s.types[i] + s.p.resultLevels[x] = s.resolvedLevels[i] + } +} + +// Return the limit of the run consisting only of the types in validSet +// starting at index. This checks the value at index, and will return +// index if that value is not in validSet. +func (s *isolatingRunSequence) findRunLimit(index int, validSet ...class) int { +loop: + for ; index < len(s.types); index++ { + t := s.types[index] + for _, valid := range validSet { + if t == valid { + continue loop + } + } + return index // didn't find a match in validSet + } + return len(s.types) +} + +// Algorithm validation. Assert that all values in types are in the +// provided set. +func (s *isolatingRunSequence) assertOnly(codes ...class) { +loop: + for i, t := range s.types { + for _, c := range codes { + if t == c { + continue loop + } + } + log.Panicf("invalid bidi code %s present in assertOnly at position %d", t, s.indexes[i]) + } +} + +// determineLevelRuns returns an array of level runs. Each level run is +// described as an array of indexes into the input string. +// +// Determines the level runs. Rule X9 will be applied in determining the +// runs, in the way that makes sure the characters that are supposed to be +// removed are not included in the runs. +func (p *paragraph) determineLevelRuns() [][]int { + run := []int{} + allRuns := [][]int{} + currentLevel := implicitLevel + + for i := range p.initialTypes { + if !isRemovedByX9(p.initialTypes[i]) { + if p.resultLevels[i] != currentLevel { + // we just encountered a new run; wrap up last run + if currentLevel >= 0 { // only wrap it up if there was a run + allRuns = append(allRuns, run) + run = nil + } + // Start new run + currentLevel = p.resultLevels[i] + } + run = append(run, i) + } + } + // Wrap up the final run, if any + if len(run) > 0 { + allRuns = append(allRuns, run) + } + return allRuns +} + +// Definition BD13. Determine isolating run sequences. +func (p *paragraph) determineIsolatingRunSequences() []*isolatingRunSequence { + levelRuns := p.determineLevelRuns() + + // Compute the run that each character belongs to + runForCharacter := make([]int, p.Len()) + for i, run := range levelRuns { + for _, index := range run { + runForCharacter[index] = i + } + } + + sequences := []*isolatingRunSequence{} + + var currentRunSequence []int + + for _, run := range levelRuns { + first := run[0] + if p.initialTypes[first] != _PDI || p.matchingIsolateInitiator[first] == -1 { + currentRunSequence = nil + // int run = i; + for { + // Copy this level run into currentRunSequence + currentRunSequence = append(currentRunSequence, run...) + + last := currentRunSequence[len(currentRunSequence)-1] + lastT := p.initialTypes[last] + if lastT.in(_LRI, _RLI, _FSI) && p.matchingPDI[last] != p.Len() { + run = levelRuns[runForCharacter[p.matchingPDI[last]]] + } else { + break + } + } + sequences = append(sequences, p.isolatingRunSequence(currentRunSequence)) + } + } + return sequences +} + +// Assign level information to characters removed by rule X9. This is for +// ease of relating the level information to the original input data. Note +// that the levels assigned to these codes are arbitrary, they're chosen so +// as to avoid breaking level runs. +func (p *paragraph) assignLevelsToCharactersRemovedByX9() { + for i, t := range p.initialTypes { + if t.in(_LRE, _RLE, _LRO, _RLO, _PDF, _BN) { + p.resultTypes[i] = t + p.resultLevels[i] = -1 + } + } + // now propagate forward the levels information (could have + // propagated backward, the main thing is not to introduce a level + // break where one doesn't already exist). + + if p.resultLevels[0] == -1 { + p.resultLevels[0] = p.embeddingLevel + } + for i := 1; i < len(p.initialTypes); i++ { + if p.resultLevels[i] == -1 { + p.resultLevels[i] = p.resultLevels[i-1] + } + } + // Embedding information is for informational purposes only so need not be + // adjusted. +} + +// +// Output +// + +// getLevels computes levels array breaking lines at offsets in linebreaks. +// Rule L1. +// +// The linebreaks array must include at least one value. The values must be +// in strictly increasing order (no duplicates) between 1 and the length of +// the text, inclusive. The last value must be the length of the text. +func (p *paragraph) getLevels(linebreaks []int) []level { + // Note that since the previous processing has removed all + // P, S, and WS values from resultTypes, the values referred to + // in these rules are the initial types, before any processing + // has been applied (including processing of overrides). + // + // This example implementation has reinserted explicit format codes + // and BN, in order that the levels array correspond to the + // initial text. Their final placement is not normative. + // These codes are treated like WS in this implementation, + // so they don't interrupt sequences of WS. + + validateLineBreaks(linebreaks, p.Len()) + + result := append([]level(nil), p.resultLevels...) + + // don't worry about linebreaks since if there is a break within + // a series of WS values preceding S, the linebreak itself + // causes the reset. + for i, t := range p.initialTypes { + if t.in(_B, _S) { + // Rule L1, clauses one and two. + result[i] = p.embeddingLevel + + // Rule L1, clause three. + for j := i - 1; j >= 0; j-- { + if isWhitespace(p.initialTypes[j]) { // including format codes + result[j] = p.embeddingLevel + } else { + break + } + } + } + } + + // Rule L1, clause four. + start := 0 + for _, limit := range linebreaks { + for j := limit - 1; j >= start; j-- { + if isWhitespace(p.initialTypes[j]) { // including format codes + result[j] = p.embeddingLevel + } else { + break + } + } + start = limit + } + + return result +} + +// getReordering returns the reordering of lines from a visual index to a +// logical index for line breaks at the given offsets. +// +// Lines are concatenated from left to right. So for example, the fifth +// character from the left on the third line is +// +// getReordering(linebreaks)[linebreaks[1] + 4] +// +// (linebreaks[1] is the position after the last character of the second +// line, which is also the index of the first character on the third line, +// and adding four gets the fifth character from the left). +// +// The linebreaks array must include at least one value. The values must be +// in strictly increasing order (no duplicates) between 1 and the length of +// the text, inclusive. The last value must be the length of the text. +func (p *paragraph) getReordering(linebreaks []int) []int { + validateLineBreaks(linebreaks, p.Len()) + + return computeMultilineReordering(p.getLevels(linebreaks), linebreaks) +} + +// Return multiline reordering array for a given level array. Reordering +// does not occur across a line break. +func computeMultilineReordering(levels []level, linebreaks []int) []int { + result := make([]int, len(levels)) + + start := 0 + for _, limit := range linebreaks { + tempLevels := make([]level, limit-start) + copy(tempLevels, levels[start:]) + + for j, order := range computeReordering(tempLevels) { + result[start+j] = order + start + } + start = limit + } + return result +} + +// Return reordering array for a given level array. This reorders a single +// line. The reordering is a visual to logical map. For example, the +// leftmost char is string.charAt(order[0]). Rule L2. +func computeReordering(levels []level) []int { + result := make([]int, len(levels)) + // initialize order + for i := range result { + result[i] = i + } + + // locate highest level found on line. + // Note the rules say text, but no reordering across line bounds is + // performed, so this is sufficient. + highestLevel := level(0) + lowestOddLevel := level(maxDepth + 2) + for _, level := range levels { + if level > highestLevel { + highestLevel = level + } + if level&1 != 0 && level < lowestOddLevel { + lowestOddLevel = level + } + } + + for level := highestLevel; level >= lowestOddLevel; level-- { + for i := 0; i < len(levels); i++ { + if levels[i] >= level { + // find range of text at or above this level + start := i + limit := i + 1 + for limit < len(levels) && levels[limit] >= level { + limit++ + } + + for j, k := start, limit-1; j < k; j, k = j+1, k-1 { + result[j], result[k] = result[k], result[j] + } + // skip to end of level run + i = limit + } + } + } + + return result +} + +// isWhitespace reports whether the type is considered a whitespace type for the +// line break rules. +func isWhitespace(c class) bool { + switch c { + case _LRE, _RLE, _LRO, _RLO, _PDF, _LRI, _RLI, _FSI, _PDI, _BN, _WS: + return true + } + return false +} + +// isRemovedByX9 reports whether the type is one of the types removed in X9. +func isRemovedByX9(c class) bool { + switch c { + case _LRE, _RLE, _LRO, _RLO, _PDF, _BN: + return true + } + return false +} + +// typeForLevel reports the strong type (L or R) corresponding to the level. +func typeForLevel(level level) class { + if (level & 0x1) == 0 { + return _L + } + return _R +} + +// TODO: change validation to not panic + +func validateTypes(types []class) { + if len(types) == 0 { + log.Panic("types is null") + } + for i, t := range types[:len(types)-1] { + if t == _B { + log.Panicf("B type before end of paragraph at index: %d", i) + } + } +} + +func validateParagraphEmbeddingLevel(embeddingLevel level) { + if embeddingLevel != implicitLevel && + embeddingLevel != 0 && + embeddingLevel != 1 { + log.Panicf("illegal paragraph embedding level: %d", embeddingLevel) + } +} + +func validateLineBreaks(linebreaks []int, textLength int) { + prev := 0 + for i, next := range linebreaks { + if next <= prev { + log.Panicf("bad linebreak: %d at index: %d", next, i) + } + prev = next + } + if prev != textLength { + log.Panicf("last linebreak was %d, want %d", prev, textLength) + } +} + +func validatePbTypes(pairTypes []bracketType) { + if len(pairTypes) == 0 { + log.Panic("pairTypes is null") + } + for i, pt := range pairTypes { + switch pt { + case bpNone, bpOpen, bpClose: + default: + log.Panicf("illegal pairType value at %d: %v", i, pairTypes[i]) + } + } +} + +func validatePbValues(pairValues []rune, pairTypes []bracketType) { + if pairValues == nil { + log.Panic("pairValues is null") + } + if len(pairTypes) != len(pairValues) { + log.Panic("pairTypes is different length from pairValues") + } +} diff --git a/vendor/golang.org/x/text/unicode/bidi/core_test.go b/vendor/golang.org/x/text/unicode/bidi/core_test.go new file mode 100644 index 0000000000..1c24adcce2 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/core_test.go @@ -0,0 +1,226 @@ +// 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 bidi + +import ( + "flag" + "fmt" + "log" + "strconv" + "strings" + "testing" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/testtext" + "golang.org/x/text/internal/ucd" + "golang.org/x/text/unicode/norm" +) + +var testLevels = flag.Bool("levels", false, "enable testing of levels") + +// TestBidiCore performs the tests in BidiTest.txt. +// See http://www.unicode.org/Public/UCD/latest/ucd/BidiTest.txt. +func TestBidiCore(t *testing.T) { + testtext.SkipIfNotLong(t) + + r := gen.OpenUCDFile("BidiTest.txt") + defer r.Close() + + var wantLevels, wantOrder []string + p := ucd.New(r, ucd.Part(func(p *ucd.Parser) { + s := strings.Split(p.String(0), ":") + switch s[0] { + case "Levels": + wantLevels = strings.Fields(s[1]) + case "Reorder": + wantOrder = strings.Fields(s[1]) + default: + log.Fatalf("Unknown part %q.", s[0]) + } + })) + + for p.Next() { + types := []class{} + for _, s := range p.Strings(0) { + types = append(types, bidiClass[s]) + } + // We ignore the bracketing part of the algorithm. + pairTypes := make([]bracketType, len(types)) + pairValues := make([]rune, len(types)) + + for i := uint(0); i < 3; i++ { + if p.Uint(1)&(1<<i) == 0 { + continue + } + lev := level(int(i) - 1) + par := newParagraph(types, pairTypes, pairValues, lev) + + if *testLevels { + levels := par.resultLevels + for i, s := range wantLevels { + if s == "x" { + continue + } + l, _ := strconv.ParseUint(s, 10, 8) + if level(l)&1 != levels[i]&1 { + t.Errorf("%s:%d:levels: got %v; want %v", p.String(0), lev, levels, wantLevels) + break + } + } + } + + order := par.getReordering([]int{len(types)}) + gotOrder := filterOrder(types, order) + if got, want := fmt.Sprint(gotOrder), fmt.Sprint(wantOrder); got != want { + t.Errorf("%s:%d:order: got %v; want %v\noriginal %v", p.String(0), lev, got, want, order) + } + } + } + if err := p.Err(); err != nil { + log.Fatal(err) + } +} + +var removeClasses = map[class]bool{ + _LRO: true, + _RLO: true, + _RLE: true, + _LRE: true, + _PDF: true, + _BN: true, +} + +// TestBidiCharacters performs the tests in BidiCharacterTest.txt. +// See http://www.unicode.org/Public/UCD/latest/ucd/BidiCharacterTest.txt +func TestBidiCharacters(t *testing.T) { + testtext.SkipIfNotLong(t) + + ucd.Parse(gen.OpenUCDFile("BidiCharacterTest.txt"), func(p *ucd.Parser) { + var ( + types []class + pairTypes []bracketType + pairValues []rune + parLevel level + + wantLevel = level(p.Int(2)) + wantLevels = p.Strings(3) + wantVisualOrder = p.Strings(4) + ) + + switch l := p.Int(1); l { + case 0, 1: + parLevel = level(l) + case 2: + parLevel = implicitLevel + default: + // Spec says to ignore unknown parts. + } + + trie := newBidiTrie(0) + runes := p.Runes(0) + + for _, r := range runes { + // Assign the bracket type. + if d := norm.NFKD.PropertiesString(string(r)).Decomposition(); d != nil { + r = []rune(string(d))[0] + } + e, _ := trie.lookupString(string(r)) + entry := entry(e) + + // Assign the class for this rune. + types = append(types, entry.class(r)) + + switch { + case !entry.isBracket(): + pairTypes = append(pairTypes, bpNone) + pairValues = append(pairValues, 0) + case entry.isOpen(): + pairTypes = append(pairTypes, bpOpen) + pairValues = append(pairValues, r) + default: + pairTypes = append(pairTypes, bpClose) + pairValues = append(pairValues, entry.reverseBracket(r)) + } + } + par := newParagraph(types, pairTypes, pairValues, parLevel) + + // Test results: + if got := par.embeddingLevel; got != wantLevel { + t.Errorf("%v:level: got %d; want %d", string(runes), got, wantLevel) + } + + if *testLevels { + gotLevels := getLevelStrings(types, par.resultLevels) + if got, want := fmt.Sprint(gotLevels), fmt.Sprint(wantLevels); got != want { + t.Errorf("%04X %q:%d: got %v; want %v\nval: %x\npair: %v", runes, string(runes), parLevel, got, want, pairValues, pairTypes) + } + } + + order := par.getReordering([]int{len(types)}) + order = filterOrder(types, order) + if got, want := fmt.Sprint(order), fmt.Sprint(wantVisualOrder); got != want { + t.Errorf("%04X %q:%d: got %v; want %v\ngot order: %s", runes, string(runes), parLevel, got, want, reorder(runes, order)) + } + }) +} + +func getLevelStrings(cl []class, levels []level) []string { + var results []string + for i, l := range levels { + if !removeClasses[cl[i]] { + results = append(results, fmt.Sprint(l)) + } else { + results = append(results, "x") + } + } + return results +} + +func filterOrder(cl []class, order []int) []int { + no := []int{} + for _, o := range order { + if !removeClasses[cl[o]] { + no = append(no, o) + } + } + return no +} + +func reorder(r []rune, order []int) string { + nr := make([]rune, len(order)) + for i, o := range order { + nr[i] = r[o] + } + return string(nr) +} + +// bidiClass names and codes taken from class "bc" in +// http://www.unicode.org/Public/8.0.0/ucd/PropertyValueAliases.txt +var bidiClass = map[string]class{ + "AL": _AL, // classArabicLetter, + "AN": _AN, // classArabicNumber, + "B": _B, // classParagraphSeparator, + "BN": _BN, // classBoundaryNeutral, + "CS": _CS, // classCommonSeparator, + "EN": _EN, // classEuropeanNumber, + "ES": _ES, // classEuropeanSeparator, + "ET": _ET, // classEuropeanTerminator, + "L": _L, // classLeftToRight, + "NSM": _NSM, // classNonspacingMark, + "ON": _ON, // classOtherNeutral, + "R": _R, // classRightToLeft, + "S": _S, // classSegmentSeparator, + "WS": _WS, // classWhiteSpace, + + "LRO": _LRO, // classLeftToRightOverride, + "RLO": _RLO, // classRightToLeftOverride, + "LRE": _LRE, // classLeftToRightEmbedding, + "RLE": _RLE, // classRightToLeftEmbedding, + "PDF": _PDF, // classPopDirectionalFormat, + "LRI": _LRI, // classLeftToRightIsolate, + "RLI": _RLI, // classRightToLeftIsolate, + "FSI": _FSI, // classFirstStrongIsolate, + "PDI": _PDI, // classPopDirectionalIsolate, +} diff --git a/vendor/golang.org/x/text/unicode/bidi/gen.go b/vendor/golang.org/x/text/unicode/bidi/gen.go new file mode 100644 index 0000000000..74bf76b5f0 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/gen.go @@ -0,0 +1,133 @@ +// 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 ignore + +package main + +import ( + "flag" + "log" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/triegen" + "golang.org/x/text/internal/ucd" +) + +var outputFile = flag.String("out", "tables.go", "output file") + +func main() { + gen.Init() + gen.Repackage("gen_trieval.go", "trieval.go", "bidi") + gen.Repackage("gen_ranges.go", "ranges_test.go", "bidi") + + genTables() +} + +// bidiClass names and codes taken from class "bc" in +// http://www.unicode.org/Public/8.0.0/ucd/PropertyValueAliases.txt +var bidiClass = map[string]class{ + "AL": _AL, // ArabicLetter + "AN": _AN, // ArabicNumber + "B": _B, // ParagraphSeparator + "BN": _BN, // BoundaryNeutral + "CS": _CS, // CommonSeparator + "EN": _EN, // EuropeanNumber + "ES": _ES, // EuropeanSeparator + "ET": _ET, // EuropeanTerminator + "L": _L, // LeftToRight + "NSM": _NSM, // NonspacingMark + "ON": _ON, // OtherNeutral + "R": _R, // RightToLeft + "S": _S, // SegmentSeparator + "WS": _WS, // WhiteSpace + + "FSI": classControl, + "PDF": classControl, + "PDI": classControl, + "LRE": classControl, + "LRI": classControl, + "LRO": classControl, + "RLE": classControl, + "RLI": classControl, + "RLO": classControl, +} + +func genTables() { + if numClass > 0x0F { + log.Fatalf("Too many Class constants (%#x > 0x0F).", numClass) + } + w := gen.NewCodeWriter() + defer w.WriteGoFile(*outputFile, "bidi") + + gen.WriteUnicodeVersion(w) + + t := triegen.NewTrie("bidi") + + // Build data about bracket mapping. These bits need to be or-ed with + // any other bits. + orMask := map[rune]uint64{} + + xorMap := map[rune]int{} + xorMasks := []rune{0} // First value is no-op. + + ucd.Parse(gen.OpenUCDFile("BidiBrackets.txt"), func(p *ucd.Parser) { + r1 := p.Rune(0) + r2 := p.Rune(1) + xor := r1 ^ r2 + if _, ok := xorMap[xor]; !ok { + xorMap[xor] = len(xorMasks) + xorMasks = append(xorMasks, xor) + } + entry := uint64(xorMap[xor]) << xorMaskShift + switch p.String(2) { + case "o": + entry |= openMask + case "c", "n": + default: + log.Fatalf("Unknown bracket class %q.", p.String(2)) + } + orMask[r1] = entry + }) + + w.WriteComment(` + xorMasks contains masks to be xor-ed with brackets to get the reverse + version.`) + w.WriteVar("xorMasks", xorMasks) + + done := map[rune]bool{} + + insert := func(r rune, c class) { + if !done[r] { + t.Insert(r, orMask[r]|uint64(c)) + done[r] = true + } + } + + // Insert the derived BiDi properties. + ucd.Parse(gen.OpenUCDFile("extracted/DerivedBidiClass.txt"), func(p *ucd.Parser) { + r := p.Rune(0) + class, ok := bidiClass[p.String(1)] + if !ok { + log.Fatalf("%U: Unknown BiDi class %q", r, p.String(1)) + } + insert(r, class) + }) + visitDefaults(insert) + + // TODO: use sparse blocks. This would reduce table size considerably + // from the looks of it. + + sz, err := t.Gen(w) + if err != nil { + log.Fatal(err) + } + w.Size += sz +} + +// dummy values to make methods in gen_common compile. The real versions +// will be generated by this file to tables.go. +var ( + xorMasks []rune +) diff --git a/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go b/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go new file mode 100644 index 0000000000..9f4c335b56 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/gen_ranges.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. + +// +build ignore + +package main + +import ( + "unicode" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/ucd" + "golang.org/x/text/unicode/rangetable" +) + +// These tables are hand-extracted from: +// http://www.unicode.org/Public/8.0.0/ucd/extracted/DerivedBidiClass.txt +func visitDefaults(fn func(r rune, c class)) { + // first write default values for ranges listed above. + visitRunes(fn, _AL, []rune{ + 0x0600, 0x07BF, // Arabic + 0x08A0, 0x08FF, // Arabic Extended-A + 0xFB50, 0xFDCF, // Arabic Presentation Forms + 0xFDF0, 0xFDFF, + 0xFE70, 0xFEFF, + 0x0001EE00, 0x0001EEFF, // Arabic Mathematical Alpha Symbols + }) + visitRunes(fn, _R, []rune{ + 0x0590, 0x05FF, // Hebrew + 0x07C0, 0x089F, // Nko et al. + 0xFB1D, 0xFB4F, + 0x00010800, 0x00010FFF, // Cypriot Syllabary et. al. + 0x0001E800, 0x0001EDFF, + 0x0001EF00, 0x0001EFFF, + }) + visitRunes(fn, _ET, []rune{ // European Terminator + 0x20A0, 0x20Cf, // Currency symbols + }) + rangetable.Visit(unicode.Noncharacter_Code_Point, func(r rune) { + fn(r, _BN) // Boundary Neutral + }) + ucd.Parse(gen.OpenUCDFile("DerivedCoreProperties.txt"), func(p *ucd.Parser) { + if p.String(1) == "Default_Ignorable_Code_Point" { + fn(p.Rune(0), _BN) // Boundary Neutral + } + }) +} + +func visitRunes(fn func(r rune, c class), c class, runes []rune) { + for i := 0; i < len(runes); i += 2 { + lo, hi := runes[i], runes[i+1] + for j := lo; j <= hi; j++ { + fn(j, c) + } + } +} diff --git a/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go b/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go new file mode 100644 index 0000000000..3730d5ccda --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go @@ -0,0 +1,73 @@ +// 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 ignore + +package main + +type class int + +const ( + _L class = iota // LeftToRight + _R // RightToLeft + _EN // EuropeanNumber + _ES // EuropeanSeparator + _ET // EuropeanTerminator + _AN // ArabicNumber + _CS // CommonSeparator + _B // ParagraphSeparator + _S // SegmentSeparator + _WS // WhiteSpace + _ON // OtherNeutral + _BN // BoundaryNeutral + _NSM // NonspacingMark + _AL // ArabicLetter + classControl // Control LRO - PDI + + numClass + + _LRO // LeftToRightOverride + _RLO // RightToLeftOverride + _LRE // LeftToRightEmbedding + _RLE // RightToLeftEmbedding + _PDF // PopDirectionalFormat + _LRI // LeftToRightIsolate + _RLI // RightToLeftIsolate + _FSI // FirstStrongIsolate + _PDI // PopDirectionalIsolate +) + +var controlToClass = map[rune]class{ + 0x202D: _LRO, // LeftToRightOverride, + 0x202E: _RLO, // RightToLeftOverride, + 0x202A: _LRE, // LeftToRightEmbedding, + 0x202B: _RLE, // RightToLeftEmbedding, + 0x202C: _PDF, // PopDirectionalFormat, + 0x2066: _LRI, // LeftToRightIsolate, + 0x2067: _RLI, // RightToLeftIsolate, + 0x2068: _FSI, // FirstStrongIsolate, + 0x2069: _PDI, // PopDirectionalIsolate, +} + +// A trie entry has the following bits: +// 7..5 XOR mask for brackets +// 4 1: Bracket open, 0: Bracket close +// 3..0 class type +type entry uint8 + +const ( + openMask = 0x10 + xorMaskShift = 5 +) + +func (e entry) isBracket() bool { return e&0xF0 != 0 } +func (e entry) isOpen() bool { return e&openMask != 0 } +func (e entry) reverseBracket(r rune) rune { return xorMasks[e>>xorMaskShift] ^ r } +func (e entry) class(r rune) class { + c := class(e & 0x0F) + if c == classControl { + return controlToClass[r] + } + return c +} diff --git a/vendor/golang.org/x/text/unicode/bidi/ranges_test.go b/vendor/golang.org/x/text/unicode/bidi/ranges_test.go new file mode 100644 index 0000000000..dadbe95597 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/ranges_test.go @@ -0,0 +1,53 @@ +// This file was generated by go generate; DO NOT EDIT + +package bidi + +import ( + "unicode" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/ucd" + "golang.org/x/text/unicode/rangetable" +) + +// These tables are hand-extracted from: +// http://www.unicode.org/Public/8.0.0/ucd/extracted/DerivedBidiClass.txt +func visitDefaults(fn func(r rune, c class)) { + // first write default values for ranges listed above. + visitRunes(fn, _AL, []rune{ + 0x0600, 0x07BF, // Arabic + 0x08A0, 0x08FF, // Arabic Extended-A + 0xFB50, 0xFDCF, // Arabic Presentation Forms + 0xFDF0, 0xFDFF, + 0xFE70, 0xFEFF, + 0x0001EE00, 0x0001EEFF, // Arabic Mathematical Alpha Symbols + }) + visitRunes(fn, _R, []rune{ + 0x0590, 0x05FF, // Hebrew + 0x07C0, 0x089F, // Nko et al. + 0xFB1D, 0xFB4F, + 0x00010800, 0x00010FFF, // Cypriot Syllabary et. al. + 0x0001E800, 0x0001EDFF, + 0x0001EF00, 0x0001EFFF, + }) + visitRunes(fn, _ET, []rune{ // European Terminator + 0x20A0, 0x20Cf, // Currency symbols + }) + rangetable.Visit(unicode.Noncharacter_Code_Point, func(r rune) { + fn(r, _BN) // Boundary Neutral + }) + ucd.Parse(gen.OpenUCDFile("DerivedCoreProperties.txt"), func(p *ucd.Parser) { + if p.String(1) == "Default_Ignorable_Code_Point" { + fn(p.Rune(0), _BN) // Boundary Neutral + } + }) +} + +func visitRunes(fn func(r rune, c class), c class, runes []rune) { + for i := 0; i < len(runes); i += 2 { + lo, hi := runes[i], runes[i+1] + for j := lo; j <= hi; j++ { + fn(j, c) + } + } +} diff --git a/vendor/golang.org/x/text/unicode/bidi/tables.go b/vendor/golang.org/x/text/unicode/bidi/tables.go new file mode 100644 index 0000000000..301ef9476b --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/tables.go @@ -0,0 +1,1738 @@ +// This file was generated by go generate; DO NOT EDIT + +package bidi + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "8.0.0" + +// xorMasks contains masks to be xor-ed with brackets to get the reverse +// version. +var xorMasks = []int32{ // 8 elements + 0, 1, 6, 7, 3, 15, 29, 63, +} // Size: 56 bytes + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *bidiTrie) lookup(s []byte) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return bidiValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = bidiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *bidiTrie) lookupUnsafe(s []byte) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return bidiValues[c0] + } + i := bidiIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *bidiTrie) lookupString(s string) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return bidiValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = bidiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *bidiTrie) lookupStringUnsafe(s string) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return bidiValues[c0] + } + i := bidiIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// bidiTrie. Total size: 15424 bytes (15.06 KiB). Checksum: 4ef14cc127954140. +type bidiTrie struct{} + +func newBidiTrie(i int) *bidiTrie { + return &bidiTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 { + switch { + default: + return uint8(bidiValues[n<<6+uint32(b)]) + } +} + +// bidiValues: 217 blocks, 13888 entries, 13888 bytes +// The third block is the zero block. +var bidiValues = [13888]uint8{ + // Block 0x0, offset 0x0 + 0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b, + 0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008, + 0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b, + 0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b, + 0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007, + 0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004, + 0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a, + 0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006, + 0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002, + 0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a, + 0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a, + // Block 0x1, offset 0x40 + 0x40: 0x000a, + 0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a, + 0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a, + 0x7b: 0x005a, + 0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007, + 0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b, + 0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b, + 0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b, + 0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b, + 0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004, + 0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a, + 0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a, + 0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a, + 0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a, + 0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a, + // Block 0x4, offset 0x100 + 0x117: 0x000a, + 0x137: 0x000a, + // Block 0x5, offset 0x140 + 0x179: 0x000a, 0x17a: 0x000a, + // Block 0x6, offset 0x180 + 0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a, + 0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a, + 0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a, + 0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a, + 0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a, + 0x19e: 0x000a, 0x19f: 0x000a, + 0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a, + 0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a, + 0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a, + 0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a, + 0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c, + 0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c, + 0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c, + 0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c, + 0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c, + 0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c, + 0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c, + 0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c, + 0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c, + 0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c, + 0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c, + // Block 0x8, offset 0x200 + 0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c, + 0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c, + 0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c, + 0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c, + 0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c, + 0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c, + 0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c, + 0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c, + 0x234: 0x000a, 0x235: 0x000a, + 0x23e: 0x000a, + // Block 0x9, offset 0x240 + 0x244: 0x000a, 0x245: 0x000a, + 0x247: 0x000a, + // Block 0xa, offset 0x280 + 0x2b6: 0x000a, + // Block 0xb, offset 0x2c0 + 0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c, + 0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c, + // Block 0xc, offset 0x300 + 0x30a: 0x000a, + 0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c, + 0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c, + 0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c, + 0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c, + 0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c, + 0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c, + 0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c, + 0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c, + 0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c, + // Block 0xd, offset 0x340 + 0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c, + 0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001, + 0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001, + 0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001, + 0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001, + 0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001, + 0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001, + 0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001, + 0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001, + 0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001, + 0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001, + // Block 0xe, offset 0x380 + 0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005, + 0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d, + 0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c, + 0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c, + 0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d, + 0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d, + 0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d, + 0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d, + 0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d, + 0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d, + 0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d, + 0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c, + 0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c, + 0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c, + 0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c, + 0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005, + 0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005, + 0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d, + 0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d, + 0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d, + 0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d, + // Block 0x10, offset 0x400 + 0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d, + 0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d, + 0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d, + 0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d, + 0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d, + 0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d, + 0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d, + 0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d, + 0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d, + 0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d, + 0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d, + // Block 0x11, offset 0x440 + 0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d, + 0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d, + 0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d, + 0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c, + 0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005, + 0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c, + 0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a, + 0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d, + 0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002, + 0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d, + 0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d, + // Block 0x12, offset 0x480 + 0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d, + 0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d, + 0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c, + 0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d, + 0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d, + 0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d, + 0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d, + 0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d, + 0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c, + 0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c, + 0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c, + 0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d, + 0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d, + 0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d, + 0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d, + 0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d, + 0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d, + 0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d, + 0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d, + 0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d, + 0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d, + // Block 0x14, offset 0x500 + 0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d, + 0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d, + 0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d, + 0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d, + 0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d, + 0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d, + 0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c, + 0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c, + 0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d, + 0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d, + 0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d, + // Block 0x15, offset 0x540 + 0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001, + 0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001, + 0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001, + 0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001, + 0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001, + 0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001, + 0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001, + 0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c, + 0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001, + 0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001, + 0x57c: 0x0001, 0x57d: 0x0001, 0x57e: 0x0001, 0x57f: 0x0001, + // Block 0x16, offset 0x580 + 0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001, + 0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001, + 0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001, + 0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c, + 0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c, + 0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c, + 0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c, + 0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001, + 0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001, + 0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001, + 0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001, + 0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001, + 0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001, + 0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001, + 0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001, + 0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x0001, 0x5e1: 0x0001, 0x5e2: 0x0001, 0x5e3: 0x0001, + 0x5e4: 0x0001, 0x5e5: 0x0001, 0x5e6: 0x0001, 0x5e7: 0x0001, 0x5e8: 0x0001, 0x5e9: 0x0001, + 0x5ea: 0x0001, 0x5eb: 0x0001, 0x5ec: 0x0001, 0x5ed: 0x0001, 0x5ee: 0x0001, 0x5ef: 0x0001, + 0x5f0: 0x0001, 0x5f1: 0x0001, 0x5f2: 0x0001, 0x5f3: 0x0001, 0x5f4: 0x0001, 0x5f5: 0x0001, + 0x5f6: 0x0001, 0x5f7: 0x0001, 0x5f8: 0x0001, 0x5f9: 0x0001, 0x5fa: 0x0001, 0x5fb: 0x0001, + 0x5fc: 0x0001, 0x5fd: 0x0001, 0x5fe: 0x0001, 0x5ff: 0x0001, + // Block 0x18, offset 0x600 + 0x600: 0x0001, 0x601: 0x0001, 0x602: 0x0001, 0x603: 0x0001, 0x604: 0x0001, 0x605: 0x0001, + 0x606: 0x0001, 0x607: 0x0001, 0x608: 0x0001, 0x609: 0x0001, 0x60a: 0x0001, 0x60b: 0x0001, + 0x60c: 0x0001, 0x60d: 0x0001, 0x60e: 0x0001, 0x60f: 0x0001, 0x610: 0x0001, 0x611: 0x0001, + 0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001, + 0x618: 0x0001, 0x619: 0x0001, 0x61a: 0x0001, 0x61b: 0x0001, 0x61c: 0x0001, 0x61d: 0x0001, + 0x61e: 0x0001, 0x61f: 0x0001, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d, + 0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d, + 0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d, + 0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d, + 0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d, + 0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d, + // Block 0x19, offset 0x640 + 0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d, + 0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000d, 0x64b: 0x000d, + 0x64c: 0x000d, 0x64d: 0x000d, 0x64e: 0x000d, 0x64f: 0x000d, 0x650: 0x000d, 0x651: 0x000d, + 0x652: 0x000d, 0x653: 0x000d, 0x654: 0x000d, 0x655: 0x000d, 0x656: 0x000d, 0x657: 0x000d, + 0x658: 0x000d, 0x659: 0x000d, 0x65a: 0x000d, 0x65b: 0x000d, 0x65c: 0x000d, 0x65d: 0x000d, + 0x65e: 0x000d, 0x65f: 0x000d, 0x660: 0x000d, 0x661: 0x000d, 0x662: 0x000d, 0x663: 0x000c, + 0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c, + 0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c, + 0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c, + 0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c, + 0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c, + // Block 0x1a, offset 0x680 + 0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c, + 0x6ba: 0x000c, + 0x6bc: 0x000c, + // Block 0x1b, offset 0x6c0 + 0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c, + 0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c, + 0x6cd: 0x000c, 0x6d1: 0x000c, + 0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c, + 0x6e2: 0x000c, 0x6e3: 0x000c, + // Block 0x1c, offset 0x700 + 0x701: 0x000c, + 0x73c: 0x000c, + // Block 0x1d, offset 0x740 + 0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c, + 0x74d: 0x000c, + 0x762: 0x000c, 0x763: 0x000c, + 0x772: 0x0004, 0x773: 0x0004, + 0x77b: 0x0004, + // Block 0x1e, offset 0x780 + 0x781: 0x000c, 0x782: 0x000c, + 0x7bc: 0x000c, + // Block 0x1f, offset 0x7c0 + 0x7c1: 0x000c, 0x7c2: 0x000c, + 0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c, + 0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c, + 0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c, + // Block 0x20, offset 0x800 + 0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c, + 0x807: 0x000c, 0x808: 0x000c, + 0x80d: 0x000c, + 0x822: 0x000c, 0x823: 0x000c, + 0x831: 0x0004, + // Block 0x21, offset 0x840 + 0x841: 0x000c, + 0x87c: 0x000c, 0x87f: 0x000c, + // Block 0x22, offset 0x880 + 0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c, + 0x88d: 0x000c, + 0x896: 0x000c, + 0x8a2: 0x000c, 0x8a3: 0x000c, + // Block 0x23, offset 0x8c0 + 0x8c2: 0x000c, + // Block 0x24, offset 0x900 + 0x900: 0x000c, + 0x90d: 0x000c, + 0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a, + 0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a, + // Block 0x25, offset 0x940 + 0x940: 0x000c, + 0x97e: 0x000c, 0x97f: 0x000c, + // Block 0x26, offset 0x980 + 0x980: 0x000c, + 0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c, + 0x98c: 0x000c, 0x98d: 0x000c, + 0x995: 0x000c, 0x996: 0x000c, + 0x9a2: 0x000c, 0x9a3: 0x000c, + 0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a, + 0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a, + // Block 0x27, offset 0x9c0 + 0x9cc: 0x000c, 0x9cd: 0x000c, + 0x9e2: 0x000c, 0x9e3: 0x000c, + // Block 0x28, offset 0xa00 + 0xa01: 0x000c, + // Block 0x29, offset 0xa40 + 0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c, + 0xa4d: 0x000c, + 0xa62: 0x000c, 0xa63: 0x000c, + // Block 0x2a, offset 0xa80 + 0xa8a: 0x000c, + 0xa92: 0x000c, 0xa93: 0x000c, 0xa94: 0x000c, 0xa96: 0x000c, + // Block 0x2b, offset 0xac0 + 0xaf1: 0x000c, 0xaf4: 0x000c, 0xaf5: 0x000c, + 0xaf6: 0x000c, 0xaf7: 0x000c, 0xaf8: 0x000c, 0xaf9: 0x000c, 0xafa: 0x000c, + 0xaff: 0x0004, + // Block 0x2c, offset 0xb00 + 0xb07: 0x000c, 0xb08: 0x000c, 0xb09: 0x000c, 0xb0a: 0x000c, 0xb0b: 0x000c, + 0xb0c: 0x000c, 0xb0d: 0x000c, 0xb0e: 0x000c, + // Block 0x2d, offset 0xb40 + 0xb71: 0x000c, 0xb74: 0x000c, 0xb75: 0x000c, + 0xb76: 0x000c, 0xb77: 0x000c, 0xb78: 0x000c, 0xb79: 0x000c, 0xb7b: 0x000c, + 0xb7c: 0x000c, + // Block 0x2e, offset 0xb80 + 0xb88: 0x000c, 0xb89: 0x000c, 0xb8a: 0x000c, 0xb8b: 0x000c, + 0xb8c: 0x000c, 0xb8d: 0x000c, + // Block 0x2f, offset 0xbc0 + 0xbd8: 0x000c, 0xbd9: 0x000c, + 0xbf5: 0x000c, + 0xbf7: 0x000c, 0xbf9: 0x000c, 0xbfa: 0x003a, 0xbfb: 0x002a, + 0xbfc: 0x003a, 0xbfd: 0x002a, + // Block 0x30, offset 0xc00 + 0xc31: 0x000c, 0xc32: 0x000c, 0xc33: 0x000c, 0xc34: 0x000c, 0xc35: 0x000c, + 0xc36: 0x000c, 0xc37: 0x000c, 0xc38: 0x000c, 0xc39: 0x000c, 0xc3a: 0x000c, 0xc3b: 0x000c, + 0xc3c: 0x000c, 0xc3d: 0x000c, 0xc3e: 0x000c, + // Block 0x31, offset 0xc40 + 0xc40: 0x000c, 0xc41: 0x000c, 0xc42: 0x000c, 0xc43: 0x000c, 0xc44: 0x000c, + 0xc46: 0x000c, 0xc47: 0x000c, + 0xc4d: 0x000c, 0xc4e: 0x000c, 0xc4f: 0x000c, 0xc50: 0x000c, 0xc51: 0x000c, + 0xc52: 0x000c, 0xc53: 0x000c, 0xc54: 0x000c, 0xc55: 0x000c, 0xc56: 0x000c, 0xc57: 0x000c, + 0xc59: 0x000c, 0xc5a: 0x000c, 0xc5b: 0x000c, 0xc5c: 0x000c, 0xc5d: 0x000c, + 0xc5e: 0x000c, 0xc5f: 0x000c, 0xc60: 0x000c, 0xc61: 0x000c, 0xc62: 0x000c, 0xc63: 0x000c, + 0xc64: 0x000c, 0xc65: 0x000c, 0xc66: 0x000c, 0xc67: 0x000c, 0xc68: 0x000c, 0xc69: 0x000c, + 0xc6a: 0x000c, 0xc6b: 0x000c, 0xc6c: 0x000c, 0xc6d: 0x000c, 0xc6e: 0x000c, 0xc6f: 0x000c, + 0xc70: 0x000c, 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c, + 0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c, + 0xc7c: 0x000c, + // Block 0x32, offset 0xc80 + 0xc86: 0x000c, + // Block 0x33, offset 0xcc0 + 0xced: 0x000c, 0xcee: 0x000c, 0xcef: 0x000c, + 0xcf0: 0x000c, 0xcf2: 0x000c, 0xcf3: 0x000c, 0xcf4: 0x000c, 0xcf5: 0x000c, + 0xcf6: 0x000c, 0xcf7: 0x000c, 0xcf9: 0x000c, 0xcfa: 0x000c, + 0xcfd: 0x000c, 0xcfe: 0x000c, + // Block 0x34, offset 0xd00 + 0xd18: 0x000c, 0xd19: 0x000c, + 0xd1e: 0x000c, 0xd1f: 0x000c, 0xd20: 0x000c, + 0xd31: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c, + // Block 0x35, offset 0xd40 + 0xd42: 0x000c, 0xd45: 0x000c, + 0xd46: 0x000c, + 0xd4d: 0x000c, + 0xd5d: 0x000c, + // Block 0x36, offset 0xd80 + 0xd9d: 0x000c, + 0xd9e: 0x000c, 0xd9f: 0x000c, + // Block 0x37, offset 0xdc0 + 0xdd0: 0x000a, 0xdd1: 0x000a, + 0xdd2: 0x000a, 0xdd3: 0x000a, 0xdd4: 0x000a, 0xdd5: 0x000a, 0xdd6: 0x000a, 0xdd7: 0x000a, + 0xdd8: 0x000a, 0xdd9: 0x000a, + // Block 0x38, offset 0xe00 + 0xe00: 0x000a, + // Block 0x39, offset 0xe40 + 0xe40: 0x0009, + 0xe5b: 0x007a, 0xe5c: 0x006a, + // Block 0x3a, offset 0xe80 + 0xe92: 0x000c, 0xe93: 0x000c, 0xe94: 0x000c, + 0xeb2: 0x000c, 0xeb3: 0x000c, 0xeb4: 0x000c, + // Block 0x3b, offset 0xec0 + 0xed2: 0x000c, 0xed3: 0x000c, + 0xef2: 0x000c, 0xef3: 0x000c, + // Block 0x3c, offset 0xf00 + 0xf34: 0x000c, 0xf35: 0x000c, + 0xf37: 0x000c, 0xf38: 0x000c, 0xf39: 0x000c, 0xf3a: 0x000c, 0xf3b: 0x000c, + 0xf3c: 0x000c, 0xf3d: 0x000c, + // Block 0x3d, offset 0xf40 + 0xf46: 0x000c, 0xf49: 0x000c, 0xf4a: 0x000c, 0xf4b: 0x000c, + 0xf4c: 0x000c, 0xf4d: 0x000c, 0xf4e: 0x000c, 0xf4f: 0x000c, 0xf50: 0x000c, 0xf51: 0x000c, + 0xf52: 0x000c, 0xf53: 0x000c, + 0xf5b: 0x0004, 0xf5d: 0x000c, + 0xf70: 0x000a, 0xf71: 0x000a, 0xf72: 0x000a, 0xf73: 0x000a, 0xf74: 0x000a, 0xf75: 0x000a, + 0xf76: 0x000a, 0xf77: 0x000a, 0xf78: 0x000a, 0xf79: 0x000a, + // Block 0x3e, offset 0xf80 + 0xf80: 0x000a, 0xf81: 0x000a, 0xf82: 0x000a, 0xf83: 0x000a, 0xf84: 0x000a, 0xf85: 0x000a, + 0xf86: 0x000a, 0xf87: 0x000a, 0xf88: 0x000a, 0xf89: 0x000a, 0xf8a: 0x000a, 0xf8b: 0x000c, + 0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000b, + // Block 0x3f, offset 0xfc0 + 0xfe9: 0x000c, + // Block 0x40, offset 0x1000 + 0x1020: 0x000c, 0x1021: 0x000c, 0x1022: 0x000c, + 0x1027: 0x000c, 0x1028: 0x000c, + 0x1032: 0x000c, + 0x1039: 0x000c, 0x103a: 0x000c, 0x103b: 0x000c, + // Block 0x41, offset 0x1040 + 0x1040: 0x000a, 0x1044: 0x000a, 0x1045: 0x000a, + // Block 0x42, offset 0x1080 + 0x109e: 0x000a, 0x109f: 0x000a, 0x10a0: 0x000a, 0x10a1: 0x000a, 0x10a2: 0x000a, 0x10a3: 0x000a, + 0x10a4: 0x000a, 0x10a5: 0x000a, 0x10a6: 0x000a, 0x10a7: 0x000a, 0x10a8: 0x000a, 0x10a9: 0x000a, + 0x10aa: 0x000a, 0x10ab: 0x000a, 0x10ac: 0x000a, 0x10ad: 0x000a, 0x10ae: 0x000a, 0x10af: 0x000a, + 0x10b0: 0x000a, 0x10b1: 0x000a, 0x10b2: 0x000a, 0x10b3: 0x000a, 0x10b4: 0x000a, 0x10b5: 0x000a, + 0x10b6: 0x000a, 0x10b7: 0x000a, 0x10b8: 0x000a, 0x10b9: 0x000a, 0x10ba: 0x000a, 0x10bb: 0x000a, + 0x10bc: 0x000a, 0x10bd: 0x000a, 0x10be: 0x000a, 0x10bf: 0x000a, + // Block 0x43, offset 0x10c0 + 0x10d7: 0x000c, + 0x10d8: 0x000c, 0x10db: 0x000c, + // Block 0x44, offset 0x1100 + 0x1116: 0x000c, + 0x1118: 0x000c, 0x1119: 0x000c, 0x111a: 0x000c, 0x111b: 0x000c, 0x111c: 0x000c, 0x111d: 0x000c, + 0x111e: 0x000c, 0x1120: 0x000c, 0x1122: 0x000c, + 0x1125: 0x000c, 0x1126: 0x000c, 0x1127: 0x000c, 0x1128: 0x000c, 0x1129: 0x000c, + 0x112a: 0x000c, 0x112b: 0x000c, 0x112c: 0x000c, + 0x1133: 0x000c, 0x1134: 0x000c, 0x1135: 0x000c, + 0x1136: 0x000c, 0x1137: 0x000c, 0x1138: 0x000c, 0x1139: 0x000c, 0x113a: 0x000c, 0x113b: 0x000c, + 0x113c: 0x000c, 0x113f: 0x000c, + // Block 0x45, offset 0x1140 + 0x1170: 0x000c, 0x1171: 0x000c, 0x1172: 0x000c, 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c, + 0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c, + 0x117c: 0x000c, 0x117d: 0x000c, 0x117e: 0x000c, + // Block 0x46, offset 0x1180 + 0x1180: 0x000c, 0x1181: 0x000c, 0x1182: 0x000c, 0x1183: 0x000c, + 0x11b4: 0x000c, + 0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c, + 0x11bc: 0x000c, + // Block 0x47, offset 0x11c0 + 0x11c2: 0x000c, + 0x11eb: 0x000c, 0x11ec: 0x000c, 0x11ed: 0x000c, 0x11ee: 0x000c, 0x11ef: 0x000c, + 0x11f0: 0x000c, 0x11f1: 0x000c, 0x11f2: 0x000c, 0x11f3: 0x000c, + // Block 0x48, offset 0x1200 + 0x1200: 0x000c, 0x1201: 0x000c, + 0x1222: 0x000c, 0x1223: 0x000c, + 0x1224: 0x000c, 0x1225: 0x000c, 0x1228: 0x000c, 0x1229: 0x000c, + 0x122b: 0x000c, 0x122c: 0x000c, 0x122d: 0x000c, + // Block 0x49, offset 0x1240 + 0x1266: 0x000c, 0x1268: 0x000c, 0x1269: 0x000c, + 0x126d: 0x000c, 0x126f: 0x000c, + 0x1270: 0x000c, 0x1271: 0x000c, + // Block 0x4a, offset 0x1280 + 0x12ac: 0x000c, 0x12ad: 0x000c, 0x12ae: 0x000c, 0x12af: 0x000c, + 0x12b0: 0x000c, 0x12b1: 0x000c, 0x12b2: 0x000c, 0x12b3: 0x000c, + 0x12b6: 0x000c, 0x12b7: 0x000c, + // Block 0x4b, offset 0x12c0 + 0x12d0: 0x000c, 0x12d1: 0x000c, + 0x12d2: 0x000c, 0x12d4: 0x000c, 0x12d5: 0x000c, 0x12d6: 0x000c, 0x12d7: 0x000c, + 0x12d8: 0x000c, 0x12d9: 0x000c, 0x12da: 0x000c, 0x12db: 0x000c, 0x12dc: 0x000c, 0x12dd: 0x000c, + 0x12de: 0x000c, 0x12df: 0x000c, 0x12e0: 0x000c, 0x12e2: 0x000c, 0x12e3: 0x000c, + 0x12e4: 0x000c, 0x12e5: 0x000c, 0x12e6: 0x000c, 0x12e7: 0x000c, 0x12e8: 0x000c, + 0x12ed: 0x000c, + 0x12f4: 0x000c, + 0x12f8: 0x000c, 0x12f9: 0x000c, + // Block 0x4c, offset 0x1300 + 0x1300: 0x000c, 0x1301: 0x000c, 0x1302: 0x000c, 0x1303: 0x000c, 0x1304: 0x000c, 0x1305: 0x000c, + 0x1306: 0x000c, 0x1307: 0x000c, 0x1308: 0x000c, 0x1309: 0x000c, 0x130a: 0x000c, 0x130b: 0x000c, + 0x130c: 0x000c, 0x130d: 0x000c, 0x130e: 0x000c, 0x130f: 0x000c, 0x1310: 0x000c, 0x1311: 0x000c, + 0x1312: 0x000c, 0x1313: 0x000c, 0x1314: 0x000c, 0x1315: 0x000c, 0x1316: 0x000c, 0x1317: 0x000c, + 0x1318: 0x000c, 0x1319: 0x000c, 0x131a: 0x000c, 0x131b: 0x000c, 0x131c: 0x000c, 0x131d: 0x000c, + 0x131e: 0x000c, 0x131f: 0x000c, 0x1320: 0x000c, 0x1321: 0x000c, 0x1322: 0x000c, 0x1323: 0x000c, + 0x1324: 0x000c, 0x1325: 0x000c, 0x1326: 0x000c, 0x1327: 0x000c, 0x1328: 0x000c, 0x1329: 0x000c, + 0x132a: 0x000c, 0x132b: 0x000c, 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c, + 0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, 0x1334: 0x000c, 0x1335: 0x000c, + 0x133c: 0x000c, 0x133d: 0x000c, 0x133e: 0x000c, 0x133f: 0x000c, + // Block 0x4d, offset 0x1340 + 0x137d: 0x000a, 0x137f: 0x000a, + // Block 0x4e, offset 0x1380 + 0x1380: 0x000a, 0x1381: 0x000a, + 0x138d: 0x000a, 0x138e: 0x000a, 0x138f: 0x000a, + 0x139d: 0x000a, + 0x139e: 0x000a, 0x139f: 0x000a, + 0x13ad: 0x000a, 0x13ae: 0x000a, 0x13af: 0x000a, + 0x13bd: 0x000a, 0x13be: 0x000a, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x0009, 0x13c1: 0x0009, 0x13c2: 0x0009, 0x13c3: 0x0009, 0x13c4: 0x0009, 0x13c5: 0x0009, + 0x13c6: 0x0009, 0x13c7: 0x0009, 0x13c8: 0x0009, 0x13c9: 0x0009, 0x13ca: 0x0009, 0x13cb: 0x000b, + 0x13cc: 0x000b, 0x13cd: 0x000b, 0x13cf: 0x0001, 0x13d0: 0x000a, 0x13d1: 0x000a, + 0x13d2: 0x000a, 0x13d3: 0x000a, 0x13d4: 0x000a, 0x13d5: 0x000a, 0x13d6: 0x000a, 0x13d7: 0x000a, + 0x13d8: 0x000a, 0x13d9: 0x000a, 0x13da: 0x000a, 0x13db: 0x000a, 0x13dc: 0x000a, 0x13dd: 0x000a, + 0x13de: 0x000a, 0x13df: 0x000a, 0x13e0: 0x000a, 0x13e1: 0x000a, 0x13e2: 0x000a, 0x13e3: 0x000a, + 0x13e4: 0x000a, 0x13e5: 0x000a, 0x13e6: 0x000a, 0x13e7: 0x000a, 0x13e8: 0x0009, 0x13e9: 0x0007, + 0x13ea: 0x000e, 0x13eb: 0x000e, 0x13ec: 0x000e, 0x13ed: 0x000e, 0x13ee: 0x000e, 0x13ef: 0x0006, + 0x13f0: 0x0004, 0x13f1: 0x0004, 0x13f2: 0x0004, 0x13f3: 0x0004, 0x13f4: 0x0004, 0x13f5: 0x000a, + 0x13f6: 0x000a, 0x13f7: 0x000a, 0x13f8: 0x000a, 0x13f9: 0x000a, 0x13fa: 0x000a, 0x13fb: 0x000a, + 0x13fc: 0x000a, 0x13fd: 0x000a, 0x13fe: 0x000a, 0x13ff: 0x000a, + // Block 0x50, offset 0x1400 + 0x1400: 0x000a, 0x1401: 0x000a, 0x1402: 0x000a, 0x1403: 0x000a, 0x1404: 0x0006, 0x1405: 0x009a, + 0x1406: 0x008a, 0x1407: 0x000a, 0x1408: 0x000a, 0x1409: 0x000a, 0x140a: 0x000a, 0x140b: 0x000a, + 0x140c: 0x000a, 0x140d: 0x000a, 0x140e: 0x000a, 0x140f: 0x000a, 0x1410: 0x000a, 0x1411: 0x000a, + 0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a, + 0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a, + 0x141e: 0x000a, 0x141f: 0x0009, 0x1420: 0x000b, 0x1421: 0x000b, 0x1422: 0x000b, 0x1423: 0x000b, + 0x1424: 0x000b, 0x1425: 0x000b, 0x1426: 0x000e, 0x1427: 0x000e, 0x1428: 0x000e, 0x1429: 0x000e, + 0x142a: 0x000b, 0x142b: 0x000b, 0x142c: 0x000b, 0x142d: 0x000b, 0x142e: 0x000b, 0x142f: 0x000b, + 0x1430: 0x0002, 0x1434: 0x0002, 0x1435: 0x0002, + 0x1436: 0x0002, 0x1437: 0x0002, 0x1438: 0x0002, 0x1439: 0x0002, 0x143a: 0x0003, 0x143b: 0x0003, + 0x143c: 0x000a, 0x143d: 0x009a, 0x143e: 0x008a, + // Block 0x51, offset 0x1440 + 0x1440: 0x0002, 0x1441: 0x0002, 0x1442: 0x0002, 0x1443: 0x0002, 0x1444: 0x0002, 0x1445: 0x0002, + 0x1446: 0x0002, 0x1447: 0x0002, 0x1448: 0x0002, 0x1449: 0x0002, 0x144a: 0x0003, 0x144b: 0x0003, + 0x144c: 0x000a, 0x144d: 0x009a, 0x144e: 0x008a, + 0x1460: 0x0004, 0x1461: 0x0004, 0x1462: 0x0004, 0x1463: 0x0004, + 0x1464: 0x0004, 0x1465: 0x0004, 0x1466: 0x0004, 0x1467: 0x0004, 0x1468: 0x0004, 0x1469: 0x0004, + 0x146a: 0x0004, 0x146b: 0x0004, 0x146c: 0x0004, 0x146d: 0x0004, 0x146e: 0x0004, 0x146f: 0x0004, + 0x1470: 0x0004, 0x1471: 0x0004, 0x1472: 0x0004, 0x1473: 0x0004, 0x1474: 0x0004, 0x1475: 0x0004, + 0x1476: 0x0004, 0x1477: 0x0004, 0x1478: 0x0004, 0x1479: 0x0004, 0x147a: 0x0004, 0x147b: 0x0004, + 0x147c: 0x0004, 0x147d: 0x0004, 0x147e: 0x0004, 0x147f: 0x0004, + // Block 0x52, offset 0x1480 + 0x1480: 0x0004, 0x1481: 0x0004, 0x1482: 0x0004, 0x1483: 0x0004, 0x1484: 0x0004, 0x1485: 0x0004, + 0x1486: 0x0004, 0x1487: 0x0004, 0x1488: 0x0004, 0x1489: 0x0004, 0x148a: 0x0004, 0x148b: 0x0004, + 0x148c: 0x0004, 0x148d: 0x0004, 0x148e: 0x0004, 0x148f: 0x0004, 0x1490: 0x000c, 0x1491: 0x000c, + 0x1492: 0x000c, 0x1493: 0x000c, 0x1494: 0x000c, 0x1495: 0x000c, 0x1496: 0x000c, 0x1497: 0x000c, + 0x1498: 0x000c, 0x1499: 0x000c, 0x149a: 0x000c, 0x149b: 0x000c, 0x149c: 0x000c, 0x149d: 0x000c, + 0x149e: 0x000c, 0x149f: 0x000c, 0x14a0: 0x000c, 0x14a1: 0x000c, 0x14a2: 0x000c, 0x14a3: 0x000c, + 0x14a4: 0x000c, 0x14a5: 0x000c, 0x14a6: 0x000c, 0x14a7: 0x000c, 0x14a8: 0x000c, 0x14a9: 0x000c, + 0x14aa: 0x000c, 0x14ab: 0x000c, 0x14ac: 0x000c, 0x14ad: 0x000c, 0x14ae: 0x000c, 0x14af: 0x000c, + 0x14b0: 0x000c, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x000a, 0x14c1: 0x000a, 0x14c3: 0x000a, 0x14c4: 0x000a, 0x14c5: 0x000a, + 0x14c6: 0x000a, 0x14c8: 0x000a, 0x14c9: 0x000a, + 0x14d4: 0x000a, 0x14d6: 0x000a, 0x14d7: 0x000a, + 0x14d8: 0x000a, + 0x14de: 0x000a, 0x14df: 0x000a, 0x14e0: 0x000a, 0x14e1: 0x000a, 0x14e2: 0x000a, 0x14e3: 0x000a, + 0x14e5: 0x000a, 0x14e7: 0x000a, 0x14e9: 0x000a, + 0x14ee: 0x0004, + 0x14fa: 0x000a, 0x14fb: 0x000a, + // Block 0x54, offset 0x1500 + 0x1500: 0x000a, 0x1501: 0x000a, 0x1502: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a, + 0x150a: 0x000a, 0x150b: 0x000a, + 0x150c: 0x000a, 0x150d: 0x000a, 0x1510: 0x000a, 0x1511: 0x000a, + 0x1512: 0x000a, 0x1513: 0x000a, 0x1514: 0x000a, 0x1515: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a, + 0x1518: 0x000a, 0x1519: 0x000a, 0x151a: 0x000a, 0x151b: 0x000a, 0x151c: 0x000a, 0x151d: 0x000a, + 0x151e: 0x000a, 0x151f: 0x000a, + // Block 0x55, offset 0x1540 + 0x1549: 0x000a, 0x154a: 0x000a, 0x154b: 0x000a, + 0x1550: 0x000a, 0x1551: 0x000a, + 0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a, + 0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a, + 0x155e: 0x000a, 0x155f: 0x000a, 0x1560: 0x000a, 0x1561: 0x000a, 0x1562: 0x000a, 0x1563: 0x000a, + 0x1564: 0x000a, 0x1565: 0x000a, 0x1566: 0x000a, 0x1567: 0x000a, 0x1568: 0x000a, 0x1569: 0x000a, + 0x156a: 0x000a, 0x156b: 0x000a, 0x156c: 0x000a, 0x156d: 0x000a, 0x156e: 0x000a, 0x156f: 0x000a, + 0x1570: 0x000a, 0x1571: 0x000a, 0x1572: 0x000a, 0x1573: 0x000a, 0x1574: 0x000a, 0x1575: 0x000a, + 0x1576: 0x000a, 0x1577: 0x000a, 0x1578: 0x000a, 0x1579: 0x000a, 0x157a: 0x000a, 0x157b: 0x000a, + 0x157c: 0x000a, 0x157d: 0x000a, 0x157e: 0x000a, 0x157f: 0x000a, + // Block 0x56, offset 0x1580 + 0x1580: 0x000a, 0x1581: 0x000a, 0x1582: 0x000a, 0x1583: 0x000a, 0x1584: 0x000a, 0x1585: 0x000a, + 0x1586: 0x000a, 0x1587: 0x000a, 0x1588: 0x000a, 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a, + 0x158c: 0x000a, 0x158d: 0x000a, 0x158e: 0x000a, 0x158f: 0x000a, 0x1590: 0x000a, 0x1591: 0x000a, + 0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a, + 0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a, + 0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a, + 0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a, + 0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a, + 0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a, + 0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a, + 0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a, + 0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a, + 0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a, + 0x15d2: 0x0003, 0x15d3: 0x0004, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a, + 0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a, + 0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a, + 0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a, + 0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a, + 0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a, + 0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a, + 0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a, + // Block 0x58, offset 0x1600 + 0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a, + 0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x003a, 0x1609: 0x002a, 0x160a: 0x003a, 0x160b: 0x002a, + 0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a, + 0x1612: 0x000a, 0x1613: 0x000a, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a, + 0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a, + 0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a, + 0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x009a, + 0x162a: 0x008a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a, + 0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a, + // Block 0x59, offset 0x1640 + 0x167b: 0x000a, + 0x167c: 0x000a, 0x167d: 0x000a, 0x167e: 0x000a, 0x167f: 0x000a, + // Block 0x5a, offset 0x1680 + 0x1680: 0x000a, 0x1681: 0x000a, 0x1682: 0x000a, 0x1683: 0x000a, 0x1684: 0x000a, 0x1685: 0x000a, + 0x1686: 0x000a, 0x1687: 0x000a, 0x1688: 0x000a, 0x1689: 0x000a, 0x168a: 0x000a, 0x168b: 0x000a, + 0x168c: 0x000a, 0x168d: 0x000a, 0x168e: 0x000a, 0x168f: 0x000a, 0x1690: 0x000a, 0x1691: 0x000a, + 0x1692: 0x000a, 0x1693: 0x000a, 0x1694: 0x000a, 0x1696: 0x000a, 0x1697: 0x000a, + 0x1698: 0x000a, 0x1699: 0x000a, 0x169a: 0x000a, 0x169b: 0x000a, 0x169c: 0x000a, 0x169d: 0x000a, + 0x169e: 0x000a, 0x169f: 0x000a, 0x16a0: 0x000a, 0x16a1: 0x000a, 0x16a2: 0x000a, 0x16a3: 0x000a, + 0x16a4: 0x000a, 0x16a5: 0x000a, 0x16a6: 0x000a, 0x16a7: 0x000a, 0x16a8: 0x000a, 0x16a9: 0x000a, + 0x16aa: 0x000a, 0x16ab: 0x000a, 0x16ac: 0x000a, 0x16ad: 0x000a, 0x16ae: 0x000a, 0x16af: 0x000a, + 0x16b0: 0x000a, 0x16b1: 0x000a, 0x16b2: 0x000a, 0x16b3: 0x000a, 0x16b4: 0x000a, 0x16b5: 0x000a, + 0x16b6: 0x000a, 0x16b7: 0x000a, 0x16b8: 0x000a, 0x16b9: 0x000a, 0x16ba: 0x000a, 0x16bb: 0x000a, + 0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a, + 0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a, + 0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a, + 0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d5: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a, + 0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a, + 0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a, + 0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a, 0x16e7: 0x000a, 0x16e8: 0x000a, 0x16e9: 0x000a, + 0x16ea: 0x000a, 0x16eb: 0x000a, 0x16ec: 0x000a, 0x16ed: 0x000a, 0x16ee: 0x000a, 0x16ef: 0x000a, + 0x16f0: 0x000a, 0x16f1: 0x000a, 0x16f2: 0x000a, 0x16f3: 0x000a, 0x16f4: 0x000a, 0x16f5: 0x000a, + 0x16f6: 0x000a, 0x16f7: 0x000a, 0x16f8: 0x000a, 0x16f9: 0x000a, 0x16fa: 0x000a, + // Block 0x5c, offset 0x1700 + 0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a, + 0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a, 0x170b: 0x000a, + 0x170c: 0x000a, 0x170d: 0x000a, 0x170e: 0x000a, 0x170f: 0x000a, 0x1710: 0x000a, 0x1711: 0x000a, + 0x1712: 0x000a, 0x1713: 0x000a, 0x1714: 0x000a, 0x1715: 0x000a, 0x1716: 0x000a, 0x1717: 0x000a, + 0x1718: 0x000a, 0x1719: 0x000a, 0x171a: 0x000a, 0x171b: 0x000a, 0x171c: 0x000a, 0x171d: 0x000a, + 0x171e: 0x000a, 0x171f: 0x000a, 0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a, + 0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a, + // Block 0x5d, offset 0x1740 + 0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a, + 0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x000a, 0x1749: 0x000a, 0x174a: 0x000a, + 0x1760: 0x000a, 0x1761: 0x000a, 0x1762: 0x000a, 0x1763: 0x000a, + 0x1764: 0x000a, 0x1765: 0x000a, 0x1766: 0x000a, 0x1767: 0x000a, 0x1768: 0x000a, 0x1769: 0x000a, + 0x176a: 0x000a, 0x176b: 0x000a, 0x176c: 0x000a, 0x176d: 0x000a, 0x176e: 0x000a, 0x176f: 0x000a, + 0x1770: 0x000a, 0x1771: 0x000a, 0x1772: 0x000a, 0x1773: 0x000a, 0x1774: 0x000a, 0x1775: 0x000a, + 0x1776: 0x000a, 0x1777: 0x000a, 0x1778: 0x000a, 0x1779: 0x000a, 0x177a: 0x000a, 0x177b: 0x000a, + 0x177c: 0x000a, 0x177d: 0x000a, 0x177e: 0x000a, 0x177f: 0x000a, + // Block 0x5e, offset 0x1780 + 0x1780: 0x000a, 0x1781: 0x000a, 0x1782: 0x000a, 0x1783: 0x000a, 0x1784: 0x000a, 0x1785: 0x000a, + 0x1786: 0x000a, 0x1787: 0x000a, 0x1788: 0x0002, 0x1789: 0x0002, 0x178a: 0x0002, 0x178b: 0x0002, + 0x178c: 0x0002, 0x178d: 0x0002, 0x178e: 0x0002, 0x178f: 0x0002, 0x1790: 0x0002, 0x1791: 0x0002, + 0x1792: 0x0002, 0x1793: 0x0002, 0x1794: 0x0002, 0x1795: 0x0002, 0x1796: 0x0002, 0x1797: 0x0002, + 0x1798: 0x0002, 0x1799: 0x0002, 0x179a: 0x0002, 0x179b: 0x0002, + // Block 0x5f, offset 0x17c0 + 0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ec: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a, + 0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a, + 0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a, + 0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a, + // Block 0x60, offset 0x1800 + 0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a, + 0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a, + 0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a, + 0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a, + 0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a, + 0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a, + 0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x000a, 0x1829: 0x000a, + 0x182a: 0x000a, 0x182b: 0x000a, 0x182d: 0x000a, 0x182e: 0x000a, 0x182f: 0x000a, + 0x1830: 0x000a, 0x1831: 0x000a, 0x1832: 0x000a, 0x1833: 0x000a, 0x1834: 0x000a, 0x1835: 0x000a, + 0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a, + 0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a, + // Block 0x61, offset 0x1840 + 0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x000a, + 0x1846: 0x000a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a, + 0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a, + 0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a, + 0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a, + 0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a, + 0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x000a, 0x1867: 0x000a, 0x1868: 0x003a, 0x1869: 0x002a, + 0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a, + 0x1870: 0x003a, 0x1871: 0x002a, 0x1872: 0x003a, 0x1873: 0x002a, 0x1874: 0x003a, 0x1875: 0x002a, + 0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a, + 0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a, + // Block 0x62, offset 0x1880 + 0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x000a, 0x1884: 0x000a, 0x1885: 0x009a, + 0x1886: 0x008a, 0x1887: 0x000a, 0x1888: 0x000a, 0x1889: 0x000a, 0x188a: 0x000a, 0x188b: 0x000a, + 0x188c: 0x000a, 0x188d: 0x000a, 0x188e: 0x000a, 0x188f: 0x000a, 0x1890: 0x000a, 0x1891: 0x000a, + 0x1892: 0x000a, 0x1893: 0x000a, 0x1894: 0x000a, 0x1895: 0x000a, 0x1896: 0x000a, 0x1897: 0x000a, + 0x1898: 0x000a, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a, + 0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a, + 0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x003a, 0x18a7: 0x002a, 0x18a8: 0x003a, 0x18a9: 0x002a, + 0x18aa: 0x003a, 0x18ab: 0x002a, 0x18ac: 0x003a, 0x18ad: 0x002a, 0x18ae: 0x003a, 0x18af: 0x002a, + 0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a, + 0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a, + 0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x007a, 0x18c4: 0x006a, 0x18c5: 0x009a, + 0x18c6: 0x008a, 0x18c7: 0x00ba, 0x18c8: 0x00aa, 0x18c9: 0x009a, 0x18ca: 0x008a, 0x18cb: 0x007a, + 0x18cc: 0x006a, 0x18cd: 0x00da, 0x18ce: 0x002a, 0x18cf: 0x003a, 0x18d0: 0x00ca, 0x18d1: 0x009a, + 0x18d2: 0x008a, 0x18d3: 0x007a, 0x18d4: 0x006a, 0x18d5: 0x009a, 0x18d6: 0x008a, 0x18d7: 0x00ba, + 0x18d8: 0x00aa, 0x18d9: 0x000a, 0x18da: 0x000a, 0x18db: 0x000a, 0x18dc: 0x000a, 0x18dd: 0x000a, + 0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a, + 0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a, + 0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a, + 0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a, + 0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a, + 0x18fc: 0x000a, 0x18fd: 0x000a, 0x18fe: 0x000a, 0x18ff: 0x000a, + // Block 0x64, offset 0x1900 + 0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a, + 0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a, + 0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a, + 0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a, + 0x1918: 0x003a, 0x1919: 0x002a, 0x191a: 0x003a, 0x191b: 0x002a, 0x191c: 0x000a, 0x191d: 0x000a, + 0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a, + 0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a, + 0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a, + 0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a, 0x1934: 0x000a, 0x1935: 0x000a, + 0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a, + 0x193c: 0x003a, 0x193d: 0x002a, 0x193e: 0x000a, 0x193f: 0x000a, + // Block 0x65, offset 0x1940 + 0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a, + 0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a, + 0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a, + 0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a, 0x1956: 0x000a, 0x1957: 0x000a, + 0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a, + 0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a, + 0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a, + 0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a, + 0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a, + 0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a, 0x197a: 0x000a, 0x197b: 0x000a, + 0x197c: 0x000a, 0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a, + // Block 0x66, offset 0x1980 + 0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a, + 0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x1989: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a, + 0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a, + 0x1992: 0x000a, 0x1993: 0x000a, 0x1994: 0x000a, 0x1995: 0x000a, + 0x1998: 0x000a, 0x1999: 0x000a, 0x199a: 0x000a, 0x199b: 0x000a, 0x199c: 0x000a, 0x199d: 0x000a, + 0x199e: 0x000a, 0x199f: 0x000a, 0x19a0: 0x000a, 0x19a1: 0x000a, 0x19a2: 0x000a, 0x19a3: 0x000a, + 0x19a4: 0x000a, 0x19a5: 0x000a, 0x19a6: 0x000a, 0x19a7: 0x000a, 0x19a8: 0x000a, 0x19a9: 0x000a, + 0x19aa: 0x000a, 0x19ab: 0x000a, 0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a, + 0x19b0: 0x000a, 0x19b1: 0x000a, 0x19b2: 0x000a, 0x19b3: 0x000a, 0x19b4: 0x000a, 0x19b5: 0x000a, + 0x19b6: 0x000a, 0x19b7: 0x000a, 0x19b8: 0x000a, 0x19b9: 0x000a, + 0x19bd: 0x000a, 0x19be: 0x000a, 0x19bf: 0x000a, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x000a, 0x19c1: 0x000a, 0x19c2: 0x000a, 0x19c3: 0x000a, 0x19c4: 0x000a, 0x19c5: 0x000a, + 0x19c6: 0x000a, 0x19c7: 0x000a, 0x19c8: 0x000a, 0x19ca: 0x000a, 0x19cb: 0x000a, + 0x19cc: 0x000a, 0x19cd: 0x000a, 0x19ce: 0x000a, 0x19cf: 0x000a, 0x19d0: 0x000a, 0x19d1: 0x000a, + 0x19ec: 0x000a, 0x19ed: 0x000a, 0x19ee: 0x000a, 0x19ef: 0x000a, + // Block 0x68, offset 0x1a00 + 0x1a25: 0x000a, 0x1a26: 0x000a, 0x1a27: 0x000a, 0x1a28: 0x000a, 0x1a29: 0x000a, + 0x1a2a: 0x000a, 0x1a2f: 0x000c, + 0x1a30: 0x000c, 0x1a31: 0x000c, + 0x1a39: 0x000a, 0x1a3a: 0x000a, 0x1a3b: 0x000a, + 0x1a3c: 0x000a, 0x1a3d: 0x000a, 0x1a3e: 0x000a, 0x1a3f: 0x000a, + // Block 0x69, offset 0x1a40 + 0x1a7f: 0x000c, + // Block 0x6a, offset 0x1a80 + 0x1aa0: 0x000c, 0x1aa1: 0x000c, 0x1aa2: 0x000c, 0x1aa3: 0x000c, + 0x1aa4: 0x000c, 0x1aa5: 0x000c, 0x1aa6: 0x000c, 0x1aa7: 0x000c, 0x1aa8: 0x000c, 0x1aa9: 0x000c, + 0x1aaa: 0x000c, 0x1aab: 0x000c, 0x1aac: 0x000c, 0x1aad: 0x000c, 0x1aae: 0x000c, 0x1aaf: 0x000c, + 0x1ab0: 0x000c, 0x1ab1: 0x000c, 0x1ab2: 0x000c, 0x1ab3: 0x000c, 0x1ab4: 0x000c, 0x1ab5: 0x000c, + 0x1ab6: 0x000c, 0x1ab7: 0x000c, 0x1ab8: 0x000c, 0x1ab9: 0x000c, 0x1aba: 0x000c, 0x1abb: 0x000c, + 0x1abc: 0x000c, 0x1abd: 0x000c, 0x1abe: 0x000c, 0x1abf: 0x000c, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a, + 0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a, 0x1aca: 0x000a, 0x1acb: 0x000a, + 0x1acc: 0x000a, 0x1acd: 0x000a, 0x1ace: 0x000a, 0x1acf: 0x000a, 0x1ad0: 0x000a, 0x1ad1: 0x000a, + 0x1ad2: 0x000a, 0x1ad3: 0x000a, 0x1ad4: 0x000a, 0x1ad5: 0x000a, 0x1ad6: 0x000a, 0x1ad7: 0x000a, + 0x1ad8: 0x000a, 0x1ad9: 0x000a, 0x1ada: 0x000a, 0x1adb: 0x000a, 0x1adc: 0x000a, 0x1add: 0x000a, + 0x1ade: 0x000a, 0x1adf: 0x000a, 0x1ae0: 0x000a, 0x1ae1: 0x000a, 0x1ae2: 0x003a, 0x1ae3: 0x002a, + 0x1ae4: 0x003a, 0x1ae5: 0x002a, 0x1ae6: 0x003a, 0x1ae7: 0x002a, 0x1ae8: 0x003a, 0x1ae9: 0x002a, + 0x1aea: 0x000a, 0x1aeb: 0x000a, 0x1aec: 0x000a, 0x1aed: 0x000a, 0x1aee: 0x000a, 0x1aef: 0x000a, + 0x1af0: 0x000a, 0x1af1: 0x000a, 0x1af2: 0x000a, 0x1af3: 0x000a, 0x1af4: 0x000a, 0x1af5: 0x000a, + 0x1af6: 0x000a, 0x1af7: 0x000a, 0x1af8: 0x000a, 0x1af9: 0x000a, 0x1afa: 0x000a, 0x1afb: 0x000a, + 0x1afc: 0x000a, 0x1afd: 0x000a, 0x1afe: 0x000a, 0x1aff: 0x000a, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a, + 0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a, + 0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a, + 0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a, + 0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a, + 0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a, + 0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a, + 0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a, + 0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a, 0x1b74: 0x000a, 0x1b75: 0x000a, + 0x1b76: 0x000a, 0x1b77: 0x000a, 0x1b78: 0x000a, 0x1b79: 0x000a, 0x1b7a: 0x000a, 0x1b7b: 0x000a, + 0x1b7c: 0x000a, 0x1b7d: 0x000a, 0x1b7e: 0x000a, 0x1b7f: 0x000a, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a, + 0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a, + 0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a, + 0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a, 0x1b96: 0x000a, 0x1b97: 0x000a, + 0x1b98: 0x000a, 0x1b99: 0x000a, 0x1b9a: 0x000a, 0x1b9b: 0x000a, 0x1b9c: 0x000a, 0x1b9d: 0x000a, + 0x1b9e: 0x000a, 0x1b9f: 0x000a, 0x1ba0: 0x000a, 0x1ba1: 0x000a, 0x1ba2: 0x000a, 0x1ba3: 0x000a, + 0x1ba4: 0x000a, 0x1ba5: 0x000a, 0x1ba6: 0x000a, 0x1ba7: 0x000a, 0x1ba8: 0x000a, 0x1ba9: 0x000a, + 0x1baa: 0x000a, 0x1bab: 0x000a, 0x1bac: 0x000a, 0x1bad: 0x000a, 0x1bae: 0x000a, 0x1baf: 0x000a, + 0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x000a, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a, 0x1bc5: 0x000a, + 0x1bc6: 0x000a, 0x1bc7: 0x000a, 0x1bc8: 0x000a, 0x1bc9: 0x000a, 0x1bca: 0x000a, 0x1bcb: 0x000a, + 0x1bcc: 0x000a, 0x1bcd: 0x000a, 0x1bce: 0x000a, 0x1bcf: 0x000a, 0x1bd0: 0x000a, 0x1bd1: 0x000a, + 0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x000a, 0x1bd5: 0x000a, + 0x1bf0: 0x000a, 0x1bf1: 0x000a, 0x1bf2: 0x000a, 0x1bf3: 0x000a, 0x1bf4: 0x000a, 0x1bf5: 0x000a, + 0x1bf6: 0x000a, 0x1bf7: 0x000a, 0x1bf8: 0x000a, 0x1bf9: 0x000a, 0x1bfa: 0x000a, 0x1bfb: 0x000a, + // Block 0x70, offset 0x1c00 + 0x1c00: 0x0009, 0x1c01: 0x000a, 0x1c02: 0x000a, 0x1c03: 0x000a, 0x1c04: 0x000a, + 0x1c08: 0x003a, 0x1c09: 0x002a, 0x1c0a: 0x003a, 0x1c0b: 0x002a, + 0x1c0c: 0x003a, 0x1c0d: 0x002a, 0x1c0e: 0x003a, 0x1c0f: 0x002a, 0x1c10: 0x003a, 0x1c11: 0x002a, + 0x1c12: 0x000a, 0x1c13: 0x000a, 0x1c14: 0x003a, 0x1c15: 0x002a, 0x1c16: 0x003a, 0x1c17: 0x002a, + 0x1c18: 0x003a, 0x1c19: 0x002a, 0x1c1a: 0x003a, 0x1c1b: 0x002a, 0x1c1c: 0x000a, 0x1c1d: 0x000a, + 0x1c1e: 0x000a, 0x1c1f: 0x000a, 0x1c20: 0x000a, + 0x1c2a: 0x000c, 0x1c2b: 0x000c, 0x1c2c: 0x000c, 0x1c2d: 0x000c, + 0x1c30: 0x000a, + 0x1c36: 0x000a, 0x1c37: 0x000a, + 0x1c3d: 0x000a, 0x1c3e: 0x000a, 0x1c3f: 0x000a, + // Block 0x71, offset 0x1c40 + 0x1c59: 0x000c, 0x1c5a: 0x000c, 0x1c5b: 0x000a, 0x1c5c: 0x000a, + 0x1c60: 0x000a, + // Block 0x72, offset 0x1c80 + 0x1cbb: 0x000a, + // Block 0x73, offset 0x1cc0 + 0x1cc0: 0x000a, 0x1cc1: 0x000a, 0x1cc2: 0x000a, 0x1cc3: 0x000a, 0x1cc4: 0x000a, 0x1cc5: 0x000a, + 0x1cc6: 0x000a, 0x1cc7: 0x000a, 0x1cc8: 0x000a, 0x1cc9: 0x000a, 0x1cca: 0x000a, 0x1ccb: 0x000a, + 0x1ccc: 0x000a, 0x1ccd: 0x000a, 0x1cce: 0x000a, 0x1ccf: 0x000a, 0x1cd0: 0x000a, 0x1cd1: 0x000a, + 0x1cd2: 0x000a, 0x1cd3: 0x000a, 0x1cd4: 0x000a, 0x1cd5: 0x000a, 0x1cd6: 0x000a, 0x1cd7: 0x000a, + 0x1cd8: 0x000a, 0x1cd9: 0x000a, 0x1cda: 0x000a, 0x1cdb: 0x000a, 0x1cdc: 0x000a, 0x1cdd: 0x000a, + 0x1cde: 0x000a, 0x1cdf: 0x000a, 0x1ce0: 0x000a, 0x1ce1: 0x000a, 0x1ce2: 0x000a, 0x1ce3: 0x000a, + // Block 0x74, offset 0x1d00 + 0x1d1d: 0x000a, + 0x1d1e: 0x000a, + // Block 0x75, offset 0x1d40 + 0x1d50: 0x000a, 0x1d51: 0x000a, + 0x1d52: 0x000a, 0x1d53: 0x000a, 0x1d54: 0x000a, 0x1d55: 0x000a, 0x1d56: 0x000a, 0x1d57: 0x000a, + 0x1d58: 0x000a, 0x1d59: 0x000a, 0x1d5a: 0x000a, 0x1d5b: 0x000a, 0x1d5c: 0x000a, 0x1d5d: 0x000a, + 0x1d5e: 0x000a, 0x1d5f: 0x000a, + 0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a, + // Block 0x76, offset 0x1d80 + 0x1db1: 0x000a, 0x1db2: 0x000a, 0x1db3: 0x000a, 0x1db4: 0x000a, 0x1db5: 0x000a, + 0x1db6: 0x000a, 0x1db7: 0x000a, 0x1db8: 0x000a, 0x1db9: 0x000a, 0x1dba: 0x000a, 0x1dbb: 0x000a, + 0x1dbc: 0x000a, 0x1dbd: 0x000a, 0x1dbe: 0x000a, 0x1dbf: 0x000a, + // Block 0x77, offset 0x1dc0 + 0x1dcc: 0x000a, 0x1dcd: 0x000a, 0x1dce: 0x000a, 0x1dcf: 0x000a, + // Block 0x78, offset 0x1e00 + 0x1e37: 0x000a, 0x1e38: 0x000a, 0x1e39: 0x000a, 0x1e3a: 0x000a, + // Block 0x79, offset 0x1e40 + 0x1e5e: 0x000a, 0x1e5f: 0x000a, + 0x1e7f: 0x000a, + // Block 0x7a, offset 0x1e80 + 0x1e90: 0x000a, 0x1e91: 0x000a, + 0x1e92: 0x000a, 0x1e93: 0x000a, 0x1e94: 0x000a, 0x1e95: 0x000a, 0x1e96: 0x000a, 0x1e97: 0x000a, + 0x1e98: 0x000a, 0x1e99: 0x000a, 0x1e9a: 0x000a, 0x1e9b: 0x000a, 0x1e9c: 0x000a, 0x1e9d: 0x000a, + 0x1e9e: 0x000a, 0x1e9f: 0x000a, 0x1ea0: 0x000a, 0x1ea1: 0x000a, 0x1ea2: 0x000a, 0x1ea3: 0x000a, + 0x1ea4: 0x000a, 0x1ea5: 0x000a, 0x1ea6: 0x000a, 0x1ea7: 0x000a, 0x1ea8: 0x000a, 0x1ea9: 0x000a, + 0x1eaa: 0x000a, 0x1eab: 0x000a, 0x1eac: 0x000a, 0x1ead: 0x000a, 0x1eae: 0x000a, 0x1eaf: 0x000a, + 0x1eb0: 0x000a, 0x1eb1: 0x000a, 0x1eb2: 0x000a, 0x1eb3: 0x000a, 0x1eb4: 0x000a, 0x1eb5: 0x000a, + 0x1eb6: 0x000a, 0x1eb7: 0x000a, 0x1eb8: 0x000a, 0x1eb9: 0x000a, 0x1eba: 0x000a, 0x1ebb: 0x000a, + 0x1ebc: 0x000a, 0x1ebd: 0x000a, 0x1ebe: 0x000a, 0x1ebf: 0x000a, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0x000a, 0x1ec1: 0x000a, 0x1ec2: 0x000a, 0x1ec3: 0x000a, 0x1ec4: 0x000a, 0x1ec5: 0x000a, + 0x1ec6: 0x000a, + // Block 0x7c, offset 0x1f00 + 0x1f0d: 0x000a, 0x1f0e: 0x000a, 0x1f0f: 0x000a, + // Block 0x7d, offset 0x1f40 + 0x1f6f: 0x000c, + 0x1f70: 0x000c, 0x1f71: 0x000c, 0x1f72: 0x000c, 0x1f73: 0x000a, 0x1f74: 0x000c, 0x1f75: 0x000c, + 0x1f76: 0x000c, 0x1f77: 0x000c, 0x1f78: 0x000c, 0x1f79: 0x000c, 0x1f7a: 0x000c, 0x1f7b: 0x000c, + 0x1f7c: 0x000c, 0x1f7d: 0x000c, 0x1f7e: 0x000a, 0x1f7f: 0x000a, + // Block 0x7e, offset 0x1f80 + 0x1f9e: 0x000c, 0x1f9f: 0x000c, + // Block 0x7f, offset 0x1fc0 + 0x1ff0: 0x000c, 0x1ff1: 0x000c, + // Block 0x80, offset 0x2000 + 0x2000: 0x000a, 0x2001: 0x000a, 0x2002: 0x000a, 0x2003: 0x000a, 0x2004: 0x000a, 0x2005: 0x000a, + 0x2006: 0x000a, 0x2007: 0x000a, 0x2008: 0x000a, 0x2009: 0x000a, 0x200a: 0x000a, 0x200b: 0x000a, + 0x200c: 0x000a, 0x200d: 0x000a, 0x200e: 0x000a, 0x200f: 0x000a, 0x2010: 0x000a, 0x2011: 0x000a, + 0x2012: 0x000a, 0x2013: 0x000a, 0x2014: 0x000a, 0x2015: 0x000a, 0x2016: 0x000a, 0x2017: 0x000a, + 0x2018: 0x000a, 0x2019: 0x000a, 0x201a: 0x000a, 0x201b: 0x000a, 0x201c: 0x000a, 0x201d: 0x000a, + 0x201e: 0x000a, 0x201f: 0x000a, 0x2020: 0x000a, 0x2021: 0x000a, + // Block 0x81, offset 0x2040 + 0x2048: 0x000a, + // Block 0x82, offset 0x2080 + 0x2082: 0x000c, + 0x2086: 0x000c, 0x208b: 0x000c, + 0x20a5: 0x000c, 0x20a6: 0x000c, 0x20a8: 0x000a, 0x20a9: 0x000a, + 0x20aa: 0x000a, 0x20ab: 0x000a, + 0x20b8: 0x0004, 0x20b9: 0x0004, + // Block 0x83, offset 0x20c0 + 0x20f4: 0x000a, 0x20f5: 0x000a, + 0x20f6: 0x000a, 0x20f7: 0x000a, + // Block 0x84, offset 0x2100 + 0x2104: 0x000c, + 0x2120: 0x000c, 0x2121: 0x000c, 0x2122: 0x000c, 0x2123: 0x000c, + 0x2124: 0x000c, 0x2125: 0x000c, 0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c, + 0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c, 0x212e: 0x000c, 0x212f: 0x000c, + 0x2130: 0x000c, 0x2131: 0x000c, + // Block 0x85, offset 0x2140 + 0x2166: 0x000c, 0x2167: 0x000c, 0x2168: 0x000c, 0x2169: 0x000c, + 0x216a: 0x000c, 0x216b: 0x000c, 0x216c: 0x000c, 0x216d: 0x000c, + // Block 0x86, offset 0x2180 + 0x2187: 0x000c, 0x2188: 0x000c, 0x2189: 0x000c, 0x218a: 0x000c, 0x218b: 0x000c, + 0x218c: 0x000c, 0x218d: 0x000c, 0x218e: 0x000c, 0x218f: 0x000c, 0x2190: 0x000c, 0x2191: 0x000c, + // Block 0x87, offset 0x21c0 + 0x21c0: 0x000c, 0x21c1: 0x000c, 0x21c2: 0x000c, + 0x21f3: 0x000c, + 0x21f6: 0x000c, 0x21f7: 0x000c, 0x21f8: 0x000c, 0x21f9: 0x000c, + 0x21fc: 0x000c, + // Block 0x88, offset 0x2200 + 0x2225: 0x000c, + // Block 0x89, offset 0x2240 + 0x2269: 0x000c, + 0x226a: 0x000c, 0x226b: 0x000c, 0x226c: 0x000c, 0x226d: 0x000c, 0x226e: 0x000c, + 0x2271: 0x000c, 0x2272: 0x000c, 0x2275: 0x000c, + 0x2276: 0x000c, + // Block 0x8a, offset 0x2280 + 0x2283: 0x000c, + 0x228c: 0x000c, + 0x22bc: 0x000c, + // Block 0x8b, offset 0x22c0 + 0x22f0: 0x000c, 0x22f2: 0x000c, 0x22f3: 0x000c, 0x22f4: 0x000c, + 0x22f7: 0x000c, 0x22f8: 0x000c, + 0x22fe: 0x000c, 0x22ff: 0x000c, + // Block 0x8c, offset 0x2300 + 0x2301: 0x000c, + 0x232c: 0x000c, 0x232d: 0x000c, + 0x2336: 0x000c, + // Block 0x8d, offset 0x2340 + 0x2365: 0x000c, 0x2368: 0x000c, + 0x236d: 0x000c, + // Block 0x8e, offset 0x2380 + 0x239d: 0x0001, + 0x239e: 0x000c, 0x239f: 0x0001, 0x23a0: 0x0001, 0x23a1: 0x0001, 0x23a2: 0x0001, 0x23a3: 0x0001, + 0x23a4: 0x0001, 0x23a5: 0x0001, 0x23a6: 0x0001, 0x23a7: 0x0001, 0x23a8: 0x0001, 0x23a9: 0x0003, + 0x23aa: 0x0001, 0x23ab: 0x0001, 0x23ac: 0x0001, 0x23ad: 0x0001, 0x23ae: 0x0001, 0x23af: 0x0001, + 0x23b0: 0x0001, 0x23b1: 0x0001, 0x23b2: 0x0001, 0x23b3: 0x0001, 0x23b4: 0x0001, 0x23b5: 0x0001, + 0x23b6: 0x0001, 0x23b7: 0x0001, 0x23b8: 0x0001, 0x23b9: 0x0001, 0x23ba: 0x0001, 0x23bb: 0x0001, + 0x23bc: 0x0001, 0x23bd: 0x0001, 0x23be: 0x0001, 0x23bf: 0x0001, + // Block 0x8f, offset 0x23c0 + 0x23c0: 0x0001, 0x23c1: 0x0001, 0x23c2: 0x0001, 0x23c3: 0x0001, 0x23c4: 0x0001, 0x23c5: 0x0001, + 0x23c6: 0x0001, 0x23c7: 0x0001, 0x23c8: 0x0001, 0x23c9: 0x0001, 0x23ca: 0x0001, 0x23cb: 0x0001, + 0x23cc: 0x0001, 0x23cd: 0x0001, 0x23ce: 0x0001, 0x23cf: 0x0001, 0x23d0: 0x000d, 0x23d1: 0x000d, + 0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d, + 0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d, + 0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d, + 0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d, + 0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d, + 0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d, + 0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d, + 0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000d, 0x23ff: 0x000d, + // Block 0x90, offset 0x2400 + 0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d, + 0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d, + 0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000d, 0x2411: 0x000d, + 0x2412: 0x000d, 0x2413: 0x000d, 0x2414: 0x000d, 0x2415: 0x000d, 0x2416: 0x000d, 0x2417: 0x000d, + 0x2418: 0x000d, 0x2419: 0x000d, 0x241a: 0x000d, 0x241b: 0x000d, 0x241c: 0x000d, 0x241d: 0x000d, + 0x241e: 0x000d, 0x241f: 0x000d, 0x2420: 0x000d, 0x2421: 0x000d, 0x2422: 0x000d, 0x2423: 0x000d, + 0x2424: 0x000d, 0x2425: 0x000d, 0x2426: 0x000d, 0x2427: 0x000d, 0x2428: 0x000d, 0x2429: 0x000d, + 0x242a: 0x000d, 0x242b: 0x000d, 0x242c: 0x000d, 0x242d: 0x000d, 0x242e: 0x000d, 0x242f: 0x000d, + 0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d, + 0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d, + 0x243c: 0x000d, 0x243d: 0x000d, 0x243e: 0x000a, 0x243f: 0x000a, + // Block 0x91, offset 0x2440 + 0x2440: 0x000d, 0x2441: 0x000d, 0x2442: 0x000d, 0x2443: 0x000d, 0x2444: 0x000d, 0x2445: 0x000d, + 0x2446: 0x000d, 0x2447: 0x000d, 0x2448: 0x000d, 0x2449: 0x000d, 0x244a: 0x000d, 0x244b: 0x000d, + 0x244c: 0x000d, 0x244d: 0x000d, 0x244e: 0x000d, 0x244f: 0x000d, 0x2450: 0x000b, 0x2451: 0x000b, + 0x2452: 0x000b, 0x2453: 0x000b, 0x2454: 0x000b, 0x2455: 0x000b, 0x2456: 0x000b, 0x2457: 0x000b, + 0x2458: 0x000b, 0x2459: 0x000b, 0x245a: 0x000b, 0x245b: 0x000b, 0x245c: 0x000b, 0x245d: 0x000b, + 0x245e: 0x000b, 0x245f: 0x000b, 0x2460: 0x000b, 0x2461: 0x000b, 0x2462: 0x000b, 0x2463: 0x000b, + 0x2464: 0x000b, 0x2465: 0x000b, 0x2466: 0x000b, 0x2467: 0x000b, 0x2468: 0x000b, 0x2469: 0x000b, + 0x246a: 0x000b, 0x246b: 0x000b, 0x246c: 0x000b, 0x246d: 0x000b, 0x246e: 0x000b, 0x246f: 0x000b, + 0x2470: 0x000d, 0x2471: 0x000d, 0x2472: 0x000d, 0x2473: 0x000d, 0x2474: 0x000d, 0x2475: 0x000d, + 0x2476: 0x000d, 0x2477: 0x000d, 0x2478: 0x000d, 0x2479: 0x000d, 0x247a: 0x000d, 0x247b: 0x000d, + 0x247c: 0x000d, 0x247d: 0x000a, 0x247e: 0x000d, 0x247f: 0x000d, + // Block 0x92, offset 0x2480 + 0x2480: 0x000c, 0x2481: 0x000c, 0x2482: 0x000c, 0x2483: 0x000c, 0x2484: 0x000c, 0x2485: 0x000c, + 0x2486: 0x000c, 0x2487: 0x000c, 0x2488: 0x000c, 0x2489: 0x000c, 0x248a: 0x000c, 0x248b: 0x000c, + 0x248c: 0x000c, 0x248d: 0x000c, 0x248e: 0x000c, 0x248f: 0x000c, 0x2490: 0x000a, 0x2491: 0x000a, + 0x2492: 0x000a, 0x2493: 0x000a, 0x2494: 0x000a, 0x2495: 0x000a, 0x2496: 0x000a, 0x2497: 0x000a, + 0x2498: 0x000a, 0x2499: 0x000a, + 0x24a0: 0x000c, 0x24a1: 0x000c, 0x24a2: 0x000c, 0x24a3: 0x000c, + 0x24a4: 0x000c, 0x24a5: 0x000c, 0x24a6: 0x000c, 0x24a7: 0x000c, 0x24a8: 0x000c, 0x24a9: 0x000c, + 0x24aa: 0x000c, 0x24ab: 0x000c, 0x24ac: 0x000c, 0x24ad: 0x000c, 0x24ae: 0x000c, 0x24af: 0x000c, + 0x24b0: 0x000a, 0x24b1: 0x000a, 0x24b2: 0x000a, 0x24b3: 0x000a, 0x24b4: 0x000a, 0x24b5: 0x000a, + 0x24b6: 0x000a, 0x24b7: 0x000a, 0x24b8: 0x000a, 0x24b9: 0x000a, 0x24ba: 0x000a, 0x24bb: 0x000a, + 0x24bc: 0x000a, 0x24bd: 0x000a, 0x24be: 0x000a, 0x24bf: 0x000a, + // Block 0x93, offset 0x24c0 + 0x24c0: 0x000a, 0x24c1: 0x000a, 0x24c2: 0x000a, 0x24c3: 0x000a, 0x24c4: 0x000a, 0x24c5: 0x000a, + 0x24c6: 0x000a, 0x24c7: 0x000a, 0x24c8: 0x000a, 0x24c9: 0x000a, 0x24ca: 0x000a, 0x24cb: 0x000a, + 0x24cc: 0x000a, 0x24cd: 0x000a, 0x24ce: 0x000a, 0x24cf: 0x000a, 0x24d0: 0x0006, 0x24d1: 0x000a, + 0x24d2: 0x0006, 0x24d4: 0x000a, 0x24d5: 0x0006, 0x24d6: 0x000a, 0x24d7: 0x000a, + 0x24d8: 0x000a, 0x24d9: 0x009a, 0x24da: 0x008a, 0x24db: 0x007a, 0x24dc: 0x006a, 0x24dd: 0x009a, + 0x24de: 0x008a, 0x24df: 0x0004, 0x24e0: 0x000a, 0x24e1: 0x000a, 0x24e2: 0x0003, 0x24e3: 0x0003, + 0x24e4: 0x000a, 0x24e5: 0x000a, 0x24e6: 0x000a, 0x24e8: 0x000a, 0x24e9: 0x0004, + 0x24ea: 0x0004, 0x24eb: 0x000a, + 0x24f0: 0x000d, 0x24f1: 0x000d, 0x24f2: 0x000d, 0x24f3: 0x000d, 0x24f4: 0x000d, 0x24f5: 0x000d, + 0x24f6: 0x000d, 0x24f7: 0x000d, 0x24f8: 0x000d, 0x24f9: 0x000d, 0x24fa: 0x000d, 0x24fb: 0x000d, + 0x24fc: 0x000d, 0x24fd: 0x000d, 0x24fe: 0x000d, 0x24ff: 0x000d, + // Block 0x94, offset 0x2500 + 0x2500: 0x000d, 0x2501: 0x000d, 0x2502: 0x000d, 0x2503: 0x000d, 0x2504: 0x000d, 0x2505: 0x000d, + 0x2506: 0x000d, 0x2507: 0x000d, 0x2508: 0x000d, 0x2509: 0x000d, 0x250a: 0x000d, 0x250b: 0x000d, + 0x250c: 0x000d, 0x250d: 0x000d, 0x250e: 0x000d, 0x250f: 0x000d, 0x2510: 0x000d, 0x2511: 0x000d, + 0x2512: 0x000d, 0x2513: 0x000d, 0x2514: 0x000d, 0x2515: 0x000d, 0x2516: 0x000d, 0x2517: 0x000d, + 0x2518: 0x000d, 0x2519: 0x000d, 0x251a: 0x000d, 0x251b: 0x000d, 0x251c: 0x000d, 0x251d: 0x000d, + 0x251e: 0x000d, 0x251f: 0x000d, 0x2520: 0x000d, 0x2521: 0x000d, 0x2522: 0x000d, 0x2523: 0x000d, + 0x2524: 0x000d, 0x2525: 0x000d, 0x2526: 0x000d, 0x2527: 0x000d, 0x2528: 0x000d, 0x2529: 0x000d, + 0x252a: 0x000d, 0x252b: 0x000d, 0x252c: 0x000d, 0x252d: 0x000d, 0x252e: 0x000d, 0x252f: 0x000d, + 0x2530: 0x000d, 0x2531: 0x000d, 0x2532: 0x000d, 0x2533: 0x000d, 0x2534: 0x000d, 0x2535: 0x000d, + 0x2536: 0x000d, 0x2537: 0x000d, 0x2538: 0x000d, 0x2539: 0x000d, 0x253a: 0x000d, 0x253b: 0x000d, + 0x253c: 0x000d, 0x253d: 0x000d, 0x253e: 0x000d, 0x253f: 0x000b, + // Block 0x95, offset 0x2540 + 0x2541: 0x000a, 0x2542: 0x000a, 0x2543: 0x0004, 0x2544: 0x0004, 0x2545: 0x0004, + 0x2546: 0x000a, 0x2547: 0x000a, 0x2548: 0x003a, 0x2549: 0x002a, 0x254a: 0x000a, 0x254b: 0x0003, + 0x254c: 0x0006, 0x254d: 0x0003, 0x254e: 0x0006, 0x254f: 0x0006, 0x2550: 0x0002, 0x2551: 0x0002, + 0x2552: 0x0002, 0x2553: 0x0002, 0x2554: 0x0002, 0x2555: 0x0002, 0x2556: 0x0002, 0x2557: 0x0002, + 0x2558: 0x0002, 0x2559: 0x0002, 0x255a: 0x0006, 0x255b: 0x000a, 0x255c: 0x000a, 0x255d: 0x000a, + 0x255e: 0x000a, 0x255f: 0x000a, 0x2560: 0x000a, + 0x257b: 0x005a, + 0x257c: 0x000a, 0x257d: 0x004a, 0x257e: 0x000a, 0x257f: 0x000a, + // Block 0x96, offset 0x2580 + 0x2580: 0x000a, + 0x259b: 0x005a, 0x259c: 0x000a, 0x259d: 0x004a, + 0x259e: 0x000a, 0x259f: 0x00fa, 0x25a0: 0x00ea, 0x25a1: 0x000a, 0x25a2: 0x003a, 0x25a3: 0x002a, + 0x25a4: 0x000a, 0x25a5: 0x000a, + // Block 0x97, offset 0x25c0 + 0x25e0: 0x0004, 0x25e1: 0x0004, 0x25e2: 0x000a, 0x25e3: 0x000a, + 0x25e4: 0x000a, 0x25e5: 0x0004, 0x25e6: 0x0004, 0x25e8: 0x000a, 0x25e9: 0x000a, + 0x25ea: 0x000a, 0x25eb: 0x000a, 0x25ec: 0x000a, 0x25ed: 0x000a, 0x25ee: 0x000a, + 0x25f0: 0x000b, 0x25f1: 0x000b, 0x25f2: 0x000b, 0x25f3: 0x000b, 0x25f4: 0x000b, 0x25f5: 0x000b, + 0x25f6: 0x000b, 0x25f7: 0x000b, 0x25f8: 0x000b, 0x25f9: 0x000a, 0x25fa: 0x000a, 0x25fb: 0x000a, + 0x25fc: 0x000a, 0x25fd: 0x000a, 0x25fe: 0x000b, 0x25ff: 0x000b, + // Block 0x98, offset 0x2600 + 0x2601: 0x000a, + // Block 0x99, offset 0x2640 + 0x2640: 0x000a, 0x2641: 0x000a, 0x2642: 0x000a, 0x2643: 0x000a, 0x2644: 0x000a, 0x2645: 0x000a, + 0x2646: 0x000a, 0x2647: 0x000a, 0x2648: 0x000a, 0x2649: 0x000a, 0x264a: 0x000a, 0x264b: 0x000a, + 0x264c: 0x000a, 0x2650: 0x000a, 0x2651: 0x000a, + 0x2652: 0x000a, 0x2653: 0x000a, 0x2654: 0x000a, 0x2655: 0x000a, 0x2656: 0x000a, 0x2657: 0x000a, + 0x2658: 0x000a, 0x2659: 0x000a, 0x265a: 0x000a, 0x265b: 0x000a, + 0x2660: 0x000a, + // Block 0x9a, offset 0x2680 + 0x26bd: 0x000c, + // Block 0x9b, offset 0x26c0 + 0x26e0: 0x000c, 0x26e1: 0x0002, 0x26e2: 0x0002, 0x26e3: 0x0002, + 0x26e4: 0x0002, 0x26e5: 0x0002, 0x26e6: 0x0002, 0x26e7: 0x0002, 0x26e8: 0x0002, 0x26e9: 0x0002, + 0x26ea: 0x0002, 0x26eb: 0x0002, 0x26ec: 0x0002, 0x26ed: 0x0002, 0x26ee: 0x0002, 0x26ef: 0x0002, + 0x26f0: 0x0002, 0x26f1: 0x0002, 0x26f2: 0x0002, 0x26f3: 0x0002, 0x26f4: 0x0002, 0x26f5: 0x0002, + 0x26f6: 0x0002, 0x26f7: 0x0002, 0x26f8: 0x0002, 0x26f9: 0x0002, 0x26fa: 0x0002, 0x26fb: 0x0002, + // Block 0x9c, offset 0x2700 + 0x2736: 0x000c, 0x2737: 0x000c, 0x2738: 0x000c, 0x2739: 0x000c, 0x273a: 0x000c, + // Block 0x9d, offset 0x2740 + 0x2740: 0x0001, 0x2741: 0x0001, 0x2742: 0x0001, 0x2743: 0x0001, 0x2744: 0x0001, 0x2745: 0x0001, + 0x2746: 0x0001, 0x2747: 0x0001, 0x2748: 0x0001, 0x2749: 0x0001, 0x274a: 0x0001, 0x274b: 0x0001, + 0x274c: 0x0001, 0x274d: 0x0001, 0x274e: 0x0001, 0x274f: 0x0001, 0x2750: 0x0001, 0x2751: 0x0001, + 0x2752: 0x0001, 0x2753: 0x0001, 0x2754: 0x0001, 0x2755: 0x0001, 0x2756: 0x0001, 0x2757: 0x0001, + 0x2758: 0x0001, 0x2759: 0x0001, 0x275a: 0x0001, 0x275b: 0x0001, 0x275c: 0x0001, 0x275d: 0x0001, + 0x275e: 0x0001, 0x275f: 0x0001, 0x2760: 0x0001, 0x2761: 0x0001, 0x2762: 0x0001, 0x2763: 0x0001, + 0x2764: 0x0001, 0x2765: 0x0001, 0x2766: 0x0001, 0x2767: 0x0001, 0x2768: 0x0001, 0x2769: 0x0001, + 0x276a: 0x0001, 0x276b: 0x0001, 0x276c: 0x0001, 0x276d: 0x0001, 0x276e: 0x0001, 0x276f: 0x0001, + 0x2770: 0x0001, 0x2771: 0x0001, 0x2772: 0x0001, 0x2773: 0x0001, 0x2774: 0x0001, 0x2775: 0x0001, + 0x2776: 0x0001, 0x2777: 0x0001, 0x2778: 0x0001, 0x2779: 0x0001, 0x277a: 0x0001, 0x277b: 0x0001, + 0x277c: 0x0001, 0x277d: 0x0001, 0x277e: 0x0001, 0x277f: 0x0001, + // Block 0x9e, offset 0x2780 + 0x2780: 0x0001, 0x2781: 0x0001, 0x2782: 0x0001, 0x2783: 0x0001, 0x2784: 0x0001, 0x2785: 0x0001, + 0x2786: 0x0001, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001, + 0x278c: 0x0001, 0x278d: 0x0001, 0x278e: 0x0001, 0x278f: 0x0001, 0x2790: 0x0001, 0x2791: 0x0001, + 0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001, + 0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001, + 0x279e: 0x0001, 0x279f: 0x000a, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001, + 0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001, + 0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001, + 0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001, + 0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x0001, 0x27b9: 0x0001, 0x27ba: 0x0001, 0x27bb: 0x0001, + 0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x0001, + // Block 0x9f, offset 0x27c0 + 0x27c0: 0x0001, 0x27c1: 0x000c, 0x27c2: 0x000c, 0x27c3: 0x000c, 0x27c4: 0x0001, 0x27c5: 0x000c, + 0x27c6: 0x000c, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001, + 0x27cc: 0x000c, 0x27cd: 0x000c, 0x27ce: 0x000c, 0x27cf: 0x000c, 0x27d0: 0x0001, 0x27d1: 0x0001, + 0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001, + 0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001, + 0x27de: 0x0001, 0x27df: 0x0001, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001, + 0x27e4: 0x0001, 0x27e5: 0x0001, 0x27e6: 0x0001, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001, + 0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001, + 0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001, + 0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x000c, 0x27f9: 0x000c, 0x27fa: 0x000c, 0x27fb: 0x0001, + 0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x000c, + // Block 0xa0, offset 0x2800 + 0x2800: 0x0001, 0x2801: 0x0001, 0x2802: 0x0001, 0x2803: 0x0001, 0x2804: 0x0001, 0x2805: 0x0001, + 0x2806: 0x0001, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001, + 0x280c: 0x0001, 0x280d: 0x0001, 0x280e: 0x0001, 0x280f: 0x0001, 0x2810: 0x0001, 0x2811: 0x0001, + 0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001, + 0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001, + 0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001, + 0x2824: 0x0001, 0x2825: 0x000c, 0x2826: 0x000c, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001, + 0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001, + 0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001, + 0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x0001, 0x2839: 0x0001, 0x283a: 0x0001, 0x283b: 0x0001, + 0x283c: 0x0001, 0x283d: 0x0001, 0x283e: 0x0001, 0x283f: 0x0001, + // Block 0xa1, offset 0x2840 + 0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001, + 0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001, + 0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001, + 0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001, + 0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001, + 0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0001, 0x2861: 0x0001, 0x2862: 0x0001, 0x2863: 0x0001, + 0x2864: 0x0001, 0x2865: 0x0001, 0x2866: 0x0001, 0x2867: 0x0001, 0x2868: 0x0001, 0x2869: 0x0001, + 0x286a: 0x0001, 0x286b: 0x0001, 0x286c: 0x0001, 0x286d: 0x0001, 0x286e: 0x0001, 0x286f: 0x0001, + 0x2870: 0x0001, 0x2871: 0x0001, 0x2872: 0x0001, 0x2873: 0x0001, 0x2874: 0x0001, 0x2875: 0x0001, + 0x2876: 0x0001, 0x2877: 0x0001, 0x2878: 0x0001, 0x2879: 0x000a, 0x287a: 0x000a, 0x287b: 0x000a, + 0x287c: 0x000a, 0x287d: 0x000a, 0x287e: 0x000a, 0x287f: 0x000a, + // Block 0xa2, offset 0x2880 + 0x2880: 0x0001, 0x2881: 0x0001, 0x2882: 0x0001, 0x2883: 0x0001, 0x2884: 0x0001, 0x2885: 0x0001, + 0x2886: 0x0001, 0x2887: 0x0001, 0x2888: 0x0001, 0x2889: 0x0001, 0x288a: 0x0001, 0x288b: 0x0001, + 0x288c: 0x0001, 0x288d: 0x0001, 0x288e: 0x0001, 0x288f: 0x0001, 0x2890: 0x0001, 0x2891: 0x0001, + 0x2892: 0x0001, 0x2893: 0x0001, 0x2894: 0x0001, 0x2895: 0x0001, 0x2896: 0x0001, 0x2897: 0x0001, + 0x2898: 0x0001, 0x2899: 0x0001, 0x289a: 0x0001, 0x289b: 0x0001, 0x289c: 0x0001, 0x289d: 0x0001, + 0x289e: 0x0001, 0x289f: 0x0001, 0x28a0: 0x0005, 0x28a1: 0x0005, 0x28a2: 0x0005, 0x28a3: 0x0005, + 0x28a4: 0x0005, 0x28a5: 0x0005, 0x28a6: 0x0005, 0x28a7: 0x0005, 0x28a8: 0x0005, 0x28a9: 0x0005, + 0x28aa: 0x0005, 0x28ab: 0x0005, 0x28ac: 0x0005, 0x28ad: 0x0005, 0x28ae: 0x0005, 0x28af: 0x0005, + 0x28b0: 0x0005, 0x28b1: 0x0005, 0x28b2: 0x0005, 0x28b3: 0x0005, 0x28b4: 0x0005, 0x28b5: 0x0005, + 0x28b6: 0x0005, 0x28b7: 0x0005, 0x28b8: 0x0005, 0x28b9: 0x0005, 0x28ba: 0x0005, 0x28bb: 0x0005, + 0x28bc: 0x0005, 0x28bd: 0x0005, 0x28be: 0x0005, 0x28bf: 0x0001, + // Block 0xa3, offset 0x28c0 + 0x28c1: 0x000c, + 0x28f8: 0x000c, 0x28f9: 0x000c, 0x28fa: 0x000c, 0x28fb: 0x000c, + 0x28fc: 0x000c, 0x28fd: 0x000c, 0x28fe: 0x000c, 0x28ff: 0x000c, + // Block 0xa4, offset 0x2900 + 0x2900: 0x000c, 0x2901: 0x000c, 0x2902: 0x000c, 0x2903: 0x000c, 0x2904: 0x000c, 0x2905: 0x000c, + 0x2906: 0x000c, + 0x2912: 0x000a, 0x2913: 0x000a, 0x2914: 0x000a, 0x2915: 0x000a, 0x2916: 0x000a, 0x2917: 0x000a, + 0x2918: 0x000a, 0x2919: 0x000a, 0x291a: 0x000a, 0x291b: 0x000a, 0x291c: 0x000a, 0x291d: 0x000a, + 0x291e: 0x000a, 0x291f: 0x000a, 0x2920: 0x000a, 0x2921: 0x000a, 0x2922: 0x000a, 0x2923: 0x000a, + 0x2924: 0x000a, 0x2925: 0x000a, + 0x293f: 0x000c, + // Block 0xa5, offset 0x2940 + 0x2940: 0x000c, 0x2941: 0x000c, + 0x2973: 0x000c, 0x2974: 0x000c, 0x2975: 0x000c, + 0x2976: 0x000c, 0x2979: 0x000c, 0x297a: 0x000c, + // Block 0xa6, offset 0x2980 + 0x2980: 0x000c, 0x2981: 0x000c, 0x2982: 0x000c, + 0x29a7: 0x000c, 0x29a8: 0x000c, 0x29a9: 0x000c, + 0x29aa: 0x000c, 0x29ab: 0x000c, 0x29ad: 0x000c, 0x29ae: 0x000c, 0x29af: 0x000c, + 0x29b0: 0x000c, 0x29b1: 0x000c, 0x29b2: 0x000c, 0x29b3: 0x000c, 0x29b4: 0x000c, + // Block 0xa7, offset 0x29c0 + 0x29f3: 0x000c, + // Block 0xa8, offset 0x2a00 + 0x2a00: 0x000c, 0x2a01: 0x000c, + 0x2a36: 0x000c, 0x2a37: 0x000c, 0x2a38: 0x000c, 0x2a39: 0x000c, 0x2a3a: 0x000c, 0x2a3b: 0x000c, + 0x2a3c: 0x000c, 0x2a3d: 0x000c, 0x2a3e: 0x000c, + // Block 0xa9, offset 0x2a40 + 0x2a4a: 0x000c, 0x2a4b: 0x000c, + 0x2a4c: 0x000c, + // Block 0xaa, offset 0x2a80 + 0x2aaf: 0x000c, + 0x2ab0: 0x000c, 0x2ab1: 0x000c, 0x2ab4: 0x000c, + 0x2ab6: 0x000c, 0x2ab7: 0x000c, + // Block 0xab, offset 0x2ac0 + 0x2adf: 0x000c, 0x2ae3: 0x000c, + 0x2ae4: 0x000c, 0x2ae5: 0x000c, 0x2ae6: 0x000c, 0x2ae7: 0x000c, 0x2ae8: 0x000c, 0x2ae9: 0x000c, + 0x2aea: 0x000c, + // Block 0xac, offset 0x2b00 + 0x2b00: 0x000c, 0x2b01: 0x000c, + 0x2b3c: 0x000c, + // Block 0xad, offset 0x2b40 + 0x2b40: 0x000c, + 0x2b66: 0x000c, 0x2b67: 0x000c, 0x2b68: 0x000c, 0x2b69: 0x000c, + 0x2b6a: 0x000c, 0x2b6b: 0x000c, 0x2b6c: 0x000c, + 0x2b70: 0x000c, 0x2b71: 0x000c, 0x2b72: 0x000c, 0x2b73: 0x000c, 0x2b74: 0x000c, + // Block 0xae, offset 0x2b80 + 0x2bb3: 0x000c, 0x2bb4: 0x000c, 0x2bb5: 0x000c, + 0x2bb6: 0x000c, 0x2bb7: 0x000c, 0x2bb8: 0x000c, 0x2bba: 0x000c, + 0x2bbf: 0x000c, + // Block 0xaf, offset 0x2bc0 + 0x2bc0: 0x000c, 0x2bc2: 0x000c, 0x2bc3: 0x000c, + // Block 0xb0, offset 0x2c00 + 0x2c32: 0x000c, 0x2c33: 0x000c, 0x2c34: 0x000c, 0x2c35: 0x000c, + 0x2c3c: 0x000c, 0x2c3d: 0x000c, 0x2c3f: 0x000c, + // Block 0xb1, offset 0x2c40 + 0x2c40: 0x000c, + 0x2c5c: 0x000c, 0x2c5d: 0x000c, + // Block 0xb2, offset 0x2c80 + 0x2cb3: 0x000c, 0x2cb4: 0x000c, 0x2cb5: 0x000c, + 0x2cb6: 0x000c, 0x2cb7: 0x000c, 0x2cb8: 0x000c, 0x2cb9: 0x000c, 0x2cba: 0x000c, + 0x2cbd: 0x000c, 0x2cbf: 0x000c, + // Block 0xb3, offset 0x2cc0 + 0x2cc0: 0x000c, + // Block 0xb4, offset 0x2d00 + 0x2d2b: 0x000c, 0x2d2d: 0x000c, + 0x2d30: 0x000c, 0x2d31: 0x000c, 0x2d32: 0x000c, 0x2d33: 0x000c, 0x2d34: 0x000c, 0x2d35: 0x000c, + 0x2d37: 0x000c, + // Block 0xb5, offset 0x2d40 + 0x2d5d: 0x000c, + 0x2d5e: 0x000c, 0x2d5f: 0x000c, 0x2d62: 0x000c, 0x2d63: 0x000c, + 0x2d64: 0x000c, 0x2d65: 0x000c, 0x2d67: 0x000c, 0x2d68: 0x000c, 0x2d69: 0x000c, + 0x2d6a: 0x000c, 0x2d6b: 0x000c, + // Block 0xb6, offset 0x2d80 + 0x2db0: 0x000c, 0x2db1: 0x000c, 0x2db2: 0x000c, 0x2db3: 0x000c, 0x2db4: 0x000c, + // Block 0xb7, offset 0x2dc0 + 0x2df0: 0x000c, 0x2df1: 0x000c, 0x2df2: 0x000c, 0x2df3: 0x000c, 0x2df4: 0x000c, 0x2df5: 0x000c, + 0x2df6: 0x000c, + // Block 0xb8, offset 0x2e00 + 0x2e0f: 0x000c, 0x2e10: 0x000c, 0x2e11: 0x000c, + 0x2e12: 0x000c, + // Block 0xb9, offset 0x2e40 + 0x2e5d: 0x000c, + 0x2e5e: 0x000c, 0x2e60: 0x000b, 0x2e61: 0x000b, 0x2e62: 0x000b, 0x2e63: 0x000b, + // Block 0xba, offset 0x2e80 + 0x2ea7: 0x000c, 0x2ea8: 0x000c, 0x2ea9: 0x000c, + 0x2eb3: 0x000b, 0x2eb4: 0x000b, 0x2eb5: 0x000b, + 0x2eb6: 0x000b, 0x2eb7: 0x000b, 0x2eb8: 0x000b, 0x2eb9: 0x000b, 0x2eba: 0x000b, 0x2ebb: 0x000c, + 0x2ebc: 0x000c, 0x2ebd: 0x000c, 0x2ebe: 0x000c, 0x2ebf: 0x000c, + // Block 0xbb, offset 0x2ec0 + 0x2ec0: 0x000c, 0x2ec1: 0x000c, 0x2ec2: 0x000c, 0x2ec5: 0x000c, + 0x2ec6: 0x000c, 0x2ec7: 0x000c, 0x2ec8: 0x000c, 0x2ec9: 0x000c, 0x2eca: 0x000c, 0x2ecb: 0x000c, + 0x2eea: 0x000c, 0x2eeb: 0x000c, 0x2eec: 0x000c, 0x2eed: 0x000c, + // Block 0xbc, offset 0x2f00 + 0x2f00: 0x000a, 0x2f01: 0x000a, 0x2f02: 0x000c, 0x2f03: 0x000c, 0x2f04: 0x000c, 0x2f05: 0x000a, + // Block 0xbd, offset 0x2f40 + 0x2f40: 0x000a, 0x2f41: 0x000a, 0x2f42: 0x000a, 0x2f43: 0x000a, 0x2f44: 0x000a, 0x2f45: 0x000a, + 0x2f46: 0x000a, 0x2f47: 0x000a, 0x2f48: 0x000a, 0x2f49: 0x000a, 0x2f4a: 0x000a, 0x2f4b: 0x000a, + 0x2f4c: 0x000a, 0x2f4d: 0x000a, 0x2f4e: 0x000a, 0x2f4f: 0x000a, 0x2f50: 0x000a, 0x2f51: 0x000a, + 0x2f52: 0x000a, 0x2f53: 0x000a, 0x2f54: 0x000a, 0x2f55: 0x000a, 0x2f56: 0x000a, + // Block 0xbe, offset 0x2f80 + 0x2f9b: 0x000a, + // Block 0xbf, offset 0x2fc0 + 0x2fd5: 0x000a, + // Block 0xc0, offset 0x3000 + 0x300f: 0x000a, + // Block 0xc1, offset 0x3040 + 0x3049: 0x000a, + // Block 0xc2, offset 0x3080 + 0x3083: 0x000a, + 0x308e: 0x0002, 0x308f: 0x0002, 0x3090: 0x0002, 0x3091: 0x0002, + 0x3092: 0x0002, 0x3093: 0x0002, 0x3094: 0x0002, 0x3095: 0x0002, 0x3096: 0x0002, 0x3097: 0x0002, + 0x3098: 0x0002, 0x3099: 0x0002, 0x309a: 0x0002, 0x309b: 0x0002, 0x309c: 0x0002, 0x309d: 0x0002, + 0x309e: 0x0002, 0x309f: 0x0002, 0x30a0: 0x0002, 0x30a1: 0x0002, 0x30a2: 0x0002, 0x30a3: 0x0002, + 0x30a4: 0x0002, 0x30a5: 0x0002, 0x30a6: 0x0002, 0x30a7: 0x0002, 0x30a8: 0x0002, 0x30a9: 0x0002, + 0x30aa: 0x0002, 0x30ab: 0x0002, 0x30ac: 0x0002, 0x30ad: 0x0002, 0x30ae: 0x0002, 0x30af: 0x0002, + 0x30b0: 0x0002, 0x30b1: 0x0002, 0x30b2: 0x0002, 0x30b3: 0x0002, 0x30b4: 0x0002, 0x30b5: 0x0002, + 0x30b6: 0x0002, 0x30b7: 0x0002, 0x30b8: 0x0002, 0x30b9: 0x0002, 0x30ba: 0x0002, 0x30bb: 0x0002, + 0x30bc: 0x0002, 0x30bd: 0x0002, 0x30be: 0x0002, 0x30bf: 0x0002, + // Block 0xc3, offset 0x30c0 + 0x30c0: 0x000c, 0x30c1: 0x000c, 0x30c2: 0x000c, 0x30c3: 0x000c, 0x30c4: 0x000c, 0x30c5: 0x000c, + 0x30c6: 0x000c, 0x30c7: 0x000c, 0x30c8: 0x000c, 0x30c9: 0x000c, 0x30ca: 0x000c, 0x30cb: 0x000c, + 0x30cc: 0x000c, 0x30cd: 0x000c, 0x30ce: 0x000c, 0x30cf: 0x000c, 0x30d0: 0x000c, 0x30d1: 0x000c, + 0x30d2: 0x000c, 0x30d3: 0x000c, 0x30d4: 0x000c, 0x30d5: 0x000c, 0x30d6: 0x000c, 0x30d7: 0x000c, + 0x30d8: 0x000c, 0x30d9: 0x000c, 0x30da: 0x000c, 0x30db: 0x000c, 0x30dc: 0x000c, 0x30dd: 0x000c, + 0x30de: 0x000c, 0x30df: 0x000c, 0x30e0: 0x000c, 0x30e1: 0x000c, 0x30e2: 0x000c, 0x30e3: 0x000c, + 0x30e4: 0x000c, 0x30e5: 0x000c, 0x30e6: 0x000c, 0x30e7: 0x000c, 0x30e8: 0x000c, 0x30e9: 0x000c, + 0x30ea: 0x000c, 0x30eb: 0x000c, 0x30ec: 0x000c, 0x30ed: 0x000c, 0x30ee: 0x000c, 0x30ef: 0x000c, + 0x30f0: 0x000c, 0x30f1: 0x000c, 0x30f2: 0x000c, 0x30f3: 0x000c, 0x30f4: 0x000c, 0x30f5: 0x000c, + 0x30f6: 0x000c, 0x30fb: 0x000c, + 0x30fc: 0x000c, 0x30fd: 0x000c, 0x30fe: 0x000c, 0x30ff: 0x000c, + // Block 0xc4, offset 0x3100 + 0x3100: 0x000c, 0x3101: 0x000c, 0x3102: 0x000c, 0x3103: 0x000c, 0x3104: 0x000c, 0x3105: 0x000c, + 0x3106: 0x000c, 0x3107: 0x000c, 0x3108: 0x000c, 0x3109: 0x000c, 0x310a: 0x000c, 0x310b: 0x000c, + 0x310c: 0x000c, 0x310d: 0x000c, 0x310e: 0x000c, 0x310f: 0x000c, 0x3110: 0x000c, 0x3111: 0x000c, + 0x3112: 0x000c, 0x3113: 0x000c, 0x3114: 0x000c, 0x3115: 0x000c, 0x3116: 0x000c, 0x3117: 0x000c, + 0x3118: 0x000c, 0x3119: 0x000c, 0x311a: 0x000c, 0x311b: 0x000c, 0x311c: 0x000c, 0x311d: 0x000c, + 0x311e: 0x000c, 0x311f: 0x000c, 0x3120: 0x000c, 0x3121: 0x000c, 0x3122: 0x000c, 0x3123: 0x000c, + 0x3124: 0x000c, 0x3125: 0x000c, 0x3126: 0x000c, 0x3127: 0x000c, 0x3128: 0x000c, 0x3129: 0x000c, + 0x312a: 0x000c, 0x312b: 0x000c, 0x312c: 0x000c, + 0x3135: 0x000c, + // Block 0xc5, offset 0x3140 + 0x3144: 0x000c, + 0x315b: 0x000c, 0x315c: 0x000c, 0x315d: 0x000c, + 0x315e: 0x000c, 0x315f: 0x000c, 0x3161: 0x000c, 0x3162: 0x000c, 0x3163: 0x000c, + 0x3164: 0x000c, 0x3165: 0x000c, 0x3166: 0x000c, 0x3167: 0x000c, 0x3168: 0x000c, 0x3169: 0x000c, + 0x316a: 0x000c, 0x316b: 0x000c, 0x316c: 0x000c, 0x316d: 0x000c, 0x316e: 0x000c, 0x316f: 0x000c, + // Block 0xc6, offset 0x3180 + 0x3180: 0x0001, 0x3181: 0x0001, 0x3182: 0x0001, 0x3183: 0x0001, 0x3184: 0x0001, 0x3185: 0x0001, + 0x3186: 0x0001, 0x3187: 0x0001, 0x3188: 0x0001, 0x3189: 0x0001, 0x318a: 0x0001, 0x318b: 0x0001, + 0x318c: 0x0001, 0x318d: 0x0001, 0x318e: 0x0001, 0x318f: 0x0001, 0x3190: 0x000c, 0x3191: 0x000c, + 0x3192: 0x000c, 0x3193: 0x000c, 0x3194: 0x000c, 0x3195: 0x000c, 0x3196: 0x000c, 0x3197: 0x0001, + 0x3198: 0x0001, 0x3199: 0x0001, 0x319a: 0x0001, 0x319b: 0x0001, 0x319c: 0x0001, 0x319d: 0x0001, + 0x319e: 0x0001, 0x319f: 0x0001, 0x31a0: 0x0001, 0x31a1: 0x0001, 0x31a2: 0x0001, 0x31a3: 0x0001, + 0x31a4: 0x0001, 0x31a5: 0x0001, 0x31a6: 0x0001, 0x31a7: 0x0001, 0x31a8: 0x0001, 0x31a9: 0x0001, + 0x31aa: 0x0001, 0x31ab: 0x0001, 0x31ac: 0x0001, 0x31ad: 0x0001, 0x31ae: 0x0001, 0x31af: 0x0001, + 0x31b0: 0x0001, 0x31b1: 0x0001, 0x31b2: 0x0001, 0x31b3: 0x0001, 0x31b4: 0x0001, 0x31b5: 0x0001, + 0x31b6: 0x0001, 0x31b7: 0x0001, 0x31b8: 0x0001, 0x31b9: 0x0001, 0x31ba: 0x0001, 0x31bb: 0x0001, + 0x31bc: 0x0001, 0x31bd: 0x0001, 0x31be: 0x0001, 0x31bf: 0x0001, + // Block 0xc7, offset 0x31c0 + 0x31c0: 0x000d, 0x31c1: 0x000d, 0x31c2: 0x000d, 0x31c3: 0x000d, 0x31c4: 0x000d, 0x31c5: 0x000d, + 0x31c6: 0x000d, 0x31c7: 0x000d, 0x31c8: 0x000d, 0x31c9: 0x000d, 0x31ca: 0x000d, 0x31cb: 0x000d, + 0x31cc: 0x000d, 0x31cd: 0x000d, 0x31ce: 0x000d, 0x31cf: 0x000d, 0x31d0: 0x000d, 0x31d1: 0x000d, + 0x31d2: 0x000d, 0x31d3: 0x000d, 0x31d4: 0x000d, 0x31d5: 0x000d, 0x31d6: 0x000d, 0x31d7: 0x000d, + 0x31d8: 0x000d, 0x31d9: 0x000d, 0x31da: 0x000d, 0x31db: 0x000d, 0x31dc: 0x000d, 0x31dd: 0x000d, + 0x31de: 0x000d, 0x31df: 0x000d, 0x31e0: 0x000d, 0x31e1: 0x000d, 0x31e2: 0x000d, 0x31e3: 0x000d, + 0x31e4: 0x000d, 0x31e5: 0x000d, 0x31e6: 0x000d, 0x31e7: 0x000d, 0x31e8: 0x000d, 0x31e9: 0x000d, + 0x31ea: 0x000d, 0x31eb: 0x000d, 0x31ec: 0x000d, 0x31ed: 0x000d, 0x31ee: 0x000d, 0x31ef: 0x000d, + 0x31f0: 0x000a, 0x31f1: 0x000a, 0x31f2: 0x000d, 0x31f3: 0x000d, 0x31f4: 0x000d, 0x31f5: 0x000d, + 0x31f6: 0x000d, 0x31f7: 0x000d, 0x31f8: 0x000d, 0x31f9: 0x000d, 0x31fa: 0x000d, 0x31fb: 0x000d, + 0x31fc: 0x000d, 0x31fd: 0x000d, 0x31fe: 0x000d, 0x31ff: 0x000d, + // Block 0xc8, offset 0x3200 + 0x3200: 0x000a, 0x3201: 0x000a, 0x3202: 0x000a, 0x3203: 0x000a, 0x3204: 0x000a, 0x3205: 0x000a, + 0x3206: 0x000a, 0x3207: 0x000a, 0x3208: 0x000a, 0x3209: 0x000a, 0x320a: 0x000a, 0x320b: 0x000a, + 0x320c: 0x000a, 0x320d: 0x000a, 0x320e: 0x000a, 0x320f: 0x000a, 0x3210: 0x000a, 0x3211: 0x000a, + 0x3212: 0x000a, 0x3213: 0x000a, 0x3214: 0x000a, 0x3215: 0x000a, 0x3216: 0x000a, 0x3217: 0x000a, + 0x3218: 0x000a, 0x3219: 0x000a, 0x321a: 0x000a, 0x321b: 0x000a, 0x321c: 0x000a, 0x321d: 0x000a, + 0x321e: 0x000a, 0x321f: 0x000a, 0x3220: 0x000a, 0x3221: 0x000a, 0x3222: 0x000a, 0x3223: 0x000a, + 0x3224: 0x000a, 0x3225: 0x000a, 0x3226: 0x000a, 0x3227: 0x000a, 0x3228: 0x000a, 0x3229: 0x000a, + 0x322a: 0x000a, 0x322b: 0x000a, + 0x3230: 0x000a, 0x3231: 0x000a, 0x3232: 0x000a, 0x3233: 0x000a, 0x3234: 0x000a, 0x3235: 0x000a, + 0x3236: 0x000a, 0x3237: 0x000a, 0x3238: 0x000a, 0x3239: 0x000a, 0x323a: 0x000a, 0x323b: 0x000a, + 0x323c: 0x000a, 0x323d: 0x000a, 0x323e: 0x000a, 0x323f: 0x000a, + // Block 0xc9, offset 0x3240 + 0x3240: 0x000a, 0x3241: 0x000a, 0x3242: 0x000a, 0x3243: 0x000a, 0x3244: 0x000a, 0x3245: 0x000a, + 0x3246: 0x000a, 0x3247: 0x000a, 0x3248: 0x000a, 0x3249: 0x000a, 0x324a: 0x000a, 0x324b: 0x000a, + 0x324c: 0x000a, 0x324d: 0x000a, 0x324e: 0x000a, 0x324f: 0x000a, 0x3250: 0x000a, 0x3251: 0x000a, + 0x3252: 0x000a, 0x3253: 0x000a, + 0x3260: 0x000a, 0x3261: 0x000a, 0x3262: 0x000a, 0x3263: 0x000a, + 0x3264: 0x000a, 0x3265: 0x000a, 0x3266: 0x000a, 0x3267: 0x000a, 0x3268: 0x000a, 0x3269: 0x000a, + 0x326a: 0x000a, 0x326b: 0x000a, 0x326c: 0x000a, 0x326d: 0x000a, 0x326e: 0x000a, + 0x3271: 0x000a, 0x3272: 0x000a, 0x3273: 0x000a, 0x3274: 0x000a, 0x3275: 0x000a, + 0x3276: 0x000a, 0x3277: 0x000a, 0x3278: 0x000a, 0x3279: 0x000a, 0x327a: 0x000a, 0x327b: 0x000a, + 0x327c: 0x000a, 0x327d: 0x000a, 0x327e: 0x000a, 0x327f: 0x000a, + // Block 0xca, offset 0x3280 + 0x3281: 0x000a, 0x3282: 0x000a, 0x3283: 0x000a, 0x3284: 0x000a, 0x3285: 0x000a, + 0x3286: 0x000a, 0x3287: 0x000a, 0x3288: 0x000a, 0x3289: 0x000a, 0x328a: 0x000a, 0x328b: 0x000a, + 0x328c: 0x000a, 0x328d: 0x000a, 0x328e: 0x000a, 0x328f: 0x000a, 0x3291: 0x000a, + 0x3292: 0x000a, 0x3293: 0x000a, 0x3294: 0x000a, 0x3295: 0x000a, 0x3296: 0x000a, 0x3297: 0x000a, + 0x3298: 0x000a, 0x3299: 0x000a, 0x329a: 0x000a, 0x329b: 0x000a, 0x329c: 0x000a, 0x329d: 0x000a, + 0x329e: 0x000a, 0x329f: 0x000a, 0x32a0: 0x000a, 0x32a1: 0x000a, 0x32a2: 0x000a, 0x32a3: 0x000a, + 0x32a4: 0x000a, 0x32a5: 0x000a, 0x32a6: 0x000a, 0x32a7: 0x000a, 0x32a8: 0x000a, 0x32a9: 0x000a, + 0x32aa: 0x000a, 0x32ab: 0x000a, 0x32ac: 0x000a, 0x32ad: 0x000a, 0x32ae: 0x000a, 0x32af: 0x000a, + 0x32b0: 0x000a, 0x32b1: 0x000a, 0x32b2: 0x000a, 0x32b3: 0x000a, 0x32b4: 0x000a, 0x32b5: 0x000a, + // Block 0xcb, offset 0x32c0 + 0x32c0: 0x0002, 0x32c1: 0x0002, 0x32c2: 0x0002, 0x32c3: 0x0002, 0x32c4: 0x0002, 0x32c5: 0x0002, + 0x32c6: 0x0002, 0x32c7: 0x0002, 0x32c8: 0x0002, 0x32c9: 0x0002, 0x32ca: 0x0002, 0x32cb: 0x000a, + 0x32cc: 0x000a, + // Block 0xcc, offset 0x3300 + 0x332a: 0x000a, 0x332b: 0x000a, + // Block 0xcd, offset 0x3340 + 0x3340: 0x000a, 0x3341: 0x000a, 0x3342: 0x000a, 0x3343: 0x000a, 0x3344: 0x000a, 0x3345: 0x000a, + 0x3346: 0x000a, 0x3347: 0x000a, 0x3348: 0x000a, 0x3349: 0x000a, 0x334a: 0x000a, 0x334b: 0x000a, + 0x334c: 0x000a, 0x334d: 0x000a, 0x334e: 0x000a, 0x334f: 0x000a, 0x3350: 0x000a, 0x3351: 0x000a, + 0x3352: 0x000a, 0x3353: 0x000a, 0x3354: 0x000a, 0x3355: 0x000a, 0x3356: 0x000a, 0x3357: 0x000a, + 0x3358: 0x000a, 0x3359: 0x000a, 0x335a: 0x000a, 0x335b: 0x000a, 0x335c: 0x000a, 0x335d: 0x000a, + 0x335e: 0x000a, 0x335f: 0x000a, 0x3360: 0x000a, 0x3361: 0x000a, 0x3362: 0x000a, 0x3363: 0x000a, + 0x3364: 0x000a, 0x3365: 0x000a, 0x3366: 0x000a, 0x3367: 0x000a, 0x3368: 0x000a, 0x3369: 0x000a, + 0x336a: 0x000a, 0x336b: 0x000a, 0x336c: 0x000a, 0x336d: 0x000a, 0x336e: 0x000a, 0x336f: 0x000a, + 0x3370: 0x000a, 0x3371: 0x000a, 0x3372: 0x000a, 0x3373: 0x000a, 0x3374: 0x000a, 0x3375: 0x000a, + 0x3376: 0x000a, 0x3377: 0x000a, 0x3378: 0x000a, 0x3379: 0x000a, 0x337b: 0x000a, + 0x337c: 0x000a, 0x337d: 0x000a, 0x337e: 0x000a, 0x337f: 0x000a, + // Block 0xce, offset 0x3380 + 0x3380: 0x000a, 0x3381: 0x000a, 0x3382: 0x000a, 0x3383: 0x000a, 0x3384: 0x000a, 0x3385: 0x000a, + 0x3386: 0x000a, 0x3387: 0x000a, 0x3388: 0x000a, 0x3389: 0x000a, 0x338a: 0x000a, 0x338b: 0x000a, + 0x338c: 0x000a, 0x338d: 0x000a, 0x338e: 0x000a, 0x338f: 0x000a, 0x3390: 0x000a, 0x3391: 0x000a, + 0x3392: 0x000a, 0x3393: 0x000a, 0x3394: 0x000a, 0x3395: 0x000a, 0x3396: 0x000a, 0x3397: 0x000a, + 0x3398: 0x000a, 0x3399: 0x000a, 0x339a: 0x000a, 0x339b: 0x000a, 0x339c: 0x000a, 0x339d: 0x000a, + 0x339e: 0x000a, 0x339f: 0x000a, 0x33a0: 0x000a, 0x33a1: 0x000a, 0x33a2: 0x000a, 0x33a3: 0x000a, + 0x33a5: 0x000a, 0x33a6: 0x000a, 0x33a7: 0x000a, 0x33a8: 0x000a, 0x33a9: 0x000a, + 0x33aa: 0x000a, 0x33ab: 0x000a, 0x33ac: 0x000a, 0x33ad: 0x000a, 0x33ae: 0x000a, 0x33af: 0x000a, + 0x33b0: 0x000a, 0x33b1: 0x000a, 0x33b2: 0x000a, 0x33b3: 0x000a, 0x33b4: 0x000a, 0x33b5: 0x000a, + 0x33b6: 0x000a, 0x33b7: 0x000a, 0x33b8: 0x000a, 0x33b9: 0x000a, 0x33ba: 0x000a, 0x33bb: 0x000a, + 0x33bc: 0x000a, 0x33bd: 0x000a, 0x33be: 0x000a, 0x33bf: 0x000a, + // Block 0xcf, offset 0x33c0 + 0x33c0: 0x000a, 0x33c1: 0x000a, 0x33c2: 0x000a, 0x33c3: 0x000a, 0x33c4: 0x000a, 0x33c5: 0x000a, + 0x33c6: 0x000a, 0x33c7: 0x000a, 0x33c8: 0x000a, 0x33c9: 0x000a, 0x33ca: 0x000a, 0x33cb: 0x000a, + 0x33cc: 0x000a, 0x33cd: 0x000a, 0x33ce: 0x000a, 0x33cf: 0x000a, 0x33d0: 0x000a, + 0x33e0: 0x000a, 0x33e1: 0x000a, 0x33e2: 0x000a, 0x33e3: 0x000a, + 0x33e4: 0x000a, 0x33e5: 0x000a, 0x33e6: 0x000a, 0x33e7: 0x000a, 0x33e8: 0x000a, 0x33e9: 0x000a, + 0x33ea: 0x000a, 0x33eb: 0x000a, 0x33ec: 0x000a, + 0x33f0: 0x000a, 0x33f1: 0x000a, 0x33f2: 0x000a, 0x33f3: 0x000a, + // Block 0xd0, offset 0x3400 + 0x3400: 0x000a, 0x3401: 0x000a, 0x3402: 0x000a, 0x3403: 0x000a, 0x3404: 0x000a, 0x3405: 0x000a, + 0x3406: 0x000a, 0x3407: 0x000a, 0x3408: 0x000a, 0x3409: 0x000a, 0x340a: 0x000a, 0x340b: 0x000a, + 0x340c: 0x000a, 0x340d: 0x000a, 0x340e: 0x000a, 0x340f: 0x000a, 0x3410: 0x000a, 0x3411: 0x000a, + 0x3412: 0x000a, 0x3413: 0x000a, 0x3414: 0x000a, + // Block 0xd1, offset 0x3440 + 0x3440: 0x000a, 0x3441: 0x000a, 0x3442: 0x000a, 0x3443: 0x000a, 0x3444: 0x000a, 0x3445: 0x000a, + 0x3446: 0x000a, 0x3447: 0x000a, 0x3448: 0x000a, 0x3449: 0x000a, 0x344a: 0x000a, 0x344b: 0x000a, + 0x3450: 0x000a, 0x3451: 0x000a, + 0x3452: 0x000a, 0x3453: 0x000a, 0x3454: 0x000a, 0x3455: 0x000a, 0x3456: 0x000a, 0x3457: 0x000a, + 0x3458: 0x000a, 0x3459: 0x000a, 0x345a: 0x000a, 0x345b: 0x000a, 0x345c: 0x000a, 0x345d: 0x000a, + 0x345e: 0x000a, 0x345f: 0x000a, 0x3460: 0x000a, 0x3461: 0x000a, 0x3462: 0x000a, 0x3463: 0x000a, + 0x3464: 0x000a, 0x3465: 0x000a, 0x3466: 0x000a, 0x3467: 0x000a, 0x3468: 0x000a, 0x3469: 0x000a, + 0x346a: 0x000a, 0x346b: 0x000a, 0x346c: 0x000a, 0x346d: 0x000a, 0x346e: 0x000a, 0x346f: 0x000a, + 0x3470: 0x000a, 0x3471: 0x000a, 0x3472: 0x000a, 0x3473: 0x000a, 0x3474: 0x000a, 0x3475: 0x000a, + 0x3476: 0x000a, 0x3477: 0x000a, 0x3478: 0x000a, 0x3479: 0x000a, 0x347a: 0x000a, 0x347b: 0x000a, + 0x347c: 0x000a, 0x347d: 0x000a, 0x347e: 0x000a, 0x347f: 0x000a, + // Block 0xd2, offset 0x3480 + 0x3480: 0x000a, 0x3481: 0x000a, 0x3482: 0x000a, 0x3483: 0x000a, 0x3484: 0x000a, 0x3485: 0x000a, + 0x3486: 0x000a, 0x3487: 0x000a, + 0x3490: 0x000a, 0x3491: 0x000a, + 0x3492: 0x000a, 0x3493: 0x000a, 0x3494: 0x000a, 0x3495: 0x000a, 0x3496: 0x000a, 0x3497: 0x000a, + 0x3498: 0x000a, 0x3499: 0x000a, + 0x34a0: 0x000a, 0x34a1: 0x000a, 0x34a2: 0x000a, 0x34a3: 0x000a, + 0x34a4: 0x000a, 0x34a5: 0x000a, 0x34a6: 0x000a, 0x34a7: 0x000a, 0x34a8: 0x000a, 0x34a9: 0x000a, + 0x34aa: 0x000a, 0x34ab: 0x000a, 0x34ac: 0x000a, 0x34ad: 0x000a, 0x34ae: 0x000a, 0x34af: 0x000a, + 0x34b0: 0x000a, 0x34b1: 0x000a, 0x34b2: 0x000a, 0x34b3: 0x000a, 0x34b4: 0x000a, 0x34b5: 0x000a, + 0x34b6: 0x000a, 0x34b7: 0x000a, 0x34b8: 0x000a, 0x34b9: 0x000a, 0x34ba: 0x000a, 0x34bb: 0x000a, + 0x34bc: 0x000a, 0x34bd: 0x000a, 0x34be: 0x000a, 0x34bf: 0x000a, + // Block 0xd3, offset 0x34c0 + 0x34c0: 0x000a, 0x34c1: 0x000a, 0x34c2: 0x000a, 0x34c3: 0x000a, 0x34c4: 0x000a, 0x34c5: 0x000a, + 0x34c6: 0x000a, 0x34c7: 0x000a, + 0x34d0: 0x000a, 0x34d1: 0x000a, + 0x34d2: 0x000a, 0x34d3: 0x000a, 0x34d4: 0x000a, 0x34d5: 0x000a, 0x34d6: 0x000a, 0x34d7: 0x000a, + 0x34d8: 0x000a, 0x34d9: 0x000a, 0x34da: 0x000a, 0x34db: 0x000a, 0x34dc: 0x000a, 0x34dd: 0x000a, + 0x34de: 0x000a, 0x34df: 0x000a, 0x34e0: 0x000a, 0x34e1: 0x000a, 0x34e2: 0x000a, 0x34e3: 0x000a, + 0x34e4: 0x000a, 0x34e5: 0x000a, 0x34e6: 0x000a, 0x34e7: 0x000a, 0x34e8: 0x000a, 0x34e9: 0x000a, + 0x34ea: 0x000a, 0x34eb: 0x000a, 0x34ec: 0x000a, 0x34ed: 0x000a, + // Block 0xd4, offset 0x3500 + 0x3510: 0x000a, 0x3511: 0x000a, + 0x3512: 0x000a, 0x3513: 0x000a, 0x3514: 0x000a, 0x3515: 0x000a, 0x3516: 0x000a, 0x3517: 0x000a, + 0x3518: 0x000a, + // Block 0xd5, offset 0x3540 + 0x3540: 0x000a, 0x3541: 0x000a, 0x3542: 0x000a, 0x3543: 0x000a, 0x3544: 0x000a, + // Block 0xd6, offset 0x3580 + 0x35be: 0x000b, 0x35bf: 0x000b, + // Block 0xd7, offset 0x35c0 + 0x35c0: 0x000b, 0x35c1: 0x000b, 0x35c2: 0x000b, 0x35c3: 0x000b, 0x35c4: 0x000b, 0x35c5: 0x000b, + 0x35c6: 0x000b, 0x35c7: 0x000b, 0x35c8: 0x000b, 0x35c9: 0x000b, 0x35ca: 0x000b, 0x35cb: 0x000b, + 0x35cc: 0x000b, 0x35cd: 0x000b, 0x35ce: 0x000b, 0x35cf: 0x000b, 0x35d0: 0x000b, 0x35d1: 0x000b, + 0x35d2: 0x000b, 0x35d3: 0x000b, 0x35d4: 0x000b, 0x35d5: 0x000b, 0x35d6: 0x000b, 0x35d7: 0x000b, + 0x35d8: 0x000b, 0x35d9: 0x000b, 0x35da: 0x000b, 0x35db: 0x000b, 0x35dc: 0x000b, 0x35dd: 0x000b, + 0x35de: 0x000b, 0x35df: 0x000b, 0x35e0: 0x000b, 0x35e1: 0x000b, 0x35e2: 0x000b, 0x35e3: 0x000b, + 0x35e4: 0x000b, 0x35e5: 0x000b, 0x35e6: 0x000b, 0x35e7: 0x000b, 0x35e8: 0x000b, 0x35e9: 0x000b, + 0x35ea: 0x000b, 0x35eb: 0x000b, 0x35ec: 0x000b, 0x35ed: 0x000b, 0x35ee: 0x000b, 0x35ef: 0x000b, + 0x35f0: 0x000b, 0x35f1: 0x000b, 0x35f2: 0x000b, 0x35f3: 0x000b, 0x35f4: 0x000b, 0x35f5: 0x000b, + 0x35f6: 0x000b, 0x35f7: 0x000b, 0x35f8: 0x000b, 0x35f9: 0x000b, 0x35fa: 0x000b, 0x35fb: 0x000b, + 0x35fc: 0x000b, 0x35fd: 0x000b, 0x35fe: 0x000b, 0x35ff: 0x000b, + // Block 0xd8, offset 0x3600 + 0x3600: 0x000c, 0x3601: 0x000c, 0x3602: 0x000c, 0x3603: 0x000c, 0x3604: 0x000c, 0x3605: 0x000c, + 0x3606: 0x000c, 0x3607: 0x000c, 0x3608: 0x000c, 0x3609: 0x000c, 0x360a: 0x000c, 0x360b: 0x000c, + 0x360c: 0x000c, 0x360d: 0x000c, 0x360e: 0x000c, 0x360f: 0x000c, 0x3610: 0x000c, 0x3611: 0x000c, + 0x3612: 0x000c, 0x3613: 0x000c, 0x3614: 0x000c, 0x3615: 0x000c, 0x3616: 0x000c, 0x3617: 0x000c, + 0x3618: 0x000c, 0x3619: 0x000c, 0x361a: 0x000c, 0x361b: 0x000c, 0x361c: 0x000c, 0x361d: 0x000c, + 0x361e: 0x000c, 0x361f: 0x000c, 0x3620: 0x000c, 0x3621: 0x000c, 0x3622: 0x000c, 0x3623: 0x000c, + 0x3624: 0x000c, 0x3625: 0x000c, 0x3626: 0x000c, 0x3627: 0x000c, 0x3628: 0x000c, 0x3629: 0x000c, + 0x362a: 0x000c, 0x362b: 0x000c, 0x362c: 0x000c, 0x362d: 0x000c, 0x362e: 0x000c, 0x362f: 0x000c, + 0x3630: 0x000b, 0x3631: 0x000b, 0x3632: 0x000b, 0x3633: 0x000b, 0x3634: 0x000b, 0x3635: 0x000b, + 0x3636: 0x000b, 0x3637: 0x000b, 0x3638: 0x000b, 0x3639: 0x000b, 0x363a: 0x000b, 0x363b: 0x000b, + 0x363c: 0x000b, 0x363d: 0x000b, 0x363e: 0x000b, 0x363f: 0x000b, +} + +// bidiIndex: 24 blocks, 1536 entries, 1536 bytes +// Block 0 is the zero block. +var bidiIndex = [1536]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x02, + 0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08, + 0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b, + 0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, + 0xea: 0x07, 0xef: 0x08, + 0xf0: 0x11, 0xf1: 0x12, 0xf2: 0x12, 0xf3: 0x14, 0xf4: 0x15, + // Block 0x4, offset 0x100 + 0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b, + 0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22, + 0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x137: 0x28, + 0x138: 0x29, 0x139: 0x2a, 0x13a: 0x2b, 0x13b: 0x2c, 0x13c: 0x2d, 0x13d: 0x2e, 0x13e: 0x2f, 0x13f: 0x30, + // Block 0x5, offset 0x140 + 0x140: 0x31, 0x141: 0x32, 0x142: 0x33, + 0x14d: 0x34, 0x14e: 0x35, + 0x150: 0x36, + 0x15a: 0x37, 0x15c: 0x38, 0x15d: 0x39, 0x15e: 0x3a, 0x15f: 0x3b, + 0x160: 0x3c, 0x162: 0x3d, 0x164: 0x3e, 0x165: 0x3f, 0x167: 0x40, + 0x168: 0x41, 0x169: 0x42, 0x16a: 0x43, 0x16c: 0x44, 0x16d: 0x45, 0x16e: 0x46, 0x16f: 0x47, + 0x170: 0x48, 0x173: 0x49, 0x177: 0x4a, + 0x17e: 0x4b, 0x17f: 0x4c, + // Block 0x6, offset 0x180 + 0x180: 0x4d, 0x181: 0x4e, 0x182: 0x4f, 0x183: 0x50, 0x184: 0x51, 0x185: 0x52, 0x186: 0x53, 0x187: 0x54, + 0x188: 0x55, 0x189: 0x54, 0x18a: 0x54, 0x18b: 0x54, 0x18c: 0x56, 0x18d: 0x57, 0x18e: 0x58, 0x18f: 0x59, + 0x190: 0x5a, 0x191: 0x5b, 0x192: 0x5c, 0x193: 0x5d, 0x194: 0x54, 0x195: 0x54, 0x196: 0x54, 0x197: 0x54, + 0x198: 0x54, 0x199: 0x54, 0x19a: 0x5e, 0x19b: 0x54, 0x19c: 0x54, 0x19d: 0x5f, 0x19e: 0x54, 0x19f: 0x60, + 0x1a4: 0x54, 0x1a5: 0x54, 0x1a6: 0x61, 0x1a7: 0x62, + 0x1a8: 0x54, 0x1a9: 0x54, 0x1aa: 0x54, 0x1ab: 0x54, 0x1ac: 0x54, 0x1ad: 0x63, 0x1ae: 0x64, 0x1af: 0x65, + 0x1b3: 0x66, 0x1b5: 0x67, 0x1b7: 0x68, + 0x1b8: 0x69, 0x1b9: 0x6a, 0x1ba: 0x6b, 0x1bb: 0x6c, 0x1bc: 0x54, 0x1bd: 0x54, 0x1be: 0x54, 0x1bf: 0x6d, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x6e, 0x1c2: 0x6f, 0x1c3: 0x70, 0x1c7: 0x71, + 0x1c8: 0x72, 0x1c9: 0x73, 0x1ca: 0x74, 0x1cb: 0x75, 0x1cd: 0x76, 0x1cf: 0x77, + // Block 0x8, offset 0x200 + 0x237: 0x54, + // Block 0x9, offset 0x240 + 0x252: 0x78, 0x253: 0x79, + 0x258: 0x7a, 0x259: 0x7b, 0x25a: 0x7c, 0x25b: 0x7d, 0x25c: 0x7e, 0x25e: 0x7f, + 0x260: 0x80, 0x261: 0x81, 0x263: 0x82, 0x264: 0x83, 0x265: 0x84, 0x266: 0x85, 0x267: 0x86, + 0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26f: 0x8b, + // Block 0xa, offset 0x280 + 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x0e, 0x2af: 0x0e, + 0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8e, 0x2b5: 0x0e, 0x2b6: 0x0e, 0x2b7: 0x8f, + 0x2b8: 0x90, 0x2b9: 0x91, 0x2ba: 0x0e, 0x2bb: 0x92, 0x2bc: 0x93, 0x2bd: 0x94, 0x2bf: 0x95, + // Block 0xb, offset 0x2c0 + 0x2c4: 0x96, 0x2c5: 0x54, 0x2c6: 0x97, 0x2c7: 0x98, + 0x2cb: 0x99, 0x2cd: 0x9a, + 0x2e0: 0x9b, 0x2e1: 0x9b, 0x2e2: 0x9b, 0x2e3: 0x9b, 0x2e4: 0x9c, 0x2e5: 0x9b, 0x2e6: 0x9b, 0x2e7: 0x9b, + 0x2e8: 0x9d, 0x2e9: 0x9b, 0x2ea: 0x9b, 0x2eb: 0x9e, 0x2ec: 0x9f, 0x2ed: 0x9b, 0x2ee: 0x9b, 0x2ef: 0x9b, + 0x2f0: 0x9b, 0x2f1: 0x9b, 0x2f2: 0x9b, 0x2f3: 0x9b, 0x2f4: 0x9b, 0x2f5: 0x9b, 0x2f6: 0x9b, 0x2f7: 0x9b, + 0x2f8: 0x9b, 0x2f9: 0xa0, 0x2fa: 0x9b, 0x2fb: 0x9b, 0x2fc: 0x9b, 0x2fd: 0x9b, 0x2fe: 0x9b, 0x2ff: 0x9b, + // Block 0xc, offset 0x300 + 0x300: 0xa1, 0x301: 0xa2, 0x302: 0xa3, 0x304: 0xa4, 0x305: 0xa5, 0x306: 0xa6, 0x307: 0xa7, + 0x308: 0xa8, 0x30b: 0xa9, 0x30c: 0xaa, 0x30d: 0xab, + 0x312: 0xac, 0x313: 0xad, 0x316: 0xae, 0x317: 0xaf, + 0x318: 0xb0, 0x319: 0xb1, 0x31a: 0xb2, 0x31c: 0xb3, + // Block 0xd, offset 0x340 + 0x36b: 0xb4, 0x36c: 0xb5, + 0x37e: 0xb6, + // Block 0xe, offset 0x380 + 0x3b2: 0xb7, + // Block 0xf, offset 0x3c0 + 0x3c5: 0xb8, 0x3c6: 0xb9, + 0x3c8: 0x54, 0x3c9: 0xba, 0x3cc: 0x54, 0x3cd: 0xbb, + 0x3db: 0xbc, 0x3dc: 0xbd, 0x3dd: 0xbe, 0x3de: 0xbf, 0x3df: 0xc0, + 0x3e8: 0xc1, 0x3e9: 0xc2, 0x3ea: 0xc3, + // Block 0x10, offset 0x400 + 0x420: 0x9b, 0x421: 0x9b, 0x422: 0x9b, 0x423: 0xc4, 0x424: 0x9b, 0x425: 0x9b, 0x426: 0x9b, 0x427: 0x9b, + 0x428: 0x9b, 0x429: 0x9b, 0x42a: 0x9b, 0x42b: 0x9b, 0x42c: 0x9b, 0x42d: 0x9b, 0x42e: 0x9b, 0x42f: 0x9b, + 0x430: 0x9b, 0x431: 0x9b, 0x432: 0x9b, 0x433: 0x9b, 0x434: 0x9b, 0x435: 0x9b, 0x436: 0x9b, 0x437: 0x9b, + 0x438: 0x0e, 0x439: 0x0e, 0x43a: 0x0e, 0x43b: 0xc5, 0x43c: 0x9b, 0x43d: 0x9b, 0x43e: 0x9b, 0x43f: 0x9b, + // Block 0x11, offset 0x440 + 0x440: 0xc6, 0x441: 0x54, 0x442: 0xc7, 0x443: 0xc8, 0x444: 0xc9, 0x445: 0xca, + 0x44c: 0x54, 0x44d: 0x54, 0x44e: 0x54, 0x44f: 0x54, + 0x450: 0x54, 0x451: 0x54, 0x452: 0x54, 0x453: 0x54, 0x454: 0x54, 0x455: 0xcb, 0x456: 0xcc, 0x457: 0x54, + 0x458: 0x54, 0x459: 0x54, 0x45a: 0x54, 0x45b: 0xcd, 0x45c: 0x54, 0x45d: 0x6c, 0x45e: 0x54, 0x45f: 0xce, + 0x460: 0xcf, 0x461: 0xd0, 0x462: 0xd1, 0x464: 0xd2, 0x466: 0xd3, 0x467: 0x36, + 0x47f: 0xd4, + // Block 0x12, offset 0x480 + 0x4bf: 0xd4, + // Block 0x13, offset 0x4c0 + 0x4d0: 0x09, 0x4d1: 0x0a, 0x4d6: 0x0b, + 0x4db: 0x0c, 0x4dd: 0x0d, 0x4de: 0x0e, 0x4df: 0x0f, + 0x4ef: 0x10, + 0x4ff: 0x10, + // Block 0x14, offset 0x500 + 0x50f: 0x10, + 0x51f: 0x10, + 0x52f: 0x10, + 0x53f: 0x10, + // Block 0x15, offset 0x540 + 0x540: 0xd5, 0x541: 0xd5, 0x542: 0xd5, 0x543: 0xd5, 0x544: 0x05, 0x545: 0x05, 0x546: 0x05, 0x547: 0xd6, + 0x548: 0xd5, 0x549: 0xd5, 0x54a: 0xd5, 0x54b: 0xd5, 0x54c: 0xd5, 0x54d: 0xd5, 0x54e: 0xd5, 0x54f: 0xd5, + 0x550: 0xd5, 0x551: 0xd5, 0x552: 0xd5, 0x553: 0xd5, 0x554: 0xd5, 0x555: 0xd5, 0x556: 0xd5, 0x557: 0xd5, + 0x558: 0xd5, 0x559: 0xd5, 0x55a: 0xd5, 0x55b: 0xd5, 0x55c: 0xd5, 0x55d: 0xd5, 0x55e: 0xd5, 0x55f: 0xd5, + 0x560: 0xd5, 0x561: 0xd5, 0x562: 0xd5, 0x563: 0xd5, 0x564: 0xd5, 0x565: 0xd5, 0x566: 0xd5, 0x567: 0xd5, + 0x568: 0xd5, 0x569: 0xd5, 0x56a: 0xd5, 0x56b: 0xd5, 0x56c: 0xd5, 0x56d: 0xd5, 0x56e: 0xd5, 0x56f: 0xd5, + 0x570: 0xd5, 0x571: 0xd5, 0x572: 0xd5, 0x573: 0xd5, 0x574: 0xd5, 0x575: 0xd5, 0x576: 0xd5, 0x577: 0xd5, + 0x578: 0xd5, 0x579: 0xd5, 0x57a: 0xd5, 0x57b: 0xd5, 0x57c: 0xd5, 0x57d: 0xd5, 0x57e: 0xd5, 0x57f: 0xd5, + // Block 0x16, offset 0x580 + 0x58f: 0x10, + 0x59f: 0x10, + 0x5a0: 0x13, + 0x5af: 0x10, + 0x5bf: 0x10, + // Block 0x17, offset 0x5c0 + 0x5cf: 0x10, +} + +// Total table size 15480 bytes (15KiB); checksum: F50EF68C diff --git a/vendor/golang.org/x/text/unicode/bidi/tables_test.go b/vendor/golang.org/x/text/unicode/bidi/tables_test.go new file mode 100644 index 0000000000..4a7cd967c5 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/tables_test.go @@ -0,0 +1,77 @@ +// 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 bidi + +import ( + "testing" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/testtext" + "golang.org/x/text/internal/ucd" +) + +var labels = []string{ + _AL: "AL", + _AN: "AN", + _B: "B", + _BN: "BN", + _CS: "CS", + _EN: "EN", + _ES: "ES", + _ET: "ET", + _L: "L", + _NSM: "NSM", + _ON: "ON", + _R: "R", + _S: "S", + _WS: "WS", + + _LRO: "LRO", + _RLO: "RLO", + _LRE: "LRE", + _RLE: "RLE", + _PDF: "PDF", + _LRI: "LRI", + _RLI: "RLI", + _FSI: "FSI", + _PDI: "PDI", +} + +func TestTables(t *testing.T) { + testtext.SkipIfNotLong(t) + + trie := newBidiTrie(0) + + ucd.Parse(gen.OpenUCDFile("BidiBrackets.txt"), func(p *ucd.Parser) { + r1 := p.Rune(0) + want := p.Rune(1) + + e, _ := trie.lookupString(string(r1)) + if got := entry(e).reverseBracket(r1); got != want { + t.Errorf("Reverse(%U) = %U; want %U", r1, got, want) + } + }) + + done := map[rune]bool{} + test := func(name string, r rune, want string) { + e, _ := trie.lookupString(string(r)) + if got := labels[entry(e).class(r)]; got != want { + t.Errorf("%s:%U: got %s; want %s", name, r, got, want) + } + done[r] = true + } + + // Insert the derived BiDi properties. + ucd.Parse(gen.OpenUCDFile("extracted/DerivedBidiClass.txt"), func(p *ucd.Parser) { + r := p.Rune(0) + test("derived", r, p.String(1)) + }) + visitDefaults(func(r rune, c class) { + if !done[r] { + test("default", r, labels[c]) + } + }) + +} diff --git a/vendor/golang.org/x/text/unicode/bidi/trieval.go b/vendor/golang.org/x/text/unicode/bidi/trieval.go new file mode 100644 index 0000000000..ae0075ed0c --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/trieval.go @@ -0,0 +1,69 @@ +// This file was generated by go generate; DO NOT EDIT + +package bidi + +type class int + +const ( + _L class = iota // LeftToRight + _R // RightToLeft + _EN // EuropeanNumber + _ES // EuropeanSeparator + _ET // EuropeanTerminator + _AN // ArabicNumber + _CS // CommonSeparator + _B // ParagraphSeparator + _S // SegmentSeparator + _WS // WhiteSpace + _ON // OtherNeutral + _BN // BoundaryNeutral + _NSM // NonspacingMark + _AL // ArabicLetter + classControl // Control LRO - PDI + + numClass + + _LRO // LeftToRightOverride + _RLO // RightToLeftOverride + _LRE // LeftToRightEmbedding + _RLE // RightToLeftEmbedding + _PDF // PopDirectionalFormat + _LRI // LeftToRightIsolate + _RLI // RightToLeftIsolate + _FSI // FirstStrongIsolate + _PDI // PopDirectionalIsolate +) + +var controlToClass = map[rune]class{ + 0x202D: _LRO, // LeftToRightOverride, + 0x202E: _RLO, // RightToLeftOverride, + 0x202A: _LRE, // LeftToRightEmbedding, + 0x202B: _RLE, // RightToLeftEmbedding, + 0x202C: _PDF, // PopDirectionalFormat, + 0x2066: _LRI, // LeftToRightIsolate, + 0x2067: _RLI, // RightToLeftIsolate, + 0x2068: _FSI, // FirstStrongIsolate, + 0x2069: _PDI, // PopDirectionalIsolate, +} + +// A trie entry has the following bits: +// 7..5 XOR mask for brackets +// 4 1: Bracket open, 0: Bracket close +// 3..0 class type +type entry uint8 + +const ( + openMask = 0x10 + xorMaskShift = 5 +) + +func (e entry) isBracket() bool { return e&0xF0 != 0 } +func (e entry) isOpen() bool { return e&openMask != 0 } +func (e entry) reverseBracket(r rune) rune { return xorMasks[e>>xorMaskShift] ^ r } +func (e entry) class(r rune) class { + c := class(e & 0x0F) + if c == classControl { + return controlToClass[r] + } + return c +} diff --git a/vendor/golang.org/x/text/unicode/cldr/base.go b/vendor/golang.org/x/text/unicode/cldr/base.go new file mode 100644 index 0000000000..21821791ec --- /dev/null +++ b/vendor/golang.org/x/text/unicode/cldr/base.go @@ -0,0 +1,110 @@ +// Copyright 2013 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 cldr provides a parser for LDML and related XML formats. +// This package is inteded to be used by the table generation tools +// for the various internationalization-related packages. +// As the XML types are generated from the CLDR DTD, and as the CLDR standard +// is periodically amended, this package may change considerably over time. +// This mostly means that data may appear and disappear between versions. +// That is, old code should keep compiling for newer versions, but data +// may have moved or changed. +// CLDR version 22 is the first version supported by this package. +// Older versions may not work. +package cldr + +import ( + "encoding/xml" + "regexp" + "strconv" +) + +// Elem is implemented by every XML element. +type Elem interface { + setEnclosing(Elem) + setName(string) + enclosing() Elem + + GetCommon() *Common +} + +type hidden struct { + CharData string `xml:",chardata"` + Alias *struct { + Common + Source string `xml:"source,attr"` + Path string `xml:"path,attr"` + } `xml:"alias"` + Def *struct { + Common + Choice string `xml:"choice,attr,omitempty"` + Type string `xml:"type,attr,omitempty"` + } `xml:"default"` +} + +// Common holds several of the most common attributes and sub elements +// of an XML element. +type Common struct { + XMLName xml.Name + name string + enclElem Elem + Type string `xml:"type,attr,omitempty"` + Reference string `xml:"reference,attr,omitempty"` + Alt string `xml:"alt,attr,omitempty"` + ValidSubLocales string `xml:"validSubLocales,attr,omitempty"` + Draft string `xml:"draft,attr,omitempty"` + hidden +} + +// Default returns the default type to select from the enclosed list +// or "" if no default value is specified. +func (e *Common) Default() string { + if e.Def == nil { + return "" + } + if e.Def.Choice != "" { + return e.Def.Choice + } else if e.Def.Type != "" { + // Type is still used by the default element in collation. + return e.Def.Type + } + return "" +} + +// GetCommon returns e. It is provided such that Common implements Elem. +func (e *Common) GetCommon() *Common { + return e +} + +// Data returns the character data accumulated for this element. +func (e *Common) Data() string { + e.CharData = charRe.ReplaceAllStringFunc(e.CharData, replaceUnicode) + return e.CharData +} + +func (e *Common) setName(s string) { + e.name = s +} + +func (e *Common) enclosing() Elem { + return e.enclElem +} + +func (e *Common) setEnclosing(en Elem) { + e.enclElem = en +} + +// Escape characters that can be escaped without further escaping the string. +var charRe = regexp.MustCompile(`&#x[0-9a-fA-F]*;|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|\\x[0-9a-fA-F]{2}|\\[0-7]{3}|\\[abtnvfr]`) + +// replaceUnicode converts hexadecimal Unicode codepoint notations to a one-rune string. +// It assumes the input string is correctly formatted. +func replaceUnicode(s string) string { + if s[1] == '#' { + r, _ := strconv.ParseInt(s[3:len(s)-1], 16, 32) + return string(r) + } + r, _, _, _ := strconv.UnquoteChar(s, 0) + return string(r) +} diff --git a/vendor/golang.org/x/text/unicode/cldr/cldr.go b/vendor/golang.org/x/text/unicode/cldr/cldr.go new file mode 100644 index 0000000000..ea3fe139ef --- /dev/null +++ b/vendor/golang.org/x/text/unicode/cldr/cldr.go @@ -0,0 +1,130 @@ +// Copyright 2013 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. + +//go:generate go run makexml.go -output xml.go + +// Package cldr provides a parser for LDML and related XML formats. +// This package is inteded to be used by the table generation tools +// for the various internationalization-related packages. +// As the XML types are generated from the CLDR DTD, and as the CLDR standard +// is periodically amended, this package may change considerably over time. +// This mostly means that data may appear and disappear between versions. +// That is, old code should keep compiling for newer versions, but data +// may have moved or changed. +// CLDR version 22 is the first version supported by this package. +// Older versions may not work. +package cldr // import "golang.org/x/text/unicode/cldr" + +import ( + "fmt" + "sort" +) + +// CLDR provides access to parsed data of the Unicode Common Locale Data Repository. +type CLDR struct { + parent map[string][]string + locale map[string]*LDML + resolved map[string]*LDML + bcp47 *LDMLBCP47 + supp *SupplementalData +} + +func makeCLDR() *CLDR { + return &CLDR{ + parent: make(map[string][]string), + locale: make(map[string]*LDML), + resolved: make(map[string]*LDML), + bcp47: &LDMLBCP47{}, + supp: &SupplementalData{}, + } +} + +// BCP47 returns the parsed BCP47 LDML data. If no such data was parsed, nil is returned. +func (cldr *CLDR) BCP47() *LDMLBCP47 { + return nil +} + +// Draft indicates the draft level of an element. +type Draft int + +const ( + Approved Draft = iota + Contributed + Provisional + Unconfirmed +) + +var drafts = []string{"unconfirmed", "provisional", "contributed", "approved", ""} + +// ParseDraft returns the Draft value corresponding to the given string. The +// empty string corresponds to Approved. +func ParseDraft(level string) (Draft, error) { + if level == "" { + return Approved, nil + } + for i, s := range drafts { + if level == s { + return Unconfirmed - Draft(i), nil + } + } + return Approved, fmt.Errorf("cldr: unknown draft level %q", level) +} + +func (d Draft) String() string { + return drafts[len(drafts)-1-int(d)] +} + +// SetDraftLevel sets which draft levels to include in the evaluated LDML. +// Any draft element for which the draft level is higher than lev will be excluded. +// If multiple draft levels are available for a single element, the one with the +// lowest draft level will be selected, unless preferDraft is true, in which case +// the highest draft will be chosen. +// It is assumed that the underlying LDML is canonicalized. +func (cldr *CLDR) SetDraftLevel(lev Draft, preferDraft bool) { + // TODO: implement + cldr.resolved = make(map[string]*LDML) +} + +// RawLDML returns the LDML XML for id in unresolved form. +// id must be one of the strings returned by Locales. +func (cldr *CLDR) RawLDML(loc string) *LDML { + return cldr.locale[loc] +} + +// LDML returns the fully resolved LDML XML for loc, which must be one of +// the strings returned by Locales. +func (cldr *CLDR) LDML(loc string) (*LDML, error) { + return cldr.resolve(loc) +} + +// Supplemental returns the parsed supplemental data. If no such data was parsed, +// nil is returned. +func (cldr *CLDR) Supplemental() *SupplementalData { + return cldr.supp +} + +// Locales returns the locales for which there exist files. +// Valid sublocales for which there is no file are not included. +// The root locale is always sorted first. +func (cldr *CLDR) Locales() []string { + loc := []string{"root"} + hasRoot := false + for l, _ := range cldr.locale { + if l == "root" { + hasRoot = true + continue + } + loc = append(loc, l) + } + sort.Strings(loc[1:]) + if !hasRoot { + return loc[1:] + } + return loc +} + +// Get fills in the fields of x based on the XPath path. +func Get(e Elem, path string) (res Elem, err error) { + return walkXPath(e, path) +} diff --git a/vendor/golang.org/x/text/unicode/cldr/cldr_test.go b/vendor/golang.org/x/text/unicode/cldr/cldr_test.go new file mode 100644 index 0000000000..951028d7e1 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/cldr/cldr_test.go @@ -0,0 +1,27 @@ +// 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 cldr + +import "testing" + +func TestParseDraft(t *testing.T) { + tests := []struct { + in string + draft Draft + err bool + }{ + {"unconfirmed", Unconfirmed, false}, + {"provisional", Provisional, false}, + {"contributed", Contributed, false}, + {"approved", Approved, false}, + {"", Approved, false}, + {"foo", Approved, true}, + } + for _, tt := range tests { + if d, err := ParseDraft(tt.in); d != tt.draft || (err != nil) != tt.err { + t.Errorf("%q: was %v, %v; want %v, %v", tt.in, d, err != nil, tt.draft, tt.err) + } + } +} diff --git a/vendor/golang.org/x/text/unicode/cldr/collate.go b/vendor/golang.org/x/text/unicode/cldr/collate.go new file mode 100644 index 0000000000..80ee28d795 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/cldr/collate.go @@ -0,0 +1,359 @@ +// Copyright 2013 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 cldr + +import ( + "bufio" + "encoding/xml" + "errors" + "fmt" + "strconv" + "strings" + "unicode" + "unicode/utf8" +) + +// RuleProcessor can be passed to Collator's Process method, which +// parses the rules and calls the respective method for each rule found. +type RuleProcessor interface { + Reset(anchor string, before int) error + Insert(level int, str, context, extend string) error + Index(id string) +} + +const ( + // cldrIndex is a Unicode-reserved sentinel value used to mark the start + // of a grouping within an index. + // We ignore any rule that starts with this rune. + // See http://unicode.org/reports/tr35/#Collation_Elements for details. + cldrIndex = "\uFDD0" + + // specialAnchor is the format in which to represent logical reset positions, + // such as "first tertiary ignorable". + specialAnchor = "<%s/>" +) + +// Process parses the rules for the tailorings of this collation +// and calls the respective methods of p for each rule found. +func (c Collation) Process(p RuleProcessor) (err error) { + if len(c.Cr) > 0 { + if len(c.Cr) > 1 { + return fmt.Errorf("multiple cr elements, want 0 or 1") + } + return processRules(p, c.Cr[0].Data()) + } + if c.Rules.Any != nil { + return c.processXML(p) + } + return errors.New("no tailoring data") +} + +// processRules parses rules in the Collation Rule Syntax defined in +// http://www.unicode.org/reports/tr35/tr35-collation.html#Collation_Tailorings. +func processRules(p RuleProcessor, s string) (err error) { + chk := func(s string, e error) string { + if err == nil { + err = e + } + return s + } + i := 0 // Save the line number for use after the loop. + scanner := bufio.NewScanner(strings.NewReader(s)) + for ; scanner.Scan() && err == nil; i++ { + for s := skipSpace(scanner.Text()); s != "" && s[0] != '#'; s = skipSpace(s) { + level := 5 + var ch byte + switch ch, s = s[0], s[1:]; ch { + case '&': // followed by <anchor> or '[' <key> ']' + if s = skipSpace(s); consume(&s, '[') { + s = chk(parseSpecialAnchor(p, s)) + } else { + s = chk(parseAnchor(p, 0, s)) + } + case '<': // sort relation '<'{1,4}, optionally followed by '*'. + for level = 1; consume(&s, '<'); level++ { + } + if level > 4 { + err = fmt.Errorf("level %d > 4", level) + } + fallthrough + case '=': // identity relation, optionally followed by *. + if consume(&s, '*') { + s = chk(parseSequence(p, level, s)) + } else { + s = chk(parseOrder(p, level, s)) + } + default: + chk("", fmt.Errorf("illegal operator %q", ch)) + break + } + } + } + if chk("", scanner.Err()); err != nil { + return fmt.Errorf("%d: %v", i, err) + } + return nil +} + +// parseSpecialAnchor parses the anchor syntax which is either of the form +// ['before' <level>] <anchor> +// or +// [<label>] +// The starting should already be consumed. +func parseSpecialAnchor(p RuleProcessor, s string) (tail string, err error) { + i := strings.IndexByte(s, ']') + if i == -1 { + return "", errors.New("unmatched bracket") + } + a := strings.TrimSpace(s[:i]) + s = s[i+1:] + if strings.HasPrefix(a, "before ") { + l, err := strconv.ParseUint(skipSpace(a[len("before "):]), 10, 3) + if err != nil { + return s, err + } + return parseAnchor(p, int(l), s) + } + return s, p.Reset(fmt.Sprintf(specialAnchor, a), 0) +} + +func parseAnchor(p RuleProcessor, level int, s string) (tail string, err error) { + anchor, s, err := scanString(s) + if err != nil { + return s, err + } + return s, p.Reset(anchor, level) +} + +func parseOrder(p RuleProcessor, level int, s string) (tail string, err error) { + var value, context, extend string + if value, s, err = scanString(s); err != nil { + return s, err + } + if strings.HasPrefix(value, cldrIndex) { + p.Index(value[len(cldrIndex):]) + return + } + if consume(&s, '|') { + if context, s, err = scanString(s); err != nil { + return s, errors.New("missing string after context") + } + } + if consume(&s, '/') { + if extend, s, err = scanString(s); err != nil { + return s, errors.New("missing string after extension") + } + } + return s, p.Insert(level, value, context, extend) +} + +// scanString scans a single input string. +func scanString(s string) (str, tail string, err error) { + if s = skipSpace(s); s == "" { + return s, s, errors.New("missing string") + } + buf := [16]byte{} // small but enough to hold most cases. + value := buf[:0] + for s != "" { + if consume(&s, '\'') { + i := strings.IndexByte(s, '\'') + if i == -1 { + return "", "", errors.New(`unmatched single quote`) + } + if i == 0 { + value = append(value, '\'') + } else { + value = append(value, s[:i]...) + } + s = s[i+1:] + continue + } + r, sz := utf8.DecodeRuneInString(s) + if unicode.IsSpace(r) || strings.ContainsRune("&<=#", r) { + break + } + value = append(value, s[:sz]...) + s = s[sz:] + } + return string(value), skipSpace(s), nil +} + +func parseSequence(p RuleProcessor, level int, s string) (tail string, err error) { + if s = skipSpace(s); s == "" { + return s, errors.New("empty sequence") + } + last := rune(0) + for s != "" { + r, sz := utf8.DecodeRuneInString(s) + s = s[sz:] + + if r == '-' { + // We have a range. The first element was already written. + if last == 0 { + return s, errors.New("range without starter value") + } + r, sz = utf8.DecodeRuneInString(s) + s = s[sz:] + if r == utf8.RuneError || r < last { + return s, fmt.Errorf("invalid range %q-%q", last, r) + } + for i := last + 1; i <= r; i++ { + if err := p.Insert(level, string(i), "", ""); err != nil { + return s, err + } + } + last = 0 + continue + } + + if unicode.IsSpace(r) || unicode.IsPunct(r) { + break + } + + // normal case + if err := p.Insert(level, string(r), "", ""); err != nil { + return s, err + } + last = r + } + return s, nil +} + +func skipSpace(s string) string { + return strings.TrimLeftFunc(s, unicode.IsSpace) +} + +// consumes returns whether the next byte is ch. If so, it gobbles it by +// updating s. +func consume(s *string, ch byte) (ok bool) { + if *s == "" || (*s)[0] != ch { + return false + } + *s = (*s)[1:] + return true +} + +// The following code parses Collation rules of CLDR version 24 and before. + +var lmap = map[byte]int{ + 'p': 1, + 's': 2, + 't': 3, + 'i': 5, +} + +type rulesElem struct { + Rules struct { + Common + Any []*struct { + XMLName xml.Name + rule + } `xml:",any"` + } `xml:"rules"` +} + +type rule struct { + Value string `xml:",chardata"` + Before string `xml:"before,attr"` + Any []*struct { + XMLName xml.Name + rule + } `xml:",any"` +} + +var emptyValueError = errors.New("cldr: empty rule value") + +func (r *rule) value() (string, error) { + // Convert hexadecimal Unicode codepoint notation to a string. + s := charRe.ReplaceAllStringFunc(r.Value, replaceUnicode) + r.Value = s + if s == "" { + if len(r.Any) != 1 { + return "", emptyValueError + } + r.Value = fmt.Sprintf(specialAnchor, r.Any[0].XMLName.Local) + r.Any = nil + } else if len(r.Any) != 0 { + return "", fmt.Errorf("cldr: XML elements found in collation rule: %v", r.Any) + } + return r.Value, nil +} + +func (r rule) process(p RuleProcessor, name, context, extend string) error { + v, err := r.value() + if err != nil { + return err + } + switch name { + case "p", "s", "t", "i": + if strings.HasPrefix(v, cldrIndex) { + p.Index(v[len(cldrIndex):]) + return nil + } + if err := p.Insert(lmap[name[0]], v, context, extend); err != nil { + return err + } + case "pc", "sc", "tc", "ic": + level := lmap[name[0]] + for _, s := range v { + if err := p.Insert(level, string(s), context, extend); err != nil { + return err + } + } + default: + return fmt.Errorf("cldr: unsupported tag: %q", name) + } + return nil +} + +// processXML parses the format of CLDR versions 24 and older. +func (c Collation) processXML(p RuleProcessor) (err error) { + // Collation is generated and defined in xml.go. + var v string + for _, r := range c.Rules.Any { + switch r.XMLName.Local { + case "reset": + level := 0 + switch r.Before { + case "primary", "1": + level = 1 + case "secondary", "2": + level = 2 + case "tertiary", "3": + level = 3 + case "": + default: + return fmt.Errorf("cldr: unknown level %q", r.Before) + } + v, err = r.value() + if err == nil { + err = p.Reset(v, level) + } + case "x": + var context, extend string + for _, r1 := range r.Any { + v, err = r1.value() + switch r1.XMLName.Local { + case "context": + context = v + case "extend": + extend = v + } + } + for _, r1 := range r.Any { + if t := r1.XMLName.Local; t == "context" || t == "extend" { + continue + } + r1.rule.process(p, r1.XMLName.Local, context, extend) + } + default: + err = r.rule.process(p, r.XMLName.Local, "", "") + } + if err != nil { + return err + } + } + return nil +} diff --git a/vendor/golang.org/x/text/unicode/cldr/collate_test.go b/vendor/golang.org/x/text/unicode/cldr/collate_test.go new file mode 100644 index 0000000000..f6721639a3 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/cldr/collate_test.go @@ -0,0 +1,275 @@ +// 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 cldr + +import ( + "fmt" + "strings" + "testing" +) + +// A recorder implements the RuleProcessor interface, whereby its methods +// simply record the invocations. +type recorder struct { + calls []string +} + +func (r *recorder) Reset(anchor string, before int) error { + if before > 5 { + return fmt.Errorf("before %d > 5", before) + } + r.calls = append(r.calls, fmt.Sprintf("R:%s-%d", anchor, before)) + return nil +} + +func (r *recorder) Insert(level int, str, context, extend string) error { + s := fmt.Sprintf("O:%d:%s", level, str) + if context != "" { + s += "|" + context + } + if extend != "" { + s += "/" + extend + } + r.calls = append(r.calls, s) + return nil +} + +func (r *recorder) Index(id string) { + r.calls = append(r.calls, fmt.Sprintf("I:%s", id)) +} + +func (r *recorder) Error(err error) { + r.calls = append(r.calls, fmt.Sprintf("E:%v", err)) +} + +func TestRuleProcessor(t *testing.T) { + for _, tt := range []struct { + desc string + in string + out string + }{ + {desc: "empty"}, + {desc: "whitespace and comments only", + in: ` + + + # adsfads +# adfadf + `, + }, + { + desc: "reset anchor", + in: ` + & a + &b # + & [ before 3 ] c + & [before 4] d & ee + & [first tertiary ignorable] + &'g' + & 'h''h'h'h' + &'\u0069' # LATIN SMALL LETTER I + `, + out: ` + R:a-0 + R:b-0 + R:c-3 + R:d-4 + R:ee-0 + R:<first tertiary ignorable/>-0 + R:g-0 + R:hhhh-0 + R:i-0 + `, + }, + { + desc: "ordering", + in: ` + & 0 + < 1 <<''2# +<<< 3'3''33'3# + <<<<4 + = 5 << 6 | s + <<<< 7 / z + << 8'' | s / ch + `, + out: ` + R:0-0 + O:1:1 + O:2:'2 + O:3:33333 + O:4:4 + O:5:5 + O:2:6|s + O:4:7/z + O:2:8'|s/ch + `, + }, + { + desc: "index", + in: "< '\ufdd0'A", + out: "I:A", + }, + { + desc: "sequence", + in: ` + & 0 + <<* 1234 + <* a-cde-f + =* q-q + `, + out: ` + R:0-0 + O:2:1 + O:2:2 + O:2:3 + O:2:4 + O:1:a + O:1:b + O:1:c + O:1:d + O:1:e + O:1:f + O:5:q + `, + }, + { + desc: "compact", + in: "&B<t<<<T<s<<<S<e<<<E", + out: ` + R:B-0 + O:1:t + O:3:T + O:1:s + O:3:S + O:1:e + O:3:E + `, + }, + { + desc: "err operator", + in: "a", + out: "E:1: illegal operator 'a'", + }, + { + desc: "err line number", + in: `& a + << b + a`, + out: ` + R:a-0 + O:2:b + E:3: illegal operator 'a'`, + }, + { + desc: "err empty anchor", + in: " & ", + out: "E:1: missing string", + }, + { + desc: "err anchor invalid special 1", + in: " & [ foo ", + out: "E:1: unmatched bracket", + }, + { + desc: "err anchor invalid special 2", + in: "&[", + out: "E:1: unmatched bracket", + }, + { + desc: "err anchor invalid before 1", + in: "&[before a]", + out: `E:1: strconv.ParseUint: parsing "a": invalid syntax`, + }, + { + desc: "err anchor invalid before 2", + in: "&[before 12]", + out: `E:1: strconv.ParseUint: parsing "12": value out of range`, + }, + { + desc: "err anchor invalid before 3", + in: "&[before 2]", + out: "E:1: missing string", + }, + { + desc: "err anchor invalid before 4", + in: "&[before 6] a", + out: "E:1: before 6 > 5", + }, + { + desc: "err empty order", + in: " < ", + out: "E:1: missing string", + }, + { + desc: "err empty identity", + in: " = ", + out: "E:1: missing string", + }, + { + desc: "err empty context", + in: " < a | ", + out: "E:1: missing string after context", + }, + { + desc: "err empty extend", + in: " < a / ", + out: "E:1: missing string after extension", + }, + { + desc: "err empty sequence", + in: " <* ", + out: "E:1: empty sequence", + }, + { + desc: "err sequence 1", + in: " <* -a", + out: "E:1: range without starter value", + }, + { + desc: "err sequence 3", + in: " <* a-a-b", + out: `O:1:a + E:1: range without starter value + `, + }, + { + desc: "err sequence 3", + in: " <* b-a", + out: `O:1:b + E:1: invalid range 'b'-'a' + `, + }, + { + desc: "err unmatched quote", + in: " < 'b", + out: ` E:1: unmatched single quote + `, + }, + } { + rec := &recorder{} + err := Collation{ + Cr: []*Common{ + {hidden: hidden{CharData: tt.in}}, + }, + }.Process(rec) + if err != nil { + rec.Error(err) + } + got := rec.calls + want := strings.Split(strings.TrimSpace(tt.out), "\n") + if tt.out == "" { + want = nil + } + if len(got) != len(want) { + t.Errorf("%s: nResults: got %d; want %d", tt.desc, len(got), len(want)) + continue + } + for i, g := range got { + if want := strings.TrimSpace(want[i]); g != want { + t.Errorf("%s:%d: got %q; want %q", tt.desc, i, g, want) + } + } + } +} diff --git a/vendor/golang.org/x/text/unicode/cldr/data_test.go b/vendor/golang.org/x/text/unicode/cldr/data_test.go new file mode 100644 index 0000000000..1662189627 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/cldr/data_test.go @@ -0,0 +1,186 @@ +// Copyright 2013 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 cldr + +// This file contains test data. + +import ( + "io" + "strings" +) + +type testLoader struct { +} + +func (t testLoader) Len() int { + return len(testFiles) +} + +func (t testLoader) Path(i int) string { + return testPaths[i] +} + +func (t testLoader) Reader(i int) (io.ReadCloser, error) { + return &reader{*strings.NewReader(testFiles[i])}, nil +} + +// reader adds a dummy Close method to strings.Reader so that it +// satisfies the io.ReadCloser interface. +type reader struct { + strings.Reader +} + +func (r reader) Close() error { + return nil +} + +var ( + testFiles = []string{de_xml, gsw_xml, root_xml} + testPaths = []string{ + "common/main/de.xml", + "common/main/gsw.xml", + "common/main/root.xml", + } +) + +var root_xml = `<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE ldml SYSTEM "../../common/dtd/ldml.dtd"> +<ldml> + <identity> + <language type="root"/> + <generation date="now"/> + </identity> + <characters> + <exemplarCharacters>[]</exemplarCharacters> + <exemplarCharacters type="auxiliary">[]</exemplarCharacters> + <exemplarCharacters type="punctuation">[\- ‐ – — … ' ‘ ‚ " “ „ \& #]</exemplarCharacters> + <ellipsis type="final">{0}…</ellipsis> + <ellipsis type="initial">…{0}</ellipsis> + <moreInformation>?</moreInformation> + </characters> + <dates> + <calendars> + <default choice="gregorian"/> + <calendar type="buddhist"> + <months> + <alias source="locale" path="../../calendar[@type='gregorian']/months"/> + </months> + </calendar> + <calendar type="chinese"> + <months> + <alias source="locale" path="../../calendar[@type='gregorian']/months"/> + </months> + </calendar> + <calendar type="gregorian"> + <months> + <default choice="format"/> + <monthContext type="format"> + <default choice="wide"/> + <monthWidth type="narrow"> + <alias source="locale" path="../../monthContext[@type='stand-alone']/monthWidth[@type='narrow']"/> + </monthWidth> + <monthWidth type="wide"> + <month type="1">11</month> + <month type="2">22</month> + <month type="3">33</month> + <month type="4">44</month> + </monthWidth> + </monthContext> + <monthContext type="stand-alone"> + <monthWidth type="narrow"> + <month type="1">1</month> + <month type="2">2</month> + <month type="3">3</month> + <month type="4">4</month> + </monthWidth> + <monthWidth type="wide"> + <alias source="locale" path="../../monthContext[@type='format']/monthWidth[@type='wide']"/> + </monthWidth> + </monthContext> + </months> + </calendar> + </calendars> + </dates> +</ldml> +` + +var de_xml = `<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE ldml SYSTEM "../../common/dtd/ldml.dtd"> +<ldml> + <identity> + <language type="de"/> + </identity> + <characters> + <exemplarCharacters>[a ä b c d e ö p q r s ß t u ü v w x y z]</exemplarCharacters> + <exemplarCharacters type="auxiliary">[á à ă]</exemplarCharacters> + <exemplarCharacters type="index">[A B C D E F G H Z]</exemplarCharacters> + <ellipsis type="final">{0} …</ellipsis> + <ellipsis type="initial">… {0}</ellipsis> + <moreInformation>?</moreInformation> + <stopwords> + <stopwordList type="collation" draft="provisional">der die das</stopwordList> + </stopwords> + </characters> + <dates> + <calendars> + <calendar type="buddhist"> + <months> + <monthContext type="format"> + <monthWidth type="narrow"> + <month type="3">BBB</month> + </monthWidth> + <monthWidth type="wide"> + <month type="3">bbb</month> + </monthWidth> + </monthContext> + </months> + </calendar> + <calendar type="gregorian"> + <months> + <monthContext type="format"> + <monthWidth type="narrow"> + <month type="3">M</month> + <month type="4">A</month> + </monthWidth> + <monthWidth type="wide"> + <month type="3">Maerz</month> + <month type="4">April</month> + <month type="5">Mai</month> + </monthWidth> + </monthContext> + <monthContext type="stand-alone"> + <monthWidth type="narrow"> + <month type="3">m</month> + <month type="5">m</month> + </monthWidth> + <monthWidth type="wide"> + <month type="4">april</month> + <month type="5">mai</month> + </monthWidth> + </monthContext> + </months> + </calendar> + </calendars> + </dates> + <posix> + <messages> + <yesstr>yes:y</yesstr> + <nostr>no:n</nostr> + </messages> + </posix> +</ldml> +` + +var gsw_xml = `<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE ldml SYSTEM "../../common/dtd/ldml.dtd"> +<ldml> + <identity> + <language type="gsw"/> + </identity> + <posix> + <alias source="de" path="//ldml/posix"/> + </posix> +</ldml> +` diff --git a/vendor/golang.org/x/text/unicode/cldr/decode.go b/vendor/golang.org/x/text/unicode/cldr/decode.go new file mode 100644 index 0000000000..e5ee4aed18 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/cldr/decode.go @@ -0,0 +1,171 @@ +// Copyright 2013 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 cldr + +import ( + "archive/zip" + "bytes" + "encoding/xml" + "fmt" + "io" + "io/ioutil" + "log" + "os" + "path/filepath" + "regexp" +) + +// A Decoder loads an archive of CLDR data. +type Decoder struct { + dirFilter []string + sectionFilter []string + loader Loader + cldr *CLDR + curLocale string +} + +// SetSectionFilter takes a list top-level LDML element names to which +// evaluation of LDML should be limited. It automatically calls SetDirFilter. +func (d *Decoder) SetSectionFilter(filter ...string) { + d.sectionFilter = filter + // TODO: automatically set dir filter +} + +// SetDirFilter limits the loading of LDML XML files of the specied directories. +// Note that sections may be split across directories differently for different CLDR versions. +// For more robust code, use SetSectionFilter. +func (d *Decoder) SetDirFilter(dir ...string) { + d.dirFilter = dir +} + +// A Loader provides access to the files of a CLDR archive. +type Loader interface { + Len() int + Path(i int) string + Reader(i int) (io.ReadCloser, error) +} + +var fileRe = regexp.MustCompile(".*/(.*)/(.*)\\.xml") + +// Decode loads and decodes the files represented by l. +func (d *Decoder) Decode(l Loader) (cldr *CLDR, err error) { + d.cldr = makeCLDR() + for i := 0; i < l.Len(); i++ { + fname := l.Path(i) + if m := fileRe.FindStringSubmatch(fname); m != nil { + if len(d.dirFilter) > 0 && !in(d.dirFilter, m[1]) { + continue + } + var r io.Reader + if r, err = l.Reader(i); err == nil { + err = d.decode(m[1], m[2], r) + } + if err != nil { + return nil, err + } + } + } + d.cldr.finalize(d.sectionFilter) + return d.cldr, nil +} + +func (d *Decoder) decode(dir, id string, r io.Reader) error { + var v interface{} + var l *LDML + cldr := d.cldr + switch { + case dir == "supplemental": + v = cldr.supp + case dir == "transforms": + return nil + case dir == "bcp47": + v = cldr.bcp47 + case dir == "validity": + return nil + default: + ok := false + if v, ok = cldr.locale[id]; !ok { + l = &LDML{} + v, cldr.locale[id] = l, l + } + } + x := xml.NewDecoder(r) + if err := x.Decode(v); err != nil { + log.Printf("%s/%s: %v", dir, id, err) + return err + } + if l != nil { + if l.Identity == nil { + return fmt.Errorf("%s/%s: missing identity element", dir, id) + } + // TODO: verify when CLDR bug http://unicode.org/cldr/trac/ticket/8970 + // is resolved. + // path := strings.Split(id, "_") + // if lang := l.Identity.Language.Type; lang != path[0] { + // return fmt.Errorf("%s/%s: language was %s; want %s", dir, id, lang, path[0]) + // } + } + return nil +} + +type pathLoader []string + +func makePathLoader(path string) (pl pathLoader, err error) { + err = filepath.Walk(path, func(path string, _ os.FileInfo, err error) error { + pl = append(pl, path) + return err + }) + return pl, err +} + +func (pl pathLoader) Len() int { + return len(pl) +} + +func (pl pathLoader) Path(i int) string { + return pl[i] +} + +func (pl pathLoader) Reader(i int) (io.ReadCloser, error) { + return os.Open(pl[i]) +} + +// DecodePath loads CLDR data from the given path. +func (d *Decoder) DecodePath(path string) (cldr *CLDR, err error) { + loader, err := makePathLoader(path) + if err != nil { + return nil, err + } + return d.Decode(loader) +} + +type zipLoader struct { + r *zip.Reader +} + +func (zl zipLoader) Len() int { + return len(zl.r.File) +} + +func (zl zipLoader) Path(i int) string { + return zl.r.File[i].Name +} + +func (zl zipLoader) Reader(i int) (io.ReadCloser, error) { + return zl.r.File[i].Open() +} + +// DecodeZip loads CLDR data from the zip archive for which r is the source. +func (d *Decoder) DecodeZip(r io.Reader) (cldr *CLDR, err error) { + buffer, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + archive, err := zip.NewReader(bytes.NewReader(buffer), int64(len(buffer))) + if err != nil { + return nil, err + } + return d.Decode(zipLoader{archive}) +} diff --git a/vendor/golang.org/x/text/unicode/cldr/examples_test.go b/vendor/golang.org/x/text/unicode/cldr/examples_test.go new file mode 100644 index 0000000000..a65e86e6c8 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/cldr/examples_test.go @@ -0,0 +1,21 @@ +package cldr_test + +import ( + "fmt" + + "golang.org/x/text/unicode/cldr" +) + +func ExampleSlice() { + var dr *cldr.CLDR // assume this is initalized + + x, _ := dr.LDML("en") + cs := x.Collations.Collation + // remove all but the default + cldr.MakeSlice(&cs).Filter(func(e cldr.Elem) bool { + return e.GetCommon().Type != x.Collations.Default() + }) + for i, c := range cs { + fmt.Println(i, c.Type) + } +} diff --git a/vendor/golang.org/x/text/unicode/cldr/makexml.go b/vendor/golang.org/x/text/unicode/cldr/makexml.go new file mode 100644 index 0000000000..6114d01cbc --- /dev/null +++ b/vendor/golang.org/x/text/unicode/cldr/makexml.go @@ -0,0 +1,400 @@ +// Copyright 2013 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 + +// This tool generates types for the various XML formats of CLDR. +package main + +import ( + "archive/zip" + "bytes" + "encoding/xml" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "os" + "regexp" + "strings" + + "golang.org/x/text/internal/gen" +) + +var outputFile = flag.String("output", "xml.go", "output file name") + +func main() { + flag.Parse() + + r := gen.OpenCLDRCoreZip() + buffer, err := ioutil.ReadAll(r) + if err != nil { + log.Fatal("Could not read zip file") + } + r.Close() + z, err := zip.NewReader(bytes.NewReader(buffer), int64(len(buffer))) + if err != nil { + log.Fatalf("Could not read zip archive: %v", err) + } + + var buf bytes.Buffer + + version := gen.CLDRVersion() + + for _, dtd := range files { + for _, f := range z.File { + if strings.HasSuffix(f.Name, dtd.file+".dtd") { + r, err := f.Open() + failOnError(err) + + b := makeBuilder(&buf, dtd) + b.parseDTD(r) + b.resolve(b.index[dtd.top[0]]) + b.write() + if b.version != "" && version != b.version { + println(f.Name) + log.Fatalf("main: inconsistent versions: found %s; want %s", b.version, version) + } + break + } + } + } + fmt.Fprintln(&buf, "// Version is the version of CLDR from which the XML definitions are generated.") + fmt.Fprintf(&buf, "const Version = %q\n", version) + + gen.WriteGoFile(*outputFile, "cldr", buf.Bytes()) +} + +func failOnError(err error) { + if err != nil { + log.New(os.Stderr, "", log.Lshortfile).Output(2, err.Error()) + os.Exit(1) + } +} + +// configuration data per DTD type +type dtd struct { + file string // base file name + root string // Go name of the root XML element + top []string // create a different type for this section + + skipElem []string // hard-coded or deprecated elements + skipAttr []string // attributes to exclude + predefined []string // hard-coded elements exist of the form <name>Elem + forceRepeat []string // elements to make slices despite DTD +} + +var files = []dtd{ + { + file: "ldmlBCP47", + root: "LDMLBCP47", + top: []string{"ldmlBCP47"}, + skipElem: []string{ + "cldrVersion", // deprecated, not used + }, + }, + { + file: "ldmlSupplemental", + root: "SupplementalData", + top: []string{"supplementalData"}, + skipElem: []string{ + "cldrVersion", // deprecated, not used + }, + forceRepeat: []string{ + "plurals", // data defined in plurals.xml and ordinals.xml + }, + }, + { + file: "ldml", + root: "LDML", + top: []string{ + "ldml", "collation", "calendar", "timeZoneNames", "localeDisplayNames", "numbers", + }, + skipElem: []string{ + "cp", // not used anywhere + "special", // not used anywhere + "fallback", // deprecated, not used + "alias", // in Common + "default", // in Common + }, + skipAttr: []string{ + "hiraganaQuarternary", // typo in DTD, correct version included as well + }, + predefined: []string{"rules"}, + }, +} + +var comments = map[string]string{ + "ldmlBCP47": ` +// LDMLBCP47 holds information on allowable values for various variables in LDML. +`, + "supplementalData": ` +// SupplementalData holds information relevant for internationalization +// and proper use of CLDR, but that is not contained in the locale hierarchy. +`, + "ldml": ` +// LDML is the top-level type for locale-specific data. +`, + "collation": ` +// Collation contains rules that specify a certain sort-order, +// as a tailoring of the root order. +// The parsed rules are obtained by passing a RuleProcessor to Collation's +// Process method. +`, + "calendar": ` +// Calendar specifies the fields used for formatting and parsing dates and times. +// The month and quarter names are identified numerically, starting at 1. +// The day (of the week) names are identified with short strings, since there is +// no universally-accepted numeric designation. +`, + "dates": ` +// Dates contains information regarding the format and parsing of dates and times. +`, + "localeDisplayNames": ` +// LocaleDisplayNames specifies localized display names for for scripts, languages, +// countries, currencies, and variants. +`, + "numbers": ` +// Numbers supplies information for formatting and parsing numbers and currencies. +`, +} + +type element struct { + name string // XML element name + category string // elements contained by this element + signature string // category + attrKey* + + attr []*attribute // attributes supported by this element. + sub []struct { // parsed and evaluated sub elements of this element. + e *element + repeat bool // true if the element needs to be a slice + } + + resolved bool // prevent multiple resolutions of this element. +} + +type attribute struct { + name string + key string + list []string + + tag string // Go tag +} + +var ( + reHead = regexp.MustCompile(` *(\w+) +([\w\-]+)`) + reAttr = regexp.MustCompile(` *(\w+) *(?:(\w+)|\(([\w\- \|]+)\)) *(?:#([A-Z]*) *(?:\"([\.\d+])\")?)? *("[\w\-:]*")?`) + reElem = regexp.MustCompile(`^ *(EMPTY|ANY|\(.*\)[\*\+\?]?) *$`) + reToken = regexp.MustCompile(`\w\-`) +) + +// builder is used to read in the DTD files from CLDR and generate Go code +// to be used with the encoding/xml package. +type builder struct { + w io.Writer + index map[string]*element + elem []*element + info dtd + version string +} + +func makeBuilder(w io.Writer, d dtd) builder { + return builder{ + w: w, + index: make(map[string]*element), + elem: []*element{}, + info: d, + } +} + +// parseDTD parses a DTD file. +func (b *builder) parseDTD(r io.Reader) { + for d := xml.NewDecoder(r); ; { + t, err := d.Token() + if t == nil { + break + } + failOnError(err) + dir, ok := t.(xml.Directive) + if !ok { + continue + } + m := reHead.FindSubmatch(dir) + dir = dir[len(m[0]):] + ename := string(m[2]) + el, elementFound := b.index[ename] + switch string(m[1]) { + case "ELEMENT": + if elementFound { + log.Fatal("parseDTD: duplicate entry for element %q", ename) + } + m := reElem.FindSubmatch(dir) + if m == nil { + log.Fatalf("parseDTD: invalid element %q", string(dir)) + } + if len(m[0]) != len(dir) { + log.Fatal("parseDTD: invalid element %q", string(dir), len(dir), len(m[0]), string(m[0])) + } + s := string(m[1]) + el = &element{ + name: ename, + category: s, + } + b.index[ename] = el + case "ATTLIST": + if !elementFound { + log.Fatalf("parseDTD: unknown element %q", ename) + } + s := string(dir) + m := reAttr.FindStringSubmatch(s) + if m == nil { + log.Fatal(fmt.Errorf("parseDTD: invalid attribute %q", string(dir))) + } + if m[4] == "FIXED" { + b.version = m[5] + } else { + switch m[1] { + case "draft", "references", "alt", "validSubLocales", "standard" /* in Common */ : + case "type", "choice": + default: + el.attr = append(el.attr, &attribute{ + name: m[1], + key: s, + list: reToken.FindAllString(m[3], -1), + }) + el.signature = fmt.Sprintf("%s=%s+%s", el.signature, m[1], m[2]) + } + } + } + } +} + +var reCat = regexp.MustCompile(`[ ,\|]*(?:(\(|\)|\#?[\w_-]+)([\*\+\?]?))?`) + +// resolve takes a parsed element and converts it into structured data +// that can be used to generate the XML code. +func (b *builder) resolve(e *element) { + if e.resolved { + return + } + b.elem = append(b.elem, e) + e.resolved = true + s := e.category + found := make(map[string]bool) + sequenceStart := []int{} + for len(s) > 0 { + m := reCat.FindStringSubmatch(s) + if m == nil { + log.Fatalf("%s: invalid category string %q", e.name, s) + } + repeat := m[2] == "*" || m[2] == "+" || in(b.info.forceRepeat, m[1]) + switch m[1] { + case "": + case "(": + sequenceStart = append(sequenceStart, len(e.sub)) + case ")": + if len(sequenceStart) == 0 { + log.Fatalf("%s: unmatched closing parenthesis", e.name) + } + for i := sequenceStart[len(sequenceStart)-1]; i < len(e.sub); i++ { + e.sub[i].repeat = e.sub[i].repeat || repeat + } + sequenceStart = sequenceStart[:len(sequenceStart)-1] + default: + if in(b.info.skipElem, m[1]) { + } else if sub, ok := b.index[m[1]]; ok { + if !found[sub.name] { + e.sub = append(e.sub, struct { + e *element + repeat bool + }{sub, repeat}) + found[sub.name] = true + b.resolve(sub) + } + } else if m[1] == "#PCDATA" || m[1] == "ANY" { + } else if m[1] != "EMPTY" { + log.Fatalf("resolve:%s: element %q not found", e.name, m[1]) + } + } + s = s[len(m[0]):] + } +} + +// return true if s is contained in set. +func in(set []string, s string) bool { + for _, v := range set { + if v == s { + return true + } + } + return false +} + +var repl = strings.NewReplacer("-", " ", "_", " ") + +// title puts the first character or each character following '_' in title case and +// removes all occurrences of '_'. +func title(s string) string { + return strings.Replace(strings.Title(repl.Replace(s)), " ", "", -1) +} + +// writeElem generates Go code for a single element, recursively. +func (b *builder) writeElem(tab int, e *element) { + p := func(f string, x ...interface{}) { + f = strings.Replace(f, "\n", "\n"+strings.Repeat("\t", tab), -1) + fmt.Fprintf(b.w, f, x...) + } + if len(e.sub) == 0 && len(e.attr) == 0 { + p("Common") + return + } + p("struct {") + tab++ + p("\nCommon") + for _, attr := range e.attr { + if !in(b.info.skipAttr, attr.name) { + p("\n%s string `xml:\"%s,attr\"`", title(attr.name), attr.name) + } + } + for _, sub := range e.sub { + if in(b.info.predefined, sub.e.name) { + p("\n%sElem", sub.e.name) + continue + } + if in(b.info.skipElem, sub.e.name) { + continue + } + p("\n%s ", title(sub.e.name)) + if sub.repeat { + p("[]") + } + p("*") + if in(b.info.top, sub.e.name) { + p(title(sub.e.name)) + } else { + b.writeElem(tab, sub.e) + } + p(" `xml:\"%s\"`", sub.e.name) + } + tab-- + p("\n}") +} + +// write generates the Go XML code. +func (b *builder) write() { + for i, name := range b.info.top { + e := b.index[name] + if e != nil { + fmt.Fprintf(b.w, comments[name]) + name := title(e.name) + if i == 0 { + name = b.info.root + } + fmt.Fprintf(b.w, "type %s ", name) + b.writeElem(0, e) + fmt.Fprint(b.w, "\n") + } + } +} diff --git a/vendor/golang.org/x/text/unicode/cldr/resolve.go b/vendor/golang.org/x/text/unicode/cldr/resolve.go new file mode 100644 index 0000000000..691b5903fe --- /dev/null +++ b/vendor/golang.org/x/text/unicode/cldr/resolve.go @@ -0,0 +1,602 @@ +// Copyright 2013 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 cldr + +// This file implements the various inheritance constructs defined by LDML. +// See http://www.unicode.org/reports/tr35/#Inheritance_and_Validity +// for more details. + +import ( + "fmt" + "log" + "reflect" + "regexp" + "sort" + "strings" +) + +// fieldIter iterates over fields in a struct. It includes +// fields of embedded structs. +type fieldIter struct { + v reflect.Value + index, n []int +} + +func iter(v reflect.Value) fieldIter { + if v.Kind() != reflect.Struct { + log.Panicf("value %v must be a struct", v) + } + i := fieldIter{ + v: v, + index: []int{0}, + n: []int{v.NumField()}, + } + i.descent() + return i +} + +func (i *fieldIter) descent() { + for f := i.field(); f.Anonymous && f.Type.NumField() > 0; f = i.field() { + i.index = append(i.index, 0) + i.n = append(i.n, f.Type.NumField()) + } +} + +func (i *fieldIter) done() bool { + return len(i.index) == 1 && i.index[0] >= i.n[0] +} + +func skip(f reflect.StructField) bool { + return !f.Anonymous && (f.Name[0] < 'A' || f.Name[0] > 'Z') +} + +func (i *fieldIter) next() { + for { + k := len(i.index) - 1 + i.index[k]++ + if i.index[k] < i.n[k] { + if !skip(i.field()) { + break + } + } else { + if k == 0 { + return + } + i.index = i.index[:k] + i.n = i.n[:k] + } + } + i.descent() +} + +func (i *fieldIter) value() reflect.Value { + return i.v.FieldByIndex(i.index) +} + +func (i *fieldIter) field() reflect.StructField { + return i.v.Type().FieldByIndex(i.index) +} + +type visitor func(v reflect.Value) error + +var stopDescent = fmt.Errorf("do not recurse") + +func (f visitor) visit(x interface{}) error { + return f.visitRec(reflect.ValueOf(x)) +} + +// visit recursively calls f on all nodes in v. +func (f visitor) visitRec(v reflect.Value) error { + if v.Kind() == reflect.Ptr { + if v.IsNil() { + return nil + } + return f.visitRec(v.Elem()) + } + if err := f(v); err != nil { + if err == stopDescent { + return nil + } + return err + } + switch v.Kind() { + case reflect.Struct: + for i := iter(v); !i.done(); i.next() { + if err := f.visitRec(i.value()); err != nil { + return err + } + } + case reflect.Slice: + for i := 0; i < v.Len(); i++ { + if err := f.visitRec(v.Index(i)); err != nil { + return err + } + } + } + return nil +} + +// getPath is used for error reporting purposes only. +func getPath(e Elem) string { + if e == nil { + return "<nil>" + } + if e.enclosing() == nil { + return e.GetCommon().name + } + if e.GetCommon().Type == "" { + return fmt.Sprintf("%s.%s", getPath(e.enclosing()), e.GetCommon().name) + } + return fmt.Sprintf("%s.%s[type=%s]", getPath(e.enclosing()), e.GetCommon().name, e.GetCommon().Type) +} + +// xmlName returns the xml name of the element or attribute +func xmlName(f reflect.StructField) (name string, attr bool) { + tags := strings.Split(f.Tag.Get("xml"), ",") + for _, s := range tags { + attr = attr || s == "attr" + } + return tags[0], attr +} + +func findField(v reflect.Value, key string) (reflect.Value, error) { + v = reflect.Indirect(v) + for i := iter(v); !i.done(); i.next() { + if n, _ := xmlName(i.field()); n == key { + return i.value(), nil + } + } + return reflect.Value{}, fmt.Errorf("cldr: no field %q in element %#v", key, v.Interface()) +} + +var xpathPart = regexp.MustCompile(`(\pL+)(?:\[@(\pL+)='([\w-]+)'\])?`) + +func walkXPath(e Elem, path string) (res Elem, err error) { + for _, c := range strings.Split(path, "/") { + if c == ".." { + if e = e.enclosing(); e == nil { + panic("path ..") + return nil, fmt.Errorf(`cldr: ".." moves past root in path %q`, path) + } + continue + } else if c == "" { + continue + } + m := xpathPart.FindStringSubmatch(c) + if len(m) == 0 || len(m[0]) != len(c) { + return nil, fmt.Errorf("cldr: syntax error in path component %q", c) + } + v, err := findField(reflect.ValueOf(e), m[1]) + if err != nil { + return nil, err + } + switch v.Kind() { + case reflect.Slice: + i := 0 + if m[2] != "" || v.Len() > 1 { + if m[2] == "" { + m[2] = "type" + if m[3] = e.GetCommon().Default(); m[3] == "" { + return nil, fmt.Errorf("cldr: type selector or default value needed for element %s", m[1]) + } + } + for ; i < v.Len(); i++ { + vi := v.Index(i) + key, err := findField(vi.Elem(), m[2]) + if err != nil { + return nil, err + } + key = reflect.Indirect(key) + if key.Kind() == reflect.String && key.String() == m[3] { + break + } + } + } + if i == v.Len() || v.Index(i).IsNil() { + return nil, fmt.Errorf("no %s found with %s==%s", m[1], m[2], m[3]) + } + e = v.Index(i).Interface().(Elem) + case reflect.Ptr: + if v.IsNil() { + return nil, fmt.Errorf("cldr: element %q not found within element %q", m[1], e.GetCommon().name) + } + var ok bool + if e, ok = v.Interface().(Elem); !ok { + return nil, fmt.Errorf("cldr: %q is not an XML element", m[1]) + } else if m[2] != "" || m[3] != "" { + return nil, fmt.Errorf("cldr: no type selector allowed for element %s", m[1]) + } + default: + return nil, fmt.Errorf("cldr: %q is not an XML element", m[1]) + } + } + return e, nil +} + +const absPrefix = "//ldml/" + +func (cldr *CLDR) resolveAlias(e Elem, src, path string) (res Elem, err error) { + if src != "locale" { + if !strings.HasPrefix(path, absPrefix) { + return nil, fmt.Errorf("cldr: expected absolute path, found %q", path) + } + path = path[len(absPrefix):] + if e, err = cldr.resolve(src); err != nil { + return nil, err + } + } + return walkXPath(e, path) +} + +func (cldr *CLDR) resolveAndMergeAlias(e Elem) error { + alias := e.GetCommon().Alias + if alias == nil { + return nil + } + a, err := cldr.resolveAlias(e, alias.Source, alias.Path) + if err != nil { + return fmt.Errorf("%v: error evaluating path %q: %v", getPath(e), alias.Path, err) + } + // Ensure alias node was already evaluated. TODO: avoid double evaluation. + err = cldr.resolveAndMergeAlias(a) + v := reflect.ValueOf(e).Elem() + for i := iter(reflect.ValueOf(a).Elem()); !i.done(); i.next() { + if vv := i.value(); vv.Kind() != reflect.Ptr || !vv.IsNil() { + if _, attr := xmlName(i.field()); !attr { + v.FieldByIndex(i.index).Set(vv) + } + } + } + return err +} + +func (cldr *CLDR) aliasResolver() visitor { + return func(v reflect.Value) (err error) { + if e, ok := v.Addr().Interface().(Elem); ok { + err = cldr.resolveAndMergeAlias(e) + if err == nil && blocking[e.GetCommon().name] { + return stopDescent + } + } + return err + } +} + +// elements within blocking elements do not inherit. +// Taken from CLDR's supplementalMetaData.xml. +var blocking = map[string]bool{ + "identity": true, + "supplementalData": true, + "cldrTest": true, + "collation": true, + "transform": true, +} + +// Distinguishing attributes affect inheritance; two elements with different +// distinguishing attributes are treated as different for purposes of inheritance, +// except when such attributes occur in the indicated elements. +// Taken from CLDR's supplementalMetaData.xml. +var distinguishing = map[string][]string{ + "key": nil, + "request_id": nil, + "id": nil, + "registry": nil, + "alt": nil, + "iso4217": nil, + "iso3166": nil, + "mzone": nil, + "from": nil, + "to": nil, + "type": []string{ + "abbreviationFallback", + "default", + "mapping", + "measurementSystem", + "preferenceOrdering", + }, + "numberSystem": nil, +} + +func in(set []string, s string) bool { + for _, v := range set { + if v == s { + return true + } + } + return false +} + +// attrKey computes a key based on the distinguishable attributes of +// an element and it's values. +func attrKey(v reflect.Value, exclude ...string) string { + parts := []string{} + ename := v.Interface().(Elem).GetCommon().name + v = v.Elem() + for i := iter(v); !i.done(); i.next() { + if name, attr := xmlName(i.field()); attr { + if except, ok := distinguishing[name]; ok && !in(exclude, name) && !in(except, ename) { + v := i.value() + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + if v.IsValid() { + parts = append(parts, fmt.Sprintf("%s=%s", name, v.String())) + } + } + } + } + sort.Strings(parts) + return strings.Join(parts, ";") +} + +// Key returns a key for e derived from all distinguishing attributes +// except those specified by exclude. +func Key(e Elem, exclude ...string) string { + return attrKey(reflect.ValueOf(e), exclude...) +} + +// linkEnclosing sets the enclosing element as well as the name +// for all sub-elements of child, recursively. +func linkEnclosing(parent, child Elem) { + child.setEnclosing(parent) + v := reflect.ValueOf(child).Elem() + for i := iter(v); !i.done(); i.next() { + vf := i.value() + if vf.Kind() == reflect.Slice { + for j := 0; j < vf.Len(); j++ { + linkEnclosing(child, vf.Index(j).Interface().(Elem)) + } + } else if vf.Kind() == reflect.Ptr && !vf.IsNil() && vf.Elem().Kind() == reflect.Struct { + linkEnclosing(child, vf.Interface().(Elem)) + } + } +} + +func setNames(e Elem, name string) { + e.setName(name) + v := reflect.ValueOf(e).Elem() + for i := iter(v); !i.done(); i.next() { + vf := i.value() + name, _ = xmlName(i.field()) + if vf.Kind() == reflect.Slice { + for j := 0; j < vf.Len(); j++ { + setNames(vf.Index(j).Interface().(Elem), name) + } + } else if vf.Kind() == reflect.Ptr && !vf.IsNil() && vf.Elem().Kind() == reflect.Struct { + setNames(vf.Interface().(Elem), name) + } + } +} + +// deepCopy copies elements of v recursively. All elements of v that may +// be modified by inheritance are explicitly copied. +func deepCopy(v reflect.Value) reflect.Value { + switch v.Kind() { + case reflect.Ptr: + if v.IsNil() || v.Elem().Kind() != reflect.Struct { + return v + } + nv := reflect.New(v.Elem().Type()) + nv.Elem().Set(v.Elem()) + deepCopyRec(nv.Elem(), v.Elem()) + return nv + case reflect.Slice: + nv := reflect.MakeSlice(v.Type(), v.Len(), v.Len()) + for i := 0; i < v.Len(); i++ { + deepCopyRec(nv.Index(i), v.Index(i)) + } + return nv + } + panic("deepCopy: must be called with pointer or slice") +} + +// deepCopyRec is only called by deepCopy. +func deepCopyRec(nv, v reflect.Value) { + if v.Kind() == reflect.Struct { + t := v.Type() + for i := 0; i < v.NumField(); i++ { + if name, attr := xmlName(t.Field(i)); name != "" && !attr { + deepCopyRec(nv.Field(i), v.Field(i)) + } + } + } else { + nv.Set(deepCopy(v)) + } +} + +// newNode is used to insert a missing node during inheritance. +func (cldr *CLDR) newNode(v, enc reflect.Value) reflect.Value { + n := reflect.New(v.Type()) + for i := iter(v); !i.done(); i.next() { + if name, attr := xmlName(i.field()); name == "" || attr { + n.Elem().FieldByIndex(i.index).Set(i.value()) + } + } + n.Interface().(Elem).GetCommon().setEnclosing(enc.Addr().Interface().(Elem)) + return n +} + +// v, parent must be pointers to struct +func (cldr *CLDR) inheritFields(v, parent reflect.Value) (res reflect.Value, err error) { + t := v.Type() + nv := reflect.New(t) + nv.Elem().Set(v) + for i := iter(v); !i.done(); i.next() { + vf := i.value() + f := i.field() + name, attr := xmlName(f) + if name == "" || attr { + continue + } + pf := parent.FieldByIndex(i.index) + if blocking[name] { + if vf.IsNil() { + vf = pf + } + nv.Elem().FieldByIndex(i.index).Set(deepCopy(vf)) + continue + } + switch f.Type.Kind() { + case reflect.Ptr: + if f.Type.Elem().Kind() == reflect.Struct { + if !vf.IsNil() { + if vf, err = cldr.inheritStructPtr(vf, pf); err != nil { + return reflect.Value{}, err + } + vf.Interface().(Elem).setEnclosing(nv.Interface().(Elem)) + nv.Elem().FieldByIndex(i.index).Set(vf) + } else if !pf.IsNil() { + n := cldr.newNode(pf.Elem(), v) + if vf, err = cldr.inheritStructPtr(n, pf); err != nil { + return reflect.Value{}, err + } + vf.Interface().(Elem).setEnclosing(nv.Interface().(Elem)) + nv.Elem().FieldByIndex(i.index).Set(vf) + } + } + case reflect.Slice: + vf, err := cldr.inheritSlice(nv.Elem(), vf, pf) + if err != nil { + return reflect.Zero(t), err + } + nv.Elem().FieldByIndex(i.index).Set(vf) + } + } + return nv, nil +} + +func root(e Elem) *LDML { + for ; e.enclosing() != nil; e = e.enclosing() { + } + return e.(*LDML) +} + +// inheritStructPtr first merges possible aliases in with v and then inherits +// any underspecified elements from parent. +func (cldr *CLDR) inheritStructPtr(v, parent reflect.Value) (r reflect.Value, err error) { + if !v.IsNil() { + e := v.Interface().(Elem).GetCommon() + alias := e.Alias + if alias == nil && !parent.IsNil() { + alias = parent.Interface().(Elem).GetCommon().Alias + } + if alias != nil { + a, err := cldr.resolveAlias(v.Interface().(Elem), alias.Source, alias.Path) + if a != nil { + if v, err = cldr.inheritFields(v.Elem(), reflect.ValueOf(a).Elem()); err != nil { + return reflect.Value{}, err + } + } + } + if !parent.IsNil() { + return cldr.inheritFields(v.Elem(), parent.Elem()) + } + } else if parent.IsNil() { + panic("should not reach here") + } + return v, nil +} + +// Must be slice of struct pointers. +func (cldr *CLDR) inheritSlice(enc, v, parent reflect.Value) (res reflect.Value, err error) { + t := v.Type() + index := make(map[string]reflect.Value) + if !v.IsNil() { + for i := 0; i < v.Len(); i++ { + vi := v.Index(i) + key := attrKey(vi) + index[key] = vi + } + } + if !parent.IsNil() { + for i := 0; i < parent.Len(); i++ { + vi := parent.Index(i) + key := attrKey(vi) + if w, ok := index[key]; ok { + index[key], err = cldr.inheritStructPtr(w, vi) + } else { + n := cldr.newNode(vi.Elem(), enc) + index[key], err = cldr.inheritStructPtr(n, vi) + } + index[key].Interface().(Elem).setEnclosing(enc.Addr().Interface().(Elem)) + if err != nil { + return v, err + } + } + } + keys := make([]string, 0, len(index)) + for k, _ := range index { + keys = append(keys, k) + } + sort.Strings(keys) + sl := reflect.MakeSlice(t, len(index), len(index)) + for i, k := range keys { + sl.Index(i).Set(index[k]) + } + return sl, nil +} + +func parentLocale(loc string) string { + parts := strings.Split(loc, "_") + if len(parts) == 1 { + return "root" + } + parts = parts[:len(parts)-1] + key := strings.Join(parts, "_") + return key +} + +func (cldr *CLDR) resolve(loc string) (res *LDML, err error) { + if r := cldr.resolved[loc]; r != nil { + return r, nil + } + x := cldr.RawLDML(loc) + if x == nil { + return nil, fmt.Errorf("cldr: unknown locale %q", loc) + } + var v reflect.Value + if loc == "root" { + x = deepCopy(reflect.ValueOf(x)).Interface().(*LDML) + linkEnclosing(nil, x) + err = cldr.aliasResolver().visit(x) + } else { + key := parentLocale(loc) + var parent *LDML + for ; cldr.locale[key] == nil; key = parentLocale(key) { + } + if parent, err = cldr.resolve(key); err != nil { + return nil, err + } + v, err = cldr.inheritFields(reflect.ValueOf(x).Elem(), reflect.ValueOf(parent).Elem()) + x = v.Interface().(*LDML) + linkEnclosing(nil, x) + } + if err != nil { + return nil, err + } + cldr.resolved[loc] = x + return x, err +} + +// finalize finalizes the initialization of the raw LDML structs. It also +// removed unwanted fields, as specified by filter, so that they will not +// be unnecessarily evaluated. +func (cldr *CLDR) finalize(filter []string) { + for _, x := range cldr.locale { + if filter != nil { + v := reflect.ValueOf(x).Elem() + t := v.Type() + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + name, _ := xmlName(f) + if name != "" && name != "identity" && !in(filter, name) { + v.Field(i).Set(reflect.Zero(f.Type)) + } + } + } + linkEnclosing(nil, x) // for resolving aliases and paths + setNames(x, "ldml") + } +} diff --git a/vendor/golang.org/x/text/unicode/cldr/resolve_test.go b/vendor/golang.org/x/text/unicode/cldr/resolve_test.go new file mode 100644 index 0000000000..7b19cef871 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/cldr/resolve_test.go @@ -0,0 +1,368 @@ +package cldr + +import ( + "fmt" + "log" + "reflect" + "testing" +) + +func failOnError(err error) { + if err != nil { + log.Panic(err) + } +} + +func data() *CLDR { + d := Decoder{} + data, err := d.Decode(testLoader{}) + failOnError(err) + return data +} + +type h struct { + A string `xml:"ha,attr"` + E string `xml:"he"` + D string `xml:",chardata"` + X string +} + +type fieldTest struct { + Common + To string `xml:"to,attr"` + Key string `xml:"key,attr"` + E string `xml:"e"` + D string `xml:",chardata"` + X string + h +} + +var testStruct = fieldTest{ + Common: Common{ + name: "mapping", // exclude "type" as distinguising attribute + Type: "foo", + Alt: "foo", + }, + To: "nyc", + Key: "k", + E: "E", + D: "D", + h: h{ + A: "A", + E: "E", + D: "D", + }, +} + +func TestIter(t *testing.T) { + tests := map[string]string{ + "Type": "foo", + "Alt": "foo", + "To": "nyc", + "A": "A", + "Alias": "<nil>", + } + k := 0 + for i := iter(reflect.ValueOf(testStruct)); !i.done(); i.next() { + v := i.value() + if v.Kind() == reflect.Ptr && v.Elem().Kind() == reflect.String { + v = v.Elem() + } + name := i.field().Name + if w, ok := tests[name]; ok { + s := fmt.Sprint(v.Interface()) + if w != s { + t.Errorf("value: found %q; want %q", w, s) + } + delete(tests, name) + } + k++ + } + if len(tests) != 0 { + t.Errorf("missing fields: %v", tests) + } +} + +func TestFindField(t *testing.T) { + tests := []struct { + name, val string + exist bool + }{ + {"type", "foo", true}, + {"alt", "foo", true}, + {"to", "nyc", true}, + {"he", "E", true}, + {"q", "", false}, + } + vf := reflect.ValueOf(testStruct) + for i, tt := range tests { + v, err := findField(vf, tt.name) + if (err == nil) != tt.exist { + t.Errorf("%d: field %q present is %v; want %v", i, tt.name, err == nil, tt.exist) + } else if tt.exist { + if v.Kind() == reflect.Ptr { + if v.IsNil() { + continue + } + v = v.Elem() + } + if v.String() != tt.val { + t.Errorf("%d: found value %q; want %q", i, v.String(), tt.val) + } + } + } +} + +var keyTests = []struct { + exclude []string + key string +}{ + {[]string{}, "alt=foo;key=k;to=nyc"}, + {[]string{"type"}, "alt=foo;key=k;to=nyc"}, + {[]string{"choice"}, "alt=foo;key=k;to=nyc"}, + {[]string{"alt"}, "key=k;to=nyc"}, + {[]string{"a"}, "alt=foo;key=k;to=nyc"}, + {[]string{"to"}, "alt=foo;key=k"}, + {[]string{"alt", "to"}, "key=k"}, + {[]string{"alt", "to", "key"}, ""}, +} + +func TestAttrKey(t *testing.T) { + v := reflect.ValueOf(&testStruct) + for i, tt := range keyTests { + key := attrKey(v, tt.exclude...) + if key != tt.key { + t.Errorf("%d: found %q, want %q", i, key, tt.key) + } + } +} + +func TestKey(t *testing.T) { + for i, tt := range keyTests { + key := Key(&testStruct, tt.exclude...) + if key != tt.key { + t.Errorf("%d: found %q, want %q", i, key, tt.key) + } + } +} + +func testEnclosing(t *testing.T, x *LDML, name string) { + eq := func(a, b Elem, i int) { + for ; i > 0; i-- { + b = b.enclosing() + } + if a != b { + t.Errorf("%s: found path %q, want %q", name, getPath(a), getPath(b)) + } + } + eq(x, x, 0) + eq(x, x.Identity, 1) + eq(x, x.Dates.Calendars, 2) + eq(x, x.Dates.Calendars.Calendar[0], 3) + eq(x, x.Dates.Calendars.Calendar[1], 3) + //eq(x, x.Dates.Calendars.Calendar[0].Months, 4) + eq(x, x.Dates.Calendars.Calendar[1].Months, 4) +} + +func TestEnclosing(t *testing.T) { + testEnclosing(t, data().RawLDML("de"), "enclosing-raw") + de, _ := data().LDML("de") + testEnclosing(t, de, "enclosing") +} + +func TestDeepCopy(t *testing.T) { + eq := func(have, want string) { + if have != want { + t.Errorf("found %q; want %q", have, want) + } + } + x, _ := data().LDML("de") + vc := deepCopy(reflect.ValueOf(x)) + c := vc.Interface().(*LDML) + linkEnclosing(nil, c) + if x == c { + t.Errorf("did not copy") + } + + eq(c.name, "ldml") + eq(c.Dates.name, "dates") + testEnclosing(t, c, "deepCopy") +} + +type getTest struct { + loc string + path string + field string // used in combination with length + data string + altData string // used for buddhist calendar if value != "" + typ string + length int + missing bool +} + +const ( + budMon = "dates/calendars/calendar[@type='buddhist']/months/" + chnMon = "dates/calendars/calendar[@type='chinese']/months/" + greMon = "dates/calendars/calendar[@type='gregorian']/months/" +) + +func monthVal(path, context, width string, month int) string { + const format = "%s/monthContext[@type='%s']/monthWidth[@type='%s']/month[@type='%d']" + return fmt.Sprintf(format, path, context, width, month) +} + +var rootGetTests = []getTest{ + {loc: "root", path: "identity/language", typ: "root"}, + {loc: "root", path: "characters/moreInformation", data: "?"}, + {loc: "root", path: "characters", field: "exemplarCharacters", length: 3}, + {loc: "root", path: greMon, field: "monthContext", length: 2}, + {loc: "root", path: greMon + "monthContext[@type='format']/monthWidth[@type='narrow']", field: "month", length: 4}, + {loc: "root", path: greMon + "monthContext[@type='stand-alone']/monthWidth[@type='wide']", field: "month", length: 4}, + // unescaping character data + {loc: "root", path: "characters/exemplarCharacters[@type='punctuation']", data: `[\- ‐ – — … ' ‘ ‚ " “ „ \& #]`}, + // default resolution + {loc: "root", path: "dates/calendars/calendar", typ: "gregorian"}, + // alias resolution + {loc: "root", path: budMon, field: "monthContext", length: 2}, + // crossing but non-circular alias resolution + {loc: "root", path: budMon + "monthContext[@type='format']/monthWidth[@type='narrow']", field: "month", length: 4}, + {loc: "root", path: budMon + "monthContext[@type='stand-alone']/monthWidth[@type='wide']", field: "month", length: 4}, + {loc: "root", path: monthVal(greMon, "format", "wide", 1), data: "11"}, + {loc: "root", path: monthVal(greMon, "format", "narrow", 2), data: "2"}, + {loc: "root", path: monthVal(greMon, "stand-alone", "wide", 3), data: "33"}, + {loc: "root", path: monthVal(greMon, "stand-alone", "narrow", 4), data: "4"}, + {loc: "root", path: monthVal(budMon, "format", "wide", 1), data: "11"}, + {loc: "root", path: monthVal(budMon, "format", "narrow", 2), data: "2"}, + {loc: "root", path: monthVal(budMon, "stand-alone", "wide", 3), data: "33"}, + {loc: "root", path: monthVal(budMon, "stand-alone", "narrow", 4), data: "4"}, +} + +// 19 +var deGetTests = []getTest{ + {loc: "de", path: "identity/language", typ: "de"}, + {loc: "de", path: "posix", length: 2}, + {loc: "de", path: "characters", field: "exemplarCharacters", length: 4}, + {loc: "de", path: "characters/exemplarCharacters[@type='auxiliary']", data: `[á à ă]`}, + // identity is a blocking element, so de should not inherit generation from root. + {loc: "de", path: "identity/generation", missing: true}, + // default resolution + {loc: "root", path: "dates/calendars/calendar", typ: "gregorian"}, + + // absolute path alias resolution + {loc: "gsw", path: "posix", field: "messages", length: 1}, + {loc: "gsw", path: "posix/messages/yesstr", data: "yes:y"}, +} + +// 27(greMon) - 52(budMon) - 77(chnMon) +func calGetTests(s string) []getTest { + tests := []getTest{ + {loc: "de", path: s, length: 2}, + {loc: "de", path: s + "monthContext[@type='format']/monthWidth[@type='wide']", field: "month", length: 5}, + {loc: "de", path: monthVal(s, "format", "wide", 1), data: "11"}, + {loc: "de", path: monthVal(s, "format", "wide", 2), data: "22"}, + {loc: "de", path: monthVal(s, "format", "wide", 3), data: "Maerz", altData: "bbb"}, + {loc: "de", path: monthVal(s, "format", "wide", 4), data: "April"}, + {loc: "de", path: monthVal(s, "format", "wide", 5), data: "Mai"}, + + {loc: "de", path: s + "monthContext[@type='format']/monthWidth[@type='narrow']", field: "month", length: 5}, + {loc: "de", path: monthVal(s, "format", "narrow", 1), data: "1"}, + {loc: "de", path: monthVal(s, "format", "narrow", 2), data: "2"}, + {loc: "de", path: monthVal(s, "format", "narrow", 3), data: "M", altData: "BBB"}, + {loc: "de", path: monthVal(s, "format", "narrow", 4), data: "A"}, + {loc: "de", path: monthVal(s, "format", "narrow", 5), data: "m"}, + + {loc: "de", path: s + "monthContext[@type='stand-alone']/monthWidth[@type='wide']", field: "month", length: 5}, + {loc: "de", path: monthVal(s, "stand-alone", "wide", 1), data: "11"}, + {loc: "de", path: monthVal(s, "stand-alone", "wide", 2), data: "22"}, + {loc: "de", path: monthVal(s, "stand-alone", "wide", 3), data: "Maerz", altData: "bbb"}, + {loc: "de", path: monthVal(s, "stand-alone", "wide", 4), data: "april"}, + {loc: "de", path: monthVal(s, "stand-alone", "wide", 5), data: "mai"}, + + {loc: "de", path: s + "monthContext[@type='stand-alone']/monthWidth[@type='narrow']", field: "month", length: 5}, + {loc: "de", path: monthVal(s, "stand-alone", "narrow", 1), data: "1"}, + {loc: "de", path: monthVal(s, "stand-alone", "narrow", 2), data: "2"}, + {loc: "de", path: monthVal(s, "stand-alone", "narrow", 3), data: "m"}, + {loc: "de", path: monthVal(s, "stand-alone", "narrow", 4), data: "4"}, + {loc: "de", path: monthVal(s, "stand-alone", "narrow", 5), data: "m"}, + } + if s == budMon { + for i, t := range tests { + if t.altData != "" { + tests[i].data = t.altData + } + } + } + return tests +} + +var getTests = append(rootGetTests, + append(deGetTests, + append(calGetTests(greMon), + append(calGetTests(budMon), + calGetTests(chnMon)...)...)...)...) + +func TestPath(t *testing.T) { + d := data() + for i, tt := range getTests { + x, _ := d.LDML(tt.loc) + e, err := walkXPath(x, tt.path) + if err != nil { + if !tt.missing { + t.Errorf("%d:error: %v %v", i, err, tt.missing) + } + continue + } + if tt.missing { + t.Errorf("%d: missing is %v; want %v", i, e == nil, tt.missing) + continue + } + if tt.data != "" && e.GetCommon().Data() != tt.data { + t.Errorf("%d: data is %v; want %v", i, e.GetCommon().Data(), tt.data) + continue + } + if tt.typ != "" && e.GetCommon().Type != tt.typ { + t.Errorf("%d: type is %v; want %v", i, e.GetCommon().Type, tt.typ) + continue + } + if tt.field != "" { + slice, _ := findField(reflect.ValueOf(e), tt.field) + if slice.Len() != tt.length { + t.Errorf("%d: length is %v; want %v", i, slice.Len(), tt.length) + continue + } + } + } +} + +func TestGet(t *testing.T) { + d := data() + for i, tt := range getTests { + x, _ := d.LDML(tt.loc) + e, err := Get(x, tt.path) + if err != nil { + if !tt.missing { + t.Errorf("%d:error: %v %v", i, err, tt.missing) + } + continue + } + if tt.missing { + t.Errorf("%d: missing is %v; want %v", i, e == nil, tt.missing) + continue + } + if tt.data != "" && e.GetCommon().Data() != tt.data { + t.Errorf("%d: data is %v; want %v", i, e.GetCommon().Data(), tt.data) + continue + } + if tt.typ != "" && e.GetCommon().Type != tt.typ { + t.Errorf("%d: type is %v; want %v", i, e.GetCommon().Type, tt.typ) + continue + } + if tt.field != "" { + slice, _ := findField(reflect.ValueOf(e), tt.field) + if slice.Len() != tt.length { + t.Errorf("%d: length is %v; want %v", i, slice.Len(), tt.length) + continue + } + } + } +} diff --git a/vendor/golang.org/x/text/unicode/cldr/slice.go b/vendor/golang.org/x/text/unicode/cldr/slice.go new file mode 100644 index 0000000000..388c983ff1 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/cldr/slice.go @@ -0,0 +1,144 @@ +// Copyright 2013 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 cldr + +import ( + "fmt" + "reflect" + "sort" +) + +// Slice provides utilities for modifying slices of elements. +// It can be wrapped around any slice of which the element type implements +// interface Elem. +type Slice struct { + ptr reflect.Value + typ reflect.Type +} + +// Value returns the reflect.Value of the underlying slice. +func (s *Slice) Value() reflect.Value { + return s.ptr.Elem() +} + +// MakeSlice wraps a pointer to a slice of Elems. +// It replaces the array pointed to by the slice so that subsequent modifications +// do not alter the data in a CLDR type. +// It panics if an incorrect type is passed. +func MakeSlice(slicePtr interface{}) Slice { + ptr := reflect.ValueOf(slicePtr) + if ptr.Kind() != reflect.Ptr { + panic(fmt.Sprintf("MakeSlice: argument must be pointer to slice, found %v", ptr.Type())) + } + sl := ptr.Elem() + if sl.Kind() != reflect.Slice { + panic(fmt.Sprintf("MakeSlice: argument must point to a slice, found %v", sl.Type())) + } + intf := reflect.TypeOf((*Elem)(nil)).Elem() + if !sl.Type().Elem().Implements(intf) { + panic(fmt.Sprintf("MakeSlice: element type of slice (%v) does not implement Elem", sl.Type().Elem())) + } + nsl := reflect.MakeSlice(sl.Type(), sl.Len(), sl.Len()) + reflect.Copy(nsl, sl) + sl.Set(nsl) + return Slice{ + ptr: ptr, + typ: sl.Type().Elem().Elem(), + } +} + +func (s Slice) indexForAttr(a string) []int { + for i := iter(reflect.Zero(s.typ)); !i.done(); i.next() { + if n, _ := xmlName(i.field()); n == a { + return i.index + } + } + panic(fmt.Sprintf("MakeSlice: no attribute %q for type %v", a, s.typ)) +} + +// Filter filters s to only include elements for which fn returns true. +func (s Slice) Filter(fn func(e Elem) bool) { + k := 0 + sl := s.Value() + for i := 0; i < sl.Len(); i++ { + vi := sl.Index(i) + if fn(vi.Interface().(Elem)) { + sl.Index(k).Set(vi) + k++ + } + } + sl.Set(sl.Slice(0, k)) +} + +// Group finds elements in s for which fn returns the same value and groups +// them in a new Slice. +func (s Slice) Group(fn func(e Elem) string) []Slice { + m := make(map[string][]reflect.Value) + sl := s.Value() + for i := 0; i < sl.Len(); i++ { + vi := sl.Index(i) + key := fn(vi.Interface().(Elem)) + m[key] = append(m[key], vi) + } + keys := []string{} + for k, _ := range m { + keys = append(keys, k) + } + sort.Strings(keys) + res := []Slice{} + for _, k := range keys { + nsl := reflect.New(sl.Type()) + nsl.Elem().Set(reflect.Append(nsl.Elem(), m[k]...)) + res = append(res, MakeSlice(nsl.Interface())) + } + return res +} + +// SelectAnyOf filters s to contain only elements for which attr matches +// any of the values. +func (s Slice) SelectAnyOf(attr string, values ...string) { + index := s.indexForAttr(attr) + s.Filter(func(e Elem) bool { + vf := reflect.ValueOf(e).Elem().FieldByIndex(index) + return in(values, vf.String()) + }) +} + +// SelectOnePerGroup filters s to include at most one element e per group of +// elements matching Key(attr), where e has an attribute a that matches any +// the values in v. +// If more than one element in a group matches a value in v preference +// is given to the element that matches the first value in v. +func (s Slice) SelectOnePerGroup(a string, v []string) { + index := s.indexForAttr(a) + grouped := s.Group(func(e Elem) string { return Key(e, a) }) + sl := s.Value() + sl.Set(sl.Slice(0, 0)) + for _, g := range grouped { + e := reflect.Value{} + found := len(v) + gsl := g.Value() + for i := 0; i < gsl.Len(); i++ { + vi := gsl.Index(i).Elem().FieldByIndex(index) + j := 0 + for ; j < len(v) && v[j] != vi.String(); j++ { + } + if j < found { + found = j + e = gsl.Index(i) + } + } + if found < len(v) { + sl.Set(reflect.Append(sl, e)) + } + } +} + +// SelectDraft drops all elements from the list with a draft level smaller than d +// and selects the highest draft level of the remaining. +// This method assumes that the input CLDR is canonicalized. +func (s Slice) SelectDraft(d Draft) { + s.SelectOnePerGroup("draft", drafts[len(drafts)-2-int(d):]) +} diff --git a/vendor/golang.org/x/text/unicode/cldr/slice_test.go b/vendor/golang.org/x/text/unicode/cldr/slice_test.go new file mode 100644 index 0000000000..f354329e25 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/cldr/slice_test.go @@ -0,0 +1,175 @@ +// Copyright 2013 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 cldr + +import ( + "reflect" + "testing" +) + +type testSlice []*Common + +func mkElem(alt, typ, ref string) *Common { + return &Common{ + Type: typ, + Reference: ref, + Alt: alt, + } +} + +var ( + testSlice1 = testSlice{ + mkElem("1", "a", "i.a"), + mkElem("1", "b", "i.b"), + mkElem("1", "c", "i.c"), + mkElem("2", "b", "ii"), + mkElem("3", "c", "iii"), + mkElem("4", "a", "iv.a"), + mkElem("4", "d", "iv.d"), + } + testSliceE = testSlice{} +) + +func panics(f func()) (panics bool) { + defer func() { + if err := recover(); err != nil { + panics = true + } + }() + f() + return panics +} + +func TestMakeSlice(t *testing.T) { + foo := 1 + bar := []int{} + tests := []struct { + i interface{} + panics bool + err string + }{ + {&foo, true, "should panic when passed a pointer to the wrong type"}, + {&bar, true, "should panic when slice element of the wrong type"}, + {testSlice1, true, "should panic when passed a slice"}, + {&testSlice1, false, "should not panic"}, + } + for i, tt := range tests { + if panics(func() { MakeSlice(tt.i) }) != tt.panics { + t.Errorf("%d: %s", i, tt.err) + } + } +} + +var anyOfTests = []struct { + sl testSlice + values []string + n int +}{ + {testSliceE, []string{}, 0}, + {testSliceE, []string{"1", "2", "3"}, 0}, + {testSlice1, []string{}, 0}, + {testSlice1, []string{"1"}, 3}, + {testSlice1, []string{"2"}, 1}, + {testSlice1, []string{"5"}, 0}, + {testSlice1, []string{"1", "2", "3"}, 5}, +} + +func TestSelectAnyOf(t *testing.T) { + for i, tt := range anyOfTests { + sl := tt.sl + s := MakeSlice(&sl) + s.SelectAnyOf("alt", tt.values...) + if len(sl) != tt.n { + t.Errorf("%d: found len == %d; want %d", i, len(sl), tt.n) + } + } + sl := testSlice1 + s := MakeSlice(&sl) + if !panics(func() { s.SelectAnyOf("foo") }) { + t.Errorf("should panic on non-existing attribute") + } +} + +func TestFilter(t *testing.T) { + for i, tt := range anyOfTests { + sl := tt.sl + s := MakeSlice(&sl) + s.Filter(func(e Elem) bool { + v, _ := findField(reflect.ValueOf(e), "alt") + return in(tt.values, v.String()) + }) + if len(sl) != tt.n { + t.Errorf("%d: found len == %d; want %d", i, len(sl), tt.n) + } + } +} + +func TestGroup(t *testing.T) { + f := func(excl ...string) func(Elem) string { + return func(e Elem) string { + return Key(e, excl...) + } + } + tests := []struct { + sl testSlice + f func(Elem) string + lens []int + }{ + {testSliceE, f(), []int{}}, + {testSlice1, f(), []int{1, 1, 1, 1, 1, 1, 1}}, + {testSlice1, f("type"), []int{3, 1, 1, 2}}, + {testSlice1, f("alt"), []int{2, 2, 2, 1}}, + {testSlice1, f("alt", "type"), []int{7}}, + {testSlice1, f("alt", "type"), []int{7}}, + } + for i, tt := range tests { + sl := tt.sl + s := MakeSlice(&sl) + g := s.Group(tt.f) + if len(tt.lens) != len(g) { + t.Errorf("%d: found %d; want %d", i, len(g), len(tt.lens)) + continue + } + for j, v := range tt.lens { + if n := g[j].Value().Len(); n != v { + t.Errorf("%d: found %d for length of group %d; want %d", i, n, j, v) + } + } + } +} + +func TestSelectOnePerGroup(t *testing.T) { + tests := []struct { + sl testSlice + attr string + values []string + refs []string + }{ + {testSliceE, "alt", []string{"1"}, []string{}}, + {testSliceE, "type", []string{"a"}, []string{}}, + {testSlice1, "alt", []string{"2", "3", "1"}, []string{"i.a", "ii", "iii"}}, + {testSlice1, "alt", []string{"1", "4"}, []string{"i.a", "i.b", "i.c", "iv.d"}}, + {testSlice1, "type", []string{"c", "d"}, []string{"i.c", "iii", "iv.d"}}, + } + for i, tt := range tests { + sl := tt.sl + s := MakeSlice(&sl) + s.SelectOnePerGroup(tt.attr, tt.values) + if len(sl) != len(tt.refs) { + t.Errorf("%d: found result lenght %d; want %d", i, len(sl), len(tt.refs)) + continue + } + for j, e := range sl { + if tt.refs[j] != e.Reference { + t.Errorf("%d:%d found %s; want %s", i, j, e.Reference, tt.refs[i]) + } + } + } + sl := testSlice1 + s := MakeSlice(&sl) + if !panics(func() { s.SelectOnePerGroup("foo", nil) }) { + t.Errorf("should panic on non-existing attribute") + } +} diff --git a/vendor/golang.org/x/text/unicode/cldr/xml.go b/vendor/golang.org/x/text/unicode/cldr/xml.go new file mode 100644 index 0000000000..3c77d48540 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/cldr/xml.go @@ -0,0 +1,1417 @@ +// This file was generated by go generate; DO NOT EDIT + +package cldr + +// LDMLBCP47 holds information on allowable values for various variables in LDML. +type LDMLBCP47 struct { + Common + Version *struct { + Common + Number string `xml:"number,attr"` + } `xml:"version"` + Generation *struct { + Common + Date string `xml:"date,attr"` + } `xml:"generation"` + Keyword []*struct { + Common + Key []*struct { + Common + Extension string `xml:"extension,attr"` + Name string `xml:"name,attr"` + Description string `xml:"description,attr"` + Deprecated string `xml:"deprecated,attr"` + Preferred string `xml:"preferred,attr"` + Alias string `xml:"alias,attr"` + Since string `xml:"since,attr"` + Type []*struct { + Common + Name string `xml:"name,attr"` + Description string `xml:"description,attr"` + Deprecated string `xml:"deprecated,attr"` + Preferred string `xml:"preferred,attr"` + Alias string `xml:"alias,attr"` + Since string `xml:"since,attr"` + } `xml:"type"` + } `xml:"key"` + } `xml:"keyword"` + Attribute []*struct { + Common + Name string `xml:"name,attr"` + Description string `xml:"description,attr"` + Deprecated string `xml:"deprecated,attr"` + Preferred string `xml:"preferred,attr"` + Since string `xml:"since,attr"` + } `xml:"attribute"` +} + +// SupplementalData holds information relevant for internationalization +// and proper use of CLDR, but that is not contained in the locale hierarchy. +type SupplementalData struct { + Common + Version *struct { + Common + Number string `xml:"number,attr"` + } `xml:"version"` + Generation *struct { + Common + Date string `xml:"date,attr"` + } `xml:"generation"` + CurrencyData *struct { + Common + Fractions []*struct { + Common + Info []*struct { + Common + Iso4217 string `xml:"iso4217,attr"` + Digits string `xml:"digits,attr"` + Rounding string `xml:"rounding,attr"` + CashDigits string `xml:"cashDigits,attr"` + CashRounding string `xml:"cashRounding,attr"` + } `xml:"info"` + } `xml:"fractions"` + Region []*struct { + Common + Iso3166 string `xml:"iso3166,attr"` + Currency []*struct { + Common + Before string `xml:"before,attr"` + From string `xml:"from,attr"` + To string `xml:"to,attr"` + Iso4217 string `xml:"iso4217,attr"` + Digits string `xml:"digits,attr"` + Rounding string `xml:"rounding,attr"` + CashRounding string `xml:"cashRounding,attr"` + Tender string `xml:"tender,attr"` + Alternate []*struct { + Common + Iso4217 string `xml:"iso4217,attr"` + } `xml:"alternate"` + } `xml:"currency"` + } `xml:"region"` + } `xml:"currencyData"` + TerritoryContainment *struct { + Common + Group []*struct { + Common + Contains string `xml:"contains,attr"` + Grouping string `xml:"grouping,attr"` + Status string `xml:"status,attr"` + } `xml:"group"` + } `xml:"territoryContainment"` + SubdivisionContainment *struct { + Common + Subgroup []*struct { + Common + Subtype string `xml:"subtype,attr"` + Contains string `xml:"contains,attr"` + } `xml:"subgroup"` + } `xml:"subdivisionContainment"` + LanguageData *struct { + Common + Language []*struct { + Common + Scripts string `xml:"scripts,attr"` + Territories string `xml:"territories,attr"` + Variants string `xml:"variants,attr"` + } `xml:"language"` + } `xml:"languageData"` + TerritoryInfo *struct { + Common + Territory []*struct { + Common + Gdp string `xml:"gdp,attr"` + LiteracyPercent string `xml:"literacyPercent,attr"` + Population string `xml:"population,attr"` + LanguagePopulation []*struct { + Common + WritingPercent string `xml:"writingPercent,attr"` + PopulationPercent string `xml:"populationPercent,attr"` + OfficialStatus string `xml:"officialStatus,attr"` + } `xml:"languagePopulation"` + } `xml:"territory"` + } `xml:"territoryInfo"` + PostalCodeData *struct { + Common + PostCodeRegex []*struct { + Common + TerritoryId string `xml:"territoryId,attr"` + } `xml:"postCodeRegex"` + } `xml:"postalCodeData"` + CalendarData *struct { + Common + Calendar []*struct { + Common + Territories string `xml:"territories,attr"` + CalendarSystem *Common `xml:"calendarSystem"` + Eras *struct { + Common + Era []*struct { + Common + Start string `xml:"start,attr"` + End string `xml:"end,attr"` + } `xml:"era"` + } `xml:"eras"` + } `xml:"calendar"` + } `xml:"calendarData"` + CalendarPreferenceData *struct { + Common + CalendarPreference []*struct { + Common + Territories string `xml:"territories,attr"` + Ordering string `xml:"ordering,attr"` + } `xml:"calendarPreference"` + } `xml:"calendarPreferenceData"` + WeekData *struct { + Common + MinDays []*struct { + Common + Count string `xml:"count,attr"` + Territories string `xml:"territories,attr"` + } `xml:"minDays"` + FirstDay []*struct { + Common + Day string `xml:"day,attr"` + Territories string `xml:"territories,attr"` + } `xml:"firstDay"` + WeekendStart []*struct { + Common + Day string `xml:"day,attr"` + Territories string `xml:"territories,attr"` + } `xml:"weekendStart"` + WeekendEnd []*struct { + Common + Day string `xml:"day,attr"` + Territories string `xml:"territories,attr"` + } `xml:"weekendEnd"` + } `xml:"weekData"` + TimeData *struct { + Common + Hours []*struct { + Common + Allowed string `xml:"allowed,attr"` + Preferred string `xml:"preferred,attr"` + Regions string `xml:"regions,attr"` + } `xml:"hours"` + } `xml:"timeData"` + MeasurementData *struct { + Common + MeasurementSystem []*struct { + Common + Category string `xml:"category,attr"` + Territories string `xml:"territories,attr"` + } `xml:"measurementSystem"` + PaperSize []*struct { + Common + Territories string `xml:"territories,attr"` + } `xml:"paperSize"` + } `xml:"measurementData"` + TimezoneData *struct { + Common + MapTimezones []*struct { + Common + OtherVersion string `xml:"otherVersion,attr"` + TypeVersion string `xml:"typeVersion,attr"` + MapZone []*struct { + Common + Other string `xml:"other,attr"` + Territory string `xml:"territory,attr"` + } `xml:"mapZone"` + } `xml:"mapTimezones"` + ZoneFormatting []*struct { + Common + Multizone string `xml:"multizone,attr"` + TzidVersion string `xml:"tzidVersion,attr"` + ZoneItem []*struct { + Common + Territory string `xml:"territory,attr"` + Aliases string `xml:"aliases,attr"` + } `xml:"zoneItem"` + } `xml:"zoneFormatting"` + } `xml:"timezoneData"` + Characters *struct { + Common + CharacterFallback []*struct { + Common + Character []*struct { + Common + Value string `xml:"value,attr"` + Substitute []*Common `xml:"substitute"` + } `xml:"character"` + } `xml:"character-fallback"` + } `xml:"characters"` + Transforms *struct { + Common + Transform []*struct { + Common + Source string `xml:"source,attr"` + Target string `xml:"target,attr"` + Variant string `xml:"variant,attr"` + Direction string `xml:"direction,attr"` + Visibility string `xml:"visibility,attr"` + Comment []*Common `xml:"comment"` + TRule []*Common `xml:"tRule"` + } `xml:"transform"` + } `xml:"transforms"` + Metadata *struct { + Common + AttributeOrder *Common `xml:"attributeOrder"` + ElementOrder *Common `xml:"elementOrder"` + SerialElements *Common `xml:"serialElements"` + Suppress *struct { + Common + Attributes []*struct { + Common + Element string `xml:"element,attr"` + Attribute string `xml:"attribute,attr"` + AttributeValue string `xml:"attributeValue,attr"` + } `xml:"attributes"` + } `xml:"suppress"` + Validity *struct { + Common + Variable []*struct { + Common + Id string `xml:"id,attr"` + } `xml:"variable"` + AttributeValues []*struct { + Common + Dtds string `xml:"dtds,attr"` + Elements string `xml:"elements,attr"` + Attributes string `xml:"attributes,attr"` + Order string `xml:"order,attr"` + } `xml:"attributeValues"` + } `xml:"validity"` + Alias *struct { + Common + LanguageAlias []*struct { + Common + Replacement string `xml:"replacement,attr"` + Reason string `xml:"reason,attr"` + } `xml:"languageAlias"` + ScriptAlias []*struct { + Common + Replacement string `xml:"replacement,attr"` + Reason string `xml:"reason,attr"` + } `xml:"scriptAlias"` + TerritoryAlias []*struct { + Common + Replacement string `xml:"replacement,attr"` + Reason string `xml:"reason,attr"` + } `xml:"territoryAlias"` + SubdivisionAlias []*struct { + Common + Replacement string `xml:"replacement,attr"` + Reason string `xml:"reason,attr"` + } `xml:"subdivisionAlias"` + VariantAlias []*struct { + Common + Replacement string `xml:"replacement,attr"` + Reason string `xml:"reason,attr"` + } `xml:"variantAlias"` + ZoneAlias []*struct { + Common + Replacement string `xml:"replacement,attr"` + Reason string `xml:"reason,attr"` + } `xml:"zoneAlias"` + } `xml:"alias"` + Deprecated *struct { + Common + DeprecatedItems []*struct { + Common + Elements string `xml:"elements,attr"` + Attributes string `xml:"attributes,attr"` + Values string `xml:"values,attr"` + } `xml:"deprecatedItems"` + } `xml:"deprecated"` + Distinguishing *struct { + Common + DistinguishingItems []*struct { + Common + Exclude string `xml:"exclude,attr"` + Elements string `xml:"elements,attr"` + Attributes string `xml:"attributes,attr"` + } `xml:"distinguishingItems"` + } `xml:"distinguishing"` + Blocking *struct { + Common + BlockingItems []*struct { + Common + Elements string `xml:"elements,attr"` + } `xml:"blockingItems"` + } `xml:"blocking"` + CoverageAdditions *struct { + Common + LanguageCoverage []*struct { + Common + Values string `xml:"values,attr"` + } `xml:"languageCoverage"` + ScriptCoverage []*struct { + Common + Values string `xml:"values,attr"` + } `xml:"scriptCoverage"` + TerritoryCoverage []*struct { + Common + Values string `xml:"values,attr"` + } `xml:"territoryCoverage"` + CurrencyCoverage []*struct { + Common + Values string `xml:"values,attr"` + } `xml:"currencyCoverage"` + TimezoneCoverage []*struct { + Common + Values string `xml:"values,attr"` + } `xml:"timezoneCoverage"` + } `xml:"coverageAdditions"` + SkipDefaultLocale *struct { + Common + Services string `xml:"services,attr"` + } `xml:"skipDefaultLocale"` + DefaultContent *struct { + Common + Locales string `xml:"locales,attr"` + } `xml:"defaultContent"` + } `xml:"metadata"` + CodeMappings *struct { + Common + LanguageCodes []*struct { + Common + Alpha3 string `xml:"alpha3,attr"` + } `xml:"languageCodes"` + TerritoryCodes []*struct { + Common + Numeric string `xml:"numeric,attr"` + Alpha3 string `xml:"alpha3,attr"` + Fips10 string `xml:"fips10,attr"` + Internet string `xml:"internet,attr"` + } `xml:"territoryCodes"` + CurrencyCodes []*struct { + Common + Numeric string `xml:"numeric,attr"` + } `xml:"currencyCodes"` + } `xml:"codeMappings"` + ParentLocales *struct { + Common + ParentLocale []*struct { + Common + Parent string `xml:"parent,attr"` + Locales string `xml:"locales,attr"` + } `xml:"parentLocale"` + } `xml:"parentLocales"` + LikelySubtags *struct { + Common + LikelySubtag []*struct { + Common + From string `xml:"from,attr"` + To string `xml:"to,attr"` + } `xml:"likelySubtag"` + } `xml:"likelySubtags"` + MetazoneInfo *struct { + Common + Timezone []*struct { + Common + UsesMetazone []*struct { + Common + From string `xml:"from,attr"` + To string `xml:"to,attr"` + Mzone string `xml:"mzone,attr"` + } `xml:"usesMetazone"` + } `xml:"timezone"` + } `xml:"metazoneInfo"` + Plurals []*struct { + Common + PluralRules []*struct { + Common + Locales string `xml:"locales,attr"` + PluralRule []*struct { + Common + Count string `xml:"count,attr"` + } `xml:"pluralRule"` + } `xml:"pluralRules"` + PluralRanges []*struct { + Common + Locales string `xml:"locales,attr"` + PluralRange []*struct { + Common + Start string `xml:"start,attr"` + End string `xml:"end,attr"` + Result string `xml:"result,attr"` + } `xml:"pluralRange"` + } `xml:"pluralRanges"` + } `xml:"plurals"` + TelephoneCodeData *struct { + Common + CodesByTerritory []*struct { + Common + Territory string `xml:"territory,attr"` + TelephoneCountryCode []*struct { + Common + Code string `xml:"code,attr"` + From string `xml:"from,attr"` + To string `xml:"to,attr"` + } `xml:"telephoneCountryCode"` + } `xml:"codesByTerritory"` + } `xml:"telephoneCodeData"` + NumberingSystems *struct { + Common + NumberingSystem []*struct { + Common + Id string `xml:"id,attr"` + Radix string `xml:"radix,attr"` + Digits string `xml:"digits,attr"` + Rules string `xml:"rules,attr"` + } `xml:"numberingSystem"` + } `xml:"numberingSystems"` + Bcp47KeywordMappings *struct { + Common + MapKeys *struct { + Common + KeyMap []*struct { + Common + Bcp47 string `xml:"bcp47,attr"` + } `xml:"keyMap"` + } `xml:"mapKeys"` + MapTypes []*struct { + Common + TypeMap []*struct { + Common + Bcp47 string `xml:"bcp47,attr"` + } `xml:"typeMap"` + } `xml:"mapTypes"` + } `xml:"bcp47KeywordMappings"` + Gender *struct { + Common + PersonList []*struct { + Common + Locales string `xml:"locales,attr"` + } `xml:"personList"` + } `xml:"gender"` + References *struct { + Common + Reference []*struct { + Common + Uri string `xml:"uri,attr"` + } `xml:"reference"` + } `xml:"references"` + LanguageMatching *struct { + Common + LanguageMatches []*struct { + Common + LanguageMatch []*struct { + Common + Desired string `xml:"desired,attr"` + Oneway string `xml:"oneway,attr"` + Percent string `xml:"percent,attr"` + Supported string `xml:"supported,attr"` + } `xml:"languageMatch"` + } `xml:"languageMatches"` + } `xml:"languageMatching"` + DayPeriodRuleSet []*struct { + Common + DayPeriodRules []*struct { + Common + Locales string `xml:"locales,attr"` + DayPeriodRule []*struct { + Common + At string `xml:"at,attr"` + After string `xml:"after,attr"` + Before string `xml:"before,attr"` + From string `xml:"from,attr"` + To string `xml:"to,attr"` + } `xml:"dayPeriodRule"` + } `xml:"dayPeriodRules"` + } `xml:"dayPeriodRuleSet"` + MetaZones *struct { + Common + MetazoneInfo *struct { + Common + Timezone []*struct { + Common + UsesMetazone []*struct { + Common + From string `xml:"from,attr"` + To string `xml:"to,attr"` + Mzone string `xml:"mzone,attr"` + } `xml:"usesMetazone"` + } `xml:"timezone"` + } `xml:"metazoneInfo"` + MapTimezones *struct { + Common + OtherVersion string `xml:"otherVersion,attr"` + TypeVersion string `xml:"typeVersion,attr"` + MapZone []*struct { + Common + Other string `xml:"other,attr"` + Territory string `xml:"territory,attr"` + } `xml:"mapZone"` + } `xml:"mapTimezones"` + } `xml:"metaZones"` + PrimaryZones *struct { + Common + PrimaryZone []*struct { + Common + Iso3166 string `xml:"iso3166,attr"` + } `xml:"primaryZone"` + } `xml:"primaryZones"` + WindowsZones *struct { + Common + MapTimezones *struct { + Common + OtherVersion string `xml:"otherVersion,attr"` + TypeVersion string `xml:"typeVersion,attr"` + MapZone []*struct { + Common + Other string `xml:"other,attr"` + Territory string `xml:"territory,attr"` + } `xml:"mapZone"` + } `xml:"mapTimezones"` + } `xml:"windowsZones"` + CoverageLevels *struct { + Common + ApprovalRequirements *struct { + Common + ApprovalRequirement []*struct { + Common + Votes string `xml:"votes,attr"` + Locales string `xml:"locales,attr"` + Paths string `xml:"paths,attr"` + } `xml:"approvalRequirement"` + } `xml:"approvalRequirements"` + CoverageVariable []*struct { + Common + Key string `xml:"key,attr"` + Value string `xml:"value,attr"` + } `xml:"coverageVariable"` + CoverageLevel []*struct { + Common + InLanguage string `xml:"inLanguage,attr"` + InScript string `xml:"inScript,attr"` + InTerritory string `xml:"inTerritory,attr"` + Value string `xml:"value,attr"` + Match string `xml:"match,attr"` + } `xml:"coverageLevel"` + } `xml:"coverageLevels"` + IdValidity *struct { + Common + Id []*struct { + Common + IdStatus string `xml:"idStatus,attr"` + } `xml:"id"` + } `xml:"idValidity"` +} + +// LDML is the top-level type for locale-specific data. +type LDML struct { + Common + Version string `xml:"version,attr"` + Identity *struct { + Common + Version *struct { + Common + Number string `xml:"number,attr"` + } `xml:"version"` + Generation *struct { + Common + Date string `xml:"date,attr"` + } `xml:"generation"` + Language *Common `xml:"language"` + Script *Common `xml:"script"` + Territory *Common `xml:"territory"` + Variant *Common `xml:"variant"` + } `xml:"identity"` + LocaleDisplayNames *LocaleDisplayNames `xml:"localeDisplayNames"` + Layout *struct { + Common + Orientation []*struct { + Common + Characters string `xml:"characters,attr"` + Lines string `xml:"lines,attr"` + CharacterOrder []*Common `xml:"characterOrder"` + LineOrder []*Common `xml:"lineOrder"` + } `xml:"orientation"` + InList []*struct { + Common + Casing string `xml:"casing,attr"` + } `xml:"inList"` + InText []*Common `xml:"inText"` + } `xml:"layout"` + ContextTransforms *struct { + Common + ContextTransformUsage []*struct { + Common + ContextTransform []*Common `xml:"contextTransform"` + } `xml:"contextTransformUsage"` + } `xml:"contextTransforms"` + Characters *struct { + Common + ExemplarCharacters []*Common `xml:"exemplarCharacters"` + Ellipsis []*Common `xml:"ellipsis"` + MoreInformation []*Common `xml:"moreInformation"` + Stopwords []*struct { + Common + StopwordList []*Common `xml:"stopwordList"` + } `xml:"stopwords"` + IndexLabels []*struct { + Common + IndexSeparator []*Common `xml:"indexSeparator"` + CompressedIndexSeparator []*Common `xml:"compressedIndexSeparator"` + IndexRangePattern []*Common `xml:"indexRangePattern"` + IndexLabelBefore []*Common `xml:"indexLabelBefore"` + IndexLabelAfter []*Common `xml:"indexLabelAfter"` + IndexLabel []*struct { + Common + IndexSource string `xml:"indexSource,attr"` + Priority string `xml:"priority,attr"` + } `xml:"indexLabel"` + } `xml:"indexLabels"` + Mapping []*struct { + Common + Registry string `xml:"registry,attr"` + } `xml:"mapping"` + } `xml:"characters"` + Delimiters *struct { + Common + QuotationStart []*Common `xml:"quotationStart"` + QuotationEnd []*Common `xml:"quotationEnd"` + AlternateQuotationStart []*Common `xml:"alternateQuotationStart"` + AlternateQuotationEnd []*Common `xml:"alternateQuotationEnd"` + } `xml:"delimiters"` + Measurement *struct { + Common + MeasurementSystem []*Common `xml:"measurementSystem"` + PaperSize []*struct { + Common + Height []*Common `xml:"height"` + Width []*Common `xml:"width"` + } `xml:"paperSize"` + } `xml:"measurement"` + Dates *struct { + Common + LocalizedPatternChars []*Common `xml:"localizedPatternChars"` + DateRangePattern []*Common `xml:"dateRangePattern"` + Calendars *struct { + Common + Calendar []*Calendar `xml:"calendar"` + } `xml:"calendars"` + Fields *struct { + Common + Field []*struct { + Common + DisplayName []*struct { + Common + Count string `xml:"count,attr"` + } `xml:"displayName"` + Relative []*Common `xml:"relative"` + RelativeTime []*struct { + Common + RelativeTimePattern []*struct { + Common + Count string `xml:"count,attr"` + } `xml:"relativeTimePattern"` + } `xml:"relativeTime"` + } `xml:"field"` + } `xml:"fields"` + TimeZoneNames *TimeZoneNames `xml:"timeZoneNames"` + } `xml:"dates"` + Numbers *Numbers `xml:"numbers"` + Units *struct { + Common + Unit []*struct { + Common + DisplayName []*struct { + Common + Count string `xml:"count,attr"` + } `xml:"displayName"` + UnitPattern []*struct { + Common + Count string `xml:"count,attr"` + } `xml:"unitPattern"` + PerUnitPattern []*Common `xml:"perUnitPattern"` + } `xml:"unit"` + UnitLength []*struct { + Common + CompoundUnit []*struct { + Common + CompoundUnitPattern []*Common `xml:"compoundUnitPattern"` + } `xml:"compoundUnit"` + Unit []*struct { + Common + DisplayName []*struct { + Common + Count string `xml:"count,attr"` + } `xml:"displayName"` + UnitPattern []*struct { + Common + Count string `xml:"count,attr"` + } `xml:"unitPattern"` + PerUnitPattern []*Common `xml:"perUnitPattern"` + } `xml:"unit"` + CoordinateUnit []*struct { + Common + CoordinateUnitPattern []*Common `xml:"coordinateUnitPattern"` + } `xml:"coordinateUnit"` + } `xml:"unitLength"` + DurationUnit []*struct { + Common + DurationUnitPattern []*Common `xml:"durationUnitPattern"` + } `xml:"durationUnit"` + } `xml:"units"` + ListPatterns *struct { + Common + ListPattern []*struct { + Common + ListPatternPart []*Common `xml:"listPatternPart"` + } `xml:"listPattern"` + } `xml:"listPatterns"` + Collations *struct { + Common + Version string `xml:"version,attr"` + DefaultCollation *Common `xml:"defaultCollation"` + Collation []*Collation `xml:"collation"` + } `xml:"collations"` + Posix *struct { + Common + Messages []*struct { + Common + Yesstr []*Common `xml:"yesstr"` + Nostr []*Common `xml:"nostr"` + Yesexpr []*Common `xml:"yesexpr"` + Noexpr []*Common `xml:"noexpr"` + } `xml:"messages"` + } `xml:"posix"` + Segmentations *struct { + Common + Segmentation []*struct { + Common + Variables *struct { + Common + Variable []*struct { + Common + Id string `xml:"id,attr"` + } `xml:"variable"` + } `xml:"variables"` + SegmentRules *struct { + Common + Rule []*struct { + Common + Id string `xml:"id,attr"` + } `xml:"rule"` + } `xml:"segmentRules"` + Exceptions *struct { + Common + Exception []*Common `xml:"exception"` + } `xml:"exceptions"` + Suppressions *struct { + Common + Suppression []*Common `xml:"suppression"` + } `xml:"suppressions"` + } `xml:"segmentation"` + } `xml:"segmentations"` + Rbnf *struct { + Common + RulesetGrouping []*struct { + Common + Ruleset []*struct { + Common + Access string `xml:"access,attr"` + AllowsParsing string `xml:"allowsParsing,attr"` + Rbnfrule []*struct { + Common + Value string `xml:"value,attr"` + Radix string `xml:"radix,attr"` + Decexp string `xml:"decexp,attr"` + } `xml:"rbnfrule"` + } `xml:"ruleset"` + } `xml:"rulesetGrouping"` + } `xml:"rbnf"` + Annotations *struct { + Common + Annotation []*struct { + Common + Cp string `xml:"cp,attr"` + Tts string `xml:"tts,attr"` + } `xml:"annotation"` + } `xml:"annotations"` + Metadata *struct { + Common + CasingData *struct { + Common + CasingItem []*struct { + Common + Override string `xml:"override,attr"` + ForceError string `xml:"forceError,attr"` + } `xml:"casingItem"` + } `xml:"casingData"` + } `xml:"metadata"` + References *struct { + Common + Reference []*struct { + Common + Uri string `xml:"uri,attr"` + } `xml:"reference"` + } `xml:"references"` +} + +// Collation contains rules that specify a certain sort-order, +// as a tailoring of the root order. +// The parsed rules are obtained by passing a RuleProcessor to Collation's +// Process method. +type Collation struct { + Common + Visibility string `xml:"visibility,attr"` + Base *Common `xml:"base"` + Import []*struct { + Common + Source string `xml:"source,attr"` + } `xml:"import"` + Settings *struct { + Common + Strength string `xml:"strength,attr"` + Alternate string `xml:"alternate,attr"` + Backwards string `xml:"backwards,attr"` + Normalization string `xml:"normalization,attr"` + CaseLevel string `xml:"caseLevel,attr"` + CaseFirst string `xml:"caseFirst,attr"` + HiraganaQuaternary string `xml:"hiraganaQuaternary,attr"` + MaxVariable string `xml:"maxVariable,attr"` + Numeric string `xml:"numeric,attr"` + Private string `xml:"private,attr"` + VariableTop string `xml:"variableTop,attr"` + Reorder string `xml:"reorder,attr"` + } `xml:"settings"` + SuppressContractions *Common `xml:"suppress_contractions"` + Optimize *Common `xml:"optimize"` + Cr []*Common `xml:"cr"` + rulesElem +} + +// Calendar specifies the fields used for formatting and parsing dates and times. +// The month and quarter names are identified numerically, starting at 1. +// The day (of the week) names are identified with short strings, since there is +// no universally-accepted numeric designation. +type Calendar struct { + Common + Months *struct { + Common + MonthContext []*struct { + Common + MonthWidth []*struct { + Common + Month []*struct { + Common + Yeartype string `xml:"yeartype,attr"` + } `xml:"month"` + } `xml:"monthWidth"` + } `xml:"monthContext"` + } `xml:"months"` + MonthNames *struct { + Common + Month []*struct { + Common + Yeartype string `xml:"yeartype,attr"` + } `xml:"month"` + } `xml:"monthNames"` + MonthAbbr *struct { + Common + Month []*struct { + Common + Yeartype string `xml:"yeartype,attr"` + } `xml:"month"` + } `xml:"monthAbbr"` + MonthPatterns *struct { + Common + MonthPatternContext []*struct { + Common + MonthPatternWidth []*struct { + Common + MonthPattern []*Common `xml:"monthPattern"` + } `xml:"monthPatternWidth"` + } `xml:"monthPatternContext"` + } `xml:"monthPatterns"` + Days *struct { + Common + DayContext []*struct { + Common + DayWidth []*struct { + Common + Day []*Common `xml:"day"` + } `xml:"dayWidth"` + } `xml:"dayContext"` + } `xml:"days"` + DayNames *struct { + Common + Day []*Common `xml:"day"` + } `xml:"dayNames"` + DayAbbr *struct { + Common + Day []*Common `xml:"day"` + } `xml:"dayAbbr"` + Quarters *struct { + Common + QuarterContext []*struct { + Common + QuarterWidth []*struct { + Common + Quarter []*Common `xml:"quarter"` + } `xml:"quarterWidth"` + } `xml:"quarterContext"` + } `xml:"quarters"` + Week *struct { + Common + MinDays []*struct { + Common + Count string `xml:"count,attr"` + } `xml:"minDays"` + FirstDay []*struct { + Common + Day string `xml:"day,attr"` + } `xml:"firstDay"` + WeekendStart []*struct { + Common + Day string `xml:"day,attr"` + Time string `xml:"time,attr"` + } `xml:"weekendStart"` + WeekendEnd []*struct { + Common + Day string `xml:"day,attr"` + Time string `xml:"time,attr"` + } `xml:"weekendEnd"` + } `xml:"week"` + Am []*Common `xml:"am"` + Pm []*Common `xml:"pm"` + DayPeriods *struct { + Common + DayPeriodContext []*struct { + Common + DayPeriodWidth []*struct { + Common + DayPeriod []*Common `xml:"dayPeriod"` + } `xml:"dayPeriodWidth"` + } `xml:"dayPeriodContext"` + } `xml:"dayPeriods"` + Eras *struct { + Common + EraNames *struct { + Common + Era []*Common `xml:"era"` + } `xml:"eraNames"` + EraAbbr *struct { + Common + Era []*Common `xml:"era"` + } `xml:"eraAbbr"` + EraNarrow *struct { + Common + Era []*Common `xml:"era"` + } `xml:"eraNarrow"` + } `xml:"eras"` + CyclicNameSets *struct { + Common + CyclicNameSet []*struct { + Common + CyclicNameContext []*struct { + Common + CyclicNameWidth []*struct { + Common + CyclicName []*Common `xml:"cyclicName"` + } `xml:"cyclicNameWidth"` + } `xml:"cyclicNameContext"` + } `xml:"cyclicNameSet"` + } `xml:"cyclicNameSets"` + DateFormats *struct { + Common + DateFormatLength []*struct { + Common + DateFormat []*struct { + Common + Pattern []*struct { + Common + Numbers string `xml:"numbers,attr"` + Count string `xml:"count,attr"` + } `xml:"pattern"` + DisplayName []*struct { + Common + Count string `xml:"count,attr"` + } `xml:"displayName"` + } `xml:"dateFormat"` + } `xml:"dateFormatLength"` + } `xml:"dateFormats"` + TimeFormats *struct { + Common + TimeFormatLength []*struct { + Common + TimeFormat []*struct { + Common + Pattern []*struct { + Common + Numbers string `xml:"numbers,attr"` + Count string `xml:"count,attr"` + } `xml:"pattern"` + DisplayName []*struct { + Common + Count string `xml:"count,attr"` + } `xml:"displayName"` + } `xml:"timeFormat"` + } `xml:"timeFormatLength"` + } `xml:"timeFormats"` + DateTimeFormats *struct { + Common + DateTimeFormatLength []*struct { + Common + DateTimeFormat []*struct { + Common + Pattern []*struct { + Common + Numbers string `xml:"numbers,attr"` + Count string `xml:"count,attr"` + } `xml:"pattern"` + DisplayName []*struct { + Common + Count string `xml:"count,attr"` + } `xml:"displayName"` + } `xml:"dateTimeFormat"` + } `xml:"dateTimeFormatLength"` + AvailableFormats []*struct { + Common + DateFormatItem []*struct { + Common + Id string `xml:"id,attr"` + } `xml:"dateFormatItem"` + } `xml:"availableFormats"` + AppendItems []*struct { + Common + AppendItem []*struct { + Common + Request string `xml:"request,attr"` + } `xml:"appendItem"` + } `xml:"appendItems"` + IntervalFormats []*struct { + Common + IntervalFormatFallback []*Common `xml:"intervalFormatFallback"` + IntervalFormatItem []*struct { + Common + Id string `xml:"id,attr"` + GreatestDifference []*struct { + Common + Id string `xml:"id,attr"` + } `xml:"greatestDifference"` + } `xml:"intervalFormatItem"` + } `xml:"intervalFormats"` + } `xml:"dateTimeFormats"` + Fields []*struct { + Common + Field []*struct { + Common + DisplayName []*struct { + Common + Count string `xml:"count,attr"` + } `xml:"displayName"` + Relative []*Common `xml:"relative"` + RelativeTime []*struct { + Common + RelativeTimePattern []*struct { + Common + Count string `xml:"count,attr"` + } `xml:"relativeTimePattern"` + } `xml:"relativeTime"` + } `xml:"field"` + } `xml:"fields"` +} +type TimeZoneNames struct { + Common + HourFormat []*Common `xml:"hourFormat"` + HoursFormat []*Common `xml:"hoursFormat"` + GmtFormat []*Common `xml:"gmtFormat"` + GmtZeroFormat []*Common `xml:"gmtZeroFormat"` + RegionFormat []*Common `xml:"regionFormat"` + FallbackFormat []*Common `xml:"fallbackFormat"` + FallbackRegionFormat []*Common `xml:"fallbackRegionFormat"` + AbbreviationFallback []*Common `xml:"abbreviationFallback"` + PreferenceOrdering []*Common `xml:"preferenceOrdering"` + SingleCountries []*struct { + Common + List string `xml:"list,attr"` + } `xml:"singleCountries"` + Zone []*struct { + Common + Long []*struct { + Common + Generic []*Common `xml:"generic"` + Standard []*Common `xml:"standard"` + Daylight []*Common `xml:"daylight"` + } `xml:"long"` + Short []*struct { + Common + Generic []*Common `xml:"generic"` + Standard []*Common `xml:"standard"` + Daylight []*Common `xml:"daylight"` + } `xml:"short"` + CommonlyUsed []*struct { + Common + Used string `xml:"used,attr"` + } `xml:"commonlyUsed"` + ExemplarCity []*Common `xml:"exemplarCity"` + } `xml:"zone"` + Metazone []*struct { + Common + Long []*struct { + Common + Generic []*Common `xml:"generic"` + Standard []*Common `xml:"standard"` + Daylight []*Common `xml:"daylight"` + } `xml:"long"` + Short []*struct { + Common + Generic []*Common `xml:"generic"` + Standard []*Common `xml:"standard"` + Daylight []*Common `xml:"daylight"` + } `xml:"short"` + CommonlyUsed []*struct { + Common + Used string `xml:"used,attr"` + } `xml:"commonlyUsed"` + } `xml:"metazone"` +} + +// LocaleDisplayNames specifies localized display names for for scripts, languages, +// countries, currencies, and variants. +type LocaleDisplayNames struct { + Common + LocaleDisplayPattern *struct { + Common + LocalePattern []*Common `xml:"localePattern"` + LocaleSeparator []*Common `xml:"localeSeparator"` + LocaleKeyTypePattern []*Common `xml:"localeKeyTypePattern"` + } `xml:"localeDisplayPattern"` + Languages *struct { + Common + Language []*Common `xml:"language"` + } `xml:"languages"` + Scripts *struct { + Common + Script []*Common `xml:"script"` + } `xml:"scripts"` + Territories *struct { + Common + Territory []*Common `xml:"territory"` + } `xml:"territories"` + Subdivisions *struct { + Common + Subdivision []*Common `xml:"subdivision"` + } `xml:"subdivisions"` + Variants *struct { + Common + Variant []*Common `xml:"variant"` + } `xml:"variants"` + Keys *struct { + Common + Key []*Common `xml:"key"` + } `xml:"keys"` + Types *struct { + Common + Type []*struct { + Common + Key string `xml:"key,attr"` + } `xml:"type"` + } `xml:"types"` + TransformNames *struct { + Common + TransformName []*Common `xml:"transformName"` + } `xml:"transformNames"` + MeasurementSystemNames *struct { + Common + MeasurementSystemName []*Common `xml:"measurementSystemName"` + } `xml:"measurementSystemNames"` + CodePatterns *struct { + Common + CodePattern []*Common `xml:"codePattern"` + } `xml:"codePatterns"` +} + +// Numbers supplies information for formatting and parsing numbers and currencies. +type Numbers struct { + Common + DefaultNumberingSystem []*Common `xml:"defaultNumberingSystem"` + OtherNumberingSystems []*struct { + Common + Native []*Common `xml:"native"` + Traditional []*Common `xml:"traditional"` + Finance []*Common `xml:"finance"` + } `xml:"otherNumberingSystems"` + MinimumGroupingDigits []*Common `xml:"minimumGroupingDigits"` + Symbols []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + Decimal []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + } `xml:"decimal"` + Group []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + } `xml:"group"` + List []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + } `xml:"list"` + PercentSign []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + } `xml:"percentSign"` + NativeZeroDigit []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + } `xml:"nativeZeroDigit"` + PatternDigit []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + } `xml:"patternDigit"` + PlusSign []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + } `xml:"plusSign"` + MinusSign []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + } `xml:"minusSign"` + Exponential []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + } `xml:"exponential"` + SuperscriptingExponent []*Common `xml:"superscriptingExponent"` + PerMille []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + } `xml:"perMille"` + Infinity []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + } `xml:"infinity"` + Nan []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + } `xml:"nan"` + CurrencyDecimal []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + } `xml:"currencyDecimal"` + CurrencyGroup []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + } `xml:"currencyGroup"` + TimeSeparator []*Common `xml:"timeSeparator"` + } `xml:"symbols"` + DecimalFormats []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + DecimalFormatLength []*struct { + Common + DecimalFormat []*struct { + Common + Pattern []*struct { + Common + Numbers string `xml:"numbers,attr"` + Count string `xml:"count,attr"` + } `xml:"pattern"` + } `xml:"decimalFormat"` + } `xml:"decimalFormatLength"` + } `xml:"decimalFormats"` + ScientificFormats []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + ScientificFormatLength []*struct { + Common + ScientificFormat []*struct { + Common + Pattern []*struct { + Common + Numbers string `xml:"numbers,attr"` + Count string `xml:"count,attr"` + } `xml:"pattern"` + } `xml:"scientificFormat"` + } `xml:"scientificFormatLength"` + } `xml:"scientificFormats"` + PercentFormats []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + PercentFormatLength []*struct { + Common + PercentFormat []*struct { + Common + Pattern []*struct { + Common + Numbers string `xml:"numbers,attr"` + Count string `xml:"count,attr"` + } `xml:"pattern"` + } `xml:"percentFormat"` + } `xml:"percentFormatLength"` + } `xml:"percentFormats"` + CurrencyFormats []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + CurrencySpacing []*struct { + Common + BeforeCurrency []*struct { + Common + CurrencyMatch []*Common `xml:"currencyMatch"` + SurroundingMatch []*Common `xml:"surroundingMatch"` + InsertBetween []*Common `xml:"insertBetween"` + } `xml:"beforeCurrency"` + AfterCurrency []*struct { + Common + CurrencyMatch []*Common `xml:"currencyMatch"` + SurroundingMatch []*Common `xml:"surroundingMatch"` + InsertBetween []*Common `xml:"insertBetween"` + } `xml:"afterCurrency"` + } `xml:"currencySpacing"` + CurrencyFormatLength []*struct { + Common + CurrencyFormat []*struct { + Common + Pattern []*struct { + Common + Numbers string `xml:"numbers,attr"` + Count string `xml:"count,attr"` + } `xml:"pattern"` + } `xml:"currencyFormat"` + } `xml:"currencyFormatLength"` + UnitPattern []*struct { + Common + Count string `xml:"count,attr"` + } `xml:"unitPattern"` + } `xml:"currencyFormats"` + Currencies *struct { + Common + Currency []*struct { + Common + Pattern []*struct { + Common + Numbers string `xml:"numbers,attr"` + Count string `xml:"count,attr"` + } `xml:"pattern"` + DisplayName []*struct { + Common + Count string `xml:"count,attr"` + } `xml:"displayName"` + Symbol []*Common `xml:"symbol"` + Decimal []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + } `xml:"decimal"` + Group []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + } `xml:"group"` + } `xml:"currency"` + } `xml:"currencies"` + MiscPatterns []*struct { + Common + NumberSystem string `xml:"numberSystem,attr"` + Pattern []*struct { + Common + Numbers string `xml:"numbers,attr"` + Count string `xml:"count,attr"` + } `xml:"pattern"` + } `xml:"miscPatterns"` +} + +// Version is the version of CLDR from which the XML definitions are generated. +const Version = "28" diff --git a/vendor/golang.org/x/text/unicode/doc.go b/vendor/golang.org/x/text/unicode/doc.go new file mode 100644 index 0000000000..e8f1032d05 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/doc.go @@ -0,0 +1,8 @@ +// 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. + +// unicode holds packages with implementations of Unicode standards that are +// mostly used as building blocks for other packages in golang.org/x/text, +// layout engines, or are otherwise more low-level in nature. +package unicode diff --git a/vendor/golang.org/x/text/unicode/norm/composition.go b/vendor/golang.org/x/text/unicode/norm/composition.go new file mode 100644 index 0000000000..d17b278adc --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/composition.go @@ -0,0 +1,514 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package norm + +import "unicode/utf8" + +const ( + maxNonStarters = 30 + // The maximum number of characters needed for a buffer is + // maxNonStarters + 1 for the starter + 1 for the GCJ + maxBufferSize = maxNonStarters + 2 + maxNFCExpansion = 3 // NFC(0x1D160) + maxNFKCExpansion = 18 // NFKC(0xFDFA) + + maxByteBufferSize = utf8.UTFMax * maxBufferSize // 128 +) + +// ssState is used for reporting the segment state after inserting a rune. +// It is returned by streamSafe.next. +type ssState int + +const ( + // Indicates a rune was successfully added to the segment. + ssSuccess ssState = iota + // Indicates a rune starts a new segment and should not be added. + ssStarter + // Indicates a rune caused a segment overflow and a CGJ should be inserted. + ssOverflow +) + +// streamSafe implements the policy of when a CGJ should be inserted. +type streamSafe uint8 + +// mkStreamSafe is a shorthand for declaring a streamSafe var and calling +// first on it. +func mkStreamSafe(p Properties) streamSafe { + return streamSafe(p.nTrailingNonStarters()) +} + +// first inserts the first rune of a segment. +func (ss *streamSafe) first(p Properties) { + if *ss != 0 { + panic("!= 0") + } + *ss = streamSafe(p.nTrailingNonStarters()) +} + +// insert returns a ssState value to indicate whether a rune represented by p +// can be inserted. +func (ss *streamSafe) next(p Properties) ssState { + if *ss > maxNonStarters { + panic("streamSafe was not reset") + } + n := p.nLeadingNonStarters() + if *ss += streamSafe(n); *ss > maxNonStarters { + *ss = 0 + return ssOverflow + } + // The Stream-Safe Text Processing prescribes that the counting can stop + // as soon as a starter is encountered. However, there are some starters, + // like Jamo V and T, that can combine with other runes, leaving their + // successive non-starters appended to the previous, possibly causing an + // overflow. We will therefore consider any rune with a non-zero nLead to + // be a non-starter. Note that it always hold that if nLead > 0 then + // nLead == nTrail. + if n == 0 { + *ss = 0 + return ssStarter + } + return ssSuccess +} + +// backwards is used for checking for overflow and segment starts +// when traversing a string backwards. Users do not need to call first +// for the first rune. The state of the streamSafe retains the count of +// the non-starters loaded. +func (ss *streamSafe) backwards(p Properties) ssState { + if *ss > maxNonStarters { + panic("streamSafe was not reset") + } + c := *ss + streamSafe(p.nTrailingNonStarters()) + if c > maxNonStarters { + return ssOverflow + } + *ss = c + if p.nLeadingNonStarters() == 0 { + return ssStarter + } + return ssSuccess +} + +func (ss streamSafe) isMax() bool { + return ss == maxNonStarters +} + +// GraphemeJoiner is inserted after maxNonStarters non-starter runes. +const GraphemeJoiner = "\u034F" + +// reorderBuffer is used to normalize a single segment. Characters inserted with +// insert are decomposed and reordered based on CCC. The compose method can +// be used to recombine characters. Note that the byte buffer does not hold +// the UTF-8 characters in order. Only the rune array is maintained in sorted +// order. flush writes the resulting segment to a byte array. +type reorderBuffer struct { + rune [maxBufferSize]Properties // Per character info. + byte [maxByteBufferSize]byte // UTF-8 buffer. Referenced by runeInfo.pos. + nbyte uint8 // Number or bytes. + ss streamSafe // For limiting length of non-starter sequence. + nrune int // Number of runeInfos. + f formInfo + + src input + nsrc int + tmpBytes input + + out []byte + flushF func(*reorderBuffer) bool +} + +func (rb *reorderBuffer) init(f Form, src []byte) { + rb.f = *formTable[f] + rb.src.setBytes(src) + rb.nsrc = len(src) + rb.ss = 0 +} + +func (rb *reorderBuffer) initString(f Form, src string) { + rb.f = *formTable[f] + rb.src.setString(src) + rb.nsrc = len(src) + rb.ss = 0 +} + +func (rb *reorderBuffer) setFlusher(out []byte, f func(*reorderBuffer) bool) { + rb.out = out + rb.flushF = f +} + +// reset discards all characters from the buffer. +func (rb *reorderBuffer) reset() { + rb.nrune = 0 + rb.nbyte = 0 + rb.ss = 0 +} + +func (rb *reorderBuffer) doFlush() bool { + if rb.f.composing { + rb.compose() + } + res := rb.flushF(rb) + rb.reset() + return res +} + +// appendFlush appends the normalized segment to rb.out. +func appendFlush(rb *reorderBuffer) bool { + for i := 0; i < rb.nrune; i++ { + start := rb.rune[i].pos + end := start + rb.rune[i].size + rb.out = append(rb.out, rb.byte[start:end]...) + } + return true +} + +// flush appends the normalized segment to out and resets rb. +func (rb *reorderBuffer) flush(out []byte) []byte { + for i := 0; i < rb.nrune; i++ { + start := rb.rune[i].pos + end := start + rb.rune[i].size + out = append(out, rb.byte[start:end]...) + } + rb.reset() + return out +} + +// flushCopy copies the normalized segment to buf and resets rb. +// It returns the number of bytes written to buf. +func (rb *reorderBuffer) flushCopy(buf []byte) int { + p := 0 + for i := 0; i < rb.nrune; i++ { + runep := rb.rune[i] + p += copy(buf[p:], rb.byte[runep.pos:runep.pos+runep.size]) + } + rb.reset() + return p +} + +// insertOrdered inserts a rune in the buffer, ordered by Canonical Combining Class. +// It returns false if the buffer is not large enough to hold the rune. +// It is used internally by insert and insertString only. +func (rb *reorderBuffer) insertOrdered(info Properties) { + n := rb.nrune + b := rb.rune[:] + cc := info.ccc + if cc > 0 { + // Find insertion position + move elements to make room. + for ; n > 0; n-- { + if b[n-1].ccc <= cc { + break + } + b[n] = b[n-1] + } + } + rb.nrune += 1 + pos := uint8(rb.nbyte) + rb.nbyte += utf8.UTFMax + info.pos = pos + b[n] = info +} + +// insertErr is an error code returned by insert. Using this type instead +// of error improves performance up to 20% for many of the benchmarks. +type insertErr int + +const ( + iSuccess insertErr = -iota + iShortDst + iShortSrc +) + +// insertFlush inserts the given rune in the buffer ordered by CCC. +// If a decomposition with multiple segments are encountered, they leading +// ones are flushed. +// It returns a non-zero error code if the rune was not inserted. +func (rb *reorderBuffer) insertFlush(src input, i int, info Properties) insertErr { + if rune := src.hangul(i); rune != 0 { + rb.decomposeHangul(rune) + return iSuccess + } + if info.hasDecomposition() { + return rb.insertDecomposed(info.Decomposition()) + } + rb.insertSingle(src, i, info) + return iSuccess +} + +// insertUnsafe inserts the given rune in the buffer ordered by CCC. +// It is assumed there is sufficient space to hold the runes. It is the +// responsibility of the caller to ensure this. This can be done by checking +// the state returned by the streamSafe type. +func (rb *reorderBuffer) insertUnsafe(src input, i int, info Properties) { + if rune := src.hangul(i); rune != 0 { + rb.decomposeHangul(rune) + } + if info.hasDecomposition() { + // TODO: inline. + rb.insertDecomposed(info.Decomposition()) + } else { + rb.insertSingle(src, i, info) + } +} + +// insertDecomposed inserts an entry in to the reorderBuffer for each rune +// in dcomp. dcomp must be a sequence of decomposed UTF-8-encoded runes. +// It flushes the buffer on each new segment start. +func (rb *reorderBuffer) insertDecomposed(dcomp []byte) insertErr { + rb.tmpBytes.setBytes(dcomp) + for i := 0; i < len(dcomp); { + info := rb.f.info(rb.tmpBytes, i) + if info.BoundaryBefore() && rb.nrune > 0 && !rb.doFlush() { + return iShortDst + } + i += copy(rb.byte[rb.nbyte:], dcomp[i:i+int(info.size)]) + rb.insertOrdered(info) + } + return iSuccess +} + +// insertSingle inserts an entry in the reorderBuffer for the rune at +// position i. info is the runeInfo for the rune at position i. +func (rb *reorderBuffer) insertSingle(src input, i int, info Properties) { + src.copySlice(rb.byte[rb.nbyte:], i, i+int(info.size)) + rb.insertOrdered(info) +} + +// insertCGJ inserts a Combining Grapheme Joiner (0x034f) into rb. +func (rb *reorderBuffer) insertCGJ() { + rb.insertSingle(input{str: GraphemeJoiner}, 0, Properties{size: uint8(len(GraphemeJoiner))}) +} + +// appendRune inserts a rune at the end of the buffer. It is used for Hangul. +func (rb *reorderBuffer) appendRune(r rune) { + bn := rb.nbyte + sz := utf8.EncodeRune(rb.byte[bn:], rune(r)) + rb.nbyte += utf8.UTFMax + rb.rune[rb.nrune] = Properties{pos: bn, size: uint8(sz)} + rb.nrune++ +} + +// assignRune sets a rune at position pos. It is used for Hangul and recomposition. +func (rb *reorderBuffer) assignRune(pos int, r rune) { + bn := rb.rune[pos].pos + sz := utf8.EncodeRune(rb.byte[bn:], rune(r)) + rb.rune[pos] = Properties{pos: bn, size: uint8(sz)} +} + +// runeAt returns the rune at position n. It is used for Hangul and recomposition. +func (rb *reorderBuffer) runeAt(n int) rune { + inf := rb.rune[n] + r, _ := utf8.DecodeRune(rb.byte[inf.pos : inf.pos+inf.size]) + return r +} + +// bytesAt returns the UTF-8 encoding of the rune at position n. +// It is used for Hangul and recomposition. +func (rb *reorderBuffer) bytesAt(n int) []byte { + inf := rb.rune[n] + return rb.byte[inf.pos : int(inf.pos)+int(inf.size)] +} + +// For Hangul we combine algorithmically, instead of using tables. +const ( + hangulBase = 0xAC00 // UTF-8(hangulBase) -> EA B0 80 + hangulBase0 = 0xEA + hangulBase1 = 0xB0 + hangulBase2 = 0x80 + + hangulEnd = hangulBase + jamoLVTCount // UTF-8(0xD7A4) -> ED 9E A4 + hangulEnd0 = 0xED + hangulEnd1 = 0x9E + hangulEnd2 = 0xA4 + + jamoLBase = 0x1100 // UTF-8(jamoLBase) -> E1 84 00 + jamoLBase0 = 0xE1 + jamoLBase1 = 0x84 + jamoLEnd = 0x1113 + jamoVBase = 0x1161 + jamoVEnd = 0x1176 + jamoTBase = 0x11A7 + jamoTEnd = 0x11C3 + + jamoTCount = 28 + jamoVCount = 21 + jamoVTCount = 21 * 28 + jamoLVTCount = 19 * 21 * 28 +) + +const hangulUTF8Size = 3 + +func isHangul(b []byte) bool { + if len(b) < hangulUTF8Size { + return false + } + b0 := b[0] + if b0 < hangulBase0 { + return false + } + b1 := b[1] + switch { + case b0 == hangulBase0: + return b1 >= hangulBase1 + case b0 < hangulEnd0: + return true + case b0 > hangulEnd0: + return false + case b1 < hangulEnd1: + return true + } + return b1 == hangulEnd1 && b[2] < hangulEnd2 +} + +func isHangulString(b string) bool { + if len(b) < hangulUTF8Size { + return false + } + b0 := b[0] + if b0 < hangulBase0 { + return false + } + b1 := b[1] + switch { + case b0 == hangulBase0: + return b1 >= hangulBase1 + case b0 < hangulEnd0: + return true + case b0 > hangulEnd0: + return false + case b1 < hangulEnd1: + return true + } + return b1 == hangulEnd1 && b[2] < hangulEnd2 +} + +// Caller must ensure len(b) >= 2. +func isJamoVT(b []byte) bool { + // True if (rune & 0xff00) == jamoLBase + return b[0] == jamoLBase0 && (b[1]&0xFC) == jamoLBase1 +} + +func isHangulWithoutJamoT(b []byte) bool { + c, _ := utf8.DecodeRune(b) + c -= hangulBase + return c < jamoLVTCount && c%jamoTCount == 0 +} + +// decomposeHangul writes the decomposed Hangul to buf and returns the number +// of bytes written. len(buf) should be at least 9. +func decomposeHangul(buf []byte, r rune) int { + const JamoUTF8Len = 3 + r -= hangulBase + x := r % jamoTCount + r /= jamoTCount + utf8.EncodeRune(buf, jamoLBase+r/jamoVCount) + utf8.EncodeRune(buf[JamoUTF8Len:], jamoVBase+r%jamoVCount) + if x != 0 { + utf8.EncodeRune(buf[2*JamoUTF8Len:], jamoTBase+x) + return 3 * JamoUTF8Len + } + return 2 * JamoUTF8Len +} + +// decomposeHangul algorithmically decomposes a Hangul rune into +// its Jamo components. +// See http://unicode.org/reports/tr15/#Hangul for details on decomposing Hangul. +func (rb *reorderBuffer) decomposeHangul(r rune) { + r -= hangulBase + x := r % jamoTCount + r /= jamoTCount + rb.appendRune(jamoLBase + r/jamoVCount) + rb.appendRune(jamoVBase + r%jamoVCount) + if x != 0 { + rb.appendRune(jamoTBase + x) + } +} + +// combineHangul algorithmically combines Jamo character components into Hangul. +// See http://unicode.org/reports/tr15/#Hangul for details on combining Hangul. +func (rb *reorderBuffer) combineHangul(s, i, k int) { + b := rb.rune[:] + bn := rb.nrune + for ; i < bn; i++ { + cccB := b[k-1].ccc + cccC := b[i].ccc + if cccB == 0 { + s = k - 1 + } + if s != k-1 && cccB >= cccC { + // b[i] is blocked by greater-equal cccX below it + b[k] = b[i] + k++ + } else { + l := rb.runeAt(s) // also used to compare to hangulBase + v := rb.runeAt(i) // also used to compare to jamoT + switch { + case jamoLBase <= l && l < jamoLEnd && + jamoVBase <= v && v < jamoVEnd: + // 11xx plus 116x to LV + rb.assignRune(s, hangulBase+ + (l-jamoLBase)*jamoVTCount+(v-jamoVBase)*jamoTCount) + case hangulBase <= l && l < hangulEnd && + jamoTBase < v && v < jamoTEnd && + ((l-hangulBase)%jamoTCount) == 0: + // ACxx plus 11Ax to LVT + rb.assignRune(s, l+v-jamoTBase) + default: + b[k] = b[i] + k++ + } + } + } + rb.nrune = k +} + +// compose recombines the runes in the buffer. +// It should only be used to recompose a single segment, as it will not +// handle alternations between Hangul and non-Hangul characters correctly. +func (rb *reorderBuffer) compose() { + // UAX #15, section X5 , including Corrigendum #5 + // "In any character sequence beginning with starter S, a character C is + // blocked from S if and only if there is some character B between S + // and C, and either B is a starter or it has the same or higher + // combining class as C." + bn := rb.nrune + if bn == 0 { + return + } + k := 1 + b := rb.rune[:] + for s, i := 0, 1; i < bn; i++ { + if isJamoVT(rb.bytesAt(i)) { + // Redo from start in Hangul mode. Necessary to support + // U+320E..U+321E in NFKC mode. + rb.combineHangul(s, i, k) + return + } + ii := b[i] + // We can only use combineForward as a filter if we later + // get the info for the combined character. This is more + // expensive than using the filter. Using combinesBackward() + // is safe. + if ii.combinesBackward() { + cccB := b[k-1].ccc + cccC := ii.ccc + blocked := false // b[i] blocked by starter or greater or equal CCC? + if cccB == 0 { + s = k - 1 + } else { + blocked = s != k-1 && cccB >= cccC + } + if !blocked { + combined := combine(rb.runeAt(s), rb.runeAt(i)) + if combined != 0 { + rb.assignRune(s, combined) + continue + } + } + } + b[k] = b[i] + k++ + } + rb.nrune = k +} diff --git a/vendor/golang.org/x/text/unicode/norm/composition_test.go b/vendor/golang.org/x/text/unicode/norm/composition_test.go new file mode 100644 index 0000000000..11684069d3 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/composition_test.go @@ -0,0 +1,130 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package norm + +import "testing" + +// TestCase is used for most tests. +type TestCase struct { + in []rune + out []rune +} + +func runTests(t *testing.T, name string, fm Form, tests []TestCase) { + rb := reorderBuffer{} + rb.init(fm, nil) + for i, test := range tests { + rb.setFlusher(nil, appendFlush) + for j, rune := range test.in { + b := []byte(string(rune)) + src := inputBytes(b) + info := rb.f.info(src, 0) + if j == 0 { + rb.ss.first(info) + } else { + rb.ss.next(info) + } + if rb.insertFlush(src, 0, info) < 0 { + t.Errorf("%s:%d: insert failed for rune %d", name, i, j) + } + } + rb.doFlush() + was := string(rb.out) + want := string(test.out) + if len(was) != len(want) { + t.Errorf("%s:%d: length = %d; want %d", name, i, len(was), len(want)) + } + if was != want { + k, pfx := pidx(was, want) + t.Errorf("%s:%d: \nwas %s%+q; \nwant %s%+q", name, i, pfx, was[k:], pfx, want[k:]) + } + } +} + +func TestFlush(t *testing.T) { + const ( + hello = "Hello " + world = "world!" + ) + buf := make([]byte, maxByteBufferSize) + p := copy(buf, hello) + out := buf[p:] + rb := reorderBuffer{} + rb.initString(NFC, world) + if i := rb.flushCopy(out); i != 0 { + t.Errorf("wrote bytes on flush of empty buffer. (len(out) = %d)", i) + } + + for i := range world { + // No need to set streamSafe values for this test. + rb.insertFlush(rb.src, i, rb.f.info(rb.src, i)) + n := rb.flushCopy(out) + out = out[n:] + p += n + } + + was := buf[:p] + want := hello + world + if string(was) != want { + t.Errorf(`output after flush was "%s"; want "%s"`, string(was), want) + } + if rb.nrune != 0 { + t.Errorf("non-null size of info buffer (rb.nrune == %d)", rb.nrune) + } + if rb.nbyte != 0 { + t.Errorf("non-null size of byte buffer (rb.nbyte == %d)", rb.nbyte) + } +} + +var insertTests = []TestCase{ + {[]rune{'a'}, []rune{'a'}}, + {[]rune{0x300}, []rune{0x300}}, + {[]rune{0x300, 0x316}, []rune{0x316, 0x300}}, // CCC(0x300)==230; CCC(0x316)==220 + {[]rune{0x316, 0x300}, []rune{0x316, 0x300}}, + {[]rune{0x41, 0x316, 0x300}, []rune{0x41, 0x316, 0x300}}, + {[]rune{0x41, 0x300, 0x316}, []rune{0x41, 0x316, 0x300}}, + {[]rune{0x300, 0x316, 0x41}, []rune{0x316, 0x300, 0x41}}, + {[]rune{0x41, 0x300, 0x40, 0x316}, []rune{0x41, 0x300, 0x40, 0x316}}, +} + +func TestInsert(t *testing.T) { + runTests(t, "TestInsert", NFD, insertTests) +} + +var decompositionNFDTest = []TestCase{ + {[]rune{0xC0}, []rune{0x41, 0x300}}, + {[]rune{0xAC00}, []rune{0x1100, 0x1161}}, + {[]rune{0x01C4}, []rune{0x01C4}}, + {[]rune{0x320E}, []rune{0x320E}}, + {[]rune("음ẻ과"), []rune{0x110B, 0x1173, 0x11B7, 0x65, 0x309, 0x1100, 0x116A}}, +} + +var decompositionNFKDTest = []TestCase{ + {[]rune{0xC0}, []rune{0x41, 0x300}}, + {[]rune{0xAC00}, []rune{0x1100, 0x1161}}, + {[]rune{0x01C4}, []rune{0x44, 0x5A, 0x030C}}, + {[]rune{0x320E}, []rune{0x28, 0x1100, 0x1161, 0x29}}, +} + +func TestDecomposition(t *testing.T) { + runTests(t, "TestDecompositionNFD", NFD, decompositionNFDTest) + runTests(t, "TestDecompositionNFKD", NFKD, decompositionNFKDTest) +} + +var compositionTest = []TestCase{ + {[]rune{0x41, 0x300}, []rune{0xC0}}, + {[]rune{0x41, 0x316}, []rune{0x41, 0x316}}, + {[]rune{0x41, 0x300, 0x35D}, []rune{0xC0, 0x35D}}, + {[]rune{0x41, 0x316, 0x300}, []rune{0xC0, 0x316}}, + // blocking starter + {[]rune{0x41, 0x316, 0x40, 0x300}, []rune{0x41, 0x316, 0x40, 0x300}}, + {[]rune{0x1100, 0x1161}, []rune{0xAC00}}, + // parenthesized Hangul, alternate between ASCII and Hangul. + {[]rune{0x28, 0x1100, 0x1161, 0x29}, []rune{0x28, 0xAC00, 0x29}}, +} + +func TestComposition(t *testing.T) { + runTests(t, "TestComposition", NFC, compositionTest) +} diff --git a/vendor/golang.org/x/text/unicode/norm/example_iter_test.go b/vendor/golang.org/x/text/unicode/norm/example_iter_test.go new file mode 100644 index 0000000000..82df89c7bf --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/example_iter_test.go @@ -0,0 +1,82 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package norm_test + +import ( + "bytes" + "fmt" + "unicode/utf8" + + "golang.org/x/text/unicode/norm" +) + +// EqualSimple uses a norm.Iter to compare two non-normalized +// strings for equivalence. +func EqualSimple(a, b string) bool { + var ia, ib norm.Iter + ia.InitString(norm.NFKD, a) + ib.InitString(norm.NFKD, b) + for !ia.Done() && !ib.Done() { + if !bytes.Equal(ia.Next(), ib.Next()) { + return false + } + } + return ia.Done() && ib.Done() +} + +// FindPrefix finds the longest common prefix of ASCII characters +// of a and b. +func FindPrefix(a, b string) int { + i := 0 + for ; i < len(a) && i < len(b) && a[i] < utf8.RuneSelf && a[i] == b[i]; i++ { + } + return i +} + +// EqualOpt is like EqualSimple, but optimizes the special +// case for ASCII characters. +func EqualOpt(a, b string) bool { + n := FindPrefix(a, b) + a, b = a[n:], b[n:] + var ia, ib norm.Iter + ia.InitString(norm.NFKD, a) + ib.InitString(norm.NFKD, b) + for !ia.Done() && !ib.Done() { + if !bytes.Equal(ia.Next(), ib.Next()) { + return false + } + if n := int64(FindPrefix(a[ia.Pos():], b[ib.Pos():])); n != 0 { + ia.Seek(n, 1) + ib.Seek(n, 1) + } + } + return ia.Done() && ib.Done() +} + +var compareTests = []struct{ a, b string }{ + {"aaa", "aaa"}, + {"aaa", "aab"}, + {"a\u0300a", "\u00E0a"}, + {"a\u0300\u0320b", "a\u0320\u0300b"}, + {"\u1E0A\u0323", "\x44\u0323\u0307"}, + // A character that decomposes into multiple segments + // spans several iterations. + {"\u3304", "\u30A4\u30CB\u30F3\u30AF\u3099"}, +} + +func ExampleIter() { + for i, t := range compareTests { + r0 := EqualSimple(t.a, t.b) + r1 := EqualOpt(t.a, t.b) + fmt.Printf("%d: %v %v\n", i, r0, r1) + } + // Output: + // 0: true true + // 1: false false + // 2: true true + // 3: true true + // 4: true true + // 5: true true +} diff --git a/vendor/golang.org/x/text/unicode/norm/forminfo.go b/vendor/golang.org/x/text/unicode/norm/forminfo.go new file mode 100644 index 0000000000..15a67c653a --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/forminfo.go @@ -0,0 +1,256 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package norm + +// This file contains Form-specific logic and wrappers for data in tables.go. + +// Rune info is stored in a separate trie per composing form. A composing form +// and its corresponding decomposing form share the same trie. Each trie maps +// a rune to a uint16. The values take two forms. For v >= 0x8000: +// bits +// 15: 1 (inverse of NFD_QD bit of qcInfo) +// 13..7: qcInfo (see below). isYesD is always true (no decompostion). +// 6..0: ccc (compressed CCC value). +// For v < 0x8000, the respective rune has a decomposition and v is an index +// into a byte array of UTF-8 decomposition sequences and additional info and +// has the form: +// <header> <decomp_byte>* [<tccc> [<lccc>]] +// The header contains the number of bytes in the decomposition (excluding this +// length byte). The two most significant bits of this length byte correspond +// to bit 5 and 4 of qcInfo (see below). The byte sequence itself starts at v+1. +// The byte sequence is followed by a trailing and leading CCC if the values +// for these are not zero. The value of v determines which ccc are appended +// to the sequences. For v < firstCCC, there are none, for v >= firstCCC, +// the sequence is followed by a trailing ccc, and for v >= firstLeadingCC +// there is an additional leading ccc. The value of tccc itself is the +// trailing CCC shifted left 2 bits. The two least-significant bits of tccc +// are the number of trailing non-starters. + +const ( + qcInfoMask = 0x3F // to clear all but the relevant bits in a qcInfo + headerLenMask = 0x3F // extract the length value from the header byte + headerFlagsMask = 0xC0 // extract the qcInfo bits from the header byte +) + +// Properties provides access to normalization properties of a rune. +type Properties struct { + pos uint8 // start position in reorderBuffer; used in composition.go + size uint8 // length of UTF-8 encoding of this rune + ccc uint8 // leading canonical combining class (ccc if not decomposition) + tccc uint8 // trailing canonical combining class (ccc if not decomposition) + nLead uint8 // number of leading non-starters. + flags qcInfo // quick check flags + index uint16 +} + +// functions dispatchable per form +type lookupFunc func(b input, i int) Properties + +// formInfo holds Form-specific functions and tables. +type formInfo struct { + form Form + composing, compatibility bool // form type + info lookupFunc + nextMain iterFunc +} + +var formTable []*formInfo + +func init() { + formTable = make([]*formInfo, 4) + + for i := range formTable { + f := &formInfo{} + formTable[i] = f + f.form = Form(i) + if Form(i) == NFKD || Form(i) == NFKC { + f.compatibility = true + f.info = lookupInfoNFKC + } else { + f.info = lookupInfoNFC + } + f.nextMain = nextDecomposed + if Form(i) == NFC || Form(i) == NFKC { + f.nextMain = nextComposed + f.composing = true + } + } +} + +// We do not distinguish between boundaries for NFC, NFD, etc. to avoid +// unexpected behavior for the user. For example, in NFD, there is a boundary +// after 'a'. However, 'a' might combine with modifiers, so from the application's +// perspective it is not a good boundary. We will therefore always use the +// boundaries for the combining variants. + +// BoundaryBefore returns true if this rune starts a new segment and +// cannot combine with any rune on the left. +func (p Properties) BoundaryBefore() bool { + if p.ccc == 0 && !p.combinesBackward() { + return true + } + // We assume that the CCC of the first character in a decomposition + // is always non-zero if different from info.ccc and that we can return + // false at this point. This is verified by maketables. + return false +} + +// BoundaryAfter returns true if runes cannot combine with or otherwise +// interact with this or previous runes. +func (p Properties) BoundaryAfter() bool { + // TODO: loosen these conditions. + return p.isInert() +} + +// We pack quick check data in 4 bits: +// 5: Combines forward (0 == false, 1 == true) +// 4..3: NFC_QC Yes(00), No (10), or Maybe (11) +// 2: NFD_QC Yes (0) or No (1). No also means there is a decomposition. +// 1..0: Number of trailing non-starters. +// +// When all 4 bits are zero, the character is inert, meaning it is never +// influenced by normalization. +type qcInfo uint8 + +func (p Properties) isYesC() bool { return p.flags&0x10 == 0 } +func (p Properties) isYesD() bool { return p.flags&0x4 == 0 } + +func (p Properties) combinesForward() bool { return p.flags&0x20 != 0 } +func (p Properties) combinesBackward() bool { return p.flags&0x8 != 0 } // == isMaybe +func (p Properties) hasDecomposition() bool { return p.flags&0x4 != 0 } // == isNoD + +func (p Properties) isInert() bool { + return p.flags&qcInfoMask == 0 && p.ccc == 0 +} + +func (p Properties) multiSegment() bool { + return p.index >= firstMulti && p.index < endMulti +} + +func (p Properties) nLeadingNonStarters() uint8 { + return p.nLead +} + +func (p Properties) nTrailingNonStarters() uint8 { + return uint8(p.flags & 0x03) +} + +// Decomposition returns the decomposition for the underlying rune +// or nil if there is none. +func (p Properties) Decomposition() []byte { + // TODO: create the decomposition for Hangul? + if p.index == 0 { + return nil + } + i := p.index + n := decomps[i] & headerLenMask + i++ + return decomps[i : i+uint16(n)] +} + +// Size returns the length of UTF-8 encoding of the rune. +func (p Properties) Size() int { + return int(p.size) +} + +// CCC returns the canonical combining class of the underlying rune. +func (p Properties) CCC() uint8 { + if p.index >= firstCCCZeroExcept { + return 0 + } + return ccc[p.ccc] +} + +// LeadCCC returns the CCC of the first rune in the decomposition. +// If there is no decomposition, LeadCCC equals CCC. +func (p Properties) LeadCCC() uint8 { + return ccc[p.ccc] +} + +// TrailCCC returns the CCC of the last rune in the decomposition. +// If there is no decomposition, TrailCCC equals CCC. +func (p Properties) TrailCCC() uint8 { + return ccc[p.tccc] +} + +// Recomposition +// We use 32-bit keys instead of 64-bit for the two codepoint keys. +// This clips off the bits of three entries, but we know this will not +// result in a collision. In the unlikely event that changes to +// UnicodeData.txt introduce collisions, the compiler will catch it. +// Note that the recomposition map for NFC and NFKC are identical. + +// combine returns the combined rune or 0 if it doesn't exist. +func combine(a, b rune) rune { + key := uint32(uint16(a))<<16 + uint32(uint16(b)) + return recompMap[key] +} + +func lookupInfoNFC(b input, i int) Properties { + v, sz := b.charinfoNFC(i) + return compInfo(v, sz) +} + +func lookupInfoNFKC(b input, i int) Properties { + v, sz := b.charinfoNFKC(i) + return compInfo(v, sz) +} + +// Properties returns properties for the first rune in s. +func (f Form) Properties(s []byte) Properties { + if f == NFC || f == NFD { + return compInfo(nfcData.lookup(s)) + } + return compInfo(nfkcData.lookup(s)) +} + +// PropertiesString returns properties for the first rune in s. +func (f Form) PropertiesString(s string) Properties { + if f == NFC || f == NFD { + return compInfo(nfcData.lookupString(s)) + } + return compInfo(nfkcData.lookupString(s)) +} + +// compInfo converts the information contained in v and sz +// to a Properties. See the comment at the top of the file +// for more information on the format. +func compInfo(v uint16, sz int) Properties { + if v == 0 { + return Properties{size: uint8(sz)} + } else if v >= 0x8000 { + p := Properties{ + size: uint8(sz), + ccc: uint8(v), + tccc: uint8(v), + flags: qcInfo(v >> 8), + } + if p.ccc > 0 || p.combinesBackward() { + p.nLead = uint8(p.flags & 0x3) + } + return p + } + // has decomposition + h := decomps[v] + f := (qcInfo(h&headerFlagsMask) >> 2) | 0x4 + p := Properties{size: uint8(sz), flags: f, index: v} + if v >= firstCCC { + v += uint16(h&headerLenMask) + 1 + c := decomps[v] + p.tccc = c >> 2 + p.flags |= qcInfo(c & 0x3) + if v >= firstLeadingCCC { + p.nLead = c & 0x3 + if v >= firstStarterWithNLead { + // We were tricked. Remove the decomposition. + p.flags &= 0x03 + p.index = 0 + return p + } + p.ccc = decomps[v+1] + } + } + return p +} diff --git a/vendor/golang.org/x/text/unicode/norm/forminfo_test.go b/vendor/golang.org/x/text/unicode/norm/forminfo_test.go new file mode 100644 index 0000000000..e15ba9bee6 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/forminfo_test.go @@ -0,0 +1,54 @@ +// Copyright 2013 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 test + +package norm + +import "testing" + +func TestProperties(t *testing.T) { + var d runeData + CK := [2]string{"C", "K"} + for k, r := 1, rune(0); r < 0x2ffff; r++ { + if k < len(testData) && r == testData[k].r { + d = testData[k] + k++ + } + s := string(r) + for j, p := range []Properties{NFC.PropertiesString(s), NFKC.PropertiesString(s)} { + f := d.f[j] + if p.CCC() != d.ccc { + t.Errorf("%U: ccc(%s): was %d; want %d %X", r, CK[j], p.CCC(), d.ccc, p.index) + } + if p.isYesC() != (f.qc == Yes) { + t.Errorf("%U: YesC(%s): was %v; want %v", r, CK[j], p.isYesC(), f.qc == Yes) + } + if p.combinesBackward() != (f.qc == Maybe) { + t.Errorf("%U: combines backwards(%s): was %v; want %v", r, CK[j], p.combinesBackward(), f.qc == Maybe) + } + if p.nLeadingNonStarters() != d.nLead { + t.Errorf("%U: nLead(%s): was %d; want %d %#v %#v", r, CK[j], p.nLeadingNonStarters(), d.nLead, p, d) + } + if p.nTrailingNonStarters() != d.nTrail { + t.Errorf("%U: nTrail(%s): was %d; want %d %#v %#v", r, CK[j], p.nTrailingNonStarters(), d.nTrail, p, d) + } + if p.combinesForward() != f.combinesForward { + t.Errorf("%U: combines forward(%s): was %v; want %v %#v", r, CK[j], p.combinesForward(), f.combinesForward, p) + } + // Skip Hangul as it is algorithmically computed. + if r >= hangulBase && r < hangulEnd { + continue + } + if p.hasDecomposition() { + if has := f.decomposition != ""; !has { + t.Errorf("%U: hasDecomposition(%s): was %v; want %v", r, CK[j], p.hasDecomposition(), has) + } + if string(p.Decomposition()) != f.decomposition { + t.Errorf("%U: decomp(%s): was %+q; want %+q", r, CK[j], p.Decomposition(), f.decomposition) + } + } + } + } +} diff --git a/vendor/golang.org/x/text/unicode/norm/input.go b/vendor/golang.org/x/text/unicode/norm/input.go new file mode 100644 index 0000000000..045d4ccce2 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/input.go @@ -0,0 +1,105 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package norm + +import "unicode/utf8" + +type input struct { + str string + bytes []byte +} + +func inputBytes(str []byte) input { + return input{bytes: str} +} + +func inputString(str string) input { + return input{str: str} +} + +func (in *input) setBytes(str []byte) { + in.str = "" + in.bytes = str +} + +func (in *input) setString(str string) { + in.str = str + in.bytes = nil +} + +func (in *input) _byte(p int) byte { + if in.bytes == nil { + return in.str[p] + } + return in.bytes[p] +} + +func (in *input) skipASCII(p, max int) int { + if in.bytes == nil { + for ; p < max && in.str[p] < utf8.RuneSelf; p++ { + } + } else { + for ; p < max && in.bytes[p] < utf8.RuneSelf; p++ { + } + } + return p +} + +func (in *input) skipContinuationBytes(p int) int { + if in.bytes == nil { + for ; p < len(in.str) && !utf8.RuneStart(in.str[p]); p++ { + } + } else { + for ; p < len(in.bytes) && !utf8.RuneStart(in.bytes[p]); p++ { + } + } + return p +} + +func (in *input) appendSlice(buf []byte, b, e int) []byte { + if in.bytes != nil { + return append(buf, in.bytes[b:e]...) + } + for i := b; i < e; i++ { + buf = append(buf, in.str[i]) + } + return buf +} + +func (in *input) copySlice(buf []byte, b, e int) int { + if in.bytes == nil { + return copy(buf, in.str[b:e]) + } + return copy(buf, in.bytes[b:e]) +} + +func (in *input) charinfoNFC(p int) (uint16, int) { + if in.bytes == nil { + return nfcData.lookupString(in.str[p:]) + } + return nfcData.lookup(in.bytes[p:]) +} + +func (in *input) charinfoNFKC(p int) (uint16, int) { + if in.bytes == nil { + return nfkcData.lookupString(in.str[p:]) + } + return nfkcData.lookup(in.bytes[p:]) +} + +func (in *input) hangul(p int) (r rune) { + if in.bytes == nil { + if !isHangulString(in.str[p:]) { + return 0 + } + r, _ = utf8.DecodeRuneInString(in.str[p:]) + } else { + if !isHangul(in.bytes[p:]) { + return 0 + } + r, _ = utf8.DecodeRune(in.bytes[p:]) + } + return r +} diff --git a/vendor/golang.org/x/text/unicode/norm/iter.go b/vendor/golang.org/x/text/unicode/norm/iter.go new file mode 100644 index 0000000000..0a42a72de8 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/iter.go @@ -0,0 +1,450 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package norm + +import ( + "fmt" + "unicode/utf8" +) + +// MaxSegmentSize is the maximum size of a byte buffer needed to consider any +// sequence of starter and non-starter runes for the purpose of normalization. +const MaxSegmentSize = maxByteBufferSize + +// An Iter iterates over a string or byte slice, while normalizing it +// to a given Form. +type Iter struct { + rb reorderBuffer + buf [maxByteBufferSize]byte + info Properties // first character saved from previous iteration + next iterFunc // implementation of next depends on form + asciiF iterFunc + + p int // current position in input source + multiSeg []byte // remainder of multi-segment decomposition +} + +type iterFunc func(*Iter) []byte + +// Init initializes i to iterate over src after normalizing it to Form f. +func (i *Iter) Init(f Form, src []byte) { + i.p = 0 + if len(src) == 0 { + i.setDone() + i.rb.nsrc = 0 + return + } + i.multiSeg = nil + i.rb.init(f, src) + i.next = i.rb.f.nextMain + i.asciiF = nextASCIIBytes + i.info = i.rb.f.info(i.rb.src, i.p) +} + +// InitString initializes i to iterate over src after normalizing it to Form f. +func (i *Iter) InitString(f Form, src string) { + i.p = 0 + if len(src) == 0 { + i.setDone() + i.rb.nsrc = 0 + return + } + i.multiSeg = nil + i.rb.initString(f, src) + i.next = i.rb.f.nextMain + i.asciiF = nextASCIIString + i.info = i.rb.f.info(i.rb.src, i.p) +} + +// Seek sets the segment to be returned by the next call to Next to start +// at position p. It is the responsibility of the caller to set p to the +// start of a UTF8 rune. +func (i *Iter) Seek(offset int64, whence int) (int64, error) { + var abs int64 + switch whence { + case 0: + abs = offset + case 1: + abs = int64(i.p) + offset + case 2: + abs = int64(i.rb.nsrc) + offset + default: + return 0, fmt.Errorf("norm: invalid whence") + } + if abs < 0 { + return 0, fmt.Errorf("norm: negative position") + } + if int(abs) >= i.rb.nsrc { + i.setDone() + return int64(i.p), nil + } + i.p = int(abs) + i.multiSeg = nil + i.next = i.rb.f.nextMain + i.info = i.rb.f.info(i.rb.src, i.p) + return abs, nil +} + +// returnSlice returns a slice of the underlying input type as a byte slice. +// If the underlying is of type []byte, it will simply return a slice. +// If the underlying is of type string, it will copy the slice to the buffer +// and return that. +func (i *Iter) returnSlice(a, b int) []byte { + if i.rb.src.bytes == nil { + return i.buf[:copy(i.buf[:], i.rb.src.str[a:b])] + } + return i.rb.src.bytes[a:b] +} + +// Pos returns the byte position at which the next call to Next will commence processing. +func (i *Iter) Pos() int { + return i.p +} + +func (i *Iter) setDone() { + i.next = nextDone + i.p = i.rb.nsrc +} + +// Done returns true if there is no more input to process. +func (i *Iter) Done() bool { + return i.p >= i.rb.nsrc +} + +// Next returns f(i.input[i.Pos():n]), where n is a boundary of i.input. +// For any input a and b for which f(a) == f(b), subsequent calls +// to Next will return the same segments. +// Modifying runes are grouped together with the preceding starter, if such a starter exists. +// Although not guaranteed, n will typically be the smallest possible n. +func (i *Iter) Next() []byte { + return i.next(i) +} + +func nextASCIIBytes(i *Iter) []byte { + p := i.p + 1 + if p >= i.rb.nsrc { + i.setDone() + return i.rb.src.bytes[i.p:p] + } + if i.rb.src.bytes[p] < utf8.RuneSelf { + p0 := i.p + i.p = p + return i.rb.src.bytes[p0:p] + } + i.info = i.rb.f.info(i.rb.src, i.p) + i.next = i.rb.f.nextMain + return i.next(i) +} + +func nextASCIIString(i *Iter) []byte { + p := i.p + 1 + if p >= i.rb.nsrc { + i.buf[0] = i.rb.src.str[i.p] + i.setDone() + return i.buf[:1] + } + if i.rb.src.str[p] < utf8.RuneSelf { + i.buf[0] = i.rb.src.str[i.p] + i.p = p + return i.buf[:1] + } + i.info = i.rb.f.info(i.rb.src, i.p) + i.next = i.rb.f.nextMain + return i.next(i) +} + +func nextHangul(i *Iter) []byte { + p := i.p + next := p + hangulUTF8Size + if next >= i.rb.nsrc { + i.setDone() + } else if i.rb.src.hangul(next) == 0 { + i.info = i.rb.f.info(i.rb.src, i.p) + i.next = i.rb.f.nextMain + return i.next(i) + } + i.p = next + return i.buf[:decomposeHangul(i.buf[:], i.rb.src.hangul(p))] +} + +func nextDone(i *Iter) []byte { + return nil +} + +// nextMulti is used for iterating over multi-segment decompositions +// for decomposing normal forms. +func nextMulti(i *Iter) []byte { + j := 0 + d := i.multiSeg + // skip first rune + for j = 1; j < len(d) && !utf8.RuneStart(d[j]); j++ { + } + for j < len(d) { + info := i.rb.f.info(input{bytes: d}, j) + if info.BoundaryBefore() { + i.multiSeg = d[j:] + return d[:j] + } + j += int(info.size) + } + // treat last segment as normal decomposition + i.next = i.rb.f.nextMain + return i.next(i) +} + +// nextMultiNorm is used for iterating over multi-segment decompositions +// for composing normal forms. +func nextMultiNorm(i *Iter) []byte { + j := 0 + d := i.multiSeg + for j < len(d) { + info := i.rb.f.info(input{bytes: d}, j) + if info.BoundaryBefore() { + i.rb.compose() + seg := i.buf[:i.rb.flushCopy(i.buf[:])] + i.rb.ss.first(info) + i.rb.insertUnsafe(input{bytes: d}, j, info) + i.multiSeg = d[j+int(info.size):] + return seg + } + i.rb.ss.next(info) + i.rb.insertUnsafe(input{bytes: d}, j, info) + j += int(info.size) + } + i.multiSeg = nil + i.next = nextComposed + return doNormComposed(i) +} + +// nextDecomposed is the implementation of Next for forms NFD and NFKD. +func nextDecomposed(i *Iter) (next []byte) { + outp := 0 + inCopyStart, outCopyStart := i.p, 0 + ss := mkStreamSafe(i.info) + for { + if sz := int(i.info.size); sz <= 1 { + p := i.p + i.p++ // ASCII or illegal byte. Either way, advance by 1. + if i.p >= i.rb.nsrc { + i.setDone() + return i.returnSlice(p, i.p) + } else if i.rb.src._byte(i.p) < utf8.RuneSelf { + i.next = i.asciiF + return i.returnSlice(p, i.p) + } + outp++ + } else if d := i.info.Decomposition(); d != nil { + // Note: If leading CCC != 0, then len(d) == 2 and last is also non-zero. + // Case 1: there is a leftover to copy. In this case the decomposition + // must begin with a modifier and should always be appended. + // Case 2: no leftover. Simply return d if followed by a ccc == 0 value. + p := outp + len(d) + if outp > 0 { + i.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p) + if p > len(i.buf) { + return i.buf[:outp] + } + } else if i.info.multiSegment() { + // outp must be 0 as multi-segment decompositions always + // start a new segment. + if i.multiSeg == nil { + i.multiSeg = d + i.next = nextMulti + return nextMulti(i) + } + // We are in the last segment. Treat as normal decomposition. + d = i.multiSeg + i.multiSeg = nil + p = len(d) + } + prevCC := i.info.tccc + if i.p += sz; i.p >= i.rb.nsrc { + i.setDone() + i.info = Properties{} // Force BoundaryBefore to succeed. + } else { + i.info = i.rb.f.info(i.rb.src, i.p) + } + switch ss.next(i.info) { + case ssOverflow: + i.next = nextCGJDecompose + fallthrough + case ssStarter: + if outp > 0 { + copy(i.buf[outp:], d) + return i.buf[:p] + } + return d + } + copy(i.buf[outp:], d) + outp = p + inCopyStart, outCopyStart = i.p, outp + if i.info.ccc < prevCC { + goto doNorm + } + continue + } else if r := i.rb.src.hangul(i.p); r != 0 { + outp = decomposeHangul(i.buf[:], r) + i.p += hangulUTF8Size + inCopyStart, outCopyStart = i.p, outp + if i.p >= i.rb.nsrc { + i.setDone() + break + } else if i.rb.src.hangul(i.p) != 0 { + i.next = nextHangul + return i.buf[:outp] + } + } else { + p := outp + sz + if p > len(i.buf) { + break + } + outp = p + i.p += sz + } + if i.p >= i.rb.nsrc { + i.setDone() + break + } + prevCC := i.info.tccc + i.info = i.rb.f.info(i.rb.src, i.p) + if v := ss.next(i.info); v == ssStarter { + break + } else if v == ssOverflow { + i.next = nextCGJDecompose + break + } + if i.info.ccc < prevCC { + goto doNorm + } + } + if outCopyStart == 0 { + return i.returnSlice(inCopyStart, i.p) + } else if inCopyStart < i.p { + i.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p) + } + return i.buf[:outp] +doNorm: + // Insert what we have decomposed so far in the reorderBuffer. + // As we will only reorder, there will always be enough room. + i.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p) + i.rb.insertDecomposed(i.buf[0:outp]) + return doNormDecomposed(i) +} + +func doNormDecomposed(i *Iter) []byte { + for { + if s := i.rb.ss.next(i.info); s == ssOverflow { + i.next = nextCGJDecompose + break + } + i.rb.insertUnsafe(i.rb.src, i.p, i.info) + if i.p += int(i.info.size); i.p >= i.rb.nsrc { + i.setDone() + break + } + i.info = i.rb.f.info(i.rb.src, i.p) + if i.info.ccc == 0 { + break + } + } + // new segment or too many combining characters: exit normalization + return i.buf[:i.rb.flushCopy(i.buf[:])] +} + +func nextCGJDecompose(i *Iter) []byte { + i.rb.ss = 0 + i.rb.insertCGJ() + i.next = nextDecomposed + buf := doNormDecomposed(i) + return buf +} + +// nextComposed is the implementation of Next for forms NFC and NFKC. +func nextComposed(i *Iter) []byte { + outp, startp := 0, i.p + var prevCC uint8 + ss := mkStreamSafe(i.info) + for { + if !i.info.isYesC() { + goto doNorm + } + prevCC = i.info.tccc + sz := int(i.info.size) + if sz == 0 { + sz = 1 // illegal rune: copy byte-by-byte + } + p := outp + sz + if p > len(i.buf) { + break + } + outp = p + i.p += sz + if i.p >= i.rb.nsrc { + i.setDone() + break + } else if i.rb.src._byte(i.p) < utf8.RuneSelf { + i.next = i.asciiF + break + } + i.info = i.rb.f.info(i.rb.src, i.p) + if v := ss.next(i.info); v == ssStarter { + break + } else if v == ssOverflow { + i.next = nextCGJCompose + break + } + if i.info.ccc < prevCC { + goto doNorm + } + } + return i.returnSlice(startp, i.p) +doNorm: + i.p = startp + i.info = i.rb.f.info(i.rb.src, i.p) + if i.info.multiSegment() { + d := i.info.Decomposition() + info := i.rb.f.info(input{bytes: d}, 0) + i.rb.insertUnsafe(input{bytes: d}, 0, info) + i.multiSeg = d[int(info.size):] + i.next = nextMultiNorm + return nextMultiNorm(i) + } + i.rb.ss.first(i.info) + i.rb.insertUnsafe(i.rb.src, i.p, i.info) + return doNormComposed(i) +} + +func doNormComposed(i *Iter) []byte { + // First rune should already be inserted. + for { + if i.p += int(i.info.size); i.p >= i.rb.nsrc { + i.setDone() + break + } + i.info = i.rb.f.info(i.rb.src, i.p) + if s := i.rb.ss.next(i.info); s == ssStarter { + break + } else if s == ssOverflow { + i.next = nextCGJCompose + break + } + i.rb.insertUnsafe(i.rb.src, i.p, i.info) + } + i.rb.compose() + seg := i.buf[:i.rb.flushCopy(i.buf[:])] + return seg +} + +func nextCGJCompose(i *Iter) []byte { + i.rb.ss = 0 // instead of first + i.rb.insertCGJ() + i.next = nextComposed + // Note that we treat any rune with nLeadingNonStarters > 0 as a non-starter, + // even if they are not. This is particularly dubious for U+FF9E and UFF9A. + // If we ever change that, insert a check here. + i.rb.ss.first(i.info) + i.rb.insertUnsafe(i.rb.src, i.p, i.info) + return doNormComposed(i) +} diff --git a/vendor/golang.org/x/text/unicode/norm/iter_test.go b/vendor/golang.org/x/text/unicode/norm/iter_test.go new file mode 100644 index 0000000000..e2aa6f2515 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/iter_test.go @@ -0,0 +1,98 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package norm + +import ( + "strings" + "testing" +) + +func doIterNorm(f Form, s string) []byte { + acc := []byte{} + i := Iter{} + i.InitString(f, s) + for !i.Done() { + acc = append(acc, i.Next()...) + } + return acc +} + +func TestIterNext(t *testing.T) { + runNormTests(t, "IterNext", func(f Form, out []byte, s string) []byte { + return doIterNorm(f, string(append(out, s...))) + }) +} + +type SegmentTest struct { + in string + out []string +} + +var segmentTests = []SegmentTest{ + {"\u1E0A\u0323a", []string{"\x44\u0323\u0307", "a", ""}}, + {rep('a', segSize), append(strings.Split(rep('a', segSize), ""), "")}, + {rep('a', segSize+2), append(strings.Split(rep('a', segSize+2), ""), "")}, + {rep('a', segSize) + "\u0300aa", + append(strings.Split(rep('a', segSize-1), ""), "a\u0300", "a", "a", "")}, + + // U+0f73 is NOT treated as a starter as it is a modifier + {"a" + grave(29) + "\u0f73", []string{"a" + grave(29), cgj + "\u0f73"}}, + {"a\u0f73", []string{"a\u0f73"}}, + + // U+ff9e is treated as a non-starter. + // TODO: should we? Note that this will only affect iteration, as whether + // or not we do so does not affect the normalization output and will either + // way result in consistent iteration output. + {"a" + grave(30) + "\uff9e", []string{"a" + grave(30), cgj + "\uff9e"}}, + {"a\uff9e", []string{"a\uff9e"}}, +} + +var segmentTestsK = []SegmentTest{ + {"\u3332", []string{"\u30D5", "\u30A1", "\u30E9", "\u30C3", "\u30C8\u3099", ""}}, + // last segment of multi-segment decomposition needs normalization + {"\u3332\u093C", []string{"\u30D5", "\u30A1", "\u30E9", "\u30C3", "\u30C8\u093C\u3099", ""}}, + {"\u320E", []string{"\x28", "\uAC00", "\x29"}}, + + // last segment should be copied to start of buffer. + {"\ufdfa", []string{"\u0635", "\u0644", "\u0649", " ", "\u0627", "\u0644", "\u0644", "\u0647", " ", "\u0639", "\u0644", "\u064a", "\u0647", " ", "\u0648", "\u0633", "\u0644", "\u0645", ""}}, + {"\ufdfa" + grave(30), []string{"\u0635", "\u0644", "\u0649", " ", "\u0627", "\u0644", "\u0644", "\u0647", " ", "\u0639", "\u0644", "\u064a", "\u0647", " ", "\u0648", "\u0633", "\u0644", "\u0645" + grave(30), ""}}, + {"\uFDFA" + grave(64), []string{"\u0635", "\u0644", "\u0649", " ", "\u0627", "\u0644", "\u0644", "\u0647", " ", "\u0639", "\u0644", "\u064a", "\u0647", " ", "\u0648", "\u0633", "\u0644", "\u0645" + grave(30), cgj + grave(30), cgj + grave(4), ""}}, + + // Hangul and Jamo are grouped togeter. + {"\uAC00", []string{"\u1100\u1161", ""}}, + {"\uAC01", []string{"\u1100\u1161\u11A8", ""}}, + {"\u1100\u1161", []string{"\u1100\u1161", ""}}, +} + +// Note that, by design, segmentation is equal for composing and decomposing forms. +func TestIterSegmentation(t *testing.T) { + segmentTest(t, "SegmentTestD", NFD, segmentTests) + segmentTest(t, "SegmentTestC", NFC, segmentTests) + segmentTest(t, "SegmentTestKD", NFKD, segmentTestsK) + segmentTest(t, "SegmentTestKC", NFKC, segmentTestsK) +} + +func segmentTest(t *testing.T, name string, f Form, tests []SegmentTest) { + iter := Iter{} + for i, tt := range tests { + iter.InitString(f, tt.in) + for j, seg := range tt.out { + if seg == "" { + if !iter.Done() { + res := string(iter.Next()) + t.Errorf(`%s:%d:%d: expected Done()==true, found segment %+q`, name, i, j, res) + } + continue + } + if iter.Done() { + t.Errorf("%s:%d:%d: Done()==true, want false", name, i, j) + } + seg = f.String(seg) + if res := string(iter.Next()); res != seg { + t.Errorf(`%s:%d:%d" segment was %+q (%d); want %+q (%d)`, name, i, j, pc(res), len(res), pc(seg), len(seg)) + } + } + } +} diff --git a/vendor/golang.org/x/text/unicode/norm/maketables.go b/vendor/golang.org/x/text/unicode/norm/maketables.go new file mode 100644 index 0000000000..07bdff6bdc --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/maketables.go @@ -0,0 +1,978 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +// Normalization table generator. +// Data read from the web. +// See forminfo.go for a description of the trie values associated with each rune. + +package main + +import ( + "bytes" + "flag" + "fmt" + "io" + "log" + "sort" + "strconv" + "strings" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/triegen" + "golang.org/x/text/internal/ucd" +) + +func main() { + gen.Init() + loadUnicodeData() + compactCCC() + loadCompositionExclusions() + completeCharFields(FCanonical) + completeCharFields(FCompatibility) + computeNonStarterCounts() + verifyComputed() + printChars() + if *test { + testDerived() + printTestdata() + } else { + makeTables() + } +} + +var ( + tablelist = flag.String("tables", + "all", + "comma-separated list of which tables to generate; "+ + "can be 'decomp', 'recomp', 'info' and 'all'") + test = flag.Bool("test", + false, + "test existing tables against DerivedNormalizationProps and generate test data for regression testing") + verbose = flag.Bool("verbose", + false, + "write data to stdout as it is parsed") +) + +const MaxChar = 0x10FFFF // anything above this shouldn't exist + +// Quick Check properties of runes allow us to quickly +// determine whether a rune may occur in a normal form. +// For a given normal form, a rune may be guaranteed to occur +// verbatim (QC=Yes), may or may not combine with another +// rune (QC=Maybe), or may not occur (QC=No). +type QCResult int + +const ( + QCUnknown QCResult = iota + QCYes + QCNo + QCMaybe +) + +func (r QCResult) String() string { + switch r { + case QCYes: + return "Yes" + case QCNo: + return "No" + case QCMaybe: + return "Maybe" + } + return "***UNKNOWN***" +} + +const ( + FCanonical = iota // NFC or NFD + FCompatibility // NFKC or NFKD + FNumberOfFormTypes +) + +const ( + MComposed = iota // NFC or NFKC + MDecomposed // NFD or NFKD + MNumberOfModes +) + +// This contains only the properties we're interested in. +type Char struct { + name string + codePoint rune // if zero, this index is not a valid code point. + ccc uint8 // canonical combining class + origCCC uint8 + excludeInComp bool // from CompositionExclusions.txt + compatDecomp bool // it has a compatibility expansion + + nTrailingNonStarters uint8 + nLeadingNonStarters uint8 // must be equal to trailing if non-zero + + forms [FNumberOfFormTypes]FormInfo // For FCanonical and FCompatibility + + state State +} + +var chars = make([]Char, MaxChar+1) +var cccMap = make(map[uint8]uint8) + +func (c Char) String() string { + buf := new(bytes.Buffer) + + fmt.Fprintf(buf, "%U [%s]:\n", c.codePoint, c.name) + fmt.Fprintf(buf, " ccc: %v\n", c.ccc) + fmt.Fprintf(buf, " excludeInComp: %v\n", c.excludeInComp) + fmt.Fprintf(buf, " compatDecomp: %v\n", c.compatDecomp) + fmt.Fprintf(buf, " state: %v\n", c.state) + fmt.Fprintf(buf, " NFC:\n") + fmt.Fprint(buf, c.forms[FCanonical]) + fmt.Fprintf(buf, " NFKC:\n") + fmt.Fprint(buf, c.forms[FCompatibility]) + + return buf.String() +} + +// In UnicodeData.txt, some ranges are marked like this: +// 3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;; +// 4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;; +// parseCharacter keeps a state variable indicating the weirdness. +type State int + +const ( + SNormal State = iota // known to be zero for the type + SFirst + SLast + SMissing +) + +var lastChar = rune('\u0000') + +func (c Char) isValid() bool { + return c.codePoint != 0 && c.state != SMissing +} + +type FormInfo struct { + quickCheck [MNumberOfModes]QCResult // index: MComposed or MDecomposed + verified [MNumberOfModes]bool // index: MComposed or MDecomposed + + combinesForward bool // May combine with rune on the right + combinesBackward bool // May combine with rune on the left + isOneWay bool // Never appears in result + inDecomp bool // Some decompositions result in this char. + decomp Decomposition + expandedDecomp Decomposition +} + +func (f FormInfo) String() string { + buf := bytes.NewBuffer(make([]byte, 0)) + + fmt.Fprintf(buf, " quickCheck[C]: %v\n", f.quickCheck[MComposed]) + fmt.Fprintf(buf, " quickCheck[D]: %v\n", f.quickCheck[MDecomposed]) + fmt.Fprintf(buf, " cmbForward: %v\n", f.combinesForward) + fmt.Fprintf(buf, " cmbBackward: %v\n", f.combinesBackward) + fmt.Fprintf(buf, " isOneWay: %v\n", f.isOneWay) + fmt.Fprintf(buf, " inDecomp: %v\n", f.inDecomp) + fmt.Fprintf(buf, " decomposition: %X\n", f.decomp) + fmt.Fprintf(buf, " expandedDecomp: %X\n", f.expandedDecomp) + + return buf.String() +} + +type Decomposition []rune + +func parseDecomposition(s string, skipfirst bool) (a []rune, err error) { + decomp := strings.Split(s, " ") + if len(decomp) > 0 && skipfirst { + decomp = decomp[1:] + } + for _, d := range decomp { + point, err := strconv.ParseUint(d, 16, 64) + if err != nil { + return a, err + } + a = append(a, rune(point)) + } + return a, nil +} + +func loadUnicodeData() { + f := gen.OpenUCDFile("UnicodeData.txt") + defer f.Close() + p := ucd.New(f) + for p.Next() { + r := p.Rune(ucd.CodePoint) + char := &chars[r] + + char.ccc = uint8(p.Uint(ucd.CanonicalCombiningClass)) + decmap := p.String(ucd.DecompMapping) + + exp, err := parseDecomposition(decmap, false) + isCompat := false + if err != nil { + if len(decmap) > 0 { + exp, err = parseDecomposition(decmap, true) + if err != nil { + log.Fatalf(`%U: bad decomp |%v|: "%s"`, r, decmap, err) + } + isCompat = true + } + } + + char.name = p.String(ucd.Name) + char.codePoint = r + char.forms[FCompatibility].decomp = exp + if !isCompat { + char.forms[FCanonical].decomp = exp + } else { + char.compatDecomp = true + } + if len(decmap) > 0 { + char.forms[FCompatibility].decomp = exp + } + } + if err := p.Err(); err != nil { + log.Fatal(err) + } +} + +// compactCCC converts the sparse set of CCC values to a continguous one, +// reducing the number of bits needed from 8 to 6. +func compactCCC() { + m := make(map[uint8]uint8) + for i := range chars { + c := &chars[i] + m[c.ccc] = 0 + } + cccs := []int{} + for v, _ := range m { + cccs = append(cccs, int(v)) + } + sort.Ints(cccs) + for i, c := range cccs { + cccMap[uint8(i)] = uint8(c) + m[uint8(c)] = uint8(i) + } + for i := range chars { + c := &chars[i] + c.origCCC = c.ccc + c.ccc = m[c.ccc] + } + if len(m) >= 1<<6 { + log.Fatalf("too many difference CCC values: %d >= 64", len(m)) + } +} + +// CompositionExclusions.txt has form: +// 0958 # ... +// See http://unicode.org/reports/tr44/ for full explanation +func loadCompositionExclusions() { + f := gen.OpenUCDFile("CompositionExclusions.txt") + defer f.Close() + p := ucd.New(f) + for p.Next() { + c := &chars[p.Rune(0)] + if c.excludeInComp { + log.Fatalf("%U: Duplicate entry in exclusions.", c.codePoint) + } + c.excludeInComp = true + } + if e := p.Err(); e != nil { + log.Fatal(e) + } +} + +// hasCompatDecomp returns true if any of the recursive +// decompositions contains a compatibility expansion. +// In this case, the character may not occur in NFK*. +func hasCompatDecomp(r rune) bool { + c := &chars[r] + if c.compatDecomp { + return true + } + for _, d := range c.forms[FCompatibility].decomp { + if hasCompatDecomp(d) { + return true + } + } + return false +} + +// Hangul related constants. +const ( + HangulBase = 0xAC00 + HangulEnd = 0xD7A4 // hangulBase + Jamo combinations (19 * 21 * 28) + + JamoLBase = 0x1100 + JamoLEnd = 0x1113 + JamoVBase = 0x1161 + JamoVEnd = 0x1176 + JamoTBase = 0x11A8 + JamoTEnd = 0x11C3 + + JamoLVTCount = 19 * 21 * 28 + JamoTCount = 28 +) + +func isHangul(r rune) bool { + return HangulBase <= r && r < HangulEnd +} + +func isHangulWithoutJamoT(r rune) bool { + if !isHangul(r) { + return false + } + r -= HangulBase + return r < JamoLVTCount && r%JamoTCount == 0 +} + +func ccc(r rune) uint8 { + return chars[r].ccc +} + +// Insert a rune in a buffer, ordered by Canonical Combining Class. +func insertOrdered(b Decomposition, r rune) Decomposition { + n := len(b) + b = append(b, 0) + cc := ccc(r) + if cc > 0 { + // Use bubble sort. + for ; n > 0; n-- { + if ccc(b[n-1]) <= cc { + break + } + b[n] = b[n-1] + } + } + b[n] = r + return b +} + +// Recursively decompose. +func decomposeRecursive(form int, r rune, d Decomposition) Decomposition { + dcomp := chars[r].forms[form].decomp + if len(dcomp) == 0 { + return insertOrdered(d, r) + } + for _, c := range dcomp { + d = decomposeRecursive(form, c, d) + } + return d +} + +func completeCharFields(form int) { + // Phase 0: pre-expand decomposition. + for i := range chars { + f := &chars[i].forms[form] + if len(f.decomp) == 0 { + continue + } + exp := make(Decomposition, 0) + for _, c := range f.decomp { + exp = decomposeRecursive(form, c, exp) + } + f.expandedDecomp = exp + } + + // Phase 1: composition exclusion, mark decomposition. + for i := range chars { + c := &chars[i] + f := &c.forms[form] + + // Marks script-specific exclusions and version restricted. + f.isOneWay = c.excludeInComp + + // Singletons + f.isOneWay = f.isOneWay || len(f.decomp) == 1 + + // Non-starter decompositions + if len(f.decomp) > 1 { + chk := c.ccc != 0 || chars[f.decomp[0]].ccc != 0 + f.isOneWay = f.isOneWay || chk + } + + // Runes that decompose into more than two runes. + f.isOneWay = f.isOneWay || len(f.decomp) > 2 + + if form == FCompatibility { + f.isOneWay = f.isOneWay || hasCompatDecomp(c.codePoint) + } + + for _, r := range f.decomp { + chars[r].forms[form].inDecomp = true + } + } + + // Phase 2: forward and backward combining. + for i := range chars { + c := &chars[i] + f := &c.forms[form] + + if !f.isOneWay && len(f.decomp) == 2 { + f0 := &chars[f.decomp[0]].forms[form] + f1 := &chars[f.decomp[1]].forms[form] + if !f0.isOneWay { + f0.combinesForward = true + } + if !f1.isOneWay { + f1.combinesBackward = true + } + } + if isHangulWithoutJamoT(rune(i)) { + f.combinesForward = true + } + } + + // Phase 3: quick check values. + for i := range chars { + c := &chars[i] + f := &c.forms[form] + + switch { + case len(f.decomp) > 0: + f.quickCheck[MDecomposed] = QCNo + case isHangul(rune(i)): + f.quickCheck[MDecomposed] = QCNo + default: + f.quickCheck[MDecomposed] = QCYes + } + switch { + case f.isOneWay: + f.quickCheck[MComposed] = QCNo + case (i & 0xffff00) == JamoLBase: + f.quickCheck[MComposed] = QCYes + if JamoLBase <= i && i < JamoLEnd { + f.combinesForward = true + } + if JamoVBase <= i && i < JamoVEnd { + f.quickCheck[MComposed] = QCMaybe + f.combinesBackward = true + f.combinesForward = true + } + if JamoTBase <= i && i < JamoTEnd { + f.quickCheck[MComposed] = QCMaybe + f.combinesBackward = true + } + case !f.combinesBackward: + f.quickCheck[MComposed] = QCYes + default: + f.quickCheck[MComposed] = QCMaybe + } + } +} + +func computeNonStarterCounts() { + // Phase 4: leading and trailing non-starter count + for i := range chars { + c := &chars[i] + + runes := []rune{rune(i)} + // We always use FCompatibility so that the CGJ insertion points do not + // change for repeated normalizations with different forms. + if exp := c.forms[FCompatibility].expandedDecomp; len(exp) > 0 { + runes = exp + } + // We consider runes that combine backwards to be non-starters for the + // purpose of Stream-Safe Text Processing. + for _, r := range runes { + if cr := &chars[r]; cr.ccc == 0 && !cr.forms[FCompatibility].combinesBackward { + break + } + c.nLeadingNonStarters++ + } + for i := len(runes) - 1; i >= 0; i-- { + if cr := &chars[runes[i]]; cr.ccc == 0 && !cr.forms[FCompatibility].combinesBackward { + break + } + c.nTrailingNonStarters++ + } + if c.nTrailingNonStarters > 3 { + log.Fatalf("%U: Decomposition with more than 3 (%d) trailing modifiers (%U)", i, c.nTrailingNonStarters, runes) + } + + if isHangul(rune(i)) { + c.nTrailingNonStarters = 2 + if isHangulWithoutJamoT(rune(i)) { + c.nTrailingNonStarters = 1 + } + } + + if l, t := c.nLeadingNonStarters, c.nTrailingNonStarters; l > 0 && l != t { + log.Fatalf("%U: number of leading and trailing non-starters should be equal (%d vs %d)", i, l, t) + } + if t := c.nTrailingNonStarters; t > 3 { + log.Fatalf("%U: number of trailing non-starters is %d > 3", t) + } + } +} + +func printBytes(w io.Writer, b []byte, name string) { + fmt.Fprintf(w, "// %s: %d bytes\n", name, len(b)) + fmt.Fprintf(w, "var %s = [...]byte {", name) + for i, c := range b { + switch { + case i%64 == 0: + fmt.Fprintf(w, "\n// Bytes %x - %x\n", i, i+63) + case i%8 == 0: + fmt.Fprintf(w, "\n") + } + fmt.Fprintf(w, "0x%.2X, ", c) + } + fmt.Fprint(w, "\n}\n\n") +} + +// See forminfo.go for format. +func makeEntry(f *FormInfo, c *Char) uint16 { + e := uint16(0) + if r := c.codePoint; HangulBase <= r && r < HangulEnd { + e |= 0x40 + } + if f.combinesForward { + e |= 0x20 + } + if f.quickCheck[MDecomposed] == QCNo { + e |= 0x4 + } + switch f.quickCheck[MComposed] { + case QCYes: + case QCNo: + e |= 0x10 + case QCMaybe: + e |= 0x18 + default: + log.Fatalf("Illegal quickcheck value %v.", f.quickCheck[MComposed]) + } + e |= uint16(c.nTrailingNonStarters) + return e +} + +// decompSet keeps track of unique decompositions, grouped by whether +// the decomposition is followed by a trailing and/or leading CCC. +type decompSet [7]map[string]bool + +const ( + normalDecomp = iota + firstMulti + firstCCC + endMulti + firstLeadingCCC + firstCCCZeroExcept + firstStarterWithNLead + lastDecomp +) + +var cname = []string{"firstMulti", "firstCCC", "endMulti", "firstLeadingCCC", "firstCCCZeroExcept", "firstStarterWithNLead", "lastDecomp"} + +func makeDecompSet() decompSet { + m := decompSet{} + for i := range m { + m[i] = make(map[string]bool) + } + return m +} +func (m *decompSet) insert(key int, s string) { + m[key][s] = true +} + +func printCharInfoTables(w io.Writer) int { + mkstr := func(r rune, f *FormInfo) (int, string) { + d := f.expandedDecomp + s := string([]rune(d)) + if max := 1 << 6; len(s) >= max { + const msg = "%U: too many bytes in decomposition: %d >= %d" + log.Fatalf(msg, r, len(s), max) + } + head := uint8(len(s)) + if f.quickCheck[MComposed] != QCYes { + head |= 0x40 + } + if f.combinesForward { + head |= 0x80 + } + s = string([]byte{head}) + s + + lccc := ccc(d[0]) + tccc := ccc(d[len(d)-1]) + cc := ccc(r) + if cc != 0 && lccc == 0 && tccc == 0 { + log.Fatalf("%U: trailing and leading ccc are 0 for non-zero ccc %d", r, cc) + } + if tccc < lccc && lccc != 0 { + const msg = "%U: lccc (%d) must be <= tcc (%d)" + log.Fatalf(msg, r, lccc, tccc) + } + index := normalDecomp + nTrail := chars[r].nTrailingNonStarters + if tccc > 0 || lccc > 0 || nTrail > 0 { + tccc <<= 2 + tccc |= nTrail + s += string([]byte{tccc}) + index = endMulti + for _, r := range d[1:] { + if ccc(r) == 0 { + index = firstCCC + } + } + if lccc > 0 { + s += string([]byte{lccc}) + if index == firstCCC { + log.Fatalf("%U: multi-segment decomposition not supported for decompositions with leading CCC != 0", r) + } + index = firstLeadingCCC + } + if cc != lccc { + if cc != 0 { + log.Fatalf("%U: for lccc != ccc, expected ccc to be 0; was %d", r, cc) + } + index = firstCCCZeroExcept + } + } else if len(d) > 1 { + index = firstMulti + } + return index, s + } + + decompSet := makeDecompSet() + const nLeadStr = "\x00\x01" // 0-byte length and tccc with nTrail. + decompSet.insert(firstStarterWithNLead, nLeadStr) + + // Store the uniqued decompositions in a byte buffer, + // preceded by their byte length. + for _, c := range chars { + for _, f := range c.forms { + if len(f.expandedDecomp) == 0 { + continue + } + if f.combinesBackward { + log.Fatalf("%U: combinesBackward and decompose", c.codePoint) + } + index, s := mkstr(c.codePoint, &f) + decompSet.insert(index, s) + } + } + + decompositions := bytes.NewBuffer(make([]byte, 0, 10000)) + size := 0 + positionMap := make(map[string]uint16) + decompositions.WriteString("\000") + fmt.Fprintln(w, "const (") + for i, m := range decompSet { + sa := []string{} + for s := range m { + sa = append(sa, s) + } + sort.Strings(sa) + for _, s := range sa { + p := decompositions.Len() + decompositions.WriteString(s) + positionMap[s] = uint16(p) + } + if cname[i] != "" { + fmt.Fprintf(w, "%s = 0x%X\n", cname[i], decompositions.Len()) + } + } + fmt.Fprintln(w, "maxDecomp = 0x8000") + fmt.Fprintln(w, ")") + b := decompositions.Bytes() + printBytes(w, b, "decomps") + size += len(b) + + varnames := []string{"nfc", "nfkc"} + for i := 0; i < FNumberOfFormTypes; i++ { + trie := triegen.NewTrie(varnames[i]) + + for r, c := range chars { + f := c.forms[i] + d := f.expandedDecomp + if len(d) != 0 { + _, key := mkstr(c.codePoint, &f) + trie.Insert(rune(r), uint64(positionMap[key])) + if c.ccc != ccc(d[0]) { + // We assume the lead ccc of a decomposition !=0 in this case. + if ccc(d[0]) == 0 { + log.Fatalf("Expected leading CCC to be non-zero; ccc is %d", c.ccc) + } + } + } else if c.nLeadingNonStarters > 0 && len(f.expandedDecomp) == 0 && c.ccc == 0 && !f.combinesBackward { + // Handle cases where it can't be detected that the nLead should be equal + // to nTrail. + trie.Insert(c.codePoint, uint64(positionMap[nLeadStr])) + } else if v := makeEntry(&f, &c)<<8 | uint16(c.ccc); v != 0 { + trie.Insert(c.codePoint, uint64(0x8000|v)) + } + } + sz, err := trie.Gen(w, triegen.Compact(&normCompacter{name: varnames[i]})) + if err != nil { + log.Fatal(err) + } + size += sz + } + return size +} + +func contains(sa []string, s string) bool { + for _, a := range sa { + if a == s { + return true + } + } + return false +} + +func makeTables() { + w := &bytes.Buffer{} + + size := 0 + if *tablelist == "" { + return + } + list := strings.Split(*tablelist, ",") + if *tablelist == "all" { + list = []string{"recomp", "info"} + } + + // Compute maximum decomposition size. + max := 0 + for _, c := range chars { + if n := len(string(c.forms[FCompatibility].expandedDecomp)); n > max { + max = n + } + } + + fmt.Fprintln(w, "const (") + fmt.Fprintln(w, "\t// Version is the Unicode edition from which the tables are derived.") + fmt.Fprintf(w, "\tVersion = %q\n", gen.UnicodeVersion()) + fmt.Fprintln(w) + fmt.Fprintln(w, "\t// MaxTransformChunkSize indicates the maximum number of bytes that Transform") + fmt.Fprintln(w, "\t// may need to write atomically for any Form. Making a destination buffer at") + fmt.Fprintln(w, "\t// least this size ensures that Transform can always make progress and that") + fmt.Fprintln(w, "\t// the user does not need to grow the buffer on an ErrShortDst.") + fmt.Fprintf(w, "\tMaxTransformChunkSize = %d+maxNonStarters*4\n", len(string(0x034F))+max) + fmt.Fprintln(w, ")\n") + + // Print the CCC remap table. + size += len(cccMap) + fmt.Fprintf(w, "var ccc = [%d]uint8{", len(cccMap)) + for i := 0; i < len(cccMap); i++ { + if i%8 == 0 { + fmt.Fprintln(w) + } + fmt.Fprintf(w, "%3d, ", cccMap[uint8(i)]) + } + fmt.Fprintln(w, "\n}\n") + + if contains(list, "info") { + size += printCharInfoTables(w) + } + + if contains(list, "recomp") { + // Note that we use 32 bit keys, instead of 64 bit. + // This clips the bits of three entries, but we know + // this won't cause a collision. The compiler will catch + // any changes made to UnicodeData.txt that introduces + // a collision. + // Note that the recomposition map for NFC and NFKC + // are identical. + + // Recomposition map + nrentries := 0 + for _, c := range chars { + f := c.forms[FCanonical] + if !f.isOneWay && len(f.decomp) > 0 { + nrentries++ + } + } + sz := nrentries * 8 + size += sz + fmt.Fprintf(w, "// recompMap: %d bytes (entries only)\n", sz) + fmt.Fprintln(w, "var recompMap = map[uint32]rune{") + for i, c := range chars { + f := c.forms[FCanonical] + d := f.decomp + if !f.isOneWay && len(d) > 0 { + key := uint32(uint16(d[0]))<<16 + uint32(uint16(d[1])) + fmt.Fprintf(w, "0x%.8X: 0x%.4X,\n", key, i) + } + } + fmt.Fprintf(w, "}\n\n") + } + + fmt.Fprintf(w, "// Total size of tables: %dKB (%d bytes)\n", (size+512)/1024, size) + gen.WriteGoFile("tables.go", "norm", w.Bytes()) +} + +func printChars() { + if *verbose { + for _, c := range chars { + if !c.isValid() || c.state == SMissing { + continue + } + fmt.Println(c) + } + } +} + +// verifyComputed does various consistency tests. +func verifyComputed() { + for i, c := range chars { + for _, f := range c.forms { + isNo := (f.quickCheck[MDecomposed] == QCNo) + if (len(f.decomp) > 0) != isNo && !isHangul(rune(i)) { + log.Fatalf("%U: NF*D QC must be No if rune decomposes", i) + } + + isMaybe := f.quickCheck[MComposed] == QCMaybe + if f.combinesBackward != isMaybe { + log.Fatalf("%U: NF*C QC must be Maybe if combinesBackward", i) + } + if len(f.decomp) > 0 && f.combinesForward && isMaybe { + log.Fatalf("%U: NF*C QC must be Yes or No if combinesForward and decomposes", i) + } + + if len(f.expandedDecomp) != 0 { + continue + } + if a, b := c.nLeadingNonStarters > 0, (c.ccc > 0 || f.combinesBackward); a != b { + // We accept these runes to be treated differently (it only affects + // segment breaking in iteration, most likely on improper use), but + // reconsider if more characters are added. + // U+FF9E HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L;<narrow> 3099;;;;N;;;;; + // U+FF9F HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L;<narrow> 309A;;;;N;;;;; + // U+3133 HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; + // U+318E HANGUL LETTER ARAEAE;Lo;0;L;<compat> 11A1;;;;N;HANGUL LETTER ALAE AE;;;; + // U+FFA3 HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<narrow> 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; + // U+FFDC HALFWIDTH HANGUL LETTER I;Lo;0;L;<narrow> 3163;;;;N;;;;; + if i != 0xFF9E && i != 0xFF9F && !(0x3133 <= i && i <= 0x318E) && !(0xFFA3 <= i && i <= 0xFFDC) { + log.Fatalf("%U: nLead was %v; want %v", i, a, b) + } + } + } + nfc := c.forms[FCanonical] + nfkc := c.forms[FCompatibility] + if nfc.combinesBackward != nfkc.combinesBackward { + log.Fatalf("%U: Cannot combine combinesBackward\n", c.codePoint) + } + } +} + +// Use values in DerivedNormalizationProps.txt to compare against the +// values we computed. +// DerivedNormalizationProps.txt has form: +// 00C0..00C5 ; NFD_QC; N # ... +// 0374 ; NFD_QC; N # ... +// See http://unicode.org/reports/tr44/ for full explanation +func testDerived() { + f := gen.OpenUCDFile("DerivedNormalizationProps.txt") + defer f.Close() + p := ucd.New(f) + for p.Next() { + r := p.Rune(0) + c := &chars[r] + + var ftype, mode int + qt := p.String(1) + switch qt { + case "NFC_QC": + ftype, mode = FCanonical, MComposed + case "NFD_QC": + ftype, mode = FCanonical, MDecomposed + case "NFKC_QC": + ftype, mode = FCompatibility, MComposed + case "NFKD_QC": + ftype, mode = FCompatibility, MDecomposed + default: + continue + } + var qr QCResult + switch p.String(2) { + case "Y": + qr = QCYes + case "N": + qr = QCNo + case "M": + qr = QCMaybe + default: + log.Fatalf(`Unexpected quick check value "%s"`, p.String(2)) + } + if got := c.forms[ftype].quickCheck[mode]; got != qr { + log.Printf("%U: FAILED %s (was %v need %v)\n", r, qt, got, qr) + } + c.forms[ftype].verified[mode] = true + } + if err := p.Err(); err != nil { + log.Fatal(err) + } + // Any unspecified value must be QCYes. Verify this. + for i, c := range chars { + for j, fd := range c.forms { + for k, qr := range fd.quickCheck { + if !fd.verified[k] && qr != QCYes { + m := "%U: FAIL F:%d M:%d (was %v need Yes) %s\n" + log.Printf(m, i, j, k, qr, c.name) + } + } + } + } +} + +var testHeader = `const ( + Yes = iota + No + Maybe +) + +type formData struct { + qc uint8 + combinesForward bool + decomposition string +} + +type runeData struct { + r rune + ccc uint8 + nLead uint8 + nTrail uint8 + f [2]formData // 0: canonical; 1: compatibility +} + +func f(qc uint8, cf bool, dec string) [2]formData { + return [2]formData{{qc, cf, dec}, {qc, cf, dec}} +} + +func g(qc, qck uint8, cf, cfk bool, d, dk string) [2]formData { + return [2]formData{{qc, cf, d}, {qck, cfk, dk}} +} + +var testData = []runeData{ +` + +func printTestdata() { + type lastInfo struct { + ccc uint8 + nLead uint8 + nTrail uint8 + f string + } + + last := lastInfo{} + w := &bytes.Buffer{} + fmt.Fprintf(w, testHeader) + for r, c := range chars { + f := c.forms[FCanonical] + qc, cf, d := f.quickCheck[MComposed], f.combinesForward, string(f.expandedDecomp) + f = c.forms[FCompatibility] + qck, cfk, dk := f.quickCheck[MComposed], f.combinesForward, string(f.expandedDecomp) + s := "" + if d == dk && qc == qck && cf == cfk { + s = fmt.Sprintf("f(%s, %v, %q)", qc, cf, d) + } else { + s = fmt.Sprintf("g(%s, %s, %v, %v, %q, %q)", qc, qck, cf, cfk, d, dk) + } + current := lastInfo{c.ccc, c.nLeadingNonStarters, c.nTrailingNonStarters, s} + if last != current { + fmt.Fprintf(w, "\t{0x%x, %d, %d, %d, %s},\n", r, c.origCCC, c.nLeadingNonStarters, c.nTrailingNonStarters, s) + last = current + } + } + fmt.Fprintln(w, "}") + gen.WriteGoFile("data_test.go", "norm", w.Bytes()) +} diff --git a/vendor/golang.org/x/text/unicode/norm/norm_test.go b/vendor/golang.org/x/text/unicode/norm/norm_test.go new file mode 100644 index 0000000000..12dacfcf30 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/norm_test.go @@ -0,0 +1,14 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package norm_test + +import ( + "testing" +) + +func TestPlaceHolder(t *testing.T) { + // Does nothing, just allows the Makefile to be canonical + // while waiting for the package itself to be written. +} diff --git a/vendor/golang.org/x/text/unicode/norm/normalize.go b/vendor/golang.org/x/text/unicode/norm/normalize.go new file mode 100644 index 0000000000..75dbde71c6 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/normalize.go @@ -0,0 +1,527 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:generate go run maketables.go triegen.go +//go:generate go run maketables.go triegen.go -test + +// Package norm contains types and functions for normalizing Unicode strings. +package norm // import "golang.org/x/text/unicode/norm" + +import "unicode/utf8" + +// A Form denotes a canonical representation of Unicode code points. +// The Unicode-defined normalization and equivalence forms are: +// +// NFC Unicode Normalization Form C +// NFD Unicode Normalization Form D +// NFKC Unicode Normalization Form KC +// NFKD Unicode Normalization Form KD +// +// For a Form f, this documentation uses the notation f(x) to mean +// the bytes or string x converted to the given form. +// A position n in x is called a boundary if conversion to the form can +// proceed independently on both sides: +// f(x) == append(f(x[0:n]), f(x[n:])...) +// +// References: http://unicode.org/reports/tr15/ and +// http://unicode.org/notes/tn5/. +type Form int + +const ( + NFC Form = iota + NFD + NFKC + NFKD +) + +// Bytes returns f(b). May return b if f(b) = b. +func (f Form) Bytes(b []byte) []byte { + src := inputBytes(b) + ft := formTable[f] + n, ok := ft.quickSpan(src, 0, len(b), true) + if ok { + return b + } + out := make([]byte, n, len(b)) + copy(out, b[0:n]) + rb := reorderBuffer{f: *ft, src: src, nsrc: len(b), out: out, flushF: appendFlush} + return doAppendInner(&rb, n) +} + +// String returns f(s). +func (f Form) String(s string) string { + src := inputString(s) + ft := formTable[f] + n, ok := ft.quickSpan(src, 0, len(s), true) + if ok { + return s + } + out := make([]byte, n, len(s)) + copy(out, s[0:n]) + rb := reorderBuffer{f: *ft, src: src, nsrc: len(s), out: out, flushF: appendFlush} + return string(doAppendInner(&rb, n)) +} + +// IsNormal returns true if b == f(b). +func (f Form) IsNormal(b []byte) bool { + src := inputBytes(b) + ft := formTable[f] + bp, ok := ft.quickSpan(src, 0, len(b), true) + if ok { + return true + } + rb := reorderBuffer{f: *ft, src: src, nsrc: len(b)} + rb.setFlusher(nil, cmpNormalBytes) + for bp < len(b) { + rb.out = b[bp:] + if bp = decomposeSegment(&rb, bp, true); bp < 0 { + return false + } + bp, _ = rb.f.quickSpan(rb.src, bp, len(b), true) + } + return true +} + +func cmpNormalBytes(rb *reorderBuffer) bool { + b := rb.out + for i := 0; i < rb.nrune; i++ { + info := rb.rune[i] + if int(info.size) > len(b) { + return false + } + p := info.pos + pe := p + info.size + for ; p < pe; p++ { + if b[0] != rb.byte[p] { + return false + } + b = b[1:] + } + } + return true +} + +// IsNormalString returns true if s == f(s). +func (f Form) IsNormalString(s string) bool { + src := inputString(s) + ft := formTable[f] + bp, ok := ft.quickSpan(src, 0, len(s), true) + if ok { + return true + } + rb := reorderBuffer{f: *ft, src: src, nsrc: len(s)} + rb.setFlusher(nil, func(rb *reorderBuffer) bool { + for i := 0; i < rb.nrune; i++ { + info := rb.rune[i] + if bp+int(info.size) > len(s) { + return false + } + p := info.pos + pe := p + info.size + for ; p < pe; p++ { + if s[bp] != rb.byte[p] { + return false + } + bp++ + } + } + return true + }) + for bp < len(s) { + if bp = decomposeSegment(&rb, bp, true); bp < 0 { + return false + } + bp, _ = rb.f.quickSpan(rb.src, bp, len(s), true) + } + return true +} + +// patchTail fixes a case where a rune may be incorrectly normalized +// if it is followed by illegal continuation bytes. It returns the +// patched buffer and whether the decomposition is still in progress. +func patchTail(rb *reorderBuffer) bool { + info, p := lastRuneStart(&rb.f, rb.out) + if p == -1 || info.size == 0 { + return true + } + end := p + int(info.size) + extra := len(rb.out) - end + if extra > 0 { + // Potentially allocating memory. However, this only + // happens with ill-formed UTF-8. + x := make([]byte, 0) + x = append(x, rb.out[len(rb.out)-extra:]...) + rb.out = rb.out[:end] + decomposeToLastBoundary(rb) + rb.doFlush() + rb.out = append(rb.out, x...) + return false + } + buf := rb.out[p:] + rb.out = rb.out[:p] + decomposeToLastBoundary(rb) + if s := rb.ss.next(info); s == ssStarter { + rb.doFlush() + rb.ss.first(info) + } else if s == ssOverflow { + rb.doFlush() + rb.insertCGJ() + rb.ss = 0 + } + rb.insertUnsafe(inputBytes(buf), 0, info) + return true +} + +func appendQuick(rb *reorderBuffer, i int) int { + if rb.nsrc == i { + return i + } + end, _ := rb.f.quickSpan(rb.src, i, rb.nsrc, true) + rb.out = rb.src.appendSlice(rb.out, i, end) + return end +} + +// Append returns f(append(out, b...)). +// The buffer out must be nil, empty, or equal to f(out). +func (f Form) Append(out []byte, src ...byte) []byte { + return f.doAppend(out, inputBytes(src), len(src)) +} + +func (f Form) doAppend(out []byte, src input, n int) []byte { + if n == 0 { + return out + } + ft := formTable[f] + // Attempt to do a quickSpan first so we can avoid initializing the reorderBuffer. + if len(out) == 0 { + p, _ := ft.quickSpan(src, 0, n, true) + out = src.appendSlice(out, 0, p) + if p == n { + return out + } + rb := reorderBuffer{f: *ft, src: src, nsrc: n, out: out, flushF: appendFlush} + return doAppendInner(&rb, p) + } + rb := reorderBuffer{f: *ft, src: src, nsrc: n} + return doAppend(&rb, out, 0) +} + +func doAppend(rb *reorderBuffer, out []byte, p int) []byte { + rb.setFlusher(out, appendFlush) + src, n := rb.src, rb.nsrc + doMerge := len(out) > 0 + if q := src.skipContinuationBytes(p); q > p { + // Move leading non-starters to destination. + rb.out = src.appendSlice(rb.out, p, q) + p = q + doMerge = patchTail(rb) + } + fd := &rb.f + if doMerge { + var info Properties + if p < n { + info = fd.info(src, p) + if !info.BoundaryBefore() || info.nLeadingNonStarters() > 0 { + if p == 0 { + decomposeToLastBoundary(rb) + } + p = decomposeSegment(rb, p, true) + } + } + if info.size == 0 { + rb.doFlush() + // Append incomplete UTF-8 encoding. + return src.appendSlice(rb.out, p, n) + } + if rb.nrune > 0 { + return doAppendInner(rb, p) + } + } + p = appendQuick(rb, p) + return doAppendInner(rb, p) +} + +func doAppendInner(rb *reorderBuffer, p int) []byte { + for n := rb.nsrc; p < n; { + p = decomposeSegment(rb, p, true) + p = appendQuick(rb, p) + } + return rb.out +} + +// AppendString returns f(append(out, []byte(s))). +// The buffer out must be nil, empty, or equal to f(out). +func (f Form) AppendString(out []byte, src string) []byte { + return f.doAppend(out, inputString(src), len(src)) +} + +// QuickSpan returns a boundary n such that b[0:n] == f(b[0:n]). +// It is not guaranteed to return the largest such n. +func (f Form) QuickSpan(b []byte) int { + n, _ := formTable[f].quickSpan(inputBytes(b), 0, len(b), true) + return n +} + +// quickSpan returns a boundary n such that src[0:n] == f(src[0:n]) and +// whether any non-normalized parts were found. If atEOF is false, n will +// not point past the last segment if this segment might be become +// non-normalized by appending other runes. +func (f *formInfo) quickSpan(src input, i, end int, atEOF bool) (n int, ok bool) { + var lastCC uint8 + ss := streamSafe(0) + lastSegStart := i + for n = end; i < n; { + if j := src.skipASCII(i, n); i != j { + i = j + lastSegStart = i - 1 + lastCC = 0 + ss = 0 + continue + } + info := f.info(src, i) + if info.size == 0 { + if atEOF { + // include incomplete runes + return n, true + } + return lastSegStart, true + } + // This block needs to be before the next, because it is possible to + // have an overflow for runes that are starters (e.g. with U+FF9E). + switch ss.next(info) { + case ssStarter: + ss.first(info) + lastSegStart = i + case ssOverflow: + return lastSegStart, false + case ssSuccess: + if lastCC > info.ccc { + return lastSegStart, false + } + } + if f.composing { + if !info.isYesC() { + break + } + } else { + if !info.isYesD() { + break + } + } + lastCC = info.ccc + i += int(info.size) + } + if i == n { + if !atEOF { + n = lastSegStart + } + return n, true + } + return lastSegStart, false +} + +// QuickSpanString returns a boundary n such that b[0:n] == f(s[0:n]). +// It is not guaranteed to return the largest such n. +func (f Form) QuickSpanString(s string) int { + n, _ := formTable[f].quickSpan(inputString(s), 0, len(s), true) + return n +} + +// FirstBoundary returns the position i of the first boundary in b +// or -1 if b contains no boundary. +func (f Form) FirstBoundary(b []byte) int { + return f.firstBoundary(inputBytes(b), len(b)) +} + +func (f Form) firstBoundary(src input, nsrc int) int { + i := src.skipContinuationBytes(0) + if i >= nsrc { + return -1 + } + fd := formTable[f] + ss := streamSafe(0) + // We should call ss.first here, but we can't as the first rune is + // skipped already. This means FirstBoundary can't really determine + // CGJ insertion points correctly. Luckily it doesn't have to. + // TODO: consider adding NextBoundary + for { + info := fd.info(src, i) + if info.size == 0 { + return -1 + } + if s := ss.next(info); s != ssSuccess { + return i + } + i += int(info.size) + if i >= nsrc { + if !info.BoundaryAfter() && !ss.isMax() { + return -1 + } + return nsrc + } + } +} + +// FirstBoundaryInString returns the position i of the first boundary in s +// or -1 if s contains no boundary. +func (f Form) FirstBoundaryInString(s string) int { + return f.firstBoundary(inputString(s), len(s)) +} + +// LastBoundary returns the position i of the last boundary in b +// or -1 if b contains no boundary. +func (f Form) LastBoundary(b []byte) int { + return lastBoundary(formTable[f], b) +} + +func lastBoundary(fd *formInfo, b []byte) int { + i := len(b) + info, p := lastRuneStart(fd, b) + if p == -1 { + return -1 + } + if info.size == 0 { // ends with incomplete rune + if p == 0 { // starts with incomplete rune + return -1 + } + i = p + info, p = lastRuneStart(fd, b[:i]) + if p == -1 { // incomplete UTF-8 encoding or non-starter bytes without a starter + return i + } + } + if p+int(info.size) != i { // trailing non-starter bytes: illegal UTF-8 + return i + } + if info.BoundaryAfter() { + return i + } + ss := streamSafe(0) + v := ss.backwards(info) + for i = p; i >= 0 && v != ssStarter; i = p { + info, p = lastRuneStart(fd, b[:i]) + if v = ss.backwards(info); v == ssOverflow { + break + } + if p+int(info.size) != i { + if p == -1 { // no boundary found + return -1 + } + return i // boundary after an illegal UTF-8 encoding + } + } + return i +} + +// decomposeSegment scans the first segment in src into rb. It inserts 0x034f +// (Grapheme Joiner) when it encounters a sequence of more than 30 non-starters +// and returns the number of bytes consumed from src or iShortDst or iShortSrc. +func decomposeSegment(rb *reorderBuffer, sp int, atEOF bool) int { + // Force one character to be consumed. + info := rb.f.info(rb.src, sp) + if info.size == 0 { + return 0 + } + if rb.nrune > 0 { + if s := rb.ss.next(info); s == ssStarter { + goto end + } else if s == ssOverflow { + rb.insertCGJ() + goto end + } + } else { + rb.ss.first(info) + } + if err := rb.insertFlush(rb.src, sp, info); err != iSuccess { + return int(err) + } + for { + sp += int(info.size) + if sp >= rb.nsrc { + if !atEOF && !info.BoundaryAfter() { + return int(iShortSrc) + } + break + } + info = rb.f.info(rb.src, sp) + if info.size == 0 { + if !atEOF { + return int(iShortSrc) + } + break + } + if s := rb.ss.next(info); s == ssStarter { + break + } else if s == ssOverflow { + rb.insertCGJ() + break + } + if err := rb.insertFlush(rb.src, sp, info); err != iSuccess { + return int(err) + } + } +end: + if !rb.doFlush() { + return int(iShortDst) + } + return sp +} + +// lastRuneStart returns the runeInfo and position of the last +// rune in buf or the zero runeInfo and -1 if no rune was found. +func lastRuneStart(fd *formInfo, buf []byte) (Properties, int) { + p := len(buf) - 1 + for ; p >= 0 && !utf8.RuneStart(buf[p]); p-- { + } + if p < 0 { + return Properties{}, -1 + } + return fd.info(inputBytes(buf), p), p +} + +// decomposeToLastBoundary finds an open segment at the end of the buffer +// and scans it into rb. Returns the buffer minus the last segment. +func decomposeToLastBoundary(rb *reorderBuffer) { + fd := &rb.f + info, i := lastRuneStart(fd, rb.out) + if int(info.size) != len(rb.out)-i { + // illegal trailing continuation bytes + return + } + if info.BoundaryAfter() { + return + } + var add [maxNonStarters + 1]Properties // stores runeInfo in reverse order + padd := 0 + ss := streamSafe(0) + p := len(rb.out) + for { + add[padd] = info + v := ss.backwards(info) + if v == ssOverflow { + // Note that if we have an overflow, it the string we are appending to + // is not correctly normalized. In this case the behavior is undefined. + break + } + padd++ + p -= int(info.size) + if v == ssStarter || p < 0 { + break + } + info, i = lastRuneStart(fd, rb.out[:p]) + if int(info.size) != p-i { + break + } + } + rb.ss = ss + // Copy bytes for insertion as we may need to overwrite rb.out. + var buf [maxBufferSize * utf8.UTFMax]byte + cp := buf[:copy(buf[:], rb.out[p:])] + rb.out = rb.out[:p] + for padd--; padd >= 0; padd-- { + info = add[padd] + rb.insertUnsafe(inputBytes(cp), 0, info) + cp = cp[info.size:] + } +} diff --git a/vendor/golang.org/x/text/unicode/norm/normalize_test.go b/vendor/golang.org/x/text/unicode/norm/normalize_test.go new file mode 100644 index 0000000000..29443a5b6d --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/normalize_test.go @@ -0,0 +1,1143 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package norm + +import ( + "bytes" + "flag" + "fmt" + "io" + "log" + "strings" + "testing" + "unicode/utf8" +) + +var ( + testn = flag.Int("testn", -1, "specific test number to run or -1 for all") +) + +// pc replaces any rune r that is repeated n times, for n > 1, with r{n}. +func pc(s string) []byte { + b := bytes.NewBuffer(make([]byte, 0, len(s))) + for i := 0; i < len(s); { + r, sz := utf8.DecodeRuneInString(s[i:]) + n := 0 + if sz == 1 { + // Special-case one-byte case to handle repetition for invalid UTF-8. + for c := s[i]; i+n < len(s) && s[i+n] == c; n++ { + } + } else { + for _, r2 := range s[i:] { + if r2 != r { + break + } + n++ + } + } + b.WriteString(s[i : i+sz]) + if n > 1 { + fmt.Fprintf(b, "{%d}", n) + } + i += sz * n + } + return b.Bytes() +} + +// pidx finds the index from which two strings start to differ, plus context. +// It returns the index and ellipsis if the index is greater than 0. +func pidx(a, b string) (i int, prefix string) { + for ; i < len(a) && i < len(b) && a[i] == b[i]; i++ { + } + if i < 8 { + return 0, "" + } + i -= 3 // ensure taking at least one full rune before the difference. + for k := i - 7; i > k && !utf8.RuneStart(a[i]); i-- { + } + return i, "..." +} + +type PositionTest struct { + input string + pos int + buffer string // expected contents of reorderBuffer, if applicable +} + +type positionFunc func(rb *reorderBuffer, s string) (int, []byte) + +func runPosTests(t *testing.T, name string, f Form, fn positionFunc, tests []PositionTest) { + rb := reorderBuffer{} + rb.init(f, nil) + for i, test := range tests { + rb.reset() + rb.src = inputString(test.input) + rb.nsrc = len(test.input) + pos, out := fn(&rb, test.input) + if pos != test.pos { + t.Errorf("%s:%d: position is %d; want %d", name, i, pos, test.pos) + } + if outs := string(out); outs != test.buffer { + k, pfx := pidx(outs, test.buffer) + t.Errorf("%s:%d: buffer \nwas %s%+q; \nwant %s%+q", name, i, pfx, pc(outs[k:]), pfx, pc(test.buffer[k:])) + } + } +} + +func grave(n int) string { + return rep(0x0300, n) +} + +func rep(r rune, n int) string { + return strings.Repeat(string(r), n) +} + +const segSize = maxByteBufferSize + +var cgj = GraphemeJoiner + +var decomposeSegmentTests = []PositionTest{ + // illegal runes + {"\xC2", 0, ""}, + {"\xC0", 1, "\xC0"}, + {"\u00E0\x80", 2, "\u0061\u0300"}, + // starter + {"a", 1, "a"}, + {"ab", 1, "a"}, + // starter + composing + {"a\u0300", 3, "a\u0300"}, + {"a\u0300b", 3, "a\u0300"}, + // with decomposition + {"\u00C0", 2, "A\u0300"}, + {"\u00C0b", 2, "A\u0300"}, + // long + {grave(31), 60, grave(30) + cgj}, + {"a" + grave(31), 61, "a" + grave(30) + cgj}, + + // Stability tests: see http://www.unicode.org/review/pr-29.html. + // U+0300 COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;;;; + // U+0B47 ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; + // U+0B3E ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; + // U+1100 HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;;;; + // U+1161 HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;; + {"\u0B47\u0300\u0B3E", 8, "\u0B47\u0300\u0B3E"}, + {"\u1100\u0300\u1161", 8, "\u1100\u0300\u1161"}, + {"\u0B47\u0B3E", 6, "\u0B47\u0B3E"}, + {"\u1100\u1161", 6, "\u1100\u1161"}, + + // U+04DA MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;; + // Sequence of decomposing characters that are starters and modifiers. + {"\u0d4a" + strings.Repeat("\u0d3e", 31), 90, "\u0d46" + strings.Repeat("\u0d3e", 30) + cgj}, + + {grave(30), 60, grave(30)}, + // U+FF9E is a starter, but decomposes to U+3099, which is not. + {grave(30) + "\uff9e", 60, grave(30) + cgj}, + // ends with incomplete UTF-8 encoding + {"\xCC", 0, ""}, + {"\u0300\xCC", 2, "\u0300"}, +} + +func decomposeSegmentF(rb *reorderBuffer, s string) (int, []byte) { + rb.initString(NFD, s) + rb.setFlusher(nil, appendFlush) + p := decomposeSegment(rb, 0, true) + return p, rb.out +} + +func TestDecomposeSegment(t *testing.T) { + runPosTests(t, "TestDecomposeSegment", NFC, decomposeSegmentF, decomposeSegmentTests) +} + +var firstBoundaryTests = []PositionTest{ + // no boundary + {"", -1, ""}, + {"\u0300", -1, ""}, + {"\x80\x80", -1, ""}, + // illegal runes + {"\xff", 0, ""}, + {"\u0300\xff", 2, ""}, + {"\u0300\xc0\x80\x80", 2, ""}, + // boundaries + {"a", 0, ""}, + {"\u0300a", 2, ""}, + // Hangul + {"\u1103\u1161", 0, ""}, + {"\u110B\u1173\u11B7", 0, ""}, + {"\u1161\u110B\u1173\u11B7", 3, ""}, + {"\u1173\u11B7\u1103\u1161", 6, ""}, + // too many combining characters. + {grave(maxNonStarters - 1), -1, ""}, + {grave(maxNonStarters), 60, ""}, + {grave(maxNonStarters + 1), 60, ""}, +} + +func firstBoundaryF(rb *reorderBuffer, s string) (int, []byte) { + return rb.f.form.FirstBoundary([]byte(s)), nil +} + +func firstBoundaryStringF(rb *reorderBuffer, s string) (int, []byte) { + return rb.f.form.FirstBoundaryInString(s), nil +} + +func TestFirstBoundary(t *testing.T) { + runPosTests(t, "TestFirstBoundary", NFC, firstBoundaryF, firstBoundaryTests) + runPosTests(t, "TestFirstBoundaryInString", NFC, firstBoundaryStringF, firstBoundaryTests) +} + +var decomposeToLastTests = []PositionTest{ + // ends with inert character + {"Hello!", 6, ""}, + {"\u0632", 2, ""}, + {"a\u0301\u0635", 5, ""}, + // ends with non-inert starter + {"a", 0, "a"}, + {"a\u0301a", 3, "a"}, + {"a\u0301\u03B9", 3, "\u03B9"}, + {"a\u0327", 0, "a\u0327"}, + // illegal runes + {"\xFF", 1, ""}, + {"aa\xFF", 3, ""}, + {"\xC0\x80\x80", 3, ""}, + {"\xCC\x80\x80", 3, ""}, + // ends with incomplete UTF-8 encoding + {"a\xCC", 2, ""}, + // ends with combining characters + {"\u0300\u0301", 0, "\u0300\u0301"}, + {"a\u0300\u0301", 0, "a\u0300\u0301"}, + {"a\u0301\u0308", 0, "a\u0301\u0308"}, + {"a\u0308\u0301", 0, "a\u0308\u0301"}, + {"aaaa\u0300\u0301", 3, "a\u0300\u0301"}, + {"\u0300a\u0300\u0301", 2, "a\u0300\u0301"}, + {"\u00C0", 0, "A\u0300"}, + {"a\u00C0", 1, "A\u0300"}, + // decomposing + {"a\u0300\u00E0", 3, "a\u0300"}, + // multisegment decompositions (flushes leading segments) + {"a\u0300\uFDC0", 7, "\u064A"}, + {"\uFDC0" + grave(29), 4, "\u064A" + grave(29)}, + {"\uFDC0" + grave(30), 4, "\u064A" + grave(30)}, + {"\uFDC0" + grave(31), 5, grave(30)}, + {"\uFDFA" + grave(14), 31, "\u0645" + grave(14)}, + // Overflow + {"\u00E0" + grave(29), 0, "a" + grave(30)}, + {"\u00E0" + grave(30), 2, grave(30)}, + // Hangul + {"a\u1103", 1, "\u1103"}, + {"a\u110B", 1, "\u110B"}, + {"a\u110B\u1173", 1, "\u110B\u1173"}, + // See comment in composition.go:compBoundaryAfter. + {"a\u110B\u1173\u11B7", 1, "\u110B\u1173\u11B7"}, + {"a\uC73C", 1, "\u110B\u1173"}, + {"다음", 3, "\u110B\u1173\u11B7"}, + {"다", 0, "\u1103\u1161"}, + {"\u1103\u1161\u110B\u1173\u11B7", 6, "\u110B\u1173\u11B7"}, + {"\u110B\u1173\u11B7\u1103\u1161", 9, "\u1103\u1161"}, + {"다음음", 6, "\u110B\u1173\u11B7"}, + {"음다다", 6, "\u1103\u1161"}, + // maximized buffer + {"a" + grave(30), 0, "a" + grave(30)}, + // Buffer overflow + {"a" + grave(31), 3, grave(30)}, + // weird UTF-8 + {"a\u0300\u11B7", 0, "a\u0300\u11B7"}, +} + +func decomposeToLast(rb *reorderBuffer, s string) (int, []byte) { + rb.setFlusher([]byte(s), appendFlush) + decomposeToLastBoundary(rb) + buf := rb.flush(nil) + return len(rb.out), buf +} + +func TestDecomposeToLastBoundary(t *testing.T) { + runPosTests(t, "TestDecomposeToLastBoundary", NFKC, decomposeToLast, decomposeToLastTests) +} + +var lastBoundaryTests = []PositionTest{ + // ends with inert character + {"Hello!", 6, ""}, + {"\u0632", 2, ""}, + // ends with non-inert starter + {"a", 0, ""}, + // illegal runes + {"\xff", 1, ""}, + {"aa\xff", 3, ""}, + {"a\xff\u0300", 1, ""}, // TODO: should probably be 2. + {"\xc0\x80\x80", 3, ""}, + {"\xc0\x80\x80\u0300", 3, ""}, + // ends with incomplete UTF-8 encoding + {"\xCC", -1, ""}, + {"\xE0\x80", -1, ""}, + {"\xF0\x80\x80", -1, ""}, + {"a\xCC", 0, ""}, + {"\x80\xCC", 1, ""}, + {"\xCC\xCC", 1, ""}, + // ends with combining characters + {"a\u0300\u0301", 0, ""}, + {"aaaa\u0300\u0301", 3, ""}, + {"\u0300a\u0300\u0301", 2, ""}, + {"\u00C2", 0, ""}, + {"a\u00C2", 1, ""}, + // decomposition may recombine + {"\u0226", 0, ""}, + // no boundary + {"", -1, ""}, + {"\u0300\u0301", -1, ""}, + {"\u0300", -1, ""}, + {"\x80\x80", -1, ""}, + {"\x80\x80\u0301", -1, ""}, + // Hangul + {"다음", 3, ""}, + {"다", 0, ""}, + {"\u1103\u1161\u110B\u1173\u11B7", 6, ""}, + {"\u110B\u1173\u11B7\u1103\u1161", 9, ""}, + // too many combining characters. + {grave(maxNonStarters - 1), -1, ""}, + // May still be preceded with a non-starter. + {grave(maxNonStarters), -1, ""}, + // May still need to insert a cgj after the last combiner. + {grave(maxNonStarters + 1), 2, ""}, + {grave(maxNonStarters + 2), 4, ""}, + + {"a" + grave(maxNonStarters-1), 0, ""}, + {"a" + grave(maxNonStarters), 0, ""}, + // May still need to insert a cgj after the last combiner. + {"a" + grave(maxNonStarters+1), 3, ""}, + {"a" + grave(maxNonStarters+2), 5, ""}, +} + +func lastBoundaryF(rb *reorderBuffer, s string) (int, []byte) { + return rb.f.form.LastBoundary([]byte(s)), nil +} + +func TestLastBoundary(t *testing.T) { + runPosTests(t, "TestLastBoundary", NFC, lastBoundaryF, lastBoundaryTests) +} + +var quickSpanTests = []PositionTest{ + {"", 0, ""}, + // starters + {"a", 1, ""}, + {"abc", 3, ""}, + {"\u043Eb", 3, ""}, + // incomplete last rune. + {"\xCC", 1, ""}, + {"a\xCC", 2, ""}, + // incorrectly ordered combining characters + {"\u0300\u0316", 0, ""}, + {"\u0300\u0316cd", 0, ""}, + // have a maximum number of combining characters. + {rep(0x035D, 30) + "\u035B", 0, ""}, + {"a" + rep(0x035D, 30) + "\u035B", 0, ""}, + {"Ɵ" + rep(0x035D, 30) + "\u035B", 0, ""}, + {"aa" + rep(0x035D, 30) + "\u035B", 1, ""}, + {rep(0x035D, 30) + cgj + "\u035B", 64, ""}, + {"a" + rep(0x035D, 30) + cgj + "\u035B", 65, ""}, + {"Ɵ" + rep(0x035D, 30) + cgj + "\u035B", 66, ""}, + {"aa" + rep(0x035D, 30) + cgj + "\u035B", 66, ""}, +} + +var quickSpanNFDTests = []PositionTest{ + // needs decomposing + {"\u00C0", 0, ""}, + {"abc\u00C0", 3, ""}, + // correctly ordered combining characters + {"\u0300", 2, ""}, + {"ab\u0300", 4, ""}, + {"ab\u0300cd", 6, ""}, + {"\u0300cd", 4, ""}, + {"\u0316\u0300", 4, ""}, + {"ab\u0316\u0300", 6, ""}, + {"ab\u0316\u0300cd", 8, ""}, + {"ab\u0316\u0300\u00C0", 6, ""}, + {"\u0316\u0300cd", 6, ""}, + {"\u043E\u0308b", 5, ""}, + // incorrectly ordered combining characters + {"ab\u0300\u0316", 1, ""}, // TODO: we could skip 'b' as well. + {"ab\u0300\u0316cd", 1, ""}, + // Hangul + {"같은", 0, ""}, +} + +var quickSpanNFCTests = []PositionTest{ + // okay composed + {"\u00C0", 2, ""}, + {"abc\u00C0", 5, ""}, + // correctly ordered combining characters + {"ab\u0300", 1, ""}, + {"ab\u0300cd", 1, ""}, + {"ab\u0316\u0300", 1, ""}, + {"ab\u0316\u0300cd", 1, ""}, + {"\u00C0\u035D", 4, ""}, + // we do not special case leading combining characters + {"\u0300cd", 0, ""}, + {"\u0300", 0, ""}, + {"\u0316\u0300", 0, ""}, + {"\u0316\u0300cd", 0, ""}, + // incorrectly ordered combining characters + {"ab\u0300\u0316", 1, ""}, + {"ab\u0300\u0316cd", 1, ""}, + // Hangul + {"같은", 6, ""}, + // We return the start of the violating segment in case of overflow. + {grave(30) + "\uff9e", 0, ""}, + {grave(30), 0, ""}, +} + +func doQuickSpan(rb *reorderBuffer, s string) (int, []byte) { + return rb.f.form.QuickSpan([]byte(s)), nil +} + +func doQuickSpanString(rb *reorderBuffer, s string) (int, []byte) { + return rb.f.form.QuickSpanString(s), nil +} + +func TestQuickSpan(t *testing.T) { + runPosTests(t, "TestQuickSpanNFD1", NFD, doQuickSpan, quickSpanTests) + runPosTests(t, "TestQuickSpanNFD2", NFD, doQuickSpan, quickSpanNFDTests) + runPosTests(t, "TestQuickSpanNFC1", NFC, doQuickSpan, quickSpanTests) + runPosTests(t, "TestQuickSpanNFC2", NFC, doQuickSpan, quickSpanNFCTests) + + runPosTests(t, "TestQuickSpanStringNFD1", NFD, doQuickSpanString, quickSpanTests) + runPosTests(t, "TestQuickSpanStringNFD2", NFD, doQuickSpanString, quickSpanNFDTests) + runPosTests(t, "TestQuickSpanStringNFC1", NFC, doQuickSpanString, quickSpanTests) + runPosTests(t, "TestQuickSpanStringNFC2", NFC, doQuickSpanString, quickSpanNFCTests) +} + +var isNormalTests = []PositionTest{ + {"", 1, ""}, + // illegal runes + {"\xff", 1, ""}, + // starters + {"a", 1, ""}, + {"abc", 1, ""}, + {"\u043Eb", 1, ""}, + // incorrectly ordered combining characters + {"\u0300\u0316", 0, ""}, + {"ab\u0300\u0316", 0, ""}, + {"ab\u0300\u0316cd", 0, ""}, + {"\u0300\u0316cd", 0, ""}, +} +var isNormalNFDTests = []PositionTest{ + // needs decomposing + {"\u00C0", 0, ""}, + {"abc\u00C0", 0, ""}, + // correctly ordered combining characters + {"\u0300", 1, ""}, + {"ab\u0300", 1, ""}, + {"ab\u0300cd", 1, ""}, + {"\u0300cd", 1, ""}, + {"\u0316\u0300", 1, ""}, + {"ab\u0316\u0300", 1, ""}, + {"ab\u0316\u0300cd", 1, ""}, + {"\u0316\u0300cd", 1, ""}, + {"\u043E\u0308b", 1, ""}, + // Hangul + {"같은", 0, ""}, +} +var isNormalNFCTests = []PositionTest{ + // okay composed + {"\u00C0", 1, ""}, + {"abc\u00C0", 1, ""}, + // need reordering + {"a\u0300", 0, ""}, + {"a\u0300cd", 0, ""}, + {"a\u0316\u0300", 0, ""}, + {"a\u0316\u0300cd", 0, ""}, + // correctly ordered combining characters + {"ab\u0300", 1, ""}, + {"ab\u0300cd", 1, ""}, + {"ab\u0316\u0300", 1, ""}, + {"ab\u0316\u0300cd", 1, ""}, + {"\u00C0\u035D", 1, ""}, + {"\u0300", 1, ""}, + {"\u0316\u0300cd", 1, ""}, + // Hangul + {"같은", 1, ""}, +} + +var isNormalNFKXTests = []PositionTest{ + // Special case. + {"\u00BC", 0, ""}, +} + +func isNormalF(rb *reorderBuffer, s string) (int, []byte) { + if rb.f.form.IsNormal([]byte(s)) { + return 1, nil + } + return 0, nil +} + +func isNormalStringF(rb *reorderBuffer, s string) (int, []byte) { + if rb.f.form.IsNormalString(s) { + return 1, nil + } + return 0, nil +} + +func TestIsNormal(t *testing.T) { + runPosTests(t, "TestIsNormalNFD1", NFD, isNormalF, isNormalTests) + runPosTests(t, "TestIsNormalNFD2", NFD, isNormalF, isNormalNFDTests) + runPosTests(t, "TestIsNormalNFC1", NFC, isNormalF, isNormalTests) + runPosTests(t, "TestIsNormalNFC2", NFC, isNormalF, isNormalNFCTests) + runPosTests(t, "TestIsNormalNFKD1", NFKD, isNormalF, isNormalTests) + runPosTests(t, "TestIsNormalNFKD2", NFKD, isNormalF, isNormalNFDTests) + runPosTests(t, "TestIsNormalNFKD3", NFKD, isNormalF, isNormalNFKXTests) + runPosTests(t, "TestIsNormalNFKC1", NFKC, isNormalF, isNormalTests) + runPosTests(t, "TestIsNormalNFKC2", NFKC, isNormalF, isNormalNFCTests) + runPosTests(t, "TestIsNormalNFKC3", NFKC, isNormalF, isNormalNFKXTests) +} + +func TestIsNormalString(t *testing.T) { + runPosTests(t, "TestIsNormalNFD1", NFD, isNormalStringF, isNormalTests) + runPosTests(t, "TestIsNormalNFD2", NFD, isNormalStringF, isNormalNFDTests) + runPosTests(t, "TestIsNormalNFC1", NFC, isNormalStringF, isNormalTests) + runPosTests(t, "TestIsNormalNFC2", NFC, isNormalStringF, isNormalNFCTests) +} + +type AppendTest struct { + left string + right string + out string +} + +type appendFunc func(f Form, out []byte, s string) []byte + +var fstr = []string{"NFC", "NFD", "NFKC", "NFKD"} + +func runNormTests(t *testing.T, name string, fn appendFunc) { + for f := NFC; f <= NFKD; f++ { + runAppendTests(t, name, f, fn, normTests[f]) + } +} + +func runAppendTests(t *testing.T, name string, f Form, fn appendFunc, tests []AppendTest) { + for i, test := range tests { + if *testn >= 0 && i != *testn { + continue + } + out := []byte(test.left) + have := string(fn(f, out, test.right)) + if len(have) != len(test.out) { + t.Errorf("%s.%s:%d: length is %d; want %d (%+q vs %+q)", fstr[f], name, i, len(have), len(test.out), pc(have), pc(test.out)) + } + if have != test.out { + k, pf := pidx(have, test.out) + t.Errorf("%s.%s:%d: \nwas %s%+q; \nwant %s%+q", fstr[f], name, i, pf, pc(have[k:]), pf, pc(test.out[k:])) + } + + // Bootstrap by normalizing input. Ensures that the various variants + // behave the same. + for g := NFC; g <= NFKD; g++ { + if f == g { + continue + } + want := g.String(test.left + test.right) + have := string(fn(g, g.AppendString(nil, test.left), test.right)) + if len(have) != len(want) { + t.Errorf("%s(%s.%s):%d: length is %d; want %d (%+q vs %+q)", fstr[g], fstr[f], name, i, len(have), len(want), pc(have), pc(want)) + } + if have != want { + k, pf := pidx(have, want) + t.Errorf("%s(%s.%s):%d: \nwas %s%+q; \nwant %s%+q", fstr[g], fstr[f], name, i, pf, pc(have[k:]), pf, pc(want[k:])) + } + } + } +} + +var normTests = [][]AppendTest{ + appendTestsNFC, + appendTestsNFD, + appendTestsNFKC, + appendTestsNFKD, +} + +var appendTestsNFC = []AppendTest{ + {"", ascii, ascii}, + {"", txt_all, txt_all}, + {"\uff9e", grave(30), "\uff9e" + grave(29) + cgj + grave(1)}, + {grave(30), "\uff9e", grave(30) + cgj + "\uff9e"}, + + // Tests designed for Iter. + { // ordering of non-composing combining characters + "", + "\u0305\u0316", + "\u0316\u0305", + }, + { // segment overflow + "", + "a" + rep(0x0305, maxNonStarters+4) + "\u0316", + "a" + rep(0x0305, maxNonStarters) + cgj + "\u0316" + rep(0x305, 4), + }, + + { // Combine across non-blocking non-starters. + // U+0327 COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;; + // U+0325 COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;; + "", "a\u0327\u0325", "\u1e01\u0327", + }, + + { // Jamo V+T does not combine. + "", + "\u1161\u11a8", + "\u1161\u11a8", + }, + + // Stability tests: see http://www.unicode.org/review/pr-29.html. + {"", "\u0b47\u0300\u0b3e", "\u0b47\u0300\u0b3e"}, + {"", "\u1100\u0300\u1161", "\u1100\u0300\u1161"}, + {"", "\u0b47\u0b3e", "\u0b4b"}, + {"", "\u1100\u1161", "\uac00"}, + + // U+04DA MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;; + { // 0d4a starts a new segment. + "", + "\u0d4a" + strings.Repeat("\u0d3e", 15) + "\u0d4a" + strings.Repeat("\u0d3e", 15), + "\u0d4a" + strings.Repeat("\u0d3e", 15) + "\u0d4a" + strings.Repeat("\u0d3e", 15), + }, + + { // Split combining characters. + // TODO: don't insert CGJ before starters. + "", + "\u0d46" + strings.Repeat("\u0d3e", 31), + "\u0d4a" + strings.Repeat("\u0d3e", 29) + cgj + "\u0d3e", + }, + + { // Split combining characters. + "", + "\u0d4a" + strings.Repeat("\u0d3e", 30), + "\u0d4a" + strings.Repeat("\u0d3e", 29) + cgj + "\u0d3e", + }, +} + +var appendTestsNFD = []AppendTest{ +// TODO: Move some of the tests here. +} + +var appendTestsNFKC = []AppendTest{ + // empty buffers + {"", "", ""}, + {"a", "", "a"}, + {"", "a", "a"}, + {"", "\u0041\u0307\u0304", "\u01E0"}, + // segment split across buffers + {"", "a\u0300b", "\u00E0b"}, + {"a", "\u0300b", "\u00E0b"}, + {"a", "\u0300\u0316", "\u00E0\u0316"}, + {"a", "\u0316\u0300", "\u00E0\u0316"}, + {"a", "\u0300a\u0300", "\u00E0\u00E0"}, + {"a", "\u0300a\u0300a\u0300", "\u00E0\u00E0\u00E0"}, + {"a", "\u0300aaa\u0300aaa\u0300", "\u00E0aa\u00E0aa\u00E0"}, + {"a\u0300", "\u0327", "\u00E0\u0327"}, + {"a\u0327", "\u0300", "\u00E0\u0327"}, + {"a\u0316", "\u0300", "\u00E0\u0316"}, + {"\u0041\u0307", "\u0304", "\u01E0"}, + // Hangul + {"", "\u110B\u1173", "\uC73C"}, + {"", "\u1103\u1161", "\uB2E4"}, + {"", "\u110B\u1173\u11B7", "\uC74C"}, + {"", "\u320E", "\x28\uAC00\x29"}, + {"", "\x28\u1100\u1161\x29", "\x28\uAC00\x29"}, + {"\u1103", "\u1161", "\uB2E4"}, + {"\u110B", "\u1173\u11B7", "\uC74C"}, + {"\u110B\u1173", "\u11B7", "\uC74C"}, + {"\uC73C", "\u11B7", "\uC74C"}, + // UTF-8 encoding split across buffers + {"a\xCC", "\x80", "\u00E0"}, + {"a\xCC", "\x80b", "\u00E0b"}, + {"a\xCC", "\x80a\u0300", "\u00E0\u00E0"}, + {"a\xCC", "\x80\x80", "\u00E0\x80"}, + {"a\xCC", "\x80\xCC", "\u00E0\xCC"}, + {"a\u0316\xCC", "\x80a\u0316\u0300", "\u00E0\u0316\u00E0\u0316"}, + // ending in incomplete UTF-8 encoding + {"", "\xCC", "\xCC"}, + {"a", "\xCC", "a\xCC"}, + {"a", "b\xCC", "ab\xCC"}, + {"\u0226", "\xCC", "\u0226\xCC"}, + // illegal runes + {"", "\x80", "\x80"}, + {"", "\x80\x80\x80", "\x80\x80\x80"}, + {"", "\xCC\x80\x80\x80", "\xCC\x80\x80\x80"}, + {"", "a\x80", "a\x80"}, + {"", "a\x80\x80\x80", "a\x80\x80\x80"}, + {"", "a\x80\x80\x80\x80\x80\x80", "a\x80\x80\x80\x80\x80\x80"}, + {"a", "\x80\x80\x80", "a\x80\x80\x80"}, + // overflow + {"", strings.Repeat("\x80", 33), strings.Repeat("\x80", 33)}, + {strings.Repeat("\x80", 33), "", strings.Repeat("\x80", 33)}, + {strings.Repeat("\x80", 33), strings.Repeat("\x80", 33), strings.Repeat("\x80", 66)}, + // overflow of combining characters + {"", grave(34), grave(30) + cgj + grave(4)}, + {"", grave(36), grave(30) + cgj + grave(6)}, + {grave(29), grave(5), grave(30) + cgj + grave(4)}, + {grave(30), grave(4), grave(30) + cgj + grave(4)}, + {grave(30), grave(3), grave(30) + cgj + grave(3)}, + {grave(30) + "\xCC", "\x80", grave(30) + cgj + grave(1)}, + {"", "\uFDFA" + grave(14), "\u0635\u0644\u0649 \u0627\u0644\u0644\u0647 \u0639\u0644\u064a\u0647 \u0648\u0633\u0644\u0645" + grave(14)}, + {"", "\uFDFA" + grave(28) + "\u0316", "\u0635\u0644\u0649 \u0627\u0644\u0644\u0647 \u0639\u0644\u064a\u0647 \u0648\u0633\u0644\u0645\u0316" + grave(28)}, + // - First rune has a trailing non-starter. + {"\u00d5", grave(30), "\u00d5" + grave(29) + cgj + grave(1)}, + // - U+FF9E decomposes into a non-starter in compatibility mode. A CGJ must be + // inserted even when FF9E starts a new segment. + {"\uff9e", grave(30), "\u3099" + grave(29) + cgj + grave(1)}, + {grave(30), "\uff9e", grave(30) + cgj + "\u3099"}, + // - Many non-starter decompositions in a row causing overflow. + {"", rep(0x340, 31), rep(0x300, 30) + cgj + "\u0300"}, + {"", rep(0xFF9E, 31), rep(0x3099, 30) + cgj + "\u3099"}, + // weird UTF-8 + {"\u00E0\xE1", "\x86", "\u00E0\xE1\x86"}, + {"a\u0300\u11B7", "\u0300", "\u00E0\u11B7\u0300"}, + {"a\u0300\u11B7\u0300", "\u0300", "\u00E0\u11B7\u0300\u0300"}, + {"\u0300", "\xF8\x80\x80\x80\x80\u0300", "\u0300\xF8\x80\x80\x80\x80\u0300"}, + {"\u0300", "\xFC\x80\x80\x80\x80\x80\u0300", "\u0300\xFC\x80\x80\x80\x80\x80\u0300"}, + {"\xF8\x80\x80\x80\x80\u0300", "\u0300", "\xF8\x80\x80\x80\x80\u0300\u0300"}, + {"\xFC\x80\x80\x80\x80\x80\u0300", "\u0300", "\xFC\x80\x80\x80\x80\x80\u0300\u0300"}, + {"\xF8\x80\x80\x80", "\x80\u0300\u0300", "\xF8\x80\x80\x80\x80\u0300\u0300"}, + + {"", strings.Repeat("a\u0316\u0300", 6), strings.Repeat("\u00E0\u0316", 6)}, + // large input. + {"", strings.Repeat("a\u0300\u0316", 4000), strings.Repeat("\u00E0\u0316", 4000)}, + {"", strings.Repeat("\x80\x80", 4000), strings.Repeat("\x80\x80", 4000)}, + {"", "\u0041\u0307\u0304", "\u01E0"}, +} + +var appendTestsNFKD = []AppendTest{ + {"", "a" + grave(64), "a" + grave(30) + cgj + grave(30) + cgj + grave(4)}, + + { // segment overflow on unchanged character + "", + "a" + grave(64) + "\u0316", + "a" + grave(30) + cgj + grave(30) + cgj + "\u0316" + grave(4), + }, + { // segment overflow on unchanged character + start value + "", + "a" + grave(98) + "\u0316", + "a" + grave(30) + cgj + grave(30) + cgj + grave(30) + cgj + "\u0316" + grave(8), + }, + { // segment overflow on decomposition. (U+0340 decomposes to U+0300.) + "", + "a" + grave(59) + "\u0340", + "a" + grave(30) + cgj + grave(30), + }, + { // segment overflow on non-starter decomposition + "", + "a" + grave(33) + "\u0340" + grave(30) + "\u0320", + "a" + grave(30) + cgj + grave(30) + cgj + "\u0320" + grave(4), + }, + { // start value after ASCII overflow + "", + rep('a', segSize) + grave(32) + "\u0320", + rep('a', segSize) + grave(30) + cgj + "\u0320" + grave(2), + }, + { // Jamo overflow + "", + "\u1100\u1161" + grave(30) + "\u0320" + grave(2), + "\u1100\u1161" + grave(29) + cgj + "\u0320" + grave(3), + }, + { // Hangul + "", + "\uac00", + "\u1100\u1161", + }, + { // Hangul overflow + "", + "\uac00" + grave(32) + "\u0320", + "\u1100\u1161" + grave(29) + cgj + "\u0320" + grave(3), + }, + { // Hangul overflow in Hangul mode. + "", + "\uac00\uac00" + grave(32) + "\u0320", + "\u1100\u1161\u1100\u1161" + grave(29) + cgj + "\u0320" + grave(3), + }, + { // Hangul overflow in Hangul mode. + "", + strings.Repeat("\uac00", 3) + grave(32) + "\u0320", + strings.Repeat("\u1100\u1161", 3) + grave(29) + cgj + "\u0320" + grave(3), + }, + { // start value after cc=0 + "", + "您您" + grave(34) + "\u0320", + "您您" + grave(30) + cgj + "\u0320" + grave(4), + }, + { // start value after normalization + "", + "\u0300\u0320a" + grave(34) + "\u0320", + "\u0320\u0300a" + grave(30) + cgj + "\u0320" + grave(4), + }, +} + +func TestAppend(t *testing.T) { + runNormTests(t, "Append", func(f Form, out []byte, s string) []byte { + return f.Append(out, []byte(s)...) + }) +} + +func TestAppendString(t *testing.T) { + runNormTests(t, "AppendString", func(f Form, out []byte, s string) []byte { + return f.AppendString(out, s) + }) +} + +func TestBytes(t *testing.T) { + runNormTests(t, "Bytes", func(f Form, out []byte, s string) []byte { + buf := []byte{} + buf = append(buf, out...) + buf = append(buf, s...) + return f.Bytes(buf) + }) +} + +func TestString(t *testing.T) { + runNormTests(t, "String", func(f Form, out []byte, s string) []byte { + outs := string(out) + s + return []byte(f.String(outs)) + }) +} + +func appendBench(f Form, in []byte) func() { + buf := make([]byte, 0, 4*len(in)) + return func() { + f.Append(buf, in...) + } +} + +func bytesBench(f Form, in []byte) func() { + return func() { + f.Bytes(in) + } +} + +func iterBench(f Form, in []byte) func() { + iter := Iter{} + return func() { + iter.Init(f, in) + for !iter.Done() { + iter.Next() + } + } +} + +func transformBench(f Form, in []byte) func() { + buf := make([]byte, 4*len(in)) + return func() { + if _, n, err := f.Transform(buf, in, true); err != nil || len(in) != n { + log.Panic(n, len(in), err) + } + } +} + +func readerBench(f Form, in []byte) func() { + buf := make([]byte, 4*len(in)) + return func() { + r := f.Reader(bytes.NewReader(in)) + var err error + for err == nil { + _, err = r.Read(buf) + } + if err != io.EOF { + panic("") + } + } +} + +func writerBench(f Form, in []byte) func() { + buf := make([]byte, 0, 4*len(in)) + return func() { + r := f.Writer(bytes.NewBuffer(buf)) + if _, err := r.Write(in); err != nil { + panic("") + } + } +} + +func appendBenchmarks(bm []func(), f Form, in []byte) []func() { + bm = append(bm, appendBench(f, in)) + bm = append(bm, iterBench(f, in)) + bm = append(bm, transformBench(f, in)) + bm = append(bm, readerBench(f, in)) + bm = append(bm, writerBench(f, in)) + return bm +} + +func doFormBenchmark(b *testing.B, inf, f Form, s string) { + b.StopTimer() + in := inf.Bytes([]byte(s)) + bm := appendBenchmarks(nil, f, in) + b.SetBytes(int64(len(in) * len(bm))) + b.StartTimer() + for i := 0; i < b.N; i++ { + for _, fn := range bm { + fn() + } + } +} + +func doSingle(b *testing.B, f func(Form, []byte) func(), s []byte) { + b.StopTimer() + fn := f(NFC, s) + b.SetBytes(int64(len(s))) + b.StartTimer() + for i := 0; i < b.N; i++ { + fn() + } +} + +var ( + smallNoChange = []byte("nörmalization") + smallChange = []byte("No\u0308rmalization") + ascii = strings.Repeat("There is nothing to change here! ", 500) +) + +func lowerBench(f Form, in []byte) func() { + // Use package strings instead of bytes as it doesn't allocate memory + // if there aren't any changes. + s := string(in) + return func() { + strings.ToLower(s) + } +} + +func BenchmarkLowerCaseNoChange(b *testing.B) { + doSingle(b, lowerBench, smallNoChange) +} +func BenchmarkLowerCaseChange(b *testing.B) { + doSingle(b, lowerBench, smallChange) +} + +func quickSpanBench(f Form, in []byte) func() { + return func() { + f.QuickSpan(in) + } +} + +func BenchmarkQuickSpanChangeNFC(b *testing.B) { + doSingle(b, quickSpanBench, smallNoChange) +} + +func BenchmarkBytesNoChangeNFC(b *testing.B) { + doSingle(b, bytesBench, smallNoChange) +} +func BenchmarkBytesChangeNFC(b *testing.B) { + doSingle(b, bytesBench, smallChange) +} + +func BenchmarkAppendNoChangeNFC(b *testing.B) { + doSingle(b, appendBench, smallNoChange) +} +func BenchmarkAppendChangeNFC(b *testing.B) { + doSingle(b, appendBench, smallChange) +} +func BenchmarkAppendLargeNFC(b *testing.B) { + doSingle(b, appendBench, txt_all_bytes) +} + +func BenchmarkIterNoChangeNFC(b *testing.B) { + doSingle(b, iterBench, smallNoChange) +} +func BenchmarkIterChangeNFC(b *testing.B) { + doSingle(b, iterBench, smallChange) +} +func BenchmarkIterLargeNFC(b *testing.B) { + doSingle(b, iterBench, txt_all_bytes) +} + +func BenchmarkTransformNoChangeNFC(b *testing.B) { + doSingle(b, transformBench, smallNoChange) +} +func BenchmarkTransformChangeNFC(b *testing.B) { + doSingle(b, transformBench, smallChange) +} +func BenchmarkTransformLargeNFC(b *testing.B) { + doSingle(b, transformBench, txt_all_bytes) +} + +func BenchmarkNormalizeAsciiNFC(b *testing.B) { + doFormBenchmark(b, NFC, NFC, ascii) +} +func BenchmarkNormalizeAsciiNFD(b *testing.B) { + doFormBenchmark(b, NFC, NFD, ascii) +} +func BenchmarkNormalizeAsciiNFKC(b *testing.B) { + doFormBenchmark(b, NFC, NFKC, ascii) +} +func BenchmarkNormalizeAsciiNFKD(b *testing.B) { + doFormBenchmark(b, NFC, NFKD, ascii) +} + +func BenchmarkNormalizeNFC2NFC(b *testing.B) { + doFormBenchmark(b, NFC, NFC, txt_all) +} +func BenchmarkNormalizeNFC2NFD(b *testing.B) { + doFormBenchmark(b, NFC, NFD, txt_all) +} +func BenchmarkNormalizeNFD2NFC(b *testing.B) { + doFormBenchmark(b, NFD, NFC, txt_all) +} +func BenchmarkNormalizeNFD2NFD(b *testing.B) { + doFormBenchmark(b, NFD, NFD, txt_all) +} + +// Hangul is often special-cased, so we test it separately. +func BenchmarkNormalizeHangulNFC2NFC(b *testing.B) { + doFormBenchmark(b, NFC, NFC, txt_kr) +} +func BenchmarkNormalizeHangulNFC2NFD(b *testing.B) { + doFormBenchmark(b, NFC, NFD, txt_kr) +} +func BenchmarkNormalizeHangulNFD2NFC(b *testing.B) { + doFormBenchmark(b, NFD, NFC, txt_kr) +} +func BenchmarkNormalizeHangulNFD2NFD(b *testing.B) { + doFormBenchmark(b, NFD, NFD, txt_kr) +} + +var forms = []Form{NFC, NFD, NFKC, NFKD} + +func doTextBenchmark(b *testing.B, s string) { + b.StopTimer() + in := []byte(s) + bm := []func(){} + for _, f := range forms { + bm = appendBenchmarks(bm, f, in) + } + b.SetBytes(int64(len(s) * len(bm))) + b.StartTimer() + for i := 0; i < b.N; i++ { + for _, f := range bm { + f() + } + } +} + +func BenchmarkCanonicalOrdering(b *testing.B) { + doTextBenchmark(b, txt_canon) +} +func BenchmarkExtendedLatin(b *testing.B) { + doTextBenchmark(b, txt_vn) +} +func BenchmarkMiscTwoByteUtf8(b *testing.B) { + doTextBenchmark(b, twoByteUtf8) +} +func BenchmarkMiscThreeByteUtf8(b *testing.B) { + doTextBenchmark(b, threeByteUtf8) +} +func BenchmarkHangul(b *testing.B) { + doTextBenchmark(b, txt_kr) +} +func BenchmarkJapanese(b *testing.B) { + doTextBenchmark(b, txt_jp) +} +func BenchmarkChinese(b *testing.B) { + doTextBenchmark(b, txt_cn) +} +func BenchmarkOverflow(b *testing.B) { + doTextBenchmark(b, overflow) +} + +var overflow = string(bytes.Repeat([]byte("\u035D"), 4096)) + "\u035B" + +// Tests sampled from the Canonical ordering tests (Part 2) of +// http://unicode.org/Public/UNIDATA/NormalizationTest.txt +const txt_canon = `\u0061\u0315\u0300\u05AE\u0300\u0062 \u0061\u0300\u0315\u0300\u05AE\u0062 +\u0061\u0302\u0315\u0300\u05AE\u0062 \u0061\u0307\u0315\u0300\u05AE\u0062 +\u0061\u0315\u0300\u05AE\u030A\u0062 \u0061\u059A\u0316\u302A\u031C\u0062 +\u0061\u032E\u059A\u0316\u302A\u0062 \u0061\u0338\u093C\u0334\u0062 +\u0061\u059A\u0316\u302A\u0339 \u0061\u0341\u0315\u0300\u05AE\u0062 +\u0061\u0348\u059A\u0316\u302A\u0062 \u0061\u0361\u0345\u035D\u035C\u0062 +\u0061\u0366\u0315\u0300\u05AE\u0062 \u0061\u0315\u0300\u05AE\u0486\u0062 +\u0061\u05A4\u059A\u0316\u302A\u0062 \u0061\u0315\u0300\u05AE\u0613\u0062 +\u0061\u0315\u0300\u05AE\u0615\u0062 \u0061\u0617\u0315\u0300\u05AE\u0062 +\u0061\u0619\u0618\u064D\u064E\u0062 \u0061\u0315\u0300\u05AE\u0654\u0062 +\u0061\u0315\u0300\u05AE\u06DC\u0062 \u0061\u0733\u0315\u0300\u05AE\u0062 +\u0061\u0744\u059A\u0316\u302A\u0062 \u0061\u0315\u0300\u05AE\u0745\u0062 +\u0061\u09CD\u05B0\u094D\u3099\u0062 \u0061\u0E38\u0E48\u0E38\u0C56\u0062 +\u0061\u0EB8\u0E48\u0E38\u0E49\u0062 \u0061\u0F72\u0F71\u0EC8\u0F71\u0062 +\u0061\u1039\u05B0\u094D\u3099\u0062 \u0061\u05B0\u094D\u3099\u1A60\u0062 +\u0061\u3099\u093C\u0334\u1BE6\u0062 \u0061\u3099\u093C\u0334\u1C37\u0062 +\u0061\u1CD9\u059A\u0316\u302A\u0062 \u0061\u2DED\u0315\u0300\u05AE\u0062 +\u0061\u2DEF\u0315\u0300\u05AE\u0062 \u0061\u302D\u302E\u059A\u0316\u0062` + +// Taken from http://creativecommons.org/licenses/by-sa/3.0/vn/ +const txt_vn = `Với các điều kiện sau: Ghi nhận công của tác giả. +Nếu bạn sử dụng, chuyển đổi, hoặc xây dựng dự án từ +nội dung được chia sẻ này, bạn phải áp dụng giấy phép này hoặc +một giấy phép khác có các điều khoản tương tự như giấy phép này +cho dự án của bạn. Hiểu rằng: Miễn — Bất kỳ các điều kiện nào +trên đây cũng có thể được miễn bỏ nếu bạn được sự cho phép của +người sở hữu bản quyền. Phạm vi công chúng — Khi tác phẩm hoặc +bất kỳ chương nào của tác phẩm đã trong vùng dành cho công +chúng theo quy định của pháp luật thì tình trạng của nó không +bị ảnh hưởng bởi giấy phép trong bất kỳ trường hợp nào.` + +// Taken from http://creativecommons.org/licenses/by-sa/1.0/deed.ru +const txt_ru = `При обязательном соблюдении следующих условий: +Attribution — Вы должны атрибутировать произведение (указывать +автора и источник) в порядке, предусмотренном автором или +лицензиаром (но только так, чтобы никоим образом не подразумевалось, +что они поддерживают вас или использование вами данного произведения). +Υπό τις ακόλουθες προϋποθέσεις:` + +// Taken from http://creativecommons.org/licenses/by-sa/3.0/gr/ +const txt_gr = `Αναφορά Δημιουργού — Θα πρέπει να κάνετε την αναφορά στο έργο με τον +τρόπο που έχει οριστεί από το δημιουργό ή το χορηγούντο την άδεια +(χωρίς όμως να εννοείται με οποιονδήποτε τρόπο ότι εγκρίνουν εσάς ή +τη χρήση του έργου από εσάς). Παρόμοια Διανομή — Εάν αλλοιώσετε, +τροποποιήσετε ή δημιουργήσετε περαιτέρω βασισμένοι στο έργο θα +μπορείτε να διανέμετε το έργο που θα προκύψει μόνο με την ίδια ή +παρόμοια άδεια.` + +// Taken from http://creativecommons.org/licenses/by-sa/3.0/deed.ar +const txt_ar = `بموجب الشروط التالية نسب المصنف — يجب عليك أن +تنسب العمل بالطريقة التي تحددها المؤلف أو المرخص (ولكن ليس بأي حال من +الأحوال أن توحي وتقترح بتحول أو استخدامك للعمل). +المشاركة على قدم المساواة — إذا كنت يعدل ، والتغيير ، أو الاستفادة +من هذا العمل ، قد ينتج عن توزيع العمل إلا في ظل تشابه او تطابق فى واحد +لهذا الترخيص.` + +// Taken from http://creativecommons.org/licenses/by-sa/1.0/il/ +const txt_il = `בכפוף לתנאים הבאים: ייחוס — עליך לייחס את היצירה (לתת קרדיט) באופן +המצויין על-ידי היוצר או מעניק הרישיון (אך לא בשום אופן המרמז על כך +שהם תומכים בך או בשימוש שלך ביצירה). שיתוף זהה — אם תחליט/י לשנות, +לעבד או ליצור יצירה נגזרת בהסתמך על יצירה זו, תוכל/י להפיץ את יצירתך +החדשה רק תחת אותו הרישיון או רישיון דומה לרישיון זה.` + +const twoByteUtf8 = txt_ru + txt_gr + txt_ar + txt_il + +// Taken from http://creativecommons.org/licenses/by-sa/2.0/kr/ +const txt_kr = `다음과 같은 조건을 따라야 합니다: 저작자표시 +(Attribution) — 저작자나 이용허락자가 정한 방법으로 저작물의 +원저작자를 표시하여야 합니다(그러나 원저작자가 이용자나 이용자의 +이용을 보증하거나 추천한다는 의미로 표시해서는 안됩니다). +동일조건변경허락 — 이 저작물을 이용하여 만든 이차적 저작물에는 본 +라이선스와 동일한 라이선스를 적용해야 합니다.` + +// Taken from http://creativecommons.org/licenses/by-sa/3.0/th/ +const txt_th = `ภายใต้เงื่อนไข ดังต่อไปนี้ : แสดงที่มา — คุณต้องแสดงที่ +มาของงานดังกล่าว ตามรูปแบบที่ผู้สร้างสรรค์หรือผู้อนุญาตกำหนด (แต่ +ไม่ใช่ในลักษณะที่ว่า พวกเขาสนับสนุนคุณหรือสนับสนุนการที่ +คุณนำงานไปใช้) อนุญาตแบบเดียวกัน — หากคุณดัดแปลง เปลี่ยนรูป หรื +อต่อเติมงานนี้ คุณต้องใช้สัญญาอนุญาตแบบเดียวกันหรือแบบที่เหมื +อนกับสัญญาอนุญาตที่ใช้กับงานนี้เท่านั้น` + +const threeByteUtf8 = txt_th + +// Taken from http://creativecommons.org/licenses/by-sa/2.0/jp/ +const txt_jp = `あなたの従うべき条件は以下の通りです。 +表示 — あなたは原著作者のクレジットを表示しなければなりません。 +継承 — もしあなたがこの作品を改変、変形または加工した場合、 +あなたはその結果生じた作品をこの作品と同一の許諾条件の下でのみ +頒布することができます。` + +// http://creativecommons.org/licenses/by-sa/2.5/cn/ +const txt_cn = `您可以自由: 复制、发行、展览、表演、放映、 +广播或通过信息网络传播本作品 创作演绎作品 +对本作品进行商业性使用 惟须遵守下列条件: +署名 — 您必须按照作者或者许可人指定的方式对作品进行署名。 +相同方式共享 — 如果您改变、转换本作品或者以本作品为基础进行创作, +您只能采用与本协议相同的许可协议发布基于本作品的演绎作品。` + +const txt_cjk = txt_cn + txt_jp + txt_kr +const txt_all = txt_vn + twoByteUtf8 + threeByteUtf8 + txt_cjk + +var txt_all_bytes = []byte(txt_all) diff --git a/vendor/golang.org/x/text/unicode/norm/readwriter.go b/vendor/golang.org/x/text/unicode/norm/readwriter.go new file mode 100644 index 0000000000..4fa0e04b21 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/readwriter.go @@ -0,0 +1,126 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package norm + +import "io" + +type normWriter struct { + rb reorderBuffer + w io.Writer + buf []byte +} + +// Write implements the standard write interface. If the last characters are +// not at a normalization boundary, the bytes will be buffered for the next +// write. The remaining bytes will be written on close. +func (w *normWriter) Write(data []byte) (n int, err error) { + // Process data in pieces to keep w.buf size bounded. + const chunk = 4000 + + for len(data) > 0 { + // Normalize into w.buf. + m := len(data) + if m > chunk { + m = chunk + } + w.rb.src = inputBytes(data[:m]) + w.rb.nsrc = m + w.buf = doAppend(&w.rb, w.buf, 0) + data = data[m:] + n += m + + // Write out complete prefix, save remainder. + // Note that lastBoundary looks back at most 31 runes. + i := lastBoundary(&w.rb.f, w.buf) + if i == -1 { + i = 0 + } + if i > 0 { + if _, err = w.w.Write(w.buf[:i]); err != nil { + break + } + bn := copy(w.buf, w.buf[i:]) + w.buf = w.buf[:bn] + } + } + return n, err +} + +// Close forces data that remains in the buffer to be written. +func (w *normWriter) Close() error { + if len(w.buf) > 0 { + _, err := w.w.Write(w.buf) + if err != nil { + return err + } + } + return nil +} + +// Writer returns a new writer that implements Write(b) +// by writing f(b) to w. The returned writer may use an +// an internal buffer to maintain state across Write calls. +// Calling its Close method writes any buffered data to w. +func (f Form) Writer(w io.Writer) io.WriteCloser { + wr := &normWriter{rb: reorderBuffer{}, w: w} + wr.rb.init(f, nil) + return wr +} + +type normReader struct { + rb reorderBuffer + r io.Reader + inbuf []byte + outbuf []byte + bufStart int + lastBoundary int + err error +} + +// Read implements the standard read interface. +func (r *normReader) Read(p []byte) (int, error) { + for { + if r.lastBoundary-r.bufStart > 0 { + n := copy(p, r.outbuf[r.bufStart:r.lastBoundary]) + r.bufStart += n + if r.lastBoundary-r.bufStart > 0 { + return n, nil + } + return n, r.err + } + if r.err != nil { + return 0, r.err + } + outn := copy(r.outbuf, r.outbuf[r.lastBoundary:]) + r.outbuf = r.outbuf[0:outn] + r.bufStart = 0 + + n, err := r.r.Read(r.inbuf) + r.rb.src = inputBytes(r.inbuf[0:n]) + r.rb.nsrc, r.err = n, err + if n > 0 { + r.outbuf = doAppend(&r.rb, r.outbuf, 0) + } + if err == io.EOF { + r.lastBoundary = len(r.outbuf) + } else { + r.lastBoundary = lastBoundary(&r.rb.f, r.outbuf) + if r.lastBoundary == -1 { + r.lastBoundary = 0 + } + } + } + panic("should not reach here") +} + +// Reader returns a new reader that implements Read +// by reading data from r and returning f(data). +func (f Form) Reader(r io.Reader) io.Reader { + const chunk = 4000 + buf := make([]byte, chunk) + rr := &normReader{rb: reorderBuffer{}, r: r, inbuf: buf} + rr.rb.init(f, buf) + return rr +} diff --git a/vendor/golang.org/x/text/unicode/norm/readwriter_test.go b/vendor/golang.org/x/text/unicode/norm/readwriter_test.go new file mode 100644 index 0000000000..b7756ba24e --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/readwriter_test.go @@ -0,0 +1,56 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package norm + +import ( + "bytes" + "fmt" + "testing" +) + +var bufSizes = []int{1, 2, 3, 4, 5, 6, 7, 8, 100, 101, 102, 103, 4000, 4001, 4002, 4003} + +func readFunc(size int) appendFunc { + return func(f Form, out []byte, s string) []byte { + out = append(out, s...) + r := f.Reader(bytes.NewBuffer(out)) + buf := make([]byte, size) + result := []byte{} + for n, err := 0, error(nil); err == nil; { + n, err = r.Read(buf) + result = append(result, buf[:n]...) + } + return result + } +} + +func TestReader(t *testing.T) { + for _, s := range bufSizes { + name := fmt.Sprintf("TestReader%d", s) + runNormTests(t, name, readFunc(s)) + } +} + +func writeFunc(size int) appendFunc { + return func(f Form, out []byte, s string) []byte { + in := append(out, s...) + result := new(bytes.Buffer) + w := f.Writer(result) + buf := make([]byte, size) + for n := 0; len(in) > 0; in = in[n:] { + n = copy(buf, in) + _, _ = w.Write(buf[:n]) + } + w.Close() + return result.Bytes() + } +} + +func TestWriter(t *testing.T) { + for _, s := range bufSizes { + name := fmt.Sprintf("TestWriter%d", s) + runNormTests(t, name, writeFunc(s)) + } +} diff --git a/vendor/golang.org/x/text/unicode/norm/tables.go b/vendor/golang.org/x/text/unicode/norm/tables.go new file mode 100644 index 0000000000..fa956d681f --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/tables.go @@ -0,0 +1,7587 @@ +// This file was generated by go generate; DO NOT EDIT + +package norm + +const ( + // Version is the Unicode edition from which the tables are derived. + Version = "8.0.0" + + // MaxTransformChunkSize indicates the maximum number of bytes that Transform + // may need to write atomically for any Form. Making a destination buffer at + // least this size ensures that Transform can always make progress and that + // the user does not need to grow the buffer on an ErrShortDst. + MaxTransformChunkSize = 35 + maxNonStarters*4 +) + +var ccc = [55]uint8{ + 0, 1, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, + 84, 91, 103, 107, 118, 122, 129, 130, + 132, 202, 214, 216, 218, 220, 222, 224, + 226, 228, 230, 232, 233, 234, 240, +} + +const ( + firstMulti = 0x1869 + firstCCC = 0x2C9A + endMulti = 0x2F5C + firstLeadingCCC = 0x4A40 + firstCCCZeroExcept = 0x4A56 + firstStarterWithNLead = 0x4A7D + lastDecomp = 0x4A7F + maxDecomp = 0x8000 +) + +// decomps: 19071 bytes +var decomps = [...]byte{ + // Bytes 0 - 3f + 0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41, + 0x23, 0x41, 0x24, 0x41, 0x25, 0x41, 0x26, 0x41, + 0x27, 0x41, 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41, + 0x2B, 0x41, 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41, + 0x2F, 0x41, 0x30, 0x41, 0x31, 0x41, 0x32, 0x41, + 0x33, 0x41, 0x34, 0x41, 0x35, 0x41, 0x36, 0x41, + 0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41, + 0x3B, 0x41, 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41, + // Bytes 40 - 7f + 0x3F, 0x41, 0x40, 0x41, 0x41, 0x41, 0x42, 0x41, + 0x43, 0x41, 0x44, 0x41, 0x45, 0x41, 0x46, 0x41, + 0x47, 0x41, 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41, + 0x4B, 0x41, 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41, + 0x4F, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, + 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, + 0x57, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41, + 0x5B, 0x41, 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41, + // Bytes 80 - bf + 0x5F, 0x41, 0x60, 0x41, 0x61, 0x41, 0x62, 0x41, + 0x63, 0x41, 0x64, 0x41, 0x65, 0x41, 0x66, 0x41, + 0x67, 0x41, 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41, + 0x6B, 0x41, 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41, + 0x6F, 0x41, 0x70, 0x41, 0x71, 0x41, 0x72, 0x41, + 0x73, 0x41, 0x74, 0x41, 0x75, 0x41, 0x76, 0x41, + 0x77, 0x41, 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41, + 0x7B, 0x41, 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42, + // Bytes c0 - ff + 0xC2, 0xA2, 0x42, 0xC2, 0xA3, 0x42, 0xC2, 0xA5, + 0x42, 0xC2, 0xA6, 0x42, 0xC2, 0xAC, 0x42, 0xC2, + 0xB7, 0x42, 0xC3, 0x86, 0x42, 0xC3, 0xB0, 0x42, + 0xC4, 0xA6, 0x42, 0xC4, 0xA7, 0x42, 0xC4, 0xB1, + 0x42, 0xC5, 0x8B, 0x42, 0xC5, 0x93, 0x42, 0xC6, + 0x8E, 0x42, 0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42, + 0xC8, 0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90, + 0x42, 0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9, + // Bytes 100 - 13f + 0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9, 0x99, 0x42, + 0xC9, 0x9B, 0x42, 0xC9, 0x9C, 0x42, 0xC9, 0x9F, + 0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA3, 0x42, 0xC9, + 0xA5, 0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA8, 0x42, + 0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42, 0xC9, 0xAB, + 0x42, 0xC9, 0xAD, 0x42, 0xC9, 0xAF, 0x42, 0xC9, + 0xB0, 0x42, 0xC9, 0xB1, 0x42, 0xC9, 0xB2, 0x42, + 0xC9, 0xB3, 0x42, 0xC9, 0xB4, 0x42, 0xC9, 0xB5, + // Bytes 140 - 17f + 0x42, 0xC9, 0xB8, 0x42, 0xC9, 0xB9, 0x42, 0xC9, + 0xBB, 0x42, 0xCA, 0x81, 0x42, 0xCA, 0x82, 0x42, + 0xCA, 0x83, 0x42, 0xCA, 0x89, 0x42, 0xCA, 0x8A, + 0x42, 0xCA, 0x8B, 0x42, 0xCA, 0x8C, 0x42, 0xCA, + 0x90, 0x42, 0xCA, 0x91, 0x42, 0xCA, 0x92, 0x42, + 0xCA, 0x95, 0x42, 0xCA, 0x9D, 0x42, 0xCA, 0x9F, + 0x42, 0xCA, 0xB9, 0x42, 0xCE, 0x91, 0x42, 0xCE, + 0x92, 0x42, 0xCE, 0x93, 0x42, 0xCE, 0x94, 0x42, + // Bytes 180 - 1bf + 0xCE, 0x95, 0x42, 0xCE, 0x96, 0x42, 0xCE, 0x97, + 0x42, 0xCE, 0x98, 0x42, 0xCE, 0x99, 0x42, 0xCE, + 0x9A, 0x42, 0xCE, 0x9B, 0x42, 0xCE, 0x9C, 0x42, + 0xCE, 0x9D, 0x42, 0xCE, 0x9E, 0x42, 0xCE, 0x9F, + 0x42, 0xCE, 0xA0, 0x42, 0xCE, 0xA1, 0x42, 0xCE, + 0xA3, 0x42, 0xCE, 0xA4, 0x42, 0xCE, 0xA5, 0x42, + 0xCE, 0xA6, 0x42, 0xCE, 0xA7, 0x42, 0xCE, 0xA8, + 0x42, 0xCE, 0xA9, 0x42, 0xCE, 0xB1, 0x42, 0xCE, + // Bytes 1c0 - 1ff + 0xB2, 0x42, 0xCE, 0xB3, 0x42, 0xCE, 0xB4, 0x42, + 0xCE, 0xB5, 0x42, 0xCE, 0xB6, 0x42, 0xCE, 0xB7, + 0x42, 0xCE, 0xB8, 0x42, 0xCE, 0xB9, 0x42, 0xCE, + 0xBA, 0x42, 0xCE, 0xBB, 0x42, 0xCE, 0xBC, 0x42, + 0xCE, 0xBD, 0x42, 0xCE, 0xBE, 0x42, 0xCE, 0xBF, + 0x42, 0xCF, 0x80, 0x42, 0xCF, 0x81, 0x42, 0xCF, + 0x82, 0x42, 0xCF, 0x83, 0x42, 0xCF, 0x84, 0x42, + 0xCF, 0x85, 0x42, 0xCF, 0x86, 0x42, 0xCF, 0x87, + // Bytes 200 - 23f + 0x42, 0xCF, 0x88, 0x42, 0xCF, 0x89, 0x42, 0xCF, + 0x9C, 0x42, 0xCF, 0x9D, 0x42, 0xD0, 0xBD, 0x42, + 0xD1, 0x8A, 0x42, 0xD1, 0x8C, 0x42, 0xD7, 0x90, + 0x42, 0xD7, 0x91, 0x42, 0xD7, 0x92, 0x42, 0xD7, + 0x93, 0x42, 0xD7, 0x94, 0x42, 0xD7, 0x9B, 0x42, + 0xD7, 0x9C, 0x42, 0xD7, 0x9D, 0x42, 0xD7, 0xA2, + 0x42, 0xD7, 0xA8, 0x42, 0xD7, 0xAA, 0x42, 0xD8, + 0xA1, 0x42, 0xD8, 0xA7, 0x42, 0xD8, 0xA8, 0x42, + // Bytes 240 - 27f + 0xD8, 0xA9, 0x42, 0xD8, 0xAA, 0x42, 0xD8, 0xAB, + 0x42, 0xD8, 0xAC, 0x42, 0xD8, 0xAD, 0x42, 0xD8, + 0xAE, 0x42, 0xD8, 0xAF, 0x42, 0xD8, 0xB0, 0x42, + 0xD8, 0xB1, 0x42, 0xD8, 0xB2, 0x42, 0xD8, 0xB3, + 0x42, 0xD8, 0xB4, 0x42, 0xD8, 0xB5, 0x42, 0xD8, + 0xB6, 0x42, 0xD8, 0xB7, 0x42, 0xD8, 0xB8, 0x42, + 0xD8, 0xB9, 0x42, 0xD8, 0xBA, 0x42, 0xD9, 0x81, + 0x42, 0xD9, 0x82, 0x42, 0xD9, 0x83, 0x42, 0xD9, + // Bytes 280 - 2bf + 0x84, 0x42, 0xD9, 0x85, 0x42, 0xD9, 0x86, 0x42, + 0xD9, 0x87, 0x42, 0xD9, 0x88, 0x42, 0xD9, 0x89, + 0x42, 0xD9, 0x8A, 0x42, 0xD9, 0xAE, 0x42, 0xD9, + 0xAF, 0x42, 0xD9, 0xB1, 0x42, 0xD9, 0xB9, 0x42, + 0xD9, 0xBA, 0x42, 0xD9, 0xBB, 0x42, 0xD9, 0xBE, + 0x42, 0xD9, 0xBF, 0x42, 0xDA, 0x80, 0x42, 0xDA, + 0x83, 0x42, 0xDA, 0x84, 0x42, 0xDA, 0x86, 0x42, + 0xDA, 0x87, 0x42, 0xDA, 0x88, 0x42, 0xDA, 0x8C, + // Bytes 2c0 - 2ff + 0x42, 0xDA, 0x8D, 0x42, 0xDA, 0x8E, 0x42, 0xDA, + 0x91, 0x42, 0xDA, 0x98, 0x42, 0xDA, 0xA1, 0x42, + 0xDA, 0xA4, 0x42, 0xDA, 0xA6, 0x42, 0xDA, 0xA9, + 0x42, 0xDA, 0xAD, 0x42, 0xDA, 0xAF, 0x42, 0xDA, + 0xB1, 0x42, 0xDA, 0xB3, 0x42, 0xDA, 0xBA, 0x42, + 0xDA, 0xBB, 0x42, 0xDA, 0xBE, 0x42, 0xDB, 0x81, + 0x42, 0xDB, 0x85, 0x42, 0xDB, 0x86, 0x42, 0xDB, + 0x87, 0x42, 0xDB, 0x88, 0x42, 0xDB, 0x89, 0x42, + // Bytes 300 - 33f + 0xDB, 0x8B, 0x42, 0xDB, 0x8C, 0x42, 0xDB, 0x90, + 0x42, 0xDB, 0x92, 0x43, 0xE0, 0xBC, 0x8B, 0x43, + 0xE1, 0x83, 0x9C, 0x43, 0xE1, 0x84, 0x80, 0x43, + 0xE1, 0x84, 0x81, 0x43, 0xE1, 0x84, 0x82, 0x43, + 0xE1, 0x84, 0x83, 0x43, 0xE1, 0x84, 0x84, 0x43, + 0xE1, 0x84, 0x85, 0x43, 0xE1, 0x84, 0x86, 0x43, + 0xE1, 0x84, 0x87, 0x43, 0xE1, 0x84, 0x88, 0x43, + 0xE1, 0x84, 0x89, 0x43, 0xE1, 0x84, 0x8A, 0x43, + // Bytes 340 - 37f + 0xE1, 0x84, 0x8B, 0x43, 0xE1, 0x84, 0x8C, 0x43, + 0xE1, 0x84, 0x8D, 0x43, 0xE1, 0x84, 0x8E, 0x43, + 0xE1, 0x84, 0x8F, 0x43, 0xE1, 0x84, 0x90, 0x43, + 0xE1, 0x84, 0x91, 0x43, 0xE1, 0x84, 0x92, 0x43, + 0xE1, 0x84, 0x94, 0x43, 0xE1, 0x84, 0x95, 0x43, + 0xE1, 0x84, 0x9A, 0x43, 0xE1, 0x84, 0x9C, 0x43, + 0xE1, 0x84, 0x9D, 0x43, 0xE1, 0x84, 0x9E, 0x43, + 0xE1, 0x84, 0xA0, 0x43, 0xE1, 0x84, 0xA1, 0x43, + // Bytes 380 - 3bf + 0xE1, 0x84, 0xA2, 0x43, 0xE1, 0x84, 0xA3, 0x43, + 0xE1, 0x84, 0xA7, 0x43, 0xE1, 0x84, 0xA9, 0x43, + 0xE1, 0x84, 0xAB, 0x43, 0xE1, 0x84, 0xAC, 0x43, + 0xE1, 0x84, 0xAD, 0x43, 0xE1, 0x84, 0xAE, 0x43, + 0xE1, 0x84, 0xAF, 0x43, 0xE1, 0x84, 0xB2, 0x43, + 0xE1, 0x84, 0xB6, 0x43, 0xE1, 0x85, 0x80, 0x43, + 0xE1, 0x85, 0x87, 0x43, 0xE1, 0x85, 0x8C, 0x43, + 0xE1, 0x85, 0x97, 0x43, 0xE1, 0x85, 0x98, 0x43, + // Bytes 3c0 - 3ff + 0xE1, 0x85, 0x99, 0x43, 0xE1, 0x85, 0xA0, 0x43, + 0xE1, 0x86, 0x84, 0x43, 0xE1, 0x86, 0x85, 0x43, + 0xE1, 0x86, 0x88, 0x43, 0xE1, 0x86, 0x91, 0x43, + 0xE1, 0x86, 0x92, 0x43, 0xE1, 0x86, 0x94, 0x43, + 0xE1, 0x86, 0x9E, 0x43, 0xE1, 0x86, 0xA1, 0x43, + 0xE1, 0x87, 0x87, 0x43, 0xE1, 0x87, 0x88, 0x43, + 0xE1, 0x87, 0x8C, 0x43, 0xE1, 0x87, 0x8E, 0x43, + 0xE1, 0x87, 0x93, 0x43, 0xE1, 0x87, 0x97, 0x43, + // Bytes 400 - 43f + 0xE1, 0x87, 0x99, 0x43, 0xE1, 0x87, 0x9D, 0x43, + 0xE1, 0x87, 0x9F, 0x43, 0xE1, 0x87, 0xB1, 0x43, + 0xE1, 0x87, 0xB2, 0x43, 0xE1, 0xB4, 0x82, 0x43, + 0xE1, 0xB4, 0x96, 0x43, 0xE1, 0xB4, 0x97, 0x43, + 0xE1, 0xB4, 0x9C, 0x43, 0xE1, 0xB4, 0x9D, 0x43, + 0xE1, 0xB4, 0xA5, 0x43, 0xE1, 0xB5, 0xBB, 0x43, + 0xE1, 0xB6, 0x85, 0x43, 0xE2, 0x80, 0x82, 0x43, + 0xE2, 0x80, 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43, + // Bytes 440 - 47f + 0xE2, 0x80, 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43, + 0xE2, 0x82, 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43, + 0xE2, 0x86, 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43, + 0xE2, 0x86, 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43, + 0xE2, 0x88, 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43, + 0xE2, 0x88, 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43, + 0xE2, 0x96, 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43, + 0xE2, 0xA6, 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43, + // Bytes 480 - 4bf + 0xE2, 0xB5, 0xA1, 0x43, 0xE3, 0x80, 0x81, 0x43, + 0xE3, 0x80, 0x82, 0x43, 0xE3, 0x80, 0x88, 0x43, + 0xE3, 0x80, 0x89, 0x43, 0xE3, 0x80, 0x8A, 0x43, + 0xE3, 0x80, 0x8B, 0x43, 0xE3, 0x80, 0x8C, 0x43, + 0xE3, 0x80, 0x8D, 0x43, 0xE3, 0x80, 0x8E, 0x43, + 0xE3, 0x80, 0x8F, 0x43, 0xE3, 0x80, 0x90, 0x43, + 0xE3, 0x80, 0x91, 0x43, 0xE3, 0x80, 0x92, 0x43, + 0xE3, 0x80, 0x94, 0x43, 0xE3, 0x80, 0x95, 0x43, + // Bytes 4c0 - 4ff + 0xE3, 0x80, 0x96, 0x43, 0xE3, 0x80, 0x97, 0x43, + 0xE3, 0x82, 0xA1, 0x43, 0xE3, 0x82, 0xA2, 0x43, + 0xE3, 0x82, 0xA3, 0x43, 0xE3, 0x82, 0xA4, 0x43, + 0xE3, 0x82, 0xA5, 0x43, 0xE3, 0x82, 0xA6, 0x43, + 0xE3, 0x82, 0xA7, 0x43, 0xE3, 0x82, 0xA8, 0x43, + 0xE3, 0x82, 0xA9, 0x43, 0xE3, 0x82, 0xAA, 0x43, + 0xE3, 0x82, 0xAB, 0x43, 0xE3, 0x82, 0xAD, 0x43, + 0xE3, 0x82, 0xAF, 0x43, 0xE3, 0x82, 0xB1, 0x43, + // Bytes 500 - 53f + 0xE3, 0x82, 0xB3, 0x43, 0xE3, 0x82, 0xB5, 0x43, + 0xE3, 0x82, 0xB7, 0x43, 0xE3, 0x82, 0xB9, 0x43, + 0xE3, 0x82, 0xBB, 0x43, 0xE3, 0x82, 0xBD, 0x43, + 0xE3, 0x82, 0xBF, 0x43, 0xE3, 0x83, 0x81, 0x43, + 0xE3, 0x83, 0x83, 0x43, 0xE3, 0x83, 0x84, 0x43, + 0xE3, 0x83, 0x86, 0x43, 0xE3, 0x83, 0x88, 0x43, + 0xE3, 0x83, 0x8A, 0x43, 0xE3, 0x83, 0x8B, 0x43, + 0xE3, 0x83, 0x8C, 0x43, 0xE3, 0x83, 0x8D, 0x43, + // Bytes 540 - 57f + 0xE3, 0x83, 0x8E, 0x43, 0xE3, 0x83, 0x8F, 0x43, + 0xE3, 0x83, 0x92, 0x43, 0xE3, 0x83, 0x95, 0x43, + 0xE3, 0x83, 0x98, 0x43, 0xE3, 0x83, 0x9B, 0x43, + 0xE3, 0x83, 0x9E, 0x43, 0xE3, 0x83, 0x9F, 0x43, + 0xE3, 0x83, 0xA0, 0x43, 0xE3, 0x83, 0xA1, 0x43, + 0xE3, 0x83, 0xA2, 0x43, 0xE3, 0x83, 0xA3, 0x43, + 0xE3, 0x83, 0xA4, 0x43, 0xE3, 0x83, 0xA5, 0x43, + 0xE3, 0x83, 0xA6, 0x43, 0xE3, 0x83, 0xA7, 0x43, + // Bytes 580 - 5bf + 0xE3, 0x83, 0xA8, 0x43, 0xE3, 0x83, 0xA9, 0x43, + 0xE3, 0x83, 0xAA, 0x43, 0xE3, 0x83, 0xAB, 0x43, + 0xE3, 0x83, 0xAC, 0x43, 0xE3, 0x83, 0xAD, 0x43, + 0xE3, 0x83, 0xAF, 0x43, 0xE3, 0x83, 0xB0, 0x43, + 0xE3, 0x83, 0xB1, 0x43, 0xE3, 0x83, 0xB2, 0x43, + 0xE3, 0x83, 0xB3, 0x43, 0xE3, 0x83, 0xBB, 0x43, + 0xE3, 0x83, 0xBC, 0x43, 0xE3, 0x92, 0x9E, 0x43, + 0xE3, 0x92, 0xB9, 0x43, 0xE3, 0x92, 0xBB, 0x43, + // Bytes 5c0 - 5ff + 0xE3, 0x93, 0x9F, 0x43, 0xE3, 0x94, 0x95, 0x43, + 0xE3, 0x9B, 0xAE, 0x43, 0xE3, 0x9B, 0xBC, 0x43, + 0xE3, 0x9E, 0x81, 0x43, 0xE3, 0xA0, 0xAF, 0x43, + 0xE3, 0xA1, 0xA2, 0x43, 0xE3, 0xA1, 0xBC, 0x43, + 0xE3, 0xA3, 0x87, 0x43, 0xE3, 0xA3, 0xA3, 0x43, + 0xE3, 0xA4, 0x9C, 0x43, 0xE3, 0xA4, 0xBA, 0x43, + 0xE3, 0xA8, 0xAE, 0x43, 0xE3, 0xA9, 0xAC, 0x43, + 0xE3, 0xAB, 0xA4, 0x43, 0xE3, 0xAC, 0x88, 0x43, + // Bytes 600 - 63f + 0xE3, 0xAC, 0x99, 0x43, 0xE3, 0xAD, 0x89, 0x43, + 0xE3, 0xAE, 0x9D, 0x43, 0xE3, 0xB0, 0x98, 0x43, + 0xE3, 0xB1, 0x8E, 0x43, 0xE3, 0xB4, 0xB3, 0x43, + 0xE3, 0xB6, 0x96, 0x43, 0xE3, 0xBA, 0xAC, 0x43, + 0xE3, 0xBA, 0xB8, 0x43, 0xE3, 0xBC, 0x9B, 0x43, + 0xE3, 0xBF, 0xBC, 0x43, 0xE4, 0x80, 0x88, 0x43, + 0xE4, 0x80, 0x98, 0x43, 0xE4, 0x80, 0xB9, 0x43, + 0xE4, 0x81, 0x86, 0x43, 0xE4, 0x82, 0x96, 0x43, + // Bytes 640 - 67f + 0xE4, 0x83, 0xA3, 0x43, 0xE4, 0x84, 0xAF, 0x43, + 0xE4, 0x88, 0x82, 0x43, 0xE4, 0x88, 0xA7, 0x43, + 0xE4, 0x8A, 0xA0, 0x43, 0xE4, 0x8C, 0x81, 0x43, + 0xE4, 0x8C, 0xB4, 0x43, 0xE4, 0x8D, 0x99, 0x43, + 0xE4, 0x8F, 0x95, 0x43, 0xE4, 0x8F, 0x99, 0x43, + 0xE4, 0x90, 0x8B, 0x43, 0xE4, 0x91, 0xAB, 0x43, + 0xE4, 0x94, 0xAB, 0x43, 0xE4, 0x95, 0x9D, 0x43, + 0xE4, 0x95, 0xA1, 0x43, 0xE4, 0x95, 0xAB, 0x43, + // Bytes 680 - 6bf + 0xE4, 0x97, 0x97, 0x43, 0xE4, 0x97, 0xB9, 0x43, + 0xE4, 0x98, 0xB5, 0x43, 0xE4, 0x9A, 0xBE, 0x43, + 0xE4, 0x9B, 0x87, 0x43, 0xE4, 0xA6, 0x95, 0x43, + 0xE4, 0xA7, 0xA6, 0x43, 0xE4, 0xA9, 0xAE, 0x43, + 0xE4, 0xA9, 0xB6, 0x43, 0xE4, 0xAA, 0xB2, 0x43, + 0xE4, 0xAC, 0xB3, 0x43, 0xE4, 0xAF, 0x8E, 0x43, + 0xE4, 0xB3, 0x8E, 0x43, 0xE4, 0xB3, 0xAD, 0x43, + 0xE4, 0xB3, 0xB8, 0x43, 0xE4, 0xB5, 0x96, 0x43, + // Bytes 6c0 - 6ff + 0xE4, 0xB8, 0x80, 0x43, 0xE4, 0xB8, 0x81, 0x43, + 0xE4, 0xB8, 0x83, 0x43, 0xE4, 0xB8, 0x89, 0x43, + 0xE4, 0xB8, 0x8A, 0x43, 0xE4, 0xB8, 0x8B, 0x43, + 0xE4, 0xB8, 0x8D, 0x43, 0xE4, 0xB8, 0x99, 0x43, + 0xE4, 0xB8, 0xA6, 0x43, 0xE4, 0xB8, 0xA8, 0x43, + 0xE4, 0xB8, 0xAD, 0x43, 0xE4, 0xB8, 0xB2, 0x43, + 0xE4, 0xB8, 0xB6, 0x43, 0xE4, 0xB8, 0xB8, 0x43, + 0xE4, 0xB8, 0xB9, 0x43, 0xE4, 0xB8, 0xBD, 0x43, + // Bytes 700 - 73f + 0xE4, 0xB8, 0xBF, 0x43, 0xE4, 0xB9, 0x81, 0x43, + 0xE4, 0xB9, 0x99, 0x43, 0xE4, 0xB9, 0x9D, 0x43, + 0xE4, 0xBA, 0x82, 0x43, 0xE4, 0xBA, 0x85, 0x43, + 0xE4, 0xBA, 0x86, 0x43, 0xE4, 0xBA, 0x8C, 0x43, + 0xE4, 0xBA, 0x94, 0x43, 0xE4, 0xBA, 0xA0, 0x43, + 0xE4, 0xBA, 0xA4, 0x43, 0xE4, 0xBA, 0xAE, 0x43, + 0xE4, 0xBA, 0xBA, 0x43, 0xE4, 0xBB, 0x80, 0x43, + 0xE4, 0xBB, 0x8C, 0x43, 0xE4, 0xBB, 0xA4, 0x43, + // Bytes 740 - 77f + 0xE4, 0xBC, 0x81, 0x43, 0xE4, 0xBC, 0x91, 0x43, + 0xE4, 0xBD, 0xA0, 0x43, 0xE4, 0xBE, 0x80, 0x43, + 0xE4, 0xBE, 0x86, 0x43, 0xE4, 0xBE, 0x8B, 0x43, + 0xE4, 0xBE, 0xAE, 0x43, 0xE4, 0xBE, 0xBB, 0x43, + 0xE4, 0xBE, 0xBF, 0x43, 0xE5, 0x80, 0x82, 0x43, + 0xE5, 0x80, 0xAB, 0x43, 0xE5, 0x81, 0xBA, 0x43, + 0xE5, 0x82, 0x99, 0x43, 0xE5, 0x83, 0x8F, 0x43, + 0xE5, 0x83, 0x9A, 0x43, 0xE5, 0x83, 0xA7, 0x43, + // Bytes 780 - 7bf + 0xE5, 0x84, 0xAA, 0x43, 0xE5, 0x84, 0xBF, 0x43, + 0xE5, 0x85, 0x80, 0x43, 0xE5, 0x85, 0x85, 0x43, + 0xE5, 0x85, 0x8D, 0x43, 0xE5, 0x85, 0x94, 0x43, + 0xE5, 0x85, 0xA4, 0x43, 0xE5, 0x85, 0xA5, 0x43, + 0xE5, 0x85, 0xA7, 0x43, 0xE5, 0x85, 0xA8, 0x43, + 0xE5, 0x85, 0xA9, 0x43, 0xE5, 0x85, 0xAB, 0x43, + 0xE5, 0x85, 0xAD, 0x43, 0xE5, 0x85, 0xB7, 0x43, + 0xE5, 0x86, 0x80, 0x43, 0xE5, 0x86, 0x82, 0x43, + // Bytes 7c0 - 7ff + 0xE5, 0x86, 0x8D, 0x43, 0xE5, 0x86, 0x92, 0x43, + 0xE5, 0x86, 0x95, 0x43, 0xE5, 0x86, 0x96, 0x43, + 0xE5, 0x86, 0x97, 0x43, 0xE5, 0x86, 0x99, 0x43, + 0xE5, 0x86, 0xA4, 0x43, 0xE5, 0x86, 0xAB, 0x43, + 0xE5, 0x86, 0xAC, 0x43, 0xE5, 0x86, 0xB5, 0x43, + 0xE5, 0x86, 0xB7, 0x43, 0xE5, 0x87, 0x89, 0x43, + 0xE5, 0x87, 0x8C, 0x43, 0xE5, 0x87, 0x9C, 0x43, + 0xE5, 0x87, 0x9E, 0x43, 0xE5, 0x87, 0xA0, 0x43, + // Bytes 800 - 83f + 0xE5, 0x87, 0xB5, 0x43, 0xE5, 0x88, 0x80, 0x43, + 0xE5, 0x88, 0x83, 0x43, 0xE5, 0x88, 0x87, 0x43, + 0xE5, 0x88, 0x97, 0x43, 0xE5, 0x88, 0x9D, 0x43, + 0xE5, 0x88, 0xA9, 0x43, 0xE5, 0x88, 0xBA, 0x43, + 0xE5, 0x88, 0xBB, 0x43, 0xE5, 0x89, 0x86, 0x43, + 0xE5, 0x89, 0x8D, 0x43, 0xE5, 0x89, 0xB2, 0x43, + 0xE5, 0x89, 0xB7, 0x43, 0xE5, 0x8A, 0x89, 0x43, + 0xE5, 0x8A, 0x9B, 0x43, 0xE5, 0x8A, 0xA3, 0x43, + // Bytes 840 - 87f + 0xE5, 0x8A, 0xB3, 0x43, 0xE5, 0x8A, 0xB4, 0x43, + 0xE5, 0x8B, 0x87, 0x43, 0xE5, 0x8B, 0x89, 0x43, + 0xE5, 0x8B, 0x92, 0x43, 0xE5, 0x8B, 0x9E, 0x43, + 0xE5, 0x8B, 0xA4, 0x43, 0xE5, 0x8B, 0xB5, 0x43, + 0xE5, 0x8B, 0xB9, 0x43, 0xE5, 0x8B, 0xBA, 0x43, + 0xE5, 0x8C, 0x85, 0x43, 0xE5, 0x8C, 0x86, 0x43, + 0xE5, 0x8C, 0x95, 0x43, 0xE5, 0x8C, 0x97, 0x43, + 0xE5, 0x8C, 0x9A, 0x43, 0xE5, 0x8C, 0xB8, 0x43, + // Bytes 880 - 8bf + 0xE5, 0x8C, 0xBB, 0x43, 0xE5, 0x8C, 0xBF, 0x43, + 0xE5, 0x8D, 0x81, 0x43, 0xE5, 0x8D, 0x84, 0x43, + 0xE5, 0x8D, 0x85, 0x43, 0xE5, 0x8D, 0x89, 0x43, + 0xE5, 0x8D, 0x91, 0x43, 0xE5, 0x8D, 0x94, 0x43, + 0xE5, 0x8D, 0x9A, 0x43, 0xE5, 0x8D, 0x9C, 0x43, + 0xE5, 0x8D, 0xA9, 0x43, 0xE5, 0x8D, 0xB0, 0x43, + 0xE5, 0x8D, 0xB3, 0x43, 0xE5, 0x8D, 0xB5, 0x43, + 0xE5, 0x8D, 0xBD, 0x43, 0xE5, 0x8D, 0xBF, 0x43, + // Bytes 8c0 - 8ff + 0xE5, 0x8E, 0x82, 0x43, 0xE5, 0x8E, 0xB6, 0x43, + 0xE5, 0x8F, 0x83, 0x43, 0xE5, 0x8F, 0x88, 0x43, + 0xE5, 0x8F, 0x8A, 0x43, 0xE5, 0x8F, 0x8C, 0x43, + 0xE5, 0x8F, 0x9F, 0x43, 0xE5, 0x8F, 0xA3, 0x43, + 0xE5, 0x8F, 0xA5, 0x43, 0xE5, 0x8F, 0xAB, 0x43, + 0xE5, 0x8F, 0xAF, 0x43, 0xE5, 0x8F, 0xB1, 0x43, + 0xE5, 0x8F, 0xB3, 0x43, 0xE5, 0x90, 0x86, 0x43, + 0xE5, 0x90, 0x88, 0x43, 0xE5, 0x90, 0x8D, 0x43, + // Bytes 900 - 93f + 0xE5, 0x90, 0x8F, 0x43, 0xE5, 0x90, 0x9D, 0x43, + 0xE5, 0x90, 0xB8, 0x43, 0xE5, 0x90, 0xB9, 0x43, + 0xE5, 0x91, 0x82, 0x43, 0xE5, 0x91, 0x88, 0x43, + 0xE5, 0x91, 0xA8, 0x43, 0xE5, 0x92, 0x9E, 0x43, + 0xE5, 0x92, 0xA2, 0x43, 0xE5, 0x92, 0xBD, 0x43, + 0xE5, 0x93, 0xB6, 0x43, 0xE5, 0x94, 0x90, 0x43, + 0xE5, 0x95, 0x8F, 0x43, 0xE5, 0x95, 0x93, 0x43, + 0xE5, 0x95, 0x95, 0x43, 0xE5, 0x95, 0xA3, 0x43, + // Bytes 940 - 97f + 0xE5, 0x96, 0x84, 0x43, 0xE5, 0x96, 0x87, 0x43, + 0xE5, 0x96, 0x99, 0x43, 0xE5, 0x96, 0x9D, 0x43, + 0xE5, 0x96, 0xAB, 0x43, 0xE5, 0x96, 0xB3, 0x43, + 0xE5, 0x96, 0xB6, 0x43, 0xE5, 0x97, 0x80, 0x43, + 0xE5, 0x97, 0x82, 0x43, 0xE5, 0x97, 0xA2, 0x43, + 0xE5, 0x98, 0x86, 0x43, 0xE5, 0x99, 0x91, 0x43, + 0xE5, 0x99, 0xA8, 0x43, 0xE5, 0x99, 0xB4, 0x43, + 0xE5, 0x9B, 0x97, 0x43, 0xE5, 0x9B, 0x9B, 0x43, + // Bytes 980 - 9bf + 0xE5, 0x9B, 0xB9, 0x43, 0xE5, 0x9C, 0x96, 0x43, + 0xE5, 0x9C, 0x97, 0x43, 0xE5, 0x9C, 0x9F, 0x43, + 0xE5, 0x9C, 0xB0, 0x43, 0xE5, 0x9E, 0x8B, 0x43, + 0xE5, 0x9F, 0x8E, 0x43, 0xE5, 0x9F, 0xB4, 0x43, + 0xE5, 0xA0, 0x8D, 0x43, 0xE5, 0xA0, 0xB1, 0x43, + 0xE5, 0xA0, 0xB2, 0x43, 0xE5, 0xA1, 0x80, 0x43, + 0xE5, 0xA1, 0x9A, 0x43, 0xE5, 0xA1, 0x9E, 0x43, + 0xE5, 0xA2, 0xA8, 0x43, 0xE5, 0xA2, 0xAC, 0x43, + // Bytes 9c0 - 9ff + 0xE5, 0xA2, 0xB3, 0x43, 0xE5, 0xA3, 0x98, 0x43, + 0xE5, 0xA3, 0x9F, 0x43, 0xE5, 0xA3, 0xAB, 0x43, + 0xE5, 0xA3, 0xAE, 0x43, 0xE5, 0xA3, 0xB0, 0x43, + 0xE5, 0xA3, 0xB2, 0x43, 0xE5, 0xA3, 0xB7, 0x43, + 0xE5, 0xA4, 0x82, 0x43, 0xE5, 0xA4, 0x86, 0x43, + 0xE5, 0xA4, 0x8A, 0x43, 0xE5, 0xA4, 0x95, 0x43, + 0xE5, 0xA4, 0x9A, 0x43, 0xE5, 0xA4, 0x9C, 0x43, + 0xE5, 0xA4, 0xA2, 0x43, 0xE5, 0xA4, 0xA7, 0x43, + // Bytes a00 - a3f + 0xE5, 0xA4, 0xA9, 0x43, 0xE5, 0xA5, 0x84, 0x43, + 0xE5, 0xA5, 0x88, 0x43, 0xE5, 0xA5, 0x91, 0x43, + 0xE5, 0xA5, 0x94, 0x43, 0xE5, 0xA5, 0xA2, 0x43, + 0xE5, 0xA5, 0xB3, 0x43, 0xE5, 0xA7, 0x98, 0x43, + 0xE5, 0xA7, 0xAC, 0x43, 0xE5, 0xA8, 0x9B, 0x43, + 0xE5, 0xA8, 0xA7, 0x43, 0xE5, 0xA9, 0xA2, 0x43, + 0xE5, 0xA9, 0xA6, 0x43, 0xE5, 0xAA, 0xB5, 0x43, + 0xE5, 0xAC, 0x88, 0x43, 0xE5, 0xAC, 0xA8, 0x43, + // Bytes a40 - a7f + 0xE5, 0xAC, 0xBE, 0x43, 0xE5, 0xAD, 0x90, 0x43, + 0xE5, 0xAD, 0x97, 0x43, 0xE5, 0xAD, 0xA6, 0x43, + 0xE5, 0xAE, 0x80, 0x43, 0xE5, 0xAE, 0x85, 0x43, + 0xE5, 0xAE, 0x97, 0x43, 0xE5, 0xAF, 0x83, 0x43, + 0xE5, 0xAF, 0x98, 0x43, 0xE5, 0xAF, 0xA7, 0x43, + 0xE5, 0xAF, 0xAE, 0x43, 0xE5, 0xAF, 0xB3, 0x43, + 0xE5, 0xAF, 0xB8, 0x43, 0xE5, 0xAF, 0xBF, 0x43, + 0xE5, 0xB0, 0x86, 0x43, 0xE5, 0xB0, 0x8F, 0x43, + // Bytes a80 - abf + 0xE5, 0xB0, 0xA2, 0x43, 0xE5, 0xB0, 0xB8, 0x43, + 0xE5, 0xB0, 0xBF, 0x43, 0xE5, 0xB1, 0xA0, 0x43, + 0xE5, 0xB1, 0xA2, 0x43, 0xE5, 0xB1, 0xA4, 0x43, + 0xE5, 0xB1, 0xA5, 0x43, 0xE5, 0xB1, 0xAE, 0x43, + 0xE5, 0xB1, 0xB1, 0x43, 0xE5, 0xB2, 0x8D, 0x43, + 0xE5, 0xB3, 0x80, 0x43, 0xE5, 0xB4, 0x99, 0x43, + 0xE5, 0xB5, 0x83, 0x43, 0xE5, 0xB5, 0x90, 0x43, + 0xE5, 0xB5, 0xAB, 0x43, 0xE5, 0xB5, 0xAE, 0x43, + // Bytes ac0 - aff + 0xE5, 0xB5, 0xBC, 0x43, 0xE5, 0xB6, 0xB2, 0x43, + 0xE5, 0xB6, 0xBA, 0x43, 0xE5, 0xB7, 0x9B, 0x43, + 0xE5, 0xB7, 0xA1, 0x43, 0xE5, 0xB7, 0xA2, 0x43, + 0xE5, 0xB7, 0xA5, 0x43, 0xE5, 0xB7, 0xA6, 0x43, + 0xE5, 0xB7, 0xB1, 0x43, 0xE5, 0xB7, 0xBD, 0x43, + 0xE5, 0xB7, 0xBE, 0x43, 0xE5, 0xB8, 0xA8, 0x43, + 0xE5, 0xB8, 0xBD, 0x43, 0xE5, 0xB9, 0xA9, 0x43, + 0xE5, 0xB9, 0xB2, 0x43, 0xE5, 0xB9, 0xB4, 0x43, + // Bytes b00 - b3f + 0xE5, 0xB9, 0xBA, 0x43, 0xE5, 0xB9, 0xBC, 0x43, + 0xE5, 0xB9, 0xBF, 0x43, 0xE5, 0xBA, 0xA6, 0x43, + 0xE5, 0xBA, 0xB0, 0x43, 0xE5, 0xBA, 0xB3, 0x43, + 0xE5, 0xBA, 0xB6, 0x43, 0xE5, 0xBB, 0x89, 0x43, + 0xE5, 0xBB, 0x8A, 0x43, 0xE5, 0xBB, 0x92, 0x43, + 0xE5, 0xBB, 0x93, 0x43, 0xE5, 0xBB, 0x99, 0x43, + 0xE5, 0xBB, 0xAC, 0x43, 0xE5, 0xBB, 0xB4, 0x43, + 0xE5, 0xBB, 0xBE, 0x43, 0xE5, 0xBC, 0x84, 0x43, + // Bytes b40 - b7f + 0xE5, 0xBC, 0x8B, 0x43, 0xE5, 0xBC, 0x93, 0x43, + 0xE5, 0xBC, 0xA2, 0x43, 0xE5, 0xBD, 0x90, 0x43, + 0xE5, 0xBD, 0x93, 0x43, 0xE5, 0xBD, 0xA1, 0x43, + 0xE5, 0xBD, 0xA2, 0x43, 0xE5, 0xBD, 0xA9, 0x43, + 0xE5, 0xBD, 0xAB, 0x43, 0xE5, 0xBD, 0xB3, 0x43, + 0xE5, 0xBE, 0x8B, 0x43, 0xE5, 0xBE, 0x8C, 0x43, + 0xE5, 0xBE, 0x97, 0x43, 0xE5, 0xBE, 0x9A, 0x43, + 0xE5, 0xBE, 0xA9, 0x43, 0xE5, 0xBE, 0xAD, 0x43, + // Bytes b80 - bbf + 0xE5, 0xBF, 0x83, 0x43, 0xE5, 0xBF, 0x8D, 0x43, + 0xE5, 0xBF, 0x97, 0x43, 0xE5, 0xBF, 0xB5, 0x43, + 0xE5, 0xBF, 0xB9, 0x43, 0xE6, 0x80, 0x92, 0x43, + 0xE6, 0x80, 0x9C, 0x43, 0xE6, 0x81, 0xB5, 0x43, + 0xE6, 0x82, 0x81, 0x43, 0xE6, 0x82, 0x94, 0x43, + 0xE6, 0x83, 0x87, 0x43, 0xE6, 0x83, 0x98, 0x43, + 0xE6, 0x83, 0xA1, 0x43, 0xE6, 0x84, 0x88, 0x43, + 0xE6, 0x85, 0x84, 0x43, 0xE6, 0x85, 0x88, 0x43, + // Bytes bc0 - bff + 0xE6, 0x85, 0x8C, 0x43, 0xE6, 0x85, 0x8E, 0x43, + 0xE6, 0x85, 0xA0, 0x43, 0xE6, 0x85, 0xA8, 0x43, + 0xE6, 0x85, 0xBA, 0x43, 0xE6, 0x86, 0x8E, 0x43, + 0xE6, 0x86, 0x90, 0x43, 0xE6, 0x86, 0xA4, 0x43, + 0xE6, 0x86, 0xAF, 0x43, 0xE6, 0x86, 0xB2, 0x43, + 0xE6, 0x87, 0x9E, 0x43, 0xE6, 0x87, 0xB2, 0x43, + 0xE6, 0x87, 0xB6, 0x43, 0xE6, 0x88, 0x80, 0x43, + 0xE6, 0x88, 0x88, 0x43, 0xE6, 0x88, 0x90, 0x43, + // Bytes c00 - c3f + 0xE6, 0x88, 0x9B, 0x43, 0xE6, 0x88, 0xAE, 0x43, + 0xE6, 0x88, 0xB4, 0x43, 0xE6, 0x88, 0xB6, 0x43, + 0xE6, 0x89, 0x8B, 0x43, 0xE6, 0x89, 0x93, 0x43, + 0xE6, 0x89, 0x9D, 0x43, 0xE6, 0x8A, 0x95, 0x43, + 0xE6, 0x8A, 0xB1, 0x43, 0xE6, 0x8B, 0x89, 0x43, + 0xE6, 0x8B, 0x8F, 0x43, 0xE6, 0x8B, 0x93, 0x43, + 0xE6, 0x8B, 0x94, 0x43, 0xE6, 0x8B, 0xBC, 0x43, + 0xE6, 0x8B, 0xBE, 0x43, 0xE6, 0x8C, 0x87, 0x43, + // Bytes c40 - c7f + 0xE6, 0x8C, 0xBD, 0x43, 0xE6, 0x8D, 0x90, 0x43, + 0xE6, 0x8D, 0x95, 0x43, 0xE6, 0x8D, 0xA8, 0x43, + 0xE6, 0x8D, 0xBB, 0x43, 0xE6, 0x8E, 0x83, 0x43, + 0xE6, 0x8E, 0xA0, 0x43, 0xE6, 0x8E, 0xA9, 0x43, + 0xE6, 0x8F, 0x84, 0x43, 0xE6, 0x8F, 0x85, 0x43, + 0xE6, 0x8F, 0xA4, 0x43, 0xE6, 0x90, 0x9C, 0x43, + 0xE6, 0x90, 0xA2, 0x43, 0xE6, 0x91, 0x92, 0x43, + 0xE6, 0x91, 0xA9, 0x43, 0xE6, 0x91, 0xB7, 0x43, + // Bytes c80 - cbf + 0xE6, 0x91, 0xBE, 0x43, 0xE6, 0x92, 0x9A, 0x43, + 0xE6, 0x92, 0x9D, 0x43, 0xE6, 0x93, 0x84, 0x43, + 0xE6, 0x94, 0xAF, 0x43, 0xE6, 0x94, 0xB4, 0x43, + 0xE6, 0x95, 0x8F, 0x43, 0xE6, 0x95, 0x96, 0x43, + 0xE6, 0x95, 0xAC, 0x43, 0xE6, 0x95, 0xB8, 0x43, + 0xE6, 0x96, 0x87, 0x43, 0xE6, 0x96, 0x97, 0x43, + 0xE6, 0x96, 0x99, 0x43, 0xE6, 0x96, 0xA4, 0x43, + 0xE6, 0x96, 0xB0, 0x43, 0xE6, 0x96, 0xB9, 0x43, + // Bytes cc0 - cff + 0xE6, 0x97, 0x85, 0x43, 0xE6, 0x97, 0xA0, 0x43, + 0xE6, 0x97, 0xA2, 0x43, 0xE6, 0x97, 0xA3, 0x43, + 0xE6, 0x97, 0xA5, 0x43, 0xE6, 0x98, 0x93, 0x43, + 0xE6, 0x98, 0xA0, 0x43, 0xE6, 0x99, 0x89, 0x43, + 0xE6, 0x99, 0xB4, 0x43, 0xE6, 0x9A, 0x88, 0x43, + 0xE6, 0x9A, 0x91, 0x43, 0xE6, 0x9A, 0x9C, 0x43, + 0xE6, 0x9A, 0xB4, 0x43, 0xE6, 0x9B, 0x86, 0x43, + 0xE6, 0x9B, 0xB0, 0x43, 0xE6, 0x9B, 0xB4, 0x43, + // Bytes d00 - d3f + 0xE6, 0x9B, 0xB8, 0x43, 0xE6, 0x9C, 0x80, 0x43, + 0xE6, 0x9C, 0x88, 0x43, 0xE6, 0x9C, 0x89, 0x43, + 0xE6, 0x9C, 0x97, 0x43, 0xE6, 0x9C, 0x9B, 0x43, + 0xE6, 0x9C, 0xA1, 0x43, 0xE6, 0x9C, 0xA8, 0x43, + 0xE6, 0x9D, 0x8E, 0x43, 0xE6, 0x9D, 0x93, 0x43, + 0xE6, 0x9D, 0x96, 0x43, 0xE6, 0x9D, 0x9E, 0x43, + 0xE6, 0x9D, 0xBB, 0x43, 0xE6, 0x9E, 0x85, 0x43, + 0xE6, 0x9E, 0x97, 0x43, 0xE6, 0x9F, 0xB3, 0x43, + // Bytes d40 - d7f + 0xE6, 0x9F, 0xBA, 0x43, 0xE6, 0xA0, 0x97, 0x43, + 0xE6, 0xA0, 0x9F, 0x43, 0xE6, 0xA0, 0xAA, 0x43, + 0xE6, 0xA1, 0x92, 0x43, 0xE6, 0xA2, 0x81, 0x43, + 0xE6, 0xA2, 0x85, 0x43, 0xE6, 0xA2, 0x8E, 0x43, + 0xE6, 0xA2, 0xA8, 0x43, 0xE6, 0xA4, 0x94, 0x43, + 0xE6, 0xA5, 0x82, 0x43, 0xE6, 0xA6, 0xA3, 0x43, + 0xE6, 0xA7, 0xAA, 0x43, 0xE6, 0xA8, 0x82, 0x43, + 0xE6, 0xA8, 0x93, 0x43, 0xE6, 0xAA, 0xA8, 0x43, + // Bytes d80 - dbf + 0xE6, 0xAB, 0x93, 0x43, 0xE6, 0xAB, 0x9B, 0x43, + 0xE6, 0xAC, 0x84, 0x43, 0xE6, 0xAC, 0xA0, 0x43, + 0xE6, 0xAC, 0xA1, 0x43, 0xE6, 0xAD, 0x94, 0x43, + 0xE6, 0xAD, 0xA2, 0x43, 0xE6, 0xAD, 0xA3, 0x43, + 0xE6, 0xAD, 0xB2, 0x43, 0xE6, 0xAD, 0xB7, 0x43, + 0xE6, 0xAD, 0xB9, 0x43, 0xE6, 0xAE, 0x9F, 0x43, + 0xE6, 0xAE, 0xAE, 0x43, 0xE6, 0xAE, 0xB3, 0x43, + 0xE6, 0xAE, 0xBA, 0x43, 0xE6, 0xAE, 0xBB, 0x43, + // Bytes dc0 - dff + 0xE6, 0xAF, 0x8B, 0x43, 0xE6, 0xAF, 0x8D, 0x43, + 0xE6, 0xAF, 0x94, 0x43, 0xE6, 0xAF, 0x9B, 0x43, + 0xE6, 0xB0, 0x8F, 0x43, 0xE6, 0xB0, 0x94, 0x43, + 0xE6, 0xB0, 0xB4, 0x43, 0xE6, 0xB1, 0x8E, 0x43, + 0xE6, 0xB1, 0xA7, 0x43, 0xE6, 0xB2, 0x88, 0x43, + 0xE6, 0xB2, 0xBF, 0x43, 0xE6, 0xB3, 0x8C, 0x43, + 0xE6, 0xB3, 0x8D, 0x43, 0xE6, 0xB3, 0xA5, 0x43, + 0xE6, 0xB3, 0xA8, 0x43, 0xE6, 0xB4, 0x96, 0x43, + // Bytes e00 - e3f + 0xE6, 0xB4, 0x9B, 0x43, 0xE6, 0xB4, 0x9E, 0x43, + 0xE6, 0xB4, 0xB4, 0x43, 0xE6, 0xB4, 0xBE, 0x43, + 0xE6, 0xB5, 0x81, 0x43, 0xE6, 0xB5, 0xA9, 0x43, + 0xE6, 0xB5, 0xAA, 0x43, 0xE6, 0xB5, 0xB7, 0x43, + 0xE6, 0xB5, 0xB8, 0x43, 0xE6, 0xB6, 0x85, 0x43, + 0xE6, 0xB7, 0x8B, 0x43, 0xE6, 0xB7, 0x9A, 0x43, + 0xE6, 0xB7, 0xAA, 0x43, 0xE6, 0xB7, 0xB9, 0x43, + 0xE6, 0xB8, 0x9A, 0x43, 0xE6, 0xB8, 0xAF, 0x43, + // Bytes e40 - e7f + 0xE6, 0xB9, 0xAE, 0x43, 0xE6, 0xBA, 0x80, 0x43, + 0xE6, 0xBA, 0x9C, 0x43, 0xE6, 0xBA, 0xBA, 0x43, + 0xE6, 0xBB, 0x87, 0x43, 0xE6, 0xBB, 0x8B, 0x43, + 0xE6, 0xBB, 0x91, 0x43, 0xE6, 0xBB, 0x9B, 0x43, + 0xE6, 0xBC, 0x8F, 0x43, 0xE6, 0xBC, 0x94, 0x43, + 0xE6, 0xBC, 0xA2, 0x43, 0xE6, 0xBC, 0xA3, 0x43, + 0xE6, 0xBD, 0xAE, 0x43, 0xE6, 0xBF, 0x86, 0x43, + 0xE6, 0xBF, 0xAB, 0x43, 0xE6, 0xBF, 0xBE, 0x43, + // Bytes e80 - ebf + 0xE7, 0x80, 0x9B, 0x43, 0xE7, 0x80, 0x9E, 0x43, + 0xE7, 0x80, 0xB9, 0x43, 0xE7, 0x81, 0x8A, 0x43, + 0xE7, 0x81, 0xAB, 0x43, 0xE7, 0x81, 0xB0, 0x43, + 0xE7, 0x81, 0xB7, 0x43, 0xE7, 0x81, 0xBD, 0x43, + 0xE7, 0x82, 0x99, 0x43, 0xE7, 0x82, 0xAD, 0x43, + 0xE7, 0x83, 0x88, 0x43, 0xE7, 0x83, 0x99, 0x43, + 0xE7, 0x84, 0xA1, 0x43, 0xE7, 0x85, 0x85, 0x43, + 0xE7, 0x85, 0x89, 0x43, 0xE7, 0x85, 0xAE, 0x43, + // Bytes ec0 - eff + 0xE7, 0x86, 0x9C, 0x43, 0xE7, 0x87, 0x8E, 0x43, + 0xE7, 0x87, 0x90, 0x43, 0xE7, 0x88, 0x90, 0x43, + 0xE7, 0x88, 0x9B, 0x43, 0xE7, 0x88, 0xA8, 0x43, + 0xE7, 0x88, 0xAA, 0x43, 0xE7, 0x88, 0xAB, 0x43, + 0xE7, 0x88, 0xB5, 0x43, 0xE7, 0x88, 0xB6, 0x43, + 0xE7, 0x88, 0xBB, 0x43, 0xE7, 0x88, 0xBF, 0x43, + 0xE7, 0x89, 0x87, 0x43, 0xE7, 0x89, 0x90, 0x43, + 0xE7, 0x89, 0x99, 0x43, 0xE7, 0x89, 0x9B, 0x43, + // Bytes f00 - f3f + 0xE7, 0x89, 0xA2, 0x43, 0xE7, 0x89, 0xB9, 0x43, + 0xE7, 0x8A, 0x80, 0x43, 0xE7, 0x8A, 0x95, 0x43, + 0xE7, 0x8A, 0xAC, 0x43, 0xE7, 0x8A, 0xAF, 0x43, + 0xE7, 0x8B, 0x80, 0x43, 0xE7, 0x8B, 0xBC, 0x43, + 0xE7, 0x8C, 0xAA, 0x43, 0xE7, 0x8D, 0xB5, 0x43, + 0xE7, 0x8D, 0xBA, 0x43, 0xE7, 0x8E, 0x84, 0x43, + 0xE7, 0x8E, 0x87, 0x43, 0xE7, 0x8E, 0x89, 0x43, + 0xE7, 0x8E, 0x8B, 0x43, 0xE7, 0x8E, 0xA5, 0x43, + // Bytes f40 - f7f + 0xE7, 0x8E, 0xB2, 0x43, 0xE7, 0x8F, 0x9E, 0x43, + 0xE7, 0x90, 0x86, 0x43, 0xE7, 0x90, 0x89, 0x43, + 0xE7, 0x90, 0xA2, 0x43, 0xE7, 0x91, 0x87, 0x43, + 0xE7, 0x91, 0x9C, 0x43, 0xE7, 0x91, 0xA9, 0x43, + 0xE7, 0x91, 0xB1, 0x43, 0xE7, 0x92, 0x85, 0x43, + 0xE7, 0x92, 0x89, 0x43, 0xE7, 0x92, 0x98, 0x43, + 0xE7, 0x93, 0x8A, 0x43, 0xE7, 0x93, 0x9C, 0x43, + 0xE7, 0x93, 0xA6, 0x43, 0xE7, 0x94, 0x86, 0x43, + // Bytes f80 - fbf + 0xE7, 0x94, 0x98, 0x43, 0xE7, 0x94, 0x9F, 0x43, + 0xE7, 0x94, 0xA4, 0x43, 0xE7, 0x94, 0xA8, 0x43, + 0xE7, 0x94, 0xB0, 0x43, 0xE7, 0x94, 0xB2, 0x43, + 0xE7, 0x94, 0xB3, 0x43, 0xE7, 0x94, 0xB7, 0x43, + 0xE7, 0x94, 0xBB, 0x43, 0xE7, 0x94, 0xBE, 0x43, + 0xE7, 0x95, 0x99, 0x43, 0xE7, 0x95, 0xA5, 0x43, + 0xE7, 0x95, 0xB0, 0x43, 0xE7, 0x96, 0x8B, 0x43, + 0xE7, 0x96, 0x92, 0x43, 0xE7, 0x97, 0xA2, 0x43, + // Bytes fc0 - fff + 0xE7, 0x98, 0x90, 0x43, 0xE7, 0x98, 0x9D, 0x43, + 0xE7, 0x98, 0x9F, 0x43, 0xE7, 0x99, 0x82, 0x43, + 0xE7, 0x99, 0xA9, 0x43, 0xE7, 0x99, 0xB6, 0x43, + 0xE7, 0x99, 0xBD, 0x43, 0xE7, 0x9A, 0xAE, 0x43, + 0xE7, 0x9A, 0xBF, 0x43, 0xE7, 0x9B, 0x8A, 0x43, + 0xE7, 0x9B, 0x9B, 0x43, 0xE7, 0x9B, 0xA3, 0x43, + 0xE7, 0x9B, 0xA7, 0x43, 0xE7, 0x9B, 0xAE, 0x43, + 0xE7, 0x9B, 0xB4, 0x43, 0xE7, 0x9C, 0x81, 0x43, + // Bytes 1000 - 103f + 0xE7, 0x9C, 0x9E, 0x43, 0xE7, 0x9C, 0x9F, 0x43, + 0xE7, 0x9D, 0x80, 0x43, 0xE7, 0x9D, 0x8A, 0x43, + 0xE7, 0x9E, 0x8B, 0x43, 0xE7, 0x9E, 0xA7, 0x43, + 0xE7, 0x9F, 0x9B, 0x43, 0xE7, 0x9F, 0xA2, 0x43, + 0xE7, 0x9F, 0xB3, 0x43, 0xE7, 0xA1, 0x8E, 0x43, + 0xE7, 0xA1, 0xAB, 0x43, 0xE7, 0xA2, 0x8C, 0x43, + 0xE7, 0xA2, 0x91, 0x43, 0xE7, 0xA3, 0x8A, 0x43, + 0xE7, 0xA3, 0x8C, 0x43, 0xE7, 0xA3, 0xBB, 0x43, + // Bytes 1040 - 107f + 0xE7, 0xA4, 0xAA, 0x43, 0xE7, 0xA4, 0xBA, 0x43, + 0xE7, 0xA4, 0xBC, 0x43, 0xE7, 0xA4, 0xBE, 0x43, + 0xE7, 0xA5, 0x88, 0x43, 0xE7, 0xA5, 0x89, 0x43, + 0xE7, 0xA5, 0x90, 0x43, 0xE7, 0xA5, 0x96, 0x43, + 0xE7, 0xA5, 0x9D, 0x43, 0xE7, 0xA5, 0x9E, 0x43, + 0xE7, 0xA5, 0xA5, 0x43, 0xE7, 0xA5, 0xBF, 0x43, + 0xE7, 0xA6, 0x81, 0x43, 0xE7, 0xA6, 0x8D, 0x43, + 0xE7, 0xA6, 0x8E, 0x43, 0xE7, 0xA6, 0x8F, 0x43, + // Bytes 1080 - 10bf + 0xE7, 0xA6, 0xAE, 0x43, 0xE7, 0xA6, 0xB8, 0x43, + 0xE7, 0xA6, 0xBE, 0x43, 0xE7, 0xA7, 0x8A, 0x43, + 0xE7, 0xA7, 0x98, 0x43, 0xE7, 0xA7, 0xAB, 0x43, + 0xE7, 0xA8, 0x9C, 0x43, 0xE7, 0xA9, 0x80, 0x43, + 0xE7, 0xA9, 0x8A, 0x43, 0xE7, 0xA9, 0x8F, 0x43, + 0xE7, 0xA9, 0xB4, 0x43, 0xE7, 0xA9, 0xBA, 0x43, + 0xE7, 0xAA, 0x81, 0x43, 0xE7, 0xAA, 0xB1, 0x43, + 0xE7, 0xAB, 0x8B, 0x43, 0xE7, 0xAB, 0xAE, 0x43, + // Bytes 10c0 - 10ff + 0xE7, 0xAB, 0xB9, 0x43, 0xE7, 0xAC, 0xA0, 0x43, + 0xE7, 0xAE, 0x8F, 0x43, 0xE7, 0xAF, 0x80, 0x43, + 0xE7, 0xAF, 0x86, 0x43, 0xE7, 0xAF, 0x89, 0x43, + 0xE7, 0xB0, 0xBE, 0x43, 0xE7, 0xB1, 0xA0, 0x43, + 0xE7, 0xB1, 0xB3, 0x43, 0xE7, 0xB1, 0xBB, 0x43, + 0xE7, 0xB2, 0x92, 0x43, 0xE7, 0xB2, 0xBE, 0x43, + 0xE7, 0xB3, 0x92, 0x43, 0xE7, 0xB3, 0x96, 0x43, + 0xE7, 0xB3, 0xA3, 0x43, 0xE7, 0xB3, 0xA7, 0x43, + // Bytes 1100 - 113f + 0xE7, 0xB3, 0xA8, 0x43, 0xE7, 0xB3, 0xB8, 0x43, + 0xE7, 0xB4, 0x80, 0x43, 0xE7, 0xB4, 0x90, 0x43, + 0xE7, 0xB4, 0xA2, 0x43, 0xE7, 0xB4, 0xAF, 0x43, + 0xE7, 0xB5, 0x82, 0x43, 0xE7, 0xB5, 0x9B, 0x43, + 0xE7, 0xB5, 0xA3, 0x43, 0xE7, 0xB6, 0xA0, 0x43, + 0xE7, 0xB6, 0xBE, 0x43, 0xE7, 0xB7, 0x87, 0x43, + 0xE7, 0xB7, 0xB4, 0x43, 0xE7, 0xB8, 0x82, 0x43, + 0xE7, 0xB8, 0x89, 0x43, 0xE7, 0xB8, 0xB7, 0x43, + // Bytes 1140 - 117f + 0xE7, 0xB9, 0x81, 0x43, 0xE7, 0xB9, 0x85, 0x43, + 0xE7, 0xBC, 0xB6, 0x43, 0xE7, 0xBC, 0xBE, 0x43, + 0xE7, 0xBD, 0x91, 0x43, 0xE7, 0xBD, 0xB2, 0x43, + 0xE7, 0xBD, 0xB9, 0x43, 0xE7, 0xBD, 0xBA, 0x43, + 0xE7, 0xBE, 0x85, 0x43, 0xE7, 0xBE, 0x8A, 0x43, + 0xE7, 0xBE, 0x95, 0x43, 0xE7, 0xBE, 0x9A, 0x43, + 0xE7, 0xBE, 0xBD, 0x43, 0xE7, 0xBF, 0xBA, 0x43, + 0xE8, 0x80, 0x81, 0x43, 0xE8, 0x80, 0x85, 0x43, + // Bytes 1180 - 11bf + 0xE8, 0x80, 0x8C, 0x43, 0xE8, 0x80, 0x92, 0x43, + 0xE8, 0x80, 0xB3, 0x43, 0xE8, 0x81, 0x86, 0x43, + 0xE8, 0x81, 0xA0, 0x43, 0xE8, 0x81, 0xAF, 0x43, + 0xE8, 0x81, 0xB0, 0x43, 0xE8, 0x81, 0xBE, 0x43, + 0xE8, 0x81, 0xBF, 0x43, 0xE8, 0x82, 0x89, 0x43, + 0xE8, 0x82, 0x8B, 0x43, 0xE8, 0x82, 0xAD, 0x43, + 0xE8, 0x82, 0xB2, 0x43, 0xE8, 0x84, 0x83, 0x43, + 0xE8, 0x84, 0xBE, 0x43, 0xE8, 0x87, 0x98, 0x43, + // Bytes 11c0 - 11ff + 0xE8, 0x87, 0xA3, 0x43, 0xE8, 0x87, 0xA8, 0x43, + 0xE8, 0x87, 0xAA, 0x43, 0xE8, 0x87, 0xAD, 0x43, + 0xE8, 0x87, 0xB3, 0x43, 0xE8, 0x87, 0xBC, 0x43, + 0xE8, 0x88, 0x81, 0x43, 0xE8, 0x88, 0x84, 0x43, + 0xE8, 0x88, 0x8C, 0x43, 0xE8, 0x88, 0x98, 0x43, + 0xE8, 0x88, 0x9B, 0x43, 0xE8, 0x88, 0x9F, 0x43, + 0xE8, 0x89, 0xAE, 0x43, 0xE8, 0x89, 0xAF, 0x43, + 0xE8, 0x89, 0xB2, 0x43, 0xE8, 0x89, 0xB8, 0x43, + // Bytes 1200 - 123f + 0xE8, 0x89, 0xB9, 0x43, 0xE8, 0x8A, 0x8B, 0x43, + 0xE8, 0x8A, 0x91, 0x43, 0xE8, 0x8A, 0x9D, 0x43, + 0xE8, 0x8A, 0xB1, 0x43, 0xE8, 0x8A, 0xB3, 0x43, + 0xE8, 0x8A, 0xBD, 0x43, 0xE8, 0x8B, 0xA5, 0x43, + 0xE8, 0x8B, 0xA6, 0x43, 0xE8, 0x8C, 0x9D, 0x43, + 0xE8, 0x8C, 0xA3, 0x43, 0xE8, 0x8C, 0xB6, 0x43, + 0xE8, 0x8D, 0x92, 0x43, 0xE8, 0x8D, 0x93, 0x43, + 0xE8, 0x8D, 0xA3, 0x43, 0xE8, 0x8E, 0xAD, 0x43, + // Bytes 1240 - 127f + 0xE8, 0x8E, 0xBD, 0x43, 0xE8, 0x8F, 0x89, 0x43, + 0xE8, 0x8F, 0x8A, 0x43, 0xE8, 0x8F, 0x8C, 0x43, + 0xE8, 0x8F, 0x9C, 0x43, 0xE8, 0x8F, 0xA7, 0x43, + 0xE8, 0x8F, 0xAF, 0x43, 0xE8, 0x8F, 0xB1, 0x43, + 0xE8, 0x90, 0xBD, 0x43, 0xE8, 0x91, 0x89, 0x43, + 0xE8, 0x91, 0x97, 0x43, 0xE8, 0x93, 0xAE, 0x43, + 0xE8, 0x93, 0xB1, 0x43, 0xE8, 0x93, 0xB3, 0x43, + 0xE8, 0x93, 0xBC, 0x43, 0xE8, 0x94, 0x96, 0x43, + // Bytes 1280 - 12bf + 0xE8, 0x95, 0xA4, 0x43, 0xE8, 0x97, 0x8D, 0x43, + 0xE8, 0x97, 0xBA, 0x43, 0xE8, 0x98, 0x86, 0x43, + 0xE8, 0x98, 0x92, 0x43, 0xE8, 0x98, 0xAD, 0x43, + 0xE8, 0x98, 0xBF, 0x43, 0xE8, 0x99, 0x8D, 0x43, + 0xE8, 0x99, 0x90, 0x43, 0xE8, 0x99, 0x9C, 0x43, + 0xE8, 0x99, 0xA7, 0x43, 0xE8, 0x99, 0xA9, 0x43, + 0xE8, 0x99, 0xAB, 0x43, 0xE8, 0x9A, 0x88, 0x43, + 0xE8, 0x9A, 0xA9, 0x43, 0xE8, 0x9B, 0xA2, 0x43, + // Bytes 12c0 - 12ff + 0xE8, 0x9C, 0x8E, 0x43, 0xE8, 0x9C, 0xA8, 0x43, + 0xE8, 0x9D, 0xAB, 0x43, 0xE8, 0x9D, 0xB9, 0x43, + 0xE8, 0x9E, 0x86, 0x43, 0xE8, 0x9E, 0xBA, 0x43, + 0xE8, 0x9F, 0xA1, 0x43, 0xE8, 0xA0, 0x81, 0x43, + 0xE8, 0xA0, 0x9F, 0x43, 0xE8, 0xA1, 0x80, 0x43, + 0xE8, 0xA1, 0x8C, 0x43, 0xE8, 0xA1, 0xA0, 0x43, + 0xE8, 0xA1, 0xA3, 0x43, 0xE8, 0xA3, 0x82, 0x43, + 0xE8, 0xA3, 0x8F, 0x43, 0xE8, 0xA3, 0x97, 0x43, + // Bytes 1300 - 133f + 0xE8, 0xA3, 0x9E, 0x43, 0xE8, 0xA3, 0xA1, 0x43, + 0xE8, 0xA3, 0xB8, 0x43, 0xE8, 0xA3, 0xBA, 0x43, + 0xE8, 0xA4, 0x90, 0x43, 0xE8, 0xA5, 0x81, 0x43, + 0xE8, 0xA5, 0xA4, 0x43, 0xE8, 0xA5, 0xBE, 0x43, + 0xE8, 0xA6, 0x86, 0x43, 0xE8, 0xA6, 0x8B, 0x43, + 0xE8, 0xA6, 0x96, 0x43, 0xE8, 0xA7, 0x92, 0x43, + 0xE8, 0xA7, 0xA3, 0x43, 0xE8, 0xA8, 0x80, 0x43, + 0xE8, 0xAA, 0xA0, 0x43, 0xE8, 0xAA, 0xAA, 0x43, + // Bytes 1340 - 137f + 0xE8, 0xAA, 0xBF, 0x43, 0xE8, 0xAB, 0x8B, 0x43, + 0xE8, 0xAB, 0x92, 0x43, 0xE8, 0xAB, 0x96, 0x43, + 0xE8, 0xAB, 0xAD, 0x43, 0xE8, 0xAB, 0xB8, 0x43, + 0xE8, 0xAB, 0xBE, 0x43, 0xE8, 0xAC, 0x81, 0x43, + 0xE8, 0xAC, 0xB9, 0x43, 0xE8, 0xAD, 0x98, 0x43, + 0xE8, 0xAE, 0x80, 0x43, 0xE8, 0xAE, 0x8A, 0x43, + 0xE8, 0xB0, 0xB7, 0x43, 0xE8, 0xB1, 0x86, 0x43, + 0xE8, 0xB1, 0x88, 0x43, 0xE8, 0xB1, 0x95, 0x43, + // Bytes 1380 - 13bf + 0xE8, 0xB1, 0xB8, 0x43, 0xE8, 0xB2, 0x9D, 0x43, + 0xE8, 0xB2, 0xA1, 0x43, 0xE8, 0xB2, 0xA9, 0x43, + 0xE8, 0xB2, 0xAB, 0x43, 0xE8, 0xB3, 0x81, 0x43, + 0xE8, 0xB3, 0x82, 0x43, 0xE8, 0xB3, 0x87, 0x43, + 0xE8, 0xB3, 0x88, 0x43, 0xE8, 0xB3, 0x93, 0x43, + 0xE8, 0xB4, 0x88, 0x43, 0xE8, 0xB4, 0x9B, 0x43, + 0xE8, 0xB5, 0xA4, 0x43, 0xE8, 0xB5, 0xB0, 0x43, + 0xE8, 0xB5, 0xB7, 0x43, 0xE8, 0xB6, 0xB3, 0x43, + // Bytes 13c0 - 13ff + 0xE8, 0xB6, 0xBC, 0x43, 0xE8, 0xB7, 0x8B, 0x43, + 0xE8, 0xB7, 0xAF, 0x43, 0xE8, 0xB7, 0xB0, 0x43, + 0xE8, 0xBA, 0xAB, 0x43, 0xE8, 0xBB, 0x8A, 0x43, + 0xE8, 0xBB, 0x94, 0x43, 0xE8, 0xBC, 0xA6, 0x43, + 0xE8, 0xBC, 0xAA, 0x43, 0xE8, 0xBC, 0xB8, 0x43, + 0xE8, 0xBC, 0xBB, 0x43, 0xE8, 0xBD, 0xA2, 0x43, + 0xE8, 0xBE, 0x9B, 0x43, 0xE8, 0xBE, 0x9E, 0x43, + 0xE8, 0xBE, 0xB0, 0x43, 0xE8, 0xBE, 0xB5, 0x43, + // Bytes 1400 - 143f + 0xE8, 0xBE, 0xB6, 0x43, 0xE9, 0x80, 0xA3, 0x43, + 0xE9, 0x80, 0xB8, 0x43, 0xE9, 0x81, 0x8A, 0x43, + 0xE9, 0x81, 0xA9, 0x43, 0xE9, 0x81, 0xB2, 0x43, + 0xE9, 0x81, 0xBC, 0x43, 0xE9, 0x82, 0x8F, 0x43, + 0xE9, 0x82, 0x91, 0x43, 0xE9, 0x82, 0x94, 0x43, + 0xE9, 0x83, 0x8E, 0x43, 0xE9, 0x83, 0x9E, 0x43, + 0xE9, 0x83, 0xB1, 0x43, 0xE9, 0x83, 0xBD, 0x43, + 0xE9, 0x84, 0x91, 0x43, 0xE9, 0x84, 0x9B, 0x43, + // Bytes 1440 - 147f + 0xE9, 0x85, 0x89, 0x43, 0xE9, 0x85, 0xAA, 0x43, + 0xE9, 0x86, 0x99, 0x43, 0xE9, 0x86, 0xB4, 0x43, + 0xE9, 0x87, 0x86, 0x43, 0xE9, 0x87, 0x8C, 0x43, + 0xE9, 0x87, 0x8F, 0x43, 0xE9, 0x87, 0x91, 0x43, + 0xE9, 0x88, 0xB4, 0x43, 0xE9, 0x88, 0xB8, 0x43, + 0xE9, 0x89, 0xB6, 0x43, 0xE9, 0x89, 0xBC, 0x43, + 0xE9, 0x8B, 0x97, 0x43, 0xE9, 0x8B, 0x98, 0x43, + 0xE9, 0x8C, 0x84, 0x43, 0xE9, 0x8D, 0x8A, 0x43, + // Bytes 1480 - 14bf + 0xE9, 0x8F, 0xB9, 0x43, 0xE9, 0x90, 0x95, 0x43, + 0xE9, 0x95, 0xB7, 0x43, 0xE9, 0x96, 0x80, 0x43, + 0xE9, 0x96, 0x8B, 0x43, 0xE9, 0x96, 0xAD, 0x43, + 0xE9, 0x96, 0xB7, 0x43, 0xE9, 0x98, 0x9C, 0x43, + 0xE9, 0x98, 0xAE, 0x43, 0xE9, 0x99, 0x8B, 0x43, + 0xE9, 0x99, 0x8D, 0x43, 0xE9, 0x99, 0xB5, 0x43, + 0xE9, 0x99, 0xB8, 0x43, 0xE9, 0x99, 0xBC, 0x43, + 0xE9, 0x9A, 0x86, 0x43, 0xE9, 0x9A, 0xA3, 0x43, + // Bytes 14c0 - 14ff + 0xE9, 0x9A, 0xB6, 0x43, 0xE9, 0x9A, 0xB7, 0x43, + 0xE9, 0x9A, 0xB8, 0x43, 0xE9, 0x9A, 0xB9, 0x43, + 0xE9, 0x9B, 0x83, 0x43, 0xE9, 0x9B, 0xA2, 0x43, + 0xE9, 0x9B, 0xA3, 0x43, 0xE9, 0x9B, 0xA8, 0x43, + 0xE9, 0x9B, 0xB6, 0x43, 0xE9, 0x9B, 0xB7, 0x43, + 0xE9, 0x9C, 0xA3, 0x43, 0xE9, 0x9C, 0xB2, 0x43, + 0xE9, 0x9D, 0x88, 0x43, 0xE9, 0x9D, 0x91, 0x43, + 0xE9, 0x9D, 0x96, 0x43, 0xE9, 0x9D, 0x9E, 0x43, + // Bytes 1500 - 153f + 0xE9, 0x9D, 0xA2, 0x43, 0xE9, 0x9D, 0xA9, 0x43, + 0xE9, 0x9F, 0x8B, 0x43, 0xE9, 0x9F, 0x9B, 0x43, + 0xE9, 0x9F, 0xA0, 0x43, 0xE9, 0x9F, 0xAD, 0x43, + 0xE9, 0x9F, 0xB3, 0x43, 0xE9, 0x9F, 0xBF, 0x43, + 0xE9, 0xA0, 0x81, 0x43, 0xE9, 0xA0, 0x85, 0x43, + 0xE9, 0xA0, 0x8B, 0x43, 0xE9, 0xA0, 0x98, 0x43, + 0xE9, 0xA0, 0xA9, 0x43, 0xE9, 0xA0, 0xBB, 0x43, + 0xE9, 0xA1, 0x9E, 0x43, 0xE9, 0xA2, 0xA8, 0x43, + // Bytes 1540 - 157f + 0xE9, 0xA3, 0x9B, 0x43, 0xE9, 0xA3, 0x9F, 0x43, + 0xE9, 0xA3, 0xA2, 0x43, 0xE9, 0xA3, 0xAF, 0x43, + 0xE9, 0xA3, 0xBC, 0x43, 0xE9, 0xA4, 0xA8, 0x43, + 0xE9, 0xA4, 0xA9, 0x43, 0xE9, 0xA6, 0x96, 0x43, + 0xE9, 0xA6, 0x99, 0x43, 0xE9, 0xA6, 0xA7, 0x43, + 0xE9, 0xA6, 0xAC, 0x43, 0xE9, 0xA7, 0x82, 0x43, + 0xE9, 0xA7, 0xB1, 0x43, 0xE9, 0xA7, 0xBE, 0x43, + 0xE9, 0xA9, 0xAA, 0x43, 0xE9, 0xAA, 0xA8, 0x43, + // Bytes 1580 - 15bf + 0xE9, 0xAB, 0x98, 0x43, 0xE9, 0xAB, 0x9F, 0x43, + 0xE9, 0xAC, 0x92, 0x43, 0xE9, 0xAC, 0xA5, 0x43, + 0xE9, 0xAC, 0xAF, 0x43, 0xE9, 0xAC, 0xB2, 0x43, + 0xE9, 0xAC, 0xBC, 0x43, 0xE9, 0xAD, 0x9A, 0x43, + 0xE9, 0xAD, 0xAF, 0x43, 0xE9, 0xB1, 0x80, 0x43, + 0xE9, 0xB1, 0x97, 0x43, 0xE9, 0xB3, 0xA5, 0x43, + 0xE9, 0xB3, 0xBD, 0x43, 0xE9, 0xB5, 0xA7, 0x43, + 0xE9, 0xB6, 0xB4, 0x43, 0xE9, 0xB7, 0xBA, 0x43, + // Bytes 15c0 - 15ff + 0xE9, 0xB8, 0x9E, 0x43, 0xE9, 0xB9, 0xB5, 0x43, + 0xE9, 0xB9, 0xBF, 0x43, 0xE9, 0xBA, 0x97, 0x43, + 0xE9, 0xBA, 0x9F, 0x43, 0xE9, 0xBA, 0xA5, 0x43, + 0xE9, 0xBA, 0xBB, 0x43, 0xE9, 0xBB, 0x83, 0x43, + 0xE9, 0xBB, 0x8D, 0x43, 0xE9, 0xBB, 0x8E, 0x43, + 0xE9, 0xBB, 0x91, 0x43, 0xE9, 0xBB, 0xB9, 0x43, + 0xE9, 0xBB, 0xBD, 0x43, 0xE9, 0xBB, 0xBE, 0x43, + 0xE9, 0xBC, 0x85, 0x43, 0xE9, 0xBC, 0x8E, 0x43, + // Bytes 1600 - 163f + 0xE9, 0xBC, 0x8F, 0x43, 0xE9, 0xBC, 0x93, 0x43, + 0xE9, 0xBC, 0x96, 0x43, 0xE9, 0xBC, 0xA0, 0x43, + 0xE9, 0xBC, 0xBB, 0x43, 0xE9, 0xBD, 0x83, 0x43, + 0xE9, 0xBD, 0x8A, 0x43, 0xE9, 0xBD, 0x92, 0x43, + 0xE9, 0xBE, 0x8D, 0x43, 0xE9, 0xBE, 0x8E, 0x43, + 0xE9, 0xBE, 0x9C, 0x43, 0xE9, 0xBE, 0x9F, 0x43, + 0xE9, 0xBE, 0xA0, 0x43, 0xEA, 0x9C, 0xA7, 0x43, + 0xEA, 0x9D, 0xAF, 0x43, 0xEA, 0xAC, 0xB7, 0x43, + // Bytes 1640 - 167f + 0xEA, 0xAD, 0x92, 0x44, 0xF0, 0xA0, 0x84, 0xA2, + 0x44, 0xF0, 0xA0, 0x94, 0x9C, 0x44, 0xF0, 0xA0, + 0x94, 0xA5, 0x44, 0xF0, 0xA0, 0x95, 0x8B, 0x44, + 0xF0, 0xA0, 0x98, 0xBA, 0x44, 0xF0, 0xA0, 0xA0, + 0x84, 0x44, 0xF0, 0xA0, 0xA3, 0x9E, 0x44, 0xF0, + 0xA0, 0xA8, 0xAC, 0x44, 0xF0, 0xA0, 0xAD, 0xA3, + 0x44, 0xF0, 0xA1, 0x93, 0xA4, 0x44, 0xF0, 0xA1, + 0x9A, 0xA8, 0x44, 0xF0, 0xA1, 0x9B, 0xAA, 0x44, + // Bytes 1680 - 16bf + 0xF0, 0xA1, 0xA7, 0x88, 0x44, 0xF0, 0xA1, 0xAC, + 0x98, 0x44, 0xF0, 0xA1, 0xB4, 0x8B, 0x44, 0xF0, + 0xA1, 0xB7, 0xA4, 0x44, 0xF0, 0xA1, 0xB7, 0xA6, + 0x44, 0xF0, 0xA2, 0x86, 0x83, 0x44, 0xF0, 0xA2, + 0x86, 0x9F, 0x44, 0xF0, 0xA2, 0x8C, 0xB1, 0x44, + 0xF0, 0xA2, 0x9B, 0x94, 0x44, 0xF0, 0xA2, 0xA1, + 0x84, 0x44, 0xF0, 0xA2, 0xA1, 0x8A, 0x44, 0xF0, + 0xA2, 0xAC, 0x8C, 0x44, 0xF0, 0xA2, 0xAF, 0xB1, + // Bytes 16c0 - 16ff + 0x44, 0xF0, 0xA3, 0x80, 0x8A, 0x44, 0xF0, 0xA3, + 0x8A, 0xB8, 0x44, 0xF0, 0xA3, 0x8D, 0x9F, 0x44, + 0xF0, 0xA3, 0x8E, 0x93, 0x44, 0xF0, 0xA3, 0x8E, + 0x9C, 0x44, 0xF0, 0xA3, 0x8F, 0x83, 0x44, 0xF0, + 0xA3, 0x8F, 0x95, 0x44, 0xF0, 0xA3, 0x91, 0xAD, + 0x44, 0xF0, 0xA3, 0x9A, 0xA3, 0x44, 0xF0, 0xA3, + 0xA2, 0xA7, 0x44, 0xF0, 0xA3, 0xAA, 0x8D, 0x44, + 0xF0, 0xA3, 0xAB, 0xBA, 0x44, 0xF0, 0xA3, 0xB2, + // Bytes 1700 - 173f + 0xBC, 0x44, 0xF0, 0xA3, 0xB4, 0x9E, 0x44, 0xF0, + 0xA3, 0xBB, 0x91, 0x44, 0xF0, 0xA3, 0xBD, 0x9E, + 0x44, 0xF0, 0xA3, 0xBE, 0x8E, 0x44, 0xF0, 0xA4, + 0x89, 0xA3, 0x44, 0xF0, 0xA4, 0x8B, 0xAE, 0x44, + 0xF0, 0xA4, 0x8E, 0xAB, 0x44, 0xF0, 0xA4, 0x98, + 0x88, 0x44, 0xF0, 0xA4, 0x9C, 0xB5, 0x44, 0xF0, + 0xA4, 0xA0, 0x94, 0x44, 0xF0, 0xA4, 0xB0, 0xB6, + 0x44, 0xF0, 0xA4, 0xB2, 0x92, 0x44, 0xF0, 0xA4, + // Bytes 1740 - 177f + 0xBE, 0xA1, 0x44, 0xF0, 0xA4, 0xBE, 0xB8, 0x44, + 0xF0, 0xA5, 0x81, 0x84, 0x44, 0xF0, 0xA5, 0x83, + 0xB2, 0x44, 0xF0, 0xA5, 0x83, 0xB3, 0x44, 0xF0, + 0xA5, 0x84, 0x99, 0x44, 0xF0, 0xA5, 0x84, 0xB3, + 0x44, 0xF0, 0xA5, 0x89, 0x89, 0x44, 0xF0, 0xA5, + 0x90, 0x9D, 0x44, 0xF0, 0xA5, 0x98, 0xA6, 0x44, + 0xF0, 0xA5, 0x9A, 0x9A, 0x44, 0xF0, 0xA5, 0x9B, + 0x85, 0x44, 0xF0, 0xA5, 0xA5, 0xBC, 0x44, 0xF0, + // Bytes 1780 - 17bf + 0xA5, 0xAA, 0xA7, 0x44, 0xF0, 0xA5, 0xAE, 0xAB, + 0x44, 0xF0, 0xA5, 0xB2, 0x80, 0x44, 0xF0, 0xA5, + 0xB3, 0x90, 0x44, 0xF0, 0xA5, 0xBE, 0x86, 0x44, + 0xF0, 0xA6, 0x87, 0x9A, 0x44, 0xF0, 0xA6, 0x88, + 0xA8, 0x44, 0xF0, 0xA6, 0x89, 0x87, 0x44, 0xF0, + 0xA6, 0x8B, 0x99, 0x44, 0xF0, 0xA6, 0x8C, 0xBE, + 0x44, 0xF0, 0xA6, 0x93, 0x9A, 0x44, 0xF0, 0xA6, + 0x94, 0xA3, 0x44, 0xF0, 0xA6, 0x96, 0xA8, 0x44, + // Bytes 17c0 - 17ff + 0xF0, 0xA6, 0x9E, 0xA7, 0x44, 0xF0, 0xA6, 0x9E, + 0xB5, 0x44, 0xF0, 0xA6, 0xAC, 0xBC, 0x44, 0xF0, + 0xA6, 0xB0, 0xB6, 0x44, 0xF0, 0xA6, 0xB3, 0x95, + 0x44, 0xF0, 0xA6, 0xB5, 0xAB, 0x44, 0xF0, 0xA6, + 0xBC, 0xAC, 0x44, 0xF0, 0xA6, 0xBE, 0xB1, 0x44, + 0xF0, 0xA7, 0x83, 0x92, 0x44, 0xF0, 0xA7, 0x8F, + 0x8A, 0x44, 0xF0, 0xA7, 0x99, 0xA7, 0x44, 0xF0, + 0xA7, 0xA2, 0xAE, 0x44, 0xF0, 0xA7, 0xA5, 0xA6, + // Bytes 1800 - 183f + 0x44, 0xF0, 0xA7, 0xB2, 0xA8, 0x44, 0xF0, 0xA7, + 0xBB, 0x93, 0x44, 0xF0, 0xA7, 0xBC, 0xAF, 0x44, + 0xF0, 0xA8, 0x97, 0x92, 0x44, 0xF0, 0xA8, 0x97, + 0xAD, 0x44, 0xF0, 0xA8, 0x9C, 0xAE, 0x44, 0xF0, + 0xA8, 0xAF, 0xBA, 0x44, 0xF0, 0xA8, 0xB5, 0xB7, + 0x44, 0xF0, 0xA9, 0x85, 0x85, 0x44, 0xF0, 0xA9, + 0x87, 0x9F, 0x44, 0xF0, 0xA9, 0x88, 0x9A, 0x44, + 0xF0, 0xA9, 0x90, 0x8A, 0x44, 0xF0, 0xA9, 0x92, + // Bytes 1840 - 187f + 0x96, 0x44, 0xF0, 0xA9, 0x96, 0xB6, 0x44, 0xF0, + 0xA9, 0xAC, 0xB0, 0x44, 0xF0, 0xAA, 0x83, 0x8E, + 0x44, 0xF0, 0xAA, 0x84, 0x85, 0x44, 0xF0, 0xAA, + 0x88, 0x8E, 0x44, 0xF0, 0xAA, 0x8A, 0x91, 0x44, + 0xF0, 0xAA, 0x8E, 0x92, 0x44, 0xF0, 0xAA, 0x98, + 0x80, 0x42, 0x21, 0x21, 0x42, 0x21, 0x3F, 0x42, + 0x2E, 0x2E, 0x42, 0x30, 0x2C, 0x42, 0x30, 0x2E, + 0x42, 0x31, 0x2C, 0x42, 0x31, 0x2E, 0x42, 0x31, + // Bytes 1880 - 18bf + 0x30, 0x42, 0x31, 0x31, 0x42, 0x31, 0x32, 0x42, + 0x31, 0x33, 0x42, 0x31, 0x34, 0x42, 0x31, 0x35, + 0x42, 0x31, 0x36, 0x42, 0x31, 0x37, 0x42, 0x31, + 0x38, 0x42, 0x31, 0x39, 0x42, 0x32, 0x2C, 0x42, + 0x32, 0x2E, 0x42, 0x32, 0x30, 0x42, 0x32, 0x31, + 0x42, 0x32, 0x32, 0x42, 0x32, 0x33, 0x42, 0x32, + 0x34, 0x42, 0x32, 0x35, 0x42, 0x32, 0x36, 0x42, + 0x32, 0x37, 0x42, 0x32, 0x38, 0x42, 0x32, 0x39, + // Bytes 18c0 - 18ff + 0x42, 0x33, 0x2C, 0x42, 0x33, 0x2E, 0x42, 0x33, + 0x30, 0x42, 0x33, 0x31, 0x42, 0x33, 0x32, 0x42, + 0x33, 0x33, 0x42, 0x33, 0x34, 0x42, 0x33, 0x35, + 0x42, 0x33, 0x36, 0x42, 0x33, 0x37, 0x42, 0x33, + 0x38, 0x42, 0x33, 0x39, 0x42, 0x34, 0x2C, 0x42, + 0x34, 0x2E, 0x42, 0x34, 0x30, 0x42, 0x34, 0x31, + 0x42, 0x34, 0x32, 0x42, 0x34, 0x33, 0x42, 0x34, + 0x34, 0x42, 0x34, 0x35, 0x42, 0x34, 0x36, 0x42, + // Bytes 1900 - 193f + 0x34, 0x37, 0x42, 0x34, 0x38, 0x42, 0x34, 0x39, + 0x42, 0x35, 0x2C, 0x42, 0x35, 0x2E, 0x42, 0x35, + 0x30, 0x42, 0x36, 0x2C, 0x42, 0x36, 0x2E, 0x42, + 0x37, 0x2C, 0x42, 0x37, 0x2E, 0x42, 0x38, 0x2C, + 0x42, 0x38, 0x2E, 0x42, 0x39, 0x2C, 0x42, 0x39, + 0x2E, 0x42, 0x3D, 0x3D, 0x42, 0x3F, 0x21, 0x42, + 0x3F, 0x3F, 0x42, 0x41, 0x55, 0x42, 0x42, 0x71, + 0x42, 0x43, 0x44, 0x42, 0x44, 0x4A, 0x42, 0x44, + // Bytes 1940 - 197f + 0x5A, 0x42, 0x44, 0x7A, 0x42, 0x47, 0x42, 0x42, + 0x47, 0x79, 0x42, 0x48, 0x50, 0x42, 0x48, 0x56, + 0x42, 0x48, 0x67, 0x42, 0x48, 0x7A, 0x42, 0x49, + 0x49, 0x42, 0x49, 0x4A, 0x42, 0x49, 0x55, 0x42, + 0x49, 0x56, 0x42, 0x49, 0x58, 0x42, 0x4B, 0x42, + 0x42, 0x4B, 0x4B, 0x42, 0x4B, 0x4D, 0x42, 0x4C, + 0x4A, 0x42, 0x4C, 0x6A, 0x42, 0x4D, 0x42, 0x42, + 0x4D, 0x43, 0x42, 0x4D, 0x44, 0x42, 0x4D, 0x56, + // Bytes 1980 - 19bf + 0x42, 0x4D, 0x57, 0x42, 0x4E, 0x4A, 0x42, 0x4E, + 0x6A, 0x42, 0x4E, 0x6F, 0x42, 0x50, 0x48, 0x42, + 0x50, 0x52, 0x42, 0x50, 0x61, 0x42, 0x52, 0x73, + 0x42, 0x53, 0x44, 0x42, 0x53, 0x4D, 0x42, 0x53, + 0x53, 0x42, 0x53, 0x76, 0x42, 0x54, 0x4D, 0x42, + 0x56, 0x49, 0x42, 0x57, 0x43, 0x42, 0x57, 0x5A, + 0x42, 0x57, 0x62, 0x42, 0x58, 0x49, 0x42, 0x63, + 0x63, 0x42, 0x63, 0x64, 0x42, 0x63, 0x6D, 0x42, + // Bytes 19c0 - 19ff + 0x64, 0x42, 0x42, 0x64, 0x61, 0x42, 0x64, 0x6C, + 0x42, 0x64, 0x6D, 0x42, 0x64, 0x7A, 0x42, 0x65, + 0x56, 0x42, 0x66, 0x66, 0x42, 0x66, 0x69, 0x42, + 0x66, 0x6C, 0x42, 0x66, 0x6D, 0x42, 0x68, 0x61, + 0x42, 0x69, 0x69, 0x42, 0x69, 0x6A, 0x42, 0x69, + 0x6E, 0x42, 0x69, 0x76, 0x42, 0x69, 0x78, 0x42, + 0x6B, 0x41, 0x42, 0x6B, 0x56, 0x42, 0x6B, 0x57, + 0x42, 0x6B, 0x67, 0x42, 0x6B, 0x6C, 0x42, 0x6B, + // Bytes 1a00 - 1a3f + 0x6D, 0x42, 0x6B, 0x74, 0x42, 0x6C, 0x6A, 0x42, + 0x6C, 0x6D, 0x42, 0x6C, 0x6E, 0x42, 0x6C, 0x78, + 0x42, 0x6D, 0x32, 0x42, 0x6D, 0x33, 0x42, 0x6D, + 0x41, 0x42, 0x6D, 0x56, 0x42, 0x6D, 0x57, 0x42, + 0x6D, 0x62, 0x42, 0x6D, 0x67, 0x42, 0x6D, 0x6C, + 0x42, 0x6D, 0x6D, 0x42, 0x6D, 0x73, 0x42, 0x6E, + 0x41, 0x42, 0x6E, 0x46, 0x42, 0x6E, 0x56, 0x42, + 0x6E, 0x57, 0x42, 0x6E, 0x6A, 0x42, 0x6E, 0x6D, + // Bytes 1a40 - 1a7f + 0x42, 0x6E, 0x73, 0x42, 0x6F, 0x56, 0x42, 0x70, + 0x41, 0x42, 0x70, 0x46, 0x42, 0x70, 0x56, 0x42, + 0x70, 0x57, 0x42, 0x70, 0x63, 0x42, 0x70, 0x73, + 0x42, 0x73, 0x72, 0x42, 0x73, 0x74, 0x42, 0x76, + 0x69, 0x42, 0x78, 0x69, 0x43, 0x28, 0x31, 0x29, + 0x43, 0x28, 0x32, 0x29, 0x43, 0x28, 0x33, 0x29, + 0x43, 0x28, 0x34, 0x29, 0x43, 0x28, 0x35, 0x29, + 0x43, 0x28, 0x36, 0x29, 0x43, 0x28, 0x37, 0x29, + // Bytes 1a80 - 1abf + 0x43, 0x28, 0x38, 0x29, 0x43, 0x28, 0x39, 0x29, + 0x43, 0x28, 0x41, 0x29, 0x43, 0x28, 0x42, 0x29, + 0x43, 0x28, 0x43, 0x29, 0x43, 0x28, 0x44, 0x29, + 0x43, 0x28, 0x45, 0x29, 0x43, 0x28, 0x46, 0x29, + 0x43, 0x28, 0x47, 0x29, 0x43, 0x28, 0x48, 0x29, + 0x43, 0x28, 0x49, 0x29, 0x43, 0x28, 0x4A, 0x29, + 0x43, 0x28, 0x4B, 0x29, 0x43, 0x28, 0x4C, 0x29, + 0x43, 0x28, 0x4D, 0x29, 0x43, 0x28, 0x4E, 0x29, + // Bytes 1ac0 - 1aff + 0x43, 0x28, 0x4F, 0x29, 0x43, 0x28, 0x50, 0x29, + 0x43, 0x28, 0x51, 0x29, 0x43, 0x28, 0x52, 0x29, + 0x43, 0x28, 0x53, 0x29, 0x43, 0x28, 0x54, 0x29, + 0x43, 0x28, 0x55, 0x29, 0x43, 0x28, 0x56, 0x29, + 0x43, 0x28, 0x57, 0x29, 0x43, 0x28, 0x58, 0x29, + 0x43, 0x28, 0x59, 0x29, 0x43, 0x28, 0x5A, 0x29, + 0x43, 0x28, 0x61, 0x29, 0x43, 0x28, 0x62, 0x29, + 0x43, 0x28, 0x63, 0x29, 0x43, 0x28, 0x64, 0x29, + // Bytes 1b00 - 1b3f + 0x43, 0x28, 0x65, 0x29, 0x43, 0x28, 0x66, 0x29, + 0x43, 0x28, 0x67, 0x29, 0x43, 0x28, 0x68, 0x29, + 0x43, 0x28, 0x69, 0x29, 0x43, 0x28, 0x6A, 0x29, + 0x43, 0x28, 0x6B, 0x29, 0x43, 0x28, 0x6C, 0x29, + 0x43, 0x28, 0x6D, 0x29, 0x43, 0x28, 0x6E, 0x29, + 0x43, 0x28, 0x6F, 0x29, 0x43, 0x28, 0x70, 0x29, + 0x43, 0x28, 0x71, 0x29, 0x43, 0x28, 0x72, 0x29, + 0x43, 0x28, 0x73, 0x29, 0x43, 0x28, 0x74, 0x29, + // Bytes 1b40 - 1b7f + 0x43, 0x28, 0x75, 0x29, 0x43, 0x28, 0x76, 0x29, + 0x43, 0x28, 0x77, 0x29, 0x43, 0x28, 0x78, 0x29, + 0x43, 0x28, 0x79, 0x29, 0x43, 0x28, 0x7A, 0x29, + 0x43, 0x2E, 0x2E, 0x2E, 0x43, 0x31, 0x30, 0x2E, + 0x43, 0x31, 0x31, 0x2E, 0x43, 0x31, 0x32, 0x2E, + 0x43, 0x31, 0x33, 0x2E, 0x43, 0x31, 0x34, 0x2E, + 0x43, 0x31, 0x35, 0x2E, 0x43, 0x31, 0x36, 0x2E, + 0x43, 0x31, 0x37, 0x2E, 0x43, 0x31, 0x38, 0x2E, + // Bytes 1b80 - 1bbf + 0x43, 0x31, 0x39, 0x2E, 0x43, 0x32, 0x30, 0x2E, + 0x43, 0x3A, 0x3A, 0x3D, 0x43, 0x3D, 0x3D, 0x3D, + 0x43, 0x43, 0x6F, 0x2E, 0x43, 0x46, 0x41, 0x58, + 0x43, 0x47, 0x48, 0x7A, 0x43, 0x47, 0x50, 0x61, + 0x43, 0x49, 0x49, 0x49, 0x43, 0x4C, 0x54, 0x44, + 0x43, 0x4C, 0xC2, 0xB7, 0x43, 0x4D, 0x48, 0x7A, + 0x43, 0x4D, 0x50, 0x61, 0x43, 0x4D, 0xCE, 0xA9, + 0x43, 0x50, 0x50, 0x4D, 0x43, 0x50, 0x50, 0x56, + // Bytes 1bc0 - 1bff + 0x43, 0x50, 0x54, 0x45, 0x43, 0x54, 0x45, 0x4C, + 0x43, 0x54, 0x48, 0x7A, 0x43, 0x56, 0x49, 0x49, + 0x43, 0x58, 0x49, 0x49, 0x43, 0x61, 0x2F, 0x63, + 0x43, 0x61, 0x2F, 0x73, 0x43, 0x61, 0xCA, 0xBE, + 0x43, 0x62, 0x61, 0x72, 0x43, 0x63, 0x2F, 0x6F, + 0x43, 0x63, 0x2F, 0x75, 0x43, 0x63, 0x61, 0x6C, + 0x43, 0x63, 0x6D, 0x32, 0x43, 0x63, 0x6D, 0x33, + 0x43, 0x64, 0x6D, 0x32, 0x43, 0x64, 0x6D, 0x33, + // Bytes 1c00 - 1c3f + 0x43, 0x65, 0x72, 0x67, 0x43, 0x66, 0x66, 0x69, + 0x43, 0x66, 0x66, 0x6C, 0x43, 0x67, 0x61, 0x6C, + 0x43, 0x68, 0x50, 0x61, 0x43, 0x69, 0x69, 0x69, + 0x43, 0x6B, 0x48, 0x7A, 0x43, 0x6B, 0x50, 0x61, + 0x43, 0x6B, 0x6D, 0x32, 0x43, 0x6B, 0x6D, 0x33, + 0x43, 0x6B, 0xCE, 0xA9, 0x43, 0x6C, 0x6F, 0x67, + 0x43, 0x6C, 0xC2, 0xB7, 0x43, 0x6D, 0x69, 0x6C, + 0x43, 0x6D, 0x6D, 0x32, 0x43, 0x6D, 0x6D, 0x33, + // Bytes 1c40 - 1c7f + 0x43, 0x6D, 0x6F, 0x6C, 0x43, 0x72, 0x61, 0x64, + 0x43, 0x76, 0x69, 0x69, 0x43, 0x78, 0x69, 0x69, + 0x43, 0xC2, 0xB0, 0x43, 0x43, 0xC2, 0xB0, 0x46, + 0x43, 0xCA, 0xBC, 0x6E, 0x43, 0xCE, 0xBC, 0x41, + 0x43, 0xCE, 0xBC, 0x46, 0x43, 0xCE, 0xBC, 0x56, + 0x43, 0xCE, 0xBC, 0x57, 0x43, 0xCE, 0xBC, 0x67, + 0x43, 0xCE, 0xBC, 0x6C, 0x43, 0xCE, 0xBC, 0x6D, + 0x43, 0xCE, 0xBC, 0x73, 0x44, 0x28, 0x31, 0x30, + // Bytes 1c80 - 1cbf + 0x29, 0x44, 0x28, 0x31, 0x31, 0x29, 0x44, 0x28, + 0x31, 0x32, 0x29, 0x44, 0x28, 0x31, 0x33, 0x29, + 0x44, 0x28, 0x31, 0x34, 0x29, 0x44, 0x28, 0x31, + 0x35, 0x29, 0x44, 0x28, 0x31, 0x36, 0x29, 0x44, + 0x28, 0x31, 0x37, 0x29, 0x44, 0x28, 0x31, 0x38, + 0x29, 0x44, 0x28, 0x31, 0x39, 0x29, 0x44, 0x28, + 0x32, 0x30, 0x29, 0x44, 0x30, 0xE7, 0x82, 0xB9, + 0x44, 0x31, 0xE2, 0x81, 0x84, 0x44, 0x31, 0xE6, + // Bytes 1cc0 - 1cff + 0x97, 0xA5, 0x44, 0x31, 0xE6, 0x9C, 0x88, 0x44, + 0x31, 0xE7, 0x82, 0xB9, 0x44, 0x32, 0xE6, 0x97, + 0xA5, 0x44, 0x32, 0xE6, 0x9C, 0x88, 0x44, 0x32, + 0xE7, 0x82, 0xB9, 0x44, 0x33, 0xE6, 0x97, 0xA5, + 0x44, 0x33, 0xE6, 0x9C, 0x88, 0x44, 0x33, 0xE7, + 0x82, 0xB9, 0x44, 0x34, 0xE6, 0x97, 0xA5, 0x44, + 0x34, 0xE6, 0x9C, 0x88, 0x44, 0x34, 0xE7, 0x82, + 0xB9, 0x44, 0x35, 0xE6, 0x97, 0xA5, 0x44, 0x35, + // Bytes 1d00 - 1d3f + 0xE6, 0x9C, 0x88, 0x44, 0x35, 0xE7, 0x82, 0xB9, + 0x44, 0x36, 0xE6, 0x97, 0xA5, 0x44, 0x36, 0xE6, + 0x9C, 0x88, 0x44, 0x36, 0xE7, 0x82, 0xB9, 0x44, + 0x37, 0xE6, 0x97, 0xA5, 0x44, 0x37, 0xE6, 0x9C, + 0x88, 0x44, 0x37, 0xE7, 0x82, 0xB9, 0x44, 0x38, + 0xE6, 0x97, 0xA5, 0x44, 0x38, 0xE6, 0x9C, 0x88, + 0x44, 0x38, 0xE7, 0x82, 0xB9, 0x44, 0x39, 0xE6, + 0x97, 0xA5, 0x44, 0x39, 0xE6, 0x9C, 0x88, 0x44, + // Bytes 1d40 - 1d7f + 0x39, 0xE7, 0x82, 0xB9, 0x44, 0x56, 0x49, 0x49, + 0x49, 0x44, 0x61, 0x2E, 0x6D, 0x2E, 0x44, 0x6B, + 0x63, 0x61, 0x6C, 0x44, 0x70, 0x2E, 0x6D, 0x2E, + 0x44, 0x76, 0x69, 0x69, 0x69, 0x44, 0xD5, 0xA5, + 0xD6, 0x82, 0x44, 0xD5, 0xB4, 0xD5, 0xA5, 0x44, + 0xD5, 0xB4, 0xD5, 0xAB, 0x44, 0xD5, 0xB4, 0xD5, + 0xAD, 0x44, 0xD5, 0xB4, 0xD5, 0xB6, 0x44, 0xD5, + 0xBE, 0xD5, 0xB6, 0x44, 0xD7, 0x90, 0xD7, 0x9C, + // Bytes 1d80 - 1dbf + 0x44, 0xD8, 0xA7, 0xD9, 0xB4, 0x44, 0xD8, 0xA8, + 0xD8, 0xAC, 0x44, 0xD8, 0xA8, 0xD8, 0xAD, 0x44, + 0xD8, 0xA8, 0xD8, 0xAE, 0x44, 0xD8, 0xA8, 0xD8, + 0xB1, 0x44, 0xD8, 0xA8, 0xD8, 0xB2, 0x44, 0xD8, + 0xA8, 0xD9, 0x85, 0x44, 0xD8, 0xA8, 0xD9, 0x86, + 0x44, 0xD8, 0xA8, 0xD9, 0x87, 0x44, 0xD8, 0xA8, + 0xD9, 0x89, 0x44, 0xD8, 0xA8, 0xD9, 0x8A, 0x44, + 0xD8, 0xAA, 0xD8, 0xAC, 0x44, 0xD8, 0xAA, 0xD8, + // Bytes 1dc0 - 1dff + 0xAD, 0x44, 0xD8, 0xAA, 0xD8, 0xAE, 0x44, 0xD8, + 0xAA, 0xD8, 0xB1, 0x44, 0xD8, 0xAA, 0xD8, 0xB2, + 0x44, 0xD8, 0xAA, 0xD9, 0x85, 0x44, 0xD8, 0xAA, + 0xD9, 0x86, 0x44, 0xD8, 0xAA, 0xD9, 0x87, 0x44, + 0xD8, 0xAA, 0xD9, 0x89, 0x44, 0xD8, 0xAA, 0xD9, + 0x8A, 0x44, 0xD8, 0xAB, 0xD8, 0xAC, 0x44, 0xD8, + 0xAB, 0xD8, 0xB1, 0x44, 0xD8, 0xAB, 0xD8, 0xB2, + 0x44, 0xD8, 0xAB, 0xD9, 0x85, 0x44, 0xD8, 0xAB, + // Bytes 1e00 - 1e3f + 0xD9, 0x86, 0x44, 0xD8, 0xAB, 0xD9, 0x87, 0x44, + 0xD8, 0xAB, 0xD9, 0x89, 0x44, 0xD8, 0xAB, 0xD9, + 0x8A, 0x44, 0xD8, 0xAC, 0xD8, 0xAD, 0x44, 0xD8, + 0xAC, 0xD9, 0x85, 0x44, 0xD8, 0xAC, 0xD9, 0x89, + 0x44, 0xD8, 0xAC, 0xD9, 0x8A, 0x44, 0xD8, 0xAD, + 0xD8, 0xAC, 0x44, 0xD8, 0xAD, 0xD9, 0x85, 0x44, + 0xD8, 0xAD, 0xD9, 0x89, 0x44, 0xD8, 0xAD, 0xD9, + 0x8A, 0x44, 0xD8, 0xAE, 0xD8, 0xAC, 0x44, 0xD8, + // Bytes 1e40 - 1e7f + 0xAE, 0xD8, 0xAD, 0x44, 0xD8, 0xAE, 0xD9, 0x85, + 0x44, 0xD8, 0xAE, 0xD9, 0x89, 0x44, 0xD8, 0xAE, + 0xD9, 0x8A, 0x44, 0xD8, 0xB3, 0xD8, 0xAC, 0x44, + 0xD8, 0xB3, 0xD8, 0xAD, 0x44, 0xD8, 0xB3, 0xD8, + 0xAE, 0x44, 0xD8, 0xB3, 0xD8, 0xB1, 0x44, 0xD8, + 0xB3, 0xD9, 0x85, 0x44, 0xD8, 0xB3, 0xD9, 0x87, + 0x44, 0xD8, 0xB3, 0xD9, 0x89, 0x44, 0xD8, 0xB3, + 0xD9, 0x8A, 0x44, 0xD8, 0xB4, 0xD8, 0xAC, 0x44, + // Bytes 1e80 - 1ebf + 0xD8, 0xB4, 0xD8, 0xAD, 0x44, 0xD8, 0xB4, 0xD8, + 0xAE, 0x44, 0xD8, 0xB4, 0xD8, 0xB1, 0x44, 0xD8, + 0xB4, 0xD9, 0x85, 0x44, 0xD8, 0xB4, 0xD9, 0x87, + 0x44, 0xD8, 0xB4, 0xD9, 0x89, 0x44, 0xD8, 0xB4, + 0xD9, 0x8A, 0x44, 0xD8, 0xB5, 0xD8, 0xAD, 0x44, + 0xD8, 0xB5, 0xD8, 0xAE, 0x44, 0xD8, 0xB5, 0xD8, + 0xB1, 0x44, 0xD8, 0xB5, 0xD9, 0x85, 0x44, 0xD8, + 0xB5, 0xD9, 0x89, 0x44, 0xD8, 0xB5, 0xD9, 0x8A, + // Bytes 1ec0 - 1eff + 0x44, 0xD8, 0xB6, 0xD8, 0xAC, 0x44, 0xD8, 0xB6, + 0xD8, 0xAD, 0x44, 0xD8, 0xB6, 0xD8, 0xAE, 0x44, + 0xD8, 0xB6, 0xD8, 0xB1, 0x44, 0xD8, 0xB6, 0xD9, + 0x85, 0x44, 0xD8, 0xB6, 0xD9, 0x89, 0x44, 0xD8, + 0xB6, 0xD9, 0x8A, 0x44, 0xD8, 0xB7, 0xD8, 0xAD, + 0x44, 0xD8, 0xB7, 0xD9, 0x85, 0x44, 0xD8, 0xB7, + 0xD9, 0x89, 0x44, 0xD8, 0xB7, 0xD9, 0x8A, 0x44, + 0xD8, 0xB8, 0xD9, 0x85, 0x44, 0xD8, 0xB9, 0xD8, + // Bytes 1f00 - 1f3f + 0xAC, 0x44, 0xD8, 0xB9, 0xD9, 0x85, 0x44, 0xD8, + 0xB9, 0xD9, 0x89, 0x44, 0xD8, 0xB9, 0xD9, 0x8A, + 0x44, 0xD8, 0xBA, 0xD8, 0xAC, 0x44, 0xD8, 0xBA, + 0xD9, 0x85, 0x44, 0xD8, 0xBA, 0xD9, 0x89, 0x44, + 0xD8, 0xBA, 0xD9, 0x8A, 0x44, 0xD9, 0x81, 0xD8, + 0xAC, 0x44, 0xD9, 0x81, 0xD8, 0xAD, 0x44, 0xD9, + 0x81, 0xD8, 0xAE, 0x44, 0xD9, 0x81, 0xD9, 0x85, + 0x44, 0xD9, 0x81, 0xD9, 0x89, 0x44, 0xD9, 0x81, + // Bytes 1f40 - 1f7f + 0xD9, 0x8A, 0x44, 0xD9, 0x82, 0xD8, 0xAD, 0x44, + 0xD9, 0x82, 0xD9, 0x85, 0x44, 0xD9, 0x82, 0xD9, + 0x89, 0x44, 0xD9, 0x82, 0xD9, 0x8A, 0x44, 0xD9, + 0x83, 0xD8, 0xA7, 0x44, 0xD9, 0x83, 0xD8, 0xAC, + 0x44, 0xD9, 0x83, 0xD8, 0xAD, 0x44, 0xD9, 0x83, + 0xD8, 0xAE, 0x44, 0xD9, 0x83, 0xD9, 0x84, 0x44, + 0xD9, 0x83, 0xD9, 0x85, 0x44, 0xD9, 0x83, 0xD9, + 0x89, 0x44, 0xD9, 0x83, 0xD9, 0x8A, 0x44, 0xD9, + // Bytes 1f80 - 1fbf + 0x84, 0xD8, 0xA7, 0x44, 0xD9, 0x84, 0xD8, 0xAC, + 0x44, 0xD9, 0x84, 0xD8, 0xAD, 0x44, 0xD9, 0x84, + 0xD8, 0xAE, 0x44, 0xD9, 0x84, 0xD9, 0x85, 0x44, + 0xD9, 0x84, 0xD9, 0x87, 0x44, 0xD9, 0x84, 0xD9, + 0x89, 0x44, 0xD9, 0x84, 0xD9, 0x8A, 0x44, 0xD9, + 0x85, 0xD8, 0xA7, 0x44, 0xD9, 0x85, 0xD8, 0xAC, + 0x44, 0xD9, 0x85, 0xD8, 0xAD, 0x44, 0xD9, 0x85, + 0xD8, 0xAE, 0x44, 0xD9, 0x85, 0xD9, 0x85, 0x44, + // Bytes 1fc0 - 1fff + 0xD9, 0x85, 0xD9, 0x89, 0x44, 0xD9, 0x85, 0xD9, + 0x8A, 0x44, 0xD9, 0x86, 0xD8, 0xAC, 0x44, 0xD9, + 0x86, 0xD8, 0xAD, 0x44, 0xD9, 0x86, 0xD8, 0xAE, + 0x44, 0xD9, 0x86, 0xD8, 0xB1, 0x44, 0xD9, 0x86, + 0xD8, 0xB2, 0x44, 0xD9, 0x86, 0xD9, 0x85, 0x44, + 0xD9, 0x86, 0xD9, 0x86, 0x44, 0xD9, 0x86, 0xD9, + 0x87, 0x44, 0xD9, 0x86, 0xD9, 0x89, 0x44, 0xD9, + 0x86, 0xD9, 0x8A, 0x44, 0xD9, 0x87, 0xD8, 0xAC, + // Bytes 2000 - 203f + 0x44, 0xD9, 0x87, 0xD9, 0x85, 0x44, 0xD9, 0x87, + 0xD9, 0x89, 0x44, 0xD9, 0x87, 0xD9, 0x8A, 0x44, + 0xD9, 0x88, 0xD9, 0xB4, 0x44, 0xD9, 0x8A, 0xD8, + 0xAC, 0x44, 0xD9, 0x8A, 0xD8, 0xAD, 0x44, 0xD9, + 0x8A, 0xD8, 0xAE, 0x44, 0xD9, 0x8A, 0xD8, 0xB1, + 0x44, 0xD9, 0x8A, 0xD8, 0xB2, 0x44, 0xD9, 0x8A, + 0xD9, 0x85, 0x44, 0xD9, 0x8A, 0xD9, 0x86, 0x44, + 0xD9, 0x8A, 0xD9, 0x87, 0x44, 0xD9, 0x8A, 0xD9, + // Bytes 2040 - 207f + 0x89, 0x44, 0xD9, 0x8A, 0xD9, 0x8A, 0x44, 0xD9, + 0x8A, 0xD9, 0xB4, 0x44, 0xDB, 0x87, 0xD9, 0xB4, + 0x45, 0x28, 0xE1, 0x84, 0x80, 0x29, 0x45, 0x28, + 0xE1, 0x84, 0x82, 0x29, 0x45, 0x28, 0xE1, 0x84, + 0x83, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x85, 0x29, + 0x45, 0x28, 0xE1, 0x84, 0x86, 0x29, 0x45, 0x28, + 0xE1, 0x84, 0x87, 0x29, 0x45, 0x28, 0xE1, 0x84, + 0x89, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8B, 0x29, + // Bytes 2080 - 20bf + 0x45, 0x28, 0xE1, 0x84, 0x8C, 0x29, 0x45, 0x28, + 0xE1, 0x84, 0x8E, 0x29, 0x45, 0x28, 0xE1, 0x84, + 0x8F, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x90, 0x29, + 0x45, 0x28, 0xE1, 0x84, 0x91, 0x29, 0x45, 0x28, + 0xE1, 0x84, 0x92, 0x29, 0x45, 0x28, 0xE4, 0xB8, + 0x80, 0x29, 0x45, 0x28, 0xE4, 0xB8, 0x83, 0x29, + 0x45, 0x28, 0xE4, 0xB8, 0x89, 0x29, 0x45, 0x28, + 0xE4, 0xB9, 0x9D, 0x29, 0x45, 0x28, 0xE4, 0xBA, + // Bytes 20c0 - 20ff + 0x8C, 0x29, 0x45, 0x28, 0xE4, 0xBA, 0x94, 0x29, + 0x45, 0x28, 0xE4, 0xBB, 0xA3, 0x29, 0x45, 0x28, + 0xE4, 0xBC, 0x81, 0x29, 0x45, 0x28, 0xE4, 0xBC, + 0x91, 0x29, 0x45, 0x28, 0xE5, 0x85, 0xAB, 0x29, + 0x45, 0x28, 0xE5, 0x85, 0xAD, 0x29, 0x45, 0x28, + 0xE5, 0x8A, 0xB4, 0x29, 0x45, 0x28, 0xE5, 0x8D, + 0x81, 0x29, 0x45, 0x28, 0xE5, 0x8D, 0x94, 0x29, + 0x45, 0x28, 0xE5, 0x90, 0x8D, 0x29, 0x45, 0x28, + // Bytes 2100 - 213f + 0xE5, 0x91, 0xBC, 0x29, 0x45, 0x28, 0xE5, 0x9B, + 0x9B, 0x29, 0x45, 0x28, 0xE5, 0x9C, 0x9F, 0x29, + 0x45, 0x28, 0xE5, 0xAD, 0xA6, 0x29, 0x45, 0x28, + 0xE6, 0x97, 0xA5, 0x29, 0x45, 0x28, 0xE6, 0x9C, + 0x88, 0x29, 0x45, 0x28, 0xE6, 0x9C, 0x89, 0x29, + 0x45, 0x28, 0xE6, 0x9C, 0xA8, 0x29, 0x45, 0x28, + 0xE6, 0xA0, 0xAA, 0x29, 0x45, 0x28, 0xE6, 0xB0, + 0xB4, 0x29, 0x45, 0x28, 0xE7, 0x81, 0xAB, 0x29, + // Bytes 2140 - 217f + 0x45, 0x28, 0xE7, 0x89, 0xB9, 0x29, 0x45, 0x28, + 0xE7, 0x9B, 0xA3, 0x29, 0x45, 0x28, 0xE7, 0xA4, + 0xBE, 0x29, 0x45, 0x28, 0xE7, 0xA5, 0x9D, 0x29, + 0x45, 0x28, 0xE7, 0xA5, 0xAD, 0x29, 0x45, 0x28, + 0xE8, 0x87, 0xAA, 0x29, 0x45, 0x28, 0xE8, 0x87, + 0xB3, 0x29, 0x45, 0x28, 0xE8, 0xB2, 0xA1, 0x29, + 0x45, 0x28, 0xE8, 0xB3, 0x87, 0x29, 0x45, 0x28, + 0xE9, 0x87, 0x91, 0x29, 0x45, 0x30, 0xE2, 0x81, + // Bytes 2180 - 21bf + 0x84, 0x33, 0x45, 0x31, 0x30, 0xE6, 0x97, 0xA5, + 0x45, 0x31, 0x30, 0xE6, 0x9C, 0x88, 0x45, 0x31, + 0x30, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x31, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x31, 0xE6, 0x9C, 0x88, + 0x45, 0x31, 0x31, 0xE7, 0x82, 0xB9, 0x45, 0x31, + 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x32, 0xE6, + 0x9C, 0x88, 0x45, 0x31, 0x32, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x33, 0xE6, 0x97, 0xA5, 0x45, 0x31, + // Bytes 21c0 - 21ff + 0x33, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x34, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x34, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x35, 0xE6, 0x97, 0xA5, 0x45, 0x31, + 0x35, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x36, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x36, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x31, + 0x37, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x38, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x38, 0xE7, 0x82, 0xB9, + // Bytes 2200 - 223f + 0x45, 0x31, 0x39, 0xE6, 0x97, 0xA5, 0x45, 0x31, + 0x39, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0xE2, 0x81, + 0x84, 0x32, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x33, + 0x45, 0x31, 0xE2, 0x81, 0x84, 0x34, 0x45, 0x31, + 0xE2, 0x81, 0x84, 0x35, 0x45, 0x31, 0xE2, 0x81, + 0x84, 0x36, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x37, + 0x45, 0x31, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x31, + 0xE2, 0x81, 0x84, 0x39, 0x45, 0x32, 0x30, 0xE6, + // Bytes 2240 - 227f + 0x97, 0xA5, 0x45, 0x32, 0x30, 0xE7, 0x82, 0xB9, + 0x45, 0x32, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0x31, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x32, 0xE6, + 0x97, 0xA5, 0x45, 0x32, 0x32, 0xE7, 0x82, 0xB9, + 0x45, 0x32, 0x33, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0x33, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x34, 0xE6, + 0x97, 0xA5, 0x45, 0x32, 0x34, 0xE7, 0x82, 0xB9, + 0x45, 0x32, 0x35, 0xE6, 0x97, 0xA5, 0x45, 0x32, + // Bytes 2280 - 22bf + 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x37, 0xE6, + 0x97, 0xA5, 0x45, 0x32, 0x38, 0xE6, 0x97, 0xA5, + 0x45, 0x32, 0x39, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0xE2, 0x81, 0x84, 0x33, 0x45, 0x32, 0xE2, 0x81, + 0x84, 0x35, 0x45, 0x33, 0x30, 0xE6, 0x97, 0xA5, + 0x45, 0x33, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x33, + 0xE2, 0x81, 0x84, 0x34, 0x45, 0x33, 0xE2, 0x81, + 0x84, 0x35, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x38, + // Bytes 22c0 - 22ff + 0x45, 0x34, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x35, + 0xE2, 0x81, 0x84, 0x36, 0x45, 0x35, 0xE2, 0x81, + 0x84, 0x38, 0x45, 0x37, 0xE2, 0x81, 0x84, 0x38, + 0x45, 0x41, 0xE2, 0x88, 0x95, 0x6D, 0x45, 0x56, + 0xE2, 0x88, 0x95, 0x6D, 0x45, 0x6D, 0xE2, 0x88, + 0x95, 0x73, 0x46, 0x31, 0xE2, 0x81, 0x84, 0x31, + 0x30, 0x46, 0x43, 0xE2, 0x88, 0x95, 0x6B, 0x67, + 0x46, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x32, 0x46, + // Bytes 2300 - 233f + 0xD8, 0xA8, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, + 0xA8, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, 0xD8, 0xAA, + 0xD8, 0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, + 0xAC, 0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, + 0xD9, 0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAD, 0xD8, + 0xAC, 0x46, 0xD8, 0xAA, 0xD8, 0xAD, 0xD9, 0x85, + 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9, 0x85, 0x46, + 0xD8, 0xAA, 0xD8, 0xAE, 0xD9, 0x89, 0x46, 0xD8, + // Bytes 2340 - 237f + 0xAA, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, 0xD8, 0xAA, + 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8, 0xAA, 0xD9, + 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xAA, 0xD9, 0x85, + 0xD8, 0xAE, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD9, + 0x89, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD9, 0x8A, + 0x46, 0xD8, 0xAC, 0xD8, 0xAD, 0xD9, 0x89, 0x46, + 0xD8, 0xAC, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, + 0xAC, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xAC, + // Bytes 2380 - 23bf + 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD9, + 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAD, 0xD8, 0xAC, + 0xD9, 0x8A, 0x46, 0xD8, 0xAD, 0xD9, 0x85, 0xD9, + 0x89, 0x46, 0xD8, 0xAD, 0xD9, 0x85, 0xD9, 0x8A, + 0x46, 0xD8, 0xB3, 0xD8, 0xAC, 0xD8, 0xAD, 0x46, + 0xD8, 0xB3, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD8, + 0xB3, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xB3, + 0xD8, 0xAE, 0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, + // Bytes 23c0 - 23ff + 0xAE, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD9, 0x85, + 0xD8, 0xAC, 0x46, 0xD8, 0xB3, 0xD9, 0x85, 0xD8, + 0xAD, 0x46, 0xD8, 0xB3, 0xD9, 0x85, 0xD9, 0x85, + 0x46, 0xD8, 0xB4, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, + 0xD8, 0xB4, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, + 0xB4, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, + 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8, 0xB4, 0xD9, + 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB5, 0xD8, 0xAD, + // Bytes 2400 - 243f + 0xD8, 0xAD, 0x46, 0xD8, 0xB5, 0xD8, 0xAD, 0xD9, + 0x8A, 0x46, 0xD8, 0xB5, 0xD9, 0x84, 0xD9, 0x89, + 0x46, 0xD8, 0xB5, 0xD9, 0x84, 0xDB, 0x92, 0x46, + 0xD8, 0xB5, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, + 0xB6, 0xD8, 0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xB6, + 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB6, 0xD8, + 0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xB7, 0xD9, 0x85, + 0xD8, 0xAD, 0x46, 0xD8, 0xB7, 0xD9, 0x85, 0xD9, + // Bytes 2440 - 247f + 0x85, 0x46, 0xD8, 0xB7, 0xD9, 0x85, 0xD9, 0x8A, + 0x46, 0xD8, 0xB9, 0xD8, 0xAC, 0xD9, 0x85, 0x46, + 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, + 0xB9, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xB9, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xBA, 0xD9, + 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xBA, 0xD9, 0x85, + 0xD9, 0x89, 0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, + 0x8A, 0x46, 0xD9, 0x81, 0xD8, 0xAE, 0xD9, 0x85, + // Bytes 2480 - 24bf + 0x46, 0xD9, 0x81, 0xD9, 0x85, 0xD9, 0x8A, 0x46, + 0xD9, 0x82, 0xD9, 0x84, 0xDB, 0x92, 0x46, 0xD9, + 0x82, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x82, + 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, 0x82, 0xD9, + 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x83, 0xD9, 0x85, + 0xD9, 0x85, 0x46, 0xD9, 0x83, 0xD9, 0x85, 0xD9, + 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAC, 0xD8, 0xAC, + 0x46, 0xD9, 0x84, 0xD8, 0xAC, 0xD9, 0x85, 0x46, + // Bytes 24c0 - 24ff + 0xD9, 0x84, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, + 0x84, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x84, + 0xD8, 0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x84, 0xD8, + 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAE, + 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD9, 0x85, 0xD8, + 0xAD, 0x46, 0xD9, 0x84, 0xD9, 0x85, 0xD9, 0x8A, + 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD8, 0xAD, 0x46, + 0xD9, 0x85, 0xD8, 0xAC, 0xD8, 0xAE, 0x46, 0xD9, + // Bytes 2500 - 253f + 0x85, 0xD8, 0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x85, + 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8, + 0xAD, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8, 0xAD, + 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD9, + 0x8A, 0x46, 0xD9, 0x85, 0xD8, 0xAE, 0xD8, 0xAC, + 0x46, 0xD9, 0x85, 0xD8, 0xAE, 0xD9, 0x85, 0x46, + 0xD9, 0x85, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, 0xD9, + 0x85, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x86, + // Bytes 2540 - 257f + 0xD8, 0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x86, 0xD8, + 0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8, 0xAC, + 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, + 0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAD, 0xD9, 0x85, + 0x46, 0xD9, 0x86, 0xD8, 0xAD, 0xD9, 0x89, 0x46, + 0xD9, 0x86, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, + 0x86, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD9, 0x86, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x87, 0xD9, + // Bytes 2580 - 25bf + 0x85, 0xD8, 0xAC, 0x46, 0xD9, 0x87, 0xD9, 0x85, + 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD8, 0xAC, 0xD9, + 0x8A, 0x46, 0xD9, 0x8A, 0xD8, 0xAD, 0xD9, 0x8A, + 0x46, 0xD9, 0x8A, 0xD9, 0x85, 0xD9, 0x85, 0x46, + 0xD9, 0x8A, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, + 0x8A, 0xD9, 0x94, 0xD8, 0xA7, 0x46, 0xD9, 0x8A, + 0xD9, 0x94, 0xD8, 0xAC, 0x46, 0xD9, 0x8A, 0xD9, + 0x94, 0xD8, 0xAD, 0x46, 0xD9, 0x8A, 0xD9, 0x94, + // Bytes 25c0 - 25ff + 0xD8, 0xAE, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, + 0xB1, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xB2, + 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x85, 0x46, + 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x86, 0x46, 0xD9, + 0x8A, 0xD9, 0x94, 0xD9, 0x87, 0x46, 0xD9, 0x8A, + 0xD9, 0x94, 0xD9, 0x88, 0x46, 0xD9, 0x8A, 0xD9, + 0x94, 0xD9, 0x89, 0x46, 0xD9, 0x8A, 0xD9, 0x94, + 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, + // Bytes 2600 - 263f + 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x87, + 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x88, 0x46, + 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x90, 0x46, 0xD9, + 0x8A, 0xD9, 0x94, 0xDB, 0x95, 0x46, 0xE0, 0xB9, + 0x8D, 0xE0, 0xB8, 0xB2, 0x46, 0xE0, 0xBA, 0xAB, + 0xE0, 0xBA, 0x99, 0x46, 0xE0, 0xBA, 0xAB, 0xE0, + 0xBA, 0xA1, 0x46, 0xE0, 0xBB, 0x8D, 0xE0, 0xBA, + 0xB2, 0x46, 0xE0, 0xBD, 0x80, 0xE0, 0xBE, 0xB5, + // Bytes 2640 - 267f + 0x46, 0xE0, 0xBD, 0x82, 0xE0, 0xBE, 0xB7, 0x46, + 0xE0, 0xBD, 0x8C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, + 0xBD, 0x91, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, + 0x96, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x9B, + 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0x90, 0xE0, + 0xBE, 0xB5, 0x46, 0xE0, 0xBE, 0x92, 0xE0, 0xBE, + 0xB7, 0x46, 0xE0, 0xBE, 0x9C, 0xE0, 0xBE, 0xB7, + 0x46, 0xE0, 0xBE, 0xA1, 0xE0, 0xBE, 0xB7, 0x46, + // Bytes 2680 - 26bf + 0xE0, 0xBE, 0xA6, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, + 0xBE, 0xAB, 0xE0, 0xBE, 0xB7, 0x46, 0xE2, 0x80, + 0xB2, 0xE2, 0x80, 0xB2, 0x46, 0xE2, 0x80, 0xB5, + 0xE2, 0x80, 0xB5, 0x46, 0xE2, 0x88, 0xAB, 0xE2, + 0x88, 0xAB, 0x46, 0xE2, 0x88, 0xAE, 0xE2, 0x88, + 0xAE, 0x46, 0xE3, 0x81, 0xBB, 0xE3, 0x81, 0x8B, + 0x46, 0xE3, 0x82, 0x88, 0xE3, 0x82, 0x8A, 0x46, + 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0x46, 0xE3, + // Bytes 26c0 - 26ff + 0x82, 0xB3, 0xE3, 0x82, 0xB3, 0x46, 0xE3, 0x82, + 0xB3, 0xE3, 0x83, 0x88, 0x46, 0xE3, 0x83, 0x88, + 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83, 0x8A, 0xE3, + 0x83, 0x8E, 0x46, 0xE3, 0x83, 0x9B, 0xE3, 0x83, + 0xB3, 0x46, 0xE3, 0x83, 0x9F, 0xE3, 0x83, 0xAA, + 0x46, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xA9, 0x46, + 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xA0, 0x46, 0xE5, + 0xA4, 0xA7, 0xE6, 0xAD, 0xA3, 0x46, 0xE5, 0xB9, + // Bytes 2700 - 273f + 0xB3, 0xE6, 0x88, 0x90, 0x46, 0xE6, 0x98, 0x8E, + 0xE6, 0xB2, 0xBB, 0x46, 0xE6, 0x98, 0xAD, 0xE5, + 0x92, 0x8C, 0x47, 0x72, 0x61, 0x64, 0xE2, 0x88, + 0x95, 0x73, 0x47, 0xE3, 0x80, 0x94, 0x53, 0xE3, + 0x80, 0x95, 0x48, 0x28, 0xE1, 0x84, 0x80, 0xE1, + 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x82, + 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, + 0x83, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, + // Bytes 2740 - 277f + 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, + 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x29, 0x48, + 0x28, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x29, + 0x48, 0x28, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, + 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8B, 0xE1, 0x85, + 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8C, 0xE1, + 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x8C, + 0xE1, 0x85, 0xAE, 0x29, 0x48, 0x28, 0xE1, 0x84, + // Bytes 2780 - 27bf + 0x8E, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, + 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, + 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, 0x29, 0x48, + 0x28, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x29, + 0x48, 0x28, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, + 0x29, 0x48, 0x72, 0x61, 0x64, 0xE2, 0x88, 0x95, + 0x73, 0x32, 0x48, 0xD8, 0xA7, 0xD9, 0x83, 0xD8, + 0xA8, 0xD8, 0xB1, 0x48, 0xD8, 0xA7, 0xD9, 0x84, + // Bytes 27c0 - 27ff + 0xD9, 0x84, 0xD9, 0x87, 0x48, 0xD8, 0xB1, 0xD8, + 0xB3, 0xD9, 0x88, 0xD9, 0x84, 0x48, 0xD8, 0xB1, + 0xDB, 0x8C, 0xD8, 0xA7, 0xD9, 0x84, 0x48, 0xD8, + 0xB5, 0xD9, 0x84, 0xD8, 0xB9, 0xD9, 0x85, 0x48, + 0xD8, 0xB9, 0xD9, 0x84, 0xD9, 0x8A, 0xD9, 0x87, + 0x48, 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0xD8, + 0xAF, 0x48, 0xD9, 0x88, 0xD8, 0xB3, 0xD9, 0x84, + 0xD9, 0x85, 0x49, 0xE2, 0x80, 0xB2, 0xE2, 0x80, + // Bytes 2800 - 283f + 0xB2, 0xE2, 0x80, 0xB2, 0x49, 0xE2, 0x80, 0xB5, + 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x49, 0xE2, + 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, + 0x49, 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0xE2, + 0x88, 0xAE, 0x49, 0xE3, 0x80, 0x94, 0xE4, 0xB8, + 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, + 0xE4, 0xBA, 0x8C, 0xE3, 0x80, 0x95, 0x49, 0xE3, + 0x80, 0x94, 0xE5, 0x8B, 0x9D, 0xE3, 0x80, 0x95, + // Bytes 2840 - 287f + 0x49, 0xE3, 0x80, 0x94, 0xE5, 0xAE, 0x89, 0xE3, + 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x89, + 0x93, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, + 0xE6, 0x95, 0x97, 0xE3, 0x80, 0x95, 0x49, 0xE3, + 0x80, 0x94, 0xE6, 0x9C, 0xAC, 0xE3, 0x80, 0x95, + 0x49, 0xE3, 0x80, 0x94, 0xE7, 0x82, 0xB9, 0xE3, + 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE7, 0x9B, + 0x97, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x82, 0xA2, + // Bytes 2880 - 28bf + 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x49, 0xE3, + 0x82, 0xA4, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, + 0x49, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0xA9, 0xE3, + 0x83, 0xB3, 0x49, 0xE3, 0x82, 0xAA, 0xE3, 0x83, + 0xB3, 0xE3, 0x82, 0xB9, 0x49, 0xE3, 0x82, 0xAA, + 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xA0, 0x49, 0xE3, + 0x82, 0xAB, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xAA, + 0x49, 0xE3, 0x82, 0xB1, 0xE3, 0x83, 0xBC, 0xE3, + // Bytes 28c0 - 28ff + 0x82, 0xB9, 0x49, 0xE3, 0x82, 0xB3, 0xE3, 0x83, + 0xAB, 0xE3, 0x83, 0x8A, 0x49, 0xE3, 0x82, 0xBB, + 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0x49, 0xE3, + 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, + 0x49, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0xE3, + 0x82, 0xB7, 0x49, 0xE3, 0x83, 0x88, 0xE3, 0x82, + 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x8E, + 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x49, 0xE3, + // Bytes 2900 - 293f + 0x83, 0x8F, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x84, + 0x49, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, 0xE3, + 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x92, 0xE3, 0x82, + 0x9A, 0xE3, 0x82, 0xB3, 0x49, 0xE3, 0x83, 0x95, + 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3, + 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xBD, + 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x83, 0xAB, 0xE3, + 0x83, 0x84, 0x49, 0xE3, 0x83, 0x9B, 0xE3, 0x83, + // Bytes 2940 - 297f + 0xBC, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9B, + 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xB3, 0x49, 0xE3, + 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xAB, + 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x83, 0x83, 0xE3, + 0x83, 0x8F, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x83, + 0xAB, 0xE3, 0x82, 0xAF, 0x49, 0xE3, 0x83, 0xA4, + 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x49, 0xE3, + 0x83, 0xA6, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xB3, + // Bytes 2980 - 29bf + 0x49, 0xE3, 0x83, 0xAF, 0xE3, 0x83, 0x83, 0xE3, + 0x83, 0x88, 0x4C, 0xE2, 0x80, 0xB2, 0xE2, 0x80, + 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0x4C, + 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, + 0xAB, 0xE2, 0x88, 0xAB, 0x4C, 0xE3, 0x82, 0xA2, + 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x95, 0xE3, 0x82, + 0xA1, 0x4C, 0xE3, 0x82, 0xA8, 0xE3, 0x83, 0xBC, + 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xBC, 0x4C, 0xE3, + // Bytes 29c0 - 29ff + 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAD, + 0xE3, 0x83, 0xB3, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x9E, + 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xA9, 0xE3, + 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x82, + 0xAB, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAA, 0xE3, + 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, + 0x99, 0xE3, 0x83, 0x8B, 0xE3, 0x83, 0xBC, 0x4C, + // Bytes 2a00 - 2a3f + 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xA5, 0xE3, 0x83, + 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAF, + 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9, 0xE3, 0x83, + 0xA0, 0x4C, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, + 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x8D, 0x4C, 0xE3, + 0x82, 0xB5, 0xE3, 0x82, 0xA4, 0xE3, 0x82, 0xAF, + 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x82, 0xBF, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB9, + // Bytes 2a40 - 2a7f + 0x4C, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, + 0x83, 0xBC, 0xE3, 0x83, 0x84, 0x4C, 0xE3, 0x83, + 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xAF, 0xE3, + 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0x95, 0xE3, 0x82, + 0xA3, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0x4C, + 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, 0xE3, 0x83, + 0xBC, 0xE3, 0x82, 0xBF, 0x4C, 0xE3, 0x83, 0x98, + 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0x8B, 0xE3, 0x83, + // Bytes 2a80 - 2abf + 0x92, 0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, + 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9, 0x4C, 0xE3, + 0x83, 0x9B, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, + 0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x9E, 0xE3, + 0x82, 0xA4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, + 0x4C, 0xE3, 0x83, 0x9F, 0xE3, 0x82, 0xAF, 0xE3, + 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C, 0xE3, 0x83, + 0xA1, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3, + // Bytes 2ac0 - 2aff + 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAA, 0xE3, 0x83, + 0x83, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, + 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x92, 0xE3, 0x82, + 0x9A, 0xE3, 0x83, 0xBC, 0x4C, 0xE6, 0xA0, 0xAA, + 0xE5, 0xBC, 0x8F, 0xE4, 0xBC, 0x9A, 0xE7, 0xA4, + 0xBE, 0x4E, 0x28, 0xE1, 0x84, 0x8B, 0xE1, 0x85, + 0xA9, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xAE, 0x29, + 0x4F, 0xD8, 0xAC, 0xD9, 0x84, 0x20, 0xD8, 0xAC, + // Bytes 2b00 - 2b3f + 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x87, + 0x4F, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0x8F, 0xE3, + 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, + 0x4F, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xB3, 0xE3, + 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA2, + 0x4F, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, + 0x83, 0xAF, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, + 0x4F, 0xE3, 0x82, 0xB5, 0xE3, 0x83, 0xB3, 0xE3, + // Bytes 2b40 - 2b7f + 0x83, 0x81, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xA0, + 0x4F, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0xE3, + 0x83, 0xBC, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xAB, + 0x4F, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0xAF, 0xE3, + 0x82, 0xBF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, + 0x4F, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, + 0x82, 0xA4, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, + 0x4F, 0xE3, 0x83, 0x9E, 0xE3, 0x83, 0xB3, 0xE3, + // Bytes 2b80 - 2bbf + 0x82, 0xB7, 0xE3, 0x83, 0xA7, 0xE3, 0x83, 0xB3, + 0x4F, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, + 0x4F, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0xBC, 0xE3, + 0x83, 0x95, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, + 0x51, 0x28, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA9, + 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA5, 0xE1, 0x86, + 0xAB, 0x29, 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x82, + // Bytes 2bc0 - 2bff + 0x99, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xBF, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xBC, 0x52, 0xE3, 0x82, + 0xAD, 0xE3, 0x83, 0xAD, 0xE3, 0x82, 0xAF, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0xA0, + 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, + 0x83, 0xA1, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, + 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x82, 0xAF, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0xA0, + // Bytes 2c00 - 2c3f + 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x52, 0xE3, + 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xBB, + 0xE3, 0x82, 0x99, 0xE3, 0x82, 0xA4, 0xE3, 0x83, + 0xAD, 0x52, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, + 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBB, 0xE3, 0x83, + 0xB3, 0xE3, 0x83, 0x88, 0x52, 0xE3, 0x83, 0x92, + 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA2, 0xE3, 0x82, + 0xB9, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x52, + // Bytes 2c40 - 2c7f + 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, 0xE3, 0x83, + 0x83, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0xA7, 0xE3, + 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x9F, 0xE3, 0x83, + 0xAA, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0xE3, + 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, + 0xAC, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0xE3, + 0x82, 0xB1, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xB3, + 0x61, 0xD8, 0xB5, 0xD9, 0x84, 0xD9, 0x89, 0x20, + // Bytes 2c80 - 2cbf + 0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87, + 0x20, 0xD8, 0xB9, 0xD9, 0x84, 0xD9, 0x8A, 0xD9, + 0x87, 0x20, 0xD9, 0x88, 0xD8, 0xB3, 0xD9, 0x84, + 0xD9, 0x85, 0x06, 0xE0, 0xA7, 0x87, 0xE0, 0xA6, + 0xBE, 0x01, 0x06, 0xE0, 0xA7, 0x87, 0xE0, 0xA7, + 0x97, 0x01, 0x06, 0xE0, 0xAD, 0x87, 0xE0, 0xAC, + 0xBE, 0x01, 0x06, 0xE0, 0xAD, 0x87, 0xE0, 0xAD, + 0x96, 0x01, 0x06, 0xE0, 0xAD, 0x87, 0xE0, 0xAD, + // Bytes 2cc0 - 2cff + 0x97, 0x01, 0x06, 0xE0, 0xAE, 0x92, 0xE0, 0xAF, + 0x97, 0x01, 0x06, 0xE0, 0xAF, 0x86, 0xE0, 0xAE, + 0xBE, 0x01, 0x06, 0xE0, 0xAF, 0x86, 0xE0, 0xAF, + 0x97, 0x01, 0x06, 0xE0, 0xAF, 0x87, 0xE0, 0xAE, + 0xBE, 0x01, 0x06, 0xE0, 0xB2, 0xBF, 0xE0, 0xB3, + 0x95, 0x01, 0x06, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, + 0x95, 0x01, 0x06, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, + 0x96, 0x01, 0x06, 0xE0, 0xB5, 0x86, 0xE0, 0xB4, + // Bytes 2d00 - 2d3f + 0xBE, 0x01, 0x06, 0xE0, 0xB5, 0x86, 0xE0, 0xB5, + 0x97, 0x01, 0x06, 0xE0, 0xB5, 0x87, 0xE0, 0xB4, + 0xBE, 0x01, 0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, + 0x9F, 0x01, 0x06, 0xE1, 0x80, 0xA5, 0xE1, 0x80, + 0xAE, 0x01, 0x06, 0xE1, 0xAC, 0x85, 0xE1, 0xAC, + 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0x87, 0xE1, 0xAC, + 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0x89, 0xE1, 0xAC, + 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0x8B, 0xE1, 0xAC, + // Bytes 2d40 - 2d7f + 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0x8D, 0xE1, 0xAC, + 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0x91, 0xE1, 0xAC, + 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0xBA, 0xE1, 0xAC, + 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0xBC, 0xE1, 0xAC, + 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0xBE, 0xE1, 0xAC, + 0xB5, 0x01, 0x06, 0xE1, 0xAC, 0xBF, 0xE1, 0xAC, + 0xB5, 0x01, 0x06, 0xE1, 0xAD, 0x82, 0xE1, 0xAC, + 0xB5, 0x01, 0x08, 0xF0, 0x91, 0x84, 0xB1, 0xF0, + // Bytes 2d80 - 2dbf + 0x91, 0x84, 0xA7, 0x01, 0x08, 0xF0, 0x91, 0x84, + 0xB2, 0xF0, 0x91, 0x84, 0xA7, 0x01, 0x08, 0xF0, + 0x91, 0x8D, 0x87, 0xF0, 0x91, 0x8C, 0xBE, 0x01, + 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0, 0x91, 0x8D, + 0x97, 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, + 0x91, 0x92, 0xB0, 0x01, 0x08, 0xF0, 0x91, 0x92, + 0xB9, 0xF0, 0x91, 0x92, 0xBA, 0x01, 0x08, 0xF0, + 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xBD, 0x01, + // Bytes 2dc0 - 2dff + 0x08, 0xF0, 0x91, 0x96, 0xB8, 0xF0, 0x91, 0x96, + 0xAF, 0x01, 0x08, 0xF0, 0x91, 0x96, 0xB9, 0xF0, + 0x91, 0x96, 0xAF, 0x01, 0x09, 0xE0, 0xB3, 0x86, + 0xE0, 0xB3, 0x82, 0xE0, 0xB3, 0x95, 0x02, 0x09, + 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F, 0xE0, 0xB7, + 0x8A, 0x12, 0x44, 0x44, 0x5A, 0xCC, 0x8C, 0xC9, + 0x44, 0x44, 0x7A, 0xCC, 0x8C, 0xC9, 0x44, 0x64, + 0x7A, 0xCC, 0x8C, 0xC9, 0x46, 0xD9, 0x84, 0xD8, + // Bytes 2e00 - 2e3f + 0xA7, 0xD9, 0x93, 0xC9, 0x46, 0xD9, 0x84, 0xD8, + 0xA7, 0xD9, 0x94, 0xC9, 0x46, 0xD9, 0x84, 0xD8, + 0xA7, 0xD9, 0x95, 0xB5, 0x46, 0xE1, 0x84, 0x80, + 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x82, + 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x83, + 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x85, + 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x86, + 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x87, + // Bytes 2e40 - 2e7f + 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x89, + 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x8B, + 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x8B, + 0xE1, 0x85, 0xAE, 0x01, 0x46, 0xE1, 0x84, 0x8C, + 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x8E, + 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x8F, + 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x90, + 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x91, + // Bytes 2e80 - 2ebf + 0xE1, 0x85, 0xA1, 0x01, 0x46, 0xE1, 0x84, 0x92, + 0xE1, 0x85, 0xA1, 0x01, 0x49, 0xE3, 0x83, 0xA1, + 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, 0x4C, + 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0xE1, 0x84, + 0x8B, 0xE1, 0x85, 0xB4, 0x01, 0x4C, 0xE3, 0x82, + 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x82, 0xAB, 0xE3, + 0x82, 0x99, 0x0D, 0x4C, 0xE3, 0x82, 0xB3, 0xE3, + 0x83, 0xBC, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, + // Bytes 2ec0 - 2eff + 0x0D, 0x4C, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, 0x4F, + 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0xE1, 0x86, + 0xB7, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA9, 0x01, + 0x4F, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x8B, 0xE3, + 0x83, 0xB3, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, + 0x0D, 0x4F, 0xE3, 0x82, 0xB7, 0xE3, 0x83, 0xAA, + 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xAF, 0xE3, 0x82, + // Bytes 2f00 - 2f3f + 0x99, 0x0D, 0x4F, 0xE3, 0x83, 0x98, 0xE3, 0x82, + 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB7, 0xE3, + 0x82, 0x99, 0x0D, 0x4F, 0xE3, 0x83, 0x9B, 0xE3, + 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, + 0xE3, 0x82, 0x99, 0x0D, 0x52, 0xE3, 0x82, 0xA8, + 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0xAF, 0xE3, 0x83, + 0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D, + 0x52, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0xA1, 0xE3, + // Bytes 2f40 - 2f7f + 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, + 0xE3, 0x82, 0x99, 0x0D, 0x86, 0xE0, 0xB3, 0x86, + 0xE0, 0xB3, 0x82, 0x01, 0x86, 0xE0, 0xB7, 0x99, + 0xE0, 0xB7, 0x8F, 0x01, 0x03, 0x3C, 0xCC, 0xB8, + 0x05, 0x03, 0x3D, 0xCC, 0xB8, 0x05, 0x03, 0x3E, + 0xCC, 0xB8, 0x05, 0x03, 0x41, 0xCC, 0x80, 0xC9, + 0x03, 0x41, 0xCC, 0x81, 0xC9, 0x03, 0x41, 0xCC, + 0x83, 0xC9, 0x03, 0x41, 0xCC, 0x84, 0xC9, 0x03, + // Bytes 2f80 - 2fbf + 0x41, 0xCC, 0x89, 0xC9, 0x03, 0x41, 0xCC, 0x8C, + 0xC9, 0x03, 0x41, 0xCC, 0x8F, 0xC9, 0x03, 0x41, + 0xCC, 0x91, 0xC9, 0x03, 0x41, 0xCC, 0xA5, 0xB5, + 0x03, 0x41, 0xCC, 0xA8, 0xA5, 0x03, 0x42, 0xCC, + 0x87, 0xC9, 0x03, 0x42, 0xCC, 0xA3, 0xB5, 0x03, + 0x42, 0xCC, 0xB1, 0xB5, 0x03, 0x43, 0xCC, 0x81, + 0xC9, 0x03, 0x43, 0xCC, 0x82, 0xC9, 0x03, 0x43, + 0xCC, 0x87, 0xC9, 0x03, 0x43, 0xCC, 0x8C, 0xC9, + // Bytes 2fc0 - 2fff + 0x03, 0x44, 0xCC, 0x87, 0xC9, 0x03, 0x44, 0xCC, + 0x8C, 0xC9, 0x03, 0x44, 0xCC, 0xA3, 0xB5, 0x03, + 0x44, 0xCC, 0xA7, 0xA5, 0x03, 0x44, 0xCC, 0xAD, + 0xB5, 0x03, 0x44, 0xCC, 0xB1, 0xB5, 0x03, 0x45, + 0xCC, 0x80, 0xC9, 0x03, 0x45, 0xCC, 0x81, 0xC9, + 0x03, 0x45, 0xCC, 0x83, 0xC9, 0x03, 0x45, 0xCC, + 0x86, 0xC9, 0x03, 0x45, 0xCC, 0x87, 0xC9, 0x03, + 0x45, 0xCC, 0x88, 0xC9, 0x03, 0x45, 0xCC, 0x89, + // Bytes 3000 - 303f + 0xC9, 0x03, 0x45, 0xCC, 0x8C, 0xC9, 0x03, 0x45, + 0xCC, 0x8F, 0xC9, 0x03, 0x45, 0xCC, 0x91, 0xC9, + 0x03, 0x45, 0xCC, 0xA8, 0xA5, 0x03, 0x45, 0xCC, + 0xAD, 0xB5, 0x03, 0x45, 0xCC, 0xB0, 0xB5, 0x03, + 0x46, 0xCC, 0x87, 0xC9, 0x03, 0x47, 0xCC, 0x81, + 0xC9, 0x03, 0x47, 0xCC, 0x82, 0xC9, 0x03, 0x47, + 0xCC, 0x84, 0xC9, 0x03, 0x47, 0xCC, 0x86, 0xC9, + 0x03, 0x47, 0xCC, 0x87, 0xC9, 0x03, 0x47, 0xCC, + // Bytes 3040 - 307f + 0x8C, 0xC9, 0x03, 0x47, 0xCC, 0xA7, 0xA5, 0x03, + 0x48, 0xCC, 0x82, 0xC9, 0x03, 0x48, 0xCC, 0x87, + 0xC9, 0x03, 0x48, 0xCC, 0x88, 0xC9, 0x03, 0x48, + 0xCC, 0x8C, 0xC9, 0x03, 0x48, 0xCC, 0xA3, 0xB5, + 0x03, 0x48, 0xCC, 0xA7, 0xA5, 0x03, 0x48, 0xCC, + 0xAE, 0xB5, 0x03, 0x49, 0xCC, 0x80, 0xC9, 0x03, + 0x49, 0xCC, 0x81, 0xC9, 0x03, 0x49, 0xCC, 0x82, + 0xC9, 0x03, 0x49, 0xCC, 0x83, 0xC9, 0x03, 0x49, + // Bytes 3080 - 30bf + 0xCC, 0x84, 0xC9, 0x03, 0x49, 0xCC, 0x86, 0xC9, + 0x03, 0x49, 0xCC, 0x87, 0xC9, 0x03, 0x49, 0xCC, + 0x89, 0xC9, 0x03, 0x49, 0xCC, 0x8C, 0xC9, 0x03, + 0x49, 0xCC, 0x8F, 0xC9, 0x03, 0x49, 0xCC, 0x91, + 0xC9, 0x03, 0x49, 0xCC, 0xA3, 0xB5, 0x03, 0x49, + 0xCC, 0xA8, 0xA5, 0x03, 0x49, 0xCC, 0xB0, 0xB5, + 0x03, 0x4A, 0xCC, 0x82, 0xC9, 0x03, 0x4B, 0xCC, + 0x81, 0xC9, 0x03, 0x4B, 0xCC, 0x8C, 0xC9, 0x03, + // Bytes 30c0 - 30ff + 0x4B, 0xCC, 0xA3, 0xB5, 0x03, 0x4B, 0xCC, 0xA7, + 0xA5, 0x03, 0x4B, 0xCC, 0xB1, 0xB5, 0x03, 0x4C, + 0xCC, 0x81, 0xC9, 0x03, 0x4C, 0xCC, 0x8C, 0xC9, + 0x03, 0x4C, 0xCC, 0xA7, 0xA5, 0x03, 0x4C, 0xCC, + 0xAD, 0xB5, 0x03, 0x4C, 0xCC, 0xB1, 0xB5, 0x03, + 0x4D, 0xCC, 0x81, 0xC9, 0x03, 0x4D, 0xCC, 0x87, + 0xC9, 0x03, 0x4D, 0xCC, 0xA3, 0xB5, 0x03, 0x4E, + 0xCC, 0x80, 0xC9, 0x03, 0x4E, 0xCC, 0x81, 0xC9, + // Bytes 3100 - 313f + 0x03, 0x4E, 0xCC, 0x83, 0xC9, 0x03, 0x4E, 0xCC, + 0x87, 0xC9, 0x03, 0x4E, 0xCC, 0x8C, 0xC9, 0x03, + 0x4E, 0xCC, 0xA3, 0xB5, 0x03, 0x4E, 0xCC, 0xA7, + 0xA5, 0x03, 0x4E, 0xCC, 0xAD, 0xB5, 0x03, 0x4E, + 0xCC, 0xB1, 0xB5, 0x03, 0x4F, 0xCC, 0x80, 0xC9, + 0x03, 0x4F, 0xCC, 0x81, 0xC9, 0x03, 0x4F, 0xCC, + 0x86, 0xC9, 0x03, 0x4F, 0xCC, 0x89, 0xC9, 0x03, + 0x4F, 0xCC, 0x8B, 0xC9, 0x03, 0x4F, 0xCC, 0x8C, + // Bytes 3140 - 317f + 0xC9, 0x03, 0x4F, 0xCC, 0x8F, 0xC9, 0x03, 0x4F, + 0xCC, 0x91, 0xC9, 0x03, 0x50, 0xCC, 0x81, 0xC9, + 0x03, 0x50, 0xCC, 0x87, 0xC9, 0x03, 0x52, 0xCC, + 0x81, 0xC9, 0x03, 0x52, 0xCC, 0x87, 0xC9, 0x03, + 0x52, 0xCC, 0x8C, 0xC9, 0x03, 0x52, 0xCC, 0x8F, + 0xC9, 0x03, 0x52, 0xCC, 0x91, 0xC9, 0x03, 0x52, + 0xCC, 0xA7, 0xA5, 0x03, 0x52, 0xCC, 0xB1, 0xB5, + 0x03, 0x53, 0xCC, 0x82, 0xC9, 0x03, 0x53, 0xCC, + // Bytes 3180 - 31bf + 0x87, 0xC9, 0x03, 0x53, 0xCC, 0xA6, 0xB5, 0x03, + 0x53, 0xCC, 0xA7, 0xA5, 0x03, 0x54, 0xCC, 0x87, + 0xC9, 0x03, 0x54, 0xCC, 0x8C, 0xC9, 0x03, 0x54, + 0xCC, 0xA3, 0xB5, 0x03, 0x54, 0xCC, 0xA6, 0xB5, + 0x03, 0x54, 0xCC, 0xA7, 0xA5, 0x03, 0x54, 0xCC, + 0xAD, 0xB5, 0x03, 0x54, 0xCC, 0xB1, 0xB5, 0x03, + 0x55, 0xCC, 0x80, 0xC9, 0x03, 0x55, 0xCC, 0x81, + 0xC9, 0x03, 0x55, 0xCC, 0x82, 0xC9, 0x03, 0x55, + // Bytes 31c0 - 31ff + 0xCC, 0x86, 0xC9, 0x03, 0x55, 0xCC, 0x89, 0xC9, + 0x03, 0x55, 0xCC, 0x8A, 0xC9, 0x03, 0x55, 0xCC, + 0x8B, 0xC9, 0x03, 0x55, 0xCC, 0x8C, 0xC9, 0x03, + 0x55, 0xCC, 0x8F, 0xC9, 0x03, 0x55, 0xCC, 0x91, + 0xC9, 0x03, 0x55, 0xCC, 0xA3, 0xB5, 0x03, 0x55, + 0xCC, 0xA4, 0xB5, 0x03, 0x55, 0xCC, 0xA8, 0xA5, + 0x03, 0x55, 0xCC, 0xAD, 0xB5, 0x03, 0x55, 0xCC, + 0xB0, 0xB5, 0x03, 0x56, 0xCC, 0x83, 0xC9, 0x03, + // Bytes 3200 - 323f + 0x56, 0xCC, 0xA3, 0xB5, 0x03, 0x57, 0xCC, 0x80, + 0xC9, 0x03, 0x57, 0xCC, 0x81, 0xC9, 0x03, 0x57, + 0xCC, 0x82, 0xC9, 0x03, 0x57, 0xCC, 0x87, 0xC9, + 0x03, 0x57, 0xCC, 0x88, 0xC9, 0x03, 0x57, 0xCC, + 0xA3, 0xB5, 0x03, 0x58, 0xCC, 0x87, 0xC9, 0x03, + 0x58, 0xCC, 0x88, 0xC9, 0x03, 0x59, 0xCC, 0x80, + 0xC9, 0x03, 0x59, 0xCC, 0x81, 0xC9, 0x03, 0x59, + 0xCC, 0x82, 0xC9, 0x03, 0x59, 0xCC, 0x83, 0xC9, + // Bytes 3240 - 327f + 0x03, 0x59, 0xCC, 0x84, 0xC9, 0x03, 0x59, 0xCC, + 0x87, 0xC9, 0x03, 0x59, 0xCC, 0x88, 0xC9, 0x03, + 0x59, 0xCC, 0x89, 0xC9, 0x03, 0x59, 0xCC, 0xA3, + 0xB5, 0x03, 0x5A, 0xCC, 0x81, 0xC9, 0x03, 0x5A, + 0xCC, 0x82, 0xC9, 0x03, 0x5A, 0xCC, 0x87, 0xC9, + 0x03, 0x5A, 0xCC, 0x8C, 0xC9, 0x03, 0x5A, 0xCC, + 0xA3, 0xB5, 0x03, 0x5A, 0xCC, 0xB1, 0xB5, 0x03, + 0x61, 0xCC, 0x80, 0xC9, 0x03, 0x61, 0xCC, 0x81, + // Bytes 3280 - 32bf + 0xC9, 0x03, 0x61, 0xCC, 0x83, 0xC9, 0x03, 0x61, + 0xCC, 0x84, 0xC9, 0x03, 0x61, 0xCC, 0x89, 0xC9, + 0x03, 0x61, 0xCC, 0x8C, 0xC9, 0x03, 0x61, 0xCC, + 0x8F, 0xC9, 0x03, 0x61, 0xCC, 0x91, 0xC9, 0x03, + 0x61, 0xCC, 0xA5, 0xB5, 0x03, 0x61, 0xCC, 0xA8, + 0xA5, 0x03, 0x62, 0xCC, 0x87, 0xC9, 0x03, 0x62, + 0xCC, 0xA3, 0xB5, 0x03, 0x62, 0xCC, 0xB1, 0xB5, + 0x03, 0x63, 0xCC, 0x81, 0xC9, 0x03, 0x63, 0xCC, + // Bytes 32c0 - 32ff + 0x82, 0xC9, 0x03, 0x63, 0xCC, 0x87, 0xC9, 0x03, + 0x63, 0xCC, 0x8C, 0xC9, 0x03, 0x64, 0xCC, 0x87, + 0xC9, 0x03, 0x64, 0xCC, 0x8C, 0xC9, 0x03, 0x64, + 0xCC, 0xA3, 0xB5, 0x03, 0x64, 0xCC, 0xA7, 0xA5, + 0x03, 0x64, 0xCC, 0xAD, 0xB5, 0x03, 0x64, 0xCC, + 0xB1, 0xB5, 0x03, 0x65, 0xCC, 0x80, 0xC9, 0x03, + 0x65, 0xCC, 0x81, 0xC9, 0x03, 0x65, 0xCC, 0x83, + 0xC9, 0x03, 0x65, 0xCC, 0x86, 0xC9, 0x03, 0x65, + // Bytes 3300 - 333f + 0xCC, 0x87, 0xC9, 0x03, 0x65, 0xCC, 0x88, 0xC9, + 0x03, 0x65, 0xCC, 0x89, 0xC9, 0x03, 0x65, 0xCC, + 0x8C, 0xC9, 0x03, 0x65, 0xCC, 0x8F, 0xC9, 0x03, + 0x65, 0xCC, 0x91, 0xC9, 0x03, 0x65, 0xCC, 0xA8, + 0xA5, 0x03, 0x65, 0xCC, 0xAD, 0xB5, 0x03, 0x65, + 0xCC, 0xB0, 0xB5, 0x03, 0x66, 0xCC, 0x87, 0xC9, + 0x03, 0x67, 0xCC, 0x81, 0xC9, 0x03, 0x67, 0xCC, + 0x82, 0xC9, 0x03, 0x67, 0xCC, 0x84, 0xC9, 0x03, + // Bytes 3340 - 337f + 0x67, 0xCC, 0x86, 0xC9, 0x03, 0x67, 0xCC, 0x87, + 0xC9, 0x03, 0x67, 0xCC, 0x8C, 0xC9, 0x03, 0x67, + 0xCC, 0xA7, 0xA5, 0x03, 0x68, 0xCC, 0x82, 0xC9, + 0x03, 0x68, 0xCC, 0x87, 0xC9, 0x03, 0x68, 0xCC, + 0x88, 0xC9, 0x03, 0x68, 0xCC, 0x8C, 0xC9, 0x03, + 0x68, 0xCC, 0xA3, 0xB5, 0x03, 0x68, 0xCC, 0xA7, + 0xA5, 0x03, 0x68, 0xCC, 0xAE, 0xB5, 0x03, 0x68, + 0xCC, 0xB1, 0xB5, 0x03, 0x69, 0xCC, 0x80, 0xC9, + // Bytes 3380 - 33bf + 0x03, 0x69, 0xCC, 0x81, 0xC9, 0x03, 0x69, 0xCC, + 0x82, 0xC9, 0x03, 0x69, 0xCC, 0x83, 0xC9, 0x03, + 0x69, 0xCC, 0x84, 0xC9, 0x03, 0x69, 0xCC, 0x86, + 0xC9, 0x03, 0x69, 0xCC, 0x89, 0xC9, 0x03, 0x69, + 0xCC, 0x8C, 0xC9, 0x03, 0x69, 0xCC, 0x8F, 0xC9, + 0x03, 0x69, 0xCC, 0x91, 0xC9, 0x03, 0x69, 0xCC, + 0xA3, 0xB5, 0x03, 0x69, 0xCC, 0xA8, 0xA5, 0x03, + 0x69, 0xCC, 0xB0, 0xB5, 0x03, 0x6A, 0xCC, 0x82, + // Bytes 33c0 - 33ff + 0xC9, 0x03, 0x6A, 0xCC, 0x8C, 0xC9, 0x03, 0x6B, + 0xCC, 0x81, 0xC9, 0x03, 0x6B, 0xCC, 0x8C, 0xC9, + 0x03, 0x6B, 0xCC, 0xA3, 0xB5, 0x03, 0x6B, 0xCC, + 0xA7, 0xA5, 0x03, 0x6B, 0xCC, 0xB1, 0xB5, 0x03, + 0x6C, 0xCC, 0x81, 0xC9, 0x03, 0x6C, 0xCC, 0x8C, + 0xC9, 0x03, 0x6C, 0xCC, 0xA7, 0xA5, 0x03, 0x6C, + 0xCC, 0xAD, 0xB5, 0x03, 0x6C, 0xCC, 0xB1, 0xB5, + 0x03, 0x6D, 0xCC, 0x81, 0xC9, 0x03, 0x6D, 0xCC, + // Bytes 3400 - 343f + 0x87, 0xC9, 0x03, 0x6D, 0xCC, 0xA3, 0xB5, 0x03, + 0x6E, 0xCC, 0x80, 0xC9, 0x03, 0x6E, 0xCC, 0x81, + 0xC9, 0x03, 0x6E, 0xCC, 0x83, 0xC9, 0x03, 0x6E, + 0xCC, 0x87, 0xC9, 0x03, 0x6E, 0xCC, 0x8C, 0xC9, + 0x03, 0x6E, 0xCC, 0xA3, 0xB5, 0x03, 0x6E, 0xCC, + 0xA7, 0xA5, 0x03, 0x6E, 0xCC, 0xAD, 0xB5, 0x03, + 0x6E, 0xCC, 0xB1, 0xB5, 0x03, 0x6F, 0xCC, 0x80, + 0xC9, 0x03, 0x6F, 0xCC, 0x81, 0xC9, 0x03, 0x6F, + // Bytes 3440 - 347f + 0xCC, 0x86, 0xC9, 0x03, 0x6F, 0xCC, 0x89, 0xC9, + 0x03, 0x6F, 0xCC, 0x8B, 0xC9, 0x03, 0x6F, 0xCC, + 0x8C, 0xC9, 0x03, 0x6F, 0xCC, 0x8F, 0xC9, 0x03, + 0x6F, 0xCC, 0x91, 0xC9, 0x03, 0x70, 0xCC, 0x81, + 0xC9, 0x03, 0x70, 0xCC, 0x87, 0xC9, 0x03, 0x72, + 0xCC, 0x81, 0xC9, 0x03, 0x72, 0xCC, 0x87, 0xC9, + 0x03, 0x72, 0xCC, 0x8C, 0xC9, 0x03, 0x72, 0xCC, + 0x8F, 0xC9, 0x03, 0x72, 0xCC, 0x91, 0xC9, 0x03, + // Bytes 3480 - 34bf + 0x72, 0xCC, 0xA7, 0xA5, 0x03, 0x72, 0xCC, 0xB1, + 0xB5, 0x03, 0x73, 0xCC, 0x82, 0xC9, 0x03, 0x73, + 0xCC, 0x87, 0xC9, 0x03, 0x73, 0xCC, 0xA6, 0xB5, + 0x03, 0x73, 0xCC, 0xA7, 0xA5, 0x03, 0x74, 0xCC, + 0x87, 0xC9, 0x03, 0x74, 0xCC, 0x88, 0xC9, 0x03, + 0x74, 0xCC, 0x8C, 0xC9, 0x03, 0x74, 0xCC, 0xA3, + 0xB5, 0x03, 0x74, 0xCC, 0xA6, 0xB5, 0x03, 0x74, + 0xCC, 0xA7, 0xA5, 0x03, 0x74, 0xCC, 0xAD, 0xB5, + // Bytes 34c0 - 34ff + 0x03, 0x74, 0xCC, 0xB1, 0xB5, 0x03, 0x75, 0xCC, + 0x80, 0xC9, 0x03, 0x75, 0xCC, 0x81, 0xC9, 0x03, + 0x75, 0xCC, 0x82, 0xC9, 0x03, 0x75, 0xCC, 0x86, + 0xC9, 0x03, 0x75, 0xCC, 0x89, 0xC9, 0x03, 0x75, + 0xCC, 0x8A, 0xC9, 0x03, 0x75, 0xCC, 0x8B, 0xC9, + 0x03, 0x75, 0xCC, 0x8C, 0xC9, 0x03, 0x75, 0xCC, + 0x8F, 0xC9, 0x03, 0x75, 0xCC, 0x91, 0xC9, 0x03, + 0x75, 0xCC, 0xA3, 0xB5, 0x03, 0x75, 0xCC, 0xA4, + // Bytes 3500 - 353f + 0xB5, 0x03, 0x75, 0xCC, 0xA8, 0xA5, 0x03, 0x75, + 0xCC, 0xAD, 0xB5, 0x03, 0x75, 0xCC, 0xB0, 0xB5, + 0x03, 0x76, 0xCC, 0x83, 0xC9, 0x03, 0x76, 0xCC, + 0xA3, 0xB5, 0x03, 0x77, 0xCC, 0x80, 0xC9, 0x03, + 0x77, 0xCC, 0x81, 0xC9, 0x03, 0x77, 0xCC, 0x82, + 0xC9, 0x03, 0x77, 0xCC, 0x87, 0xC9, 0x03, 0x77, + 0xCC, 0x88, 0xC9, 0x03, 0x77, 0xCC, 0x8A, 0xC9, + 0x03, 0x77, 0xCC, 0xA3, 0xB5, 0x03, 0x78, 0xCC, + // Bytes 3540 - 357f + 0x87, 0xC9, 0x03, 0x78, 0xCC, 0x88, 0xC9, 0x03, + 0x79, 0xCC, 0x80, 0xC9, 0x03, 0x79, 0xCC, 0x81, + 0xC9, 0x03, 0x79, 0xCC, 0x82, 0xC9, 0x03, 0x79, + 0xCC, 0x83, 0xC9, 0x03, 0x79, 0xCC, 0x84, 0xC9, + 0x03, 0x79, 0xCC, 0x87, 0xC9, 0x03, 0x79, 0xCC, + 0x88, 0xC9, 0x03, 0x79, 0xCC, 0x89, 0xC9, 0x03, + 0x79, 0xCC, 0x8A, 0xC9, 0x03, 0x79, 0xCC, 0xA3, + 0xB5, 0x03, 0x7A, 0xCC, 0x81, 0xC9, 0x03, 0x7A, + // Bytes 3580 - 35bf + 0xCC, 0x82, 0xC9, 0x03, 0x7A, 0xCC, 0x87, 0xC9, + 0x03, 0x7A, 0xCC, 0x8C, 0xC9, 0x03, 0x7A, 0xCC, + 0xA3, 0xB5, 0x03, 0x7A, 0xCC, 0xB1, 0xB5, 0x04, + 0xC2, 0xA8, 0xCC, 0x80, 0xCA, 0x04, 0xC2, 0xA8, + 0xCC, 0x81, 0xCA, 0x04, 0xC2, 0xA8, 0xCD, 0x82, + 0xCA, 0x04, 0xC3, 0x86, 0xCC, 0x81, 0xC9, 0x04, + 0xC3, 0x86, 0xCC, 0x84, 0xC9, 0x04, 0xC3, 0x98, + 0xCC, 0x81, 0xC9, 0x04, 0xC3, 0xA6, 0xCC, 0x81, + // Bytes 35c0 - 35ff + 0xC9, 0x04, 0xC3, 0xA6, 0xCC, 0x84, 0xC9, 0x04, + 0xC3, 0xB8, 0xCC, 0x81, 0xC9, 0x04, 0xC5, 0xBF, + 0xCC, 0x87, 0xC9, 0x04, 0xC6, 0xB7, 0xCC, 0x8C, + 0xC9, 0x04, 0xCA, 0x92, 0xCC, 0x8C, 0xC9, 0x04, + 0xCE, 0x91, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x91, + 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x84, + 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x86, 0xC9, 0x04, + 0xCE, 0x91, 0xCD, 0x85, 0xD9, 0x04, 0xCE, 0x95, + // Bytes 3600 - 363f + 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x95, 0xCC, 0x81, + 0xC9, 0x04, 0xCE, 0x97, 0xCC, 0x80, 0xC9, 0x04, + 0xCE, 0x97, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x97, + 0xCD, 0x85, 0xD9, 0x04, 0xCE, 0x99, 0xCC, 0x80, + 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x81, 0xC9, 0x04, + 0xCE, 0x99, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0x99, + 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x88, + 0xC9, 0x04, 0xCE, 0x9F, 0xCC, 0x80, 0xC9, 0x04, + // Bytes 3640 - 367f + 0xCE, 0x9F, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA1, + 0xCC, 0x94, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x80, + 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x81, 0xC9, 0x04, + 0xCE, 0xA5, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xA5, + 0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x88, + 0xC9, 0x04, 0xCE, 0xA9, 0xCC, 0x80, 0xC9, 0x04, + 0xCE, 0xA9, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA9, + 0xCD, 0x85, 0xD9, 0x04, 0xCE, 0xB1, 0xCC, 0x84, + // Bytes 3680 - 36bf + 0xC9, 0x04, 0xCE, 0xB1, 0xCC, 0x86, 0xC9, 0x04, + 0xCE, 0xB1, 0xCD, 0x85, 0xD9, 0x04, 0xCE, 0xB5, + 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xB5, 0xCC, 0x81, + 0xC9, 0x04, 0xCE, 0xB7, 0xCD, 0x85, 0xD9, 0x04, + 0xCE, 0xB9, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xB9, + 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xB9, 0xCC, 0x84, + 0xC9, 0x04, 0xCE, 0xB9, 0xCC, 0x86, 0xC9, 0x04, + 0xCE, 0xB9, 0xCD, 0x82, 0xC9, 0x04, 0xCE, 0xBF, + // Bytes 36c0 - 36ff + 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xBF, 0xCC, 0x81, + 0xC9, 0x04, 0xCF, 0x81, 0xCC, 0x93, 0xC9, 0x04, + 0xCF, 0x81, 0xCC, 0x94, 0xC9, 0x04, 0xCF, 0x85, + 0xCC, 0x80, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x81, + 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x84, 0xC9, 0x04, + 0xCF, 0x85, 0xCC, 0x86, 0xC9, 0x04, 0xCF, 0x85, + 0xCD, 0x82, 0xC9, 0x04, 0xCF, 0x89, 0xCD, 0x85, + 0xD9, 0x04, 0xCF, 0x92, 0xCC, 0x81, 0xC9, 0x04, + // Bytes 3700 - 373f + 0xCF, 0x92, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x86, + 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x90, 0xCC, 0x86, + 0xC9, 0x04, 0xD0, 0x90, 0xCC, 0x88, 0xC9, 0x04, + 0xD0, 0x93, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0x95, + 0xCC, 0x80, 0xC9, 0x04, 0xD0, 0x95, 0xCC, 0x86, + 0xC9, 0x04, 0xD0, 0x95, 0xCC, 0x88, 0xC9, 0x04, + 0xD0, 0x96, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x96, + 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x97, 0xCC, 0x88, + // Bytes 3740 - 377f + 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x80, 0xC9, 0x04, + 0xD0, 0x98, 0xCC, 0x84, 0xC9, 0x04, 0xD0, 0x98, + 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x88, + 0xC9, 0x04, 0xD0, 0x9A, 0xCC, 0x81, 0xC9, 0x04, + 0xD0, 0x9E, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xA3, + 0xCC, 0x84, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x86, + 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x88, 0xC9, 0x04, + 0xD0, 0xA3, 0xCC, 0x8B, 0xC9, 0x04, 0xD0, 0xA7, + // Bytes 3780 - 37bf + 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xAB, 0xCC, 0x88, + 0xC9, 0x04, 0xD0, 0xAD, 0xCC, 0x88, 0xC9, 0x04, + 0xD0, 0xB0, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB0, + 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB3, 0xCC, 0x81, + 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x80, 0xC9, 0x04, + 0xD0, 0xB5, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB5, + 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB6, 0xCC, 0x86, + 0xC9, 0x04, 0xD0, 0xB6, 0xCC, 0x88, 0xC9, 0x04, + // Bytes 37c0 - 37ff + 0xD0, 0xB7, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB8, + 0xCC, 0x80, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x84, + 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x86, 0xC9, 0x04, + 0xD0, 0xB8, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xBA, + 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0xBE, 0xCC, 0x88, + 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x84, 0xC9, 0x04, + 0xD1, 0x83, 0xCC, 0x86, 0xC9, 0x04, 0xD1, 0x83, + 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x8B, + // Bytes 3800 - 383f + 0xC9, 0x04, 0xD1, 0x87, 0xCC, 0x88, 0xC9, 0x04, + 0xD1, 0x8B, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x8D, + 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x96, 0xCC, 0x88, + 0xC9, 0x04, 0xD1, 0xB4, 0xCC, 0x8F, 0xC9, 0x04, + 0xD1, 0xB5, 0xCC, 0x8F, 0xC9, 0x04, 0xD3, 0x98, + 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0x99, 0xCC, 0x88, + 0xC9, 0x04, 0xD3, 0xA8, 0xCC, 0x88, 0xC9, 0x04, + 0xD3, 0xA9, 0xCC, 0x88, 0xC9, 0x04, 0xD8, 0xA7, + // Bytes 3840 - 387f + 0xD9, 0x93, 0xC9, 0x04, 0xD8, 0xA7, 0xD9, 0x94, + 0xC9, 0x04, 0xD8, 0xA7, 0xD9, 0x95, 0xB5, 0x04, + 0xD9, 0x88, 0xD9, 0x94, 0xC9, 0x04, 0xD9, 0x8A, + 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x81, 0xD9, 0x94, + 0xC9, 0x04, 0xDB, 0x92, 0xD9, 0x94, 0xC9, 0x04, + 0xDB, 0x95, 0xD9, 0x94, 0xC9, 0x05, 0x41, 0xCC, + 0x82, 0xCC, 0x80, 0xCA, 0x05, 0x41, 0xCC, 0x82, + 0xCC, 0x81, 0xCA, 0x05, 0x41, 0xCC, 0x82, 0xCC, + // Bytes 3880 - 38bf + 0x83, 0xCA, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x89, + 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x80, 0xCA, + 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x81, 0xCA, 0x05, + 0x41, 0xCC, 0x86, 0xCC, 0x83, 0xCA, 0x05, 0x41, + 0xCC, 0x86, 0xCC, 0x89, 0xCA, 0x05, 0x41, 0xCC, + 0x87, 0xCC, 0x84, 0xCA, 0x05, 0x41, 0xCC, 0x88, + 0xCC, 0x84, 0xCA, 0x05, 0x41, 0xCC, 0x8A, 0xCC, + 0x81, 0xCA, 0x05, 0x41, 0xCC, 0xA3, 0xCC, 0x82, + // Bytes 38c0 - 38ff + 0xCA, 0x05, 0x41, 0xCC, 0xA3, 0xCC, 0x86, 0xCA, + 0x05, 0x43, 0xCC, 0xA7, 0xCC, 0x81, 0xCA, 0x05, + 0x45, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, 0x45, + 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, + 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x45, 0xCC, 0x82, + 0xCC, 0x89, 0xCA, 0x05, 0x45, 0xCC, 0x84, 0xCC, + 0x80, 0xCA, 0x05, 0x45, 0xCC, 0x84, 0xCC, 0x81, + 0xCA, 0x05, 0x45, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, + // Bytes 3900 - 393f + 0x05, 0x45, 0xCC, 0xA7, 0xCC, 0x86, 0xCA, 0x05, + 0x49, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x4C, + 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, + 0x82, 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC, 0x82, + 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, + 0x83, 0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x89, + 0xCA, 0x05, 0x4F, 0xCC, 0x83, 0xCC, 0x81, 0xCA, + 0x05, 0x4F, 0xCC, 0x83, 0xCC, 0x84, 0xCA, 0x05, + // Bytes 3940 - 397f + 0x4F, 0xCC, 0x83, 0xCC, 0x88, 0xCA, 0x05, 0x4F, + 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC, + 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x87, + 0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x88, 0xCC, + 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0x80, + 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0x81, 0xCA, + 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0x83, 0xCA, 0x05, + 0x4F, 0xCC, 0x9B, 0xCC, 0x89, 0xCA, 0x05, 0x4F, + // Bytes 3980 - 39bf + 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, 0x05, 0x4F, 0xCC, + 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x4F, 0xCC, 0xA8, + 0xCC, 0x84, 0xCA, 0x05, 0x52, 0xCC, 0xA3, 0xCC, + 0x84, 0xCA, 0x05, 0x53, 0xCC, 0x81, 0xCC, 0x87, + 0xCA, 0x05, 0x53, 0xCC, 0x8C, 0xCC, 0x87, 0xCA, + 0x05, 0x53, 0xCC, 0xA3, 0xCC, 0x87, 0xCA, 0x05, + 0x55, 0xCC, 0x83, 0xCC, 0x81, 0xCA, 0x05, 0x55, + 0xCC, 0x84, 0xCC, 0x88, 0xCA, 0x05, 0x55, 0xCC, + // Bytes 39c0 - 39ff + 0x88, 0xCC, 0x80, 0xCA, 0x05, 0x55, 0xCC, 0x88, + 0xCC, 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, + 0x84, 0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x8C, + 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x80, 0xCA, + 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x81, 0xCA, 0x05, + 0x55, 0xCC, 0x9B, 0xCC, 0x83, 0xCA, 0x05, 0x55, + 0xCC, 0x9B, 0xCC, 0x89, 0xCA, 0x05, 0x55, 0xCC, + 0x9B, 0xCC, 0xA3, 0xB6, 0x05, 0x61, 0xCC, 0x82, + // Bytes 3a00 - 3a3f + 0xCC, 0x80, 0xCA, 0x05, 0x61, 0xCC, 0x82, 0xCC, + 0x81, 0xCA, 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x83, + 0xCA, 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x89, 0xCA, + 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x80, 0xCA, 0x05, + 0x61, 0xCC, 0x86, 0xCC, 0x81, 0xCA, 0x05, 0x61, + 0xCC, 0x86, 0xCC, 0x83, 0xCA, 0x05, 0x61, 0xCC, + 0x86, 0xCC, 0x89, 0xCA, 0x05, 0x61, 0xCC, 0x87, + 0xCC, 0x84, 0xCA, 0x05, 0x61, 0xCC, 0x88, 0xCC, + // Bytes 3a40 - 3a7f + 0x84, 0xCA, 0x05, 0x61, 0xCC, 0x8A, 0xCC, 0x81, + 0xCA, 0x05, 0x61, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, + 0x05, 0x61, 0xCC, 0xA3, 0xCC, 0x86, 0xCA, 0x05, + 0x63, 0xCC, 0xA7, 0xCC, 0x81, 0xCA, 0x05, 0x65, + 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05, 0x65, 0xCC, + 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x65, 0xCC, 0x82, + 0xCC, 0x83, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, + 0x89, 0xCA, 0x05, 0x65, 0xCC, 0x84, 0xCC, 0x80, + // Bytes 3a80 - 3abf + 0xCA, 0x05, 0x65, 0xCC, 0x84, 0xCC, 0x81, 0xCA, + 0x05, 0x65, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, + 0x65, 0xCC, 0xA7, 0xCC, 0x86, 0xCA, 0x05, 0x69, + 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x6C, 0xCC, + 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x82, + 0xCC, 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x82, 0xCC, + 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x83, + 0xCA, 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x89, 0xCA, + // Bytes 3ac0 - 3aff + 0x05, 0x6F, 0xCC, 0x83, 0xCC, 0x81, 0xCA, 0x05, + 0x6F, 0xCC, 0x83, 0xCC, 0x84, 0xCA, 0x05, 0x6F, + 0xCC, 0x83, 0xCC, 0x88, 0xCA, 0x05, 0x6F, 0xCC, + 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x84, + 0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x87, 0xCC, + 0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x88, 0xCC, 0x84, + 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x80, 0xCA, + 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x81, 0xCA, 0x05, + // Bytes 3b00 - 3b3f + 0x6F, 0xCC, 0x9B, 0xCC, 0x83, 0xCA, 0x05, 0x6F, + 0xCC, 0x9B, 0xCC, 0x89, 0xCA, 0x05, 0x6F, 0xCC, + 0x9B, 0xCC, 0xA3, 0xB6, 0x05, 0x6F, 0xCC, 0xA3, + 0xCC, 0x82, 0xCA, 0x05, 0x6F, 0xCC, 0xA8, 0xCC, + 0x84, 0xCA, 0x05, 0x72, 0xCC, 0xA3, 0xCC, 0x84, + 0xCA, 0x05, 0x73, 0xCC, 0x81, 0xCC, 0x87, 0xCA, + 0x05, 0x73, 0xCC, 0x8C, 0xCC, 0x87, 0xCA, 0x05, + 0x73, 0xCC, 0xA3, 0xCC, 0x87, 0xCA, 0x05, 0x75, + // Bytes 3b40 - 3b7f + 0xCC, 0x83, 0xCC, 0x81, 0xCA, 0x05, 0x75, 0xCC, + 0x84, 0xCC, 0x88, 0xCA, 0x05, 0x75, 0xCC, 0x88, + 0xCC, 0x80, 0xCA, 0x05, 0x75, 0xCC, 0x88, 0xCC, + 0x81, 0xCA, 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x84, + 0xCA, 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x8C, 0xCA, + 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, + 0x75, 0xCC, 0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x75, + 0xCC, 0x9B, 0xCC, 0x83, 0xCA, 0x05, 0x75, 0xCC, + // Bytes 3b80 - 3bbf + 0x9B, 0xCC, 0x89, 0xCA, 0x05, 0x75, 0xCC, 0x9B, + 0xCC, 0xA3, 0xB6, 0x05, 0xE1, 0xBE, 0xBF, 0xCC, + 0x80, 0xCA, 0x05, 0xE1, 0xBE, 0xBF, 0xCC, 0x81, + 0xCA, 0x05, 0xE1, 0xBE, 0xBF, 0xCD, 0x82, 0xCA, + 0x05, 0xE1, 0xBF, 0xBE, 0xCC, 0x80, 0xCA, 0x05, + 0xE1, 0xBF, 0xBE, 0xCC, 0x81, 0xCA, 0x05, 0xE1, + 0xBF, 0xBE, 0xCD, 0x82, 0xCA, 0x05, 0xE2, 0x86, + 0x90, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x86, 0x92, + // Bytes 3bc0 - 3bff + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x86, 0x94, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x87, 0x90, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x87, 0x92, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x87, 0x94, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x88, 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x88, 0x88, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, + 0x8B, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0xA3, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0xA5, 0xCC, + // Bytes 3c00 - 3c3f + 0xB8, 0x05, 0x05, 0xE2, 0x88, 0xBC, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x89, 0x83, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x89, 0x85, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x89, 0x88, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x89, 0x8D, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, + 0xA1, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xA4, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xA5, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB2, 0xCC, 0xB8, + // Bytes 3c40 - 3c7f + 0x05, 0x05, 0xE2, 0x89, 0xB3, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x89, 0xB6, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x89, 0xB7, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x89, 0xBA, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, + 0xBB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBC, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBD, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x82, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x8A, 0x83, 0xCC, 0xB8, 0x05, + // Bytes 3c80 - 3cbf + 0x05, 0xE2, 0x8A, 0x86, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x8A, 0x87, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x8A, 0x91, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, + 0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xA2, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xA8, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xA9, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x8A, 0xAB, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x8A, 0xB2, 0xCC, 0xB8, 0x05, 0x05, + // Bytes 3cc0 - 3cff + 0xE2, 0x8A, 0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x8A, 0xB4, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, + 0xB5, 0xCC, 0xB8, 0x05, 0x06, 0xCE, 0x91, 0xCC, + 0x93, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0x91, 0xCC, + 0x94, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0x95, 0xCC, + 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x95, 0xCC, + 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0x95, 0xCC, + 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x95, 0xCC, + // Bytes 3d00 - 3d3f + 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0x97, 0xCC, + 0x93, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0x97, 0xCC, + 0x94, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0x99, 0xCC, + 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x99, 0xCC, + 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0x99, 0xCC, + 0x93, 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0x99, 0xCC, + 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x99, 0xCC, + 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0x99, 0xCC, + // Bytes 3d40 - 3d7f + 0x94, 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0x9F, 0xCC, + 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x9F, 0xCC, + 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0x9F, 0xCC, + 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0x9F, 0xCC, + 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xA5, 0xCC, + 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xA5, 0xCC, + 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xA5, 0xCC, + 0x94, 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0xA9, 0xCC, + // Bytes 3d80 - 3dbf + 0x93, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xA9, 0xCC, + 0x94, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCC, + 0x80, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCC, + 0x81, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCC, + 0x93, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCC, + 0x94, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB1, 0xCD, + 0x82, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB5, 0xCC, + 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xB5, 0xCC, + // Bytes 3dc0 - 3dff + 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xB5, 0xCC, + 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xB5, 0xCC, + 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xB7, 0xCC, + 0x80, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB7, 0xCC, + 0x81, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB7, 0xCC, + 0x93, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB7, 0xCC, + 0x94, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB7, 0xCD, + 0x82, 0xCD, 0x85, 0xDA, 0x06, 0xCE, 0xB9, 0xCC, + // Bytes 3e00 - 3e3f + 0x88, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, + 0x88, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, + 0x88, 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, + 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, + 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, + 0x93, 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, + 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, + 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xB9, 0xCC, + // Bytes 3e40 - 3e7f + 0x94, 0xCD, 0x82, 0xCA, 0x06, 0xCE, 0xBF, 0xCC, + 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xBF, 0xCC, + 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCE, 0xBF, 0xCC, + 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCE, 0xBF, 0xCC, + 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCF, 0x85, 0xCC, + 0x88, 0xCC, 0x80, 0xCA, 0x06, 0xCF, 0x85, 0xCC, + 0x88, 0xCC, 0x81, 0xCA, 0x06, 0xCF, 0x85, 0xCC, + 0x88, 0xCD, 0x82, 0xCA, 0x06, 0xCF, 0x85, 0xCC, + // Bytes 3e80 - 3ebf + 0x93, 0xCC, 0x80, 0xCA, 0x06, 0xCF, 0x85, 0xCC, + 0x93, 0xCC, 0x81, 0xCA, 0x06, 0xCF, 0x85, 0xCC, + 0x93, 0xCD, 0x82, 0xCA, 0x06, 0xCF, 0x85, 0xCC, + 0x94, 0xCC, 0x80, 0xCA, 0x06, 0xCF, 0x85, 0xCC, + 0x94, 0xCC, 0x81, 0xCA, 0x06, 0xCF, 0x85, 0xCC, + 0x94, 0xCD, 0x82, 0xCA, 0x06, 0xCF, 0x89, 0xCC, + 0x80, 0xCD, 0x85, 0xDA, 0x06, 0xCF, 0x89, 0xCC, + 0x81, 0xCD, 0x85, 0xDA, 0x06, 0xCF, 0x89, 0xCC, + // Bytes 3ec0 - 3eff + 0x93, 0xCD, 0x85, 0xDA, 0x06, 0xCF, 0x89, 0xCC, + 0x94, 0xCD, 0x85, 0xDA, 0x06, 0xCF, 0x89, 0xCD, + 0x82, 0xCD, 0x85, 0xDA, 0x06, 0xE0, 0xA4, 0xA8, + 0xE0, 0xA4, 0xBC, 0x09, 0x06, 0xE0, 0xA4, 0xB0, + 0xE0, 0xA4, 0xBC, 0x09, 0x06, 0xE0, 0xA4, 0xB3, + 0xE0, 0xA4, 0xBC, 0x09, 0x06, 0xE0, 0xB1, 0x86, + 0xE0, 0xB1, 0x96, 0x85, 0x06, 0xE0, 0xB7, 0x99, + 0xE0, 0xB7, 0x8A, 0x11, 0x06, 0xE3, 0x81, 0x86, + // Bytes 3f00 - 3f3f + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x8B, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x8D, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x8F, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x91, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x93, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x95, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x97, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x99, + // Bytes 3f40 - 3f7f + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x9B, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x9D, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0x9F, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xA1, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xA4, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xA6, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xA8, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xAF, + // Bytes 3f80 - 3fbf + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xAF, + 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x81, 0xB2, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xB2, + 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x81, 0xB5, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xB5, + 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x81, 0xB8, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xB8, + 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x81, 0xBB, + // Bytes 3fc0 - 3fff + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x81, 0xBB, + 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x82, 0x9D, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xA6, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xAB, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xAD, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xAF, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xB1, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xB3, + // Bytes 4000 - 403f + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xB5, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xB7, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xB9, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xBB, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xBD, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x82, 0xBF, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x81, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x84, + // Bytes 4040 - 407f + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x86, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x88, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x8F, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x8F, + 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0x92, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x92, + 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0x95, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x95, + // Bytes 4080 - 40bf + 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0x98, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x98, + 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0x9B, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0x9B, + 0xE3, 0x82, 0x9A, 0x0D, 0x06, 0xE3, 0x83, 0xAF, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0xB0, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0xB1, + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0xB2, + // Bytes 40c0 - 40ff + 0xE3, 0x82, 0x99, 0x0D, 0x06, 0xE3, 0x83, 0xBD, + 0xE3, 0x82, 0x99, 0x0D, 0x08, 0xCE, 0x91, 0xCC, + 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, + 0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, + 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCD, + 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, + 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, + 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, + // Bytes 4100 - 413f + 0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, + 0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCD, + 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCC, + 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, + 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, + 0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, + 0x08, 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCD, + 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x94, 0xCD, + // Bytes 4140 - 417f + 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, + 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, + 0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, + 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCD, + 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, + 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, + 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, + 0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, + // Bytes 4180 - 41bf + 0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCD, + 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCC, + 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, + 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, + 0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, + 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCD, + 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, + 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, + // Bytes 41c0 - 41ff + 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, + 0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB, + 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCD, + 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, + 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, + 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, + 0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB, + 0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCD, + // Bytes 4200 - 423f + 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCC, + 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, + 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCF, + 0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB, + 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCD, + 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCD, + 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xF0, 0x91, 0x82, + 0x99, 0xF0, 0x91, 0x82, 0xBA, 0x09, 0x08, 0xF0, + // Bytes 4240 - 427f + 0x91, 0x82, 0x9B, 0xF0, 0x91, 0x82, 0xBA, 0x09, + 0x08, 0xF0, 0x91, 0x82, 0xA5, 0xF0, 0x91, 0x82, + 0xBA, 0x09, 0x42, 0xC2, 0xB4, 0x01, 0x43, 0x20, + 0xCC, 0x81, 0xC9, 0x43, 0x20, 0xCC, 0x83, 0xC9, + 0x43, 0x20, 0xCC, 0x84, 0xC9, 0x43, 0x20, 0xCC, + 0x85, 0xC9, 0x43, 0x20, 0xCC, 0x86, 0xC9, 0x43, + 0x20, 0xCC, 0x87, 0xC9, 0x43, 0x20, 0xCC, 0x88, + 0xC9, 0x43, 0x20, 0xCC, 0x8A, 0xC9, 0x43, 0x20, + // Bytes 4280 - 42bf + 0xCC, 0x8B, 0xC9, 0x43, 0x20, 0xCC, 0x93, 0xC9, + 0x43, 0x20, 0xCC, 0x94, 0xC9, 0x43, 0x20, 0xCC, + 0xA7, 0xA5, 0x43, 0x20, 0xCC, 0xA8, 0xA5, 0x43, + 0x20, 0xCC, 0xB3, 0xB5, 0x43, 0x20, 0xCD, 0x82, + 0xC9, 0x43, 0x20, 0xCD, 0x85, 0xD9, 0x43, 0x20, + 0xD9, 0x8B, 0x59, 0x43, 0x20, 0xD9, 0x8C, 0x5D, + 0x43, 0x20, 0xD9, 0x8D, 0x61, 0x43, 0x20, 0xD9, + 0x8E, 0x65, 0x43, 0x20, 0xD9, 0x8F, 0x69, 0x43, + // Bytes 42c0 - 42ff + 0x20, 0xD9, 0x90, 0x6D, 0x43, 0x20, 0xD9, 0x91, + 0x71, 0x43, 0x20, 0xD9, 0x92, 0x75, 0x43, 0x41, + 0xCC, 0x8A, 0xC9, 0x43, 0x73, 0xCC, 0x87, 0xC9, + 0x43, 0xE1, 0x85, 0xA1, 0x01, 0x43, 0xE1, 0x85, + 0xA2, 0x01, 0x43, 0xE1, 0x85, 0xA3, 0x01, 0x43, + 0xE1, 0x85, 0xA4, 0x01, 0x43, 0xE1, 0x85, 0xA5, + 0x01, 0x43, 0xE1, 0x85, 0xA6, 0x01, 0x43, 0xE1, + 0x85, 0xA7, 0x01, 0x43, 0xE1, 0x85, 0xA8, 0x01, + // Bytes 4300 - 433f + 0x43, 0xE1, 0x85, 0xA9, 0x01, 0x43, 0xE1, 0x85, + 0xAA, 0x01, 0x43, 0xE1, 0x85, 0xAB, 0x01, 0x43, + 0xE1, 0x85, 0xAC, 0x01, 0x43, 0xE1, 0x85, 0xAD, + 0x01, 0x43, 0xE1, 0x85, 0xAE, 0x01, 0x43, 0xE1, + 0x85, 0xAF, 0x01, 0x43, 0xE1, 0x85, 0xB0, 0x01, + 0x43, 0xE1, 0x85, 0xB1, 0x01, 0x43, 0xE1, 0x85, + 0xB2, 0x01, 0x43, 0xE1, 0x85, 0xB3, 0x01, 0x43, + 0xE1, 0x85, 0xB4, 0x01, 0x43, 0xE1, 0x85, 0xB5, + // Bytes 4340 - 437f + 0x01, 0x43, 0xE1, 0x86, 0xAA, 0x01, 0x43, 0xE1, + 0x86, 0xAC, 0x01, 0x43, 0xE1, 0x86, 0xAD, 0x01, + 0x43, 0xE1, 0x86, 0xB0, 0x01, 0x43, 0xE1, 0x86, + 0xB1, 0x01, 0x43, 0xE1, 0x86, 0xB2, 0x01, 0x43, + 0xE1, 0x86, 0xB3, 0x01, 0x43, 0xE1, 0x86, 0xB4, + 0x01, 0x43, 0xE1, 0x86, 0xB5, 0x01, 0x44, 0x20, + 0xE3, 0x82, 0x99, 0x0D, 0x44, 0x20, 0xE3, 0x82, + 0x9A, 0x0D, 0x44, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, + // Bytes 4380 - 43bf + 0x44, 0xCE, 0x91, 0xCC, 0x81, 0xC9, 0x44, 0xCE, + 0x95, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x97, 0xCC, + 0x81, 0xC9, 0x44, 0xCE, 0x99, 0xCC, 0x81, 0xC9, + 0x44, 0xCE, 0x9F, 0xCC, 0x81, 0xC9, 0x44, 0xCE, + 0xA5, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, + 0x88, 0xC9, 0x44, 0xCE, 0xA9, 0xCC, 0x81, 0xC9, + 0x44, 0xCE, 0xB1, 0xCC, 0x81, 0xC9, 0x44, 0xCE, + 0xB5, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB7, 0xCC, + // Bytes 43c0 - 43ff + 0x81, 0xC9, 0x44, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, + 0x44, 0xCE, 0xBF, 0xCC, 0x81, 0xC9, 0x44, 0xCF, + 0x85, 0xCC, 0x81, 0xC9, 0x44, 0xCF, 0x89, 0xCC, + 0x81, 0xC9, 0x44, 0xD7, 0x90, 0xD6, 0xB7, 0x31, + 0x44, 0xD7, 0x90, 0xD6, 0xB8, 0x35, 0x44, 0xD7, + 0x90, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x91, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0x91, 0xD6, 0xBF, 0x49, + 0x44, 0xD7, 0x92, 0xD6, 0xBC, 0x41, 0x44, 0xD7, + // Bytes 4400 - 443f + 0x93, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x94, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0x95, 0xD6, 0xB9, 0x39, + 0x44, 0xD7, 0x95, 0xD6, 0xBC, 0x41, 0x44, 0xD7, + 0x96, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x98, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0x99, 0xD6, 0xB4, 0x25, + 0x44, 0xD7, 0x99, 0xD6, 0xBC, 0x41, 0x44, 0xD7, + 0x9A, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9B, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0x9B, 0xD6, 0xBF, 0x49, + // Bytes 4440 - 447f + 0x44, 0xD7, 0x9C, 0xD6, 0xBC, 0x41, 0x44, 0xD7, + 0x9E, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA0, 0xD6, + 0xBC, 0x41, 0x44, 0xD7, 0xA1, 0xD6, 0xBC, 0x41, + 0x44, 0xD7, 0xA3, 0xD6, 0xBC, 0x41, 0x44, 0xD7, + 0xA4, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, + 0xBF, 0x49, 0x44, 0xD7, 0xA6, 0xD6, 0xBC, 0x41, + 0x44, 0xD7, 0xA7, 0xD6, 0xBC, 0x41, 0x44, 0xD7, + 0xA8, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA9, 0xD6, + // Bytes 4480 - 44bf + 0xBC, 0x41, 0x44, 0xD7, 0xA9, 0xD7, 0x81, 0x4D, + 0x44, 0xD7, 0xA9, 0xD7, 0x82, 0x51, 0x44, 0xD7, + 0xAA, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xB2, 0xD6, + 0xB7, 0x31, 0x44, 0xD8, 0xA7, 0xD9, 0x8B, 0x59, + 0x44, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, 0x44, 0xD8, + 0xA7, 0xD9, 0x94, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, + 0x95, 0xB5, 0x44, 0xD8, 0xB0, 0xD9, 0xB0, 0x79, + 0x44, 0xD8, 0xB1, 0xD9, 0xB0, 0x79, 0x44, 0xD9, + // Bytes 44c0 - 44ff + 0x80, 0xD9, 0x8B, 0x59, 0x44, 0xD9, 0x80, 0xD9, + 0x8E, 0x65, 0x44, 0xD9, 0x80, 0xD9, 0x8F, 0x69, + 0x44, 0xD9, 0x80, 0xD9, 0x90, 0x6D, 0x44, 0xD9, + 0x80, 0xD9, 0x91, 0x71, 0x44, 0xD9, 0x80, 0xD9, + 0x92, 0x75, 0x44, 0xD9, 0x87, 0xD9, 0xB0, 0x79, + 0x44, 0xD9, 0x88, 0xD9, 0x94, 0xC9, 0x44, 0xD9, + 0x89, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x8A, 0xD9, + 0x94, 0xC9, 0x44, 0xDB, 0x92, 0xD9, 0x94, 0xC9, + // Bytes 4500 - 453f + 0x44, 0xDB, 0x95, 0xD9, 0x94, 0xC9, 0x45, 0x20, + 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, + 0x88, 0xCC, 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x88, + 0xCD, 0x82, 0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCC, + 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x81, + 0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCD, 0x82, 0xCA, + 0x45, 0x20, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x45, + 0x20, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x45, 0x20, + // Bytes 4540 - 457f + 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x45, 0x20, 0xD9, + 0x8C, 0xD9, 0x91, 0x72, 0x45, 0x20, 0xD9, 0x8D, + 0xD9, 0x91, 0x72, 0x45, 0x20, 0xD9, 0x8E, 0xD9, + 0x91, 0x72, 0x45, 0x20, 0xD9, 0x8F, 0xD9, 0x91, + 0x72, 0x45, 0x20, 0xD9, 0x90, 0xD9, 0x91, 0x72, + 0x45, 0x20, 0xD9, 0x91, 0xD9, 0xB0, 0x7A, 0x45, + 0xE2, 0xAB, 0x9D, 0xCC, 0xB8, 0x05, 0x46, 0xCE, + 0xB9, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x46, 0xCF, + // Bytes 4580 - 45bf + 0x85, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x46, 0xD7, + 0xA9, 0xD6, 0xBC, 0xD7, 0x81, 0x4E, 0x46, 0xD7, + 0xA9, 0xD6, 0xBC, 0xD7, 0x82, 0x52, 0x46, 0xD9, + 0x80, 0xD9, 0x8E, 0xD9, 0x91, 0x72, 0x46, 0xD9, + 0x80, 0xD9, 0x8F, 0xD9, 0x91, 0x72, 0x46, 0xD9, + 0x80, 0xD9, 0x90, 0xD9, 0x91, 0x72, 0x46, 0xE0, + 0xA4, 0x95, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, + 0xA4, 0x96, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, + // Bytes 45c0 - 45ff + 0xA4, 0x97, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, + 0xA4, 0x9C, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, + 0xA4, 0xA1, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, + 0xA4, 0xA2, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, + 0xA4, 0xAB, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, + 0xA4, 0xAF, 0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, + 0xA6, 0xA1, 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, + 0xA6, 0xA2, 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, + // Bytes 4600 - 463f + 0xA6, 0xAF, 0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, + 0xA8, 0x96, 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, + 0xA8, 0x97, 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, + 0xA8, 0x9C, 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, + 0xA8, 0xAB, 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, + 0xA8, 0xB2, 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, + 0xA8, 0xB8, 0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, + 0xAC, 0xA1, 0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, + // Bytes 4640 - 467f + 0xAC, 0xA2, 0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, + 0xBE, 0xB2, 0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE0, + 0xBE, 0xB3, 0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE3, + 0x83, 0x86, 0xE3, 0x82, 0x99, 0x0D, 0x48, 0xF0, + 0x9D, 0x85, 0x97, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, + 0x48, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, + 0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, + 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x86, + // Bytes 4680 - 46bf + 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x49, 0xE0, + 0xBE, 0xB2, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, + 0x9E, 0x49, 0xE0, 0xBE, 0xB3, 0xE0, 0xBD, 0xB1, + 0xE0, 0xBE, 0x80, 0x9E, 0x4C, 0xF0, 0x9D, 0x85, + 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, + 0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, + 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, + 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, + // Bytes 46c0 - 46ff + 0xA5, 0xF0, 0x9D, 0x85, 0xB0, 0xAE, 0x4C, 0xF0, + 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, + 0x9D, 0x85, 0xB1, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, + 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, + 0xB2, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, + 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, + 0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, + 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, + // Bytes 4700 - 473f + 0x9D, 0x86, 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, + 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, + 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, + 0xAF, 0xAE, 0x83, 0x41, 0xCC, 0x82, 0xC9, 0x83, + 0x41, 0xCC, 0x86, 0xC9, 0x83, 0x41, 0xCC, 0x87, + 0xC9, 0x83, 0x41, 0xCC, 0x88, 0xC9, 0x83, 0x41, + 0xCC, 0x8A, 0xC9, 0x83, 0x41, 0xCC, 0xA3, 0xB5, + 0x83, 0x43, 0xCC, 0xA7, 0xA5, 0x83, 0x45, 0xCC, + // Bytes 4740 - 477f + 0x82, 0xC9, 0x83, 0x45, 0xCC, 0x84, 0xC9, 0x83, + 0x45, 0xCC, 0xA3, 0xB5, 0x83, 0x45, 0xCC, 0xA7, + 0xA5, 0x83, 0x49, 0xCC, 0x88, 0xC9, 0x83, 0x4C, + 0xCC, 0xA3, 0xB5, 0x83, 0x4F, 0xCC, 0x82, 0xC9, + 0x83, 0x4F, 0xCC, 0x83, 0xC9, 0x83, 0x4F, 0xCC, + 0x84, 0xC9, 0x83, 0x4F, 0xCC, 0x87, 0xC9, 0x83, + 0x4F, 0xCC, 0x88, 0xC9, 0x83, 0x4F, 0xCC, 0x9B, + 0xAD, 0x83, 0x4F, 0xCC, 0xA3, 0xB5, 0x83, 0x4F, + // Bytes 4780 - 47bf + 0xCC, 0xA8, 0xA5, 0x83, 0x52, 0xCC, 0xA3, 0xB5, + 0x83, 0x53, 0xCC, 0x81, 0xC9, 0x83, 0x53, 0xCC, + 0x8C, 0xC9, 0x83, 0x53, 0xCC, 0xA3, 0xB5, 0x83, + 0x55, 0xCC, 0x83, 0xC9, 0x83, 0x55, 0xCC, 0x84, + 0xC9, 0x83, 0x55, 0xCC, 0x88, 0xC9, 0x83, 0x55, + 0xCC, 0x9B, 0xAD, 0x83, 0x61, 0xCC, 0x82, 0xC9, + 0x83, 0x61, 0xCC, 0x86, 0xC9, 0x83, 0x61, 0xCC, + 0x87, 0xC9, 0x83, 0x61, 0xCC, 0x88, 0xC9, 0x83, + // Bytes 47c0 - 47ff + 0x61, 0xCC, 0x8A, 0xC9, 0x83, 0x61, 0xCC, 0xA3, + 0xB5, 0x83, 0x63, 0xCC, 0xA7, 0xA5, 0x83, 0x65, + 0xCC, 0x82, 0xC9, 0x83, 0x65, 0xCC, 0x84, 0xC9, + 0x83, 0x65, 0xCC, 0xA3, 0xB5, 0x83, 0x65, 0xCC, + 0xA7, 0xA5, 0x83, 0x69, 0xCC, 0x88, 0xC9, 0x83, + 0x6C, 0xCC, 0xA3, 0xB5, 0x83, 0x6F, 0xCC, 0x82, + 0xC9, 0x83, 0x6F, 0xCC, 0x83, 0xC9, 0x83, 0x6F, + 0xCC, 0x84, 0xC9, 0x83, 0x6F, 0xCC, 0x87, 0xC9, + // Bytes 4800 - 483f + 0x83, 0x6F, 0xCC, 0x88, 0xC9, 0x83, 0x6F, 0xCC, + 0x9B, 0xAD, 0x83, 0x6F, 0xCC, 0xA3, 0xB5, 0x83, + 0x6F, 0xCC, 0xA8, 0xA5, 0x83, 0x72, 0xCC, 0xA3, + 0xB5, 0x83, 0x73, 0xCC, 0x81, 0xC9, 0x83, 0x73, + 0xCC, 0x8C, 0xC9, 0x83, 0x73, 0xCC, 0xA3, 0xB5, + 0x83, 0x75, 0xCC, 0x83, 0xC9, 0x83, 0x75, 0xCC, + 0x84, 0xC9, 0x83, 0x75, 0xCC, 0x88, 0xC9, 0x83, + 0x75, 0xCC, 0x9B, 0xAD, 0x84, 0xCE, 0x91, 0xCC, + // Bytes 4840 - 487f + 0x93, 0xC9, 0x84, 0xCE, 0x91, 0xCC, 0x94, 0xC9, + 0x84, 0xCE, 0x95, 0xCC, 0x93, 0xC9, 0x84, 0xCE, + 0x95, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0x97, 0xCC, + 0x93, 0xC9, 0x84, 0xCE, 0x97, 0xCC, 0x94, 0xC9, + 0x84, 0xCE, 0x99, 0xCC, 0x93, 0xC9, 0x84, 0xCE, + 0x99, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0x9F, 0xCC, + 0x93, 0xC9, 0x84, 0xCE, 0x9F, 0xCC, 0x94, 0xC9, + 0x84, 0xCE, 0xA5, 0xCC, 0x94, 0xC9, 0x84, 0xCE, + // Bytes 4880 - 48bf + 0xA9, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, + 0x94, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x80, 0xC9, + 0x84, 0xCE, 0xB1, 0xCC, 0x81, 0xC9, 0x84, 0xCE, + 0xB1, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, + 0x94, 0xC9, 0x84, 0xCE, 0xB1, 0xCD, 0x82, 0xC9, + 0x84, 0xCE, 0xB5, 0xCC, 0x93, 0xC9, 0x84, 0xCE, + 0xB5, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, + 0x80, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, + // Bytes 48c0 - 48ff + 0x84, 0xCE, 0xB7, 0xCC, 0x93, 0xC9, 0x84, 0xCE, + 0xB7, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCD, + 0x82, 0xC9, 0x84, 0xCE, 0xB9, 0xCC, 0x88, 0xC9, + 0x84, 0xCE, 0xB9, 0xCC, 0x93, 0xC9, 0x84, 0xCE, + 0xB9, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xBF, 0xCC, + 0x93, 0xC9, 0x84, 0xCE, 0xBF, 0xCC, 0x94, 0xC9, + 0x84, 0xCF, 0x85, 0xCC, 0x88, 0xC9, 0x84, 0xCF, + 0x85, 0xCC, 0x93, 0xC9, 0x84, 0xCF, 0x85, 0xCC, + // Bytes 4900 - 493f + 0x94, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x80, 0xC9, + 0x84, 0xCF, 0x89, 0xCC, 0x81, 0xC9, 0x84, 0xCF, + 0x89, 0xCC, 0x93, 0xC9, 0x84, 0xCF, 0x89, 0xCC, + 0x94, 0xC9, 0x84, 0xCF, 0x89, 0xCD, 0x82, 0xC9, + 0x86, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCA, + 0x86, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCA, + 0x86, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCA, + 0x86, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCA, + // Bytes 4940 - 497f + 0x86, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCA, + 0x86, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCA, + 0x86, 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCA, + 0x86, 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCA, + 0x86, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCA, + 0x86, 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCA, + 0x86, 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCA, + 0x86, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCA, + // Bytes 4980 - 49bf + 0x86, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCA, + 0x86, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCA, + 0x86, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCA, + 0x86, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCA, + 0x86, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCA, + 0x86, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCA, + 0x86, 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCA, + 0x86, 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCA, + // Bytes 49c0 - 49ff + 0x86, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCA, + 0x86, 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCA, + 0x86, 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCA, + 0x86, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCA, + 0x86, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCA, + 0x86, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCA, + 0x86, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCA, + 0x86, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCA, + // Bytes 4a00 - 4a3f + 0x86, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCA, + 0x86, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCA, + 0x86, 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCA, + 0x86, 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCA, + 0x86, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCA, + 0x86, 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCA, + 0x86, 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCA, + 0x86, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCA, + // Bytes 4a40 - 4a7f + 0x42, 0xCC, 0x80, 0xC9, 0x32, 0x42, 0xCC, 0x81, + 0xC9, 0x32, 0x42, 0xCC, 0x93, 0xC9, 0x32, 0x44, + 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x32, 0x43, 0xE3, + 0x82, 0x99, 0x0D, 0x03, 0x43, 0xE3, 0x82, 0x9A, + 0x0D, 0x03, 0x46, 0xE0, 0xBD, 0xB1, 0xE0, 0xBD, + 0xB2, 0x9E, 0x26, 0x46, 0xE0, 0xBD, 0xB1, 0xE0, + 0xBD, 0xB4, 0xA2, 0x26, 0x46, 0xE0, 0xBD, 0xB1, + 0xE0, 0xBE, 0x80, 0x9E, 0x26, 0x00, 0x01, +} + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfcTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfcTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfcValues[c0] + } + i := nfcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfcTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfcTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfcValues[c0] + } + i := nfcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// nfcTrie. Total size: 10270 bytes (10.03 KiB). Checksum: d7e415c88f2e510a. +type nfcTrie struct{} + +func newNfcTrie(i int) *nfcTrie { + return &nfcTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *nfcTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 44: + return uint16(nfcValues[n<<6+uint32(b)]) + default: + n -= 44 + return uint16(nfcSparse.lookup(n, b)) + } +} + +// nfcValues: 46 blocks, 2944 entries, 5888 bytes +// The third block is the zero block. +var nfcValues = [2944]uint16{ + // Block 0x0, offset 0x0 + 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, + // Block 0x1, offset 0x40 + 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, + 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, + 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, + 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, + 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, + 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, + 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, + 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, + 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, + 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x2f6b, 0xc1: 0x2f70, 0xc2: 0x471a, 0xc3: 0x2f75, 0xc4: 0x4729, 0xc5: 0x472e, + 0xc6: 0xa000, 0xc7: 0x4738, 0xc8: 0x2fde, 0xc9: 0x2fe3, 0xca: 0x473d, 0xcb: 0x2ff7, + 0xcc: 0x306a, 0xcd: 0x306f, 0xce: 0x3074, 0xcf: 0x4751, 0xd1: 0x3100, + 0xd2: 0x3123, 0xd3: 0x3128, 0xd4: 0x475b, 0xd5: 0x4760, 0xd6: 0x476f, + 0xd8: 0xa000, 0xd9: 0x31af, 0xda: 0x31b4, 0xdb: 0x31b9, 0xdc: 0x47a1, 0xdd: 0x3231, + 0xe0: 0x3277, 0xe1: 0x327c, 0xe2: 0x47ab, 0xe3: 0x3281, + 0xe4: 0x47ba, 0xe5: 0x47bf, 0xe6: 0xa000, 0xe7: 0x47c9, 0xe8: 0x32ea, 0xe9: 0x32ef, + 0xea: 0x47ce, 0xeb: 0x3303, 0xec: 0x337b, 0xed: 0x3380, 0xee: 0x3385, 0xef: 0x47e2, + 0xf1: 0x3411, 0xf2: 0x3434, 0xf3: 0x3439, 0xf4: 0x47ec, 0xf5: 0x47f1, + 0xf6: 0x4800, 0xf8: 0xa000, 0xf9: 0x34c5, 0xfa: 0x34ca, 0xfb: 0x34cf, + 0xfc: 0x4832, 0xfd: 0x354c, 0xff: 0x3565, + // Block 0x4, offset 0x100 + 0x100: 0x2f7a, 0x101: 0x3286, 0x102: 0x471f, 0x103: 0x47b0, 0x104: 0x2f98, 0x105: 0x32a4, + 0x106: 0x2fac, 0x107: 0x32b8, 0x108: 0x2fb1, 0x109: 0x32bd, 0x10a: 0x2fb6, 0x10b: 0x32c2, + 0x10c: 0x2fbb, 0x10d: 0x32c7, 0x10e: 0x2fc5, 0x10f: 0x32d1, + 0x112: 0x4742, 0x113: 0x47d3, 0x114: 0x2fed, 0x115: 0x32f9, 0x116: 0x2ff2, 0x117: 0x32fe, + 0x118: 0x3010, 0x119: 0x331c, 0x11a: 0x3001, 0x11b: 0x330d, 0x11c: 0x3029, 0x11d: 0x3335, + 0x11e: 0x3033, 0x11f: 0x333f, 0x120: 0x3038, 0x121: 0x3344, 0x122: 0x3042, 0x123: 0x334e, + 0x124: 0x3047, 0x125: 0x3353, 0x128: 0x3079, 0x129: 0x338a, + 0x12a: 0x307e, 0x12b: 0x338f, 0x12c: 0x3083, 0x12d: 0x3394, 0x12e: 0x30a6, 0x12f: 0x33b2, + 0x130: 0x3088, 0x134: 0x30b0, 0x135: 0x33bc, + 0x136: 0x30c4, 0x137: 0x33d5, 0x139: 0x30ce, 0x13a: 0x33df, 0x13b: 0x30d8, + 0x13c: 0x33e9, 0x13d: 0x30d3, 0x13e: 0x33e4, + // Block 0x5, offset 0x140 + 0x143: 0x30fb, 0x144: 0x340c, 0x145: 0x3114, + 0x146: 0x3425, 0x147: 0x310a, 0x148: 0x341b, + 0x14c: 0x4765, 0x14d: 0x47f6, 0x14e: 0x312d, 0x14f: 0x343e, 0x150: 0x3137, 0x151: 0x3448, + 0x154: 0x3155, 0x155: 0x3466, 0x156: 0x316e, 0x157: 0x347f, + 0x158: 0x315f, 0x159: 0x3470, 0x15a: 0x4788, 0x15b: 0x4819, 0x15c: 0x3178, 0x15d: 0x3489, + 0x15e: 0x3187, 0x15f: 0x3498, 0x160: 0x478d, 0x161: 0x481e, 0x162: 0x31a0, 0x163: 0x34b6, + 0x164: 0x3191, 0x165: 0x34a7, 0x168: 0x4797, 0x169: 0x4828, + 0x16a: 0x479c, 0x16b: 0x482d, 0x16c: 0x31be, 0x16d: 0x34d4, 0x16e: 0x31c8, 0x16f: 0x34de, + 0x170: 0x31cd, 0x171: 0x34e3, 0x172: 0x31eb, 0x173: 0x3501, 0x174: 0x320e, 0x175: 0x3524, + 0x176: 0x3236, 0x177: 0x3551, 0x178: 0x324a, 0x179: 0x3259, 0x17a: 0x3579, 0x17b: 0x3263, + 0x17c: 0x3583, 0x17d: 0x3268, 0x17e: 0x3588, 0x17f: 0xa000, + // Block 0x6, offset 0x180 + 0x184: 0x8100, 0x185: 0x8100, + 0x186: 0x8100, + 0x18d: 0x2f84, 0x18e: 0x3290, 0x18f: 0x3092, 0x190: 0x339e, 0x191: 0x313c, + 0x192: 0x344d, 0x193: 0x31d2, 0x194: 0x34e8, 0x195: 0x39cb, 0x196: 0x3b5a, 0x197: 0x39c4, + 0x198: 0x3b53, 0x199: 0x39d2, 0x19a: 0x3b61, 0x19b: 0x39bd, 0x19c: 0x3b4c, + 0x19e: 0x38ac, 0x19f: 0x3a3b, 0x1a0: 0x38a5, 0x1a1: 0x3a34, 0x1a2: 0x35af, 0x1a3: 0x35c1, + 0x1a6: 0x303d, 0x1a7: 0x3349, 0x1a8: 0x30ba, 0x1a9: 0x33cb, + 0x1aa: 0x477e, 0x1ab: 0x480f, 0x1ac: 0x398c, 0x1ad: 0x3b1b, 0x1ae: 0x35d3, 0x1af: 0x35d9, + 0x1b0: 0x33c1, 0x1b4: 0x3024, 0x1b5: 0x3330, + 0x1b8: 0x30f6, 0x1b9: 0x3407, 0x1ba: 0x38b3, 0x1bb: 0x3a42, + 0x1bc: 0x35a9, 0x1bd: 0x35bb, 0x1be: 0x35b5, 0x1bf: 0x35c7, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x2f89, 0x1c1: 0x3295, 0x1c2: 0x2f8e, 0x1c3: 0x329a, 0x1c4: 0x3006, 0x1c5: 0x3312, + 0x1c6: 0x300b, 0x1c7: 0x3317, 0x1c8: 0x3097, 0x1c9: 0x33a3, 0x1ca: 0x309c, 0x1cb: 0x33a8, + 0x1cc: 0x3141, 0x1cd: 0x3452, 0x1ce: 0x3146, 0x1cf: 0x3457, 0x1d0: 0x3164, 0x1d1: 0x3475, + 0x1d2: 0x3169, 0x1d3: 0x347a, 0x1d4: 0x31d7, 0x1d5: 0x34ed, 0x1d6: 0x31dc, 0x1d7: 0x34f2, + 0x1d8: 0x3182, 0x1d9: 0x3493, 0x1da: 0x319b, 0x1db: 0x34b1, + 0x1de: 0x3056, 0x1df: 0x3362, + 0x1e6: 0x4724, 0x1e7: 0x47b5, 0x1e8: 0x474c, 0x1e9: 0x47dd, + 0x1ea: 0x395b, 0x1eb: 0x3aea, 0x1ec: 0x3938, 0x1ed: 0x3ac7, 0x1ee: 0x476a, 0x1ef: 0x47fb, + 0x1f0: 0x3954, 0x1f1: 0x3ae3, 0x1f2: 0x3240, 0x1f3: 0x355b, + // Block 0x8, offset 0x200 + 0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132, + 0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932, + 0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932, + 0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d, + 0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d, + 0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d, + 0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d, + 0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d, + 0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101, + 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d, + 0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132, + // Block 0x9, offset 0x240 + 0x240: 0x4a40, 0x241: 0x4a45, 0x242: 0x9932, 0x243: 0x4a4a, 0x244: 0x4a4f, 0x245: 0x9936, + 0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132, + 0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132, + 0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132, + 0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135, + 0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132, + 0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132, + 0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132, + 0x274: 0x0170, + 0x27a: 0x8100, + 0x27e: 0x0037, + // Block 0xa, offset 0x280 + 0x284: 0x8100, 0x285: 0x359d, + 0x286: 0x35e5, 0x287: 0x00ce, 0x288: 0x3603, 0x289: 0x360f, 0x28a: 0x3621, + 0x28c: 0x363f, 0x28e: 0x3651, 0x28f: 0x366f, 0x290: 0x3e04, 0x291: 0xa000, + 0x295: 0xa000, 0x297: 0xa000, + 0x299: 0xa000, + 0x29f: 0xa000, 0x2a1: 0xa000, + 0x2a5: 0xa000, 0x2a9: 0xa000, + 0x2aa: 0x3633, 0x2ab: 0x3663, 0x2ac: 0x4890, 0x2ad: 0x3693, 0x2ae: 0x48ba, 0x2af: 0x36a5, + 0x2b0: 0x3e6c, 0x2b1: 0xa000, 0x2b5: 0xa000, + 0x2b7: 0xa000, 0x2b9: 0xa000, + 0x2bf: 0xa000, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x371d, 0x2c1: 0x3729, 0x2c3: 0x3717, + 0x2c6: 0xa000, 0x2c7: 0x3705, + 0x2cc: 0x3759, 0x2cd: 0x3741, 0x2ce: 0x376b, 0x2d0: 0xa000, + 0x2d3: 0xa000, 0x2d5: 0xa000, 0x2d6: 0xa000, 0x2d7: 0xa000, + 0x2d8: 0xa000, 0x2d9: 0x374d, 0x2da: 0xa000, + 0x2de: 0xa000, 0x2e3: 0xa000, + 0x2e7: 0xa000, + 0x2eb: 0xa000, 0x2ed: 0xa000, + 0x2f0: 0xa000, 0x2f3: 0xa000, 0x2f5: 0xa000, + 0x2f6: 0xa000, 0x2f7: 0xa000, 0x2f8: 0xa000, 0x2f9: 0x37d1, 0x2fa: 0xa000, + 0x2fe: 0xa000, + // Block 0xc, offset 0x300 + 0x301: 0x372f, 0x302: 0x37b3, + 0x310: 0x370b, 0x311: 0x378f, + 0x312: 0x3711, 0x313: 0x3795, 0x316: 0x3723, 0x317: 0x37a7, + 0x318: 0xa000, 0x319: 0xa000, 0x31a: 0x3825, 0x31b: 0x382b, 0x31c: 0x3735, 0x31d: 0x37b9, + 0x31e: 0x373b, 0x31f: 0x37bf, 0x322: 0x3747, 0x323: 0x37cb, + 0x324: 0x3753, 0x325: 0x37d7, 0x326: 0x375f, 0x327: 0x37e3, 0x328: 0xa000, 0x329: 0xa000, + 0x32a: 0x3831, 0x32b: 0x3837, 0x32c: 0x3789, 0x32d: 0x380d, 0x32e: 0x3765, 0x32f: 0x37e9, + 0x330: 0x3771, 0x331: 0x37f5, 0x332: 0x3777, 0x333: 0x37fb, 0x334: 0x377d, 0x335: 0x3801, + 0x338: 0x3783, 0x339: 0x3807, + // Block 0xd, offset 0x340 + 0x351: 0x812d, + 0x352: 0x8132, 0x353: 0x8132, 0x354: 0x8132, 0x355: 0x8132, 0x356: 0x812d, 0x357: 0x8132, + 0x358: 0x8132, 0x359: 0x8132, 0x35a: 0x812e, 0x35b: 0x812d, 0x35c: 0x8132, 0x35d: 0x8132, + 0x35e: 0x8132, 0x35f: 0x8132, 0x360: 0x8132, 0x361: 0x8132, 0x362: 0x812d, 0x363: 0x812d, + 0x364: 0x812d, 0x365: 0x812d, 0x366: 0x812d, 0x367: 0x812d, 0x368: 0x8132, 0x369: 0x8132, + 0x36a: 0x812d, 0x36b: 0x8132, 0x36c: 0x8132, 0x36d: 0x812e, 0x36e: 0x8131, 0x36f: 0x8132, + 0x370: 0x8105, 0x371: 0x8106, 0x372: 0x8107, 0x373: 0x8108, 0x374: 0x8109, 0x375: 0x810a, + 0x376: 0x810b, 0x377: 0x810c, 0x378: 0x810d, 0x379: 0x810e, 0x37a: 0x810e, 0x37b: 0x810f, + 0x37c: 0x8110, 0x37d: 0x8111, 0x37f: 0x8112, + // Block 0xe, offset 0x380 + 0x388: 0xa000, 0x38a: 0xa000, 0x38b: 0x8116, + 0x38c: 0x8117, 0x38d: 0x8118, 0x38e: 0x8119, 0x38f: 0x811a, 0x390: 0x811b, 0x391: 0x811c, + 0x392: 0x811d, 0x393: 0x9932, 0x394: 0x9932, 0x395: 0x992d, 0x396: 0x812d, 0x397: 0x8132, + 0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x8132, 0x39b: 0x8132, 0x39c: 0x812d, 0x39d: 0x8132, + 0x39e: 0x8132, 0x39f: 0x812d, + 0x3b0: 0x811e, + // Block 0xf, offset 0x3c0 + 0x3c5: 0xa000, + 0x3c6: 0x2d22, 0x3c7: 0xa000, 0x3c8: 0x2d2a, 0x3c9: 0xa000, 0x3ca: 0x2d32, 0x3cb: 0xa000, + 0x3cc: 0x2d3a, 0x3cd: 0xa000, 0x3ce: 0x2d42, 0x3d1: 0xa000, + 0x3d2: 0x2d4a, + 0x3f4: 0x8102, 0x3f5: 0x9900, + 0x3fa: 0xa000, 0x3fb: 0x2d52, + 0x3fc: 0xa000, 0x3fd: 0x2d5a, 0x3fe: 0xa000, 0x3ff: 0xa000, + // Block 0x10, offset 0x400 + 0x400: 0x2f93, 0x401: 0x329f, 0x402: 0x2f9d, 0x403: 0x32a9, 0x404: 0x2fa2, 0x405: 0x32ae, + 0x406: 0x2fa7, 0x407: 0x32b3, 0x408: 0x38c8, 0x409: 0x3a57, 0x40a: 0x2fc0, 0x40b: 0x32cc, + 0x40c: 0x2fca, 0x40d: 0x32d6, 0x40e: 0x2fd9, 0x40f: 0x32e5, 0x410: 0x2fcf, 0x411: 0x32db, + 0x412: 0x2fd4, 0x413: 0x32e0, 0x414: 0x38eb, 0x415: 0x3a7a, 0x416: 0x38f2, 0x417: 0x3a81, + 0x418: 0x3015, 0x419: 0x3321, 0x41a: 0x301a, 0x41b: 0x3326, 0x41c: 0x3900, 0x41d: 0x3a8f, + 0x41e: 0x301f, 0x41f: 0x332b, 0x420: 0x302e, 0x421: 0x333a, 0x422: 0x304c, 0x423: 0x3358, + 0x424: 0x305b, 0x425: 0x3367, 0x426: 0x3051, 0x427: 0x335d, 0x428: 0x3060, 0x429: 0x336c, + 0x42a: 0x3065, 0x42b: 0x3371, 0x42c: 0x30ab, 0x42d: 0x33b7, 0x42e: 0x3907, 0x42f: 0x3a96, + 0x430: 0x30b5, 0x431: 0x33c6, 0x432: 0x30bf, 0x433: 0x33d0, 0x434: 0x30c9, 0x435: 0x33da, + 0x436: 0x4756, 0x437: 0x47e7, 0x438: 0x390e, 0x439: 0x3a9d, 0x43a: 0x30e2, 0x43b: 0x33f3, + 0x43c: 0x30dd, 0x43d: 0x33ee, 0x43e: 0x30e7, 0x43f: 0x33f8, + // Block 0x11, offset 0x440 + 0x440: 0x30ec, 0x441: 0x33fd, 0x442: 0x30f1, 0x443: 0x3402, 0x444: 0x3105, 0x445: 0x3416, + 0x446: 0x310f, 0x447: 0x3420, 0x448: 0x311e, 0x449: 0x342f, 0x44a: 0x3119, 0x44b: 0x342a, + 0x44c: 0x3931, 0x44d: 0x3ac0, 0x44e: 0x393f, 0x44f: 0x3ace, 0x450: 0x3946, 0x451: 0x3ad5, + 0x452: 0x394d, 0x453: 0x3adc, 0x454: 0x314b, 0x455: 0x345c, 0x456: 0x3150, 0x457: 0x3461, + 0x458: 0x315a, 0x459: 0x346b, 0x45a: 0x4783, 0x45b: 0x4814, 0x45c: 0x3993, 0x45d: 0x3b22, + 0x45e: 0x3173, 0x45f: 0x3484, 0x460: 0x317d, 0x461: 0x348e, 0x462: 0x4792, 0x463: 0x4823, + 0x464: 0x399a, 0x465: 0x3b29, 0x466: 0x39a1, 0x467: 0x3b30, 0x468: 0x39a8, 0x469: 0x3b37, + 0x46a: 0x318c, 0x46b: 0x349d, 0x46c: 0x3196, 0x46d: 0x34ac, 0x46e: 0x31aa, 0x46f: 0x34c0, + 0x470: 0x31a5, 0x471: 0x34bb, 0x472: 0x31e6, 0x473: 0x34fc, 0x474: 0x31f5, 0x475: 0x350b, + 0x476: 0x31f0, 0x477: 0x3506, 0x478: 0x39af, 0x479: 0x3b3e, 0x47a: 0x39b6, 0x47b: 0x3b45, + 0x47c: 0x31fa, 0x47d: 0x3510, 0x47e: 0x31ff, 0x47f: 0x3515, + // Block 0x12, offset 0x480 + 0x480: 0x3204, 0x481: 0x351a, 0x482: 0x3209, 0x483: 0x351f, 0x484: 0x3218, 0x485: 0x352e, + 0x486: 0x3213, 0x487: 0x3529, 0x488: 0x321d, 0x489: 0x3538, 0x48a: 0x3222, 0x48b: 0x353d, + 0x48c: 0x3227, 0x48d: 0x3542, 0x48e: 0x3245, 0x48f: 0x3560, 0x490: 0x325e, 0x491: 0x357e, + 0x492: 0x326d, 0x493: 0x358d, 0x494: 0x3272, 0x495: 0x3592, 0x496: 0x3376, 0x497: 0x34a2, + 0x498: 0x3533, 0x499: 0x356f, 0x49b: 0x35cd, + 0x4a0: 0x4733, 0x4a1: 0x47c4, 0x4a2: 0x2f7f, 0x4a3: 0x328b, + 0x4a4: 0x3874, 0x4a5: 0x3a03, 0x4a6: 0x386d, 0x4a7: 0x39fc, 0x4a8: 0x3882, 0x4a9: 0x3a11, + 0x4aa: 0x387b, 0x4ab: 0x3a0a, 0x4ac: 0x38ba, 0x4ad: 0x3a49, 0x4ae: 0x3890, 0x4af: 0x3a1f, + 0x4b0: 0x3889, 0x4b1: 0x3a18, 0x4b2: 0x389e, 0x4b3: 0x3a2d, 0x4b4: 0x3897, 0x4b5: 0x3a26, + 0x4b6: 0x38c1, 0x4b7: 0x3a50, 0x4b8: 0x4747, 0x4b9: 0x47d8, 0x4ba: 0x2ffc, 0x4bb: 0x3308, + 0x4bc: 0x2fe8, 0x4bd: 0x32f4, 0x4be: 0x38d6, 0x4bf: 0x3a65, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x38cf, 0x4c1: 0x3a5e, 0x4c2: 0x38e4, 0x4c3: 0x3a73, 0x4c4: 0x38dd, 0x4c5: 0x3a6c, + 0x4c6: 0x38f9, 0x4c7: 0x3a88, 0x4c8: 0x308d, 0x4c9: 0x3399, 0x4ca: 0x30a1, 0x4cb: 0x33ad, + 0x4cc: 0x4779, 0x4cd: 0x480a, 0x4ce: 0x3132, 0x4cf: 0x3443, 0x4d0: 0x391c, 0x4d1: 0x3aab, + 0x4d2: 0x3915, 0x4d3: 0x3aa4, 0x4d4: 0x392a, 0x4d5: 0x3ab9, 0x4d6: 0x3923, 0x4d7: 0x3ab2, + 0x4d8: 0x3985, 0x4d9: 0x3b14, 0x4da: 0x3969, 0x4db: 0x3af8, 0x4dc: 0x3962, 0x4dd: 0x3af1, + 0x4de: 0x3977, 0x4df: 0x3b06, 0x4e0: 0x3970, 0x4e1: 0x3aff, 0x4e2: 0x397e, 0x4e3: 0x3b0d, + 0x4e4: 0x31e1, 0x4e5: 0x34f7, 0x4e6: 0x31c3, 0x4e7: 0x34d9, 0x4e8: 0x39e0, 0x4e9: 0x3b6f, + 0x4ea: 0x39d9, 0x4eb: 0x3b68, 0x4ec: 0x39ee, 0x4ed: 0x3b7d, 0x4ee: 0x39e7, 0x4ef: 0x3b76, + 0x4f0: 0x39f5, 0x4f1: 0x3b84, 0x4f2: 0x322c, 0x4f3: 0x3547, 0x4f4: 0x3254, 0x4f5: 0x3574, + 0x4f6: 0x324f, 0x4f7: 0x356a, 0x4f8: 0x323b, 0x4f9: 0x3556, + // Block 0x14, offset 0x500 + 0x500: 0x4896, 0x501: 0x489c, 0x502: 0x49b0, 0x503: 0x49c8, 0x504: 0x49b8, 0x505: 0x49d0, + 0x506: 0x49c0, 0x507: 0x49d8, 0x508: 0x483c, 0x509: 0x4842, 0x50a: 0x4920, 0x50b: 0x4938, + 0x50c: 0x4928, 0x50d: 0x4940, 0x50e: 0x4930, 0x50f: 0x4948, 0x510: 0x48a8, 0x511: 0x48ae, + 0x512: 0x3db4, 0x513: 0x3dc4, 0x514: 0x3dbc, 0x515: 0x3dcc, + 0x518: 0x4848, 0x519: 0x484e, 0x51a: 0x3ce4, 0x51b: 0x3cf4, 0x51c: 0x3cec, 0x51d: 0x3cfc, + 0x520: 0x48c0, 0x521: 0x48c6, 0x522: 0x49e0, 0x523: 0x49f8, + 0x524: 0x49e8, 0x525: 0x4a00, 0x526: 0x49f0, 0x527: 0x4a08, 0x528: 0x4854, 0x529: 0x485a, + 0x52a: 0x4950, 0x52b: 0x4968, 0x52c: 0x4958, 0x52d: 0x4970, 0x52e: 0x4960, 0x52f: 0x4978, + 0x530: 0x48d8, 0x531: 0x48de, 0x532: 0x3e14, 0x533: 0x3e2c, 0x534: 0x3e1c, 0x535: 0x3e34, + 0x536: 0x3e24, 0x537: 0x3e3c, 0x538: 0x4860, 0x539: 0x4866, 0x53a: 0x3d14, 0x53b: 0x3d2c, + 0x53c: 0x3d1c, 0x53d: 0x3d34, 0x53e: 0x3d24, 0x53f: 0x3d3c, + // Block 0x15, offset 0x540 + 0x540: 0x48e4, 0x541: 0x48ea, 0x542: 0x3e44, 0x543: 0x3e54, 0x544: 0x3e4c, 0x545: 0x3e5c, + 0x548: 0x486c, 0x549: 0x4872, 0x54a: 0x3d44, 0x54b: 0x3d54, + 0x54c: 0x3d4c, 0x54d: 0x3d5c, 0x550: 0x48f6, 0x551: 0x48fc, + 0x552: 0x3e7c, 0x553: 0x3e94, 0x554: 0x3e84, 0x555: 0x3e9c, 0x556: 0x3e8c, 0x557: 0x3ea4, + 0x559: 0x4878, 0x55b: 0x3d64, 0x55d: 0x3d6c, + 0x55f: 0x3d74, 0x560: 0x490e, 0x561: 0x4914, 0x562: 0x4a10, 0x563: 0x4a28, + 0x564: 0x4a18, 0x565: 0x4a30, 0x566: 0x4a20, 0x567: 0x4a38, 0x568: 0x487e, 0x569: 0x4884, + 0x56a: 0x4980, 0x56b: 0x4998, 0x56c: 0x4988, 0x56d: 0x49a0, 0x56e: 0x4990, 0x56f: 0x49a8, + 0x570: 0x488a, 0x571: 0x43b0, 0x572: 0x368d, 0x573: 0x43b6, 0x574: 0x48b4, 0x575: 0x43bc, + 0x576: 0x369f, 0x577: 0x43c2, 0x578: 0x36bd, 0x579: 0x43c8, 0x57a: 0x36d5, 0x57b: 0x43ce, + 0x57c: 0x4902, 0x57d: 0x43d4, + // Block 0x16, offset 0x580 + 0x580: 0x3d9c, 0x581: 0x3da4, 0x582: 0x4180, 0x583: 0x419e, 0x584: 0x418a, 0x585: 0x41a8, + 0x586: 0x4194, 0x587: 0x41b2, 0x588: 0x3cd4, 0x589: 0x3cdc, 0x58a: 0x40cc, 0x58b: 0x40ea, + 0x58c: 0x40d6, 0x58d: 0x40f4, 0x58e: 0x40e0, 0x58f: 0x40fe, 0x590: 0x3de4, 0x591: 0x3dec, + 0x592: 0x41bc, 0x593: 0x41da, 0x594: 0x41c6, 0x595: 0x41e4, 0x596: 0x41d0, 0x597: 0x41ee, + 0x598: 0x3d04, 0x599: 0x3d0c, 0x59a: 0x4108, 0x59b: 0x4126, 0x59c: 0x4112, 0x59d: 0x4130, + 0x59e: 0x411c, 0x59f: 0x413a, 0x5a0: 0x3ebc, 0x5a1: 0x3ec4, 0x5a2: 0x41f8, 0x5a3: 0x4216, + 0x5a4: 0x4202, 0x5a5: 0x4220, 0x5a6: 0x420c, 0x5a7: 0x422a, 0x5a8: 0x3d7c, 0x5a9: 0x3d84, + 0x5aa: 0x4144, 0x5ab: 0x4162, 0x5ac: 0x414e, 0x5ad: 0x416c, 0x5ae: 0x4158, 0x5af: 0x4176, + 0x5b0: 0x3681, 0x5b1: 0x367b, 0x5b2: 0x3d8c, 0x5b3: 0x3687, 0x5b4: 0x3d94, + 0x5b6: 0x48a2, 0x5b7: 0x3dac, 0x5b8: 0x35f1, 0x5b9: 0x35eb, 0x5ba: 0x35df, 0x5bb: 0x4380, + 0x5bc: 0x35f7, 0x5bd: 0x8100, 0x5be: 0x01d3, 0x5bf: 0xa100, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x8100, 0x5c1: 0x35a3, 0x5c2: 0x3dd4, 0x5c3: 0x3699, 0x5c4: 0x3ddc, + 0x5c6: 0x48cc, 0x5c7: 0x3df4, 0x5c8: 0x35fd, 0x5c9: 0x4386, 0x5ca: 0x3609, 0x5cb: 0x438c, + 0x5cc: 0x3615, 0x5cd: 0x3b8b, 0x5ce: 0x3b92, 0x5cf: 0x3b99, 0x5d0: 0x36b1, 0x5d1: 0x36ab, + 0x5d2: 0x3dfc, 0x5d3: 0x4576, 0x5d6: 0x36b7, 0x5d7: 0x3e0c, + 0x5d8: 0x362d, 0x5d9: 0x3627, 0x5da: 0x361b, 0x5db: 0x4392, 0x5dd: 0x3ba0, + 0x5de: 0x3ba7, 0x5df: 0x3bae, 0x5e0: 0x36e7, 0x5e1: 0x36e1, 0x5e2: 0x3e64, 0x5e3: 0x457e, + 0x5e4: 0x36c9, 0x5e5: 0x36cf, 0x5e6: 0x36ed, 0x5e7: 0x3e74, 0x5e8: 0x365d, 0x5e9: 0x3657, + 0x5ea: 0x364b, 0x5eb: 0x439e, 0x5ec: 0x3645, 0x5ed: 0x3597, 0x5ee: 0x437a, 0x5ef: 0x0081, + 0x5f2: 0x3eac, 0x5f3: 0x36f3, 0x5f4: 0x3eb4, + 0x5f6: 0x491a, 0x5f7: 0x3ecc, 0x5f8: 0x3639, 0x5f9: 0x4398, 0x5fa: 0x3669, 0x5fb: 0x43aa, + 0x5fc: 0x3675, 0x5fd: 0x4252, 0x5fe: 0xa100, + // Block 0x18, offset 0x600 + 0x601: 0x3c02, 0x603: 0xa000, 0x604: 0x3c09, 0x605: 0xa000, + 0x607: 0x3c10, 0x608: 0xa000, 0x609: 0x3c17, + 0x60d: 0xa000, + 0x620: 0x2f61, 0x621: 0xa000, 0x622: 0x3c25, + 0x624: 0xa000, 0x625: 0xa000, + 0x62d: 0x3c1e, 0x62e: 0x2f5c, 0x62f: 0x2f66, + 0x630: 0x3c2c, 0x631: 0x3c33, 0x632: 0xa000, 0x633: 0xa000, 0x634: 0x3c3a, 0x635: 0x3c41, + 0x636: 0xa000, 0x637: 0xa000, 0x638: 0x3c48, 0x639: 0x3c4f, 0x63a: 0xa000, 0x63b: 0xa000, + 0x63c: 0xa000, 0x63d: 0xa000, + // Block 0x19, offset 0x640 + 0x640: 0x3c56, 0x641: 0x3c5d, 0x642: 0xa000, 0x643: 0xa000, 0x644: 0x3c72, 0x645: 0x3c79, + 0x646: 0xa000, 0x647: 0xa000, 0x648: 0x3c80, 0x649: 0x3c87, + 0x651: 0xa000, + 0x652: 0xa000, + 0x662: 0xa000, + 0x668: 0xa000, 0x669: 0xa000, + 0x66b: 0xa000, 0x66c: 0x3c9c, 0x66d: 0x3ca3, 0x66e: 0x3caa, 0x66f: 0x3cb1, + 0x672: 0xa000, 0x673: 0xa000, 0x674: 0xa000, 0x675: 0xa000, + // Block 0x1a, offset 0x680 + 0x686: 0xa000, 0x68b: 0xa000, + 0x68c: 0x3f04, 0x68d: 0xa000, 0x68e: 0x3f0c, 0x68f: 0xa000, 0x690: 0x3f14, 0x691: 0xa000, + 0x692: 0x3f1c, 0x693: 0xa000, 0x694: 0x3f24, 0x695: 0xa000, 0x696: 0x3f2c, 0x697: 0xa000, + 0x698: 0x3f34, 0x699: 0xa000, 0x69a: 0x3f3c, 0x69b: 0xa000, 0x69c: 0x3f44, 0x69d: 0xa000, + 0x69e: 0x3f4c, 0x69f: 0xa000, 0x6a0: 0x3f54, 0x6a1: 0xa000, 0x6a2: 0x3f5c, + 0x6a4: 0xa000, 0x6a5: 0x3f64, 0x6a6: 0xa000, 0x6a7: 0x3f6c, 0x6a8: 0xa000, 0x6a9: 0x3f74, + 0x6af: 0xa000, + 0x6b0: 0x3f7c, 0x6b1: 0x3f84, 0x6b2: 0xa000, 0x6b3: 0x3f8c, 0x6b4: 0x3f94, 0x6b5: 0xa000, + 0x6b6: 0x3f9c, 0x6b7: 0x3fa4, 0x6b8: 0xa000, 0x6b9: 0x3fac, 0x6ba: 0x3fb4, 0x6bb: 0xa000, + 0x6bc: 0x3fbc, 0x6bd: 0x3fc4, + // Block 0x1b, offset 0x6c0 + 0x6d4: 0x3efc, + 0x6d9: 0x9903, 0x6da: 0x9903, 0x6db: 0x8100, 0x6dc: 0x8100, 0x6dd: 0xa000, + 0x6de: 0x3fcc, + 0x6e6: 0xa000, + 0x6eb: 0xa000, 0x6ec: 0x3fdc, 0x6ed: 0xa000, 0x6ee: 0x3fe4, 0x6ef: 0xa000, + 0x6f0: 0x3fec, 0x6f1: 0xa000, 0x6f2: 0x3ff4, 0x6f3: 0xa000, 0x6f4: 0x3ffc, 0x6f5: 0xa000, + 0x6f6: 0x4004, 0x6f7: 0xa000, 0x6f8: 0x400c, 0x6f9: 0xa000, 0x6fa: 0x4014, 0x6fb: 0xa000, + 0x6fc: 0x401c, 0x6fd: 0xa000, 0x6fe: 0x4024, 0x6ff: 0xa000, + // Block 0x1c, offset 0x700 + 0x700: 0x402c, 0x701: 0xa000, 0x702: 0x4034, 0x704: 0xa000, 0x705: 0x403c, + 0x706: 0xa000, 0x707: 0x4044, 0x708: 0xa000, 0x709: 0x404c, + 0x70f: 0xa000, 0x710: 0x4054, 0x711: 0x405c, + 0x712: 0xa000, 0x713: 0x4064, 0x714: 0x406c, 0x715: 0xa000, 0x716: 0x4074, 0x717: 0x407c, + 0x718: 0xa000, 0x719: 0x4084, 0x71a: 0x408c, 0x71b: 0xa000, 0x71c: 0x4094, 0x71d: 0x409c, + 0x72f: 0xa000, + 0x730: 0xa000, 0x731: 0xa000, 0x732: 0xa000, 0x734: 0x3fd4, + 0x737: 0x40a4, 0x738: 0x40ac, 0x739: 0x40b4, 0x73a: 0x40bc, + 0x73d: 0xa000, 0x73e: 0x40c4, + // Block 0x1d, offset 0x740 + 0x740: 0x1377, 0x741: 0x0cfb, 0x742: 0x13d3, 0x743: 0x139f, 0x744: 0x0e57, 0x745: 0x06eb, + 0x746: 0x08df, 0x747: 0x1627, 0x748: 0x1627, 0x749: 0x0a0b, 0x74a: 0x145b, 0x74b: 0x0943, + 0x74c: 0x0a07, 0x74d: 0x0bef, 0x74e: 0x0fcf, 0x74f: 0x115f, 0x750: 0x1297, 0x751: 0x12d3, + 0x752: 0x1307, 0x753: 0x141b, 0x754: 0x0d73, 0x755: 0x0dff, 0x756: 0x0eab, 0x757: 0x0f43, + 0x758: 0x125f, 0x759: 0x1443, 0x75a: 0x156f, 0x75b: 0x070f, 0x75c: 0x08b3, 0x75d: 0x0d87, + 0x75e: 0x0ecf, 0x75f: 0x1293, 0x760: 0x15bf, 0x761: 0x0ab3, 0x762: 0x0e77, 0x763: 0x1283, + 0x764: 0x1317, 0x765: 0x0c23, 0x766: 0x11bb, 0x767: 0x12df, 0x768: 0x0b1f, 0x769: 0x0d0f, + 0x76a: 0x0e17, 0x76b: 0x0f1b, 0x76c: 0x1427, 0x76d: 0x074f, 0x76e: 0x07e7, 0x76f: 0x0853, + 0x770: 0x0c8b, 0x771: 0x0d7f, 0x772: 0x0ecb, 0x773: 0x0fef, 0x774: 0x1177, 0x775: 0x128b, + 0x776: 0x12a3, 0x777: 0x13c7, 0x778: 0x14eb, 0x779: 0x159f, 0x77a: 0x15bb, 0x77b: 0x102b, + 0x77c: 0x106b, 0x77d: 0x1123, 0x77e: 0x1243, 0x77f: 0x1477, + // Block 0x1e, offset 0x780 + 0x780: 0x15c7, 0x781: 0x134b, 0x782: 0x09c7, 0x783: 0x0b3b, 0x784: 0x10db, 0x785: 0x119b, + 0x786: 0x0eff, 0x787: 0x1033, 0x788: 0x1397, 0x789: 0x14e3, 0x78a: 0x09c3, 0x78b: 0x0a8f, + 0x78c: 0x0d77, 0x78d: 0x0e2b, 0x78e: 0x0e5f, 0x78f: 0x1113, 0x790: 0x113b, 0x791: 0x14a3, + 0x792: 0x084f, 0x793: 0x11a7, 0x794: 0x07f3, 0x795: 0x07ef, 0x796: 0x1097, 0x797: 0x1127, + 0x798: 0x125b, 0x799: 0x14ab, 0x79a: 0x1367, 0x79b: 0x0c27, 0x79c: 0x0d73, 0x79d: 0x1357, + 0x79e: 0x06f7, 0x79f: 0x0a63, 0x7a0: 0x0b93, 0x7a1: 0x0f2f, 0x7a2: 0x0faf, 0x7a3: 0x0873, + 0x7a4: 0x103b, 0x7a5: 0x075f, 0x7a6: 0x0b77, 0x7a7: 0x06d7, 0x7a8: 0x0deb, 0x7a9: 0x0ca3, + 0x7aa: 0x110f, 0x7ab: 0x08c7, 0x7ac: 0x09b3, 0x7ad: 0x0ffb, 0x7ae: 0x1263, 0x7af: 0x133b, + 0x7b0: 0x0db7, 0x7b1: 0x13f7, 0x7b2: 0x0de3, 0x7b3: 0x0c37, 0x7b4: 0x121b, 0x7b5: 0x0c57, + 0x7b6: 0x0fab, 0x7b7: 0x072b, 0x7b8: 0x07a7, 0x7b9: 0x07eb, 0x7ba: 0x0d53, 0x7bb: 0x10fb, + 0x7bc: 0x11f3, 0x7bd: 0x1347, 0x7be: 0x1457, 0x7bf: 0x085b, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x090f, 0x7c1: 0x0a17, 0x7c2: 0x0b2f, 0x7c3: 0x0cbf, 0x7c4: 0x0e7b, 0x7c5: 0x103f, + 0x7c6: 0x1493, 0x7c7: 0x1577, 0x7c8: 0x15cb, 0x7c9: 0x15e3, 0x7ca: 0x0837, 0x7cb: 0x0cf3, + 0x7cc: 0x0da3, 0x7cd: 0x13eb, 0x7ce: 0x0afb, 0x7cf: 0x0bd7, 0x7d0: 0x0bf3, 0x7d1: 0x0c83, + 0x7d2: 0x0e6b, 0x7d3: 0x0eb7, 0x7d4: 0x0f67, 0x7d5: 0x108b, 0x7d6: 0x112f, 0x7d7: 0x1193, + 0x7d8: 0x13db, 0x7d9: 0x126b, 0x7da: 0x1403, 0x7db: 0x147b, 0x7dc: 0x080f, 0x7dd: 0x083b, + 0x7de: 0x0923, 0x7df: 0x0ea7, 0x7e0: 0x12f3, 0x7e1: 0x133b, 0x7e2: 0x0b1b, 0x7e3: 0x0b8b, + 0x7e4: 0x0c4f, 0x7e5: 0x0daf, 0x7e6: 0x10d7, 0x7e7: 0x0f23, 0x7e8: 0x073b, 0x7e9: 0x097f, + 0x7ea: 0x0a63, 0x7eb: 0x0ac7, 0x7ec: 0x0b97, 0x7ed: 0x0f3f, 0x7ee: 0x0f5b, 0x7ef: 0x116b, + 0x7f0: 0x118b, 0x7f1: 0x145f, 0x7f2: 0x14df, 0x7f3: 0x14ef, 0x7f4: 0x152b, 0x7f5: 0x0753, + 0x7f6: 0x107f, 0x7f7: 0x144b, 0x7f8: 0x14c7, 0x7f9: 0x0baf, 0x7fa: 0x0717, 0x7fb: 0x0777, + 0x7fc: 0x0a67, 0x7fd: 0x0a87, 0x7fe: 0x0caf, 0x7ff: 0x0d73, + // Block 0x20, offset 0x800 + 0x800: 0x0ec3, 0x801: 0x0fcb, 0x802: 0x1277, 0x803: 0x1417, 0x804: 0x161f, 0x805: 0x0ce3, + 0x806: 0x149f, 0x807: 0x0833, 0x808: 0x0d2f, 0x809: 0x0d3b, 0x80a: 0x0e0f, 0x80b: 0x0e47, + 0x80c: 0x0f4b, 0x80d: 0x0fa7, 0x80e: 0x1027, 0x80f: 0x110b, 0x810: 0x1537, 0x811: 0x07af, + 0x812: 0x0c03, 0x813: 0x14af, 0x814: 0x0767, 0x815: 0x0aab, 0x816: 0x0e2f, 0x817: 0x13df, + 0x818: 0x0b67, 0x819: 0x0bb7, 0x81a: 0x0d43, 0x81b: 0x0f2f, 0x81c: 0x14b7, 0x81d: 0x0817, + 0x81e: 0x08ff, 0x81f: 0x0a97, 0x820: 0x0cd3, 0x821: 0x0d1f, 0x822: 0x0d5f, 0x823: 0x0df3, + 0x824: 0x0f47, 0x825: 0x0fbb, 0x826: 0x1157, 0x827: 0x12f7, 0x828: 0x1303, 0x829: 0x1453, + 0x82a: 0x14d3, 0x82b: 0x0883, 0x82c: 0x0e4b, 0x82d: 0x0903, 0x82e: 0x0ec7, 0x82f: 0x0f6b, + 0x830: 0x1287, 0x831: 0x14bb, 0x832: 0x15a7, 0x833: 0x15cf, 0x834: 0x0d37, 0x835: 0x0e27, + 0x836: 0x11c3, 0x837: 0x10b7, 0x838: 0x10c3, 0x839: 0x10e7, 0x83a: 0x0f17, 0x83b: 0x0e9f, + 0x83c: 0x1363, 0x83d: 0x0733, 0x83e: 0x122b, 0x83f: 0x081b, + // Block 0x21, offset 0x840 + 0x840: 0x080b, 0x841: 0x0b0b, 0x842: 0x0c2b, 0x843: 0x10f3, 0x844: 0x0a53, 0x845: 0x0e03, + 0x846: 0x0cef, 0x847: 0x13e7, 0x848: 0x12e7, 0x849: 0x14a7, 0x84a: 0x1323, 0x84b: 0x0b27, + 0x84c: 0x0787, 0x84d: 0x095b, 0x850: 0x09af, + 0x852: 0x0cdf, 0x855: 0x07f7, 0x856: 0x0f1f, 0x857: 0x0fe3, + 0x858: 0x1047, 0x859: 0x1063, 0x85a: 0x1067, 0x85b: 0x107b, 0x85c: 0x14f7, 0x85d: 0x10eb, + 0x85e: 0x116f, 0x860: 0x128f, 0x862: 0x1353, + 0x865: 0x1407, 0x866: 0x1433, + 0x86a: 0x154b, 0x86b: 0x154f, 0x86c: 0x1553, 0x86d: 0x15b7, 0x86e: 0x142b, 0x86f: 0x14c3, + 0x870: 0x0757, 0x871: 0x077b, 0x872: 0x078f, 0x873: 0x084b, 0x874: 0x0857, 0x875: 0x0897, + 0x876: 0x094b, 0x877: 0x0967, 0x878: 0x096f, 0x879: 0x09ab, 0x87a: 0x09b7, 0x87b: 0x0a93, + 0x87c: 0x0a9b, 0x87d: 0x0ba3, 0x87e: 0x0bcb, 0x87f: 0x0bd3, + // Block 0x22, offset 0x880 + 0x880: 0x0beb, 0x881: 0x0c97, 0x882: 0x0cc7, 0x883: 0x0ce7, 0x884: 0x0d57, 0x885: 0x0e1b, + 0x886: 0x0e37, 0x887: 0x0e67, 0x888: 0x0ebb, 0x889: 0x0edb, 0x88a: 0x0f4f, 0x88b: 0x102f, + 0x88c: 0x104b, 0x88d: 0x1053, 0x88e: 0x104f, 0x88f: 0x1057, 0x890: 0x105b, 0x891: 0x105f, + 0x892: 0x1073, 0x893: 0x1077, 0x894: 0x109b, 0x895: 0x10af, 0x896: 0x10cb, 0x897: 0x112f, + 0x898: 0x1137, 0x899: 0x113f, 0x89a: 0x1153, 0x89b: 0x117b, 0x89c: 0x11cb, 0x89d: 0x11ff, + 0x89e: 0x11ff, 0x89f: 0x1267, 0x8a0: 0x130f, 0x8a1: 0x1327, 0x8a2: 0x135b, 0x8a3: 0x135f, + 0x8a4: 0x13a3, 0x8a5: 0x13a7, 0x8a6: 0x13ff, 0x8a7: 0x1407, 0x8a8: 0x14d7, 0x8a9: 0x151b, + 0x8aa: 0x1533, 0x8ab: 0x0b9b, 0x8ac: 0x171a, 0x8ad: 0x11e3, + 0x8b0: 0x06df, 0x8b1: 0x07e3, 0x8b2: 0x07a3, 0x8b3: 0x074b, 0x8b4: 0x078b, 0x8b5: 0x07b7, + 0x8b6: 0x0847, 0x8b7: 0x0863, 0x8b8: 0x094b, 0x8b9: 0x0937, 0x8ba: 0x0947, 0x8bb: 0x0963, + 0x8bc: 0x09af, 0x8bd: 0x09bf, 0x8be: 0x0a03, 0x8bf: 0x0a0f, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x0a2b, 0x8c1: 0x0a3b, 0x8c2: 0x0b23, 0x8c3: 0x0b2b, 0x8c4: 0x0b5b, 0x8c5: 0x0b7b, + 0x8c6: 0x0bab, 0x8c7: 0x0bc3, 0x8c8: 0x0bb3, 0x8c9: 0x0bd3, 0x8ca: 0x0bc7, 0x8cb: 0x0beb, + 0x8cc: 0x0c07, 0x8cd: 0x0c5f, 0x8ce: 0x0c6b, 0x8cf: 0x0c73, 0x8d0: 0x0c9b, 0x8d1: 0x0cdf, + 0x8d2: 0x0d0f, 0x8d3: 0x0d13, 0x8d4: 0x0d27, 0x8d5: 0x0da7, 0x8d6: 0x0db7, 0x8d7: 0x0e0f, + 0x8d8: 0x0e5b, 0x8d9: 0x0e53, 0x8da: 0x0e67, 0x8db: 0x0e83, 0x8dc: 0x0ebb, 0x8dd: 0x1013, + 0x8de: 0x0edf, 0x8df: 0x0f13, 0x8e0: 0x0f1f, 0x8e1: 0x0f5f, 0x8e2: 0x0f7b, 0x8e3: 0x0f9f, + 0x8e4: 0x0fc3, 0x8e5: 0x0fc7, 0x8e6: 0x0fe3, 0x8e7: 0x0fe7, 0x8e8: 0x0ff7, 0x8e9: 0x100b, + 0x8ea: 0x1007, 0x8eb: 0x1037, 0x8ec: 0x10b3, 0x8ed: 0x10cb, 0x8ee: 0x10e3, 0x8ef: 0x111b, + 0x8f0: 0x112f, 0x8f1: 0x114b, 0x8f2: 0x117b, 0x8f3: 0x122f, 0x8f4: 0x1257, 0x8f5: 0x12cb, + 0x8f6: 0x1313, 0x8f7: 0x131f, 0x8f8: 0x1327, 0x8f9: 0x133f, 0x8fa: 0x1353, 0x8fb: 0x1343, + 0x8fc: 0x135b, 0x8fd: 0x1357, 0x8fe: 0x134f, 0x8ff: 0x135f, + // Block 0x24, offset 0x900 + 0x900: 0x136b, 0x901: 0x13a7, 0x902: 0x13e3, 0x903: 0x1413, 0x904: 0x1447, 0x905: 0x1467, + 0x906: 0x14b3, 0x907: 0x14d7, 0x908: 0x14f7, 0x909: 0x150b, 0x90a: 0x151b, 0x90b: 0x1527, + 0x90c: 0x1533, 0x90d: 0x1587, 0x90e: 0x1627, 0x90f: 0x16b1, 0x910: 0x16ac, 0x911: 0x16de, + 0x912: 0x0607, 0x913: 0x062f, 0x914: 0x0633, 0x915: 0x1760, 0x916: 0x178d, 0x917: 0x1805, + 0x918: 0x1613, 0x919: 0x1623, + // Block 0x25, offset 0x940 + 0x940: 0x06fb, 0x941: 0x06f3, 0x942: 0x0703, 0x943: 0x1643, 0x944: 0x0747, 0x945: 0x0757, + 0x946: 0x075b, 0x947: 0x0763, 0x948: 0x076b, 0x949: 0x076f, 0x94a: 0x077b, 0x94b: 0x0773, + 0x94c: 0x05b3, 0x94d: 0x1657, 0x94e: 0x078f, 0x94f: 0x0793, 0x950: 0x0797, 0x951: 0x07b3, + 0x952: 0x1648, 0x953: 0x05b7, 0x954: 0x079f, 0x955: 0x07bf, 0x956: 0x1652, 0x957: 0x07cf, + 0x958: 0x07d7, 0x959: 0x0737, 0x95a: 0x07df, 0x95b: 0x07e3, 0x95c: 0x182d, 0x95d: 0x07ff, + 0x95e: 0x0807, 0x95f: 0x05bf, 0x960: 0x081f, 0x961: 0x0823, 0x962: 0x082b, 0x963: 0x082f, + 0x964: 0x05c3, 0x965: 0x0847, 0x966: 0x084b, 0x967: 0x0857, 0x968: 0x0863, 0x969: 0x0867, + 0x96a: 0x086b, 0x96b: 0x0873, 0x96c: 0x0893, 0x96d: 0x0897, 0x96e: 0x089f, 0x96f: 0x08af, + 0x970: 0x08b7, 0x971: 0x08bb, 0x972: 0x08bb, 0x973: 0x08bb, 0x974: 0x1666, 0x975: 0x0e93, + 0x976: 0x08cf, 0x977: 0x08d7, 0x978: 0x166b, 0x979: 0x08e3, 0x97a: 0x08eb, 0x97b: 0x08f3, + 0x97c: 0x091b, 0x97d: 0x0907, 0x97e: 0x0913, 0x97f: 0x0917, + // Block 0x26, offset 0x980 + 0x980: 0x091f, 0x981: 0x0927, 0x982: 0x092b, 0x983: 0x0933, 0x984: 0x093b, 0x985: 0x093f, + 0x986: 0x093f, 0x987: 0x0947, 0x988: 0x094f, 0x989: 0x0953, 0x98a: 0x095f, 0x98b: 0x0983, + 0x98c: 0x0967, 0x98d: 0x0987, 0x98e: 0x096b, 0x98f: 0x0973, 0x990: 0x080b, 0x991: 0x09cf, + 0x992: 0x0997, 0x993: 0x099b, 0x994: 0x099f, 0x995: 0x0993, 0x996: 0x09a7, 0x997: 0x09a3, + 0x998: 0x09bb, 0x999: 0x1670, 0x99a: 0x09d7, 0x99b: 0x09db, 0x99c: 0x09e3, 0x99d: 0x09ef, + 0x99e: 0x09f7, 0x99f: 0x0a13, 0x9a0: 0x1675, 0x9a1: 0x167a, 0x9a2: 0x0a1f, 0x9a3: 0x0a23, + 0x9a4: 0x0a27, 0x9a5: 0x0a1b, 0x9a6: 0x0a2f, 0x9a7: 0x05c7, 0x9a8: 0x05cb, 0x9a9: 0x0a37, + 0x9aa: 0x0a3f, 0x9ab: 0x0a3f, 0x9ac: 0x167f, 0x9ad: 0x0a5b, 0x9ae: 0x0a5f, 0x9af: 0x0a63, + 0x9b0: 0x0a6b, 0x9b1: 0x1684, 0x9b2: 0x0a73, 0x9b3: 0x0a77, 0x9b4: 0x0b4f, 0x9b5: 0x0a7f, + 0x9b6: 0x05cf, 0x9b7: 0x0a8b, 0x9b8: 0x0a9b, 0x9b9: 0x0aa7, 0x9ba: 0x0aa3, 0x9bb: 0x168e, + 0x9bc: 0x0aaf, 0x9bd: 0x1693, 0x9be: 0x0abb, 0x9bf: 0x0ab7, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x0abf, 0x9c1: 0x0acf, 0x9c2: 0x0ad3, 0x9c3: 0x05d3, 0x9c4: 0x0ae3, 0x9c5: 0x0aeb, + 0x9c6: 0x0aef, 0x9c7: 0x0af3, 0x9c8: 0x05d7, 0x9c9: 0x1698, 0x9ca: 0x05db, 0x9cb: 0x0b0f, + 0x9cc: 0x0b13, 0x9cd: 0x0b17, 0x9ce: 0x0b1f, 0x9cf: 0x185f, 0x9d0: 0x0b37, 0x9d1: 0x16a2, + 0x9d2: 0x16a2, 0x9d3: 0x11d7, 0x9d4: 0x0b47, 0x9d5: 0x0b47, 0x9d6: 0x05df, 0x9d7: 0x16c5, + 0x9d8: 0x1797, 0x9d9: 0x0b57, 0x9da: 0x0b5f, 0x9db: 0x05e3, 0x9dc: 0x0b73, 0x9dd: 0x0b83, + 0x9de: 0x0b87, 0x9df: 0x0b8f, 0x9e0: 0x0b9f, 0x9e1: 0x05eb, 0x9e2: 0x05e7, 0x9e3: 0x0ba3, + 0x9e4: 0x16a7, 0x9e5: 0x0ba7, 0x9e6: 0x0bbb, 0x9e7: 0x0bbf, 0x9e8: 0x0bc3, 0x9e9: 0x0bbf, + 0x9ea: 0x0bcf, 0x9eb: 0x0bd3, 0x9ec: 0x0be3, 0x9ed: 0x0bdb, 0x9ee: 0x0bdf, 0x9ef: 0x0be7, + 0x9f0: 0x0beb, 0x9f1: 0x0bef, 0x9f2: 0x0bfb, 0x9f3: 0x0bff, 0x9f4: 0x0c17, 0x9f5: 0x0c1f, + 0x9f6: 0x0c2f, 0x9f7: 0x0c43, 0x9f8: 0x16b6, 0x9f9: 0x0c3f, 0x9fa: 0x0c33, 0x9fb: 0x0c4b, + 0x9fc: 0x0c53, 0x9fd: 0x0c67, 0x9fe: 0x16bb, 0x9ff: 0x0c6f, + // Block 0x28, offset 0xa00 + 0xa00: 0x0c63, 0xa01: 0x0c5b, 0xa02: 0x05ef, 0xa03: 0x0c77, 0xa04: 0x0c7f, 0xa05: 0x0c87, + 0xa06: 0x0c7b, 0xa07: 0x05f3, 0xa08: 0x0c97, 0xa09: 0x0c9f, 0xa0a: 0x16c0, 0xa0b: 0x0ccb, + 0xa0c: 0x0cff, 0xa0d: 0x0cdb, 0xa0e: 0x05ff, 0xa0f: 0x0ce7, 0xa10: 0x05fb, 0xa11: 0x05f7, + 0xa12: 0x07c3, 0xa13: 0x07c7, 0xa14: 0x0d03, 0xa15: 0x0ceb, 0xa16: 0x11ab, 0xa17: 0x0663, + 0xa18: 0x0d0f, 0xa19: 0x0d13, 0xa1a: 0x0d17, 0xa1b: 0x0d2b, 0xa1c: 0x0d23, 0xa1d: 0x16d9, + 0xa1e: 0x0603, 0xa1f: 0x0d3f, 0xa20: 0x0d33, 0xa21: 0x0d4f, 0xa22: 0x0d57, 0xa23: 0x16e3, + 0xa24: 0x0d5b, 0xa25: 0x0d47, 0xa26: 0x0d63, 0xa27: 0x0607, 0xa28: 0x0d67, 0xa29: 0x0d6b, + 0xa2a: 0x0d6f, 0xa2b: 0x0d7b, 0xa2c: 0x16e8, 0xa2d: 0x0d83, 0xa2e: 0x060b, 0xa2f: 0x0d8f, + 0xa30: 0x16ed, 0xa31: 0x0d93, 0xa32: 0x060f, 0xa33: 0x0d9f, 0xa34: 0x0dab, 0xa35: 0x0db7, + 0xa36: 0x0dbb, 0xa37: 0x16f2, 0xa38: 0x1689, 0xa39: 0x16f7, 0xa3a: 0x0ddb, 0xa3b: 0x16fc, + 0xa3c: 0x0de7, 0xa3d: 0x0def, 0xa3e: 0x0ddf, 0xa3f: 0x0dfb, + // Block 0x29, offset 0xa40 + 0xa40: 0x0e0b, 0xa41: 0x0e1b, 0xa42: 0x0e0f, 0xa43: 0x0e13, 0xa44: 0x0e1f, 0xa45: 0x0e23, + 0xa46: 0x1701, 0xa47: 0x0e07, 0xa48: 0x0e3b, 0xa49: 0x0e3f, 0xa4a: 0x0613, 0xa4b: 0x0e53, + 0xa4c: 0x0e4f, 0xa4d: 0x1706, 0xa4e: 0x0e33, 0xa4f: 0x0e6f, 0xa50: 0x170b, 0xa51: 0x1710, + 0xa52: 0x0e73, 0xa53: 0x0e87, 0xa54: 0x0e83, 0xa55: 0x0e7f, 0xa56: 0x0617, 0xa57: 0x0e8b, + 0xa58: 0x0e9b, 0xa59: 0x0e97, 0xa5a: 0x0ea3, 0xa5b: 0x164d, 0xa5c: 0x0eb3, 0xa5d: 0x1715, + 0xa5e: 0x0ebf, 0xa5f: 0x171f, 0xa60: 0x0ed3, 0xa61: 0x0edf, 0xa62: 0x0ef3, 0xa63: 0x1724, + 0xa64: 0x0f07, 0xa65: 0x0f0b, 0xa66: 0x1729, 0xa67: 0x172e, 0xa68: 0x0f27, 0xa69: 0x0f37, + 0xa6a: 0x061b, 0xa6b: 0x0f3b, 0xa6c: 0x061f, 0xa6d: 0x061f, 0xa6e: 0x0f53, 0xa6f: 0x0f57, + 0xa70: 0x0f5f, 0xa71: 0x0f63, 0xa72: 0x0f6f, 0xa73: 0x0623, 0xa74: 0x0f87, 0xa75: 0x1733, + 0xa76: 0x0fa3, 0xa77: 0x1738, 0xa78: 0x0faf, 0xa79: 0x169d, 0xa7a: 0x0fbf, 0xa7b: 0x173d, + 0xa7c: 0x1742, 0xa7d: 0x1747, 0xa7e: 0x0627, 0xa7f: 0x062b, + // Block 0x2a, offset 0xa80 + 0xa80: 0x0ff7, 0xa81: 0x1751, 0xa82: 0x174c, 0xa83: 0x1756, 0xa84: 0x175b, 0xa85: 0x0fff, + 0xa86: 0x1003, 0xa87: 0x1003, 0xa88: 0x100b, 0xa89: 0x0633, 0xa8a: 0x100f, 0xa8b: 0x0637, + 0xa8c: 0x063b, 0xa8d: 0x1765, 0xa8e: 0x1023, 0xa8f: 0x102b, 0xa90: 0x1037, 0xa91: 0x063f, + 0xa92: 0x176a, 0xa93: 0x105b, 0xa94: 0x176f, 0xa95: 0x1774, 0xa96: 0x107b, 0xa97: 0x1093, + 0xa98: 0x0643, 0xa99: 0x109b, 0xa9a: 0x109f, 0xa9b: 0x10a3, 0xa9c: 0x1779, 0xa9d: 0x177e, + 0xa9e: 0x177e, 0xa9f: 0x10bb, 0xaa0: 0x0647, 0xaa1: 0x1783, 0xaa2: 0x10cf, 0xaa3: 0x10d3, + 0xaa4: 0x064b, 0xaa5: 0x1788, 0xaa6: 0x10ef, 0xaa7: 0x064f, 0xaa8: 0x10ff, 0xaa9: 0x10f7, + 0xaaa: 0x1107, 0xaab: 0x1792, 0xaac: 0x111f, 0xaad: 0x0653, 0xaae: 0x112b, 0xaaf: 0x1133, + 0xab0: 0x1143, 0xab1: 0x0657, 0xab2: 0x179c, 0xab3: 0x17a1, 0xab4: 0x065b, 0xab5: 0x17a6, + 0xab6: 0x115b, 0xab7: 0x17ab, 0xab8: 0x1167, 0xab9: 0x1173, 0xaba: 0x117b, 0xabb: 0x17b0, + 0xabc: 0x17b5, 0xabd: 0x118f, 0xabe: 0x17ba, 0xabf: 0x1197, + // Block 0x2b, offset 0xac0 + 0xac0: 0x16ca, 0xac1: 0x065f, 0xac2: 0x11af, 0xac3: 0x11b3, 0xac4: 0x0667, 0xac5: 0x11b7, + 0xac6: 0x0a33, 0xac7: 0x17bf, 0xac8: 0x17c4, 0xac9: 0x16cf, 0xaca: 0x16d4, 0xacb: 0x11d7, + 0xacc: 0x11db, 0xacd: 0x13f3, 0xace: 0x066b, 0xacf: 0x1207, 0xad0: 0x1203, 0xad1: 0x120b, + 0xad2: 0x083f, 0xad3: 0x120f, 0xad4: 0x1213, 0xad5: 0x1217, 0xad6: 0x121f, 0xad7: 0x17c9, + 0xad8: 0x121b, 0xad9: 0x1223, 0xada: 0x1237, 0xadb: 0x123b, 0xadc: 0x1227, 0xadd: 0x123f, + 0xade: 0x1253, 0xadf: 0x1267, 0xae0: 0x1233, 0xae1: 0x1247, 0xae2: 0x124b, 0xae3: 0x124f, + 0xae4: 0x17ce, 0xae5: 0x17d8, 0xae6: 0x17d3, 0xae7: 0x066f, 0xae8: 0x126f, 0xae9: 0x1273, + 0xaea: 0x127b, 0xaeb: 0x17ec, 0xaec: 0x127f, 0xaed: 0x17dd, 0xaee: 0x0673, 0xaef: 0x0677, + 0xaf0: 0x17e2, 0xaf1: 0x17e7, 0xaf2: 0x067b, 0xaf3: 0x129f, 0xaf4: 0x12a3, 0xaf5: 0x12a7, + 0xaf6: 0x12ab, 0xaf7: 0x12b7, 0xaf8: 0x12b3, 0xaf9: 0x12bf, 0xafa: 0x12bb, 0xafb: 0x12cb, + 0xafc: 0x12c3, 0xafd: 0x12c7, 0xafe: 0x12cf, 0xaff: 0x067f, + // Block 0x2c, offset 0xb00 + 0xb00: 0x12d7, 0xb01: 0x12db, 0xb02: 0x0683, 0xb03: 0x12eb, 0xb04: 0x12ef, 0xb05: 0x17f1, + 0xb06: 0x12fb, 0xb07: 0x12ff, 0xb08: 0x0687, 0xb09: 0x130b, 0xb0a: 0x05bb, 0xb0b: 0x17f6, + 0xb0c: 0x17fb, 0xb0d: 0x068b, 0xb0e: 0x068f, 0xb0f: 0x1337, 0xb10: 0x134f, 0xb11: 0x136b, + 0xb12: 0x137b, 0xb13: 0x1800, 0xb14: 0x138f, 0xb15: 0x1393, 0xb16: 0x13ab, 0xb17: 0x13b7, + 0xb18: 0x180a, 0xb19: 0x165c, 0xb1a: 0x13c3, 0xb1b: 0x13bf, 0xb1c: 0x13cb, 0xb1d: 0x1661, + 0xb1e: 0x13d7, 0xb1f: 0x13e3, 0xb20: 0x180f, 0xb21: 0x1814, 0xb22: 0x1423, 0xb23: 0x142f, + 0xb24: 0x1437, 0xb25: 0x1819, 0xb26: 0x143b, 0xb27: 0x1463, 0xb28: 0x146f, 0xb29: 0x1473, + 0xb2a: 0x146b, 0xb2b: 0x147f, 0xb2c: 0x1483, 0xb2d: 0x181e, 0xb2e: 0x148f, 0xb2f: 0x0693, + 0xb30: 0x1497, 0xb31: 0x1823, 0xb32: 0x0697, 0xb33: 0x14cf, 0xb34: 0x0ac3, 0xb35: 0x14e7, + 0xb36: 0x1828, 0xb37: 0x1832, 0xb38: 0x069b, 0xb39: 0x069f, 0xb3a: 0x150f, 0xb3b: 0x1837, + 0xb3c: 0x06a3, 0xb3d: 0x183c, 0xb3e: 0x1527, 0xb3f: 0x1527, + // Block 0x2d, offset 0xb40 + 0xb40: 0x152f, 0xb41: 0x1841, 0xb42: 0x1547, 0xb43: 0x06a7, 0xb44: 0x1557, 0xb45: 0x1563, + 0xb46: 0x156b, 0xb47: 0x1573, 0xb48: 0x06ab, 0xb49: 0x1846, 0xb4a: 0x1587, 0xb4b: 0x15a3, + 0xb4c: 0x15af, 0xb4d: 0x06af, 0xb4e: 0x06b3, 0xb4f: 0x15b3, 0xb50: 0x184b, 0xb51: 0x06b7, + 0xb52: 0x1850, 0xb53: 0x1855, 0xb54: 0x185a, 0xb55: 0x15d7, 0xb56: 0x06bb, 0xb57: 0x15eb, + 0xb58: 0x15f3, 0xb59: 0x15f7, 0xb5a: 0x15ff, 0xb5b: 0x1607, 0xb5c: 0x160f, 0xb5d: 0x1864, +} + +// nfcIndex: 22 blocks, 1408 entries, 1408 bytes +// Block 0 is the zero block. +var nfcIndex = [1408]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x2c, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x2d, 0xc7: 0x04, + 0xc8: 0x05, 0xca: 0x2e, 0xcb: 0x2f, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x30, + 0xd0: 0x09, 0xd1: 0x31, 0xd2: 0x32, 0xd3: 0x0a, 0xd6: 0x0b, 0xd7: 0x33, + 0xd8: 0x34, 0xd9: 0x0c, 0xdb: 0x35, 0xdc: 0x36, 0xdd: 0x37, 0xdf: 0x38, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, + 0xf0: 0x13, + // Block 0x4, offset 0x100 + 0x120: 0x39, 0x121: 0x3a, 0x123: 0x3b, 0x124: 0x3c, 0x125: 0x3d, 0x126: 0x3e, 0x127: 0x3f, + 0x128: 0x40, 0x129: 0x41, 0x12a: 0x42, 0x12b: 0x43, 0x12c: 0x3e, 0x12d: 0x44, 0x12e: 0x45, 0x12f: 0x46, + 0x131: 0x47, 0x132: 0x48, 0x133: 0x49, 0x134: 0x4a, 0x135: 0x4b, 0x137: 0x4c, + 0x138: 0x4d, 0x139: 0x4e, 0x13a: 0x4f, 0x13b: 0x50, 0x13c: 0x51, 0x13d: 0x52, 0x13e: 0x53, 0x13f: 0x54, + // Block 0x5, offset 0x140 + 0x140: 0x55, 0x142: 0x56, 0x144: 0x57, 0x145: 0x58, 0x146: 0x59, 0x147: 0x5a, + 0x14d: 0x5b, + 0x15c: 0x5c, 0x15f: 0x5d, + 0x162: 0x5e, 0x164: 0x5f, + 0x168: 0x60, 0x169: 0x61, 0x16a: 0x62, 0x16c: 0x0d, 0x16d: 0x63, 0x16e: 0x64, 0x16f: 0x65, + 0x170: 0x66, 0x173: 0x67, 0x177: 0x68, + 0x178: 0x0e, 0x179: 0x0f, 0x17a: 0x10, 0x17b: 0x11, 0x17c: 0x12, 0x17d: 0x13, 0x17e: 0x14, 0x17f: 0x15, + // Block 0x6, offset 0x180 + 0x180: 0x69, 0x183: 0x6a, 0x184: 0x6b, 0x186: 0x6c, 0x187: 0x6d, + 0x188: 0x6e, 0x189: 0x16, 0x18a: 0x17, 0x18b: 0x6f, 0x18c: 0x70, + 0x1ab: 0x71, + 0x1b3: 0x72, 0x1b5: 0x73, 0x1b7: 0x74, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x75, 0x1c1: 0x18, 0x1c2: 0x19, 0x1c3: 0x1a, 0x1c4: 0x76, 0x1c5: 0x77, + 0x1c9: 0x78, 0x1cc: 0x79, 0x1cd: 0x7a, + // Block 0x8, offset 0x200 + 0x219: 0x7b, 0x21a: 0x7c, 0x21b: 0x7d, + 0x220: 0x7e, 0x223: 0x7f, 0x224: 0x80, 0x225: 0x81, 0x226: 0x82, 0x227: 0x83, + 0x22a: 0x84, 0x22b: 0x85, 0x22f: 0x86, + 0x230: 0x87, 0x231: 0x88, 0x232: 0x89, 0x233: 0x8a, 0x234: 0x8b, 0x235: 0x8c, 0x236: 0x8d, 0x237: 0x87, + 0x238: 0x88, 0x239: 0x89, 0x23a: 0x8a, 0x23b: 0x8b, 0x23c: 0x8c, 0x23d: 0x8d, 0x23e: 0x87, 0x23f: 0x88, + // Block 0x9, offset 0x240 + 0x240: 0x89, 0x241: 0x8a, 0x242: 0x8b, 0x243: 0x8c, 0x244: 0x8d, 0x245: 0x87, 0x246: 0x88, 0x247: 0x89, + 0x248: 0x8a, 0x249: 0x8b, 0x24a: 0x8c, 0x24b: 0x8d, 0x24c: 0x87, 0x24d: 0x88, 0x24e: 0x89, 0x24f: 0x8a, + 0x250: 0x8b, 0x251: 0x8c, 0x252: 0x8d, 0x253: 0x87, 0x254: 0x88, 0x255: 0x89, 0x256: 0x8a, 0x257: 0x8b, + 0x258: 0x8c, 0x259: 0x8d, 0x25a: 0x87, 0x25b: 0x88, 0x25c: 0x89, 0x25d: 0x8a, 0x25e: 0x8b, 0x25f: 0x8c, + 0x260: 0x8d, 0x261: 0x87, 0x262: 0x88, 0x263: 0x89, 0x264: 0x8a, 0x265: 0x8b, 0x266: 0x8c, 0x267: 0x8d, + 0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26c: 0x8b, 0x26d: 0x8c, 0x26e: 0x8d, 0x26f: 0x87, + 0x270: 0x88, 0x271: 0x89, 0x272: 0x8a, 0x273: 0x8b, 0x274: 0x8c, 0x275: 0x8d, 0x276: 0x87, 0x277: 0x88, + 0x278: 0x89, 0x279: 0x8a, 0x27a: 0x8b, 0x27b: 0x8c, 0x27c: 0x8d, 0x27d: 0x87, 0x27e: 0x88, 0x27f: 0x89, + // Block 0xa, offset 0x280 + 0x280: 0x8a, 0x281: 0x8b, 0x282: 0x8c, 0x283: 0x8d, 0x284: 0x87, 0x285: 0x88, 0x286: 0x89, 0x287: 0x8a, + 0x288: 0x8b, 0x289: 0x8c, 0x28a: 0x8d, 0x28b: 0x87, 0x28c: 0x88, 0x28d: 0x89, 0x28e: 0x8a, 0x28f: 0x8b, + 0x290: 0x8c, 0x291: 0x8d, 0x292: 0x87, 0x293: 0x88, 0x294: 0x89, 0x295: 0x8a, 0x296: 0x8b, 0x297: 0x8c, + 0x298: 0x8d, 0x299: 0x87, 0x29a: 0x88, 0x29b: 0x89, 0x29c: 0x8a, 0x29d: 0x8b, 0x29e: 0x8c, 0x29f: 0x8d, + 0x2a0: 0x87, 0x2a1: 0x88, 0x2a2: 0x89, 0x2a3: 0x8a, 0x2a4: 0x8b, 0x2a5: 0x8c, 0x2a6: 0x8d, 0x2a7: 0x87, + 0x2a8: 0x88, 0x2a9: 0x89, 0x2aa: 0x8a, 0x2ab: 0x8b, 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x87, 0x2af: 0x88, + 0x2b0: 0x89, 0x2b1: 0x8a, 0x2b2: 0x8b, 0x2b3: 0x8c, 0x2b4: 0x8d, 0x2b5: 0x87, 0x2b6: 0x88, 0x2b7: 0x89, + 0x2b8: 0x8a, 0x2b9: 0x8b, 0x2ba: 0x8c, 0x2bb: 0x8d, 0x2bc: 0x87, 0x2bd: 0x88, 0x2be: 0x89, 0x2bf: 0x8a, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x8b, 0x2c1: 0x8c, 0x2c2: 0x8d, 0x2c3: 0x87, 0x2c4: 0x88, 0x2c5: 0x89, 0x2c6: 0x8a, 0x2c7: 0x8b, + 0x2c8: 0x8c, 0x2c9: 0x8d, 0x2ca: 0x87, 0x2cb: 0x88, 0x2cc: 0x89, 0x2cd: 0x8a, 0x2ce: 0x8b, 0x2cf: 0x8c, + 0x2d0: 0x8d, 0x2d1: 0x87, 0x2d2: 0x88, 0x2d3: 0x89, 0x2d4: 0x8a, 0x2d5: 0x8b, 0x2d6: 0x8c, 0x2d7: 0x8d, + 0x2d8: 0x87, 0x2d9: 0x88, 0x2da: 0x89, 0x2db: 0x8a, 0x2dc: 0x8b, 0x2dd: 0x8c, 0x2de: 0x8e, + // Block 0xc, offset 0x300 + 0x324: 0x1b, 0x325: 0x1c, 0x326: 0x1d, 0x327: 0x1e, + 0x328: 0x1f, 0x329: 0x20, 0x32a: 0x21, 0x32b: 0x22, 0x32c: 0x8f, 0x32d: 0x90, 0x32e: 0x91, + 0x331: 0x92, 0x332: 0x93, 0x333: 0x94, 0x334: 0x95, + 0x338: 0x96, 0x339: 0x97, 0x33a: 0x98, 0x33b: 0x99, 0x33e: 0x9a, 0x33f: 0x9b, + // Block 0xd, offset 0x340 + 0x347: 0x9c, + 0x34b: 0x9d, 0x34d: 0x9e, + 0x368: 0x9f, 0x36b: 0xa0, + // Block 0xe, offset 0x380 + 0x381: 0xa1, 0x382: 0xa2, 0x384: 0xa3, 0x385: 0x82, 0x387: 0xa4, + 0x388: 0xa5, 0x38b: 0xa6, 0x38c: 0x3e, 0x38d: 0xa7, + 0x392: 0xa8, 0x393: 0xa9, 0x396: 0xaa, 0x397: 0xab, + 0x398: 0x73, 0x39a: 0xac, 0x39c: 0xad, + // Block 0xf, offset 0x3c0 + 0x3eb: 0xae, 0x3ec: 0xaf, + // Block 0x10, offset 0x400 + 0x432: 0xb0, + // Block 0x11, offset 0x440 + 0x445: 0xb1, 0x446: 0xb2, 0x447: 0xb3, + 0x449: 0xb4, + // Block 0x12, offset 0x480 + 0x4a3: 0xb5, + // Block 0x13, offset 0x4c0 + 0x4c8: 0xb6, + // Block 0x14, offset 0x500 + 0x520: 0x23, 0x521: 0x24, 0x522: 0x25, 0x523: 0x26, 0x524: 0x27, 0x525: 0x28, 0x526: 0x29, 0x527: 0x2a, + 0x528: 0x2b, + // Block 0x15, offset 0x540 + 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, + 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, +} + +// nfcSparseOffset: 139 entries, 278 bytes +var nfcSparseOffset = []uint16{0x0, 0x5, 0x9, 0xb, 0xd, 0x18, 0x28, 0x2a, 0x2f, 0x3a, 0x49, 0x56, 0x5e, 0x62, 0x67, 0x69, 0x79, 0x81, 0x88, 0x8b, 0x92, 0x96, 0x9a, 0x9c, 0x9e, 0xa7, 0xab, 0xb2, 0xb7, 0xba, 0xc4, 0xc6, 0xcd, 0xd5, 0xd8, 0xda, 0xdc, 0xde, 0xe3, 0xf4, 0x100, 0x102, 0x108, 0x10a, 0x10c, 0x10e, 0x110, 0x112, 0x114, 0x117, 0x11a, 0x11c, 0x11f, 0x122, 0x126, 0x12b, 0x134, 0x136, 0x139, 0x13b, 0x146, 0x155, 0x159, 0x167, 0x16a, 0x170, 0x176, 0x181, 0x185, 0x187, 0x189, 0x18b, 0x18d, 0x18f, 0x195, 0x199, 0x19b, 0x19d, 0x1a5, 0x1a9, 0x1ac, 0x1ae, 0x1b0, 0x1b2, 0x1b5, 0x1b7, 0x1b9, 0x1bb, 0x1bd, 0x1c3, 0x1c6, 0x1c8, 0x1cf, 0x1d5, 0x1db, 0x1e3, 0x1e9, 0x1ef, 0x1f5, 0x1f9, 0x207, 0x210, 0x213, 0x216, 0x218, 0x21b, 0x21d, 0x221, 0x226, 0x228, 0x22a, 0x22f, 0x235, 0x237, 0x239, 0x23b, 0x241, 0x244, 0x247, 0x24f, 0x256, 0x259, 0x25c, 0x25e, 0x266, 0x26d, 0x270, 0x276, 0x278, 0x27b, 0x27d, 0x27f, 0x281, 0x283, 0x290, 0x29a, 0x29c, 0x29e, 0x2a0} + +// nfcSparseValues: 674 entries, 2696 bytes +var nfcSparseValues = [674]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0000, lo: 0x04}, + {value: 0xa100, lo: 0xa8, hi: 0xa8}, + {value: 0x8100, lo: 0xaf, hi: 0xaf}, + {value: 0x8100, lo: 0xb4, hi: 0xb4}, + {value: 0x8100, lo: 0xb8, hi: 0xb8}, + // Block 0x1, offset 0x5 + {value: 0x0091, lo: 0x03}, + {value: 0x4774, lo: 0xa0, hi: 0xa1}, + {value: 0x47a6, lo: 0xaf, hi: 0xb0}, + {value: 0xa000, lo: 0xb7, hi: 0xb7}, + // Block 0x2, offset 0x9 + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + // Block 0x3, offset 0xb + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x98, hi: 0x9d}, + // Block 0x4, offset 0xd + {value: 0x0006, lo: 0x0a}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x85, hi: 0x85}, + {value: 0xa000, lo: 0x89, hi: 0x89}, + {value: 0x48d2, lo: 0x8a, hi: 0x8a}, + {value: 0x48f0, lo: 0x8b, hi: 0x8b}, + {value: 0x36c3, lo: 0x8c, hi: 0x8c}, + {value: 0x36db, lo: 0x8d, hi: 0x8d}, + {value: 0x4908, lo: 0x8e, hi: 0x8e}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x36f9, lo: 0x93, hi: 0x94}, + // Block 0x5, offset 0x18 + {value: 0x0000, lo: 0x0f}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0xa000, lo: 0x8d, hi: 0x8d}, + {value: 0x37a1, lo: 0x90, hi: 0x90}, + {value: 0x37ad, lo: 0x91, hi: 0x91}, + {value: 0x379b, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x96, hi: 0x96}, + {value: 0x3813, lo: 0x97, hi: 0x97}, + {value: 0x37dd, lo: 0x9c, hi: 0x9c}, + {value: 0x37c5, lo: 0x9d, hi: 0x9d}, + {value: 0x37ef, lo: 0x9e, hi: 0x9e}, + {value: 0xa000, lo: 0xb4, hi: 0xb5}, + {value: 0x3819, lo: 0xb6, hi: 0xb6}, + {value: 0x381f, lo: 0xb7, hi: 0xb7}, + // Block 0x6, offset 0x28 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x83, hi: 0x87}, + // Block 0x7, offset 0x2a + {value: 0x0001, lo: 0x04}, + {value: 0x8113, lo: 0x81, hi: 0x82}, + {value: 0x8132, lo: 0x84, hi: 0x84}, + {value: 0x812d, lo: 0x85, hi: 0x85}, + {value: 0x810d, lo: 0x87, hi: 0x87}, + // Block 0x8, offset 0x2f + {value: 0x0000, lo: 0x0a}, + {value: 0x8132, lo: 0x90, hi: 0x97}, + {value: 0x8119, lo: 0x98, hi: 0x98}, + {value: 0x811a, lo: 0x99, hi: 0x99}, + {value: 0x811b, lo: 0x9a, hi: 0x9a}, + {value: 0x383d, lo: 0xa2, hi: 0xa2}, + {value: 0x3843, lo: 0xa3, hi: 0xa3}, + {value: 0x384f, lo: 0xa4, hi: 0xa4}, + {value: 0x3849, lo: 0xa5, hi: 0xa5}, + {value: 0x3855, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xa7, hi: 0xa7}, + // Block 0x9, offset 0x3a + {value: 0x0000, lo: 0x0e}, + {value: 0x3867, lo: 0x80, hi: 0x80}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0x385b, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x3861, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x95, hi: 0x95}, + {value: 0x8132, lo: 0x96, hi: 0x9c}, + {value: 0x8132, lo: 0x9f, hi: 0xa2}, + {value: 0x812d, lo: 0xa3, hi: 0xa3}, + {value: 0x8132, lo: 0xa4, hi: 0xa4}, + {value: 0x8132, lo: 0xa7, hi: 0xa8}, + {value: 0x812d, lo: 0xaa, hi: 0xaa}, + {value: 0x8132, lo: 0xab, hi: 0xac}, + {value: 0x812d, lo: 0xad, hi: 0xad}, + // Block 0xa, offset 0x49 + {value: 0x0000, lo: 0x0c}, + {value: 0x811f, lo: 0x91, hi: 0x91}, + {value: 0x8132, lo: 0xb0, hi: 0xb0}, + {value: 0x812d, lo: 0xb1, hi: 0xb1}, + {value: 0x8132, lo: 0xb2, hi: 0xb3}, + {value: 0x812d, lo: 0xb4, hi: 0xb4}, + {value: 0x8132, lo: 0xb5, hi: 0xb6}, + {value: 0x812d, lo: 0xb7, hi: 0xb9}, + {value: 0x8132, lo: 0xba, hi: 0xba}, + {value: 0x812d, lo: 0xbb, hi: 0xbc}, + {value: 0x8132, lo: 0xbd, hi: 0xbd}, + {value: 0x812d, lo: 0xbe, hi: 0xbe}, + {value: 0x8132, lo: 0xbf, hi: 0xbf}, + // Block 0xb, offset 0x56 + {value: 0x0005, lo: 0x07}, + {value: 0x8132, lo: 0x80, hi: 0x80}, + {value: 0x8132, lo: 0x81, hi: 0x81}, + {value: 0x812d, lo: 0x82, hi: 0x83}, + {value: 0x812d, lo: 0x84, hi: 0x85}, + {value: 0x812d, lo: 0x86, hi: 0x87}, + {value: 0x812d, lo: 0x88, hi: 0x89}, + {value: 0x8132, lo: 0x8a, hi: 0x8a}, + // Block 0xc, offset 0x5e + {value: 0x0000, lo: 0x03}, + {value: 0x8132, lo: 0xab, hi: 0xb1}, + {value: 0x812d, lo: 0xb2, hi: 0xb2}, + {value: 0x8132, lo: 0xb3, hi: 0xb3}, + // Block 0xd, offset 0x62 + {value: 0x0000, lo: 0x04}, + {value: 0x8132, lo: 0x96, hi: 0x99}, + {value: 0x8132, lo: 0x9b, hi: 0xa3}, + {value: 0x8132, lo: 0xa5, hi: 0xa7}, + {value: 0x8132, lo: 0xa9, hi: 0xad}, + // Block 0xe, offset 0x67 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x99, hi: 0x9b}, + // Block 0xf, offset 0x69 + {value: 0x0000, lo: 0x0f}, + {value: 0x812d, lo: 0xa3, hi: 0xa3}, + {value: 0x8132, lo: 0xa4, hi: 0xa5}, + {value: 0x812d, lo: 0xa6, hi: 0xa6}, + {value: 0x8132, lo: 0xa7, hi: 0xa8}, + {value: 0x812d, lo: 0xa9, hi: 0xa9}, + {value: 0x8132, lo: 0xaa, hi: 0xac}, + {value: 0x812d, lo: 0xad, hi: 0xaf}, + {value: 0x8116, lo: 0xb0, hi: 0xb0}, + {value: 0x8117, lo: 0xb1, hi: 0xb1}, + {value: 0x8118, lo: 0xb2, hi: 0xb2}, + {value: 0x8132, lo: 0xb3, hi: 0xb5}, + {value: 0x812d, lo: 0xb6, hi: 0xb6}, + {value: 0x8132, lo: 0xb7, hi: 0xb8}, + {value: 0x812d, lo: 0xb9, hi: 0xba}, + {value: 0x8132, lo: 0xbb, hi: 0xbf}, + // Block 0x10, offset 0x79 + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0xa8, hi: 0xa8}, + {value: 0x3ed4, lo: 0xa9, hi: 0xa9}, + {value: 0xa000, lo: 0xb0, hi: 0xb0}, + {value: 0x3edc, lo: 0xb1, hi: 0xb1}, + {value: 0xa000, lo: 0xb3, hi: 0xb3}, + {value: 0x3ee4, lo: 0xb4, hi: 0xb4}, + {value: 0x9902, lo: 0xbc, hi: 0xbc}, + // Block 0x11, offset 0x81 + {value: 0x0008, lo: 0x06}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x8132, lo: 0x91, hi: 0x91}, + {value: 0x812d, lo: 0x92, hi: 0x92}, + {value: 0x8132, lo: 0x93, hi: 0x93}, + {value: 0x8132, lo: 0x94, hi: 0x94}, + {value: 0x45ae, lo: 0x98, hi: 0x9f}, + // Block 0x12, offset 0x88 + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x13, offset 0x8b + {value: 0x0008, lo: 0x06}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2c9a, lo: 0x8b, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x45ee, lo: 0x9c, hi: 0x9d}, + {value: 0x45fe, lo: 0x9f, hi: 0x9f}, + // Block 0x14, offset 0x92 + {value: 0x0000, lo: 0x03}, + {value: 0x4626, lo: 0xb3, hi: 0xb3}, + {value: 0x462e, lo: 0xb6, hi: 0xb6}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + // Block 0x15, offset 0x96 + {value: 0x0008, lo: 0x03}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x4606, lo: 0x99, hi: 0x9b}, + {value: 0x461e, lo: 0x9e, hi: 0x9e}, + // Block 0x16, offset 0x9a + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + // Block 0x17, offset 0x9c + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + // Block 0x18, offset 0x9e + {value: 0x0000, lo: 0x08}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2cb2, lo: 0x88, hi: 0x88}, + {value: 0x2caa, lo: 0x8b, hi: 0x8b}, + {value: 0x2cba, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x96, hi: 0x97}, + {value: 0x4636, lo: 0x9c, hi: 0x9c}, + {value: 0x463e, lo: 0x9d, hi: 0x9d}, + // Block 0x19, offset 0xa7 + {value: 0x0000, lo: 0x03}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x2cc2, lo: 0x94, hi: 0x94}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1a, offset 0xab + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2cca, lo: 0x8a, hi: 0x8a}, + {value: 0x2cda, lo: 0x8b, hi: 0x8b}, + {value: 0x2cd2, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1b, offset 0xb2 + {value: 0x1801, lo: 0x04}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x3eec, lo: 0x88, hi: 0x88}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x8120, lo: 0x95, hi: 0x96}, + // Block 0x1c, offset 0xb7 + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + {value: 0xa000, lo: 0xbf, hi: 0xbf}, + // Block 0x1d, offset 0xba + {value: 0x0000, lo: 0x09}, + {value: 0x2ce2, lo: 0x80, hi: 0x80}, + {value: 0x9900, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x2cea, lo: 0x87, hi: 0x87}, + {value: 0x2cf2, lo: 0x88, hi: 0x88}, + {value: 0x2f4c, lo: 0x8a, hi: 0x8a}, + {value: 0x2dd4, lo: 0x8b, hi: 0x8b}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x95, hi: 0x96}, + // Block 0x1e, offset 0xc4 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1f, offset 0xc6 + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2cfa, lo: 0x8a, hi: 0x8a}, + {value: 0x2d0a, lo: 0x8b, hi: 0x8b}, + {value: 0x2d02, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x20, offset 0xcd + {value: 0x6bee, lo: 0x07}, + {value: 0x9904, lo: 0x8a, hi: 0x8a}, + {value: 0x9900, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x3ef4, lo: 0x9a, hi: 0x9a}, + {value: 0x2f54, lo: 0x9c, hi: 0x9c}, + {value: 0x2ddf, lo: 0x9d, hi: 0x9d}, + {value: 0x2d12, lo: 0x9e, hi: 0x9f}, + // Block 0x21, offset 0xd5 + {value: 0x0000, lo: 0x02}, + {value: 0x8122, lo: 0xb8, hi: 0xb9}, + {value: 0x8104, lo: 0xba, hi: 0xba}, + // Block 0x22, offset 0xd8 + {value: 0x0000, lo: 0x01}, + {value: 0x8123, lo: 0x88, hi: 0x8b}, + // Block 0x23, offset 0xda + {value: 0x0000, lo: 0x01}, + {value: 0x8124, lo: 0xb8, hi: 0xb9}, + // Block 0x24, offset 0xdc + {value: 0x0000, lo: 0x01}, + {value: 0x8125, lo: 0x88, hi: 0x8b}, + // Block 0x25, offset 0xde + {value: 0x0000, lo: 0x04}, + {value: 0x812d, lo: 0x98, hi: 0x99}, + {value: 0x812d, lo: 0xb5, hi: 0xb5}, + {value: 0x812d, lo: 0xb7, hi: 0xb7}, + {value: 0x812b, lo: 0xb9, hi: 0xb9}, + // Block 0x26, offset 0xe3 + {value: 0x0000, lo: 0x10}, + {value: 0x2640, lo: 0x83, hi: 0x83}, + {value: 0x2647, lo: 0x8d, hi: 0x8d}, + {value: 0x264e, lo: 0x92, hi: 0x92}, + {value: 0x2655, lo: 0x97, hi: 0x97}, + {value: 0x265c, lo: 0x9c, hi: 0x9c}, + {value: 0x2639, lo: 0xa9, hi: 0xa9}, + {value: 0x8126, lo: 0xb1, hi: 0xb1}, + {value: 0x8127, lo: 0xb2, hi: 0xb2}, + {value: 0x4a62, lo: 0xb3, hi: 0xb3}, + {value: 0x8128, lo: 0xb4, hi: 0xb4}, + {value: 0x4a6b, lo: 0xb5, hi: 0xb5}, + {value: 0x4646, lo: 0xb6, hi: 0xb6}, + {value: 0x8200, lo: 0xb7, hi: 0xb7}, + {value: 0x464e, lo: 0xb8, hi: 0xb8}, + {value: 0x8200, lo: 0xb9, hi: 0xb9}, + {value: 0x8127, lo: 0xba, hi: 0xbd}, + // Block 0x27, offset 0xf4 + {value: 0x0000, lo: 0x0b}, + {value: 0x8127, lo: 0x80, hi: 0x80}, + {value: 0x4a74, lo: 0x81, hi: 0x81}, + {value: 0x8132, lo: 0x82, hi: 0x83}, + {value: 0x8104, lo: 0x84, hi: 0x84}, + {value: 0x8132, lo: 0x86, hi: 0x87}, + {value: 0x266a, lo: 0x93, hi: 0x93}, + {value: 0x2671, lo: 0x9d, hi: 0x9d}, + {value: 0x2678, lo: 0xa2, hi: 0xa2}, + {value: 0x267f, lo: 0xa7, hi: 0xa7}, + {value: 0x2686, lo: 0xac, hi: 0xac}, + {value: 0x2663, lo: 0xb9, hi: 0xb9}, + // Block 0x28, offset 0x100 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x86, hi: 0x86}, + // Block 0x29, offset 0x102 + {value: 0x0000, lo: 0x05}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x2d1a, lo: 0xa6, hi: 0xa6}, + {value: 0x9900, lo: 0xae, hi: 0xae}, + {value: 0x8102, lo: 0xb7, hi: 0xb7}, + {value: 0x8104, lo: 0xb9, hi: 0xba}, + // Block 0x2a, offset 0x108 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x8d, hi: 0x8d}, + // Block 0x2b, offset 0x10a + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x80, hi: 0x92}, + // Block 0x2c, offset 0x10c + {value: 0x0000, lo: 0x01}, + {value: 0xb900, lo: 0xa1, hi: 0xb5}, + // Block 0x2d, offset 0x10e + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0xa8, hi: 0xbf}, + // Block 0x2e, offset 0x110 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0x80, hi: 0x82}, + // Block 0x2f, offset 0x112 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x9d, hi: 0x9f}, + // Block 0x30, offset 0x114 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x94, hi: 0x94}, + {value: 0x8104, lo: 0xb4, hi: 0xb4}, + // Block 0x31, offset 0x117 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x92, hi: 0x92}, + {value: 0x8132, lo: 0x9d, hi: 0x9d}, + // Block 0x32, offset 0x11a + {value: 0x0000, lo: 0x01}, + {value: 0x8131, lo: 0xa9, hi: 0xa9}, + // Block 0x33, offset 0x11c + {value: 0x0004, lo: 0x02}, + {value: 0x812e, lo: 0xb9, hi: 0xba}, + {value: 0x812d, lo: 0xbb, hi: 0xbb}, + // Block 0x34, offset 0x11f + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0x97, hi: 0x97}, + {value: 0x812d, lo: 0x98, hi: 0x98}, + // Block 0x35, offset 0x122 + {value: 0x0000, lo: 0x03}, + {value: 0x8104, lo: 0xa0, hi: 0xa0}, + {value: 0x8132, lo: 0xb5, hi: 0xbc}, + {value: 0x812d, lo: 0xbf, hi: 0xbf}, + // Block 0x36, offset 0x126 + {value: 0x0000, lo: 0x04}, + {value: 0x8132, lo: 0xb0, hi: 0xb4}, + {value: 0x812d, lo: 0xb5, hi: 0xba}, + {value: 0x8132, lo: 0xbb, hi: 0xbc}, + {value: 0x812d, lo: 0xbd, hi: 0xbd}, + // Block 0x37, offset 0x12b + {value: 0x0000, lo: 0x08}, + {value: 0x2d62, lo: 0x80, hi: 0x80}, + {value: 0x2d6a, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x82, hi: 0x82}, + {value: 0x2d72, lo: 0x83, hi: 0x83}, + {value: 0x8104, lo: 0x84, hi: 0x84}, + {value: 0x8132, lo: 0xab, hi: 0xab}, + {value: 0x812d, lo: 0xac, hi: 0xac}, + {value: 0x8132, lo: 0xad, hi: 0xb3}, + // Block 0x38, offset 0x134 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xaa, hi: 0xab}, + // Block 0x39, offset 0x136 + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xa6, hi: 0xa6}, + {value: 0x8104, lo: 0xb2, hi: 0xb3}, + // Block 0x3a, offset 0x139 + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb7, hi: 0xb7}, + // Block 0x3b, offset 0x13b + {value: 0x0000, lo: 0x0a}, + {value: 0x8132, lo: 0x90, hi: 0x92}, + {value: 0x8101, lo: 0x94, hi: 0x94}, + {value: 0x812d, lo: 0x95, hi: 0x99}, + {value: 0x8132, lo: 0x9a, hi: 0x9b}, + {value: 0x812d, lo: 0x9c, hi: 0x9f}, + {value: 0x8132, lo: 0xa0, hi: 0xa0}, + {value: 0x8101, lo: 0xa2, hi: 0xa8}, + {value: 0x812d, lo: 0xad, hi: 0xad}, + {value: 0x8132, lo: 0xb4, hi: 0xb4}, + {value: 0x8132, lo: 0xb8, hi: 0xb9}, + // Block 0x3c, offset 0x146 + {value: 0x0000, lo: 0x0e}, + {value: 0x8132, lo: 0x80, hi: 0x81}, + {value: 0x812d, lo: 0x82, hi: 0x82}, + {value: 0x8132, lo: 0x83, hi: 0x89}, + {value: 0x812d, lo: 0x8a, hi: 0x8a}, + {value: 0x8132, lo: 0x8b, hi: 0x8c}, + {value: 0x8135, lo: 0x8d, hi: 0x8d}, + {value: 0x812a, lo: 0x8e, hi: 0x8e}, + {value: 0x812d, lo: 0x8f, hi: 0x8f}, + {value: 0x8129, lo: 0x90, hi: 0x90}, + {value: 0x8132, lo: 0x91, hi: 0xb5}, + {value: 0x8134, lo: 0xbc, hi: 0xbc}, + {value: 0x812d, lo: 0xbd, hi: 0xbd}, + {value: 0x8132, lo: 0xbe, hi: 0xbe}, + {value: 0x812d, lo: 0xbf, hi: 0xbf}, + // Block 0x3d, offset 0x155 + {value: 0x0004, lo: 0x03}, + {value: 0x0433, lo: 0x80, hi: 0x81}, + {value: 0x8100, lo: 0x97, hi: 0x97}, + {value: 0x8100, lo: 0xbe, hi: 0xbe}, + // Block 0x3e, offset 0x159 + {value: 0x0000, lo: 0x0d}, + {value: 0x8132, lo: 0x90, hi: 0x91}, + {value: 0x8101, lo: 0x92, hi: 0x93}, + {value: 0x8132, lo: 0x94, hi: 0x97}, + {value: 0x8101, lo: 0x98, hi: 0x9a}, + {value: 0x8132, lo: 0x9b, hi: 0x9c}, + {value: 0x8132, lo: 0xa1, hi: 0xa1}, + {value: 0x8101, lo: 0xa5, hi: 0xa6}, + {value: 0x8132, lo: 0xa7, hi: 0xa7}, + {value: 0x812d, lo: 0xa8, hi: 0xa8}, + {value: 0x8132, lo: 0xa9, hi: 0xa9}, + {value: 0x8101, lo: 0xaa, hi: 0xab}, + {value: 0x812d, lo: 0xac, hi: 0xaf}, + {value: 0x8132, lo: 0xb0, hi: 0xb0}, + // Block 0x3f, offset 0x167 + {value: 0x4277, lo: 0x02}, + {value: 0x01b8, lo: 0xa6, hi: 0xa6}, + {value: 0x0057, lo: 0xaa, hi: 0xab}, + // Block 0x40, offset 0x16a + {value: 0x0007, lo: 0x05}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + {value: 0x3bb5, lo: 0x9a, hi: 0x9b}, + {value: 0x3bc3, lo: 0xae, hi: 0xae}, + // Block 0x41, offset 0x170 + {value: 0x000e, lo: 0x05}, + {value: 0x3bca, lo: 0x8d, hi: 0x8e}, + {value: 0x3bd1, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + // Block 0x42, offset 0x176 + {value: 0x640c, lo: 0x0a}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0x3bdf, lo: 0x84, hi: 0x84}, + {value: 0xa000, lo: 0x88, hi: 0x88}, + {value: 0x3be6, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0x3bed, lo: 0x8c, hi: 0x8c}, + {value: 0xa000, lo: 0xa3, hi: 0xa3}, + {value: 0x3bf4, lo: 0xa4, hi: 0xa5}, + {value: 0x3bfb, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xbc, hi: 0xbc}, + // Block 0x43, offset 0x181 + {value: 0x0007, lo: 0x03}, + {value: 0x3c64, lo: 0xa0, hi: 0xa1}, + {value: 0x3c8e, lo: 0xa2, hi: 0xa3}, + {value: 0x3cb8, lo: 0xaa, hi: 0xad}, + // Block 0x44, offset 0x185 + {value: 0x0004, lo: 0x01}, + {value: 0x048b, lo: 0xa9, hi: 0xaa}, + // Block 0x45, offset 0x187 + {value: 0x0000, lo: 0x01}, + {value: 0x456f, lo: 0x9c, hi: 0x9c}, + // Block 0x46, offset 0x189 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xaf, hi: 0xb1}, + // Block 0x47, offset 0x18b + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x48, offset 0x18d + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xa0, hi: 0xbf}, + // Block 0x49, offset 0x18f + {value: 0x0000, lo: 0x05}, + {value: 0x812c, lo: 0xaa, hi: 0xaa}, + {value: 0x8131, lo: 0xab, hi: 0xab}, + {value: 0x8133, lo: 0xac, hi: 0xac}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + {value: 0x812f, lo: 0xae, hi: 0xaf}, + // Block 0x4a, offset 0x195 + {value: 0x0000, lo: 0x03}, + {value: 0x4a7d, lo: 0xb3, hi: 0xb3}, + {value: 0x4a7d, lo: 0xb5, hi: 0xb6}, + {value: 0x4a7d, lo: 0xba, hi: 0xbf}, + // Block 0x4b, offset 0x199 + {value: 0x0000, lo: 0x01}, + {value: 0x4a7d, lo: 0x8f, hi: 0xa3}, + // Block 0x4c, offset 0x19b + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xae, hi: 0xbe}, + // Block 0x4d, offset 0x19d + {value: 0x0000, lo: 0x07}, + {value: 0x8100, lo: 0x84, hi: 0x84}, + {value: 0x8100, lo: 0x87, hi: 0x87}, + {value: 0x8100, lo: 0x90, hi: 0x90}, + {value: 0x8100, lo: 0x9e, hi: 0x9e}, + {value: 0x8100, lo: 0xa1, hi: 0xa1}, + {value: 0x8100, lo: 0xb2, hi: 0xb2}, + {value: 0x8100, lo: 0xbb, hi: 0xbb}, + // Block 0x4e, offset 0x1a5 + {value: 0x0000, lo: 0x03}, + {value: 0x8100, lo: 0x80, hi: 0x80}, + {value: 0x8100, lo: 0x8b, hi: 0x8b}, + {value: 0x8100, lo: 0x8e, hi: 0x8e}, + // Block 0x4f, offset 0x1a9 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0xaf, hi: 0xaf}, + {value: 0x8132, lo: 0xb4, hi: 0xbd}, + // Block 0x50, offset 0x1ac + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x9e, hi: 0x9f}, + // Block 0x51, offset 0x1ae + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xb0, hi: 0xb1}, + // Block 0x52, offset 0x1b0 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x86, hi: 0x86}, + // Block 0x53, offset 0x1b2 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x84, hi: 0x84}, + {value: 0x8132, lo: 0xa0, hi: 0xb1}, + // Block 0x54, offset 0x1b5 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0xab, hi: 0xad}, + // Block 0x55, offset 0x1b7 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x93, hi: 0x93}, + // Block 0x56, offset 0x1b9 + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb3, hi: 0xb3}, + // Block 0x57, offset 0x1bb + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x80, hi: 0x80}, + // Block 0x58, offset 0x1bd + {value: 0x0000, lo: 0x05}, + {value: 0x8132, lo: 0xb0, hi: 0xb0}, + {value: 0x8132, lo: 0xb2, hi: 0xb3}, + {value: 0x812d, lo: 0xb4, hi: 0xb4}, + {value: 0x8132, lo: 0xb7, hi: 0xb8}, + {value: 0x8132, lo: 0xbe, hi: 0xbf}, + // Block 0x59, offset 0x1c3 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0x81, hi: 0x81}, + {value: 0x8104, lo: 0xb6, hi: 0xb6}, + // Block 0x5a, offset 0x1c6 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xad, hi: 0xad}, + // Block 0x5b, offset 0x1c8 + {value: 0x0000, lo: 0x06}, + {value: 0xe500, lo: 0x80, hi: 0x80}, + {value: 0xc600, lo: 0x81, hi: 0x9b}, + {value: 0xe500, lo: 0x9c, hi: 0x9c}, + {value: 0xc600, lo: 0x9d, hi: 0xb7}, + {value: 0xe500, lo: 0xb8, hi: 0xb8}, + {value: 0xc600, lo: 0xb9, hi: 0xbf}, + // Block 0x5c, offset 0x1cf + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x93}, + {value: 0xe500, lo: 0x94, hi: 0x94}, + {value: 0xc600, lo: 0x95, hi: 0xaf}, + {value: 0xe500, lo: 0xb0, hi: 0xb0}, + {value: 0xc600, lo: 0xb1, hi: 0xbf}, + // Block 0x5d, offset 0x1d5 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8b}, + {value: 0xe500, lo: 0x8c, hi: 0x8c}, + {value: 0xc600, lo: 0x8d, hi: 0xa7}, + {value: 0xe500, lo: 0xa8, hi: 0xa8}, + {value: 0xc600, lo: 0xa9, hi: 0xbf}, + // Block 0x5e, offset 0x1db + {value: 0x0000, lo: 0x07}, + {value: 0xc600, lo: 0x80, hi: 0x83}, + {value: 0xe500, lo: 0x84, hi: 0x84}, + {value: 0xc600, lo: 0x85, hi: 0x9f}, + {value: 0xe500, lo: 0xa0, hi: 0xa0}, + {value: 0xc600, lo: 0xa1, hi: 0xbb}, + {value: 0xe500, lo: 0xbc, hi: 0xbc}, + {value: 0xc600, lo: 0xbd, hi: 0xbf}, + // Block 0x5f, offset 0x1e3 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x97}, + {value: 0xe500, lo: 0x98, hi: 0x98}, + {value: 0xc600, lo: 0x99, hi: 0xb3}, + {value: 0xe500, lo: 0xb4, hi: 0xb4}, + {value: 0xc600, lo: 0xb5, hi: 0xbf}, + // Block 0x60, offset 0x1e9 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8f}, + {value: 0xe500, lo: 0x90, hi: 0x90}, + {value: 0xc600, lo: 0x91, hi: 0xab}, + {value: 0xe500, lo: 0xac, hi: 0xac}, + {value: 0xc600, lo: 0xad, hi: 0xbf}, + // Block 0x61, offset 0x1ef + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + {value: 0xe500, lo: 0xa4, hi: 0xa4}, + {value: 0xc600, lo: 0xa5, hi: 0xbf}, + // Block 0x62, offset 0x1f5 + {value: 0x0000, lo: 0x03}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + // Block 0x63, offset 0x1f9 + {value: 0x0006, lo: 0x0d}, + {value: 0x4422, lo: 0x9d, hi: 0x9d}, + {value: 0x8115, lo: 0x9e, hi: 0x9e}, + {value: 0x4494, lo: 0x9f, hi: 0x9f}, + {value: 0x4482, lo: 0xaa, hi: 0xab}, + {value: 0x4586, lo: 0xac, hi: 0xac}, + {value: 0x458e, lo: 0xad, hi: 0xad}, + {value: 0x43da, lo: 0xae, hi: 0xb1}, + {value: 0x43f8, lo: 0xb2, hi: 0xb4}, + {value: 0x4410, lo: 0xb5, hi: 0xb6}, + {value: 0x441c, lo: 0xb8, hi: 0xb8}, + {value: 0x4428, lo: 0xb9, hi: 0xbb}, + {value: 0x4440, lo: 0xbc, hi: 0xbc}, + {value: 0x4446, lo: 0xbe, hi: 0xbe}, + // Block 0x64, offset 0x207 + {value: 0x0006, lo: 0x08}, + {value: 0x444c, lo: 0x80, hi: 0x81}, + {value: 0x4458, lo: 0x83, hi: 0x84}, + {value: 0x446a, lo: 0x86, hi: 0x89}, + {value: 0x448e, lo: 0x8a, hi: 0x8a}, + {value: 0x440a, lo: 0x8b, hi: 0x8b}, + {value: 0x43f2, lo: 0x8c, hi: 0x8c}, + {value: 0x443a, lo: 0x8d, hi: 0x8d}, + {value: 0x4464, lo: 0x8e, hi: 0x8e}, + // Block 0x65, offset 0x210 + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0xa4, hi: 0xa5}, + {value: 0x8100, lo: 0xb0, hi: 0xb1}, + // Block 0x66, offset 0x213 + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0x9b, hi: 0x9d}, + {value: 0x8200, lo: 0x9e, hi: 0xa3}, + // Block 0x67, offset 0x216 + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x90, hi: 0x90}, + // Block 0x68, offset 0x218 + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0x99, hi: 0x99}, + {value: 0x8200, lo: 0xb2, hi: 0xb4}, + // Block 0x69, offset 0x21b + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xbc, hi: 0xbd}, + // Block 0x6a, offset 0x21d + {value: 0x0000, lo: 0x03}, + {value: 0x8132, lo: 0xa0, hi: 0xa6}, + {value: 0x812d, lo: 0xa7, hi: 0xad}, + {value: 0x8132, lo: 0xae, hi: 0xaf}, + // Block 0x6b, offset 0x221 + {value: 0x0000, lo: 0x04}, + {value: 0x8100, lo: 0x89, hi: 0x8c}, + {value: 0x8100, lo: 0xb0, hi: 0xb2}, + {value: 0x8100, lo: 0xb4, hi: 0xb4}, + {value: 0x8100, lo: 0xb6, hi: 0xbf}, + // Block 0x6c, offset 0x226 + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x81, hi: 0x8c}, + // Block 0x6d, offset 0x228 + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xb5, hi: 0xba}, + // Block 0x6e, offset 0x22a + {value: 0x0000, lo: 0x04}, + {value: 0x4a7d, lo: 0x9e, hi: 0x9f}, + {value: 0x4a7d, lo: 0xa3, hi: 0xa3}, + {value: 0x4a7d, lo: 0xa5, hi: 0xa6}, + {value: 0x4a7d, lo: 0xaa, hi: 0xaf}, + // Block 0x6f, offset 0x22f + {value: 0x0000, lo: 0x05}, + {value: 0x4a7d, lo: 0x82, hi: 0x87}, + {value: 0x4a7d, lo: 0x8a, hi: 0x8f}, + {value: 0x4a7d, lo: 0x92, hi: 0x97}, + {value: 0x4a7d, lo: 0x9a, hi: 0x9c}, + {value: 0x8100, lo: 0xa3, hi: 0xa3}, + // Block 0x70, offset 0x235 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0xbd, hi: 0xbd}, + // Block 0x71, offset 0x237 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0xa0, hi: 0xa0}, + // Block 0x72, offset 0x239 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xb6, hi: 0xba}, + // Block 0x73, offset 0x23b + {value: 0x002c, lo: 0x05}, + {value: 0x812d, lo: 0x8d, hi: 0x8d}, + {value: 0x8132, lo: 0x8f, hi: 0x8f}, + {value: 0x8132, lo: 0xb8, hi: 0xb8}, + {value: 0x8101, lo: 0xb9, hi: 0xba}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x74, offset 0x241 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0xa5, hi: 0xa5}, + {value: 0x812d, lo: 0xa6, hi: 0xa6}, + // Block 0x75, offset 0x244 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x86, hi: 0x86}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x76, offset 0x247 + {value: 0x17fe, lo: 0x07}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4234, lo: 0x9a, hi: 0x9a}, + {value: 0xa000, lo: 0x9b, hi: 0x9b}, + {value: 0x423e, lo: 0x9c, hi: 0x9c}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x4248, lo: 0xab, hi: 0xab}, + {value: 0x8104, lo: 0xb9, hi: 0xba}, + // Block 0x77, offset 0x24f + {value: 0x0000, lo: 0x06}, + {value: 0x8132, lo: 0x80, hi: 0x82}, + {value: 0x9900, lo: 0xa7, hi: 0xa7}, + {value: 0x2d7a, lo: 0xae, hi: 0xae}, + {value: 0x2d84, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb1, hi: 0xb2}, + {value: 0x8104, lo: 0xb3, hi: 0xb4}, + // Block 0x78, offset 0x256 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x80, hi: 0x80}, + {value: 0x8102, lo: 0x8a, hi: 0x8a}, + // Block 0x79, offset 0x259 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xb5, hi: 0xb5}, + {value: 0x8102, lo: 0xb6, hi: 0xb6}, + // Block 0x7a, offset 0x25c + {value: 0x0002, lo: 0x01}, + {value: 0x8102, lo: 0xa9, hi: 0xaa}, + // Block 0x7b, offset 0x25e + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2d8e, lo: 0x8b, hi: 0x8b}, + {value: 0x2d98, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x8132, lo: 0xa6, hi: 0xac}, + {value: 0x8132, lo: 0xb0, hi: 0xb4}, + // Block 0x7c, offset 0x266 + {value: 0x6b5e, lo: 0x06}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb9, hi: 0xb9}, + {value: 0x9900, lo: 0xba, hi: 0xba}, + {value: 0x2dac, lo: 0xbb, hi: 0xbb}, + {value: 0x2da2, lo: 0xbc, hi: 0xbd}, + {value: 0x2db6, lo: 0xbe, hi: 0xbe}, + // Block 0x7d, offset 0x26d + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x82, hi: 0x82}, + {value: 0x8102, lo: 0x83, hi: 0x83}, + // Block 0x7e, offset 0x270 + {value: 0x0000, lo: 0x05}, + {value: 0x9900, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb8, hi: 0xb9}, + {value: 0x2dc0, lo: 0xba, hi: 0xba}, + {value: 0x2dca, lo: 0xbb, hi: 0xbb}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x7f, offset 0x276 + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0x80, hi: 0x80}, + // Block 0x80, offset 0x278 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xb6, hi: 0xb6}, + {value: 0x8102, lo: 0xb7, hi: 0xb7}, + // Block 0x81, offset 0x27b + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xab, hi: 0xab}, + // Block 0x82, offset 0x27d + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0xb0, hi: 0xb4}, + // Block 0x83, offset 0x27f + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xb0, hi: 0xb6}, + // Block 0x84, offset 0x281 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0x9e, hi: 0x9e}, + // Block 0x85, offset 0x283 + {value: 0x0000, lo: 0x0c}, + {value: 0x465e, lo: 0x9e, hi: 0x9e}, + {value: 0x4668, lo: 0x9f, hi: 0x9f}, + {value: 0x469c, lo: 0xa0, hi: 0xa0}, + {value: 0x46aa, lo: 0xa1, hi: 0xa1}, + {value: 0x46b8, lo: 0xa2, hi: 0xa2}, + {value: 0x46c6, lo: 0xa3, hi: 0xa3}, + {value: 0x46d4, lo: 0xa4, hi: 0xa4}, + {value: 0x812b, lo: 0xa5, hi: 0xa6}, + {value: 0x8101, lo: 0xa7, hi: 0xa9}, + {value: 0x8130, lo: 0xad, hi: 0xad}, + {value: 0x812b, lo: 0xae, hi: 0xb2}, + {value: 0x812d, lo: 0xbb, hi: 0xbf}, + // Block 0x86, offset 0x290 + {value: 0x0000, lo: 0x09}, + {value: 0x812d, lo: 0x80, hi: 0x82}, + {value: 0x8132, lo: 0x85, hi: 0x89}, + {value: 0x812d, lo: 0x8a, hi: 0x8b}, + {value: 0x8132, lo: 0xaa, hi: 0xad}, + {value: 0x4672, lo: 0xbb, hi: 0xbb}, + {value: 0x467c, lo: 0xbc, hi: 0xbc}, + {value: 0x46e2, lo: 0xbd, hi: 0xbd}, + {value: 0x46fe, lo: 0xbe, hi: 0xbe}, + {value: 0x46f0, lo: 0xbf, hi: 0xbf}, + // Block 0x87, offset 0x29a + {value: 0x0000, lo: 0x01}, + {value: 0x470c, lo: 0x80, hi: 0x80}, + // Block 0x88, offset 0x29c + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x82, hi: 0x84}, + // Block 0x89, offset 0x29e + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x90, hi: 0x96}, + // Block 0x8a, offset 0x2a0 + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x93, hi: 0x93}, +} + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfkcTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfkcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfkcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfkcTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfkcValues[c0] + } + i := nfkcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfkcTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfkcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfkcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfkcTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfkcValues[c0] + } + i := nfkcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// nfkcTrie. Total size: 16932 bytes (16.54 KiB). Checksum: 30d032c1800b8f3e. +type nfkcTrie struct{} + +func newNfkcTrie(i int) *nfkcTrie { + return &nfkcTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *nfkcTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 90: + return uint16(nfkcValues[n<<6+uint32(b)]) + default: + n -= 90 + return uint16(nfkcSparse.lookup(n, b)) + } +} + +// nfkcValues: 92 blocks, 5888 entries, 11776 bytes +// The third block is the zero block. +var nfkcValues = [5888]uint16{ + // Block 0x0, offset 0x0 + 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, + // Block 0x1, offset 0x40 + 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, + 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, + 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, + 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, + 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, + 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, + 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, + 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, + 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, + 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x2f6b, 0xc1: 0x2f70, 0xc2: 0x471a, 0xc3: 0x2f75, 0xc4: 0x4729, 0xc5: 0x472e, + 0xc6: 0xa000, 0xc7: 0x4738, 0xc8: 0x2fde, 0xc9: 0x2fe3, 0xca: 0x473d, 0xcb: 0x2ff7, + 0xcc: 0x306a, 0xcd: 0x306f, 0xce: 0x3074, 0xcf: 0x4751, 0xd1: 0x3100, + 0xd2: 0x3123, 0xd3: 0x3128, 0xd4: 0x475b, 0xd5: 0x4760, 0xd6: 0x476f, + 0xd8: 0xa000, 0xd9: 0x31af, 0xda: 0x31b4, 0xdb: 0x31b9, 0xdc: 0x47a1, 0xdd: 0x3231, + 0xe0: 0x3277, 0xe1: 0x327c, 0xe2: 0x47ab, 0xe3: 0x3281, + 0xe4: 0x47ba, 0xe5: 0x47bf, 0xe6: 0xa000, 0xe7: 0x47c9, 0xe8: 0x32ea, 0xe9: 0x32ef, + 0xea: 0x47ce, 0xeb: 0x3303, 0xec: 0x337b, 0xed: 0x3380, 0xee: 0x3385, 0xef: 0x47e2, + 0xf1: 0x3411, 0xf2: 0x3434, 0xf3: 0x3439, 0xf4: 0x47ec, 0xf5: 0x47f1, + 0xf6: 0x4800, 0xf8: 0xa000, 0xf9: 0x34c5, 0xfa: 0x34ca, 0xfb: 0x34cf, + 0xfc: 0x4832, 0xfd: 0x354c, 0xff: 0x3565, + // Block 0x4, offset 0x100 + 0x100: 0x2f7a, 0x101: 0x3286, 0x102: 0x471f, 0x103: 0x47b0, 0x104: 0x2f98, 0x105: 0x32a4, + 0x106: 0x2fac, 0x107: 0x32b8, 0x108: 0x2fb1, 0x109: 0x32bd, 0x10a: 0x2fb6, 0x10b: 0x32c2, + 0x10c: 0x2fbb, 0x10d: 0x32c7, 0x10e: 0x2fc5, 0x10f: 0x32d1, + 0x112: 0x4742, 0x113: 0x47d3, 0x114: 0x2fed, 0x115: 0x32f9, 0x116: 0x2ff2, 0x117: 0x32fe, + 0x118: 0x3010, 0x119: 0x331c, 0x11a: 0x3001, 0x11b: 0x330d, 0x11c: 0x3029, 0x11d: 0x3335, + 0x11e: 0x3033, 0x11f: 0x333f, 0x120: 0x3038, 0x121: 0x3344, 0x122: 0x3042, 0x123: 0x334e, + 0x124: 0x3047, 0x125: 0x3353, 0x128: 0x3079, 0x129: 0x338a, + 0x12a: 0x307e, 0x12b: 0x338f, 0x12c: 0x3083, 0x12d: 0x3394, 0x12e: 0x30a6, 0x12f: 0x33b2, + 0x130: 0x3088, 0x132: 0x1959, 0x133: 0x19e3, 0x134: 0x30b0, 0x135: 0x33bc, + 0x136: 0x30c4, 0x137: 0x33d5, 0x139: 0x30ce, 0x13a: 0x33df, 0x13b: 0x30d8, + 0x13c: 0x33e9, 0x13d: 0x30d3, 0x13e: 0x33e4, 0x13f: 0x1ba8, + // Block 0x5, offset 0x140 + 0x140: 0x1c30, 0x143: 0x30fb, 0x144: 0x340c, 0x145: 0x3114, + 0x146: 0x3425, 0x147: 0x310a, 0x148: 0x341b, 0x149: 0x1c58, + 0x14c: 0x4765, 0x14d: 0x47f6, 0x14e: 0x312d, 0x14f: 0x343e, 0x150: 0x3137, 0x151: 0x3448, + 0x154: 0x3155, 0x155: 0x3466, 0x156: 0x316e, 0x157: 0x347f, + 0x158: 0x315f, 0x159: 0x3470, 0x15a: 0x4788, 0x15b: 0x4819, 0x15c: 0x3178, 0x15d: 0x3489, + 0x15e: 0x3187, 0x15f: 0x3498, 0x160: 0x478d, 0x161: 0x481e, 0x162: 0x31a0, 0x163: 0x34b6, + 0x164: 0x3191, 0x165: 0x34a7, 0x168: 0x4797, 0x169: 0x4828, + 0x16a: 0x479c, 0x16b: 0x482d, 0x16c: 0x31be, 0x16d: 0x34d4, 0x16e: 0x31c8, 0x16f: 0x34de, + 0x170: 0x31cd, 0x171: 0x34e3, 0x172: 0x31eb, 0x173: 0x3501, 0x174: 0x320e, 0x175: 0x3524, + 0x176: 0x3236, 0x177: 0x3551, 0x178: 0x324a, 0x179: 0x3259, 0x17a: 0x3579, 0x17b: 0x3263, + 0x17c: 0x3583, 0x17d: 0x3268, 0x17e: 0x3588, 0x17f: 0x00a7, + // Block 0x6, offset 0x180 + 0x184: 0x2dea, 0x185: 0x2df0, + 0x186: 0x2df6, 0x187: 0x196e, 0x188: 0x1971, 0x189: 0x1a04, 0x18a: 0x1983, 0x18b: 0x1986, + 0x18c: 0x1a3a, 0x18d: 0x2f84, 0x18e: 0x3290, 0x18f: 0x3092, 0x190: 0x339e, 0x191: 0x313c, + 0x192: 0x344d, 0x193: 0x31d2, 0x194: 0x34e8, 0x195: 0x39cb, 0x196: 0x3b5a, 0x197: 0x39c4, + 0x198: 0x3b53, 0x199: 0x39d2, 0x19a: 0x3b61, 0x19b: 0x39bd, 0x19c: 0x3b4c, + 0x19e: 0x38ac, 0x19f: 0x3a3b, 0x1a0: 0x38a5, 0x1a1: 0x3a34, 0x1a2: 0x35af, 0x1a3: 0x35c1, + 0x1a6: 0x303d, 0x1a7: 0x3349, 0x1a8: 0x30ba, 0x1a9: 0x33cb, + 0x1aa: 0x477e, 0x1ab: 0x480f, 0x1ac: 0x398c, 0x1ad: 0x3b1b, 0x1ae: 0x35d3, 0x1af: 0x35d9, + 0x1b0: 0x33c1, 0x1b1: 0x193e, 0x1b2: 0x1941, 0x1b3: 0x19cb, 0x1b4: 0x3024, 0x1b5: 0x3330, + 0x1b8: 0x30f6, 0x1b9: 0x3407, 0x1ba: 0x38b3, 0x1bb: 0x3a42, + 0x1bc: 0x35a9, 0x1bd: 0x35bb, 0x1be: 0x35b5, 0x1bf: 0x35c7, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x2f89, 0x1c1: 0x3295, 0x1c2: 0x2f8e, 0x1c3: 0x329a, 0x1c4: 0x3006, 0x1c5: 0x3312, + 0x1c6: 0x300b, 0x1c7: 0x3317, 0x1c8: 0x3097, 0x1c9: 0x33a3, 0x1ca: 0x309c, 0x1cb: 0x33a8, + 0x1cc: 0x3141, 0x1cd: 0x3452, 0x1ce: 0x3146, 0x1cf: 0x3457, 0x1d0: 0x3164, 0x1d1: 0x3475, + 0x1d2: 0x3169, 0x1d3: 0x347a, 0x1d4: 0x31d7, 0x1d5: 0x34ed, 0x1d6: 0x31dc, 0x1d7: 0x34f2, + 0x1d8: 0x3182, 0x1d9: 0x3493, 0x1da: 0x319b, 0x1db: 0x34b1, + 0x1de: 0x3056, 0x1df: 0x3362, + 0x1e6: 0x4724, 0x1e7: 0x47b5, 0x1e8: 0x474c, 0x1e9: 0x47dd, + 0x1ea: 0x395b, 0x1eb: 0x3aea, 0x1ec: 0x3938, 0x1ed: 0x3ac7, 0x1ee: 0x476a, 0x1ef: 0x47fb, + 0x1f0: 0x3954, 0x1f1: 0x3ae3, 0x1f2: 0x3240, 0x1f3: 0x355b, + // Block 0x8, offset 0x200 + 0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132, + 0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932, + 0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932, + 0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d, + 0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d, + 0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d, + 0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d, + 0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d, + 0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101, + 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d, + 0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132, + // Block 0x9, offset 0x240 + 0x240: 0x4a40, 0x241: 0x4a45, 0x242: 0x9932, 0x243: 0x4a4a, 0x244: 0x4a4f, 0x245: 0x9936, + 0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132, + 0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132, + 0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132, + 0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135, + 0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132, + 0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132, + 0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132, + 0x274: 0x0170, + 0x27a: 0x42a1, + 0x27e: 0x0037, + // Block 0xa, offset 0x280 + 0x284: 0x4256, 0x285: 0x450d, + 0x286: 0x35e5, 0x287: 0x00ce, 0x288: 0x3603, 0x289: 0x360f, 0x28a: 0x3621, + 0x28c: 0x363f, 0x28e: 0x3651, 0x28f: 0x366f, 0x290: 0x3e04, 0x291: 0xa000, + 0x295: 0xa000, 0x297: 0xa000, + 0x299: 0xa000, + 0x29f: 0xa000, 0x2a1: 0xa000, + 0x2a5: 0xa000, 0x2a9: 0xa000, + 0x2aa: 0x3633, 0x2ab: 0x3663, 0x2ac: 0x4890, 0x2ad: 0x3693, 0x2ae: 0x48ba, 0x2af: 0x36a5, + 0x2b0: 0x3e6c, 0x2b1: 0xa000, 0x2b5: 0xa000, + 0x2b7: 0xa000, 0x2b9: 0xa000, + 0x2bf: 0xa000, + // Block 0xb, offset 0x2c0 + 0x2c1: 0xa000, 0x2c5: 0xa000, + 0x2c9: 0xa000, 0x2ca: 0x48d2, 0x2cb: 0x48f0, + 0x2cc: 0x36c3, 0x2cd: 0x36db, 0x2ce: 0x4908, 0x2d0: 0x01be, 0x2d1: 0x01d0, + 0x2d2: 0x01ac, 0x2d3: 0x439e, 0x2d4: 0x43a4, 0x2d5: 0x01fa, 0x2d6: 0x01e8, + 0x2f0: 0x01d6, 0x2f1: 0x01eb, 0x2f2: 0x01ee, 0x2f4: 0x0188, 0x2f5: 0x01c7, + 0x2f9: 0x01a6, + // Block 0xc, offset 0x300 + 0x300: 0x371d, 0x301: 0x3729, 0x303: 0x3717, + 0x306: 0xa000, 0x307: 0x3705, + 0x30c: 0x3759, 0x30d: 0x3741, 0x30e: 0x376b, 0x310: 0xa000, + 0x313: 0xa000, 0x315: 0xa000, 0x316: 0xa000, 0x317: 0xa000, + 0x318: 0xa000, 0x319: 0x374d, 0x31a: 0xa000, + 0x31e: 0xa000, 0x323: 0xa000, + 0x327: 0xa000, + 0x32b: 0xa000, 0x32d: 0xa000, + 0x330: 0xa000, 0x333: 0xa000, 0x335: 0xa000, + 0x336: 0xa000, 0x337: 0xa000, 0x338: 0xa000, 0x339: 0x37d1, 0x33a: 0xa000, + 0x33e: 0xa000, + // Block 0xd, offset 0x340 + 0x341: 0x372f, 0x342: 0x37b3, + 0x350: 0x370b, 0x351: 0x378f, + 0x352: 0x3711, 0x353: 0x3795, 0x356: 0x3723, 0x357: 0x37a7, + 0x358: 0xa000, 0x359: 0xa000, 0x35a: 0x3825, 0x35b: 0x382b, 0x35c: 0x3735, 0x35d: 0x37b9, + 0x35e: 0x373b, 0x35f: 0x37bf, 0x362: 0x3747, 0x363: 0x37cb, + 0x364: 0x3753, 0x365: 0x37d7, 0x366: 0x375f, 0x367: 0x37e3, 0x368: 0xa000, 0x369: 0xa000, + 0x36a: 0x3831, 0x36b: 0x3837, 0x36c: 0x3789, 0x36d: 0x380d, 0x36e: 0x3765, 0x36f: 0x37e9, + 0x370: 0x3771, 0x371: 0x37f5, 0x372: 0x3777, 0x373: 0x37fb, 0x374: 0x377d, 0x375: 0x3801, + 0x378: 0x3783, 0x379: 0x3807, + // Block 0xe, offset 0x380 + 0x387: 0x1d5d, + 0x391: 0x812d, + 0x392: 0x8132, 0x393: 0x8132, 0x394: 0x8132, 0x395: 0x8132, 0x396: 0x812d, 0x397: 0x8132, + 0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x812e, 0x39b: 0x812d, 0x39c: 0x8132, 0x39d: 0x8132, + 0x39e: 0x8132, 0x39f: 0x8132, 0x3a0: 0x8132, 0x3a1: 0x8132, 0x3a2: 0x812d, 0x3a3: 0x812d, + 0x3a4: 0x812d, 0x3a5: 0x812d, 0x3a6: 0x812d, 0x3a7: 0x812d, 0x3a8: 0x8132, 0x3a9: 0x8132, + 0x3aa: 0x812d, 0x3ab: 0x8132, 0x3ac: 0x8132, 0x3ad: 0x812e, 0x3ae: 0x8131, 0x3af: 0x8132, + 0x3b0: 0x8105, 0x3b1: 0x8106, 0x3b2: 0x8107, 0x3b3: 0x8108, 0x3b4: 0x8109, 0x3b5: 0x810a, + 0x3b6: 0x810b, 0x3b7: 0x810c, 0x3b8: 0x810d, 0x3b9: 0x810e, 0x3ba: 0x810e, 0x3bb: 0x810f, + 0x3bc: 0x8110, 0x3bd: 0x8111, 0x3bf: 0x8112, + // Block 0xf, offset 0x3c0 + 0x3c8: 0xa000, 0x3ca: 0xa000, 0x3cb: 0x8116, + 0x3cc: 0x8117, 0x3cd: 0x8118, 0x3ce: 0x8119, 0x3cf: 0x811a, 0x3d0: 0x811b, 0x3d1: 0x811c, + 0x3d2: 0x811d, 0x3d3: 0x9932, 0x3d4: 0x9932, 0x3d5: 0x992d, 0x3d6: 0x812d, 0x3d7: 0x8132, + 0x3d8: 0x8132, 0x3d9: 0x8132, 0x3da: 0x8132, 0x3db: 0x8132, 0x3dc: 0x812d, 0x3dd: 0x8132, + 0x3de: 0x8132, 0x3df: 0x812d, + 0x3f0: 0x811e, 0x3f5: 0x1d80, + 0x3f6: 0x200f, 0x3f7: 0x204b, 0x3f8: 0x2046, + // Block 0x10, offset 0x400 + 0x405: 0xa000, + 0x406: 0x2d22, 0x407: 0xa000, 0x408: 0x2d2a, 0x409: 0xa000, 0x40a: 0x2d32, 0x40b: 0xa000, + 0x40c: 0x2d3a, 0x40d: 0xa000, 0x40e: 0x2d42, 0x411: 0xa000, + 0x412: 0x2d4a, + 0x434: 0x8102, 0x435: 0x9900, + 0x43a: 0xa000, 0x43b: 0x2d52, + 0x43c: 0xa000, 0x43d: 0x2d5a, 0x43e: 0xa000, 0x43f: 0xa000, + // Block 0x11, offset 0x440 + 0x440: 0x0069, 0x441: 0x006b, 0x442: 0x006f, 0x443: 0x0083, 0x444: 0x00f5, 0x445: 0x00f8, + 0x446: 0x0413, 0x447: 0x0085, 0x448: 0x0089, 0x449: 0x008b, 0x44a: 0x0104, 0x44b: 0x0107, + 0x44c: 0x010a, 0x44d: 0x008f, 0x44f: 0x0097, 0x450: 0x009b, 0x451: 0x00e0, + 0x452: 0x009f, 0x453: 0x00fe, 0x454: 0x0417, 0x455: 0x041b, 0x456: 0x00a1, 0x457: 0x00a9, + 0x458: 0x00ab, 0x459: 0x0423, 0x45a: 0x012b, 0x45b: 0x00ad, 0x45c: 0x0427, 0x45d: 0x01be, + 0x45e: 0x01c1, 0x45f: 0x01c4, 0x460: 0x01fa, 0x461: 0x01fd, 0x462: 0x0093, 0x463: 0x00a5, + 0x464: 0x00ab, 0x465: 0x00ad, 0x466: 0x01be, 0x467: 0x01c1, 0x468: 0x01eb, 0x469: 0x01fa, + 0x46a: 0x01fd, + 0x478: 0x020c, + // Block 0x12, offset 0x480 + 0x49b: 0x00fb, 0x49c: 0x0087, 0x49d: 0x0101, + 0x49e: 0x00d4, 0x49f: 0x010a, 0x4a0: 0x008d, 0x4a1: 0x010d, 0x4a2: 0x0110, 0x4a3: 0x0116, + 0x4a4: 0x011c, 0x4a5: 0x011f, 0x4a6: 0x0122, 0x4a7: 0x042b, 0x4a8: 0x016a, 0x4a9: 0x0128, + 0x4aa: 0x042f, 0x4ab: 0x016d, 0x4ac: 0x0131, 0x4ad: 0x012e, 0x4ae: 0x0134, 0x4af: 0x0137, + 0x4b0: 0x013a, 0x4b1: 0x013d, 0x4b2: 0x0140, 0x4b3: 0x014c, 0x4b4: 0x014f, 0x4b5: 0x00ec, + 0x4b6: 0x0152, 0x4b7: 0x0155, 0x4b8: 0x041f, 0x4b9: 0x0158, 0x4ba: 0x015b, 0x4bb: 0x00b5, + 0x4bc: 0x015e, 0x4bd: 0x0161, 0x4be: 0x0164, 0x4bf: 0x01d0, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x2f93, 0x4c1: 0x329f, 0x4c2: 0x2f9d, 0x4c3: 0x32a9, 0x4c4: 0x2fa2, 0x4c5: 0x32ae, + 0x4c6: 0x2fa7, 0x4c7: 0x32b3, 0x4c8: 0x38c8, 0x4c9: 0x3a57, 0x4ca: 0x2fc0, 0x4cb: 0x32cc, + 0x4cc: 0x2fca, 0x4cd: 0x32d6, 0x4ce: 0x2fd9, 0x4cf: 0x32e5, 0x4d0: 0x2fcf, 0x4d1: 0x32db, + 0x4d2: 0x2fd4, 0x4d3: 0x32e0, 0x4d4: 0x38eb, 0x4d5: 0x3a7a, 0x4d6: 0x38f2, 0x4d7: 0x3a81, + 0x4d8: 0x3015, 0x4d9: 0x3321, 0x4da: 0x301a, 0x4db: 0x3326, 0x4dc: 0x3900, 0x4dd: 0x3a8f, + 0x4de: 0x301f, 0x4df: 0x332b, 0x4e0: 0x302e, 0x4e1: 0x333a, 0x4e2: 0x304c, 0x4e3: 0x3358, + 0x4e4: 0x305b, 0x4e5: 0x3367, 0x4e6: 0x3051, 0x4e7: 0x335d, 0x4e8: 0x3060, 0x4e9: 0x336c, + 0x4ea: 0x3065, 0x4eb: 0x3371, 0x4ec: 0x30ab, 0x4ed: 0x33b7, 0x4ee: 0x3907, 0x4ef: 0x3a96, + 0x4f0: 0x30b5, 0x4f1: 0x33c6, 0x4f2: 0x30bf, 0x4f3: 0x33d0, 0x4f4: 0x30c9, 0x4f5: 0x33da, + 0x4f6: 0x4756, 0x4f7: 0x47e7, 0x4f8: 0x390e, 0x4f9: 0x3a9d, 0x4fa: 0x30e2, 0x4fb: 0x33f3, + 0x4fc: 0x30dd, 0x4fd: 0x33ee, 0x4fe: 0x30e7, 0x4ff: 0x33f8, + // Block 0x14, offset 0x500 + 0x500: 0x30ec, 0x501: 0x33fd, 0x502: 0x30f1, 0x503: 0x3402, 0x504: 0x3105, 0x505: 0x3416, + 0x506: 0x310f, 0x507: 0x3420, 0x508: 0x311e, 0x509: 0x342f, 0x50a: 0x3119, 0x50b: 0x342a, + 0x50c: 0x3931, 0x50d: 0x3ac0, 0x50e: 0x393f, 0x50f: 0x3ace, 0x510: 0x3946, 0x511: 0x3ad5, + 0x512: 0x394d, 0x513: 0x3adc, 0x514: 0x314b, 0x515: 0x345c, 0x516: 0x3150, 0x517: 0x3461, + 0x518: 0x315a, 0x519: 0x346b, 0x51a: 0x4783, 0x51b: 0x4814, 0x51c: 0x3993, 0x51d: 0x3b22, + 0x51e: 0x3173, 0x51f: 0x3484, 0x520: 0x317d, 0x521: 0x348e, 0x522: 0x4792, 0x523: 0x4823, + 0x524: 0x399a, 0x525: 0x3b29, 0x526: 0x39a1, 0x527: 0x3b30, 0x528: 0x39a8, 0x529: 0x3b37, + 0x52a: 0x318c, 0x52b: 0x349d, 0x52c: 0x3196, 0x52d: 0x34ac, 0x52e: 0x31aa, 0x52f: 0x34c0, + 0x530: 0x31a5, 0x531: 0x34bb, 0x532: 0x31e6, 0x533: 0x34fc, 0x534: 0x31f5, 0x535: 0x350b, + 0x536: 0x31f0, 0x537: 0x3506, 0x538: 0x39af, 0x539: 0x3b3e, 0x53a: 0x39b6, 0x53b: 0x3b45, + 0x53c: 0x31fa, 0x53d: 0x3510, 0x53e: 0x31ff, 0x53f: 0x3515, + // Block 0x15, offset 0x540 + 0x540: 0x3204, 0x541: 0x351a, 0x542: 0x3209, 0x543: 0x351f, 0x544: 0x3218, 0x545: 0x352e, + 0x546: 0x3213, 0x547: 0x3529, 0x548: 0x321d, 0x549: 0x3538, 0x54a: 0x3222, 0x54b: 0x353d, + 0x54c: 0x3227, 0x54d: 0x3542, 0x54e: 0x3245, 0x54f: 0x3560, 0x550: 0x325e, 0x551: 0x357e, + 0x552: 0x326d, 0x553: 0x358d, 0x554: 0x3272, 0x555: 0x3592, 0x556: 0x3376, 0x557: 0x34a2, + 0x558: 0x3533, 0x559: 0x356f, 0x55a: 0x1bdc, 0x55b: 0x42d3, + 0x560: 0x4733, 0x561: 0x47c4, 0x562: 0x2f7f, 0x563: 0x328b, + 0x564: 0x3874, 0x565: 0x3a03, 0x566: 0x386d, 0x567: 0x39fc, 0x568: 0x3882, 0x569: 0x3a11, + 0x56a: 0x387b, 0x56b: 0x3a0a, 0x56c: 0x38ba, 0x56d: 0x3a49, 0x56e: 0x3890, 0x56f: 0x3a1f, + 0x570: 0x3889, 0x571: 0x3a18, 0x572: 0x389e, 0x573: 0x3a2d, 0x574: 0x3897, 0x575: 0x3a26, + 0x576: 0x38c1, 0x577: 0x3a50, 0x578: 0x4747, 0x579: 0x47d8, 0x57a: 0x2ffc, 0x57b: 0x3308, + 0x57c: 0x2fe8, 0x57d: 0x32f4, 0x57e: 0x38d6, 0x57f: 0x3a65, + // Block 0x16, offset 0x580 + 0x580: 0x38cf, 0x581: 0x3a5e, 0x582: 0x38e4, 0x583: 0x3a73, 0x584: 0x38dd, 0x585: 0x3a6c, + 0x586: 0x38f9, 0x587: 0x3a88, 0x588: 0x308d, 0x589: 0x3399, 0x58a: 0x30a1, 0x58b: 0x33ad, + 0x58c: 0x4779, 0x58d: 0x480a, 0x58e: 0x3132, 0x58f: 0x3443, 0x590: 0x391c, 0x591: 0x3aab, + 0x592: 0x3915, 0x593: 0x3aa4, 0x594: 0x392a, 0x595: 0x3ab9, 0x596: 0x3923, 0x597: 0x3ab2, + 0x598: 0x3985, 0x599: 0x3b14, 0x59a: 0x3969, 0x59b: 0x3af8, 0x59c: 0x3962, 0x59d: 0x3af1, + 0x59e: 0x3977, 0x59f: 0x3b06, 0x5a0: 0x3970, 0x5a1: 0x3aff, 0x5a2: 0x397e, 0x5a3: 0x3b0d, + 0x5a4: 0x31e1, 0x5a5: 0x34f7, 0x5a6: 0x31c3, 0x5a7: 0x34d9, 0x5a8: 0x39e0, 0x5a9: 0x3b6f, + 0x5aa: 0x39d9, 0x5ab: 0x3b68, 0x5ac: 0x39ee, 0x5ad: 0x3b7d, 0x5ae: 0x39e7, 0x5af: 0x3b76, + 0x5b0: 0x39f5, 0x5b1: 0x3b84, 0x5b2: 0x322c, 0x5b3: 0x3547, 0x5b4: 0x3254, 0x5b5: 0x3574, + 0x5b6: 0x324f, 0x5b7: 0x356a, 0x5b8: 0x323b, 0x5b9: 0x3556, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x4896, 0x5c1: 0x489c, 0x5c2: 0x49b0, 0x5c3: 0x49c8, 0x5c4: 0x49b8, 0x5c5: 0x49d0, + 0x5c6: 0x49c0, 0x5c7: 0x49d8, 0x5c8: 0x483c, 0x5c9: 0x4842, 0x5ca: 0x4920, 0x5cb: 0x4938, + 0x5cc: 0x4928, 0x5cd: 0x4940, 0x5ce: 0x4930, 0x5cf: 0x4948, 0x5d0: 0x48a8, 0x5d1: 0x48ae, + 0x5d2: 0x3db4, 0x5d3: 0x3dc4, 0x5d4: 0x3dbc, 0x5d5: 0x3dcc, + 0x5d8: 0x4848, 0x5d9: 0x484e, 0x5da: 0x3ce4, 0x5db: 0x3cf4, 0x5dc: 0x3cec, 0x5dd: 0x3cfc, + 0x5e0: 0x48c0, 0x5e1: 0x48c6, 0x5e2: 0x49e0, 0x5e3: 0x49f8, + 0x5e4: 0x49e8, 0x5e5: 0x4a00, 0x5e6: 0x49f0, 0x5e7: 0x4a08, 0x5e8: 0x4854, 0x5e9: 0x485a, + 0x5ea: 0x4950, 0x5eb: 0x4968, 0x5ec: 0x4958, 0x5ed: 0x4970, 0x5ee: 0x4960, 0x5ef: 0x4978, + 0x5f0: 0x48d8, 0x5f1: 0x48de, 0x5f2: 0x3e14, 0x5f3: 0x3e2c, 0x5f4: 0x3e1c, 0x5f5: 0x3e34, + 0x5f6: 0x3e24, 0x5f7: 0x3e3c, 0x5f8: 0x4860, 0x5f9: 0x4866, 0x5fa: 0x3d14, 0x5fb: 0x3d2c, + 0x5fc: 0x3d1c, 0x5fd: 0x3d34, 0x5fe: 0x3d24, 0x5ff: 0x3d3c, + // Block 0x18, offset 0x600 + 0x600: 0x48e4, 0x601: 0x48ea, 0x602: 0x3e44, 0x603: 0x3e54, 0x604: 0x3e4c, 0x605: 0x3e5c, + 0x608: 0x486c, 0x609: 0x4872, 0x60a: 0x3d44, 0x60b: 0x3d54, + 0x60c: 0x3d4c, 0x60d: 0x3d5c, 0x610: 0x48f6, 0x611: 0x48fc, + 0x612: 0x3e7c, 0x613: 0x3e94, 0x614: 0x3e84, 0x615: 0x3e9c, 0x616: 0x3e8c, 0x617: 0x3ea4, + 0x619: 0x4878, 0x61b: 0x3d64, 0x61d: 0x3d6c, + 0x61f: 0x3d74, 0x620: 0x490e, 0x621: 0x4914, 0x622: 0x4a10, 0x623: 0x4a28, + 0x624: 0x4a18, 0x625: 0x4a30, 0x626: 0x4a20, 0x627: 0x4a38, 0x628: 0x487e, 0x629: 0x4884, + 0x62a: 0x4980, 0x62b: 0x4998, 0x62c: 0x4988, 0x62d: 0x49a0, 0x62e: 0x4990, 0x62f: 0x49a8, + 0x630: 0x488a, 0x631: 0x43b0, 0x632: 0x368d, 0x633: 0x43b6, 0x634: 0x48b4, 0x635: 0x43bc, + 0x636: 0x369f, 0x637: 0x43c2, 0x638: 0x36bd, 0x639: 0x43c8, 0x63a: 0x36d5, 0x63b: 0x43ce, + 0x63c: 0x4902, 0x63d: 0x43d4, + // Block 0x19, offset 0x640 + 0x640: 0x3d9c, 0x641: 0x3da4, 0x642: 0x4180, 0x643: 0x419e, 0x644: 0x418a, 0x645: 0x41a8, + 0x646: 0x4194, 0x647: 0x41b2, 0x648: 0x3cd4, 0x649: 0x3cdc, 0x64a: 0x40cc, 0x64b: 0x40ea, + 0x64c: 0x40d6, 0x64d: 0x40f4, 0x64e: 0x40e0, 0x64f: 0x40fe, 0x650: 0x3de4, 0x651: 0x3dec, + 0x652: 0x41bc, 0x653: 0x41da, 0x654: 0x41c6, 0x655: 0x41e4, 0x656: 0x41d0, 0x657: 0x41ee, + 0x658: 0x3d04, 0x659: 0x3d0c, 0x65a: 0x4108, 0x65b: 0x4126, 0x65c: 0x4112, 0x65d: 0x4130, + 0x65e: 0x411c, 0x65f: 0x413a, 0x660: 0x3ebc, 0x661: 0x3ec4, 0x662: 0x41f8, 0x663: 0x4216, + 0x664: 0x4202, 0x665: 0x4220, 0x666: 0x420c, 0x667: 0x422a, 0x668: 0x3d7c, 0x669: 0x3d84, + 0x66a: 0x4144, 0x66b: 0x4162, 0x66c: 0x414e, 0x66d: 0x416c, 0x66e: 0x4158, 0x66f: 0x4176, + 0x670: 0x3681, 0x671: 0x367b, 0x672: 0x3d8c, 0x673: 0x3687, 0x674: 0x3d94, + 0x676: 0x48a2, 0x677: 0x3dac, 0x678: 0x35f1, 0x679: 0x35eb, 0x67a: 0x35df, 0x67b: 0x4380, + 0x67c: 0x35f7, 0x67d: 0x4283, 0x67e: 0x01d3, 0x67f: 0x4283, + // Block 0x1a, offset 0x680 + 0x680: 0x429c, 0x681: 0x4514, 0x682: 0x3dd4, 0x683: 0x3699, 0x684: 0x3ddc, + 0x686: 0x48cc, 0x687: 0x3df4, 0x688: 0x35fd, 0x689: 0x4386, 0x68a: 0x3609, 0x68b: 0x438c, + 0x68c: 0x3615, 0x68d: 0x451b, 0x68e: 0x4522, 0x68f: 0x4529, 0x690: 0x36b1, 0x691: 0x36ab, + 0x692: 0x3dfc, 0x693: 0x4576, 0x696: 0x36b7, 0x697: 0x3e0c, + 0x698: 0x362d, 0x699: 0x3627, 0x69a: 0x361b, 0x69b: 0x4392, 0x69d: 0x4530, + 0x69e: 0x4537, 0x69f: 0x453e, 0x6a0: 0x36e7, 0x6a1: 0x36e1, 0x6a2: 0x3e64, 0x6a3: 0x457e, + 0x6a4: 0x36c9, 0x6a5: 0x36cf, 0x6a6: 0x36ed, 0x6a7: 0x3e74, 0x6a8: 0x365d, 0x6a9: 0x3657, + 0x6aa: 0x364b, 0x6ab: 0x439e, 0x6ac: 0x3645, 0x6ad: 0x4506, 0x6ae: 0x450d, 0x6af: 0x0081, + 0x6b2: 0x3eac, 0x6b3: 0x36f3, 0x6b4: 0x3eb4, + 0x6b6: 0x491a, 0x6b7: 0x3ecc, 0x6b8: 0x3639, 0x6b9: 0x4398, 0x6ba: 0x3669, 0x6bb: 0x43aa, + 0x6bc: 0x3675, 0x6bd: 0x4256, 0x6be: 0x4288, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x1bd4, 0x6c1: 0x1bd8, 0x6c2: 0x0047, 0x6c3: 0x1c50, 0x6c5: 0x1be4, + 0x6c6: 0x1be8, 0x6c7: 0x00e9, 0x6c9: 0x1c54, 0x6ca: 0x008f, 0x6cb: 0x0051, + 0x6cc: 0x0051, 0x6cd: 0x0051, 0x6ce: 0x0091, 0x6cf: 0x00da, 0x6d0: 0x0053, 0x6d1: 0x0053, + 0x6d2: 0x0059, 0x6d3: 0x0099, 0x6d5: 0x005d, 0x6d6: 0x1989, + 0x6d9: 0x0061, 0x6da: 0x0063, 0x6db: 0x0065, 0x6dc: 0x0065, 0x6dd: 0x0065, + 0x6e0: 0x199b, 0x6e1: 0x1bc4, 0x6e2: 0x19a4, + 0x6e4: 0x0075, 0x6e6: 0x01b8, 0x6e8: 0x0075, + 0x6ea: 0x0057, 0x6eb: 0x42ce, 0x6ec: 0x0045, 0x6ed: 0x0047, 0x6ef: 0x008b, + 0x6f0: 0x004b, 0x6f1: 0x004d, 0x6f3: 0x005b, 0x6f4: 0x009f, 0x6f5: 0x0215, + 0x6f6: 0x0218, 0x6f7: 0x021b, 0x6f8: 0x021e, 0x6f9: 0x0093, 0x6fb: 0x1b94, + 0x6fc: 0x01e8, 0x6fd: 0x01c1, 0x6fe: 0x0179, 0x6ff: 0x01a0, + // Block 0x1c, offset 0x700 + 0x700: 0x0463, 0x705: 0x0049, + 0x706: 0x0089, 0x707: 0x008b, 0x708: 0x0093, 0x709: 0x0095, + 0x710: 0x222a, 0x711: 0x2236, + 0x712: 0x22ea, 0x713: 0x2212, 0x714: 0x2296, 0x715: 0x221e, 0x716: 0x229c, 0x717: 0x22b4, + 0x718: 0x22c0, 0x719: 0x2224, 0x71a: 0x22c6, 0x71b: 0x2230, 0x71c: 0x22ba, 0x71d: 0x22cc, + 0x71e: 0x22d2, 0x71f: 0x1cb8, 0x720: 0x0053, 0x721: 0x1956, 0x722: 0x1ba0, 0x723: 0x195f, + 0x724: 0x006d, 0x725: 0x19a7, 0x726: 0x1bcc, 0x727: 0x1d44, 0x728: 0x1962, 0x729: 0x0071, + 0x72a: 0x19b3, 0x72b: 0x1bd0, 0x72c: 0x0059, 0x72d: 0x0047, 0x72e: 0x0049, 0x72f: 0x005b, + 0x730: 0x0093, 0x731: 0x19e0, 0x732: 0x1c14, 0x733: 0x19e9, 0x734: 0x00ad, 0x735: 0x1a5e, + 0x736: 0x1c48, 0x737: 0x1d58, 0x738: 0x19ec, 0x739: 0x00b1, 0x73a: 0x1a61, 0x73b: 0x1c4c, + 0x73c: 0x0099, 0x73d: 0x0087, 0x73e: 0x0089, 0x73f: 0x009b, + // Block 0x1d, offset 0x740 + 0x741: 0x3c02, 0x743: 0xa000, 0x744: 0x3c09, 0x745: 0xa000, + 0x747: 0x3c10, 0x748: 0xa000, 0x749: 0x3c17, + 0x74d: 0xa000, + 0x760: 0x2f61, 0x761: 0xa000, 0x762: 0x3c25, + 0x764: 0xa000, 0x765: 0xa000, + 0x76d: 0x3c1e, 0x76e: 0x2f5c, 0x76f: 0x2f66, + 0x770: 0x3c2c, 0x771: 0x3c33, 0x772: 0xa000, 0x773: 0xa000, 0x774: 0x3c3a, 0x775: 0x3c41, + 0x776: 0xa000, 0x777: 0xa000, 0x778: 0x3c48, 0x779: 0x3c4f, 0x77a: 0xa000, 0x77b: 0xa000, + 0x77c: 0xa000, 0x77d: 0xa000, + // Block 0x1e, offset 0x780 + 0x780: 0x3c56, 0x781: 0x3c5d, 0x782: 0xa000, 0x783: 0xa000, 0x784: 0x3c72, 0x785: 0x3c79, + 0x786: 0xa000, 0x787: 0xa000, 0x788: 0x3c80, 0x789: 0x3c87, + 0x791: 0xa000, + 0x792: 0xa000, + 0x7a2: 0xa000, + 0x7a8: 0xa000, 0x7a9: 0xa000, + 0x7ab: 0xa000, 0x7ac: 0x3c9c, 0x7ad: 0x3ca3, 0x7ae: 0x3caa, 0x7af: 0x3cb1, + 0x7b2: 0xa000, 0x7b3: 0xa000, 0x7b4: 0xa000, 0x7b5: 0xa000, + // Block 0x1f, offset 0x7c0 + 0x7e0: 0x0023, 0x7e1: 0x0025, 0x7e2: 0x0027, 0x7e3: 0x0029, + 0x7e4: 0x002b, 0x7e5: 0x002d, 0x7e6: 0x002f, 0x7e7: 0x0031, 0x7e8: 0x0033, 0x7e9: 0x187e, + 0x7ea: 0x1881, 0x7eb: 0x1884, 0x7ec: 0x1887, 0x7ed: 0x188a, 0x7ee: 0x188d, 0x7ef: 0x1890, + 0x7f0: 0x1893, 0x7f1: 0x1896, 0x7f2: 0x1899, 0x7f3: 0x18a2, 0x7f4: 0x1a64, 0x7f5: 0x1a68, + 0x7f6: 0x1a6c, 0x7f7: 0x1a70, 0x7f8: 0x1a74, 0x7f9: 0x1a78, 0x7fa: 0x1a7c, 0x7fb: 0x1a80, + 0x7fc: 0x1a84, 0x7fd: 0x1c7c, 0x7fe: 0x1c81, 0x7ff: 0x1c86, + // Block 0x20, offset 0x800 + 0x800: 0x1c8b, 0x801: 0x1c90, 0x802: 0x1c95, 0x803: 0x1c9a, 0x804: 0x1c9f, 0x805: 0x1ca4, + 0x806: 0x1ca9, 0x807: 0x1cae, 0x808: 0x187b, 0x809: 0x189f, 0x80a: 0x18c3, 0x80b: 0x18e7, + 0x80c: 0x190b, 0x80d: 0x1914, 0x80e: 0x191a, 0x80f: 0x1920, 0x810: 0x1926, 0x811: 0x1b5c, + 0x812: 0x1b60, 0x813: 0x1b64, 0x814: 0x1b68, 0x815: 0x1b6c, 0x816: 0x1b70, 0x817: 0x1b74, + 0x818: 0x1b78, 0x819: 0x1b7c, 0x81a: 0x1b80, 0x81b: 0x1b84, 0x81c: 0x1af0, 0x81d: 0x1af4, + 0x81e: 0x1af8, 0x81f: 0x1afc, 0x820: 0x1b00, 0x821: 0x1b04, 0x822: 0x1b08, 0x823: 0x1b0c, + 0x824: 0x1b10, 0x825: 0x1b14, 0x826: 0x1b18, 0x827: 0x1b1c, 0x828: 0x1b20, 0x829: 0x1b24, + 0x82a: 0x1b28, 0x82b: 0x1b2c, 0x82c: 0x1b30, 0x82d: 0x1b34, 0x82e: 0x1b38, 0x82f: 0x1b3c, + 0x830: 0x1b40, 0x831: 0x1b44, 0x832: 0x1b48, 0x833: 0x1b4c, 0x834: 0x1b50, 0x835: 0x1b54, + 0x836: 0x0043, 0x837: 0x0045, 0x838: 0x0047, 0x839: 0x0049, 0x83a: 0x004b, 0x83b: 0x004d, + 0x83c: 0x004f, 0x83d: 0x0051, 0x83e: 0x0053, 0x83f: 0x0055, + // Block 0x21, offset 0x840 + 0x840: 0x06bf, 0x841: 0x06e3, 0x842: 0x06ef, 0x843: 0x06ff, 0x844: 0x0707, 0x845: 0x0713, + 0x846: 0x071b, 0x847: 0x0723, 0x848: 0x072f, 0x849: 0x0783, 0x84a: 0x079b, 0x84b: 0x07ab, + 0x84c: 0x07bb, 0x84d: 0x07cb, 0x84e: 0x07db, 0x84f: 0x07fb, 0x850: 0x07ff, 0x851: 0x0803, + 0x852: 0x0837, 0x853: 0x085f, 0x854: 0x086f, 0x855: 0x0877, 0x856: 0x087b, 0x857: 0x0887, + 0x858: 0x08a3, 0x859: 0x08a7, 0x85a: 0x08bf, 0x85b: 0x08c3, 0x85c: 0x08cb, 0x85d: 0x08db, + 0x85e: 0x0977, 0x85f: 0x098b, 0x860: 0x09cb, 0x861: 0x09df, 0x862: 0x09e7, 0x863: 0x09eb, + 0x864: 0x09fb, 0x865: 0x0a17, 0x866: 0x0a43, 0x867: 0x0a4f, 0x868: 0x0a6f, 0x869: 0x0a7b, + 0x86a: 0x0a7f, 0x86b: 0x0a83, 0x86c: 0x0a9b, 0x86d: 0x0a9f, 0x86e: 0x0acb, 0x86f: 0x0ad7, + 0x870: 0x0adf, 0x871: 0x0ae7, 0x872: 0x0af7, 0x873: 0x0aff, 0x874: 0x0b07, 0x875: 0x0b33, + 0x876: 0x0b37, 0x877: 0x0b3f, 0x878: 0x0b43, 0x879: 0x0b4b, 0x87a: 0x0b53, 0x87b: 0x0b63, + 0x87c: 0x0b7f, 0x87d: 0x0bf7, 0x87e: 0x0c0b, 0x87f: 0x0c0f, + // Block 0x22, offset 0x880 + 0x880: 0x0c8f, 0x881: 0x0c93, 0x882: 0x0ca7, 0x883: 0x0cab, 0x884: 0x0cb3, 0x885: 0x0cbb, + 0x886: 0x0cc3, 0x887: 0x0ccf, 0x888: 0x0cf7, 0x889: 0x0d07, 0x88a: 0x0d1b, 0x88b: 0x0d8b, + 0x88c: 0x0d97, 0x88d: 0x0da7, 0x88e: 0x0db3, 0x88f: 0x0dbf, 0x890: 0x0dc7, 0x891: 0x0dcb, + 0x892: 0x0dcf, 0x893: 0x0dd3, 0x894: 0x0dd7, 0x895: 0x0e8f, 0x896: 0x0ed7, 0x897: 0x0ee3, + 0x898: 0x0ee7, 0x899: 0x0eeb, 0x89a: 0x0eef, 0x89b: 0x0ef7, 0x89c: 0x0efb, 0x89d: 0x0f0f, + 0x89e: 0x0f2b, 0x89f: 0x0f33, 0x8a0: 0x0f73, 0x8a1: 0x0f77, 0x8a2: 0x0f7f, 0x8a3: 0x0f83, + 0x8a4: 0x0f8b, 0x8a5: 0x0f8f, 0x8a6: 0x0fb3, 0x8a7: 0x0fb7, 0x8a8: 0x0fd3, 0x8a9: 0x0fd7, + 0x8aa: 0x0fdb, 0x8ab: 0x0fdf, 0x8ac: 0x0ff3, 0x8ad: 0x1017, 0x8ae: 0x101b, 0x8af: 0x101f, + 0x8b0: 0x1043, 0x8b1: 0x1083, 0x8b2: 0x1087, 0x8b3: 0x10a7, 0x8b4: 0x10b7, 0x8b5: 0x10bf, + 0x8b6: 0x10df, 0x8b7: 0x1103, 0x8b8: 0x1147, 0x8b9: 0x114f, 0x8ba: 0x1163, 0x8bb: 0x116f, + 0x8bc: 0x1177, 0x8bd: 0x117f, 0x8be: 0x1183, 0x8bf: 0x1187, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x119f, 0x8c1: 0x11a3, 0x8c2: 0x11bf, 0x8c3: 0x11c7, 0x8c4: 0x11cf, 0x8c5: 0x11d3, + 0x8c6: 0x11df, 0x8c7: 0x11e7, 0x8c8: 0x11eb, 0x8c9: 0x11ef, 0x8ca: 0x11f7, 0x8cb: 0x11fb, + 0x8cc: 0x129b, 0x8cd: 0x12af, 0x8ce: 0x12e3, 0x8cf: 0x12e7, 0x8d0: 0x12ef, 0x8d1: 0x131b, + 0x8d2: 0x1323, 0x8d3: 0x132b, 0x8d4: 0x1333, 0x8d5: 0x136f, 0x8d6: 0x1373, 0x8d7: 0x137b, + 0x8d8: 0x137f, 0x8d9: 0x1383, 0x8da: 0x13af, 0x8db: 0x13b3, 0x8dc: 0x13bb, 0x8dd: 0x13cf, + 0x8de: 0x13d3, 0x8df: 0x13ef, 0x8e0: 0x13f7, 0x8e1: 0x13fb, 0x8e2: 0x141f, 0x8e3: 0x143f, + 0x8e4: 0x144f, 0x8e5: 0x1453, 0x8e6: 0x145b, 0x8e7: 0x1487, 0x8e8: 0x148b, 0x8e9: 0x149b, + 0x8ea: 0x14bf, 0x8eb: 0x14cb, 0x8ec: 0x14db, 0x8ed: 0x14f3, 0x8ee: 0x14fb, 0x8ef: 0x14ff, + 0x8f0: 0x1503, 0x8f1: 0x1507, 0x8f2: 0x1513, 0x8f3: 0x1517, 0x8f4: 0x151f, 0x8f5: 0x153b, + 0x8f6: 0x153f, 0x8f7: 0x1543, 0x8f8: 0x155b, 0x8f9: 0x155f, 0x8fa: 0x1567, 0x8fb: 0x157b, + 0x8fc: 0x157f, 0x8fd: 0x1583, 0x8fe: 0x158b, 0x8ff: 0x158f, + // Block 0x24, offset 0x900 + 0x906: 0xa000, 0x90b: 0xa000, + 0x90c: 0x3f04, 0x90d: 0xa000, 0x90e: 0x3f0c, 0x90f: 0xa000, 0x910: 0x3f14, 0x911: 0xa000, + 0x912: 0x3f1c, 0x913: 0xa000, 0x914: 0x3f24, 0x915: 0xa000, 0x916: 0x3f2c, 0x917: 0xa000, + 0x918: 0x3f34, 0x919: 0xa000, 0x91a: 0x3f3c, 0x91b: 0xa000, 0x91c: 0x3f44, 0x91d: 0xa000, + 0x91e: 0x3f4c, 0x91f: 0xa000, 0x920: 0x3f54, 0x921: 0xa000, 0x922: 0x3f5c, + 0x924: 0xa000, 0x925: 0x3f64, 0x926: 0xa000, 0x927: 0x3f6c, 0x928: 0xa000, 0x929: 0x3f74, + 0x92f: 0xa000, + 0x930: 0x3f7c, 0x931: 0x3f84, 0x932: 0xa000, 0x933: 0x3f8c, 0x934: 0x3f94, 0x935: 0xa000, + 0x936: 0x3f9c, 0x937: 0x3fa4, 0x938: 0xa000, 0x939: 0x3fac, 0x93a: 0x3fb4, 0x93b: 0xa000, + 0x93c: 0x3fbc, 0x93d: 0x3fc4, + // Block 0x25, offset 0x940 + 0x954: 0x3efc, + 0x959: 0x9903, 0x95a: 0x9903, 0x95b: 0x436e, 0x95c: 0x4374, 0x95d: 0xa000, + 0x95e: 0x3fcc, 0x95f: 0x26b0, + 0x966: 0xa000, + 0x96b: 0xa000, 0x96c: 0x3fdc, 0x96d: 0xa000, 0x96e: 0x3fe4, 0x96f: 0xa000, + 0x970: 0x3fec, 0x971: 0xa000, 0x972: 0x3ff4, 0x973: 0xa000, 0x974: 0x3ffc, 0x975: 0xa000, + 0x976: 0x4004, 0x977: 0xa000, 0x978: 0x400c, 0x979: 0xa000, 0x97a: 0x4014, 0x97b: 0xa000, + 0x97c: 0x401c, 0x97d: 0xa000, 0x97e: 0x4024, 0x97f: 0xa000, + // Block 0x26, offset 0x980 + 0x980: 0x402c, 0x981: 0xa000, 0x982: 0x4034, 0x984: 0xa000, 0x985: 0x403c, + 0x986: 0xa000, 0x987: 0x4044, 0x988: 0xa000, 0x989: 0x404c, + 0x98f: 0xa000, 0x990: 0x4054, 0x991: 0x405c, + 0x992: 0xa000, 0x993: 0x4064, 0x994: 0x406c, 0x995: 0xa000, 0x996: 0x4074, 0x997: 0x407c, + 0x998: 0xa000, 0x999: 0x4084, 0x99a: 0x408c, 0x99b: 0xa000, 0x99c: 0x4094, 0x99d: 0x409c, + 0x9af: 0xa000, + 0x9b0: 0xa000, 0x9b1: 0xa000, 0x9b2: 0xa000, 0x9b4: 0x3fd4, + 0x9b7: 0x40a4, 0x9b8: 0x40ac, 0x9b9: 0x40b4, 0x9ba: 0x40bc, + 0x9bd: 0xa000, 0x9be: 0x40c4, 0x9bf: 0x26c5, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x0367, 0x9c1: 0x032b, 0x9c2: 0x032f, 0x9c3: 0x0333, 0x9c4: 0x037b, 0x9c5: 0x0337, + 0x9c6: 0x033b, 0x9c7: 0x033f, 0x9c8: 0x0343, 0x9c9: 0x0347, 0x9ca: 0x034b, 0x9cb: 0x034f, + 0x9cc: 0x0353, 0x9cd: 0x0357, 0x9ce: 0x035b, 0x9cf: 0x42d8, 0x9d0: 0x42dd, 0x9d1: 0x42e2, + 0x9d2: 0x42e7, 0x9d3: 0x42ec, 0x9d4: 0x42f1, 0x9d5: 0x42f6, 0x9d6: 0x42fb, 0x9d7: 0x4300, + 0x9d8: 0x4305, 0x9d9: 0x430a, 0x9da: 0x430f, 0x9db: 0x4314, 0x9dc: 0x4319, 0x9dd: 0x431e, + 0x9de: 0x4323, 0x9df: 0x4328, 0x9e0: 0x432d, 0x9e1: 0x4332, 0x9e2: 0x4337, 0x9e3: 0x433c, + 0x9e4: 0x03c3, 0x9e5: 0x035f, 0x9e6: 0x0363, 0x9e7: 0x03e7, 0x9e8: 0x03eb, 0x9e9: 0x03ef, + 0x9ea: 0x03f3, 0x9eb: 0x03f7, 0x9ec: 0x03fb, 0x9ed: 0x03ff, 0x9ee: 0x036b, 0x9ef: 0x0403, + 0x9f0: 0x0407, 0x9f1: 0x036f, 0x9f2: 0x0373, 0x9f3: 0x0377, 0x9f4: 0x037f, 0x9f5: 0x0383, + 0x9f6: 0x0387, 0x9f7: 0x038b, 0x9f8: 0x038f, 0x9f9: 0x0393, 0x9fa: 0x0397, 0x9fb: 0x039b, + 0x9fc: 0x039f, 0x9fd: 0x03a3, 0x9fe: 0x03a7, 0x9ff: 0x03ab, + // Block 0x28, offset 0xa00 + 0xa00: 0x03af, 0xa01: 0x03b3, 0xa02: 0x040b, 0xa03: 0x040f, 0xa04: 0x03b7, 0xa05: 0x03bb, + 0xa06: 0x03bf, 0xa07: 0x03c7, 0xa08: 0x03cb, 0xa09: 0x03cf, 0xa0a: 0x03d3, 0xa0b: 0x03d7, + 0xa0c: 0x03db, 0xa0d: 0x03df, 0xa0e: 0x03e3, + 0xa12: 0x06bf, 0xa13: 0x071b, 0xa14: 0x06cb, 0xa15: 0x097b, 0xa16: 0x06cf, 0xa17: 0x06e7, + 0xa18: 0x06d3, 0xa19: 0x0f93, 0xa1a: 0x0707, 0xa1b: 0x06db, 0xa1c: 0x06c3, 0xa1d: 0x09ff, + 0xa1e: 0x098f, 0xa1f: 0x072f, + // Block 0x29, offset 0xa40 + 0xa40: 0x2050, 0xa41: 0x2056, 0xa42: 0x205c, 0xa43: 0x2062, 0xa44: 0x2068, 0xa45: 0x206e, + 0xa46: 0x2074, 0xa47: 0x207a, 0xa48: 0x2080, 0xa49: 0x2086, 0xa4a: 0x208c, 0xa4b: 0x2092, + 0xa4c: 0x2098, 0xa4d: 0x209e, 0xa4e: 0x2722, 0xa4f: 0x272b, 0xa50: 0x2734, 0xa51: 0x273d, + 0xa52: 0x2746, 0xa53: 0x274f, 0xa54: 0x2758, 0xa55: 0x2761, 0xa56: 0x276a, 0xa57: 0x277c, + 0xa58: 0x2785, 0xa59: 0x278e, 0xa5a: 0x2797, 0xa5b: 0x27a0, 0xa5c: 0x2773, 0xa5d: 0x2ba8, + 0xa5e: 0x2ae9, 0xa60: 0x20a4, 0xa61: 0x20bc, 0xa62: 0x20b0, 0xa63: 0x2104, + 0xa64: 0x20c2, 0xa65: 0x20e0, 0xa66: 0x20aa, 0xa67: 0x20da, 0xa68: 0x20b6, 0xa69: 0x20ec, + 0xa6a: 0x211c, 0xa6b: 0x213a, 0xa6c: 0x2134, 0xa6d: 0x2128, 0xa6e: 0x2176, 0xa6f: 0x210a, + 0xa70: 0x2116, 0xa71: 0x212e, 0xa72: 0x2122, 0xa73: 0x214c, 0xa74: 0x20f8, 0xa75: 0x2140, + 0xa76: 0x216a, 0xa77: 0x2152, 0xa78: 0x20e6, 0xa79: 0x20c8, 0xa7a: 0x20fe, 0xa7b: 0x2110, + 0xa7c: 0x2146, 0xa7d: 0x20ce, 0xa7e: 0x2170, 0xa7f: 0x20f2, + // Block 0x2a, offset 0xa80 + 0xa80: 0x2158, 0xa81: 0x20d4, 0xa82: 0x215e, 0xa83: 0x2164, 0xa84: 0x092f, 0xa85: 0x0b03, + 0xa86: 0x0ca7, 0xa87: 0x10c7, + 0xa90: 0x1bc0, 0xa91: 0x18a5, + 0xa92: 0x18a8, 0xa93: 0x18ab, 0xa94: 0x18ae, 0xa95: 0x18b1, 0xa96: 0x18b4, 0xa97: 0x18b7, + 0xa98: 0x18ba, 0xa99: 0x18bd, 0xa9a: 0x18c6, 0xa9b: 0x18c9, 0xa9c: 0x18cc, 0xa9d: 0x18cf, + 0xa9e: 0x18d2, 0xa9f: 0x18d5, 0xaa0: 0x0313, 0xaa1: 0x031b, 0xaa2: 0x031f, 0xaa3: 0x0327, + 0xaa4: 0x032b, 0xaa5: 0x032f, 0xaa6: 0x0337, 0xaa7: 0x033f, 0xaa8: 0x0343, 0xaa9: 0x034b, + 0xaaa: 0x034f, 0xaab: 0x0353, 0xaac: 0x0357, 0xaad: 0x035b, 0xaae: 0x2e14, 0xaaf: 0x2e1c, + 0xab0: 0x2e24, 0xab1: 0x2e2c, 0xab2: 0x2e34, 0xab3: 0x2e3c, 0xab4: 0x2e44, 0xab5: 0x2e4c, + 0xab6: 0x2e5c, 0xab7: 0x2e64, 0xab8: 0x2e6c, 0xab9: 0x2e74, 0xaba: 0x2e7c, 0xabb: 0x2e84, + 0xabc: 0x2ecf, 0xabd: 0x2e97, 0xabe: 0x2e54, + // Block 0x2b, offset 0xac0 + 0xac0: 0x06bf, 0xac1: 0x071b, 0xac2: 0x06cb, 0xac3: 0x097b, 0xac4: 0x071f, 0xac5: 0x07af, + 0xac6: 0x06c7, 0xac7: 0x07ab, 0xac8: 0x070b, 0xac9: 0x0887, 0xaca: 0x0d07, 0xacb: 0x0e8f, + 0xacc: 0x0dd7, 0xacd: 0x0d1b, 0xace: 0x145b, 0xacf: 0x098b, 0xad0: 0x0ccf, 0xad1: 0x0d4b, + 0xad2: 0x0d0b, 0xad3: 0x104b, 0xad4: 0x08fb, 0xad5: 0x0f03, 0xad6: 0x1387, 0xad7: 0x105f, + 0xad8: 0x0843, 0xad9: 0x108f, 0xada: 0x0f9b, 0xadb: 0x0a17, 0xadc: 0x140f, 0xadd: 0x077f, + 0xade: 0x08ab, 0xadf: 0x0df7, 0xae0: 0x1523, 0xae1: 0x0743, 0xae2: 0x07d3, 0xae3: 0x0d9b, + 0xae4: 0x06cf, 0xae5: 0x06e7, 0xae6: 0x06d3, 0xae7: 0x0adb, 0xae8: 0x08ef, 0xae9: 0x087f, + 0xaea: 0x0a57, 0xaeb: 0x0a4b, 0xaec: 0x0feb, 0xaed: 0x073f, 0xaee: 0x139b, 0xaef: 0x089b, + 0xaf0: 0x09f3, 0xaf1: 0x18d8, 0xaf2: 0x18db, 0xaf3: 0x18de, 0xaf4: 0x18e1, 0xaf5: 0x18ea, + 0xaf6: 0x18ed, 0xaf7: 0x18f0, 0xaf8: 0x18f3, 0xaf9: 0x18f6, 0xafa: 0x18f9, 0xafb: 0x18fc, + 0xafc: 0x18ff, 0xafd: 0x1902, 0xafe: 0x1905, 0xaff: 0x190e, + // Block 0x2c, offset 0xb00 + 0xb00: 0x1cc2, 0xb01: 0x1cd1, 0xb02: 0x1ce0, 0xb03: 0x1cef, 0xb04: 0x1cfe, 0xb05: 0x1d0d, + 0xb06: 0x1d1c, 0xb07: 0x1d2b, 0xb08: 0x1d3a, 0xb09: 0x2188, 0xb0a: 0x219a, 0xb0b: 0x21ac, + 0xb0c: 0x1950, 0xb0d: 0x1c00, 0xb0e: 0x19ce, 0xb0f: 0x1ba4, 0xb10: 0x04cb, 0xb11: 0x04d3, + 0xb12: 0x04db, 0xb13: 0x04e3, 0xb14: 0x04eb, 0xb15: 0x04ef, 0xb16: 0x04f3, 0xb17: 0x04f7, + 0xb18: 0x04fb, 0xb19: 0x04ff, 0xb1a: 0x0503, 0xb1b: 0x0507, 0xb1c: 0x050b, 0xb1d: 0x050f, + 0xb1e: 0x0513, 0xb1f: 0x0517, 0xb20: 0x051b, 0xb21: 0x0523, 0xb22: 0x0527, 0xb23: 0x052b, + 0xb24: 0x052f, 0xb25: 0x0533, 0xb26: 0x0537, 0xb27: 0x053b, 0xb28: 0x053f, 0xb29: 0x0543, + 0xb2a: 0x0547, 0xb2b: 0x054b, 0xb2c: 0x054f, 0xb2d: 0x0553, 0xb2e: 0x0557, 0xb2f: 0x055b, + 0xb30: 0x055f, 0xb31: 0x0563, 0xb32: 0x0567, 0xb33: 0x056f, 0xb34: 0x0577, 0xb35: 0x057f, + 0xb36: 0x0583, 0xb37: 0x0587, 0xb38: 0x058b, 0xb39: 0x058f, 0xb3a: 0x0593, 0xb3b: 0x0597, + 0xb3c: 0x059b, 0xb3d: 0x059f, 0xb3e: 0x05a3, + // Block 0x2d, offset 0xb40 + 0xb40: 0x2b08, 0xb41: 0x29a4, 0xb42: 0x2b18, 0xb43: 0x287c, 0xb44: 0x2ee0, 0xb45: 0x2886, + 0xb46: 0x2890, 0xb47: 0x2f24, 0xb48: 0x29b1, 0xb49: 0x289a, 0xb4a: 0x28a4, 0xb4b: 0x28ae, + 0xb4c: 0x29d8, 0xb4d: 0x29e5, 0xb4e: 0x29be, 0xb4f: 0x29cb, 0xb50: 0x2ea5, 0xb51: 0x29f2, + 0xb52: 0x29ff, 0xb53: 0x2bba, 0xb54: 0x26b7, 0xb55: 0x2bcd, 0xb56: 0x2be0, 0xb57: 0x2b28, + 0xb58: 0x2a0c, 0xb59: 0x2bf3, 0xb5a: 0x2c06, 0xb5b: 0x2a19, 0xb5c: 0x28b8, 0xb5d: 0x28c2, + 0xb5e: 0x2eb3, 0xb5f: 0x2a26, 0xb60: 0x2b38, 0xb61: 0x2ef1, 0xb62: 0x28cc, 0xb63: 0x28d6, + 0xb64: 0x2a33, 0xb65: 0x28e0, 0xb66: 0x28ea, 0xb67: 0x26cc, 0xb68: 0x26d3, 0xb69: 0x28f4, + 0xb6a: 0x28fe, 0xb6b: 0x2c19, 0xb6c: 0x2a40, 0xb6d: 0x2b48, 0xb6e: 0x2c2c, 0xb6f: 0x2a4d, + 0xb70: 0x2912, 0xb71: 0x2908, 0xb72: 0x2f38, 0xb73: 0x2a5a, 0xb74: 0x2c3f, 0xb75: 0x291c, + 0xb76: 0x2b58, 0xb77: 0x2926, 0xb78: 0x2a74, 0xb79: 0x2930, 0xb7a: 0x2a81, 0xb7b: 0x2f02, + 0xb7c: 0x2a67, 0xb7d: 0x2b68, 0xb7e: 0x2a8e, 0xb7f: 0x26da, + // Block 0x2e, offset 0xb80 + 0xb80: 0x2f13, 0xb81: 0x293a, 0xb82: 0x2944, 0xb83: 0x2a9b, 0xb84: 0x294e, 0xb85: 0x2958, + 0xb86: 0x2962, 0xb87: 0x2b78, 0xb88: 0x2aa8, 0xb89: 0x26e1, 0xb8a: 0x2c52, 0xb8b: 0x2e8c, + 0xb8c: 0x2b88, 0xb8d: 0x2ab5, 0xb8e: 0x2ec1, 0xb8f: 0x296c, 0xb90: 0x2976, 0xb91: 0x2ac2, + 0xb92: 0x26e8, 0xb93: 0x2acf, 0xb94: 0x2b98, 0xb95: 0x26ef, 0xb96: 0x2c65, 0xb97: 0x2980, + 0xb98: 0x1cb3, 0xb99: 0x1cc7, 0xb9a: 0x1cd6, 0xb9b: 0x1ce5, 0xb9c: 0x1cf4, 0xb9d: 0x1d03, + 0xb9e: 0x1d12, 0xb9f: 0x1d21, 0xba0: 0x1d30, 0xba1: 0x1d3f, 0xba2: 0x218e, 0xba3: 0x21a0, + 0xba4: 0x21b2, 0xba5: 0x21be, 0xba6: 0x21ca, 0xba7: 0x21d6, 0xba8: 0x21e2, 0xba9: 0x21ee, + 0xbaa: 0x21fa, 0xbab: 0x2206, 0xbac: 0x2242, 0xbad: 0x224e, 0xbae: 0x225a, 0xbaf: 0x2266, + 0xbb0: 0x2272, 0xbb1: 0x1c10, 0xbb2: 0x19c2, 0xbb3: 0x1932, 0xbb4: 0x1be0, 0xbb5: 0x1a43, + 0xbb6: 0x1a52, 0xbb7: 0x19c8, 0xbb8: 0x1bf8, 0xbb9: 0x1bfc, 0xbba: 0x195c, 0xbbb: 0x26fd, + 0xbbc: 0x270b, 0xbbd: 0x26f6, 0xbbe: 0x2704, 0xbbf: 0x2adc, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x1a46, 0xbc1: 0x1a2e, 0xbc2: 0x1c5c, 0xbc3: 0x1a16, 0xbc4: 0x19ef, 0xbc5: 0x1965, + 0xbc6: 0x1974, 0xbc7: 0x1944, 0xbc8: 0x1bec, 0xbc9: 0x1d4e, 0xbca: 0x1a49, 0xbcb: 0x1a31, + 0xbcc: 0x1c60, 0xbcd: 0x1c6c, 0xbce: 0x1a22, 0xbcf: 0x19f8, 0xbd0: 0x1953, 0xbd1: 0x1c18, + 0xbd2: 0x1bac, 0xbd3: 0x1b98, 0xbd4: 0x1bc8, 0xbd5: 0x1c70, 0xbd6: 0x1a25, 0xbd7: 0x19c5, + 0xbd8: 0x19fb, 0xbd9: 0x19da, 0xbda: 0x1a3d, 0xbdb: 0x1c74, 0xbdc: 0x1a28, 0xbdd: 0x19bc, + 0xbde: 0x19fe, 0xbdf: 0x1c38, 0xbe0: 0x1bf0, 0xbe1: 0x1a10, 0xbe2: 0x1c20, 0xbe3: 0x1c3c, + 0xbe4: 0x1bf4, 0xbe5: 0x1a13, 0xbe6: 0x1c24, 0xbe7: 0x22e4, 0xbe8: 0x22f8, 0xbe9: 0x1992, + 0xbea: 0x1c1c, 0xbeb: 0x1bb0, 0xbec: 0x1b9c, 0xbed: 0x1c44, 0xbee: 0x2712, 0xbef: 0x27a9, + 0xbf0: 0x1a55, 0xbf1: 0x1a40, 0xbf2: 0x1c78, 0xbf3: 0x1a2b, 0xbf4: 0x1a4c, 0xbf5: 0x1a34, + 0xbf6: 0x1c64, 0xbf7: 0x1a19, 0xbf8: 0x19f2, 0xbf9: 0x197d, 0xbfa: 0x1a4f, 0xbfb: 0x1a37, + 0xbfc: 0x1c68, 0xbfd: 0x1a1c, 0xbfe: 0x19f5, 0xbff: 0x1980, + // Block 0x30, offset 0xc00 + 0xc00: 0x1c28, 0xc01: 0x1bb4, 0xc02: 0x1d49, 0xc03: 0x1935, 0xc04: 0x19b6, 0xc05: 0x19b9, + 0xc06: 0x22f1, 0xc07: 0x1b90, 0xc08: 0x19bf, 0xc09: 0x1947, 0xc0a: 0x19dd, 0xc0b: 0x194a, + 0xc0c: 0x19e6, 0xc0d: 0x1968, 0xc0e: 0x196b, 0xc0f: 0x1a01, 0xc10: 0x1a07, 0xc11: 0x1a0a, + 0xc12: 0x1c2c, 0xc13: 0x1a0d, 0xc14: 0x1a1f, 0xc15: 0x1c34, 0xc16: 0x1c40, 0xc17: 0x198c, + 0xc18: 0x1d53, 0xc19: 0x1bb8, 0xc1a: 0x198f, 0xc1b: 0x1a58, 0xc1c: 0x19a1, 0xc1d: 0x19b0, + 0xc1e: 0x22de, 0xc1f: 0x22d8, 0xc20: 0x1cbd, 0xc21: 0x1ccc, 0xc22: 0x1cdb, 0xc23: 0x1cea, + 0xc24: 0x1cf9, 0xc25: 0x1d08, 0xc26: 0x1d17, 0xc27: 0x1d26, 0xc28: 0x1d35, 0xc29: 0x2182, + 0xc2a: 0x2194, 0xc2b: 0x21a6, 0xc2c: 0x21b8, 0xc2d: 0x21c4, 0xc2e: 0x21d0, 0xc2f: 0x21dc, + 0xc30: 0x21e8, 0xc31: 0x21f4, 0xc32: 0x2200, 0xc33: 0x223c, 0xc34: 0x2248, 0xc35: 0x2254, + 0xc36: 0x2260, 0xc37: 0x226c, 0xc38: 0x2278, 0xc39: 0x227e, 0xc3a: 0x2284, 0xc3b: 0x228a, + 0xc3c: 0x2290, 0xc3d: 0x22a2, 0xc3e: 0x22a8, 0xc3f: 0x1c0c, + // Block 0x31, offset 0xc40 + 0xc40: 0x1377, 0xc41: 0x0cfb, 0xc42: 0x13d3, 0xc43: 0x139f, 0xc44: 0x0e57, 0xc45: 0x06eb, + 0xc46: 0x08df, 0xc47: 0x1627, 0xc48: 0x1627, 0xc49: 0x0a0b, 0xc4a: 0x145b, 0xc4b: 0x0943, + 0xc4c: 0x0a07, 0xc4d: 0x0bef, 0xc4e: 0x0fcf, 0xc4f: 0x115f, 0xc50: 0x1297, 0xc51: 0x12d3, + 0xc52: 0x1307, 0xc53: 0x141b, 0xc54: 0x0d73, 0xc55: 0x0dff, 0xc56: 0x0eab, 0xc57: 0x0f43, + 0xc58: 0x125f, 0xc59: 0x1443, 0xc5a: 0x156f, 0xc5b: 0x070f, 0xc5c: 0x08b3, 0xc5d: 0x0d87, + 0xc5e: 0x0ecf, 0xc5f: 0x1293, 0xc60: 0x15bf, 0xc61: 0x0ab3, 0xc62: 0x0e77, 0xc63: 0x1283, + 0xc64: 0x1317, 0xc65: 0x0c23, 0xc66: 0x11bb, 0xc67: 0x12df, 0xc68: 0x0b1f, 0xc69: 0x0d0f, + 0xc6a: 0x0e17, 0xc6b: 0x0f1b, 0xc6c: 0x1427, 0xc6d: 0x074f, 0xc6e: 0x07e7, 0xc6f: 0x0853, + 0xc70: 0x0c8b, 0xc71: 0x0d7f, 0xc72: 0x0ecb, 0xc73: 0x0fef, 0xc74: 0x1177, 0xc75: 0x128b, + 0xc76: 0x12a3, 0xc77: 0x13c7, 0xc78: 0x14eb, 0xc79: 0x159f, 0xc7a: 0x15bb, 0xc7b: 0x102b, + 0xc7c: 0x106b, 0xc7d: 0x1123, 0xc7e: 0x1243, 0xc7f: 0x1477, + // Block 0x32, offset 0xc80 + 0xc80: 0x15c7, 0xc81: 0x134b, 0xc82: 0x09c7, 0xc83: 0x0b3b, 0xc84: 0x10db, 0xc85: 0x119b, + 0xc86: 0x0eff, 0xc87: 0x1033, 0xc88: 0x1397, 0xc89: 0x14e3, 0xc8a: 0x09c3, 0xc8b: 0x0a8f, + 0xc8c: 0x0d77, 0xc8d: 0x0e2b, 0xc8e: 0x0e5f, 0xc8f: 0x1113, 0xc90: 0x113b, 0xc91: 0x14a3, + 0xc92: 0x084f, 0xc93: 0x11a7, 0xc94: 0x07f3, 0xc95: 0x07ef, 0xc96: 0x1097, 0xc97: 0x1127, + 0xc98: 0x125b, 0xc99: 0x14ab, 0xc9a: 0x1367, 0xc9b: 0x0c27, 0xc9c: 0x0d73, 0xc9d: 0x1357, + 0xc9e: 0x06f7, 0xc9f: 0x0a63, 0xca0: 0x0b93, 0xca1: 0x0f2f, 0xca2: 0x0faf, 0xca3: 0x0873, + 0xca4: 0x103b, 0xca5: 0x075f, 0xca6: 0x0b77, 0xca7: 0x06d7, 0xca8: 0x0deb, 0xca9: 0x0ca3, + 0xcaa: 0x110f, 0xcab: 0x08c7, 0xcac: 0x09b3, 0xcad: 0x0ffb, 0xcae: 0x1263, 0xcaf: 0x133b, + 0xcb0: 0x0db7, 0xcb1: 0x13f7, 0xcb2: 0x0de3, 0xcb3: 0x0c37, 0xcb4: 0x121b, 0xcb5: 0x0c57, + 0xcb6: 0x0fab, 0xcb7: 0x072b, 0xcb8: 0x07a7, 0xcb9: 0x07eb, 0xcba: 0x0d53, 0xcbb: 0x10fb, + 0xcbc: 0x11f3, 0xcbd: 0x1347, 0xcbe: 0x1457, 0xcbf: 0x085b, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x090f, 0xcc1: 0x0a17, 0xcc2: 0x0b2f, 0xcc3: 0x0cbf, 0xcc4: 0x0e7b, 0xcc5: 0x103f, + 0xcc6: 0x1493, 0xcc7: 0x1577, 0xcc8: 0x15cb, 0xcc9: 0x15e3, 0xcca: 0x0837, 0xccb: 0x0cf3, + 0xccc: 0x0da3, 0xccd: 0x13eb, 0xcce: 0x0afb, 0xccf: 0x0bd7, 0xcd0: 0x0bf3, 0xcd1: 0x0c83, + 0xcd2: 0x0e6b, 0xcd3: 0x0eb7, 0xcd4: 0x0f67, 0xcd5: 0x108b, 0xcd6: 0x112f, 0xcd7: 0x1193, + 0xcd8: 0x13db, 0xcd9: 0x126b, 0xcda: 0x1403, 0xcdb: 0x147b, 0xcdc: 0x080f, 0xcdd: 0x083b, + 0xcde: 0x0923, 0xcdf: 0x0ea7, 0xce0: 0x12f3, 0xce1: 0x133b, 0xce2: 0x0b1b, 0xce3: 0x0b8b, + 0xce4: 0x0c4f, 0xce5: 0x0daf, 0xce6: 0x10d7, 0xce7: 0x0f23, 0xce8: 0x073b, 0xce9: 0x097f, + 0xcea: 0x0a63, 0xceb: 0x0ac7, 0xcec: 0x0b97, 0xced: 0x0f3f, 0xcee: 0x0f5b, 0xcef: 0x116b, + 0xcf0: 0x118b, 0xcf1: 0x145f, 0xcf2: 0x14df, 0xcf3: 0x14ef, 0xcf4: 0x152b, 0xcf5: 0x0753, + 0xcf6: 0x107f, 0xcf7: 0x144b, 0xcf8: 0x14c7, 0xcf9: 0x0baf, 0xcfa: 0x0717, 0xcfb: 0x0777, + 0xcfc: 0x0a67, 0xcfd: 0x0a87, 0xcfe: 0x0caf, 0xcff: 0x0d73, + // Block 0x34, offset 0xd00 + 0xd00: 0x0ec3, 0xd01: 0x0fcb, 0xd02: 0x1277, 0xd03: 0x1417, 0xd04: 0x161f, 0xd05: 0x0ce3, + 0xd06: 0x149f, 0xd07: 0x0833, 0xd08: 0x0d2f, 0xd09: 0x0d3b, 0xd0a: 0x0e0f, 0xd0b: 0x0e47, + 0xd0c: 0x0f4b, 0xd0d: 0x0fa7, 0xd0e: 0x1027, 0xd0f: 0x110b, 0xd10: 0x1537, 0xd11: 0x07af, + 0xd12: 0x0c03, 0xd13: 0x14af, 0xd14: 0x0767, 0xd15: 0x0aab, 0xd16: 0x0e2f, 0xd17: 0x13df, + 0xd18: 0x0b67, 0xd19: 0x0bb7, 0xd1a: 0x0d43, 0xd1b: 0x0f2f, 0xd1c: 0x14b7, 0xd1d: 0x0817, + 0xd1e: 0x08ff, 0xd1f: 0x0a97, 0xd20: 0x0cd3, 0xd21: 0x0d1f, 0xd22: 0x0d5f, 0xd23: 0x0df3, + 0xd24: 0x0f47, 0xd25: 0x0fbb, 0xd26: 0x1157, 0xd27: 0x12f7, 0xd28: 0x1303, 0xd29: 0x1453, + 0xd2a: 0x14d3, 0xd2b: 0x0883, 0xd2c: 0x0e4b, 0xd2d: 0x0903, 0xd2e: 0x0ec7, 0xd2f: 0x0f6b, + 0xd30: 0x1287, 0xd31: 0x14bb, 0xd32: 0x15a7, 0xd33: 0x15cf, 0xd34: 0x0d37, 0xd35: 0x0e27, + 0xd36: 0x11c3, 0xd37: 0x10b7, 0xd38: 0x10c3, 0xd39: 0x10e7, 0xd3a: 0x0f17, 0xd3b: 0x0e9f, + 0xd3c: 0x1363, 0xd3d: 0x0733, 0xd3e: 0x122b, 0xd3f: 0x081b, + // Block 0x35, offset 0xd40 + 0xd40: 0x080b, 0xd41: 0x0b0b, 0xd42: 0x0c2b, 0xd43: 0x10f3, 0xd44: 0x0a53, 0xd45: 0x0e03, + 0xd46: 0x0cef, 0xd47: 0x13e7, 0xd48: 0x12e7, 0xd49: 0x14a7, 0xd4a: 0x1323, 0xd4b: 0x0b27, + 0xd4c: 0x0787, 0xd4d: 0x095b, 0xd50: 0x09af, + 0xd52: 0x0cdf, 0xd55: 0x07f7, 0xd56: 0x0f1f, 0xd57: 0x0fe3, + 0xd58: 0x1047, 0xd59: 0x1063, 0xd5a: 0x1067, 0xd5b: 0x107b, 0xd5c: 0x14f7, 0xd5d: 0x10eb, + 0xd5e: 0x116f, 0xd60: 0x128f, 0xd62: 0x1353, + 0xd65: 0x1407, 0xd66: 0x1433, + 0xd6a: 0x154b, 0xd6b: 0x154f, 0xd6c: 0x1553, 0xd6d: 0x15b7, 0xd6e: 0x142b, 0xd6f: 0x14c3, + 0xd70: 0x0757, 0xd71: 0x077b, 0xd72: 0x078f, 0xd73: 0x084b, 0xd74: 0x0857, 0xd75: 0x0897, + 0xd76: 0x094b, 0xd77: 0x0967, 0xd78: 0x096f, 0xd79: 0x09ab, 0xd7a: 0x09b7, 0xd7b: 0x0a93, + 0xd7c: 0x0a9b, 0xd7d: 0x0ba3, 0xd7e: 0x0bcb, 0xd7f: 0x0bd3, + // Block 0x36, offset 0xd80 + 0xd80: 0x0beb, 0xd81: 0x0c97, 0xd82: 0x0cc7, 0xd83: 0x0ce7, 0xd84: 0x0d57, 0xd85: 0x0e1b, + 0xd86: 0x0e37, 0xd87: 0x0e67, 0xd88: 0x0ebb, 0xd89: 0x0edb, 0xd8a: 0x0f4f, 0xd8b: 0x102f, + 0xd8c: 0x104b, 0xd8d: 0x1053, 0xd8e: 0x104f, 0xd8f: 0x1057, 0xd90: 0x105b, 0xd91: 0x105f, + 0xd92: 0x1073, 0xd93: 0x1077, 0xd94: 0x109b, 0xd95: 0x10af, 0xd96: 0x10cb, 0xd97: 0x112f, + 0xd98: 0x1137, 0xd99: 0x113f, 0xd9a: 0x1153, 0xd9b: 0x117b, 0xd9c: 0x11cb, 0xd9d: 0x11ff, + 0xd9e: 0x11ff, 0xd9f: 0x1267, 0xda0: 0x130f, 0xda1: 0x1327, 0xda2: 0x135b, 0xda3: 0x135f, + 0xda4: 0x13a3, 0xda5: 0x13a7, 0xda6: 0x13ff, 0xda7: 0x1407, 0xda8: 0x14d7, 0xda9: 0x151b, + 0xdaa: 0x1533, 0xdab: 0x0b9b, 0xdac: 0x171a, 0xdad: 0x11e3, + 0xdb0: 0x06df, 0xdb1: 0x07e3, 0xdb2: 0x07a3, 0xdb3: 0x074b, 0xdb4: 0x078b, 0xdb5: 0x07b7, + 0xdb6: 0x0847, 0xdb7: 0x0863, 0xdb8: 0x094b, 0xdb9: 0x0937, 0xdba: 0x0947, 0xdbb: 0x0963, + 0xdbc: 0x09af, 0xdbd: 0x09bf, 0xdbe: 0x0a03, 0xdbf: 0x0a0f, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x0a2b, 0xdc1: 0x0a3b, 0xdc2: 0x0b23, 0xdc3: 0x0b2b, 0xdc4: 0x0b5b, 0xdc5: 0x0b7b, + 0xdc6: 0x0bab, 0xdc7: 0x0bc3, 0xdc8: 0x0bb3, 0xdc9: 0x0bd3, 0xdca: 0x0bc7, 0xdcb: 0x0beb, + 0xdcc: 0x0c07, 0xdcd: 0x0c5f, 0xdce: 0x0c6b, 0xdcf: 0x0c73, 0xdd0: 0x0c9b, 0xdd1: 0x0cdf, + 0xdd2: 0x0d0f, 0xdd3: 0x0d13, 0xdd4: 0x0d27, 0xdd5: 0x0da7, 0xdd6: 0x0db7, 0xdd7: 0x0e0f, + 0xdd8: 0x0e5b, 0xdd9: 0x0e53, 0xdda: 0x0e67, 0xddb: 0x0e83, 0xddc: 0x0ebb, 0xddd: 0x1013, + 0xdde: 0x0edf, 0xddf: 0x0f13, 0xde0: 0x0f1f, 0xde1: 0x0f5f, 0xde2: 0x0f7b, 0xde3: 0x0f9f, + 0xde4: 0x0fc3, 0xde5: 0x0fc7, 0xde6: 0x0fe3, 0xde7: 0x0fe7, 0xde8: 0x0ff7, 0xde9: 0x100b, + 0xdea: 0x1007, 0xdeb: 0x1037, 0xdec: 0x10b3, 0xded: 0x10cb, 0xdee: 0x10e3, 0xdef: 0x111b, + 0xdf0: 0x112f, 0xdf1: 0x114b, 0xdf2: 0x117b, 0xdf3: 0x122f, 0xdf4: 0x1257, 0xdf5: 0x12cb, + 0xdf6: 0x1313, 0xdf7: 0x131f, 0xdf8: 0x1327, 0xdf9: 0x133f, 0xdfa: 0x1353, 0xdfb: 0x1343, + 0xdfc: 0x135b, 0xdfd: 0x1357, 0xdfe: 0x134f, 0xdff: 0x135f, + // Block 0x38, offset 0xe00 + 0xe00: 0x136b, 0xe01: 0x13a7, 0xe02: 0x13e3, 0xe03: 0x1413, 0xe04: 0x1447, 0xe05: 0x1467, + 0xe06: 0x14b3, 0xe07: 0x14d7, 0xe08: 0x14f7, 0xe09: 0x150b, 0xe0a: 0x151b, 0xe0b: 0x1527, + 0xe0c: 0x1533, 0xe0d: 0x1587, 0xe0e: 0x1627, 0xe0f: 0x16b1, 0xe10: 0x16ac, 0xe11: 0x16de, + 0xe12: 0x0607, 0xe13: 0x062f, 0xe14: 0x0633, 0xe15: 0x1760, 0xe16: 0x178d, 0xe17: 0x1805, + 0xe18: 0x1613, 0xe19: 0x1623, + // Block 0x39, offset 0xe40 + 0xe40: 0x19d1, 0xe41: 0x19d4, 0xe42: 0x19d7, 0xe43: 0x1c04, 0xe44: 0x1c08, 0xe45: 0x1a5b, + 0xe46: 0x1a5b, + 0xe53: 0x1d71, 0xe54: 0x1d62, 0xe55: 0x1d67, 0xe56: 0x1d76, 0xe57: 0x1d6c, + 0xe5d: 0x4422, + 0xe5e: 0x8115, 0xe5f: 0x4494, 0xe60: 0x022d, 0xe61: 0x0215, 0xe62: 0x021e, 0xe63: 0x0221, + 0xe64: 0x0224, 0xe65: 0x0227, 0xe66: 0x022a, 0xe67: 0x0230, 0xe68: 0x0233, 0xe69: 0x0017, + 0xe6a: 0x4482, 0xe6b: 0x4488, 0xe6c: 0x4586, 0xe6d: 0x458e, 0xe6e: 0x43da, 0xe6f: 0x43e0, + 0xe70: 0x43e6, 0xe71: 0x43ec, 0xe72: 0x43f8, 0xe73: 0x43fe, 0xe74: 0x4404, 0xe75: 0x4410, + 0xe76: 0x4416, 0xe78: 0x441c, 0xe79: 0x4428, 0xe7a: 0x442e, 0xe7b: 0x4434, + 0xe7c: 0x4440, 0xe7e: 0x4446, + // Block 0x3a, offset 0xe80 + 0xe80: 0x444c, 0xe81: 0x4452, 0xe83: 0x4458, 0xe84: 0x445e, + 0xe86: 0x446a, 0xe87: 0x4470, 0xe88: 0x4476, 0xe89: 0x447c, 0xe8a: 0x448e, 0xe8b: 0x440a, + 0xe8c: 0x43f2, 0xe8d: 0x443a, 0xe8e: 0x4464, 0xe8f: 0x1d7b, 0xe90: 0x0299, 0xe91: 0x0299, + 0xe92: 0x02a2, 0xe93: 0x02a2, 0xe94: 0x02a2, 0xe95: 0x02a2, 0xe96: 0x02a5, 0xe97: 0x02a5, + 0xe98: 0x02a5, 0xe99: 0x02a5, 0xe9a: 0x02ab, 0xe9b: 0x02ab, 0xe9c: 0x02ab, 0xe9d: 0x02ab, + 0xe9e: 0x029f, 0xe9f: 0x029f, 0xea0: 0x029f, 0xea1: 0x029f, 0xea2: 0x02a8, 0xea3: 0x02a8, + 0xea4: 0x02a8, 0xea5: 0x02a8, 0xea6: 0x029c, 0xea7: 0x029c, 0xea8: 0x029c, 0xea9: 0x029c, + 0xeaa: 0x02cf, 0xeab: 0x02cf, 0xeac: 0x02cf, 0xead: 0x02cf, 0xeae: 0x02d2, 0xeaf: 0x02d2, + 0xeb0: 0x02d2, 0xeb1: 0x02d2, 0xeb2: 0x02b1, 0xeb3: 0x02b1, 0xeb4: 0x02b1, 0xeb5: 0x02b1, + 0xeb6: 0x02ae, 0xeb7: 0x02ae, 0xeb8: 0x02ae, 0xeb9: 0x02ae, 0xeba: 0x02b4, 0xebb: 0x02b4, + 0xebc: 0x02b4, 0xebd: 0x02b4, 0xebe: 0x02b7, 0xebf: 0x02b7, + // Block 0x3b, offset 0xec0 + 0xec0: 0x02b7, 0xec1: 0x02b7, 0xec2: 0x02c0, 0xec3: 0x02c0, 0xec4: 0x02bd, 0xec5: 0x02bd, + 0xec6: 0x02c3, 0xec7: 0x02c3, 0xec8: 0x02ba, 0xec9: 0x02ba, 0xeca: 0x02c9, 0xecb: 0x02c9, + 0xecc: 0x02c6, 0xecd: 0x02c6, 0xece: 0x02d5, 0xecf: 0x02d5, 0xed0: 0x02d5, 0xed1: 0x02d5, + 0xed2: 0x02db, 0xed3: 0x02db, 0xed4: 0x02db, 0xed5: 0x02db, 0xed6: 0x02e1, 0xed7: 0x02e1, + 0xed8: 0x02e1, 0xed9: 0x02e1, 0xeda: 0x02de, 0xedb: 0x02de, 0xedc: 0x02de, 0xedd: 0x02de, + 0xede: 0x02e4, 0xedf: 0x02e4, 0xee0: 0x02e7, 0xee1: 0x02e7, 0xee2: 0x02e7, 0xee3: 0x02e7, + 0xee4: 0x4500, 0xee5: 0x4500, 0xee6: 0x02ed, 0xee7: 0x02ed, 0xee8: 0x02ed, 0xee9: 0x02ed, + 0xeea: 0x02ea, 0xeeb: 0x02ea, 0xeec: 0x02ea, 0xeed: 0x02ea, 0xeee: 0x0308, 0xeef: 0x0308, + 0xef0: 0x44fa, 0xef1: 0x44fa, + // Block 0x3c, offset 0xf00 + 0xf13: 0x02d8, 0xf14: 0x02d8, 0xf15: 0x02d8, 0xf16: 0x02d8, 0xf17: 0x02f6, + 0xf18: 0x02f6, 0xf19: 0x02f3, 0xf1a: 0x02f3, 0xf1b: 0x02f9, 0xf1c: 0x02f9, 0xf1d: 0x204b, + 0xf1e: 0x02ff, 0xf1f: 0x02ff, 0xf20: 0x02f0, 0xf21: 0x02f0, 0xf22: 0x02fc, 0xf23: 0x02fc, + 0xf24: 0x0305, 0xf25: 0x0305, 0xf26: 0x0305, 0xf27: 0x0305, 0xf28: 0x028d, 0xf29: 0x028d, + 0xf2a: 0x25a6, 0xf2b: 0x25a6, 0xf2c: 0x2616, 0xf2d: 0x2616, 0xf2e: 0x25e5, 0xf2f: 0x25e5, + 0xf30: 0x2601, 0xf31: 0x2601, 0xf32: 0x25fa, 0xf33: 0x25fa, 0xf34: 0x2608, 0xf35: 0x2608, + 0xf36: 0x260f, 0xf37: 0x260f, 0xf38: 0x260f, 0xf39: 0x25ec, 0xf3a: 0x25ec, 0xf3b: 0x25ec, + 0xf3c: 0x0302, 0xf3d: 0x0302, 0xf3e: 0x0302, 0xf3f: 0x0302, + // Block 0x3d, offset 0xf40 + 0xf40: 0x25ad, 0xf41: 0x25b4, 0xf42: 0x25d0, 0xf43: 0x25ec, 0xf44: 0x25f3, 0xf45: 0x1d85, + 0xf46: 0x1d8a, 0xf47: 0x1d8f, 0xf48: 0x1d9e, 0xf49: 0x1dad, 0xf4a: 0x1db2, 0xf4b: 0x1db7, + 0xf4c: 0x1dbc, 0xf4d: 0x1dc1, 0xf4e: 0x1dd0, 0xf4f: 0x1ddf, 0xf50: 0x1de4, 0xf51: 0x1de9, + 0xf52: 0x1df8, 0xf53: 0x1e07, 0xf54: 0x1e0c, 0xf55: 0x1e11, 0xf56: 0x1e16, 0xf57: 0x1e25, + 0xf58: 0x1e2a, 0xf59: 0x1e39, 0xf5a: 0x1e3e, 0xf5b: 0x1e43, 0xf5c: 0x1e52, 0xf5d: 0x1e57, + 0xf5e: 0x1e5c, 0xf5f: 0x1e66, 0xf60: 0x1ea2, 0xf61: 0x1eb1, 0xf62: 0x1ec0, 0xf63: 0x1ec5, + 0xf64: 0x1eca, 0xf65: 0x1ed4, 0xf66: 0x1ee3, 0xf67: 0x1ee8, 0xf68: 0x1ef7, 0xf69: 0x1efc, + 0xf6a: 0x1f01, 0xf6b: 0x1f10, 0xf6c: 0x1f15, 0xf6d: 0x1f24, 0xf6e: 0x1f29, 0xf6f: 0x1f2e, + 0xf70: 0x1f33, 0xf71: 0x1f38, 0xf72: 0x1f3d, 0xf73: 0x1f42, 0xf74: 0x1f47, 0xf75: 0x1f4c, + 0xf76: 0x1f51, 0xf77: 0x1f56, 0xf78: 0x1f5b, 0xf79: 0x1f60, 0xf7a: 0x1f65, 0xf7b: 0x1f6a, + 0xf7c: 0x1f6f, 0xf7d: 0x1f74, 0xf7e: 0x1f79, 0xf7f: 0x1f83, + // Block 0x3e, offset 0xf80 + 0xf80: 0x1f88, 0xf81: 0x1f8d, 0xf82: 0x1f92, 0xf83: 0x1f9c, 0xf84: 0x1fa1, 0xf85: 0x1fab, + 0xf86: 0x1fb0, 0xf87: 0x1fb5, 0xf88: 0x1fba, 0xf89: 0x1fbf, 0xf8a: 0x1fc4, 0xf8b: 0x1fc9, + 0xf8c: 0x1fce, 0xf8d: 0x1fd3, 0xf8e: 0x1fe2, 0xf8f: 0x1ff1, 0xf90: 0x1ff6, 0xf91: 0x1ffb, + 0xf92: 0x2000, 0xf93: 0x2005, 0xf94: 0x200a, 0xf95: 0x2014, 0xf96: 0x2019, 0xf97: 0x201e, + 0xf98: 0x202d, 0xf99: 0x203c, 0xf9a: 0x2041, 0xf9b: 0x44b2, 0xf9c: 0x44b8, 0xf9d: 0x44ee, + 0xf9e: 0x4545, 0xf9f: 0x454c, 0xfa0: 0x4553, 0xfa1: 0x455a, 0xfa2: 0x4561, 0xfa3: 0x4568, + 0xfa4: 0x25c2, 0xfa5: 0x25c9, 0xfa6: 0x25d0, 0xfa7: 0x25d7, 0xfa8: 0x25ec, 0xfa9: 0x25f3, + 0xfaa: 0x1d94, 0xfab: 0x1d99, 0xfac: 0x1d9e, 0xfad: 0x1da3, 0xfae: 0x1dad, 0xfaf: 0x1db2, + 0xfb0: 0x1dc6, 0xfb1: 0x1dcb, 0xfb2: 0x1dd0, 0xfb3: 0x1dd5, 0xfb4: 0x1ddf, 0xfb5: 0x1de4, + 0xfb6: 0x1dee, 0xfb7: 0x1df3, 0xfb8: 0x1df8, 0xfb9: 0x1dfd, 0xfba: 0x1e07, 0xfbb: 0x1e0c, + 0xfbc: 0x1f38, 0xfbd: 0x1f3d, 0xfbe: 0x1f4c, 0xfbf: 0x1f51, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x1f56, 0xfc1: 0x1f6a, 0xfc2: 0x1f6f, 0xfc3: 0x1f74, 0xfc4: 0x1f79, 0xfc5: 0x1f92, + 0xfc6: 0x1f9c, 0xfc7: 0x1fa1, 0xfc8: 0x1fa6, 0xfc9: 0x1fba, 0xfca: 0x1fd8, 0xfcb: 0x1fdd, + 0xfcc: 0x1fe2, 0xfcd: 0x1fe7, 0xfce: 0x1ff1, 0xfcf: 0x1ff6, 0xfd0: 0x44ee, 0xfd1: 0x2023, + 0xfd2: 0x2028, 0xfd3: 0x202d, 0xfd4: 0x2032, 0xfd5: 0x203c, 0xfd6: 0x2041, 0xfd7: 0x25ad, + 0xfd8: 0x25b4, 0xfd9: 0x25bb, 0xfda: 0x25d0, 0xfdb: 0x25de, 0xfdc: 0x1d85, 0xfdd: 0x1d8a, + 0xfde: 0x1d8f, 0xfdf: 0x1d9e, 0xfe0: 0x1da8, 0xfe1: 0x1db7, 0xfe2: 0x1dbc, 0xfe3: 0x1dc1, + 0xfe4: 0x1dd0, 0xfe5: 0x1dda, 0xfe6: 0x1df8, 0xfe7: 0x1e11, 0xfe8: 0x1e16, 0xfe9: 0x1e25, + 0xfea: 0x1e2a, 0xfeb: 0x1e39, 0xfec: 0x1e43, 0xfed: 0x1e52, 0xfee: 0x1e57, 0xfef: 0x1e5c, + 0xff0: 0x1e66, 0xff1: 0x1ea2, 0xff2: 0x1ea7, 0xff3: 0x1eb1, 0xff4: 0x1ec0, 0xff5: 0x1ec5, + 0xff6: 0x1eca, 0xff7: 0x1ed4, 0xff8: 0x1ee3, 0xff9: 0x1ef7, 0xffa: 0x1efc, 0xffb: 0x1f01, + 0xffc: 0x1f10, 0xffd: 0x1f15, 0xffe: 0x1f24, 0xfff: 0x1f29, + // Block 0x40, offset 0x1000 + 0x1000: 0x1f2e, 0x1001: 0x1f33, 0x1002: 0x1f42, 0x1003: 0x1f47, 0x1004: 0x1f5b, 0x1005: 0x1f60, + 0x1006: 0x1f65, 0x1007: 0x1f6a, 0x1008: 0x1f6f, 0x1009: 0x1f83, 0x100a: 0x1f88, 0x100b: 0x1f8d, + 0x100c: 0x1f92, 0x100d: 0x1f97, 0x100e: 0x1fab, 0x100f: 0x1fb0, 0x1010: 0x1fb5, 0x1011: 0x1fba, + 0x1012: 0x1fc9, 0x1013: 0x1fce, 0x1014: 0x1fd3, 0x1015: 0x1fe2, 0x1016: 0x1fec, 0x1017: 0x1ffb, + 0x1018: 0x2000, 0x1019: 0x44e2, 0x101a: 0x2014, 0x101b: 0x2019, 0x101c: 0x201e, 0x101d: 0x202d, + 0x101e: 0x2037, 0x101f: 0x25d0, 0x1020: 0x25de, 0x1021: 0x1d9e, 0x1022: 0x1da8, 0x1023: 0x1dd0, + 0x1024: 0x1dda, 0x1025: 0x1df8, 0x1026: 0x1e02, 0x1027: 0x1e66, 0x1028: 0x1e6b, 0x1029: 0x1e8e, + 0x102a: 0x1e93, 0x102b: 0x1f6a, 0x102c: 0x1f6f, 0x102d: 0x1f92, 0x102e: 0x1fe2, 0x102f: 0x1fec, + 0x1030: 0x202d, 0x1031: 0x2037, 0x1032: 0x4596, 0x1033: 0x459e, 0x1034: 0x45a6, 0x1035: 0x1eed, + 0x1036: 0x1ef2, 0x1037: 0x1f06, 0x1038: 0x1f0b, 0x1039: 0x1f1a, 0x103a: 0x1f1f, 0x103b: 0x1e70, + 0x103c: 0x1e75, 0x103d: 0x1e98, 0x103e: 0x1e9d, 0x103f: 0x1e2f, + // Block 0x41, offset 0x1040 + 0x1040: 0x1e34, 0x1041: 0x1e1b, 0x1042: 0x1e20, 0x1043: 0x1e48, 0x1044: 0x1e4d, 0x1045: 0x1eb6, + 0x1046: 0x1ebb, 0x1047: 0x1ed9, 0x1048: 0x1ede, 0x1049: 0x1e7a, 0x104a: 0x1e7f, 0x104b: 0x1e84, + 0x104c: 0x1e8e, 0x104d: 0x1e89, 0x104e: 0x1e61, 0x104f: 0x1eac, 0x1050: 0x1ecf, 0x1051: 0x1eed, + 0x1052: 0x1ef2, 0x1053: 0x1f06, 0x1054: 0x1f0b, 0x1055: 0x1f1a, 0x1056: 0x1f1f, 0x1057: 0x1e70, + 0x1058: 0x1e75, 0x1059: 0x1e98, 0x105a: 0x1e9d, 0x105b: 0x1e2f, 0x105c: 0x1e34, 0x105d: 0x1e1b, + 0x105e: 0x1e20, 0x105f: 0x1e48, 0x1060: 0x1e4d, 0x1061: 0x1eb6, 0x1062: 0x1ebb, 0x1063: 0x1ed9, + 0x1064: 0x1ede, 0x1065: 0x1e7a, 0x1066: 0x1e7f, 0x1067: 0x1e84, 0x1068: 0x1e8e, 0x1069: 0x1e89, + 0x106a: 0x1e61, 0x106b: 0x1eac, 0x106c: 0x1ecf, 0x106d: 0x1e7a, 0x106e: 0x1e7f, 0x106f: 0x1e84, + 0x1070: 0x1e8e, 0x1071: 0x1e6b, 0x1072: 0x1e93, 0x1073: 0x1ee8, 0x1074: 0x1e52, 0x1075: 0x1e57, + 0x1076: 0x1e5c, 0x1077: 0x1e7a, 0x1078: 0x1e7f, 0x1079: 0x1e84, 0x107a: 0x1ee8, 0x107b: 0x1ef7, + 0x107c: 0x449a, 0x107d: 0x449a, + // Block 0x42, offset 0x1080 + 0x1090: 0x230d, 0x1091: 0x2322, + 0x1092: 0x2322, 0x1093: 0x2329, 0x1094: 0x2330, 0x1095: 0x2345, 0x1096: 0x234c, 0x1097: 0x2353, + 0x1098: 0x2376, 0x1099: 0x2376, 0x109a: 0x2399, 0x109b: 0x2392, 0x109c: 0x23ae, 0x109d: 0x23a0, + 0x109e: 0x23a7, 0x109f: 0x23ca, 0x10a0: 0x23ca, 0x10a1: 0x23c3, 0x10a2: 0x23d1, 0x10a3: 0x23d1, + 0x10a4: 0x23fb, 0x10a5: 0x23fb, 0x10a6: 0x2417, 0x10a7: 0x23df, 0x10a8: 0x23df, 0x10a9: 0x23d8, + 0x10aa: 0x23ed, 0x10ab: 0x23ed, 0x10ac: 0x23f4, 0x10ad: 0x23f4, 0x10ae: 0x241e, 0x10af: 0x242c, + 0x10b0: 0x242c, 0x10b1: 0x2433, 0x10b2: 0x2433, 0x10b3: 0x243a, 0x10b4: 0x2441, 0x10b5: 0x2448, + 0x10b6: 0x244f, 0x10b7: 0x244f, 0x10b8: 0x2456, 0x10b9: 0x2464, 0x10ba: 0x2472, 0x10bb: 0x246b, + 0x10bc: 0x2479, 0x10bd: 0x2479, 0x10be: 0x248e, 0x10bf: 0x2495, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x24c6, 0x10c1: 0x24d4, 0x10c2: 0x24cd, 0x10c3: 0x24b1, 0x10c4: 0x24b1, 0x10c5: 0x24db, + 0x10c6: 0x24db, 0x10c7: 0x24e2, 0x10c8: 0x24e2, 0x10c9: 0x250c, 0x10ca: 0x2513, 0x10cb: 0x251a, + 0x10cc: 0x24f0, 0x10cd: 0x24fe, 0x10ce: 0x2521, 0x10cf: 0x2528, + 0x10d2: 0x24f7, 0x10d3: 0x257c, 0x10d4: 0x2583, 0x10d5: 0x2559, 0x10d6: 0x2560, 0x10d7: 0x2544, + 0x10d8: 0x2544, 0x10d9: 0x254b, 0x10da: 0x2575, 0x10db: 0x256e, 0x10dc: 0x2598, 0x10dd: 0x2598, + 0x10de: 0x2306, 0x10df: 0x231b, 0x10e0: 0x2314, 0x10e1: 0x233e, 0x10e2: 0x2337, 0x10e3: 0x2361, + 0x10e4: 0x235a, 0x10e5: 0x2384, 0x10e6: 0x2368, 0x10e7: 0x237d, 0x10e8: 0x23b5, 0x10e9: 0x2402, + 0x10ea: 0x23e6, 0x10eb: 0x2425, 0x10ec: 0x24bf, 0x10ed: 0x24e9, 0x10ee: 0x2591, 0x10ef: 0x258a, + 0x10f0: 0x259f, 0x10f1: 0x2536, 0x10f2: 0x249c, 0x10f3: 0x2567, 0x10f4: 0x248e, 0x10f5: 0x24c6, + 0x10f6: 0x245d, 0x10f7: 0x24aa, 0x10f8: 0x253d, 0x10f9: 0x252f, 0x10fa: 0x24b8, 0x10fb: 0x24a3, + 0x10fc: 0x24b8, 0x10fd: 0x253d, 0x10fe: 0x236f, 0x10ff: 0x238b, + // Block 0x44, offset 0x1100 + 0x1100: 0x2505, 0x1101: 0x2480, 0x1102: 0x22ff, 0x1103: 0x24a3, 0x1104: 0x2448, 0x1105: 0x2417, + 0x1106: 0x23bc, 0x1107: 0x2552, + 0x1130: 0x2410, 0x1131: 0x2487, 0x1132: 0x27bb, 0x1133: 0x27b2, 0x1134: 0x27e8, 0x1135: 0x27d6, + 0x1136: 0x27c4, 0x1137: 0x27df, 0x1138: 0x27f1, 0x1139: 0x2409, 0x113a: 0x2c78, 0x113b: 0x2af8, + 0x113c: 0x27cd, + // Block 0x45, offset 0x1140 + 0x1150: 0x0019, 0x1151: 0x0483, + 0x1152: 0x0487, 0x1153: 0x0035, 0x1154: 0x0037, 0x1155: 0x0003, 0x1156: 0x003f, 0x1157: 0x04bf, + 0x1158: 0x04c3, 0x1159: 0x1b58, + 0x1160: 0x8132, 0x1161: 0x8132, 0x1162: 0x8132, 0x1163: 0x8132, + 0x1164: 0x8132, 0x1165: 0x8132, 0x1166: 0x8132, 0x1167: 0x812d, 0x1168: 0x812d, 0x1169: 0x812d, + 0x116a: 0x812d, 0x116b: 0x812d, 0x116c: 0x812d, 0x116d: 0x812d, 0x116e: 0x8132, 0x116f: 0x8132, + 0x1170: 0x186f, 0x1171: 0x0443, 0x1172: 0x043f, 0x1173: 0x007f, 0x1174: 0x007f, 0x1175: 0x0011, + 0x1176: 0x0013, 0x1177: 0x00b7, 0x1178: 0x00bb, 0x1179: 0x04b7, 0x117a: 0x04bb, 0x117b: 0x04ab, + 0x117c: 0x04af, 0x117d: 0x0493, 0x117e: 0x0497, 0x117f: 0x048b, + // Block 0x46, offset 0x1180 + 0x1180: 0x048f, 0x1181: 0x049b, 0x1182: 0x049f, 0x1183: 0x04a3, 0x1184: 0x04a7, + 0x1187: 0x0077, 0x1188: 0x007b, 0x1189: 0x4265, 0x118a: 0x4265, 0x118b: 0x4265, + 0x118c: 0x4265, 0x118d: 0x007f, 0x118e: 0x007f, 0x118f: 0x007f, 0x1190: 0x0019, 0x1191: 0x0483, + 0x1192: 0x001d, 0x1194: 0x0037, 0x1195: 0x0035, 0x1196: 0x003f, 0x1197: 0x0003, + 0x1198: 0x0443, 0x1199: 0x0011, 0x119a: 0x0013, 0x119b: 0x00b7, 0x119c: 0x00bb, 0x119d: 0x04b7, + 0x119e: 0x04bb, 0x119f: 0x0007, 0x11a0: 0x000d, 0x11a1: 0x0015, 0x11a2: 0x0017, 0x11a3: 0x001b, + 0x11a4: 0x0039, 0x11a5: 0x003d, 0x11a6: 0x003b, 0x11a8: 0x0079, 0x11a9: 0x0009, + 0x11aa: 0x000b, 0x11ab: 0x0041, + 0x11b0: 0x42a6, 0x11b1: 0x44be, 0x11b2: 0x42ab, 0x11b4: 0x42b0, + 0x11b6: 0x42b5, 0x11b7: 0x44c4, 0x11b8: 0x42ba, 0x11b9: 0x44ca, 0x11ba: 0x42bf, 0x11bb: 0x44d0, + 0x11bc: 0x42c4, 0x11bd: 0x44d6, 0x11be: 0x42c9, 0x11bf: 0x44dc, + // Block 0x47, offset 0x11c0 + 0x11c0: 0x0236, 0x11c1: 0x44a0, 0x11c2: 0x44a0, 0x11c3: 0x44a6, 0x11c4: 0x44a6, 0x11c5: 0x44e8, + 0x11c6: 0x44e8, 0x11c7: 0x44ac, 0x11c8: 0x44ac, 0x11c9: 0x44f4, 0x11ca: 0x44f4, 0x11cb: 0x44f4, + 0x11cc: 0x44f4, 0x11cd: 0x0239, 0x11ce: 0x0239, 0x11cf: 0x023c, 0x11d0: 0x023c, 0x11d1: 0x023c, + 0x11d2: 0x023c, 0x11d3: 0x023f, 0x11d4: 0x023f, 0x11d5: 0x0242, 0x11d6: 0x0242, 0x11d7: 0x0242, + 0x11d8: 0x0242, 0x11d9: 0x0245, 0x11da: 0x0245, 0x11db: 0x0245, 0x11dc: 0x0245, 0x11dd: 0x0248, + 0x11de: 0x0248, 0x11df: 0x0248, 0x11e0: 0x0248, 0x11e1: 0x024b, 0x11e2: 0x024b, 0x11e3: 0x024b, + 0x11e4: 0x024b, 0x11e5: 0x024e, 0x11e6: 0x024e, 0x11e7: 0x024e, 0x11e8: 0x024e, 0x11e9: 0x0251, + 0x11ea: 0x0251, 0x11eb: 0x0254, 0x11ec: 0x0254, 0x11ed: 0x0257, 0x11ee: 0x0257, 0x11ef: 0x025a, + 0x11f0: 0x025a, 0x11f1: 0x025d, 0x11f2: 0x025d, 0x11f3: 0x025d, 0x11f4: 0x025d, 0x11f5: 0x0260, + 0x11f6: 0x0260, 0x11f7: 0x0260, 0x11f8: 0x0260, 0x11f9: 0x0263, 0x11fa: 0x0263, 0x11fb: 0x0263, + 0x11fc: 0x0263, 0x11fd: 0x0266, 0x11fe: 0x0266, 0x11ff: 0x0266, + // Block 0x48, offset 0x1200 + 0x1200: 0x0266, 0x1201: 0x0269, 0x1202: 0x0269, 0x1203: 0x0269, 0x1204: 0x0269, 0x1205: 0x026c, + 0x1206: 0x026c, 0x1207: 0x026c, 0x1208: 0x026c, 0x1209: 0x026f, 0x120a: 0x026f, 0x120b: 0x026f, + 0x120c: 0x026f, 0x120d: 0x0272, 0x120e: 0x0272, 0x120f: 0x0272, 0x1210: 0x0272, 0x1211: 0x0275, + 0x1212: 0x0275, 0x1213: 0x0275, 0x1214: 0x0275, 0x1215: 0x0278, 0x1216: 0x0278, 0x1217: 0x0278, + 0x1218: 0x0278, 0x1219: 0x027b, 0x121a: 0x027b, 0x121b: 0x027b, 0x121c: 0x027b, 0x121d: 0x027e, + 0x121e: 0x027e, 0x121f: 0x027e, 0x1220: 0x027e, 0x1221: 0x0281, 0x1222: 0x0281, 0x1223: 0x0281, + 0x1224: 0x0281, 0x1225: 0x0284, 0x1226: 0x0284, 0x1227: 0x0284, 0x1228: 0x0284, 0x1229: 0x0287, + 0x122a: 0x0287, 0x122b: 0x0287, 0x122c: 0x0287, 0x122d: 0x028a, 0x122e: 0x028a, 0x122f: 0x028d, + 0x1230: 0x028d, 0x1231: 0x0290, 0x1232: 0x0290, 0x1233: 0x0290, 0x1234: 0x0290, 0x1235: 0x2dfc, + 0x1236: 0x2dfc, 0x1237: 0x2e04, 0x1238: 0x2e04, 0x1239: 0x2e0c, 0x123a: 0x2e0c, 0x123b: 0x1f7e, + 0x123c: 0x1f7e, + // Block 0x49, offset 0x1240 + 0x1240: 0x0081, 0x1241: 0x0083, 0x1242: 0x0085, 0x1243: 0x0087, 0x1244: 0x0089, 0x1245: 0x008b, + 0x1246: 0x008d, 0x1247: 0x008f, 0x1248: 0x0091, 0x1249: 0x0093, 0x124a: 0x0095, 0x124b: 0x0097, + 0x124c: 0x0099, 0x124d: 0x009b, 0x124e: 0x009d, 0x124f: 0x009f, 0x1250: 0x00a1, 0x1251: 0x00a3, + 0x1252: 0x00a5, 0x1253: 0x00a7, 0x1254: 0x00a9, 0x1255: 0x00ab, 0x1256: 0x00ad, 0x1257: 0x00af, + 0x1258: 0x00b1, 0x1259: 0x00b3, 0x125a: 0x00b5, 0x125b: 0x00b7, 0x125c: 0x00b9, 0x125d: 0x00bb, + 0x125e: 0x00bd, 0x125f: 0x0477, 0x1260: 0x047b, 0x1261: 0x0487, 0x1262: 0x049b, 0x1263: 0x049f, + 0x1264: 0x0483, 0x1265: 0x05ab, 0x1266: 0x05a3, 0x1267: 0x04c7, 0x1268: 0x04cf, 0x1269: 0x04d7, + 0x126a: 0x04df, 0x126b: 0x04e7, 0x126c: 0x056b, 0x126d: 0x0573, 0x126e: 0x057b, 0x126f: 0x051f, + 0x1270: 0x05af, 0x1271: 0x04cb, 0x1272: 0x04d3, 0x1273: 0x04db, 0x1274: 0x04e3, 0x1275: 0x04eb, + 0x1276: 0x04ef, 0x1277: 0x04f3, 0x1278: 0x04f7, 0x1279: 0x04fb, 0x127a: 0x04ff, 0x127b: 0x0503, + 0x127c: 0x0507, 0x127d: 0x050b, 0x127e: 0x050f, 0x127f: 0x0513, + // Block 0x4a, offset 0x1280 + 0x1280: 0x0517, 0x1281: 0x051b, 0x1282: 0x0523, 0x1283: 0x0527, 0x1284: 0x052b, 0x1285: 0x052f, + 0x1286: 0x0533, 0x1287: 0x0537, 0x1288: 0x053b, 0x1289: 0x053f, 0x128a: 0x0543, 0x128b: 0x0547, + 0x128c: 0x054b, 0x128d: 0x054f, 0x128e: 0x0553, 0x128f: 0x0557, 0x1290: 0x055b, 0x1291: 0x055f, + 0x1292: 0x0563, 0x1293: 0x0567, 0x1294: 0x056f, 0x1295: 0x0577, 0x1296: 0x057f, 0x1297: 0x0583, + 0x1298: 0x0587, 0x1299: 0x058b, 0x129a: 0x058f, 0x129b: 0x0593, 0x129c: 0x0597, 0x129d: 0x05a7, + 0x129e: 0x4a56, 0x129f: 0x4a5c, 0x12a0: 0x03c3, 0x12a1: 0x0313, 0x12a2: 0x0317, 0x12a3: 0x4341, + 0x12a4: 0x031b, 0x12a5: 0x4346, 0x12a6: 0x434b, 0x12a7: 0x031f, 0x12a8: 0x0323, 0x12a9: 0x0327, + 0x12aa: 0x4350, 0x12ab: 0x4355, 0x12ac: 0x435a, 0x12ad: 0x435f, 0x12ae: 0x4364, 0x12af: 0x4369, + 0x12b0: 0x0367, 0x12b1: 0x032b, 0x12b2: 0x032f, 0x12b3: 0x0333, 0x12b4: 0x037b, 0x12b5: 0x0337, + 0x12b6: 0x033b, 0x12b7: 0x033f, 0x12b8: 0x0343, 0x12b9: 0x0347, 0x12ba: 0x034b, 0x12bb: 0x034f, + 0x12bc: 0x0353, 0x12bd: 0x0357, 0x12be: 0x035b, + // Block 0x4b, offset 0x12c0 + 0x12c2: 0x42d8, 0x12c3: 0x42dd, 0x12c4: 0x42e2, 0x12c5: 0x42e7, + 0x12c6: 0x42ec, 0x12c7: 0x42f1, 0x12ca: 0x42f6, 0x12cb: 0x42fb, + 0x12cc: 0x4300, 0x12cd: 0x4305, 0x12ce: 0x430a, 0x12cf: 0x430f, + 0x12d2: 0x4314, 0x12d3: 0x4319, 0x12d4: 0x431e, 0x12d5: 0x4323, 0x12d6: 0x4328, 0x12d7: 0x432d, + 0x12da: 0x4332, 0x12db: 0x4337, 0x12dc: 0x433c, + 0x12e0: 0x00bf, 0x12e1: 0x00c2, 0x12e2: 0x00cb, 0x12e3: 0x4260, + 0x12e4: 0x00c8, 0x12e5: 0x00c5, 0x12e6: 0x0447, 0x12e8: 0x046b, 0x12e9: 0x044b, + 0x12ea: 0x044f, 0x12eb: 0x0453, 0x12ec: 0x0457, 0x12ed: 0x046f, 0x12ee: 0x0473, + // Block 0x4c, offset 0x1300 + 0x1300: 0x0063, 0x1301: 0x0065, 0x1302: 0x0067, 0x1303: 0x0069, 0x1304: 0x006b, 0x1305: 0x006d, + 0x1306: 0x006f, 0x1307: 0x0071, 0x1308: 0x0073, 0x1309: 0x0075, 0x130a: 0x0083, 0x130b: 0x0085, + 0x130c: 0x0087, 0x130d: 0x0089, 0x130e: 0x008b, 0x130f: 0x008d, 0x1310: 0x008f, 0x1311: 0x0091, + 0x1312: 0x0093, 0x1313: 0x0095, 0x1314: 0x0097, 0x1315: 0x0099, 0x1316: 0x009b, 0x1317: 0x009d, + 0x1318: 0x009f, 0x1319: 0x00a1, 0x131a: 0x00a3, 0x131b: 0x00a5, 0x131c: 0x00a7, 0x131d: 0x00a9, + 0x131e: 0x00ab, 0x131f: 0x00ad, 0x1320: 0x00af, 0x1321: 0x00b1, 0x1322: 0x00b3, 0x1323: 0x00b5, + 0x1324: 0x00dd, 0x1325: 0x00f2, 0x1328: 0x0173, 0x1329: 0x0176, + 0x132a: 0x0179, 0x132b: 0x017c, 0x132c: 0x017f, 0x132d: 0x0182, 0x132e: 0x0185, 0x132f: 0x0188, + 0x1330: 0x018b, 0x1331: 0x018e, 0x1332: 0x0191, 0x1333: 0x0194, 0x1334: 0x0197, 0x1335: 0x019a, + 0x1336: 0x019d, 0x1337: 0x01a0, 0x1338: 0x01a3, 0x1339: 0x0188, 0x133a: 0x01a6, 0x133b: 0x01a9, + 0x133c: 0x01ac, 0x133d: 0x01af, 0x133e: 0x01b2, 0x133f: 0x01b5, + // Block 0x4d, offset 0x1340 + 0x1340: 0x01fd, 0x1341: 0x0200, 0x1342: 0x0203, 0x1343: 0x045b, 0x1344: 0x01c7, 0x1345: 0x01d0, + 0x1346: 0x01d6, 0x1347: 0x01fa, 0x1348: 0x01eb, 0x1349: 0x01e8, 0x134a: 0x0206, 0x134b: 0x0209, + 0x134e: 0x0021, 0x134f: 0x0023, 0x1350: 0x0025, 0x1351: 0x0027, + 0x1352: 0x0029, 0x1353: 0x002b, 0x1354: 0x002d, 0x1355: 0x002f, 0x1356: 0x0031, 0x1357: 0x0033, + 0x1358: 0x0021, 0x1359: 0x0023, 0x135a: 0x0025, 0x135b: 0x0027, 0x135c: 0x0029, 0x135d: 0x002b, + 0x135e: 0x002d, 0x135f: 0x002f, 0x1360: 0x0031, 0x1361: 0x0033, 0x1362: 0x0021, 0x1363: 0x0023, + 0x1364: 0x0025, 0x1365: 0x0027, 0x1366: 0x0029, 0x1367: 0x002b, 0x1368: 0x002d, 0x1369: 0x002f, + 0x136a: 0x0031, 0x136b: 0x0033, 0x136c: 0x0021, 0x136d: 0x0023, 0x136e: 0x0025, 0x136f: 0x0027, + 0x1370: 0x0029, 0x1371: 0x002b, 0x1372: 0x002d, 0x1373: 0x002f, 0x1374: 0x0031, 0x1375: 0x0033, + 0x1376: 0x0021, 0x1377: 0x0023, 0x1378: 0x0025, 0x1379: 0x0027, 0x137a: 0x0029, 0x137b: 0x002b, + 0x137c: 0x002d, 0x137d: 0x002f, 0x137e: 0x0031, 0x137f: 0x0033, + // Block 0x4e, offset 0x1380 + 0x1380: 0x0239, 0x1381: 0x023c, 0x1382: 0x0248, 0x1383: 0x0251, 0x1385: 0x028a, + 0x1386: 0x025a, 0x1387: 0x024b, 0x1388: 0x0269, 0x1389: 0x0290, 0x138a: 0x027b, 0x138b: 0x027e, + 0x138c: 0x0281, 0x138d: 0x0284, 0x138e: 0x025d, 0x138f: 0x026f, 0x1390: 0x0275, 0x1391: 0x0263, + 0x1392: 0x0278, 0x1393: 0x0257, 0x1394: 0x0260, 0x1395: 0x0242, 0x1396: 0x0245, 0x1397: 0x024e, + 0x1398: 0x0254, 0x1399: 0x0266, 0x139a: 0x026c, 0x139b: 0x0272, 0x139c: 0x0293, 0x139d: 0x02e4, + 0x139e: 0x02cc, 0x139f: 0x0296, 0x13a1: 0x023c, 0x13a2: 0x0248, + 0x13a4: 0x0287, 0x13a7: 0x024b, 0x13a9: 0x0290, + 0x13aa: 0x027b, 0x13ab: 0x027e, 0x13ac: 0x0281, 0x13ad: 0x0284, 0x13ae: 0x025d, 0x13af: 0x026f, + 0x13b0: 0x0275, 0x13b1: 0x0263, 0x13b2: 0x0278, 0x13b4: 0x0260, 0x13b5: 0x0242, + 0x13b6: 0x0245, 0x13b7: 0x024e, 0x13b9: 0x0266, 0x13bb: 0x0272, + // Block 0x4f, offset 0x13c0 + 0x13c2: 0x0248, + 0x13c7: 0x024b, 0x13c9: 0x0290, 0x13cb: 0x027e, + 0x13cd: 0x0284, 0x13ce: 0x025d, 0x13cf: 0x026f, 0x13d1: 0x0263, + 0x13d2: 0x0278, 0x13d4: 0x0260, 0x13d7: 0x024e, + 0x13d9: 0x0266, 0x13db: 0x0272, 0x13dd: 0x02e4, + 0x13df: 0x0296, 0x13e1: 0x023c, 0x13e2: 0x0248, + 0x13e4: 0x0287, 0x13e7: 0x024b, 0x13e8: 0x0269, 0x13e9: 0x0290, + 0x13ea: 0x027b, 0x13ec: 0x0281, 0x13ed: 0x0284, 0x13ee: 0x025d, 0x13ef: 0x026f, + 0x13f0: 0x0275, 0x13f1: 0x0263, 0x13f2: 0x0278, 0x13f4: 0x0260, 0x13f5: 0x0242, + 0x13f6: 0x0245, 0x13f7: 0x024e, 0x13f9: 0x0266, 0x13fa: 0x026c, 0x13fb: 0x0272, + 0x13fc: 0x0293, 0x13fe: 0x02cc, + // Block 0x50, offset 0x1400 + 0x1400: 0x0239, 0x1401: 0x023c, 0x1402: 0x0248, 0x1403: 0x0251, 0x1404: 0x0287, 0x1405: 0x028a, + 0x1406: 0x025a, 0x1407: 0x024b, 0x1408: 0x0269, 0x1409: 0x0290, 0x140b: 0x027e, + 0x140c: 0x0281, 0x140d: 0x0284, 0x140e: 0x025d, 0x140f: 0x026f, 0x1410: 0x0275, 0x1411: 0x0263, + 0x1412: 0x0278, 0x1413: 0x0257, 0x1414: 0x0260, 0x1415: 0x0242, 0x1416: 0x0245, 0x1417: 0x024e, + 0x1418: 0x0254, 0x1419: 0x0266, 0x141a: 0x026c, 0x141b: 0x0272, + 0x1421: 0x023c, 0x1422: 0x0248, 0x1423: 0x0251, + 0x1425: 0x028a, 0x1426: 0x025a, 0x1427: 0x024b, 0x1428: 0x0269, 0x1429: 0x0290, + 0x142b: 0x027e, 0x142c: 0x0281, 0x142d: 0x0284, 0x142e: 0x025d, 0x142f: 0x026f, + 0x1430: 0x0275, 0x1431: 0x0263, 0x1432: 0x0278, 0x1433: 0x0257, 0x1434: 0x0260, 0x1435: 0x0242, + 0x1436: 0x0245, 0x1437: 0x024e, 0x1438: 0x0254, 0x1439: 0x0266, 0x143a: 0x026c, 0x143b: 0x0272, + // Block 0x51, offset 0x1440 + 0x1440: 0x1875, 0x1441: 0x1872, 0x1442: 0x1878, 0x1443: 0x189c, 0x1444: 0x18c0, 0x1445: 0x18e4, + 0x1446: 0x1908, 0x1447: 0x1911, 0x1448: 0x1917, 0x1449: 0x191d, 0x144a: 0x1923, + 0x1450: 0x1a88, 0x1451: 0x1a8c, + 0x1452: 0x1a90, 0x1453: 0x1a94, 0x1454: 0x1a98, 0x1455: 0x1a9c, 0x1456: 0x1aa0, 0x1457: 0x1aa4, + 0x1458: 0x1aa8, 0x1459: 0x1aac, 0x145a: 0x1ab0, 0x145b: 0x1ab4, 0x145c: 0x1ab8, 0x145d: 0x1abc, + 0x145e: 0x1ac0, 0x145f: 0x1ac4, 0x1460: 0x1ac8, 0x1461: 0x1acc, 0x1462: 0x1ad0, 0x1463: 0x1ad4, + 0x1464: 0x1ad8, 0x1465: 0x1adc, 0x1466: 0x1ae0, 0x1467: 0x1ae4, 0x1468: 0x1ae8, 0x1469: 0x1aec, + 0x146a: 0x271a, 0x146b: 0x0047, 0x146c: 0x0065, 0x146d: 0x1938, 0x146e: 0x19ad, + 0x1470: 0x0043, 0x1471: 0x0045, 0x1472: 0x0047, 0x1473: 0x0049, 0x1474: 0x004b, 0x1475: 0x004d, + 0x1476: 0x004f, 0x1477: 0x0051, 0x1478: 0x0053, 0x1479: 0x0055, 0x147a: 0x0057, 0x147b: 0x0059, + 0x147c: 0x005b, 0x147d: 0x005d, 0x147e: 0x005f, 0x147f: 0x0061, + // Block 0x52, offset 0x1480 + 0x1480: 0x26a9, 0x1481: 0x26be, 0x1482: 0x0503, + 0x1490: 0x0c0f, 0x1491: 0x0a47, + 0x1492: 0x08d3, 0x1493: 0x4656, 0x1494: 0x071b, 0x1495: 0x09ef, 0x1496: 0x132f, 0x1497: 0x09ff, + 0x1498: 0x0727, 0x1499: 0x0cd7, 0x149a: 0x0eaf, 0x149b: 0x0caf, 0x149c: 0x0827, 0x149d: 0x0b6b, + 0x149e: 0x07bf, 0x149f: 0x0cb7, 0x14a0: 0x0813, 0x14a1: 0x1117, 0x14a2: 0x0f83, 0x14a3: 0x138b, + 0x14a4: 0x09d3, 0x14a5: 0x090b, 0x14a6: 0x0e63, 0x14a7: 0x0c1b, 0x14a8: 0x0c47, 0x14a9: 0x06bf, + 0x14aa: 0x06cb, 0x14ab: 0x140b, 0x14ac: 0x0adb, 0x14ad: 0x06e7, 0x14ae: 0x08ef, 0x14af: 0x0c3b, + 0x14b0: 0x13b3, 0x14b1: 0x0c13, 0x14b2: 0x106f, 0x14b3: 0x10ab, 0x14b4: 0x08f7, 0x14b5: 0x0e43, + 0x14b6: 0x0d0b, 0x14b7: 0x0d07, 0x14b8: 0x0f97, 0x14b9: 0x082b, 0x14ba: 0x0957, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x06fb, 0x14c1: 0x06f3, 0x14c2: 0x0703, 0x14c3: 0x1643, 0x14c4: 0x0747, 0x14c5: 0x0757, + 0x14c6: 0x075b, 0x14c7: 0x0763, 0x14c8: 0x076b, 0x14c9: 0x076f, 0x14ca: 0x077b, 0x14cb: 0x0773, + 0x14cc: 0x05b3, 0x14cd: 0x1657, 0x14ce: 0x078f, 0x14cf: 0x0793, 0x14d0: 0x0797, 0x14d1: 0x07b3, + 0x14d2: 0x1648, 0x14d3: 0x05b7, 0x14d4: 0x079f, 0x14d5: 0x07bf, 0x14d6: 0x1652, 0x14d7: 0x07cf, + 0x14d8: 0x07d7, 0x14d9: 0x0737, 0x14da: 0x07df, 0x14db: 0x07e3, 0x14dc: 0x182d, 0x14dd: 0x07ff, + 0x14de: 0x0807, 0x14df: 0x05bf, 0x14e0: 0x081f, 0x14e1: 0x0823, 0x14e2: 0x082b, 0x14e3: 0x082f, + 0x14e4: 0x05c3, 0x14e5: 0x0847, 0x14e6: 0x084b, 0x14e7: 0x0857, 0x14e8: 0x0863, 0x14e9: 0x0867, + 0x14ea: 0x086b, 0x14eb: 0x0873, 0x14ec: 0x0893, 0x14ed: 0x0897, 0x14ee: 0x089f, 0x14ef: 0x08af, + 0x14f0: 0x08b7, 0x14f1: 0x08bb, 0x14f2: 0x08bb, 0x14f3: 0x08bb, 0x14f4: 0x1666, 0x14f5: 0x0e93, + 0x14f6: 0x08cf, 0x14f7: 0x08d7, 0x14f8: 0x166b, 0x14f9: 0x08e3, 0x14fa: 0x08eb, 0x14fb: 0x08f3, + 0x14fc: 0x091b, 0x14fd: 0x0907, 0x14fe: 0x0913, 0x14ff: 0x0917, + // Block 0x54, offset 0x1500 + 0x1500: 0x091f, 0x1501: 0x0927, 0x1502: 0x092b, 0x1503: 0x0933, 0x1504: 0x093b, 0x1505: 0x093f, + 0x1506: 0x093f, 0x1507: 0x0947, 0x1508: 0x094f, 0x1509: 0x0953, 0x150a: 0x095f, 0x150b: 0x0983, + 0x150c: 0x0967, 0x150d: 0x0987, 0x150e: 0x096b, 0x150f: 0x0973, 0x1510: 0x080b, 0x1511: 0x09cf, + 0x1512: 0x0997, 0x1513: 0x099b, 0x1514: 0x099f, 0x1515: 0x0993, 0x1516: 0x09a7, 0x1517: 0x09a3, + 0x1518: 0x09bb, 0x1519: 0x1670, 0x151a: 0x09d7, 0x151b: 0x09db, 0x151c: 0x09e3, 0x151d: 0x09ef, + 0x151e: 0x09f7, 0x151f: 0x0a13, 0x1520: 0x1675, 0x1521: 0x167a, 0x1522: 0x0a1f, 0x1523: 0x0a23, + 0x1524: 0x0a27, 0x1525: 0x0a1b, 0x1526: 0x0a2f, 0x1527: 0x05c7, 0x1528: 0x05cb, 0x1529: 0x0a37, + 0x152a: 0x0a3f, 0x152b: 0x0a3f, 0x152c: 0x167f, 0x152d: 0x0a5b, 0x152e: 0x0a5f, 0x152f: 0x0a63, + 0x1530: 0x0a6b, 0x1531: 0x1684, 0x1532: 0x0a73, 0x1533: 0x0a77, 0x1534: 0x0b4f, 0x1535: 0x0a7f, + 0x1536: 0x05cf, 0x1537: 0x0a8b, 0x1538: 0x0a9b, 0x1539: 0x0aa7, 0x153a: 0x0aa3, 0x153b: 0x168e, + 0x153c: 0x0aaf, 0x153d: 0x1693, 0x153e: 0x0abb, 0x153f: 0x0ab7, + // Block 0x55, offset 0x1540 + 0x1540: 0x0abf, 0x1541: 0x0acf, 0x1542: 0x0ad3, 0x1543: 0x05d3, 0x1544: 0x0ae3, 0x1545: 0x0aeb, + 0x1546: 0x0aef, 0x1547: 0x0af3, 0x1548: 0x05d7, 0x1549: 0x1698, 0x154a: 0x05db, 0x154b: 0x0b0f, + 0x154c: 0x0b13, 0x154d: 0x0b17, 0x154e: 0x0b1f, 0x154f: 0x185f, 0x1550: 0x0b37, 0x1551: 0x16a2, + 0x1552: 0x16a2, 0x1553: 0x11d7, 0x1554: 0x0b47, 0x1555: 0x0b47, 0x1556: 0x05df, 0x1557: 0x16c5, + 0x1558: 0x1797, 0x1559: 0x0b57, 0x155a: 0x0b5f, 0x155b: 0x05e3, 0x155c: 0x0b73, 0x155d: 0x0b83, + 0x155e: 0x0b87, 0x155f: 0x0b8f, 0x1560: 0x0b9f, 0x1561: 0x05eb, 0x1562: 0x05e7, 0x1563: 0x0ba3, + 0x1564: 0x16a7, 0x1565: 0x0ba7, 0x1566: 0x0bbb, 0x1567: 0x0bbf, 0x1568: 0x0bc3, 0x1569: 0x0bbf, + 0x156a: 0x0bcf, 0x156b: 0x0bd3, 0x156c: 0x0be3, 0x156d: 0x0bdb, 0x156e: 0x0bdf, 0x156f: 0x0be7, + 0x1570: 0x0beb, 0x1571: 0x0bef, 0x1572: 0x0bfb, 0x1573: 0x0bff, 0x1574: 0x0c17, 0x1575: 0x0c1f, + 0x1576: 0x0c2f, 0x1577: 0x0c43, 0x1578: 0x16b6, 0x1579: 0x0c3f, 0x157a: 0x0c33, 0x157b: 0x0c4b, + 0x157c: 0x0c53, 0x157d: 0x0c67, 0x157e: 0x16bb, 0x157f: 0x0c6f, + // Block 0x56, offset 0x1580 + 0x1580: 0x0c63, 0x1581: 0x0c5b, 0x1582: 0x05ef, 0x1583: 0x0c77, 0x1584: 0x0c7f, 0x1585: 0x0c87, + 0x1586: 0x0c7b, 0x1587: 0x05f3, 0x1588: 0x0c97, 0x1589: 0x0c9f, 0x158a: 0x16c0, 0x158b: 0x0ccb, + 0x158c: 0x0cff, 0x158d: 0x0cdb, 0x158e: 0x05ff, 0x158f: 0x0ce7, 0x1590: 0x05fb, 0x1591: 0x05f7, + 0x1592: 0x07c3, 0x1593: 0x07c7, 0x1594: 0x0d03, 0x1595: 0x0ceb, 0x1596: 0x11ab, 0x1597: 0x0663, + 0x1598: 0x0d0f, 0x1599: 0x0d13, 0x159a: 0x0d17, 0x159b: 0x0d2b, 0x159c: 0x0d23, 0x159d: 0x16d9, + 0x159e: 0x0603, 0x159f: 0x0d3f, 0x15a0: 0x0d33, 0x15a1: 0x0d4f, 0x15a2: 0x0d57, 0x15a3: 0x16e3, + 0x15a4: 0x0d5b, 0x15a5: 0x0d47, 0x15a6: 0x0d63, 0x15a7: 0x0607, 0x15a8: 0x0d67, 0x15a9: 0x0d6b, + 0x15aa: 0x0d6f, 0x15ab: 0x0d7b, 0x15ac: 0x16e8, 0x15ad: 0x0d83, 0x15ae: 0x060b, 0x15af: 0x0d8f, + 0x15b0: 0x16ed, 0x15b1: 0x0d93, 0x15b2: 0x060f, 0x15b3: 0x0d9f, 0x15b4: 0x0dab, 0x15b5: 0x0db7, + 0x15b6: 0x0dbb, 0x15b7: 0x16f2, 0x15b8: 0x1689, 0x15b9: 0x16f7, 0x15ba: 0x0ddb, 0x15bb: 0x16fc, + 0x15bc: 0x0de7, 0x15bd: 0x0def, 0x15be: 0x0ddf, 0x15bf: 0x0dfb, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x0e0b, 0x15c1: 0x0e1b, 0x15c2: 0x0e0f, 0x15c3: 0x0e13, 0x15c4: 0x0e1f, 0x15c5: 0x0e23, + 0x15c6: 0x1701, 0x15c7: 0x0e07, 0x15c8: 0x0e3b, 0x15c9: 0x0e3f, 0x15ca: 0x0613, 0x15cb: 0x0e53, + 0x15cc: 0x0e4f, 0x15cd: 0x1706, 0x15ce: 0x0e33, 0x15cf: 0x0e6f, 0x15d0: 0x170b, 0x15d1: 0x1710, + 0x15d2: 0x0e73, 0x15d3: 0x0e87, 0x15d4: 0x0e83, 0x15d5: 0x0e7f, 0x15d6: 0x0617, 0x15d7: 0x0e8b, + 0x15d8: 0x0e9b, 0x15d9: 0x0e97, 0x15da: 0x0ea3, 0x15db: 0x164d, 0x15dc: 0x0eb3, 0x15dd: 0x1715, + 0x15de: 0x0ebf, 0x15df: 0x171f, 0x15e0: 0x0ed3, 0x15e1: 0x0edf, 0x15e2: 0x0ef3, 0x15e3: 0x1724, + 0x15e4: 0x0f07, 0x15e5: 0x0f0b, 0x15e6: 0x1729, 0x15e7: 0x172e, 0x15e8: 0x0f27, 0x15e9: 0x0f37, + 0x15ea: 0x061b, 0x15eb: 0x0f3b, 0x15ec: 0x061f, 0x15ed: 0x061f, 0x15ee: 0x0f53, 0x15ef: 0x0f57, + 0x15f0: 0x0f5f, 0x15f1: 0x0f63, 0x15f2: 0x0f6f, 0x15f3: 0x0623, 0x15f4: 0x0f87, 0x15f5: 0x1733, + 0x15f6: 0x0fa3, 0x15f7: 0x1738, 0x15f8: 0x0faf, 0x15f9: 0x169d, 0x15fa: 0x0fbf, 0x15fb: 0x173d, + 0x15fc: 0x1742, 0x15fd: 0x1747, 0x15fe: 0x0627, 0x15ff: 0x062b, + // Block 0x58, offset 0x1600 + 0x1600: 0x0ff7, 0x1601: 0x1751, 0x1602: 0x174c, 0x1603: 0x1756, 0x1604: 0x175b, 0x1605: 0x0fff, + 0x1606: 0x1003, 0x1607: 0x1003, 0x1608: 0x100b, 0x1609: 0x0633, 0x160a: 0x100f, 0x160b: 0x0637, + 0x160c: 0x063b, 0x160d: 0x1765, 0x160e: 0x1023, 0x160f: 0x102b, 0x1610: 0x1037, 0x1611: 0x063f, + 0x1612: 0x176a, 0x1613: 0x105b, 0x1614: 0x176f, 0x1615: 0x1774, 0x1616: 0x107b, 0x1617: 0x1093, + 0x1618: 0x0643, 0x1619: 0x109b, 0x161a: 0x109f, 0x161b: 0x10a3, 0x161c: 0x1779, 0x161d: 0x177e, + 0x161e: 0x177e, 0x161f: 0x10bb, 0x1620: 0x0647, 0x1621: 0x1783, 0x1622: 0x10cf, 0x1623: 0x10d3, + 0x1624: 0x064b, 0x1625: 0x1788, 0x1626: 0x10ef, 0x1627: 0x064f, 0x1628: 0x10ff, 0x1629: 0x10f7, + 0x162a: 0x1107, 0x162b: 0x1792, 0x162c: 0x111f, 0x162d: 0x0653, 0x162e: 0x112b, 0x162f: 0x1133, + 0x1630: 0x1143, 0x1631: 0x0657, 0x1632: 0x179c, 0x1633: 0x17a1, 0x1634: 0x065b, 0x1635: 0x17a6, + 0x1636: 0x115b, 0x1637: 0x17ab, 0x1638: 0x1167, 0x1639: 0x1173, 0x163a: 0x117b, 0x163b: 0x17b0, + 0x163c: 0x17b5, 0x163d: 0x118f, 0x163e: 0x17ba, 0x163f: 0x1197, + // Block 0x59, offset 0x1640 + 0x1640: 0x16ca, 0x1641: 0x065f, 0x1642: 0x11af, 0x1643: 0x11b3, 0x1644: 0x0667, 0x1645: 0x11b7, + 0x1646: 0x0a33, 0x1647: 0x17bf, 0x1648: 0x17c4, 0x1649: 0x16cf, 0x164a: 0x16d4, 0x164b: 0x11d7, + 0x164c: 0x11db, 0x164d: 0x13f3, 0x164e: 0x066b, 0x164f: 0x1207, 0x1650: 0x1203, 0x1651: 0x120b, + 0x1652: 0x083f, 0x1653: 0x120f, 0x1654: 0x1213, 0x1655: 0x1217, 0x1656: 0x121f, 0x1657: 0x17c9, + 0x1658: 0x121b, 0x1659: 0x1223, 0x165a: 0x1237, 0x165b: 0x123b, 0x165c: 0x1227, 0x165d: 0x123f, + 0x165e: 0x1253, 0x165f: 0x1267, 0x1660: 0x1233, 0x1661: 0x1247, 0x1662: 0x124b, 0x1663: 0x124f, + 0x1664: 0x17ce, 0x1665: 0x17d8, 0x1666: 0x17d3, 0x1667: 0x066f, 0x1668: 0x126f, 0x1669: 0x1273, + 0x166a: 0x127b, 0x166b: 0x17ec, 0x166c: 0x127f, 0x166d: 0x17dd, 0x166e: 0x0673, 0x166f: 0x0677, + 0x1670: 0x17e2, 0x1671: 0x17e7, 0x1672: 0x067b, 0x1673: 0x129f, 0x1674: 0x12a3, 0x1675: 0x12a7, + 0x1676: 0x12ab, 0x1677: 0x12b7, 0x1678: 0x12b3, 0x1679: 0x12bf, 0x167a: 0x12bb, 0x167b: 0x12cb, + 0x167c: 0x12c3, 0x167d: 0x12c7, 0x167e: 0x12cf, 0x167f: 0x067f, + // Block 0x5a, offset 0x1680 + 0x1680: 0x12d7, 0x1681: 0x12db, 0x1682: 0x0683, 0x1683: 0x12eb, 0x1684: 0x12ef, 0x1685: 0x17f1, + 0x1686: 0x12fb, 0x1687: 0x12ff, 0x1688: 0x0687, 0x1689: 0x130b, 0x168a: 0x05bb, 0x168b: 0x17f6, + 0x168c: 0x17fb, 0x168d: 0x068b, 0x168e: 0x068f, 0x168f: 0x1337, 0x1690: 0x134f, 0x1691: 0x136b, + 0x1692: 0x137b, 0x1693: 0x1800, 0x1694: 0x138f, 0x1695: 0x1393, 0x1696: 0x13ab, 0x1697: 0x13b7, + 0x1698: 0x180a, 0x1699: 0x165c, 0x169a: 0x13c3, 0x169b: 0x13bf, 0x169c: 0x13cb, 0x169d: 0x1661, + 0x169e: 0x13d7, 0x169f: 0x13e3, 0x16a0: 0x180f, 0x16a1: 0x1814, 0x16a2: 0x1423, 0x16a3: 0x142f, + 0x16a4: 0x1437, 0x16a5: 0x1819, 0x16a6: 0x143b, 0x16a7: 0x1463, 0x16a8: 0x146f, 0x16a9: 0x1473, + 0x16aa: 0x146b, 0x16ab: 0x147f, 0x16ac: 0x1483, 0x16ad: 0x181e, 0x16ae: 0x148f, 0x16af: 0x0693, + 0x16b0: 0x1497, 0x16b1: 0x1823, 0x16b2: 0x0697, 0x16b3: 0x14cf, 0x16b4: 0x0ac3, 0x16b5: 0x14e7, + 0x16b6: 0x1828, 0x16b7: 0x1832, 0x16b8: 0x069b, 0x16b9: 0x069f, 0x16ba: 0x150f, 0x16bb: 0x1837, + 0x16bc: 0x06a3, 0x16bd: 0x183c, 0x16be: 0x1527, 0x16bf: 0x1527, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x152f, 0x16c1: 0x1841, 0x16c2: 0x1547, 0x16c3: 0x06a7, 0x16c4: 0x1557, 0x16c5: 0x1563, + 0x16c6: 0x156b, 0x16c7: 0x1573, 0x16c8: 0x06ab, 0x16c9: 0x1846, 0x16ca: 0x1587, 0x16cb: 0x15a3, + 0x16cc: 0x15af, 0x16cd: 0x06af, 0x16ce: 0x06b3, 0x16cf: 0x15b3, 0x16d0: 0x184b, 0x16d1: 0x06b7, + 0x16d2: 0x1850, 0x16d3: 0x1855, 0x16d4: 0x185a, 0x16d5: 0x15d7, 0x16d6: 0x06bb, 0x16d7: 0x15eb, + 0x16d8: 0x15f3, 0x16d9: 0x15f7, 0x16da: 0x15ff, 0x16db: 0x1607, 0x16dc: 0x160f, 0x16dd: 0x1864, +} + +// nfkcIndex: 22 blocks, 1408 entries, 1408 bytes +// Block 0 is the zero block. +var nfkcIndex = [1408]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x5a, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x5b, 0xc7: 0x04, + 0xc8: 0x05, 0xca: 0x5c, 0xcb: 0x5d, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x09, + 0xd0: 0x0a, 0xd1: 0x5e, 0xd2: 0x5f, 0xd3: 0x0b, 0xd6: 0x0c, 0xd7: 0x60, + 0xd8: 0x61, 0xd9: 0x0d, 0xdb: 0x62, 0xdc: 0x63, 0xdd: 0x64, 0xdf: 0x65, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, + 0xf0: 0x13, + // Block 0x4, offset 0x100 + 0x120: 0x66, 0x121: 0x67, 0x123: 0x68, 0x124: 0x69, 0x125: 0x6a, 0x126: 0x6b, 0x127: 0x6c, + 0x128: 0x6d, 0x129: 0x6e, 0x12a: 0x6f, 0x12b: 0x70, 0x12c: 0x6b, 0x12d: 0x71, 0x12e: 0x72, 0x12f: 0x73, + 0x131: 0x74, 0x132: 0x75, 0x133: 0x76, 0x134: 0x77, 0x135: 0x78, 0x137: 0x79, + 0x138: 0x7a, 0x139: 0x7b, 0x13a: 0x7c, 0x13b: 0x7d, 0x13c: 0x7e, 0x13d: 0x7f, 0x13e: 0x80, 0x13f: 0x81, + // Block 0x5, offset 0x140 + 0x140: 0x82, 0x142: 0x83, 0x143: 0x84, 0x144: 0x85, 0x145: 0x86, 0x146: 0x87, 0x147: 0x88, + 0x14d: 0x89, + 0x15c: 0x8a, 0x15f: 0x8b, + 0x162: 0x8c, 0x164: 0x8d, + 0x168: 0x8e, 0x169: 0x8f, 0x16a: 0x90, 0x16c: 0x0e, 0x16d: 0x91, 0x16e: 0x92, 0x16f: 0x93, + 0x170: 0x94, 0x173: 0x95, 0x174: 0x96, 0x175: 0x0f, 0x176: 0x10, 0x177: 0x97, + 0x178: 0x11, 0x179: 0x12, 0x17a: 0x13, 0x17b: 0x14, 0x17c: 0x15, 0x17d: 0x16, 0x17e: 0x17, 0x17f: 0x18, + // Block 0x6, offset 0x180 + 0x180: 0x98, 0x181: 0x99, 0x182: 0x9a, 0x183: 0x9b, 0x184: 0x19, 0x185: 0x1a, 0x186: 0x9c, 0x187: 0x9d, + 0x188: 0x9e, 0x189: 0x1b, 0x18a: 0x1c, 0x18b: 0x9f, 0x18c: 0xa0, + 0x191: 0x1d, 0x192: 0x1e, 0x193: 0xa1, + 0x1a8: 0xa2, 0x1a9: 0xa3, 0x1ab: 0xa4, + 0x1b1: 0xa5, 0x1b3: 0xa6, 0x1b5: 0xa7, 0x1b7: 0xa8, + 0x1ba: 0xa9, 0x1bb: 0xaa, 0x1bc: 0x1f, 0x1bd: 0x20, 0x1be: 0x21, 0x1bf: 0xab, + // Block 0x7, offset 0x1c0 + 0x1c0: 0xac, 0x1c1: 0x22, 0x1c2: 0x23, 0x1c3: 0x24, 0x1c4: 0xad, 0x1c5: 0x25, 0x1c6: 0x26, + 0x1c8: 0x27, 0x1c9: 0x28, 0x1ca: 0x29, 0x1cb: 0x2a, 0x1cc: 0x2b, 0x1cd: 0x2c, 0x1ce: 0x2d, 0x1cf: 0x2e, + // Block 0x8, offset 0x200 + 0x219: 0xae, 0x21a: 0xaf, 0x21b: 0xb0, 0x21d: 0xb1, 0x21f: 0xb2, + 0x220: 0xb3, 0x223: 0xb4, 0x224: 0xb5, 0x225: 0xb6, 0x226: 0xb7, 0x227: 0xb8, + 0x22a: 0xb9, 0x22b: 0xba, 0x22d: 0xbb, 0x22f: 0xbc, + 0x230: 0xbd, 0x231: 0xbe, 0x232: 0xbf, 0x233: 0xc0, 0x234: 0xc1, 0x235: 0xc2, 0x236: 0xc3, 0x237: 0xbd, + 0x238: 0xbe, 0x239: 0xbf, 0x23a: 0xc0, 0x23b: 0xc1, 0x23c: 0xc2, 0x23d: 0xc3, 0x23e: 0xbd, 0x23f: 0xbe, + // Block 0x9, offset 0x240 + 0x240: 0xbf, 0x241: 0xc0, 0x242: 0xc1, 0x243: 0xc2, 0x244: 0xc3, 0x245: 0xbd, 0x246: 0xbe, 0x247: 0xbf, + 0x248: 0xc0, 0x249: 0xc1, 0x24a: 0xc2, 0x24b: 0xc3, 0x24c: 0xbd, 0x24d: 0xbe, 0x24e: 0xbf, 0x24f: 0xc0, + 0x250: 0xc1, 0x251: 0xc2, 0x252: 0xc3, 0x253: 0xbd, 0x254: 0xbe, 0x255: 0xbf, 0x256: 0xc0, 0x257: 0xc1, + 0x258: 0xc2, 0x259: 0xc3, 0x25a: 0xbd, 0x25b: 0xbe, 0x25c: 0xbf, 0x25d: 0xc0, 0x25e: 0xc1, 0x25f: 0xc2, + 0x260: 0xc3, 0x261: 0xbd, 0x262: 0xbe, 0x263: 0xbf, 0x264: 0xc0, 0x265: 0xc1, 0x266: 0xc2, 0x267: 0xc3, + 0x268: 0xbd, 0x269: 0xbe, 0x26a: 0xbf, 0x26b: 0xc0, 0x26c: 0xc1, 0x26d: 0xc2, 0x26e: 0xc3, 0x26f: 0xbd, + 0x270: 0xbe, 0x271: 0xbf, 0x272: 0xc0, 0x273: 0xc1, 0x274: 0xc2, 0x275: 0xc3, 0x276: 0xbd, 0x277: 0xbe, + 0x278: 0xbf, 0x279: 0xc0, 0x27a: 0xc1, 0x27b: 0xc2, 0x27c: 0xc3, 0x27d: 0xbd, 0x27e: 0xbe, 0x27f: 0xbf, + // Block 0xa, offset 0x280 + 0x280: 0xc0, 0x281: 0xc1, 0x282: 0xc2, 0x283: 0xc3, 0x284: 0xbd, 0x285: 0xbe, 0x286: 0xbf, 0x287: 0xc0, + 0x288: 0xc1, 0x289: 0xc2, 0x28a: 0xc3, 0x28b: 0xbd, 0x28c: 0xbe, 0x28d: 0xbf, 0x28e: 0xc0, 0x28f: 0xc1, + 0x290: 0xc2, 0x291: 0xc3, 0x292: 0xbd, 0x293: 0xbe, 0x294: 0xbf, 0x295: 0xc0, 0x296: 0xc1, 0x297: 0xc2, + 0x298: 0xc3, 0x299: 0xbd, 0x29a: 0xbe, 0x29b: 0xbf, 0x29c: 0xc0, 0x29d: 0xc1, 0x29e: 0xc2, 0x29f: 0xc3, + 0x2a0: 0xbd, 0x2a1: 0xbe, 0x2a2: 0xbf, 0x2a3: 0xc0, 0x2a4: 0xc1, 0x2a5: 0xc2, 0x2a6: 0xc3, 0x2a7: 0xbd, + 0x2a8: 0xbe, 0x2a9: 0xbf, 0x2aa: 0xc0, 0x2ab: 0xc1, 0x2ac: 0xc2, 0x2ad: 0xc3, 0x2ae: 0xbd, 0x2af: 0xbe, + 0x2b0: 0xbf, 0x2b1: 0xc0, 0x2b2: 0xc1, 0x2b3: 0xc2, 0x2b4: 0xc3, 0x2b5: 0xbd, 0x2b6: 0xbe, 0x2b7: 0xbf, + 0x2b8: 0xc0, 0x2b9: 0xc1, 0x2ba: 0xc2, 0x2bb: 0xc3, 0x2bc: 0xbd, 0x2bd: 0xbe, 0x2be: 0xbf, 0x2bf: 0xc0, + // Block 0xb, offset 0x2c0 + 0x2c0: 0xc1, 0x2c1: 0xc2, 0x2c2: 0xc3, 0x2c3: 0xbd, 0x2c4: 0xbe, 0x2c5: 0xbf, 0x2c6: 0xc0, 0x2c7: 0xc1, + 0x2c8: 0xc2, 0x2c9: 0xc3, 0x2ca: 0xbd, 0x2cb: 0xbe, 0x2cc: 0xbf, 0x2cd: 0xc0, 0x2ce: 0xc1, 0x2cf: 0xc2, + 0x2d0: 0xc3, 0x2d1: 0xbd, 0x2d2: 0xbe, 0x2d3: 0xbf, 0x2d4: 0xc0, 0x2d5: 0xc1, 0x2d6: 0xc2, 0x2d7: 0xc3, + 0x2d8: 0xbd, 0x2d9: 0xbe, 0x2da: 0xbf, 0x2db: 0xc0, 0x2dc: 0xc1, 0x2dd: 0xc2, 0x2de: 0xc4, + // Block 0xc, offset 0x300 + 0x324: 0x2f, 0x325: 0x30, 0x326: 0x31, 0x327: 0x32, + 0x328: 0x33, 0x329: 0x34, 0x32a: 0x35, 0x32b: 0x36, 0x32c: 0x37, 0x32d: 0x38, 0x32e: 0x39, 0x32f: 0x3a, + 0x330: 0x3b, 0x331: 0x3c, 0x332: 0x3d, 0x333: 0x3e, 0x334: 0x3f, 0x335: 0x40, 0x336: 0x41, 0x337: 0x42, + 0x338: 0x43, 0x339: 0x44, 0x33a: 0x45, 0x33b: 0x46, 0x33c: 0xc5, 0x33d: 0x47, 0x33e: 0x48, 0x33f: 0x49, + // Block 0xd, offset 0x340 + 0x347: 0xc6, + 0x34b: 0xc7, 0x34d: 0xc8, + 0x368: 0xc9, 0x36b: 0xca, + // Block 0xe, offset 0x380 + 0x381: 0xcb, 0x382: 0xcc, 0x384: 0xcd, 0x385: 0xb7, 0x387: 0xce, + 0x388: 0xcf, 0x38b: 0xd0, 0x38c: 0x6b, 0x38d: 0xd1, + 0x392: 0xd2, 0x393: 0xd3, 0x396: 0xd4, 0x397: 0xd5, + 0x398: 0xd6, 0x39a: 0xd7, 0x39c: 0xd8, + // Block 0xf, offset 0x3c0 + 0x3eb: 0xd9, 0x3ec: 0xda, + // Block 0x10, offset 0x400 + 0x432: 0xdb, + // Block 0x11, offset 0x440 + 0x445: 0xdc, 0x446: 0xdd, 0x447: 0xde, + 0x449: 0xdf, + 0x450: 0xe0, 0x451: 0xe1, 0x452: 0xe2, 0x453: 0xe3, 0x454: 0xe4, 0x455: 0xe5, 0x456: 0xe6, 0x457: 0xe7, + 0x458: 0xe8, 0x459: 0xe9, 0x45a: 0x4a, 0x45b: 0xea, 0x45c: 0xeb, 0x45d: 0xec, 0x45e: 0xed, 0x45f: 0x4b, + // Block 0x12, offset 0x480 + 0x4a3: 0xee, + 0x4b8: 0x4c, 0x4b9: 0x4d, 0x4ba: 0x4e, + // Block 0x13, offset 0x4c0 + 0x4c4: 0x4f, 0x4c5: 0xef, 0x4c6: 0xf0, + 0x4c8: 0x50, 0x4c9: 0xf1, + // Block 0x14, offset 0x500 + 0x520: 0x51, 0x521: 0x52, 0x522: 0x53, 0x523: 0x54, 0x524: 0x55, 0x525: 0x56, 0x526: 0x57, 0x527: 0x58, + 0x528: 0x59, + // Block 0x15, offset 0x540 + 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, + 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, +} + +// nfkcSparseOffset: 152 entries, 304 bytes +var nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1b, 0x25, 0x35, 0x37, 0x3c, 0x47, 0x56, 0x63, 0x6b, 0x6f, 0x74, 0x76, 0x86, 0x8e, 0x95, 0x98, 0x9f, 0xa3, 0xa7, 0xa9, 0xab, 0xb4, 0xb8, 0xbf, 0xc4, 0xc7, 0xd1, 0xd3, 0xda, 0xe2, 0xe6, 0xe8, 0xeb, 0xef, 0xf5, 0x106, 0x112, 0x114, 0x11a, 0x11c, 0x11e, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12b, 0x12e, 0x130, 0x133, 0x136, 0x13a, 0x13f, 0x148, 0x14a, 0x14d, 0x14f, 0x15a, 0x165, 0x174, 0x182, 0x190, 0x1a0, 0x1ae, 0x1b5, 0x1bb, 0x1ca, 0x1ce, 0x1d0, 0x1d4, 0x1d6, 0x1d9, 0x1db, 0x1de, 0x1e0, 0x1e3, 0x1e5, 0x1e7, 0x1e9, 0x1f5, 0x1ff, 0x209, 0x20c, 0x210, 0x212, 0x214, 0x216, 0x218, 0x21b, 0x21d, 0x21f, 0x221, 0x223, 0x229, 0x22c, 0x230, 0x232, 0x239, 0x23f, 0x245, 0x24d, 0x253, 0x259, 0x25f, 0x263, 0x265, 0x267, 0x269, 0x26b, 0x271, 0x274, 0x277, 0x27f, 0x286, 0x289, 0x28c, 0x28e, 0x296, 0x29d, 0x2a0, 0x2a6, 0x2a8, 0x2aa, 0x2ad, 0x2af, 0x2b1, 0x2b3, 0x2b5, 0x2c2, 0x2cc, 0x2ce, 0x2d0, 0x2d4, 0x2d9, 0x2e5, 0x2ea, 0x2f3, 0x2f9, 0x2fe, 0x302, 0x307, 0x30b, 0x31b, 0x329, 0x337, 0x345, 0x347, 0x351, 0x353} + +// nfkcSparseValues: 861 entries, 3444 bytes +var nfkcSparseValues = [861]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0002, lo: 0x0d}, + {value: 0x0001, lo: 0xa0, hi: 0xa0}, + {value: 0x4274, lo: 0xa8, hi: 0xa8}, + {value: 0x0083, lo: 0xaa, hi: 0xaa}, + {value: 0x4260, lo: 0xaf, hi: 0xaf}, + {value: 0x0025, lo: 0xb2, hi: 0xb3}, + {value: 0x4256, lo: 0xb4, hi: 0xb4}, + {value: 0x01dc, lo: 0xb5, hi: 0xb5}, + {value: 0x428d, lo: 0xb8, hi: 0xb8}, + {value: 0x0023, lo: 0xb9, hi: 0xb9}, + {value: 0x009f, lo: 0xba, hi: 0xba}, + {value: 0x2218, lo: 0xbc, hi: 0xbc}, + {value: 0x220c, lo: 0xbd, hi: 0xbd}, + {value: 0x22ae, lo: 0xbe, hi: 0xbe}, + // Block 0x1, offset 0xe + {value: 0x0091, lo: 0x03}, + {value: 0x4774, lo: 0xa0, hi: 0xa1}, + {value: 0x47a6, lo: 0xaf, hi: 0xb0}, + {value: 0xa000, lo: 0xb7, hi: 0xb7}, + // Block 0x2, offset 0x12 + {value: 0x0003, lo: 0x08}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x0091, lo: 0xb0, hi: 0xb0}, + {value: 0x0119, lo: 0xb1, hi: 0xb1}, + {value: 0x0095, lo: 0xb2, hi: 0xb2}, + {value: 0x00a5, lo: 0xb3, hi: 0xb3}, + {value: 0x0143, lo: 0xb4, hi: 0xb6}, + {value: 0x00af, lo: 0xb7, hi: 0xb7}, + {value: 0x00b3, lo: 0xb8, hi: 0xb8}, + // Block 0x3, offset 0x1b + {value: 0x000a, lo: 0x09}, + {value: 0x426a, lo: 0x98, hi: 0x98}, + {value: 0x426f, lo: 0x99, hi: 0x9a}, + {value: 0x4292, lo: 0x9b, hi: 0x9b}, + {value: 0x425b, lo: 0x9c, hi: 0x9c}, + {value: 0x427e, lo: 0x9d, hi: 0x9d}, + {value: 0x0113, lo: 0xa0, hi: 0xa0}, + {value: 0x0099, lo: 0xa1, hi: 0xa1}, + {value: 0x00a7, lo: 0xa2, hi: 0xa3}, + {value: 0x0167, lo: 0xa4, hi: 0xa4}, + // Block 0x4, offset 0x25 + {value: 0x0000, lo: 0x0f}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0xa000, lo: 0x8d, hi: 0x8d}, + {value: 0x37a1, lo: 0x90, hi: 0x90}, + {value: 0x37ad, lo: 0x91, hi: 0x91}, + {value: 0x379b, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x96, hi: 0x96}, + {value: 0x3813, lo: 0x97, hi: 0x97}, + {value: 0x37dd, lo: 0x9c, hi: 0x9c}, + {value: 0x37c5, lo: 0x9d, hi: 0x9d}, + {value: 0x37ef, lo: 0x9e, hi: 0x9e}, + {value: 0xa000, lo: 0xb4, hi: 0xb5}, + {value: 0x3819, lo: 0xb6, hi: 0xb6}, + {value: 0x381f, lo: 0xb7, hi: 0xb7}, + // Block 0x5, offset 0x35 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x83, hi: 0x87}, + // Block 0x6, offset 0x37 + {value: 0x0001, lo: 0x04}, + {value: 0x8113, lo: 0x81, hi: 0x82}, + {value: 0x8132, lo: 0x84, hi: 0x84}, + {value: 0x812d, lo: 0x85, hi: 0x85}, + {value: 0x810d, lo: 0x87, hi: 0x87}, + // Block 0x7, offset 0x3c + {value: 0x0000, lo: 0x0a}, + {value: 0x8132, lo: 0x90, hi: 0x97}, + {value: 0x8119, lo: 0x98, hi: 0x98}, + {value: 0x811a, lo: 0x99, hi: 0x99}, + {value: 0x811b, lo: 0x9a, hi: 0x9a}, + {value: 0x383d, lo: 0xa2, hi: 0xa2}, + {value: 0x3843, lo: 0xa3, hi: 0xa3}, + {value: 0x384f, lo: 0xa4, hi: 0xa4}, + {value: 0x3849, lo: 0xa5, hi: 0xa5}, + {value: 0x3855, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xa7, hi: 0xa7}, + // Block 0x8, offset 0x47 + {value: 0x0000, lo: 0x0e}, + {value: 0x3867, lo: 0x80, hi: 0x80}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0x385b, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x3861, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x95, hi: 0x95}, + {value: 0x8132, lo: 0x96, hi: 0x9c}, + {value: 0x8132, lo: 0x9f, hi: 0xa2}, + {value: 0x812d, lo: 0xa3, hi: 0xa3}, + {value: 0x8132, lo: 0xa4, hi: 0xa4}, + {value: 0x8132, lo: 0xa7, hi: 0xa8}, + {value: 0x812d, lo: 0xaa, hi: 0xaa}, + {value: 0x8132, lo: 0xab, hi: 0xac}, + {value: 0x812d, lo: 0xad, hi: 0xad}, + // Block 0x9, offset 0x56 + {value: 0x0000, lo: 0x0c}, + {value: 0x811f, lo: 0x91, hi: 0x91}, + {value: 0x8132, lo: 0xb0, hi: 0xb0}, + {value: 0x812d, lo: 0xb1, hi: 0xb1}, + {value: 0x8132, lo: 0xb2, hi: 0xb3}, + {value: 0x812d, lo: 0xb4, hi: 0xb4}, + {value: 0x8132, lo: 0xb5, hi: 0xb6}, + {value: 0x812d, lo: 0xb7, hi: 0xb9}, + {value: 0x8132, lo: 0xba, hi: 0xba}, + {value: 0x812d, lo: 0xbb, hi: 0xbc}, + {value: 0x8132, lo: 0xbd, hi: 0xbd}, + {value: 0x812d, lo: 0xbe, hi: 0xbe}, + {value: 0x8132, lo: 0xbf, hi: 0xbf}, + // Block 0xa, offset 0x63 + {value: 0x0005, lo: 0x07}, + {value: 0x8132, lo: 0x80, hi: 0x80}, + {value: 0x8132, lo: 0x81, hi: 0x81}, + {value: 0x812d, lo: 0x82, hi: 0x83}, + {value: 0x812d, lo: 0x84, hi: 0x85}, + {value: 0x812d, lo: 0x86, hi: 0x87}, + {value: 0x812d, lo: 0x88, hi: 0x89}, + {value: 0x8132, lo: 0x8a, hi: 0x8a}, + // Block 0xb, offset 0x6b + {value: 0x0000, lo: 0x03}, + {value: 0x8132, lo: 0xab, hi: 0xb1}, + {value: 0x812d, lo: 0xb2, hi: 0xb2}, + {value: 0x8132, lo: 0xb3, hi: 0xb3}, + // Block 0xc, offset 0x6f + {value: 0x0000, lo: 0x04}, + {value: 0x8132, lo: 0x96, hi: 0x99}, + {value: 0x8132, lo: 0x9b, hi: 0xa3}, + {value: 0x8132, lo: 0xa5, hi: 0xa7}, + {value: 0x8132, lo: 0xa9, hi: 0xad}, + // Block 0xd, offset 0x74 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x99, hi: 0x9b}, + // Block 0xe, offset 0x76 + {value: 0x0000, lo: 0x0f}, + {value: 0x812d, lo: 0xa3, hi: 0xa3}, + {value: 0x8132, lo: 0xa4, hi: 0xa5}, + {value: 0x812d, lo: 0xa6, hi: 0xa6}, + {value: 0x8132, lo: 0xa7, hi: 0xa8}, + {value: 0x812d, lo: 0xa9, hi: 0xa9}, + {value: 0x8132, lo: 0xaa, hi: 0xac}, + {value: 0x812d, lo: 0xad, hi: 0xaf}, + {value: 0x8116, lo: 0xb0, hi: 0xb0}, + {value: 0x8117, lo: 0xb1, hi: 0xb1}, + {value: 0x8118, lo: 0xb2, hi: 0xb2}, + {value: 0x8132, lo: 0xb3, hi: 0xb5}, + {value: 0x812d, lo: 0xb6, hi: 0xb6}, + {value: 0x8132, lo: 0xb7, hi: 0xb8}, + {value: 0x812d, lo: 0xb9, hi: 0xba}, + {value: 0x8132, lo: 0xbb, hi: 0xbf}, + // Block 0xf, offset 0x86 + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0xa8, hi: 0xa8}, + {value: 0x3ed4, lo: 0xa9, hi: 0xa9}, + {value: 0xa000, lo: 0xb0, hi: 0xb0}, + {value: 0x3edc, lo: 0xb1, hi: 0xb1}, + {value: 0xa000, lo: 0xb3, hi: 0xb3}, + {value: 0x3ee4, lo: 0xb4, hi: 0xb4}, + {value: 0x9902, lo: 0xbc, hi: 0xbc}, + // Block 0x10, offset 0x8e + {value: 0x0008, lo: 0x06}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x8132, lo: 0x91, hi: 0x91}, + {value: 0x812d, lo: 0x92, hi: 0x92}, + {value: 0x8132, lo: 0x93, hi: 0x93}, + {value: 0x8132, lo: 0x94, hi: 0x94}, + {value: 0x45ae, lo: 0x98, hi: 0x9f}, + // Block 0x11, offset 0x95 + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x12, offset 0x98 + {value: 0x0008, lo: 0x06}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2c9a, lo: 0x8b, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x45ee, lo: 0x9c, hi: 0x9d}, + {value: 0x45fe, lo: 0x9f, hi: 0x9f}, + // Block 0x13, offset 0x9f + {value: 0x0000, lo: 0x03}, + {value: 0x4626, lo: 0xb3, hi: 0xb3}, + {value: 0x462e, lo: 0xb6, hi: 0xb6}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + // Block 0x14, offset 0xa3 + {value: 0x0008, lo: 0x03}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x4606, lo: 0x99, hi: 0x9b}, + {value: 0x461e, lo: 0x9e, hi: 0x9e}, + // Block 0x15, offset 0xa7 + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + // Block 0x16, offset 0xa9 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + // Block 0x17, offset 0xab + {value: 0x0000, lo: 0x08}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2cb2, lo: 0x88, hi: 0x88}, + {value: 0x2caa, lo: 0x8b, hi: 0x8b}, + {value: 0x2cba, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x96, hi: 0x97}, + {value: 0x4636, lo: 0x9c, hi: 0x9c}, + {value: 0x463e, lo: 0x9d, hi: 0x9d}, + // Block 0x18, offset 0xb4 + {value: 0x0000, lo: 0x03}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x2cc2, lo: 0x94, hi: 0x94}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x19, offset 0xb8 + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2cca, lo: 0x8a, hi: 0x8a}, + {value: 0x2cda, lo: 0x8b, hi: 0x8b}, + {value: 0x2cd2, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1a, offset 0xbf + {value: 0x1801, lo: 0x04}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x3eec, lo: 0x88, hi: 0x88}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x8120, lo: 0x95, hi: 0x96}, + // Block 0x1b, offset 0xc4 + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xbc, hi: 0xbc}, + {value: 0xa000, lo: 0xbf, hi: 0xbf}, + // Block 0x1c, offset 0xc7 + {value: 0x0000, lo: 0x09}, + {value: 0x2ce2, lo: 0x80, hi: 0x80}, + {value: 0x9900, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x2cea, lo: 0x87, hi: 0x87}, + {value: 0x2cf2, lo: 0x88, hi: 0x88}, + {value: 0x2f4c, lo: 0x8a, hi: 0x8a}, + {value: 0x2dd4, lo: 0x8b, hi: 0x8b}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x95, hi: 0x96}, + // Block 0x1d, offset 0xd1 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1e, offset 0xd3 + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2cfa, lo: 0x8a, hi: 0x8a}, + {value: 0x2d0a, lo: 0x8b, hi: 0x8b}, + {value: 0x2d02, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1f, offset 0xda + {value: 0x6bee, lo: 0x07}, + {value: 0x9904, lo: 0x8a, hi: 0x8a}, + {value: 0x9900, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x3ef4, lo: 0x9a, hi: 0x9a}, + {value: 0x2f54, lo: 0x9c, hi: 0x9c}, + {value: 0x2ddf, lo: 0x9d, hi: 0x9d}, + {value: 0x2d12, lo: 0x9e, hi: 0x9f}, + // Block 0x20, offset 0xe2 + {value: 0x0000, lo: 0x03}, + {value: 0x261d, lo: 0xb3, hi: 0xb3}, + {value: 0x8122, lo: 0xb8, hi: 0xb9}, + {value: 0x8104, lo: 0xba, hi: 0xba}, + // Block 0x21, offset 0xe6 + {value: 0x0000, lo: 0x01}, + {value: 0x8123, lo: 0x88, hi: 0x8b}, + // Block 0x22, offset 0xe8 + {value: 0x0000, lo: 0x02}, + {value: 0x2632, lo: 0xb3, hi: 0xb3}, + {value: 0x8124, lo: 0xb8, hi: 0xb9}, + // Block 0x23, offset 0xeb + {value: 0x0000, lo: 0x03}, + {value: 0x8125, lo: 0x88, hi: 0x8b}, + {value: 0x2624, lo: 0x9c, hi: 0x9c}, + {value: 0x262b, lo: 0x9d, hi: 0x9d}, + // Block 0x24, offset 0xef + {value: 0x0000, lo: 0x05}, + {value: 0x030b, lo: 0x8c, hi: 0x8c}, + {value: 0x812d, lo: 0x98, hi: 0x99}, + {value: 0x812d, lo: 0xb5, hi: 0xb5}, + {value: 0x812d, lo: 0xb7, hi: 0xb7}, + {value: 0x812b, lo: 0xb9, hi: 0xb9}, + // Block 0x25, offset 0xf5 + {value: 0x0000, lo: 0x10}, + {value: 0x2640, lo: 0x83, hi: 0x83}, + {value: 0x2647, lo: 0x8d, hi: 0x8d}, + {value: 0x264e, lo: 0x92, hi: 0x92}, + {value: 0x2655, lo: 0x97, hi: 0x97}, + {value: 0x265c, lo: 0x9c, hi: 0x9c}, + {value: 0x2639, lo: 0xa9, hi: 0xa9}, + {value: 0x8126, lo: 0xb1, hi: 0xb1}, + {value: 0x8127, lo: 0xb2, hi: 0xb2}, + {value: 0x4a62, lo: 0xb3, hi: 0xb3}, + {value: 0x8128, lo: 0xb4, hi: 0xb4}, + {value: 0x4a6b, lo: 0xb5, hi: 0xb5}, + {value: 0x4646, lo: 0xb6, hi: 0xb6}, + {value: 0x4686, lo: 0xb7, hi: 0xb7}, + {value: 0x464e, lo: 0xb8, hi: 0xb8}, + {value: 0x4691, lo: 0xb9, hi: 0xb9}, + {value: 0x8127, lo: 0xba, hi: 0xbd}, + // Block 0x26, offset 0x106 + {value: 0x0000, lo: 0x0b}, + {value: 0x8127, lo: 0x80, hi: 0x80}, + {value: 0x4a74, lo: 0x81, hi: 0x81}, + {value: 0x8132, lo: 0x82, hi: 0x83}, + {value: 0x8104, lo: 0x84, hi: 0x84}, + {value: 0x8132, lo: 0x86, hi: 0x87}, + {value: 0x266a, lo: 0x93, hi: 0x93}, + {value: 0x2671, lo: 0x9d, hi: 0x9d}, + {value: 0x2678, lo: 0xa2, hi: 0xa2}, + {value: 0x267f, lo: 0xa7, hi: 0xa7}, + {value: 0x2686, lo: 0xac, hi: 0xac}, + {value: 0x2663, lo: 0xb9, hi: 0xb9}, + // Block 0x27, offset 0x112 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x86, hi: 0x86}, + // Block 0x28, offset 0x114 + {value: 0x0000, lo: 0x05}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x2d1a, lo: 0xa6, hi: 0xa6}, + {value: 0x9900, lo: 0xae, hi: 0xae}, + {value: 0x8102, lo: 0xb7, hi: 0xb7}, + {value: 0x8104, lo: 0xb9, hi: 0xba}, + // Block 0x29, offset 0x11a + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x8d, hi: 0x8d}, + // Block 0x2a, offset 0x11c + {value: 0x0000, lo: 0x01}, + {value: 0x030f, lo: 0xbc, hi: 0xbc}, + // Block 0x2b, offset 0x11e + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x80, hi: 0x92}, + // Block 0x2c, offset 0x120 + {value: 0x0000, lo: 0x01}, + {value: 0xb900, lo: 0xa1, hi: 0xb5}, + // Block 0x2d, offset 0x122 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0xa8, hi: 0xbf}, + // Block 0x2e, offset 0x124 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0x80, hi: 0x82}, + // Block 0x2f, offset 0x126 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x9d, hi: 0x9f}, + // Block 0x30, offset 0x128 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x94, hi: 0x94}, + {value: 0x8104, lo: 0xb4, hi: 0xb4}, + // Block 0x31, offset 0x12b + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x92, hi: 0x92}, + {value: 0x8132, lo: 0x9d, hi: 0x9d}, + // Block 0x32, offset 0x12e + {value: 0x0000, lo: 0x01}, + {value: 0x8131, lo: 0xa9, hi: 0xa9}, + // Block 0x33, offset 0x130 + {value: 0x0004, lo: 0x02}, + {value: 0x812e, lo: 0xb9, hi: 0xba}, + {value: 0x812d, lo: 0xbb, hi: 0xbb}, + // Block 0x34, offset 0x133 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0x97, hi: 0x97}, + {value: 0x812d, lo: 0x98, hi: 0x98}, + // Block 0x35, offset 0x136 + {value: 0x0000, lo: 0x03}, + {value: 0x8104, lo: 0xa0, hi: 0xa0}, + {value: 0x8132, lo: 0xb5, hi: 0xbc}, + {value: 0x812d, lo: 0xbf, hi: 0xbf}, + // Block 0x36, offset 0x13a + {value: 0x0000, lo: 0x04}, + {value: 0x8132, lo: 0xb0, hi: 0xb4}, + {value: 0x812d, lo: 0xb5, hi: 0xba}, + {value: 0x8132, lo: 0xbb, hi: 0xbc}, + {value: 0x812d, lo: 0xbd, hi: 0xbd}, + // Block 0x37, offset 0x13f + {value: 0x0000, lo: 0x08}, + {value: 0x2d62, lo: 0x80, hi: 0x80}, + {value: 0x2d6a, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x82, hi: 0x82}, + {value: 0x2d72, lo: 0x83, hi: 0x83}, + {value: 0x8104, lo: 0x84, hi: 0x84}, + {value: 0x8132, lo: 0xab, hi: 0xab}, + {value: 0x812d, lo: 0xac, hi: 0xac}, + {value: 0x8132, lo: 0xad, hi: 0xb3}, + // Block 0x38, offset 0x148 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xaa, hi: 0xab}, + // Block 0x39, offset 0x14a + {value: 0x0000, lo: 0x02}, + {value: 0x8102, lo: 0xa6, hi: 0xa6}, + {value: 0x8104, lo: 0xb2, hi: 0xb3}, + // Block 0x3a, offset 0x14d + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb7, hi: 0xb7}, + // Block 0x3b, offset 0x14f + {value: 0x0000, lo: 0x0a}, + {value: 0x8132, lo: 0x90, hi: 0x92}, + {value: 0x8101, lo: 0x94, hi: 0x94}, + {value: 0x812d, lo: 0x95, hi: 0x99}, + {value: 0x8132, lo: 0x9a, hi: 0x9b}, + {value: 0x812d, lo: 0x9c, hi: 0x9f}, + {value: 0x8132, lo: 0xa0, hi: 0xa0}, + {value: 0x8101, lo: 0xa2, hi: 0xa8}, + {value: 0x812d, lo: 0xad, hi: 0xad}, + {value: 0x8132, lo: 0xb4, hi: 0xb4}, + {value: 0x8132, lo: 0xb8, hi: 0xb9}, + // Block 0x3c, offset 0x15a + {value: 0x0002, lo: 0x0a}, + {value: 0x0043, lo: 0xac, hi: 0xac}, + {value: 0x00d1, lo: 0xad, hi: 0xad}, + {value: 0x0045, lo: 0xae, hi: 0xae}, + {value: 0x0049, lo: 0xb0, hi: 0xb1}, + {value: 0x00e6, lo: 0xb2, hi: 0xb2}, + {value: 0x004f, lo: 0xb3, hi: 0xba}, + {value: 0x005f, lo: 0xbc, hi: 0xbc}, + {value: 0x00ef, lo: 0xbd, hi: 0xbd}, + {value: 0x0061, lo: 0xbe, hi: 0xbe}, + {value: 0x0065, lo: 0xbf, hi: 0xbf}, + // Block 0x3d, offset 0x165 + {value: 0x0000, lo: 0x0e}, + {value: 0x8132, lo: 0x80, hi: 0x81}, + {value: 0x812d, lo: 0x82, hi: 0x82}, + {value: 0x8132, lo: 0x83, hi: 0x89}, + {value: 0x812d, lo: 0x8a, hi: 0x8a}, + {value: 0x8132, lo: 0x8b, hi: 0x8c}, + {value: 0x8135, lo: 0x8d, hi: 0x8d}, + {value: 0x812a, lo: 0x8e, hi: 0x8e}, + {value: 0x812d, lo: 0x8f, hi: 0x8f}, + {value: 0x8129, lo: 0x90, hi: 0x90}, + {value: 0x8132, lo: 0x91, hi: 0xb5}, + {value: 0x8134, lo: 0xbc, hi: 0xbc}, + {value: 0x812d, lo: 0xbd, hi: 0xbd}, + {value: 0x8132, lo: 0xbe, hi: 0xbe}, + {value: 0x812d, lo: 0xbf, hi: 0xbf}, + // Block 0x3e, offset 0x174 + {value: 0x0000, lo: 0x0d}, + {value: 0x0001, lo: 0x80, hi: 0x8a}, + {value: 0x043b, lo: 0x91, hi: 0x91}, + {value: 0x4297, lo: 0x97, hi: 0x97}, + {value: 0x001d, lo: 0xa4, hi: 0xa4}, + {value: 0x186f, lo: 0xa5, hi: 0xa5}, + {value: 0x1b58, lo: 0xa6, hi: 0xa6}, + {value: 0x0001, lo: 0xaf, hi: 0xaf}, + {value: 0x268d, lo: 0xb3, hi: 0xb3}, + {value: 0x27fa, lo: 0xb4, hi: 0xb4}, + {value: 0x2694, lo: 0xb6, hi: 0xb6}, + {value: 0x2804, lo: 0xb7, hi: 0xb7}, + {value: 0x1869, lo: 0xbc, hi: 0xbc}, + {value: 0x4265, lo: 0xbe, hi: 0xbe}, + // Block 0x3f, offset 0x182 + {value: 0x0002, lo: 0x0d}, + {value: 0x192f, lo: 0x87, hi: 0x87}, + {value: 0x192c, lo: 0x88, hi: 0x88}, + {value: 0x186c, lo: 0x89, hi: 0x89}, + {value: 0x298a, lo: 0x97, hi: 0x97}, + {value: 0x0001, lo: 0x9f, hi: 0x9f}, + {value: 0x0021, lo: 0xb0, hi: 0xb0}, + {value: 0x0093, lo: 0xb1, hi: 0xb1}, + {value: 0x0029, lo: 0xb4, hi: 0xb9}, + {value: 0x0017, lo: 0xba, hi: 0xba}, + {value: 0x0467, lo: 0xbb, hi: 0xbb}, + {value: 0x003b, lo: 0xbc, hi: 0xbc}, + {value: 0x0011, lo: 0xbd, hi: 0xbe}, + {value: 0x009d, lo: 0xbf, hi: 0xbf}, + // Block 0x40, offset 0x190 + {value: 0x0002, lo: 0x0f}, + {value: 0x0021, lo: 0x80, hi: 0x89}, + {value: 0x0017, lo: 0x8a, hi: 0x8a}, + {value: 0x0467, lo: 0x8b, hi: 0x8b}, + {value: 0x003b, lo: 0x8c, hi: 0x8c}, + {value: 0x0011, lo: 0x8d, hi: 0x8e}, + {value: 0x0083, lo: 0x90, hi: 0x90}, + {value: 0x008b, lo: 0x91, hi: 0x91}, + {value: 0x009f, lo: 0x92, hi: 0x92}, + {value: 0x00b1, lo: 0x93, hi: 0x93}, + {value: 0x0104, lo: 0x94, hi: 0x94}, + {value: 0x0091, lo: 0x95, hi: 0x95}, + {value: 0x0097, lo: 0x96, hi: 0x99}, + {value: 0x00a1, lo: 0x9a, hi: 0x9a}, + {value: 0x00a7, lo: 0x9b, hi: 0x9c}, + {value: 0x1995, lo: 0xa8, hi: 0xa8}, + // Block 0x41, offset 0x1a0 + {value: 0x0000, lo: 0x0d}, + {value: 0x8132, lo: 0x90, hi: 0x91}, + {value: 0x8101, lo: 0x92, hi: 0x93}, + {value: 0x8132, lo: 0x94, hi: 0x97}, + {value: 0x8101, lo: 0x98, hi: 0x9a}, + {value: 0x8132, lo: 0x9b, hi: 0x9c}, + {value: 0x8132, lo: 0xa1, hi: 0xa1}, + {value: 0x8101, lo: 0xa5, hi: 0xa6}, + {value: 0x8132, lo: 0xa7, hi: 0xa7}, + {value: 0x812d, lo: 0xa8, hi: 0xa8}, + {value: 0x8132, lo: 0xa9, hi: 0xa9}, + {value: 0x8101, lo: 0xaa, hi: 0xab}, + {value: 0x812d, lo: 0xac, hi: 0xaf}, + {value: 0x8132, lo: 0xb0, hi: 0xb0}, + // Block 0x42, offset 0x1ae + {value: 0x0007, lo: 0x06}, + {value: 0x217c, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + {value: 0x3bb5, lo: 0x9a, hi: 0x9b}, + {value: 0x3bc3, lo: 0xae, hi: 0xae}, + // Block 0x43, offset 0x1b5 + {value: 0x000e, lo: 0x05}, + {value: 0x3bca, lo: 0x8d, hi: 0x8e}, + {value: 0x3bd1, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + // Block 0x44, offset 0x1bb + {value: 0x0173, lo: 0x0e}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0x3bdf, lo: 0x84, hi: 0x84}, + {value: 0xa000, lo: 0x88, hi: 0x88}, + {value: 0x3be6, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0x3bed, lo: 0x8c, hi: 0x8c}, + {value: 0xa000, lo: 0xa3, hi: 0xa3}, + {value: 0x3bf4, lo: 0xa4, hi: 0xa4}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x3bfb, lo: 0xa6, hi: 0xa6}, + {value: 0x269b, lo: 0xac, hi: 0xad}, + {value: 0x26a2, lo: 0xaf, hi: 0xaf}, + {value: 0x2818, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xbc, hi: 0xbc}, + // Block 0x45, offset 0x1ca + {value: 0x0007, lo: 0x03}, + {value: 0x3c64, lo: 0xa0, hi: 0xa1}, + {value: 0x3c8e, lo: 0xa2, hi: 0xa3}, + {value: 0x3cb8, lo: 0xaa, hi: 0xad}, + // Block 0x46, offset 0x1ce + {value: 0x0004, lo: 0x01}, + {value: 0x048b, lo: 0xa9, hi: 0xaa}, + // Block 0x47, offset 0x1d0 + {value: 0x0002, lo: 0x03}, + {value: 0x0057, lo: 0x80, hi: 0x8f}, + {value: 0x0083, lo: 0x90, hi: 0xa9}, + {value: 0x0021, lo: 0xaa, hi: 0xaa}, + // Block 0x48, offset 0x1d4 + {value: 0x0000, lo: 0x01}, + {value: 0x2997, lo: 0x8c, hi: 0x8c}, + // Block 0x49, offset 0x1d6 + {value: 0x0263, lo: 0x02}, + {value: 0x1b88, lo: 0xb4, hi: 0xb4}, + {value: 0x1929, lo: 0xb5, hi: 0xb6}, + // Block 0x4a, offset 0x1d9 + {value: 0x0000, lo: 0x01}, + {value: 0x456f, lo: 0x9c, hi: 0x9c}, + // Block 0x4b, offset 0x1db + {value: 0x0000, lo: 0x02}, + {value: 0x0095, lo: 0xbc, hi: 0xbc}, + {value: 0x006d, lo: 0xbd, hi: 0xbd}, + // Block 0x4c, offset 0x1de + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xaf, hi: 0xb1}, + // Block 0x4d, offset 0x1e0 + {value: 0x0000, lo: 0x02}, + {value: 0x047f, lo: 0xaf, hi: 0xaf}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x4e, offset 0x1e3 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xa0, hi: 0xbf}, + // Block 0x4f, offset 0x1e5 + {value: 0x0000, lo: 0x01}, + {value: 0x0dc3, lo: 0x9f, hi: 0x9f}, + // Block 0x50, offset 0x1e7 + {value: 0x0000, lo: 0x01}, + {value: 0x162b, lo: 0xb3, hi: 0xb3}, + // Block 0x51, offset 0x1e9 + {value: 0x0004, lo: 0x0b}, + {value: 0x1593, lo: 0x80, hi: 0x82}, + {value: 0x15ab, lo: 0x83, hi: 0x83}, + {value: 0x15c3, lo: 0x84, hi: 0x85}, + {value: 0x15d3, lo: 0x86, hi: 0x89}, + {value: 0x15e7, lo: 0x8a, hi: 0x8c}, + {value: 0x15fb, lo: 0x8d, hi: 0x8d}, + {value: 0x1603, lo: 0x8e, hi: 0x8e}, + {value: 0x160b, lo: 0x8f, hi: 0x90}, + {value: 0x1617, lo: 0x91, hi: 0x93}, + {value: 0x1627, lo: 0x94, hi: 0x94}, + {value: 0x162f, lo: 0x95, hi: 0x95}, + // Block 0x52, offset 0x1f5 + {value: 0x0004, lo: 0x09}, + {value: 0x0001, lo: 0x80, hi: 0x80}, + {value: 0x812c, lo: 0xaa, hi: 0xaa}, + {value: 0x8131, lo: 0xab, hi: 0xab}, + {value: 0x8133, lo: 0xac, hi: 0xac}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + {value: 0x812f, lo: 0xae, hi: 0xae}, + {value: 0x812f, lo: 0xaf, hi: 0xaf}, + {value: 0x04b3, lo: 0xb6, hi: 0xb6}, + {value: 0x0887, lo: 0xb8, hi: 0xba}, + // Block 0x53, offset 0x1ff + {value: 0x0005, lo: 0x09}, + {value: 0x0313, lo: 0xb1, hi: 0xb1}, + {value: 0x0317, lo: 0xb2, hi: 0xb2}, + {value: 0x4341, lo: 0xb3, hi: 0xb3}, + {value: 0x031b, lo: 0xb4, hi: 0xb4}, + {value: 0x4346, lo: 0xb5, hi: 0xb6}, + {value: 0x031f, lo: 0xb7, hi: 0xb7}, + {value: 0x0323, lo: 0xb8, hi: 0xb8}, + {value: 0x0327, lo: 0xb9, hi: 0xb9}, + {value: 0x4350, lo: 0xba, hi: 0xbf}, + // Block 0x54, offset 0x209 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0xaf, hi: 0xaf}, + {value: 0x8132, lo: 0xb4, hi: 0xbd}, + // Block 0x55, offset 0x20c + {value: 0x0000, lo: 0x03}, + {value: 0x020f, lo: 0x9c, hi: 0x9c}, + {value: 0x0212, lo: 0x9d, hi: 0x9d}, + {value: 0x8132, lo: 0x9e, hi: 0x9f}, + // Block 0x56, offset 0x210 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xb0, hi: 0xb1}, + // Block 0x57, offset 0x212 + {value: 0x0000, lo: 0x01}, + {value: 0x1637, lo: 0xb0, hi: 0xb0}, + // Block 0x58, offset 0x214 + {value: 0x000c, lo: 0x01}, + {value: 0x00d7, lo: 0xb8, hi: 0xb9}, + // Block 0x59, offset 0x216 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x86, hi: 0x86}, + // Block 0x5a, offset 0x218 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x84, hi: 0x84}, + {value: 0x8132, lo: 0xa0, hi: 0xb1}, + // Block 0x5b, offset 0x21b + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0xab, hi: 0xad}, + // Block 0x5c, offset 0x21d + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x93, hi: 0x93}, + // Block 0x5d, offset 0x21f + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb3, hi: 0xb3}, + // Block 0x5e, offset 0x221 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0x80, hi: 0x80}, + // Block 0x5f, offset 0x223 + {value: 0x0000, lo: 0x05}, + {value: 0x8132, lo: 0xb0, hi: 0xb0}, + {value: 0x8132, lo: 0xb2, hi: 0xb3}, + {value: 0x812d, lo: 0xb4, hi: 0xb4}, + {value: 0x8132, lo: 0xb7, hi: 0xb8}, + {value: 0x8132, lo: 0xbe, hi: 0xbf}, + // Block 0x60, offset 0x229 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0x81, hi: 0x81}, + {value: 0x8104, lo: 0xb6, hi: 0xb6}, + // Block 0x61, offset 0x22c + {value: 0x0008, lo: 0x03}, + {value: 0x1633, lo: 0x9c, hi: 0x9d}, + {value: 0x0125, lo: 0x9e, hi: 0x9e}, + {value: 0x163f, lo: 0x9f, hi: 0x9f}, + // Block 0x62, offset 0x230 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xad, hi: 0xad}, + // Block 0x63, offset 0x232 + {value: 0x0000, lo: 0x06}, + {value: 0xe500, lo: 0x80, hi: 0x80}, + {value: 0xc600, lo: 0x81, hi: 0x9b}, + {value: 0xe500, lo: 0x9c, hi: 0x9c}, + {value: 0xc600, lo: 0x9d, hi: 0xb7}, + {value: 0xe500, lo: 0xb8, hi: 0xb8}, + {value: 0xc600, lo: 0xb9, hi: 0xbf}, + // Block 0x64, offset 0x239 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x93}, + {value: 0xe500, lo: 0x94, hi: 0x94}, + {value: 0xc600, lo: 0x95, hi: 0xaf}, + {value: 0xe500, lo: 0xb0, hi: 0xb0}, + {value: 0xc600, lo: 0xb1, hi: 0xbf}, + // Block 0x65, offset 0x23f + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8b}, + {value: 0xe500, lo: 0x8c, hi: 0x8c}, + {value: 0xc600, lo: 0x8d, hi: 0xa7}, + {value: 0xe500, lo: 0xa8, hi: 0xa8}, + {value: 0xc600, lo: 0xa9, hi: 0xbf}, + // Block 0x66, offset 0x245 + {value: 0x0000, lo: 0x07}, + {value: 0xc600, lo: 0x80, hi: 0x83}, + {value: 0xe500, lo: 0x84, hi: 0x84}, + {value: 0xc600, lo: 0x85, hi: 0x9f}, + {value: 0xe500, lo: 0xa0, hi: 0xa0}, + {value: 0xc600, lo: 0xa1, hi: 0xbb}, + {value: 0xe500, lo: 0xbc, hi: 0xbc}, + {value: 0xc600, lo: 0xbd, hi: 0xbf}, + // Block 0x67, offset 0x24d + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x97}, + {value: 0xe500, lo: 0x98, hi: 0x98}, + {value: 0xc600, lo: 0x99, hi: 0xb3}, + {value: 0xe500, lo: 0xb4, hi: 0xb4}, + {value: 0xc600, lo: 0xb5, hi: 0xbf}, + // Block 0x68, offset 0x253 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8f}, + {value: 0xe500, lo: 0x90, hi: 0x90}, + {value: 0xc600, lo: 0x91, hi: 0xab}, + {value: 0xe500, lo: 0xac, hi: 0xac}, + {value: 0xc600, lo: 0xad, hi: 0xbf}, + // Block 0x69, offset 0x259 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + {value: 0xe500, lo: 0xa4, hi: 0xa4}, + {value: 0xc600, lo: 0xa5, hi: 0xbf}, + // Block 0x6a, offset 0x25f + {value: 0x0000, lo: 0x03}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + // Block 0x6b, offset 0x263 + {value: 0x0002, lo: 0x01}, + {value: 0x0003, lo: 0x81, hi: 0xbf}, + // Block 0x6c, offset 0x265 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0xbd, hi: 0xbd}, + // Block 0x6d, offset 0x267 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0xa0, hi: 0xa0}, + // Block 0x6e, offset 0x269 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xb6, hi: 0xba}, + // Block 0x6f, offset 0x26b + {value: 0x002c, lo: 0x05}, + {value: 0x812d, lo: 0x8d, hi: 0x8d}, + {value: 0x8132, lo: 0x8f, hi: 0x8f}, + {value: 0x8132, lo: 0xb8, hi: 0xb8}, + {value: 0x8101, lo: 0xb9, hi: 0xba}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x70, offset 0x271 + {value: 0x0000, lo: 0x02}, + {value: 0x8132, lo: 0xa5, hi: 0xa5}, + {value: 0x812d, lo: 0xa6, hi: 0xa6}, + // Block 0x71, offset 0x274 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x86, hi: 0x86}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x72, offset 0x277 + {value: 0x17fe, lo: 0x07}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4234, lo: 0x9a, hi: 0x9a}, + {value: 0xa000, lo: 0x9b, hi: 0x9b}, + {value: 0x423e, lo: 0x9c, hi: 0x9c}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x4248, lo: 0xab, hi: 0xab}, + {value: 0x8104, lo: 0xb9, hi: 0xba}, + // Block 0x73, offset 0x27f + {value: 0x0000, lo: 0x06}, + {value: 0x8132, lo: 0x80, hi: 0x82}, + {value: 0x9900, lo: 0xa7, hi: 0xa7}, + {value: 0x2d7a, lo: 0xae, hi: 0xae}, + {value: 0x2d84, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb1, hi: 0xb2}, + {value: 0x8104, lo: 0xb3, hi: 0xb4}, + // Block 0x74, offset 0x286 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x80, hi: 0x80}, + {value: 0x8102, lo: 0x8a, hi: 0x8a}, + // Block 0x75, offset 0x289 + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xb5, hi: 0xb5}, + {value: 0x8102, lo: 0xb6, hi: 0xb6}, + // Block 0x76, offset 0x28c + {value: 0x0002, lo: 0x01}, + {value: 0x8102, lo: 0xa9, hi: 0xaa}, + // Block 0x77, offset 0x28e + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2d8e, lo: 0x8b, hi: 0x8b}, + {value: 0x2d98, lo: 0x8c, hi: 0x8c}, + {value: 0x8104, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x8132, lo: 0xa6, hi: 0xac}, + {value: 0x8132, lo: 0xb0, hi: 0xb4}, + // Block 0x78, offset 0x296 + {value: 0x6b5e, lo: 0x06}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb9, hi: 0xb9}, + {value: 0x9900, lo: 0xba, hi: 0xba}, + {value: 0x2dac, lo: 0xbb, hi: 0xbb}, + {value: 0x2da2, lo: 0xbc, hi: 0xbd}, + {value: 0x2db6, lo: 0xbe, hi: 0xbe}, + // Block 0x79, offset 0x29d + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0x82, hi: 0x82}, + {value: 0x8102, lo: 0x83, hi: 0x83}, + // Block 0x7a, offset 0x2a0 + {value: 0x0000, lo: 0x05}, + {value: 0x9900, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb8, hi: 0xb9}, + {value: 0x2dc0, lo: 0xba, hi: 0xba}, + {value: 0x2dca, lo: 0xbb, hi: 0xbb}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x7b, offset 0x2a6 + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0x80, hi: 0x80}, + // Block 0x7c, offset 0x2a8 + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xbf, hi: 0xbf}, + // Block 0x7d, offset 0x2aa + {value: 0x0000, lo: 0x02}, + {value: 0x8104, lo: 0xb6, hi: 0xb6}, + {value: 0x8102, lo: 0xb7, hi: 0xb7}, + // Block 0x7e, offset 0x2ad + {value: 0x0000, lo: 0x01}, + {value: 0x8104, lo: 0xab, hi: 0xab}, + // Block 0x7f, offset 0x2af + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0xb0, hi: 0xb4}, + // Block 0x80, offset 0x2b1 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xb0, hi: 0xb6}, + // Block 0x81, offset 0x2b3 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0x9e, hi: 0x9e}, + // Block 0x82, offset 0x2b5 + {value: 0x0000, lo: 0x0c}, + {value: 0x465e, lo: 0x9e, hi: 0x9e}, + {value: 0x4668, lo: 0x9f, hi: 0x9f}, + {value: 0x469c, lo: 0xa0, hi: 0xa0}, + {value: 0x46aa, lo: 0xa1, hi: 0xa1}, + {value: 0x46b8, lo: 0xa2, hi: 0xa2}, + {value: 0x46c6, lo: 0xa3, hi: 0xa3}, + {value: 0x46d4, lo: 0xa4, hi: 0xa4}, + {value: 0x812b, lo: 0xa5, hi: 0xa6}, + {value: 0x8101, lo: 0xa7, hi: 0xa9}, + {value: 0x8130, lo: 0xad, hi: 0xad}, + {value: 0x812b, lo: 0xae, hi: 0xb2}, + {value: 0x812d, lo: 0xbb, hi: 0xbf}, + // Block 0x83, offset 0x2c2 + {value: 0x0000, lo: 0x09}, + {value: 0x812d, lo: 0x80, hi: 0x82}, + {value: 0x8132, lo: 0x85, hi: 0x89}, + {value: 0x812d, lo: 0x8a, hi: 0x8b}, + {value: 0x8132, lo: 0xaa, hi: 0xad}, + {value: 0x4672, lo: 0xbb, hi: 0xbb}, + {value: 0x467c, lo: 0xbc, hi: 0xbc}, + {value: 0x46e2, lo: 0xbd, hi: 0xbd}, + {value: 0x46fe, lo: 0xbe, hi: 0xbe}, + {value: 0x46f0, lo: 0xbf, hi: 0xbf}, + // Block 0x84, offset 0x2cc + {value: 0x0000, lo: 0x01}, + {value: 0x470c, lo: 0x80, hi: 0x80}, + // Block 0x85, offset 0x2ce + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0x82, hi: 0x84}, + // Block 0x86, offset 0x2d0 + {value: 0x0002, lo: 0x03}, + {value: 0x0043, lo: 0x80, hi: 0x99}, + {value: 0x0083, lo: 0x9a, hi: 0xb3}, + {value: 0x0043, lo: 0xb4, hi: 0xbf}, + // Block 0x87, offset 0x2d4 + {value: 0x0002, lo: 0x04}, + {value: 0x005b, lo: 0x80, hi: 0x8d}, + {value: 0x0083, lo: 0x8e, hi: 0x94}, + {value: 0x0093, lo: 0x96, hi: 0xa7}, + {value: 0x0043, lo: 0xa8, hi: 0xbf}, + // Block 0x88, offset 0x2d9 + {value: 0x0002, lo: 0x0b}, + {value: 0x0073, lo: 0x80, hi: 0x81}, + {value: 0x0083, lo: 0x82, hi: 0x9b}, + {value: 0x0043, lo: 0x9c, hi: 0x9c}, + {value: 0x0047, lo: 0x9e, hi: 0x9f}, + {value: 0x004f, lo: 0xa2, hi: 0xa2}, + {value: 0x0055, lo: 0xa5, hi: 0xa6}, + {value: 0x005d, lo: 0xa9, hi: 0xac}, + {value: 0x0067, lo: 0xae, hi: 0xb5}, + {value: 0x0083, lo: 0xb6, hi: 0xb9}, + {value: 0x008d, lo: 0xbb, hi: 0xbb}, + {value: 0x0091, lo: 0xbd, hi: 0xbf}, + // Block 0x89, offset 0x2e5 + {value: 0x0002, lo: 0x04}, + {value: 0x0097, lo: 0x80, hi: 0x83}, + {value: 0x00a1, lo: 0x85, hi: 0x8f}, + {value: 0x0043, lo: 0x90, hi: 0xa9}, + {value: 0x0083, lo: 0xaa, hi: 0xbf}, + // Block 0x8a, offset 0x2ea + {value: 0x0002, lo: 0x08}, + {value: 0x00af, lo: 0x80, hi: 0x83}, + {value: 0x0043, lo: 0x84, hi: 0x85}, + {value: 0x0049, lo: 0x87, hi: 0x8a}, + {value: 0x0055, lo: 0x8d, hi: 0x94}, + {value: 0x0067, lo: 0x96, hi: 0x9c}, + {value: 0x0083, lo: 0x9e, hi: 0xb7}, + {value: 0x0043, lo: 0xb8, hi: 0xb9}, + {value: 0x0049, lo: 0xbb, hi: 0xbe}, + // Block 0x8b, offset 0x2f3 + {value: 0x0002, lo: 0x05}, + {value: 0x0053, lo: 0x80, hi: 0x84}, + {value: 0x005f, lo: 0x86, hi: 0x86}, + {value: 0x0067, lo: 0x8a, hi: 0x90}, + {value: 0x0083, lo: 0x92, hi: 0xab}, + {value: 0x0043, lo: 0xac, hi: 0xbf}, + // Block 0x8c, offset 0x2f9 + {value: 0x0002, lo: 0x04}, + {value: 0x006b, lo: 0x80, hi: 0x85}, + {value: 0x0083, lo: 0x86, hi: 0x9f}, + {value: 0x0043, lo: 0xa0, hi: 0xb9}, + {value: 0x0083, lo: 0xba, hi: 0xbf}, + // Block 0x8d, offset 0x2fe + {value: 0x0002, lo: 0x03}, + {value: 0x008f, lo: 0x80, hi: 0x93}, + {value: 0x0043, lo: 0x94, hi: 0xad}, + {value: 0x0083, lo: 0xae, hi: 0xbf}, + // Block 0x8e, offset 0x302 + {value: 0x0002, lo: 0x04}, + {value: 0x00a7, lo: 0x80, hi: 0x87}, + {value: 0x0043, lo: 0x88, hi: 0xa1}, + {value: 0x0083, lo: 0xa2, hi: 0xbb}, + {value: 0x0043, lo: 0xbc, hi: 0xbf}, + // Block 0x8f, offset 0x307 + {value: 0x0002, lo: 0x03}, + {value: 0x004b, lo: 0x80, hi: 0x95}, + {value: 0x0083, lo: 0x96, hi: 0xaf}, + {value: 0x0043, lo: 0xb0, hi: 0xbf}, + // Block 0x90, offset 0x30b + {value: 0x0003, lo: 0x0f}, + {value: 0x01b8, lo: 0x80, hi: 0x80}, + {value: 0x045f, lo: 0x81, hi: 0x81}, + {value: 0x01bb, lo: 0x82, hi: 0x9a}, + {value: 0x045b, lo: 0x9b, hi: 0x9b}, + {value: 0x01c7, lo: 0x9c, hi: 0x9c}, + {value: 0x01d0, lo: 0x9d, hi: 0x9d}, + {value: 0x01d6, lo: 0x9e, hi: 0x9e}, + {value: 0x01fa, lo: 0x9f, hi: 0x9f}, + {value: 0x01eb, lo: 0xa0, hi: 0xa0}, + {value: 0x01e8, lo: 0xa1, hi: 0xa1}, + {value: 0x0173, lo: 0xa2, hi: 0xb2}, + {value: 0x0188, lo: 0xb3, hi: 0xb3}, + {value: 0x01a6, lo: 0xb4, hi: 0xba}, + {value: 0x045f, lo: 0xbb, hi: 0xbb}, + {value: 0x01bb, lo: 0xbc, hi: 0xbf}, + // Block 0x91, offset 0x31b + {value: 0x0003, lo: 0x0d}, + {value: 0x01c7, lo: 0x80, hi: 0x94}, + {value: 0x045b, lo: 0x95, hi: 0x95}, + {value: 0x01c7, lo: 0x96, hi: 0x96}, + {value: 0x01d0, lo: 0x97, hi: 0x97}, + {value: 0x01d6, lo: 0x98, hi: 0x98}, + {value: 0x01fa, lo: 0x99, hi: 0x99}, + {value: 0x01eb, lo: 0x9a, hi: 0x9a}, + {value: 0x01e8, lo: 0x9b, hi: 0x9b}, + {value: 0x0173, lo: 0x9c, hi: 0xac}, + {value: 0x0188, lo: 0xad, hi: 0xad}, + {value: 0x01a6, lo: 0xae, hi: 0xb4}, + {value: 0x045f, lo: 0xb5, hi: 0xb5}, + {value: 0x01bb, lo: 0xb6, hi: 0xbf}, + // Block 0x92, offset 0x329 + {value: 0x0003, lo: 0x0d}, + {value: 0x01d9, lo: 0x80, hi: 0x8e}, + {value: 0x045b, lo: 0x8f, hi: 0x8f}, + {value: 0x01c7, lo: 0x90, hi: 0x90}, + {value: 0x01d0, lo: 0x91, hi: 0x91}, + {value: 0x01d6, lo: 0x92, hi: 0x92}, + {value: 0x01fa, lo: 0x93, hi: 0x93}, + {value: 0x01eb, lo: 0x94, hi: 0x94}, + {value: 0x01e8, lo: 0x95, hi: 0x95}, + {value: 0x0173, lo: 0x96, hi: 0xa6}, + {value: 0x0188, lo: 0xa7, hi: 0xa7}, + {value: 0x01a6, lo: 0xa8, hi: 0xae}, + {value: 0x045f, lo: 0xaf, hi: 0xaf}, + {value: 0x01bb, lo: 0xb0, hi: 0xbf}, + // Block 0x93, offset 0x337 + {value: 0x0003, lo: 0x0d}, + {value: 0x01eb, lo: 0x80, hi: 0x88}, + {value: 0x045b, lo: 0x89, hi: 0x89}, + {value: 0x01c7, lo: 0x8a, hi: 0x8a}, + {value: 0x01d0, lo: 0x8b, hi: 0x8b}, + {value: 0x01d6, lo: 0x8c, hi: 0x8c}, + {value: 0x01fa, lo: 0x8d, hi: 0x8d}, + {value: 0x01eb, lo: 0x8e, hi: 0x8e}, + {value: 0x01e8, lo: 0x8f, hi: 0x8f}, + {value: 0x0173, lo: 0x90, hi: 0xa0}, + {value: 0x0188, lo: 0xa1, hi: 0xa1}, + {value: 0x01a6, lo: 0xa2, hi: 0xa8}, + {value: 0x045f, lo: 0xa9, hi: 0xa9}, + {value: 0x01bb, lo: 0xaa, hi: 0xbf}, + // Block 0x94, offset 0x345 + {value: 0x0000, lo: 0x01}, + {value: 0x812d, lo: 0x90, hi: 0x96}, + // Block 0x95, offset 0x347 + {value: 0x0002, lo: 0x09}, + {value: 0x0063, lo: 0x80, hi: 0x89}, + {value: 0x194d, lo: 0x8a, hi: 0x8a}, + {value: 0x197d, lo: 0x8b, hi: 0x8b}, + {value: 0x1998, lo: 0x8c, hi: 0x8c}, + {value: 0x199e, lo: 0x8d, hi: 0x8d}, + {value: 0x1bbc, lo: 0x8e, hi: 0x8e}, + {value: 0x19aa, lo: 0x8f, hi: 0x8f}, + {value: 0x1977, lo: 0xaa, hi: 0xaa}, + {value: 0x197a, lo: 0xab, hi: 0xab}, + // Block 0x96, offset 0x351 + {value: 0x0000, lo: 0x01}, + {value: 0x193b, lo: 0x90, hi: 0x90}, + // Block 0x97, offset 0x353 + {value: 0x0028, lo: 0x09}, + {value: 0x285e, lo: 0x80, hi: 0x80}, + {value: 0x2822, lo: 0x81, hi: 0x81}, + {value: 0x282c, lo: 0x82, hi: 0x82}, + {value: 0x2840, lo: 0x83, hi: 0x84}, + {value: 0x284a, lo: 0x85, hi: 0x86}, + {value: 0x2836, lo: 0x87, hi: 0x87}, + {value: 0x2854, lo: 0x88, hi: 0x88}, + {value: 0x0b6f, lo: 0x90, hi: 0x90}, + {value: 0x08e7, lo: 0x91, hi: 0x91}, +} + +// recompMap: 7520 bytes (entries only) +var recompMap = map[uint32]rune{ + 0x00410300: 0x00C0, + 0x00410301: 0x00C1, + 0x00410302: 0x00C2, + 0x00410303: 0x00C3, + 0x00410308: 0x00C4, + 0x0041030A: 0x00C5, + 0x00430327: 0x00C7, + 0x00450300: 0x00C8, + 0x00450301: 0x00C9, + 0x00450302: 0x00CA, + 0x00450308: 0x00CB, + 0x00490300: 0x00CC, + 0x00490301: 0x00CD, + 0x00490302: 0x00CE, + 0x00490308: 0x00CF, + 0x004E0303: 0x00D1, + 0x004F0300: 0x00D2, + 0x004F0301: 0x00D3, + 0x004F0302: 0x00D4, + 0x004F0303: 0x00D5, + 0x004F0308: 0x00D6, + 0x00550300: 0x00D9, + 0x00550301: 0x00DA, + 0x00550302: 0x00DB, + 0x00550308: 0x00DC, + 0x00590301: 0x00DD, + 0x00610300: 0x00E0, + 0x00610301: 0x00E1, + 0x00610302: 0x00E2, + 0x00610303: 0x00E3, + 0x00610308: 0x00E4, + 0x0061030A: 0x00E5, + 0x00630327: 0x00E7, + 0x00650300: 0x00E8, + 0x00650301: 0x00E9, + 0x00650302: 0x00EA, + 0x00650308: 0x00EB, + 0x00690300: 0x00EC, + 0x00690301: 0x00ED, + 0x00690302: 0x00EE, + 0x00690308: 0x00EF, + 0x006E0303: 0x00F1, + 0x006F0300: 0x00F2, + 0x006F0301: 0x00F3, + 0x006F0302: 0x00F4, + 0x006F0303: 0x00F5, + 0x006F0308: 0x00F6, + 0x00750300: 0x00F9, + 0x00750301: 0x00FA, + 0x00750302: 0x00FB, + 0x00750308: 0x00FC, + 0x00790301: 0x00FD, + 0x00790308: 0x00FF, + 0x00410304: 0x0100, + 0x00610304: 0x0101, + 0x00410306: 0x0102, + 0x00610306: 0x0103, + 0x00410328: 0x0104, + 0x00610328: 0x0105, + 0x00430301: 0x0106, + 0x00630301: 0x0107, + 0x00430302: 0x0108, + 0x00630302: 0x0109, + 0x00430307: 0x010A, + 0x00630307: 0x010B, + 0x0043030C: 0x010C, + 0x0063030C: 0x010D, + 0x0044030C: 0x010E, + 0x0064030C: 0x010F, + 0x00450304: 0x0112, + 0x00650304: 0x0113, + 0x00450306: 0x0114, + 0x00650306: 0x0115, + 0x00450307: 0x0116, + 0x00650307: 0x0117, + 0x00450328: 0x0118, + 0x00650328: 0x0119, + 0x0045030C: 0x011A, + 0x0065030C: 0x011B, + 0x00470302: 0x011C, + 0x00670302: 0x011D, + 0x00470306: 0x011E, + 0x00670306: 0x011F, + 0x00470307: 0x0120, + 0x00670307: 0x0121, + 0x00470327: 0x0122, + 0x00670327: 0x0123, + 0x00480302: 0x0124, + 0x00680302: 0x0125, + 0x00490303: 0x0128, + 0x00690303: 0x0129, + 0x00490304: 0x012A, + 0x00690304: 0x012B, + 0x00490306: 0x012C, + 0x00690306: 0x012D, + 0x00490328: 0x012E, + 0x00690328: 0x012F, + 0x00490307: 0x0130, + 0x004A0302: 0x0134, + 0x006A0302: 0x0135, + 0x004B0327: 0x0136, + 0x006B0327: 0x0137, + 0x004C0301: 0x0139, + 0x006C0301: 0x013A, + 0x004C0327: 0x013B, + 0x006C0327: 0x013C, + 0x004C030C: 0x013D, + 0x006C030C: 0x013E, + 0x004E0301: 0x0143, + 0x006E0301: 0x0144, + 0x004E0327: 0x0145, + 0x006E0327: 0x0146, + 0x004E030C: 0x0147, + 0x006E030C: 0x0148, + 0x004F0304: 0x014C, + 0x006F0304: 0x014D, + 0x004F0306: 0x014E, + 0x006F0306: 0x014F, + 0x004F030B: 0x0150, + 0x006F030B: 0x0151, + 0x00520301: 0x0154, + 0x00720301: 0x0155, + 0x00520327: 0x0156, + 0x00720327: 0x0157, + 0x0052030C: 0x0158, + 0x0072030C: 0x0159, + 0x00530301: 0x015A, + 0x00730301: 0x015B, + 0x00530302: 0x015C, + 0x00730302: 0x015D, + 0x00530327: 0x015E, + 0x00730327: 0x015F, + 0x0053030C: 0x0160, + 0x0073030C: 0x0161, + 0x00540327: 0x0162, + 0x00740327: 0x0163, + 0x0054030C: 0x0164, + 0x0074030C: 0x0165, + 0x00550303: 0x0168, + 0x00750303: 0x0169, + 0x00550304: 0x016A, + 0x00750304: 0x016B, + 0x00550306: 0x016C, + 0x00750306: 0x016D, + 0x0055030A: 0x016E, + 0x0075030A: 0x016F, + 0x0055030B: 0x0170, + 0x0075030B: 0x0171, + 0x00550328: 0x0172, + 0x00750328: 0x0173, + 0x00570302: 0x0174, + 0x00770302: 0x0175, + 0x00590302: 0x0176, + 0x00790302: 0x0177, + 0x00590308: 0x0178, + 0x005A0301: 0x0179, + 0x007A0301: 0x017A, + 0x005A0307: 0x017B, + 0x007A0307: 0x017C, + 0x005A030C: 0x017D, + 0x007A030C: 0x017E, + 0x004F031B: 0x01A0, + 0x006F031B: 0x01A1, + 0x0055031B: 0x01AF, + 0x0075031B: 0x01B0, + 0x0041030C: 0x01CD, + 0x0061030C: 0x01CE, + 0x0049030C: 0x01CF, + 0x0069030C: 0x01D0, + 0x004F030C: 0x01D1, + 0x006F030C: 0x01D2, + 0x0055030C: 0x01D3, + 0x0075030C: 0x01D4, + 0x00DC0304: 0x01D5, + 0x00FC0304: 0x01D6, + 0x00DC0301: 0x01D7, + 0x00FC0301: 0x01D8, + 0x00DC030C: 0x01D9, + 0x00FC030C: 0x01DA, + 0x00DC0300: 0x01DB, + 0x00FC0300: 0x01DC, + 0x00C40304: 0x01DE, + 0x00E40304: 0x01DF, + 0x02260304: 0x01E0, + 0x02270304: 0x01E1, + 0x00C60304: 0x01E2, + 0x00E60304: 0x01E3, + 0x0047030C: 0x01E6, + 0x0067030C: 0x01E7, + 0x004B030C: 0x01E8, + 0x006B030C: 0x01E9, + 0x004F0328: 0x01EA, + 0x006F0328: 0x01EB, + 0x01EA0304: 0x01EC, + 0x01EB0304: 0x01ED, + 0x01B7030C: 0x01EE, + 0x0292030C: 0x01EF, + 0x006A030C: 0x01F0, + 0x00470301: 0x01F4, + 0x00670301: 0x01F5, + 0x004E0300: 0x01F8, + 0x006E0300: 0x01F9, + 0x00C50301: 0x01FA, + 0x00E50301: 0x01FB, + 0x00C60301: 0x01FC, + 0x00E60301: 0x01FD, + 0x00D80301: 0x01FE, + 0x00F80301: 0x01FF, + 0x0041030F: 0x0200, + 0x0061030F: 0x0201, + 0x00410311: 0x0202, + 0x00610311: 0x0203, + 0x0045030F: 0x0204, + 0x0065030F: 0x0205, + 0x00450311: 0x0206, + 0x00650311: 0x0207, + 0x0049030F: 0x0208, + 0x0069030F: 0x0209, + 0x00490311: 0x020A, + 0x00690311: 0x020B, + 0x004F030F: 0x020C, + 0x006F030F: 0x020D, + 0x004F0311: 0x020E, + 0x006F0311: 0x020F, + 0x0052030F: 0x0210, + 0x0072030F: 0x0211, + 0x00520311: 0x0212, + 0x00720311: 0x0213, + 0x0055030F: 0x0214, + 0x0075030F: 0x0215, + 0x00550311: 0x0216, + 0x00750311: 0x0217, + 0x00530326: 0x0218, + 0x00730326: 0x0219, + 0x00540326: 0x021A, + 0x00740326: 0x021B, + 0x0048030C: 0x021E, + 0x0068030C: 0x021F, + 0x00410307: 0x0226, + 0x00610307: 0x0227, + 0x00450327: 0x0228, + 0x00650327: 0x0229, + 0x00D60304: 0x022A, + 0x00F60304: 0x022B, + 0x00D50304: 0x022C, + 0x00F50304: 0x022D, + 0x004F0307: 0x022E, + 0x006F0307: 0x022F, + 0x022E0304: 0x0230, + 0x022F0304: 0x0231, + 0x00590304: 0x0232, + 0x00790304: 0x0233, + 0x00A80301: 0x0385, + 0x03910301: 0x0386, + 0x03950301: 0x0388, + 0x03970301: 0x0389, + 0x03990301: 0x038A, + 0x039F0301: 0x038C, + 0x03A50301: 0x038E, + 0x03A90301: 0x038F, + 0x03CA0301: 0x0390, + 0x03990308: 0x03AA, + 0x03A50308: 0x03AB, + 0x03B10301: 0x03AC, + 0x03B50301: 0x03AD, + 0x03B70301: 0x03AE, + 0x03B90301: 0x03AF, + 0x03CB0301: 0x03B0, + 0x03B90308: 0x03CA, + 0x03C50308: 0x03CB, + 0x03BF0301: 0x03CC, + 0x03C50301: 0x03CD, + 0x03C90301: 0x03CE, + 0x03D20301: 0x03D3, + 0x03D20308: 0x03D4, + 0x04150300: 0x0400, + 0x04150308: 0x0401, + 0x04130301: 0x0403, + 0x04060308: 0x0407, + 0x041A0301: 0x040C, + 0x04180300: 0x040D, + 0x04230306: 0x040E, + 0x04180306: 0x0419, + 0x04380306: 0x0439, + 0x04350300: 0x0450, + 0x04350308: 0x0451, + 0x04330301: 0x0453, + 0x04560308: 0x0457, + 0x043A0301: 0x045C, + 0x04380300: 0x045D, + 0x04430306: 0x045E, + 0x0474030F: 0x0476, + 0x0475030F: 0x0477, + 0x04160306: 0x04C1, + 0x04360306: 0x04C2, + 0x04100306: 0x04D0, + 0x04300306: 0x04D1, + 0x04100308: 0x04D2, + 0x04300308: 0x04D3, + 0x04150306: 0x04D6, + 0x04350306: 0x04D7, + 0x04D80308: 0x04DA, + 0x04D90308: 0x04DB, + 0x04160308: 0x04DC, + 0x04360308: 0x04DD, + 0x04170308: 0x04DE, + 0x04370308: 0x04DF, + 0x04180304: 0x04E2, + 0x04380304: 0x04E3, + 0x04180308: 0x04E4, + 0x04380308: 0x04E5, + 0x041E0308: 0x04E6, + 0x043E0308: 0x04E7, + 0x04E80308: 0x04EA, + 0x04E90308: 0x04EB, + 0x042D0308: 0x04EC, + 0x044D0308: 0x04ED, + 0x04230304: 0x04EE, + 0x04430304: 0x04EF, + 0x04230308: 0x04F0, + 0x04430308: 0x04F1, + 0x0423030B: 0x04F2, + 0x0443030B: 0x04F3, + 0x04270308: 0x04F4, + 0x04470308: 0x04F5, + 0x042B0308: 0x04F8, + 0x044B0308: 0x04F9, + 0x06270653: 0x0622, + 0x06270654: 0x0623, + 0x06480654: 0x0624, + 0x06270655: 0x0625, + 0x064A0654: 0x0626, + 0x06D50654: 0x06C0, + 0x06C10654: 0x06C2, + 0x06D20654: 0x06D3, + 0x0928093C: 0x0929, + 0x0930093C: 0x0931, + 0x0933093C: 0x0934, + 0x09C709BE: 0x09CB, + 0x09C709D7: 0x09CC, + 0x0B470B56: 0x0B48, + 0x0B470B3E: 0x0B4B, + 0x0B470B57: 0x0B4C, + 0x0B920BD7: 0x0B94, + 0x0BC60BBE: 0x0BCA, + 0x0BC70BBE: 0x0BCB, + 0x0BC60BD7: 0x0BCC, + 0x0C460C56: 0x0C48, + 0x0CBF0CD5: 0x0CC0, + 0x0CC60CD5: 0x0CC7, + 0x0CC60CD6: 0x0CC8, + 0x0CC60CC2: 0x0CCA, + 0x0CCA0CD5: 0x0CCB, + 0x0D460D3E: 0x0D4A, + 0x0D470D3E: 0x0D4B, + 0x0D460D57: 0x0D4C, + 0x0DD90DCA: 0x0DDA, + 0x0DD90DCF: 0x0DDC, + 0x0DDC0DCA: 0x0DDD, + 0x0DD90DDF: 0x0DDE, + 0x1025102E: 0x1026, + 0x1B051B35: 0x1B06, + 0x1B071B35: 0x1B08, + 0x1B091B35: 0x1B0A, + 0x1B0B1B35: 0x1B0C, + 0x1B0D1B35: 0x1B0E, + 0x1B111B35: 0x1B12, + 0x1B3A1B35: 0x1B3B, + 0x1B3C1B35: 0x1B3D, + 0x1B3E1B35: 0x1B40, + 0x1B3F1B35: 0x1B41, + 0x1B421B35: 0x1B43, + 0x00410325: 0x1E00, + 0x00610325: 0x1E01, + 0x00420307: 0x1E02, + 0x00620307: 0x1E03, + 0x00420323: 0x1E04, + 0x00620323: 0x1E05, + 0x00420331: 0x1E06, + 0x00620331: 0x1E07, + 0x00C70301: 0x1E08, + 0x00E70301: 0x1E09, + 0x00440307: 0x1E0A, + 0x00640307: 0x1E0B, + 0x00440323: 0x1E0C, + 0x00640323: 0x1E0D, + 0x00440331: 0x1E0E, + 0x00640331: 0x1E0F, + 0x00440327: 0x1E10, + 0x00640327: 0x1E11, + 0x0044032D: 0x1E12, + 0x0064032D: 0x1E13, + 0x01120300: 0x1E14, + 0x01130300: 0x1E15, + 0x01120301: 0x1E16, + 0x01130301: 0x1E17, + 0x0045032D: 0x1E18, + 0x0065032D: 0x1E19, + 0x00450330: 0x1E1A, + 0x00650330: 0x1E1B, + 0x02280306: 0x1E1C, + 0x02290306: 0x1E1D, + 0x00460307: 0x1E1E, + 0x00660307: 0x1E1F, + 0x00470304: 0x1E20, + 0x00670304: 0x1E21, + 0x00480307: 0x1E22, + 0x00680307: 0x1E23, + 0x00480323: 0x1E24, + 0x00680323: 0x1E25, + 0x00480308: 0x1E26, + 0x00680308: 0x1E27, + 0x00480327: 0x1E28, + 0x00680327: 0x1E29, + 0x0048032E: 0x1E2A, + 0x0068032E: 0x1E2B, + 0x00490330: 0x1E2C, + 0x00690330: 0x1E2D, + 0x00CF0301: 0x1E2E, + 0x00EF0301: 0x1E2F, + 0x004B0301: 0x1E30, + 0x006B0301: 0x1E31, + 0x004B0323: 0x1E32, + 0x006B0323: 0x1E33, + 0x004B0331: 0x1E34, + 0x006B0331: 0x1E35, + 0x004C0323: 0x1E36, + 0x006C0323: 0x1E37, + 0x1E360304: 0x1E38, + 0x1E370304: 0x1E39, + 0x004C0331: 0x1E3A, + 0x006C0331: 0x1E3B, + 0x004C032D: 0x1E3C, + 0x006C032D: 0x1E3D, + 0x004D0301: 0x1E3E, + 0x006D0301: 0x1E3F, + 0x004D0307: 0x1E40, + 0x006D0307: 0x1E41, + 0x004D0323: 0x1E42, + 0x006D0323: 0x1E43, + 0x004E0307: 0x1E44, + 0x006E0307: 0x1E45, + 0x004E0323: 0x1E46, + 0x006E0323: 0x1E47, + 0x004E0331: 0x1E48, + 0x006E0331: 0x1E49, + 0x004E032D: 0x1E4A, + 0x006E032D: 0x1E4B, + 0x00D50301: 0x1E4C, + 0x00F50301: 0x1E4D, + 0x00D50308: 0x1E4E, + 0x00F50308: 0x1E4F, + 0x014C0300: 0x1E50, + 0x014D0300: 0x1E51, + 0x014C0301: 0x1E52, + 0x014D0301: 0x1E53, + 0x00500301: 0x1E54, + 0x00700301: 0x1E55, + 0x00500307: 0x1E56, + 0x00700307: 0x1E57, + 0x00520307: 0x1E58, + 0x00720307: 0x1E59, + 0x00520323: 0x1E5A, + 0x00720323: 0x1E5B, + 0x1E5A0304: 0x1E5C, + 0x1E5B0304: 0x1E5D, + 0x00520331: 0x1E5E, + 0x00720331: 0x1E5F, + 0x00530307: 0x1E60, + 0x00730307: 0x1E61, + 0x00530323: 0x1E62, + 0x00730323: 0x1E63, + 0x015A0307: 0x1E64, + 0x015B0307: 0x1E65, + 0x01600307: 0x1E66, + 0x01610307: 0x1E67, + 0x1E620307: 0x1E68, + 0x1E630307: 0x1E69, + 0x00540307: 0x1E6A, + 0x00740307: 0x1E6B, + 0x00540323: 0x1E6C, + 0x00740323: 0x1E6D, + 0x00540331: 0x1E6E, + 0x00740331: 0x1E6F, + 0x0054032D: 0x1E70, + 0x0074032D: 0x1E71, + 0x00550324: 0x1E72, + 0x00750324: 0x1E73, + 0x00550330: 0x1E74, + 0x00750330: 0x1E75, + 0x0055032D: 0x1E76, + 0x0075032D: 0x1E77, + 0x01680301: 0x1E78, + 0x01690301: 0x1E79, + 0x016A0308: 0x1E7A, + 0x016B0308: 0x1E7B, + 0x00560303: 0x1E7C, + 0x00760303: 0x1E7D, + 0x00560323: 0x1E7E, + 0x00760323: 0x1E7F, + 0x00570300: 0x1E80, + 0x00770300: 0x1E81, + 0x00570301: 0x1E82, + 0x00770301: 0x1E83, + 0x00570308: 0x1E84, + 0x00770308: 0x1E85, + 0x00570307: 0x1E86, + 0x00770307: 0x1E87, + 0x00570323: 0x1E88, + 0x00770323: 0x1E89, + 0x00580307: 0x1E8A, + 0x00780307: 0x1E8B, + 0x00580308: 0x1E8C, + 0x00780308: 0x1E8D, + 0x00590307: 0x1E8E, + 0x00790307: 0x1E8F, + 0x005A0302: 0x1E90, + 0x007A0302: 0x1E91, + 0x005A0323: 0x1E92, + 0x007A0323: 0x1E93, + 0x005A0331: 0x1E94, + 0x007A0331: 0x1E95, + 0x00680331: 0x1E96, + 0x00740308: 0x1E97, + 0x0077030A: 0x1E98, + 0x0079030A: 0x1E99, + 0x017F0307: 0x1E9B, + 0x00410323: 0x1EA0, + 0x00610323: 0x1EA1, + 0x00410309: 0x1EA2, + 0x00610309: 0x1EA3, + 0x00C20301: 0x1EA4, + 0x00E20301: 0x1EA5, + 0x00C20300: 0x1EA6, + 0x00E20300: 0x1EA7, + 0x00C20309: 0x1EA8, + 0x00E20309: 0x1EA9, + 0x00C20303: 0x1EAA, + 0x00E20303: 0x1EAB, + 0x1EA00302: 0x1EAC, + 0x1EA10302: 0x1EAD, + 0x01020301: 0x1EAE, + 0x01030301: 0x1EAF, + 0x01020300: 0x1EB0, + 0x01030300: 0x1EB1, + 0x01020309: 0x1EB2, + 0x01030309: 0x1EB3, + 0x01020303: 0x1EB4, + 0x01030303: 0x1EB5, + 0x1EA00306: 0x1EB6, + 0x1EA10306: 0x1EB7, + 0x00450323: 0x1EB8, + 0x00650323: 0x1EB9, + 0x00450309: 0x1EBA, + 0x00650309: 0x1EBB, + 0x00450303: 0x1EBC, + 0x00650303: 0x1EBD, + 0x00CA0301: 0x1EBE, + 0x00EA0301: 0x1EBF, + 0x00CA0300: 0x1EC0, + 0x00EA0300: 0x1EC1, + 0x00CA0309: 0x1EC2, + 0x00EA0309: 0x1EC3, + 0x00CA0303: 0x1EC4, + 0x00EA0303: 0x1EC5, + 0x1EB80302: 0x1EC6, + 0x1EB90302: 0x1EC7, + 0x00490309: 0x1EC8, + 0x00690309: 0x1EC9, + 0x00490323: 0x1ECA, + 0x00690323: 0x1ECB, + 0x004F0323: 0x1ECC, + 0x006F0323: 0x1ECD, + 0x004F0309: 0x1ECE, + 0x006F0309: 0x1ECF, + 0x00D40301: 0x1ED0, + 0x00F40301: 0x1ED1, + 0x00D40300: 0x1ED2, + 0x00F40300: 0x1ED3, + 0x00D40309: 0x1ED4, + 0x00F40309: 0x1ED5, + 0x00D40303: 0x1ED6, + 0x00F40303: 0x1ED7, + 0x1ECC0302: 0x1ED8, + 0x1ECD0302: 0x1ED9, + 0x01A00301: 0x1EDA, + 0x01A10301: 0x1EDB, + 0x01A00300: 0x1EDC, + 0x01A10300: 0x1EDD, + 0x01A00309: 0x1EDE, + 0x01A10309: 0x1EDF, + 0x01A00303: 0x1EE0, + 0x01A10303: 0x1EE1, + 0x01A00323: 0x1EE2, + 0x01A10323: 0x1EE3, + 0x00550323: 0x1EE4, + 0x00750323: 0x1EE5, + 0x00550309: 0x1EE6, + 0x00750309: 0x1EE7, + 0x01AF0301: 0x1EE8, + 0x01B00301: 0x1EE9, + 0x01AF0300: 0x1EEA, + 0x01B00300: 0x1EEB, + 0x01AF0309: 0x1EEC, + 0x01B00309: 0x1EED, + 0x01AF0303: 0x1EEE, + 0x01B00303: 0x1EEF, + 0x01AF0323: 0x1EF0, + 0x01B00323: 0x1EF1, + 0x00590300: 0x1EF2, + 0x00790300: 0x1EF3, + 0x00590323: 0x1EF4, + 0x00790323: 0x1EF5, + 0x00590309: 0x1EF6, + 0x00790309: 0x1EF7, + 0x00590303: 0x1EF8, + 0x00790303: 0x1EF9, + 0x03B10313: 0x1F00, + 0x03B10314: 0x1F01, + 0x1F000300: 0x1F02, + 0x1F010300: 0x1F03, + 0x1F000301: 0x1F04, + 0x1F010301: 0x1F05, + 0x1F000342: 0x1F06, + 0x1F010342: 0x1F07, + 0x03910313: 0x1F08, + 0x03910314: 0x1F09, + 0x1F080300: 0x1F0A, + 0x1F090300: 0x1F0B, + 0x1F080301: 0x1F0C, + 0x1F090301: 0x1F0D, + 0x1F080342: 0x1F0E, + 0x1F090342: 0x1F0F, + 0x03B50313: 0x1F10, + 0x03B50314: 0x1F11, + 0x1F100300: 0x1F12, + 0x1F110300: 0x1F13, + 0x1F100301: 0x1F14, + 0x1F110301: 0x1F15, + 0x03950313: 0x1F18, + 0x03950314: 0x1F19, + 0x1F180300: 0x1F1A, + 0x1F190300: 0x1F1B, + 0x1F180301: 0x1F1C, + 0x1F190301: 0x1F1D, + 0x03B70313: 0x1F20, + 0x03B70314: 0x1F21, + 0x1F200300: 0x1F22, + 0x1F210300: 0x1F23, + 0x1F200301: 0x1F24, + 0x1F210301: 0x1F25, + 0x1F200342: 0x1F26, + 0x1F210342: 0x1F27, + 0x03970313: 0x1F28, + 0x03970314: 0x1F29, + 0x1F280300: 0x1F2A, + 0x1F290300: 0x1F2B, + 0x1F280301: 0x1F2C, + 0x1F290301: 0x1F2D, + 0x1F280342: 0x1F2E, + 0x1F290342: 0x1F2F, + 0x03B90313: 0x1F30, + 0x03B90314: 0x1F31, + 0x1F300300: 0x1F32, + 0x1F310300: 0x1F33, + 0x1F300301: 0x1F34, + 0x1F310301: 0x1F35, + 0x1F300342: 0x1F36, + 0x1F310342: 0x1F37, + 0x03990313: 0x1F38, + 0x03990314: 0x1F39, + 0x1F380300: 0x1F3A, + 0x1F390300: 0x1F3B, + 0x1F380301: 0x1F3C, + 0x1F390301: 0x1F3D, + 0x1F380342: 0x1F3E, + 0x1F390342: 0x1F3F, + 0x03BF0313: 0x1F40, + 0x03BF0314: 0x1F41, + 0x1F400300: 0x1F42, + 0x1F410300: 0x1F43, + 0x1F400301: 0x1F44, + 0x1F410301: 0x1F45, + 0x039F0313: 0x1F48, + 0x039F0314: 0x1F49, + 0x1F480300: 0x1F4A, + 0x1F490300: 0x1F4B, + 0x1F480301: 0x1F4C, + 0x1F490301: 0x1F4D, + 0x03C50313: 0x1F50, + 0x03C50314: 0x1F51, + 0x1F500300: 0x1F52, + 0x1F510300: 0x1F53, + 0x1F500301: 0x1F54, + 0x1F510301: 0x1F55, + 0x1F500342: 0x1F56, + 0x1F510342: 0x1F57, + 0x03A50314: 0x1F59, + 0x1F590300: 0x1F5B, + 0x1F590301: 0x1F5D, + 0x1F590342: 0x1F5F, + 0x03C90313: 0x1F60, + 0x03C90314: 0x1F61, + 0x1F600300: 0x1F62, + 0x1F610300: 0x1F63, + 0x1F600301: 0x1F64, + 0x1F610301: 0x1F65, + 0x1F600342: 0x1F66, + 0x1F610342: 0x1F67, + 0x03A90313: 0x1F68, + 0x03A90314: 0x1F69, + 0x1F680300: 0x1F6A, + 0x1F690300: 0x1F6B, + 0x1F680301: 0x1F6C, + 0x1F690301: 0x1F6D, + 0x1F680342: 0x1F6E, + 0x1F690342: 0x1F6F, + 0x03B10300: 0x1F70, + 0x03B50300: 0x1F72, + 0x03B70300: 0x1F74, + 0x03B90300: 0x1F76, + 0x03BF0300: 0x1F78, + 0x03C50300: 0x1F7A, + 0x03C90300: 0x1F7C, + 0x1F000345: 0x1F80, + 0x1F010345: 0x1F81, + 0x1F020345: 0x1F82, + 0x1F030345: 0x1F83, + 0x1F040345: 0x1F84, + 0x1F050345: 0x1F85, + 0x1F060345: 0x1F86, + 0x1F070345: 0x1F87, + 0x1F080345: 0x1F88, + 0x1F090345: 0x1F89, + 0x1F0A0345: 0x1F8A, + 0x1F0B0345: 0x1F8B, + 0x1F0C0345: 0x1F8C, + 0x1F0D0345: 0x1F8D, + 0x1F0E0345: 0x1F8E, + 0x1F0F0345: 0x1F8F, + 0x1F200345: 0x1F90, + 0x1F210345: 0x1F91, + 0x1F220345: 0x1F92, + 0x1F230345: 0x1F93, + 0x1F240345: 0x1F94, + 0x1F250345: 0x1F95, + 0x1F260345: 0x1F96, + 0x1F270345: 0x1F97, + 0x1F280345: 0x1F98, + 0x1F290345: 0x1F99, + 0x1F2A0345: 0x1F9A, + 0x1F2B0345: 0x1F9B, + 0x1F2C0345: 0x1F9C, + 0x1F2D0345: 0x1F9D, + 0x1F2E0345: 0x1F9E, + 0x1F2F0345: 0x1F9F, + 0x1F600345: 0x1FA0, + 0x1F610345: 0x1FA1, + 0x1F620345: 0x1FA2, + 0x1F630345: 0x1FA3, + 0x1F640345: 0x1FA4, + 0x1F650345: 0x1FA5, + 0x1F660345: 0x1FA6, + 0x1F670345: 0x1FA7, + 0x1F680345: 0x1FA8, + 0x1F690345: 0x1FA9, + 0x1F6A0345: 0x1FAA, + 0x1F6B0345: 0x1FAB, + 0x1F6C0345: 0x1FAC, + 0x1F6D0345: 0x1FAD, + 0x1F6E0345: 0x1FAE, + 0x1F6F0345: 0x1FAF, + 0x03B10306: 0x1FB0, + 0x03B10304: 0x1FB1, + 0x1F700345: 0x1FB2, + 0x03B10345: 0x1FB3, + 0x03AC0345: 0x1FB4, + 0x03B10342: 0x1FB6, + 0x1FB60345: 0x1FB7, + 0x03910306: 0x1FB8, + 0x03910304: 0x1FB9, + 0x03910300: 0x1FBA, + 0x03910345: 0x1FBC, + 0x00A80342: 0x1FC1, + 0x1F740345: 0x1FC2, + 0x03B70345: 0x1FC3, + 0x03AE0345: 0x1FC4, + 0x03B70342: 0x1FC6, + 0x1FC60345: 0x1FC7, + 0x03950300: 0x1FC8, + 0x03970300: 0x1FCA, + 0x03970345: 0x1FCC, + 0x1FBF0300: 0x1FCD, + 0x1FBF0301: 0x1FCE, + 0x1FBF0342: 0x1FCF, + 0x03B90306: 0x1FD0, + 0x03B90304: 0x1FD1, + 0x03CA0300: 0x1FD2, + 0x03B90342: 0x1FD6, + 0x03CA0342: 0x1FD7, + 0x03990306: 0x1FD8, + 0x03990304: 0x1FD9, + 0x03990300: 0x1FDA, + 0x1FFE0300: 0x1FDD, + 0x1FFE0301: 0x1FDE, + 0x1FFE0342: 0x1FDF, + 0x03C50306: 0x1FE0, + 0x03C50304: 0x1FE1, + 0x03CB0300: 0x1FE2, + 0x03C10313: 0x1FE4, + 0x03C10314: 0x1FE5, + 0x03C50342: 0x1FE6, + 0x03CB0342: 0x1FE7, + 0x03A50306: 0x1FE8, + 0x03A50304: 0x1FE9, + 0x03A50300: 0x1FEA, + 0x03A10314: 0x1FEC, + 0x00A80300: 0x1FED, + 0x1F7C0345: 0x1FF2, + 0x03C90345: 0x1FF3, + 0x03CE0345: 0x1FF4, + 0x03C90342: 0x1FF6, + 0x1FF60345: 0x1FF7, + 0x039F0300: 0x1FF8, + 0x03A90300: 0x1FFA, + 0x03A90345: 0x1FFC, + 0x21900338: 0x219A, + 0x21920338: 0x219B, + 0x21940338: 0x21AE, + 0x21D00338: 0x21CD, + 0x21D40338: 0x21CE, + 0x21D20338: 0x21CF, + 0x22030338: 0x2204, + 0x22080338: 0x2209, + 0x220B0338: 0x220C, + 0x22230338: 0x2224, + 0x22250338: 0x2226, + 0x223C0338: 0x2241, + 0x22430338: 0x2244, + 0x22450338: 0x2247, + 0x22480338: 0x2249, + 0x003D0338: 0x2260, + 0x22610338: 0x2262, + 0x224D0338: 0x226D, + 0x003C0338: 0x226E, + 0x003E0338: 0x226F, + 0x22640338: 0x2270, + 0x22650338: 0x2271, + 0x22720338: 0x2274, + 0x22730338: 0x2275, + 0x22760338: 0x2278, + 0x22770338: 0x2279, + 0x227A0338: 0x2280, + 0x227B0338: 0x2281, + 0x22820338: 0x2284, + 0x22830338: 0x2285, + 0x22860338: 0x2288, + 0x22870338: 0x2289, + 0x22A20338: 0x22AC, + 0x22A80338: 0x22AD, + 0x22A90338: 0x22AE, + 0x22AB0338: 0x22AF, + 0x227C0338: 0x22E0, + 0x227D0338: 0x22E1, + 0x22910338: 0x22E2, + 0x22920338: 0x22E3, + 0x22B20338: 0x22EA, + 0x22B30338: 0x22EB, + 0x22B40338: 0x22EC, + 0x22B50338: 0x22ED, + 0x304B3099: 0x304C, + 0x304D3099: 0x304E, + 0x304F3099: 0x3050, + 0x30513099: 0x3052, + 0x30533099: 0x3054, + 0x30553099: 0x3056, + 0x30573099: 0x3058, + 0x30593099: 0x305A, + 0x305B3099: 0x305C, + 0x305D3099: 0x305E, + 0x305F3099: 0x3060, + 0x30613099: 0x3062, + 0x30643099: 0x3065, + 0x30663099: 0x3067, + 0x30683099: 0x3069, + 0x306F3099: 0x3070, + 0x306F309A: 0x3071, + 0x30723099: 0x3073, + 0x3072309A: 0x3074, + 0x30753099: 0x3076, + 0x3075309A: 0x3077, + 0x30783099: 0x3079, + 0x3078309A: 0x307A, + 0x307B3099: 0x307C, + 0x307B309A: 0x307D, + 0x30463099: 0x3094, + 0x309D3099: 0x309E, + 0x30AB3099: 0x30AC, + 0x30AD3099: 0x30AE, + 0x30AF3099: 0x30B0, + 0x30B13099: 0x30B2, + 0x30B33099: 0x30B4, + 0x30B53099: 0x30B6, + 0x30B73099: 0x30B8, + 0x30B93099: 0x30BA, + 0x30BB3099: 0x30BC, + 0x30BD3099: 0x30BE, + 0x30BF3099: 0x30C0, + 0x30C13099: 0x30C2, + 0x30C43099: 0x30C5, + 0x30C63099: 0x30C7, + 0x30C83099: 0x30C9, + 0x30CF3099: 0x30D0, + 0x30CF309A: 0x30D1, + 0x30D23099: 0x30D3, + 0x30D2309A: 0x30D4, + 0x30D53099: 0x30D6, + 0x30D5309A: 0x30D7, + 0x30D83099: 0x30D9, + 0x30D8309A: 0x30DA, + 0x30DB3099: 0x30DC, + 0x30DB309A: 0x30DD, + 0x30A63099: 0x30F4, + 0x30EF3099: 0x30F7, + 0x30F03099: 0x30F8, + 0x30F13099: 0x30F9, + 0x30F23099: 0x30FA, + 0x30FD3099: 0x30FE, + 0x109910BA: 0x1109A, + 0x109B10BA: 0x1109C, + 0x10A510BA: 0x110AB, + 0x11311127: 0x1112E, + 0x11321127: 0x1112F, + 0x1347133E: 0x1134B, + 0x13471357: 0x1134C, + 0x14B914BA: 0x114BB, + 0x14B914B0: 0x114BC, + 0x14B914BD: 0x114BE, + 0x15B815AF: 0x115BA, + 0x15B915AF: 0x115BB, +} + +// Total size of tables: 53KB (53848 bytes) diff --git a/vendor/golang.org/x/text/unicode/norm/transform.go b/vendor/golang.org/x/text/unicode/norm/transform.go new file mode 100644 index 0000000000..8589067cde --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/transform.go @@ -0,0 +1,88 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package norm + +import ( + "unicode/utf8" + + "golang.org/x/text/transform" +) + +// Reset implements the Reset method of the transform.Transformer interface. +func (Form) Reset() {} + +// Transform implements the Transform method of the transform.Transformer +// interface. It may need to write segments of up to MaxSegmentSize at once. +// Users should either catch ErrShortDst and allow dst to grow or have dst be at +// least of size MaxTransformChunkSize to be guaranteed of progress. +func (f Form) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + n := 0 + // Cap the maximum number of src bytes to check. + b := src + eof := atEOF + if ns := len(dst); ns < len(b) { + err = transform.ErrShortDst + eof = false + b = b[:ns] + } + i, ok := formTable[f].quickSpan(inputBytes(b), n, len(b), eof) + n += copy(dst[n:], b[n:i]) + if !ok { + nDst, nSrc, err = f.transform(dst[n:], src[n:], atEOF) + return nDst + n, nSrc + n, err + } + if n < len(src) && !atEOF { + err = transform.ErrShortSrc + } + return n, n, err +} + +func flushTransform(rb *reorderBuffer) bool { + // Write out (must fully fit in dst, or else it is a ErrShortDst). + if len(rb.out) < rb.nrune*utf8.UTFMax { + return false + } + rb.out = rb.out[rb.flushCopy(rb.out):] + return true +} + +var errs = []error{nil, transform.ErrShortDst, transform.ErrShortSrc} + +// transform implements the transform.Transformer interface. It is only called +// when quickSpan does not pass for a given string. +func (f Form) transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + // TODO: get rid of reorderBuffer. See CL 23460044. + rb := reorderBuffer{} + rb.init(f, src) + for { + // Load segment into reorder buffer. + rb.setFlusher(dst[nDst:], flushTransform) + end := decomposeSegment(&rb, nSrc, atEOF) + if end < 0 { + return nDst, nSrc, errs[-end] + } + nDst = len(dst) - len(rb.out) + nSrc = end + + // Next quickSpan. + end = rb.nsrc + eof := atEOF + if n := nSrc + len(dst) - nDst; n < end { + err = transform.ErrShortDst + end = n + eof = false + } + end, ok := rb.f.quickSpan(rb.src, nSrc, end, eof) + n := copy(dst[nDst:], rb.src.bytes[nSrc:end]) + nSrc += n + nDst += n + if ok { + if n < rb.nsrc && !atEOF { + err = transform.ErrShortSrc + } + return nDst, nSrc, err + } + } +} diff --git a/vendor/golang.org/x/text/unicode/norm/transform_test.go b/vendor/golang.org/x/text/unicode/norm/transform_test.go new file mode 100644 index 0000000000..987d680ed1 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/transform_test.go @@ -0,0 +1,101 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package norm + +import ( + "fmt" + "testing" + + "golang.org/x/text/transform" +) + +func TestTransform(t *testing.T) { + tests := []struct { + f Form + in, out string + eof bool + dstSize int + err error + }{ + {NFC, "ab", "ab", true, 2, nil}, + {NFC, "qx", "qx", true, 2, nil}, + {NFD, "qx", "qx", true, 2, nil}, + {NFC, "", "", true, 1, nil}, + {NFD, "", "", true, 1, nil}, + {NFC, "", "", false, 1, nil}, + {NFD, "", "", false, 1, nil}, + + // Normalized segment does not fit in destination. + {NFD, "ö", "", true, 1, transform.ErrShortDst}, + {NFD, "ö", "", true, 2, transform.ErrShortDst}, + + // As an artifact of the algorithm, only full segments are written. + // This is not strictly required, and some bytes could be written. + // In practice, for Transform to not block, the destination buffer + // should be at least MaxSegmentSize to work anyway and these edge + // conditions will be relatively rare. + {NFC, "ab", "", true, 1, transform.ErrShortDst}, + // This is even true for inert runes. + {NFC, "qx", "", true, 1, transform.ErrShortDst}, + {NFC, "a\u0300abc", "\u00e0a", true, 4, transform.ErrShortDst}, + + // We cannot write a segment if succesive runes could still change the result. + {NFD, "ö", "", false, 3, transform.ErrShortSrc}, + {NFC, "a\u0300", "", false, 4, transform.ErrShortSrc}, + {NFD, "a\u0300", "", false, 4, transform.ErrShortSrc}, + {NFC, "ö", "", false, 3, transform.ErrShortSrc}, + + {NFC, "a\u0300", "", true, 1, transform.ErrShortDst}, + // Theoretically could fit, but won't due to simplified checks. + {NFC, "a\u0300", "", true, 2, transform.ErrShortDst}, + {NFC, "a\u0300", "", true, 3, transform.ErrShortDst}, + {NFC, "a\u0300", "\u00e0", true, 4, nil}, + + {NFD, "öa\u0300", "o\u0308", false, 8, transform.ErrShortSrc}, + {NFD, "öa\u0300ö", "o\u0308a\u0300", true, 8, transform.ErrShortDst}, + {NFD, "öa\u0300ö", "o\u0308a\u0300", false, 12, transform.ErrShortSrc}, + + // Illegal input is copied verbatim. + {NFD, "\xbd\xb2=\xbc ", "\xbd\xb2=\xbc ", true, 8, nil}, + } + b := make([]byte, 100) + for i, tt := range tests { + nDst, _, err := tt.f.Transform(b[:tt.dstSize], []byte(tt.in), tt.eof) + out := string(b[:nDst]) + if out != tt.out || err != tt.err { + t.Errorf("%d: was %+q (%v); want %+q (%v)", i, out, err, tt.out, tt.err) + } + if want := tt.f.String(tt.in)[:nDst]; want != out { + t.Errorf("%d: incorect normalization: was %+q; want %+q", i, out, want) + } + } +} + +var transBufSizes = []int{ + MaxTransformChunkSize, + 3 * MaxTransformChunkSize / 2, + 2 * MaxTransformChunkSize, + 3 * MaxTransformChunkSize, + 100 * MaxTransformChunkSize, +} + +func doTransNorm(f Form, buf []byte, b []byte) []byte { + acc := []byte{} + for p := 0; p < len(b); { + nd, ns, _ := f.Transform(buf[:], b[p:], true) + p += ns + acc = append(acc, buf[:nd]...) + } + return acc +} + +func TestTransformNorm(t *testing.T) { + for _, sz := range transBufSizes { + buf := make([]byte, sz) + runNormTests(t, fmt.Sprintf("Transform:%d", sz), func(f Form, out []byte, s string) []byte { + return doTransNorm(f, buf, append(out, s...)) + }) + } +} diff --git a/vendor/golang.org/x/text/unicode/norm/trie.go b/vendor/golang.org/x/text/unicode/norm/trie.go new file mode 100644 index 0000000000..423386bf43 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/trie.go @@ -0,0 +1,54 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package norm + +type valueRange struct { + value uint16 // header: value:stride + lo, hi byte // header: lo:n +} + +type sparseBlocks struct { + values []valueRange + offset []uint16 +} + +var nfcSparse = sparseBlocks{ + values: nfcSparseValues[:], + offset: nfcSparseOffset[:], +} + +var nfkcSparse = sparseBlocks{ + values: nfkcSparseValues[:], + offset: nfkcSparseOffset[:], +} + +var ( + nfcData = newNfcTrie(0) + nfkcData = newNfkcTrie(0) +) + +// lookupValue determines the type of block n and looks up the value for b. +// For n < t.cutoff, the block is a simple lookup table. Otherwise, the block +// is a list of ranges with an accompanying value. Given a matching range r, +// the value for b is by r.value + (b - r.lo) * stride. +func (t *sparseBlocks) lookup(n uint32, b byte) uint16 { + offset := t.offset[n] + header := t.values[offset] + lo := offset + 1 + hi := lo + uint16(header.lo) + for lo < hi { + m := lo + (hi-lo)/2 + r := t.values[m] + if r.lo <= b && b <= r.hi { + return r.value + uint16(b-r.lo)*header.value + } + if b < r.lo { + hi = m + } else { + lo = m + 1 + } + } + return 0 +} diff --git a/vendor/golang.org/x/text/unicode/norm/triegen.go b/vendor/golang.org/x/text/unicode/norm/triegen.go new file mode 100644 index 0000000000..45d711900d --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/triegen.go @@ -0,0 +1,117 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +// Trie table generator. +// Used by make*tables tools to generate a go file with trie data structures +// for mapping UTF-8 to a 16-bit value. All but the last byte in a UTF-8 byte +// sequence are used to lookup offsets in the index table to be used for the +// next byte. The last byte is used to index into a table with 16-bit values. + +package main + +import ( + "fmt" + "io" +) + +const maxSparseEntries = 16 + +type normCompacter struct { + sparseBlocks [][]uint64 + sparseOffset []uint16 + sparseCount int + name string +} + +func mostFrequentStride(a []uint64) int { + counts := make(map[int]int) + var v int + for _, x := range a { + if stride := int(x) - v; v != 0 && stride >= 0 { + counts[stride]++ + } + v = int(x) + } + var maxs, maxc int + for stride, cnt := range counts { + if cnt > maxc || (cnt == maxc && stride < maxs) { + maxs, maxc = stride, cnt + } + } + return maxs +} + +func countSparseEntries(a []uint64) int { + stride := mostFrequentStride(a) + var v, count int + for _, tv := range a { + if int(tv)-v != stride { + if tv != 0 { + count++ + } + } + v = int(tv) + } + return count +} + +func (c *normCompacter) Size(v []uint64) (sz int, ok bool) { + if n := countSparseEntries(v); n <= maxSparseEntries { + return (n+1)*4 + 2, true + } + return 0, false +} + +func (c *normCompacter) Store(v []uint64) uint32 { + h := uint32(len(c.sparseOffset)) + c.sparseBlocks = append(c.sparseBlocks, v) + c.sparseOffset = append(c.sparseOffset, uint16(c.sparseCount)) + c.sparseCount += countSparseEntries(v) + 1 + return h +} + +func (c *normCompacter) Handler() string { + return c.name + "Sparse.lookup" +} + +func (c *normCompacter) Print(w io.Writer) (retErr error) { + p := func(f string, x ...interface{}) { + if _, err := fmt.Fprintf(w, f, x...); retErr == nil && err != nil { + retErr = err + } + } + + ls := len(c.sparseBlocks) + p("// %sSparseOffset: %d entries, %d bytes\n", c.name, ls, ls*2) + p("var %sSparseOffset = %#v\n\n", c.name, c.sparseOffset) + + ns := c.sparseCount + p("// %sSparseValues: %d entries, %d bytes\n", c.name, ns, ns*4) + p("var %sSparseValues = [%d]valueRange {", c.name, ns) + for i, b := range c.sparseBlocks { + p("\n// Block %#x, offset %#x", i, c.sparseOffset[i]) + var v int + stride := mostFrequentStride(b) + n := countSparseEntries(b) + p("\n{value:%#04x,lo:%#02x},", stride, uint8(n)) + for i, nv := range b { + if int(nv)-v != stride { + if v != 0 { + p(",hi:%#02x},", 0x80+i-1) + } + if nv != 0 { + p("\n{value:%#04x,lo:%#02x", nv, 0x80+i) + } + } + v = int(nv) + } + if v != 0 { + p(",hi:%#02x},", 0x80+len(b)-1) + } + } + p("\n}\n\n") + return +} diff --git a/vendor/golang.org/x/text/unicode/norm/ucd_test.go b/vendor/golang.org/x/text/unicode/norm/ucd_test.go new file mode 100644 index 0000000000..29205a6aa8 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/ucd_test.go @@ -0,0 +1,275 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package norm + +import ( + "bufio" + "bytes" + "fmt" + "regexp" + "runtime" + "strconv" + "strings" + "sync" + "testing" + "time" + "unicode/utf8" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/testtext" +) + +var once sync.Once + +func skipShort(t *testing.T) { + testtext.SkipIfNotLong(t) + + once.Do(func() { loadTestData(t) }) +} + +// This regression test runs the test set in NormalizationTest.txt +// (taken from http://www.unicode.org/Public/<unicode.Version>/ucd/). +// +// NormalizationTest.txt has form: +// @Part0 # Specific cases +// # +// 1E0A;1E0A;0044 0307;1E0A;0044 0307; # (Ḋ; Ḋ; D◌̇; Ḋ; D◌̇; ) LATIN CAPITAL LETTER D WITH DOT ABOVE +// 1E0C;1E0C;0044 0323;1E0C;0044 0323; # (Ḍ; Ḍ; D◌̣; Ḍ; D◌̣; ) LATIN CAPITAL LETTER D WITH DOT BELOW +// +// Each test has 5 columns (c1, c2, c3, c4, c5), where +// (c1, c2, c3, c4, c5) == (c1, NFC(c1), NFD(c1), NFKC(c1), NFKD(c1)) +// +// CONFORMANCE: +// 1. The following invariants must be true for all conformant implementations +// +// NFC +// c2 == NFC(c1) == NFC(c2) == NFC(c3) +// c4 == NFC(c4) == NFC(c5) +// +// NFD +// c3 == NFD(c1) == NFD(c2) == NFD(c3) +// c5 == NFD(c4) == NFD(c5) +// +// NFKC +// c4 == NFKC(c1) == NFKC(c2) == NFKC(c3) == NFKC(c4) == NFKC(c5) +// +// NFKD +// c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4) == NFKD(c5) +// +// 2. For every code point X assigned in this version of Unicode that is not +// specifically listed in Part 1, the following invariants must be true +// for all conformant implementations: +// +// X == NFC(X) == NFD(X) == NFKC(X) == NFKD(X) +// + +// Column types. +const ( + cRaw = iota + cNFC + cNFD + cNFKC + cNFKD + cMaxColumns +) + +// Holds data from NormalizationTest.txt +var part []Part + +type Part struct { + name string + number int + tests []Test +} + +type Test struct { + name string + partnr int + number int + r rune // used for character by character test + cols [cMaxColumns]string // Each has 5 entries, see below. +} + +func (t Test) Name() string { + if t.number < 0 { + return part[t.partnr].name + } + return fmt.Sprintf("%s:%d", part[t.partnr].name, t.number) +} + +var partRe = regexp.MustCompile(`@Part(\d) # (.*)$`) +var testRe = regexp.MustCompile(`^` + strings.Repeat(`([\dA-F ]+);`, 5) + ` # (.*)$`) + +var counter int + +// Load the data form NormalizationTest.txt +func loadTestData(t *testing.T) { + f := gen.OpenUCDFile("NormalizationTest.txt") + defer f.Close() + scanner := bufio.NewScanner(f) + for scanner.Scan() { + line := scanner.Text() + if len(line) == 0 || line[0] == '#' { + continue + } + m := partRe.FindStringSubmatch(line) + if m != nil { + if len(m) < 3 { + t.Fatal("Failed to parse Part: ", line) + } + i, err := strconv.Atoi(m[1]) + if err != nil { + t.Fatal(err) + } + name := m[2] + part = append(part, Part{name: name[:len(name)-1], number: i}) + continue + } + m = testRe.FindStringSubmatch(line) + if m == nil || len(m) < 7 { + t.Fatalf(`Failed to parse: "%s" result: %#v`, line, m) + } + test := Test{name: m[6], partnr: len(part) - 1, number: counter} + counter++ + for j := 1; j < len(m)-1; j++ { + for _, split := range strings.Split(m[j], " ") { + r, err := strconv.ParseUint(split, 16, 64) + if err != nil { + t.Fatal(err) + } + if test.r == 0 { + // save for CharacterByCharacterTests + test.r = rune(r) + } + var buf [utf8.UTFMax]byte + sz := utf8.EncodeRune(buf[:], rune(r)) + test.cols[j-1] += string(buf[:sz]) + } + } + part := &part[len(part)-1] + part.tests = append(part.tests, test) + } + if scanner.Err() != nil { + t.Fatal(scanner.Err()) + } +} + +func cmpResult(t *testing.T, tc *Test, name string, f Form, gold, test, result string) { + if gold != result { + t.Errorf("%s:%s: %s(%+q)=%+q; want %+q: %s", + tc.Name(), name, fstr[f], test, result, gold, tc.name) + } +} + +func cmpIsNormal(t *testing.T, tc *Test, name string, f Form, test string, result, want bool) { + if result != want { + t.Errorf("%s:%s: %s(%+q)=%v; want %v", tc.Name(), name, fstr[f], test, result, want) + } +} + +func doTest(t *testing.T, tc *Test, f Form, gold, test string) { + testb := []byte(test) + result := f.Bytes(testb) + cmpResult(t, tc, "Bytes", f, gold, test, string(result)) + + sresult := f.String(test) + cmpResult(t, tc, "String", f, gold, test, sresult) + + acc := []byte{} + i := Iter{} + i.InitString(f, test) + for !i.Done() { + acc = append(acc, i.Next()...) + } + cmpResult(t, tc, "Iter.Next", f, gold, test, string(acc)) + + buf := make([]byte, 128) + acc = nil + for p := 0; p < len(testb); { + nDst, nSrc, _ := f.Transform(buf, testb[p:], true) + acc = append(acc, buf[:nDst]...) + p += nSrc + } + cmpResult(t, tc, "Transform", f, gold, test, string(acc)) + + for i := range test { + out := f.Append(f.Bytes([]byte(test[:i])), []byte(test[i:])...) + cmpResult(t, tc, fmt.Sprintf(":Append:%d", i), f, gold, test, string(out)) + } + cmpIsNormal(t, tc, "IsNormal", f, test, f.IsNormal([]byte(test)), test == gold) + cmpIsNormal(t, tc, "IsNormalString", f, test, f.IsNormalString(test), test == gold) +} + +func doConformanceTests(t *testing.T, tc *Test, partn int) { + for i := 0; i <= 2; i++ { + doTest(t, tc, NFC, tc.cols[1], tc.cols[i]) + doTest(t, tc, NFD, tc.cols[2], tc.cols[i]) + doTest(t, tc, NFKC, tc.cols[3], tc.cols[i]) + doTest(t, tc, NFKD, tc.cols[4], tc.cols[i]) + } + for i := 3; i <= 4; i++ { + doTest(t, tc, NFC, tc.cols[3], tc.cols[i]) + doTest(t, tc, NFD, tc.cols[4], tc.cols[i]) + doTest(t, tc, NFKC, tc.cols[3], tc.cols[i]) + doTest(t, tc, NFKD, tc.cols[4], tc.cols[i]) + } +} + +func TestCharacterByCharacter(t *testing.T) { + skipShort(t) + tests := part[1].tests + var last rune = 0 + for i := 0; i <= len(tests); i++ { // last one is special case + var r rune + if i == len(tests) { + r = 0x2FA1E // Don't have to go to 0x10FFFF + } else { + r = tests[i].r + } + for last++; last < r; last++ { + // Check all characters that were not explicitly listed in the test. + tc := &Test{partnr: 1, number: -1} + char := string(last) + doTest(t, tc, NFC, char, char) + doTest(t, tc, NFD, char, char) + doTest(t, tc, NFKC, char, char) + doTest(t, tc, NFKD, char, char) + } + if i < len(tests) { + doConformanceTests(t, &tests[i], 1) + } + } +} + +func TestStandardTests(t *testing.T) { + skipShort(t) + for _, j := range []int{0, 2, 3} { + for _, test := range part[j].tests { + doConformanceTests(t, &test, j) + } + } +} + +// TestPerformance verifies that normalization is O(n). If any of the +// code does not properly check for maxCombiningChars, normalization +// may exhibit O(n**2) behavior. +func TestPerformance(t *testing.T) { + skipShort(t) + runtime.GOMAXPROCS(2) + success := make(chan bool, 1) + go func() { + buf := bytes.Repeat([]byte("\u035D"), 1024*1024) + buf = append(buf, "\u035B"...) + NFC.Append(nil, buf...) + success <- true + }() + timeout := time.After(1 * time.Second) + select { + case <-success: + // test completed before the timeout + case <-timeout: + t.Errorf(`unexpectedly long time to complete PerformanceTest`) + } +} diff --git a/vendor/golang.org/x/text/unicode/rangetable/gen.go b/vendor/golang.org/x/text/unicode/rangetable/gen.go new file mode 100644 index 0000000000..bea49dda10 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/rangetable/gen.go @@ -0,0 +1,113 @@ +// 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 ignore + +package main + +import ( + "bytes" + "flag" + "fmt" + "io" + "log" + "reflect" + "sort" + "strings" + "unicode" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/ucd" + "golang.org/x/text/unicode/rangetable" +) + +var versionList = flag.String("versions", "", + "list of versions for which to generate RangeTables") + +const bootstrapMessage = `No versions specified. +To bootstrap the code generation, run: + go run gen.go --versions=4.1.0,5.0.0,6.0.0,6.1.0,6.2.0,6.3.0,7.0.0 + +and ensure that the latest versions are included by checking: + http://www.unicode.org/Public/` + +func getVersions() []string { + if *versionList == "" { + log.Fatal(bootstrapMessage) + } + + versions := strings.Split(*versionList, ",") + sort.Strings(versions) + + // Ensure that at least the current version is included. + for _, v := range versions { + if v == gen.UnicodeVersion() { + return versions + } + } + + versions = append(versions, gen.UnicodeVersion()) + sort.Strings(versions) + return versions +} + +func main() { + gen.Init() + + versions := getVersions() + + w := &bytes.Buffer{} + + fmt.Fprintf(w, "//go:generate go run gen.go --versions=%s\n\n", strings.Join(versions, ",")) + fmt.Fprintf(w, "import \"unicode\"\n\n") + + vstr := func(s string) string { return strings.Replace(s, ".", "_", -1) } + + fmt.Fprintf(w, "var assigned = map[string]*unicode.RangeTable{\n") + for _, v := range versions { + fmt.Fprintf(w, "\t%q: assigned%s,\n", v, vstr(v)) + } + fmt.Fprintf(w, "}\n\n") + + var size int + for _, v := range versions { + assigned := []rune{} + + r := gen.Open("http://www.unicode.org/Public/", "", v+"/ucd/UnicodeData.txt") + ucd.Parse(r, func(p *ucd.Parser) { + assigned = append(assigned, p.Rune(0)) + }) + + rt := rangetable.New(assigned...) + sz := int(reflect.TypeOf(unicode.RangeTable{}).Size()) + sz += int(reflect.TypeOf(unicode.Range16{}).Size()) * len(rt.R16) + sz += int(reflect.TypeOf(unicode.Range32{}).Size()) * len(rt.R32) + + fmt.Fprintf(w, "// size %d bytes (%d KiB)\n", sz, sz/1024) + fmt.Fprintf(w, "var assigned%s = ", vstr(v)) + print(w, rt) + + size += sz + } + + fmt.Fprintf(w, "// Total size %d bytes (%d KiB)\n", size, size/1024) + + gen.WriteGoFile("tables.go", "rangetable", w.Bytes()) +} + +func print(w io.Writer, rt *unicode.RangeTable) { + fmt.Fprintln(w, "&unicode.RangeTable{") + fmt.Fprintln(w, "\tR16: []unicode.Range16{") + for _, r := range rt.R16 { + fmt.Fprintf(w, "\t\t{%#04x, %#04x, %d},\n", r.Lo, r.Hi, r.Stride) + } + fmt.Fprintln(w, "\t},") + fmt.Fprintln(w, "\tR32: []unicode.Range32{") + for _, r := range rt.R32 { + fmt.Fprintf(w, "\t\t{%#08x, %#08x, %d},\n", r.Lo, r.Hi, r.Stride) + } + fmt.Fprintln(w, "\t},") + fmt.Fprintf(w, "\tLatinOffset: %d,\n", rt.LatinOffset) + fmt.Fprintf(w, "}\n\n") +} diff --git a/vendor/golang.org/x/text/unicode/rangetable/merge.go b/vendor/golang.org/x/text/unicode/rangetable/merge.go new file mode 100644 index 0000000000..ea2a0803ef --- /dev/null +++ b/vendor/golang.org/x/text/unicode/rangetable/merge.go @@ -0,0 +1,260 @@ +// 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 rangetable + +import ( + "unicode" +) + +// atEnd is used to mark a completed iteration. +const atEnd = unicode.MaxRune + 1 + +// Merge returns a new RangeTable that is the union of the given tables. +// It can also be used to compact user-created RangeTables. The entries in +// R16 and R32 for any given RangeTable should be sorted and non-overlapping. +// +// A lookup in the resulting table can be several times faster than using In +// directly on the ranges. Merge is an expensive operation, however, and only +// makes sense if one intends to use the result for more than a couple of +// hundred lookups. +func Merge(ranges ...*unicode.RangeTable) *unicode.RangeTable { + rt := &unicode.RangeTable{} + if len(ranges) == 0 { + return rt + } + + iter := tablesIter(make([]tableIndex, len(ranges))) + + for i, t := range ranges { + iter[i] = tableIndex{t, 0, atEnd} + if len(t.R16) > 0 { + iter[i].next = rune(t.R16[0].Lo) + } + } + + if r0 := iter.next16(); r0.Stride != 0 { + for { + r1 := iter.next16() + if r1.Stride == 0 { + rt.R16 = append(rt.R16, r0) + break + } + stride := r1.Lo - r0.Hi + if (r1.Lo == r1.Hi || stride == r1.Stride) && (r0.Lo == r0.Hi || stride == r0.Stride) { + // Fully merge the next range into the previous one. + r0.Hi, r0.Stride = r1.Hi, stride + continue + } else if stride == r0.Stride { + // Move the first element of r1 to r0. This may eliminate an + // entry. + r0.Hi = r1.Lo + r0.Stride = stride + r1.Lo = r1.Lo + r1.Stride + if r1.Lo > r1.Hi { + continue + } + } + rt.R16 = append(rt.R16, r0) + r0 = r1 + } + } + + for i, t := range ranges { + iter[i] = tableIndex{t, 0, atEnd} + if len(t.R32) > 0 { + iter[i].next = rune(t.R32[0].Lo) + } + } + + if r0 := iter.next32(); r0.Stride != 0 { + for { + r1 := iter.next32() + if r1.Stride == 0 { + rt.R32 = append(rt.R32, r0) + break + } + stride := r1.Lo - r0.Hi + if (r1.Lo == r1.Hi || stride == r1.Stride) && (r0.Lo == r0.Hi || stride == r0.Stride) { + // Fully merge the next range into the previous one. + r0.Hi, r0.Stride = r1.Hi, stride + continue + } else if stride == r0.Stride { + // Move the first element of r1 to r0. This may eliminate an + // entry. + r0.Hi = r1.Lo + r1.Lo = r1.Lo + r1.Stride + if r1.Lo > r1.Hi { + continue + } + } + rt.R32 = append(rt.R32, r0) + r0 = r1 + } + } + + for i := 0; i < len(rt.R16) && rt.R16[i].Hi <= unicode.MaxLatin1; i++ { + rt.LatinOffset = i + 1 + } + + return rt +} + +type tableIndex struct { + t *unicode.RangeTable + p uint32 + next rune +} + +type tablesIter []tableIndex + +// sortIter does an insertion sort using the next field of tableIndex. Insertion +// sort is a good sorting algorithm for this case. +func sortIter(t []tableIndex) { + for i := range t { + for j := i; j > 0 && t[j-1].next > t[j].next; j-- { + t[j], t[j-1] = t[j-1], t[j] + } + } +} + +// next16 finds the ranged to be added to the table. If ranges overlap between +// multiple tables it clips the result to a non-overlapping range if the +// elements are not fully subsumed. It returns a zero range if there are no more +// ranges. +func (ti tablesIter) next16() unicode.Range16 { + sortIter(ti) + + t0 := ti[0] + if t0.next == atEnd { + return unicode.Range16{} + } + r0 := t0.t.R16[t0.p] + r0.Lo = uint16(t0.next) + + // We restrict the Hi of the current range if it overlaps with another range. + for i := range ti { + tn := ti[i] + // Since our tableIndices are sorted by next, we can break if the there + // is no overlap. The first value of a next range can always be merged + // into the current one, so we can break in case of equality as well. + if rune(r0.Hi) <= tn.next { + break + } + rn := tn.t.R16[tn.p] + rn.Lo = uint16(tn.next) + + // Limit r0.Hi based on next ranges in list, but allow it to overlap + // with ranges as long as it subsumes it. + m := (rn.Lo - r0.Lo) % r0.Stride + if m == 0 && (rn.Stride == r0.Stride || rn.Lo == rn.Hi) { + // Overlap, take the min of the two Hi values: for simplicity's sake + // we only process one range at a time. + if r0.Hi > rn.Hi { + r0.Hi = rn.Hi + } + } else { + // Not a compatible stride. Set to the last possible value before + // rn.Lo, but ensure there is at least one value. + if x := rn.Lo - m; r0.Lo <= x { + r0.Hi = x + } + break + } + } + + // Update the next values for each table. + for i := range ti { + tn := &ti[i] + if rune(r0.Hi) < tn.next { + break + } + rn := tn.t.R16[tn.p] + stride := rune(rn.Stride) + tn.next += stride * (1 + ((rune(r0.Hi) - tn.next) / stride)) + if rune(rn.Hi) < tn.next { + if tn.p++; int(tn.p) == len(tn.t.R16) { + tn.next = atEnd + } else { + tn.next = rune(tn.t.R16[tn.p].Lo) + } + } + } + + if r0.Lo == r0.Hi { + r0.Stride = 1 + } + + return r0 +} + +// next32 finds the ranged to be added to the table. If ranges overlap between +// multiple tables it clips the result to a non-overlapping range if the +// elements are not fully subsumed. It returns a zero range if there are no more +// ranges. +func (ti tablesIter) next32() unicode.Range32 { + sortIter(ti) + + t0 := ti[0] + if t0.next == atEnd { + return unicode.Range32{} + } + r0 := t0.t.R32[t0.p] + r0.Lo = uint32(t0.next) + + // We restrict the Hi of the current range if it overlaps with another range. + for i := range ti { + tn := ti[i] + // Since our tableIndices are sorted by next, we can break if the there + // is no overlap. The first value of a next range can always be merged + // into the current one, so we can break in case of equality as well. + if rune(r0.Hi) <= tn.next { + break + } + rn := tn.t.R32[tn.p] + rn.Lo = uint32(tn.next) + + // Limit r0.Hi based on next ranges in list, but allow it to overlap + // with ranges as long as it subsumes it. + m := (rn.Lo - r0.Lo) % r0.Stride + if m == 0 && (rn.Stride == r0.Stride || rn.Lo == rn.Hi) { + // Overlap, take the min of the two Hi values: for simplicity's sake + // we only process one range at a time. + if r0.Hi > rn.Hi { + r0.Hi = rn.Hi + } + } else { + // Not a compatible stride. Set to the last possible value before + // rn.Lo, but ensure there is at least one value. + if x := rn.Lo - m; r0.Lo <= x { + r0.Hi = x + } + break + } + } + + // Update the next values for each table. + for i := range ti { + tn := &ti[i] + if rune(r0.Hi) < tn.next { + break + } + rn := tn.t.R32[tn.p] + stride := rune(rn.Stride) + tn.next += stride * (1 + ((rune(r0.Hi) - tn.next) / stride)) + if rune(rn.Hi) < tn.next { + if tn.p++; int(tn.p) == len(tn.t.R32) { + tn.next = atEnd + } else { + tn.next = rune(tn.t.R32[tn.p].Lo) + } + } + } + + if r0.Lo == r0.Hi { + r0.Stride = 1 + } + + return r0 +} diff --git a/vendor/golang.org/x/text/unicode/rangetable/merge_test.go b/vendor/golang.org/x/text/unicode/rangetable/merge_test.go new file mode 100644 index 0000000000..93ed0fcadc --- /dev/null +++ b/vendor/golang.org/x/text/unicode/rangetable/merge_test.go @@ -0,0 +1,184 @@ +// 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 rangetable + +import ( + "testing" + "unicode" +) + +var ( + maxRuneTable = &unicode.RangeTable{ + R32: []unicode.Range32{ + {unicode.MaxRune, unicode.MaxRune, 1}, + }, + } + + overlap1 = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x100, 0xfffc, 4}, + }, + R32: []unicode.Range32{ + {0x100000, 0x10fffc, 4}, + }, + } + + overlap2 = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x101, 0xfffd, 4}, + }, + R32: []unicode.Range32{ + {0x100001, 0x10fffd, 3}, + }, + } + + // The following table should be compacted into two entries for R16 and R32. + optimize = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x1, 0x1, 1}, + {0x2, 0x2, 1}, + {0x3, 0x3, 1}, + {0x5, 0x5, 1}, + {0x7, 0x7, 1}, + {0x9, 0x9, 1}, + {0xb, 0xf, 2}, + }, + R32: []unicode.Range32{ + {0x10001, 0x10001, 1}, + {0x10002, 0x10002, 1}, + {0x10003, 0x10003, 1}, + {0x10005, 0x10005, 1}, + {0x10007, 0x10007, 1}, + {0x10009, 0x10009, 1}, + {0x1000b, 0x1000f, 2}, + }, + } +) + +func TestMerge(t *testing.T) { + for i, tt := range [][]*unicode.RangeTable{ + {unicode.Cc, unicode.Cf}, + {unicode.L, unicode.Ll}, + {unicode.L, unicode.Ll, unicode.Lu}, + {unicode.Ll, unicode.Lu}, + {unicode.M}, + unicode.GraphicRanges, + cased, + + // Merge R16 only and R32 only and vice versa. + {unicode.Khmer, unicode.Khudawadi}, + {unicode.Imperial_Aramaic, unicode.Radical}, + + // Merge with empty. + {&unicode.RangeTable{}}, + {&unicode.RangeTable{}, &unicode.RangeTable{}}, + {&unicode.RangeTable{}, &unicode.RangeTable{}, &unicode.RangeTable{}}, + {&unicode.RangeTable{}, unicode.Hiragana}, + {unicode.Inherited, &unicode.RangeTable{}}, + {&unicode.RangeTable{}, unicode.Hanunoo, &unicode.RangeTable{}}, + + // Hypothetical tables. + {maxRuneTable}, + {overlap1, overlap2}, + + // Optimization + {optimize}, + } { + rt := Merge(tt...) + for r := rune(0); r <= unicode.MaxRune; r++ { + if got, want := unicode.Is(rt, r), unicode.In(r, tt...); got != want { + t.Fatalf("%d:%U: got %v; want %v", i, r, got, want) + } + } + // Test optimization and correctness for R16. + for k := 0; k < len(rt.R16)-1; k++ { + if lo, hi := rt.R16[k].Lo, rt.R16[k].Hi; lo > hi { + t.Errorf("%d: Lo (%x) > Hi (%x)", i, lo, hi) + } + if hi, lo := rt.R16[k].Hi, rt.R16[k+1].Lo; hi >= lo { + t.Errorf("%d: Hi (%x) >= next Lo (%x)", i, hi, lo) + } + if rt.R16[k].Hi+rt.R16[k].Stride == rt.R16[k+1].Lo { + t.Errorf("%d: missed optimization for R16 at %d between %X and %x", + i, k, rt.R16[k], rt.R16[k+1]) + } + } + // Test optimization and correctness for R32. + for k := 0; k < len(rt.R32)-1; k++ { + if lo, hi := rt.R32[k].Lo, rt.R32[k].Hi; lo > hi { + t.Errorf("%d: Lo (%x) > Hi (%x)", i, lo, hi) + } + if hi, lo := rt.R32[k].Hi, rt.R32[k+1].Lo; hi >= lo { + t.Errorf("%d: Hi (%x) >= next Lo (%x)", i, hi, lo) + } + if rt.R32[k].Hi+rt.R32[k].Stride == rt.R32[k+1].Lo { + t.Errorf("%d: missed optimization for R32 at %d between %X and %X", + i, k, rt.R32[k], rt.R32[k+1]) + } + } + } +} + +const runes = "Hello World in 2015!,\U0010fffd" + +func BenchmarkNotMerged(t *testing.B) { + for i := 0; i < t.N; i++ { + for _, r := range runes { + unicode.In(r, unicode.GraphicRanges...) + } + } +} + +func BenchmarkMerged(t *testing.B) { + rt := Merge(unicode.GraphicRanges...) + + for i := 0; i < t.N; i++ { + for _, r := range runes { + unicode.Is(rt, r) + } + } +} + +var cased = []*unicode.RangeTable{ + unicode.Lower, + unicode.Upper, + unicode.Title, + unicode.Other_Lowercase, + unicode.Other_Uppercase, +} + +func BenchmarkNotMergedCased(t *testing.B) { + for i := 0; i < t.N; i++ { + for _, r := range runes { + unicode.In(r, cased...) + } + } +} + +func BenchmarkMergedCased(t *testing.B) { + // This reduces len(R16) from 243 to 82 and len(R32) from 65 to 35 for + // Unicode 7.0.0. + rt := Merge(cased...) + + for i := 0; i < t.N; i++ { + for _, r := range runes { + unicode.Is(rt, r) + } + } +} + +func BenchmarkInit(t *testing.B) { + for i := 0; i < t.N; i++ { + Merge(cased...) + Merge(unicode.GraphicRanges...) + } +} + +func BenchmarkInit2(t *testing.B) { + // Hypothetical near-worst-case performance. + for i := 0; i < t.N; i++ { + Merge(overlap1, overlap2) + } +} diff --git a/vendor/golang.org/x/text/unicode/rangetable/rangetable.go b/vendor/golang.org/x/text/unicode/rangetable/rangetable.go new file mode 100644 index 0000000000..187882cc35 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/rangetable/rangetable.go @@ -0,0 +1,70 @@ +// 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 rangetable provides utilities for creating and inspecting +// unicode.RangeTables. +package rangetable + +import ( + "sort" + "unicode" +) + +// New creates a RangeTable from the given runes, which may contain duplicates. +func New(r ...rune) *unicode.RangeTable { + if len(r) == 0 { + return &unicode.RangeTable{} + } + + sort.Sort(byRune(r)) + + // Remove duplicates. + k := 1 + for i := 1; i < len(r); i++ { + if r[k-1] != r[i] { + r[k] = r[i] + k++ + } + } + + var rt unicode.RangeTable + for _, r := range r[:k] { + if r <= 0xFFFF { + rt.R16 = append(rt.R16, unicode.Range16{Lo: uint16(r), Hi: uint16(r), Stride: 1}) + } else { + rt.R32 = append(rt.R32, unicode.Range32{Lo: uint32(r), Hi: uint32(r), Stride: 1}) + } + } + + // Optimize RangeTable. + return Merge(&rt) +} + +type byRune []rune + +func (r byRune) Len() int { return len(r) } +func (r byRune) Swap(i, j int) { r[i], r[j] = r[j], r[i] } +func (r byRune) Less(i, j int) bool { return r[i] < r[j] } + +// Visit visits all runes in the given RangeTable in order, calling fn for each. +func Visit(rt *unicode.RangeTable, fn func(rune)) { + for _, r16 := range rt.R16 { + for r := rune(r16.Lo); r <= rune(r16.Hi); r += rune(r16.Stride) { + fn(r) + } + } + for _, r32 := range rt.R32 { + for r := rune(r32.Lo); r <= rune(r32.Hi); r += rune(r32.Stride) { + fn(r) + } + } +} + +// Assigned returns a RangeTable with all assigned code points for a given +// Unicode version. This includes graphic, format, control, and private-use +// characters. It returns nil if the data for the given version is not +// available. +func Assigned(version string) *unicode.RangeTable { + return assigned[version] +} diff --git a/vendor/golang.org/x/text/unicode/rangetable/rangetable_test.go b/vendor/golang.org/x/text/unicode/rangetable/rangetable_test.go new file mode 100644 index 0000000000..5a355aa353 --- /dev/null +++ b/vendor/golang.org/x/text/unicode/rangetable/rangetable_test.go @@ -0,0 +1,55 @@ +package rangetable + +import ( + "reflect" + "testing" + "unicode" +) + +var ( + empty = &unicode.RangeTable{} + many = &unicode.RangeTable{ + R16: []unicode.Range16{{0, 0xffff, 5}}, + R32: []unicode.Range32{{0x10004, 0x10009, 5}}, + LatinOffset: 0, + } +) + +func TestVisit(t *testing.T) { + Visit(empty, func(got rune) { + t.Error("call from empty RangeTable") + }) + + var want rune + Visit(many, func(got rune) { + if got != want { + t.Errorf("got %U; want %U", got, want) + } + want += 5 + }) + if want -= 5; want != 0x10009 { + t.Errorf("last run was %U; want U+10009", want) + } +} + +func TestNew(t *testing.T) { + for i, rt := range []*unicode.RangeTable{ + empty, + unicode.Co, + unicode.Letter, + unicode.ASCII_Hex_Digit, + many, + maxRuneTable, + } { + var got, want []rune + Visit(rt, func(r rune) { + want = append(want, r) + }) + Visit(New(want...), func(r rune) { + got = append(got, r) + }) + if !reflect.DeepEqual(got, want) { + t.Errorf("%d:\ngot %v;\nwant %v", i, got, want) + } + } +} diff --git a/vendor/golang.org/x/text/unicode/rangetable/tables.go b/vendor/golang.org/x/text/unicode/rangetable/tables.go new file mode 100644 index 0000000000..c8bc3ca5ce --- /dev/null +++ b/vendor/golang.org/x/text/unicode/rangetable/tables.go @@ -0,0 +1,5105 @@ +// This file was generated by go generate; DO NOT EDIT + +package rangetable + +//go:generate go run gen.go --versions=4.1.0,5.0.0,5.1.0,5.2.0,6.0.0,6.1.0,6.2.0,6.3.0,7.0.0,8.0.0 + +import "unicode" + +var assigned = map[string]*unicode.RangeTable{ + "4.1.0": assigned4_1_0, + "5.0.0": assigned5_0_0, + "5.1.0": assigned5_1_0, + "5.2.0": assigned5_2_0, + "6.0.0": assigned6_0_0, + "6.1.0": assigned6_1_0, + "6.2.0": assigned6_2_0, + "6.3.0": assigned6_3_0, + "7.0.0": assigned7_0_0, + "8.0.0": assigned8_0_0, +} + +// size 2924 bytes (2 KiB) +var assigned4_1_0 = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x0000, 0x0241, 1}, + {0x0250, 0x036f, 1}, + {0x0374, 0x0375, 1}, + {0x037a, 0x037e, 4}, + {0x0384, 0x038a, 1}, + {0x038c, 0x038e, 2}, + {0x038f, 0x03a1, 1}, + {0x03a3, 0x03ce, 1}, + {0x03d0, 0x0486, 1}, + {0x0488, 0x04ce, 1}, + {0x04d0, 0x04f9, 1}, + {0x0500, 0x050f, 1}, + {0x0531, 0x0556, 1}, + {0x0559, 0x055f, 1}, + {0x0561, 0x0587, 1}, + {0x0589, 0x058a, 1}, + {0x0591, 0x05b9, 1}, + {0x05bb, 0x05c7, 1}, + {0x05d0, 0x05ea, 1}, + {0x05f0, 0x05f4, 1}, + {0x0600, 0x0603, 1}, + {0x060b, 0x0615, 1}, + {0x061b, 0x061e, 3}, + {0x061f, 0x0621, 2}, + {0x0622, 0x063a, 1}, + {0x0640, 0x065e, 1}, + {0x0660, 0x070d, 1}, + {0x070f, 0x074a, 1}, + {0x074d, 0x076d, 1}, + {0x0780, 0x07b1, 1}, + {0x0901, 0x0939, 1}, + {0x093c, 0x094d, 1}, + {0x0950, 0x0954, 1}, + {0x0958, 0x0970, 1}, + {0x097d, 0x0981, 4}, + {0x0982, 0x0983, 1}, + {0x0985, 0x098c, 1}, + {0x098f, 0x0990, 1}, + {0x0993, 0x09a8, 1}, + {0x09aa, 0x09b0, 1}, + {0x09b2, 0x09b6, 4}, + {0x09b7, 0x09b9, 1}, + {0x09bc, 0x09c4, 1}, + {0x09c7, 0x09c8, 1}, + {0x09cb, 0x09ce, 1}, + {0x09d7, 0x09dc, 5}, + {0x09dd, 0x09df, 2}, + {0x09e0, 0x09e3, 1}, + {0x09e6, 0x09fa, 1}, + {0x0a01, 0x0a03, 1}, + {0x0a05, 0x0a0a, 1}, + {0x0a0f, 0x0a10, 1}, + {0x0a13, 0x0a28, 1}, + {0x0a2a, 0x0a30, 1}, + {0x0a32, 0x0a33, 1}, + {0x0a35, 0x0a36, 1}, + {0x0a38, 0x0a39, 1}, + {0x0a3c, 0x0a3e, 2}, + {0x0a3f, 0x0a42, 1}, + {0x0a47, 0x0a48, 1}, + {0x0a4b, 0x0a4d, 1}, + {0x0a59, 0x0a5c, 1}, + {0x0a5e, 0x0a66, 8}, + {0x0a67, 0x0a74, 1}, + {0x0a81, 0x0a83, 1}, + {0x0a85, 0x0a8d, 1}, + {0x0a8f, 0x0a91, 1}, + {0x0a93, 0x0aa8, 1}, + {0x0aaa, 0x0ab0, 1}, + {0x0ab2, 0x0ab3, 1}, + {0x0ab5, 0x0ab9, 1}, + {0x0abc, 0x0ac5, 1}, + {0x0ac7, 0x0ac9, 1}, + {0x0acb, 0x0acd, 1}, + {0x0ad0, 0x0ae0, 16}, + {0x0ae1, 0x0ae3, 1}, + {0x0ae6, 0x0aef, 1}, + {0x0af1, 0x0b01, 16}, + {0x0b02, 0x0b03, 1}, + {0x0b05, 0x0b0c, 1}, + {0x0b0f, 0x0b10, 1}, + {0x0b13, 0x0b28, 1}, + {0x0b2a, 0x0b30, 1}, + {0x0b32, 0x0b33, 1}, + {0x0b35, 0x0b39, 1}, + {0x0b3c, 0x0b43, 1}, + {0x0b47, 0x0b48, 1}, + {0x0b4b, 0x0b4d, 1}, + {0x0b56, 0x0b57, 1}, + {0x0b5c, 0x0b5d, 1}, + {0x0b5f, 0x0b61, 1}, + {0x0b66, 0x0b71, 1}, + {0x0b82, 0x0b83, 1}, + {0x0b85, 0x0b8a, 1}, + {0x0b8e, 0x0b90, 1}, + {0x0b92, 0x0b95, 1}, + {0x0b99, 0x0b9a, 1}, + {0x0b9c, 0x0b9e, 2}, + {0x0b9f, 0x0ba3, 4}, + {0x0ba4, 0x0ba8, 4}, + {0x0ba9, 0x0baa, 1}, + {0x0bae, 0x0bb9, 1}, + {0x0bbe, 0x0bc2, 1}, + {0x0bc6, 0x0bc8, 1}, + {0x0bca, 0x0bcd, 1}, + {0x0bd7, 0x0be6, 15}, + {0x0be7, 0x0bfa, 1}, + {0x0c01, 0x0c03, 1}, + {0x0c05, 0x0c0c, 1}, + {0x0c0e, 0x0c10, 1}, + {0x0c12, 0x0c28, 1}, + {0x0c2a, 0x0c33, 1}, + {0x0c35, 0x0c39, 1}, + {0x0c3e, 0x0c44, 1}, + {0x0c46, 0x0c48, 1}, + {0x0c4a, 0x0c4d, 1}, + {0x0c55, 0x0c56, 1}, + {0x0c60, 0x0c61, 1}, + {0x0c66, 0x0c6f, 1}, + {0x0c82, 0x0c83, 1}, + {0x0c85, 0x0c8c, 1}, + {0x0c8e, 0x0c90, 1}, + {0x0c92, 0x0ca8, 1}, + {0x0caa, 0x0cb3, 1}, + {0x0cb5, 0x0cb9, 1}, + {0x0cbc, 0x0cc4, 1}, + {0x0cc6, 0x0cc8, 1}, + {0x0cca, 0x0ccd, 1}, + {0x0cd5, 0x0cd6, 1}, + {0x0cde, 0x0ce0, 2}, + {0x0ce1, 0x0ce6, 5}, + {0x0ce7, 0x0cef, 1}, + {0x0d02, 0x0d03, 1}, + {0x0d05, 0x0d0c, 1}, + {0x0d0e, 0x0d10, 1}, + {0x0d12, 0x0d28, 1}, + {0x0d2a, 0x0d39, 1}, + {0x0d3e, 0x0d43, 1}, + {0x0d46, 0x0d48, 1}, + {0x0d4a, 0x0d4d, 1}, + {0x0d57, 0x0d60, 9}, + {0x0d61, 0x0d66, 5}, + {0x0d67, 0x0d6f, 1}, + {0x0d82, 0x0d83, 1}, + {0x0d85, 0x0d96, 1}, + {0x0d9a, 0x0db1, 1}, + {0x0db3, 0x0dbb, 1}, + {0x0dbd, 0x0dc0, 3}, + {0x0dc1, 0x0dc6, 1}, + {0x0dca, 0x0dcf, 5}, + {0x0dd0, 0x0dd4, 1}, + {0x0dd6, 0x0dd8, 2}, + {0x0dd9, 0x0ddf, 1}, + {0x0df2, 0x0df4, 1}, + {0x0e01, 0x0e3a, 1}, + {0x0e3f, 0x0e5b, 1}, + {0x0e81, 0x0e82, 1}, + {0x0e84, 0x0e87, 3}, + {0x0e88, 0x0e8a, 2}, + {0x0e8d, 0x0e94, 7}, + {0x0e95, 0x0e97, 1}, + {0x0e99, 0x0e9f, 1}, + {0x0ea1, 0x0ea3, 1}, + {0x0ea5, 0x0ea7, 2}, + {0x0eaa, 0x0eab, 1}, + {0x0ead, 0x0eb9, 1}, + {0x0ebb, 0x0ebd, 1}, + {0x0ec0, 0x0ec4, 1}, + {0x0ec6, 0x0ec8, 2}, + {0x0ec9, 0x0ecd, 1}, + {0x0ed0, 0x0ed9, 1}, + {0x0edc, 0x0edd, 1}, + {0x0f00, 0x0f47, 1}, + {0x0f49, 0x0f6a, 1}, + {0x0f71, 0x0f8b, 1}, + {0x0f90, 0x0f97, 1}, + {0x0f99, 0x0fbc, 1}, + {0x0fbe, 0x0fcc, 1}, + {0x0fcf, 0x0fd1, 1}, + {0x1000, 0x1021, 1}, + {0x1023, 0x1027, 1}, + {0x1029, 0x102a, 1}, + {0x102c, 0x1032, 1}, + {0x1036, 0x1039, 1}, + {0x1040, 0x1059, 1}, + {0x10a0, 0x10c5, 1}, + {0x10d0, 0x10fc, 1}, + {0x1100, 0x1159, 1}, + {0x115f, 0x11a2, 1}, + {0x11a8, 0x11f9, 1}, + {0x1200, 0x1248, 1}, + {0x124a, 0x124d, 1}, + {0x1250, 0x1256, 1}, + {0x1258, 0x125a, 2}, + {0x125b, 0x125d, 1}, + {0x1260, 0x1288, 1}, + {0x128a, 0x128d, 1}, + {0x1290, 0x12b0, 1}, + {0x12b2, 0x12b5, 1}, + {0x12b8, 0x12be, 1}, + {0x12c0, 0x12c2, 2}, + {0x12c3, 0x12c5, 1}, + {0x12c8, 0x12d6, 1}, + {0x12d8, 0x1310, 1}, + {0x1312, 0x1315, 1}, + {0x1318, 0x135a, 1}, + {0x135f, 0x137c, 1}, + {0x1380, 0x1399, 1}, + {0x13a0, 0x13f4, 1}, + {0x1401, 0x1676, 1}, + {0x1680, 0x169c, 1}, + {0x16a0, 0x16f0, 1}, + {0x1700, 0x170c, 1}, + {0x170e, 0x1714, 1}, + {0x1720, 0x1736, 1}, + {0x1740, 0x1753, 1}, + {0x1760, 0x176c, 1}, + {0x176e, 0x1770, 1}, + {0x1772, 0x1773, 1}, + {0x1780, 0x17dd, 1}, + {0x17e0, 0x17e9, 1}, + {0x17f0, 0x17f9, 1}, + {0x1800, 0x180e, 1}, + {0x1810, 0x1819, 1}, + {0x1820, 0x1877, 1}, + {0x1880, 0x18a9, 1}, + {0x1900, 0x191c, 1}, + {0x1920, 0x192b, 1}, + {0x1930, 0x193b, 1}, + {0x1940, 0x1944, 4}, + {0x1945, 0x196d, 1}, + {0x1970, 0x1974, 1}, + {0x1980, 0x19a9, 1}, + {0x19b0, 0x19c9, 1}, + {0x19d0, 0x19d9, 1}, + {0x19de, 0x1a1b, 1}, + {0x1a1e, 0x1a1f, 1}, + {0x1d00, 0x1dc3, 1}, + {0x1e00, 0x1e9b, 1}, + {0x1ea0, 0x1ef9, 1}, + {0x1f00, 0x1f15, 1}, + {0x1f18, 0x1f1d, 1}, + {0x1f20, 0x1f45, 1}, + {0x1f48, 0x1f4d, 1}, + {0x1f50, 0x1f57, 1}, + {0x1f59, 0x1f5f, 2}, + {0x1f60, 0x1f7d, 1}, + {0x1f80, 0x1fb4, 1}, + {0x1fb6, 0x1fc4, 1}, + {0x1fc6, 0x1fd3, 1}, + {0x1fd6, 0x1fdb, 1}, + {0x1fdd, 0x1fef, 1}, + {0x1ff2, 0x1ff4, 1}, + {0x1ff6, 0x1ffe, 1}, + {0x2000, 0x2063, 1}, + {0x206a, 0x2071, 1}, + {0x2074, 0x208e, 1}, + {0x2090, 0x2094, 1}, + {0x20a0, 0x20b5, 1}, + {0x20d0, 0x20eb, 1}, + {0x2100, 0x214c, 1}, + {0x2153, 0x2183, 1}, + {0x2190, 0x23db, 1}, + {0x2400, 0x2426, 1}, + {0x2440, 0x244a, 1}, + {0x2460, 0x269c, 1}, + {0x26a0, 0x26b1, 1}, + {0x2701, 0x2704, 1}, + {0x2706, 0x2709, 1}, + {0x270c, 0x2727, 1}, + {0x2729, 0x274b, 1}, + {0x274d, 0x274f, 2}, + {0x2750, 0x2752, 1}, + {0x2756, 0x2758, 2}, + {0x2759, 0x275e, 1}, + {0x2761, 0x2794, 1}, + {0x2798, 0x27af, 1}, + {0x27b1, 0x27be, 1}, + {0x27c0, 0x27c6, 1}, + {0x27d0, 0x27eb, 1}, + {0x27f0, 0x2b13, 1}, + {0x2c00, 0x2c2e, 1}, + {0x2c30, 0x2c5e, 1}, + {0x2c80, 0x2cea, 1}, + {0x2cf9, 0x2d25, 1}, + {0x2d30, 0x2d65, 1}, + {0x2d6f, 0x2d80, 17}, + {0x2d81, 0x2d96, 1}, + {0x2da0, 0x2da6, 1}, + {0x2da8, 0x2dae, 1}, + {0x2db0, 0x2db6, 1}, + {0x2db8, 0x2dbe, 1}, + {0x2dc0, 0x2dc6, 1}, + {0x2dc8, 0x2dce, 1}, + {0x2dd0, 0x2dd6, 1}, + {0x2dd8, 0x2dde, 1}, + {0x2e00, 0x2e17, 1}, + {0x2e1c, 0x2e1d, 1}, + {0x2e80, 0x2e99, 1}, + {0x2e9b, 0x2ef3, 1}, + {0x2f00, 0x2fd5, 1}, + {0x2ff0, 0x2ffb, 1}, + {0x3000, 0x303f, 1}, + {0x3041, 0x3096, 1}, + {0x3099, 0x30ff, 1}, + {0x3105, 0x312c, 1}, + {0x3131, 0x318e, 1}, + {0x3190, 0x31b7, 1}, + {0x31c0, 0x31cf, 1}, + {0x31f0, 0x321e, 1}, + {0x3220, 0x3243, 1}, + {0x3250, 0x32fe, 1}, + {0x3300, 0x4db5, 1}, + {0x4dc0, 0x9fbb, 1}, + {0xa000, 0xa48c, 1}, + {0xa490, 0xa4c6, 1}, + {0xa700, 0xa716, 1}, + {0xa800, 0xa82b, 1}, + {0xac00, 0xd7a3, 1}, + {0xd800, 0xfa2d, 1}, + {0xfa30, 0xfa6a, 1}, + {0xfa70, 0xfad9, 1}, + {0xfb00, 0xfb06, 1}, + {0xfb13, 0xfb17, 1}, + {0xfb1d, 0xfb36, 1}, + {0xfb38, 0xfb3c, 1}, + {0xfb3e, 0xfb40, 2}, + {0xfb41, 0xfb43, 2}, + {0xfb44, 0xfb46, 2}, + {0xfb47, 0xfbb1, 1}, + {0xfbd3, 0xfd3f, 1}, + {0xfd50, 0xfd8f, 1}, + {0xfd92, 0xfdc7, 1}, + {0xfdf0, 0xfdfd, 1}, + {0xfe00, 0xfe19, 1}, + {0xfe20, 0xfe23, 1}, + {0xfe30, 0xfe52, 1}, + {0xfe54, 0xfe66, 1}, + {0xfe68, 0xfe6b, 1}, + {0xfe70, 0xfe74, 1}, + {0xfe76, 0xfefc, 1}, + {0xfeff, 0xff01, 2}, + {0xff02, 0xffbe, 1}, + {0xffc2, 0xffc7, 1}, + {0xffca, 0xffcf, 1}, + {0xffd2, 0xffd7, 1}, + {0xffda, 0xffdc, 1}, + {0xffe0, 0xffe6, 1}, + {0xffe8, 0xffee, 1}, + {0xfff9, 0xfffd, 1}, + }, + R32: []unicode.Range32{ + {0x00010000, 0x0001000b, 1}, + {0x0001000d, 0x00010026, 1}, + {0x00010028, 0x0001003a, 1}, + {0x0001003c, 0x0001003d, 1}, + {0x0001003f, 0x0001004d, 1}, + {0x00010050, 0x0001005d, 1}, + {0x00010080, 0x000100fa, 1}, + {0x00010100, 0x00010102, 1}, + {0x00010107, 0x00010133, 1}, + {0x00010137, 0x0001018a, 1}, + {0x00010300, 0x0001031e, 1}, + {0x00010320, 0x00010323, 1}, + {0x00010330, 0x0001034a, 1}, + {0x00010380, 0x0001039d, 1}, + {0x0001039f, 0x000103c3, 1}, + {0x000103c8, 0x000103d5, 1}, + {0x00010400, 0x0001049d, 1}, + {0x000104a0, 0x000104a9, 1}, + {0x00010800, 0x00010805, 1}, + {0x00010808, 0x0001080a, 2}, + {0x0001080b, 0x00010835, 1}, + {0x00010837, 0x00010838, 1}, + {0x0001083c, 0x0001083f, 3}, + {0x00010a00, 0x00010a03, 1}, + {0x00010a05, 0x00010a06, 1}, + {0x00010a0c, 0x00010a13, 1}, + {0x00010a15, 0x00010a17, 1}, + {0x00010a19, 0x00010a33, 1}, + {0x00010a38, 0x00010a3a, 1}, + {0x00010a3f, 0x00010a47, 1}, + {0x00010a50, 0x00010a58, 1}, + {0x0001d000, 0x0001d0f5, 1}, + {0x0001d100, 0x0001d126, 1}, + {0x0001d12a, 0x0001d1dd, 1}, + {0x0001d200, 0x0001d245, 1}, + {0x0001d300, 0x0001d356, 1}, + {0x0001d400, 0x0001d454, 1}, + {0x0001d456, 0x0001d49c, 1}, + {0x0001d49e, 0x0001d49f, 1}, + {0x0001d4a2, 0x0001d4a5, 3}, + {0x0001d4a6, 0x0001d4a9, 3}, + {0x0001d4aa, 0x0001d4ac, 1}, + {0x0001d4ae, 0x0001d4b9, 1}, + {0x0001d4bb, 0x0001d4bd, 2}, + {0x0001d4be, 0x0001d4c3, 1}, + {0x0001d4c5, 0x0001d505, 1}, + {0x0001d507, 0x0001d50a, 1}, + {0x0001d50d, 0x0001d514, 1}, + {0x0001d516, 0x0001d51c, 1}, + {0x0001d51e, 0x0001d539, 1}, + {0x0001d53b, 0x0001d53e, 1}, + {0x0001d540, 0x0001d544, 1}, + {0x0001d546, 0x0001d54a, 4}, + {0x0001d54b, 0x0001d550, 1}, + {0x0001d552, 0x0001d6a5, 1}, + {0x0001d6a8, 0x0001d7c9, 1}, + {0x0001d7ce, 0x0001d7ff, 1}, + {0x00020000, 0x0002a6d6, 1}, + {0x0002f800, 0x0002fa1d, 1}, + {0x000e0001, 0x000e0020, 31}, + {0x000e0021, 0x000e007f, 1}, + {0x000e0100, 0x000e01ef, 1}, + {0x000f0000, 0x000ffffd, 1}, + {0x00100000, 0x0010fffd, 1}, + }, + LatinOffset: 0, +} + +// size 3026 bytes (2 KiB) +var assigned5_0_0 = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x0000, 0x036f, 1}, + {0x0374, 0x0375, 1}, + {0x037a, 0x037e, 1}, + {0x0384, 0x038a, 1}, + {0x038c, 0x038e, 2}, + {0x038f, 0x03a1, 1}, + {0x03a3, 0x03ce, 1}, + {0x03d0, 0x0486, 1}, + {0x0488, 0x0513, 1}, + {0x0531, 0x0556, 1}, + {0x0559, 0x055f, 1}, + {0x0561, 0x0587, 1}, + {0x0589, 0x058a, 1}, + {0x0591, 0x05c7, 1}, + {0x05d0, 0x05ea, 1}, + {0x05f0, 0x05f4, 1}, + {0x0600, 0x0603, 1}, + {0x060b, 0x0615, 1}, + {0x061b, 0x061e, 3}, + {0x061f, 0x0621, 2}, + {0x0622, 0x063a, 1}, + {0x0640, 0x065e, 1}, + {0x0660, 0x070d, 1}, + {0x070f, 0x074a, 1}, + {0x074d, 0x076d, 1}, + {0x0780, 0x07b1, 1}, + {0x07c0, 0x07fa, 1}, + {0x0901, 0x0939, 1}, + {0x093c, 0x094d, 1}, + {0x0950, 0x0954, 1}, + {0x0958, 0x0970, 1}, + {0x097b, 0x097f, 1}, + {0x0981, 0x0983, 1}, + {0x0985, 0x098c, 1}, + {0x098f, 0x0990, 1}, + {0x0993, 0x09a8, 1}, + {0x09aa, 0x09b0, 1}, + {0x09b2, 0x09b6, 4}, + {0x09b7, 0x09b9, 1}, + {0x09bc, 0x09c4, 1}, + {0x09c7, 0x09c8, 1}, + {0x09cb, 0x09ce, 1}, + {0x09d7, 0x09dc, 5}, + {0x09dd, 0x09df, 2}, + {0x09e0, 0x09e3, 1}, + {0x09e6, 0x09fa, 1}, + {0x0a01, 0x0a03, 1}, + {0x0a05, 0x0a0a, 1}, + {0x0a0f, 0x0a10, 1}, + {0x0a13, 0x0a28, 1}, + {0x0a2a, 0x0a30, 1}, + {0x0a32, 0x0a33, 1}, + {0x0a35, 0x0a36, 1}, + {0x0a38, 0x0a39, 1}, + {0x0a3c, 0x0a3e, 2}, + {0x0a3f, 0x0a42, 1}, + {0x0a47, 0x0a48, 1}, + {0x0a4b, 0x0a4d, 1}, + {0x0a59, 0x0a5c, 1}, + {0x0a5e, 0x0a66, 8}, + {0x0a67, 0x0a74, 1}, + {0x0a81, 0x0a83, 1}, + {0x0a85, 0x0a8d, 1}, + {0x0a8f, 0x0a91, 1}, + {0x0a93, 0x0aa8, 1}, + {0x0aaa, 0x0ab0, 1}, + {0x0ab2, 0x0ab3, 1}, + {0x0ab5, 0x0ab9, 1}, + {0x0abc, 0x0ac5, 1}, + {0x0ac7, 0x0ac9, 1}, + {0x0acb, 0x0acd, 1}, + {0x0ad0, 0x0ae0, 16}, + {0x0ae1, 0x0ae3, 1}, + {0x0ae6, 0x0aef, 1}, + {0x0af1, 0x0b01, 16}, + {0x0b02, 0x0b03, 1}, + {0x0b05, 0x0b0c, 1}, + {0x0b0f, 0x0b10, 1}, + {0x0b13, 0x0b28, 1}, + {0x0b2a, 0x0b30, 1}, + {0x0b32, 0x0b33, 1}, + {0x0b35, 0x0b39, 1}, + {0x0b3c, 0x0b43, 1}, + {0x0b47, 0x0b48, 1}, + {0x0b4b, 0x0b4d, 1}, + {0x0b56, 0x0b57, 1}, + {0x0b5c, 0x0b5d, 1}, + {0x0b5f, 0x0b61, 1}, + {0x0b66, 0x0b71, 1}, + {0x0b82, 0x0b83, 1}, + {0x0b85, 0x0b8a, 1}, + {0x0b8e, 0x0b90, 1}, + {0x0b92, 0x0b95, 1}, + {0x0b99, 0x0b9a, 1}, + {0x0b9c, 0x0b9e, 2}, + {0x0b9f, 0x0ba3, 4}, + {0x0ba4, 0x0ba8, 4}, + {0x0ba9, 0x0baa, 1}, + {0x0bae, 0x0bb9, 1}, + {0x0bbe, 0x0bc2, 1}, + {0x0bc6, 0x0bc8, 1}, + {0x0bca, 0x0bcd, 1}, + {0x0bd7, 0x0be6, 15}, + {0x0be7, 0x0bfa, 1}, + {0x0c01, 0x0c03, 1}, + {0x0c05, 0x0c0c, 1}, + {0x0c0e, 0x0c10, 1}, + {0x0c12, 0x0c28, 1}, + {0x0c2a, 0x0c33, 1}, + {0x0c35, 0x0c39, 1}, + {0x0c3e, 0x0c44, 1}, + {0x0c46, 0x0c48, 1}, + {0x0c4a, 0x0c4d, 1}, + {0x0c55, 0x0c56, 1}, + {0x0c60, 0x0c61, 1}, + {0x0c66, 0x0c6f, 1}, + {0x0c82, 0x0c83, 1}, + {0x0c85, 0x0c8c, 1}, + {0x0c8e, 0x0c90, 1}, + {0x0c92, 0x0ca8, 1}, + {0x0caa, 0x0cb3, 1}, + {0x0cb5, 0x0cb9, 1}, + {0x0cbc, 0x0cc4, 1}, + {0x0cc6, 0x0cc8, 1}, + {0x0cca, 0x0ccd, 1}, + {0x0cd5, 0x0cd6, 1}, + {0x0cde, 0x0ce0, 2}, + {0x0ce1, 0x0ce3, 1}, + {0x0ce6, 0x0cef, 1}, + {0x0cf1, 0x0cf2, 1}, + {0x0d02, 0x0d03, 1}, + {0x0d05, 0x0d0c, 1}, + {0x0d0e, 0x0d10, 1}, + {0x0d12, 0x0d28, 1}, + {0x0d2a, 0x0d39, 1}, + {0x0d3e, 0x0d43, 1}, + {0x0d46, 0x0d48, 1}, + {0x0d4a, 0x0d4d, 1}, + {0x0d57, 0x0d60, 9}, + {0x0d61, 0x0d66, 5}, + {0x0d67, 0x0d6f, 1}, + {0x0d82, 0x0d83, 1}, + {0x0d85, 0x0d96, 1}, + {0x0d9a, 0x0db1, 1}, + {0x0db3, 0x0dbb, 1}, + {0x0dbd, 0x0dc0, 3}, + {0x0dc1, 0x0dc6, 1}, + {0x0dca, 0x0dcf, 5}, + {0x0dd0, 0x0dd4, 1}, + {0x0dd6, 0x0dd8, 2}, + {0x0dd9, 0x0ddf, 1}, + {0x0df2, 0x0df4, 1}, + {0x0e01, 0x0e3a, 1}, + {0x0e3f, 0x0e5b, 1}, + {0x0e81, 0x0e82, 1}, + {0x0e84, 0x0e87, 3}, + {0x0e88, 0x0e8a, 2}, + {0x0e8d, 0x0e94, 7}, + {0x0e95, 0x0e97, 1}, + {0x0e99, 0x0e9f, 1}, + {0x0ea1, 0x0ea3, 1}, + {0x0ea5, 0x0ea7, 2}, + {0x0eaa, 0x0eab, 1}, + {0x0ead, 0x0eb9, 1}, + {0x0ebb, 0x0ebd, 1}, + {0x0ec0, 0x0ec4, 1}, + {0x0ec6, 0x0ec8, 2}, + {0x0ec9, 0x0ecd, 1}, + {0x0ed0, 0x0ed9, 1}, + {0x0edc, 0x0edd, 1}, + {0x0f00, 0x0f47, 1}, + {0x0f49, 0x0f6a, 1}, + {0x0f71, 0x0f8b, 1}, + {0x0f90, 0x0f97, 1}, + {0x0f99, 0x0fbc, 1}, + {0x0fbe, 0x0fcc, 1}, + {0x0fcf, 0x0fd1, 1}, + {0x1000, 0x1021, 1}, + {0x1023, 0x1027, 1}, + {0x1029, 0x102a, 1}, + {0x102c, 0x1032, 1}, + {0x1036, 0x1039, 1}, + {0x1040, 0x1059, 1}, + {0x10a0, 0x10c5, 1}, + {0x10d0, 0x10fc, 1}, + {0x1100, 0x1159, 1}, + {0x115f, 0x11a2, 1}, + {0x11a8, 0x11f9, 1}, + {0x1200, 0x1248, 1}, + {0x124a, 0x124d, 1}, + {0x1250, 0x1256, 1}, + {0x1258, 0x125a, 2}, + {0x125b, 0x125d, 1}, + {0x1260, 0x1288, 1}, + {0x128a, 0x128d, 1}, + {0x1290, 0x12b0, 1}, + {0x12b2, 0x12b5, 1}, + {0x12b8, 0x12be, 1}, + {0x12c0, 0x12c2, 2}, + {0x12c3, 0x12c5, 1}, + {0x12c8, 0x12d6, 1}, + {0x12d8, 0x1310, 1}, + {0x1312, 0x1315, 1}, + {0x1318, 0x135a, 1}, + {0x135f, 0x137c, 1}, + {0x1380, 0x1399, 1}, + {0x13a0, 0x13f4, 1}, + {0x1401, 0x1676, 1}, + {0x1680, 0x169c, 1}, + {0x16a0, 0x16f0, 1}, + {0x1700, 0x170c, 1}, + {0x170e, 0x1714, 1}, + {0x1720, 0x1736, 1}, + {0x1740, 0x1753, 1}, + {0x1760, 0x176c, 1}, + {0x176e, 0x1770, 1}, + {0x1772, 0x1773, 1}, + {0x1780, 0x17dd, 1}, + {0x17e0, 0x17e9, 1}, + {0x17f0, 0x17f9, 1}, + {0x1800, 0x180e, 1}, + {0x1810, 0x1819, 1}, + {0x1820, 0x1877, 1}, + {0x1880, 0x18a9, 1}, + {0x1900, 0x191c, 1}, + {0x1920, 0x192b, 1}, + {0x1930, 0x193b, 1}, + {0x1940, 0x1944, 4}, + {0x1945, 0x196d, 1}, + {0x1970, 0x1974, 1}, + {0x1980, 0x19a9, 1}, + {0x19b0, 0x19c9, 1}, + {0x19d0, 0x19d9, 1}, + {0x19de, 0x1a1b, 1}, + {0x1a1e, 0x1a1f, 1}, + {0x1b00, 0x1b4b, 1}, + {0x1b50, 0x1b7c, 1}, + {0x1d00, 0x1dca, 1}, + {0x1dfe, 0x1e9b, 1}, + {0x1ea0, 0x1ef9, 1}, + {0x1f00, 0x1f15, 1}, + {0x1f18, 0x1f1d, 1}, + {0x1f20, 0x1f45, 1}, + {0x1f48, 0x1f4d, 1}, + {0x1f50, 0x1f57, 1}, + {0x1f59, 0x1f5f, 2}, + {0x1f60, 0x1f7d, 1}, + {0x1f80, 0x1fb4, 1}, + {0x1fb6, 0x1fc4, 1}, + {0x1fc6, 0x1fd3, 1}, + {0x1fd6, 0x1fdb, 1}, + {0x1fdd, 0x1fef, 1}, + {0x1ff2, 0x1ff4, 1}, + {0x1ff6, 0x1ffe, 1}, + {0x2000, 0x2063, 1}, + {0x206a, 0x2071, 1}, + {0x2074, 0x208e, 1}, + {0x2090, 0x2094, 1}, + {0x20a0, 0x20b5, 1}, + {0x20d0, 0x20ef, 1}, + {0x2100, 0x214e, 1}, + {0x2153, 0x2184, 1}, + {0x2190, 0x23e7, 1}, + {0x2400, 0x2426, 1}, + {0x2440, 0x244a, 1}, + {0x2460, 0x269c, 1}, + {0x26a0, 0x26b2, 1}, + {0x2701, 0x2704, 1}, + {0x2706, 0x2709, 1}, + {0x270c, 0x2727, 1}, + {0x2729, 0x274b, 1}, + {0x274d, 0x274f, 2}, + {0x2750, 0x2752, 1}, + {0x2756, 0x2758, 2}, + {0x2759, 0x275e, 1}, + {0x2761, 0x2794, 1}, + {0x2798, 0x27af, 1}, + {0x27b1, 0x27be, 1}, + {0x27c0, 0x27ca, 1}, + {0x27d0, 0x27eb, 1}, + {0x27f0, 0x2b1a, 1}, + {0x2b20, 0x2b23, 1}, + {0x2c00, 0x2c2e, 1}, + {0x2c30, 0x2c5e, 1}, + {0x2c60, 0x2c6c, 1}, + {0x2c74, 0x2c77, 1}, + {0x2c80, 0x2cea, 1}, + {0x2cf9, 0x2d25, 1}, + {0x2d30, 0x2d65, 1}, + {0x2d6f, 0x2d80, 17}, + {0x2d81, 0x2d96, 1}, + {0x2da0, 0x2da6, 1}, + {0x2da8, 0x2dae, 1}, + {0x2db0, 0x2db6, 1}, + {0x2db8, 0x2dbe, 1}, + {0x2dc0, 0x2dc6, 1}, + {0x2dc8, 0x2dce, 1}, + {0x2dd0, 0x2dd6, 1}, + {0x2dd8, 0x2dde, 1}, + {0x2e00, 0x2e17, 1}, + {0x2e1c, 0x2e1d, 1}, + {0x2e80, 0x2e99, 1}, + {0x2e9b, 0x2ef3, 1}, + {0x2f00, 0x2fd5, 1}, + {0x2ff0, 0x2ffb, 1}, + {0x3000, 0x303f, 1}, + {0x3041, 0x3096, 1}, + {0x3099, 0x30ff, 1}, + {0x3105, 0x312c, 1}, + {0x3131, 0x318e, 1}, + {0x3190, 0x31b7, 1}, + {0x31c0, 0x31cf, 1}, + {0x31f0, 0x321e, 1}, + {0x3220, 0x3243, 1}, + {0x3250, 0x32fe, 1}, + {0x3300, 0x4db5, 1}, + {0x4dc0, 0x9fbb, 1}, + {0xa000, 0xa48c, 1}, + {0xa490, 0xa4c6, 1}, + {0xa700, 0xa71a, 1}, + {0xa720, 0xa721, 1}, + {0xa800, 0xa82b, 1}, + {0xa840, 0xa877, 1}, + {0xac00, 0xd7a3, 1}, + {0xd800, 0xfa2d, 1}, + {0xfa30, 0xfa6a, 1}, + {0xfa70, 0xfad9, 1}, + {0xfb00, 0xfb06, 1}, + {0xfb13, 0xfb17, 1}, + {0xfb1d, 0xfb36, 1}, + {0xfb38, 0xfb3c, 1}, + {0xfb3e, 0xfb40, 2}, + {0xfb41, 0xfb43, 2}, + {0xfb44, 0xfb46, 2}, + {0xfb47, 0xfbb1, 1}, + {0xfbd3, 0xfd3f, 1}, + {0xfd50, 0xfd8f, 1}, + {0xfd92, 0xfdc7, 1}, + {0xfdf0, 0xfdfd, 1}, + {0xfe00, 0xfe19, 1}, + {0xfe20, 0xfe23, 1}, + {0xfe30, 0xfe52, 1}, + {0xfe54, 0xfe66, 1}, + {0xfe68, 0xfe6b, 1}, + {0xfe70, 0xfe74, 1}, + {0xfe76, 0xfefc, 1}, + {0xfeff, 0xff01, 2}, + {0xff02, 0xffbe, 1}, + {0xffc2, 0xffc7, 1}, + {0xffca, 0xffcf, 1}, + {0xffd2, 0xffd7, 1}, + {0xffda, 0xffdc, 1}, + {0xffe0, 0xffe6, 1}, + {0xffe8, 0xffee, 1}, + {0xfff9, 0xfffd, 1}, + }, + R32: []unicode.Range32{ + {0x00010000, 0x0001000b, 1}, + {0x0001000d, 0x00010026, 1}, + {0x00010028, 0x0001003a, 1}, + {0x0001003c, 0x0001003d, 1}, + {0x0001003f, 0x0001004d, 1}, + {0x00010050, 0x0001005d, 1}, + {0x00010080, 0x000100fa, 1}, + {0x00010100, 0x00010102, 1}, + {0x00010107, 0x00010133, 1}, + {0x00010137, 0x0001018a, 1}, + {0x00010300, 0x0001031e, 1}, + {0x00010320, 0x00010323, 1}, + {0x00010330, 0x0001034a, 1}, + {0x00010380, 0x0001039d, 1}, + {0x0001039f, 0x000103c3, 1}, + {0x000103c8, 0x000103d5, 1}, + {0x00010400, 0x0001049d, 1}, + {0x000104a0, 0x000104a9, 1}, + {0x00010800, 0x00010805, 1}, + {0x00010808, 0x0001080a, 2}, + {0x0001080b, 0x00010835, 1}, + {0x00010837, 0x00010838, 1}, + {0x0001083c, 0x0001083f, 3}, + {0x00010900, 0x00010919, 1}, + {0x0001091f, 0x00010a00, 225}, + {0x00010a01, 0x00010a03, 1}, + {0x00010a05, 0x00010a06, 1}, + {0x00010a0c, 0x00010a13, 1}, + {0x00010a15, 0x00010a17, 1}, + {0x00010a19, 0x00010a33, 1}, + {0x00010a38, 0x00010a3a, 1}, + {0x00010a3f, 0x00010a47, 1}, + {0x00010a50, 0x00010a58, 1}, + {0x00012000, 0x0001236e, 1}, + {0x00012400, 0x00012462, 1}, + {0x00012470, 0x00012473, 1}, + {0x0001d000, 0x0001d0f5, 1}, + {0x0001d100, 0x0001d126, 1}, + {0x0001d12a, 0x0001d1dd, 1}, + {0x0001d200, 0x0001d245, 1}, + {0x0001d300, 0x0001d356, 1}, + {0x0001d360, 0x0001d371, 1}, + {0x0001d400, 0x0001d454, 1}, + {0x0001d456, 0x0001d49c, 1}, + {0x0001d49e, 0x0001d49f, 1}, + {0x0001d4a2, 0x0001d4a5, 3}, + {0x0001d4a6, 0x0001d4a9, 3}, + {0x0001d4aa, 0x0001d4ac, 1}, + {0x0001d4ae, 0x0001d4b9, 1}, + {0x0001d4bb, 0x0001d4bd, 2}, + {0x0001d4be, 0x0001d4c3, 1}, + {0x0001d4c5, 0x0001d505, 1}, + {0x0001d507, 0x0001d50a, 1}, + {0x0001d50d, 0x0001d514, 1}, + {0x0001d516, 0x0001d51c, 1}, + {0x0001d51e, 0x0001d539, 1}, + {0x0001d53b, 0x0001d53e, 1}, + {0x0001d540, 0x0001d544, 1}, + {0x0001d546, 0x0001d54a, 4}, + {0x0001d54b, 0x0001d550, 1}, + {0x0001d552, 0x0001d6a5, 1}, + {0x0001d6a8, 0x0001d7cb, 1}, + {0x0001d7ce, 0x0001d7ff, 1}, + {0x00020000, 0x0002a6d6, 1}, + {0x0002f800, 0x0002fa1d, 1}, + {0x000e0001, 0x000e0020, 31}, + {0x000e0021, 0x000e007f, 1}, + {0x000e0100, 0x000e01ef, 1}, + {0x000f0000, 0x000ffffd, 1}, + {0x00100000, 0x0010fffd, 1}, + }, + LatinOffset: 0, +} + +// size 3152 bytes (3 KiB) +var assigned5_1_0 = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x0000, 0x0377, 1}, + {0x037a, 0x037e, 1}, + {0x0384, 0x038a, 1}, + {0x038c, 0x038e, 2}, + {0x038f, 0x03a1, 1}, + {0x03a3, 0x0523, 1}, + {0x0531, 0x0556, 1}, + {0x0559, 0x055f, 1}, + {0x0561, 0x0587, 1}, + {0x0589, 0x058a, 1}, + {0x0591, 0x05c7, 1}, + {0x05d0, 0x05ea, 1}, + {0x05f0, 0x05f4, 1}, + {0x0600, 0x0603, 1}, + {0x0606, 0x061b, 1}, + {0x061e, 0x061f, 1}, + {0x0621, 0x065e, 1}, + {0x0660, 0x070d, 1}, + {0x070f, 0x074a, 1}, + {0x074d, 0x07b1, 1}, + {0x07c0, 0x07fa, 1}, + {0x0901, 0x0939, 1}, + {0x093c, 0x094d, 1}, + {0x0950, 0x0954, 1}, + {0x0958, 0x0972, 1}, + {0x097b, 0x097f, 1}, + {0x0981, 0x0983, 1}, + {0x0985, 0x098c, 1}, + {0x098f, 0x0990, 1}, + {0x0993, 0x09a8, 1}, + {0x09aa, 0x09b0, 1}, + {0x09b2, 0x09b6, 4}, + {0x09b7, 0x09b9, 1}, + {0x09bc, 0x09c4, 1}, + {0x09c7, 0x09c8, 1}, + {0x09cb, 0x09ce, 1}, + {0x09d7, 0x09dc, 5}, + {0x09dd, 0x09df, 2}, + {0x09e0, 0x09e3, 1}, + {0x09e6, 0x09fa, 1}, + {0x0a01, 0x0a03, 1}, + {0x0a05, 0x0a0a, 1}, + {0x0a0f, 0x0a10, 1}, + {0x0a13, 0x0a28, 1}, + {0x0a2a, 0x0a30, 1}, + {0x0a32, 0x0a33, 1}, + {0x0a35, 0x0a36, 1}, + {0x0a38, 0x0a39, 1}, + {0x0a3c, 0x0a3e, 2}, + {0x0a3f, 0x0a42, 1}, + {0x0a47, 0x0a48, 1}, + {0x0a4b, 0x0a4d, 1}, + {0x0a51, 0x0a59, 8}, + {0x0a5a, 0x0a5c, 1}, + {0x0a5e, 0x0a66, 8}, + {0x0a67, 0x0a75, 1}, + {0x0a81, 0x0a83, 1}, + {0x0a85, 0x0a8d, 1}, + {0x0a8f, 0x0a91, 1}, + {0x0a93, 0x0aa8, 1}, + {0x0aaa, 0x0ab0, 1}, + {0x0ab2, 0x0ab3, 1}, + {0x0ab5, 0x0ab9, 1}, + {0x0abc, 0x0ac5, 1}, + {0x0ac7, 0x0ac9, 1}, + {0x0acb, 0x0acd, 1}, + {0x0ad0, 0x0ae0, 16}, + {0x0ae1, 0x0ae3, 1}, + {0x0ae6, 0x0aef, 1}, + {0x0af1, 0x0b01, 16}, + {0x0b02, 0x0b03, 1}, + {0x0b05, 0x0b0c, 1}, + {0x0b0f, 0x0b10, 1}, + {0x0b13, 0x0b28, 1}, + {0x0b2a, 0x0b30, 1}, + {0x0b32, 0x0b33, 1}, + {0x0b35, 0x0b39, 1}, + {0x0b3c, 0x0b44, 1}, + {0x0b47, 0x0b48, 1}, + {0x0b4b, 0x0b4d, 1}, + {0x0b56, 0x0b57, 1}, + {0x0b5c, 0x0b5d, 1}, + {0x0b5f, 0x0b63, 1}, + {0x0b66, 0x0b71, 1}, + {0x0b82, 0x0b83, 1}, + {0x0b85, 0x0b8a, 1}, + {0x0b8e, 0x0b90, 1}, + {0x0b92, 0x0b95, 1}, + {0x0b99, 0x0b9a, 1}, + {0x0b9c, 0x0b9e, 2}, + {0x0b9f, 0x0ba3, 4}, + {0x0ba4, 0x0ba8, 4}, + {0x0ba9, 0x0baa, 1}, + {0x0bae, 0x0bb9, 1}, + {0x0bbe, 0x0bc2, 1}, + {0x0bc6, 0x0bc8, 1}, + {0x0bca, 0x0bcd, 1}, + {0x0bd0, 0x0bd7, 7}, + {0x0be6, 0x0bfa, 1}, + {0x0c01, 0x0c03, 1}, + {0x0c05, 0x0c0c, 1}, + {0x0c0e, 0x0c10, 1}, + {0x0c12, 0x0c28, 1}, + {0x0c2a, 0x0c33, 1}, + {0x0c35, 0x0c39, 1}, + {0x0c3d, 0x0c44, 1}, + {0x0c46, 0x0c48, 1}, + {0x0c4a, 0x0c4d, 1}, + {0x0c55, 0x0c56, 1}, + {0x0c58, 0x0c59, 1}, + {0x0c60, 0x0c63, 1}, + {0x0c66, 0x0c6f, 1}, + {0x0c78, 0x0c7f, 1}, + {0x0c82, 0x0c83, 1}, + {0x0c85, 0x0c8c, 1}, + {0x0c8e, 0x0c90, 1}, + {0x0c92, 0x0ca8, 1}, + {0x0caa, 0x0cb3, 1}, + {0x0cb5, 0x0cb9, 1}, + {0x0cbc, 0x0cc4, 1}, + {0x0cc6, 0x0cc8, 1}, + {0x0cca, 0x0ccd, 1}, + {0x0cd5, 0x0cd6, 1}, + {0x0cde, 0x0ce0, 2}, + {0x0ce1, 0x0ce3, 1}, + {0x0ce6, 0x0cef, 1}, + {0x0cf1, 0x0cf2, 1}, + {0x0d02, 0x0d03, 1}, + {0x0d05, 0x0d0c, 1}, + {0x0d0e, 0x0d10, 1}, + {0x0d12, 0x0d28, 1}, + {0x0d2a, 0x0d39, 1}, + {0x0d3d, 0x0d44, 1}, + {0x0d46, 0x0d48, 1}, + {0x0d4a, 0x0d4d, 1}, + {0x0d57, 0x0d60, 9}, + {0x0d61, 0x0d63, 1}, + {0x0d66, 0x0d75, 1}, + {0x0d79, 0x0d7f, 1}, + {0x0d82, 0x0d83, 1}, + {0x0d85, 0x0d96, 1}, + {0x0d9a, 0x0db1, 1}, + {0x0db3, 0x0dbb, 1}, + {0x0dbd, 0x0dc0, 3}, + {0x0dc1, 0x0dc6, 1}, + {0x0dca, 0x0dcf, 5}, + {0x0dd0, 0x0dd4, 1}, + {0x0dd6, 0x0dd8, 2}, + {0x0dd9, 0x0ddf, 1}, + {0x0df2, 0x0df4, 1}, + {0x0e01, 0x0e3a, 1}, + {0x0e3f, 0x0e5b, 1}, + {0x0e81, 0x0e82, 1}, + {0x0e84, 0x0e87, 3}, + {0x0e88, 0x0e8a, 2}, + {0x0e8d, 0x0e94, 7}, + {0x0e95, 0x0e97, 1}, + {0x0e99, 0x0e9f, 1}, + {0x0ea1, 0x0ea3, 1}, + {0x0ea5, 0x0ea7, 2}, + {0x0eaa, 0x0eab, 1}, + {0x0ead, 0x0eb9, 1}, + {0x0ebb, 0x0ebd, 1}, + {0x0ec0, 0x0ec4, 1}, + {0x0ec6, 0x0ec8, 2}, + {0x0ec9, 0x0ecd, 1}, + {0x0ed0, 0x0ed9, 1}, + {0x0edc, 0x0edd, 1}, + {0x0f00, 0x0f47, 1}, + {0x0f49, 0x0f6c, 1}, + {0x0f71, 0x0f8b, 1}, + {0x0f90, 0x0f97, 1}, + {0x0f99, 0x0fbc, 1}, + {0x0fbe, 0x0fcc, 1}, + {0x0fce, 0x0fd4, 1}, + {0x1000, 0x1099, 1}, + {0x109e, 0x10c5, 1}, + {0x10d0, 0x10fc, 1}, + {0x1100, 0x1159, 1}, + {0x115f, 0x11a2, 1}, + {0x11a8, 0x11f9, 1}, + {0x1200, 0x1248, 1}, + {0x124a, 0x124d, 1}, + {0x1250, 0x1256, 1}, + {0x1258, 0x125a, 2}, + {0x125b, 0x125d, 1}, + {0x1260, 0x1288, 1}, + {0x128a, 0x128d, 1}, + {0x1290, 0x12b0, 1}, + {0x12b2, 0x12b5, 1}, + {0x12b8, 0x12be, 1}, + {0x12c0, 0x12c2, 2}, + {0x12c3, 0x12c5, 1}, + {0x12c8, 0x12d6, 1}, + {0x12d8, 0x1310, 1}, + {0x1312, 0x1315, 1}, + {0x1318, 0x135a, 1}, + {0x135f, 0x137c, 1}, + {0x1380, 0x1399, 1}, + {0x13a0, 0x13f4, 1}, + {0x1401, 0x1676, 1}, + {0x1680, 0x169c, 1}, + {0x16a0, 0x16f0, 1}, + {0x1700, 0x170c, 1}, + {0x170e, 0x1714, 1}, + {0x1720, 0x1736, 1}, + {0x1740, 0x1753, 1}, + {0x1760, 0x176c, 1}, + {0x176e, 0x1770, 1}, + {0x1772, 0x1773, 1}, + {0x1780, 0x17dd, 1}, + {0x17e0, 0x17e9, 1}, + {0x17f0, 0x17f9, 1}, + {0x1800, 0x180e, 1}, + {0x1810, 0x1819, 1}, + {0x1820, 0x1877, 1}, + {0x1880, 0x18aa, 1}, + {0x1900, 0x191c, 1}, + {0x1920, 0x192b, 1}, + {0x1930, 0x193b, 1}, + {0x1940, 0x1944, 4}, + {0x1945, 0x196d, 1}, + {0x1970, 0x1974, 1}, + {0x1980, 0x19a9, 1}, + {0x19b0, 0x19c9, 1}, + {0x19d0, 0x19d9, 1}, + {0x19de, 0x1a1b, 1}, + {0x1a1e, 0x1a1f, 1}, + {0x1b00, 0x1b4b, 1}, + {0x1b50, 0x1b7c, 1}, + {0x1b80, 0x1baa, 1}, + {0x1bae, 0x1bb9, 1}, + {0x1c00, 0x1c37, 1}, + {0x1c3b, 0x1c49, 1}, + {0x1c4d, 0x1c7f, 1}, + {0x1d00, 0x1de6, 1}, + {0x1dfe, 0x1f15, 1}, + {0x1f18, 0x1f1d, 1}, + {0x1f20, 0x1f45, 1}, + {0x1f48, 0x1f4d, 1}, + {0x1f50, 0x1f57, 1}, + {0x1f59, 0x1f5f, 2}, + {0x1f60, 0x1f7d, 1}, + {0x1f80, 0x1fb4, 1}, + {0x1fb6, 0x1fc4, 1}, + {0x1fc6, 0x1fd3, 1}, + {0x1fd6, 0x1fdb, 1}, + {0x1fdd, 0x1fef, 1}, + {0x1ff2, 0x1ff4, 1}, + {0x1ff6, 0x1ffe, 1}, + {0x2000, 0x2064, 1}, + {0x206a, 0x2071, 1}, + {0x2074, 0x208e, 1}, + {0x2090, 0x2094, 1}, + {0x20a0, 0x20b5, 1}, + {0x20d0, 0x20f0, 1}, + {0x2100, 0x214f, 1}, + {0x2153, 0x2188, 1}, + {0x2190, 0x23e7, 1}, + {0x2400, 0x2426, 1}, + {0x2440, 0x244a, 1}, + {0x2460, 0x269d, 1}, + {0x26a0, 0x26bc, 1}, + {0x26c0, 0x26c3, 1}, + {0x2701, 0x2704, 1}, + {0x2706, 0x2709, 1}, + {0x270c, 0x2727, 1}, + {0x2729, 0x274b, 1}, + {0x274d, 0x274f, 2}, + {0x2750, 0x2752, 1}, + {0x2756, 0x2758, 2}, + {0x2759, 0x275e, 1}, + {0x2761, 0x2794, 1}, + {0x2798, 0x27af, 1}, + {0x27b1, 0x27be, 1}, + {0x27c0, 0x27ca, 1}, + {0x27cc, 0x27d0, 4}, + {0x27d1, 0x2b4c, 1}, + {0x2b50, 0x2b54, 1}, + {0x2c00, 0x2c2e, 1}, + {0x2c30, 0x2c5e, 1}, + {0x2c60, 0x2c6f, 1}, + {0x2c71, 0x2c7d, 1}, + {0x2c80, 0x2cea, 1}, + {0x2cf9, 0x2d25, 1}, + {0x2d30, 0x2d65, 1}, + {0x2d6f, 0x2d80, 17}, + {0x2d81, 0x2d96, 1}, + {0x2da0, 0x2da6, 1}, + {0x2da8, 0x2dae, 1}, + {0x2db0, 0x2db6, 1}, + {0x2db8, 0x2dbe, 1}, + {0x2dc0, 0x2dc6, 1}, + {0x2dc8, 0x2dce, 1}, + {0x2dd0, 0x2dd6, 1}, + {0x2dd8, 0x2dde, 1}, + {0x2de0, 0x2e30, 1}, + {0x2e80, 0x2e99, 1}, + {0x2e9b, 0x2ef3, 1}, + {0x2f00, 0x2fd5, 1}, + {0x2ff0, 0x2ffb, 1}, + {0x3000, 0x303f, 1}, + {0x3041, 0x3096, 1}, + {0x3099, 0x30ff, 1}, + {0x3105, 0x312d, 1}, + {0x3131, 0x318e, 1}, + {0x3190, 0x31b7, 1}, + {0x31c0, 0x31e3, 1}, + {0x31f0, 0x321e, 1}, + {0x3220, 0x3243, 1}, + {0x3250, 0x32fe, 1}, + {0x3300, 0x4db5, 1}, + {0x4dc0, 0x9fc3, 1}, + {0xa000, 0xa48c, 1}, + {0xa490, 0xa4c6, 1}, + {0xa500, 0xa62b, 1}, + {0xa640, 0xa65f, 1}, + {0xa662, 0xa673, 1}, + {0xa67c, 0xa697, 1}, + {0xa700, 0xa78c, 1}, + {0xa7fb, 0xa82b, 1}, + {0xa840, 0xa877, 1}, + {0xa880, 0xa8c4, 1}, + {0xa8ce, 0xa8d9, 1}, + {0xa900, 0xa953, 1}, + {0xa95f, 0xaa00, 161}, + {0xaa01, 0xaa36, 1}, + {0xaa40, 0xaa4d, 1}, + {0xaa50, 0xaa59, 1}, + {0xaa5c, 0xaa5f, 1}, + {0xac00, 0xd7a3, 1}, + {0xd800, 0xfa2d, 1}, + {0xfa30, 0xfa6a, 1}, + {0xfa70, 0xfad9, 1}, + {0xfb00, 0xfb06, 1}, + {0xfb13, 0xfb17, 1}, + {0xfb1d, 0xfb36, 1}, + {0xfb38, 0xfb3c, 1}, + {0xfb3e, 0xfb40, 2}, + {0xfb41, 0xfb43, 2}, + {0xfb44, 0xfb46, 2}, + {0xfb47, 0xfbb1, 1}, + {0xfbd3, 0xfd3f, 1}, + {0xfd50, 0xfd8f, 1}, + {0xfd92, 0xfdc7, 1}, + {0xfdf0, 0xfdfd, 1}, + {0xfe00, 0xfe19, 1}, + {0xfe20, 0xfe26, 1}, + {0xfe30, 0xfe52, 1}, + {0xfe54, 0xfe66, 1}, + {0xfe68, 0xfe6b, 1}, + {0xfe70, 0xfe74, 1}, + {0xfe76, 0xfefc, 1}, + {0xfeff, 0xff01, 2}, + {0xff02, 0xffbe, 1}, + {0xffc2, 0xffc7, 1}, + {0xffca, 0xffcf, 1}, + {0xffd2, 0xffd7, 1}, + {0xffda, 0xffdc, 1}, + {0xffe0, 0xffe6, 1}, + {0xffe8, 0xffee, 1}, + {0xfff9, 0xfffd, 1}, + }, + R32: []unicode.Range32{ + {0x00010000, 0x0001000b, 1}, + {0x0001000d, 0x00010026, 1}, + {0x00010028, 0x0001003a, 1}, + {0x0001003c, 0x0001003d, 1}, + {0x0001003f, 0x0001004d, 1}, + {0x00010050, 0x0001005d, 1}, + {0x00010080, 0x000100fa, 1}, + {0x00010100, 0x00010102, 1}, + {0x00010107, 0x00010133, 1}, + {0x00010137, 0x0001018a, 1}, + {0x00010190, 0x0001019b, 1}, + {0x000101d0, 0x000101fd, 1}, + {0x00010280, 0x0001029c, 1}, + {0x000102a0, 0x000102d0, 1}, + {0x00010300, 0x0001031e, 1}, + {0x00010320, 0x00010323, 1}, + {0x00010330, 0x0001034a, 1}, + {0x00010380, 0x0001039d, 1}, + {0x0001039f, 0x000103c3, 1}, + {0x000103c8, 0x000103d5, 1}, + {0x00010400, 0x0001049d, 1}, + {0x000104a0, 0x000104a9, 1}, + {0x00010800, 0x00010805, 1}, + {0x00010808, 0x0001080a, 2}, + {0x0001080b, 0x00010835, 1}, + {0x00010837, 0x00010838, 1}, + {0x0001083c, 0x0001083f, 3}, + {0x00010900, 0x00010919, 1}, + {0x0001091f, 0x00010939, 1}, + {0x0001093f, 0x00010a00, 193}, + {0x00010a01, 0x00010a03, 1}, + {0x00010a05, 0x00010a06, 1}, + {0x00010a0c, 0x00010a13, 1}, + {0x00010a15, 0x00010a17, 1}, + {0x00010a19, 0x00010a33, 1}, + {0x00010a38, 0x00010a3a, 1}, + {0x00010a3f, 0x00010a47, 1}, + {0x00010a50, 0x00010a58, 1}, + {0x00012000, 0x0001236e, 1}, + {0x00012400, 0x00012462, 1}, + {0x00012470, 0x00012473, 1}, + {0x0001d000, 0x0001d0f5, 1}, + {0x0001d100, 0x0001d126, 1}, + {0x0001d129, 0x0001d1dd, 1}, + {0x0001d200, 0x0001d245, 1}, + {0x0001d300, 0x0001d356, 1}, + {0x0001d360, 0x0001d371, 1}, + {0x0001d400, 0x0001d454, 1}, + {0x0001d456, 0x0001d49c, 1}, + {0x0001d49e, 0x0001d49f, 1}, + {0x0001d4a2, 0x0001d4a5, 3}, + {0x0001d4a6, 0x0001d4a9, 3}, + {0x0001d4aa, 0x0001d4ac, 1}, + {0x0001d4ae, 0x0001d4b9, 1}, + {0x0001d4bb, 0x0001d4bd, 2}, + {0x0001d4be, 0x0001d4c3, 1}, + {0x0001d4c5, 0x0001d505, 1}, + {0x0001d507, 0x0001d50a, 1}, + {0x0001d50d, 0x0001d514, 1}, + {0x0001d516, 0x0001d51c, 1}, + {0x0001d51e, 0x0001d539, 1}, + {0x0001d53b, 0x0001d53e, 1}, + {0x0001d540, 0x0001d544, 1}, + {0x0001d546, 0x0001d54a, 4}, + {0x0001d54b, 0x0001d550, 1}, + {0x0001d552, 0x0001d6a5, 1}, + {0x0001d6a8, 0x0001d7cb, 1}, + {0x0001d7ce, 0x0001d7ff, 1}, + {0x0001f000, 0x0001f02b, 1}, + {0x0001f030, 0x0001f093, 1}, + {0x00020000, 0x0002a6d6, 1}, + {0x0002f800, 0x0002fa1d, 1}, + {0x000e0001, 0x000e0020, 31}, + {0x000e0021, 0x000e007f, 1}, + {0x000e0100, 0x000e01ef, 1}, + {0x000f0000, 0x000ffffd, 1}, + {0x00100000, 0x0010fffd, 1}, + }, + LatinOffset: 0, +} + +// size 3518 bytes (3 KiB) +var assigned5_2_0 = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x0000, 0x0377, 1}, + {0x037a, 0x037e, 1}, + {0x0384, 0x038a, 1}, + {0x038c, 0x038e, 2}, + {0x038f, 0x03a1, 1}, + {0x03a3, 0x0525, 1}, + {0x0531, 0x0556, 1}, + {0x0559, 0x055f, 1}, + {0x0561, 0x0587, 1}, + {0x0589, 0x058a, 1}, + {0x0591, 0x05c7, 1}, + {0x05d0, 0x05ea, 1}, + {0x05f0, 0x05f4, 1}, + {0x0600, 0x0603, 1}, + {0x0606, 0x061b, 1}, + {0x061e, 0x061f, 1}, + {0x0621, 0x065e, 1}, + {0x0660, 0x070d, 1}, + {0x070f, 0x074a, 1}, + {0x074d, 0x07b1, 1}, + {0x07c0, 0x07fa, 1}, + {0x0800, 0x082d, 1}, + {0x0830, 0x083e, 1}, + {0x0900, 0x0939, 1}, + {0x093c, 0x094e, 1}, + {0x0950, 0x0955, 1}, + {0x0958, 0x0972, 1}, + {0x0979, 0x097f, 1}, + {0x0981, 0x0983, 1}, + {0x0985, 0x098c, 1}, + {0x098f, 0x0990, 1}, + {0x0993, 0x09a8, 1}, + {0x09aa, 0x09b0, 1}, + {0x09b2, 0x09b6, 4}, + {0x09b7, 0x09b9, 1}, + {0x09bc, 0x09c4, 1}, + {0x09c7, 0x09c8, 1}, + {0x09cb, 0x09ce, 1}, + {0x09d7, 0x09dc, 5}, + {0x09dd, 0x09df, 2}, + {0x09e0, 0x09e3, 1}, + {0x09e6, 0x09fb, 1}, + {0x0a01, 0x0a03, 1}, + {0x0a05, 0x0a0a, 1}, + {0x0a0f, 0x0a10, 1}, + {0x0a13, 0x0a28, 1}, + {0x0a2a, 0x0a30, 1}, + {0x0a32, 0x0a33, 1}, + {0x0a35, 0x0a36, 1}, + {0x0a38, 0x0a39, 1}, + {0x0a3c, 0x0a3e, 2}, + {0x0a3f, 0x0a42, 1}, + {0x0a47, 0x0a48, 1}, + {0x0a4b, 0x0a4d, 1}, + {0x0a51, 0x0a59, 8}, + {0x0a5a, 0x0a5c, 1}, + {0x0a5e, 0x0a66, 8}, + {0x0a67, 0x0a75, 1}, + {0x0a81, 0x0a83, 1}, + {0x0a85, 0x0a8d, 1}, + {0x0a8f, 0x0a91, 1}, + {0x0a93, 0x0aa8, 1}, + {0x0aaa, 0x0ab0, 1}, + {0x0ab2, 0x0ab3, 1}, + {0x0ab5, 0x0ab9, 1}, + {0x0abc, 0x0ac5, 1}, + {0x0ac7, 0x0ac9, 1}, + {0x0acb, 0x0acd, 1}, + {0x0ad0, 0x0ae0, 16}, + {0x0ae1, 0x0ae3, 1}, + {0x0ae6, 0x0aef, 1}, + {0x0af1, 0x0b01, 16}, + {0x0b02, 0x0b03, 1}, + {0x0b05, 0x0b0c, 1}, + {0x0b0f, 0x0b10, 1}, + {0x0b13, 0x0b28, 1}, + {0x0b2a, 0x0b30, 1}, + {0x0b32, 0x0b33, 1}, + {0x0b35, 0x0b39, 1}, + {0x0b3c, 0x0b44, 1}, + {0x0b47, 0x0b48, 1}, + {0x0b4b, 0x0b4d, 1}, + {0x0b56, 0x0b57, 1}, + {0x0b5c, 0x0b5d, 1}, + {0x0b5f, 0x0b63, 1}, + {0x0b66, 0x0b71, 1}, + {0x0b82, 0x0b83, 1}, + {0x0b85, 0x0b8a, 1}, + {0x0b8e, 0x0b90, 1}, + {0x0b92, 0x0b95, 1}, + {0x0b99, 0x0b9a, 1}, + {0x0b9c, 0x0b9e, 2}, + {0x0b9f, 0x0ba3, 4}, + {0x0ba4, 0x0ba8, 4}, + {0x0ba9, 0x0baa, 1}, + {0x0bae, 0x0bb9, 1}, + {0x0bbe, 0x0bc2, 1}, + {0x0bc6, 0x0bc8, 1}, + {0x0bca, 0x0bcd, 1}, + {0x0bd0, 0x0bd7, 7}, + {0x0be6, 0x0bfa, 1}, + {0x0c01, 0x0c03, 1}, + {0x0c05, 0x0c0c, 1}, + {0x0c0e, 0x0c10, 1}, + {0x0c12, 0x0c28, 1}, + {0x0c2a, 0x0c33, 1}, + {0x0c35, 0x0c39, 1}, + {0x0c3d, 0x0c44, 1}, + {0x0c46, 0x0c48, 1}, + {0x0c4a, 0x0c4d, 1}, + {0x0c55, 0x0c56, 1}, + {0x0c58, 0x0c59, 1}, + {0x0c60, 0x0c63, 1}, + {0x0c66, 0x0c6f, 1}, + {0x0c78, 0x0c7f, 1}, + {0x0c82, 0x0c83, 1}, + {0x0c85, 0x0c8c, 1}, + {0x0c8e, 0x0c90, 1}, + {0x0c92, 0x0ca8, 1}, + {0x0caa, 0x0cb3, 1}, + {0x0cb5, 0x0cb9, 1}, + {0x0cbc, 0x0cc4, 1}, + {0x0cc6, 0x0cc8, 1}, + {0x0cca, 0x0ccd, 1}, + {0x0cd5, 0x0cd6, 1}, + {0x0cde, 0x0ce0, 2}, + {0x0ce1, 0x0ce3, 1}, + {0x0ce6, 0x0cef, 1}, + {0x0cf1, 0x0cf2, 1}, + {0x0d02, 0x0d03, 1}, + {0x0d05, 0x0d0c, 1}, + {0x0d0e, 0x0d10, 1}, + {0x0d12, 0x0d28, 1}, + {0x0d2a, 0x0d39, 1}, + {0x0d3d, 0x0d44, 1}, + {0x0d46, 0x0d48, 1}, + {0x0d4a, 0x0d4d, 1}, + {0x0d57, 0x0d60, 9}, + {0x0d61, 0x0d63, 1}, + {0x0d66, 0x0d75, 1}, + {0x0d79, 0x0d7f, 1}, + {0x0d82, 0x0d83, 1}, + {0x0d85, 0x0d96, 1}, + {0x0d9a, 0x0db1, 1}, + {0x0db3, 0x0dbb, 1}, + {0x0dbd, 0x0dc0, 3}, + {0x0dc1, 0x0dc6, 1}, + {0x0dca, 0x0dcf, 5}, + {0x0dd0, 0x0dd4, 1}, + {0x0dd6, 0x0dd8, 2}, + {0x0dd9, 0x0ddf, 1}, + {0x0df2, 0x0df4, 1}, + {0x0e01, 0x0e3a, 1}, + {0x0e3f, 0x0e5b, 1}, + {0x0e81, 0x0e82, 1}, + {0x0e84, 0x0e87, 3}, + {0x0e88, 0x0e8a, 2}, + {0x0e8d, 0x0e94, 7}, + {0x0e95, 0x0e97, 1}, + {0x0e99, 0x0e9f, 1}, + {0x0ea1, 0x0ea3, 1}, + {0x0ea5, 0x0ea7, 2}, + {0x0eaa, 0x0eab, 1}, + {0x0ead, 0x0eb9, 1}, + {0x0ebb, 0x0ebd, 1}, + {0x0ec0, 0x0ec4, 1}, + {0x0ec6, 0x0ec8, 2}, + {0x0ec9, 0x0ecd, 1}, + {0x0ed0, 0x0ed9, 1}, + {0x0edc, 0x0edd, 1}, + {0x0f00, 0x0f47, 1}, + {0x0f49, 0x0f6c, 1}, + {0x0f71, 0x0f8b, 1}, + {0x0f90, 0x0f97, 1}, + {0x0f99, 0x0fbc, 1}, + {0x0fbe, 0x0fcc, 1}, + {0x0fce, 0x0fd8, 1}, + {0x1000, 0x10c5, 1}, + {0x10d0, 0x10fc, 1}, + {0x1100, 0x1248, 1}, + {0x124a, 0x124d, 1}, + {0x1250, 0x1256, 1}, + {0x1258, 0x125a, 2}, + {0x125b, 0x125d, 1}, + {0x1260, 0x1288, 1}, + {0x128a, 0x128d, 1}, + {0x1290, 0x12b0, 1}, + {0x12b2, 0x12b5, 1}, + {0x12b8, 0x12be, 1}, + {0x12c0, 0x12c2, 2}, + {0x12c3, 0x12c5, 1}, + {0x12c8, 0x12d6, 1}, + {0x12d8, 0x1310, 1}, + {0x1312, 0x1315, 1}, + {0x1318, 0x135a, 1}, + {0x135f, 0x137c, 1}, + {0x1380, 0x1399, 1}, + {0x13a0, 0x13f4, 1}, + {0x1400, 0x169c, 1}, + {0x16a0, 0x16f0, 1}, + {0x1700, 0x170c, 1}, + {0x170e, 0x1714, 1}, + {0x1720, 0x1736, 1}, + {0x1740, 0x1753, 1}, + {0x1760, 0x176c, 1}, + {0x176e, 0x1770, 1}, + {0x1772, 0x1773, 1}, + {0x1780, 0x17dd, 1}, + {0x17e0, 0x17e9, 1}, + {0x17f0, 0x17f9, 1}, + {0x1800, 0x180e, 1}, + {0x1810, 0x1819, 1}, + {0x1820, 0x1877, 1}, + {0x1880, 0x18aa, 1}, + {0x18b0, 0x18f5, 1}, + {0x1900, 0x191c, 1}, + {0x1920, 0x192b, 1}, + {0x1930, 0x193b, 1}, + {0x1940, 0x1944, 4}, + {0x1945, 0x196d, 1}, + {0x1970, 0x1974, 1}, + {0x1980, 0x19ab, 1}, + {0x19b0, 0x19c9, 1}, + {0x19d0, 0x19da, 1}, + {0x19de, 0x1a1b, 1}, + {0x1a1e, 0x1a5e, 1}, + {0x1a60, 0x1a7c, 1}, + {0x1a7f, 0x1a89, 1}, + {0x1a90, 0x1a99, 1}, + {0x1aa0, 0x1aad, 1}, + {0x1b00, 0x1b4b, 1}, + {0x1b50, 0x1b7c, 1}, + {0x1b80, 0x1baa, 1}, + {0x1bae, 0x1bb9, 1}, + {0x1c00, 0x1c37, 1}, + {0x1c3b, 0x1c49, 1}, + {0x1c4d, 0x1c7f, 1}, + {0x1cd0, 0x1cf2, 1}, + {0x1d00, 0x1de6, 1}, + {0x1dfd, 0x1f15, 1}, + {0x1f18, 0x1f1d, 1}, + {0x1f20, 0x1f45, 1}, + {0x1f48, 0x1f4d, 1}, + {0x1f50, 0x1f57, 1}, + {0x1f59, 0x1f5f, 2}, + {0x1f60, 0x1f7d, 1}, + {0x1f80, 0x1fb4, 1}, + {0x1fb6, 0x1fc4, 1}, + {0x1fc6, 0x1fd3, 1}, + {0x1fd6, 0x1fdb, 1}, + {0x1fdd, 0x1fef, 1}, + {0x1ff2, 0x1ff4, 1}, + {0x1ff6, 0x1ffe, 1}, + {0x2000, 0x2064, 1}, + {0x206a, 0x2071, 1}, + {0x2074, 0x208e, 1}, + {0x2090, 0x2094, 1}, + {0x20a0, 0x20b8, 1}, + {0x20d0, 0x20f0, 1}, + {0x2100, 0x2189, 1}, + {0x2190, 0x23e8, 1}, + {0x2400, 0x2426, 1}, + {0x2440, 0x244a, 1}, + {0x2460, 0x26cd, 1}, + {0x26cf, 0x26e1, 1}, + {0x26e3, 0x26e8, 5}, + {0x26e9, 0x26ff, 1}, + {0x2701, 0x2704, 1}, + {0x2706, 0x2709, 1}, + {0x270c, 0x2727, 1}, + {0x2729, 0x274b, 1}, + {0x274d, 0x274f, 2}, + {0x2750, 0x2752, 1}, + {0x2756, 0x275e, 1}, + {0x2761, 0x2794, 1}, + {0x2798, 0x27af, 1}, + {0x27b1, 0x27be, 1}, + {0x27c0, 0x27ca, 1}, + {0x27cc, 0x27d0, 4}, + {0x27d1, 0x2b4c, 1}, + {0x2b50, 0x2b59, 1}, + {0x2c00, 0x2c2e, 1}, + {0x2c30, 0x2c5e, 1}, + {0x2c60, 0x2cf1, 1}, + {0x2cf9, 0x2d25, 1}, + {0x2d30, 0x2d65, 1}, + {0x2d6f, 0x2d80, 17}, + {0x2d81, 0x2d96, 1}, + {0x2da0, 0x2da6, 1}, + {0x2da8, 0x2dae, 1}, + {0x2db0, 0x2db6, 1}, + {0x2db8, 0x2dbe, 1}, + {0x2dc0, 0x2dc6, 1}, + {0x2dc8, 0x2dce, 1}, + {0x2dd0, 0x2dd6, 1}, + {0x2dd8, 0x2dde, 1}, + {0x2de0, 0x2e31, 1}, + {0x2e80, 0x2e99, 1}, + {0x2e9b, 0x2ef3, 1}, + {0x2f00, 0x2fd5, 1}, + {0x2ff0, 0x2ffb, 1}, + {0x3000, 0x303f, 1}, + {0x3041, 0x3096, 1}, + {0x3099, 0x30ff, 1}, + {0x3105, 0x312d, 1}, + {0x3131, 0x318e, 1}, + {0x3190, 0x31b7, 1}, + {0x31c0, 0x31e3, 1}, + {0x31f0, 0x321e, 1}, + {0x3220, 0x32fe, 1}, + {0x3300, 0x4db5, 1}, + {0x4dc0, 0x9fcb, 1}, + {0xa000, 0xa48c, 1}, + {0xa490, 0xa4c6, 1}, + {0xa4d0, 0xa62b, 1}, + {0xa640, 0xa65f, 1}, + {0xa662, 0xa673, 1}, + {0xa67c, 0xa697, 1}, + {0xa6a0, 0xa6f7, 1}, + {0xa700, 0xa78c, 1}, + {0xa7fb, 0xa82b, 1}, + {0xa830, 0xa839, 1}, + {0xa840, 0xa877, 1}, + {0xa880, 0xa8c4, 1}, + {0xa8ce, 0xa8d9, 1}, + {0xa8e0, 0xa8fb, 1}, + {0xa900, 0xa953, 1}, + {0xa95f, 0xa97c, 1}, + {0xa980, 0xa9cd, 1}, + {0xa9cf, 0xa9d9, 1}, + {0xa9de, 0xa9df, 1}, + {0xaa00, 0xaa36, 1}, + {0xaa40, 0xaa4d, 1}, + {0xaa50, 0xaa59, 1}, + {0xaa5c, 0xaa7b, 1}, + {0xaa80, 0xaac2, 1}, + {0xaadb, 0xaadf, 1}, + {0xabc0, 0xabed, 1}, + {0xabf0, 0xabf9, 1}, + {0xac00, 0xd7a3, 1}, + {0xd7b0, 0xd7c6, 1}, + {0xd7cb, 0xd7fb, 1}, + {0xd800, 0xfa2d, 1}, + {0xfa30, 0xfa6d, 1}, + {0xfa70, 0xfad9, 1}, + {0xfb00, 0xfb06, 1}, + {0xfb13, 0xfb17, 1}, + {0xfb1d, 0xfb36, 1}, + {0xfb38, 0xfb3c, 1}, + {0xfb3e, 0xfb40, 2}, + {0xfb41, 0xfb43, 2}, + {0xfb44, 0xfb46, 2}, + {0xfb47, 0xfbb1, 1}, + {0xfbd3, 0xfd3f, 1}, + {0xfd50, 0xfd8f, 1}, + {0xfd92, 0xfdc7, 1}, + {0xfdf0, 0xfdfd, 1}, + {0xfe00, 0xfe19, 1}, + {0xfe20, 0xfe26, 1}, + {0xfe30, 0xfe52, 1}, + {0xfe54, 0xfe66, 1}, + {0xfe68, 0xfe6b, 1}, + {0xfe70, 0xfe74, 1}, + {0xfe76, 0xfefc, 1}, + {0xfeff, 0xff01, 2}, + {0xff02, 0xffbe, 1}, + {0xffc2, 0xffc7, 1}, + {0xffca, 0xffcf, 1}, + {0xffd2, 0xffd7, 1}, + {0xffda, 0xffdc, 1}, + {0xffe0, 0xffe6, 1}, + {0xffe8, 0xffee, 1}, + {0xfff9, 0xfffd, 1}, + }, + R32: []unicode.Range32{ + {0x00010000, 0x0001000b, 1}, + {0x0001000d, 0x00010026, 1}, + {0x00010028, 0x0001003a, 1}, + {0x0001003c, 0x0001003d, 1}, + {0x0001003f, 0x0001004d, 1}, + {0x00010050, 0x0001005d, 1}, + {0x00010080, 0x000100fa, 1}, + {0x00010100, 0x00010102, 1}, + {0x00010107, 0x00010133, 1}, + {0x00010137, 0x0001018a, 1}, + {0x00010190, 0x0001019b, 1}, + {0x000101d0, 0x000101fd, 1}, + {0x00010280, 0x0001029c, 1}, + {0x000102a0, 0x000102d0, 1}, + {0x00010300, 0x0001031e, 1}, + {0x00010320, 0x00010323, 1}, + {0x00010330, 0x0001034a, 1}, + {0x00010380, 0x0001039d, 1}, + {0x0001039f, 0x000103c3, 1}, + {0x000103c8, 0x000103d5, 1}, + {0x00010400, 0x0001049d, 1}, + {0x000104a0, 0x000104a9, 1}, + {0x00010800, 0x00010805, 1}, + {0x00010808, 0x0001080a, 2}, + {0x0001080b, 0x00010835, 1}, + {0x00010837, 0x00010838, 1}, + {0x0001083c, 0x0001083f, 3}, + {0x00010840, 0x00010855, 1}, + {0x00010857, 0x0001085f, 1}, + {0x00010900, 0x0001091b, 1}, + {0x0001091f, 0x00010939, 1}, + {0x0001093f, 0x00010a00, 193}, + {0x00010a01, 0x00010a03, 1}, + {0x00010a05, 0x00010a06, 1}, + {0x00010a0c, 0x00010a13, 1}, + {0x00010a15, 0x00010a17, 1}, + {0x00010a19, 0x00010a33, 1}, + {0x00010a38, 0x00010a3a, 1}, + {0x00010a3f, 0x00010a47, 1}, + {0x00010a50, 0x00010a58, 1}, + {0x00010a60, 0x00010a7f, 1}, + {0x00010b00, 0x00010b35, 1}, + {0x00010b39, 0x00010b55, 1}, + {0x00010b58, 0x00010b72, 1}, + {0x00010b78, 0x00010b7f, 1}, + {0x00010c00, 0x00010c48, 1}, + {0x00010e60, 0x00010e7e, 1}, + {0x00011080, 0x000110c1, 1}, + {0x00012000, 0x0001236e, 1}, + {0x00012400, 0x00012462, 1}, + {0x00012470, 0x00012473, 1}, + {0x00013000, 0x0001342e, 1}, + {0x0001d000, 0x0001d0f5, 1}, + {0x0001d100, 0x0001d126, 1}, + {0x0001d129, 0x0001d1dd, 1}, + {0x0001d200, 0x0001d245, 1}, + {0x0001d300, 0x0001d356, 1}, + {0x0001d360, 0x0001d371, 1}, + {0x0001d400, 0x0001d454, 1}, + {0x0001d456, 0x0001d49c, 1}, + {0x0001d49e, 0x0001d49f, 1}, + {0x0001d4a2, 0x0001d4a5, 3}, + {0x0001d4a6, 0x0001d4a9, 3}, + {0x0001d4aa, 0x0001d4ac, 1}, + {0x0001d4ae, 0x0001d4b9, 1}, + {0x0001d4bb, 0x0001d4bd, 2}, + {0x0001d4be, 0x0001d4c3, 1}, + {0x0001d4c5, 0x0001d505, 1}, + {0x0001d507, 0x0001d50a, 1}, + {0x0001d50d, 0x0001d514, 1}, + {0x0001d516, 0x0001d51c, 1}, + {0x0001d51e, 0x0001d539, 1}, + {0x0001d53b, 0x0001d53e, 1}, + {0x0001d540, 0x0001d544, 1}, + {0x0001d546, 0x0001d54a, 4}, + {0x0001d54b, 0x0001d550, 1}, + {0x0001d552, 0x0001d6a5, 1}, + {0x0001d6a8, 0x0001d7cb, 1}, + {0x0001d7ce, 0x0001d7ff, 1}, + {0x0001f000, 0x0001f02b, 1}, + {0x0001f030, 0x0001f093, 1}, + {0x0001f100, 0x0001f10a, 1}, + {0x0001f110, 0x0001f12e, 1}, + {0x0001f131, 0x0001f13d, 12}, + {0x0001f13f, 0x0001f142, 3}, + {0x0001f146, 0x0001f14a, 4}, + {0x0001f14b, 0x0001f14e, 1}, + {0x0001f157, 0x0001f15f, 8}, + {0x0001f179, 0x0001f17b, 2}, + {0x0001f17c, 0x0001f17f, 3}, + {0x0001f18a, 0x0001f18d, 1}, + {0x0001f190, 0x0001f200, 112}, + {0x0001f210, 0x0001f231, 1}, + {0x0001f240, 0x0001f248, 1}, + {0x00020000, 0x0002a6d6, 1}, + {0x0002a700, 0x0002b734, 1}, + {0x0002f800, 0x0002fa1d, 1}, + {0x000e0001, 0x000e0020, 31}, + {0x000e0021, 0x000e007f, 1}, + {0x000e0100, 0x000e01ef, 1}, + {0x000f0000, 0x000ffffd, 1}, + {0x00100000, 0x0010fffd, 1}, + }, + LatinOffset: 0, +} + +// size 3812 bytes (3 KiB) +var assigned6_0_0 = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x0000, 0x0377, 1}, + {0x037a, 0x037e, 1}, + {0x0384, 0x038a, 1}, + {0x038c, 0x038e, 2}, + {0x038f, 0x03a1, 1}, + {0x03a3, 0x0527, 1}, + {0x0531, 0x0556, 1}, + {0x0559, 0x055f, 1}, + {0x0561, 0x0587, 1}, + {0x0589, 0x058a, 1}, + {0x0591, 0x05c7, 1}, + {0x05d0, 0x05ea, 1}, + {0x05f0, 0x05f4, 1}, + {0x0600, 0x0603, 1}, + {0x0606, 0x061b, 1}, + {0x061e, 0x070d, 1}, + {0x070f, 0x074a, 1}, + {0x074d, 0x07b1, 1}, + {0x07c0, 0x07fa, 1}, + {0x0800, 0x082d, 1}, + {0x0830, 0x083e, 1}, + {0x0840, 0x085b, 1}, + {0x085e, 0x0900, 162}, + {0x0901, 0x0977, 1}, + {0x0979, 0x097f, 1}, + {0x0981, 0x0983, 1}, + {0x0985, 0x098c, 1}, + {0x098f, 0x0990, 1}, + {0x0993, 0x09a8, 1}, + {0x09aa, 0x09b0, 1}, + {0x09b2, 0x09b6, 4}, + {0x09b7, 0x09b9, 1}, + {0x09bc, 0x09c4, 1}, + {0x09c7, 0x09c8, 1}, + {0x09cb, 0x09ce, 1}, + {0x09d7, 0x09dc, 5}, + {0x09dd, 0x09df, 2}, + {0x09e0, 0x09e3, 1}, + {0x09e6, 0x09fb, 1}, + {0x0a01, 0x0a03, 1}, + {0x0a05, 0x0a0a, 1}, + {0x0a0f, 0x0a10, 1}, + {0x0a13, 0x0a28, 1}, + {0x0a2a, 0x0a30, 1}, + {0x0a32, 0x0a33, 1}, + {0x0a35, 0x0a36, 1}, + {0x0a38, 0x0a39, 1}, + {0x0a3c, 0x0a3e, 2}, + {0x0a3f, 0x0a42, 1}, + {0x0a47, 0x0a48, 1}, + {0x0a4b, 0x0a4d, 1}, + {0x0a51, 0x0a59, 8}, + {0x0a5a, 0x0a5c, 1}, + {0x0a5e, 0x0a66, 8}, + {0x0a67, 0x0a75, 1}, + {0x0a81, 0x0a83, 1}, + {0x0a85, 0x0a8d, 1}, + {0x0a8f, 0x0a91, 1}, + {0x0a93, 0x0aa8, 1}, + {0x0aaa, 0x0ab0, 1}, + {0x0ab2, 0x0ab3, 1}, + {0x0ab5, 0x0ab9, 1}, + {0x0abc, 0x0ac5, 1}, + {0x0ac7, 0x0ac9, 1}, + {0x0acb, 0x0acd, 1}, + {0x0ad0, 0x0ae0, 16}, + {0x0ae1, 0x0ae3, 1}, + {0x0ae6, 0x0aef, 1}, + {0x0af1, 0x0b01, 16}, + {0x0b02, 0x0b03, 1}, + {0x0b05, 0x0b0c, 1}, + {0x0b0f, 0x0b10, 1}, + {0x0b13, 0x0b28, 1}, + {0x0b2a, 0x0b30, 1}, + {0x0b32, 0x0b33, 1}, + {0x0b35, 0x0b39, 1}, + {0x0b3c, 0x0b44, 1}, + {0x0b47, 0x0b48, 1}, + {0x0b4b, 0x0b4d, 1}, + {0x0b56, 0x0b57, 1}, + {0x0b5c, 0x0b5d, 1}, + {0x0b5f, 0x0b63, 1}, + {0x0b66, 0x0b77, 1}, + {0x0b82, 0x0b83, 1}, + {0x0b85, 0x0b8a, 1}, + {0x0b8e, 0x0b90, 1}, + {0x0b92, 0x0b95, 1}, + {0x0b99, 0x0b9a, 1}, + {0x0b9c, 0x0b9e, 2}, + {0x0b9f, 0x0ba3, 4}, + {0x0ba4, 0x0ba8, 4}, + {0x0ba9, 0x0baa, 1}, + {0x0bae, 0x0bb9, 1}, + {0x0bbe, 0x0bc2, 1}, + {0x0bc6, 0x0bc8, 1}, + {0x0bca, 0x0bcd, 1}, + {0x0bd0, 0x0bd7, 7}, + {0x0be6, 0x0bfa, 1}, + {0x0c01, 0x0c03, 1}, + {0x0c05, 0x0c0c, 1}, + {0x0c0e, 0x0c10, 1}, + {0x0c12, 0x0c28, 1}, + {0x0c2a, 0x0c33, 1}, + {0x0c35, 0x0c39, 1}, + {0x0c3d, 0x0c44, 1}, + {0x0c46, 0x0c48, 1}, + {0x0c4a, 0x0c4d, 1}, + {0x0c55, 0x0c56, 1}, + {0x0c58, 0x0c59, 1}, + {0x0c60, 0x0c63, 1}, + {0x0c66, 0x0c6f, 1}, + {0x0c78, 0x0c7f, 1}, + {0x0c82, 0x0c83, 1}, + {0x0c85, 0x0c8c, 1}, + {0x0c8e, 0x0c90, 1}, + {0x0c92, 0x0ca8, 1}, + {0x0caa, 0x0cb3, 1}, + {0x0cb5, 0x0cb9, 1}, + {0x0cbc, 0x0cc4, 1}, + {0x0cc6, 0x0cc8, 1}, + {0x0cca, 0x0ccd, 1}, + {0x0cd5, 0x0cd6, 1}, + {0x0cde, 0x0ce0, 2}, + {0x0ce1, 0x0ce3, 1}, + {0x0ce6, 0x0cef, 1}, + {0x0cf1, 0x0cf2, 1}, + {0x0d02, 0x0d03, 1}, + {0x0d05, 0x0d0c, 1}, + {0x0d0e, 0x0d10, 1}, + {0x0d12, 0x0d3a, 1}, + {0x0d3d, 0x0d44, 1}, + {0x0d46, 0x0d48, 1}, + {0x0d4a, 0x0d4e, 1}, + {0x0d57, 0x0d60, 9}, + {0x0d61, 0x0d63, 1}, + {0x0d66, 0x0d75, 1}, + {0x0d79, 0x0d7f, 1}, + {0x0d82, 0x0d83, 1}, + {0x0d85, 0x0d96, 1}, + {0x0d9a, 0x0db1, 1}, + {0x0db3, 0x0dbb, 1}, + {0x0dbd, 0x0dc0, 3}, + {0x0dc1, 0x0dc6, 1}, + {0x0dca, 0x0dcf, 5}, + {0x0dd0, 0x0dd4, 1}, + {0x0dd6, 0x0dd8, 2}, + {0x0dd9, 0x0ddf, 1}, + {0x0df2, 0x0df4, 1}, + {0x0e01, 0x0e3a, 1}, + {0x0e3f, 0x0e5b, 1}, + {0x0e81, 0x0e82, 1}, + {0x0e84, 0x0e87, 3}, + {0x0e88, 0x0e8a, 2}, + {0x0e8d, 0x0e94, 7}, + {0x0e95, 0x0e97, 1}, + {0x0e99, 0x0e9f, 1}, + {0x0ea1, 0x0ea3, 1}, + {0x0ea5, 0x0ea7, 2}, + {0x0eaa, 0x0eab, 1}, + {0x0ead, 0x0eb9, 1}, + {0x0ebb, 0x0ebd, 1}, + {0x0ec0, 0x0ec4, 1}, + {0x0ec6, 0x0ec8, 2}, + {0x0ec9, 0x0ecd, 1}, + {0x0ed0, 0x0ed9, 1}, + {0x0edc, 0x0edd, 1}, + {0x0f00, 0x0f47, 1}, + {0x0f49, 0x0f6c, 1}, + {0x0f71, 0x0f97, 1}, + {0x0f99, 0x0fbc, 1}, + {0x0fbe, 0x0fcc, 1}, + {0x0fce, 0x0fda, 1}, + {0x1000, 0x10c5, 1}, + {0x10d0, 0x10fc, 1}, + {0x1100, 0x1248, 1}, + {0x124a, 0x124d, 1}, + {0x1250, 0x1256, 1}, + {0x1258, 0x125a, 2}, + {0x125b, 0x125d, 1}, + {0x1260, 0x1288, 1}, + {0x128a, 0x128d, 1}, + {0x1290, 0x12b0, 1}, + {0x12b2, 0x12b5, 1}, + {0x12b8, 0x12be, 1}, + {0x12c0, 0x12c2, 2}, + {0x12c3, 0x12c5, 1}, + {0x12c8, 0x12d6, 1}, + {0x12d8, 0x1310, 1}, + {0x1312, 0x1315, 1}, + {0x1318, 0x135a, 1}, + {0x135d, 0x137c, 1}, + {0x1380, 0x1399, 1}, + {0x13a0, 0x13f4, 1}, + {0x1400, 0x169c, 1}, + {0x16a0, 0x16f0, 1}, + {0x1700, 0x170c, 1}, + {0x170e, 0x1714, 1}, + {0x1720, 0x1736, 1}, + {0x1740, 0x1753, 1}, + {0x1760, 0x176c, 1}, + {0x176e, 0x1770, 1}, + {0x1772, 0x1773, 1}, + {0x1780, 0x17dd, 1}, + {0x17e0, 0x17e9, 1}, + {0x17f0, 0x17f9, 1}, + {0x1800, 0x180e, 1}, + {0x1810, 0x1819, 1}, + {0x1820, 0x1877, 1}, + {0x1880, 0x18aa, 1}, + {0x18b0, 0x18f5, 1}, + {0x1900, 0x191c, 1}, + {0x1920, 0x192b, 1}, + {0x1930, 0x193b, 1}, + {0x1940, 0x1944, 4}, + {0x1945, 0x196d, 1}, + {0x1970, 0x1974, 1}, + {0x1980, 0x19ab, 1}, + {0x19b0, 0x19c9, 1}, + {0x19d0, 0x19da, 1}, + {0x19de, 0x1a1b, 1}, + {0x1a1e, 0x1a5e, 1}, + {0x1a60, 0x1a7c, 1}, + {0x1a7f, 0x1a89, 1}, + {0x1a90, 0x1a99, 1}, + {0x1aa0, 0x1aad, 1}, + {0x1b00, 0x1b4b, 1}, + {0x1b50, 0x1b7c, 1}, + {0x1b80, 0x1baa, 1}, + {0x1bae, 0x1bb9, 1}, + {0x1bc0, 0x1bf3, 1}, + {0x1bfc, 0x1c37, 1}, + {0x1c3b, 0x1c49, 1}, + {0x1c4d, 0x1c7f, 1}, + {0x1cd0, 0x1cf2, 1}, + {0x1d00, 0x1de6, 1}, + {0x1dfc, 0x1f15, 1}, + {0x1f18, 0x1f1d, 1}, + {0x1f20, 0x1f45, 1}, + {0x1f48, 0x1f4d, 1}, + {0x1f50, 0x1f57, 1}, + {0x1f59, 0x1f5f, 2}, + {0x1f60, 0x1f7d, 1}, + {0x1f80, 0x1fb4, 1}, + {0x1fb6, 0x1fc4, 1}, + {0x1fc6, 0x1fd3, 1}, + {0x1fd6, 0x1fdb, 1}, + {0x1fdd, 0x1fef, 1}, + {0x1ff2, 0x1ff4, 1}, + {0x1ff6, 0x1ffe, 1}, + {0x2000, 0x2064, 1}, + {0x206a, 0x2071, 1}, + {0x2074, 0x208e, 1}, + {0x2090, 0x209c, 1}, + {0x20a0, 0x20b9, 1}, + {0x20d0, 0x20f0, 1}, + {0x2100, 0x2189, 1}, + {0x2190, 0x23f3, 1}, + {0x2400, 0x2426, 1}, + {0x2440, 0x244a, 1}, + {0x2460, 0x26ff, 1}, + {0x2701, 0x27ca, 1}, + {0x27cc, 0x27ce, 2}, + {0x27cf, 0x2b4c, 1}, + {0x2b50, 0x2b59, 1}, + {0x2c00, 0x2c2e, 1}, + {0x2c30, 0x2c5e, 1}, + {0x2c60, 0x2cf1, 1}, + {0x2cf9, 0x2d25, 1}, + {0x2d30, 0x2d65, 1}, + {0x2d6f, 0x2d70, 1}, + {0x2d7f, 0x2d96, 1}, + {0x2da0, 0x2da6, 1}, + {0x2da8, 0x2dae, 1}, + {0x2db0, 0x2db6, 1}, + {0x2db8, 0x2dbe, 1}, + {0x2dc0, 0x2dc6, 1}, + {0x2dc8, 0x2dce, 1}, + {0x2dd0, 0x2dd6, 1}, + {0x2dd8, 0x2dde, 1}, + {0x2de0, 0x2e31, 1}, + {0x2e80, 0x2e99, 1}, + {0x2e9b, 0x2ef3, 1}, + {0x2f00, 0x2fd5, 1}, + {0x2ff0, 0x2ffb, 1}, + {0x3000, 0x303f, 1}, + {0x3041, 0x3096, 1}, + {0x3099, 0x30ff, 1}, + {0x3105, 0x312d, 1}, + {0x3131, 0x318e, 1}, + {0x3190, 0x31ba, 1}, + {0x31c0, 0x31e3, 1}, + {0x31f0, 0x321e, 1}, + {0x3220, 0x32fe, 1}, + {0x3300, 0x4db5, 1}, + {0x4dc0, 0x9fcb, 1}, + {0xa000, 0xa48c, 1}, + {0xa490, 0xa4c6, 1}, + {0xa4d0, 0xa62b, 1}, + {0xa640, 0xa673, 1}, + {0xa67c, 0xa697, 1}, + {0xa6a0, 0xa6f7, 1}, + {0xa700, 0xa78e, 1}, + {0xa790, 0xa791, 1}, + {0xa7a0, 0xa7a9, 1}, + {0xa7fa, 0xa82b, 1}, + {0xa830, 0xa839, 1}, + {0xa840, 0xa877, 1}, + {0xa880, 0xa8c4, 1}, + {0xa8ce, 0xa8d9, 1}, + {0xa8e0, 0xa8fb, 1}, + {0xa900, 0xa953, 1}, + {0xa95f, 0xa97c, 1}, + {0xa980, 0xa9cd, 1}, + {0xa9cf, 0xa9d9, 1}, + {0xa9de, 0xa9df, 1}, + {0xaa00, 0xaa36, 1}, + {0xaa40, 0xaa4d, 1}, + {0xaa50, 0xaa59, 1}, + {0xaa5c, 0xaa7b, 1}, + {0xaa80, 0xaac2, 1}, + {0xaadb, 0xaadf, 1}, + {0xab01, 0xab06, 1}, + {0xab09, 0xab0e, 1}, + {0xab11, 0xab16, 1}, + {0xab20, 0xab26, 1}, + {0xab28, 0xab2e, 1}, + {0xabc0, 0xabed, 1}, + {0xabf0, 0xabf9, 1}, + {0xac00, 0xd7a3, 1}, + {0xd7b0, 0xd7c6, 1}, + {0xd7cb, 0xd7fb, 1}, + {0xd800, 0xfa2d, 1}, + {0xfa30, 0xfa6d, 1}, + {0xfa70, 0xfad9, 1}, + {0xfb00, 0xfb06, 1}, + {0xfb13, 0xfb17, 1}, + {0xfb1d, 0xfb36, 1}, + {0xfb38, 0xfb3c, 1}, + {0xfb3e, 0xfb40, 2}, + {0xfb41, 0xfb43, 2}, + {0xfb44, 0xfb46, 2}, + {0xfb47, 0xfbc1, 1}, + {0xfbd3, 0xfd3f, 1}, + {0xfd50, 0xfd8f, 1}, + {0xfd92, 0xfdc7, 1}, + {0xfdf0, 0xfdfd, 1}, + {0xfe00, 0xfe19, 1}, + {0xfe20, 0xfe26, 1}, + {0xfe30, 0xfe52, 1}, + {0xfe54, 0xfe66, 1}, + {0xfe68, 0xfe6b, 1}, + {0xfe70, 0xfe74, 1}, + {0xfe76, 0xfefc, 1}, + {0xfeff, 0xff01, 2}, + {0xff02, 0xffbe, 1}, + {0xffc2, 0xffc7, 1}, + {0xffca, 0xffcf, 1}, + {0xffd2, 0xffd7, 1}, + {0xffda, 0xffdc, 1}, + {0xffe0, 0xffe6, 1}, + {0xffe8, 0xffee, 1}, + {0xfff9, 0xfffd, 1}, + }, + R32: []unicode.Range32{ + {0x00010000, 0x0001000b, 1}, + {0x0001000d, 0x00010026, 1}, + {0x00010028, 0x0001003a, 1}, + {0x0001003c, 0x0001003d, 1}, + {0x0001003f, 0x0001004d, 1}, + {0x00010050, 0x0001005d, 1}, + {0x00010080, 0x000100fa, 1}, + {0x00010100, 0x00010102, 1}, + {0x00010107, 0x00010133, 1}, + {0x00010137, 0x0001018a, 1}, + {0x00010190, 0x0001019b, 1}, + {0x000101d0, 0x000101fd, 1}, + {0x00010280, 0x0001029c, 1}, + {0x000102a0, 0x000102d0, 1}, + {0x00010300, 0x0001031e, 1}, + {0x00010320, 0x00010323, 1}, + {0x00010330, 0x0001034a, 1}, + {0x00010380, 0x0001039d, 1}, + {0x0001039f, 0x000103c3, 1}, + {0x000103c8, 0x000103d5, 1}, + {0x00010400, 0x0001049d, 1}, + {0x000104a0, 0x000104a9, 1}, + {0x00010800, 0x00010805, 1}, + {0x00010808, 0x0001080a, 2}, + {0x0001080b, 0x00010835, 1}, + {0x00010837, 0x00010838, 1}, + {0x0001083c, 0x0001083f, 3}, + {0x00010840, 0x00010855, 1}, + {0x00010857, 0x0001085f, 1}, + {0x00010900, 0x0001091b, 1}, + {0x0001091f, 0x00010939, 1}, + {0x0001093f, 0x00010a00, 193}, + {0x00010a01, 0x00010a03, 1}, + {0x00010a05, 0x00010a06, 1}, + {0x00010a0c, 0x00010a13, 1}, + {0x00010a15, 0x00010a17, 1}, + {0x00010a19, 0x00010a33, 1}, + {0x00010a38, 0x00010a3a, 1}, + {0x00010a3f, 0x00010a47, 1}, + {0x00010a50, 0x00010a58, 1}, + {0x00010a60, 0x00010a7f, 1}, + {0x00010b00, 0x00010b35, 1}, + {0x00010b39, 0x00010b55, 1}, + {0x00010b58, 0x00010b72, 1}, + {0x00010b78, 0x00010b7f, 1}, + {0x00010c00, 0x00010c48, 1}, + {0x00010e60, 0x00010e7e, 1}, + {0x00011000, 0x0001104d, 1}, + {0x00011052, 0x0001106f, 1}, + {0x00011080, 0x000110c1, 1}, + {0x00012000, 0x0001236e, 1}, + {0x00012400, 0x00012462, 1}, + {0x00012470, 0x00012473, 1}, + {0x00013000, 0x0001342e, 1}, + {0x00016800, 0x00016a38, 1}, + {0x0001b000, 0x0001b001, 1}, + {0x0001d000, 0x0001d0f5, 1}, + {0x0001d100, 0x0001d126, 1}, + {0x0001d129, 0x0001d1dd, 1}, + {0x0001d200, 0x0001d245, 1}, + {0x0001d300, 0x0001d356, 1}, + {0x0001d360, 0x0001d371, 1}, + {0x0001d400, 0x0001d454, 1}, + {0x0001d456, 0x0001d49c, 1}, + {0x0001d49e, 0x0001d49f, 1}, + {0x0001d4a2, 0x0001d4a5, 3}, + {0x0001d4a6, 0x0001d4a9, 3}, + {0x0001d4aa, 0x0001d4ac, 1}, + {0x0001d4ae, 0x0001d4b9, 1}, + {0x0001d4bb, 0x0001d4bd, 2}, + {0x0001d4be, 0x0001d4c3, 1}, + {0x0001d4c5, 0x0001d505, 1}, + {0x0001d507, 0x0001d50a, 1}, + {0x0001d50d, 0x0001d514, 1}, + {0x0001d516, 0x0001d51c, 1}, + {0x0001d51e, 0x0001d539, 1}, + {0x0001d53b, 0x0001d53e, 1}, + {0x0001d540, 0x0001d544, 1}, + {0x0001d546, 0x0001d54a, 4}, + {0x0001d54b, 0x0001d550, 1}, + {0x0001d552, 0x0001d6a5, 1}, + {0x0001d6a8, 0x0001d7cb, 1}, + {0x0001d7ce, 0x0001d7ff, 1}, + {0x0001f000, 0x0001f02b, 1}, + {0x0001f030, 0x0001f093, 1}, + {0x0001f0a0, 0x0001f0ae, 1}, + {0x0001f0b1, 0x0001f0be, 1}, + {0x0001f0c1, 0x0001f0cf, 1}, + {0x0001f0d1, 0x0001f0df, 1}, + {0x0001f100, 0x0001f10a, 1}, + {0x0001f110, 0x0001f12e, 1}, + {0x0001f130, 0x0001f169, 1}, + {0x0001f170, 0x0001f19a, 1}, + {0x0001f1e6, 0x0001f202, 1}, + {0x0001f210, 0x0001f23a, 1}, + {0x0001f240, 0x0001f248, 1}, + {0x0001f250, 0x0001f251, 1}, + {0x0001f300, 0x0001f320, 1}, + {0x0001f330, 0x0001f335, 1}, + {0x0001f337, 0x0001f37c, 1}, + {0x0001f380, 0x0001f393, 1}, + {0x0001f3a0, 0x0001f3c4, 1}, + {0x0001f3c6, 0x0001f3ca, 1}, + {0x0001f3e0, 0x0001f3f0, 1}, + {0x0001f400, 0x0001f43e, 1}, + {0x0001f440, 0x0001f442, 2}, + {0x0001f443, 0x0001f4f7, 1}, + {0x0001f4f9, 0x0001f4fc, 1}, + {0x0001f500, 0x0001f53d, 1}, + {0x0001f550, 0x0001f567, 1}, + {0x0001f5fb, 0x0001f5ff, 1}, + {0x0001f601, 0x0001f610, 1}, + {0x0001f612, 0x0001f614, 1}, + {0x0001f616, 0x0001f61c, 2}, + {0x0001f61d, 0x0001f61e, 1}, + {0x0001f620, 0x0001f625, 1}, + {0x0001f628, 0x0001f62b, 1}, + {0x0001f62d, 0x0001f630, 3}, + {0x0001f631, 0x0001f633, 1}, + {0x0001f635, 0x0001f640, 1}, + {0x0001f645, 0x0001f64f, 1}, + {0x0001f680, 0x0001f6c5, 1}, + {0x0001f700, 0x0001f773, 1}, + {0x00020000, 0x0002a6d6, 1}, + {0x0002a700, 0x0002b734, 1}, + {0x0002b740, 0x0002b81d, 1}, + {0x0002f800, 0x0002fa1d, 1}, + {0x000e0001, 0x000e0020, 31}, + {0x000e0021, 0x000e007f, 1}, + {0x000e0100, 0x000e01ef, 1}, + {0x000f0000, 0x000ffffd, 1}, + {0x00100000, 0x0010fffd, 1}, + }, + LatinOffset: 0, +} + +// size 4160 bytes (4 KiB) +var assigned6_1_0 = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x0000, 0x0377, 1}, + {0x037a, 0x037e, 1}, + {0x0384, 0x038a, 1}, + {0x038c, 0x038e, 2}, + {0x038f, 0x03a1, 1}, + {0x03a3, 0x0527, 1}, + {0x0531, 0x0556, 1}, + {0x0559, 0x055f, 1}, + {0x0561, 0x0587, 1}, + {0x0589, 0x058a, 1}, + {0x058f, 0x0591, 2}, + {0x0592, 0x05c7, 1}, + {0x05d0, 0x05ea, 1}, + {0x05f0, 0x05f4, 1}, + {0x0600, 0x0604, 1}, + {0x0606, 0x061b, 1}, + {0x061e, 0x070d, 1}, + {0x070f, 0x074a, 1}, + {0x074d, 0x07b1, 1}, + {0x07c0, 0x07fa, 1}, + {0x0800, 0x082d, 1}, + {0x0830, 0x083e, 1}, + {0x0840, 0x085b, 1}, + {0x085e, 0x08a0, 66}, + {0x08a2, 0x08ac, 1}, + {0x08e4, 0x08fe, 1}, + {0x0900, 0x0977, 1}, + {0x0979, 0x097f, 1}, + {0x0981, 0x0983, 1}, + {0x0985, 0x098c, 1}, + {0x098f, 0x0990, 1}, + {0x0993, 0x09a8, 1}, + {0x09aa, 0x09b0, 1}, + {0x09b2, 0x09b6, 4}, + {0x09b7, 0x09b9, 1}, + {0x09bc, 0x09c4, 1}, + {0x09c7, 0x09c8, 1}, + {0x09cb, 0x09ce, 1}, + {0x09d7, 0x09dc, 5}, + {0x09dd, 0x09df, 2}, + {0x09e0, 0x09e3, 1}, + {0x09e6, 0x09fb, 1}, + {0x0a01, 0x0a03, 1}, + {0x0a05, 0x0a0a, 1}, + {0x0a0f, 0x0a10, 1}, + {0x0a13, 0x0a28, 1}, + {0x0a2a, 0x0a30, 1}, + {0x0a32, 0x0a33, 1}, + {0x0a35, 0x0a36, 1}, + {0x0a38, 0x0a39, 1}, + {0x0a3c, 0x0a3e, 2}, + {0x0a3f, 0x0a42, 1}, + {0x0a47, 0x0a48, 1}, + {0x0a4b, 0x0a4d, 1}, + {0x0a51, 0x0a59, 8}, + {0x0a5a, 0x0a5c, 1}, + {0x0a5e, 0x0a66, 8}, + {0x0a67, 0x0a75, 1}, + {0x0a81, 0x0a83, 1}, + {0x0a85, 0x0a8d, 1}, + {0x0a8f, 0x0a91, 1}, + {0x0a93, 0x0aa8, 1}, + {0x0aaa, 0x0ab0, 1}, + {0x0ab2, 0x0ab3, 1}, + {0x0ab5, 0x0ab9, 1}, + {0x0abc, 0x0ac5, 1}, + {0x0ac7, 0x0ac9, 1}, + {0x0acb, 0x0acd, 1}, + {0x0ad0, 0x0ae0, 16}, + {0x0ae1, 0x0ae3, 1}, + {0x0ae6, 0x0af1, 1}, + {0x0b01, 0x0b03, 1}, + {0x0b05, 0x0b0c, 1}, + {0x0b0f, 0x0b10, 1}, + {0x0b13, 0x0b28, 1}, + {0x0b2a, 0x0b30, 1}, + {0x0b32, 0x0b33, 1}, + {0x0b35, 0x0b39, 1}, + {0x0b3c, 0x0b44, 1}, + {0x0b47, 0x0b48, 1}, + {0x0b4b, 0x0b4d, 1}, + {0x0b56, 0x0b57, 1}, + {0x0b5c, 0x0b5d, 1}, + {0x0b5f, 0x0b63, 1}, + {0x0b66, 0x0b77, 1}, + {0x0b82, 0x0b83, 1}, + {0x0b85, 0x0b8a, 1}, + {0x0b8e, 0x0b90, 1}, + {0x0b92, 0x0b95, 1}, + {0x0b99, 0x0b9a, 1}, + {0x0b9c, 0x0b9e, 2}, + {0x0b9f, 0x0ba3, 4}, + {0x0ba4, 0x0ba8, 4}, + {0x0ba9, 0x0baa, 1}, + {0x0bae, 0x0bb9, 1}, + {0x0bbe, 0x0bc2, 1}, + {0x0bc6, 0x0bc8, 1}, + {0x0bca, 0x0bcd, 1}, + {0x0bd0, 0x0bd7, 7}, + {0x0be6, 0x0bfa, 1}, + {0x0c01, 0x0c03, 1}, + {0x0c05, 0x0c0c, 1}, + {0x0c0e, 0x0c10, 1}, + {0x0c12, 0x0c28, 1}, + {0x0c2a, 0x0c33, 1}, + {0x0c35, 0x0c39, 1}, + {0x0c3d, 0x0c44, 1}, + {0x0c46, 0x0c48, 1}, + {0x0c4a, 0x0c4d, 1}, + {0x0c55, 0x0c56, 1}, + {0x0c58, 0x0c59, 1}, + {0x0c60, 0x0c63, 1}, + {0x0c66, 0x0c6f, 1}, + {0x0c78, 0x0c7f, 1}, + {0x0c82, 0x0c83, 1}, + {0x0c85, 0x0c8c, 1}, + {0x0c8e, 0x0c90, 1}, + {0x0c92, 0x0ca8, 1}, + {0x0caa, 0x0cb3, 1}, + {0x0cb5, 0x0cb9, 1}, + {0x0cbc, 0x0cc4, 1}, + {0x0cc6, 0x0cc8, 1}, + {0x0cca, 0x0ccd, 1}, + {0x0cd5, 0x0cd6, 1}, + {0x0cde, 0x0ce0, 2}, + {0x0ce1, 0x0ce3, 1}, + {0x0ce6, 0x0cef, 1}, + {0x0cf1, 0x0cf2, 1}, + {0x0d02, 0x0d03, 1}, + {0x0d05, 0x0d0c, 1}, + {0x0d0e, 0x0d10, 1}, + {0x0d12, 0x0d3a, 1}, + {0x0d3d, 0x0d44, 1}, + {0x0d46, 0x0d48, 1}, + {0x0d4a, 0x0d4e, 1}, + {0x0d57, 0x0d60, 9}, + {0x0d61, 0x0d63, 1}, + {0x0d66, 0x0d75, 1}, + {0x0d79, 0x0d7f, 1}, + {0x0d82, 0x0d83, 1}, + {0x0d85, 0x0d96, 1}, + {0x0d9a, 0x0db1, 1}, + {0x0db3, 0x0dbb, 1}, + {0x0dbd, 0x0dc0, 3}, + {0x0dc1, 0x0dc6, 1}, + {0x0dca, 0x0dcf, 5}, + {0x0dd0, 0x0dd4, 1}, + {0x0dd6, 0x0dd8, 2}, + {0x0dd9, 0x0ddf, 1}, + {0x0df2, 0x0df4, 1}, + {0x0e01, 0x0e3a, 1}, + {0x0e3f, 0x0e5b, 1}, + {0x0e81, 0x0e82, 1}, + {0x0e84, 0x0e87, 3}, + {0x0e88, 0x0e8a, 2}, + {0x0e8d, 0x0e94, 7}, + {0x0e95, 0x0e97, 1}, + {0x0e99, 0x0e9f, 1}, + {0x0ea1, 0x0ea3, 1}, + {0x0ea5, 0x0ea7, 2}, + {0x0eaa, 0x0eab, 1}, + {0x0ead, 0x0eb9, 1}, + {0x0ebb, 0x0ebd, 1}, + {0x0ec0, 0x0ec4, 1}, + {0x0ec6, 0x0ec8, 2}, + {0x0ec9, 0x0ecd, 1}, + {0x0ed0, 0x0ed9, 1}, + {0x0edc, 0x0edf, 1}, + {0x0f00, 0x0f47, 1}, + {0x0f49, 0x0f6c, 1}, + {0x0f71, 0x0f97, 1}, + {0x0f99, 0x0fbc, 1}, + {0x0fbe, 0x0fcc, 1}, + {0x0fce, 0x0fda, 1}, + {0x1000, 0x10c5, 1}, + {0x10c7, 0x10cd, 6}, + {0x10d0, 0x1248, 1}, + {0x124a, 0x124d, 1}, + {0x1250, 0x1256, 1}, + {0x1258, 0x125a, 2}, + {0x125b, 0x125d, 1}, + {0x1260, 0x1288, 1}, + {0x128a, 0x128d, 1}, + {0x1290, 0x12b0, 1}, + {0x12b2, 0x12b5, 1}, + {0x12b8, 0x12be, 1}, + {0x12c0, 0x12c2, 2}, + {0x12c3, 0x12c5, 1}, + {0x12c8, 0x12d6, 1}, + {0x12d8, 0x1310, 1}, + {0x1312, 0x1315, 1}, + {0x1318, 0x135a, 1}, + {0x135d, 0x137c, 1}, + {0x1380, 0x1399, 1}, + {0x13a0, 0x13f4, 1}, + {0x1400, 0x169c, 1}, + {0x16a0, 0x16f0, 1}, + {0x1700, 0x170c, 1}, + {0x170e, 0x1714, 1}, + {0x1720, 0x1736, 1}, + {0x1740, 0x1753, 1}, + {0x1760, 0x176c, 1}, + {0x176e, 0x1770, 1}, + {0x1772, 0x1773, 1}, + {0x1780, 0x17dd, 1}, + {0x17e0, 0x17e9, 1}, + {0x17f0, 0x17f9, 1}, + {0x1800, 0x180e, 1}, + {0x1810, 0x1819, 1}, + {0x1820, 0x1877, 1}, + {0x1880, 0x18aa, 1}, + {0x18b0, 0x18f5, 1}, + {0x1900, 0x191c, 1}, + {0x1920, 0x192b, 1}, + {0x1930, 0x193b, 1}, + {0x1940, 0x1944, 4}, + {0x1945, 0x196d, 1}, + {0x1970, 0x1974, 1}, + {0x1980, 0x19ab, 1}, + {0x19b0, 0x19c9, 1}, + {0x19d0, 0x19da, 1}, + {0x19de, 0x1a1b, 1}, + {0x1a1e, 0x1a5e, 1}, + {0x1a60, 0x1a7c, 1}, + {0x1a7f, 0x1a89, 1}, + {0x1a90, 0x1a99, 1}, + {0x1aa0, 0x1aad, 1}, + {0x1b00, 0x1b4b, 1}, + {0x1b50, 0x1b7c, 1}, + {0x1b80, 0x1bf3, 1}, + {0x1bfc, 0x1c37, 1}, + {0x1c3b, 0x1c49, 1}, + {0x1c4d, 0x1c7f, 1}, + {0x1cc0, 0x1cc7, 1}, + {0x1cd0, 0x1cf6, 1}, + {0x1d00, 0x1de6, 1}, + {0x1dfc, 0x1f15, 1}, + {0x1f18, 0x1f1d, 1}, + {0x1f20, 0x1f45, 1}, + {0x1f48, 0x1f4d, 1}, + {0x1f50, 0x1f57, 1}, + {0x1f59, 0x1f5f, 2}, + {0x1f60, 0x1f7d, 1}, + {0x1f80, 0x1fb4, 1}, + {0x1fb6, 0x1fc4, 1}, + {0x1fc6, 0x1fd3, 1}, + {0x1fd6, 0x1fdb, 1}, + {0x1fdd, 0x1fef, 1}, + {0x1ff2, 0x1ff4, 1}, + {0x1ff6, 0x1ffe, 1}, + {0x2000, 0x2064, 1}, + {0x206a, 0x2071, 1}, + {0x2074, 0x208e, 1}, + {0x2090, 0x209c, 1}, + {0x20a0, 0x20b9, 1}, + {0x20d0, 0x20f0, 1}, + {0x2100, 0x2189, 1}, + {0x2190, 0x23f3, 1}, + {0x2400, 0x2426, 1}, + {0x2440, 0x244a, 1}, + {0x2460, 0x26ff, 1}, + {0x2701, 0x2b4c, 1}, + {0x2b50, 0x2b59, 1}, + {0x2c00, 0x2c2e, 1}, + {0x2c30, 0x2c5e, 1}, + {0x2c60, 0x2cf3, 1}, + {0x2cf9, 0x2d25, 1}, + {0x2d27, 0x2d2d, 6}, + {0x2d30, 0x2d67, 1}, + {0x2d6f, 0x2d70, 1}, + {0x2d7f, 0x2d96, 1}, + {0x2da0, 0x2da6, 1}, + {0x2da8, 0x2dae, 1}, + {0x2db0, 0x2db6, 1}, + {0x2db8, 0x2dbe, 1}, + {0x2dc0, 0x2dc6, 1}, + {0x2dc8, 0x2dce, 1}, + {0x2dd0, 0x2dd6, 1}, + {0x2dd8, 0x2dde, 1}, + {0x2de0, 0x2e3b, 1}, + {0x2e80, 0x2e99, 1}, + {0x2e9b, 0x2ef3, 1}, + {0x2f00, 0x2fd5, 1}, + {0x2ff0, 0x2ffb, 1}, + {0x3000, 0x303f, 1}, + {0x3041, 0x3096, 1}, + {0x3099, 0x30ff, 1}, + {0x3105, 0x312d, 1}, + {0x3131, 0x318e, 1}, + {0x3190, 0x31ba, 1}, + {0x31c0, 0x31e3, 1}, + {0x31f0, 0x321e, 1}, + {0x3220, 0x32fe, 1}, + {0x3300, 0x4db5, 1}, + {0x4dc0, 0x9fcc, 1}, + {0xa000, 0xa48c, 1}, + {0xa490, 0xa4c6, 1}, + {0xa4d0, 0xa62b, 1}, + {0xa640, 0xa697, 1}, + {0xa69f, 0xa6f7, 1}, + {0xa700, 0xa78e, 1}, + {0xa790, 0xa793, 1}, + {0xa7a0, 0xa7aa, 1}, + {0xa7f8, 0xa82b, 1}, + {0xa830, 0xa839, 1}, + {0xa840, 0xa877, 1}, + {0xa880, 0xa8c4, 1}, + {0xa8ce, 0xa8d9, 1}, + {0xa8e0, 0xa8fb, 1}, + {0xa900, 0xa953, 1}, + {0xa95f, 0xa97c, 1}, + {0xa980, 0xa9cd, 1}, + {0xa9cf, 0xa9d9, 1}, + {0xa9de, 0xa9df, 1}, + {0xaa00, 0xaa36, 1}, + {0xaa40, 0xaa4d, 1}, + {0xaa50, 0xaa59, 1}, + {0xaa5c, 0xaa7b, 1}, + {0xaa80, 0xaac2, 1}, + {0xaadb, 0xaaf6, 1}, + {0xab01, 0xab06, 1}, + {0xab09, 0xab0e, 1}, + {0xab11, 0xab16, 1}, + {0xab20, 0xab26, 1}, + {0xab28, 0xab2e, 1}, + {0xabc0, 0xabed, 1}, + {0xabf0, 0xabf9, 1}, + {0xac00, 0xd7a3, 1}, + {0xd7b0, 0xd7c6, 1}, + {0xd7cb, 0xd7fb, 1}, + {0xd800, 0xfa6d, 1}, + {0xfa70, 0xfad9, 1}, + {0xfb00, 0xfb06, 1}, + {0xfb13, 0xfb17, 1}, + {0xfb1d, 0xfb36, 1}, + {0xfb38, 0xfb3c, 1}, + {0xfb3e, 0xfb40, 2}, + {0xfb41, 0xfb43, 2}, + {0xfb44, 0xfb46, 2}, + {0xfb47, 0xfbc1, 1}, + {0xfbd3, 0xfd3f, 1}, + {0xfd50, 0xfd8f, 1}, + {0xfd92, 0xfdc7, 1}, + {0xfdf0, 0xfdfd, 1}, + {0xfe00, 0xfe19, 1}, + {0xfe20, 0xfe26, 1}, + {0xfe30, 0xfe52, 1}, + {0xfe54, 0xfe66, 1}, + {0xfe68, 0xfe6b, 1}, + {0xfe70, 0xfe74, 1}, + {0xfe76, 0xfefc, 1}, + {0xfeff, 0xff01, 2}, + {0xff02, 0xffbe, 1}, + {0xffc2, 0xffc7, 1}, + {0xffca, 0xffcf, 1}, + {0xffd2, 0xffd7, 1}, + {0xffda, 0xffdc, 1}, + {0xffe0, 0xffe6, 1}, + {0xffe8, 0xffee, 1}, + {0xfff9, 0xfffd, 1}, + }, + R32: []unicode.Range32{ + {0x00010000, 0x0001000b, 1}, + {0x0001000d, 0x00010026, 1}, + {0x00010028, 0x0001003a, 1}, + {0x0001003c, 0x0001003d, 1}, + {0x0001003f, 0x0001004d, 1}, + {0x00010050, 0x0001005d, 1}, + {0x00010080, 0x000100fa, 1}, + {0x00010100, 0x00010102, 1}, + {0x00010107, 0x00010133, 1}, + {0x00010137, 0x0001018a, 1}, + {0x00010190, 0x0001019b, 1}, + {0x000101d0, 0x000101fd, 1}, + {0x00010280, 0x0001029c, 1}, + {0x000102a0, 0x000102d0, 1}, + {0x00010300, 0x0001031e, 1}, + {0x00010320, 0x00010323, 1}, + {0x00010330, 0x0001034a, 1}, + {0x00010380, 0x0001039d, 1}, + {0x0001039f, 0x000103c3, 1}, + {0x000103c8, 0x000103d5, 1}, + {0x00010400, 0x0001049d, 1}, + {0x000104a0, 0x000104a9, 1}, + {0x00010800, 0x00010805, 1}, + {0x00010808, 0x0001080a, 2}, + {0x0001080b, 0x00010835, 1}, + {0x00010837, 0x00010838, 1}, + {0x0001083c, 0x0001083f, 3}, + {0x00010840, 0x00010855, 1}, + {0x00010857, 0x0001085f, 1}, + {0x00010900, 0x0001091b, 1}, + {0x0001091f, 0x00010939, 1}, + {0x0001093f, 0x00010980, 65}, + {0x00010981, 0x000109b7, 1}, + {0x000109be, 0x000109bf, 1}, + {0x00010a00, 0x00010a03, 1}, + {0x00010a05, 0x00010a06, 1}, + {0x00010a0c, 0x00010a13, 1}, + {0x00010a15, 0x00010a17, 1}, + {0x00010a19, 0x00010a33, 1}, + {0x00010a38, 0x00010a3a, 1}, + {0x00010a3f, 0x00010a47, 1}, + {0x00010a50, 0x00010a58, 1}, + {0x00010a60, 0x00010a7f, 1}, + {0x00010b00, 0x00010b35, 1}, + {0x00010b39, 0x00010b55, 1}, + {0x00010b58, 0x00010b72, 1}, + {0x00010b78, 0x00010b7f, 1}, + {0x00010c00, 0x00010c48, 1}, + {0x00010e60, 0x00010e7e, 1}, + {0x00011000, 0x0001104d, 1}, + {0x00011052, 0x0001106f, 1}, + {0x00011080, 0x000110c1, 1}, + {0x000110d0, 0x000110e8, 1}, + {0x000110f0, 0x000110f9, 1}, + {0x00011100, 0x00011134, 1}, + {0x00011136, 0x00011143, 1}, + {0x00011180, 0x000111c8, 1}, + {0x000111d0, 0x000111d9, 1}, + {0x00011680, 0x000116b7, 1}, + {0x000116c0, 0x000116c9, 1}, + {0x00012000, 0x0001236e, 1}, + {0x00012400, 0x00012462, 1}, + {0x00012470, 0x00012473, 1}, + {0x00013000, 0x0001342e, 1}, + {0x00016800, 0x00016a38, 1}, + {0x00016f00, 0x00016f44, 1}, + {0x00016f50, 0x00016f7e, 1}, + {0x00016f8f, 0x00016f9f, 1}, + {0x0001b000, 0x0001b001, 1}, + {0x0001d000, 0x0001d0f5, 1}, + {0x0001d100, 0x0001d126, 1}, + {0x0001d129, 0x0001d1dd, 1}, + {0x0001d200, 0x0001d245, 1}, + {0x0001d300, 0x0001d356, 1}, + {0x0001d360, 0x0001d371, 1}, + {0x0001d400, 0x0001d454, 1}, + {0x0001d456, 0x0001d49c, 1}, + {0x0001d49e, 0x0001d49f, 1}, + {0x0001d4a2, 0x0001d4a5, 3}, + {0x0001d4a6, 0x0001d4a9, 3}, + {0x0001d4aa, 0x0001d4ac, 1}, + {0x0001d4ae, 0x0001d4b9, 1}, + {0x0001d4bb, 0x0001d4bd, 2}, + {0x0001d4be, 0x0001d4c3, 1}, + {0x0001d4c5, 0x0001d505, 1}, + {0x0001d507, 0x0001d50a, 1}, + {0x0001d50d, 0x0001d514, 1}, + {0x0001d516, 0x0001d51c, 1}, + {0x0001d51e, 0x0001d539, 1}, + {0x0001d53b, 0x0001d53e, 1}, + {0x0001d540, 0x0001d544, 1}, + {0x0001d546, 0x0001d54a, 4}, + {0x0001d54b, 0x0001d550, 1}, + {0x0001d552, 0x0001d6a5, 1}, + {0x0001d6a8, 0x0001d7cb, 1}, + {0x0001d7ce, 0x0001d7ff, 1}, + {0x0001ee00, 0x0001ee03, 1}, + {0x0001ee05, 0x0001ee1f, 1}, + {0x0001ee21, 0x0001ee22, 1}, + {0x0001ee24, 0x0001ee27, 3}, + {0x0001ee29, 0x0001ee32, 1}, + {0x0001ee34, 0x0001ee37, 1}, + {0x0001ee39, 0x0001ee3b, 2}, + {0x0001ee42, 0x0001ee47, 5}, + {0x0001ee49, 0x0001ee4d, 2}, + {0x0001ee4e, 0x0001ee4f, 1}, + {0x0001ee51, 0x0001ee52, 1}, + {0x0001ee54, 0x0001ee57, 3}, + {0x0001ee59, 0x0001ee61, 2}, + {0x0001ee62, 0x0001ee64, 2}, + {0x0001ee67, 0x0001ee6a, 1}, + {0x0001ee6c, 0x0001ee72, 1}, + {0x0001ee74, 0x0001ee77, 1}, + {0x0001ee79, 0x0001ee7c, 1}, + {0x0001ee7e, 0x0001ee80, 2}, + {0x0001ee81, 0x0001ee89, 1}, + {0x0001ee8b, 0x0001ee9b, 1}, + {0x0001eea1, 0x0001eea3, 1}, + {0x0001eea5, 0x0001eea9, 1}, + {0x0001eeab, 0x0001eebb, 1}, + {0x0001eef0, 0x0001eef1, 1}, + {0x0001f000, 0x0001f02b, 1}, + {0x0001f030, 0x0001f093, 1}, + {0x0001f0a0, 0x0001f0ae, 1}, + {0x0001f0b1, 0x0001f0be, 1}, + {0x0001f0c1, 0x0001f0cf, 1}, + {0x0001f0d1, 0x0001f0df, 1}, + {0x0001f100, 0x0001f10a, 1}, + {0x0001f110, 0x0001f12e, 1}, + {0x0001f130, 0x0001f16b, 1}, + {0x0001f170, 0x0001f19a, 1}, + {0x0001f1e6, 0x0001f202, 1}, + {0x0001f210, 0x0001f23a, 1}, + {0x0001f240, 0x0001f248, 1}, + {0x0001f250, 0x0001f251, 1}, + {0x0001f300, 0x0001f320, 1}, + {0x0001f330, 0x0001f335, 1}, + {0x0001f337, 0x0001f37c, 1}, + {0x0001f380, 0x0001f393, 1}, + {0x0001f3a0, 0x0001f3c4, 1}, + {0x0001f3c6, 0x0001f3ca, 1}, + {0x0001f3e0, 0x0001f3f0, 1}, + {0x0001f400, 0x0001f43e, 1}, + {0x0001f440, 0x0001f442, 2}, + {0x0001f443, 0x0001f4f7, 1}, + {0x0001f4f9, 0x0001f4fc, 1}, + {0x0001f500, 0x0001f53d, 1}, + {0x0001f540, 0x0001f543, 1}, + {0x0001f550, 0x0001f567, 1}, + {0x0001f5fb, 0x0001f640, 1}, + {0x0001f645, 0x0001f64f, 1}, + {0x0001f680, 0x0001f6c5, 1}, + {0x0001f700, 0x0001f773, 1}, + {0x00020000, 0x0002a6d6, 1}, + {0x0002a700, 0x0002b734, 1}, + {0x0002b740, 0x0002b81d, 1}, + {0x0002f800, 0x0002fa1d, 1}, + {0x000e0001, 0x000e0020, 31}, + {0x000e0021, 0x000e007f, 1}, + {0x000e0100, 0x000e01ef, 1}, + {0x000f0000, 0x000ffffd, 1}, + {0x00100000, 0x0010fffd, 1}, + }, + LatinOffset: 0, +} + +// size 4160 bytes (4 KiB) +var assigned6_2_0 = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x0000, 0x0377, 1}, + {0x037a, 0x037e, 1}, + {0x0384, 0x038a, 1}, + {0x038c, 0x038e, 2}, + {0x038f, 0x03a1, 1}, + {0x03a3, 0x0527, 1}, + {0x0531, 0x0556, 1}, + {0x0559, 0x055f, 1}, + {0x0561, 0x0587, 1}, + {0x0589, 0x058a, 1}, + {0x058f, 0x0591, 2}, + {0x0592, 0x05c7, 1}, + {0x05d0, 0x05ea, 1}, + {0x05f0, 0x05f4, 1}, + {0x0600, 0x0604, 1}, + {0x0606, 0x061b, 1}, + {0x061e, 0x070d, 1}, + {0x070f, 0x074a, 1}, + {0x074d, 0x07b1, 1}, + {0x07c0, 0x07fa, 1}, + {0x0800, 0x082d, 1}, + {0x0830, 0x083e, 1}, + {0x0840, 0x085b, 1}, + {0x085e, 0x08a0, 66}, + {0x08a2, 0x08ac, 1}, + {0x08e4, 0x08fe, 1}, + {0x0900, 0x0977, 1}, + {0x0979, 0x097f, 1}, + {0x0981, 0x0983, 1}, + {0x0985, 0x098c, 1}, + {0x098f, 0x0990, 1}, + {0x0993, 0x09a8, 1}, + {0x09aa, 0x09b0, 1}, + {0x09b2, 0x09b6, 4}, + {0x09b7, 0x09b9, 1}, + {0x09bc, 0x09c4, 1}, + {0x09c7, 0x09c8, 1}, + {0x09cb, 0x09ce, 1}, + {0x09d7, 0x09dc, 5}, + {0x09dd, 0x09df, 2}, + {0x09e0, 0x09e3, 1}, + {0x09e6, 0x09fb, 1}, + {0x0a01, 0x0a03, 1}, + {0x0a05, 0x0a0a, 1}, + {0x0a0f, 0x0a10, 1}, + {0x0a13, 0x0a28, 1}, + {0x0a2a, 0x0a30, 1}, + {0x0a32, 0x0a33, 1}, + {0x0a35, 0x0a36, 1}, + {0x0a38, 0x0a39, 1}, + {0x0a3c, 0x0a3e, 2}, + {0x0a3f, 0x0a42, 1}, + {0x0a47, 0x0a48, 1}, + {0x0a4b, 0x0a4d, 1}, + {0x0a51, 0x0a59, 8}, + {0x0a5a, 0x0a5c, 1}, + {0x0a5e, 0x0a66, 8}, + {0x0a67, 0x0a75, 1}, + {0x0a81, 0x0a83, 1}, + {0x0a85, 0x0a8d, 1}, + {0x0a8f, 0x0a91, 1}, + {0x0a93, 0x0aa8, 1}, + {0x0aaa, 0x0ab0, 1}, + {0x0ab2, 0x0ab3, 1}, + {0x0ab5, 0x0ab9, 1}, + {0x0abc, 0x0ac5, 1}, + {0x0ac7, 0x0ac9, 1}, + {0x0acb, 0x0acd, 1}, + {0x0ad0, 0x0ae0, 16}, + {0x0ae1, 0x0ae3, 1}, + {0x0ae6, 0x0af1, 1}, + {0x0b01, 0x0b03, 1}, + {0x0b05, 0x0b0c, 1}, + {0x0b0f, 0x0b10, 1}, + {0x0b13, 0x0b28, 1}, + {0x0b2a, 0x0b30, 1}, + {0x0b32, 0x0b33, 1}, + {0x0b35, 0x0b39, 1}, + {0x0b3c, 0x0b44, 1}, + {0x0b47, 0x0b48, 1}, + {0x0b4b, 0x0b4d, 1}, + {0x0b56, 0x0b57, 1}, + {0x0b5c, 0x0b5d, 1}, + {0x0b5f, 0x0b63, 1}, + {0x0b66, 0x0b77, 1}, + {0x0b82, 0x0b83, 1}, + {0x0b85, 0x0b8a, 1}, + {0x0b8e, 0x0b90, 1}, + {0x0b92, 0x0b95, 1}, + {0x0b99, 0x0b9a, 1}, + {0x0b9c, 0x0b9e, 2}, + {0x0b9f, 0x0ba3, 4}, + {0x0ba4, 0x0ba8, 4}, + {0x0ba9, 0x0baa, 1}, + {0x0bae, 0x0bb9, 1}, + {0x0bbe, 0x0bc2, 1}, + {0x0bc6, 0x0bc8, 1}, + {0x0bca, 0x0bcd, 1}, + {0x0bd0, 0x0bd7, 7}, + {0x0be6, 0x0bfa, 1}, + {0x0c01, 0x0c03, 1}, + {0x0c05, 0x0c0c, 1}, + {0x0c0e, 0x0c10, 1}, + {0x0c12, 0x0c28, 1}, + {0x0c2a, 0x0c33, 1}, + {0x0c35, 0x0c39, 1}, + {0x0c3d, 0x0c44, 1}, + {0x0c46, 0x0c48, 1}, + {0x0c4a, 0x0c4d, 1}, + {0x0c55, 0x0c56, 1}, + {0x0c58, 0x0c59, 1}, + {0x0c60, 0x0c63, 1}, + {0x0c66, 0x0c6f, 1}, + {0x0c78, 0x0c7f, 1}, + {0x0c82, 0x0c83, 1}, + {0x0c85, 0x0c8c, 1}, + {0x0c8e, 0x0c90, 1}, + {0x0c92, 0x0ca8, 1}, + {0x0caa, 0x0cb3, 1}, + {0x0cb5, 0x0cb9, 1}, + {0x0cbc, 0x0cc4, 1}, + {0x0cc6, 0x0cc8, 1}, + {0x0cca, 0x0ccd, 1}, + {0x0cd5, 0x0cd6, 1}, + {0x0cde, 0x0ce0, 2}, + {0x0ce1, 0x0ce3, 1}, + {0x0ce6, 0x0cef, 1}, + {0x0cf1, 0x0cf2, 1}, + {0x0d02, 0x0d03, 1}, + {0x0d05, 0x0d0c, 1}, + {0x0d0e, 0x0d10, 1}, + {0x0d12, 0x0d3a, 1}, + {0x0d3d, 0x0d44, 1}, + {0x0d46, 0x0d48, 1}, + {0x0d4a, 0x0d4e, 1}, + {0x0d57, 0x0d60, 9}, + {0x0d61, 0x0d63, 1}, + {0x0d66, 0x0d75, 1}, + {0x0d79, 0x0d7f, 1}, + {0x0d82, 0x0d83, 1}, + {0x0d85, 0x0d96, 1}, + {0x0d9a, 0x0db1, 1}, + {0x0db3, 0x0dbb, 1}, + {0x0dbd, 0x0dc0, 3}, + {0x0dc1, 0x0dc6, 1}, + {0x0dca, 0x0dcf, 5}, + {0x0dd0, 0x0dd4, 1}, + {0x0dd6, 0x0dd8, 2}, + {0x0dd9, 0x0ddf, 1}, + {0x0df2, 0x0df4, 1}, + {0x0e01, 0x0e3a, 1}, + {0x0e3f, 0x0e5b, 1}, + {0x0e81, 0x0e82, 1}, + {0x0e84, 0x0e87, 3}, + {0x0e88, 0x0e8a, 2}, + {0x0e8d, 0x0e94, 7}, + {0x0e95, 0x0e97, 1}, + {0x0e99, 0x0e9f, 1}, + {0x0ea1, 0x0ea3, 1}, + {0x0ea5, 0x0ea7, 2}, + {0x0eaa, 0x0eab, 1}, + {0x0ead, 0x0eb9, 1}, + {0x0ebb, 0x0ebd, 1}, + {0x0ec0, 0x0ec4, 1}, + {0x0ec6, 0x0ec8, 2}, + {0x0ec9, 0x0ecd, 1}, + {0x0ed0, 0x0ed9, 1}, + {0x0edc, 0x0edf, 1}, + {0x0f00, 0x0f47, 1}, + {0x0f49, 0x0f6c, 1}, + {0x0f71, 0x0f97, 1}, + {0x0f99, 0x0fbc, 1}, + {0x0fbe, 0x0fcc, 1}, + {0x0fce, 0x0fda, 1}, + {0x1000, 0x10c5, 1}, + {0x10c7, 0x10cd, 6}, + {0x10d0, 0x1248, 1}, + {0x124a, 0x124d, 1}, + {0x1250, 0x1256, 1}, + {0x1258, 0x125a, 2}, + {0x125b, 0x125d, 1}, + {0x1260, 0x1288, 1}, + {0x128a, 0x128d, 1}, + {0x1290, 0x12b0, 1}, + {0x12b2, 0x12b5, 1}, + {0x12b8, 0x12be, 1}, + {0x12c0, 0x12c2, 2}, + {0x12c3, 0x12c5, 1}, + {0x12c8, 0x12d6, 1}, + {0x12d8, 0x1310, 1}, + {0x1312, 0x1315, 1}, + {0x1318, 0x135a, 1}, + {0x135d, 0x137c, 1}, + {0x1380, 0x1399, 1}, + {0x13a0, 0x13f4, 1}, + {0x1400, 0x169c, 1}, + {0x16a0, 0x16f0, 1}, + {0x1700, 0x170c, 1}, + {0x170e, 0x1714, 1}, + {0x1720, 0x1736, 1}, + {0x1740, 0x1753, 1}, + {0x1760, 0x176c, 1}, + {0x176e, 0x1770, 1}, + {0x1772, 0x1773, 1}, + {0x1780, 0x17dd, 1}, + {0x17e0, 0x17e9, 1}, + {0x17f0, 0x17f9, 1}, + {0x1800, 0x180e, 1}, + {0x1810, 0x1819, 1}, + {0x1820, 0x1877, 1}, + {0x1880, 0x18aa, 1}, + {0x18b0, 0x18f5, 1}, + {0x1900, 0x191c, 1}, + {0x1920, 0x192b, 1}, + {0x1930, 0x193b, 1}, + {0x1940, 0x1944, 4}, + {0x1945, 0x196d, 1}, + {0x1970, 0x1974, 1}, + {0x1980, 0x19ab, 1}, + {0x19b0, 0x19c9, 1}, + {0x19d0, 0x19da, 1}, + {0x19de, 0x1a1b, 1}, + {0x1a1e, 0x1a5e, 1}, + {0x1a60, 0x1a7c, 1}, + {0x1a7f, 0x1a89, 1}, + {0x1a90, 0x1a99, 1}, + {0x1aa0, 0x1aad, 1}, + {0x1b00, 0x1b4b, 1}, + {0x1b50, 0x1b7c, 1}, + {0x1b80, 0x1bf3, 1}, + {0x1bfc, 0x1c37, 1}, + {0x1c3b, 0x1c49, 1}, + {0x1c4d, 0x1c7f, 1}, + {0x1cc0, 0x1cc7, 1}, + {0x1cd0, 0x1cf6, 1}, + {0x1d00, 0x1de6, 1}, + {0x1dfc, 0x1f15, 1}, + {0x1f18, 0x1f1d, 1}, + {0x1f20, 0x1f45, 1}, + {0x1f48, 0x1f4d, 1}, + {0x1f50, 0x1f57, 1}, + {0x1f59, 0x1f5f, 2}, + {0x1f60, 0x1f7d, 1}, + {0x1f80, 0x1fb4, 1}, + {0x1fb6, 0x1fc4, 1}, + {0x1fc6, 0x1fd3, 1}, + {0x1fd6, 0x1fdb, 1}, + {0x1fdd, 0x1fef, 1}, + {0x1ff2, 0x1ff4, 1}, + {0x1ff6, 0x1ffe, 1}, + {0x2000, 0x2064, 1}, + {0x206a, 0x2071, 1}, + {0x2074, 0x208e, 1}, + {0x2090, 0x209c, 1}, + {0x20a0, 0x20ba, 1}, + {0x20d0, 0x20f0, 1}, + {0x2100, 0x2189, 1}, + {0x2190, 0x23f3, 1}, + {0x2400, 0x2426, 1}, + {0x2440, 0x244a, 1}, + {0x2460, 0x26ff, 1}, + {0x2701, 0x2b4c, 1}, + {0x2b50, 0x2b59, 1}, + {0x2c00, 0x2c2e, 1}, + {0x2c30, 0x2c5e, 1}, + {0x2c60, 0x2cf3, 1}, + {0x2cf9, 0x2d25, 1}, + {0x2d27, 0x2d2d, 6}, + {0x2d30, 0x2d67, 1}, + {0x2d6f, 0x2d70, 1}, + {0x2d7f, 0x2d96, 1}, + {0x2da0, 0x2da6, 1}, + {0x2da8, 0x2dae, 1}, + {0x2db0, 0x2db6, 1}, + {0x2db8, 0x2dbe, 1}, + {0x2dc0, 0x2dc6, 1}, + {0x2dc8, 0x2dce, 1}, + {0x2dd0, 0x2dd6, 1}, + {0x2dd8, 0x2dde, 1}, + {0x2de0, 0x2e3b, 1}, + {0x2e80, 0x2e99, 1}, + {0x2e9b, 0x2ef3, 1}, + {0x2f00, 0x2fd5, 1}, + {0x2ff0, 0x2ffb, 1}, + {0x3000, 0x303f, 1}, + {0x3041, 0x3096, 1}, + {0x3099, 0x30ff, 1}, + {0x3105, 0x312d, 1}, + {0x3131, 0x318e, 1}, + {0x3190, 0x31ba, 1}, + {0x31c0, 0x31e3, 1}, + {0x31f0, 0x321e, 1}, + {0x3220, 0x32fe, 1}, + {0x3300, 0x4db5, 1}, + {0x4dc0, 0x9fcc, 1}, + {0xa000, 0xa48c, 1}, + {0xa490, 0xa4c6, 1}, + {0xa4d0, 0xa62b, 1}, + {0xa640, 0xa697, 1}, + {0xa69f, 0xa6f7, 1}, + {0xa700, 0xa78e, 1}, + {0xa790, 0xa793, 1}, + {0xa7a0, 0xa7aa, 1}, + {0xa7f8, 0xa82b, 1}, + {0xa830, 0xa839, 1}, + {0xa840, 0xa877, 1}, + {0xa880, 0xa8c4, 1}, + {0xa8ce, 0xa8d9, 1}, + {0xa8e0, 0xa8fb, 1}, + {0xa900, 0xa953, 1}, + {0xa95f, 0xa97c, 1}, + {0xa980, 0xa9cd, 1}, + {0xa9cf, 0xa9d9, 1}, + {0xa9de, 0xa9df, 1}, + {0xaa00, 0xaa36, 1}, + {0xaa40, 0xaa4d, 1}, + {0xaa50, 0xaa59, 1}, + {0xaa5c, 0xaa7b, 1}, + {0xaa80, 0xaac2, 1}, + {0xaadb, 0xaaf6, 1}, + {0xab01, 0xab06, 1}, + {0xab09, 0xab0e, 1}, + {0xab11, 0xab16, 1}, + {0xab20, 0xab26, 1}, + {0xab28, 0xab2e, 1}, + {0xabc0, 0xabed, 1}, + {0xabf0, 0xabf9, 1}, + {0xac00, 0xd7a3, 1}, + {0xd7b0, 0xd7c6, 1}, + {0xd7cb, 0xd7fb, 1}, + {0xd800, 0xfa6d, 1}, + {0xfa70, 0xfad9, 1}, + {0xfb00, 0xfb06, 1}, + {0xfb13, 0xfb17, 1}, + {0xfb1d, 0xfb36, 1}, + {0xfb38, 0xfb3c, 1}, + {0xfb3e, 0xfb40, 2}, + {0xfb41, 0xfb43, 2}, + {0xfb44, 0xfb46, 2}, + {0xfb47, 0xfbc1, 1}, + {0xfbd3, 0xfd3f, 1}, + {0xfd50, 0xfd8f, 1}, + {0xfd92, 0xfdc7, 1}, + {0xfdf0, 0xfdfd, 1}, + {0xfe00, 0xfe19, 1}, + {0xfe20, 0xfe26, 1}, + {0xfe30, 0xfe52, 1}, + {0xfe54, 0xfe66, 1}, + {0xfe68, 0xfe6b, 1}, + {0xfe70, 0xfe74, 1}, + {0xfe76, 0xfefc, 1}, + {0xfeff, 0xff01, 2}, + {0xff02, 0xffbe, 1}, + {0xffc2, 0xffc7, 1}, + {0xffca, 0xffcf, 1}, + {0xffd2, 0xffd7, 1}, + {0xffda, 0xffdc, 1}, + {0xffe0, 0xffe6, 1}, + {0xffe8, 0xffee, 1}, + {0xfff9, 0xfffd, 1}, + }, + R32: []unicode.Range32{ + {0x00010000, 0x0001000b, 1}, + {0x0001000d, 0x00010026, 1}, + {0x00010028, 0x0001003a, 1}, + {0x0001003c, 0x0001003d, 1}, + {0x0001003f, 0x0001004d, 1}, + {0x00010050, 0x0001005d, 1}, + {0x00010080, 0x000100fa, 1}, + {0x00010100, 0x00010102, 1}, + {0x00010107, 0x00010133, 1}, + {0x00010137, 0x0001018a, 1}, + {0x00010190, 0x0001019b, 1}, + {0x000101d0, 0x000101fd, 1}, + {0x00010280, 0x0001029c, 1}, + {0x000102a0, 0x000102d0, 1}, + {0x00010300, 0x0001031e, 1}, + {0x00010320, 0x00010323, 1}, + {0x00010330, 0x0001034a, 1}, + {0x00010380, 0x0001039d, 1}, + {0x0001039f, 0x000103c3, 1}, + {0x000103c8, 0x000103d5, 1}, + {0x00010400, 0x0001049d, 1}, + {0x000104a0, 0x000104a9, 1}, + {0x00010800, 0x00010805, 1}, + {0x00010808, 0x0001080a, 2}, + {0x0001080b, 0x00010835, 1}, + {0x00010837, 0x00010838, 1}, + {0x0001083c, 0x0001083f, 3}, + {0x00010840, 0x00010855, 1}, + {0x00010857, 0x0001085f, 1}, + {0x00010900, 0x0001091b, 1}, + {0x0001091f, 0x00010939, 1}, + {0x0001093f, 0x00010980, 65}, + {0x00010981, 0x000109b7, 1}, + {0x000109be, 0x000109bf, 1}, + {0x00010a00, 0x00010a03, 1}, + {0x00010a05, 0x00010a06, 1}, + {0x00010a0c, 0x00010a13, 1}, + {0x00010a15, 0x00010a17, 1}, + {0x00010a19, 0x00010a33, 1}, + {0x00010a38, 0x00010a3a, 1}, + {0x00010a3f, 0x00010a47, 1}, + {0x00010a50, 0x00010a58, 1}, + {0x00010a60, 0x00010a7f, 1}, + {0x00010b00, 0x00010b35, 1}, + {0x00010b39, 0x00010b55, 1}, + {0x00010b58, 0x00010b72, 1}, + {0x00010b78, 0x00010b7f, 1}, + {0x00010c00, 0x00010c48, 1}, + {0x00010e60, 0x00010e7e, 1}, + {0x00011000, 0x0001104d, 1}, + {0x00011052, 0x0001106f, 1}, + {0x00011080, 0x000110c1, 1}, + {0x000110d0, 0x000110e8, 1}, + {0x000110f0, 0x000110f9, 1}, + {0x00011100, 0x00011134, 1}, + {0x00011136, 0x00011143, 1}, + {0x00011180, 0x000111c8, 1}, + {0x000111d0, 0x000111d9, 1}, + {0x00011680, 0x000116b7, 1}, + {0x000116c0, 0x000116c9, 1}, + {0x00012000, 0x0001236e, 1}, + {0x00012400, 0x00012462, 1}, + {0x00012470, 0x00012473, 1}, + {0x00013000, 0x0001342e, 1}, + {0x00016800, 0x00016a38, 1}, + {0x00016f00, 0x00016f44, 1}, + {0x00016f50, 0x00016f7e, 1}, + {0x00016f8f, 0x00016f9f, 1}, + {0x0001b000, 0x0001b001, 1}, + {0x0001d000, 0x0001d0f5, 1}, + {0x0001d100, 0x0001d126, 1}, + {0x0001d129, 0x0001d1dd, 1}, + {0x0001d200, 0x0001d245, 1}, + {0x0001d300, 0x0001d356, 1}, + {0x0001d360, 0x0001d371, 1}, + {0x0001d400, 0x0001d454, 1}, + {0x0001d456, 0x0001d49c, 1}, + {0x0001d49e, 0x0001d49f, 1}, + {0x0001d4a2, 0x0001d4a5, 3}, + {0x0001d4a6, 0x0001d4a9, 3}, + {0x0001d4aa, 0x0001d4ac, 1}, + {0x0001d4ae, 0x0001d4b9, 1}, + {0x0001d4bb, 0x0001d4bd, 2}, + {0x0001d4be, 0x0001d4c3, 1}, + {0x0001d4c5, 0x0001d505, 1}, + {0x0001d507, 0x0001d50a, 1}, + {0x0001d50d, 0x0001d514, 1}, + {0x0001d516, 0x0001d51c, 1}, + {0x0001d51e, 0x0001d539, 1}, + {0x0001d53b, 0x0001d53e, 1}, + {0x0001d540, 0x0001d544, 1}, + {0x0001d546, 0x0001d54a, 4}, + {0x0001d54b, 0x0001d550, 1}, + {0x0001d552, 0x0001d6a5, 1}, + {0x0001d6a8, 0x0001d7cb, 1}, + {0x0001d7ce, 0x0001d7ff, 1}, + {0x0001ee00, 0x0001ee03, 1}, + {0x0001ee05, 0x0001ee1f, 1}, + {0x0001ee21, 0x0001ee22, 1}, + {0x0001ee24, 0x0001ee27, 3}, + {0x0001ee29, 0x0001ee32, 1}, + {0x0001ee34, 0x0001ee37, 1}, + {0x0001ee39, 0x0001ee3b, 2}, + {0x0001ee42, 0x0001ee47, 5}, + {0x0001ee49, 0x0001ee4d, 2}, + {0x0001ee4e, 0x0001ee4f, 1}, + {0x0001ee51, 0x0001ee52, 1}, + {0x0001ee54, 0x0001ee57, 3}, + {0x0001ee59, 0x0001ee61, 2}, + {0x0001ee62, 0x0001ee64, 2}, + {0x0001ee67, 0x0001ee6a, 1}, + {0x0001ee6c, 0x0001ee72, 1}, + {0x0001ee74, 0x0001ee77, 1}, + {0x0001ee79, 0x0001ee7c, 1}, + {0x0001ee7e, 0x0001ee80, 2}, + {0x0001ee81, 0x0001ee89, 1}, + {0x0001ee8b, 0x0001ee9b, 1}, + {0x0001eea1, 0x0001eea3, 1}, + {0x0001eea5, 0x0001eea9, 1}, + {0x0001eeab, 0x0001eebb, 1}, + {0x0001eef0, 0x0001eef1, 1}, + {0x0001f000, 0x0001f02b, 1}, + {0x0001f030, 0x0001f093, 1}, + {0x0001f0a0, 0x0001f0ae, 1}, + {0x0001f0b1, 0x0001f0be, 1}, + {0x0001f0c1, 0x0001f0cf, 1}, + {0x0001f0d1, 0x0001f0df, 1}, + {0x0001f100, 0x0001f10a, 1}, + {0x0001f110, 0x0001f12e, 1}, + {0x0001f130, 0x0001f16b, 1}, + {0x0001f170, 0x0001f19a, 1}, + {0x0001f1e6, 0x0001f202, 1}, + {0x0001f210, 0x0001f23a, 1}, + {0x0001f240, 0x0001f248, 1}, + {0x0001f250, 0x0001f251, 1}, + {0x0001f300, 0x0001f320, 1}, + {0x0001f330, 0x0001f335, 1}, + {0x0001f337, 0x0001f37c, 1}, + {0x0001f380, 0x0001f393, 1}, + {0x0001f3a0, 0x0001f3c4, 1}, + {0x0001f3c6, 0x0001f3ca, 1}, + {0x0001f3e0, 0x0001f3f0, 1}, + {0x0001f400, 0x0001f43e, 1}, + {0x0001f440, 0x0001f442, 2}, + {0x0001f443, 0x0001f4f7, 1}, + {0x0001f4f9, 0x0001f4fc, 1}, + {0x0001f500, 0x0001f53d, 1}, + {0x0001f540, 0x0001f543, 1}, + {0x0001f550, 0x0001f567, 1}, + {0x0001f5fb, 0x0001f640, 1}, + {0x0001f645, 0x0001f64f, 1}, + {0x0001f680, 0x0001f6c5, 1}, + {0x0001f700, 0x0001f773, 1}, + {0x00020000, 0x0002a6d6, 1}, + {0x0002a700, 0x0002b734, 1}, + {0x0002b740, 0x0002b81d, 1}, + {0x0002f800, 0x0002fa1d, 1}, + {0x000e0001, 0x000e0020, 31}, + {0x000e0021, 0x000e007f, 1}, + {0x000e0100, 0x000e01ef, 1}, + {0x000f0000, 0x000ffffd, 1}, + {0x00100000, 0x0010fffd, 1}, + }, + LatinOffset: 0, +} + +// size 4160 bytes (4 KiB) +var assigned6_3_0 = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x0000, 0x0377, 1}, + {0x037a, 0x037e, 1}, + {0x0384, 0x038a, 1}, + {0x038c, 0x038e, 2}, + {0x038f, 0x03a1, 1}, + {0x03a3, 0x0527, 1}, + {0x0531, 0x0556, 1}, + {0x0559, 0x055f, 1}, + {0x0561, 0x0587, 1}, + {0x0589, 0x058a, 1}, + {0x058f, 0x0591, 2}, + {0x0592, 0x05c7, 1}, + {0x05d0, 0x05ea, 1}, + {0x05f0, 0x05f4, 1}, + {0x0600, 0x0604, 1}, + {0x0606, 0x061c, 1}, + {0x061e, 0x070d, 1}, + {0x070f, 0x074a, 1}, + {0x074d, 0x07b1, 1}, + {0x07c0, 0x07fa, 1}, + {0x0800, 0x082d, 1}, + {0x0830, 0x083e, 1}, + {0x0840, 0x085b, 1}, + {0x085e, 0x08a0, 66}, + {0x08a2, 0x08ac, 1}, + {0x08e4, 0x08fe, 1}, + {0x0900, 0x0977, 1}, + {0x0979, 0x097f, 1}, + {0x0981, 0x0983, 1}, + {0x0985, 0x098c, 1}, + {0x098f, 0x0990, 1}, + {0x0993, 0x09a8, 1}, + {0x09aa, 0x09b0, 1}, + {0x09b2, 0x09b6, 4}, + {0x09b7, 0x09b9, 1}, + {0x09bc, 0x09c4, 1}, + {0x09c7, 0x09c8, 1}, + {0x09cb, 0x09ce, 1}, + {0x09d7, 0x09dc, 5}, + {0x09dd, 0x09df, 2}, + {0x09e0, 0x09e3, 1}, + {0x09e6, 0x09fb, 1}, + {0x0a01, 0x0a03, 1}, + {0x0a05, 0x0a0a, 1}, + {0x0a0f, 0x0a10, 1}, + {0x0a13, 0x0a28, 1}, + {0x0a2a, 0x0a30, 1}, + {0x0a32, 0x0a33, 1}, + {0x0a35, 0x0a36, 1}, + {0x0a38, 0x0a39, 1}, + {0x0a3c, 0x0a3e, 2}, + {0x0a3f, 0x0a42, 1}, + {0x0a47, 0x0a48, 1}, + {0x0a4b, 0x0a4d, 1}, + {0x0a51, 0x0a59, 8}, + {0x0a5a, 0x0a5c, 1}, + {0x0a5e, 0x0a66, 8}, + {0x0a67, 0x0a75, 1}, + {0x0a81, 0x0a83, 1}, + {0x0a85, 0x0a8d, 1}, + {0x0a8f, 0x0a91, 1}, + {0x0a93, 0x0aa8, 1}, + {0x0aaa, 0x0ab0, 1}, + {0x0ab2, 0x0ab3, 1}, + {0x0ab5, 0x0ab9, 1}, + {0x0abc, 0x0ac5, 1}, + {0x0ac7, 0x0ac9, 1}, + {0x0acb, 0x0acd, 1}, + {0x0ad0, 0x0ae0, 16}, + {0x0ae1, 0x0ae3, 1}, + {0x0ae6, 0x0af1, 1}, + {0x0b01, 0x0b03, 1}, + {0x0b05, 0x0b0c, 1}, + {0x0b0f, 0x0b10, 1}, + {0x0b13, 0x0b28, 1}, + {0x0b2a, 0x0b30, 1}, + {0x0b32, 0x0b33, 1}, + {0x0b35, 0x0b39, 1}, + {0x0b3c, 0x0b44, 1}, + {0x0b47, 0x0b48, 1}, + {0x0b4b, 0x0b4d, 1}, + {0x0b56, 0x0b57, 1}, + {0x0b5c, 0x0b5d, 1}, + {0x0b5f, 0x0b63, 1}, + {0x0b66, 0x0b77, 1}, + {0x0b82, 0x0b83, 1}, + {0x0b85, 0x0b8a, 1}, + {0x0b8e, 0x0b90, 1}, + {0x0b92, 0x0b95, 1}, + {0x0b99, 0x0b9a, 1}, + {0x0b9c, 0x0b9e, 2}, + {0x0b9f, 0x0ba3, 4}, + {0x0ba4, 0x0ba8, 4}, + {0x0ba9, 0x0baa, 1}, + {0x0bae, 0x0bb9, 1}, + {0x0bbe, 0x0bc2, 1}, + {0x0bc6, 0x0bc8, 1}, + {0x0bca, 0x0bcd, 1}, + {0x0bd0, 0x0bd7, 7}, + {0x0be6, 0x0bfa, 1}, + {0x0c01, 0x0c03, 1}, + {0x0c05, 0x0c0c, 1}, + {0x0c0e, 0x0c10, 1}, + {0x0c12, 0x0c28, 1}, + {0x0c2a, 0x0c33, 1}, + {0x0c35, 0x0c39, 1}, + {0x0c3d, 0x0c44, 1}, + {0x0c46, 0x0c48, 1}, + {0x0c4a, 0x0c4d, 1}, + {0x0c55, 0x0c56, 1}, + {0x0c58, 0x0c59, 1}, + {0x0c60, 0x0c63, 1}, + {0x0c66, 0x0c6f, 1}, + {0x0c78, 0x0c7f, 1}, + {0x0c82, 0x0c83, 1}, + {0x0c85, 0x0c8c, 1}, + {0x0c8e, 0x0c90, 1}, + {0x0c92, 0x0ca8, 1}, + {0x0caa, 0x0cb3, 1}, + {0x0cb5, 0x0cb9, 1}, + {0x0cbc, 0x0cc4, 1}, + {0x0cc6, 0x0cc8, 1}, + {0x0cca, 0x0ccd, 1}, + {0x0cd5, 0x0cd6, 1}, + {0x0cde, 0x0ce0, 2}, + {0x0ce1, 0x0ce3, 1}, + {0x0ce6, 0x0cef, 1}, + {0x0cf1, 0x0cf2, 1}, + {0x0d02, 0x0d03, 1}, + {0x0d05, 0x0d0c, 1}, + {0x0d0e, 0x0d10, 1}, + {0x0d12, 0x0d3a, 1}, + {0x0d3d, 0x0d44, 1}, + {0x0d46, 0x0d48, 1}, + {0x0d4a, 0x0d4e, 1}, + {0x0d57, 0x0d60, 9}, + {0x0d61, 0x0d63, 1}, + {0x0d66, 0x0d75, 1}, + {0x0d79, 0x0d7f, 1}, + {0x0d82, 0x0d83, 1}, + {0x0d85, 0x0d96, 1}, + {0x0d9a, 0x0db1, 1}, + {0x0db3, 0x0dbb, 1}, + {0x0dbd, 0x0dc0, 3}, + {0x0dc1, 0x0dc6, 1}, + {0x0dca, 0x0dcf, 5}, + {0x0dd0, 0x0dd4, 1}, + {0x0dd6, 0x0dd8, 2}, + {0x0dd9, 0x0ddf, 1}, + {0x0df2, 0x0df4, 1}, + {0x0e01, 0x0e3a, 1}, + {0x0e3f, 0x0e5b, 1}, + {0x0e81, 0x0e82, 1}, + {0x0e84, 0x0e87, 3}, + {0x0e88, 0x0e8a, 2}, + {0x0e8d, 0x0e94, 7}, + {0x0e95, 0x0e97, 1}, + {0x0e99, 0x0e9f, 1}, + {0x0ea1, 0x0ea3, 1}, + {0x0ea5, 0x0ea7, 2}, + {0x0eaa, 0x0eab, 1}, + {0x0ead, 0x0eb9, 1}, + {0x0ebb, 0x0ebd, 1}, + {0x0ec0, 0x0ec4, 1}, + {0x0ec6, 0x0ec8, 2}, + {0x0ec9, 0x0ecd, 1}, + {0x0ed0, 0x0ed9, 1}, + {0x0edc, 0x0edf, 1}, + {0x0f00, 0x0f47, 1}, + {0x0f49, 0x0f6c, 1}, + {0x0f71, 0x0f97, 1}, + {0x0f99, 0x0fbc, 1}, + {0x0fbe, 0x0fcc, 1}, + {0x0fce, 0x0fda, 1}, + {0x1000, 0x10c5, 1}, + {0x10c7, 0x10cd, 6}, + {0x10d0, 0x1248, 1}, + {0x124a, 0x124d, 1}, + {0x1250, 0x1256, 1}, + {0x1258, 0x125a, 2}, + {0x125b, 0x125d, 1}, + {0x1260, 0x1288, 1}, + {0x128a, 0x128d, 1}, + {0x1290, 0x12b0, 1}, + {0x12b2, 0x12b5, 1}, + {0x12b8, 0x12be, 1}, + {0x12c0, 0x12c2, 2}, + {0x12c3, 0x12c5, 1}, + {0x12c8, 0x12d6, 1}, + {0x12d8, 0x1310, 1}, + {0x1312, 0x1315, 1}, + {0x1318, 0x135a, 1}, + {0x135d, 0x137c, 1}, + {0x1380, 0x1399, 1}, + {0x13a0, 0x13f4, 1}, + {0x1400, 0x169c, 1}, + {0x16a0, 0x16f0, 1}, + {0x1700, 0x170c, 1}, + {0x170e, 0x1714, 1}, + {0x1720, 0x1736, 1}, + {0x1740, 0x1753, 1}, + {0x1760, 0x176c, 1}, + {0x176e, 0x1770, 1}, + {0x1772, 0x1773, 1}, + {0x1780, 0x17dd, 1}, + {0x17e0, 0x17e9, 1}, + {0x17f0, 0x17f9, 1}, + {0x1800, 0x180e, 1}, + {0x1810, 0x1819, 1}, + {0x1820, 0x1877, 1}, + {0x1880, 0x18aa, 1}, + {0x18b0, 0x18f5, 1}, + {0x1900, 0x191c, 1}, + {0x1920, 0x192b, 1}, + {0x1930, 0x193b, 1}, + {0x1940, 0x1944, 4}, + {0x1945, 0x196d, 1}, + {0x1970, 0x1974, 1}, + {0x1980, 0x19ab, 1}, + {0x19b0, 0x19c9, 1}, + {0x19d0, 0x19da, 1}, + {0x19de, 0x1a1b, 1}, + {0x1a1e, 0x1a5e, 1}, + {0x1a60, 0x1a7c, 1}, + {0x1a7f, 0x1a89, 1}, + {0x1a90, 0x1a99, 1}, + {0x1aa0, 0x1aad, 1}, + {0x1b00, 0x1b4b, 1}, + {0x1b50, 0x1b7c, 1}, + {0x1b80, 0x1bf3, 1}, + {0x1bfc, 0x1c37, 1}, + {0x1c3b, 0x1c49, 1}, + {0x1c4d, 0x1c7f, 1}, + {0x1cc0, 0x1cc7, 1}, + {0x1cd0, 0x1cf6, 1}, + {0x1d00, 0x1de6, 1}, + {0x1dfc, 0x1f15, 1}, + {0x1f18, 0x1f1d, 1}, + {0x1f20, 0x1f45, 1}, + {0x1f48, 0x1f4d, 1}, + {0x1f50, 0x1f57, 1}, + {0x1f59, 0x1f5f, 2}, + {0x1f60, 0x1f7d, 1}, + {0x1f80, 0x1fb4, 1}, + {0x1fb6, 0x1fc4, 1}, + {0x1fc6, 0x1fd3, 1}, + {0x1fd6, 0x1fdb, 1}, + {0x1fdd, 0x1fef, 1}, + {0x1ff2, 0x1ff4, 1}, + {0x1ff6, 0x1ffe, 1}, + {0x2000, 0x2064, 1}, + {0x2066, 0x2071, 1}, + {0x2074, 0x208e, 1}, + {0x2090, 0x209c, 1}, + {0x20a0, 0x20ba, 1}, + {0x20d0, 0x20f0, 1}, + {0x2100, 0x2189, 1}, + {0x2190, 0x23f3, 1}, + {0x2400, 0x2426, 1}, + {0x2440, 0x244a, 1}, + {0x2460, 0x26ff, 1}, + {0x2701, 0x2b4c, 1}, + {0x2b50, 0x2b59, 1}, + {0x2c00, 0x2c2e, 1}, + {0x2c30, 0x2c5e, 1}, + {0x2c60, 0x2cf3, 1}, + {0x2cf9, 0x2d25, 1}, + {0x2d27, 0x2d2d, 6}, + {0x2d30, 0x2d67, 1}, + {0x2d6f, 0x2d70, 1}, + {0x2d7f, 0x2d96, 1}, + {0x2da0, 0x2da6, 1}, + {0x2da8, 0x2dae, 1}, + {0x2db0, 0x2db6, 1}, + {0x2db8, 0x2dbe, 1}, + {0x2dc0, 0x2dc6, 1}, + {0x2dc8, 0x2dce, 1}, + {0x2dd0, 0x2dd6, 1}, + {0x2dd8, 0x2dde, 1}, + {0x2de0, 0x2e3b, 1}, + {0x2e80, 0x2e99, 1}, + {0x2e9b, 0x2ef3, 1}, + {0x2f00, 0x2fd5, 1}, + {0x2ff0, 0x2ffb, 1}, + {0x3000, 0x303f, 1}, + {0x3041, 0x3096, 1}, + {0x3099, 0x30ff, 1}, + {0x3105, 0x312d, 1}, + {0x3131, 0x318e, 1}, + {0x3190, 0x31ba, 1}, + {0x31c0, 0x31e3, 1}, + {0x31f0, 0x321e, 1}, + {0x3220, 0x32fe, 1}, + {0x3300, 0x4db5, 1}, + {0x4dc0, 0x9fcc, 1}, + {0xa000, 0xa48c, 1}, + {0xa490, 0xa4c6, 1}, + {0xa4d0, 0xa62b, 1}, + {0xa640, 0xa697, 1}, + {0xa69f, 0xa6f7, 1}, + {0xa700, 0xa78e, 1}, + {0xa790, 0xa793, 1}, + {0xa7a0, 0xa7aa, 1}, + {0xa7f8, 0xa82b, 1}, + {0xa830, 0xa839, 1}, + {0xa840, 0xa877, 1}, + {0xa880, 0xa8c4, 1}, + {0xa8ce, 0xa8d9, 1}, + {0xa8e0, 0xa8fb, 1}, + {0xa900, 0xa953, 1}, + {0xa95f, 0xa97c, 1}, + {0xa980, 0xa9cd, 1}, + {0xa9cf, 0xa9d9, 1}, + {0xa9de, 0xa9df, 1}, + {0xaa00, 0xaa36, 1}, + {0xaa40, 0xaa4d, 1}, + {0xaa50, 0xaa59, 1}, + {0xaa5c, 0xaa7b, 1}, + {0xaa80, 0xaac2, 1}, + {0xaadb, 0xaaf6, 1}, + {0xab01, 0xab06, 1}, + {0xab09, 0xab0e, 1}, + {0xab11, 0xab16, 1}, + {0xab20, 0xab26, 1}, + {0xab28, 0xab2e, 1}, + {0xabc0, 0xabed, 1}, + {0xabf0, 0xabf9, 1}, + {0xac00, 0xd7a3, 1}, + {0xd7b0, 0xd7c6, 1}, + {0xd7cb, 0xd7fb, 1}, + {0xd800, 0xfa6d, 1}, + {0xfa70, 0xfad9, 1}, + {0xfb00, 0xfb06, 1}, + {0xfb13, 0xfb17, 1}, + {0xfb1d, 0xfb36, 1}, + {0xfb38, 0xfb3c, 1}, + {0xfb3e, 0xfb40, 2}, + {0xfb41, 0xfb43, 2}, + {0xfb44, 0xfb46, 2}, + {0xfb47, 0xfbc1, 1}, + {0xfbd3, 0xfd3f, 1}, + {0xfd50, 0xfd8f, 1}, + {0xfd92, 0xfdc7, 1}, + {0xfdf0, 0xfdfd, 1}, + {0xfe00, 0xfe19, 1}, + {0xfe20, 0xfe26, 1}, + {0xfe30, 0xfe52, 1}, + {0xfe54, 0xfe66, 1}, + {0xfe68, 0xfe6b, 1}, + {0xfe70, 0xfe74, 1}, + {0xfe76, 0xfefc, 1}, + {0xfeff, 0xff01, 2}, + {0xff02, 0xffbe, 1}, + {0xffc2, 0xffc7, 1}, + {0xffca, 0xffcf, 1}, + {0xffd2, 0xffd7, 1}, + {0xffda, 0xffdc, 1}, + {0xffe0, 0xffe6, 1}, + {0xffe8, 0xffee, 1}, + {0xfff9, 0xfffd, 1}, + }, + R32: []unicode.Range32{ + {0x00010000, 0x0001000b, 1}, + {0x0001000d, 0x00010026, 1}, + {0x00010028, 0x0001003a, 1}, + {0x0001003c, 0x0001003d, 1}, + {0x0001003f, 0x0001004d, 1}, + {0x00010050, 0x0001005d, 1}, + {0x00010080, 0x000100fa, 1}, + {0x00010100, 0x00010102, 1}, + {0x00010107, 0x00010133, 1}, + {0x00010137, 0x0001018a, 1}, + {0x00010190, 0x0001019b, 1}, + {0x000101d0, 0x000101fd, 1}, + {0x00010280, 0x0001029c, 1}, + {0x000102a0, 0x000102d0, 1}, + {0x00010300, 0x0001031e, 1}, + {0x00010320, 0x00010323, 1}, + {0x00010330, 0x0001034a, 1}, + {0x00010380, 0x0001039d, 1}, + {0x0001039f, 0x000103c3, 1}, + {0x000103c8, 0x000103d5, 1}, + {0x00010400, 0x0001049d, 1}, + {0x000104a0, 0x000104a9, 1}, + {0x00010800, 0x00010805, 1}, + {0x00010808, 0x0001080a, 2}, + {0x0001080b, 0x00010835, 1}, + {0x00010837, 0x00010838, 1}, + {0x0001083c, 0x0001083f, 3}, + {0x00010840, 0x00010855, 1}, + {0x00010857, 0x0001085f, 1}, + {0x00010900, 0x0001091b, 1}, + {0x0001091f, 0x00010939, 1}, + {0x0001093f, 0x00010980, 65}, + {0x00010981, 0x000109b7, 1}, + {0x000109be, 0x000109bf, 1}, + {0x00010a00, 0x00010a03, 1}, + {0x00010a05, 0x00010a06, 1}, + {0x00010a0c, 0x00010a13, 1}, + {0x00010a15, 0x00010a17, 1}, + {0x00010a19, 0x00010a33, 1}, + {0x00010a38, 0x00010a3a, 1}, + {0x00010a3f, 0x00010a47, 1}, + {0x00010a50, 0x00010a58, 1}, + {0x00010a60, 0x00010a7f, 1}, + {0x00010b00, 0x00010b35, 1}, + {0x00010b39, 0x00010b55, 1}, + {0x00010b58, 0x00010b72, 1}, + {0x00010b78, 0x00010b7f, 1}, + {0x00010c00, 0x00010c48, 1}, + {0x00010e60, 0x00010e7e, 1}, + {0x00011000, 0x0001104d, 1}, + {0x00011052, 0x0001106f, 1}, + {0x00011080, 0x000110c1, 1}, + {0x000110d0, 0x000110e8, 1}, + {0x000110f0, 0x000110f9, 1}, + {0x00011100, 0x00011134, 1}, + {0x00011136, 0x00011143, 1}, + {0x00011180, 0x000111c8, 1}, + {0x000111d0, 0x000111d9, 1}, + {0x00011680, 0x000116b7, 1}, + {0x000116c0, 0x000116c9, 1}, + {0x00012000, 0x0001236e, 1}, + {0x00012400, 0x00012462, 1}, + {0x00012470, 0x00012473, 1}, + {0x00013000, 0x0001342e, 1}, + {0x00016800, 0x00016a38, 1}, + {0x00016f00, 0x00016f44, 1}, + {0x00016f50, 0x00016f7e, 1}, + {0x00016f8f, 0x00016f9f, 1}, + {0x0001b000, 0x0001b001, 1}, + {0x0001d000, 0x0001d0f5, 1}, + {0x0001d100, 0x0001d126, 1}, + {0x0001d129, 0x0001d1dd, 1}, + {0x0001d200, 0x0001d245, 1}, + {0x0001d300, 0x0001d356, 1}, + {0x0001d360, 0x0001d371, 1}, + {0x0001d400, 0x0001d454, 1}, + {0x0001d456, 0x0001d49c, 1}, + {0x0001d49e, 0x0001d49f, 1}, + {0x0001d4a2, 0x0001d4a5, 3}, + {0x0001d4a6, 0x0001d4a9, 3}, + {0x0001d4aa, 0x0001d4ac, 1}, + {0x0001d4ae, 0x0001d4b9, 1}, + {0x0001d4bb, 0x0001d4bd, 2}, + {0x0001d4be, 0x0001d4c3, 1}, + {0x0001d4c5, 0x0001d505, 1}, + {0x0001d507, 0x0001d50a, 1}, + {0x0001d50d, 0x0001d514, 1}, + {0x0001d516, 0x0001d51c, 1}, + {0x0001d51e, 0x0001d539, 1}, + {0x0001d53b, 0x0001d53e, 1}, + {0x0001d540, 0x0001d544, 1}, + {0x0001d546, 0x0001d54a, 4}, + {0x0001d54b, 0x0001d550, 1}, + {0x0001d552, 0x0001d6a5, 1}, + {0x0001d6a8, 0x0001d7cb, 1}, + {0x0001d7ce, 0x0001d7ff, 1}, + {0x0001ee00, 0x0001ee03, 1}, + {0x0001ee05, 0x0001ee1f, 1}, + {0x0001ee21, 0x0001ee22, 1}, + {0x0001ee24, 0x0001ee27, 3}, + {0x0001ee29, 0x0001ee32, 1}, + {0x0001ee34, 0x0001ee37, 1}, + {0x0001ee39, 0x0001ee3b, 2}, + {0x0001ee42, 0x0001ee47, 5}, + {0x0001ee49, 0x0001ee4d, 2}, + {0x0001ee4e, 0x0001ee4f, 1}, + {0x0001ee51, 0x0001ee52, 1}, + {0x0001ee54, 0x0001ee57, 3}, + {0x0001ee59, 0x0001ee61, 2}, + {0x0001ee62, 0x0001ee64, 2}, + {0x0001ee67, 0x0001ee6a, 1}, + {0x0001ee6c, 0x0001ee72, 1}, + {0x0001ee74, 0x0001ee77, 1}, + {0x0001ee79, 0x0001ee7c, 1}, + {0x0001ee7e, 0x0001ee80, 2}, + {0x0001ee81, 0x0001ee89, 1}, + {0x0001ee8b, 0x0001ee9b, 1}, + {0x0001eea1, 0x0001eea3, 1}, + {0x0001eea5, 0x0001eea9, 1}, + {0x0001eeab, 0x0001eebb, 1}, + {0x0001eef0, 0x0001eef1, 1}, + {0x0001f000, 0x0001f02b, 1}, + {0x0001f030, 0x0001f093, 1}, + {0x0001f0a0, 0x0001f0ae, 1}, + {0x0001f0b1, 0x0001f0be, 1}, + {0x0001f0c1, 0x0001f0cf, 1}, + {0x0001f0d1, 0x0001f0df, 1}, + {0x0001f100, 0x0001f10a, 1}, + {0x0001f110, 0x0001f12e, 1}, + {0x0001f130, 0x0001f16b, 1}, + {0x0001f170, 0x0001f19a, 1}, + {0x0001f1e6, 0x0001f202, 1}, + {0x0001f210, 0x0001f23a, 1}, + {0x0001f240, 0x0001f248, 1}, + {0x0001f250, 0x0001f251, 1}, + {0x0001f300, 0x0001f320, 1}, + {0x0001f330, 0x0001f335, 1}, + {0x0001f337, 0x0001f37c, 1}, + {0x0001f380, 0x0001f393, 1}, + {0x0001f3a0, 0x0001f3c4, 1}, + {0x0001f3c6, 0x0001f3ca, 1}, + {0x0001f3e0, 0x0001f3f0, 1}, + {0x0001f400, 0x0001f43e, 1}, + {0x0001f440, 0x0001f442, 2}, + {0x0001f443, 0x0001f4f7, 1}, + {0x0001f4f9, 0x0001f4fc, 1}, + {0x0001f500, 0x0001f53d, 1}, + {0x0001f540, 0x0001f543, 1}, + {0x0001f550, 0x0001f567, 1}, + {0x0001f5fb, 0x0001f640, 1}, + {0x0001f645, 0x0001f64f, 1}, + {0x0001f680, 0x0001f6c5, 1}, + {0x0001f700, 0x0001f773, 1}, + {0x00020000, 0x0002a6d6, 1}, + {0x0002a700, 0x0002b734, 1}, + {0x0002b740, 0x0002b81d, 1}, + {0x0002f800, 0x0002fa1d, 1}, + {0x000e0001, 0x000e0020, 31}, + {0x000e0021, 0x000e007f, 1}, + {0x000e0100, 0x000e01ef, 1}, + {0x000f0000, 0x000ffffd, 1}, + {0x00100000, 0x0010fffd, 1}, + }, + LatinOffset: 0, +} + +// size 4898 bytes (4 KiB) +var assigned7_0_0 = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x0000, 0x0377, 1}, + {0x037a, 0x037f, 1}, + {0x0384, 0x038a, 1}, + {0x038c, 0x038e, 2}, + {0x038f, 0x03a1, 1}, + {0x03a3, 0x052f, 1}, + {0x0531, 0x0556, 1}, + {0x0559, 0x055f, 1}, + {0x0561, 0x0587, 1}, + {0x0589, 0x058a, 1}, + {0x058d, 0x058f, 1}, + {0x0591, 0x05c7, 1}, + {0x05d0, 0x05ea, 1}, + {0x05f0, 0x05f4, 1}, + {0x0600, 0x061c, 1}, + {0x061e, 0x070d, 1}, + {0x070f, 0x074a, 1}, + {0x074d, 0x07b1, 1}, + {0x07c0, 0x07fa, 1}, + {0x0800, 0x082d, 1}, + {0x0830, 0x083e, 1}, + {0x0840, 0x085b, 1}, + {0x085e, 0x08a0, 66}, + {0x08a1, 0x08b2, 1}, + {0x08e4, 0x0983, 1}, + {0x0985, 0x098c, 1}, + {0x098f, 0x0990, 1}, + {0x0993, 0x09a8, 1}, + {0x09aa, 0x09b0, 1}, + {0x09b2, 0x09b6, 4}, + {0x09b7, 0x09b9, 1}, + {0x09bc, 0x09c4, 1}, + {0x09c7, 0x09c8, 1}, + {0x09cb, 0x09ce, 1}, + {0x09d7, 0x09dc, 5}, + {0x09dd, 0x09df, 2}, + {0x09e0, 0x09e3, 1}, + {0x09e6, 0x09fb, 1}, + {0x0a01, 0x0a03, 1}, + {0x0a05, 0x0a0a, 1}, + {0x0a0f, 0x0a10, 1}, + {0x0a13, 0x0a28, 1}, + {0x0a2a, 0x0a30, 1}, + {0x0a32, 0x0a33, 1}, + {0x0a35, 0x0a36, 1}, + {0x0a38, 0x0a39, 1}, + {0x0a3c, 0x0a3e, 2}, + {0x0a3f, 0x0a42, 1}, + {0x0a47, 0x0a48, 1}, + {0x0a4b, 0x0a4d, 1}, + {0x0a51, 0x0a59, 8}, + {0x0a5a, 0x0a5c, 1}, + {0x0a5e, 0x0a66, 8}, + {0x0a67, 0x0a75, 1}, + {0x0a81, 0x0a83, 1}, + {0x0a85, 0x0a8d, 1}, + {0x0a8f, 0x0a91, 1}, + {0x0a93, 0x0aa8, 1}, + {0x0aaa, 0x0ab0, 1}, + {0x0ab2, 0x0ab3, 1}, + {0x0ab5, 0x0ab9, 1}, + {0x0abc, 0x0ac5, 1}, + {0x0ac7, 0x0ac9, 1}, + {0x0acb, 0x0acd, 1}, + {0x0ad0, 0x0ae0, 16}, + {0x0ae1, 0x0ae3, 1}, + {0x0ae6, 0x0af1, 1}, + {0x0b01, 0x0b03, 1}, + {0x0b05, 0x0b0c, 1}, + {0x0b0f, 0x0b10, 1}, + {0x0b13, 0x0b28, 1}, + {0x0b2a, 0x0b30, 1}, + {0x0b32, 0x0b33, 1}, + {0x0b35, 0x0b39, 1}, + {0x0b3c, 0x0b44, 1}, + {0x0b47, 0x0b48, 1}, + {0x0b4b, 0x0b4d, 1}, + {0x0b56, 0x0b57, 1}, + {0x0b5c, 0x0b5d, 1}, + {0x0b5f, 0x0b63, 1}, + {0x0b66, 0x0b77, 1}, + {0x0b82, 0x0b83, 1}, + {0x0b85, 0x0b8a, 1}, + {0x0b8e, 0x0b90, 1}, + {0x0b92, 0x0b95, 1}, + {0x0b99, 0x0b9a, 1}, + {0x0b9c, 0x0b9e, 2}, + {0x0b9f, 0x0ba3, 4}, + {0x0ba4, 0x0ba8, 4}, + {0x0ba9, 0x0baa, 1}, + {0x0bae, 0x0bb9, 1}, + {0x0bbe, 0x0bc2, 1}, + {0x0bc6, 0x0bc8, 1}, + {0x0bca, 0x0bcd, 1}, + {0x0bd0, 0x0bd7, 7}, + {0x0be6, 0x0bfa, 1}, + {0x0c00, 0x0c03, 1}, + {0x0c05, 0x0c0c, 1}, + {0x0c0e, 0x0c10, 1}, + {0x0c12, 0x0c28, 1}, + {0x0c2a, 0x0c39, 1}, + {0x0c3d, 0x0c44, 1}, + {0x0c46, 0x0c48, 1}, + {0x0c4a, 0x0c4d, 1}, + {0x0c55, 0x0c56, 1}, + {0x0c58, 0x0c59, 1}, + {0x0c60, 0x0c63, 1}, + {0x0c66, 0x0c6f, 1}, + {0x0c78, 0x0c7f, 1}, + {0x0c81, 0x0c83, 1}, + {0x0c85, 0x0c8c, 1}, + {0x0c8e, 0x0c90, 1}, + {0x0c92, 0x0ca8, 1}, + {0x0caa, 0x0cb3, 1}, + {0x0cb5, 0x0cb9, 1}, + {0x0cbc, 0x0cc4, 1}, + {0x0cc6, 0x0cc8, 1}, + {0x0cca, 0x0ccd, 1}, + {0x0cd5, 0x0cd6, 1}, + {0x0cde, 0x0ce0, 2}, + {0x0ce1, 0x0ce3, 1}, + {0x0ce6, 0x0cef, 1}, + {0x0cf1, 0x0cf2, 1}, + {0x0d01, 0x0d03, 1}, + {0x0d05, 0x0d0c, 1}, + {0x0d0e, 0x0d10, 1}, + {0x0d12, 0x0d3a, 1}, + {0x0d3d, 0x0d44, 1}, + {0x0d46, 0x0d48, 1}, + {0x0d4a, 0x0d4e, 1}, + {0x0d57, 0x0d60, 9}, + {0x0d61, 0x0d63, 1}, + {0x0d66, 0x0d75, 1}, + {0x0d79, 0x0d7f, 1}, + {0x0d82, 0x0d83, 1}, + {0x0d85, 0x0d96, 1}, + {0x0d9a, 0x0db1, 1}, + {0x0db3, 0x0dbb, 1}, + {0x0dbd, 0x0dc0, 3}, + {0x0dc1, 0x0dc6, 1}, + {0x0dca, 0x0dcf, 5}, + {0x0dd0, 0x0dd4, 1}, + {0x0dd6, 0x0dd8, 2}, + {0x0dd9, 0x0ddf, 1}, + {0x0de6, 0x0def, 1}, + {0x0df2, 0x0df4, 1}, + {0x0e01, 0x0e3a, 1}, + {0x0e3f, 0x0e5b, 1}, + {0x0e81, 0x0e82, 1}, + {0x0e84, 0x0e87, 3}, + {0x0e88, 0x0e8a, 2}, + {0x0e8d, 0x0e94, 7}, + {0x0e95, 0x0e97, 1}, + {0x0e99, 0x0e9f, 1}, + {0x0ea1, 0x0ea3, 1}, + {0x0ea5, 0x0ea7, 2}, + {0x0eaa, 0x0eab, 1}, + {0x0ead, 0x0eb9, 1}, + {0x0ebb, 0x0ebd, 1}, + {0x0ec0, 0x0ec4, 1}, + {0x0ec6, 0x0ec8, 2}, + {0x0ec9, 0x0ecd, 1}, + {0x0ed0, 0x0ed9, 1}, + {0x0edc, 0x0edf, 1}, + {0x0f00, 0x0f47, 1}, + {0x0f49, 0x0f6c, 1}, + {0x0f71, 0x0f97, 1}, + {0x0f99, 0x0fbc, 1}, + {0x0fbe, 0x0fcc, 1}, + {0x0fce, 0x0fda, 1}, + {0x1000, 0x10c5, 1}, + {0x10c7, 0x10cd, 6}, + {0x10d0, 0x1248, 1}, + {0x124a, 0x124d, 1}, + {0x1250, 0x1256, 1}, + {0x1258, 0x125a, 2}, + {0x125b, 0x125d, 1}, + {0x1260, 0x1288, 1}, + {0x128a, 0x128d, 1}, + {0x1290, 0x12b0, 1}, + {0x12b2, 0x12b5, 1}, + {0x12b8, 0x12be, 1}, + {0x12c0, 0x12c2, 2}, + {0x12c3, 0x12c5, 1}, + {0x12c8, 0x12d6, 1}, + {0x12d8, 0x1310, 1}, + {0x1312, 0x1315, 1}, + {0x1318, 0x135a, 1}, + {0x135d, 0x137c, 1}, + {0x1380, 0x1399, 1}, + {0x13a0, 0x13f4, 1}, + {0x1400, 0x169c, 1}, + {0x16a0, 0x16f8, 1}, + {0x1700, 0x170c, 1}, + {0x170e, 0x1714, 1}, + {0x1720, 0x1736, 1}, + {0x1740, 0x1753, 1}, + {0x1760, 0x176c, 1}, + {0x176e, 0x1770, 1}, + {0x1772, 0x1773, 1}, + {0x1780, 0x17dd, 1}, + {0x17e0, 0x17e9, 1}, + {0x17f0, 0x17f9, 1}, + {0x1800, 0x180e, 1}, + {0x1810, 0x1819, 1}, + {0x1820, 0x1877, 1}, + {0x1880, 0x18aa, 1}, + {0x18b0, 0x18f5, 1}, + {0x1900, 0x191e, 1}, + {0x1920, 0x192b, 1}, + {0x1930, 0x193b, 1}, + {0x1940, 0x1944, 4}, + {0x1945, 0x196d, 1}, + {0x1970, 0x1974, 1}, + {0x1980, 0x19ab, 1}, + {0x19b0, 0x19c9, 1}, + {0x19d0, 0x19da, 1}, + {0x19de, 0x1a1b, 1}, + {0x1a1e, 0x1a5e, 1}, + {0x1a60, 0x1a7c, 1}, + {0x1a7f, 0x1a89, 1}, + {0x1a90, 0x1a99, 1}, + {0x1aa0, 0x1aad, 1}, + {0x1ab0, 0x1abe, 1}, + {0x1b00, 0x1b4b, 1}, + {0x1b50, 0x1b7c, 1}, + {0x1b80, 0x1bf3, 1}, + {0x1bfc, 0x1c37, 1}, + {0x1c3b, 0x1c49, 1}, + {0x1c4d, 0x1c7f, 1}, + {0x1cc0, 0x1cc7, 1}, + {0x1cd0, 0x1cf6, 1}, + {0x1cf8, 0x1cf9, 1}, + {0x1d00, 0x1df5, 1}, + {0x1dfc, 0x1f15, 1}, + {0x1f18, 0x1f1d, 1}, + {0x1f20, 0x1f45, 1}, + {0x1f48, 0x1f4d, 1}, + {0x1f50, 0x1f57, 1}, + {0x1f59, 0x1f5f, 2}, + {0x1f60, 0x1f7d, 1}, + {0x1f80, 0x1fb4, 1}, + {0x1fb6, 0x1fc4, 1}, + {0x1fc6, 0x1fd3, 1}, + {0x1fd6, 0x1fdb, 1}, + {0x1fdd, 0x1fef, 1}, + {0x1ff2, 0x1ff4, 1}, + {0x1ff6, 0x1ffe, 1}, + {0x2000, 0x2064, 1}, + {0x2066, 0x2071, 1}, + {0x2074, 0x208e, 1}, + {0x2090, 0x209c, 1}, + {0x20a0, 0x20bd, 1}, + {0x20d0, 0x20f0, 1}, + {0x2100, 0x2189, 1}, + {0x2190, 0x23fa, 1}, + {0x2400, 0x2426, 1}, + {0x2440, 0x244a, 1}, + {0x2460, 0x2b73, 1}, + {0x2b76, 0x2b95, 1}, + {0x2b98, 0x2bb9, 1}, + {0x2bbd, 0x2bc8, 1}, + {0x2bca, 0x2bd1, 1}, + {0x2c00, 0x2c2e, 1}, + {0x2c30, 0x2c5e, 1}, + {0x2c60, 0x2cf3, 1}, + {0x2cf9, 0x2d25, 1}, + {0x2d27, 0x2d2d, 6}, + {0x2d30, 0x2d67, 1}, + {0x2d6f, 0x2d70, 1}, + {0x2d7f, 0x2d96, 1}, + {0x2da0, 0x2da6, 1}, + {0x2da8, 0x2dae, 1}, + {0x2db0, 0x2db6, 1}, + {0x2db8, 0x2dbe, 1}, + {0x2dc0, 0x2dc6, 1}, + {0x2dc8, 0x2dce, 1}, + {0x2dd0, 0x2dd6, 1}, + {0x2dd8, 0x2dde, 1}, + {0x2de0, 0x2e42, 1}, + {0x2e80, 0x2e99, 1}, + {0x2e9b, 0x2ef3, 1}, + {0x2f00, 0x2fd5, 1}, + {0x2ff0, 0x2ffb, 1}, + {0x3000, 0x303f, 1}, + {0x3041, 0x3096, 1}, + {0x3099, 0x30ff, 1}, + {0x3105, 0x312d, 1}, + {0x3131, 0x318e, 1}, + {0x3190, 0x31ba, 1}, + {0x31c0, 0x31e3, 1}, + {0x31f0, 0x321e, 1}, + {0x3220, 0x32fe, 1}, + {0x3300, 0x4db5, 1}, + {0x4dc0, 0x9fcc, 1}, + {0xa000, 0xa48c, 1}, + {0xa490, 0xa4c6, 1}, + {0xa4d0, 0xa62b, 1}, + {0xa640, 0xa69d, 1}, + {0xa69f, 0xa6f7, 1}, + {0xa700, 0xa78e, 1}, + {0xa790, 0xa7ad, 1}, + {0xa7b0, 0xa7b1, 1}, + {0xa7f7, 0xa82b, 1}, + {0xa830, 0xa839, 1}, + {0xa840, 0xa877, 1}, + {0xa880, 0xa8c4, 1}, + {0xa8ce, 0xa8d9, 1}, + {0xa8e0, 0xa8fb, 1}, + {0xa900, 0xa953, 1}, + {0xa95f, 0xa97c, 1}, + {0xa980, 0xa9cd, 1}, + {0xa9cf, 0xa9d9, 1}, + {0xa9de, 0xa9fe, 1}, + {0xaa00, 0xaa36, 1}, + {0xaa40, 0xaa4d, 1}, + {0xaa50, 0xaa59, 1}, + {0xaa5c, 0xaac2, 1}, + {0xaadb, 0xaaf6, 1}, + {0xab01, 0xab06, 1}, + {0xab09, 0xab0e, 1}, + {0xab11, 0xab16, 1}, + {0xab20, 0xab26, 1}, + {0xab28, 0xab2e, 1}, + {0xab30, 0xab5f, 1}, + {0xab64, 0xab65, 1}, + {0xabc0, 0xabed, 1}, + {0xabf0, 0xabf9, 1}, + {0xac00, 0xd7a3, 1}, + {0xd7b0, 0xd7c6, 1}, + {0xd7cb, 0xd7fb, 1}, + {0xd800, 0xfa6d, 1}, + {0xfa70, 0xfad9, 1}, + {0xfb00, 0xfb06, 1}, + {0xfb13, 0xfb17, 1}, + {0xfb1d, 0xfb36, 1}, + {0xfb38, 0xfb3c, 1}, + {0xfb3e, 0xfb40, 2}, + {0xfb41, 0xfb43, 2}, + {0xfb44, 0xfb46, 2}, + {0xfb47, 0xfbc1, 1}, + {0xfbd3, 0xfd3f, 1}, + {0xfd50, 0xfd8f, 1}, + {0xfd92, 0xfdc7, 1}, + {0xfdf0, 0xfdfd, 1}, + {0xfe00, 0xfe19, 1}, + {0xfe20, 0xfe2d, 1}, + {0xfe30, 0xfe52, 1}, + {0xfe54, 0xfe66, 1}, + {0xfe68, 0xfe6b, 1}, + {0xfe70, 0xfe74, 1}, + {0xfe76, 0xfefc, 1}, + {0xfeff, 0xff01, 2}, + {0xff02, 0xffbe, 1}, + {0xffc2, 0xffc7, 1}, + {0xffca, 0xffcf, 1}, + {0xffd2, 0xffd7, 1}, + {0xffda, 0xffdc, 1}, + {0xffe0, 0xffe6, 1}, + {0xffe8, 0xffee, 1}, + {0xfff9, 0xfffd, 1}, + }, + R32: []unicode.Range32{ + {0x00010000, 0x0001000b, 1}, + {0x0001000d, 0x00010026, 1}, + {0x00010028, 0x0001003a, 1}, + {0x0001003c, 0x0001003d, 1}, + {0x0001003f, 0x0001004d, 1}, + {0x00010050, 0x0001005d, 1}, + {0x00010080, 0x000100fa, 1}, + {0x00010100, 0x00010102, 1}, + {0x00010107, 0x00010133, 1}, + {0x00010137, 0x0001018c, 1}, + {0x00010190, 0x0001019b, 1}, + {0x000101a0, 0x000101d0, 48}, + {0x000101d1, 0x000101fd, 1}, + {0x00010280, 0x0001029c, 1}, + {0x000102a0, 0x000102d0, 1}, + {0x000102e0, 0x000102fb, 1}, + {0x00010300, 0x00010323, 1}, + {0x00010330, 0x0001034a, 1}, + {0x00010350, 0x0001037a, 1}, + {0x00010380, 0x0001039d, 1}, + {0x0001039f, 0x000103c3, 1}, + {0x000103c8, 0x000103d5, 1}, + {0x00010400, 0x0001049d, 1}, + {0x000104a0, 0x000104a9, 1}, + {0x00010500, 0x00010527, 1}, + {0x00010530, 0x00010563, 1}, + {0x0001056f, 0x00010600, 145}, + {0x00010601, 0x00010736, 1}, + {0x00010740, 0x00010755, 1}, + {0x00010760, 0x00010767, 1}, + {0x00010800, 0x00010805, 1}, + {0x00010808, 0x0001080a, 2}, + {0x0001080b, 0x00010835, 1}, + {0x00010837, 0x00010838, 1}, + {0x0001083c, 0x0001083f, 3}, + {0x00010840, 0x00010855, 1}, + {0x00010857, 0x0001089e, 1}, + {0x000108a7, 0x000108af, 1}, + {0x00010900, 0x0001091b, 1}, + {0x0001091f, 0x00010939, 1}, + {0x0001093f, 0x00010980, 65}, + {0x00010981, 0x000109b7, 1}, + {0x000109be, 0x000109bf, 1}, + {0x00010a00, 0x00010a03, 1}, + {0x00010a05, 0x00010a06, 1}, + {0x00010a0c, 0x00010a13, 1}, + {0x00010a15, 0x00010a17, 1}, + {0x00010a19, 0x00010a33, 1}, + {0x00010a38, 0x00010a3a, 1}, + {0x00010a3f, 0x00010a47, 1}, + {0x00010a50, 0x00010a58, 1}, + {0x00010a60, 0x00010a9f, 1}, + {0x00010ac0, 0x00010ae6, 1}, + {0x00010aeb, 0x00010af6, 1}, + {0x00010b00, 0x00010b35, 1}, + {0x00010b39, 0x00010b55, 1}, + {0x00010b58, 0x00010b72, 1}, + {0x00010b78, 0x00010b91, 1}, + {0x00010b99, 0x00010b9c, 1}, + {0x00010ba9, 0x00010baf, 1}, + {0x00010c00, 0x00010c48, 1}, + {0x00010e60, 0x00010e7e, 1}, + {0x00011000, 0x0001104d, 1}, + {0x00011052, 0x0001106f, 1}, + {0x0001107f, 0x000110c1, 1}, + {0x000110d0, 0x000110e8, 1}, + {0x000110f0, 0x000110f9, 1}, + {0x00011100, 0x00011134, 1}, + {0x00011136, 0x00011143, 1}, + {0x00011150, 0x00011176, 1}, + {0x00011180, 0x000111c8, 1}, + {0x000111cd, 0x000111d0, 3}, + {0x000111d1, 0x000111da, 1}, + {0x000111e1, 0x000111f4, 1}, + {0x00011200, 0x00011211, 1}, + {0x00011213, 0x0001123d, 1}, + {0x000112b0, 0x000112ea, 1}, + {0x000112f0, 0x000112f9, 1}, + {0x00011301, 0x00011303, 1}, + {0x00011305, 0x0001130c, 1}, + {0x0001130f, 0x00011310, 1}, + {0x00011313, 0x00011328, 1}, + {0x0001132a, 0x00011330, 1}, + {0x00011332, 0x00011333, 1}, + {0x00011335, 0x00011339, 1}, + {0x0001133c, 0x00011344, 1}, + {0x00011347, 0x00011348, 1}, + {0x0001134b, 0x0001134d, 1}, + {0x00011357, 0x0001135d, 6}, + {0x0001135e, 0x00011363, 1}, + {0x00011366, 0x0001136c, 1}, + {0x00011370, 0x00011374, 1}, + {0x00011480, 0x000114c7, 1}, + {0x000114d0, 0x000114d9, 1}, + {0x00011580, 0x000115b5, 1}, + {0x000115b8, 0x000115c9, 1}, + {0x00011600, 0x00011644, 1}, + {0x00011650, 0x00011659, 1}, + {0x00011680, 0x000116b7, 1}, + {0x000116c0, 0x000116c9, 1}, + {0x000118a0, 0x000118f2, 1}, + {0x000118ff, 0x00011ac0, 449}, + {0x00011ac1, 0x00011af8, 1}, + {0x00012000, 0x00012398, 1}, + {0x00012400, 0x0001246e, 1}, + {0x00012470, 0x00012474, 1}, + {0x00013000, 0x0001342e, 1}, + {0x00016800, 0x00016a38, 1}, + {0x00016a40, 0x00016a5e, 1}, + {0x00016a60, 0x00016a69, 1}, + {0x00016a6e, 0x00016a6f, 1}, + {0x00016ad0, 0x00016aed, 1}, + {0x00016af0, 0x00016af5, 1}, + {0x00016b00, 0x00016b45, 1}, + {0x00016b50, 0x00016b59, 1}, + {0x00016b5b, 0x00016b61, 1}, + {0x00016b63, 0x00016b77, 1}, + {0x00016b7d, 0x00016b8f, 1}, + {0x00016f00, 0x00016f44, 1}, + {0x00016f50, 0x00016f7e, 1}, + {0x00016f8f, 0x00016f9f, 1}, + {0x0001b000, 0x0001b001, 1}, + {0x0001bc00, 0x0001bc6a, 1}, + {0x0001bc70, 0x0001bc7c, 1}, + {0x0001bc80, 0x0001bc88, 1}, + {0x0001bc90, 0x0001bc99, 1}, + {0x0001bc9c, 0x0001bca3, 1}, + {0x0001d000, 0x0001d0f5, 1}, + {0x0001d100, 0x0001d126, 1}, + {0x0001d129, 0x0001d1dd, 1}, + {0x0001d200, 0x0001d245, 1}, + {0x0001d300, 0x0001d356, 1}, + {0x0001d360, 0x0001d371, 1}, + {0x0001d400, 0x0001d454, 1}, + {0x0001d456, 0x0001d49c, 1}, + {0x0001d49e, 0x0001d49f, 1}, + {0x0001d4a2, 0x0001d4a5, 3}, + {0x0001d4a6, 0x0001d4a9, 3}, + {0x0001d4aa, 0x0001d4ac, 1}, + {0x0001d4ae, 0x0001d4b9, 1}, + {0x0001d4bb, 0x0001d4bd, 2}, + {0x0001d4be, 0x0001d4c3, 1}, + {0x0001d4c5, 0x0001d505, 1}, + {0x0001d507, 0x0001d50a, 1}, + {0x0001d50d, 0x0001d514, 1}, + {0x0001d516, 0x0001d51c, 1}, + {0x0001d51e, 0x0001d539, 1}, + {0x0001d53b, 0x0001d53e, 1}, + {0x0001d540, 0x0001d544, 1}, + {0x0001d546, 0x0001d54a, 4}, + {0x0001d54b, 0x0001d550, 1}, + {0x0001d552, 0x0001d6a5, 1}, + {0x0001d6a8, 0x0001d7cb, 1}, + {0x0001d7ce, 0x0001d7ff, 1}, + {0x0001e800, 0x0001e8c4, 1}, + {0x0001e8c7, 0x0001e8d6, 1}, + {0x0001ee00, 0x0001ee03, 1}, + {0x0001ee05, 0x0001ee1f, 1}, + {0x0001ee21, 0x0001ee22, 1}, + {0x0001ee24, 0x0001ee27, 3}, + {0x0001ee29, 0x0001ee32, 1}, + {0x0001ee34, 0x0001ee37, 1}, + {0x0001ee39, 0x0001ee3b, 2}, + {0x0001ee42, 0x0001ee47, 5}, + {0x0001ee49, 0x0001ee4d, 2}, + {0x0001ee4e, 0x0001ee4f, 1}, + {0x0001ee51, 0x0001ee52, 1}, + {0x0001ee54, 0x0001ee57, 3}, + {0x0001ee59, 0x0001ee61, 2}, + {0x0001ee62, 0x0001ee64, 2}, + {0x0001ee67, 0x0001ee6a, 1}, + {0x0001ee6c, 0x0001ee72, 1}, + {0x0001ee74, 0x0001ee77, 1}, + {0x0001ee79, 0x0001ee7c, 1}, + {0x0001ee7e, 0x0001ee80, 2}, + {0x0001ee81, 0x0001ee89, 1}, + {0x0001ee8b, 0x0001ee9b, 1}, + {0x0001eea1, 0x0001eea3, 1}, + {0x0001eea5, 0x0001eea9, 1}, + {0x0001eeab, 0x0001eebb, 1}, + {0x0001eef0, 0x0001eef1, 1}, + {0x0001f000, 0x0001f02b, 1}, + {0x0001f030, 0x0001f093, 1}, + {0x0001f0a0, 0x0001f0ae, 1}, + {0x0001f0b1, 0x0001f0bf, 1}, + {0x0001f0c1, 0x0001f0cf, 1}, + {0x0001f0d1, 0x0001f0f5, 1}, + {0x0001f100, 0x0001f10c, 1}, + {0x0001f110, 0x0001f12e, 1}, + {0x0001f130, 0x0001f16b, 1}, + {0x0001f170, 0x0001f19a, 1}, + {0x0001f1e6, 0x0001f202, 1}, + {0x0001f210, 0x0001f23a, 1}, + {0x0001f240, 0x0001f248, 1}, + {0x0001f250, 0x0001f251, 1}, + {0x0001f300, 0x0001f32c, 1}, + {0x0001f330, 0x0001f37d, 1}, + {0x0001f380, 0x0001f3ce, 1}, + {0x0001f3d4, 0x0001f3f7, 1}, + {0x0001f400, 0x0001f4fe, 1}, + {0x0001f500, 0x0001f54a, 1}, + {0x0001f550, 0x0001f579, 1}, + {0x0001f57b, 0x0001f5a3, 1}, + {0x0001f5a5, 0x0001f642, 1}, + {0x0001f645, 0x0001f6cf, 1}, + {0x0001f6e0, 0x0001f6ec, 1}, + {0x0001f6f0, 0x0001f6f3, 1}, + {0x0001f700, 0x0001f773, 1}, + {0x0001f780, 0x0001f7d4, 1}, + {0x0001f800, 0x0001f80b, 1}, + {0x0001f810, 0x0001f847, 1}, + {0x0001f850, 0x0001f859, 1}, + {0x0001f860, 0x0001f887, 1}, + {0x0001f890, 0x0001f8ad, 1}, + {0x00020000, 0x0002a6d6, 1}, + {0x0002a700, 0x0002b734, 1}, + {0x0002b740, 0x0002b81d, 1}, + {0x0002f800, 0x0002fa1d, 1}, + {0x000e0001, 0x000e0020, 31}, + {0x000e0021, 0x000e007f, 1}, + {0x000e0100, 0x000e01ef, 1}, + {0x000f0000, 0x000ffffd, 1}, + {0x00100000, 0x0010fffd, 1}, + }, + LatinOffset: 0, +} + +// size 5048 bytes (4 KiB) +var assigned8_0_0 = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x0000, 0x0377, 1}, + {0x037a, 0x037f, 1}, + {0x0384, 0x038a, 1}, + {0x038c, 0x038e, 2}, + {0x038f, 0x03a1, 1}, + {0x03a3, 0x052f, 1}, + {0x0531, 0x0556, 1}, + {0x0559, 0x055f, 1}, + {0x0561, 0x0587, 1}, + {0x0589, 0x058a, 1}, + {0x058d, 0x058f, 1}, + {0x0591, 0x05c7, 1}, + {0x05d0, 0x05ea, 1}, + {0x05f0, 0x05f4, 1}, + {0x0600, 0x061c, 1}, + {0x061e, 0x070d, 1}, + {0x070f, 0x074a, 1}, + {0x074d, 0x07b1, 1}, + {0x07c0, 0x07fa, 1}, + {0x0800, 0x082d, 1}, + {0x0830, 0x083e, 1}, + {0x0840, 0x085b, 1}, + {0x085e, 0x08a0, 66}, + {0x08a1, 0x08b4, 1}, + {0x08e3, 0x0983, 1}, + {0x0985, 0x098c, 1}, + {0x098f, 0x0990, 1}, + {0x0993, 0x09a8, 1}, + {0x09aa, 0x09b0, 1}, + {0x09b2, 0x09b6, 4}, + {0x09b7, 0x09b9, 1}, + {0x09bc, 0x09c4, 1}, + {0x09c7, 0x09c8, 1}, + {0x09cb, 0x09ce, 1}, + {0x09d7, 0x09dc, 5}, + {0x09dd, 0x09df, 2}, + {0x09e0, 0x09e3, 1}, + {0x09e6, 0x09fb, 1}, + {0x0a01, 0x0a03, 1}, + {0x0a05, 0x0a0a, 1}, + {0x0a0f, 0x0a10, 1}, + {0x0a13, 0x0a28, 1}, + {0x0a2a, 0x0a30, 1}, + {0x0a32, 0x0a33, 1}, + {0x0a35, 0x0a36, 1}, + {0x0a38, 0x0a39, 1}, + {0x0a3c, 0x0a3e, 2}, + {0x0a3f, 0x0a42, 1}, + {0x0a47, 0x0a48, 1}, + {0x0a4b, 0x0a4d, 1}, + {0x0a51, 0x0a59, 8}, + {0x0a5a, 0x0a5c, 1}, + {0x0a5e, 0x0a66, 8}, + {0x0a67, 0x0a75, 1}, + {0x0a81, 0x0a83, 1}, + {0x0a85, 0x0a8d, 1}, + {0x0a8f, 0x0a91, 1}, + {0x0a93, 0x0aa8, 1}, + {0x0aaa, 0x0ab0, 1}, + {0x0ab2, 0x0ab3, 1}, + {0x0ab5, 0x0ab9, 1}, + {0x0abc, 0x0ac5, 1}, + {0x0ac7, 0x0ac9, 1}, + {0x0acb, 0x0acd, 1}, + {0x0ad0, 0x0ae0, 16}, + {0x0ae1, 0x0ae3, 1}, + {0x0ae6, 0x0af1, 1}, + {0x0af9, 0x0b01, 8}, + {0x0b02, 0x0b03, 1}, + {0x0b05, 0x0b0c, 1}, + {0x0b0f, 0x0b10, 1}, + {0x0b13, 0x0b28, 1}, + {0x0b2a, 0x0b30, 1}, + {0x0b32, 0x0b33, 1}, + {0x0b35, 0x0b39, 1}, + {0x0b3c, 0x0b44, 1}, + {0x0b47, 0x0b48, 1}, + {0x0b4b, 0x0b4d, 1}, + {0x0b56, 0x0b57, 1}, + {0x0b5c, 0x0b5d, 1}, + {0x0b5f, 0x0b63, 1}, + {0x0b66, 0x0b77, 1}, + {0x0b82, 0x0b83, 1}, + {0x0b85, 0x0b8a, 1}, + {0x0b8e, 0x0b90, 1}, + {0x0b92, 0x0b95, 1}, + {0x0b99, 0x0b9a, 1}, + {0x0b9c, 0x0b9e, 2}, + {0x0b9f, 0x0ba3, 4}, + {0x0ba4, 0x0ba8, 4}, + {0x0ba9, 0x0baa, 1}, + {0x0bae, 0x0bb9, 1}, + {0x0bbe, 0x0bc2, 1}, + {0x0bc6, 0x0bc8, 1}, + {0x0bca, 0x0bcd, 1}, + {0x0bd0, 0x0bd7, 7}, + {0x0be6, 0x0bfa, 1}, + {0x0c00, 0x0c03, 1}, + {0x0c05, 0x0c0c, 1}, + {0x0c0e, 0x0c10, 1}, + {0x0c12, 0x0c28, 1}, + {0x0c2a, 0x0c39, 1}, + {0x0c3d, 0x0c44, 1}, + {0x0c46, 0x0c48, 1}, + {0x0c4a, 0x0c4d, 1}, + {0x0c55, 0x0c56, 1}, + {0x0c58, 0x0c5a, 1}, + {0x0c60, 0x0c63, 1}, + {0x0c66, 0x0c6f, 1}, + {0x0c78, 0x0c7f, 1}, + {0x0c81, 0x0c83, 1}, + {0x0c85, 0x0c8c, 1}, + {0x0c8e, 0x0c90, 1}, + {0x0c92, 0x0ca8, 1}, + {0x0caa, 0x0cb3, 1}, + {0x0cb5, 0x0cb9, 1}, + {0x0cbc, 0x0cc4, 1}, + {0x0cc6, 0x0cc8, 1}, + {0x0cca, 0x0ccd, 1}, + {0x0cd5, 0x0cd6, 1}, + {0x0cde, 0x0ce0, 2}, + {0x0ce1, 0x0ce3, 1}, + {0x0ce6, 0x0cef, 1}, + {0x0cf1, 0x0cf2, 1}, + {0x0d01, 0x0d03, 1}, + {0x0d05, 0x0d0c, 1}, + {0x0d0e, 0x0d10, 1}, + {0x0d12, 0x0d3a, 1}, + {0x0d3d, 0x0d44, 1}, + {0x0d46, 0x0d48, 1}, + {0x0d4a, 0x0d4e, 1}, + {0x0d57, 0x0d5f, 8}, + {0x0d60, 0x0d63, 1}, + {0x0d66, 0x0d75, 1}, + {0x0d79, 0x0d7f, 1}, + {0x0d82, 0x0d83, 1}, + {0x0d85, 0x0d96, 1}, + {0x0d9a, 0x0db1, 1}, + {0x0db3, 0x0dbb, 1}, + {0x0dbd, 0x0dc0, 3}, + {0x0dc1, 0x0dc6, 1}, + {0x0dca, 0x0dcf, 5}, + {0x0dd0, 0x0dd4, 1}, + {0x0dd6, 0x0dd8, 2}, + {0x0dd9, 0x0ddf, 1}, + {0x0de6, 0x0def, 1}, + {0x0df2, 0x0df4, 1}, + {0x0e01, 0x0e3a, 1}, + {0x0e3f, 0x0e5b, 1}, + {0x0e81, 0x0e82, 1}, + {0x0e84, 0x0e87, 3}, + {0x0e88, 0x0e8a, 2}, + {0x0e8d, 0x0e94, 7}, + {0x0e95, 0x0e97, 1}, + {0x0e99, 0x0e9f, 1}, + {0x0ea1, 0x0ea3, 1}, + {0x0ea5, 0x0ea7, 2}, + {0x0eaa, 0x0eab, 1}, + {0x0ead, 0x0eb9, 1}, + {0x0ebb, 0x0ebd, 1}, + {0x0ec0, 0x0ec4, 1}, + {0x0ec6, 0x0ec8, 2}, + {0x0ec9, 0x0ecd, 1}, + {0x0ed0, 0x0ed9, 1}, + {0x0edc, 0x0edf, 1}, + {0x0f00, 0x0f47, 1}, + {0x0f49, 0x0f6c, 1}, + {0x0f71, 0x0f97, 1}, + {0x0f99, 0x0fbc, 1}, + {0x0fbe, 0x0fcc, 1}, + {0x0fce, 0x0fda, 1}, + {0x1000, 0x10c5, 1}, + {0x10c7, 0x10cd, 6}, + {0x10d0, 0x1248, 1}, + {0x124a, 0x124d, 1}, + {0x1250, 0x1256, 1}, + {0x1258, 0x125a, 2}, + {0x125b, 0x125d, 1}, + {0x1260, 0x1288, 1}, + {0x128a, 0x128d, 1}, + {0x1290, 0x12b0, 1}, + {0x12b2, 0x12b5, 1}, + {0x12b8, 0x12be, 1}, + {0x12c0, 0x12c2, 2}, + {0x12c3, 0x12c5, 1}, + {0x12c8, 0x12d6, 1}, + {0x12d8, 0x1310, 1}, + {0x1312, 0x1315, 1}, + {0x1318, 0x135a, 1}, + {0x135d, 0x137c, 1}, + {0x1380, 0x1399, 1}, + {0x13a0, 0x13f5, 1}, + {0x13f8, 0x13fd, 1}, + {0x1400, 0x169c, 1}, + {0x16a0, 0x16f8, 1}, + {0x1700, 0x170c, 1}, + {0x170e, 0x1714, 1}, + {0x1720, 0x1736, 1}, + {0x1740, 0x1753, 1}, + {0x1760, 0x176c, 1}, + {0x176e, 0x1770, 1}, + {0x1772, 0x1773, 1}, + {0x1780, 0x17dd, 1}, + {0x17e0, 0x17e9, 1}, + {0x17f0, 0x17f9, 1}, + {0x1800, 0x180e, 1}, + {0x1810, 0x1819, 1}, + {0x1820, 0x1877, 1}, + {0x1880, 0x18aa, 1}, + {0x18b0, 0x18f5, 1}, + {0x1900, 0x191e, 1}, + {0x1920, 0x192b, 1}, + {0x1930, 0x193b, 1}, + {0x1940, 0x1944, 4}, + {0x1945, 0x196d, 1}, + {0x1970, 0x1974, 1}, + {0x1980, 0x19ab, 1}, + {0x19b0, 0x19c9, 1}, + {0x19d0, 0x19da, 1}, + {0x19de, 0x1a1b, 1}, + {0x1a1e, 0x1a5e, 1}, + {0x1a60, 0x1a7c, 1}, + {0x1a7f, 0x1a89, 1}, + {0x1a90, 0x1a99, 1}, + {0x1aa0, 0x1aad, 1}, + {0x1ab0, 0x1abe, 1}, + {0x1b00, 0x1b4b, 1}, + {0x1b50, 0x1b7c, 1}, + {0x1b80, 0x1bf3, 1}, + {0x1bfc, 0x1c37, 1}, + {0x1c3b, 0x1c49, 1}, + {0x1c4d, 0x1c7f, 1}, + {0x1cc0, 0x1cc7, 1}, + {0x1cd0, 0x1cf6, 1}, + {0x1cf8, 0x1cf9, 1}, + {0x1d00, 0x1df5, 1}, + {0x1dfc, 0x1f15, 1}, + {0x1f18, 0x1f1d, 1}, + {0x1f20, 0x1f45, 1}, + {0x1f48, 0x1f4d, 1}, + {0x1f50, 0x1f57, 1}, + {0x1f59, 0x1f5f, 2}, + {0x1f60, 0x1f7d, 1}, + {0x1f80, 0x1fb4, 1}, + {0x1fb6, 0x1fc4, 1}, + {0x1fc6, 0x1fd3, 1}, + {0x1fd6, 0x1fdb, 1}, + {0x1fdd, 0x1fef, 1}, + {0x1ff2, 0x1ff4, 1}, + {0x1ff6, 0x1ffe, 1}, + {0x2000, 0x2064, 1}, + {0x2066, 0x2071, 1}, + {0x2074, 0x208e, 1}, + {0x2090, 0x209c, 1}, + {0x20a0, 0x20be, 1}, + {0x20d0, 0x20f0, 1}, + {0x2100, 0x218b, 1}, + {0x2190, 0x23fa, 1}, + {0x2400, 0x2426, 1}, + {0x2440, 0x244a, 1}, + {0x2460, 0x2b73, 1}, + {0x2b76, 0x2b95, 1}, + {0x2b98, 0x2bb9, 1}, + {0x2bbd, 0x2bc8, 1}, + {0x2bca, 0x2bd1, 1}, + {0x2bec, 0x2bef, 1}, + {0x2c00, 0x2c2e, 1}, + {0x2c30, 0x2c5e, 1}, + {0x2c60, 0x2cf3, 1}, + {0x2cf9, 0x2d25, 1}, + {0x2d27, 0x2d2d, 6}, + {0x2d30, 0x2d67, 1}, + {0x2d6f, 0x2d70, 1}, + {0x2d7f, 0x2d96, 1}, + {0x2da0, 0x2da6, 1}, + {0x2da8, 0x2dae, 1}, + {0x2db0, 0x2db6, 1}, + {0x2db8, 0x2dbe, 1}, + {0x2dc0, 0x2dc6, 1}, + {0x2dc8, 0x2dce, 1}, + {0x2dd0, 0x2dd6, 1}, + {0x2dd8, 0x2dde, 1}, + {0x2de0, 0x2e42, 1}, + {0x2e80, 0x2e99, 1}, + {0x2e9b, 0x2ef3, 1}, + {0x2f00, 0x2fd5, 1}, + {0x2ff0, 0x2ffb, 1}, + {0x3000, 0x303f, 1}, + {0x3041, 0x3096, 1}, + {0x3099, 0x30ff, 1}, + {0x3105, 0x312d, 1}, + {0x3131, 0x318e, 1}, + {0x3190, 0x31ba, 1}, + {0x31c0, 0x31e3, 1}, + {0x31f0, 0x321e, 1}, + {0x3220, 0x32fe, 1}, + {0x3300, 0x4db5, 1}, + {0x4dc0, 0x9fd5, 1}, + {0xa000, 0xa48c, 1}, + {0xa490, 0xa4c6, 1}, + {0xa4d0, 0xa62b, 1}, + {0xa640, 0xa6f7, 1}, + {0xa700, 0xa7ad, 1}, + {0xa7b0, 0xa7b7, 1}, + {0xa7f7, 0xa82b, 1}, + {0xa830, 0xa839, 1}, + {0xa840, 0xa877, 1}, + {0xa880, 0xa8c4, 1}, + {0xa8ce, 0xa8d9, 1}, + {0xa8e0, 0xa8fd, 1}, + {0xa900, 0xa953, 1}, + {0xa95f, 0xa97c, 1}, + {0xa980, 0xa9cd, 1}, + {0xa9cf, 0xa9d9, 1}, + {0xa9de, 0xa9fe, 1}, + {0xaa00, 0xaa36, 1}, + {0xaa40, 0xaa4d, 1}, + {0xaa50, 0xaa59, 1}, + {0xaa5c, 0xaac2, 1}, + {0xaadb, 0xaaf6, 1}, + {0xab01, 0xab06, 1}, + {0xab09, 0xab0e, 1}, + {0xab11, 0xab16, 1}, + {0xab20, 0xab26, 1}, + {0xab28, 0xab2e, 1}, + {0xab30, 0xab65, 1}, + {0xab70, 0xabed, 1}, + {0xabf0, 0xabf9, 1}, + {0xac00, 0xd7a3, 1}, + {0xd7b0, 0xd7c6, 1}, + {0xd7cb, 0xd7fb, 1}, + {0xd800, 0xfa6d, 1}, + {0xfa70, 0xfad9, 1}, + {0xfb00, 0xfb06, 1}, + {0xfb13, 0xfb17, 1}, + {0xfb1d, 0xfb36, 1}, + {0xfb38, 0xfb3c, 1}, + {0xfb3e, 0xfb40, 2}, + {0xfb41, 0xfb43, 2}, + {0xfb44, 0xfb46, 2}, + {0xfb47, 0xfbc1, 1}, + {0xfbd3, 0xfd3f, 1}, + {0xfd50, 0xfd8f, 1}, + {0xfd92, 0xfdc7, 1}, + {0xfdf0, 0xfdfd, 1}, + {0xfe00, 0xfe19, 1}, + {0xfe20, 0xfe52, 1}, + {0xfe54, 0xfe66, 1}, + {0xfe68, 0xfe6b, 1}, + {0xfe70, 0xfe74, 1}, + {0xfe76, 0xfefc, 1}, + {0xfeff, 0xff01, 2}, + {0xff02, 0xffbe, 1}, + {0xffc2, 0xffc7, 1}, + {0xffca, 0xffcf, 1}, + {0xffd2, 0xffd7, 1}, + {0xffda, 0xffdc, 1}, + {0xffe0, 0xffe6, 1}, + {0xffe8, 0xffee, 1}, + {0xfff9, 0xfffd, 1}, + }, + R32: []unicode.Range32{ + {0x00010000, 0x0001000b, 1}, + {0x0001000d, 0x00010026, 1}, + {0x00010028, 0x0001003a, 1}, + {0x0001003c, 0x0001003d, 1}, + {0x0001003f, 0x0001004d, 1}, + {0x00010050, 0x0001005d, 1}, + {0x00010080, 0x000100fa, 1}, + {0x00010100, 0x00010102, 1}, + {0x00010107, 0x00010133, 1}, + {0x00010137, 0x0001018c, 1}, + {0x00010190, 0x0001019b, 1}, + {0x000101a0, 0x000101d0, 48}, + {0x000101d1, 0x000101fd, 1}, + {0x00010280, 0x0001029c, 1}, + {0x000102a0, 0x000102d0, 1}, + {0x000102e0, 0x000102fb, 1}, + {0x00010300, 0x00010323, 1}, + {0x00010330, 0x0001034a, 1}, + {0x00010350, 0x0001037a, 1}, + {0x00010380, 0x0001039d, 1}, + {0x0001039f, 0x000103c3, 1}, + {0x000103c8, 0x000103d5, 1}, + {0x00010400, 0x0001049d, 1}, + {0x000104a0, 0x000104a9, 1}, + {0x00010500, 0x00010527, 1}, + {0x00010530, 0x00010563, 1}, + {0x0001056f, 0x00010600, 145}, + {0x00010601, 0x00010736, 1}, + {0x00010740, 0x00010755, 1}, + {0x00010760, 0x00010767, 1}, + {0x00010800, 0x00010805, 1}, + {0x00010808, 0x0001080a, 2}, + {0x0001080b, 0x00010835, 1}, + {0x00010837, 0x00010838, 1}, + {0x0001083c, 0x0001083f, 3}, + {0x00010840, 0x00010855, 1}, + {0x00010857, 0x0001089e, 1}, + {0x000108a7, 0x000108af, 1}, + {0x000108e0, 0x000108f2, 1}, + {0x000108f4, 0x000108f5, 1}, + {0x000108fb, 0x0001091b, 1}, + {0x0001091f, 0x00010939, 1}, + {0x0001093f, 0x00010980, 65}, + {0x00010981, 0x000109b7, 1}, + {0x000109bc, 0x000109cf, 1}, + {0x000109d2, 0x00010a03, 1}, + {0x00010a05, 0x00010a06, 1}, + {0x00010a0c, 0x00010a13, 1}, + {0x00010a15, 0x00010a17, 1}, + {0x00010a19, 0x00010a33, 1}, + {0x00010a38, 0x00010a3a, 1}, + {0x00010a3f, 0x00010a47, 1}, + {0x00010a50, 0x00010a58, 1}, + {0x00010a60, 0x00010a9f, 1}, + {0x00010ac0, 0x00010ae6, 1}, + {0x00010aeb, 0x00010af6, 1}, + {0x00010b00, 0x00010b35, 1}, + {0x00010b39, 0x00010b55, 1}, + {0x00010b58, 0x00010b72, 1}, + {0x00010b78, 0x00010b91, 1}, + {0x00010b99, 0x00010b9c, 1}, + {0x00010ba9, 0x00010baf, 1}, + {0x00010c00, 0x00010c48, 1}, + {0x00010c80, 0x00010cb2, 1}, + {0x00010cc0, 0x00010cf2, 1}, + {0x00010cfa, 0x00010cff, 1}, + {0x00010e60, 0x00010e7e, 1}, + {0x00011000, 0x0001104d, 1}, + {0x00011052, 0x0001106f, 1}, + {0x0001107f, 0x000110c1, 1}, + {0x000110d0, 0x000110e8, 1}, + {0x000110f0, 0x000110f9, 1}, + {0x00011100, 0x00011134, 1}, + {0x00011136, 0x00011143, 1}, + {0x00011150, 0x00011176, 1}, + {0x00011180, 0x000111cd, 1}, + {0x000111d0, 0x000111df, 1}, + {0x000111e1, 0x000111f4, 1}, + {0x00011200, 0x00011211, 1}, + {0x00011213, 0x0001123d, 1}, + {0x00011280, 0x00011286, 1}, + {0x00011288, 0x0001128a, 2}, + {0x0001128b, 0x0001128d, 1}, + {0x0001128f, 0x0001129d, 1}, + {0x0001129f, 0x000112a9, 1}, + {0x000112b0, 0x000112ea, 1}, + {0x000112f0, 0x000112f9, 1}, + {0x00011300, 0x00011303, 1}, + {0x00011305, 0x0001130c, 1}, + {0x0001130f, 0x00011310, 1}, + {0x00011313, 0x00011328, 1}, + {0x0001132a, 0x00011330, 1}, + {0x00011332, 0x00011333, 1}, + {0x00011335, 0x00011339, 1}, + {0x0001133c, 0x00011344, 1}, + {0x00011347, 0x00011348, 1}, + {0x0001134b, 0x0001134d, 1}, + {0x00011350, 0x00011357, 7}, + {0x0001135d, 0x00011363, 1}, + {0x00011366, 0x0001136c, 1}, + {0x00011370, 0x00011374, 1}, + {0x00011480, 0x000114c7, 1}, + {0x000114d0, 0x000114d9, 1}, + {0x00011580, 0x000115b5, 1}, + {0x000115b8, 0x000115dd, 1}, + {0x00011600, 0x00011644, 1}, + {0x00011650, 0x00011659, 1}, + {0x00011680, 0x000116b7, 1}, + {0x000116c0, 0x000116c9, 1}, + {0x00011700, 0x00011719, 1}, + {0x0001171d, 0x0001172b, 1}, + {0x00011730, 0x0001173f, 1}, + {0x000118a0, 0x000118f2, 1}, + {0x000118ff, 0x00011ac0, 449}, + {0x00011ac1, 0x00011af8, 1}, + {0x00012000, 0x00012399, 1}, + {0x00012400, 0x0001246e, 1}, + {0x00012470, 0x00012474, 1}, + {0x00012480, 0x00012543, 1}, + {0x00013000, 0x0001342e, 1}, + {0x00014400, 0x00014646, 1}, + {0x00016800, 0x00016a38, 1}, + {0x00016a40, 0x00016a5e, 1}, + {0x00016a60, 0x00016a69, 1}, + {0x00016a6e, 0x00016a6f, 1}, + {0x00016ad0, 0x00016aed, 1}, + {0x00016af0, 0x00016af5, 1}, + {0x00016b00, 0x00016b45, 1}, + {0x00016b50, 0x00016b59, 1}, + {0x00016b5b, 0x00016b61, 1}, + {0x00016b63, 0x00016b77, 1}, + {0x00016b7d, 0x00016b8f, 1}, + {0x00016f00, 0x00016f44, 1}, + {0x00016f50, 0x00016f7e, 1}, + {0x00016f8f, 0x00016f9f, 1}, + {0x0001b000, 0x0001b001, 1}, + {0x0001bc00, 0x0001bc6a, 1}, + {0x0001bc70, 0x0001bc7c, 1}, + {0x0001bc80, 0x0001bc88, 1}, + {0x0001bc90, 0x0001bc99, 1}, + {0x0001bc9c, 0x0001bca3, 1}, + {0x0001d000, 0x0001d0f5, 1}, + {0x0001d100, 0x0001d126, 1}, + {0x0001d129, 0x0001d1e8, 1}, + {0x0001d200, 0x0001d245, 1}, + {0x0001d300, 0x0001d356, 1}, + {0x0001d360, 0x0001d371, 1}, + {0x0001d400, 0x0001d454, 1}, + {0x0001d456, 0x0001d49c, 1}, + {0x0001d49e, 0x0001d49f, 1}, + {0x0001d4a2, 0x0001d4a5, 3}, + {0x0001d4a6, 0x0001d4a9, 3}, + {0x0001d4aa, 0x0001d4ac, 1}, + {0x0001d4ae, 0x0001d4b9, 1}, + {0x0001d4bb, 0x0001d4bd, 2}, + {0x0001d4be, 0x0001d4c3, 1}, + {0x0001d4c5, 0x0001d505, 1}, + {0x0001d507, 0x0001d50a, 1}, + {0x0001d50d, 0x0001d514, 1}, + {0x0001d516, 0x0001d51c, 1}, + {0x0001d51e, 0x0001d539, 1}, + {0x0001d53b, 0x0001d53e, 1}, + {0x0001d540, 0x0001d544, 1}, + {0x0001d546, 0x0001d54a, 4}, + {0x0001d54b, 0x0001d550, 1}, + {0x0001d552, 0x0001d6a5, 1}, + {0x0001d6a8, 0x0001d7cb, 1}, + {0x0001d7ce, 0x0001da8b, 1}, + {0x0001da9b, 0x0001da9f, 1}, + {0x0001daa1, 0x0001daaf, 1}, + {0x0001e800, 0x0001e8c4, 1}, + {0x0001e8c7, 0x0001e8d6, 1}, + {0x0001ee00, 0x0001ee03, 1}, + {0x0001ee05, 0x0001ee1f, 1}, + {0x0001ee21, 0x0001ee22, 1}, + {0x0001ee24, 0x0001ee27, 3}, + {0x0001ee29, 0x0001ee32, 1}, + {0x0001ee34, 0x0001ee37, 1}, + {0x0001ee39, 0x0001ee3b, 2}, + {0x0001ee42, 0x0001ee47, 5}, + {0x0001ee49, 0x0001ee4d, 2}, + {0x0001ee4e, 0x0001ee4f, 1}, + {0x0001ee51, 0x0001ee52, 1}, + {0x0001ee54, 0x0001ee57, 3}, + {0x0001ee59, 0x0001ee61, 2}, + {0x0001ee62, 0x0001ee64, 2}, + {0x0001ee67, 0x0001ee6a, 1}, + {0x0001ee6c, 0x0001ee72, 1}, + {0x0001ee74, 0x0001ee77, 1}, + {0x0001ee79, 0x0001ee7c, 1}, + {0x0001ee7e, 0x0001ee80, 2}, + {0x0001ee81, 0x0001ee89, 1}, + {0x0001ee8b, 0x0001ee9b, 1}, + {0x0001eea1, 0x0001eea3, 1}, + {0x0001eea5, 0x0001eea9, 1}, + {0x0001eeab, 0x0001eebb, 1}, + {0x0001eef0, 0x0001eef1, 1}, + {0x0001f000, 0x0001f02b, 1}, + {0x0001f030, 0x0001f093, 1}, + {0x0001f0a0, 0x0001f0ae, 1}, + {0x0001f0b1, 0x0001f0bf, 1}, + {0x0001f0c1, 0x0001f0cf, 1}, + {0x0001f0d1, 0x0001f0f5, 1}, + {0x0001f100, 0x0001f10c, 1}, + {0x0001f110, 0x0001f12e, 1}, + {0x0001f130, 0x0001f16b, 1}, + {0x0001f170, 0x0001f19a, 1}, + {0x0001f1e6, 0x0001f202, 1}, + {0x0001f210, 0x0001f23a, 1}, + {0x0001f240, 0x0001f248, 1}, + {0x0001f250, 0x0001f251, 1}, + {0x0001f300, 0x0001f579, 1}, + {0x0001f57b, 0x0001f5a3, 1}, + {0x0001f5a5, 0x0001f6d0, 1}, + {0x0001f6e0, 0x0001f6ec, 1}, + {0x0001f6f0, 0x0001f6f3, 1}, + {0x0001f700, 0x0001f773, 1}, + {0x0001f780, 0x0001f7d4, 1}, + {0x0001f800, 0x0001f80b, 1}, + {0x0001f810, 0x0001f847, 1}, + {0x0001f850, 0x0001f859, 1}, + {0x0001f860, 0x0001f887, 1}, + {0x0001f890, 0x0001f8ad, 1}, + {0x0001f910, 0x0001f918, 1}, + {0x0001f980, 0x0001f984, 1}, + {0x0001f9c0, 0x00020000, 1600}, + {0x00020001, 0x0002a6d6, 1}, + {0x0002a700, 0x0002b734, 1}, + {0x0002b740, 0x0002b81d, 1}, + {0x0002b820, 0x0002cea1, 1}, + {0x0002f800, 0x0002fa1d, 1}, + {0x000e0001, 0x000e0020, 31}, + {0x000e0021, 0x000e007f, 1}, + {0x000e0100, 0x000e01ef, 1}, + {0x000f0000, 0x000ffffd, 1}, + {0x00100000, 0x0010fffd, 1}, + }, + LatinOffset: 0, +} + +// Total size 38858 bytes (37 KiB) diff --git a/vendor/golang.org/x/text/width/common_test.go b/vendor/golang.org/x/text/width/common_test.go new file mode 100644 index 0000000000..fb5545e7ee --- /dev/null +++ b/vendor/golang.org/x/text/width/common_test.go @@ -0,0 +1,92 @@ +// This file was generated by go generate; DO NOT EDIT + +package width + +// This code is shared between the main code generator and the test code. + +import ( + "flag" + "log" + "strconv" + "strings" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/ucd" +) + +var ( + outputFile = flag.String("out", "tables.go", "output file") +) + +var typeMap = map[string]elem{ + "A": tagAmbiguous, + "N": tagNeutral, + "Na": tagNarrow, + "W": tagWide, + "F": tagFullwidth, + "H": tagHalfwidth, +} + +// getWidthData calls f for every entry for which it is defined. +// +// f may be called multiple times for the same rune. The last call to f is the +// correct value. f is not called for all runes. The default tag type is +// Neutral. +func getWidthData(f func(r rune, tag elem, alt rune)) { + // Set the default values for Unified Ideographs. In line with Annex 11, + // we encode full ranges instead of the defined runes in Unified_Ideograph. + for _, b := range []struct{ lo, hi rune }{ + {0x4E00, 0x9FFF}, // the CJK Unified Ideographs block, + {0x3400, 0x4DBF}, // the CJK Unified Ideographs Externsion A block, + {0xF900, 0xFAFF}, // the CJK Compatibility Ideographs block, + {0x20000, 0x2FFFF}, // the Supplementary Ideographic Plane, + {0x30000, 0x3FFFF}, // the Tertiary Ideographic Plane, + } { + for r := b.lo; r <= b.hi; r++ { + f(r, tagWide, 0) + } + } + + inverse := map[rune]rune{} + maps := map[string]bool{ + "<wide>": true, + "<narrow>": true, + } + + // We cannot reuse package norm's decomposition, as we need an unexpanded + // decomposition. We make use of the opportunity to verify that the + // decomposition type is as expected. + ucd.Parse(gen.OpenUCDFile("UnicodeData.txt"), func(p *ucd.Parser) { + r := p.Rune(0) + s := strings.SplitN(p.String(ucd.DecompMapping), " ", 2) + if !maps[s[0]] { + return + } + x, err := strconv.ParseUint(s[1], 16, 32) + if err != nil { + log.Fatalf("Error parsing rune %q", s[1]) + } + if inverse[r] != 0 || inverse[rune(x)] != 0 { + log.Fatalf("Circular dependency in mapping between %U and %U", r, x) + } + inverse[r] = rune(x) + inverse[rune(x)] = r + }) + + // <rune range>;<type> + ucd.Parse(gen.OpenUCDFile("EastAsianWidth.txt"), func(p *ucd.Parser) { + tag, ok := typeMap[p.String(1)] + if !ok { + log.Fatalf("Unknown width type %q", p.String(1)) + } + r := p.Rune(0) + alt, ok := inverse[r] + if tag == tagFullwidth || tag == tagHalfwidth && r != wonSign { + tag |= tagNeedsFold + if !ok { + log.Fatalf("Narrow or wide rune %U has no decomposition", r) + } + } + f(r, tag, alt) + }) +} diff --git a/vendor/golang.org/x/text/width/example_test.go b/vendor/golang.org/x/text/width/example_test.go new file mode 100644 index 0000000000..62adba6600 --- /dev/null +++ b/vendor/golang.org/x/text/width/example_test.go @@ -0,0 +1,52 @@ +// 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 width_test + +import ( + "fmt" + + "golang.org/x/text/width" +) + +func ExampleTransformer_fold() { + s := "abヲ₩○¥A" + f := width.Fold.String(s) + fmt.Printf("%U: %s\n", []rune(s), s) + fmt.Printf("%U: %s\n", []rune(f), f) + + // Output: + // [U+0061 U+0062 U+FF66 U+FFE6 U+FFEE U+FFE5 U+FF21]: abヲ₩○¥A + // [U+0061 U+0062 U+30F2 U+20A9 U+25CB U+00A5 U+0041]: abヲ₩○¥A +} + +func ExampleTransformer_widen() { + s := "ab¥ヲ₩○" + w := width.Widen.String(s) + fmt.Printf("%U: %s\n", []rune(s), s) + fmt.Printf("%U: %s\n", []rune(w), w) + + // Output: + // [U+0061 U+0062 U+00A5 U+FF66 U+20A9 U+FFEE]: ab¥ヲ₩○ + // [U+FF41 U+FF42 U+FFE5 U+30F2 U+FFE6 U+25CB]: ab¥ヲ₩○ +} + +func ExampleTransformer_narrow() { + s := "abヲ₩○¥A" + n := width.Narrow.String(s) + fmt.Printf("%U: %s\n", []rune(s), s) + fmt.Printf("%U: %s\n", []rune(n), n) + + // Ambiguous characters with a halfwidth equivalent get mapped as well. + s = "←" + n = width.Narrow.String(s) + fmt.Printf("%U: %s\n", []rune(s), s) + fmt.Printf("%U: %s\n", []rune(n), n) + + // Output: + // [U+0061 U+0062 U+30F2 U+FFE6 U+25CB U+FFE5 U+FF21]: abヲ₩○¥A + // [U+0061 U+0062 U+FF66 U+20A9 U+FFEE U+00A5 U+0041]: abヲ₩○¥A + // [U+2190]: ← + // [U+FFE9]: ← +} diff --git a/vendor/golang.org/x/text/width/gen.go b/vendor/golang.org/x/text/width/gen.go new file mode 100644 index 0000000000..03d9f99ad6 --- /dev/null +++ b/vendor/golang.org/x/text/width/gen.go @@ -0,0 +1,115 @@ +// 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 ignore + +// This program generates the trie for width operations. The generated table +// includes width category information as well as the normalization mappings. +package main + +import ( + "bytes" + "fmt" + "io" + "log" + "math" + "unicode/utf8" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/triegen" +) + +// See gen_common.go for flags. + +func main() { + gen.Init() + genTables() + genTests() + gen.Repackage("gen_trieval.go", "trieval.go", "width") + gen.Repackage("gen_common.go", "common_test.go", "width") +} + +func genTables() { + t := triegen.NewTrie("width") + // fold and inverse mappings. See mapComment for a description of the format + // of each entry. Add dummy value to make an index of 0 mean no mapping. + inverse := [][4]byte{{}} + mapping := map[[4]byte]int{[4]byte{}: 0} + + getWidthData(func(r rune, tag elem, alt rune) { + idx := 0 + if alt != 0 { + var buf [4]byte + buf[0] = byte(utf8.EncodeRune(buf[1:], alt)) + s := string(r) + buf[buf[0]] ^= s[len(s)-1] + var ok bool + if idx, ok = mapping[buf]; !ok { + idx = len(mapping) + if idx > math.MaxUint8 { + log.Fatalf("Index %d does not fit in a byte.", idx) + } + mapping[buf] = idx + inverse = append(inverse, buf) + } + } + t.Insert(r, uint64(tag|elem(idx))) + }) + + w := &bytes.Buffer{} + gen.WriteUnicodeVersion(w) + + sz, err := t.Gen(w) + if err != nil { + log.Fatal(err) + } + + sz += writeMappings(w, inverse) + + fmt.Fprintf(w, "// Total table size %d bytes (%dKiB)\n", sz, sz/1024) + + gen.WriteGoFile(*outputFile, "width", w.Bytes()) +} + +const inverseDataComment = ` +// inverseData contains 4-byte entries of the following format: +// <length> <modified UTF-8-encoded rune> <0 padding> +// The last byte of the UTF-8-encoded rune is xor-ed with the last byte of the +// UTF-8 encoding of the original rune. Mappings often have the following +// pattern: +// A -> A (U+FF21 -> U+0041) +// B -> B (U+FF22 -> U+0042) +// ... +// By xor-ing the last byte the same entry can be shared by many mappings. This +// reduces the total number of distinct entries by about two thirds. +// The resulting entry for the aforementioned mappings is +// { 0x01, 0xE0, 0x00, 0x00 } +// Using this entry to map U+FF21 (UTF-8 [EF BC A1]), we get +// E0 ^ A1 = 41. +// Similarly, for U+FF22 (UTF-8 [EF BC A2]), we get +// E0 ^ A2 = 42. +// Note that because of the xor-ing, the byte sequence stored in the entry is +// not valid UTF-8.` + +func writeMappings(w io.Writer, data [][4]byte) int { + fmt.Fprintln(w, inverseDataComment) + fmt.Fprintf(w, "var inverseData = [%d][4]byte{\n", len(data)) + for _, x := range data { + fmt.Fprintf(w, "{ 0x%02x, 0x%02x, 0x%02x, 0x%02x },\n", x[0], x[1], x[2], x[3]) + } + fmt.Fprintln(w, "}") + return len(data) * 4 +} + +func genTests() { + w := &bytes.Buffer{} + fmt.Fprintf(w, "\nvar mapRunes = map[rune]struct{r rune; e elem}{\n") + getWidthData(func(r rune, tag elem, alt rune) { + if alt != 0 { + fmt.Fprintf(w, "\t0x%X: {0x%X, 0x%X},\n", r, alt, tag) + } + }) + fmt.Fprintln(w, "}") + gen.WriteGoFile("runes_test.go", "width", w.Bytes()) +} diff --git a/vendor/golang.org/x/text/width/gen_common.go b/vendor/golang.org/x/text/width/gen_common.go new file mode 100644 index 0000000000..601e752684 --- /dev/null +++ b/vendor/golang.org/x/text/width/gen_common.go @@ -0,0 +1,96 @@ +// 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 ignore + +package main + +// This code is shared between the main code generator and the test code. + +import ( + "flag" + "log" + "strconv" + "strings" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/ucd" +) + +var ( + outputFile = flag.String("out", "tables.go", "output file") +) + +var typeMap = map[string]elem{ + "A": tagAmbiguous, + "N": tagNeutral, + "Na": tagNarrow, + "W": tagWide, + "F": tagFullwidth, + "H": tagHalfwidth, +} + +// getWidthData calls f for every entry for which it is defined. +// +// f may be called multiple times for the same rune. The last call to f is the +// correct value. f is not called for all runes. The default tag type is +// Neutral. +func getWidthData(f func(r rune, tag elem, alt rune)) { + // Set the default values for Unified Ideographs. In line with Annex 11, + // we encode full ranges instead of the defined runes in Unified_Ideograph. + for _, b := range []struct{ lo, hi rune }{ + {0x4E00, 0x9FFF}, // the CJK Unified Ideographs block, + {0x3400, 0x4DBF}, // the CJK Unified Ideographs Externsion A block, + {0xF900, 0xFAFF}, // the CJK Compatibility Ideographs block, + {0x20000, 0x2FFFF}, // the Supplementary Ideographic Plane, + {0x30000, 0x3FFFF}, // the Tertiary Ideographic Plane, + } { + for r := b.lo; r <= b.hi; r++ { + f(r, tagWide, 0) + } + } + + inverse := map[rune]rune{} + maps := map[string]bool{ + "<wide>": true, + "<narrow>": true, + } + + // We cannot reuse package norm's decomposition, as we need an unexpanded + // decomposition. We make use of the opportunity to verify that the + // decomposition type is as expected. + ucd.Parse(gen.OpenUCDFile("UnicodeData.txt"), func(p *ucd.Parser) { + r := p.Rune(0) + s := strings.SplitN(p.String(ucd.DecompMapping), " ", 2) + if !maps[s[0]] { + return + } + x, err := strconv.ParseUint(s[1], 16, 32) + if err != nil { + log.Fatalf("Error parsing rune %q", s[1]) + } + if inverse[r] != 0 || inverse[rune(x)] != 0 { + log.Fatalf("Circular dependency in mapping between %U and %U", r, x) + } + inverse[r] = rune(x) + inverse[rune(x)] = r + }) + + // <rune range>;<type> + ucd.Parse(gen.OpenUCDFile("EastAsianWidth.txt"), func(p *ucd.Parser) { + tag, ok := typeMap[p.String(1)] + if !ok { + log.Fatalf("Unknown width type %q", p.String(1)) + } + r := p.Rune(0) + alt, ok := inverse[r] + if tag == tagFullwidth || tag == tagHalfwidth && r != wonSign { + tag |= tagNeedsFold + if !ok { + log.Fatalf("Narrow or wide rune %U has no decomposition", r) + } + } + f(r, tag, alt) + }) +} diff --git a/vendor/golang.org/x/text/width/gen_trieval.go b/vendor/golang.org/x/text/width/gen_trieval.go new file mode 100644 index 0000000000..c17334aa61 --- /dev/null +++ b/vendor/golang.org/x/text/width/gen_trieval.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. + +// +build ignore + +package main + +// elem is an entry of the width trie. The high byte is used to encode the type +// of the rune. The low byte is used to store the index to a mapping entry in +// the inverseData array. +type elem uint16 + +const ( + tagNeutral elem = iota << typeShift + tagAmbiguous + tagWide + tagNarrow + tagFullwidth + tagHalfwidth +) + +const ( + numTypeBits = 3 + typeShift = 16 - numTypeBits + + // tagNeedsFold is true for all fullwidth and halfwidth runes except for + // the Won sign U+20A9. + tagNeedsFold = 0x1000 + + // The Korean Won sign is halfwidth, but SHOULD NOT be mapped to a wide + // variant. + wonSign rune = 0x20A9 +) diff --git a/vendor/golang.org/x/text/width/kind_string.go b/vendor/golang.org/x/text/width/kind_string.go new file mode 100644 index 0000000000..7028c25bf3 --- /dev/null +++ b/vendor/golang.org/x/text/width/kind_string.go @@ -0,0 +1,16 @@ +// generated by stringer -type=Kind; DO NOT EDIT + +package width + +import "fmt" + +const _Kind_name = "NeutralEastAsianAmbiguousEastAsianWideEastAsianNarrowEastAsianFullwidthEastAsianHalfwidth" + +var _Kind_index = [...]uint8{0, 7, 25, 38, 53, 71, 89} + +func (i Kind) String() string { + if i < 0 || i+1 >= Kind(len(_Kind_index)) { + return fmt.Sprintf("Kind(%d)", i) + } + return _Kind_name[_Kind_index[i]:_Kind_index[i+1]] +} diff --git a/vendor/golang.org/x/text/width/runes_test.go b/vendor/golang.org/x/text/width/runes_test.go new file mode 100644 index 0000000000..2a48c404d3 --- /dev/null +++ b/vendor/golang.org/x/text/width/runes_test.go @@ -0,0 +1,461 @@ +// This file was generated by go generate; DO NOT EDIT + +package width + +var mapRunes = map[rune]struct { + r rune + e elem +}{ + 0x20: {0x3000, 0x6000}, + 0x21: {0xFF01, 0x6000}, + 0x22: {0xFF02, 0x6000}, + 0x23: {0xFF03, 0x6000}, + 0x24: {0xFF04, 0x6000}, + 0x25: {0xFF05, 0x6000}, + 0x26: {0xFF06, 0x6000}, + 0x27: {0xFF07, 0x6000}, + 0x28: {0xFF08, 0x6000}, + 0x29: {0xFF09, 0x6000}, + 0x2A: {0xFF0A, 0x6000}, + 0x2B: {0xFF0B, 0x6000}, + 0x2C: {0xFF0C, 0x6000}, + 0x2D: {0xFF0D, 0x6000}, + 0x2E: {0xFF0E, 0x6000}, + 0x2F: {0xFF0F, 0x6000}, + 0x30: {0xFF10, 0x6000}, + 0x31: {0xFF11, 0x6000}, + 0x32: {0xFF12, 0x6000}, + 0x33: {0xFF13, 0x6000}, + 0x34: {0xFF14, 0x6000}, + 0x35: {0xFF15, 0x6000}, + 0x36: {0xFF16, 0x6000}, + 0x37: {0xFF17, 0x6000}, + 0x38: {0xFF18, 0x6000}, + 0x39: {0xFF19, 0x6000}, + 0x3A: {0xFF1A, 0x6000}, + 0x3B: {0xFF1B, 0x6000}, + 0x3C: {0xFF1C, 0x6000}, + 0x3D: {0xFF1D, 0x6000}, + 0x3E: {0xFF1E, 0x6000}, + 0x3F: {0xFF1F, 0x6000}, + 0x40: {0xFF20, 0x6000}, + 0x41: {0xFF21, 0x6000}, + 0x42: {0xFF22, 0x6000}, + 0x43: {0xFF23, 0x6000}, + 0x44: {0xFF24, 0x6000}, + 0x45: {0xFF25, 0x6000}, + 0x46: {0xFF26, 0x6000}, + 0x47: {0xFF27, 0x6000}, + 0x48: {0xFF28, 0x6000}, + 0x49: {0xFF29, 0x6000}, + 0x4A: {0xFF2A, 0x6000}, + 0x4B: {0xFF2B, 0x6000}, + 0x4C: {0xFF2C, 0x6000}, + 0x4D: {0xFF2D, 0x6000}, + 0x4E: {0xFF2E, 0x6000}, + 0x4F: {0xFF2F, 0x6000}, + 0x50: {0xFF30, 0x6000}, + 0x51: {0xFF31, 0x6000}, + 0x52: {0xFF32, 0x6000}, + 0x53: {0xFF33, 0x6000}, + 0x54: {0xFF34, 0x6000}, + 0x55: {0xFF35, 0x6000}, + 0x56: {0xFF36, 0x6000}, + 0x57: {0xFF37, 0x6000}, + 0x58: {0xFF38, 0x6000}, + 0x59: {0xFF39, 0x6000}, + 0x5A: {0xFF3A, 0x6000}, + 0x5B: {0xFF3B, 0x6000}, + 0x5C: {0xFF3C, 0x6000}, + 0x5D: {0xFF3D, 0x6000}, + 0x5E: {0xFF3E, 0x6000}, + 0x5F: {0xFF3F, 0x6000}, + 0x60: {0xFF40, 0x6000}, + 0x61: {0xFF41, 0x6000}, + 0x62: {0xFF42, 0x6000}, + 0x63: {0xFF43, 0x6000}, + 0x64: {0xFF44, 0x6000}, + 0x65: {0xFF45, 0x6000}, + 0x66: {0xFF46, 0x6000}, + 0x67: {0xFF47, 0x6000}, + 0x68: {0xFF48, 0x6000}, + 0x69: {0xFF49, 0x6000}, + 0x6A: {0xFF4A, 0x6000}, + 0x6B: {0xFF4B, 0x6000}, + 0x6C: {0xFF4C, 0x6000}, + 0x6D: {0xFF4D, 0x6000}, + 0x6E: {0xFF4E, 0x6000}, + 0x6F: {0xFF4F, 0x6000}, + 0x70: {0xFF50, 0x6000}, + 0x71: {0xFF51, 0x6000}, + 0x72: {0xFF52, 0x6000}, + 0x73: {0xFF53, 0x6000}, + 0x74: {0xFF54, 0x6000}, + 0x75: {0xFF55, 0x6000}, + 0x76: {0xFF56, 0x6000}, + 0x77: {0xFF57, 0x6000}, + 0x78: {0xFF58, 0x6000}, + 0x79: {0xFF59, 0x6000}, + 0x7A: {0xFF5A, 0x6000}, + 0x7B: {0xFF5B, 0x6000}, + 0x7C: {0xFF5C, 0x6000}, + 0x7D: {0xFF5D, 0x6000}, + 0x7E: {0xFF5E, 0x6000}, + 0xA2: {0xFFE0, 0x6000}, + 0xA3: {0xFFE1, 0x6000}, + 0xA5: {0xFFE5, 0x6000}, + 0xA6: {0xFFE4, 0x6000}, + 0xAC: {0xFFE2, 0x6000}, + 0xAF: {0xFFE3, 0x6000}, + 0x20A9: {0xFFE6, 0xA000}, + 0x2190: {0xFFE9, 0x2000}, + 0x2191: {0xFFEA, 0x2000}, + 0x2192: {0xFFEB, 0x2000}, + 0x2193: {0xFFEC, 0x2000}, + 0x2502: {0xFFE8, 0x2000}, + 0x25A0: {0xFFED, 0x2000}, + 0x25CB: {0xFFEE, 0x2000}, + 0x2985: {0xFF5F, 0x6000}, + 0x2986: {0xFF60, 0x6000}, + 0x3000: {0x20, 0x9000}, + 0x3001: {0xFF64, 0x4000}, + 0x3002: {0xFF61, 0x4000}, + 0x300C: {0xFF62, 0x4000}, + 0x300D: {0xFF63, 0x4000}, + 0x3099: {0xFF9E, 0x4000}, + 0x309A: {0xFF9F, 0x4000}, + 0x30A1: {0xFF67, 0x4000}, + 0x30A2: {0xFF71, 0x4000}, + 0x30A3: {0xFF68, 0x4000}, + 0x30A4: {0xFF72, 0x4000}, + 0x30A5: {0xFF69, 0x4000}, + 0x30A6: {0xFF73, 0x4000}, + 0x30A7: {0xFF6A, 0x4000}, + 0x30A8: {0xFF74, 0x4000}, + 0x30A9: {0xFF6B, 0x4000}, + 0x30AA: {0xFF75, 0x4000}, + 0x30AB: {0xFF76, 0x4000}, + 0x30AD: {0xFF77, 0x4000}, + 0x30AF: {0xFF78, 0x4000}, + 0x30B1: {0xFF79, 0x4000}, + 0x30B3: {0xFF7A, 0x4000}, + 0x30B5: {0xFF7B, 0x4000}, + 0x30B7: {0xFF7C, 0x4000}, + 0x30B9: {0xFF7D, 0x4000}, + 0x30BB: {0xFF7E, 0x4000}, + 0x30BD: {0xFF7F, 0x4000}, + 0x30BF: {0xFF80, 0x4000}, + 0x30C1: {0xFF81, 0x4000}, + 0x30C3: {0xFF6F, 0x4000}, + 0x30C4: {0xFF82, 0x4000}, + 0x30C6: {0xFF83, 0x4000}, + 0x30C8: {0xFF84, 0x4000}, + 0x30CA: {0xFF85, 0x4000}, + 0x30CB: {0xFF86, 0x4000}, + 0x30CC: {0xFF87, 0x4000}, + 0x30CD: {0xFF88, 0x4000}, + 0x30CE: {0xFF89, 0x4000}, + 0x30CF: {0xFF8A, 0x4000}, + 0x30D2: {0xFF8B, 0x4000}, + 0x30D5: {0xFF8C, 0x4000}, + 0x30D8: {0xFF8D, 0x4000}, + 0x30DB: {0xFF8E, 0x4000}, + 0x30DE: {0xFF8F, 0x4000}, + 0x30DF: {0xFF90, 0x4000}, + 0x30E0: {0xFF91, 0x4000}, + 0x30E1: {0xFF92, 0x4000}, + 0x30E2: {0xFF93, 0x4000}, + 0x30E3: {0xFF6C, 0x4000}, + 0x30E4: {0xFF94, 0x4000}, + 0x30E5: {0xFF6D, 0x4000}, + 0x30E6: {0xFF95, 0x4000}, + 0x30E7: {0xFF6E, 0x4000}, + 0x30E8: {0xFF96, 0x4000}, + 0x30E9: {0xFF97, 0x4000}, + 0x30EA: {0xFF98, 0x4000}, + 0x30EB: {0xFF99, 0x4000}, + 0x30EC: {0xFF9A, 0x4000}, + 0x30ED: {0xFF9B, 0x4000}, + 0x30EF: {0xFF9C, 0x4000}, + 0x30F2: {0xFF66, 0x4000}, + 0x30F3: {0xFF9D, 0x4000}, + 0x30FB: {0xFF65, 0x4000}, + 0x30FC: {0xFF70, 0x4000}, + 0x3131: {0xFFA1, 0x4000}, + 0x3132: {0xFFA2, 0x4000}, + 0x3133: {0xFFA3, 0x4000}, + 0x3134: {0xFFA4, 0x4000}, + 0x3135: {0xFFA5, 0x4000}, + 0x3136: {0xFFA6, 0x4000}, + 0x3137: {0xFFA7, 0x4000}, + 0x3138: {0xFFA8, 0x4000}, + 0x3139: {0xFFA9, 0x4000}, + 0x313A: {0xFFAA, 0x4000}, + 0x313B: {0xFFAB, 0x4000}, + 0x313C: {0xFFAC, 0x4000}, + 0x313D: {0xFFAD, 0x4000}, + 0x313E: {0xFFAE, 0x4000}, + 0x313F: {0xFFAF, 0x4000}, + 0x3140: {0xFFB0, 0x4000}, + 0x3141: {0xFFB1, 0x4000}, + 0x3142: {0xFFB2, 0x4000}, + 0x3143: {0xFFB3, 0x4000}, + 0x3144: {0xFFB4, 0x4000}, + 0x3145: {0xFFB5, 0x4000}, + 0x3146: {0xFFB6, 0x4000}, + 0x3147: {0xFFB7, 0x4000}, + 0x3148: {0xFFB8, 0x4000}, + 0x3149: {0xFFB9, 0x4000}, + 0x314A: {0xFFBA, 0x4000}, + 0x314B: {0xFFBB, 0x4000}, + 0x314C: {0xFFBC, 0x4000}, + 0x314D: {0xFFBD, 0x4000}, + 0x314E: {0xFFBE, 0x4000}, + 0x314F: {0xFFC2, 0x4000}, + 0x3150: {0xFFC3, 0x4000}, + 0x3151: {0xFFC4, 0x4000}, + 0x3152: {0xFFC5, 0x4000}, + 0x3153: {0xFFC6, 0x4000}, + 0x3154: {0xFFC7, 0x4000}, + 0x3155: {0xFFCA, 0x4000}, + 0x3156: {0xFFCB, 0x4000}, + 0x3157: {0xFFCC, 0x4000}, + 0x3158: {0xFFCD, 0x4000}, + 0x3159: {0xFFCE, 0x4000}, + 0x315A: {0xFFCF, 0x4000}, + 0x315B: {0xFFD2, 0x4000}, + 0x315C: {0xFFD3, 0x4000}, + 0x315D: {0xFFD4, 0x4000}, + 0x315E: {0xFFD5, 0x4000}, + 0x315F: {0xFFD6, 0x4000}, + 0x3160: {0xFFD7, 0x4000}, + 0x3161: {0xFFDA, 0x4000}, + 0x3162: {0xFFDB, 0x4000}, + 0x3163: {0xFFDC, 0x4000}, + 0x3164: {0xFFA0, 0x4000}, + 0xFF01: {0x21, 0x9000}, + 0xFF02: {0x22, 0x9000}, + 0xFF03: {0x23, 0x9000}, + 0xFF04: {0x24, 0x9000}, + 0xFF05: {0x25, 0x9000}, + 0xFF06: {0x26, 0x9000}, + 0xFF07: {0x27, 0x9000}, + 0xFF08: {0x28, 0x9000}, + 0xFF09: {0x29, 0x9000}, + 0xFF0A: {0x2A, 0x9000}, + 0xFF0B: {0x2B, 0x9000}, + 0xFF0C: {0x2C, 0x9000}, + 0xFF0D: {0x2D, 0x9000}, + 0xFF0E: {0x2E, 0x9000}, + 0xFF0F: {0x2F, 0x9000}, + 0xFF10: {0x30, 0x9000}, + 0xFF11: {0x31, 0x9000}, + 0xFF12: {0x32, 0x9000}, + 0xFF13: {0x33, 0x9000}, + 0xFF14: {0x34, 0x9000}, + 0xFF15: {0x35, 0x9000}, + 0xFF16: {0x36, 0x9000}, + 0xFF17: {0x37, 0x9000}, + 0xFF18: {0x38, 0x9000}, + 0xFF19: {0x39, 0x9000}, + 0xFF1A: {0x3A, 0x9000}, + 0xFF1B: {0x3B, 0x9000}, + 0xFF1C: {0x3C, 0x9000}, + 0xFF1D: {0x3D, 0x9000}, + 0xFF1E: {0x3E, 0x9000}, + 0xFF1F: {0x3F, 0x9000}, + 0xFF20: {0x40, 0x9000}, + 0xFF21: {0x41, 0x9000}, + 0xFF22: {0x42, 0x9000}, + 0xFF23: {0x43, 0x9000}, + 0xFF24: {0x44, 0x9000}, + 0xFF25: {0x45, 0x9000}, + 0xFF26: {0x46, 0x9000}, + 0xFF27: {0x47, 0x9000}, + 0xFF28: {0x48, 0x9000}, + 0xFF29: {0x49, 0x9000}, + 0xFF2A: {0x4A, 0x9000}, + 0xFF2B: {0x4B, 0x9000}, + 0xFF2C: {0x4C, 0x9000}, + 0xFF2D: {0x4D, 0x9000}, + 0xFF2E: {0x4E, 0x9000}, + 0xFF2F: {0x4F, 0x9000}, + 0xFF30: {0x50, 0x9000}, + 0xFF31: {0x51, 0x9000}, + 0xFF32: {0x52, 0x9000}, + 0xFF33: {0x53, 0x9000}, + 0xFF34: {0x54, 0x9000}, + 0xFF35: {0x55, 0x9000}, + 0xFF36: {0x56, 0x9000}, + 0xFF37: {0x57, 0x9000}, + 0xFF38: {0x58, 0x9000}, + 0xFF39: {0x59, 0x9000}, + 0xFF3A: {0x5A, 0x9000}, + 0xFF3B: {0x5B, 0x9000}, + 0xFF3C: {0x5C, 0x9000}, + 0xFF3D: {0x5D, 0x9000}, + 0xFF3E: {0x5E, 0x9000}, + 0xFF3F: {0x5F, 0x9000}, + 0xFF40: {0x60, 0x9000}, + 0xFF41: {0x61, 0x9000}, + 0xFF42: {0x62, 0x9000}, + 0xFF43: {0x63, 0x9000}, + 0xFF44: {0x64, 0x9000}, + 0xFF45: {0x65, 0x9000}, + 0xFF46: {0x66, 0x9000}, + 0xFF47: {0x67, 0x9000}, + 0xFF48: {0x68, 0x9000}, + 0xFF49: {0x69, 0x9000}, + 0xFF4A: {0x6A, 0x9000}, + 0xFF4B: {0x6B, 0x9000}, + 0xFF4C: {0x6C, 0x9000}, + 0xFF4D: {0x6D, 0x9000}, + 0xFF4E: {0x6E, 0x9000}, + 0xFF4F: {0x6F, 0x9000}, + 0xFF50: {0x70, 0x9000}, + 0xFF51: {0x71, 0x9000}, + 0xFF52: {0x72, 0x9000}, + 0xFF53: {0x73, 0x9000}, + 0xFF54: {0x74, 0x9000}, + 0xFF55: {0x75, 0x9000}, + 0xFF56: {0x76, 0x9000}, + 0xFF57: {0x77, 0x9000}, + 0xFF58: {0x78, 0x9000}, + 0xFF59: {0x79, 0x9000}, + 0xFF5A: {0x7A, 0x9000}, + 0xFF5B: {0x7B, 0x9000}, + 0xFF5C: {0x7C, 0x9000}, + 0xFF5D: {0x7D, 0x9000}, + 0xFF5E: {0x7E, 0x9000}, + 0xFF5F: {0x2985, 0x9000}, + 0xFF60: {0x2986, 0x9000}, + 0xFF61: {0x3002, 0xB000}, + 0xFF62: {0x300C, 0xB000}, + 0xFF63: {0x300D, 0xB000}, + 0xFF64: {0x3001, 0xB000}, + 0xFF65: {0x30FB, 0xB000}, + 0xFF66: {0x30F2, 0xB000}, + 0xFF67: {0x30A1, 0xB000}, + 0xFF68: {0x30A3, 0xB000}, + 0xFF69: {0x30A5, 0xB000}, + 0xFF6A: {0x30A7, 0xB000}, + 0xFF6B: {0x30A9, 0xB000}, + 0xFF6C: {0x30E3, 0xB000}, + 0xFF6D: {0x30E5, 0xB000}, + 0xFF6E: {0x30E7, 0xB000}, + 0xFF6F: {0x30C3, 0xB000}, + 0xFF70: {0x30FC, 0xB000}, + 0xFF71: {0x30A2, 0xB000}, + 0xFF72: {0x30A4, 0xB000}, + 0xFF73: {0x30A6, 0xB000}, + 0xFF74: {0x30A8, 0xB000}, + 0xFF75: {0x30AA, 0xB000}, + 0xFF76: {0x30AB, 0xB000}, + 0xFF77: {0x30AD, 0xB000}, + 0xFF78: {0x30AF, 0xB000}, + 0xFF79: {0x30B1, 0xB000}, + 0xFF7A: {0x30B3, 0xB000}, + 0xFF7B: {0x30B5, 0xB000}, + 0xFF7C: {0x30B7, 0xB000}, + 0xFF7D: {0x30B9, 0xB000}, + 0xFF7E: {0x30BB, 0xB000}, + 0xFF7F: {0x30BD, 0xB000}, + 0xFF80: {0x30BF, 0xB000}, + 0xFF81: {0x30C1, 0xB000}, + 0xFF82: {0x30C4, 0xB000}, + 0xFF83: {0x30C6, 0xB000}, + 0xFF84: {0x30C8, 0xB000}, + 0xFF85: {0x30CA, 0xB000}, + 0xFF86: {0x30CB, 0xB000}, + 0xFF87: {0x30CC, 0xB000}, + 0xFF88: {0x30CD, 0xB000}, + 0xFF89: {0x30CE, 0xB000}, + 0xFF8A: {0x30CF, 0xB000}, + 0xFF8B: {0x30D2, 0xB000}, + 0xFF8C: {0x30D5, 0xB000}, + 0xFF8D: {0x30D8, 0xB000}, + 0xFF8E: {0x30DB, 0xB000}, + 0xFF8F: {0x30DE, 0xB000}, + 0xFF90: {0x30DF, 0xB000}, + 0xFF91: {0x30E0, 0xB000}, + 0xFF92: {0x30E1, 0xB000}, + 0xFF93: {0x30E2, 0xB000}, + 0xFF94: {0x30E4, 0xB000}, + 0xFF95: {0x30E6, 0xB000}, + 0xFF96: {0x30E8, 0xB000}, + 0xFF97: {0x30E9, 0xB000}, + 0xFF98: {0x30EA, 0xB000}, + 0xFF99: {0x30EB, 0xB000}, + 0xFF9A: {0x30EC, 0xB000}, + 0xFF9B: {0x30ED, 0xB000}, + 0xFF9C: {0x30EF, 0xB000}, + 0xFF9D: {0x30F3, 0xB000}, + 0xFF9E: {0x3099, 0xB000}, + 0xFF9F: {0x309A, 0xB000}, + 0xFFA0: {0x3164, 0xB000}, + 0xFFA1: {0x3131, 0xB000}, + 0xFFA2: {0x3132, 0xB000}, + 0xFFA3: {0x3133, 0xB000}, + 0xFFA4: {0x3134, 0xB000}, + 0xFFA5: {0x3135, 0xB000}, + 0xFFA6: {0x3136, 0xB000}, + 0xFFA7: {0x3137, 0xB000}, + 0xFFA8: {0x3138, 0xB000}, + 0xFFA9: {0x3139, 0xB000}, + 0xFFAA: {0x313A, 0xB000}, + 0xFFAB: {0x313B, 0xB000}, + 0xFFAC: {0x313C, 0xB000}, + 0xFFAD: {0x313D, 0xB000}, + 0xFFAE: {0x313E, 0xB000}, + 0xFFAF: {0x313F, 0xB000}, + 0xFFB0: {0x3140, 0xB000}, + 0xFFB1: {0x3141, 0xB000}, + 0xFFB2: {0x3142, 0xB000}, + 0xFFB3: {0x3143, 0xB000}, + 0xFFB4: {0x3144, 0xB000}, + 0xFFB5: {0x3145, 0xB000}, + 0xFFB6: {0x3146, 0xB000}, + 0xFFB7: {0x3147, 0xB000}, + 0xFFB8: {0x3148, 0xB000}, + 0xFFB9: {0x3149, 0xB000}, + 0xFFBA: {0x314A, 0xB000}, + 0xFFBB: {0x314B, 0xB000}, + 0xFFBC: {0x314C, 0xB000}, + 0xFFBD: {0x314D, 0xB000}, + 0xFFBE: {0x314E, 0xB000}, + 0xFFC2: {0x314F, 0xB000}, + 0xFFC3: {0x3150, 0xB000}, + 0xFFC4: {0x3151, 0xB000}, + 0xFFC5: {0x3152, 0xB000}, + 0xFFC6: {0x3153, 0xB000}, + 0xFFC7: {0x3154, 0xB000}, + 0xFFCA: {0x3155, 0xB000}, + 0xFFCB: {0x3156, 0xB000}, + 0xFFCC: {0x3157, 0xB000}, + 0xFFCD: {0x3158, 0xB000}, + 0xFFCE: {0x3159, 0xB000}, + 0xFFCF: {0x315A, 0xB000}, + 0xFFD2: {0x315B, 0xB000}, + 0xFFD3: {0x315C, 0xB000}, + 0xFFD4: {0x315D, 0xB000}, + 0xFFD5: {0x315E, 0xB000}, + 0xFFD6: {0x315F, 0xB000}, + 0xFFD7: {0x3160, 0xB000}, + 0xFFDA: {0x3161, 0xB000}, + 0xFFDB: {0x3162, 0xB000}, + 0xFFDC: {0x3163, 0xB000}, + 0xFFE0: {0xA2, 0x9000}, + 0xFFE1: {0xA3, 0x9000}, + 0xFFE2: {0xAC, 0x9000}, + 0xFFE3: {0xAF, 0x9000}, + 0xFFE4: {0xA6, 0x9000}, + 0xFFE5: {0xA5, 0x9000}, + 0xFFE6: {0x20A9, 0x9000}, + 0xFFE8: {0x2502, 0xB000}, + 0xFFE9: {0x2190, 0xB000}, + 0xFFEA: {0x2191, 0xB000}, + 0xFFEB: {0x2192, 0xB000}, + 0xFFEC: {0x2193, 0xB000}, + 0xFFED: {0x25A0, 0xB000}, + 0xFFEE: {0x25CB, 0xB000}, +} diff --git a/vendor/golang.org/x/text/width/tables.go b/vendor/golang.org/x/text/width/tables.go new file mode 100644 index 0000000000..2cd0782af2 --- /dev/null +++ b/vendor/golang.org/x/text/width/tables.go @@ -0,0 +1,1092 @@ +// This file was generated by go generate; DO NOT EDIT + +package width + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "8.0.0" + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *widthTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return widthValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := widthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := widthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = widthIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := widthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = widthIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = widthIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *widthTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return widthValues[c0] + } + i := widthIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = widthIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = widthIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *widthTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return widthValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := widthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := widthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = widthIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := widthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = widthIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = widthIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *widthTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return widthValues[c0] + } + i := widthIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = widthIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = widthIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// widthTrie. Total size: 10880 bytes (10.62 KiB). Checksum: 7248598b914622aa. +type widthTrie struct{} + +func newWidthTrie(i int) *widthTrie { + return &widthTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *widthTrie) lookupValue(n uint32, b byte) uint16 { + switch { + default: + return uint16(widthValues[n<<6+uint32(b)]) + } +} + +// widthValues: 75 blocks, 4800 entries, 9600 bytes +// The third block is the zero block. +var widthValues = [4800]uint16{ + // Block 0x0, offset 0x0 + 0x20: 0x6001, 0x21: 0x6002, 0x22: 0x6002, 0x23: 0x6002, + 0x24: 0x6002, 0x25: 0x6002, 0x26: 0x6002, 0x27: 0x6002, 0x28: 0x6002, 0x29: 0x6002, + 0x2a: 0x6002, 0x2b: 0x6002, 0x2c: 0x6002, 0x2d: 0x6002, 0x2e: 0x6002, 0x2f: 0x6002, + 0x30: 0x6002, 0x31: 0x6002, 0x32: 0x6002, 0x33: 0x6002, 0x34: 0x6002, 0x35: 0x6002, + 0x36: 0x6002, 0x37: 0x6002, 0x38: 0x6002, 0x39: 0x6002, 0x3a: 0x6002, 0x3b: 0x6002, + 0x3c: 0x6002, 0x3d: 0x6002, 0x3e: 0x6002, 0x3f: 0x6002, + // Block 0x1, offset 0x40 + 0x40: 0x6003, 0x41: 0x6003, 0x42: 0x6003, 0x43: 0x6003, 0x44: 0x6003, 0x45: 0x6003, + 0x46: 0x6003, 0x47: 0x6003, 0x48: 0x6003, 0x49: 0x6003, 0x4a: 0x6003, 0x4b: 0x6003, + 0x4c: 0x6003, 0x4d: 0x6003, 0x4e: 0x6003, 0x4f: 0x6003, 0x50: 0x6003, 0x51: 0x6003, + 0x52: 0x6003, 0x53: 0x6003, 0x54: 0x6003, 0x55: 0x6003, 0x56: 0x6003, 0x57: 0x6003, + 0x58: 0x6003, 0x59: 0x6003, 0x5a: 0x6003, 0x5b: 0x6003, 0x5c: 0x6003, 0x5d: 0x6003, + 0x5e: 0x6003, 0x5f: 0x6003, 0x60: 0x6004, 0x61: 0x6004, 0x62: 0x6004, 0x63: 0x6004, + 0x64: 0x6004, 0x65: 0x6004, 0x66: 0x6004, 0x67: 0x6004, 0x68: 0x6004, 0x69: 0x6004, + 0x6a: 0x6004, 0x6b: 0x6004, 0x6c: 0x6004, 0x6d: 0x6004, 0x6e: 0x6004, 0x6f: 0x6004, + 0x70: 0x6004, 0x71: 0x6004, 0x72: 0x6004, 0x73: 0x6004, 0x74: 0x6004, 0x75: 0x6004, + 0x76: 0x6004, 0x77: 0x6004, 0x78: 0x6004, 0x79: 0x6004, 0x7a: 0x6004, 0x7b: 0x6004, + 0x7c: 0x6004, 0x7d: 0x6004, 0x7e: 0x6004, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xe1: 0x2000, 0xe2: 0x6005, 0xe3: 0x6005, + 0xe4: 0x2000, 0xe5: 0x6006, 0xe6: 0x6005, 0xe7: 0x2000, 0xe8: 0x2000, + 0xea: 0x2000, 0xec: 0x6007, 0xed: 0x2000, 0xee: 0x2000, 0xef: 0x6008, + 0xf0: 0x2000, 0xf1: 0x2000, 0xf2: 0x2000, 0xf3: 0x2000, 0xf4: 0x2000, + 0xf6: 0x2000, 0xf7: 0x2000, 0xf8: 0x2000, 0xf9: 0x2000, 0xfa: 0x2000, + 0xfc: 0x2000, 0xfd: 0x2000, 0xfe: 0x2000, 0xff: 0x2000, + // Block 0x4, offset 0x100 + 0x106: 0x2000, + 0x110: 0x2000, + 0x117: 0x2000, + 0x118: 0x2000, + 0x11e: 0x2000, 0x11f: 0x2000, 0x120: 0x2000, 0x121: 0x2000, + 0x126: 0x2000, 0x128: 0x2000, 0x129: 0x2000, + 0x12a: 0x2000, 0x12c: 0x2000, 0x12d: 0x2000, + 0x130: 0x2000, 0x132: 0x2000, 0x133: 0x2000, + 0x137: 0x2000, 0x138: 0x2000, 0x139: 0x2000, 0x13a: 0x2000, + 0x13c: 0x2000, 0x13e: 0x2000, + // Block 0x5, offset 0x140 + 0x141: 0x2000, + 0x151: 0x2000, + 0x153: 0x2000, + 0x15b: 0x2000, + 0x166: 0x2000, 0x167: 0x2000, + 0x16b: 0x2000, + 0x171: 0x2000, 0x172: 0x2000, 0x173: 0x2000, + 0x178: 0x2000, + 0x17f: 0x2000, + // Block 0x6, offset 0x180 + 0x180: 0x2000, 0x181: 0x2000, 0x182: 0x2000, 0x184: 0x2000, + 0x188: 0x2000, 0x189: 0x2000, 0x18a: 0x2000, 0x18b: 0x2000, + 0x18d: 0x2000, + 0x192: 0x2000, 0x193: 0x2000, + 0x1a6: 0x2000, 0x1a7: 0x2000, + 0x1ab: 0x2000, + // Block 0x7, offset 0x1c0 + 0x1ce: 0x2000, 0x1d0: 0x2000, + 0x1d2: 0x2000, 0x1d4: 0x2000, 0x1d6: 0x2000, + 0x1d8: 0x2000, 0x1da: 0x2000, 0x1dc: 0x2000, + // Block 0x8, offset 0x200 + 0x211: 0x2000, + 0x221: 0x2000, + // Block 0x9, offset 0x240 + 0x244: 0x2000, + 0x247: 0x2000, 0x249: 0x2000, 0x24a: 0x2000, 0x24b: 0x2000, + 0x24d: 0x2000, 0x250: 0x2000, + 0x258: 0x2000, 0x259: 0x2000, 0x25a: 0x2000, 0x25b: 0x2000, 0x25d: 0x2000, + 0x25f: 0x2000, + // Block 0xa, offset 0x280 + 0x280: 0x2000, 0x281: 0x2000, 0x282: 0x2000, 0x283: 0x2000, 0x284: 0x2000, 0x285: 0x2000, + 0x286: 0x2000, 0x287: 0x2000, 0x288: 0x2000, 0x289: 0x2000, 0x28a: 0x2000, 0x28b: 0x2000, + 0x28c: 0x2000, 0x28d: 0x2000, 0x28e: 0x2000, 0x28f: 0x2000, 0x290: 0x2000, 0x291: 0x2000, + 0x292: 0x2000, 0x293: 0x2000, 0x294: 0x2000, 0x295: 0x2000, 0x296: 0x2000, 0x297: 0x2000, + 0x298: 0x2000, 0x299: 0x2000, 0x29a: 0x2000, 0x29b: 0x2000, 0x29c: 0x2000, 0x29d: 0x2000, + 0x29e: 0x2000, 0x29f: 0x2000, 0x2a0: 0x2000, 0x2a1: 0x2000, 0x2a2: 0x2000, 0x2a3: 0x2000, + 0x2a4: 0x2000, 0x2a5: 0x2000, 0x2a6: 0x2000, 0x2a7: 0x2000, 0x2a8: 0x2000, 0x2a9: 0x2000, + 0x2aa: 0x2000, 0x2ab: 0x2000, 0x2ac: 0x2000, 0x2ad: 0x2000, 0x2ae: 0x2000, 0x2af: 0x2000, + 0x2b0: 0x2000, 0x2b1: 0x2000, 0x2b2: 0x2000, 0x2b3: 0x2000, 0x2b4: 0x2000, 0x2b5: 0x2000, + 0x2b6: 0x2000, 0x2b7: 0x2000, 0x2b8: 0x2000, 0x2b9: 0x2000, 0x2ba: 0x2000, 0x2bb: 0x2000, + 0x2bc: 0x2000, 0x2bd: 0x2000, 0x2be: 0x2000, 0x2bf: 0x2000, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x2000, 0x2c1: 0x2000, 0x2c2: 0x2000, 0x2c3: 0x2000, 0x2c4: 0x2000, 0x2c5: 0x2000, + 0x2c6: 0x2000, 0x2c7: 0x2000, 0x2c8: 0x2000, 0x2c9: 0x2000, 0x2ca: 0x2000, 0x2cb: 0x2000, + 0x2cc: 0x2000, 0x2cd: 0x2000, 0x2ce: 0x2000, 0x2cf: 0x2000, 0x2d0: 0x2000, 0x2d1: 0x2000, + 0x2d2: 0x2000, 0x2d3: 0x2000, 0x2d4: 0x2000, 0x2d5: 0x2000, 0x2d6: 0x2000, 0x2d7: 0x2000, + 0x2d8: 0x2000, 0x2d9: 0x2000, 0x2da: 0x2000, 0x2db: 0x2000, 0x2dc: 0x2000, 0x2dd: 0x2000, + 0x2de: 0x2000, 0x2df: 0x2000, 0x2e0: 0x2000, 0x2e1: 0x2000, 0x2e2: 0x2000, 0x2e3: 0x2000, + 0x2e4: 0x2000, 0x2e5: 0x2000, 0x2e6: 0x2000, 0x2e7: 0x2000, 0x2e8: 0x2000, 0x2e9: 0x2000, + 0x2ea: 0x2000, 0x2eb: 0x2000, 0x2ec: 0x2000, 0x2ed: 0x2000, 0x2ee: 0x2000, 0x2ef: 0x2000, + // Block 0xc, offset 0x300 + 0x311: 0x2000, + 0x312: 0x2000, 0x313: 0x2000, 0x314: 0x2000, 0x315: 0x2000, 0x316: 0x2000, 0x317: 0x2000, + 0x318: 0x2000, 0x319: 0x2000, 0x31a: 0x2000, 0x31b: 0x2000, 0x31c: 0x2000, 0x31d: 0x2000, + 0x31e: 0x2000, 0x31f: 0x2000, 0x320: 0x2000, 0x321: 0x2000, 0x323: 0x2000, + 0x324: 0x2000, 0x325: 0x2000, 0x326: 0x2000, 0x327: 0x2000, 0x328: 0x2000, 0x329: 0x2000, + 0x331: 0x2000, 0x332: 0x2000, 0x333: 0x2000, 0x334: 0x2000, 0x335: 0x2000, + 0x336: 0x2000, 0x337: 0x2000, 0x338: 0x2000, 0x339: 0x2000, 0x33a: 0x2000, 0x33b: 0x2000, + 0x33c: 0x2000, 0x33d: 0x2000, 0x33e: 0x2000, 0x33f: 0x2000, + // Block 0xd, offset 0x340 + 0x340: 0x2000, 0x341: 0x2000, 0x343: 0x2000, 0x344: 0x2000, 0x345: 0x2000, + 0x346: 0x2000, 0x347: 0x2000, 0x348: 0x2000, 0x349: 0x2000, + // Block 0xe, offset 0x380 + 0x381: 0x2000, + 0x390: 0x2000, 0x391: 0x2000, + 0x392: 0x2000, 0x393: 0x2000, 0x394: 0x2000, 0x395: 0x2000, 0x396: 0x2000, 0x397: 0x2000, + 0x398: 0x2000, 0x399: 0x2000, 0x39a: 0x2000, 0x39b: 0x2000, 0x39c: 0x2000, 0x39d: 0x2000, + 0x39e: 0x2000, 0x39f: 0x2000, 0x3a0: 0x2000, 0x3a1: 0x2000, 0x3a2: 0x2000, 0x3a3: 0x2000, + 0x3a4: 0x2000, 0x3a5: 0x2000, 0x3a6: 0x2000, 0x3a7: 0x2000, 0x3a8: 0x2000, 0x3a9: 0x2000, + 0x3aa: 0x2000, 0x3ab: 0x2000, 0x3ac: 0x2000, 0x3ad: 0x2000, 0x3ae: 0x2000, 0x3af: 0x2000, + 0x3b0: 0x2000, 0x3b1: 0x2000, 0x3b2: 0x2000, 0x3b3: 0x2000, 0x3b4: 0x2000, 0x3b5: 0x2000, + 0x3b6: 0x2000, 0x3b7: 0x2000, 0x3b8: 0x2000, 0x3b9: 0x2000, 0x3ba: 0x2000, 0x3bb: 0x2000, + 0x3bc: 0x2000, 0x3bd: 0x2000, 0x3be: 0x2000, 0x3bf: 0x2000, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x2000, 0x3c1: 0x2000, 0x3c2: 0x2000, 0x3c3: 0x2000, 0x3c4: 0x2000, 0x3c5: 0x2000, + 0x3c6: 0x2000, 0x3c7: 0x2000, 0x3c8: 0x2000, 0x3c9: 0x2000, 0x3ca: 0x2000, 0x3cb: 0x2000, + 0x3cc: 0x2000, 0x3cd: 0x2000, 0x3ce: 0x2000, 0x3cf: 0x2000, 0x3d1: 0x2000, + // Block 0x10, offset 0x400 + 0x400: 0x4000, 0x401: 0x4000, 0x402: 0x4000, 0x403: 0x4000, 0x404: 0x4000, 0x405: 0x4000, + 0x406: 0x4000, 0x407: 0x4000, 0x408: 0x4000, 0x409: 0x4000, 0x40a: 0x4000, 0x40b: 0x4000, + 0x40c: 0x4000, 0x40d: 0x4000, 0x40e: 0x4000, 0x40f: 0x4000, 0x410: 0x4000, 0x411: 0x4000, + 0x412: 0x4000, 0x413: 0x4000, 0x414: 0x4000, 0x415: 0x4000, 0x416: 0x4000, 0x417: 0x4000, + 0x418: 0x4000, 0x419: 0x4000, 0x41a: 0x4000, 0x41b: 0x4000, 0x41c: 0x4000, 0x41d: 0x4000, + 0x41e: 0x4000, 0x41f: 0x4000, 0x420: 0x4000, 0x421: 0x4000, 0x422: 0x4000, 0x423: 0x4000, + 0x424: 0x4000, 0x425: 0x4000, 0x426: 0x4000, 0x427: 0x4000, 0x428: 0x4000, 0x429: 0x4000, + 0x42a: 0x4000, 0x42b: 0x4000, 0x42c: 0x4000, 0x42d: 0x4000, 0x42e: 0x4000, 0x42f: 0x4000, + 0x430: 0x4000, 0x431: 0x4000, 0x432: 0x4000, 0x433: 0x4000, 0x434: 0x4000, 0x435: 0x4000, + 0x436: 0x4000, 0x437: 0x4000, 0x438: 0x4000, 0x439: 0x4000, 0x43a: 0x4000, 0x43b: 0x4000, + 0x43c: 0x4000, 0x43d: 0x4000, 0x43e: 0x4000, 0x43f: 0x4000, + // Block 0x11, offset 0x440 + 0x440: 0x4000, 0x441: 0x4000, 0x442: 0x4000, 0x443: 0x4000, 0x444: 0x4000, 0x445: 0x4000, + 0x446: 0x4000, 0x447: 0x4000, 0x448: 0x4000, 0x449: 0x4000, 0x44a: 0x4000, 0x44b: 0x4000, + 0x44c: 0x4000, 0x44d: 0x4000, 0x44e: 0x4000, 0x44f: 0x4000, 0x450: 0x4000, 0x451: 0x4000, + 0x452: 0x4000, 0x453: 0x4000, 0x454: 0x4000, 0x455: 0x4000, 0x456: 0x4000, 0x457: 0x4000, + 0x458: 0x4000, 0x459: 0x4000, 0x45a: 0x4000, 0x45b: 0x4000, 0x45c: 0x4000, 0x45d: 0x4000, + 0x45e: 0x4000, 0x45f: 0x4000, + // Block 0x12, offset 0x480 + 0x490: 0x2000, + 0x493: 0x2000, 0x494: 0x2000, 0x495: 0x2000, 0x496: 0x2000, + 0x498: 0x2000, 0x499: 0x2000, 0x49c: 0x2000, 0x49d: 0x2000, + 0x4a0: 0x2000, 0x4a1: 0x2000, 0x4a2: 0x2000, + 0x4a4: 0x2000, 0x4a5: 0x2000, 0x4a6: 0x2000, 0x4a7: 0x2000, + 0x4b0: 0x2000, 0x4b2: 0x2000, 0x4b3: 0x2000, 0x4b5: 0x2000, + 0x4bb: 0x2000, + 0x4be: 0x2000, + // Block 0x13, offset 0x4c0 + 0x4f4: 0x2000, + 0x4ff: 0x2000, + // Block 0x14, offset 0x500 + 0x501: 0x2000, 0x502: 0x2000, 0x503: 0x2000, 0x504: 0x2000, + 0x529: 0xa009, + 0x52c: 0x2000, + // Block 0x15, offset 0x540 + 0x543: 0x2000, 0x545: 0x2000, + 0x549: 0x2000, + 0x553: 0x2000, 0x556: 0x2000, + 0x561: 0x2000, 0x562: 0x2000, + 0x566: 0x2000, + 0x56b: 0x2000, + // Block 0x16, offset 0x580 + 0x593: 0x2000, 0x594: 0x2000, + 0x59b: 0x2000, 0x59c: 0x2000, 0x59d: 0x2000, + 0x59e: 0x2000, 0x5a0: 0x2000, 0x5a1: 0x2000, 0x5a2: 0x2000, 0x5a3: 0x2000, + 0x5a4: 0x2000, 0x5a5: 0x2000, 0x5a6: 0x2000, 0x5a7: 0x2000, 0x5a8: 0x2000, 0x5a9: 0x2000, + 0x5aa: 0x2000, 0x5ab: 0x2000, + 0x5b0: 0x2000, 0x5b1: 0x2000, 0x5b2: 0x2000, 0x5b3: 0x2000, 0x5b4: 0x2000, 0x5b5: 0x2000, + 0x5b6: 0x2000, 0x5b7: 0x2000, 0x5b8: 0x2000, 0x5b9: 0x2000, + // Block 0x17, offset 0x5c0 + 0x5c9: 0x2000, + 0x5d0: 0x200a, 0x5d1: 0x200b, + 0x5d2: 0x200a, 0x5d3: 0x200c, 0x5d4: 0x2000, 0x5d5: 0x2000, 0x5d6: 0x2000, 0x5d7: 0x2000, + 0x5d8: 0x2000, 0x5d9: 0x2000, + 0x5f8: 0x2000, 0x5f9: 0x2000, + // Block 0x18, offset 0x600 + 0x612: 0x2000, 0x614: 0x2000, + 0x627: 0x2000, + // Block 0x19, offset 0x640 + 0x640: 0x2000, 0x642: 0x2000, 0x643: 0x2000, + 0x647: 0x2000, 0x648: 0x2000, 0x64b: 0x2000, + 0x64f: 0x2000, 0x651: 0x2000, + 0x655: 0x2000, + 0x65a: 0x2000, 0x65d: 0x2000, + 0x65e: 0x2000, 0x65f: 0x2000, 0x660: 0x2000, 0x663: 0x2000, + 0x665: 0x2000, 0x667: 0x2000, 0x668: 0x2000, 0x669: 0x2000, + 0x66a: 0x2000, 0x66b: 0x2000, 0x66c: 0x2000, 0x66e: 0x2000, + 0x674: 0x2000, 0x675: 0x2000, + 0x676: 0x2000, 0x677: 0x2000, + 0x67c: 0x2000, 0x67d: 0x2000, + // Block 0x1a, offset 0x680 + 0x688: 0x2000, + 0x68c: 0x2000, + 0x692: 0x2000, + 0x6a0: 0x2000, 0x6a1: 0x2000, + 0x6a4: 0x2000, 0x6a5: 0x2000, 0x6a6: 0x2000, 0x6a7: 0x2000, + 0x6aa: 0x2000, 0x6ab: 0x2000, 0x6ae: 0x2000, 0x6af: 0x2000, + // Block 0x1b, offset 0x6c0 + 0x6c2: 0x2000, 0x6c3: 0x2000, + 0x6c6: 0x2000, 0x6c7: 0x2000, + 0x6d5: 0x2000, + 0x6d9: 0x2000, + 0x6e5: 0x2000, + 0x6ff: 0x2000, + // Block 0x1c, offset 0x700 + 0x712: 0x2000, + 0x729: 0x4000, + 0x72a: 0x4000, + // Block 0x1d, offset 0x740 + 0x760: 0x2000, 0x761: 0x2000, 0x762: 0x2000, 0x763: 0x2000, + 0x764: 0x2000, 0x765: 0x2000, 0x766: 0x2000, 0x767: 0x2000, 0x768: 0x2000, 0x769: 0x2000, + 0x76a: 0x2000, 0x76b: 0x2000, 0x76c: 0x2000, 0x76d: 0x2000, 0x76e: 0x2000, 0x76f: 0x2000, + 0x770: 0x2000, 0x771: 0x2000, 0x772: 0x2000, 0x773: 0x2000, 0x774: 0x2000, 0x775: 0x2000, + 0x776: 0x2000, 0x777: 0x2000, 0x778: 0x2000, 0x779: 0x2000, 0x77a: 0x2000, 0x77b: 0x2000, + 0x77c: 0x2000, 0x77d: 0x2000, 0x77e: 0x2000, 0x77f: 0x2000, + // Block 0x1e, offset 0x780 + 0x780: 0x2000, 0x781: 0x2000, 0x782: 0x2000, 0x783: 0x2000, 0x784: 0x2000, 0x785: 0x2000, + 0x786: 0x2000, 0x787: 0x2000, 0x788: 0x2000, 0x789: 0x2000, 0x78a: 0x2000, 0x78b: 0x2000, + 0x78c: 0x2000, 0x78d: 0x2000, 0x78e: 0x2000, 0x78f: 0x2000, 0x790: 0x2000, 0x791: 0x2000, + 0x792: 0x2000, 0x793: 0x2000, 0x794: 0x2000, 0x795: 0x2000, 0x796: 0x2000, 0x797: 0x2000, + 0x798: 0x2000, 0x799: 0x2000, 0x79a: 0x2000, 0x79b: 0x2000, 0x79c: 0x2000, 0x79d: 0x2000, + 0x79e: 0x2000, 0x79f: 0x2000, 0x7a0: 0x2000, 0x7a1: 0x2000, 0x7a2: 0x2000, 0x7a3: 0x2000, + 0x7a4: 0x2000, 0x7a5: 0x2000, 0x7a6: 0x2000, 0x7a7: 0x2000, 0x7a8: 0x2000, 0x7a9: 0x2000, + 0x7ab: 0x2000, 0x7ac: 0x2000, 0x7ad: 0x2000, 0x7ae: 0x2000, 0x7af: 0x2000, + 0x7b0: 0x2000, 0x7b1: 0x2000, 0x7b2: 0x2000, 0x7b3: 0x2000, 0x7b4: 0x2000, 0x7b5: 0x2000, + 0x7b6: 0x2000, 0x7b7: 0x2000, 0x7b8: 0x2000, 0x7b9: 0x2000, 0x7ba: 0x2000, 0x7bb: 0x2000, + 0x7bc: 0x2000, 0x7bd: 0x2000, 0x7be: 0x2000, 0x7bf: 0x2000, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x2000, 0x7c1: 0x2000, 0x7c2: 0x200d, 0x7c3: 0x2000, 0x7c4: 0x2000, 0x7c5: 0x2000, + 0x7c6: 0x2000, 0x7c7: 0x2000, 0x7c8: 0x2000, 0x7c9: 0x2000, 0x7ca: 0x2000, 0x7cb: 0x2000, + 0x7cc: 0x2000, 0x7cd: 0x2000, 0x7ce: 0x2000, 0x7cf: 0x2000, 0x7d0: 0x2000, 0x7d1: 0x2000, + 0x7d2: 0x2000, 0x7d3: 0x2000, 0x7d4: 0x2000, 0x7d5: 0x2000, 0x7d6: 0x2000, 0x7d7: 0x2000, + 0x7d8: 0x2000, 0x7d9: 0x2000, 0x7da: 0x2000, 0x7db: 0x2000, 0x7dc: 0x2000, 0x7dd: 0x2000, + 0x7de: 0x2000, 0x7df: 0x2000, 0x7e0: 0x2000, 0x7e1: 0x2000, 0x7e2: 0x2000, 0x7e3: 0x2000, + 0x7e4: 0x2000, 0x7e5: 0x2000, 0x7e6: 0x2000, 0x7e7: 0x2000, 0x7e8: 0x2000, 0x7e9: 0x2000, + 0x7ea: 0x2000, 0x7eb: 0x2000, 0x7ec: 0x2000, 0x7ed: 0x2000, 0x7ee: 0x2000, 0x7ef: 0x2000, + 0x7f0: 0x2000, 0x7f1: 0x2000, 0x7f2: 0x2000, 0x7f3: 0x2000, 0x7f4: 0x2000, 0x7f5: 0x2000, + 0x7f6: 0x2000, 0x7f7: 0x2000, 0x7f8: 0x2000, 0x7f9: 0x2000, 0x7fa: 0x2000, 0x7fb: 0x2000, + 0x7fc: 0x2000, 0x7fd: 0x2000, 0x7fe: 0x2000, 0x7ff: 0x2000, + // Block 0x20, offset 0x800 + 0x800: 0x2000, 0x801: 0x2000, 0x802: 0x2000, 0x803: 0x2000, 0x804: 0x2000, 0x805: 0x2000, + 0x806: 0x2000, 0x807: 0x2000, 0x808: 0x2000, 0x809: 0x2000, 0x80a: 0x2000, 0x80b: 0x2000, + 0x810: 0x2000, 0x811: 0x2000, + 0x812: 0x2000, 0x813: 0x2000, 0x814: 0x2000, 0x815: 0x2000, 0x816: 0x2000, 0x817: 0x2000, + 0x818: 0x2000, 0x819: 0x2000, 0x81a: 0x2000, 0x81b: 0x2000, 0x81c: 0x2000, 0x81d: 0x2000, + 0x81e: 0x2000, 0x81f: 0x2000, 0x820: 0x2000, 0x821: 0x2000, 0x822: 0x2000, 0x823: 0x2000, + 0x824: 0x2000, 0x825: 0x2000, 0x826: 0x2000, 0x827: 0x2000, 0x828: 0x2000, 0x829: 0x2000, + 0x82a: 0x2000, 0x82b: 0x2000, 0x82c: 0x2000, 0x82d: 0x2000, 0x82e: 0x2000, 0x82f: 0x2000, + 0x830: 0x2000, 0x831: 0x2000, 0x832: 0x2000, 0x833: 0x2000, + // Block 0x21, offset 0x840 + 0x840: 0x2000, 0x841: 0x2000, 0x842: 0x2000, 0x843: 0x2000, 0x844: 0x2000, 0x845: 0x2000, + 0x846: 0x2000, 0x847: 0x2000, 0x848: 0x2000, 0x849: 0x2000, 0x84a: 0x2000, 0x84b: 0x2000, + 0x84c: 0x2000, 0x84d: 0x2000, 0x84e: 0x2000, 0x84f: 0x2000, + 0x852: 0x2000, 0x853: 0x2000, 0x854: 0x2000, 0x855: 0x2000, + 0x860: 0x200e, 0x861: 0x2000, 0x863: 0x2000, + 0x864: 0x2000, 0x865: 0x2000, 0x866: 0x2000, 0x867: 0x2000, 0x868: 0x2000, 0x869: 0x2000, + 0x872: 0x2000, 0x873: 0x2000, + 0x876: 0x2000, 0x877: 0x2000, + 0x87c: 0x2000, 0x87d: 0x2000, + // Block 0x22, offset 0x880 + 0x880: 0x2000, 0x881: 0x2000, + 0x886: 0x2000, 0x887: 0x2000, 0x888: 0x2000, 0x88b: 0x200f, + 0x88e: 0x2000, 0x88f: 0x2000, 0x890: 0x2000, 0x891: 0x2000, + 0x8a2: 0x2000, 0x8a3: 0x2000, + 0x8a4: 0x2000, 0x8a5: 0x2000, + 0x8af: 0x2000, + // Block 0x23, offset 0x8c0 + 0x8c5: 0x2000, + 0x8c6: 0x2000, 0x8c9: 0x2000, + 0x8ce: 0x2000, 0x8cf: 0x2000, + 0x8d4: 0x2000, 0x8d5: 0x2000, + 0x8dc: 0x2000, + 0x8de: 0x2000, + // Block 0x24, offset 0x900 + 0x900: 0x2000, 0x902: 0x2000, + 0x920: 0x2000, 0x921: 0x2000, 0x923: 0x2000, + 0x924: 0x2000, 0x925: 0x2000, 0x927: 0x2000, 0x928: 0x2000, 0x929: 0x2000, + 0x92a: 0x2000, 0x92c: 0x2000, 0x92d: 0x2000, 0x92f: 0x2000, + // Block 0x25, offset 0x940 + 0x95e: 0x2000, 0x95f: 0x2000, + 0x97e: 0x2000, 0x97f: 0x2000, + // Block 0x26, offset 0x980 + 0x984: 0x2000, 0x985: 0x2000, + 0x986: 0x2000, 0x987: 0x2000, 0x988: 0x2000, 0x989: 0x2000, 0x98a: 0x2000, 0x98b: 0x2000, + 0x98c: 0x2000, 0x98d: 0x2000, 0x98f: 0x2000, 0x990: 0x2000, 0x991: 0x2000, + 0x992: 0x2000, 0x993: 0x2000, 0x994: 0x2000, 0x995: 0x2000, 0x996: 0x2000, 0x997: 0x2000, + 0x998: 0x2000, 0x999: 0x2000, 0x99a: 0x2000, 0x99b: 0x2000, 0x99c: 0x2000, 0x99d: 0x2000, + 0x99e: 0x2000, 0x99f: 0x2000, 0x9a0: 0x2000, 0x9a1: 0x2000, 0x9a3: 0x2000, + 0x9a8: 0x2000, 0x9a9: 0x2000, + 0x9aa: 0x2000, 0x9ab: 0x2000, 0x9ac: 0x2000, 0x9ad: 0x2000, 0x9ae: 0x2000, 0x9af: 0x2000, + 0x9b0: 0x2000, 0x9b1: 0x2000, 0x9b2: 0x2000, 0x9b3: 0x2000, 0x9b4: 0x2000, 0x9b5: 0x2000, + 0x9b6: 0x2000, 0x9b7: 0x2000, 0x9b8: 0x2000, 0x9b9: 0x2000, 0x9ba: 0x2000, 0x9bb: 0x2000, + 0x9bc: 0x2000, 0x9bd: 0x2000, 0x9be: 0x2000, 0x9bf: 0x2000, + // Block 0x27, offset 0x9c0 + 0x9fd: 0x2000, + // Block 0x28, offset 0xa00 + 0xa17: 0x2000, + 0xa36: 0x2000, 0xa37: 0x2000, 0xa38: 0x2000, 0xa39: 0x2000, 0xa3a: 0x2000, 0xa3b: 0x2000, + 0xa3c: 0x2000, 0xa3d: 0x2000, 0xa3e: 0x2000, 0xa3f: 0x2000, + // Block 0x29, offset 0xa40 + 0xa66: 0x6000, 0xa67: 0x6000, 0xa68: 0x6000, 0xa69: 0x6000, + 0xa6a: 0x6000, 0xa6b: 0x6000, 0xa6c: 0x6000, 0xa6d: 0x6000, + // Block 0x2a, offset 0xa80 + 0xa85: 0x6010, + 0xa86: 0x6011, + // Block 0x2b, offset 0xac0 + 0xad5: 0x2000, 0xad6: 0x2000, 0xad7: 0x2000, + 0xad8: 0x2000, 0xad9: 0x2000, + // Block 0x2c, offset 0xb00 + 0xb00: 0x4000, 0xb01: 0x4000, 0xb02: 0x4000, 0xb03: 0x4000, 0xb04: 0x4000, 0xb05: 0x4000, + 0xb06: 0x4000, 0xb07: 0x4000, 0xb08: 0x4000, 0xb09: 0x4000, 0xb0a: 0x4000, 0xb0b: 0x4000, + 0xb0c: 0x4000, 0xb0d: 0x4000, 0xb0e: 0x4000, 0xb0f: 0x4000, 0xb10: 0x4000, 0xb11: 0x4000, + 0xb12: 0x4000, 0xb13: 0x4000, 0xb14: 0x4000, 0xb15: 0x4000, 0xb16: 0x4000, 0xb17: 0x4000, + 0xb18: 0x4000, 0xb19: 0x4000, 0xb1b: 0x4000, 0xb1c: 0x4000, 0xb1d: 0x4000, + 0xb1e: 0x4000, 0xb1f: 0x4000, 0xb20: 0x4000, 0xb21: 0x4000, 0xb22: 0x4000, 0xb23: 0x4000, + 0xb24: 0x4000, 0xb25: 0x4000, 0xb26: 0x4000, 0xb27: 0x4000, 0xb28: 0x4000, 0xb29: 0x4000, + 0xb2a: 0x4000, 0xb2b: 0x4000, 0xb2c: 0x4000, 0xb2d: 0x4000, 0xb2e: 0x4000, 0xb2f: 0x4000, + 0xb30: 0x4000, 0xb31: 0x4000, 0xb32: 0x4000, 0xb33: 0x4000, 0xb34: 0x4000, 0xb35: 0x4000, + 0xb36: 0x4000, 0xb37: 0x4000, 0xb38: 0x4000, 0xb39: 0x4000, 0xb3a: 0x4000, 0xb3b: 0x4000, + 0xb3c: 0x4000, 0xb3d: 0x4000, 0xb3e: 0x4000, 0xb3f: 0x4000, + // Block 0x2d, offset 0xb40 + 0xb40: 0x4000, 0xb41: 0x4000, 0xb42: 0x4000, 0xb43: 0x4000, 0xb44: 0x4000, 0xb45: 0x4000, + 0xb46: 0x4000, 0xb47: 0x4000, 0xb48: 0x4000, 0xb49: 0x4000, 0xb4a: 0x4000, 0xb4b: 0x4000, + 0xb4c: 0x4000, 0xb4d: 0x4000, 0xb4e: 0x4000, 0xb4f: 0x4000, 0xb50: 0x4000, 0xb51: 0x4000, + 0xb52: 0x4000, 0xb53: 0x4000, 0xb54: 0x4000, 0xb55: 0x4000, 0xb56: 0x4000, 0xb57: 0x4000, + 0xb58: 0x4000, 0xb59: 0x4000, 0xb5a: 0x4000, 0xb5b: 0x4000, 0xb5c: 0x4000, 0xb5d: 0x4000, + 0xb5e: 0x4000, 0xb5f: 0x4000, 0xb60: 0x4000, 0xb61: 0x4000, 0xb62: 0x4000, 0xb63: 0x4000, + 0xb64: 0x4000, 0xb65: 0x4000, 0xb66: 0x4000, 0xb67: 0x4000, 0xb68: 0x4000, 0xb69: 0x4000, + 0xb6a: 0x4000, 0xb6b: 0x4000, 0xb6c: 0x4000, 0xb6d: 0x4000, 0xb6e: 0x4000, 0xb6f: 0x4000, + 0xb70: 0x4000, 0xb71: 0x4000, 0xb72: 0x4000, 0xb73: 0x4000, + // Block 0x2e, offset 0xb80 + 0xb80: 0x4000, 0xb81: 0x4000, 0xb82: 0x4000, 0xb83: 0x4000, 0xb84: 0x4000, 0xb85: 0x4000, + 0xb86: 0x4000, 0xb87: 0x4000, 0xb88: 0x4000, 0xb89: 0x4000, 0xb8a: 0x4000, 0xb8b: 0x4000, + 0xb8c: 0x4000, 0xb8d: 0x4000, 0xb8e: 0x4000, 0xb8f: 0x4000, 0xb90: 0x4000, 0xb91: 0x4000, + 0xb92: 0x4000, 0xb93: 0x4000, 0xb94: 0x4000, 0xb95: 0x4000, + 0xbb0: 0x4000, 0xbb1: 0x4000, 0xbb2: 0x4000, 0xbb3: 0x4000, 0xbb4: 0x4000, 0xbb5: 0x4000, + 0xbb6: 0x4000, 0xbb7: 0x4000, 0xbb8: 0x4000, 0xbb9: 0x4000, 0xbba: 0x4000, 0xbbb: 0x4000, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x9012, 0xbc1: 0x4013, 0xbc2: 0x4014, 0xbc3: 0x4000, 0xbc4: 0x4000, 0xbc5: 0x4000, + 0xbc6: 0x4000, 0xbc7: 0x4000, 0xbc8: 0x4000, 0xbc9: 0x4000, 0xbca: 0x4000, 0xbcb: 0x4000, + 0xbcc: 0x4015, 0xbcd: 0x4015, 0xbce: 0x4000, 0xbcf: 0x4000, 0xbd0: 0x4000, 0xbd1: 0x4000, + 0xbd2: 0x4000, 0xbd3: 0x4000, 0xbd4: 0x4000, 0xbd5: 0x4000, 0xbd6: 0x4000, 0xbd7: 0x4000, + 0xbd8: 0x4000, 0xbd9: 0x4000, 0xbda: 0x4000, 0xbdb: 0x4000, 0xbdc: 0x4000, 0xbdd: 0x4000, + 0xbde: 0x4000, 0xbdf: 0x4000, 0xbe0: 0x4000, 0xbe1: 0x4000, 0xbe2: 0x4000, 0xbe3: 0x4000, + 0xbe4: 0x4000, 0xbe5: 0x4000, 0xbe6: 0x4000, 0xbe7: 0x4000, 0xbe8: 0x4000, 0xbe9: 0x4000, + 0xbea: 0x4000, 0xbeb: 0x4000, 0xbec: 0x4000, 0xbed: 0x4000, 0xbee: 0x4000, 0xbef: 0x4000, + 0xbf0: 0x4000, 0xbf1: 0x4000, 0xbf2: 0x4000, 0xbf3: 0x4000, 0xbf4: 0x4000, 0xbf5: 0x4000, + 0xbf6: 0x4000, 0xbf7: 0x4000, 0xbf8: 0x4000, 0xbf9: 0x4000, 0xbfa: 0x4000, 0xbfb: 0x4000, + 0xbfc: 0x4000, 0xbfd: 0x4000, 0xbfe: 0x4000, + // Block 0x30, offset 0xc00 + 0xc01: 0x4000, 0xc02: 0x4000, 0xc03: 0x4000, 0xc04: 0x4000, 0xc05: 0x4000, + 0xc06: 0x4000, 0xc07: 0x4000, 0xc08: 0x4000, 0xc09: 0x4000, 0xc0a: 0x4000, 0xc0b: 0x4000, + 0xc0c: 0x4000, 0xc0d: 0x4000, 0xc0e: 0x4000, 0xc0f: 0x4000, 0xc10: 0x4000, 0xc11: 0x4000, + 0xc12: 0x4000, 0xc13: 0x4000, 0xc14: 0x4000, 0xc15: 0x4000, 0xc16: 0x4000, 0xc17: 0x4000, + 0xc18: 0x4000, 0xc19: 0x4000, 0xc1a: 0x4000, 0xc1b: 0x4000, 0xc1c: 0x4000, 0xc1d: 0x4000, + 0xc1e: 0x4000, 0xc1f: 0x4000, 0xc20: 0x4000, 0xc21: 0x4000, 0xc22: 0x4000, 0xc23: 0x4000, + 0xc24: 0x4000, 0xc25: 0x4000, 0xc26: 0x4000, 0xc27: 0x4000, 0xc28: 0x4000, 0xc29: 0x4000, + 0xc2a: 0x4000, 0xc2b: 0x4000, 0xc2c: 0x4000, 0xc2d: 0x4000, 0xc2e: 0x4000, 0xc2f: 0x4000, + 0xc30: 0x4000, 0xc31: 0x4000, 0xc32: 0x4000, 0xc33: 0x4000, 0xc34: 0x4000, 0xc35: 0x4000, + 0xc36: 0x4000, 0xc37: 0x4000, 0xc38: 0x4000, 0xc39: 0x4000, 0xc3a: 0x4000, 0xc3b: 0x4000, + 0xc3c: 0x4000, 0xc3d: 0x4000, 0xc3e: 0x4000, 0xc3f: 0x4000, + // Block 0x31, offset 0xc40 + 0xc40: 0x4000, 0xc41: 0x4000, 0xc42: 0x4000, 0xc43: 0x4000, 0xc44: 0x4000, 0xc45: 0x4000, + 0xc46: 0x4000, 0xc47: 0x4000, 0xc48: 0x4000, 0xc49: 0x4000, 0xc4a: 0x4000, 0xc4b: 0x4000, + 0xc4c: 0x4000, 0xc4d: 0x4000, 0xc4e: 0x4000, 0xc4f: 0x4000, 0xc50: 0x4000, 0xc51: 0x4000, + 0xc52: 0x4000, 0xc53: 0x4000, 0xc54: 0x4000, 0xc55: 0x4000, 0xc56: 0x4000, + 0xc59: 0x4016, 0xc5a: 0x4017, 0xc5b: 0x4000, 0xc5c: 0x4000, 0xc5d: 0x4000, + 0xc5e: 0x4000, 0xc5f: 0x4000, 0xc60: 0x4000, 0xc61: 0x4018, 0xc62: 0x4019, 0xc63: 0x401a, + 0xc64: 0x401b, 0xc65: 0x401c, 0xc66: 0x401d, 0xc67: 0x401e, 0xc68: 0x401f, 0xc69: 0x4020, + 0xc6a: 0x4021, 0xc6b: 0x4022, 0xc6c: 0x4000, 0xc6d: 0x4010, 0xc6e: 0x4000, 0xc6f: 0x4023, + 0xc70: 0x4000, 0xc71: 0x4024, 0xc72: 0x4000, 0xc73: 0x4025, 0xc74: 0x4000, 0xc75: 0x4026, + 0xc76: 0x4000, 0xc77: 0x401a, 0xc78: 0x4000, 0xc79: 0x4027, 0xc7a: 0x4000, 0xc7b: 0x4028, + 0xc7c: 0x4000, 0xc7d: 0x4020, 0xc7e: 0x4000, 0xc7f: 0x4029, + // Block 0x32, offset 0xc80 + 0xc80: 0x4000, 0xc81: 0x402a, 0xc82: 0x4000, 0xc83: 0x402b, 0xc84: 0x402c, 0xc85: 0x4000, + 0xc86: 0x4017, 0xc87: 0x4000, 0xc88: 0x402d, 0xc89: 0x4000, 0xc8a: 0x402e, 0xc8b: 0x402f, + 0xc8c: 0x4030, 0xc8d: 0x4017, 0xc8e: 0x4016, 0xc8f: 0x4017, 0xc90: 0x4000, 0xc91: 0x4000, + 0xc92: 0x4031, 0xc93: 0x4000, 0xc94: 0x4000, 0xc95: 0x4031, 0xc96: 0x4000, 0xc97: 0x4000, + 0xc98: 0x4032, 0xc99: 0x4000, 0xc9a: 0x4000, 0xc9b: 0x4032, 0xc9c: 0x4000, 0xc9d: 0x4000, + 0xc9e: 0x4033, 0xc9f: 0x402e, 0xca0: 0x4034, 0xca1: 0x4035, 0xca2: 0x4034, 0xca3: 0x4036, + 0xca4: 0x4037, 0xca5: 0x4024, 0xca6: 0x4035, 0xca7: 0x4025, 0xca8: 0x4038, 0xca9: 0x4038, + 0xcaa: 0x4039, 0xcab: 0x4039, 0xcac: 0x403a, 0xcad: 0x403a, 0xcae: 0x4000, 0xcaf: 0x4035, + 0xcb0: 0x4000, 0xcb1: 0x4000, 0xcb2: 0x403b, 0xcb3: 0x403c, 0xcb4: 0x4000, 0xcb5: 0x4000, + 0xcb6: 0x4000, 0xcb7: 0x4000, 0xcb8: 0x4000, 0xcb9: 0x4000, 0xcba: 0x4000, 0xcbb: 0x403d, + 0xcbc: 0x401c, 0xcbd: 0x4000, 0xcbe: 0x4000, 0xcbf: 0x4000, + // Block 0x33, offset 0xcc0 + 0xcc5: 0x4000, + 0xcc6: 0x4000, 0xcc7: 0x4000, 0xcc8: 0x4000, 0xcc9: 0x4000, 0xcca: 0x4000, 0xccb: 0x4000, + 0xccc: 0x4000, 0xccd: 0x4000, 0xcce: 0x4000, 0xccf: 0x4000, 0xcd0: 0x4000, 0xcd1: 0x4000, + 0xcd2: 0x4000, 0xcd3: 0x4000, 0xcd4: 0x4000, 0xcd5: 0x4000, 0xcd6: 0x4000, 0xcd7: 0x4000, + 0xcd8: 0x4000, 0xcd9: 0x4000, 0xcda: 0x4000, 0xcdb: 0x4000, 0xcdc: 0x4000, 0xcdd: 0x4000, + 0xcde: 0x4000, 0xcdf: 0x4000, 0xce0: 0x4000, 0xce1: 0x4000, 0xce2: 0x4000, 0xce3: 0x4000, + 0xce4: 0x4000, 0xce5: 0x4000, 0xce6: 0x4000, 0xce7: 0x4000, 0xce8: 0x4000, 0xce9: 0x4000, + 0xcea: 0x4000, 0xceb: 0x4000, 0xcec: 0x4000, 0xced: 0x4000, + 0xcf1: 0x403e, 0xcf2: 0x403e, 0xcf3: 0x403e, 0xcf4: 0x403e, 0xcf5: 0x403e, + 0xcf6: 0x403e, 0xcf7: 0x403e, 0xcf8: 0x403e, 0xcf9: 0x403e, 0xcfa: 0x403e, 0xcfb: 0x403e, + 0xcfc: 0x403e, 0xcfd: 0x403e, 0xcfe: 0x403e, 0xcff: 0x403e, + // Block 0x34, offset 0xd00 + 0xd00: 0x4037, 0xd01: 0x4037, 0xd02: 0x4037, 0xd03: 0x4037, 0xd04: 0x4037, 0xd05: 0x4037, + 0xd06: 0x4037, 0xd07: 0x4037, 0xd08: 0x4037, 0xd09: 0x4037, 0xd0a: 0x4037, 0xd0b: 0x4037, + 0xd0c: 0x4037, 0xd0d: 0x4037, 0xd0e: 0x4037, 0xd0f: 0x400e, 0xd10: 0x403f, 0xd11: 0x4040, + 0xd12: 0x4041, 0xd13: 0x4040, 0xd14: 0x403f, 0xd15: 0x4042, 0xd16: 0x4043, 0xd17: 0x4044, + 0xd18: 0x4040, 0xd19: 0x4041, 0xd1a: 0x4040, 0xd1b: 0x4045, 0xd1c: 0x4009, 0xd1d: 0x4045, + 0xd1e: 0x4046, 0xd1f: 0x4045, 0xd20: 0x4047, 0xd21: 0x400b, 0xd22: 0x400a, 0xd23: 0x400c, + 0xd24: 0x4048, 0xd25: 0x4000, 0xd26: 0x4000, 0xd27: 0x4000, 0xd28: 0x4000, 0xd29: 0x4000, + 0xd2a: 0x4000, 0xd2b: 0x4000, 0xd2c: 0x4000, 0xd2d: 0x4000, 0xd2e: 0x4000, 0xd2f: 0x4000, + 0xd30: 0x4000, 0xd31: 0x4000, 0xd32: 0x4000, 0xd33: 0x4000, 0xd34: 0x4000, 0xd35: 0x4000, + 0xd36: 0x4000, 0xd37: 0x4000, 0xd38: 0x4000, 0xd39: 0x4000, 0xd3a: 0x4000, 0xd3b: 0x4000, + 0xd3c: 0x4000, 0xd3d: 0x4000, 0xd3e: 0x4000, 0xd3f: 0x4000, + // Block 0x35, offset 0xd40 + 0xd40: 0x4000, 0xd41: 0x4000, 0xd42: 0x4000, 0xd43: 0x4000, 0xd44: 0x4000, 0xd45: 0x4000, + 0xd46: 0x4000, 0xd47: 0x4000, 0xd48: 0x4000, 0xd49: 0x4000, 0xd4a: 0x4000, 0xd4b: 0x4000, + 0xd4c: 0x4000, 0xd4d: 0x4000, 0xd4e: 0x4000, 0xd50: 0x4000, 0xd51: 0x4000, + 0xd52: 0x4000, 0xd53: 0x4000, 0xd54: 0x4000, 0xd55: 0x4000, 0xd56: 0x4000, 0xd57: 0x4000, + 0xd58: 0x4000, 0xd59: 0x4000, 0xd5a: 0x4000, 0xd5b: 0x4000, 0xd5c: 0x4000, 0xd5d: 0x4000, + 0xd5e: 0x4000, 0xd5f: 0x4000, 0xd60: 0x4000, 0xd61: 0x4000, 0xd62: 0x4000, 0xd63: 0x4000, + 0xd64: 0x4000, 0xd65: 0x4000, 0xd66: 0x4000, 0xd67: 0x4000, 0xd68: 0x4000, 0xd69: 0x4000, + 0xd6a: 0x4000, 0xd6b: 0x4000, 0xd6c: 0x4000, 0xd6d: 0x4000, 0xd6e: 0x4000, 0xd6f: 0x4000, + 0xd70: 0x4000, 0xd71: 0x4000, 0xd72: 0x4000, 0xd73: 0x4000, 0xd74: 0x4000, 0xd75: 0x4000, + 0xd76: 0x4000, 0xd77: 0x4000, 0xd78: 0x4000, 0xd79: 0x4000, 0xd7a: 0x4000, + // Block 0x36, offset 0xd80 + 0xd80: 0x4000, 0xd81: 0x4000, 0xd82: 0x4000, 0xd83: 0x4000, 0xd84: 0x4000, 0xd85: 0x4000, + 0xd86: 0x4000, 0xd87: 0x4000, 0xd88: 0x4000, 0xd89: 0x4000, 0xd8a: 0x4000, 0xd8b: 0x4000, + 0xd8c: 0x4000, 0xd8d: 0x4000, 0xd8e: 0x4000, 0xd8f: 0x4000, 0xd90: 0x4000, 0xd91: 0x4000, + 0xd92: 0x4000, 0xd93: 0x4000, 0xd94: 0x4000, 0xd95: 0x4000, 0xd96: 0x4000, 0xd97: 0x4000, + 0xd98: 0x4000, 0xd99: 0x4000, 0xd9a: 0x4000, 0xd9b: 0x4000, 0xd9c: 0x4000, 0xd9d: 0x4000, + 0xd9e: 0x4000, 0xd9f: 0x4000, 0xda0: 0x4000, 0xda1: 0x4000, 0xda2: 0x4000, 0xda3: 0x4000, + 0xdb0: 0x4000, 0xdb1: 0x4000, 0xdb2: 0x4000, 0xdb3: 0x4000, 0xdb4: 0x4000, 0xdb5: 0x4000, + 0xdb6: 0x4000, 0xdb7: 0x4000, 0xdb8: 0x4000, 0xdb9: 0x4000, 0xdba: 0x4000, 0xdbb: 0x4000, + 0xdbc: 0x4000, 0xdbd: 0x4000, 0xdbe: 0x4000, 0xdbf: 0x4000, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x4000, 0xdc1: 0x4000, 0xdc2: 0x4000, 0xdc3: 0x4000, 0xdc4: 0x4000, 0xdc5: 0x4000, + 0xdc6: 0x4000, 0xdc7: 0x4000, 0xdc8: 0x4000, 0xdc9: 0x4000, 0xdca: 0x4000, 0xdcb: 0x4000, + 0xdcc: 0x4000, 0xdcd: 0x4000, 0xdce: 0x4000, 0xdcf: 0x4000, 0xdd0: 0x4000, 0xdd1: 0x4000, + 0xdd2: 0x4000, 0xdd3: 0x4000, 0xdd4: 0x4000, 0xdd5: 0x4000, 0xdd6: 0x4000, 0xdd7: 0x4000, + 0xdd8: 0x4000, 0xdd9: 0x4000, 0xdda: 0x4000, 0xddb: 0x4000, 0xddc: 0x4000, 0xddd: 0x4000, + 0xdde: 0x4000, 0xde0: 0x4000, 0xde1: 0x4000, 0xde2: 0x4000, 0xde3: 0x4000, + 0xde4: 0x4000, 0xde5: 0x4000, 0xde6: 0x4000, 0xde7: 0x4000, 0xde8: 0x4000, 0xde9: 0x4000, + 0xdea: 0x4000, 0xdeb: 0x4000, 0xdec: 0x4000, 0xded: 0x4000, 0xdee: 0x4000, 0xdef: 0x4000, + 0xdf0: 0x4000, 0xdf1: 0x4000, 0xdf2: 0x4000, 0xdf3: 0x4000, 0xdf4: 0x4000, 0xdf5: 0x4000, + 0xdf6: 0x4000, 0xdf7: 0x4000, 0xdf8: 0x4000, 0xdf9: 0x4000, 0xdfa: 0x4000, 0xdfb: 0x4000, + 0xdfc: 0x4000, 0xdfd: 0x4000, 0xdfe: 0x4000, 0xdff: 0x4000, + // Block 0x38, offset 0xe00 + 0xe00: 0x4000, 0xe01: 0x4000, 0xe02: 0x4000, 0xe03: 0x4000, 0xe04: 0x4000, 0xe05: 0x4000, + 0xe06: 0x4000, 0xe07: 0x4000, 0xe08: 0x2000, 0xe09: 0x2000, 0xe0a: 0x2000, 0xe0b: 0x2000, + 0xe0c: 0x2000, 0xe0d: 0x2000, 0xe0e: 0x2000, 0xe0f: 0x2000, 0xe10: 0x4000, 0xe11: 0x4000, + 0xe12: 0x4000, 0xe13: 0x4000, 0xe14: 0x4000, 0xe15: 0x4000, 0xe16: 0x4000, 0xe17: 0x4000, + 0xe18: 0x4000, 0xe19: 0x4000, 0xe1a: 0x4000, 0xe1b: 0x4000, 0xe1c: 0x4000, 0xe1d: 0x4000, + 0xe1e: 0x4000, 0xe1f: 0x4000, 0xe20: 0x4000, 0xe21: 0x4000, 0xe22: 0x4000, 0xe23: 0x4000, + 0xe24: 0x4000, 0xe25: 0x4000, 0xe26: 0x4000, 0xe27: 0x4000, 0xe28: 0x4000, 0xe29: 0x4000, + 0xe2a: 0x4000, 0xe2b: 0x4000, 0xe2c: 0x4000, 0xe2d: 0x4000, 0xe2e: 0x4000, 0xe2f: 0x4000, + 0xe30: 0x4000, 0xe31: 0x4000, 0xe32: 0x4000, 0xe33: 0x4000, 0xe34: 0x4000, 0xe35: 0x4000, + 0xe36: 0x4000, 0xe37: 0x4000, 0xe38: 0x4000, 0xe39: 0x4000, 0xe3a: 0x4000, 0xe3b: 0x4000, + 0xe3c: 0x4000, 0xe3d: 0x4000, 0xe3e: 0x4000, 0xe3f: 0x4000, + // Block 0x39, offset 0xe40 + 0xe40: 0x4000, 0xe41: 0x4000, 0xe42: 0x4000, 0xe43: 0x4000, 0xe44: 0x4000, 0xe45: 0x4000, + 0xe46: 0x4000, 0xe47: 0x4000, 0xe48: 0x4000, 0xe49: 0x4000, 0xe4a: 0x4000, 0xe4b: 0x4000, + 0xe4c: 0x4000, 0xe4d: 0x4000, 0xe4e: 0x4000, 0xe4f: 0x4000, 0xe50: 0x4000, 0xe51: 0x4000, + 0xe52: 0x4000, 0xe53: 0x4000, 0xe54: 0x4000, 0xe55: 0x4000, 0xe56: 0x4000, 0xe57: 0x4000, + 0xe58: 0x4000, 0xe59: 0x4000, 0xe5a: 0x4000, 0xe5b: 0x4000, 0xe5c: 0x4000, 0xe5d: 0x4000, + 0xe5e: 0x4000, 0xe5f: 0x4000, 0xe60: 0x4000, 0xe61: 0x4000, 0xe62: 0x4000, 0xe63: 0x4000, + 0xe64: 0x4000, 0xe65: 0x4000, 0xe66: 0x4000, 0xe67: 0x4000, 0xe68: 0x4000, 0xe69: 0x4000, + 0xe6a: 0x4000, 0xe6b: 0x4000, 0xe6c: 0x4000, 0xe6d: 0x4000, 0xe6e: 0x4000, 0xe6f: 0x4000, + 0xe70: 0x4000, 0xe71: 0x4000, 0xe72: 0x4000, 0xe73: 0x4000, 0xe74: 0x4000, 0xe75: 0x4000, + 0xe76: 0x4000, 0xe77: 0x4000, 0xe78: 0x4000, 0xe79: 0x4000, 0xe7a: 0x4000, 0xe7b: 0x4000, + 0xe7c: 0x4000, 0xe7d: 0x4000, 0xe7e: 0x4000, + // Block 0x3a, offset 0xe80 + 0xe80: 0x4000, 0xe81: 0x4000, 0xe82: 0x4000, 0xe83: 0x4000, 0xe84: 0x4000, 0xe85: 0x4000, + 0xe86: 0x4000, 0xe87: 0x4000, 0xe88: 0x4000, 0xe89: 0x4000, 0xe8a: 0x4000, 0xe8b: 0x4000, + 0xe8c: 0x4000, 0xe90: 0x4000, 0xe91: 0x4000, + 0xe92: 0x4000, 0xe93: 0x4000, 0xe94: 0x4000, 0xe95: 0x4000, 0xe96: 0x4000, 0xe97: 0x4000, + 0xe98: 0x4000, 0xe99: 0x4000, 0xe9a: 0x4000, 0xe9b: 0x4000, 0xe9c: 0x4000, 0xe9d: 0x4000, + 0xe9e: 0x4000, 0xe9f: 0x4000, 0xea0: 0x4000, 0xea1: 0x4000, 0xea2: 0x4000, 0xea3: 0x4000, + 0xea4: 0x4000, 0xea5: 0x4000, 0xea6: 0x4000, 0xea7: 0x4000, 0xea8: 0x4000, 0xea9: 0x4000, + 0xeaa: 0x4000, 0xeab: 0x4000, 0xeac: 0x4000, 0xead: 0x4000, 0xeae: 0x4000, 0xeaf: 0x4000, + 0xeb0: 0x4000, 0xeb1: 0x4000, 0xeb2: 0x4000, 0xeb3: 0x4000, 0xeb4: 0x4000, 0xeb5: 0x4000, + 0xeb6: 0x4000, 0xeb7: 0x4000, 0xeb8: 0x4000, 0xeb9: 0x4000, 0xeba: 0x4000, 0xebb: 0x4000, + 0xebc: 0x4000, 0xebd: 0x4000, 0xebe: 0x4000, 0xebf: 0x4000, + // Block 0x3b, offset 0xec0 + 0xec0: 0x4000, 0xec1: 0x4000, 0xec2: 0x4000, 0xec3: 0x4000, 0xec4: 0x4000, 0xec5: 0x4000, + 0xec6: 0x4000, + // Block 0x3c, offset 0xf00 + 0xf20: 0x4000, 0xf21: 0x4000, 0xf22: 0x4000, 0xf23: 0x4000, + 0xf24: 0x4000, 0xf25: 0x4000, 0xf26: 0x4000, 0xf27: 0x4000, 0xf28: 0x4000, 0xf29: 0x4000, + 0xf2a: 0x4000, 0xf2b: 0x4000, 0xf2c: 0x4000, 0xf2d: 0x4000, 0xf2e: 0x4000, 0xf2f: 0x4000, + 0xf30: 0x4000, 0xf31: 0x4000, 0xf32: 0x4000, 0xf33: 0x4000, 0xf34: 0x4000, 0xf35: 0x4000, + 0xf36: 0x4000, 0xf37: 0x4000, 0xf38: 0x4000, 0xf39: 0x4000, 0xf3a: 0x4000, 0xf3b: 0x4000, + 0xf3c: 0x4000, + // Block 0x3d, offset 0xf40 + 0xf40: 0x4000, 0xf41: 0x4000, 0xf42: 0x4000, 0xf43: 0x4000, 0xf44: 0x4000, 0xf45: 0x4000, + 0xf46: 0x4000, 0xf47: 0x4000, 0xf48: 0x4000, 0xf49: 0x4000, 0xf4a: 0x4000, 0xf4b: 0x4000, + 0xf4c: 0x4000, 0xf4d: 0x4000, 0xf4e: 0x4000, 0xf4f: 0x4000, 0xf50: 0x4000, 0xf51: 0x4000, + 0xf52: 0x4000, 0xf53: 0x4000, 0xf54: 0x4000, 0xf55: 0x4000, 0xf56: 0x4000, 0xf57: 0x4000, + 0xf58: 0x4000, 0xf59: 0x4000, 0xf5a: 0x4000, 0xf5b: 0x4000, 0xf5c: 0x4000, 0xf5d: 0x4000, + 0xf5e: 0x4000, 0xf5f: 0x4000, 0xf60: 0x4000, 0xf61: 0x4000, 0xf62: 0x4000, 0xf63: 0x4000, + // Block 0x3e, offset 0xf80 + 0xf80: 0x2000, 0xf81: 0x2000, 0xf82: 0x2000, 0xf83: 0x2000, 0xf84: 0x2000, 0xf85: 0x2000, + 0xf86: 0x2000, 0xf87: 0x2000, 0xf88: 0x2000, 0xf89: 0x2000, 0xf8a: 0x2000, 0xf8b: 0x2000, + 0xf8c: 0x2000, 0xf8d: 0x2000, 0xf8e: 0x2000, 0xf8f: 0x2000, 0xf90: 0x4000, 0xf91: 0x4000, + 0xf92: 0x4000, 0xf93: 0x4000, 0xf94: 0x4000, 0xf95: 0x4000, 0xf96: 0x4000, 0xf97: 0x4000, + 0xf98: 0x4000, 0xf99: 0x4000, + 0xfb0: 0x4000, 0xfb1: 0x4000, 0xfb2: 0x4000, 0xfb3: 0x4000, 0xfb4: 0x4000, 0xfb5: 0x4000, + 0xfb6: 0x4000, 0xfb7: 0x4000, 0xfb8: 0x4000, 0xfb9: 0x4000, 0xfba: 0x4000, 0xfbb: 0x4000, + 0xfbc: 0x4000, 0xfbd: 0x4000, 0xfbe: 0x4000, 0xfbf: 0x4000, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x4000, 0xfc1: 0x4000, 0xfc2: 0x4000, 0xfc3: 0x4000, 0xfc4: 0x4000, 0xfc5: 0x4000, + 0xfc6: 0x4000, 0xfc7: 0x4000, 0xfc8: 0x4000, 0xfc9: 0x4000, 0xfca: 0x4000, 0xfcb: 0x4000, + 0xfcc: 0x4000, 0xfcd: 0x4000, 0xfce: 0x4000, 0xfcf: 0x4000, 0xfd0: 0x4000, 0xfd1: 0x4000, + 0xfd2: 0x4000, 0xfd4: 0x4000, 0xfd5: 0x4000, 0xfd6: 0x4000, 0xfd7: 0x4000, + 0xfd8: 0x4000, 0xfd9: 0x4000, 0xfda: 0x4000, 0xfdb: 0x4000, 0xfdc: 0x4000, 0xfdd: 0x4000, + 0xfde: 0x4000, 0xfdf: 0x4000, 0xfe0: 0x4000, 0xfe1: 0x4000, 0xfe2: 0x4000, 0xfe3: 0x4000, + 0xfe4: 0x4000, 0xfe5: 0x4000, 0xfe6: 0x4000, 0xfe8: 0x4000, 0xfe9: 0x4000, + 0xfea: 0x4000, 0xfeb: 0x4000, + // Block 0x40, offset 0x1000 + 0x1001: 0x9012, 0x1002: 0x9012, 0x1003: 0x9012, 0x1004: 0x9012, 0x1005: 0x9012, + 0x1006: 0x9012, 0x1007: 0x9012, 0x1008: 0x9012, 0x1009: 0x9012, 0x100a: 0x9012, 0x100b: 0x9012, + 0x100c: 0x9012, 0x100d: 0x9012, 0x100e: 0x9012, 0x100f: 0x9012, 0x1010: 0x9012, 0x1011: 0x9012, + 0x1012: 0x9012, 0x1013: 0x9012, 0x1014: 0x9012, 0x1015: 0x9012, 0x1016: 0x9012, 0x1017: 0x9012, + 0x1018: 0x9012, 0x1019: 0x9012, 0x101a: 0x9012, 0x101b: 0x9012, 0x101c: 0x9012, 0x101d: 0x9012, + 0x101e: 0x9012, 0x101f: 0x9012, 0x1020: 0x9049, 0x1021: 0x9049, 0x1022: 0x9049, 0x1023: 0x9049, + 0x1024: 0x9049, 0x1025: 0x9049, 0x1026: 0x9049, 0x1027: 0x9049, 0x1028: 0x9049, 0x1029: 0x9049, + 0x102a: 0x9049, 0x102b: 0x9049, 0x102c: 0x9049, 0x102d: 0x9049, 0x102e: 0x9049, 0x102f: 0x9049, + 0x1030: 0x9049, 0x1031: 0x9049, 0x1032: 0x9049, 0x1033: 0x9049, 0x1034: 0x9049, 0x1035: 0x9049, + 0x1036: 0x9049, 0x1037: 0x9049, 0x1038: 0x9049, 0x1039: 0x9049, 0x103a: 0x9049, 0x103b: 0x9049, + 0x103c: 0x9049, 0x103d: 0x9049, 0x103e: 0x9049, 0x103f: 0x9049, + // Block 0x41, offset 0x1040 + 0x1040: 0x9049, 0x1041: 0x9049, 0x1042: 0x9049, 0x1043: 0x9049, 0x1044: 0x9049, 0x1045: 0x9049, + 0x1046: 0x9049, 0x1047: 0x9049, 0x1048: 0x9049, 0x1049: 0x9049, 0x104a: 0x9049, 0x104b: 0x9049, + 0x104c: 0x9049, 0x104d: 0x9049, 0x104e: 0x9049, 0x104f: 0x9049, 0x1050: 0x9049, 0x1051: 0x9049, + 0x1052: 0x9049, 0x1053: 0x9049, 0x1054: 0x9049, 0x1055: 0x9049, 0x1056: 0x9049, 0x1057: 0x9049, + 0x1058: 0x9049, 0x1059: 0x9049, 0x105a: 0x9049, 0x105b: 0x9049, 0x105c: 0x9049, 0x105d: 0x9049, + 0x105e: 0x9049, 0x105f: 0x904a, 0x1060: 0x904b, 0x1061: 0xb04c, 0x1062: 0xb04d, 0x1063: 0xb04d, + 0x1064: 0xb04e, 0x1065: 0xb04f, 0x1066: 0xb050, 0x1067: 0xb051, 0x1068: 0xb052, 0x1069: 0xb053, + 0x106a: 0xb054, 0x106b: 0xb055, 0x106c: 0xb056, 0x106d: 0xb057, 0x106e: 0xb058, 0x106f: 0xb059, + 0x1070: 0xb05a, 0x1071: 0xb05b, 0x1072: 0xb05c, 0x1073: 0xb05d, 0x1074: 0xb05e, 0x1075: 0xb05f, + 0x1076: 0xb060, 0x1077: 0xb061, 0x1078: 0xb062, 0x1079: 0xb063, 0x107a: 0xb064, 0x107b: 0xb065, + 0x107c: 0xb052, 0x107d: 0xb066, 0x107e: 0xb067, 0x107f: 0xb055, + // Block 0x42, offset 0x1080 + 0x1080: 0xb068, 0x1081: 0xb069, 0x1082: 0xb06a, 0x1083: 0xb06b, 0x1084: 0xb05a, 0x1085: 0xb056, + 0x1086: 0xb06c, 0x1087: 0xb06d, 0x1088: 0xb06b, 0x1089: 0xb06e, 0x108a: 0xb06b, 0x108b: 0xb06f, + 0x108c: 0xb06f, 0x108d: 0xb070, 0x108e: 0xb070, 0x108f: 0xb071, 0x1090: 0xb056, 0x1091: 0xb072, + 0x1092: 0xb073, 0x1093: 0xb072, 0x1094: 0xb074, 0x1095: 0xb073, 0x1096: 0xb075, 0x1097: 0xb075, + 0x1098: 0xb076, 0x1099: 0xb076, 0x109a: 0xb077, 0x109b: 0xb077, 0x109c: 0xb073, 0x109d: 0xb078, + 0x109e: 0xb079, 0x109f: 0xb067, 0x10a0: 0xb07a, 0x10a1: 0xb07b, 0x10a2: 0xb07b, 0x10a3: 0xb07b, + 0x10a4: 0xb07b, 0x10a5: 0xb07b, 0x10a6: 0xb07b, 0x10a7: 0xb07b, 0x10a8: 0xb07b, 0x10a9: 0xb07b, + 0x10aa: 0xb07b, 0x10ab: 0xb07b, 0x10ac: 0xb07b, 0x10ad: 0xb07b, 0x10ae: 0xb07b, 0x10af: 0xb07b, + 0x10b0: 0xb07c, 0x10b1: 0xb07c, 0x10b2: 0xb07c, 0x10b3: 0xb07c, 0x10b4: 0xb07c, 0x10b5: 0xb07c, + 0x10b6: 0xb07c, 0x10b7: 0xb07c, 0x10b8: 0xb07c, 0x10b9: 0xb07c, 0x10ba: 0xb07c, 0x10bb: 0xb07c, + 0x10bc: 0xb07c, 0x10bd: 0xb07c, 0x10be: 0xb07c, + // Block 0x43, offset 0x10c0 + 0x10c2: 0xb07d, 0x10c3: 0xb07e, 0x10c4: 0xb07f, 0x10c5: 0xb080, + 0x10c6: 0xb07f, 0x10c7: 0xb07e, 0x10ca: 0xb081, 0x10cb: 0xb082, + 0x10cc: 0xb083, 0x10cd: 0xb07f, 0x10ce: 0xb080, 0x10cf: 0xb07f, + 0x10d2: 0xb084, 0x10d3: 0xb085, 0x10d4: 0xb084, 0x10d5: 0xb086, 0x10d6: 0xb084, 0x10d7: 0xb087, + 0x10da: 0xb088, 0x10db: 0xb089, 0x10dc: 0xb08a, + 0x10e0: 0x908b, 0x10e1: 0x908b, 0x10e2: 0x908c, 0x10e3: 0x908d, + 0x10e4: 0x908b, 0x10e5: 0x908e, 0x10e6: 0x908f, 0x10e8: 0xb090, 0x10e9: 0xb091, + 0x10ea: 0xb092, 0x10eb: 0xb091, 0x10ec: 0xb093, 0x10ed: 0xb094, 0x10ee: 0xb095, + 0x10fd: 0x2000, + // Block 0x44, offset 0x1100 + 0x1100: 0x4000, 0x1101: 0x4000, + // Block 0x45, offset 0x1140 + 0x1140: 0x2000, 0x1141: 0x2000, 0x1142: 0x2000, 0x1143: 0x2000, 0x1144: 0x2000, 0x1145: 0x2000, + 0x1146: 0x2000, 0x1147: 0x2000, 0x1148: 0x2000, 0x1149: 0x2000, 0x114a: 0x2000, + 0x1150: 0x2000, 0x1151: 0x2000, + 0x1152: 0x2000, 0x1153: 0x2000, 0x1154: 0x2000, 0x1155: 0x2000, 0x1156: 0x2000, 0x1157: 0x2000, + 0x1158: 0x2000, 0x1159: 0x2000, 0x115a: 0x2000, 0x115b: 0x2000, 0x115c: 0x2000, 0x115d: 0x2000, + 0x115e: 0x2000, 0x115f: 0x2000, 0x1160: 0x2000, 0x1161: 0x2000, 0x1162: 0x2000, 0x1163: 0x2000, + 0x1164: 0x2000, 0x1165: 0x2000, 0x1166: 0x2000, 0x1167: 0x2000, 0x1168: 0x2000, 0x1169: 0x2000, + 0x116a: 0x2000, 0x116b: 0x2000, 0x116c: 0x2000, 0x116d: 0x2000, + 0x1170: 0x2000, 0x1171: 0x2000, 0x1172: 0x2000, 0x1173: 0x2000, 0x1174: 0x2000, 0x1175: 0x2000, + 0x1176: 0x2000, 0x1177: 0x2000, 0x1178: 0x2000, 0x1179: 0x2000, 0x117a: 0x2000, 0x117b: 0x2000, + 0x117c: 0x2000, 0x117d: 0x2000, 0x117e: 0x2000, 0x117f: 0x2000, + // Block 0x46, offset 0x1180 + 0x1180: 0x2000, 0x1181: 0x2000, 0x1182: 0x2000, 0x1183: 0x2000, 0x1184: 0x2000, 0x1185: 0x2000, + 0x1186: 0x2000, 0x1187: 0x2000, 0x1188: 0x2000, 0x1189: 0x2000, 0x118a: 0x2000, 0x118b: 0x2000, + 0x118c: 0x2000, 0x118d: 0x2000, 0x118e: 0x2000, 0x118f: 0x2000, 0x1190: 0x2000, 0x1191: 0x2000, + 0x1192: 0x2000, 0x1193: 0x2000, 0x1194: 0x2000, 0x1195: 0x2000, 0x1196: 0x2000, 0x1197: 0x2000, + 0x1198: 0x2000, 0x1199: 0x2000, 0x119a: 0x2000, 0x119b: 0x2000, 0x119c: 0x2000, 0x119d: 0x2000, + 0x119e: 0x2000, 0x119f: 0x2000, 0x11a0: 0x2000, 0x11a1: 0x2000, 0x11a2: 0x2000, 0x11a3: 0x2000, + 0x11a4: 0x2000, 0x11a5: 0x2000, 0x11a6: 0x2000, 0x11a7: 0x2000, 0x11a8: 0x2000, 0x11a9: 0x2000, + 0x11b0: 0x2000, 0x11b1: 0x2000, 0x11b2: 0x2000, 0x11b3: 0x2000, 0x11b4: 0x2000, 0x11b5: 0x2000, + 0x11b6: 0x2000, 0x11b7: 0x2000, 0x11b8: 0x2000, 0x11b9: 0x2000, 0x11ba: 0x2000, 0x11bb: 0x2000, + 0x11bc: 0x2000, 0x11bd: 0x2000, 0x11be: 0x2000, 0x11bf: 0x2000, + // Block 0x47, offset 0x11c0 + 0x11c0: 0x2000, 0x11c1: 0x2000, 0x11c2: 0x2000, 0x11c3: 0x2000, 0x11c4: 0x2000, 0x11c5: 0x2000, + 0x11c6: 0x2000, 0x11c7: 0x2000, 0x11c8: 0x2000, 0x11c9: 0x2000, 0x11ca: 0x2000, 0x11cb: 0x2000, + 0x11cc: 0x2000, 0x11cd: 0x2000, 0x11ce: 0x2000, 0x11cf: 0x2000, 0x11d0: 0x2000, 0x11d1: 0x2000, + 0x11d2: 0x2000, 0x11d3: 0x2000, 0x11d4: 0x2000, 0x11d5: 0x2000, 0x11d6: 0x2000, 0x11d7: 0x2000, + 0x11d8: 0x2000, 0x11d9: 0x2000, 0x11da: 0x2000, + // Block 0x48, offset 0x1200 + 0x1200: 0x4000, 0x1201: 0x4000, 0x1202: 0x4000, + 0x1210: 0x4000, 0x1211: 0x4000, + 0x1212: 0x4000, 0x1213: 0x4000, 0x1214: 0x4000, 0x1215: 0x4000, 0x1216: 0x4000, 0x1217: 0x4000, + 0x1218: 0x4000, 0x1219: 0x4000, 0x121a: 0x4000, 0x121b: 0x4000, 0x121c: 0x4000, 0x121d: 0x4000, + 0x121e: 0x4000, 0x121f: 0x4000, 0x1220: 0x4000, 0x1221: 0x4000, 0x1222: 0x4000, 0x1223: 0x4000, + 0x1224: 0x4000, 0x1225: 0x4000, 0x1226: 0x4000, 0x1227: 0x4000, 0x1228: 0x4000, 0x1229: 0x4000, + 0x122a: 0x4000, 0x122b: 0x4000, 0x122c: 0x4000, 0x122d: 0x4000, 0x122e: 0x4000, 0x122f: 0x4000, + 0x1230: 0x4000, 0x1231: 0x4000, 0x1232: 0x4000, 0x1233: 0x4000, 0x1234: 0x4000, 0x1235: 0x4000, + 0x1236: 0x4000, 0x1237: 0x4000, 0x1238: 0x4000, 0x1239: 0x4000, 0x123a: 0x4000, + // Block 0x49, offset 0x1240 + 0x1240: 0x4000, 0x1241: 0x4000, 0x1242: 0x4000, 0x1243: 0x4000, 0x1244: 0x4000, 0x1245: 0x4000, + 0x1246: 0x4000, 0x1247: 0x4000, 0x1248: 0x4000, + 0x1250: 0x4000, 0x1251: 0x4000, + // Block 0x4a, offset 0x1280 + 0x1280: 0x2000, 0x1281: 0x2000, 0x1282: 0x2000, 0x1283: 0x2000, 0x1284: 0x2000, 0x1285: 0x2000, + 0x1286: 0x2000, 0x1287: 0x2000, 0x1288: 0x2000, 0x1289: 0x2000, 0x128a: 0x2000, 0x128b: 0x2000, + 0x128c: 0x2000, 0x128d: 0x2000, 0x128e: 0x2000, 0x128f: 0x2000, 0x1290: 0x2000, 0x1291: 0x2000, + 0x1292: 0x2000, 0x1293: 0x2000, 0x1294: 0x2000, 0x1295: 0x2000, 0x1296: 0x2000, 0x1297: 0x2000, + 0x1298: 0x2000, 0x1299: 0x2000, 0x129a: 0x2000, 0x129b: 0x2000, 0x129c: 0x2000, 0x129d: 0x2000, + 0x129e: 0x2000, 0x129f: 0x2000, 0x12a0: 0x2000, 0x12a1: 0x2000, 0x12a2: 0x2000, 0x12a3: 0x2000, + 0x12a4: 0x2000, 0x12a5: 0x2000, 0x12a6: 0x2000, 0x12a7: 0x2000, 0x12a8: 0x2000, 0x12a9: 0x2000, + 0x12aa: 0x2000, 0x12ab: 0x2000, 0x12ac: 0x2000, 0x12ad: 0x2000, 0x12ae: 0x2000, 0x12af: 0x2000, + 0x12b0: 0x2000, 0x12b1: 0x2000, 0x12b2: 0x2000, 0x12b3: 0x2000, 0x12b4: 0x2000, 0x12b5: 0x2000, + 0x12b6: 0x2000, 0x12b7: 0x2000, 0x12b8: 0x2000, 0x12b9: 0x2000, 0x12ba: 0x2000, 0x12bb: 0x2000, + 0x12bc: 0x2000, 0x12bd: 0x2000, +} + +// widthIndex: 20 blocks, 1280 entries, 1280 bytes +// Block 0 is the zero block. +var widthIndex = [1280]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x02, 0xc4: 0x03, 0xc5: 0x04, 0xc7: 0x05, + 0xc9: 0x06, 0xcb: 0x07, 0xcc: 0x08, 0xcd: 0x09, 0xce: 0x0a, 0xcf: 0x0b, + 0xd0: 0x0c, 0xd1: 0x0d, + 0xe1: 0x02, 0xe2: 0x03, 0xe3: 0x04, 0xe4: 0x05, 0xe5: 0x06, 0xe6: 0x06, 0xe7: 0x06, + 0xe8: 0x06, 0xe9: 0x06, 0xea: 0x07, 0xeb: 0x06, 0xec: 0x06, 0xed: 0x08, 0xee: 0x09, 0xef: 0x0a, + 0xf0: 0x0d, 0xf3: 0x10, 0xf4: 0x11, + // Block 0x4, offset 0x100 + 0x104: 0x0e, 0x105: 0x0f, + // Block 0x5, offset 0x140 + 0x140: 0x10, 0x141: 0x11, 0x142: 0x12, 0x144: 0x13, 0x145: 0x14, 0x146: 0x15, 0x147: 0x16, + 0x148: 0x17, 0x149: 0x18, 0x14a: 0x19, 0x14c: 0x1a, + 0x151: 0x1b, 0x152: 0x08, 0x153: 0x1c, 0x154: 0x1d, 0x155: 0x1e, 0x156: 0x1f, 0x157: 0x20, + 0x158: 0x21, 0x159: 0x22, 0x15a: 0x23, 0x15b: 0x24, 0x15c: 0x25, 0x15d: 0x26, 0x15f: 0x27, + 0x166: 0x28, + 0x16d: 0x29, + 0x17a: 0x2a, 0x17b: 0x2b, 0x17c: 0x0e, 0x17d: 0x0e, 0x17e: 0x0e, 0x17f: 0x2c, + // Block 0x6, offset 0x180 + 0x180: 0x2d, 0x181: 0x2e, 0x182: 0x2f, 0x183: 0x30, 0x184: 0x31, 0x185: 0x32, 0x186: 0x33, 0x187: 0x34, + 0x188: 0x35, 0x189: 0x36, 0x18a: 0x0e, 0x18b: 0x37, 0x18c: 0x0e, 0x18d: 0x0e, 0x18e: 0x0e, 0x18f: 0x0e, + 0x190: 0x0e, 0x191: 0x0e, 0x192: 0x0e, 0x193: 0x0e, 0x194: 0x0e, 0x195: 0x0e, 0x196: 0x0e, 0x197: 0x0e, + 0x198: 0x0e, 0x199: 0x0e, 0x19a: 0x0e, 0x19b: 0x0e, 0x19c: 0x0e, 0x19d: 0x0e, 0x19e: 0x0e, 0x19f: 0x0e, + 0x1a0: 0x0e, 0x1a1: 0x0e, 0x1a2: 0x0e, 0x1a3: 0x0e, 0x1a4: 0x0e, 0x1a5: 0x0e, 0x1a6: 0x0e, 0x1a7: 0x0e, + 0x1a8: 0x0e, 0x1a9: 0x0e, 0x1aa: 0x0e, 0x1ab: 0x0e, 0x1ac: 0x0e, 0x1ad: 0x0e, 0x1ae: 0x0e, 0x1af: 0x0e, + 0x1b0: 0x0e, 0x1b1: 0x0e, 0x1b2: 0x0e, 0x1b3: 0x0e, 0x1b4: 0x0e, 0x1b5: 0x0e, 0x1b6: 0x0e, 0x1b7: 0x0e, + 0x1b8: 0x0e, 0x1b9: 0x0e, 0x1ba: 0x0e, 0x1bb: 0x0e, 0x1bc: 0x0e, 0x1bd: 0x0e, 0x1be: 0x0e, 0x1bf: 0x0e, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x0e, 0x1c1: 0x0e, 0x1c2: 0x0e, 0x1c3: 0x0e, 0x1c4: 0x0e, 0x1c5: 0x0e, 0x1c6: 0x0e, 0x1c7: 0x0e, + 0x1c8: 0x0e, 0x1c9: 0x0e, 0x1ca: 0x0e, 0x1cb: 0x0e, 0x1cc: 0x0e, 0x1cd: 0x0e, 0x1ce: 0x0e, 0x1cf: 0x0e, + 0x1d0: 0x0e, 0x1d1: 0x0e, 0x1d2: 0x0e, 0x1d3: 0x0e, 0x1d4: 0x0e, 0x1d5: 0x0e, 0x1d6: 0x0e, 0x1d7: 0x0e, + 0x1d8: 0x0e, 0x1d9: 0x0e, 0x1da: 0x0e, 0x1db: 0x0e, 0x1dc: 0x0e, 0x1dd: 0x0e, 0x1de: 0x0e, 0x1df: 0x0e, + 0x1e0: 0x0e, 0x1e1: 0x0e, 0x1e2: 0x0e, 0x1e3: 0x0e, 0x1e4: 0x0e, 0x1e5: 0x0e, 0x1e6: 0x0e, 0x1e7: 0x0e, + 0x1e8: 0x0e, 0x1e9: 0x0e, 0x1ea: 0x0e, 0x1eb: 0x0e, 0x1ec: 0x0e, 0x1ed: 0x0e, 0x1ee: 0x0e, 0x1ef: 0x0e, + 0x1f0: 0x0e, 0x1f1: 0x0e, 0x1f2: 0x0e, 0x1f3: 0x0e, 0x1f4: 0x0e, 0x1f5: 0x0e, 0x1f6: 0x0e, + 0x1f8: 0x0e, 0x1f9: 0x0e, 0x1fa: 0x0e, 0x1fb: 0x0e, 0x1fc: 0x0e, 0x1fd: 0x0e, 0x1fe: 0x0e, 0x1ff: 0x0e, + // Block 0x8, offset 0x200 + 0x200: 0x0e, 0x201: 0x0e, 0x202: 0x0e, 0x203: 0x0e, 0x204: 0x0e, 0x205: 0x0e, 0x206: 0x0e, 0x207: 0x0e, + 0x208: 0x0e, 0x209: 0x0e, 0x20a: 0x0e, 0x20b: 0x0e, 0x20c: 0x0e, 0x20d: 0x0e, 0x20e: 0x0e, 0x20f: 0x0e, + 0x210: 0x0e, 0x211: 0x0e, 0x212: 0x0e, 0x213: 0x0e, 0x214: 0x0e, 0x215: 0x0e, 0x216: 0x0e, 0x217: 0x0e, + 0x218: 0x0e, 0x219: 0x0e, 0x21a: 0x0e, 0x21b: 0x0e, 0x21c: 0x0e, 0x21d: 0x0e, 0x21e: 0x0e, 0x21f: 0x0e, + 0x220: 0x0e, 0x221: 0x0e, 0x222: 0x0e, 0x223: 0x0e, 0x224: 0x0e, 0x225: 0x0e, 0x226: 0x0e, 0x227: 0x0e, + 0x228: 0x0e, 0x229: 0x0e, 0x22a: 0x0e, 0x22b: 0x0e, 0x22c: 0x0e, 0x22d: 0x0e, 0x22e: 0x0e, 0x22f: 0x0e, + 0x230: 0x0e, 0x231: 0x0e, 0x232: 0x0e, 0x233: 0x0e, 0x234: 0x0e, 0x235: 0x0e, 0x236: 0x0e, 0x237: 0x0e, + 0x238: 0x0e, 0x239: 0x0e, 0x23a: 0x0e, 0x23b: 0x0e, 0x23c: 0x0e, 0x23d: 0x0e, 0x23e: 0x0e, 0x23f: 0x0e, + // Block 0x9, offset 0x240 + 0x240: 0x0e, 0x241: 0x0e, 0x242: 0x0e, 0x243: 0x0e, 0x244: 0x0e, 0x245: 0x0e, 0x246: 0x0e, 0x247: 0x0e, + 0x248: 0x0e, 0x249: 0x0e, 0x24a: 0x0e, 0x24b: 0x0e, 0x24c: 0x0e, 0x24d: 0x0e, 0x24e: 0x0e, 0x24f: 0x0e, + 0x250: 0x0e, 0x251: 0x0e, 0x252: 0x38, 0x253: 0x39, + 0x265: 0x3a, + 0x270: 0x0e, 0x271: 0x0e, 0x272: 0x0e, 0x273: 0x0e, 0x274: 0x0e, 0x275: 0x0e, 0x276: 0x0e, 0x277: 0x0e, + 0x278: 0x0e, 0x279: 0x0e, 0x27a: 0x0e, 0x27b: 0x0e, 0x27c: 0x0e, 0x27d: 0x0e, 0x27e: 0x0e, 0x27f: 0x0e, + // Block 0xa, offset 0x280 + 0x280: 0x0e, 0x281: 0x0e, 0x282: 0x0e, 0x283: 0x0e, 0x284: 0x0e, 0x285: 0x0e, 0x286: 0x0e, 0x287: 0x0e, + 0x288: 0x0e, 0x289: 0x0e, 0x28a: 0x0e, 0x28b: 0x0e, 0x28c: 0x0e, 0x28d: 0x0e, 0x28e: 0x0e, 0x28f: 0x0e, + 0x290: 0x0e, 0x291: 0x0e, 0x292: 0x0e, 0x293: 0x0e, 0x294: 0x0e, 0x295: 0x0e, 0x296: 0x0e, 0x297: 0x0e, + 0x298: 0x0e, 0x299: 0x0e, 0x29a: 0x0e, 0x29b: 0x0e, 0x29c: 0x0e, 0x29d: 0x0e, 0x29e: 0x3b, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x08, 0x2c1: 0x08, 0x2c2: 0x08, 0x2c3: 0x08, 0x2c4: 0x08, 0x2c5: 0x08, 0x2c6: 0x08, 0x2c7: 0x08, + 0x2c8: 0x08, 0x2c9: 0x08, 0x2ca: 0x08, 0x2cb: 0x08, 0x2cc: 0x08, 0x2cd: 0x08, 0x2ce: 0x08, 0x2cf: 0x08, + 0x2d0: 0x08, 0x2d1: 0x08, 0x2d2: 0x08, 0x2d3: 0x08, 0x2d4: 0x08, 0x2d5: 0x08, 0x2d6: 0x08, 0x2d7: 0x08, + 0x2d8: 0x08, 0x2d9: 0x08, 0x2da: 0x08, 0x2db: 0x08, 0x2dc: 0x08, 0x2dd: 0x08, 0x2de: 0x08, 0x2df: 0x08, + 0x2e0: 0x08, 0x2e1: 0x08, 0x2e2: 0x08, 0x2e3: 0x08, 0x2e4: 0x08, 0x2e5: 0x08, 0x2e6: 0x08, 0x2e7: 0x08, + 0x2e8: 0x08, 0x2e9: 0x08, 0x2ea: 0x08, 0x2eb: 0x08, 0x2ec: 0x08, 0x2ed: 0x08, 0x2ee: 0x08, 0x2ef: 0x08, + 0x2f0: 0x08, 0x2f1: 0x08, 0x2f2: 0x08, 0x2f3: 0x08, 0x2f4: 0x08, 0x2f5: 0x08, 0x2f6: 0x08, 0x2f7: 0x08, + 0x2f8: 0x08, 0x2f9: 0x08, 0x2fa: 0x08, 0x2fb: 0x08, 0x2fc: 0x08, 0x2fd: 0x08, 0x2fe: 0x08, 0x2ff: 0x08, + // Block 0xc, offset 0x300 + 0x300: 0x08, 0x301: 0x08, 0x302: 0x08, 0x303: 0x08, 0x304: 0x08, 0x305: 0x08, 0x306: 0x08, 0x307: 0x08, + 0x308: 0x08, 0x309: 0x08, 0x30a: 0x08, 0x30b: 0x08, 0x30c: 0x08, 0x30d: 0x08, 0x30e: 0x08, 0x30f: 0x08, + 0x310: 0x08, 0x311: 0x08, 0x312: 0x08, 0x313: 0x08, 0x314: 0x08, 0x315: 0x08, 0x316: 0x08, 0x317: 0x08, + 0x318: 0x08, 0x319: 0x08, 0x31a: 0x08, 0x31b: 0x08, 0x31c: 0x08, 0x31d: 0x08, 0x31e: 0x08, 0x31f: 0x08, + 0x320: 0x08, 0x321: 0x08, 0x322: 0x08, 0x323: 0x08, 0x324: 0x0e, 0x325: 0x0e, 0x326: 0x0e, 0x327: 0x0e, + 0x328: 0x0e, 0x329: 0x0e, 0x32a: 0x0e, 0x32b: 0x0e, + 0x338: 0x3c, 0x339: 0x3d, 0x33c: 0x3e, 0x33d: 0x3f, 0x33e: 0x40, 0x33f: 0x41, + // Block 0xd, offset 0x340 + 0x340: 0x42, + // Block 0xe, offset 0x380 + 0x384: 0x43, 0x385: 0x44, 0x386: 0x45, + 0x388: 0x46, 0x389: 0x47, + // Block 0xf, offset 0x3c0 + 0x3db: 0x0b, 0x3df: 0x0c, + 0x3e0: 0x06, 0x3e1: 0x06, 0x3e2: 0x06, 0x3e3: 0x06, 0x3e4: 0x06, 0x3e5: 0x06, 0x3e6: 0x06, 0x3e7: 0x06, + 0x3e8: 0x06, 0x3e9: 0x06, 0x3ea: 0x06, 0x3eb: 0x06, 0x3ec: 0x06, 0x3ed: 0x06, 0x3ee: 0x06, 0x3ef: 0x06, + 0x3f0: 0x06, 0x3f1: 0x06, 0x3f2: 0x06, 0x3f3: 0x06, 0x3f4: 0x06, 0x3f5: 0x06, 0x3f6: 0x06, 0x3f7: 0x06, + 0x3f8: 0x06, 0x3f9: 0x06, 0x3fa: 0x06, 0x3fb: 0x06, 0x3fc: 0x06, 0x3fd: 0x06, 0x3fe: 0x06, 0x3ff: 0x06, + // Block 0x10, offset 0x400 + 0x404: 0x08, 0x405: 0x08, 0x406: 0x08, 0x407: 0x09, + // Block 0x11, offset 0x440 + 0x440: 0x08, 0x441: 0x08, 0x442: 0x08, 0x443: 0x08, 0x444: 0x08, 0x445: 0x08, 0x446: 0x08, 0x447: 0x08, + 0x448: 0x08, 0x449: 0x08, 0x44a: 0x08, 0x44b: 0x08, 0x44c: 0x08, 0x44d: 0x08, 0x44e: 0x08, 0x44f: 0x08, + 0x450: 0x08, 0x451: 0x08, 0x452: 0x08, 0x453: 0x08, 0x454: 0x08, 0x455: 0x08, 0x456: 0x08, 0x457: 0x08, + 0x458: 0x08, 0x459: 0x08, 0x45a: 0x08, 0x45b: 0x08, 0x45c: 0x08, 0x45d: 0x08, 0x45e: 0x08, 0x45f: 0x08, + 0x460: 0x08, 0x461: 0x08, 0x462: 0x08, 0x463: 0x08, 0x464: 0x08, 0x465: 0x08, 0x466: 0x08, 0x467: 0x08, + 0x468: 0x08, 0x469: 0x08, 0x46a: 0x08, 0x46b: 0x08, 0x46c: 0x08, 0x46d: 0x08, 0x46e: 0x08, 0x46f: 0x08, + 0x470: 0x08, 0x471: 0x08, 0x472: 0x08, 0x473: 0x08, 0x474: 0x08, 0x475: 0x08, 0x476: 0x08, 0x477: 0x08, + 0x478: 0x08, 0x479: 0x08, 0x47a: 0x08, 0x47b: 0x08, 0x47c: 0x08, 0x47d: 0x08, 0x47e: 0x08, 0x47f: 0x48, + // Block 0x12, offset 0x480 + 0x4a0: 0x0e, + 0x4b0: 0x09, 0x4b1: 0x09, 0x4b2: 0x09, 0x4b3: 0x09, 0x4b4: 0x09, 0x4b5: 0x09, 0x4b6: 0x09, 0x4b7: 0x09, + 0x4b8: 0x09, 0x4b9: 0x09, 0x4ba: 0x09, 0x4bb: 0x09, 0x4bc: 0x09, 0x4bd: 0x09, 0x4be: 0x09, 0x4bf: 0x0f, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x09, 0x4c1: 0x09, 0x4c2: 0x09, 0x4c3: 0x09, 0x4c4: 0x09, 0x4c5: 0x09, 0x4c6: 0x09, 0x4c7: 0x09, + 0x4c8: 0x09, 0x4c9: 0x09, 0x4ca: 0x09, 0x4cb: 0x09, 0x4cc: 0x09, 0x4cd: 0x09, 0x4ce: 0x09, 0x4cf: 0x0f, +} + +// inverseData contains 4-byte entries of the following format: +// <length> <modified UTF-8-encoded rune> <0 padding> +// The last byte of the UTF-8-encoded rune is xor-ed with the last byte of the +// UTF-8 encoding of the original rune. Mappings often have the following +// pattern: +// A -> A (U+FF21 -> U+0041) +// B -> B (U+FF22 -> U+0042) +// ... +// By xor-ing the last byte the same entry can be shared by many mappings. This +// reduces the total number of distinct entries by about two thirds. +// The resulting entry for the aforementioned mappings is +// { 0x01, 0xE0, 0x00, 0x00 } +// Using this entry to map U+FF21 (UTF-8 [EF BC A1]), we get +// E0 ^ A1 = 41. +// Similarly, for U+FF22 (UTF-8 [EF BC A2]), we get +// E0 ^ A2 = 42. +// Note that because of the xor-ing, the byte sequence stored in the entry is +// not valid UTF-8. +var inverseData = [150][4]byte{ + {0x00, 0x00, 0x00, 0x00}, + {0x03, 0xe3, 0x80, 0xa0}, + {0x03, 0xef, 0xbc, 0xa0}, + {0x03, 0xef, 0xbc, 0xe0}, + {0x03, 0xef, 0xbd, 0xe0}, + {0x03, 0xef, 0xbf, 0x02}, + {0x03, 0xef, 0xbf, 0x00}, + {0x03, 0xef, 0xbf, 0x0e}, + {0x03, 0xef, 0xbf, 0x0c}, + {0x03, 0xef, 0xbf, 0x0f}, + {0x03, 0xef, 0xbf, 0x39}, + {0x03, 0xef, 0xbf, 0x3b}, + {0x03, 0xef, 0xbf, 0x3f}, + {0x03, 0xef, 0xbf, 0x2a}, + {0x03, 0xef, 0xbf, 0x0d}, + {0x03, 0xef, 0xbf, 0x25}, + {0x03, 0xef, 0xbd, 0x1a}, + {0x03, 0xef, 0xbd, 0x26}, + {0x01, 0xa0, 0x00, 0x00}, + {0x03, 0xef, 0xbd, 0x25}, + {0x03, 0xef, 0xbd, 0x23}, + {0x03, 0xef, 0xbd, 0x2e}, + {0x03, 0xef, 0xbe, 0x07}, + {0x03, 0xef, 0xbe, 0x05}, + {0x03, 0xef, 0xbd, 0x06}, + {0x03, 0xef, 0xbd, 0x13}, + {0x03, 0xef, 0xbd, 0x0b}, + {0x03, 0xef, 0xbd, 0x16}, + {0x03, 0xef, 0xbd, 0x0c}, + {0x03, 0xef, 0xbd, 0x15}, + {0x03, 0xef, 0xbd, 0x0d}, + {0x03, 0xef, 0xbd, 0x1c}, + {0x03, 0xef, 0xbd, 0x02}, + {0x03, 0xef, 0xbd, 0x1f}, + {0x03, 0xef, 0xbd, 0x1d}, + {0x03, 0xef, 0xbd, 0x17}, + {0x03, 0xef, 0xbd, 0x08}, + {0x03, 0xef, 0xbd, 0x09}, + {0x03, 0xef, 0xbd, 0x0e}, + {0x03, 0xef, 0xbd, 0x04}, + {0x03, 0xef, 0xbd, 0x05}, + {0x03, 0xef, 0xbe, 0x3f}, + {0x03, 0xef, 0xbe, 0x00}, + {0x03, 0xef, 0xbd, 0x2c}, + {0x03, 0xef, 0xbe, 0x06}, + {0x03, 0xef, 0xbe, 0x0c}, + {0x03, 0xef, 0xbe, 0x0f}, + {0x03, 0xef, 0xbe, 0x0d}, + {0x03, 0xef, 0xbe, 0x0b}, + {0x03, 0xef, 0xbe, 0x19}, + {0x03, 0xef, 0xbe, 0x15}, + {0x03, 0xef, 0xbe, 0x11}, + {0x03, 0xef, 0xbe, 0x31}, + {0x03, 0xef, 0xbe, 0x33}, + {0x03, 0xef, 0xbd, 0x0f}, + {0x03, 0xef, 0xbe, 0x30}, + {0x03, 0xef, 0xbe, 0x3e}, + {0x03, 0xef, 0xbe, 0x32}, + {0x03, 0xef, 0xbe, 0x36}, + {0x03, 0xef, 0xbd, 0x14}, + {0x03, 0xef, 0xbe, 0x2e}, + {0x03, 0xef, 0xbd, 0x1e}, + {0x03, 0xef, 0xbe, 0x10}, + {0x03, 0xef, 0xbf, 0x13}, + {0x03, 0xef, 0xbf, 0x15}, + {0x03, 0xef, 0xbf, 0x17}, + {0x03, 0xef, 0xbf, 0x1f}, + {0x03, 0xef, 0xbf, 0x1d}, + {0x03, 0xef, 0xbf, 0x1b}, + {0x03, 0xef, 0xbf, 0x09}, + {0x03, 0xef, 0xbf, 0x0b}, + {0x03, 0xef, 0xbf, 0x37}, + {0x03, 0xef, 0xbe, 0x04}, + {0x01, 0xe0, 0x00, 0x00}, + {0x03, 0xe2, 0xa6, 0x1a}, + {0x03, 0xe2, 0xa6, 0x26}, + {0x03, 0xe3, 0x80, 0x23}, + {0x03, 0xe3, 0x80, 0x2e}, + {0x03, 0xe3, 0x80, 0x25}, + {0x03, 0xe3, 0x83, 0x1e}, + {0x03, 0xe3, 0x83, 0x14}, + {0x03, 0xe3, 0x82, 0x06}, + {0x03, 0xe3, 0x82, 0x0b}, + {0x03, 0xe3, 0x82, 0x0c}, + {0x03, 0xe3, 0x82, 0x0d}, + {0x03, 0xe3, 0x82, 0x02}, + {0x03, 0xe3, 0x83, 0x0f}, + {0x03, 0xe3, 0x83, 0x08}, + {0x03, 0xe3, 0x83, 0x09}, + {0x03, 0xe3, 0x83, 0x2c}, + {0x03, 0xe3, 0x83, 0x0c}, + {0x03, 0xe3, 0x82, 0x13}, + {0x03, 0xe3, 0x82, 0x16}, + {0x03, 0xe3, 0x82, 0x15}, + {0x03, 0xe3, 0x82, 0x1c}, + {0x03, 0xe3, 0x82, 0x1f}, + {0x03, 0xe3, 0x82, 0x1d}, + {0x03, 0xe3, 0x82, 0x1a}, + {0x03, 0xe3, 0x82, 0x17}, + {0x03, 0xe3, 0x82, 0x08}, + {0x03, 0xe3, 0x82, 0x09}, + {0x03, 0xe3, 0x82, 0x0e}, + {0x03, 0xe3, 0x82, 0x04}, + {0x03, 0xe3, 0x82, 0x05}, + {0x03, 0xe3, 0x82, 0x3f}, + {0x03, 0xe3, 0x83, 0x00}, + {0x03, 0xe3, 0x83, 0x06}, + {0x03, 0xe3, 0x83, 0x05}, + {0x03, 0xe3, 0x83, 0x0d}, + {0x03, 0xe3, 0x83, 0x0b}, + {0x03, 0xe3, 0x83, 0x07}, + {0x03, 0xe3, 0x83, 0x19}, + {0x03, 0xe3, 0x83, 0x15}, + {0x03, 0xe3, 0x83, 0x11}, + {0x03, 0xe3, 0x83, 0x31}, + {0x03, 0xe3, 0x83, 0x33}, + {0x03, 0xe3, 0x83, 0x30}, + {0x03, 0xe3, 0x83, 0x3e}, + {0x03, 0xe3, 0x83, 0x32}, + {0x03, 0xe3, 0x83, 0x36}, + {0x03, 0xe3, 0x83, 0x2e}, + {0x03, 0xe3, 0x82, 0x07}, + {0x03, 0xe3, 0x85, 0x04}, + {0x03, 0xe3, 0x84, 0x10}, + {0x03, 0xe3, 0x85, 0x30}, + {0x03, 0xe3, 0x85, 0x0d}, + {0x03, 0xe3, 0x85, 0x13}, + {0x03, 0xe3, 0x85, 0x15}, + {0x03, 0xe3, 0x85, 0x17}, + {0x03, 0xe3, 0x85, 0x1f}, + {0x03, 0xe3, 0x85, 0x1d}, + {0x03, 0xe3, 0x85, 0x1b}, + {0x03, 0xe3, 0x85, 0x09}, + {0x03, 0xe3, 0x85, 0x0f}, + {0x03, 0xe3, 0x85, 0x0b}, + {0x03, 0xe3, 0x85, 0x37}, + {0x03, 0xe3, 0x85, 0x3b}, + {0x03, 0xe3, 0x85, 0x39}, + {0x03, 0xe3, 0x85, 0x3f}, + {0x02, 0xc2, 0x02, 0x00}, + {0x02, 0xc2, 0x0e, 0x00}, + {0x02, 0xc2, 0x0c, 0x00}, + {0x02, 0xc2, 0x00, 0x00}, + {0x03, 0xe2, 0x82, 0x0f}, + {0x03, 0xe2, 0x94, 0x2a}, + {0x03, 0xe2, 0x86, 0x39}, + {0x03, 0xe2, 0x86, 0x3b}, + {0x03, 0xe2, 0x86, 0x3f}, + {0x03, 0xe2, 0x96, 0x0d}, + {0x03, 0xe2, 0x97, 0x25}, +} + +// Total table size 11480 bytes (11KiB) diff --git a/vendor/golang.org/x/text/width/tables_test.go b/vendor/golang.org/x/text/width/tables_test.go new file mode 100644 index 0000000000..189febd3cb --- /dev/null +++ b/vendor/golang.org/x/text/width/tables_test.go @@ -0,0 +1,59 @@ +// 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 width + +import ( + "testing" + + "golang.org/x/text/internal/testtext" +) + +const ( + loSurrogate = 0xD800 + hiSurrogate = 0xDFFF +) + +func TestTables(t *testing.T) { + testtext.SkipIfNotLong(t) + + runes := map[rune]Kind{} + getWidthData(func(r rune, tag elem, _ rune) { + runes[r] = tag.kind() + }) + for r := rune(0); r < 0x10FFFF; r++ { + if loSurrogate <= r && r <= hiSurrogate { + continue + } + p := LookupRune(r) + if got, want := p.Kind(), runes[r]; got != want { + t.Errorf("Kind of %U was %s; want %s.", r, got, want) + } + want, mapped := foldRune(r) + if got := p.Folded(); (got == 0) == mapped || got != 0 && got != want { + t.Errorf("Folded(%U) = %U; want %U", r, got, want) + } + want, mapped = widenRune(r) + if got := p.Wide(); (got == 0) == mapped || got != 0 && got != want { + t.Errorf("Wide(%U) = %U; want %U", r, got, want) + } + want, mapped = narrowRune(r) + if got := p.Narrow(); (got == 0) == mapped || got != 0 && got != want { + t.Errorf("Narrow(%U) = %U; want %U", r, got, want) + } + } +} + +// TestAmbiguous verifies that that ambiguous runes with a mapping always map to +// a halfwidth rune. +func TestAmbiguous(t *testing.T) { + for r, m := range mapRunes { + if m.e != tagAmbiguous { + continue + } + if k := mapRunes[m.r].e.kind(); k != EastAsianHalfwidth { + t.Errorf("Rune %U is ambiguous and maps to a rune of type %v", r, k) + } + } +} diff --git a/vendor/golang.org/x/text/width/transform.go b/vendor/golang.org/x/text/width/transform.go new file mode 100644 index 0000000000..8dd731c547 --- /dev/null +++ b/vendor/golang.org/x/text/width/transform.go @@ -0,0 +1,150 @@ +// 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 width + +import ( + "unicode/utf8" + + "golang.org/x/text/transform" +) + +type foldTransform struct { + transform.NopResetter +} + +func (foldTransform) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + for nSrc < len(src) { + if src[nSrc] < utf8.RuneSelf { + // ASCII fast path. + start, end := nSrc, len(src) + if d := len(dst) - nDst; d < end-start { + end = nSrc + d + } + for nSrc++; nSrc < end && src[nSrc] < utf8.RuneSelf; nSrc++ { + } + nDst += copy(dst[nDst:], src[start:nSrc]) + if nDst == len(dst) && nSrc < len(src) && src[nSrc] < utf8.RuneSelf { + return nDst, nSrc, transform.ErrShortDst + } + continue + } + v, size := trie.lookup(src[nSrc:]) + if size == 0 { // incomplete UTF-8 encoding + if !atEOF { + return nDst, nSrc, transform.ErrShortSrc + } + size = 1 // gobble 1 byte + } + if elem(v)&tagNeedsFold == 0 { + if size != copy(dst[nDst:], src[nSrc:nSrc+size]) { + return nDst, nSrc, transform.ErrShortDst + } + nDst += size + } else { + data := inverseData[byte(v)] + if len(dst)-nDst < int(data[0]) { + return nDst, nSrc, transform.ErrShortDst + } + i := 1 + for end := int(data[0]); i < end; i++ { + dst[nDst] = data[i] + nDst++ + } + dst[nDst] = data[i] ^ src[nSrc+size-1] + nDst++ + } + nSrc += size + } + return nDst, nSrc, nil +} + +type narrowTransform struct { + transform.NopResetter +} + +func (narrowTransform) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + for nSrc < len(src) { + if src[nSrc] < utf8.RuneSelf { + // ASCII fast path. + start, end := nSrc, len(src) + if d := len(dst) - nDst; d < end-start { + end = nSrc + d + } + for nSrc++; nSrc < end && src[nSrc] < utf8.RuneSelf; nSrc++ { + } + nDst += copy(dst[nDst:], src[start:nSrc]) + if nDst == len(dst) && nSrc < len(src) && src[nSrc] < utf8.RuneSelf { + return nDst, nSrc, transform.ErrShortDst + } + continue + } + v, size := trie.lookup(src[nSrc:]) + if size == 0 { // incomplete UTF-8 encoding + if !atEOF { + return nDst, nSrc, transform.ErrShortSrc + } + size = 1 // gobble 1 byte + } + if k := elem(v).kind(); byte(v) == 0 || k != EastAsianFullwidth && k != EastAsianWide && k != EastAsianAmbiguous { + if size != copy(dst[nDst:], src[nSrc:nSrc+size]) { + return nDst, nSrc, transform.ErrShortDst + } + nDst += size + } else { + data := inverseData[byte(v)] + if len(dst)-nDst < int(data[0]) { + return nDst, nSrc, transform.ErrShortDst + } + i := 1 + for end := int(data[0]); i < end; i++ { + dst[nDst] = data[i] + nDst++ + } + dst[nDst] = data[i] ^ src[nSrc+size-1] + nDst++ + } + nSrc += size + } + return nDst, nSrc, nil +} + +type wideTransform struct { + transform.NopResetter +} + +func (wideTransform) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + for nSrc < len(src) { + // TODO: Consider ASCII fast path. Special-casing ASCII handling can + // reduce the ns/op of BenchmarkWideASCII by about 30%. This is probably + // not enough to warrant the extra code and complexity. + v, size := trie.lookup(src[nSrc:]) + if size == 0 { // incomplete UTF-8 encoding + if !atEOF { + return nDst, nSrc, transform.ErrShortSrc + } + size = 1 // gobble 1 byte + } + if k := elem(v).kind(); byte(v) == 0 || k != EastAsianHalfwidth && k != EastAsianNarrow { + if size != copy(dst[nDst:], src[nSrc:nSrc+size]) { + return nDst, nSrc, transform.ErrShortDst + } + nDst += size + } else { + data := inverseData[byte(v)] + if len(dst)-nDst < int(data[0]) { + return nDst, nSrc, transform.ErrShortDst + } + i := 1 + for end := int(data[0]); i < end; i++ { + dst[nDst] = data[i] + nDst++ + } + dst[nDst] = data[i] ^ src[nSrc+size-1] + nDst++ + } + nSrc += size + } + return nDst, nSrc, nil +} diff --git a/vendor/golang.org/x/text/width/transform_test.go b/vendor/golang.org/x/text/width/transform_test.go new file mode 100644 index 0000000000..535f24d4dd --- /dev/null +++ b/vendor/golang.org/x/text/width/transform_test.go @@ -0,0 +1,467 @@ +// 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 width + +import ( + "bytes" + "testing" + + "golang.org/x/text/internal/testtext" + "golang.org/x/text/transform" +) + +func foldRune(r rune) (folded rune, ok bool) { + alt, ok := mapRunes[r] + if ok && alt.e&tagNeedsFold != 0 { + return alt.r, true + } + return r, false +} + +func widenRune(r rune) (wide rune, ok bool) { + alt, ok := mapRunes[r] + if k := alt.e.kind(); k == EastAsianHalfwidth || k == EastAsianNarrow { + return alt.r, true + } + return r, false +} + +func narrowRune(r rune) (narrow rune, ok bool) { + alt, ok := mapRunes[r] + if k := alt.e.kind(); k == EastAsianFullwidth || k == EastAsianWide || k == EastAsianAmbiguous { + return alt.r, true + } + return r, false +} + +func TestFoldSingleRunes(t *testing.T) { + for r := rune(0); r < 0x1FFFF; r++ { + if loSurrogate <= r && r <= hiSurrogate { + continue + } + x, _ := foldRune(r) + want := string(x) + got := Fold.String(string(r)) + if got != want { + t.Errorf("Fold().String(%U) = %+q; want %+q", r, got, want) + } + } +} + +func TestFold(t *testing.T) { + for _, tc := range []struct { + desc string + src string + nDst int + atEOF bool + dst string + nSrc int + err error + }{{ + desc: "empty", + src: "", + dst: "", + nDst: 10, + nSrc: 0, + atEOF: false, + err: nil, + }, { + desc: "short source 1", + src: "a\xc2", + dst: "a", + nDst: 10, + nSrc: 1, + atEOF: false, + err: transform.ErrShortSrc, + }, { + desc: "short source 2", + src: "a\xe0\x80", + dst: "a", + nDst: 10, + nSrc: 1, + atEOF: false, + err: transform.ErrShortSrc, + }, { + desc: "incomplete but terminated source 1", + src: "a\xc2", + dst: "a\xc2", + nDst: 10, + nSrc: 2, + atEOF: true, + err: nil, + }, { + desc: "incomplete but terminated source 2", + src: "a\xe0\x80", + dst: "a\xe0\x80", + nDst: 10, + nSrc: 3, + atEOF: true, + err: nil, + }, { + desc: "exact fit dst", + src: "a\uff01", + dst: "a!", + nDst: 2, + nSrc: 4, + atEOF: false, + err: nil, + }, { + desc: "short dst 1", + src: "a\uffe0", + dst: "a", + nDst: 2, + nSrc: 1, + atEOF: false, + err: transform.ErrShortDst, + }, { + desc: "short dst 2", + src: "不夠", + dst: "不", + nDst: 3, + nSrc: 3, + atEOF: true, + err: transform.ErrShortDst, + }, { + desc: "short dst fast path", + src: "fast", + dst: "fas", + nDst: 3, + nSrc: 3, + atEOF: true, + err: transform.ErrShortDst, + }, { + desc: "fast path alternation", + src: "fast路徑fast路徑", + dst: "fast路徑fast路徑", + nDst: 20, + nSrc: 20, + atEOF: true, + err: nil, + }} { + b := make([]byte, tc.nDst) + nDst, nSrc, err := Fold.Transform(b, []byte(tc.src), tc.atEOF) + if got := string(b[:nDst]); got != tc.dst { + t.Errorf("%s: dst was %+q; want %+q", tc.desc, got, tc.dst) + } + if nSrc != tc.nSrc { + t.Errorf("%s: nSrc was %d; want %d", tc.desc, nSrc, tc.nSrc) + } + if err != tc.err { + t.Errorf("%s: error was %v; want %v", tc.desc, err, tc.err) + } + } +} + +func TestWidenSingleRunes(t *testing.T) { + for r := rune(0); r < 0x1FFFF; r++ { + if loSurrogate <= r && r <= hiSurrogate { + continue + } + alt, _ := widenRune(r) + want := string(alt) + got := Widen.String(string(r)) + if got != want { + t.Errorf("Widen().String(%U) = %+q; want %+q", r, got, want) + } + } +} + +func TestWiden(t *testing.T) { + for _, tc := range []struct { + desc string + src string + nDst int + atEOF bool + dst string + nSrc int + err error + }{{ + desc: "empty", + src: "", + dst: "", + nDst: 10, + nSrc: 0, + atEOF: false, + err: nil, + }, { + desc: "short source 1", + src: "a\xc2", + dst: "a", + nDst: 10, + nSrc: 1, + atEOF: false, + err: transform.ErrShortSrc, + }, { + desc: "short source 2", + src: "a\xe0\x80", + dst: "a", + nDst: 10, + nSrc: 1, + atEOF: false, + err: transform.ErrShortSrc, + }, { + desc: "incomplete but terminated source 1", + src: "a\xc2", + dst: "a\xc2", + nDst: 10, + nSrc: 2, + atEOF: true, + err: nil, + }, { + desc: "incomplete but terminated source 2", + src: "a\xe0\x80", + dst: "a\xe0\x80", + nDst: 10, + nSrc: 3, + atEOF: true, + err: nil, + }, { + desc: "exact fit dst", + src: "a!", + dst: "a\uff01", + nDst: 6, + nSrc: 2, + atEOF: false, + err: nil, + }, { + desc: "short dst 1", + src: "a\uffe0", + dst: "a", + nDst: 4, + nSrc: 1, + atEOF: false, + err: transform.ErrShortDst, + }, { + desc: "short dst 2", + src: "不夠", + dst: "不", + nDst: 3, + nSrc: 3, + atEOF: true, + err: transform.ErrShortDst, + }, { + desc: "short dst ascii", + src: "ascii", + dst: "\uff41", + nDst: 3, + nSrc: 1, + atEOF: true, + err: transform.ErrShortDst, + }, { + desc: "ambiguous", + src: "\uffe9", + dst: "\u2190", + nDst: 4, + nSrc: 3, + atEOF: false, + err: nil, + }} { + b := make([]byte, tc.nDst) + nDst, nSrc, err := Widen.Transform(b, []byte(tc.src), tc.atEOF) + if got := string(b[:nDst]); got != tc.dst { + t.Errorf("%s: dst was %+q; want %+q", tc.desc, got, tc.dst) + } + if nSrc != tc.nSrc { + t.Errorf("%s: nSrc was %d; want %d", tc.desc, nSrc, tc.nSrc) + } + if err != tc.err { + t.Errorf("%s: error was %v; want %v", tc.desc, err, tc.err) + } + } +} + +func TestNarrowSingleRunes(t *testing.T) { + for r := rune(0); r < 0x1FFFF; r++ { + if loSurrogate <= r && r <= hiSurrogate { + continue + } + alt, _ := narrowRune(r) + want := string(alt) + got := Narrow.String(string(r)) + if got != want { + t.Errorf("Narrow().String(%U) = %+q; want %+q", r, got, want) + } + } +} + +func TestNarrow(t *testing.T) { + for _, tc := range []struct { + desc string + src string + nDst int + atEOF bool + dst string + nSrc int + err error + }{{ + desc: "empty", + src: "", + dst: "", + nDst: 10, + nSrc: 0, + atEOF: false, + err: nil, + }, { + desc: "short source 1", + src: "a\xc2", + dst: "a", + nDst: 10, + nSrc: 1, + atEOF: false, + err: transform.ErrShortSrc, + }, { + desc: "short source 2", + src: "a\xe0\x80", + dst: "a", + nDst: 10, + nSrc: 3, + atEOF: false, + err: transform.ErrShortSrc, + }, { + desc: "incomplete but terminated source 1", + src: "a\xc2", + dst: "a\xc2", + nDst: 10, + nSrc: 4, + atEOF: true, + err: nil, + }, { + desc: "incomplete but terminated source 2", + src: "a\xe0\x80", + dst: "a\xe0\x80", + nDst: 10, + nSrc: 5, + atEOF: true, + err: nil, + }, { + desc: "exact fit dst", + src: "a\uff01", + dst: "a!", + nDst: 2, + nSrc: 6, + atEOF: false, + err: nil, + }, { + desc: "short dst 1", + src: "a\uffe0", + dst: "a", + nDst: 2, + nSrc: 3, + atEOF: false, + err: transform.ErrShortDst, + }, { + desc: "short dst 2", + src: "不夠", + dst: "不", + nDst: 3, + nSrc: 3, + atEOF: true, + err: transform.ErrShortDst, + }, { + // Create a narrow variant of ambiguous runes, if they exist. + desc: "ambiguous", + src: "\u2190", + dst: "\uffe9", + nDst: 4, + nSrc: 3, + atEOF: false, + err: nil, + }, { + desc: "short dst fast path", + src: "fast", + dst: "fas", + nDst: 3, + nSrc: 3, + atEOF: true, + err: transform.ErrShortDst, + }, { + desc: "fast path alternation", + src: "fast路徑fast路徑", + dst: "fast路徑fast路徑", + nDst: 20, + nSrc: 20, + atEOF: true, + err: nil, + }} { + b := make([]byte, tc.nDst) + nDst, nSrc, err := Narrow.Transform(b, []byte(tc.src), tc.atEOF) + if got := string(b[:nDst]); got != tc.dst { + t.Errorf("%s: dst was %+q; want %+q", tc.desc, got, tc.dst) + } + if nSrc != tc.nSrc { + t.Errorf("%s: nSrc was %d; want %d", tc.desc, nSrc, tc.nSrc) + } + if err != tc.err { + t.Errorf("%s: error was %v; want %v", tc.desc, err, tc.err) + } + } +} +func bench(b *testing.B, t Transformer, s string) { + dst := make([]byte, 1024) + src := []byte(s) + b.SetBytes(int64(len(src))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + t.Transform(dst, src, true) + } +} + +func changingRunes(f func(r rune) (rune, bool)) string { + buf := &bytes.Buffer{} + for r := rune(0); r <= 0xFFFF; r++ { + if _, ok := foldRune(r); ok { + buf.WriteRune(r) + } + } + return buf.String() +} + +func BenchmarkFoldASCII(b *testing.B) { + bench(b, Fold, testtext.ASCII) +} + +func BenchmarkFoldCJK(b *testing.B) { + bench(b, Fold, testtext.CJK) +} + +func BenchmarkFoldNonCanonical(b *testing.B) { + bench(b, Fold, changingRunes(foldRune)) +} + +func BenchmarkFoldOther(b *testing.B) { + bench(b, Fold, testtext.TwoByteUTF8+testtext.ThreeByteUTF8) +} + +func BenchmarkWideASCII(b *testing.B) { + bench(b, Widen, testtext.ASCII) +} + +func BenchmarkWideCJK(b *testing.B) { + bench(b, Widen, testtext.CJK) +} + +func BenchmarkWideNonCanonical(b *testing.B) { + bench(b, Widen, changingRunes(widenRune)) +} + +func BenchmarkWideOther(b *testing.B) { + bench(b, Widen, testtext.TwoByteUTF8+testtext.ThreeByteUTF8) +} + +func BenchmarkNarrowASCII(b *testing.B) { + bench(b, Narrow, testtext.ASCII) +} + +func BenchmarkNarrowCJK(b *testing.B) { + bench(b, Narrow, testtext.CJK) +} + +func BenchmarkNarrowNonCanonical(b *testing.B) { + bench(b, Narrow, changingRunes(narrowRune)) +} + +func BenchmarkNarrowOther(b *testing.B) { + bench(b, Narrow, testtext.TwoByteUTF8+testtext.ThreeByteUTF8) +} diff --git a/vendor/golang.org/x/text/width/trieval.go b/vendor/golang.org/x/text/width/trieval.go new file mode 100644 index 0000000000..0ecffb4c64 --- /dev/null +++ b/vendor/golang.org/x/text/width/trieval.go @@ -0,0 +1,30 @@ +// This file was generated by go generate; DO NOT EDIT + +package width + +// elem is an entry of the width trie. The high byte is used to encode the type +// of the rune. The low byte is used to store the index to a mapping entry in +// the inverseData array. +type elem uint16 + +const ( + tagNeutral elem = iota << typeShift + tagAmbiguous + tagWide + tagNarrow + tagFullwidth + tagHalfwidth +) + +const ( + numTypeBits = 3 + typeShift = 16 - numTypeBits + + // tagNeedsFold is true for all fullwidth and halfwidth runes except for + // the Won sign U+20A9. + tagNeedsFold = 0x1000 + + // The Korean Won sign is halfwidth, but SHOULD NOT be mapped to a wide + // variant. + wonSign rune = 0x20A9 +) diff --git a/vendor/golang.org/x/text/width/width.go b/vendor/golang.org/x/text/width/width.go new file mode 100644 index 0000000000..dc026eef6b --- /dev/null +++ b/vendor/golang.org/x/text/width/width.go @@ -0,0 +1,201 @@ +// 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. + +//go:generate stringer -type=Kind +//go:generate go run gen.go gen_common.go gen_trieval.go + +// Package width provides functionality for handling different widths in text. +// +// Wide characters behave like ideographs; they tend to allow line breaks after +// each character and remain upright in vertical text layout. Narrow characters +// are kept together in words or runs that are rotated sideways in vertical text +// layout. +// +// For more information, see http://unicode.org/reports/tr11/. +package width // import "golang.org/x/text/width" + +import ( + "unicode/utf8" + + "golang.org/x/text/transform" +) + +// TODO +// 1) Reduce table size by compressing blocks. +// 2) API proposition for computing display length +// (approximation, fixed pitch only). +// 3) Implement display length. + +// Kind indicates the type of width property as defined in http://unicode.org/reports/tr11/. +type Kind int + +const ( + // Neutral characters do not occur in legacy East Asian character sets. + Neutral Kind = iota + + // EastAsianAmbiguous characters that can be sometimes wide and sometimes + // narrow and require additional information not contained in the character + // code to further resolve their width. + EastAsianAmbiguous + + // EastAsianWide characters are wide in its usual form. They occur only in + // the context of East Asian typography. These runes may have explicit + // halfwidth counterparts. + EastAsianWide + + // EastAsianNarrow characters are narrow in its usual form. They often have + // fullwidth counterparts. + EastAsianNarrow + + // Note: there exist Narrow runes that do not have fullwidth or wide + // counterparts, despite what the definition says (e.g. U+27E6). + + // EastAsianFullwidth characters have a compatibility decompositions of type + // wide that map to a narrow counterpart. + EastAsianFullwidth + + // EastAsianHalfwidth characters have a compatibility decomposition of type + // narrow that map to a wide or ambiguous counterpart, plus U+20A9 ₩ WON + // SIGN. + EastAsianHalfwidth + + // Note: there exist runes that have a halfwidth counterparts but that are + // classified as Ambiguous, rather than wide (e.g. U+2190). +) + +// TODO: the generated tries need to return size 1 for invalid runes for the +// width to be computed correctly (each byte should render width 1) + +var trie = newWidthTrie(0) + +// Lookup reports the Properties of the first rune in b and the number of bytes +// of its UTF-8 encoding. +func Lookup(b []byte) (p Properties, size int) { + v, sz := trie.lookup(b) + return Properties{elem(v), b[sz-1]}, sz +} + +// LookupString reports the Properties of the first rune in s and the number of +// bytes of its UTF-8 encoding. +func LookupString(s string) (p Properties, size int) { + v, sz := trie.lookupString(s) + return Properties{elem(v), s[sz-1]}, sz +} + +// LookupRune reports the Properties of rune r. +func LookupRune(r rune) Properties { + var buf [4]byte + n := utf8.EncodeRune(buf[:], r) + v, _ := trie.lookup(buf[:n]) + last := byte(r) + if r >= utf8.RuneSelf { + last = 0x80 + byte(r&0x3f) + } + return Properties{elem(v), last} +} + +// Properties provides access to width properties of a rune. +type Properties struct { + elem elem + last byte +} + +func (e elem) kind() Kind { + return Kind(e >> typeShift) +} + +// Kind returns the Kind of a rune as defined in Unicode TR #11. +// See http://unicode.org/reports/tr11/ for more details. +func (p Properties) Kind() Kind { + return p.elem.kind() +} + +// Folded returns the folded variant of a rune or 0 if the rune is canonical. +func (p Properties) Folded() rune { + if p.elem&tagNeedsFold != 0 { + buf := inverseData[byte(p.elem)] + buf[buf[0]] ^= p.last + r, _ := utf8.DecodeRune(buf[1 : 1+buf[0]]) + return r + } + return 0 +} + +// Narrow returns the narrow variant of a rune or 0 if the rune is already +// narrow or doesn't have a narrow variant. +func (p Properties) Narrow() rune { + if k := p.elem.kind(); byte(p.elem) != 0 && (k == EastAsianFullwidth || k == EastAsianWide || k == EastAsianAmbiguous) { + buf := inverseData[byte(p.elem)] + buf[buf[0]] ^= p.last + r, _ := utf8.DecodeRune(buf[1 : 1+buf[0]]) + return r + } + return 0 +} + +// Wide returns the wide variant of a rune or 0 if the rune is already +// wide or doesn't have a wide variant. +func (p Properties) Wide() rune { + if k := p.elem.kind(); byte(p.elem) != 0 && (k == EastAsianHalfwidth || k == EastAsianNarrow) { + buf := inverseData[byte(p.elem)] + buf[buf[0]] ^= p.last + r, _ := utf8.DecodeRune(buf[1 : 1+buf[0]]) + return r + } + return 0 +} + +// TODO for Properties: +// - Add Fullwidth/Halfwidth or Inverted methods for computing variants +// mapping. +// - Add width information (including information on non-spacing runes). + +// Transformer implements the transform.Transformer interface. +type Transformer struct { + t transform.Transformer +} + +// Reset implements the transform.Transformer interface. +func (t Transformer) Reset() { t.t.Reset() } + +// Transform implements the Transformer interface. +func (t Transformer) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + return t.t.Transform(dst, src, atEOF) +} + +// Bytes returns a new byte slice with the result of applying t to b. +func (t Transformer) Bytes(b []byte) []byte { + b, _, _ = transform.Bytes(t, b) + return b +} + +// String returns a string with the result of applying t to s. +func (t Transformer) String(s string) string { + s, _, _ = transform.String(t, s) + return s +} + +var ( + // Fold is a transform that maps all runes to their canonical width. + // + // Note that the NFKC and NFKD transforms in golang.org/x/text/unicode/norm + // provide a more generic folding mechanism. + Fold Transformer = Transformer{foldTransform{}} + + // Widen is a transform that maps runes to their wide variant, if + // available. + Widen Transformer = Transformer{wideTransform{}} + + // Narrow is a transform that maps runes to their narrow variant, if + // available. + Narrow Transformer = Transformer{narrowTransform{}} +) + +// TODO: Consider the following options: +// - Treat Ambiguous runes that have a halfwidth counterpart as wide, or some +// generalized variant of this. +// - Consider a wide Won character to be the default width (or some generalized +// variant of this). +// - Filter the set of characters that gets converted (the preferred approach is +// to allow applying filters to transforms). diff --git a/vendor/golang.org/x/tools/.gitattributes b/vendor/golang.org/x/tools/.gitattributes new file mode 100644 index 0000000000..d2f212e5da --- /dev/null +++ b/vendor/golang.org/x/tools/.gitattributes @@ -0,0 +1,10 @@ +# Treat all files in this repo as binary, with no git magic updating +# line endings. Windows users contributing to Go will need to use a +# modern version of git and editors capable of LF line endings. +# +# We'll prevent accidental CRLF line endings from entering the repo +# via the git-review gofmt checks. +# +# See golang.org/issue/9281 + +* -text diff --git a/vendor/golang.org/x/tools/.gitignore b/vendor/golang.org/x/tools/.gitignore new file mode 100644 index 0000000000..5a9d62efd4 --- /dev/null +++ b/vendor/golang.org/x/tools/.gitignore @@ -0,0 +1,2 @@ +# Add no patterns to .gitignore except for files generated by the build. +last-change diff --git a/vendor/golang.org/x/tools/AUTHORS b/vendor/golang.org/x/tools/AUTHORS new file mode 100644 index 0000000000..15167cd746 --- /dev/null +++ b/vendor/golang.org/x/tools/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/tools/CONTRIBUTING.md b/vendor/golang.org/x/tools/CONTRIBUTING.md new file mode 100644 index 0000000000..88dff59bc7 --- /dev/null +++ b/vendor/golang.org/x/tools/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# Contributing to Go + +Go is an open source project. + +It is the work of hundreds of contributors. We appreciate your help! + + +## Filing issues + +When [filing an issue](https://golang.org/issue/new), make sure to answer these five questions: + +1. What version of Go are you using (`go version`)? +2. What operating system and processor architecture are you using? +3. What did you do? +4. What did you expect to see? +5. What did you see instead? + +General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker. +The gophers there will answer or ask you to file an issue if you've tripped over a bug. + +## Contributing code + +Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html) +before sending patches. + +**We do not accept GitHub pull requests** +(we use [Gerrit](https://code.google.com/p/gerrit/) instead for code review). + +Unless otherwise noted, the Go source files are distributed under +the BSD-style license found in the LICENSE file. + diff --git a/vendor/golang.org/x/tools/CONTRIBUTORS b/vendor/golang.org/x/tools/CONTRIBUTORS new file mode 100644 index 0000000000..1c4577e968 --- /dev/null +++ b/vendor/golang.org/x/tools/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/tools/LICENSE b/vendor/golang.org/x/tools/LICENSE new file mode 100644 index 0000000000..6a66aea5ea --- /dev/null +++ b/vendor/golang.org/x/tools/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/tools/PATENTS b/vendor/golang.org/x/tools/PATENTS new file mode 100644 index 0000000000..733099041f --- /dev/null +++ b/vendor/golang.org/x/tools/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/tools/README b/vendor/golang.org/x/tools/README new file mode 100644 index 0000000000..916ae2e6ca --- /dev/null +++ b/vendor/golang.org/x/tools/README @@ -0,0 +1,10 @@ +This subrepository holds the source for various packages and tools that support +the Go programming language. + +Some of the tools, godoc and vet for example, are included in binary Go distributions. +Others, including the Go oracle and the test coverage tool, can be fetched with "go get". + +Packages include a type-checker for Go and an implementation of the +Static Single Assignment form (SSA) representation for Go programs. + +To submit changes to this repository, see http://golang.org/doc/contribute.html. diff --git a/vendor/golang.org/x/tools/benchmark/parse/parse.go b/vendor/golang.org/x/tools/benchmark/parse/parse.go new file mode 100644 index 0000000000..b37e6f0f97 --- /dev/null +++ b/vendor/golang.org/x/tools/benchmark/parse/parse.go @@ -0,0 +1,131 @@ +// 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 parse provides support for parsing benchmark results as +// generated by 'go test -bench'. +package parse // import "golang.org/x/tools/benchmark/parse" + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strconv" + "strings" +) + +// Flags used by Benchmark.Measured to indicate +// which measurements a Benchmark contains. +const ( + NsPerOp = 1 << iota + MBPerS + AllocedBytesPerOp + AllocsPerOp +) + +// Benchmark is one run of a single benchmark. +type Benchmark struct { + Name string // benchmark name + N int // number of iterations + NsPerOp float64 // nanoseconds per iteration + AllocedBytesPerOp uint64 // bytes allocated per iteration + AllocsPerOp uint64 // allocs per iteration + MBPerS float64 // MB processed per second + Measured int // which measurements were recorded + Ord int // ordinal position within a benchmark run +} + +// ParseLine extracts a Benchmark from a single line of testing.B +// output. +func ParseLine(line string) (*Benchmark, error) { + fields := strings.Fields(line) + + // Two required, positional fields: Name and iterations. + if len(fields) < 2 { + return nil, fmt.Errorf("two fields required, have %d", len(fields)) + } + if !strings.HasPrefix(fields[0], "Benchmark") { + return nil, fmt.Errorf(`first field does not start with "Benchmark"`) + } + n, err := strconv.Atoi(fields[1]) + if err != nil { + return nil, err + } + b := &Benchmark{Name: fields[0], N: n} + + // Parse any remaining pairs of fields; we've parsed one pair already. + for i := 1; i < len(fields)/2; i++ { + b.parseMeasurement(fields[i*2], fields[i*2+1]) + } + return b, nil +} + +func (b *Benchmark) parseMeasurement(quant string, unit string) { + switch unit { + case "ns/op": + if f, err := strconv.ParseFloat(quant, 64); err == nil { + b.NsPerOp = f + b.Measured |= NsPerOp + } + case "MB/s": + if f, err := strconv.ParseFloat(quant, 64); err == nil { + b.MBPerS = f + b.Measured |= MBPerS + } + case "B/op": + if i, err := strconv.ParseUint(quant, 10, 64); err == nil { + b.AllocedBytesPerOp = i + b.Measured |= AllocedBytesPerOp + } + case "allocs/op": + if i, err := strconv.ParseUint(quant, 10, 64); err == nil { + b.AllocsPerOp = i + b.Measured |= AllocsPerOp + } + } +} + +func (b *Benchmark) String() string { + buf := new(bytes.Buffer) + fmt.Fprintf(buf, "%s %d", b.Name, b.N) + if (b.Measured & NsPerOp) != 0 { + fmt.Fprintf(buf, " %.2f ns/op", b.NsPerOp) + } + if (b.Measured & MBPerS) != 0 { + fmt.Fprintf(buf, " %.2f MB/s", b.MBPerS) + } + if (b.Measured & AllocedBytesPerOp) != 0 { + fmt.Fprintf(buf, " %d B/op", b.AllocedBytesPerOp) + } + if (b.Measured & AllocsPerOp) != 0 { + fmt.Fprintf(buf, " %d allocs/op", b.AllocsPerOp) + } + return buf.String() +} + +// Set is a collection of benchmarks from one +// testing.B run, keyed by name to facilitate comparison. +type Set map[string][]*Benchmark + +// ParseSet extracts a Set from testing.B output. +// ParseSet preserves the order of benchmarks that have identical +// names. +func ParseSet(r io.Reader) (Set, error) { + bb := make(Set) + scan := bufio.NewScanner(r) + ord := 0 + for scan.Scan() { + if b, err := ParseLine(scan.Text()); err == nil { + b.Ord = ord + ord++ + bb[b.Name] = append(bb[b.Name], b) + } + } + + if err := scan.Err(); err != nil { + return nil, err + } + + return bb, nil +} diff --git a/vendor/golang.org/x/tools/benchmark/parse/parse_test.go b/vendor/golang.org/x/tools/benchmark/parse/parse_test.go new file mode 100644 index 0000000000..06db8489d6 --- /dev/null +++ b/vendor/golang.org/x/tools/benchmark/parse/parse_test.go @@ -0,0 +1,154 @@ +// 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 parse + +import ( + "reflect" + "strings" + "testing" +) + +func TestParseLine(t *testing.T) { + cases := []struct { + line string + want *Benchmark + err bool // expect an error + }{ + { + line: "BenchmarkEncrypt 100000000 19.6 ns/op", + want: &Benchmark{ + Name: "BenchmarkEncrypt", + N: 100000000, NsPerOp: 19.6, + Measured: NsPerOp, + }, + }, + { + line: "BenchmarkEncrypt 100000000 19.6 ns/op 817.77 MB/s", + want: &Benchmark{ + Name: "BenchmarkEncrypt", + N: 100000000, NsPerOp: 19.6, MBPerS: 817.77, + Measured: NsPerOp | MBPerS, + }, + }, + { + line: "BenchmarkEncrypt 100000000 19.6 ns/op 817.77", + want: &Benchmark{ + Name: "BenchmarkEncrypt", + N: 100000000, NsPerOp: 19.6, + Measured: NsPerOp, + }, + }, + { + line: "BenchmarkEncrypt 100000000 19.6 ns/op 817.77 MB/s 5 allocs/op", + want: &Benchmark{ + Name: "BenchmarkEncrypt", + N: 100000000, NsPerOp: 19.6, MBPerS: 817.77, AllocsPerOp: 5, + Measured: NsPerOp | MBPerS | AllocsPerOp, + }, + }, + { + line: "BenchmarkEncrypt 100000000 19.6 ns/op 817.77 MB/s 3 B/op 5 allocs/op", + want: &Benchmark{ + Name: "BenchmarkEncrypt", + N: 100000000, NsPerOp: 19.6, MBPerS: 817.77, AllocedBytesPerOp: 3, AllocsPerOp: 5, + Measured: NsPerOp | MBPerS | AllocedBytesPerOp | AllocsPerOp, + }, + }, + // error handling cases + { + line: "BenchPress 100 19.6 ns/op", // non-benchmark + err: true, + }, + { + line: "BenchmarkEncrypt lots 19.6 ns/op", // non-int iterations + err: true, + }, + { + line: "BenchmarkBridge 100000000 19.6 smoots", // unknown unit + want: &Benchmark{ + Name: "BenchmarkBridge", + N: 100000000, + }, + }, + { + line: "PASS", + err: true, + }, + } + + for _, tt := range cases { + have, err := ParseLine(tt.line) + if tt.err && err == nil { + t.Errorf("parsing line %q should have failed", tt.line) + continue + } + if !reflect.DeepEqual(have, tt.want) { + t.Errorf("parsed line %q incorrectly, want %v have %v", tt.line, tt.want, have) + } + } +} + +func TestParseSet(t *testing.T) { + // Test two things: + // 1. The noise that can accompany testing.B output gets ignored. + // 2. Benchmarks with the same name have their order preserved. + in := ` + ? crypto [no test files] + PASS + pem_decrypt_test.go:17: test 4. %!s(x509.PEMCipher=5) + ... [output truncated] + + BenchmarkEncrypt 100000000 19.6 ns/op + BenchmarkEncrypt 5000000 517 ns/op + === RUN TestChunk + --- PASS: TestChunk (0.00 seconds) + --- SKIP: TestLinuxSendfile (0.00 seconds) + fs_test.go:716: skipping; linux-only test + BenchmarkReadRequestApachebench 1000000 2960 ns/op 27.70 MB/s 839 B/op 9 allocs/op + BenchmarkClientServerParallel64 50000 59192 ns/op 7028 B/op 60 allocs/op + ok net/http 95.783s + ` + + want := Set{ + "BenchmarkReadRequestApachebench": []*Benchmark{ + { + Name: "BenchmarkReadRequestApachebench", + N: 1000000, NsPerOp: 2960, MBPerS: 27.70, AllocedBytesPerOp: 839, AllocsPerOp: 9, + Measured: NsPerOp | MBPerS | AllocedBytesPerOp | AllocsPerOp, + Ord: 2, + }, + }, + "BenchmarkClientServerParallel64": []*Benchmark{ + { + Name: "BenchmarkClientServerParallel64", + N: 50000, NsPerOp: 59192, AllocedBytesPerOp: 7028, AllocsPerOp: 60, + Measured: NsPerOp | AllocedBytesPerOp | AllocsPerOp, + Ord: 3, + }, + }, + "BenchmarkEncrypt": []*Benchmark{ + { + Name: "BenchmarkEncrypt", + N: 100000000, NsPerOp: 19.6, + Measured: NsPerOp, + Ord: 0, + }, + { + Name: "BenchmarkEncrypt", + N: 5000000, NsPerOp: 517, + Measured: NsPerOp, + Ord: 1, + }, + }, + } + + have, err := ParseSet(strings.NewReader(in)) + if err != nil { + t.Fatalf("unexpected err during ParseSet: %v", err) + } + if !reflect.DeepEqual(want, have) { + t.Errorf("parsed bench set incorrectly, want %v have %v", want, have) + } +} diff --git a/vendor/golang.org/x/tools/blog/atom/atom.go b/vendor/golang.org/x/tools/blog/atom/atom.go new file mode 100644 index 0000000000..f12c31de6a --- /dev/null +++ b/vendor/golang.org/x/tools/blog/atom/atom.go @@ -0,0 +1,57 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Adapted from encoding/xml/read_test.go. + +// Package atom defines XML data structures for an Atom feed. +package atom // import "golang.org/x/tools/blog/atom" + +import ( + "encoding/xml" + "time" +) + +type Feed struct { + XMLName xml.Name `xml:"http://www.w3.org/2005/Atom feed"` + Title string `xml:"title"` + ID string `xml:"id"` + Link []Link `xml:"link"` + Updated TimeStr `xml:"updated"` + Author *Person `xml:"author"` + Entry []*Entry `xml:"entry"` +} + +type Entry struct { + Title string `xml:"title"` + ID string `xml:"id"` + Link []Link `xml:"link"` + Published TimeStr `xml:"published"` + Updated TimeStr `xml:"updated"` + Author *Person `xml:"author"` + Summary *Text `xml:"summary"` + Content *Text `xml:"content"` +} + +type Link struct { + Rel string `xml:"rel,attr"` + Href string `xml:"href,attr"` +} + +type Person struct { + Name string `xml:"name"` + URI string `xml:"uri,omitempty"` + Email string `xml:"email,omitempty"` + InnerXML string `xml:",innerxml"` +} + +type Text struct { + Type string `xml:"type,attr"` + Body string `xml:",chardata"` +} + +type TimeStr string + +func Time(t time.Time) TimeStr { + return TimeStr(t.Format("2006-01-02T15:04:05-07:00")) +} diff --git a/vendor/golang.org/x/tools/blog/blog.go b/vendor/golang.org/x/tools/blog/blog.go new file mode 100644 index 0000000000..23c8dc6d47 --- /dev/null +++ b/vendor/golang.org/x/tools/blog/blog.go @@ -0,0 +1,424 @@ +// Copyright 2013 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 blog implements a web server for articles written in present format. +package blog // import "golang.org/x/tools/blog" + +import ( + "bytes" + "encoding/json" + "encoding/xml" + "fmt" + "html/template" + "log" + "net/http" + "os" + "path/filepath" + "regexp" + "sort" + "strings" + "time" + + "golang.org/x/tools/blog/atom" + "golang.org/x/tools/present" +) + +var validJSONPFunc = regexp.MustCompile(`(?i)^[a-z_][a-z0-9_.]*$`) + +// Config specifies Server configuration values. +type Config struct { + ContentPath string // Relative or absolute location of article files and related content. + TemplatePath string // Relative or absolute location of template files. + + BaseURL string // Absolute base URL (for permalinks; no trailing slash). + BasePath string // Base URL path relative to server root (no trailing slash). + GodocURL string // The base URL of godoc (for menu bar; no trailing slash). + Hostname string // Server host name, used for rendering ATOM feeds. + + HomeArticles int // Articles to display on the home page. + FeedArticles int // Articles to include in Atom and JSON feeds. + FeedTitle string // The title of the Atom XML feed + + PlayEnabled bool +} + +// Doc represents an article adorned with presentation data. +type Doc struct { + *present.Doc + Permalink string // Canonical URL for this document. + Path string // Path relative to server root (including base). + HTML template.HTML // rendered article + + Related []*Doc + Newer, Older *Doc +} + +// Server implements an http.Handler that serves blog articles. +type Server struct { + cfg Config + docs []*Doc + tags []string + docPaths map[string]*Doc // key is path without BasePath. + docTags map[string][]*Doc + template struct { + home, index, article, doc *template.Template + } + atomFeed []byte // pre-rendered Atom feed + jsonFeed []byte // pre-rendered JSON feed + content http.Handler +} + +// NewServer constructs a new Server using the specified config. +func NewServer(cfg Config) (*Server, error) { + present.PlayEnabled = cfg.PlayEnabled + + root := filepath.Join(cfg.TemplatePath, "root.tmpl") + parse := func(name string) (*template.Template, error) { + t := template.New("").Funcs(funcMap) + return t.ParseFiles(root, filepath.Join(cfg.TemplatePath, name)) + } + + s := &Server{cfg: cfg} + + // Parse templates. + var err error + s.template.home, err = parse("home.tmpl") + if err != nil { + return nil, err + } + s.template.index, err = parse("index.tmpl") + if err != nil { + return nil, err + } + s.template.article, err = parse("article.tmpl") + if err != nil { + return nil, err + } + p := present.Template().Funcs(funcMap) + s.template.doc, err = p.ParseFiles(filepath.Join(cfg.TemplatePath, "doc.tmpl")) + if err != nil { + return nil, err + } + + // Load content. + err = s.loadDocs(filepath.Clean(cfg.ContentPath)) + if err != nil { + return nil, err + } + + err = s.renderAtomFeed() + if err != nil { + return nil, err + } + + err = s.renderJSONFeed() + if err != nil { + return nil, err + } + + // Set up content file server. + s.content = http.StripPrefix(s.cfg.BasePath, http.FileServer(http.Dir(cfg.ContentPath))) + + return s, nil +} + +var funcMap = template.FuncMap{ + "sectioned": sectioned, + "authors": authors, +} + +// sectioned returns true if the provided Doc contains more than one section. +// This is used to control whether to display the table of contents and headings. +func sectioned(d *present.Doc) bool { + return len(d.Sections) > 1 +} + +// authors returns a comma-separated list of author names. +func authors(authors []present.Author) string { + var b bytes.Buffer + last := len(authors) - 1 + for i, a := range authors { + if i > 0 { + if i == last { + b.WriteString(" and ") + } else { + b.WriteString(", ") + } + } + b.WriteString(authorName(a)) + } + return b.String() +} + +// authorName returns the first line of the Author text: the author's name. +func authorName(a present.Author) string { + el := a.TextElem() + if len(el) == 0 { + return "" + } + text, ok := el[0].(present.Text) + if !ok || len(text.Lines) == 0 { + return "" + } + return text.Lines[0] +} + +// loadDocs reads all content from the provided file system root, renders all +// the articles it finds, adds them to the Server's docs field, computes the +// denormalized docPaths, docTags, and tags fields, and populates the various +// helper fields (Next, Previous, Related) for each Doc. +func (s *Server) loadDocs(root string) error { + // Read content into docs field. + const ext = ".article" + fn := func(p string, info os.FileInfo, err error) error { + if filepath.Ext(p) != ext { + return nil + } + f, err := os.Open(p) + if err != nil { + return err + } + defer f.Close() + d, err := present.Parse(f, p, 0) + if err != nil { + return err + } + html := new(bytes.Buffer) + err = d.Render(html, s.template.doc) + if err != nil { + return err + } + p = p[len(root) : len(p)-len(ext)] // trim root and extension + p = filepath.ToSlash(p) + s.docs = append(s.docs, &Doc{ + Doc: d, + Path: s.cfg.BasePath + p, + Permalink: s.cfg.BaseURL + p, + HTML: template.HTML(html.String()), + }) + return nil + } + err := filepath.Walk(root, fn) + if err != nil { + return err + } + sort.Sort(docsByTime(s.docs)) + + // Pull out doc paths and tags and put in reverse-associating maps. + s.docPaths = make(map[string]*Doc) + s.docTags = make(map[string][]*Doc) + for _, d := range s.docs { + s.docPaths[strings.TrimPrefix(d.Path, s.cfg.BasePath)] = d + for _, t := range d.Tags { + s.docTags[t] = append(s.docTags[t], d) + } + } + + // Pull out unique sorted list of tags. + for t := range s.docTags { + s.tags = append(s.tags, t) + } + sort.Strings(s.tags) + + // Set up presentation-related fields, Newer, Older, and Related. + for _, doc := range s.docs { + // Newer, Older: docs adjacent to doc + for i := range s.docs { + if s.docs[i] != doc { + continue + } + if i > 0 { + doc.Newer = s.docs[i-1] + } + if i+1 < len(s.docs) { + doc.Older = s.docs[i+1] + } + break + } + + // Related: all docs that share tags with doc. + related := make(map[*Doc]bool) + for _, t := range doc.Tags { + for _, d := range s.docTags[t] { + if d != doc { + related[d] = true + } + } + } + for d := range related { + doc.Related = append(doc.Related, d) + } + sort.Sort(docsByTime(doc.Related)) + } + + return nil +} + +// renderAtomFeed generates an XML Atom feed and stores it in the Server's +// atomFeed field. +func (s *Server) renderAtomFeed() error { + var updated time.Time + if len(s.docs) > 0 { + updated = s.docs[0].Time + } + feed := atom.Feed{ + Title: s.cfg.FeedTitle, + ID: "tag:" + s.cfg.Hostname + ",2013:" + s.cfg.Hostname, + Updated: atom.Time(updated), + Link: []atom.Link{{ + Rel: "self", + Href: s.cfg.BaseURL + "/feed.atom", + }}, + } + for i, doc := range s.docs { + if i >= s.cfg.FeedArticles { + break + } + e := &atom.Entry{ + Title: doc.Title, + ID: feed.ID + doc.Path, + Link: []atom.Link{{ + Rel: "alternate", + Href: doc.Permalink, + }}, + Published: atom.Time(doc.Time), + Updated: atom.Time(doc.Time), + Summary: &atom.Text{ + Type: "html", + Body: summary(doc), + }, + Content: &atom.Text{ + Type: "html", + Body: string(doc.HTML), + }, + Author: &atom.Person{ + Name: authors(doc.Authors), + }, + } + feed.Entry = append(feed.Entry, e) + } + data, err := xml.Marshal(&feed) + if err != nil { + return err + } + s.atomFeed = data + return nil +} + +type jsonItem struct { + Title string + Link string + Time time.Time + Summary string + Content string + Author string +} + +// renderJSONFeed generates a JSON feed and stores it in the Server's jsonFeed +// field. +func (s *Server) renderJSONFeed() error { + var feed []jsonItem + for i, doc := range s.docs { + if i >= s.cfg.FeedArticles { + break + } + item := jsonItem{ + Title: doc.Title, + Link: doc.Permalink, + Time: doc.Time, + Summary: summary(doc), + Content: string(doc.HTML), + Author: authors(doc.Authors), + } + feed = append(feed, item) + } + data, err := json.Marshal(feed) + if err != nil { + return err + } + s.jsonFeed = data + return nil +} + +// summary returns the first paragraph of text from the provided Doc. +func summary(d *Doc) string { + if len(d.Sections) == 0 { + return "" + } + for _, elem := range d.Sections[0].Elem { + text, ok := elem.(present.Text) + if !ok || text.Pre { + // skip everything but non-text elements + continue + } + var buf bytes.Buffer + for _, s := range text.Lines { + buf.WriteString(string(present.Style(s))) + buf.WriteByte('\n') + } + return buf.String() + } + return "" +} + +// rootData encapsulates data destined for the root template. +type rootData struct { + Doc *Doc + BasePath string + GodocURL string + Data interface{} +} + +// ServeHTTP serves the front, index, and article pages +// as well as the ATOM and JSON feeds. +func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { + var ( + d = rootData{BasePath: s.cfg.BasePath, GodocURL: s.cfg.GodocURL} + t *template.Template + ) + switch p := strings.TrimPrefix(r.URL.Path, s.cfg.BasePath); p { + case "/": + d.Data = s.docs + if len(s.docs) > s.cfg.HomeArticles { + d.Data = s.docs[:s.cfg.HomeArticles] + } + t = s.template.home + case "/index": + d.Data = s.docs + t = s.template.index + case "/feed.atom", "/feeds/posts/default": + w.Header().Set("Content-type", "application/atom+xml; charset=utf-8") + w.Write(s.atomFeed) + return + case "/.json": + if p := r.FormValue("jsonp"); validJSONPFunc.MatchString(p) { + w.Header().Set("Content-type", "application/javascript; charset=utf-8") + fmt.Fprintf(w, "%v(%s)", p, s.jsonFeed) + return + } + w.Header().Set("Content-type", "application/json; charset=utf-8") + w.Write(s.jsonFeed) + return + default: + doc, ok := s.docPaths[p] + if !ok { + // Not a doc; try to just serve static content. + s.content.ServeHTTP(w, r) + return + } + d.Doc = doc + t = s.template.article + } + err := t.ExecuteTemplate(w, "root", d) + if err != nil { + log.Println(err) + } +} + +// docsByTime implements sort.Interface, sorting Docs by their Time field. +type docsByTime []*Doc + +func (s docsByTime) Len() int { return len(s) } +func (s docsByTime) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s docsByTime) Less(i, j int) bool { return s[i].Time.After(s[j].Time) } diff --git a/vendor/golang.org/x/tools/cmd/benchcmp/benchcmp.go b/vendor/golang.org/x/tools/cmd/benchcmp/benchcmp.go new file mode 100644 index 0000000000..32f3a1c88f --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/benchcmp/benchcmp.go @@ -0,0 +1,184 @@ +// 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 main + +import ( + "flag" + "fmt" + "os" + "sort" + "strconv" + "text/tabwriter" + + "golang.org/x/tools/benchmark/parse" +) + +var ( + changedOnly = flag.Bool("changed", false, "show only benchmarks that have changed") + magSort = flag.Bool("mag", false, "sort benchmarks by magnitude of change") + best = flag.Bool("best", false, "compare best times from old and new") +) + +const usageFooter = ` +Each input file should be from: + go test -run=NONE -bench=. > [old,new].txt + +Benchcmp compares old and new for each benchmark. + +If -test.benchmem=true is added to the "go test" command +benchcmp will also compare memory allocations. +` + +func main() { + flag.Usage = func() { + fmt.Fprintf(os.Stderr, "usage: %s old.txt new.txt\n\n", os.Args[0]) + flag.PrintDefaults() + fmt.Fprint(os.Stderr, usageFooter) + os.Exit(2) + } + flag.Parse() + if flag.NArg() != 2 { + flag.Usage() + } + + before := parseFile(flag.Arg(0)) + after := parseFile(flag.Arg(1)) + + cmps, warnings := Correlate(before, after) + + for _, warn := range warnings { + fmt.Fprintln(os.Stderr, warn) + } + + if len(cmps) == 0 { + fatal("benchcmp: no repeated benchmarks") + } + + w := new(tabwriter.Writer) + w.Init(os.Stdout, 0, 0, 5, ' ', 0) + defer w.Flush() + + var header bool // Has the header has been displayed yet for a given block? + + if *magSort { + sort.Sort(ByDeltaNsPerOp(cmps)) + } else { + sort.Sort(ByParseOrder(cmps)) + } + for _, cmp := range cmps { + if !cmp.Measured(parse.NsPerOp) { + continue + } + if delta := cmp.DeltaNsPerOp(); !*changedOnly || delta.Changed() { + if !header { + fmt.Fprint(w, "benchmark\told ns/op\tnew ns/op\tdelta\n") + header = true + } + fmt.Fprintf(w, "%s\t%s\t%s\t%s\n", cmp.Name(), formatNs(cmp.Before.NsPerOp), formatNs(cmp.After.NsPerOp), delta.Percent()) + } + } + + header = false + if *magSort { + sort.Sort(ByDeltaMBPerS(cmps)) + } + for _, cmp := range cmps { + if !cmp.Measured(parse.MBPerS) { + continue + } + if delta := cmp.DeltaMBPerS(); !*changedOnly || delta.Changed() { + if !header { + fmt.Fprint(w, "\nbenchmark\told MB/s\tnew MB/s\tspeedup\n") + header = true + } + fmt.Fprintf(w, "%s\t%.2f\t%.2f\t%s\n", cmp.Name(), cmp.Before.MBPerS, cmp.After.MBPerS, delta.Multiple()) + } + } + + header = false + if *magSort { + sort.Sort(ByDeltaAllocsPerOp(cmps)) + } + for _, cmp := range cmps { + if !cmp.Measured(parse.AllocsPerOp) { + continue + } + if delta := cmp.DeltaAllocsPerOp(); !*changedOnly || delta.Changed() { + if !header { + fmt.Fprint(w, "\nbenchmark\told allocs\tnew allocs\tdelta\n") + header = true + } + fmt.Fprintf(w, "%s\t%d\t%d\t%s\n", cmp.Name(), cmp.Before.AllocsPerOp, cmp.After.AllocsPerOp, delta.Percent()) + } + } + + header = false + if *magSort { + sort.Sort(ByDeltaAllocedBytesPerOp(cmps)) + } + for _, cmp := range cmps { + if !cmp.Measured(parse.AllocedBytesPerOp) { + continue + } + if delta := cmp.DeltaAllocedBytesPerOp(); !*changedOnly || delta.Changed() { + if !header { + fmt.Fprint(w, "\nbenchmark\told bytes\tnew bytes\tdelta\n") + header = true + } + fmt.Fprintf(w, "%s\t%d\t%d\t%s\n", cmp.Name(), cmp.Before.AllocedBytesPerOp, cmp.After.AllocedBytesPerOp, cmp.DeltaAllocedBytesPerOp().Percent()) + } + } +} + +func fatal(msg interface{}) { + fmt.Fprintln(os.Stderr, msg) + os.Exit(1) +} + +func parseFile(path string) parse.Set { + f, err := os.Open(path) + if err != nil { + fatal(err) + } + defer f.Close() + bb, err := parse.ParseSet(f) + if err != nil { + fatal(err) + } + if *best { + selectBest(bb) + } + return bb +} + +func selectBest(bs parse.Set) { + for name, bb := range bs { + if len(bb) < 2 { + continue + } + ord := bb[0].Ord + best := bb[0] + for _, b := range bb { + if b.NsPerOp < best.NsPerOp { + b.Ord = ord + best = b + } + } + bs[name] = []*parse.Benchmark{best} + } +} + +// formatNs formats ns measurements to expose a useful amount of +// precision. It mirrors the ns precision logic of testing.B. +func formatNs(ns float64) string { + prec := 0 + switch { + case ns < 10: + prec = 2 + case ns < 100: + prec = 1 + } + return strconv.FormatFloat(ns, 'f', prec, 64) +} diff --git a/vendor/golang.org/x/tools/cmd/benchcmp/benchcmp_test.go b/vendor/golang.org/x/tools/cmd/benchcmp/benchcmp_test.go new file mode 100644 index 0000000000..22260795e6 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/benchcmp/benchcmp_test.go @@ -0,0 +1,59 @@ +package main + +import ( + "reflect" + "testing" + + "golang.org/x/tools/benchmark/parse" +) + +func TestSelectBest(t *testing.T) { + have := parse.Set{ + "Benchmark1": []*parse.Benchmark{ + { + Name: "Benchmark1", + N: 10, NsPerOp: 100, Measured: parse.NsPerOp, + Ord: 0, + }, + { + Name: "Benchmark1", + N: 10, NsPerOp: 50, Measured: parse.NsPerOp, + Ord: 3, + }, + }, + "Benchmark2": []*parse.Benchmark{ + { + Name: "Benchmark2", + N: 10, NsPerOp: 60, Measured: parse.NsPerOp, + Ord: 1, + }, + { + Name: "Benchmark2", + N: 10, NsPerOp: 500, Measured: parse.NsPerOp, + Ord: 2, + }, + }, + } + + want := parse.Set{ + "Benchmark1": []*parse.Benchmark{ + { + Name: "Benchmark1", + N: 10, NsPerOp: 50, Measured: parse.NsPerOp, + Ord: 0, + }, + }, + "Benchmark2": []*parse.Benchmark{ + { + Name: "Benchmark2", + N: 10, NsPerOp: 60, Measured: parse.NsPerOp, + Ord: 1, + }, + }, + } + + selectBest(have) + if !reflect.DeepEqual(want, have) { + t.Errorf("filtered bench set incorrectly, want %v have %v", want, have) + } +} diff --git a/vendor/golang.org/x/tools/cmd/benchcmp/compare.go b/vendor/golang.org/x/tools/cmd/benchcmp/compare.go new file mode 100644 index 0000000000..c3f5e89c76 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/benchcmp/compare.go @@ -0,0 +1,156 @@ +// 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 main + +import ( + "fmt" + "math" + + "golang.org/x/tools/benchmark/parse" +) + +// BenchCmp is a pair of benchmarks. +type BenchCmp struct { + Before *parse.Benchmark + After *parse.Benchmark +} + +// Correlate correlates benchmarks from two BenchSets. +func Correlate(before, after parse.Set) (cmps []BenchCmp, warnings []string) { + cmps = make([]BenchCmp, 0, len(after)) + for name, beforebb := range before { + afterbb := after[name] + if len(beforebb) != len(afterbb) { + warnings = append(warnings, fmt.Sprintf("ignoring %s: before has %d instances, after has %d", name, len(beforebb), len(afterbb))) + continue + } + for i, beforeb := range beforebb { + afterb := afterbb[i] + cmps = append(cmps, BenchCmp{beforeb, afterb}) + } + } + return +} + +func (c BenchCmp) Name() string { return c.Before.Name } +func (c BenchCmp) String() string { return fmt.Sprintf("<%s, %s>", c.Before, c.After) } +func (c BenchCmp) Measured(flag int) bool { return (c.Before.Measured & c.After.Measured & flag) != 0 } +func (c BenchCmp) DeltaNsPerOp() Delta { return Delta{c.Before.NsPerOp, c.After.NsPerOp} } +func (c BenchCmp) DeltaMBPerS() Delta { return Delta{c.Before.MBPerS, c.After.MBPerS} } +func (c BenchCmp) DeltaAllocedBytesPerOp() Delta { + return Delta{float64(c.Before.AllocedBytesPerOp), float64(c.After.AllocedBytesPerOp)} +} +func (c BenchCmp) DeltaAllocsPerOp() Delta { + return Delta{float64(c.Before.AllocsPerOp), float64(c.After.AllocsPerOp)} +} + +// Delta is the before and after value for a benchmark measurement. +// Both must be non-negative. +type Delta struct { + Before float64 + After float64 +} + +// mag calculates the magnitude of a change, regardless of the direction of +// the change. mag is intended for sorting and has no independent meaning. +func (d Delta) mag() float64 { + switch { + case d.Before != 0 && d.After != 0 && d.Before >= d.After: + return d.After / d.Before + case d.Before != 0 && d.After != 0 && d.Before < d.After: + return d.Before / d.After + case d.Before == 0 && d.After == 0: + return 1 + default: + // 0 -> 1 or 1 -> 0 + // These are significant changes and worth surfacing. + return math.Inf(1) + } +} + +// Changed reports whether the benchmark quantities are different. +func (d Delta) Changed() bool { return d.Before != d.After } + +// Float64 returns After / Before. If Before is 0, Float64 returns +// 1 if After is also 0, and +Inf otherwise. +func (d Delta) Float64() float64 { + switch { + case d.Before != 0: + return d.After / d.Before + case d.After == 0: + return 1 + default: + return math.Inf(1) + } +} + +// Percent formats a Delta as a percent change, ranging from -100% up. +func (d Delta) Percent() string { + return fmt.Sprintf("%+.2f%%", 100*d.Float64()-100) +} + +// Multiple formats a Delta as a multiplier, ranging from 0.00x up. +func (d Delta) Multiple() string { + return fmt.Sprintf("%.2fx", d.Float64()) +} + +func (d Delta) String() string { + return fmt.Sprintf("Δ(%f, %f)", d.Before, d.After) +} + +// ByParseOrder sorts BenchCmps to match the order in +// which the Before benchmarks were presented to Parse. +type ByParseOrder []BenchCmp + +func (x ByParseOrder) Len() int { return len(x) } +func (x ByParseOrder) Swap(i, j int) { x[i], x[j] = x[j], x[i] } +func (x ByParseOrder) Less(i, j int) bool { return x[i].Before.Ord < x[j].Before.Ord } + +// lessByDelta provides lexicographic ordering: +// * largest delta by magnitude +// * alphabetic by name +func lessByDelta(i, j BenchCmp, calcDelta func(BenchCmp) Delta) bool { + iDelta, jDelta := calcDelta(i).mag(), calcDelta(j).mag() + if iDelta != jDelta { + return iDelta < jDelta + } + return i.Name() < j.Name() +} + +// ByDeltaNsPerOp sorts BenchCmps lexicographically by change +// in ns/op, descending, then by benchmark name. +type ByDeltaNsPerOp []BenchCmp + +func (x ByDeltaNsPerOp) Len() int { return len(x) } +func (x ByDeltaNsPerOp) Swap(i, j int) { x[i], x[j] = x[j], x[i] } +func (x ByDeltaNsPerOp) Less(i, j int) bool { return lessByDelta(x[i], x[j], BenchCmp.DeltaNsPerOp) } + +// ByDeltaMBPerS sorts BenchCmps lexicographically by change +// in MB/s, descending, then by benchmark name. +type ByDeltaMBPerS []BenchCmp + +func (x ByDeltaMBPerS) Len() int { return len(x) } +func (x ByDeltaMBPerS) Swap(i, j int) { x[i], x[j] = x[j], x[i] } +func (x ByDeltaMBPerS) Less(i, j int) bool { return lessByDelta(x[i], x[j], BenchCmp.DeltaMBPerS) } + +// ByDeltaAllocedBytesPerOp sorts BenchCmps lexicographically by change +// in B/op, descending, then by benchmark name. +type ByDeltaAllocedBytesPerOp []BenchCmp + +func (x ByDeltaAllocedBytesPerOp) Len() int { return len(x) } +func (x ByDeltaAllocedBytesPerOp) Swap(i, j int) { x[i], x[j] = x[j], x[i] } +func (x ByDeltaAllocedBytesPerOp) Less(i, j int) bool { + return lessByDelta(x[i], x[j], BenchCmp.DeltaAllocedBytesPerOp) +} + +// ByDeltaAllocsPerOp sorts BenchCmps lexicographically by change +// in allocs/op, descending, then by benchmark name. +type ByDeltaAllocsPerOp []BenchCmp + +func (x ByDeltaAllocsPerOp) Len() int { return len(x) } +func (x ByDeltaAllocsPerOp) Swap(i, j int) { x[i], x[j] = x[j], x[i] } +func (x ByDeltaAllocsPerOp) Less(i, j int) bool { + return lessByDelta(x[i], x[j], BenchCmp.DeltaAllocsPerOp) +} diff --git a/vendor/golang.org/x/tools/cmd/benchcmp/compare_test.go b/vendor/golang.org/x/tools/cmd/benchcmp/compare_test.go new file mode 100644 index 0000000000..3403796d67 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/benchcmp/compare_test.go @@ -0,0 +1,133 @@ +// 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 main + +import ( + "math" + "reflect" + "sort" + "testing" + + "golang.org/x/tools/benchmark/parse" +) + +func TestDelta(t *testing.T) { + cases := []struct { + before float64 + after float64 + mag float64 + f float64 + changed bool + pct string + mult string + }{ + {before: 1, after: 1, mag: 1, f: 1, changed: false, pct: "+0.00%", mult: "1.00x"}, + {before: 1, after: 2, mag: 0.5, f: 2, changed: true, pct: "+100.00%", mult: "2.00x"}, + {before: 2, after: 1, mag: 0.5, f: 0.5, changed: true, pct: "-50.00%", mult: "0.50x"}, + {before: 0, after: 0, mag: 1, f: 1, changed: false, pct: "+0.00%", mult: "1.00x"}, + {before: 1, after: 0, mag: math.Inf(1), f: 0, changed: true, pct: "-100.00%", mult: "0.00x"}, + {before: 0, after: 1, mag: math.Inf(1), f: math.Inf(1), changed: true, pct: "+Inf%", mult: "+Infx"}, + } + for _, tt := range cases { + d := Delta{tt.before, tt.after} + if want, have := tt.mag, d.mag(); want != have { + t.Errorf("%s.mag(): want %f have %f", d, want, have) + } + if want, have := tt.f, d.Float64(); want != have { + t.Errorf("%s.Float64(): want %f have %f", d, want, have) + } + if want, have := tt.changed, d.Changed(); want != have { + t.Errorf("%s.Changed(): want %t have %t", d, want, have) + } + if want, have := tt.pct, d.Percent(); want != have { + t.Errorf("%s.Percent(): want %q have %q", d, want, have) + } + if want, have := tt.mult, d.Multiple(); want != have { + t.Errorf("%s.Multiple(): want %q have %q", d, want, have) + } + } +} + +func TestCorrelate(t *testing.T) { + // Benches that are going to be successfully correlated get N thus: + // 0x<counter><num benches><b = before | a = after> + // Read this: "<counter> of <num benches>, from <before|after>". + before := parse.Set{ + "BenchmarkOneEach": []*parse.Benchmark{{Name: "BenchmarkOneEach", N: 0x11b}}, + "BenchmarkOneToNone": []*parse.Benchmark{{Name: "BenchmarkOneToNone"}}, + "BenchmarkOneToTwo": []*parse.Benchmark{{Name: "BenchmarkOneToTwo"}}, + "BenchmarkTwoToOne": []*parse.Benchmark{ + {Name: "BenchmarkTwoToOne"}, + {Name: "BenchmarkTwoToOne"}, + }, + "BenchmarkTwoEach": []*parse.Benchmark{ + {Name: "BenchmarkTwoEach", N: 0x12b}, + {Name: "BenchmarkTwoEach", N: 0x22b}, + }, + } + + after := parse.Set{ + "BenchmarkOneEach": []*parse.Benchmark{{Name: "BenchmarkOneEach", N: 0x11a}}, + "BenchmarkNoneToOne": []*parse.Benchmark{{Name: "BenchmarkNoneToOne"}}, + "BenchmarkTwoToOne": []*parse.Benchmark{{Name: "BenchmarkTwoToOne"}}, + "BenchmarkOneToTwo": []*parse.Benchmark{ + {Name: "BenchmarkOneToTwo"}, + {Name: "BenchmarkOneToTwo"}, + }, + "BenchmarkTwoEach": []*parse.Benchmark{ + {Name: "BenchmarkTwoEach", N: 0x12a}, + {Name: "BenchmarkTwoEach", N: 0x22a}, + }, + } + + pairs, errs := Correlate(before, after) + + // Fail to match: BenchmarkOneToNone, BenchmarkOneToTwo, BenchmarkTwoToOne. + // Correlate does not notice BenchmarkNoneToOne. + if len(errs) != 3 { + t.Errorf("Correlated expected 4 errors, got %d: %v", len(errs), errs) + } + + // Want three correlated pairs: one BenchmarkOneEach, two BenchmarkTwoEach. + if len(pairs) != 3 { + t.Fatalf("Correlated expected 3 pairs, got %v", pairs) + } + + for _, pair := range pairs { + if pair.Before.N&0xF != 0xb { + t.Errorf("unexpected Before in pair %s", pair) + } + if pair.After.N&0xF != 0xa { + t.Errorf("unexpected After in pair %s", pair) + } + if pair.Before.N>>4 != pair.After.N>>4 { + t.Errorf("mismatched pair %s", pair) + } + } +} + +func TestBenchCmpSorting(t *testing.T) { + c := []BenchCmp{ + {&parse.Benchmark{Name: "BenchmarkMuchFaster", NsPerOp: 10, Ord: 3}, &parse.Benchmark{Name: "BenchmarkMuchFaster", NsPerOp: 1}}, + {&parse.Benchmark{Name: "BenchmarkSameB", NsPerOp: 5, Ord: 1}, &parse.Benchmark{Name: "BenchmarkSameB", NsPerOp: 5}}, + {&parse.Benchmark{Name: "BenchmarkSameA", NsPerOp: 5, Ord: 2}, &parse.Benchmark{Name: "BenchmarkSameA", NsPerOp: 5}}, + {&parse.Benchmark{Name: "BenchmarkSlower", NsPerOp: 10, Ord: 0}, &parse.Benchmark{Name: "BenchmarkSlower", NsPerOp: 11}}, + } + + // Test just one magnitude-based sort order; they are symmetric. + sort.Sort(ByDeltaNsPerOp(c)) + want := []string{"BenchmarkMuchFaster", "BenchmarkSlower", "BenchmarkSameA", "BenchmarkSameB"} + have := []string{c[0].Name(), c[1].Name(), c[2].Name(), c[3].Name()} + if !reflect.DeepEqual(want, have) { + t.Errorf("ByDeltaNsOp incorrect sorting: want %v have %v", want, have) + } + + sort.Sort(ByParseOrder(c)) + want = []string{"BenchmarkSlower", "BenchmarkSameB", "BenchmarkSameA", "BenchmarkMuchFaster"} + have = []string{c[0].Name(), c[1].Name(), c[2].Name(), c[3].Name()} + if !reflect.DeepEqual(want, have) { + t.Errorf("ByParseOrder incorrect sorting: want %v have %v", want, have) + } +} diff --git a/vendor/golang.org/x/tools/cmd/benchcmp/doc.go b/vendor/golang.org/x/tools/cmd/benchcmp/doc.go new file mode 100644 index 0000000000..f5c7a3619f --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/benchcmp/doc.go @@ -0,0 +1,37 @@ +// 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. + +/* + +The benchcmp command displays performance changes between benchmarks. + +Benchcmp parses the output of two 'go test' benchmark runs, +correlates the results per benchmark, and displays the deltas. + +To measure the performance impact of a change, use 'go test' +to run benchmarks before and after the change: + + go test -run=NONE -bench=. ./... > old.txt + # make changes + go test -run=NONE -bench=. ./... > new.txt + +Then feed the benchmark results to benchcmp: + + benchcmp old.txt new.txt + +Benchcmp will summarize and display the performance changes, +in a format like this: + + $ benchcmp old.txt new.txt + benchmark old ns/op new ns/op delta + BenchmarkConcat 523 68.6 -86.88% + + benchmark old allocs new allocs delta + BenchmarkConcat 3 1 -66.67% + + benchmark old bytes new bytes delta + BenchmarkConcat 80 48 -40.00% + +*/ +package main // import "golang.org/x/tools/cmd/benchcmp" diff --git a/vendor/golang.org/x/tools/cmd/bundle/main.go b/vendor/golang.org/x/tools/cmd/bundle/main.go new file mode 100644 index 0000000000..962ccd01e3 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/bundle/main.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. + +// +build go1.5 + +// Bundle creates a single-source-file version of a source package +// suitable for inclusion in a particular target package. +// +// Usage: +// +// bundle [-o file] [-dst path] [-pkg name] [-prefix p] [-import old=new] <src> +// +// The src argument specifies the import path of the package to bundle. +// The bundling of a directory of source files into a single source file +// necessarily imposes a number of constraints. +// The package being bundled must not use cgo; must not use conditional +// file compilation, whether with build tags or system-specific file names +// like code_amd64.go; must not depend on any special comments, which +// may not be preserved; must not use any assembly sources; +// must not use renaming imports; and must not use reflection-based APIs +// that depend on the specific names of types or struct fields. +// +// By default, bundle writes the bundled code to standard output. +// If the -o argument is given, bundle writes to the named file +// and also includes a ``//go:generate'' comment giving the exact +// command line used, for regenerating the file with ``go generate.'' +// +// Bundle customizes its output for inclusion in a particular package, the destination package. +// By default bundle assumes the destination is the package in the current directory, +// but the destination package can be specified explicitly using the -dst option, +// which takes an import path as its argument. +// If the source package imports the destination package, bundle will remove +// those imports and rewrite any references to use direct references to the +// corresponding symbols. +// Bundle also must write a package declaration in the output and must +// choose a name to use in that declaration. +// If the -package option is given, bundle uses that name. +// Otherwise, if the -dst option is given, bundle uses the last +// element of the destination import path. +// Otherwise, by default bundle uses the package name found in the +// package sources in the current directory. +// +// To avoid collisions, bundle inserts a prefix at the beginning of +// every package-level const, func, type, and var identifier in src's code, +// updating references accordingly. The default prefix is the package name +// of the source package followed by an underscore. The -prefix option +// specifies an alternate prefix. +// +// Occasionally it is necessary to rewrite imports during the bundling +// process. The -import option, which may be repeated, specifies that +// an import of "old" should be rewritten to import "new" instead. +// +// Example +// +// Bundle archive/zip for inclusion in cmd/dist: +// +// cd $GOROOT/src/cmd/dist +// bundle -o zip.go archive/zip +// +// Bundle golang.org/x/net/http2 for inclusion in net/http, +// prefixing all identifiers by "http2" instead of "http2_", +// and rewriting the import "golang.org/x/net/http2/hpack" +// to "internal/golang.org/x/net/http2/hpack": +// +// cd $GOROOT/src/net/http +// bundle -o h2_bundle.go \ +// -prefix http2 \ +// -import golang.org/x/net/http2/hpack=internal/golang.org/x/net/http2/hpack \ +// golang.org/x/net/http2 +// +// Two ways to update the http2 bundle: +// +// go generate net/http +// +// cd $GOROOT/src/net/http +// go generate +// +// Update both bundles, restricting ``go generate'' to running bundle commands: +// +// go generate -run bundle cmd/dist net/http +// +package main + +import ( + "bytes" + "flag" + "fmt" + "go/ast" + "go/build" + "go/format" + "go/parser" + "go/token" + "go/types" + "io/ioutil" + "log" + "os" + "path" + "strings" + + "golang.org/x/tools/go/loader" +) + +var ( + outputFile = flag.String("o", "", "write output to `file` (default standard output)") + dstPath = flag.String("dst", "", "set destination import `path` (default taken from current directory)") + pkgName = flag.String("pkg", "", "set destination package `name` (default taken from current directory)") + prefix = flag.String("prefix", "", "set bundled identifier prefix to `p` (default source package name + \"_\")") + + importMap = map[string]string{} +) + +func init() { + flag.Var(flagFunc(addImportMap), "import", "rewrite import using `map`, of form old=new (can be repeated)") +} + +func addImportMap(s string) { + if strings.Count(s, "=") != 1 { + log.Fatal("-import argument must be of the form old=new") + } + i := strings.Index(s, "=") + old, new := s[:i], s[i+1:] + if old == "" || new == "" { + log.Fatal("-import argument must be of the form old=new; old and new must be non-empty") + } + importMap[old] = new +} + +func usage() { + fmt.Fprintf(os.Stderr, "Usage: bundle [options] <src>\n") + flag.PrintDefaults() + os.Exit(2) +} + +func main() { + log.SetPrefix("bundle: ") + log.SetFlags(0) + + flag.Usage = usage + flag.Parse() + args := flag.Args() + if len(args) != 1 { + usage() + } + + if *dstPath != "" { + if *pkgName == "" { + *pkgName = path.Base(*dstPath) + } + } else { + wd, _ := os.Getwd() + pkg, err := build.ImportDir(wd, 0) + if err != nil { + log.Fatalf("cannot find package in current directory: %v", err) + } + *dstPath = pkg.ImportPath + if *pkgName == "" { + *pkgName = pkg.Name + } + } + + code, err := bundle(args[0], *dstPath, *pkgName, *prefix) + if err != nil { + log.Fatal(err) + } + if *outputFile != "" { + err := ioutil.WriteFile(*outputFile, code, 0666) + if err != nil { + log.Fatal(err) + } + } else { + _, err := os.Stdout.Write(code) + if err != nil { + log.Fatal(err) + } + } +} + +var ctxt = &build.Default + +func bundle(src, dst, dstpkg, prefix string) ([]byte, error) { + // Load the initial package. + conf := loader.Config{ParserMode: parser.ParseComments, Build: ctxt} + conf.TypeCheckFuncBodies = func(p string) bool { return p == src } + conf.Import(src) + + lprog, err := conf.Load() + if err != nil { + return nil, err + } + + info := lprog.Package(src) + if prefix == "" { + pkgName := info.Files[0].Name.Name + prefix = pkgName + "_" + } + + objsToUpdate := make(map[types.Object]bool) + var rename func(from types.Object) + rename = func(from types.Object) { + if !objsToUpdate[from] { + objsToUpdate[from] = true + + // Renaming a type that is used as an embedded field + // requires renaming the field too. e.g. + // type T int // if we rename this to U.. + // var s struct {T} + // print(s.T) // ...this must change too + if _, ok := from.(*types.TypeName); ok { + for id, obj := range info.Uses { + if obj == from { + if field := info.Defs[id]; field != nil { + rename(field) + } + } + } + } + } + } + + // Rename each package-level object. + scope := info.Pkg.Scope() + for _, name := range scope.Names() { + rename(scope.Lookup(name)) + } + + var out bytes.Buffer + + fmt.Fprintf(&out, "// Code generated by golang.org/x/tools/cmd/bundle.\n") + if *outputFile != "" { + fmt.Fprintf(&out, "//go:generate bundle %s\n", strings.Join(os.Args[1:], " ")) + } else { + fmt.Fprintf(&out, "// $ bundle %s\n", strings.Join(os.Args[1:], " ")) + } + fmt.Fprintf(&out, "\n") + + // Concatenate package comments from all files... + for _, f := range info.Files { + if doc := f.Doc.Text(); strings.TrimSpace(doc) != "" { + for _, line := range strings.Split(doc, "\n") { + fmt.Fprintf(&out, "// %s\n", line) + } + } + } + // ...but don't let them become the actual package comment. + fmt.Fprintln(&out) + + fmt.Fprintf(&out, "package %s\n\n", dstpkg) + + // Print a single declaration that imports all necessary packages. + // TODO(adonovan): + // - support renaming imports. + // - preserve comments from the original import declarations. + for _, f := range info.Files { + for _, imp := range f.Imports { + if imp.Name != nil { + return nil, fmt.Errorf("%s: renaming imports not supported", + lprog.Fset.Position(imp.Pos())) + } + } + } + fmt.Fprintln(&out, "import (") + for _, p := range info.Pkg.Imports() { + if p.Path() == dst { + continue + } + if x, ok := importMap[p.Path()]; ok { + fmt.Fprintf(&out, "\t%q\n", x) + continue + } + fmt.Fprintf(&out, "\t%q\n", p.Path()) + } + fmt.Fprintln(&out, ")\n") + + // Modify and print each file. + for _, f := range info.Files { + // Update renamed identifiers. + for id, obj := range info.Defs { + if objsToUpdate[obj] { + id.Name = prefix + obj.Name() + } + } + for id, obj := range info.Uses { + if objsToUpdate[obj] { + id.Name = prefix + obj.Name() + } + } + + // For each qualified identifier that refers to the + // destination package, remove the qualifier. + // The "@@@." strings are removed in postprocessing. + ast.Inspect(f, func(n ast.Node) bool { + if sel, ok := n.(*ast.SelectorExpr); ok { + if id, ok := sel.X.(*ast.Ident); ok { + if obj, ok := info.Uses[id].(*types.PkgName); ok { + if obj.Imported().Path() == dst { + id.Name = "@@@" + } + } + } + } + return true + }) + + // Pretty-print package-level declarations. + // but no package or import declarations. + // + // TODO(adonovan): this may cause loss of comments + // preceding or associated with the package or import + // declarations or not associated with any declaration. + // Check. + var buf bytes.Buffer + for _, decl := range f.Decls { + if decl, ok := decl.(*ast.GenDecl); ok && decl.Tok == token.IMPORT { + continue + } + buf.Reset() + format.Node(&buf, lprog.Fset, decl) + // Remove each "@@@." in the output. + // TODO(adonovan): not hygienic. + out.Write(bytes.Replace(buf.Bytes(), []byte("@@@."), nil, -1)) + out.WriteString("\n\n") + } + } + + // Now format the entire thing. + result, err := format.Source(out.Bytes()) + if err != nil { + log.Fatalf("formatting failed: %v", err) + } + + return result, nil +} + +type flagFunc func(string) + +func (f flagFunc) Set(s string) error { + f(s) + return nil +} + +func (f flagFunc) String() string { return "" } diff --git a/vendor/golang.org/x/tools/cmd/bundle/main_test.go b/vendor/golang.org/x/tools/cmd/bundle/main_test.go new file mode 100644 index 0000000000..009fc99bed --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/bundle/main_test.go @@ -0,0 +1,68 @@ +// 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 main + +import ( + "bytes" + "io/ioutil" + "os" + "os/exec" + "runtime" + "testing" + + "golang.org/x/tools/go/buildutil" +) + +func TestBundle(t *testing.T) { + load := func(name string) string { + data, err := ioutil.ReadFile(name) + if err != nil { + t.Fatal(err) + } + return string(data) + } + + ctxt = buildutil.FakeContext(map[string]map[string]string{ + "initial": { + "a.go": load("testdata/src/initial/a.go"), + "b.go": load("testdata/src/initial/b.go"), + }, + "fmt": { + "print.go": `package fmt; func Println(...interface{})`, + }, + }) + + os.Args = os.Args[:1] // avoid e.g. -test=short in the output + out, err := bundle("initial", "github.com/dest", "dest", "prefix") + if err != nil { + t.Fatal(err) + } + if got, want := string(out), load("testdata/out.golden"); got != want { + t.Errorf("-- got --\n%s\n-- want --\n%s\n-- diff --", got, want) + + if err := ioutil.WriteFile("testdata/out.got", out, 0644); err != nil { + t.Fatal(err) + } + t.Log(diff("testdata/out.golden", "testdata/out.got")) + } +} + +func diff(a, b string) string { + var cmd *exec.Cmd + switch runtime.GOOS { + case "plan9": + cmd = exec.Command("/bin/diff", "-c", a, b) + default: + cmd = exec.Command("/usr/bin/diff", "-u", a, b) + } + var out bytes.Buffer + cmd.Stdout = &out + cmd.Stderr = &out + cmd.Run() // nonzero exit is expected + if out.Len() == 0 { + return "(failed to compute diff)" + } + return out.String() +} diff --git a/vendor/golang.org/x/tools/cmd/bundle/testdata/out.golden b/vendor/golang.org/x/tools/cmd/bundle/testdata/out.golden new file mode 100644 index 0000000000..2b1784e767 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/bundle/testdata/out.golden @@ -0,0 +1,31 @@ +// Code generated by golang.org/x/tools/cmd/bundle. +// $ bundle + +// The package doc comment +// + +package dest + +import ( + "fmt" +) + +// init functions are not renamed +func init() { prefixfoo() } + +// Type S. +type prefixS struct { + prefixt + u int +} + +// Function bar. +func prefixbar(s *prefixS) { fmt.Println(s.prefixt, s.u) } + +type prefixt int + +const prefixc = 1 + +func prefixfoo() { + fmt.Println() +} diff --git a/vendor/golang.org/x/tools/cmd/bundle/testdata/src/initial/a.go b/vendor/golang.org/x/tools/cmd/bundle/testdata/src/initial/a.go new file mode 100644 index 0000000000..99cd145abc --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/bundle/testdata/src/initial/a.go @@ -0,0 +1,15 @@ +package initial + +import "fmt" + +// init functions are not renamed +func init() { foo() } + +// Type S. +type S struct { + t + u int +} + +// Function bar. +func bar(s *S) { fmt.Println(s.t, s.u) } diff --git a/vendor/golang.org/x/tools/cmd/bundle/testdata/src/initial/b.go b/vendor/golang.org/x/tools/cmd/bundle/testdata/src/initial/b.go new file mode 100644 index 0000000000..399b6ede92 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/bundle/testdata/src/initial/b.go @@ -0,0 +1,12 @@ +// The package doc comment +package initial + +import "fmt" + +type t int + +const c = 1 + +func foo() { + fmt.Println() +} diff --git a/vendor/golang.org/x/tools/cmd/callgraph/main.go b/vendor/golang.org/x/tools/cmd/callgraph/main.go new file mode 100644 index 0000000000..eed92aafd7 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/callgraph/main.go @@ -0,0 +1,365 @@ +// 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. + +// callgraph: a tool for reporting the call graph of a Go program. +// See Usage for details, or run with -help. +package main // import "golang.org/x/tools/cmd/callgraph" + +// TODO(adonovan): +// +// Features: +// - restrict graph to a single package +// - output +// - functions reachable from root (use digraph tool?) +// - unreachable functions (use digraph tool?) +// - dynamic (runtime) types +// - indexed output (numbered nodes) +// - JSON output +// - additional template fields: +// callee file/line/col + +import ( + "bufio" + "bytes" + "flag" + "fmt" + "go/build" + "go/token" + "io" + "log" + "os" + "runtime" + "text/template" + + "golang.org/x/tools/go/buildutil" + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/callgraph/cha" + "golang.org/x/tools/go/callgraph/rta" + "golang.org/x/tools/go/callgraph/static" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/pointer" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +// flags +var ( + algoFlag = flag.String("algo", "rta", + `Call graph construction algorithm (static, cha, rta, pta)`) + + testFlag = flag.Bool("test", false, + "Loads test code (*_test.go) for imported packages") + + formatFlag = flag.String("format", + "{{.Caller}}\t--{{.Dynamic}}-{{.Line}}:{{.Column}}-->\t{{.Callee}}", + "A template expression specifying how to format an edge") + + ptalogFlag = flag.String("ptalog", "", + "Location of the points-to analysis log file, or empty to disable logging.") +) + +func init() { + flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc) +} + +const Usage = `callgraph: display the the call graph of a Go program. + +Usage: + + callgraph [-algo=static|cha|rta|pta] [-test] [-format=...] <args>... + +Flags: + +-algo Specifies the call-graph construction algorithm, one of: + + static static calls only (unsound) + cha Class Hierarchy Analysis + rta Rapid Type Analysis + pta inclusion-based Points-To Analysis + + The algorithms are ordered by increasing precision in their + treatment of dynamic calls (and thus also computational cost). + RTA and PTA require a whole program (main or test), and + include only functions reachable from main. + +-test Include the package's tests in the analysis. + +-format Specifies the format in which each call graph edge is displayed. + One of: + + digraph output suitable for input to + golang.org/x/tools/cmd/digraph. + graphviz output in AT&T GraphViz (.dot) format. + + All other values are interpreted using text/template syntax. + The default value is: + + {{.Caller}}\t--{{.Dynamic}}-{{.Line}}:{{.Column}}-->\t{{.Callee}} + + The structure passed to the template is (effectively): + + type Edge struct { + Caller *ssa.Function // calling function + Callee *ssa.Function // called function + + // Call site: + Filename string // containing file + Offset int // offset within file of '(' + Line int // line number + Column int // column number of call + Dynamic string // "static" or "dynamic" + Description string // e.g. "static method call" + } + + Caller and Callee are *ssa.Function values, which print as + "(*sync/atomic.Mutex).Lock", but other attributes may be + derived from them, e.g. Caller.Pkg.Object.Path yields the + import path of the enclosing package. Consult the go/ssa + API documentation for details. + +` + loader.FromArgsUsage + ` + +Examples: + + Show the call graph of the trivial web server application: + + callgraph -format digraph $GOROOT/src/net/http/triv.go + + Same, but show only the packages of each function: + + callgraph -format '{{.Caller.Pkg.Object.Path}} -> {{.Callee.Pkg.Object.Path}}' \ + $GOROOT/src/net/http/triv.go | sort | uniq + + Show functions that make dynamic calls into the 'fmt' test package, + using the pointer analysis algorithm: + + callgraph -format='{{.Caller}} -{{.Dynamic}}-> {{.Callee}}' -test -algo=pta fmt | + sed -ne 's/-dynamic-/--/p' | + sed -ne 's/-->.*fmt_test.*$//p' | sort | uniq + + Show all functions directly called by the callgraph tool's main function: + + callgraph -format=digraph golang.org/x/tools/cmd/callgraph | + digraph succs golang.org/x/tools/cmd/callgraph.main +` + +func init() { + // If $GOMAXPROCS isn't set, use the full capacity of the machine. + // For small machines, use at least 4 threads. + if os.Getenv("GOMAXPROCS") == "" { + n := runtime.NumCPU() + if n < 4 { + n = 4 + } + runtime.GOMAXPROCS(n) + } +} + +func main() { + flag.Parse() + if err := doCallgraph(&build.Default, *algoFlag, *formatFlag, *testFlag, flag.Args()); err != nil { + fmt.Fprintf(os.Stderr, "callgraph: %s\n", err) + os.Exit(1) + } +} + +var stdout io.Writer = os.Stdout + +func doCallgraph(ctxt *build.Context, algo, format string, tests bool, args []string) error { + conf := loader.Config{Build: ctxt} + + if len(args) == 0 { + fmt.Fprintln(os.Stderr, Usage) + return nil + } + + // Use the initial packages from the command line. + args, err := conf.FromArgs(args, tests) + if err != nil { + return err + } + + // Load, parse and type-check the whole program. + iprog, err := conf.Load() + if err != nil { + return err + } + + // Create and build SSA-form program representation. + prog := ssautil.CreateProgram(iprog, 0) + prog.Build() + + // -- call graph construction ------------------------------------------ + + var cg *callgraph.Graph + + switch algo { + case "static": + cg = static.CallGraph(prog) + + case "cha": + cg = cha.CallGraph(prog) + + case "pta": + // Set up points-to analysis log file. + var ptalog io.Writer + if *ptalogFlag != "" { + if f, err := os.Create(*ptalogFlag); err != nil { + log.Fatalf("Failed to create PTA log file: %s", err) + } else { + buf := bufio.NewWriter(f) + ptalog = buf + defer func() { + if err := buf.Flush(); err != nil { + log.Printf("flush: %s", err) + } + if err := f.Close(); err != nil { + log.Printf("close: %s", err) + } + }() + } + } + + main, err := mainPackage(prog, tests) + if err != nil { + return err + } + config := &pointer.Config{ + Mains: []*ssa.Package{main}, + BuildCallGraph: true, + Log: ptalog, + } + ptares, err := pointer.Analyze(config) + if err != nil { + return err // internal error in pointer analysis + } + cg = ptares.CallGraph + + case "rta": + main, err := mainPackage(prog, tests) + if err != nil { + return err + } + roots := []*ssa.Function{ + main.Func("init"), + main.Func("main"), + } + rtares := rta.Analyze(roots, true) + cg = rtares.CallGraph + + // NB: RTA gives us Reachable and RuntimeTypes too. + + default: + return fmt.Errorf("unknown algorithm: %s", algo) + } + + cg.DeleteSyntheticNodes() + + // -- output------------------------------------------------------------ + + var before, after string + + // Pre-canned formats. + switch format { + case "digraph": + format = `{{printf "%q %q" .Caller .Callee}}` + + case "graphviz": + before = "digraph callgraph {\n" + after = "}\n" + format = ` {{printf "%q" .Caller}} -> {{printf "%q" .Callee}}` + } + + tmpl, err := template.New("-format").Parse(format) + if err != nil { + return fmt.Errorf("invalid -format template: %v", err) + } + + // Allocate these once, outside the traversal. + var buf bytes.Buffer + data := Edge{fset: prog.Fset} + + fmt.Fprint(stdout, before) + if err := callgraph.GraphVisitEdges(cg, func(edge *callgraph.Edge) error { + data.position.Offset = -1 + data.edge = edge + data.Caller = edge.Caller.Func + data.Callee = edge.Callee.Func + + buf.Reset() + if err := tmpl.Execute(&buf, &data); err != nil { + return err + } + stdout.Write(buf.Bytes()) + if len := buf.Len(); len == 0 || buf.Bytes()[len-1] != '\n' { + fmt.Fprintln(stdout) + } + return nil + }); err != nil { + return err + } + fmt.Fprint(stdout, after) + return nil +} + +// mainPackage returns the main package to analyze. +// The resulting package has a main() function. +func mainPackage(prog *ssa.Program, tests bool) (*ssa.Package, error) { + pkgs := prog.AllPackages() + + // TODO(adonovan): allow independent control over tests, mains and libraries. + // TODO(adonovan): put this logic in a library; we keep reinventing it. + + if tests { + // If -test, use all packages' tests. + if len(pkgs) > 0 { + if main := prog.CreateTestMainPackage(pkgs...); main != nil { + return main, nil + } + } + return nil, fmt.Errorf("no tests") + } + + // Otherwise, use the first package named main. + for _, pkg := range pkgs { + if pkg.Pkg.Name() == "main" { + if pkg.Func("main") == nil { + return nil, fmt.Errorf("no func main() in main package") + } + return pkg, nil + } + } + + return nil, fmt.Errorf("no main package") +} + +type Edge struct { + Caller *ssa.Function + Callee *ssa.Function + + edge *callgraph.Edge + fset *token.FileSet + position token.Position // initialized lazily +} + +func (e *Edge) pos() *token.Position { + if e.position.Offset == -1 { + e.position = e.fset.Position(e.edge.Pos()) // called lazily + } + return &e.position +} + +func (e *Edge) Filename() string { return e.pos().Filename } +func (e *Edge) Column() int { return e.pos().Column } +func (e *Edge) Line() int { return e.pos().Line } +func (e *Edge) Offset() int { return e.pos().Offset } + +func (e *Edge) Dynamic() string { + if e.edge.Site != nil && e.edge.Site.Common().StaticCallee() == nil { + return "dynamic" + } + return "static" +} + +func (e *Edge) Description() string { return e.edge.Description() } diff --git a/vendor/golang.org/x/tools/cmd/callgraph/main_test.go b/vendor/golang.org/x/tools/cmd/callgraph/main_test.go new file mode 100644 index 0000000000..f1f7166d90 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/callgraph/main_test.go @@ -0,0 +1,81 @@ +// 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. + +// No testdata on Android. + +// +build !android + +package main + +import ( + "bytes" + "fmt" + "go/build" + "reflect" + "sort" + "strings" + "testing" +) + +func TestCallgraph(t *testing.T) { + ctxt := build.Default // copy + ctxt.GOPATH = "testdata" + + const format = "{{.Caller}} --> {{.Callee}}" + + for _, test := range []struct { + algo, format string + tests bool + want []string + }{ + {"rta", format, false, []string{ + // rta imprecisely shows cross product of {main,main2} x {C,D} + `pkg.main --> (pkg.C).f`, + `pkg.main --> (pkg.D).f`, + `pkg.main --> pkg.main2`, + `pkg.main2 --> (pkg.C).f`, + `pkg.main2 --> (pkg.D).f`, + }}, + {"pta", format, false, []string{ + // pta distinguishes main->C, main2->D. Also has a root node. + `<root> --> pkg.init`, + `<root> --> pkg.main`, + `pkg.main --> (pkg.C).f`, + `pkg.main --> pkg.main2`, + `pkg.main2 --> (pkg.D).f`, + }}, + // tests: main is not called. + {"rta", format, true, []string{ + `pkg.Example --> (pkg.C).f`, + `test$main.init --> pkg.init`, + }}, + {"pta", format, true, []string{ + `<root> --> pkg.Example`, + `<root> --> test$main.init`, + `pkg.Example --> (pkg.C).f`, + `test$main.init --> pkg.init`, + }}, + } { + stdout = new(bytes.Buffer) + if err := doCallgraph(&ctxt, test.algo, test.format, test.tests, []string{"pkg"}); err != nil { + t.Error(err) + continue + } + + got := sortedLines(fmt.Sprint(stdout)) + if !reflect.DeepEqual(got, test.want) { + t.Errorf("callgraph(%q, %q, %t):\ngot:\n%s\nwant:\n%s", + test.algo, test.format, test.tests, + strings.Join(got, "\n"), + strings.Join(test.want, "\n")) + } + } +} + +func sortedLines(s string) []string { + s = strings.TrimSpace(s) + lines := strings.Split(s, "\n") + sort.Strings(lines) + return lines +} diff --git a/vendor/golang.org/x/tools/cmd/callgraph/testdata/src/pkg/pkg.go b/vendor/golang.org/x/tools/cmd/callgraph/testdata/src/pkg/pkg.go new file mode 100644 index 0000000000..b81c97fba6 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/callgraph/testdata/src/pkg/pkg.go @@ -0,0 +1,25 @@ +package main + +type I interface { + f() +} + +type C int + +func (C) f() {} + +type D int + +func (D) f() {} + +func main() { + var i I = C(0) + i.f() // dynamic call + + main2() +} + +func main2() { + var i I = D(0) + i.f() // dynamic call +} diff --git a/vendor/golang.org/x/tools/cmd/callgraph/testdata/src/pkg/pkg_test.go b/vendor/golang.org/x/tools/cmd/callgraph/testdata/src/pkg/pkg_test.go new file mode 100644 index 0000000000..d6247577b0 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/callgraph/testdata/src/pkg/pkg_test.go @@ -0,0 +1,7 @@ +package main + +// Don't import "testing", it adds a lot of callgraph edges. + +func Example() { + C(0).f() +} diff --git a/vendor/golang.org/x/tools/cmd/cover/README b/vendor/golang.org/x/tools/cmd/cover/README new file mode 100644 index 0000000000..ff9523d4bd --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/cover/README @@ -0,0 +1,2 @@ +NOTE: For Go releases 1.5 and later, this tool lives in the +standard repository. The code here is not maintained. diff --git a/vendor/golang.org/x/tools/cmd/cover/cover.go b/vendor/golang.org/x/tools/cmd/cover/cover.go new file mode 100644 index 0000000000..e09336499b --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/cover/cover.go @@ -0,0 +1,722 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "bytes" + "flag" + "fmt" + "go/ast" + "go/parser" + "go/printer" + "go/token" + "io" + "io/ioutil" + "log" + "os" + "path/filepath" + "sort" + "strconv" + "strings" +) + +const usageMessage = "" + + `Usage of 'go tool cover': +Given a coverage profile produced by 'go test': + go test -coverprofile=c.out + +Open a web browser displaying annotated source code: + go tool cover -html=c.out + +Write out an HTML file instead of launching a web browser: + go tool cover -html=c.out -o coverage.html + +Display coverage percentages to stdout for each function: + go tool cover -func=c.out + +Finally, to generate modified source code with coverage annotations +(what go test -cover does): + go tool cover -mode=set -var=CoverageVariableName program.go +` + +func usage() { + fmt.Fprintln(os.Stderr, usageMessage) + fmt.Fprintln(os.Stderr, "Flags:") + flag.PrintDefaults() + fmt.Fprintln(os.Stderr, "\n Only one of -html, -func, or -mode may be set.") + os.Exit(2) +} + +var ( + mode = flag.String("mode", "", "coverage mode: set, count, atomic") + varVar = flag.String("var", "GoCover", "name of coverage variable to generate") + output = flag.String("o", "", "file for output; default: stdout") + htmlOut = flag.String("html", "", "generate HTML representation of coverage profile") + funcOut = flag.String("func", "", "output coverage profile information for each function") +) + +var profile string // The profile to read; the value of -html or -func + +var counterStmt func(*File, ast.Expr) ast.Stmt + +const ( + atomicPackagePath = "sync/atomic" + atomicPackageName = "_cover_atomic_" +) + +func main() { + flag.Usage = usage + flag.Parse() + + // Usage information when no arguments. + if flag.NFlag() == 0 && flag.NArg() == 0 { + flag.Usage() + } + + err := parseFlags() + if err != nil { + fmt.Fprintln(os.Stderr, err) + fmt.Fprintln(os.Stderr, `For usage information, run "go tool cover -help"`) + os.Exit(2) + } + + // Generate coverage-annotated source. + if *mode != "" { + annotate(flag.Arg(0)) + return + } + + // Output HTML or function coverage information. + if *htmlOut != "" { + err = htmlOutput(profile, *output) + } else { + err = funcOutput(profile, *output) + } + + if err != nil { + fmt.Fprintf(os.Stderr, "cover: %v\n", err) + os.Exit(2) + } +} + +// parseFlags sets the profile and counterStmt globals and performs validations. +func parseFlags() error { + profile = *htmlOut + if *funcOut != "" { + if profile != "" { + return fmt.Errorf("too many options") + } + profile = *funcOut + } + + // Must either display a profile or rewrite Go source. + if (profile == "") == (*mode == "") { + return fmt.Errorf("too many options") + } + + if *mode != "" { + switch *mode { + case "set": + counterStmt = setCounterStmt + case "count": + counterStmt = incCounterStmt + case "atomic": + counterStmt = atomicCounterStmt + default: + return fmt.Errorf("unknown -mode %v", *mode) + } + + if flag.NArg() == 0 { + return fmt.Errorf("missing source file") + } else if flag.NArg() == 1 { + return nil + } + } else if flag.NArg() == 0 { + return nil + } + return fmt.Errorf("too many arguments") +} + +// Block represents the information about a basic block to be recorded in the analysis. +// Note: Our definition of basic block is based on control structures; we don't break +// apart && and ||. We could but it doesn't seem important enough to bother. +type Block struct { + startByte token.Pos + endByte token.Pos + numStmt int +} + +// File is a wrapper for the state of a file used in the parser. +// The basic parse tree walker is a method of this type. +type File struct { + fset *token.FileSet + name string // Name of file. + astFile *ast.File + blocks []Block + atomicPkg string // Package name for "sync/atomic" in this file. +} + +// Visit implements the ast.Visitor interface. +func (f *File) Visit(node ast.Node) ast.Visitor { + switch n := node.(type) { + case *ast.BlockStmt: + // If it's a switch or select, the body is a list of case clauses; don't tag the block itself. + if len(n.List) > 0 { + switch n.List[0].(type) { + case *ast.CaseClause: // switch + for _, n := range n.List { + clause := n.(*ast.CaseClause) + clause.Body = f.addCounters(clause.Pos(), clause.End(), clause.Body, false) + } + return f + case *ast.CommClause: // select + for _, n := range n.List { + clause := n.(*ast.CommClause) + clause.Body = f.addCounters(clause.Pos(), clause.End(), clause.Body, false) + } + return f + } + } + n.List = f.addCounters(n.Lbrace, n.Rbrace+1, n.List, true) // +1 to step past closing brace. + case *ast.IfStmt: + ast.Walk(f, n.Body) + if n.Else == nil { + return nil + } + // The elses are special, because if we have + // if x { + // } else if y { + // } + // we want to cover the "if y". To do this, we need a place to drop the counter, + // so we add a hidden block: + // if x { + // } else { + // if y { + // } + // } + switch stmt := n.Else.(type) { + case *ast.IfStmt: + block := &ast.BlockStmt{ + Lbrace: n.Body.End(), // Start at end of the "if" block so the covered part looks like it starts at the "else". + List: []ast.Stmt{stmt}, + Rbrace: stmt.End(), + } + n.Else = block + case *ast.BlockStmt: + stmt.Lbrace = n.Body.End() // Start at end of the "if" block so the covered part looks like it starts at the "else". + default: + panic("unexpected node type in if") + } + ast.Walk(f, n.Else) + return nil + case *ast.SelectStmt: + // Don't annotate an empty select - creates a syntax error. + if n.Body == nil || len(n.Body.List) == 0 { + return nil + } + case *ast.SwitchStmt: + // Don't annotate an empty switch - creates a syntax error. + if n.Body == nil || len(n.Body.List) == 0 { + return nil + } + case *ast.TypeSwitchStmt: + // Don't annotate an empty type switch - creates a syntax error. + if n.Body == nil || len(n.Body.List) == 0 { + return nil + } + } + return f +} + +// unquote returns the unquoted string. +func unquote(s string) string { + t, err := strconv.Unquote(s) + if err != nil { + log.Fatalf("cover: improperly quoted string %q\n", s) + } + return t +} + +// addImport adds an import for the specified path, if one does not already exist, and returns +// the local package name. +func (f *File) addImport(path string) string { + // Does the package already import it? + for _, s := range f.astFile.Imports { + if unquote(s.Path.Value) == path { + if s.Name != nil { + return s.Name.Name + } + return filepath.Base(path) + } + } + newImport := &ast.ImportSpec{ + Name: ast.NewIdent(atomicPackageName), + Path: &ast.BasicLit{ + Kind: token.STRING, + Value: fmt.Sprintf("%q", path), + }, + } + impDecl := &ast.GenDecl{ + Tok: token.IMPORT, + Specs: []ast.Spec{ + newImport, + }, + } + // Make the new import the first Decl in the file. + astFile := f.astFile + astFile.Decls = append(astFile.Decls, nil) + copy(astFile.Decls[1:], astFile.Decls[0:]) + astFile.Decls[0] = impDecl + astFile.Imports = append(astFile.Imports, newImport) + + // Now refer to the package, just in case it ends up unused. + // That is, append to the end of the file the declaration + // var _ = _cover_atomic_.AddUint32 + reference := &ast.GenDecl{ + Tok: token.VAR, + Specs: []ast.Spec{ + &ast.ValueSpec{ + Names: []*ast.Ident{ + ast.NewIdent("_"), + }, + Values: []ast.Expr{ + &ast.SelectorExpr{ + X: ast.NewIdent(atomicPackageName), + Sel: ast.NewIdent("AddUint32"), + }, + }, + }, + }, + } + astFile.Decls = append(astFile.Decls, reference) + return atomicPackageName +} + +var slashslash = []byte("//") + +// initialComments returns the prefix of content containing only +// whitespace and line comments. Any +build directives must appear +// within this region. This approach is more reliable than using +// go/printer to print a modified AST containing comments. +// +func initialComments(content []byte) []byte { + // Derived from go/build.Context.shouldBuild. + end := 0 + p := content + for len(p) > 0 { + line := p + if i := bytes.IndexByte(line, '\n'); i >= 0 { + line, p = line[:i], p[i+1:] + } else { + p = p[len(p):] + } + line = bytes.TrimSpace(line) + if len(line) == 0 { // Blank line. + end = len(content) - len(p) + continue + } + if !bytes.HasPrefix(line, slashslash) { // Not comment line. + break + } + } + return content[:end] +} + +func annotate(name string) { + fset := token.NewFileSet() + content, err := ioutil.ReadFile(name) + if err != nil { + log.Fatalf("cover: %s: %s", name, err) + } + parsedFile, err := parser.ParseFile(fset, name, content, parser.ParseComments) + if err != nil { + log.Fatalf("cover: %s: %s", name, err) + } + parsedFile.Comments = trimComments(parsedFile, fset) + + file := &File{ + fset: fset, + name: name, + astFile: parsedFile, + } + if *mode == "atomic" { + file.atomicPkg = file.addImport(atomicPackagePath) + } + ast.Walk(file, file.astFile) + fd := os.Stdout + if *output != "" { + var err error + fd, err = os.Create(*output) + if err != nil { + log.Fatalf("cover: %s", err) + } + } + fd.Write(initialComments(content)) // Retain '// +build' directives. + file.print(fd) + // After printing the source tree, add some declarations for the counters etc. + // We could do this by adding to the tree, but it's easier just to print the text. + file.addVariables(fd) +} + +// trimComments drops all but the //go: comments, some of which are semantically important. +// We drop all others because they can appear in places that cause our counters +// to appear in syntactically incorrect places. //go: appears at the beginning of +// the line and is syntactically safe. +func trimComments(file *ast.File, fset *token.FileSet) []*ast.CommentGroup { + var comments []*ast.CommentGroup + for _, group := range file.Comments { + var list []*ast.Comment + for _, comment := range group.List { + if strings.HasPrefix(comment.Text, "//go:") && fset.Position(comment.Slash).Column == 1 { + list = append(list, comment) + } + } + if list != nil { + comments = append(comments, &ast.CommentGroup{List: list}) + } + } + return comments +} + +func (f *File) print(w io.Writer) { + printer.Fprint(w, f.fset, f.astFile) +} + +// intLiteral returns an ast.BasicLit representing the integer value. +func (f *File) intLiteral(i int) *ast.BasicLit { + node := &ast.BasicLit{ + Kind: token.INT, + Value: fmt.Sprint(i), + } + return node +} + +// index returns an ast.BasicLit representing the number of counters present. +func (f *File) index() *ast.BasicLit { + return f.intLiteral(len(f.blocks)) +} + +// setCounterStmt returns the expression: __count[23] = 1. +func setCounterStmt(f *File, counter ast.Expr) ast.Stmt { + return &ast.AssignStmt{ + Lhs: []ast.Expr{counter}, + Tok: token.ASSIGN, + Rhs: []ast.Expr{f.intLiteral(1)}, + } +} + +// incCounterStmt returns the expression: __count[23]++. +func incCounterStmt(f *File, counter ast.Expr) ast.Stmt { + return &ast.IncDecStmt{ + X: counter, + Tok: token.INC, + } +} + +// atomicCounterStmt returns the expression: atomic.AddUint32(&__count[23], 1) +func atomicCounterStmt(f *File, counter ast.Expr) ast.Stmt { + return &ast.ExprStmt{ + X: &ast.CallExpr{ + Fun: &ast.SelectorExpr{ + X: ast.NewIdent(f.atomicPkg), + Sel: ast.NewIdent("AddUint32"), + }, + Args: []ast.Expr{&ast.UnaryExpr{ + Op: token.AND, + X: counter, + }, + f.intLiteral(1), + }, + }, + } +} + +// newCounter creates a new counter expression of the appropriate form. +func (f *File) newCounter(start, end token.Pos, numStmt int) ast.Stmt { + counter := &ast.IndexExpr{ + X: &ast.SelectorExpr{ + X: ast.NewIdent(*varVar), + Sel: ast.NewIdent("Count"), + }, + Index: f.index(), + } + stmt := counterStmt(f, counter) + f.blocks = append(f.blocks, Block{start, end, numStmt}) + return stmt +} + +// addCounters takes a list of statements and adds counters to the beginning of +// each basic block at the top level of that list. For instance, given +// +// S1 +// if cond { +// S2 +// } +// S3 +// +// counters will be added before S1 and before S3. The block containing S2 +// will be visited in a separate call. +// TODO: Nested simple blocks get unnecessary (but correct) counters +func (f *File) addCounters(pos, blockEnd token.Pos, list []ast.Stmt, extendToClosingBrace bool) []ast.Stmt { + // Special case: make sure we add a counter to an empty block. Can't do this below + // or we will add a counter to an empty statement list after, say, a return statement. + if len(list) == 0 { + return []ast.Stmt{f.newCounter(pos, blockEnd, 0)} + } + // We have a block (statement list), but it may have several basic blocks due to the + // appearance of statements that affect the flow of control. + var newList []ast.Stmt + for { + // Find first statement that affects flow of control (break, continue, if, etc.). + // It will be the last statement of this basic block. + var last int + end := blockEnd + for last = 0; last < len(list); last++ { + end = f.statementBoundary(list[last]) + if f.endsBasicSourceBlock(list[last]) { + extendToClosingBrace = false // Block is broken up now. + last++ + break + } + } + if extendToClosingBrace { + end = blockEnd + } + if pos != end { // Can have no source to cover if e.g. blocks abut. + newList = append(newList, f.newCounter(pos, end, last)) + } + newList = append(newList, list[0:last]...) + list = list[last:] + if len(list) == 0 { + break + } + pos = list[0].Pos() + } + return newList +} + +// hasFuncLiteral reports the existence and position of the first func literal +// in the node, if any. If a func literal appears, it usually marks the termination +// of a basic block because the function body is itself a block. +// Therefore we draw a line at the start of the body of the first function literal we find. +// TODO: what if there's more than one? Probably doesn't matter much. +func hasFuncLiteral(n ast.Node) (bool, token.Pos) { + if n == nil { + return false, 0 + } + var literal funcLitFinder + ast.Walk(&literal, n) + return literal.found(), token.Pos(literal) +} + +// statementBoundary finds the location in s that terminates the current basic +// block in the source. +func (f *File) statementBoundary(s ast.Stmt) token.Pos { + // Control flow statements are easy. + switch s := s.(type) { + case *ast.BlockStmt: + // Treat blocks like basic blocks to avoid overlapping counters. + return s.Lbrace + case *ast.IfStmt: + found, pos := hasFuncLiteral(s.Init) + if found { + return pos + } + found, pos = hasFuncLiteral(s.Cond) + if found { + return pos + } + return s.Body.Lbrace + case *ast.ForStmt: + found, pos := hasFuncLiteral(s.Init) + if found { + return pos + } + found, pos = hasFuncLiteral(s.Cond) + if found { + return pos + } + found, pos = hasFuncLiteral(s.Post) + if found { + return pos + } + return s.Body.Lbrace + case *ast.LabeledStmt: + return f.statementBoundary(s.Stmt) + case *ast.RangeStmt: + found, pos := hasFuncLiteral(s.X) + if found { + return pos + } + return s.Body.Lbrace + case *ast.SwitchStmt: + found, pos := hasFuncLiteral(s.Init) + if found { + return pos + } + found, pos = hasFuncLiteral(s.Tag) + if found { + return pos + } + return s.Body.Lbrace + case *ast.SelectStmt: + return s.Body.Lbrace + case *ast.TypeSwitchStmt: + found, pos := hasFuncLiteral(s.Init) + if found { + return pos + } + return s.Body.Lbrace + } + // If not a control flow statement, it is a declaration, expression, call, etc. and it may have a function literal. + // If it does, that's tricky because we want to exclude the body of the function from this block. + // Draw a line at the start of the body of the first function literal we find. + // TODO: what if there's more than one? Probably doesn't matter much. + found, pos := hasFuncLiteral(s) + if found { + return pos + } + return s.End() +} + +// endsBasicSourceBlock reports whether s changes the flow of control: break, if, etc., +// or if it's just problematic, for instance contains a function literal, which will complicate +// accounting due to the block-within-an expression. +func (f *File) endsBasicSourceBlock(s ast.Stmt) bool { + switch s := s.(type) { + case *ast.BlockStmt: + // Treat blocks like basic blocks to avoid overlapping counters. + return true + case *ast.BranchStmt: + return true + case *ast.ForStmt: + return true + case *ast.IfStmt: + return true + case *ast.LabeledStmt: + return f.endsBasicSourceBlock(s.Stmt) + case *ast.RangeStmt: + return true + case *ast.SwitchStmt: + return true + case *ast.SelectStmt: + return true + case *ast.TypeSwitchStmt: + return true + case *ast.ExprStmt: + // Calls to panic change the flow. + // We really should verify that "panic" is the predefined function, + // but without type checking we can't and the likelihood of it being + // an actual problem is vanishingly small. + if call, ok := s.X.(*ast.CallExpr); ok { + if ident, ok := call.Fun.(*ast.Ident); ok && ident.Name == "panic" && len(call.Args) == 1 { + return true + } + } + } + found, _ := hasFuncLiteral(s) + return found +} + +// funcLitFinder implements the ast.Visitor pattern to find the location of any +// function literal in a subtree. +type funcLitFinder token.Pos + +func (f *funcLitFinder) Visit(node ast.Node) (w ast.Visitor) { + if f.found() { + return nil // Prune search. + } + switch n := node.(type) { + case *ast.FuncLit: + *f = funcLitFinder(n.Body.Lbrace) + return nil // Prune search. + } + return f +} + +func (f *funcLitFinder) found() bool { + return token.Pos(*f) != token.NoPos +} + +// Sort interface for []block1; used for self-check in addVariables. + +type block1 struct { + Block + index int +} + +type blockSlice []block1 + +func (b blockSlice) Len() int { return len(b) } +func (b blockSlice) Less(i, j int) bool { return b[i].startByte < b[j].startByte } +func (b blockSlice) Swap(i, j int) { b[i], b[j] = b[j], b[i] } + +// offset translates a token position into a 0-indexed byte offset. +func (f *File) offset(pos token.Pos) int { + return f.fset.Position(pos).Offset +} + +// addVariables adds to the end of the file the declarations to set up the counter and position variables. +func (f *File) addVariables(w io.Writer) { + // Self-check: Verify that the instrumented basic blocks are disjoint. + t := make([]block1, len(f.blocks)) + for i := range f.blocks { + t[i].Block = f.blocks[i] + t[i].index = i + } + sort.Sort(blockSlice(t)) + for i := 1; i < len(t); i++ { + if t[i-1].endByte > t[i].startByte { + fmt.Fprintf(os.Stderr, "cover: internal error: block %d overlaps block %d\n", t[i-1].index, t[i].index) + // Note: error message is in byte positions, not token positions. + fmt.Fprintf(os.Stderr, "\t%s:#%d,#%d %s:#%d,#%d\n", + f.name, f.offset(t[i-1].startByte), f.offset(t[i-1].endByte), + f.name, f.offset(t[i].startByte), f.offset(t[i].endByte)) + } + } + + // Declare the coverage struct as a package-level variable. + fmt.Fprintf(w, "\nvar %s = struct {\n", *varVar) + fmt.Fprintf(w, "\tCount [%d]uint32\n", len(f.blocks)) + fmt.Fprintf(w, "\tPos [3 * %d]uint32\n", len(f.blocks)) + fmt.Fprintf(w, "\tNumStmt [%d]uint16\n", len(f.blocks)) + fmt.Fprintf(w, "} {\n") + + // Initialize the position array field. + fmt.Fprintf(w, "\tPos: [3 * %d]uint32{\n", len(f.blocks)) + + // A nice long list of positions. Each position is encoded as follows to reduce size: + // - 32-bit starting line number + // - 32-bit ending line number + // - (16 bit ending column number << 16) | (16-bit starting column number). + for i, block := range f.blocks { + start := f.fset.Position(block.startByte) + end := f.fset.Position(block.endByte) + fmt.Fprintf(w, "\t\t%d, %d, %#x, // [%d]\n", start.Line, end.Line, (end.Column&0xFFFF)<<16|(start.Column&0xFFFF), i) + } + + // Close the position array. + fmt.Fprintf(w, "\t},\n") + + // Initialize the position array field. + fmt.Fprintf(w, "\tNumStmt: [%d]uint16{\n", len(f.blocks)) + + // A nice long list of statements-per-block, so we can give a conventional + // valuation of "percent covered". To save space, it's a 16-bit number, so we + // clamp it if it overflows - won't matter in practice. + for i, block := range f.blocks { + n := block.numStmt + if n > 1<<16-1 { + n = 1<<16 - 1 + } + fmt.Fprintf(w, "\t\t%d, // %d\n", n, i) + } + + // Close the statements-per-block array. + fmt.Fprintf(w, "\t},\n") + + // Close the struct initialization. + fmt.Fprintf(w, "}\n") +} diff --git a/vendor/golang.org/x/tools/cmd/cover/cover_test.go b/vendor/golang.org/x/tools/cmd/cover/cover_test.go new file mode 100644 index 0000000000..a18778b5b4 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/cover/cover_test.go @@ -0,0 +1,94 @@ +// Copyright 2013 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. + +// No testdata on Android. + +// +build !android + +package main_test + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "testing" +) + +const ( + // Data directory, also the package directory for the test. + testdata = "testdata" + + // Binaries we compile. + testcover = "./testcover.exe" +) + +var ( + // Files we use. + testMain = filepath.Join(testdata, "main.go") + testTest = filepath.Join(testdata, "test.go") + coverInput = filepath.Join(testdata, "test_line.go") + coverOutput = filepath.Join(testdata, "test_cover.go") +) + +var debug = false // Keeps the rewritten files around if set. + +// Run this shell script, but do it in Go so it can be run by "go test". +// +// replace the word LINE with the line number < testdata/test.go > testdata/test_line.go +// go build -o ./testcover +// ./testcover -mode=count -var=CoverTest -o ./testdata/test_cover.go testdata/test_line.go +// go run ./testdata/main.go ./testdata/test.go +// +func TestCover(t *testing.T) { + // Read in the test file (testTest) and write it, with LINEs specified, to coverInput. + file, err := ioutil.ReadFile(testTest) + if err != nil { + t.Fatal(err) + } + lines := bytes.Split(file, []byte("\n")) + for i, line := range lines { + lines[i] = bytes.Replace(line, []byte("LINE"), []byte(fmt.Sprint(i+1)), -1) + } + err = ioutil.WriteFile(coverInput, bytes.Join(lines, []byte("\n")), 0666) + if err != nil { + t.Fatal(err) + } + + // defer removal of test_line.go + if !debug { + defer os.Remove(coverInput) + } + + // go build -o testcover + cmd := exec.Command("go", "build", "-o", testcover) + run(cmd, t) + + // defer removal of testcover + defer os.Remove(testcover) + + // ./testcover -mode=count -var=coverTest -o ./testdata/test_cover.go testdata/test_line.go + cmd = exec.Command(testcover, "-mode=count", "-var=coverTest", "-o", coverOutput, coverInput) + run(cmd, t) + + // defer removal of ./testdata/test_cover.go + if !debug { + defer os.Remove(coverOutput) + } + + // go run ./testdata/main.go ./testdata/test.go + cmd = exec.Command("go", "run", testMain, coverOutput) + run(cmd, t) +} + +func run(c *exec.Cmd, t *testing.T) { + c.Stdout = os.Stdout + c.Stderr = os.Stderr + err := c.Run() + if err != nil { + t.Fatal(err) + } +} diff --git a/vendor/golang.org/x/tools/cmd/cover/doc.go b/vendor/golang.org/x/tools/cmd/cover/doc.go new file mode 100644 index 0000000000..b74d5b3ce3 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/cover/doc.go @@ -0,0 +1,27 @@ +// Copyright 2013 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. + +/* +Cover is a program for analyzing the coverage profiles generated by +'go test -coverprofile=cover.out'. + +Cover is also used by 'go test -cover' to rewrite the source code with +annotations to track which parts of each function are executed. +It operates on one Go source file at a time, computing approximate +basic block information by studying the source. It is thus more portable +than binary-rewriting coverage tools, but also a little less capable. +For instance, it does not probe inside && and || expressions, and can +be mildly confused by single statements with multiple function literals. + +For usage information, please see: + go help testflag + go tool cover -help + +No longer maintained: + +For Go releases 1.5 and later, this tool lives in the +standard repository. The code here is not maintained. + +*/ +package main // import "golang.org/x/tools/cmd/cover" diff --git a/vendor/golang.org/x/tools/cmd/cover/func.go b/vendor/golang.org/x/tools/cmd/cover/func.go new file mode 100644 index 0000000000..41d9fceca5 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/cover/func.go @@ -0,0 +1,166 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements the visitor that computes the (line, column)-(line-column) range for each function. + +package main + +import ( + "bufio" + "fmt" + "go/ast" + "go/build" + "go/parser" + "go/token" + "os" + "path/filepath" + "text/tabwriter" + + "golang.org/x/tools/cover" +) + +// funcOutput takes two file names as arguments, a coverage profile to read as input and an output +// file to write ("" means to write to standard output). The function reads the profile and produces +// as output the coverage data broken down by function, like this: +// +// fmt/format.go:30: init 100.0% +// fmt/format.go:57: clearflags 100.0% +// ... +// fmt/scan.go:1046: doScan 100.0% +// fmt/scan.go:1075: advance 96.2% +// fmt/scan.go:1119: doScanf 96.8% +// total: (statements) 91.9% + +func funcOutput(profile, outputFile string) error { + profiles, err := cover.ParseProfiles(profile) + if err != nil { + return err + } + + var out *bufio.Writer + if outputFile == "" { + out = bufio.NewWriter(os.Stdout) + } else { + fd, err := os.Create(outputFile) + if err != nil { + return err + } + defer fd.Close() + out = bufio.NewWriter(fd) + } + defer out.Flush() + + tabber := tabwriter.NewWriter(out, 1, 8, 1, '\t', 0) + defer tabber.Flush() + + var total, covered int64 + for _, profile := range profiles { + fn := profile.FileName + file, err := findFile(fn) + if err != nil { + return err + } + funcs, err := findFuncs(file) + if err != nil { + return err + } + // Now match up functions and profile blocks. + for _, f := range funcs { + c, t := f.coverage(profile) + fmt.Fprintf(tabber, "%s:%d:\t%s\t%.1f%%\n", fn, f.startLine, f.name, 100.0*float64(c)/float64(t)) + total += t + covered += c + } + } + fmt.Fprintf(tabber, "total:\t(statements)\t%.1f%%\n", 100.0*float64(covered)/float64(total)) + + return nil +} + +// findFuncs parses the file and returns a slice of FuncExtent descriptors. +func findFuncs(name string) ([]*FuncExtent, error) { + fset := token.NewFileSet() + parsedFile, err := parser.ParseFile(fset, name, nil, 0) + if err != nil { + return nil, err + } + visitor := &FuncVisitor{ + fset: fset, + name: name, + astFile: parsedFile, + } + ast.Walk(visitor, visitor.astFile) + return visitor.funcs, nil +} + +// FuncExtent describes a function's extent in the source by file and position. +type FuncExtent struct { + name string + startLine int + startCol int + endLine int + endCol int +} + +// FuncVisitor implements the visitor that builds the function position list for a file. +type FuncVisitor struct { + fset *token.FileSet + name string // Name of file. + astFile *ast.File + funcs []*FuncExtent +} + +// Visit implements the ast.Visitor interface. +func (v *FuncVisitor) Visit(node ast.Node) ast.Visitor { + switch n := node.(type) { + case *ast.FuncDecl: + start := v.fset.Position(n.Pos()) + end := v.fset.Position(n.End()) + fe := &FuncExtent{ + name: n.Name.Name, + startLine: start.Line, + startCol: start.Column, + endLine: end.Line, + endCol: end.Column, + } + v.funcs = append(v.funcs, fe) + } + return v +} + +// coverage returns the fraction of the statements in the function that were covered, as a numerator and denominator. +func (f *FuncExtent) coverage(profile *cover.Profile) (num, den int64) { + // We could avoid making this n^2 overall by doing a single scan and annotating the functions, + // but the sizes of the data structures is never very large and the scan is almost instantaneous. + var covered, total int64 + // The blocks are sorted, so we can stop counting as soon as we reach the end of the relevant block. + for _, b := range profile.Blocks { + if b.StartLine > f.endLine || (b.StartLine == f.endLine && b.StartCol >= f.endCol) { + // Past the end of the function. + break + } + if b.EndLine < f.startLine || (b.EndLine == f.startLine && b.EndCol <= f.startCol) { + // Before the beginning of the function + continue + } + total += int64(b.NumStmt) + if b.Count > 0 { + covered += int64(b.NumStmt) + } + } + if total == 0 { + total = 1 // Avoid zero denominator. + } + return covered, total +} + +// findFile finds the location of the named file in GOROOT, GOPATH etc. +func findFile(file string) (string, error) { + dir, file := filepath.Split(file) + pkg, err := build.Import(dir, ".", build.FindOnly) + if err != nil { + return "", fmt.Errorf("can't find %q: %v", file, err) + } + return filepath.Join(pkg.Dir, file), nil +} diff --git a/vendor/golang.org/x/tools/cmd/cover/html.go b/vendor/golang.org/x/tools/cmd/cover/html.go new file mode 100644 index 0000000000..f6b226406a --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/cover/html.go @@ -0,0 +1,281 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "bufio" + "bytes" + "fmt" + "html/template" + "io" + "io/ioutil" + "math" + "os" + "os/exec" + "path/filepath" + "runtime" + + "golang.org/x/tools/cover" +) + +// htmlOutput reads the profile data from profile and generates an HTML +// coverage report, writing it to outfile. If outfile is empty, +// it writes the report to a temporary file and opens it in a web browser. +func htmlOutput(profile, outfile string) error { + profiles, err := cover.ParseProfiles(profile) + if err != nil { + return err + } + + var d templateData + + for _, profile := range profiles { + fn := profile.FileName + if profile.Mode == "set" { + d.Set = true + } + file, err := findFile(fn) + if err != nil { + return err + } + src, err := ioutil.ReadFile(file) + if err != nil { + return fmt.Errorf("can't read %q: %v", fn, err) + } + var buf bytes.Buffer + err = htmlGen(&buf, src, profile.Boundaries(src)) + if err != nil { + return err + } + d.Files = append(d.Files, &templateFile{ + Name: fn, + Body: template.HTML(buf.String()), + Coverage: percentCovered(profile), + }) + } + + var out *os.File + if outfile == "" { + var dir string + dir, err = ioutil.TempDir("", "cover") + if err != nil { + return err + } + out, err = os.Create(filepath.Join(dir, "coverage.html")) + } else { + out, err = os.Create(outfile) + } + err = htmlTemplate.Execute(out, d) + if err == nil { + err = out.Close() + } + if err != nil { + return err + } + + if outfile == "" { + if !startBrowser("file://" + out.Name()) { + fmt.Fprintf(os.Stderr, "HTML output written to %s\n", out.Name()) + } + } + + return nil +} + +// percentCovered returns, as a percentage, the fraction of the statements in +// the profile covered by the test run. +// In effect, it reports the coverage of a given source file. +func percentCovered(p *cover.Profile) float64 { + var total, covered int64 + for _, b := range p.Blocks { + total += int64(b.NumStmt) + if b.Count > 0 { + covered += int64(b.NumStmt) + } + } + if total == 0 { + return 0 + } + return float64(covered) / float64(total) * 100 +} + +// htmlGen generates an HTML coverage report with the provided filename, +// source code, and tokens, and writes it to the given Writer. +func htmlGen(w io.Writer, src []byte, boundaries []cover.Boundary) error { + dst := bufio.NewWriter(w) + for i := range src { + for len(boundaries) > 0 && boundaries[0].Offset == i { + b := boundaries[0] + if b.Start { + n := 0 + if b.Count > 0 { + n = int(math.Floor(b.Norm*9)) + 1 + } + fmt.Fprintf(dst, `<span class="cov%v" title="%v">`, n, b.Count) + } else { + dst.WriteString("</span>") + } + boundaries = boundaries[1:] + } + switch b := src[i]; b { + case '>': + dst.WriteString(">") + case '<': + dst.WriteString("<") + case '&': + dst.WriteString("&") + case '\t': + dst.WriteString(" ") + default: + dst.WriteByte(b) + } + } + return dst.Flush() +} + +// startBrowser tries to open the URL in a browser +// and reports whether it succeeds. +func startBrowser(url string) bool { + // try to start the browser + var args []string + switch runtime.GOOS { + case "darwin": + args = []string{"open"} + case "windows": + args = []string{"cmd", "/c", "start"} + default: + args = []string{"xdg-open"} + } + cmd := exec.Command(args[0], append(args[1:], url)...) + return cmd.Start() == nil +} + +// rgb returns an rgb value for the specified coverage value +// between 0 (no coverage) and 10 (max coverage). +func rgb(n int) string { + if n == 0 { + return "rgb(192, 0, 0)" // Red + } + // Gradient from gray to green. + r := 128 - 12*(n-1) + g := 128 + 12*(n-1) + b := 128 + 3*(n-1) + return fmt.Sprintf("rgb(%v, %v, %v)", r, g, b) +} + +// colors generates the CSS rules for coverage colors. +func colors() template.CSS { + var buf bytes.Buffer + for i := 0; i < 11; i++ { + fmt.Fprintf(&buf, ".cov%v { color: %v }\n", i, rgb(i)) + } + return template.CSS(buf.String()) +} + +var htmlTemplate = template.Must(template.New("html").Funcs(template.FuncMap{ + "colors": colors, +}).Parse(tmplHTML)) + +type templateData struct { + Files []*templateFile + Set bool +} + +type templateFile struct { + Name string + Body template.HTML + Coverage float64 +} + +const tmplHTML = ` +<!DOCTYPE html> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <style> + body { + background: black; + color: rgb(80, 80, 80); + } + body, pre, #legend span { + font-family: Menlo, monospace; + font-weight: bold; + } + #topbar { + background: black; + position: fixed; + top: 0; left: 0; right: 0; + height: 42px; + border-bottom: 1px solid rgb(80, 80, 80); + } + #content { + margin-top: 50px; + } + #nav, #legend { + float: left; + margin-left: 10px; + } + #legend { + margin-top: 12px; + } + #nav { + margin-top: 10px; + } + #legend span { + margin: 0 5px; + } + {{colors}} + </style> + </head> + <body> + <div id="topbar"> + <div id="nav"> + <select id="files"> + {{range $i, $f := .Files}} + <option value="file{{$i}}">{{$f.Name}} ({{printf "%.1f" $f.Coverage}}%)</option> + {{end}} + </select> + </div> + <div id="legend"> + <span>not tracked</span> + {{if .Set}} + <span class="cov0">not covered</span> + <span class="cov8">covered</span> + {{else}} + <span class="cov0">no coverage</span> + <span class="cov1">low coverage</span> + <span class="cov2">*</span> + <span class="cov3">*</span> + <span class="cov4">*</span> + <span class="cov5">*</span> + <span class="cov6">*</span> + <span class="cov7">*</span> + <span class="cov8">*</span> + <span class="cov9">*</span> + <span class="cov10">high coverage</span> + {{end}} + </div> + </div> + <div id="content"> + {{range $i, $f := .Files}} + <pre class="file" id="file{{$i}}" {{if $i}}style="display: none"{{end}}>{{$f.Body}}</pre> + {{end}} + </div> + </body> + <script> + (function() { + var files = document.getElementById('files'); + var visible = document.getElementById('file0'); + files.addEventListener('change', onChange, false); + function onChange() { + visible.style.display = 'none'; + visible = document.getElementById(files.value); + visible.style.display = 'block'; + window.scrollTo(0, 0); + } + })(); + </script> +</html> +` diff --git a/vendor/golang.org/x/tools/cmd/cover/testdata/main.go b/vendor/golang.org/x/tools/cmd/cover/testdata/main.go new file mode 100644 index 0000000000..6ed39c4f23 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/cover/testdata/main.go @@ -0,0 +1,112 @@ +// Copyright 2013 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. + +// Test runner for coverage test. This file is not coverage-annotated; test.go is. +// It knows the coverage counter is called "coverTest". + +package main + +import ( + "fmt" + "os" +) + +func main() { + testAll() + verify() +} + +type block struct { + count uint32 + line uint32 +} + +var counters = make(map[block]bool) + +// check records the location and expected value for a counter. +func check(line, count uint32) { + b := block{ + count, + line, + } + counters[b] = true +} + +// checkVal is a version of check that returns its extra argument, +// so it can be used in conditionals. +func checkVal(line, count uint32, val int) int { + b := block{ + count, + line, + } + counters[b] = true + return val +} + +var PASS = true + +// verify checks the expected counts against the actual. It runs after the test has completed. +func verify() { + for b := range counters { + got, index := count(b.line) + if b.count == anything && got != 0 { + got = anything + } + if got != b.count { + fmt.Fprintf(os.Stderr, "test_go:%d expected count %d got %d [counter %d]\n", b.line, b.count, got, index) + PASS = false + } + } + verifyPanic() + if !PASS { + fmt.Fprintf(os.Stderr, "FAIL\n") + os.Exit(2) + } +} + +// verifyPanic is a special check for the known counter that should be +// after the panic call in testPanic. +func verifyPanic() { + if coverTest.Count[panicIndex-1] != 1 { + // Sanity check for test before panic. + fmt.Fprintf(os.Stderr, "bad before panic") + PASS = false + } + if coverTest.Count[panicIndex] != 0 { + fmt.Fprintf(os.Stderr, "bad at panic: %d should be 0\n", coverTest.Count[panicIndex]) + PASS = false + } + if coverTest.Count[panicIndex+1] != 1 { + fmt.Fprintf(os.Stderr, "bad after panic") + PASS = false + } +} + +// count returns the count and index for the counter at the specified line. +func count(line uint32) (uint32, int) { + // Linear search is fine. Choose perfect fit over approximate. + // We can have a closing brace for a range on the same line as a condition for an "else if" + // and we don't want that brace to steal the count for the condition on the "if". + // Therefore we test for a perfect (lo==line && hi==line) match, but if we can't + // find that we take the first imperfect match. + index := -1 + indexLo := uint32(1e9) + for i := range coverTest.Count { + lo, hi := coverTest.Pos[3*i], coverTest.Pos[3*i+1] + if lo == line && line == hi { + return coverTest.Count[i], i + } + // Choose the earliest match (the counters are in unpredictable order). + if lo <= line && line <= hi && indexLo > lo { + index = i + indexLo = lo + } + } + if index == -1 { + fmt.Fprintln(os.Stderr, "cover_test: no counter for line", line) + PASS = false + return 0, 0 + } + return coverTest.Count[index], index +} diff --git a/vendor/golang.org/x/tools/cmd/cover/testdata/test.go b/vendor/golang.org/x/tools/cmd/cover/testdata/test.go new file mode 100644 index 0000000000..9013950a2b --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/cover/testdata/test.go @@ -0,0 +1,218 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This program is processed by the cover command, and then testAll is called. +// The test driver in main.go can then compare the coverage statistics with expectation. + +// The word LINE is replaced by the line number in this file. When the file is executed, +// the coverage processing has changed the line numbers, so we can't use runtime.Caller. + +package main + +const anything = 1e9 // Just some unlikely value that means "we got here, don't care how often" + +func testAll() { + testSimple() + testBlockRun() + testIf() + testFor() + testRange() + testSwitch() + testTypeSwitch() + testSelect1() + testSelect2() + testPanic() + testEmptySwitches() +} + +// The indexes of the counters in testPanic are known to main.go +const panicIndex = 3 + +// This test appears first because the index of its counters is known to main.go +func testPanic() { + defer func() { + recover() + }() + check(LINE, 1) + panic("should not get next line") + check(LINE, 0) // this is GoCover.Count[panicIndex] + // The next counter is in testSimple and it will be non-zero. + // If the panic above does not trigger a counter, the test will fail + // because GoCover.Count[panicIndex] will be the one in testSimple. +} + +func testSimple() { + check(LINE, 1) +} + +func testIf() { + if true { + check(LINE, 1) + } else { + check(LINE, 0) + } + if false { + check(LINE, 0) + } else { + check(LINE, 1) + } + for i := 0; i < 3; i++ { + if checkVal(LINE, 3, i) <= 2 { + check(LINE, 3) + } + if checkVal(LINE, 3, i) <= 1 { + check(LINE, 2) + } + if checkVal(LINE, 3, i) <= 0 { + check(LINE, 1) + } + } + for i := 0; i < 3; i++ { + if checkVal(LINE, 3, i) <= 1 { + check(LINE, 2) + } else { + check(LINE, 1) + } + } + for i := 0; i < 3; i++ { + if checkVal(LINE, 3, i) <= 0 { + check(LINE, 1) + } else if checkVal(LINE, 2, i) <= 1 { + check(LINE, 1) + } else if checkVal(LINE, 1, i) <= 2 { + check(LINE, 1) + } else if checkVal(LINE, 0, i) <= 3 { + check(LINE, 0) + } + } + if func(a, b int) bool { return a < b }(3, 4) { + check(LINE, 1) + } +} + +func testFor() { + for i := 0; i < 10; func() { i++; check(LINE, 10) }() { + check(LINE, 10) + } +} + +func testRange() { + for _, f := range []func(){ + func() { check(LINE, 1) }, + } { + f() + check(LINE, 1) + } +} + +func testBlockRun() { + check(LINE, 1) + { + check(LINE, 1) + } + { + check(LINE, 1) + } + check(LINE, 1) + { + check(LINE, 1) + } + { + check(LINE, 1) + } + check(LINE, 1) +} + +func testSwitch() { + for i := 0; i < 5; func() { i++; check(LINE, 5) }() { + switch i { + case 0: + check(LINE, 1) + case 1: + check(LINE, 1) + case 2: + check(LINE, 1) + default: + check(LINE, 2) + } + } +} + +func testTypeSwitch() { + var x = []interface{}{1, 2.0, "hi"} + for _, v := range x { + switch func() { check(LINE, 3) }(); v.(type) { + case int: + check(LINE, 1) + case float64: + check(LINE, 1) + case string: + check(LINE, 1) + case complex128: + check(LINE, 0) + default: + check(LINE, 0) + } + } +} + +func testSelect1() { + c := make(chan int) + go func() { + for i := 0; i < 1000; i++ { + c <- i + } + }() + for { + select { + case <-c: + check(LINE, anything) + case <-c: + check(LINE, anything) + default: + check(LINE, 1) + return + } + } +} + +func testSelect2() { + c1 := make(chan int, 1000) + c2 := make(chan int, 1000) + for i := 0; i < 1000; i++ { + c1 <- i + c2 <- i + } + for { + select { + case <-c1: + check(LINE, 1000) + case <-c2: + check(LINE, 1000) + default: + check(LINE, 1) + return + } + } +} + +// Empty control statements created syntax errors. This function +// is here just to be sure that those are handled correctly now. +func testEmptySwitches() { + check(LINE, 1) + switch 3 { + } + check(LINE, 1) + switch i := (interface{})(3).(int); i { + } + check(LINE, 1) + c := make(chan int) + go func() { + check(LINE, 1) + c <- 1 + select {} + }() + <-c + check(LINE, 1) +} diff --git a/vendor/golang.org/x/tools/cmd/digraph/digraph.go b/vendor/golang.org/x/tools/cmd/digraph/digraph.go new file mode 100644 index 0000000000..3ad2950015 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/digraph/digraph.go @@ -0,0 +1,540 @@ +// The digraph command performs queries over unlabelled directed graphs +// represented in text form. It is intended to integrate nicely with +// typical UNIX command pipelines. +// +// Since directed graphs (import graphs, reference graphs, call graphs, +// etc) often arise during software tool development and debugging, this +// command is included in the go.tools repository. +// +// TODO(adonovan): +// - support input files other than stdin +// - suport alternative formats (AT&T GraphViz, CSV, etc), +// a comment syntax, etc. +// - allow queries to nest, like Blaze query language. +// +package main // import "golang.org/x/tools/cmd/digraph" + +import ( + "bufio" + "bytes" + "errors" + "flag" + "fmt" + "io" + "os" + "sort" + "strconv" + "unicode" + "unicode/utf8" +) + +const Usage = `digraph: queries over directed graphs in text form. + +Graph format: + + Each line contains zero or more words. Words are separated by + unquoted whitespace; words may contain Go-style double-quoted portions, + allowing spaces and other characters to be expressed. + + Each field declares a node, and if there are more than one, + an edge from the first to each subsequent one. + The graph is provided on the standard input. + + For instance, the following (acyclic) graph specifies a partial order + among the subtasks of getting dressed: + + % cat clothes.txt + socks shoes + "boxer shorts" pants + pants belt shoes + shirt tie sweater + sweater jacket + hat + + The line "shirt tie sweater" indicates the two edges shirt -> tie and + shirt -> sweater, not shirt -> tie -> sweater. + +Supported queries: + + nodes + the set of all nodes + degree + the in-degree and out-degree of each node. + preds <label> ... + the set of immediate predecessors of the specified nodes + succs <label> ... + the set of immediate successors of the specified nodes + forward <label> ... + the set of nodes transitively reachable from the specified nodes + reverse <label> ... + the set of nodes that transitively reach the specified nodes + somepath <label> <label> + the list of nodes on some arbitrary path from the first node to the second + allpaths <label> <label> + the set of nodes on all paths from the first node to the second + sccs + all strongly connected components (one per line) + scc <label> + the set of nodes nodes strongly connected to the specified one + +Example usage: + + Show the transitive closure of imports of the digraph tool itself: + % go list -f '{{.ImportPath}}{{.Imports}}' ... | tr '[]' ' ' | + digraph forward golang.org/x/tools/cmd/digraph + + Show which clothes (see above) must be donned before a jacket: + % digraph reverse jacket <clothes.txt + +` + +func main() { + flag.Parse() + + args := flag.Args() + if len(args) == 0 { + fmt.Println(Usage) + return + } + + if err := digraph(args[0], args[1:]); err != nil { + fmt.Fprintf(os.Stderr, "digraph: %s\n", err) + os.Exit(1) + } +} + +type nodelist []string + +func (l nodelist) println(sep string) { + for i, label := range l { + if i > 0 { + fmt.Fprint(stdout, sep) + } + fmt.Fprint(stdout, label) + } + fmt.Fprintln(stdout) +} + +type nodeset map[string]bool + +func (s nodeset) sort() nodelist { + labels := make(nodelist, len(s)) + var i int + for label := range s { + labels[i] = label + i++ + } + sort.Strings(labels) + return labels +} + +func (s nodeset) addAll(x nodeset) { + for label := range x { + s[label] = true + } +} + +// A graph maps nodes to the non-nil set of their immediate successors. +type graph map[string]nodeset + +func (g graph) addNode(label string) nodeset { + edges := g[label] + if edges == nil { + edges = make(nodeset) + g[label] = edges + } + return edges +} + +func (g graph) addEdges(from string, to ...string) { + edges := g.addNode(from) + for _, to := range to { + g.addNode(to) + edges[to] = true + } +} + +func (g graph) reachableFrom(roots nodeset) nodeset { + seen := make(nodeset) + var visit func(label string) + visit = func(label string) { + if !seen[label] { + seen[label] = true + for e := range g[label] { + visit(e) + } + } + } + for root := range roots { + visit(root) + } + return seen +} + +func (g graph) transpose() graph { + rev := make(graph) + for label, edges := range g { + rev.addNode(label) + for succ := range edges { + rev.addEdges(succ, label) + } + } + return rev +} + +func (g graph) sccs() []nodeset { + // Kosaraju's algorithm---Tarjan is overkill here. + + // Forward pass. + S := make(nodelist, 0, len(g)) // postorder stack + seen := make(nodeset) + var visit func(label string) + visit = func(label string) { + if !seen[label] { + seen[label] = true + for e := range g[label] { + visit(e) + } + S = append(S, label) + } + } + for label := range g { + visit(label) + } + + // Reverse pass. + rev := g.transpose() + var scc nodeset + seen = make(nodeset) + var rvisit func(label string) + rvisit = func(label string) { + if !seen[label] { + seen[label] = true + scc[label] = true + for e := range rev[label] { + rvisit(e) + } + } + } + var sccs []nodeset + for len(S) > 0 { + top := S[len(S)-1] + S = S[:len(S)-1] // pop + if !seen[top] { + scc = make(nodeset) + rvisit(top) + sccs = append(sccs, scc) + } + } + return sccs +} + +func parse(rd io.Reader) (graph, error) { + g := make(graph) + + var linenum int + in := bufio.NewScanner(rd) + for in.Scan() { + linenum++ + // Split into words, honoring double-quotes per Go spec. + words, err := split(in.Text()) + if err != nil { + return nil, fmt.Errorf("at line %d: %v", linenum, err) + } + if len(words) > 0 { + g.addEdges(words[0], words[1:]...) + } + } + if err := in.Err(); err != nil { + return nil, err + } + return g, nil +} + +var stdin io.Reader = os.Stdin +var stdout io.Writer = os.Stdout + +func digraph(cmd string, args []string) error { + // Parse the input graph. + g, err := parse(stdin) + if err != nil { + return err + } + + // Parse the command line. + switch cmd { + case "nodes": + if len(args) != 0 { + return fmt.Errorf("usage: digraph nodes") + } + nodes := make(nodeset) + for label := range g { + nodes[label] = true + } + nodes.sort().println("\n") + + case "degree": + if len(args) != 0 { + return fmt.Errorf("usage: digraph degree") + } + nodes := make(nodeset) + for label := range g { + nodes[label] = true + } + rev := g.transpose() + for _, label := range nodes.sort() { + fmt.Fprintf(stdout, "%d\t%d\t%s\n", len(rev[label]), len(g[label]), label) + } + + case "succs", "preds": + if len(args) == 0 { + return fmt.Errorf("usage: digraph %s <label> ...", cmd) + } + g := g + if cmd == "preds" { + g = g.transpose() + } + result := make(nodeset) + for _, root := range args { + edges := g[root] + if edges == nil { + return fmt.Errorf("no such node %q", root) + } + result.addAll(edges) + } + result.sort().println("\n") + + case "forward", "reverse": + if len(args) == 0 { + return fmt.Errorf("usage: digraph %s <label> ...", cmd) + } + roots := make(nodeset) + for _, root := range args { + if g[root] == nil { + return fmt.Errorf("no such node %q", root) + } + roots[root] = true + } + g := g + if cmd == "reverse" { + g = g.transpose() + } + g.reachableFrom(roots).sort().println("\n") + + case "somepath": + if len(args) != 2 { + return fmt.Errorf("usage: digraph somepath <from> <to>") + } + from, to := args[0], args[1] + if g[from] == nil { + return fmt.Errorf("no such 'from' node %q", from) + } + if g[to] == nil { + return fmt.Errorf("no such 'to' node %q", to) + } + + seen := make(nodeset) + var visit func(path nodelist, label string) bool + visit = func(path nodelist, label string) bool { + if !seen[label] { + seen[label] = true + if label == to { + append(path, label).println("\n") + return true // unwind + } + for e := range g[label] { + if visit(append(path, label), e) { + return true + } + } + } + return false + } + if !visit(make(nodelist, 0, 100), from) { + return fmt.Errorf("no path from %q to %q", args[0], args[1]) + } + + case "allpaths": + if len(args) != 2 { + return fmt.Errorf("usage: digraph allpaths <from> <to>") + } + from, to := args[0], args[1] + if g[from] == nil { + return fmt.Errorf("no such 'from' node %q", from) + } + if g[to] == nil { + return fmt.Errorf("no such 'to' node %q", to) + } + + seen := make(nodeset) // value of seen[x] indicates whether x is on some path to 'to' + var visit func(label string) bool + visit = func(label string) bool { + reachesTo, ok := seen[label] + if !ok { + reachesTo = label == to + + seen[label] = reachesTo + for e := range g[label] { + if visit(e) { + reachesTo = true + } + } + seen[label] = reachesTo + } + return reachesTo + } + if !visit(from) { + return fmt.Errorf("no path from %q to %q", from, to) + } + for label, reachesTo := range seen { + if !reachesTo { + delete(seen, label) + } + } + seen.sort().println("\n") + + case "sccs": + if len(args) != 0 { + return fmt.Errorf("usage: digraph sccs") + } + for _, scc := range g.sccs() { + scc.sort().println(" ") + } + + case "scc": + if len(args) != 1 { + return fmt.Errorf("usage: digraph scc <label>") + } + label := args[0] + if g[label] == nil { + return fmt.Errorf("no such node %q", label) + } + for _, scc := range g.sccs() { + if scc[label] { + scc.sort().println("\n") + break + } + } + + default: + return fmt.Errorf("no such command %q", cmd) + } + + return nil +} + +// -- Utilities -------------------------------------------------------- + +// split splits a line into words, which are generally separated by +// spaces, but Go-style double-quoted string literals are also supported. +// (This approximates the behaviour of the Bourne shell.) +// +// `one "two three"` -> ["one" "two three"] +// `a"\n"b` -> ["a\nb"] +// +func split(line string) ([]string, error) { + var ( + words []string + inWord bool + current bytes.Buffer + ) + + for len(line) > 0 { + r, size := utf8.DecodeRuneInString(line) + if unicode.IsSpace(r) { + if inWord { + words = append(words, current.String()) + current.Reset() + inWord = false + } + } else if r == '"' { + var ok bool + size, ok = quotedLength(line) + if !ok { + return nil, errors.New("invalid quotation") + } + s, err := strconv.Unquote(line[:size]) + if err != nil { + return nil, err + } + current.WriteString(s) + inWord = true + } else { + current.WriteRune(r) + inWord = true + } + line = line[size:] + } + if inWord { + words = append(words, current.String()) + } + return words, nil +} + +// quotedLength returns the length in bytes of the prefix of input that +// contain a possibly-valid double-quoted Go string literal. +// +// On success, n is at least two (""); input[:n] may be passed to +// strconv.Unquote to interpret its value, and input[n:] contains the +// rest of the input. +// +// On failure, quotedLength returns false, and the entire input can be +// passed to strconv.Unquote if an informative error message is desired. +// +// quotedLength does not and need not detect all errors, such as +// invalid hex or octal escape sequences, since it assumes +// strconv.Unquote will be applied to the prefix. It guarantees only +// that if there is a prefix of input containing a valid string literal, +// its length is returned. +// +// TODO(adonovan): move this into a strconv-like utility package. +// +func quotedLength(input string) (n int, ok bool) { + var offset int + + // next returns the rune at offset, or -1 on EOF. + // offset advances to just after that rune. + next := func() rune { + if offset < len(input) { + r, size := utf8.DecodeRuneInString(input[offset:]) + offset += size + return r + } + return -1 + } + + if next() != '"' { + return // error: not a quotation + } + + for { + r := next() + if r == '\n' || r < 0 { + return // error: string literal not terminated + } + if r == '"' { + return offset, true // success + } + if r == '\\' { + var skip int + switch next() { + case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '"': + skip = 0 + case '0', '1', '2', '3', '4', '5', '6', '7': + skip = 2 + case 'x': + skip = 2 + case 'u': + skip = 4 + case 'U': + skip = 8 + default: + return // error: invalid escape + } + + for i := 0; i < skip; i++ { + next() + } + } + } +} diff --git a/vendor/golang.org/x/tools/cmd/digraph/digraph_test.go b/vendor/golang.org/x/tools/cmd/digraph/digraph_test.go new file mode 100644 index 0000000000..0c90304939 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/digraph/digraph_test.go @@ -0,0 +1,121 @@ +package main + +import ( + "bytes" + "fmt" + "reflect" + "strings" + "testing" +) + +func TestDigraph(t *testing.T) { + const g1 = ` +socks shoes +shorts pants +pants belt shoes +shirt tie sweater +sweater jacket +hat +` + + const g2 = ` +a b c +b d +c d +d c +` + + for _, test := range []struct { + input string + cmd string + args []string + want string + }{ + {g1, "nodes", nil, "belt\nhat\njacket\npants\nshirt\nshoes\nshorts\nsocks\nsweater\ntie\n"}, + {g1, "reverse", []string{"jacket"}, "jacket\nshirt\nsweater\n"}, + {g1, "forward", []string{"socks"}, "shoes\nsocks\n"}, + {g1, "forward", []string{"socks", "sweater"}, "jacket\nshoes\nsocks\nsweater\n"}, + + {g2, "allpaths", []string{"a", "d"}, "a\nb\nc\nd\n"}, + + {g2, "sccs", nil, "a\nb\nc d\n"}, + {g2, "scc", []string{"d"}, "c\nd\n"}, + {g2, "succs", []string{"a"}, "b\nc\n"}, + {g2, "preds", []string{"c"}, "a\nd\n"}, + {g2, "preds", []string{"c", "d"}, "a\nb\nc\nd\n"}, + } { + stdin = strings.NewReader(test.input) + stdout = new(bytes.Buffer) + if err := digraph(test.cmd, test.args); err != nil { + t.Error(err) + continue + } + + got := stdout.(fmt.Stringer).String() + if got != test.want { + t.Errorf("digraph(%s, %s) = %q, want %q", test.cmd, test.args, got, test.want) + } + } + + // TODO(adonovan): + // - test somepath (it's nondeterministic). + // - test errors +} + +func TestSplit(t *testing.T) { + for _, test := range []struct { + line string + want []string + }{ + {`one "2a 2b" three`, []string{"one", "2a 2b", "three"}}, + {`one tw"\n\x0a\u000a\012"o three`, []string{"one", "tw\n\n\n\no", "three"}}, + } { + got, err := split(test.line) + if err != nil { + t.Errorf("split(%s) failed: %v", test.line, err) + } + if !reflect.DeepEqual(got, test.want) { + t.Errorf("split(%s) = %v, want %v", test.line, got, test.want) + } + } +} + +func TestQuotedLength(t *testing.T) { + for _, test := range []struct { + input string + want int + }{ + {`"abc"`, 5}, + {`"abc"def`, 5}, + {`"abc\"d"ef`, 8}, // "abc\"d" is consumed, ef is residue + {`"\012\n\x0a\u000a\U0000000a"`, 28}, + {"\"\xff\"", 3}, // bad UTF-8 is ok + {`"\xff"`, 6}, // hex escape for bad UTF-8 is ok + } { + got, ok := quotedLength(test.input) + if !ok { + got = 0 + } + if got != test.want { + t.Errorf("quotedLength(%s) = %d, want %d", test.input, got, test.want) + } + } + + // errors + for _, input := range []string{ + ``, // not a quotation + `a`, // not a quotation + `'a'`, // not a quotation + `"a`, // not terminated + `"\0"`, // short octal escape + `"\x1"`, // short hex escape + `"\u000"`, // short \u escape + `"\U0000000"`, // short \U escape + `"\k"`, // invalid escape + "\"ab\nc\"", // newline + } { + if n, ok := quotedLength(input); ok { + t.Errorf("quotedLength(%s) = %d, want !ok", input, n) + } + } +} diff --git a/vendor/golang.org/x/tools/cmd/eg/eg.go b/vendor/golang.org/x/tools/cmd/eg/eg.go new file mode 100644 index 0000000000..c3cee7df31 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/eg/eg.go @@ -0,0 +1,150 @@ +// The eg command performs example-based refactoring. +// For documentation, run the command, or see Help in +// golang.org/x/tools/refactor/eg. +package main // import "golang.org/x/tools/cmd/eg" + +import ( + "flag" + "fmt" + "go/build" + "go/parser" + "go/printer" + "go/token" + "os" + "os/exec" + "strings" + + "golang.org/x/tools/go/buildutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/refactor/eg" +) + +var ( + beforeeditFlag = flag.String("beforeedit", "", "A command to exec before each file is edited (e.g. chmod, checkout). Whitespace delimits argument words. The string '{}' is replaced by the file name.") + helpFlag = flag.Bool("help", false, "show detailed help message") + templateFlag = flag.String("t", "", "template.go file specifying the refactoring") + transitiveFlag = flag.Bool("transitive", false, "apply refactoring to all dependencies too") + writeFlag = flag.Bool("w", false, "rewrite input files in place (by default, the results are printed to standard output)") + verboseFlag = flag.Bool("v", false, "show verbose matcher diagnostics") +) + +func init() { + flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc) +} + +const usage = `eg: an example-based refactoring tool. + +Usage: eg -t template.go [-w] [-transitive] <args>... + +-help show detailed help message +-t template.go specifies the template file (use -help to see explanation) +-w causes files to be re-written in place. +-transitive causes all dependencies to be refactored too. +-v show verbose matcher diagnostics +-beforeedit cmd a command to exec before each file is modified. + "{}" represents the name of the file. +` + loader.FromArgsUsage + +func main() { + if err := doMain(); err != nil { + fmt.Fprintf(os.Stderr, "eg: %s\n", err) + os.Exit(1) + } +} + +func doMain() error { + flag.Parse() + args := flag.Args() + + if *helpFlag { + fmt.Fprint(os.Stderr, eg.Help) + os.Exit(2) + } + + if len(args) == 0 { + fmt.Fprint(os.Stderr, usage) + os.Exit(1) + } + + if *templateFlag == "" { + return fmt.Errorf("no -t template.go file specified") + } + + conf := loader.Config{ + Fset: token.NewFileSet(), + ParserMode: parser.ParseComments, + } + + // The first Created package is the template. + conf.CreateFromFilenames("template", *templateFlag) + + if _, err := conf.FromArgs(args, true); err != nil { + return err + } + + // Load, parse and type-check the whole program. + iprog, err := conf.Load() + if err != nil { + return err + } + + // Analyze the template. + template := iprog.Created[0] + xform, err := eg.NewTransformer(iprog.Fset, template.Pkg, template.Files[0], &template.Info, *verboseFlag) + if err != nil { + return err + } + + // Apply it to the input packages. + var pkgs []*loader.PackageInfo + if *transitiveFlag { + for _, info := range iprog.AllPackages { + pkgs = append(pkgs, info) + } + } else { + pkgs = iprog.InitialPackages() + } + var hadErrors bool + for _, pkg := range pkgs { + if pkg == template { + continue + } + for _, file := range pkg.Files { + n := xform.Transform(&pkg.Info, pkg.Pkg, file) + if n == 0 { + continue + } + filename := iprog.Fset.File(file.Pos()).Name() + fmt.Fprintf(os.Stderr, "=== %s (%d matches)\n", filename, n) + if *writeFlag { + // Run the before-edit command (e.g. "chmod +w", "checkout") if any. + if *beforeeditFlag != "" { + args := strings.Fields(*beforeeditFlag) + // Replace "{}" with the filename, like find(1). + for i := range args { + if i > 0 { + args[i] = strings.Replace(args[i], "{}", filename, -1) + } + } + cmd := exec.Command(args[0], args[1:]...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + fmt.Fprintf(os.Stderr, "Warning: edit hook %q failed (%s)\n", + args, err) + } + } + if err := eg.WriteAST(iprog.Fset, filename, file); err != nil { + fmt.Fprintf(os.Stderr, "eg: %s\n", err) + hadErrors = true + } + } else { + printer.Fprint(os.Stdout, iprog.Fset, file) + } + } + } + if hadErrors { + os.Exit(1) + } + return nil +} diff --git a/vendor/golang.org/x/tools/cmd/fiximports/main.go b/vendor/golang.org/x/tools/cmd/fiximports/main.go new file mode 100644 index 0000000000..365a26149b --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/fiximports/main.go @@ -0,0 +1,511 @@ +// 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 fiximports command fixes import declarations to use the canonical +// import path for packages that have an "import comment" as defined by +// https://golang.org/s/go14customimport. +// +// +// Background +// +// The Go 1 custom import path mechanism lets the maintainer of a +// package give it a stable name by which clients may import and "go +// get" it, independent of the underlying version control system (such +// as Git) or server (such as github.com) that hosts it. Requests for +// the custom name are redirected to the underlying name. This allows +// packages to be migrated from one underlying server or system to +// another without breaking existing clients. +// +// Because this redirect mechanism creates aliases for existing +// packages, it's possible for a single program to import the same +// package by its canonical name and by an alias. The resulting +// executable will contain two copies of the package, which is wasteful +// at best and incorrect at worst. +// +// To avoid this, "go build" reports an error if it encounters a special +// comment like the one below, and if the import path in the comment +// does not match the path of the enclosing package relative to +// GOPATH/src: +// +// $ grep ^package $GOPATH/src/github.com/bob/vanity/foo/foo.go +// package foo // import "vanity.com/foo" +// +// The error from "go build" indicates that the package canonically +// known as "vanity.com/foo" is locally installed under the +// non-canonical name "github.com/bob/vanity/foo". +// +// +// Usage +// +// When a package that you depend on introduces a custom import comment, +// and your workspace imports it by the non-canonical name, your build +// will stop working as soon as you update your copy of that package +// using "go get -u". +// +// The purpose of the fiximports tool is to fix up all imports of the +// non-canonical path within a Go workspace, replacing them with imports +// of the canonical path. Following a run of fiximports, the workspace +// will no longer depend on the non-canonical copy of the package, so it +// should be safe to delete. It may be necessary to run "go get -u" +// again to ensure that the package is locally installed under its +// canonical path, if it was not already. +// +// The fiximports tool operates locally; it does not make HTTP requests +// and does not discover new custom import comments. It only operates +// on non-canonical packages present in your workspace. +// +// The -baddomains flag is a list of domain names that should always be +// considered non-canonical. You can use this if you wish to make sure +// that you no longer have any dependencies on packages from that +// domain, even those that do not yet provide a canical import path +// comment. For example, the default value of -baddomains includes the +// moribund code hosting site code.google.com, so fiximports will report +// an error for each import of a package from this domain remaining +// after canonicalization. +// +// To see the changes fiximports would make without applying them, use +// the -n flag. +// +package main + +import ( + "bytes" + "encoding/json" + "flag" + "fmt" + "go/ast" + "go/build" + "go/format" + "go/parser" + "go/token" + "io" + "io/ioutil" + "log" + "os" + "os/exec" + "path" + "path/filepath" + "sort" + "strconv" + "strings" +) + +// flags +var ( + dryrun = flag.Bool("n", false, "dry run: show changes, but don't apply them") + badDomains = flag.String("baddomains", "code.google.com", + "a comma-separated list of domains from which packages should not be imported") + replaceFlag = flag.String("replace", "", + "a comma-separated list of noncanonical=canonical pairs of package paths. If both items in a pair end with '...', they are treated as path prefixes.") +) + +// seams for testing +var ( + stderr io.Writer = os.Stderr + writeFile = ioutil.WriteFile +) + +const usage = `fiximports: rewrite import paths to use canonical package names. + +Usage: fiximports [-n] package... + +The package... arguments specify a list of packages +in the style of the go tool; see "go help packages". +Hint: use "all" or "..." to match the entire workspace. + +For details, see http://godoc.org/golang.org/x/tools/cmd/fiximports. + +Flags: + -n: dry run: show changes, but don't apply them + -baddomains a comma-separated list of domains from which packages + should not be imported +` + +func main() { + flag.Parse() + + if len(flag.Args()) == 0 { + fmt.Fprintf(stderr, usage) + os.Exit(1) + } + if !fiximports(flag.Args()...) { + os.Exit(1) + } +} + +type canonicalName struct{ path, name string } + +// fiximports fixes imports in the specified packages. +// Invariant: a false result implies an error was already printed. +func fiximports(packages ...string) bool { + // importedBy is the transpose of the package import graph. + importedBy := make(map[string]map[*build.Package]bool) + + // addEdge adds an edge to the import graph. + addEdge := func(from *build.Package, to string) { + if to == "C" || to == "unsafe" { + return // fake + } + pkgs := importedBy[to] + if pkgs == nil { + pkgs = make(map[*build.Package]bool) + importedBy[to] = pkgs + } + pkgs[from] = true + } + + // List metadata for all packages in the workspace. + pkgs, err := list("...") + if err != nil { + fmt.Fprintf(stderr, "importfix: %v\n", err) + return false + } + + // packageName maps each package's path to its name. + packageName := make(map[string]string) + for _, p := range pkgs { + packageName[p.ImportPath] = p.Package.Name + } + + // canonical maps each non-canonical package path to + // its canonical path and name. + // A present nil value indicates that the canonical package + // is unknown: hosted on a bad domain with no redirect. + canonical := make(map[string]canonicalName) + domains := strings.Split(*badDomains, ",") + + type replaceItem struct { + old, new string + matchPrefix bool + } + var replace []replaceItem + for _, pair := range strings.Split(*replaceFlag, ",") { + if pair == "" { + continue + } + words := strings.Split(pair, "=") + if len(words) != 2 { + fmt.Fprintf(stderr, "importfix: -replace: %q is not of the form \"canonical=noncanonical\".\n", pair) + return false + } + replace = append(replace, replaceItem{ + old: strings.TrimSuffix(words[0], "..."), + new: strings.TrimSuffix(words[1], "..."), + matchPrefix: strings.HasSuffix(words[0], "...") && + strings.HasSuffix(words[1], "..."), + }) + } + + // Find non-canonical packages and populate importedBy graph. + for _, p := range pkgs { + if p.Error != nil { + msg := p.Error.Err + if strings.Contains(msg, "code in directory") && + strings.Contains(msg, "expects import") { + // don't show the very errors we're trying to fix + } else { + fmt.Fprintln(stderr, msg) + } + } + + for _, imp := range p.Imports { + addEdge(&p.Package, imp) + } + for _, imp := range p.TestImports { + addEdge(&p.Package, imp) + } + for _, imp := range p.XTestImports { + addEdge(&p.Package, imp) + } + + // Does package have an explicit import comment? + if p.ImportComment != "" { + if p.ImportComment != p.ImportPath { + canonical[p.ImportPath] = canonicalName{ + path: p.Package.ImportComment, + name: p.Package.Name, + } + } + } else { + // Is package matched by a -replace item? + var newPath string + for _, item := range replace { + if item.matchPrefix { + if strings.HasPrefix(p.ImportPath, item.old) { + newPath = item.new + p.ImportPath[len(item.old):] + break + } + } else if p.ImportPath == item.old { + newPath = item.new + break + } + } + if newPath != "" { + newName := packageName[newPath] + if newName == "" { + newName = filepath.Base(newPath) // a guess + } + canonical[p.ImportPath] = canonicalName{ + path: newPath, + name: newName, + } + continue + } + + // Is package matched by a -baddomains item? + for _, domain := range domains { + slash := strings.Index(p.ImportPath, "/") + if slash < 0 { + continue // no slash: standard package + } + if p.ImportPath[:slash] == domain { + // Package comes from bad domain and has no import comment. + // Report an error each time this package is imported. + canonical[p.ImportPath] = canonicalName{} + + // TODO(adonovan): should we make an HTTP request to + // see if there's an HTTP redirect, a "go-import" meta tag, + // or an import comment in the the latest revision? + // It would duplicate a lot of logic from "go get". + } + break + } + } + } + + // Find all clients (direct importers) of canonical packages. + // These are the packages that need fixing up. + clients := make(map[*build.Package]bool) + for path := range canonical { + for client := range importedBy[path] { + clients[client] = true + } + } + + // Restrict rewrites to the set of packages specified by the user. + if len(packages) == 1 && (packages[0] == "all" || packages[0] == "...") { + // no restriction + } else { + pkgs, err := list(packages...) + if err != nil { + fmt.Fprintf(stderr, "importfix: %v\n", err) + return false + } + seen := make(map[string]bool) + for _, p := range pkgs { + seen[p.ImportPath] = true + } + for client := range clients { + if !seen[client.ImportPath] { + delete(clients, client) + } + } + } + + // Rewrite selected client packages. + ok := true + for client := range clients { + if !rewritePackage(client, canonical) { + ok = false + + // There were errors. + // Show direct and indirect imports of client. + seen := make(map[string]bool) + var direct, indirect []string + for p := range importedBy[client.ImportPath] { + direct = append(direct, p.ImportPath) + seen[p.ImportPath] = true + } + + var visit func(path string) + visit = func(path string) { + for q := range importedBy[path] { + qpath := q.ImportPath + if !seen[qpath] { + seen[qpath] = true + indirect = append(indirect, qpath) + visit(qpath) + } + } + } + + if direct != nil { + fmt.Fprintf(stderr, "\timported directly by:\n") + sort.Strings(direct) + for _, path := range direct { + fmt.Fprintf(stderr, "\t\t%s\n", path) + visit(path) + } + + if indirect != nil { + fmt.Fprintf(stderr, "\timported indirectly by:\n") + sort.Strings(indirect) + for _, path := range indirect { + fmt.Fprintf(stderr, "\t\t%s\n", path) + } + } + } + } + } + + return ok +} + +// Invariant: false result => error already printed. +func rewritePackage(client *build.Package, canonical map[string]canonicalName) bool { + ok := true + + used := make(map[string]bool) + var filenames []string + filenames = append(filenames, client.GoFiles...) + filenames = append(filenames, client.TestGoFiles...) + filenames = append(filenames, client.XTestGoFiles...) + var first bool + for _, filename := range filenames { + if !first { + first = true + fmt.Fprintf(stderr, "%s\n", client.ImportPath) + } + err := rewriteFile(filepath.Join(client.Dir, filename), canonical, used) + if err != nil { + fmt.Fprintf(stderr, "\tERROR: %v\n", err) + ok = false + } + } + + // Show which imports were renamed in this package. + var keys []string + for key := range used { + keys = append(keys, key) + } + sort.Strings(keys) + for _, key := range keys { + if p := canonical[key]; p.path != "" { + fmt.Fprintf(stderr, "\tfixed: %s -> %s\n", key, p.path) + } else { + fmt.Fprintf(stderr, "\tERROR: %s has no import comment\n", key) + ok = false + } + } + + return ok +} + +// rewrite reads, modifies, and writes filename, replacing all imports +// of packages P in canonical by canonical[P]. +// It records in used which canonical packages were imported. +// used[P]=="" indicates that P was imported but its canonical path is unknown. +func rewriteFile(filename string, canonical map[string]canonicalName, used map[string]bool) error { + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, filename, nil, parser.ParseComments) + if err != nil { + return err + } + var changed bool + for _, imp := range f.Imports { + impPath, err := strconv.Unquote(imp.Path.Value) + if err != nil { + log.Printf("%s: bad import spec %q: %v", + fset.Position(imp.Pos()), imp.Path.Value, err) + continue + } + canon, ok := canonical[impPath] + if !ok { + continue // import path is canonical + } + + used[impPath] = true + + if canon.path == "" { + // The canonical path is unknown (a -baddomain). + // Show the offending import. + // TODO(adonovan): should we show the actual source text? + fmt.Fprintf(stderr, "\t%s:%d: import %q\n", + shortPath(filename), + fset.Position(imp.Pos()).Line, impPath) + continue + } + + changed = true + + imp.Path.Value = strconv.Quote(canon.path) + + // Add a renaming import if necessary. + // + // This is a guess at best. We can't see whether a 'go + // get' of the canonical import path would have the same + // name or not. Assume it's the last segment. + newBase := path.Base(canon.path) + if imp.Name == nil && newBase != canon.name { + imp.Name = &ast.Ident{Name: canon.name} + } + } + + if changed && !*dryrun { + var buf bytes.Buffer + if err := format.Node(&buf, fset, f); err != nil { + return fmt.Errorf("%s: couldn't format file: %v", filename, err) + } + return writeFile(filename, buf.Bytes(), 0644) + } + + return nil +} + +// listPackage is a copy of cmd/go/list.Package. +// It has more fields than build.Package and we need some of them. +type listPackage struct { + build.Package + Error *packageError // error loading package +} + +// A packageError describes an error loading information about a package. +type packageError struct { + ImportStack []string // shortest path from package named on command line to this one + Pos string // position of error + Err string // the error itself +} + +// list runs 'go list' with the specified arguments and returns the +// metadata for matching packages. +func list(args ...string) ([]*listPackage, error) { + cmd := exec.Command("go", append([]string{"list", "-e", "-json"}, args...)...) + cmd.Stdout = new(bytes.Buffer) + cmd.Stderr = stderr + if err := cmd.Run(); err != nil { + return nil, err + } + + dec := json.NewDecoder(cmd.Stdout.(io.Reader)) + var pkgs []*listPackage + for { + var p listPackage + if err := dec.Decode(&p); err == io.EOF { + break + } else if err != nil { + return nil, err + } + pkgs = append(pkgs, &p) + } + return pkgs, nil +} + +var cwd string + +func init() { + var err error + cwd, err = os.Getwd() + if err != nil { + log.Fatalf("os.Getwd: %v", err) + } +} + +// shortPath returns an absolute or relative name for path, whatever is shorter. +// Plundered from $GOROOT/src/cmd/go/build.go. +func shortPath(path string) string { + if rel, err := filepath.Rel(cwd, path); err == nil && len(rel) < len(path) { + return rel + } + return path +} diff --git a/vendor/golang.org/x/tools/cmd/fiximports/main_test.go b/vendor/golang.org/x/tools/cmd/fiximports/main_test.go new file mode 100644 index 0000000000..e6be110447 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/fiximports/main_test.go @@ -0,0 +1,240 @@ +// 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. + +// No testdata on Android. + +// +build !android + +package main + +import ( + "bytes" + "os" + "path/filepath" + "runtime" + "strings" + "testing" +) + +// TODO(adonovan): +// - test introduction of renaming imports. +// - test induced failures of rewriteFile. + +// Guide to the test packages: +// +// new.com/one -- canonical name for old.com/one +// old.com/one -- non-canonical; has import comment "new.com/one" +// old.com/bad -- has a parse error +// fruit.io/orange \ +// fruit.io/banana } orange -> pear -> banana -> titanic.biz/bar +// fruit.io/pear / +// titanic.biz/bar -- domain is sinking; package has jumped ship to new.com/bar +// titanic.biz/foo -- domain is sinking but package has no import comment yet + +func TestFixImports(t *testing.T) { + gopath := filepath.Join(cwd, "testdata") + if err := os.Setenv("GOPATH", gopath); err != nil { + t.Fatalf("os.Setenv: %v", err) + } + defer func() { + stderr = os.Stderr + *badDomains = "code.google.com" + *replaceFlag = "" + }() + + for i, test := range []struct { + packages []string // packages to rewrite, "go list" syntax + badDomains string // -baddomains flag + replaceFlag string // -replace flag + wantOK bool + wantStderr string + wantRewrite map[string]string + }{ + // #0. No errors. + { + packages: []string{"all"}, + badDomains: "code.google.com", + wantOK: true, + wantStderr: ` +testdata/src/old.com/bad/bad.go:2:43: expected 'package', found 'EOF' +fruit.io/banana + fixed: old.com/one -> new.com/one + fixed: titanic.biz/bar -> new.com/bar +`, + wantRewrite: map[string]string{ + "$GOPATH/src/fruit.io/banana/banana.go": `package banana + +import ( + _ "new.com/bar" + _ "new.com/one" + _ "titanic.biz/foo" +)`, + }, + }, + // #1. No packages needed rewriting. + { + packages: []string{"titanic.biz/...", "old.com/...", "new.com/..."}, + badDomains: "code.google.com", + wantOK: true, + wantStderr: ` +testdata/src/old.com/bad/bad.go:2:43: expected 'package', found 'EOF' +`, + }, + // #2. Some packages without import comments matched bad domains. + { + packages: []string{"all"}, + badDomains: "titanic.biz", + wantOK: false, + wantStderr: ` +testdata/src/old.com/bad/bad.go:2:43: expected 'package', found 'EOF' +fruit.io/banana + testdata/src/fruit.io/banana/banana.go:6: import "titanic.biz/foo" + fixed: old.com/one -> new.com/one + fixed: titanic.biz/bar -> new.com/bar + ERROR: titanic.biz/foo has no import comment + imported directly by: + fruit.io/pear + imported indirectly by: + fruit.io/orange +`, + wantRewrite: map[string]string{ + "$GOPATH/src/fruit.io/banana/banana.go": `package banana + +import ( + _ "new.com/bar" + _ "new.com/one" + _ "titanic.biz/foo" +)`, + }, + }, + // #3. The -replace flag lets user supply missing import comments. + { + packages: []string{"all"}, + replaceFlag: "titanic.biz/foo=new.com/foo", + wantOK: true, + wantStderr: ` +testdata/src/old.com/bad/bad.go:2:43: expected 'package', found 'EOF' +fruit.io/banana + fixed: old.com/one -> new.com/one + fixed: titanic.biz/bar -> new.com/bar + fixed: titanic.biz/foo -> new.com/foo +`, + wantRewrite: map[string]string{ + "$GOPATH/src/fruit.io/banana/banana.go": `package banana + +import ( + _ "new.com/bar" + _ "new.com/foo" + _ "new.com/one" +)`, + }, + }, + // #4. The -replace flag supports wildcards. + // An explicit import comment takes precedence. + { + packages: []string{"all"}, + replaceFlag: "titanic.biz/...=new.com/...", + wantOK: true, + wantStderr: ` +testdata/src/old.com/bad/bad.go:2:43: expected 'package', found 'EOF' +fruit.io/banana + fixed: old.com/one -> new.com/one + fixed: titanic.biz/bar -> new.com/bar + fixed: titanic.biz/foo -> new.com/foo +`, + wantRewrite: map[string]string{ + "$GOPATH/src/fruit.io/banana/banana.go": `package banana + +import ( + _ "new.com/bar" + _ "new.com/foo" + _ "new.com/one" +)`, + }, + }, + // #5. The -replace flag trumps -baddomains. + { + packages: []string{"all"}, + badDomains: "titanic.biz", + replaceFlag: "titanic.biz/foo=new.com/foo", + wantOK: true, + wantStderr: ` +testdata/src/old.com/bad/bad.go:2:43: expected 'package', found 'EOF' +fruit.io/banana + fixed: old.com/one -> new.com/one + fixed: titanic.biz/bar -> new.com/bar + fixed: titanic.biz/foo -> new.com/foo +`, + wantRewrite: map[string]string{ + "$GOPATH/src/fruit.io/banana/banana.go": `package banana + +import ( + _ "new.com/bar" + _ "new.com/foo" + _ "new.com/one" +)`, + }, + }, + } { + *badDomains = test.badDomains + *replaceFlag = test.replaceFlag + + stderr = new(bytes.Buffer) + gotRewrite := make(map[string]string) + writeFile = func(filename string, content []byte, mode os.FileMode) error { + filename = strings.Replace(filename, gopath, "$GOPATH", 1) + filename = filepath.ToSlash(filename) + gotRewrite[filename] = string(bytes.TrimSpace(content)) + return nil + } + + if runtime.GOOS == "windows" { + test.wantStderr = strings.Replace(test.wantStderr, `testdata/src/old.com/bad/bad.go`, `testdata\src\old.com\bad\bad.go`, -1) + test.wantStderr = strings.Replace(test.wantStderr, `testdata/src/fruit.io/banana/banana.go`, `testdata\src\fruit.io\banana\banana.go`, -1) + } + + // Check status code. + if fiximports(test.packages...) != test.wantOK { + t.Errorf("#%d. fiximports() = %t", i, !test.wantOK) + } + + // Compare stderr output. + if stderr.(*bytes.Buffer).String() != test.wantStderr { + t.Errorf("#%d. stderr: got <<%s>>, want <<%s>>", + i, stderr, test.wantStderr) + } + + // Compare rewrites. + for k, v := range gotRewrite { + if test.wantRewrite[k] != v { + t.Errorf("#%d. rewrite[%s] = <<%s>>, want <<%s>>", + i, k, v, test.wantRewrite[k]) + } + delete(test.wantRewrite, k) + } + for k, v := range test.wantRewrite { + t.Errorf("#%d. rewrite[%s] missing, want <<%s>>", i, k, v) + } + } +} + +// TestDryRun tests that the -n flag suppresses calls to writeFile. +func TestDryRun(t *testing.T) { + gopath := filepath.Join(cwd, "testdata") + if err := os.Setenv("GOPATH", gopath); err != nil { + t.Fatalf("os.Setenv: %v", err) + } + + *dryrun = true + defer func() { *dryrun = false }() // restore + stderr = new(bytes.Buffer) + writeFile = func(filename string, content []byte, mode os.FileMode) error { + t.Fatalf("writeFile(%s) called in dryrun mode", filename) + return nil + } + + if !fiximports("all") { + t.Fatalf("fiximports failed: %s", stderr) + } +} diff --git a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/fruit.io/banana/banana.go b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/fruit.io/banana/banana.go new file mode 100644 index 0000000000..04e0242eda --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/fruit.io/banana/banana.go @@ -0,0 +1,7 @@ +package banana + +import ( + _ "old.com/one" + _ "titanic.biz/bar" + _ "titanic.biz/foo" +) diff --git a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/fruit.io/orange/orange.go b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/fruit.io/orange/orange.go new file mode 100644 index 0000000000..ae65daa6b3 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/fruit.io/orange/orange.go @@ -0,0 +1,3 @@ +package orange + +import _ "fruit.io/pear" diff --git a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/fruit.io/pear/pear.go b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/fruit.io/pear/pear.go new file mode 100644 index 0000000000..de92df05d4 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/fruit.io/pear/pear.go @@ -0,0 +1,3 @@ +package pear + +import _ "fruit.io/banana" diff --git a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/new.com/one/one.go b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/new.com/one/one.go new file mode 100644 index 0000000000..a8c5e83e93 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/new.com/one/one.go @@ -0,0 +1 @@ +package one // import "new.com/one" diff --git a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/old.com/bad/bad.go b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/old.com/bad/bad.go new file mode 100644 index 0000000000..a1a3d1ad5f --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/old.com/bad/bad.go @@ -0,0 +1,2 @@ +// This ill-formed Go source file is here to ensure the tool is robust +// against bad packages in the workspace. diff --git a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/old.com/one/one.go b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/old.com/one/one.go new file mode 100644 index 0000000000..a8c5e83e93 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/old.com/one/one.go @@ -0,0 +1 @@ +package one // import "new.com/one" diff --git a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/titanic.biz/bar/bar.go b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/titanic.biz/bar/bar.go new file mode 100644 index 0000000000..cc720bc76a --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/titanic.biz/bar/bar.go @@ -0,0 +1,2 @@ +// This package is moving to new.com too. +package bar // import "new.com/bar" diff --git a/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/titanic.biz/foo/foo.go b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/titanic.biz/foo/foo.go new file mode 100644 index 0000000000..145c31b8d2 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/fiximports/testdata/src/titanic.biz/foo/foo.go @@ -0,0 +1,2 @@ +// This package hasn't jumped ship yet. +package foo diff --git a/vendor/golang.org/x/tools/cmd/godex/doc.go b/vendor/golang.org/x/tools/cmd/godex/doc.go new file mode 100644 index 0000000000..ceb7c2fe14 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godex/doc.go @@ -0,0 +1,69 @@ +// 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. + +// The godex command prints (dumps) exported information of packages +// or selected package objects. +// +// In contrast to godoc, godex extracts this information from compiled +// object files. Hence the exported data is truly what a compiler will +// see, at the cost of missing commentary. +// +// Usage: godex [flags] {path[.name]} +// +// Each argument must be a (possibly partial) package path, optionally +// followed by a dot and the name of a package object: +// +// godex math +// godex math.Sin +// godex math.Sin fmt.Printf +// godex go/types +// +// godex automatically tries all possible package path prefixes if only a +// partial package path is given. For instance, for the path "go/types", +// godex prepends "golang.org/x/tools". +// +// The prefixes are computed by searching the directories specified by +// the GOROOT and GOPATH environment variables (and by excluding the +// build OS- and architecture-specific directory names from the path). +// The search order is depth-first and alphabetic; for a partial path +// "foo", a package "a/foo" is found before "b/foo". +// +// Absolute and relative paths may be provided, which disable automatic +// prefix generation: +// +// godex $GOROOT/pkg/darwin_amd64/sort +// godex ./sort +// +// All but the last path element may contain dots; a dot in the last path +// element separates the package path from the package object name. If the +// last path element contains a dot, terminate the argument with another +// dot (indicating an empty object name). For instance, the path for a +// package foo.bar would be specified as in: +// +// godex foo.bar. +// +// The flags are: +// +// -s="" +// only consider packages from src, where src is one of the supported compilers +// -v=false +// verbose mode +// +// The following sources (-s arguments) are supported: +// +// gc +// gc-generated object files +// gccgo +// gccgo-generated object files +// gccgo-new +// gccgo-generated object files using a condensed format (experimental) +// source +// (uncompiled) source code (not yet implemented) +// +// If no -s argument is provided, godex will try to find a matching source. +// +package main // import "golang.org/x/tools/cmd/godex" + +// BUG(gri): support for -s=source is not yet implemented +// BUG(gri): gccgo-importing appears to have occasional problems stalling godex; try -s=gc as work-around diff --git a/vendor/golang.org/x/tools/cmd/godex/gc.go b/vendor/golang.org/x/tools/cmd/godex/gc.go new file mode 100644 index 0000000000..e252900985 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godex/gc.go @@ -0,0 +1,17 @@ +// 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 go1.5 + +// This file implements access to gc-generated export data. + +package main + +import ( + "golang.org/x/tools/go/gcimporter" +) + +func init() { + register("gc", gcimporter.Import) +} diff --git a/vendor/golang.org/x/tools/cmd/godex/gc14.go b/vendor/golang.org/x/tools/cmd/godex/gc14.go new file mode 100644 index 0000000000..40c433d2ff --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godex/gc14.go @@ -0,0 +1,17 @@ +// 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 !go1.5 + +// This file implements access to gc-generated export data. + +package main + +import ( + "golang.org/x/tools/go/gcimporter" +) + +func init() { + register("gc", gcimporter.Import) +} diff --git a/vendor/golang.org/x/tools/cmd/godex/gccgo.go b/vendor/golang.org/x/tools/cmd/godex/gccgo.go new file mode 100644 index 0000000000..2f2168dab9 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godex/gccgo.go @@ -0,0 +1,42 @@ +// 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 go1.5 + +// This file implements access to gccgo-generated export data. + +package main + +import ( + "golang.org/x/tools/go/gccgoimporter" + "golang.org/x/tools/go/types" +) + +var ( + initmap = make(map[*types.Package]gccgoimporter.InitData) +) + +func init() { + incpaths := []string{"/"} + + // importer for default gccgo + var inst gccgoimporter.GccgoInstallation + inst.InitFromDriver("gccgo") + register("gccgo", inst.GetImporter(incpaths, initmap)) +} + +// Print the extra gccgo compiler data for this package, if it exists. +func (p *printer) printGccgoExtra(pkg *types.Package) { + if initdata, ok := initmap[pkg]; ok { + p.printf("/*\npriority %d\n", initdata.Priority) + + p.printDecl("init", len(initdata.Inits), func() { + for _, init := range initdata.Inits { + p.printf("%s %s %d\n", init.Name, init.InitFunc, init.Priority) + } + }) + + p.print("*/\n") + } +} diff --git a/vendor/golang.org/x/tools/cmd/godex/gccgo14.go b/vendor/golang.org/x/tools/cmd/godex/gccgo14.go new file mode 100644 index 0000000000..131752783f --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godex/gccgo14.go @@ -0,0 +1,42 @@ +// 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 !go1.5 + +// This file implements access to gccgo-generated export data. + +package main + +import ( + "golang.org/x/tools/go/gccgoimporter" + "golang.org/x/tools/go/types" +) + +var ( + initmap = make(map[*types.Package]gccgoimporter.InitData) +) + +func init() { + incpaths := []string{"/"} + + // importer for default gccgo + var inst gccgoimporter.GccgoInstallation + inst.InitFromDriver("gccgo") + register("gccgo", inst.GetImporter(incpaths, initmap)) +} + +// Print the extra gccgo compiler data for this package, if it exists. +func (p *printer) printGccgoExtra(pkg *types.Package) { + if initdata, ok := initmap[pkg]; ok { + p.printf("/*\npriority %d\n", initdata.Priority) + + p.printDecl("init", len(initdata.Inits), func() { + for _, init := range initdata.Inits { + p.printf("%s %s %d\n", init.Name, init.InitFunc, init.Priority) + } + }) + + p.print("*/\n") + } +} diff --git a/vendor/golang.org/x/tools/cmd/godex/godex.go b/vendor/golang.org/x/tools/cmd/godex/godex.go new file mode 100644 index 0000000000..3cdca2ec49 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godex/godex.go @@ -0,0 +1,209 @@ +// 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 go1.5 + +package main + +import ( + "errors" + "flag" + "fmt" + "go/build" + "io/ioutil" + "os" + "path/filepath" + "strings" + + "golang.org/x/tools/go/types" +) + +var ( + source = flag.String("s", "", "only consider packages from src, where src is one of the supported compilers") + verbose = flag.Bool("v", false, "verbose mode") +) + +// lists of registered sources and corresponding importers +var ( + sources []string + importers []types.Importer + importFailed = errors.New("import failed") +) + +// map of imported packages +var packages = make(map[string]*types.Package) + +func usage() { + fmt.Fprintln(os.Stderr, "usage: godex [flags] {path|qualifiedIdent}") + flag.PrintDefaults() + os.Exit(2) +} + +func report(msg string) { + fmt.Fprintln(os.Stderr, "error: "+msg) + os.Exit(2) +} + +func main() { + flag.Usage = usage + flag.Parse() + + if flag.NArg() == 0 { + report("no package name, path, or file provided") + } + + imp := tryImports + if *source != "" { + imp = lookup(*source) + if imp == nil { + report("source (-s argument) must be one of: " + strings.Join(sources, ", ")) + } + } + + for _, arg := range flag.Args() { + path, name := splitPathIdent(arg) + logf("\tprocessing %q: path = %q, name = %s\n", arg, path, name) + + // generate possible package path prefixes + // (at the moment we do this for each argument - should probably cache the generated prefixes) + prefixes := make(chan string) + go genPrefixes(prefixes, !filepath.IsAbs(path) && !build.IsLocalImport(path)) + + // import package + pkg, err := tryPrefixes(packages, prefixes, path, imp) + if err != nil { + logf("\t=> ignoring %q: %s\n", path, err) + continue + } + + // filter objects if needed + var filter func(types.Object) bool + if name != "" { + filter = func(obj types.Object) bool { + // TODO(gri) perhaps use regular expression matching here? + return obj.Name() == name + } + } + + // print contents + print(os.Stdout, pkg, filter) + } +} + +func logf(format string, args ...interface{}) { + if *verbose { + fmt.Fprintf(os.Stderr, format, args...) + } +} + +// splitPathIdent splits a path.name argument into its components. +// All but the last path element may contain dots. +func splitPathIdent(arg string) (path, name string) { + if i := strings.LastIndex(arg, "."); i >= 0 { + if j := strings.LastIndex(arg, "/"); j < i { + // '.' is not part of path + path = arg[:i] + name = arg[i+1:] + return + } + } + path = arg + return +} + +// tryPrefixes tries to import the package given by (the possibly partial) path using the given importer imp +// by prepending all possible prefixes to path. It returns with the first package that it could import, or +// with an error. +func tryPrefixes(packages map[string]*types.Package, prefixes chan string, path string, imp types.Importer) (pkg *types.Package, err error) { + for prefix := range prefixes { + actual := path + if prefix == "" { + // don't use filepath.Join as it will sanitize the path and remove + // a leading dot and then the path is not recognized as a relative + // package path by the importers anymore + logf("\ttrying no prefix\n") + } else { + actual = filepath.Join(prefix, path) + logf("\ttrying prefix %q\n", prefix) + } + pkg, err = imp(packages, actual) + if err == nil { + break + } + logf("\t=> importing %q failed: %s\n", actual, err) + } + return +} + +// tryImports is an importer that tries all registered importers +// successively until one of them succeeds or all of them failed. +func tryImports(packages map[string]*types.Package, path string) (pkg *types.Package, err error) { + for i, imp := range importers { + logf("\t\ttrying %s import\n", sources[i]) + pkg, err = imp(packages, path) + if err == nil { + break + } + logf("\t\t=> %s import failed: %s\n", sources[i], err) + } + return +} + +// protect protects an importer imp from panics and returns the protected importer. +func protect(imp types.Importer) types.Importer { + return func(packages map[string]*types.Package, path string) (pkg *types.Package, err error) { + defer func() { + if recover() != nil { + pkg = nil + err = importFailed + } + }() + return imp(packages, path) + } +} + +// register registers an importer imp for a given source src. +func register(src string, imp types.Importer) { + if lookup(src) != nil { + panic(src + " importer already registered") + } + sources = append(sources, src) + importers = append(importers, protect(imp)) +} + +// lookup returns the importer imp for a given source src. +func lookup(src string) types.Importer { + for i, s := range sources { + if s == src { + return importers[i] + } + } + return nil +} + +func genPrefixes(out chan string, all bool) { + out <- "" + if all { + platform := build.Default.GOOS + "_" + build.Default.GOARCH + dirnames := append([]string{build.Default.GOROOT}, filepath.SplitList(build.Default.GOPATH)...) + for _, dirname := range dirnames { + walkDir(filepath.Join(dirname, "pkg", platform), "", out) + } + } + close(out) +} + +func walkDir(dirname, prefix string, out chan string) { + fiList, err := ioutil.ReadDir(dirname) + if err != nil { + return + } + for _, fi := range fiList { + if fi.IsDir() && !strings.HasPrefix(fi.Name(), ".") { + prefix := filepath.Join(prefix, fi.Name()) + out <- prefix + walkDir(filepath.Join(dirname, fi.Name()), prefix, out) + } + } +} diff --git a/vendor/golang.org/x/tools/cmd/godex/godex14.go b/vendor/golang.org/x/tools/cmd/godex/godex14.go new file mode 100644 index 0000000000..c193bad3bd --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godex/godex14.go @@ -0,0 +1,209 @@ +// 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 !go1.5 + +package main + +import ( + "errors" + "flag" + "fmt" + "go/build" + "io/ioutil" + "os" + "path/filepath" + "strings" + + "golang.org/x/tools/go/types" +) + +var ( + source = flag.String("s", "", "only consider packages from src, where src is one of the supported compilers") + verbose = flag.Bool("v", false, "verbose mode") +) + +// lists of registered sources and corresponding importers +var ( + sources []string + importers []types.Importer + importFailed = errors.New("import failed") +) + +// map of imported packages +var packages = make(map[string]*types.Package) + +func usage() { + fmt.Fprintln(os.Stderr, "usage: godex [flags] {path|qualifiedIdent}") + flag.PrintDefaults() + os.Exit(2) +} + +func report(msg string) { + fmt.Fprintln(os.Stderr, "error: "+msg) + os.Exit(2) +} + +func main() { + flag.Usage = usage + flag.Parse() + + if flag.NArg() == 0 { + report("no package name, path, or file provided") + } + + imp := tryImports + if *source != "" { + imp = lookup(*source) + if imp == nil { + report("source (-s argument) must be one of: " + strings.Join(sources, ", ")) + } + } + + for _, arg := range flag.Args() { + path, name := splitPathIdent(arg) + logf("\tprocessing %q: path = %q, name = %s\n", arg, path, name) + + // generate possible package path prefixes + // (at the moment we do this for each argument - should probably cache the generated prefixes) + prefixes := make(chan string) + go genPrefixes(prefixes, !filepath.IsAbs(path) && !build.IsLocalImport(path)) + + // import package + pkg, err := tryPrefixes(packages, prefixes, path, imp) + if err != nil { + logf("\t=> ignoring %q: %s\n", path, err) + continue + } + + // filter objects if needed + var filter func(types.Object) bool + if name != "" { + filter = func(obj types.Object) bool { + // TODO(gri) perhaps use regular expression matching here? + return obj.Name() == name + } + } + + // print contents + print(os.Stdout, pkg, filter) + } +} + +func logf(format string, args ...interface{}) { + if *verbose { + fmt.Fprintf(os.Stderr, format, args...) + } +} + +// splitPathIdent splits a path.name argument into its components. +// All but the last path element may contain dots. +func splitPathIdent(arg string) (path, name string) { + if i := strings.LastIndex(arg, "."); i >= 0 { + if j := strings.LastIndex(arg, "/"); j < i { + // '.' is not part of path + path = arg[:i] + name = arg[i+1:] + return + } + } + path = arg + return +} + +// tryPrefixes tries to import the package given by (the possibly partial) path using the given importer imp +// by prepending all possible prefixes to path. It returns with the first package that it could import, or +// with an error. +func tryPrefixes(packages map[string]*types.Package, prefixes chan string, path string, imp types.Importer) (pkg *types.Package, err error) { + for prefix := range prefixes { + actual := path + if prefix == "" { + // don't use filepath.Join as it will sanitize the path and remove + // a leading dot and then the path is not recognized as a relative + // package path by the importers anymore + logf("\ttrying no prefix\n") + } else { + actual = filepath.Join(prefix, path) + logf("\ttrying prefix %q\n", prefix) + } + pkg, err = imp(packages, actual) + if err == nil { + break + } + logf("\t=> importing %q failed: %s\n", actual, err) + } + return +} + +// tryImports is an importer that tries all registered importers +// successively until one of them succeeds or all of them failed. +func tryImports(packages map[string]*types.Package, path string) (pkg *types.Package, err error) { + for i, imp := range importers { + logf("\t\ttrying %s import\n", sources[i]) + pkg, err = imp(packages, path) + if err == nil { + break + } + logf("\t\t=> %s import failed: %s\n", sources[i], err) + } + return +} + +// protect protects an importer imp from panics and returns the protected importer. +func protect(imp types.Importer) types.Importer { + return func(packages map[string]*types.Package, path string) (pkg *types.Package, err error) { + defer func() { + if recover() != nil { + pkg = nil + err = importFailed + } + }() + return imp(packages, path) + } +} + +// register registers an importer imp for a given source src. +func register(src string, imp types.Importer) { + if lookup(src) != nil { + panic(src + " importer already registered") + } + sources = append(sources, src) + importers = append(importers, protect(imp)) +} + +// lookup returns the importer imp for a given source src. +func lookup(src string) types.Importer { + for i, s := range sources { + if s == src { + return importers[i] + } + } + return nil +} + +func genPrefixes(out chan string, all bool) { + out <- "" + if all { + platform := build.Default.GOOS + "_" + build.Default.GOARCH + dirnames := append([]string{build.Default.GOROOT}, filepath.SplitList(build.Default.GOPATH)...) + for _, dirname := range dirnames { + walkDir(filepath.Join(dirname, "pkg", platform), "", out) + } + } + close(out) +} + +func walkDir(dirname, prefix string, out chan string) { + fiList, err := ioutil.ReadDir(dirname) + if err != nil { + return + } + for _, fi := range fiList { + if fi.IsDir() && !strings.HasPrefix(fi.Name(), ".") { + prefix := filepath.Join(prefix, fi.Name()) + out <- prefix + walkDir(filepath.Join(dirname, fi.Name()), prefix, out) + } + } +} diff --git a/vendor/golang.org/x/tools/cmd/godex/print.go b/vendor/golang.org/x/tools/cmd/godex/print.go new file mode 100644 index 0000000000..d411afdd50 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godex/print.go @@ -0,0 +1,370 @@ +// 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 go1.5 + +package main + +import ( + "bytes" + "fmt" + "go/token" + "io" + "math/big" + + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/types" +) + +// TODO(gri) use tabwriter for alignment? + +func print(w io.Writer, pkg *types.Package, filter func(types.Object) bool) { + var p printer + p.pkg = pkg + p.printPackage(pkg, filter) + p.printGccgoExtra(pkg) + io.Copy(w, &p.buf) +} + +type printer struct { + pkg *types.Package + buf bytes.Buffer + indent int // current indentation level + last byte // last byte written +} + +func (p *printer) print(s string) { + // Write the string one byte at a time. We care about the presence of + // newlines for indentation which we will see even in the presence of + // (non-corrupted) Unicode; no need to read one rune at a time. + for i := 0; i < len(s); i++ { + ch := s[i] + if ch != '\n' && p.last == '\n' { + // Note: This could lead to a range overflow for very large + // indentations, but it's extremely unlikely to happen for + // non-pathological code. + p.buf.WriteString("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"[:p.indent]) + } + p.buf.WriteByte(ch) + p.last = ch + } +} + +func (p *printer) printf(format string, args ...interface{}) { + p.print(fmt.Sprintf(format, args...)) +} + +// methodsFor returns the named type and corresponding methods if the type +// denoted by obj is not an interface and has methods. Otherwise it returns +// the zero value. +func methodsFor(obj *types.TypeName) (*types.Named, []*types.Selection) { + named, _ := obj.Type().(*types.Named) + if named == nil { + // A type name's type can also be the + // exported basic type unsafe.Pointer. + return nil, nil + } + if _, ok := named.Underlying().(*types.Interface); ok { + // ignore interfaces + return nil, nil + } + methods := combinedMethodSet(named) + if len(methods) == 0 { + return nil, nil + } + return named, methods +} + +func (p *printer) printPackage(pkg *types.Package, filter func(types.Object) bool) { + // collect objects by kind + var ( + consts []*types.Const + typem []*types.Named // non-interface types with methods + typez []*types.TypeName // interfaces or types without methods + vars []*types.Var + funcs []*types.Func + builtins []*types.Builtin + methods = make(map[*types.Named][]*types.Selection) // method sets for named types + ) + scope := pkg.Scope() + for _, name := range scope.Names() { + obj := scope.Lookup(name) + if obj.Exported() { + // collect top-level exported and possibly filtered objects + if filter == nil || filter(obj) { + switch obj := obj.(type) { + case *types.Const: + consts = append(consts, obj) + case *types.TypeName: + // group into types with methods and types without + if named, m := methodsFor(obj); named != nil { + typem = append(typem, named) + methods[named] = m + } else { + typez = append(typez, obj) + } + case *types.Var: + vars = append(vars, obj) + case *types.Func: + funcs = append(funcs, obj) + case *types.Builtin: + // for unsafe.Sizeof, etc. + builtins = append(builtins, obj) + } + } + } else if filter == nil { + // no filtering: collect top-level unexported types with methods + if obj, _ := obj.(*types.TypeName); obj != nil { + // see case *types.TypeName above + if named, m := methodsFor(obj); named != nil { + typem = append(typem, named) + methods[named] = m + } + } + } + } + + p.printf("package %s // %q\n", pkg.Name(), pkg.Path()) + + p.printDecl("const", len(consts), func() { + for _, obj := range consts { + p.printObj(obj) + p.print("\n") + } + }) + + p.printDecl("var", len(vars), func() { + for _, obj := range vars { + p.printObj(obj) + p.print("\n") + } + }) + + p.printDecl("type", len(typez), func() { + for _, obj := range typez { + p.printf("%s ", obj.Name()) + p.writeType(p.pkg, obj.Type().Underlying()) + p.print("\n") + } + }) + + // non-interface types with methods + for _, named := range typem { + first := true + if obj := named.Obj(); obj.Exported() { + if first { + p.print("\n") + first = false + } + p.printf("type %s ", obj.Name()) + p.writeType(p.pkg, named.Underlying()) + p.print("\n") + } + for _, m := range methods[named] { + if obj := m.Obj(); obj.Exported() { + if first { + p.print("\n") + first = false + } + p.printFunc(m.Recv(), obj.(*types.Func)) + p.print("\n") + } + } + } + + if len(funcs) > 0 { + p.print("\n") + for _, obj := range funcs { + p.printFunc(nil, obj) + p.print("\n") + } + } + + // TODO(gri) better handling of builtins (package unsafe only) + if len(builtins) > 0 { + p.print("\n") + for _, obj := range builtins { + p.printf("func %s() // builtin\n", obj.Name()) + } + } + + p.print("\n") +} + +func (p *printer) printDecl(keyword string, n int, printGroup func()) { + switch n { + case 0: + // nothing to do + case 1: + p.printf("\n%s ", keyword) + printGroup() + default: + p.printf("\n%s (\n", keyword) + p.indent++ + printGroup() + p.indent-- + p.print(")\n") + } +} + +// absInt returns the absolute value of v as a *big.Int. +// v must be a numeric value. +func absInt(v exact.Value) *big.Int { + // compute big-endian representation of v + b := exact.Bytes(v) // little-endian + for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 { + b[i], b[j] = b[j], b[i] + } + return new(big.Int).SetBytes(b) +} + +var ( + one = big.NewRat(1, 1) + ten = big.NewRat(10, 1) +) + +// floatString returns the string representation for a +// numeric value v in normalized floating-point format. +func floatString(v exact.Value) string { + if exact.Sign(v) == 0 { + return "0.0" + } + // x != 0 + + // convert |v| into a big.Rat x + x := new(big.Rat).SetFrac(absInt(exact.Num(v)), absInt(exact.Denom(v))) + + // normalize x and determine exponent e + // (This is not very efficient, but also not speed-critical.) + var e int + for x.Cmp(ten) >= 0 { + x.Quo(x, ten) + e++ + } + for x.Cmp(one) < 0 { + x.Mul(x, ten) + e-- + } + + // TODO(gri) Values such as 1/2 are easier to read in form 0.5 + // rather than 5.0e-1. Similarly, 1.0e1 is easier to read as + // 10.0. Fine-tune best exponent range for readability. + + s := x.FloatString(100) // good-enough precision + + // trim trailing 0's + i := len(s) + for i > 0 && s[i-1] == '0' { + i-- + } + s = s[:i] + + // add a 0 if the number ends in decimal point + if len(s) > 0 && s[len(s)-1] == '.' { + s += "0" + } + + // add exponent and sign + if e != 0 { + s += fmt.Sprintf("e%+d", e) + } + if exact.Sign(v) < 0 { + s = "-" + s + } + + // TODO(gri) If v is a "small" fraction (i.e., numerator and denominator + // are just a small number of decimal digits), add the exact fraction as + // a comment. For instance: 3.3333...e-1 /* = 1/3 */ + + return s +} + +// valString returns the string representation for the value v. +// Setting floatFmt forces an integer value to be formatted in +// normalized floating-point format. +// TODO(gri) Move this code into package exact. +func valString(v exact.Value, floatFmt bool) string { + switch v.Kind() { + case exact.Int: + if floatFmt { + return floatString(v) + } + case exact.Float: + return floatString(v) + case exact.Complex: + re := exact.Real(v) + im := exact.Imag(v) + var s string + if exact.Sign(re) != 0 { + s = floatString(re) + if exact.Sign(im) >= 0 { + s += " + " + } else { + s += " - " + im = exact.UnaryOp(token.SUB, im, 0) // negate im + } + } + // im != 0, otherwise v would be exact.Int or exact.Float + return s + floatString(im) + "i" + } + return v.String() +} + +func (p *printer) printObj(obj types.Object) { + p.print(obj.Name()) + + typ, basic := obj.Type().Underlying().(*types.Basic) + if basic && typ.Info()&types.IsUntyped != 0 { + // don't write untyped types + } else { + p.print(" ") + p.writeType(p.pkg, obj.Type()) + } + + if obj, ok := obj.(*types.Const); ok { + floatFmt := basic && typ.Info()&(types.IsFloat|types.IsComplex) != 0 + p.print(" = ") + p.print(valString(obj.Val(), floatFmt)) + } +} + +func (p *printer) printFunc(recvType types.Type, obj *types.Func) { + p.print("func ") + sig := obj.Type().(*types.Signature) + if recvType != nil { + p.print("(") + p.writeType(p.pkg, recvType) + p.print(") ") + } + p.print(obj.Name()) + p.writeSignature(p.pkg, sig) +} + +// combinedMethodSet returns the method set for a named type T +// merged with all the methods of *T that have different names than +// the methods of T. +// +// combinedMethodSet is analogous to types/typeutil.IntuitiveMethodSet +// but doesn't require a MethodSetCache. +// TODO(gri) If this functionality doesn't change over time, consider +// just calling IntuitiveMethodSet eventually. +func combinedMethodSet(T *types.Named) []*types.Selection { + // method set for T + mset := types.NewMethodSet(T) + var res []*types.Selection + for i, n := 0, mset.Len(); i < n; i++ { + res = append(res, mset.At(i)) + } + + // add all *T methods with names different from T methods + pmset := types.NewMethodSet(types.NewPointer(T)) + for i, n := 0, pmset.Len(); i < n; i++ { + pm := pmset.At(i) + if obj := pm.Obj(); mset.Lookup(obj.Pkg(), obj.Name()) == nil { + res = append(res, pm) + } + } + + return res +} diff --git a/vendor/golang.org/x/tools/cmd/godex/print14.go b/vendor/golang.org/x/tools/cmd/godex/print14.go new file mode 100644 index 0000000000..55d7c5b631 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godex/print14.go @@ -0,0 +1,370 @@ +// 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 !go1.5 + +package main + +import ( + "bytes" + "fmt" + "go/token" + "io" + "math/big" + + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/types" +) + +// TODO(gri) use tabwriter for alignment? + +func print(w io.Writer, pkg *types.Package, filter func(types.Object) bool) { + var p printer + p.pkg = pkg + p.printPackage(pkg, filter) + p.printGccgoExtra(pkg) + io.Copy(w, &p.buf) +} + +type printer struct { + pkg *types.Package + buf bytes.Buffer + indent int // current indentation level + last byte // last byte written +} + +func (p *printer) print(s string) { + // Write the string one byte at a time. We care about the presence of + // newlines for indentation which we will see even in the presence of + // (non-corrupted) Unicode; no need to read one rune at a time. + for i := 0; i < len(s); i++ { + ch := s[i] + if ch != '\n' && p.last == '\n' { + // Note: This could lead to a range overflow for very large + // indentations, but it's extremely unlikely to happen for + // non-pathological code. + p.buf.WriteString("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"[:p.indent]) + } + p.buf.WriteByte(ch) + p.last = ch + } +} + +func (p *printer) printf(format string, args ...interface{}) { + p.print(fmt.Sprintf(format, args...)) +} + +// methodsFor returns the named type and corresponding methods if the type +// denoted by obj is not an interface and has methods. Otherwise it returns +// the zero value. +func methodsFor(obj *types.TypeName) (*types.Named, []*types.Selection) { + named, _ := obj.Type().(*types.Named) + if named == nil { + // A type name's type can also be the + // exported basic type unsafe.Pointer. + return nil, nil + } + if _, ok := named.Underlying().(*types.Interface); ok { + // ignore interfaces + return nil, nil + } + methods := combinedMethodSet(named) + if len(methods) == 0 { + return nil, nil + } + return named, methods +} + +func (p *printer) printPackage(pkg *types.Package, filter func(types.Object) bool) { + // collect objects by kind + var ( + consts []*types.Const + typem []*types.Named // non-interface types with methods + typez []*types.TypeName // interfaces or types without methods + vars []*types.Var + funcs []*types.Func + builtins []*types.Builtin + methods = make(map[*types.Named][]*types.Selection) // method sets for named types + ) + scope := pkg.Scope() + for _, name := range scope.Names() { + obj := scope.Lookup(name) + if obj.Exported() { + // collect top-level exported and possibly filtered objects + if filter == nil || filter(obj) { + switch obj := obj.(type) { + case *types.Const: + consts = append(consts, obj) + case *types.TypeName: + // group into types with methods and types without + if named, m := methodsFor(obj); named != nil { + typem = append(typem, named) + methods[named] = m + } else { + typez = append(typez, obj) + } + case *types.Var: + vars = append(vars, obj) + case *types.Func: + funcs = append(funcs, obj) + case *types.Builtin: + // for unsafe.Sizeof, etc. + builtins = append(builtins, obj) + } + } + } else if filter == nil { + // no filtering: collect top-level unexported types with methods + if obj, _ := obj.(*types.TypeName); obj != nil { + // see case *types.TypeName above + if named, m := methodsFor(obj); named != nil { + typem = append(typem, named) + methods[named] = m + } + } + } + } + + p.printf("package %s // %q\n", pkg.Name(), pkg.Path()) + + p.printDecl("const", len(consts), func() { + for _, obj := range consts { + p.printObj(obj) + p.print("\n") + } + }) + + p.printDecl("var", len(vars), func() { + for _, obj := range vars { + p.printObj(obj) + p.print("\n") + } + }) + + p.printDecl("type", len(typez), func() { + for _, obj := range typez { + p.printf("%s ", obj.Name()) + p.writeType(p.pkg, obj.Type().Underlying()) + p.print("\n") + } + }) + + // non-interface types with methods + for _, named := range typem { + first := true + if obj := named.Obj(); obj.Exported() { + if first { + p.print("\n") + first = false + } + p.printf("type %s ", obj.Name()) + p.writeType(p.pkg, named.Underlying()) + p.print("\n") + } + for _, m := range methods[named] { + if obj := m.Obj(); obj.Exported() { + if first { + p.print("\n") + first = false + } + p.printFunc(m.Recv(), obj.(*types.Func)) + p.print("\n") + } + } + } + + if len(funcs) > 0 { + p.print("\n") + for _, obj := range funcs { + p.printFunc(nil, obj) + p.print("\n") + } + } + + // TODO(gri) better handling of builtins (package unsafe only) + if len(builtins) > 0 { + p.print("\n") + for _, obj := range builtins { + p.printf("func %s() // builtin\n", obj.Name()) + } + } + + p.print("\n") +} + +func (p *printer) printDecl(keyword string, n int, printGroup func()) { + switch n { + case 0: + // nothing to do + case 1: + p.printf("\n%s ", keyword) + printGroup() + default: + p.printf("\n%s (\n", keyword) + p.indent++ + printGroup() + p.indent-- + p.print(")\n") + } +} + +// absInt returns the absolute value of v as a *big.Int. +// v must be a numeric value. +func absInt(v exact.Value) *big.Int { + // compute big-endian representation of v + b := exact.Bytes(v) // little-endian + for i, j := 0, len(b)-1; i < j; i, j = i+1, j-1 { + b[i], b[j] = b[j], b[i] + } + return new(big.Int).SetBytes(b) +} + +var ( + one = big.NewRat(1, 1) + ten = big.NewRat(10, 1) +) + +// floatString returns the string representation for a +// numeric value v in normalized floating-point format. +func floatString(v exact.Value) string { + if exact.Sign(v) == 0 { + return "0.0" + } + // x != 0 + + // convert |v| into a big.Rat x + x := new(big.Rat).SetFrac(absInt(exact.Num(v)), absInt(exact.Denom(v))) + + // normalize x and determine exponent e + // (This is not very efficient, but also not speed-critical.) + var e int + for x.Cmp(ten) >= 0 { + x.Quo(x, ten) + e++ + } + for x.Cmp(one) < 0 { + x.Mul(x, ten) + e-- + } + + // TODO(gri) Values such as 1/2 are easier to read in form 0.5 + // rather than 5.0e-1. Similarly, 1.0e1 is easier to read as + // 10.0. Fine-tune best exponent range for readability. + + s := x.FloatString(100) // good-enough precision + + // trim trailing 0's + i := len(s) + for i > 0 && s[i-1] == '0' { + i-- + } + s = s[:i] + + // add a 0 if the number ends in decimal point + if len(s) > 0 && s[len(s)-1] == '.' { + s += "0" + } + + // add exponent and sign + if e != 0 { + s += fmt.Sprintf("e%+d", e) + } + if exact.Sign(v) < 0 { + s = "-" + s + } + + // TODO(gri) If v is a "small" fraction (i.e., numerator and denominator + // are just a small number of decimal digits), add the exact fraction as + // a comment. For instance: 3.3333...e-1 /* = 1/3 */ + + return s +} + +// valString returns the string representation for the value v. +// Setting floatFmt forces an integer value to be formatted in +// normalized floating-point format. +// TODO(gri) Move this code into package exact. +func valString(v exact.Value, floatFmt bool) string { + switch v.Kind() { + case exact.Int: + if floatFmt { + return floatString(v) + } + case exact.Float: + return floatString(v) + case exact.Complex: + re := exact.Real(v) + im := exact.Imag(v) + var s string + if exact.Sign(re) != 0 { + s = floatString(re) + if exact.Sign(im) >= 0 { + s += " + " + } else { + s += " - " + im = exact.UnaryOp(token.SUB, im, 0) // negate im + } + } + // im != 0, otherwise v would be exact.Int or exact.Float + return s + floatString(im) + "i" + } + return v.String() +} + +func (p *printer) printObj(obj types.Object) { + p.print(obj.Name()) + + typ, basic := obj.Type().Underlying().(*types.Basic) + if basic && typ.Info()&types.IsUntyped != 0 { + // don't write untyped types + } else { + p.print(" ") + p.writeType(p.pkg, obj.Type()) + } + + if obj, ok := obj.(*types.Const); ok { + floatFmt := basic && typ.Info()&(types.IsFloat|types.IsComplex) != 0 + p.print(" = ") + p.print(valString(obj.Val(), floatFmt)) + } +} + +func (p *printer) printFunc(recvType types.Type, obj *types.Func) { + p.print("func ") + sig := obj.Type().(*types.Signature) + if recvType != nil { + p.print("(") + p.writeType(p.pkg, recvType) + p.print(") ") + } + p.print(obj.Name()) + p.writeSignature(p.pkg, sig) +} + +// combinedMethodSet returns the method set for a named type T +// merged with all the methods of *T that have different names than +// the methods of T. +// +// combinedMethodSet is analogous to types/typeutil.IntuitiveMethodSet +// but doesn't require a MethodSetCache. +// TODO(gri) If this functionality doesn't change over time, consider +// just calling IntuitiveMethodSet eventually. +func combinedMethodSet(T *types.Named) []*types.Selection { + // method set for T + mset := types.NewMethodSet(T) + var res []*types.Selection + for i, n := 0, mset.Len(); i < n; i++ { + res = append(res, mset.At(i)) + } + + // add all *T methods with names different from T methods + pmset := types.NewMethodSet(types.NewPointer(T)) + for i, n := 0, pmset.Len(); i < n; i++ { + pm := pmset.At(i) + if obj := pm.Obj(); mset.Lookup(obj.Pkg(), obj.Name()) == nil { + res = append(res, pm) + } + } + + return res +} diff --git a/vendor/golang.org/x/tools/cmd/godex/source.go b/vendor/golang.org/x/tools/cmd/godex/source.go new file mode 100644 index 0000000000..a86031a060 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godex/source.go @@ -0,0 +1,21 @@ +// 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 go1.5 + +// This file implements access to export data from source. + +package main + +import ( + "golang.org/x/tools/go/types" +) + +func init() { + register("source", sourceImporter) +} + +func sourceImporter(packages map[string]*types.Package, path string) (*types.Package, error) { + panic("unimplemented") +} diff --git a/vendor/golang.org/x/tools/cmd/godex/source14.go b/vendor/golang.org/x/tools/cmd/godex/source14.go new file mode 100644 index 0000000000..620a9b35db --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godex/source14.go @@ -0,0 +1,21 @@ +// 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 !go1.5 + +// This file implements access to export data from source. + +package main + +import ( + "golang.org/x/tools/go/types" +) + +func init() { + register("source", sourceImporter) +} + +func sourceImporter(packages map[string]*types.Package, path string) (*types.Package, error) { + panic("unimplemented") +} diff --git a/vendor/golang.org/x/tools/cmd/godex/writetype.go b/vendor/golang.org/x/tools/cmd/godex/writetype.go new file mode 100644 index 0000000000..c079855011 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godex/writetype.go @@ -0,0 +1,244 @@ +// 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 go1.5 + +// This file implements writing of types. The functionality is lifted +// directly from go/types, but now contains various modifications for +// nicer output. +// +// TODO(gri) back-port once we have a fixed interface and once the +// go/types API is not frozen anymore for the 1.3 release; and remove +// this implementation if possible. + +package main + +import "golang.org/x/tools/go/types" + +func (p *printer) writeType(this *types.Package, typ types.Type) { + p.writeTypeInternal(this, typ, make([]types.Type, 8)) +} + +// From go/types - leave for now to ease back-porting this code. +const GcCompatibilityMode = false + +func (p *printer) writeTypeInternal(this *types.Package, typ types.Type, visited []types.Type) { + // Theoretically, this is a quadratic lookup algorithm, but in + // practice deeply nested composite types with unnamed component + // types are uncommon. This code is likely more efficient than + // using a map. + for _, t := range visited { + if t == typ { + p.printf("○%T", typ) // cycle to typ + return + } + } + visited = append(visited, typ) + + switch t := typ.(type) { + case nil: + p.print("<nil>") + + case *types.Basic: + if t.Kind() == types.UnsafePointer { + p.print("unsafe.") + } + if GcCompatibilityMode { + // forget the alias names + switch t.Kind() { + case types.Byte: + t = types.Typ[types.Uint8] + case types.Rune: + t = types.Typ[types.Int32] + } + } + p.print(t.Name()) + + case *types.Array: + p.printf("[%d]", t.Len()) + p.writeTypeInternal(this, t.Elem(), visited) + + case *types.Slice: + p.print("[]") + p.writeTypeInternal(this, t.Elem(), visited) + + case *types.Struct: + n := t.NumFields() + if n == 0 { + p.print("struct{}") + return + } + + p.print("struct {\n") + p.indent++ + for i := 0; i < n; i++ { + f := t.Field(i) + if !f.Anonymous() { + p.printf("%s ", f.Name()) + } + p.writeTypeInternal(this, f.Type(), visited) + if tag := t.Tag(i); tag != "" { + p.printf(" %q", tag) + } + p.print("\n") + } + p.indent-- + p.print("}") + + case *types.Pointer: + p.print("*") + p.writeTypeInternal(this, t.Elem(), visited) + + case *types.Tuple: + p.writeTuple(this, t, false, visited) + + case *types.Signature: + p.print("func") + p.writeSignatureInternal(this, t, visited) + + case *types.Interface: + // We write the source-level methods and embedded types rather + // than the actual method set since resolved method signatures + // may have non-printable cycles if parameters have anonymous + // interface types that (directly or indirectly) embed the + // current interface. For instance, consider the result type + // of m: + // + // type T interface{ + // m() interface{ T } + // } + // + n := t.NumMethods() + if n == 0 { + p.print("interface{}") + return + } + + p.print("interface {\n") + p.indent++ + if GcCompatibilityMode { + // print flattened interface + // (useful to compare against gc-generated interfaces) + for i := 0; i < n; i++ { + m := t.Method(i) + p.print(m.Name()) + p.writeSignatureInternal(this, m.Type().(*types.Signature), visited) + p.print("\n") + } + } else { + // print explicit interface methods and embedded types + for i, n := 0, t.NumExplicitMethods(); i < n; i++ { + m := t.ExplicitMethod(i) + p.print(m.Name()) + p.writeSignatureInternal(this, m.Type().(*types.Signature), visited) + p.print("\n") + } + for i, n := 0, t.NumEmbeddeds(); i < n; i++ { + typ := t.Embedded(i) + p.writeTypeInternal(this, typ, visited) + p.print("\n") + } + } + p.indent-- + p.print("}") + + case *types.Map: + p.print("map[") + p.writeTypeInternal(this, t.Key(), visited) + p.print("]") + p.writeTypeInternal(this, t.Elem(), visited) + + case *types.Chan: + var s string + var parens bool + switch t.Dir() { + case types.SendRecv: + s = "chan " + // chan (<-chan T) requires parentheses + if c, _ := t.Elem().(*types.Chan); c != nil && c.Dir() == types.RecvOnly { + parens = true + } + case types.SendOnly: + s = "chan<- " + case types.RecvOnly: + s = "<-chan " + default: + panic("unreachable") + } + p.print(s) + if parens { + p.print("(") + } + p.writeTypeInternal(this, t.Elem(), visited) + if parens { + p.print(")") + } + + case *types.Named: + s := "<Named w/o object>" + if obj := t.Obj(); obj != nil { + if pkg := obj.Pkg(); pkg != nil { + if pkg != this { + p.print(pkg.Path()) + p.print(".") + } + // TODO(gri): function-local named types should be displayed + // differently from named types at package level to avoid + // ambiguity. + } + s = obj.Name() + } + p.print(s) + + default: + // For externally defined implementations of Type. + p.print(t.String()) + } +} + +func (p *printer) writeTuple(this *types.Package, tup *types.Tuple, variadic bool, visited []types.Type) { + p.print("(") + for i, n := 0, tup.Len(); i < n; i++ { + if i > 0 { + p.print(", ") + } + v := tup.At(i) + if name := v.Name(); name != "" { + p.print(name) + p.print(" ") + } + typ := v.Type() + if variadic && i == n-1 { + p.print("...") + typ = typ.(*types.Slice).Elem() + } + p.writeTypeInternal(this, typ, visited) + } + p.print(")") +} + +func (p *printer) writeSignature(this *types.Package, sig *types.Signature) { + p.writeSignatureInternal(this, sig, make([]types.Type, 8)) +} + +func (p *printer) writeSignatureInternal(this *types.Package, sig *types.Signature, visited []types.Type) { + p.writeTuple(this, sig.Params(), sig.Variadic(), visited) + + res := sig.Results() + n := res.Len() + if n == 0 { + // no result + return + } + + p.print(" ") + if n == 1 && res.At(0).Name() == "" { + // single unnamed result + p.writeTypeInternal(this, res.At(0).Type(), visited) + return + } + + // multiple or named result(s) + p.writeTuple(this, res, false, visited) +} diff --git a/vendor/golang.org/x/tools/cmd/godex/writetype14.go b/vendor/golang.org/x/tools/cmd/godex/writetype14.go new file mode 100644 index 0000000000..ea009b4b1c --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godex/writetype14.go @@ -0,0 +1,244 @@ +// 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 !go1.5 + +// This file implements writing of types. The functionality is lifted +// directly from go/types, but now contains various modifications for +// nicer output. +// +// TODO(gri) back-port once we have a fixed interface and once the +// go/types API is not frozen anymore for the 1.3 release; and remove +// this implementation if possible. + +package main + +import "golang.org/x/tools/go/types" + +func (p *printer) writeType(this *types.Package, typ types.Type) { + p.writeTypeInternal(this, typ, make([]types.Type, 8)) +} + +// From go/types - leave for now to ease back-porting this code. +const GcCompatibilityMode = false + +func (p *printer) writeTypeInternal(this *types.Package, typ types.Type, visited []types.Type) { + // Theoretically, this is a quadratic lookup algorithm, but in + // practice deeply nested composite types with unnamed component + // types are uncommon. This code is likely more efficient than + // using a map. + for _, t := range visited { + if t == typ { + p.printf("○%T", typ) // cycle to typ + return + } + } + visited = append(visited, typ) + + switch t := typ.(type) { + case nil: + p.print("<nil>") + + case *types.Basic: + if t.Kind() == types.UnsafePointer { + p.print("unsafe.") + } + if GcCompatibilityMode { + // forget the alias names + switch t.Kind() { + case types.Byte: + t = types.Typ[types.Uint8] + case types.Rune: + t = types.Typ[types.Int32] + } + } + p.print(t.Name()) + + case *types.Array: + p.printf("[%d]", t.Len()) + p.writeTypeInternal(this, t.Elem(), visited) + + case *types.Slice: + p.print("[]") + p.writeTypeInternal(this, t.Elem(), visited) + + case *types.Struct: + n := t.NumFields() + if n == 0 { + p.print("struct{}") + return + } + + p.print("struct {\n") + p.indent++ + for i := 0; i < n; i++ { + f := t.Field(i) + if !f.Anonymous() { + p.printf("%s ", f.Name()) + } + p.writeTypeInternal(this, f.Type(), visited) + if tag := t.Tag(i); tag != "" { + p.printf(" %q", tag) + } + p.print("\n") + } + p.indent-- + p.print("}") + + case *types.Pointer: + p.print("*") + p.writeTypeInternal(this, t.Elem(), visited) + + case *types.Tuple: + p.writeTuple(this, t, false, visited) + + case *types.Signature: + p.print("func") + p.writeSignatureInternal(this, t, visited) + + case *types.Interface: + // We write the source-level methods and embedded types rather + // than the actual method set since resolved method signatures + // may have non-printable cycles if parameters have anonymous + // interface types that (directly or indirectly) embed the + // current interface. For instance, consider the result type + // of m: + // + // type T interface{ + // m() interface{ T } + // } + // + n := t.NumMethods() + if n == 0 { + p.print("interface{}") + return + } + + p.print("interface {\n") + p.indent++ + if GcCompatibilityMode { + // print flattened interface + // (useful to compare against gc-generated interfaces) + for i := 0; i < n; i++ { + m := t.Method(i) + p.print(m.Name()) + p.writeSignatureInternal(this, m.Type().(*types.Signature), visited) + p.print("\n") + } + } else { + // print explicit interface methods and embedded types + for i, n := 0, t.NumExplicitMethods(); i < n; i++ { + m := t.ExplicitMethod(i) + p.print(m.Name()) + p.writeSignatureInternal(this, m.Type().(*types.Signature), visited) + p.print("\n") + } + for i, n := 0, t.NumEmbeddeds(); i < n; i++ { + typ := t.Embedded(i) + p.writeTypeInternal(this, typ, visited) + p.print("\n") + } + } + p.indent-- + p.print("}") + + case *types.Map: + p.print("map[") + p.writeTypeInternal(this, t.Key(), visited) + p.print("]") + p.writeTypeInternal(this, t.Elem(), visited) + + case *types.Chan: + var s string + var parens bool + switch t.Dir() { + case types.SendRecv: + s = "chan " + // chan (<-chan T) requires parentheses + if c, _ := t.Elem().(*types.Chan); c != nil && c.Dir() == types.RecvOnly { + parens = true + } + case types.SendOnly: + s = "chan<- " + case types.RecvOnly: + s = "<-chan " + default: + panic("unreachable") + } + p.print(s) + if parens { + p.print("(") + } + p.writeTypeInternal(this, t.Elem(), visited) + if parens { + p.print(")") + } + + case *types.Named: + s := "<Named w/o object>" + if obj := t.Obj(); obj != nil { + if pkg := obj.Pkg(); pkg != nil { + if pkg != this { + p.print(pkg.Path()) + p.print(".") + } + // TODO(gri): function-local named types should be displayed + // differently from named types at package level to avoid + // ambiguity. + } + s = obj.Name() + } + p.print(s) + + default: + // For externally defined implementations of Type. + p.print(t.String()) + } +} + +func (p *printer) writeTuple(this *types.Package, tup *types.Tuple, variadic bool, visited []types.Type) { + p.print("(") + for i, n := 0, tup.Len(); i < n; i++ { + if i > 0 { + p.print(", ") + } + v := tup.At(i) + if name := v.Name(); name != "" { + p.print(name) + p.print(" ") + } + typ := v.Type() + if variadic && i == n-1 { + p.print("...") + typ = typ.(*types.Slice).Elem() + } + p.writeTypeInternal(this, typ, visited) + } + p.print(")") +} + +func (p *printer) writeSignature(this *types.Package, sig *types.Signature) { + p.writeSignatureInternal(this, sig, make([]types.Type, 8)) +} + +func (p *printer) writeSignatureInternal(this *types.Package, sig *types.Signature, visited []types.Type) { + p.writeTuple(this, sig.Params(), sig.Variadic(), visited) + + res := sig.Results() + n := res.Len() + if n == 0 { + // no result + return + } + + p.print(" ") + if n == 1 && res.At(0).Name() == "" { + // single unnamed result + p.writeTypeInternal(this, res.At(0).Type(), visited) + return + } + + // multiple or named result(s) + p.writeTuple(this, res, false, visited) +} diff --git a/vendor/golang.org/x/tools/cmd/godoc/README.godoc-app b/vendor/golang.org/x/tools/cmd/godoc/README.godoc-app new file mode 100644 index 0000000000..50a051659d --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godoc/README.godoc-app @@ -0,0 +1,56 @@ +godoc on appengine +------------------ + +Prerequisites +------------- + +* Go appengine SDK + https://developers.google.com/appengine/downloads#Google_App_Engine_SDK_for_Go + +* Go sources at tip under $GOROOT + +* Godoc sources at tip inside $GOPATH + (go get -d golang.org/x/tools/cmd/godoc) + + +Directory structure +------------------- + +* Let $APPDIR be the directory containing the app engine files. + (e.g., $APPDIR=$HOME/godoc-app) + +* $APPDIR contains the following entries (this may change depending on + app-engine release and version of godoc): + + app.yaml + golang.org/x/tools/cmd/godoc + godoc.zip + index.split.* + +* The app.yaml file is set up per app engine documentation. + For instance: + + application: godoc-app + version: 1 + runtime: go + api_version: go1 + + handlers: + - url: /.* + script: _go_app + + +Configuring and running godoc +----------------------------- + +To configure godoc, run + + bash setup-godoc-app.bash + +to prepare an $APPDIR as described above. See the script for details on usage. + +To run godoc locally, using the App Engine development server, run + + <path to go_appengine>/dev_appserver.py $APPDIR + +godoc should come up at http://localhost:8080 . diff --git a/vendor/golang.org/x/tools/cmd/godoc/appinit.go b/vendor/golang.org/x/tools/cmd/godoc/appinit.go new file mode 100644 index 0000000000..0c83df9074 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godoc/appinit.go @@ -0,0 +1,82 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build appengine + +package main + +// This file replaces main.go when running godoc under app-engine. +// See README.godoc-app for details. + +import ( + "archive/zip" + "log" + "net/http" + "path" + "regexp" + + "golang.org/x/tools/godoc" + "golang.org/x/tools/godoc/dl" + "golang.org/x/tools/godoc/proxy" + "golang.org/x/tools/godoc/short" + "golang.org/x/tools/godoc/static" + "golang.org/x/tools/godoc/vfs" + "golang.org/x/tools/godoc/vfs/mapfs" + "golang.org/x/tools/godoc/vfs/zipfs" + + "google.golang.org/appengine" +) + +func init() { + enforceHosts = !appengine.IsDevAppServer() + playEnabled = true + + log.Println("initializing godoc ...") + log.Printf(".zip file = %s", zipFilename) + log.Printf(".zip GOROOT = %s", zipGoroot) + log.Printf("index files = %s", indexFilenames) + + goroot := path.Join("/", zipGoroot) // fsHttp paths are relative to '/' + + // read .zip file and set up file systems + const zipfile = zipFilename + rc, err := zip.OpenReader(zipfile) + if err != nil { + log.Fatalf("%s: %s\n", zipfile, err) + } + // rc is never closed (app running forever) + fs.Bind("/", zipfs.New(rc, zipFilename), goroot, vfs.BindReplace) + fs.Bind("/lib/godoc", mapfs.New(static.Files), "/", vfs.BindReplace) + + corpus := godoc.NewCorpus(fs) + corpus.Verbose = false + corpus.MaxResults = 10000 // matches flag default in main.go + corpus.IndexEnabled = true + corpus.IndexFiles = indexFilenames + if err := corpus.Init(); err != nil { + log.Fatal(err) + } + corpus.IndexDirectory = indexDirectoryDefault + go corpus.RunIndexer() + + pres = godoc.NewPresentation(corpus) + pres.TabWidth = 8 + pres.ShowPlayground = true + pres.ShowExamples = true + pres.DeclLinks = true + pres.NotesRx = regexp.MustCompile("BUG") + + readTemplates(pres, true) + + mux := registerHandlers(pres) + dl.RegisterHandlers(mux) + short.RegisterHandlers(mux) + + // Register /compile and /share handlers against the default serve mux + // so that other app modules can make plain HTTP requests to those + // hosts. (For reasons, HTTPS communication between modules is broken.) + proxy.RegisterHandlers(http.DefaultServeMux) + + log.Println("godoc initialization complete") +} diff --git a/vendor/golang.org/x/tools/cmd/godoc/blog.go b/vendor/golang.org/x/tools/cmd/godoc/blog.go new file mode 100644 index 0000000000..dec4732fc7 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godoc/blog.go @@ -0,0 +1,81 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "fmt" + "go/build" + "log" + "net/http" + "os" + "path/filepath" + "runtime" + "strings" + "sync" + + "golang.org/x/tools/blog" + "golang.org/x/tools/godoc/redirect" +) + +const ( + blogRepo = "golang.org/x/blog" + blogURL = "http://blog.golang.org/" + blogPath = "/blog/" +) + +var ( + blogServer http.Handler // set by blogInit + blogInitOnce sync.Once + playEnabled bool +) + +func init() { + // Initialize blog only when first accessed. + http.HandleFunc(blogPath, func(w http.ResponseWriter, r *http.Request) { + blogInitOnce.Do(blogInit) + blogServer.ServeHTTP(w, r) + }) +} + +func blogInit() { + // Binary distributions will include the blog content in "/blog". + root := filepath.Join(runtime.GOROOT(), "blog") + + // Prefer content from go.blog repository if present. + if pkg, err := build.Import(blogRepo, "", build.FindOnly); err == nil { + root = pkg.Dir + } + + // If content is not available fall back to redirect. + if fi, err := os.Stat(root); err != nil || !fi.IsDir() { + fmt.Fprintf(os.Stderr, "Blog content not available locally. "+ + "To install, run \n\tgo get %v\n", blogRepo) + blogServer = http.HandlerFunc(blogRedirectHandler) + return + } + + s, err := blog.NewServer(blog.Config{ + BaseURL: blogPath, + BasePath: strings.TrimSuffix(blogPath, "/"), + ContentPath: filepath.Join(root, "content"), + TemplatePath: filepath.Join(root, "template"), + HomeArticles: 5, + PlayEnabled: playEnabled, + }) + if err != nil { + log.Fatal(err) + } + blogServer = s +} + +func blogRedirectHandler(w http.ResponseWriter, r *http.Request) { + if r.URL.Path == blogPath { + http.Redirect(w, r, blogURL, http.StatusFound) + return + } + blogPrefixHandler.ServeHTTP(w, r) +} + +var blogPrefixHandler = redirect.PrefixHandler(blogPath, blogURL) diff --git a/vendor/golang.org/x/tools/cmd/godoc/codewalk.go b/vendor/golang.org/x/tools/cmd/godoc/codewalk.go new file mode 100644 index 0000000000..e3bf5cd009 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godoc/codewalk.go @@ -0,0 +1,523 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// The /doc/codewalk/ tree is synthesized from codewalk descriptions, +// files named $GOROOT/doc/codewalk/*.xml. +// For an example and a description of the format, see +// http://golang.org/doc/codewalk/codewalk or run godoc -http=:6060 +// and see http://localhost:6060/doc/codewalk/codewalk . +// That page is itself a codewalk; the source code for it is +// $GOROOT/doc/codewalk/codewalk.xml. + +package main + +import ( + "bytes" + "encoding/xml" + "errors" + "fmt" + "io" + "log" + "net/http" + "os" + pathpkg "path" + "regexp" + "sort" + "strconv" + "strings" + "text/template" + "unicode/utf8" + + "golang.org/x/tools/godoc" + "golang.org/x/tools/godoc/vfs" +) + +var codewalkHTML, codewalkdirHTML *template.Template + +// Handler for /doc/codewalk/ and below. +func codewalk(w http.ResponseWriter, r *http.Request) { + relpath := r.URL.Path[len("/doc/codewalk/"):] + abspath := r.URL.Path + + r.ParseForm() + if f := r.FormValue("fileprint"); f != "" { + codewalkFileprint(w, r, f) + return + } + + // If directory exists, serve list of code walks. + dir, err := fs.Lstat(abspath) + if err == nil && dir.IsDir() { + codewalkDir(w, r, relpath, abspath) + return + } + + // If file exists, serve using standard file server. + if err == nil { + pres.ServeFile(w, r) + return + } + + // Otherwise append .xml and hope to find + // a codewalk description, but before trim + // the trailing /. + abspath = strings.TrimRight(abspath, "/") + cw, err := loadCodewalk(abspath + ".xml") + if err != nil { + log.Print(err) + pres.ServeError(w, r, relpath, err) + return + } + + // Canonicalize the path and redirect if changed + if redir(w, r) { + return + } + + pres.ServePage(w, godoc.Page{ + Title: "Codewalk: " + cw.Title, + Tabtitle: cw.Title, + Body: applyTemplate(codewalkHTML, "codewalk", cw), + }) +} + +func redir(w http.ResponseWriter, r *http.Request) (redirected bool) { + canonical := pathpkg.Clean(r.URL.Path) + if !strings.HasSuffix(canonical, "/") { + canonical += "/" + } + if r.URL.Path != canonical { + url := *r.URL + url.Path = canonical + http.Redirect(w, r, url.String(), http.StatusMovedPermanently) + redirected = true + } + return +} + +func applyTemplate(t *template.Template, name string, data interface{}) []byte { + var buf bytes.Buffer + if err := t.Execute(&buf, data); err != nil { + log.Printf("%s.Execute: %s", name, err) + } + return buf.Bytes() +} + +// A Codewalk represents a single codewalk read from an XML file. +type Codewalk struct { + Title string `xml:"title,attr"` + File []string `xml:"file"` + Step []*Codestep `xml:"step"` +} + +// A Codestep is a single step in a codewalk. +type Codestep struct { + // Filled in from XML + Src string `xml:"src,attr"` + Title string `xml:"title,attr"` + XML string `xml:",innerxml"` + + // Derived from Src; not in XML. + Err error + File string + Lo int + LoByte int + Hi int + HiByte int + Data []byte +} + +// String method for printing in template. +// Formats file address nicely. +func (st *Codestep) String() string { + s := st.File + if st.Lo != 0 || st.Hi != 0 { + s += fmt.Sprintf(":%d", st.Lo) + if st.Lo != st.Hi { + s += fmt.Sprintf(",%d", st.Hi) + } + } + return s +} + +// loadCodewalk reads a codewalk from the named XML file. +func loadCodewalk(filename string) (*Codewalk, error) { + f, err := fs.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + cw := new(Codewalk) + d := xml.NewDecoder(f) + d.Entity = xml.HTMLEntity + err = d.Decode(cw) + if err != nil { + return nil, &os.PathError{Op: "parsing", Path: filename, Err: err} + } + + // Compute file list, evaluate line numbers for addresses. + m := make(map[string]bool) + for _, st := range cw.Step { + i := strings.Index(st.Src, ":") + if i < 0 { + i = len(st.Src) + } + filename := st.Src[0:i] + data, err := vfs.ReadFile(fs, filename) + if err != nil { + st.Err = err + continue + } + if i < len(st.Src) { + lo, hi, err := addrToByteRange(st.Src[i+1:], 0, data) + if err != nil { + st.Err = err + continue + } + // Expand match to line boundaries. + for lo > 0 && data[lo-1] != '\n' { + lo-- + } + for hi < len(data) && (hi == 0 || data[hi-1] != '\n') { + hi++ + } + st.Lo = byteToLine(data, lo) + st.Hi = byteToLine(data, hi-1) + } + st.Data = data + st.File = filename + m[filename] = true + } + + // Make list of files + cw.File = make([]string, len(m)) + i := 0 + for f := range m { + cw.File[i] = f + i++ + } + sort.Strings(cw.File) + + return cw, nil +} + +// codewalkDir serves the codewalk directory listing. +// It scans the directory for subdirectories or files named *.xml +// and prepares a table. +func codewalkDir(w http.ResponseWriter, r *http.Request, relpath, abspath string) { + type elem struct { + Name string + Title string + } + + dir, err := fs.ReadDir(abspath) + if err != nil { + log.Print(err) + pres.ServeError(w, r, relpath, err) + return + } + var v []interface{} + for _, fi := range dir { + name := fi.Name() + if fi.IsDir() { + v = append(v, &elem{name + "/", ""}) + } else if strings.HasSuffix(name, ".xml") { + cw, err := loadCodewalk(abspath + "/" + name) + if err != nil { + continue + } + v = append(v, &elem{name[0 : len(name)-len(".xml")], cw.Title}) + } + } + + pres.ServePage(w, godoc.Page{ + Title: "Codewalks", + Body: applyTemplate(codewalkdirHTML, "codewalkdir", v), + }) +} + +// codewalkFileprint serves requests with ?fileprint=f&lo=lo&hi=hi. +// The filename f has already been retrieved and is passed as an argument. +// Lo and hi are the numbers of the first and last line to highlight +// in the response. This format is used for the middle window pane +// of the codewalk pages. It is a separate iframe and does not get +// the usual godoc HTML wrapper. +func codewalkFileprint(w http.ResponseWriter, r *http.Request, f string) { + abspath := f + data, err := vfs.ReadFile(fs, abspath) + if err != nil { + log.Print(err) + pres.ServeError(w, r, f, err) + return + } + lo, _ := strconv.Atoi(r.FormValue("lo")) + hi, _ := strconv.Atoi(r.FormValue("hi")) + if hi < lo { + hi = lo + } + lo = lineToByte(data, lo) + hi = lineToByte(data, hi+1) + + // Put the mark 4 lines before lo, so that the iframe + // shows a few lines of context before the highlighted + // section. + n := 4 + mark := lo + for ; mark > 0 && n > 0; mark-- { + if data[mark-1] == '\n' { + if n--; n == 0 { + break + } + } + } + + io.WriteString(w, `<style type="text/css">@import "/doc/codewalk/codewalk.css";</style><pre>`) + template.HTMLEscape(w, data[0:mark]) + io.WriteString(w, "<a name='mark'></a>") + template.HTMLEscape(w, data[mark:lo]) + if lo < hi { + io.WriteString(w, "<div class='codewalkhighlight'>") + template.HTMLEscape(w, data[lo:hi]) + io.WriteString(w, "</div>") + } + template.HTMLEscape(w, data[hi:]) + io.WriteString(w, "</pre>") +} + +// addrToByte evaluates the given address starting at offset start in data. +// It returns the lo and hi byte offset of the matched region within data. +// See http://plan9.bell-labs.com/sys/doc/sam/sam.html Table II +// for details on the syntax. +func addrToByteRange(addr string, start int, data []byte) (lo, hi int, err error) { + var ( + dir byte + prevc byte + charOffset bool + ) + lo = start + hi = start + for addr != "" && err == nil { + c := addr[0] + switch c { + default: + err = errors.New("invalid address syntax near " + string(c)) + case ',': + if len(addr) == 1 { + hi = len(data) + } else { + _, hi, err = addrToByteRange(addr[1:], hi, data) + } + return + + case '+', '-': + if prevc == '+' || prevc == '-' { + lo, hi, err = addrNumber(data, lo, hi, prevc, 1, charOffset) + } + dir = c + + case '$': + lo = len(data) + hi = len(data) + if len(addr) > 1 { + dir = '+' + } + + case '#': + charOffset = true + + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + var i int + for i = 1; i < len(addr); i++ { + if addr[i] < '0' || addr[i] > '9' { + break + } + } + var n int + n, err = strconv.Atoi(addr[0:i]) + if err != nil { + break + } + lo, hi, err = addrNumber(data, lo, hi, dir, n, charOffset) + dir = 0 + charOffset = false + prevc = c + addr = addr[i:] + continue + + case '/': + var i, j int + Regexp: + for i = 1; i < len(addr); i++ { + switch addr[i] { + case '\\': + i++ + case '/': + j = i + 1 + break Regexp + } + } + if j == 0 { + j = i + } + pattern := addr[1:i] + lo, hi, err = addrRegexp(data, lo, hi, dir, pattern) + prevc = c + addr = addr[j:] + continue + } + prevc = c + addr = addr[1:] + } + + if err == nil && dir != 0 { + lo, hi, err = addrNumber(data, lo, hi, dir, 1, charOffset) + } + if err != nil { + return 0, 0, err + } + return lo, hi, nil +} + +// addrNumber applies the given dir, n, and charOffset to the address lo, hi. +// dir is '+' or '-', n is the count, and charOffset is true if the syntax +// used was #n. Applying +n (or +#n) means to advance n lines +// (or characters) after hi. Applying -n (or -#n) means to back up n lines +// (or characters) before lo. +// The return value is the new lo, hi. +func addrNumber(data []byte, lo, hi int, dir byte, n int, charOffset bool) (int, int, error) { + switch dir { + case 0: + lo = 0 + hi = 0 + fallthrough + + case '+': + if charOffset { + pos := hi + for ; n > 0 && pos < len(data); n-- { + _, size := utf8.DecodeRune(data[pos:]) + pos += size + } + if n == 0 { + return pos, pos, nil + } + break + } + // find next beginning of line + if hi > 0 { + for hi < len(data) && data[hi-1] != '\n' { + hi++ + } + } + lo = hi + if n == 0 { + return lo, hi, nil + } + for ; hi < len(data); hi++ { + if data[hi] != '\n' { + continue + } + switch n--; n { + case 1: + lo = hi + 1 + case 0: + return lo, hi + 1, nil + } + } + + case '-': + if charOffset { + // Scan backward for bytes that are not UTF-8 continuation bytes. + pos := lo + for ; pos > 0 && n > 0; pos-- { + if data[pos]&0xc0 != 0x80 { + n-- + } + } + if n == 0 { + return pos, pos, nil + } + break + } + // find earlier beginning of line + for lo > 0 && data[lo-1] != '\n' { + lo-- + } + hi = lo + if n == 0 { + return lo, hi, nil + } + for ; lo >= 0; lo-- { + if lo > 0 && data[lo-1] != '\n' { + continue + } + switch n--; n { + case 1: + hi = lo + case 0: + return lo, hi, nil + } + } + } + + return 0, 0, errors.New("address out of range") +} + +// addrRegexp searches for pattern in the given direction starting at lo, hi. +// The direction dir is '+' (search forward from hi) or '-' (search backward from lo). +// Backward searches are unimplemented. +func addrRegexp(data []byte, lo, hi int, dir byte, pattern string) (int, int, error) { + re, err := regexp.Compile(pattern) + if err != nil { + return 0, 0, err + } + if dir == '-' { + // Could implement reverse search using binary search + // through file, but that seems like overkill. + return 0, 0, errors.New("reverse search not implemented") + } + m := re.FindIndex(data[hi:]) + if len(m) > 0 { + m[0] += hi + m[1] += hi + } else if hi > 0 { + // No match. Wrap to beginning of data. + m = re.FindIndex(data) + } + if len(m) == 0 { + return 0, 0, errors.New("no match for " + pattern) + } + return m[0], m[1], nil +} + +// lineToByte returns the byte index of the first byte of line n. +// Line numbers begin at 1. +func lineToByte(data []byte, n int) int { + if n <= 1 { + return 0 + } + n-- + for i, c := range data { + if c == '\n' { + if n--; n == 0 { + return i + 1 + } + } + } + return len(data) +} + +// byteToLine returns the number of the line containing the byte at index i. +func byteToLine(data []byte, i int) int { + l := 1 + for j, c := range data { + if j == i { + return l + } + if c == '\n' { + l++ + } + } + return l +} diff --git a/vendor/golang.org/x/tools/cmd/godoc/dl.go b/vendor/golang.org/x/tools/cmd/godoc/dl.go new file mode 100644 index 0000000000..40e66584bc --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godoc/dl.go @@ -0,0 +1,16 @@ +// 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 !appengine + +package main + +import "net/http" + +// Register a redirect handler for /dl/ to the golang.org download page. +// This file will not be included when deploying godoc to golang.org. + +func init() { + http.Handle("/dl/", http.RedirectHandler("https://golang.org/dl/", http.StatusFound)) +} diff --git a/vendor/golang.org/x/tools/cmd/godoc/doc.go b/vendor/golang.org/x/tools/cmd/godoc/doc.go new file mode 100644 index 0000000000..275423a100 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godoc/doc.go @@ -0,0 +1,151 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* + +Godoc extracts and generates documentation for Go programs. + +It has two modes. + +Without the -http flag, it runs in command-line mode and prints plain text +documentation to standard output and exits. If both a library package and +a command with the same name exists, using the prefix cmd/ will force +documentation on the command rather than the library package. If the -src +flag is specified, godoc prints the exported interface of a package in Go +source form, or the implementation of a specific exported language entity: + + godoc fmt # documentation for package fmt + godoc fmt Printf # documentation for fmt.Printf + godoc cmd/go # force documentation for the go command + godoc -src fmt # fmt package interface in Go source form + godoc -src fmt Printf # implementation of fmt.Printf + +In command-line mode, the -q flag enables search queries against a godoc running +as a webserver. If no explicit server address is specified with the -server flag, +godoc first tries localhost:6060 and then http://golang.org. + + godoc -q Reader + godoc -q math.Sin + godoc -server=:6060 -q sin + +With the -http flag, it runs as a web server and presents the documentation as a +web page. + + godoc -http=:6060 + +Usage: + godoc [flag] package [name ...] + +The flags are: + -v + verbose mode + -q + arguments are considered search queries: a legal query is a + single identifier (such as ToLower) or a qualified identifier + (such as math.Sin) + -src + print (exported) source in command-line mode + -tabwidth=4 + width of tabs in units of spaces + -timestamps=true + show timestamps with directory listings + -index + enable identifier and full text search index + (no search box is shown if -index is not set) + -index_files="" + glob pattern specifying index files; if not empty, + the index is read from these files in sorted order + -index_throttle=0.75 + index throttle value; a value of 0 means no time is allocated + to the indexer (the indexer will never finish), a value of 1.0 + means that index creation is running at full throttle (other + goroutines may get no time while the index is built) + -links=true: + link identifiers to their declarations + -write_index=false + write index to a file; the file name must be specified with + -index_files + -maxresults=10000 + maximum number of full text search results shown + (no full text index is built if maxresults <= 0) + -notes="BUG" + regular expression matching note markers to show + (e.g., "BUG|TODO", ".*") + -html + print HTML in command-line mode + -goroot=$GOROOT + Go root directory + -http=addr + HTTP service address (e.g., '127.0.0.1:6060' or just ':6060') + -server=addr + webserver address for command line searches + -analysis=type,pointer + comma-separated list of analyses to perform + "type": display identifier resolution, type info, method sets, + 'implements', and static callees + "pointer" display channel peers, callers and dynamic callees + (significantly slower) + See http://golang.org/lib/godoc/analysis/help.html for details. + -templates="" + directory containing alternate template files; if set, + the directory may provide alternative template files + for the files in $GOROOT/lib/godoc + -url=path + print to standard output the data that would be served by + an HTTP request for path + -zip="" + zip file providing the file system to serve; disabled if empty + +By default, godoc looks at the packages it finds via $GOROOT and $GOPATH (if set). +This behavior can be altered by providing an alternative $GOROOT with the -goroot +flag. + +When godoc runs as a web server and -index is set, a search index is maintained. +The index is created at startup. + +The index contains both identifier and full text search information (searchable +via regular expressions). The maximum number of full text search results shown +can be set with the -maxresults flag; if set to 0, no full text results are +shown, and only an identifier index but no full text search index is created. + +By default, godoc uses the system's GOOS/GOARCH; in command-line mode you can +set the GOOS/GOARCH environment variables to get output for the system specified. +If -http was specified you can provide the URL parameters "GOOS" and "GOARCH" +to set the output on the web page. + +The presentation mode of web pages served by godoc can be controlled with the +"m" URL parameter; it accepts a comma-separated list of flag names as value: + + all show documentation for all declarations, not just the exported ones + methods show all embedded methods, not just those of unexported anonymous fields + src show the original source code rather then the extracted documentation + text present the page in textual (command-line) form rather than HTML + flat present flat (not indented) directory listings using full paths + +For instance, http://golang.org/pkg/math/big/?m=all,text shows the documentation +for all (not just the exported) declarations of package big, in textual form (as +it would appear when using godoc from the command line: "godoc -src math/big .*"). + +By default, godoc serves files from the file system of the underlying OS. +Instead, a .zip file may be provided via the -zip flag, which contains +the file system to serve. The file paths stored in the .zip file must use +slash ('/') as path separator; and they must be unrooted. $GOROOT (or -goroot) +must be set to the .zip file directory path containing the Go root directory. +For instance, for a .zip file created by the command: + + zip go.zip $HOME/go + +one may run godoc as follows: + + godoc -http=:6060 -zip=go.zip -goroot=$HOME/go + +Godoc documentation is converted to HTML or to text using the go/doc package; +see http://golang.org/pkg/go/doc/#ToHTML for the exact rules. +Godoc also shows example code that is runnable by the testing package; +see http://golang.org/pkg/testing/#hdr-Examples for the conventions. +See "Godoc: documenting Go code" for how to write good comments for godoc: +http://golang.org/doc/articles/godoc_documenting_go_code.html + +*/ +package main // import "golang.org/x/tools/cmd/godoc" diff --git a/vendor/golang.org/x/tools/cmd/godoc/godoc_test.go b/vendor/golang.org/x/tools/cmd/godoc/godoc_test.go new file mode 100644 index 0000000000..e4ab12f80f --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godoc/godoc_test.go @@ -0,0 +1,454 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main_test + +import ( + "bufio" + "bytes" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "os" + "os/exec" + "path/filepath" + "regexp" + "runtime" + "strings" + "testing" + "time" +) + +var godocTests = []struct { + args []string + matches []string // regular expressions + dontmatch []string // regular expressions +}{ + { + args: []string{"fmt"}, + matches: []string{ + `import "fmt"`, + `Package fmt implements formatted I/O`, + }, + }, + { + args: []string{"io", "WriteString"}, + matches: []string{ + `func WriteString\(`, + `WriteString writes the contents of the string s to w`, + }, + }, + { + args: []string{"nonexistingpkg"}, + matches: []string{ + // The last pattern (does not e) is for plan9: + // http://build.golang.org/log/2d8e5e14ed365bfa434b37ec0338cd9e6f8dd9bf + `no such file or directory|does not exist|cannot find the file|(?:' does not e)`, + }, + }, + { + args: []string{"fmt", "NonexistentSymbol"}, + matches: []string{ + `No match found\.`, + }, + }, + { + args: []string{"-src", "syscall", "Open"}, + matches: []string{ + `func Open\(`, + }, + dontmatch: []string{ + `No match found\.`, + }, + }, +} + +// buildGodoc builds the godoc executable. +// It returns its path, and a cleanup function. +// +// TODO(adonovan): opt: do this at most once, and do the cleanup +// exactly once. How though? There's no atexit. +func buildGodoc(t *testing.T) (bin string, cleanup func()) { + if runtime.GOARCH == "arm" { + t.Skip("skipping test on arm platforms; too slow") + } + tmp, err := ioutil.TempDir("", "godoc-regtest-") + if err != nil { + t.Fatal(err) + } + defer func() { + if cleanup == nil { // probably, go build failed. + os.RemoveAll(tmp) + } + }() + + bin = filepath.Join(tmp, "godoc") + if runtime.GOOS == "windows" { + bin += ".exe" + } + cmd := exec.Command("go", "build", "-o", bin) + if err := cmd.Run(); err != nil { + t.Fatalf("Building godoc: %v", err) + } + + return bin, func() { os.RemoveAll(tmp) } +} + +// Basic regression test for godoc command-line tool. +func TestCLI(t *testing.T) { + bin, cleanup := buildGodoc(t) + defer cleanup() + for _, test := range godocTests { + cmd := exec.Command(bin, test.args...) + cmd.Args[0] = "godoc" + out, err := cmd.CombinedOutput() + if err != nil { + t.Errorf("Running with args %#v: %v", test.args, err) + continue + } + for _, pat := range test.matches { + re := regexp.MustCompile(pat) + if !re.Match(out) { + t.Errorf("godoc %v =\n%s\nwanted /%v/", strings.Join(test.args, " "), out, pat) + } + } + for _, pat := range test.dontmatch { + re := regexp.MustCompile(pat) + if re.Match(out) { + t.Errorf("godoc %v =\n%s\ndid not want /%v/", strings.Join(test.args, " "), out, pat) + } + } + } +} + +func serverAddress(t *testing.T) string { + ln, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + ln, err = net.Listen("tcp6", "[::1]:0") + } + if err != nil { + t.Fatal(err) + } + defer ln.Close() + return ln.Addr().String() +} + +func waitForServerReady(t *testing.T, addr string) { + waitForServer(t, + fmt.Sprintf("http://%v/", addr), + "The Go Programming Language", + 5*time.Second) +} + +func waitForSearchReady(t *testing.T, addr string) { + waitForServer(t, + fmt.Sprintf("http://%v/search?q=FALLTHROUGH", addr), + "The list of tokens.", + 2*time.Minute) +} + +const pollInterval = 200 * time.Millisecond + +func waitForServer(t *testing.T, url, match string, timeout time.Duration) { + // "health check" duplicated from x/tools/cmd/tipgodoc/tip.go + deadline := time.Now().Add(timeout) + for time.Now().Before(deadline) { + time.Sleep(pollInterval) + res, err := http.Get(url) + if err != nil { + continue + } + rbody, err := ioutil.ReadAll(res.Body) + res.Body.Close() + if err == nil && res.StatusCode == http.StatusOK && + bytes.Contains(rbody, []byte(match)) { + return + } + } + t.Fatalf("Server failed to respond in %v", timeout) +} + +func killAndWait(cmd *exec.Cmd) { + cmd.Process.Kill() + cmd.Wait() +} + +// Basic integration test for godoc HTTP interface. +func TestWeb(t *testing.T) { + testWeb(t, false) +} + +// Basic integration test for godoc HTTP interface. +func TestWebIndex(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in -short mode") + } + testWeb(t, true) +} + +// Basic integration test for godoc HTTP interface. +func testWeb(t *testing.T, withIndex bool) { + bin, cleanup := buildGodoc(t) + defer cleanup() + addr := serverAddress(t) + args := []string{fmt.Sprintf("-http=%s", addr)} + if withIndex { + args = append(args, "-index", "-index_interval=-1s") + } + cmd := exec.Command(bin, args...) + cmd.Stdout = os.Stderr + cmd.Stderr = os.Stderr + cmd.Args[0] = "godoc" + cmd.Env = godocEnv() + if err := cmd.Start(); err != nil { + t.Fatalf("failed to start godoc: %s", err) + } + defer killAndWait(cmd) + + if withIndex { + waitForSearchReady(t, addr) + } else { + waitForServerReady(t, addr) + } + + tests := []struct { + path string + match []string + dontmatch []string + needIndex bool + }{ + { + path: "/", + match: []string{"Go is an open source programming language"}, + }, + { + path: "/pkg/fmt/", + match: []string{"Package fmt implements formatted I/O"}, + }, + { + path: "/src/fmt/", + match: []string{"scan_test.go"}, + }, + { + path: "/src/fmt/print.go", + match: []string{"// Println formats using"}, + }, + { + path: "/pkg", + match: []string{ + "Standard library", + "Package fmt implements formatted I/O", + }, + dontmatch: []string{ + "internal/syscall", + "cmd/gc", + }, + }, + { + path: "/pkg/?m=all", + match: []string{ + "Standard library", + "Package fmt implements formatted I/O", + "internal/syscall", + }, + dontmatch: []string{ + "cmd/gc", + }, + }, + { + path: "/search?q=notwithstanding", + match: []string{ + "/src", + }, + dontmatch: []string{ + "/pkg/bootstrap", + }, + needIndex: true, + }, + { + path: "/pkg/strings/", + match: []string{ + `href="/src/strings/strings.go"`, + }, + }, + { + path: "/cmd/compile/internal/amd64/", + match: []string{ + `href="/src/cmd/compile/internal/amd64/reg.go"`, + }, + }, + } + for _, test := range tests { + if test.needIndex && !withIndex { + continue + } + url := fmt.Sprintf("http://%s%s", addr, test.path) + resp, err := http.Get(url) + if err != nil { + t.Errorf("GET %s failed: %s", url, err) + continue + } + body, err := ioutil.ReadAll(resp.Body) + resp.Body.Close() + if err != nil { + t.Errorf("GET %s: failed to read body: %s (response: %v)", url, err, resp) + } + isErr := false + for _, substr := range test.match { + if !bytes.Contains(body, []byte(substr)) { + t.Errorf("GET %s: wanted substring %q in body", url, substr) + isErr = true + } + } + for _, substr := range test.dontmatch { + if bytes.Contains(body, []byte(substr)) { + t.Errorf("GET %s: didn't want substring %q in body", url, substr) + isErr = true + } + } + if isErr { + t.Errorf("GET %s: got:\n%s", url, body) + } + } +} + +// Basic integration test for godoc -analysis=type (via HTTP interface). +func TestTypeAnalysis(t *testing.T) { + if runtime.GOOS == "plan9" { + t.Skip("skipping test on plan9 (issue #11974)") // see comment re: Plan 9 below + } + + // Write a fake GOROOT/GOPATH. + tmpdir, err := ioutil.TempDir("", "godoc-analysis") + if err != nil { + t.Fatalf("ioutil.TempDir failed: %s", err) + } + defer os.RemoveAll(tmpdir) + for _, f := range []struct{ file, content string }{ + {"goroot/src/lib/lib.go", ` +package lib +type T struct{} +const C = 3 +var V T +func (T) F() int { return C } +`}, + {"gopath/src/app/main.go", ` +package main +import "lib" +func main() { print(lib.V) } +`}, + } { + file := filepath.Join(tmpdir, f.file) + if err := os.MkdirAll(filepath.Dir(file), 0755); err != nil { + t.Fatalf("MkdirAll(%s) failed: %s", filepath.Dir(file), err) + } + if err := ioutil.WriteFile(file, []byte(f.content), 0644); err != nil { + t.Fatal(err) + } + } + + // Start the server. + bin, cleanup := buildGodoc(t) + defer cleanup() + addr := serverAddress(t) + cmd := exec.Command(bin, fmt.Sprintf("-http=%s", addr), "-analysis=type") + cmd.Env = append(cmd.Env, fmt.Sprintf("GOROOT=%s", filepath.Join(tmpdir, "goroot"))) + cmd.Env = append(cmd.Env, fmt.Sprintf("GOPATH=%s", filepath.Join(tmpdir, "gopath"))) + for _, e := range os.Environ() { + if strings.HasPrefix(e, "GOROOT=") || strings.HasPrefix(e, "GOPATH=") { + continue + } + cmd.Env = append(cmd.Env, e) + } + cmd.Stdout = os.Stderr + stderr, err := cmd.StderrPipe() + if err != nil { + t.Fatal(err) + } + cmd.Args[0] = "godoc" + if err := cmd.Start(); err != nil { + t.Fatalf("failed to start godoc: %s", err) + } + defer killAndWait(cmd) + waitForServerReady(t, addr) + + // Wait for type analysis to complete. + reader := bufio.NewReader(stderr) + for { + s, err := reader.ReadString('\n') // on Plan 9 this fails + if err != nil { + t.Fatal(err) + } + fmt.Fprint(os.Stderr, s) + if strings.Contains(s, "Type analysis complete.") { + break + } + } + go io.Copy(os.Stderr, reader) + + t0 := time.Now() + + // Make an HTTP request and check for a regular expression match. + // The patterns are very crude checks that basic type information + // has been annotated onto the source view. +tryagain: + for _, test := range []struct{ url, pattern string }{ + {"/src/lib/lib.go", "L2.*package .*Package docs for lib.*/lib"}, + {"/src/lib/lib.go", "L3.*type .*type info for T.*struct"}, + {"/src/lib/lib.go", "L5.*var V .*type T struct"}, + {"/src/lib/lib.go", "L6.*func .*type T struct.*T.*return .*const C untyped int.*C"}, + + {"/src/app/main.go", "L2.*package .*Package docs for app"}, + {"/src/app/main.go", "L3.*import .*Package docs for lib.*lib"}, + {"/src/app/main.go", "L4.*func main.*package lib.*lib.*var lib.V lib.T.*V"}, + } { + url := fmt.Sprintf("http://%s%s", addr, test.url) + resp, err := http.Get(url) + if err != nil { + t.Errorf("GET %s failed: %s", url, err) + continue + } + body, err := ioutil.ReadAll(resp.Body) + resp.Body.Close() + if err != nil { + t.Errorf("GET %s: failed to read body: %s (response: %v)", url, err, resp) + continue + } + + if !bytes.Contains(body, []byte("Static analysis features")) { + // Type analysis results usually become available within + // ~4ms after godoc startup (for this input on my machine). + if elapsed := time.Since(t0); elapsed > 500*time.Millisecond { + t.Fatalf("type analysis results still unavailable after %s", elapsed) + } + time.Sleep(10 * time.Millisecond) + goto tryagain + } + + match, err := regexp.Match(test.pattern, body) + if err != nil { + t.Errorf("regexp.Match(%q) failed: %s", test.pattern, err) + continue + } + if !match { + // This is a really ugly failure message. + t.Errorf("GET %s: body doesn't match %q, got:\n%s", + url, test.pattern, string(body)) + } + } +} + +// godocEnv returns the process environment without the GOPATH variable. +// (We don't want the indexer looking at the local workspace during tests.) +func godocEnv() (env []string) { + for _, v := range os.Environ() { + if strings.HasPrefix(v, "GOPATH=") { + continue + } + env = append(env, v) + } + return +} diff --git a/vendor/golang.org/x/tools/cmd/godoc/handlers.go b/vendor/golang.org/x/tools/cmd/godoc/handlers.go new file mode 100644 index 0000000000..dda1bb87b2 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godoc/handlers.go @@ -0,0 +1,146 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// The /doc/codewalk/ tree is synthesized from codewalk descriptions, +// files named $GOROOT/doc/codewalk/*.xml. +// For an example and a description of the format, see +// http://golang.org/doc/codewalk/codewalk or run godoc -http=:6060 +// and see http://localhost:6060/doc/codewalk/codewalk . +// That page is itself a codewalk; the source code for it is +// $GOROOT/doc/codewalk/codewalk.xml. + +package main + +import ( + "encoding/json" + "go/format" + "log" + "net/http" + "strings" + "text/template" + + "golang.org/x/tools/godoc" + "golang.org/x/tools/godoc/redirect" + "golang.org/x/tools/godoc/vfs" +) + +var ( + pres *godoc.Presentation + fs = vfs.NameSpace{} +) + +var enforceHosts = false // set true in production on app engine + +// hostEnforcerHandler redirects requests to "http://foo.golang.org/bar" +// to "https://golang.org/bar". +// It permits requests to the host "godoc-test.golang.org" for testing. +type hostEnforcerHandler struct { + h http.Handler +} + +func (h hostEnforcerHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if !enforceHosts { + h.h.ServeHTTP(w, r) + return + } + if r.TLS == nil || !h.validHost(r.Host) { + r.URL.Scheme = "https" + if h.validHost(r.Host) { + r.URL.Host = r.Host + } else { + r.URL.Host = "golang.org" + } + http.Redirect(w, r, r.URL.String(), http.StatusFound) + return + } + h.h.ServeHTTP(w, r) +} + +func (h hostEnforcerHandler) validHost(host string) bool { + switch strings.ToLower(host) { + case "golang.org", "godoc-test.golang.org": + return true + } + return false +} + +func registerHandlers(pres *godoc.Presentation) *http.ServeMux { + if pres == nil { + panic("nil Presentation") + } + mux := http.NewServeMux() + mux.HandleFunc("/doc/codewalk/", codewalk) + mux.Handle("/doc/play/", pres.FileServer()) + mux.Handle("/robots.txt", pres.FileServer()) + mux.Handle("/", pres) + mux.Handle("/pkg/C/", redirect.Handler("/cmd/cgo/")) + mux.HandleFunc("/fmt", fmtHandler) + redirect.Register(mux) + + http.Handle("/", hostEnforcerHandler{mux}) + + return mux +} + +func readTemplate(name string) *template.Template { + if pres == nil { + panic("no global Presentation set yet") + } + path := "lib/godoc/" + name + + // use underlying file system fs to read the template file + // (cannot use template ParseFile functions directly) + data, err := vfs.ReadFile(fs, path) + if err != nil { + log.Fatal("readTemplate: ", err) + } + // be explicit with errors (for app engine use) + t, err := template.New(name).Funcs(pres.FuncMap()).Parse(string(data)) + if err != nil { + log.Fatal("readTemplate: ", err) + } + return t +} + +func readTemplates(p *godoc.Presentation, html bool) { + p.PackageText = readTemplate("package.txt") + p.SearchText = readTemplate("search.txt") + + if html || p.HTMLMode { + codewalkHTML = readTemplate("codewalk.html") + codewalkdirHTML = readTemplate("codewalkdir.html") + p.CallGraphHTML = readTemplate("callgraph.html") + p.DirlistHTML = readTemplate("dirlist.html") + p.ErrorHTML = readTemplate("error.html") + p.ExampleHTML = readTemplate("example.html") + p.GodocHTML = readTemplate("godoc.html") + p.ImplementsHTML = readTemplate("implements.html") + p.MethodSetHTML = readTemplate("methodset.html") + p.PackageHTML = readTemplate("package.html") + p.SearchHTML = readTemplate("search.html") + p.SearchDocHTML = readTemplate("searchdoc.html") + p.SearchCodeHTML = readTemplate("searchcode.html") + p.SearchTxtHTML = readTemplate("searchtxt.html") + p.SearchDescXML = readTemplate("opensearch.xml") + } +} + +type fmtResponse struct { + Body string + Error string +} + +// fmtHandler takes a Go program in its "body" form value, formats it with +// standard gofmt formatting, and writes a fmtResponse as a JSON object. +func fmtHandler(w http.ResponseWriter, r *http.Request) { + resp := new(fmtResponse) + body, err := format.Source([]byte(r.FormValue("body"))) + if err != nil { + resp.Error = err.Error() + } else { + resp.Body = string(body) + } + w.Header().Set("Content-type", "application/json; charset=utf-8") + json.NewEncoder(w).Encode(resp) +} diff --git a/vendor/golang.org/x/tools/cmd/godoc/index.go b/vendor/golang.org/x/tools/cmd/godoc/index.go new file mode 100644 index 0000000000..f84b29a29d --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godoc/index.go @@ -0,0 +1,11 @@ +// 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 main + +import "strings" + +func indexDirectoryDefault(dir string) bool { + return dir != "/pkg" && !strings.HasPrefix(dir, "/pkg/") +} diff --git a/vendor/golang.org/x/tools/cmd/godoc/main.go b/vendor/golang.org/x/tools/cmd/godoc/main.go new file mode 100644 index 0000000000..3496013c15 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godoc/main.go @@ -0,0 +1,329 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// godoc: Go Documentation Server + +// Web server tree: +// +// http://godoc/ main landing page +// http://godoc/doc/ serve from $GOROOT/doc - spec, mem, etc. +// http://godoc/src/ serve files from $GOROOT/src; .go gets pretty-printed +// http://godoc/cmd/ serve documentation about commands +// http://godoc/pkg/ serve documentation about packages +// (idea is if you say import "compress/zlib", you go to +// http://godoc/pkg/compress/zlib) +// +// Command-line interface: +// +// godoc packagepath [name ...] +// +// godoc compress/zlib +// - prints doc for package compress/zlib +// godoc crypto/block Cipher NewCMAC +// - prints doc for Cipher and NewCMAC in package crypto/block + +// +build !appengine + +package main + +import ( + "archive/zip" + _ "expvar" // to serve /debug/vars + "flag" + "fmt" + "go/build" + "log" + "net/http" + "net/http/httptest" + _ "net/http/pprof" // to serve /debug/pprof/* + "net/url" + "os" + "path/filepath" + "regexp" + "runtime" + "strings" + + "golang.org/x/tools/godoc" + "golang.org/x/tools/godoc/analysis" + "golang.org/x/tools/godoc/static" + "golang.org/x/tools/godoc/vfs" + "golang.org/x/tools/godoc/vfs/gatefs" + "golang.org/x/tools/godoc/vfs/mapfs" + "golang.org/x/tools/godoc/vfs/zipfs" +) + +const ( + defaultAddr = ":6060" // default webserver address + toolsPath = "golang.org/x/tools/cmd/" +) + +var ( + // file system to serve + // (with e.g.: zip -r go.zip $GOROOT -i \*.go -i \*.html -i \*.css -i \*.js -i \*.txt -i \*.c -i \*.h -i \*.s -i \*.png -i \*.jpg -i \*.sh -i favicon.ico) + zipfile = flag.String("zip", "", "zip file providing the file system to serve; disabled if empty") + + // file-based index + writeIndex = flag.Bool("write_index", false, "write index to a file; the file name must be specified with -index_files") + + analysisFlag = flag.String("analysis", "", `comma-separated list of analyses to perform (supported: type, pointer). See http://golang.org/lib/godoc/analysis/help.html`) + + // network + httpAddr = flag.String("http", "", "HTTP service address (e.g., '"+defaultAddr+"')") + serverAddr = flag.String("server", "", "webserver address for command line searches") + + // layout control + html = flag.Bool("html", false, "print HTML in command-line mode") + srcMode = flag.Bool("src", false, "print (exported) source in command-line mode") + urlFlag = flag.String("url", "", "print HTML for named URL") + + // command-line searches + query = flag.Bool("q", false, "arguments are considered search queries") + + verbose = flag.Bool("v", false, "verbose mode") + + // file system roots + // TODO(gri) consider the invariant that goroot always end in '/' + goroot = flag.String("goroot", runtime.GOROOT(), "Go root directory") + + // layout control + tabWidth = flag.Int("tabwidth", 4, "tab width") + showTimestamps = flag.Bool("timestamps", false, "show timestamps with directory listings") + templateDir = flag.String("templates", "", "directory containing alternate template files") + showPlayground = flag.Bool("play", false, "enable playground in web interface") + showExamples = flag.Bool("ex", false, "show examples in command line mode") + declLinks = flag.Bool("links", true, "link identifiers to their declarations") + + // search index + indexEnabled = flag.Bool("index", false, "enable search index") + indexFiles = flag.String("index_files", "", "glob pattern specifying index files; if not empty, the index is read from these files in sorted order") + indexInterval = flag.Duration("index_interval", 0, "interval of indexing; 0 for default (5m), negative to only index once at startup") + maxResults = flag.Int("maxresults", 10000, "maximum number of full text search results shown") + indexThrottle = flag.Float64("index_throttle", 0.75, "index throttle value; 0.0 = no time allocated, 1.0 = full throttle") + + // source code notes + notesRx = flag.String("notes", "BUG", "regular expression matching note markers to show") +) + +func usage() { + fmt.Fprintf(os.Stderr, + "usage: godoc package [name ...]\n"+ + " godoc -http="+defaultAddr+"\n") + flag.PrintDefaults() + os.Exit(2) +} + +func loggingHandler(h http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + log.Printf("%s\t%s", req.RemoteAddr, req.URL) + h.ServeHTTP(w, req) + }) +} + +func handleURLFlag() { + // Try up to 10 fetches, following redirects. + urlstr := *urlFlag + for i := 0; i < 10; i++ { + // Prepare request. + u, err := url.Parse(urlstr) + if err != nil { + log.Fatal(err) + } + req := &http.Request{ + URL: u, + } + + // Invoke default HTTP handler to serve request + // to our buffering httpWriter. + w := httptest.NewRecorder() + http.DefaultServeMux.ServeHTTP(w, req) + + // Return data, error, or follow redirect. + switch w.Code { + case 200: // ok + os.Stdout.Write(w.Body.Bytes()) + return + case 301, 302, 303, 307: // redirect + redirect := w.HeaderMap.Get("Location") + if redirect == "" { + log.Fatalf("HTTP %d without Location header", w.Code) + } + urlstr = redirect + default: + log.Fatalf("HTTP error %d", w.Code) + } + } + log.Fatalf("too many redirects") +} + +func main() { + flag.Usage = usage + flag.Parse() + + playEnabled = *showPlayground + + // Check usage: either server and no args, command line and args, or index creation mode + if (*httpAddr != "" || *urlFlag != "") != (flag.NArg() == 0) && !*writeIndex { + usage() + } + + var fsGate chan bool + fsGate = make(chan bool, 20) + + // Determine file system to use. + if *zipfile == "" { + // use file system of underlying OS + rootfs := gatefs.New(vfs.OS(*goroot), fsGate) + fs.Bind("/", rootfs, "/", vfs.BindReplace) + } else { + // use file system specified via .zip file (path separator must be '/') + rc, err := zip.OpenReader(*zipfile) + if err != nil { + log.Fatalf("%s: %s\n", *zipfile, err) + } + defer rc.Close() // be nice (e.g., -writeIndex mode) + fs.Bind("/", zipfs.New(rc, *zipfile), *goroot, vfs.BindReplace) + } + if *templateDir != "" { + fs.Bind("/lib/godoc", vfs.OS(*templateDir), "/", vfs.BindBefore) + } else { + fs.Bind("/lib/godoc", mapfs.New(static.Files), "/", vfs.BindReplace) + } + + // Bind $GOPATH trees into Go root. + for _, p := range filepath.SplitList(build.Default.GOPATH) { + fs.Bind("/src", gatefs.New(vfs.OS(p), fsGate), "/src", vfs.BindAfter) + } + + httpMode := *httpAddr != "" + + var typeAnalysis, pointerAnalysis bool + if *analysisFlag != "" { + for _, a := range strings.Split(*analysisFlag, ",") { + switch a { + case "type": + typeAnalysis = true + case "pointer": + pointerAnalysis = true + default: + log.Fatalf("unknown analysis: %s", a) + } + } + } + + corpus := godoc.NewCorpus(fs) + corpus.Verbose = *verbose + corpus.MaxResults = *maxResults + corpus.IndexEnabled = *indexEnabled && httpMode + if *maxResults == 0 { + corpus.IndexFullText = false + } + corpus.IndexFiles = *indexFiles + corpus.IndexDirectory = indexDirectoryDefault + corpus.IndexThrottle = *indexThrottle + corpus.IndexInterval = *indexInterval + if *writeIndex { + corpus.IndexThrottle = 1.0 + corpus.IndexEnabled = true + } + if *writeIndex || httpMode || *urlFlag != "" { + if err := corpus.Init(); err != nil { + log.Fatal(err) + } + } + + pres = godoc.NewPresentation(corpus) + pres.TabWidth = *tabWidth + pres.ShowTimestamps = *showTimestamps + pres.ShowPlayground = *showPlayground + pres.ShowExamples = *showExamples + pres.DeclLinks = *declLinks + pres.SrcMode = *srcMode + pres.HTMLMode = *html + if *notesRx != "" { + pres.NotesRx = regexp.MustCompile(*notesRx) + } + + readTemplates(pres, httpMode || *urlFlag != "") + registerHandlers(pres) + + if *writeIndex { + // Write search index and exit. + if *indexFiles == "" { + log.Fatal("no index file specified") + } + + log.Println("initialize file systems") + *verbose = true // want to see what happens + + corpus.UpdateIndex() + + log.Println("writing index file", *indexFiles) + f, err := os.Create(*indexFiles) + if err != nil { + log.Fatal(err) + } + index, _ := corpus.CurrentIndex() + _, err = index.WriteTo(f) + if err != nil { + log.Fatal(err) + } + + log.Println("done") + return + } + + // Print content that would be served at the URL *urlFlag. + if *urlFlag != "" { + handleURLFlag() + return + } + + if httpMode { + // HTTP server mode. + var handler http.Handler = http.DefaultServeMux + if *verbose { + log.Printf("Go Documentation Server") + log.Printf("version = %s", runtime.Version()) + log.Printf("address = %s", *httpAddr) + log.Printf("goroot = %s", *goroot) + log.Printf("tabwidth = %d", *tabWidth) + switch { + case !*indexEnabled: + log.Print("search index disabled") + case *maxResults > 0: + log.Printf("full text index enabled (maxresults = %d)", *maxResults) + default: + log.Print("identifier search index enabled") + } + fs.Fprint(os.Stderr) + handler = loggingHandler(handler) + } + + // Initialize search index. + if *indexEnabled { + go corpus.RunIndexer() + } + + // Start type/pointer analysis. + if typeAnalysis || pointerAnalysis { + go analysis.Run(pointerAnalysis, &corpus.Analysis) + } + + // Start http server. + if err := http.ListenAndServe(*httpAddr, handler); err != nil { + log.Fatalf("ListenAndServe %s: %v", *httpAddr, err) + } + + return + } + + if *query { + handleRemoteSearch() + return + } + + if err := godoc.CommandLine(os.Stdout, fs, pres, flag.Args()); err != nil { + log.Print(err) + } +} diff --git a/vendor/golang.org/x/tools/cmd/godoc/play.go b/vendor/golang.org/x/tools/cmd/godoc/play.go new file mode 100644 index 0000000000..02f477d3bb --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godoc/play.go @@ -0,0 +1,11 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !appengine + +package main + +// This package registers "/compile" and "/share" handlers +// that redirect to the golang.org playground. +import _ "golang.org/x/tools/playground" diff --git a/vendor/golang.org/x/tools/cmd/godoc/remotesearch.go b/vendor/golang.org/x/tools/cmd/godoc/remotesearch.go new file mode 100644 index 0000000000..f01d5c7acf --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godoc/remotesearch.go @@ -0,0 +1,72 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !appengine + +package main + +import ( + "errors" + "flag" + "io" + "log" + "net/http" + "net/url" + "os" +) + +func handleRemoteSearch() { + // Command-line queries. + for i := 0; i < flag.NArg(); i++ { + res, err := remoteSearch(flag.Arg(i)) + if err != nil { + log.Fatalf("remoteSearch: %s", err) + } + io.Copy(os.Stdout, res.Body) + } + return +} + +// remoteSearchURL returns the search URL for a given query as needed by +// remoteSearch. If html is set, an html result is requested; otherwise +// the result is in textual form. +// Adjust this function as necessary if modeNames or FormValue parameters +// change. +func remoteSearchURL(query string, html bool) string { + s := "/search?m=text&q=" + if html { + s = "/search?q=" + } + return s + url.QueryEscape(query) +} + +func remoteSearch(query string) (res *http.Response, err error) { + // list of addresses to try + var addrs []string + if *serverAddr != "" { + // explicit server address - only try this one + addrs = []string{*serverAddr} + } else { + addrs = []string{ + defaultAddr, + "golang.org", + } + } + + // remote search + search := remoteSearchURL(query, *html) + for _, addr := range addrs { + url := "http://" + addr + search + res, err = http.Get(url) + if err == nil && res.StatusCode == http.StatusOK { + break + } + } + + if err == nil && res.StatusCode != http.StatusOK { + err = errors.New(res.Status) + } + + return +} diff --git a/vendor/golang.org/x/tools/cmd/godoc/setup-godoc-app.bash b/vendor/golang.org/x/tools/cmd/godoc/setup-godoc-app.bash new file mode 100755 index 0000000000..a462ebe0c2 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godoc/setup-godoc-app.bash @@ -0,0 +1,134 @@ +#!/usr/bin/env bash + +# Copyright 2011 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# This script creates a complete godoc app in $APPDIR. +# It copies the cmd/godoc and src/go/... sources from GOROOT, +# synthesizes an app.yaml file, and creates the .zip, index, and +# configuration files. +# +# If an argument is provided it is assumed to be the app-engine godoc directory. +# Without an argument, $APPDIR is used instead. If GOROOT is not set, "go env" +# is consulted to find the $GOROOT. +# +# The script creates a .zip file representing the $GOROOT file system +# and computes the correspondig search index files. These files are then +# copied to $APPDIR. A corresponding godoc configuration file is created +# in $APPDIR/appconfig.go. + +ZIPFILE=godoc.zip +INDEXFILE=godoc.index +SPLITFILES=index.split. +GODOC=golang.org/x/tools/cmd/godoc +CONFIGFILE=$GODOC/appconfig.go + +error() { + echo "error: $1" + exit 2 +} + +getArgs() { + if [ -z $APPENGINE_SDK ]; then + error "APPENGINE_SDK environment variable not set" + fi + if [ ! -x $APPENGINE_SDK/goapp ]; then + error "couldn't find goapp command in $APPENGINE_SDK" + fi + if [ -z $GOROOT ]; then + GOROOT=$(go env GOROOT) + echo "GOROOT not set explicitly, using go env value instead" + fi + if [ -z $APPDIR ]; then + if [ $# == 0 ]; then + error "APPDIR not set, and no argument provided" + fi + APPDIR=$1 + echo "APPDIR not set, using argument instead" + fi + + # safety checks + if [ ! -d $GOROOT ]; then + error "$GOROOT is not a directory" + fi + if [ -e $APPDIR ]; then + error "$APPDIR exists; check and remove it before trying again" + fi + + # reporting + echo "GOROOT = $GOROOT" + echo "APPDIR = $APPDIR" +} + +fetchGodoc() { + echo "*** Fetching godoc (if not already in GOPATH)" + unset GOBIN + go=$APPENGINE_SDK/goapp + $go get -d -tags appengine $GODOC + mkdir -p $APPDIR/$GODOC + cp $(find $($go list -f '{{.Dir}}' $GODOC) -mindepth 1 -maxdepth 1 -type f) $APPDIR/$GODOC/ +} + +makeAppYaml() { + echo "*** make $APPDIR/app.yaml" + cat > $APPDIR/app.yaml <<EOF +application: godoc +version: 1 +runtime: go +api_version: go1.4beta + +handlers: +- url: /.* + script: _go_app +EOF +} + +makeZipfile() { + echo "*** make $APPDIR/$ZIPFILE" + zip -q -r $APPDIR/$ZIPFILE $GOROOT/* +} + +makeIndexfile() { + echo "*** make $APPDIR/$INDEXFILE" + GOPATH= godoc -write_index -index_files=$APPDIR/$INDEXFILE -zip=$APPDIR/$ZIPFILE +} + +splitIndexfile() { + echo "*** split $APPDIR/$INDEXFILE" + split -b8m $APPDIR/$INDEXFILE $APPDIR/$SPLITFILES +} + +makeConfigfile() { + echo "*** make $APPDIR/$CONFIGFILE" + cat > $APPDIR/$CONFIGFILE <<EOF +package main + +// GENERATED FILE - DO NOT MODIFY BY HAND. +// (generated by golang.org/x/tools/cmd/godoc/setup-godoc-app.bash) + +const ( + // .zip filename + zipFilename = "$ZIPFILE" + + // goroot directory in .zip file + zipGoroot = "$GOROOT" + + // glob pattern describing search index files + // (if empty, the index is built at run-time) + indexFilenames = "$SPLITFILES*" +) +EOF +} + +getArgs "$@" +set -e +mkdir $APPDIR +fetchGodoc +makeAppYaml +makeZipfile +makeIndexfile +splitIndexfile +makeConfigfile + +echo "*** setup complete" diff --git a/vendor/golang.org/x/tools/cmd/godoc/x.go b/vendor/golang.org/x/tools/cmd/godoc/x.go new file mode 100644 index 0000000000..d6ee745f45 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/godoc/x.go @@ -0,0 +1,89 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains the handlers that serve go-import redirects for Go +// sub-repositories. It specifies the mapping from import paths like +// "golang.org/x/tools" to the actual repository locations. + +package main + +import ( + "html/template" + "log" + "net/http" + "strings" +) + +const xPrefix = "/x/" + +type xRepo struct { + URL, VCS string +} + +var xMap = map[string]xRepo{ + "codereview": {"https://code.google.com/p/go.codereview", "hg"}, + + "arch": {"https://go.googlesource.com/arch", "git"}, + "benchmarks": {"https://go.googlesource.com/benchmarks", "git"}, + "blog": {"https://go.googlesource.com/blog", "git"}, + "build": {"https://go.googlesource.com/build", "git"}, + "crypto": {"https://go.googlesource.com/crypto", "git"}, + "debug": {"https://go.googlesource.com/debug", "git"}, + "exp": {"https://go.googlesource.com/exp", "git"}, + "image": {"https://go.googlesource.com/image", "git"}, + "mobile": {"https://go.googlesource.com/mobile", "git"}, + "net": {"https://go.googlesource.com/net", "git"}, + "oauth2": {"https://go.googlesource.com/oauth2", "git"}, + "playground": {"https://go.googlesource.com/playground", "git"}, + "review": {"https://go.googlesource.com/review", "git"}, + "sync": {"https://go.googlesource.com/sync", "git"}, + "sys": {"https://go.googlesource.com/sys", "git"}, + "talks": {"https://go.googlesource.com/talks", "git"}, + "term": {"https://go.googlesource.com/term", "git"}, + "text": {"https://go.googlesource.com/text", "git"}, + "time": {"https://go.googlesource.com/time", "git"}, + "tools": {"https://go.googlesource.com/tools", "git"}, + "tour": {"https://go.googlesource.com/tour", "git"}, +} + +func init() { + http.HandleFunc(xPrefix, xHandler) +} + +func xHandler(w http.ResponseWriter, r *http.Request) { + head, tail := strings.TrimPrefix(r.URL.Path, xPrefix), "" + if i := strings.Index(head, "/"); i != -1 { + head, tail = head[:i], head[i:] + } + if head == "" { + http.Redirect(w, r, "https://godoc.org/-/subrepo", http.StatusTemporaryRedirect) + return + } + repo, ok := xMap[head] + if !ok { + http.NotFound(w, r) + return + } + data := struct { + Prefix, Head, Tail string + Repo xRepo + }{xPrefix, head, tail, repo} + if err := xTemplate.Execute(w, data); err != nil { + log.Println("xHandler:", err) + } +} + +var xTemplate = template.Must(template.New("x").Parse(`<!DOCTYPE html> +<html> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> +<meta name="go-import" content="golang.org{{.Prefix}}{{.Head}} {{.Repo.VCS}} {{.Repo.URL}}"> +<meta name="go-source" content="golang.org{{.Prefix}}{{.Head}} https://github.com/golang/{{.Head}}/ https://github.com/golang/{{.Head}}/tree/master{/dir} https://github.com/golang/{{.Head}}/blob/master{/dir}/{file}#L{line}"> +<meta http-equiv="refresh" content="0; url=https://godoc.org/golang.org{{.Prefix}}{{.Head}}{{.Tail}}"> +</head> +<body> +Nothing to see here; <a href="https://godoc.org/golang.org{{.Prefix}}{{.Head}}{{.Tail}}">move along</a>. +</body> +</html> +`)) diff --git a/vendor/golang.org/x/tools/cmd/goimports/doc.go b/vendor/golang.org/x/tools/cmd/goimports/doc.go new file mode 100644 index 0000000000..46b2b07dfa --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/goimports/doc.go @@ -0,0 +1,33 @@ +/* + +Command goimports updates your Go import lines, +adding missing ones and removing unreferenced ones. + + $ go get golang.org/x/tools/cmd/goimports + +It's a drop-in replacement for your editor's gofmt-on-save hook. +It has the same command-line interface as gofmt and formats +your code in the same way. + +For emacs, make sure you have the latest go-mode.el: + https://github.com/dominikh/go-mode.el +Then in your .emacs file: + (setq gofmt-command "goimports") + (add-to-list 'load-path "/home/you/somewhere/emacs/") + (require 'go-mode-load) + (add-hook 'before-save-hook 'gofmt-before-save) + +For vim, set "gofmt_command" to "goimports": + https://golang.org/change/39c724dd7f252 + https://golang.org/wiki/IDEsAndTextEditorPlugins + etc + +For GoSublime, follow the steps described here: + http://michaelwhatcott.com/gosublime-goimports/ + +For other editors, you probably know what to do. + +Happy hacking! + +*/ +package main // import "golang.org/x/tools/cmd/goimports" diff --git a/vendor/golang.org/x/tools/cmd/goimports/goimports.go b/vendor/golang.org/x/tools/cmd/goimports/goimports.go new file mode 100644 index 0000000000..d7857d22f4 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/goimports/goimports.go @@ -0,0 +1,209 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "bytes" + "flag" + "fmt" + "go/scanner" + "io" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + + "golang.org/x/tools/imports" +) + +var ( + // main operation modes + list = flag.Bool("l", false, "list files whose formatting differs from goimport's") + write = flag.Bool("w", false, "write result to (source) file instead of stdout") + doDiff = flag.Bool("d", false, "display diffs instead of rewriting files") + srcdir = flag.String("srcdir", "", "choose imports as if source code is from `dir`") + + options = &imports.Options{ + TabWidth: 8, + TabIndent: true, + Comments: true, + Fragment: true, + } + exitCode = 0 +) + +func init() { + flag.BoolVar(&options.AllErrors, "e", false, "report all errors (not just the first 10 on different lines)") +} + +func report(err error) { + scanner.PrintError(os.Stderr, err) + exitCode = 2 +} + +func usage() { + fmt.Fprintf(os.Stderr, "usage: goimports [flags] [path ...]\n") + flag.PrintDefaults() + os.Exit(2) +} + +func isGoFile(f os.FileInfo) bool { + // ignore non-Go files + name := f.Name() + return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go") +} + +func processFile(filename string, in io.Reader, out io.Writer, stdin bool) error { + opt := options + if stdin { + nopt := *options + nopt.Fragment = true + opt = &nopt + } + + if in == nil { + f, err := os.Open(filename) + if err != nil { + return err + } + defer f.Close() + in = f + } + + src, err := ioutil.ReadAll(in) + if err != nil { + return err + } + + target := filename + if *srcdir != "" { + // Pretend that file is from *srcdir in order to decide + // visible imports correctly. + target = filepath.Join(*srcdir, filepath.Base(filename)) + } + + res, err := imports.Process(target, src, opt) + if err != nil { + return err + } + + if !bytes.Equal(src, res) { + // formatting has changed + if *list { + fmt.Fprintln(out, filename) + } + if *write { + err = ioutil.WriteFile(filename, res, 0) + if err != nil { + return err + } + } + if *doDiff { + data, err := diff(src, res) + if err != nil { + return fmt.Errorf("computing diff: %s", err) + } + fmt.Printf("diff %s gofmt/%s\n", filename, filename) + out.Write(data) + } + } + + if !*list && !*write && !*doDiff { + _, err = out.Write(res) + } + + return err +} + +func visitFile(path string, f os.FileInfo, err error) error { + if err == nil && isGoFile(f) { + err = processFile(path, nil, os.Stdout, false) + } + if err != nil { + report(err) + } + return nil +} + +func walkDir(path string) { + filepath.Walk(path, visitFile) +} + +func main() { + runtime.GOMAXPROCS(runtime.NumCPU()) + + // call gofmtMain in a separate function + // so that it can use defer and have them + // run before the exit. + gofmtMain() + os.Exit(exitCode) +} + +// parseFlags parses command line flags and returns the paths to process. +// It's a var so that custom implementations can replace it in other files. +var parseFlags = func() []string { + flag.Parse() + return flag.Args() +} + +func gofmtMain() { + flag.Usage = usage + paths := parseFlags() + + if options.TabWidth < 0 { + fmt.Fprintf(os.Stderr, "negative tabwidth %d\n", options.TabWidth) + exitCode = 2 + return + } + + if len(paths) == 0 { + if err := processFile("<standard input>", os.Stdin, os.Stdout, true); err != nil { + report(err) + } + return + } + + for _, path := range paths { + switch dir, err := os.Stat(path); { + case err != nil: + report(err) + case dir.IsDir(): + walkDir(path) + default: + if err := processFile(path, nil, os.Stdout, false); err != nil { + report(err) + } + } + } +} + +func diff(b1, b2 []byte) (data []byte, err error) { + f1, err := ioutil.TempFile("", "gofmt") + if err != nil { + return + } + defer os.Remove(f1.Name()) + defer f1.Close() + + f2, err := ioutil.TempFile("", "gofmt") + if err != nil { + return + } + defer os.Remove(f2.Name()) + defer f2.Close() + + f1.Write(b1) + f2.Write(b2) + + data, err = exec.Command("diff", "-u", f1.Name(), f2.Name()).CombinedOutput() + if len(data) > 0 { + // diff exits with a non-zero status when the files don't match. + // Ignore that failure as long as we get output. + err = nil + } + return +} diff --git a/vendor/golang.org/x/tools/cmd/gomvpkg/main.go b/vendor/golang.org/x/tools/cmd/gomvpkg/main.go new file mode 100644 index 0000000000..959b84ef5f --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/gomvpkg/main.go @@ -0,0 +1,94 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// licence that can be found in the LICENSE file. + +// The gomvpkg command moves go packages, updating import declarations. +// See the -help message or Usage constant for details. +package main + +import ( + "flag" + "fmt" + "go/build" + "os" + + "golang.org/x/tools/go/buildutil" + "golang.org/x/tools/refactor/rename" +) + +var ( + fromFlag = flag.String("from", "", "Import path of package to be moved") + toFlag = flag.String("to", "", "Destination import path for package") + vcsMvCmdFlag = flag.String("vcs_mv_cmd", "", `A template for the version control system's "move directory" command, e.g. "git mv {{.Src}} {{.Dst}}`) + helpFlag = flag.Bool("help", false, "show usage message") +) + +func init() { + flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc) +} + +const Usage = `gomvpkg: moves a package, updating import declarations + +Usage: + + gomvpkg -from <path> -to <path> [-vcs_mv_cmd <template>] + +Flags: + +-from specifies the import path of the package to be moved + +-to specifies the destination import path + +-vcs_mv_cmd specifies a shell command to inform the version control system of a + directory move. The argument is a template using the syntax of the + text/template package. It has two fields: Src and Dst, the absolute + paths of the directories. + + For example: "git mv {{.Src}} {{.Dst}}" + +gomvpkg determines the set of packages that might be affected, including all +packages importing the 'from' package and any of its subpackages. It will move +the 'from' package and all its subpackages to the destination path and update all +imports of those packages to point to its new import path. + +gomvpkg rejects moves in which a package already exists at the destination import +path, or in which a directory already exists at the location the package would be +moved to. + +gomvpkg will not always be able to rename imports when a package's name is changed. +Import statements may want further cleanup. + +gomvpkg's behavior is not defined if any of the packages to be moved are +imported using dot imports. + +Examples: + +% gomvpkg -from myproject/foo -to myproject/bar + + Move the package with import path "myproject/foo" to the new path + "myproject/bar". + +% gomvpkg -from myproject/foo -to myproject/bar -vcs_mv_cmd "git mv {{.Src}} {{.Dst}}" + + Move the package with import path "myproject/foo" to the new path + "myproject/bar" using "git mv" to execute the directory move. +` + +func main() { + flag.Parse() + + if len(flag.Args()) > 0 { + fmt.Fprintln(os.Stderr, "gomvpkg: surplus arguments.") + os.Exit(1) + } + + if *helpFlag || *fromFlag == "" || *toFlag == "" { + fmt.Println(Usage) + return + } + + if err := rename.Move(&build.Default, *fromFlag, *toFlag, *vcsMvCmdFlag); err != nil { + fmt.Fprintf(os.Stderr, "gomvpkg: %s.\n", err) + os.Exit(1) + } +} diff --git a/vendor/golang.org/x/tools/cmd/gorename/main.go b/vendor/golang.org/x/tools/cmd/gorename/main.go new file mode 100644 index 0000000000..b1b895cf1c --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/gorename/main.go @@ -0,0 +1,55 @@ +// The gorename command performs precise type-safe renaming of +// identifiers in Go source code. +// +// Run with -help for usage information, or view the Usage constant in +// package golang.org/x/tools/refactor/rename, which contains most of +// the implementation. +// +package main // import "golang.org/x/tools/cmd/gorename" + +import ( + "flag" + "fmt" + "go/build" + "log" + "os" + + "golang.org/x/tools/go/buildutil" + "golang.org/x/tools/refactor/rename" +) + +var ( + offsetFlag = flag.String("offset", "", "file and byte offset of identifier to be renamed, e.g. 'file.go:#123'. For use by editors.") + fromFlag = flag.String("from", "", "identifier to be renamed; see -help for formats") + toFlag = flag.String("to", "", "new name for identifier") + helpFlag = flag.Bool("help", false, "show usage message") +) + +func init() { + flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc) + flag.BoolVar(&rename.Force, "force", false, "proceed, even if conflicts were reported") + flag.BoolVar(&rename.Verbose, "v", false, "print verbose information") + flag.BoolVar(&rename.Diff, "d", false, "display diffs instead of rewriting files") + flag.StringVar(&rename.DiffCmd, "diffcmd", "diff", "diff command invoked when using -d") +} + +func main() { + log.SetPrefix("gorename: ") + log.SetFlags(0) + flag.Parse() + if len(flag.Args()) > 0 { + log.Fatal("surplus arguments") + } + + if *helpFlag || (*offsetFlag == "" && *fromFlag == "" && *toFlag == "") { + fmt.Println(rename.Usage) + return + } + + if err := rename.Main(&build.Default, *offsetFlag, *fromFlag, *toFlag); err != nil { + if err != rename.ConflictError { + log.Fatal(err) + } + os.Exit(1) + } +} diff --git a/vendor/golang.org/x/tools/cmd/gotype/doc.go b/vendor/golang.org/x/tools/cmd/gotype/doc.go new file mode 100644 index 0000000000..ea0b2b1f1b --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/gotype/doc.go @@ -0,0 +1,62 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +The gotype command does syntactic and semantic analysis of Go files +and packages like the front-end of a Go compiler. Errors are reported +if the analysis fails; otherwise gotype is quiet (unless -v is set). + +Without a list of paths, gotype reads from standard input, which +must provide a single Go source file defining a complete package. + +If a single path is specified that is a directory, gotype checks +the Go files in that directory; they must all belong to the same +package. + +Otherwise, each path must be the filename of Go file belonging to +the same package. + +Usage: + gotype [flags] [path...] + +The flags are: + -a + use all (incl. _test.go) files when processing a directory + -e + report all errors (not just the first 10) + -v + verbose mode + -gccgo + use gccimporter instead of gcimporter + +Debugging flags: + -seq + parse sequentially, rather than in parallel + -ast + print AST (forces -seq) + -trace + print parse trace (forces -seq) + -comments + parse comments (ignored unless -ast or -trace is provided) + +Examples: + +To check the files a.go, b.go, and c.go: + + gotype a.go b.go c.go + +To check an entire package in the directory dir and print the processed files: + + gotype -v dir + +To check an entire package including tests in the local directory: + + gotype -a . + +To verify the output of a pipe: + + echo "package foo" | gotype + +*/ +package main // import "golang.org/x/tools/cmd/gotype" diff --git a/vendor/golang.org/x/tools/cmd/gotype/gotype.go b/vendor/golang.org/x/tools/cmd/gotype/gotype.go new file mode 100644 index 0000000000..bd3721f1dd --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/gotype/gotype.go @@ -0,0 +1,259 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.5 + +package main + +import ( + "flag" + "fmt" + "go/ast" + "go/build" + "go/importer" + "go/parser" + "go/scanner" + "go/token" + "go/types" + "io/ioutil" + "os" + "path/filepath" + "time" +) + +var ( + // main operation modes + allFiles = flag.Bool("a", false, "use all (incl. _test.go) files when processing a directory") + allErrors = flag.Bool("e", false, "report all errors (not just the first 10)") + verbose = flag.Bool("v", false, "verbose mode") + gccgo = flag.Bool("gccgo", false, "use gccgoimporter instead of gcimporter") + + // debugging support + sequential = flag.Bool("seq", false, "parse sequentially, rather than in parallel") + printAST = flag.Bool("ast", false, "print AST (forces -seq)") + printTrace = flag.Bool("trace", false, "print parse trace (forces -seq)") + parseComments = flag.Bool("comments", false, "parse comments (ignored unless -ast or -trace is provided)") +) + +var ( + fset = token.NewFileSet() + errorCount = 0 + parserMode parser.Mode + sizes types.Sizes +) + +func initParserMode() { + if *allErrors { + parserMode |= parser.AllErrors + } + if *printTrace { + parserMode |= parser.Trace + } + if *parseComments && (*printAST || *printTrace) { + parserMode |= parser.ParseComments + } +} + +func initSizes() { + wordSize := 8 + maxAlign := 8 + switch build.Default.GOARCH { + case "386", "arm": + wordSize = 4 + maxAlign = 4 + // add more cases as needed + } + sizes = &types.StdSizes{WordSize: int64(wordSize), MaxAlign: int64(maxAlign)} +} + +func usage() { + fmt.Fprintln(os.Stderr, "usage: gotype [flags] [path ...]") + flag.PrintDefaults() + os.Exit(2) +} + +func report(err error) { + scanner.PrintError(os.Stderr, err) + if list, ok := err.(scanner.ErrorList); ok { + errorCount += len(list) + return + } + errorCount++ +} + +// parse may be called concurrently +func parse(filename string, src interface{}) (*ast.File, error) { + if *verbose { + fmt.Println(filename) + } + file, err := parser.ParseFile(fset, filename, src, parserMode) // ok to access fset concurrently + if *printAST { + ast.Print(fset, file) + } + return file, err +} + +func parseStdin() (*ast.File, error) { + src, err := ioutil.ReadAll(os.Stdin) + if err != nil { + return nil, err + } + return parse("<standard input>", src) +} + +func parseFiles(filenames []string) ([]*ast.File, error) { + files := make([]*ast.File, len(filenames)) + + if *sequential { + for i, filename := range filenames { + var err error + files[i], err = parse(filename, nil) + if err != nil { + return nil, err // leave unfinished goroutines hanging + } + } + } else { + type parseResult struct { + file *ast.File + err error + } + + out := make(chan parseResult) + for _, filename := range filenames { + go func(filename string) { + file, err := parse(filename, nil) + out <- parseResult{file, err} + }(filename) + } + + for i := range filenames { + res := <-out + if res.err != nil { + return nil, res.err // leave unfinished goroutines hanging + } + files[i] = res.file + } + } + + return files, nil +} + +func parseDir(dirname string) ([]*ast.File, error) { + ctxt := build.Default + pkginfo, err := ctxt.ImportDir(dirname, 0) + if _, nogo := err.(*build.NoGoError); err != nil && !nogo { + return nil, err + } + filenames := append(pkginfo.GoFiles, pkginfo.CgoFiles...) + if *allFiles { + filenames = append(filenames, pkginfo.TestGoFiles...) + } + + // complete file names + for i, filename := range filenames { + filenames[i] = filepath.Join(dirname, filename) + } + + return parseFiles(filenames) +} + +func getPkgFiles(args []string) ([]*ast.File, error) { + if len(args) == 0 { + // stdin + file, err := parseStdin() + if err != nil { + return nil, err + } + return []*ast.File{file}, nil + } + + if len(args) == 1 { + // possibly a directory + path := args[0] + info, err := os.Stat(path) + if err != nil { + return nil, err + } + if info.IsDir() { + return parseDir(path) + } + } + + // list of files + return parseFiles(args) +} + +func checkPkgFiles(files []*ast.File) { + compiler := "gc" + if *gccgo { + compiler = "gccgo" + } + type bailout struct{} + conf := types.Config{ + FakeImportC: true, + Error: func(err error) { + if !*allErrors && errorCount >= 10 { + panic(bailout{}) + } + report(err) + }, + Importer: importer.For(compiler, nil), + Sizes: sizes, + } + + defer func() { + switch p := recover().(type) { + case nil, bailout: + // normal return or early exit + default: + // re-panic + panic(p) + } + }() + + const path = "pkg" // any non-empty string will do for now + conf.Check(path, fset, files, nil) +} + +func printStats(d time.Duration) { + fileCount := 0 + lineCount := 0 + fset.Iterate(func(f *token.File) bool { + fileCount++ + lineCount += f.LineCount() + return true + }) + + fmt.Printf( + "%s (%d files, %d lines, %d lines/s)\n", + d, fileCount, lineCount, int64(float64(lineCount)/d.Seconds()), + ) +} + +func main() { + flag.Usage = usage + flag.Parse() + if *printAST || *printTrace { + *sequential = true + } + initParserMode() + initSizes() + + start := time.Now() + + files, err := getPkgFiles(flag.Args()) + if err != nil { + report(err) + os.Exit(2) + } + + checkPkgFiles(files) + if errorCount > 0 { + os.Exit(2) + } + + if *verbose { + printStats(time.Since(start)) + } +} diff --git a/vendor/golang.org/x/tools/cmd/gotype/gotype14.go b/vendor/golang.org/x/tools/cmd/gotype/gotype14.go new file mode 100644 index 0000000000..92d089e9e5 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/gotype/gotype14.go @@ -0,0 +1,268 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.5 + +// This is a 1:1 copy of gotype.go but for the changes required to build +// against Go1.4 and before. +// TODO(gri) Decide long-term fate of gotype (issue #12303). + +package main + +import ( + "flag" + "fmt" + "go/ast" + "go/build" + "go/parser" + "go/scanner" + "go/token" + "io/ioutil" + "os" + "path/filepath" + "runtime" + "time" + + "golang.org/x/tools/go/gccgoimporter" + _ "golang.org/x/tools/go/gcimporter" + "golang.org/x/tools/go/types" +) + +var ( + // main operation modes + allFiles = flag.Bool("a", false, "use all (incl. _test.go) files when processing a directory") + allErrors = flag.Bool("e", false, "report all errors (not just the first 10)") + verbose = flag.Bool("v", false, "verbose mode") + gccgo = flag.Bool("gccgo", false, "use gccgoimporter instead of gcimporter") + + // debugging support + sequential = flag.Bool("seq", false, "parse sequentially, rather than in parallel") + printAST = flag.Bool("ast", false, "print AST (forces -seq)") + printTrace = flag.Bool("trace", false, "print parse trace (forces -seq)") + parseComments = flag.Bool("comments", false, "parse comments (ignored unless -ast or -trace is provided)") +) + +var ( + fset = token.NewFileSet() + errorCount = 0 + parserMode parser.Mode + sizes types.Sizes +) + +func initParserMode() { + if *allErrors { + parserMode |= parser.AllErrors + } + if *printTrace { + parserMode |= parser.Trace + } + if *parseComments && (*printAST || *printTrace) { + parserMode |= parser.ParseComments + } +} + +func initSizes() { + wordSize := 8 + maxAlign := 8 + switch build.Default.GOARCH { + case "386", "arm": + wordSize = 4 + maxAlign = 4 + // add more cases as needed + } + sizes = &types.StdSizes{WordSize: int64(wordSize), MaxAlign: int64(maxAlign)} +} + +func usage() { + fmt.Fprintln(os.Stderr, "usage: gotype [flags] [path ...]") + flag.PrintDefaults() + os.Exit(2) +} + +func report(err error) { + scanner.PrintError(os.Stderr, err) + if list, ok := err.(scanner.ErrorList); ok { + errorCount += len(list) + return + } + errorCount++ +} + +// parse may be called concurrently +func parse(filename string, src interface{}) (*ast.File, error) { + if *verbose { + fmt.Println(filename) + } + file, err := parser.ParseFile(fset, filename, src, parserMode) // ok to access fset concurrently + if *printAST { + ast.Print(fset, file) + } + return file, err +} + +func parseStdin() (*ast.File, error) { + src, err := ioutil.ReadAll(os.Stdin) + if err != nil { + return nil, err + } + return parse("<standard input>", src) +} + +func parseFiles(filenames []string) ([]*ast.File, error) { + files := make([]*ast.File, len(filenames)) + + if *sequential { + for i, filename := range filenames { + var err error + files[i], err = parse(filename, nil) + if err != nil { + return nil, err // leave unfinished goroutines hanging + } + } + } else { + type parseResult struct { + file *ast.File + err error + } + + out := make(chan parseResult) + for _, filename := range filenames { + go func(filename string) { + file, err := parse(filename, nil) + out <- parseResult{file, err} + }(filename) + } + + for i := range filenames { + res := <-out + if res.err != nil { + return nil, res.err // leave unfinished goroutines hanging + } + files[i] = res.file + } + } + + return files, nil +} + +func parseDir(dirname string) ([]*ast.File, error) { + ctxt := build.Default + pkginfo, err := ctxt.ImportDir(dirname, 0) + if _, nogo := err.(*build.NoGoError); err != nil && !nogo { + return nil, err + } + filenames := append(pkginfo.GoFiles, pkginfo.CgoFiles...) + if *allFiles { + filenames = append(filenames, pkginfo.TestGoFiles...) + } + + // complete file names + for i, filename := range filenames { + filenames[i] = filepath.Join(dirname, filename) + } + + return parseFiles(filenames) +} + +func getPkgFiles(args []string) ([]*ast.File, error) { + if len(args) == 0 { + // stdin + file, err := parseStdin() + if err != nil { + return nil, err + } + return []*ast.File{file}, nil + } + + if len(args) == 1 { + // possibly a directory + path := args[0] + info, err := os.Stat(path) + if err != nil { + return nil, err + } + if info.IsDir() { + return parseDir(path) + } + } + + // list of files + return parseFiles(args) +} + +func checkPkgFiles(files []*ast.File) { + type bailout struct{} + conf := types.Config{ + FakeImportC: true, + Error: func(err error) { + if !*allErrors && errorCount >= 10 { + panic(bailout{}) + } + report(err) + }, + Sizes: sizes, + } + if *gccgo { + var inst gccgoimporter.GccgoInstallation + inst.InitFromDriver("gccgo") + conf.Import = inst.GetImporter(nil, nil) + } + + defer func() { + switch p := recover().(type) { + case nil, bailout: + // normal return or early exit + default: + // re-panic + panic(p) + } + }() + + const path = "pkg" // any non-empty string will do for now + conf.Check(path, fset, files, nil) +} + +func printStats(d time.Duration) { + fileCount := 0 + lineCount := 0 + fset.Iterate(func(f *token.File) bool { + fileCount++ + lineCount += f.LineCount() + return true + }) + + fmt.Printf( + "%s (%d files, %d lines, %d lines/s)\n", + d, fileCount, lineCount, int64(float64(lineCount)/d.Seconds()), + ) +} + +func main() { + runtime.GOMAXPROCS(runtime.NumCPU()) // not needed for go1.5 + + flag.Usage = usage + flag.Parse() + if *printAST || *printTrace { + *sequential = true + } + initParserMode() + initSizes() + + start := time.Now() + + files, err := getPkgFiles(flag.Args()) + if err != nil { + report(err) + os.Exit(2) + } + + checkPkgFiles(files) + if errorCount > 0 { + os.Exit(2) + } + + if *verbose { + printStats(time.Since(start)) + } +} diff --git a/vendor/golang.org/x/tools/cmd/guru/callees.go b/vendor/golang.org/x/tools/cmd/guru/callees.go new file mode 100644 index 0000000000..678450bfd6 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/callees.go @@ -0,0 +1,258 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" + "sort" + + "golang.org/x/tools/cmd/guru/serial" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/pointer" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +// Callees reports the possible callees of the function call site +// identified by the specified source location. +func callees(q *Query) error { + lconf := loader.Config{Build: q.Build} + + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, true) // needs exact pos + if err != nil { + return err + } + + // Determine the enclosing call for the specified position. + var e *ast.CallExpr + for _, n := range qpos.path { + if e, _ = n.(*ast.CallExpr); e != nil { + break + } + } + if e == nil { + return fmt.Errorf("there is no function call here") + } + // TODO(adonovan): issue an error if the call is "too far + // away" from the current selection, as this most likely is + // not what the user intended. + + // Reject type conversions. + if qpos.info.Types[e.Fun].IsType() { + return fmt.Errorf("this is a type conversion, not a function call") + } + + // Deal with obviously static calls before constructing SSA form. + // Some static calls may yet require SSA construction, + // e.g. f := func(){}; f(). + switch funexpr := unparen(e.Fun).(type) { + case *ast.Ident: + switch obj := qpos.info.Uses[funexpr].(type) { + case *types.Builtin: + // Reject calls to built-ins. + return fmt.Errorf("this is a call to the built-in '%s' operator", obj.Name()) + case *types.Func: + // This is a static function call + q.result = &calleesTypesResult{ + site: e, + callee: obj, + } + return nil + } + case *ast.SelectorExpr: + sel := qpos.info.Selections[funexpr] + if sel == nil { + // qualified identifier. + // May refer to top level function variable + // or to top level function. + callee := qpos.info.Uses[funexpr.Sel] + if obj, ok := callee.(*types.Func); ok { + q.result = &calleesTypesResult{ + site: e, + callee: obj, + } + return nil + } + } else if sel.Kind() == types.MethodVal { + // Inspect the receiver type of the selected method. + // If it is concrete, the call is statically dispatched. + // (Due to implicit field selections, it is not enough to look + // at sel.Recv(), the type of the actual receiver expression.) + method := sel.Obj().(*types.Func) + recvtype := method.Type().(*types.Signature).Recv().Type() + if !types.IsInterface(recvtype) { + // static method call + q.result = &calleesTypesResult{ + site: e, + callee: method, + } + return nil + } + } + } + + prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug) + + ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection) + if err != nil { + return err + } + + pkg := prog.Package(qpos.info.Pkg) + if pkg == nil { + return fmt.Errorf("no SSA package") + } + + // Defer SSA construction till after errors are reported. + prog.Build() + + // Ascertain calling function and call site. + callerFn := ssa.EnclosingFunction(pkg, qpos.path) + if callerFn == nil { + return fmt.Errorf("no SSA function built for this location (dead code?)") + } + + // Find the call site. + site, err := findCallSite(callerFn, e) + if err != nil { + return err + } + + funcs, err := findCallees(ptaConfig, site) + if err != nil { + return err + } + + q.result = &calleesSSAResult{ + site: site, + funcs: funcs, + } + return nil +} + +func findCallSite(fn *ssa.Function, call *ast.CallExpr) (ssa.CallInstruction, error) { + instr, _ := fn.ValueForExpr(call) + callInstr, _ := instr.(ssa.CallInstruction) + if instr == nil { + return nil, fmt.Errorf("this call site is unreachable in this analysis") + } + return callInstr, nil +} + +func findCallees(conf *pointer.Config, site ssa.CallInstruction) ([]*ssa.Function, error) { + // Avoid running the pointer analysis for static calls. + if callee := site.Common().StaticCallee(); callee != nil { + switch callee.String() { + case "runtime.SetFinalizer", "(reflect.Value).Call": + // The PTA treats calls to these intrinsics as dynamic. + // TODO(adonovan): avoid reliance on PTA internals. + + default: + return []*ssa.Function{callee}, nil // singleton + } + } + + // Dynamic call: use pointer analysis. + conf.BuildCallGraph = true + cg := ptrAnalysis(conf).CallGraph + cg.DeleteSyntheticNodes() + + // Find all call edges from the site. + n := cg.Nodes[site.Parent()] + if n == nil { + return nil, fmt.Errorf("this call site is unreachable in this analysis") + } + calleesMap := make(map[*ssa.Function]bool) + for _, edge := range n.Out { + if edge.Site == site { + calleesMap[edge.Callee.Func] = true + } + } + + // De-duplicate and sort. + funcs := make([]*ssa.Function, 0, len(calleesMap)) + for f := range calleesMap { + funcs = append(funcs, f) + } + sort.Sort(byFuncPos(funcs)) + return funcs, nil +} + +type calleesSSAResult struct { + site ssa.CallInstruction + funcs []*ssa.Function +} + +type calleesTypesResult struct { + site *ast.CallExpr + callee *types.Func +} + +func (r *calleesSSAResult) display(printf printfFunc) { + if len(r.funcs) == 0 { + // dynamic call on a provably nil func/interface + printf(r.site, "%s on nil value", r.site.Common().Description()) + } else { + printf(r.site, "this %s dispatches to:", r.site.Common().Description()) + for _, callee := range r.funcs { + printf(callee, "\t%s", callee) + } + } +} + +func (r *calleesSSAResult) toSerial(res *serial.Result, fset *token.FileSet) { + j := &serial.Callees{ + Pos: fset.Position(r.site.Pos()).String(), + Desc: r.site.Common().Description(), + } + for _, callee := range r.funcs { + j.Callees = append(j.Callees, &serial.CalleesItem{ + Name: callee.String(), + Pos: fset.Position(callee.Pos()).String(), + }) + } + res.Callees = j +} + +func (r *calleesTypesResult) display(printf printfFunc) { + printf(r.site, "this static function call dispatches to:") + printf(r.callee, "\t%s", r.callee.FullName()) +} + +func (r *calleesTypesResult) toSerial(res *serial.Result, fset *token.FileSet) { + j := &serial.Callees{ + Pos: fset.Position(r.site.Pos()).String(), + Desc: "static function call", + } + j.Callees = []*serial.CalleesItem{ + &serial.CalleesItem{ + Name: r.callee.FullName(), + Pos: fset.Position(r.callee.Pos()).String(), + }, + } + res.Callees = j +} + +// NB: byFuncPos is not deterministic across packages since it depends on load order. +// Use lessPos if the tests need it. +type byFuncPos []*ssa.Function + +func (a byFuncPos) Len() int { return len(a) } +func (a byFuncPos) Less(i, j int) bool { return a[i].Pos() < a[j].Pos() } +func (a byFuncPos) Swap(i, j int) { a[i], a[j] = a[j], a[i] } diff --git a/vendor/golang.org/x/tools/cmd/guru/callers.go b/vendor/golang.org/x/tools/cmd/guru/callers.go new file mode 100644 index 0000000000..0dd8c144ad --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/callers.go @@ -0,0 +1,196 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "fmt" + "go/token" + "go/types" + + "golang.org/x/tools/cmd/guru/serial" + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +// Callers reports the possible callers of the function +// immediately enclosing the specified source location. +// +func callers(q *Query) error { + lconf := loader.Config{Build: q.Build} + + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + prog := ssautil.CreateProgram(lprog, 0) + + ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection) + if err != nil { + return err + } + + pkg := prog.Package(qpos.info.Pkg) + if pkg == nil { + return fmt.Errorf("no SSA package") + } + if !ssa.HasEnclosingFunction(pkg, qpos.path) { + return fmt.Errorf("this position is not inside a function") + } + + // Defer SSA construction till after errors are reported. + prog.Build() + + target := ssa.EnclosingFunction(pkg, qpos.path) + if target == nil { + return fmt.Errorf("no SSA function built for this location (dead code?)") + } + + // If the function is never address-taken, all calls are direct + // and can be found quickly by inspecting the whole SSA program. + cg := directCallsTo(target, entryPoints(ptaConfig.Mains)) + if cg == nil { + // Run the pointer analysis, recording each + // call found to originate from target. + // (Pointer analysis may return fewer results than + // directCallsTo because it ignores dead code.) + ptaConfig.BuildCallGraph = true + cg = ptrAnalysis(ptaConfig).CallGraph + } + cg.DeleteSyntheticNodes() + edges := cg.CreateNode(target).In + + // TODO(adonovan): sort + dedup calls to ensure test determinism. + + q.result = &callersResult{ + target: target, + callgraph: cg, + edges: edges, + } + return nil +} + +// directCallsTo inspects the whole program and returns a callgraph +// containing edges for all direct calls to the target function. +// directCallsTo returns nil if the function is ever address-taken. +func directCallsTo(target *ssa.Function, entrypoints []*ssa.Function) *callgraph.Graph { + cg := callgraph.New(nil) // use nil as root *Function + targetNode := cg.CreateNode(target) + + // Is the function a program entry point? + // If so, add edge from callgraph root. + for _, f := range entrypoints { + if f == target { + callgraph.AddEdge(cg.Root, nil, targetNode) + } + } + + // Find receiver type (for methods). + var recvType types.Type + if recv := target.Signature.Recv(); recv != nil { + recvType = recv.Type() + } + + // Find all direct calls to function, + // or a place where its address is taken. + var space [32]*ssa.Value // preallocate + for fn := range ssautil.AllFunctions(target.Prog) { + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + // Is this a method (T).f of a concrete type T + // whose runtime type descriptor is address-taken? + // (To be fully sound, we would have to check that + // the type doesn't make it to reflection as a + // subelement of some other address-taken type.) + if recvType != nil { + if mi, ok := instr.(*ssa.MakeInterface); ok { + if types.Identical(mi.X.Type(), recvType) { + return nil // T is address-taken + } + if ptr, ok := mi.X.Type().(*types.Pointer); ok && + types.Identical(ptr.Elem(), recvType) { + return nil // *T is address-taken + } + } + } + + // Direct call to target? + rands := instr.Operands(space[:0]) + if site, ok := instr.(ssa.CallInstruction); ok && + site.Common().Value == target { + callgraph.AddEdge(cg.CreateNode(fn), site, targetNode) + rands = rands[1:] // skip .Value (rands[0]) + } + + // Address-taken? + for _, rand := range rands { + if rand != nil && *rand == target { + return nil + } + } + } + } + } + + return cg +} + +func entryPoints(mains []*ssa.Package) []*ssa.Function { + var entrypoints []*ssa.Function + for _, pkg := range mains { + entrypoints = append(entrypoints, pkg.Func("init")) + if main := pkg.Func("main"); main != nil && pkg.Pkg.Name() == "main" { + entrypoints = append(entrypoints, main) + } + } + return entrypoints +} + +type callersResult struct { + target *ssa.Function + callgraph *callgraph.Graph + edges []*callgraph.Edge +} + +func (r *callersResult) display(printf printfFunc) { + root := r.callgraph.Root + if r.edges == nil { + printf(r.target, "%s is not reachable in this program.", r.target) + } else { + printf(r.target, "%s is called from these %d sites:", r.target, len(r.edges)) + for _, edge := range r.edges { + if edge.Caller == root { + printf(r.target, "the root of the call graph") + } else { + printf(edge, "\t%s from %s", edge.Description(), edge.Caller.Func) + } + } + } +} + +func (r *callersResult) toSerial(res *serial.Result, fset *token.FileSet) { + var callers []serial.Caller + for _, edge := range r.edges { + callers = append(callers, serial.Caller{ + Caller: edge.Caller.Func.String(), + Pos: fset.Position(edge.Pos()).String(), + Desc: edge.Description(), + }) + } + res.Callers = callers +} diff --git a/vendor/golang.org/x/tools/cmd/guru/callstack.go b/vendor/golang.org/x/tools/cmd/guru/callstack.go new file mode 100644 index 0000000000..b2160b9f85 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/callstack.go @@ -0,0 +1,142 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "fmt" + "go/token" + + "golang.org/x/tools/cmd/guru/serial" + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/callgraph/static" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +// Callstack displays an arbitrary path from a root of the callgraph +// to the function at the current position. +// +// The information may be misleading in a context-insensitive +// analysis. e.g. the call path X->Y->Z might be infeasible if Y never +// calls Z when it is called from X. TODO(adonovan): think about UI. +// +// TODO(adonovan): permit user to specify a starting point other than +// the analysis root. +// +func callstack(q *Query) error { + fset := token.NewFileSet() + lconf := loader.Config{Fset: fset, Build: q.Build} + + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + + qpos, err := parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + prog := ssautil.CreateProgram(lprog, 0) + + ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection) + if err != nil { + return err + } + + pkg := prog.Package(qpos.info.Pkg) + if pkg == nil { + return fmt.Errorf("no SSA package") + } + + if !ssa.HasEnclosingFunction(pkg, qpos.path) { + return fmt.Errorf("this position is not inside a function") + } + + // Defer SSA construction till after errors are reported. + prog.Build() + + target := ssa.EnclosingFunction(pkg, qpos.path) + if target == nil { + return fmt.Errorf("no SSA function built for this location (dead code?)") + } + + var callpath []*callgraph.Edge + isEnd := func(n *callgraph.Node) bool { return n.Func == target } + + // First, build a callgraph containing only static call edges, + // and search for an arbitrary path from a root to the target function. + // This is quick, and the user wants a static path if one exists. + cg := static.CallGraph(prog) + cg.DeleteSyntheticNodes() + for _, ep := range entryPoints(ptaConfig.Mains) { + callpath = callgraph.PathSearch(cg.CreateNode(ep), isEnd) + if callpath != nil { + break + } + } + + // No fully static path found. + // Run the pointer analysis and build a complete call graph. + if callpath == nil { + ptaConfig.BuildCallGraph = true + cg := ptrAnalysis(ptaConfig).CallGraph + cg.DeleteSyntheticNodes() + callpath = callgraph.PathSearch(cg.Root, isEnd) + if callpath != nil { + callpath = callpath[1:] // remove synthetic edge from <root> + } + } + + q.Fset = fset + q.result = &callstackResult{ + qpos: qpos, + target: target, + callpath: callpath, + } + return nil +} + +type callstackResult struct { + qpos *queryPos + target *ssa.Function + callpath []*callgraph.Edge +} + +func (r *callstackResult) display(printf printfFunc) { + if r.callpath != nil { + printf(r.qpos, "Found a call path from root to %s", r.target) + printf(r.target, "%s", r.target) + for i := len(r.callpath) - 1; i >= 0; i-- { + edge := r.callpath[i] + printf(edge, "%s from %s", edge.Description(), edge.Caller.Func) + } + } else { + printf(r.target, "%s is unreachable in this analysis scope", r.target) + } +} + +func (r *callstackResult) toSerial(res *serial.Result, fset *token.FileSet) { + var callers []serial.Caller + for i := len(r.callpath) - 1; i >= 0; i-- { // (innermost first) + edge := r.callpath[i] + callers = append(callers, serial.Caller{ + Pos: fset.Position(edge.Pos()).String(), + Caller: edge.Caller.Func.String(), + Desc: edge.Description(), + }) + } + res.Callstack = &serial.CallStack{ + Pos: fset.Position(r.target.Pos()).String(), + Target: r.target.String(), + Callers: callers, + } +} diff --git a/vendor/golang.org/x/tools/cmd/guru/definition.go b/vendor/golang.org/x/tools/cmd/guru/definition.go new file mode 100644 index 0000000000..f290b5b478 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/definition.go @@ -0,0 +1,102 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "fmt" + "go/ast" + "go/token" + + "golang.org/x/tools/cmd/guru/serial" + "golang.org/x/tools/go/loader" +) + +// definition reports the location of the definition of an identifier. +func definition(q *Query) error { + // First try the simple resolution done by parser. + // It only works for intra-file references but it is very fast. + // (Extending this approach to all the files of the package, + // resolved using ast.NewPackage, was not worth the effort.) + { + qpos, err := fastQueryPos(q.Build, q.Pos) + if err != nil { + return err + } + + id, _ := qpos.path[0].(*ast.Ident) + if id == nil { + return fmt.Errorf("no identifier here") + } + + if obj := id.Obj; obj != nil && obj.Pos().IsValid() { + q.Fset = qpos.fset + q.result = &definitionResult{ + pos: obj.Pos(), + descr: fmt.Sprintf("%s %s", obj.Kind, obj.Name), + } + return nil // success + } + } + + // Run the type checker. + lconf := loader.Config{Build: q.Build} + allowErrors(&lconf) + + if _, err := importQueryPackage(q.Pos, &lconf); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + id, _ := qpos.path[0].(*ast.Ident) + if id == nil { + return fmt.Errorf("no identifier here") + } + + obj := qpos.info.ObjectOf(id) + if obj == nil { + // Happens for y in "switch y := x.(type)", + // and the package declaration, + // but I think that's all. + return fmt.Errorf("no object for identifier") + } + + if !obj.Pos().IsValid() { + return fmt.Errorf("%s is built in", obj.Name()) + } + + q.result = &definitionResult{ + pos: obj.Pos(), + descr: qpos.objectString(obj), + } + return nil +} + +type definitionResult struct { + pos token.Pos // (nonzero) location of definition + descr string // description of object it denotes +} + +func (r *definitionResult) display(printf printfFunc) { + printf(r.pos, "defined here as %s", r.descr) +} + +func (r *definitionResult) toSerial(res *serial.Result, fset *token.FileSet) { + definition := &serial.Definition{ + Desc: r.descr, + ObjPos: fset.Position(r.pos).String(), + } + res.Definition = definition +} diff --git a/vendor/golang.org/x/tools/cmd/guru/describe.go b/vendor/golang.org/x/tools/cmd/guru/describe.go new file mode 100644 index 0000000000..a1111efb15 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/describe.go @@ -0,0 +1,893 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "bytes" + "fmt" + "go/ast" + exact "go/constant" + "go/token" + "go/types" + "os" + "strings" + "unicode/utf8" + + "golang.org/x/tools/cmd/guru/serial" + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/types/typeutil" +) + +// describe describes the syntax node denoted by the query position, +// including: +// - its syntactic category +// - the definition of its referent (for identifiers) [now redundant] +// - its type, fields, and methods (for an expression or type expression) +// +func describe(q *Query) error { + lconf := loader.Config{Build: q.Build} + allowErrors(&lconf) + + if _, err := importQueryPackage(q.Pos, &lconf); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, true) // (need exact pos) + if err != nil { + return err + } + + if false { // debugging + fprintf(os.Stderr, lprog.Fset, qpos.path[0], "you selected: %s %s", + astutil.NodeDescription(qpos.path[0]), pathToString(qpos.path)) + } + + path, action := findInterestingNode(qpos.info, qpos.path) + switch action { + case actionExpr: + q.result, err = describeValue(qpos, path) + + case actionType: + q.result, err = describeType(qpos, path) + + case actionPackage: + q.result, err = describePackage(qpos, path) + + case actionStmt: + q.result, err = describeStmt(qpos, path) + + case actionUnknown: + q.result = &describeUnknownResult{path[0]} + + default: + panic(action) // unreachable + } + return err +} + +type describeUnknownResult struct { + node ast.Node +} + +func (r *describeUnknownResult) display(printf printfFunc) { + // Nothing much to say about misc syntax. + printf(r.node, "%s", astutil.NodeDescription(r.node)) +} + +func (r *describeUnknownResult) toSerial(res *serial.Result, fset *token.FileSet) { + res.Describe = &serial.Describe{ + Desc: astutil.NodeDescription(r.node), + Pos: fset.Position(r.node.Pos()).String(), + } +} + +type action int + +const ( + actionUnknown action = iota // None of the below + actionExpr // FuncDecl, true Expr or Ident(types.{Const,Var}) + actionType // type Expr or Ident(types.TypeName). + actionStmt // Stmt or Ident(types.Label) + actionPackage // Ident(types.Package) or ImportSpec +) + +// findInterestingNode classifies the syntax node denoted by path as one of: +// - an expression, part of an expression or a reference to a constant +// or variable; +// - a type, part of a type, or a reference to a named type; +// - a statement, part of a statement, or a label referring to a statement; +// - part of a package declaration or import spec. +// - none of the above. +// and returns the most "interesting" associated node, which may be +// the same node, an ancestor or a descendent. +// +func findInterestingNode(pkginfo *loader.PackageInfo, path []ast.Node) ([]ast.Node, action) { + // TODO(adonovan): integrate with go/types/stdlib_test.go and + // apply this to every AST node we can find to make sure it + // doesn't crash. + + // TODO(adonovan): audit for ParenExpr safety, esp. since we + // traverse up and down. + + // TODO(adonovan): if the users selects the "." in + // "fmt.Fprintf()", they'll get an ambiguous selection error; + // we won't even reach here. Can we do better? + + // TODO(adonovan): describing a field within 'type T struct {...}' + // describes the (anonymous) struct type and concludes "no methods". + // We should ascend to the enclosing type decl, if any. + + for len(path) > 0 { + switch n := path[0].(type) { + case *ast.GenDecl: + if len(n.Specs) == 1 { + // Descend to sole {Import,Type,Value}Spec child. + path = append([]ast.Node{n.Specs[0]}, path...) + continue + } + return path, actionUnknown // uninteresting + + case *ast.FuncDecl: + // Descend to function name. + path = append([]ast.Node{n.Name}, path...) + continue + + case *ast.ImportSpec: + return path, actionPackage + + case *ast.ValueSpec: + if len(n.Names) == 1 { + // Descend to sole Ident child. + path = append([]ast.Node{n.Names[0]}, path...) + continue + } + return path, actionUnknown // uninteresting + + case *ast.TypeSpec: + // Descend to type name. + path = append([]ast.Node{n.Name}, path...) + continue + + case ast.Stmt: + return path, actionStmt + + case *ast.ArrayType, + *ast.StructType, + *ast.FuncType, + *ast.InterfaceType, + *ast.MapType, + *ast.ChanType: + return path, actionType + + case *ast.Comment, *ast.CommentGroup, *ast.File, *ast.KeyValueExpr, *ast.CommClause: + return path, actionUnknown // uninteresting + + case *ast.Ellipsis: + // Continue to enclosing node. + // e.g. [...]T in ArrayType + // f(x...) in CallExpr + // f(x...T) in FuncType + + case *ast.Field: + // TODO(adonovan): this needs more thought, + // since fields can be so many things. + if len(n.Names) == 1 { + // Descend to sole Ident child. + path = append([]ast.Node{n.Names[0]}, path...) + continue + } + // Zero names (e.g. anon field in struct) + // or multiple field or param names: + // continue to enclosing field list. + + case *ast.FieldList: + // Continue to enclosing node: + // {Struct,Func,Interface}Type or FuncDecl. + + case *ast.BasicLit: + if _, ok := path[1].(*ast.ImportSpec); ok { + return path[1:], actionPackage + } + return path, actionExpr + + case *ast.SelectorExpr: + // TODO(adonovan): use Selections info directly. + if pkginfo.Uses[n.Sel] == nil { + // TODO(adonovan): is this reachable? + return path, actionUnknown + } + // Descend to .Sel child. + path = append([]ast.Node{n.Sel}, path...) + continue + + case *ast.Ident: + switch pkginfo.ObjectOf(n).(type) { + case *types.PkgName: + return path, actionPackage + + case *types.Const: + return path, actionExpr + + case *types.Label: + return path, actionStmt + + case *types.TypeName: + return path, actionType + + case *types.Var: + // For x in 'struct {x T}', return struct type, for now. + if _, ok := path[1].(*ast.Field); ok { + _ = path[2].(*ast.FieldList) // assertion + if _, ok := path[3].(*ast.StructType); ok { + return path[3:], actionType + } + } + return path, actionExpr + + case *types.Func: + return path, actionExpr + + case *types.Builtin: + // For reference to built-in function, return enclosing call. + path = path[1:] // ascend to enclosing function call + continue + + case *types.Nil: + return path, actionExpr + } + + // No object. + switch path[1].(type) { + case *ast.SelectorExpr: + // Return enclosing selector expression. + return path[1:], actionExpr + + case *ast.Field: + // TODO(adonovan): test this. + // e.g. all f in: + // struct { f, g int } + // interface { f() } + // func (f T) method(f, g int) (f, g bool) + // + // switch path[3].(type) { + // case *ast.FuncDecl: + // case *ast.StructType: + // case *ast.InterfaceType: + // } + // + // return path[1:], actionExpr + // + // Unclear what to do with these. + // Struct.Fields -- field + // Interface.Methods -- field + // FuncType.{Params.Results} -- actionExpr + // FuncDecl.Recv -- actionExpr + + case *ast.File: + // 'package foo' + return path, actionPackage + + case *ast.ImportSpec: + return path[1:], actionPackage + + default: + // e.g. blank identifier + // or y in "switch y := x.(type)" + // or code in a _test.go file that's not part of the package. + return path, actionUnknown + } + + case *ast.StarExpr: + if pkginfo.Types[n].IsType() { + return path, actionType + } + return path, actionExpr + + case ast.Expr: + // All Expr but {BasicLit,Ident,StarExpr} are + // "true" expressions that evaluate to a value. + return path, actionExpr + } + + // Ascend to parent. + path = path[1:] + } + + return nil, actionUnknown // unreachable +} + +func describeValue(qpos *queryPos, path []ast.Node) (*describeValueResult, error) { + var expr ast.Expr + var obj types.Object + switch n := path[0].(type) { + case *ast.ValueSpec: + // ambiguous ValueSpec containing multiple names + return nil, fmt.Errorf("multiple value specification") + case *ast.Ident: + obj = qpos.info.ObjectOf(n) + expr = n + case ast.Expr: + expr = n + default: + // TODO(adonovan): is this reachable? + return nil, fmt.Errorf("unexpected AST for expr: %T", n) + } + + t := qpos.info.TypeOf(expr) + if t == nil { + t = types.Typ[types.Invalid] + } + constVal := qpos.info.Types[expr].Value + + return &describeValueResult{ + qpos: qpos, + expr: expr, + typ: t, + constVal: constVal, + obj: obj, + methods: accessibleMethods(t, qpos.info.Pkg), + fields: accessibleFields(t, qpos.info.Pkg), + }, nil +} + +type describeValueResult struct { + qpos *queryPos + expr ast.Expr // query node + typ types.Type // type of expression + constVal exact.Value // value of expression, if constant + obj types.Object // var/func/const object, if expr was Ident + methods []*types.Selection + fields []describeField +} + +func (r *describeValueResult) display(printf printfFunc) { + var prefix, suffix string + if r.constVal != nil { + suffix = fmt.Sprintf(" of constant value %s", constValString(r.constVal)) + } + switch obj := r.obj.(type) { + case *types.Func: + if recv := obj.Type().(*types.Signature).Recv(); recv != nil { + if _, ok := recv.Type().Underlying().(*types.Interface); ok { + prefix = "interface method " + } else { + prefix = "method " + } + } + } + + // Describe the expression. + if r.obj != nil { + if r.obj.Pos() == r.expr.Pos() { + // defining ident + printf(r.expr, "definition of %s%s%s", prefix, r.qpos.objectString(r.obj), suffix) + } else { + // referring ident + printf(r.expr, "reference to %s%s%s", prefix, r.qpos.objectString(r.obj), suffix) + if def := r.obj.Pos(); def != token.NoPos { + printf(def, "defined here") + } + } + } else { + desc := astutil.NodeDescription(r.expr) + if suffix != "" { + // constant expression + printf(r.expr, "%s%s", desc, suffix) + } else { + // non-constant expression + printf(r.expr, "%s of type %s", desc, r.qpos.typeString(r.typ)) + } + } + + printMethods(printf, r.expr, r.methods) + printFields(printf, r.expr, r.fields) +} + +func (r *describeValueResult) toSerial(res *serial.Result, fset *token.FileSet) { + var value, objpos string + if r.constVal != nil { + value = r.constVal.String() + } + if r.obj != nil { + objpos = fset.Position(r.obj.Pos()).String() + } + + res.Describe = &serial.Describe{ + Desc: astutil.NodeDescription(r.expr), + Pos: fset.Position(r.expr.Pos()).String(), + Detail: "value", + Value: &serial.DescribeValue{ + Type: r.qpos.typeString(r.typ), + Value: value, + ObjPos: objpos, + }, + } +} + +// ---- TYPE ------------------------------------------------------------ + +func describeType(qpos *queryPos, path []ast.Node) (*describeTypeResult, error) { + var description string + var t types.Type + switch n := path[0].(type) { + case *ast.Ident: + t = qpos.info.TypeOf(n) + switch t := t.(type) { + case *types.Basic: + description = "reference to built-in " + + case *types.Named: + isDef := t.Obj().Pos() == n.Pos() // see caveats at isDef above + if isDef { + description = "definition of " + } else { + description = "reference to " + } + } + + case ast.Expr: + t = qpos.info.TypeOf(n) + + default: + // Unreachable? + return nil, fmt.Errorf("unexpected AST for type: %T", n) + } + + description = description + "type " + qpos.typeString(t) + + // Show sizes for structs and named types (it's fairly obvious for others). + switch t.(type) { + case *types.Named, *types.Struct: + szs := types.StdSizes{WordSize: 8, MaxAlign: 8} // assume amd64 + description = fmt.Sprintf("%s (size %d, align %d)", description, + szs.Sizeof(t), szs.Alignof(t)) + } + + return &describeTypeResult{ + qpos: qpos, + node: path[0], + description: description, + typ: t, + methods: accessibleMethods(t, qpos.info.Pkg), + fields: accessibleFields(t, qpos.info.Pkg), + }, nil +} + +type describeTypeResult struct { + qpos *queryPos + node ast.Node + description string + typ types.Type + methods []*types.Selection + fields []describeField +} + +type describeField struct { + implicits []*types.Named + field *types.Var +} + +func printMethods(printf printfFunc, node ast.Node, methods []*types.Selection) { + if len(methods) > 0 { + printf(node, "Methods:") + } + for _, meth := range methods { + // Print the method type relative to the package + // in which it was defined, not the query package, + printf(meth.Obj(), "\t%s", + types.SelectionString(meth, types.RelativeTo(meth.Obj().Pkg()))) + } +} + +func printFields(printf printfFunc, node ast.Node, fields []describeField) { + if len(fields) > 0 { + printf(node, "Fields:") + } + + // Align the names and the types (requires two passes). + var width int + var names []string + for _, f := range fields { + var buf bytes.Buffer + for _, fld := range f.implicits { + buf.WriteString(fld.Obj().Name()) + buf.WriteByte('.') + } + buf.WriteString(f.field.Name()) + name := buf.String() + if n := utf8.RuneCountInString(name); n > width { + width = n + } + names = append(names, name) + } + + for i, f := range fields { + // Print the field type relative to the package + // in which it was defined, not the query package, + printf(f.field, "\t%*s %s", -width, names[i], + types.TypeString(f.field.Type(), types.RelativeTo(f.field.Pkg()))) + } +} + +func (r *describeTypeResult) display(printf printfFunc) { + printf(r.node, "%s", r.description) + + // Show the underlying type for a reference to a named type. + if nt, ok := r.typ.(*types.Named); ok && r.node.Pos() != nt.Obj().Pos() { + printf(nt.Obj(), "defined as %s", r.qpos.typeString(nt.Underlying())) + } + + printMethods(printf, r.node, r.methods) + if len(r.methods) == 0 { + // Only report null result for type kinds + // capable of bearing methods. + switch r.typ.(type) { + case *types.Interface, *types.Struct, *types.Named: + printf(r.node, "No methods.") + } + } + + printFields(printf, r.node, r.fields) +} + +func (r *describeTypeResult) toSerial(res *serial.Result, fset *token.FileSet) { + var namePos, nameDef string + if nt, ok := r.typ.(*types.Named); ok { + namePos = fset.Position(nt.Obj().Pos()).String() + nameDef = nt.Underlying().String() + } + res.Describe = &serial.Describe{ + Desc: r.description, + Pos: fset.Position(r.node.Pos()).String(), + Detail: "type", + Type: &serial.DescribeType{ + Type: r.qpos.typeString(r.typ), + NamePos: namePos, + NameDef: nameDef, + Methods: methodsToSerial(r.qpos.info.Pkg, r.methods, fset), + }, + } +} + +// ---- PACKAGE ------------------------------------------------------------ + +func describePackage(qpos *queryPos, path []ast.Node) (*describePackageResult, error) { + var description string + var pkg *types.Package + switch n := path[0].(type) { + case *ast.ImportSpec: + var obj types.Object + if n.Name != nil { + obj = qpos.info.Defs[n.Name] + } else { + obj = qpos.info.Implicits[n] + } + pkgname, _ := obj.(*types.PkgName) + if pkgname == nil { + return nil, fmt.Errorf("can't import package %s", n.Path.Value) + } + pkg = pkgname.Imported() + description = fmt.Sprintf("import of package %q", pkg.Path()) + + case *ast.Ident: + if _, isDef := path[1].(*ast.File); isDef { + // e.g. package id + pkg = qpos.info.Pkg + description = fmt.Sprintf("definition of package %q", pkg.Path()) + } else { + // e.g. import id "..." + // or id.F() + pkg = qpos.info.ObjectOf(n).(*types.PkgName).Imported() + description = fmt.Sprintf("reference to package %q", pkg.Path()) + } + + default: + // Unreachable? + return nil, fmt.Errorf("unexpected AST for package: %T", n) + } + + var members []*describeMember + // NB: "unsafe" has no types.Package + if pkg != nil { + // Enumerate the accessible package members + // in lexicographic order. + for _, name := range pkg.Scope().Names() { + if pkg == qpos.info.Pkg || ast.IsExported(name) { + mem := pkg.Scope().Lookup(name) + var methods []*types.Selection + if mem, ok := mem.(*types.TypeName); ok { + methods = accessibleMethods(mem.Type(), qpos.info.Pkg) + } + members = append(members, &describeMember{ + mem, + methods, + }) + + } + } + } + + return &describePackageResult{qpos.fset, path[0], description, pkg, members}, nil +} + +type describePackageResult struct { + fset *token.FileSet + node ast.Node + description string + pkg *types.Package + members []*describeMember // in lexicographic name order +} + +type describeMember struct { + obj types.Object + methods []*types.Selection // in types.MethodSet order +} + +func (r *describePackageResult) display(printf printfFunc) { + printf(r.node, "%s", r.description) + + // Compute max width of name "column". + maxname := 0 + for _, mem := range r.members { + if l := len(mem.obj.Name()); l > maxname { + maxname = l + } + } + + for _, mem := range r.members { + printf(mem.obj, "\t%s", formatMember(mem.obj, maxname)) + for _, meth := range mem.methods { + printf(meth.Obj(), "\t\t%s", types.SelectionString(meth, types.RelativeTo(r.pkg))) + } + } +} + +// Helper function to adjust go1.5 numeric go/constant formatting. +// Can be removed once we give up compatibility with go1.5. +func constValString(v exact.Value) string { + if v.Kind() == exact.Float { + // In go1.5, go/constant floating-point values are printed + // as fractions. Make them appear as floating-point numbers. + f, _ := exact.Float64Val(v) + return fmt.Sprintf("%g", f) + } + return v.String() +} + +func formatMember(obj types.Object, maxname int) string { + qualifier := types.RelativeTo(obj.Pkg()) + var buf bytes.Buffer + fmt.Fprintf(&buf, "%-5s %-*s", tokenOf(obj), maxname, obj.Name()) + switch obj := obj.(type) { + case *types.Const: + fmt.Fprintf(&buf, " %s = %s", types.TypeString(obj.Type(), qualifier), constValString(obj.Val())) + + case *types.Func: + fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type(), qualifier)) + + case *types.TypeName: + // Abbreviate long aggregate type names. + var abbrev string + switch t := obj.Type().Underlying().(type) { + case *types.Interface: + if t.NumMethods() > 1 { + abbrev = "interface{...}" + } + case *types.Struct: + if t.NumFields() > 1 { + abbrev = "struct{...}" + } + } + if abbrev == "" { + fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type().Underlying(), qualifier)) + } else { + fmt.Fprintf(&buf, " %s", abbrev) + } + + case *types.Var: + fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type(), qualifier)) + } + return buf.String() +} + +func (r *describePackageResult) toSerial(res *serial.Result, fset *token.FileSet) { + var members []*serial.DescribeMember + for _, mem := range r.members { + typ := mem.obj.Type() + var val string + switch mem := mem.obj.(type) { + case *types.Const: + val = constValString(mem.Val()) + case *types.TypeName: + typ = typ.Underlying() + } + members = append(members, &serial.DescribeMember{ + Name: mem.obj.Name(), + Type: typ.String(), + Value: val, + Pos: fset.Position(mem.obj.Pos()).String(), + Kind: tokenOf(mem.obj), + Methods: methodsToSerial(r.pkg, mem.methods, fset), + }) + } + res.Describe = &serial.Describe{ + Desc: r.description, + Pos: fset.Position(r.node.Pos()).String(), + Detail: "package", + Package: &serial.DescribePackage{ + Path: r.pkg.Path(), + Members: members, + }, + } +} + +func tokenOf(o types.Object) string { + switch o.(type) { + case *types.Func: + return "func" + case *types.Var: + return "var" + case *types.TypeName: + return "type" + case *types.Const: + return "const" + case *types.PkgName: + return "package" + case *types.Builtin: + return "builtin" // e.g. when describing package "unsafe" + case *types.Nil: + return "nil" + case *types.Label: + return "label" + } + panic(o) +} + +// ---- STATEMENT ------------------------------------------------------------ + +func describeStmt(qpos *queryPos, path []ast.Node) (*describeStmtResult, error) { + var description string + switch n := path[0].(type) { + case *ast.Ident: + if qpos.info.Defs[n] != nil { + description = "labelled statement" + } else { + description = "reference to labelled statement" + } + + default: + // Nothing much to say about statements. + description = astutil.NodeDescription(n) + } + return &describeStmtResult{qpos.fset, path[0], description}, nil +} + +type describeStmtResult struct { + fset *token.FileSet + node ast.Node + description string +} + +func (r *describeStmtResult) display(printf printfFunc) { + printf(r.node, "%s", r.description) +} + +func (r *describeStmtResult) toSerial(res *serial.Result, fset *token.FileSet) { + res.Describe = &serial.Describe{ + Desc: r.description, + Pos: fset.Position(r.node.Pos()).String(), + Detail: "unknown", + } +} + +// ------------------- Utilities ------------------- + +// pathToString returns a string containing the concrete types of the +// nodes in path. +func pathToString(path []ast.Node) string { + var buf bytes.Buffer + fmt.Fprint(&buf, "[") + for i, n := range path { + if i > 0 { + fmt.Fprint(&buf, " ") + } + fmt.Fprint(&buf, strings.TrimPrefix(fmt.Sprintf("%T", n), "*ast.")) + } + fmt.Fprint(&buf, "]") + return buf.String() +} + +func accessibleMethods(t types.Type, from *types.Package) []*types.Selection { + var methods []*types.Selection + for _, meth := range typeutil.IntuitiveMethodSet(t, nil) { + if isAccessibleFrom(meth.Obj(), from) { + methods = append(methods, meth) + } + } + return methods +} + +// accessibleFields returns the set of accessible +// field selections on a value of type recv. +func accessibleFields(recv types.Type, from *types.Package) []describeField { + wantField := func(f *types.Var) bool { + if !isAccessibleFrom(f, from) { + return false + } + // Check that the field is not shadowed. + obj, _, _ := types.LookupFieldOrMethod(recv, true, f.Pkg(), f.Name()) + return obj == f + } + + var fields []describeField + var visit func(t types.Type, stack []*types.Named) + visit = func(t types.Type, stack []*types.Named) { + tStruct, ok := deref(t).Underlying().(*types.Struct) + if !ok { + return + } + fieldloop: + for i := 0; i < tStruct.NumFields(); i++ { + f := tStruct.Field(i) + + // Handle recursion through anonymous fields. + if f.Anonymous() { + tf := f.Type() + if ptr, ok := tf.(*types.Pointer); ok { + tf = ptr.Elem() + } + if named, ok := tf.(*types.Named); ok { // (be defensive) + // If we've already visited this named type + // on this path, break the cycle. + for _, x := range stack { + if x == named { + continue fieldloop + } + } + visit(f.Type(), append(stack, named)) + } + } + + // Save accessible fields. + if wantField(f) { + fields = append(fields, describeField{ + implicits: append([]*types.Named(nil), stack...), + field: f, + }) + } + } + } + visit(recv, nil) + + return fields +} + +func isAccessibleFrom(obj types.Object, pkg *types.Package) bool { + return ast.IsExported(obj.Name()) || obj.Pkg() == pkg +} + +func methodsToSerial(this *types.Package, methods []*types.Selection, fset *token.FileSet) []serial.DescribeMethod { + qualifier := types.RelativeTo(this) + var jmethods []serial.DescribeMethod + for _, meth := range methods { + var ser serial.DescribeMethod + if meth != nil { // may contain nils when called by implements (on a method) + ser = serial.DescribeMethod{ + Name: types.SelectionString(meth, qualifier), + Pos: fset.Position(meth.Obj().Pos()).String(), + } + } + jmethods = append(jmethods, ser) + } + return jmethods +} diff --git a/vendor/golang.org/x/tools/cmd/guru/emacs-test.bash b/vendor/golang.org/x/tools/cmd/guru/emacs-test.bash new file mode 100755 index 0000000000..64a38d3566 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/emacs-test.bash @@ -0,0 +1,73 @@ +#!/bin/bash +# +# Simple test of Go guru/Emacs integration. +# Requires that GOROOT and GOPATH are set. +# Side effect: builds and installs guru in $GOROOT. + +set -eu + +[ -z "$GOROOT" ] && { echo "Error: GOROOT is unset." >&2; exit 1; } +[ -z "$GOPATH" ] && { echo "Error: GOPATH is unset." >&2; exit 1; } + +log=/tmp/$(basename $0)-$$.log +thisdir=$(dirname $0) + +function die() { + echo "Error: $@." + cat $log + exit 1 +} >&2 + +trap "rm -f $log" EXIT + +# Build and install guru. +go get golang.org/x/tools/cmd/guru || die "'go get' failed" +mv -f $GOPATH/bin/guru $GOROOT/bin/ +$GOROOT/bin/guru >$log 2>&1 || true # (prints usage and exits 1) +grep -q "Run.*help" $log || die "$GOROOT/bin/guru not installed" + +# Usage: run_emacs <elisp> +function run_emacs() { + emacs --batch --no-splash --no-window-system --no-init \ + --load $GOPATH/src/github.com/dominikh/go-mode.el/go-mode.el \ + --load $thisdir/guru.el \ + --eval "$1" >$log 2>&1 || die "emacs command failed" +} + +# Usage: expect_log <regex> +function expect_log() { + grep -q "$1" $log || die "didn't find expected lines in log; got:" +} + +# Load main.go and describe the "fmt" import. +# Check that Println is mentioned. +run_emacs ' +(progn + (princ (emacs-version)) ; requires Emacs v23 + (find-file "'$thisdir'/main.go") + (insert "// modify but do not save the editor buffer\n") + (search-forward "\"fmt\"") + (backward-char) + (go-guru-describe) + (princ (with-current-buffer "*go-guru*" + (buffer-substring-no-properties (point-min) (point-max)))) + (kill-emacs 0)) +' +expect_log "fmt/print.go.*func Println" + +# Jump to the definition of flag.Bool. +run_emacs ' +(progn + (find-file "'$thisdir'/main.go") + (search-forward "flag.Bool") + (backward-char) + (go-guru-definition) + (message "file: %s" (buffer-file-name)) + (message "line: %s" (buffer-substring (line-beginning-position) + (line-end-position))) + (kill-emacs 0)) +' +expect_log "^file: .*flag.go" +expect_log "^line: func Bool" + +echo "PASS" diff --git a/vendor/golang.org/x/tools/cmd/guru/freevars.go b/vendor/golang.org/x/tools/cmd/guru/freevars.go new file mode 100644 index 0000000000..39b04d4827 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/freevars.go @@ -0,0 +1,222 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "bytes" + "go/ast" + "go/printer" + "go/token" + "go/types" + "sort" + + "golang.org/x/tools/cmd/guru/serial" + "golang.org/x/tools/go/loader" +) + +// freevars displays the lexical (not package-level) free variables of +// the selection. +// +// It treats A.B.C as a separate variable from A to reveal the parts +// of an aggregate type that are actually needed. +// This aids refactoring. +// +// TODO(adonovan): optionally display the free references to +// file/package scope objects, and to objects from other packages. +// Depending on where the resulting function abstraction will go, +// these might be interesting. Perhaps group the results into three +// bands. +// +func freevars(q *Query) error { + lconf := loader.Config{Build: q.Build} + allowErrors(&lconf) + + if _, err := importQueryPackage(q.Pos, &lconf); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + file := qpos.path[len(qpos.path)-1] // the enclosing file + fileScope := qpos.info.Scopes[file] + pkgScope := fileScope.Parent() + + // The id and sel functions return non-nil if they denote an + // object o or selection o.x.y that is referenced by the + // selection but defined neither within the selection nor at + // file scope, i.e. it is in the lexical environment. + var id func(n *ast.Ident) types.Object + var sel func(n *ast.SelectorExpr) types.Object + + sel = func(n *ast.SelectorExpr) types.Object { + switch x := unparen(n.X).(type) { + case *ast.SelectorExpr: + return sel(x) + case *ast.Ident: + return id(x) + } + return nil + } + + id = func(n *ast.Ident) types.Object { + obj := qpos.info.Uses[n] + if obj == nil { + return nil // not a reference + } + if _, ok := obj.(*types.PkgName); ok { + return nil // imported package + } + if !(file.Pos() <= obj.Pos() && obj.Pos() <= file.End()) { + return nil // not defined in this file + } + scope := obj.Parent() + if scope == nil { + return nil // e.g. interface method, struct field + } + if scope == fileScope || scope == pkgScope { + return nil // defined at file or package scope + } + if qpos.start <= obj.Pos() && obj.Pos() <= qpos.end { + return nil // defined within selection => not free + } + return obj + } + + // Maps each reference that is free in the selection + // to the object it refers to. + // The map de-duplicates repeated references. + refsMap := make(map[string]freevarsRef) + + // Visit all the identifiers in the selected ASTs. + ast.Inspect(qpos.path[0], func(n ast.Node) bool { + if n == nil { + return true // popping DFS stack + } + + // Is this node contained within the selection? + // (freevars permits inexact selections, + // like two stmts in a block.) + if qpos.start <= n.Pos() && n.End() <= qpos.end { + var obj types.Object + var prune bool + switch n := n.(type) { + case *ast.Ident: + obj = id(n) + + case *ast.SelectorExpr: + obj = sel(n) + prune = true + } + + if obj != nil { + var kind string + switch obj.(type) { + case *types.Var: + kind = "var" + case *types.Func: + kind = "func" + case *types.TypeName: + kind = "type" + case *types.Const: + kind = "const" + case *types.Label: + kind = "label" + default: + panic(obj) + } + + typ := qpos.info.TypeOf(n.(ast.Expr)) + ref := freevarsRef{kind, printNode(lprog.Fset, n), typ, obj} + refsMap[ref.ref] = ref + + if prune { + return false // don't descend + } + } + } + + return true // descend + }) + + refs := make([]freevarsRef, 0, len(refsMap)) + for _, ref := range refsMap { + refs = append(refs, ref) + } + sort.Sort(byRef(refs)) + + q.result = &freevarsResult{ + qpos: qpos, + refs: refs, + } + return nil +} + +type freevarsResult struct { + qpos *queryPos + refs []freevarsRef +} + +type freevarsRef struct { + kind string + ref string + typ types.Type + obj types.Object +} + +func (r *freevarsResult) display(printf printfFunc) { + if len(r.refs) == 0 { + printf(r.qpos, "No free identifiers.") + } else { + printf(r.qpos, "Free identifiers:") + qualifier := types.RelativeTo(r.qpos.info.Pkg) + for _, ref := range r.refs { + // Avoid printing "type T T". + var typstr string + if ref.kind != "type" && ref.kind != "label" { + typstr = " " + types.TypeString(ref.typ, qualifier) + } + printf(ref.obj, "%s %s%s", ref.kind, ref.ref, typstr) + } + } +} + +func (r *freevarsResult) toSerial(res *serial.Result, fset *token.FileSet) { + var refs []*serial.FreeVar + for _, ref := range r.refs { + refs = append(refs, + &serial.FreeVar{ + Pos: fset.Position(ref.obj.Pos()).String(), + Kind: ref.kind, + Ref: ref.ref, + Type: ref.typ.String(), + }) + } + res.Freevars = refs +} + +// -------- utils -------- + +type byRef []freevarsRef + +func (p byRef) Len() int { return len(p) } +func (p byRef) Less(i, j int) bool { return p[i].ref < p[j].ref } +func (p byRef) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +// printNode returns the pretty-printed syntax of n. +func printNode(fset *token.FileSet, n ast.Node) string { + var buf bytes.Buffer + printer.Fprint(&buf, fset, n) + return buf.String() +} diff --git a/vendor/golang.org/x/tools/cmd/guru/go-guru.el b/vendor/golang.org/x/tools/cmd/guru/go-guru.el new file mode 100644 index 0000000000..a097d2dc5a --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/go-guru.el @@ -0,0 +1,455 @@ +;;; go-guru.el --- Integration of the Go 'guru' analysis tool into Emacs. + +;; Copyright 2016 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. + +;; Version: 0.1 +;; Package-Requires: ((go-mode "1.3.1") (cl-lib "0.5")) +;; Keywords: tools + +;;; Commentary: + +;; To install the Go guru, run: +;; +;; $ go get golang.org/x/tools/cmd/guru +;; +;; Load this file into Emacs and set go-guru-scope to your +;; configuration. Then, find a file of Go source code, +;; select an expression of interest, and press `C-c C-o d' (for "describe") +;; or run one of the other go-guru-xxx commands. + +;;; Code: + +(require 'compile) +(require 'go-mode) +(require 'json) +(require 'simple) +(require 'cl) + +(defgroup go-guru nil + "Options specific to the Go guru." + :group 'go) + +(defcustom go-guru-command "guru" + "The Go guru command." + :type 'string + :group 'go-guru) + +(defcustom go-guru-scope "" + "The scope of the analysis. See `go-guru-set-scope'." + :type 'string + :group 'go-guru) + +(defvar go-guru--scope-history + nil + "History of values supplied to `go-guru-set-scope'.") + +(defcustom go-guru-build-tags "" + "Build tags passed to guru." + :type 'string + :group 'go-guru) + +(defface go-guru-hl-identifier-face + '((t (:inherit highlight))) + "Face used for highlighting identifiers in `go-guru-hl-identifier'." + :group 'go-guru) + +(defcustom go-guru-debug nil + "Print debug messages when running guru." + :type 'boolean + :group 'go-guru) + +(defcustom go-guru-hl-identifier-idle-time 0.5 + "How long to wait after user input before highlighting the current identifier." + :type 'float + :group 'go-guru) + +(defvar go-guru--current-hl-identifier-idle-time + 0 + "The current delay for hl-identifier-mode.") + +(defvar go-guru--hl-identifier-timer + nil + "The global timer used for highlighting identifiers.") + +;; Extend go-mode-map. +(let ((m (define-prefix-command 'go-guru-map))) + (define-key m "d" #'go-guru-describe) + (define-key m "f" #'go-guru-freevars) + (define-key m "i" #'go-guru-implements) + (define-key m "c" #'go-guru-peers) ; c for channel + (define-key m "r" #'go-guru-referrers) + (define-key m "j" #'go-guru-definition) ; j for jump + (define-key m "p" #'go-guru-pointsto) + (define-key m "s" #'go-guru-callstack) ; s for stack + (define-key m "e" #'go-guru-whicherrs) ; e for error + (define-key m "<" #'go-guru-callers) + (define-key m ">" #'go-guru-callees)) + +(define-key go-mode-map (kbd "C-c C-o") #'go-guru-map) + +;;;###autoload +(defun go-guru-set-scope () + "Set the scope for the Go guru, prompting the user to edit the previous scope. + +The scope restricts analysis to the specified packages. +Its value is a comma-separated list of patterns of these forms: + golang.org/x/tools/cmd/guru # a single package + golang.org/x/tools/... # all packages beneath dir + ... # the entire workspace. + +A pattern preceded by '-' is negative, so the scope + encoding/...,-encoding/xml +matches all encoding packages except encoding/xml." + (interactive) + (let ((scope (read-from-minibuffer "Go guru scope: " + go-guru-scope + nil + nil + 'go-guru--scope-history))) + (if (string-equal "" scope) + (error "You must specify a non-empty scope for the Go guru")) + (setq go-guru-scope scope))) + +(defun go-guru--run (mode &optional need-scope) + "Run the Go guru in the specified MODE, passing it the selected +region of the current buffer. If NEED-SCOPE, prompt for a scope +if not already set. Mark up the output using `compilation-mode`, +replacing each file name with a small hyperlink, and display the +result." + (let ((output (go-guru--exec mode need-scope)) + (display (get-buffer-create "*go-guru*")) + (dir default-directory)) + (with-current-buffer display + (setq buffer-read-only nil) + (setq default-directory dir) + (erase-buffer) + (insert-buffer-substring output) + (go-guru--compilation-markup)))) + +(defun go-guru--exec (mode &optional need-scope flags allow-unnamed) + "Execute the Go guru in the specified MODE, passing it the +selected region of the current buffer. If NEED-SCOPE, prompt for +a scope if not already set. If ALLOW-UNNAMED is non-nil, a +synthetic file for the unnamed buffer will be created. This +should only be used with queries that work on single files +only (e.g. 'what'). If ALLOW-UNNAMED is nil and the buffer has no +associated name, an error will be signaled. + +Return the output buffer." + (or + buffer-file-name + allow-unnamed + (error "Cannot use guru on a buffer without a file name")) + (and need-scope + (string-equal "" go-guru-scope) + (go-guru-set-scope)) + (let* ((is-unnamed (not buffer-file-name)) + (filename (file-truename (or buffer-file-name "synthetic.go"))) + (posn (if (use-region-p) + (format "%s:#%d,#%d" + filename + (1- (go--position-bytes (region-beginning))) + (1- (go--position-bytes (region-end)))) + (format "%s:#%d" + filename + (1- (position-bytes (point)))))) + (env-vars (go-root-and-paths)) + (goroot-env (concat "GOROOT=" (car env-vars))) + (gopath-env (concat "GOPATH=" (mapconcat #'identity (cdr env-vars) ":"))) + (output-buffer (get-buffer-create "*go-guru-output*")) + (buf (current-buffer))) + (with-current-buffer output-buffer + (setq buffer-read-only nil) + (erase-buffer)) + (with-current-buffer (get-buffer-create "*go-guru-input*") + (setq buffer-read-only nil) + (erase-buffer) + (if is-unnamed + (go-guru--insert-modified-file filename buf) + (go-guru--insert-modified-files)) + (let* ((args (append (list "-modified" + "-scope" go-guru-scope + "-tags" go-guru-build-tags) + flags + (list mode posn)))) + ;; Log the command to *Messages*, for debugging. + (when go-guru-debug + (message "Command: %s:" args) + (message nil) ; clears/shrinks minibuffer + (message "Running guru %s..." mode)) + ;; Use dynamic binding to modify/restore the environment + (let* ((process-environment (list* goroot-env gopath-env process-environment)) + (c-p-args (append (list (point-min) + (point-max) + go-guru-command + nil ; delete + output-buffer + t) + args)) + (exitcode (apply #'call-process-region c-p-args))) + ;; If the command fails, don't show the output buffer, + ;; but use its contents (sans final \n) as an error. + (unless (zerop exitcode) + (with-current-buffer output-buffer + (bury-buffer) + (error "%s" (buffer-substring (point-min) (1- (point-max))))))))) + output-buffer)) + +(defun go-guru--compilation-markup () + "Present guru output in the current buffer using `compilation-mode'." + (goto-char (point-max)) + (insert "\n") + (compilation-mode) + (setq compilation-error-screen-columns nil) + + ;; Hide the file/line info to save space. + ;; Replace each with a little widget. + ;; compilation-mode + this loop = slooow. + ;; TODO(adonovan): have guru give us JSON + ;; and we'll do the markup directly. + (let ((buffer-read-only nil) + (p 1)) + (while (not (null p)) + (let ((np (compilation-next-single-property-change p 'compilation-message))) + (if np + (when (equal (line-number-at-pos p) (line-number-at-pos np)) + ;; Using a fixed width greatly improves readability, so + ;; if the filename is longer than 20, show ".../last/17chars.go". + ;; This usually includes the last segment of the package name. + ;; Don't show the line or column number. + (let* ((loc (buffer-substring p np)) ; "/home/foo/go/pkg/file.go:1:2-3:4" + (i (search ":" loc))) + (setq loc (cond + ((null i) "...") + ((>= i 17) (concat "..." (substring loc (- i 17) i))) + (t (substring loc 0 i)))) + ;; np is (typically) the space following ":"; consume it too. + (put-text-property p np 'display (concat loc ":"))) + (goto-char np) + (insert " ") + (incf np))) ; so we don't get stuck (e.g. on a panic stack dump) + (setq p np))) + (message nil)) + + (let ((w (display-buffer (current-buffer)))) + (set-window-point w (point-min)))) + +(defun go-guru--insert-modified-files () + "Insert the contents of each modified Go buffer into the +current buffer in the format specified by guru's -modified flag." + (mapc #'(lambda (b) + (and (buffer-modified-p b) + (buffer-file-name b) + (string= (file-name-extension (buffer-file-name b)) "go") + (go-guru--insert-modified-file (buffer-file-name b) b))) + (buffer-list))) + +(defun go-guru--insert-modified-file (name buffer) + (insert (format "%s\n%d\n" name (go-guru--buffer-size-bytes buffer))) + (insert-buffer-substring buffer)) + +(defun go-guru--buffer-size-bytes (&optional buffer) + "Return the number of bytes in the current buffer. +If BUFFER, return the number of characters in that buffer instead." + (with-current-buffer (or buffer (current-buffer)) + (string-bytes (buffer-substring (point-min) + (point-max))))) + +;; FIXME(dominikh): go-guru--goto-pos-no-file and go-guru--goto-pos +;; assume that Guru is giving rune offsets in the columns field. +;; However, it is giving us byte offsets, causing us to highlight +;; wrong ranges as soon as there's any multi-byte runes in the line. +(defun go-guru--goto-pos (posn) + "Find the file containing the position POSN (of the form `file:line:col') +set the point to it, switching the current buffer." + (let ((file-line-pos (split-string posn ":"))) + (find-file (car file-line-pos)) + (goto-char (point-min)) + (forward-line (1- (string-to-number (cadr file-line-pos)))) + (forward-char (1- (string-to-number (caddr file-line-pos)))))) + +(defun go-guru--goto-pos-no-file (posn) + "Given `file:line:col', go to the line and column. The file +component will be ignored." + (let ((file-line-pos (split-string posn ":"))) + (goto-char (point-min)) + (forward-line (1- (string-to-number (cadr file-line-pos)))) + (forward-char (1- (string-to-number (caddr file-line-pos)))))) + +;;;###autoload +(defun go-guru-callees () + "Show possible callees of the function call at the current point." + (interactive) + (go-guru--run "callees" t)) + +;;;###autoload +(defun go-guru-callers () + "Show the set of callers of the function containing the current point." + (interactive) + (go-guru--run "callers" t)) + +;;;###autoload +(defun go-guru-callstack () + "Show an arbitrary path from a root of the call graph to the +function containing the current point." + (interactive) + (go-guru--run "callstack" t)) + +;;;###autoload +(defun go-guru-definition () + "Jump to the definition of the selected identifier." + (interactive) + ;; TODO(adonovan): use -format=sexpr when available to avoid a + ;; dependency and to simplify parsing. + (let* ((res (with-current-buffer (go-guru--exec "definition" nil '("-format=json")) + (goto-char (point-min)) + (cdr (car (json-read))))) + (desc (cdr (assoc 'desc res)))) + (push-mark) + (ring-insert find-tag-marker-ring (point-marker)) + (go-guru--goto-pos (cdr (assoc 'objpos res))) + (message "%s" desc))) + +;;;###autoload +(defun go-guru-describe () + "Describe the selected syntax, its kind, type and methods." + (interactive) + (go-guru--run "describe")) + +;;;###autoload +(defun go-guru-pointsto () + "Show what the selected expression points to." + (interactive) + (go-guru--run "pointsto" t)) + +;;;###autoload +(defun go-guru-implements () + "Describe the 'implements' relation for types in the package +containing the current point." + (interactive) + (go-guru--run "implements")) + +;;;###autoload +(defun go-guru-freevars () + "Enumerate the free variables of the current selection." + (interactive) + (go-guru--run "freevars")) + +;;;###autoload +(defun go-guru-peers () + "Enumerate the set of possible corresponding sends/receives for +this channel receive/send operation." + (interactive) + (go-guru--run "peers" t)) + +;;;###autoload +(defun go-guru-referrers () + "Enumerate all references to the object denoted by the selected +identifier." + (interactive) + (go-guru--run "referrers")) + +;;;###autoload +(defun go-guru-whicherrs () + "Show globals, constants and types to which the selected +expression (of type 'error') may refer." + (interactive) + (go-guru--run "whicherrs" t)) + +(defun go-guru-what () + "Run a 'what' query and return the parsed JSON response as an +associative list." + (let ((res (with-current-buffer (go-guru--exec "what" nil '("-format=json") t) + (goto-char (point-min)) + (cdr (car (json-read)))))) + res)) + +(defun go-guru--hl-symbols (posn face id) + "Highlight the symbols at the positions POSN by creating +overlays with face FACE. The attribute 'go-guru-overlay on the +overlays will be set to ID." + (save-excursion + (mapc (lambda (pos) + (go-guru--goto-pos-no-file pos) + (let ((x (make-overlay (point) (+ (point) (length (current-word)))))) + (overlay-put x 'go-guru-overlay id) + (overlay-put x 'face face))) + posn))) + +;;;###autoload +(defun go-guru-unhighlight-identifiers () + "Remove highlights from previously highlighted identifier." + (remove-overlays nil nil 'go-guru-overlay 'sameid)) + +;;;###autoload +(defun go-guru-hl-identifier () + "Highlight all instances of the identifier under point. Removes +highlights from previously highlighted identifier." + (interactive) + (go-guru-unhighlight-identifiers) + (go-guru--hl-identifier)) + +(defun go-guru--hl-identifier () + "Highlight all instances of the identifier under point." + (let ((posn (cdr (assoc 'sameids (go-guru-what))))) + (go-guru--hl-symbols posn 'go-guru-hl-identifier-face 'sameid))) + +(defun go-guru--hl-identifiers-function () + "Function run after an idle timeout, highlighting the +identifier at point, if necessary." + (when go-guru-hl-identifier-mode + (unless (go-guru--on-overlay-p 'sameid) + ;; Ignore guru errors. Otherwise, we might end up with an error + ;; every time the timer runs, e.g. because of a malformed + ;; buffer. + (condition-case nil + (go-guru-hl-identifier) + (error nil))) + (unless (eq go-guru--current-hl-identifier-idle-time go-guru-hl-identifier-idle-time) + (go-guru--hl-set-timer)))) + +(defun go-guru--hl-set-timer () + (if go-guru--hl-identifier-timer + (cancel-timer go-guru--hl-identifier-timer)) + (setq go-guru--current-hl-identifier-idle-time go-guru-hl-identifier-idle-time) + (setq go-guru--hl-identifier-timer (run-with-idle-timer + go-guru-hl-identifier-idle-time + t + #'go-guru--hl-identifiers-function))) + +;;;###autoload +(define-minor-mode go-guru-hl-identifier-mode + "Highlight instances of the identifier at point after a short +timeout." + :group 'go-guru + (if go-guru-hl-identifier-mode + (progn + (go-guru--hl-set-timer) + ;; Unhighlight if point moves off identifier + (add-hook 'post-command-hook #'go-guru--hl-identifiers-post-command-hook nil t) + ;; Unhighlight any time the buffer changes + (add-hook 'before-change-functions #'go-guru--hl-identifiers-before-change-function nil t)) + (remove-hook 'post-command-hook #'go-guru--hl-identifiers-post-command-hook t) + (remove-hook 'before-change-functions #'go-guru--hl-identifiers-before-change-function t) + (go-guru-unhighlight-identifiers))) + +(defun go-guru--on-overlay-p (id) + "Return whether point is on a guru overlay of type ID." + (find-if (lambda (el) (eq (overlay-get el 'go-guru-overlay) id)) (overlays-at (point)))) + +(defun go-guru--hl-identifiers-post-command-hook () + (if (and go-guru-hl-identifier-mode + (not (go-guru--on-overlay-p 'sameid))) + (go-guru-unhighlight-identifiers))) + +(defun go-guru--hl-identifiers-before-change-function (_beg _end) + (go-guru-unhighlight-identifiers)) + +;; TODO(dominikh): a future feature may be to cycle through all uses +;; of an identifier. + +(provide 'go-guru) + +;;; go-guru.el ends here diff --git a/vendor/golang.org/x/tools/cmd/guru/guru.go b/vendor/golang.org/x/tools/cmd/guru/guru.go new file mode 100644 index 0000000000..e5b4b26960 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/guru.go @@ -0,0 +1,362 @@ +// 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 main + +// TODO(adonovan): new queries +// - show all statements that may update the selected lvalue +// (local, global, field, etc). +// - show all places where an object of type T is created +// (&T{}, var t T, new(T), new(struct{array [3]T}), etc. + +import ( + "fmt" + "go/ast" + "go/build" + "go/parser" + "go/token" + "go/types" + "io" + "path/filepath" + + "golang.org/x/tools/cmd/guru/serial" + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/buildutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/pointer" + "golang.org/x/tools/go/ssa" +) + +type printfFunc func(pos interface{}, format string, args ...interface{}) + +// queryResult is the interface of each query-specific result type. +type queryResult interface { + toSerial(res *serial.Result, fset *token.FileSet) + display(printf printfFunc) +} + +// A QueryPos represents the position provided as input to a query: +// a textual extent in the program's source code, the AST node it +// corresponds to, and the package to which it belongs. +// Instances are created by parseQueryPos. +type queryPos struct { + fset *token.FileSet + start, end token.Pos // source extent of query + path []ast.Node // AST path from query node to root of ast.File + exact bool // 2nd result of PathEnclosingInterval + info *loader.PackageInfo // type info for the queried package (nil for fastQueryPos) +} + +// TypeString prints type T relative to the query position. +func (qpos *queryPos) typeString(T types.Type) string { + return types.TypeString(T, types.RelativeTo(qpos.info.Pkg)) +} + +// ObjectString prints object obj relative to the query position. +func (qpos *queryPos) objectString(obj types.Object) string { + return types.ObjectString(obj, types.RelativeTo(qpos.info.Pkg)) +} + +// SelectionString prints selection sel relative to the query position. +func (qpos *queryPos) selectionString(sel *types.Selection) string { + return types.SelectionString(sel, types.RelativeTo(qpos.info.Pkg)) +} + +// A Query specifies a single guru query. +type Query struct { + Mode string // query mode ("callers", etc) + Pos string // query position + Build *build.Context // package loading configuration + + // pointer analysis options + Scope []string // main packages in (*loader.Config).FromArgs syntax + PTALog io.Writer // (optional) pointer-analysis log file + Reflection bool // model reflection soundly (currently slow). + + // Populated during Run() + Fset *token.FileSet + result queryResult +} + +// Serial returns an instance of serial.Result, which implements the +// {xml,json}.Marshaler interfaces so that query results can be +// serialized as JSON or XML. +// +func (q *Query) Serial() *serial.Result { + resj := &serial.Result{Mode: q.Mode} + q.result.toSerial(resj, q.Fset) + return resj +} + +// WriteTo writes the guru query result res to out in a compiler diagnostic format. +func (q *Query) WriteTo(out io.Writer) { + printf := func(pos interface{}, format string, args ...interface{}) { + fprintf(out, q.Fset, pos, format, args...) + } + q.result.display(printf) +} + +// Run runs an guru query and populates its Fset and Result. +func Run(q *Query) error { + switch q.Mode { + case "callees": + return callees(q) + case "callers": + return callers(q) + case "callstack": + return callstack(q) + case "peers": + return peers(q) + case "pointsto": + return pointsto(q) + case "whicherrs": + return whicherrs(q) + case "definition": + return definition(q) + case "describe": + return describe(q) + case "freevars": + return freevars(q) + case "implements": + return implements(q) + case "referrers": + return referrers(q) + case "what": + return what(q) + default: + return fmt.Errorf("invalid mode: %q", q.Mode) + } +} + +func setPTAScope(lconf *loader.Config, scope []string) error { + pkgs := buildutil.ExpandPatterns(lconf.Build, scope) + if len(pkgs) == 0 { + return fmt.Errorf("no packages specified for pointer analysis scope") + } + // The value of each entry in pkgs is true, + // giving ImportWithTests (not Import) semantics. + lconf.ImportPkgs = pkgs + return nil +} + +// Create a pointer.Config whose scope is the initial packages of lprog +// and their dependencies. +func setupPTA(prog *ssa.Program, lprog *loader.Program, ptaLog io.Writer, reflection bool) (*pointer.Config, error) { + // TODO(adonovan): the body of this function is essentially + // duplicated in all go/pointer clients. Refactor. + + // For each initial package (specified on the command line), + // if it has a main function, analyze that, + // otherwise analyze its tests, if any. + var testPkgs, mains []*ssa.Package + for _, info := range lprog.InitialPackages() { + initialPkg := prog.Package(info.Pkg) + + // Add package to the pointer analysis scope. + if initialPkg.Func("main") != nil { + mains = append(mains, initialPkg) + } else { + testPkgs = append(testPkgs, initialPkg) + } + } + if testPkgs != nil { + if p := prog.CreateTestMainPackage(testPkgs...); p != nil { + mains = append(mains, p) + } + } + if mains == nil { + return nil, fmt.Errorf("analysis scope has no main and no tests") + } + return &pointer.Config{ + Log: ptaLog, + Reflection: reflection, + Mains: mains, + }, nil +} + +// importQueryPackage finds the package P containing the +// query position and tells conf to import it. +// It returns the package's path. +func importQueryPackage(pos string, conf *loader.Config) (string, error) { + fqpos, err := fastQueryPos(conf.Build, pos) + if err != nil { + return "", err // bad query + } + filename := fqpos.fset.File(fqpos.start).Name() + + _, importPath, err := guessImportPath(filename, conf.Build) + if err != nil { + return "", err // can't find GOPATH dir + } + + // Check that it's possible to load the queried package. + // (e.g. guru tests contain different 'package' decls in same dir.) + // Keep consistent with logic in loader/util.go! + cfg2 := *conf.Build + cfg2.CgoEnabled = false + bp, err := cfg2.Import(importPath, "", 0) + if err != nil { + return "", err // no files for package + } + + switch pkgContainsFile(bp, filename) { + case 'T': + conf.ImportWithTests(importPath) + case 'X': + conf.ImportWithTests(importPath) + importPath += "_test" // for TypeCheckFuncBodies + case 'G': + conf.Import(importPath) + default: + // This happens for ad-hoc packages like + // $GOROOT/src/net/http/triv.go. + return "", fmt.Errorf("package %q doesn't contain file %s", + importPath, filename) + } + + conf.TypeCheckFuncBodies = func(p string) bool { return p == importPath } + + return importPath, nil +} + +// pkgContainsFile reports whether file was among the packages Go +// files, Test files, eXternal test files, or not found. +func pkgContainsFile(bp *build.Package, filename string) byte { + for i, files := range [][]string{bp.GoFiles, bp.TestGoFiles, bp.XTestGoFiles} { + for _, file := range files { + if sameFile(filepath.Join(bp.Dir, file), filename) { + return "GTX"[i] + } + } + } + return 0 // not found +} + +// ParseQueryPos parses the source query position pos and returns the +// AST node of the loaded program lprog that it identifies. +// If needExact, it must identify a single AST subtree; +// this is appropriate for queries that allow fairly arbitrary syntax, +// e.g. "describe". +// +func parseQueryPos(lprog *loader.Program, pos string, needExact bool) (*queryPos, error) { + filename, startOffset, endOffset, err := parsePos(pos) + if err != nil { + return nil, err + } + + // Find the named file among those in the loaded program. + var file *token.File + lprog.Fset.Iterate(func(f *token.File) bool { + if sameFile(filename, f.Name()) { + file = f + return false // done + } + return true // continue + }) + if file == nil { + return nil, fmt.Errorf("file %s not found in loaded program", filename) + } + + start, end, err := fileOffsetToPos(file, startOffset, endOffset) + if err != nil { + return nil, err + } + info, path, exact := lprog.PathEnclosingInterval(start, end) + if path == nil { + return nil, fmt.Errorf("no syntax here") + } + if needExact && !exact { + return nil, fmt.Errorf("ambiguous selection within %s", astutil.NodeDescription(path[0])) + } + return &queryPos{lprog.Fset, start, end, path, exact, info}, nil +} + +// ---------- Utilities ---------- + +// allowErrors causes type errors to be silently ignored. +// (Not suitable if SSA construction follows.) +func allowErrors(lconf *loader.Config) { + ctxt := *lconf.Build // copy + ctxt.CgoEnabled = false + lconf.Build = &ctxt + lconf.AllowErrors = true + // AllErrors makes the parser always return an AST instead of + // bailing out after 10 errors and returning an empty ast.File. + lconf.ParserMode = parser.AllErrors + lconf.TypeChecker.Error = func(err error) {} +} + +// ptrAnalysis runs the pointer analysis and returns its result. +func ptrAnalysis(conf *pointer.Config) *pointer.Result { + result, err := pointer.Analyze(conf) + if err != nil { + panic(err) // pointer analysis internal error + } + return result +} + +func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) } + +// deref returns a pointer's element type; otherwise it returns typ. +func deref(typ types.Type) types.Type { + if p, ok := typ.Underlying().(*types.Pointer); ok { + return p.Elem() + } + return typ +} + +// fprintf prints to w a message of the form "location: message\n" +// where location is derived from pos. +// +// pos must be one of: +// - a token.Pos, denoting a position +// - an ast.Node, denoting an interval +// - anything with a Pos() method: +// ssa.Member, ssa.Value, ssa.Instruction, types.Object, pointer.Label, etc. +// - a QueryPos, denoting the extent of the user's query. +// - nil, meaning no position at all. +// +// The output format is is compatible with the 'gnu' +// compilation-error-regexp in Emacs' compilation mode. +// TODO(adonovan): support other editors. +// +func fprintf(w io.Writer, fset *token.FileSet, pos interface{}, format string, args ...interface{}) { + var start, end token.Pos + switch pos := pos.(type) { + case ast.Node: + start = pos.Pos() + end = pos.End() + case token.Pos: + start = pos + end = start + case interface { + Pos() token.Pos + }: + start = pos.Pos() + end = start + case *queryPos: + start = pos.start + end = pos.end + case nil: + // no-op + default: + panic(fmt.Sprintf("invalid pos: %T", pos)) + } + + if sp := fset.Position(start); start == end { + // (prints "-: " for token.NoPos) + fmt.Fprintf(w, "%s: ", sp) + } else { + ep := fset.Position(end) + // The -1 below is a concession to Emacs's broken use of + // inclusive (not half-open) intervals. + // Other editors may not want it. + // TODO(adonovan): add an -editor=vim|emacs|acme|auto + // flag; auto uses EMACS=t / VIM=... / etc env vars. + fmt.Fprintf(w, "%s:%d.%d-%d.%d: ", + sp.Filename, sp.Line, sp.Column, ep.Line, ep.Column-1) + } + fmt.Fprintf(w, format, args...) + io.WriteString(w, "\n") +} diff --git a/vendor/golang.org/x/tools/cmd/guru/guru.vim b/vendor/golang.org/x/tools/cmd/guru/guru.vim new file mode 100644 index 0000000000..aab37d7390 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/guru.vim @@ -0,0 +1,107 @@ +" -*- text -*- +" guru.vim -- Vim integration for the Go guru. +" +" Load with (e.g.) :source guru.vim +" Call with (e.g.) :GoGuruDescribe +" while cursor or selection is over syntax of interest. +" Run :copen to show the quick-fix file. +" +" This is an absolutely rudimentary integration of the Go Guru into +" Vim's quickfix mechanism and it needs a number of usability +" improvements before it can be practically useful to Vim users. +" Voluntary contributions welcomed! +" +" TODO(adonovan): +" - reject buffers with no filename. +" - hide all filenames in quickfix buffer. + +" Get the path to the Go guru executable. +func! s:go_guru_bin() + let [ext, sep] = (has('win32') || has('win64') ? ['.exe', ';'] : ['', ':']) + let go_guru = globpath(join(split($GOPATH, sep), ','), '/bin/guru' . ext) + if go_guru == '' + let go_guru = globpath($GOROOT, '/bin/guru' . ext) + endif + return go_guru +endfunction + +let s:go_guru = s:go_guru_bin() + +func! s:qflist(output) + let qflist = [] + " Parse GNU-style 'file:line.col-line.col: message' format. + let mx = '^\(\a:[\\/][^:]\+\|[^:]\+\):\(\d\+\):\(\d\+\):\(.*\)$' + for line in split(a:output, "\n") + let ml = matchlist(line, mx) + " Ignore non-match lines or warnings + if ml == [] || ml[4] =~ '^ warning:' + continue + endif + let item = { + \ 'filename': ml[1], + \ 'text': ml[4], + \ 'lnum': ml[2], + \ 'col': ml[3], + \} + let bnr = bufnr(fnameescape(ml[1])) + if bnr != -1 + let item['bufnr'] = bnr + endif + call add(qflist, item) + endfor + call setqflist(qflist) + cwindow +endfun + +func! s:getpos(l, c) + if &encoding != 'utf-8' + let buf = a:l == 1 ? '' : (join(getline(1, a:l-1), "\n") . "\n") + let buf .= a:c == 1 ? '' : getline('.')[:a:c-2] + return len(iconv(buf, &encoding, 'utf-8')) + endif + return line2byte(a:l) + (a:c-2) +endfun + +func! s:RunGuru(mode, selected) range abort + let fname = expand('%:p') + let sname = get(g:, 'go_guru_scope_file', fname) + if a:selected != -1 + let pos1 = s:getpos(line("'<"), col("'<")) + let pos2 = s:getpos(line("'>"), col("'>")) + let cmd = printf('%s -scope=\'%s\' %s %s:#%d,#%d', + \ s:go_guru, + \ shellescape(fname), shellescape(sname), a:mode, pos1, pos2) + else + let pos = s:getpos(line('.'), col('.')) + let cmd = printf('%s -scope=\'%s\' %s %s:#%d', + \ s:go_guru, + \ shellescape(fname), shellescape(sname), a:mode, pos) + endif + call s:qflist(system(cmd)) +endfun + +" Describe the expression at the current point. +command! -range=% GoGuruDescribe + \ call s:RunGuru('describe', <count>) + +" Show possible callees of the function call at the current point. +command! -range=% GoGuruCallees + \ call s:RunGuru('callees', <count>) + +" Show the set of callers of the function containing the current point. +command! -range=% GoGuruCallers + \ call s:RunGuru('callers', <count>) + +" Show the callgraph of the current program. +command! -range=% GoGuruCallgraph + \ call s:RunGuru('callgraph', <count>) + +" Describe the 'implements' relation for types in the +" package containing the current point. +command! -range=% GoGuruImplements + \ call s:RunGuru('implements', <count>) + +" Enumerate the set of possible corresponding sends/receives for +" this channel receive/send operation. +command! -range=% GoGuruChannelPeers + \ call s:RunGuru('peers', <count>) diff --git a/vendor/golang.org/x/tools/cmd/guru/guru_test.go b/vendor/golang.org/x/tools/cmd/guru/guru_test.go new file mode 100644 index 0000000000..86e00a7756 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/guru_test.go @@ -0,0 +1,291 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main_test + +// This file defines a test framework for guru queries. +// +// The files beneath testdata/src/main contain Go programs containing +// query annotations of the form: +// +// @verb id "select" +// +// where verb is the query mode (e.g. "callers"), id is a unique name +// for this query, and "select" is a regular expression matching the +// substring of the current line that is the query's input selection. +// +// The expected output for each query is provided in the accompanying +// .golden file. +// +// (Location information is not included because it's too fragile to +// display as text. TODO(adonovan): think about how we can test its +// correctness, since it is critical information.) +// +// Run this test with: +// % go test golang.org/x/tools/cmd/guru -update +// to update the golden files. + +import ( + "bytes" + "encoding/json" + "flag" + "fmt" + "go/build" + "go/parser" + "go/token" + "io" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "regexp" + "runtime" + "strconv" + "strings" + "testing" + + guru "golang.org/x/tools/cmd/guru" +) + +var updateFlag = flag.Bool("update", false, "Update the golden files.") + +type query struct { + id string // unique id + verb string // query mode, e.g. "callees" + posn token.Position // query position + filename string + queryPos string // query position in command-line syntax +} + +func parseRegexp(text string) (*regexp.Regexp, error) { + pattern, err := strconv.Unquote(text) + if err != nil { + return nil, fmt.Errorf("can't unquote %s", text) + } + return regexp.Compile(pattern) +} + +// parseQueries parses and returns the queries in the named file. +func parseQueries(t *testing.T, filename string) []*query { + filedata, err := ioutil.ReadFile(filename) + if err != nil { + t.Fatal(err) + } + + // Parse the file once to discover the test queries. + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, filename, filedata, parser.ParseComments) + if err != nil { + t.Fatal(err) + } + + lines := bytes.Split(filedata, []byte("\n")) + + var queries []*query + queriesById := make(map[string]*query) + + // Find all annotations of these forms: + expectRe := regexp.MustCompile(`@([a-z]+)\s+(\S+)\s+(\".*)$`) // @verb id "regexp" + for _, c := range f.Comments { + text := strings.TrimSpace(c.Text()) + if text == "" || text[0] != '@' { + continue + } + posn := fset.Position(c.Pos()) + + // @verb id "regexp" + match := expectRe.FindStringSubmatch(text) + if match == nil { + t.Errorf("%s: ill-formed query: %s", posn, text) + continue + } + + id := match[2] + if prev, ok := queriesById[id]; ok { + t.Errorf("%s: duplicate id %s", posn, id) + t.Errorf("%s: previously used here", prev.posn) + continue + } + + q := &query{ + id: id, + verb: match[1], + filename: filename, + posn: posn, + } + + if match[3] != `"nopos"` { + selectRe, err := parseRegexp(match[3]) + if err != nil { + t.Errorf("%s: %s", posn, err) + continue + } + + // Find text of the current line, sans query. + // (Queries must be // not /**/ comments.) + line := lines[posn.Line-1][:posn.Column-1] + + // Apply regexp to current line to find input selection. + loc := selectRe.FindIndex(line) + if loc == nil { + t.Errorf("%s: selection pattern %s doesn't match line %q", + posn, match[3], string(line)) + continue + } + + // Assumes ASCII. TODO(adonovan): test on UTF-8. + linestart := posn.Offset - (posn.Column - 1) + + // Compute the file offsets. + q.queryPos = fmt.Sprintf("%s:#%d,#%d", + filename, linestart+loc[0], linestart+loc[1]) + } + + queries = append(queries, q) + queriesById[id] = q + } + + // Return the slice, not map, for deterministic iteration. + return queries +} + +// WriteResult writes res (-format=plain) to w, stripping file locations. +func WriteResult(w io.Writer, q *guru.Query) { + capture := new(bytes.Buffer) // capture standard output + q.WriteTo(capture) + for _, line := range strings.Split(capture.String(), "\n") { + // Remove a "file:line: " prefix. + if i := strings.Index(line, ": "); i >= 0 { + line = line[i+2:] + } + fmt.Fprintf(w, "%s\n", line) + } +} + +// doQuery poses query q to the guru and writes its response and +// error (if any) to out. +func doQuery(out io.Writer, q *query, useJson bool) { + fmt.Fprintf(out, "-------- @%s %s --------\n", q.verb, q.id) + + var buildContext = build.Default + buildContext.GOPATH = "testdata" + pkg := filepath.Dir(strings.TrimPrefix(q.filename, "testdata/src/")) + query := guru.Query{ + Mode: q.verb, + Pos: q.queryPos, + Build: &buildContext, + Scope: []string{pkg}, + Reflection: true, + } + if err := guru.Run(&query); err != nil { + fmt.Fprintf(out, "\nError: %s\n", err) + return + } + + if useJson { + // JSON output + b, err := json.MarshalIndent(query.Serial(), "", "\t") + if err != nil { + fmt.Fprintf(out, "JSON error: %s\n", err.Error()) + return + } + out.Write(b) + fmt.Fprintln(out) + } else { + // "plain" (compiler diagnostic format) output + WriteResult(out, &query) + } +} + +func TestGuru(t *testing.T) { + switch runtime.GOOS { + case "android": + t.Skipf("skipping test on %q (no testdata dir)", runtime.GOOS) + case "windows": + t.Skipf("skipping test on %q (no /usr/bin/diff)", runtime.GOOS) + } + + for _, filename := range []string{ + "testdata/src/calls/main.go", + "testdata/src/describe/main.go", + "testdata/src/freevars/main.go", + "testdata/src/implements/main.go", + "testdata/src/implements-methods/main.go", + "testdata/src/imports/main.go", + "testdata/src/peers/main.go", + "testdata/src/pointsto/main.go", + "testdata/src/referrers/main.go", + "testdata/src/reflection/main.go", + "testdata/src/what/main.go", + "testdata/src/whicherrs/main.go", + // JSON: + // TODO(adonovan): most of these are very similar; combine them. + "testdata/src/calls-json/main.go", + "testdata/src/peers-json/main.go", + "testdata/src/describe-json/main.go", + "testdata/src/implements-json/main.go", + "testdata/src/implements-methods-json/main.go", + "testdata/src/pointsto-json/main.go", + "testdata/src/referrers-json/main.go", + "testdata/src/what-json/main.go", + } { + useJson := strings.Contains(filename, "-json/") + queries := parseQueries(t, filename) + golden := filename + "lden" + got := filename + "t" + gotfh, err := os.Create(got) + if err != nil { + t.Errorf("Create(%s) failed: %s", got, err) + continue + } + defer gotfh.Close() + defer os.Remove(got) + + // Run the guru on each query, redirecting its output + // and error (if any) to the foo.got file. + for _, q := range queries { + doQuery(gotfh, q, useJson) + } + + // Compare foo.got with foo.golden. + var cmd *exec.Cmd + switch runtime.GOOS { + case "plan9": + cmd = exec.Command("/bin/diff", "-c", golden, got) + default: + cmd = exec.Command("/usr/bin/diff", "-u", golden, got) + } + buf := new(bytes.Buffer) + cmd.Stdout = buf + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + t.Errorf("Guru tests for %s failed: %s.\n%s\n", + filename, err, buf) + + if *updateFlag { + t.Logf("Updating %s...", golden) + if err := exec.Command("/bin/cp", got, golden).Run(); err != nil { + t.Errorf("Update failed: %s", err) + } + } + } + } +} + +func TestIssue14684(t *testing.T) { + var buildContext = build.Default + buildContext.GOPATH = "testdata" + query := guru.Query{ + Mode: "freevars", + Pos: "testdata/src/README.txt:#1", + Build: &buildContext, + } + err := guru.Run(&query) + if err == nil { + t.Fatal("guru query succeeded unexpectedly") + } + if got, want := err.Error(), "testdata/src/README.txt is not a Go source file"; got != want { + t.Errorf("query error was %q, want %q", got, want) + } +} diff --git a/vendor/golang.org/x/tools/cmd/guru/implements.go b/vendor/golang.org/x/tools/cmd/guru/implements.go new file mode 100644 index 0000000000..07a617dc49 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/implements.go @@ -0,0 +1,352 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" + "reflect" + "sort" + "strings" + + "golang.org/x/tools/cmd/guru/serial" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/types/typeutil" + "golang.org/x/tools/refactor/importgraph" +) + +// Implements displays the "implements" relation as it pertains to the +// selected type. +// If the selection is a method, 'implements' displays +// the corresponding methods of the types that would have been reported +// by an implements query on the receiver type. +// +func implements(q *Query) error { + lconf := loader.Config{Build: q.Build} + allowErrors(&lconf) + + qpkg, err := importQueryPackage(q.Pos, &lconf) + if err != nil { + return err + } + + // Set the packages to search. + if len(q.Scope) > 0 { + // Inspect all packages in the analysis scope, if specified. + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + } else { + // Otherwise inspect the forward and reverse + // transitive closure of the selected package. + // (In theory even this is incomplete.) + _, rev, _ := importgraph.Build(q.Build) + for path := range rev.Search(qpkg) { + lconf.ImportWithTests(path) + } + + // TODO(adonovan): for completeness, we should also + // type-check and inspect function bodies in all + // imported packages. This would be expensive, but we + // could optimize by skipping functions that do not + // contain type declarations. This would require + // changing the loader's TypeCheckFuncBodies hook to + // provide the []*ast.File. + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + // Find the selected type. + path, action := findInterestingNode(qpos.info, qpos.path) + + var method *types.Func + var T types.Type // selected type (receiver if method != nil) + + switch action { + case actionExpr: + // method? + if id, ok := path[0].(*ast.Ident); ok { + if obj, ok := qpos.info.ObjectOf(id).(*types.Func); ok { + recv := obj.Type().(*types.Signature).Recv() + if recv == nil { + return fmt.Errorf("this function is not a method") + } + method = obj + T = recv.Type() + } + } + case actionType: + T = qpos.info.TypeOf(path[0].(ast.Expr)) + } + if T == nil { + return fmt.Errorf("no type or method here") + } + + // Find all named types, even local types (which can have + // methods via promotion) and the built-in "error". + var allNamed []types.Type + for _, info := range lprog.AllPackages { + for _, obj := range info.Defs { + if obj, ok := obj.(*types.TypeName); ok { + allNamed = append(allNamed, obj.Type()) + } + } + } + allNamed = append(allNamed, types.Universe.Lookup("error").Type()) + + var msets typeutil.MethodSetCache + + // Test each named type. + var to, from, fromPtr []types.Type + for _, U := range allNamed { + if isInterface(T) { + if msets.MethodSet(T).Len() == 0 { + continue // empty interface + } + if isInterface(U) { + if msets.MethodSet(U).Len() == 0 { + continue // empty interface + } + + // T interface, U interface + if !types.Identical(T, U) { + if types.AssignableTo(U, T) { + to = append(to, U) + } + if types.AssignableTo(T, U) { + from = append(from, U) + } + } + } else { + // T interface, U concrete + if types.AssignableTo(U, T) { + to = append(to, U) + } else if pU := types.NewPointer(U); types.AssignableTo(pU, T) { + to = append(to, pU) + } + } + } else if isInterface(U) { + if msets.MethodSet(U).Len() == 0 { + continue // empty interface + } + + // T concrete, U interface + if types.AssignableTo(T, U) { + from = append(from, U) + } else if pT := types.NewPointer(T); types.AssignableTo(pT, U) { + fromPtr = append(fromPtr, U) + } + } + } + + var pos interface{} = qpos + if nt, ok := deref(T).(*types.Named); ok { + pos = nt.Obj() + } + + // Sort types (arbitrarily) to ensure test determinism. + sort.Sort(typesByString(to)) + sort.Sort(typesByString(from)) + sort.Sort(typesByString(fromPtr)) + + var toMethod, fromMethod, fromPtrMethod []*types.Selection // contain nils + if method != nil { + for _, t := range to { + toMethod = append(toMethod, + types.NewMethodSet(t).Lookup(method.Pkg(), method.Name())) + } + for _, t := range from { + fromMethod = append(fromMethod, + types.NewMethodSet(t).Lookup(method.Pkg(), method.Name())) + } + for _, t := range fromPtr { + fromPtrMethod = append(fromPtrMethod, + types.NewMethodSet(t).Lookup(method.Pkg(), method.Name())) + } + } + + q.result = &implementsResult{ + qpos, T, pos, to, from, fromPtr, method, toMethod, fromMethod, fromPtrMethod, + } + return nil +} + +type implementsResult struct { + qpos *queryPos + + t types.Type // queried type (not necessarily named) + pos interface{} // pos of t (*types.Name or *QueryPos) + to []types.Type // named or ptr-to-named types assignable to interface T + from []types.Type // named interfaces assignable from T + fromPtr []types.Type // named interfaces assignable only from *T + + // if a method was queried: + method *types.Func // queried method + toMethod []*types.Selection // method of type to[i], if any + fromMethod []*types.Selection // method of type from[i], if any + fromPtrMethod []*types.Selection // method of type fromPtrMethod[i], if any +} + +func (r *implementsResult) display(printf printfFunc) { + relation := "is implemented by" + + meth := func(sel *types.Selection) { + if sel != nil { + printf(sel.Obj(), "\t%s method (%s).%s", + relation, r.qpos.typeString(sel.Recv()), sel.Obj().Name()) + } + } + + if isInterface(r.t) { + if types.NewMethodSet(r.t).Len() == 0 { // TODO(adonovan): cache mset + printf(r.pos, "empty interface type %s", r.qpos.typeString(r.t)) + return + } + + if r.method == nil { + printf(r.pos, "interface type %s", r.qpos.typeString(r.t)) + } else { + printf(r.method, "abstract method %s", r.qpos.objectString(r.method)) + } + + // Show concrete types (or methods) first; use two passes. + for i, sub := range r.to { + if !isInterface(sub) { + if r.method == nil { + printf(deref(sub).(*types.Named).Obj(), "\t%s %s type %s", + relation, typeKind(sub), r.qpos.typeString(sub)) + } else { + meth(r.toMethod[i]) + } + } + } + for i, sub := range r.to { + if isInterface(sub) { + if r.method == nil { + printf(sub.(*types.Named).Obj(), "\t%s %s type %s", + relation, typeKind(sub), r.qpos.typeString(sub)) + } else { + meth(r.toMethod[i]) + } + } + } + + relation = "implements" + for i, super := range r.from { + if r.method == nil { + printf(super.(*types.Named).Obj(), "\t%s %s", + relation, r.qpos.typeString(super)) + } else { + meth(r.fromMethod[i]) + } + } + } else { + relation = "implements" + + if r.from != nil { + if r.method == nil { + printf(r.pos, "%s type %s", + typeKind(r.t), r.qpos.typeString(r.t)) + } else { + printf(r.method, "concrete method %s", + r.qpos.objectString(r.method)) + } + for i, super := range r.from { + if r.method == nil { + printf(super.(*types.Named).Obj(), "\t%s %s", + relation, r.qpos.typeString(super)) + } else { + meth(r.fromMethod[i]) + } + } + } + if r.fromPtr != nil { + if r.method == nil { + printf(r.pos, "pointer type *%s", r.qpos.typeString(r.t)) + } else { + // TODO(adonovan): de-dup (C).f and (*C).f implementing (I).f. + printf(r.method, "concrete method %s", + r.qpos.objectString(r.method)) + } + + for i, psuper := range r.fromPtr { + if r.method == nil { + printf(psuper.(*types.Named).Obj(), "\t%s %s", + relation, r.qpos.typeString(psuper)) + } else { + meth(r.fromPtrMethod[i]) + } + } + } else if r.from == nil { + printf(r.pos, "%s type %s implements only interface{}", + typeKind(r.t), r.qpos.typeString(r.t)) + } + } +} + +func (r *implementsResult) toSerial(res *serial.Result, fset *token.FileSet) { + res.Implements = &serial.Implements{ + T: makeImplementsType(r.t, fset), + AssignableTo: makeImplementsTypes(r.to, fset), + AssignableFrom: makeImplementsTypes(r.from, fset), + AssignableFromPtr: makeImplementsTypes(r.fromPtr, fset), + AssignableToMethod: methodsToSerial(r.qpos.info.Pkg, r.toMethod, fset), + AssignableFromMethod: methodsToSerial(r.qpos.info.Pkg, r.fromMethod, fset), + AssignableFromPtrMethod: methodsToSerial(r.qpos.info.Pkg, r.fromPtrMethod, fset), + } + if r.method != nil { + res.Implements.Method = &serial.DescribeMethod{ + Name: r.qpos.objectString(r.method), + Pos: fset.Position(r.method.Pos()).String(), + } + } +} + +func makeImplementsTypes(tt []types.Type, fset *token.FileSet) []serial.ImplementsType { + var r []serial.ImplementsType + for _, t := range tt { + r = append(r, makeImplementsType(t, fset)) + } + return r +} + +func makeImplementsType(T types.Type, fset *token.FileSet) serial.ImplementsType { + var pos token.Pos + if nt, ok := deref(T).(*types.Named); ok { // implementsResult.t may be non-named + pos = nt.Obj().Pos() + } + return serial.ImplementsType{ + Name: T.String(), + Pos: fset.Position(pos).String(), + Kind: typeKind(T), + } +} + +// typeKind returns a string describing the underlying kind of type, +// e.g. "slice", "array", "struct". +func typeKind(T types.Type) string { + s := reflect.TypeOf(T.Underlying()).String() + return strings.ToLower(strings.TrimPrefix(s, "*types.")) +} + +func isInterface(T types.Type) bool { return types.IsInterface(T) } + +type typesByString []types.Type + +func (p typesByString) Len() int { return len(p) } +func (p typesByString) Less(i, j int) bool { return p[i].String() < p[j].String() } +func (p typesByString) Swap(i, j int) { p[i], p[j] = p[j], p[i] } diff --git a/vendor/golang.org/x/tools/cmd/guru/main.go b/vendor/golang.org/x/tools/cmd/guru/main.go new file mode 100644 index 0000000000..b99b0584b9 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/main.go @@ -0,0 +1,292 @@ +// Copyright 2013 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. + +// guru: a tool for answering questions about Go source code. +// +// http://golang.org/s/oracle-design +// http://golang.org/s/oracle-user-manual +// +// Run with -help flag or help subcommand for usage information. +// +package main // import "golang.org/x/tools/cmd/guru" + +import ( + "bufio" + "bytes" + "encoding/json" + "encoding/xml" + "flag" + "fmt" + "go/build" + "io" + "io/ioutil" + "log" + "os" + "path/filepath" + "runtime/pprof" + "strconv" + "strings" + + "golang.org/x/tools/go/buildutil" +) + +// flags +var ( + modifiedFlag = flag.Bool("modified", false, "read archive of modified files from standard input") + scopeFlag = flag.String("scope", "", "comma-separated list of `packages` the analysis should be limited to") + ptalogFlag = flag.String("ptalog", "", "write points-to analysis log to `file`") + formatFlag = flag.String("format", "plain", "output `format`; one of {plain,json,xml}") + reflectFlag = flag.Bool("reflect", false, "analyze reflection soundly (slow)") + cpuprofileFlag = flag.String("cpuprofile", "", "write CPU profile to `file`") +) + +func init() { + flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc) +} + +const useHelp = "Run 'guru -help' for more information.\n" + +const helpMessage = `Go source code guru. +Usage: guru [flags] <mode> <position> + +The mode argument determines the query to perform: + + callees show possible targets of selected function call + callers show possible callers of selected function + callstack show path from callgraph root to selected function + definition show declaration of selected identifier + describe describe selected syntax: definition, methods, etc + freevars show free variables of selection + implements show 'implements' relation for selected type or method + peers show send/receive corresponding to selected channel op + pointsto show variables the selected pointer may point to + referrers show all refs to entity denoted by selected identifier + what show basic information about the selected syntax node + whicherrs show possible values of the selected error variable + +The position argument specifies the filename and byte offset (or range) +of the syntax element to query. For example: + + foo.go:#123,#128 + bar.go:#123 + +The -format flag controls the output format: + plain an editor-friendly format in which every line of output + is of the form "pos: text", where pos is "-" if unknown. + json structured data in JSON syntax. + xml structured data in XML syntax. + +The -modified flag causes guru to read an archive from standard input. + Files in this archive will be used in preference to those in + the file system. In this way, a text editor may supply guru + with the contents of its unsaved buffers. Each archive entry + consists of the file name, a newline, the decimal file size, + another newline, and the contents of the file. + +The -scope flag restricts analysis to the specified packages. + Its value is a comma-separated list of patterns of these forms: + golang.org/x/tools/cmd/guru # a single package + golang.org/x/tools/... # all packages beneath dir + ... # the entire workspace. + A pattern preceded by '-' is negative, so the scope + encoding/...,-encoding/xml + matches all encoding packages except encoding/xml. + +User manual: http://golang.org/s/oracle-user-manual + +Example: describe syntax at offset 530 in this file (an import spec): + + $ guru describe src/golang.org/x/tools/cmd/guru/main.go:#530 +` + +func printHelp() { + fmt.Fprintln(os.Stderr, helpMessage) + fmt.Fprintln(os.Stderr, "Flags:") + flag.PrintDefaults() +} + +func main() { + log.SetPrefix("guru: ") + log.SetFlags(0) + + // Don't print full help unless -help was requested. + // Just gently remind users that it's there. + flag.Usage = func() { fmt.Fprint(os.Stderr, useHelp) } + flag.CommandLine.Init(os.Args[0], flag.ContinueOnError) // hack + if err := flag.CommandLine.Parse(os.Args[1:]); err != nil { + // (err has already been printed) + if err == flag.ErrHelp { + printHelp() + } + os.Exit(2) + } + + args := flag.Args() + if len(args) != 2 { + flag.Usage() + os.Exit(2) + } + mode, posn := args[0], args[1] + + if mode == "help" { + printHelp() + os.Exit(2) + } + + // Set up points-to analysis log file. + var ptalog io.Writer + if *ptalogFlag != "" { + if f, err := os.Create(*ptalogFlag); err != nil { + log.Fatalf("Failed to create PTA log file: %s", err) + } else { + buf := bufio.NewWriter(f) + ptalog = buf + defer func() { + if err := buf.Flush(); err != nil { + log.Printf("flush: %s", err) + } + if err := f.Close(); err != nil { + log.Printf("close: %s", err) + } + }() + } + } + + // Profiling support. + if *cpuprofileFlag != "" { + f, err := os.Create(*cpuprofileFlag) + if err != nil { + log.Fatal(err) + } + pprof.StartCPUProfile(f) + defer pprof.StopCPUProfile() + } + + // -format flag + switch *formatFlag { + case "json", "plain", "xml": + // ok + default: + log.Fatalf("illegal -format value: %q.\n"+useHelp, *formatFlag) + } + + ctxt := &build.Default + + // If there were modified files, + // read them from the standard input and + // overlay them on the build context. + if *modifiedFlag { + modified, err := parseArchive(os.Stdin) + if err != nil { + log.Fatal(err) + } + + // All I/O done by guru needs to consult the modified map. + // The ReadFile done by referrers does, + // but the loader's cgo preprocessing currently does not. + + if len(modified) > 0 { + ctxt = useModifiedFiles(ctxt, modified) + } + } + + // Ask the guru. + query := Query{ + Mode: mode, + Pos: posn, + Build: ctxt, + Scope: strings.Split(*scopeFlag, ","), + PTALog: ptalog, + Reflection: *reflectFlag, + } + + if err := Run(&query); err != nil { + log.Fatal(err) + } + + // Print the result. + switch *formatFlag { + case "json": + b, err := json.MarshalIndent(query.Serial(), "", "\t") + if err != nil { + log.Fatalf("JSON error: %s", err) + } + os.Stdout.Write(b) + + case "xml": + b, err := xml.MarshalIndent(query.Serial(), "", "\t") + if err != nil { + log.Fatalf("XML error: %s", err) + } + os.Stdout.Write(b) + + case "plain": + query.WriteTo(os.Stdout) + } +} + +func parseArchive(archive io.Reader) (map[string][]byte, error) { + modified := make(map[string][]byte) + r := bufio.NewReader(archive) + for { + // Read file name. + filename, err := r.ReadString('\n') + if err != nil { + if err == io.EOF { + break // OK + } + return nil, fmt.Errorf("reading modified file name: %v", err) + } + filename = filepath.Clean(strings.TrimSpace(filename)) + + // Read file size. + sz, err := r.ReadString('\n') + if err != nil { + return nil, fmt.Errorf("reading size of modified file %s: %v", filename, err) + } + sz = strings.TrimSpace(sz) + size, err := strconv.ParseInt(sz, 10, 32) + if err != nil { + return nil, fmt.Errorf("parsing size of modified file %s: %v", filename, err) + } + + // Read file content. + var content bytes.Buffer + content.Grow(int(size)) + if _, err := io.CopyN(&content, r, size); err != nil { + return nil, fmt.Errorf("reading modified file %s: %v", filename, err) + } + modified[filename] = content.Bytes() + } + + return modified, nil +} + +// useModifiedFiles augments the provided build.Context by the +// mapping from file names to alternative contents. +func useModifiedFiles(orig *build.Context, modified map[string][]byte) *build.Context { + rc := func(data []byte) (io.ReadCloser, error) { + return ioutil.NopCloser(bytes.NewBuffer(data)), nil + } + + copy := *orig // make a copy + ctxt := © + ctxt.OpenFile = func(path string) (io.ReadCloser, error) { + // Fast path: names match exactly. + if content, ok := modified[path]; ok { + return rc(content) + } + + // Slow path: check for same file under a different + // alias, perhaps due to a symbolic link. + for filename, content := range modified { + if sameFile(path, filename) { + return rc(content) + } + } + + return buildutil.OpenFile(orig, path) + } + return ctxt +} diff --git a/vendor/golang.org/x/tools/cmd/guru/peers.go b/vendor/golang.org/x/tools/cmd/guru/peers.go new file mode 100644 index 0000000000..1d3ed15a78 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/peers.go @@ -0,0 +1,252 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" + "sort" + + "golang.org/x/tools/cmd/guru/serial" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +// peers enumerates, for a given channel send (or receive) operation, +// the set of possible receives (or sends) that correspond to it. +// +// TODO(adonovan): support reflect.{Select,Recv,Send,Close}. +// TODO(adonovan): permit the user to query based on a MakeChan (not send/recv), +// or the implicit receive in "for v := range ch". +func peers(q *Query) error { + lconf := loader.Config{Build: q.Build} + + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug) + + ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection) + if err != nil { + return err + } + + opPos := findOp(qpos) + if opPos == token.NoPos { + return fmt.Errorf("there is no channel operation here") + } + + // Defer SSA construction till after errors are reported. + prog.Build() + + var queryOp chanOp // the originating send or receive operation + var ops []chanOp // all sends/receives of opposite direction + + // Look at all channel operations in the whole ssa.Program. + // Build a list of those of same type as the query. + allFuncs := ssautil.AllFunctions(prog) + for fn := range allFuncs { + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + for _, op := range chanOps(instr) { + ops = append(ops, op) + if op.pos == opPos { + queryOp = op // we found the query op + } + } + } + } + } + if queryOp.ch == nil { + return fmt.Errorf("ssa.Instruction for send/receive not found") + } + + // Discard operations of wrong channel element type. + // Build set of channel ssa.Values as query to pointer analysis. + // We compare channels by element types, not channel types, to + // ignore both directionality and type names. + queryType := queryOp.ch.Type() + queryElemType := queryType.Underlying().(*types.Chan).Elem() + ptaConfig.AddQuery(queryOp.ch) + i := 0 + for _, op := range ops { + if types.Identical(op.ch.Type().Underlying().(*types.Chan).Elem(), queryElemType) { + ptaConfig.AddQuery(op.ch) + ops[i] = op + i++ + } + } + ops = ops[:i] + + // Run the pointer analysis. + ptares := ptrAnalysis(ptaConfig) + + // Find the points-to set. + queryChanPtr := ptares.Queries[queryOp.ch] + + // Ascertain which make(chan) labels the query's channel can alias. + var makes []token.Pos + for _, label := range queryChanPtr.PointsTo().Labels() { + makes = append(makes, label.Pos()) + } + sort.Sort(byPos(makes)) + + // Ascertain which channel operations can alias the same make(chan) labels. + var sends, receives, closes []token.Pos + for _, op := range ops { + if ptr, ok := ptares.Queries[op.ch]; ok && ptr.MayAlias(queryChanPtr) { + switch op.dir { + case types.SendOnly: + sends = append(sends, op.pos) + case types.RecvOnly: + receives = append(receives, op.pos) + case types.SendRecv: + closes = append(closes, op.pos) + } + } + } + sort.Sort(byPos(sends)) + sort.Sort(byPos(receives)) + sort.Sort(byPos(closes)) + + q.result = &peersResult{ + queryPos: opPos, + queryType: queryType, + makes: makes, + sends: sends, + receives: receives, + closes: closes, + } + return nil +} + +// findOp returns the position of the enclosing send/receive/close op. +// For send and receive operations, this is the position of the <- token; +// for close operations, it's the Lparen of the function call. +// +// TODO(adonovan): handle implicit receive operations from 'for...range chan' statements. +func findOp(qpos *queryPos) token.Pos { + for _, n := range qpos.path { + switch n := n.(type) { + case *ast.UnaryExpr: + if n.Op == token.ARROW { + return n.OpPos + } + case *ast.SendStmt: + return n.Arrow + case *ast.CallExpr: + // close function call can only exist as a direct identifier + if close, ok := unparen(n.Fun).(*ast.Ident); ok { + if b, ok := qpos.info.Info.Uses[close].(*types.Builtin); ok && b.Name() == "close" { + return n.Lparen + } + } + } + } + return token.NoPos +} + +// chanOp abstracts an ssa.Send, ssa.Unop(ARROW), or a SelectState. +type chanOp struct { + ch ssa.Value + dir types.ChanDir // SendOnly=send, RecvOnly=recv, SendRecv=close + pos token.Pos +} + +// chanOps returns a slice of all the channel operations in the instruction. +func chanOps(instr ssa.Instruction) []chanOp { + // TODO(adonovan): handle calls to reflect.{Select,Recv,Send,Close} too. + var ops []chanOp + switch instr := instr.(type) { + case *ssa.UnOp: + if instr.Op == token.ARROW { + ops = append(ops, chanOp{instr.X, types.RecvOnly, instr.Pos()}) + } + case *ssa.Send: + ops = append(ops, chanOp{instr.Chan, types.SendOnly, instr.Pos()}) + case *ssa.Select: + for _, st := range instr.States { + ops = append(ops, chanOp{st.Chan, st.Dir, st.Pos}) + } + case ssa.CallInstruction: + cc := instr.Common() + if b, ok := cc.Value.(*ssa.Builtin); ok && b.Name() == "close" { + ops = append(ops, chanOp{cc.Args[0], types.SendRecv, cc.Pos()}) + } + } + return ops +} + +type peersResult struct { + queryPos token.Pos // of queried channel op + queryType types.Type // type of queried channel + makes, sends, receives, closes []token.Pos // positions of aliased makechan/send/receive/close instrs +} + +func (r *peersResult) display(printf printfFunc) { + if len(r.makes) == 0 { + printf(r.queryPos, "This channel can't point to anything.") + return + } + printf(r.queryPos, "This channel of type %s may be:", r.queryType) + for _, alloc := range r.makes { + printf(alloc, "\tallocated here") + } + for _, send := range r.sends { + printf(send, "\tsent to, here") + } + for _, receive := range r.receives { + printf(receive, "\treceived from, here") + } + for _, clos := range r.closes { + printf(clos, "\tclosed, here") + } +} + +func (r *peersResult) toSerial(res *serial.Result, fset *token.FileSet) { + peers := &serial.Peers{ + Pos: fset.Position(r.queryPos).String(), + Type: r.queryType.String(), + } + for _, alloc := range r.makes { + peers.Allocs = append(peers.Allocs, fset.Position(alloc).String()) + } + for _, send := range r.sends { + peers.Sends = append(peers.Sends, fset.Position(send).String()) + } + for _, receive := range r.receives { + peers.Receives = append(peers.Receives, fset.Position(receive).String()) + } + for _, clos := range r.closes { + peers.Closes = append(peers.Closes, fset.Position(clos).String()) + } + res.Peers = peers +} + +// -------- utils -------- + +// NB: byPos is not deterministic across packages since it depends on load order. +// Use lessPos if the tests need it. +type byPos []token.Pos + +func (p byPos) Len() int { return len(p) } +func (p byPos) Less(i, j int) bool { return p[i] < p[j] } +func (p byPos) Swap(i, j int) { p[i], p[j] = p[j], p[i] } diff --git a/vendor/golang.org/x/tools/cmd/guru/pointsto.go b/vendor/golang.org/x/tools/cmd/guru/pointsto.go new file mode 100644 index 0000000000..65fff7b4d2 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/pointsto.go @@ -0,0 +1,291 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" + "sort" + + "golang.org/x/tools/cmd/guru/serial" + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/pointer" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +// pointsto runs the pointer analysis on the selected expression, +// and reports its points-to set (for a pointer-like expression) +// or its dynamic types (for an interface, reflect.Value, or +// reflect.Type expression) and their points-to sets. +// +// All printed sets are sorted to ensure determinism. +// +func pointsto(q *Query) error { + lconf := loader.Config{Build: q.Build} + + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, true) // needs exact pos + if err != nil { + return err + } + + prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug) + + ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection) + if err != nil { + return err + } + + path, action := findInterestingNode(qpos.info, qpos.path) + if action != actionExpr { + return fmt.Errorf("pointer analysis wants an expression; got %s", + astutil.NodeDescription(qpos.path[0])) + } + + var expr ast.Expr + var obj types.Object + switch n := path[0].(type) { + case *ast.ValueSpec: + // ambiguous ValueSpec containing multiple names + return fmt.Errorf("multiple value specification") + case *ast.Ident: + obj = qpos.info.ObjectOf(n) + expr = n + case ast.Expr: + expr = n + default: + // TODO(adonovan): is this reachable? + return fmt.Errorf("unexpected AST for expr: %T", n) + } + + // Reject non-pointerlike types (includes all constants---except nil). + // TODO(adonovan): reject nil too. + typ := qpos.info.TypeOf(expr) + if !pointer.CanPoint(typ) { + return fmt.Errorf("pointer analysis wants an expression of reference type; got %s", typ) + } + + // Determine the ssa.Value for the expression. + var value ssa.Value + var isAddr bool + if obj != nil { + // def/ref of func/var object + value, isAddr, err = ssaValueForIdent(prog, qpos.info, obj, path) + } else { + value, isAddr, err = ssaValueForExpr(prog, qpos.info, path) + } + if err != nil { + return err // e.g. trivially dead code + } + + // Defer SSA construction till after errors are reported. + prog.Build() + + // Run the pointer analysis. + ptrs, err := runPTA(ptaConfig, value, isAddr) + if err != nil { + return err // e.g. analytically unreachable + } + + q.result = &pointstoResult{ + qpos: qpos, + typ: typ, + ptrs: ptrs, + } + return nil +} + +// ssaValueForIdent returns the ssa.Value for the ast.Ident whose path +// to the root of the AST is path. isAddr reports whether the +// ssa.Value is the address denoted by the ast.Ident, not its value. +// +func ssaValueForIdent(prog *ssa.Program, qinfo *loader.PackageInfo, obj types.Object, path []ast.Node) (value ssa.Value, isAddr bool, err error) { + switch obj := obj.(type) { + case *types.Var: + pkg := prog.Package(qinfo.Pkg) + pkg.Build() + if v, addr := prog.VarValue(obj, pkg, path); v != nil { + return v, addr, nil + } + return nil, false, fmt.Errorf("can't locate SSA Value for var %s", obj.Name()) + + case *types.Func: + fn := prog.FuncValue(obj) + if fn == nil { + return nil, false, fmt.Errorf("%s is an interface method", obj) + } + // TODO(adonovan): there's no point running PTA on a *Func ident. + // Eliminate this feature. + return fn, false, nil + } + panic(obj) +} + +// ssaValueForExpr returns the ssa.Value of the non-ast.Ident +// expression whose path to the root of the AST is path. +// +func ssaValueForExpr(prog *ssa.Program, qinfo *loader.PackageInfo, path []ast.Node) (value ssa.Value, isAddr bool, err error) { + pkg := prog.Package(qinfo.Pkg) + pkg.SetDebugMode(true) + pkg.Build() + + fn := ssa.EnclosingFunction(pkg, path) + if fn == nil { + return nil, false, fmt.Errorf("no SSA function built for this location (dead code?)") + } + + if v, addr := fn.ValueForExpr(path[0].(ast.Expr)); v != nil { + return v, addr, nil + } + + return nil, false, fmt.Errorf("can't locate SSA Value for expression in %s", fn) +} + +// runPTA runs the pointer analysis of the selected SSA value or address. +func runPTA(conf *pointer.Config, v ssa.Value, isAddr bool) (ptrs []pointerResult, err error) { + T := v.Type() + if isAddr { + conf.AddIndirectQuery(v) + T = deref(T) + } else { + conf.AddQuery(v) + } + ptares := ptrAnalysis(conf) + + var ptr pointer.Pointer + if isAddr { + ptr = ptares.IndirectQueries[v] + } else { + ptr = ptares.Queries[v] + } + if ptr == (pointer.Pointer{}) { + return nil, fmt.Errorf("pointer analysis did not find expression (dead code?)") + } + pts := ptr.PointsTo() + + if pointer.CanHaveDynamicTypes(T) { + // Show concrete types for interface/reflect.Value expression. + if concs := pts.DynamicTypes(); concs.Len() > 0 { + concs.Iterate(func(conc types.Type, pta interface{}) { + labels := pta.(pointer.PointsToSet).Labels() + sort.Sort(byPosAndString(labels)) // to ensure determinism + ptrs = append(ptrs, pointerResult{conc, labels}) + }) + } + } else { + // Show labels for other expressions. + labels := pts.Labels() + sort.Sort(byPosAndString(labels)) // to ensure determinism + ptrs = append(ptrs, pointerResult{T, labels}) + } + sort.Sort(byTypeString(ptrs)) // to ensure determinism + return ptrs, nil +} + +type pointerResult struct { + typ types.Type // type of the pointer (always concrete) + labels []*pointer.Label // set of labels +} + +type pointstoResult struct { + qpos *queryPos + typ types.Type // type of expression + ptrs []pointerResult // pointer info (typ is concrete => len==1) +} + +func (r *pointstoResult) display(printf printfFunc) { + if pointer.CanHaveDynamicTypes(r.typ) { + // Show concrete types for interface, reflect.Type or + // reflect.Value expression. + + if len(r.ptrs) > 0 { + printf(r.qpos, "this %s may contain these dynamic types:", r.qpos.typeString(r.typ)) + for _, ptr := range r.ptrs { + var obj types.Object + if nt, ok := deref(ptr.typ).(*types.Named); ok { + obj = nt.Obj() + } + if len(ptr.labels) > 0 { + printf(obj, "\t%s, may point to:", r.qpos.typeString(ptr.typ)) + printLabels(printf, ptr.labels, "\t\t") + } else { + printf(obj, "\t%s", r.qpos.typeString(ptr.typ)) + } + } + } else { + printf(r.qpos, "this %s cannot contain any dynamic types.", r.typ) + } + } else { + // Show labels for other expressions. + if ptr := r.ptrs[0]; len(ptr.labels) > 0 { + printf(r.qpos, "this %s may point to these objects:", + r.qpos.typeString(r.typ)) + printLabels(printf, ptr.labels, "\t") + } else { + printf(r.qpos, "this %s may not point to anything.", + r.qpos.typeString(r.typ)) + } + } +} + +func (r *pointstoResult) toSerial(res *serial.Result, fset *token.FileSet) { + var pts []serial.PointsTo + for _, ptr := range r.ptrs { + var namePos string + if nt, ok := deref(ptr.typ).(*types.Named); ok { + namePos = fset.Position(nt.Obj().Pos()).String() + } + var labels []serial.PointsToLabel + for _, l := range ptr.labels { + labels = append(labels, serial.PointsToLabel{ + Pos: fset.Position(l.Pos()).String(), + Desc: l.String(), + }) + } + pts = append(pts, serial.PointsTo{ + Type: r.qpos.typeString(ptr.typ), + NamePos: namePos, + Labels: labels, + }) + } + res.PointsTo = pts +} + +type byTypeString []pointerResult + +func (a byTypeString) Len() int { return len(a) } +func (a byTypeString) Less(i, j int) bool { return a[i].typ.String() < a[j].typ.String() } +func (a byTypeString) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type byPosAndString []*pointer.Label + +func (a byPosAndString) Len() int { return len(a) } +func (a byPosAndString) Less(i, j int) bool { + cmp := a[i].Pos() - a[j].Pos() + return cmp < 0 || (cmp == 0 && a[i].String() < a[j].String()) +} +func (a byPosAndString) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +func printLabels(printf printfFunc, labels []*pointer.Label, prefix string) { + // TODO(adonovan): due to context-sensitivity, many of these + // labels may differ only by context, which isn't apparent. + for _, label := range labels { + printf(label, "%s%s", prefix, label) + } +} diff --git a/vendor/golang.org/x/tools/cmd/guru/pos.go b/vendor/golang.org/x/tools/cmd/guru/pos.go new file mode 100644 index 0000000000..591aad8e5c --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/pos.go @@ -0,0 +1,142 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +// This file defines utilities for working with file positions. + +import ( + "fmt" + "go/build" + "go/parser" + "go/token" + "os" + "path/filepath" + "strconv" + "strings" + + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/buildutil" +) + +// parseOctothorpDecimal returns the numeric value if s matches "#%d", +// otherwise -1. +func parseOctothorpDecimal(s string) int { + if s != "" && s[0] == '#' { + if s, err := strconv.ParseInt(s[1:], 10, 32); err == nil { + return int(s) + } + } + return -1 +} + +// parsePos parses a string of the form "file:pos" or +// file:start,end" where pos, start, end match #%d and represent byte +// offsets, and returns its components. +// +// (Numbers without a '#' prefix are reserved for future use, +// e.g. to indicate line/column positions.) +// +func parsePos(pos string) (filename string, startOffset, endOffset int, err error) { + if pos == "" { + err = fmt.Errorf("no source position specified") + return + } + + colon := strings.LastIndex(pos, ":") + if colon < 0 { + err = fmt.Errorf("bad position syntax %q", pos) + return + } + filename, offset := pos[:colon], pos[colon+1:] + startOffset = -1 + endOffset = -1 + if hyphen := strings.Index(offset, ","); hyphen < 0 { + // e.g. "foo.go:#123" + startOffset = parseOctothorpDecimal(offset) + endOffset = startOffset + } else { + // e.g. "foo.go:#123,#456" + startOffset = parseOctothorpDecimal(offset[:hyphen]) + endOffset = parseOctothorpDecimal(offset[hyphen+1:]) + } + if startOffset < 0 || endOffset < 0 { + err = fmt.Errorf("invalid offset %q in query position", offset) + return + } + return +} + +// fileOffsetToPos translates the specified file-relative byte offsets +// into token.Pos form. It returns an error if the file was not found +// or the offsets were out of bounds. +// +func fileOffsetToPos(file *token.File, startOffset, endOffset int) (start, end token.Pos, err error) { + // Range check [start..end], inclusive of both end-points. + + if 0 <= startOffset && startOffset <= file.Size() { + start = file.Pos(int(startOffset)) + } else { + err = fmt.Errorf("start position is beyond end of file") + return + } + + if 0 <= endOffset && endOffset <= file.Size() { + end = file.Pos(int(endOffset)) + } else { + err = fmt.Errorf("end position is beyond end of file") + return + } + + return +} + +// sameFile returns true if x and y have the same basename and denote +// the same file. +// +func sameFile(x, y string) bool { + if filepath.Base(x) == filepath.Base(y) { // (optimisation) + if xi, err := os.Stat(x); err == nil { + if yi, err := os.Stat(y); err == nil { + return os.SameFile(xi, yi) + } + } + } + return false +} + +// fastQueryPos parses the position string and returns a queryPos. +// It parses only a single file and does not run the type checker. +func fastQueryPos(ctxt *build.Context, pos string) (*queryPos, error) { + filename, startOffset, endOffset, err := parsePos(pos) + if err != nil { + return nil, err + } + + // Parse the file, opening it the file via the build.Context + // so that we observe the effects of the -modified flag. + fset := token.NewFileSet() + cwd, _ := os.Getwd() + f, err := buildutil.ParseFile(fset, ctxt, nil, cwd, filename, parser.Mode(0)) + // ParseFile usually returns a partial file along with an error. + // Only fail if there is no file. + if f == nil { + return nil, err + } + if !f.Pos().IsValid() { + return nil, fmt.Errorf("%s is not a Go source file", filename) + } + + start, end, err := fileOffsetToPos(fset.File(f.Pos()), startOffset, endOffset) + if err != nil { + return nil, err + } + + path, exact := astutil.PathEnclosingInterval(f, start, end) + if path == nil { + return nil, fmt.Errorf("no syntax here") + } + + return &queryPos{fset, start, end, path, exact, nil}, nil +} diff --git a/vendor/golang.org/x/tools/cmd/guru/referrers.go b/vendor/golang.org/x/tools/cmd/guru/referrers.go new file mode 100644 index 0000000000..15fcf04c44 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/referrers.go @@ -0,0 +1,472 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "bytes" + "fmt" + "go/ast" + "go/build" + "go/token" + "go/types" + "io" + "log" + "sort" + "strings" + "sync" + + "golang.org/x/tools/cmd/guru/serial" + "golang.org/x/tools/go/buildutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/refactor/importgraph" +) + +// Referrers reports all identifiers that resolve to the same object +// as the queried identifier, within any package in the workspace. +func referrers(q *Query) error { + fset := token.NewFileSet() + lconf := loader.Config{Fset: fset, Build: q.Build} + allowErrors(&lconf) + + if _, err := importQueryPackage(q.Pos, &lconf); err != nil { + return err + } + + // Load/parse/type-check the query package. + lprog, err := lconf.Load() + if err != nil { + return err + } + + qpos, err := parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + id, _ := qpos.path[0].(*ast.Ident) + if id == nil { + return fmt.Errorf("no identifier here") + } + + obj := qpos.info.ObjectOf(id) + if obj == nil { + // Happens for y in "switch y := x.(type)", + // the package declaration, + // and unresolved identifiers. + if _, ok := qpos.path[1].(*ast.File); ok { // package decl? + return packageReferrers(q, qpos.info.Pkg.Path()) + } + return fmt.Errorf("no object for identifier: %T", qpos.path[1]) + } + + // Imported package name? + if pkgname, ok := obj.(*types.PkgName); ok { + return packageReferrers(q, pkgname.Imported().Path()) + } + + if obj.Pkg() == nil { + return fmt.Errorf("references to predeclared %q are everywhere!", obj.Name()) + } + + // For a globally accessible object defined in package P, we + // must load packages that depend on P. Specifically, for a + // package-level object, we need load only direct importers + // of P, but for a field or interface method, we must load + // any package that transitively imports P. + if global, pkglevel := classify(obj); global { + // We'll use the the object's position to identify it in the larger program. + objposn := fset.Position(obj.Pos()) + defpkg := obj.Pkg().Path() // defining package + return globalReferrers(q, qpos.info.Pkg.Path(), defpkg, objposn, pkglevel) + } + + // Find uses of obj within the query package. + refs := usesOf(obj, qpos.info) + sort.Sort(byNamePos{fset, refs}) + q.Fset = fset + q.result = &referrersResult{ + build: q.Build, + fset: fset, + qinfo: qpos.info, + obj: obj, + refs: refs, + } + return nil // success +} + +// classify classifies objects by how far +// we have to look to find references to them. +func classify(obj types.Object) (global, pkglevel bool) { + if obj.Exported() { + if obj.Parent() == nil { + // selectable object (field or method) + return true, false + } + if obj.Parent() == obj.Pkg().Scope() { + // lexical object (package-level var/const/func/type) + return true, true + } + } + // object with unexported named or defined in local scope + return false, false +} + +// packageReferrers finds all references to the specified package +// throughout the workspace and populates q.result. +func packageReferrers(q *Query, path string) error { + // Scan the workspace and build the import graph. + // Ignore broken packages. + _, rev, _ := importgraph.Build(q.Build) + + // Find the set of packages that directly import the query package. + // Only those packages need typechecking of function bodies. + users := rev[path] + + // Load the larger program. + fset := token.NewFileSet() + lconf := loader.Config{ + Fset: fset, + Build: q.Build, + TypeCheckFuncBodies: func(p string) bool { + return users[strings.TrimSuffix(p, "_test")] + }, + } + allowErrors(&lconf) + for path := range users { + lconf.ImportWithTests(path) + } + lprog, err := lconf.Load() + if err != nil { + return err + } + + // Find uses of [a fake PkgName that imports] the package. + // + // TODO(adonovan): perhaps more useful would be to show imports + // of the package instead of qualified identifiers. + qinfo := lprog.Package(path) + obj := types.NewPkgName(token.NoPos, qinfo.Pkg, qinfo.Pkg.Name(), qinfo.Pkg) + refs := usesOf(obj, lprog.InitialPackages()...) + sort.Sort(byNamePos{fset, refs}) + q.Fset = fset + q.result = &referrersResult{ + build: q.Build, + fset: fset, + qinfo: qinfo, + obj: obj, + refs: refs, + } + return nil +} + +// globalReferrers finds references throughout the entire workspace to the +// object at the specified source position. Its defining package is defpkg, +// and the query package is qpkg. isPkgLevel indicates whether the object +// is defined at package-level. +func globalReferrers(q *Query, qpkg, defpkg string, objposn token.Position, isPkgLevel bool) error { + // Scan the workspace and build the import graph. + // Ignore broken packages. + _, rev, _ := importgraph.Build(q.Build) + + // Find the set of packages that depend on defpkg. + // Only function bodies in those packages need type-checking. + var users map[string]bool + if isPkgLevel { + users = rev[defpkg] // direct importers + if users == nil { + users = make(map[string]bool) + } + users[defpkg] = true // plus the defining package itself + } else { + users = rev.Search(defpkg) // transitive importers + } + + // Prepare to load the larger program. + fset := token.NewFileSet() + lconf := loader.Config{ + Fset: fset, + Build: q.Build, + TypeCheckFuncBodies: func(p string) bool { + return users[strings.TrimSuffix(p, "_test")] + }, + } + allowErrors(&lconf) + + // The importgraph doesn't treat external test packages + // as separate nodes, so we must use ImportWithTests. + for path := range users { + lconf.ImportWithTests(path) + } + + // The remainder of this function is somewhat tricky because it + // operates on the concurrent stream of packages observed by the + // loader's AfterTypeCheck hook. Most of guru's helper + // functions assume the entire program has already been loaded, + // so we can't use them here. + // TODO(adonovan): smooth things out once the other changes have landed. + + var ( + mu sync.Mutex + qobj types.Object + qinfo *loader.PackageInfo // info for qpkg + ) + + // For efficiency, we scan each package for references + // just after it has been type-checked. The loader calls + // AfterTypeCheck (concurrently), providing us with a stream of + // packages. + ch := make(chan []*ast.Ident) + lconf.AfterTypeCheck = func(info *loader.PackageInfo, files []*ast.File) { + // Only inspect packages that depend on the declaring package + // (and thus were type-checked). + if lconf.TypeCheckFuncBodies(info.Pkg.Path()) { + // Record the query object and its package when we see it. + mu.Lock() + if qobj == nil && info.Pkg.Path() == defpkg { + // Find the object by its position (slightly ugly). + qobj = findObject(fset, &info.Info, objposn) + if qobj == nil { + // It really ought to be there; + // we found it once already. + log.Fatalf("object at %s not found in package %s", + objposn, defpkg) + } + qinfo = info + } + obj := qobj + mu.Unlock() + + // Look for references to the query object. + if obj != nil { + ch <- usesOf(obj, info) + } + } + + // TODO(adonovan): opt: save memory by eliminating unneeded scopes/objects. + // (Requires go/types change for Go 1.7.) + // info.Pkg.Scope().ClearChildren() + + // Discard the file ASTs and their accumulated type + // information to save memory. + info.Files = nil + info.Defs = make(map[*ast.Ident]types.Object) + info.Uses = make(map[*ast.Ident]types.Object) + info.Implicits = make(map[ast.Node]types.Object) + + // Also, disable future collection of wholly unneeded + // type information for the package in case there is + // more type-checking to do (augmentation). + info.Types = nil + info.Scopes = nil + info.Selections = nil + } + + go func() { + lconf.Load() // ignore error + close(ch) + }() + + var refs []*ast.Ident + for ids := range ch { + refs = append(refs, ids...) + } + sort.Sort(byNamePos{fset, refs}) + + if qobj == nil { + log.Fatal("query object not found during reloading") + } + + // TODO(adonovan): in a follow-up, do away with the + // analyze/display split so we can print a stream of output + // directly from the AfterTypeCheck hook. + // (We should not assume that users let the program run long + // enough for Load to return.) + + q.Fset = fset + q.result = &referrersResult{ + build: q.Build, + fset: fset, + qinfo: qinfo, + obj: qobj, + refs: refs, + } + + return nil // success +} + +// findObject returns the object defined at the specified position. +func findObject(fset *token.FileSet, info *types.Info, objposn token.Position) types.Object { + good := func(obj types.Object) bool { + if obj == nil { + return false + } + posn := fset.Position(obj.Pos()) + return posn.Filename == objposn.Filename && posn.Offset == objposn.Offset + } + for _, obj := range info.Defs { + if good(obj) { + return obj + } + } + for _, obj := range info.Implicits { + if good(obj) { + return obj + } + } + return nil +} + +// usesOf returns all identifiers in the packages denoted by infos +// that refer to queryObj. +func usesOf(queryObj types.Object, infos ...*loader.PackageInfo) []*ast.Ident { + var refs []*ast.Ident + for _, info := range infos { + for id, obj := range info.Uses { + if sameObj(queryObj, obj) { + refs = append(refs, id) + } + } + } + return refs +} + +// same reports whether x and y are identical, or both are PkgNames +// that import the same Package. +// +func sameObj(x, y types.Object) bool { + if x == y { + return true + } + if x, ok := x.(*types.PkgName); ok { + if y, ok := y.(*types.PkgName); ok { + return x.Imported() == y.Imported() + } + } + return false +} + +// -------- utils -------- + +// An deterministic ordering for token.Pos that doesn't +// depend on the order in which packages were loaded. +func lessPos(fset *token.FileSet, x, y token.Pos) bool { + fx := fset.File(x) + fy := fset.File(y) + if fx != fy { + return fx.Name() < fy.Name() + } + return x < y +} + +type byNamePos struct { + fset *token.FileSet + ids []*ast.Ident +} + +func (p byNamePos) Len() int { return len(p.ids) } +func (p byNamePos) Swap(i, j int) { p.ids[i], p.ids[j] = p.ids[j], p.ids[i] } +func (p byNamePos) Less(i, j int) bool { + return lessPos(p.fset, p.ids[i].NamePos, p.ids[j].NamePos) +} + +type referrersResult struct { + build *build.Context + fset *token.FileSet + qinfo *loader.PackageInfo + qpos *queryPos + obj types.Object // object it denotes + refs []*ast.Ident // set of all other references to it +} + +func (r *referrersResult) display(printf printfFunc) { + printf(r.obj, "%d references to %s", + len(r.refs), types.ObjectString(r.obj, types.RelativeTo(r.qinfo.Pkg))) + + // Show referring lines, like grep. + type fileinfo struct { + refs []*ast.Ident + linenums []int // line number of refs[i] + data chan interface{} // file contents or error + } + var fileinfos []*fileinfo + fileinfosByName := make(map[string]*fileinfo) + + // First pass: start the file reads concurrently. + sema := make(chan struct{}, 20) // counting semaphore to limit I/O concurrency + for _, ref := range r.refs { + posn := r.fset.Position(ref.Pos()) + fi := fileinfosByName[posn.Filename] + if fi == nil { + fi = &fileinfo{data: make(chan interface{})} + fileinfosByName[posn.Filename] = fi + fileinfos = append(fileinfos, fi) + + // First request for this file: + // start asynchronous read. + go func() { + sema <- struct{}{} // acquire token + content, err := readFile(r.build, posn.Filename) + <-sema // release token + if err != nil { + fi.data <- err + } else { + fi.data <- content + } + }() + } + fi.refs = append(fi.refs, ref) + fi.linenums = append(fi.linenums, posn.Line) + } + + // Second pass: print refs in original order. + // One line may have several refs at different columns. + for _, fi := range fileinfos { + v := <-fi.data // wait for I/O completion + + // Print one item for all refs in a file that could not + // be loaded (perhaps due to //line directives). + if err, ok := v.(error); ok { + var suffix string + if more := len(fi.refs) - 1; more > 0 { + suffix = fmt.Sprintf(" (+ %d more refs in this file)", more) + } + printf(fi.refs[0], "%v%s", err, suffix) + continue + } + + lines := bytes.Split(v.([]byte), []byte("\n")) + for i, ref := range fi.refs { + printf(ref, "%s", lines[fi.linenums[i]-1]) + } + } +} + +// readFile is like ioutil.ReadFile, but +// it goes through the virtualized build.Context. +func readFile(ctxt *build.Context, filename string) ([]byte, error) { + rc, err := buildutil.OpenFile(ctxt, filename) + if err != nil { + return nil, err + } + defer rc.Close() + var buf bytes.Buffer + if _, err := io.Copy(&buf, rc); err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +func (r *referrersResult) toSerial(res *serial.Result, fset *token.FileSet) { + referrers := &serial.Referrers{ + Desc: r.obj.String(), + } + if pos := r.obj.Pos(); pos != token.NoPos { // Package objects have no Pos() + referrers.ObjPos = fset.Position(pos).String() + } + for _, ref := range r.refs { + referrers.Refs = append(referrers.Refs, fset.Position(ref.NamePos).String()) + } + res.Referrers = referrers +} diff --git a/vendor/golang.org/x/tools/cmd/guru/serial/serial.go b/vendor/golang.org/x/tools/cmd/guru/serial/serial.go new file mode 100644 index 0000000000..f7260ef9ad --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/serial/serial.go @@ -0,0 +1,259 @@ +// Copyright 2013 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 serial defines the guru's schema for structured data +// serialization using JSON, XML, etc. +package serial + +// All 'pos' strings are of the form "file:line:col". +// TODO(adonovan): improve performance by sharing filename strings. +// TODO(adonovan): improve precision by providing the start/end +// interval when available. +// +// TODO(adonovan): consider richer encodings of types, functions, +// methods, etc. + +// A Peers is the result of a 'peers' query. +// If Allocs is empty, the selected channel can't point to anything. +type Peers struct { + Pos string `json:"pos"` // location of the selected channel op (<-) + Type string `json:"type"` // type of the selected channel + Allocs []string `json:"allocs,omitempty"` // locations of aliased make(chan) ops + Sends []string `json:"sends,omitempty"` // locations of aliased ch<-x ops + Receives []string `json:"receives,omitempty"` // locations of aliased <-ch ops + Closes []string `json:"closes,omitempty"` // locations of aliased close(ch) ops +} + +// A Referrers is the result of a 'referrers' query. +type Referrers struct { + ObjPos string `json:"objpos,omitempty"` // location of the definition + Desc string `json:"desc"` // description of the denoted object + Refs []string `json:"refs,omitempty"` // locations of all references +} + +// A Definition is the result of a 'definition' query. +type Definition struct { + ObjPos string `json:"objpos,omitempty"` // location of the definition + Desc string `json:"desc"` // description of the denoted object +} + +type CalleesItem struct { + Name string `json:"name"` // full name of called function + Pos string `json:"pos"` // location of called function +} + +// A Callees is the result of a 'callees' query. +// +// Callees is nonempty unless the call was a dynamic call on a +// provably nil func or interface value. +type Callees struct { + Pos string `json:"pos"` // location of selected call site + Desc string `json:"desc"` // description of call site + Callees []*CalleesItem `json:"callees,omitempty"` // set of possible call targets +} + +// A Caller is one element of the slice returned by a 'callers' query. +// (Callstack also contains a similar slice.) +// +// The root of the callgraph has an unspecified "Caller" string. +type Caller struct { + Pos string `json:"pos,omitempty"` // location of the calling function + Desc string `json:"desc"` // description of call site + Caller string `json:"caller"` // full name of calling function +} + +// A CallStack is the result of a 'callstack' query. +// It indicates an arbitrary path from the root of the callgraph to +// the query function. +// +// If the Callers slice is empty, the function was unreachable in this +// analysis scope. +type CallStack struct { + Pos string `json:"pos"` // location of the selected function + Target string `json:"target"` // the selected function + Callers []Caller `json:"callers"` // enclosing calls, innermost first. +} + +// A FreeVar is one element of the slice returned by a 'freevars' +// query. Each one identifies an expression referencing a local +// identifier defined outside the selected region. +type FreeVar struct { + Pos string `json:"pos"` // location of the identifier's definition + Kind string `json:"kind"` // one of {var,func,type,const,label} + Ref string `json:"ref"` // referring expression (e.g. "x" or "x.y.z") + Type string `json:"type"` // type of the expression +} + +// An Implements contains the result of an 'implements' query. +// It describes the queried type, the set of named non-empty interface +// types to which it is assignable, and the set of named/*named types +// (concrete or non-empty interface) which may be assigned to it. +// +type Implements struct { + T ImplementsType `json:"type,omitempty"` // the queried type + AssignableTo []ImplementsType `json:"to,omitempty"` // types assignable to T + AssignableFrom []ImplementsType `json:"from,omitempty"` // interface types assignable from T + AssignableFromPtr []ImplementsType `json:"fromptr,omitempty"` // interface types assignable only from *T + + // The following fields are set only if the query was a method. + // Assignable{To,From,FromPtr}Method[i] is the corresponding + // method of type Assignable{To,From,FromPtr}[i], or blank + // {"",""} if that type lacks the method. + Method *DescribeMethod `json:"method,omitempty"` // the queried method + AssignableToMethod []DescribeMethod `json:"to_method,omitempty"` + AssignableFromMethod []DescribeMethod `json:"from_method,omitempty"` + AssignableFromPtrMethod []DescribeMethod `json:"fromptr_method,omitempty"` +} + +// An ImplementsType describes a single type as part of an 'implements' query. +type ImplementsType struct { + Name string `json:"name"` // full name of the type + Pos string `json:"pos"` // location of its definition + Kind string `json:"kind"` // "basic", "array", etc +} + +// A SyntaxNode is one element of a stack of enclosing syntax nodes in +// a "what" query. +type SyntaxNode struct { + Description string `json:"desc"` // description of syntax tree + Start int `json:"start"` // start byte offset, 0-based + End int `json:"end"` // end byte offset +} + +// A What is the result of the "what" query, which quickly identifies +// the selection, parsing only a single file. It is intended for use +// in low-latency GUIs. +type What struct { + Enclosing []SyntaxNode `json:"enclosing"` // enclosing nodes of syntax tree + Modes []string `json:"modes"` // query modes enabled for this selection. + SrcDir string `json:"srcdir,omitempty"` // $GOROOT src directory containing queried package + ImportPath string `json:"importpath,omitempty"` // import path of queried package + Object string `json:"object,omitempty"` // name of identified object, if any + SameIDs []string `json:"sameids,omitempty"` // locations of references to same object +} + +// A PointsToLabel describes a pointer analysis label. +// +// A "label" is an object that may be pointed to by a pointer, map, +// channel, 'func', slice or interface. Labels include: +// - functions +// - globals +// - arrays created by literals (e.g. []byte("foo")) and conversions ([]byte(s)) +// - stack- and heap-allocated variables (including composite literals) +// - arrays allocated by append() +// - channels, maps and arrays created by make() +// - and their subelements, e.g. "alloc.y[*].z" +// +type PointsToLabel struct { + Pos string `json:"pos"` // location of syntax that allocated the object + Desc string `json:"desc"` // description of the label +} + +// A PointsTo is one element of the result of a 'pointsto' query on an +// expression. It describes a single pointer: its type and the set of +// "labels" it points to. +// +// If the pointer is of interface type, it will have one PTS entry +// describing each concrete type that it may contain. For each +// concrete type that is a pointer, the PTS entry describes the labels +// it may point to. The same is true for reflect.Values, except the +// dynamic types needn't be concrete. +// +type PointsTo struct { + Type string `json:"type"` // (concrete) type of the pointer + NamePos string `json:"namepos,omitempty"` // location of type defn, if Named + Labels []PointsToLabel `json:"labels,omitempty"` // pointed-to objects +} + +// A DescribeValue is the additional result of a 'describe' query +// if the selection indicates a value or expression. +type DescribeValue struct { + Type string `json:"type"` // type of the expression + Value string `json:"value,omitempty"` // value of the expression, if constant + ObjPos string `json:"objpos,omitempty"` // location of the definition, if an Ident +} + +type DescribeMethod struct { + Name string `json:"name"` // method name, as defined by types.Selection.String() + Pos string `json:"pos"` // location of the method's definition +} + +// A DescribeType is the additional result of a 'describe' query +// if the selection indicates a type. +type DescribeType struct { + Type string `json:"type"` // the string form of the type + NamePos string `json:"namepos,omitempty"` // location of definition of type, if named + NameDef string `json:"namedef,omitempty"` // underlying definition of type, if named + Methods []DescribeMethod `json:"methods,omitempty"` // methods of the type +} + +type DescribeMember struct { + Name string `json:"name"` // name of member + Type string `json:"type,omitempty"` // type of member (underlying, if 'type') + Value string `json:"value,omitempty"` // value of member (if 'const') + Pos string `json:"pos"` // location of definition of member + Kind string `json:"kind"` // one of {var,const,func,type} + Methods []DescribeMethod `json:"methods,omitempty"` // methods (if member is a type) +} + +// A DescribePackage is the additional result of a 'describe' if +// the selection indicates a package. +type DescribePackage struct { + Path string `json:"path"` // import path of the package + Members []*DescribeMember `json:"members,omitempty"` // accessible members of the package +} + +// A Describe is the result of a 'describe' query. +// It may contain an element describing the selected semantic entity +// in detail. +type Describe struct { + Desc string `json:"desc"` // description of the selected syntax node + Pos string `json:"pos"` // location of the selected syntax node + Detail string `json:"detail,omitempty"` // one of {package, type, value}, or "". + + // At most one of the following fields is populated: + // the one specified by 'detail'. + Package *DescribePackage `json:"package,omitempty"` + Type *DescribeType `json:"type,omitempty"` + Value *DescribeValue `json:"value,omitempty"` +} + +// A WhichErrs is the result of a 'whicherrs' query. +// It contains the position of the queried error and the possible globals, +// constants, and types it may point to. +type WhichErrs struct { + ErrPos string `json:"errpos,omitempty"` // location of queried error + Globals []string `json:"globals,omitempty"` // locations of globals + Constants []string `json:"constants,omitempty"` // locations of constants + Types []WhichErrsType `json:"types,omitempty"` // Types +} + +type WhichErrsType struct { + Type string `json:"type,omitempty"` + Position string `json:"position,omitempty"` +} + +// A Result is the common result of any guru query. +// It contains a query-specific result element. +// +// TODO(adonovan): perhaps include other info such as: analysis scope, +// raw query position, stack of ast nodes, query package, etc. +type Result struct { + Mode string `json:"mode"` // mode of the query + + // Exactly one of the following fields is populated: + // the one specified by 'mode'. + Callees *Callees `json:"callees,omitempty"` + Callers []Caller `json:"callers,omitempty"` + Callstack *CallStack `json:"callstack,omitempty"` + Definition *Definition `json:"definition,omitempty"` + Describe *Describe `json:"describe,omitempty"` + Freevars []*FreeVar `json:"freevars,omitempty"` + Implements *Implements `json:"implements,omitempty"` + Peers *Peers `json:"peers,omitempty"` + PointsTo []PointsTo `json:"pointsto,omitempty"` + Referrers *Referrers `json:"referrers,omitempty"` + What *What `json:"what,omitempty"` + WhichErrs *WhichErrs `json:"whicherrs,omitempty"` +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/README.txt b/vendor/golang.org/x/tools/cmd/guru/testdata/src/README.txt new file mode 100644 index 0000000000..34fc41ae4e --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/README.txt @@ -0,0 +1,2 @@ +This is not a Go source file. +Used by TestIssue14684. diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls-json/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls-json/main.go new file mode 100644 index 0000000000..9d58ed1efd --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls-json/main.go @@ -0,0 +1,16 @@ +package main + +// Tests of call-graph queries, -format=json. +// See go.tools/guru/guru_test.go for explanation. +// See calls-json.golden for expected query results. + +func call(f func()) { + f() // @callees @callees-f "f" +} + +func main() { + call(func() { + // @callers callers-main.anon "^" + // @callstack callstack-main.anon "^" + }) +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls-json/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls-json/main.golden new file mode 100644 index 0000000000..80de6695f0 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls-json/main.golden @@ -0,0 +1,34 @@ +-------- @callees @callees-f -------- +{ + "mode": "callees", + "callees": { + "pos": "testdata/src/calls-json/main.go:8:3", + "desc": "dynamic function call", + "callees": [ + { + "name": "calls-json.main$1", + "pos": "testdata/src/calls-json/main.go:12:7" + } + ] + } +} +-------- @callstack callstack-main.anon -------- +{ + "mode": "callstack", + "callstack": { + "pos": "testdata/src/calls-json/main.go:12:7", + "target": "calls-json.main$1", + "callers": [ + { + "pos": "testdata/src/calls-json/main.go:8:3", + "desc": "dynamic function call", + "caller": "calls-json.call" + }, + { + "pos": "testdata/src/calls-json/main.go:12:6", + "desc": "static function call", + "caller": "calls-json.main" + } + ] + } +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls/main.go new file mode 100644 index 0000000000..a208914020 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls/main.go @@ -0,0 +1,129 @@ +package main + +import ( + "fmt" +) + +// Tests of call-graph queries. +// See go.tools/guru/guru_test.go for explanation. +// See calls.golden for expected query results. + +func A(x *int) { // @pointsto pointsto-A-x "x" + // @callers callers-A "^" + // @callstack callstack-A "^" +} + +func B(x *int) { // @pointsto pointsto-B-x "x" + // @callers callers-B "^" +} + +func foo() { +} + +// apply is not (yet) treated context-sensitively. +func apply(f func(x *int), x *int) { + f(x) // @callees callees-apply "f" + // @callers callers-apply "^" +} + +// store *is* treated context-sensitively, +// so the points-to sets for pc, pd are precise. +func store(ptr **int, value *int) { + *ptr = value + // @callers callers-store "^" +} + +func call(f func() *int) { + // Result points to anon function. + f() // @pointsto pointsto-result-f "f" + + // Target of call is anon function. + f() // @callees callees-main.call-f "f" + + // @callers callers-main.call "^" +} + +func main() { + var a, b int + go apply(A, &a) // @callees callees-main-apply1 "app" + defer apply(B, &b) + + var c, d int + var pc, pd *int // @pointsto pointsto-pc "pc" + store(&pc, &c) + store(&pd, &d) + _ = pd // @pointsto pointsto-pd "pd" + + call(func() *int { + // We are called twice from main.call + // @callers callers-main.anon "^" + return &a + }) + + // Errors + _ = "no function call here" // @callees callees-err-no-call "no" + print("builtin") // @callees callees-err-builtin "builtin" + _ = string("type conversion") // @callees callees-err-conversion "str" + call(nil) // @callees callees-err-bad-selection "call\\(nil" + if false { + main() // @callees callees-err-deadcode1 "main" + } + var nilFunc func() + nilFunc() // @callees callees-err-nil-func "nilFunc" + var i interface { + f() + } + i.f() // @callees callees-err-nil-interface "i.f" + + i = new(myint) + i.f() // @callees callees-not-a-wrapper "f" + + // statically dispatched calls. Handled specially by callees, so test that they work. + foo() // @callees callees-static-call "foo" + fmt.Println() // @callees callees-qualified-call "Println" + m := new(method) + m.f() // @callees callees-static-method-call "f" + g := new(embeddedIface) + g.iface = m + g.f() // @callees callees-implicit-selection-method-call "f" +} + +type myint int + +func (myint) f() { + // @callers callers-not-a-wrapper "^" +} + +type method int + +func (method) f() { +} + +type embeddedIface struct { + iface +} + +type iface interface { + f() +} + +var dynamic = func() {} + +func deadcode() { + main() // @callees callees-err-deadcode2 "main" + // @callers callers-err-deadcode "^" + // @callstack callstack-err-deadcode "^" + + // Within dead code, dynamic calls have no callees. + dynamic() // @callees callees-err-deadcode3 "dynamic" +} + +// This code belongs to init. +var global = 123 // @callers callers-global "global" + +// The package initializer may be called by other packages' inits, or +// in this case, the root of the callgraph. The source-level init functions +// are in turn called by it. +func init() { + // @callstack callstack-init "^" +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls/main.golden new file mode 100644 index 0000000000..ab68e95a63 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/calls/main.golden @@ -0,0 +1,125 @@ +-------- @pointsto pointsto-A-x -------- +this *int may point to these objects: + a + b + +-------- @callstack callstack-A -------- +Found a call path from root to calls.A +calls.A +dynamic function call from calls.apply +concurrent static function call from calls.main + +-------- @pointsto pointsto-B-x -------- +this *int may point to these objects: + a + b + +-------- @callers callers-B -------- +calls.B is called from these 1 sites: + dynamic function call from calls.apply + +-------- @callees callees-apply -------- +this dynamic function call dispatches to: + calls.A + calls.B + +-------- @callers callers-apply -------- +calls.apply is called from these 2 sites: + concurrent static function call from calls.main + deferred static function call from calls.main + +-------- @callers callers-store -------- +calls.store is called from these 2 sites: + static function call from calls.main + static function call from calls.main + +-------- @pointsto pointsto-result-f -------- +this func() *int may point to these objects: + calls.main$1 + +-------- @callees callees-main.call-f -------- +this dynamic function call dispatches to: + calls.main$1 + +-------- @callers callers-main.call -------- +calls.call is called from these 2 sites: + static function call from calls.main + static function call from calls.main + +-------- @callees callees-main-apply1 -------- +this static function call dispatches to: + calls.apply + +-------- @pointsto pointsto-pc -------- +this *int may point to these objects: + c + +-------- @pointsto pointsto-pd -------- +this *int may point to these objects: + d + +-------- @callees callees-err-no-call -------- + +Error: there is no function call here +-------- @callees callees-err-builtin -------- + +Error: this is a call to the built-in 'print' operator +-------- @callees callees-err-conversion -------- + +Error: this is a type conversion, not a function call +-------- @callees callees-err-bad-selection -------- + +Error: ambiguous selection within function call (or conversion) +-------- @callees callees-err-deadcode1 -------- +this static function call dispatches to: + calls.main + +-------- @callees callees-err-nil-func -------- +dynamic function call on nil value + +-------- @callees callees-err-nil-interface -------- +dynamic method call on nil value + +-------- @callees callees-not-a-wrapper -------- +this dynamic method call dispatches to: + (calls.myint).f + +-------- @callees callees-static-call -------- +this static function call dispatches to: + calls.foo + +-------- @callees callees-qualified-call -------- +this static function call dispatches to: + fmt.Println + +-------- @callees callees-static-method-call -------- +this static function call dispatches to: + (calls.method).f + +-------- @callees callees-implicit-selection-method-call -------- +this dynamic method call dispatches to: + (calls.method).f + +-------- @callers callers-not-a-wrapper -------- +(calls.myint).f is called from these 1 sites: + dynamic method call from calls.main + +-------- @callees callees-err-deadcode2 -------- +this static function call dispatches to: + calls.main + +-------- @callstack callstack-err-deadcode -------- +calls.deadcode is unreachable in this analysis scope + +-------- @callees callees-err-deadcode3 -------- + +Error: this call site is unreachable in this analysis +-------- @callers callers-global -------- +calls.init is called from these 1 sites: +the root of the call graph + +-------- @callstack callstack-init -------- +Found a call path from root to calls.init#1 +calls.init#1 +static function call from calls.init + diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe-json/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe-json/main.go new file mode 100644 index 0000000000..549dd8aaf2 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe-json/main.go @@ -0,0 +1,29 @@ +package describe // @describe pkgdecl "describe" + +// Tests of 'describe' query, -format=json. +// See go.tools/guru/guru_test.go for explanation. +// See describe-json.golden for expected query results. + +func main() { + var s struct{ x [3]int } + p := &s.x[0] // @describe desc-val-p "p" + _ = p + + var i I = C(0) + if i == nil { + i = new(D) + } + print(i) // @describe desc-val-i "\\bi\\b" + + go main() // @describe desc-stmt "go" +} + +type I interface { + f() +} + +type C int // @describe desc-type-C "C" +type D struct{} + +func (c C) f() {} +func (d *D) f() {} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe-json/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe-json/main.golden new file mode 100644 index 0000000000..9d03661a4d --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe-json/main.golden @@ -0,0 +1,111 @@ +-------- @describe pkgdecl -------- +{ + "mode": "describe", + "describe": { + "desc": "definition of package \"describe-json\"", + "pos": "testdata/src/describe-json/main.go:1:9", + "detail": "package", + "package": { + "path": "describe-json", + "members": [ + { + "name": "C", + "type": "int", + "pos": "testdata/src/describe-json/main.go:25:6", + "kind": "type", + "methods": [ + { + "name": "method (C) f()", + "pos": "testdata/src/describe-json/main.go:28:12" + } + ] + }, + { + "name": "D", + "type": "struct{}", + "pos": "testdata/src/describe-json/main.go:26:6", + "kind": "type", + "methods": [ + { + "name": "method (*D) f()", + "pos": "testdata/src/describe-json/main.go:29:13" + } + ] + }, + { + "name": "I", + "type": "interface{f()}", + "pos": "testdata/src/describe-json/main.go:21:6", + "kind": "type", + "methods": [ + { + "name": "method (I) f()", + "pos": "testdata/src/describe-json/main.go:22:2" + } + ] + }, + { + "name": "main", + "type": "func()", + "pos": "testdata/src/describe-json/main.go:7:6", + "kind": "func" + } + ] + } + } +} +-------- @describe desc-val-p -------- +{ + "mode": "describe", + "describe": { + "desc": "identifier", + "pos": "testdata/src/describe-json/main.go:9:2", + "detail": "value", + "value": { + "type": "*int", + "objpos": "testdata/src/describe-json/main.go:9:2" + } + } +} +-------- @describe desc-val-i -------- +{ + "mode": "describe", + "describe": { + "desc": "identifier", + "pos": "testdata/src/describe-json/main.go:16:8", + "detail": "value", + "value": { + "type": "I", + "objpos": "testdata/src/describe-json/main.go:12:6" + } + } +} +-------- @describe desc-stmt -------- +{ + "mode": "describe", + "describe": { + "desc": "go statement", + "pos": "testdata/src/describe-json/main.go:18:2", + "detail": "unknown" + } +} +-------- @describe desc-type-C -------- +{ + "mode": "describe", + "describe": { + "desc": "definition of type C (size 8, align 8)", + "pos": "testdata/src/describe-json/main.go:25:6", + "detail": "type", + "type": { + "type": "C", + "namepos": "testdata/src/describe-json/main.go:25:6", + "namedef": "int", + "methods": [ + { + "name": "method (C) f()", + "pos": "testdata/src/describe-json/main.go:28:12" + } + ] + } + } +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe/main.go new file mode 100644 index 0000000000..8e56aca9f6 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe/main.go @@ -0,0 +1,107 @@ +package describe // @describe pkgdecl "describe" + +// Tests of 'describe' query. +// See go.tools/guru/guru_test.go for explanation. +// See describe.golden for expected query results. + +// TODO(adonovan): more coverage of the (extensive) logic. + +import ( + "lib" + "nosuchpkg" // @describe badimport1 "nosuchpkg" + nosuchpkg2 "nosuchpkg" // @describe badimport2 "nosuchpkg2" + _ "unsafe" // @describe unsafe "unsafe" +) + +var _ nosuchpkg.T +var _ nosuchpkg2.T + +type cake float64 // @describe type-ref-builtin "float64" + +const c = iota // @describe const-ref-iota "iota" + +const pi = 3.141 // @describe const-def-pi "pi" +const pie = cake(pi) // @describe const-def-pie "pie" +const _ = pi // @describe const-ref-pi "pi" + +var global = new(string) // NB: ssa.Global is indirect, i.e. **string + +func main() { // @describe func-def-main "main" + // func objects + _ = main // @describe func-ref-main "main" + _ = (*C).f // @describe func-ref-*C.f "..C..f" + _ = D.f // @describe func-ref-D.f "D.f" + _ = I.f // @describe func-ref-I.f "I.f" + var d D // @describe type-D "D" + var i I // @describe type-I "I" + _ = d.f // @describe func-ref-d.f "d.f" + _ = i.f // @describe func-ref-i.f "i.f" + + var dptr *D // @describe ptr-with-nonptr-methods "dptr" + _ = dptr + + // var objects + anon := func() { + _ = d // @describe ref-lexical-d "d" + } + _ = anon // @describe ref-anon "anon" + _ = global // @describe ref-global "global" + + // SSA affords some local flow sensitivity. + var a, b int + var x = &a // @describe var-def-x-1 "x" + _ = x // @describe var-ref-x-1 "x" + x = &b // @describe var-def-x-2 "x" + _ = x // @describe var-ref-x-2 "x" + + i = new(C) // @describe var-ref-i-C "i" + if i != nil { + i = D{} // @describe var-ref-i-D "i" + } + print(i) // @describe var-ref-i "\\bi\\b" + + // const objects + const localpi = 3.141 // @describe const-local-pi "localpi" + const localpie = cake(pi) // @describe const-local-pie "localpie" + const _ = localpi // @describe const-ref-localpi "localpi" + + // type objects + type T int // @describe type-def-T "T" + var three T = 3 // @describe type-ref-T "T" + _ = three + + print(1 + 2*3) // @describe const-expr " 2.3" + print(real(1+2i) - 3) // @describe const-expr2 "real.*3" + + m := map[string]*int{"a": &a} + mapval, _ := m["a"] // @describe map-lookup,ok "m..a.." + _ = mapval // @describe mapval "mapval" + _ = m // @describe m "m" + + defer main() // @describe defer-stmt "defer" + go main() // @describe go-stmt "go" + + panic(3) // @describe builtin-ref-panic "panic" + + var a2 int // @describe var-decl-stmt "var a2 int" + _ = a2 + var _ int // @describe var-decl-stmt2 "var _ int" + var _ int // @describe var-def-blank "_" + + var _ lib.Outer // @describe lib-outer "Outer" + + unknown() // @describe call-unknown "\\(" +} + +type I interface { // @describe def-iface-I "I" + f() // @describe def-imethod-I.f "f" +} + +type C int +type D struct { + Field int + AnotherField string +} + +func (c *C) f() {} +func (d D) f() {} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe/main.golden new file mode 100644 index 0000000000..3489635ab0 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/describe/main.golden @@ -0,0 +1,218 @@ +-------- @describe pkgdecl -------- +definition of package "describe" + type C int + method (*C) f() + type D struct{...} + method (D) f() + type I interface{f()} + method (I) f() + const c untyped int = 0 + type cake float64 + var global *string + func main func() + const pi untyped float = 3.141 + const pie cake = 3.141 + +-------- @describe badimport1 -------- + +Error: can't import package "nosuchpkg" +-------- @describe badimport2 -------- + +Error: can't import package "nosuchpkg" +-------- @describe unsafe -------- +import of package "unsafe" + builtin Alignof + builtin Offsetof + type Pointer unsafe.Pointer + builtin Sizeof + +-------- @describe type-ref-builtin -------- +reference to built-in type float64 + +-------- @describe const-ref-iota -------- +reference to const iota untyped int of constant value 0 + +-------- @describe const-def-pi -------- +definition of const pi untyped float + +-------- @describe const-def-pie -------- +definition of const pie cake + +-------- @describe const-ref-pi -------- +reference to const pi untyped float of constant value 3.141 +defined here + +-------- @describe func-def-main -------- +definition of func main() + +-------- @describe func-ref-main -------- +reference to func main() +defined here + +-------- @describe func-ref-*C.f -------- +reference to method func (*C).f() +defined here + +-------- @describe func-ref-D.f -------- +reference to method func (D).f() +defined here + +-------- @describe func-ref-I.f -------- +reference to interface method func (I).f() +defined here + +-------- @describe type-D -------- +reference to type D (size 24, align 8) +defined as struct{Field int; AnotherField string} +Methods: + method (D) f() +Fields: + Field int + AnotherField string + +-------- @describe type-I -------- +reference to type I (size 16, align 8) +defined as interface{f()} +Methods: + method (I) f() + +-------- @describe func-ref-d.f -------- +reference to method func (D).f() +defined here + +-------- @describe func-ref-i.f -------- +reference to interface method func (I).f() +defined here + +-------- @describe ptr-with-nonptr-methods -------- +definition of var dptr *D +Methods: + method (*D) f() +Fields: + Field int + AnotherField string + +-------- @describe ref-lexical-d -------- +reference to var d D +defined here +Methods: + method (D) f() +Fields: + Field int + AnotherField string + +-------- @describe ref-anon -------- +reference to var anon func() +defined here + +-------- @describe ref-global -------- +reference to var global *string +defined here + +-------- @describe var-def-x-1 -------- +definition of var x *int + +-------- @describe var-ref-x-1 -------- +reference to var x *int +defined here + +-------- @describe var-def-x-2 -------- +reference to var x *int +defined here + +-------- @describe var-ref-x-2 -------- +reference to var x *int +defined here + +-------- @describe var-ref-i-C -------- +reference to var i I +defined here +Methods: + method (I) f() + +-------- @describe var-ref-i-D -------- +reference to var i I +defined here +Methods: + method (I) f() + +-------- @describe var-ref-i -------- +reference to var i I +defined here +Methods: + method (I) f() + +-------- @describe const-local-pi -------- +definition of const localpi untyped float + +-------- @describe const-local-pie -------- +definition of const localpie cake + +-------- @describe const-ref-localpi -------- +reference to const localpi untyped float of constant value 3.141 +defined here + +-------- @describe type-def-T -------- +definition of type T (size 8, align 8) +No methods. + +-------- @describe type-ref-T -------- +reference to type T (size 8, align 8) +defined as int +No methods. + +-------- @describe const-expr -------- +binary * operation of constant value 6 + +-------- @describe const-expr2 -------- +binary - operation of constant value -2 + +-------- @describe map-lookup,ok -------- +index expression of type (*int, bool) + +-------- @describe mapval -------- +reference to var mapval *int +defined here + +-------- @describe m -------- +reference to var m map[string]*int +defined here + +-------- @describe defer-stmt -------- +defer statement + +-------- @describe go-stmt -------- +go statement + +-------- @describe builtin-ref-panic -------- +function call (or conversion) of type () + +-------- @describe var-decl-stmt -------- +definition of var a2 int + +-------- @describe var-decl-stmt2 -------- +definition of var _ int + +-------- @describe var-def-blank -------- +definition of var _ int + +-------- @describe lib-outer -------- +reference to type lib.Outer (size 56, align 8) +defined as struct{A int; b int; lib.inner} +No methods. +Fields: + A int + inner.C bool + inner.recursive.E bool + +-------- @describe call-unknown -------- +function call (or conversion) of type invalid type + +-------- @describe def-iface-I -------- +definition of type I (size 16, align 8) +Methods: + method (I) f() + +-------- @describe def-imethod-I.f -------- +definition of interface method func (I).f() + diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/freevars/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/freevars/main.go new file mode 100644 index 0000000000..c6aa08d229 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/freevars/main.go @@ -0,0 +1,40 @@ +package main + +// Tests of 'freevars' query. +// See go.tools/guru/guru_test.go for explanation. +// See freevars.golden for expected query results. + +// TODO(adonovan): it's hard to test this query in a single line of gofmt'd code. + +type T struct { + a, b int +} + +type S struct { + x int + t T +} + +func f(int) {} + +func main() { + type C int + x := 1 + const exp = 6 + if y := 2; x+y+int(C(3)) != exp { // @freevars fv1 "if.*{" + panic("expected 6") + } + + var s S + + for x, y := range "foo" { + println(s.x + s.t.a + s.t.b + x + int(y)) // @freevars fv2 "print.*y." + } + + f(x) // @freevars fv3 "f.x." + +loop: // @freevars fv-def-label "loop:" + for { + break loop // @freevars fv-ref-label "break loop" + } +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/freevars/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/freevars/main.golden new file mode 100644 index 0000000000..a3bc0c9538 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/freevars/main.golden @@ -0,0 +1,25 @@ +-------- @freevars fv1 -------- +Free identifiers: +type C +const exp int +var x int + +-------- @freevars fv2 -------- +Free identifiers: +var s.t.a int +var s.t.b int +var s.x int +var x int +var y rune + +-------- @freevars fv3 -------- +Free identifiers: +var x int + +-------- @freevars fv-def-label -------- +No free identifiers. + +-------- @freevars fv-ref-label -------- +Free identifiers: +label loop + diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-json/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-json/main.go new file mode 100644 index 0000000000..e18a373ab7 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-json/main.go @@ -0,0 +1,27 @@ +package main + +// Tests of 'implements' query, -output=json. +// See go.tools/guru/guru_test.go for explanation. +// See implements.golden for expected query results. + +func main() { +} + +type E interface{} // @implements E "E" + +type F interface { // @implements F "F" + f() +} + +type FG interface { // @implements FG "FG" + f() + g() []int // @implements slice "..int" +} + +type C int // @implements C "C" +type D struct{} + +func (c *C) f() {} // @implements starC ".C" +func (d D) f() {} // @implements D "D" + +func (d *D) g() []int { return nil } // @implements starD ".D" diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-json/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-json/main.golden new file mode 100644 index 0000000000..7e37f9e0f4 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-json/main.golden @@ -0,0 +1,159 @@ +-------- @implements E -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-json.E", + "pos": "testdata/src/implements-json/main.go:10:6", + "kind": "interface" + } + } +} +-------- @implements F -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-json.F", + "pos": "testdata/src/implements-json/main.go:12:6", + "kind": "interface" + }, + "to": [ + { + "name": "*implements-json.C", + "pos": "testdata/src/implements-json/main.go:21:6", + "kind": "pointer" + }, + { + "name": "implements-json.D", + "pos": "testdata/src/implements-json/main.go:22:6", + "kind": "struct" + }, + { + "name": "implements-json.FG", + "pos": "testdata/src/implements-json/main.go:16:6", + "kind": "interface" + } + ] + } +} +-------- @implements FG -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-json.FG", + "pos": "testdata/src/implements-json/main.go:16:6", + "kind": "interface" + }, + "to": [ + { + "name": "*implements-json.D", + "pos": "testdata/src/implements-json/main.go:22:6", + "kind": "pointer" + } + ], + "from": [ + { + "name": "implements-json.F", + "pos": "testdata/src/implements-json/main.go:12:6", + "kind": "interface" + } + ] + } +} +-------- @implements slice -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "[]int", + "pos": "-", + "kind": "slice" + } + } +} +-------- @implements C -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-json.C", + "pos": "testdata/src/implements-json/main.go:21:6", + "kind": "basic" + }, + "fromptr": [ + { + "name": "implements-json.F", + "pos": "testdata/src/implements-json/main.go:12:6", + "kind": "interface" + } + ] + } +} +-------- @implements starC -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "*implements-json.C", + "pos": "testdata/src/implements-json/main.go:21:6", + "kind": "pointer" + }, + "from": [ + { + "name": "implements-json.F", + "pos": "testdata/src/implements-json/main.go:12:6", + "kind": "interface" + } + ] + } +} +-------- @implements D -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-json.D", + "pos": "testdata/src/implements-json/main.go:22:6", + "kind": "struct" + }, + "from": [ + { + "name": "implements-json.F", + "pos": "testdata/src/implements-json/main.go:12:6", + "kind": "interface" + } + ], + "fromptr": [ + { + "name": "implements-json.FG", + "pos": "testdata/src/implements-json/main.go:16:6", + "kind": "interface" + } + ] + } +} +-------- @implements starD -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "*implements-json.D", + "pos": "testdata/src/implements-json/main.go:22:6", + "kind": "pointer" + }, + "from": [ + { + "name": "implements-json.F", + "pos": "testdata/src/implements-json/main.go:12:6", + "kind": "interface" + }, + { + "name": "implements-json.FG", + "pos": "testdata/src/implements-json/main.go:16:6", + "kind": "interface" + } + ] + } +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods-json/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods-json/main.go new file mode 100644 index 0000000000..646276d568 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods-json/main.go @@ -0,0 +1,37 @@ +package main + +// Tests of 'implements' query applied to methods, -output=json. +// See go.tools/guru/guru_test.go for explanation. +// See implements-methods.golden for expected query results. + +import _ "lib" + +func main() { +} + +type F interface { + f() // @implements F.f "f" +} + +type FG interface { + f() // @implements FG.f "f" + g() []int // @implements FG.g "g" +} + +type C int +type D struct{} + +func (c *C) f() {} // @implements *C.f "f" +func (d D) f() {} // @implements D.f "f" + +func (d *D) g() []int { return nil } // @implements *D.g "g" + +type sorter []int + +func (sorter) Len() int { return 0 } // @implements Len "Len" +func (sorter) Less(i, j int) bool { return false } +func (sorter) Swap(i, j int) {} + +type I interface { + Method(*int) *int // @implements I.Method "Method" +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods-json/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods-json/main.golden new file mode 100644 index 0000000000..fa117df41f --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods-json/main.golden @@ -0,0 +1,290 @@ +-------- @implements F.f -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-methods-json.F", + "pos": "testdata/src/implements-methods-json/main.go:12:6", + "kind": "interface" + }, + "to": [ + { + "name": "*implements-methods-json.C", + "pos": "testdata/src/implements-methods-json/main.go:21:6", + "kind": "pointer" + }, + { + "name": "implements-methods-json.D", + "pos": "testdata/src/implements-methods-json/main.go:22:6", + "kind": "struct" + }, + { + "name": "implements-methods-json.FG", + "pos": "testdata/src/implements-methods-json/main.go:16:6", + "kind": "interface" + } + ], + "method": { + "name": "func (F).f()", + "pos": "testdata/src/implements-methods-json/main.go:13:2" + }, + "to_method": [ + { + "name": "method (*C) f()", + "pos": "testdata/src/implements-methods-json/main.go:24:13" + }, + { + "name": "method (D) f()", + "pos": "testdata/src/implements-methods-json/main.go:25:12" + }, + { + "name": "method (FG) f()", + "pos": "testdata/src/implements-methods-json/main.go:17:2" + } + ] + } +} +-------- @implements FG.f -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-methods-json.FG", + "pos": "testdata/src/implements-methods-json/main.go:16:6", + "kind": "interface" + }, + "to": [ + { + "name": "*implements-methods-json.D", + "pos": "testdata/src/implements-methods-json/main.go:22:6", + "kind": "pointer" + } + ], + "from": [ + { + "name": "implements-methods-json.F", + "pos": "testdata/src/implements-methods-json/main.go:12:6", + "kind": "interface" + } + ], + "method": { + "name": "func (FG).f()", + "pos": "testdata/src/implements-methods-json/main.go:17:2" + }, + "to_method": [ + { + "name": "method (*D) f()", + "pos": "testdata/src/implements-methods-json/main.go:25:12" + } + ], + "from_method": [ + { + "name": "method (F) f()", + "pos": "testdata/src/implements-methods-json/main.go:13:2" + } + ] + } +} +-------- @implements FG.g -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-methods-json.FG", + "pos": "testdata/src/implements-methods-json/main.go:16:6", + "kind": "interface" + }, + "to": [ + { + "name": "*implements-methods-json.D", + "pos": "testdata/src/implements-methods-json/main.go:22:6", + "kind": "pointer" + } + ], + "from": [ + { + "name": "implements-methods-json.F", + "pos": "testdata/src/implements-methods-json/main.go:12:6", + "kind": "interface" + } + ], + "method": { + "name": "func (FG).g() []int", + "pos": "testdata/src/implements-methods-json/main.go:18:2" + }, + "to_method": [ + { + "name": "method (*D) g() []int", + "pos": "testdata/src/implements-methods-json/main.go:27:13" + } + ], + "from_method": [ + { + "name": "", + "pos": "" + } + ] + } +} +-------- @implements *C.f -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "*implements-methods-json.C", + "pos": "testdata/src/implements-methods-json/main.go:21:6", + "kind": "pointer" + }, + "from": [ + { + "name": "implements-methods-json.F", + "pos": "testdata/src/implements-methods-json/main.go:12:6", + "kind": "interface" + } + ], + "method": { + "name": "func (*C).f()", + "pos": "testdata/src/implements-methods-json/main.go:24:13" + }, + "from_method": [ + { + "name": "method (F) f()", + "pos": "testdata/src/implements-methods-json/main.go:13:2" + } + ] + } +} +-------- @implements D.f -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-methods-json.D", + "pos": "testdata/src/implements-methods-json/main.go:22:6", + "kind": "struct" + }, + "from": [ + { + "name": "implements-methods-json.F", + "pos": "testdata/src/implements-methods-json/main.go:12:6", + "kind": "interface" + } + ], + "fromptr": [ + { + "name": "implements-methods-json.FG", + "pos": "testdata/src/implements-methods-json/main.go:16:6", + "kind": "interface" + } + ], + "method": { + "name": "func (D).f()", + "pos": "testdata/src/implements-methods-json/main.go:25:12" + }, + "from_method": [ + { + "name": "method (F) f()", + "pos": "testdata/src/implements-methods-json/main.go:13:2" + } + ], + "fromptr_method": [ + { + "name": "method (FG) f()", + "pos": "testdata/src/implements-methods-json/main.go:17:2" + } + ] + } +} +-------- @implements *D.g -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "*implements-methods-json.D", + "pos": "testdata/src/implements-methods-json/main.go:22:6", + "kind": "pointer" + }, + "from": [ + { + "name": "implements-methods-json.F", + "pos": "testdata/src/implements-methods-json/main.go:12:6", + "kind": "interface" + }, + { + "name": "implements-methods-json.FG", + "pos": "testdata/src/implements-methods-json/main.go:16:6", + "kind": "interface" + } + ], + "method": { + "name": "func (*D).g() []int", + "pos": "testdata/src/implements-methods-json/main.go:27:13" + }, + "from_method": [ + { + "name": "", + "pos": "" + }, + { + "name": "method (FG) g() []int", + "pos": "testdata/src/implements-methods-json/main.go:18:2" + } + ] + } +} +-------- @implements Len -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-methods-json.sorter", + "pos": "testdata/src/implements-methods-json/main.go:29:6", + "kind": "slice" + }, + "from": [ + { + "name": "lib.Sorter", + "pos": "testdata/src/lib/lib.go:16:6", + "kind": "interface" + } + ], + "method": { + "name": "func (sorter).Len() int", + "pos": "testdata/src/implements-methods-json/main.go:31:15" + }, + "from_method": [ + { + "name": "method (lib.Sorter) Len() int", + "pos": "testdata/src/lib/lib.go:17:2" + } + ] + } +} +-------- @implements I.Method -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-methods-json.I", + "pos": "testdata/src/implements-methods-json/main.go:35:6", + "kind": "interface" + }, + "to": [ + { + "name": "lib.Type", + "pos": "testdata/src/lib/lib.go:3:6", + "kind": "basic" + } + ], + "method": { + "name": "func (I).Method(*int) *int", + "pos": "testdata/src/implements-methods-json/main.go:36:2" + }, + "to_method": [ + { + "name": "method (lib.Type) Method(x *int) *int", + "pos": "testdata/src/lib/lib.go:5:13" + } + ] + } +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods/main.go new file mode 100644 index 0000000000..757be44af6 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods/main.go @@ -0,0 +1,37 @@ +package main + +// Tests of 'implements' query applied to methods. +// See go.tools/guru/guru_test.go for explanation. +// See implements-methods.golden for expected query results. + +import _ "lib" + +func main() { +} + +type F interface { + f() // @implements F.f "f" +} + +type FG interface { + f() // @implements FG.f "f" + g() []int // @implements FG.g "g" +} + +type C int +type D struct{} + +func (c *C) f() {} // @implements *C.f "f" +func (d D) f() {} // @implements D.f "f" + +func (d *D) g() []int { return nil } // @implements *D.g "g" + +type sorter []int + +func (sorter) Len() int { return 0 } // @implements Len "Len" +func (sorter) Less(i, j int) bool { return false } +func (sorter) Swap(i, j int) {} + +type I interface { + Method(*int) *int // @implements I.Method "Method" +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods/main.golden new file mode 100644 index 0000000000..bd591e8476 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements-methods/main.golden @@ -0,0 +1,37 @@ +-------- @implements F.f -------- +abstract method func (F).f() + is implemented by method (*C).f + is implemented by method (D).f + is implemented by method (FG).f + +-------- @implements FG.f -------- +abstract method func (FG).f() + is implemented by method (*D).f + implements method (F).f + +-------- @implements FG.g -------- +abstract method func (FG).g() []int + is implemented by method (*D).g + +-------- @implements *C.f -------- +concrete method func (*C).f() + implements method (F).f + +-------- @implements D.f -------- +concrete method func (D).f() + implements method (F).f +concrete method func (D).f() + implements method (FG).f + +-------- @implements *D.g -------- +concrete method func (*D).g() []int + implements method (FG).g + +-------- @implements Len -------- +concrete method func (sorter).Len() int + implements method (lib.Sorter).Len + +-------- @implements I.Method -------- +abstract method func (I).Method(*int) *int + is implemented by method (lib.Type).Method + diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements/main.go new file mode 100644 index 0000000000..22457d9983 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements/main.go @@ -0,0 +1,39 @@ +package main + +// Tests of 'implements' query. +// See go.tools/guru/guru_test.go for explanation. +// See implements.golden for expected query results. + +import _ "lib" + +func main() { +} + +type E interface{} // @implements E "E" + +type F interface { // @implements F "F" + f() +} + +type FG interface { // @implements FG "FG" + f() + g() []int // @implements slice "..int" +} + +type C int // @implements C "C" +type D struct{} + +func (c *C) f() {} // @implements starC ".C" +func (d D) f() {} // @implements D "D" + +func (d *D) g() []int { return nil } // @implements starD ".D" + +type sorter []int // @implements sorter "sorter" + +func (sorter) Len() int { return 0 } +func (sorter) Less(i, j int) bool { return false } +func (sorter) Swap(i, j int) {} + +type I interface { // @implements I "I" + Method(*int) *int +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements/main.golden new file mode 100644 index 0000000000..ee00f3d9fe --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/implements/main.golden @@ -0,0 +1,44 @@ +-------- @implements E -------- +empty interface type E + +-------- @implements F -------- +interface type F + is implemented by pointer type *C + is implemented by struct type D + is implemented by interface type FG + +-------- @implements FG -------- +interface type FG + is implemented by pointer type *D + implements F + +-------- @implements slice -------- +slice type []int implements only interface{} + +-------- @implements C -------- +pointer type *C + implements F + +-------- @implements starC -------- +pointer type *C + implements F + +-------- @implements D -------- +struct type D + implements F +pointer type *D + implements FG + +-------- @implements starD -------- +pointer type *D + implements F + implements FG + +-------- @implements sorter -------- +slice type sorter + implements lib.Sorter + +-------- @implements I -------- +interface type I + is implemented by basic type lib.Type + diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/imports/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/imports/main.go new file mode 100644 index 0000000000..3bab36a915 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/imports/main.go @@ -0,0 +1,29 @@ +package main + +import ( + "hash/fnv" // @describe ref-pkg-import2 "fnv" + "lib" // @describe ref-pkg-import "lib" +) + +// Tests that import another package. (To make the tests run quickly, +// we avoid using imports in all the other tests. Remember, each +// query causes parsing and typechecking of the whole program.) +// +// See go.tools/guru/guru_test.go for explanation. +// See imports.golden for expected query results. + +var a int + +func main() { + const c = lib.Const // @describe ref-const "Const" + lib.Func() // @describe ref-func "Func" + lib.Var++ // @describe ref-var "Var" + var t lib.Type // @describe ref-type "Type" + p := t.Method(&a) // @describe ref-method "Method" + + print(*p + 1) // @pointsto p "p " + + var _ lib.Type // @describe ref-pkg "lib" + + fnv.New32() +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/imports/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/imports/main.golden new file mode 100644 index 0000000000..80355156f8 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/imports/main.golden @@ -0,0 +1,59 @@ +-------- @describe ref-pkg-import2 -------- +import of package "hash/fnv" + func New32 func() hash.Hash32 + func New32a func() hash.Hash32 + func New64 func() hash.Hash64 + func New64a func() hash.Hash64 + +-------- @describe ref-pkg-import -------- +import of package "lib" + const Const untyped int = 3 + func Func func() + type Outer struct{...} + type Sorter interface{...} + method (Sorter) Len() int + method (Sorter) Less(i int, j int) bool + method (Sorter) Swap(i int, j int) + type Type int + method (Type) Method(x *int) *int + var Var int + +-------- @describe ref-const -------- +reference to const lib.Const untyped int +defined here + +-------- @describe ref-func -------- +reference to func lib.Func() +defined here + +-------- @describe ref-var -------- +reference to var lib.Var int +defined here + +-------- @describe ref-type -------- +reference to type lib.Type (size 8, align 8) +defined as int +Methods: + method (Type) Method(x *int) *int + +-------- @describe ref-method -------- +reference to method func (lib.Type).Method(x *int) *int +defined here + +-------- @pointsto p -------- +this *int may point to these objects: + imports.a + +-------- @describe ref-pkg -------- +reference to package "lib" + const Const untyped int = 3 + func Func func() + type Outer struct{...} + type Sorter interface{...} + method (Sorter) Len() int + method (Sorter) Less(i int, j int) bool + method (Sorter) Swap(i int, j int) + type Type int + method (Type) Method(x *int) *int + var Var int + diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/lib/lib.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/lib/lib.go new file mode 100644 index 0000000000..742cdbfaed --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/lib/lib.go @@ -0,0 +1,37 @@ +package lib + +type Type int + +func (Type) Method(x *int) *int { + return x +} + +func Func() { +} + +const Const = 3 + +var Var = 0 + +type Sorter interface { + Len() int + Less(i, j int) bool + Swap(i, j int) +} + +type Outer struct { + A int + b int + inner +} + +type inner struct { + C bool + d string + recursive +} + +type recursive struct { + E bool + *inner +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/main/multi.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/main/multi.go new file mode 100644 index 0000000000..8c650cd289 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/main/multi.go @@ -0,0 +1,13 @@ +package main + +func g(x int) { +} + +func f() { + x := 1 + g(x) // "g(x)" is the selection for multiple queries +} + +func main() { + f() +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers-json/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers-json/main.go new file mode 100644 index 0000000000..ef63992b25 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers-json/main.go @@ -0,0 +1,13 @@ +package main + +// Tests of channel 'peers' query, -format=json. +// See go.tools/guru/guru_test.go for explanation. +// See peers-json.golden for expected query results. + +func main() { + chA := make(chan *int) + <-chA + select { + case <-chA: // @peers peer-recv-chA "<-" + } +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers-json/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers-json/main.golden new file mode 100644 index 0000000000..8c2d06c72b --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers-json/main.golden @@ -0,0 +1,15 @@ +-------- @peers peer-recv-chA -------- +{ + "mode": "peers", + "peers": { + "pos": "testdata/src/peers-json/main.go:11:7", + "type": "chan *int", + "allocs": [ + "testdata/src/peers-json/main.go:8:13" + ], + "receives": [ + "testdata/src/peers-json/main.go:9:2", + "testdata/src/peers-json/main.go:11:7" + ] + } +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers/main.go new file mode 100644 index 0000000000..fa533f64b1 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers/main.go @@ -0,0 +1,52 @@ +package main + +// Tests of channel 'peers' query. +// See go.tools/guru/guru_test.go for explanation. +// See peers.golden for expected query results. + +var a2 int + +func main() { + chA := make(chan *int) + a1 := 1 + chA <- &a1 + + chA2 := make(chan *int, 2) + if a2 == 0 { + chA = chA2 + } + + chB := make(chan *int) + b := 3 + chB <- &b + + <-chA // @pointsto pointsto-chA "chA" + <-chA2 // @pointsto pointsto-chA2 "chA2" + <-chB // @pointsto pointsto-chB "chB" + + select { + case rA := <-chA: // @peers peer-recv-chA "<-" + _ = rA // @pointsto pointsto-rA "rA" + case rB := <-chB: // @peers peer-recv-chB "<-" + _ = rB // @pointsto pointsto-rB "rB" + + case <-chA: // @peers peer-recv-chA' "<-" + + case chA2 <- &a2: // @peers peer-send-chA' "<-" + } + + for _ = range chA { + } + + close(chA) // @peers peer-close-chA "chA" + + chC := make(chan *int) + (close)(chC) // @peers peer-close-chC "chC" + + close := func(ch chan *int) chan *int { + return ch + } + + close(chC) <- &b // @peers peer-send-chC "chC" + <-close(chC) // @peers peer-recv-chC "chC" +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers/main.golden new file mode 100644 index 0000000000..f97e672953 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/peers/main.golden @@ -0,0 +1,100 @@ +-------- @pointsto pointsto-chA -------- +this chan *int may point to these objects: + makechan + makechan + +-------- @pointsto pointsto-chA2 -------- +this chan *int may point to these objects: + makechan + +-------- @pointsto pointsto-chB -------- +this chan *int may point to these objects: + makechan + +-------- @peers peer-recv-chA -------- +This channel of type chan *int may be: + allocated here + allocated here + sent to, here + sent to, here + received from, here + received from, here + received from, here + received from, here + received from, here + closed, here + +-------- @pointsto pointsto-rA -------- +this *int may point to these objects: + peers.a2 + a1 + +-------- @peers peer-recv-chB -------- +This channel of type chan *int may be: + allocated here + sent to, here + received from, here + received from, here + +-------- @pointsto pointsto-rB -------- +this *int may point to these objects: + b + +-------- @peers peer-recv-chA' -------- +This channel of type chan *int may be: + allocated here + allocated here + sent to, here + sent to, here + received from, here + received from, here + received from, here + received from, here + received from, here + closed, here + +-------- @peers peer-send-chA' -------- +This channel of type chan *int may be: + allocated here + sent to, here + received from, here + received from, here + received from, here + received from, here + received from, here + closed, here + +-------- @peers peer-close-chA -------- +This channel of type chan *int may be: + allocated here + allocated here + sent to, here + sent to, here + received from, here + received from, here + received from, here + received from, here + received from, here + closed, here + +-------- @peers peer-close-chC -------- +This channel of type chan *int may be: + allocated here + sent to, here + received from, here + closed, here + +-------- @peers peer-send-chC -------- +This channel of type chan *int may be: + allocated here + sent to, here + received from, here + closed, here + +-------- @peers peer-recv-chC -------- +This channel of type chan *int may be: + allocated here + sent to, here + received from, here + closed, here + diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto-json/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto-json/main.go new file mode 100644 index 0000000000..0a9f318668 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto-json/main.go @@ -0,0 +1,27 @@ +package main + +// Tests of 'pointsto' queries, -format=json. +// See go.tools/guru/guru_test.go for explanation. +// See pointsto-json.golden for expected query results. + +func main() { // + var s struct{ x [3]int } + p := &s.x[0] // @pointsto val-p "p" + _ = p + + var i I = C(0) + if i == nil { + i = new(D) + } + print(i) // @pointsto val-i "\\bi\\b" +} + +type I interface { + f() +} + +type C int +type D struct{} + +func (c C) f() {} +func (d *D) f() {} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto-json/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto-json/main.golden new file mode 100644 index 0000000000..13ac1df9af --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto-json/main.golden @@ -0,0 +1,35 @@ +-------- @pointsto val-p -------- +{ + "mode": "pointsto", + "pointsto": [ + { + "type": "*int", + "labels": [ + { + "pos": "testdata/src/pointsto-json/main.go:8:6", + "desc": "s.x[*]" + } + ] + } + ] +} +-------- @pointsto val-i -------- +{ + "mode": "pointsto", + "pointsto": [ + { + "type": "*D", + "namepos": "testdata/src/pointsto-json/main.go:24:6", + "labels": [ + { + "pos": "testdata/src/pointsto-json/main.go:14:10", + "desc": "new" + } + ] + }, + { + "type": "C", + "namepos": "testdata/src/pointsto-json/main.go:23:6" + } + ] +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto/main.go new file mode 100644 index 0000000000..c4ba2e258f --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto/main.go @@ -0,0 +1,75 @@ +package main + +// Tests of 'pointsto' query. +// See go.tools/guru/guru_test.go for explanation. +// See pointsto.golden for expected query results. + +const pi = 3.141 // @pointsto const "pi" + +var global = new(string) // NB: ssa.Global is indirect, i.e. **string + +func main() { + livecode() + + // func objects + _ = main // @pointsto func-ref-main "main" + _ = (*C).f // @pointsto func-ref-*C.f "..C..f" + _ = D.f // @pointsto func-ref-D.f "D.f" + _ = I.f // @pointsto func-ref-I.f "I.f" + var d D + var i I + _ = d.f // @pointsto func-ref-d.f "d.f" + _ = i.f // @pointsto func-ref-i.f "i.f" + + // var objects + anon := func() { + _ = d.f // @pointsto ref-lexical-d.f "d.f" + } + _ = anon // @pointsto ref-anon "anon" + _ = global // @pointsto ref-global "global" + + // SSA affords some local flow sensitivity. + var a, b int + var x = &a // @pointsto var-def-x-1 "x" + _ = x // @pointsto var-ref-x-1 "x" + x = &b // @pointsto var-def-x-2 "x" + _ = x // @pointsto var-ref-x-2 "x" + + i = new(C) // @pointsto var-ref-i-C "i" + if i != nil { + i = D{} // @pointsto var-ref-i-D "i" + } + print(i) // @pointsto var-ref-i "\\bi\\b" + + m := map[string]*int{"a": &a} + mapval, _ := m["a"] // @pointsto map-lookup,ok "m..a.." + _ = mapval // @pointsto mapval "mapval" + _ = m // @pointsto m "m" + + if false { + panic(3) // @pointsto builtin-panic "panic" + } + + // NB: s.f is addressable per (*ssa.Program).VarValue, + // but our query concerns the object, not its address. + s := struct{ f interface{} }{f: make(chan bool)} + print(s.f) // @pointsto var-ref-s-f "s.f" +} + +func livecode() {} // @pointsto func-live "livecode" + +func deadcode() { // @pointsto func-dead "deadcode" + // Pointer analysis can't run on dead code. + var b = new(int) // @pointsto b "b" + _ = b +} + +type I interface { + f() +} + +type C int +type D struct{} + +func (c *C) f() {} +func (d D) f() {} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto/main.golden new file mode 100644 index 0000000000..7b12b2aff7 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/pointsto/main.golden @@ -0,0 +1,96 @@ +-------- @pointsto const -------- + +Error: pointer analysis wants an expression of reference type; got untyped float +-------- @pointsto func-ref-main -------- +this func() may point to these objects: + pointsto.main + +-------- @pointsto func-ref-*C.f -------- +this func() may point to these objects: + (*pointsto.C).f + +-------- @pointsto func-ref-D.f -------- +this func() may point to these objects: + (pointsto.D).f + +-------- @pointsto func-ref-I.f -------- + +Error: func (pointsto.I).f() is an interface method +-------- @pointsto func-ref-d.f -------- +this func() may point to these objects: + (pointsto.D).f + +-------- @pointsto func-ref-i.f -------- + +Error: func (pointsto.I).f() is an interface method +-------- @pointsto ref-lexical-d.f -------- +this func() may point to these objects: + (pointsto.D).f + +-------- @pointsto ref-anon -------- +this func() may point to these objects: + pointsto.main$1 + +-------- @pointsto ref-global -------- +this *string may point to these objects: + new + +-------- @pointsto var-def-x-1 -------- +this *int may point to these objects: + a + +-------- @pointsto var-ref-x-1 -------- +this *int may point to these objects: + a + +-------- @pointsto var-def-x-2 -------- +this *int may point to these objects: + b + +-------- @pointsto var-ref-x-2 -------- +this *int may point to these objects: + b + +-------- @pointsto var-ref-i-C -------- +this I may contain these dynamic types: + *C, may point to: + new + +-------- @pointsto var-ref-i-D -------- +this I may contain these dynamic types: + D + +-------- @pointsto var-ref-i -------- +this I may contain these dynamic types: + *C, may point to: + new + D + +-------- @pointsto map-lookup,ok -------- + +Error: pointer analysis wants an expression of reference type; got (*int, bool) +-------- @pointsto mapval -------- +this *int may point to these objects: + a + +-------- @pointsto m -------- +this map[string]*int may point to these objects: + makemap + +-------- @pointsto builtin-panic -------- + +Error: pointer analysis wants an expression of reference type; got () +-------- @pointsto var-ref-s-f -------- +this interface{} may contain these dynamic types: + chan bool, may point to: + makechan + +-------- @pointsto func-live -------- + +Error: pointer analysis did not find expression (dead code?) +-------- @pointsto func-dead -------- + +Error: pointer analysis did not find expression (dead code?) +-------- @pointsto b -------- + +Error: pointer analysis did not find expression (dead code?) diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers-json/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers-json/main.go new file mode 100644 index 0000000000..0fd2342526 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers-json/main.go @@ -0,0 +1,24 @@ +package main + +// Tests of 'referrers' query. +// See go.tools/guru/guru_test.go for explanation. +// See referrers.golden for expected query results. + +import "lib" + +type s struct { + f int +} + +func main() { + var v lib.Type = lib.Const // @referrers ref-package "lib" + _ = v.Method // @referrers ref-method "Method" + _ = v.Method + v++ //@referrers ref-local "v" + v++ + + _ = s{}.f // @referrers ref-field "f" + + var s2 s + s2.f = 1 +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers-json/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers-json/main.golden new file mode 100644 index 0000000000..0b29003afe --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers-json/main.golden @@ -0,0 +1,64 @@ +-------- @referrers ref-package -------- +{ + "mode": "referrers", + "referrers": { + "desc": "package lib", + "refs": [ + "testdata/src/describe/main.go:91:8", + "testdata/src/imports/main.go:18:12", + "testdata/src/imports/main.go:19:2", + "testdata/src/imports/main.go:20:2", + "testdata/src/imports/main.go:21:8", + "testdata/src/imports/main.go:26:8", + "testdata/src/referrers-json/main.go:14:8", + "testdata/src/referrers-json/main.go:14:19", + "testdata/src/referrers/ext_test.go:10:7", + "testdata/src/referrers/int_test.go:7:7", + "testdata/src/referrers/main.go:16:8", + "testdata/src/referrers/main.go:16:19" + ] + } +} +-------- @referrers ref-method -------- +{ + "mode": "referrers", + "referrers": { + "objpos": "testdata/src/lib/lib.go:5:13", + "desc": "func (lib.Type).Method(x *int) *int", + "refs": [ + "testdata/src/imports/main.go:22:9", + "testdata/src/referrers-json/main.go:15:8", + "testdata/src/referrers-json/main.go:16:8", + "testdata/src/referrers/ext_test.go:10:17", + "testdata/src/referrers/int_test.go:7:17", + "testdata/src/referrers/main.go:17:8", + "testdata/src/referrers/main.go:18:8" + ] + } +} +-------- @referrers ref-local -------- +{ + "mode": "referrers", + "referrers": { + "objpos": "testdata/src/referrers-json/main.go:14:6", + "desc": "var v lib.Type", + "refs": [ + "testdata/src/referrers-json/main.go:15:6", + "testdata/src/referrers-json/main.go:16:6", + "testdata/src/referrers-json/main.go:17:2", + "testdata/src/referrers-json/main.go:18:2" + ] + } +} +-------- @referrers ref-field -------- +{ + "mode": "referrers", + "referrers": { + "objpos": "testdata/src/referrers-json/main.go:10:2", + "desc": "field f int", + "refs": [ + "testdata/src/referrers-json/main.go:20:10", + "testdata/src/referrers-json/main.go:23:5" + ] + } +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/ext_test.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/ext_test.go new file mode 100644 index 0000000000..35e3199ac2 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/ext_test.go @@ -0,0 +1,12 @@ +package main_test + +import ( + "lib" + renamed "referrers" // package has name "main", path "referrers", local name "renamed" +) + +func _() { + // This reference should be found by the ref-method query. + _ = (lib.Type).Method // ref from external test package + var _ renamed.T +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/int_test.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/int_test.go new file mode 100644 index 0000000000..9102cd6f8b --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/int_test.go @@ -0,0 +1,8 @@ +package main + +import "lib" + +func _() { + // This reference should be found by the ref-method query. + _ = (lib.Type).Method // ref from internal test package +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/main.go new file mode 100644 index 0000000000..1fc80ea220 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/main.go @@ -0,0 +1,34 @@ +package main // @referrers package-decl "main" + +// Tests of 'referrers' query. +// See go.tools/guru/guru_test.go for explanation. +// See referrers.golden for expected query results. + +import "lib" + +type s struct { // @referrers type " s " + f int +} + +type T int + +func main() { + var v lib.Type = lib.Const // @referrers ref-package "lib" + _ = v.Method // @referrers ref-method "Method" + _ = v.Method + v++ //@referrers ref-local "v" + v++ + + _ = s{}.f // @referrers ref-field "f" + + var s2 s + s2.f = 1 +} + +// Test //line directives: + +type U int // @referrers ref-type-U "U" + +//line nosuchfile.y:123 +var u1 U +var u2 U diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/main.golden new file mode 100644 index 0000000000..a719e67038 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/referrers/main.golden @@ -0,0 +1,50 @@ +-------- @referrers package-decl -------- +1 references to package main ("referrers") + var _ renamed.T + +-------- @referrers type -------- +2 references to type s struct{f int} + _ = s{}.f // @referrers ref-field "f" + var s2 s + +-------- @referrers ref-package -------- +12 references to package lib + var _ lib.Outer // @describe lib-outer "Outer" + const c = lib.Const // @describe ref-const "Const" + lib.Func() // @describe ref-func "Func" + lib.Var++ // @describe ref-var "Var" + var t lib.Type // @describe ref-type "Type" + var _ lib.Type // @describe ref-pkg "lib" + var v lib.Type = lib.Const // @referrers ref-package "lib" + var v lib.Type = lib.Const // @referrers ref-package "lib" + _ = (lib.Type).Method // ref from external test package + _ = (lib.Type).Method // ref from internal test package + var v lib.Type = lib.Const // @referrers ref-package "lib" + var v lib.Type = lib.Const // @referrers ref-package "lib" + +-------- @referrers ref-method -------- +7 references to func (Type).Method(x *int) *int + p := t.Method(&a) // @describe ref-method "Method" + _ = v.Method // @referrers ref-method "Method" + _ = v.Method + _ = (lib.Type).Method // ref from external test package + _ = (lib.Type).Method // ref from internal test package + _ = v.Method // @referrers ref-method "Method" + _ = v.Method + +-------- @referrers ref-local -------- +4 references to var v lib.Type + _ = v.Method // @referrers ref-method "Method" + _ = v.Method + v++ //@referrers ref-local "v" + v++ + +-------- @referrers ref-field -------- +2 references to field f int + _ = s{}.f // @referrers ref-field "f" + s2.f = 1 + +-------- @referrers ref-type-U -------- +2 references to type U int +open testdata/src/referrers/nosuchfile.y: no such file or directory (+ 1 more refs in this file) + diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/reflection/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/reflection/main.go new file mode 100644 index 0000000000..392643baa8 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/reflection/main.go @@ -0,0 +1,30 @@ +package main + +// This is a test of 'pointsto', but we split it into a separate file +// so that pointsto.go doesn't have to import "reflect" each time. + +import "reflect" + +var a int +var b bool + +func main() { + m := make(map[*int]*bool) + m[&a] = &b + + mrv := reflect.ValueOf(m) + if a > 0 { + mrv = reflect.ValueOf(&b) + } + if a > 0 { + mrv = reflect.ValueOf(&a) + } + + _ = mrv // @pointsto mrv "mrv" + p1 := mrv.Interface() // @pointsto p1 "p1" + p2 := mrv.MapKeys() // @pointsto p2 "p2" + p3 := p2[0] // @pointsto p3 "p3" + p4 := reflect.TypeOf(p1) // @pointsto p4 "p4" + + _, _, _, _ = p1, p2, p3, p4 +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/reflection/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/reflection/main.golden new file mode 100644 index 0000000000..4782132bd7 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/reflection/main.golden @@ -0,0 +1,34 @@ +-------- @pointsto mrv -------- +this reflect.Value may contain these dynamic types: + *bool, may point to: + reflection.b + *int, may point to: + reflection.a + map[*int]*bool, may point to: + makemap + +-------- @pointsto p1 -------- +this interface{} may contain these dynamic types: + *bool, may point to: + reflection.b + *int, may point to: + reflection.a + map[*int]*bool, may point to: + makemap + +-------- @pointsto p2 -------- +this []reflect.Value may point to these objects: + <alloc in (reflect.Value).MapKeys> + +-------- @pointsto p3 -------- +this reflect.Value may contain these dynamic types: + *int, may point to: + reflection.a + +-------- @pointsto p4 -------- +this reflect.Type may contain these dynamic types: + *reflect.rtype, may point to: + *bool + *int + map[*int]*bool + diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/what-json/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/what-json/main.go new file mode 100644 index 0000000000..49fd0a8409 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/what-json/main.go @@ -0,0 +1,9 @@ +package main + +// Tests of 'what' queries, -format=json. +// See go.tools/guru/guru_test.go for explanation. +// See what-json.golden for expected query results. + +func main() { + f() // @what call "f" +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/what-json/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/what-json/main.golden new file mode 100644 index 0000000000..ee1e3c7c68 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/what-json/main.golden @@ -0,0 +1,51 @@ +-------- @what call -------- +{ + "mode": "what", + "what": { + "enclosing": [ + { + "desc": "identifier", + "start": 175, + "end": 176 + }, + { + "desc": "function call (or conversion)", + "start": 175, + "end": 178 + }, + { + "desc": "expression statement", + "start": 175, + "end": 178 + }, + { + "desc": "block", + "start": 172, + "end": 198 + }, + { + "desc": "function declaration", + "start": 160, + "end": 198 + }, + { + "desc": "source file", + "start": 0, + "end": 198 + } + ], + "modes": [ + "callees", + "callers", + "callstack", + "definition", + "describe", + "freevars", + "implements", + "pointsto", + "referrers" + ], + "srcdir": "testdata/src", + "importpath": "what-json" + } +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/what/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/what/main.go new file mode 100644 index 0000000000..9e6a8b920a --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/what/main.go @@ -0,0 +1,11 @@ +package main // @what pkgdecl "main" + +// Tests of 'what' queries. +// See go.tools/guru/guru_test.go for explanation. +// See what.golden for expected query results. + +func main() { + f() // @what call "f" + var ch chan int // @what var "var" + <-ch // @what recv "ch" +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/what/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/what/main.golden new file mode 100644 index 0000000000..ac8568fe1b --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/what/main.golden @@ -0,0 +1,41 @@ +-------- @what pkgdecl -------- +identifier +source file +modes: [definition describe freevars implements pointsto referrers] +srcdir: testdata/src +import path: what + +-------- @what call -------- +identifier +function call (or conversion) +expression statement +block +function declaration +source file +modes: [callees callers callstack definition describe freevars implements pointsto referrers] +srcdir: testdata/src +import path: what + +-------- @what var -------- +variable declaration +variable declaration statement +block +function declaration +source file +modes: [callers callstack describe freevars pointsto] +srcdir: testdata/src +import path: what + +-------- @what recv -------- +identifier +unary <- operation +expression statement +block +function declaration +source file +modes: [callers callstack definition describe freevars implements peers pointsto referrers] +srcdir: testdata/src +import path: what +ch +ch + diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/whicherrs/main.go b/vendor/golang.org/x/tools/cmd/guru/testdata/src/whicherrs/main.go new file mode 100644 index 0000000000..d1613c5839 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/whicherrs/main.go @@ -0,0 +1,32 @@ +package main + +type errType string + +const constErr errType = "blah" + +func (et errType) Error() string { + return string(et) +} + +var errVar error = errType("foo") + +func genErr(i int) error { + switch i { + case 0: + return constErr + case 1: + return errVar + default: + return nil + } +} + +func unreachable() { + err := errVar // @whicherrs func-dead "err" + _ = err +} + +func main() { + err := genErr(0) // @whicherrs localerrs "err" + _ = err +} diff --git a/vendor/golang.org/x/tools/cmd/guru/testdata/src/whicherrs/main.golden b/vendor/golang.org/x/tools/cmd/guru/testdata/src/whicherrs/main.golden new file mode 100644 index 0000000000..3484752c51 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/testdata/src/whicherrs/main.golden @@ -0,0 +1,11 @@ +-------- @whicherrs func-dead -------- + +Error: pointer analysis did not find expression (dead code?) +-------- @whicherrs localerrs -------- +this error may point to these globals: + errVar +this error may contain these constants: + constErr +this error may contain these dynamic types: + errType + diff --git a/vendor/golang.org/x/tools/cmd/guru/what.go b/vendor/golang.org/x/tools/cmd/guru/what.go new file mode 100644 index 0000000000..deddcb219b --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/what.go @@ -0,0 +1,249 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "fmt" + "go/ast" + "go/build" + "go/token" + "os" + "path/filepath" + "sort" + "strings" + + "golang.org/x/tools/cmd/guru/serial" + "golang.org/x/tools/go/ast/astutil" +) + +// what reports all the information about the query selection that can be +// obtained from parsing only its containing source file. +// It is intended to be a very low-latency query callable from GUI +// tools, e.g. to populate a menu of options of slower queries about +// the selected location. +// +func what(q *Query) error { + qpos, err := fastQueryPos(q.Build, q.Pos) + if err != nil { + return err + } + q.Fset = qpos.fset + + // (ignore errors) + srcdir, importPath, _ := guessImportPath(q.Fset.File(qpos.start).Name(), q.Build) + + // Determine which query modes are applicable to the selection. + enable := map[string]bool{ + "describe": true, // any syntax; always enabled + } + + if qpos.end > qpos.start { + enable["freevars"] = true // nonempty selection? + } + + for _, n := range qpos.path { + switch n := n.(type) { + case *ast.Ident: + enable["definition"] = true + enable["referrers"] = true + enable["implements"] = true + case *ast.CallExpr: + enable["callees"] = true + case *ast.FuncDecl: + enable["callers"] = true + enable["callstack"] = true + case *ast.SendStmt: + enable["peers"] = true + case *ast.UnaryExpr: + if n.Op == token.ARROW { + enable["peers"] = true + } + } + + // For implements, we approximate findInterestingNode. + if _, ok := enable["implements"]; !ok { + switch n.(type) { + case *ast.ArrayType, + *ast.StructType, + *ast.FuncType, + *ast.InterfaceType, + *ast.MapType, + *ast.ChanType: + enable["implements"] = true + } + } + + // For pointsto, we approximate findInterestingNode. + if _, ok := enable["pointsto"]; !ok { + switch n.(type) { + case ast.Stmt, + *ast.ArrayType, + *ast.StructType, + *ast.FuncType, + *ast.InterfaceType, + *ast.MapType, + *ast.ChanType: + enable["pointsto"] = false // not an expr + + case ast.Expr, ast.Decl, *ast.ValueSpec: + enable["pointsto"] = true // an expr, maybe + + default: + // Comment, Field, KeyValueExpr, etc: ascend. + } + } + } + + // If we don't have an exact selection, disable modes that need one. + if !qpos.exact { + enable["callees"] = false + enable["pointsto"] = false + enable["whicherrs"] = false + enable["describe"] = false + } + + var modes []string + for mode := range enable { + modes = append(modes, mode) + } + sort.Strings(modes) + + // Find the object referred to by the selection (if it's an + // identifier) and report the position of each identifier + // that refers to the same object. + // + // This may return spurious matches (e.g. struct fields) because + // it uses the best-effort name resolution done by go/parser. + var sameids []token.Pos + var object string + if id, ok := qpos.path[0].(*ast.Ident); ok && id.Obj != nil { + object = id.Obj.Name + decl := qpos.path[len(qpos.path)-1] + ast.Inspect(decl, func(n ast.Node) bool { + if n, ok := n.(*ast.Ident); ok && n.Obj == id.Obj { + sameids = append(sameids, n.Pos()) + } + return true + }) + } + + q.result = &whatResult{ + path: qpos.path, + srcdir: srcdir, + importPath: importPath, + modes: modes, + object: object, + sameids: sameids, + } + return nil +} + +// guessImportPath finds the package containing filename, and returns +// its source directory (an element of $GOPATH) and its import path +// relative to it. +// +// TODO(adonovan): what about _test.go files that are not part of the +// package? +// +func guessImportPath(filename string, buildContext *build.Context) (srcdir, importPath string, err error) { + absFile, err := filepath.Abs(filename) + if err != nil { + err = fmt.Errorf("can't form absolute path of %s", filename) + return + } + absFileDir := segments(filepath.Dir(absFile)) + + // Find the innermost directory in $GOPATH that encloses filename. + minD := 1024 + for _, gopathDir := range buildContext.SrcDirs() { + absDir, err := filepath.Abs(gopathDir) + if err != nil { + continue // e.g. non-existent dir on $GOPATH + } + d := prefixLen(segments(absDir), absFileDir) + // If there are multiple matches, + // prefer the innermost enclosing directory + // (smallest d). + if d >= 0 && d < minD { + minD = d + srcdir = gopathDir + importPath = strings.Join(absFileDir[len(absFileDir)-minD:], string(os.PathSeparator)) + } + } + if srcdir == "" { + return "", "", fmt.Errorf("directory %s is not beneath any of these GOROOT/GOPATH directories: %s", + filepath.Dir(absFile), strings.Join(buildContext.SrcDirs(), ", ")) + } + if importPath == "" { + // This happens for e.g. $GOPATH/src/a.go, but + // "" is not a valid path for (*go/build).Import. + return "", "", fmt.Errorf("cannot load package in root of source directory %s", srcdir) + } + return srcdir, importPath, nil +} + +func segments(path string) []string { + return strings.Split(path, string(os.PathSeparator)) +} + +// prefixLen returns the length of the remainder of y if x is a prefix +// of y, a negative number otherwise. +func prefixLen(x, y []string) int { + d := len(y) - len(x) + if d >= 0 { + for i := range x { + if y[i] != x[i] { + return -1 // not a prefix + } + } + } + return d +} + +type whatResult struct { + path []ast.Node + modes []string + srcdir string + importPath string + object string + sameids []token.Pos +} + +func (r *whatResult) display(printf printfFunc) { + for _, n := range r.path { + printf(n, "%s", astutil.NodeDescription(n)) + } + printf(nil, "modes: %s", r.modes) + printf(nil, "srcdir: %s", r.srcdir) + printf(nil, "import path: %s", r.importPath) + for _, pos := range r.sameids { + printf(pos, "%s", r.object) + } +} + +func (r *whatResult) toSerial(res *serial.Result, fset *token.FileSet) { + var enclosing []serial.SyntaxNode + for _, n := range r.path { + enclosing = append(enclosing, serial.SyntaxNode{ + Description: astutil.NodeDescription(n), + Start: fset.Position(n.Pos()).Offset, + End: fset.Position(n.End()).Offset, + }) + } + + var sameids []string + for _, pos := range r.sameids { + sameids = append(sameids, fset.Position(pos).String()) + } + + res.What = &serial.What{ + Modes: r.modes, + SrcDir: r.srcdir, + ImportPath: r.importPath, + Enclosing: enclosing, + Object: r.object, + SameIDs: sameids, + } +} diff --git a/vendor/golang.org/x/tools/cmd/guru/whicherrs.go b/vendor/golang.org/x/tools/cmd/guru/whicherrs.go new file mode 100644 index 0000000000..ff8c1e5121 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/guru/whicherrs.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 main + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" + "sort" + + "golang.org/x/tools/cmd/guru/serial" + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/pointer" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +var builtinErrorType = types.Universe.Lookup("error").Type() + +// whicherrs takes an position to an error and tries to find all types, constants +// and global value which a given error can point to and which can be checked from the +// scope where the error lives. +// In short, it returns a list of things that can be checked against in order to handle +// an error properly. +// +// TODO(dmorsing): figure out if fields in errors like *os.PathError.Err +// can be queried recursively somehow. +func whicherrs(q *Query) error { + lconf := loader.Config{Build: q.Build} + + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, true) // needs exact pos + if err != nil { + return err + } + + prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug) + + ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection) + if err != nil { + return err + } + + path, action := findInterestingNode(qpos.info, qpos.path) + if action != actionExpr { + return fmt.Errorf("whicherrs wants an expression; got %s", + astutil.NodeDescription(qpos.path[0])) + } + var expr ast.Expr + var obj types.Object + switch n := path[0].(type) { + case *ast.ValueSpec: + // ambiguous ValueSpec containing multiple names + return fmt.Errorf("multiple value specification") + case *ast.Ident: + obj = qpos.info.ObjectOf(n) + expr = n + case ast.Expr: + expr = n + default: + return fmt.Errorf("unexpected AST for expr: %T", n) + } + + typ := qpos.info.TypeOf(expr) + if !types.Identical(typ, builtinErrorType) { + return fmt.Errorf("selection is not an expression of type 'error'") + } + // Determine the ssa.Value for the expression. + var value ssa.Value + if obj != nil { + // def/ref of func/var object + value, _, err = ssaValueForIdent(prog, qpos.info, obj, path) + } else { + value, _, err = ssaValueForExpr(prog, qpos.info, path) + } + if err != nil { + return err // e.g. trivially dead code + } + + // Defer SSA construction till after errors are reported. + prog.Build() + + globals := findVisibleErrs(prog, qpos) + constants := findVisibleConsts(prog, qpos) + + res := &whicherrsResult{ + qpos: qpos, + errpos: expr.Pos(), + } + + // TODO(adonovan): the following code is heavily duplicated + // w.r.t. "pointsto". Refactor? + + // Find the instruction which initialized the + // global error. If more than one instruction has stored to the global + // remove the global from the set of values that we want to query. + allFuncs := ssautil.AllFunctions(prog) + for fn := range allFuncs { + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + store, ok := instr.(*ssa.Store) + if !ok { + continue + } + gval, ok := store.Addr.(*ssa.Global) + if !ok { + continue + } + gbl, ok := globals[gval] + if !ok { + continue + } + // we already found a store to this global + // The normal error define is just one store in the init + // so we just remove this global from the set we want to query + if gbl != nil { + delete(globals, gval) + } + globals[gval] = store.Val + } + } + } + + ptaConfig.AddQuery(value) + for _, v := range globals { + ptaConfig.AddQuery(v) + } + + ptares := ptrAnalysis(ptaConfig) + valueptr := ptares.Queries[value] + if valueptr == (pointer.Pointer{}) { + return fmt.Errorf("pointer analysis did not find expression (dead code?)") + } + for g, v := range globals { + ptr, ok := ptares.Queries[v] + if !ok { + continue + } + if !ptr.MayAlias(valueptr) { + continue + } + res.globals = append(res.globals, g) + } + pts := valueptr.PointsTo() + dedup := make(map[*ssa.NamedConst]bool) + for _, label := range pts.Labels() { + // These values are either MakeInterfaces or reflect + // generated interfaces. For the purposes of this + // analysis, we don't care about reflect generated ones + makeiface, ok := label.Value().(*ssa.MakeInterface) + if !ok { + continue + } + constval, ok := makeiface.X.(*ssa.Const) + if !ok { + continue + } + c := constants[*constval] + if c != nil && !dedup[c] { + dedup[c] = true + res.consts = append(res.consts, c) + } + } + concs := pts.DynamicTypes() + concs.Iterate(func(conc types.Type, _ interface{}) { + // go/types is a bit annoying here. + // We want to find all the types that we can + // typeswitch or assert to. This means finding out + // if the type pointed to can be seen by us. + // + // For the purposes of this analysis, the type is always + // either a Named type or a pointer to one. + // There are cases where error can be implemented + // by unnamed types, but in that case, we can't assert to + // it, so we don't care about it for this analysis. + var name *types.TypeName + switch t := conc.(type) { + case *types.Pointer: + named, ok := t.Elem().(*types.Named) + if !ok { + return + } + name = named.Obj() + case *types.Named: + name = t.Obj() + default: + return + } + if !isAccessibleFrom(name, qpos.info.Pkg) { + return + } + res.types = append(res.types, &errorType{conc, name}) + }) + sort.Sort(membersByPosAndString(res.globals)) + sort.Sort(membersByPosAndString(res.consts)) + sort.Sort(sorterrorType(res.types)) + + q.result = res + return nil +} + +// findVisibleErrs returns a mapping from each package-level variable of type "error" to nil. +func findVisibleErrs(prog *ssa.Program, qpos *queryPos) map[*ssa.Global]ssa.Value { + globals := make(map[*ssa.Global]ssa.Value) + for _, pkg := range prog.AllPackages() { + for _, mem := range pkg.Members { + gbl, ok := mem.(*ssa.Global) + if !ok { + continue + } + gbltype := gbl.Type() + // globals are always pointers + if !types.Identical(deref(gbltype), builtinErrorType) { + continue + } + if !isAccessibleFrom(gbl.Object(), qpos.info.Pkg) { + continue + } + globals[gbl] = nil + } + } + return globals +} + +// findVisibleConsts returns a mapping from each package-level constant assignable to type "error", to nil. +func findVisibleConsts(prog *ssa.Program, qpos *queryPos) map[ssa.Const]*ssa.NamedConst { + constants := make(map[ssa.Const]*ssa.NamedConst) + for _, pkg := range prog.AllPackages() { + for _, mem := range pkg.Members { + obj, ok := mem.(*ssa.NamedConst) + if !ok { + continue + } + consttype := obj.Type() + if !types.AssignableTo(consttype, builtinErrorType) { + continue + } + if !isAccessibleFrom(obj.Object(), qpos.info.Pkg) { + continue + } + constants[*obj.Value] = obj + } + } + + return constants +} + +type membersByPosAndString []ssa.Member + +func (a membersByPosAndString) Len() int { return len(a) } +func (a membersByPosAndString) Less(i, j int) bool { + cmp := a[i].Pos() - a[j].Pos() + return cmp < 0 || cmp == 0 && a[i].String() < a[j].String() +} +func (a membersByPosAndString) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type sorterrorType []*errorType + +func (a sorterrorType) Len() int { return len(a) } +func (a sorterrorType) Less(i, j int) bool { + cmp := a[i].obj.Pos() - a[j].obj.Pos() + return cmp < 0 || cmp == 0 && a[i].typ.String() < a[j].typ.String() +} +func (a sorterrorType) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type errorType struct { + typ types.Type // concrete type N or *N that implements error + obj *types.TypeName // the named type N +} + +type whicherrsResult struct { + qpos *queryPos + errpos token.Pos + globals []ssa.Member + consts []ssa.Member + types []*errorType +} + +func (r *whicherrsResult) display(printf printfFunc) { + if len(r.globals) > 0 { + printf(r.qpos, "this error may point to these globals:") + for _, g := range r.globals { + printf(g.Pos(), "\t%s", g.RelString(r.qpos.info.Pkg)) + } + } + if len(r.consts) > 0 { + printf(r.qpos, "this error may contain these constants:") + for _, c := range r.consts { + printf(c.Pos(), "\t%s", c.RelString(r.qpos.info.Pkg)) + } + } + if len(r.types) > 0 { + printf(r.qpos, "this error may contain these dynamic types:") + for _, t := range r.types { + printf(t.obj.Pos(), "\t%s", r.qpos.typeString(t.typ)) + } + } +} + +func (r *whicherrsResult) toSerial(res *serial.Result, fset *token.FileSet) { + we := &serial.WhichErrs{} + we.ErrPos = fset.Position(r.errpos).String() + for _, g := range r.globals { + we.Globals = append(we.Globals, fset.Position(g.Pos()).String()) + } + for _, c := range r.consts { + we.Constants = append(we.Constants, fset.Position(c.Pos()).String()) + } + for _, t := range r.types { + var et serial.WhichErrsType + et.Type = r.qpos.typeString(t.typ) + et.Position = fset.Position(t.obj.Pos()).String() + we.Types = append(we.Types, et) + } + res.WhichErrs = we +} diff --git a/vendor/golang.org/x/tools/cmd/html2article/conv.go b/vendor/golang.org/x/tools/cmd/html2article/conv.go new file mode 100644 index 0000000000..d3267d7a08 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/html2article/conv.go @@ -0,0 +1,366 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This program takes an HTML file and outputs a corresponding article file in +// present format. See: golang.org/x/tools/present +package main // import "golang.org/x/tools/cmd/html2article" + +import ( + "bufio" + "bytes" + "errors" + "flag" + "fmt" + "io" + "log" + "net/url" + "os" + "regexp" + "strings" + + "golang.org/x/net/html" + "golang.org/x/net/html/atom" +) + +func main() { + flag.Parse() + + err := convert(os.Stdout, os.Stdin) + if err != nil { + log.Fatal(err) + } +} + +func convert(w io.Writer, r io.Reader) error { + root, err := html.Parse(r) + if err != nil { + return err + } + + style := find(root, isTag(atom.Style)) + parseStyles(style) + + body := find(root, isTag(atom.Body)) + if body == nil { + return errors.New("couldn't find body") + } + article := limitNewlineRuns(makeHeadings(strings.TrimSpace(text(body)))) + _, err = fmt.Fprintf(w, "Title\n\n%s", article) + return err +} + +type Style string + +const ( + Bold Style = "*" + Italic Style = "_" + Code Style = "`" +) + +var cssRules = make(map[string]Style) + +func parseStyles(style *html.Node) { + if style == nil || style.FirstChild == nil { + log.Println("couldn't find styles") + return + } + s := bufio.NewScanner(strings.NewReader(style.FirstChild.Data)) + + findRule := func(b []byte, atEOF bool) (advance int, token []byte, err error) { + if i := bytes.Index(b, []byte("{")); i >= 0 { + token = bytes.TrimSpace(b[:i]) + advance = i + } + return + } + findBody := func(b []byte, atEOF bool) (advance int, token []byte, err error) { + if len(b) == 0 { + return + } + if b[0] != '{' { + err = fmt.Errorf("expected {, got %c", b[0]) + return + } + if i := bytes.Index(b, []byte("}")); i < 0 { + err = fmt.Errorf("can't find closing }") + return + } else { + token = b[1:i] + advance = i + 1 + } + return + } + + s.Split(findRule) + for s.Scan() { + rule := s.Text() + s.Split(findBody) + if !s.Scan() { + break + } + b := strings.ToLower(s.Text()) + switch { + case strings.Contains(b, "italic"): + cssRules[rule] = Italic + case strings.Contains(b, "bold"): + cssRules[rule] = Bold + case strings.Contains(b, "Consolas") || strings.Contains(b, "Courier New"): + cssRules[rule] = Code + } + s.Split(findRule) + } + if err := s.Err(); err != nil { + log.Println(err) + } +} + +var newlineRun = regexp.MustCompile(`\n\n+`) + +func limitNewlineRuns(s string) string { + return newlineRun.ReplaceAllString(s, "\n\n") +} + +func makeHeadings(body string) string { + buf := new(bytes.Buffer) + lines := strings.Split(body, "\n") + for i, s := range lines { + if i == 0 && !isBoldTitle(s) { + buf.WriteString("* Introduction\n\n") + } + if isBoldTitle(s) { + s = strings.TrimSpace(strings.Replace(s, "*", " ", -1)) + s = "* " + s + } + buf.WriteString(s) + buf.WriteByte('\n') + } + return buf.String() +} + +func isBoldTitle(s string) bool { + return !strings.Contains(s, " ") && + strings.HasPrefix(s, "*") && + strings.HasSuffix(s, "*") +} + +func indent(buf *bytes.Buffer, s string) { + for _, l := range strings.Split(s, "\n") { + if l != "" { + buf.WriteByte('\t') + buf.WriteString(l) + } + buf.WriteByte('\n') + } +} + +func unwrap(buf *bytes.Buffer, s string) { + var cont bool + for _, l := range strings.Split(s, "\n") { + l = strings.TrimSpace(l) + if len(l) == 0 { + if cont { + buf.WriteByte('\n') + buf.WriteByte('\n') + } + cont = false + } else { + if cont { + buf.WriteByte(' ') + } + buf.WriteString(l) + cont = true + } + } +} + +func text(n *html.Node) string { + var buf bytes.Buffer + walk(n, func(n *html.Node) bool { + switch n.Type { + case html.TextNode: + buf.WriteString(n.Data) + return false + case html.ElementNode: + // no-op + default: + return true + } + a := n.DataAtom + if a == atom.Span { + switch { + case hasStyle(Code)(n): + a = atom.Code + case hasStyle(Bold)(n): + a = atom.B + case hasStyle(Italic)(n): + a = atom.I + } + } + switch a { + case atom.Br: + buf.WriteByte('\n') + case atom.P: + unwrap(&buf, childText(n)) + buf.WriteString("\n\n") + case atom.Li: + buf.WriteString("- ") + unwrap(&buf, childText(n)) + buf.WriteByte('\n') + case atom.Pre: + indent(&buf, childText(n)) + buf.WriteByte('\n') + case atom.A: + href, text := attr(n, "href"), childText(n) + // Skip links with no text. + if strings.TrimSpace(text) == "" { + break + } + // Don't emit empty links. + if strings.TrimSpace(href) == "" { + buf.WriteString(text) + break + } + // Use original url for Google Docs redirections. + if u, err := url.Parse(href); err != nil { + log.Printf("parsing url %q: %v", href, err) + } else if u.Host == "www.google.com" && u.Path == "/url" { + href = u.Query().Get("q") + } + fmt.Fprintf(&buf, "[[%s][%s]]", href, text) + case atom.Code: + buf.WriteString(highlight(n, "`")) + case atom.B: + buf.WriteString(highlight(n, "*")) + case atom.I: + buf.WriteString(highlight(n, "_")) + case atom.Img: + src := attr(n, "src") + fmt.Fprintf(&buf, ".image %s\n", src) + case atom.Iframe: + src, w, h := attr(n, "src"), attr(n, "width"), attr(n, "height") + fmt.Fprintf(&buf, "\n.iframe %s %s %s\n", src, h, w) + case atom.Param: + if attr(n, "name") == "movie" { + // Old style YouTube embed. + u := attr(n, "value") + u = strings.Replace(u, "/v/", "/embed/", 1) + if i := strings.Index(u, "&"); i >= 0 { + u = u[:i] + } + fmt.Fprintf(&buf, "\n.iframe %s 540 304\n", u) + } + case atom.Title: + default: + return true + } + return false + }) + return buf.String() +} + +func childText(node *html.Node) string { + var buf bytes.Buffer + for n := node.FirstChild; n != nil; n = n.NextSibling { + fmt.Fprint(&buf, text(n)) + } + return buf.String() +} + +func highlight(node *html.Node, char string) string { + t := strings.Replace(childText(node), " ", char, -1) + return fmt.Sprintf("%s%s%s", char, t, char) +} + +type selector func(*html.Node) bool + +func isTag(a atom.Atom) selector { + return func(n *html.Node) bool { + return n.DataAtom == a + } +} + +func hasClass(name string) selector { + return func(n *html.Node) bool { + for _, a := range n.Attr { + if a.Key == "class" { + for _, c := range strings.Fields(a.Val) { + if c == name { + return true + } + } + } + } + return false + } +} + +func hasStyle(s Style) selector { + return func(n *html.Node) bool { + for rule, s2 := range cssRules { + if s2 != s { + continue + } + if strings.HasPrefix(rule, ".") && hasClass(rule[1:])(n) { + return true + } + if n.DataAtom.String() == rule { + return true + } + } + return false + } +} + +func hasAttr(key, val string) selector { + return func(n *html.Node) bool { + for _, a := range n.Attr { + if a.Key == key && a.Val == val { + return true + } + } + return false + } +} + +func attr(node *html.Node, key string) (value string) { + for _, attr := range node.Attr { + if attr.Key == key { + return attr.Val + } + } + return "" +} + +func findAll(node *html.Node, fn selector) (nodes []*html.Node) { + walk(node, func(n *html.Node) bool { + if fn(n) { + nodes = append(nodes, n) + } + return true + }) + return +} + +func find(n *html.Node, fn selector) *html.Node { + var result *html.Node + walk(n, func(n *html.Node) bool { + if result != nil { + return false + } + if fn(n) { + result = n + return false + } + return true + }) + return result +} + +func walk(n *html.Node, fn selector) { + if fn(n) { + for c := n.FirstChild; c != nil; c = c.NextSibling { + walk(c, fn) + } + } +} diff --git a/vendor/golang.org/x/tools/cmd/oracle/emacs-test.bash b/vendor/golang.org/x/tools/cmd/oracle/emacs-test.bash new file mode 100755 index 0000000000..8c39091682 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/oracle/emacs-test.bash @@ -0,0 +1,50 @@ +#!/bin/bash +# +# Simple test of Go oracle/Emacs integration. +# Requires that GOROOT and GOPATH are set. +# Side effect: builds and installs oracle in $GOROOT. + +set -eu + +[ -z "$GOROOT" ] && { echo "Error: GOROOT is unset." >&2; exit 1; } +[ -z "$GOPATH" ] && { echo "Error: GOPATH is unset." >&2; exit 1; } + +log=/tmp/$(basename $0)-$$.log +thisdir=$(dirname $0) + +function die() { + echo "Error: $@." + cat $log + exit 1 +} >&2 + +trap "rm -f $log" EXIT + +# Build and install oracle. +go get golang.org/x/tools/cmd/oracle || die "'go get' failed" +mv -f $GOPATH/bin/oracle $GOROOT/bin/ +$GOROOT/bin/oracle >$log 2>&1 || true # (prints usage and exits 1) +grep -q "Run.*help" $log || die "$GOROOT/bin/oracle not installed" + + +# Run Emacs, set the scope to the oracle tool itself, +# load ./main.go, and describe the "fmt" import. +emacs --batch --no-splash --no-window-system --no-init \ + --load $GOROOT/misc/emacs/go-mode.el \ + --load $thisdir/oracle.el \ + --eval ' +(progn + (setq go-oracle-scope "golang.org/x/tools/cmd/oracle") + (find-file "'$thisdir'/main.go") + (search-forward "\"fmt\"") + (backward-char) + (go-oracle-describe) + (princ (with-current-buffer "*go-oracle*" + (buffer-substring-no-properties (point-min) (point-max)))) + (kill-emacs 0)) +' main.go >$log 2>&1 || die "emacs command failed" + +# Check that Println is mentioned. +grep -q "fmt/print.go.*func Println" $log || die "didn't find expected lines in log; got:" + +echo "PASS" diff --git a/vendor/golang.org/x/tools/cmd/oracle/main.go b/vendor/golang.org/x/tools/cmd/oracle/main.go new file mode 100644 index 0000000000..42b18d08b2 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/oracle/main.go @@ -0,0 +1,204 @@ +// Copyright 2013 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. + +// oracle: a tool for answering questions about Go source code. +// http://golang.org/s/oracle-design +// http://golang.org/s/oracle-user-manual +// +// Run with -help flag or help subcommand for usage information. +// +package main // import "golang.org/x/tools/cmd/oracle" + +import ( + "bufio" + "encoding/json" + "encoding/xml" + "flag" + "fmt" + "go/build" + "io" + "log" + "os" + "runtime" + "runtime/pprof" + + "golang.org/x/tools/go/buildutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/oracle" +) + +var posFlag = flag.String("pos", "", + "Filename and byte offset or extent of a syntax element about which to query, "+ + "e.g. foo.go:#123,#456, bar.go:#123.") + +var ptalogFlag = flag.String("ptalog", "", + "Location of the points-to analysis log file, or empty to disable logging.") + +var formatFlag = flag.String("format", "plain", "Output format. One of {plain,json,xml}.") + +var reflectFlag = flag.Bool("reflect", false, "Analyze reflection soundly (slow).") + +func init() { + flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc) +} + +const useHelp = "Run 'oracle -help' for more information.\n" + +const helpMessage = `Go source code oracle. +Usage: oracle [<flag> ...] <mode> <args> ... + +The -format flag controls the output format: + plain an editor-friendly format in which every line of output + is of the form "pos: text", where pos is "-" if unknown. + json structured data in JSON syntax. + xml structured data in XML syntax. + +The -pos flag is required in all modes. + +The mode argument determines the query to perform: + + callees show possible targets of selected function call + callers show possible callers of selected function + callstack show path from callgraph root to selected function + definition show declaration of selected identifier + describe describe selected syntax: definition, methods, etc + freevars show free variables of selection + implements show 'implements' relation for selected type or method + peers show send/receive corresponding to selected channel op + pointsto show variables to which the selected pointer may point + referrers show all refs to entity denoted by selected identifier + what show basic information about the selected syntax node + whicherrs show possible values of the selected error variable + +The user manual is available here: http://golang.org/s/oracle-user-manual + +Examples: + +Describe the syntax at offset 530 in this file (an import spec): +% oracle -pos=src/golang.org/x/tools/cmd/oracle/main.go:#530 describe \ + golang.org/x/tools/cmd/oracle + +` + loader.FromArgsUsage + +var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file") + +func init() { + // If $GOMAXPROCS isn't set, use the full capacity of the machine. + // For small machines, use at least 4 threads. + if os.Getenv("GOMAXPROCS") == "" { + n := runtime.NumCPU() + if n < 4 { + n = 4 + } + runtime.GOMAXPROCS(n) + } +} + +func printHelp() { + fmt.Fprintln(os.Stderr, helpMessage) + fmt.Fprintln(os.Stderr, "Flags:") + flag.PrintDefaults() +} + +func main() { + // Don't print full help unless -help was requested. + // Just gently remind users that it's there. + flag.Usage = func() { fmt.Fprint(os.Stderr, useHelp) } + flag.CommandLine.Init(os.Args[0], flag.ContinueOnError) // hack + if err := flag.CommandLine.Parse(os.Args[1:]); err != nil { + // (err has already been printed) + if err == flag.ErrHelp { + printHelp() + } + os.Exit(2) + } + + args := flag.Args() + if len(args) == 0 || args[0] == "" { + fmt.Fprint(os.Stderr, "oracle: a mode argument is required.\n"+useHelp) + os.Exit(2) + } + + mode := args[0] + args = args[1:] + if mode == "help" { + printHelp() + os.Exit(2) + } + + // Set up points-to analysis log file. + var ptalog io.Writer + if *ptalogFlag != "" { + if f, err := os.Create(*ptalogFlag); err != nil { + log.Fatalf("Failed to create PTA log file: %s", err) + } else { + buf := bufio.NewWriter(f) + ptalog = buf + defer func() { + if err := buf.Flush(); err != nil { + log.Printf("flush: %s", err) + } + if err := f.Close(); err != nil { + log.Printf("close: %s", err) + } + }() + } + } + + // Profiling support. + if *cpuprofile != "" { + f, err := os.Create(*cpuprofile) + if err != nil { + log.Fatal(err) + } + pprof.StartCPUProfile(f) + defer pprof.StopCPUProfile() + } + + // -format flag + switch *formatFlag { + case "json", "plain", "xml": + // ok + default: + fmt.Fprintf(os.Stderr, "oracle: illegal -format value: %q.\n"+useHelp, *formatFlag) + os.Exit(2) + } + + // Ask the oracle. + query := oracle.Query{ + Mode: mode, + Pos: *posFlag, + Build: &build.Default, + Scope: args, + PTALog: ptalog, + Reflection: *reflectFlag, + } + + if err := oracle.Run(&query); err != nil { + fmt.Fprintf(os.Stderr, "oracle: %s\n", err) + os.Exit(1) + } + + // Print the result. + switch *formatFlag { + case "json": + b, err := json.MarshalIndent(query.Serial(), "", "\t") + if err != nil { + fmt.Fprintf(os.Stderr, "oracle: JSON error: %s\n", err) + os.Exit(1) + } + os.Stdout.Write(b) + + case "xml": + b, err := xml.MarshalIndent(query.Serial(), "", "\t") + if err != nil { + fmt.Fprintf(os.Stderr, "oracle: XML error: %s\n", err) + os.Exit(1) + } + os.Stdout.Write(b) + + case "plain": + query.WriteTo(os.Stdout) + } +} diff --git a/vendor/golang.org/x/tools/cmd/oracle/oracle.el b/vendor/golang.org/x/tools/cmd/oracle/oracle.el new file mode 100644 index 0000000000..33c7409a59 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/oracle/oracle.el @@ -0,0 +1,230 @@ +;;; +;;; Integration of the Go 'oracle' analysis tool into Emacs. +;;; +;;; To install the Go oracle, run: +;;; % export GOROOT=... GOPATH=... +;;; % go get golang.org/x/tools/cmd/oracle +;;; % mv $GOPATH/bin/oracle $GOROOT/bin/ +;;; +;;; Load this file into Emacs and set go-oracle-scope to your +;;; configuration. Then, find a file of Go source code, enable +;;; go-oracle-mode, select an expression of interest, and press `C-c C-o d' +;;; (for "describe") or run one of the other go-oracle-xxx commands. +;;; +;;; TODO(adonovan): simplify installation and configuration by making +;;; oracle a subcommand of 'go tool'. + +(require 'compile) +(require 'go-mode) +(require 'cl) + +(defgroup go-oracle nil + "Options specific to the Go oracle." + :group 'go) + +(defcustom go-oracle-command "oracle" + "The Go oracle command." + :type 'string + :group 'go-oracle) + +(defcustom go-oracle-scope "" + "The scope of the analysis. See `go-oracle-set-scope'." + :type 'string + :group 'go-oracle) + +(defvar go-oracle--scope-history + nil + "History of values supplied to `go-oracle-set-scope'.") + +;; Extend go-mode-map. +(let ((m go-mode-map)) + (define-key m (kbd "C-c C-o t") #'go-oracle-describe) ; t for type + (define-key m (kbd "C-c C-o f") #'go-oracle-freevars) + (define-key m (kbd "C-c C-o g") #'go-oracle-callgraph) + (define-key m (kbd "C-c C-o i") #'go-oracle-implements) + (define-key m (kbd "C-c C-o c") #'go-oracle-peers) ; c for channel + (define-key m (kbd "C-c C-o r") #'go-oracle-referrers) + (define-key m (kbd "C-c C-o d") #'go-oracle-definition) + (define-key m (kbd "C-c C-o p") #'go-oracle-pointsto) + (define-key m (kbd "C-c C-o s") #'go-oracle-callstack) + (define-key m (kbd "C-c C-o <") #'go-oracle-callers) + (define-key m (kbd "C-c C-o >") #'go-oracle-callees) + (define-key m (kbd "<f5>") #'go-oracle-describe) + (define-key m (kbd "<f6>") #'go-oracle-referrers)) + +;; TODO(dominikh): Rethink set-scope some. Setting it to a file is +;; painful because it doesn't use find-file, and variables/~ aren't +;; expanded. Setting it to an import path is somewhat painful because +;; it doesn't make use of go-mode's import path completion. One option +;; would be having two different functions, but then we can't +;; automatically call it when no scope has been set. Also it wouldn't +;; easily allow specifying more than one file/package. +(defun go-oracle-set-scope () + "Set the scope for the Go oracle, prompting the user to edit the +previous scope. + +The scope specifies a set of arguments, separated by spaces. +It may be: +1) a set of packages whose main() functions will be analyzed. +2) a list of *.go filenames; they will treated like as a single + package (see #3). +3) a single package whose main() function and/or Test* functions + will be analyzed. + +In the common case, this is similar to the argument(s) you would +specify to 'go build'." + (interactive) + (let ((scope (read-from-minibuffer "Go oracle scope: " + go-oracle-scope + nil + nil + 'go-oracle--scope-history))) + (if (string-equal "" scope) + (error "You must specify a non-empty scope for the Go oracle")) + (setq go-oracle-scope scope))) + +(defun go-oracle--run (mode &optional need-scope) + "Run the Go oracle in the specified MODE, passing it the +selected region of the current buffer. If NEED-SCOPE, prompt for +a scope if not already set. Process the output to replace each +file name with a small hyperlink. Display the result." + (if (not buffer-file-name) + (error "Cannot use oracle on a buffer without a file name")) + ;; It's not sufficient to save a modified buffer since if + ;; gofmt-before-save is on the before-save-hook, saving will + ;; disturb the selected region. + (if (buffer-modified-p) + (error "Please save the buffer before invoking go-oracle")) + (and need-scope + (string-equal "" go-oracle-scope) + (go-oracle-set-scope)) + (let* ((filename (file-truename buffer-file-name)) + (posflag (if (use-region-p) + (format "-pos=%s:#%d,#%d" + filename + (1- (go--position-bytes (region-beginning))) + (1- (go--position-bytes (region-end)))) + (format "-pos=%s:#%d" + filename + (1- (position-bytes (point)))))) + (env-vars (go-root-and-paths)) + (goroot-env (concat "GOROOT=" (car env-vars))) + (gopath-env (concat "GOPATH=" (mapconcat #'identity (cdr env-vars) ":")))) + (with-current-buffer (get-buffer-create "*go-oracle*") + (setq buffer-read-only nil) + (erase-buffer) + (insert "Go Oracle\n") + (let ((args (append (list go-oracle-command nil t nil posflag mode) + (split-string go-oracle-scope " " t)))) + ;; Log the command to *Messages*, for debugging. + (message "Command: %s:" args) + (message nil) ; clears/shrinks minibuffer + + (message "Running oracle...") + ;; Use dynamic binding to modify/restore the environment + (let ((process-environment (list* goroot-env gopath-env process-environment))) + (apply #'call-process args))) + (insert "\n") + (compilation-mode) + (setq compilation-error-screen-columns nil) + + ;; Hide the file/line info to save space. + ;; Replace each with a little widget. + ;; compilation-mode + this loop = slooow. + ;; TODO(adonovan): have oracle give us JSON + ;; and we'll do the markup directly. + (let ((buffer-read-only nil) + (p 1)) + (while (not (null p)) + (let ((np (compilation-next-single-property-change p 'compilation-message))) + (if np + (when (equal (line-number-at-pos p) (line-number-at-pos np)) + ;; Using a fixed width greatly improves readability, so + ;; if the filename is longer than 20, show ".../last/17chars.go". + ;; This usually includes the last segment of the package name. + ;; Don't show the line or column number. + (let* ((loc (buffer-substring p np)) ; "/home/foo/go/pkg/file.go:1:2-3:4" + (i (search ":" loc))) + (setq loc (cond + ((null i) "...") + ((>= i 17) (concat "..." (substring loc (- i 17) i))) + (t (substring loc 0 i)))) + ;; np is (typically) the space following ":"; consume it too. + (put-text-property p np 'display (concat loc ":"))) + (goto-char np) + (insert " ") + (incf np))) ; so we don't get stuck (e.g. on a panic stack dump) + (setq p np))) + (message nil)) + + (let ((w (display-buffer (current-buffer)))) + (balance-windows) + (shrink-window-if-larger-than-buffer w) + (set-window-point w (point-min)))))) + +(defun go-oracle-callees () + "Show possible callees of the function call at the current point." + (interactive) + (go-oracle--run "callees" t)) + +(defun go-oracle-callers () + "Show the set of callers of the function containing the current point." + (interactive) + (go-oracle--run "callers" t)) + +(defun go-oracle-callgraph () + "Show the callgraph of the current program." + (interactive) + (go-oracle--run "callgraph" t)) + +(defun go-oracle-callstack () + "Show an arbitrary path from a root of the call graph to the +function containing the current point." + (interactive) + (go-oracle--run "callstack" t)) + +(defun go-oracle-definition () + "Show the definition of the selected identifier." + (interactive) + (go-oracle--run "definition")) + +(defun go-oracle-describe () + "Describe the selected syntax, its kind, type and methods." + (interactive) + (go-oracle--run "describe")) + +(defun go-oracle-pointsto () + "Show what the selected expression points to." + (interactive) + (go-oracle--run "pointsto" t)) + +(defun go-oracle-implements () + "Describe the 'implements' relation for types in the package +containing the current point." + (interactive) + (go-oracle--run "implements")) + +(defun go-oracle-freevars () + "Enumerate the free variables of the current selection." + (interactive) + (go-oracle--run "freevars")) + +(defun go-oracle-peers () + "Enumerate the set of possible corresponding sends/receives for +this channel receive/send operation." + (interactive) + (go-oracle--run "peers" t)) + +(defun go-oracle-referrers () + "Enumerate all references to the object denoted by the selected +identifier." + (interactive) + (go-oracle--run "referrers")) + +(defun go-oracle-whicherrs () + "Show globals, constants and types to which the selected +expression (of type 'error') may refer." + (interactive) + (go-oracle--run "whicherrs" t)) + +(provide 'go-oracle) diff --git a/vendor/golang.org/x/tools/cmd/oracle/oracle.vim b/vendor/golang.org/x/tools/cmd/oracle/oracle.vim new file mode 100644 index 0000000000..cadda78185 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/oracle/oracle.vim @@ -0,0 +1,107 @@ +" -*- text -*- +" oracle.vim -- Vim integration for the Go oracle. +" +" Load with (e.g.) :source oracle.vim +" Call with (e.g.) :GoOracleDescribe +" while cursor or selection is over syntax of interest. +" Run :copen to show the quick-fix file. +" +" This is an absolutely rudimentary integration of the Go Oracle into +" Vim's quickfix mechanism and it needs a number of usability +" improvements before it can be practically useful to Vim users. +" Voluntary contributions welcomed! +" +" TODO(adonovan): +" - reject buffers with no filename. +" - hide all filenames in quickfix buffer. + +" Get the path to the Go oracle executable. +func! s:go_oracle_bin() + let [ext, sep] = (has('win32') || has('win64') ? ['.exe', ';'] : ['', ':']) + let go_oracle = globpath(join(split($GOPATH, sep), ','), '/bin/oracle' . ext) + if go_oracle == '' + let go_oracle = globpath($GOROOT, '/bin/oracle' . ext) + endif + return go_oracle +endfunction + +let s:go_oracle = s:go_oracle_bin() + +func! s:qflist(output) + let qflist = [] + " Parse GNU-style 'file:line.col-line.col: message' format. + let mx = '^\(\a:[\\/][^:]\+\|[^:]\+\):\(\d\+\):\(\d\+\):\(.*\)$' + for line in split(a:output, "\n") + let ml = matchlist(line, mx) + " Ignore non-match lines or warnings + if ml == [] || ml[4] =~ '^ warning:' + continue + endif + let item = { + \ 'filename': ml[1], + \ 'text': ml[4], + \ 'lnum': ml[2], + \ 'col': ml[3], + \} + let bnr = bufnr(fnameescape(ml[1])) + if bnr != -1 + let item['bufnr'] = bnr + endif + call add(qflist, item) + endfor + call setqflist(qflist) + cwindow +endfun + +func! s:getpos(l, c) + if &encoding != 'utf-8' + let buf = a:l == 1 ? '' : (join(getline(1, a:l-1), "\n") . "\n") + let buf .= a:c == 1 ? '' : getline('.')[:a:c-2] + return len(iconv(buf, &encoding, 'utf-8')) + endif + return line2byte(a:l) + (a:c-2) +endfun + +func! s:RunOracle(mode, selected) range abort + let fname = expand('%:p') + let sname = get(g:, 'go_oracle_scope_file', fname) + if a:selected != -1 + let pos1 = s:getpos(line("'<"), col("'<")) + let pos2 = s:getpos(line("'>"), col("'>")) + let cmd = printf('%s -pos=%s:#%d,#%d %s %s', + \ s:go_oracle, + \ shellescape(fname), pos1, pos2, a:mode, shellescape(sname)) + else + let pos = s:getpos(line('.'), col('.')) + let cmd = printf('%s -pos=%s:#%d %s %s', + \ s:go_oracle, + \ shellescape(fname), pos, a:mode, shellescape(sname)) + endif + call s:qflist(system(cmd)) +endfun + +" Describe the expression at the current point. +command! -range=% GoOracleDescribe + \ call s:RunOracle('describe', <count>) + +" Show possible callees of the function call at the current point. +command! -range=% GoOracleCallees + \ call s:RunOracle('callees', <count>) + +" Show the set of callers of the function containing the current point. +command! -range=% GoOracleCallers + \ call s:RunOracle('callers', <count>) + +" Show the callgraph of the current program. +command! -range=% GoOracleCallgraph + \ call s:RunOracle('callgraph', <count>) + +" Describe the 'implements' relation for types in the +" package containing the current point. +command! -range=% GoOracleImplements + \ call s:RunOracle('implements', <count>) + +" Enumerate the set of possible corresponding sends/receives for +" this channel receive/send operation. +command! -range=% GoOracleChannelPeers + \ call s:RunOracle('peers', <count>) diff --git a/vendor/golang.org/x/tools/cmd/present/appengine.go b/vendor/golang.org/x/tools/cmd/present/appengine.go new file mode 100644 index 0000000000..1e39ce1dd9 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/present/appengine.go @@ -0,0 +1,22 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build appengine + +package main + +import ( + "mime" + + "golang.org/x/tools/present" +) + +func init() { + initTemplates("./present/") + present.PlayEnabled = true + initPlayground("./present/", nil) + + // App Engine has no /etc/mime.types + mime.AddExtensionType(".svg", "image/svg+xml") +} diff --git a/vendor/golang.org/x/tools/cmd/present/dir.go b/vendor/golang.org/x/tools/cmd/present/dir.go new file mode 100644 index 0000000000..6845a214c8 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/present/dir.go @@ -0,0 +1,213 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "html/template" + "io" + "log" + "net/http" + "os" + "path/filepath" + "sort" + + "golang.org/x/tools/present" +) + +func init() { + http.HandleFunc("/", dirHandler) +} + +// dirHandler serves a directory listing for the requested path, rooted at basePath. +func dirHandler(w http.ResponseWriter, r *http.Request) { + if r.URL.Path == "/favicon.ico" { + http.Error(w, "not found", 404) + return + } + const base = "." + name := filepath.Join(base, r.URL.Path) + if isDoc(name) { + err := renderDoc(w, name) + if err != nil { + log.Println(err) + http.Error(w, err.Error(), 500) + } + return + } + if isDir, err := dirList(w, name); err != nil { + log.Println(err) + http.Error(w, err.Error(), 500) + return + } else if isDir { + return + } + http.FileServer(http.Dir(base)).ServeHTTP(w, r) +} + +func isDoc(path string) bool { + _, ok := contentTemplate[filepath.Ext(path)] + return ok +} + +var ( + // dirListTemplate holds the front page template. + dirListTemplate *template.Template + + // contentTemplate maps the presentable file extensions to the + // template to be executed. + contentTemplate map[string]*template.Template +) + +func initTemplates(base string) error { + // Locate the template file. + actionTmpl := filepath.Join(base, "templates/action.tmpl") + + contentTemplate = make(map[string]*template.Template) + + for ext, contentTmpl := range map[string]string{ + ".slide": "slides.tmpl", + ".article": "article.tmpl", + } { + contentTmpl = filepath.Join(base, "templates", contentTmpl) + + // Read and parse the input. + tmpl := present.Template() + tmpl = tmpl.Funcs(template.FuncMap{"playable": playable}) + if _, err := tmpl.ParseFiles(actionTmpl, contentTmpl); err != nil { + return err + } + contentTemplate[ext] = tmpl + } + + var err error + dirListTemplate, err = template.ParseFiles(filepath.Join(base, "templates/dir.tmpl")) + if err != nil { + return err + } + + return nil +} + +// renderDoc reads the present file, gets its template representation, +// and executes the template, sending output to w. +func renderDoc(w io.Writer, docFile string) error { + // Read the input and build the doc structure. + doc, err := parse(docFile, 0) + if err != nil { + return err + } + + // Find which template should be executed. + tmpl := contentTemplate[filepath.Ext(docFile)] + + // Execute the template. + return doc.Render(w, tmpl) +} + +func parse(name string, mode present.ParseMode) (*present.Doc, error) { + f, err := os.Open(name) + if err != nil { + return nil, err + } + defer f.Close() + return present.Parse(f, name, 0) +} + +// dirList scans the given path and writes a directory listing to w. +// It parses the first part of each .slide file it encounters to display the +// presentation title in the listing. +// If the given path is not a directory, it returns (isDir == false, err == nil) +// and writes nothing to w. +func dirList(w io.Writer, name string) (isDir bool, err error) { + f, err := os.Open(name) + if err != nil { + return false, err + } + defer f.Close() + fi, err := f.Stat() + if err != nil { + return false, err + } + if isDir = fi.IsDir(); !isDir { + return false, nil + } + fis, err := f.Readdir(0) + if err != nil { + return false, err + } + d := &dirListData{Path: name} + for _, fi := range fis { + // skip the golang.org directory + if name == "." && fi.Name() == "golang.org" { + continue + } + e := dirEntry{ + Name: fi.Name(), + Path: filepath.ToSlash(filepath.Join(name, fi.Name())), + } + if fi.IsDir() && showDir(e.Name) { + d.Dirs = append(d.Dirs, e) + continue + } + if isDoc(e.Name) { + if p, err := parse(e.Path, present.TitlesOnly); err != nil { + log.Println(err) + } else { + e.Title = p.Title + } + switch filepath.Ext(e.Path) { + case ".article": + d.Articles = append(d.Articles, e) + case ".slide": + d.Slides = append(d.Slides, e) + } + } else if showFile(e.Name) { + d.Other = append(d.Other, e) + } + } + if d.Path == "." { + d.Path = "" + } + sort.Sort(d.Dirs) + sort.Sort(d.Slides) + sort.Sort(d.Articles) + sort.Sort(d.Other) + return true, dirListTemplate.Execute(w, d) +} + +// showFile reports whether the given file should be displayed in the list. +func showFile(n string) bool { + switch filepath.Ext(n) { + case ".pdf": + case ".html": + case ".go": + default: + return isDoc(n) + } + return true +} + +// showDir reports whether the given directory should be displayed in the list. +func showDir(n string) bool { + if len(n) > 0 && (n[0] == '.' || n[0] == '_') || n == "present" { + return false + } + return true +} + +type dirListData struct { + Path string + Dirs, Slides, Articles, Other dirEntrySlice +} + +type dirEntry struct { + Name, Path, Title string +} + +type dirEntrySlice []dirEntry + +func (s dirEntrySlice) Len() int { return len(s) } +func (s dirEntrySlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s dirEntrySlice) Less(i, j int) bool { return s[i].Name < s[j].Name } diff --git a/vendor/golang.org/x/tools/cmd/present/doc.go b/vendor/golang.org/x/tools/cmd/present/doc.go new file mode 100644 index 0000000000..7c32696514 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/present/doc.go @@ -0,0 +1,56 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Present displays slide presentations and articles. It runs a web server that +presents slide and article files from the current directory. + +It may be run as a stand-alone command or an App Engine app. + +Usage of present: + -base="": base path for slide template and static resources + -http="127.0.0.1:3999": HTTP service address (e.g., '127.0.0.1:3999') + -nacl=false: use Native Client environment playground (prevents non-Go code execution) + -orighost="": host component of web origin URL (e.g., 'localhost') + -play=true: enable playground (permit execution of arbitrary user code) + +The setup of the Go version of NaCl is documented at: +https://golang.org/wiki/NativeClient + +To use with App Engine, copy the tools/cmd/present directory to the root of +your application and create an app.yaml file similar to this: + + application: [application] + version: [version] + runtime: go + api_version: go1 + + handlers: + - url: /favicon.ico + static_files: present/static/favicon.ico + upload: present/static/favicon.ico + - url: /static + static_dir: present/static + application_readable: true + - url: /.* + script: _go_app + + # nobuild_files is a regexp that identifies which files to not build. It + # is useful for embedding static assets like code snippets and preventing + # them from producing build errors for your project. + nobuild_files: [path regexp for talk materials] + +Present then can be tested in a local App Engine environment with + + goapp serve + +Input files are named foo.extension, where "extension" defines the format of +the generated output. The supported formats are: + .slide // HTML5 slide presentation + .article // article format, such as a blog post + +The present file format is documented by the present package: +http://godoc.org/golang.org/x/tools/present +*/ +package main // import "golang.org/x/tools/cmd/present" diff --git a/vendor/golang.org/x/tools/cmd/present/local.go b/vendor/golang.org/x/tools/cmd/present/local.go new file mode 100644 index 0000000000..d968553a97 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/present/local.go @@ -0,0 +1,129 @@ +// Copyright 2013 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 !appengine + +package main + +import ( + "flag" + "fmt" + "go/build" + "log" + "net" + "net/http" + "net/url" + "os" + "strings" + + "golang.org/x/tools/present" +) + +const basePkg = "golang.org/x/tools/cmd/present" + +var ( + httpAddr = flag.String("http", "127.0.0.1:3999", "HTTP service address (e.g., '127.0.0.1:3999')") + originHost = flag.String("orighost", "", "host component of web origin URL (e.g., 'localhost')") + basePath = flag.String("base", "", "base path for slide template and static resources") + nativeClient = flag.Bool("nacl", false, "use Native Client environment playground (prevents non-Go code execution)") +) + +func main() { + flag.BoolVar(&present.PlayEnabled, "play", true, "enable playground (permit execution of arbitrary user code)") + flag.Parse() + + if *basePath == "" { + p, err := build.Default.Import(basePkg, "", build.FindOnly) + if err != nil { + fmt.Fprintf(os.Stderr, "Couldn't find gopresent files: %v\n", err) + fmt.Fprintf(os.Stderr, basePathMessage, basePkg) + os.Exit(1) + } + *basePath = p.Dir + } + err := initTemplates(*basePath) + if err != nil { + log.Fatalf("Failed to parse templates: %v", err) + } + + ln, err := net.Listen("tcp", *httpAddr) + if err != nil { + log.Fatal(err) + } + defer ln.Close() + + _, port, err := net.SplitHostPort(ln.Addr().String()) + if err != nil { + log.Fatal(err) + } + + origin := &url.URL{Scheme: "http"} + if *originHost != "" { + origin.Host = net.JoinHostPort(*originHost, port) + } else if ln.Addr().(*net.TCPAddr).IP.IsUnspecified() { + name, _ := os.Hostname() + origin.Host = net.JoinHostPort(name, port) + } else { + reqHost, reqPort, err := net.SplitHostPort(*httpAddr) + if err != nil { + log.Fatal(err) + } + if reqPort == "0" { + origin.Host = net.JoinHostPort(reqHost, port) + } else { + origin.Host = *httpAddr + } + } + + initPlayground(*basePath, origin) + http.Handle("/static/", http.FileServer(http.Dir(*basePath))) + + if !ln.Addr().(*net.TCPAddr).IP.IsLoopback() && + present.PlayEnabled && !*nativeClient { + log.Print(localhostWarning) + } + + log.Printf("Open your web browser and visit %s", origin.String()) + log.Fatal(http.Serve(ln, nil)) +} + +func environ(vars ...string) []string { + env := os.Environ() + for _, r := range vars { + k := strings.SplitAfter(r, "=")[0] + var found bool + for i, v := range env { + if strings.HasPrefix(v, k) { + env[i] = r + found = true + } + } + if !found { + env = append(env, r) + } + } + return env +} + +const basePathMessage = ` +By default, gopresent locates the slide template files and associated +static content by looking for a %q package +in your Go workspaces (GOPATH). + +You may use the -base flag to specify an alternate location. +` + +const localhostWarning = ` +WARNING! WARNING! WARNING! + +The present server appears to be listening on an address that is not localhost. +Anyone with access to this address and port will have access to this machine as +the user running present. + +To avoid this message, listen on localhost or run with -play=false. + +If you don't understand this message, hit Control-C to terminate this process. + +WARNING! WARNING! WARNING! +` diff --git a/vendor/golang.org/x/tools/cmd/present/play.go b/vendor/golang.org/x/tools/cmd/present/play.go new file mode 100644 index 0000000000..831b99f447 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/present/play.go @@ -0,0 +1,43 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "bytes" + "fmt" + "io/ioutil" + "net/http" + "path/filepath" + "time" + + "golang.org/x/tools/godoc/static" +) + +var scripts = []string{"jquery.js", "jquery-ui.js", "playground.js", "play.js"} + +// playScript registers an HTTP handler at /play.js that serves all the +// scripts specified by the variable above, and appends a line that +// initializes the playground with the specified transport. +func playScript(root, transport string) { + modTime := time.Now() + var buf bytes.Buffer + for _, p := range scripts { + if s, ok := static.Files[p]; ok { + buf.WriteString(s) + continue + } + b, err := ioutil.ReadFile(filepath.Join(root, "static", p)) + if err != nil { + panic(err) + } + buf.Write(b) + } + fmt.Fprintf(&buf, "\ninitPlayground(new %v());\n", transport) + b := buf.Bytes() + http.HandleFunc("/play.js", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-type", "application/javascript") + http.ServeContent(w, r, "", modTime, bytes.NewReader(b)) + }) +} diff --git a/vendor/golang.org/x/tools/cmd/present/play_http.go b/vendor/golang.org/x/tools/cmd/present/play_http.go new file mode 100644 index 0000000000..02e7314d4c --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/present/play_http.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. + +// +build appengine appenginevm + +package main + +import ( + "net/url" + + "golang.org/x/tools/present" + + _ "golang.org/x/tools/playground" +) + +func initPlayground(basepath string, origin *url.URL) { + playScript(basepath, "HTTPTransport") +} + +func playable(c present.Code) bool { + return present.PlayEnabled && c.Play && c.Ext == ".go" +} diff --git a/vendor/golang.org/x/tools/cmd/present/play_socket.go b/vendor/golang.org/x/tools/cmd/present/play_socket.go new file mode 100644 index 0000000000..df63edabd5 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/present/play_socket.go @@ -0,0 +1,36 @@ +// 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 !appengine,!appenginevm + +package main + +import ( + "net/http" + "net/url" + "runtime" + + "golang.org/x/tools/playground/socket" + "golang.org/x/tools/present" +) + +func initPlayground(basepath string, origin *url.URL) { + if present.PlayEnabled { + if *nativeClient { + socket.RunScripts = false + socket.Environ = func() []string { + if runtime.GOARCH == "amd64" { + return environ("GOOS=nacl", "GOARCH=amd64p32") + } + return environ("GOOS=nacl") + } + } + playScript(basepath, "SocketTransport") + http.Handle("/socket", socket.NewHandler(origin)) + } +} + +func playable(c present.Code) bool { + return present.PlayEnabled && c.Play +} diff --git a/vendor/golang.org/x/tools/cmd/present/static/article.css b/vendor/golang.org/x/tools/cmd/present/static/article.css new file mode 100644 index 0000000000..e6ab1e841c --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/present/static/article.css @@ -0,0 +1,136 @@ +body { + margin: 0; + font-family: Helvetica, Arial, sans-serif; + font-size: 16px; +} +pre, +code { + font-family: Menlo, monospace; + font-size: 14px; +} +pre { + line-height: 18px; + margin: 0; + padding: 0; +} +a { + color: #375EAB; + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +p, ul, ol { + margin: 20px; +} + +h1, h2, h3, h4 { + margin: 20px 0; + padding: 0; + color: #375EAB; + font-weight: bold; +} +h1 { + font-size: 24px; +} +h2 { + font-size: 20px; + background: #E0EBF5; + padding: 2px 5px; +} +h3 { + font-size: 20px; +} +h3, h4 { + margin: 20px 5px; +} +h4 { + font-size: 16px; +} + +div#heading { + float: left; + margin: 0 0 10px 0; + padding: 21px 0; + font-size: 20px; + font-weight: normal; +} + +div#topbar { + background: #E0EBF5; + height: 64px; + overflow: hidden; +} + +body { + text-align: center; +} +div#page { + width: 100%; +} +div#page > .container, +div#topbar > .container { + text-align: left; + margin-left: auto; + margin-right: auto; + padding: 0 20px; + width: 900px; +} +div#page.wide > .container, +div#topbar.wide > .container { + width: auto; +} + +div#footer { + text-align: center; + color: #666; + font-size: 14px; + margin: 40px 0; +} + +.author p { + margin: 20, 0, 0, 0px; +} + +div.code, +div.output { + margin: 20px; + padding: 10px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +div.code { background: #e9e9e9; } +div.output { background: black; } +div.output .stdout { color: #e6e6e6; } +div.output .stderr { color: rgb(244, 74, 63); } +div.output .system { color: rgb(255, 209, 77) } + +.buttons { + margin-left: 20px; +} +div.output .buttons { + margin-left: 0; + margin-bottom: 10px; +} + +#toc { + float: right; + margin: 0px 10px; + padding: 10px; + border: 1px solid #e5ecf9; + background-color: white; + max-width: 33%; + + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +#toc ul, #toc a { + list-style-type: none; + padding-left: 10px; + color: black; + margin: 0px; +} diff --git a/vendor/golang.org/x/tools/cmd/present/static/dir.css b/vendor/golang.org/x/tools/cmd/present/static/dir.css new file mode 100644 index 0000000000..97587e62fa --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/present/static/dir.css @@ -0,0 +1,186 @@ +/* copied from $GOROOT/doc/style.css */ + +body { + margin: 0; + font-family: Helvetica, Arial, sans-serif; + font-size: 16px; +} +pre, +code { + font-family: Menlo, monospace; + font-size: 14px; +} +pre { + line-height: 18px; +} +pre .comment { + color: #375EAB; +} +pre .highlight, +pre .highlight-comment, +pre .selection-highlight, +pre .selection-highlight-comment { + background: #FFFF00; +} +pre .selection, +pre .selection-comment { + background: #FF9632; +} +pre .ln { + color: #999; +} +body { + color: #222; +} +a, +.exampleHeading .text { + color: #375EAB; + text-decoration: none; +} +a:hover, +.exampleHeading .text:hover { + text-decoration: underline; +} +p, +pre, +ul, +ol { + margin: 20px; +} +pre { + background: #e9e9e9; + padding: 10px; + + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +h1, +h2, +h3, +h4, +.rootHeading { + margin: 20px 0; + padding: 0; + color: #375EAB; + font-weight: bold; +} +h1 { + font-size: 24px; +} +h2 { + font-size: 20px; + background: #E0EBF5; + padding: 2px 5px; +} +h3 { + font-size: 20px; +} +h3, +h4 { + margin: 20px 5px; +} +h4 { + font-size: 16px; +} + +dl { + margin: 20px; +} +dd { + margin: 2px 20px; +} +dl, +dd { + font-size: 14px; +} +div#nav table td { + vertical-align: top; +} + +div#heading { + float: left; + margin: 0 0 10px 0; + padding: 21px 0; + font-size: 20px; + font-weight: normal; +} +div#heading a { + color: #222; + text-decoration: none; +} + +div#topbar { + background: #E0EBF5; + height: 64px; +} + +body { + text-align: center; +} +div#page, +div#topbar > .container { + clear: both; + text-align: left; + margin-left: auto; + margin-right: auto; + padding: 0 20px; + width: 900px; +} +div#page.wide, +div#topbar > .wide { + width: auto; +} +div#plusone { + float: right; +} + +div#footer { + color: #666; + font-size: 14px; + margin: 40px 0; +} + +div#menu > a, +div#menu > input { + padding: 10px; + + text-decoration: none; + font-size: 16px; + + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +div#menu > a, +div#menu > input { + border: 1px solid #375EAB; +} +div#menu > a { + color: white; + background: #375EAB; +} + +div#menu { + float: right; + min-width: 590px; + padding: 10px 0; + text-align: right; +} +div#menu > a { + margin-right: 5px; + margin-bottom: 10px; + + padding: 10px; +} +div#menu > input { + position: relative; + top: 1px; + width: 60px; + background: white; + color: #222; +} +div#menu > input.inactive { + color: #999; +} diff --git a/vendor/golang.org/x/tools/cmd/present/static/dir.js b/vendor/golang.org/x/tools/cmd/present/static/dir.js new file mode 100644 index 0000000000..5b0c37e516 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/present/static/dir.js @@ -0,0 +1,41 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// copied from $GOROOT/doc/godocs.js + +function bindEvent(el, e, fn) { + if (el.addEventListener){ + el.addEventListener(e, fn, false); + } else if (el.attachEvent){ + el.attachEvent('on'+e, fn); + } +} + +function godocs_bindSearchEvents() { + var search = document.getElementById('search'); + if (!search) { + // no search box (index disabled) + return; + } + function clearInactive() { + if (search.className == "inactive") { + search.value = ""; + search.className = ""; + } + } + function restoreInactive() { + if (search.value !== "") { + return; + } + if (search.type != "search") { + search.value = search.getAttribute("placeholder"); + } + search.className = "inactive"; + } + restoreInactive(); + bindEvent(search, 'focus', clearInactive); + bindEvent(search, 'blur', restoreInactive); +} + +bindEvent(window, 'load', godocs_bindSearchEvents); diff --git a/vendor/golang.org/x/tools/cmd/present/static/favicon.ico b/vendor/golang.org/x/tools/cmd/present/static/favicon.ico new file mode 100644 index 0000000000..48854ff3b7 Binary files /dev/null and b/vendor/golang.org/x/tools/cmd/present/static/favicon.ico differ diff --git a/vendor/golang.org/x/tools/cmd/present/static/jquery-ui.js b/vendor/golang.org/x/tools/cmd/present/static/jquery-ui.js new file mode 100644 index 0000000000..f39193859c --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/present/static/jquery-ui.js @@ -0,0 +1,6 @@ +/*! jQuery UI - v1.10.2 - 2013-03-20 +* http://jqueryui.com +* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.resizable.js +* Copyright 2013 jQuery Foundation and other contributors Licensed MIT */ + +(function(e,t){function i(t,i){var a,n,r,o=t.nodeName.toLowerCase();return"area"===o?(a=t.parentNode,n=a.name,t.href&&n&&"map"===a.nodeName.toLowerCase()?(r=e("img[usemap=#"+n+"]")[0],!!r&&s(r)):!1):(/input|select|textarea|button|object/.test(o)?!t.disabled:"a"===o?t.href||i:i)&&s(t)}function s(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}var a=0,n=/^ui-id-\d+$/;e.ui=e.ui||{},e.extend(e.ui,{version:"1.10.2",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),scrollParent:function(){var t;return t=e.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(i){if(i!==t)return this.css("zIndex",i);if(this.length)for(var s,a,n=e(this[0]);n.length&&n[0]!==document;){if(s=n.css("position"),("absolute"===s||"relative"===s||"fixed"===s)&&(a=parseInt(n.css("zIndex"),10),!isNaN(a)&&0!==a))return a;n=n.parent()}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++a)})},removeUniqueId:function(){return this.each(function(){n.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var s=e.attr(t,"tabindex"),a=isNaN(s);return(a||s>=0)&&i(t,!a)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(i,s){function a(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===s?["Left","Right"]:["Top","Bottom"],r=s.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+s]=function(i){return i===t?o["inner"+s].call(this):this.each(function(){e(this).css(r,a(this,i)+"px")})},e.fn["outer"+s]=function(t,i){return"number"!=typeof t?o["outer"+s].call(this,t):this.each(function(){e(this).css(r,a(this,t,!0,i)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.support.selectstart="onselectstart"in document.createElement("div"),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,i,s){var a,n=e.ui[t].prototype;for(a in s)n.plugins[a]=n.plugins[a]||[],n.plugins[a].push([i,s[a]])},call:function(e,t,i){var s,a=e.plugins[t];if(a&&e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType)for(s=0;a.length>s;s++)e.options[a[s][0]]&&a[s][1].apply(e.element,i)}},hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",a=!1;return t[s]>0?!0:(t[s]=1,a=t[s]>0,t[s]=0,a)}})})(jQuery);(function(e,t){var i=0,s=Array.prototype.slice,n=e.cleanData;e.cleanData=function(t){for(var i,s=0;null!=(i=t[s]);s++)try{e(i).triggerHandler("remove")}catch(a){}n(t)},e.widget=function(i,s,n){var a,r,o,h,l={},u=i.split(".")[0];i=i.split(".")[1],a=u+"-"+i,n||(n=s,s=e.Widget),e.expr[":"][a.toLowerCase()]=function(t){return!!e.data(t,a)},e[u]=e[u]||{},r=e[u][i],o=e[u][i]=function(e,i){return this._createWidget?(arguments.length&&this._createWidget(e,i),t):new o(e,i)},e.extend(o,r,{version:n.version,_proto:e.extend({},n),_childConstructors:[]}),h=new s,h.options=e.widget.extend({},h.options),e.each(n,function(i,n){return e.isFunction(n)?(l[i]=function(){var e=function(){return s.prototype[i].apply(this,arguments)},t=function(e){return s.prototype[i].apply(this,e)};return function(){var i,s=this._super,a=this._superApply;return this._super=e,this._superApply=t,i=n.apply(this,arguments),this._super=s,this._superApply=a,i}}(),t):(l[i]=n,t)}),o.prototype=e.widget.extend(h,{widgetEventPrefix:r?h.widgetEventPrefix:i},l,{constructor:o,namespace:u,widgetName:i,widgetFullName:a}),r?(e.each(r._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete r._childConstructors):s._childConstructors.push(o),e.widget.bridge(i,o)},e.widget.extend=function(i){for(var n,a,r=s.call(arguments,1),o=0,h=r.length;h>o;o++)for(n in r[o])a=r[o][n],r[o].hasOwnProperty(n)&&a!==t&&(i[n]=e.isPlainObject(a)?e.isPlainObject(i[n])?e.widget.extend({},i[n],a):e.widget.extend({},a):a);return i},e.widget.bridge=function(i,n){var a=n.prototype.widgetFullName||i;e.fn[i]=function(r){var o="string"==typeof r,h=s.call(arguments,1),l=this;return r=!o&&h.length?e.widget.extend.apply(null,[r].concat(h)):r,o?this.each(function(){var s,n=e.data(this,a);return n?e.isFunction(n[r])&&"_"!==r.charAt(0)?(s=n[r].apply(n,h),s!==n&&s!==t?(l=s&&s.jquery?l.pushStack(s.get()):s,!1):t):e.error("no such method '"+r+"' for "+i+" widget instance"):e.error("cannot call methods on "+i+" prior to initialization; "+"attempted to call method '"+r+"'")}):this.each(function(){var t=e.data(this,a);t?t.option(r||{})._init():e.data(this,a,new n(r,this))}),l}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,s){s=e(s||this.defaultElement||this)[0],this.element=e(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),s!==this&&(e.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===s&&this.destroy()}}),this.document=e(s.style?s.ownerDocument:s.document||s),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(i,s){var n,a,r,o=i;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof i)if(o={},n=i.split("."),i=n.shift(),n.length){for(a=o[i]=e.widget.extend({},this.options[i]),r=0;n.length-1>r;r++)a[n[r]]=a[n[r]]||{},a=a[n[r]];if(i=n.pop(),s===t)return a[i]===t?null:a[i];a[i]=s}else{if(s===t)return this.options[i]===t?null:this.options[i];o[i]=s}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!t).attr("aria-disabled",t),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(i,s,n){var a,r=this;"boolean"!=typeof i&&(n=s,s=i,i=!1),n?(s=a=e(s),this.bindings=this.bindings.add(s)):(n=s,s=this.element,a=this.widget()),e.each(n,function(n,o){function h(){return i||r.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?r[o]:o).apply(r,arguments):t}"string"!=typeof o&&(h.guid=o.guid=o.guid||h.guid||e.guid++);var l=n.match(/^(\w+)\s*(.*)$/),u=l[1]+r.eventNamespace,c=l[2];c?a.delegate(c,u,h):s.bind(u,h)})},_off:function(e,t){t=(t||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.unbind(t).undelegate(t)},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,r=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(r)&&r.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var r,o=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),r=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),r&&e.effects&&e.effects.effect[o]?s[t](n):o!==t&&s[o]?s[o](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}})})(jQuery);(function(e){var t=!1;e(document).mouseup(function(){t=!1}),e.widget("ui.mouse",{version:"1.10.2",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):undefined}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&e(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(i){if(!t){this._mouseStarted&&this._mouseUp(i),this._mouseDownEvent=i;var s=this,n=1===i.which,a="string"==typeof this.options.cancel&&i.target.nodeName?e(i.target).closest(this.options.cancel).length:!1;return n&&!a&&this._mouseCapture(i)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){s.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(i)&&this._mouseDelayMet(i)&&(this._mouseStarted=this._mouseStart(i)!==!1,!this._mouseStarted)?(i.preventDefault(),!0):(!0===e.data(i.target,this.widgetName+".preventClickEvent")&&e.removeData(i.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return s._mouseMove(e)},this._mouseUpDelegate=function(e){return s._mouseUp(e)},e(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),i.preventDefault(),t=!0,!0)):!0}},_mouseMove:function(t){return e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button?this._mouseUp(t):this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return e(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}})})(jQuery);(function(e){function t(e){return parseInt(e,10)||0}function i(e){return!isNaN(parseInt(e,10))}e.widget("ui.resizable",e.ui.mouse,{version:"1.10.2",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(e("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.data("ui-resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("<div class='ui-resizable-handle "+a+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String&&(this.handles[i]=e(this.handles[i],this.element).show()),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),e(this.handles[i]).length},this._renderAxis(this.element),this._handles=e(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(i){var s,n,a,o=this.options,r=this.element.position(),h=this.element;return this.resizing=!0,/absolute/.test(h.css("position"))?h.css({position:"absolute",top:h.css("top"),left:h.css("left")}):h.is(".ui-draggable")&&h.css({position:"absolute",top:r.top,left:r.left}),this._renderProxy(),s=t(this.helper.css("left")),n=t(this.helper.css("top")),o.containment&&(s+=e(o.containment).scrollLeft()||0,n+=e(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:s,top:n},this.size=this._helper?{width:h.outerWidth(),height:h.outerHeight()}:{width:h.width(),height:h.height()},this.originalSize=this._helper?{width:h.outerWidth(),height:h.outerHeight()}:{width:h.width(),height:h.height()},this.originalPosition={left:s,top:n},this.sizeDiff={width:h.outerWidth()-h.width(),height:h.outerHeight()-h.height()},this.originalMousePosition={left:i.pageX,top:i.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,a=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===a?this.axis+"-resize":a),h.addClass("ui-resizable-resizing"),this._propagate("start",i),!0},_mouseDrag:function(t){var i,s=this.helper,n={},a=this.originalMousePosition,o=this.axis,r=this.position.top,h=this.position.left,l=this.size.width,u=this.size.height,c=t.pageX-a.left||0,d=t.pageY-a.top||0,p=this._change[o];return p?(i=p.apply(this,[t,c,d]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),this.position.top!==r&&(n.top=this.position.top+"px"),this.position.left!==h&&(n.left=this.position.left+"px"),this.size.width!==l&&(n.width=this.size.width+"px"),this.size.height!==u&&(n.height=this.size.height+"px"),s.css(n),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(n)||this._trigger("resize",t,this.ui()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&e.ui.hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(e){var t,s,n,a,o,r=this.options;o={minWidth:i(r.minWidth)?r.minWidth:0,maxWidth:i(r.maxWidth)?r.maxWidth:1/0,minHeight:i(r.minHeight)?r.minHeight:0,maxHeight:i(r.maxHeight)?r.maxHeight:1/0},(this._aspectRatio||e)&&(t=o.minHeight*this.aspectRatio,n=o.minWidth/this.aspectRatio,s=o.maxHeight*this.aspectRatio,a=o.maxWidth/this.aspectRatio,t>o.minWidth&&(o.minWidth=t),n>o.minHeight&&(o.minHeight=n),o.maxWidth>s&&(o.maxWidth=s),o.maxHeight>a&&(o.maxHeight=a)),this._vBoundaries=o},_updateCache:function(e){this.offset=this.helper.offset(),i(e.left)&&(this.position.left=e.left),i(e.top)&&(this.position.top=e.top),i(e.height)&&(this.size.height=e.height),i(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,s=this.size,n=this.axis;return i(e.height)?e.width=e.height*this.aspectRatio:i(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===n&&(e.left=t.left+(s.width-e.width),e.top=null),"nw"===n&&(e.top=t.top+(s.height-e.height),e.left=t.left+(s.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,s=this.axis,n=i(e.width)&&t.maxWidth&&t.maxWidth<e.width,a=i(e.height)&&t.maxHeight&&t.maxHeight<e.height,o=i(e.width)&&t.minWidth&&t.minWidth>e.width,r=i(e.height)&&t.minHeight&&t.minHeight>e.height,h=this.originalPosition.left+this.originalSize.width,l=this.position.top+this.size.height,u=/sw|nw|w/.test(s),c=/nw|ne|n/.test(s);return o&&(e.width=t.minWidth),r&&(e.height=t.minHeight),n&&(e.width=t.maxWidth),a&&(e.height=t.maxHeight),o&&u&&(e.left=h-t.minWidth),n&&u&&(e.left=h-t.maxWidth),r&&c&&(e.top=l-t.minHeight),a&&c&&(e.top=l-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_proportionallyResize:function(){if(this._proportionallyResizeElements.length){var e,t,i,s,n,a=this.helper||this.element;for(e=0;this._proportionallyResizeElements.length>e;e++){if(n=this._proportionallyResizeElements[e],!this.borderDif)for(this.borderDif=[],i=[n.css("borderTopWidth"),n.css("borderRightWidth"),n.css("borderBottomWidth"),n.css("borderLeftWidth")],s=[n.css("paddingTop"),n.css("paddingRight"),n.css("paddingBottom"),n.css("paddingLeft")],t=0;i.length>t;t++)this.borderDif[t]=(parseInt(i[t],10)||0)+(parseInt(s[t],10)||0);n.css({height:a.height()-this.borderDif[0]-this.borderDif[2]||0,width:a.width()-this.borderDif[1]-this.borderDif[3]||0})}}},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).data("ui-resizable"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&e.ui.hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var i,s,n,a,o,r,h,l=e(this).data("ui-resizable"),u=l.options,c=l.element,d=u.containment,p=d instanceof e?d.get(0):/parent/.test(d)?c.parent().get(0):d;p&&(l.containerElement=e(p),/document/.test(d)||d===document?(l.containerOffset={left:0,top:0},l.containerPosition={left:0,top:0},l.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(i=e(p),s=[],e(["Top","Right","Left","Bottom"]).each(function(e,n){s[e]=t(i.css("padding"+n))}),l.containerOffset=i.offset(),l.containerPosition=i.position(),l.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},n=l.containerOffset,a=l.containerSize.height,o=l.containerSize.width,r=e.ui.hasScroll(p,"left")?p.scrollWidth:o,h=e.ui.hasScroll(p)?p.scrollHeight:a,l.parentData={element:p,left:n.left,top:n.top,width:r,height:h}))},resize:function(t){var i,s,n,a,o=e(this).data("ui-resizable"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,c={top:0,left:0},d=o.containerElement;d[0]!==document&&/static/.test(d.css("position"))&&(c=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-c.left),u&&(o.size.height=o.size.width/o.aspectRatio),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio),o.position.top=o._helper?h.top:0),o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top,i=Math.abs((o._helper?o.offset.left-c.left:o.offset.left-c.left)+o.sizeDiff.width),s=Math.abs((o._helper?o.offset.top-c.top:o.offset.top-h.top)+o.sizeDiff.height),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css("position")),n&&a&&(i-=o.parentData.left),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio))},stop:function(){var t=e(this).data("ui-resizable"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).data("ui-resizable"),i=t.options,s=function(t){e(t).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})};"object"!=typeof i.alsoResize||i.alsoResize.parentNode?s(i.alsoResize):i.alsoResize.length?(i.alsoResize=i.alsoResize[0],s(i.alsoResize)):e.each(i.alsoResize,function(e){s(e)})},resize:function(t,i){var s=e(this).data("ui-resizable"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0},h=function(t,s){e(t).each(function(){var t=e(this),n=e(this).data("ui-resizable-alsoresize"),a={},o=s&&s.length?s:t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(o,function(e,t){var i=(n[t]||0)+(r[t]||0);i&&i>=0&&(a[t]=i||null)}),t.css(a)})};"object"!=typeof n.alsoResize||n.alsoResize.nodeType?h(n.alsoResize):e.each(n.alsoResize,function(e,t){h(e,t)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).data("ui-resizable"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).data("ui-resizable");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).data("ui-resizable");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t=e(this).data("ui-resizable"),i=t.options,s=t.size,n=t.originalSize,a=t.originalPosition,o=t.axis,r="number"==typeof i.grid?[i.grid,i.grid]:i.grid,h=r[0]||1,l=r[1]||1,u=Math.round((s.width-n.width)/h)*h,c=Math.round((s.height-n.height)/l)*l,d=n.width+u,p=n.height+c,f=i.maxWidth&&d>i.maxWidth,m=i.maxHeight&&p>i.maxHeight,g=i.minWidth&&i.minWidth>d,v=i.minHeight&&i.minHeight>p;i.grid=r,g&&(d+=h),v&&(p+=l),f&&(d-=h),m&&(p-=l),/^(se|s|e)$/.test(o)?(t.size.width=d,t.size.height=p):/^(ne)$/.test(o)?(t.size.width=d,t.size.height=p,t.position.top=a.top-c):/^(sw)$/.test(o)?(t.size.width=d,t.size.height=p,t.position.left=a.left-u):(t.size.width=d,t.size.height=p,t.position.top=a.top-c,t.position.left=a.left-u)}})})(jQuery); \ No newline at end of file diff --git a/vendor/golang.org/x/tools/cmd/present/static/slides.js b/vendor/golang.org/x/tools/cmd/present/static/slides.js new file mode 100644 index 0000000000..9534b602b2 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/present/static/slides.js @@ -0,0 +1,526 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +var PERMANENT_URL_PREFIX = '/static/'; + +var SLIDE_CLASSES = ['far-past', 'past', 'current', 'next', 'far-next']; + +var PM_TOUCH_SENSITIVITY = 15; + +var curSlide; + +/* ---------------------------------------------------------------------- */ +/* classList polyfill by Eli Grey + * (http://purl.eligrey.com/github/classList.js/blob/master/classList.js) */ + +if (typeof document !== "undefined" && !("classList" in document.createElement("a"))) { + +(function (view) { + +var + classListProp = "classList" + , protoProp = "prototype" + , elemCtrProto = (view.HTMLElement || view.Element)[protoProp] + , objCtr = Object + strTrim = String[protoProp].trim || function () { + return this.replace(/^\s+|\s+$/g, ""); + } + , arrIndexOf = Array[protoProp].indexOf || function (item) { + for (var i = 0, len = this.length; i < len; i++) { + if (i in this && this[i] === item) { + return i; + } + } + return -1; + } + // Vendors: please allow content code to instantiate DOMExceptions + , DOMEx = function (type, message) { + this.name = type; + this.code = DOMException[type]; + this.message = message; + } + , checkTokenAndGetIndex = function (classList, token) { + if (token === "") { + throw new DOMEx( + "SYNTAX_ERR" + , "An invalid or illegal string was specified" + ); + } + if (/\s/.test(token)) { + throw new DOMEx( + "INVALID_CHARACTER_ERR" + , "String contains an invalid character" + ); + } + return arrIndexOf.call(classList, token); + } + , ClassList = function (elem) { + var + trimmedClasses = strTrim.call(elem.className) + , classes = trimmedClasses ? trimmedClasses.split(/\s+/) : [] + ; + for (var i = 0, len = classes.length; i < len; i++) { + this.push(classes[i]); + } + this._updateClassName = function () { + elem.className = this.toString(); + }; + } + , classListProto = ClassList[protoProp] = [] + , classListGetter = function () { + return new ClassList(this); + } +; +// Most DOMException implementations don't allow calling DOMException's toString() +// on non-DOMExceptions. Error's toString() is sufficient here. +DOMEx[protoProp] = Error[protoProp]; +classListProto.item = function (i) { + return this[i] || null; +}; +classListProto.contains = function (token) { + token += ""; + return checkTokenAndGetIndex(this, token) !== -1; +}; +classListProto.add = function (token) { + token += ""; + if (checkTokenAndGetIndex(this, token) === -1) { + this.push(token); + this._updateClassName(); + } +}; +classListProto.remove = function (token) { + token += ""; + var index = checkTokenAndGetIndex(this, token); + if (index !== -1) { + this.splice(index, 1); + this._updateClassName(); + } +}; +classListProto.toggle = function (token) { + token += ""; + if (checkTokenAndGetIndex(this, token) === -1) { + this.add(token); + } else { + this.remove(token); + } +}; +classListProto.toString = function () { + return this.join(" "); +}; + +if (objCtr.defineProperty) { + var classListPropDesc = { + get: classListGetter + , enumerable: true + , configurable: true + }; + try { + objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); + } catch (ex) { // IE 8 doesn't support enumerable:true + if (ex.number === -0x7FF5EC54) { + classListPropDesc.enumerable = false; + objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); + } + } +} else if (objCtr[protoProp].__defineGetter__) { + elemCtrProto.__defineGetter__(classListProp, classListGetter); +} + +}(self)); + +} +/* ---------------------------------------------------------------------- */ + +/* Slide movement */ + +function hideHelpText() { + document.getElementById('help').style.display = 'none'; +}; + +function getSlideEl(no) { + if ((no < 0) || (no >= slideEls.length)) { + return null; + } else { + return slideEls[no]; + } +}; + +function updateSlideClass(slideNo, className) { + var el = getSlideEl(slideNo); + + if (!el) { + return; + } + + if (className) { + el.classList.add(className); + } + + for (var i in SLIDE_CLASSES) { + if (className != SLIDE_CLASSES[i]) { + el.classList.remove(SLIDE_CLASSES[i]); + } + } +}; + +function updateSlides() { + if (window.trackPageview) window.trackPageview(); + + for (var i = 0; i < slideEls.length; i++) { + switch (i) { + case curSlide - 2: + updateSlideClass(i, 'far-past'); + break; + case curSlide - 1: + updateSlideClass(i, 'past'); + break; + case curSlide: + updateSlideClass(i, 'current'); + break; + case curSlide + 1: + updateSlideClass(i, 'next'); + break; + case curSlide + 2: + updateSlideClass(i, 'far-next'); + break; + default: + updateSlideClass(i); + break; + } + } + + triggerLeaveEvent(curSlide - 1); + triggerEnterEvent(curSlide); + + window.setTimeout(function() { + // Hide after the slide + disableSlideFrames(curSlide - 2); + }, 301); + + enableSlideFrames(curSlide - 1); + enableSlideFrames(curSlide + 2); + + updateHash(); +}; + +function prevSlide() { + hideHelpText(); + if (curSlide > 0) { + curSlide--; + + updateSlides(); + } +}; + +function nextSlide() { + hideHelpText(); + if (curSlide < slideEls.length - 1) { + curSlide++; + + updateSlides(); + } +}; + +/* Slide events */ + +function triggerEnterEvent(no) { + var el = getSlideEl(no); + if (!el) { + return; + } + + var onEnter = el.getAttribute('onslideenter'); + if (onEnter) { + new Function(onEnter).call(el); + } + + var evt = document.createEvent('Event'); + evt.initEvent('slideenter', true, true); + evt.slideNumber = no + 1; // Make it readable + + el.dispatchEvent(evt); +}; + +function triggerLeaveEvent(no) { + var el = getSlideEl(no); + if (!el) { + return; + } + + var onLeave = el.getAttribute('onslideleave'); + if (onLeave) { + new Function(onLeave).call(el); + } + + var evt = document.createEvent('Event'); + evt.initEvent('slideleave', true, true); + evt.slideNumber = no + 1; // Make it readable + + el.dispatchEvent(evt); +}; + +/* Touch events */ + +function handleTouchStart(event) { + if (event.touches.length == 1) { + touchDX = 0; + touchDY = 0; + + touchStartX = event.touches[0].pageX; + touchStartY = event.touches[0].pageY; + + document.body.addEventListener('touchmove', handleTouchMove, true); + document.body.addEventListener('touchend', handleTouchEnd, true); + } +}; + +function handleTouchMove(event) { + if (event.touches.length > 1) { + cancelTouch(); + } else { + touchDX = event.touches[0].pageX - touchStartX; + touchDY = event.touches[0].pageY - touchStartY; + event.preventDefault(); + } +}; + +function handleTouchEnd(event) { + var dx = Math.abs(touchDX); + var dy = Math.abs(touchDY); + + if ((dx > PM_TOUCH_SENSITIVITY) && (dy < (dx * 2 / 3))) { + if (touchDX > 0) { + prevSlide(); + } else { + nextSlide(); + } + } + + cancelTouch(); +}; + +function cancelTouch() { + document.body.removeEventListener('touchmove', handleTouchMove, true); + document.body.removeEventListener('touchend', handleTouchEnd, true); +}; + +/* Preloading frames */ + +function disableSlideFrames(no) { + var el = getSlideEl(no); + if (!el) { + return; + } + + var frames = el.getElementsByTagName('iframe'); + for (var i = 0, frame; frame = frames[i]; i++) { + disableFrame(frame); + } +}; + +function enableSlideFrames(no) { + var el = getSlideEl(no); + if (!el) { + return; + } + + var frames = el.getElementsByTagName('iframe'); + for (var i = 0, frame; frame = frames[i]; i++) { + enableFrame(frame); + } +}; + +function disableFrame(frame) { + frame.src = 'about:blank'; +}; + +function enableFrame(frame) { + var src = frame._src; + + if (frame.src != src && src != 'about:blank') { + frame.src = src; + } +}; + +function setupFrames() { + var frames = document.querySelectorAll('iframe'); + for (var i = 0, frame; frame = frames[i]; i++) { + frame._src = frame.src; + disableFrame(frame); + } + + enableSlideFrames(curSlide); + enableSlideFrames(curSlide + 1); + enableSlideFrames(curSlide + 2); +}; + +function setupInteraction() { + /* Clicking and tapping */ + + var el = document.createElement('div'); + el.className = 'slide-area'; + el.id = 'prev-slide-area'; + el.addEventListener('click', prevSlide, false); + document.querySelector('section.slides').appendChild(el); + + var el = document.createElement('div'); + el.className = 'slide-area'; + el.id = 'next-slide-area'; + el.addEventListener('click', nextSlide, false); + document.querySelector('section.slides').appendChild(el); + + /* Swiping */ + + document.body.addEventListener('touchstart', handleTouchStart, false); +} + +/* Hash functions */ + +function getCurSlideFromHash() { + var slideNo = parseInt(location.hash.substr(1)); + + if (slideNo) { + curSlide = slideNo - 1; + } else { + curSlide = 0; + } +}; + +function updateHash() { + location.replace('#' + (curSlide + 1)); +}; + +/* Event listeners */ + +function handleBodyKeyDown(event) { + // If we're in a code element, only handle pgup/down. + var inCode = event.target.classList.contains("code"); + + switch (event.keyCode) { + case 72: // 'H' hides the help text + case 27: // escape key + if (!inCode) hideHelpText(); + break; + + case 39: // right arrow + case 13: // Enter + case 32: // space + if (inCode) break; + case 34: // PgDn + nextSlide(); + event.preventDefault(); + break; + + case 37: // left arrow + case 8: // Backspace + if (inCode) break; + case 33: // PgUp + prevSlide(); + event.preventDefault(); + break; + + case 40: // down arrow + if (inCode) break; + nextSlide(); + event.preventDefault(); + break; + + case 38: // up arrow + if (inCode) break; + prevSlide(); + event.preventDefault(); + break; + } +}; + +function addEventListeners() { + document.addEventListener('keydown', handleBodyKeyDown, false); +}; + +/* Initialization */ + +function addFontStyle() { + var el = document.createElement('link'); + el.rel = 'stylesheet'; + el.type = 'text/css'; + el.href = '//fonts.googleapis.com/css?family=' + + 'Open+Sans:regular,semibold,italic,italicsemibold|Droid+Sans+Mono'; + + document.body.appendChild(el); +}; + +function addGeneralStyle() { + var el = document.createElement('link'); + el.rel = 'stylesheet'; + el.type = 'text/css'; + el.href = PERMANENT_URL_PREFIX + 'styles.css'; + document.body.appendChild(el); + + var el = document.createElement('meta'); + el.name = 'viewport'; + el.content = 'width=1100,height=750'; + document.querySelector('head').appendChild(el); + + var el = document.createElement('meta'); + el.name = 'apple-mobile-web-app-capable'; + el.content = 'yes'; + document.querySelector('head').appendChild(el); +}; + +function showHelpText() { +}; + +function handleDomLoaded() { + slideEls = document.querySelectorAll('section.slides > article'); + + setupFrames(); + + addFontStyle(); + addGeneralStyle(); + addEventListeners(); + + updateSlides(); + + setupInteraction(); + + if (window.location.hostname == "localhost" || window.location.hostname == "127.0.0.1" || window.location.hostname == "::1") { + hideHelpText(); + } + + document.body.classList.add('loaded'); +}; + +function initialize() { + getCurSlideFromHash(); + + if (window['_DEBUG']) { + PERMANENT_URL_PREFIX = '../'; + } + + if (window['_DCL']) { + handleDomLoaded(); + } else { + document.addEventListener('DOMContentLoaded', handleDomLoaded, false); + } +} + +// If ?debug exists then load the script relative instead of absolute +if (!window['_DEBUG'] && document.location.href.indexOf('?debug') !== -1) { + document.addEventListener('DOMContentLoaded', function() { + // Avoid missing the DomContentLoaded event + window['_DCL'] = true + }, false); + + window['_DEBUG'] = true; + var script = document.createElement('script'); + script.type = 'text/javascript'; + script.src = '../slides.js'; + var s = document.getElementsByTagName('script')[0]; + s.parentNode.insertBefore(script, s); + + // Remove this script + s.parentNode.removeChild(s); +} else { + initialize(); +} diff --git a/vendor/golang.org/x/tools/cmd/present/static/styles.css b/vendor/golang.org/x/tools/cmd/present/static/styles.css new file mode 100644 index 0000000000..d877682bb9 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/present/static/styles.css @@ -0,0 +1,544 @@ +@media screen { + /* Framework */ + html { + height: 100%; + } + + body { + margin: 0; + padding: 0; + + display: block !important; + + height: 100%; + min-height: 740px; + + overflow-x: hidden; + overflow-y: auto; + + background: rgb(215, 215, 215); + background: -o-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190)); + background: -moz-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190)); + background: -webkit-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190)); + background: -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 500, from(rgb(240, 240, 240)), to(rgb(190, 190, 190))); + + -webkit-font-smoothing: antialiased; + } + + .slides { + width: 100%; + height: 100%; + left: 0; + top: 0; + + position: absolute; + + -webkit-transform: translate3d(0, 0, 0); + } + + .slides > article { + display: block; + + position: absolute; + overflow: hidden; + + width: 900px; + height: 700px; + + left: 50%; + top: 50%; + + margin-left: -450px; + margin-top: -350px; + + padding: 40px 60px; + + box-sizing: border-box; + -o-box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + + border-radius: 10px; + -o-border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + + background-color: white; + + border: 1px solid rgba(0, 0, 0, .3); + + transition: transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + -moz-transition: -moz-transform .3s ease-out; + -webkit-transition: -webkit-transform .3s ease-out; + } + .slides.layout-widescreen > article { + margin-left: -550px; + width: 1100px; + } + .slides.layout-faux-widescreen > article { + margin-left: -550px; + width: 1100px; + + padding: 40px 160px; + } + + .slides.layout-widescreen > article:not(.nobackground):not(.biglogo), + .slides.layout-faux-widescreen > article:not(.nobackground):not(.biglogo) { + background-position-x: 0, 840px; + } + + /* Clickable/tappable areas */ + + .slide-area { + z-index: 1000; + + position: absolute; + left: 0; + top: 0; + width: 150px; + height: 700px; + + left: 50%; + top: 50%; + + cursor: pointer; + margin-top: -350px; + + tap-highlight-color: transparent; + -o-tap-highlight-color: transparent; + -moz-tap-highlight-color: transparent; + -webkit-tap-highlight-color: transparent; + } + #prev-slide-area { + margin-left: -550px; + } + #next-slide-area { + margin-left: 400px; + } + .slides.layout-widescreen #prev-slide-area, + .slides.layout-faux-widescreen #prev-slide-area { + margin-left: -650px; + } + .slides.layout-widescreen #next-slide-area, + .slides.layout-faux-widescreen #next-slide-area { + margin-left: 500px; + } + + /* Slides */ + + .slides > article { + display: none; + } + .slides > article.far-past { + display: block; + transform: translate(-2040px); + -o-transform: translate(-2040px); + -moz-transform: translate(-2040px); + -webkit-transform: translate3d(-2040px, 0, 0); + } + .slides > article.past { + display: block; + transform: translate(-1020px); + -o-transform: translate(-1020px); + -moz-transform: translate(-1020px); + -webkit-transform: translate3d(-1020px, 0, 0); + } + .slides > article.current { + display: block; + transform: translate(0); + -o-transform: translate(0); + -moz-transform: translate(0); + -webkit-transform: translate3d(0, 0, 0); + } + .slides > article.next { + display: block; + transform: translate(1020px); + -o-transform: translate(1020px); + -moz-transform: translate(1020px); + -webkit-transform: translate3d(1020px, 0, 0); + } + .slides > article.far-next { + display: block; + transform: translate(2040px); + -o-transform: translate(2040px); + -moz-transform: translate(2040px); + -webkit-transform: translate3d(2040px, 0, 0); + } + + .slides.layout-widescreen > article.far-past, + .slides.layout-faux-widescreen > article.far-past { + display: block; + transform: translate(-2260px); + -o-transform: translate(-2260px); + -moz-transform: translate(-2260px); + -webkit-transform: translate3d(-2260px, 0, 0); + } + .slides.layout-widescreen > article.past, + .slides.layout-faux-widescreen > article.past { + display: block; + transform: translate(-1130px); + -o-transform: translate(-1130px); + -moz-transform: translate(-1130px); + -webkit-transform: translate3d(-1130px, 0, 0); + } + .slides.layout-widescreen > article.current, + .slides.layout-faux-widescreen > article.current { + display: block; + transform: translate(0); + -o-transform: translate(0); + -moz-transform: translate(0); + -webkit-transform: translate3d(0, 0, 0); + } + .slides.layout-widescreen > article.next, + .slides.layout-faux-widescreen > article.next { + display: block; + transform: translate(1130px); + -o-transform: translate(1130px); + -moz-transform: translate(1130px); + -webkit-transform: translate3d(1130px, 0, 0); + } + .slides.layout-widescreen > article.far-next, + .slides.layout-faux-widescreen > article.far-next { + display: block; + transform: translate(2260px); + -o-transform: translate(2260px); + -moz-transform: translate(2260px); + -webkit-transform: translate3d(2260px, 0, 0); + } +} + +@media print { + /* Set page layout */ + @page { + size: A4 landscape; + } + + body { + display: block !important; + } + + .slides > article { + display: block; + + position: relative; + + page-break-inside: never; + page-break-after: always; + + overflow: hidden; + } + + h2 { + position: static !important; + margin-top: 400px !important; + margin-bottom: 100px !important; + } + + div.code { + background: rgb(240, 240, 240); + } + + /* Add explicit links */ + a:link:after, a:visited:after { + content: " (" attr(href) ") "; + font-size: 50%; + } + + #help { + display: none; + visibility: hidden; + } +} + +/* Styles for slides */ + +.slides > article { + font-family: 'Open Sans', Arial, sans-serif; + + color: black; + text-shadow: 0 1px 1px rgba(0, 0, 0, .1); + + font-size: 26px; + line-height: 36px; + + letter-spacing: -1px; +} + +b { + font-weight: 600; +} + +a { + color: rgb(0, 102, 204); + text-decoration: none; +} +a:visited { + color: rgba(0, 102, 204, .75); +} +a:hover { + color: black; +} + +p { + margin: 0; + padding: 0; + + margin-top: 20px; +} +p:first-child { + margin-top: 0; +} + +h1 { + font-size: 60px; + line-height: 60px; + + padding: 0; + margin: 0; + margin-top: 200px; + margin-bottom: 5px; + padding-right: 40px; + + font-weight: 600; + + letter-spacing: -3px; + + color: rgb(51, 51, 51); +} + +h2 { + font-size: 45px; + line-height: 45px; + + position: absolute; + bottom: 150px; + + padding: 0; + margin: 0; + padding-right: 40px; + + font-weight: 600; + + letter-spacing: -2px; + + color: rgb(51, 51, 51); +} + +h3 { + font-size: 30px; + line-height: 36px; + + padding: 0; + margin: 0; + padding-right: 40px; + + font-weight: 600; + + letter-spacing: -1px; + + color: rgb(51, 51, 51); +} + +ul { + margin: 0; + padding: 0; + margin-top: 20px; + margin-left: 1.5em; +} +li { + padding: 0; + margin: 0 0 .5em 0; +} + +div.code { + padding: 5px 10px; + margin-top: 20px; + margin-bottom: 20px; + overflow: hidden; + + background: rgb(240, 240, 240); + border: 1px solid rgb(224, 224, 224); +} +pre { + margin: 0; + padding: 0; + + font-family: 'Droid Sans Mono', 'Courier New', monospace; + font-size: 18px; + line-height: 24px; + letter-spacing: -1px; + + color: black; +} + +pre.numbers span:before { + content: attr(num); + margin-right: 1em; + display: inline-block; +} + +code { + font-size: 95%; + font-family: 'Droid Sans Mono', 'Courier New', monospace; + + color: black; +} + +article > .image, +article > .video { + text-align: center; + margin-top: 40px; +} + +article > .background { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: -1; +} + +article > .background > img { + max-height: 100%; + max-width: 100%; +} + +table { + width: 100%; + border-collapse: collapse; + margin-top: 40px; +} +th { + font-weight: 600; + text-align: left; +} +td, +th { + border: 1px solid rgb(224, 224, 224); + padding: 5px 10px; + vertical-align: top; +} + +p.link { + margin-left: 20px; +} + +/* Code */ +div.code { + outline: 0px solid transparent; +} +div.playground { + position: relative; +} +div.output { + position: absolute; + left: 50%; + top: 50%; + right: 40px; + bottom: 40px; + background: #202020; + padding: 5px 10px; + z-index: 2; + + border-radius: 10px; + -o-border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + +} +div.output pre { + margin: 0; + padding: 0; + background: none; + border: none; + width: 100%; + height: 100%; + overflow: auto; +} +div.output .stdout, div.output pre { + color: #e6e6e6; +} +div.output .stderr, div.output .error { + color: rgb(255, 200, 200); +} +div.output .system, div.output .exit { + color: rgb(255, 230, 120) +} +.buttons { + position: relative; + float: right; + top: -60px; + right: 10px; +} +div.output .buttons { + position: absolute; + float: none; + top: auto; + right: 5px; + bottom: 5px; +} + +/* Presenter details */ +.presenter { + margin-top: 20px; +} +.presenter p, +.presenter .link { + margin: 0; + font-size: 28px; + line-height: 1.2em; +} + +/* Output resize details */ +.ui-resizable-handle { + position: absolute; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100%; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +iframe { + border: none; +} +figcaption { + color: #666; + text-align: center; + font-size: 0.75em; +} + +#help { + font-family: 'Open Sans', Arial, sans-serif; + text-align: center; + color: white; + background: #000; + opacity: 0.5; + position: fixed; + bottom: 25px; + left: 50px; + right: 50px; + padding: 20px; + + border-radius: 10px; + -o-border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} diff --git a/vendor/golang.org/x/tools/cmd/present/templates/action.tmpl b/vendor/golang.org/x/tools/cmd/present/templates/action.tmpl new file mode 100644 index 0000000000..1eae3b7c8d --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/present/templates/action.tmpl @@ -0,0 +1,62 @@ +{/* +This is the action template. +It determines how the formatting actions are rendered. +*/} + +{{define "section"}} + <h{{len .Number}} id="TOC_{{.FormattedNumber}}">{{.FormattedNumber}} {{.Title}}</h{{len .Number}}> + {{range .Elem}}{{elem $.Template .}}{{end}} +{{end}} + +{{define "list"}} + <ul> + {{range .Bullet}} + <li>{{style .}}</li> + {{end}} + </ul> +{{end}} + +{{define "text"}} + {{if .Pre}} + <div class="code"><pre>{{range .Lines}}{{.}}{{end}}</pre></div> + {{else}} + <p> + {{range $i, $l := .Lines}}{{if $i}}{{template "newline"}} + {{end}}{{style $l}}{{end}} + </p> + {{end}} +{{end}} + +{{define "code"}} + <div class="code{{if playable .}} playground{{end}}" contenteditable="true" spellcheck="false">{{.Text}}</div> +{{end}} + +{{define "image"}} +<div class="image"> + <img src="{{.URL}}"{{with .Height}} height="{{.}}"{{end}}{{with .Width}} width="{{.}}"{{end}}> +</div> +{{end}} + +{{define "video"}} +<div class="video"> + <video {{with .Height}} height="{{.}}"{{end}}{{with .Width}} width="{{.}}"{{end}} controls> + <source src="{{.URL}}" type="{{.SourceType}}"> + </video> +</div> +{{end}} + +{{define "background"}} +<div class="background"> + <img src="{{.URL}}"> +</div> +{{end}} + +{{define "iframe"}} +<iframe src="{{.URL}}"{{with .Height}} height="{{.}}"{{end}}{{with .Width}} width="{{.}}"{{end}}></iframe> +{{end}} + +{{define "link"}}<p class="link"><a href="{{.URL}}" target="_blank">{{style .Label}}</a></p>{{end}} + +{{define "html"}}{{.HTML}}{{end}} + +{{define "caption"}}<figcaption>{{style .Text}}</figcaption>{{end}} diff --git a/vendor/golang.org/x/tools/cmd/present/templates/article.tmpl b/vendor/golang.org/x/tools/cmd/present/templates/article.tmpl new file mode 100644 index 0000000000..411f00b115 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/present/templates/article.tmpl @@ -0,0 +1,89 @@ +{/* This is the article template. It defines how articles are formatted. */} + +{{define "root"}} +<!DOCTYPE html> +<html> + <head> + <title>{{.Title}} + + + + + + +

    +
    +
    {{.Title}} + {{with .Subtitle}}{{.}}{{end}} +
    +
    +
    +
    +
    + {{with .Sections}} +
    + {{template "TOC" .}} +
    + {{end}} + + {{range .Sections}} + {{elem $.Template .}} + {{end}}{{/* of Section block */}} + + {{if .Authors}} +

    Authors

    + {{range .Authors}} +
    + {{range .Elem}}{{elem $.Template .}}{{end}} +
    + {{end}} + {{end}} +
    +
    + + {{if .PlayEnabled}} + + {{end}} + + + + +{{end}} + +{{define "TOC"}} +
      + {{range .}} +
    • {{.Title}}
    • + {{with .Sections}}{{template "TOC" .}}{{end}} + {{end}} +
    +{{end}} + +{{define "newline"}} +{{/* No automatic line break. Paragraphs are free-form. */}} +{{end}} diff --git a/vendor/golang.org/x/tools/cmd/present/templates/dir.tmpl b/vendor/golang.org/x/tools/cmd/present/templates/dir.tmpl new file mode 100644 index 0000000000..1732623d69 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/present/templates/dir.tmpl @@ -0,0 +1,108 @@ + + + + + Talks - The Go Programming Language + + + + + + + + +
    + +

    Go talks

    + + {{with .Path}}

    {{.}}

    {{end}} + + {{with .Articles}} +

    Articles:

    +
    + {{range .}} +
    {{.Name}}: {{.Title}}
    + {{end}} +
    + {{end}} + + {{with .Slides}} +

    Slide decks:

    +
    + {{range .}} +
    {{.Name}}: {{.Title}}
    + {{end}} +
    + {{end}} + + {{with .Other}} +

    Files:

    +
    + {{range .}} +
    {{.Name}}
    + {{end}} +
    + {{end}} + + {{with .Dirs}} +

    Sub-directories:

    +
    + {{range .}} +
    {{.Name}}
    + {{end}} +
    + {{end}} + +
    + + + + + + diff --git a/vendor/golang.org/x/tools/cmd/present/templates/slides.tmpl b/vendor/golang.org/x/tools/cmd/present/templates/slides.tmpl new file mode 100644 index 0000000000..2b4ec988f5 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/present/templates/slides.tmpl @@ -0,0 +1,94 @@ +{/* This is the slide template. It defines how presentations are formatted. */} + +{{define "root"}} + + + + {{.Title}} + + + + + + + +
    + +
    +

    {{.Title}}

    + {{with .Subtitle}}

    {{.}}

    {{end}} + {{if not .Time.IsZero}}

    {{.Time.Format "2 January 2006"}}

    {{end}} + {{range .Authors}} +
    + {{range .TextElem}}{{elem $.Template .}}{{end}} +
    + {{end}} +
    + + {{range $i, $s := .Sections}} + +
    + {{if $s.Elem}} +

    {{$s.Title}}

    + {{range $s.Elem}}{{elem $.Template .}}{{end}} + {{else}} +

    {{$s.Title}}

    + {{end}} +
    + + {{end}}{{/* of Slide block */}} + +
    +

    Thank you

    + {{range .Authors}} +
    + {{range .Elem}}{{elem $.Template .}}{{end}} +
    + {{end}} +
    + +
    + +
    + Use the left and right arrow keys or click the left and right + edges of the page to navigate between slides.
    + (Press 'H' or navigate to hide this message.) +
    + + {{if .PlayEnabled}} + + {{end}} + + + + +{{end}} + +{{define "newline"}} +
    +{{end}} diff --git a/vendor/golang.org/x/tools/cmd/ssadump/main.go b/vendor/golang.org/x/tools/cmd/ssadump/main.go new file mode 100644 index 0000000000..bf2bbf24df --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/ssadump/main.go @@ -0,0 +1,180 @@ +// Copyright 2013 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.5 + +// ssadump: a tool for displaying and interpreting the SSA form of Go programs. +package main // import "golang.org/x/tools/cmd/ssadump" + +import ( + "flag" + "fmt" + "go/build" + "go/types" + "os" + "runtime" + "runtime/pprof" + + "golang.org/x/tools/go/buildutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/interp" + "golang.org/x/tools/go/ssa/ssautil" +) + +// flags +var ( + mode = ssa.BuilderMode(0) + + testFlag = flag.Bool("test", false, "Loads test code (*_test.go) for imported packages.") + + runFlag = flag.Bool("run", false, "Invokes the SSA interpreter on the program.") + + interpFlag = flag.String("interp", "", `Options controlling the SSA test interpreter. +The value is a sequence of zero or more more of these letters: +R disable [R]ecover() from panic; show interpreter crash instead. +T [T]race execution of the program. Best for single-threaded programs! +`) + + cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file") +) + +func init() { + flag.Var(&mode, "build", ssa.BuilderModeDoc) + flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc) +} + +const usage = `SSA builder and interpreter. +Usage: ssadump [ ...] ... +Use -help flag to display options. + +Examples: +% ssadump -build=F hello.go # dump SSA form of a single package +% ssadump -run -interp=T hello.go # interpret a program, with tracing +% ssadump -run -test unicode -- -test.v # interpret the unicode package's tests, verbosely +` + loader.FromArgsUsage + + ` +When -run is specified, ssadump will run the program. +The entry point depends on the -test flag: +if clear, it runs the first package named main. +if set, it runs the tests of each package. +` + +func main() { + if err := doMain(); err != nil { + fmt.Fprintf(os.Stderr, "ssadump: %s\n", err) + os.Exit(1) + } +} + +func doMain() error { + flag.Parse() + args := flag.Args() + + conf := loader.Config{Build: &build.Default} + + // Choose types.Sizes from conf.Build. + var wordSize int64 = 8 + switch conf.Build.GOARCH { + case "386", "arm": + wordSize = 4 + } + conf.TypeChecker.Sizes = &types.StdSizes{ + MaxAlign: 8, + WordSize: wordSize, + } + + var interpMode interp.Mode + for _, c := range *interpFlag { + switch c { + case 'T': + interpMode |= interp.EnableTracing + case 'R': + interpMode |= interp.DisableRecover + default: + return fmt.Errorf("unknown -interp option: '%c'", c) + } + } + + if len(args) == 0 { + fmt.Fprint(os.Stderr, usage) + os.Exit(1) + } + + // Profiling support. + if *cpuprofile != "" { + f, err := os.Create(*cpuprofile) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + pprof.StartCPUProfile(f) + defer pprof.StopCPUProfile() + } + + // Use the initial packages from the command line. + args, err := conf.FromArgs(args, *testFlag) + if err != nil { + return err + } + + // The interpreter needs the runtime package. + if *runFlag { + conf.Import("runtime") + } + + // Load, parse and type-check the whole program. + iprog, err := conf.Load() + if err != nil { + return err + } + + // Create and build SSA-form program representation. + prog := ssautil.CreateProgram(iprog, mode) + + // Build and display only the initial packages + // (and synthetic wrappers), unless -run is specified. + for _, info := range iprog.InitialPackages() { + prog.Package(info.Pkg).Build() + } + + // Run the interpreter. + if *runFlag { + prog.Build() + + var main *ssa.Package + pkgs := prog.AllPackages() + if *testFlag { + // If -test, run all packages' tests. + if len(pkgs) > 0 { + main = prog.CreateTestMainPackage(pkgs...) + } + if main == nil { + return fmt.Errorf("no tests") + } + } else { + // Otherwise, run main.main. + for _, pkg := range pkgs { + if pkg.Pkg.Name() == "main" { + main = pkg + if main.Func("main") == nil { + return fmt.Errorf("no func main() in main package") + } + break + } + } + if main == nil { + return fmt.Errorf("no main package") + } + } + + if runtime.GOARCH != build.Default.GOARCH { + return fmt.Errorf("cross-interpretation is not supported (target has GOARCH %s, interpreter has %s)", + build.Default.GOARCH, runtime.GOARCH) + } + + interp.Interpret(main, interpMode, conf.TypeChecker.Sizes, main.Pkg.Path(), args) + } + return nil +} diff --git a/vendor/golang.org/x/tools/cmd/ssadump/main14.go b/vendor/golang.org/x/tools/cmd/ssadump/main14.go new file mode 100644 index 0000000000..201ea8165d --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/ssadump/main14.go @@ -0,0 +1,188 @@ +// Copyright 2013 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.5 + +// ssadump: a tool for displaying and interpreting the SSA form of Go programs. +package main // import "golang.org/x/tools/cmd/ssadump" + +import ( + "flag" + "fmt" + "go/build" + "os" + "runtime" + "runtime/pprof" + + "golang.org/x/tools/go/buildutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/interp" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/go/types" +) + +var ( + modeFlag = ssa.BuilderModeFlag(flag.CommandLine, "build", 0) + + testFlag = flag.Bool("test", false, "Loads test code (*_test.go) for imported packages.") + + runFlag = flag.Bool("run", false, "Invokes the SSA interpreter on the program.") + + interpFlag = flag.String("interp", "", `Options controlling the SSA test interpreter. +The value is a sequence of zero or more more of these letters: +R disable [R]ecover() from panic; show interpreter crash instead. +T [T]race execution of the program. Best for single-threaded programs! +`) +) + +const usage = `SSA builder and interpreter. +Usage: ssadump [ ...] ... +Use -help flag to display options. + +Examples: +% ssadump -build=F hello.go # dump SSA form of a single package +% ssadump -run -interp=T hello.go # interpret a program, with tracing +% ssadump -run -test unicode -- -test.v # interpret the unicode package's tests, verbosely +` + loader.FromArgsUsage + + ` +When -run is specified, ssadump will run the program. +The entry point depends on the -test flag: +if clear, it runs the first package named main. +if set, it runs the tests of each package. +` + +var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file") + +func init() { + flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc) + + // If $GOMAXPROCS isn't set, use the full capacity of the machine. + // For small machines, use at least 4 threads. + if os.Getenv("GOMAXPROCS") == "" { + n := runtime.NumCPU() + if n < 4 { + n = 4 + } + runtime.GOMAXPROCS(n) + } +} + +func main() { + if err := doMain(); err != nil { + fmt.Fprintf(os.Stderr, "ssadump: %s\n", err) + os.Exit(1) + } +} + +func doMain() error { + flag.Parse() + args := flag.Args() + + conf := loader.Config{Build: &build.Default} + + // Choose types.Sizes from conf.Build. + var wordSize int64 = 8 + switch conf.Build.GOARCH { + case "386", "arm": + wordSize = 4 + } + conf.TypeChecker.Sizes = &types.StdSizes{ + MaxAlign: 8, + WordSize: wordSize, + } + + var interpMode interp.Mode + for _, c := range *interpFlag { + switch c { + case 'T': + interpMode |= interp.EnableTracing + case 'R': + interpMode |= interp.DisableRecover + default: + return fmt.Errorf("unknown -interp option: '%c'", c) + } + } + + if len(args) == 0 { + fmt.Fprint(os.Stderr, usage) + os.Exit(1) + } + + // Profiling support. + if *cpuprofile != "" { + f, err := os.Create(*cpuprofile) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + pprof.StartCPUProfile(f) + defer pprof.StopCPUProfile() + } + + // Use the initial packages from the command line. + args, err := conf.FromArgs(args, *testFlag) + if err != nil { + return err + } + + // The interpreter needs the runtime package. + if *runFlag { + conf.Import("runtime") + } + + // Load, parse and type-check the whole program. + iprog, err := conf.Load() + if err != nil { + return err + } + + // Create and build SSA-form program representation. + prog := ssautil.CreateProgram(iprog, *modeFlag) + + // Build and display only the initial packages + // (and synthetic wrappers), unless -run is specified. + for _, info := range iprog.InitialPackages() { + prog.Package(info.Pkg).Build() + } + + // Run the interpreter. + if *runFlag { + prog.Build() + + var main *ssa.Package + pkgs := prog.AllPackages() + if *testFlag { + // If -test, run all packages' tests. + if len(pkgs) > 0 { + main = prog.CreateTestMainPackage(pkgs...) + } + if main == nil { + return fmt.Errorf("no tests") + } + } else { + // Otherwise, run main.main. + for _, pkg := range pkgs { + if pkg.Pkg.Name() == "main" { + main = pkg + if main.Func("main") == nil { + return fmt.Errorf("no func main() in main package") + } + break + } + } + if main == nil { + return fmt.Errorf("no main package") + } + } + + if runtime.GOARCH != build.Default.GOARCH { + return fmt.Errorf("cross-interpretation is not supported (target has GOARCH %s, interpreter has %s)", + build.Default.GOARCH, runtime.GOARCH) + } + + interp.Interpret(main, interpMode, conf.TypeChecker.Sizes, main.Pkg.Path(), args) + } + return nil +} diff --git a/vendor/golang.org/x/tools/cmd/stress/stress.go b/vendor/golang.org/x/tools/cmd/stress/stress.go new file mode 100644 index 0000000000..470d26110e --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/stress/stress.go @@ -0,0 +1,120 @@ +// 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 !plan9 + +// The stress utility is intended for catching of episodic failures. +// It runs a given process in parallel in a loop and collects any failures. +// Usage: +// $ stress ./fmt.test -test.run=TestSometing -test.cpu=10 +// You can also specify a number of parallel processes with -p flag; +// instruct the utility to not kill hanged processes for gdb attach; +// or specify the failure output you are looking for (if you want to +// ignore some other episodic failures). +package main + +import ( + "flag" + "fmt" + "io/ioutil" + "os" + "os/exec" + "regexp" + "runtime" + "syscall" + "time" +) + +var ( + flagP = flag.Int("p", runtime.NumCPU(), "run `N` processes in parallel") + flagTimeout = flag.Duration("timeout", 10*time.Minute, "timeout each process after `duration`") + flagKill = flag.Bool("kill", true, "kill timed out processes if true, otherwise just print pid (to attach with gdb)") + flagFailure = flag.String("failure", "", "fail only if output matches `regexp`") + flagIgnore = flag.String("ignore", "", "ignore failure if output matches `regexp`") +) + +func main() { + flag.Parse() + if *flagP <= 0 || *flagTimeout <= 0 || len(flag.Args()) == 0 { + flag.Usage() + os.Exit(1) + } + var failureRe, ignoreRe *regexp.Regexp + if *flagFailure != "" { + var err error + if failureRe, err = regexp.Compile(*flagFailure); err != nil { + fmt.Println("bad failure regexp:", err) + os.Exit(1) + } + } + if *flagIgnore != "" { + var err error + if ignoreRe, err = regexp.Compile(*flagIgnore); err != nil { + fmt.Println("bad ignore regexp:", err) + os.Exit(1) + } + } + res := make(chan []byte) + for i := 0; i < *flagP; i++ { + go func() { + for { + cmd := exec.Command(flag.Args()[0], flag.Args()[1:]...) + done := make(chan bool) + if *flagTimeout > 0 { + go func() { + select { + case <-done: + return + case <-time.After(*flagTimeout): + } + if !*flagKill { + fmt.Printf("process %v timed out\n", cmd.Process.Pid) + return + } + cmd.Process.Signal(syscall.SIGABRT) + select { + case <-done: + return + case <-time.After(10 * time.Second): + } + cmd.Process.Kill() + }() + } + out, err := cmd.CombinedOutput() + close(done) + if err != nil && (failureRe == nil || failureRe.Match(out)) && (ignoreRe == nil || !ignoreRe.Match(out)) { + out = append(out, fmt.Sprintf("\n\nERROR: %v\n", err)...) + } else { + out = []byte{} + } + res <- out + } + }() + } + runs, fails := 0, 0 + ticker := time.NewTicker(5 * time.Second).C + for { + select { + case out := <-res: + runs++ + if len(out) == 0 { + continue + } + fails++ + f, err := ioutil.TempFile("", "go-stress") + if err != nil { + fmt.Printf("failed to create temp file: %v\n", err) + os.Exit(1) + } + f.Write(out) + f.Close() + if len(out) > 2<<10 { + out = out[:2<<10] + } + fmt.Printf("\n%s\n%s\n", f.Name(), out) + case <-ticker: + fmt.Printf("%v runs so far, %v failures\n", runs, fails) + } + } +} diff --git a/vendor/golang.org/x/tools/cmd/stringer/endtoend_test.go b/vendor/golang.org/x/tools/cmd/stringer/endtoend_test.go new file mode 100644 index 0000000000..d71a6c134e --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/stringer/endtoend_test.go @@ -0,0 +1,111 @@ +// 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. + +// go command is not available on android + +// +build !android + +package main + +import ( + "fmt" + "go/build" + "io" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "strings" + "testing" +) + +// This file contains a test that compiles and runs each program in testdata +// after generating the string method for its type. The rule is that for testdata/x.go +// we run stringer -type X and then compile and run the program. The resulting +// binary panics if the String method for X is not correct, including for error cases. + +func TestEndToEnd(t *testing.T) { + dir, err := ioutil.TempDir("", "stringer") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dir) + // Create stringer in temporary directory. + stringer := filepath.Join(dir, "stringer.exe") + err = run("go", "build", "-o", stringer, "stringer.go") + if err != nil { + t.Fatalf("building stringer: %s", err) + } + // Read the testdata directory. + fd, err := os.Open("testdata") + if err != nil { + t.Fatal(err) + } + defer fd.Close() + names, err := fd.Readdirnames(-1) + if err != nil { + t.Fatalf("Readdirnames: %s", err) + } + // Generate, compile, and run the test programs. + for _, name := range names { + if !strings.HasSuffix(name, ".go") { + t.Errorf("%s is not a Go file", name) + continue + } + if name == "cgo.go" && !build.Default.CgoEnabled { + t.Logf("cgo is no enabled for %s", name) + continue + } + // Names are known to be ASCII and long enough. + typeName := fmt.Sprintf("%c%s", name[0]+'A'-'a', name[1:len(name)-len(".go")]) + stringerCompileAndRun(t, dir, stringer, typeName, name) + } +} + +// stringerCompileAndRun runs stringer for the named file and compiles and +// runs the target binary in directory dir. That binary will panic if the String method is incorrect. +func stringerCompileAndRun(t *testing.T, dir, stringer, typeName, fileName string) { + t.Logf("run: %s %s\n", fileName, typeName) + source := filepath.Join(dir, fileName) + err := copy(source, filepath.Join("testdata", fileName)) + if err != nil { + t.Fatalf("copying file to temporary directory: %s", err) + } + stringSource := filepath.Join(dir, typeName+"_string.go") + // Run stringer in temporary directory. + err = run(stringer, "-type", typeName, "-output", stringSource, source) + if err != nil { + t.Fatal(err) + } + // Run the binary in the temporary directory. + err = run("go", "run", stringSource, source) + if err != nil { + t.Fatal(err) + } +} + +// copy copies the from file to the to file. +func copy(to, from string) error { + toFd, err := os.Create(to) + if err != nil { + return err + } + defer toFd.Close() + fromFd, err := os.Open(from) + if err != nil { + return err + } + defer fromFd.Close() + _, err = io.Copy(toFd, fromFd) + return err +} + +// run runs a single command and returns an error if it does not succeed. +// os/exec should have this function, to be honest. +func run(name string, arg ...string) error { + cmd := exec.Command(name, arg...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + return cmd.Run() +} diff --git a/vendor/golang.org/x/tools/cmd/stringer/golden_test.go b/vendor/golang.org/x/tools/cmd/stringer/golden_test.go new file mode 100644 index 0000000000..12df238fa0 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/stringer/golden_test.go @@ -0,0 +1,258 @@ +// 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. + +// This file contains simple golden tests for various examples. +// Besides validating the results when the implementation changes, +// it provides a way to look at the generated code without having +// to execute the print statements in one's head. + +package main + +import ( + "strings" + "testing" +) + +// Golden represents a test case. +type Golden struct { + name string + input string // input; the package clause is provided when running the test. + output string // exected output. +} + +var golden = []Golden{ + {"day", day_in, day_out}, + {"offset", offset_in, offset_out}, + {"gap", gap_in, gap_out}, + {"num", num_in, num_out}, + {"unum", unum_in, unum_out}, + {"prime", prime_in, prime_out}, +} + +// Each example starts with "type XXX [u]int", with a single space separating them. + +// Simple test: enumeration of type int starting at 0. +const day_in = `type Day int +const ( + Monday Day = iota + Tuesday + Wednesday + Thursday + Friday + Saturday + Sunday +) +` + +const day_out = ` +const _Day_name = "MondayTuesdayWednesdayThursdayFridaySaturdaySunday" + +var _Day_index = [...]uint8{0, 6, 13, 22, 30, 36, 44, 50} + +func (i Day) String() string { + if i < 0 || i >= Day(len(_Day_index)-1) { + return fmt.Sprintf("Day(%d)", i) + } + return _Day_name[_Day_index[i]:_Day_index[i+1]] +} +` + +// Enumeration with an offset. +// Also includes a duplicate. +const offset_in = `type Number int +const ( + _ Number = iota + One + Two + Three + AnotherOne = One // Duplicate; note that AnotherOne doesn't appear below. +) +` + +const offset_out = ` +const _Number_name = "OneTwoThree" + +var _Number_index = [...]uint8{0, 3, 6, 11} + +func (i Number) String() string { + i -= 1 + if i < 0 || i >= Number(len(_Number_index)-1) { + return fmt.Sprintf("Number(%d)", i+1) + } + return _Number_name[_Number_index[i]:_Number_index[i+1]] +} +` + +// Gaps and an offset. +const gap_in = `type Gap int +const ( + Two Gap = 2 + Three Gap = 3 + Five Gap = 5 + Six Gap = 6 + Seven Gap = 7 + Eight Gap = 8 + Nine Gap = 9 + Eleven Gap = 11 +) +` + +const gap_out = ` +const ( + _Gap_name_0 = "TwoThree" + _Gap_name_1 = "FiveSixSevenEightNine" + _Gap_name_2 = "Eleven" +) + +var ( + _Gap_index_0 = [...]uint8{0, 3, 8} + _Gap_index_1 = [...]uint8{0, 4, 7, 12, 17, 21} + _Gap_index_2 = [...]uint8{0, 6} +) + +func (i Gap) String() string { + switch { + case 2 <= i && i <= 3: + i -= 2 + return _Gap_name_0[_Gap_index_0[i]:_Gap_index_0[i+1]] + case 5 <= i && i <= 9: + i -= 5 + return _Gap_name_1[_Gap_index_1[i]:_Gap_index_1[i+1]] + case i == 11: + return _Gap_name_2 + default: + return fmt.Sprintf("Gap(%d)", i) + } +} +` + +// Signed integers spanning zero. +const num_in = `type Num int +const ( + m_2 Num = -2 + iota + m_1 + m0 + m1 + m2 +) +` + +const num_out = ` +const _Num_name = "m_2m_1m0m1m2" + +var _Num_index = [...]uint8{0, 3, 6, 8, 10, 12} + +func (i Num) String() string { + i -= -2 + if i < 0 || i >= Num(len(_Num_index)-1) { + return fmt.Sprintf("Num(%d)", i+-2) + } + return _Num_name[_Num_index[i]:_Num_index[i+1]] +} +` + +// Unsigned integers spanning zero. +const unum_in = `type Unum uint +const ( + m_2 Unum = iota + 253 + m_1 +) + +const ( + m0 Unum = iota + m1 + m2 +) +` + +const unum_out = ` +const ( + _Unum_name_0 = "m0m1m2" + _Unum_name_1 = "m_2m_1" +) + +var ( + _Unum_index_0 = [...]uint8{0, 2, 4, 6} + _Unum_index_1 = [...]uint8{0, 3, 6} +) + +func (i Unum) String() string { + switch { + case 0 <= i && i <= 2: + return _Unum_name_0[_Unum_index_0[i]:_Unum_index_0[i+1]] + case 253 <= i && i <= 254: + i -= 253 + return _Unum_name_1[_Unum_index_1[i]:_Unum_index_1[i+1]] + default: + return fmt.Sprintf("Unum(%d)", i) + } +} +` + +// Enough gaps to trigger a map implementation of the method. +// Also includes a duplicate to test that it doesn't cause problems +const prime_in = `type Prime int +const ( + p2 Prime = 2 + p3 Prime = 3 + p5 Prime = 5 + p7 Prime = 7 + p77 Prime = 7 // Duplicate; note that p77 doesn't appear below. + p11 Prime = 11 + p13 Prime = 13 + p17 Prime = 17 + p19 Prime = 19 + p23 Prime = 23 + p29 Prime = 29 + p37 Prime = 31 + p41 Prime = 41 + p43 Prime = 43 +) +` + +const prime_out = ` +const _Prime_name = "p2p3p5p7p11p13p17p19p23p29p37p41p43" + +var _Prime_map = map[Prime]string{ + 2: _Prime_name[0:2], + 3: _Prime_name[2:4], + 5: _Prime_name[4:6], + 7: _Prime_name[6:8], + 11: _Prime_name[8:11], + 13: _Prime_name[11:14], + 17: _Prime_name[14:17], + 19: _Prime_name[17:20], + 23: _Prime_name[20:23], + 29: _Prime_name[23:26], + 31: _Prime_name[26:29], + 41: _Prime_name[29:32], + 43: _Prime_name[32:35], +} + +func (i Prime) String() string { + if str, ok := _Prime_map[i]; ok { + return str + } + return fmt.Sprintf("Prime(%d)", i) +} +` + +func TestGolden(t *testing.T) { + for _, test := range golden { + var g Generator + input := "package test\n" + test.input + file := test.name + ".go" + g.parsePackage(".", []string{file}, input) + // Extract the name and type of the constant from the first line. + tokens := strings.SplitN(test.input, " ", 3) + if len(tokens) != 3 { + t.Fatalf("%s: need type declaration on first line", test.name) + } + g.generate(tokens[1]) + got := string(g.format()) + if got != test.output { + t.Errorf("%s: got\n====\n%s====\nexpected\n====%s", test.name, got, test.output) + } + } +} diff --git a/vendor/golang.org/x/tools/cmd/stringer/stringer.go b/vendor/golang.org/x/tools/cmd/stringer/stringer.go new file mode 100644 index 0000000000..992125ab96 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/stringer/stringer.go @@ -0,0 +1,638 @@ +// 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 go1.5 + +// Stringer is a tool to automate the creation of methods that satisfy the fmt.Stringer +// interface. Given the name of a (signed or unsigned) integer type T that has constants +// defined, stringer will create a new self-contained Go source file implementing +// func (t T) String() string +// The file is created in the same package and directory as the package that defines T. +// It has helpful defaults designed for use with go generate. +// +// Stringer works best with constants that are consecutive values such as created using iota, +// but creates good code regardless. In the future it might also provide custom support for +// constant sets that are bit patterns. +// +// For example, given this snippet, +// +// package painkiller +// +// type Pill int +// +// const ( +// Placebo Pill = iota +// Aspirin +// Ibuprofen +// Paracetamol +// Acetaminophen = Paracetamol +// ) +// +// running this command +// +// stringer -type=Pill +// +// in the same directory will create the file pill_string.go, in package painkiller, +// containing a definition of +// +// func (Pill) String() string +// +// That method will translate the value of a Pill constant to the string representation +// of the respective constant name, so that the call fmt.Print(painkiller.Aspirin) will +// print the string "Aspirin". +// +// Typically this process would be run using go generate, like this: +// +// //go:generate stringer -type=Pill +// +// If multiple constants have the same value, the lexically first matching name will +// be used (in the example, Acetaminophen will print as "Paracetamol"). +// +// With no arguments, it processes the package in the current directory. +// Otherwise, the arguments must name a single directory holding a Go package +// or a set of Go source files that represent a single Go package. +// +// The -type flag accepts a comma-separated list of types so a single run can +// generate methods for multiple types. The default output file is t_string.go, +// where t is the lower-cased name of the first type listed. It can be overridden +// with the -output flag. +// +package main // import "golang.org/x/tools/cmd/stringer" + +import ( + "bytes" + "flag" + "fmt" + "go/ast" + "go/build" + exact "go/constant" + "go/format" + "go/importer" + "go/parser" + "go/token" + "go/types" + "io/ioutil" + "log" + "os" + "path/filepath" + "sort" + "strings" +) + +var ( + typeNames = flag.String("type", "", "comma-separated list of type names; must be set") + output = flag.String("output", "", "output file name; default srcdir/_string.go") +) + +// Usage is a replacement usage function for the flags package. +func Usage() { + fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0]) + fmt.Fprintf(os.Stderr, "\tstringer [flags] -type T [directory]\n") + fmt.Fprintf(os.Stderr, "\tstringer [flags[ -type T files... # Must be a single package\n") + fmt.Fprintf(os.Stderr, "For more information, see:\n") + fmt.Fprintf(os.Stderr, "\thttp://godoc.org/golang.org/x/tools/cmd/stringer\n") + fmt.Fprintf(os.Stderr, "Flags:\n") + flag.PrintDefaults() +} + +func main() { + log.SetFlags(0) + log.SetPrefix("stringer: ") + flag.Usage = Usage + flag.Parse() + if len(*typeNames) == 0 { + flag.Usage() + os.Exit(2) + } + types := strings.Split(*typeNames, ",") + + // We accept either one directory or a list of files. Which do we have? + args := flag.Args() + if len(args) == 0 { + // Default: process whole package in current directory. + args = []string{"."} + } + + // Parse the package once. + var ( + dir string + g Generator + ) + if len(args) == 1 && isDirectory(args[0]) { + dir = args[0] + g.parsePackageDir(args[0]) + } else { + dir = filepath.Dir(args[0]) + g.parsePackageFiles(args) + } + + // Print the header and package clause. + g.Printf("// Code generated by \"stringer %s\"; DO NOT EDIT\n", strings.Join(os.Args[1:], " ")) + g.Printf("\n") + g.Printf("package %s", g.pkg.name) + g.Printf("\n") + g.Printf("import \"fmt\"\n") // Used by all methods. + + // Run generate for each type. + for _, typeName := range types { + g.generate(typeName) + } + + // Format the output. + src := g.format() + + // Write to file. + outputName := *output + if outputName == "" { + baseName := fmt.Sprintf("%s_string.go", types[0]) + outputName = filepath.Join(dir, strings.ToLower(baseName)) + } + err := ioutil.WriteFile(outputName, src, 0644) + if err != nil { + log.Fatalf("writing output: %s", err) + } +} + +// isDirectory reports whether the named file is a directory. +func isDirectory(name string) bool { + info, err := os.Stat(name) + if err != nil { + log.Fatal(err) + } + return info.IsDir() +} + +// Generator holds the state of the analysis. Primarily used to buffer +// the output for format.Source. +type Generator struct { + buf bytes.Buffer // Accumulated output. + pkg *Package // Package we are scanning. +} + +func (g *Generator) Printf(format string, args ...interface{}) { + fmt.Fprintf(&g.buf, format, args...) +} + +// File holds a single parsed file and associated data. +type File struct { + pkg *Package // Package to which this file belongs. + file *ast.File // Parsed AST. + // These fields are reset for each type being generated. + typeName string // Name of the constant type. + values []Value // Accumulator for constant values of that type. +} + +type Package struct { + dir string + name string + defs map[*ast.Ident]types.Object + files []*File + typesPkg *types.Package +} + +// parsePackageDir parses the package residing in the directory. +func (g *Generator) parsePackageDir(directory string) { + pkg, err := build.Default.ImportDir(directory, 0) + if err != nil { + log.Fatalf("cannot process directory %s: %s", directory, err) + } + var names []string + names = append(names, pkg.GoFiles...) + names = append(names, pkg.CgoFiles...) + // TODO: Need to think about constants in test files. Maybe write type_string_test.go + // in a separate pass? For later. + // names = append(names, pkg.TestGoFiles...) // These are also in the "foo" package. + names = append(names, pkg.SFiles...) + names = prefixDirectory(directory, names) + g.parsePackage(directory, names, nil) +} + +// parsePackageFiles parses the package occupying the named files. +func (g *Generator) parsePackageFiles(names []string) { + g.parsePackage(".", names, nil) +} + +// prefixDirectory places the directory name on the beginning of each name in the list. +func prefixDirectory(directory string, names []string) []string { + if directory == "." { + return names + } + ret := make([]string, len(names)) + for i, name := range names { + ret[i] = filepath.Join(directory, name) + } + return ret +} + +// parsePackage analyzes the single package constructed from the named files. +// If text is non-nil, it is a string to be used instead of the content of the file, +// to be used for testing. parsePackage exits if there is an error. +func (g *Generator) parsePackage(directory string, names []string, text interface{}) { + var files []*File + var astFiles []*ast.File + g.pkg = new(Package) + fs := token.NewFileSet() + for _, name := range names { + if !strings.HasSuffix(name, ".go") { + continue + } + parsedFile, err := parser.ParseFile(fs, name, text, 0) + if err != nil { + log.Fatalf("parsing package: %s: %s", name, err) + } + astFiles = append(astFiles, parsedFile) + files = append(files, &File{ + file: parsedFile, + pkg: g.pkg, + }) + } + if len(astFiles) == 0 { + log.Fatalf("%s: no buildable Go files", directory) + } + g.pkg.name = astFiles[0].Name.Name + g.pkg.files = files + g.pkg.dir = directory + // Type check the package. + g.pkg.check(fs, astFiles) +} + +// check type-checks the package. The package must be OK to proceed. +func (pkg *Package) check(fs *token.FileSet, astFiles []*ast.File) { + pkg.defs = make(map[*ast.Ident]types.Object) + config := types.Config{Importer: importer.Default(), FakeImportC: true} + info := &types.Info{ + Defs: pkg.defs, + } + typesPkg, err := config.Check(pkg.dir, fs, astFiles, info) + if err != nil { + log.Fatalf("checking package: %s", err) + } + pkg.typesPkg = typesPkg +} + +// generate produces the String method for the named type. +func (g *Generator) generate(typeName string) { + values := make([]Value, 0, 100) + for _, file := range g.pkg.files { + // Set the state for this run of the walker. + file.typeName = typeName + file.values = nil + if file.file != nil { + ast.Inspect(file.file, file.genDecl) + values = append(values, file.values...) + } + } + + if len(values) == 0 { + log.Fatalf("no values defined for type %s", typeName) + } + runs := splitIntoRuns(values) + // The decision of which pattern to use depends on the number of + // runs in the numbers. If there's only one, it's easy. For more than + // one, there's a tradeoff between complexity and size of the data + // and code vs. the simplicity of a map. A map takes more space, + // but so does the code. The decision here (crossover at 10) is + // arbitrary, but considers that for large numbers of runs the cost + // of the linear scan in the switch might become important, and + // rather than use yet another algorithm such as binary search, + // we punt and use a map. In any case, the likelihood of a map + // being necessary for any realistic example other than bitmasks + // is very low. And bitmasks probably deserve their own analysis, + // to be done some other day. + switch { + case len(runs) == 1: + g.buildOneRun(runs, typeName) + case len(runs) <= 10: + g.buildMultipleRuns(runs, typeName) + default: + g.buildMap(runs, typeName) + } +} + +// splitIntoRuns breaks the values into runs of contiguous sequences. +// For example, given 1,2,3,5,6,7 it returns {1,2,3},{5,6,7}. +// The input slice is known to be non-empty. +func splitIntoRuns(values []Value) [][]Value { + // We use stable sort so the lexically first name is chosen for equal elements. + sort.Stable(byValue(values)) + // Remove duplicates. Stable sort has put the one we want to print first, + // so use that one. The String method won't care about which named constant + // was the argument, so the first name for the given value is the only one to keep. + // We need to do this because identical values would cause the switch or map + // to fail to compile. + j := 1 + for i := 1; i < len(values); i++ { + if values[i].value != values[i-1].value { + values[j] = values[i] + j++ + } + } + values = values[:j] + runs := make([][]Value, 0, 10) + for len(values) > 0 { + // One contiguous sequence per outer loop. + i := 1 + for i < len(values) && values[i].value == values[i-1].value+1 { + i++ + } + runs = append(runs, values[:i]) + values = values[i:] + } + return runs +} + +// format returns the gofmt-ed contents of the Generator's buffer. +func (g *Generator) format() []byte { + src, err := format.Source(g.buf.Bytes()) + if err != nil { + // Should never happen, but can arise when developing this code. + // The user can compile the output to see the error. + log.Printf("warning: internal error: invalid Go generated: %s", err) + log.Printf("warning: compile the package to analyze the error") + return g.buf.Bytes() + } + return src +} + +// Value represents a declared constant. +type Value struct { + name string // The name of the constant. + // The value is stored as a bit pattern alone. The boolean tells us + // whether to interpret it as an int64 or a uint64; the only place + // this matters is when sorting. + // Much of the time the str field is all we need; it is printed + // by Value.String. + value uint64 // Will be converted to int64 when needed. + signed bool // Whether the constant is a signed type. + str string // The string representation given by the "go/exact" package. +} + +func (v *Value) String() string { + return v.str +} + +// byValue lets us sort the constants into increasing order. +// We take care in the Less method to sort in signed or unsigned order, +// as appropriate. +type byValue []Value + +func (b byValue) Len() int { return len(b) } +func (b byValue) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b byValue) Less(i, j int) bool { + if b[i].signed { + return int64(b[i].value) < int64(b[j].value) + } + return b[i].value < b[j].value +} + +// genDecl processes one declaration clause. +func (f *File) genDecl(node ast.Node) bool { + decl, ok := node.(*ast.GenDecl) + if !ok || decl.Tok != token.CONST { + // We only care about const declarations. + return true + } + // The name of the type of the constants we are declaring. + // Can change if this is a multi-element declaration. + typ := "" + // Loop over the elements of the declaration. Each element is a ValueSpec: + // a list of names possibly followed by a type, possibly followed by values. + // If the type and value are both missing, we carry down the type (and value, + // but the "go/types" package takes care of that). + for _, spec := range decl.Specs { + vspec := spec.(*ast.ValueSpec) // Guaranteed to succeed as this is CONST. + if vspec.Type == nil && len(vspec.Values) > 0 { + // "X = 1". With no type but a value, the constant is untyped. + // Skip this vspec and reset the remembered type. + typ = "" + continue + } + if vspec.Type != nil { + // "X T". We have a type. Remember it. + ident, ok := vspec.Type.(*ast.Ident) + if !ok { + continue + } + typ = ident.Name + } + if typ != f.typeName { + // This is not the type we're looking for. + continue + } + // We now have a list of names (from one line of source code) all being + // declared with the desired type. + // Grab their names and actual values and store them in f.values. + for _, name := range vspec.Names { + if name.Name == "_" { + continue + } + // This dance lets the type checker find the values for us. It's a + // bit tricky: look up the object declared by the name, find its + // types.Const, and extract its value. + obj, ok := f.pkg.defs[name] + if !ok { + log.Fatalf("no value for constant %s", name) + } + info := obj.Type().Underlying().(*types.Basic).Info() + if info&types.IsInteger == 0 { + log.Fatalf("can't handle non-integer constant type %s", typ) + } + value := obj.(*types.Const).Val() // Guaranteed to succeed as this is CONST. + if value.Kind() != exact.Int { + log.Fatalf("can't happen: constant is not an integer %s", name) + } + i64, isInt := exact.Int64Val(value) + u64, isUint := exact.Uint64Val(value) + if !isInt && !isUint { + log.Fatalf("internal error: value of %s is not an integer: %s", name, value.String()) + } + if !isInt { + u64 = uint64(i64) + } + v := Value{ + name: name.Name, + value: u64, + signed: info&types.IsUnsigned == 0, + str: value.String(), + } + f.values = append(f.values, v) + } + } + return false +} + +// Helpers + +// usize returns the number of bits of the smallest unsigned integer +// type that will hold n. Used to create the smallest possible slice of +// integers to use as indexes into the concatenated strings. +func usize(n int) int { + switch { + case n < 1<<8: + return 8 + case n < 1<<16: + return 16 + default: + // 2^32 is enough constants for anyone. + return 32 + } +} + +// declareIndexAndNameVars declares the index slices and concatenated names +// strings representing the runs of values. +func (g *Generator) declareIndexAndNameVars(runs [][]Value, typeName string) { + var indexes, names []string + for i, run := range runs { + index, name := g.createIndexAndNameDecl(run, typeName, fmt.Sprintf("_%d", i)) + indexes = append(indexes, index) + names = append(names, name) + } + g.Printf("const (\n") + for _, name := range names { + g.Printf("\t%s\n", name) + } + g.Printf(")\n\n") + g.Printf("var (") + for _, index := range indexes { + g.Printf("\t%s\n", index) + } + g.Printf(")\n\n") +} + +// declareIndexAndNameVar is the single-run version of declareIndexAndNameVars +func (g *Generator) declareIndexAndNameVar(run []Value, typeName string) { + index, name := g.createIndexAndNameDecl(run, typeName, "") + g.Printf("const %s\n", name) + g.Printf("var %s\n", index) +} + +// createIndexAndNameDecl returns the pair of declarations for the run. The caller will add "const" and "var". +func (g *Generator) createIndexAndNameDecl(run []Value, typeName string, suffix string) (string, string) { + b := new(bytes.Buffer) + indexes := make([]int, len(run)) + for i := range run { + b.WriteString(run[i].name) + indexes[i] = b.Len() + } + nameConst := fmt.Sprintf("_%s_name%s = %q", typeName, suffix, b.String()) + nameLen := b.Len() + b.Reset() + fmt.Fprintf(b, "_%s_index%s = [...]uint%d{0, ", typeName, suffix, usize(nameLen)) + for i, v := range indexes { + if i > 0 { + fmt.Fprintf(b, ", ") + } + fmt.Fprintf(b, "%d", v) + } + fmt.Fprintf(b, "}") + return b.String(), nameConst +} + +// declareNameVars declares the concatenated names string representing all the values in the runs. +func (g *Generator) declareNameVars(runs [][]Value, typeName string, suffix string) { + g.Printf("const _%s_name%s = \"", typeName, suffix) + for _, run := range runs { + for i := range run { + g.Printf("%s", run[i].name) + } + } + g.Printf("\"\n") +} + +// buildOneRun generates the variables and String method for a single run of contiguous values. +func (g *Generator) buildOneRun(runs [][]Value, typeName string) { + values := runs[0] + g.Printf("\n") + g.declareIndexAndNameVar(values, typeName) + // The generated code is simple enough to write as a Printf format. + lessThanZero := "" + if values[0].signed { + lessThanZero = "i < 0 || " + } + if values[0].value == 0 { // Signed or unsigned, 0 is still 0. + g.Printf(stringOneRun, typeName, usize(len(values)), lessThanZero) + } else { + g.Printf(stringOneRunWithOffset, typeName, values[0].String(), usize(len(values)), lessThanZero) + } +} + +// Arguments to format are: +// [1]: type name +// [2]: size of index element (8 for uint8 etc.) +// [3]: less than zero check (for signed types) +const stringOneRun = `func (i %[1]s) String() string { + if %[3]si >= %[1]s(len(_%[1]s_index)-1) { + return fmt.Sprintf("%[1]s(%%d)", i) + } + return _%[1]s_name[_%[1]s_index[i]:_%[1]s_index[i+1]] +} +` + +// Arguments to format are: +// [1]: type name +// [2]: lowest defined value for type, as a string +// [3]: size of index element (8 for uint8 etc.) +// [4]: less than zero check (for signed types) +/* + */ +const stringOneRunWithOffset = `func (i %[1]s) String() string { + i -= %[2]s + if %[4]si >= %[1]s(len(_%[1]s_index)-1) { + return fmt.Sprintf("%[1]s(%%d)", i + %[2]s) + } + return _%[1]s_name[_%[1]s_index[i] : _%[1]s_index[i+1]] +} +` + +// buildMultipleRuns generates the variables and String method for multiple runs of contiguous values. +// For this pattern, a single Printf format won't do. +func (g *Generator) buildMultipleRuns(runs [][]Value, typeName string) { + g.Printf("\n") + g.declareIndexAndNameVars(runs, typeName) + g.Printf("func (i %s) String() string {\n", typeName) + g.Printf("\tswitch {\n") + for i, values := range runs { + if len(values) == 1 { + g.Printf("\tcase i == %s:\n", &values[0]) + g.Printf("\t\treturn _%s_name_%d\n", typeName, i) + continue + } + g.Printf("\tcase %s <= i && i <= %s:\n", &values[0], &values[len(values)-1]) + if values[0].value != 0 { + g.Printf("\t\ti -= %s\n", &values[0]) + } + g.Printf("\t\treturn _%s_name_%d[_%s_index_%d[i]:_%s_index_%d[i+1]]\n", + typeName, i, typeName, i, typeName, i) + } + g.Printf("\tdefault:\n") + g.Printf("\t\treturn fmt.Sprintf(\"%s(%%d)\", i)\n", typeName) + g.Printf("\t}\n") + g.Printf("}\n") +} + +// buildMap handles the case where the space is so sparse a map is a reasonable fallback. +// It's a rare situation but has simple code. +func (g *Generator) buildMap(runs [][]Value, typeName string) { + g.Printf("\n") + g.declareNameVars(runs, typeName, "") + g.Printf("\nvar _%s_map = map[%s]string{\n", typeName, typeName) + n := 0 + for _, values := range runs { + for _, value := range values { + g.Printf("\t%s: _%s_name[%d:%d],\n", &value, typeName, n, n+len(value.name)) + n += len(value.name) + } + } + g.Printf("}\n\n") + g.Printf(stringMap, typeName) +} + +// Argument to format is the type name. +const stringMap = `func (i %[1]s) String() string { + if str, ok := _%[1]s_map[i]; ok { + return str + } + return fmt.Sprintf("%[1]s(%%d)", i) +} +` diff --git a/vendor/golang.org/x/tools/cmd/stringer/stringer14.go b/vendor/golang.org/x/tools/cmd/stringer/stringer14.go new file mode 100644 index 0000000000..e0962e3f04 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/stringer/stringer14.go @@ -0,0 +1,640 @@ +// 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 !go1.5 + +// Stringer is a tool to automate the creation of methods that satisfy the fmt.Stringer +// interface. Given the name of a (signed or unsigned) integer type T that has constants +// defined, stringer will create a new self-contained Go source file implementing +// func (t T) String() string +// The file is created in the same package and directory as the package that defines T. +// It has helpful defaults designed for use with go generate. +// +// Stringer works best with constants that are consecutive values such as created using iota, +// but creates good code regardless. In the future it might also provide custom support for +// constant sets that are bit patterns. +// +// For example, given this snippet, +// +// package painkiller +// +// type Pill int +// +// const ( +// Placebo Pill = iota +// Aspirin +// Ibuprofen +// Paracetamol +// Acetaminophen = Paracetamol +// ) +// +// running this command +// +// stringer -type=Pill +// +// in the same directory will create the file pill_string.go, in package painkiller, +// containing a definition of +// +// func (Pill) String() string +// +// That method will translate the value of a Pill constant to the string representation +// of the respective constant name, so that the call fmt.Print(painkiller.Aspirin) will +// print the string "Aspirin". +// +// Typically this process would be run using go generate, like this: +// +// //go:generate stringer -type=Pill +// +// If multiple constants have the same value, the lexically first matching name will +// be used (in the example, Acetaminophen will print as "Paracetamol"). +// +// With no arguments, it processes the package in the current directory. +// Otherwise, the arguments must name a single directory holding a Go package +// or a set of Go source files that represent a single Go package. +// +// The -type flag accepts a comma-separated list of types so a single run can +// generate methods for multiple types. The default output file is t_string.go, +// where t is the lower-cased name of the first type listed. It can be overridden +// with the -output flag. +// +package main // import "golang.org/x/tools/cmd/stringer" + +import ( + "bytes" + "flag" + "fmt" + "go/ast" + "go/build" + "go/format" + "go/parser" + "go/token" + "io/ioutil" + "log" + "os" + "path/filepath" + "sort" + "strings" + + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/types" + + _ "golang.org/x/tools/go/gcimporter" +) + +var ( + typeNames = flag.String("type", "", "comma-separated list of type names; must be set") + output = flag.String("output", "", "output file name; default srcdir/_string.go") +) + +// Usage is a replacement usage function for the flags package. +func Usage() { + fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0]) + fmt.Fprintf(os.Stderr, "\tstringer [flags] -type T [directory]\n") + fmt.Fprintf(os.Stderr, "\tstringer [flags[ -type T files... # Must be a single package\n") + fmt.Fprintf(os.Stderr, "For more information, see:\n") + fmt.Fprintf(os.Stderr, "\thttp://godoc.org/golang.org/x/tools/cmd/stringer\n") + fmt.Fprintf(os.Stderr, "Flags:\n") + flag.PrintDefaults() +} + +func main() { + log.SetFlags(0) + log.SetPrefix("stringer: ") + flag.Usage = Usage + flag.Parse() + if len(*typeNames) == 0 { + flag.Usage() + os.Exit(2) + } + types := strings.Split(*typeNames, ",") + + // We accept either one directory or a list of files. Which do we have? + args := flag.Args() + if len(args) == 0 { + // Default: process whole package in current directory. + args = []string{"."} + } + + // Parse the package once. + var ( + dir string + g Generator + ) + if len(args) == 1 && isDirectory(args[0]) { + dir = args[0] + g.parsePackageDir(args[0]) + } else { + dir = filepath.Dir(args[0]) + g.parsePackageFiles(args) + } + + // Print the header and package clause. + g.Printf("// Code generated by \"stringer %s\"; DO NOT EDIT\n", strings.Join(os.Args[1:], " ")) + g.Printf("\n") + g.Printf("package %s", g.pkg.name) + g.Printf("\n") + g.Printf("import \"fmt\"\n") // Used by all methods. + + // Run generate for each type. + for _, typeName := range types { + g.generate(typeName) + } + + // Format the output. + src := g.format() + + // Write to file. + outputName := *output + if outputName == "" { + baseName := fmt.Sprintf("%s_string.go", types[0]) + outputName = filepath.Join(dir, strings.ToLower(baseName)) + } + err := ioutil.WriteFile(outputName, src, 0644) + if err != nil { + log.Fatalf("writing output: %s", err) + } +} + +// isDirectory reports whether the named file is a directory. +func isDirectory(name string) bool { + info, err := os.Stat(name) + if err != nil { + log.Fatal(err) + } + return info.IsDir() +} + +// Generator holds the state of the analysis. Primarily used to buffer +// the output for format.Source. +type Generator struct { + buf bytes.Buffer // Accumulated output. + pkg *Package // Package we are scanning. +} + +func (g *Generator) Printf(format string, args ...interface{}) { + fmt.Fprintf(&g.buf, format, args...) +} + +// File holds a single parsed file and associated data. +type File struct { + pkg *Package // Package to which this file belongs. + file *ast.File // Parsed AST. + // These fields are reset for each type being generated. + typeName string // Name of the constant type. + values []Value // Accumulator for constant values of that type. +} + +type Package struct { + dir string + name string + defs map[*ast.Ident]types.Object + files []*File + typesPkg *types.Package +} + +// parsePackageDir parses the package residing in the directory. +func (g *Generator) parsePackageDir(directory string) { + pkg, err := build.Default.ImportDir(directory, 0) + if err != nil { + log.Fatalf("cannot process directory %s: %s", directory, err) + } + var names []string + names = append(names, pkg.GoFiles...) + names = append(names, pkg.CgoFiles...) + // TODO: Need to think about constants in test files. Maybe write type_string_test.go + // in a separate pass? For later. + // names = append(names, pkg.TestGoFiles...) // These are also in the "foo" package. + names = append(names, pkg.SFiles...) + names = prefixDirectory(directory, names) + g.parsePackage(directory, names, nil) +} + +// parsePackageFiles parses the package occupying the named files. +func (g *Generator) parsePackageFiles(names []string) { + g.parsePackage(".", names, nil) +} + +// prefixDirectory places the directory name on the beginning of each name in the list. +func prefixDirectory(directory string, names []string) []string { + if directory == "." { + return names + } + ret := make([]string, len(names)) + for i, name := range names { + ret[i] = filepath.Join(directory, name) + } + return ret +} + +// parsePackage analyzes the single package constructed from the named files. +// If text is non-nil, it is a string to be used instead of the content of the file, +// to be used for testing. parsePackage exits if there is an error. +func (g *Generator) parsePackage(directory string, names []string, text interface{}) { + var files []*File + var astFiles []*ast.File + g.pkg = new(Package) + fs := token.NewFileSet() + for _, name := range names { + if !strings.HasSuffix(name, ".go") { + continue + } + parsedFile, err := parser.ParseFile(fs, name, text, 0) + if err != nil { + log.Fatalf("parsing package: %s: %s", name, err) + } + astFiles = append(astFiles, parsedFile) + files = append(files, &File{ + file: parsedFile, + pkg: g.pkg, + }) + } + if len(astFiles) == 0 { + log.Fatalf("%s: no buildable Go files", directory) + } + g.pkg.name = astFiles[0].Name.Name + g.pkg.files = files + g.pkg.dir = directory + // Type check the package. + g.pkg.check(fs, astFiles) +} + +// check type-checks the package. The package must be OK to proceed. +func (pkg *Package) check(fs *token.FileSet, astFiles []*ast.File) { + pkg.defs = make(map[*ast.Ident]types.Object) + config := types.Config{FakeImportC: true} + info := &types.Info{ + Defs: pkg.defs, + } + typesPkg, err := config.Check(pkg.dir, fs, astFiles, info) + if err != nil { + log.Fatalf("checking package: %s", err) + } + pkg.typesPkg = typesPkg +} + +// generate produces the String method for the named type. +func (g *Generator) generate(typeName string) { + values := make([]Value, 0, 100) + for _, file := range g.pkg.files { + // Set the state for this run of the walker. + file.typeName = typeName + file.values = nil + if file.file != nil { + ast.Inspect(file.file, file.genDecl) + values = append(values, file.values...) + } + } + + if len(values) == 0 { + log.Fatalf("no values defined for type %s", typeName) + } + runs := splitIntoRuns(values) + // The decision of which pattern to use depends on the number of + // runs in the numbers. If there's only one, it's easy. For more than + // one, there's a tradeoff between complexity and size of the data + // and code vs. the simplicity of a map. A map takes more space, + // but so does the code. The decision here (crossover at 10) is + // arbitrary, but considers that for large numbers of runs the cost + // of the linear scan in the switch might become important, and + // rather than use yet another algorithm such as binary search, + // we punt and use a map. In any case, the likelihood of a map + // being necessary for any realistic example other than bitmasks + // is very low. And bitmasks probably deserve their own analysis, + // to be done some other day. + switch { + case len(runs) == 1: + g.buildOneRun(runs, typeName) + case len(runs) <= 10: + g.buildMultipleRuns(runs, typeName) + default: + g.buildMap(runs, typeName) + } +} + +// splitIntoRuns breaks the values into runs of contiguous sequences. +// For example, given 1,2,3,5,6,7 it returns {1,2,3},{5,6,7}. +// The input slice is known to be non-empty. +func splitIntoRuns(values []Value) [][]Value { + // We use stable sort so the lexically first name is chosen for equal elements. + sort.Stable(byValue(values)) + // Remove duplicates. Stable sort has put the one we want to print first, + // so use that one. The String method won't care about which named constant + // was the argument, so the first name for the given value is the only one to keep. + // We need to do this because identical values would cause the switch or map + // to fail to compile. + j := 1 + for i := 1; i < len(values); i++ { + if values[i].value != values[i-1].value { + values[j] = values[i] + j++ + } + } + values = values[:j] + runs := make([][]Value, 0, 10) + for len(values) > 0 { + // One contiguous sequence per outer loop. + i := 1 + for i < len(values) && values[i].value == values[i-1].value+1 { + i++ + } + runs = append(runs, values[:i]) + values = values[i:] + } + return runs +} + +// format returns the gofmt-ed contents of the Generator's buffer. +func (g *Generator) format() []byte { + src, err := format.Source(g.buf.Bytes()) + if err != nil { + // Should never happen, but can arise when developing this code. + // The user can compile the output to see the error. + log.Printf("warning: internal error: invalid Go generated: %s", err) + log.Printf("warning: compile the package to analyze the error") + return g.buf.Bytes() + } + return src +} + +// Value represents a declared constant. +type Value struct { + name string // The name of the constant. + // The value is stored as a bit pattern alone. The boolean tells us + // whether to interpret it as an int64 or a uint64; the only place + // this matters is when sorting. + // Much of the time the str field is all we need; it is printed + // by Value.String. + value uint64 // Will be converted to int64 when needed. + signed bool // Whether the constant is a signed type. + str string // The string representation given by the "go/exact" package. +} + +func (v *Value) String() string { + return v.str +} + +// byValue lets us sort the constants into increasing order. +// We take care in the Less method to sort in signed or unsigned order, +// as appropriate. +type byValue []Value + +func (b byValue) Len() int { return len(b) } +func (b byValue) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b byValue) Less(i, j int) bool { + if b[i].signed { + return int64(b[i].value) < int64(b[j].value) + } + return b[i].value < b[j].value +} + +// genDecl processes one declaration clause. +func (f *File) genDecl(node ast.Node) bool { + decl, ok := node.(*ast.GenDecl) + if !ok || decl.Tok != token.CONST { + // We only care about const declarations. + return true + } + // The name of the type of the constants we are declaring. + // Can change if this is a multi-element declaration. + typ := "" + // Loop over the elements of the declaration. Each element is a ValueSpec: + // a list of names possibly followed by a type, possibly followed by values. + // If the type and value are both missing, we carry down the type (and value, + // but the "go/types" package takes care of that). + for _, spec := range decl.Specs { + vspec := spec.(*ast.ValueSpec) // Guaranteed to succeed as this is CONST. + if vspec.Type == nil && len(vspec.Values) > 0 { + // "X = 1". With no type but a value, the constant is untyped. + // Skip this vspec and reset the remembered type. + typ = "" + continue + } + if vspec.Type != nil { + // "X T". We have a type. Remember it. + ident, ok := vspec.Type.(*ast.Ident) + if !ok { + continue + } + typ = ident.Name + } + if typ != f.typeName { + // This is not the type we're looking for. + continue + } + // We now have a list of names (from one line of source code) all being + // declared with the desired type. + // Grab their names and actual values and store them in f.values. + for _, name := range vspec.Names { + if name.Name == "_" { + continue + } + // This dance lets the type checker find the values for us. It's a + // bit tricky: look up the object declared by the name, find its + // types.Const, and extract its value. + obj, ok := f.pkg.defs[name] + if !ok { + log.Fatalf("no value for constant %s", name) + } + info := obj.Type().Underlying().(*types.Basic).Info() + if info&types.IsInteger == 0 { + log.Fatalf("can't handle non-integer constant type %s", typ) + } + value := obj.(*types.Const).Val() // Guaranteed to succeed as this is CONST. + if value.Kind() != exact.Int { + log.Fatalf("can't happen: constant is not an integer %s", name) + } + i64, isInt := exact.Int64Val(value) + u64, isUint := exact.Uint64Val(value) + if !isInt && !isUint { + log.Fatalf("internal error: value of %s is not an integer: %s", name, value.String()) + } + if !isInt { + u64 = uint64(i64) + } + v := Value{ + name: name.Name, + value: u64, + signed: info&types.IsUnsigned == 0, + str: value.String(), + } + f.values = append(f.values, v) + } + } + return false +} + +// Helpers + +// usize returns the number of bits of the smallest unsigned integer +// type that will hold n. Used to create the smallest possible slice of +// integers to use as indexes into the concatenated strings. +func usize(n int) int { + switch { + case n < 1<<8: + return 8 + case n < 1<<16: + return 16 + default: + // 2^32 is enough constants for anyone. + return 32 + } +} + +// declareIndexAndNameVars declares the index slices and concatenated names +// strings representing the runs of values. +func (g *Generator) declareIndexAndNameVars(runs [][]Value, typeName string) { + var indexes, names []string + for i, run := range runs { + index, name := g.createIndexAndNameDecl(run, typeName, fmt.Sprintf("_%d", i)) + indexes = append(indexes, index) + names = append(names, name) + } + g.Printf("const (\n") + for _, name := range names { + g.Printf("\t%s\n", name) + } + g.Printf(")\n\n") + g.Printf("var (") + for _, index := range indexes { + g.Printf("\t%s\n", index) + } + g.Printf(")\n\n") +} + +// declareIndexAndNameVar is the single-run version of declareIndexAndNameVars +func (g *Generator) declareIndexAndNameVar(run []Value, typeName string) { + index, name := g.createIndexAndNameDecl(run, typeName, "") + g.Printf("const %s\n", name) + g.Printf("var %s\n", index) +} + +// createIndexAndNameDecl returns the pair of declarations for the run. The caller will add "const" and "var". +func (g *Generator) createIndexAndNameDecl(run []Value, typeName string, suffix string) (string, string) { + b := new(bytes.Buffer) + indexes := make([]int, len(run)) + for i := range run { + b.WriteString(run[i].name) + indexes[i] = b.Len() + } + nameConst := fmt.Sprintf("_%s_name%s = %q", typeName, suffix, b.String()) + nameLen := b.Len() + b.Reset() + fmt.Fprintf(b, "_%s_index%s = [...]uint%d{0, ", typeName, suffix, usize(nameLen)) + for i, v := range indexes { + if i > 0 { + fmt.Fprintf(b, ", ") + } + fmt.Fprintf(b, "%d", v) + } + fmt.Fprintf(b, "}") + return b.String(), nameConst +} + +// declareNameVars declares the concatenated names string representing all the values in the runs. +func (g *Generator) declareNameVars(runs [][]Value, typeName string, suffix string) { + g.Printf("const _%s_name%s = \"", typeName, suffix) + for _, run := range runs { + for i := range run { + g.Printf("%s", run[i].name) + } + } + g.Printf("\"\n") +} + +// buildOneRun generates the variables and String method for a single run of contiguous values. +func (g *Generator) buildOneRun(runs [][]Value, typeName string) { + values := runs[0] + g.Printf("\n") + g.declareIndexAndNameVar(values, typeName) + // The generated code is simple enough to write as a Printf format. + lessThanZero := "" + if values[0].signed { + lessThanZero = "i < 0 || " + } + if values[0].value == 0 { // Signed or unsigned, 0 is still 0. + g.Printf(stringOneRun, typeName, usize(len(values)), lessThanZero) + } else { + g.Printf(stringOneRunWithOffset, typeName, values[0].String(), usize(len(values)), lessThanZero) + } +} + +// Arguments to format are: +// [1]: type name +// [2]: size of index element (8 for uint8 etc.) +// [3]: less than zero check (for signed types) +const stringOneRun = `func (i %[1]s) String() string { + if %[3]si >= %[1]s(len(_%[1]s_index)-1) { + return fmt.Sprintf("%[1]s(%%d)", i) + } + return _%[1]s_name[_%[1]s_index[i]:_%[1]s_index[i+1]] +} +` + +// Arguments to format are: +// [1]: type name +// [2]: lowest defined value for type, as a string +// [3]: size of index element (8 for uint8 etc.) +// [4]: less than zero check (for signed types) +/* + */ +const stringOneRunWithOffset = `func (i %[1]s) String() string { + i -= %[2]s + if %[4]si >= %[1]s(len(_%[1]s_index)-1) { + return fmt.Sprintf("%[1]s(%%d)", i + %[2]s) + } + return _%[1]s_name[_%[1]s_index[i] : _%[1]s_index[i+1]] +} +` + +// buildMultipleRuns generates the variables and String method for multiple runs of contiguous values. +// For this pattern, a single Printf format won't do. +func (g *Generator) buildMultipleRuns(runs [][]Value, typeName string) { + g.Printf("\n") + g.declareIndexAndNameVars(runs, typeName) + g.Printf("func (i %s) String() string {\n", typeName) + g.Printf("\tswitch {\n") + for i, values := range runs { + if len(values) == 1 { + g.Printf("\tcase i == %s:\n", &values[0]) + g.Printf("\t\treturn _%s_name_%d\n", typeName, i) + continue + } + g.Printf("\tcase %s <= i && i <= %s:\n", &values[0], &values[len(values)-1]) + if values[0].value != 0 { + g.Printf("\t\ti -= %s\n", &values[0]) + } + g.Printf("\t\treturn _%s_name_%d[_%s_index_%d[i]:_%s_index_%d[i+1]]\n", + typeName, i, typeName, i, typeName, i) + } + g.Printf("\tdefault:\n") + g.Printf("\t\treturn fmt.Sprintf(\"%s(%%d)\", i)\n", typeName) + g.Printf("\t}\n") + g.Printf("}\n") +} + +// buildMap handles the case where the space is so sparse a map is a reasonable fallback. +// It's a rare situation but has simple code. +func (g *Generator) buildMap(runs [][]Value, typeName string) { + g.Printf("\n") + g.declareNameVars(runs, typeName, "") + g.Printf("\nvar _%s_map = map[%s]string{\n", typeName, typeName) + n := 0 + for _, values := range runs { + for _, value := range values { + g.Printf("\t%s: _%s_name[%d:%d],\n", &value, typeName, n, n+len(value.name)) + n += len(value.name) + } + } + g.Printf("}\n\n") + g.Printf(stringMap, typeName) +} + +// Argument to format is the type name. +const stringMap = `func (i %[1]s) String() string { + if str, ok := _%[1]s_map[i]; ok { + return str + } + return fmt.Sprintf("%[1]s(%%d)", i) +} +` diff --git a/vendor/golang.org/x/tools/cmd/stringer/testdata/cgo.go b/vendor/golang.org/x/tools/cmd/stringer/testdata/cgo.go new file mode 100644 index 0000000000..ef38f959c0 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/stringer/testdata/cgo.go @@ -0,0 +1,32 @@ +// 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. + +// Import "C" shouldn't be imported. + +package main + +/* +#define HELLO 1 +*/ +import "C" + +import "fmt" + +type Cgo uint32 + +const ( + // MustScanSubDirs indicates that events were coalesced hierarchically. + MustScanSubDirs Cgo = 1 << iota +) + +func main() { + _ = C.HELLO + ck(MustScanSubDirs, "MustScanSubDirs") +} + +func ck(day Cgo, str string) { + if fmt.Sprint(day) != str { + panic("cgo.go: " + str) + } +} diff --git a/vendor/golang.org/x/tools/cmd/stringer/testdata/day.go b/vendor/golang.org/x/tools/cmd/stringer/testdata/day.go new file mode 100644 index 0000000000..35fa8dce8a --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/stringer/testdata/day.go @@ -0,0 +1,39 @@ +// 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. + +// Simple test: enumeration of type int starting at 0. + +package main + +import "fmt" + +type Day int + +const ( + Monday Day = iota + Tuesday + Wednesday + Thursday + Friday + Saturday + Sunday +) + +func main() { + ck(Monday, "Monday") + ck(Tuesday, "Tuesday") + ck(Wednesday, "Wednesday") + ck(Thursday, "Thursday") + ck(Friday, "Friday") + ck(Saturday, "Saturday") + ck(Sunday, "Sunday") + ck(-127, "Day(-127)") + ck(127, "Day(127)") +} + +func ck(day Day, str string) { + if fmt.Sprint(day) != str { + panic("day.go: " + str) + } +} diff --git a/vendor/golang.org/x/tools/cmd/stringer/testdata/gap.go b/vendor/golang.org/x/tools/cmd/stringer/testdata/gap.go new file mode 100644 index 0000000000..bc8a90c547 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/stringer/testdata/gap.go @@ -0,0 +1,44 @@ +// 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. + +// Gaps and an offset. + +package main + +import "fmt" + +type Gap int + +const ( + Two Gap = 2 + Three Gap = 3 + Five Gap = 5 + Six Gap = 6 + Seven Gap = 7 + Eight Gap = 8 + Nine Gap = 9 + Eleven Gap = 11 +) + +func main() { + ck(0, "Gap(0)") + ck(1, "Gap(1)") + ck(Two, "Two") + ck(Three, "Three") + ck(4, "Gap(4)") + ck(Five, "Five") + ck(Six, "Six") + ck(Seven, "Seven") + ck(Eight, "Eight") + ck(Nine, "Nine") + ck(10, "Gap(10)") + ck(Eleven, "Eleven") + ck(12, "Gap(12)") +} + +func ck(gap Gap, str string) { + if fmt.Sprint(gap) != str { + panic("gap.go: " + str) + } +} diff --git a/vendor/golang.org/x/tools/cmd/stringer/testdata/num.go b/vendor/golang.org/x/tools/cmd/stringer/testdata/num.go new file mode 100644 index 0000000000..0d5ab10707 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/stringer/testdata/num.go @@ -0,0 +1,35 @@ +// 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. + +// Signed integers spanning zero. + +package main + +import "fmt" + +type Num int + +const ( + m_2 Num = -2 + iota + m_1 + m0 + m1 + m2 +) + +func main() { + ck(-3, "Num(-3)") + ck(m_2, "m_2") + ck(m_1, "m_1") + ck(m0, "m0") + ck(m1, "m1") + ck(m2, "m2") + ck(3, "Num(3)") +} + +func ck(num Num, str string) { + if fmt.Sprint(num) != str { + panic("num.go: " + str) + } +} diff --git a/vendor/golang.org/x/tools/cmd/stringer/testdata/number.go b/vendor/golang.org/x/tools/cmd/stringer/testdata/number.go new file mode 100644 index 0000000000..7f1c8246c0 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/stringer/testdata/number.go @@ -0,0 +1,34 @@ +// 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. + +// Enumeration with an offset. +// Also includes a duplicate. + +package main + +import "fmt" + +type Number int + +const ( + _ Number = iota + One + Two + Three + AnotherOne = One // Duplicate; note that AnotherOne doesn't appear below. +) + +func main() { + ck(One, "One") + ck(Two, "Two") + ck(Three, "Three") + ck(AnotherOne, "One") + ck(127, "Number(127)") +} + +func ck(num Number, str string) { + if fmt.Sprint(num) != str { + panic("number.go: " + str) + } +} diff --git a/vendor/golang.org/x/tools/cmd/stringer/testdata/prime.go b/vendor/golang.org/x/tools/cmd/stringer/testdata/prime.go new file mode 100644 index 0000000000..f551a1a0bb --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/stringer/testdata/prime.go @@ -0,0 +1,56 @@ +// 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. + +// Enough gaps to trigger a map implementation of the method. +// Also includes a duplicate to test that it doesn't cause problems + +package main + +import "fmt" + +type Prime int + +const ( + p2 Prime = 2 + p3 Prime = 3 + p5 Prime = 5 + p7 Prime = 7 + p77 Prime = 7 // Duplicate; note that p77 doesn't appear below. + p11 Prime = 11 + p13 Prime = 13 + p17 Prime = 17 + p19 Prime = 19 + p23 Prime = 23 + p29 Prime = 29 + p37 Prime = 31 + p41 Prime = 41 + p43 Prime = 43 +) + +func main() { + ck(0, "Prime(0)") + ck(1, "Prime(1)") + ck(p2, "p2") + ck(p3, "p3") + ck(4, "Prime(4)") + ck(p5, "p5") + ck(p7, "p7") + ck(p77, "p7") + ck(p11, "p11") + ck(p13, "p13") + ck(p17, "p17") + ck(p19, "p19") + ck(p23, "p23") + ck(p29, "p29") + ck(p37, "p37") + ck(p41, "p41") + ck(p43, "p43") + ck(44, "Prime(44)") +} + +func ck(prime Prime, str string) { + if fmt.Sprint(prime) != str { + panic("prime.go: " + str) + } +} diff --git a/vendor/golang.org/x/tools/cmd/stringer/testdata/unum.go b/vendor/golang.org/x/tools/cmd/stringer/testdata/unum.go new file mode 100644 index 0000000000..2f8508f49c --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/stringer/testdata/unum.go @@ -0,0 +1,38 @@ +// 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. + +// Unsigned integers spanning zero. + +package main + +import "fmt" + +type Unum uint8 + +const ( + m_2 Unum = iota + 253 + m_1 +) + +const ( + m0 Unum = iota + m1 + m2 +) + +func main() { + ck(^Unum(0)-3, "Unum(252)") + ck(m_2, "m_2") + ck(m_1, "m_1") + ck(m0, "m0") + ck(m1, "m1") + ck(m2, "m2") + ck(3, "Unum(3)") +} + +func ck(unum Unum, str string) { + if fmt.Sprint(unum) != str { + panic("unum.go: " + str) + } +} diff --git a/vendor/golang.org/x/tools/cmd/stringer/testdata/unum2.go b/vendor/golang.org/x/tools/cmd/stringer/testdata/unum2.go new file mode 100644 index 0000000000..edbbedf33a --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/stringer/testdata/unum2.go @@ -0,0 +1,31 @@ +// 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. + +// Unsigned integers - check maximum size + +package main + +import "fmt" + +type Unum2 uint8 + +const ( + Zero Unum2 = iota + One + Two +) + +func main() { + ck(Zero, "Zero") + ck(One, "One") + ck(Two, "Two") + ck(3, "Unum2(3)") + ck(255, "Unum2(255)") +} + +func ck(unum Unum2, str string) { + if fmt.Sprint(unum) != str { + panic("unum.go: " + str) + } +} diff --git a/vendor/golang.org/x/tools/cmd/stringer/util_test.go b/vendor/golang.org/x/tools/cmd/stringer/util_test.go new file mode 100644 index 0000000000..1aeba6e681 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/stringer/util_test.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. + +// This file contains tests for some of the internal functions. + +package main + +import ( + "fmt" + "testing" +) + +// Helpers to save typing in the test cases. +type u []uint64 +type uu [][]uint64 + +type SplitTest struct { + input u + output uu + signed bool +} + +var ( + m2 = uint64(2) + m1 = uint64(1) + m0 = uint64(0) + m_1 = ^uint64(0) // -1 when signed. + m_2 = ^uint64(0) - 1 // -2 when signed. +) + +var splitTests = []SplitTest{ + // No need for a test for the empty case; that's picked off before splitIntoRuns. + // Single value. + {u{1}, uu{u{1}}, false}, + // Out of order. + {u{3, 2, 1}, uu{u{1, 2, 3}}, true}, + // Out of order. + {u{3, 2, 1}, uu{u{1, 2, 3}}, false}, + // A gap at the beginning. + {u{1, 33, 32, 31}, uu{u{1}, u{31, 32, 33}}, true}, + // A gap in the middle, in mixed order. + {u{33, 7, 32, 31, 9, 8}, uu{u{7, 8, 9}, u{31, 32, 33}}, true}, + // Gaps throughout + {u{33, 44, 1, 32, 45, 31}, uu{u{1}, u{31, 32, 33}, u{44, 45}}, true}, + // Unsigned values spanning 0. + {u{m1, m0, m_1, m2, m_2}, uu{u{m0, m1, m2}, u{m_2, m_1}}, false}, + // Signed values spanning 0 + {u{m1, m0, m_1, m2, m_2}, uu{u{m_2, m_1, m0, m1, m2}}, true}, +} + +func TestSplitIntoRuns(t *testing.T) { +Outer: + for n, test := range splitTests { + values := make([]Value, len(test.input)) + for i, v := range test.input { + values[i] = Value{"", v, test.signed, fmt.Sprint(v)} + } + runs := splitIntoRuns(values) + if len(runs) != len(test.output) { + t.Errorf("#%d: %v: got %d runs; expected %d", n, test.input, len(runs), len(test.output)) + continue + } + for i, run := range runs { + if len(run) != len(test.output[i]) { + t.Errorf("#%d: got %v; expected %v", n, runs, test.output) + continue Outer + } + for j, v := range run { + if v.value != test.output[i][j] { + t.Errorf("#%d: got %v; expected %v", n, runs, test.output) + continue Outer + } + } + } + } +} diff --git a/vendor/golang.org/x/tools/cmd/tip/Dockerfile b/vendor/golang.org/x/tools/cmd/tip/Dockerfile new file mode 100644 index 0000000000..8364cdb8a3 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/tip/Dockerfile @@ -0,0 +1,13 @@ +FROM golang:1.5 + +RUN apt-get update && apt-get install --no-install-recommends -y -q build-essential git + +# golang puts its go install here (weird but true) +ENV GOROOT_BOOTSTRAP /usr/local/go + +# golang sets GOPATH=/go +ADD . /go/src/tip +RUN go install tip +ENTRYPOINT ["/go/bin/tip"] +# Kubernetes expects us to listen on port 8080 +EXPOSE 8080 diff --git a/vendor/golang.org/x/tools/cmd/tip/README b/vendor/golang.org/x/tools/cmd/tip/README new file mode 100644 index 0000000000..5fe1cfee04 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/tip/README @@ -0,0 +1,14 @@ +1. Deploy the app. + + To deploy tip.golang.org: + $ gcloud --project golang-org preview app deploy --no-promote godoc.yaml + + To deploy talks.golang.org: + $ gcloud --project golang-org preview app deploy --no-promote talks.yaml + +2. Wait until the deployed version is serving requests. + +3. Go to the developer console and upgrade the default version. + https://console.developers.google.com/appengine/versions?project=golang-org&moduleId=tip + +4. Clean up any old versions (they continue to use at least one instance). diff --git a/vendor/golang.org/x/tools/cmd/tip/godoc.go b/vendor/golang.org/x/tools/cmd/tip/godoc.go new file mode 100644 index 0000000000..ab3c3d2e22 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/tip/godoc.go @@ -0,0 +1,72 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package main + +import ( + "bytes" + "errors" + "fmt" + "os" + "os/exec" + "path/filepath" +) + +type godocBuilder struct { +} + +func (b godocBuilder) Signature(heads map[string]string) string { + return heads["go"] + "-" + heads["tools"] +} + +func (b godocBuilder) Init(dir, hostport string, heads map[string]string) (*exec.Cmd, error) { + goDir := filepath.Join(dir, "go") + toolsDir := filepath.Join(dir, "gopath/src/golang.org/x/tools") + if err := checkout(repoURL+"go", heads["go"], goDir); err != nil { + return nil, err + } + if err := checkout(repoURL+"tools", heads["tools"], toolsDir); err != nil { + return nil, err + } + + make := exec.Command(filepath.Join(goDir, "src/make.bash")) + make.Dir = filepath.Join(goDir, "src") + if err := runErr(make); err != nil { + return nil, err + } + goBin := filepath.Join(goDir, "bin/go") + install := exec.Command(goBin, "install", "golang.org/x/tools/cmd/godoc") + install.Env = []string{ + "GOROOT=" + goDir, + "GOPATH=" + filepath.Join(dir, "gopath"), + "GOROOT_BOOTSTRAP=" + os.Getenv("GOROOT_BOOTSTRAP"), + } + if err := runErr(install); err != nil { + return nil, err + } + + godocBin := filepath.Join(goDir, "bin/godoc") + godoc := exec.Command(godocBin, "-http="+hostport, "-index", "-index_interval=-1s") + godoc.Env = []string{"GOROOT=" + goDir} + // TODO(adg): log this somewhere useful + godoc.Stdout = os.Stdout + godoc.Stderr = os.Stderr + if err := godoc.Start(); err != nil { + return nil, err + } + return godoc, nil +} + +var indexingMsg = []byte("Indexing in progress: result may be inaccurate") + +func (b godocBuilder) HealthCheck(hostport string) error { + body, err := getOK(fmt.Sprintf("http://%v/search?q=FALLTHROUGH", hostport)) + if err != nil { + return err + } + if bytes.Contains(body, indexingMsg) { + return errors.New("still indexing") + } + return nil +} diff --git a/vendor/golang.org/x/tools/cmd/tip/godoc.yaml b/vendor/golang.org/x/tools/cmd/tip/godoc.yaml new file mode 100644 index 0000000000..5f6d9dc40a --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/tip/godoc.yaml @@ -0,0 +1,18 @@ +module: tip +runtime: custom +vm: true + +automatic_scaling: + min_num_instances: 1 + max_num_instances: 2 + +env_variables: + TIP_BUILDER: 'godoc' + +health_check: + enable_health_check: True + check_interval_sec: 5 + timeout_sec: 4 + unhealthy_threshold: 2 + healthy_threshold: 2 + restart_threshold: 240 diff --git a/vendor/golang.org/x/tools/cmd/tip/talks.go b/vendor/golang.org/x/tools/cmd/tip/talks.go new file mode 100644 index 0000000000..15167e1c97 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/tip/talks.go @@ -0,0 +1,73 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package main + +import ( + "bytes" + "errors" + "fmt" + "os" + "os/exec" + "path/filepath" + "runtime" +) + +type talksBuilder struct { +} + +func (b talksBuilder) Signature(heads map[string]string) string { + return heads["talks"] +} + +const talksToolsRev = "ac6d9c1d842f9b6482f39f7a172e0251a0f7cbc0" + +func (b talksBuilder) Init(dir, hostport string, heads map[string]string) (*exec.Cmd, error) { + toolsDir := filepath.Join(dir, "gopath/src/golang.org/x/tools") + if err := checkout(repoURL+"tools", talksToolsRev, toolsDir); err != nil { + return nil, err + } + talksDir := filepath.Join(dir, "gopath/src/golang.org/x/talks") + if err := checkout(repoURL+"talks", heads["talks"], talksDir); err != nil { + return nil, err + } + + goDir := os.Getenv("GOROOT_BOOTSTRAP") + if goDir == "" { + goDir = runtime.GOROOT() + } + goBin := filepath.Join(goDir, "bin/go") + goPath := filepath.Join(dir, "gopath") + presentPath := "golang.org/x/tools/cmd/present" + install := exec.Command(goBin, "install", "-tags=appenginevm", presentPath) + install.Env = []string{"GOROOT=" + goDir, "GOPATH=" + goPath} + if err := runErr(install); err != nil { + return nil, err + } + + talksBin := filepath.Join(goPath, "bin/present") + presentSrc := filepath.Join(goPath, "src", presentPath) + present := exec.Command(talksBin, "-http="+hostport, "-base="+presentSrc) + present.Dir = talksDir + // TODO(adg): log this somewhere useful + present.Stdout = os.Stdout + present.Stderr = os.Stderr + if err := present.Start(); err != nil { + return nil, err + } + return present, nil +} + +var talksMsg = []byte("Talks - The Go Programming Language") + +func (b talksBuilder) HealthCheck(hostport string) error { + body, err := getOK(fmt.Sprintf("http://%v/", hostport)) + if err != nil { + return err + } + if !bytes.Contains(body, talksMsg) { + return errors.New("couldn't match string") + } + return nil +} diff --git a/vendor/golang.org/x/tools/cmd/tip/talks.yaml b/vendor/golang.org/x/tools/cmd/tip/talks.yaml new file mode 100644 index 0000000000..edc90a5a7d --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/tip/talks.yaml @@ -0,0 +1,18 @@ +module: talks +runtime: custom +vm: true + +automatic_scaling: + min_num_instances: 1 + max_num_instances: 5 + +env_variables: + TIP_BUILDER: 'talks' + +health_check: + enable_health_check: True + check_interval_sec: 5 + timeout_sec: 4 + unhealthy_threshold: 2 + healthy_threshold: 2 + restart_threshold: 240 diff --git a/vendor/golang.org/x/tools/cmd/tip/tip.go b/vendor/golang.org/x/tools/cmd/tip/tip.go new file mode 100644 index 0000000000..43894144d6 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/tip/tip.go @@ -0,0 +1,325 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// Command tipgodoc is the beginning of the new tip.golang.org server, +// serving the latest HEAD straight from the Git oven. +package main + +import ( + "bufio" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "net/http/httputil" + "net/url" + "os" + "os/exec" + "path/filepath" + "sync" + "time" +) + +const ( + repoURL = "https://go.googlesource.com/" + metaURL = "https://go.googlesource.com/?b=master&format=JSON" + startTimeout = 10 * time.Minute +) + +func main() { + const k = "TIP_BUILDER" + var b Builder + switch os.Getenv(k) { + case "godoc": + b = godocBuilder{} + case "talks": + b = talksBuilder{} + default: + log.Fatalf("Unknown %v value: %q", k, os.Getenv(k)) + } + + p := &Proxy{builder: b} + go p.run() + http.Handle("/", p) + http.HandleFunc("/_ah/health", p.serveHealthCheck) + + log.Print("Starting up") + + if err := http.ListenAndServe(":8080", nil); err != nil { + p.stop() + log.Fatal(err) + } +} + +// Proxy implements the tip.golang.org server: a reverse-proxy +// that builds and runs godoc instances showing the latest docs. +type Proxy struct { + builder Builder + + mu sync.Mutex // protects the followin' + proxy http.Handler + cur string // signature of gorepo+toolsrepo + cmd *exec.Cmd // live godoc instance, or nil for none + side string + hostport string // host and port of the live instance + err error +} + +type Builder interface { + Signature(heads map[string]string) string + Init(dir, hostport string, heads map[string]string) (*exec.Cmd, error) + HealthCheck(hostport string) error +} + +func (p *Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if r.URL.Path == "/_tipstatus" { + p.serveStatus(w, r) + return + } + p.mu.Lock() + proxy := p.proxy + err := p.err + p.mu.Unlock() + if proxy == nil { + s := "starting up" + if err != nil { + s = err.Error() + } + http.Error(w, s, http.StatusInternalServerError) + return + } + proxy.ServeHTTP(w, r) +} + +func (p *Proxy) serveStatus(w http.ResponseWriter, r *http.Request) { + p.mu.Lock() + defer p.mu.Unlock() + fmt.Fprintf(w, "side=%v\ncurrent=%v\nerror=%v\n", p.side, p.cur, p.err) +} + +func (p *Proxy) serveHealthCheck(w http.ResponseWriter, r *http.Request) { + p.mu.Lock() + defer p.mu.Unlock() + // NOTE: Status 502, 503, 504 are the only status codes that signify an unhealthy app. + // So long as this handler returns one of those codes, this instance will not be sent any requests. + if p.proxy == nil { + log.Printf("Health check: not ready") + http.Error(w, "Not ready", http.StatusServiceUnavailable) + return + } + + if err := p.builder.HealthCheck(p.hostport); err != nil { + log.Printf("Health check failed: %v", err) + http.Error(w, "Health check failed", http.StatusServiceUnavailable) + return + } + io.WriteString(w, "ok") +} + +// run runs in its own goroutine. +func (p *Proxy) run() { + p.side = "a" + for { + p.poll() + time.Sleep(30 * time.Second) + } +} + +func (p *Proxy) stop() { + p.mu.Lock() + defer p.mu.Unlock() + if p.cmd != nil { + p.cmd.Process.Kill() + } +} + +// poll runs from the run loop goroutine. +func (p *Proxy) poll() { + heads := gerritMetaMap() + if heads == nil { + return + } + + sig := p.builder.Signature(heads) + + p.mu.Lock() + changes := sig != p.cur + curSide := p.side + p.cur = sig + p.mu.Unlock() + + if !changes { + return + } + + newSide := "b" + if curSide == "b" { + newSide = "a" + } + + dir := filepath.Join(os.TempDir(), "tip", newSide) + if err := os.MkdirAll(dir, 0755); err != nil { + p.err = err + return + } + hostport := "localhost:8081" + if newSide == "b" { + hostport = "localhost:8082" + } + cmd, err := p.builder.Init(dir, hostport, heads) + if err != nil { + err = fmt.Errorf("builder.Init: %v", err) + } else { + go func() { + // TODO(adg,bradfitz): be smarter about dead processes + if err := cmd.Wait(); err != nil { + log.Printf("process in %v exited: %v", dir, err) + } + }() + err = waitReady(p.builder, hostport) + if err != nil { + cmd.Process.Kill() + err = fmt.Errorf("waitReady: %v", err) + } + } + + p.mu.Lock() + defer p.mu.Unlock() + if err != nil { + log.Println(err) + p.err = err + return + } + + u, err := url.Parse(fmt.Sprintf("http://%v/", hostport)) + if err != nil { + err = fmt.Errorf("parsing hostport: %v", err) + log.Println(err) + p.err = err + return + } + p.proxy = httputil.NewSingleHostReverseProxy(u) + p.side = newSide + p.hostport = hostport + if p.cmd != nil { + p.cmd.Process.Kill() + } + p.cmd = cmd +} + +func waitReady(b Builder, hostport string) error { + var err error + deadline := time.Now().Add(startTimeout) + for time.Now().Before(deadline) { + if err = b.HealthCheck(hostport); err == nil { + return nil + } + time.Sleep(time.Second) + } + return fmt.Errorf("timed out waiting for process at %v: %v", hostport, err) +} + +func runErr(cmd *exec.Cmd) error { + out, err := cmd.CombinedOutput() + if err != nil { + if len(out) == 0 { + return err + } + return fmt.Errorf("%s\n%v", out, err) + } + return nil +} + +func checkout(repo, hash, path string) error { + // Clone git repo if it doesn't exist. + if _, err := os.Stat(filepath.Join(path, ".git")); os.IsNotExist(err) { + if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil { + return fmt.Errorf("mkdir: %v", err) + } + if err := runErr(exec.Command("git", "clone", repo, path)); err != nil { + return fmt.Errorf("clone: %v", err) + } + } else if err != nil { + return fmt.Errorf("stat .git: %v", err) + } + + // Pull down changes and update to hash. + cmd := exec.Command("git", "fetch") + cmd.Dir = path + if err := runErr(cmd); err != nil { + return fmt.Errorf("fetch: %v", err) + } + cmd = exec.Command("git", "reset", "--hard", hash) + cmd.Dir = path + if err := runErr(cmd); err != nil { + return fmt.Errorf("reset: %v", err) + } + cmd = exec.Command("git", "clean", "-d", "-f", "-x") + cmd.Dir = path + if err := runErr(cmd); err != nil { + return fmt.Errorf("clean: %v", err) + } + return nil +} + +// gerritMetaMap returns the map from repo name (e.g. "go") to its +// latest master hash. +// The returned map is nil on any transient error. +func gerritMetaMap() map[string]string { + res, err := http.Get(metaURL) + if err != nil { + return nil + } + defer res.Body.Close() + defer io.Copy(ioutil.Discard, res.Body) // ensure EOF for keep-alive + if res.StatusCode != 200 { + return nil + } + var meta map[string]struct { + Branches map[string]string + } + br := bufio.NewReader(res.Body) + // For security reasons or something, this URL starts with ")]}'\n" before + // the JSON object. So ignore that. + // Shawn Pearce says it's guaranteed to always be just one line, ending in '\n'. + for { + b, err := br.ReadByte() + if err != nil { + return nil + } + if b == '\n' { + break + } + } + if err := json.NewDecoder(br).Decode(&meta); err != nil { + log.Printf("JSON decoding error from %v: %s", metaURL, err) + return nil + } + m := map[string]string{} + for repo, v := range meta { + if master, ok := v.Branches["master"]; ok { + m[repo] = master + } + } + return m +} + +func getOK(url string) (body []byte, err error) { + res, err := http.Get(url) + if err != nil { + return nil, err + } + body, err = ioutil.ReadAll(res.Body) + res.Body.Close() + if err != nil { + return nil, err + } + if res.StatusCode != http.StatusOK { + return nil, errors.New(res.Status) + } + return body, nil +} diff --git a/vendor/golang.org/x/tools/cmd/vet/asmdecl.go b/vendor/golang.org/x/tools/cmd/vet/asmdecl.go new file mode 100644 index 0000000000..6bdfdbf3be --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/asmdecl.go @@ -0,0 +1,662 @@ +// Copyright 2013 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. + +// Identify mismatches between assembly files and Go func declarations. + +package main + +import ( + "bytes" + "fmt" + "go/ast" + "go/token" + "regexp" + "strconv" + "strings" +) + +// 'kind' is a kind of assembly variable. +// The kinds 1, 2, 4, 8 stand for values of that size. +type asmKind int + +// These special kinds are not valid sizes. +const ( + asmString asmKind = 100 + iota + asmSlice + asmInterface + asmEmptyInterface +) + +// An asmArch describes assembly parameters for an architecture +type asmArch struct { + name string + ptrSize int + intSize int + maxAlign int + bigEndian bool + stack string + lr bool +} + +// An asmFunc describes the expected variables for a function on a given architecture. +type asmFunc struct { + arch *asmArch + size int // size of all arguments + vars map[string]*asmVar + varByOffset map[int]*asmVar +} + +// An asmVar describes a single assembly variable. +type asmVar struct { + name string + kind asmKind + typ string + off int + size int + inner []*asmVar +} + +var ( + asmArch386 = asmArch{"386", 4, 4, 4, false, "SP", false} + asmArchArm = asmArch{"arm", 4, 4, 4, false, "R13", true} + asmArchArm64 = asmArch{"arm64", 8, 8, 8, false, "RSP", true} + asmArchAmd64 = asmArch{"amd64", 8, 8, 8, false, "SP", false} + asmArchAmd64p32 = asmArch{"amd64p32", 4, 4, 8, false, "SP", false} + asmArchPower64 = asmArch{"power64", 8, 8, 8, true, "R1", true} + asmArchPower64LE = asmArch{"power64le", 8, 8, 8, false, "R1", true} + + arches = []*asmArch{ + &asmArch386, + &asmArchArm, + &asmArchArm64, + &asmArchAmd64, + &asmArchAmd64p32, + &asmArchPower64, + &asmArchPower64LE, + } +) + +var ( + re = regexp.MustCompile + asmPlusBuild = re(`//\s+\+build\s+([^\n]+)`) + asmTEXT = re(`\bTEXT\b.*·([^\(]+)\(SB\)(?:\s*,\s*([0-9A-Z|+]+))?(?:\s*,\s*\$(-?[0-9]+)(?:-([0-9]+))?)?`) + asmDATA = re(`\b(DATA|GLOBL)\b`) + asmNamedFP = re(`([a-zA-Z0-9_\xFF-\x{10FFFF}]+)(?:\+([0-9]+))\(FP\)`) + asmUnnamedFP = re(`[^+\-0-9](([0-9]+)\(FP\))`) + asmSP = re(`[^+\-0-9](([0-9]+)\(([A-Z0-9]+)\))`) + asmOpcode = re(`^\s*(?:[A-Z0-9a-z_]+:)?\s*([A-Z]+)\s*([^,]*)(?:,\s*(.*))?`) + power64Suff = re(`([BHWD])(ZU|Z|U|BR)?$`) +) + +func asmCheck(pkg *Package) { + if !vet("asmdecl") { + return + } + + // No work if no assembly files. + if !pkg.hasFileWithSuffix(".s") { + return + } + + // Gather declarations. knownFunc[name][arch] is func description. + knownFunc := make(map[string]map[string]*asmFunc) + + for _, f := range pkg.files { + if f.file != nil { + for _, decl := range f.file.Decls { + if decl, ok := decl.(*ast.FuncDecl); ok && decl.Body == nil { + knownFunc[decl.Name.Name] = f.asmParseDecl(decl) + } + } + } + } + +Files: + for _, f := range pkg.files { + if !strings.HasSuffix(f.name, ".s") { + continue + } + Println("Checking file", f.name) + + // Determine architecture from file name if possible. + var arch string + var archDef *asmArch + for _, a := range arches { + if strings.HasSuffix(f.name, "_"+a.name+".s") { + arch = a.name + archDef = a + break + } + } + + lines := strings.SplitAfter(string(f.content), "\n") + var ( + fn *asmFunc + fnName string + localSize, argSize int + wroteSP bool + haveRetArg bool + retLine []int + ) + + flushRet := func() { + if fn != nil && fn.vars["ret"] != nil && !haveRetArg && len(retLine) > 0 { + v := fn.vars["ret"] + for _, line := range retLine { + f.Badf(token.NoPos, "%s:%d: [%s] %s: RET without writing to %d-byte ret+%d(FP)", f.name, line, arch, fnName, v.size, v.off) + } + } + retLine = nil + } + for lineno, line := range lines { + lineno++ + + badf := func(format string, args ...interface{}) { + f.Badf(token.NoPos, "%s:%d: [%s] %s: %s", f.name, lineno, arch, fnName, fmt.Sprintf(format, args...)) + } + + if arch == "" { + // Determine architecture from +build line if possible. + if m := asmPlusBuild.FindStringSubmatch(line); m != nil { + Fields: + for _, fld := range strings.Fields(m[1]) { + for _, a := range arches { + if a.name == fld { + arch = a.name + archDef = a + break Fields + } + } + } + } + } + + if m := asmTEXT.FindStringSubmatch(line); m != nil { + flushRet() + if arch == "" { + f.Warnf(token.NoPos, "%s: cannot determine architecture for assembly file", f.name) + continue Files + } + fnName = m[1] + fn = knownFunc[m[1]][arch] + if fn != nil { + size, _ := strconv.Atoi(m[4]) + if size != fn.size && (m[2] != "7" && !strings.Contains(m[2], "NOSPLIT") || size != 0) { + badf("wrong argument size %d; expected $...-%d", size, fn.size) + } + } + localSize, _ = strconv.Atoi(m[3]) + localSize += archDef.intSize + if archDef.lr { + // Account for caller's saved LR + localSize += archDef.intSize + } + argSize, _ = strconv.Atoi(m[4]) + if fn == nil && !strings.Contains(fnName, "<>") { + badf("function %s missing Go declaration", fnName) + } + wroteSP = false + haveRetArg = false + continue + } else if strings.Contains(line, "TEXT") && strings.Contains(line, "SB") { + // function, but not visible from Go (didn't match asmTEXT), so stop checking + flushRet() + fn = nil + fnName = "" + continue + } + + if strings.Contains(line, "RET") { + retLine = append(retLine, lineno) + } + + if fnName == "" { + continue + } + + if asmDATA.FindStringSubmatch(line) != nil { + fn = nil + } + + if archDef == nil { + continue + } + + if strings.Contains(line, ", "+archDef.stack) || strings.Contains(line, ",\t"+archDef.stack) { + wroteSP = true + continue + } + + for _, m := range asmSP.FindAllStringSubmatch(line, -1) { + if m[3] != archDef.stack || wroteSP { + continue + } + off := 0 + if m[1] != "" { + off, _ = strconv.Atoi(m[2]) + } + if off >= localSize { + if fn != nil { + v := fn.varByOffset[off-localSize] + if v != nil { + badf("%s should be %s+%d(FP)", m[1], v.name, off-localSize) + continue + } + } + if off >= localSize+argSize { + badf("use of %s points beyond argument frame", m[1]) + continue + } + badf("use of %s to access argument frame", m[1]) + } + } + + if fn == nil { + continue + } + + for _, m := range asmUnnamedFP.FindAllStringSubmatch(line, -1) { + off, _ := strconv.Atoi(m[2]) + v := fn.varByOffset[off] + if v != nil { + badf("use of unnamed argument %s; offset %d is %s+%d(FP)", m[1], off, v.name, v.off) + } else { + badf("use of unnamed argument %s", m[1]) + } + } + + for _, m := range asmNamedFP.FindAllStringSubmatch(line, -1) { + name := m[1] + off := 0 + if m[2] != "" { + off, _ = strconv.Atoi(m[2]) + } + if name == "ret" || strings.HasPrefix(name, "ret_") { + haveRetArg = true + } + v := fn.vars[name] + if v == nil { + // Allow argframe+0(FP). + if name == "argframe" && off == 0 { + continue + } + v = fn.varByOffset[off] + if v != nil { + badf("unknown variable %s; offset %d is %s+%d(FP)", name, off, v.name, v.off) + } else { + badf("unknown variable %s", name) + } + continue + } + asmCheckVar(badf, fn, line, m[0], off, v) + } + } + flushRet() + } +} + +// asmParseDecl parses a function decl for expected assembly variables. +func (f *File) asmParseDecl(decl *ast.FuncDecl) map[string]*asmFunc { + var ( + arch *asmArch + fn *asmFunc + offset int + failed bool + ) + + addVar := func(outer string, v asmVar) { + if vo := fn.vars[outer]; vo != nil { + vo.inner = append(vo.inner, &v) + } + fn.vars[v.name] = &v + for i := 0; i < v.size; i++ { + fn.varByOffset[v.off+i] = &v + } + } + + addParams := func(list []*ast.Field) { + for i, fld := range list { + // Determine alignment, size, and kind of type in declaration. + var align, size int + var kind asmKind + names := fld.Names + typ := f.gofmt(fld.Type) + switch t := fld.Type.(type) { + default: + switch typ { + default: + f.Warnf(fld.Type.Pos(), "unknown assembly argument type %s", typ) + failed = true + return + case "int8", "uint8", "byte", "bool": + size = 1 + case "int16", "uint16": + size = 2 + case "int32", "uint32", "float32": + size = 4 + case "int64", "uint64", "float64": + align = arch.maxAlign + size = 8 + case "int", "uint": + size = arch.intSize + case "uintptr", "iword", "Word", "Errno", "unsafe.Pointer": + size = arch.ptrSize + case "string", "ErrorString": + size = arch.ptrSize * 2 + align = arch.ptrSize + kind = asmString + } + case *ast.ChanType, *ast.FuncType, *ast.MapType, *ast.StarExpr: + size = arch.ptrSize + case *ast.InterfaceType: + align = arch.ptrSize + size = 2 * arch.ptrSize + if len(t.Methods.List) > 0 { + kind = asmInterface + } else { + kind = asmEmptyInterface + } + case *ast.ArrayType: + if t.Len == nil { + size = arch.ptrSize + 2*arch.intSize + align = arch.ptrSize + kind = asmSlice + break + } + f.Warnf(fld.Type.Pos(), "unsupported assembly argument type %s", typ) + failed = true + case *ast.StructType: + f.Warnf(fld.Type.Pos(), "unsupported assembly argument type %s", typ) + failed = true + } + if align == 0 { + align = size + } + if kind == 0 { + kind = asmKind(size) + } + offset += -offset & (align - 1) + + // Create variable for each name being declared with this type. + if len(names) == 0 { + name := "unnamed" + if decl.Type.Results != nil && len(decl.Type.Results.List) > 0 && &list[0] == &decl.Type.Results.List[0] && i == 0 { + // Assume assembly will refer to single unnamed result as r. + name = "ret" + } + names = []*ast.Ident{{Name: name}} + } + for _, id := range names { + name := id.Name + addVar("", asmVar{ + name: name, + kind: kind, + typ: typ, + off: offset, + size: size, + }) + switch kind { + case 8: + if arch.ptrSize == 4 { + w1, w2 := "lo", "hi" + if arch.bigEndian { + w1, w2 = w2, w1 + } + addVar(name, asmVar{ + name: name + "_" + w1, + kind: 4, + typ: "half " + typ, + off: offset, + size: 4, + }) + addVar(name, asmVar{ + name: name + "_" + w2, + kind: 4, + typ: "half " + typ, + off: offset + 4, + size: 4, + }) + } + + case asmEmptyInterface: + addVar(name, asmVar{ + name: name + "_type", + kind: asmKind(arch.ptrSize), + typ: "interface type", + off: offset, + size: arch.ptrSize, + }) + addVar(name, asmVar{ + name: name + "_data", + kind: asmKind(arch.ptrSize), + typ: "interface data", + off: offset + arch.ptrSize, + size: arch.ptrSize, + }) + + case asmInterface: + addVar(name, asmVar{ + name: name + "_itable", + kind: asmKind(arch.ptrSize), + typ: "interface itable", + off: offset, + size: arch.ptrSize, + }) + addVar(name, asmVar{ + name: name + "_data", + kind: asmKind(arch.ptrSize), + typ: "interface data", + off: offset + arch.ptrSize, + size: arch.ptrSize, + }) + + case asmSlice: + addVar(name, asmVar{ + name: name + "_base", + kind: asmKind(arch.ptrSize), + typ: "slice base", + off: offset, + size: arch.ptrSize, + }) + addVar(name, asmVar{ + name: name + "_len", + kind: asmKind(arch.intSize), + typ: "slice len", + off: offset + arch.ptrSize, + size: arch.intSize, + }) + addVar(name, asmVar{ + name: name + "_cap", + kind: asmKind(arch.intSize), + typ: "slice cap", + off: offset + arch.ptrSize + arch.intSize, + size: arch.intSize, + }) + + case asmString: + addVar(name, asmVar{ + name: name + "_base", + kind: asmKind(arch.ptrSize), + typ: "string base", + off: offset, + size: arch.ptrSize, + }) + addVar(name, asmVar{ + name: name + "_len", + kind: asmKind(arch.intSize), + typ: "string len", + off: offset + arch.ptrSize, + size: arch.intSize, + }) + } + offset += size + } + } + } + + m := make(map[string]*asmFunc) + for _, arch = range arches { + fn = &asmFunc{ + arch: arch, + vars: make(map[string]*asmVar), + varByOffset: make(map[int]*asmVar), + } + offset = 0 + addParams(decl.Type.Params.List) + if decl.Type.Results != nil && len(decl.Type.Results.List) > 0 { + offset += -offset & (arch.maxAlign - 1) + addParams(decl.Type.Results.List) + } + fn.size = offset + m[arch.name] = fn + } + + if failed { + return nil + } + return m +} + +// asmCheckVar checks a single variable reference. +func asmCheckVar(badf func(string, ...interface{}), fn *asmFunc, line, expr string, off int, v *asmVar) { + m := asmOpcode.FindStringSubmatch(line) + if m == nil { + if !strings.HasPrefix(strings.TrimSpace(line), "//") { + badf("cannot find assembly opcode") + } + return + } + + // Determine operand sizes from instruction. + // Typically the suffix suffices, but there are exceptions. + var src, dst, kind asmKind + op := m[1] + switch fn.arch.name + "." + op { + case "386.FMOVLP": + src, dst = 8, 4 + case "arm.MOVD": + src = 8 + case "arm.MOVW": + src = 4 + case "arm.MOVH", "arm.MOVHU": + src = 2 + case "arm.MOVB", "arm.MOVBU": + src = 1 + // LEA* opcodes don't really read the second arg. + // They just take the address of it. + case "386.LEAL": + dst = 4 + case "amd64.LEAQ": + dst = 8 + case "amd64p32.LEAL": + dst = 4 + default: + switch fn.arch.name { + case "386", "amd64": + if strings.HasPrefix(op, "F") && (strings.HasSuffix(op, "D") || strings.HasSuffix(op, "DP")) { + // FMOVDP, FXCHD, etc + src = 8 + break + } + if strings.HasPrefix(op, "F") && (strings.HasSuffix(op, "F") || strings.HasSuffix(op, "FP")) { + // FMOVFP, FXCHF, etc + src = 4 + break + } + if strings.HasSuffix(op, "SD") { + // MOVSD, SQRTSD, etc + src = 8 + break + } + if strings.HasSuffix(op, "SS") { + // MOVSS, SQRTSS, etc + src = 4 + break + } + if strings.HasPrefix(op, "SET") { + // SETEQ, etc + src = 1 + break + } + switch op[len(op)-1] { + case 'B': + src = 1 + case 'W': + src = 2 + case 'L': + src = 4 + case 'D', 'Q': + src = 8 + } + case "power64", "power64le": + // Strip standard suffixes to reveal size letter. + m := power64Suff.FindStringSubmatch(op) + if m != nil { + switch m[1][0] { + case 'B': + src = 1 + case 'H': + src = 2 + case 'W': + src = 4 + case 'D': + src = 8 + } + } + } + } + if dst == 0 { + dst = src + } + + // Determine whether the match we're holding + // is the first or second argument. + if strings.Index(line, expr) > strings.Index(line, ",") { + kind = dst + } else { + kind = src + } + + vk := v.kind + vt := v.typ + switch vk { + case asmInterface, asmEmptyInterface, asmString, asmSlice: + // allow reference to first word (pointer) + vk = v.inner[0].kind + vt = v.inner[0].typ + } + + if off != v.off { + var inner bytes.Buffer + for i, vi := range v.inner { + if len(v.inner) > 1 { + fmt.Fprintf(&inner, ",") + } + fmt.Fprintf(&inner, " ") + if i == len(v.inner)-1 { + fmt.Fprintf(&inner, "or ") + } + fmt.Fprintf(&inner, "%s+%d(FP)", vi.name, vi.off) + } + badf("invalid offset %s; expected %s+%d(FP)%s", expr, v.name, v.off, inner.String()) + return + } + if kind != 0 && kind != vk { + var inner bytes.Buffer + if len(v.inner) > 0 { + fmt.Fprintf(&inner, " containing") + for i, vi := range v.inner { + if i > 0 && len(v.inner) > 2 { + fmt.Fprintf(&inner, ",") + } + fmt.Fprintf(&inner, " ") + if i > 0 && i == len(v.inner)-1 { + fmt.Fprintf(&inner, "and ") + } + fmt.Fprintf(&inner, "%s+%d(FP)", vi.name, vi.off) + } + } + badf("invalid %s of %s; %s is %d-byte value%s", op, expr, vt, vk, inner.String()) + } +} diff --git a/vendor/golang.org/x/tools/cmd/vet/assign.go b/vendor/golang.org/x/tools/cmd/vet/assign.go new file mode 100644 index 0000000000..54c1ae1fdc --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/assign.go @@ -0,0 +1,49 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +This file contains the code to check for useless assignments. +*/ + +package main + +import ( + "go/ast" + "go/token" + "reflect" +) + +func init() { + register("assign", + "check for useless assignments", + checkAssignStmt, + assignStmt) +} + +// TODO: should also check for assignments to struct fields inside methods +// that are on T instead of *T. + +// checkAssignStmt checks for assignments of the form " = ". +// These are almost always useless, and even when they aren't they are usually a mistake. +func checkAssignStmt(f *File, node ast.Node) { + stmt := node.(*ast.AssignStmt) + if stmt.Tok != token.ASSIGN { + return // ignore := + } + if len(stmt.Lhs) != len(stmt.Rhs) { + // If LHS and RHS have different cardinality, they can't be the same. + return + } + for i, lhs := range stmt.Lhs { + rhs := stmt.Rhs[i] + if reflect.TypeOf(lhs) != reflect.TypeOf(rhs) { + continue // short-circuit the heavy-weight gofmt check + } + le := f.gofmt(lhs) + re := f.gofmt(rhs) + if le == re { + f.Badf(stmt.Pos(), "self-assignment of %s to %s", re, le) + } + } +} diff --git a/vendor/golang.org/x/tools/cmd/vet/atomic.go b/vendor/golang.org/x/tools/cmd/vet/atomic.go new file mode 100644 index 0000000000..c084f13ab3 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/atomic.go @@ -0,0 +1,66 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "go/ast" + "go/token" +) + +func init() { + register("atomic", + "check for common mistaken usages of the sync/atomic package", + checkAtomicAssignment, + assignStmt) +} + +// checkAtomicAssignment walks the assignment statement checking for common +// mistaken usage of atomic package, such as: x = atomic.AddUint64(&x, 1) +func checkAtomicAssignment(f *File, node ast.Node) { + n := node.(*ast.AssignStmt) + if len(n.Lhs) != len(n.Rhs) { + return + } + + for i, right := range n.Rhs { + call, ok := right.(*ast.CallExpr) + if !ok { + continue + } + sel, ok := call.Fun.(*ast.SelectorExpr) + if !ok { + continue + } + pkg, ok := sel.X.(*ast.Ident) + if !ok || pkg.Name != "atomic" { + continue + } + + switch sel.Sel.Name { + case "AddInt32", "AddInt64", "AddUint32", "AddUint64", "AddUintptr": + f.checkAtomicAddAssignment(n.Lhs[i], call) + } + } +} + +// checkAtomicAddAssignment walks the atomic.Add* method calls checking for assigning the return value +// to the same variable being used in the operation +func (f *File) checkAtomicAddAssignment(left ast.Expr, call *ast.CallExpr) { + if len(call.Args) != 2 { + return + } + arg := call.Args[0] + broken := false + + if uarg, ok := arg.(*ast.UnaryExpr); ok && uarg.Op == token.AND { + broken = f.gofmt(left) == f.gofmt(uarg.X) + } else if star, ok := left.(*ast.StarExpr); ok { + broken = f.gofmt(star.X) == f.gofmt(arg) + } + + if broken { + f.Bad(left.Pos(), "direct assignment to atomic value") + } +} diff --git a/vendor/golang.org/x/tools/cmd/vet/bool.go b/vendor/golang.org/x/tools/cmd/vet/bool.go new file mode 100644 index 0000000000..07c2a93dff --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/bool.go @@ -0,0 +1,186 @@ +// 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. + +// This file contains boolean condition tests. + +package main + +import ( + "go/ast" + "go/token" +) + +func init() { + register("bool", + "check for mistakes involving boolean operators", + checkBool, + binaryExpr) +} + +func checkBool(f *File, n ast.Node) { + e := n.(*ast.BinaryExpr) + + var op boolOp + switch e.Op { + case token.LOR: + op = or + case token.LAND: + op = and + default: + return + } + + comm := op.commutativeSets(e) + for _, exprs := range comm { + op.checkRedundant(f, exprs) + op.checkSuspect(f, exprs) + } +} + +type boolOp struct { + name string + tok token.Token // token corresponding to this operator + badEq token.Token // token corresponding to the equality test that should not be used with this operator +} + +var ( + or = boolOp{"or", token.LOR, token.NEQ} + and = boolOp{"and", token.LAND, token.EQL} +) + +// commutativeSets returns all side effect free sets of +// expressions in e that are connected by op. +// For example, given 'a || b || f() || c || d' with the or op, +// commutativeSets returns {{b, a}, {d, c}}. +func (op boolOp) commutativeSets(e *ast.BinaryExpr) [][]ast.Expr { + exprs := op.split(e) + + // Partition the slice of expressions into commutative sets. + i := 0 + var sets [][]ast.Expr + for j := 0; j <= len(exprs); j++ { + if j == len(exprs) || hasSideEffects(exprs[j]) { + if i < j { + sets = append(sets, exprs[i:j]) + } + i = j + 1 + } + } + + return sets +} + +// checkRedundant checks for expressions of the form +// e && e +// e || e +// Exprs must contain only side effect free expressions. +func (op boolOp) checkRedundant(f *File, exprs []ast.Expr) { + seen := make(map[string]bool) + for _, e := range exprs { + efmt := f.gofmt(e) + if seen[efmt] { + f.Badf(e.Pos(), "redundant %s: %s %s %s", op.name, efmt, op.tok, efmt) + } else { + seen[efmt] = true + } + } +} + +// checkSuspect checks for expressions of the form +// x != c1 || x != c2 +// x == c1 && x == c2 +// where c1 and c2 are constant expressions. +// If c1 and c2 are the same then it's redundant; +// if c1 and c2 are different then it's always true or always false. +// Exprs must contain only side effect free expressions. +func (op boolOp) checkSuspect(f *File, exprs []ast.Expr) { + // seen maps from expressions 'x' to equality expressions 'x != c'. + seen := make(map[string]string) + + for _, e := range exprs { + bin, ok := e.(*ast.BinaryExpr) + if !ok || bin.Op != op.badEq { + continue + } + + // In order to avoid false positives, restrict to cases + // in which one of the operands is constant. We're then + // interested in the other operand. + // In the rare case in which both operands are constant + // (e.g. runtime.GOOS and "windows"), we'll only catch + // mistakes if the LHS is repeated, which is how most + // code is written. + var x ast.Expr + switch { + case f.pkg.types[bin.Y].Value != nil: + x = bin.X + case f.pkg.types[bin.X].Value != nil: + x = bin.Y + default: + continue + } + + // e is of the form 'x != c' or 'x == c'. + xfmt := f.gofmt(x) + efmt := f.gofmt(e) + if prev, found := seen[xfmt]; found { + // checkRedundant handles the case in which efmt == prev. + if efmt != prev { + f.Badf(e.Pos(), "suspect %s: %s %s %s", op.name, efmt, op.tok, prev) + } + } else { + seen[xfmt] = efmt + } + } +} + +// hasSideEffects reports whether evaluation of e has side effects. +func hasSideEffects(e ast.Expr) bool { + safe := true + ast.Inspect(e, func(node ast.Node) bool { + switch n := node.(type) { + // Using CallExpr here will catch conversions + // as well as function and method invocations. + // We'll live with the false negatives for now. + case *ast.CallExpr: + safe = false + return false + case *ast.UnaryExpr: + if n.Op == token.ARROW { + safe = false + return false + } + } + return true + }) + return !safe +} + +// split returns a slice of all subexpressions in e that are connected by op. +// For example, given 'a || (b || c) || d' with the or op, +// split returns []{d, c, b, a}. +func (op boolOp) split(e ast.Expr) (exprs []ast.Expr) { + for { + e = unparen(e) + if b, ok := e.(*ast.BinaryExpr); ok && b.Op == op.tok { + exprs = append(exprs, op.split(b.Y)...) + e = b.X + } else { + exprs = append(exprs, e) + break + } + } + return +} + +// unparen returns e with any enclosing parentheses stripped. +func unparen(e ast.Expr) ast.Expr { + for { + p, ok := e.(*ast.ParenExpr) + if !ok { + return e + } + e = p.X + } +} diff --git a/vendor/golang.org/x/tools/cmd/vet/buildtag.go b/vendor/golang.org/x/tools/cmd/vet/buildtag.go new file mode 100644 index 0000000000..2d86edf734 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/buildtag.go @@ -0,0 +1,91 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "bytes" + "fmt" + "os" + "strings" + "unicode" +) + +var ( + nl = []byte("\n") + slashSlash = []byte("//") + plusBuild = []byte("+build") +) + +// checkBuildTag checks that build tags are in the correct location and well-formed. +func checkBuildTag(name string, data []byte) { + if !vet("buildtags") { + return + } + lines := bytes.SplitAfter(data, nl) + + // Determine cutpoint where +build comments are no longer valid. + // They are valid in leading // comments in the file followed by + // a blank line. + var cutoff int + for i, line := range lines { + line = bytes.TrimSpace(line) + if len(line) == 0 { + cutoff = i + continue + } + if bytes.HasPrefix(line, slashSlash) { + continue + } + break + } + + for i, line := range lines { + line = bytes.TrimSpace(line) + if !bytes.HasPrefix(line, slashSlash) { + continue + } + text := bytes.TrimSpace(line[2:]) + if bytes.HasPrefix(text, plusBuild) { + fields := bytes.Fields(text) + if !bytes.Equal(fields[0], plusBuild) { + // Comment is something like +buildasdf not +build. + fmt.Fprintf(os.Stderr, "%s:%d: possible malformed +build comment\n", name, i+1) + continue + } + if i >= cutoff { + fmt.Fprintf(os.Stderr, "%s:%d: +build comment must appear before package clause and be followed by a blank line\n", name, i+1) + setExit(1) + continue + } + // Check arguments. + Args: + for _, arg := range fields[1:] { + for _, elem := range strings.Split(string(arg), ",") { + if strings.HasPrefix(elem, "!!") { + fmt.Fprintf(os.Stderr, "%s:%d: invalid double negative in build constraint: %s\n", name, i+1, arg) + setExit(1) + break Args + } + if strings.HasPrefix(elem, "!") { + elem = elem[1:] + } + for _, c := range elem { + if !unicode.IsLetter(c) && !unicode.IsDigit(c) && c != '_' && c != '.' { + fmt.Fprintf(os.Stderr, "%s:%d: invalid non-alphanumeric build constraint: %s\n", name, i+1, arg) + setExit(1) + break Args + } + } + } + } + continue + } + // Comment with +build but not at beginning. + if bytes.Contains(line, plusBuild) && i < cutoff { + fmt.Fprintf(os.Stderr, "%s:%d: possible malformed +build comment\n", name, i+1) + continue + } + } +} diff --git a/vendor/golang.org/x/tools/cmd/vet/composite.go b/vendor/golang.org/x/tools/cmd/vet/composite.go new file mode 100644 index 0000000000..0c3f916558 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/composite.go @@ -0,0 +1,125 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains the test for unkeyed struct literals. + +package main + +import ( + "flag" + "go/ast" + "strings" + + "golang.org/x/tools/cmd/vet/whitelist" +) + +var compositeWhiteList = flag.Bool("compositewhitelist", true, "use composite white list; for testing only") + +func init() { + register("composites", + "check that composite literals used field-keyed elements", + checkUnkeyedLiteral, + compositeLit) +} + +// checkUnkeyedLiteral checks if a composite literal is a struct literal with +// unkeyed fields. +func checkUnkeyedLiteral(f *File, node ast.Node) { + c := node.(*ast.CompositeLit) + typ := c.Type + for { + if typ1, ok := c.Type.(*ast.ParenExpr); ok { + typ = typ1 + continue + } + break + } + + switch typ.(type) { + case *ast.ArrayType: + return + case *ast.MapType: + return + case *ast.StructType: + return // a literal struct type does not need to use keys + case *ast.Ident: + // A simple type name like t or T does not need keys either, + // since it is almost certainly declared in the current package. + // (The exception is names being used via import . "pkg", but + // those are already breaking the Go 1 compatibility promise, + // so not reporting potential additional breakage seems okay.) + return + } + + // Otherwise the type is a selector like pkg.Name. + // We only care if pkg.Name is a struct, not if it's a map, array, or slice. + isStruct, typeString := f.pkg.isStruct(c) + if !isStruct { + return + } + + if typeString == "" { // isStruct doesn't know + typeString = f.gofmt(typ) + } + + // It's a struct, or we can't tell it's not a struct because we don't have types. + + // Check if the CompositeLit contains an unkeyed field. + allKeyValue := true + for _, e := range c.Elts { + if _, ok := e.(*ast.KeyValueExpr); !ok { + allKeyValue = false + break + } + } + if allKeyValue { + return + } + + // Check that the CompositeLit's type has the form pkg.Typ. + s, ok := c.Type.(*ast.SelectorExpr) + if !ok { + return + } + pkg, ok := s.X.(*ast.Ident) + if !ok { + return + } + + // Convert the package name to an import path, and compare to a whitelist. + path := pkgPath(f, pkg.Name) + if path == "" { + f.Badf(c.Pos(), "unresolvable package for %s.%s literal", pkg.Name, s.Sel.Name) + return + } + typeName := path + "." + s.Sel.Name + if *compositeWhiteList && whitelist.UnkeyedLiteral[typeName] { + return + } + + f.Bad(c.Pos(), typeString+" composite literal uses unkeyed fields") +} + +// pkgPath returns the import path "image/png" for the package name "png". +// +// This is based purely on syntax and convention, and not on the imported +// package's contents. It will be incorrect if a package name differs from the +// leaf element of the import path, or if the package was a dot import. +func pkgPath(f *File, pkgName string) (path string) { + for _, x := range f.file.Imports { + s := strings.Trim(x.Path.Value, `"`) + if x.Name != nil { + // Catch `import pkgName "foo/bar"`. + if x.Name.Name == pkgName { + return s + } + } else { + // Catch `import "pkgName"` or `import "foo/bar/pkgName"`. + if s == pkgName || strings.HasSuffix(s, "/"+pkgName) { + return s + } + } + } + return "" +} diff --git a/vendor/golang.org/x/tools/cmd/vet/copylock.go b/vendor/golang.org/x/tools/cmd/vet/copylock.go new file mode 100644 index 0000000000..e8a6820fce --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/copylock.go @@ -0,0 +1,155 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains the code to check that locks are not passed by value. + +package main + +import ( + "bytes" + "fmt" + "go/ast" + "go/token" + + "golang.org/x/tools/go/types" +) + +func init() { + register("copylocks", + "check that locks are not passed by value", + checkCopyLocks, + funcDecl, rangeStmt) +} + +// checkCopyLocks checks whether node might +// inadvertently copy a lock. +func checkCopyLocks(f *File, node ast.Node) { + switch node := node.(type) { + case *ast.RangeStmt: + checkCopyLocksRange(f, node) + case *ast.FuncDecl: + checkCopyLocksFunc(f, node) + } +} + +// checkCopyLocksFunc checks whether a function might +// inadvertently copy a lock, by checking whether +// its receiver, parameters, or return values +// are locks. +func checkCopyLocksFunc(f *File, d *ast.FuncDecl) { + if d.Recv != nil && len(d.Recv.List) > 0 { + expr := d.Recv.List[0].Type + if path := lockPath(f.pkg.typesPkg, f.pkg.types[expr].Type); path != nil { + f.Badf(expr.Pos(), "%s passes Lock by value: %v", d.Name.Name, path) + } + } + + if d.Type.Params != nil { + for _, field := range d.Type.Params.List { + expr := field.Type + if path := lockPath(f.pkg.typesPkg, f.pkg.types[expr].Type); path != nil { + f.Badf(expr.Pos(), "%s passes Lock by value: %v", d.Name.Name, path) + } + } + } + + if d.Type.Results != nil { + for _, field := range d.Type.Results.List { + expr := field.Type + if path := lockPath(f.pkg.typesPkg, f.pkg.types[expr].Type); path != nil { + f.Badf(expr.Pos(), "%s returns Lock by value: %v", d.Name.Name, path) + } + } + } +} + +// checkCopyLocksRange checks whether a range statement +// might inadvertently copy a lock by checking whether +// any of the range variables are locks. +func checkCopyLocksRange(f *File, r *ast.RangeStmt) { + checkCopyLocksRangeVar(f, r.Tok, r.Key) + checkCopyLocksRangeVar(f, r.Tok, r.Value) +} + +func checkCopyLocksRangeVar(f *File, rtok token.Token, e ast.Expr) { + if e == nil { + return + } + id, isId := e.(*ast.Ident) + if isId && id.Name == "_" { + return + } + + var typ types.Type + if rtok == token.DEFINE { + if !isId { + return + } + obj := f.pkg.defs[id] + if obj == nil { + return + } + typ = obj.Type() + } else { + typ = f.pkg.types[e].Type + } + + if typ == nil { + return + } + if path := lockPath(f.pkg.typesPkg, typ); path != nil { + f.Badf(e.Pos(), "range var %s copies Lock: %v", f.gofmt(e), path) + } +} + +type typePath []types.Type + +// String pretty-prints a typePath. +func (path typePath) String() string { + n := len(path) + var buf bytes.Buffer + for i := range path { + if i > 0 { + fmt.Fprint(&buf, " contains ") + } + // The human-readable path is in reverse order, outermost to innermost. + fmt.Fprint(&buf, path[n-i-1].String()) + } + return buf.String() +} + +// lockPath returns a typePath describing the location of a lock value +// contained in typ. If there is no contained lock, it returns nil. +func lockPath(tpkg *types.Package, typ types.Type) typePath { + if typ == nil { + return nil + } + + // We're only interested in the case in which the underlying + // type is a struct. (Interfaces and pointers are safe to copy.) + styp, ok := typ.Underlying().(*types.Struct) + if !ok { + return nil + } + + // We're looking for cases in which a reference to this type + // can be locked, but a value cannot. This differentiates + // embedded interfaces from embedded values. + if plock := types.NewMethodSet(types.NewPointer(typ)).Lookup(tpkg, "Lock"); plock != nil { + if lock := types.NewMethodSet(typ).Lookup(tpkg, "Lock"); lock == nil { + return []types.Type{typ} + } + } + + nfields := styp.NumFields() + for i := 0; i < nfields; i++ { + ftyp := styp.Field(i).Type() + subpath := lockPath(tpkg, ftyp) + if subpath != nil { + return append(subpath, typ) + } + } + + return nil +} diff --git a/vendor/golang.org/x/tools/cmd/vet/deadcode.go b/vendor/golang.org/x/tools/cmd/vet/deadcode.go new file mode 100644 index 0000000000..3b306c2104 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/deadcode.go @@ -0,0 +1,296 @@ +// Copyright 2013 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. + +// Check for syntactically unreachable code. + +package main + +import ( + "go/ast" + "go/token" +) + +func init() { + register("unreachable", + "check for unreachable code", + checkUnreachable, + funcDecl, funcLit) +} + +type deadState struct { + f *File + hasBreak map[ast.Stmt]bool + hasGoto map[string]bool + labels map[string]ast.Stmt + breakTarget ast.Stmt + + reachable bool +} + +// checkUnreachable checks a function body for dead code. +func checkUnreachable(f *File, node ast.Node) { + var body *ast.BlockStmt + switch n := node.(type) { + case *ast.FuncDecl: + body = n.Body + case *ast.FuncLit: + body = n.Body + } + if body == nil { + return + } + + d := &deadState{ + f: f, + hasBreak: make(map[ast.Stmt]bool), + hasGoto: make(map[string]bool), + labels: make(map[string]ast.Stmt), + } + + d.findLabels(body) + + d.reachable = true + d.findDead(body) +} + +// findLabels gathers information about the labels defined and used by stmt +// and about which statements break, whether a label is involved or not. +func (d *deadState) findLabels(stmt ast.Stmt) { + switch x := stmt.(type) { + default: + d.f.Warnf(x.Pos(), "internal error in findLabels: unexpected statement %T", x) + + case *ast.AssignStmt, + *ast.BadStmt, + *ast.DeclStmt, + *ast.DeferStmt, + *ast.EmptyStmt, + *ast.ExprStmt, + *ast.GoStmt, + *ast.IncDecStmt, + *ast.ReturnStmt, + *ast.SendStmt: + // no statements inside + + case *ast.BlockStmt: + for _, stmt := range x.List { + d.findLabels(stmt) + } + + case *ast.BranchStmt: + switch x.Tok { + case token.GOTO: + if x.Label != nil { + d.hasGoto[x.Label.Name] = true + } + + case token.BREAK: + stmt := d.breakTarget + if x.Label != nil { + stmt = d.labels[x.Label.Name] + } + if stmt != nil { + d.hasBreak[stmt] = true + } + } + + case *ast.IfStmt: + d.findLabels(x.Body) + if x.Else != nil { + d.findLabels(x.Else) + } + + case *ast.LabeledStmt: + d.labels[x.Label.Name] = x.Stmt + d.findLabels(x.Stmt) + + // These cases are all the same, but the x.Body only works + // when the specific type of x is known, so the cases cannot + // be merged. + case *ast.ForStmt: + outer := d.breakTarget + d.breakTarget = x + d.findLabels(x.Body) + d.breakTarget = outer + + case *ast.RangeStmt: + outer := d.breakTarget + d.breakTarget = x + d.findLabels(x.Body) + d.breakTarget = outer + + case *ast.SelectStmt: + outer := d.breakTarget + d.breakTarget = x + d.findLabels(x.Body) + d.breakTarget = outer + + case *ast.SwitchStmt: + outer := d.breakTarget + d.breakTarget = x + d.findLabels(x.Body) + d.breakTarget = outer + + case *ast.TypeSwitchStmt: + outer := d.breakTarget + d.breakTarget = x + d.findLabels(x.Body) + d.breakTarget = outer + + case *ast.CommClause: + for _, stmt := range x.Body { + d.findLabels(stmt) + } + + case *ast.CaseClause: + for _, stmt := range x.Body { + d.findLabels(stmt) + } + } +} + +// findDead walks the statement looking for dead code. +// If d.reachable is false on entry, stmt itself is dead. +// When findDead returns, d.reachable tells whether the +// statement following stmt is reachable. +func (d *deadState) findDead(stmt ast.Stmt) { + // Is this a labeled goto target? + // If so, assume it is reachable due to the goto. + // This is slightly conservative, in that we don't + // check that the goto is reachable, so + // L: goto L + // will not provoke a warning. + // But it's good enough. + if x, isLabel := stmt.(*ast.LabeledStmt); isLabel && d.hasGoto[x.Label.Name] { + d.reachable = true + } + + if !d.reachable { + switch stmt.(type) { + case *ast.EmptyStmt: + // do not warn about unreachable empty statements + default: + d.f.Bad(stmt.Pos(), "unreachable code") + d.reachable = true // silence error about next statement + } + } + + switch x := stmt.(type) { + default: + d.f.Warnf(x.Pos(), "internal error in findDead: unexpected statement %T", x) + + case *ast.AssignStmt, + *ast.BadStmt, + *ast.DeclStmt, + *ast.DeferStmt, + *ast.EmptyStmt, + *ast.GoStmt, + *ast.IncDecStmt, + *ast.SendStmt: + // no control flow + + case *ast.BlockStmt: + for _, stmt := range x.List { + d.findDead(stmt) + } + + case *ast.BranchStmt: + switch x.Tok { + case token.BREAK, token.GOTO, token.FALLTHROUGH: + d.reachable = false + case token.CONTINUE: + // NOTE: We accept "continue" statements as terminating. + // They are not necessary in the spec definition of terminating, + // because a continue statement cannot be the final statement + // before a return. But for the more general problem of syntactically + // identifying dead code, continue redirects control flow just + // like the other terminating statements. + d.reachable = false + } + + case *ast.ExprStmt: + // Call to panic? + call, ok := x.X.(*ast.CallExpr) + if ok { + name, ok := call.Fun.(*ast.Ident) + if ok && name.Name == "panic" && name.Obj == nil { + d.reachable = false + } + } + + case *ast.ForStmt: + d.findDead(x.Body) + d.reachable = x.Cond != nil || d.hasBreak[x] + + case *ast.IfStmt: + d.findDead(x.Body) + if x.Else != nil { + r := d.reachable + d.reachable = true + d.findDead(x.Else) + d.reachable = d.reachable || r + } else { + // might not have executed if statement + d.reachable = true + } + + case *ast.LabeledStmt: + d.findDead(x.Stmt) + + case *ast.RangeStmt: + d.findDead(x.Body) + d.reachable = true + + case *ast.ReturnStmt: + d.reachable = false + + case *ast.SelectStmt: + // NOTE: Unlike switch and type switch below, we don't care + // whether a select has a default, because a select without a + // default blocks until one of the cases can run. That's different + // from a switch without a default, which behaves like it has + // a default with an empty body. + anyReachable := false + for _, comm := range x.Body.List { + d.reachable = true + for _, stmt := range comm.(*ast.CommClause).Body { + d.findDead(stmt) + } + anyReachable = anyReachable || d.reachable + } + d.reachable = anyReachable || d.hasBreak[x] + + case *ast.SwitchStmt: + anyReachable := false + hasDefault := false + for _, cas := range x.Body.List { + cc := cas.(*ast.CaseClause) + if cc.List == nil { + hasDefault = true + } + d.reachable = true + for _, stmt := range cc.Body { + d.findDead(stmt) + } + anyReachable = anyReachable || d.reachable + } + d.reachable = anyReachable || d.hasBreak[x] || !hasDefault + + case *ast.TypeSwitchStmt: + anyReachable := false + hasDefault := false + for _, cas := range x.Body.List { + cc := cas.(*ast.CaseClause) + if cc.List == nil { + hasDefault = true + } + d.reachable = true + for _, stmt := range cc.Body { + d.findDead(stmt) + } + anyReachable = anyReachable || d.reachable + } + d.reachable = anyReachable || d.hasBreak[x] || !hasDefault + } +} diff --git a/vendor/golang.org/x/tools/cmd/vet/doc.go b/vendor/golang.org/x/tools/cmd/vet/doc.go new file mode 100644 index 0000000000..012f88b38c --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/doc.go @@ -0,0 +1,197 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* + +Vet examines Go source code and reports suspicious constructs, such as Printf +calls whose arguments do not align with the format string. Vet uses heuristics +that do not guarantee all reports are genuine problems, but it can find errors +not caught by the compilers. + +It can be invoked three ways: + +By package, from the go tool: + go vet package/path/name +vets the package whose path is provided. + +By files: + go tool vet source/directory/*.go +vets the files named, all of which must be in the same package. + +By directory: + go tool vet source/directory +recursively descends the directory, vetting each package it finds. + +Vet's exit code is 2 for erroneous invocation of the tool, 1 if a +problem was reported, and 0 otherwise. Note that the tool does not +check every possible problem and depends on unreliable heuristics +so it should be used as guidance only, not as a firm indicator of +program correctness. + +By default all checks are performed. If any flags are explicitly set +to true, only those tests are run. Conversely, if any flag is +explicitly set to false, only those tests are disabled. +Thus -printf=true runs the printf check, -printf=false runs all checks +except the printf check. + +Available checks: + +Assembly declarations + +Flag: -asmdecl + +Mismatches between assembly files and Go function declarations. + +Useless assignments + +Flag: -assign + +Check for useless assignments. + +Atomic mistakes + +Flag: -atomic + +Common mistaken usages of the sync/atomic package. + +Boolean conditions + +Flag: -bool + +Mistakes involving boolean operators. + +Build tags + +Flag: -buildtags + +Badly formed or misplaced +build tags. + +Unkeyed composite literals + +Flag: -composites + +Composite struct literals that do not use the field-keyed syntax. + +Copying locks + +Flag: -copylocks + +Locks that are erroneously passed by value. + +Documentation examples + +Flag: -example + +Mistakes involving example tests, including examples with incorrect names or +function signatures, or that document identifiers not in the package. + +Methods + +Flag: -methods + +Non-standard signatures for methods with familiar names, including: + Format GobEncode GobDecode MarshalJSON MarshalXML + Peek ReadByte ReadFrom ReadRune Scan Seek + UnmarshalJSON UnreadByte UnreadRune WriteByte + WriteTo + +Nil function comparison + +Flag: -nilfunc + +Comparisons between functions and nil. + +Printf family + +Flag: -printf + +Suspicious calls to functions in the Printf family, including any functions +with these names, disregarding case: + Print Printf Println + Fprint Fprintf Fprintln + Sprint Sprintf Sprintln + Error Errorf + Fatal Fatalf + Log Logf + Panic Panicf Panicln +If the function name ends with an 'f', the function is assumed to take +a format descriptor string in the manner of fmt.Printf. If not, vet +complains about arguments that look like format descriptor strings. + +It also checks for errors such as using a Writer as the first argument of +Printf. + +Range loop variables + +Flag: -rangeloops + +Incorrect uses of range loop variables in closures. + +Shadowed variables + +Flag: -shadow=false (experimental; must be set explicitly) + +Variables that may have been unintentionally shadowed. + +Shifts + +Flag: -shift + +Shifts equal to or longer than the variable's length. + +Struct tags + +Flag: -structtags + +Struct tags that do not follow the format understood by reflect.StructTag.Get. +Well-known encoding struct tags (json, xml) used with unexported fields. + +Unreachable code + +Flag: -unreachable + +Unreachable code. + +Misuse of unsafe Pointers + +Flag: -unsafeptr + +Likely incorrect uses of unsafe.Pointer to convert integers to pointers. +A conversion from uintptr to unsafe.Pointer is invalid if it implies that +there is a uintptr-typed word in memory that holds a pointer value, +because that word will be invisible to stack copying and to the garbage +collector. + +Unused result of certain function calls + +Flag: -unusedresult + +Calls to well-known functions and methods that return a value that is +discarded. By default, this includes functions like fmt.Errorf and +fmt.Sprintf and methods like String and Error. The flags -unusedfuncs +and -unusedstringmethods control the set. + +Other flags + +These flags configure the behavior of vet: + + -all (default true) + Check everything; disabled if any explicit check is requested. + -v + Verbose mode + -printfuncs + A comma-separated list of print-like functions to supplement + the standard list. Each entry is in the form Name:N where N + is the zero-based argument position of the first argument + involved in the print: either the format or the first print + argument for non-formatted prints. For example, + if you have Warn and Warnf functions that take an + io.Writer as their first argument, like Fprintf, + -printfuncs=Warn:1,Warnf:1 + -shadowstrict + Whether to be strict about shadowing; can be noisy. + -test + For testing only: sets -all and -shadow. +*/ +package main // import "golang.org/x/tools/cmd/vet" diff --git a/vendor/golang.org/x/tools/cmd/vet/example.go b/vendor/golang.org/x/tools/cmd/vet/example.go new file mode 100644 index 0000000000..585d38844d --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/example.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 main + +import ( + "go/ast" + "strings" + "unicode" + "unicode/utf8" + + "golang.org/x/tools/go/types" +) + +func init() { + register("example", + "check for common mistaken usages of documentation examples", + checkExample, + funcDecl) +} + +func isExampleSuffix(s string) bool { + r, size := utf8.DecodeRuneInString(s) + return size > 0 && unicode.IsLower(r) +} + +// checkExample walks the documentation example functions checking for common +// mistakes of misnamed functions, failure to map functions to existing +// identifiers, etc. +func checkExample(f *File, node ast.Node) { + if !strings.HasSuffix(f.name, "_test.go") { + return + } + var ( + pkg = f.pkg + pkgName = pkg.typesPkg.Name() + scopes = []*types.Scope{pkg.typesPkg.Scope()} + lookup = func(name string) types.Object { + for _, scope := range scopes { + if o := scope.Lookup(name); o != nil { + return o + } + } + return nil + } + ) + if strings.HasSuffix(pkgName, "_test") { + // Treat 'package foo_test' as an alias for 'package foo'. + var ( + basePkg = strings.TrimSuffix(pkgName, "_test") + pkg = f.pkg + ) + for _, p := range pkg.typesPkg.Imports() { + if p.Name() == basePkg { + scopes = append(scopes, p.Scope()) + break + } + } + } + fn, ok := node.(*ast.FuncDecl) + if !ok { + // Ignore non-functions. + return + } + var ( + fnName = fn.Name.Name + report = func(format string, args ...interface{}) { f.Badf(node.Pos(), format, args...) } + ) + if fn.Recv != nil || !strings.HasPrefix(fnName, "Example") { + // Ignore methods and types not named "Example". + return + } + if params := fn.Type.Params; len(params.List) != 0 { + report("%s should be niladic", fnName) + } + if results := fn.Type.Results; results != nil && len(results.List) != 0 { + report("%s should return nothing", fnName) + } + if fnName == "Example" { + // Nothing more to do. + return + } + if filesRun && !includesNonTest { + // The coherence checks between a test and the package it tests + // will report false positives if no non-test files have + // been provided. + return + } + var ( + exName = strings.TrimPrefix(fnName, "Example") + elems = strings.SplitN(exName, "_", 3) + ident = elems[0] + obj = lookup(ident) + ) + if ident != "" && obj == nil { + // Check ExampleFoo and ExampleBadFoo. + report("%s refers to unknown identifier: %s", fnName, ident) + // Abort since obj is absent and no subsequent checks can be performed. + return + } + if elemCnt := strings.Count(exName, "_"); elemCnt == 0 { + // Nothing more to do. + return + } + mmbr := elems[1] + if ident == "" { + // Check Example_suffix and Example_BadSuffix. + if residual := strings.TrimPrefix(exName, "_"); !isExampleSuffix(residual) { + report("%s has malformed example suffix: %s", fnName, residual) + } + return + } + if !isExampleSuffix(mmbr) { + // Check ExampleFoo_Method and ExampleFoo_BadMethod. + if obj, _, _ := types.LookupFieldOrMethod(obj.Type(), true, obj.Pkg(), mmbr); obj == nil { + report("%s refers to unknown field or method: %s.%s", fnName, ident, mmbr) + } + } + if len(elems) == 3 && !isExampleSuffix(elems[2]) { + // Check ExampleFoo_Method_suffix and ExampleFoo_Method_Badsuffix. + report("%s has malformed example suffix: %s", fnName, elems[2]) + } + return +} diff --git a/vendor/golang.org/x/tools/cmd/vet/main.go b/vendor/golang.org/x/tools/cmd/vet/main.go new file mode 100644 index 0000000000..c86e13c472 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/main.go @@ -0,0 +1,500 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// NOTE: This version of vet is retired. Bug fixes only. +// Vet now lives in the core repository. + +// Vet is a simple checker for static errors in Go source code. +// See doc.go for more information. +package main + +import ( + "bytes" + "flag" + "fmt" + "go/ast" + "go/build" + "go/parser" + "go/printer" + "go/token" + "io/ioutil" + "os" + "path/filepath" + "strconv" + "strings" + + _ "golang.org/x/tools/go/gcimporter" + "golang.org/x/tools/go/types" +) + +var ( + verbose = flag.Bool("v", false, "verbose") + testFlag = flag.Bool("test", false, "for testing only: sets -all and -shadow") + tags = flag.String("tags", "", "comma-separated list of build tags to apply when parsing") + tagList = []string{} // exploded version of tags flag; set in main +) + +var exitCode = 0 + +// "all" is here only for the appearance of backwards compatibility. +// It has no effect; the triState flags do the work. +var all = flag.Bool("all", true, "check everything; disabled if any explicit check is requested") + +// Flags to control which individual checks to perform. +var report = map[string]*triState{ + // Only unusual checks are written here. + // Most checks that operate during the AST walk are added by register. + "asmdecl": triStateFlag("asmdecl", unset, "check assembly against Go declarations"), + "buildtags": triStateFlag("buildtags", unset, "check that +build tags are valid"), +} + +// experimental records the flags enabling experimental features. These must be +// requested explicitly; they are not enabled by -all. +var experimental = map[string]bool{} + +// setTrueCount record how many flags are explicitly set to true. +var setTrueCount int + +// dirsRun and filesRun indicate whether the vet is applied to directory or +// file targets. The distinction affects which checks are run. +var dirsRun, filesRun bool + +// includesNonTest indicates whether the vet is applied to non-test targets. +// Certain checks are relevant only if they touch both test and non-test files. +var includesNonTest bool + +// A triState is a boolean that knows whether it has been set to either true or false. +// It is used to identify if a flag appears; the standard boolean flag cannot +// distinguish missing from unset. It also satisfies flag.Value. +type triState int + +const ( + unset triState = iota + setTrue + setFalse +) + +func triStateFlag(name string, value triState, usage string) *triState { + flag.Var(&value, name, usage) + return &value +} + +// triState implements flag.Value, flag.Getter, and flag.boolFlag. +// They work like boolean flags: we can say vet -printf as well as vet -printf=true +func (ts *triState) Get() interface{} { + return *ts == setTrue +} + +func (ts triState) isTrue() bool { + return ts == setTrue +} + +func (ts *triState) Set(value string) error { + b, err := strconv.ParseBool(value) + if err != nil { + return err + } + if b { + *ts = setTrue + setTrueCount++ + } else { + *ts = setFalse + } + return nil +} + +func (ts *triState) String() string { + switch *ts { + case unset: + return "unset" + case setTrue: + return "true" + case setFalse: + return "false" + } + panic("not reached") +} + +func (ts triState) IsBoolFlag() bool { + return true +} + +// vet tells whether to report errors for the named check, a flag name. +func vet(name string) bool { + if *testFlag { + return true + } + return report[name].isTrue() +} + +// setExit sets the value for os.Exit when it is called, later. It +// remembers the highest value. +func setExit(err int) { + if err > exitCode { + exitCode = err + } +} + +var ( + // Each of these vars has a corresponding case in (*File).Visit. + assignStmt *ast.AssignStmt + binaryExpr *ast.BinaryExpr + callExpr *ast.CallExpr + compositeLit *ast.CompositeLit + exprStmt *ast.ExprStmt + field *ast.Field + funcDecl *ast.FuncDecl + funcLit *ast.FuncLit + genDecl *ast.GenDecl + interfaceType *ast.InterfaceType + rangeStmt *ast.RangeStmt + + // checkers is a two-level map. + // The outer level is keyed by a nil pointer, one of the AST vars above. + // The inner level is keyed by checker name. + checkers = make(map[ast.Node]map[string]func(*File, ast.Node)) +) + +func register(name, usage string, fn func(*File, ast.Node), types ...ast.Node) { + report[name] = triStateFlag(name, unset, usage) + for _, typ := range types { + m := checkers[typ] + if m == nil { + m = make(map[string]func(*File, ast.Node)) + checkers[typ] = m + } + m[name] = fn + } +} + +// Usage is a replacement usage function for the flags package. +func Usage() { + fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0]) + fmt.Fprintf(os.Stderr, "\tvet [flags] directory...\n") + fmt.Fprintf(os.Stderr, "\tvet [flags] files... # Must be a single package\n") + fmt.Fprintf(os.Stderr, "For more information run\n") + fmt.Fprintf(os.Stderr, "\tgodoc golang.org/x/tools/cmd/vet\n\n") + fmt.Fprintf(os.Stderr, "Flags:\n") + flag.PrintDefaults() + os.Exit(2) +} + +// File is a wrapper for the state of a file used in the parser. +// The parse tree walkers are all methods of this type. +type File struct { + pkg *Package + fset *token.FileSet + name string + content []byte + file *ast.File + b bytes.Buffer // for use by methods + + // The objects that are receivers of a "String() string" method. + // This is used by the recursiveStringer method in print.go. + stringers map[*ast.Object]bool + + // Registered checkers to run. + checkers map[ast.Node][]func(*File, ast.Node) +} + +func main() { + flag.Usage = Usage + flag.Parse() + + // If any flag is set, we run only those checks requested. + // If no flags are set true, set all the non-experimental ones not explicitly set (in effect, set the "-all" flag). + if setTrueCount == 0 { + for name, setting := range report { + if *setting == unset && !experimental[name] { + *setting = setTrue + } + } + } + + tagList = strings.Split(*tags, ",") + + initPrintFlags() + initUnusedFlags() + + if flag.NArg() == 0 { + Usage() + } + for _, name := range flag.Args() { + // Is it a directory? + fi, err := os.Stat(name) + if err != nil { + warnf("error walking tree: %s", err) + continue + } + if fi.IsDir() { + dirsRun = true + } else { + filesRun = true + if !strings.HasSuffix(name, "_test.go") { + includesNonTest = true + } + } + } + if dirsRun && filesRun { + Usage() + } + if dirsRun { + for _, name := range flag.Args() { + walkDir(name) + } + os.Exit(exitCode) + } + if !doPackage(".", flag.Args()) { + warnf("no files checked") + } + os.Exit(exitCode) +} + +// prefixDirectory places the directory name on the beginning of each name in the list. +func prefixDirectory(directory string, names []string) { + if directory != "." { + for i, name := range names { + names[i] = filepath.Join(directory, name) + } + } +} + +// doPackageDir analyzes the single package found in the directory, if there is one, +// plus a test package, if there is one. +func doPackageDir(directory string) { + context := build.Default + if len(context.BuildTags) != 0 { + warnf("build tags %s previously set", context.BuildTags) + } + context.BuildTags = append(tagList, context.BuildTags...) + + pkg, err := context.ImportDir(directory, 0) + if err != nil { + // If it's just that there are no go source files, that's fine. + if _, nogo := err.(*build.NoGoError); nogo { + return + } + // Non-fatal: we are doing a recursive walk and there may be other directories. + warnf("cannot process directory %s: %s", directory, err) + return + } + var names []string + names = append(names, pkg.GoFiles...) + names = append(names, pkg.CgoFiles...) + names = append(names, pkg.TestGoFiles...) // These are also in the "foo" package. + names = append(names, pkg.SFiles...) + prefixDirectory(directory, names) + doPackage(directory, names) + // Is there also a "foo_test" package? If so, do that one as well. + if len(pkg.XTestGoFiles) > 0 { + names = pkg.XTestGoFiles + prefixDirectory(directory, names) + doPackage(directory, names) + } +} + +type Package struct { + path string + defs map[*ast.Ident]types.Object + uses map[*ast.Ident]types.Object + selectors map[*ast.SelectorExpr]*types.Selection + types map[ast.Expr]types.TypeAndValue + spans map[types.Object]Span + files []*File + typesPkg *types.Package +} + +// doPackage analyzes the single package constructed from the named files. +// It returns whether any files were checked. +func doPackage(directory string, names []string) bool { + var files []*File + var astFiles []*ast.File + fs := token.NewFileSet() + for _, name := range names { + data, err := ioutil.ReadFile(name) + if err != nil { + // Warn but continue to next package. + warnf("%s: %s", name, err) + return false + } + checkBuildTag(name, data) + var parsedFile *ast.File + if strings.HasSuffix(name, ".go") { + parsedFile, err = parser.ParseFile(fs, name, data, 0) + if err != nil { + warnf("%s: %s", name, err) + return false + } + astFiles = append(astFiles, parsedFile) + } + files = append(files, &File{fset: fs, content: data, name: name, file: parsedFile}) + } + if len(astFiles) == 0 { + return false + } + pkg := new(Package) + pkg.path = astFiles[0].Name.Name + pkg.files = files + // Type check the package. + err := pkg.check(fs, astFiles) + if err != nil && *verbose { + warnf("%s", err) + } + + // Check. + chk := make(map[ast.Node][]func(*File, ast.Node)) + for typ, set := range checkers { + for name, fn := range set { + if vet(name) { + chk[typ] = append(chk[typ], fn) + } + } + } + for _, file := range files { + file.pkg = pkg + file.checkers = chk + if file.file != nil { + file.walkFile(file.name, file.file) + } + } + asmCheck(pkg) + return true +} + +func visit(path string, f os.FileInfo, err error) error { + if err != nil { + warnf("walk error: %s", err) + return err + } + // One package per directory. Ignore the files themselves. + if !f.IsDir() { + return nil + } + doPackageDir(path) + return nil +} + +func (pkg *Package) hasFileWithSuffix(suffix string) bool { + for _, f := range pkg.files { + if strings.HasSuffix(f.name, suffix) { + return true + } + } + return false +} + +// walkDir recursively walks the tree looking for Go packages. +func walkDir(root string) { + filepath.Walk(root, visit) +} + +// errorf formats the error to standard error, adding program +// identification and a newline, and exits. +func errorf(format string, args ...interface{}) { + fmt.Fprintf(os.Stderr, "vet: "+format+"\n", args...) + os.Exit(2) +} + +// warnf formats the error to standard error, adding program +// identification and a newline, but does not exit. +func warnf(format string, args ...interface{}) { + fmt.Fprintf(os.Stderr, "vet: "+format+"\n", args...) + setExit(1) +} + +// Println is fmt.Println guarded by -v. +func Println(args ...interface{}) { + if !*verbose { + return + } + fmt.Println(args...) +} + +// Printf is fmt.Printf guarded by -v. +func Printf(format string, args ...interface{}) { + if !*verbose { + return + } + fmt.Printf(format+"\n", args...) +} + +// Bad reports an error and sets the exit code.. +func (f *File) Bad(pos token.Pos, args ...interface{}) { + f.Warn(pos, args...) + setExit(1) +} + +// Badf reports a formatted error and sets the exit code. +func (f *File) Badf(pos token.Pos, format string, args ...interface{}) { + f.Warnf(pos, format, args...) + setExit(1) +} + +// loc returns a formatted representation of the position. +func (f *File) loc(pos token.Pos) string { + if pos == token.NoPos { + return "" + } + // Do not print columns. Because the pos often points to the start of an + // expression instead of the inner part with the actual error, the + // precision can mislead. + posn := f.fset.Position(pos) + return fmt.Sprintf("%s:%d: ", posn.Filename, posn.Line) +} + +// Warn reports an error but does not set the exit code. +func (f *File) Warn(pos token.Pos, args ...interface{}) { + fmt.Fprint(os.Stderr, f.loc(pos)+fmt.Sprintln(args...)) +} + +// Warnf reports a formatted error but does not set the exit code. +func (f *File) Warnf(pos token.Pos, format string, args ...interface{}) { + fmt.Fprintf(os.Stderr, f.loc(pos)+format+"\n", args...) +} + +// walkFile walks the file's tree. +func (f *File) walkFile(name string, file *ast.File) { + Println("Checking file", name) + ast.Walk(f, file) +} + +// Visit implements the ast.Visitor interface. +func (f *File) Visit(node ast.Node) ast.Visitor { + var key ast.Node + switch node.(type) { + case *ast.AssignStmt: + key = assignStmt + case *ast.BinaryExpr: + key = binaryExpr + case *ast.CallExpr: + key = callExpr + case *ast.CompositeLit: + key = compositeLit + case *ast.ExprStmt: + key = exprStmt + case *ast.Field: + key = field + case *ast.FuncDecl: + key = funcDecl + case *ast.FuncLit: + key = funcLit + case *ast.GenDecl: + key = genDecl + case *ast.InterfaceType: + key = interfaceType + case *ast.RangeStmt: + key = rangeStmt + } + for _, fn := range f.checkers[key] { + fn(f, node) + } + return f +} + +// gofmt returns a string representation of the expression. +func (f *File) gofmt(x ast.Expr) string { + f.b.Reset() + printer.Fprint(&f.b, f.fset, x) + return f.b.String() +} diff --git a/vendor/golang.org/x/tools/cmd/vet/method.go b/vendor/golang.org/x/tools/cmd/vet/method.go new file mode 100644 index 0000000000..00949df437 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/method.go @@ -0,0 +1,182 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains the code to check canonical methods. + +package main + +import ( + "fmt" + "go/ast" + "go/printer" + "strings" +) + +func init() { + register("methods", + "check that canonically named methods are canonically defined", + checkCanonicalMethod, + funcDecl, interfaceType) +} + +type MethodSig struct { + args []string + results []string +} + +// canonicalMethods lists the input and output types for Go methods +// that are checked using dynamic interface checks. Because the +// checks are dynamic, such methods would not cause a compile error +// if they have the wrong signature: instead the dynamic check would +// fail, sometimes mysteriously. If a method is found with a name listed +// here but not the input/output types listed here, vet complains. +// +// A few of the canonical methods have very common names. +// For example, a type might implement a Scan method that +// has nothing to do with fmt.Scanner, but we still want to check +// the methods that are intended to implement fmt.Scanner. +// To do that, the arguments that have a = prefix are treated as +// signals that the canonical meaning is intended: if a Scan +// method doesn't have a fmt.ScanState as its first argument, +// we let it go. But if it does have a fmt.ScanState, then the +// rest has to match. +var canonicalMethods = map[string]MethodSig{ + // "Flush": {{}, {"error"}}, // http.Flusher and jpeg.writer conflict + "Format": {[]string{"=fmt.State", "rune"}, []string{}}, // fmt.Formatter + "GobDecode": {[]string{"[]byte"}, []string{"error"}}, // gob.GobDecoder + "GobEncode": {[]string{}, []string{"[]byte", "error"}}, // gob.GobEncoder + "MarshalJSON": {[]string{}, []string{"[]byte", "error"}}, // json.Marshaler + "MarshalXML": {[]string{"*xml.Encoder", "xml.StartElement"}, []string{"error"}}, // xml.Marshaler + "Peek": {[]string{"=int"}, []string{"[]byte", "error"}}, // image.reader (matching bufio.Reader) + "ReadByte": {[]string{}, []string{"byte", "error"}}, // io.ByteReader + "ReadFrom": {[]string{"=io.Reader"}, []string{"int64", "error"}}, // io.ReaderFrom + "ReadRune": {[]string{}, []string{"rune", "int", "error"}}, // io.RuneReader + "Scan": {[]string{"=fmt.ScanState", "rune"}, []string{"error"}}, // fmt.Scanner + "Seek": {[]string{"=int64", "int"}, []string{"int64", "error"}}, // io.Seeker + "UnmarshalJSON": {[]string{"[]byte"}, []string{"error"}}, // json.Unmarshaler + "UnmarshalXML": {[]string{"*xml.Decoder", "xml.StartElement"}, []string{"error"}}, // xml.Unmarshaler + "UnreadByte": {[]string{}, []string{"error"}}, + "UnreadRune": {[]string{}, []string{"error"}}, + "WriteByte": {[]string{"byte"}, []string{"error"}}, // jpeg.writer (matching bufio.Writer) + "WriteTo": {[]string{"=io.Writer"}, []string{"int64", "error"}}, // io.WriterTo +} + +func checkCanonicalMethod(f *File, node ast.Node) { + switch n := node.(type) { + case *ast.FuncDecl: + if n.Recv != nil { + canonicalMethod(f, n.Name, n.Type) + } + case *ast.InterfaceType: + for _, field := range n.Methods.List { + for _, id := range field.Names { + canonicalMethod(f, id, field.Type.(*ast.FuncType)) + } + } + } +} + +func canonicalMethod(f *File, id *ast.Ident, t *ast.FuncType) { + // Expected input/output. + expect, ok := canonicalMethods[id.Name] + if !ok { + return + } + + // Actual input/output + args := typeFlatten(t.Params.List) + var results []ast.Expr + if t.Results != nil { + results = typeFlatten(t.Results.List) + } + + // Do the =s (if any) all match? + if !f.matchParams(expect.args, args, "=") || !f.matchParams(expect.results, results, "=") { + return + } + + // Everything must match. + if !f.matchParams(expect.args, args, "") || !f.matchParams(expect.results, results, "") { + expectFmt := id.Name + "(" + argjoin(expect.args) + ")" + if len(expect.results) == 1 { + expectFmt += " " + argjoin(expect.results) + } else if len(expect.results) > 1 { + expectFmt += " (" + argjoin(expect.results) + ")" + } + + f.b.Reset() + if err := printer.Fprint(&f.b, f.fset, t); err != nil { + fmt.Fprintf(&f.b, "<%s>", err) + } + actual := f.b.String() + actual = strings.TrimPrefix(actual, "func") + actual = id.Name + actual + + f.Badf(id.Pos(), "method %s should have signature %s", actual, expectFmt) + } +} + +func argjoin(x []string) string { + y := make([]string, len(x)) + for i, s := range x { + if s[0] == '=' { + s = s[1:] + } + y[i] = s + } + return strings.Join(y, ", ") +} + +// Turn parameter list into slice of types +// (in the ast, types are Exprs). +// Have to handle f(int, bool) and f(x, y, z int) +// so not a simple 1-to-1 conversion. +func typeFlatten(l []*ast.Field) []ast.Expr { + var t []ast.Expr + for _, f := range l { + if len(f.Names) == 0 { + t = append(t, f.Type) + continue + } + for _ = range f.Names { + t = append(t, f.Type) + } + } + return t +} + +// Does each type in expect with the given prefix match the corresponding type in actual? +func (f *File) matchParams(expect []string, actual []ast.Expr, prefix string) bool { + for i, x := range expect { + if !strings.HasPrefix(x, prefix) { + continue + } + if i >= len(actual) { + return false + } + if !f.matchParamType(x, actual[i]) { + return false + } + } + if prefix == "" && len(actual) > len(expect) { + return false + } + return true +} + +// Does this one type match? +func (f *File) matchParamType(expect string, actual ast.Expr) bool { + if strings.HasPrefix(expect, "=") { + expect = expect[1:] + } + // Strip package name if we're in that package. + if n := len(f.file.Name.Name); len(expect) > n && expect[:n] == f.file.Name.Name && expect[n] == '.' { + expect = expect[n+1:] + } + + // Overkill but easy. + f.b.Reset() + printer.Fprint(&f.b, f.fset, actual) + return f.b.String() == expect +} diff --git a/vendor/golang.org/x/tools/cmd/vet/nilfunc.go b/vendor/golang.org/x/tools/cmd/vet/nilfunc.go new file mode 100644 index 0000000000..fa1bac7e64 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/nilfunc.go @@ -0,0 +1,68 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +This file contains the code to check for useless function comparisons. +A useless comparison is one like f == nil as opposed to f() == nil. +*/ + +package main + +import ( + "go/ast" + "go/token" + + "golang.org/x/tools/go/types" +) + +func init() { + register("nilfunc", + "check for comparisons between functions and nil", + checkNilFuncComparison, + binaryExpr) +} + +func checkNilFuncComparison(f *File, node ast.Node) { + e := node.(*ast.BinaryExpr) + + // Only want == or != comparisons. + if e.Op != token.EQL && e.Op != token.NEQ { + return + } + + // Only want comparisons with a nil identifier on one side. + var e2 ast.Expr + switch { + case f.isNil(e.X): + e2 = e.Y + case f.isNil(e.Y): + e2 = e.X + default: + return + } + + // Only want identifiers or selector expressions. + var obj types.Object + switch v := e2.(type) { + case *ast.Ident: + obj = f.pkg.uses[v] + case *ast.SelectorExpr: + obj = f.pkg.uses[v.Sel] + default: + return + } + + // Only want functions. + if _, ok := obj.(*types.Func); !ok { + return + } + + f.Badf(e.Pos(), "comparison of function %v %v nil is always %v", obj.Name(), e.Op, e.Op == token.NEQ) +} + +// isNil reports whether the provided expression is the built-in nil +// identifier. +func (f *File) isNil(e ast.Expr) bool { + return f.pkg.types[e].Type == types.Typ[types.UntypedNil] +} diff --git a/vendor/golang.org/x/tools/cmd/vet/print.go b/vendor/golang.org/x/tools/cmd/vet/print.go new file mode 100644 index 0000000000..b20d935ef4 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/print.go @@ -0,0 +1,587 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains the printf-checker. + +package main + +import ( + "bytes" + "flag" + "go/ast" + "go/token" + "strconv" + "strings" + "unicode/utf8" + + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/types" +) + +var printfuncs = flag.String("printfuncs", "", "comma-separated list of print function names to check") + +func init() { + register("printf", + "check printf-like invocations", + checkFmtPrintfCall, + funcDecl, callExpr) +} + +func initPrintFlags() { + if *printfuncs == "" { + return + } + for _, name := range strings.Split(*printfuncs, ",") { + if len(name) == 0 { + flag.Usage() + } + skip := 0 + if colon := strings.LastIndex(name, ":"); colon > 0 { + var err error + skip, err = strconv.Atoi(name[colon+1:]) + if err != nil { + errorf(`illegal format for "Func:N" argument %q; %s`, name, err) + } + name = name[:colon] + } + name = strings.ToLower(name) + if name[len(name)-1] == 'f' { + printfList[name] = skip + } else { + printList[name] = skip + } + } +} + +// printfList records the formatted-print functions. The value is the location +// of the format parameter. Names are lower-cased so the lookup is +// case insensitive. +var printfList = map[string]int{ + "errorf": 0, + "fatalf": 0, + "fprintf": 1, + "logf": 0, + "panicf": 0, + "printf": 0, + "sprintf": 0, +} + +// printList records the unformatted-print functions. The value is the location +// of the first parameter to be printed. Names are lower-cased so the lookup is +// case insensitive. +var printList = map[string]int{ + "error": 0, + "fatal": 0, + "fprint": 1, "fprintln": 1, + "log": 0, + "panic": 0, "panicln": 0, + "print": 0, "println": 0, + "sprint": 0, "sprintln": 0, +} + +// checkCall triggers the print-specific checks if the call invokes a print function. +func checkFmtPrintfCall(f *File, node ast.Node) { + if d, ok := node.(*ast.FuncDecl); ok && isStringer(f, d) { + // Remember we saw this. + if f.stringers == nil { + f.stringers = make(map[*ast.Object]bool) + } + if l := d.Recv.List; len(l) == 1 { + if n := l[0].Names; len(n) == 1 { + f.stringers[n[0].Obj] = true + } + } + return + } + + call, ok := node.(*ast.CallExpr) + if !ok { + return + } + var Name string + switch x := call.Fun.(type) { + case *ast.Ident: + Name = x.Name + case *ast.SelectorExpr: + Name = x.Sel.Name + default: + return + } + + name := strings.ToLower(Name) + if skip, ok := printfList[name]; ok { + f.checkPrintf(call, Name, skip) + return + } + if skip, ok := printList[name]; ok { + f.checkPrint(call, Name, skip) + return + } +} + +// isStringer returns true if the provided declaration is a "String() string" +// method, an implementation of fmt.Stringer. +func isStringer(f *File, d *ast.FuncDecl) bool { + return d.Recv != nil && d.Name.Name == "String" && d.Type.Results != nil && + len(d.Type.Params.List) == 0 && len(d.Type.Results.List) == 1 && + f.pkg.types[d.Type.Results.List[0].Type].Type == types.Typ[types.String] +} + +// formatState holds the parsed representation of a printf directive such as "%3.*[4]d". +// It is constructed by parsePrintfVerb. +type formatState struct { + verb rune // the format verb: 'd' for "%d" + format string // the full format directive from % through verb, "%.3d". + name string // Printf, Sprintf etc. + flags []byte // the list of # + etc. + argNums []int // the successive argument numbers that are consumed, adjusted to refer to actual arg in call + indexed bool // whether an indexing expression appears: %[1]d. + firstArg int // Index of first argument after the format in the Printf call. + // Used only during parse. + file *File + call *ast.CallExpr + argNum int // Which argument we're expecting to format now. + indexPending bool // Whether we have an indexed argument that has not resolved. + nbytes int // number of bytes of the format string consumed. +} + +// checkPrintf checks a call to a formatted print routine such as Printf. +// call.Args[formatIndex] is (well, should be) the format argument. +func (f *File) checkPrintf(call *ast.CallExpr, name string, formatIndex int) { + if formatIndex >= len(call.Args) { + f.Bad(call.Pos(), "too few arguments in call to", name) + return + } + lit := f.pkg.types[call.Args[formatIndex]].Value + if lit == nil { + if *verbose { + f.Warn(call.Pos(), "can't check non-constant format in call to", name) + } + return + } + if lit.Kind() != exact.String { + f.Badf(call.Pos(), "constant %v not a string in call to %s", lit, name) + return + } + format := exact.StringVal(lit) + firstArg := formatIndex + 1 // Arguments are immediately after format string. + if !strings.Contains(format, "%") { + if len(call.Args) > firstArg { + f.Badf(call.Pos(), "no formatting directive in %s call", name) + } + return + } + // Hard part: check formats against args. + argNum := firstArg + indexed := false + for i, w := 0, 0; i < len(format); i += w { + w = 1 + if format[i] == '%' { + state := f.parsePrintfVerb(call, name, format[i:], firstArg, argNum) + if state == nil { + return + } + w = len(state.format) + if state.indexed { + indexed = true + } + if !f.okPrintfArg(call, state) { // One error per format is enough. + return + } + if len(state.argNums) > 0 { + // Continue with the next sequential argument. + argNum = state.argNums[len(state.argNums)-1] + 1 + } + } + } + // Dotdotdot is hard. + if call.Ellipsis.IsValid() && argNum >= len(call.Args)-1 { + return + } + // If the arguments were direct indexed, we assume the programmer knows what's up. + // Otherwise, there should be no leftover arguments. + if !indexed && argNum != len(call.Args) { + expect := argNum - firstArg + numArgs := len(call.Args) - firstArg + f.Badf(call.Pos(), "wrong number of args for format in %s call: %d needed but %d args", name, expect, numArgs) + } +} + +// parseFlags accepts any printf flags. +func (s *formatState) parseFlags() { + for s.nbytes < len(s.format) { + switch c := s.format[s.nbytes]; c { + case '#', '0', '+', '-', ' ': + s.flags = append(s.flags, c) + s.nbytes++ + default: + return + } + } +} + +// scanNum advances through a decimal number if present. +func (s *formatState) scanNum() { + for ; s.nbytes < len(s.format); s.nbytes++ { + c := s.format[s.nbytes] + if c < '0' || '9' < c { + return + } + } +} + +// parseIndex scans an index expression. It returns false if there is a syntax error. +func (s *formatState) parseIndex() bool { + if s.nbytes == len(s.format) || s.format[s.nbytes] != '[' { + return true + } + // Argument index present. + s.indexed = true + s.nbytes++ // skip '[' + start := s.nbytes + s.scanNum() + if s.nbytes == len(s.format) || s.nbytes == start || s.format[s.nbytes] != ']' { + s.file.Badf(s.call.Pos(), "illegal syntax for printf argument index") + return false + } + arg32, err := strconv.ParseInt(s.format[start:s.nbytes], 10, 32) + if err != nil { + s.file.Badf(s.call.Pos(), "illegal syntax for printf argument index: %s", err) + return false + } + s.nbytes++ // skip ']' + arg := int(arg32) + arg += s.firstArg - 1 // We want to zero-index the actual arguments. + s.argNum = arg + s.indexPending = true + return true +} + +// parseNum scans a width or precision (or *). It returns false if there's a bad index expression. +func (s *formatState) parseNum() bool { + if s.nbytes < len(s.format) && s.format[s.nbytes] == '*' { + if s.indexPending { // Absorb it. + s.indexPending = false + } + s.nbytes++ + s.argNums = append(s.argNums, s.argNum) + s.argNum++ + } else { + s.scanNum() + } + return true +} + +// parsePrecision scans for a precision. It returns false if there's a bad index expression. +func (s *formatState) parsePrecision() bool { + // If there's a period, there may be a precision. + if s.nbytes < len(s.format) && s.format[s.nbytes] == '.' { + s.flags = append(s.flags, '.') // Treat precision as a flag. + s.nbytes++ + if !s.parseIndex() { + return false + } + if !s.parseNum() { + return false + } + } + return true +} + +// parsePrintfVerb looks the formatting directive that begins the format string +// and returns a formatState that encodes what the directive wants, without looking +// at the actual arguments present in the call. The result is nil if there is an error. +func (f *File) parsePrintfVerb(call *ast.CallExpr, name, format string, firstArg, argNum int) *formatState { + state := &formatState{ + format: format, + name: name, + flags: make([]byte, 0, 5), + argNum: argNum, + argNums: make([]int, 0, 1), + nbytes: 1, // There's guaranteed to be a percent sign. + indexed: false, + firstArg: firstArg, + file: f, + call: call, + } + // There may be flags. + state.parseFlags() + indexPending := false + // There may be an index. + if !state.parseIndex() { + return nil + } + // There may be a width. + if !state.parseNum() { + return nil + } + // There may be a precision. + if !state.parsePrecision() { + return nil + } + // Now a verb, possibly prefixed by an index (which we may already have). + if !indexPending && !state.parseIndex() { + return nil + } + if state.nbytes == len(state.format) { + f.Badf(call.Pos(), "missing verb at end of format string in %s call", name) + return nil + } + verb, w := utf8.DecodeRuneInString(state.format[state.nbytes:]) + state.verb = verb + state.nbytes += w + if verb != '%' { + state.argNums = append(state.argNums, state.argNum) + } + state.format = state.format[:state.nbytes] + return state +} + +// printfArgType encodes the types of expressions a printf verb accepts. It is a bitmask. +type printfArgType int + +const ( + argBool printfArgType = 1 << iota + argInt + argRune + argString + argFloat + argComplex + argPointer + anyType printfArgType = ^0 +) + +type printVerb struct { + verb rune // User may provide verb through Formatter; could be a rune. + flags string // known flags are all ASCII + typ printfArgType +} + +// Common flag sets for printf verbs. +const ( + noFlag = "" + numFlag = " -+.0" + sharpNumFlag = " -+.0#" + allFlags = " -+.0#" +) + +// printVerbs identifies which flags are known to printf for each verb. +// TODO: A type that implements Formatter may do what it wants, and vet +// will complain incorrectly. +var printVerbs = []printVerb{ + // '-' is a width modifier, always valid. + // '.' is a precision for float, max width for strings. + // '+' is required sign for numbers, Go format for %v. + // '#' is alternate format for several verbs. + // ' ' is spacer for numbers + {'%', noFlag, 0}, + {'b', numFlag, argInt | argFloat | argComplex}, + {'c', "-", argRune | argInt}, + {'d', numFlag, argInt}, + {'e', numFlag, argFloat | argComplex}, + {'E', numFlag, argFloat | argComplex}, + {'f', numFlag, argFloat | argComplex}, + {'F', numFlag, argFloat | argComplex}, + {'g', numFlag, argFloat | argComplex}, + {'G', numFlag, argFloat | argComplex}, + {'o', sharpNumFlag, argInt}, + {'p', "-#", argPointer}, + {'q', " -+.0#", argRune | argInt | argString}, + {'s', " -+.0", argString}, + {'t', "-", argBool}, + {'T', "-", anyType}, + {'U', "-#", argRune | argInt}, + {'v', allFlags, anyType}, + {'x', sharpNumFlag, argRune | argInt | argString}, + {'X', sharpNumFlag, argRune | argInt | argString}, +} + +// okPrintfArg compares the formatState to the arguments actually present, +// reporting any discrepancies it can discern. If the final argument is ellipsissed, +// there's little it can do for that. +func (f *File) okPrintfArg(call *ast.CallExpr, state *formatState) (ok bool) { + var v printVerb + found := false + // Linear scan is fast enough for a small list. + for _, v = range printVerbs { + if v.verb == state.verb { + found = true + break + } + } + if !found { + f.Badf(call.Pos(), "unrecognized printf verb %q", state.verb) + return false + } + for _, flag := range state.flags { + if !strings.ContainsRune(v.flags, rune(flag)) { + f.Badf(call.Pos(), "unrecognized printf flag for verb %q: %q", state.verb, flag) + return false + } + } + // Verb is good. If len(state.argNums)>trueArgs, we have something like %.*s and all + // but the final arg must be an integer. + trueArgs := 1 + if state.verb == '%' { + trueArgs = 0 + } + nargs := len(state.argNums) + for i := 0; i < nargs-trueArgs; i++ { + argNum := state.argNums[i] + if !f.argCanBeChecked(call, i, true, state) { + return + } + arg := call.Args[argNum] + if !f.matchArgType(argInt, nil, arg) { + f.Badf(call.Pos(), "arg %s for * in printf format not of type int", f.gofmt(arg)) + return false + } + } + if state.verb == '%' { + return true + } + argNum := state.argNums[len(state.argNums)-1] + if !f.argCanBeChecked(call, len(state.argNums)-1, false, state) { + return false + } + arg := call.Args[argNum] + if !f.matchArgType(v.typ, nil, arg) { + typeString := "" + if typ := f.pkg.types[arg].Type; typ != nil { + typeString = typ.String() + } + f.Badf(call.Pos(), "arg %s for printf verb %%%c of wrong type: %s", f.gofmt(arg), state.verb, typeString) + return false + } + if v.typ&argString != 0 && v.verb != 'T' && !bytes.Contains(state.flags, []byte{'#'}) && f.recursiveStringer(arg) { + f.Badf(call.Pos(), "arg %s for printf causes recursive call to String method", f.gofmt(arg)) + return false + } + return true +} + +// recursiveStringer reports whether the provided argument is r or &r for the +// fmt.Stringer receiver identifier r. +func (f *File) recursiveStringer(e ast.Expr) bool { + if len(f.stringers) == 0 { + return false + } + var obj *ast.Object + switch e := e.(type) { + case *ast.Ident: + obj = e.Obj + case *ast.UnaryExpr: + if id, ok := e.X.(*ast.Ident); ok && e.Op == token.AND { + obj = id.Obj + } + } + + // It's unlikely to be a recursive stringer if it has a Format method. + if typ := f.pkg.types[e].Type; typ != nil { + // Not a perfect match; see issue 6259. + if f.hasMethod(typ, "Format") { + return false + } + } + + // We compare the underlying Object, which checks that the identifier + // is the one we declared as the receiver for the String method in + // which this printf appears. + return f.stringers[obj] +} + +// argCanBeChecked reports whether the specified argument is statically present; +// it may be beyond the list of arguments or in a terminal slice... argument, which +// means we can't see it. +func (f *File) argCanBeChecked(call *ast.CallExpr, formatArg int, isStar bool, state *formatState) bool { + argNum := state.argNums[formatArg] + if argNum < 0 { + // Shouldn't happen, so catch it with prejudice. + panic("negative arg num") + } + if argNum == 0 { + f.Badf(call.Pos(), `index value [0] for %s("%s"); indexes start at 1`, state.name, state.format) + return false + } + if argNum < len(call.Args)-1 { + return true // Always OK. + } + if call.Ellipsis.IsValid() { + return false // We just can't tell; there could be many more arguments. + } + if argNum < len(call.Args) { + return true + } + // There are bad indexes in the format or there are fewer arguments than the format needs. + // This is the argument number relative to the format: Printf("%s", "hi") will give 1 for the "hi". + arg := argNum - state.firstArg + 1 // People think of arguments as 1-indexed. + f.Badf(call.Pos(), `missing argument for %s("%s"): format reads arg %d, have only %d args`, state.name, state.format, arg, len(call.Args)-state.firstArg) + return false +} + +// checkPrint checks a call to an unformatted print routine such as Println. +// call.Args[firstArg] is the first argument to be printed. +func (f *File) checkPrint(call *ast.CallExpr, name string, firstArg int) { + isLn := strings.HasSuffix(name, "ln") + isF := strings.HasPrefix(name, "F") + args := call.Args + if name == "Log" && len(args) > 0 { + // Special case: Don't complain about math.Log or cmplx.Log. + // Not strictly necessary because the only complaint likely is for Log("%d") + // but it feels wrong to check that math.Log is a good print function. + if sel, ok := args[0].(*ast.SelectorExpr); ok { + if x, ok := sel.X.(*ast.Ident); ok { + if x.Name == "math" || x.Name == "cmplx" { + return + } + } + } + } + // check for Println(os.Stderr, ...) + if firstArg == 0 && !isF && len(args) > 0 { + if sel, ok := args[0].(*ast.SelectorExpr); ok { + if x, ok := sel.X.(*ast.Ident); ok { + if x.Name == "os" && strings.HasPrefix(sel.Sel.Name, "Std") { + f.Badf(call.Pos(), "first argument to %s is %s.%s", name, x.Name, sel.Sel.Name) + } + } + } + } + if len(args) <= firstArg { + // If we have a call to a method called Error that satisfies the Error interface, + // then it's ok. Otherwise it's something like (*T).Error from the testing package + // and we need to check it. + if name == "Error" && f.isErrorMethodCall(call) { + return + } + // If it's an Error call now, it's probably for printing errors. + if !isLn { + // Check the signature to be sure: there are niladic functions called "error". + if firstArg != 0 || f.numArgsInSignature(call) != firstArg { + f.Badf(call.Pos(), "no args in %s call", name) + } + } + return + } + arg := args[firstArg] + if lit, ok := arg.(*ast.BasicLit); ok && lit.Kind == token.STRING { + if strings.Contains(lit.Value, "%") { + f.Badf(call.Pos(), "possible formatting directive in %s call", name) + } + } + if isLn { + // The last item, if a string, should not have a newline. + arg = args[len(call.Args)-1] + if lit, ok := arg.(*ast.BasicLit); ok && lit.Kind == token.STRING { + if strings.HasSuffix(lit.Value, `\n"`) { + f.Badf(call.Pos(), "%s call ends with newline", name) + } + } + } + for _, arg := range args { + if f.recursiveStringer(arg) { + f.Badf(call.Pos(), "arg %s for print causes recursive call to String method", f.gofmt(arg)) + } + } +} diff --git a/vendor/golang.org/x/tools/cmd/vet/rangeloop.go b/vendor/golang.org/x/tools/cmd/vet/rangeloop.go new file mode 100644 index 0000000000..96e2ca8062 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/rangeloop.go @@ -0,0 +1,70 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +This file contains the code to check range loop variables bound inside function +literals that are deferred or launched in new goroutines. We only check +instances where the defer or go statement is the last statement in the loop +body, as otherwise we would need whole program analysis. + +For example: + + for i, v := range s { + go func() { + println(i, v) // not what you might expect + }() + } + +See: http://golang.org/doc/go_faq.html#closures_and_goroutines +*/ + +package main + +import "go/ast" + +func init() { + register("rangeloops", + "check that range loop variables are used correctly", + checkRangeLoop, + rangeStmt) +} + +// checkRangeLoop walks the body of the provided range statement, checking if +// its index or value variables are used unsafely inside goroutines or deferred +// function literals. +func checkRangeLoop(f *File, node ast.Node) { + n := node.(*ast.RangeStmt) + key, _ := n.Key.(*ast.Ident) + val, _ := n.Value.(*ast.Ident) + if key == nil && val == nil { + return + } + sl := n.Body.List + if len(sl) == 0 { + return + } + var last *ast.CallExpr + switch s := sl[len(sl)-1].(type) { + case *ast.GoStmt: + last = s.Call + case *ast.DeferStmt: + last = s.Call + default: + return + } + lit, ok := last.Fun.(*ast.FuncLit) + if !ok { + return + } + ast.Inspect(lit.Body, func(n ast.Node) bool { + id, ok := n.(*ast.Ident) + if !ok || id.Obj == nil { + return true + } + if key != nil && id.Obj == key.Obj || val != nil && id.Obj == val.Obj { + f.Bad(id.Pos(), "range variable", id.Name, "captured by func literal") + } + return true + }) +} diff --git a/vendor/golang.org/x/tools/cmd/vet/shadow.go b/vendor/golang.org/x/tools/cmd/vet/shadow.go new file mode 100644 index 0000000000..fa680a03e9 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/shadow.go @@ -0,0 +1,245 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +This file contains the code to check for shadowed variables. +A shadowed variable is a variable declared in an inner scope +with the same name and type as a variable in an outer scope, +and where the outer variable is mentioned after the inner one +is declared. + +(This definition can be refined; the module generates too many +false positives and is not yet enabled by default.) + +For example: + + func BadRead(f *os.File, buf []byte) error { + var err error + for { + n, err := f.Read(buf) // shadows the function variable 'err' + if err != nil { + break // causes return of wrong value + } + foo(buf) + } + return err + } + +*/ + +package main + +import ( + "flag" + "go/ast" + "go/token" + + "golang.org/x/tools/go/types" +) + +var strictShadowing = flag.Bool("shadowstrict", false, "whether to be strict about shadowing; can be noisy") + +func init() { + register("shadow", + "check for shadowed variables (experimental; must be set explicitly)", + checkShadow, + assignStmt, genDecl) + experimental["shadow"] = true +} + +func checkShadow(f *File, node ast.Node) { + switch n := node.(type) { + case *ast.AssignStmt: + checkShadowAssignment(f, n) + case *ast.GenDecl: + checkShadowDecl(f, n) + } +} + +// Span stores the minimum range of byte positions in the file in which a +// given variable (types.Object) is mentioned. It is lexically defined: it spans +// from the beginning of its first mention to the end of its last mention. +// A variable is considered shadowed (if *strictShadowing is off) only if the +// shadowing variable is declared within the span of the shadowed variable. +// In other words, if a variable is shadowed but not used after the shadowed +// variable is declared, it is inconsequential and not worth complaining about. +// This simple check dramatically reduces the nuisance rate for the shadowing +// check, at least until something cleverer comes along. +// +// One wrinkle: A "naked return" is a silent use of a variable that the Span +// will not capture, but the compilers catch naked returns of shadowed +// variables so we don't need to. +// +// Cases this gets wrong (TODO): +// - If a for loop's continuation statement mentions a variable redeclared in +// the block, we should complain about it but don't. +// - A variable declared inside a function literal can falsely be identified +// as shadowing a variable in the outer function. +// +type Span struct { + min token.Pos + max token.Pos +} + +// contains reports whether the position is inside the span. +func (s Span) contains(pos token.Pos) bool { + return s.min <= pos && pos < s.max +} + +// growSpan expands the span for the object to contain the instance represented +// by the identifier. +func (pkg *Package) growSpan(ident *ast.Ident, obj types.Object) { + if *strictShadowing { + return // No need + } + pos := ident.Pos() + end := ident.End() + span, ok := pkg.spans[obj] + if ok { + if span.min > pos { + span.min = pos + } + if span.max < end { + span.max = end + } + } else { + span = Span{pos, end} + } + pkg.spans[obj] = span +} + +// checkShadowAssignment checks for shadowing in a short variable declaration. +func checkShadowAssignment(f *File, a *ast.AssignStmt) { + if a.Tok != token.DEFINE { + return + } + if f.idiomaticShortRedecl(a) { + return + } + for _, expr := range a.Lhs { + ident, ok := expr.(*ast.Ident) + if !ok { + f.Badf(expr.Pos(), "invalid AST: short variable declaration of non-identifier") + return + } + checkShadowing(f, ident) + } +} + +// idiomaticShortRedecl reports whether this short declaration can be ignored for +// the purposes of shadowing, that is, that any redeclarations it contains are deliberate. +func (f *File) idiomaticShortRedecl(a *ast.AssignStmt) bool { + // Don't complain about deliberate redeclarations of the form + // i := i + // Such constructs are idiomatic in range loops to create a new variable + // for each iteration. Another example is + // switch n := n.(type) + if len(a.Rhs) != len(a.Lhs) { + return false + } + // We know it's an assignment, so the LHS must be all identifiers. (We check anyway.) + for i, expr := range a.Lhs { + lhs, ok := expr.(*ast.Ident) + if !ok { + f.Badf(expr.Pos(), "invalid AST: short variable declaration of non-identifier") + return true // Don't do any more processing. + } + switch rhs := a.Rhs[i].(type) { + case *ast.Ident: + if lhs.Name != rhs.Name { + return false + } + case *ast.TypeAssertExpr: + if id, ok := rhs.X.(*ast.Ident); ok { + if lhs.Name != id.Name { + return false + } + } + } + } + return true +} + +// idiomaticRedecl reports whether this declaration spec can be ignored for +// the purposes of shadowing, that is, that any redeclarations it contains are deliberate. +func (f *File) idiomaticRedecl(d *ast.ValueSpec) bool { + // Don't complain about deliberate redeclarations of the form + // var i, j = i, j + if len(d.Names) != len(d.Values) { + return false + } + for i, lhs := range d.Names { + if rhs, ok := d.Values[i].(*ast.Ident); ok { + if lhs.Name != rhs.Name { + return false + } + } + } + return true +} + +// checkShadowDecl checks for shadowing in a general variable declaration. +func checkShadowDecl(f *File, d *ast.GenDecl) { + if d.Tok != token.VAR { + return + } + for _, spec := range d.Specs { + valueSpec, ok := spec.(*ast.ValueSpec) + if !ok { + f.Badf(spec.Pos(), "invalid AST: var GenDecl not ValueSpec") + return + } + // Don't complain about deliberate redeclarations of the form + // var i = i + if f.idiomaticRedecl(valueSpec) { + return + } + for _, ident := range valueSpec.Names { + checkShadowing(f, ident) + } + } +} + +// checkShadowing checks whether the identifier shadows an identifier in an outer scope. +func checkShadowing(f *File, ident *ast.Ident) { + if ident.Name == "_" { + // Can't shadow the blank identifier. + return + } + obj := f.pkg.defs[ident] + if obj == nil { + return + } + // obj.Parent.Parent is the surrounding scope. If we can find another declaration + // starting from there, we have a shadowed identifier. + _, shadowed := obj.Parent().Parent().LookupParent(obj.Name(), obj.Pos()) + if shadowed == nil { + return + } + // Don't complain if it's shadowing a universe-declared identifier; that's fine. + if shadowed.Parent() == types.Universe { + return + } + if *strictShadowing { + // The shadowed identifier must appear before this one to be an instance of shadowing. + if shadowed.Pos() > ident.Pos() { + return + } + } else { + // Don't complain if the span of validity of the shadowed identifier doesn't include + // the shadowing identifier. + span, ok := f.pkg.spans[shadowed] + if !ok { + f.Badf(ident.Pos(), "internal error: no range for %s", ident.Name) + return + } + if !span.contains(ident.Pos()) { + return + } + } + // Don't complain if the types differ: that implies the programmer really wants two different things. + if types.Identical(obj.Type(), shadowed.Type()) { + f.Badf(ident.Pos(), "declaration of %s shadows declaration at %s", obj.Name(), f.loc(shadowed.Pos())) + } +} diff --git a/vendor/golang.org/x/tools/cmd/vet/shift.go b/vendor/golang.org/x/tools/cmd/vet/shift.go new file mode 100644 index 0000000000..2385c23fdb --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/shift.go @@ -0,0 +1,83 @@ +// 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. + +/* +This file contains the code to check for suspicious shifts. +*/ + +package main + +import ( + "go/ast" + "go/token" + + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/types" +) + +func init() { + register("shift", + "check for useless shifts", + checkShift, + binaryExpr, assignStmt) +} + +func checkShift(f *File, node ast.Node) { + switch node := node.(type) { + case *ast.BinaryExpr: + if node.Op == token.SHL || node.Op == token.SHR { + checkLongShift(f, node, node.X, node.Y) + } + case *ast.AssignStmt: + if len(node.Lhs) != 1 || len(node.Rhs) != 1 { + return + } + if node.Tok == token.SHL_ASSIGN || node.Tok == token.SHR_ASSIGN { + checkLongShift(f, node, node.Lhs[0], node.Rhs[0]) + } + } +} + +// checkLongShift checks if shift or shift-assign operations shift by more than +// the length of the underlying variable. +func checkLongShift(f *File, node ast.Node, x, y ast.Expr) { + v := f.pkg.types[y].Value + if v == nil { + return + } + amt, ok := exact.Int64Val(v) + if !ok { + return + } + t := f.pkg.types[x].Type + if t == nil { + return + } + b, ok := t.Underlying().(*types.Basic) + if !ok { + return + } + var size int64 + var msg string + switch b.Kind() { + case types.Uint8, types.Int8: + size = 8 + case types.Uint16, types.Int16: + size = 16 + case types.Uint32, types.Int32: + size = 32 + case types.Uint64, types.Int64: + size = 64 + case types.Int, types.Uint, types.Uintptr: + // These types may be as small as 32 bits, but no smaller. + size = 32 + msg = "might be " + default: + return + } + if amt >= size { + ident := f.gofmt(x) + f.Badf(node.Pos(), "%s %stoo small for shift of %d", ident, msg, amt) + } +} diff --git a/vendor/golang.org/x/tools/cmd/vet/structtag.go b/vendor/golang.org/x/tools/cmd/vet/structtag.go new file mode 100644 index 0000000000..e8164a46f9 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/structtag.go @@ -0,0 +1,122 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains the test for canonical struct tags. + +package main + +import ( + "errors" + "go/ast" + "reflect" + "strconv" +) + +func init() { + register("structtags", + "check that struct field tags have canonical format and apply to exported fields as needed", + checkCanonicalFieldTag, + field) +} + +// checkCanonicalFieldTag checks a struct field tag. +func checkCanonicalFieldTag(f *File, node ast.Node) { + field := node.(*ast.Field) + if field.Tag == nil { + return + } + + tag, err := strconv.Unquote(field.Tag.Value) + if err != nil { + f.Badf(field.Pos(), "unable to read struct tag %s", field.Tag.Value) + return + } + + if err := validateStructTag(tag); err != nil { + f.Badf(field.Pos(), "struct field tag %s not compatible with reflect.StructTag.Get: %s", field.Tag.Value, err) + } + + // Check for use of json or xml tags with unexported fields. + + // Embedded struct. Nothing to do for now, but that + // may change, depending on what happens with issue 7363. + if len(field.Names) == 0 { + return + } + + if field.Names[0].IsExported() { + return + } + + st := reflect.StructTag(tag) + for _, enc := range [...]string{"json", "xml"} { + if st.Get(enc) != "" { + f.Badf(field.Pos(), "struct field %s has %s tag but is not exported", field.Names[0].Name, enc) + return + } + } +} + +var ( + errTagSyntax = errors.New("bad syntax for struct tag pair") + errTagKeySyntax = errors.New("bad syntax for struct tag key") + errTagValueSyntax = errors.New("bad syntax for struct tag value") +) + +// validateStructTag parses the struct tag and returns an error if it is not +// in the canonical format, which is a space-separated list of key:"value" +// settings. The value may contain spaces. +func validateStructTag(tag string) error { + // This code is based on the StructTag.Get code in package reflect. + + for tag != "" { + // Skip leading space. + i := 0 + for i < len(tag) && tag[i] == ' ' { + i++ + } + tag = tag[i:] + if tag == "" { + break + } + + // Scan to colon. A space, a quote or a control character is a syntax error. + // Strictly speaking, control chars include the range [0x7f, 0x9f], not just + // [0x00, 0x1f], but in practice, we ignore the multi-byte control characters + // as it is simpler to inspect the tag's bytes than the tag's runes. + i = 0 + for i < len(tag) && tag[i] > ' ' && tag[i] != ':' && tag[i] != '"' && tag[i] != 0x7f { + i++ + } + if i == 0 { + return errTagKeySyntax + } + if i+1 >= len(tag) || tag[i] != ':' { + return errTagSyntax + } + if tag[i+1] != '"' { + return errTagValueSyntax + } + tag = tag[i+1:] + + // Scan quoted string to find value. + i = 1 + for i < len(tag) && tag[i] != '"' { + if tag[i] == '\\' { + i++ + } + i++ + } + if i >= len(tag) { + return errTagValueSyntax + } + qvalue := string(tag[:i+1]) + tag = tag[i+1:] + + if _, err := strconv.Unquote(qvalue); err != nil { + return errTagValueSyntax + } + } + return nil +} diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/asm.go b/vendor/golang.org/x/tools/cmd/vet/testdata/asm.go new file mode 100644 index 0000000000..9a3d5315ad --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/asm.go @@ -0,0 +1,33 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +// This file contains declarations to test the assembly in test_asm.s. + +package testdata + +func arg1(x int8, y uint8) +func arg2(x int16, y uint16) +func arg4(x int32, y uint32) +func arg8(x int64, y uint64) +func argint(x int, y uint) +func argptr(x *byte, y *byte, c chan int, m map[int]int, f func()) +func argstring(x, y string) +func argslice(x, y []string) +func argiface(x interface{}, y interface { + m() +}) +func returnint() int +func returnbyte(x int) byte +func returnnamed(x byte) (r1 int, r2 int16, r3 string, r4 byte) +func returnintmissing() int +func leaf(x, y int) int + +func noprof(x int) +func dupok(x int) +func nosplit(x int) +func rodata(x int) +func noptr(x int) +func wrapper(x int) diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/asm1.s b/vendor/golang.org/x/tools/cmd/vet/testdata/asm1.s new file mode 100644 index 0000000000..62f423cd8b --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/asm1.s @@ -0,0 +1,254 @@ +// Copyright 2013 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 amd64 +// +build vet_test + +TEXT ·arg1(SB),0,$0-2 + MOVB x+0(FP), AX + // MOVB x+0(FP), AX // commented out instructions used to panic + MOVB y+1(FP), BX + MOVW x+0(FP), AX // ERROR "\[amd64\] arg1: invalid MOVW of x\+0\(FP\); int8 is 1-byte value" + MOVW y+1(FP), AX // ERROR "invalid MOVW of y\+1\(FP\); uint8 is 1-byte value" + MOVL x+0(FP), AX // ERROR "invalid MOVL of x\+0\(FP\); int8 is 1-byte value" + MOVL y+1(FP), AX // ERROR "invalid MOVL of y\+1\(FP\); uint8 is 1-byte value" + MOVQ x+0(FP), AX // ERROR "invalid MOVQ of x\+0\(FP\); int8 is 1-byte value" + MOVQ y+1(FP), AX // ERROR "invalid MOVQ of y\+1\(FP\); uint8 is 1-byte value" + MOVB x+1(FP), AX // ERROR "invalid offset x\+1\(FP\); expected x\+0\(FP\)" + MOVB y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+1\(FP\)" + TESTB x+0(FP), AX + TESTB y+1(FP), BX + TESTW x+0(FP), AX // ERROR "invalid TESTW of x\+0\(FP\); int8 is 1-byte value" + TESTW y+1(FP), AX // ERROR "invalid TESTW of y\+1\(FP\); uint8 is 1-byte value" + TESTL x+0(FP), AX // ERROR "invalid TESTL of x\+0\(FP\); int8 is 1-byte value" + TESTL y+1(FP), AX // ERROR "invalid TESTL of y\+1\(FP\); uint8 is 1-byte value" + TESTQ x+0(FP), AX // ERROR "invalid TESTQ of x\+0\(FP\); int8 is 1-byte value" + TESTQ y+1(FP), AX // ERROR "invalid TESTQ of y\+1\(FP\); uint8 is 1-byte value" + TESTB x+1(FP), AX // ERROR "invalid offset x\+1\(FP\); expected x\+0\(FP\)" + TESTB y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+1\(FP\)" + MOVB 8(SP), AX // ERROR "8\(SP\) should be x\+0\(FP\)" + MOVB 9(SP), AX // ERROR "9\(SP\) should be y\+1\(FP\)" + MOVB 10(SP), AX // ERROR "use of 10\(SP\) points beyond argument frame" + RET + +TEXT ·arg2(SB),0,$0-4 + MOVB x+0(FP), AX // ERROR "arg2: invalid MOVB of x\+0\(FP\); int16 is 2-byte value" + MOVB y+2(FP), AX // ERROR "invalid MOVB of y\+2\(FP\); uint16 is 2-byte value" + MOVW x+0(FP), AX + MOVW y+2(FP), BX + MOVL x+0(FP), AX // ERROR "invalid MOVL of x\+0\(FP\); int16 is 2-byte value" + MOVL y+2(FP), AX // ERROR "invalid MOVL of y\+2\(FP\); uint16 is 2-byte value" + MOVQ x+0(FP), AX // ERROR "invalid MOVQ of x\+0\(FP\); int16 is 2-byte value" + MOVQ y+2(FP), AX // ERROR "invalid MOVQ of y\+2\(FP\); uint16 is 2-byte value" + MOVW x+2(FP), AX // ERROR "invalid offset x\+2\(FP\); expected x\+0\(FP\)" + MOVW y+0(FP), AX // ERROR "invalid offset y\+0\(FP\); expected y\+2\(FP\)" + TESTB x+0(FP), AX // ERROR "invalid TESTB of x\+0\(FP\); int16 is 2-byte value" + TESTB y+2(FP), AX // ERROR "invalid TESTB of y\+2\(FP\); uint16 is 2-byte value" + TESTW x+0(FP), AX + TESTW y+2(FP), BX + TESTL x+0(FP), AX // ERROR "invalid TESTL of x\+0\(FP\); int16 is 2-byte value" + TESTL y+2(FP), AX // ERROR "invalid TESTL of y\+2\(FP\); uint16 is 2-byte value" + TESTQ x+0(FP), AX // ERROR "invalid TESTQ of x\+0\(FP\); int16 is 2-byte value" + TESTQ y+2(FP), AX // ERROR "invalid TESTQ of y\+2\(FP\); uint16 is 2-byte value" + TESTW x+2(FP), AX // ERROR "invalid offset x\+2\(FP\); expected x\+0\(FP\)" + TESTW y+0(FP), AX // ERROR "invalid offset y\+0\(FP\); expected y\+2\(FP\)" + RET + +TEXT ·arg4(SB),0,$0-2 // ERROR "arg4: wrong argument size 2; expected \$\.\.\.-8" + MOVB x+0(FP), AX // ERROR "invalid MOVB of x\+0\(FP\); int32 is 4-byte value" + MOVB y+4(FP), BX // ERROR "invalid MOVB of y\+4\(FP\); uint32 is 4-byte value" + MOVW x+0(FP), AX // ERROR "invalid MOVW of x\+0\(FP\); int32 is 4-byte value" + MOVW y+4(FP), AX // ERROR "invalid MOVW of y\+4\(FP\); uint32 is 4-byte value" + MOVL x+0(FP), AX + MOVL y+4(FP), AX + MOVQ x+0(FP), AX // ERROR "invalid MOVQ of x\+0\(FP\); int32 is 4-byte value" + MOVQ y+4(FP), AX // ERROR "invalid MOVQ of y\+4\(FP\); uint32 is 4-byte value" + MOVL x+4(FP), AX // ERROR "invalid offset x\+4\(FP\); expected x\+0\(FP\)" + MOVL y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+4\(FP\)" + TESTB x+0(FP), AX // ERROR "invalid TESTB of x\+0\(FP\); int32 is 4-byte value" + TESTB y+4(FP), BX // ERROR "invalid TESTB of y\+4\(FP\); uint32 is 4-byte value" + TESTW x+0(FP), AX // ERROR "invalid TESTW of x\+0\(FP\); int32 is 4-byte value" + TESTW y+4(FP), AX // ERROR "invalid TESTW of y\+4\(FP\); uint32 is 4-byte value" + TESTL x+0(FP), AX + TESTL y+4(FP), AX + TESTQ x+0(FP), AX // ERROR "invalid TESTQ of x\+0\(FP\); int32 is 4-byte value" + TESTQ y+4(FP), AX // ERROR "invalid TESTQ of y\+4\(FP\); uint32 is 4-byte value" + TESTL x+4(FP), AX // ERROR "invalid offset x\+4\(FP\); expected x\+0\(FP\)" + TESTL y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+4\(FP\)" + RET + +TEXT ·arg8(SB),7,$0-2 // ERROR "wrong argument size 2; expected \$\.\.\.-16" + MOVB x+0(FP), AX // ERROR "invalid MOVB of x\+0\(FP\); int64 is 8-byte value" + MOVB y+8(FP), BX // ERROR "invalid MOVB of y\+8\(FP\); uint64 is 8-byte value" + MOVW x+0(FP), AX // ERROR "invalid MOVW of x\+0\(FP\); int64 is 8-byte value" + MOVW y+8(FP), AX // ERROR "invalid MOVW of y\+8\(FP\); uint64 is 8-byte value" + MOVL x+0(FP), AX // ERROR "invalid MOVL of x\+0\(FP\); int64 is 8-byte value" + MOVL y+8(FP), AX // ERROR "invalid MOVL of y\+8\(FP\); uint64 is 8-byte value" + MOVQ x+0(FP), AX + MOVQ y+8(FP), AX + MOVQ x+8(FP), AX // ERROR "invalid offset x\+8\(FP\); expected x\+0\(FP\)" + MOVQ y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+8\(FP\)" + TESTB x+0(FP), AX // ERROR "invalid TESTB of x\+0\(FP\); int64 is 8-byte value" + TESTB y+8(FP), BX // ERROR "invalid TESTB of y\+8\(FP\); uint64 is 8-byte value" + TESTW x+0(FP), AX // ERROR "invalid TESTW of x\+0\(FP\); int64 is 8-byte value" + TESTW y+8(FP), AX // ERROR "invalid TESTW of y\+8\(FP\); uint64 is 8-byte value" + TESTL x+0(FP), AX // ERROR "invalid TESTL of x\+0\(FP\); int64 is 8-byte value" + TESTL y+8(FP), AX // ERROR "invalid TESTL of y\+8\(FP\); uint64 is 8-byte value" + TESTQ x+0(FP), AX + TESTQ y+8(FP), AX + TESTQ x+8(FP), AX // ERROR "invalid offset x\+8\(FP\); expected x\+0\(FP\)" + TESTQ y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+8\(FP\)" + RET + +TEXT ·argint(SB),0,$0-2 // ERROR "wrong argument size 2; expected \$\.\.\.-16" + MOVB x+0(FP), AX // ERROR "invalid MOVB of x\+0\(FP\); int is 8-byte value" + MOVB y+8(FP), BX // ERROR "invalid MOVB of y\+8\(FP\); uint is 8-byte value" + MOVW x+0(FP), AX // ERROR "invalid MOVW of x\+0\(FP\); int is 8-byte value" + MOVW y+8(FP), AX // ERROR "invalid MOVW of y\+8\(FP\); uint is 8-byte value" + MOVL x+0(FP), AX // ERROR "invalid MOVL of x\+0\(FP\); int is 8-byte value" + MOVL y+8(FP), AX // ERROR "invalid MOVL of y\+8\(FP\); uint is 8-byte value" + MOVQ x+0(FP), AX + MOVQ y+8(FP), AX + MOVQ x+8(FP), AX // ERROR "invalid offset x\+8\(FP\); expected x\+0\(FP\)" + MOVQ y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+8\(FP\)" + TESTB x+0(FP), AX // ERROR "invalid TESTB of x\+0\(FP\); int is 8-byte value" + TESTB y+8(FP), BX // ERROR "invalid TESTB of y\+8\(FP\); uint is 8-byte value" + TESTW x+0(FP), AX // ERROR "invalid TESTW of x\+0\(FP\); int is 8-byte value" + TESTW y+8(FP), AX // ERROR "invalid TESTW of y\+8\(FP\); uint is 8-byte value" + TESTL x+0(FP), AX // ERROR "invalid TESTL of x\+0\(FP\); int is 8-byte value" + TESTL y+8(FP), AX // ERROR "invalid TESTL of y\+8\(FP\); uint is 8-byte value" + TESTQ x+0(FP), AX + TESTQ y+8(FP), AX + TESTQ x+8(FP), AX // ERROR "invalid offset x\+8\(FP\); expected x\+0\(FP\)" + TESTQ y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+8\(FP\)" + RET + +TEXT ·argptr(SB),7,$0-2 // ERROR "wrong argument size 2; expected \$\.\.\.-40" + MOVB x+0(FP), AX // ERROR "invalid MOVB of x\+0\(FP\); \*byte is 8-byte value" + MOVB y+8(FP), BX // ERROR "invalid MOVB of y\+8\(FP\); \*byte is 8-byte value" + MOVW x+0(FP), AX // ERROR "invalid MOVW of x\+0\(FP\); \*byte is 8-byte value" + MOVW y+8(FP), AX // ERROR "invalid MOVW of y\+8\(FP\); \*byte is 8-byte value" + MOVL x+0(FP), AX // ERROR "invalid MOVL of x\+0\(FP\); \*byte is 8-byte value" + MOVL y+8(FP), AX // ERROR "invalid MOVL of y\+8\(FP\); \*byte is 8-byte value" + MOVQ x+0(FP), AX + MOVQ y+8(FP), AX + MOVQ x+8(FP), AX // ERROR "invalid offset x\+8\(FP\); expected x\+0\(FP\)" + MOVQ y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+8\(FP\)" + TESTB x+0(FP), AX // ERROR "invalid TESTB of x\+0\(FP\); \*byte is 8-byte value" + TESTB y+8(FP), BX // ERROR "invalid TESTB of y\+8\(FP\); \*byte is 8-byte value" + TESTW x+0(FP), AX // ERROR "invalid TESTW of x\+0\(FP\); \*byte is 8-byte value" + TESTW y+8(FP), AX // ERROR "invalid TESTW of y\+8\(FP\); \*byte is 8-byte value" + TESTL x+0(FP), AX // ERROR "invalid TESTL of x\+0\(FP\); \*byte is 8-byte value" + TESTL y+8(FP), AX // ERROR "invalid TESTL of y\+8\(FP\); \*byte is 8-byte value" + TESTQ x+0(FP), AX + TESTQ y+8(FP), AX + TESTQ x+8(FP), AX // ERROR "invalid offset x\+8\(FP\); expected x\+0\(FP\)" + TESTQ y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+8\(FP\)" + MOVL c+16(FP), AX // ERROR "invalid MOVL of c\+16\(FP\); chan int is 8-byte value" + MOVL m+24(FP), AX // ERROR "invalid MOVL of m\+24\(FP\); map\[int\]int is 8-byte value" + MOVL f+32(FP), AX // ERROR "invalid MOVL of f\+32\(FP\); func\(\) is 8-byte value" + RET + +TEXT ·argstring(SB),0,$32 // ERROR "wrong argument size 0; expected \$\.\.\.-32" + MOVW x+0(FP), AX // ERROR "invalid MOVW of x\+0\(FP\); string base is 8-byte value" + MOVL x+0(FP), AX // ERROR "invalid MOVL of x\+0\(FP\); string base is 8-byte value" + MOVQ x+0(FP), AX + MOVW x_base+0(FP), AX // ERROR "invalid MOVW of x_base\+0\(FP\); string base is 8-byte value" + MOVL x_base+0(FP), AX // ERROR "invalid MOVL of x_base\+0\(FP\); string base is 8-byte value" + MOVQ x_base+0(FP), AX + MOVW x_len+0(FP), AX // ERROR "invalid offset x_len\+0\(FP\); expected x_len\+8\(FP\)" + MOVL x_len+0(FP), AX // ERROR "invalid offset x_len\+0\(FP\); expected x_len\+8\(FP\)" + MOVQ x_len+0(FP), AX // ERROR "invalid offset x_len\+0\(FP\); expected x_len\+8\(FP\)" + MOVW x_len+8(FP), AX // ERROR "invalid MOVW of x_len\+8\(FP\); string len is 8-byte value" + MOVL x_len+8(FP), AX // ERROR "invalid MOVL of x_len\+8\(FP\); string len is 8-byte value" + MOVQ x_len+8(FP), AX + MOVQ y+0(FP), AX // ERROR "invalid offset y\+0\(FP\); expected y\+16\(FP\)" + MOVQ y_len+8(FP), AX // ERROR "invalid offset y_len\+8\(FP\); expected y_len\+24\(FP\)" + RET + +TEXT ·argslice(SB),0,$48 // ERROR "wrong argument size 0; expected \$\.\.\.-48" + MOVW x+0(FP), AX // ERROR "invalid MOVW of x\+0\(FP\); slice base is 8-byte value" + MOVL x+0(FP), AX // ERROR "invalid MOVL of x\+0\(FP\); slice base is 8-byte value" + MOVQ x+0(FP), AX + MOVW x_base+0(FP), AX // ERROR "invalid MOVW of x_base\+0\(FP\); slice base is 8-byte value" + MOVL x_base+0(FP), AX // ERROR "invalid MOVL of x_base\+0\(FP\); slice base is 8-byte value" + MOVQ x_base+0(FP), AX + MOVW x_len+0(FP), AX // ERROR "invalid offset x_len\+0\(FP\); expected x_len\+8\(FP\)" + MOVL x_len+0(FP), AX // ERROR "invalid offset x_len\+0\(FP\); expected x_len\+8\(FP\)" + MOVQ x_len+0(FP), AX // ERROR "invalid offset x_len\+0\(FP\); expected x_len\+8\(FP\)" + MOVW x_len+8(FP), AX // ERROR "invalid MOVW of x_len\+8\(FP\); slice len is 8-byte value" + MOVL x_len+8(FP), AX // ERROR "invalid MOVL of x_len\+8\(FP\); slice len is 8-byte value" + MOVQ x_len+8(FP), AX + MOVW x_cap+0(FP), AX // ERROR "invalid offset x_cap\+0\(FP\); expected x_cap\+16\(FP\)" + MOVL x_cap+0(FP), AX // ERROR "invalid offset x_cap\+0\(FP\); expected x_cap\+16\(FP\)" + MOVQ x_cap+0(FP), AX // ERROR "invalid offset x_cap\+0\(FP\); expected x_cap\+16\(FP\)" + MOVW x_cap+16(FP), AX // ERROR "invalid MOVW of x_cap\+16\(FP\); slice cap is 8-byte value" + MOVL x_cap+16(FP), AX // ERROR "invalid MOVL of x_cap\+16\(FP\); slice cap is 8-byte value" + MOVQ x_cap+16(FP), AX + MOVQ y+0(FP), AX // ERROR "invalid offset y\+0\(FP\); expected y\+24\(FP\)" + MOVQ y_len+8(FP), AX // ERROR "invalid offset y_len\+8\(FP\); expected y_len\+32\(FP\)" + MOVQ y_cap+16(FP), AX // ERROR "invalid offset y_cap\+16\(FP\); expected y_cap\+40\(FP\)" + RET + +TEXT ·argiface(SB),0,$0-32 + MOVW x+0(FP), AX // ERROR "invalid MOVW of x\+0\(FP\); interface type is 8-byte value" + MOVL x+0(FP), AX // ERROR "invalid MOVL of x\+0\(FP\); interface type is 8-byte value" + MOVQ x+0(FP), AX + MOVW x_type+0(FP), AX // ERROR "invalid MOVW of x_type\+0\(FP\); interface type is 8-byte value" + MOVL x_type+0(FP), AX // ERROR "invalid MOVL of x_type\+0\(FP\); interface type is 8-byte value" + MOVQ x_type+0(FP), AX + MOVQ x_itable+0(FP), AX // ERROR "unknown variable x_itable; offset 0 is x_type\+0\(FP\)" + MOVQ x_itable+1(FP), AX // ERROR "unknown variable x_itable; offset 1 is x_type\+0\(FP\)" + MOVW x_data+0(FP), AX // ERROR "invalid offset x_data\+0\(FP\); expected x_data\+8\(FP\)" + MOVL x_data+0(FP), AX // ERROR "invalid offset x_data\+0\(FP\); expected x_data\+8\(FP\)" + MOVQ x_data+0(FP), AX // ERROR "invalid offset x_data\+0\(FP\); expected x_data\+8\(FP\)" + MOVW x_data+8(FP), AX // ERROR "invalid MOVW of x_data\+8\(FP\); interface data is 8-byte value" + MOVL x_data+8(FP), AX // ERROR "invalid MOVL of x_data\+8\(FP\); interface data is 8-byte value" + MOVQ x_data+8(FP), AX + MOVW y+16(FP), AX // ERROR "invalid MOVW of y\+16\(FP\); interface itable is 8-byte value" + MOVL y+16(FP), AX // ERROR "invalid MOVL of y\+16\(FP\); interface itable is 8-byte value" + MOVQ y+16(FP), AX + MOVW y_itable+16(FP), AX // ERROR "invalid MOVW of y_itable\+16\(FP\); interface itable is 8-byte value" + MOVL y_itable+16(FP), AX // ERROR "invalid MOVL of y_itable\+16\(FP\); interface itable is 8-byte value" + MOVQ y_itable+16(FP), AX + MOVQ y_type+16(FP), AX // ERROR "unknown variable y_type; offset 16 is y_itable\+16\(FP\)" + MOVW y_data+16(FP), AX // ERROR "invalid offset y_data\+16\(FP\); expected y_data\+24\(FP\)" + MOVL y_data+16(FP), AX // ERROR "invalid offset y_data\+16\(FP\); expected y_data\+24\(FP\)" + MOVQ y_data+16(FP), AX // ERROR "invalid offset y_data\+16\(FP\); expected y_data\+24\(FP\)" + MOVW y_data+24(FP), AX // ERROR "invalid MOVW of y_data\+24\(FP\); interface data is 8-byte value" + MOVL y_data+24(FP), AX // ERROR "invalid MOVL of y_data\+24\(FP\); interface data is 8-byte value" + MOVQ y_data+24(FP), AX + RET + +TEXT ·returnint(SB),0,$0-8 + MOVB AX, ret+0(FP) // ERROR "invalid MOVB of ret\+0\(FP\); int is 8-byte value" + MOVW AX, ret+0(FP) // ERROR "invalid MOVW of ret\+0\(FP\); int is 8-byte value" + MOVL AX, ret+0(FP) // ERROR "invalid MOVL of ret\+0\(FP\); int is 8-byte value" + MOVQ AX, ret+0(FP) + MOVQ AX, ret+1(FP) // ERROR "invalid offset ret\+1\(FP\); expected ret\+0\(FP\)" + MOVQ AX, r+0(FP) // ERROR "unknown variable r; offset 0 is ret\+0\(FP\)" + RET + +TEXT ·returnbyte(SB),0,$0-9 + MOVQ x+0(FP), AX + MOVB AX, ret+8(FP) + MOVW AX, ret+8(FP) // ERROR "invalid MOVW of ret\+8\(FP\); byte is 1-byte value" + MOVL AX, ret+8(FP) // ERROR "invalid MOVL of ret\+8\(FP\); byte is 1-byte value" + MOVQ AX, ret+8(FP) // ERROR "invalid MOVQ of ret\+8\(FP\); byte is 1-byte value" + MOVB AX, ret+7(FP) // ERROR "invalid offset ret\+7\(FP\); expected ret\+8\(FP\)" + RET + +TEXT ·returnnamed(SB),0,$0-41 + MOVB x+0(FP), AX + MOVQ AX, r1+8(FP) + MOVW AX, r2+16(FP) + MOVQ AX, r3+24(FP) + MOVQ AX, r3_base+24(FP) + MOVQ AX, r3_len+32(FP) + MOVB AX, r4+40(FP) + MOVL AX, r1+8(FP) // ERROR "invalid MOVL of r1\+8\(FP\); int is 8-byte value" + RET + +TEXT ·returnintmissing(SB),0,$0-8 + RET // ERROR "RET without writing to 8-byte ret\+0\(FP\)" diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/asm2.s b/vendor/golang.org/x/tools/cmd/vet/testdata/asm2.s new file mode 100644 index 0000000000..c33c02a70b --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/asm2.s @@ -0,0 +1,257 @@ +// Copyright 2013 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 386 +// +build vet_test + +TEXT ·arg1(SB),0,$0-2 + MOVB x+0(FP), AX + MOVB y+1(FP), BX + MOVW x+0(FP), AX // ERROR "\[386\] arg1: invalid MOVW of x\+0\(FP\); int8 is 1-byte value" + MOVW y+1(FP), AX // ERROR "invalid MOVW of y\+1\(FP\); uint8 is 1-byte value" + MOVL x+0(FP), AX // ERROR "invalid MOVL of x\+0\(FP\); int8 is 1-byte value" + MOVL y+1(FP), AX // ERROR "invalid MOVL of y\+1\(FP\); uint8 is 1-byte value" + MOVQ x+0(FP), AX // ERROR "invalid MOVQ of x\+0\(FP\); int8 is 1-byte value" + MOVQ y+1(FP), AX // ERROR "invalid MOVQ of y\+1\(FP\); uint8 is 1-byte value" + MOVB x+1(FP), AX // ERROR "invalid offset x\+1\(FP\); expected x\+0\(FP\)" + MOVB y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+1\(FP\)" + TESTB x+0(FP), AX + TESTB y+1(FP), BX + TESTW x+0(FP), AX // ERROR "invalid TESTW of x\+0\(FP\); int8 is 1-byte value" + TESTW y+1(FP), AX // ERROR "invalid TESTW of y\+1\(FP\); uint8 is 1-byte value" + TESTL x+0(FP), AX // ERROR "invalid TESTL of x\+0\(FP\); int8 is 1-byte value" + TESTL y+1(FP), AX // ERROR "invalid TESTL of y\+1\(FP\); uint8 is 1-byte value" + TESTQ x+0(FP), AX // ERROR "invalid TESTQ of x\+0\(FP\); int8 is 1-byte value" + TESTQ y+1(FP), AX // ERROR "invalid TESTQ of y\+1\(FP\); uint8 is 1-byte value" + TESTB x+1(FP), AX // ERROR "invalid offset x\+1\(FP\); expected x\+0\(FP\)" + TESTB y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+1\(FP\)" + MOVB 4(SP), AX // ERROR "4\(SP\) should be x\+0\(FP\)" + MOVB 5(SP), AX // ERROR "5\(SP\) should be y\+1\(FP\)" + MOVB 6(SP), AX // ERROR "use of 6\(SP\) points beyond argument frame" + RET + +TEXT ·arg2(SB),0,$0-4 + MOVB x+0(FP), AX // ERROR "arg2: invalid MOVB of x\+0\(FP\); int16 is 2-byte value" + MOVB y+2(FP), AX // ERROR "invalid MOVB of y\+2\(FP\); uint16 is 2-byte value" + MOVW x+0(FP), AX + MOVW y+2(FP), BX + MOVL x+0(FP), AX // ERROR "invalid MOVL of x\+0\(FP\); int16 is 2-byte value" + MOVL y+2(FP), AX // ERROR "invalid MOVL of y\+2\(FP\); uint16 is 2-byte value" + MOVQ x+0(FP), AX // ERROR "invalid MOVQ of x\+0\(FP\); int16 is 2-byte value" + MOVQ y+2(FP), AX // ERROR "invalid MOVQ of y\+2\(FP\); uint16 is 2-byte value" + MOVW x+2(FP), AX // ERROR "invalid offset x\+2\(FP\); expected x\+0\(FP\)" + MOVW y+0(FP), AX // ERROR "invalid offset y\+0\(FP\); expected y\+2\(FP\)" + TESTB x+0(FP), AX // ERROR "invalid TESTB of x\+0\(FP\); int16 is 2-byte value" + TESTB y+2(FP), AX // ERROR "invalid TESTB of y\+2\(FP\); uint16 is 2-byte value" + TESTW x+0(FP), AX + TESTW y+2(FP), BX + TESTL x+0(FP), AX // ERROR "invalid TESTL of x\+0\(FP\); int16 is 2-byte value" + TESTL y+2(FP), AX // ERROR "invalid TESTL of y\+2\(FP\); uint16 is 2-byte value" + TESTQ x+0(FP), AX // ERROR "invalid TESTQ of x\+0\(FP\); int16 is 2-byte value" + TESTQ y+2(FP), AX // ERROR "invalid TESTQ of y\+2\(FP\); uint16 is 2-byte value" + TESTW x+2(FP), AX // ERROR "invalid offset x\+2\(FP\); expected x\+0\(FP\)" + TESTW y+0(FP), AX // ERROR "invalid offset y\+0\(FP\); expected y\+2\(FP\)" + RET + +TEXT ·arg4(SB),0,$0-2 // ERROR "arg4: wrong argument size 2; expected \$\.\.\.-8" + MOVB x+0(FP), AX // ERROR "invalid MOVB of x\+0\(FP\); int32 is 4-byte value" + MOVB y+4(FP), BX // ERROR "invalid MOVB of y\+4\(FP\); uint32 is 4-byte value" + MOVW x+0(FP), AX // ERROR "invalid MOVW of x\+0\(FP\); int32 is 4-byte value" + MOVW y+4(FP), AX // ERROR "invalid MOVW of y\+4\(FP\); uint32 is 4-byte value" + MOVL x+0(FP), AX + MOVL y+4(FP), AX + MOVQ x+0(FP), AX // ERROR "invalid MOVQ of x\+0\(FP\); int32 is 4-byte value" + MOVQ y+4(FP), AX // ERROR "invalid MOVQ of y\+4\(FP\); uint32 is 4-byte value" + MOVL x+4(FP), AX // ERROR "invalid offset x\+4\(FP\); expected x\+0\(FP\)" + MOVL y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+4\(FP\)" + TESTB x+0(FP), AX // ERROR "invalid TESTB of x\+0\(FP\); int32 is 4-byte value" + TESTB y+4(FP), BX // ERROR "invalid TESTB of y\+4\(FP\); uint32 is 4-byte value" + TESTW x+0(FP), AX // ERROR "invalid TESTW of x\+0\(FP\); int32 is 4-byte value" + TESTW y+4(FP), AX // ERROR "invalid TESTW of y\+4\(FP\); uint32 is 4-byte value" + TESTL x+0(FP), AX + TESTL y+4(FP), AX + TESTQ x+0(FP), AX // ERROR "invalid TESTQ of x\+0\(FP\); int32 is 4-byte value" + TESTQ y+4(FP), AX // ERROR "invalid TESTQ of y\+4\(FP\); uint32 is 4-byte value" + TESTL x+4(FP), AX // ERROR "invalid offset x\+4\(FP\); expected x\+0\(FP\)" + TESTL y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+4\(FP\)" + RET + +TEXT ·arg8(SB),7,$0-2 // ERROR "wrong argument size 2; expected \$\.\.\.-16" + MOVB x+0(FP), AX // ERROR "invalid MOVB of x\+0\(FP\); int64 is 8-byte value" + MOVB y+8(FP), BX // ERROR "invalid MOVB of y\+8\(FP\); uint64 is 8-byte value" + MOVW x+0(FP), AX // ERROR "invalid MOVW of x\+0\(FP\); int64 is 8-byte value" + MOVW y+8(FP), AX // ERROR "invalid MOVW of y\+8\(FP\); uint64 is 8-byte value" + MOVL x+0(FP), AX // ERROR "invalid MOVL of x\+0\(FP\); int64 is 8-byte value containing x_lo\+0\(FP\) and x_hi\+4\(FP\)" + MOVL x_lo+0(FP), AX + MOVL x_hi+4(FP), AX + MOVL y+8(FP), AX // ERROR "invalid MOVL of y\+8\(FP\); uint64 is 8-byte value containing y_lo\+8\(FP\) and y_hi\+12\(FP\)" + MOVL y_lo+8(FP), AX + MOVL y_hi+12(FP), AX + MOVQ x+0(FP), AX + MOVQ y+8(FP), AX + MOVQ x+8(FP), AX // ERROR "invalid offset x\+8\(FP\); expected x\+0\(FP\)" + MOVQ y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+8\(FP\)" + TESTB x+0(FP), AX // ERROR "invalid TESTB of x\+0\(FP\); int64 is 8-byte value" + TESTB y+8(FP), BX // ERROR "invalid TESTB of y\+8\(FP\); uint64 is 8-byte value" + TESTW x+0(FP), AX // ERROR "invalid TESTW of x\+0\(FP\); int64 is 8-byte value" + TESTW y+8(FP), AX // ERROR "invalid TESTW of y\+8\(FP\); uint64 is 8-byte value" + TESTL x+0(FP), AX // ERROR "invalid TESTL of x\+0\(FP\); int64 is 8-byte value containing x_lo\+0\(FP\) and x_hi\+4\(FP\)" + TESTL y+8(FP), AX // ERROR "invalid TESTL of y\+8\(FP\); uint64 is 8-byte value containing y_lo\+8\(FP\) and y_hi\+12\(FP\)" + TESTQ x+0(FP), AX + TESTQ y+8(FP), AX + TESTQ x+8(FP), AX // ERROR "invalid offset x\+8\(FP\); expected x\+0\(FP\)" + TESTQ y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+8\(FP\)" + RET + +TEXT ·argint(SB),0,$0-2 // ERROR "wrong argument size 2; expected \$\.\.\.-8" + MOVB x+0(FP), AX // ERROR "invalid MOVB of x\+0\(FP\); int is 4-byte value" + MOVB y+4(FP), BX // ERROR "invalid MOVB of y\+4\(FP\); uint is 4-byte value" + MOVW x+0(FP), AX // ERROR "invalid MOVW of x\+0\(FP\); int is 4-byte value" + MOVW y+4(FP), AX // ERROR "invalid MOVW of y\+4\(FP\); uint is 4-byte value" + MOVL x+0(FP), AX + MOVL y+4(FP), AX + MOVQ x+0(FP), AX // ERROR "invalid MOVQ of x\+0\(FP\); int is 4-byte value" + MOVQ y+4(FP), AX // ERROR "invalid MOVQ of y\+4\(FP\); uint is 4-byte value" + MOVQ x+4(FP), AX // ERROR "invalid offset x\+4\(FP\); expected x\+0\(FP\)" + MOVQ y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+4\(FP\)" + TESTB x+0(FP), AX // ERROR "invalid TESTB of x\+0\(FP\); int is 4-byte value" + TESTB y+4(FP), BX // ERROR "invalid TESTB of y\+4\(FP\); uint is 4-byte value" + TESTW x+0(FP), AX // ERROR "invalid TESTW of x\+0\(FP\); int is 4-byte value" + TESTW y+4(FP), AX // ERROR "invalid TESTW of y\+4\(FP\); uint is 4-byte value" + TESTL x+0(FP), AX + TESTL y+4(FP), AX + TESTQ x+0(FP), AX // ERROR "invalid TESTQ of x\+0\(FP\); int is 4-byte value" + TESTQ y+4(FP), AX // ERROR "invalid TESTQ of y\+4\(FP\); uint is 4-byte value" + TESTQ x+4(FP), AX // ERROR "invalid offset x\+4\(FP\); expected x\+0\(FP\)" + TESTQ y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+4\(FP\)" + RET + +TEXT ·argptr(SB),7,$0-2 // ERROR "wrong argument size 2; expected \$\.\.\.-20" + MOVB x+0(FP), AX // ERROR "invalid MOVB of x\+0\(FP\); \*byte is 4-byte value" + MOVB y+4(FP), BX // ERROR "invalid MOVB of y\+4\(FP\); \*byte is 4-byte value" + MOVW x+0(FP), AX // ERROR "invalid MOVW of x\+0\(FP\); \*byte is 4-byte value" + MOVW y+4(FP), AX // ERROR "invalid MOVW of y\+4\(FP\); \*byte is 4-byte value" + MOVL x+0(FP), AX + MOVL y+4(FP), AX + MOVQ x+0(FP), AX // ERROR "invalid MOVQ of x\+0\(FP\); \*byte is 4-byte value" + MOVQ y+4(FP), AX // ERROR "invalid MOVQ of y\+4\(FP\); \*byte is 4-byte value" + MOVQ x+4(FP), AX // ERROR "invalid offset x\+4\(FP\); expected x\+0\(FP\)" + MOVQ y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+4\(FP\)" + TESTB x+0(FP), AX // ERROR "invalid TESTB of x\+0\(FP\); \*byte is 4-byte value" + TESTB y+4(FP), BX // ERROR "invalid TESTB of y\+4\(FP\); \*byte is 4-byte value" + TESTW x+0(FP), AX // ERROR "invalid TESTW of x\+0\(FP\); \*byte is 4-byte value" + TESTW y+4(FP), AX // ERROR "invalid TESTW of y\+4\(FP\); \*byte is 4-byte value" + TESTL x+0(FP), AX + TESTL y+4(FP), AX + TESTQ x+0(FP), AX // ERROR "invalid TESTQ of x\+0\(FP\); \*byte is 4-byte value" + TESTQ y+4(FP), AX // ERROR "invalid TESTQ of y\+4\(FP\); \*byte is 4-byte value" + TESTQ x+4(FP), AX // ERROR "invalid offset x\+4\(FP\); expected x\+0\(FP\)" + TESTQ y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+4\(FP\)" + MOVW c+8(FP), AX // ERROR "invalid MOVW of c\+8\(FP\); chan int is 4-byte value" + MOVW m+12(FP), AX // ERROR "invalid MOVW of m\+12\(FP\); map\[int\]int is 4-byte value" + MOVW f+16(FP), AX // ERROR "invalid MOVW of f\+16\(FP\); func\(\) is 4-byte value" + RET + +TEXT ·argstring(SB),0,$16 // ERROR "wrong argument size 0; expected \$\.\.\.-16" + MOVW x+0(FP), AX // ERROR "invalid MOVW of x\+0\(FP\); string base is 4-byte value" + MOVL x+0(FP), AX + MOVQ x+0(FP), AX // ERROR "invalid MOVQ of x\+0\(FP\); string base is 4-byte value" + MOVW x_base+0(FP), AX // ERROR "invalid MOVW of x_base\+0\(FP\); string base is 4-byte value" + MOVL x_base+0(FP), AX + MOVQ x_base+0(FP), AX // ERROR "invalid MOVQ of x_base\+0\(FP\); string base is 4-byte value" + MOVW x_len+0(FP), AX // ERROR "invalid offset x_len\+0\(FP\); expected x_len\+4\(FP\)" + MOVL x_len+0(FP), AX // ERROR "invalid offset x_len\+0\(FP\); expected x_len\+4\(FP\)" + MOVQ x_len+0(FP), AX // ERROR "invalid offset x_len\+0\(FP\); expected x_len\+4\(FP\)" + MOVW x_len+4(FP), AX // ERROR "invalid MOVW of x_len\+4\(FP\); string len is 4-byte value" + MOVL x_len+4(FP), AX + MOVQ x_len+4(FP), AX // ERROR "invalid MOVQ of x_len\+4\(FP\); string len is 4-byte value" + MOVQ y+0(FP), AX // ERROR "invalid offset y\+0\(FP\); expected y\+8\(FP\)" + MOVQ y_len+4(FP), AX // ERROR "invalid offset y_len\+4\(FP\); expected y_len\+12\(FP\)" + RET + +TEXT ·argslice(SB),0,$24 // ERROR "wrong argument size 0; expected \$\.\.\.-24" + MOVW x+0(FP), AX // ERROR "invalid MOVW of x\+0\(FP\); slice base is 4-byte value" + MOVL x+0(FP), AX + MOVQ x+0(FP), AX // ERROR "invalid MOVQ of x\+0\(FP\); slice base is 4-byte value" + MOVW x_base+0(FP), AX // ERROR "invalid MOVW of x_base\+0\(FP\); slice base is 4-byte value" + MOVL x_base+0(FP), AX + MOVQ x_base+0(FP), AX // ERROR "invalid MOVQ of x_base\+0\(FP\); slice base is 4-byte value" + MOVW x_len+0(FP), AX // ERROR "invalid offset x_len\+0\(FP\); expected x_len\+4\(FP\)" + MOVL x_len+0(FP), AX // ERROR "invalid offset x_len\+0\(FP\); expected x_len\+4\(FP\)" + MOVQ x_len+0(FP), AX // ERROR "invalid offset x_len\+0\(FP\); expected x_len\+4\(FP\)" + MOVW x_len+4(FP), AX // ERROR "invalid MOVW of x_len\+4\(FP\); slice len is 4-byte value" + MOVL x_len+4(FP), AX + MOVQ x_len+4(FP), AX // ERROR "invalid MOVQ of x_len\+4\(FP\); slice len is 4-byte value" + MOVW x_cap+0(FP), AX // ERROR "invalid offset x_cap\+0\(FP\); expected x_cap\+8\(FP\)" + MOVL x_cap+0(FP), AX // ERROR "invalid offset x_cap\+0\(FP\); expected x_cap\+8\(FP\)" + MOVQ x_cap+0(FP), AX // ERROR "invalid offset x_cap\+0\(FP\); expected x_cap\+8\(FP\)" + MOVW x_cap+8(FP), AX // ERROR "invalid MOVW of x_cap\+8\(FP\); slice cap is 4-byte value" + MOVL x_cap+8(FP), AX + MOVQ x_cap+8(FP), AX // ERROR "invalid MOVQ of x_cap\+8\(FP\); slice cap is 4-byte value" + MOVQ y+0(FP), AX // ERROR "invalid offset y\+0\(FP\); expected y\+12\(FP\)" + MOVQ y_len+4(FP), AX // ERROR "invalid offset y_len\+4\(FP\); expected y_len\+16\(FP\)" + MOVQ y_cap+8(FP), AX // ERROR "invalid offset y_cap\+8\(FP\); expected y_cap\+20\(FP\)" + RET + +TEXT ·argiface(SB),0,$0-16 + MOVW x+0(FP), AX // ERROR "invalid MOVW of x\+0\(FP\); interface type is 4-byte value" + MOVL x+0(FP), AX + MOVQ x+0(FP), AX // ERROR "invalid MOVQ of x\+0\(FP\); interface type is 4-byte value" + MOVW x_type+0(FP), AX // ERROR "invalid MOVW of x_type\+0\(FP\); interface type is 4-byte value" + MOVL x_type+0(FP), AX + MOVQ x_type+0(FP), AX // ERROR "invalid MOVQ of x_type\+0\(FP\); interface type is 4-byte value" + MOVQ x_itable+0(FP), AX // ERROR "unknown variable x_itable; offset 0 is x_type\+0\(FP\)" + MOVQ x_itable+1(FP), AX // ERROR "unknown variable x_itable; offset 1 is x_type\+0\(FP\)" + MOVW x_data+0(FP), AX // ERROR "invalid offset x_data\+0\(FP\); expected x_data\+4\(FP\)" + MOVL x_data+0(FP), AX // ERROR "invalid offset x_data\+0\(FP\); expected x_data\+4\(FP\)" + MOVQ x_data+0(FP), AX // ERROR "invalid offset x_data\+0\(FP\); expected x_data\+4\(FP\)" + MOVW x_data+4(FP), AX // ERROR "invalid MOVW of x_data\+4\(FP\); interface data is 4-byte value" + MOVL x_data+4(FP), AX + MOVQ x_data+4(FP), AX // ERROR "invalid MOVQ of x_data\+4\(FP\); interface data is 4-byte value" + MOVW y+8(FP), AX // ERROR "invalid MOVW of y\+8\(FP\); interface itable is 4-byte value" + MOVL y+8(FP), AX + MOVQ y+8(FP), AX // ERROR "invalid MOVQ of y\+8\(FP\); interface itable is 4-byte value" + MOVW y_itable+8(FP), AX // ERROR "invalid MOVW of y_itable\+8\(FP\); interface itable is 4-byte value" + MOVL y_itable+8(FP), AX + MOVQ y_itable+8(FP), AX // ERROR "invalid MOVQ of y_itable\+8\(FP\); interface itable is 4-byte value" + MOVQ y_type+8(FP), AX // ERROR "unknown variable y_type; offset 8 is y_itable\+8\(FP\)" + MOVW y_data+8(FP), AX // ERROR "invalid offset y_data\+8\(FP\); expected y_data\+12\(FP\)" + MOVL y_data+8(FP), AX // ERROR "invalid offset y_data\+8\(FP\); expected y_data\+12\(FP\)" + MOVQ y_data+8(FP), AX // ERROR "invalid offset y_data\+8\(FP\); expected y_data\+12\(FP\)" + MOVW y_data+12(FP), AX // ERROR "invalid MOVW of y_data\+12\(FP\); interface data is 4-byte value" + MOVL y_data+12(FP), AX + MOVQ y_data+12(FP), AX // ERROR "invalid MOVQ of y_data\+12\(FP\); interface data is 4-byte value" + RET + +TEXT ·returnint(SB),0,$0-4 + MOVB AX, ret+0(FP) // ERROR "invalid MOVB of ret\+0\(FP\); int is 4-byte value" + MOVW AX, ret+0(FP) // ERROR "invalid MOVW of ret\+0\(FP\); int is 4-byte value" + MOVL AX, ret+0(FP) + MOVQ AX, ret+0(FP) // ERROR "invalid MOVQ of ret\+0\(FP\); int is 4-byte value" + MOVQ AX, ret+1(FP) // ERROR "invalid offset ret\+1\(FP\); expected ret\+0\(FP\)" + MOVQ AX, r+0(FP) // ERROR "unknown variable r; offset 0 is ret\+0\(FP\)" + RET + +TEXT ·returnbyte(SB),0,$0-5 + MOVL x+0(FP), AX + MOVB AX, ret+4(FP) + MOVW AX, ret+4(FP) // ERROR "invalid MOVW of ret\+4\(FP\); byte is 1-byte value" + MOVL AX, ret+4(FP) // ERROR "invalid MOVL of ret\+4\(FP\); byte is 1-byte value" + MOVQ AX, ret+4(FP) // ERROR "invalid MOVQ of ret\+4\(FP\); byte is 1-byte value" + MOVB AX, ret+3(FP) // ERROR "invalid offset ret\+3\(FP\); expected ret\+4\(FP\)" + RET + +TEXT ·returnnamed(SB),0,$0-21 + MOVB x+0(FP), AX + MOVL AX, r1+4(FP) + MOVW AX, r2+8(FP) + MOVL AX, r3+12(FP) + MOVL AX, r3_base+12(FP) + MOVL AX, r3_len+16(FP) + MOVB AX, r4+20(FP) + MOVQ AX, r1+4(FP) // ERROR "invalid MOVQ of r1\+4\(FP\); int is 4-byte value" + RET + +TEXT ·returnintmissing(SB),0,$0-4 + RET // ERROR "RET without writing to 4-byte ret\+0\(FP\)" diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/asm3.s b/vendor/golang.org/x/tools/cmd/vet/testdata/asm3.s new file mode 100644 index 0000000000..3d69356a0f --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/asm3.s @@ -0,0 +1,178 @@ +// Copyright 2013 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 arm +// +build vet_test + +TEXT ·arg1(SB),0,$0-2 + MOVB x+0(FP), AX + MOVB y+1(FP), BX + MOVH x+0(FP), AX // ERROR "\[arm\] arg1: invalid MOVH of x\+0\(FP\); int8 is 1-byte value" + MOVH y+1(FP), AX // ERROR "invalid MOVH of y\+1\(FP\); uint8 is 1-byte value" + MOVW x+0(FP), AX // ERROR "invalid MOVW of x\+0\(FP\); int8 is 1-byte value" + MOVW y+1(FP), AX // ERROR "invalid MOVW of y\+1\(FP\); uint8 is 1-byte value" + MOVB x+1(FP), AX // ERROR "invalid offset x\+1\(FP\); expected x\+0\(FP\)" + MOVB y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+1\(FP\)" + MOVB 8(R13), AX // ERROR "8\(R13\) should be x\+0\(FP\)" + MOVB 9(R13), AX // ERROR "9\(R13\) should be y\+1\(FP\)" + MOVB 10(R13), AX // ERROR "use of 10\(R13\) points beyond argument frame" + RET + +TEXT ·arg2(SB),0,$0-4 + MOVB x+0(FP), AX // ERROR "arg2: invalid MOVB of x\+0\(FP\); int16 is 2-byte value" + MOVB y+2(FP), AX // ERROR "invalid MOVB of y\+2\(FP\); uint16 is 2-byte value" + MOVH x+0(FP), AX + MOVH y+2(FP), BX + MOVW x+0(FP), AX // ERROR "invalid MOVW of x\+0\(FP\); int16 is 2-byte value" + MOVW y+2(FP), AX // ERROR "invalid MOVW of y\+2\(FP\); uint16 is 2-byte value" + MOVH x+2(FP), AX // ERROR "invalid offset x\+2\(FP\); expected x\+0\(FP\)" + MOVH y+0(FP), AX // ERROR "invalid offset y\+0\(FP\); expected y\+2\(FP\)" + RET + +TEXT ·arg4(SB),0,$0-2 // ERROR "arg4: wrong argument size 2; expected \$\.\.\.-8" + MOVB x+0(FP), AX // ERROR "invalid MOVB of x\+0\(FP\); int32 is 4-byte value" + MOVB y+4(FP), BX // ERROR "invalid MOVB of y\+4\(FP\); uint32 is 4-byte value" + MOVH x+0(FP), AX // ERROR "invalid MOVH of x\+0\(FP\); int32 is 4-byte value" + MOVH y+4(FP), AX // ERROR "invalid MOVH of y\+4\(FP\); uint32 is 4-byte value" + MOVW x+0(FP), AX + MOVW y+4(FP), AX + MOVW x+4(FP), AX // ERROR "invalid offset x\+4\(FP\); expected x\+0\(FP\)" + MOVW y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+4\(FP\)" + RET + +TEXT ·arg8(SB),7,$0-2 // ERROR "wrong argument size 2; expected \$\.\.\.-16" + MOVB x+0(FP), AX // ERROR "invalid MOVB of x\+0\(FP\); int64 is 8-byte value" + MOVB y+8(FP), BX // ERROR "invalid MOVB of y\+8\(FP\); uint64 is 8-byte value" + MOVH x+0(FP), AX // ERROR "invalid MOVH of x\+0\(FP\); int64 is 8-byte value" + MOVH y+8(FP), AX // ERROR "invalid MOVH of y\+8\(FP\); uint64 is 8-byte value" + MOVW x+0(FP), AX // ERROR "invalid MOVW of x\+0\(FP\); int64 is 8-byte value containing x_lo\+0\(FP\) and x_hi\+4\(FP\)" + MOVW x_lo+0(FP), AX + MOVW x_hi+4(FP), AX + MOVW y+8(FP), AX // ERROR "invalid MOVW of y\+8\(FP\); uint64 is 8-byte value containing y_lo\+8\(FP\) and y_hi\+12\(FP\)" + MOVW y_lo+8(FP), AX + MOVW y_hi+12(FP), AX + MOVQ x+0(FP), AX + MOVQ y+8(FP), AX + MOVQ x+8(FP), AX // ERROR "invalid offset x\+8\(FP\); expected x\+0\(FP\)" + MOVQ y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+8\(FP\)" + RET + +TEXT ·argint(SB),0,$0-2 // ERROR "wrong argument size 2; expected \$\.\.\.-8" + MOVB x+0(FP), AX // ERROR "invalid MOVB of x\+0\(FP\); int is 4-byte value" + MOVB y+4(FP), BX // ERROR "invalid MOVB of y\+4\(FP\); uint is 4-byte value" + MOVH x+0(FP), AX // ERROR "invalid MOVH of x\+0\(FP\); int is 4-byte value" + MOVH y+4(FP), AX // ERROR "invalid MOVH of y\+4\(FP\); uint is 4-byte value" + MOVW x+0(FP), AX + MOVW y+4(FP), AX + MOVQ x+4(FP), AX // ERROR "invalid offset x\+4\(FP\); expected x\+0\(FP\)" + MOVQ y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+4\(FP\)" + RET + +TEXT ·argptr(SB),7,$0-2 // ERROR "wrong argument size 2; expected \$\.\.\.-20" + MOVB x+0(FP), AX // ERROR "invalid MOVB of x\+0\(FP\); \*byte is 4-byte value" + MOVB y+4(FP), BX // ERROR "invalid MOVB of y\+4\(FP\); \*byte is 4-byte value" + MOVH x+0(FP), AX // ERROR "invalid MOVH of x\+0\(FP\); \*byte is 4-byte value" + MOVH y+4(FP), AX // ERROR "invalid MOVH of y\+4\(FP\); \*byte is 4-byte value" + MOVW x+0(FP), AX + MOVW y+4(FP), AX + MOVQ x+4(FP), AX // ERROR "invalid offset x\+4\(FP\); expected x\+0\(FP\)" + MOVQ y+2(FP), AX // ERROR "invalid offset y\+2\(FP\); expected y\+4\(FP\)" + MOVH c+8(FP), AX // ERROR "invalid MOVH of c\+8\(FP\); chan int is 4-byte value" + MOVH m+12(FP), AX // ERROR "invalid MOVH of m\+12\(FP\); map\[int\]int is 4-byte value" + MOVH f+16(FP), AX // ERROR "invalid MOVH of f\+16\(FP\); func\(\) is 4-byte value" + RET + +TEXT ·argstring(SB),0,$16 // ERROR "wrong argument size 0; expected \$\.\.\.-16" + MOVH x+0(FP), AX // ERROR "invalid MOVH of x\+0\(FP\); string base is 4-byte value" + MOVW x+0(FP), AX + MOVH x_base+0(FP), AX // ERROR "invalid MOVH of x_base\+0\(FP\); string base is 4-byte value" + MOVW x_base+0(FP), AX + MOVH x_len+0(FP), AX // ERROR "invalid offset x_len\+0\(FP\); expected x_len\+4\(FP\)" + MOVW x_len+0(FP), AX // ERROR "invalid offset x_len\+0\(FP\); expected x_len\+4\(FP\)" + MOVQ x_len+0(FP), AX // ERROR "invalid offset x_len\+0\(FP\); expected x_len\+4\(FP\)" + MOVH x_len+4(FP), AX // ERROR "invalid MOVH of x_len\+4\(FP\); string len is 4-byte value" + MOVW x_len+4(FP), AX + MOVQ y+0(FP), AX // ERROR "invalid offset y\+0\(FP\); expected y\+8\(FP\)" + MOVQ y_len+4(FP), AX // ERROR "invalid offset y_len\+4\(FP\); expected y_len\+12\(FP\)" + RET + +TEXT ·argslice(SB),0,$24 // ERROR "wrong argument size 0; expected \$\.\.\.-24" + MOVH x+0(FP), AX // ERROR "invalid MOVH of x\+0\(FP\); slice base is 4-byte value" + MOVW x+0(FP), AX + MOVH x_base+0(FP), AX // ERROR "invalid MOVH of x_base\+0\(FP\); slice base is 4-byte value" + MOVW x_base+0(FP), AX + MOVH x_len+0(FP), AX // ERROR "invalid offset x_len\+0\(FP\); expected x_len\+4\(FP\)" + MOVW x_len+0(FP), AX // ERROR "invalid offset x_len\+0\(FP\); expected x_len\+4\(FP\)" + MOVQ x_len+0(FP), AX // ERROR "invalid offset x_len\+0\(FP\); expected x_len\+4\(FP\)" + MOVH x_len+4(FP), AX // ERROR "invalid MOVH of x_len\+4\(FP\); slice len is 4-byte value" + MOVW x_len+4(FP), AX + MOVH x_cap+0(FP), AX // ERROR "invalid offset x_cap\+0\(FP\); expected x_cap\+8\(FP\)" + MOVW x_cap+0(FP), AX // ERROR "invalid offset x_cap\+0\(FP\); expected x_cap\+8\(FP\)" + MOVQ x_cap+0(FP), AX // ERROR "invalid offset x_cap\+0\(FP\); expected x_cap\+8\(FP\)" + MOVH x_cap+8(FP), AX // ERROR "invalid MOVH of x_cap\+8\(FP\); slice cap is 4-byte value" + MOVW x_cap+8(FP), AX + MOVQ y+0(FP), AX // ERROR "invalid offset y\+0\(FP\); expected y\+12\(FP\)" + MOVQ y_len+4(FP), AX // ERROR "invalid offset y_len\+4\(FP\); expected y_len\+16\(FP\)" + MOVQ y_cap+8(FP), AX // ERROR "invalid offset y_cap\+8\(FP\); expected y_cap\+20\(FP\)" + RET + +TEXT ·argiface(SB),0,$0-16 + MOVH x+0(FP), AX // ERROR "invalid MOVH of x\+0\(FP\); interface type is 4-byte value" + MOVW x+0(FP), AX + MOVH x_type+0(FP), AX // ERROR "invalid MOVH of x_type\+0\(FP\); interface type is 4-byte value" + MOVW x_type+0(FP), AX + MOVQ x_itable+0(FP), AX // ERROR "unknown variable x_itable; offset 0 is x_type\+0\(FP\)" + MOVQ x_itable+1(FP), AX // ERROR "unknown variable x_itable; offset 1 is x_type\+0\(FP\)" + MOVH x_data+0(FP), AX // ERROR "invalid offset x_data\+0\(FP\); expected x_data\+4\(FP\)" + MOVW x_data+0(FP), AX // ERROR "invalid offset x_data\+0\(FP\); expected x_data\+4\(FP\)" + MOVQ x_data+0(FP), AX // ERROR "invalid offset x_data\+0\(FP\); expected x_data\+4\(FP\)" + MOVH x_data+4(FP), AX // ERROR "invalid MOVH of x_data\+4\(FP\); interface data is 4-byte value" + MOVW x_data+4(FP), AX + MOVH y+8(FP), AX // ERROR "invalid MOVH of y\+8\(FP\); interface itable is 4-byte value" + MOVW y+8(FP), AX + MOVH y_itable+8(FP), AX // ERROR "invalid MOVH of y_itable\+8\(FP\); interface itable is 4-byte value" + MOVW y_itable+8(FP), AX + MOVQ y_type+8(FP), AX // ERROR "unknown variable y_type; offset 8 is y_itable\+8\(FP\)" + MOVH y_data+8(FP), AX // ERROR "invalid offset y_data\+8\(FP\); expected y_data\+12\(FP\)" + MOVW y_data+8(FP), AX // ERROR "invalid offset y_data\+8\(FP\); expected y_data\+12\(FP\)" + MOVQ y_data+8(FP), AX // ERROR "invalid offset y_data\+8\(FP\); expected y_data\+12\(FP\)" + MOVH y_data+12(FP), AX // ERROR "invalid MOVH of y_data\+12\(FP\); interface data is 4-byte value" + MOVW y_data+12(FP), AX + RET + +TEXT ·returnint(SB),0,$0-4 + MOVB AX, ret+0(FP) // ERROR "invalid MOVB of ret\+0\(FP\); int is 4-byte value" + MOVH AX, ret+0(FP) // ERROR "invalid MOVH of ret\+0\(FP\); int is 4-byte value" + MOVW AX, ret+0(FP) + MOVQ AX, ret+1(FP) // ERROR "invalid offset ret\+1\(FP\); expected ret\+0\(FP\)" + MOVQ AX, r+0(FP) // ERROR "unknown variable r; offset 0 is ret\+0\(FP\)" + RET + +TEXT ·returnbyte(SB),0,$0-5 + MOVW x+0(FP), AX + MOVB AX, ret+4(FP) + MOVH AX, ret+4(FP) // ERROR "invalid MOVH of ret\+4\(FP\); byte is 1-byte value" + MOVW AX, ret+4(FP) // ERROR "invalid MOVW of ret\+4\(FP\); byte is 1-byte value" + MOVB AX, ret+3(FP) // ERROR "invalid offset ret\+3\(FP\); expected ret\+4\(FP\)" + RET + +TEXT ·returnnamed(SB),0,$0-21 + MOVB x+0(FP), AX + MOVW AX, r1+4(FP) + MOVH AX, r2+8(FP) + MOVW AX, r3+12(FP) + MOVW AX, r3_base+12(FP) + MOVW AX, r3_len+16(FP) + MOVB AX, r4+20(FP) + MOVB AX, r1+4(FP) // ERROR "invalid MOVB of r1\+4\(FP\); int is 4-byte value" + RET + +TEXT ·returnintmissing(SB),0,$0-4 + RET // ERROR "RET without writing to 4-byte ret\+0\(FP\)" + +TEXT ·leaf(SB),0,$-4-12 + MOVW x+0(FP), AX + MOVW y+4(FP), AX + MOVW AX, ret+8(FP) + RET diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/asm4.s b/vendor/golang.org/x/tools/cmd/vet/testdata/asm4.s new file mode 100644 index 0000000000..044b050b6b --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/asm4.s @@ -0,0 +1,26 @@ +// Copyright 2013 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 amd64 +// +build vet_test + +// Test cases for symbolic NOSPLIT etc. on TEXT symbols. + +TEXT ·noprof(SB),NOPROF,$0-8 + RET + +TEXT ·dupok(SB),DUPOK,$0-8 + RET + +TEXT ·nosplit(SB),NOSPLIT,$0 + RET + +TEXT ·rodata(SB),RODATA,$0-8 + RET + +TEXT ·noptr(SB),NOPTR|NOSPLIT,$0 + RET + +TEXT ·wrapper(SB),WRAPPER,$0-8 + RET diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/assign.go b/vendor/golang.org/x/tools/cmd/vet/testdata/assign.go new file mode 100644 index 0000000000..32ba8683c1 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/assign.go @@ -0,0 +1,18 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains tests for the useless-assignment checker. + +package testdata + +type ST struct { + x int +} + +func (s *ST) SetX(x int) { + // Accidental self-assignment; it should be "s.x = x" + x = x // ERROR "self-assignment of x to x" + // Another mistake + s.x = s.x // ERROR "self-assignment of s.x to s.x" +} diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/atomic.go b/vendor/golang.org/x/tools/cmd/vet/testdata/atomic.go new file mode 100644 index 0000000000..1ba261d941 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/atomic.go @@ -0,0 +1,43 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains tests for the atomic checker. + +package testdata + +import ( + "sync/atomic" +) + +type Counter uint64 + +func AtomicTests() { + x := uint64(1) + x = atomic.AddUint64(&x, 1) // ERROR "direct assignment to atomic value" + _, x = 10, atomic.AddUint64(&x, 1) // ERROR "direct assignment to atomic value" + x, _ = atomic.AddUint64(&x, 1), 10 // ERROR "direct assignment to atomic value" + + y := &x + *y = atomic.AddUint64(y, 1) // ERROR "direct assignment to atomic value" + + var su struct{ Counter uint64 } + su.Counter = atomic.AddUint64(&su.Counter, 1) // ERROR "direct assignment to atomic value" + z1 := atomic.AddUint64(&su.Counter, 1) + _ = z1 // Avoid err "z declared and not used" + + var sp struct{ Counter *uint64 } + *sp.Counter = atomic.AddUint64(sp.Counter, 1) // ERROR "direct assignment to atomic value" + z2 := atomic.AddUint64(sp.Counter, 1) + _ = z2 // Avoid err "z declared and not used" + + au := []uint64{10, 20} + au[0] = atomic.AddUint64(&au[0], 1) // ERROR "direct assignment to atomic value" + au[1] = atomic.AddUint64(&au[0], 1) + + ap := []*uint64{&au[0], &au[1]} + *ap[0] = atomic.AddUint64(ap[0], 1) // ERROR "direct assignment to atomic value" + *ap[1] = atomic.AddUint64(ap[0], 1) + + x = atomic.AddUint64() // Used to make vet crash; now silently ignored. +} diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/bool.go b/vendor/golang.org/x/tools/cmd/vet/testdata/bool.go new file mode 100644 index 0000000000..af6cc011dd --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/bool.go @@ -0,0 +1,113 @@ +// 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. + +// This file contains tests for the bool checker. + +package testdata + +import "io" + +func RatherStupidConditions() { + var f, g func() int + if f() == 0 || f() == 0 { // OK f might have side effects + } + if v, w := f(), g(); v == w || v == w { // ERROR "redundant or: v == w || v == w" + } + _ = f == nil || f == nil // ERROR "redundant or: f == nil || f == nil" + + _ = i == byte(1) || i == byte(1) // TODO conversions are treated as if they may have side effects + + var c chan int + _ = 0 == <-c || 0 == <-c // OK subsequent receives may yield different values + for i, j := <-c, <-c; i == j || i == j; i, j = <-c, <-c { // ERROR "redundant or: i == j || i == j" + } + + var i, j, k int + _ = i+1 == 1 || i+1 == 1 // ERROR "redundant or: i\+1 == 1 || i\+1 == 1" + _ = i == 1 || j+1 == i || i == 1 // ERROR "redundant or: i == 1 || i == 1" + + _ = i == 1 || i == 1 || f() == 1 // ERROR "redundant or: i == 1 || i == 1" + _ = i == 1 || f() == 1 || i == 1 // OK f may alter i as a side effect + _ = f() == 1 || i == 1 || i == 1 // ERROR "redundant or: i == 1 || i == 1" + + // Test partition edge cases + _ = f() == 1 || i == 1 || i == 1 || j == 1 // ERROR "redundant or: i == 1 || i == 1" + _ = f() == 1 || j == 1 || i == 1 || i == 1 // ERROR "redundant or: i == 1 || i == 1" + _ = i == 1 || f() == 1 || i == 1 || i == 1 // ERROR "redundant or: i == 1 || i == 1" + _ = i == 1 || i == 1 || f() == 1 || i == 1 // ERROR "redundant or: i == 1 || i == 1" + _ = i == 1 || i == 1 || j == 1 || f() == 1 // ERROR "redundant or: i == 1 || i == 1" + _ = j == 1 || i == 1 || i == 1 || f() == 1 // ERROR "redundant or: i == 1 || i == 1" + _ = i == 1 || f() == 1 || f() == 1 || i == 1 + + _ = i == 1 || (i == 1 || i == 2) // ERROR "redundant or: i == 1 || i == 1" + _ = i == 1 || (f() == 1 || i == 1) // OK f may alter i as a side effect + _ = i == 1 || (i == 1 || f() == 1) // ERROR "redundant or: i == 1 || i == 1" + _ = i == 1 || (i == 2 || (i == 1 || i == 3)) // ERROR "redundant or: i == 1 || i == 1" + + var a, b bool + _ = i == 1 || (a || (i == 1 || b)) // ERROR "redundant or: i == 1 || i == 1" + + // Check that all redundant ors are flagged + _ = j == 0 || + i == 1 || + f() == 1 || + j == 0 || // ERROR "redundant or: j == 0 || j == 0" + i == 1 || // ERROR "redundant or: i == 1 || i == 1" + i == 1 || // ERROR "redundant or: i == 1 || i == 1" + i == 1 || + j == 0 || + k == 0 + + _ = i == 1*2*3 || i == 1*2*3 // ERROR "redundant or: i == 1\*2\*3 || i == 1\*2\*3" + + // These test that redundant, suspect expressions do not trigger multiple errors. + _ = i != 0 || i != 0 // ERROR "redundant or: i != 0 || i != 0" + _ = i == 0 && i == 0 // ERROR "redundant and: i == 0 && i == 0" + + // and is dual to or; check the basics and + // let the or tests pull the rest of the weight. + _ = 0 != <-c && 0 != <-c // OK subsequent receives may yield different values + _ = f() != 0 && f() != 0 // OK f might have side effects + _ = f != nil && f != nil // ERROR "redundant and: f != nil && f != nil" + _ = i != 1 && i != 1 && f() != 1 // ERROR "redundant and: i != 1 && i != 1" + _ = i != 1 && f() != 1 && i != 1 // OK f may alter i as a side effect + _ = f() != 1 && i != 1 && i != 1 // ERROR "redundant and: i != 1 && i != 1" +} + +func RoyallySuspectConditions() { + var i, j int + + _ = i == 0 || i == 1 // OK + _ = i != 0 || i != 1 // ERROR "suspect or: i != 0 || i != 1" + _ = i != 0 || 1 != i // ERROR "suspect or: i != 0 || 1 != i" + _ = 0 != i || 1 != i // ERROR "suspect or: 0 != i || 1 != i" + _ = 0 != i || i != 1 // ERROR "suspect or: 0 != i || i != 1" + + _ = (0 != i) || i != 1 // ERROR "suspect or: 0 != i || i != 1" + + _ = i+3 != 7 || j+5 == 0 || i+3 != 9 // ERROR "suspect or: i\+3 != 7 || i\+3 != 9" + + _ = i != 0 || j == 0 || i != 1 // ERROR "suspect or: i != 0 || i != 1" + + _ = i != 0 || i != 1<<4 // ERROR "suspect or: i != 0 || i != 1<<4" + + _ = i != 0 || j != 0 + _ = 0 != i || 0 != j + + var s string + _ = s != "one" || s != "the other" // ERROR "suspect or: s != .one. || s != .the other." + + _ = "et" != "alii" || "et" != "cetera" // ERROR "suspect or: .et. != .alii. || .et. != .cetera." + _ = "me gustas" != "tu" || "le gustas" != "tu" // OK we could catch this case, but it's not worth the code + + var err error + _ = err != nil || err != io.EOF // TODO catch this case? + + // Sanity check and. + _ = i != 0 && i != 1 // OK + _ = i == 0 && i == 1 // ERROR "suspect and: i == 0 && i == 1" + _ = i == 0 && 1 == i // ERROR "suspect and: i == 0 && 1 == i" + _ = 0 == i && 1 == i // ERROR "suspect and: 0 == i && 1 == i" + _ = 0 == i && i == 1 // ERROR "suspect and: 0 == i && i == 1" +} diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/buildtag.go b/vendor/golang.org/x/tools/cmd/vet/testdata/buildtag.go new file mode 100644 index 0000000000..eb36fd3259 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/buildtag.go @@ -0,0 +1,14 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains tests for the buildtag checker. + +// +builder // ERROR "possible malformed \+build comment" +// +build !ignore + +package testdata + +// +build toolate // ERROR "build comment must appear before package clause and be followed by a blank line" + +var _ = 3 diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/buildtag_bad.go b/vendor/golang.org/x/tools/cmd/vet/testdata/buildtag_bad.go new file mode 100644 index 0000000000..fbe10cf748 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/buildtag_bad.go @@ -0,0 +1,15 @@ +// This file contains misplaced or malformed build constraints. +// The Go tool will skip it, because the constraints are invalid. +// It serves only to test the tag checker during make test. + +// Mention +build // ERROR "possible malformed \+build comment" + +// +build !!bang // ERROR "invalid double negative in build constraint" +// +build @#$ // ERROR "invalid non-alphanumeric build constraint" + +// +build toolate // ERROR "build comment must appear before package clause and be followed by a blank line" +package bad + +// This is package 'bad' rather than 'main' so the erroneous build +// tag doesn't end up looking like a package doc for the vet command +// when examined by godoc. diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/composite.go b/vendor/golang.org/x/tools/cmd/vet/testdata/composite.go new file mode 100644 index 0000000000..69e7d7ccb0 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/composite.go @@ -0,0 +1,63 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains tests for the untagged struct literal checker. + +// This file contains the test for untagged struct literals. + +package testdata + +import ( + "flag" + "go/scanner" +) + +var Okay1 = []string{ + "Name", + "Usage", + "DefValue", +} + +var Okay2 = map[string]bool{ + "Name": true, + "Usage": true, + "DefValue": true, +} + +var Okay3 = struct { + X string + Y string + Z string +}{ + "Name", + "Usage", + "DefValue", +} + +type MyStruct struct { + X string + Y string + Z string +} + +var Okay4 = MyStruct{ + "Name", + "Usage", + "DefValue", +} + +// Testing is awkward because we need to reference things from a separate package +// to trigger the warnings. + +var BadStructLiteralUsedInTests = flag.Flag{ // ERROR "unkeyed fields" + "Name", + "Usage", + nil, // Value + "DefValue", +} + +// Used to test the check for slices and arrays: If that test is disabled and +// vet is run with --compositewhitelist=false, this line triggers an error. +// Clumsy but sufficient. +var scannerErrorListTest = scanner.ErrorList{nil, nil} diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/copylock_func.go b/vendor/golang.org/x/tools/cmd/vet/testdata/copylock_func.go new file mode 100644 index 0000000000..108c044209 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/copylock_func.go @@ -0,0 +1,90 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains tests for the copylock checker's +// function declaration analysis. + +package testdata + +import "sync" + +func OkFunc(*sync.Mutex) {} +func BadFunc(sync.Mutex) {} // ERROR "BadFunc passes Lock by value: sync.Mutex" +func OkRet() *sync.Mutex {} +func BadRet() sync.Mutex {} // ERROR "BadRet returns Lock by value: sync.Mutex" + +type EmbeddedRWMutex struct { + sync.RWMutex +} + +func (*EmbeddedRWMutex) OkMeth() {} +func (EmbeddedRWMutex) BadMeth() {} // ERROR "BadMeth passes Lock by value: testdata.EmbeddedRWMutex" +func OkFunc(e *EmbeddedRWMutex) {} +func BadFunc(EmbeddedRWMutex) {} // ERROR "BadFunc passes Lock by value: testdata.EmbeddedRWMutex" +func OkRet() *EmbeddedRWMutex {} +func BadRet() EmbeddedRWMutex {} // ERROR "BadRet returns Lock by value: testdata.EmbeddedRWMutex" + +type FieldMutex struct { + s sync.Mutex +} + +func (*FieldMutex) OkMeth() {} +func (FieldMutex) BadMeth() {} // ERROR "BadMeth passes Lock by value: testdata.FieldMutex contains sync.Mutex" +func OkFunc(*FieldMutex) {} +func BadFunc(FieldMutex, int) {} // ERROR "BadFunc passes Lock by value: testdata.FieldMutex contains sync.Mutex" + +type L0 struct { + L1 +} + +type L1 struct { + l L2 +} + +type L2 struct { + sync.Mutex +} + +func (*L0) Ok() {} +func (L0) Bad() {} // ERROR "Bad passes Lock by value: testdata.L0 contains testdata.L1 contains testdata.L2" + +type EmbeddedMutexPointer struct { + s *sync.Mutex // safe to copy this pointer +} + +func (*EmbeddedMutexPointer) Ok() {} +func (EmbeddedMutexPointer) AlsoOk() {} +func StillOk(EmbeddedMutexPointer) {} +func LookinGood() EmbeddedMutexPointer {} + +type EmbeddedLocker struct { + sync.Locker // safe to copy interface values +} + +func (*EmbeddedLocker) Ok() {} +func (EmbeddedLocker) AlsoOk() {} + +type CustomLock struct{} + +func (*CustomLock) Lock() {} +func (*CustomLock) Unlock() {} + +func Ok(*CustomLock) {} +func Bad(CustomLock) {} // ERROR "Bad passes Lock by value: testdata.CustomLock" + +// TODO: Unfortunate cases + +// Non-ideal error message: +// Since we're looking for Lock methods, sync.Once's underlying +// sync.Mutex gets called out, but without any reference to the sync.Once. +type LocalOnce sync.Once + +func (LocalOnce) Bad() {} // ERROR "Bad passes Lock by value: testdata.LocalOnce contains sync.Mutex" + +// False negative: +// LocalMutex doesn't have a Lock method. +// Nevertheless, it is probably a bad idea to pass it by value. +type LocalMutex sync.Mutex + +func (LocalMutex) Bad() {} // WANTED: An error here :( diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/copylock_range.go b/vendor/golang.org/x/tools/cmd/vet/testdata/copylock_range.go new file mode 100644 index 0000000000..f95b0252b6 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/copylock_range.go @@ -0,0 +1,67 @@ +// 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. + +// This file contains tests for the copylock checker's +// range statement analysis. + +package testdata + +import "sync" + +func rangeMutex() { + var mu sync.Mutex + var i int + + var s []sync.Mutex + for range s { + } + for i = range s { + } + for i := range s { + } + for i, _ = range s { + } + for i, _ := range s { + } + for _, mu = range s { // ERROR "range var mu copies Lock: sync.Mutex" + } + for _, m := range s { // ERROR "range var m copies Lock: sync.Mutex" + } + for i, mu = range s { // ERROR "range var mu copies Lock: sync.Mutex" + } + for i, m := range s { // ERROR "range var m copies Lock: sync.Mutex" + } + + var a [3]sync.Mutex + for _, m := range a { // ERROR "range var m copies Lock: sync.Mutex" + } + + var m map[sync.Mutex]sync.Mutex + for k := range m { // ERROR "range var k copies Lock: sync.Mutex" + } + for mu, _ = range m { // ERROR "range var mu copies Lock: sync.Mutex" + } + for k, _ := range m { // ERROR "range var k copies Lock: sync.Mutex" + } + for _, mu = range m { // ERROR "range var mu copies Lock: sync.Mutex" + } + for _, v := range m { // ERROR "range var v copies Lock: sync.Mutex" + } + + var c chan sync.Mutex + for range c { + } + for mu = range c { // ERROR "range var mu copies Lock: sync.Mutex" + } + for v := range c { // ERROR "range var v copies Lock: sync.Mutex" + } + + // Test non-idents in range variables + var t struct { + i int + mu sync.Mutex + } + for t.i, t.mu = range s { // ERROR "range var t.mu copies Lock: sync.Mutex" + } +} diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/deadcode.go b/vendor/golang.org/x/tools/cmd/vet/testdata/deadcode.go new file mode 100644 index 0000000000..5370bc32f6 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/deadcode.go @@ -0,0 +1,2125 @@ +// Copyright 2013 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 + +// This file contains tests for the dead code checker. + +package testdata + +type T int + +var x interface{} +var c chan int + +func external() int // ok + +func _() int { +} + +func _() int { + print(1) +} + +func _() int { + print(1) + return 2 + println() // ERROR "unreachable code" +} + +func _() int { +L: + print(1) + goto L + println() // ERROR "unreachable code" +} + +func _() int { + print(1) + panic(2) + println() // ERROR "unreachable code" +} + +// but only builtin panic +func _() int { + var panic = func(int) {} + print(1) + panic(2) + println() // ok +} + +func _() int { + { + print(1) + return 2 + println() // ERROR "unreachable code" + } + println() // ok +} + +func _() int { + { + print(1) + return 2 + } + println() // ERROR "unreachable code" +} + +func _() int { +L: + { + print(1) + goto L + println() // ERROR "unreachable code" + } + println() // ok +} + +func _() int { +L: + { + print(1) + goto L + } + println() // ERROR "unreachable code" +} + +func _() int { + print(1) + { + panic(2) + } +} + +func _() int { + print(1) + { + panic(2) + println() // ERROR "unreachable code" + } +} + +func _() int { + print(1) + { + panic(2) + } + println() // ERROR "unreachable code" +} + +func _() int { + print(1) + return 2 + { // ERROR "unreachable code" + } +} + +func _() int { +L: + print(1) + goto L + { // ERROR "unreachable code" + } +} + +func _() int { + print(1) + panic(2) + { // ERROR "unreachable code" + } +} + +func _() int { + { + print(1) + return 2 + { // ERROR "unreachable code" + } + } +} + +func _() int { +L: + { + print(1) + goto L + { // ERROR "unreachable code" + } + } +} + +func _() int { + print(1) + { + panic(2) + { // ERROR "unreachable code" + } + } +} + +func _() int { + { + print(1) + return 2 + } + { // ERROR "unreachable code" + } +} + +func _() int { +L: + { + print(1) + goto L + } + { // ERROR "unreachable code" + } +} + +func _() int { + print(1) + { + panic(2) + } + { // ERROR "unreachable code" + } +} + +func _() int { + print(1) + if x == nil { + panic(2) + } else { + panic(3) + } + println() // ERROR "unreachable code" +} + +func _() int { +L: + print(1) + if x == nil { + panic(2) + } else { + goto L + } + println() // ERROR "unreachable code" +} + +func _() int { +L: + print(1) + if x == nil { + panic(2) + } else if x == 1 { + return 0 + } else if x != 2 { + panic(3) + } else { + goto L + } + println() // ERROR "unreachable code" +} + +// if-else chain missing final else is not okay, even if the +// conditions cover every possible case. + +func _() int { + print(1) + if x == nil { + panic(2) + } else if x != nil { + panic(3) + } + println() // ok +} + +func _() int { + print(1) + if x == nil { + panic(2) + } + println() // ok +} + +func _() int { +L: + print(1) + if x == nil { + panic(2) + } else if x == 1 { + return 0 + } else if x != 1 { + panic(3) + } + println() // ok +} + +func _() int { + print(1) + for { + } + println() // ERROR "unreachable code" +} + +func _() int { + for { + for { + break + } + } + println() // ERROR "unreachable code" +} + +func _() int { + for { + for { + break + println() // ERROR "unreachable code" + } + } +} + +func _() int { + for { + for { + continue + println() // ERROR "unreachable code" + } + } +} + +func _() int { + for { + L: + for { + break L + } + } + println() // ERROR "unreachable code" +} + +func _() int { + print(1) + for { + break + } + println() // ok +} + +func _() int { + for { + for { + } + break // ERROR "unreachable code" + } + println() // ok +} + +func _() int { +L: + for { + for { + break L + } + } + println() // ok +} + +func _() int { + print(1) + for x == nil { + } + println() // ok +} + +func _() int { + for x == nil { + for { + break + } + } + println() // ok +} + +func _() int { + for x == nil { + L: + for { + break L + } + } + println() // ok +} + +func _() int { + print(1) + for true { + } + println() // ok +} + +func _() int { + for true { + for { + break + } + } + println() // ok +} + +func _() int { + for true { + L: + for { + break L + } + } + println() // ok +} + +func _() int { + print(1) + select {} + println() // ERROR "unreachable code" +} + +func _() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + println() // ERROR "unreachable code" + } +} + +func _() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + } + println() // ERROR "unreachable code" +} + +func _() int { + print(1) + select { + case <-c: + print(2) + for { + } + println() // ERROR "unreachable code" + } +} + +func _() int { + print(1) + select { + case <-c: + print(2) + for { + } + } + println() // ERROR "unreachable code" +} + +func _() int { +L: + print(1) + select { + case <-c: + print(2) + panic("abc") + println() // ERROR "unreachable code" + case c <- 1: + print(2) + goto L + println() // ERROR "unreachable code" + } +} + +func _() int { +L: + print(1) + select { + case <-c: + print(2) + panic("abc") + case c <- 1: + print(2) + goto L + } + println() // ERROR "unreachable code" +} + +func _() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + println() // ERROR "unreachable code" + default: + select {} + println() // ERROR "unreachable code" + } +} + +func _() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + default: + select {} + } + println() // ERROR "unreachable code" +} + +func _() int { + print(1) + select { + case <-c: + print(2) + } + println() // ok +} + +func _() int { +L: + print(1) + select { + case <-c: + print(2) + panic("abc") + goto L // ERROR "unreachable code" + case c <- 1: + print(2) + } + println() // ok +} + +func _() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + default: + print(2) + } + println() // ok +} + +func _() int { + print(1) + select { + default: + break + } + println() // ok +} + +func _() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + break // ERROR "unreachable code" + } + println() // ok +} + +func _() int { + print(1) +L: + select { + case <-c: + print(2) + for { + break L + } + } + println() // ok +} + +func _() int { + print(1) +L: + select { + case <-c: + print(2) + panic("abc") + case c <- 1: + print(2) + break L + } + println() // ok +} + +func _() int { + print(1) + select { + case <-c: + print(1) + panic("abc") + default: + select {} + break // ERROR "unreachable code" + } + println() // ok +} + +func _() int { + print(1) + switch x { + case 1: + print(2) + panic(3) + println() // ERROR "unreachable code" + default: + return 4 + println() // ERROR "unreachable code" + } +} + +func _() int { + print(1) + switch x { + case 1: + print(2) + panic(3) + default: + return 4 + } + println() // ERROR "unreachable code" +} + +func _() int { + print(1) + switch x { + default: + return 4 + println() // ERROR "unreachable code" + case 1: + print(2) + panic(3) + println() // ERROR "unreachable code" + } +} + +func _() int { + print(1) + switch x { + default: + return 4 + case 1: + print(2) + panic(3) + } + println() // ERROR "unreachable code" +} + +func _() int { + print(1) + switch x { + case 1: + print(2) + fallthrough + default: + return 4 + println() // ERROR "unreachable code" + } +} + +func _() int { + print(1) + switch x { + case 1: + print(2) + fallthrough + default: + return 4 + } + println() // ERROR "unreachable code" +} + +func _() int { + print(1) + switch { + } + println() // ok +} + +func _() int { + print(1) + switch x { + case 1: + print(2) + panic(3) + case 2: + return 4 + } + println() // ok +} + +func _() int { + print(1) + switch x { + case 2: + return 4 + case 1: + print(2) + panic(3) + } + println() // ok +} + +func _() int { + print(1) + switch x { + case 1: + print(2) + fallthrough + case 2: + return 4 + } + println() // ok +} + +func _() int { + print(1) + switch x { + case 1: + print(2) + panic(3) + } + println() // ok +} + +func _() int { + print(1) +L: + switch x { + case 1: + print(2) + panic(3) + break L // ERROR "unreachable code" + default: + return 4 + } + println() // ok +} + +func _() int { + print(1) + switch x { + default: + return 4 + break // ERROR "unreachable code" + case 1: + print(2) + panic(3) + } + println() // ok +} + +func _() int { + print(1) +L: + switch x { + case 1: + print(2) + for { + break L + } + default: + return 4 + } + println() // ok +} + +func _() int { + print(1) + switch x.(type) { + case int: + print(2) + panic(3) + println() // ERROR "unreachable code" + default: + return 4 + println() // ERROR "unreachable code" + } +} + +func _() int { + print(1) + switch x.(type) { + case int: + print(2) + panic(3) + default: + return 4 + } + println() // ERROR "unreachable code" +} + +func _() int { + print(1) + switch x.(type) { + default: + return 4 + println() // ERROR "unreachable code" + case int: + print(2) + panic(3) + println() // ERROR "unreachable code" + } +} + +func _() int { + print(1) + switch x.(type) { + default: + return 4 + case int: + print(2) + panic(3) + } + println() // ERROR "unreachable code" +} + +func _() int { + print(1) + switch x.(type) { + case int: + print(2) + fallthrough + default: + return 4 + println() // ERROR "unreachable code" + } +} + +func _() int { + print(1) + switch x.(type) { + case int: + print(2) + fallthrough + default: + return 4 + } + println() // ERROR "unreachable code" +} + +func _() int { + print(1) + switch { + } + println() // ok +} + +func _() int { + print(1) + switch x.(type) { + case int: + print(2) + panic(3) + case float64: + return 4 + } + println() // ok +} + +func _() int { + print(1) + switch x.(type) { + case float64: + return 4 + case int: + print(2) + panic(3) + } + println() // ok +} + +func _() int { + print(1) + switch x.(type) { + case int: + print(2) + fallthrough + case float64: + return 4 + } + println() // ok +} + +func _() int { + print(1) + switch x.(type) { + case int: + print(2) + panic(3) + } + println() // ok +} + +func _() int { + print(1) +L: + switch x.(type) { + case int: + print(2) + panic(3) + break L // ERROR "unreachable code" + default: + return 4 + } + println() // ok +} + +func _() int { + print(1) + switch x.(type) { + default: + return 4 + break // ERROR "unreachable code" + case int: + print(2) + panic(3) + } + println() // ok +} + +func _() int { + print(1) +L: + switch x.(type) { + case int: + print(2) + for { + break L + } + default: + return 4 + } + println() // ok +} + +// again, but without the leading print(1). +// testing that everything works when the terminating statement is first. + +func _() int { + println() // ok +} + +func _() int { + return 2 + println() // ERROR "unreachable code" +} + +func _() int { +L: + goto L + println() // ERROR "unreachable code" +} + +func _() int { + panic(2) + println() // ERROR "unreachable code" +} + +// but only builtin panic +func _() int { + var panic = func(int) {} + panic(2) + println() // ok +} + +func _() int { + { + return 2 + println() // ERROR "unreachable code" + } +} + +func _() int { + { + return 2 + } + println() // ERROR "unreachable code" +} + +func _() int { +L: + { + goto L + println() // ERROR "unreachable code" + } +} + +func _() int { +L: + { + goto L + } + println() // ERROR "unreachable code" +} + +func _() int { + { + panic(2) + println() // ERROR "unreachable code" + } +} + +func _() int { + { + panic(2) + } + println() // ERROR "unreachable code" +} + +func _() int { + return 2 + { // ERROR "unreachable code" + } + println() // ok +} + +func _() int { +L: + goto L + { // ERROR "unreachable code" + } + println() // ok +} + +func _() int { + panic(2) + { // ERROR "unreachable code" + } + println() // ok +} + +func _() int { + { + return 2 + { // ERROR "unreachable code" + } + } + println() // ok +} + +func _() int { +L: + { + goto L + { // ERROR "unreachable code" + } + } + println() // ok +} + +func _() int { + { + panic(2) + { // ERROR "unreachable code" + } + } + println() // ok +} + +func _() int { + { + return 2 + } + { // ERROR "unreachable code" + } + println() // ok +} + +func _() int { +L: + { + goto L + } + { // ERROR "unreachable code" + } + println() // ok +} + +func _() int { + { + panic(2) + } + { // ERROR "unreachable code" + } + println() // ok +} + +// again, with func literals + +var _ = func() int { +} + +var _ = func() int { + print(1) +} + +var _ = func() int { + print(1) + return 2 + println() // ERROR "unreachable code" +} + +var _ = func() int { +L: + print(1) + goto L + println() // ERROR "unreachable code" +} + +var _ = func() int { + print(1) + panic(2) + println() // ERROR "unreachable code" +} + +// but only builtin panic +var _ = func() int { + var panic = func(int) {} + print(1) + panic(2) + println() // ok +} + +var _ = func() int { + { + print(1) + return 2 + println() // ERROR "unreachable code" + } + println() // ok +} + +var _ = func() int { + { + print(1) + return 2 + } + println() // ERROR "unreachable code" +} + +var _ = func() int { +L: + { + print(1) + goto L + println() // ERROR "unreachable code" + } + println() // ok +} + +var _ = func() int { +L: + { + print(1) + goto L + } + println() // ERROR "unreachable code" +} + +var _ = func() int { + print(1) + { + panic(2) + } +} + +var _ = func() int { + print(1) + { + panic(2) + println() // ERROR "unreachable code" + } +} + +var _ = func() int { + print(1) + { + panic(2) + } + println() // ERROR "unreachable code" +} + +var _ = func() int { + print(1) + return 2 + { // ERROR "unreachable code" + } +} + +var _ = func() int { +L: + print(1) + goto L + { // ERROR "unreachable code" + } +} + +var _ = func() int { + print(1) + panic(2) + { // ERROR "unreachable code" + } +} + +var _ = func() int { + { + print(1) + return 2 + { // ERROR "unreachable code" + } + } +} + +var _ = func() int { +L: + { + print(1) + goto L + { // ERROR "unreachable code" + } + } +} + +var _ = func() int { + print(1) + { + panic(2) + { // ERROR "unreachable code" + } + } +} + +var _ = func() int { + { + print(1) + return 2 + } + { // ERROR "unreachable code" + } +} + +var _ = func() int { +L: + { + print(1) + goto L + } + { // ERROR "unreachable code" + } +} + +var _ = func() int { + print(1) + { + panic(2) + } + { // ERROR "unreachable code" + } +} + +var _ = func() int { + print(1) + if x == nil { + panic(2) + } else { + panic(3) + } + println() // ERROR "unreachable code" +} + +var _ = func() int { +L: + print(1) + if x == nil { + panic(2) + } else { + goto L + } + println() // ERROR "unreachable code" +} + +var _ = func() int { +L: + print(1) + if x == nil { + panic(2) + } else if x == 1 { + return 0 + } else if x != 2 { + panic(3) + } else { + goto L + } + println() // ERROR "unreachable code" +} + +// if-else chain missing final else is not okay, even if the +// conditions cover every possible case. + +var _ = func() int { + print(1) + if x == nil { + panic(2) + } else if x != nil { + panic(3) + } + println() // ok +} + +var _ = func() int { + print(1) + if x == nil { + panic(2) + } + println() // ok +} + +var _ = func() int { +L: + print(1) + if x == nil { + panic(2) + } else if x == 1 { + return 0 + } else if x != 1 { + panic(3) + } + println() // ok +} + +var _ = func() int { + print(1) + for { + } + println() // ERROR "unreachable code" +} + +var _ = func() int { + for { + for { + break + } + } + println() // ERROR "unreachable code" +} + +var _ = func() int { + for { + for { + break + println() // ERROR "unreachable code" + } + } +} + +var _ = func() int { + for { + for { + continue + println() // ERROR "unreachable code" + } + } +} + +var _ = func() int { + for { + L: + for { + break L + } + } + println() // ERROR "unreachable code" +} + +var _ = func() int { + print(1) + for { + break + } + println() // ok +} + +var _ = func() int { + for { + for { + } + break // ERROR "unreachable code" + } + println() // ok +} + +var _ = func() int { +L: + for { + for { + break L + } + } + println() // ok +} + +var _ = func() int { + print(1) + for x == nil { + } + println() // ok +} + +var _ = func() int { + for x == nil { + for { + break + } + } + println() // ok +} + +var _ = func() int { + for x == nil { + L: + for { + break L + } + } + println() // ok +} + +var _ = func() int { + print(1) + for true { + } + println() // ok +} + +var _ = func() int { + for true { + for { + break + } + } + println() // ok +} + +var _ = func() int { + for true { + L: + for { + break L + } + } + println() // ok +} + +var _ = func() int { + print(1) + select {} + println() // ERROR "unreachable code" +} + +var _ = func() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + println() // ERROR "unreachable code" + } +} + +var _ = func() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + } + println() // ERROR "unreachable code" +} + +var _ = func() int { + print(1) + select { + case <-c: + print(2) + for { + } + println() // ERROR "unreachable code" + } +} + +var _ = func() int { + print(1) + select { + case <-c: + print(2) + for { + } + } + println() // ERROR "unreachable code" +} + +var _ = func() int { +L: + print(1) + select { + case <-c: + print(2) + panic("abc") + println() // ERROR "unreachable code" + case c <- 1: + print(2) + goto L + println() // ERROR "unreachable code" + } +} + +var _ = func() int { +L: + print(1) + select { + case <-c: + print(2) + panic("abc") + case c <- 1: + print(2) + goto L + } + println() // ERROR "unreachable code" +} + +var _ = func() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + println() // ERROR "unreachable code" + default: + select {} + println() // ERROR "unreachable code" + } +} + +var _ = func() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + default: + select {} + } + println() // ERROR "unreachable code" +} + +var _ = func() int { + print(1) + select { + case <-c: + print(2) + } + println() // ok +} + +var _ = func() int { +L: + print(1) + select { + case <-c: + print(2) + panic("abc") + goto L // ERROR "unreachable code" + case c <- 1: + print(2) + } + println() // ok +} + +var _ = func() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + default: + print(2) + } + println() // ok +} + +var _ = func() int { + print(1) + select { + default: + break + } + println() // ok +} + +var _ = func() int { + print(1) + select { + case <-c: + print(2) + panic("abc") + break // ERROR "unreachable code" + } + println() // ok +} + +var _ = func() int { + print(1) +L: + select { + case <-c: + print(2) + for { + break L + } + } + println() // ok +} + +var _ = func() int { + print(1) +L: + select { + case <-c: + print(2) + panic("abc") + case c <- 1: + print(2) + break L + } + println() // ok +} + +var _ = func() int { + print(1) + select { + case <-c: + print(1) + panic("abc") + default: + select {} + break // ERROR "unreachable code" + } + println() // ok +} + +var _ = func() int { + print(1) + switch x { + case 1: + print(2) + panic(3) + println() // ERROR "unreachable code" + default: + return 4 + println() // ERROR "unreachable code" + } +} + +var _ = func() int { + print(1) + switch x { + case 1: + print(2) + panic(3) + default: + return 4 + } + println() // ERROR "unreachable code" +} + +var _ = func() int { + print(1) + switch x { + default: + return 4 + println() // ERROR "unreachable code" + case 1: + print(2) + panic(3) + println() // ERROR "unreachable code" + } +} + +var _ = func() int { + print(1) + switch x { + default: + return 4 + case 1: + print(2) + panic(3) + } + println() // ERROR "unreachable code" +} + +var _ = func() int { + print(1) + switch x { + case 1: + print(2) + fallthrough + default: + return 4 + println() // ERROR "unreachable code" + } +} + +var _ = func() int { + print(1) + switch x { + case 1: + print(2) + fallthrough + default: + return 4 + } + println() // ERROR "unreachable code" +} + +var _ = func() int { + print(1) + switch { + } + println() // ok +} + +var _ = func() int { + print(1) + switch x { + case 1: + print(2) + panic(3) + case 2: + return 4 + } + println() // ok +} + +var _ = func() int { + print(1) + switch x { + case 2: + return 4 + case 1: + print(2) + panic(3) + } + println() // ok +} + +var _ = func() int { + print(1) + switch x { + case 1: + print(2) + fallthrough + case 2: + return 4 + } + println() // ok +} + +var _ = func() int { + print(1) + switch x { + case 1: + print(2) + panic(3) + } + println() // ok +} + +var _ = func() int { + print(1) +L: + switch x { + case 1: + print(2) + panic(3) + break L // ERROR "unreachable code" + default: + return 4 + } + println() // ok +} + +var _ = func() int { + print(1) + switch x { + default: + return 4 + break // ERROR "unreachable code" + case 1: + print(2) + panic(3) + } + println() // ok +} + +var _ = func() int { + print(1) +L: + switch x { + case 1: + print(2) + for { + break L + } + default: + return 4 + } + println() // ok +} + +var _ = func() int { + print(1) + switch x.(type) { + case int: + print(2) + panic(3) + println() // ERROR "unreachable code" + default: + return 4 + println() // ERROR "unreachable code" + } +} + +var _ = func() int { + print(1) + switch x.(type) { + case int: + print(2) + panic(3) + default: + return 4 + } + println() // ERROR "unreachable code" +} + +var _ = func() int { + print(1) + switch x.(type) { + default: + return 4 + println() // ERROR "unreachable code" + case int: + print(2) + panic(3) + println() // ERROR "unreachable code" + } +} + +var _ = func() int { + print(1) + switch x.(type) { + default: + return 4 + case int: + print(2) + panic(3) + } + println() // ERROR "unreachable code" +} + +var _ = func() int { + print(1) + switch x.(type) { + case int: + print(2) + fallthrough + default: + return 4 + println() // ERROR "unreachable code" + } +} + +var _ = func() int { + print(1) + switch x.(type) { + case int: + print(2) + fallthrough + default: + return 4 + } + println() // ERROR "unreachable code" +} + +var _ = func() int { + print(1) + switch { + } + println() // ok +} + +var _ = func() int { + print(1) + switch x.(type) { + case int: + print(2) + panic(3) + case float64: + return 4 + } + println() // ok +} + +var _ = func() int { + print(1) + switch x.(type) { + case float64: + return 4 + case int: + print(2) + panic(3) + } + println() // ok +} + +var _ = func() int { + print(1) + switch x.(type) { + case int: + print(2) + fallthrough + case float64: + return 4 + } + println() // ok +} + +var _ = func() int { + print(1) + switch x.(type) { + case int: + print(2) + panic(3) + } + println() // ok +} + +var _ = func() int { + print(1) +L: + switch x.(type) { + case int: + print(2) + panic(3) + break L // ERROR "unreachable code" + default: + return 4 + } + println() // ok +} + +var _ = func() int { + print(1) + switch x.(type) { + default: + return 4 + break // ERROR "unreachable code" + case int: + print(2) + panic(3) + } + println() // ok +} + +var _ = func() int { + print(1) +L: + switch x.(type) { + case int: + print(2) + for { + break L + } + default: + return 4 + } + println() // ok +} + +// again, but without the leading print(1). +// testing that everything works when the terminating statement is first. + +var _ = func() int { + println() // ok +} + +var _ = func() int { + return 2 + println() // ERROR "unreachable code" +} + +var _ = func() int { +L: + goto L + println() // ERROR "unreachable code" +} + +var _ = func() int { + panic(2) + println() // ERROR "unreachable code" +} + +// but only builtin panic +var _ = func() int { + var panic = func(int) {} + panic(2) + println() // ok +} + +var _ = func() int { + { + return 2 + println() // ERROR "unreachable code" + } +} + +var _ = func() int { + { + return 2 + } + println() // ERROR "unreachable code" +} + +var _ = func() int { +L: + { + goto L + println() // ERROR "unreachable code" + } +} + +var _ = func() int { +L: + { + goto L + } + println() // ERROR "unreachable code" +} + +var _ = func() int { + { + panic(2) + println() // ERROR "unreachable code" + } +} + +var _ = func() int { + { + panic(2) + } + println() // ERROR "unreachable code" +} + +var _ = func() int { + return 2 + { // ERROR "unreachable code" + } + println() // ok +} + +var _ = func() int { +L: + goto L + { // ERROR "unreachable code" + } + println() // ok +} + +var _ = func() int { + panic(2) + { // ERROR "unreachable code" + } + println() // ok +} + +var _ = func() int { + { + return 2 + { // ERROR "unreachable code" + } + } + println() // ok +} + +var _ = func() int { +L: + { + goto L + { // ERROR "unreachable code" + } + } + println() // ok +} + +var _ = func() int { + { + panic(2) + { // ERROR "unreachable code" + } + } + println() // ok +} + +var _ = func() int { + { + return 2 + } + { // ERROR "unreachable code" + } + println() // ok +} + +var _ = func() int { +L: + { + goto L + } + { // ERROR "unreachable code" + } + println() // ok +} + +var _ = func() int { + { + panic(2) + } + { // ERROR "unreachable code" + } + println() // ok +} + +var _ = func() { + // goto without label used to panic + goto +} diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/divergent/buf.go b/vendor/golang.org/x/tools/cmd/vet/testdata/divergent/buf.go new file mode 100644 index 0000000000..0efe0f838d --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/divergent/buf.go @@ -0,0 +1,17 @@ +// Test of examples with divergent packages. + +// Package buf ... +package buf + +// Buf is a ... +type Buf []byte + +// Append ... +func (*Buf) Append([]byte) {} + +func (Buf) Reset() {} + +func (Buf) Len() int { return 0 } + +// DefaultBuf is a ... +var DefaultBuf Buf diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/divergent/buf_test.go b/vendor/golang.org/x/tools/cmd/vet/testdata/divergent/buf_test.go new file mode 100644 index 0000000000..6b9cba3f01 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/divergent/buf_test.go @@ -0,0 +1,35 @@ +// Test of examples with divergent packages. + +package buf_test + +func Example() {} // OK because is package-level. + +func Example_suffix() // OK because refers to suffix annotation. + +func Example_BadSuffix() // ERROR "Example_BadSuffix has malformed example suffix: BadSuffix" + +func ExampleBuf() // OK because refers to known top-level type. + +func ExampleBuf_Append() {} // OK because refers to known method. + +func ExampleBuf_Clear() {} // ERROR "ExampleBuf_Clear refers to unknown field or method: Buf.Clear" + +func ExampleBuf_suffix() {} // OK because refers to suffix annotation. + +func ExampleBuf_Append_Bad() {} // ERROR "ExampleBuf_Append_Bad has malformed example suffix: Bad" + +func ExampleBuf_Append_suffix() {} // OK because refers to known method with valid suffix. + +func ExampleDefaultBuf() {} // OK because refers to top-level identifier. + +func ExampleBuf_Reset() bool { return true } // ERROR "ExampleBuf_Reset should return nothing" + +func ExampleBuf_Len(i int) {} // ERROR "ExampleBuf_Len should be niladic" + +// "Puffer" is German for "Buffer". + +func ExamplePuffer() // ERROR "ExamplePuffer refers to unknown identifier: Puffer" + +func ExamplePuffer_Append() // ERROR "ExamplePuffer_Append refers to unknown identifier: Puffer" + +func ExamplePuffer_suffix() // ERROR "ExamplePuffer_suffix refers to unknown identifier: Puffer" diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/examples_test.go b/vendor/golang.org/x/tools/cmd/vet/testdata/examples_test.go new file mode 100644 index 0000000000..9c53672a7d --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/examples_test.go @@ -0,0 +1,48 @@ +// Test of examples. + +package testdata + +// Buf is a ... +type Buf []byte + +// Append ... +func (*Buf) Append([]byte) {} + +func (Buf) Reset() {} + +func (Buf) Len() int { return 0 } + +// DefaultBuf is a ... +var DefaultBuf Buf + +func Example() {} // OK because is package-level. + +func Example_goodSuffix() // OK because refers to suffix annotation. + +func Example_BadSuffix() // ERROR "Example_BadSuffix has malformed example suffix: BadSuffix" + +func ExampleBuf() // OK because refers to known top-level type. + +func ExampleBuf_Append() {} // OK because refers to known method. + +func ExampleBuf_Clear() {} // ERROR "ExampleBuf_Clear refers to unknown field or method: Buf.Clear" + +func ExampleBuf_suffix() {} // OK because refers to suffix annotation. + +func ExampleBuf_Append_Bad() {} // ERROR "ExampleBuf_Append_Bad has malformed example suffix: Bad" + +func ExampleBuf_Append_suffix() {} // OK because refers to known method with valid suffix. + +func ExampleDefaultBuf() {} // OK because refers to top-level identifier. + +func ExampleBuf_Reset() bool { return true } // ERROR "ExampleBuf_Reset should return nothing" + +func ExampleBuf_Len(i int) {} // ERROR "ExampleBuf_Len should be niladic" + +// "Puffer" is German for "Buffer". + +func ExamplePuffer() // ERROR "ExamplePuffer refers to unknown identifier: Puffer" + +func ExamplePuffer_Append() // ERROR "ExamplePuffer_Append refers to unknown identifier: Puffer" + +func ExamplePuffer_suffix() // ERROR "ExamplePuffer_suffix refers to unknown identifier: Puffer" diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/incomplete/examples_test.go b/vendor/golang.org/x/tools/cmd/vet/testdata/incomplete/examples_test.go new file mode 100644 index 0000000000..445502b39e --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/incomplete/examples_test.go @@ -0,0 +1,33 @@ +// Test of examples. + +package testdata + +func Example() {} // OK because is package-level. + +func Example_suffix() // OK because refers to suffix annotation. + +func Example_BadSuffix() // OK because non-test package was excluded. No false positives wanted. + +func ExampleBuf() // OK because non-test package was excluded. No false positives wanted. + +func ExampleBuf_Append() {} // OK because non-test package was excluded. No false positives wanted. + +func ExampleBuf_Clear() {} // OK because non-test package was excluded. No false positives wanted. + +func ExampleBuf_suffix() {} // OK because refers to suffix annotation. + +func ExampleBuf_Append_Bad() {} // OK because non-test package was excluded. No false positives wanted. + +func ExampleBuf_Append_suffix() {} // OK because refers to known method with valid suffix. + +func ExampleBuf_Reset() bool { return true } // ERROR "ExampleBuf_Reset should return nothing" + +func ExampleBuf_Len(i int) {} // ERROR "ExampleBuf_Len should be niladic" + +// "Puffer" is German for "Buffer". + +func ExamplePuffer() // OK because non-test package was excluded. No false positives wanted. + +func ExamplePuffer_Append() // OK because non-test package was excluded. No false positives wanted. + +func ExamplePuffer_suffix() // OK because non-test package was excluded. No false positives wanted. diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/method.go b/vendor/golang.org/x/tools/cmd/vet/testdata/method.go new file mode 100644 index 0000000000..52b500df27 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/method.go @@ -0,0 +1,22 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains tests for the canonical method checker. + +// This file contains the code to check canonical methods. + +package testdata + +import ( + "fmt" +) + +type MethodTest int + +func (t *MethodTest) Scan(x fmt.ScanState, c byte) { // ERROR "should have signature Scan" +} + +type MethodTestInterface interface { + ReadByte() byte // ERROR "should have signature ReadByte" +} diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/nilfunc.go b/vendor/golang.org/x/tools/cmd/vet/testdata/nilfunc.go new file mode 100644 index 0000000000..2ce7bc8ca8 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/nilfunc.go @@ -0,0 +1,35 @@ +// Copyright 2013 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 testdata + +func F() {} + +type T struct { + F func() +} + +func (T) M() {} + +var Fv = F + +func Comparison() { + var t T + var fn func() + if fn == nil || Fv == nil || t.F == nil { + // no error; these func vars or fields may be nil + } + if F == nil { // ERROR "comparison of function F == nil is always false" + panic("can't happen") + } + if t.M == nil { // ERROR "comparison of function M == nil is always false" + panic("can't happen") + } + if F != nil { // ERROR "comparison of function F != nil is always true" + if t.M != nil { // ERROR "comparison of function M != nil is always true" + return + } + } + panic("can't happen") +} diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/print.go b/vendor/golang.org/x/tools/cmd/vet/testdata/print.go new file mode 100644 index 0000000000..3390a31f2c --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/print.go @@ -0,0 +1,342 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains tests for the printf checker. + +package testdata + +import ( + "fmt" + "math" + "os" + "unsafe" // just for test case printing unsafe.Pointer +) + +func UnsafePointerPrintfTest() { + var up unsafe.Pointer + fmt.Printf("%p, %x %X", up, up, up) +} + +// Error methods that do not satisfy the Error interface and should be checked. +type errorTest1 int + +func (errorTest1) Error(...interface{}) string { + return "hi" +} + +type errorTest2 int // Analogous to testing's *T type. +func (errorTest2) Error(...interface{}) { +} + +type errorTest3 int + +func (errorTest3) Error() { // No return value. +} + +type errorTest4 int + +func (errorTest4) Error() int { // Different return type. + return 3 +} + +type errorTest5 int + +func (errorTest5) error() { // niladic; don't complain if no args (was bug) +} + +// This function never executes, but it serves as a simple test for the program. +// Test with make test. +func PrintfTests() { + var b bool + var i int + var r rune + var s string + var x float64 + var p *int + var imap map[int]int + var fslice []float64 + var c complex64 + // Some good format/argtypes + fmt.Printf("") + fmt.Printf("%b %b %b", 3, i, x) + fmt.Printf("%c %c %c %c", 3, i, 'x', r) + fmt.Printf("%d %d %d", 3, i, imap) + fmt.Printf("%e %e %e %e", 3e9, x, fslice, c) + fmt.Printf("%E %E %E %E", 3e9, x, fslice, c) + fmt.Printf("%f %f %f %f", 3e9, x, fslice, c) + fmt.Printf("%F %F %F %F", 3e9, x, fslice, c) + fmt.Printf("%g %g %g %g", 3e9, x, fslice, c) + fmt.Printf("%G %G %G %G", 3e9, x, fslice, c) + fmt.Printf("%b %b %b %b", 3e9, x, fslice, c) + fmt.Printf("%o %o", 3, i) + fmt.Printf("%p %p", p, nil) + fmt.Printf("%q %q %q %q", 3, i, 'x', r) + fmt.Printf("%s %s %s", "hi", s, []byte{65}) + fmt.Printf("%t %t", true, b) + fmt.Printf("%T %T", 3, i) + fmt.Printf("%U %U", 3, i) + fmt.Printf("%v %v", 3, i) + fmt.Printf("%x %x %x %x", 3, i, "hi", s) + fmt.Printf("%X %X %X %X", 3, i, "hi", s) + fmt.Printf("%.*s %d %g", 3, "hi", 23, 2.3) + fmt.Printf("%s", &stringerv) + fmt.Printf("%v", &stringerv) + fmt.Printf("%T", &stringerv) + fmt.Printf("%v", notstringerv) + fmt.Printf("%T", notstringerv) + fmt.Printf("%q", stringerarrayv) + fmt.Printf("%v", stringerarrayv) + fmt.Printf("%s", stringerarrayv) + fmt.Printf("%v", notstringerarrayv) + fmt.Printf("%T", notstringerarrayv) + fmt.Printf("%d", new(Formatter)) + fmt.Printf("%*%", 2) // Ridiculous but allowed. + fmt.Printf("%s", interface{}(nil)) // Nothing useful we can say. + + fmt.Printf("%g", 1+2i) + // Some bad format/argTypes + fmt.Printf("%b", "hi") // ERROR "arg .hi. for printf verb %b of wrong type" + fmt.Printf("%t", c) // ERROR "arg c for printf verb %t of wrong type" + fmt.Printf("%t", 1+2i) // ERROR "arg 1 \+ 2i for printf verb %t of wrong type" + fmt.Printf("%c", 2.3) // ERROR "arg 2.3 for printf verb %c of wrong type" + fmt.Printf("%d", 2.3) // ERROR "arg 2.3 for printf verb %d of wrong type" + fmt.Printf("%e", "hi") // ERROR "arg .hi. for printf verb %e of wrong type" + fmt.Printf("%E", true) // ERROR "arg true for printf verb %E of wrong type" + fmt.Printf("%f", "hi") // ERROR "arg .hi. for printf verb %f of wrong type" + fmt.Printf("%F", 'x') // ERROR "arg 'x' for printf verb %F of wrong type" + fmt.Printf("%g", "hi") // ERROR "arg .hi. for printf verb %g of wrong type" + fmt.Printf("%g", imap) // ERROR "arg imap for printf verb %g of wrong type" + fmt.Printf("%G", i) // ERROR "arg i for printf verb %G of wrong type" + fmt.Printf("%o", x) // ERROR "arg x for printf verb %o of wrong type" + fmt.Printf("%p", 23) // ERROR "arg 23 for printf verb %p of wrong type" + fmt.Printf("%q", x) // ERROR "arg x for printf verb %q of wrong type" + fmt.Printf("%s", b) // ERROR "arg b for printf verb %s of wrong type" + fmt.Printf("%s", byte(65)) // ERROR "arg byte\(65\) for printf verb %s of wrong type" + fmt.Printf("%t", 23) // ERROR "arg 23 for printf verb %t of wrong type" + fmt.Printf("%U", x) // ERROR "arg x for printf verb %U of wrong type" + fmt.Printf("%x", nil) // ERROR "arg nil for printf verb %x of wrong type" + fmt.Printf("%X", 2.3) // ERROR "arg 2.3 for printf verb %X of wrong type" + fmt.Printf("%s", stringerv) // ERROR "arg stringerv for printf verb %s of wrong type" + fmt.Printf("%t", stringerv) // ERROR "arg stringerv for printf verb %t of wrong type" + fmt.Printf("%q", notstringerv) // ERROR "arg notstringerv for printf verb %q of wrong type" + fmt.Printf("%t", notstringerv) // ERROR "arg notstringerv for printf verb %t of wrong type" + fmt.Printf("%t", stringerarrayv) // ERROR "arg stringerarrayv for printf verb %t of wrong type" + fmt.Printf("%t", notstringerarrayv) // ERROR "arg notstringerarrayv for printf verb %t of wrong type" + fmt.Printf("%q", notstringerarrayv) // ERROR "arg notstringerarrayv for printf verb %q of wrong type" + fmt.Printf("%d", Formatter(true)) // correct (the type is responsible for formatting) + fmt.Printf("%s", nonemptyinterface) // correct (the dynamic type of nonemptyinterface may be a stringer) + fmt.Printf("%.*s %d %g", 3, "hi", 23, 'x') // ERROR "arg 'x' for printf verb %g of wrong type" + fmt.Println() // not an error + fmt.Println("%s", "hi") // ERROR "possible formatting directive in Println call" + fmt.Printf("%s", "hi", 3) // ERROR "wrong number of args for format in Printf call" + _ = fmt.Sprintf("%"+("s"), "hi", 3) // ERROR "wrong number of args for format in Sprintf call" + fmt.Printf("%s%%%d", "hi", 3) // correct + fmt.Printf("%08s", "woo") // correct + fmt.Printf("% 8s", "woo") // correct + fmt.Printf("%.*d", 3, 3) // correct + fmt.Printf("%.*d", 3, 3, 3, 3) // ERROR "wrong number of args for format in Printf call.*4 args" + fmt.Printf("%.*d", "hi", 3) // ERROR "arg .hi. for \* in printf format not of type int" + fmt.Printf("%.*d", i, 3) // correct + fmt.Printf("%.*d", s, 3) // ERROR "arg s for \* in printf format not of type int" + fmt.Printf("%*%", 0.22) // ERROR "arg 0.22 for \* in printf format not of type int" + fmt.Printf("%q %q", multi()...) // ok + fmt.Printf("%#q", `blah`) // ok + printf("now is the time", "buddy") // ERROR "no formatting directive" + Printf("now is the time", "buddy") // ERROR "no formatting directive" + Printf("hi") // ok + const format = "%s %s\n" + Printf(format, "hi", "there") + Printf(format, "hi") // ERROR "missing argument for Printf..%s..: format reads arg 2, have only 1" + Printf("%s %d %.3v %q", "str", 4) // ERROR "missing argument for Printf..%.3v..: format reads arg 3, have only 2" + f := new(stringer) + f.Warn(0, "%s", "hello", 3) // ERROR "possible formatting directive in Warn call" + f.Warnf(0, "%s", "hello", 3) // ERROR "wrong number of args for format in Warnf call" + f.Warnf(0, "%r", "hello") // ERROR "unrecognized printf verb" + f.Warnf(0, "%#s", "hello") // ERROR "unrecognized printf flag" + Printf("d%", 2) // ERROR "missing verb at end of format string in Printf call" + Printf("%d", percentDV) + Printf("%d", &percentDV) + Printf("%d", notPercentDV) // ERROR "arg notPercentDV for printf verb %d of wrong type" + Printf("%d", ¬PercentDV) // ERROR "arg ¬PercentDV for printf verb %d of wrong type" + Printf("%p", ¬PercentDV) // Works regardless: we print it as a pointer. + Printf("%s", percentSV) + Printf("%s", &percentSV) + // Good argument reorderings. + Printf("%[1]d", 3) + Printf("%[1]*d", 3, 1) + Printf("%[2]*[1]d", 1, 3) + Printf("%[2]*.[1]*[3]d", 2, 3, 4) + fmt.Fprintf(os.Stderr, "%[2]*.[1]*[3]d", 2, 3, 4) // Use Fprintf to make sure we count arguments correctly. + // Bad argument reorderings. + Printf("%[xd", 3) // ERROR "illegal syntax for printf argument index" + Printf("%[x]d", 3) // ERROR "illegal syntax for printf argument index" + Printf("%[3]*s", "hi", 2) // ERROR "missing argument for Printf.* reads arg 3, have only 2" + _ = fmt.Sprintf("%[3]d", 2) // ERROR "missing argument for Sprintf.* reads arg 3, have only 1" + Printf("%[2]*.[1]*[3]d", 2, "hi", 4) // ERROR "arg .hi. for \* in printf format not of type int" + Printf("%[0]s", "arg1") // ERROR "index value \[0\] for Printf.*; indexes start at 1" + Printf("%[0]d", 1) // ERROR "index value \[0\] for Printf.*; indexes start at 1" + // Something that satisfies the error interface. + var e error + fmt.Println(e.Error()) // ok + // Something that looks like an error interface but isn't, such as the (*T).Error method + // in the testing package. + var et1 errorTest1 + fmt.Println(et1.Error()) // ERROR "no args in Error call" + fmt.Println(et1.Error("hi")) // ok + fmt.Println(et1.Error("%d", 3)) // ERROR "possible formatting directive in Error call" + var et2 errorTest2 + et2.Error() // ERROR "no args in Error call" + et2.Error("hi") // ok, not an error method. + et2.Error("%d", 3) // ERROR "possible formatting directive in Error call" + var et3 errorTest3 + et3.Error() // ok, not an error method. + var et4 errorTest4 + et4.Error() // ok, not an error method. + var et5 errorTest5 + et5.error() // ok, not an error method. + // Bug: used to recur forever. + Printf("%p %x", recursiveStructV, recursiveStructV.next) + Printf("%p %x", recursiveStruct1V, recursiveStruct1V.next) + Printf("%p %x", recursiveSliceV, recursiveSliceV) + Printf("%p %x", recursiveMapV, recursiveMapV) + // Special handling for Log. + math.Log(3) // OK + Log(3) // OK + Log("%d", 3) // ERROR "possible formatting directive in Log call" + Logf("%d", 3) + Logf("%d", "hi") // ERROR "arg .hi. for printf verb %d of wrong type: untyped string" + +} + +// Printf is used by the test so we must declare it. +func Printf(format string, args ...interface{}) { + panic("don't call - testing only") +} + +// printf is used by the test so we must declare it. +func printf(format string, args ...interface{}) { + panic("don't call - testing only") +} + +// multi is used by the test. +func multi() []interface{} { + panic("don't call - testing only") +} + +type stringer float64 + +var stringerv stringer + +func (*stringer) String() string { + return "string" +} + +func (*stringer) Warn(int, ...interface{}) string { + return "warn" +} + +func (*stringer) Warnf(int, string, ...interface{}) string { + return "warnf" +} + +type notstringer struct { + f float64 +} + +var notstringerv notstringer + +type stringerarray [4]float64 + +func (stringerarray) String() string { + return "string" +} + +var stringerarrayv stringerarray + +type notstringerarray [4]float64 + +var notstringerarrayv notstringerarray + +var nonemptyinterface = interface { + f() +}(nil) + +// A data type we can print with "%d". +type percentDStruct struct { + a int + b []byte + c *float64 +} + +var percentDV percentDStruct + +// A data type we cannot print correctly with "%d". +type notPercentDStruct struct { + a int + b []byte + c bool +} + +var notPercentDV notPercentDStruct + +// A data type we can print with "%s". +type percentSStruct struct { + a string + b []byte + c stringerarray +} + +var percentSV percentSStruct + +type recursiveStringer int + +func (s recursiveStringer) String() string { + _ = fmt.Sprintf("%d", s) + _ = fmt.Sprintf("%#v", s) + _ = fmt.Sprintf("%v", s) // ERROR "arg s for printf causes recursive call to String method" + _ = fmt.Sprintf("%v", &s) // ERROR "arg &s for printf causes recursive call to String method" + _ = fmt.Sprintf("%T", s) // ok; does not recursively call String + return fmt.Sprintln(s) // ERROR "arg s for print causes recursive call to String method" +} + +type recursivePtrStringer int + +func (p *recursivePtrStringer) String() string { + _ = fmt.Sprintf("%v", *p) + return fmt.Sprintln(p) // ERROR "arg p for print causes recursive call to String method" +} + +type Formatter bool + +func (*Formatter) Format(fmt.State, rune) { +} + +type RecursiveSlice []RecursiveSlice + +var recursiveSliceV = &RecursiveSlice{} + +type RecursiveMap map[int]RecursiveMap + +var recursiveMapV = make(RecursiveMap) + +type RecursiveStruct struct { + next *RecursiveStruct +} + +var recursiveStructV = &RecursiveStruct{} + +type RecursiveStruct1 struct { + next *Recursive2Struct +} + +type RecursiveStruct2 struct { + next *Recursive1Struct +} + +var recursiveStruct1V = &RecursiveStruct1{} + +// Fix for issue 7149: Missing return type on String method caused fault. +func (int) String() { + return "" +} diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/rangeloop.go b/vendor/golang.org/x/tools/cmd/vet/testdata/rangeloop.go new file mode 100644 index 0000000000..37b5940ddd --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/rangeloop.go @@ -0,0 +1,59 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains tests for the rangeloop checker. + +package testdata + +func RangeLoopTests() { + var s []int + for i, v := range s { + go func() { + println(i) // ERROR "range variable i captured by func literal" + println(v) // ERROR "range variable v captured by func literal" + }() + } + for i, v := range s { + defer func() { + println(i) // ERROR "range variable i captured by func literal" + println(v) // ERROR "range variable v captured by func literal" + }() + } + for i := range s { + go func() { + println(i) // ERROR "range variable i captured by func literal" + }() + } + for _, v := range s { + go func() { + println(v) // ERROR "range variable v captured by func literal" + }() + } + for i, v := range s { + go func() { + println(i, v) + }() + println("unfortunately, we don't catch the error above because of this statement") + } + for i, v := range s { + go func(i, v int) { + println(i, v) + }(i, v) + } + for i, v := range s { + i, v := i, v + go func() { + println(i, v) + }() + } + // If the key of the range statement is not an identifier + // the code should not panic (it used to). + var x [2]int + var f int + for x[0], f = range s { + go func() { + _ = f // ERROR "range variable f captured by func literal" + }() + } +} diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/shadow.go b/vendor/golang.org/x/tools/cmd/vet/testdata/shadow.go new file mode 100644 index 0000000000..34a680681b --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/shadow.go @@ -0,0 +1,54 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains tests for the shadowed variable checker. +// Some of these errors are caught by the compiler (shadowed return parameters for example) +// but are nonetheless useful tests. + +package testdata + +import "os" + +func ShadowRead(f *os.File, buf []byte) (err error) { + var x int + if f != nil { + err := 3 // OK - different type. + _ = err + } + if f != nil { + _, err := f.Read(buf) // ERROR "declaration of err shadows declaration at testdata/shadow.go:13" + if err != nil { + return err + } + i := 3 // OK + _ = i + } + if f != nil { + var _, err = f.Read(buf) // ERROR "declaration of err shadows declaration at testdata/shadow.go:13" + if err != nil { + return err + } + } + for i := 0; i < 10; i++ { + i := i // OK: obviously intentional idiomatic redeclaration + go func() { + println(i) + }() + } + var shadowTemp interface{} + switch shadowTemp := shadowTemp.(type) { // OK: obviously intentional idiomatic redeclaration + case int: + println("OK") + _ = shadowTemp + } + if shadowTemp := shadowTemp; true { // OK: obviously intentional idiomatic redeclaration + var f *os.File // OK because f is not mentioned later in the function. + // The declaration of x is a shadow because x is mentioned below. + var x int // ERROR "declaration of x shadows declaration at testdata/shadow.go:14" + _, _, _ = x, f, shadowTemp + } + // Use a couple of variables to trigger shadowing errors. + _, _ = err, x + return +} diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/shift.go b/vendor/golang.org/x/tools/cmd/vet/testdata/shift.go new file mode 100644 index 0000000000..6624f09cc1 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/shift.go @@ -0,0 +1,78 @@ +// 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. + +// This file contains tests for the suspicious shift checker. + +package testdata + +func ShiftTest() { + var i8 int8 + _ = i8 << 7 + _ = (i8 + 1) << 8 // ERROR "\(i8 \+ 1\) too small for shift of 8" + _ = i8 << (7 + 1) // ERROR "i8 too small for shift of 8" + _ = i8 >> 8 // ERROR "i8 too small for shift of 8" + i8 <<= 8 // ERROR "i8 too small for shift of 8" + i8 >>= 8 // ERROR "i8 too small for shift of 8" + var i16 int16 + _ = i16 << 15 + _ = i16 << 16 // ERROR "i16 too small for shift of 16" + _ = i16 >> 16 // ERROR "i16 too small for shift of 16" + i16 <<= 16 // ERROR "i16 too small for shift of 16" + i16 >>= 16 // ERROR "i16 too small for shift of 16" + var i32 int32 + _ = i32 << 31 + _ = i32 << 32 // ERROR "i32 too small for shift of 32" + _ = i32 >> 32 // ERROR "i32 too small for shift of 32" + i32 <<= 32 // ERROR "i32 too small for shift of 32" + i32 >>= 32 // ERROR "i32 too small for shift of 32" + var i64 int64 + _ = i64 << 63 + _ = i64 << 64 // ERROR "i64 too small for shift of 64" + _ = i64 >> 64 // ERROR "i64 too small for shift of 64" + i64 <<= 64 // ERROR "i64 too small for shift of 64" + i64 >>= 64 // ERROR "i64 too small for shift of 64" + var u8 uint8 + _ = u8 << 7 + _ = u8 << 8 // ERROR "u8 too small for shift of 8" + _ = u8 >> 8 // ERROR "u8 too small for shift of 8" + u8 <<= 8 // ERROR "u8 too small for shift of 8" + u8 >>= 8 // ERROR "u8 too small for shift of 8" + var u16 uint16 + _ = u16 << 15 + _ = u16 << 16 // ERROR "u16 too small for shift of 16" + _ = u16 >> 16 // ERROR "u16 too small for shift of 16" + u16 <<= 16 // ERROR "u16 too small for shift of 16" + u16 >>= 16 // ERROR "u16 too small for shift of 16" + var u32 uint32 + _ = u32 << 31 + _ = u32 << 32 // ERROR "u32 too small for shift of 32" + _ = u32 >> 32 // ERROR "u32 too small for shift of 32" + u32 <<= 32 // ERROR "u32 too small for shift of 32" + u32 >>= 32 // ERROR "u32 too small for shift of 32" + var u64 uint64 + _ = u64 << 63 + _ = u64 << 64 // ERROR "u64 too small for shift of 64" + _ = u64 >> 64 // ERROR "u64 too small for shift of 64" + u64 <<= 64 // ERROR "u64 too small for shift of 64" + u64 >>= 64 // ERROR "u64 too small for shift of 64" + _ = u64 << u64 // Non-constant shifts should succeed. + var i int + _ = i << 31 + _ = i << 32 // ERROR "i might be too small for shift of 32" + _ = i >> 32 // ERROR "i might be too small for shift of 32" + i <<= 32 // ERROR "i might be too small for shift of 32" + i >>= 32 // ERROR "i might be too small for shift of 32" + var u uint + _ = u << 31 + _ = u << 32 // ERROR "u might be too small for shift of 32" + _ = u >> 32 // ERROR "u might be too small for shift of 32" + u <<= 32 // ERROR "u might be too small for shift of 32" + u >>= 32 // ERROR "u might be too small for shift of 32" + var p uintptr + _ = p << 31 + _ = p << 32 // ERROR "p might be too small for shift of 32" + _ = p >> 32 // ERROR "p might be too small for shift of 32" + p <<= 32 // ERROR "p might be too small for shift of 32" + p >>= 32 // ERROR "p might be too small for shift of 32" +} diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/structtag.go b/vendor/golang.org/x/tools/cmd/vet/testdata/structtag.go new file mode 100644 index 0000000000..6878f5642d --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/structtag.go @@ -0,0 +1,36 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains the test for canonical struct tags. + +package testdata + +type StructTagTest struct { + A int "hello" // ERROR "not compatible with reflect.StructTag.Get: bad syntax for struct tag pair" + B int "\tx:\"y\"" // ERROR "not compatible with reflect.StructTag.Get: bad syntax for struct tag key" + C int "x:\"y\"\tx:\"y\"" // ERROR "not compatible with reflect.StructTag.Get" + D int "x:`y`" // ERROR "not compatible with reflect.StructTag.Get: bad syntax for struct tag value" + E int "ct\brl:\"char\"" // ERROR "not compatible with reflect.StructTag.Get: bad syntax for struct tag pair" + F int `:"emptykey"` // ERROR "not compatible with reflect.StructTag.Get: bad syntax for struct tag key" + G int `x:"noEndQuote` // ERROR "not compatible with reflect.StructTag.Get: bad syntax for struct tag value" + H int `x:"trunc\x0"` // ERROR "not compatible with reflect.StructTag.Get: bad syntax for struct tag value" + OK0 int `x:"y" u:"v" w:""` + OK1 int `x:"y:z" u:"v" w:""` // note multiple colons. + OK2 int "k0:\"values contain spaces\" k1:\"literal\ttabs\" k2:\"and\\tescaped\\tabs\"" + OK3 int `under_scores:"and" CAPS:"ARE_OK"` +} + +type UnexportedEncodingTagTest struct { + x int `json:"xx"` // ERROR "struct field x has json tag but is not exported" + y int `xml:"yy"` // ERROR "struct field y has xml tag but is not exported" + z int + A int `json:"aa" xml:"bb"` +} + +type unexp struct{} + +type JSONEmbeddedField struct { + UnexportedEncodingTagTest `is:"embedded"` + unexp `is:"embedded,notexported" json:"unexp"` // OK for now, see issue 7363 +} diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/tagtest/file1.go b/vendor/golang.org/x/tools/cmd/vet/testdata/tagtest/file1.go new file mode 100644 index 0000000000..22a1509acc --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/tagtest/file1.go @@ -0,0 +1,10 @@ +// 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 testtag + +package main + +func main() { +} diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/tagtest/file2.go b/vendor/golang.org/x/tools/cmd/vet/testdata/tagtest/file2.go new file mode 100644 index 0000000000..ba7dd91bbd --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/tagtest/file2.go @@ -0,0 +1,10 @@ +// 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 !testtag + +package main + +func ignore() { +} diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/unsafeptr.go b/vendor/golang.org/x/tools/cmd/vet/testdata/unsafeptr.go new file mode 100644 index 0000000000..8f64030b85 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/unsafeptr.go @@ -0,0 +1,61 @@ +// 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 testdata + +import ( + "reflect" + "unsafe" +) + +func f() { + var x unsafe.Pointer + var y uintptr + x = unsafe.Pointer(y) // ERROR "possible misuse of unsafe.Pointer" + y = uintptr(x) + + // only allowed pointer arithmetic is ptr +/- num. + // num+ptr is technically okay but still flagged: write ptr+num instead. + x = unsafe.Pointer(uintptr(x) + 1) + x = unsafe.Pointer(1 + uintptr(x)) // ERROR "possible misuse of unsafe.Pointer" + x = unsafe.Pointer(uintptr(x) + uintptr(x)) // ERROR "possible misuse of unsafe.Pointer" + x = unsafe.Pointer(uintptr(x) - 1) + x = unsafe.Pointer(1 - uintptr(x)) // ERROR "possible misuse of unsafe.Pointer" + + // certain uses of reflect are okay + var v reflect.Value + x = unsafe.Pointer(v.Pointer()) + x = unsafe.Pointer(v.UnsafeAddr()) + var s1 *reflect.StringHeader + x = unsafe.Pointer(s1.Data) + var s2 *reflect.SliceHeader + x = unsafe.Pointer(s2.Data) + var s3 reflect.StringHeader + x = unsafe.Pointer(s3.Data) // ERROR "possible misuse of unsafe.Pointer" + var s4 reflect.SliceHeader + x = unsafe.Pointer(s4.Data) // ERROR "possible misuse of unsafe.Pointer" + + // but only in reflect + var vv V + x = unsafe.Pointer(vv.Pointer()) // ERROR "possible misuse of unsafe.Pointer" + x = unsafe.Pointer(vv.UnsafeAddr()) // ERROR "possible misuse of unsafe.Pointer" + var ss1 *StringHeader + x = unsafe.Pointer(ss1.Data) // ERROR "possible misuse of unsafe.Pointer" + var ss2 *SliceHeader + x = unsafe.Pointer(ss2.Data) // ERROR "possible misuse of unsafe.Pointer" + +} + +type V interface { + Pointer() uintptr + UnsafeAddr() uintptr +} + +type StringHeader struct { + Data uintptr +} + +type SliceHeader struct { + Data uintptr +} diff --git a/vendor/golang.org/x/tools/cmd/vet/testdata/unused.go b/vendor/golang.org/x/tools/cmd/vet/testdata/unused.go new file mode 100644 index 0000000000..d50f6594d9 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/testdata/unused.go @@ -0,0 +1,29 @@ +// 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. + +// This file contains tests for the unusedresult checker. + +package testdata + +import ( + "bytes" + "errors" + "fmt" +) + +func _() { + fmt.Errorf("") // ERROR "result of fmt.Errorf call not used" + _ = fmt.Errorf("") + + errors.New("") // ERROR "result of errors.New call not used" + + err := errors.New("") + err.Error() // ERROR "result of \(error\).Error call not used" + + var buf bytes.Buffer + buf.String() // ERROR "result of \(bytes.Buffer\).String call not used" + + fmt.Sprint("") // ERROR "result of fmt.Sprint call not used" + fmt.Sprintf("") // ERROR "result of fmt.Sprintf call not used" +} diff --git a/vendor/golang.org/x/tools/cmd/vet/types.go b/vendor/golang.org/x/tools/cmd/vet/types.go new file mode 100644 index 0000000000..084be85d68 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/types.go @@ -0,0 +1,369 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains the pieces of the tool that use typechecking from the go/types package. + +package main + +import ( + "go/ast" + "go/token" + + "golang.org/x/tools/go/types" +) + +// imports is the canonical map of imported packages we need for typechecking. +// It is created during initialization. +var imports = make(map[string]*types.Package) + +var ( + errorType *types.Interface + stringerType *types.Interface // possibly nil + formatterType *types.Interface // possibly nil +) + +func init() { + errorType = types.Universe.Lookup("error").Type().Underlying().(*types.Interface) + + if typ := importType("fmt", "Stringer"); typ != nil { + stringerType = typ.Underlying().(*types.Interface) + } + + if typ := importType("fmt", "Formatter"); typ != nil { + formatterType = typ.Underlying().(*types.Interface) + } +} + +// importType returns the type denoted by the qualified identifier +// path.name, and adds the respective package to the imports map +// as a side effect. In case of an error, importType returns nil. +func importType(path, name string) types.Type { + pkg, err := types.DefaultImport(imports, path) + if err != nil { + // This can happen if the package at path hasn't been compiled yet. + warnf("import failed: %v", err) + return nil + } + if obj, ok := pkg.Scope().Lookup(name).(*types.TypeName); ok { + return obj.Type() + } + warnf("invalid type name %q", name) + return nil +} + +func (pkg *Package) check(fs *token.FileSet, astFiles []*ast.File) error { + pkg.defs = make(map[*ast.Ident]types.Object) + pkg.uses = make(map[*ast.Ident]types.Object) + pkg.selectors = make(map[*ast.SelectorExpr]*types.Selection) + pkg.spans = make(map[types.Object]Span) + pkg.types = make(map[ast.Expr]types.TypeAndValue) + config := types.Config{ + // We provide the same packages map for all imports to ensure + // that everybody sees identical packages for the given paths. + Packages: imports, + // By providing a Config with our own error function, it will continue + // past the first error. There is no need for that function to do anything. + Error: func(error) {}, + } + info := &types.Info{ + Selections: pkg.selectors, + Types: pkg.types, + Defs: pkg.defs, + Uses: pkg.uses, + } + typesPkg, err := config.Check(pkg.path, fs, astFiles, info) + pkg.typesPkg = typesPkg + // update spans + for id, obj := range pkg.defs { + pkg.growSpan(id, obj) + } + for id, obj := range pkg.uses { + pkg.growSpan(id, obj) + } + return err +} + +// isStruct reports whether the composite literal c is a struct. +// If it is not (probably a struct), it returns a printable form of the type. +func (pkg *Package) isStruct(c *ast.CompositeLit) (bool, string) { + // Check that the CompositeLit's type is a slice or array (which needs no field keys), if possible. + typ := pkg.types[c].Type + // If it's a named type, pull out the underlying type. If it's not, the Underlying + // method returns the type itself. + actual := typ + if actual != nil { + actual = actual.Underlying() + } + if actual == nil { + // No type information available. Assume true, so we do the check. + return true, "" + } + switch actual.(type) { + case *types.Struct: + return true, typ.String() + default: + return false, "" + } +} + +// matchArgType reports an error if printf verb t is not appropriate +// for operand arg. +// +// typ is used only for recursive calls; external callers must supply nil. +// +// (Recursion arises from the compound types {map,chan,slice} which +// may be printed with %d etc. if that is appropriate for their element +// types.) +func (f *File) matchArgType(t printfArgType, typ types.Type, arg ast.Expr) bool { + return f.matchArgTypeInternal(t, typ, arg, make(map[types.Type]bool)) +} + +// matchArgTypeInternal is the internal version of matchArgType. It carries a map +// remembering what types are in progress so we don't recur when faced with recursive +// types or mutually recursive types. +func (f *File) matchArgTypeInternal(t printfArgType, typ types.Type, arg ast.Expr, inProgress map[types.Type]bool) bool { + // %v, %T accept any argument type. + if t == anyType { + return true + } + if typ == nil { + // external call + typ = f.pkg.types[arg].Type + if typ == nil { + return true // probably a type check problem + } + } + // If the type implements fmt.Formatter, we have nothing to check. + // formatterTyp may be nil - be conservative and check for Format method in that case. + if formatterType != nil && types.Implements(typ, formatterType) || f.hasMethod(typ, "Format") { + return true + } + // If we can use a string, might arg (dynamically) implement the Stringer or Error interface? + if t&argString != 0 { + if types.AssertableTo(errorType, typ) || stringerType != nil && types.AssertableTo(stringerType, typ) { + return true + } + } + + typ = typ.Underlying() + if inProgress[typ] { + // We're already looking at this type. The call that started it will take care of it. + return true + } + inProgress[typ] = true + + switch typ := typ.(type) { + case *types.Signature: + return t&argPointer != 0 + + case *types.Map: + // Recur: map[int]int matches %d. + return t&argPointer != 0 || + (f.matchArgTypeInternal(t, typ.Key(), arg, inProgress) && f.matchArgTypeInternal(t, typ.Elem(), arg, inProgress)) + + case *types.Chan: + return t&argPointer != 0 + + case *types.Array: + // Same as slice. + if types.Identical(typ.Elem().Underlying(), types.Typ[types.Byte]) && t&argString != 0 { + return true // %s matches []byte + } + // Recur: []int matches %d. + return t&argPointer != 0 || f.matchArgTypeInternal(t, typ.Elem().Underlying(), arg, inProgress) + + case *types.Slice: + // Same as array. + if types.Identical(typ.Elem().Underlying(), types.Typ[types.Byte]) && t&argString != 0 { + return true // %s matches []byte + } + // Recur: []int matches %d. But watch out for + // type T []T + // If the element is a pointer type (type T[]*T), it's handled fine by the Pointer case below. + return t&argPointer != 0 || f.matchArgTypeInternal(t, typ.Elem(), arg, inProgress) + + case *types.Pointer: + // Ugly, but dealing with an edge case: a known pointer to an invalid type, + // probably something from a failed import. + if typ.Elem().String() == "invalid type" { + if *verbose { + f.Warnf(arg.Pos(), "printf argument %v is pointer to invalid or unknown type", f.gofmt(arg)) + } + return true // special case + } + // If it's actually a pointer with %p, it prints as one. + if t == argPointer { + return true + } + // If it's pointer to struct, that's equivalent in our analysis to whether we can print the struct. + if str, ok := typ.Elem().Underlying().(*types.Struct); ok { + return f.matchStructArgType(t, str, arg, inProgress) + } + // The rest can print with %p as pointers, or as integers with %x etc. + return t&(argInt|argPointer) != 0 + + case *types.Struct: + return f.matchStructArgType(t, typ, arg, inProgress) + + case *types.Interface: + // If the static type of the argument is empty interface, there's little we can do. + // Example: + // func f(x interface{}) { fmt.Printf("%s", x) } + // Whether x is valid for %s depends on the type of the argument to f. One day + // we will be able to do better. For now, we assume that empty interface is OK + // but non-empty interfaces, with Stringer and Error handled above, are errors. + return typ.NumMethods() == 0 + + case *types.Basic: + switch typ.Kind() { + case types.UntypedBool, + types.Bool: + return t&argBool != 0 + + case types.UntypedInt, + types.Int, + types.Int8, + types.Int16, + types.Int32, + types.Int64, + types.Uint, + types.Uint8, + types.Uint16, + types.Uint32, + types.Uint64, + types.Uintptr: + return t&argInt != 0 + + case types.UntypedFloat, + types.Float32, + types.Float64: + return t&argFloat != 0 + + case types.UntypedComplex, + types.Complex64, + types.Complex128: + return t&argComplex != 0 + + case types.UntypedString, + types.String: + return t&argString != 0 + + case types.UnsafePointer: + return t&(argPointer|argInt) != 0 + + case types.UntypedRune: + return t&(argInt|argRune) != 0 + + case types.UntypedNil: + return t&argPointer != 0 // TODO? + + case types.Invalid: + if *verbose { + f.Warnf(arg.Pos(), "printf argument %v has invalid or unknown type", f.gofmt(arg)) + } + return true // Probably a type check problem. + } + panic("unreachable") + } + + return false +} + +// hasBasicType reports whether x's type is a types.Basic with the given kind. +func (f *File) hasBasicType(x ast.Expr, kind types.BasicKind) bool { + t := f.pkg.types[x].Type + if t != nil { + t = t.Underlying() + } + b, ok := t.(*types.Basic) + return ok && b.Kind() == kind +} + +// matchStructArgType reports whether all the elements of the struct match the expected +// type. For instance, with "%d" all the elements must be printable with the "%d" format. +func (f *File) matchStructArgType(t printfArgType, typ *types.Struct, arg ast.Expr, inProgress map[types.Type]bool) bool { + for i := 0; i < typ.NumFields(); i++ { + if !f.matchArgTypeInternal(t, typ.Field(i).Type(), arg, inProgress) { + return false + } + } + return true +} + +// numArgsInSignature tells how many formal arguments the function type +// being called has. +func (f *File) numArgsInSignature(call *ast.CallExpr) int { + // Check the type of the function or method declaration + typ := f.pkg.types[call.Fun].Type + if typ == nil { + return 0 + } + // The type must be a signature, but be sure for safety. + sig, ok := typ.(*types.Signature) + if !ok { + return 0 + } + return sig.Params().Len() +} + +// isErrorMethodCall reports whether the call is of a method with signature +// func Error() string +// where "string" is the universe's string type. We know the method is called "Error". +func (f *File) isErrorMethodCall(call *ast.CallExpr) bool { + typ := f.pkg.types[call].Type + if typ != nil { + // We know it's called "Error", so just check the function signature + // (stringerType has exactly one method, String). + if stringerType != nil && stringerType.NumMethods() == 1 { + return types.Identical(f.pkg.types[call.Fun].Type, stringerType.Method(0).Type()) + } + } + // Without types, we can still check by hand. + // Is it a selector expression? Otherwise it's a function call, not a method call. + sel, ok := call.Fun.(*ast.SelectorExpr) + if !ok { + return false + } + // The package is type-checked, so if there are no arguments, we're done. + if len(call.Args) > 0 { + return false + } + // Check the type of the method declaration + typ = f.pkg.types[sel].Type + if typ == nil { + return false + } + // The type must be a signature, but be sure for safety. + sig, ok := typ.(*types.Signature) + if !ok { + return false + } + // There must be a receiver for it to be a method call. Otherwise it is + // a function, not something that satisfies the error interface. + if sig.Recv() == nil { + return false + } + // There must be no arguments. Already verified by type checking, but be thorough. + if sig.Params().Len() > 0 { + return false + } + // Finally the real questions. + // There must be one result. + if sig.Results().Len() != 1 { + return false + } + // It must have return type "string" from the universe. + return sig.Results().At(0).Type() == types.Typ[types.String] +} + +// hasMethod reports whether the type contains a method with the given name. +// It is part of the workaround for Formatters and should be deleted when +// that workaround is no longer necessary. +// TODO: This could be better once issue 6259 is fixed. +func (f *File) hasMethod(typ types.Type, name string) bool { + // assume we have an addressable variable of type typ + obj, _, _ := types.LookupFieldOrMethod(typ, true, f.pkg.typesPkg, name) + _, ok := obj.(*types.Func) + return ok +} diff --git a/vendor/golang.org/x/tools/cmd/vet/unsafeptr.go b/vendor/golang.org/x/tools/cmd/vet/unsafeptr.go new file mode 100644 index 0000000000..ca15f72578 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/unsafeptr.go @@ -0,0 +1,98 @@ +// 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. + +// Check for invalid uintptr -> unsafe.Pointer conversions. + +package main + +import ( + "go/ast" + "go/token" + + "golang.org/x/tools/go/types" +) + +func init() { + register("unsafeptr", + "check for misuse of unsafe.Pointer", + checkUnsafePointer, + callExpr) +} + +func checkUnsafePointer(f *File, node ast.Node) { + x := node.(*ast.CallExpr) + if len(x.Args) != 1 { + return + } + if f.hasBasicType(x.Fun, types.UnsafePointer) && f.hasBasicType(x.Args[0], types.Uintptr) && !f.isSafeUintptr(x.Args[0]) { + f.Badf(x.Pos(), "possible misuse of unsafe.Pointer") + } +} + +// isSafeUintptr reports whether x - already known to be a uintptr - +// is safe to convert to unsafe.Pointer. It is safe if x is itself derived +// directly from an unsafe.Pointer via conversion and pointer arithmetic +// or if x is the result of reflect.Value.Pointer or reflect.Value.UnsafeAddr +// or obtained from the Data field of a *reflect.SliceHeader or *reflect.StringHeader. +func (f *File) isSafeUintptr(x ast.Expr) bool { + switch x := x.(type) { + case *ast.ParenExpr: + return f.isSafeUintptr(x.X) + + case *ast.SelectorExpr: + switch x.Sel.Name { + case "Data": + // reflect.SliceHeader and reflect.StringHeader are okay, + // but only if they are pointing at a real slice or string. + // It's not okay to do: + // var x SliceHeader + // x.Data = uintptr(unsafe.Pointer(...)) + // ... use x ... + // p := unsafe.Pointer(x.Data) + // because in the middle the garbage collector doesn't + // see x.Data as a pointer and so x.Data may be dangling + // by the time we get to the conversion at the end. + // For now approximate by saying that *Header is okay + // but Header is not. + pt, ok := f.pkg.types[x.X].Type.(*types.Pointer) + if ok { + t, ok := pt.Elem().(*types.Named) + if ok && t.Obj().Pkg().Path() == "reflect" { + switch t.Obj().Name() { + case "StringHeader", "SliceHeader": + return true + } + } + } + } + + case *ast.CallExpr: + switch len(x.Args) { + case 0: + // maybe call to reflect.Value.Pointer or reflect.Value.UnsafeAddr. + sel, ok := x.Fun.(*ast.SelectorExpr) + if !ok { + break + } + switch sel.Sel.Name { + case "Pointer", "UnsafeAddr": + t, ok := f.pkg.types[sel.X].Type.(*types.Named) + if ok && t.Obj().Pkg().Path() == "reflect" && t.Obj().Name() == "Value" { + return true + } + } + + case 1: + // maybe conversion of uintptr to unsafe.Pointer + return f.hasBasicType(x.Fun, types.Uintptr) && f.hasBasicType(x.Args[0], types.UnsafePointer) + } + + case *ast.BinaryExpr: + switch x.Op { + case token.ADD, token.SUB: + return f.isSafeUintptr(x.X) && !f.isSafeUintptr(x.Y) + } + } + return false +} diff --git a/vendor/golang.org/x/tools/cmd/vet/unused.go b/vendor/golang.org/x/tools/cmd/vet/unused.go new file mode 100644 index 0000000000..b9d7b65f44 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/unused.go @@ -0,0 +1,94 @@ +// 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. + +// This file defines the check for unused results of calls to certain +// pure functions. + +package main + +import ( + "flag" + "go/ast" + "go/token" + "strings" + + "golang.org/x/tools/go/types" +) + +var unusedFuncsFlag = flag.String("unusedfuncs", + "errors.New,fmt.Errorf,fmt.Sprintf,fmt.Sprint,sort.Reverse", + "comma-separated list of functions whose results must be used") + +var unusedStringMethodsFlag = flag.String("unusedstringmethods", + "Error,String", + "comma-separated list of names of methods of type func() string whose results must be used") + +func init() { + register("unusedresult", + "check for unused result of calls to functions in -unusedfuncs list and methods in -unusedstringmethods list", + checkUnusedResult, + exprStmt) +} + +// func() string +var sigNoArgsStringResult = types.NewSignature(nil, nil, + types.NewTuple(types.NewVar(token.NoPos, nil, "", types.Typ[types.String])), + false) + +var unusedFuncs = make(map[string]bool) +var unusedStringMethods = make(map[string]bool) + +func initUnusedFlags() { + commaSplit := func(s string, m map[string]bool) { + if s != "" { + for _, name := range strings.Split(s, ",") { + if len(name) == 0 { + flag.Usage() + } + m[name] = true + } + } + } + commaSplit(*unusedFuncsFlag, unusedFuncs) + commaSplit(*unusedStringMethodsFlag, unusedStringMethods) +} + +func checkUnusedResult(f *File, n ast.Node) { + call, ok := unparen(n.(*ast.ExprStmt).X).(*ast.CallExpr) + if !ok { + return // not a call statement + } + fun := unparen(call.Fun) + + if f.pkg.types[fun].IsType() { + return // a conversion, not a call + } + + selector, ok := fun.(*ast.SelectorExpr) + if !ok { + return // neither a method call nor a qualified ident + } + + sel, ok := f.pkg.selectors[selector] + if ok && sel.Kind() == types.MethodVal { + // method (e.g. foo.String()) + obj := sel.Obj().(*types.Func) + sig := sel.Type().(*types.Signature) + if types.Identical(sig, sigNoArgsStringResult) { + if unusedStringMethods[obj.Name()] { + f.Badf(call.Lparen, "result of (%s).%s call not used", + sig.Recv().Type(), obj.Name()) + } + } + } else if !ok { + // package-qualified function (e.g. fmt.Errorf) + obj, _ := f.pkg.uses[selector.Sel] + if obj, ok := obj.(*types.Func); ok { + qname := obj.Pkg().Path() + "." + obj.Name() + if unusedFuncs[qname] { + f.Badf(call.Lparen, "result of %v call not used", qname) + } + } + } +} diff --git a/vendor/golang.org/x/tools/cmd/vet/vet_test.go b/vendor/golang.org/x/tools/cmd/vet/vet_test.go new file mode 100644 index 0000000000..7508193659 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/vet_test.go @@ -0,0 +1,141 @@ +// Copyright 2013 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. + +// No testdata on Android. + +// +build !android + +package main_test + +import ( + "bytes" + "os" + "os/exec" + "path/filepath" + "runtime" + "testing" +) + +const ( + dataDir = "testdata" + binary = "testvet.exe" +) + +func CanRun(t *testing.T) bool { + // Plan 9 and Windows systems can't be guaranteed to have Perl and so can't run errchk. + switch runtime.GOOS { + case "plan9", "windows": + t.Skip("skipping test; no Perl on %q", runtime.GOOS) + return false + } + return true +} + +func Build(t *testing.T) { + // go build + cmd := exec.Command("go", "build", "-o", binary) + run(cmd, t) +} + +func Vet(t *testing.T, files []string) { + errchk := filepath.Join(runtime.GOROOT(), "test", "errchk") + flags := []string{ + "./" + binary, + "-printfuncs=Warn:1,Warnf:1", + "-test", // TODO: Delete once -shadow is part of -all. + } + cmd := exec.Command(errchk, append(flags, files...)...) + if !run(cmd, t) { + t.Fatal("vet command failed") + } +} + +// Run this shell script, but do it in Go so it can be run by "go test". +// go build -o testvet +// $(GOROOT)/test/errchk ./testvet -shadow -printfuncs='Warn:1,Warnf:1' testdata/*.go testdata/*.s +// rm testvet +// + +func TestVet(t *testing.T) { + if !CanRun(t) { + t.Skip("cannot run on this environment") + } + Build(t) + defer os.Remove(binary) + + // errchk ./testvet + gos, err := filepath.Glob(filepath.Join(dataDir, "*.go")) + if err != nil { + t.Fatal(err) + } + asms, err := filepath.Glob(filepath.Join(dataDir, "*.s")) + if err != nil { + t.Fatal(err) + } + files := append(gos, asms...) + Vet(t, files) +} + +func TestDivergentPackagesExamples(t *testing.T) { + if !CanRun(t) { + t.Skip("cannot run on this environment") + } + Build(t) + defer os.Remove(binary) + + // errchk ./testvet + Vet(t, []string{"testdata/divergent/buf.go", "testdata/divergent/buf_test.go"}) +} + +func TestIncompleteExamples(t *testing.T) { + if !CanRun(t) { + t.Skip("cannot run on this environment") + } + Build(t) + defer os.Remove(binary) + + // errchk ./testvet + Vet(t, []string{"testdata/incomplete/examples_test.go"}) +} + +func run(c *exec.Cmd, t *testing.T) bool { + output, err := c.CombinedOutput() + os.Stderr.Write(output) + if err != nil { + t.Fatal(err) + } + // Errchk delights by not returning non-zero status if it finds errors, so we look at the output. + // It prints "BUG" if there is a failure. + if !c.ProcessState.Success() { + return false + } + return !bytes.Contains(output, []byte("BUG")) +} + +// TestTags verifies that the -tags argument controls which files to check. +func TestTags(t *testing.T) { + // go build + cmd := exec.Command("go", "build", "-o", binary) + run(cmd, t) + + defer os.Remove(binary) + + args := []string{ + "-tags=testtag", + "-v", // We're going to look at the files it examines. + "testdata/tagtest", + } + cmd = exec.Command("./"+binary, args...) + output, err := cmd.CombinedOutput() + if err != nil { + t.Fatal(err) + } + // file1 has testtag and file2 has !testtag. + if !bytes.Contains(output, []byte(filepath.Join("tagtest", "file1.go"))) { + t.Error("file1 was excluded, should be included") + } + if bytes.Contains(output, []byte(filepath.Join("tagtest", "file2.go"))) { + t.Error("file2 was included, should be excluded") + } +} diff --git a/vendor/golang.org/x/tools/cmd/vet/whitelist/whitelist.go b/vendor/golang.org/x/tools/cmd/vet/whitelist/whitelist.go new file mode 100644 index 0000000000..d6f0dce821 --- /dev/null +++ b/vendor/golang.org/x/tools/cmd/vet/whitelist/whitelist.go @@ -0,0 +1,53 @@ +// Copyright 2013 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 whitelist defines exceptions for the vet tool. +package whitelist // import "golang.org/x/tools/cmd/vet/whitelist" + +// UnkeyedLiteral are types that are actually slices, but +// syntactically, we cannot tell whether the Typ in pkg.Typ{1, 2, 3} +// is a slice or a struct, so we whitelist all the standard package +// library's exported slice types. +var UnkeyedLiteral = map[string]bool{ + /* + find $GOROOT/src -type f | grep -v _test.go | xargs grep '^type.*\[\]' | \ + grep -v ' map\[' | sed 's,/[^/]*go.type,,' | sed 's,.*src/,,' | \ + sed 's, ,.,' | sed 's, .*,,' | grep -v '\.[a-z]' | \ + sort | awk '{ print "\"" $0 "\": true," }' + */ + "crypto/x509/pkix.RDNSequence": true, + "crypto/x509/pkix.RelativeDistinguishedNameSET": true, + "database/sql.RawBytes": true, + "debug/macho.LoadBytes": true, + "encoding/asn1.ObjectIdentifier": true, + "encoding/asn1.RawContent": true, + "encoding/json.RawMessage": true, + "encoding/xml.CharData": true, + "encoding/xml.Comment": true, + "encoding/xml.Directive": true, + "go/scanner.ErrorList": true, + "image/color.Palette": true, + "net.HardwareAddr": true, + "net.IP": true, + "net.IPMask": true, + "sort.Float64Slice": true, + "sort.IntSlice": true, + "sort.StringSlice": true, + "unicode.SpecialCase": true, + + // These image and image/color struct types are frozen. We will never add fields to them. + "image/color.Alpha16": true, + "image/color.Alpha": true, + "image/color.CMYK": true, + "image/color.Gray16": true, + "image/color.Gray": true, + "image/color.NRGBA64": true, + "image/color.NRGBA": true, + "image/color.RGBA64": true, + "image/color.RGBA": true, + "image/color.YCbCr": true, + "image.Point": true, + "image.Rectangle": true, + "image.Uniform": true, +} diff --git a/vendor/golang.org/x/tools/codereview.cfg b/vendor/golang.org/x/tools/codereview.cfg new file mode 100644 index 0000000000..3f8b14b64e --- /dev/null +++ b/vendor/golang.org/x/tools/codereview.cfg @@ -0,0 +1 @@ +issuerepo: golang/go diff --git a/vendor/golang.org/x/tools/container/intsets/popcnt_amd64.go b/vendor/golang.org/x/tools/container/intsets/popcnt_amd64.go new file mode 100644 index 0000000000..99ea813d28 --- /dev/null +++ b/vendor/golang.org/x/tools/container/intsets/popcnt_amd64.go @@ -0,0 +1,20 @@ +// 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 amd64,!appengine,!gccgo + +package intsets + +func popcnt(x word) int +func havePOPCNT() bool + +var hasPOPCNT = havePOPCNT() + +// popcount returns the population count (number of set bits) of x. +func popcount(x word) int { + if hasPOPCNT { + return popcnt(x) + } + return popcountTable(x) // faster than Hacker's Delight +} diff --git a/vendor/golang.org/x/tools/container/intsets/popcnt_amd64.s b/vendor/golang.org/x/tools/container/intsets/popcnt_amd64.s new file mode 100644 index 0000000000..05c3d6fb57 --- /dev/null +++ b/vendor/golang.org/x/tools/container/intsets/popcnt_amd64.s @@ -0,0 +1,30 @@ +// 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 amd64,!appengine,!gccgo + +#include "textflag.h" + +// func havePOPCNT() bool +TEXT ·havePOPCNT(SB),4,$0 + MOVQ $1, AX + CPUID + SHRQ $23, CX + ANDQ $1, CX + MOVB CX, ret+0(FP) + RET + +// func popcnt(word) int +TEXT ·popcnt(SB),NOSPLIT,$0-8 + XORQ AX, AX + MOVQ x+0(FP), SI + // POPCNT (SI), AX is not recognized by Go assembler, + // so we assemble it ourselves. + BYTE $0xf3 + BYTE $0x48 + BYTE $0x0f + BYTE $0xb8 + BYTE $0xc6 + MOVQ AX, ret+8(FP) + RET diff --git a/vendor/golang.org/x/tools/container/intsets/popcnt_gccgo.go b/vendor/golang.org/x/tools/container/intsets/popcnt_gccgo.go new file mode 100644 index 0000000000..82a8875c85 --- /dev/null +++ b/vendor/golang.org/x/tools/container/intsets/popcnt_gccgo.go @@ -0,0 +1,9 @@ +// 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 gccgo + +package intsets + +func popcount(x word) int diff --git a/vendor/golang.org/x/tools/container/intsets/popcnt_gccgo_c.c b/vendor/golang.org/x/tools/container/intsets/popcnt_gccgo_c.c new file mode 100644 index 0000000000..08abb32ec4 --- /dev/null +++ b/vendor/golang.org/x/tools/container/intsets/popcnt_gccgo_c.c @@ -0,0 +1,19 @@ +// 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 gccgo + +#include +#include +#include + +#define _STRINGIFY2_(x) #x +#define _STRINGIFY_(x) _STRINGIFY2_(x) +#define GOSYM_PREFIX _STRINGIFY_(__USER_LABEL_PREFIX__) + +extern intptr_t popcount(uintptr_t x) __asm__(GOSYM_PREFIX GOPKGPATH ".popcount"); + +intptr_t popcount(uintptr_t x) { + return __builtin_popcountl((unsigned long)(x)); +} diff --git a/vendor/golang.org/x/tools/container/intsets/popcnt_generic.go b/vendor/golang.org/x/tools/container/intsets/popcnt_generic.go new file mode 100644 index 0000000000..3985a1da1a --- /dev/null +++ b/vendor/golang.org/x/tools/container/intsets/popcnt_generic.go @@ -0,0 +1,33 @@ +// 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 !amd64 appengine +// +build !gccgo + +package intsets + +import "runtime" + +// We compared three algorithms---Hacker's Delight, table lookup, +// and AMD64's SSE4.1 hardware POPCNT---on a 2.67GHz Xeon X5550. +// +// % GOARCH=amd64 go test -run=NONE -bench=Popcount +// POPCNT 5.12 ns/op +// Table 8.53 ns/op +// HackersDelight 9.96 ns/op +// +// % GOARCH=386 go test -run=NONE -bench=Popcount +// Table 10.4 ns/op +// HackersDelight 5.23 ns/op +// +// (AMD64's ABM1 hardware supports ntz and nlz too, +// but they aren't critical.) + +// popcount returns the population count (number of set bits) of x. +func popcount(x word) int { + if runtime.GOARCH == "386" { + return popcountHD(uint32(x)) + } + return popcountTable(x) +} diff --git a/vendor/golang.org/x/tools/container/intsets/sparse.go b/vendor/golang.org/x/tools/container/intsets/sparse.go new file mode 100644 index 0000000000..8847febf1d --- /dev/null +++ b/vendor/golang.org/x/tools/container/intsets/sparse.go @@ -0,0 +1,967 @@ +// 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 intsets provides Sparse, a compact and fast representation +// for sparse sets of int values. +// +// The time complexity of the operations Len, Insert, Remove and Has +// is in O(n) but in practice those methods are faster and more +// space-efficient than equivalent operations on sets based on the Go +// map type. The IsEmpty, Min, Max, Clear and TakeMin operations +// require constant time. +// +package intsets // import "golang.org/x/tools/container/intsets" + +// TODO(adonovan): +// - Add InsertAll(...int), RemoveAll(...int) +// - Add 'bool changed' results for {Intersection,Difference}With too. +// +// TODO(adonovan): implement Dense, a dense bit vector with a similar API. +// The space usage would be proportional to Max(), not Len(), and the +// implementation would be based upon big.Int. +// +// TODO(adonovan): experiment with making the root block indirect (nil +// iff IsEmpty). This would reduce the memory usage when empty and +// might simplify the aliasing invariants. +// +// TODO(adonovan): opt: make UnionWith and Difference faster. +// These are the hot-spots for go/pointer. + +import ( + "bytes" + "fmt" +) + +// A Sparse is a set of int values. +// Sparse operations (even queries) are not concurrency-safe. +// +// The zero value for Sparse is a valid empty set. +// +// Sparse sets must be copied using the Copy method, not by assigning +// a Sparse value. +// +type Sparse struct { + // An uninitialized Sparse represents an empty set. + // An empty set may also be represented by + // root.next == root.prev == &root. + // In a non-empty set, root.next points to the first block and + // root.prev to the last. + // root.offset and root.bits are unused. + root block +} + +type word uintptr + +const ( + _m = ^word(0) + bitsPerWord = 8 << (_m>>8&1 + _m>>16&1 + _m>>32&1) + bitsPerBlock = 256 // optimal value for go/pointer solver performance + wordsPerBlock = bitsPerBlock / bitsPerWord +) + +// Limit values of implementation-specific int type. +const ( + MaxInt = int(^uint(0) >> 1) + MinInt = -MaxInt - 1 +) + +// -- block ------------------------------------------------------------ + +// A set is represented as a circular doubly-linked list of blocks, +// each containing an offset and a bit array of fixed size +// bitsPerBlock; the blocks are ordered by increasing offset. +// +// The set contains an element x iff the block whose offset is x - (x +// mod bitsPerBlock) has the bit (x mod bitsPerBlock) set, where mod +// is the Euclidean remainder. +// +// A block may only be empty transiently. +// +type block struct { + offset int // offset mod bitsPerBlock == 0 + bits [wordsPerBlock]word // contains at least one set bit + next, prev *block // doubly-linked list of blocks +} + +// wordMask returns the word index (in block.bits) +// and single-bit mask for the block's ith bit. +func wordMask(i uint) (w uint, mask word) { + w = i / bitsPerWord + mask = 1 << (i % bitsPerWord) + return +} + +// insert sets the block b's ith bit and +// returns true if it was not already set. +// +func (b *block) insert(i uint) bool { + w, mask := wordMask(i) + if b.bits[w]&mask == 0 { + b.bits[w] |= mask + return true + } + return false +} + +// remove clears the block's ith bit and +// returns true if the bit was previously set. +// NB: may leave the block empty. +// +func (b *block) remove(i uint) bool { + w, mask := wordMask(i) + if b.bits[w]&mask != 0 { + b.bits[w] &^= mask + return true + } + return false +} + +// has reports whether the block's ith bit is set. +func (b *block) has(i uint) bool { + w, mask := wordMask(i) + return b.bits[w]&mask != 0 +} + +// empty reports whether b.len()==0, but more efficiently. +func (b *block) empty() bool { + for _, w := range b.bits { + if w != 0 { + return false + } + } + return true +} + +// len returns the number of set bits in block b. +func (b *block) len() int { + var l int + for _, w := range b.bits { + l += popcount(w) + } + return l +} + +// max returns the maximum element of the block. +// The block must not be empty. +// +func (b *block) max() int { + bi := b.offset + bitsPerBlock + // Decrement bi by number of high zeros in last.bits. + for i := len(b.bits) - 1; i >= 0; i-- { + if w := b.bits[i]; w != 0 { + return bi - nlz(w) - 1 + } + bi -= bitsPerWord + } + panic("BUG: empty block") +} + +// min returns the minimum element of the block, +// and also removes it if take is set. +// The block must not be initially empty. +// NB: may leave the block empty. +// +func (b *block) min(take bool) int { + for i, w := range b.bits { + if w != 0 { + tz := ntz(w) + if take { + b.bits[i] = w &^ (1 << uint(tz)) + } + return b.offset + int(i*bitsPerWord) + tz + } + } + panic("BUG: empty block") +} + +// forEach calls f for each element of block b. +// f must not mutate b's enclosing Sparse. +func (b *block) forEach(f func(int)) { + for i, w := range b.bits { + offset := b.offset + i*bitsPerWord + for bi := 0; w != 0 && bi < bitsPerWord; bi++ { + if w&1 != 0 { + f(offset) + } + offset++ + w >>= 1 + } + } +} + +// offsetAndBitIndex returns the offset of the block that would +// contain x and the bit index of x within that block. +// +func offsetAndBitIndex(x int) (int, uint) { + mod := x % bitsPerBlock + if mod < 0 { + // Euclidean (non-negative) remainder + mod += bitsPerBlock + } + return x - mod, uint(mod) +} + +// -- Sparse -------------------------------------------------------------- + +// start returns the root's next block, which is the root block +// (if s.IsEmpty()) or the first true block otherwise. +// start has the side effect of ensuring that s is properly +// initialized. +// +func (s *Sparse) start() *block { + root := &s.root + if root.next == nil { + root.next = root + root.prev = root + } else if root.next.prev != root { + // Copying a Sparse x leads to pernicious corruption: the + // new Sparse y shares the old linked list, but iteration + // on y will never encounter &y.root so it goes into a + // loop. Fail fast before this occurs. + panic("A Sparse has been copied without (*Sparse).Copy()") + } + + return root.next +} + +// IsEmpty reports whether the set s is empty. +func (s *Sparse) IsEmpty() bool { + return s.start() == &s.root +} + +// Len returns the number of elements in the set s. +func (s *Sparse) Len() int { + var l int + for b := s.start(); b != &s.root; b = b.next { + l += b.len() + } + return l +} + +// Max returns the maximum element of the set s, or MinInt if s is empty. +func (s *Sparse) Max() int { + if s.IsEmpty() { + return MinInt + } + return s.root.prev.max() +} + +// Min returns the minimum element of the set s, or MaxInt if s is empty. +func (s *Sparse) Min() int { + if s.IsEmpty() { + return MaxInt + } + return s.root.next.min(false) +} + +// block returns the block that would contain offset, +// or nil if s contains no such block. +// +func (s *Sparse) block(offset int) *block { + b := s.start() + for b != &s.root && b.offset <= offset { + if b.offset == offset { + return b + } + b = b.next + } + return nil +} + +// Insert adds x to the set s, and reports whether the set grew. +func (s *Sparse) Insert(x int) bool { + offset, i := offsetAndBitIndex(x) + b := s.start() + for b != &s.root && b.offset <= offset { + if b.offset == offset { + return b.insert(i) + } + b = b.next + } + + // Insert new block before b. + new := &block{offset: offset} + new.next = b + new.prev = b.prev + new.prev.next = new + new.next.prev = new + return new.insert(i) +} + +func (s *Sparse) removeBlock(b *block) { + b.prev.next = b.next + b.next.prev = b.prev +} + +// Remove removes x from the set s, and reports whether the set shrank. +func (s *Sparse) Remove(x int) bool { + offset, i := offsetAndBitIndex(x) + if b := s.block(offset); b != nil { + if !b.remove(i) { + return false + } + if b.empty() { + s.removeBlock(b) + } + return true + } + return false +} + +// Clear removes all elements from the set s. +func (s *Sparse) Clear() { + s.root.next = &s.root + s.root.prev = &s.root +} + +// If set s is non-empty, TakeMin sets *p to the minimum element of +// the set s, removes that element from the set and returns true. +// Otherwise, it returns false and *p is undefined. +// +// This method may be used for iteration over a worklist like so: +// +// var x int +// for worklist.TakeMin(&x) { use(x) } +// +func (s *Sparse) TakeMin(p *int) bool { + head := s.start() + if head == &s.root { + return false + } + *p = head.min(true) + if head.empty() { + s.removeBlock(head) + } + return true +} + +// Has reports whether x is an element of the set s. +func (s *Sparse) Has(x int) bool { + offset, i := offsetAndBitIndex(x) + if b := s.block(offset); b != nil { + return b.has(i) + } + return false +} + +// forEach applies function f to each element of the set s in order. +// +// f must not mutate s. Consequently, forEach is not safe to expose +// to clients. In any case, using "range s.AppendTo()" allows more +// natural control flow with continue/break/return. +// +func (s *Sparse) forEach(f func(int)) { + for b := s.start(); b != &s.root; b = b.next { + b.forEach(f) + } +} + +// Copy sets s to the value of x. +func (s *Sparse) Copy(x *Sparse) { + if s == x { + return + } + + xb := x.start() + sb := s.start() + for xb != &x.root { + if sb == &s.root { + sb = s.insertBlockBefore(sb) + } + sb.offset = xb.offset + sb.bits = xb.bits + xb = xb.next + sb = sb.next + } + s.discardTail(sb) +} + +// insertBlockBefore returns a new block, inserting it before next. +func (s *Sparse) insertBlockBefore(next *block) *block { + b := new(block) + b.next = next + b.prev = next.prev + b.prev.next = b + next.prev = b + return b +} + +// discardTail removes block b and all its successors from s. +func (s *Sparse) discardTail(b *block) { + if b != &s.root { + b.prev.next = &s.root + s.root.prev = b.prev + } +} + +// IntersectionWith sets s to the intersection s ∩ x. +func (s *Sparse) IntersectionWith(x *Sparse) { + if s == x { + return + } + + xb := x.start() + sb := s.start() + for xb != &x.root && sb != &s.root { + switch { + case xb.offset < sb.offset: + xb = xb.next + + case xb.offset > sb.offset: + sb = sb.next + s.removeBlock(sb.prev) + + default: + var sum word + for i := range sb.bits { + r := xb.bits[i] & sb.bits[i] + sb.bits[i] = r + sum |= r + } + if sum != 0 { + sb = sb.next + } else { + // sb will be overwritten or removed + } + + xb = xb.next + } + } + + s.discardTail(sb) +} + +// Intersection sets s to the intersection x ∩ y. +func (s *Sparse) Intersection(x, y *Sparse) { + switch { + case s == x: + s.IntersectionWith(y) + return + case s == y: + s.IntersectionWith(x) + return + case x == y: + s.Copy(x) + return + } + + xb := x.start() + yb := y.start() + sb := s.start() + for xb != &x.root && yb != &y.root { + switch { + case xb.offset < yb.offset: + xb = xb.next + continue + case xb.offset > yb.offset: + yb = yb.next + continue + } + + if sb == &s.root { + sb = s.insertBlockBefore(sb) + } + sb.offset = xb.offset + + var sum word + for i := range sb.bits { + r := xb.bits[i] & yb.bits[i] + sb.bits[i] = r + sum |= r + } + if sum != 0 { + sb = sb.next + } else { + // sb will be overwritten or removed + } + + xb = xb.next + yb = yb.next + } + + s.discardTail(sb) +} + +// Intersects reports whether s ∩ x ≠ ∅. +func (s *Sparse) Intersects(x *Sparse) bool { + sb := s.start() + xb := x.start() + for sb != &s.root && xb != &x.root { + switch { + case xb.offset < sb.offset: + xb = xb.next + case xb.offset > sb.offset: + sb = sb.next + default: + for i := range sb.bits { + if sb.bits[i]&xb.bits[i] != 0 { + return true + } + } + sb = sb.next + xb = xb.next + } + } + return false +} + +// UnionWith sets s to the union s ∪ x, and reports whether s grew. +func (s *Sparse) UnionWith(x *Sparse) bool { + if s == x { + return false + } + + var changed bool + xb := x.start() + sb := s.start() + for xb != &x.root { + if sb != &s.root && sb.offset == xb.offset { + for i := range xb.bits { + if sb.bits[i] != xb.bits[i] { + sb.bits[i] |= xb.bits[i] + changed = true + } + } + xb = xb.next + } else if sb == &s.root || sb.offset > xb.offset { + sb = s.insertBlockBefore(sb) + sb.offset = xb.offset + sb.bits = xb.bits + changed = true + + xb = xb.next + } + sb = sb.next + } + return changed +} + +// Union sets s to the union x ∪ y. +func (s *Sparse) Union(x, y *Sparse) { + switch { + case x == y: + s.Copy(x) + return + case s == x: + s.UnionWith(y) + return + case s == y: + s.UnionWith(x) + return + } + + xb := x.start() + yb := y.start() + sb := s.start() + for xb != &x.root || yb != &y.root { + if sb == &s.root { + sb = s.insertBlockBefore(sb) + } + switch { + case yb == &y.root || (xb != &x.root && xb.offset < yb.offset): + sb.offset = xb.offset + sb.bits = xb.bits + xb = xb.next + + case xb == &x.root || (yb != &y.root && yb.offset < xb.offset): + sb.offset = yb.offset + sb.bits = yb.bits + yb = yb.next + + default: + sb.offset = xb.offset + for i := range xb.bits { + sb.bits[i] = xb.bits[i] | yb.bits[i] + } + xb = xb.next + yb = yb.next + } + sb = sb.next + } + + s.discardTail(sb) +} + +// DifferenceWith sets s to the difference s ∖ x. +func (s *Sparse) DifferenceWith(x *Sparse) { + if s == x { + s.Clear() + return + } + + xb := x.start() + sb := s.start() + for xb != &x.root && sb != &s.root { + switch { + case xb.offset > sb.offset: + sb = sb.next + + case xb.offset < sb.offset: + xb = xb.next + + default: + var sum word + for i := range sb.bits { + r := sb.bits[i] & ^xb.bits[i] + sb.bits[i] = r + sum |= r + } + sb = sb.next + xb = xb.next + + if sum == 0 { + s.removeBlock(sb.prev) + } + } + } +} + +// Difference sets s to the difference x ∖ y. +func (s *Sparse) Difference(x, y *Sparse) { + switch { + case x == y: + s.Clear() + return + case s == x: + s.DifferenceWith(y) + return + case s == y: + var y2 Sparse + y2.Copy(y) + s.Difference(x, &y2) + return + } + + xb := x.start() + yb := y.start() + sb := s.start() + for xb != &x.root && yb != &y.root { + if xb.offset > yb.offset { + // y has block, x has none + yb = yb.next + continue + } + + if sb == &s.root { + sb = s.insertBlockBefore(sb) + } + sb.offset = xb.offset + + switch { + case xb.offset < yb.offset: + // x has block, y has none + sb.bits = xb.bits + + sb = sb.next + + default: + // x and y have corresponding blocks + var sum word + for i := range sb.bits { + r := xb.bits[i] & ^yb.bits[i] + sb.bits[i] = r + sum |= r + } + if sum != 0 { + sb = sb.next + } else { + // sb will be overwritten or removed + } + + yb = yb.next + } + xb = xb.next + } + + for xb != &x.root { + if sb == &s.root { + sb = s.insertBlockBefore(sb) + } + sb.offset = xb.offset + sb.bits = xb.bits + sb = sb.next + + xb = xb.next + } + + s.discardTail(sb) +} + +// SymmetricDifferenceWith sets s to the symmetric difference s ∆ x. +func (s *Sparse) SymmetricDifferenceWith(x *Sparse) { + if s == x { + s.Clear() + return + } + + sb := s.start() + xb := x.start() + for xb != &x.root && sb != &s.root { + switch { + case sb.offset < xb.offset: + sb = sb.next + case xb.offset < sb.offset: + nb := s.insertBlockBefore(sb) + nb.offset = xb.offset + nb.bits = xb.bits + xb = xb.next + default: + var sum word + for i := range sb.bits { + r := sb.bits[i] ^ xb.bits[i] + sb.bits[i] = r + sum |= r + } + sb = sb.next + xb = xb.next + if sum == 0 { + s.removeBlock(sb.prev) + } + } + } + + for xb != &x.root { // append the tail of x to s + sb = s.insertBlockBefore(sb) + sb.offset = xb.offset + sb.bits = xb.bits + sb = sb.next + xb = xb.next + } +} + +// SymmetricDifference sets s to the symmetric difference x ∆ y. +func (s *Sparse) SymmetricDifference(x, y *Sparse) { + switch { + case x == y: + s.Clear() + return + case s == x: + s.SymmetricDifferenceWith(y) + return + case s == y: + s.SymmetricDifferenceWith(x) + return + } + + sb := s.start() + xb := x.start() + yb := y.start() + for xb != &x.root && yb != &y.root { + if sb == &s.root { + sb = s.insertBlockBefore(sb) + } + switch { + case yb.offset < xb.offset: + sb.offset = yb.offset + sb.bits = yb.bits + sb = sb.next + yb = yb.next + case xb.offset < yb.offset: + sb.offset = xb.offset + sb.bits = xb.bits + sb = sb.next + xb = xb.next + default: + var sum word + for i := range sb.bits { + r := xb.bits[i] ^ yb.bits[i] + sb.bits[i] = r + sum |= r + } + if sum != 0 { + sb.offset = xb.offset + sb = sb.next + } + xb = xb.next + yb = yb.next + } + } + + for xb != &x.root { // append the tail of x to s + if sb == &s.root { + sb = s.insertBlockBefore(sb) + } + sb.offset = xb.offset + sb.bits = xb.bits + sb = sb.next + xb = xb.next + } + + for yb != &y.root { // append the tail of y to s + if sb == &s.root { + sb = s.insertBlockBefore(sb) + } + sb.offset = yb.offset + sb.bits = yb.bits + sb = sb.next + yb = yb.next + } + + s.discardTail(sb) +} + +// SubsetOf reports whether s ∖ x = ∅. +func (s *Sparse) SubsetOf(x *Sparse) bool { + if s == x { + return true + } + + sb := s.start() + xb := x.start() + for sb != &s.root { + switch { + case xb == &x.root || xb.offset > sb.offset: + return false + case xb.offset < sb.offset: + xb = xb.next + default: + for i := range sb.bits { + if sb.bits[i]&^xb.bits[i] != 0 { + return false + } + } + sb = sb.next + xb = xb.next + } + } + return true +} + +// Equals reports whether the sets s and t have the same elements. +func (s *Sparse) Equals(t *Sparse) bool { + if s == t { + return true + } + sb := s.start() + tb := t.start() + for { + switch { + case sb == &s.root && tb == &t.root: + return true + case sb == &s.root || tb == &t.root: + return false + case sb.offset != tb.offset: + return false + case sb.bits != tb.bits: + return false + } + + sb = sb.next + tb = tb.next + } +} + +// String returns a human-readable description of the set s. +func (s *Sparse) String() string { + var buf bytes.Buffer + buf.WriteByte('{') + s.forEach(func(x int) { + if buf.Len() > 1 { + buf.WriteByte(' ') + } + fmt.Fprintf(&buf, "%d", x) + }) + buf.WriteByte('}') + return buf.String() +} + +// BitString returns the set as a string of 1s and 0s denoting the sum +// of the i'th powers of 2, for each i in s. A radix point, always +// preceded by a digit, appears if the sum is non-integral. +// +// Examples: +// {}.BitString() = "0" +// {4,5}.BitString() = "110000" +// {-3}.BitString() = "0.001" +// {-3,0,4,5}.BitString() = "110001.001" +// +func (s *Sparse) BitString() string { + if s.IsEmpty() { + return "0" + } + + min, max := s.Min(), s.Max() + var nbytes int + if max > 0 { + nbytes = max + } + nbytes++ // zero bit + radix := nbytes + if min < 0 { + nbytes += len(".") - min + } + + b := make([]byte, nbytes) + for i := range b { + b[i] = '0' + } + if radix < nbytes { + b[radix] = '.' + } + s.forEach(func(x int) { + if x >= 0 { + x += len(".") + } + b[radix-x] = '1' + }) + return string(b) +} + +// GoString returns a string showing the internal representation of +// the set s. +// +func (s *Sparse) GoString() string { + var buf bytes.Buffer + for b := s.start(); b != &s.root; b = b.next { + fmt.Fprintf(&buf, "block %p {offset=%d next=%p prev=%p", + b, b.offset, b.next, b.prev) + for _, w := range b.bits { + fmt.Fprintf(&buf, " 0%016x", w) + } + fmt.Fprintf(&buf, "}\n") + } + return buf.String() +} + +// AppendTo returns the result of appending the elements of s to slice +// in order. +func (s *Sparse) AppendTo(slice []int) []int { + s.forEach(func(x int) { + slice = append(slice, x) + }) + return slice +} + +// -- Testing/debugging ------------------------------------------------ + +// check returns an error if the representation invariants of s are violated. +func (s *Sparse) check() error { + if !s.root.empty() { + return fmt.Errorf("non-empty root block") + } + if s.root.offset != 0 { + return fmt.Errorf("root block has non-zero offset %d", s.root.offset) + } + for b := s.start(); b != &s.root; b = b.next { + if b.offset%bitsPerBlock != 0 { + return fmt.Errorf("bad offset modulo: %d", b.offset) + } + if b.empty() { + return fmt.Errorf("empty block") + } + if b.prev.next != b { + return fmt.Errorf("bad prev.next link") + } + if b.next.prev != b { + return fmt.Errorf("bad next.prev link") + } + if b.prev != &s.root { + if b.offset <= b.prev.offset { + return fmt.Errorf("bad offset order: b.offset=%d, prev.offset=%d", + b.offset, b.prev.offset) + } + } + } + return nil +} diff --git a/vendor/golang.org/x/tools/container/intsets/sparse_test.go b/vendor/golang.org/x/tools/container/intsets/sparse_test.go new file mode 100644 index 0000000000..34b9a4e7f7 --- /dev/null +++ b/vendor/golang.org/x/tools/container/intsets/sparse_test.go @@ -0,0 +1,638 @@ +// 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 intsets_test + +import ( + "fmt" + "log" + "math/rand" + "sort" + "strings" + "testing" + + "golang.org/x/tools/container/intsets" +) + +func TestBasics(t *testing.T) { + var s intsets.Sparse + if len := s.Len(); len != 0 { + t.Errorf("Len({}): got %d, want 0", len) + } + if s := s.String(); s != "{}" { + t.Errorf("String({}): got %q, want \"{}\"", s) + } + if s.Has(3) { + t.Errorf("Has(3): got true, want false") + } + if err := s.Check(); err != nil { + t.Error(err) + } + + if !s.Insert(3) { + t.Errorf("Insert(3): got false, want true") + } + if max := s.Max(); max != 3 { + t.Errorf("Max: got %d, want 3", max) + } + + if !s.Insert(435) { + t.Errorf("Insert(435): got false, want true") + } + if s := s.String(); s != "{3 435}" { + t.Errorf("String({3 435}): got %q, want \"{3 435}\"", s) + } + if max := s.Max(); max != 435 { + t.Errorf("Max: got %d, want 435", max) + } + if len := s.Len(); len != 2 { + t.Errorf("Len: got %d, want 2", len) + } + + if !s.Remove(435) { + t.Errorf("Remove(435): got false, want true") + } + if s := s.String(); s != "{3}" { + t.Errorf("String({3}): got %q, want \"{3}\"", s) + } +} + +// Insert, Len, IsEmpty, Hash, Clear, AppendTo. +func TestMoreBasics(t *testing.T) { + set := new(intsets.Sparse) + set.Insert(456) + set.Insert(123) + set.Insert(789) + if set.Len() != 3 { + t.Errorf("%s.Len: got %d, want 3", set, set.Len()) + } + if set.IsEmpty() { + t.Errorf("%s.IsEmpty: got true", set) + } + if !set.Has(123) { + t.Errorf("%s.Has(123): got false", set) + } + if set.Has(1234) { + t.Errorf("%s.Has(1234): got true", set) + } + got := set.AppendTo([]int{-1}) + if want := []int{-1, 123, 456, 789}; fmt.Sprint(got) != fmt.Sprint(want) { + t.Errorf("%s.AppendTo: got %v, want %v", set, got, want) + } + + set.Clear() + + if set.Len() != 0 { + t.Errorf("Clear: got %d, want 0", set.Len()) + } + if !set.IsEmpty() { + t.Errorf("IsEmpty: got false") + } + if set.Has(123) { + t.Errorf("%s.Has: got false", set) + } +} + +func TestTakeMin(t *testing.T) { + var set intsets.Sparse + set.Insert(456) + set.Insert(123) + set.Insert(789) + set.Insert(-123) + var got int + for i, want := range []int{-123, 123, 456, 789} { + if !set.TakeMin(&got) || got != want { + t.Errorf("TakeMin #%d: got %d, want %d", i, got, want) + } + } + if set.TakeMin(&got) { + t.Errorf("%s.TakeMin returned true", &set) + } + if err := set.Check(); err != nil { + t.Fatalf("check: %s: %#v", err, &set) + } +} + +func TestMinAndMax(t *testing.T) { + values := []int{0, 456, 123, 789, -123} // elt 0 => empty set + wantMax := []int{intsets.MinInt, 456, 456, 789, 789} + wantMin := []int{intsets.MaxInt, 456, 123, 123, -123} + + var set intsets.Sparse + for i, x := range values { + if i != 0 { + set.Insert(x) + } + if got, want := set.Min(), wantMin[i]; got != want { + t.Errorf("Min #%d: got %d, want %d", i, got, want) + } + if got, want := set.Max(), wantMax[i]; got != want { + t.Errorf("Max #%d: got %d, want %d", i, got, want) + } + } + + set.Insert(intsets.MinInt) + if got, want := set.Min(), intsets.MinInt; got != want { + t.Errorf("Min: got %d, want %d", got, want) + } + + set.Insert(intsets.MaxInt) + if got, want := set.Max(), intsets.MaxInt; got != want { + t.Errorf("Max: got %d, want %d", got, want) + } +} + +func TestEquals(t *testing.T) { + var setX intsets.Sparse + setX.Insert(456) + setX.Insert(123) + setX.Insert(789) + + if !setX.Equals(&setX) { + t.Errorf("Equals(%s, %s): got false", &setX, &setX) + } + + var setY intsets.Sparse + setY.Insert(789) + setY.Insert(456) + setY.Insert(123) + + if !setX.Equals(&setY) { + t.Errorf("Equals(%s, %s): got false", &setX, &setY) + } + + setY.Insert(1) + if setX.Equals(&setY) { + t.Errorf("Equals(%s, %s): got true", &setX, &setY) + } + + var empty intsets.Sparse + if setX.Equals(&empty) { + t.Errorf("Equals(%s, %s): got true", &setX, &empty) + } + + // Edge case: some block (with offset=0) appears in X but not Y. + setY.Remove(123) + if setX.Equals(&setY) { + t.Errorf("Equals(%s, %s): got true", &setX, &setY) + } +} + +// A pset is a parallel implementation of a set using both an intsets.Sparse +// and a built-in hash map. +type pset struct { + hash map[int]bool + bits intsets.Sparse +} + +func makePset() *pset { + return &pset{hash: make(map[int]bool)} +} + +func (set *pset) add(n int) { + prev := len(set.hash) + set.hash[n] = true + grewA := len(set.hash) > prev + + grewB := set.bits.Insert(n) + + if grewA != grewB { + panic(fmt.Sprintf("add(%d): grewA=%t grewB=%t", n, grewA, grewB)) + } +} + +func (set *pset) remove(n int) { + prev := len(set.hash) + delete(set.hash, n) + shrankA := len(set.hash) < prev + + shrankB := set.bits.Remove(n) + + if shrankA != shrankB { + panic(fmt.Sprintf("remove(%d): shrankA=%t shrankB=%t", n, shrankA, shrankB)) + } +} + +func (set *pset) check(t *testing.T, msg string) { + var eltsA []int + for elt := range set.hash { + eltsA = append(eltsA, int(elt)) + } + sort.Ints(eltsA) + + eltsB := set.bits.AppendTo(nil) + + if a, b := fmt.Sprint(eltsA), fmt.Sprint(eltsB); a != b { + t.Errorf("check(%s): hash=%s bits=%s (%s)", msg, a, b, &set.bits) + } + + if err := set.bits.Check(); err != nil { + t.Fatalf("Check(%s): %s: %#v", msg, err, &set.bits) + } +} + +// randomPset returns a parallel set of random size and elements. +func randomPset(prng *rand.Rand, maxSize int) *pset { + set := makePset() + size := int(prng.Int()) % maxSize + for i := 0; i < size; i++ { + // TODO(adonovan): benchmark how performance varies + // with this sparsity parameter. + n := int(prng.Int()) % 10000 + set.add(n) + } + return set +} + +// TestRandomMutations performs the same random adds/removes on two +// set implementations and ensures that they compute the same result. +func TestRandomMutations(t *testing.T) { + const debug = false + + set := makePset() + prng := rand.New(rand.NewSource(0)) + for i := 0; i < 10000; i++ { + n := int(prng.Int())%2000 - 1000 + if i%2 == 0 { + if debug { + log.Printf("add %d", n) + } + set.add(n) + } else { + if debug { + log.Printf("remove %d", n) + } + set.remove(n) + } + if debug { + set.check(t, "post mutation") + } + } + set.check(t, "final") + if debug { + log.Print(&set.bits) + } +} + +// TestSetOperations exercises classic set operations: ∩ , ∪, \. +func TestSetOperations(t *testing.T) { + prng := rand.New(rand.NewSource(0)) + + // Use random sets of sizes from 0 to about 1000. + // For each operator, we test variations such as + // Z.op(X, Y), Z.op(X, Z) and Z.op(Z, Y) to exercise + // the degenerate cases of each method implementation. + for i := uint(0); i < 12; i++ { + X := randomPset(prng, 1<, == cases in IntersectionWith that the + // TestSetOperations data is too dense to cover. + var X, Y intsets.Sparse + X.Insert(1) + X.Insert(1000) + X.Insert(8000) + Y.Insert(1) + Y.Insert(2000) + Y.Insert(4000) + X.IntersectionWith(&Y) + if got, want := X.String(), "{1}"; got != want { + t.Errorf("IntersectionWith: got %s, want %s", got, want) + } +} + +func TestIntersects(t *testing.T) { + prng := rand.New(rand.NewSource(0)) + + for i := uint(0); i < 12; i++ { + X, Y := randomPset(prng, 1<> 1) & 0x55555555 + x = (x & 0x33333333) + ((x >> 2) & 0x33333333) + x = (x + (x >> 4)) & 0x0f0f0f0f + x = x + (x >> 8) + x = x + (x >> 16) + return int(x & 0x0000003f) +} + +var a [1 << 8]byte + +func init() { + for i := range a { + var n byte + for x := i; x != 0; x >>= 1 { + if x&1 != 0 { + n++ + } + } + a[i] = n + } +} + +func popcountTable(x word) int { + return int(a[byte(x>>(0*8))] + + a[byte(x>>(1*8))] + + a[byte(x>>(2*8))] + + a[byte(x>>(3*8))] + + a[byte(x>>(4*8))] + + a[byte(x>>(5*8))] + + a[byte(x>>(6*8))] + + a[byte(x>>(7*8))]) +} + +// nlz returns the number of leading zeros of x. +// From Hacker's Delight, fig 5.11. +func nlz(x word) int { + x |= (x >> 1) + x |= (x >> 2) + x |= (x >> 4) + x |= (x >> 8) + x |= (x >> 16) + x |= (x >> 32) + return popcount(^x) +} + +// ntz returns the number of trailing zeros of x. +// From Hacker's Delight, fig 5.13. +func ntz(x word) int { + if x == 0 { + return bitsPerWord + } + n := 1 + if bitsPerWord == 64 { + if (x & 0xffffffff) == 0 { + n = n + 32 + x = x >> 32 + } + } + if (x & 0x0000ffff) == 0 { + n = n + 16 + x = x >> 16 + } + if (x & 0x000000ff) == 0 { + n = n + 8 + x = x >> 8 + } + if (x & 0x0000000f) == 0 { + n = n + 4 + x = x >> 4 + } + if (x & 0x00000003) == 0 { + n = n + 2 + x = x >> 2 + } + return n - int(x&1) +} diff --git a/vendor/golang.org/x/tools/container/intsets/util_test.go b/vendor/golang.org/x/tools/container/intsets/util_test.go new file mode 100644 index 0000000000..e4cc6597f1 --- /dev/null +++ b/vendor/golang.org/x/tools/container/intsets/util_test.go @@ -0,0 +1,58 @@ +// 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 intsets + +import ( + "math/rand" + "testing" +) + +func TestNLZ(t *testing.T) { + // Test the platform-specific edge case. + // NB: v must be a var (not const) so that the word() conversion is dynamic. + // Otherwise the compiler will report an error. + v := uint64(0x0000801000000000) + n := nlz(word(v)) + want := 32 // (on 32-bit) + if bitsPerWord == 64 { + want = 16 + } + if n != want { + t.Errorf("%d-bit nlz(%d) = %d, want %d", bitsPerWord, v, n, want) + } +} + +// Backdoor for testing. +func (s *Sparse) Check() error { return s.check() } + +func dumbPopcount(x word) int { + var popcnt int + for i := uint(0); i < bitsPerWord; i++ { + if x&(1< tag and will be used to colorize the source +type Boundary struct { + Offset int // Location as a byte offset in the source file. + Start bool // Is this the start of a block? + Count int // Event count from the cover profile. + Norm float64 // Count normalized to [0..1]. +} + +// Boundaries returns a Profile as a set of Boundary objects within the provided src. +func (p *Profile) Boundaries(src []byte) (boundaries []Boundary) { + // Find maximum count. + max := 0 + for _, b := range p.Blocks { + if b.Count > max { + max = b.Count + } + } + // Divisor for normalization. + divisor := math.Log(float64(max)) + + // boundary returns a Boundary, populating the Norm field with a normalized Count. + boundary := func(offset int, start bool, count int) Boundary { + b := Boundary{Offset: offset, Start: start, Count: count} + if !start || count == 0 { + return b + } + if max <= 1 { + b.Norm = 0.8 // Profile is in"set" mode; we want a heat map. Use cov8 in the CSS. + } else if count > 0 { + b.Norm = math.Log(float64(count)) / divisor + } + return b + } + + line, col := 1, 2 // TODO: Why is this 2? + for si, bi := 0, 0; si < len(src) && bi < len(p.Blocks); { + b := p.Blocks[bi] + if b.StartLine == line && b.StartCol == col { + boundaries = append(boundaries, boundary(si, true, b.Count)) + } + if b.EndLine == line && b.EndCol == col || line > b.EndLine { + boundaries = append(boundaries, boundary(si, false, 0)) + bi++ + continue // Don't advance through src; maybe the next block starts here. + } + if src[si] == '\n' { + line++ + col = 0 + } + col++ + si++ + } + sort.Sort(boundariesByPos(boundaries)) + return +} + +type boundariesByPos []Boundary + +func (b boundariesByPos) Len() int { return len(b) } +func (b boundariesByPos) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b boundariesByPos) Less(i, j int) bool { + if b[i].Offset == b[j].Offset { + return !b[i].Start && b[j].Start + } + return b[i].Offset < b[j].Offset +} diff --git a/vendor/golang.org/x/tools/go/ast/astutil/enclosing.go b/vendor/golang.org/x/tools/go/ast/astutil/enclosing.go new file mode 100644 index 0000000000..340c9e6cdc --- /dev/null +++ b/vendor/golang.org/x/tools/go/ast/astutil/enclosing.go @@ -0,0 +1,624 @@ +// Copyright 2013 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 astutil + +// This file defines utilities for working with source positions. + +import ( + "fmt" + "go/ast" + "go/token" + "sort" +) + +// PathEnclosingInterval returns the node that encloses the source +// interval [start, end), and all its ancestors up to the AST root. +// +// The definition of "enclosing" used by this function considers +// additional whitespace abutting a node to be enclosed by it. +// In this example: +// +// z := x + y // add them +// <-A-> +// <----B-----> +// +// the ast.BinaryExpr(+) node is considered to enclose interval B +// even though its [Pos()..End()) is actually only interval A. +// This behaviour makes user interfaces more tolerant of imperfect +// input. +// +// This function treats tokens as nodes, though they are not included +// in the result. e.g. PathEnclosingInterval("+") returns the +// enclosing ast.BinaryExpr("x + y"). +// +// If start==end, the 1-char interval following start is used instead. +// +// The 'exact' result is true if the interval contains only path[0] +// and perhaps some adjacent whitespace. It is false if the interval +// overlaps multiple children of path[0], or if it contains only +// interior whitespace of path[0]. +// In this example: +// +// z := x + y // add them +// <--C--> <---E--> +// ^ +// D +// +// intervals C, D and E are inexact. C is contained by the +// z-assignment statement, because it spans three of its children (:=, +// x, +). So too is the 1-char interval D, because it contains only +// interior whitespace of the assignment. E is considered interior +// whitespace of the BlockStmt containing the assignment. +// +// Precondition: [start, end) both lie within the same file as root. +// TODO(adonovan): return (nil, false) in this case and remove precond. +// Requires FileSet; see loader.tokenFileContainsPos. +// +// Postcondition: path is never nil; it always contains at least 'root'. +// +func PathEnclosingInterval(root *ast.File, start, end token.Pos) (path []ast.Node, exact bool) { + // fmt.Printf("EnclosingInterval %d %d\n", start, end) // debugging + + // Precondition: node.[Pos..End) and adjoining whitespace contain [start, end). + var visit func(node ast.Node) bool + visit = func(node ast.Node) bool { + path = append(path, node) + + nodePos := node.Pos() + nodeEnd := node.End() + + // fmt.Printf("visit(%T, %d, %d)\n", node, nodePos, nodeEnd) // debugging + + // Intersect [start, end) with interval of node. + if start < nodePos { + start = nodePos + } + if end > nodeEnd { + end = nodeEnd + } + + // Find sole child that contains [start, end). + children := childrenOf(node) + l := len(children) + for i, child := range children { + // [childPos, childEnd) is unaugmented interval of child. + childPos := child.Pos() + childEnd := child.End() + + // [augPos, augEnd) is whitespace-augmented interval of child. + augPos := childPos + augEnd := childEnd + if i > 0 { + augPos = children[i-1].End() // start of preceding whitespace + } + if i < l-1 { + nextChildPos := children[i+1].Pos() + // Does [start, end) lie between child and next child? + if start >= augEnd && end <= nextChildPos { + return false // inexact match + } + augEnd = nextChildPos // end of following whitespace + } + + // fmt.Printf("\tchild %d: [%d..%d)\tcontains interval [%d..%d)?\n", + // i, augPos, augEnd, start, end) // debugging + + // Does augmented child strictly contain [start, end)? + if augPos <= start && end <= augEnd { + _, isToken := child.(tokenNode) + return isToken || visit(child) + } + + // Does [start, end) overlap multiple children? + // i.e. left-augmented child contains start + // but LR-augmented child does not contain end. + if start < childEnd && end > augEnd { + break + } + } + + // No single child contained [start, end), + // so node is the result. Is it exact? + + // (It's tempting to put this condition before the + // child loop, but it gives the wrong result in the + // case where a node (e.g. ExprStmt) and its sole + // child have equal intervals.) + if start == nodePos && end == nodeEnd { + return true // exact match + } + + return false // inexact: overlaps multiple children + } + + if start > end { + start, end = end, start + } + + if start < root.End() && end > root.Pos() { + if start == end { + end = start + 1 // empty interval => interval of size 1 + } + exact = visit(root) + + // Reverse the path: + for i, l := 0, len(path); i < l/2; i++ { + path[i], path[l-1-i] = path[l-1-i], path[i] + } + } else { + // Selection lies within whitespace preceding the + // first (or following the last) declaration in the file. + // The result nonetheless always includes the ast.File. + path = append(path, root) + } + + return +} + +// tokenNode is a dummy implementation of ast.Node for a single token. +// They are used transiently by PathEnclosingInterval but never escape +// this package. +// +type tokenNode struct { + pos token.Pos + end token.Pos +} + +func (n tokenNode) Pos() token.Pos { + return n.pos +} + +func (n tokenNode) End() token.Pos { + return n.end +} + +func tok(pos token.Pos, len int) ast.Node { + return tokenNode{pos, pos + token.Pos(len)} +} + +// childrenOf returns the direct non-nil children of ast.Node n. +// It may include fake ast.Node implementations for bare tokens. +// it is not safe to call (e.g.) ast.Walk on such nodes. +// +func childrenOf(n ast.Node) []ast.Node { + var children []ast.Node + + // First add nodes for all true subtrees. + ast.Inspect(n, func(node ast.Node) bool { + if node == n { // push n + return true // recur + } + if node != nil { // push child + children = append(children, node) + } + return false // no recursion + }) + + // Then add fake Nodes for bare tokens. + switch n := n.(type) { + case *ast.ArrayType: + children = append(children, + tok(n.Lbrack, len("[")), + tok(n.Elt.End(), len("]"))) + + case *ast.AssignStmt: + children = append(children, + tok(n.TokPos, len(n.Tok.String()))) + + case *ast.BasicLit: + children = append(children, + tok(n.ValuePos, len(n.Value))) + + case *ast.BinaryExpr: + children = append(children, tok(n.OpPos, len(n.Op.String()))) + + case *ast.BlockStmt: + children = append(children, + tok(n.Lbrace, len("{")), + tok(n.Rbrace, len("}"))) + + case *ast.BranchStmt: + children = append(children, + tok(n.TokPos, len(n.Tok.String()))) + + case *ast.CallExpr: + children = append(children, + tok(n.Lparen, len("(")), + tok(n.Rparen, len(")"))) + if n.Ellipsis != 0 { + children = append(children, tok(n.Ellipsis, len("..."))) + } + + case *ast.CaseClause: + if n.List == nil { + children = append(children, + tok(n.Case, len("default"))) + } else { + children = append(children, + tok(n.Case, len("case"))) + } + children = append(children, tok(n.Colon, len(":"))) + + case *ast.ChanType: + switch n.Dir { + case ast.RECV: + children = append(children, tok(n.Begin, len("<-chan"))) + case ast.SEND: + children = append(children, tok(n.Begin, len("chan<-"))) + case ast.RECV | ast.SEND: + children = append(children, tok(n.Begin, len("chan"))) + } + + case *ast.CommClause: + if n.Comm == nil { + children = append(children, + tok(n.Case, len("default"))) + } else { + children = append(children, + tok(n.Case, len("case"))) + } + children = append(children, tok(n.Colon, len(":"))) + + case *ast.Comment: + // nop + + case *ast.CommentGroup: + // nop + + case *ast.CompositeLit: + children = append(children, + tok(n.Lbrace, len("{")), + tok(n.Rbrace, len("{"))) + + case *ast.DeclStmt: + // nop + + case *ast.DeferStmt: + children = append(children, + tok(n.Defer, len("defer"))) + + case *ast.Ellipsis: + children = append(children, + tok(n.Ellipsis, len("..."))) + + case *ast.EmptyStmt: + // nop + + case *ast.ExprStmt: + // nop + + case *ast.Field: + // TODO(adonovan): Field.{Doc,Comment,Tag}? + + case *ast.FieldList: + children = append(children, + tok(n.Opening, len("(")), + tok(n.Closing, len(")"))) + + case *ast.File: + // TODO test: Doc + children = append(children, + tok(n.Package, len("package"))) + + case *ast.ForStmt: + children = append(children, + tok(n.For, len("for"))) + + case *ast.FuncDecl: + // TODO(adonovan): FuncDecl.Comment? + + // Uniquely, FuncDecl breaks the invariant that + // preorder traversal yields tokens in lexical order: + // in fact, FuncDecl.Recv precedes FuncDecl.Type.Func. + // + // As a workaround, we inline the case for FuncType + // here and order things correctly. + // + children = nil // discard ast.Walk(FuncDecl) info subtrees + children = append(children, tok(n.Type.Func, len("func"))) + if n.Recv != nil { + children = append(children, n.Recv) + } + children = append(children, n.Name) + if n.Type.Params != nil { + children = append(children, n.Type.Params) + } + if n.Type.Results != nil { + children = append(children, n.Type.Results) + } + if n.Body != nil { + children = append(children, n.Body) + } + + case *ast.FuncLit: + // nop + + case *ast.FuncType: + if n.Func != 0 { + children = append(children, + tok(n.Func, len("func"))) + } + + case *ast.GenDecl: + children = append(children, + tok(n.TokPos, len(n.Tok.String()))) + if n.Lparen != 0 { + children = append(children, + tok(n.Lparen, len("(")), + tok(n.Rparen, len(")"))) + } + + case *ast.GoStmt: + children = append(children, + tok(n.Go, len("go"))) + + case *ast.Ident: + children = append(children, + tok(n.NamePos, len(n.Name))) + + case *ast.IfStmt: + children = append(children, + tok(n.If, len("if"))) + + case *ast.ImportSpec: + // TODO(adonovan): ImportSpec.{Doc,EndPos}? + + case *ast.IncDecStmt: + children = append(children, + tok(n.TokPos, len(n.Tok.String()))) + + case *ast.IndexExpr: + children = append(children, + tok(n.Lbrack, len("{")), + tok(n.Rbrack, len("}"))) + + case *ast.InterfaceType: + children = append(children, + tok(n.Interface, len("interface"))) + + case *ast.KeyValueExpr: + children = append(children, + tok(n.Colon, len(":"))) + + case *ast.LabeledStmt: + children = append(children, + tok(n.Colon, len(":"))) + + case *ast.MapType: + children = append(children, + tok(n.Map, len("map"))) + + case *ast.ParenExpr: + children = append(children, + tok(n.Lparen, len("(")), + tok(n.Rparen, len(")"))) + + case *ast.RangeStmt: + children = append(children, + tok(n.For, len("for")), + tok(n.TokPos, len(n.Tok.String()))) + + case *ast.ReturnStmt: + children = append(children, + tok(n.Return, len("return"))) + + case *ast.SelectStmt: + children = append(children, + tok(n.Select, len("select"))) + + case *ast.SelectorExpr: + // nop + + case *ast.SendStmt: + children = append(children, + tok(n.Arrow, len("<-"))) + + case *ast.SliceExpr: + children = append(children, + tok(n.Lbrack, len("[")), + tok(n.Rbrack, len("]"))) + + case *ast.StarExpr: + children = append(children, tok(n.Star, len("*"))) + + case *ast.StructType: + children = append(children, tok(n.Struct, len("struct"))) + + case *ast.SwitchStmt: + children = append(children, tok(n.Switch, len("switch"))) + + case *ast.TypeAssertExpr: + children = append(children, + tok(n.Lparen-1, len(".")), + tok(n.Lparen, len("(")), + tok(n.Rparen, len(")"))) + + case *ast.TypeSpec: + // TODO(adonovan): TypeSpec.{Doc,Comment}? + + case *ast.TypeSwitchStmt: + children = append(children, tok(n.Switch, len("switch"))) + + case *ast.UnaryExpr: + children = append(children, tok(n.OpPos, len(n.Op.String()))) + + case *ast.ValueSpec: + // TODO(adonovan): ValueSpec.{Doc,Comment}? + + case *ast.BadDecl, *ast.BadExpr, *ast.BadStmt: + // nop + } + + // TODO(adonovan): opt: merge the logic of ast.Inspect() into + // the switch above so we can make interleaved callbacks for + // both Nodes and Tokens in the right order and avoid the need + // to sort. + sort.Sort(byPos(children)) + + return children +} + +type byPos []ast.Node + +func (sl byPos) Len() int { + return len(sl) +} +func (sl byPos) Less(i, j int) bool { + return sl[i].Pos() < sl[j].Pos() +} +func (sl byPos) Swap(i, j int) { + sl[i], sl[j] = sl[j], sl[i] +} + +// NodeDescription returns a description of the concrete type of n suitable +// for a user interface. +// +// TODO(adonovan): in some cases (e.g. Field, FieldList, Ident, +// StarExpr) we could be much more specific given the path to the AST +// root. Perhaps we should do that. +// +func NodeDescription(n ast.Node) string { + switch n := n.(type) { + case *ast.ArrayType: + return "array type" + case *ast.AssignStmt: + return "assignment" + case *ast.BadDecl: + return "bad declaration" + case *ast.BadExpr: + return "bad expression" + case *ast.BadStmt: + return "bad statement" + case *ast.BasicLit: + return "basic literal" + case *ast.BinaryExpr: + return fmt.Sprintf("binary %s operation", n.Op) + case *ast.BlockStmt: + return "block" + case *ast.BranchStmt: + switch n.Tok { + case token.BREAK: + return "break statement" + case token.CONTINUE: + return "continue statement" + case token.GOTO: + return "goto statement" + case token.FALLTHROUGH: + return "fall-through statement" + } + case *ast.CallExpr: + return "function call (or conversion)" + case *ast.CaseClause: + return "case clause" + case *ast.ChanType: + return "channel type" + case *ast.CommClause: + return "communication clause" + case *ast.Comment: + return "comment" + case *ast.CommentGroup: + return "comment group" + case *ast.CompositeLit: + return "composite literal" + case *ast.DeclStmt: + return NodeDescription(n.Decl) + " statement" + case *ast.DeferStmt: + return "defer statement" + case *ast.Ellipsis: + return "ellipsis" + case *ast.EmptyStmt: + return "empty statement" + case *ast.ExprStmt: + return "expression statement" + case *ast.Field: + // Can be any of these: + // struct {x, y int} -- struct field(s) + // struct {T} -- anon struct field + // interface {I} -- interface embedding + // interface {f()} -- interface method + // func (A) func(B) C -- receiver, param(s), result(s) + return "field/method/parameter" + case *ast.FieldList: + return "field/method/parameter list" + case *ast.File: + return "source file" + case *ast.ForStmt: + return "for loop" + case *ast.FuncDecl: + return "function declaration" + case *ast.FuncLit: + return "function literal" + case *ast.FuncType: + return "function type" + case *ast.GenDecl: + switch n.Tok { + case token.IMPORT: + return "import declaration" + case token.CONST: + return "constant declaration" + case token.TYPE: + return "type declaration" + case token.VAR: + return "variable declaration" + } + case *ast.GoStmt: + return "go statement" + case *ast.Ident: + return "identifier" + case *ast.IfStmt: + return "if statement" + case *ast.ImportSpec: + return "import specification" + case *ast.IncDecStmt: + if n.Tok == token.INC { + return "increment statement" + } + return "decrement statement" + case *ast.IndexExpr: + return "index expression" + case *ast.InterfaceType: + return "interface type" + case *ast.KeyValueExpr: + return "key/value association" + case *ast.LabeledStmt: + return "statement label" + case *ast.MapType: + return "map type" + case *ast.Package: + return "package" + case *ast.ParenExpr: + return "parenthesized " + NodeDescription(n.X) + case *ast.RangeStmt: + return "range loop" + case *ast.ReturnStmt: + return "return statement" + case *ast.SelectStmt: + return "select statement" + case *ast.SelectorExpr: + return "selector" + case *ast.SendStmt: + return "channel send" + case *ast.SliceExpr: + return "slice expression" + case *ast.StarExpr: + return "*-operation" // load/store expr or pointer type + case *ast.StructType: + return "struct type" + case *ast.SwitchStmt: + return "switch statement" + case *ast.TypeAssertExpr: + return "type assertion" + case *ast.TypeSpec: + return "type specification" + case *ast.TypeSwitchStmt: + return "type switch" + case *ast.UnaryExpr: + return fmt.Sprintf("unary %s operation", n.Op) + case *ast.ValueSpec: + return "value specification" + + } + panic(fmt.Sprintf("unexpected node type: %T", n)) +} diff --git a/vendor/golang.org/x/tools/go/ast/astutil/enclosing_test.go b/vendor/golang.org/x/tools/go/ast/astutil/enclosing_test.go new file mode 100644 index 0000000000..107f87c55c --- /dev/null +++ b/vendor/golang.org/x/tools/go/ast/astutil/enclosing_test.go @@ -0,0 +1,195 @@ +// Copyright 2013 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 astutil_test + +// This file defines tests of PathEnclosingInterval. + +// TODO(adonovan): exhaustive tests that run over the whole input +// tree, not just handcrafted examples. + +import ( + "bytes" + "fmt" + "go/ast" + "go/parser" + "go/token" + "strings" + "testing" + + "golang.org/x/tools/go/ast/astutil" +) + +// pathToString returns a string containing the concrete types of the +// nodes in path. +func pathToString(path []ast.Node) string { + var buf bytes.Buffer + fmt.Fprint(&buf, "[") + for i, n := range path { + if i > 0 { + fmt.Fprint(&buf, " ") + } + fmt.Fprint(&buf, strings.TrimPrefix(fmt.Sprintf("%T", n), "*ast.")) + } + fmt.Fprint(&buf, "]") + return buf.String() +} + +// findInterval parses input and returns the [start, end) positions of +// the first occurrence of substr in input. f==nil indicates failure; +// an error has already been reported in that case. +// +func findInterval(t *testing.T, fset *token.FileSet, input, substr string) (f *ast.File, start, end token.Pos) { + f, err := parser.ParseFile(fset, "", input, 0) + if err != nil { + t.Errorf("parse error: %s", err) + return + } + + i := strings.Index(input, substr) + if i < 0 { + t.Errorf("%q is not a substring of input", substr) + f = nil + return + } + + filePos := fset.File(f.Package) + return f, filePos.Pos(i), filePos.Pos(i + len(substr)) +} + +// Common input for following tests. +const input = ` +// Hello. +package main +import "fmt" +func f() {} +func main() { + z := (x + y) // add them + f() // NB: ExprStmt and its CallExpr have same Pos/End +} +` + +func TestPathEnclosingInterval_Exact(t *testing.T) { + // For the exact tests, we check that a substring is mapped to + // the canonical string for the node it denotes. + tests := []struct { + substr string // first occurrence of this string indicates interval + node string // complete text of expected containing node + }{ + {"package", + input[11 : len(input)-1]}, + {"\npack", + input[11 : len(input)-1]}, + {"main", + "main"}, + {"import", + "import \"fmt\""}, + {"\"fmt\"", + "\"fmt\""}, + {"\nfunc f() {}\n", + "func f() {}"}, + {"x ", + "x"}, + {" y", + "y"}, + {"z", + "z"}, + {" + ", + "x + y"}, + {" :=", + "z := (x + y)"}, + {"x + y", + "x + y"}, + {"(x + y)", + "(x + y)"}, + {" (x + y) ", + "(x + y)"}, + {" (x + y) // add", + "(x + y)"}, + {"func", + "func f() {}"}, + {"func f() {}", + "func f() {}"}, + {"\nfun", + "func f() {}"}, + {" f", + "f"}, + } + for _, test := range tests { + f, start, end := findInterval(t, new(token.FileSet), input, test.substr) + if f == nil { + continue + } + + path, exact := astutil.PathEnclosingInterval(f, start, end) + if !exact { + t.Errorf("PathEnclosingInterval(%q) not exact", test.substr) + continue + } + + if len(path) == 0 { + if test.node != "" { + t.Errorf("PathEnclosingInterval(%q).path: got [], want %q", + test.substr, test.node) + } + continue + } + + if got := input[path[0].Pos():path[0].End()]; got != test.node { + t.Errorf("PathEnclosingInterval(%q): got %q, want %q (path was %s)", + test.substr, got, test.node, pathToString(path)) + continue + } + } +} + +func TestPathEnclosingInterval_Paths(t *testing.T) { + // For these tests, we check only the path of the enclosing + // node, but not its complete text because it's often quite + // large when !exact. + tests := []struct { + substr string // first occurrence of this string indicates interval + path string // the pathToString(),exact of the expected path + }{ + {"// add", + "[BlockStmt FuncDecl File],false"}, + {"(x + y", + "[ParenExpr AssignStmt BlockStmt FuncDecl File],false"}, + {"x +", + "[BinaryExpr ParenExpr AssignStmt BlockStmt FuncDecl File],false"}, + {"z := (x", + "[AssignStmt BlockStmt FuncDecl File],false"}, + {"func f", + "[FuncDecl File],false"}, + {"func f()", + "[FuncDecl File],false"}, + {" f()", + "[FuncDecl File],false"}, + {"() {}", + "[FuncDecl File],false"}, + {"// Hello", + "[File],false"}, + {" f", + "[Ident FuncDecl File],true"}, + {"func ", + "[FuncDecl File],true"}, + {"mai", + "[Ident File],true"}, + {"f() // NB", + "[CallExpr ExprStmt BlockStmt FuncDecl File],true"}, + } + for _, test := range tests { + f, start, end := findInterval(t, new(token.FileSet), input, test.substr) + if f == nil { + continue + } + + path, exact := astutil.PathEnclosingInterval(f, start, end) + if got := fmt.Sprintf("%s,%v", pathToString(path), exact); got != test.path { + t.Errorf("PathEnclosingInterval(%q): got %q, want %q", + test.substr, got, test.path) + continue + } + } +} diff --git a/vendor/golang.org/x/tools/go/ast/astutil/imports.go b/vendor/golang.org/x/tools/go/ast/astutil/imports.go new file mode 100644 index 0000000000..cfaa864a96 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ast/astutil/imports.go @@ -0,0 +1,400 @@ +// Copyright 2013 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 astutil contains common utilities for working with the Go AST. +package astutil // import "golang.org/x/tools/go/ast/astutil" + +import ( + "fmt" + "go/ast" + "go/token" + "strconv" + "strings" +) + +// AddImport adds the import path to the file f, if absent. +func AddImport(fset *token.FileSet, f *ast.File, ipath string) (added bool) { + return AddNamedImport(fset, f, "", ipath) +} + +// AddNamedImport adds the import path to the file f, if absent. +// If name is not empty, it is used to rename the import. +// +// For example, calling +// AddNamedImport(fset, f, "pathpkg", "path") +// adds +// import pathpkg "path" +func AddNamedImport(fset *token.FileSet, f *ast.File, name, ipath string) (added bool) { + if imports(f, ipath) { + return false + } + + newImport := &ast.ImportSpec{ + Path: &ast.BasicLit{ + Kind: token.STRING, + Value: strconv.Quote(ipath), + }, + } + if name != "" { + newImport.Name = &ast.Ident{Name: name} + } + + // Find an import decl to add to. + // The goal is to find an existing import + // whose import path has the longest shared + // prefix with ipath. + var ( + bestMatch = -1 // length of longest shared prefix + lastImport = -1 // index in f.Decls of the file's final import decl + impDecl *ast.GenDecl // import decl containing the best match + impIndex = -1 // spec index in impDecl containing the best match + ) + for i, decl := range f.Decls { + gen, ok := decl.(*ast.GenDecl) + if ok && gen.Tok == token.IMPORT { + lastImport = i + // Do not add to import "C", to avoid disrupting the + // association with its doc comment, breaking cgo. + if declImports(gen, "C") { + continue + } + + // Match an empty import decl if that's all that is available. + if len(gen.Specs) == 0 && bestMatch == -1 { + impDecl = gen + } + + // Compute longest shared prefix with imports in this group. + for j, spec := range gen.Specs { + impspec := spec.(*ast.ImportSpec) + n := matchLen(importPath(impspec), ipath) + if n > bestMatch { + bestMatch = n + impDecl = gen + impIndex = j + } + } + } + } + + // If no import decl found, add one after the last import. + if impDecl == nil { + impDecl = &ast.GenDecl{ + Tok: token.IMPORT, + } + if lastImport >= 0 { + impDecl.TokPos = f.Decls[lastImport].End() + } else { + // There are no existing imports. + // Our new import goes after the package declaration and after + // the comment, if any, that starts on the same line as the + // package declaration. + impDecl.TokPos = f.Package + + file := fset.File(f.Package) + pkgLine := file.Line(f.Package) + for _, c := range f.Comments { + if file.Line(c.Pos()) > pkgLine { + break + } + impDecl.TokPos = c.End() + } + } + f.Decls = append(f.Decls, nil) + copy(f.Decls[lastImport+2:], f.Decls[lastImport+1:]) + f.Decls[lastImport+1] = impDecl + } + + // Insert new import at insertAt. + insertAt := 0 + if impIndex >= 0 { + // insert after the found import + insertAt = impIndex + 1 + } + impDecl.Specs = append(impDecl.Specs, nil) + copy(impDecl.Specs[insertAt+1:], impDecl.Specs[insertAt:]) + impDecl.Specs[insertAt] = newImport + pos := impDecl.Pos() + if insertAt > 0 { + // If there is a comment after an existing import, preserve the comment + // position by adding the new import after the comment. + if spec, ok := impDecl.Specs[insertAt-1].(*ast.ImportSpec); ok && spec.Comment != nil { + pos = spec.Comment.End() + } else { + // Assign same position as the previous import, + // so that the sorter sees it as being in the same block. + pos = impDecl.Specs[insertAt-1].Pos() + } + } + if newImport.Name != nil { + newImport.Name.NamePos = pos + } + newImport.Path.ValuePos = pos + newImport.EndPos = pos + + // Clean up parens. impDecl contains at least one spec. + if len(impDecl.Specs) == 1 { + // Remove unneeded parens. + impDecl.Lparen = token.NoPos + } else if !impDecl.Lparen.IsValid() { + // impDecl needs parens added. + impDecl.Lparen = impDecl.Specs[0].Pos() + } + + f.Imports = append(f.Imports, newImport) + + if len(f.Decls) <= 1 { + return true + } + + // Merge all the import declarations into the first one. + var first *ast.GenDecl + for i, decl := range f.Decls { + gen, ok := decl.(*ast.GenDecl) + if !ok || gen.Tok != token.IMPORT || declImports(gen, "C") { + continue + } + if first == nil { + first = gen + continue // Don't touch the first one. + } + // Move the imports of the other import declaration to the first one. + for _, spec := range gen.Specs { + spec.(*ast.ImportSpec).Path.ValuePos = first.Pos() + first.Specs = append(first.Specs, spec) + } + f.Decls = append(f.Decls[:i], f.Decls[i+1:]...) + } + + return true +} + +// DeleteImport deletes the import path from the file f, if present. +func DeleteImport(fset *token.FileSet, f *ast.File, path string) (deleted bool) { + return DeleteNamedImport(fset, f, "", path) +} + +// DeleteNamedImport deletes the import with the given name and path from the file f, if present. +func DeleteNamedImport(fset *token.FileSet, f *ast.File, name, path string) (deleted bool) { + var delspecs []*ast.ImportSpec + + // Find the import nodes that import path, if any. + for i := 0; i < len(f.Decls); i++ { + decl := f.Decls[i] + gen, ok := decl.(*ast.GenDecl) + if !ok || gen.Tok != token.IMPORT { + continue + } + for j := 0; j < len(gen.Specs); j++ { + spec := gen.Specs[j] + impspec := spec.(*ast.ImportSpec) + if impspec.Name == nil && name != "" { + continue + } + if impspec.Name != nil && impspec.Name.Name != name { + continue + } + if importPath(impspec) != path { + continue + } + + // We found an import spec that imports path. + // Delete it. + delspecs = append(delspecs, impspec) + deleted = true + copy(gen.Specs[j:], gen.Specs[j+1:]) + gen.Specs = gen.Specs[:len(gen.Specs)-1] + + // If this was the last import spec in this decl, + // delete the decl, too. + if len(gen.Specs) == 0 { + copy(f.Decls[i:], f.Decls[i+1:]) + f.Decls = f.Decls[:len(f.Decls)-1] + i-- + break + } else if len(gen.Specs) == 1 { + gen.Lparen = token.NoPos // drop parens + } + if j > 0 { + lastImpspec := gen.Specs[j-1].(*ast.ImportSpec) + lastLine := fset.Position(lastImpspec.Path.ValuePos).Line + line := fset.Position(impspec.Path.ValuePos).Line + + // We deleted an entry but now there may be + // a blank line-sized hole where the import was. + if line-lastLine > 1 { + // There was a blank line immediately preceding the deleted import, + // so there's no need to close the hole. + // Do nothing. + } else { + // There was no blank line. Close the hole. + fset.File(gen.Rparen).MergeLine(line) + } + } + j-- + } + } + + // Delete them from f.Imports. + for i := 0; i < len(f.Imports); i++ { + imp := f.Imports[i] + for j, del := range delspecs { + if imp == del { + copy(f.Imports[i:], f.Imports[i+1:]) + f.Imports = f.Imports[:len(f.Imports)-1] + copy(delspecs[j:], delspecs[j+1:]) + delspecs = delspecs[:len(delspecs)-1] + i-- + break + } + } + } + + if len(delspecs) > 0 { + panic(fmt.Sprintf("deleted specs from Decls but not Imports: %v", delspecs)) + } + + return +} + +// RewriteImport rewrites any import of path oldPath to path newPath. +func RewriteImport(fset *token.FileSet, f *ast.File, oldPath, newPath string) (rewrote bool) { + for _, imp := range f.Imports { + if importPath(imp) == oldPath { + rewrote = true + // record old End, because the default is to compute + // it using the length of imp.Path.Value. + imp.EndPos = imp.End() + imp.Path.Value = strconv.Quote(newPath) + } + } + return +} + +// UsesImport reports whether a given import is used. +func UsesImport(f *ast.File, path string) (used bool) { + spec := importSpec(f, path) + if spec == nil { + return + } + + name := spec.Name.String() + switch name { + case "": + // If the package name is not explicitly specified, + // make an educated guess. This is not guaranteed to be correct. + lastSlash := strings.LastIndex(path, "/") + if lastSlash == -1 { + name = path + } else { + name = path[lastSlash+1:] + } + case "_", ".": + // Not sure if this import is used - err on the side of caution. + return true + } + + ast.Walk(visitFn(func(n ast.Node) { + sel, ok := n.(*ast.SelectorExpr) + if ok && isTopName(sel.X, name) { + used = true + } + }), f) + + return +} + +type visitFn func(node ast.Node) + +func (fn visitFn) Visit(node ast.Node) ast.Visitor { + fn(node) + return fn +} + +// imports returns true if f imports path. +func imports(f *ast.File, path string) bool { + return importSpec(f, path) != nil +} + +// importSpec returns the import spec if f imports path, +// or nil otherwise. +func importSpec(f *ast.File, path string) *ast.ImportSpec { + for _, s := range f.Imports { + if importPath(s) == path { + return s + } + } + return nil +} + +// importPath returns the unquoted import path of s, +// or "" if the path is not properly quoted. +func importPath(s *ast.ImportSpec) string { + t, err := strconv.Unquote(s.Path.Value) + if err == nil { + return t + } + return "" +} + +// declImports reports whether gen contains an import of path. +func declImports(gen *ast.GenDecl, path string) bool { + if gen.Tok != token.IMPORT { + return false + } + for _, spec := range gen.Specs { + impspec := spec.(*ast.ImportSpec) + if importPath(impspec) == path { + return true + } + } + return false +} + +// matchLen returns the length of the longest path segment prefix shared by x and y. +func matchLen(x, y string) int { + n := 0 + for i := 0; i < len(x) && i < len(y) && x[i] == y[i]; i++ { + if x[i] == '/' { + n++ + } + } + return n +} + +// isTopName returns true if n is a top-level unresolved identifier with the given name. +func isTopName(n ast.Expr, name string) bool { + id, ok := n.(*ast.Ident) + return ok && id.Name == name && id.Obj == nil +} + +// Imports returns the file imports grouped by paragraph. +func Imports(fset *token.FileSet, f *ast.File) [][]*ast.ImportSpec { + var groups [][]*ast.ImportSpec + + for _, decl := range f.Decls { + genDecl, ok := decl.(*ast.GenDecl) + if !ok || genDecl.Tok != token.IMPORT { + break + } + + group := []*ast.ImportSpec{} + + var lastLine int + for _, spec := range genDecl.Specs { + importSpec := spec.(*ast.ImportSpec) + pos := importSpec.Path.ValuePos + line := fset.Position(pos).Line + if lastLine > 0 && pos > 0 && line-lastLine > 1 { + groups = append(groups, group) + group = []*ast.ImportSpec{} + } + group = append(group, importSpec) + lastLine = line + } + groups = append(groups, group) + } + + return groups +} diff --git a/vendor/golang.org/x/tools/go/ast/astutil/imports_test.go b/vendor/golang.org/x/tools/go/ast/astutil/imports_test.go new file mode 100644 index 0000000000..f727f5d1c1 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ast/astutil/imports_test.go @@ -0,0 +1,1147 @@ +// Copyright 2013 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 astutil + +import ( + "bytes" + "go/ast" + "go/format" + "go/parser" + "go/token" + "reflect" + "strconv" + "testing" +) + +var fset = token.NewFileSet() + +func parse(t *testing.T, name, in string) *ast.File { + file, err := parser.ParseFile(fset, name, in, parser.ParseComments) + if err != nil { + t.Fatalf("%s parse: %v", name, err) + } + return file +} + +func print(t *testing.T, name string, f *ast.File) string { + var buf bytes.Buffer + if err := format.Node(&buf, fset, f); err != nil { + t.Fatalf("%s gofmt: %v", name, err) + } + return string(buf.Bytes()) +} + +type test struct { + name string + renamedPkg string + pkg string + in string + out string + broken bool // known broken +} + +var addTests = []test{ + { + name: "leave os alone", + pkg: "os", + in: `package main + +import ( + "os" +) +`, + out: `package main + +import ( + "os" +) +`, + }, + { + name: "import.1", + pkg: "os", + in: `package main +`, + out: `package main + +import "os" +`, + }, + { + name: "import.2", + pkg: "os", + in: `package main + +// Comment +import "C" +`, + out: `package main + +// Comment +import "C" +import "os" +`, + }, + { + name: "import.3", + pkg: "os", + in: `package main + +// Comment +import "C" + +import ( + "io" + "utf8" +) +`, + out: `package main + +// Comment +import "C" + +import ( + "io" + "os" + "utf8" +) +`, + }, + { + name: "import.17", + pkg: "x/y/z", + in: `package main + +// Comment +import "C" + +import ( + "a" + "b" + + "x/w" + + "d/f" +) +`, + out: `package main + +// Comment +import "C" + +import ( + "a" + "b" + + "x/w" + "x/y/z" + + "d/f" +) +`, + }, + { + name: "import into singular group", + pkg: "bytes", + in: `package main + +import "os" + +`, + out: `package main + +import ( + "bytes" + "os" +) +`, + }, + { + name: "import into singular group with comment", + pkg: "bytes", + in: `package main + +import /* why */ /* comment here? */ "os" + +`, + out: `package main + +import /* why */ /* comment here? */ ( + "bytes" + "os" +) +`, + }, + { + name: "import into group with leading comment", + pkg: "strings", + in: `package main + +import ( + // comment before bytes + "bytes" + "os" +) + +`, + out: `package main + +import ( + // comment before bytes + "bytes" + "os" + "strings" +) +`, + }, + { + name: "", + renamedPkg: "fmtpkg", + pkg: "fmt", + in: `package main + +import "os" + +`, + out: `package main + +import ( + fmtpkg "fmt" + "os" +) +`, + }, + { + name: "struct comment", + pkg: "time", + in: `package main + +// This is a comment before a struct. +type T struct { + t time.Time +} +`, + out: `package main + +import "time" + +// This is a comment before a struct. +type T struct { + t time.Time +} +`, + }, + { + name: "issue 8729 import C", + pkg: "time", + in: `package main + +import "C" + +// comment +type T time.Time +`, + out: `package main + +import "C" +import "time" + +// comment +type T time.Time +`, + }, + { + name: "issue 8729 empty import", + pkg: "time", + in: `package main + +import () + +// comment +type T time.Time +`, + out: `package main + +import "time" + +// comment +type T time.Time +`, + }, + { + name: "issue 8729 comment on package line", + pkg: "time", + in: `package main // comment + +type T time.Time +`, + out: `package main // comment +import "time" + +type T time.Time +`, + }, + { + name: "issue 8729 comment after package", + pkg: "time", + in: `package main +// comment + +type T time.Time +`, + out: `package main + +import "time" + +// comment + +type T time.Time +`, + }, + { + name: "issue 8729 comment before and on package line", + pkg: "time", + in: `// comment before +package main // comment on + +type T time.Time +`, + out: `// comment before +package main // comment on +import "time" + +type T time.Time +`, + }, + + // Issue 9961: Match prefixes using path segments rather than bytes + { + name: "issue 9961", + pkg: "regexp", + in: `package main + +import ( + "flag" + "testing" + + "rsc.io/p" +) +`, + out: `package main + +import ( + "flag" + "regexp" + "testing" + + "rsc.io/p" +) +`, + }, + // Issue 10337: Preserve comment position + { + name: "issue 10337", + pkg: "fmt", + in: `package main + +import ( + "bytes" // a + "log" // c +) +`, + out: `package main + +import ( + "bytes" // a + "fmt" + "log" // c +) +`, + }, + { + name: "issue 10337 new import at the start", + pkg: "bytes", + in: `package main + +import ( + "fmt" // b + "log" // c +) +`, + out: `package main + +import ( + "bytes" + "fmt" // b + "log" // c +) +`, + }, + { + name: "issue 10337 new import at the end", + pkg: "log", + in: `package main + +import ( + "bytes" // a + "fmt" // b +) +`, + out: `package main + +import ( + "bytes" // a + "fmt" // b + "log" +) +`, + }, + // Issue 14075: Merge import declarations + { + name: "issue 14075", + pkg: "bufio", + in: `package main + +import "bytes" +import "fmt" +`, + out: `package main + +import ( + "bufio" + "bytes" + "fmt" +) +`, + }, + { + name: "issue 14075 update position", + pkg: "bufio", + in: `package main + +import "bytes" +import ( + "fmt" +) +`, + out: `package main + +import ( + "bufio" + "bytes" + "fmt" +) +`, + }, + { + name: `issue 14075 ignore import "C"`, + pkg: "bufio", + in: `package main + +// Comment +import "C" + +import "bytes" +import "fmt" +`, + out: `package main + +// Comment +import "C" + +import ( + "bufio" + "bytes" + "fmt" +) +`, + }, + { + name: `issue 14075 ignore adjacent import "C"`, + pkg: "bufio", + in: `package main + +// Comment +import "C" +import "fmt" +`, + out: `package main + +// Comment +import "C" +import ( + "bufio" + "fmt" +) +`, + }, + { + name: `issue 14075 ignore adjacent import "C" (without factored import)`, + pkg: "bufio", + in: `package main + +// Comment +import "C" +import "fmt" +`, + out: `package main + +// Comment +import "C" +import ( + "bufio" + "fmt" +) +`, + }, + { + name: `issue 14075 ignore single import "C"`, + pkg: "bufio", + in: `package main + +// Comment +import "C" +`, + out: `package main + +// Comment +import "C" +import "bufio" +`, + }, +} + +func TestAddImport(t *testing.T) { + for _, test := range addTests { + file := parse(t, test.name, test.in) + var before bytes.Buffer + ast.Fprint(&before, fset, file, nil) + AddNamedImport(fset, file, test.renamedPkg, test.pkg) + if got := print(t, test.name, file); got != test.out { + if test.broken { + t.Logf("%s is known broken:\ngot: %s\nwant: %s", test.name, got, test.out) + } else { + t.Errorf("%s:\ngot: %s\nwant: %s", test.name, got, test.out) + } + var after bytes.Buffer + ast.Fprint(&after, fset, file, nil) + + t.Logf("AST before:\n%s\nAST after:\n%s\n", before.String(), after.String()) + } + } +} + +func TestDoubleAddImport(t *testing.T) { + file := parse(t, "doubleimport", "package main\n") + AddImport(fset, file, "os") + AddImport(fset, file, "bytes") + want := `package main + +import ( + "bytes" + "os" +) +` + if got := print(t, "doubleimport", file); got != want { + t.Errorf("got: %s\nwant: %s", got, want) + } +} + +func TestDoubleAddNamedImport(t *testing.T) { + file := parse(t, "doublenamedimport", "package main\n") + AddNamedImport(fset, file, "o", "os") + AddNamedImport(fset, file, "i", "io") + want := `package main + +import ( + i "io" + o "os" +) +` + if got := print(t, "doublenamedimport", file); got != want { + t.Errorf("got: %s\nwant: %s", got, want) + } +} + +// Part of issue 8729. +func TestDoubleAddImportWithDeclComment(t *testing.T) { + file := parse(t, "doubleimport", `package main + +import ( +) + +// comment +type I int +`) + // The AddImport order here matters. + AddImport(fset, file, "golang.org/x/tools/go/ast/astutil") + AddImport(fset, file, "os") + want := `package main + +import ( + "golang.org/x/tools/go/ast/astutil" + "os" +) + +// comment +type I int +` + if got := print(t, "doubleimport_with_decl_comment", file); got != want { + t.Errorf("got: %s\nwant: %s", got, want) + } +} + +var deleteTests = []test{ + { + name: "import.4", + pkg: "os", + in: `package main + +import ( + "os" +) +`, + out: `package main +`, + }, + { + name: "import.5", + pkg: "os", + in: `package main + +// Comment +import "C" +import "os" +`, + out: `package main + +// Comment +import "C" +`, + }, + { + name: "import.6", + pkg: "os", + in: `package main + +// Comment +import "C" + +import ( + "io" + "os" + "utf8" +) +`, + out: `package main + +// Comment +import "C" + +import ( + "io" + "utf8" +) +`, + }, + { + name: "import.7", + pkg: "io", + in: `package main + +import ( + "io" // a + "os" // b + "utf8" // c +) +`, + out: `package main + +import ( + // a + "os" // b + "utf8" // c +) +`, + }, + { + name: "import.8", + pkg: "os", + in: `package main + +import ( + "io" // a + "os" // b + "utf8" // c +) +`, + out: `package main + +import ( + "io" // a + // b + "utf8" // c +) +`, + }, + { + name: "import.9", + pkg: "utf8", + in: `package main + +import ( + "io" // a + "os" // b + "utf8" // c +) +`, + out: `package main + +import ( + "io" // a + "os" // b + // c +) +`, + }, + { + name: "import.10", + pkg: "io", + in: `package main + +import ( + "io" + "os" + "utf8" +) +`, + out: `package main + +import ( + "os" + "utf8" +) +`, + }, + { + name: "import.11", + pkg: "os", + in: `package main + +import ( + "io" + "os" + "utf8" +) +`, + out: `package main + +import ( + "io" + "utf8" +) +`, + }, + { + name: "import.12", + pkg: "utf8", + in: `package main + +import ( + "io" + "os" + "utf8" +) +`, + out: `package main + +import ( + "io" + "os" +) +`, + }, + { + name: "handle.raw.quote.imports", + pkg: "os", + in: "package main\n\nimport `os`", + out: `package main +`, + }, + { + name: "import.13", + pkg: "io", + in: `package main + +import ( + "fmt" + + "io" + "os" + "utf8" + + "go/format" +) +`, + out: `package main + +import ( + "fmt" + + "os" + "utf8" + + "go/format" +) +`, + }, + { + name: "import.14", + pkg: "io", + in: `package main + +import ( + "fmt" // a + + "io" // b + "os" // c + "utf8" // d + + "go/format" // e +) +`, + out: `package main + +import ( + "fmt" // a + + // b + "os" // c + "utf8" // d + + "go/format" // e +) +`, + }, + { + name: "import.15", + pkg: "double", + in: `package main + +import ( + "double" + "double" +) +`, + out: `package main +`, + }, + { + name: "import.16", + pkg: "bubble", + in: `package main + +import ( + "toil" + "bubble" + "bubble" + "trouble" +) +`, + out: `package main + +import ( + "toil" + "trouble" +) +`, + }, + { + name: "import.17", + pkg: "quad", + in: `package main + +import ( + "quad" + "quad" +) + +import ( + "quad" + "quad" +) +`, + out: `package main +`, + }, + { + name: "import.18", + renamedPkg: "x", + pkg: "fmt", + in: `package main + +import ( + "fmt" + x "fmt" +) +`, + out: `package main + +import "fmt" +`, + }, + { + name: "import.18", + renamedPkg: "x", + pkg: "fmt", + in: `package main + +import x "fmt" +import y "fmt" +`, + out: `package main + +import y "fmt" +`, + }, +} + +func TestDeleteImport(t *testing.T) { + for _, test := range deleteTests { + file := parse(t, test.name, test.in) + DeleteNamedImport(fset, file, test.renamedPkg, test.pkg) + if got := print(t, test.name, file); got != test.out { + t.Errorf("%s:\ngot: %s\nwant: %s", test.name, got, test.out) + } + } +} + +type rewriteTest struct { + name string + srcPkg string + dstPkg string + in string + out string +} + +var rewriteTests = []rewriteTest{ + { + name: "import.13", + srcPkg: "utf8", + dstPkg: "encoding/utf8", + in: `package main + +import ( + "io" + "os" + "utf8" // thanks ken +) +`, + out: `package main + +import ( + "encoding/utf8" // thanks ken + "io" + "os" +) +`, + }, + { + name: "import.14", + srcPkg: "asn1", + dstPkg: "encoding/asn1", + in: `package main + +import ( + "asn1" + "crypto" + "crypto/rsa" + _ "crypto/sha1" + "crypto/x509" + "crypto/x509/pkix" + "time" +) + +var x = 1 +`, + out: `package main + +import ( + "crypto" + "crypto/rsa" + _ "crypto/sha1" + "crypto/x509" + "crypto/x509/pkix" + "encoding/asn1" + "time" +) + +var x = 1 +`, + }, + { + name: "import.15", + srcPkg: "url", + dstPkg: "net/url", + in: `package main + +import ( + "bufio" + "net" + "path" + "url" +) + +var x = 1 // comment on x, not on url +`, + out: `package main + +import ( + "bufio" + "net" + "net/url" + "path" +) + +var x = 1 // comment on x, not on url +`, + }, + { + name: "import.16", + srcPkg: "http", + dstPkg: "net/http", + in: `package main + +import ( + "flag" + "http" + "log" + "text/template" +) + +var addr = flag.String("addr", ":1718", "http service address") // Q=17, R=18 +`, + out: `package main + +import ( + "flag" + "log" + "net/http" + "text/template" +) + +var addr = flag.String("addr", ":1718", "http service address") // Q=17, R=18 +`, + }, +} + +func TestRewriteImport(t *testing.T) { + for _, test := range rewriteTests { + file := parse(t, test.name, test.in) + RewriteImport(fset, file, test.srcPkg, test.dstPkg) + if got := print(t, test.name, file); got != test.out { + t.Errorf("%s:\ngot: %s\nwant: %s", test.name, got, test.out) + } + } +} + +var importsTests = []struct { + name string + in string + want [][]string +}{ + { + name: "no packages", + in: `package foo +`, + want: nil, + }, + { + name: "one group", + in: `package foo + +import ( + "fmt" + "testing" +) +`, + want: [][]string{{"fmt", "testing"}}, + }, + { + name: "four groups", + in: `package foo + +import "C" +import ( + "fmt" + "testing" + + "appengine" + + "myproject/mylib1" + "myproject/mylib2" +) +`, + want: [][]string{ + {"C"}, + {"fmt", "testing"}, + {"appengine"}, + {"myproject/mylib1", "myproject/mylib2"}, + }, + }, + { + name: "multiple factored groups", + in: `package foo + +import ( + "fmt" + "testing" + + "appengine" +) +import ( + "reflect" + + "bytes" +) +`, + want: [][]string{ + {"fmt", "testing"}, + {"appengine"}, + {"reflect"}, + {"bytes"}, + }, + }, +} + +func unquote(s string) string { + res, err := strconv.Unquote(s) + if err != nil { + return "could_not_unquote" + } + return res +} + +func TestImports(t *testing.T) { + fset := token.NewFileSet() + for _, test := range importsTests { + f, err := parser.ParseFile(fset, "test.go", test.in, 0) + if err != nil { + t.Errorf("%s: %v", test.name, err) + continue + } + var got [][]string + for _, group := range Imports(fset, f) { + var b []string + for _, spec := range group { + b = append(b, unquote(spec.Path.Value)) + } + got = append(got, b) + } + if !reflect.DeepEqual(got, test.want) { + t.Errorf("Imports(%s)=%v, want %v", test.name, got, test.want) + } + } +} diff --git a/vendor/golang.org/x/tools/go/ast/astutil/util.go b/vendor/golang.org/x/tools/go/ast/astutil/util.go new file mode 100644 index 0000000000..7630629824 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ast/astutil/util.go @@ -0,0 +1,14 @@ +package astutil + +import "go/ast" + +// Unparen returns e with any enclosing parentheses stripped. +func Unparen(e ast.Expr) ast.Expr { + for { + p, ok := e.(*ast.ParenExpr) + if !ok { + return e + } + e = p.X + } +} diff --git a/vendor/golang.org/x/tools/go/buildutil/allpackages.go b/vendor/golang.org/x/tools/go/buildutil/allpackages.go new file mode 100644 index 0000000000..4d4366c182 --- /dev/null +++ b/vendor/golang.org/x/tools/go/buildutil/allpackages.go @@ -0,0 +1,195 @@ +// 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 buildutil provides utilities related to the go/build +// package in the standard library. +// +// All I/O is done via the build.Context file system interface, which must +// be concurrency-safe. +package buildutil // import "golang.org/x/tools/go/buildutil" + +import ( + "go/build" + "os" + "path/filepath" + "sort" + "strings" + "sync" +) + +// AllPackages returns the package path of each Go package in any source +// directory of the specified build context (e.g. $GOROOT or an element +// of $GOPATH). Errors are ignored. The results are sorted. +// All package paths are canonical, and thus may contain "/vendor/". +// +// The result may include import paths for directories that contain no +// *.go files, such as "archive" (in $GOROOT/src). +// +// All I/O is done via the build.Context file system interface, +// which must be concurrency-safe. +// +func AllPackages(ctxt *build.Context) []string { + var list []string + ForEachPackage(ctxt, func(pkg string, _ error) { + list = append(list, pkg) + }) + sort.Strings(list) + return list +} + +// ForEachPackage calls the found function with the package path of +// each Go package it finds in any source directory of the specified +// build context (e.g. $GOROOT or an element of $GOPATH). +// All package paths are canonical, and thus may contain "/vendor/". +// +// If the package directory exists but could not be read, the second +// argument to the found function provides the error. +// +// All I/O is done via the build.Context file system interface, +// which must be concurrency-safe. +// +func ForEachPackage(ctxt *build.Context, found func(importPath string, err error)) { + ch := make(chan item) + + var wg sync.WaitGroup + for _, root := range ctxt.SrcDirs() { + root := root + wg.Add(1) + go func() { + allPackages(ctxt, root, ch) + wg.Done() + }() + } + go func() { + wg.Wait() + close(ch) + }() + + // All calls to found occur in the caller's goroutine. + for i := range ch { + found(i.importPath, i.err) + } +} + +type item struct { + importPath string + err error // (optional) +} + +// We use a process-wide counting semaphore to limit +// the number of parallel calls to ReadDir. +var ioLimit = make(chan bool, 20) + +func allPackages(ctxt *build.Context, root string, ch chan<- item) { + root = filepath.Clean(root) + string(os.PathSeparator) + + var wg sync.WaitGroup + + var walkDir func(dir string) + walkDir = func(dir string) { + // Avoid .foo, _foo, and testdata directory trees. + base := filepath.Base(dir) + if base == "" || base[0] == '.' || base[0] == '_' || base == "testdata" { + return + } + + pkg := filepath.ToSlash(strings.TrimPrefix(dir, root)) + + // Prune search if we encounter any of these import paths. + switch pkg { + case "builtin": + return + } + + ioLimit <- true + files, err := ReadDir(ctxt, dir) + <-ioLimit + if pkg != "" || err != nil { + ch <- item{pkg, err} + } + for _, fi := range files { + fi := fi + if fi.IsDir() { + wg.Add(1) + go func() { + walkDir(filepath.Join(dir, fi.Name())) + wg.Done() + }() + } + } + } + + walkDir(root) + wg.Wait() +} + +// ExpandPatterns returns the set of packages matched by patterns, +// which may have the following forms: +// +// golang.org/x/tools/cmd/guru # a single package +// golang.org/x/tools/... # all packages beneath dir +// ... # the entire workspace. +// +// Order is significant: a pattern preceded by '-' removes matching +// packages from the set. For example, these patterns match all encoding +// packages except encoding/xml: +// +// encoding/... -encoding/xml +// +func ExpandPatterns(ctxt *build.Context, patterns []string) map[string]bool { + // TODO(adonovan): support other features of 'go list': + // - "std"/"cmd"/"all" meta-packages + // - "..." not at the end of a pattern + // - relative patterns using "./" or "../" prefix + + pkgs := make(map[string]bool) + doPkg := func(pkg string, neg bool) { + if neg { + delete(pkgs, pkg) + } else { + pkgs[pkg] = true + } + } + + // Scan entire workspace if wildcards are present. + // TODO(adonovan): opt: scan only the necessary subtrees of the workspace. + var all []string + for _, arg := range patterns { + if strings.HasSuffix(arg, "...") { + all = AllPackages(ctxt) + break + } + } + + for _, arg := range patterns { + if arg == "" { + continue + } + + neg := arg[0] == '-' + if neg { + arg = arg[1:] + } + + if arg == "..." { + // ... matches all packages + for _, pkg := range all { + doPkg(pkg, neg) + } + } else if dir := strings.TrimSuffix(arg, "/..."); dir != arg { + // dir/... matches all packages beneath dir + for _, pkg := range all { + if strings.HasPrefix(pkg, dir) && + (len(pkg) == len(dir) || pkg[len(dir)] == '/') { + doPkg(pkg, neg) + } + } + } else { + // single package + doPkg(arg, neg) + } + } + + return pkgs +} diff --git a/vendor/golang.org/x/tools/go/buildutil/allpackages_test.go b/vendor/golang.org/x/tools/go/buildutil/allpackages_test.go new file mode 100644 index 0000000000..96bf77a672 --- /dev/null +++ b/vendor/golang.org/x/tools/go/buildutil/allpackages_test.go @@ -0,0 +1,76 @@ +// 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. + +// Incomplete source tree on Android. + +// +build !android + +package buildutil_test + +import ( + "go/build" + "sort" + "strings" + "testing" + + "golang.org/x/tools/go/buildutil" +) + +func TestAllPackages(t *testing.T) { + all := buildutil.AllPackages(&build.Default) + + set := make(map[string]bool) + for _, pkg := range all { + set[pkg] = true + } + + const wantAtLeast = 250 + if len(all) < wantAtLeast { + t.Errorf("Found only %d packages, want at least %d", len(all), wantAtLeast) + } + + for _, want := range []string{"fmt", "crypto/sha256", "golang.org/x/tools/go/buildutil"} { + if !set[want] { + t.Errorf("Package %q not found; got %s", want, all) + } + } +} + +func TestExpandPatterns(t *testing.T) { + tree := make(map[string]map[string]string) + for _, pkg := range []string{ + "encoding", + "encoding/xml", + "encoding/hex", + "encoding/json", + "fmt", + } { + tree[pkg] = make(map[string]string) + } + ctxt := buildutil.FakeContext(tree) + + for _, test := range []struct { + patterns string + want string + }{ + {"", ""}, + {"fmt", "fmt"}, + {"nosuchpkg", "nosuchpkg"}, + {"nosuchdir/...", ""}, + {"...", "encoding encoding/hex encoding/json encoding/xml fmt"}, + {"encoding/... -encoding/xml", "encoding encoding/hex encoding/json"}, + {"... -encoding/...", "fmt"}, + } { + var pkgs []string + for pkg := range buildutil.ExpandPatterns(ctxt, strings.Fields(test.patterns)) { + pkgs = append(pkgs, pkg) + } + sort.Strings(pkgs) + got := strings.Join(pkgs, " ") + if got != test.want { + t.Errorf("ExpandPatterns(%s) = %s, want %s", + test.patterns, got, test.want) + } + } +} diff --git a/vendor/golang.org/x/tools/go/buildutil/fakecontext.go b/vendor/golang.org/x/tools/go/buildutil/fakecontext.go new file mode 100644 index 0000000000..24cbcbea2b --- /dev/null +++ b/vendor/golang.org/x/tools/go/buildutil/fakecontext.go @@ -0,0 +1,108 @@ +package buildutil + +import ( + "fmt" + "go/build" + "io" + "io/ioutil" + "os" + "path" + "path/filepath" + "sort" + "strings" + "time" +) + +// FakeContext returns a build.Context for the fake file tree specified +// by pkgs, which maps package import paths to a mapping from file base +// names to contents. +// +// The fake Context has a GOROOT of "/go" and no GOPATH, and overrides +// the necessary file access methods to read from memory instead of the +// real file system. +// +// Unlike a real file tree, the fake one has only two levels---packages +// and files---so ReadDir("/go/src/") returns all packages under +// /go/src/ including, for instance, "math" and "math/big". +// ReadDir("/go/src/math/big") would return all the files in the +// "math/big" package. +// +func FakeContext(pkgs map[string]map[string]string) *build.Context { + clean := func(filename string) string { + f := path.Clean(filepath.ToSlash(filename)) + // Removing "/go/src" while respecting segment + // boundaries has this unfortunate corner case: + if f == "/go/src" { + return "" + } + return strings.TrimPrefix(f, "/go/src/") + } + + ctxt := build.Default // copy + ctxt.GOROOT = "/go" + ctxt.GOPATH = "" + ctxt.IsDir = func(dir string) bool { + dir = clean(dir) + if dir == "" { + return true // needed by (*build.Context).SrcDirs + } + return pkgs[dir] != nil + } + ctxt.ReadDir = func(dir string) ([]os.FileInfo, error) { + dir = clean(dir) + var fis []os.FileInfo + if dir == "" { + // enumerate packages + for importPath := range pkgs { + fis = append(fis, fakeDirInfo(importPath)) + } + } else { + // enumerate files of package + for basename := range pkgs[dir] { + fis = append(fis, fakeFileInfo(basename)) + } + } + sort.Sort(byName(fis)) + return fis, nil + } + ctxt.OpenFile = func(filename string) (io.ReadCloser, error) { + filename = clean(filename) + dir, base := path.Split(filename) + content, ok := pkgs[path.Clean(dir)][base] + if !ok { + return nil, fmt.Errorf("file not found: %s", filename) + } + return ioutil.NopCloser(strings.NewReader(content)), nil + } + ctxt.IsAbsPath = func(path string) bool { + path = filepath.ToSlash(path) + // Don't rely on the default (filepath.Path) since on + // Windows, it reports virtual paths as non-absolute. + return strings.HasPrefix(path, "/") + } + return &ctxt +} + +type byName []os.FileInfo + +func (s byName) Len() int { return len(s) } +func (s byName) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s byName) Less(i, j int) bool { return s[i].Name() < s[j].Name() } + +type fakeFileInfo string + +func (fi fakeFileInfo) Name() string { return string(fi) } +func (fakeFileInfo) Sys() interface{} { return nil } +func (fakeFileInfo) ModTime() time.Time { return time.Time{} } +func (fakeFileInfo) IsDir() bool { return false } +func (fakeFileInfo) Size() int64 { return 0 } +func (fakeFileInfo) Mode() os.FileMode { return 0644 } + +type fakeDirInfo string + +func (fd fakeDirInfo) Name() string { return string(fd) } +func (fakeDirInfo) Sys() interface{} { return nil } +func (fakeDirInfo) ModTime() time.Time { return time.Time{} } +func (fakeDirInfo) IsDir() bool { return true } +func (fakeDirInfo) Size() int64 { return 0 } +func (fakeDirInfo) Mode() os.FileMode { return 0755 } diff --git a/vendor/golang.org/x/tools/go/buildutil/tags.go b/vendor/golang.org/x/tools/go/buildutil/tags.go new file mode 100644 index 0000000000..486606f376 --- /dev/null +++ b/vendor/golang.org/x/tools/go/buildutil/tags.go @@ -0,0 +1,75 @@ +package buildutil + +// This logic was copied from stringsFlag from $GOROOT/src/cmd/go/build.go. + +import "fmt" + +const TagsFlagDoc = "a list of `build tags` to consider satisfied during the build. " + + "For more information about build tags, see the description of " + + "build constraints in the documentation for the go/build package" + +// TagsFlag is an implementation of the flag.Value and flag.Getter interfaces that parses +// a flag value in the same manner as go build's -tags flag and +// populates a []string slice. +// +// See $GOROOT/src/go/build/doc.go for description of build tags. +// See $GOROOT/src/cmd/go/doc.go for description of 'go build -tags' flag. +// +// Example: +// flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc) +type TagsFlag []string + +func (v *TagsFlag) Set(s string) error { + var err error + *v, err = splitQuotedFields(s) + if *v == nil { + *v = []string{} + } + return err +} + +func (v *TagsFlag) Get() interface{} { return *v } + +func splitQuotedFields(s string) ([]string, error) { + // Split fields allowing '' or "" around elements. + // Quotes further inside the string do not count. + var f []string + for len(s) > 0 { + for len(s) > 0 && isSpaceByte(s[0]) { + s = s[1:] + } + if len(s) == 0 { + break + } + // Accepted quoted string. No unescaping inside. + if s[0] == '"' || s[0] == '\'' { + quote := s[0] + s = s[1:] + i := 0 + for i < len(s) && s[i] != quote { + i++ + } + if i >= len(s) { + return nil, fmt.Errorf("unterminated %c string", quote) + } + f = append(f, s[:i]) + s = s[i+1:] + continue + } + i := 0 + for i < len(s) && !isSpaceByte(s[i]) { + i++ + } + f = append(f, s[:i]) + s = s[i:] + } + return f, nil +} + +func (v *TagsFlag) String() string { + return "" +} + +func isSpaceByte(c byte) bool { + return c == ' ' || c == '\t' || c == '\n' || c == '\r' +} diff --git a/vendor/golang.org/x/tools/go/buildutil/tags_test.go b/vendor/golang.org/x/tools/go/buildutil/tags_test.go new file mode 100644 index 0000000000..0fc26180a9 --- /dev/null +++ b/vendor/golang.org/x/tools/go/buildutil/tags_test.go @@ -0,0 +1,28 @@ +package buildutil_test + +import ( + "flag" + "go/build" + "reflect" + "testing" + + "golang.org/x/tools/go/buildutil" +) + +func TestTags(t *testing.T) { + f := flag.NewFlagSet("TestTags", flag.PanicOnError) + var ctxt build.Context + f.Var((*buildutil.TagsFlag)(&ctxt.BuildTags), "tags", buildutil.TagsFlagDoc) + f.Parse([]string{"-tags", ` 'one'"two" 'three "four"'`, "rest"}) + + // BuildTags + want := []string{"one", "two", "three \"four\""} + if !reflect.DeepEqual(ctxt.BuildTags, want) { + t.Errorf("BuildTags = %q, want %q", ctxt.BuildTags, want) + } + + // Args() + if want := []string{"rest"}; !reflect.DeepEqual(f.Args(), want) { + t.Errorf("f.Args() = %q, want %q", f.Args(), want) + } +} diff --git a/vendor/golang.org/x/tools/go/buildutil/util.go b/vendor/golang.org/x/tools/go/buildutil/util.go new file mode 100644 index 0000000000..0e093fc030 --- /dev/null +++ b/vendor/golang.org/x/tools/go/buildutil/util.go @@ -0,0 +1,167 @@ +// 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 buildutil + +import ( + "fmt" + "go/ast" + "go/build" + "go/parser" + "go/token" + "io" + "io/ioutil" + "os" + "path" + "path/filepath" + "runtime" + "strings" +) + +// ParseFile behaves like parser.ParseFile, +// but uses the build context's file system interface, if any. +// +// If file is not absolute (as defined by IsAbsPath), the (dir, file) +// components are joined using JoinPath; dir must be absolute. +// +// The displayPath function, if provided, is used to transform the +// filename that will be attached to the ASTs. +// +// TODO(adonovan): call this from go/loader.parseFiles when the tree thaws. +// +func ParseFile(fset *token.FileSet, ctxt *build.Context, displayPath func(string) string, dir string, file string, mode parser.Mode) (*ast.File, error) { + if !IsAbsPath(ctxt, file) { + file = JoinPath(ctxt, dir, file) + } + rd, err := OpenFile(ctxt, file) + if err != nil { + return nil, err + } + defer rd.Close() // ignore error + if displayPath != nil { + file = displayPath(file) + } + return parser.ParseFile(fset, file, rd, mode) +} + +// ContainingPackage returns the package containing filename. +// +// If filename is not absolute, it is interpreted relative to working directory dir. +// All I/O is via the build context's file system interface, if any. +// +// The '...Files []string' fields of the resulting build.Package are not +// populated (build.FindOnly mode). +// +// TODO(adonovan): call this from oracle when the tree thaws. +// +func ContainingPackage(ctxt *build.Context, dir, filename string) (*build.Package, error) { + if !IsAbsPath(ctxt, filename) { + filename = JoinPath(ctxt, dir, filename) + } + + // We must not assume the file tree uses + // "/" always, + // `\` always, + // or os.PathSeparator (which varies by platform), + // but to make any progress, we are forced to assume that + // paths will not use `\` unless the PathSeparator + // is also `\`, thus we can rely on filepath.ToSlash for some sanity. + + dirSlash := path.Dir(filepath.ToSlash(filename)) + "/" + + // We assume that no source root (GOPATH[i] or GOROOT) contains any other. + for _, srcdir := range ctxt.SrcDirs() { + srcdirSlash := filepath.ToSlash(srcdir) + "/" + if dirHasPrefix(dirSlash, srcdirSlash) { + importPath := dirSlash[len(srcdirSlash) : len(dirSlash)-len("/")] + return ctxt.Import(importPath, dir, build.FindOnly) + } + } + + return nil, fmt.Errorf("can't find package containing %s", filename) +} + +// dirHasPrefix tests whether the directory dir begins with prefix. +func dirHasPrefix(dir, prefix string) bool { + if runtime.GOOS != "windows" { + return strings.HasPrefix(dir, prefix) + } + return len(dir) >= len(prefix) && strings.EqualFold(dir[:len(prefix)], prefix) +} + +// -- Effective methods of file system interface ------------------------- + +// (go/build.Context defines these as methods, but does not export them.) + +// TODO(adonovan): HasSubdir? + +// FileExists returns true if the specified file exists, +// using the build context's file system interface. +func FileExists(ctxt *build.Context, path string) bool { + if ctxt.OpenFile != nil { + r, err := ctxt.OpenFile(path) + if err != nil { + return false + } + r.Close() // ignore error + return true + } + _, err := os.Stat(path) + return err == nil +} + +// OpenFile behaves like os.Open, +// but uses the build context's file system interface, if any. +func OpenFile(ctxt *build.Context, path string) (io.ReadCloser, error) { + if ctxt.OpenFile != nil { + return ctxt.OpenFile(path) + } + return os.Open(path) +} + +// IsAbsPath behaves like filepath.IsAbs, +// but uses the build context's file system interface, if any. +func IsAbsPath(ctxt *build.Context, path string) bool { + if ctxt.IsAbsPath != nil { + return ctxt.IsAbsPath(path) + } + return filepath.IsAbs(path) +} + +// JoinPath behaves like filepath.Join, +// but uses the build context's file system interface, if any. +func JoinPath(ctxt *build.Context, path ...string) string { + if ctxt.JoinPath != nil { + return ctxt.JoinPath(path...) + } + return filepath.Join(path...) +} + +// IsDir behaves like os.Stat plus IsDir, +// but uses the build context's file system interface, if any. +func IsDir(ctxt *build.Context, path string) bool { + if ctxt.IsDir != nil { + return ctxt.IsDir(path) + } + fi, err := os.Stat(path) + return err == nil && fi.IsDir() +} + +// ReadDir behaves like ioutil.ReadDir, +// but uses the build context's file system interface, if any. +func ReadDir(ctxt *build.Context, path string) ([]os.FileInfo, error) { + if ctxt.ReadDir != nil { + return ctxt.ReadDir(path) + } + return ioutil.ReadDir(path) +} + +// SplitPathList behaves like filepath.SplitList, +// but uses the build context's file system interface, if any. +func SplitPathList(ctxt *build.Context, s string) []string { + if ctxt.SplitPathList != nil { + return ctxt.SplitPathList(s) + } + return filepath.SplitList(s) +} diff --git a/vendor/golang.org/x/tools/go/buildutil/util_test.go b/vendor/golang.org/x/tools/go/buildutil/util_test.go new file mode 100644 index 0000000000..dd55533ce6 --- /dev/null +++ b/vendor/golang.org/x/tools/go/buildutil/util_test.go @@ -0,0 +1,46 @@ +// 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. + +// Incomplete source tree on Android. + +// +build !android + +package buildutil_test + +import ( + "go/build" + "os" + "path/filepath" + "runtime" + "testing" + + "golang.org/x/tools/go/buildutil" +) + +func TestContainingPackage(t *testing.T) { + // unvirtualized: + goroot := runtime.GOROOT() + gopath := filepath.SplitList(os.Getenv("GOPATH"))[0] + + tests := [][2]string{ + {goroot + "/src/fmt/print.go", "fmt"}, + {goroot + "/src/encoding/json/foo.go", "encoding/json"}, + {goroot + "/src/encoding/missing/foo.go", "(not found)"}, + {gopath + "/src/golang.org/x/tools/go/buildutil/util_test.go", + "golang.org/x/tools/go/buildutil"}, + } + for _, test := range tests { + file, want := test[0], test[1] + bp, err := buildutil.ContainingPackage(&build.Default, ".", file) + got := bp.ImportPath + if err != nil { + got = "(not found)" + } + if got != want { + t.Errorf("ContainingPackage(%q) = %s, want %s", file, got, want) + } + } + + // TODO(adonovan): test on virtualized GOPATH too. +} diff --git a/vendor/golang.org/x/tools/go/buildutil/util_windows_test.go b/vendor/golang.org/x/tools/go/buildutil/util_windows_test.go new file mode 100644 index 0000000000..86fe9c71e2 --- /dev/null +++ b/vendor/golang.org/x/tools/go/buildutil/util_windows_test.go @@ -0,0 +1,48 @@ +// 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 buildutil_test + +import ( + "fmt" + "go/build" + "path/filepath" + "runtime" + "strings" + "testing" + + "golang.org/x/tools/go/buildutil" +) + +func testContainingPackageCaseFold(file, want string) error { + bp, err := buildutil.ContainingPackage(&build.Default, ".", file) + if err != nil { + return err + } + if got := bp.ImportPath; got != want { + return fmt.Errorf("ContainingPackage(%q) = %s, want %s", file, got, want) + } + return nil +} + +func TestContainingPackageCaseFold(t *testing.T) { + path := filepath.Join(runtime.GOROOT(), `src\fmt\print.go`) + err := testContainingPackageCaseFold(path, "fmt") + if err != nil { + t.Error(err) + } + vol := filepath.VolumeName(path) + if len(vol) != 2 || vol[1] != ':' { + t.Fatalf("GOROOT path has unexpected volume name: %v", vol) + } + rest := path[len(vol):] + err = testContainingPackageCaseFold(strings.ToUpper(vol)+rest, "fmt") + if err != nil { + t.Error(err) + } + err = testContainingPackageCaseFold(strings.ToLower(vol)+rest, "fmt") + if err != nil { + t.Error(err) + } +} diff --git a/vendor/golang.org/x/tools/go/callgraph/callgraph.go b/vendor/golang.org/x/tools/go/callgraph/callgraph.go new file mode 100644 index 0000000000..707a31931a --- /dev/null +++ b/vendor/golang.org/x/tools/go/callgraph/callgraph.go @@ -0,0 +1,129 @@ +// Copyright 2013 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 callgraph defines the call graph and various algorithms +and utilities to operate on it. + +A call graph is a labelled directed graph whose nodes represent +functions and whose edge labels represent syntactic function call +sites. The presence of a labelled edge (caller, site, callee) +indicates that caller may call callee at the specified call site. + +A call graph is a multigraph: it may contain multiple edges (caller, +*, callee) connecting the same pair of nodes, so long as the edges +differ by label; this occurs when one function calls another function +from multiple call sites. Also, it may contain multiple edges +(caller, site, *) that differ only by callee; this indicates a +polymorphic call. + +A SOUND call graph is one that overapproximates the dynamic calling +behaviors of the program in all possible executions. One call graph +is more PRECISE than another if it is a smaller overapproximation of +the dynamic behavior. + +All call graphs have a synthetic root node which is responsible for +calling main() and init(). + +Calls to built-in functions (e.g. panic, println) are not represented +in the call graph; they are treated like built-in operators of the +language. + +*/ +package callgraph // import "golang.org/x/tools/go/callgraph" + +// TODO(adonovan): add a function to eliminate wrappers from the +// callgraph, preserving topology. +// More generally, we could eliminate "uninteresting" nodes such as +// nodes from packages we don't care about. + +import ( + "fmt" + "go/token" + + "golang.org/x/tools/go/ssa" +) + +// A Graph represents a call graph. +// +// A graph may contain nodes that are not reachable from the root. +// If the call graph is sound, such nodes indicate unreachable +// functions. +// +type Graph struct { + Root *Node // the distinguished root node + Nodes map[*ssa.Function]*Node // all nodes by function +} + +// New returns a new Graph with the specified root node. +func New(root *ssa.Function) *Graph { + g := &Graph{Nodes: make(map[*ssa.Function]*Node)} + g.Root = g.CreateNode(root) + return g +} + +// CreateNode returns the Node for fn, creating it if not present. +func (g *Graph) CreateNode(fn *ssa.Function) *Node { + n, ok := g.Nodes[fn] + if !ok { + n = &Node{Func: fn, ID: len(g.Nodes)} + g.Nodes[fn] = n + } + return n +} + +// A Node represents a node in a call graph. +type Node struct { + Func *ssa.Function // the function this node represents + ID int // 0-based sequence number + In []*Edge // unordered set of incoming call edges (n.In[*].Callee == n) + Out []*Edge // unordered set of outgoing call edges (n.Out[*].Caller == n) +} + +func (n *Node) String() string { + return fmt.Sprintf("n%d:%s", n.ID, n.Func) +} + +// A Edge represents an edge in the call graph. +// +// Site is nil for edges originating in synthetic or intrinsic +// functions, e.g. reflect.Call or the root of the call graph. +type Edge struct { + Caller *Node + Site ssa.CallInstruction + Callee *Node +} + +func (e Edge) String() string { + return fmt.Sprintf("%s --> %s", e.Caller, e.Callee) +} + +func (e Edge) Description() string { + var prefix string + switch e.Site.(type) { + case nil: + return "synthetic call" + case *ssa.Go: + prefix = "concurrent " + case *ssa.Defer: + prefix = "deferred " + } + return prefix + e.Site.Common().Description() +} + +func (e Edge) Pos() token.Pos { + if e.Site == nil { + return token.NoPos + } + return e.Site.Pos() +} + +// AddEdge adds the edge (caller, site, callee) to the call graph. +// Elimination of duplicate edges is the caller's responsibility. +func AddEdge(caller *Node, site ssa.CallInstruction, callee *Node) { + e := &Edge{caller, site, callee} + callee.In = append(callee.In, e) + caller.Out = append(caller.Out, e) +} diff --git a/vendor/golang.org/x/tools/go/callgraph/cha/cha.go b/vendor/golang.org/x/tools/go/callgraph/cha/cha.go new file mode 100644 index 0000000000..e016649b6e --- /dev/null +++ b/vendor/golang.org/x/tools/go/callgraph/cha/cha.go @@ -0,0 +1,127 @@ +// 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 go1.5 + +// Package cha computes the call graph of a Go program using the Class +// Hierarchy Analysis (CHA) algorithm. +// +// CHA was first described in "Optimization of Object-Oriented Programs +// Using Static Class Hierarchy Analysis", Jeffrey Dean, David Grove, +// and Craig Chambers, ECOOP'95. +// +// CHA is related to RTA (see go/callgraph/rta); the difference is that +// CHA conservatively computes the entire "implements" relation between +// interfaces and concrete types ahead of time, whereas RTA uses dynamic +// programming to construct it on the fly as it encounters new functions +// reachable from main. CHA may thus include spurious call edges for +// types that haven't been instantiated yet, or types that are never +// instantiated. +// +// Since CHA conservatively assumes that all functions are address-taken +// and all concrete types are put into interfaces, it is sound to run on +// partial programs, such as libraries without a main or test function. +// +package cha // import "golang.org/x/tools/go/callgraph/cha" + +import ( + "go/types" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/go/types/typeutil" +) + +// CallGraph computes the call graph of the specified program using the +// Class Hierarchy Analysis algorithm. +// +func CallGraph(prog *ssa.Program) *callgraph.Graph { + cg := callgraph.New(nil) // TODO(adonovan) eliminate concept of rooted callgraph + + allFuncs := ssautil.AllFunctions(prog) + + // funcsBySig contains all functions, keyed by signature. It is + // the effective set of address-taken functions used to resolve + // a dynamic call of a particular signature. + var funcsBySig typeutil.Map // value is []*ssa.Function + + // methodsByName contains all methods, + // grouped by name for efficient lookup. + methodsByName := make(map[string][]*ssa.Function) + + // methodsMemo records, for every abstract method call call I.f on + // interface type I, the set of concrete methods C.f of all + // types C that satisfy interface I. + methodsMemo := make(map[*types.Func][]*ssa.Function) + lookupMethods := func(m *types.Func) []*ssa.Function { + methods, ok := methodsMemo[m] + if !ok { + I := m.Type().(*types.Signature).Recv().Type().Underlying().(*types.Interface) + for _, f := range methodsByName[m.Name()] { + C := f.Signature.Recv().Type() // named or *named + if types.Implements(C, I) { + methods = append(methods, f) + } + } + methodsMemo[m] = methods + } + return methods + } + + for f := range allFuncs { + if f.Signature.Recv() == nil { + // Package initializers can never be address-taken. + if f.Name() == "init" && f.Synthetic == "package initializer" { + continue + } + funcs, _ := funcsBySig.At(f.Signature).([]*ssa.Function) + funcs = append(funcs, f) + funcsBySig.Set(f.Signature, funcs) + } else { + methodsByName[f.Name()] = append(methodsByName[f.Name()], f) + } + } + + addEdge := func(fnode *callgraph.Node, site ssa.CallInstruction, g *ssa.Function) { + gnode := cg.CreateNode(g) + callgraph.AddEdge(fnode, site, gnode) + } + + addEdges := func(fnode *callgraph.Node, site ssa.CallInstruction, callees []*ssa.Function) { + // Because every call to a highly polymorphic and + // frequently used abstract method such as + // (io.Writer).Write is assumed to call every concrete + // Write method in the program, the call graph can + // contain a lot of duplication. + // + // TODO(adonovan): opt: consider factoring the callgraph + // API so that the Callers component of each edge is a + // slice of nodes, not a singleton. + for _, g := range callees { + addEdge(fnode, site, g) + } + } + + for f := range allFuncs { + fnode := cg.CreateNode(f) + for _, b := range f.Blocks { + for _, instr := range b.Instrs { + if site, ok := instr.(ssa.CallInstruction); ok { + call := site.Common() + if call.IsInvoke() { + addEdges(fnode, site, lookupMethods(call.Method)) + } else if g := call.StaticCallee(); g != nil { + addEdge(fnode, site, g) + } else if _, ok := call.Value.(*ssa.Builtin); !ok { + callees, _ := funcsBySig.At(call.Signature()).([]*ssa.Function) + addEdges(fnode, site, callees) + } + } + } + } + } + + return cg +} diff --git a/vendor/golang.org/x/tools/go/callgraph/cha/cha14.go b/vendor/golang.org/x/tools/go/callgraph/cha/cha14.go new file mode 100644 index 0000000000..5a20c8b064 --- /dev/null +++ b/vendor/golang.org/x/tools/go/callgraph/cha/cha14.go @@ -0,0 +1,126 @@ +// 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 !go1.5 + +// Package cha computes the call graph of a Go program using the Class +// Hierarchy Analysis (CHA) algorithm. +// +// CHA was first described in "Optimization of Object-Oriented Programs +// Using Static Class Hierarchy Analysis", Jeffrey Dean, David Grove, +// and Craig Chambers, ECOOP'95. +// +// CHA is related to RTA (see go/callgraph/rta); the difference is that +// CHA conservatively computes the entire "implements" relation between +// interfaces and concrete types ahead of time, whereas RTA uses dynamic +// programming to construct it on the fly as it encounters new functions +// reachable from main. CHA may thus include spurious call edges for +// types that haven't been instantiated yet, or types that are never +// instantiated. +// +// Since CHA conservatively assumes that all functions are address-taken +// and all concrete types are put into interfaces, it is sound to run on +// partial programs, such as libraries without a main or test function. +// +package cha // import "golang.org/x/tools/go/callgraph/cha" + +import ( + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/go/types" + "golang.org/x/tools/go/types/typeutil" +) + +// CallGraph computes the call graph of the specified program using the +// Class Hierarchy Analysis algorithm. +// +func CallGraph(prog *ssa.Program) *callgraph.Graph { + cg := callgraph.New(nil) // TODO(adonovan) eliminate concept of rooted callgraph + + allFuncs := ssautil.AllFunctions(prog) + + // funcsBySig contains all functions, keyed by signature. It is + // the effective set of address-taken functions used to resolve + // a dynamic call of a particular signature. + var funcsBySig typeutil.Map // value is []*ssa.Function + + // methodsByName contains all methods, + // grouped by name for efficient lookup. + methodsByName := make(map[string][]*ssa.Function) + + // methodsMemo records, for every abstract method call call I.f on + // interface type I, the set of concrete methods C.f of all + // types C that satisfy interface I. + methodsMemo := make(map[*types.Func][]*ssa.Function) + lookupMethods := func(m *types.Func) []*ssa.Function { + methods, ok := methodsMemo[m] + if !ok { + I := m.Type().(*types.Signature).Recv().Type().Underlying().(*types.Interface) + for _, f := range methodsByName[m.Name()] { + C := f.Signature.Recv().Type() // named or *named + if types.Implements(C, I) { + methods = append(methods, f) + } + } + methodsMemo[m] = methods + } + return methods + } + + for f := range allFuncs { + if f.Signature.Recv() == nil { + // Package initializers can never be address-taken. + if f.Name() == "init" && f.Synthetic == "package initializer" { + continue + } + funcs, _ := funcsBySig.At(f.Signature).([]*ssa.Function) + funcs = append(funcs, f) + funcsBySig.Set(f.Signature, funcs) + } else { + methodsByName[f.Name()] = append(methodsByName[f.Name()], f) + } + } + + addEdge := func(fnode *callgraph.Node, site ssa.CallInstruction, g *ssa.Function) { + gnode := cg.CreateNode(g) + callgraph.AddEdge(fnode, site, gnode) + } + + addEdges := func(fnode *callgraph.Node, site ssa.CallInstruction, callees []*ssa.Function) { + // Because every call to a highly polymorphic and + // frequently used abstract method such as + // (io.Writer).Write is assumed to call every concrete + // Write method in the program, the call graph can + // contain a lot of duplication. + // + // TODO(adonovan): opt: consider factoring the callgraph + // API so that the Callers component of each edge is a + // slice of nodes, not a singleton. + for _, g := range callees { + addEdge(fnode, site, g) + } + } + + for f := range allFuncs { + fnode := cg.CreateNode(f) + for _, b := range f.Blocks { + for _, instr := range b.Instrs { + if site, ok := instr.(ssa.CallInstruction); ok { + call := site.Common() + if call.IsInvoke() { + addEdges(fnode, site, lookupMethods(call.Method)) + } else if g := call.StaticCallee(); g != nil { + addEdge(fnode, site, g) + } else if _, ok := call.Value.(*ssa.Builtin); !ok { + callees, _ := funcsBySig.At(call.Signature()).([]*ssa.Function) + addEdges(fnode, site, callees) + } + } + } + } + } + + return cg +} diff --git a/vendor/golang.org/x/tools/go/callgraph/cha/cha14_test.go b/vendor/golang.org/x/tools/go/callgraph/cha/cha14_test.go new file mode 100644 index 0000000000..7f0aeebbfc --- /dev/null +++ b/vendor/golang.org/x/tools/go/callgraph/cha/cha14_test.go @@ -0,0 +1,112 @@ +// 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 !go1.5 + +// No testdata on Android. + +// +build !android + +package cha_test + +import ( + "bytes" + "fmt" + "go/ast" + "go/parser" + "go/token" + "io/ioutil" + "sort" + "strings" + "testing" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/callgraph/cha" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/go/types" +) + +var inputs = []string{ + "testdata/func.go", + "testdata/iface.go", + "testdata/recv.go", +} + +func expectation(f *ast.File) (string, token.Pos) { + for _, c := range f.Comments { + text := strings.TrimSpace(c.Text()) + if t := strings.TrimPrefix(text, "WANT:\n"); t != text { + return t, c.Pos() + } + } + return "", token.NoPos +} + +// TestCHA runs CHA on each file in inputs, prints the dynamic edges of +// the call graph, and compares it with the golden results embedded in +// the WANT comment at the end of the file. +// +func TestCHA(t *testing.T) { + for _, filename := range inputs { + content, err := ioutil.ReadFile(filename) + if err != nil { + t.Errorf("couldn't read file '%s': %s", filename, err) + continue + } + + conf := loader.Config{ + ParserMode: parser.ParseComments, + } + f, err := conf.ParseFile(filename, content) + if err != nil { + t.Error(err) + continue + } + + want, pos := expectation(f) + if pos == token.NoPos { + t.Errorf("No WANT: comment in %s", filename) + continue + } + + conf.CreateFromFiles("main", f) + iprog, err := conf.Load() + if err != nil { + t.Error(err) + continue + } + + prog := ssautil.CreateProgram(iprog, 0) + mainPkg := prog.Package(iprog.Created[0].Pkg) + prog.Build() + + cg := cha.CallGraph(prog) + + if got := printGraph(cg, mainPkg.Pkg); got != want { + t.Errorf("%s: got:\n%s\nwant:\n%s", + prog.Fset.Position(pos), got, want) + } + } +} + +func printGraph(cg *callgraph.Graph, from *types.Package) string { + var edges []string + callgraph.GraphVisitEdges(cg, func(e *callgraph.Edge) error { + if strings.Contains(e.Description(), "dynamic") { + edges = append(edges, fmt.Sprintf("%s --> %s", + e.Caller.Func.RelString(from), + e.Callee.Func.RelString(from))) + } + return nil + }) + sort.Strings(edges) + + var buf bytes.Buffer + buf.WriteString("Dynamic calls\n") + for _, edge := range edges { + fmt.Fprintf(&buf, " %s\n", edge) + } + return strings.TrimSpace(buf.String()) +} diff --git a/vendor/golang.org/x/tools/go/callgraph/cha/cha_test.go b/vendor/golang.org/x/tools/go/callgraph/cha/cha_test.go new file mode 100644 index 0000000000..332758cf77 --- /dev/null +++ b/vendor/golang.org/x/tools/go/callgraph/cha/cha_test.go @@ -0,0 +1,112 @@ +// 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 go1.5 + +// No testdata on Android. + +// +build !android + +package cha_test + +import ( + "bytes" + "fmt" + "go/ast" + "go/parser" + "go/token" + "go/types" + "io/ioutil" + "sort" + "strings" + "testing" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/callgraph/cha" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa/ssautil" +) + +var inputs = []string{ + "testdata/func.go", + "testdata/iface.go", + "testdata/recv.go", +} + +func expectation(f *ast.File) (string, token.Pos) { + for _, c := range f.Comments { + text := strings.TrimSpace(c.Text()) + if t := strings.TrimPrefix(text, "WANT:\n"); t != text { + return t, c.Pos() + } + } + return "", token.NoPos +} + +// TestCHA runs CHA on each file in inputs, prints the dynamic edges of +// the call graph, and compares it with the golden results embedded in +// the WANT comment at the end of the file. +// +func TestCHA(t *testing.T) { + for _, filename := range inputs { + content, err := ioutil.ReadFile(filename) + if err != nil { + t.Errorf("couldn't read file '%s': %s", filename, err) + continue + } + + conf := loader.Config{ + ParserMode: parser.ParseComments, + } + f, err := conf.ParseFile(filename, content) + if err != nil { + t.Error(err) + continue + } + + want, pos := expectation(f) + if pos == token.NoPos { + t.Errorf("No WANT: comment in %s", filename) + continue + } + + conf.CreateFromFiles("main", f) + iprog, err := conf.Load() + if err != nil { + t.Error(err) + continue + } + + prog := ssautil.CreateProgram(iprog, 0) + mainPkg := prog.Package(iprog.Created[0].Pkg) + prog.Build() + + cg := cha.CallGraph(prog) + + if got := printGraph(cg, mainPkg.Pkg); got != want { + t.Errorf("%s: got:\n%s\nwant:\n%s", + prog.Fset.Position(pos), got, want) + } + } +} + +func printGraph(cg *callgraph.Graph, from *types.Package) string { + var edges []string + callgraph.GraphVisitEdges(cg, func(e *callgraph.Edge) error { + if strings.Contains(e.Description(), "dynamic") { + edges = append(edges, fmt.Sprintf("%s --> %s", + e.Caller.Func.RelString(from), + e.Callee.Func.RelString(from))) + } + return nil + }) + sort.Strings(edges) + + var buf bytes.Buffer + buf.WriteString("Dynamic calls\n") + for _, edge := range edges { + fmt.Fprintf(&buf, " %s\n", edge) + } + return strings.TrimSpace(buf.String()) +} diff --git a/vendor/golang.org/x/tools/go/callgraph/cha/testdata/func.go b/vendor/golang.org/x/tools/go/callgraph/cha/testdata/func.go new file mode 100644 index 0000000000..ad483f100d --- /dev/null +++ b/vendor/golang.org/x/tools/go/callgraph/cha/testdata/func.go @@ -0,0 +1,23 @@ +//+build ignore + +package main + +// Test of dynamic function calls; no interfaces. + +func A(int) {} + +var ( + B = func(int) {} + C = func(int) {} +) + +func f() { + pfn := B + pfn(0) // calls A, B, C, even though A is not even address-taken +} + +// WANT: +// Dynamic calls +// f --> A +// f --> init$1 +// f --> init$2 diff --git a/vendor/golang.org/x/tools/go/callgraph/cha/testdata/iface.go b/vendor/golang.org/x/tools/go/callgraph/cha/testdata/iface.go new file mode 100644 index 0000000000..1622ec154a --- /dev/null +++ b/vendor/golang.org/x/tools/go/callgraph/cha/testdata/iface.go @@ -0,0 +1,65 @@ +//+build ignore + +package main + +// Test of interface calls. None of the concrete types are ever +// instantiated or converted to interfaces. + +type I interface { + f() +} + +type J interface { + f() + g() +} + +type C int // implements I + +func (*C) f() + +type D int // implements I and J + +func (*D) f() +func (*D) g() + +func one(i I, j J) { + i.f() // calls *C and *D +} + +func two(i I, j J) { + j.f() // calls *D (but not *C, even though it defines method f) +} + +func three(i I, j J) { + j.g() // calls *D +} + +func four(i I, j J) { + Jf := J.f + if unknown { + Jf = nil // suppress SSA constant propagation + } + Jf(nil) // calls *D +} + +func five(i I, j J) { + jf := j.f + if unknown { + jf = nil // suppress SSA constant propagation + } + jf() // calls *D +} + +var unknown bool + +// WANT: +// Dynamic calls +// (J).f$bound --> (*D).f +// (J).f$thunk --> (*D).f +// five --> (J).f$bound +// four --> (J).f$thunk +// one --> (*C).f +// one --> (*D).f +// three --> (*D).g +// two --> (*D).f diff --git a/vendor/golang.org/x/tools/go/callgraph/cha/testdata/recv.go b/vendor/golang.org/x/tools/go/callgraph/cha/testdata/recv.go new file mode 100644 index 0000000000..5ba48e933f --- /dev/null +++ b/vendor/golang.org/x/tools/go/callgraph/cha/testdata/recv.go @@ -0,0 +1,37 @@ +//+build ignore + +package main + +type I interface { + f() +} + +type J interface { + g() +} + +type C int // C and *C implement I; *C implements J + +func (C) f() +func (*C) g() + +type D int // *D implements I and J + +func (*D) f() +func (*D) g() + +func f(i I) { + i.f() // calls C, *C, *D +} + +func g(j J) { + j.g() // calls *C, *D +} + +// WANT: +// Dynamic calls +// f --> (*C).f +// f --> (*D).f +// f --> (C).f +// g --> (*C).g +// g --> (*D).g diff --git a/vendor/golang.org/x/tools/go/callgraph/rta/rta.go b/vendor/golang.org/x/tools/go/callgraph/rta/rta.go new file mode 100644 index 0000000000..7c9379d695 --- /dev/null +++ b/vendor/golang.org/x/tools/go/callgraph/rta/rta.go @@ -0,0 +1,461 @@ +// Copyright 2013 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.5 + +// This package provides Rapid Type Analysis (RTA) for Go, a fast +// algorithm for call graph construction and discovery of reachable code +// (and hence dead code) and runtime types. The algorithm was first +// described in: +// +// David F. Bacon and Peter F. Sweeney. 1996. +// Fast static analysis of C++ virtual function calls. (OOPSLA '96) +// http://doi.acm.org/10.1145/236337.236371 +// +// The algorithm uses dynamic programming to tabulate the cross-product +// of the set of known "address taken" functions with the set of known +// dynamic calls of the same type. As each new address-taken function +// is discovered, call graph edges are added from each known callsite, +// and as each new call site is discovered, call graph edges are added +// from it to each known address-taken function. +// +// A similar approach is used for dynamic calls via interfaces: it +// tabulates the cross-product of the set of known "runtime types", +// i.e. types that may appear in an interface value, or be derived from +// one via reflection, with the set of known "invoke"-mode dynamic +// calls. As each new "runtime type" is discovered, call edges are +// added from the known call sites, and as each new call site is +// discovered, call graph edges are added to each compatible +// method. +// +// In addition, we must consider all exported methods of any runtime type +// as reachable, since they may be called via reflection. +// +// Each time a newly added call edge causes a new function to become +// reachable, the code of that function is analyzed for more call sites, +// address-taken functions, and runtime types. The process continues +// until a fixed point is achieved. +// +// The resulting call graph is less precise than one produced by pointer +// analysis, but the algorithm is much faster. For example, running the +// cmd/callgraph tool on its own source takes ~2.1s for RTA and ~5.4s +// for points-to analysis. +// +package rta // import "golang.org/x/tools/go/callgraph/rta" + +// TODO(adonovan): test it by connecting it to the interpreter and +// replacing all "unreachable" functions by a special intrinsic, and +// ensure that that intrinsic is never called. + +import ( + "fmt" + "go/types" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types/typeutil" +) + +// A Result holds the results of Rapid Type Analysis, which includes the +// set of reachable functions/methods, runtime types, and the call graph. +// +type Result struct { + // CallGraph is the discovered callgraph. + // It does not include edges for calls made via reflection. + CallGraph *callgraph.Graph + + // Reachable contains the set of reachable functions and methods. + // This includes exported methods of runtime types, since + // they may be accessed via reflection. + // The value indicates whether the function is address-taken. + // + // (We wrap the bool in a struct to avoid inadvertent use of + // "if Reachable[f] {" to test for set membership.) + Reachable map[*ssa.Function]struct{ AddrTaken bool } + + // RuntimeTypes contains the set of types that are needed at + // runtime, for interfaces or reflection. + // + // The value indicates whether the type is inaccessible to reflection. + // Consider: + // type A struct{B} + // fmt.Println(new(A)) + // Types *A, A and B are accessible to reflection, but the unnamed + // type struct{B} is not. + RuntimeTypes typeutil.Map +} + +// Working state of the RTA algorithm. +type rta struct { + result *Result + + prog *ssa.Program + + worklist []*ssa.Function // list of functions to visit + + // addrTakenFuncsBySig contains all address-taken *Functions, grouped by signature. + // Keys are *types.Signature, values are map[*ssa.Function]bool sets. + addrTakenFuncsBySig typeutil.Map + + // dynCallSites contains all dynamic "call"-mode call sites, grouped by signature. + // Keys are *types.Signature, values are unordered []ssa.CallInstruction. + dynCallSites typeutil.Map + + // invokeSites contains all "invoke"-mode call sites, grouped by interface. + // Keys are *types.Interface (never *types.Named), + // Values are unordered []ssa.CallInstruction sets. + invokeSites typeutil.Map + + // The following two maps together define the subset of the + // m:n "implements" relation needed by the algorithm. + + // concreteTypes maps each concrete type to the set of interfaces that it implements. + // Keys are types.Type, values are unordered []*types.Interface. + // Only concrete types used as MakeInterface operands are included. + concreteTypes typeutil.Map + + // interfaceTypes maps each interface type to + // the set of concrete types that implement it. + // Keys are *types.Interface, values are unordered []types.Type. + // Only interfaces used in "invoke"-mode CallInstructions are included. + interfaceTypes typeutil.Map +} + +// addReachable marks a function as potentially callable at run-time, +// and ensures that it gets processed. +func (r *rta) addReachable(f *ssa.Function, addrTaken bool) { + reachable := r.result.Reachable + n := len(reachable) + v := reachable[f] + if addrTaken { + v.AddrTaken = true + } + reachable[f] = v + if len(reachable) > n { + // First time seeing f. Add it to the worklist. + r.worklist = append(r.worklist, f) + } +} + +// addEdge adds the specified call graph edge, and marks it reachable. +// addrTaken indicates whether to mark the callee as "address-taken". +func (r *rta) addEdge(site ssa.CallInstruction, callee *ssa.Function, addrTaken bool) { + r.addReachable(callee, addrTaken) + + if g := r.result.CallGraph; g != nil { + if site.Parent() == nil { + panic(site) + } + from := g.CreateNode(site.Parent()) + to := g.CreateNode(callee) + callgraph.AddEdge(from, site, to) + } +} + +// ---------- addrTakenFuncs × dynCallSites ---------- + +// visitAddrTakenFunc is called each time we encounter an address-taken function f. +func (r *rta) visitAddrTakenFunc(f *ssa.Function) { + // Create two-level map (Signature -> Function -> bool). + S := f.Signature + funcs, _ := r.addrTakenFuncsBySig.At(S).(map[*ssa.Function]bool) + if funcs == nil { + funcs = make(map[*ssa.Function]bool) + r.addrTakenFuncsBySig.Set(S, funcs) + } + if !funcs[f] { + // First time seeing f. + funcs[f] = true + + // If we've seen any dyncalls of this type, mark it reachable, + // and add call graph edges. + sites, _ := r.dynCallSites.At(S).([]ssa.CallInstruction) + for _, site := range sites { + r.addEdge(site, f, true) + } + } +} + +// visitDynCall is called each time we encounter a dynamic "call"-mode call. +func (r *rta) visitDynCall(site ssa.CallInstruction) { + S := site.Common().Signature() + + // Record the call site. + sites, _ := r.dynCallSites.At(S).([]ssa.CallInstruction) + r.dynCallSites.Set(S, append(sites, site)) + + // For each function of signature S that we know is address-taken, + // mark it reachable. We'll add the callgraph edges later. + funcs, _ := r.addrTakenFuncsBySig.At(S).(map[*ssa.Function]bool) + for g := range funcs { + r.addEdge(site, g, true) + } +} + +// ---------- concrete types × invoke sites ---------- + +// addInvokeEdge is called for each new pair (site, C) in the matrix. +func (r *rta) addInvokeEdge(site ssa.CallInstruction, C types.Type) { + // Ascertain the concrete method of C to be called. + imethod := site.Common().Method + cmethod := r.prog.MethodValue(r.prog.MethodSets.MethodSet(C).Lookup(imethod.Pkg(), imethod.Name())) + r.addEdge(site, cmethod, true) +} + +// visitInvoke is called each time the algorithm encounters an "invoke"-mode call. +func (r *rta) visitInvoke(site ssa.CallInstruction) { + I := site.Common().Value.Type().Underlying().(*types.Interface) + + // Record the invoke site. + sites, _ := r.invokeSites.At(I).([]ssa.CallInstruction) + r.invokeSites.Set(I, append(sites, site)) + + // Add callgraph edge for each existing + // address-taken concrete type implementing I. + for _, C := range r.implementations(I) { + r.addInvokeEdge(site, C) + } +} + +// ---------- main algorithm ---------- + +// visitFunc processes function f. +func (r *rta) visitFunc(f *ssa.Function) { + var space [32]*ssa.Value // preallocate space for common case + + for _, b := range f.Blocks { + for _, instr := range b.Instrs { + rands := instr.Operands(space[:0]) + + switch instr := instr.(type) { + case ssa.CallInstruction: + call := instr.Common() + if call.IsInvoke() { + r.visitInvoke(instr) + } else if g := call.StaticCallee(); g != nil { + r.addEdge(instr, g, false) + } else if _, ok := call.Value.(*ssa.Builtin); !ok { + r.visitDynCall(instr) + } + + // Ignore the call-position operand when + // looking for address-taken Functions. + // Hack: assume this is rands[0]. + rands = rands[1:] + + case *ssa.MakeInterface: + r.addRuntimeType(instr.X.Type(), false) + } + + // Process all address-taken functions. + for _, op := range rands { + if g, ok := (*op).(*ssa.Function); ok { + r.visitAddrTakenFunc(g) + } + } + } + } +} + +// Analyze performs Rapid Type Analysis, starting at the specified root +// functions. It returns nil if no roots were specified. +// +// If buildCallGraph is true, Result.CallGraph will contain a call +// graph; otherwise, only the other fields (reachable functions) are +// populated. +// +func Analyze(roots []*ssa.Function, buildCallGraph bool) *Result { + if len(roots) == 0 { + return nil + } + + r := &rta{ + result: &Result{Reachable: make(map[*ssa.Function]struct{ AddrTaken bool })}, + prog: roots[0].Prog, + } + + if buildCallGraph { + // TODO(adonovan): change callgraph API to eliminate the + // notion of a distinguished root node. Some callgraphs + // have many roots, or none. + r.result.CallGraph = callgraph.New(roots[0]) + } + + hasher := typeutil.MakeHasher() + r.result.RuntimeTypes.SetHasher(hasher) + r.addrTakenFuncsBySig.SetHasher(hasher) + r.dynCallSites.SetHasher(hasher) + r.invokeSites.SetHasher(hasher) + r.concreteTypes.SetHasher(hasher) + r.interfaceTypes.SetHasher(hasher) + + // Visit functions, processing their instructions, and adding + // new functions to the worklist, until a fixed point is + // reached. + var shadow []*ssa.Function // for efficiency, we double-buffer the worklist + r.worklist = append(r.worklist, roots...) + for len(r.worklist) > 0 { + shadow, r.worklist = r.worklist, shadow[:0] + for _, f := range shadow { + r.visitFunc(f) + } + } + return r.result +} + +// interfaces(C) returns all currently known interfaces implemented by C. +func (r *rta) interfaces(C types.Type) []*types.Interface { + // Ascertain set of interfaces C implements + // and update 'implements' relation. + var ifaces []*types.Interface + r.interfaceTypes.Iterate(func(I types.Type, concs interface{}) { + if I := I.(*types.Interface); types.Implements(C, I) { + concs, _ := concs.([]types.Type) + r.interfaceTypes.Set(I, append(concs, C)) + ifaces = append(ifaces, I) + } + }) + r.concreteTypes.Set(C, ifaces) + return ifaces +} + +// implementations(I) returns all currently known concrete types that implement I. +func (r *rta) implementations(I *types.Interface) []types.Type { + var concs []types.Type + if v := r.interfaceTypes.At(I); v != nil { + concs = v.([]types.Type) + } else { + // First time seeing this interface. + // Update the 'implements' relation. + r.concreteTypes.Iterate(func(C types.Type, ifaces interface{}) { + if types.Implements(C, I) { + ifaces, _ := ifaces.([]*types.Interface) + r.concreteTypes.Set(C, append(ifaces, I)) + concs = append(concs, C) + } + }) + r.interfaceTypes.Set(I, concs) + } + return concs +} + +// addRuntimeType is called for each concrete type that can be the +// dynamic type of some interface or reflect.Value. +// Adapted from needMethods in go/ssa/builder.go +// +func (r *rta) addRuntimeType(T types.Type, skip bool) { + if prev, ok := r.result.RuntimeTypes.At(T).(bool); ok { + if skip && !prev { + r.result.RuntimeTypes.Set(T, skip) + } + return + } + r.result.RuntimeTypes.Set(T, skip) + + mset := r.prog.MethodSets.MethodSet(T) + + if _, ok := T.Underlying().(*types.Interface); !ok { + // T is a new concrete type. + for i, n := 0, mset.Len(); i < n; i++ { + sel := mset.At(i) + m := sel.Obj() + + if m.Exported() { + // Exported methods are always potentially callable via reflection. + r.addReachable(r.prog.MethodValue(sel), true) + } + } + + // Add callgraph edge for each existing dynamic + // "invoke"-mode call via that interface. + for _, I := range r.interfaces(T) { + sites, _ := r.invokeSites.At(I).([]ssa.CallInstruction) + for _, site := range sites { + r.addInvokeEdge(site, T) + } + } + } + + // Precondition: T is not a method signature (*Signature with Recv()!=nil). + // Recursive case: skip => don't call makeMethods(T). + // Each package maintains its own set of types it has visited. + + var n *types.Named + switch T := T.(type) { + case *types.Named: + n = T + case *types.Pointer: + n, _ = T.Elem().(*types.Named) + } + if n != nil { + owner := n.Obj().Pkg() + if owner == nil { + return // built-in error type + } + } + + // Recursion over signatures of each exported method. + for i := 0; i < mset.Len(); i++ { + if mset.At(i).Obj().Exported() { + sig := mset.At(i).Type().(*types.Signature) + r.addRuntimeType(sig.Params(), true) // skip the Tuple itself + r.addRuntimeType(sig.Results(), true) // skip the Tuple itself + } + } + + switch t := T.(type) { + case *types.Basic: + // nop + + case *types.Interface: + // nop---handled by recursion over method set. + + case *types.Pointer: + r.addRuntimeType(t.Elem(), false) + + case *types.Slice: + r.addRuntimeType(t.Elem(), false) + + case *types.Chan: + r.addRuntimeType(t.Elem(), false) + + case *types.Map: + r.addRuntimeType(t.Key(), false) + r.addRuntimeType(t.Elem(), false) + + case *types.Signature: + if t.Recv() != nil { + panic(fmt.Sprintf("Signature %s has Recv %s", t, t.Recv())) + } + r.addRuntimeType(t.Params(), true) // skip the Tuple itself + r.addRuntimeType(t.Results(), true) // skip the Tuple itself + + case *types.Named: + // A pointer-to-named type can be derived from a named + // type via reflection. It may have methods too. + r.addRuntimeType(types.NewPointer(T), false) + + // Consider 'type T struct{S}' where S has methods. + // Reflection provides no way to get from T to struct{S}, + // only to S, so the method set of struct{S} is unwanted, + // so set 'skip' flag during recursion. + r.addRuntimeType(t.Underlying(), true) + + case *types.Array: + r.addRuntimeType(t.Elem(), false) + + case *types.Struct: + for i, n := 0, t.NumFields(); i < n; i++ { + r.addRuntimeType(t.Field(i).Type(), false) + } + + case *types.Tuple: + for i, n := 0, t.Len(); i < n; i++ { + r.addRuntimeType(t.At(i).Type(), false) + } + + default: + panic(T) + } +} diff --git a/vendor/golang.org/x/tools/go/callgraph/rta/rta14.go b/vendor/golang.org/x/tools/go/callgraph/rta/rta14.go new file mode 100644 index 0000000000..33956ad02f --- /dev/null +++ b/vendor/golang.org/x/tools/go/callgraph/rta/rta14.go @@ -0,0 +1,461 @@ +// Copyright 2013 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.5 + +// This package provides Rapid Type Analysis (RTA) for Go, a fast +// algorithm for call graph construction and discovery of reachable code +// (and hence dead code) and runtime types. The algorithm was first +// described in: +// +// David F. Bacon and Peter F. Sweeney. 1996. +// Fast static analysis of C++ virtual function calls. (OOPSLA '96) +// http://doi.acm.org/10.1145/236337.236371 +// +// The algorithm uses dynamic programming to tabulate the cross-product +// of the set of known "address taken" functions with the set of known +// dynamic calls of the same type. As each new address-taken function +// is discovered, call graph edges are added from each known callsite, +// and as each new call site is discovered, call graph edges are added +// from it to each known address-taken function. +// +// A similar approach is used for dynamic calls via interfaces: it +// tabulates the cross-product of the set of known "runtime types", +// i.e. types that may appear in an interface value, or be derived from +// one via reflection, with the set of known "invoke"-mode dynamic +// calls. As each new "runtime type" is discovered, call edges are +// added from the known call sites, and as each new call site is +// discovered, call graph edges are added to each compatible +// method. +// +// In addition, we must consider all exported methods of any runtime type +// as reachable, since they may be called via reflection. +// +// Each time a newly added call edge causes a new function to become +// reachable, the code of that function is analyzed for more call sites, +// address-taken functions, and runtime types. The process continues +// until a fixed point is achieved. +// +// The resulting call graph is less precise than one produced by pointer +// analysis, but the algorithm is much faster. For example, running the +// cmd/callgraph tool on its own source takes ~2.1s for RTA and ~5.4s +// for points-to analysis. +// +package rta // import "golang.org/x/tools/go/callgraph/rta" + +// TODO(adonovan): test it by connecting it to the interpreter and +// replacing all "unreachable" functions by a special intrinsic, and +// ensure that that intrinsic is never called. + +import ( + "fmt" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types" + "golang.org/x/tools/go/types/typeutil" +) + +// A Result holds the results of Rapid Type Analysis, which includes the +// set of reachable functions/methods, runtime types, and the call graph. +// +type Result struct { + // CallGraph is the discovered callgraph. + // It does not include edges for calls made via reflection. + CallGraph *callgraph.Graph + + // Reachable contains the set of reachable functions and methods. + // This includes exported methods of runtime types, since + // they may be accessed via reflection. + // The value indicates whether the function is address-taken. + // + // (We wrap the bool in a struct to avoid inadvertent use of + // "if Reachable[f] {" to test for set membership.) + Reachable map[*ssa.Function]struct{ AddrTaken bool } + + // RuntimeTypes contains the set of types that are needed at + // runtime, for interfaces or reflection. + // + // The value indicates whether the type is inaccessible to reflection. + // Consider: + // type A struct{B} + // fmt.Println(new(A)) + // Types *A, A and B are accessible to reflection, but the unnamed + // type struct{B} is not. + RuntimeTypes typeutil.Map +} + +// Working state of the RTA algorithm. +type rta struct { + result *Result + + prog *ssa.Program + + worklist []*ssa.Function // list of functions to visit + + // addrTakenFuncsBySig contains all address-taken *Functions, grouped by signature. + // Keys are *types.Signature, values are map[*ssa.Function]bool sets. + addrTakenFuncsBySig typeutil.Map + + // dynCallSites contains all dynamic "call"-mode call sites, grouped by signature. + // Keys are *types.Signature, values are unordered []ssa.CallInstruction. + dynCallSites typeutil.Map + + // invokeSites contains all "invoke"-mode call sites, grouped by interface. + // Keys are *types.Interface (never *types.Named), + // Values are unordered []ssa.CallInstruction sets. + invokeSites typeutil.Map + + // The following two maps together define the subset of the + // m:n "implements" relation needed by the algorithm. + + // concreteTypes maps each concrete type to the set of interfaces that it implements. + // Keys are types.Type, values are unordered []*types.Interface. + // Only concrete types used as MakeInterface operands are included. + concreteTypes typeutil.Map + + // interfaceTypes maps each interface type to + // the set of concrete types that implement it. + // Keys are *types.Interface, values are unordered []types.Type. + // Only interfaces used in "invoke"-mode CallInstructions are included. + interfaceTypes typeutil.Map +} + +// addReachable marks a function as potentially callable at run-time, +// and ensures that it gets processed. +func (r *rta) addReachable(f *ssa.Function, addrTaken bool) { + reachable := r.result.Reachable + n := len(reachable) + v := reachable[f] + if addrTaken { + v.AddrTaken = true + } + reachable[f] = v + if len(reachable) > n { + // First time seeing f. Add it to the worklist. + r.worklist = append(r.worklist, f) + } +} + +// addEdge adds the specified call graph edge, and marks it reachable. +// addrTaken indicates whether to mark the callee as "address-taken". +func (r *rta) addEdge(site ssa.CallInstruction, callee *ssa.Function, addrTaken bool) { + r.addReachable(callee, addrTaken) + + if g := r.result.CallGraph; g != nil { + if site.Parent() == nil { + panic(site) + } + from := g.CreateNode(site.Parent()) + to := g.CreateNode(callee) + callgraph.AddEdge(from, site, to) + } +} + +// ---------- addrTakenFuncs × dynCallSites ---------- + +// visitAddrTakenFunc is called each time we encounter an address-taken function f. +func (r *rta) visitAddrTakenFunc(f *ssa.Function) { + // Create two-level map (Signature -> Function -> bool). + S := f.Signature + funcs, _ := r.addrTakenFuncsBySig.At(S).(map[*ssa.Function]bool) + if funcs == nil { + funcs = make(map[*ssa.Function]bool) + r.addrTakenFuncsBySig.Set(S, funcs) + } + if !funcs[f] { + // First time seeing f. + funcs[f] = true + + // If we've seen any dyncalls of this type, mark it reachable, + // and add call graph edges. + sites, _ := r.dynCallSites.At(S).([]ssa.CallInstruction) + for _, site := range sites { + r.addEdge(site, f, true) + } + } +} + +// visitDynCall is called each time we encounter a dynamic "call"-mode call. +func (r *rta) visitDynCall(site ssa.CallInstruction) { + S := site.Common().Signature() + + // Record the call site. + sites, _ := r.dynCallSites.At(S).([]ssa.CallInstruction) + r.dynCallSites.Set(S, append(sites, site)) + + // For each function of signature S that we know is address-taken, + // mark it reachable. We'll add the callgraph edges later. + funcs, _ := r.addrTakenFuncsBySig.At(S).(map[*ssa.Function]bool) + for g := range funcs { + r.addEdge(site, g, true) + } +} + +// ---------- concrete types × invoke sites ---------- + +// addInvokeEdge is called for each new pair (site, C) in the matrix. +func (r *rta) addInvokeEdge(site ssa.CallInstruction, C types.Type) { + // Ascertain the concrete method of C to be called. + imethod := site.Common().Method + cmethod := r.prog.MethodValue(r.prog.MethodSets.MethodSet(C).Lookup(imethod.Pkg(), imethod.Name())) + r.addEdge(site, cmethod, true) +} + +// visitInvoke is called each time the algorithm encounters an "invoke"-mode call. +func (r *rta) visitInvoke(site ssa.CallInstruction) { + I := site.Common().Value.Type().Underlying().(*types.Interface) + + // Record the invoke site. + sites, _ := r.invokeSites.At(I).([]ssa.CallInstruction) + r.invokeSites.Set(I, append(sites, site)) + + // Add callgraph edge for each existing + // address-taken concrete type implementing I. + for _, C := range r.implementations(I) { + r.addInvokeEdge(site, C) + } +} + +// ---------- main algorithm ---------- + +// visitFunc processes function f. +func (r *rta) visitFunc(f *ssa.Function) { + var space [32]*ssa.Value // preallocate space for common case + + for _, b := range f.Blocks { + for _, instr := range b.Instrs { + rands := instr.Operands(space[:0]) + + switch instr := instr.(type) { + case ssa.CallInstruction: + call := instr.Common() + if call.IsInvoke() { + r.visitInvoke(instr) + } else if g := call.StaticCallee(); g != nil { + r.addEdge(instr, g, false) + } else if _, ok := call.Value.(*ssa.Builtin); !ok { + r.visitDynCall(instr) + } + + // Ignore the call-position operand when + // looking for address-taken Functions. + // Hack: assume this is rands[0]. + rands = rands[1:] + + case *ssa.MakeInterface: + r.addRuntimeType(instr.X.Type(), false) + } + + // Process all address-taken functions. + for _, op := range rands { + if g, ok := (*op).(*ssa.Function); ok { + r.visitAddrTakenFunc(g) + } + } + } + } +} + +// Analyze performs Rapid Type Analysis, starting at the specified root +// functions. It returns nil if no roots were specified. +// +// If buildCallGraph is true, Result.CallGraph will contain a call +// graph; otherwise, only the other fields (reachable functions) are +// populated. +// +func Analyze(roots []*ssa.Function, buildCallGraph bool) *Result { + if len(roots) == 0 { + return nil + } + + r := &rta{ + result: &Result{Reachable: make(map[*ssa.Function]struct{ AddrTaken bool })}, + prog: roots[0].Prog, + } + + if buildCallGraph { + // TODO(adonovan): change callgraph API to eliminate the + // notion of a distinguished root node. Some callgraphs + // have many roots, or none. + r.result.CallGraph = callgraph.New(roots[0]) + } + + hasher := typeutil.MakeHasher() + r.result.RuntimeTypes.SetHasher(hasher) + r.addrTakenFuncsBySig.SetHasher(hasher) + r.dynCallSites.SetHasher(hasher) + r.invokeSites.SetHasher(hasher) + r.concreteTypes.SetHasher(hasher) + r.interfaceTypes.SetHasher(hasher) + + // Visit functions, processing their instructions, and adding + // new functions to the worklist, until a fixed point is + // reached. + var shadow []*ssa.Function // for efficiency, we double-buffer the worklist + r.worklist = append(r.worklist, roots...) + for len(r.worklist) > 0 { + shadow, r.worklist = r.worklist, shadow[:0] + for _, f := range shadow { + r.visitFunc(f) + } + } + return r.result +} + +// interfaces(C) returns all currently known interfaces implemented by C. +func (r *rta) interfaces(C types.Type) []*types.Interface { + // Ascertain set of interfaces C implements + // and update 'implements' relation. + var ifaces []*types.Interface + r.interfaceTypes.Iterate(func(I types.Type, concs interface{}) { + if I := I.(*types.Interface); types.Implements(C, I) { + concs, _ := concs.([]types.Type) + r.interfaceTypes.Set(I, append(concs, C)) + ifaces = append(ifaces, I) + } + }) + r.concreteTypes.Set(C, ifaces) + return ifaces +} + +// implementations(I) returns all currently known concrete types that implement I. +func (r *rta) implementations(I *types.Interface) []types.Type { + var concs []types.Type + if v := r.interfaceTypes.At(I); v != nil { + concs = v.([]types.Type) + } else { + // First time seeing this interface. + // Update the 'implements' relation. + r.concreteTypes.Iterate(func(C types.Type, ifaces interface{}) { + if types.Implements(C, I) { + ifaces, _ := ifaces.([]*types.Interface) + r.concreteTypes.Set(C, append(ifaces, I)) + concs = append(concs, C) + } + }) + r.interfaceTypes.Set(I, concs) + } + return concs +} + +// addRuntimeType is called for each concrete type that can be the +// dynamic type of some interface or reflect.Value. +// Adapted from needMethods in go/ssa/builder.go +// +func (r *rta) addRuntimeType(T types.Type, skip bool) { + if prev, ok := r.result.RuntimeTypes.At(T).(bool); ok { + if skip && !prev { + r.result.RuntimeTypes.Set(T, skip) + } + return + } + r.result.RuntimeTypes.Set(T, skip) + + mset := r.prog.MethodSets.MethodSet(T) + + if _, ok := T.Underlying().(*types.Interface); !ok { + // T is a new concrete type. + for i, n := 0, mset.Len(); i < n; i++ { + sel := mset.At(i) + m := sel.Obj() + + if m.Exported() { + // Exported methods are always potentially callable via reflection. + r.addReachable(r.prog.MethodValue(sel), true) + } + } + + // Add callgraph edge for each existing dynamic + // "invoke"-mode call via that interface. + for _, I := range r.interfaces(T) { + sites, _ := r.invokeSites.At(I).([]ssa.CallInstruction) + for _, site := range sites { + r.addInvokeEdge(site, T) + } + } + } + + // Precondition: T is not a method signature (*Signature with Recv()!=nil). + // Recursive case: skip => don't call makeMethods(T). + // Each package maintains its own set of types it has visited. + + var n *types.Named + switch T := T.(type) { + case *types.Named: + n = T + case *types.Pointer: + n, _ = T.Elem().(*types.Named) + } + if n != nil { + owner := n.Obj().Pkg() + if owner == nil { + return // built-in error type + } + } + + // Recursion over signatures of each exported method. + for i := 0; i < mset.Len(); i++ { + if mset.At(i).Obj().Exported() { + sig := mset.At(i).Type().(*types.Signature) + r.addRuntimeType(sig.Params(), true) // skip the Tuple itself + r.addRuntimeType(sig.Results(), true) // skip the Tuple itself + } + } + + switch t := T.(type) { + case *types.Basic: + // nop + + case *types.Interface: + // nop---handled by recursion over method set. + + case *types.Pointer: + r.addRuntimeType(t.Elem(), false) + + case *types.Slice: + r.addRuntimeType(t.Elem(), false) + + case *types.Chan: + r.addRuntimeType(t.Elem(), false) + + case *types.Map: + r.addRuntimeType(t.Key(), false) + r.addRuntimeType(t.Elem(), false) + + case *types.Signature: + if t.Recv() != nil { + panic(fmt.Sprintf("Signature %s has Recv %s", t, t.Recv())) + } + r.addRuntimeType(t.Params(), true) // skip the Tuple itself + r.addRuntimeType(t.Results(), true) // skip the Tuple itself + + case *types.Named: + // A pointer-to-named type can be derived from a named + // type via reflection. It may have methods too. + r.addRuntimeType(types.NewPointer(T), false) + + // Consider 'type T struct{S}' where S has methods. + // Reflection provides no way to get from T to struct{S}, + // only to S, so the method set of struct{S} is unwanted, + // so set 'skip' flag during recursion. + r.addRuntimeType(t.Underlying(), true) + + case *types.Array: + r.addRuntimeType(t.Elem(), false) + + case *types.Struct: + for i, n := 0, t.NumFields(); i < n; i++ { + r.addRuntimeType(t.Field(i).Type(), false) + } + + case *types.Tuple: + for i, n := 0, t.Len(); i < n; i++ { + r.addRuntimeType(t.At(i).Type(), false) + } + + default: + panic(T) + } +} diff --git a/vendor/golang.org/x/tools/go/callgraph/rta/rta14_test.go b/vendor/golang.org/x/tools/go/callgraph/rta/rta14_test.go new file mode 100644 index 0000000000..fd0c71d1fd --- /dev/null +++ b/vendor/golang.org/x/tools/go/callgraph/rta/rta14_test.go @@ -0,0 +1,141 @@ +// 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 !go1.5 + +// No testdata on Android. + +// +build !android + +package rta_test + +import ( + "bytes" + "fmt" + "go/ast" + "go/parser" + "go/token" + "io/ioutil" + "sort" + "strings" + "testing" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/callgraph/rta" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/go/types" +) + +var inputs = []string{ + "testdata/func.go", + "testdata/rtype.go", + "testdata/iface.go", +} + +func expectation(f *ast.File) (string, token.Pos) { + for _, c := range f.Comments { + text := strings.TrimSpace(c.Text()) + if t := strings.TrimPrefix(text, "WANT:\n"); t != text { + return t, c.Pos() + } + } + return "", token.NoPos +} + +// TestRTA runs RTA on each file in inputs, prints the results, and +// compares it with the golden results embedded in the WANT comment at +// the end of the file. +// +// The results string consists of two parts: the set of dynamic call +// edges, "f --> g", one per line, and the set of reachable functions, +// one per line. Each set is sorted. +// +func TestRTA(t *testing.T) { + for _, filename := range inputs { + content, err := ioutil.ReadFile(filename) + if err != nil { + t.Errorf("couldn't read file '%s': %s", filename, err) + continue + } + + conf := loader.Config{ + ParserMode: parser.ParseComments, + } + f, err := conf.ParseFile(filename, content) + if err != nil { + t.Error(err) + continue + } + + want, pos := expectation(f) + if pos == token.NoPos { + t.Errorf("No WANT: comment in %s", filename) + continue + } + + conf.CreateFromFiles("main", f) + iprog, err := conf.Load() + if err != nil { + t.Error(err) + continue + } + + prog := ssautil.CreateProgram(iprog, 0) + mainPkg := prog.Package(iprog.Created[0].Pkg) + prog.Build() + + res := rta.Analyze([]*ssa.Function{ + mainPkg.Func("main"), + mainPkg.Func("init"), + }, true) + + if got := printResult(res, mainPkg.Pkg); got != want { + t.Errorf("%s: got:\n%s\nwant:\n%s", + prog.Fset.Position(pos), got, want) + } + } +} + +func printResult(res *rta.Result, from *types.Package) string { + var buf bytes.Buffer + + writeSorted := func(ss []string) { + sort.Strings(ss) + for _, s := range ss { + fmt.Fprintf(&buf, " %s\n", s) + } + } + + buf.WriteString("Dynamic calls\n") + var edges []string + callgraph.GraphVisitEdges(res.CallGraph, func(e *callgraph.Edge) error { + if strings.Contains(e.Description(), "dynamic") { + edges = append(edges, fmt.Sprintf("%s --> %s", + e.Caller.Func.RelString(from), + e.Callee.Func.RelString(from))) + } + return nil + }) + writeSorted(edges) + + buf.WriteString("Reachable functions\n") + var reachable []string + for f := range res.Reachable { + reachable = append(reachable, f.RelString(from)) + } + writeSorted(reachable) + + buf.WriteString("Reflect types\n") + var rtypes []string + res.RuntimeTypes.Iterate(func(key types.Type, value interface{}) { + if value == false { // accessible to reflection + rtypes = append(rtypes, types.TypeString(key, types.RelativeTo(from))) + } + }) + writeSorted(rtypes) + + return strings.TrimSpace(buf.String()) +} diff --git a/vendor/golang.org/x/tools/go/callgraph/rta/rta_test.go b/vendor/golang.org/x/tools/go/callgraph/rta/rta_test.go new file mode 100644 index 0000000000..50465212df --- /dev/null +++ b/vendor/golang.org/x/tools/go/callgraph/rta/rta_test.go @@ -0,0 +1,141 @@ +// 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 go1.5 + +// No testdata on Android. + +// +build !android + +package rta_test + +import ( + "bytes" + "fmt" + "go/ast" + "go/parser" + "go/token" + "go/types" + "io/ioutil" + "sort" + "strings" + "testing" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/callgraph/rta" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +var inputs = []string{ + "testdata/func.go", + "testdata/rtype.go", + "testdata/iface.go", +} + +func expectation(f *ast.File) (string, token.Pos) { + for _, c := range f.Comments { + text := strings.TrimSpace(c.Text()) + if t := strings.TrimPrefix(text, "WANT:\n"); t != text { + return t, c.Pos() + } + } + return "", token.NoPos +} + +// TestRTA runs RTA on each file in inputs, prints the results, and +// compares it with the golden results embedded in the WANT comment at +// the end of the file. +// +// The results string consists of two parts: the set of dynamic call +// edges, "f --> g", one per line, and the set of reachable functions, +// one per line. Each set is sorted. +// +func TestRTA(t *testing.T) { + for _, filename := range inputs { + content, err := ioutil.ReadFile(filename) + if err != nil { + t.Errorf("couldn't read file '%s': %s", filename, err) + continue + } + + conf := loader.Config{ + ParserMode: parser.ParseComments, + } + f, err := conf.ParseFile(filename, content) + if err != nil { + t.Error(err) + continue + } + + want, pos := expectation(f) + if pos == token.NoPos { + t.Errorf("No WANT: comment in %s", filename) + continue + } + + conf.CreateFromFiles("main", f) + iprog, err := conf.Load() + if err != nil { + t.Error(err) + continue + } + + prog := ssautil.CreateProgram(iprog, 0) + mainPkg := prog.Package(iprog.Created[0].Pkg) + prog.Build() + + res := rta.Analyze([]*ssa.Function{ + mainPkg.Func("main"), + mainPkg.Func("init"), + }, true) + + if got := printResult(res, mainPkg.Pkg); got != want { + t.Errorf("%s: got:\n%s\nwant:\n%s", + prog.Fset.Position(pos), got, want) + } + } +} + +func printResult(res *rta.Result, from *types.Package) string { + var buf bytes.Buffer + + writeSorted := func(ss []string) { + sort.Strings(ss) + for _, s := range ss { + fmt.Fprintf(&buf, " %s\n", s) + } + } + + buf.WriteString("Dynamic calls\n") + var edges []string + callgraph.GraphVisitEdges(res.CallGraph, func(e *callgraph.Edge) error { + if strings.Contains(e.Description(), "dynamic") { + edges = append(edges, fmt.Sprintf("%s --> %s", + e.Caller.Func.RelString(from), + e.Callee.Func.RelString(from))) + } + return nil + }) + writeSorted(edges) + + buf.WriteString("Reachable functions\n") + var reachable []string + for f := range res.Reachable { + reachable = append(reachable, f.RelString(from)) + } + writeSorted(reachable) + + buf.WriteString("Reflect types\n") + var rtypes []string + res.RuntimeTypes.Iterate(func(key types.Type, value interface{}) { + if value == false { // accessible to reflection + rtypes = append(rtypes, types.TypeString(key, types.RelativeTo(from))) + } + }) + writeSorted(rtypes) + + return strings.TrimSpace(buf.String()) +} diff --git a/vendor/golang.org/x/tools/go/callgraph/rta/testdata/func.go b/vendor/golang.org/x/tools/go/callgraph/rta/testdata/func.go new file mode 100644 index 0000000000..968c73d80e --- /dev/null +++ b/vendor/golang.org/x/tools/go/callgraph/rta/testdata/func.go @@ -0,0 +1,37 @@ +//+build ignore + +package main + +// Test of dynamic function calls. +// No interfaces, so no runtime/reflect types. + +func A1() { + A2(0) +} + +func A2(int) {} // not address-taken + +func B() {} // unreachable + +var ( + C = func(int) {} + D = func(int) {} +) + +func main() { + A1() + + pfn := C + pfn(0) // calls C and D but not A2 (same sig but not address-taken) +} + +// WANT: +// Dynamic calls +// main --> init$1 +// main --> init$2 +// Reachable functions +// A1 +// A2 +// init$1 +// init$2 +// Reflect types diff --git a/vendor/golang.org/x/tools/go/callgraph/rta/testdata/iface.go b/vendor/golang.org/x/tools/go/callgraph/rta/testdata/iface.go new file mode 100644 index 0000000000..c3ee57049f --- /dev/null +++ b/vendor/golang.org/x/tools/go/callgraph/rta/testdata/iface.go @@ -0,0 +1,79 @@ +//+build ignore + +package main + +// Test of interface calls. + +func use(interface{}) + +type A byte // instantiated but not a reflect type + +func (A) f() {} // called directly +func (A) F() {} // unreachable + +type B int // a reflect type + +func (*B) f() {} // reachable via interface invoke +func (*B) F() {} // reachable: exported method of reflect type + +type B2 int // a reflect type, and *B2 also + +func (B2) f() {} // reachable via interface invoke +func (B2) g() {} // reachable: exported method of reflect type + +type C string // not instantiated + +func (C) f() {} // unreachable +func (C) F() {} // unreachable + +type D uint // instantiated only in dead code + +func (D) f() {} // unreachable +func (D) F() {} // unreachable + +func main() { + A(0).f() + + use(new(B)) + use(B2(0)) + + var i interface { + f() + } + i.f() // calls (*B).f, (*B2).f and (B2.f) + + live() +} + +func live() { + var j interface { + f() + g() + } + j.f() // calls (B2).f and (*B2).f but not (*B).f (no g method). +} + +func dead() { + use(D(0)) +} + +// WANT: +// Dynamic calls +// live --> (*B2).f +// live --> (B2).f +// main --> (*B).f +// main --> (*B2).f +// main --> (B2).f +// Reachable functions +// (*B).F +// (*B).f +// (*B2).f +// (A).f +// (B2).f +// live +// use +// Reflect types +// *B +// *B2 +// B +// B2 diff --git a/vendor/golang.org/x/tools/go/callgraph/rta/testdata/rtype.go b/vendor/golang.org/x/tools/go/callgraph/rta/testdata/rtype.go new file mode 100644 index 0000000000..85414e5530 --- /dev/null +++ b/vendor/golang.org/x/tools/go/callgraph/rta/testdata/rtype.go @@ -0,0 +1,35 @@ +//+build ignore + +package main + +// Test of runtime types (types for which descriptors are needed). + +func use(interface{}) + +type A byte // neither A nor byte are runtime types + +type B struct{ x uint } // B and uint are runtime types, but not the struct + +func main() { + var x int // not a runtime type + print(x) + + var y string // runtime type due to interface conversion + use(y) + + use(struct{ uint64 }{}) // struct is a runtime type + + use(new(B)) // *B is a runtime type +} + +// WANT: +// Dynamic calls +// Reachable functions +// use +// Reflect types +// *B +// B +// string +// struct{uint64} +// uint +// uint64 diff --git a/vendor/golang.org/x/tools/go/callgraph/static/static.go b/vendor/golang.org/x/tools/go/callgraph/static/static.go new file mode 100644 index 0000000000..709bb7b6bd --- /dev/null +++ b/vendor/golang.org/x/tools/go/callgraph/static/static.go @@ -0,0 +1,35 @@ +// Package static computes the call graph of a Go program containing +// only static call edges. +package static // import "golang.org/x/tools/go/callgraph/static" + +import ( + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +// CallGraph computes the call graph of the specified program +// considering only static calls. +// +func CallGraph(prog *ssa.Program) *callgraph.Graph { + cg := callgraph.New(nil) // TODO(adonovan) eliminate concept of rooted callgraph + + // TODO(adonovan): opt: use only a single pass over the ssa.Program. + // TODO(adonovan): opt: this is slower than RTA (perhaps because + // the lower precision means so many edges are allocated)! + for f := range ssautil.AllFunctions(prog) { + fnode := cg.CreateNode(f) + for _, b := range f.Blocks { + for _, instr := range b.Instrs { + if site, ok := instr.(ssa.CallInstruction); ok { + if g := site.Common().StaticCallee(); g != nil { + gnode := cg.CreateNode(g) + callgraph.AddEdge(fnode, site, gnode) + } + } + } + } + } + + return cg +} diff --git a/vendor/golang.org/x/tools/go/callgraph/static/static_test.go b/vendor/golang.org/x/tools/go/callgraph/static/static_test.go new file mode 100644 index 0000000000..e1bfcd7075 --- /dev/null +++ b/vendor/golang.org/x/tools/go/callgraph/static/static_test.go @@ -0,0 +1,88 @@ +// 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 static_test + +import ( + "fmt" + "go/parser" + "reflect" + "sort" + "testing" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/callgraph/static" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa/ssautil" +) + +const input = `package P + +type C int +func (C) f() + +type I interface{f()} + +func f() { + p := func() {} + g() + p() // SSA constant propagation => static + + if unknown { + p = h + } + p() // dynamic + + C(0).f() +} + +func g() { + var i I = C(0) + i.f() +} + +func h() + +var unknown bool +` + +func TestStatic(t *testing.T) { + conf := loader.Config{ParserMode: parser.ParseComments} + f, err := conf.ParseFile("P.go", input) + if err != nil { + t.Fatal(err) + } + + conf.CreateFromFiles("P", f) + iprog, err := conf.Load() + if err != nil { + t.Fatal(err) + } + + P := iprog.Created[0].Pkg + + prog := ssautil.CreateProgram(iprog, 0) + prog.Build() + + cg := static.CallGraph(prog) + + var edges []string + callgraph.GraphVisitEdges(cg, func(e *callgraph.Edge) error { + edges = append(edges, fmt.Sprintf("%s -> %s", + e.Caller.Func.RelString(P), + e.Callee.Func.RelString(P))) + return nil + }) + sort.Strings(edges) + + want := []string{ + "(*C).f -> (C).f", + "f -> (C).f", + "f -> f$1", + "f -> g", + } + if !reflect.DeepEqual(edges, want) { + t.Errorf("Got edges %v, want %v", edges, want) + } +} diff --git a/vendor/golang.org/x/tools/go/callgraph/util.go b/vendor/golang.org/x/tools/go/callgraph/util.go new file mode 100644 index 0000000000..a8f89031c0 --- /dev/null +++ b/vendor/golang.org/x/tools/go/callgraph/util.go @@ -0,0 +1,181 @@ +// Copyright 2013 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 callgraph + +import "golang.org/x/tools/go/ssa" + +// This file provides various utilities over call graphs, such as +// visitation and path search. + +// CalleesOf returns a new set containing all direct callees of the +// caller node. +// +func CalleesOf(caller *Node) map[*Node]bool { + callees := make(map[*Node]bool) + for _, e := range caller.Out { + callees[e.Callee] = true + } + return callees +} + +// GraphVisitEdges visits all the edges in graph g in depth-first order. +// The edge function is called for each edge in postorder. If it +// returns non-nil, visitation stops and GraphVisitEdges returns that +// value. +// +func GraphVisitEdges(g *Graph, edge func(*Edge) error) error { + seen := make(map[*Node]bool) + var visit func(n *Node) error + visit = func(n *Node) error { + if !seen[n] { + seen[n] = true + for _, e := range n.Out { + if err := visit(e.Callee); err != nil { + return err + } + if err := edge(e); err != nil { + return err + } + } + } + return nil + } + for _, n := range g.Nodes { + if err := visit(n); err != nil { + return err + } + } + return nil +} + +// PathSearch finds an arbitrary path starting at node start and +// ending at some node for which isEnd() returns true. On success, +// PathSearch returns the path as an ordered list of edges; on +// failure, it returns nil. +// +func PathSearch(start *Node, isEnd func(*Node) bool) []*Edge { + stack := make([]*Edge, 0, 32) + seen := make(map[*Node]bool) + var search func(n *Node) []*Edge + search = func(n *Node) []*Edge { + if !seen[n] { + seen[n] = true + if isEnd(n) { + return stack + } + for _, e := range n.Out { + stack = append(stack, e) // push + if found := search(e.Callee); found != nil { + return found + } + stack = stack[:len(stack)-1] // pop + } + } + return nil + } + return search(start) +} + +// DeleteSyntheticNodes removes from call graph g all nodes for +// synthetic functions (except g.Root and package initializers), +// preserving the topology. In effect, calls to synthetic wrappers +// are "inlined". +// +func (g *Graph) DeleteSyntheticNodes() { + // Measurements on the standard library and go.tools show that + // resulting graph has ~15% fewer nodes and 4-8% fewer edges + // than the input. + // + // Inlining a wrapper of in-degree m, out-degree n adds m*n + // and removes m+n edges. Since most wrappers are monomorphic + // (n=1) this results in a slight reduction. Polymorphic + // wrappers (n>1), e.g. from embedding an interface value + // inside a struct to satisfy some interface, cause an + // increase in the graph, but they seem to be uncommon. + + // Hash all existing edges to avoid creating duplicates. + edges := make(map[Edge]bool) + for _, cgn := range g.Nodes { + for _, e := range cgn.Out { + edges[*e] = true + } + } + for fn, cgn := range g.Nodes { + if cgn == g.Root || fn.Synthetic == "" || isInit(cgn.Func) { + continue // keep + } + for _, eIn := range cgn.In { + for _, eOut := range cgn.Out { + newEdge := Edge{eIn.Caller, eIn.Site, eOut.Callee} + if edges[newEdge] { + continue // don't add duplicate + } + AddEdge(eIn.Caller, eIn.Site, eOut.Callee) + edges[newEdge] = true + } + } + g.DeleteNode(cgn) + } +} + +func isInit(fn *ssa.Function) bool { + return fn.Pkg != nil && fn.Pkg.Func("init") == fn +} + +// DeleteNode removes node n and its edges from the graph g. +// (NB: not efficient for batch deletion.) +func (g *Graph) DeleteNode(n *Node) { + n.deleteIns() + n.deleteOuts() + delete(g.Nodes, n.Func) +} + +// deleteIns deletes all incoming edges to n. +func (n *Node) deleteIns() { + for _, e := range n.In { + removeOutEdge(e) + } + n.In = nil +} + +// deleteOuts deletes all outgoing edges from n. +func (n *Node) deleteOuts() { + for _, e := range n.Out { + removeInEdge(e) + } + n.Out = nil +} + +// removeOutEdge removes edge.Caller's outgoing edge 'edge'. +func removeOutEdge(edge *Edge) { + caller := edge.Caller + n := len(caller.Out) + for i, e := range caller.Out { + if e == edge { + // Replace it with the final element and shrink the slice. + caller.Out[i] = caller.Out[n-1] + caller.Out[n-1] = nil // aid GC + caller.Out = caller.Out[:n-1] + return + } + } + panic("edge not found: " + edge.String()) +} + +// removeInEdge removes edge.Callee's incoming edge 'edge'. +func removeInEdge(edge *Edge) { + caller := edge.Callee + n := len(caller.In) + for i, e := range caller.In { + if e == edge { + // Replace it with the final element and shrink the slice. + caller.In[i] = caller.In[n-1] + caller.In[n-1] = nil // aid GC + caller.In = caller.In[:n-1] + return + } + } + panic("edge not found: " + edge.String()) +} diff --git a/vendor/golang.org/x/tools/go/exact/exact.go b/vendor/golang.org/x/tools/go/exact/exact.go new file mode 100644 index 0000000000..51c490624a --- /dev/null +++ b/vendor/golang.org/x/tools/go/exact/exact.go @@ -0,0 +1,920 @@ +// Copyright 2013 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 exact implements Values representing untyped +// Go constants and the corresponding operations. Values +// and operations have unlimited precision. +// +// A special Unknown value may be used when a value +// is unknown due to an error. Operations on unknown +// values produce unknown values unless specified +// otherwise. +// +package exact // import "golang.org/x/tools/go/exact" + +import ( + "fmt" + "go/token" + "math/big" + "strconv" +) + +// Kind specifies the kind of value represented by a Value. +type Kind int + +// Implementation note: Kinds must be enumerated in +// order of increasing "complexity" (used by match). + +const ( + // unknown values + Unknown Kind = iota + + // non-numeric values + Bool + String + + // numeric values + Int + Float + Complex +) + +// A Value represents a mathematically exact value of a given Kind. +type Value interface { + // Kind returns the value kind; it is always the smallest + // kind in which the value can be represented exactly. + Kind() Kind + + // String returns a human-readable form of the value. + String() string + + // Prevent external implementations. + implementsValue() +} + +// ---------------------------------------------------------------------------- +// Implementations + +type ( + unknownVal struct{} + boolVal bool + stringVal string + int64Val int64 + intVal struct{ val *big.Int } + floatVal struct{ val *big.Rat } + complexVal struct{ re, im *big.Rat } +) + +func (unknownVal) Kind() Kind { return Unknown } +func (boolVal) Kind() Kind { return Bool } +func (stringVal) Kind() Kind { return String } +func (int64Val) Kind() Kind { return Int } +func (intVal) Kind() Kind { return Int } +func (floatVal) Kind() Kind { return Float } +func (complexVal) Kind() Kind { return Complex } + +func (unknownVal) String() string { return "unknown" } +func (x boolVal) String() string { return fmt.Sprintf("%v", bool(x)) } +func (x stringVal) String() string { return strconv.Quote(string(x)) } +func (x int64Val) String() string { return strconv.FormatInt(int64(x), 10) } +func (x intVal) String() string { return x.val.String() } +func (x floatVal) String() string { return x.val.String() } +func (x complexVal) String() string { return fmt.Sprintf("(%s + %si)", x.re, x.im) } + +func (unknownVal) implementsValue() {} +func (boolVal) implementsValue() {} +func (stringVal) implementsValue() {} +func (int64Val) implementsValue() {} +func (intVal) implementsValue() {} +func (floatVal) implementsValue() {} +func (complexVal) implementsValue() {} + +// int64 bounds +var ( + minInt64 = big.NewInt(-1 << 63) + maxInt64 = big.NewInt(1<<63 - 1) +) + +func normInt(x *big.Int) Value { + if minInt64.Cmp(x) <= 0 && x.Cmp(maxInt64) <= 0 { + return int64Val(x.Int64()) + } + return intVal{x} +} + +func normFloat(x *big.Rat) Value { + if x.IsInt() { + return normInt(x.Num()) + } + return floatVal{x} +} + +func normComplex(re, im *big.Rat) Value { + if im.Sign() == 0 { + return normFloat(re) + } + return complexVal{re, im} +} + +// ---------------------------------------------------------------------------- +// Factories + +// MakeUnknown returns the Unknown value. +func MakeUnknown() Value { return unknownVal{} } + +// MakeBool returns the Bool value for x. +func MakeBool(b bool) Value { return boolVal(b) } + +// MakeString returns the String value for x. +func MakeString(s string) Value { return stringVal(s) } + +// MakeInt64 returns the Int value for x. +func MakeInt64(x int64) Value { return int64Val(x) } + +// MakeUint64 returns the Int value for x. +func MakeUint64(x uint64) Value { return normInt(new(big.Int).SetUint64(x)) } + +// MakeFloat64 returns the numeric value for x. +// If x is not finite, the result is unknown. +func MakeFloat64(x float64) Value { + if f := new(big.Rat).SetFloat64(x); f != nil { + return normFloat(f) + } + return unknownVal{} +} + +// MakeFromLiteral returns the corresponding integer, floating-point, +// imaginary, character, or string value for a Go literal string. The +// result is nil if the literal string is invalid. +func MakeFromLiteral(lit string, tok token.Token) Value { + switch tok { + case token.INT: + if x, err := strconv.ParseInt(lit, 0, 64); err == nil { + return int64Val(x) + } + if x, ok := new(big.Int).SetString(lit, 0); ok { + return intVal{x} + } + + case token.FLOAT: + if x, ok := new(big.Rat).SetString(lit); ok { + return normFloat(x) + } + + case token.IMAG: + if n := len(lit); n > 0 && lit[n-1] == 'i' { + if im, ok := new(big.Rat).SetString(lit[0 : n-1]); ok { + return normComplex(big.NewRat(0, 1), im) + } + } + + case token.CHAR: + if n := len(lit); n >= 2 { + if code, _, _, err := strconv.UnquoteChar(lit[1:n-1], '\''); err == nil { + return int64Val(code) + } + } + + case token.STRING: + if s, err := strconv.Unquote(lit); err == nil { + return stringVal(s) + } + } + + return nil +} + +// ---------------------------------------------------------------------------- +// Accessors +// +// For unknown arguments the result is the zero value for the respective +// accessor type, except for Sign, where the result is 1. + +// BoolVal returns the Go boolean value of x, which must be a Bool or an Unknown. +// If x is Unknown, the result is false. +func BoolVal(x Value) bool { + switch x := x.(type) { + case boolVal: + return bool(x) + case unknownVal: + return false + } + panic(fmt.Sprintf("%v not a Bool", x)) +} + +// StringVal returns the Go string value of x, which must be a String or an Unknown. +// If x is Unknown, the result is "". +func StringVal(x Value) string { + switch x := x.(type) { + case stringVal: + return string(x) + case unknownVal: + return "" + } + panic(fmt.Sprintf("%v not a String", x)) +} + +// Int64Val returns the Go int64 value of x and whether the result is exact; +// x must be an Int or an Unknown. If the result is not exact, its value is undefined. +// If x is Unknown, the result is (0, false). +func Int64Val(x Value) (int64, bool) { + switch x := x.(type) { + case int64Val: + return int64(x), true + case intVal: + return x.val.Int64(), x.val.BitLen() <= 63 + case unknownVal: + return 0, false + } + panic(fmt.Sprintf("%v not an Int", x)) +} + +// Uint64Val returns the Go uint64 value of x and whether the result is exact; +// x must be an Int or an Unknown. If the result is not exact, its value is undefined. +// If x is Unknown, the result is (0, false). +func Uint64Val(x Value) (uint64, bool) { + switch x := x.(type) { + case int64Val: + return uint64(x), x >= 0 + case intVal: + return x.val.Uint64(), x.val.Sign() >= 0 && x.val.BitLen() <= 64 + case unknownVal: + return 0, false + } + panic(fmt.Sprintf("%v not an Int", x)) +} + +// Float32Val is like Float64Val but for float32 instead of float64. +func Float32Val(x Value) (float32, bool) { + switch x := x.(type) { + case int64Val: + f := float32(x) + return f, int64Val(f) == x + case intVal: + return ratToFloat32(new(big.Rat).SetFrac(x.val, int1)) + case floatVal: + return ratToFloat32(x.val) + case unknownVal: + return 0, false + } + panic(fmt.Sprintf("%v not a Float", x)) +} + +// Float64Val returns the nearest Go float64 value of x and whether the result is exact; +// x must be numeric but not Complex, or Unknown. For values too small (too close to 0) +// to represent as float64, Float64Val silently underflows to 0. The result sign always +// matches the sign of x, even for 0. +// If x is Unknown, the result is (0, false). +func Float64Val(x Value) (float64, bool) { + switch x := x.(type) { + case int64Val: + f := float64(int64(x)) + return f, int64Val(f) == x + case intVal: + return new(big.Rat).SetFrac(x.val, int1).Float64() + case floatVal: + return x.val.Float64() + case unknownVal: + return 0, false + } + panic(fmt.Sprintf("%v not a Float", x)) +} + +// BitLen returns the number of bits required to represent +// the absolute value x in binary representation; x must be an Int or an Unknown. +// If x is Unknown, the result is 0. +func BitLen(x Value) int { + switch x := x.(type) { + case int64Val: + return new(big.Int).SetInt64(int64(x)).BitLen() + case intVal: + return x.val.BitLen() + case unknownVal: + return 0 + } + panic(fmt.Sprintf("%v not an Int", x)) +} + +// Sign returns -1, 0, or 1 depending on whether x < 0, x == 0, or x > 0; +// x must be numeric or Unknown. For complex values x, the sign is 0 if x == 0, +// otherwise it is != 0. If x is Unknown, the result is 1. +func Sign(x Value) int { + switch x := x.(type) { + case int64Val: + switch { + case x < 0: + return -1 + case x > 0: + return 1 + } + return 0 + case intVal: + return x.val.Sign() + case floatVal: + return x.val.Sign() + case complexVal: + return x.re.Sign() | x.im.Sign() + case unknownVal: + return 1 // avoid spurious division by zero errors + } + panic(fmt.Sprintf("%v not numeric", x)) +} + +// ---------------------------------------------------------------------------- +// Support for serializing/deserializing integers + +const ( + // Compute the size of a Word in bytes. + _m = ^big.Word(0) + _log = _m>>8&1 + _m>>16&1 + _m>>32&1 + wordSize = 1 << _log +) + +// Bytes returns the bytes for the absolute value of x in little- +// endian binary representation; x must be an Int. +func Bytes(x Value) []byte { + var val *big.Int + switch x := x.(type) { + case int64Val: + val = new(big.Int).SetInt64(int64(x)) + case intVal: + val = x.val + default: + panic(fmt.Sprintf("%v not an Int", x)) + } + + words := val.Bits() + bytes := make([]byte, len(words)*wordSize) + + i := 0 + for _, w := range words { + for j := 0; j < wordSize; j++ { + bytes[i] = byte(w) + w >>= 8 + i++ + } + } + // remove leading 0's + for i > 0 && bytes[i-1] == 0 { + i-- + } + + return bytes[:i] +} + +// MakeFromBytes returns the Int value given the bytes of its little-endian +// binary representation. An empty byte slice argument represents 0. +func MakeFromBytes(bytes []byte) Value { + words := make([]big.Word, (len(bytes)+(wordSize-1))/wordSize) + + i := 0 + var w big.Word + var s uint + for _, b := range bytes { + w |= big.Word(b) << s + if s += 8; s == wordSize*8 { + words[i] = w + i++ + w = 0 + s = 0 + } + } + // store last word + if i < len(words) { + words[i] = w + i++ + } + // remove leading 0's + for i > 0 && words[i-1] == 0 { + i-- + } + + return normInt(new(big.Int).SetBits(words[:i])) +} + +// ---------------------------------------------------------------------------- +// Support for disassembling fractions + +// Num returns the numerator of x; x must be Int, Float, or Unknown. +// If x is Unknown, the result is Unknown, otherwise it is an Int +// with the same sign as x. +func Num(x Value) Value { + switch x := x.(type) { + case unknownVal, int64Val, intVal: + return x + case floatVal: + return normInt(x.val.Num()) + } + panic(fmt.Sprintf("%v not Int or Float", x)) +} + +// Denom returns the denominator of x; x must be Int, Float, or Unknown. +// If x is Unknown, the result is Unknown, otherwise it is an Int >= 1. +func Denom(x Value) Value { + switch x := x.(type) { + case unknownVal: + return x + case int64Val, intVal: + return int64Val(1) + case floatVal: + return normInt(x.val.Denom()) + } + panic(fmt.Sprintf("%v not Int or Float", x)) +} + +// ---------------------------------------------------------------------------- +// Support for assembling/disassembling complex numbers + +// MakeImag returns the numeric value x*i (possibly 0); +// x must be Int, Float, or Unknown. +// If x is Unknown, the result is Unknown. +func MakeImag(x Value) Value { + var im *big.Rat + switch x := x.(type) { + case unknownVal: + return x + case int64Val: + im = big.NewRat(int64(x), 1) + case intVal: + im = new(big.Rat).SetFrac(x.val, int1) + case floatVal: + im = x.val + default: + panic(fmt.Sprintf("%v not Int or Float", x)) + } + return normComplex(rat0, im) +} + +// Real returns the real part of x, which must be a numeric or unknown value. +// If x is Unknown, the result is Unknown. +func Real(x Value) Value { + switch x := x.(type) { + case unknownVal, int64Val, intVal, floatVal: + return x + case complexVal: + return normFloat(x.re) + } + panic(fmt.Sprintf("%v not numeric", x)) +} + +// Imag returns the imaginary part of x, which must be a numeric or unknown value. +// If x is Unknown, the result is Unknown. +func Imag(x Value) Value { + switch x := x.(type) { + case unknownVal: + return x + case int64Val, intVal, floatVal: + return int64Val(0) + case complexVal: + return normFloat(x.im) + } + panic(fmt.Sprintf("%v not numeric", x)) +} + +// ---------------------------------------------------------------------------- +// Operations + +// is32bit reports whether x can be represented using 32 bits. +func is32bit(x int64) bool { + const s = 32 + return -1<<(s-1) <= x && x <= 1<<(s-1)-1 +} + +// is63bit reports whether x can be represented using 63 bits. +func is63bit(x int64) bool { + const s = 63 + return -1<<(s-1) <= x && x <= 1<<(s-1)-1 +} + +// UnaryOp returns the result of the unary expression op y. +// The operation must be defined for the operand. +// If size >= 0 it specifies the ^ (xor) result size in bytes. +// If y is Unknown, the result is Unknown. +// +func UnaryOp(op token.Token, y Value, size int) Value { + switch op { + case token.ADD: + switch y.(type) { + case unknownVal, int64Val, intVal, floatVal, complexVal: + return y + } + + case token.SUB: + switch y := y.(type) { + case unknownVal: + return y + case int64Val: + if z := -y; z != y { + return z // no overflow + } + return normInt(new(big.Int).Neg(big.NewInt(int64(y)))) + case intVal: + return normInt(new(big.Int).Neg(y.val)) + case floatVal: + return normFloat(new(big.Rat).Neg(y.val)) + case complexVal: + return normComplex(new(big.Rat).Neg(y.re), new(big.Rat).Neg(y.im)) + } + + case token.XOR: + var z big.Int + switch y := y.(type) { + case unknownVal: + return y + case int64Val: + z.Not(big.NewInt(int64(y))) + case intVal: + z.Not(y.val) + default: + goto Error + } + // For unsigned types, the result will be negative and + // thus "too large": We must limit the result size to + // the type's size. + if size >= 0 { + s := uint(size) * 8 + z.AndNot(&z, new(big.Int).Lsh(big.NewInt(-1), s)) // z &^= (-1)< ord(y) { + y, x = match(y, x) + return x, y + } + // ord(x) <= ord(y) + + switch x := x.(type) { + case unknownVal: + return x, x + + case boolVal, stringVal, complexVal: + return x, y + + case int64Val: + switch y := y.(type) { + case int64Val: + return x, y + case intVal: + return intVal{big.NewInt(int64(x))}, y + case floatVal: + return floatVal{big.NewRat(int64(x), 1)}, y + case complexVal: + return complexVal{big.NewRat(int64(x), 1), rat0}, y + } + + case intVal: + switch y := y.(type) { + case intVal: + return x, y + case floatVal: + return floatVal{new(big.Rat).SetFrac(x.val, int1)}, y + case complexVal: + return complexVal{new(big.Rat).SetFrac(x.val, int1), rat0}, y + } + + case floatVal: + switch y := y.(type) { + case floatVal: + return x, y + case complexVal: + return complexVal{x.val, rat0}, y + } + } + + panic("unreachable") +} + +// BinaryOp returns the result of the binary expression x op y. +// The operation must be defined for the operands. If one of the +// operands is Unknown, the result is Unknown. +// To force integer division of Int operands, use op == token.QUO_ASSIGN +// instead of token.QUO; the result is guaranteed to be Int in this case. +// Division by zero leads to a run-time panic. +// +func BinaryOp(x Value, op token.Token, y Value) Value { + x, y = match(x, y) + + switch x := x.(type) { + case unknownVal: + return x + + case boolVal: + y := y.(boolVal) + switch op { + case token.LAND: + return x && y + case token.LOR: + return x || y + } + + case int64Val: + a := int64(x) + b := int64(y.(int64Val)) + var c int64 + switch op { + case token.ADD: + if !is63bit(a) || !is63bit(b) { + return normInt(new(big.Int).Add(big.NewInt(a), big.NewInt(b))) + } + c = a + b + case token.SUB: + if !is63bit(a) || !is63bit(b) { + return normInt(new(big.Int).Sub(big.NewInt(a), big.NewInt(b))) + } + c = a - b + case token.MUL: + if !is32bit(a) || !is32bit(b) { + return normInt(new(big.Int).Mul(big.NewInt(a), big.NewInt(b))) + } + c = a * b + case token.QUO: + return normFloat(new(big.Rat).SetFrac(big.NewInt(a), big.NewInt(b))) + case token.QUO_ASSIGN: // force integer division + c = a / b + case token.REM: + c = a % b + case token.AND: + c = a & b + case token.OR: + c = a | b + case token.XOR: + c = a ^ b + case token.AND_NOT: + c = a &^ b + default: + goto Error + } + return int64Val(c) + + case intVal: + a := x.val + b := y.(intVal).val + var c big.Int + switch op { + case token.ADD: + c.Add(a, b) + case token.SUB: + c.Sub(a, b) + case token.MUL: + c.Mul(a, b) + case token.QUO: + return normFloat(new(big.Rat).SetFrac(a, b)) + case token.QUO_ASSIGN: // force integer division + c.Quo(a, b) + case token.REM: + c.Rem(a, b) + case token.AND: + c.And(a, b) + case token.OR: + c.Or(a, b) + case token.XOR: + c.Xor(a, b) + case token.AND_NOT: + c.AndNot(a, b) + default: + goto Error + } + return normInt(&c) + + case floatVal: + a := x.val + b := y.(floatVal).val + var c big.Rat + switch op { + case token.ADD: + c.Add(a, b) + case token.SUB: + c.Sub(a, b) + case token.MUL: + c.Mul(a, b) + case token.QUO: + c.Quo(a, b) + default: + goto Error + } + return normFloat(&c) + + case complexVal: + y := y.(complexVal) + a, b := x.re, x.im + c, d := y.re, y.im + var re, im big.Rat + switch op { + case token.ADD: + // (a+c) + i(b+d) + re.Add(a, c) + im.Add(b, d) + case token.SUB: + // (a-c) + i(b-d) + re.Sub(a, c) + im.Sub(b, d) + case token.MUL: + // (ac-bd) + i(bc+ad) + var ac, bd, bc, ad big.Rat + ac.Mul(a, c) + bd.Mul(b, d) + bc.Mul(b, c) + ad.Mul(a, d) + re.Sub(&ac, &bd) + im.Add(&bc, &ad) + case token.QUO: + // (ac+bd)/s + i(bc-ad)/s, with s = cc + dd + var ac, bd, bc, ad, s, cc, dd big.Rat + ac.Mul(a, c) + bd.Mul(b, d) + bc.Mul(b, c) + ad.Mul(a, d) + cc.Mul(c, c) + dd.Mul(d, d) + s.Add(&cc, &dd) + re.Add(&ac, &bd) + re.Quo(&re, &s) + im.Sub(&bc, &ad) + im.Quo(&im, &s) + default: + goto Error + } + return normComplex(&re, &im) + + case stringVal: + if op == token.ADD { + return x + y.(stringVal) + } + } + +Error: + panic(fmt.Sprintf("invalid binary operation %v %s %v", x, op, y)) +} + +// Shift returns the result of the shift expression x op s +// with op == token.SHL or token.SHR (<< or >>). x must be +// an Int or an Unknown. If x is Unknown, the result is x. +// +func Shift(x Value, op token.Token, s uint) Value { + switch x := x.(type) { + case unknownVal: + return x + + case int64Val: + if s == 0 { + return x + } + switch op { + case token.SHL: + z := big.NewInt(int64(x)) + return normInt(z.Lsh(z, s)) + case token.SHR: + return x >> s + } + + case intVal: + if s == 0 { + return x + } + var z big.Int + switch op { + case token.SHL: + return normInt(z.Lsh(x.val, s)) + case token.SHR: + return normInt(z.Rsh(x.val, s)) + } + } + + panic(fmt.Sprintf("invalid shift %v %s %d", x, op, s)) +} + +func cmpZero(x int, op token.Token) bool { + switch op { + case token.EQL: + return x == 0 + case token.NEQ: + return x != 0 + case token.LSS: + return x < 0 + case token.LEQ: + return x <= 0 + case token.GTR: + return x > 0 + case token.GEQ: + return x >= 0 + } + panic("unreachable") +} + +// Compare returns the result of the comparison x op y. +// The comparison must be defined for the operands. +// If one of the operands is Unknown, the result is +// false. +// +func Compare(x Value, op token.Token, y Value) bool { + x, y = match(x, y) + + switch x := x.(type) { + case unknownVal: + return false + + case boolVal: + y := y.(boolVal) + switch op { + case token.EQL: + return x == y + case token.NEQ: + return x != y + } + + case int64Val: + y := y.(int64Val) + switch op { + case token.EQL: + return x == y + case token.NEQ: + return x != y + case token.LSS: + return x < y + case token.LEQ: + return x <= y + case token.GTR: + return x > y + case token.GEQ: + return x >= y + } + + case intVal: + return cmpZero(x.val.Cmp(y.(intVal).val), op) + + case floatVal: + return cmpZero(x.val.Cmp(y.(floatVal).val), op) + + case complexVal: + y := y.(complexVal) + re := x.re.Cmp(y.re) + im := x.im.Cmp(y.im) + switch op { + case token.EQL: + return re == 0 && im == 0 + case token.NEQ: + return re != 0 || im != 0 + } + + case stringVal: + y := y.(stringVal) + switch op { + case token.EQL: + return x == y + case token.NEQ: + return x != y + case token.LSS: + return x < y + case token.LEQ: + return x <= y + case token.GTR: + return x > y + case token.GEQ: + return x >= y + } + } + + panic(fmt.Sprintf("invalid comparison %v %s %v", x, op, y)) +} diff --git a/vendor/golang.org/x/tools/go/exact/exact_test.go b/vendor/golang.org/x/tools/go/exact/exact_test.go new file mode 100644 index 0000000000..aa38a896c6 --- /dev/null +++ b/vendor/golang.org/x/tools/go/exact/exact_test.go @@ -0,0 +1,375 @@ +// Copyright 2013 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 exact + +import ( + "go/token" + "strings" + "testing" +) + +// TODO(gri) expand this test framework + +var opTests = []string{ + // unary operations + `+ 0 = 0`, + `+ ? = ?`, + `- 1 = -1`, + `- ? = ?`, + `^ 0 = -1`, + `^ ? = ?`, + + `! true = false`, + `! false = true`, + `! ? = ?`, + + // etc. + + // binary operations + `"" + "" = ""`, + `"foo" + "" = "foo"`, + `"" + "bar" = "bar"`, + `"foo" + "bar" = "foobar"`, + + `0 + 0 = 0`, + `0 + 0.1 = 0.1`, + `0 + 0.1i = 0.1i`, + `0.1 + 0.9 = 1`, + `1e100 + 1e100 = 2e100`, + `? + 0 = ?`, + `0 + ? = ?`, + + `0 - 0 = 0`, + `0 - 0.1 = -0.1`, + `0 - 0.1i = -0.1i`, + `1e100 - 1e100 = 0`, + `? - 0 = ?`, + `0 - ? = ?`, + + `0 * 0 = 0`, + `1 * 0.1 = 0.1`, + `1 * 0.1i = 0.1i`, + `1i * 1i = -1`, + `? * 0 = ?`, + `0 * ? = ?`, + + `0 / 0 = "division_by_zero"`, + `10 / 2 = 5`, + `5 / 3 = 5/3`, + `5i / 3i = 5/3`, + `? / 0 = ?`, + `0 / ? = ?`, + + `0 % 0 = "runtime_error:_integer_divide_by_zero"`, // TODO(gri) should be the same as for / + `10 % 3 = 1`, + `? % 0 = ?`, + `0 % ? = ?`, + + `0 & 0 = 0`, + `12345 & 0 = 0`, + `0xff & 0xf = 0xf`, + `? & 0 = ?`, + `0 & ? = ?`, + + `0 | 0 = 0`, + `12345 | 0 = 12345`, + `0xb | 0xa0 = 0xab`, + `? | 0 = ?`, + `0 | ? = ?`, + + `0 ^ 0 = 0`, + `1 ^ -1 = -2`, + `? ^ 0 = ?`, + `0 ^ ? = ?`, + + `0 &^ 0 = 0`, + `0xf &^ 1 = 0xe`, + `1 &^ 0xf = 0`, + // etc. + + // shifts + `0 << 0 = 0`, + `1 << 10 = 1024`, + `0 >> 0 = 0`, + `1024 >> 10 == 1`, + `? << 0 == ?`, + `? >> 10 == ?`, + // etc. + + // comparisons + `false == false = true`, + `false == true = false`, + `true == false = false`, + `true == true = true`, + + `false != false = false`, + `false != true = true`, + `true != false = true`, + `true != true = false`, + + `"foo" == "bar" = false`, + `"foo" != "bar" = true`, + `"foo" < "bar" = false`, + `"foo" <= "bar" = false`, + `"foo" > "bar" = true`, + `"foo" >= "bar" = true`, + + `0 == 0 = true`, + `0 != 0 = false`, + `0 < 10 = true`, + `10 <= 10 = true`, + `0 > 10 = false`, + `10 >= 10 = true`, + + `1/123456789 == 1/123456789 == true`, + `1/123456789 != 1/123456789 == false`, + `1/123456789 < 1/123456788 == true`, + `1/123456788 <= 1/123456789 == false`, + `0.11 > 0.11 = false`, + `0.11 >= 0.11 = true`, + + `? == 0 = false`, + `? != 0 = false`, + `? < 10 = false`, + `? <= 10 = false`, + `? > 10 = false`, + `? >= 10 = false`, + + `0 == ? = false`, + `0 != ? = false`, + `0 < ? = false`, + `10 <= ? = false`, + `0 > ? = false`, + `10 >= ? = false`, + + // etc. +} + +func TestOps(t *testing.T) { + for _, test := range opTests { + a := strings.Split(test, " ") + i := 0 // operator index + + var x, x0 Value + switch len(a) { + case 4: + // unary operation + case 5: + // binary operation + x, x0 = val(a[0]), val(a[0]) + i = 1 + default: + t.Errorf("invalid test case: %s", test) + continue + } + + op, ok := optab[a[i]] + if !ok { + panic("missing optab entry for " + a[i]) + } + + y, y0 := val(a[i+1]), val(a[i+1]) + + got := doOp(x, op, y) + want := val(a[i+3]) + if !eql(got, want) { + t.Errorf("%s: got %s; want %s", test, got, want) + } + if x0 != nil && !eql(x, x0) { + t.Errorf("%s: x changed to %s", test, x) + } + if !eql(y, y0) { + t.Errorf("%s: y changed to %s", test, y) + } + } +} + +func eql(x, y Value) bool { + _, ux := x.(unknownVal) + _, uy := y.(unknownVal) + if ux || uy { + return ux == uy + } + return Compare(x, token.EQL, y) +} + +// ---------------------------------------------------------------------------- +// Support functions + +func val(lit string) Value { + if len(lit) == 0 { + return MakeUnknown() + } + + switch lit { + case "?": + return MakeUnknown() + case "true": + return MakeBool(true) + case "false": + return MakeBool(false) + } + + tok := token.INT + switch first, last := lit[0], lit[len(lit)-1]; { + case first == '"' || first == '`': + tok = token.STRING + lit = strings.Replace(lit, "_", " ", -1) + case first == '\'': + tok = token.CHAR + case last == 'i': + tok = token.IMAG + default: + if !strings.HasPrefix(lit, "0x") && strings.ContainsAny(lit, "./Ee") { + tok = token.FLOAT + } + } + + return MakeFromLiteral(lit, tok) +} + +var optab = map[string]token.Token{ + "!": token.NOT, + + "+": token.ADD, + "-": token.SUB, + "*": token.MUL, + "/": token.QUO, + "%": token.REM, + + "<<": token.SHL, + ">>": token.SHR, + + "&": token.AND, + "|": token.OR, + "^": token.XOR, + "&^": token.AND_NOT, + + "==": token.EQL, + "!=": token.NEQ, + "<": token.LSS, + "<=": token.LEQ, + ">": token.GTR, + ">=": token.GEQ, +} + +func panicHandler(v *Value) { + switch p := recover().(type) { + case nil: + // nothing to do + case string: + *v = MakeString(p) + case error: + *v = MakeString(p.Error()) + default: + panic(p) + } +} + +func doOp(x Value, op token.Token, y Value) (z Value) { + defer panicHandler(&z) + + if x == nil { + return UnaryOp(op, y, -1) + } + + switch op { + case token.EQL, token.NEQ, token.LSS, token.LEQ, token.GTR, token.GEQ: + return MakeBool(Compare(x, op, y)) + case token.SHL, token.SHR: + s, _ := Int64Val(y) + return Shift(x, op, uint(s)) + default: + return BinaryOp(x, op, y) + } +} + +// ---------------------------------------------------------------------------- +// Other tests + +var fracTests = []string{ + "0 0 1", + "1 1 1", + "-1 -1 1", + "1.2 6 5", + "-0.991 -991 1000", + "1e100 1e100 1", +} + +func TestFractions(t *testing.T) { + for _, test := range fracTests { + a := strings.Split(test, " ") + if len(a) != 3 { + t.Errorf("invalid test case: %s", test) + continue + } + + x := val(a[0]) + n := val(a[1]) + d := val(a[2]) + + if got := Num(x); !eql(got, n) { + t.Errorf("%s: got num = %s; want %s", test, got, n) + } + + if got := Denom(x); !eql(got, d) { + t.Errorf("%s: got denom = %s; want %s", test, got, d) + } + } +} + +var bytesTests = []string{ + "0", + "1", + "123456789", + "123456789012345678901234567890123456789012345678901234567890", +} + +func TestBytes(t *testing.T) { + for _, test := range bytesTests { + x := val(test) + bytes := Bytes(x) + + // special case 0 + if Sign(x) == 0 && len(bytes) != 0 { + t.Errorf("%s: got %v; want empty byte slice", test, bytes) + } + + if n := len(bytes); n > 0 && bytes[n-1] == 0 { + t.Errorf("%s: got %v; want no leading 0 byte", test, bytes) + } + + if got := MakeFromBytes(bytes); !eql(got, x) { + t.Errorf("%s: got %s; want %s (bytes = %v)", test, got, x, bytes) + } + } +} + +func TestUnknown(t *testing.T) { + u := MakeUnknown() + var values = []Value{ + u, + MakeBool(false), // token.ADD ok below, operation is never considered + MakeString(""), + MakeInt64(1), + MakeFromLiteral("-1234567890123456789012345678901234567890", token.INT), + MakeFloat64(1.2), + MakeImag(MakeFloat64(1.2)), + } + for _, val := range values { + x, y := val, u + for i := range [2]int{} { + if i == 1 { + x, y = y, x + } + if got := BinaryOp(x, token.ADD, y); got.Kind() != Unknown { + t.Errorf("%s + %s: got %s; want %s", x, y, got, u) + } + if got := Compare(x, token.EQL, y); got { + t.Errorf("%s == %s: got true; want false", x, y) + } + } + } +} diff --git a/vendor/golang.org/x/tools/go/exact/go13.go b/vendor/golang.org/x/tools/go/exact/go13.go new file mode 100644 index 0000000000..1016c14150 --- /dev/null +++ b/vendor/golang.org/x/tools/go/exact/go13.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. + +// +build !go1.4 + +package exact + +import ( + "math" + "math/big" +) + +func ratToFloat32(x *big.Rat) (float32, bool) { + // Before 1.4, there's no Rat.Float32. + // Emulate it, albeit at the cost of + // imprecision in corner cases. + x64, exact := x.Float64() + x32 := float32(x64) + if math.IsInf(float64(x32), 0) { + exact = false + } + return x32, exact +} diff --git a/vendor/golang.org/x/tools/go/exact/go14.go b/vendor/golang.org/x/tools/go/exact/go14.go new file mode 100644 index 0000000000..b86e5d2609 --- /dev/null +++ b/vendor/golang.org/x/tools/go/exact/go14.go @@ -0,0 +1,13 @@ +// 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 go1.4 + +package exact + +import "math/big" + +func ratToFloat32(x *big.Rat) (float32, bool) { + return x.Float32() +} diff --git a/vendor/golang.org/x/tools/go/gccgoimporter/gccgoinstallation.go b/vendor/golang.org/x/tools/go/gccgoimporter/gccgoinstallation.go new file mode 100644 index 0000000000..1c56cf5a5b --- /dev/null +++ b/vendor/golang.org/x/tools/go/gccgoimporter/gccgoinstallation.go @@ -0,0 +1,95 @@ +// Copyright 2013 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 gccgoimporter + +import ( + "bufio" + "os" + "os/exec" + "path/filepath" + "strings" + + "golang.org/x/tools/go/types" +) + +// Information about a specific installation of gccgo. +type GccgoInstallation struct { + // Version of gcc (e.g. 4.8.0). + GccVersion string + + // Target triple (e.g. x86_64-unknown-linux-gnu). + TargetTriple string + + // Built-in library paths used by this installation. + LibPaths []string +} + +// Ask the driver at the given path for information for this GccgoInstallation. +func (inst *GccgoInstallation) InitFromDriver(gccgoPath string) (err error) { + cmd := exec.Command(gccgoPath, "-###", "-S", "-x", "go", "-") + stderr, err := cmd.StderrPipe() + if err != nil { + return + } + + err = cmd.Start() + if err != nil { + return + } + + scanner := bufio.NewScanner(stderr) + for scanner.Scan() { + line := scanner.Text() + switch { + case strings.HasPrefix(line, "Target: "): + inst.TargetTriple = line[8:] + + case line[0] == ' ': + args := strings.Fields(line) + for _, arg := range args[1:] { + if strings.HasPrefix(arg, "-L") { + inst.LibPaths = append(inst.LibPaths, arg[2:]) + } + } + } + } + + stdout, err := exec.Command(gccgoPath, "-dumpversion").Output() + if err != nil { + return + } + inst.GccVersion = strings.TrimSpace(string(stdout)) + + return +} + +// Return the list of export search paths for this GccgoInstallation. +func (inst *GccgoInstallation) SearchPaths() (paths []string) { + for _, lpath := range inst.LibPaths { + spath := filepath.Join(lpath, "go", inst.GccVersion) + fi, err := os.Stat(spath) + if err != nil || !fi.IsDir() { + continue + } + paths = append(paths, spath) + + spath = filepath.Join(spath, inst.TargetTriple) + fi, err = os.Stat(spath) + if err != nil || !fi.IsDir() { + continue + } + paths = append(paths, spath) + } + + paths = append(paths, inst.LibPaths...) + + return +} + +// Return an importer that searches incpaths followed by the gcc installation's +// built-in search paths and the current directory. +func (inst *GccgoInstallation) GetImporter(incpaths []string, initmap map[*types.Package]InitData) types.Importer { + return GetImporter(append(append(incpaths, inst.SearchPaths()...), "."), initmap) +} diff --git a/vendor/golang.org/x/tools/go/gccgoimporter/gccgoinstallation_test.go b/vendor/golang.org/x/tools/go/gccgoimporter/gccgoinstallation_test.go new file mode 100644 index 0000000000..9ab928dce3 --- /dev/null +++ b/vendor/golang.org/x/tools/go/gccgoimporter/gccgoinstallation_test.go @@ -0,0 +1,194 @@ +// Copyright 2013 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 gccgoimporter + +import ( + "runtime" + "testing" + + "golang.org/x/tools/go/types" +) + +var importablePackages = [...]string{ + "archive/tar", + "archive/zip", + "bufio", + "bytes", + "compress/bzip2", + "compress/flate", + "compress/gzip", + "compress/lzw", + "compress/zlib", + "container/heap", + "container/list", + "container/ring", + "crypto/aes", + "crypto/cipher", + "crypto/des", + "crypto/dsa", + "crypto/ecdsa", + "crypto/elliptic", + "crypto", + "crypto/hmac", + "crypto/md5", + "crypto/rand", + "crypto/rc4", + "crypto/rsa", + "crypto/sha1", + "crypto/sha256", + "crypto/sha512", + "crypto/subtle", + "crypto/tls", + "crypto/x509", + "crypto/x509/pkix", + "database/sql/driver", + "database/sql", + "debug/dwarf", + "debug/elf", + "debug/gosym", + "debug/macho", + "debug/pe", + "encoding/ascii85", + "encoding/asn1", + "encoding/base32", + "encoding/base64", + "encoding/binary", + "encoding/csv", + "encoding/gob", + "encoding", + "encoding/hex", + "encoding/json", + "encoding/pem", + "encoding/xml", + "errors", + "exp/proxy", + "exp/terminal", + "expvar", + "flag", + "fmt", + "go/ast", + "go/build", + "go/doc", + "go/format", + "go/parser", + "go/printer", + "go/scanner", + "go/token", + "hash/adler32", + "hash/crc32", + "hash/crc64", + "hash/fnv", + "hash", + "html", + "html/template", + "image/color", + "image/color/palette", + "image/draw", + "image/gif", + "image", + "image/jpeg", + "image/png", + "index/suffixarray", + "io", + "io/ioutil", + "log", + "log/syslog", + "math/big", + "math/cmplx", + "math", + "math/rand", + "mime", + "mime/multipart", + "net", + "net/http/cgi", + "net/http/cookiejar", + "net/http/fcgi", + "net/http", + "net/http/httptest", + "net/http/httputil", + "net/http/pprof", + "net/mail", + "net/rpc", + "net/rpc/jsonrpc", + "net/smtp", + "net/textproto", + "net/url", + "old/regexp", + "old/template", + "os/exec", + "os", + "os/signal", + "os/user", + "path/filepath", + "path", + "reflect", + "regexp", + "regexp/syntax", + "runtime/debug", + "runtime", + "runtime/pprof", + "sort", + "strconv", + "strings", + "sync/atomic", + "sync", + "syscall", + "testing", + "testing/iotest", + "testing/quick", + "text/scanner", + "text/tabwriter", + "text/template", + "text/template/parse", + "time", + "unicode", + "unicode/utf16", + "unicode/utf8", +} + +func TestInstallationImporter(t *testing.T) { + // This test relies on gccgo being around, which it most likely will be if we + // were compiled with gccgo. + if runtime.Compiler != "gccgo" { + t.Skip("This test needs gccgo") + return + } + + var inst GccgoInstallation + err := inst.InitFromDriver("gccgo") + if err != nil { + t.Fatal(err) + } + imp := inst.GetImporter(nil, nil) + + // Ensure we don't regress the number of packages we can parse. First import + // all packages into the same map and then each individually. + pkgMap := make(map[string]*types.Package) + for _, pkg := range importablePackages { + _, err = imp(pkgMap, pkg) + if err != nil { + t.Error(err) + } + } + + for _, pkg := range importablePackages { + _, err = imp(make(map[string]*types.Package), pkg) + if err != nil { + t.Error(err) + } + } + + // Test for certain specific entities in the imported data. + for _, test := range [...]importerTest{ + {pkgpath: "io", name: "Reader", want: "type Reader interface{Read(p []uint8) (n int, err error)}"}, + {pkgpath: "io", name: "ReadWriter", want: "type ReadWriter interface{Reader; Writer}"}, + {pkgpath: "math", name: "Pi", want: "const Pi untyped float"}, + {pkgpath: "math", name: "Sin", want: "func Sin(x float64) float64"}, + {pkgpath: "sort", name: "Ints", want: "func Ints(a []int)"}, + {pkgpath: "unsafe", name: "Pointer", want: "type Pointer unsafe.Pointer"}, + } { + runImporterTest(t, imp, nil, &test) + } +} diff --git a/vendor/golang.org/x/tools/go/gccgoimporter/importer.go b/vendor/golang.org/x/tools/go/gccgoimporter/importer.go new file mode 100644 index 0000000000..ac484af9be --- /dev/null +++ b/vendor/golang.org/x/tools/go/gccgoimporter/importer.go @@ -0,0 +1,205 @@ +// Copyright 2013 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 gccgoimporter implements Import for gccgo-generated object files. +package gccgoimporter // import "golang.org/x/tools/go/gccgoimporter" + +import ( + "bytes" + "debug/elf" + "fmt" + "io" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "strings" + + "golang.org/x/tools/go/importer" + "golang.org/x/tools/go/types" +) + +// A PackageInit describes an imported package that needs initialization. +type PackageInit struct { + Name string // short package name + InitFunc string // name of init function + Priority int // priority of init function, see InitData.Priority +} + +// The gccgo-specific init data for a package. +type InitData struct { + // Initialization priority of this package relative to other packages. + // This is based on the maximum depth of the package's dependency graph; + // it is guaranteed to be greater than that of its dependencies. + Priority int + + // The list of packages which this package depends on to be initialized, + // including itself if needed. This is the subset of the transitive closure of + // the package's dependencies that need initialization. + Inits []PackageInit +} + +// Locate the file from which to read export data. +// This is intended to replicate the logic in gofrontend. +func findExportFile(searchpaths []string, pkgpath string) (string, error) { + for _, spath := range searchpaths { + pkgfullpath := filepath.Join(spath, pkgpath) + pkgdir, name := filepath.Split(pkgfullpath) + + for _, filepath := range [...]string{ + pkgfullpath, + pkgfullpath + ".gox", + pkgdir + "lib" + name + ".so", + pkgdir + "lib" + name + ".a", + pkgfullpath + ".o", + } { + fi, err := os.Stat(filepath) + if err == nil && !fi.IsDir() { + return filepath, nil + } + } + } + + return "", fmt.Errorf("%s: could not find export data (tried %s)", pkgpath, strings.Join(searchpaths, ":")) +} + +const ( + gccgov1Magic = "v1;\n" + goimporterMagic = "\n$$ " + archiveMagic = "! 0 { + initdata := initmap[pkg] + found := false + // Check that the package's own init function has the package's priority + for _, pkginit := range initdata.Inits { + if pkginit.InitFunc == test.wantinits[0] { + if initdata.Priority != pkginit.Priority { + t.Errorf("%s: got self priority %d; want %d", test.pkgpath, pkginit.Priority, initdata.Priority) + } + found = true + break + } + } + + if !found { + t.Errorf("%s: could not find expected function %q", test.pkgpath, test.wantinits[0]) + } + + // Each init function in the list other than the first one is a + // dependency of the function immediately before it. Check that + // the init functions appear in descending priority order. + priority := initdata.Priority + for _, wantdepinit := range test.wantinits[1:] { + found = false + for _, pkginit := range initdata.Inits { + if pkginit.InitFunc == wantdepinit { + if priority <= pkginit.Priority { + t.Errorf("%s: got dep priority %d; want less than %d", test.pkgpath, pkginit.Priority, priority) + } + found = true + priority = pkginit.Priority + break + } + } + + if !found { + t.Errorf("%s: could not find expected function %q", test.pkgpath, wantdepinit) + } + } + } +} + +var importerTests = [...]importerTest{ + {pkgpath: "pointer", name: "Int8Ptr", want: "type Int8Ptr *int8"}, + {pkgpath: "complexnums", name: "NN", want: "const NN untyped complex", wantval: "(-1/1 + -1/1i)"}, + {pkgpath: "complexnums", name: "NP", want: "const NP untyped complex", wantval: "(-1/1 + 1/1i)"}, + {pkgpath: "complexnums", name: "PN", want: "const PN untyped complex", wantval: "(1/1 + -1/1i)"}, + {pkgpath: "complexnums", name: "PP", want: "const PP untyped complex", wantval: "(1/1 + 1/1i)"}, + // TODO: enable this entry once bug has been tracked down + //{pkgpath: "imports", wantinits: []string{"imports..import", "fmt..import", "math..import"}}, +} + +func TestGoxImporter(t *testing.T) { + if runtime.GOOS == "android" { + t.Skipf("no testdata directory on %s", runtime.GOOS) + } + initmap := make(map[*types.Package]InitData) + imp := GetImporter([]string{"testdata"}, initmap) + + for _, test := range importerTests { + runImporterTest(t, imp, initmap, &test) + } +} + +func TestObjImporter(t *testing.T) { + // This test relies on gccgo being around, which it most likely will be if we + // were compiled with gccgo. + if runtime.Compiler != "gccgo" { + t.Skip("This test needs gccgo") + return + } + + tmpdir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatal(err) + } + initmap := make(map[*types.Package]InitData) + imp := GetImporter([]string{tmpdir}, initmap) + + artmpdir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatal(err) + } + arinitmap := make(map[*types.Package]InitData) + arimp := GetImporter([]string{artmpdir}, arinitmap) + + for _, test := range importerTests { + gofile := filepath.Join("testdata", test.pkgpath+".go") + ofile := filepath.Join(tmpdir, test.pkgpath+".o") + afile := filepath.Join(artmpdir, "lib"+test.pkgpath+".a") + + cmd := exec.Command("gccgo", "-fgo-pkgpath="+test.pkgpath, "-c", "-o", ofile, gofile) + out, err := cmd.CombinedOutput() + if err != nil { + t.Logf("%s", out) + t.Fatalf("gccgo %s failed: %s", gofile, err) + } + + runImporterTest(t, imp, initmap, &test) + + cmd = exec.Command("ar", "cr", afile, ofile) + out, err = cmd.CombinedOutput() + if err != nil { + t.Logf("%s", out) + t.Fatalf("ar cr %s %s failed: %s", afile, ofile, err) + } + + runImporterTest(t, arimp, arinitmap, &test) + + if err = os.Remove(ofile); err != nil { + t.Fatal(err) + } + if err = os.Remove(afile); err != nil { + t.Fatal(err) + } + } + + if err = os.Remove(tmpdir); err != nil { + t.Fatal(err) + } +} diff --git a/vendor/golang.org/x/tools/go/gccgoimporter/parser.go b/vendor/golang.org/x/tools/go/gccgoimporter/parser.go new file mode 100644 index 0000000000..d20a967313 --- /dev/null +++ b/vendor/golang.org/x/tools/go/gccgoimporter/parser.go @@ -0,0 +1,856 @@ +// Copyright 2013 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 gccgoimporter + +import ( + "bytes" + "errors" + "fmt" + "go/token" + "io" + "strconv" + "strings" + "text/scanner" + + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/types" +) + +type parser struct { + scanner scanner.Scanner + tok rune // current token + lit string // literal string; only valid for Ident, Int, String tokens + pkgpath string // package path of imported package + pkgname string // name of imported package + pkg *types.Package // reference to imported package + imports map[string]*types.Package // package path -> package object + typeMap map[int]types.Type // type number -> type + initdata InitData // package init priority data +} + +func (p *parser) init(filename string, src io.Reader, imports map[string]*types.Package) { + p.scanner.Init(src) + p.scanner.Error = func(_ *scanner.Scanner, msg string) { p.error(msg) } + p.scanner.Mode = scanner.ScanIdents | scanner.ScanInts | scanner.ScanFloats | scanner.ScanStrings | scanner.ScanComments | scanner.SkipComments + p.scanner.Whitespace = 1<<'\t' | 1<<'\n' | 1<<' ' + p.scanner.Filename = filename // for good error messages + p.next() + p.imports = imports + p.typeMap = make(map[int]types.Type) +} + +type importError struct { + pos scanner.Position + err error +} + +func (e importError) Error() string { + return fmt.Sprintf("import error %s (byte offset = %d): %s", e.pos, e.pos.Offset, e.err) +} + +func (p *parser) error(err interface{}) { + if s, ok := err.(string); ok { + err = errors.New(s) + } + // panic with a runtime.Error if err is not an error + panic(importError{p.scanner.Pos(), err.(error)}) +} + +func (p *parser) errorf(format string, args ...interface{}) { + p.error(fmt.Errorf(format, args...)) +} + +func (p *parser) expect(tok rune) string { + lit := p.lit + if p.tok != tok { + p.errorf("expected %s, got %s (%s)", scanner.TokenString(tok), scanner.TokenString(p.tok), lit) + } + p.next() + return lit +} + +func (p *parser) expectKeyword(keyword string) { + lit := p.expect(scanner.Ident) + if lit != keyword { + p.errorf("expected keyword %s, got %q", keyword, lit) + } +} + +func (p *parser) parseString() string { + str, err := strconv.Unquote(p.expect(scanner.String)) + if err != nil { + p.error(err) + } + return str +} + +// unquotedString = { unquotedStringChar } . +// unquotedStringChar = . +func (p *parser) parseUnquotedString() string { + if p.tok == scanner.EOF { + p.error("unexpected EOF") + } + var buf bytes.Buffer + buf.WriteString(p.scanner.TokenText()) + // This loop needs to examine each character before deciding whether to consume it. If we see a semicolon, + // we need to let it be consumed by p.next(). + for ch := p.scanner.Peek(); ch != ';' && ch != scanner.EOF && p.scanner.Whitespace&(1< 0 { + p.expect(',') + } + par, variadic := p.parseParam(pkg) + list = append(list, par) + if variadic { + if isVariadic { + p.error("... not on final argument") + } + isVariadic = true + } + } + p.expect(')') + + return types.NewTuple(list...), isVariadic +} + +// ResultList = Type | ParamList . +func (p *parser) parseResultList(pkg *types.Package) *types.Tuple { + switch p.tok { + case '<': + return types.NewTuple(types.NewParam(token.NoPos, pkg, "", p.parseType(pkg))) + + case '(': + params, _ := p.parseParamList(pkg) + return params + + default: + return nil + } +} + +// FunctionType = ParamList ResultList . +func (p *parser) parseFunctionType(pkg *types.Package) *types.Signature { + params, isVariadic := p.parseParamList(pkg) + results := p.parseResultList(pkg) + return types.NewSignature(nil, params, results, isVariadic) +} + +// Func = Name FunctionType . +func (p *parser) parseFunc(pkg *types.Package) *types.Func { + name := p.parseName() + if strings.ContainsRune(name, '$') { + // This is a Type$equal or Type$hash function, which we don't want to parse, + // except for the types. + p.discardDirectiveWhileParsingTypes(pkg) + return nil + } + return types.NewFunc(token.NoPos, pkg, name, p.parseFunctionType(pkg)) +} + +// InterfaceType = "interface" "{" { ("?" Type | Func) ";" } "}" . +func (p *parser) parseInterfaceType(pkg *types.Package) types.Type { + p.expectKeyword("interface") + + var methods []*types.Func + var typs []*types.Named + + p.expect('{') + for p.tok != '}' && p.tok != scanner.EOF { + if p.tok == '?' { + p.next() + typs = append(typs, p.parseType(pkg).(*types.Named)) + } else { + method := p.parseFunc(pkg) + methods = append(methods, method) + } + p.expect(';') + } + p.expect('}') + + return types.NewInterface(methods, typs) +} + +// PointerType = "*" ("any" | Type) . +func (p *parser) parsePointerType(pkg *types.Package) types.Type { + p.expect('*') + if p.tok == scanner.Ident { + p.expectKeyword("any") + return types.Typ[types.UnsafePointer] + } + return types.NewPointer(p.parseType(pkg)) +} + +// TypeDefinition = NamedType | MapType | ChanType | StructType | InterfaceType | PointerType | ArrayOrSliceType | FunctionType . +func (p *parser) parseTypeDefinition(pkg *types.Package, n int) types.Type { + var t types.Type + switch p.tok { + case scanner.String: + t = p.parseNamedType(n) + + case scanner.Ident: + switch p.lit { + case "map": + t = p.parseMapType(pkg) + + case "chan": + t = p.parseChanType(pkg) + + case "struct": + t = p.parseStructType(pkg) + + case "interface": + t = p.parseInterfaceType(pkg) + } + + case '*': + t = p.parsePointerType(pkg) + + case '[': + t = p.parseArrayOrSliceType(pkg) + + case '(': + t = p.parseFunctionType(pkg) + } + + p.typeMap[n] = t + return t +} + +const ( + // From gofrontend/go/export.h + // Note that these values are negative in the gofrontend and have been made positive + // in the gccgoimporter. + gccgoBuiltinINT8 = 1 + gccgoBuiltinINT16 = 2 + gccgoBuiltinINT32 = 3 + gccgoBuiltinINT64 = 4 + gccgoBuiltinUINT8 = 5 + gccgoBuiltinUINT16 = 6 + gccgoBuiltinUINT32 = 7 + gccgoBuiltinUINT64 = 8 + gccgoBuiltinFLOAT32 = 9 + gccgoBuiltinFLOAT64 = 10 + gccgoBuiltinINT = 11 + gccgoBuiltinUINT = 12 + gccgoBuiltinUINTPTR = 13 + gccgoBuiltinBOOL = 15 + gccgoBuiltinSTRING = 16 + gccgoBuiltinCOMPLEX64 = 17 + gccgoBuiltinCOMPLEX128 = 18 + gccgoBuiltinERROR = 19 + gccgoBuiltinBYTE = 20 + gccgoBuiltinRUNE = 21 +) + +func lookupBuiltinType(typ int) types.Type { + return [...]types.Type{ + gccgoBuiltinINT8: types.Typ[types.Int8], + gccgoBuiltinINT16: types.Typ[types.Int16], + gccgoBuiltinINT32: types.Typ[types.Int32], + gccgoBuiltinINT64: types.Typ[types.Int64], + gccgoBuiltinUINT8: types.Typ[types.Uint8], + gccgoBuiltinUINT16: types.Typ[types.Uint16], + gccgoBuiltinUINT32: types.Typ[types.Uint32], + gccgoBuiltinUINT64: types.Typ[types.Uint64], + gccgoBuiltinFLOAT32: types.Typ[types.Float32], + gccgoBuiltinFLOAT64: types.Typ[types.Float64], + gccgoBuiltinINT: types.Typ[types.Int], + gccgoBuiltinUINT: types.Typ[types.Uint], + gccgoBuiltinUINTPTR: types.Typ[types.Uintptr], + gccgoBuiltinBOOL: types.Typ[types.Bool], + gccgoBuiltinSTRING: types.Typ[types.String], + gccgoBuiltinCOMPLEX64: types.Typ[types.Complex64], + gccgoBuiltinCOMPLEX128: types.Typ[types.Complex128], + gccgoBuiltinERROR: types.Universe.Lookup("error").Type(), + gccgoBuiltinBYTE: types.Universe.Lookup("byte").Type(), + gccgoBuiltinRUNE: types.Universe.Lookup("rune").Type(), + }[typ] +} + +// Type = "<" "type" ( "-" int | int [ TypeDefinition ] ) ">" . +func (p *parser) parseType(pkg *types.Package) (t types.Type) { + p.expect('<') + p.expectKeyword("type") + + switch p.tok { + case scanner.Int: + n := p.parseInt() + + if p.tok == '>' { + t = p.typeMap[int(n)] + } else { + t = p.parseTypeDefinition(pkg, int(n)) + } + + case '-': + p.next() + n := p.parseInt() + t = lookupBuiltinType(int(n)) + + default: + p.errorf("expected type number, got %s (%q)", scanner.TokenString(p.tok), p.lit) + return nil + } + + p.expect('>') + return +} + +// PackageInit = unquotedString unquotedString int . +func (p *parser) parsePackageInit() PackageInit { + name := p.parseUnquotedString() + initfunc := p.parseUnquotedString() + priority := int(p.parseInt()) + return PackageInit{Name: name, InitFunc: initfunc, Priority: priority} +} + +// Throw away tokens until we see a ';'. If we see a '<', attempt to parse as a type. +func (p *parser) discardDirectiveWhileParsingTypes(pkg *types.Package) { + for { + switch p.tok { + case ';': + return + case '<': + p.parseType(p.pkg) + case scanner.EOF: + p.error("unexpected EOF") + default: + p.next() + } + } +} + +// Create the package if we have parsed both the package path and package name. +func (p *parser) maybeCreatePackage() { + if p.pkgname != "" && p.pkgpath != "" { + p.pkg = p.getPkg(p.pkgpath, p.pkgname) + } +} + +// InitDataDirective = "v1" ";" | +// "priority" int ";" | +// "init" { PackageInit } ";" | +// "checksum" unquotedString ";" . +func (p *parser) parseInitDataDirective() { + if p.tok != scanner.Ident { + // unexpected token kind; panic + p.expect(scanner.Ident) + } + + switch p.lit { + case "v1": + p.next() + p.expect(';') + + case "priority": + p.next() + p.initdata.Priority = int(p.parseInt()) + p.expect(';') + + case "init": + p.next() + for p.tok != ';' && p.tok != scanner.EOF { + p.initdata.Inits = append(p.initdata.Inits, p.parsePackageInit()) + } + p.expect(';') + + case "checksum": + // Don't let the scanner try to parse the checksum as a number. + defer func(mode uint) { + p.scanner.Mode = mode + }(p.scanner.Mode) + p.scanner.Mode &^= scanner.ScanInts | scanner.ScanFloats + p.next() + p.parseUnquotedString() + p.expect(';') + + default: + p.errorf("unexpected identifier: %q", p.lit) + } +} + +// Directive = InitDataDirective | +// "package" unquotedString ";" | +// "pkgpath" unquotedString ";" | +// "import" unquotedString unquotedString string ";" | +// "func" Func ";" | +// "type" Type ";" | +// "var" Var ";" | +// "const" Const ";" . +func (p *parser) parseDirective() { + if p.tok != scanner.Ident { + // unexpected token kind; panic + p.expect(scanner.Ident) + } + + switch p.lit { + case "v1", "priority", "init", "checksum": + p.parseInitDataDirective() + + case "package": + p.next() + p.pkgname = p.parseUnquotedString() + p.maybeCreatePackage() + p.expect(';') + + case "pkgpath": + p.next() + p.pkgpath = p.parseUnquotedString() + p.maybeCreatePackage() + p.expect(';') + + case "import": + p.next() + pkgname := p.parseUnquotedString() + pkgpath := p.parseUnquotedString() + p.getPkg(pkgpath, pkgname) + p.parseString() + p.expect(';') + + case "func": + p.next() + fun := p.parseFunc(p.pkg) + if fun != nil { + p.pkg.Scope().Insert(fun) + } + p.expect(';') + + case "type": + p.next() + p.parseType(p.pkg) + p.expect(';') + + case "var": + p.next() + v := p.parseVar(p.pkg) + p.pkg.Scope().Insert(v) + p.expect(';') + + case "const": + p.next() + c := p.parseConst(p.pkg) + p.pkg.Scope().Insert(c) + p.expect(';') + + default: + p.errorf("unexpected identifier: %q", p.lit) + } +} + +// Package = { Directive } . +func (p *parser) parsePackage() *types.Package { + for p.tok != scanner.EOF { + p.parseDirective() + } + for _, typ := range p.typeMap { + if it, ok := typ.(*types.Interface); ok { + it.Complete() + } + } + p.pkg.MarkComplete() + return p.pkg +} + +// InitData = { InitDataDirective } . +func (p *parser) parseInitData() { + for p.tok != scanner.EOF { + p.parseInitDataDirective() + } +} diff --git a/vendor/golang.org/x/tools/go/gccgoimporter/parser_test.go b/vendor/golang.org/x/tools/go/gccgoimporter/parser_test.go new file mode 100644 index 0000000000..1f0f12a2f8 --- /dev/null +++ b/vendor/golang.org/x/tools/go/gccgoimporter/parser_test.go @@ -0,0 +1,73 @@ +// Copyright 2013 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 gccgoimporter + +import ( + "bytes" + "strings" + "testing" + "text/scanner" + + "golang.org/x/tools/go/types" +) + +var typeParserTests = []struct { + id, typ, want, underlying, methods string +}{ + {id: "foo", typ: "", want: "int8"}, + {id: "foo", typ: ">", want: "*error"}, + {id: "foo", typ: "", want: "unsafe.Pointer"}, + {id: "foo", typ: ">>", want: "foo.Bar", underlying: "*foo.Bar"}, + {id: "foo", typ: " func (? ) M (); >", want: "bar.Foo", underlying: "int8", methods: "func (bar.Foo).M()"}, + {id: "foo", typ: ">", want: "bar.foo", underlying: "int8"}, + {id: "foo", typ: ">", want: "[]int8"}, + {id: "foo", typ: ">", want: "[42]int8"}, + {id: "foo", typ: "] >", want: "map[int8]int16"}, + {id: "foo", typ: ">", want: "chan int8"}, + {id: "foo", typ: ">", want: "<-chan int8"}, + {id: "foo", typ: ">", want: "chan<- int8"}, + {id: "foo", typ: "; I16 \"i16\"; }>", want: "struct{I8 int8; I16 int16 \"i16\"}"}, + {id: "foo", typ: ", b ) ; Bar (? , ? ...) (? , ? ); Baz (); }>", want: "interface{Bar(int16, ...int8) (int16, int8); Baz(); Foo(a int8, b int16) int8}"}, + {id: "foo", typ: ") >", want: "func(int8) int16"}, +} + +func TestTypeParser(t *testing.T) { + for _, test := range typeParserTests { + var p parser + p.init("test.gox", strings.NewReader(test.typ), make(map[string]*types.Package)) + p.pkgname = test.id + p.pkgpath = test.id + p.maybeCreatePackage() + typ := p.parseType(p.pkg) + + if p.tok != scanner.EOF { + t.Errorf("expected full parse, stopped at %q", p.lit) + } + + got := typ.String() + if got != test.want { + t.Errorf("got type %q, expected %q", got, test.want) + } + + if test.underlying != "" { + underlying := typ.Underlying().String() + if underlying != test.underlying { + t.Errorf("got underlying type %q, expected %q", underlying, test.underlying) + } + } + + if test.methods != "" { + nt := typ.(*types.Named) + var buf bytes.Buffer + for i := 0; i != nt.NumMethods(); i++ { + buf.WriteString(nt.Method(i).String()) + } + methods := buf.String() + if methods != test.methods { + t.Errorf("got methods %q, expected %q", methods, test.methods) + } + } + } +} diff --git a/vendor/golang.org/x/tools/go/gccgoimporter/testdata/complexnums.go b/vendor/golang.org/x/tools/go/gccgoimporter/testdata/complexnums.go new file mode 100644 index 0000000000..a51b6b01c0 --- /dev/null +++ b/vendor/golang.org/x/tools/go/gccgoimporter/testdata/complexnums.go @@ -0,0 +1,6 @@ +package complexnums + +const NN = -1 - 1i +const NP = -1 + 1i +const PN = 1 - 1i +const PP = 1 + 1i diff --git a/vendor/golang.org/x/tools/go/gccgoimporter/testdata/complexnums.gox b/vendor/golang.org/x/tools/go/gccgoimporter/testdata/complexnums.gox new file mode 100644 index 0000000000..b66524f80e --- /dev/null +++ b/vendor/golang.org/x/tools/go/gccgoimporter/testdata/complexnums.gox @@ -0,0 +1,8 @@ +v1; +package complexnums; +pkgpath complexnums; +priority 1; +const NN = -0.1E1-0.1E1i ; +const NP = -0.1E1+0.1E1i ; +const PN = 0.1E1-0.1E1i ; +const PP = 0.1E1+0.1E1i ; diff --git a/vendor/golang.org/x/tools/go/gccgoimporter/testdata/imports.go b/vendor/golang.org/x/tools/go/gccgoimporter/testdata/imports.go new file mode 100644 index 0000000000..7907316a60 --- /dev/null +++ b/vendor/golang.org/x/tools/go/gccgoimporter/testdata/imports.go @@ -0,0 +1,5 @@ +package imports + +import "fmt" + +var Hello = fmt.Sprintf("Hello, world") diff --git a/vendor/golang.org/x/tools/go/gccgoimporter/testdata/imports.gox b/vendor/golang.org/x/tools/go/gccgoimporter/testdata/imports.gox new file mode 100644 index 0000000000..958a4f5b82 --- /dev/null +++ b/vendor/golang.org/x/tools/go/gccgoimporter/testdata/imports.gox @@ -0,0 +1,7 @@ +v1; +package imports; +pkgpath imports; +priority 7; +import fmt fmt "fmt"; +init imports imports..import 7 math math..import 1 runtime runtime..import 1 strconv strconv..import 2 io io..import 3 reflect reflect..import 3 syscall syscall..import 3 time time..import 4 os os..import 5 fmt fmt..import 6; +var Hello ; diff --git a/vendor/golang.org/x/tools/go/gccgoimporter/testdata/pointer.go b/vendor/golang.org/x/tools/go/gccgoimporter/testdata/pointer.go new file mode 100644 index 0000000000..4ebc67137d --- /dev/null +++ b/vendor/golang.org/x/tools/go/gccgoimporter/testdata/pointer.go @@ -0,0 +1,3 @@ +package pointer + +type Int8Ptr *int8 diff --git a/vendor/golang.org/x/tools/go/gccgoimporter/testdata/pointer.gox b/vendor/golang.org/x/tools/go/gccgoimporter/testdata/pointer.gox new file mode 100644 index 0000000000..d96ebbdd14 --- /dev/null +++ b/vendor/golang.org/x/tools/go/gccgoimporter/testdata/pointer.gox @@ -0,0 +1,4 @@ +v1; +package pointer; +pkgpath pointer; +type >>; diff --git a/vendor/golang.org/x/tools/go/gcimporter/exportdata.go b/vendor/golang.org/x/tools/go/gcimporter/exportdata.go new file mode 100644 index 0000000000..657742bb6d --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcimporter/exportdata.go @@ -0,0 +1,108 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements FindExportData. + +package gcimporter + +import ( + "bufio" + "errors" + "fmt" + "io" + "strconv" + "strings" +) + +func readGopackHeader(r *bufio.Reader) (name string, size int, err error) { + // See $GOROOT/include/ar.h. + hdr := make([]byte, 16+12+6+6+8+10+2) + _, err = io.ReadFull(r, hdr) + if err != nil { + return + } + // leave for debugging + if false { + fmt.Printf("header: %s", hdr) + } + s := strings.TrimSpace(string(hdr[16+12+6+6+8:][:10])) + size, err = strconv.Atoi(s) + if err != nil || hdr[len(hdr)-2] != '`' || hdr[len(hdr)-1] != '\n' { + err = errors.New("invalid archive header") + return + } + name = strings.TrimSpace(string(hdr[:16])) + return +} + +// FindExportData positions the reader r at the beginning of the +// export data section of an underlying GC-created object/archive +// file by reading from it. The reader must be positioned at the +// start of the file before calling this function. +// +func FindExportData(r *bufio.Reader) (err error) { + // Read first line to make sure this is an object file. + line, err := r.ReadSlice('\n') + if err != nil { + return + } + if string(line) == "!\n" { + // Archive file. Scan to __.PKGDEF. + var name string + var size int + if name, size, err = readGopackHeader(r); err != nil { + return + } + + // Optional leading __.GOSYMDEF or __.SYMDEF. + // Read and discard. + if name == "__.SYMDEF" || name == "__.GOSYMDEF" { + const block = 4096 + tmp := make([]byte, block) + for size > 0 { + n := size + if n > block { + n = block + } + if _, err = io.ReadFull(r, tmp[:n]); err != nil { + return + } + size -= n + } + + if name, size, err = readGopackHeader(r); err != nil { + return + } + } + + // First real entry should be __.PKGDEF. + if name != "__.PKGDEF" { + err = errors.New("go archive is missing __.PKGDEF") + return + } + + // Read first line of __.PKGDEF data, so that line + // is once again the first line of the input. + if line, err = r.ReadSlice('\n'); err != nil { + return + } + } + + // Now at __.PKGDEF in archive or still at beginning of file. + // Either way, line should begin with "go object ". + if !strings.HasPrefix(string(line), "go object ") { + err = errors.New("not a go object file") + return + } + + // Skip over object header to export data. + // Begins after first line with $$. + for line[0] != '$' { + if line, err = r.ReadSlice('\n'); err != nil { + return + } + } + + return +} diff --git a/vendor/golang.org/x/tools/go/gcimporter/gcimporter.go b/vendor/golang.org/x/tools/go/gcimporter/gcimporter.go new file mode 100644 index 0000000000..031e8707cf --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcimporter/gcimporter.go @@ -0,0 +1,995 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package gcimporter implements Import for gc-generated object files. +// Importing this package installs Import as go/types.DefaultImport. +package gcimporter // import "golang.org/x/tools/go/gcimporter" + +import ( + "bufio" + "errors" + "fmt" + "go/build" + "go/token" + "io" + "os" + "path/filepath" + "sort" + "strconv" + "strings" + "text/scanner" + + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/types" +) + +// debugging/development support +const debug = false + +func init() { + types.DefaultImport = Import +} + +var pkgExts = [...]string{".a", ".5", ".6", ".7", ".8", ".9"} + +// FindPkg returns the filename and unique package id for an import +// path based on package information provided by build.Import (using +// the build.Default build.Context). +// If no file was found, an empty filename is returned. +// +func FindPkg(path, srcDir string) (filename, id string) { + if len(path) == 0 { + return + } + + id = path + var noext string + switch { + default: + // "x" -> "$GOPATH/pkg/$GOOS_$GOARCH/x.ext", "x" + // Don't require the source files to be present. + bp, _ := build.Import(path, srcDir, build.FindOnly|build.AllowBinary) + if bp.PkgObj == "" { + return + } + noext = strings.TrimSuffix(bp.PkgObj, ".a") + + case build.IsLocalImport(path): + // "./x" -> "/this/directory/x.ext", "/this/directory/x" + noext = filepath.Join(srcDir, path) + id = noext + + case filepath.IsAbs(path): + // for completeness only - go/build.Import + // does not support absolute imports + // "/x" -> "/x.ext", "/x" + noext = path + } + + // try extensions + for _, ext := range pkgExts { + filename = noext + ext + if f, err := os.Stat(filename); err == nil && !f.IsDir() { + return + } + } + + filename = "" // not found + return +} + +// ImportData imports a package by reading the gc-generated export data, +// adds the corresponding package object to the packages map indexed by id, +// and returns the object. +// +// The packages map must contains all packages already imported. The data +// reader position must be the beginning of the export data section. The +// filename is only used in error messages. +// +// If packages[id] contains the completely imported package, that package +// can be used directly, and there is no need to call this function (but +// there is also no harm but for extra time used). +// +func ImportData(packages map[string]*types.Package, filename, id string, data io.Reader) (pkg *types.Package, err error) { + // support for parser error handling + defer func() { + switch r := recover().(type) { + case nil: + // nothing to do + case importError: + err = r + default: + panic(r) // internal error + } + }() + + var p parser + p.init(filename, id, data, packages) + pkg = p.parseExport() + + return +} + +// Import imports a gc-generated package given its import path, adds the +// corresponding package object to the packages map, and returns the object. +// Local import paths are interpreted relative to the current working directory. +// The packages map must contains all packages already imported. +// +func Import(packages map[string]*types.Package, path string) (pkg *types.Package, err error) { + if path == "unsafe" { + return types.Unsafe, nil + } + + srcDir := "." + if build.IsLocalImport(path) { + srcDir, err = os.Getwd() + if err != nil { + return + } + } + + filename, id := FindPkg(path, srcDir) + if filename == "" { + err = fmt.Errorf("can't find import: %s", id) + return + } + + // no need to re-import if the package was imported completely before + if pkg = packages[id]; pkg != nil && pkg.Complete() { + return + } + + // open file + f, err := os.Open(filename) + if err != nil { + return + } + defer func() { + f.Close() + if err != nil { + // add file name to error + err = fmt.Errorf("reading export data: %s: %v", filename, err) + } + }() + + buf := bufio.NewReader(f) + if err = FindExportData(buf); err != nil { + return + } + + pkg, err = ImportData(packages, filename, id, buf) + + return +} + +// ---------------------------------------------------------------------------- +// Parser + +// TODO(gri) Imported objects don't have position information. +// Ideally use the debug table line info; alternatively +// create some fake position (or the position of the +// import). That way error messages referring to imported +// objects can print meaningful information. + +// parser parses the exports inside a gc compiler-produced +// object/archive file and populates its scope with the results. +type parser struct { + scanner scanner.Scanner + tok rune // current token + lit string // literal string; only valid for Ident, Int, String tokens + id string // package id of imported package + sharedPkgs map[string]*types.Package // package id -> package object (across importer) + localPkgs map[string]*types.Package // package id -> package object (just this package) +} + +func (p *parser) init(filename, id string, src io.Reader, packages map[string]*types.Package) { + p.scanner.Init(src) + p.scanner.Error = func(_ *scanner.Scanner, msg string) { p.error(msg) } + p.scanner.Mode = scanner.ScanIdents | scanner.ScanInts | scanner.ScanChars | scanner.ScanStrings | scanner.ScanComments | scanner.SkipComments + p.scanner.Whitespace = 1<<'\t' | 1<<' ' + p.scanner.Filename = filename // for good error messages + p.next() + p.id = id + p.sharedPkgs = packages + if debug { + // check consistency of packages map + for _, pkg := range packages { + if pkg.Name() == "" { + fmt.Printf("no package name for %s\n", pkg.Path()) + } + } + } +} + +func (p *parser) next() { + p.tok = p.scanner.Scan() + switch p.tok { + case scanner.Ident, scanner.Int, scanner.Char, scanner.String, '·': + p.lit = p.scanner.TokenText() + default: + p.lit = "" + } + if debug { + fmt.Printf("%s: %q -> %q\n", scanner.TokenString(p.tok), p.scanner.TokenText(), p.lit) + } +} + +func declTypeName(pkg *types.Package, name string) *types.TypeName { + scope := pkg.Scope() + if obj := scope.Lookup(name); obj != nil { + return obj.(*types.TypeName) + } + obj := types.NewTypeName(token.NoPos, pkg, name, nil) + // a named type may be referred to before the underlying type + // is known - set it up + types.NewNamed(obj, nil, nil) + scope.Insert(obj) + return obj +} + +// ---------------------------------------------------------------------------- +// Error handling + +// Internal errors are boxed as importErrors. +type importError struct { + pos scanner.Position + err error +} + +func (e importError) Error() string { + return fmt.Sprintf("import error %s (byte offset = %d): %s", e.pos, e.pos.Offset, e.err) +} + +func (p *parser) error(err interface{}) { + if s, ok := err.(string); ok { + err = errors.New(s) + } + // panic with a runtime.Error if err is not an error + panic(importError{p.scanner.Pos(), err.(error)}) +} + +func (p *parser) errorf(format string, args ...interface{}) { + p.error(fmt.Sprintf(format, args...)) +} + +func (p *parser) expect(tok rune) string { + lit := p.lit + if p.tok != tok { + p.errorf("expected %s, got %s (%s)", scanner.TokenString(tok), scanner.TokenString(p.tok), lit) + } + p.next() + return lit +} + +func (p *parser) expectSpecial(tok string) { + sep := 'x' // not white space + i := 0 + for i < len(tok) && p.tok == rune(tok[i]) && sep > ' ' { + sep = p.scanner.Peek() // if sep <= ' ', there is white space before the next token + p.next() + i++ + } + if i < len(tok) { + p.errorf("expected %q, got %q", tok, tok[0:i]) + } +} + +func (p *parser) expectKeyword(keyword string) { + lit := p.expect(scanner.Ident) + if lit != keyword { + p.errorf("expected keyword %s, got %q", keyword, lit) + } +} + +// ---------------------------------------------------------------------------- +// Qualified and unqualified names + +// PackageId = string_lit . +// +func (p *parser) parsePackageId() string { + id, err := strconv.Unquote(p.expect(scanner.String)) + if err != nil { + p.error(err) + } + // id == "" stands for the imported package id + // (only known at time of package installation) + if id == "" { + id = p.id + } + return id +} + +// PackageName = ident . +// +func (p *parser) parsePackageName() string { + return p.expect(scanner.Ident) +} + +// dotIdentifier = ( ident | '·' ) { ident | int | '·' } . +func (p *parser) parseDotIdent() string { + ident := "" + if p.tok != scanner.Int { + sep := 'x' // not white space + for (p.tok == scanner.Ident || p.tok == scanner.Int || p.tok == '·') && sep > ' ' { + ident += p.lit + sep = p.scanner.Peek() // if sep <= ' ', there is white space before the next token + p.next() + } + } + if ident == "" { + p.expect(scanner.Ident) // use expect() for error handling + } + return ident +} + +// QualifiedName = "@" PackageId "." ( "?" | dotIdentifier ) . +// +func (p *parser) parseQualifiedName() (id, name string) { + p.expect('@') + id = p.parsePackageId() + p.expect('.') + // Per rev f280b8a485fd (10/2/2013), qualified names may be used for anonymous fields. + if p.tok == '?' { + p.next() + } else { + name = p.parseDotIdent() + } + return +} + +// getPkg returns the package for a given id. If the package is +// not found but we have a package name, create the package and +// add it to the p.localPkgs and p.sharedPkgs maps. +// +// id identifies a package, usually by a canonical package path like +// "encoding/json" but possibly by a non-canonical import path like +// "./json". +// +func (p *parser) getPkg(id, name string) *types.Package { + // package unsafe is not in the packages maps - handle explicitly + if id == "unsafe" { + return types.Unsafe + } + + pkg := p.localPkgs[id] + if pkg == nil && name != "" { + // first import of id from this package + pkg = p.sharedPkgs[id] + if pkg == nil { + // first import of id by this importer + pkg = types.NewPackage(id, name) + p.sharedPkgs[id] = pkg + } + + if p.localPkgs == nil { + p.localPkgs = make(map[string]*types.Package) + } + p.localPkgs[id] = pkg + } + return pkg +} + +// parseExportedName is like parseQualifiedName, but +// the package id is resolved to an imported *types.Package. +// +func (p *parser) parseExportedName() (pkg *types.Package, name string) { + id, name := p.parseQualifiedName() + pkg = p.getPkg(id, "") + if pkg == nil { + p.errorf("%s package not found", id) + } + return +} + +// ---------------------------------------------------------------------------- +// Types + +// BasicType = identifier . +// +func (p *parser) parseBasicType() types.Type { + id := p.expect(scanner.Ident) + obj := types.Universe.Lookup(id) + if obj, ok := obj.(*types.TypeName); ok { + return obj.Type() + } + p.errorf("not a basic type: %s", id) + return nil +} + +// ArrayType = "[" int_lit "]" Type . +// +func (p *parser) parseArrayType() types.Type { + // "[" already consumed and lookahead known not to be "]" + lit := p.expect(scanner.Int) + p.expect(']') + elem := p.parseType() + n, err := strconv.ParseInt(lit, 10, 64) + if err != nil { + p.error(err) + } + return types.NewArray(elem, n) +} + +// MapType = "map" "[" Type "]" Type . +// +func (p *parser) parseMapType() types.Type { + p.expectKeyword("map") + p.expect('[') + key := p.parseType() + p.expect(']') + elem := p.parseType() + return types.NewMap(key, elem) +} + +// Name = identifier | "?" | QualifiedName . +// +// If materializePkg is set, the returned package is guaranteed to be set. +// For fully qualified names, the returned package may be a fake package +// (without name, scope, and not in the p.imports map), created for the +// sole purpose of providing a package path. Fake packages are created +// when the package id is not found in the p.imports map; in that case +// we cannot create a real package because we don't have a package name. +// For non-qualified names, the returned package is the imported package. +// +func (p *parser) parseName(materializePkg bool) (pkg *types.Package, name string) { + switch p.tok { + case scanner.Ident: + pkg = p.sharedPkgs[p.id] + name = p.lit + p.next() + case '?': + // anonymous + pkg = p.sharedPkgs[p.id] + p.next() + case '@': + // exported name prefixed with package path + var id string + id, name = p.parseQualifiedName() + if materializePkg { + // we don't have a package name - if the package + // doesn't exist yet, create a fake package instead + pkg = p.getPkg(id, "") + if pkg == nil { + pkg = types.NewPackage(id, "") + } + } + default: + p.error("name expected") + } + return +} + +func deref(typ types.Type) types.Type { + if p, _ := typ.(*types.Pointer); p != nil { + return p.Elem() + } + return typ +} + +// Field = Name Type [ string_lit ] . +// +func (p *parser) parseField() (*types.Var, string) { + pkg, name := p.parseName(true) + typ := p.parseType() + anonymous := false + if name == "" { + // anonymous field - typ must be T or *T and T must be a type name + switch typ := deref(typ).(type) { + case *types.Basic: // basic types are named types + pkg = nil + name = typ.Name() + case *types.Named: + name = typ.Obj().Name() + default: + p.errorf("anonymous field expected") + } + anonymous = true + } + tag := "" + if p.tok == scanner.String { + s := p.expect(scanner.String) + var err error + tag, err = strconv.Unquote(s) + if err != nil { + p.errorf("invalid struct tag %s: %s", s, err) + } + } + return types.NewField(token.NoPos, pkg, name, typ, anonymous), tag +} + +// StructType = "struct" "{" [ FieldList ] "}" . +// FieldList = Field { ";" Field } . +// +func (p *parser) parseStructType() types.Type { + var fields []*types.Var + var tags []string + + p.expectKeyword("struct") + p.expect('{') + for i := 0; p.tok != '}' && p.tok != scanner.EOF; i++ { + if i > 0 { + p.expect(';') + } + fld, tag := p.parseField() + if tag != "" && tags == nil { + tags = make([]string, i) + } + if tags != nil { + tags = append(tags, tag) + } + fields = append(fields, fld) + } + p.expect('}') + + return types.NewStruct(fields, tags) +} + +// Parameter = ( identifier | "?" ) [ "..." ] Type [ string_lit ] . +// +func (p *parser) parseParameter() (par *types.Var, isVariadic bool) { + _, name := p.parseName(false) + // remove gc-specific parameter numbering + if i := strings.Index(name, "·"); i >= 0 { + name = name[:i] + } + if p.tok == '.' { + p.expectSpecial("...") + isVariadic = true + } + typ := p.parseType() + if isVariadic { + typ = types.NewSlice(typ) + } + // ignore argument tag (e.g. "noescape") + if p.tok == scanner.String { + p.next() + } + // TODO(gri) should we provide a package? + par = types.NewVar(token.NoPos, nil, name, typ) + return +} + +// Parameters = "(" [ ParameterList ] ")" . +// ParameterList = { Parameter "," } Parameter . +// +func (p *parser) parseParameters() (list []*types.Var, isVariadic bool) { + p.expect('(') + for p.tok != ')' && p.tok != scanner.EOF { + if len(list) > 0 { + p.expect(',') + } + par, variadic := p.parseParameter() + list = append(list, par) + if variadic { + if isVariadic { + p.error("... not on final argument") + } + isVariadic = true + } + } + p.expect(')') + + return +} + +// Signature = Parameters [ Result ] . +// Result = Type | Parameters . +// +func (p *parser) parseSignature(recv *types.Var) *types.Signature { + params, isVariadic := p.parseParameters() + + // optional result type + var results []*types.Var + if p.tok == '(' { + var variadic bool + results, variadic = p.parseParameters() + if variadic { + p.error("... not permitted on result type") + } + } + + return types.NewSignature(recv, types.NewTuple(params...), types.NewTuple(results...), isVariadic) +} + +// InterfaceType = "interface" "{" [ MethodList ] "}" . +// MethodList = Method { ";" Method } . +// Method = Name Signature . +// +// The methods of embedded interfaces are always "inlined" +// by the compiler and thus embedded interfaces are never +// visible in the export data. +// +func (p *parser) parseInterfaceType() types.Type { + var methods []*types.Func + + p.expectKeyword("interface") + p.expect('{') + for i := 0; p.tok != '}' && p.tok != scanner.EOF; i++ { + if i > 0 { + p.expect(';') + } + pkg, name := p.parseName(true) + sig := p.parseSignature(nil) + methods = append(methods, types.NewFunc(token.NoPos, pkg, name, sig)) + } + p.expect('}') + + // Complete requires the type's embedded interfaces to be fully defined, + // but we do not define any + return types.NewInterface(methods, nil).Complete() +} + +// ChanType = ( "chan" [ "<-" ] | "<-" "chan" ) Type . +// +func (p *parser) parseChanType() types.Type { + dir := types.SendRecv + if p.tok == scanner.Ident { + p.expectKeyword("chan") + if p.tok == '<' { + p.expectSpecial("<-") + dir = types.SendOnly + } + } else { + p.expectSpecial("<-") + p.expectKeyword("chan") + dir = types.RecvOnly + } + elem := p.parseType() + return types.NewChan(dir, elem) +} + +// Type = +// BasicType | TypeName | ArrayType | SliceType | StructType | +// PointerType | FuncType | InterfaceType | MapType | ChanType | +// "(" Type ")" . +// +// BasicType = ident . +// TypeName = ExportedName . +// SliceType = "[" "]" Type . +// PointerType = "*" Type . +// FuncType = "func" Signature . +// +func (p *parser) parseType() types.Type { + switch p.tok { + case scanner.Ident: + switch p.lit { + default: + return p.parseBasicType() + case "struct": + return p.parseStructType() + case "func": + // FuncType + p.next() + return p.parseSignature(nil) + case "interface": + return p.parseInterfaceType() + case "map": + return p.parseMapType() + case "chan": + return p.parseChanType() + } + case '@': + // TypeName + pkg, name := p.parseExportedName() + return declTypeName(pkg, name).Type() + case '[': + p.next() // look ahead + if p.tok == ']' { + // SliceType + p.next() + return types.NewSlice(p.parseType()) + } + return p.parseArrayType() + case '*': + // PointerType + p.next() + return types.NewPointer(p.parseType()) + case '<': + return p.parseChanType() + case '(': + // "(" Type ")" + p.next() + typ := p.parseType() + p.expect(')') + return typ + } + p.errorf("expected type, got %s (%q)", scanner.TokenString(p.tok), p.lit) + return nil +} + +// ---------------------------------------------------------------------------- +// Declarations + +// ImportDecl = "import" PackageName PackageId . +// +func (p *parser) parseImportDecl() { + p.expectKeyword("import") + name := p.parsePackageName() + p.getPkg(p.parsePackageId(), name) +} + +// int_lit = [ "+" | "-" ] { "0" ... "9" } . +// +func (p *parser) parseInt() string { + s := "" + switch p.tok { + case '-': + s = "-" + p.next() + case '+': + p.next() + } + return s + p.expect(scanner.Int) +} + +// number = int_lit [ "p" int_lit ] . +// +func (p *parser) parseNumber() (typ *types.Basic, val exact.Value) { + // mantissa + mant := exact.MakeFromLiteral(p.parseInt(), token.INT) + if mant == nil { + panic("invalid mantissa") + } + + if p.lit == "p" { + // exponent (base 2) + p.next() + exp, err := strconv.ParseInt(p.parseInt(), 10, 0) + if err != nil { + p.error(err) + } + if exp < 0 { + denom := exact.MakeInt64(1) + denom = exact.Shift(denom, token.SHL, uint(-exp)) + typ = types.Typ[types.UntypedFloat] + val = exact.BinaryOp(mant, token.QUO, denom) + return + } + if exp > 0 { + mant = exact.Shift(mant, token.SHL, uint(exp)) + } + typ = types.Typ[types.UntypedFloat] + val = mant + return + } + + typ = types.Typ[types.UntypedInt] + val = mant + return +} + +// ConstDecl = "const" ExportedName [ Type ] "=" Literal . +// Literal = bool_lit | int_lit | float_lit | complex_lit | rune_lit | string_lit . +// bool_lit = "true" | "false" . +// complex_lit = "(" float_lit "+" float_lit "i" ")" . +// rune_lit = "(" int_lit "+" int_lit ")" . +// string_lit = `"` { unicode_char } `"` . +// +func (p *parser) parseConstDecl() { + p.expectKeyword("const") + pkg, name := p.parseExportedName() + + var typ0 types.Type + if p.tok != '=' { + typ0 = p.parseType() + } + + p.expect('=') + var typ types.Type + var val exact.Value + switch p.tok { + case scanner.Ident: + // bool_lit + if p.lit != "true" && p.lit != "false" { + p.error("expected true or false") + } + typ = types.Typ[types.UntypedBool] + val = exact.MakeBool(p.lit == "true") + p.next() + + case '-', scanner.Int: + // int_lit + typ, val = p.parseNumber() + + case '(': + // complex_lit or rune_lit + p.next() + if p.tok == scanner.Char { + p.next() + p.expect('+') + typ = types.Typ[types.UntypedRune] + _, val = p.parseNumber() + p.expect(')') + break + } + _, re := p.parseNumber() + p.expect('+') + _, im := p.parseNumber() + p.expectKeyword("i") + p.expect(')') + typ = types.Typ[types.UntypedComplex] + val = exact.BinaryOp(re, token.ADD, exact.MakeImag(im)) + + case scanner.Char: + // rune_lit + typ = types.Typ[types.UntypedRune] + val = exact.MakeFromLiteral(p.lit, token.CHAR) + p.next() + + case scanner.String: + // string_lit + typ = types.Typ[types.UntypedString] + val = exact.MakeFromLiteral(p.lit, token.STRING) + p.next() + + default: + p.errorf("expected literal got %s", scanner.TokenString(p.tok)) + } + + if typ0 == nil { + typ0 = typ + } + + pkg.Scope().Insert(types.NewConst(token.NoPos, pkg, name, typ0, val)) +} + +// TypeDecl = "type" ExportedName Type . +// +func (p *parser) parseTypeDecl() { + p.expectKeyword("type") + pkg, name := p.parseExportedName() + obj := declTypeName(pkg, name) + + // The type object may have been imported before and thus already + // have a type associated with it. We still need to parse the type + // structure, but throw it away if the object already has a type. + // This ensures that all imports refer to the same type object for + // a given type declaration. + typ := p.parseType() + + if name := obj.Type().(*types.Named); name.Underlying() == nil { + name.SetUnderlying(typ) + } +} + +// VarDecl = "var" ExportedName Type . +// +func (p *parser) parseVarDecl() { + p.expectKeyword("var") + pkg, name := p.parseExportedName() + typ := p.parseType() + pkg.Scope().Insert(types.NewVar(token.NoPos, pkg, name, typ)) +} + +// Func = Signature [ Body ] . +// Body = "{" ... "}" . +// +func (p *parser) parseFunc(recv *types.Var) *types.Signature { + sig := p.parseSignature(recv) + if p.tok == '{' { + p.next() + for i := 1; i > 0; p.next() { + switch p.tok { + case '{': + i++ + case '}': + i-- + } + } + } + return sig +} + +// MethodDecl = "func" Receiver Name Func . +// Receiver = "(" ( identifier | "?" ) [ "*" ] ExportedName ")" . +// +func (p *parser) parseMethodDecl() { + // "func" already consumed + p.expect('(') + recv, _ := p.parseParameter() // receiver + p.expect(')') + + // determine receiver base type object + base := deref(recv.Type()).(*types.Named) + + // parse method name, signature, and possibly inlined body + _, name := p.parseName(true) + sig := p.parseFunc(recv) + + // methods always belong to the same package as the base type object + pkg := base.Obj().Pkg() + + // add method to type unless type was imported before + // and method exists already + // TODO(gri) This leads to a quadratic algorithm - ok for now because method counts are small. + base.AddMethod(types.NewFunc(token.NoPos, pkg, name, sig)) +} + +// FuncDecl = "func" ExportedName Func . +// +func (p *parser) parseFuncDecl() { + // "func" already consumed + pkg, name := p.parseExportedName() + typ := p.parseFunc(nil) + pkg.Scope().Insert(types.NewFunc(token.NoPos, pkg, name, typ)) +} + +// Decl = [ ImportDecl | ConstDecl | TypeDecl | VarDecl | FuncDecl | MethodDecl ] "\n" . +// +func (p *parser) parseDecl() { + if p.tok == scanner.Ident { + switch p.lit { + case "import": + p.parseImportDecl() + case "const": + p.parseConstDecl() + case "type": + p.parseTypeDecl() + case "var": + p.parseVarDecl() + case "func": + p.next() // look ahead + if p.tok == '(' { + p.parseMethodDecl() + } else { + p.parseFuncDecl() + } + } + } + p.expect('\n') +} + +// ---------------------------------------------------------------------------- +// Export + +// Export = "PackageClause { Decl } "$$" . +// PackageClause = "package" PackageName [ "safe" ] "\n" . +// +func (p *parser) parseExport() *types.Package { + p.expectKeyword("package") + name := p.parsePackageName() + if p.tok == scanner.Ident && p.lit == "safe" { + // package was compiled with -u option - ignore + p.next() + } + p.expect('\n') + + pkg := p.getPkg(p.id, name) + + for p.tok != '$' && p.tok != scanner.EOF { + p.parseDecl() + } + + if ch := p.scanner.Peek(); p.tok != '$' || ch != '$' { + // don't call next()/expect() since reading past the + // export data may cause scanner errors (e.g. NUL chars) + p.errorf("expected '$$', got %s %c", scanner.TokenString(p.tok), ch) + } + + if n := p.scanner.ErrorCount; n != 0 { + p.errorf("expected no scanner errors, got %d", n) + } + + // Record all referenced packages as imports. + var imports []*types.Package + for id, pkg2 := range p.localPkgs { + if id == p.id { + continue // avoid self-edge + } + imports = append(imports, pkg2) + } + sort.Sort(byPath(imports)) + pkg.SetImports(imports) + + // package was imported completely and without errors + pkg.MarkComplete() + + return pkg +} + +type byPath []*types.Package + +func (a byPath) Len() int { return len(a) } +func (a byPath) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byPath) Less(i, j int) bool { return a[i].Path() < a[j].Path() } diff --git a/vendor/golang.org/x/tools/go/gcimporter/gcimporter_test.go b/vendor/golang.org/x/tools/go/gcimporter/gcimporter_test.go new file mode 100644 index 0000000000..73a4747fc7 --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcimporter/gcimporter_test.go @@ -0,0 +1,242 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package gcimporter + +import ( + "fmt" + "go/build" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "testing" + "time" + + "golang.org/x/tools/go/types" +) + +// skipSpecialPlatforms causes the test to be skipped for platforms where +// builders (build.golang.org) don't have access to compiled packages for +// import. +func skipSpecialPlatforms(t *testing.T) { + switch platform := runtime.GOOS + "-" + runtime.GOARCH; platform { + case "nacl-amd64p32", + "nacl-386", + "nacl-arm", + "darwin-arm", + "darwin-arm64": + t.Skipf("no compiled packages available for import on %s", platform) + } +} + +var gcPath string // Go compiler path + +func init() { + if char, err := build.ArchChar(runtime.GOARCH); err == nil { + gcPath = filepath.Join(build.ToolDir, char+"g") + return + } + gcPath = "unknown-GOARCH-compiler" +} + +func compile(t *testing.T, dirname, filename string) string { + cmd := exec.Command(gcPath, filename) + cmd.Dir = dirname + out, err := cmd.CombinedOutput() + if err != nil { + t.Logf("%s", out) + t.Fatalf("%s %s failed: %s", gcPath, filename, err) + } + archCh, _ := build.ArchChar(runtime.GOARCH) + // filename should end with ".go" + return filepath.Join(dirname, filename[:len(filename)-2]+archCh) +} + +// Use the same global imports map for all tests. The effect is +// as if all tested packages were imported into a single package. +var imports = make(map[string]*types.Package) + +func testPath(t *testing.T, path string) *types.Package { + t0 := time.Now() + pkg, err := Import(imports, path) + if err != nil { + t.Errorf("testPath(%s): %s", path, err) + return nil + } + t.Logf("testPath(%s): %v", path, time.Since(t0)) + return pkg +} + +const maxTime = 30 * time.Second + +func testDir(t *testing.T, dir string, endTime time.Time) (nimports int) { + dirname := filepath.Join(runtime.GOROOT(), "pkg", runtime.GOOS+"_"+runtime.GOARCH, dir) + list, err := ioutil.ReadDir(dirname) + if err != nil { + t.Fatalf("testDir(%s): %s", dirname, err) + } + for _, f := range list { + if time.Now().After(endTime) { + t.Log("testing time used up") + return + } + switch { + case !f.IsDir(): + // try extensions + for _, ext := range pkgExts { + if strings.HasSuffix(f.Name(), ext) { + name := f.Name()[0 : len(f.Name())-len(ext)] // remove extension + if testPath(t, filepath.Join(dir, name)) != nil { + nimports++ + } + } + } + case f.IsDir(): + nimports += testDir(t, filepath.Join(dir, f.Name()), endTime) + } + } + return +} + +func TestImport(t *testing.T) { + // This package only handles gc export data. + if runtime.Compiler != "gc" { + t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler) + return + } + + // On cross-compile builds, the path will not exist. + // Need to use GOHOSTOS, which is not available. + if _, err := os.Stat(gcPath); err != nil { + t.Skipf("skipping test: %v", err) + } + + if outFn := compile(t, "testdata", "exports.go"); outFn != "" { + defer os.Remove(outFn) + } + + nimports := 0 + if pkg := testPath(t, "./testdata/exports"); pkg != nil { + nimports++ + // The package's Imports should include all the types + // referenced by the exportdata, which may be more than + // the import statements in the package's source, but + // fewer than the transitive closure of dependencies. + want := `[package ast ("go/ast") package token ("go/token") package runtime ("runtime")]` + got := fmt.Sprint(pkg.Imports()) + if got != want { + t.Errorf(`Package("exports").Imports() = %s, want %s`, got, want) + } + } + nimports += testDir(t, "", time.Now().Add(maxTime)) // installed packages + t.Logf("tested %d imports", nimports) +} + +var importedObjectTests = []struct { + name string + want string +}{ + {"unsafe.Pointer", "type Pointer unsafe.Pointer"}, + {"math.Pi", "const Pi untyped float"}, + {"io.Reader", "type Reader interface{Read(p []byte) (n int, err error)}"}, + {"io.ReadWriter", "type ReadWriter interface{Read(p []byte) (n int, err error); Write(p []byte) (n int, err error)}"}, + {"math.Sin", "func Sin(x float64) float64"}, + // TODO(gri) add more tests +} + +func TestImportedTypes(t *testing.T) { + skipSpecialPlatforms(t) + + // This package only handles gc export data. + if runtime.Compiler != "gc" { + t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler) + return + } + + for _, test := range importedObjectTests { + s := strings.Split(test.name, ".") + if len(s) != 2 { + t.Fatal("inconsistent test data") + } + importPath := s[0] + objName := s[1] + + pkg, err := Import(imports, importPath) + if err != nil { + t.Error(err) + continue + } + + obj := pkg.Scope().Lookup(objName) + if obj == nil { + t.Errorf("%s: object not found", test.name) + continue + } + + got := types.ObjectString(obj, types.RelativeTo(pkg)) + if got != test.want { + t.Errorf("%s: got %q; want %q", test.name, got, test.want) + } + } +} + +func TestIssue5815(t *testing.T) { + skipSpecialPlatforms(t) + + // This package only handles gc export data. + if runtime.Compiler != "gc" { + t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler) + return + } + + pkg, err := Import(make(map[string]*types.Package), "strings") + if err != nil { + t.Fatal(err) + } + + scope := pkg.Scope() + for _, name := range scope.Names() { + obj := scope.Lookup(name) + if obj.Pkg() == nil { + t.Errorf("no pkg for %s", obj) + } + if tname, _ := obj.(*types.TypeName); tname != nil { + named := tname.Type().(*types.Named) + for i := 0; i < named.NumMethods(); i++ { + m := named.Method(i) + if m.Pkg() == nil { + t.Errorf("no pkg for %s", m) + } + } + } + } +} + +// Smoke test to ensure that imported methods get the correct package. +func TestCorrectMethodPackage(t *testing.T) { + skipSpecialPlatforms(t) + + // This package only handles gc export data. + if runtime.Compiler != "gc" { + t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler) + return + } + + imports := make(map[string]*types.Package) + _, err := Import(imports, "net/http") + if err != nil { + t.Fatal(err) + } + + mutex := imports["sync"].Scope().Lookup("Mutex").(*types.TypeName).Type() + mset := types.NewMethodSet(types.NewPointer(mutex)) // methods of *sync.Mutex + sel := mset.Lookup(nil, "Lock") + lock := sel.Obj().(*types.Func) + if got, want := lock.Pkg().Path(), "sync"; got != want { + t.Errorf("got package path %q; want %q", got, want) + } +} diff --git a/vendor/golang.org/x/tools/go/gcimporter/testdata/exports.go b/vendor/golang.org/x/tools/go/gcimporter/testdata/exports.go new file mode 100644 index 0000000000..8ee28b0942 --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcimporter/testdata/exports.go @@ -0,0 +1,89 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file is used to generate an object file which +// serves as test file for gcimporter_test.go. + +package exports + +import ( + "go/ast" +) + +// Issue 3682: Correctly read dotted identifiers from export data. +const init1 = 0 + +func init() {} + +const ( + C0 int = 0 + C1 = 3.14159265 + C2 = 2.718281828i + C3 = -123.456e-789 + C4 = +123.456E+789 + C5 = 1234i + C6 = "foo\n" + C7 = `bar\n` +) + +type ( + T1 int + T2 [10]int + T3 []int + T4 *int + T5 chan int + T6a chan<- int + T6b chan (<-chan int) + T6c chan<- (chan int) + T7 <-chan *ast.File + T8 struct{} + T9 struct { + a int + b, c float32 + d []string `go:"tag"` + } + T10 struct { + T8 + T9 + _ *T10 + } + T11 map[int]string + T12 interface{} + T13 interface { + m1() + m2(int) float32 + } + T14 interface { + T12 + T13 + m3(x ...struct{}) []T9 + } + T15 func() + T16 func(int) + T17 func(x int) + T18 func() float32 + T19 func() (x float32) + T20 func(...interface{}) + T21 struct{ next *T21 } + T22 struct{ link *T23 } + T23 struct{ link *T22 } + T24 *T24 + T25 *T26 + T26 *T27 + T27 *T25 + T28 func(T28) T28 +) + +var ( + V0 int + V1 = -991.0 +) + +func F1() {} +func F2(x int) {} +func F3() int { return 0 } +func F4() float32 { return 0 } +func F5(a, b, c int, u, v, w struct{ x, y T1 }, more ...interface{}) (p, q, r chan<- T10) + +func (p *T1) M1() diff --git a/vendor/golang.org/x/tools/go/gcimporter15/bexport.go b/vendor/golang.org/x/tools/go/gcimporter15/bexport.go new file mode 100644 index 0000000000..36bcf0351c --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcimporter15/bexport.go @@ -0,0 +1,702 @@ +// Copyright 2016 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 + +// Binary package export. +// This file was derived from $GOROOT/src/cmd/compile/internal/gc/bexport.go; +// see that file for specification of the format. + +package gcimporter + +import ( + "bytes" + "encoding/binary" + "fmt" + "go/ast" + "go/constant" + "go/types" + "log" + "math" + "math/big" + "sort" + "strings" +) + +const exportVersion = "v0" + +const ( + debugFormat = false // use debugging format for export data (emits a lot of additional data) + trace = false +) + +// BExportData returns binary export data for pkg. +func BExportData(pkg *types.Package) []byte { + p := exporter{ + pkgIndex: make(map[*types.Package]int), + typIndex: make(map[types.Type]int), + } + + // write low-level encoding format + var format byte = 'c' // compact + if debugFormat { + format = 'd' + } + p.byte(format) + + // --- generic export data --- + + if trace { + p.tracef("\n--- generic export data ---\n") + if p.indent != 0 { + log.Fatalf("incorrect indentation %d", p.indent) + } + } + + p.string(exportVersion) + if trace { + p.tracef("\n") + } + + // populate type map with predeclared "known" types + for index, typ := range predeclared { + p.typIndex[typ] = index + } + if len(p.typIndex) != len(predeclared) { + log.Fatalf("duplicate entries in type map?") + } + + // write package data + p.pkg(pkg, true) + + // write compiler-specific flags + p.string("") + + if trace { + p.tracef("\n") + } + + // Collect objects to export, already sorted by name. + var consts []*types.Const + var vars []*types.Var + var funcs []*types.Func + var typs []*types.TypeName + scope := pkg.Scope() + for _, name := range scope.Names() { + if !ast.IsExported(name) { + continue + } + switch obj := scope.Lookup(name).(type) { + case *types.Const: + consts = append(consts, obj) + case *types.Var: + vars = append(vars, obj) + case *types.Func: + funcs = append(funcs, obj) + case *types.TypeName: + typs = append(typs, obj) + } + } + + // write consts + p.int(len(consts)) + for _, obj := range consts { + p.string(obj.Name()) + p.typ(obj.Type()) + p.value(obj.Val()) + } + + // write vars + p.int(len(vars)) + for _, obj := range vars { + p.string(obj.Name()) + p.typ(obj.Type()) + } + + // write funcs + p.int(len(funcs)) + for _, obj := range funcs { + p.string(obj.Name()) + sig := obj.Type().(*types.Signature) + p.paramList(sig.Params(), sig.Variadic()) + p.paramList(sig.Results(), false) + p.int(-1) // no inlined function bodies + } + + // Determine which types are still left to write. + i := 0 + for _, t := range typs { + if _, ok := p.typIndex[t.Type()]; !ok { + typs[i] = t + i++ + } + } + typs = typs[:i] + + // Write types. + p.int(len(typs)) + for _, t := range typs { + // Writing a type may further reduce the number of types + // that are left to be written, but at this point we don't + // care. + p.typ(t.Type()) + } + + if trace { + p.tracef("\n") + } + + // --- compiler-specific export data --- + + if trace { + p.tracef("\n--- compiler specific export data ---\n") + if p.indent != 0 { + log.Fatalf("incorrect indentation") + } + } + + if trace { + p.tracef("\n") + } + + // --- end of export data --- + + return p.out.Bytes() +} + +type exporter struct { + out bytes.Buffer + pkgIndex map[*types.Package]int + typIndex map[types.Type]int + + written int // bytes written + indent int // for trace + trace bool +} + +func (p *exporter) pkg(pkg *types.Package, emptypath bool) { + if pkg == nil { + log.Fatalf("unexpected nil pkg") + } + + // if we saw the package before, write its index (>= 0) + if i, ok := p.pkgIndex[pkg]; ok { + p.index('P', i) + return + } + + // otherwise, remember the package, write the package tag (< 0) and package data + if trace { + p.tracef("P%d = { ", len(p.pkgIndex)) + defer p.tracef("} ") + } + p.pkgIndex[pkg] = len(p.pkgIndex) + + p.tag(packageTag) + p.string(pkg.Name()) + if emptypath { + p.string("") + } else { + p.string(pkg.Path()) + } +} + +func (p *exporter) typ(t types.Type) { + if t == nil { + log.Fatalf("nil type") + } + + // Possible optimization: Anonymous pointer types *T where + // T is a named type are common. We could canonicalize all + // such types *T to a single type PT = *T. This would lead + // to at most one *T entry in typIndex, and all future *T's + // would be encoded as the respective index directly. Would + // save 1 byte (pointerTag) per *T and reduce the typIndex + // size (at the cost of a canonicalization map). We can do + // this later, without encoding format change. + + // if we saw the type before, write its index (>= 0) + if i, ok := p.typIndex[t]; ok { + p.index('T', i) + return + } + + // otherwise, remember the type, write the type tag (< 0) and type data + index := len(p.typIndex) + if trace { + p.tracef("T%d = {>\n", index) + defer p.tracef("<\n} ") + } + p.typIndex[t] = index + + switch t := t.(type) { + case *types.Named: + p.tag(namedTag) + p.qualifiedName(t.Obj()) + p.typ(t.Underlying()) + if !types.IsInterface(t) { + p.declaredMethods(t) + } + + case *types.Array: + p.tag(arrayTag) + p.int64(t.Len()) + p.typ(t.Elem()) + + case *types.Slice: + p.tag(sliceTag) + p.typ(t.Elem()) + + case *dddSlice: + p.tag(dddTag) + p.typ(t.elem) + + case *types.Struct: + p.tag(structTag) + p.fieldList(t) + + case *types.Pointer: + p.tag(pointerTag) + p.typ(t.Elem()) + + case *types.Signature: + p.tag(signatureTag) + p.paramList(t.Params(), t.Variadic()) + p.paramList(t.Results(), false) + + case *types.Interface: + p.tag(interfaceTag) + p.iface(t) + + case *types.Map: + p.tag(mapTag) + p.typ(t.Key()) + p.typ(t.Elem()) + + case *types.Chan: + p.tag(chanTag) + p.int(int(3 - t.Dir())) // hack + p.typ(t.Elem()) + + default: + log.Fatalf("unexpected type %T: %s", t, t) + } +} + +func (p *exporter) declaredMethods(named *types.Named) { + p.int(named.NumMethods()) + + // Sort methods (for determinism). + var methods []*types.Func + for i := 0; i < named.NumMethods(); i++ { + methods = append(methods, named.Method(i)) + } + sort.Sort(methodsByName(methods)) + + if trace && methods != nil { + p.tracef("associated methods {>\n") + } + + for i, m := range methods { + if trace && i > 0 { + p.tracef("\n") + } + p.string(m.Name()) + sig := m.Type().(*types.Signature) + p.recv(sig.Recv()) + p.paramList(sig.Params(), sig.Variadic()) + p.paramList(sig.Results(), false) + p.int(-1) // no inlining + } + + if trace && methods != nil { + p.tracef("<\n} ") + } +} + +type methodsByName []*types.Func + +func (x methodsByName) Len() int { return len(x) } +func (x methodsByName) Swap(i, j int) { x[i], x[j] = x[j], x[i] } +func (x methodsByName) Less(i, j int) bool { return x[i].Name() < x[j].Name() } + +func (p *exporter) recv(recv *types.Var) { + // Use negative length to indicate unnamed parameter. + if recv.Name() == "" { + p.int(-1) + p.typ(recv.Type()) + } else { + p.int(1) + p.typ(recv.Type()) + p.string(recv.Name()) + } + p.string("") +} + +func (p *exporter) qualifiedName(obj types.Object) { + p.string(obj.Name()) + p.pkg(obj.Pkg(), false) +} + +func (p *exporter) fieldList(t *types.Struct) { + if trace && t.NumFields() > 0 { + p.tracef("fields {>\n") + defer p.tracef("<\n} ") + } + + p.int(t.NumFields()) + for i := 0; i < t.NumFields(); i++ { + if trace && i > 0 { + p.tracef("\n") + } + p.field(t.Field(i)) + p.string(t.Tag(i)) + } +} + +func (p *exporter) field(f *types.Var) { + if !f.IsField() { + log.Fatalf("field expected") + } + + p.fieldName(f) + p.typ(f.Type()) +} + +func (p *exporter) iface(t *types.Interface) { + // TODO(gri): enable importer to load embedded interfaces, + // then emit Embeddeds and ExplicitMethods separately here. + p.int(0) + + n := t.NumMethods() + if trace && n > 0 { + p.tracef("methods {>\n") + defer p.tracef("<\n} ") + } + p.int(n) + for i := 0; i < n; i++ { + if trace && i > 0 { + p.tracef("\n") + } + p.method(t.Method(i)) + } +} + +func (p *exporter) method(m *types.Func) { + sig := m.Type().(*types.Signature) + if sig.Recv() == nil { + log.Fatalf("method expected") + } + + p.string(m.Name()) + if m.Name() != "_" && !ast.IsExported(m.Name()) { + p.pkg(m.Pkg(), false) + } + + // interface method; no need to encode receiver. + p.paramList(sig.Params(), sig.Variadic()) + p.paramList(sig.Results(), false) +} + +// fieldName is like qualifiedName but it doesn't record the package +// for blank (_) or exported names. +func (p *exporter) fieldName(f *types.Var) { + name := f.Name() + + // anonymous field with unexported base type name: use "?" as field name + // (bname != "" per spec, but we are conservative in case of errors) + if f.Anonymous() { + base := f.Type() + if ptr, ok := base.(*types.Pointer); ok { + base = ptr.Elem() + } + if named, ok := base.(*types.Named); ok && !named.Obj().Exported() { + name = "?" + } + } + + p.string(name) + if name == "?" || name != "_" && !f.Exported() { + p.pkg(f.Pkg(), false) + } +} + +func (p *exporter) paramList(params *types.Tuple, variadic bool) { + // use negative length to indicate unnamed parameters + // (look at the first parameter only since either all + // names are present or all are absent) + n := params.Len() + if n > 0 && params.At(0).Name() == "" { + n = -n + } + p.int(n) + for i := 0; i < params.Len(); i++ { + q := params.At(i) + t := q.Type() + if variadic && i == params.Len()-1 { + t = &dddSlice{t.(*types.Slice).Elem()} + } + p.typ(t) + if n > 0 { + p.string(q.Name()) + } + p.string("") + } +} + +func (p *exporter) value(x constant.Value) { + if trace { + p.tracef("= ") + } + + switch x.Kind() { + case constant.Bool: + tag := falseTag + if constant.BoolVal(x) { + tag = trueTag + } + p.tag(tag) + + case constant.Int: + if v, exact := constant.Int64Val(x); exact { + // common case: x fits into an int64 - use compact encoding + p.tag(int64Tag) + p.int64(v) + return + } + // uncommon case: large x - use float encoding + // (powers of 2 will be encoded efficiently with exponent) + p.tag(floatTag) + p.float(constant.ToFloat(x)) + + case constant.Float: + p.tag(floatTag) + p.float(x) + + case constant.Complex: + p.tag(complexTag) + p.float(constant.Real(x)) + p.float(constant.Imag(x)) + + case constant.String: + p.tag(stringTag) + p.string(constant.StringVal(x)) + + case constant.Unknown: + // (Package contains type errors.) + p.tag(unknownTag) + + default: + log.Fatalf("unexpected value %v (%T)", x, x) + } +} + +func (p *exporter) float(x constant.Value) { + if x.Kind() != constant.Float { + log.Fatalf("unexpected constant %v, want float", x) + } + // extract sign (there is no -0) + sign := constant.Sign(x) + if sign == 0 { + // x == 0 + p.int(0) + return + } + // x != 0 + + var f big.Float + if v, exact := constant.Float64Val(x); exact { + // float64 + f.SetFloat64(v) + } else if num, denom := constant.Num(x), constant.Denom(x); num.Kind() == constant.Int { + // TODO(gri): add big.Rat accessor to constant.Value. + r := valueToRat(num) + f.SetRat(r.Quo(r, valueToRat(denom))) + } else { + // Value too large to represent as a fraction => inaccessible. + // TODO(gri): add big.Float accessor to constant.Value. + f.SetFloat64(math.MaxFloat64) // FIXME + } + + // extract exponent such that 0.5 <= m < 1.0 + var m big.Float + exp := f.MantExp(&m) + + // extract mantissa as *big.Int + // - set exponent large enough so mant satisfies mant.IsInt() + // - get *big.Int from mant + m.SetMantExp(&m, int(m.MinPrec())) + mant, acc := m.Int(nil) + if acc != big.Exact { + log.Fatalf("internal error") + } + + p.int(sign) + p.int(exp) + p.string(string(mant.Bytes())) +} + +func valueToRat(x constant.Value) *big.Rat { + // Convert little-endian to big-endian. + // I can't believe this is necessary. + bytes := constant.Bytes(x) + for i := 0; i < len(bytes)/2; i++ { + bytes[i], bytes[len(bytes)-1-i] = bytes[len(bytes)-1-i], bytes[i] + } + return new(big.Rat).SetInt(new(big.Int).SetBytes(bytes)) +} + +// ---------------------------------------------------------------------------- +// Low-level encoders + +func (p *exporter) index(marker byte, index int) { + if index < 0 { + log.Fatalf("invalid index < 0") + } + if debugFormat { + p.marker('t') + } + if trace { + p.tracef("%c%d ", marker, index) + } + p.rawInt64(int64(index)) +} + +func (p *exporter) tag(tag int) { + if tag >= 0 { + log.Fatalf("invalid tag >= 0") + } + if debugFormat { + p.marker('t') + } + if trace { + p.tracef("%s ", tagString[-tag]) + } + p.rawInt64(int64(tag)) +} + +func (p *exporter) int(x int) { + p.int64(int64(x)) +} + +func (p *exporter) int64(x int64) { + if debugFormat { + p.marker('i') + } + if trace { + p.tracef("%d ", x) + } + p.rawInt64(x) +} + +func (p *exporter) string(s string) { + if debugFormat { + p.marker('s') + } + if trace { + p.tracef("%q ", s) + } + p.rawInt64(int64(len(s))) + for i := 0; i < len(s); i++ { + p.byte(s[i]) + } +} + +// marker emits a marker byte and position information which makes +// it easy for a reader to detect if it is "out of sync". Used for +// debugFormat format only. +func (p *exporter) marker(m byte) { + p.byte(m) + p.rawInt64(int64(p.written)) +} + +// rawInt64 should only be used by low-level encoders +func (p *exporter) rawInt64(x int64) { + var tmp [binary.MaxVarintLen64]byte + n := binary.PutVarint(tmp[:], x) + for i := 0; i < n; i++ { + p.byte(tmp[i]) + } +} + +// byte is the bottleneck interface to write to p.out. +// byte escapes b as follows (any encoding does that +// hides '$'): +// +// '$' => '|' 'S' +// '|' => '|' '|' +// +// Necessary so other tools can find the end of the +// export data by searching for "$$". +func (p *exporter) byte(b byte) { + switch b { + case '$': + // write '$' as '|' 'S' + b = 'S' + fallthrough + case '|': + // write '|' as '|' '|' + p.out.WriteByte('|') + p.written++ + } + p.out.WriteByte(b) + p.written++ +} + +// tracef is like fmt.Printf but it rewrites the format string +// to take care of indentation. +func (p *exporter) tracef(format string, args ...interface{}) { + if strings.IndexAny(format, "<>\n") >= 0 { + var buf bytes.Buffer + for i := 0; i < len(format); i++ { + // no need to deal with runes + ch := format[i] + switch ch { + case '>': + p.indent++ + continue + case '<': + p.indent-- + continue + } + buf.WriteByte(ch) + if ch == '\n' { + for j := p.indent; j > 0; j-- { + buf.WriteString(". ") + } + } + } + format = buf.String() + } + fmt.Printf(format, args...) +} + +// Debugging support. +// (tagString is only used when tracing is enabled) +var tagString = [...]string{ + // Packages: + -packageTag: "package", + + // Types: + -namedTag: "named type", + -arrayTag: "array", + -sliceTag: "slice", + -dddTag: "ddd", + -structTag: "struct", + -pointerTag: "pointer", + -signatureTag: "signature", + -interfaceTag: "interface", + -mapTag: "map", + -chanTag: "chan", + + // Values: + -falseTag: "false", + -trueTag: "true", + -int64Tag: "int64", + -floatTag: "float", + -fractionTag: "fraction", + -complexTag: "complex", + -stringTag: "string", + -unknownTag: "unknown", +} diff --git a/vendor/golang.org/x/tools/go/gcimporter15/bexport_test.go b/vendor/golang.org/x/tools/go/gcimporter15/bexport_test.go new file mode 100644 index 0000000000..81a1154979 --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcimporter15/bexport_test.go @@ -0,0 +1,275 @@ +// Copyright 2016 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 gcimporter_test + +import ( + "fmt" + "go/ast" + "go/build" + "go/constant" + "go/token" + "go/types" + "reflect" + "runtime" + "testing" + + "golang.org/x/tools/go/buildutil" + gcimporter "golang.org/x/tools/go/gcimporter15" + "golang.org/x/tools/go/loader" +) + +func TestBExportData_stdlib(t *testing.T) { + if runtime.GOOS == "android" { + t.Skipf("incomplete std lib on %s", runtime.GOOS) + } + + // Load, parse and type-check the program. + ctxt := build.Default // copy + ctxt.GOPATH = "" // disable GOPATH + conf := loader.Config{ + Build: &ctxt, + AllowErrors: true, + } + for _, path := range buildutil.AllPackages(conf.Build) { + conf.Import(path) + } + + // Create a package containing type and value errors to ensure + // they are properly encoded/decoded. + f, err := conf.ParseFile("haserrors/haserrors.go", `package haserrors +const UnknownValue = "" + 0 +type UnknownType undefined +`) + if err != nil { + t.Fatal(err) + } + conf.CreateFromFiles("haserrors", f) + + prog, err := conf.Load() + if err != nil { + t.Fatalf("Load failed: %v", err) + } + + numPkgs := len(prog.AllPackages) + if want := 248; numPkgs < want { + t.Errorf("Loaded only %d packages, want at least %d", numPkgs, want) + } + + for pkg, info := range prog.AllPackages { + if info.Files == nil { + continue // empty directory + } + exportdata := gcimporter.BExportData(pkg) + + imports := make(map[string]*types.Package) + n, pkg2, err := gcimporter.BImportData(imports, exportdata, pkg.Path()) + if err != nil { + t.Errorf("BImportData(%s): %v", pkg.Path(), err) + continue + } + if n != len(exportdata) { + t.Errorf("BImportData(%s) decoded %d bytes, want %d", + pkg.Path(), n, len(exportdata)) + } + + // Compare the packages' corresponding members. + for _, name := range pkg.Scope().Names() { + if !ast.IsExported(name) { + continue + } + obj1 := pkg.Scope().Lookup(name) + obj2 := pkg2.Scope().Lookup(name) + if obj2 == nil { + t.Errorf("%s.%s not found, want %s", pkg.Path(), name, obj1) + continue + } + if err := equalObj(obj1, obj2); err != nil { + t.Errorf("%s.%s: %s\ngot: %s\nwant: %s", + pkg.Path(), name, err, obj2, obj1) + } + } + } +} + +// equalObj reports how x and y differ. They are assumed to belong to +// different universes so cannot be compared directly. +func equalObj(x, y types.Object) error { + if reflect.TypeOf(x) != reflect.TypeOf(y) { + return fmt.Errorf("%T vs %T", x, y) + } + xt := x.Type() + yt := y.Type() + switch x.(type) { + case *types.Var, *types.Func: + // ok + case *types.Const: + xval := x.(*types.Const).Val() + yval := y.(*types.Const).Val() + // Use string comparison for floating-point values since rounding is permitted. + if constant.Compare(xval, token.NEQ, yval) && + !(xval.Kind() == constant.Float && xval.String() == yval.String()) { + return fmt.Errorf("unequal constants %s vs %s", xval, yval) + } + case *types.TypeName: + xt = xt.Underlying() + yt = yt.Underlying() + default: + return fmt.Errorf("unexpected %T", x) + } + return equalType(xt, yt) +} + +func equalType(x, y types.Type) error { + if reflect.TypeOf(x) != reflect.TypeOf(y) { + return fmt.Errorf("unequal kinds: %T vs %T", x, y) + } + switch x := x.(type) { + case *types.Interface: + y := y.(*types.Interface) + // TODO(gri): enable separate emission of Embedded interfaces + // and ExplicitMethods then use this logic. + // if x.NumEmbeddeds() != y.NumEmbeddeds() { + // return fmt.Errorf("unequal number of embedded interfaces: %d vs %d", + // x.NumEmbeddeds(), y.NumEmbeddeds()) + // } + // for i := 0; i < x.NumEmbeddeds(); i++ { + // xi := x.Embedded(i) + // yi := y.Embedded(i) + // if xi.String() != yi.String() { + // return fmt.Errorf("mismatched %th embedded interface: %s vs %s", + // i, xi, yi) + // } + // } + // if x.NumExplicitMethods() != y.NumExplicitMethods() { + // return fmt.Errorf("unequal methods: %d vs %d", + // x.NumExplicitMethods(), y.NumExplicitMethods()) + // } + // for i := 0; i < x.NumExplicitMethods(); i++ { + // xm := x.ExplicitMethod(i) + // ym := y.ExplicitMethod(i) + // if xm.Name() != ym.Name() { + // return fmt.Errorf("mismatched %th method: %s vs %s", i, xm, ym) + // } + // if err := equalType(xm.Type(), ym.Type()); err != nil { + // return fmt.Errorf("mismatched %s method: %s", xm.Name(), err) + // } + // } + if x.NumMethods() != y.NumMethods() { + return fmt.Errorf("unequal methods: %d vs %d", + x.NumMethods(), y.NumMethods()) + } + for i := 0; i < x.NumMethods(); i++ { + xm := x.Method(i) + ym := y.Method(i) + if xm.Name() != ym.Name() { + return fmt.Errorf("mismatched %dth method: %s vs %s", i, xm, ym) + } + if err := equalType(xm.Type(), ym.Type()); err != nil { + return fmt.Errorf("mismatched %s method: %s", xm.Name(), err) + } + } + case *types.Array: + y := y.(*types.Array) + if x.Len() != y.Len() { + return fmt.Errorf("unequal array lengths: %d vs %d", x.Len(), y.Len()) + } + if err := equalType(x.Elem(), y.Elem()); err != nil { + return fmt.Errorf("array elements: %s", err) + } + case *types.Basic: + y := y.(*types.Basic) + if x.Kind() != y.Kind() { + return fmt.Errorf("unequal basic types: %s vs %s", x, y) + } + case *types.Chan: + y := y.(*types.Chan) + if x.Dir() != y.Dir() { + return fmt.Errorf("unequal channel directions: %d vs %d", x.Dir(), y.Dir()) + } + if err := equalType(x.Elem(), y.Elem()); err != nil { + return fmt.Errorf("channel elements: %s", err) + } + case *types.Map: + y := y.(*types.Map) + if err := equalType(x.Key(), y.Key()); err != nil { + return fmt.Errorf("map keys: %s", err) + } + if err := equalType(x.Elem(), y.Elem()); err != nil { + return fmt.Errorf("map values: %s", err) + } + case *types.Named: + y := y.(*types.Named) + if x.String() != y.String() { + return fmt.Errorf("unequal named types: %s vs %s", x, y) + } + case *types.Pointer: + y := y.(*types.Pointer) + if err := equalType(x.Elem(), y.Elem()); err != nil { + return fmt.Errorf("pointer elements: %s", err) + } + case *types.Signature: + y := y.(*types.Signature) + if err := equalType(x.Params(), y.Params()); err != nil { + return fmt.Errorf("parameters: %s", err) + } + if err := equalType(x.Results(), y.Results()); err != nil { + return fmt.Errorf("results: %s", err) + } + if x.Variadic() != y.Variadic() { + return fmt.Errorf("unequal varidicity: %t vs %t", + x.Variadic(), y.Variadic()) + } + if (x.Recv() != nil) != (y.Recv() != nil) { + return fmt.Errorf("unequal receivers: %s vs %s", x.Recv(), y.Recv()) + } + if x.Recv() != nil { + // TODO(adonovan): fix: this assertion fires for interface methods. + // The type of the receiver of an interface method is a named type + // if the Package was loaded from export data, or an unnamed (interface) + // type if the Package was produced by type-checking ASTs. + // if err := equalType(x.Recv().Type(), y.Recv().Type()); err != nil { + // return fmt.Errorf("receiver: %s", err) + // } + } + case *types.Slice: + y := y.(*types.Slice) + if err := equalType(x.Elem(), y.Elem()); err != nil { + return fmt.Errorf("slice elements: %s", err) + } + case *types.Struct: + y := y.(*types.Struct) + if x.NumFields() != y.NumFields() { + return fmt.Errorf("unequal struct fields: %d vs %d", + x.NumFields(), y.NumFields()) + } + for i := 0; i < x.NumFields(); i++ { + xf := x.Field(i) + yf := y.Field(i) + if xf.Name() != yf.Name() { + return fmt.Errorf("mismatched fields: %s vs %s", xf, yf) + } + if err := equalType(xf.Type(), yf.Type()); err != nil { + return fmt.Errorf("struct field %s: %s", xf.Name(), err) + } + if x.Tag(i) != y.Tag(i) { + return fmt.Errorf("struct field %s has unequal tags: %q vs %q", + xf.Name(), x.Tag(i), y.Tag(i)) + } + } + case *types.Tuple: + y := y.(*types.Tuple) + if x.Len() != y.Len() { + return fmt.Errorf("unequal tuple lengths: %d vs %d", x.Len(), y.Len()) + } + for i := 0; i < x.Len(); i++ { + if err := equalType(x.At(i).Type(), y.At(i).Type()); err != nil { + return fmt.Errorf("tuple element %d: %s", i, err) + } + } + } + return nil +} diff --git a/vendor/golang.org/x/tools/go/gcimporter15/bimport.go b/vendor/golang.org/x/tools/go/gcimporter15/bimport.go new file mode 100644 index 0000000000..0d725f6ece --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcimporter15/bimport.go @@ -0,0 +1,702 @@ +// 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.5 + +// This file is a copy of $GOROOT/src/go/internal/gcimporter/bimport.go, tagged for go1.5. + +package gcimporter + +import ( + "encoding/binary" + "fmt" + "go/constant" + "go/token" + "go/types" + "sort" + "unicode" + "unicode/utf8" +) + +// BImportData imports a package from the serialized package data +// and returns the number of bytes consumed and a reference to the package. +// If data is obviously malformed, an error is returned but in +// general it is not recommended to call BImportData on untrusted data. +func BImportData(imports map[string]*types.Package, data []byte, path string) (int, *types.Package, error) { + p := importer{ + imports: imports, + data: data, + } + p.buf = p.bufarray[:] + + // read low-level encoding format + switch format := p.byte(); format { + case 'c': + // compact format - nothing to do + case 'd': + p.debugFormat = true + default: + return p.read, nil, fmt.Errorf("invalid encoding format in export data: got %q; want 'c' or 'd'", format) + } + + // --- generic export data --- + + if v := p.string(); v != "v0" { + return p.read, nil, fmt.Errorf("unknown version: %s", v) + } + + // populate typList with predeclared "known" types + p.typList = append(p.typList, predeclared...) + + // read package data + // TODO(gri) clean this up + i := p.tagOrIndex() + if i != packageTag { + panic(fmt.Sprintf("package tag expected, got %d", i)) + } + name := p.string() + if s := p.string(); s != "" { + panic(fmt.Sprintf("empty path expected, got %s", s)) + } + pkg := p.imports[path] + if pkg == nil { + pkg = types.NewPackage(path, name) + p.imports[path] = pkg + } + p.pkgList = append(p.pkgList, pkg) + + if debug && p.pkgList[0] != pkg { + panic("imported packaged not found in pkgList[0]") + } + + // read compiler-specific flags + p.string() // discard + + // read consts + for i := p.int(); i > 0; i-- { + name := p.string() + typ := p.typ(nil) + val := p.value() + p.declare(types.NewConst(token.NoPos, pkg, name, typ, val)) + } + + // read vars + for i := p.int(); i > 0; i-- { + name := p.string() + typ := p.typ(nil) + p.declare(types.NewVar(token.NoPos, pkg, name, typ)) + } + + // read funcs + for i := p.int(); i > 0; i-- { + name := p.string() + params, isddd := p.paramList() + result, _ := p.paramList() + sig := types.NewSignature(nil, params, result, isddd) + p.int() // read and discard index of inlined function body + p.declare(types.NewFunc(token.NoPos, pkg, name, sig)) + } + + // read types + for i := p.int(); i > 0; i-- { + // name is parsed as part of named type and the + // type object is added to scope via respective + // named type + _ = p.typ(nil).(*types.Named) + } + + // ignore compiler-specific import data + + // complete interfaces + for _, typ := range p.typList { + if it, ok := typ.(*types.Interface); ok { + it.Complete() + } + } + + // record all referenced packages as imports + list := append(([]*types.Package)(nil), p.pkgList[1:]...) + sort.Sort(byPath(list)) + pkg.SetImports(list) + + // package was imported completely and without errors + pkg.MarkComplete() + + return p.read, pkg, nil +} + +type importer struct { + imports map[string]*types.Package + data []byte + buf []byte // for reading strings + bufarray [64]byte // initial underlying array for buf, large enough to avoid allocation when compiling std lib + pkgList []*types.Package + typList []types.Type + + debugFormat bool + read int // bytes read +} + +func (p *importer) declare(obj types.Object) { + if alt := p.pkgList[0].Scope().Insert(obj); alt != nil { + // This can only happen if we import a package a second time. + panic(fmt.Sprintf("%s already declared", alt.Name())) + } +} + +func (p *importer) pkg() *types.Package { + // if the package was seen before, i is its index (>= 0) + i := p.tagOrIndex() + if i >= 0 { + return p.pkgList[i] + } + + // otherwise, i is the package tag (< 0) + if i != packageTag { + panic(fmt.Sprintf("unexpected package tag %d", i)) + } + + // read package data + name := p.string() + path := p.string() + + // we should never see an empty package name + if name == "" { + panic("empty package name in import") + } + + // we should never see an empty import path + if path == "" { + panic("empty import path") + } + + // if the package was imported before, use that one; otherwise create a new one + pkg := p.imports[path] + if pkg == nil { + pkg = types.NewPackage(path, name) + p.imports[path] = pkg + } + p.pkgList = append(p.pkgList, pkg) + + return pkg +} + +func (p *importer) record(t types.Type) { + p.typList = append(p.typList, t) +} + +// A dddSlice is a types.Type representing ...T parameters. +// It only appears for parameter types and does not escape +// the importer. +type dddSlice struct { + elem types.Type +} + +func (t *dddSlice) Underlying() types.Type { return t } +func (t *dddSlice) String() string { return "..." + t.elem.String() } + +// parent is the package which declared the type; parent == nil means +// the package currently imported. The parent package is needed for +// exported struct fields and interface methods which don't contain +// explicit package information in the export data. +func (p *importer) typ(parent *types.Package) types.Type { + // if the type was seen before, i is its index (>= 0) + i := p.tagOrIndex() + if i >= 0 { + return p.typList[i] + } + + // otherwise, i is the type tag (< 0) + switch i { + case namedTag: + // read type object + name := p.string() + parent = p.pkg() + scope := parent.Scope() + obj := scope.Lookup(name) + + // if the object doesn't exist yet, create and insert it + if obj == nil { + obj = types.NewTypeName(token.NoPos, parent, name, nil) + scope.Insert(obj) + } + + if _, ok := obj.(*types.TypeName); !ok { + panic(fmt.Sprintf("pkg = %s, name = %s => %s", parent, name, obj)) + } + + // associate new named type with obj if it doesn't exist yet + t0 := types.NewNamed(obj.(*types.TypeName), nil, nil) + + // but record the existing type, if any + t := obj.Type().(*types.Named) + p.record(t) + + // read underlying type + t0.SetUnderlying(p.typ(parent)) + + // interfaces don't have associated methods + if _, ok := t0.Underlying().(*types.Interface); ok { + return t + } + + // read associated methods + for i := p.int(); i > 0; i-- { + name := p.string() + recv, _ := p.paramList() // TODO(gri) do we need a full param list for the receiver? + params, isddd := p.paramList() + result, _ := p.paramList() + p.int() // read and discard index of inlined function body + sig := types.NewSignature(recv.At(0), params, result, isddd) + t0.AddMethod(types.NewFunc(token.NoPos, parent, name, sig)) + } + + return t + + case arrayTag: + t := new(types.Array) + p.record(t) + + n := p.int64() + *t = *types.NewArray(p.typ(parent), n) + return t + + case sliceTag: + t := new(types.Slice) + p.record(t) + + *t = *types.NewSlice(p.typ(parent)) + return t + + case dddTag: + t := new(dddSlice) + p.record(t) + + t.elem = p.typ(parent) + return t + + case structTag: + t := new(types.Struct) + p.record(t) + + n := p.int() + fields := make([]*types.Var, n) + tags := make([]string, n) + for i := range fields { + fields[i] = p.field(parent) + tags[i] = p.string() + } + *t = *types.NewStruct(fields, tags) + return t + + case pointerTag: + t := new(types.Pointer) + p.record(t) + + *t = *types.NewPointer(p.typ(parent)) + return t + + case signatureTag: + t := new(types.Signature) + p.record(t) + + params, isddd := p.paramList() + result, _ := p.paramList() + *t = *types.NewSignature(nil, params, result, isddd) + return t + + case interfaceTag: + // Create a dummy entry in the type list. This is safe because we + // cannot expect the interface type to appear in a cycle, as any + // such cycle must contain a named type which would have been + // first defined earlier. + n := len(p.typList) + p.record(nil) + + // no embedded interfaces with gc compiler + if p.int() != 0 { + panic("unexpected embedded interface") + } + + // read methods + methods := make([]*types.Func, p.int()) + for i := range methods { + pkg, name := p.fieldName(parent) + params, isddd := p.paramList() + result, _ := p.paramList() + sig := types.NewSignature(nil, params, result, isddd) + methods[i] = types.NewFunc(token.NoPos, pkg, name, sig) + } + + t := types.NewInterface(methods, nil) + p.typList[n] = t + return t + + case mapTag: + t := new(types.Map) + p.record(t) + + key := p.typ(parent) + val := p.typ(parent) + *t = *types.NewMap(key, val) + return t + + case chanTag: + t := new(types.Chan) + p.record(t) + + var dir types.ChanDir + // tag values must match the constants in cmd/compile/internal/gc/go.go + switch d := p.int(); d { + case 1 /* Crecv */ : + dir = types.RecvOnly + case 2 /* Csend */ : + dir = types.SendOnly + case 3 /* Cboth */ : + dir = types.SendRecv + default: + panic(fmt.Sprintf("unexpected channel dir %d", d)) + } + val := p.typ(parent) + *t = *types.NewChan(dir, val) + return t + + default: + panic(fmt.Sprintf("unexpected type tag %d", i)) + } +} + +func (p *importer) field(parent *types.Package) *types.Var { + pkg, name := p.fieldName(parent) + typ := p.typ(parent) + + anonymous := false + if name == "" { + // anonymous field - typ must be T or *T and T must be a type name + switch typ := deref(typ).(type) { + case *types.Basic: // basic types are named types + pkg = nil // // objects defined in Universe scope have no package + name = typ.Name() + case *types.Named: + name = typ.Obj().Name() + default: + panic("anonymous field expected") + } + anonymous = true + } + + return types.NewField(token.NoPos, pkg, name, typ, anonymous) +} + +func (p *importer) fieldName(parent *types.Package) (*types.Package, string) { + pkg := parent + if pkg == nil { + // use the imported package instead + pkg = p.pkgList[0] + } + name := p.string() + if name == "" { + return pkg, "" // anonymous + } + if name == "?" || name != "_" && !exported(name) { + // explicitly qualified field + if name == "?" { + name = "" // anonymous + } + pkg = p.pkg() + } + return pkg, name +} + +func (p *importer) paramList() (*types.Tuple, bool) { + n := p.int() + if n == 0 { + return nil, false + } + // negative length indicates unnamed parameters + named := true + if n < 0 { + n = -n + named = false + } + // n > 0 + params := make([]*types.Var, n) + isddd := false + for i := range params { + params[i], isddd = p.param(named) + } + return types.NewTuple(params...), isddd +} + +func (p *importer) param(named bool) (*types.Var, bool) { + t := p.typ(nil) + td, isddd := t.(*dddSlice) + if isddd { + t = types.NewSlice(td.elem) + } + + var name string + if named { + name = p.string() + if name == "" { + panic("expected named parameter") + } + } + + // read and discard compiler-specific info + p.string() + + return types.NewVar(token.NoPos, nil, name, t), isddd +} + +func exported(name string) bool { + ch, _ := utf8.DecodeRuneInString(name) + return unicode.IsUpper(ch) +} + +func (p *importer) value() constant.Value { + switch tag := p.tagOrIndex(); tag { + case falseTag: + return constant.MakeBool(false) + case trueTag: + return constant.MakeBool(true) + case int64Tag: + return constant.MakeInt64(p.int64()) + case floatTag: + return p.float() + case complexTag: + re := p.float() + im := p.float() + return constant.BinaryOp(re, token.ADD, constant.MakeImag(im)) + case stringTag: + return constant.MakeString(p.string()) + case unknownTag: + // (Encoded package contains type errors.) + return constant.MakeUnknown() + default: + panic(fmt.Sprintf("unexpected value tag %d", tag)) + } +} + +func (p *importer) float() constant.Value { + sign := p.int() + if sign == 0 { + return constant.MakeInt64(0) + } + + exp := p.int() + mant := []byte(p.string()) // big endian + + // remove leading 0's if any + for len(mant) > 0 && mant[0] == 0 { + mant = mant[1:] + } + + // convert to little endian + // TODO(gri) go/constant should have a more direct conversion function + // (e.g., once it supports a big.Float based implementation) + for i, j := 0, len(mant)-1; i < j; i, j = i+1, j-1 { + mant[i], mant[j] = mant[j], mant[i] + } + + // adjust exponent (constant.MakeFromBytes creates an integer value, + // but mant represents the mantissa bits such that 0.5 <= mant < 1.0) + exp -= len(mant) << 3 + if len(mant) > 0 { + for msd := mant[len(mant)-1]; msd&0x80 == 0; msd <<= 1 { + exp++ + } + } + + x := constant.MakeFromBytes(mant) + switch { + case exp < 0: + d := constant.Shift(constant.MakeInt64(1), token.SHL, uint(-exp)) + x = constant.BinaryOp(x, token.QUO, d) + case exp > 0: + x = constant.Shift(x, token.SHL, uint(exp)) + } + + if sign < 0 { + x = constant.UnaryOp(token.SUB, x, 0) + } + return x +} + +// ---------------------------------------------------------------------------- +// Low-level decoders + +func (p *importer) tagOrIndex() int { + if p.debugFormat { + p.marker('t') + } + + return int(p.rawInt64()) +} + +func (p *importer) int() int { + x := p.int64() + if int64(int(x)) != x { + panic("exported integer too large") + } + return int(x) +} + +func (p *importer) int64() int64 { + if p.debugFormat { + p.marker('i') + } + + return p.rawInt64() +} + +func (p *importer) string() string { + if p.debugFormat { + p.marker('s') + } + + if n := int(p.rawInt64()); n > 0 { + if cap(p.buf) < n { + p.buf = make([]byte, n) + } else { + p.buf = p.buf[:n] + } + for i := 0; i < n; i++ { + p.buf[i] = p.byte() + } + return string(p.buf) + } + + return "" +} + +func (p *importer) marker(want byte) { + if got := p.byte(); got != want { + panic(fmt.Sprintf("incorrect marker: got %c; want %c (pos = %d)", got, want, p.read)) + } + + pos := p.read + if n := int(p.rawInt64()); n != pos { + panic(fmt.Sprintf("incorrect position: got %d; want %d", n, pos)) + } +} + +// rawInt64 should only be used by low-level decoders +func (p *importer) rawInt64() int64 { + i, err := binary.ReadVarint(p) + if err != nil { + panic(fmt.Sprintf("read error: %v", err)) + } + return i +} + +// needed for binary.ReadVarint in rawInt64 +func (p *importer) ReadByte() (byte, error) { + return p.byte(), nil +} + +// byte is the bottleneck interface for reading p.data. +// It unescapes '|' 'S' to '$' and '|' '|' to '|'. +func (p *importer) byte() byte { + b := p.data[0] + r := 1 + if b == '|' { + b = p.data[1] + r = 2 + switch b { + case 'S': + b = '$' + case '|': + // nothing to do + default: + panic("unexpected escape sequence in export data") + } + } + p.data = p.data[r:] + p.read += r + return b + +} + +// ---------------------------------------------------------------------------- +// Export format + +// Tags. Must be < 0. +const ( + // Packages + packageTag = -(iota + 1) + + // Types + namedTag + arrayTag + sliceTag + dddTag + structTag + pointerTag + signatureTag + interfaceTag + mapTag + chanTag + + // Values + falseTag + trueTag + int64Tag + floatTag + fractionTag // not used by gc + complexTag + stringTag + unknownTag // only appears in packages with errors +) + +var predeclared = []types.Type{ + // basic types + types.Typ[types.Bool], + types.Typ[types.Int], + types.Typ[types.Int8], + types.Typ[types.Int16], + types.Typ[types.Int32], + types.Typ[types.Int64], + types.Typ[types.Uint], + types.Typ[types.Uint8], + types.Typ[types.Uint16], + types.Typ[types.Uint32], + types.Typ[types.Uint64], + types.Typ[types.Uintptr], + types.Typ[types.Float32], + types.Typ[types.Float64], + types.Typ[types.Complex64], + types.Typ[types.Complex128], + types.Typ[types.String], + + // aliases + types.Universe.Lookup("byte").Type(), + types.Universe.Lookup("rune").Type(), + + // error + types.Universe.Lookup("error").Type(), + + // untyped types + types.Typ[types.UntypedBool], + types.Typ[types.UntypedInt], + types.Typ[types.UntypedRune], + types.Typ[types.UntypedFloat], + types.Typ[types.UntypedComplex], + types.Typ[types.UntypedString], + types.Typ[types.UntypedNil], + + // package unsafe + types.Typ[types.UnsafePointer], + + // invalid type + types.Typ[types.Invalid], // only appears in packages with errors + + // used internally by gc; never used by this package or in .a files + anyType{}, +} + +type anyType struct{} + +func (t anyType) Underlying() types.Type { return t } +func (t anyType) String() string { return "any" } diff --git a/vendor/golang.org/x/tools/go/gcimporter15/exportdata.go b/vendor/golang.org/x/tools/go/gcimporter15/exportdata.go new file mode 100644 index 0000000000..4e1d1e47c5 --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcimporter15/exportdata.go @@ -0,0 +1,115 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.5 + +// This file is a copy of $GOROOT/src/go/internal/gcimporter/exportdata.go, tagged for go1.5. + +// This file implements FindExportData. + +package gcimporter + +import ( + "bufio" + "errors" + "fmt" + "io" + "strconv" + "strings" +) + +func readGopackHeader(r *bufio.Reader) (name string, size int, err error) { + // See $GOROOT/include/ar.h. + hdr := make([]byte, 16+12+6+6+8+10+2) + _, err = io.ReadFull(r, hdr) + if err != nil { + return + } + // leave for debugging + if false { + fmt.Printf("header: %s", hdr) + } + s := strings.TrimSpace(string(hdr[16+12+6+6+8:][:10])) + size, err = strconv.Atoi(s) + if err != nil || hdr[len(hdr)-2] != '`' || hdr[len(hdr)-1] != '\n' { + err = errors.New("invalid archive header") + return + } + name = strings.TrimSpace(string(hdr[:16])) + return +} + +// FindExportData positions the reader r at the beginning of the +// export data section of an underlying GC-created object/archive +// file by reading from it. The reader must be positioned at the +// start of the file before calling this function. The hdr result +// is the string before the export data, either "$$" or "$$B". +// +func FindExportData(r *bufio.Reader) (hdr string, err error) { + // Read first line to make sure this is an object file. + line, err := r.ReadSlice('\n') + if err != nil { + return + } + + if string(line) == "!\n" { + // Archive file. Scan to __.PKGDEF. + var name string + var size int + if name, size, err = readGopackHeader(r); err != nil { + return + } + + // Optional leading __.GOSYMDEF or __.SYMDEF. + // Read and discard. + if name == "__.SYMDEF" || name == "__.GOSYMDEF" { + const block = 4096 + tmp := make([]byte, block) + for size > 0 { + n := size + if n > block { + n = block + } + if _, err = io.ReadFull(r, tmp[:n]); err != nil { + return + } + size -= n + } + + if name, _, err = readGopackHeader(r); err != nil { + return + } + } + + // First real entry should be __.PKGDEF. + if name != "__.PKGDEF" { + err = errors.New("go archive is missing __.PKGDEF") + return + } + + // Read first line of __.PKGDEF data, so that line + // is once again the first line of the input. + if line, err = r.ReadSlice('\n'); err != nil { + return + } + } + + // Now at __.PKGDEF in archive or still at beginning of file. + // Either way, line should begin with "go object ". + if !strings.HasPrefix(string(line), "go object ") { + err = errors.New("not a go object file") + return + } + + // Skip over object header to export data. + // Begins after first line starting with $$. + for line[0] != '$' { + if line, err = r.ReadSlice('\n'); err != nil { + return + } + } + hdr = string(line) + + return +} diff --git a/vendor/golang.org/x/tools/go/gcimporter15/gcimporter.go b/vendor/golang.org/x/tools/go/gcimporter15/gcimporter.go new file mode 100644 index 0000000000..e1022103cd --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcimporter15/gcimporter.go @@ -0,0 +1,1029 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.5 + +// This file is a copy of $GOROOT/src/go/internal/gcimporter/gcimporter.go, tagged for go1.5, +// and minimally adjusted to make it build. + +// Package gcimporter15 provides various functions for reading +// gc-generated object files that can be used to implement the +// Importer interface defined by the Go 1.5 standard library package. +// +// This package serves as a stop-gap for missing features in the +// standard library's go/importer package, specifically customizable +// package data lookup. This package should be deleted once that +// functionality becomes available in the standard library. +package gcimporter // import "golang.org/x/tools/go/gcimporter15" + +import ( + "bufio" + "errors" + "fmt" + "go/build" + exact "go/constant" + "go/token" + "go/types" + "io" + "io/ioutil" + "os" + "path/filepath" + "sort" + "strconv" + "strings" + "text/scanner" +) + +// debugging/development support +const debug = false + +var pkgExts = [...]string{".a", ".o"} + +// FindPkg returns the filename and unique package id for an import +// path based on package information provided by build.Import (using +// the build.Default build.Context). A relative srcDir is interpreted +// relative to the current working directory. +// If no file was found, an empty filename is returned. +// +func FindPkg(path, srcDir string) (filename, id string) { + if path == "" { + return + } + + var noext string + switch { + default: + // "x" -> "$GOPATH/pkg/$GOOS_$GOARCH/x.ext", "x" + // Don't require the source files to be present. + if abs, err := filepath.Abs(srcDir); err == nil { // see issue 14282 + srcDir = abs + } + bp, _ := build.Import(path, srcDir, build.FindOnly|build.AllowBinary) + if bp.PkgObj == "" { + return + } + noext = strings.TrimSuffix(bp.PkgObj, ".a") + id = bp.ImportPath + + case build.IsLocalImport(path): + // "./x" -> "/this/directory/x.ext", "/this/directory/x" + noext = filepath.Join(srcDir, path) + id = noext + + case filepath.IsAbs(path): + // for completeness only - go/build.Import + // does not support absolute imports + // "/x" -> "/x.ext", "/x" + noext = path + id = path + } + + if false { // for debugging + if path != id { + fmt.Printf("%s -> %s\n", path, id) + } + } + + // try extensions + for _, ext := range pkgExts { + filename = noext + ext + if f, err := os.Stat(filename); err == nil && !f.IsDir() { + return + } + } + + filename = "" // not found + return +} + +// ImportData imports a package by reading the gc-generated export data, +// adds the corresponding package object to the packages map indexed by id, +// and returns the object. +// +// The packages map must contains all packages already imported. The data +// reader position must be the beginning of the export data section. The +// filename is only used in error messages. +// +// If packages[id] contains the completely imported package, that package +// can be used directly, and there is no need to call this function (but +// there is also no harm but for extra time used). +// +func ImportData(packages map[string]*types.Package, filename, id string, data io.Reader) (pkg *types.Package, err error) { + // support for parser error handling + defer func() { + switch r := recover().(type) { + case nil: + // nothing to do + case importError: + err = r + default: + panic(r) // internal error + } + }() + + var p parser + p.init(filename, id, data, packages) + pkg = p.parseExport() + + return +} + +// Import imports a gc-generated package given its import path and srcDir, adds +// the corresponding package object to the packages map, and returns the object. +// The packages map must contain all packages already imported. +// +func Import(packages map[string]*types.Package, path, srcDir string) (pkg *types.Package, err error) { + filename, id := FindPkg(path, srcDir) + if filename == "" { + if path == "unsafe" { + return types.Unsafe, nil + } + err = fmt.Errorf("can't find import: %s", id) + return + } + + // no need to re-import if the package was imported completely before + if pkg = packages[id]; pkg != nil && pkg.Complete() { + return + } + + // open file + f, err := os.Open(filename) + if err != nil { + return + } + defer func() { + f.Close() + if err != nil { + // add file name to error + err = fmt.Errorf("reading export data: %s: %v", filename, err) + } + }() + + var hdr string + buf := bufio.NewReader(f) + if hdr, err = FindExportData(buf); err != nil { + return + } + + switch hdr { + case "$$\n": + return ImportData(packages, filename, id, buf) + case "$$B\n": + var data []byte + data, err = ioutil.ReadAll(buf) + if err == nil { + _, pkg, err = BImportData(packages, data, path) + return + } + default: + err = fmt.Errorf("unknown export data header: %q", hdr) + } + + return +} + +// ---------------------------------------------------------------------------- +// Parser + +// TODO(gri) Imported objects don't have position information. +// Ideally use the debug table line info; alternatively +// create some fake position (or the position of the +// import). That way error messages referring to imported +// objects can print meaningful information. + +// parser parses the exports inside a gc compiler-produced +// object/archive file and populates its scope with the results. +type parser struct { + scanner scanner.Scanner + tok rune // current token + lit string // literal string; only valid for Ident, Int, String tokens + id string // package id of imported package + sharedPkgs map[string]*types.Package // package id -> package object (across importer) + localPkgs map[string]*types.Package // package id -> package object (just this package) +} + +func (p *parser) init(filename, id string, src io.Reader, packages map[string]*types.Package) { + p.scanner.Init(src) + p.scanner.Error = func(_ *scanner.Scanner, msg string) { p.error(msg) } + p.scanner.Mode = scanner.ScanIdents | scanner.ScanInts | scanner.ScanChars | scanner.ScanStrings | scanner.ScanComments | scanner.SkipComments + p.scanner.Whitespace = 1<<'\t' | 1<<' ' + p.scanner.Filename = filename // for good error messages + p.next() + p.id = id + p.sharedPkgs = packages + if debug { + // check consistency of packages map + for _, pkg := range packages { + if pkg.Name() == "" { + fmt.Printf("no package name for %s\n", pkg.Path()) + } + } + } +} + +func (p *parser) next() { + p.tok = p.scanner.Scan() + switch p.tok { + case scanner.Ident, scanner.Int, scanner.Char, scanner.String, '·': + p.lit = p.scanner.TokenText() + default: + p.lit = "" + } + if debug { + fmt.Printf("%s: %q -> %q\n", scanner.TokenString(p.tok), p.scanner.TokenText(), p.lit) + } +} + +func declTypeName(pkg *types.Package, name string) *types.TypeName { + scope := pkg.Scope() + if obj := scope.Lookup(name); obj != nil { + return obj.(*types.TypeName) + } + obj := types.NewTypeName(token.NoPos, pkg, name, nil) + // a named type may be referred to before the underlying type + // is known - set it up + types.NewNamed(obj, nil, nil) + scope.Insert(obj) + return obj +} + +// ---------------------------------------------------------------------------- +// Error handling + +// Internal errors are boxed as importErrors. +type importError struct { + pos scanner.Position + err error +} + +func (e importError) Error() string { + return fmt.Sprintf("import error %s (byte offset = %d): %s", e.pos, e.pos.Offset, e.err) +} + +func (p *parser) error(err interface{}) { + if s, ok := err.(string); ok { + err = errors.New(s) + } + // panic with a runtime.Error if err is not an error + panic(importError{p.scanner.Pos(), err.(error)}) +} + +func (p *parser) errorf(format string, args ...interface{}) { + p.error(fmt.Sprintf(format, args...)) +} + +func (p *parser) expect(tok rune) string { + lit := p.lit + if p.tok != tok { + p.errorf("expected %s, got %s (%s)", scanner.TokenString(tok), scanner.TokenString(p.tok), lit) + } + p.next() + return lit +} + +func (p *parser) expectSpecial(tok string) { + sep := 'x' // not white space + i := 0 + for i < len(tok) && p.tok == rune(tok[i]) && sep > ' ' { + sep = p.scanner.Peek() // if sep <= ' ', there is white space before the next token + p.next() + i++ + } + if i < len(tok) { + p.errorf("expected %q, got %q", tok, tok[0:i]) + } +} + +func (p *parser) expectKeyword(keyword string) { + lit := p.expect(scanner.Ident) + if lit != keyword { + p.errorf("expected keyword %s, got %q", keyword, lit) + } +} + +// ---------------------------------------------------------------------------- +// Qualified and unqualified names + +// PackageId = string_lit . +// +func (p *parser) parsePackageId() string { + id, err := strconv.Unquote(p.expect(scanner.String)) + if err != nil { + p.error(err) + } + // id == "" stands for the imported package id + // (only known at time of package installation) + if id == "" { + id = p.id + } + return id +} + +// PackageName = ident . +// +func (p *parser) parsePackageName() string { + return p.expect(scanner.Ident) +} + +// dotIdentifier = ( ident | '·' ) { ident | int | '·' } . +func (p *parser) parseDotIdent() string { + ident := "" + if p.tok != scanner.Int { + sep := 'x' // not white space + for (p.tok == scanner.Ident || p.tok == scanner.Int || p.tok == '·') && sep > ' ' { + ident += p.lit + sep = p.scanner.Peek() // if sep <= ' ', there is white space before the next token + p.next() + } + } + if ident == "" { + p.expect(scanner.Ident) // use expect() for error handling + } + return ident +} + +// QualifiedName = "@" PackageId "." ( "?" | dotIdentifier ) . +// +func (p *parser) parseQualifiedName() (id, name string) { + p.expect('@') + id = p.parsePackageId() + p.expect('.') + // Per rev f280b8a485fd (10/2/2013), qualified names may be used for anonymous fields. + if p.tok == '?' { + p.next() + } else { + name = p.parseDotIdent() + } + return +} + +// getPkg returns the package for a given id. If the package is +// not found, create the package and add it to the p.localPkgs +// and p.sharedPkgs maps. name is the (expected) name of the +// package. If name == "", the package name is expected to be +// set later via an import clause in the export data. +// +// id identifies a package, usually by a canonical package path like +// "encoding/json" but possibly by a non-canonical import path like +// "./json". +// +func (p *parser) getPkg(id, name string) *types.Package { + // package unsafe is not in the packages maps - handle explicitly + if id == "unsafe" { + return types.Unsafe + } + + pkg := p.localPkgs[id] + if pkg == nil { + // first import of id from this package + pkg = p.sharedPkgs[id] + if pkg == nil { + // first import of id by this importer; + // add (possibly unnamed) pkg to shared packages + pkg = types.NewPackage(id, name) + p.sharedPkgs[id] = pkg + } + // add (possibly unnamed) pkg to local packages + if p.localPkgs == nil { + p.localPkgs = make(map[string]*types.Package) + } + p.localPkgs[id] = pkg + } else if name != "" { + // package exists already and we have an expected package name; + // make sure names match or set package name if necessary + if pname := pkg.Name(); pname == "" { + setName(pkg, name) + } else if pname != name { + p.errorf("%s package name mismatch: %s (given) vs %s (expected)", id, pname, name) + } + } + return pkg +} + +// parseExportedName is like parseQualifiedName, but +// the package id is resolved to an imported *types.Package. +// +func (p *parser) parseExportedName() (pkg *types.Package, name string) { + id, name := p.parseQualifiedName() + pkg = p.getPkg(id, "") + return +} + +// ---------------------------------------------------------------------------- +// Types + +// BasicType = identifier . +// +func (p *parser) parseBasicType() types.Type { + id := p.expect(scanner.Ident) + obj := types.Universe.Lookup(id) + if obj, ok := obj.(*types.TypeName); ok { + return obj.Type() + } + p.errorf("not a basic type: %s", id) + return nil +} + +// ArrayType = "[" int_lit "]" Type . +// +func (p *parser) parseArrayType(parent *types.Package) types.Type { + // "[" already consumed and lookahead known not to be "]" + lit := p.expect(scanner.Int) + p.expect(']') + elem := p.parseType(parent) + n, err := strconv.ParseInt(lit, 10, 64) + if err != nil { + p.error(err) + } + return types.NewArray(elem, n) +} + +// MapType = "map" "[" Type "]" Type . +// +func (p *parser) parseMapType(parent *types.Package) types.Type { + p.expectKeyword("map") + p.expect('[') + key := p.parseType(parent) + p.expect(']') + elem := p.parseType(parent) + return types.NewMap(key, elem) +} + +// Name = identifier | "?" | QualifiedName . +// +// For unqualified and anonymous names, the returned package is the parent +// package unless parent == nil, in which case the returned package is the +// package being imported. (The parent package is not nil if the the name +// is an unqualified struct field or interface method name belonging to a +// type declared in another package.) +// +// For qualified names, the returned package is nil (and not created if +// it doesn't exist yet) unless materializePkg is set (which creates an +// unnamed package with valid package path). In the latter case, a +// subsequent import clause is expected to provide a name for the package. +// +func (p *parser) parseName(parent *types.Package, materializePkg bool) (pkg *types.Package, name string) { + pkg = parent + if pkg == nil { + pkg = p.sharedPkgs[p.id] + } + switch p.tok { + case scanner.Ident: + name = p.lit + p.next() + case '?': + // anonymous + p.next() + case '@': + // exported name prefixed with package path + pkg = nil + var id string + id, name = p.parseQualifiedName() + if materializePkg { + pkg = p.getPkg(id, "") + } + default: + p.error("name expected") + } + return +} + +func deref(typ types.Type) types.Type { + if p, _ := typ.(*types.Pointer); p != nil { + return p.Elem() + } + return typ +} + +// Field = Name Type [ string_lit ] . +// +func (p *parser) parseField(parent *types.Package) (*types.Var, string) { + pkg, name := p.parseName(parent, true) + typ := p.parseType(parent) + anonymous := false + if name == "" { + // anonymous field - typ must be T or *T and T must be a type name + switch typ := deref(typ).(type) { + case *types.Basic: // basic types are named types + pkg = nil // objects defined in Universe scope have no package + name = typ.Name() + case *types.Named: + name = typ.Obj().Name() + default: + p.errorf("anonymous field expected") + } + anonymous = true + } + tag := "" + if p.tok == scanner.String { + s := p.expect(scanner.String) + var err error + tag, err = strconv.Unquote(s) + if err != nil { + p.errorf("invalid struct tag %s: %s", s, err) + } + } + return types.NewField(token.NoPos, pkg, name, typ, anonymous), tag +} + +// StructType = "struct" "{" [ FieldList ] "}" . +// FieldList = Field { ";" Field } . +// +func (p *parser) parseStructType(parent *types.Package) types.Type { + var fields []*types.Var + var tags []string + + p.expectKeyword("struct") + p.expect('{') + for i := 0; p.tok != '}' && p.tok != scanner.EOF; i++ { + if i > 0 { + p.expect(';') + } + fld, tag := p.parseField(parent) + if tag != "" && tags == nil { + tags = make([]string, i) + } + if tags != nil { + tags = append(tags, tag) + } + fields = append(fields, fld) + } + p.expect('}') + + return types.NewStruct(fields, tags) +} + +// Parameter = ( identifier | "?" ) [ "..." ] Type [ string_lit ] . +// +func (p *parser) parseParameter() (par *types.Var, isVariadic bool) { + _, name := p.parseName(nil, false) + // remove gc-specific parameter numbering + if i := strings.Index(name, "·"); i >= 0 { + name = name[:i] + } + if p.tok == '.' { + p.expectSpecial("...") + isVariadic = true + } + typ := p.parseType(nil) + if isVariadic { + typ = types.NewSlice(typ) + } + // ignore argument tag (e.g. "noescape") + if p.tok == scanner.String { + p.next() + } + // TODO(gri) should we provide a package? + par = types.NewVar(token.NoPos, nil, name, typ) + return +} + +// Parameters = "(" [ ParameterList ] ")" . +// ParameterList = { Parameter "," } Parameter . +// +func (p *parser) parseParameters() (list []*types.Var, isVariadic bool) { + p.expect('(') + for p.tok != ')' && p.tok != scanner.EOF { + if len(list) > 0 { + p.expect(',') + } + par, variadic := p.parseParameter() + list = append(list, par) + if variadic { + if isVariadic { + p.error("... not on final argument") + } + isVariadic = true + } + } + p.expect(')') + + return +} + +// Signature = Parameters [ Result ] . +// Result = Type | Parameters . +// +func (p *parser) parseSignature(recv *types.Var) *types.Signature { + params, isVariadic := p.parseParameters() + + // optional result type + var results []*types.Var + if p.tok == '(' { + var variadic bool + results, variadic = p.parseParameters() + if variadic { + p.error("... not permitted on result type") + } + } + + return types.NewSignature(recv, types.NewTuple(params...), types.NewTuple(results...), isVariadic) +} + +// InterfaceType = "interface" "{" [ MethodList ] "}" . +// MethodList = Method { ";" Method } . +// Method = Name Signature . +// +// The methods of embedded interfaces are always "inlined" +// by the compiler and thus embedded interfaces are never +// visible in the export data. +// +func (p *parser) parseInterfaceType(parent *types.Package) types.Type { + var methods []*types.Func + + p.expectKeyword("interface") + p.expect('{') + for i := 0; p.tok != '}' && p.tok != scanner.EOF; i++ { + if i > 0 { + p.expect(';') + } + pkg, name := p.parseName(parent, true) + sig := p.parseSignature(nil) + methods = append(methods, types.NewFunc(token.NoPos, pkg, name, sig)) + } + p.expect('}') + + // Complete requires the type's embedded interfaces to be fully defined, + // but we do not define any + return types.NewInterface(methods, nil).Complete() +} + +// ChanType = ( "chan" [ "<-" ] | "<-" "chan" ) Type . +// +func (p *parser) parseChanType(parent *types.Package) types.Type { + dir := types.SendRecv + if p.tok == scanner.Ident { + p.expectKeyword("chan") + if p.tok == '<' { + p.expectSpecial("<-") + dir = types.SendOnly + } + } else { + p.expectSpecial("<-") + p.expectKeyword("chan") + dir = types.RecvOnly + } + elem := p.parseType(parent) + return types.NewChan(dir, elem) +} + +// Type = +// BasicType | TypeName | ArrayType | SliceType | StructType | +// PointerType | FuncType | InterfaceType | MapType | ChanType | +// "(" Type ")" . +// +// BasicType = ident . +// TypeName = ExportedName . +// SliceType = "[" "]" Type . +// PointerType = "*" Type . +// FuncType = "func" Signature . +// +func (p *parser) parseType(parent *types.Package) types.Type { + switch p.tok { + case scanner.Ident: + switch p.lit { + default: + return p.parseBasicType() + case "struct": + return p.parseStructType(parent) + case "func": + // FuncType + p.next() + return p.parseSignature(nil) + case "interface": + return p.parseInterfaceType(parent) + case "map": + return p.parseMapType(parent) + case "chan": + return p.parseChanType(parent) + } + case '@': + // TypeName + pkg, name := p.parseExportedName() + return declTypeName(pkg, name).Type() + case '[': + p.next() // look ahead + if p.tok == ']' { + // SliceType + p.next() + return types.NewSlice(p.parseType(parent)) + } + return p.parseArrayType(parent) + case '*': + // PointerType + p.next() + return types.NewPointer(p.parseType(parent)) + case '<': + return p.parseChanType(parent) + case '(': + // "(" Type ")" + p.next() + typ := p.parseType(parent) + p.expect(')') + return typ + } + p.errorf("expected type, got %s (%q)", scanner.TokenString(p.tok), p.lit) + return nil +} + +// ---------------------------------------------------------------------------- +// Declarations + +// ImportDecl = "import" PackageName PackageId . +// +func (p *parser) parseImportDecl() { + p.expectKeyword("import") + name := p.parsePackageName() + p.getPkg(p.parsePackageId(), name) +} + +// int_lit = [ "+" | "-" ] { "0" ... "9" } . +// +func (p *parser) parseInt() string { + s := "" + switch p.tok { + case '-': + s = "-" + p.next() + case '+': + p.next() + } + return s + p.expect(scanner.Int) +} + +// number = int_lit [ "p" int_lit ] . +// +func (p *parser) parseNumber() (typ *types.Basic, val exact.Value) { + // mantissa + mant := exact.MakeFromLiteral(p.parseInt(), token.INT, 0) + if mant == nil { + panic("invalid mantissa") + } + + if p.lit == "p" { + // exponent (base 2) + p.next() + exp, err := strconv.ParseInt(p.parseInt(), 10, 0) + if err != nil { + p.error(err) + } + if exp < 0 { + denom := exact.MakeInt64(1) + denom = exact.Shift(denom, token.SHL, uint(-exp)) + typ = types.Typ[types.UntypedFloat] + val = exact.BinaryOp(mant, token.QUO, denom) + return + } + if exp > 0 { + mant = exact.Shift(mant, token.SHL, uint(exp)) + } + typ = types.Typ[types.UntypedFloat] + val = mant + return + } + + typ = types.Typ[types.UntypedInt] + val = mant + return +} + +// ConstDecl = "const" ExportedName [ Type ] "=" Literal . +// Literal = bool_lit | int_lit | float_lit | complex_lit | rune_lit | string_lit . +// bool_lit = "true" | "false" . +// complex_lit = "(" float_lit "+" float_lit "i" ")" . +// rune_lit = "(" int_lit "+" int_lit ")" . +// string_lit = `"` { unicode_char } `"` . +// +func (p *parser) parseConstDecl() { + p.expectKeyword("const") + pkg, name := p.parseExportedName() + + var typ0 types.Type + if p.tok != '=' { + // constant types are never structured - no need for parent type + typ0 = p.parseType(nil) + } + + p.expect('=') + var typ types.Type + var val exact.Value + switch p.tok { + case scanner.Ident: + // bool_lit + if p.lit != "true" && p.lit != "false" { + p.error("expected true or false") + } + typ = types.Typ[types.UntypedBool] + val = exact.MakeBool(p.lit == "true") + p.next() + + case '-', scanner.Int: + // int_lit + typ, val = p.parseNumber() + + case '(': + // complex_lit or rune_lit + p.next() + if p.tok == scanner.Char { + p.next() + p.expect('+') + typ = types.Typ[types.UntypedRune] + _, val = p.parseNumber() + p.expect(')') + break + } + _, re := p.parseNumber() + p.expect('+') + _, im := p.parseNumber() + p.expectKeyword("i") + p.expect(')') + typ = types.Typ[types.UntypedComplex] + val = exact.BinaryOp(re, token.ADD, exact.MakeImag(im)) + + case scanner.Char: + // rune_lit + typ = types.Typ[types.UntypedRune] + val = exact.MakeFromLiteral(p.lit, token.CHAR, 0) + p.next() + + case scanner.String: + // string_lit + typ = types.Typ[types.UntypedString] + val = exact.MakeFromLiteral(p.lit, token.STRING, 0) + p.next() + + default: + p.errorf("expected literal got %s", scanner.TokenString(p.tok)) + } + + if typ0 == nil { + typ0 = typ + } + + pkg.Scope().Insert(types.NewConst(token.NoPos, pkg, name, typ0, val)) +} + +// TypeDecl = "type" ExportedName Type . +// +func (p *parser) parseTypeDecl() { + p.expectKeyword("type") + pkg, name := p.parseExportedName() + obj := declTypeName(pkg, name) + + // The type object may have been imported before and thus already + // have a type associated with it. We still need to parse the type + // structure, but throw it away if the object already has a type. + // This ensures that all imports refer to the same type object for + // a given type declaration. + typ := p.parseType(pkg) + + if name := obj.Type().(*types.Named); name.Underlying() == nil { + name.SetUnderlying(typ) + } +} + +// VarDecl = "var" ExportedName Type . +// +func (p *parser) parseVarDecl() { + p.expectKeyword("var") + pkg, name := p.parseExportedName() + typ := p.parseType(pkg) + pkg.Scope().Insert(types.NewVar(token.NoPos, pkg, name, typ)) +} + +// Func = Signature [ Body ] . +// Body = "{" ... "}" . +// +func (p *parser) parseFunc(recv *types.Var) *types.Signature { + sig := p.parseSignature(recv) + if p.tok == '{' { + p.next() + for i := 1; i > 0; p.next() { + switch p.tok { + case '{': + i++ + case '}': + i-- + } + } + } + return sig +} + +// MethodDecl = "func" Receiver Name Func . +// Receiver = "(" ( identifier | "?" ) [ "*" ] ExportedName ")" . +// +func (p *parser) parseMethodDecl() { + // "func" already consumed + p.expect('(') + recv, _ := p.parseParameter() // receiver + p.expect(')') + + // determine receiver base type object + base := deref(recv.Type()).(*types.Named) + + // parse method name, signature, and possibly inlined body + _, name := p.parseName(nil, false) + sig := p.parseFunc(recv) + + // methods always belong to the same package as the base type object + pkg := base.Obj().Pkg() + + // add method to type unless type was imported before + // and method exists already + // TODO(gri) This leads to a quadratic algorithm - ok for now because method counts are small. + base.AddMethod(types.NewFunc(token.NoPos, pkg, name, sig)) +} + +// FuncDecl = "func" ExportedName Func . +// +func (p *parser) parseFuncDecl() { + // "func" already consumed + pkg, name := p.parseExportedName() + typ := p.parseFunc(nil) + pkg.Scope().Insert(types.NewFunc(token.NoPos, pkg, name, typ)) +} + +// Decl = [ ImportDecl | ConstDecl | TypeDecl | VarDecl | FuncDecl | MethodDecl ] "\n" . +// +func (p *parser) parseDecl() { + if p.tok == scanner.Ident { + switch p.lit { + case "import": + p.parseImportDecl() + case "const": + p.parseConstDecl() + case "type": + p.parseTypeDecl() + case "var": + p.parseVarDecl() + case "func": + p.next() // look ahead + if p.tok == '(' { + p.parseMethodDecl() + } else { + p.parseFuncDecl() + } + } + } + p.expect('\n') +} + +// ---------------------------------------------------------------------------- +// Export + +// Export = "PackageClause { Decl } "$$" . +// PackageClause = "package" PackageName [ "safe" ] "\n" . +// +func (p *parser) parseExport() *types.Package { + p.expectKeyword("package") + name := p.parsePackageName() + if p.tok == scanner.Ident && p.lit == "safe" { + // package was compiled with -u option - ignore + p.next() + } + p.expect('\n') + + pkg := p.getPkg(p.id, name) + + for p.tok != '$' && p.tok != scanner.EOF { + p.parseDecl() + } + + if ch := p.scanner.Peek(); p.tok != '$' || ch != '$' { + // don't call next()/expect() since reading past the + // export data may cause scanner errors (e.g. NUL chars) + p.errorf("expected '$$', got %s %c", scanner.TokenString(p.tok), ch) + } + + if n := p.scanner.ErrorCount; n != 0 { + p.errorf("expected no scanner errors, got %d", n) + } + + // Record all locally referenced packages as imports. + var imports []*types.Package + for id, pkg2 := range p.localPkgs { + if pkg2.Name() == "" { + p.errorf("%s package has no name", id) + } + if id == p.id { + continue // avoid self-edge + } + imports = append(imports, pkg2) + } + sort.Sort(byPath(imports)) + pkg.SetImports(imports) + + // package was imported completely and without errors + pkg.MarkComplete() + + return pkg +} + +type byPath []*types.Package + +func (a byPath) Len() int { return len(a) } +func (a byPath) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byPath) Less(i, j int) bool { return a[i].Path() < a[j].Path() } diff --git a/vendor/golang.org/x/tools/go/gcimporter15/gcimporter17_test.go b/vendor/golang.org/x/tools/go/gcimporter15/gcimporter17_test.go new file mode 100644 index 0000000000..d938df8885 --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcimporter15/gcimporter17_test.go @@ -0,0 +1,55 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.7 + +package gcimporter + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + "runtime" + "testing" +) + +// TODO(gri) Remove this function once we switched to new export format by default. +func compileNewExport(t *testing.T, dirname, filename string) string { + /* testenv. */ MustHaveGoBuild(t) + cmd := exec.Command("go", "tool", "compile", "-newexport", filename) + cmd.Dir = dirname + out, err := cmd.CombinedOutput() + if err != nil { + t.Logf("%s", out) + t.Fatalf("go tool compile %s failed: %s", filename, err) + } + // filename should end with ".go" + return filepath.Join(dirname, filename[:len(filename)-2]+"o") +} + +// TODO(gri) Remove this function once we switched to new export format by default +// (and update the comment and want list in TestImportTestdata). +func TestImportTestdataNewExport(t *testing.T) { + // This package only handles gc export data. + if runtime.Compiler != "gc" { + t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler) + return + } + + if outFn := compileNewExport(t, "testdata", "exports.go"); outFn != "" { + defer os.Remove(outFn) + } + + if pkg := testPath(t, "./testdata/exports", "."); pkg != nil { + // The package's Imports list must include all packages + // explicitly imported by exports.go, plus all packages + // referenced indirectly via exported objects in exports.go. + want := `[package ast ("go/ast") package token ("go/token")]` + got := fmt.Sprint(pkg.Imports()) + if got != want { + t.Errorf(`Package("exports").Imports() = %s, want %s`, got, want) + } + } +} diff --git a/vendor/golang.org/x/tools/go/gcimporter15/gcimporter_test.go b/vendor/golang.org/x/tools/go/gcimporter15/gcimporter_test.go new file mode 100644 index 0000000000..873ef46eba --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcimporter15/gcimporter_test.go @@ -0,0 +1,365 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.5 + +// This file is a copy of $GOROOT/src/go/internal/gcimporter/gcimporter_test.go, tagged for go1.5, +// and minimally adjusted to make it build with code from (std lib) internal/testenv copied. + +package gcimporter + +import ( + "fmt" + "go/types" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "testing" + "time" +) + +// ---------------------------------------------------------------------------- +// The following three functions (Builder, HasGoBuild, MustHaveGoBuild) were +// copied from $GOROOT/src/internal/testenv since that package is not available +// in x/tools. + +// Builder reports the name of the builder running this test +// (for example, "linux-amd64" or "windows-386-gce"). +// If the test is not running on the build infrastructure, +// Builder returns the empty string. +func Builder() string { + return os.Getenv("GO_BUILDER_NAME") +} + +// HasGoBuild reports whether the current system can build programs with ``go build'' +// and then run them with os.StartProcess or exec.Command. +func HasGoBuild() bool { + switch runtime.GOOS { + case "android", "nacl": + return false + case "darwin": + if strings.HasPrefix(runtime.GOARCH, "arm") { + return false + } + } + return true +} + +// MustHaveGoBuild checks that the current system can build programs with ``go build'' +// and then run them with os.StartProcess or exec.Command. +// If not, MustHaveGoBuild calls t.Skip with an explanation. +func MustHaveGoBuild(t *testing.T) { + if !HasGoBuild() { + t.Skipf("skipping test: 'go build' not available on %s/%s", runtime.GOOS, runtime.GOARCH) + } +} + +// ---------------------------------------------------------------------------- + +// skipSpecialPlatforms causes the test to be skipped for platforms where +// builders (build.golang.org) don't have access to compiled packages for +// import. +func skipSpecialPlatforms(t *testing.T) { + switch platform := runtime.GOOS + "-" + runtime.GOARCH; platform { + case "nacl-amd64p32", + "nacl-386", + "nacl-arm", + "darwin-arm", + "darwin-arm64": + t.Skipf("no compiled packages available for import on %s", platform) + } +} + +func compile(t *testing.T, dirname, filename string) string { + /* testenv. */ MustHaveGoBuild(t) + cmd := exec.Command("go", "tool", "compile", filename) + cmd.Dir = dirname + out, err := cmd.CombinedOutput() + if err != nil { + t.Logf("%s", out) + t.Fatalf("go tool compile %s failed: %s", filename, err) + } + // filename should end with ".go" + return filepath.Join(dirname, filename[:len(filename)-2]+"o") +} + +func testPath(t *testing.T, path, srcDir string) *types.Package { + t0 := time.Now() + pkg, err := Import(make(map[string]*types.Package), path, srcDir) + if err != nil { + t.Errorf("testPath(%s): %s", path, err) + return nil + } + t.Logf("testPath(%s): %v", path, time.Since(t0)) + return pkg +} + +const maxTime = 30 * time.Second + +func testDir(t *testing.T, dir string, endTime time.Time) (nimports int) { + dirname := filepath.Join(runtime.GOROOT(), "pkg", runtime.GOOS+"_"+runtime.GOARCH, dir) + list, err := ioutil.ReadDir(dirname) + if err != nil { + t.Fatalf("testDir(%s): %s", dirname, err) + } + for _, f := range list { + if time.Now().After(endTime) { + t.Log("testing time used up") + return + } + switch { + case !f.IsDir(): + // try extensions + for _, ext := range pkgExts { + if strings.HasSuffix(f.Name(), ext) { + name := f.Name()[0 : len(f.Name())-len(ext)] // remove extension + if testPath(t, filepath.Join(dir, name), dir) != nil { + nimports++ + } + } + } + case f.IsDir(): + nimports += testDir(t, filepath.Join(dir, f.Name()), endTime) + } + } + return +} + +func TestImportTestdata(t *testing.T) { + // This package only handles gc export data. + if runtime.Compiler != "gc" { + t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler) + return + } + + if outFn := compile(t, "testdata", "exports.go"); outFn != "" { + defer os.Remove(outFn) + } + + if pkg := testPath(t, "./testdata/exports", "."); pkg != nil { + // The package's Imports list must include all packages + // explicitly imported by exports.go, plus all packages + // referenced indirectly via exported objects in exports.go. + // With the textual export format, the list may also include + // additional packages that are not strictly required for + // import processing alone (they are exported to err "on + // the safe side"). + got := fmt.Sprint(pkg.Imports()) + for _, want := range []string{"go/ast", "go/token"} { + if !strings.Contains(got, want) { + t.Errorf(`Package("exports").Imports() = %s, does not contain %s`, got, want) + } + } + } +} + +func TestImportStdLib(t *testing.T) { + skipSpecialPlatforms(t) + + // This package only handles gc export data. + if runtime.Compiler != "gc" { + t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler) + return + } + + dt := maxTime + if testing.Short() && /* testenv. */ Builder() == "" { + dt = 10 * time.Millisecond + } + nimports := testDir(t, "", time.Now().Add(dt)) // installed packages + t.Logf("tested %d imports", nimports) +} + +var importedObjectTests = []struct { + name string + want string +}{ + {"math.Pi", "const Pi untyped float"}, + {"io.Reader", "type Reader interface{Read(p []byte) (n int, err error)}"}, + {"io.ReadWriter", "type ReadWriter interface{Read(p []byte) (n int, err error); Write(p []byte) (n int, err error)}"}, + {"math.Sin", "func Sin(x float64) float64"}, + // TODO(gri) add more tests +} + +func TestImportedTypes(t *testing.T) { + skipSpecialPlatforms(t) + + // This package only handles gc export data. + if runtime.Compiler != "gc" { + t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler) + return + } + + for _, test := range importedObjectTests { + s := strings.Split(test.name, ".") + if len(s) != 2 { + t.Fatal("inconsistent test data") + } + importPath := s[0] + objName := s[1] + + pkg, err := Import(make(map[string]*types.Package), importPath, ".") + if err != nil { + t.Error(err) + continue + } + + obj := pkg.Scope().Lookup(objName) + if obj == nil { + t.Errorf("%s: object not found", test.name) + continue + } + + got := types.ObjectString(obj, types.RelativeTo(pkg)) + if got != test.want { + t.Errorf("%s: got %q; want %q", test.name, got, test.want) + } + } +} + +func TestIssue5815(t *testing.T) { + skipSpecialPlatforms(t) + + // This package only handles gc export data. + if runtime.Compiler != "gc" { + t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler) + return + } + + pkg, err := Import(make(map[string]*types.Package), "strings", ".") + if err != nil { + t.Fatal(err) + } + + scope := pkg.Scope() + for _, name := range scope.Names() { + obj := scope.Lookup(name) + if obj.Pkg() == nil { + t.Errorf("no pkg for %s", obj) + } + if tname, _ := obj.(*types.TypeName); tname != nil { + named := tname.Type().(*types.Named) + for i := 0; i < named.NumMethods(); i++ { + m := named.Method(i) + if m.Pkg() == nil { + t.Errorf("no pkg for %s", m) + } + } + } + } +} + +// Smoke test to ensure that imported methods get the correct package. +func TestCorrectMethodPackage(t *testing.T) { + skipSpecialPlatforms(t) + + // This package only handles gc export data. + if runtime.Compiler != "gc" { + t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler) + return + } + + imports := make(map[string]*types.Package) + _, err := Import(imports, "net/http", ".") + if err != nil { + t.Fatal(err) + } + + mutex := imports["sync"].Scope().Lookup("Mutex").(*types.TypeName).Type() + mset := types.NewMethodSet(types.NewPointer(mutex)) // methods of *sync.Mutex + sel := mset.Lookup(nil, "Lock") + lock := sel.Obj().(*types.Func) + if got, want := lock.Pkg().Path(), "sync"; got != want { + t.Errorf("got package path %q; want %q", got, want) + } +} + +func TestIssue13566(t *testing.T) { + skipSpecialPlatforms(t) + + // This package only handles gc export data. + if runtime.Compiler != "gc" { + t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler) + return + } + + // On windows, we have to set the -D option for the compiler to avoid having a drive + // letter and an illegal ':' in the import path - just skip it (see also issue #3483). + if runtime.GOOS == "windows" { + t.Skip("avoid dealing with relative paths/drive letters on windows") + } + + if f := compile(t, "testdata", "a.go"); f != "" { + defer os.Remove(f) + } + if f := compile(t, "testdata", "b.go"); f != "" { + defer os.Remove(f) + } + + // import must succeed (test for issue at hand) + pkg, err := Import(make(map[string]*types.Package), "./testdata/b", ".") + if err != nil { + t.Fatal(err) + } + + // make sure all indirectly imported packages have names + for _, imp := range pkg.Imports() { + if imp.Name() == "" { + t.Errorf("no name for %s package", imp.Path()) + } + } +} + +func TestIssue13898(t *testing.T) { + skipSpecialPlatforms(t) + + // This package only handles gc export data. + if runtime.Compiler != "gc" { + t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler) + return + } + + // import go/internal/gcimporter which imports go/types partially + imports := make(map[string]*types.Package) + _, err := Import(imports, "go/internal/gcimporter", ".") + if err != nil { + t.Fatal(err) + } + + // look for go/types package + var goTypesPkg *types.Package + for path, pkg := range imports { + if path == "go/types" { + goTypesPkg = pkg + break + } + } + if goTypesPkg == nil { + t.Fatal("go/types not found") + } + + // look for go/types.Object type + obj := goTypesPkg.Scope().Lookup("Object") + if obj == nil { + t.Fatal("go/types.Object not found") + } + typ, ok := obj.Type().(*types.Named) + if !ok { + t.Fatalf("go/types.Object type is %v; wanted named type", typ) + } + + // lookup go/types.Object.Pkg method + m, _, _ := types.LookupFieldOrMethod(typ, false, nil, "Pkg") + if m == nil { + t.Fatal("go/types.Object.Pkg not found") + } + + // the method must belong to go/types + if m.Pkg().Path() != "go/types" { + t.Fatalf("found %v; want go/types", m.Pkg()) + } +} diff --git a/vendor/golang.org/x/tools/go/gcimporter15/setname15.go b/vendor/golang.org/x/tools/go/gcimporter15/setname15.go new file mode 100644 index 0000000000..8f78f540de --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcimporter15/setname15.go @@ -0,0 +1,31 @@ +// Copyright 2016 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.5,!go1.6 + +package gcimporter + +import ( + "go/types" + "unsafe" +) + +func setName(pkg *types.Package, name string) { + (*types_Package)(unsafe.Pointer(pkg)).name = name +} + +// The underlying type of types_Package is identical to +// the underlying type of types.Package. We use it with +// package unsafe to set the name field since 1.5 does +// not have the Package.SetName method. +// TestSetName verifies that the layout with respect to +// the name field is correct. +type types_Package struct { + path string + name string + scope *types.Scope + complete bool + imports []*types.Package + fake bool +} diff --git a/vendor/golang.org/x/tools/go/gcimporter15/setname16.go b/vendor/golang.org/x/tools/go/gcimporter15/setname16.go new file mode 100644 index 0000000000..d318e7c47e --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcimporter15/setname16.go @@ -0,0 +1,13 @@ +// Copyright 2016 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 gcimporter + +import "go/types" + +func setName(pkg *types.Package, name string) { + pkg.SetName(name) +} diff --git a/vendor/golang.org/x/tools/go/gcimporter15/setname_test.go b/vendor/golang.org/x/tools/go/gcimporter15/setname_test.go new file mode 100644 index 0000000000..a8a33f7f15 --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcimporter15/setname_test.go @@ -0,0 +1,28 @@ +// Copyright 2016 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.5 + +package gcimporter + +import ( + "go/types" + "testing" +) + +func TestSetName(t *testing.T) { + pkg := types.NewPackage("path", "foo") + scope := pkg.Scope() + + // verify setName + setName(pkg, "bar") + if name := pkg.Name(); name != "bar" { + t.Fatalf(`got package name %q; want "bar"`, name) + } + + // verify no other fields are changed + if pkg.Path() != "path" || pkg.Scope() != scope || pkg.Complete() || pkg.Imports() != nil { + t.Fatalf("setName changed other fields") + } +} diff --git a/vendor/golang.org/x/tools/go/gcimporter15/testdata/a.go b/vendor/golang.org/x/tools/go/gcimporter15/testdata/a.go new file mode 100644 index 0000000000..56e4292cda --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcimporter15/testdata/a.go @@ -0,0 +1,14 @@ +// Copyright 2016 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. + +// Input for TestIssue13566 + +package a + +import "encoding/json" + +type A struct { + a *A + json json.RawMessage +} diff --git a/vendor/golang.org/x/tools/go/gcimporter15/testdata/b.go b/vendor/golang.org/x/tools/go/gcimporter15/testdata/b.go new file mode 100644 index 0000000000..4196678200 --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcimporter15/testdata/b.go @@ -0,0 +1,11 @@ +// Copyright 2016 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. + +// Input for TestIssue13566 + +package b + +import "./a" + +type A a.A diff --git a/vendor/golang.org/x/tools/go/gcimporter15/testdata/exports.go b/vendor/golang.org/x/tools/go/gcimporter15/testdata/exports.go new file mode 100644 index 0000000000..8ee28b0942 --- /dev/null +++ b/vendor/golang.org/x/tools/go/gcimporter15/testdata/exports.go @@ -0,0 +1,89 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file is used to generate an object file which +// serves as test file for gcimporter_test.go. + +package exports + +import ( + "go/ast" +) + +// Issue 3682: Correctly read dotted identifiers from export data. +const init1 = 0 + +func init() {} + +const ( + C0 int = 0 + C1 = 3.14159265 + C2 = 2.718281828i + C3 = -123.456e-789 + C4 = +123.456E+789 + C5 = 1234i + C6 = "foo\n" + C7 = `bar\n` +) + +type ( + T1 int + T2 [10]int + T3 []int + T4 *int + T5 chan int + T6a chan<- int + T6b chan (<-chan int) + T6c chan<- (chan int) + T7 <-chan *ast.File + T8 struct{} + T9 struct { + a int + b, c float32 + d []string `go:"tag"` + } + T10 struct { + T8 + T9 + _ *T10 + } + T11 map[int]string + T12 interface{} + T13 interface { + m1() + m2(int) float32 + } + T14 interface { + T12 + T13 + m3(x ...struct{}) []T9 + } + T15 func() + T16 func(int) + T17 func(x int) + T18 func() float32 + T19 func() (x float32) + T20 func(...interface{}) + T21 struct{ next *T21 } + T22 struct{ link *T23 } + T23 struct{ link *T22 } + T24 *T24 + T25 *T26 + T26 *T27 + T27 *T25 + T28 func(T28) T28 +) + +var ( + V0 int + V1 = -991.0 +) + +func F1() {} +func F2(x int) {} +func F3() int { return 0 } +func F4() float32 { return 0 } +func F5(a, b, c int, u, v, w struct{ x, y T1 }, more ...interface{}) (p, q, r chan<- T10) + +func (p *T1) M1() diff --git a/vendor/golang.org/x/tools/go/importer/export.go b/vendor/golang.org/x/tools/go/importer/export.go new file mode 100644 index 0000000000..5930eafc05 --- /dev/null +++ b/vendor/golang.org/x/tools/go/importer/export.go @@ -0,0 +1,462 @@ +// Copyright 2013 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 importer + +import ( + "bytes" + "encoding/binary" + "fmt" + "go/ast" + "strings" + + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/types" +) + +// debugging support +const ( + debug = false // emit debugging data + trace = false // print emitted data +) + +// format returns a byte indicating the low-level encoding/decoding format +// (debug vs product). +func format() byte { + if debug { + return 'd' + } + return 'p' +} + +// ExportData serializes the interface (exported package objects) +// of package pkg and returns the corresponding data. The export +// format is described elsewhere (TODO). +func ExportData(pkg *types.Package) []byte { + p := exporter{ + data: append([]byte(magic), format()), + pkgIndex: make(map[*types.Package]int), + typIndex: make(map[types.Type]int), + } + + // populate typIndex with predeclared types + for _, t := range predeclared { + p.typIndex[t] = len(p.typIndex) + } + + if trace { + p.tracef("export %s\n", pkg.Name()) + defer p.tracef("\n") + } + + p.string(version) + + p.pkg(pkg) + + // collect exported objects from package scope + var list []types.Object + scope := pkg.Scope() + for _, name := range scope.Names() { + if exported(name) { + list = append(list, scope.Lookup(name)) + } + } + + // write objects + p.int(len(list)) + for _, obj := range list { + p.obj(obj) + } + + return p.data +} + +type exporter struct { + data []byte + pkgIndex map[*types.Package]int + typIndex map[types.Type]int + + // tracing support + indent string +} + +func (p *exporter) pkg(pkg *types.Package) { + if trace { + p.tracef("package { ") + defer p.tracef("} ") + } + + if pkg == nil { + panic("unexpected nil pkg") + } + + // if the package was seen before, write its index (>= 0) + if i, ok := p.pkgIndex[pkg]; ok { + p.int(i) + return + } + p.pkgIndex[pkg] = len(p.pkgIndex) + + // otherwise, write the package tag (< 0) and package data + p.int(packageTag) + p.string(pkg.Name()) + p.string(pkg.Path()) +} + +func (p *exporter) obj(obj types.Object) { + if trace { + p.tracef("object %s {\n", obj.Name()) + defer p.tracef("}\n") + } + + switch obj := obj.(type) { + case *types.Const: + p.int(constTag) + p.string(obj.Name()) + p.typ(obj.Type()) + p.value(obj.Val()) + case *types.TypeName: + p.int(typeTag) + // name is written by corresponding named type + p.typ(obj.Type().(*types.Named)) + case *types.Var: + p.int(varTag) + p.string(obj.Name()) + p.typ(obj.Type()) + case *types.Func: + p.int(funcTag) + p.string(obj.Name()) + p.typ(obj.Type()) + default: + panic(fmt.Sprintf("unexpected object type %T", obj)) + } +} + +func (p *exporter) value(x exact.Value) { + if trace { + p.tracef("value { ") + defer p.tracef("} ") + } + + switch kind := x.Kind(); kind { + case exact.Bool: + tag := falseTag + if exact.BoolVal(x) { + tag = trueTag + } + p.int(tag) + case exact.Int: + if i, ok := exact.Int64Val(x); ok { + p.int(int64Tag) + p.int64(i) + return + } + p.int(floatTag) + p.float(x) + case exact.Float: + p.int(fractionTag) + p.fraction(x) + case exact.Complex: + p.int(complexTag) + p.fraction(exact.Real(x)) + p.fraction(exact.Imag(x)) + case exact.String: + p.int(stringTag) + p.string(exact.StringVal(x)) + default: + panic(fmt.Sprintf("unexpected value kind %d", kind)) + } +} + +func (p *exporter) float(x exact.Value) { + sign := exact.Sign(x) + p.int(sign) + if sign == 0 { + return + } + + p.ufloat(x) +} + +func (p *exporter) fraction(x exact.Value) { + sign := exact.Sign(x) + p.int(sign) + if sign == 0 { + return + } + + p.ufloat(exact.Num(x)) + p.ufloat(exact.Denom(x)) +} + +// ufloat writes abs(x) in form of a binary exponent +// followed by its mantissa bytes; x must be != 0. +func (p *exporter) ufloat(x exact.Value) { + mant := exact.Bytes(x) + exp8 := -1 + for i, b := range mant { + if b != 0 { + exp8 = i + break + } + } + if exp8 < 0 { + panic(fmt.Sprintf("%s has no mantissa", x)) + } + p.int(exp8 * 8) + p.bytes(mant[exp8:]) +} + +func (p *exporter) typ(typ types.Type) { + if trace { + p.tracef("type {\n") + defer p.tracef("}\n") + } + + // if the type was seen before, write its index (>= 0) + if i, ok := p.typIndex[typ]; ok { + p.int(i) + return + } + p.typIndex[typ] = len(p.typIndex) + + // otherwise, write the type tag (< 0) and type data + switch t := typ.(type) { + case *types.Array: + p.int(arrayTag) + p.int64(t.Len()) + p.typ(t.Elem()) + + case *types.Slice: + p.int(sliceTag) + p.typ(t.Elem()) + + case *types.Struct: + p.int(structTag) + n := t.NumFields() + p.int(n) + for i := 0; i < n; i++ { + p.field(t.Field(i)) + p.string(t.Tag(i)) + } + + case *types.Pointer: + p.int(pointerTag) + p.typ(t.Elem()) + + case *types.Signature: + p.int(signatureTag) + p.signature(t) + + case *types.Interface: + p.int(interfaceTag) + + // write embedded interfaces + m := t.NumEmbeddeds() + p.int(m) + for i := 0; i < m; i++ { + p.typ(t.Embedded(i)) + } + + // write methods + n := t.NumExplicitMethods() + p.int(n) + for i := 0; i < n; i++ { + m := t.ExplicitMethod(i) + p.qualifiedName(m.Pkg(), m.Name()) + p.typ(m.Type()) + } + + case *types.Map: + p.int(mapTag) + p.typ(t.Key()) + p.typ(t.Elem()) + + case *types.Chan: + p.int(chanTag) + p.int(int(t.Dir())) + p.typ(t.Elem()) + + case *types.Named: + p.int(namedTag) + + // write type object + obj := t.Obj() + p.string(obj.Name()) + p.pkg(obj.Pkg()) + + // write underlying type + p.typ(t.Underlying()) + + // write associated methods + n := t.NumMethods() + p.int(n) + for i := 0; i < n; i++ { + m := t.Method(i) + p.string(m.Name()) + p.typ(m.Type()) + } + + default: + panic("unreachable") + } +} + +func (p *exporter) field(f *types.Var) { + // anonymous fields have "" name + name := "" + if !f.Anonymous() { + name = f.Name() + } + + // qualifiedName will always emit the field package for + // anonymous fields because "" is not an exported name. + p.qualifiedName(f.Pkg(), name) + p.typ(f.Type()) +} + +func (p *exporter) qualifiedName(pkg *types.Package, name string) { + p.string(name) + // exported names don't need package + if !exported(name) { + if pkg == nil { + panic(fmt.Sprintf("nil package for unexported qualified name %s", name)) + } + p.pkg(pkg) + } +} + +func (p *exporter) signature(sig *types.Signature) { + // We need the receiver information (T vs *T) + // for methods associated with named types. + // We do not record interface receiver types in the + // export data because 1) the importer can derive them + // from the interface type and 2) they create cycles + // in the type graph. + if recv := sig.Recv(); recv != nil { + if _, ok := recv.Type().Underlying().(*types.Interface); !ok { + // 1-element tuple + p.int(1) + p.param(recv) + } else { + // 0-element tuple + p.int(0) + } + } else { + // 0-element tuple + p.int(0) + } + p.tuple(sig.Params()) + p.tuple(sig.Results()) + if sig.Variadic() { + p.int(1) + } else { + p.int(0) + } +} + +func (p *exporter) param(v *types.Var) { + p.string(v.Name()) + p.typ(v.Type()) +} + +func (p *exporter) tuple(t *types.Tuple) { + n := t.Len() + p.int(n) + for i := 0; i < n; i++ { + p.param(t.At(i)) + } +} + +// ---------------------------------------------------------------------------- +// encoders + +func (p *exporter) string(s string) { + p.bytes([]byte(s)) // (could be inlined if extra allocation matters) +} + +func (p *exporter) int(x int) { + p.int64(int64(x)) +} + +func (p *exporter) int64(x int64) { + if debug { + p.marker('i') + } + + if trace { + p.tracef("%d ", x) + } + + p.rawInt64(x) +} + +func (p *exporter) bytes(b []byte) { + if debug { + p.marker('b') + } + + if trace { + p.tracef("%q ", b) + } + + p.rawInt64(int64(len(b))) + if len(b) > 0 { + p.data = append(p.data, b...) + } +} + +// marker emits a marker byte and position information which makes +// it easy for a reader to detect if it is "out of sync". Used for +// debug format only. +func (p *exporter) marker(m byte) { + if debug { + p.data = append(p.data, m) + p.rawInt64(int64(len(p.data))) + } +} + +// rawInt64 should only be used by low-level encoders +func (p *exporter) rawInt64(x int64) { + var tmp [binary.MaxVarintLen64]byte + n := binary.PutVarint(tmp[:], x) + p.data = append(p.data, tmp[:n]...) +} + +// utility functions + +func (p *exporter) tracef(format string, args ...interface{}) { + // rewrite format string to take care of indentation + const indent = ". " + if strings.IndexAny(format, "{}\n") >= 0 { + var buf bytes.Buffer + for i := 0; i < len(format); i++ { + // no need to deal with runes + ch := format[i] + switch ch { + case '{': + p.indent += indent + case '}': + p.indent = p.indent[:len(p.indent)-len(indent)] + if i+1 < len(format) && format[i+1] == '\n' { + buf.WriteByte('\n') + buf.WriteString(p.indent) + buf.WriteString("} ") + i++ + continue + } + } + buf.WriteByte(ch) + if ch == '\n' { + buf.WriteString(p.indent) + } + } + format = buf.String() + } + fmt.Printf(format, args...) +} + +func exported(name string) bool { + return ast.IsExported(name) +} diff --git a/vendor/golang.org/x/tools/go/importer/import.go b/vendor/golang.org/x/tools/go/importer/import.go new file mode 100644 index 0000000000..2de2054f66 --- /dev/null +++ b/vendor/golang.org/x/tools/go/importer/import.go @@ -0,0 +1,456 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This implementation is loosely based on the algorithm described +// in: "On the linearization of graphs and writing symbol files", +// by R. Griesemer, Technical Report 156, ETH Zürich, 1991. + +// Package importer implements an exporter and importer for Go export data. +package importer // import "golang.org/x/tools/go/importer" + +import ( + "encoding/binary" + "fmt" + "go/token" + + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/types" +) + +// ImportData imports a package from the serialized package data +// and returns the number of bytes consumed and a reference to the package. +// If data is obviously malformed, an error is returned but in +// general it is not recommended to call ImportData on untrusted +// data. +func ImportData(imports map[string]*types.Package, data []byte) (int, *types.Package, error) { + datalen := len(data) + + // check magic string + var s string + if len(data) >= len(magic) { + s = string(data[:len(magic)]) + data = data[len(magic):] + } + if s != magic { + return 0, nil, fmt.Errorf("incorrect magic string: got %q; want %q", s, magic) + } + + // check low-level encoding format + var m byte = 'm' // missing format + if len(data) > 0 { + m = data[0] + data = data[1:] + } + if m != format() { + return 0, nil, fmt.Errorf("incorrect low-level encoding format: got %c; want %c", m, format()) + } + + p := importer{ + data: data, + datalen: datalen, + imports: imports, + } + + // populate typList with predeclared types + for _, t := range predeclared { + p.typList = append(p.typList, t) + } + + if v := p.string(); v != version { + return 0, nil, fmt.Errorf("unknown version: got %s; want %s", v, version) + } + + pkg := p.pkg() + if debug && p.pkgList[0] != pkg { + panic("imported packaged not found in pkgList[0]") + } + + // read objects + n := p.int() + for i := 0; i < n; i++ { + p.obj(pkg) + } + + // complete interfaces + for _, typ := range p.typList { + if it, ok := typ.(*types.Interface); ok { + it.Complete() + } + } + + // package was imported completely and without errors + pkg.MarkComplete() + + return p.consumed(), pkg, nil +} + +type importer struct { + data []byte + datalen int + imports map[string]*types.Package + pkgList []*types.Package + typList []types.Type +} + +func (p *importer) pkg() *types.Package { + // if the package was seen before, i is its index (>= 0) + i := p.int() + if i >= 0 { + return p.pkgList[i] + } + + // otherwise, i is the package tag (< 0) + if i != packageTag { + panic(fmt.Sprintf("unexpected package tag %d", i)) + } + + // read package data + name := p.string() + path := p.string() + + // if the package was imported before, use that one; otherwise create a new one + pkg := p.imports[path] + if pkg == nil { + pkg = types.NewPackage(path, name) + p.imports[path] = pkg + } + p.pkgList = append(p.pkgList, pkg) + + return pkg +} + +func (p *importer) obj(pkg *types.Package) { + var obj types.Object + switch tag := p.int(); tag { + case constTag: + obj = types.NewConst(token.NoPos, pkg, p.string(), p.typ(), p.value()) + case typeTag: + // type object is added to scope via respective named type + _ = p.typ().(*types.Named) + return + case varTag: + obj = types.NewVar(token.NoPos, pkg, p.string(), p.typ()) + case funcTag: + obj = types.NewFunc(token.NoPos, pkg, p.string(), p.typ().(*types.Signature)) + default: + panic(fmt.Sprintf("unexpected object tag %d", tag)) + } + + if alt := pkg.Scope().Insert(obj); alt != nil { + panic(fmt.Sprintf("%s already declared", alt.Name())) + } +} + +func (p *importer) value() exact.Value { + switch kind := exact.Kind(p.int()); kind { + case falseTag: + return exact.MakeBool(false) + case trueTag: + return exact.MakeBool(true) + case int64Tag: + return exact.MakeInt64(p.int64()) + case floatTag: + return p.float() + case fractionTag: + return p.fraction() + case complexTag: + re := p.fraction() + im := p.fraction() + return exact.BinaryOp(re, token.ADD, exact.MakeImag(im)) + case stringTag: + return exact.MakeString(p.string()) + default: + panic(fmt.Sprintf("unexpected value kind %d", kind)) + } +} + +func (p *importer) float() exact.Value { + sign := p.int() + if sign == 0 { + return exact.MakeInt64(0) + } + + x := p.ufloat() + if sign < 0 { + x = exact.UnaryOp(token.SUB, x, 0) + } + return x +} + +func (p *importer) fraction() exact.Value { + sign := p.int() + if sign == 0 { + return exact.MakeInt64(0) + } + + x := exact.BinaryOp(p.ufloat(), token.QUO, p.ufloat()) + if sign < 0 { + x = exact.UnaryOp(token.SUB, x, 0) + } + return x +} + +func (p *importer) ufloat() exact.Value { + exp := p.int() + x := exact.MakeFromBytes(p.bytes()) + switch { + case exp < 0: + d := exact.Shift(exact.MakeInt64(1), token.SHL, uint(-exp)) + x = exact.BinaryOp(x, token.QUO, d) + case exp > 0: + x = exact.Shift(x, token.SHL, uint(exp)) + } + return x +} + +func (p *importer) record(t types.Type) { + p.typList = append(p.typList, t) +} + +func (p *importer) typ() types.Type { + // if the type was seen before, i is its index (>= 0) + i := p.int() + if i >= 0 { + return p.typList[i] + } + + // otherwise, i is the type tag (< 0) + switch i { + case arrayTag: + t := new(types.Array) + p.record(t) + + n := p.int64() + *t = *types.NewArray(p.typ(), n) + return t + + case sliceTag: + t := new(types.Slice) + p.record(t) + + *t = *types.NewSlice(p.typ()) + return t + + case structTag: + t := new(types.Struct) + p.record(t) + + n := p.int() + fields := make([]*types.Var, n) + tags := make([]string, n) + for i := range fields { + fields[i] = p.field() + tags[i] = p.string() + } + *t = *types.NewStruct(fields, tags) + return t + + case pointerTag: + t := new(types.Pointer) + p.record(t) + + *t = *types.NewPointer(p.typ()) + return t + + case signatureTag: + t := new(types.Signature) + p.record(t) + + *t = *p.signature() + return t + + case interfaceTag: + // Create a dummy entry in the type list. This is safe because we + // cannot expect the interface type to appear in a cycle, as any + // such cycle must contain a named type which would have been + // first defined earlier. + n := len(p.typList) + p.record(nil) + + // read embedded interfaces + embeddeds := make([]*types.Named, p.int()) + for i := range embeddeds { + embeddeds[i] = p.typ().(*types.Named) + } + + // read methods + methods := make([]*types.Func, p.int()) + for i := range methods { + pkg, name := p.qualifiedName() + methods[i] = types.NewFunc(token.NoPos, pkg, name, p.typ().(*types.Signature)) + } + + t := types.NewInterface(methods, embeddeds) + p.typList[n] = t + return t + + case mapTag: + t := new(types.Map) + p.record(t) + + *t = *types.NewMap(p.typ(), p.typ()) + return t + + case chanTag: + t := new(types.Chan) + p.record(t) + + *t = *types.NewChan(types.ChanDir(p.int()), p.typ()) + return t + + case namedTag: + // read type object + name := p.string() + pkg := p.pkg() + scope := pkg.Scope() + obj := scope.Lookup(name) + + // if the object doesn't exist yet, create and insert it + if obj == nil { + obj = types.NewTypeName(token.NoPos, pkg, name, nil) + scope.Insert(obj) + } + + // associate new named type with obj if it doesn't exist yet + t0 := types.NewNamed(obj.(*types.TypeName), nil, nil) + + // but record the existing type, if any + t := obj.Type().(*types.Named) + p.record(t) + + // read underlying type + t0.SetUnderlying(p.typ()) + + // read associated methods + for i, n := 0, p.int(); i < n; i++ { + t0.AddMethod(types.NewFunc(token.NoPos, pkg, p.string(), p.typ().(*types.Signature))) + } + + return t + + default: + panic(fmt.Sprintf("unexpected type tag %d", i)) + } +} + +func deref(typ types.Type) types.Type { + if p, _ := typ.(*types.Pointer); p != nil { + return p.Elem() + } + return typ +} + +func (p *importer) field() *types.Var { + pkg, name := p.qualifiedName() + typ := p.typ() + + anonymous := false + if name == "" { + // anonymous field - typ must be T or *T and T must be a type name + switch typ := deref(typ).(type) { + case *types.Basic: // basic types are named types + pkg = nil + name = typ.Name() + case *types.Named: + obj := typ.Obj() + name = obj.Name() + // correct the field package for anonymous fields + if exported(name) { + pkg = p.pkgList[0] + } + default: + panic("anonymous field expected") + } + anonymous = true + } + + return types.NewField(token.NoPos, pkg, name, typ, anonymous) +} + +func (p *importer) qualifiedName() (*types.Package, string) { + name := p.string() + pkg := p.pkgList[0] // exported names assume current package + if !exported(name) { + pkg = p.pkg() + } + return pkg, name +} + +func (p *importer) signature() *types.Signature { + var recv *types.Var + if p.int() != 0 { + recv = p.param() + } + return types.NewSignature(recv, p.tuple(), p.tuple(), p.int() != 0) +} + +func (p *importer) param() *types.Var { + return types.NewVar(token.NoPos, nil, p.string(), p.typ()) +} + +func (p *importer) tuple() *types.Tuple { + vars := make([]*types.Var, p.int()) + for i := range vars { + vars[i] = p.param() + } + return types.NewTuple(vars...) +} + +// ---------------------------------------------------------------------------- +// decoders + +func (p *importer) string() string { + return string(p.bytes()) +} + +func (p *importer) int() int { + return int(p.int64()) +} + +func (p *importer) int64() int64 { + if debug { + p.marker('i') + } + + return p.rawInt64() +} + +// Note: bytes() returns the respective byte slice w/o copy. +func (p *importer) bytes() []byte { + if debug { + p.marker('b') + } + + var b []byte + if n := int(p.rawInt64()); n > 0 { + b = p.data[:n] + p.data = p.data[n:] + } + return b +} + +func (p *importer) marker(want byte) { + if debug { + if got := p.data[0]; got != want { + panic(fmt.Sprintf("incorrect marker: got %c; want %c (pos = %d)", got, want, p.consumed())) + } + p.data = p.data[1:] + + pos := p.consumed() + if n := int(p.rawInt64()); n != pos { + panic(fmt.Sprintf("incorrect position: got %d; want %d", n, pos)) + } + } +} + +// rawInt64 should only be used by low-level decoders +func (p *importer) rawInt64() int64 { + i, n := binary.Varint(p.data) + p.data = p.data[n:] + return i +} + +func (p *importer) consumed() int { + return p.datalen - len(p.data) +} diff --git a/vendor/golang.org/x/tools/go/importer/import_test.go b/vendor/golang.org/x/tools/go/importer/import_test.go new file mode 100644 index 0000000000..95c373d804 --- /dev/null +++ b/vendor/golang.org/x/tools/go/importer/import_test.go @@ -0,0 +1,387 @@ +// Copyright 2013 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 importer + +import ( + "bufio" + "bytes" + "fmt" + "go/ast" + "go/build" + "go/parser" + "go/token" + "os" + "path/filepath" + "runtime" + "sort" + "strconv" + "testing" + "time" + + "golang.org/x/tools/go/gcimporter" + "golang.org/x/tools/go/types" +) + +var fset = token.NewFileSet() + +var tests = []string{ + `package p`, + + // consts + `package p; const X = true`, + `package p; const X, y, Z = true, false, 0 != 0`, + `package p; const ( A float32 = 1<= 750*time.Millisecond { + return + } + if lib == "cmd/internal/objfile" || lib == "net/http" { + // gcimporter doesn't support vendored imports. + // TODO(gri): fix. + continue + } + + pkg, err := pkgForPath(lib) + switch err := err.(type) { + case nil: + // ok + case *build.NoGoError: + // no Go files - ignore + continue + default: + t.Errorf("typecheck failed: %s", err) + continue + } + + size, gcsize := testExportImport(t, pkg, lib) + if gcsize == 0 { + // if gc import didn't happen, assume same size + // (and avoid division by zero below) + gcsize = size + } + + if testing.Verbose() { + fmt.Printf("%s\t%d\t%d\t%d%%\n", lib, size, gcsize, int(float64(size)*100/float64(gcsize))) + } + totSize += size + totGcSize += gcsize + } + + if testing.Verbose() { + fmt.Printf("\n%d\t%d\t%d%%\n", totSize, totGcSize, int(float64(totSize)*100/float64(totGcSize))) + } + + types.GcCompatibilityMode = false +} + +func testExportImport(t *testing.T, pkg0 *types.Package, path string) (size, gcsize int) { + data := ExportData(pkg0) + size = len(data) + + imports := make(map[string]*types.Package) + n, pkg1, err := ImportData(imports, data) + if err != nil { + t.Errorf("package %s: import failed: %s", pkg0.Name(), err) + return + } + if n != size { + t.Errorf("package %s: not all input data consumed", pkg0.Name()) + return + } + + s0 := pkgString(pkg0) + s1 := pkgString(pkg1) + if s1 != s0 { + t.Errorf("package %s: \nimport got:\n%s\nwant:\n%s\n", pkg0.Name(), s1, s0) + } + + // If we have a standard library, compare also against the gcimported package. + if path == "" { + return // not std library + } + + gcdata, err := gcExportData(path) + if err != nil { + if pkg0.Name() == "main" { + return // no export data present for main package + } + t.Errorf("package %s: couldn't get export data: %s", pkg0.Name(), err) + } + gcsize = len(gcdata) + + imports = make(map[string]*types.Package) + pkg2, err := gcImportData(imports, gcdata, path) + if err != nil { + t.Errorf("package %s: gcimport failed: %s", pkg0.Name(), err) + return + } + + s2 := pkgString(pkg2) + if s2 != s0 { + t.Errorf("package %s: \ngcimport got:\n%s\nwant:\n%s\n", pkg0.Name(), s2, s0) + } + + return +} + +func pkgForSource(src string) (*types.Package, error) { + f, err := parser.ParseFile(fset, "", src, 0) + if err != nil { + return nil, err + } + return typecheck("import-test", f) +} + +func pkgForPath(path string) (*types.Package, error) { + // collect filenames + ctxt := build.Default + pkginfo, err := ctxt.Import(path, "", 0) + if err != nil { + return nil, err + } + filenames := append(pkginfo.GoFiles, pkginfo.CgoFiles...) + + // parse files + files := make([]*ast.File, len(filenames)) + for i, filename := range filenames { + var err error + files[i], err = parser.ParseFile(fset, filepath.Join(pkginfo.Dir, filename), nil, 0) + if err != nil { + return nil, err + } + } + + return typecheck(path, files...) +} + +var defaultConf = types.Config{ + // we only care about exports and thus can ignore function bodies + IgnoreFuncBodies: true, + // work around C imports if possible + FakeImportC: true, + // strconv exports IntSize as a constant. The type-checker must + // use the same word size otherwise the result of the type-checker + // and gc imports is different. We don't care about alignment + // since none of the tests have exported constants depending + // on alignment (see also issue 8366). + Sizes: &types.StdSizes{WordSize: strconv.IntSize / 8, MaxAlign: 8}, +} + +func typecheck(path string, files ...*ast.File) (*types.Package, error) { + return defaultConf.Check(path, fset, files, nil) +} + +// pkgString returns a string representation of a package's exported interface. +func pkgString(pkg *types.Package) string { + var buf bytes.Buffer + + fmt.Fprintf(&buf, "package %s\n", pkg.Name()) + + scope := pkg.Scope() + for _, name := range scope.Names() { + if exported(name) { + obj := scope.Lookup(name) + buf.WriteString(obj.String()) + + switch obj := obj.(type) { + case *types.Const: + // For now only print constant values if they are not float + // or complex. This permits comparing go/types results with + // gc-generated gcimported package interfaces. + info := obj.Type().Underlying().(*types.Basic).Info() + if info&types.IsFloat == 0 && info&types.IsComplex == 0 { + fmt.Fprintf(&buf, " = %s", obj.Val()) + } + + case *types.TypeName: + // Print associated methods. + // Basic types (e.g., unsafe.Pointer) have *types.Basic + // type rather than *types.Named; so we need to check. + if typ, _ := obj.Type().(*types.Named); typ != nil { + if n := typ.NumMethods(); n > 0 { + // Sort methods by name so that we get the + // same order independent of whether the + // methods got imported or coming directly + // for the source. + // TODO(gri) This should probably be done + // in go/types. + list := make([]*types.Func, n) + for i := 0; i < n; i++ { + list[i] = typ.Method(i) + } + sort.Sort(byName(list)) + + buf.WriteString("\nmethods (\n") + for _, m := range list { + fmt.Fprintf(&buf, "\t%s\n", m) + } + buf.WriteString(")") + } + } + } + buf.WriteByte('\n') + } + } + + return buf.String() +} + +var stdLibRoot = filepath.Join(runtime.GOROOT(), "src") + string(filepath.Separator) + +// The following std libraries are excluded from the stdLibs list. +var excluded = map[string]bool{ + "builtin": true, // contains type declarations with cycles + "unsafe": true, // contains fake declarations +} + +// stdLibs returns the list of standard library package paths. +func stdLibs() (list []string, err error) { + err = filepath.Walk(stdLibRoot, func(path string, info os.FileInfo, err error) error { + if err == nil && info.IsDir() { + // testdata directories don't contain importable libraries + if info.Name() == "testdata" { + return filepath.SkipDir + } + pkgPath := path[len(stdLibRoot):] // remove stdLibRoot + if len(pkgPath) > 0 && !excluded[pkgPath] { + list = append(list, pkgPath) + } + } + return nil + }) + return +} + +type byName []*types.Func + +func (a byName) Len() int { return len(a) } +func (a byName) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byName) Less(i, j int) bool { return a[i].Name() < a[j].Name() } + +// gcExportData returns the gc-generated export data for the given path. +// It is based on a trimmed-down version of gcimporter.Import which does +// not do the actual import, does not handle package unsafe, and assumes +// that path is a correct standard library package path (no canonicalization, +// or handling of local import paths). +func gcExportData(path string) ([]byte, error) { + filename, id := gcimporter.FindPkg(path, "") + if filename == "" { + return nil, fmt.Errorf("can't find import: %s", path) + } + if id != path { + panic("path should be canonicalized") + } + + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + + buf := bufio.NewReader(f) + if err = gcimporter.FindExportData(buf); err != nil { + return nil, err + } + + var data []byte + for { + line, err := buf.ReadBytes('\n') + if err != nil { + return nil, err + } + data = append(data, line...) + // export data ends in "$$\n" + if len(line) == 3 && line[0] == '$' && line[1] == '$' { + return data, nil + } + } +} + +func gcImportData(imports map[string]*types.Package, data []byte, path string) (*types.Package, error) { + filename := fmt.Sprintf("", path) // so we have a decent error message if necessary + return gcimporter.ImportData(imports, filename, path, bufio.NewReader(bytes.NewBuffer(data))) +} diff --git a/vendor/golang.org/x/tools/go/importer/predefined.go b/vendor/golang.org/x/tools/go/importer/predefined.go new file mode 100644 index 0000000000..b23dfcb4c2 --- /dev/null +++ b/vendor/golang.org/x/tools/go/importer/predefined.go @@ -0,0 +1,84 @@ +// 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 importer + +import "golang.org/x/tools/go/types" + +const ( + magic = "\n$$ exports $$\n" + version = "v0" +) + +// Tags. Must be < 0. +const ( + // Packages + packageTag = -(iota + 1) + + // Objects + constTag + typeTag + varTag + funcTag + + // Types + arrayTag + sliceTag + structTag + pointerTag + signatureTag + interfaceTag + mapTag + chanTag + namedTag + + // Values + falseTag + trueTag + int64Tag + floatTag + fractionTag + complexTag + stringTag +) + +var predeclared = []types.Type{ + // basic types + types.Typ[types.Bool], + types.Typ[types.Int], + types.Typ[types.Int8], + types.Typ[types.Int16], + types.Typ[types.Int32], + types.Typ[types.Int64], + types.Typ[types.Uint], + types.Typ[types.Uint8], + types.Typ[types.Uint16], + types.Typ[types.Uint32], + types.Typ[types.Uint64], + types.Typ[types.Uintptr], + types.Typ[types.Float32], + types.Typ[types.Float64], + types.Typ[types.Complex64], + types.Typ[types.Complex128], + types.Typ[types.String], + + // untyped types + types.Typ[types.UntypedBool], + types.Typ[types.UntypedInt], + types.Typ[types.UntypedRune], + types.Typ[types.UntypedFloat], + types.Typ[types.UntypedComplex], + types.Typ[types.UntypedString], + types.Typ[types.UntypedNil], + + // package unsafe + types.Typ[types.UnsafePointer], + + // aliases + types.Universe.Lookup("byte").Type(), + types.Universe.Lookup("rune").Type(), + + // error + types.Universe.Lookup("error").Type(), +} diff --git a/vendor/golang.org/x/tools/go/loader/cgo.go b/vendor/golang.org/x/tools/go/loader/cgo.go new file mode 100644 index 0000000000..245b914914 --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/cgo.go @@ -0,0 +1,209 @@ +// Copyright 2013 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.5 + +package loader + +// This file handles cgo preprocessing of files containing `import "C"`. +// +// DESIGN +// +// The approach taken is to run the cgo processor on the package's +// CgoFiles and parse the output, faking the filenames of the +// resulting ASTs so that the synthetic file containing the C types is +// called "C" (e.g. "~/go/src/net/C") and the preprocessed files +// have their original names (e.g. "~/go/src/net/cgo_unix.go"), +// not the names of the actual temporary files. +// +// The advantage of this approach is its fidelity to 'go build'. The +// downside is that the token.Position.Offset for each AST node is +// incorrect, being an offset within the temporary file. Line numbers +// should still be correct because of the //line comments. +// +// The logic of this file is mostly plundered from the 'go build' +// tool, which also invokes the cgo preprocessor. +// +// +// REJECTED ALTERNATIVE +// +// An alternative approach that we explored is to extend go/types' +// Importer mechanism to provide the identity of the importing package +// so that each time `import "C"` appears it resolves to a different +// synthetic package containing just the objects needed in that case. +// The loader would invoke cgo but parse only the cgo_types.go file +// defining the package-level objects, discarding the other files +// resulting from preprocessing. +// +// The benefit of this approach would have been that source-level +// syntax information would correspond exactly to the original cgo +// file, with no preprocessing involved, making source tools like +// godoc, oracle, and eg happy. However, the approach was rejected +// due to the additional complexity it would impose on go/types. (It +// made for a beautiful demo, though.) +// +// cgo files, despite their *.go extension, are not legal Go source +// files per the specification since they may refer to unexported +// members of package "C" such as C.int. Also, a function such as +// C.getpwent has in effect two types, one matching its C type and one +// which additionally returns (errno C.int). The cgo preprocessor +// uses name mangling to distinguish these two functions in the +// processed code, but go/types would need to duplicate this logic in +// its handling of function calls, analogous to the treatment of map +// lookups in which y=m[k] and y,ok=m[k] are both legal. + +import ( + "fmt" + "go/ast" + "go/build" + "go/parser" + "go/token" + "io/ioutil" + "log" + "os" + "os/exec" + "path/filepath" + "regexp" + "strings" +) + +// processCgoFiles invokes the cgo preprocessor on bp.CgoFiles, parses +// the output and returns the resulting ASTs. +// +func processCgoFiles(bp *build.Package, fset *token.FileSet, DisplayPath func(path string) string, mode parser.Mode) ([]*ast.File, error) { + tmpdir, err := ioutil.TempDir("", strings.Replace(bp.ImportPath, "/", "_", -1)+"_C") + if err != nil { + return nil, err + } + defer os.RemoveAll(tmpdir) + + pkgdir := bp.Dir + if DisplayPath != nil { + pkgdir = DisplayPath(pkgdir) + } + + cgoFiles, cgoDisplayFiles, err := runCgo(bp, pkgdir, tmpdir) + if err != nil { + return nil, err + } + var files []*ast.File + for i := range cgoFiles { + rd, err := os.Open(cgoFiles[i]) + if err != nil { + return nil, err + } + display := filepath.Join(bp.Dir, cgoDisplayFiles[i]) + f, err := parser.ParseFile(fset, display, rd, mode) + rd.Close() + if err != nil { + return nil, err + } + files = append(files, f) + } + return files, nil +} + +var cgoRe = regexp.MustCompile(`[/\\:]`) + +// runCgo invokes the cgo preprocessor on bp.CgoFiles and returns two +// lists of files: the resulting processed files (in temporary +// directory tmpdir) and the corresponding names of the unprocessed files. +// +// runCgo is adapted from (*builder).cgo in +// $GOROOT/src/cmd/go/build.go, but these features are unsupported: +// Objective C, CGOPKGPATH, CGO_FLAGS. +// +func runCgo(bp *build.Package, pkgdir, tmpdir string) (files, displayFiles []string, err error) { + cgoCPPFLAGS, _, _, _ := cflags(bp, true) + _, cgoexeCFLAGS, _, _ := cflags(bp, false) + + if len(bp.CgoPkgConfig) > 0 { + pcCFLAGS, err := pkgConfigFlags(bp) + if err != nil { + return nil, nil, err + } + cgoCPPFLAGS = append(cgoCPPFLAGS, pcCFLAGS...) + } + + // Allows including _cgo_export.h from .[ch] files in the package. + cgoCPPFLAGS = append(cgoCPPFLAGS, "-I", tmpdir) + + // _cgo_gotypes.go (displayed "C") contains the type definitions. + files = append(files, filepath.Join(tmpdir, "_cgo_gotypes.go")) + displayFiles = append(displayFiles, "C") + for _, fn := range bp.CgoFiles { + // "foo.cgo1.go" (displayed "foo.go") is the processed Go source. + f := cgoRe.ReplaceAllString(fn[:len(fn)-len("go")], "_") + files = append(files, filepath.Join(tmpdir, f+"cgo1.go")) + displayFiles = append(displayFiles, fn) + } + + var cgoflags []string + if bp.Goroot && bp.ImportPath == "runtime/cgo" { + cgoflags = append(cgoflags, "-import_runtime_cgo=false") + } + if bp.Goroot && bp.ImportPath == "runtime/race" || bp.ImportPath == "runtime/cgo" { + cgoflags = append(cgoflags, "-import_syscall=false") + } + + args := stringList( + "go", "tool", "cgo", "-objdir", tmpdir, cgoflags, "--", + cgoCPPFLAGS, cgoexeCFLAGS, bp.CgoFiles, + ) + if false { + log.Printf("Running cgo for package %q: %s (dir=%s)", bp.ImportPath, args, pkgdir) + } + cmd := exec.Command(args[0], args[1:]...) + cmd.Dir = pkgdir + cmd.Stdout = os.Stderr + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + return nil, nil, fmt.Errorf("cgo failed: %s: %s", args, err) + } + + return files, displayFiles, nil +} + +// -- unmodified from 'go build' --------------------------------------- + +// Return the flags to use when invoking the C or C++ compilers, or cgo. +func cflags(p *build.Package, def bool) (cppflags, cflags, cxxflags, ldflags []string) { + var defaults string + if def { + defaults = "-g -O2" + } + + cppflags = stringList(envList("CGO_CPPFLAGS", ""), p.CgoCPPFLAGS) + cflags = stringList(envList("CGO_CFLAGS", defaults), p.CgoCFLAGS) + cxxflags = stringList(envList("CGO_CXXFLAGS", defaults), p.CgoCXXFLAGS) + ldflags = stringList(envList("CGO_LDFLAGS", defaults), p.CgoLDFLAGS) + return +} + +// envList returns the value of the given environment variable broken +// into fields, using the default value when the variable is empty. +func envList(key, def string) []string { + v := os.Getenv(key) + if v == "" { + v = def + } + return strings.Fields(v) +} + +// stringList's arguments should be a sequence of string or []string values. +// stringList flattens them into a single []string. +func stringList(args ...interface{}) []string { + var x []string + for _, arg := range args { + switch arg := arg.(type) { + case []string: + x = append(x, arg...) + case string: + x = append(x, arg) + default: + panic("stringList: invalid argument") + } + } + return x +} diff --git a/vendor/golang.org/x/tools/go/loader/cgo14.go b/vendor/golang.org/x/tools/go/loader/cgo14.go new file mode 100644 index 0000000000..d484c7db1f --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/cgo14.go @@ -0,0 +1,210 @@ +// Copyright 2013 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.5 + +package loader + +// This file handles cgo preprocessing of files containing `import "C"`. +// +// DESIGN +// +// The approach taken is to run the cgo processor on the package's +// CgoFiles and parse the output, faking the filenames of the +// resulting ASTs so that the synthetic file containing the C types is +// called "C" (e.g. "~/go/src/net/C") and the preprocessed files +// have their original names (e.g. "~/go/src/net/cgo_unix.go"), +// not the names of the actual temporary files. +// +// The advantage of this approach is its fidelity to 'go build'. The +// downside is that the token.Position.Offset for each AST node is +// incorrect, being an offset within the temporary file. Line numbers +// should still be correct because of the //line comments. +// +// The logic of this file is mostly plundered from the 'go build' +// tool, which also invokes the cgo preprocessor. +// +// +// REJECTED ALTERNATIVE +// +// An alternative approach that we explored is to extend go/types' +// Importer mechanism to provide the identity of the importing package +// so that each time `import "C"` appears it resolves to a different +// synthetic package containing just the objects needed in that case. +// The loader would invoke cgo but parse only the cgo_types.go file +// defining the package-level objects, discarding the other files +// resulting from preprocessing. +// +// The benefit of this approach would have been that source-level +// syntax information would correspond exactly to the original cgo +// file, with no preprocessing involved, making source tools like +// godoc, oracle, and eg happy. However, the approach was rejected +// due to the additional complexity it would impose on go/types. (It +// made for a beautiful demo, though.) +// +// cgo files, despite their *.go extension, are not legal Go source +// files per the specification since they may refer to unexported +// members of package "C" such as C.int. Also, a function such as +// C.getpwent has in effect two types, one matching its C type and one +// which additionally returns (errno C.int). The cgo preprocessor +// uses name mangling to distinguish these two functions in the +// processed code, but go/types would need to duplicate this logic in +// its handling of function calls, analogous to the treatment of map +// lookups in which y=m[k] and y,ok=m[k] are both legal. + +import ( + "fmt" + "go/ast" + "go/build" + "go/parser" + "go/token" + "io/ioutil" + "log" + "os" + "os/exec" + "path/filepath" + "regexp" + "strings" +) + +// processCgoFiles invokes the cgo preprocessor on bp.CgoFiles, parses +// the output and returns the resulting ASTs. +// +func processCgoFiles(bp *build.Package, fset *token.FileSet, DisplayPath func(path string) string, mode parser.Mode) ([]*ast.File, error) { + tmpdir, err := ioutil.TempDir("", strings.Replace(bp.ImportPath, "/", "_", -1)+"_C") + if err != nil { + return nil, err + } + defer os.RemoveAll(tmpdir) + + pkgdir := bp.Dir + if DisplayPath != nil { + pkgdir = DisplayPath(pkgdir) + } + + cgoFiles, cgoDisplayFiles, err := runCgo(bp, pkgdir, tmpdir) + if err != nil { + return nil, err + } + var files []*ast.File + for i := range cgoFiles { + rd, err := os.Open(cgoFiles[i]) + if err != nil { + return nil, err + } + display := filepath.Join(bp.Dir, cgoDisplayFiles[i]) + f, err := parser.ParseFile(fset, display, rd, mode) + rd.Close() + if err != nil { + return nil, err + } + files = append(files, f) + } + return files, nil +} + +var cgoRe = regexp.MustCompile(`[/\\:]`) + +// runCgo invokes the cgo preprocessor on bp.CgoFiles and returns two +// lists of files: the resulting processed files (in temporary +// directory tmpdir) and the corresponding names of the unprocessed files. +// +// runCgo is adapted from (*builder).cgo in +// $GOROOT/src/cmd/go/build.go, but these features are unsupported: +// Objective C, CGOPKGPATH, CGO_FLAGS. +// +func runCgo(bp *build.Package, pkgdir, tmpdir string) (files, displayFiles []string, err error) { + cgoCPPFLAGS, _, _, cgoLDFLAGS := cflags(bp, true) + _, cgoexeCFLAGS, _, _ := cflags(bp, false) + + if len(bp.CgoPkgConfig) > 0 { + pcCFLAGS, pcLDFLAGS, err := pkgConfigFlags(bp) + if err != nil { + return nil, nil, err + } + cgoCPPFLAGS = append(cgoCPPFLAGS, pcCFLAGS...) + cgoLDFLAGS = append(cgoLDFLAGS, pcLDFLAGS...) + } + + // Allows including _cgo_export.h from .[ch] files in the package. + cgoCPPFLAGS = append(cgoCPPFLAGS, "-I", tmpdir) + + // _cgo_gotypes.go (displayed "C") contains the type definitions. + files = append(files, filepath.Join(tmpdir, "_cgo_gotypes.go")) + displayFiles = append(displayFiles, "C") + for _, fn := range bp.CgoFiles { + // "foo.cgo1.go" (displayed "foo.go") is the processed Go source. + f := cgoRe.ReplaceAllString(fn[:len(fn)-len("go")], "_") + files = append(files, filepath.Join(tmpdir, f+"cgo1.go")) + displayFiles = append(displayFiles, fn) + } + + var cgoflags []string + if bp.Goroot && bp.ImportPath == "runtime/cgo" { + cgoflags = append(cgoflags, "-import_runtime_cgo=false") + } + if bp.Goroot && bp.ImportPath == "runtime/race" || bp.ImportPath == "runtime/cgo" { + cgoflags = append(cgoflags, "-import_syscall=false") + } + + args := stringList( + "go", "tool", "cgo", "-objdir", tmpdir, cgoflags, "--", + cgoCPPFLAGS, cgoLDFLAGS, cgoexeCFLAGS, bp.CgoFiles, + ) + if false { + log.Printf("Running cgo for package %q: %s (dir=%s)", bp.ImportPath, args, pkgdir) + } + cmd := exec.Command(args[0], args[1:]...) + cmd.Dir = pkgdir + cmd.Stdout = os.Stderr + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + return nil, nil, fmt.Errorf("cgo failed: %s: %s", args, err) + } + + return files, displayFiles, nil +} + +// -- unmodified from 'go build' --------------------------------------- + +// Return the flags to use when invoking the C or C++ compilers, or cgo. +func cflags(p *build.Package, def bool) (cppflags, cflags, cxxflags, ldflags []string) { + var defaults string + if def { + defaults = "-g -O2" + } + + cppflags = stringList(envList("CGO_CPPFLAGS", ""), p.CgoCPPFLAGS) + cflags = stringList(envList("CGO_CFLAGS", defaults), p.CgoCFLAGS) + cxxflags = stringList(envList("CGO_CXXFLAGS", defaults), p.CgoCXXFLAGS) + ldflags = stringList(envList("CGO_LDFLAGS", defaults), p.CgoLDFLAGS) + return +} + +// envList returns the value of the given environment variable broken +// into fields, using the default value when the variable is empty. +func envList(key, def string) []string { + v := os.Getenv(key) + if v == "" { + v = def + } + return strings.Fields(v) +} + +// stringList's arguments should be a sequence of string or []string values. +// stringList flattens them into a single []string. +func stringList(args ...interface{}) []string { + var x []string + for _, arg := range args { + switch arg := arg.(type) { + case []string: + x = append(x, arg...) + case string: + x = append(x, arg) + default: + panic("stringList: invalid argument") + } + } + return x +} diff --git a/vendor/golang.org/x/tools/go/loader/cgo_pkgconfig.go b/vendor/golang.org/x/tools/go/loader/cgo_pkgconfig.go new file mode 100644 index 0000000000..de57422df2 --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/cgo_pkgconfig.go @@ -0,0 +1,39 @@ +// Copyright 2013 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 loader + +import ( + "errors" + "fmt" + "go/build" + "os/exec" + "strings" +) + +// pkgConfig runs pkg-config with the specified arguments and returns the flags it prints. +func pkgConfig(mode string, pkgs []string) (flags []string, err error) { + cmd := exec.Command("pkg-config", append([]string{mode}, pkgs...)...) + out, err := cmd.CombinedOutput() + if err != nil { + s := fmt.Sprintf("%s failed: %v", strings.Join(cmd.Args, " "), err) + if len(out) > 0 { + s = fmt.Sprintf("%s: %s", s, out) + } + return nil, errors.New(s) + } + if len(out) > 0 { + flags = strings.Fields(string(out)) + } + return +} + +// pkgConfigFlags calls pkg-config if needed and returns the cflags +// needed to build the package. +func pkgConfigFlags(p *build.Package) (cflags []string, err error) { + if len(p.CgoPkgConfig) == 0 { + return nil, nil + } + return pkgConfig("--cflags", p.CgoPkgConfig) +} diff --git a/vendor/golang.org/x/tools/go/loader/doc.go b/vendor/golang.org/x/tools/go/loader/doc.go new file mode 100644 index 0000000000..9b51c9ecde --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/doc.go @@ -0,0 +1,205 @@ +// 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 loader loads a complete Go program from source code, parsing +// and type-checking the initial packages plus their transitive closure +// of dependencies. The ASTs and the derived facts are retained for +// later use. +// +// THIS INTERFACE IS EXPERIMENTAL AND IS LIKELY TO CHANGE. +// +// The package defines two primary types: Config, which specifies a +// set of initial packages to load and various other options; and +// Program, which is the result of successfully loading the packages +// specified by a configuration. +// +// The configuration can be set directly, but *Config provides various +// convenience methods to simplify the common cases, each of which can +// be called any number of times. Finally, these are followed by a +// call to Load() to actually load and type-check the program. +// +// var conf loader.Config +// +// // Use the command-line arguments to specify +// // a set of initial packages to load from source. +// // See FromArgsUsage for help. +// rest, err := conf.FromArgs(os.Args[1:], wantTests) +// +// // Parse the specified files and create an ad hoc package with path "foo". +// // All files must have the same 'package' declaration. +// conf.CreateFromFilenames("foo", "foo.go", "bar.go") +// +// // Create an ad hoc package with path "foo" from +// // the specified already-parsed files. +// // All ASTs must have the same 'package' declaration. +// conf.CreateFromFiles("foo", parsedFiles) +// +// // Add "runtime" to the set of packages to be loaded. +// conf.Import("runtime") +// +// // Adds "fmt" and "fmt_test" to the set of packages +// // to be loaded. "fmt" will include *_test.go files. +// conf.ImportWithTests("fmt") +// +// // Finally, load all the packages specified by the configuration. +// prog, err := conf.Load() +// +// See examples_test.go for examples of API usage. +// +// +// CONCEPTS AND TERMINOLOGY +// +// The WORKSPACE is the set of packages accessible to the loader. The +// workspace is defined by Config.Build, a *build.Context. The +// default context treats subdirectories of $GOROOT and $GOPATH as +// packages, but this behavior may be overridden. +// +// An AD HOC package is one specified as a set of source files on the +// command line. In the simplest case, it may consist of a single file +// such as $GOROOT/src/net/http/triv.go. +// +// EXTERNAL TEST packages are those comprised of a set of *_test.go +// files all with the same 'package foo_test' declaration, all in the +// same directory. (go/build.Package calls these files XTestFiles.) +// +// An IMPORTABLE package is one that can be referred to by some import +// spec. Every importable package is uniquely identified by its +// PACKAGE PATH or just PATH, a string such as "fmt", "encoding/json", +// or "cmd/vendor/golang.org/x/arch/x86/x86asm". A package path +// typically denotes a subdirectory of the workspace. +// +// An import declaration uses an IMPORT PATH to refer to a package. +// Most import declarations use the package path as the import path. +// +// Due to VENDORING (https://golang.org/s/go15vendor), the +// interpretation of an import path may depend on the directory in which +// it appears. To resolve an import path to a package path, go/build +// must search the enclosing directories for a subdirectory named +// "vendor". +// +// ad hoc packages and external test packages are NON-IMPORTABLE. The +// path of an ad hoc package is inferred from the package +// declarations of its files and is therefore not a unique package key. +// For example, Config.CreatePkgs may specify two initial ad hoc +// packages, both with path "main". +// +// An AUGMENTED package is an importable package P plus all the +// *_test.go files with same 'package foo' declaration as P. +// (go/build.Package calls these files TestFiles.) +// +// The INITIAL packages are those specified in the configuration. A +// DEPENDENCY is a package loaded to satisfy an import in an initial +// package or another dependency. +// +package loader + +// IMPLEMENTATION NOTES +// +// 'go test', in-package test files, and import cycles +// --------------------------------------------------- +// +// An external test package may depend upon members of the augmented +// package that are not in the unaugmented package, such as functions +// that expose internals. (See bufio/export_test.go for an example.) +// So, the loader must ensure that for each external test package +// it loads, it also augments the corresponding non-test package. +// +// The import graph over n unaugmented packages must be acyclic; the +// import graph over n-1 unaugmented packages plus one augmented +// package must also be acyclic. ('go test' relies on this.) But the +// import graph over n augmented packages may contain cycles. +// +// First, all the (unaugmented) non-test packages and their +// dependencies are imported in the usual way; the loader reports an +// error if it detects an import cycle. +// +// Then, each package P for which testing is desired is augmented by +// the list P' of its in-package test files, by calling +// (*types.Checker).Files. This arrangement ensures that P' may +// reference definitions within P, but P may not reference definitions +// within P'. Furthermore, P' may import any other package, including +// ones that depend upon P, without an import cycle error. +// +// Consider two packages A and B, both of which have lists of +// in-package test files we'll call A' and B', and which have the +// following import graph edges: +// B imports A +// B' imports A +// A' imports B +// This last edge would be expected to create an error were it not +// for the special type-checking discipline above. +// Cycles of size greater than two are possible. For example: +// compress/bzip2/bzip2_test.go (package bzip2) imports "io/ioutil" +// io/ioutil/tempfile_test.go (package ioutil) imports "regexp" +// regexp/exec_test.go (package regexp) imports "compress/bzip2" +// +// +// Concurrency +// ----------- +// +// Let us define the import dependency graph as follows. Each node is a +// list of files passed to (Checker).Files at once. Many of these lists +// are the production code of an importable Go package, so those nodes +// are labelled by the package's path. The remaining nodes are +// ad hoc packages and lists of in-package *_test.go files that augment +// an importable package; those nodes have no label. +// +// The edges of the graph represent import statements appearing within a +// file. An edge connects a node (a list of files) to the node it +// imports, which is importable and thus always labelled. +// +// Loading is controlled by this dependency graph. +// +// To reduce I/O latency, we start loading a package's dependencies +// asynchronously as soon as we've parsed its files and enumerated its +// imports (scanImports). This performs a preorder traversal of the +// import dependency graph. +// +// To exploit hardware parallelism, we type-check unrelated packages in +// parallel, where "unrelated" means not ordered by the partial order of +// the import dependency graph. +// +// We use a concurrency-safe non-blocking cache (importer.imported) to +// record the results of type-checking, whether success or failure. An +// entry is created in this cache by startLoad the first time the +// package is imported. The first goroutine to request an entry becomes +// responsible for completing the task and broadcasting completion to +// subsequent requestors, which block until then. +// +// Type checking occurs in (parallel) postorder: we cannot type-check a +// set of files until we have loaded and type-checked all of their +// immediate dependencies (and thus all of their transitive +// dependencies). If the input were guaranteed free of import cycles, +// this would be trivial: we could simply wait for completion of the +// dependencies and then invoke the typechecker. +// +// But as we saw in the 'go test' section above, some cycles in the +// import graph over packages are actually legal, so long as the +// cycle-forming edge originates in the in-package test files that +// augment the package. This explains why the nodes of the import +// dependency graph are not packages, but lists of files: the unlabelled +// nodes avoid the cycles. Consider packages A and B where B imports A +// and A's in-package tests AT import B. The naively constructed import +// graph over packages would contain a cycle (A+AT) --> B --> (A+AT) but +// the graph over lists of files is AT --> B --> A, where AT is an +// unlabelled node. +// +// Awaiting completion of the dependencies in a cyclic graph would +// deadlock, so we must materialize the import dependency graph (as +// importer.graph) and check whether each import edge forms a cycle. If +// x imports y, and the graph already contains a path from y to x, then +// there is an import cycle, in which case the processing of x must not +// wait for the completion of processing of y. +// +// When the type-checker makes a callback (doImport) to the loader for a +// given import edge, there are two possible cases. In the normal case, +// the dependency has already been completely type-checked; doImport +// does a cache lookup and returns it. In the cyclic case, the entry in +// the cache is still necessarily incomplete, indicating a cycle. We +// perform the cycle check again to obtain the error message, and return +// the error. +// +// The result of using concurrency is about a 2.5x speedup for stdlib_test. + +// TODO(adonovan): overhaul the package documentation. diff --git a/vendor/golang.org/x/tools/go/loader/example14_test.go b/vendor/golang.org/x/tools/go/loader/example14_test.go new file mode 100644 index 0000000000..67dbefa538 --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/example14_test.go @@ -0,0 +1,173 @@ +// 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.5 +// +build !windows + +package loader_test + +import ( + "fmt" + "go/token" + "log" + "path/filepath" + "runtime" + "sort" + + "golang.org/x/tools/go/loader" +) + +func printProgram(prog *loader.Program) { + // Created packages are the initial packages specified by a call + // to CreateFromFilenames or CreateFromFiles. + var names []string + for _, info := range prog.Created { + names = append(names, info.Pkg.Path()) + } + fmt.Printf("created: %s\n", names) + + // Imported packages are the initial packages specified by a + // call to Import or ImportWithTests. + names = nil + for _, info := range prog.Imported { + names = append(names, info.Pkg.Path()) + } + sort.Strings(names) + fmt.Printf("imported: %s\n", names) + + // InitialPackages contains the union of created and imported. + names = nil + for _, info := range prog.InitialPackages() { + names = append(names, info.Pkg.Path()) + } + sort.Strings(names) + fmt.Printf("initial: %s\n", names) + + // AllPackages contains all initial packages and their dependencies. + names = nil + for pkg := range prog.AllPackages { + names = append(names, pkg.Path()) + } + sort.Strings(names) + fmt.Printf("all: %s\n", names) +} + +func printFilenames(fset *token.FileSet, info *loader.PackageInfo) { + var names []string + for _, f := range info.Files { + names = append(names, filepath.Base(fset.File(f.Pos()).Name())) + } + fmt.Printf("%s.Files: %s\n", info.Pkg.Path(), names) +} + +// This example loads a set of packages and all of their dependencies +// from a typical command-line. FromArgs parses a command line and +// makes calls to the other methods of Config shown in the examples that +// follow. +func ExampleConfig_FromArgs() { + args := []string{"mytool", "unicode/utf8", "errors", "runtime", "--", "foo", "bar"} + const wantTests = false + + var conf loader.Config + rest, err := conf.FromArgs(args[1:], wantTests) + prog, err := conf.Load() + if err != nil { + log.Fatal(err) + } + + fmt.Printf("rest: %s\n", rest) + printProgram(prog) + // Output: + // rest: [foo bar] + // created: [] + // imported: [errors runtime unicode/utf8] + // initial: [errors runtime unicode/utf8] + // all: [errors runtime unicode/utf8 unsafe] +} + +// This example creates and type-checks a single package (without tests) +// from a list of filenames, and loads all of its dependencies. +func ExampleConfig_CreateFromFilenames() { + var conf loader.Config + filename := filepath.Join(runtime.GOROOT(), "src/container/heap/heap.go") + conf.CreateFromFilenames("container/heap", filename) + prog, err := conf.Load() + if err != nil { + log.Fatal(err) + } + + printProgram(prog) + // Output: + // created: [container/heap] + // imported: [] + // initial: [container/heap] + // all: [container/heap sort] +} + +// In the examples below, for stability, the chosen packages are +// relatively small, platform-independent, and low-level (and thus +// infrequently changing). +// The strconv package has internal and external tests. + +const hello = `package main + +import "fmt" + +func main() { + fmt.Println("Hello, world.") +} +` + +// This example creates and type-checks a package from a list of +// already-parsed files, and loads all its dependencies. +func ExampleConfig_CreateFromFiles() { + var conf loader.Config + f, err := conf.ParseFile("hello.go", hello) + if err != nil { + log.Fatal(err) + } + conf.CreateFromFiles("hello", f) + prog, err := conf.Load() + if err != nil { + log.Fatal(err) + } + + printProgram(prog) + printFilenames(prog.Fset, prog.Package("strconv")) + // Output: + // created: [hello] + // imported: [] + // initial: [hello] + // all: [errors fmt hello io math os reflect runtime strconv sync sync/atomic syscall time unicode/utf8 unsafe] + // strconv.Files: [atob.go atof.go atoi.go decimal.go extfloat.go ftoa.go isprint.go itoa.go quote.go] +} + +// This example imports three packages, including the tests for one of +// them, and loads all their dependencies. +func ExampleConfig_Import() { + // ImportWithTest("strconv") causes strconv to include + // internal_test.go, and creates an external test package, + // strconv_test. + // (Compare with the example of CreateFromFiles.) + + var conf loader.Config + conf.Import("unicode/utf8") + conf.Import("errors") + conf.ImportWithTests("strconv") + prog, err := conf.Load() + if err != nil { + log.Fatal(err) + } + + printProgram(prog) + printFilenames(prog.Fset, prog.Package("strconv")) + printFilenames(prog.Fset, prog.Package("strconv_test")) + // Output: + // created: [strconv_test] + // imported: [errors strconv unicode/utf8] + // initial: [errors strconv strconv_test unicode/utf8] + // all: [bufio bytes errors flag fmt io math math/rand os reflect runtime runtime/pprof sort strconv strconv_test strings sync sync/atomic syscall testing text/tabwriter time unicode unicode/utf8 unsafe] + // strconv.Files: [atob.go atof.go atoi.go decimal.go extfloat.go ftoa.go isprint.go itoa.go quote.go internal_test.go] + // strconv_test.Files: [atob_test.go atof_test.go atoi_test.go decimal_test.go fp_test.go ftoa_test.go itoa_test.go quote_example_test.go quote_test.go strconv_test.go] +} diff --git a/vendor/golang.org/x/tools/go/loader/example15_test.go b/vendor/golang.org/x/tools/go/loader/example15_test.go new file mode 100644 index 0000000000..5cf365b1c0 --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/example15_test.go @@ -0,0 +1,177 @@ +// 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.5,!go1.6 +// +build !windows + +package loader_test + +import ( + "fmt" + "go/token" + "log" + "path/filepath" + "runtime" + "sort" + "strings" + + "golang.org/x/tools/go/loader" +) + +func printProgram(prog *loader.Program) { + // Created packages are the initial packages specified by a call + // to CreateFromFilenames or CreateFromFiles. + var names []string + for _, info := range prog.Created { + names = append(names, info.Pkg.Path()) + } + fmt.Printf("created: %s\n", names) + + // Imported packages are the initial packages specified by a + // call to Import or ImportWithTests. + names = nil + for _, info := range prog.Imported { + if strings.Contains(info.Pkg.Path(), "internal") { + continue // skip, to reduce fragility + } + names = append(names, info.Pkg.Path()) + } + sort.Strings(names) + fmt.Printf("imported: %s\n", names) + + // InitialPackages contains the union of created and imported. + names = nil + for _, info := range prog.InitialPackages() { + names = append(names, info.Pkg.Path()) + } + sort.Strings(names) + fmt.Printf("initial: %s\n", names) + + // AllPackages contains all initial packages and their dependencies. + names = nil + for pkg := range prog.AllPackages { + names = append(names, pkg.Path()) + } + sort.Strings(names) + fmt.Printf("all: %s\n", names) +} + +func printFilenames(fset *token.FileSet, info *loader.PackageInfo) { + var names []string + for _, f := range info.Files { + names = append(names, filepath.Base(fset.File(f.Pos()).Name())) + } + fmt.Printf("%s.Files: %s\n", info.Pkg.Path(), names) +} + +// This example loads a set of packages and all of their dependencies +// from a typical command-line. FromArgs parses a command line and +// makes calls to the other methods of Config shown in the examples that +// follow. +func ExampleConfig_FromArgs() { + args := []string{"mytool", "unicode/utf8", "errors", "runtime", "--", "foo", "bar"} + const wantTests = false + + var conf loader.Config + rest, err := conf.FromArgs(args[1:], wantTests) + prog, err := conf.Load() + if err != nil { + log.Fatal(err) + } + + fmt.Printf("rest: %s\n", rest) + printProgram(prog) + // Output: + // rest: [foo bar] + // created: [] + // imported: [errors runtime unicode/utf8] + // initial: [errors runtime unicode/utf8] + // all: [errors runtime unicode/utf8 unsafe] +} + +// This example creates and type-checks a single package (without tests) +// from a list of filenames, and loads all of its dependencies. +func ExampleConfig_CreateFromFilenames() { + var conf loader.Config + filename := filepath.Join(runtime.GOROOT(), "src/container/heap/heap.go") + conf.CreateFromFilenames("container/heap", filename) + prog, err := conf.Load() + if err != nil { + log.Fatal(err) + } + + printProgram(prog) + // Output: + // created: [container/heap] + // imported: [] + // initial: [container/heap] + // all: [container/heap sort] +} + +// In the examples below, for stability, the chosen packages are +// relatively small, platform-independent, and low-level (and thus +// infrequently changing). +// The strconv package has internal and external tests. + +const hello = `package main + +import "fmt" + +func main() { + fmt.Println("Hello, world.") +} +` + +// This example creates and type-checks a package from a list of +// already-parsed files, and loads all its dependencies. +func ExampleConfig_CreateFromFiles() { + var conf loader.Config + f, err := conf.ParseFile("hello.go", hello) + if err != nil { + log.Fatal(err) + } + conf.CreateFromFiles("hello", f) + prog, err := conf.Load() + if err != nil { + log.Fatal(err) + } + + printProgram(prog) + printFilenames(prog.Fset, prog.Package("strconv")) + // Output: + // created: [hello] + // imported: [] + // initial: [hello] + // all: [errors fmt hello io math os reflect runtime strconv sync sync/atomic syscall time unicode/utf8 unsafe] + // strconv.Files: [atob.go atof.go atoi.go decimal.go doc.go extfloat.go ftoa.go isprint.go itoa.go quote.go] +} + +// This example imports three packages, including the tests for one of +// them, and loads all their dependencies. +func ExampleConfig_Import() { + // ImportWithTest("strconv") causes strconv to include + // internal_test.go, and creates an external test package, + // strconv_test. + // (Compare with the example of CreateFromFiles.) + + var conf loader.Config + conf.Import("unicode/utf8") + conf.Import("errors") + conf.ImportWithTests("strconv") + prog, err := conf.Load() + if err != nil { + log.Fatal(err) + } + + printProgram(prog) + printFilenames(prog.Fset, prog.Package("strconv")) + printFilenames(prog.Fset, prog.Package("strconv_test")) + // Output: + // created: [strconv_test] + // imported: [errors strconv unicode/utf8] + // initial: [errors strconv strconv_test unicode/utf8] + // all: [bufio bytes errors flag fmt io log math math/rand os reflect runtime runtime/pprof runtime/trace sort strconv strconv_test strings sync sync/atomic syscall testing text/tabwriter time unicode unicode/utf8 unsafe] + // strconv.Files: [atob.go atof.go atoi.go decimal.go doc.go extfloat.go ftoa.go isprint.go itoa.go quote.go internal_test.go] + // strconv_test.Files: [atob_test.go atof_test.go atoi_test.go decimal_test.go example_test.go fp_test.go ftoa_test.go itoa_test.go quote_test.go strconv_test.go] +} diff --git a/vendor/golang.org/x/tools/go/loader/example_test.go b/vendor/golang.org/x/tools/go/loader/example_test.go new file mode 100644 index 0000000000..66ddb923ef --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/example_test.go @@ -0,0 +1,177 @@ +// 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 +// +build !windows + +package loader_test + +import ( + "fmt" + "go/token" + "log" + "path/filepath" + "runtime" + "sort" + "strings" + + "golang.org/x/tools/go/loader" +) + +func printProgram(prog *loader.Program) { + // Created packages are the initial packages specified by a call + // to CreateFromFilenames or CreateFromFiles. + var names []string + for _, info := range prog.Created { + names = append(names, info.Pkg.Path()) + } + fmt.Printf("created: %s\n", names) + + // Imported packages are the initial packages specified by a + // call to Import or ImportWithTests. + names = nil + for _, info := range prog.Imported { + if strings.Contains(info.Pkg.Path(), "internal") { + continue // skip, to reduce fragility + } + names = append(names, info.Pkg.Path()) + } + sort.Strings(names) + fmt.Printf("imported: %s\n", names) + + // InitialPackages contains the union of created and imported. + names = nil + for _, info := range prog.InitialPackages() { + names = append(names, info.Pkg.Path()) + } + sort.Strings(names) + fmt.Printf("initial: %s\n", names) + + // AllPackages contains all initial packages and their dependencies. + names = nil + for pkg := range prog.AllPackages { + names = append(names, pkg.Path()) + } + sort.Strings(names) + fmt.Printf("all: %s\n", names) +} + +func printFilenames(fset *token.FileSet, info *loader.PackageInfo) { + var names []string + for _, f := range info.Files { + names = append(names, filepath.Base(fset.File(f.Pos()).Name())) + } + fmt.Printf("%s.Files: %s\n", info.Pkg.Path(), names) +} + +// This example loads a set of packages and all of their dependencies +// from a typical command-line. FromArgs parses a command line and +// makes calls to the other methods of Config shown in the examples that +// follow. +func ExampleConfig_FromArgs() { + args := []string{"mytool", "unicode/utf8", "errors", "runtime", "--", "foo", "bar"} + const wantTests = false + + var conf loader.Config + rest, err := conf.FromArgs(args[1:], wantTests) + prog, err := conf.Load() + if err != nil { + log.Fatal(err) + } + + fmt.Printf("rest: %s\n", rest) + printProgram(prog) + // Output: + // rest: [foo bar] + // created: [] + // imported: [errors runtime unicode/utf8] + // initial: [errors runtime unicode/utf8] + // all: [errors runtime runtime/internal/atomic runtime/internal/sys unicode/utf8 unsafe] +} + +// This example creates and type-checks a single package (without tests) +// from a list of filenames, and loads all of its dependencies. +func ExampleConfig_CreateFromFilenames() { + var conf loader.Config + filename := filepath.Join(runtime.GOROOT(), "src/container/heap/heap.go") + conf.CreateFromFilenames("container/heap", filename) + prog, err := conf.Load() + if err != nil { + log.Fatal(err) + } + + printProgram(prog) + // Output: + // created: [container/heap] + // imported: [] + // initial: [container/heap] + // all: [container/heap sort] +} + +// In the examples below, for stability, the chosen packages are +// relatively small, platform-independent, and low-level (and thus +// infrequently changing). +// The strconv package has internal and external tests. + +const hello = `package main + +import "fmt" + +func main() { + fmt.Println("Hello, world.") +} +` + +// This example creates and type-checks a package from a list of +// already-parsed files, and loads all its dependencies. +func ExampleConfig_CreateFromFiles() { + var conf loader.Config + f, err := conf.ParseFile("hello.go", hello) + if err != nil { + log.Fatal(err) + } + conf.CreateFromFiles("hello", f) + prog, err := conf.Load() + if err != nil { + log.Fatal(err) + } + + printProgram(prog) + printFilenames(prog.Fset, prog.Package("strconv")) + // Output: + // created: [hello] + // imported: [] + // initial: [hello] + // all: [errors fmt hello internal/race io math os reflect runtime runtime/internal/atomic runtime/internal/sys strconv sync sync/atomic syscall time unicode/utf8 unsafe] + // strconv.Files: [atob.go atof.go atoi.go decimal.go doc.go extfloat.go ftoa.go isprint.go itoa.go quote.go] +} + +// This example imports three packages, including the tests for one of +// them, and loads all their dependencies. +func ExampleConfig_Import() { + // ImportWithTest("strconv") causes strconv to include + // internal_test.go, and creates an external test package, + // strconv_test. + // (Compare with the example of CreateFromFiles.) + + var conf loader.Config + conf.Import("unicode/utf8") + conf.Import("errors") + conf.ImportWithTests("strconv") + prog, err := conf.Load() + if err != nil { + log.Fatal(err) + } + + printProgram(prog) + printFilenames(prog.Fset, prog.Package("strconv")) + printFilenames(prog.Fset, prog.Package("strconv_test")) + // Output: + // created: [strconv_test] + // imported: [errors strconv unicode/utf8] + // initial: [errors strconv strconv_test unicode/utf8] + // all: [bufio bytes errors flag fmt internal/race io log math math/rand os reflect runtime runtime/debug runtime/internal/atomic runtime/internal/sys runtime/pprof runtime/trace sort strconv strconv_test strings sync sync/atomic syscall testing text/tabwriter time unicode unicode/utf8 unsafe] + // strconv.Files: [atob.go atof.go atoi.go decimal.go doc.go extfloat.go ftoa.go isprint.go itoa.go quote.go internal_test.go] + // strconv_test.Files: [atob_test.go atof_test.go atoi_test.go decimal_test.go example_test.go fp_test.go ftoa_test.go itoa_test.go quote_test.go strconv_test.go] +} diff --git a/vendor/golang.org/x/tools/go/loader/go16.go b/vendor/golang.org/x/tools/go/loader/go16.go new file mode 100644 index 0000000000..c0ed50f49a --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/go16.go @@ -0,0 +1,13 @@ +// Copyright 2013 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 loader + +import "go/build" + +func init() { + ignoreVendor = build.IgnoreVendor +} diff --git a/vendor/golang.org/x/tools/go/loader/go16_test.go b/vendor/golang.org/x/tools/go/loader/go16_test.go new file mode 100644 index 0000000000..71f89b2d81 --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/go16_test.go @@ -0,0 +1,12 @@ +// Copyright 2013 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 +// +build !android + +package loader_test + +func init() { + go16 = true +} diff --git a/vendor/golang.org/x/tools/go/loader/loader.go b/vendor/golang.org/x/tools/go/loader/loader.go new file mode 100644 index 0000000000..f0171fc998 --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/loader.go @@ -0,0 +1,1059 @@ +// Copyright 2013 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.5 + +package loader + +// See doc.go for package documentation and implementation notes. + +import ( + "errors" + "fmt" + "go/ast" + "go/build" + "go/parser" + "go/token" + "go/types" + "os" + "sort" + "strings" + "sync" + "time" + + "golang.org/x/tools/go/ast/astutil" +) + +var ignoreVendor build.ImportMode + +const trace = false // show timing info for type-checking + +// Config specifies the configuration for loading a whole program from +// Go source code. +// The zero value for Config is a ready-to-use default configuration. +type Config struct { + // Fset is the file set for the parser to use when loading the + // program. If nil, it may be lazily initialized by any + // method of Config. + Fset *token.FileSet + + // ParserMode specifies the mode to be used by the parser when + // loading source packages. + ParserMode parser.Mode + + // TypeChecker contains options relating to the type checker. + // + // The supplied IgnoreFuncBodies is not used; the effective + // value comes from the TypeCheckFuncBodies func below. + // The supplied Import function is not used either. + TypeChecker types.Config + + // TypeCheckFuncBodies is a predicate over package paths. + // A package for which the predicate is false will + // have its package-level declarations type checked, but not + // its function bodies; this can be used to quickly load + // dependencies from source. If nil, all func bodies are type + // checked. + TypeCheckFuncBodies func(path string) bool + + // If Build is non-nil, it is used to locate source packages. + // Otherwise &build.Default is used. + // + // By default, cgo is invoked to preprocess Go files that + // import the fake package "C". This behaviour can be + // disabled by setting CGO_ENABLED=0 in the environment prior + // to startup, or by setting Build.CgoEnabled=false. + Build *build.Context + + // The current directory, used for resolving relative package + // references such as "./go/loader". If empty, os.Getwd will be + // used instead. + Cwd string + + // If DisplayPath is non-nil, it is used to transform each + // file name obtained from Build.Import(). This can be used + // to prevent a virtualized build.Config's file names from + // leaking into the user interface. + DisplayPath func(path string) string + + // If AllowErrors is true, Load will return a Program even + // if some of the its packages contained I/O, parser or type + // errors; such errors are accessible via PackageInfo.Errors. If + // false, Load will fail if any package had an error. + AllowErrors bool + + // CreatePkgs specifies a list of non-importable initial + // packages to create. The resulting packages will appear in + // the corresponding elements of the Program.Created slice. + CreatePkgs []PkgSpec + + // ImportPkgs specifies a set of initial packages to load. + // The map keys are package paths. + // + // The map value indicates whether to load tests. If true, Load + // will add and type-check two lists of files to the package: + // non-test files followed by in-package *_test.go files. In + // addition, it will append the external test package (if any) + // to Program.Created. + ImportPkgs map[string]bool + + // FindPackage is called during Load to create the build.Package + // for a given import path from a given directory. + // If FindPackage is nil, (*build.Context).Import is used. + // A client may use this hook to adapt to a proprietary build + // system that does not follow the "go build" layout + // conventions, for example. + // + // It must be safe to call concurrently from multiple goroutines. + FindPackage func(ctxt *build.Context, fromDir, importPath string, mode build.ImportMode) (*build.Package, error) + + // AfterTypeCheck is called immediately after a list of files + // has been type-checked and appended to info.Files. + // + // This optional hook function is the earliest opportunity for + // the client to observe the output of the type checker, + // which may be useful to reduce analysis latency when loading + // a large program. + // + // The function is permitted to modify info.Info, for instance + // to clear data structures that are no longer needed, which can + // dramatically reduce peak memory consumption. + // + // The function may be called twice for the same PackageInfo: + // once for the files of the package and again for the + // in-package test files. + // + // It must be safe to call concurrently from multiple goroutines. + AfterTypeCheck func(info *PackageInfo, files []*ast.File) +} + +// A PkgSpec specifies a non-importable package to be created by Load. +// Files are processed first, but typically only one of Files and +// Filenames is provided. The path needn't be globally unique. +// +type PkgSpec struct { + Path string // package path ("" => use package declaration) + Files []*ast.File // ASTs of already-parsed files + Filenames []string // names of files to be parsed +} + +// A Program is a Go program loaded from source as specified by a Config. +type Program struct { + Fset *token.FileSet // the file set for this program + + // Created[i] contains the initial package whose ASTs or + // filenames were supplied by Config.CreatePkgs[i], followed by + // the external test package, if any, of each package in + // Config.ImportPkgs ordered by ImportPath. + // + // NOTE: these files must not import "C". Cgo preprocessing is + // only performed on imported packages, not ad hoc packages. + // + // TODO(adonovan): we need to copy and adapt the logic of + // goFilesPackage (from $GOROOT/src/cmd/go/build.go) and make + // Config.Import and Config.Create methods return the same kind + // of entity, essentially a build.Package. + // Perhaps we can even reuse that type directly. + Created []*PackageInfo + + // Imported contains the initially imported packages, + // as specified by Config.ImportPkgs. + Imported map[string]*PackageInfo + + // AllPackages contains the PackageInfo of every package + // encountered by Load: all initial packages and all + // dependencies, including incomplete ones. + AllPackages map[*types.Package]*PackageInfo + + // importMap is the canonical mapping of package paths to + // packages. It contains all Imported initial packages, but not + // Created ones, and all imported dependencies. + importMap map[string]*types.Package +} + +// PackageInfo holds the ASTs and facts derived by the type-checker +// for a single package. +// +// Not mutated once exposed via the API. +// +type PackageInfo struct { + Pkg *types.Package + Importable bool // true if 'import "Pkg.Path()"' would resolve to this + TransitivelyErrorFree bool // true if Pkg and all its dependencies are free of errors + Files []*ast.File // syntax trees for the package's files + Errors []error // non-nil if the package had errors + types.Info // type-checker deductions. + dir string // package directory + + checker *types.Checker // transient type-checker state + errorFunc func(error) +} + +func (info *PackageInfo) String() string { return info.Pkg.Path() } + +func (info *PackageInfo) appendError(err error) { + if info.errorFunc != nil { + info.errorFunc(err) + } else { + fmt.Fprintln(os.Stderr, err) + } + info.Errors = append(info.Errors, err) +} + +func (conf *Config) fset() *token.FileSet { + if conf.Fset == nil { + conf.Fset = token.NewFileSet() + } + return conf.Fset +} + +// ParseFile is a convenience function (intended for testing) that invokes +// the parser using the Config's FileSet, which is initialized if nil. +// +// src specifies the parser input as a string, []byte, or io.Reader, and +// filename is its apparent name. If src is nil, the contents of +// filename are read from the file system. +// +func (conf *Config) ParseFile(filename string, src interface{}) (*ast.File, error) { + // TODO(adonovan): use conf.build() etc like parseFiles does. + return parser.ParseFile(conf.fset(), filename, src, conf.ParserMode) +} + +// FromArgsUsage is a partial usage message that applications calling +// FromArgs may wish to include in their -help output. +const FromArgsUsage = ` + is a list of arguments denoting a set of initial packages. +It may take one of two forms: + +1. A list of *.go source files. + + All of the specified files are loaded, parsed and type-checked + as a single package. All the files must belong to the same directory. + +2. A list of import paths, each denoting a package. + + The package's directory is found relative to the $GOROOT and + $GOPATH using similar logic to 'go build', and the *.go files in + that directory are loaded, parsed and type-checked as a single + package. + + In addition, all *_test.go files in the directory are then loaded + and parsed. Those files whose package declaration equals that of + the non-*_test.go files are included in the primary package. Test + files whose package declaration ends with "_test" are type-checked + as another package, the 'external' test package, so that a single + import path may denote two packages. (Whether this behaviour is + enabled is tool-specific, and may depend on additional flags.) + +A '--' argument terminates the list of packages. +` + +// FromArgs interprets args as a set of initial packages to load from +// source and updates the configuration. It returns the list of +// unconsumed arguments. +// +// It is intended for use in command-line interfaces that require a +// set of initial packages to be specified; see FromArgsUsage message +// for details. +// +// Only superficial errors are reported at this stage; errors dependent +// on I/O are detected during Load. +// +func (conf *Config) FromArgs(args []string, xtest bool) ([]string, error) { + var rest []string + for i, arg := range args { + if arg == "--" { + rest = args[i+1:] + args = args[:i] + break // consume "--" and return the remaining args + } + } + + if len(args) > 0 && strings.HasSuffix(args[0], ".go") { + // Assume args is a list of a *.go files + // denoting a single ad hoc package. + for _, arg := range args { + if !strings.HasSuffix(arg, ".go") { + return nil, fmt.Errorf("named files must be .go files: %s", arg) + } + } + conf.CreateFromFilenames("", args...) + } else { + // Assume args are directories each denoting a + // package and (perhaps) an external test, iff xtest. + for _, arg := range args { + if xtest { + conf.ImportWithTests(arg) + } else { + conf.Import(arg) + } + } + } + + return rest, nil +} + +// CreateFromFilenames is a convenience function that adds +// a conf.CreatePkgs entry to create a package of the specified *.go +// files. +// +func (conf *Config) CreateFromFilenames(path string, filenames ...string) { + conf.CreatePkgs = append(conf.CreatePkgs, PkgSpec{Path: path, Filenames: filenames}) +} + +// CreateFromFiles is a convenience function that adds a conf.CreatePkgs +// entry to create package of the specified path and parsed files. +// +func (conf *Config) CreateFromFiles(path string, files ...*ast.File) { + conf.CreatePkgs = append(conf.CreatePkgs, PkgSpec{Path: path, Files: files}) +} + +// ImportWithTests is a convenience function that adds path to +// ImportPkgs, the set of initial source packages located relative to +// $GOPATH. The package will be augmented by any *_test.go files in +// its directory that contain a "package x" (not "package x_test") +// declaration. +// +// In addition, if any *_test.go files contain a "package x_test" +// declaration, an additional package comprising just those files will +// be added to CreatePkgs. +// +func (conf *Config) ImportWithTests(path string) { conf.addImport(path, true) } + +// Import is a convenience function that adds path to ImportPkgs, the +// set of initial packages that will be imported from source. +// +func (conf *Config) Import(path string) { conf.addImport(path, false) } + +func (conf *Config) addImport(path string, tests bool) { + if path == "C" { + return // ignore; not a real package + } + if conf.ImportPkgs == nil { + conf.ImportPkgs = make(map[string]bool) + } + conf.ImportPkgs[path] = conf.ImportPkgs[path] || tests +} + +// PathEnclosingInterval returns the PackageInfo and ast.Node that +// contain source interval [start, end), and all the node's ancestors +// up to the AST root. It searches all ast.Files of all packages in prog. +// exact is defined as for astutil.PathEnclosingInterval. +// +// The zero value is returned if not found. +// +func (prog *Program) PathEnclosingInterval(start, end token.Pos) (pkg *PackageInfo, path []ast.Node, exact bool) { + for _, info := range prog.AllPackages { + for _, f := range info.Files { + if f.Pos() == token.NoPos { + // This can happen if the parser saw + // too many errors and bailed out. + // (Use parser.AllErrors to prevent that.) + continue + } + if !tokenFileContainsPos(prog.Fset.File(f.Pos()), start) { + continue + } + if path, exact := astutil.PathEnclosingInterval(f, start, end); path != nil { + return info, path, exact + } + } + } + return nil, nil, false +} + +// InitialPackages returns a new slice containing the set of initial +// packages (Created + Imported) in unspecified order. +// +func (prog *Program) InitialPackages() []*PackageInfo { + infos := make([]*PackageInfo, 0, len(prog.Created)+len(prog.Imported)) + infos = append(infos, prog.Created...) + for _, info := range prog.Imported { + infos = append(infos, info) + } + return infos +} + +// Package returns the ASTs and results of type checking for the +// specified package. +func (prog *Program) Package(path string) *PackageInfo { + if info, ok := prog.AllPackages[prog.importMap[path]]; ok { + return info + } + for _, info := range prog.Created { + if path == info.Pkg.Path() { + return info + } + } + return nil +} + +// ---------- Implementation ---------- + +// importer holds the working state of the algorithm. +type importer struct { + conf *Config // the client configuration + start time.Time // for logging + + progMu sync.Mutex // guards prog + prog *Program // the resulting program + + // findpkg is a memoization of FindPackage. + findpkgMu sync.Mutex // guards findpkg + findpkg map[findpkgKey]*findpkgValue + + importedMu sync.Mutex // guards imported + imported map[string]*importInfo // all imported packages (incl. failures) by import path + + // import dependency graph: graph[x][y] => x imports y + // + // Since non-importable packages cannot be cyclic, we ignore + // their imports, thus we only need the subgraph over importable + // packages. Nodes are identified by their import paths. + graphMu sync.Mutex + graph map[string]map[string]bool +} + +type findpkgKey struct { + importPath string + fromDir string + mode build.ImportMode +} + +type findpkgValue struct { + ready chan struct{} // closed to broadcast readiness + bp *build.Package + err error +} + +// importInfo tracks the success or failure of a single import. +// +// Upon completion, exactly one of info and err is non-nil: +// info on successful creation of a package, err otherwise. +// A successful package may still contain type errors. +// +type importInfo struct { + path string // import path + info *PackageInfo // results of typechecking (including errors) + complete chan struct{} // closed to broadcast that info is set. +} + +// awaitCompletion blocks until ii is complete, +// i.e. the info field is safe to inspect. +func (ii *importInfo) awaitCompletion() { + <-ii.complete // wait for close +} + +// Complete marks ii as complete. +// Its info and err fields will not be subsequently updated. +func (ii *importInfo) Complete(info *PackageInfo) { + if info == nil { + panic("info == nil") + } + ii.info = info + close(ii.complete) +} + +type importError struct { + path string // import path + err error // reason for failure to create a package +} + +// Load creates the initial packages specified by conf.{Create,Import}Pkgs, +// loading their dependencies packages as needed. +// +// On success, Load returns a Program containing a PackageInfo for +// each package. On failure, it returns an error. +// +// If AllowErrors is true, Load will return a Program even if some +// packages contained I/O, parser or type errors, or if dependencies +// were missing. (Such errors are accessible via PackageInfo.Errors. If +// false, Load will fail if any package had an error. +// +// It is an error if no packages were loaded. +// +func (conf *Config) Load() (*Program, error) { + // Create a simple default error handler for parse/type errors. + if conf.TypeChecker.Error == nil { + conf.TypeChecker.Error = func(e error) { fmt.Fprintln(os.Stderr, e) } + } + + // Set default working directory for relative package references. + if conf.Cwd == "" { + var err error + conf.Cwd, err = os.Getwd() + if err != nil { + return nil, err + } + } + + // Install default FindPackage hook using go/build logic. + if conf.FindPackage == nil { + conf.FindPackage = (*build.Context).Import + } + + prog := &Program{ + Fset: conf.fset(), + Imported: make(map[string]*PackageInfo), + importMap: make(map[string]*types.Package), + AllPackages: make(map[*types.Package]*PackageInfo), + } + + imp := importer{ + conf: conf, + prog: prog, + findpkg: make(map[findpkgKey]*findpkgValue), + imported: make(map[string]*importInfo), + start: time.Now(), + graph: make(map[string]map[string]bool), + } + + // -- loading proper (concurrent phase) -------------------------------- + + var errpkgs []string // packages that contained errors + + // Load the initially imported packages and their dependencies, + // in parallel. + // No vendor check on packages imported from the command line. + infos, importErrors := imp.importAll("", conf.Cwd, conf.ImportPkgs, ignoreVendor) + for _, ie := range importErrors { + conf.TypeChecker.Error(ie.err) // failed to create package + errpkgs = append(errpkgs, ie.path) + } + for _, info := range infos { + prog.Imported[info.Pkg.Path()] = info + } + + // Augment the designated initial packages by their tests. + // Dependencies are loaded in parallel. + var xtestPkgs []*build.Package + for importPath, augment := range conf.ImportPkgs { + if !augment { + continue + } + + // No vendor check on packages imported from command line. + bp, err := imp.findPackage(importPath, conf.Cwd, ignoreVendor) + if err != nil { + // Package not found, or can't even parse package declaration. + // Already reported by previous loop; ignore it. + continue + } + + // Needs external test package? + if len(bp.XTestGoFiles) > 0 { + xtestPkgs = append(xtestPkgs, bp) + } + + // Consult the cache using the canonical package path. + path := bp.ImportPath + imp.importedMu.Lock() // (unnecessary, we're sequential here) + ii, ok := imp.imported[path] + // Paranoid checks added due to issue #11012. + if !ok { + // Unreachable. + // The previous loop called importAll and thus + // startLoad for each path in ImportPkgs, which + // populates imp.imported[path] with a non-zero value. + panic(fmt.Sprintf("imported[%q] not found", path)) + } + if ii == nil { + // Unreachable. + // The ii values in this loop are the same as in + // the previous loop, which enforced the invariant + // that at least one of ii.err and ii.info is non-nil. + panic(fmt.Sprintf("imported[%q] == nil", path)) + } + if ii.info == nil { + // Unreachable. + // awaitCompletion has the postcondition + // ii.info != nil. + panic(fmt.Sprintf("imported[%q].info = nil", path)) + } + info := ii.info + imp.importedMu.Unlock() + + // Parse the in-package test files. + files, errs := imp.conf.parsePackageFiles(bp, 't') + for _, err := range errs { + info.appendError(err) + } + + // The test files augmenting package P cannot be imported, + // but may import packages that import P, + // so we must disable the cycle check. + imp.addFiles(info, files, false) + } + + createPkg := func(path string, files []*ast.File, errs []error) { + // TODO(adonovan): fix: use dirname of files, not cwd. + info := imp.newPackageInfo(path, conf.Cwd) + for _, err := range errs { + info.appendError(err) + } + + // Ad hoc packages are non-importable, + // so no cycle check is needed. + // addFiles loads dependencies in parallel. + imp.addFiles(info, files, false) + prog.Created = append(prog.Created, info) + } + + // Create packages specified by conf.CreatePkgs. + for _, cp := range conf.CreatePkgs { + files, errs := parseFiles(conf.fset(), conf.build(), nil, ".", cp.Filenames, conf.ParserMode) + files = append(files, cp.Files...) + + path := cp.Path + if path == "" { + if len(files) > 0 { + path = files[0].Name.Name + } else { + path = "(unnamed)" + } + } + createPkg(path, files, errs) + } + + // Create external test packages. + sort.Sort(byImportPath(xtestPkgs)) + for _, bp := range xtestPkgs { + files, errs := imp.conf.parsePackageFiles(bp, 'x') + createPkg(bp.ImportPath+"_test", files, errs) + } + + // -- finishing up (sequential) ---------------------------------------- + + if len(prog.Imported)+len(prog.Created) == 0 { + return nil, errors.New("no initial packages were loaded") + } + + // Create infos for indirectly imported packages. + // e.g. incomplete packages without syntax, loaded from export data. + for _, obj := range prog.importMap { + info := prog.AllPackages[obj] + if info == nil { + prog.AllPackages[obj] = &PackageInfo{Pkg: obj, Importable: true} + } else { + // finished + info.checker = nil + info.errorFunc = nil + } + } + + if !conf.AllowErrors { + // Report errors in indirectly imported packages. + for _, info := range prog.AllPackages { + if len(info.Errors) > 0 { + errpkgs = append(errpkgs, info.Pkg.Path()) + } + } + if errpkgs != nil { + var more string + if len(errpkgs) > 3 { + more = fmt.Sprintf(" and %d more", len(errpkgs)-3) + errpkgs = errpkgs[:3] + } + return nil, fmt.Errorf("couldn't load packages due to errors: %s%s", + strings.Join(errpkgs, ", "), more) + } + } + + markErrorFreePackages(prog.AllPackages) + + return prog, nil +} + +type byImportPath []*build.Package + +func (b byImportPath) Len() int { return len(b) } +func (b byImportPath) Less(i, j int) bool { return b[i].ImportPath < b[j].ImportPath } +func (b byImportPath) Swap(i, j int) { b[i], b[j] = b[j], b[i] } + +// markErrorFreePackages sets the TransitivelyErrorFree flag on all +// applicable packages. +func markErrorFreePackages(allPackages map[*types.Package]*PackageInfo) { + // Build the transpose of the import graph. + importedBy := make(map[*types.Package]map[*types.Package]bool) + for P := range allPackages { + for _, Q := range P.Imports() { + clients, ok := importedBy[Q] + if !ok { + clients = make(map[*types.Package]bool) + importedBy[Q] = clients + } + clients[P] = true + } + } + + // Find all packages reachable from some error package. + reachable := make(map[*types.Package]bool) + var visit func(*types.Package) + visit = func(p *types.Package) { + if !reachable[p] { + reachable[p] = true + for q := range importedBy[p] { + visit(q) + } + } + } + for _, info := range allPackages { + if len(info.Errors) > 0 { + visit(info.Pkg) + } + } + + // Mark the others as "transitively error-free". + for _, info := range allPackages { + if !reachable[info.Pkg] { + info.TransitivelyErrorFree = true + } + } +} + +// build returns the effective build context. +func (conf *Config) build() *build.Context { + if conf.Build != nil { + return conf.Build + } + return &build.Default +} + +// parsePackageFiles enumerates the files belonging to package path, +// then loads, parses and returns them, plus a list of I/O or parse +// errors that were encountered. +// +// 'which' indicates which files to include: +// 'g': include non-test *.go source files (GoFiles + processed CgoFiles) +// 't': include in-package *_test.go source files (TestGoFiles) +// 'x': include external *_test.go source files. (XTestGoFiles) +// +func (conf *Config) parsePackageFiles(bp *build.Package, which rune) ([]*ast.File, []error) { + if bp.ImportPath == "unsafe" { + return nil, nil + } + var filenames []string + switch which { + case 'g': + filenames = bp.GoFiles + case 't': + filenames = bp.TestGoFiles + case 'x': + filenames = bp.XTestGoFiles + default: + panic(which) + } + + files, errs := parseFiles(conf.fset(), conf.build(), conf.DisplayPath, bp.Dir, filenames, conf.ParserMode) + + // Preprocess CgoFiles and parse the outputs (sequentially). + if which == 'g' && bp.CgoFiles != nil { + cgofiles, err := processCgoFiles(bp, conf.fset(), conf.DisplayPath, conf.ParserMode) + if err != nil { + errs = append(errs, err) + } else { + files = append(files, cgofiles...) + } + } + + return files, errs +} + +// doImport imports the package denoted by path. +// It implements the types.Importer signature. +// +// It returns an error if a package could not be created +// (e.g. go/build or parse error), but type errors are reported via +// the types.Config.Error callback (the first of which is also saved +// in the package's PackageInfo). +// +// Idempotent. +// +func (imp *importer) doImport(from *PackageInfo, to string) (*types.Package, error) { + if to == "C" { + // This should be unreachable, but ad hoc packages are + // not currently subject to cgo preprocessing. + // See https://github.com/golang/go/issues/11627. + return nil, fmt.Errorf(`the loader doesn't cgo-process ad hoc packages like %q; see Go issue 11627`, + from.Pkg.Path()) + } + + bp, err := imp.findPackage(to, from.dir, 0) + if err != nil { + return nil, err + } + + // The standard unsafe package is handled specially, + // and has no PackageInfo. + if bp.ImportPath == "unsafe" { + return types.Unsafe, nil + } + + // Look for the package in the cache using its canonical path. + path := bp.ImportPath + imp.importedMu.Lock() + ii := imp.imported[path] + imp.importedMu.Unlock() + if ii == nil { + panic("internal error: unexpected import: " + path) + } + if ii.info != nil { + return ii.info.Pkg, nil + } + + // Import of incomplete package: this indicates a cycle. + fromPath := from.Pkg.Path() + if cycle := imp.findPath(path, fromPath); cycle != nil { + cycle = append([]string{fromPath}, cycle...) + return nil, fmt.Errorf("import cycle: %s", strings.Join(cycle, " -> ")) + } + + panic("internal error: import of incomplete (yet acyclic) package: " + fromPath) +} + +// findPackage locates the package denoted by the importPath in the +// specified directory. +func (imp *importer) findPackage(importPath, fromDir string, mode build.ImportMode) (*build.Package, error) { + // We use a non-blocking duplicate-suppressing cache (gopl.io §9.7) + // to avoid holding the lock around FindPackage. + key := findpkgKey{importPath, fromDir, mode} + imp.findpkgMu.Lock() + v, ok := imp.findpkg[key] + if ok { + // cache hit + imp.findpkgMu.Unlock() + + <-v.ready // wait for entry to become ready + } else { + // Cache miss: this goroutine becomes responsible for + // populating the map entry and broadcasting its readiness. + v = &findpkgValue{ready: make(chan struct{})} + imp.findpkg[key] = v + imp.findpkgMu.Unlock() + + ioLimit <- true + v.bp, v.err = imp.conf.FindPackage(imp.conf.build(), importPath, fromDir, mode) + <-ioLimit + + if _, ok := v.err.(*build.NoGoError); ok { + v.err = nil // empty directory is not an error + } + + close(v.ready) // broadcast ready condition + } + return v.bp, v.err +} + +// importAll loads, parses, and type-checks the specified packages in +// parallel and returns their completed importInfos in unspecified order. +// +// fromPath is the package path of the importing package, if it is +// importable, "" otherwise. It is used for cycle detection. +// +// fromDir is the directory containing the import declaration that +// caused these imports. +// +func (imp *importer) importAll(fromPath, fromDir string, imports map[string]bool, mode build.ImportMode) (infos []*PackageInfo, errors []importError) { + // TODO(adonovan): opt: do the loop in parallel once + // findPackage is non-blocking. + var pending []*importInfo + for importPath := range imports { + bp, err := imp.findPackage(importPath, fromDir, mode) + if err != nil { + errors = append(errors, importError{ + path: importPath, + err: err, + }) + continue + } + pending = append(pending, imp.startLoad(bp)) + } + + if fromPath != "" { + // We're loading a set of imports. + // + // We must record graph edges from the importing package + // to its dependencies, and check for cycles. + imp.graphMu.Lock() + deps, ok := imp.graph[fromPath] + if !ok { + deps = make(map[string]bool) + imp.graph[fromPath] = deps + } + for _, ii := range pending { + deps[ii.path] = true + } + imp.graphMu.Unlock() + } + + for _, ii := range pending { + if fromPath != "" { + if cycle := imp.findPath(ii.path, fromPath); cycle != nil { + // Cycle-forming import: we must not await its + // completion since it would deadlock. + // + // We don't record the error in ii since + // the error is really associated with the + // cycle-forming edge, not the package itself. + // (Also it would complicate the + // invariants of importPath completion.) + if trace { + fmt.Fprintf(os.Stderr, "import cycle: %q\n", cycle) + } + continue + } + } + ii.awaitCompletion() + infos = append(infos, ii.info) + } + + return infos, errors +} + +// findPath returns an arbitrary path from 'from' to 'to' in the import +// graph, or nil if there was none. +func (imp *importer) findPath(from, to string) []string { + imp.graphMu.Lock() + defer imp.graphMu.Unlock() + + seen := make(map[string]bool) + var search func(stack []string, importPath string) []string + search = func(stack []string, importPath string) []string { + if !seen[importPath] { + seen[importPath] = true + stack = append(stack, importPath) + if importPath == to { + return stack + } + for x := range imp.graph[importPath] { + if p := search(stack, x); p != nil { + return p + } + } + } + return nil + } + return search(make([]string, 0, 20), from) +} + +// startLoad initiates the loading, parsing and type-checking of the +// specified package and its dependencies, if it has not already begun. +// +// It returns an importInfo, not necessarily in a completed state. The +// caller must call awaitCompletion() before accessing its info field. +// +// startLoad is concurrency-safe and idempotent. +// +func (imp *importer) startLoad(bp *build.Package) *importInfo { + path := bp.ImportPath + imp.importedMu.Lock() + ii, ok := imp.imported[path] + if !ok { + ii = &importInfo{path: path, complete: make(chan struct{})} + imp.imported[path] = ii + go func() { + info := imp.load(bp) + ii.Complete(info) + }() + } + imp.importedMu.Unlock() + + return ii +} + +// load implements package loading by parsing Go source files +// located by go/build. +func (imp *importer) load(bp *build.Package) *PackageInfo { + info := imp.newPackageInfo(bp.ImportPath, bp.Dir) + info.Importable = true + files, errs := imp.conf.parsePackageFiles(bp, 'g') + for _, err := range errs { + info.appendError(err) + } + + imp.addFiles(info, files, true) + + imp.progMu.Lock() + imp.prog.importMap[bp.ImportPath] = info.Pkg + imp.progMu.Unlock() + + return info +} + +// addFiles adds and type-checks the specified files to info, loading +// their dependencies if needed. The order of files determines the +// package initialization order. It may be called multiple times on the +// same package. Errors are appended to the info.Errors field. +// +// cycleCheck determines whether the imports within files create +// dependency edges that should be checked for potential cycles. +// +func (imp *importer) addFiles(info *PackageInfo, files []*ast.File, cycleCheck bool) { + // Ensure the dependencies are loaded, in parallel. + var fromPath string + if cycleCheck { + fromPath = info.Pkg.Path() + } + // TODO(adonovan): opt: make the caller do scanImports. + // Callers with a build.Package can skip it. + imp.importAll(fromPath, info.dir, scanImports(files), 0) + + if trace { + fmt.Fprintf(os.Stderr, "%s: start %q (%d)\n", + time.Since(imp.start), info.Pkg.Path(), len(files)) + } + + // Ignore the returned (first) error since we + // already collect them all in the PackageInfo. + info.checker.Files(files) + info.Files = append(info.Files, files...) + + if imp.conf.AfterTypeCheck != nil { + imp.conf.AfterTypeCheck(info, files) + } + + if trace { + fmt.Fprintf(os.Stderr, "%s: stop %q\n", + time.Since(imp.start), info.Pkg.Path()) + } +} + +func (imp *importer) newPackageInfo(path, dir string) *PackageInfo { + pkg := types.NewPackage(path, "") + info := &PackageInfo{ + Pkg: pkg, + Info: types.Info{ + Types: make(map[ast.Expr]types.TypeAndValue), + Defs: make(map[*ast.Ident]types.Object), + Uses: make(map[*ast.Ident]types.Object), + Implicits: make(map[ast.Node]types.Object), + Scopes: make(map[ast.Node]*types.Scope), + Selections: make(map[*ast.SelectorExpr]*types.Selection), + }, + errorFunc: imp.conf.TypeChecker.Error, + dir: dir, + } + + // Copy the types.Config so we can vary it across PackageInfos. + tc := imp.conf.TypeChecker + tc.IgnoreFuncBodies = false + if f := imp.conf.TypeCheckFuncBodies; f != nil { + tc.IgnoreFuncBodies = !f(path) + } + tc.Importer = closure{imp, info} + tc.Error = info.appendError // appendError wraps the user's Error function + + info.checker = types.NewChecker(&tc, imp.conf.fset(), pkg, &info.Info) + imp.progMu.Lock() + imp.prog.AllPackages[pkg] = info + imp.progMu.Unlock() + return info +} + +type closure struct { + imp *importer + info *PackageInfo +} + +func (c closure) Import(to string) (*types.Package, error) { return c.imp.doImport(c.info, to) } diff --git a/vendor/golang.org/x/tools/go/loader/loader14.go b/vendor/golang.org/x/tools/go/loader/loader14.go new file mode 100644 index 0000000000..4fd4b2a69b --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/loader14.go @@ -0,0 +1,1019 @@ +// Copyright 2013 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.5 + +package loader + +// See doc.go for package documentation and implementation notes. + +import ( + "errors" + "fmt" + "go/ast" + "go/build" + "go/parser" + "go/token" + "os" + "sort" + "strings" + "sync" + "time" + + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/types" +) + +const trace = false // show timing info for type-checking + +// Config specifies the configuration for loading a whole program from +// Go source code. +// The zero value for Config is a ready-to-use default configuration. +type Config struct { + // Fset is the file set for the parser to use when loading the + // program. If nil, it may be lazily initialized by any + // method of Config. + Fset *token.FileSet + + // ParserMode specifies the mode to be used by the parser when + // loading source packages. + ParserMode parser.Mode + + // TypeChecker contains options relating to the type checker. + // + // The supplied IgnoreFuncBodies is not used; the effective + // value comes from the TypeCheckFuncBodies func below. + // The supplied Import function is not used either. + TypeChecker types.Config + + // TypeCheckFuncBodies is a predicate over package paths. + // A package for which the predicate is false will + // have its package-level declarations type checked, but not + // its function bodies; this can be used to quickly load + // dependencies from source. If nil, all func bodies are type + // checked. + TypeCheckFuncBodies func(path string) bool + + // If Build is non-nil, it is used to locate source packages. + // Otherwise &build.Default is used. + // + // By default, cgo is invoked to preprocess Go files that + // import the fake package "C". This behaviour can be + // disabled by setting CGO_ENABLED=0 in the environment prior + // to startup, or by setting Build.CgoEnabled=false. + Build *build.Context + + // The current directory, used for resolving relative package + // references such as "./go/loader". If empty, os.Getwd will be + // used instead. + Cwd string + + // If DisplayPath is non-nil, it is used to transform each + // file name obtained from Build.Import(). This can be used + // to prevent a virtualized build.Config's file names from + // leaking into the user interface. + DisplayPath func(path string) string + + // If AllowErrors is true, Load will return a Program even + // if some of the its packages contained I/O, parser or type + // errors; such errors are accessible via PackageInfo.Errors. If + // false, Load will fail if any package had an error. + AllowErrors bool + + // CreatePkgs specifies a list of non-importable initial + // packages to create. The resulting packages will appear in + // the corresponding elements of the Program.Created slice. + CreatePkgs []PkgSpec + + // ImportPkgs specifies a set of initial packages to load. + // The map keys are package paths. + // + // The map value indicates whether to load tests. If true, Load + // will add and type-check two lists of files to the package: + // non-test files followed by in-package *_test.go files. In + // addition, it will append the external test package (if any) + // to Program.Created. + ImportPkgs map[string]bool + + // FindPackage is called during Load to create the build.Package + // for a given import path from a given directory. + // If FindPackage is nil, a default implementation + // based on ctxt.Import is used. A client may use this hook to + // adapt to a proprietary build system that does not follow the + // "go build" layout conventions, for example. + // + // It must be safe to call concurrently from multiple goroutines. + FindPackage func(ctxt *build.Context, fromDir, importPath string, mode build.ImportMode) (*build.Package, error) +} + +// A PkgSpec specifies a non-importable package to be created by Load. +// Files are processed first, but typically only one of Files and +// Filenames is provided. The path needn't be globally unique. +// +type PkgSpec struct { + Path string // package path ("" => use package declaration) + Files []*ast.File // ASTs of already-parsed files + Filenames []string // names of files to be parsed +} + +// A Program is a Go program loaded from source as specified by a Config. +type Program struct { + Fset *token.FileSet // the file set for this program + + // Created[i] contains the initial package whose ASTs or + // filenames were supplied by Config.CreatePkgs[i], followed by + // the external test package, if any, of each package in + // Config.ImportPkgs ordered by ImportPath. + // + // NOTE: these files must not import "C". Cgo preprocessing is + // only performed on imported packages, not ad hoc packages. + // + // TODO(adonovan): we need to copy and adapt the logic of + // goFilesPackage (from $GOROOT/src/cmd/go/build.go) and make + // Config.Import and Config.Create methods return the same kind + // of entity, essentially a build.Package. + // Perhaps we can even reuse that type directly. + Created []*PackageInfo + + // Imported contains the initially imported packages, + // as specified by Config.ImportPkgs. + Imported map[string]*PackageInfo + + // AllPackages contains the PackageInfo of every package + // encountered by Load: all initial packages and all + // dependencies, including incomplete ones. + AllPackages map[*types.Package]*PackageInfo + + // importMap is the canonical mapping of package paths to + // packages. It contains all Imported initial packages, but not + // Created ones, and all imported dependencies. + importMap map[string]*types.Package +} + +// PackageInfo holds the ASTs and facts derived by the type-checker +// for a single package. +// +// Not mutated once exposed via the API. +// +type PackageInfo struct { + Pkg *types.Package + Importable bool // true if 'import "Pkg.Path()"' would resolve to this + TransitivelyErrorFree bool // true if Pkg and all its dependencies are free of errors + Files []*ast.File // syntax trees for the package's files + Errors []error // non-nil if the package had errors + types.Info // type-checker deductions. + dir string // package directory + + checker *types.Checker // transient type-checker state + errorFunc func(error) +} + +func (info *PackageInfo) String() string { return info.Pkg.Path() } + +func (info *PackageInfo) appendError(err error) { + if info.errorFunc != nil { + info.errorFunc(err) + } else { + fmt.Fprintln(os.Stderr, err) + } + info.Errors = append(info.Errors, err) +} + +func (conf *Config) fset() *token.FileSet { + if conf.Fset == nil { + conf.Fset = token.NewFileSet() + } + return conf.Fset +} + +// ParseFile is a convenience function (intended for testing) that invokes +// the parser using the Config's FileSet, which is initialized if nil. +// +// src specifies the parser input as a string, []byte, or io.Reader, and +// filename is its apparent name. If src is nil, the contents of +// filename are read from the file system. +// +func (conf *Config) ParseFile(filename string, src interface{}) (*ast.File, error) { + // TODO(adonovan): use conf.build() etc like parseFiles does. + return parser.ParseFile(conf.fset(), filename, src, conf.ParserMode) +} + +// FromArgsUsage is a partial usage message that applications calling +// FromArgs may wish to include in their -help output. +const FromArgsUsage = ` + is a list of arguments denoting a set of initial packages. +It may take one of two forms: + +1. A list of *.go source files. + + All of the specified files are loaded, parsed and type-checked + as a single package. All the files must belong to the same directory. + +2. A list of import paths, each denoting a package. + + The package's directory is found relative to the $GOROOT and + $GOPATH using similar logic to 'go build', and the *.go files in + that directory are loaded, parsed and type-checked as a single + package. + + In addition, all *_test.go files in the directory are then loaded + and parsed. Those files whose package declaration equals that of + the non-*_test.go files are included in the primary package. Test + files whose package declaration ends with "_test" are type-checked + as another package, the 'external' test package, so that a single + import path may denote two packages. (Whether this behaviour is + enabled is tool-specific, and may depend on additional flags.) + +A '--' argument terminates the list of packages. +` + +// FromArgs interprets args as a set of initial packages to load from +// source and updates the configuration. It returns the list of +// unconsumed arguments. +// +// It is intended for use in command-line interfaces that require a +// set of initial packages to be specified; see FromArgsUsage message +// for details. +// +// Only superficial errors are reported at this stage; errors dependent +// on I/O are detected during Load. +// +func (conf *Config) FromArgs(args []string, xtest bool) ([]string, error) { + var rest []string + for i, arg := range args { + if arg == "--" { + rest = args[i+1:] + args = args[:i] + break // consume "--" and return the remaining args + } + } + + if len(args) > 0 && strings.HasSuffix(args[0], ".go") { + // Assume args is a list of a *.go files + // denoting a single ad hoc package. + for _, arg := range args { + if !strings.HasSuffix(arg, ".go") { + return nil, fmt.Errorf("named files must be .go files: %s", arg) + } + } + conf.CreateFromFilenames("", args...) + } else { + // Assume args are directories each denoting a + // package and (perhaps) an external test, iff xtest. + for _, arg := range args { + if xtest { + conf.ImportWithTests(arg) + } else { + conf.Import(arg) + } + } + } + + return rest, nil +} + +// CreateFromFilenames is a convenience function that adds +// a conf.CreatePkgs entry to create a package of the specified *.go +// files. +// +func (conf *Config) CreateFromFilenames(path string, filenames ...string) { + conf.CreatePkgs = append(conf.CreatePkgs, PkgSpec{Path: path, Filenames: filenames}) +} + +// CreateFromFiles is a convenience function that adds a conf.CreatePkgs +// entry to create package of the specified path and parsed files. +// +func (conf *Config) CreateFromFiles(path string, files ...*ast.File) { + conf.CreatePkgs = append(conf.CreatePkgs, PkgSpec{Path: path, Files: files}) +} + +// ImportWithTests is a convenience function that adds path to +// ImportPkgs, the set of initial source packages located relative to +// $GOPATH. The package will be augmented by any *_test.go files in +// its directory that contain a "package x" (not "package x_test") +// declaration. +// +// In addition, if any *_test.go files contain a "package x_test" +// declaration, an additional package comprising just those files will +// be added to CreatePkgs. +// +func (conf *Config) ImportWithTests(path string) { conf.addImport(path, true) } + +// Import is a convenience function that adds path to ImportPkgs, the +// set of initial packages that will be imported from source. +// +func (conf *Config) Import(path string) { conf.addImport(path, false) } + +func (conf *Config) addImport(path string, tests bool) { + if path == "C" { + return // ignore; not a real package + } + if conf.ImportPkgs == nil { + conf.ImportPkgs = make(map[string]bool) + } + conf.ImportPkgs[path] = conf.ImportPkgs[path] || tests +} + +// PathEnclosingInterval returns the PackageInfo and ast.Node that +// contain source interval [start, end), and all the node's ancestors +// up to the AST root. It searches all ast.Files of all packages in prog. +// exact is defined as for astutil.PathEnclosingInterval. +// +// The zero value is returned if not found. +// +func (prog *Program) PathEnclosingInterval(start, end token.Pos) (pkg *PackageInfo, path []ast.Node, exact bool) { + for _, info := range prog.AllPackages { + for _, f := range info.Files { + if f.Pos() == token.NoPos { + // This can happen if the parser saw + // too many errors and bailed out. + // (Use parser.AllErrors to prevent that.) + continue + } + if !tokenFileContainsPos(prog.Fset.File(f.Pos()), start) { + continue + } + if path, exact := astutil.PathEnclosingInterval(f, start, end); path != nil { + return info, path, exact + } + } + } + return nil, nil, false +} + +// InitialPackages returns a new slice containing the set of initial +// packages (Created + Imported) in unspecified order. +// +func (prog *Program) InitialPackages() []*PackageInfo { + infos := make([]*PackageInfo, 0, len(prog.Created)+len(prog.Imported)) + infos = append(infos, prog.Created...) + for _, info := range prog.Imported { + infos = append(infos, info) + } + return infos +} + +// Package returns the ASTs and results of type checking for the +// specified package. +func (prog *Program) Package(path string) *PackageInfo { + if info, ok := prog.AllPackages[prog.importMap[path]]; ok { + return info + } + for _, info := range prog.Created { + if path == info.Pkg.Path() { + return info + } + } + return nil +} + +// ---------- Implementation ---------- + +// importer holds the working state of the algorithm. +type importer struct { + conf *Config // the client configuration + start time.Time // for logging + + progMu sync.Mutex // guards prog + prog *Program // the resulting program + + // findpkg is a memoization of FindPackage. + findpkgMu sync.Mutex // guards findpkg + findpkg map[findpkgKey]findpkgValue + + importedMu sync.Mutex // guards imported + imported map[string]*importInfo // all imported packages (incl. failures) by import path + + // import dependency graph: graph[x][y] => x imports y + // + // Since non-importable packages cannot be cyclic, we ignore + // their imports, thus we only need the subgraph over importable + // packages. Nodes are identified by their import paths. + graphMu sync.Mutex + graph map[string]map[string]bool +} + +type findpkgKey struct { + importPath string + fromDir string + mode build.ImportMode +} + +type findpkgValue struct { + bp *build.Package + err error +} + +// importInfo tracks the success or failure of a single import. +// +// Upon completion, exactly one of info and err is non-nil: +// info on successful creation of a package, err otherwise. +// A successful package may still contain type errors. +// +type importInfo struct { + path string // import path + info *PackageInfo // results of typechecking (including errors) + complete chan struct{} // closed to broadcast that info is set. +} + +// awaitCompletion blocks until ii is complete, +// i.e. the info field is safe to inspect. +func (ii *importInfo) awaitCompletion() { + <-ii.complete // wait for close +} + +// Complete marks ii as complete. +// Its info and err fields will not be subsequently updated. +func (ii *importInfo) Complete(info *PackageInfo) { + if info == nil { + panic("info == nil") + } + ii.info = info + close(ii.complete) +} + +type importError struct { + path string // import path + err error // reason for failure to create a package +} + +// Load creates the initial packages specified by conf.{Create,Import}Pkgs, +// loading their dependencies packages as needed. +// +// On success, Load returns a Program containing a PackageInfo for +// each package. On failure, it returns an error. +// +// If AllowErrors is true, Load will return a Program even if some +// packages contained I/O, parser or type errors, or if dependencies +// were missing. (Such errors are accessible via PackageInfo.Errors. If +// false, Load will fail if any package had an error. +// +// It is an error if no packages were loaded. +// +func (conf *Config) Load() (*Program, error) { + // Create a simple default error handler for parse/type errors. + if conf.TypeChecker.Error == nil { + conf.TypeChecker.Error = func(e error) { fmt.Fprintln(os.Stderr, e) } + } + + // Set default working directory for relative package references. + if conf.Cwd == "" { + var err error + conf.Cwd, err = os.Getwd() + if err != nil { + return nil, err + } + } + + // Install default FindPackage hook using go/build logic. + if conf.FindPackage == nil { + conf.FindPackage = func(ctxt *build.Context, path, fromDir string, mode build.ImportMode) (*build.Package, error) { + ioLimit <- true + bp, err := ctxt.Import(path, fromDir, mode) + <-ioLimit + if _, ok := err.(*build.NoGoError); ok { + return bp, nil // empty directory is not an error + } + return bp, err + } + } + + prog := &Program{ + Fset: conf.fset(), + Imported: make(map[string]*PackageInfo), + importMap: make(map[string]*types.Package), + AllPackages: make(map[*types.Package]*PackageInfo), + } + + imp := importer{ + conf: conf, + prog: prog, + findpkg: make(map[findpkgKey]findpkgValue), + imported: make(map[string]*importInfo), + start: time.Now(), + graph: make(map[string]map[string]bool), + } + + // -- loading proper (concurrent phase) -------------------------------- + + var errpkgs []string // packages that contained errors + + // Load the initially imported packages and their dependencies, + // in parallel. + infos, importErrors := imp.importAll("", conf.Cwd, conf.ImportPkgs, 0) + for _, ie := range importErrors { + conf.TypeChecker.Error(ie.err) // failed to create package + errpkgs = append(errpkgs, ie.path) + } + for _, info := range infos { + prog.Imported[info.Pkg.Path()] = info + } + + // Augment the designated initial packages by their tests. + // Dependencies are loaded in parallel. + var xtestPkgs []*build.Package + for importPath, augment := range conf.ImportPkgs { + if !augment { + continue + } + + bp, err := imp.findPackage(importPath, conf.Cwd, 0) + if err != nil { + // Package not found, or can't even parse package declaration. + // Already reported by previous loop; ignore it. + continue + } + + // Needs external test package? + if len(bp.XTestGoFiles) > 0 { + xtestPkgs = append(xtestPkgs, bp) + } + + // Consult the cache using the canonical package path. + path := bp.ImportPath + imp.importedMu.Lock() // (unnecessary, we're sequential here) + ii, ok := imp.imported[path] + // Paranoid checks added due to issue #11012. + if !ok { + // Unreachable. + // The previous loop called importAll and thus + // startLoad for each path in ImportPkgs, which + // populates imp.imported[path] with a non-zero value. + panic(fmt.Sprintf("imported[%q] not found", path)) + } + if ii == nil { + // Unreachable. + // The ii values in this loop are the same as in + // the previous loop, which enforced the invariant + // that at least one of ii.err and ii.info is non-nil. + panic(fmt.Sprintf("imported[%q] == nil", path)) + } + if ii.info == nil { + // Unreachable. + // awaitCompletion has the postcondition + // ii.info != nil. + panic(fmt.Sprintf("imported[%q].info = nil", path)) + } + info := ii.info + imp.importedMu.Unlock() + + // Parse the in-package test files. + files, errs := imp.conf.parsePackageFiles(bp, 't') + for _, err := range errs { + info.appendError(err) + } + + // The test files augmenting package P cannot be imported, + // but may import packages that import P, + // so we must disable the cycle check. + imp.addFiles(info, files, false) + } + + createPkg := func(path string, files []*ast.File, errs []error) { + // TODO(adonovan): fix: use dirname of files, not cwd. + info := imp.newPackageInfo(path, conf.Cwd) + for _, err := range errs { + info.appendError(err) + } + + // Ad hoc packages are non-importable, + // so no cycle check is needed. + // addFiles loads dependencies in parallel. + imp.addFiles(info, files, false) + prog.Created = append(prog.Created, info) + } + + // Create packages specified by conf.CreatePkgs. + for _, cp := range conf.CreatePkgs { + files, errs := parseFiles(conf.fset(), conf.build(), nil, ".", cp.Filenames, conf.ParserMode) + files = append(files, cp.Files...) + + path := cp.Path + if path == "" { + if len(files) > 0 { + path = files[0].Name.Name + } else { + path = "(unnamed)" + } + } + createPkg(path, files, errs) + } + + // Create external test packages. + sort.Sort(byImportPath(xtestPkgs)) + for _, bp := range xtestPkgs { + files, errs := imp.conf.parsePackageFiles(bp, 'x') + createPkg(bp.ImportPath+"_test", files, errs) + } + + // -- finishing up (sequential) ---------------------------------------- + + if len(prog.Imported)+len(prog.Created) == 0 { + return nil, errors.New("no initial packages were loaded") + } + + // Create infos for indirectly imported packages. + // e.g. incomplete packages without syntax, loaded from export data. + for _, obj := range prog.importMap { + info := prog.AllPackages[obj] + if info == nil { + prog.AllPackages[obj] = &PackageInfo{Pkg: obj, Importable: true} + } else { + // finished + info.checker = nil + info.errorFunc = nil + } + } + + if !conf.AllowErrors { + // Report errors in indirectly imported packages. + for _, info := range prog.AllPackages { + if len(info.Errors) > 0 { + errpkgs = append(errpkgs, info.Pkg.Path()) + } + } + if errpkgs != nil { + var more string + if len(errpkgs) > 3 { + more = fmt.Sprintf(" and %d more", len(errpkgs)-3) + errpkgs = errpkgs[:3] + } + return nil, fmt.Errorf("couldn't load packages due to errors: %s%s", + strings.Join(errpkgs, ", "), more) + } + } + + markErrorFreePackages(prog.AllPackages) + + return prog, nil +} + +type byImportPath []*build.Package + +func (b byImportPath) Len() int { return len(b) } +func (b byImportPath) Less(i, j int) bool { return b[i].ImportPath < b[j].ImportPath } +func (b byImportPath) Swap(i, j int) { b[i], b[j] = b[j], b[i] } + +// markErrorFreePackages sets the TransitivelyErrorFree flag on all +// applicable packages. +func markErrorFreePackages(allPackages map[*types.Package]*PackageInfo) { + // Build the transpose of the import graph. + importedBy := make(map[*types.Package]map[*types.Package]bool) + for P := range allPackages { + for _, Q := range P.Imports() { + clients, ok := importedBy[Q] + if !ok { + clients = make(map[*types.Package]bool) + importedBy[Q] = clients + } + clients[P] = true + } + } + + // Find all packages reachable from some error package. + reachable := make(map[*types.Package]bool) + var visit func(*types.Package) + visit = func(p *types.Package) { + if !reachable[p] { + reachable[p] = true + for q := range importedBy[p] { + visit(q) + } + } + } + for _, info := range allPackages { + if len(info.Errors) > 0 { + visit(info.Pkg) + } + } + + // Mark the others as "transitively error-free". + for _, info := range allPackages { + if !reachable[info.Pkg] { + info.TransitivelyErrorFree = true + } + } +} + +// build returns the effective build context. +func (conf *Config) build() *build.Context { + if conf.Build != nil { + return conf.Build + } + return &build.Default +} + +// parsePackageFiles enumerates the files belonging to package path, +// then loads, parses and returns them, plus a list of I/O or parse +// errors that were encountered. +// +// 'which' indicates which files to include: +// 'g': include non-test *.go source files (GoFiles + processed CgoFiles) +// 't': include in-package *_test.go source files (TestGoFiles) +// 'x': include external *_test.go source files. (XTestGoFiles) +// +func (conf *Config) parsePackageFiles(bp *build.Package, which rune) ([]*ast.File, []error) { + if bp.ImportPath == "unsafe" { + return nil, nil + } + var filenames []string + switch which { + case 'g': + filenames = bp.GoFiles + case 't': + filenames = bp.TestGoFiles + case 'x': + filenames = bp.XTestGoFiles + default: + panic(which) + } + + files, errs := parseFiles(conf.fset(), conf.build(), conf.DisplayPath, bp.Dir, filenames, conf.ParserMode) + + // Preprocess CgoFiles and parse the outputs (sequentially). + if which == 'g' && bp.CgoFiles != nil { + cgofiles, err := processCgoFiles(bp, conf.fset(), conf.DisplayPath, conf.ParserMode) + if err != nil { + errs = append(errs, err) + } else { + files = append(files, cgofiles...) + } + } + + return files, errs +} + +// doImport imports the package denoted by path. +// It implements the types.Importer signature. +// +// It returns an error if a package could not be created +// (e.g. go/build or parse error), but type errors are reported via +// the types.Config.Error callback (the first of which is also saved +// in the package's PackageInfo). +// +// Idempotent. +// +func (imp *importer) doImport(from *PackageInfo, to string) (*types.Package, error) { + if to == "C" { + // This should be unreachable, but ad hoc packages are + // not currently subject to cgo preprocessing. + // See https://github.com/golang/go/issues/11627. + return nil, fmt.Errorf(`the loader doesn't cgo-process ad hoc packages like %q; see Go issue 11627`, + from.Pkg.Path()) + } + + bp, err := imp.findPackage(to, from.dir, 0) + if err != nil { + return nil, err + } + + // The standard unsafe package is handled specially, + // and has no PackageInfo. + if bp.ImportPath == "unsafe" { + return types.Unsafe, nil + } + + // Look for the package in the cache using its canonical path. + path := bp.ImportPath + imp.importedMu.Lock() + ii := imp.imported[path] + imp.importedMu.Unlock() + if ii == nil { + panic("internal error: unexpected import: " + path) + } + if ii.info != nil { + return ii.info.Pkg, nil + } + + // Import of incomplete package: this indicates a cycle. + fromPath := from.Pkg.Path() + if cycle := imp.findPath(path, fromPath); cycle != nil { + cycle = append([]string{fromPath}, cycle...) + return nil, fmt.Errorf("import cycle: %s", strings.Join(cycle, " -> ")) + } + + panic("internal error: import of incomplete (yet acyclic) package: " + fromPath) +} + +// findPackage locates the package denoted by the importPath in the +// specified directory. +func (imp *importer) findPackage(importPath, fromDir string, mode build.ImportMode) (*build.Package, error) { + // TODO(adonovan): opt: non-blocking duplicate-suppressing cache. + // i.e. don't hold the lock around FindPackage. + key := findpkgKey{importPath, fromDir, mode} + imp.findpkgMu.Lock() + defer imp.findpkgMu.Unlock() + v, ok := imp.findpkg[key] + if !ok { + bp, err := imp.conf.FindPackage(imp.conf.build(), importPath, fromDir, mode) + v = findpkgValue{bp, err} + imp.findpkg[key] = v + } + return v.bp, v.err +} + +// importAll loads, parses, and type-checks the specified packages in +// parallel and returns their completed importInfos in unspecified order. +// +// fromPath is the package path of the importing package, if it is +// importable, "" otherwise. It is used for cycle detection. +// +// fromDir is the directory containing the import declaration that +// caused these imports. +// +func (imp *importer) importAll(fromPath, fromDir string, imports map[string]bool, mode build.ImportMode) (infos []*PackageInfo, errors []importError) { + // TODO(adonovan): opt: do the loop in parallel once + // findPackage is non-blocking. + var pending []*importInfo + for importPath := range imports { + bp, err := imp.findPackage(importPath, fromDir, mode) + if err != nil { + errors = append(errors, importError{ + path: importPath, + err: err, + }) + continue + } + pending = append(pending, imp.startLoad(bp)) + } + + if fromPath != "" { + // We're loading a set of imports. + // + // We must record graph edges from the importing package + // to its dependencies, and check for cycles. + imp.graphMu.Lock() + deps, ok := imp.graph[fromPath] + if !ok { + deps = make(map[string]bool) + imp.graph[fromPath] = deps + } + for _, ii := range pending { + deps[ii.path] = true + } + imp.graphMu.Unlock() + } + + for _, ii := range pending { + if fromPath != "" { + if cycle := imp.findPath(ii.path, fromPath); cycle != nil { + // Cycle-forming import: we must not await its + // completion since it would deadlock. + // + // We don't record the error in ii since + // the error is really associated with the + // cycle-forming edge, not the package itself. + // (Also it would complicate the + // invariants of importPath completion.) + if trace { + fmt.Fprintln(os.Stderr, "import cycle: %q", cycle) + } + continue + } + } + ii.awaitCompletion() + infos = append(infos, ii.info) + } + + return infos, errors +} + +// findPath returns an arbitrary path from 'from' to 'to' in the import +// graph, or nil if there was none. +func (imp *importer) findPath(from, to string) []string { + imp.graphMu.Lock() + defer imp.graphMu.Unlock() + + seen := make(map[string]bool) + var search func(stack []string, importPath string) []string + search = func(stack []string, importPath string) []string { + if !seen[importPath] { + seen[importPath] = true + stack = append(stack, importPath) + if importPath == to { + return stack + } + for x := range imp.graph[importPath] { + if p := search(stack, x); p != nil { + return p + } + } + } + return nil + } + return search(make([]string, 0, 20), from) +} + +// startLoad initiates the loading, parsing and type-checking of the +// specified package and its dependencies, if it has not already begun. +// +// It returns an importInfo, not necessarily in a completed state. The +// caller must call awaitCompletion() before accessing its info field. +// +// startLoad is concurrency-safe and idempotent. +// +func (imp *importer) startLoad(bp *build.Package) *importInfo { + path := bp.ImportPath + imp.importedMu.Lock() + ii, ok := imp.imported[path] + if !ok { + ii = &importInfo{path: path, complete: make(chan struct{})} + imp.imported[path] = ii + go func() { + info := imp.load(bp) + ii.Complete(info) + }() + } + imp.importedMu.Unlock() + + return ii +} + +// load implements package loading by parsing Go source files +// located by go/build. +func (imp *importer) load(bp *build.Package) *PackageInfo { + info := imp.newPackageInfo(bp.ImportPath, bp.Dir) + info.Importable = true + files, errs := imp.conf.parsePackageFiles(bp, 'g') + for _, err := range errs { + info.appendError(err) + } + + imp.addFiles(info, files, true) + + imp.progMu.Lock() + imp.prog.importMap[bp.ImportPath] = info.Pkg + imp.progMu.Unlock() + + return info +} + +// addFiles adds and type-checks the specified files to info, loading +// their dependencies if needed. The order of files determines the +// package initialization order. It may be called multiple times on the +// same package. Errors are appended to the info.Errors field. +// +// cycleCheck determines whether the imports within files create +// dependency edges that should be checked for potential cycles. +// +func (imp *importer) addFiles(info *PackageInfo, files []*ast.File, cycleCheck bool) { + info.Files = append(info.Files, files...) + + // Ensure the dependencies are loaded, in parallel. + var fromPath string + if cycleCheck { + fromPath = info.Pkg.Path() + } + // TODO(adonovan): opt: make the caller do scanImports. + // Callers with a build.Package can skip it. + imp.importAll(fromPath, info.dir, scanImports(files), 0) + + if trace { + fmt.Fprintf(os.Stderr, "%s: start %q (%d)\n", + time.Since(imp.start), info.Pkg.Path(), len(files)) + } + + // Ignore the returned (first) error since we + // already collect them all in the PackageInfo. + info.checker.Files(files) + + if trace { + fmt.Fprintf(os.Stderr, "%s: stop %q\n", + time.Since(imp.start), info.Pkg.Path()) + } +} + +func (imp *importer) newPackageInfo(path, dir string) *PackageInfo { + pkg := types.NewPackage(path, "") + info := &PackageInfo{ + Pkg: pkg, + Info: types.Info{ + Types: make(map[ast.Expr]types.TypeAndValue), + Defs: make(map[*ast.Ident]types.Object), + Uses: make(map[*ast.Ident]types.Object), + Implicits: make(map[ast.Node]types.Object), + Scopes: make(map[ast.Node]*types.Scope), + Selections: make(map[*ast.SelectorExpr]*types.Selection), + }, + errorFunc: imp.conf.TypeChecker.Error, + dir: dir, + } + + // Copy the types.Config so we can vary it across PackageInfos. + tc := imp.conf.TypeChecker + tc.IgnoreFuncBodies = false + if f := imp.conf.TypeCheckFuncBodies; f != nil { + tc.IgnoreFuncBodies = !f(path) + } + tc.Import = func(_ map[string]*types.Package, to string) (*types.Package, error) { + return imp.doImport(info, to) + } + tc.Error = info.appendError // appendError wraps the user's Error function + + info.checker = types.NewChecker(&tc, imp.conf.fset(), pkg, &info.Info) + imp.progMu.Lock() + imp.prog.AllPackages[pkg] = info + imp.progMu.Unlock() + return info +} diff --git a/vendor/golang.org/x/tools/go/loader/loader14_test.go b/vendor/golang.org/x/tools/go/loader/loader14_test.go new file mode 100644 index 0000000000..fab3170a0c --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/loader14_test.go @@ -0,0 +1,676 @@ +// Copyright 2013 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.5 + +// No testdata on Android. + +// +build !android + +package loader_test + +import ( + "fmt" + "go/build" + "path/filepath" + "reflect" + "sort" + "strings" + "sync" + "testing" + + "golang.org/x/tools/go/buildutil" + "golang.org/x/tools/go/loader" +) + +// TestFromArgs checks that conf.FromArgs populates conf correctly. +// It does no I/O. +func TestFromArgs(t *testing.T) { + type result struct { + Err string + Rest []string + ImportPkgs map[string]bool + CreatePkgs []loader.PkgSpec + } + for _, test := range []struct { + args []string + tests bool + want result + }{ + // Mix of existing and non-existent packages. + { + args: []string{"nosuchpkg", "errors"}, + want: result{ + ImportPkgs: map[string]bool{"errors": false, "nosuchpkg": false}, + }, + }, + // Same, with -test flag. + { + args: []string{"nosuchpkg", "errors"}, + tests: true, + want: result{ + ImportPkgs: map[string]bool{"errors": true, "nosuchpkg": true}, + }, + }, + // Surplus arguments. + { + args: []string{"fmt", "errors", "--", "surplus"}, + want: result{ + Rest: []string{"surplus"}, + ImportPkgs: map[string]bool{"errors": false, "fmt": false}, + }, + }, + // Ad hoc package specified as *.go files. + { + args: []string{"foo.go", "bar.go"}, + want: result{CreatePkgs: []loader.PkgSpec{{ + Filenames: []string{"foo.go", "bar.go"}, + }}}, + }, + // Mixture of *.go and import paths. + { + args: []string{"foo.go", "fmt"}, + want: result{ + Err: "named files must be .go files: fmt", + }, + }, + } { + var conf loader.Config + rest, err := conf.FromArgs(test.args, test.tests) + got := result{ + Rest: rest, + ImportPkgs: conf.ImportPkgs, + CreatePkgs: conf.CreatePkgs, + } + if err != nil { + got.Err = err.Error() + } + if !reflect.DeepEqual(got, test.want) { + t.Errorf("FromArgs(%q) = %+v, want %+v", test.args, got, test.want) + } + } +} + +func TestLoad_NoInitialPackages(t *testing.T) { + var conf loader.Config + + const wantErr = "no initial packages were loaded" + + prog, err := conf.Load() + if err == nil { + t.Errorf("Load succeeded unexpectedly, want %q", wantErr) + } else if err.Error() != wantErr { + t.Errorf("Load failed with wrong error %q, want %q", err, wantErr) + } + if prog != nil { + t.Errorf("Load unexpectedly returned a Program") + } +} + +func TestLoad_MissingInitialPackage(t *testing.T) { + var conf loader.Config + conf.Import("nosuchpkg") + conf.Import("errors") + + const wantErr = "couldn't load packages due to errors: nosuchpkg" + + prog, err := conf.Load() + if err == nil { + t.Errorf("Load succeeded unexpectedly, want %q", wantErr) + } else if err.Error() != wantErr { + t.Errorf("Load failed with wrong error %q, want %q", err, wantErr) + } + if prog != nil { + t.Errorf("Load unexpectedly returned a Program") + } +} + +func TestLoad_MissingInitialPackage_AllowErrors(t *testing.T) { + var conf loader.Config + conf.AllowErrors = true + conf.Import("nosuchpkg") + conf.ImportWithTests("errors") + + prog, err := conf.Load() + if err != nil { + t.Errorf("Load failed unexpectedly: %v", err) + } + if prog == nil { + t.Fatalf("Load returned a nil Program") + } + if got, want := created(prog), "errors_test"; got != want { + t.Errorf("Created = %s, want %s", got, want) + } + if got, want := imported(prog), "errors"; got != want { + t.Errorf("Imported = %s, want %s", got, want) + } +} + +func TestCreateUnnamedPackage(t *testing.T) { + var conf loader.Config + conf.CreateFromFilenames("") + prog, err := conf.Load() + if err != nil { + t.Fatalf("Load failed: %v", err) + } + if got, want := fmt.Sprint(prog.InitialPackages()), "[(unnamed)]"; got != want { + t.Errorf("InitialPackages = %s, want %s", got, want) + } +} + +func TestLoad_MissingFileInCreatedPackage(t *testing.T) { + var conf loader.Config + conf.CreateFromFilenames("", "missing.go") + + const wantErr = "couldn't load packages due to errors: (unnamed)" + + prog, err := conf.Load() + if prog != nil { + t.Errorf("Load unexpectedly returned a Program") + } + if err == nil { + t.Fatalf("Load succeeded unexpectedly, want %q", wantErr) + } + if err.Error() != wantErr { + t.Fatalf("Load failed with wrong error %q, want %q", err, wantErr) + } +} + +func TestLoad_MissingFileInCreatedPackage_AllowErrors(t *testing.T) { + conf := loader.Config{AllowErrors: true} + conf.CreateFromFilenames("", "missing.go") + + prog, err := conf.Load() + if err != nil { + t.Errorf("Load failed: %v", err) + } + if got, want := fmt.Sprint(prog.InitialPackages()), "[(unnamed)]"; got != want { + t.Fatalf("InitialPackages = %s, want %s", got, want) + } +} + +func TestLoad_ParseError(t *testing.T) { + var conf loader.Config + conf.CreateFromFilenames("badpkg", "testdata/badpkgdecl.go") + + const wantErr = "couldn't load packages due to errors: badpkg" + + prog, err := conf.Load() + if prog != nil { + t.Errorf("Load unexpectedly returned a Program") + } + if err == nil { + t.Fatalf("Load succeeded unexpectedly, want %q", wantErr) + } + if err.Error() != wantErr { + t.Fatalf("Load failed with wrong error %q, want %q", err, wantErr) + } +} + +func TestLoad_ParseError_AllowErrors(t *testing.T) { + var conf loader.Config + conf.AllowErrors = true + conf.CreateFromFilenames("badpkg", "testdata/badpkgdecl.go") + + prog, err := conf.Load() + if err != nil { + t.Errorf("Load failed unexpectedly: %v", err) + } + if prog == nil { + t.Fatalf("Load returned a nil Program") + } + if got, want := created(prog), "badpkg"; got != want { + t.Errorf("Created = %s, want %s", got, want) + } + + badpkg := prog.Created[0] + if len(badpkg.Files) != 1 { + t.Errorf("badpkg has %d files, want 1", len(badpkg.Files)) + } + wantErr := filepath.Join("testdata", "badpkgdecl.go") + ":1:34: expected 'package', found 'EOF'" + if !hasError(badpkg.Errors, wantErr) { + t.Errorf("badpkg.Errors = %v, want %s", badpkg.Errors, wantErr) + } +} + +func TestLoad_FromSource_Success(t *testing.T) { + var conf loader.Config + conf.CreateFromFilenames("P", "testdata/a.go", "testdata/b.go") + + prog, err := conf.Load() + if err != nil { + t.Errorf("Load failed unexpectedly: %v", err) + } + if prog == nil { + t.Fatalf("Load returned a nil Program") + } + if got, want := created(prog), "P"; got != want { + t.Errorf("Created = %s, want %s", got, want) + } +} + +func TestLoad_FromImports_Success(t *testing.T) { + var conf loader.Config + conf.ImportWithTests("fmt") + conf.ImportWithTests("errors") + + prog, err := conf.Load() + if err != nil { + t.Errorf("Load failed unexpectedly: %v", err) + } + if prog == nil { + t.Fatalf("Load returned a nil Program") + } + if got, want := created(prog), "errors_test fmt_test"; got != want { + t.Errorf("Created = %q, want %s", got, want) + } + if got, want := imported(prog), "errors fmt"; got != want { + t.Errorf("Imported = %s, want %s", got, want) + } + // Check set of transitive packages. + // There are >30 and the set may grow over time, so only check a few. + want := map[string]bool{ + "strings": true, + "time": true, + "runtime": true, + "testing": true, + "unicode": true, + } + for _, path := range all(prog) { + delete(want, path) + } + if len(want) > 0 { + t.Errorf("AllPackages is missing these keys: %q", keys(want)) + } +} + +func TestLoad_MissingIndirectImport(t *testing.T) { + pkgs := map[string]string{ + "a": `package a; import _ "b"`, + "b": `package b; import _ "c"`, + } + conf := loader.Config{Build: fakeContext(pkgs)} + conf.Import("a") + + const wantErr = "couldn't load packages due to errors: b" + + prog, err := conf.Load() + if err == nil { + t.Errorf("Load succeeded unexpectedly, want %q", wantErr) + } else if err.Error() != wantErr { + t.Errorf("Load failed with wrong error %q, want %q", err, wantErr) + } + if prog != nil { + t.Errorf("Load unexpectedly returned a Program") + } +} + +func TestLoad_BadDependency_AllowErrors(t *testing.T) { + for _, test := range []struct { + descr string + pkgs map[string]string + wantPkgs string + }{ + + { + descr: "missing dependency", + pkgs: map[string]string{ + "a": `package a; import _ "b"`, + "b": `package b; import _ "c"`, + }, + wantPkgs: "a b", + }, + { + descr: "bad package decl in dependency", + pkgs: map[string]string{ + "a": `package a; import _ "b"`, + "b": `package b; import _ "c"`, + "c": `package`, + }, + wantPkgs: "a b", + }, + { + descr: "parse error in dependency", + pkgs: map[string]string{ + "a": `package a; import _ "b"`, + "b": `package b; import _ "c"`, + "c": `package c; var x = `, + }, + wantPkgs: "a b c", + }, + } { + conf := loader.Config{ + AllowErrors: true, + Build: fakeContext(test.pkgs), + } + conf.Import("a") + + prog, err := conf.Load() + if err != nil { + t.Errorf("%s: Load failed unexpectedly: %v", test.descr, err) + } + if prog == nil { + t.Fatalf("%s: Load returned a nil Program", test.descr) + } + + if got, want := imported(prog), "a"; got != want { + t.Errorf("%s: Imported = %s, want %s", test.descr, got, want) + } + if got := all(prog); strings.Join(got, " ") != test.wantPkgs { + t.Errorf("%s: AllPackages = %s, want %s", test.descr, got, test.wantPkgs) + } + } +} + +func TestCwd(t *testing.T) { + ctxt := fakeContext(map[string]string{"one/two/three": `package three`}) + for _, test := range []struct { + cwd, arg, want string + }{ + {cwd: "/go/src/one", arg: "./two/three", want: "one/two/three"}, + {cwd: "/go/src/one", arg: "../one/two/three", want: "one/two/three"}, + {cwd: "/go/src/one", arg: "one/two/three", want: "one/two/three"}, + {cwd: "/go/src/one/two/three", arg: ".", want: "one/two/three"}, + {cwd: "/go/src/one", arg: "two/three", want: ""}, + } { + conf := loader.Config{ + Cwd: test.cwd, + Build: ctxt, + } + conf.Import(test.arg) + + var got string + prog, err := conf.Load() + if prog != nil { + got = imported(prog) + } + if got != test.want { + t.Errorf("Load(%s) from %s: Imported = %s, want %s", + test.arg, test.cwd, got, test.want) + if err != nil { + t.Errorf("Load failed: %v", err) + } + } + } +} + +// TODO(adonovan): more Load tests: +// +// failures: +// - to parse package decl of *_test.go files +// - to parse package decl of external *_test.go files +// - to parse whole of *_test.go files +// - to parse whole of external *_test.go files +// - to open a *.go file during import scanning +// - to import from binary + +// features: +// - InitialPackages +// - PackageCreated hook +// - TypeCheckFuncBodies hook + +func TestTransitivelyErrorFreeFlag(t *testing.T) { + // Create an minimal custom build.Context + // that fakes the following packages: + // + // a --> b --> c! c has an error + // \ d and e are transitively error-free. + // e --> d + // + // Each package [a-e] consists of one file, x.go. + pkgs := map[string]string{ + "a": `package a; import (_ "b"; _ "e")`, + "b": `package b; import _ "c"`, + "c": `package c; func f() { _ = int(false) }`, // type error within function body + "d": `package d;`, + "e": `package e; import _ "d"`, + } + conf := loader.Config{ + AllowErrors: true, + Build: fakeContext(pkgs), + } + conf.Import("a") + + prog, err := conf.Load() + if err != nil { + t.Errorf("Load failed: %s", err) + } + if prog == nil { + t.Fatalf("Load returned nil *Program") + } + + for pkg, info := range prog.AllPackages { + var wantErr, wantTEF bool + switch pkg.Path() { + case "a", "b": + case "c": + wantErr = true + case "d", "e": + wantTEF = true + default: + t.Errorf("unexpected package: %q", pkg.Path()) + continue + } + + if (info.Errors != nil) != wantErr { + if wantErr { + t.Errorf("Package %q.Error = nil, want error", pkg.Path()) + } else { + t.Errorf("Package %q has unexpected Errors: %v", + pkg.Path(), info.Errors) + } + } + + if info.TransitivelyErrorFree != wantTEF { + t.Errorf("Package %q.TransitivelyErrorFree=%t, want %t", + pkg.Path(), info.TransitivelyErrorFree, wantTEF) + } + } +} + +// Test that syntax (scan/parse), type, and loader errors are recorded +// (in PackageInfo.Errors) and reported (via Config.TypeChecker.Error). +func TestErrorReporting(t *testing.T) { + pkgs := map[string]string{ + "a": `package a; import (_ "b"; _ "c"); var x int = false`, + "b": `package b; 'syntax error!`, + } + conf := loader.Config{ + AllowErrors: true, + Build: fakeContext(pkgs), + } + var mu sync.Mutex + var allErrors []error + conf.TypeChecker.Error = func(err error) { + mu.Lock() + allErrors = append(allErrors, err) + mu.Unlock() + } + conf.Import("a") + + prog, err := conf.Load() + if err != nil { + t.Errorf("Load failed: %s", err) + } + if prog == nil { + t.Fatalf("Load returned nil *Program") + } + + // TODO(adonovan): test keys of ImportMap. + + // Check errors recorded in each PackageInfo. + for pkg, info := range prog.AllPackages { + switch pkg.Path() { + case "a": + if !hasError(info.Errors, "cannot convert false") { + t.Errorf("a.Errors = %v, want bool conversion (type) error", info.Errors) + } + if !hasError(info.Errors, "could not import c") { + t.Errorf("a.Errors = %v, want import (loader) error", info.Errors) + } + case "b": + if !hasError(info.Errors, "rune literal not terminated") { + t.Errorf("b.Errors = %v, want unterminated literal (syntax) error", info.Errors) + } + } + } + + // Check errors reported via error handler. + if !hasError(allErrors, "cannot convert false") || + !hasError(allErrors, "rune literal not terminated") || + !hasError(allErrors, "could not import c") { + t.Errorf("allErrors = %v, want syntax, type and loader errors", allErrors) + } +} + +func TestCycles(t *testing.T) { + for _, test := range []struct { + descr string + ctxt *build.Context + wantErr string + }{ + { + "self-cycle", + fakeContext(map[string]string{ + "main": `package main; import _ "selfcycle"`, + "selfcycle": `package selfcycle; import _ "selfcycle"`, + }), + `import cycle: selfcycle -> selfcycle`, + }, + { + "three-package cycle", + fakeContext(map[string]string{ + "main": `package main; import _ "a"`, + "a": `package a; import _ "b"`, + "b": `package b; import _ "c"`, + "c": `package c; import _ "a"`, + }), + `import cycle: c -> a -> b -> c`, + }, + { + "self-cycle in dependency of test file", + buildutil.FakeContext(map[string]map[string]string{ + "main": { + "main.go": `package main`, + "main_test.go": `package main; import _ "a"`, + }, + "a": { + "a.go": `package a; import _ "a"`, + }, + }), + `import cycle: a -> a`, + }, + // TODO(adonovan): fix: these fail + // { + // "two-package cycle in dependency of test file", + // buildutil.FakeContext(map[string]map[string]string{ + // "main": { + // "main.go": `package main`, + // "main_test.go": `package main; import _ "a"`, + // }, + // "a": { + // "a.go": `package a; import _ "main"`, + // }, + // }), + // `import cycle: main -> a -> main`, + // }, + // { + // "self-cycle in augmented package", + // buildutil.FakeContext(map[string]map[string]string{ + // "main": { + // "main.go": `package main`, + // "main_test.go": `package main; import _ "main"`, + // }, + // }), + // `import cycle: main -> main`, + // }, + } { + conf := loader.Config{ + AllowErrors: true, + Build: test.ctxt, + } + var mu sync.Mutex + var allErrors []error + conf.TypeChecker.Error = func(err error) { + mu.Lock() + allErrors = append(allErrors, err) + mu.Unlock() + } + conf.ImportWithTests("main") + + prog, err := conf.Load() + if err != nil { + t.Errorf("%s: Load failed: %s", test.descr, err) + } + if prog == nil { + t.Fatalf("%s: Load returned nil *Program", test.descr) + } + + if !hasError(allErrors, test.wantErr) { + t.Errorf("%s: Load() errors = %q, want %q", + test.descr, allErrors, test.wantErr) + } + } + + // TODO(adonovan): + // - Test that in a legal test cycle, none of the symbols + // defined by augmentation are visible via import. +} + +// ---- utilities ---- + +// Simplifying wrapper around buildutil.FakeContext for single-file packages. +func fakeContext(pkgs map[string]string) *build.Context { + pkgs2 := make(map[string]map[string]string) + for path, content := range pkgs { + pkgs2[path] = map[string]string{"x.go": content} + } + return buildutil.FakeContext(pkgs2) +} + +func hasError(errors []error, substr string) bool { + for _, err := range errors { + if strings.Contains(err.Error(), substr) { + return true + } + } + return false +} + +func keys(m map[string]bool) (keys []string) { + for key := range m { + keys = append(keys, key) + } + sort.Strings(keys) + return +} + +// Returns all loaded packages. +func all(prog *loader.Program) []string { + var pkgs []string + for _, info := range prog.AllPackages { + pkgs = append(pkgs, info.Pkg.Path()) + } + sort.Strings(pkgs) + return pkgs +} + +// Returns initially imported packages, as a string. +func imported(prog *loader.Program) string { + var pkgs []string + for _, info := range prog.Imported { + pkgs = append(pkgs, info.Pkg.Path()) + } + sort.Strings(pkgs) + return strings.Join(pkgs, " ") +} + +// Returns initially created packages, as a string. +func created(prog *loader.Program) string { + var pkgs []string + for _, info := range prog.Created { + pkgs = append(pkgs, info.Pkg.Path()) + } + return strings.Join(pkgs, " ") +} diff --git a/vendor/golang.org/x/tools/go/loader/loader_test.go b/vendor/golang.org/x/tools/go/loader/loader_test.go new file mode 100644 index 0000000000..1f05e1837f --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/loader_test.go @@ -0,0 +1,758 @@ +// Copyright 2013 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.5 + +// No testdata on Android. + +// +build !android + +package loader_test + +import ( + "fmt" + "go/build" + "path/filepath" + "reflect" + "sort" + "strings" + "sync" + "testing" + + "golang.org/x/tools/go/buildutil" + "golang.org/x/tools/go/loader" +) + +var go16 bool // Go version >= go1.6 + +// TestFromArgs checks that conf.FromArgs populates conf correctly. +// It does no I/O. +func TestFromArgs(t *testing.T) { + type result struct { + Err string + Rest []string + ImportPkgs map[string]bool + CreatePkgs []loader.PkgSpec + } + for _, test := range []struct { + args []string + tests bool + want result + }{ + // Mix of existing and non-existent packages. + { + args: []string{"nosuchpkg", "errors"}, + want: result{ + ImportPkgs: map[string]bool{"errors": false, "nosuchpkg": false}, + }, + }, + // Same, with -test flag. + { + args: []string{"nosuchpkg", "errors"}, + tests: true, + want: result{ + ImportPkgs: map[string]bool{"errors": true, "nosuchpkg": true}, + }, + }, + // Surplus arguments. + { + args: []string{"fmt", "errors", "--", "surplus"}, + want: result{ + Rest: []string{"surplus"}, + ImportPkgs: map[string]bool{"errors": false, "fmt": false}, + }, + }, + // Ad hoc package specified as *.go files. + { + args: []string{"foo.go", "bar.go"}, + want: result{CreatePkgs: []loader.PkgSpec{{ + Filenames: []string{"foo.go", "bar.go"}, + }}}, + }, + // Mixture of *.go and import paths. + { + args: []string{"foo.go", "fmt"}, + want: result{ + Err: "named files must be .go files: fmt", + }, + }, + } { + var conf loader.Config + rest, err := conf.FromArgs(test.args, test.tests) + got := result{ + Rest: rest, + ImportPkgs: conf.ImportPkgs, + CreatePkgs: conf.CreatePkgs, + } + if err != nil { + got.Err = err.Error() + } + if !reflect.DeepEqual(got, test.want) { + t.Errorf("FromArgs(%q) = %+v, want %+v", test.args, got, test.want) + } + } +} + +func TestLoad_NoInitialPackages(t *testing.T) { + var conf loader.Config + + const wantErr = "no initial packages were loaded" + + prog, err := conf.Load() + if err == nil { + t.Errorf("Load succeeded unexpectedly, want %q", wantErr) + } else if err.Error() != wantErr { + t.Errorf("Load failed with wrong error %q, want %q", err, wantErr) + } + if prog != nil { + t.Errorf("Load unexpectedly returned a Program") + } +} + +func TestLoad_MissingInitialPackage(t *testing.T) { + var conf loader.Config + conf.Import("nosuchpkg") + conf.Import("errors") + + const wantErr = "couldn't load packages due to errors: nosuchpkg" + + prog, err := conf.Load() + if err == nil { + t.Errorf("Load succeeded unexpectedly, want %q", wantErr) + } else if err.Error() != wantErr { + t.Errorf("Load failed with wrong error %q, want %q", err, wantErr) + } + if prog != nil { + t.Errorf("Load unexpectedly returned a Program") + } +} + +func TestLoad_MissingInitialPackage_AllowErrors(t *testing.T) { + var conf loader.Config + conf.AllowErrors = true + conf.Import("nosuchpkg") + conf.ImportWithTests("errors") + + prog, err := conf.Load() + if err != nil { + t.Errorf("Load failed unexpectedly: %v", err) + } + if prog == nil { + t.Fatalf("Load returned a nil Program") + } + if got, want := created(prog), "errors_test"; got != want { + t.Errorf("Created = %s, want %s", got, want) + } + if got, want := imported(prog), "errors"; got != want { + t.Errorf("Imported = %s, want %s", got, want) + } +} + +func TestCreateUnnamedPackage(t *testing.T) { + var conf loader.Config + conf.CreateFromFilenames("") + prog, err := conf.Load() + if err != nil { + t.Fatalf("Load failed: %v", err) + } + if got, want := fmt.Sprint(prog.InitialPackages()), "[(unnamed)]"; got != want { + t.Errorf("InitialPackages = %s, want %s", got, want) + } +} + +func TestLoad_MissingFileInCreatedPackage(t *testing.T) { + var conf loader.Config + conf.CreateFromFilenames("", "missing.go") + + const wantErr = "couldn't load packages due to errors: (unnamed)" + + prog, err := conf.Load() + if prog != nil { + t.Errorf("Load unexpectedly returned a Program") + } + if err == nil { + t.Fatalf("Load succeeded unexpectedly, want %q", wantErr) + } + if err.Error() != wantErr { + t.Fatalf("Load failed with wrong error %q, want %q", err, wantErr) + } +} + +func TestLoad_MissingFileInCreatedPackage_AllowErrors(t *testing.T) { + conf := loader.Config{AllowErrors: true} + conf.CreateFromFilenames("", "missing.go") + + prog, err := conf.Load() + if err != nil { + t.Errorf("Load failed: %v", err) + } + if got, want := fmt.Sprint(prog.InitialPackages()), "[(unnamed)]"; got != want { + t.Fatalf("InitialPackages = %s, want %s", got, want) + } +} + +func TestLoad_ParseError(t *testing.T) { + var conf loader.Config + conf.CreateFromFilenames("badpkg", "testdata/badpkgdecl.go") + + const wantErr = "couldn't load packages due to errors: badpkg" + + prog, err := conf.Load() + if prog != nil { + t.Errorf("Load unexpectedly returned a Program") + } + if err == nil { + t.Fatalf("Load succeeded unexpectedly, want %q", wantErr) + } + if err.Error() != wantErr { + t.Fatalf("Load failed with wrong error %q, want %q", err, wantErr) + } +} + +func TestLoad_ParseError_AllowErrors(t *testing.T) { + var conf loader.Config + conf.AllowErrors = true + conf.CreateFromFilenames("badpkg", "testdata/badpkgdecl.go") + + prog, err := conf.Load() + if err != nil { + t.Errorf("Load failed unexpectedly: %v", err) + } + if prog == nil { + t.Fatalf("Load returned a nil Program") + } + if got, want := created(prog), "badpkg"; got != want { + t.Errorf("Created = %s, want %s", got, want) + } + + badpkg := prog.Created[0] + if len(badpkg.Files) != 1 { + t.Errorf("badpkg has %d files, want 1", len(badpkg.Files)) + } + wantErr := filepath.Join("testdata", "badpkgdecl.go") + ":1:34: expected 'package', found 'EOF'" + if !hasError(badpkg.Errors, wantErr) { + t.Errorf("badpkg.Errors = %v, want %s", badpkg.Errors, wantErr) + } +} + +func TestLoad_FromSource_Success(t *testing.T) { + var conf loader.Config + conf.CreateFromFilenames("P", "testdata/a.go", "testdata/b.go") + + prog, err := conf.Load() + if err != nil { + t.Errorf("Load failed unexpectedly: %v", err) + } + if prog == nil { + t.Fatalf("Load returned a nil Program") + } + if got, want := created(prog), "P"; got != want { + t.Errorf("Created = %s, want %s", got, want) + } +} + +func TestLoad_FromImports_Success(t *testing.T) { + var conf loader.Config + conf.ImportWithTests("fmt") + conf.ImportWithTests("errors") + + prog, err := conf.Load() + if err != nil { + t.Errorf("Load failed unexpectedly: %v", err) + } + if prog == nil { + t.Fatalf("Load returned a nil Program") + } + if got, want := created(prog), "errors_test fmt_test"; got != want { + t.Errorf("Created = %q, want %s", got, want) + } + if got, want := imported(prog), "errors fmt"; got != want { + t.Errorf("Imported = %s, want %s", got, want) + } + // Check set of transitive packages. + // There are >30 and the set may grow over time, so only check a few. + want := map[string]bool{ + "strings": true, + "time": true, + "runtime": true, + "testing": true, + "unicode": true, + } + for _, path := range all(prog) { + delete(want, path) + } + if len(want) > 0 { + t.Errorf("AllPackages is missing these keys: %q", keys(want)) + } +} + +func TestLoad_MissingIndirectImport(t *testing.T) { + pkgs := map[string]string{ + "a": `package a; import _ "b"`, + "b": `package b; import _ "c"`, + } + conf := loader.Config{Build: fakeContext(pkgs)} + conf.Import("a") + + const wantErr = "couldn't load packages due to errors: b" + + prog, err := conf.Load() + if err == nil { + t.Errorf("Load succeeded unexpectedly, want %q", wantErr) + } else if err.Error() != wantErr { + t.Errorf("Load failed with wrong error %q, want %q", err, wantErr) + } + if prog != nil { + t.Errorf("Load unexpectedly returned a Program") + } +} + +func TestLoad_BadDependency_AllowErrors(t *testing.T) { + for _, test := range []struct { + descr string + pkgs map[string]string + wantPkgs string + }{ + + { + descr: "missing dependency", + pkgs: map[string]string{ + "a": `package a; import _ "b"`, + "b": `package b; import _ "c"`, + }, + wantPkgs: "a b", + }, + { + descr: "bad package decl in dependency", + pkgs: map[string]string{ + "a": `package a; import _ "b"`, + "b": `package b; import _ "c"`, + "c": `package`, + }, + wantPkgs: "a b", + }, + { + descr: "parse error in dependency", + pkgs: map[string]string{ + "a": `package a; import _ "b"`, + "b": `package b; import _ "c"`, + "c": `package c; var x = `, + }, + wantPkgs: "a b c", + }, + } { + conf := loader.Config{ + AllowErrors: true, + Build: fakeContext(test.pkgs), + } + conf.Import("a") + + prog, err := conf.Load() + if err != nil { + t.Errorf("%s: Load failed unexpectedly: %v", test.descr, err) + } + if prog == nil { + t.Fatalf("%s: Load returned a nil Program", test.descr) + } + + if got, want := imported(prog), "a"; got != want { + t.Errorf("%s: Imported = %s, want %s", test.descr, got, want) + } + if got := all(prog); strings.Join(got, " ") != test.wantPkgs { + t.Errorf("%s: AllPackages = %s, want %s", test.descr, got, test.wantPkgs) + } + } +} + +func TestCwd(t *testing.T) { + ctxt := fakeContext(map[string]string{"one/two/three": `package three`}) + for _, test := range []struct { + cwd, arg, want string + }{ + {cwd: "/go/src/one", arg: "./two/three", want: "one/two/three"}, + {cwd: "/go/src/one", arg: "../one/two/three", want: "one/two/three"}, + {cwd: "/go/src/one", arg: "one/two/three", want: "one/two/three"}, + {cwd: "/go/src/one/two/three", arg: ".", want: "one/two/three"}, + {cwd: "/go/src/one", arg: "two/three", want: ""}, + } { + conf := loader.Config{ + Cwd: test.cwd, + Build: ctxt, + } + conf.Import(test.arg) + + var got string + prog, err := conf.Load() + if prog != nil { + got = imported(prog) + } + if got != test.want { + t.Errorf("Load(%s) from %s: Imported = %s, want %s", + test.arg, test.cwd, got, test.want) + if err != nil { + t.Errorf("Load failed: %v", err) + } + } + } +} + +func TestLoad_vendor(t *testing.T) { + if !go16 { + // TODO(adonovan): delete in due course. + t.Skipf("vendoring requires Go 1.6") + } + pkgs := map[string]string{ + "a": `package a; import _ "x"`, + "a/vendor": ``, // mkdir a/vendor + "a/vendor/x": `package xa`, + "b": `package b; import _ "x"`, + "b/vendor": ``, // mkdir b/vendor + "b/vendor/x": `package xb`, + "c": `package c; import _ "x"`, + "x": `package xc`, + } + conf := loader.Config{Build: fakeContext(pkgs)} + conf.Import("a") + conf.Import("b") + conf.Import("c") + + prog, err := conf.Load() + if err != nil { + t.Fatal(err) + } + + // Check that a, b, and c see different versions of x. + for _, r := range "abc" { + name := string(r) + got := prog.Package(name).Pkg.Imports()[0] + want := "x" + name + if got.Name() != want { + t.Errorf("package %s import %q = %s, want %s", + name, "x", got.Name(), want) + } + } +} + +func TestVendorCwd(t *testing.T) { + if !go16 { + // TODO(adonovan): delete in due course. + t.Skipf("vendoring requires Go 1.6") + } + // Test the interaction of cwd and vendor directories. + ctxt := fakeContext(map[string]string{ + "net": ``, // mkdir net + "net/http": `package http; import _ "hpack"`, + "vendor": ``, // mkdir vendor + "vendor/hpack": `package vendorhpack`, + "hpack": `package hpack`, + }) + for i, test := range []struct { + cwd, arg, want string + }{ + {cwd: "/go/src/net", arg: "http"}, // not found + {cwd: "/go/src/net", arg: "./http", want: "net/http vendor/hpack"}, + {cwd: "/go/src/net", arg: "hpack", want: "hpack"}, + {cwd: "/go/src/vendor", arg: "hpack", want: "hpack"}, + {cwd: "/go/src/vendor", arg: "./hpack", want: "vendor/hpack"}, + } { + conf := loader.Config{ + Cwd: test.cwd, + Build: ctxt, + } + conf.Import(test.arg) + + var got string + prog, err := conf.Load() + if prog != nil { + got = strings.Join(all(prog), " ") + } + if got != test.want { + t.Errorf("#%d: Load(%s) from %s: got %s, want %s", + i, test.arg, test.cwd, got, test.want) + if err != nil { + t.Errorf("Load failed: %v", err) + } + } + } +} + +// TODO(adonovan): more Load tests: +// +// failures: +// - to parse package decl of *_test.go files +// - to parse package decl of external *_test.go files +// - to parse whole of *_test.go files +// - to parse whole of external *_test.go files +// - to open a *.go file during import scanning +// - to import from binary + +// features: +// - InitialPackages +// - PackageCreated hook +// - TypeCheckFuncBodies hook + +func TestTransitivelyErrorFreeFlag(t *testing.T) { + // Create an minimal custom build.Context + // that fakes the following packages: + // + // a --> b --> c! c has an error + // \ d and e are transitively error-free. + // e --> d + // + // Each package [a-e] consists of one file, x.go. + pkgs := map[string]string{ + "a": `package a; import (_ "b"; _ "e")`, + "b": `package b; import _ "c"`, + "c": `package c; func f() { _ = int(false) }`, // type error within function body + "d": `package d;`, + "e": `package e; import _ "d"`, + } + conf := loader.Config{ + AllowErrors: true, + Build: fakeContext(pkgs), + } + conf.Import("a") + + prog, err := conf.Load() + if err != nil { + t.Errorf("Load failed: %s", err) + } + if prog == nil { + t.Fatalf("Load returned nil *Program") + } + + for pkg, info := range prog.AllPackages { + var wantErr, wantTEF bool + switch pkg.Path() { + case "a", "b": + case "c": + wantErr = true + case "d", "e": + wantTEF = true + default: + t.Errorf("unexpected package: %q", pkg.Path()) + continue + } + + if (info.Errors != nil) != wantErr { + if wantErr { + t.Errorf("Package %q.Error = nil, want error", pkg.Path()) + } else { + t.Errorf("Package %q has unexpected Errors: %v", + pkg.Path(), info.Errors) + } + } + + if info.TransitivelyErrorFree != wantTEF { + t.Errorf("Package %q.TransitivelyErrorFree=%t, want %t", + pkg.Path(), info.TransitivelyErrorFree, wantTEF) + } + } +} + +// Test that syntax (scan/parse), type, and loader errors are recorded +// (in PackageInfo.Errors) and reported (via Config.TypeChecker.Error). +func TestErrorReporting(t *testing.T) { + pkgs := map[string]string{ + "a": `package a; import (_ "b"; _ "c"); var x int = false`, + "b": `package b; 'syntax error!`, + } + conf := loader.Config{ + AllowErrors: true, + Build: fakeContext(pkgs), + } + var mu sync.Mutex + var allErrors []error + conf.TypeChecker.Error = func(err error) { + mu.Lock() + allErrors = append(allErrors, err) + mu.Unlock() + } + conf.Import("a") + + prog, err := conf.Load() + if err != nil { + t.Errorf("Load failed: %s", err) + } + if prog == nil { + t.Fatalf("Load returned nil *Program") + } + + // TODO(adonovan): test keys of ImportMap. + + // Check errors recorded in each PackageInfo. + for pkg, info := range prog.AllPackages { + switch pkg.Path() { + case "a": + if !hasError(info.Errors, "cannot convert false") { + t.Errorf("a.Errors = %v, want bool conversion (type) error", info.Errors) + } + if !hasError(info.Errors, "could not import c") { + t.Errorf("a.Errors = %v, want import (loader) error", info.Errors) + } + case "b": + if !hasError(info.Errors, "rune literal not terminated") { + t.Errorf("b.Errors = %v, want unterminated literal (syntax) error", info.Errors) + } + } + } + + // Check errors reported via error handler. + if !hasError(allErrors, "cannot convert false") || + !hasError(allErrors, "rune literal not terminated") || + !hasError(allErrors, "could not import c") { + t.Errorf("allErrors = %v, want syntax, type and loader errors", allErrors) + } +} + +func TestCycles(t *testing.T) { + for _, test := range []struct { + descr string + ctxt *build.Context + wantErr string + }{ + { + "self-cycle", + fakeContext(map[string]string{ + "main": `package main; import _ "selfcycle"`, + "selfcycle": `package selfcycle; import _ "selfcycle"`, + }), + `import cycle: selfcycle -> selfcycle`, + }, + { + "three-package cycle", + fakeContext(map[string]string{ + "main": `package main; import _ "a"`, + "a": `package a; import _ "b"`, + "b": `package b; import _ "c"`, + "c": `package c; import _ "a"`, + }), + `import cycle: c -> a -> b -> c`, + }, + { + "self-cycle in dependency of test file", + buildutil.FakeContext(map[string]map[string]string{ + "main": { + "main.go": `package main`, + "main_test.go": `package main; import _ "a"`, + }, + "a": { + "a.go": `package a; import _ "a"`, + }, + }), + `import cycle: a -> a`, + }, + // TODO(adonovan): fix: these fail + // { + // "two-package cycle in dependency of test file", + // buildutil.FakeContext(map[string]map[string]string{ + // "main": { + // "main.go": `package main`, + // "main_test.go": `package main; import _ "a"`, + // }, + // "a": { + // "a.go": `package a; import _ "main"`, + // }, + // }), + // `import cycle: main -> a -> main`, + // }, + // { + // "self-cycle in augmented package", + // buildutil.FakeContext(map[string]map[string]string{ + // "main": { + // "main.go": `package main`, + // "main_test.go": `package main; import _ "main"`, + // }, + // }), + // `import cycle: main -> main`, + // }, + } { + conf := loader.Config{ + AllowErrors: true, + Build: test.ctxt, + } + var mu sync.Mutex + var allErrors []error + conf.TypeChecker.Error = func(err error) { + mu.Lock() + allErrors = append(allErrors, err) + mu.Unlock() + } + conf.ImportWithTests("main") + + prog, err := conf.Load() + if err != nil { + t.Errorf("%s: Load failed: %s", test.descr, err) + } + if prog == nil { + t.Fatalf("%s: Load returned nil *Program", test.descr) + } + + if !hasError(allErrors, test.wantErr) { + t.Errorf("%s: Load() errors = %q, want %q", + test.descr, allErrors, test.wantErr) + } + } + + // TODO(adonovan): + // - Test that in a legal test cycle, none of the symbols + // defined by augmentation are visible via import. +} + +// ---- utilities ---- + +// Simplifying wrapper around buildutil.FakeContext for single-file packages. +func fakeContext(pkgs map[string]string) *build.Context { + pkgs2 := make(map[string]map[string]string) + for path, content := range pkgs { + pkgs2[path] = map[string]string{"x.go": content} + } + return buildutil.FakeContext(pkgs2) +} + +func hasError(errors []error, substr string) bool { + for _, err := range errors { + if strings.Contains(err.Error(), substr) { + return true + } + } + return false +} + +func keys(m map[string]bool) (keys []string) { + for key := range m { + keys = append(keys, key) + } + sort.Strings(keys) + return +} + +// Returns all loaded packages. +func all(prog *loader.Program) []string { + var pkgs []string + for _, info := range prog.AllPackages { + pkgs = append(pkgs, info.Pkg.Path()) + } + sort.Strings(pkgs) + return pkgs +} + +// Returns initially imported packages, as a string. +func imported(prog *loader.Program) string { + var pkgs []string + for _, info := range prog.Imported { + pkgs = append(pkgs, info.Pkg.Path()) + } + sort.Strings(pkgs) + return strings.Join(pkgs, " ") +} + +// Returns initially created packages, as a string. +func created(prog *loader.Program) string { + var pkgs []string + for _, info := range prog.Created { + pkgs = append(pkgs, info.Pkg.Path()) + } + return strings.Join(pkgs, " ") +} diff --git a/vendor/golang.org/x/tools/go/loader/stdlib14_test.go b/vendor/golang.org/x/tools/go/loader/stdlib14_test.go new file mode 100644 index 0000000000..c3a29874bc --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/stdlib14_test.go @@ -0,0 +1,197 @@ +// Copyright 2013 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.5 + +package loader_test + +// This file enumerates all packages beneath $GOROOT, loads them, plus +// their external tests if any, runs the type checker on them, and +// prints some summary information. + +import ( + "bytes" + "fmt" + "go/ast" + "go/build" + "go/token" + "io/ioutil" + "path/filepath" + "runtime" + "strings" + "testing" + "time" + + "golang.org/x/tools/go/buildutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/types" +) + +func TestStdlib(t *testing.T) { + if runtime.GOOS == "android" { + t.Skipf("incomplete std lib on %s", runtime.GOOS) + } + + runtime.GC() + t0 := time.Now() + var memstats runtime.MemStats + runtime.ReadMemStats(&memstats) + alloc := memstats.Alloc + + // Load, parse and type-check the program. + ctxt := build.Default // copy + ctxt.GOPATH = "" // disable GOPATH + conf := loader.Config{Build: &ctxt} + for _, path := range buildutil.AllPackages(conf.Build) { + conf.ImportWithTests(path) + } + + prog, err := conf.Load() + if err != nil { + t.Fatalf("Load failed: %v", err) + } + + t1 := time.Now() + runtime.GC() + runtime.ReadMemStats(&memstats) + + numPkgs := len(prog.AllPackages) + if want := 205; numPkgs < want { + t.Errorf("Loaded only %d packages, want at least %d", numPkgs, want) + } + + // Dump package members. + if false { + for pkg := range prog.AllPackages { + fmt.Printf("Package %s:\n", pkg.Path()) + scope := pkg.Scope() + qualifier := types.RelativeTo(pkg) + for _, name := range scope.Names() { + if ast.IsExported(name) { + fmt.Printf("\t%s\n", types.ObjectString(scope.Lookup(name), qualifier)) + } + } + fmt.Println() + } + } + + // Check that Test functions for io/ioutil, regexp and + // compress/bzip2 are all simultaneously present. + // (The apparent cycle formed when augmenting all three of + // these packages by their tests was the original motivation + // for reporting b/7114.) + // + // compress/bzip2.TestBitReader in bzip2_test.go imports io/ioutil + // io/ioutil.TestTempFile in tempfile_test.go imports regexp + // regexp.TestRE2Search in exec_test.go imports compress/bzip2 + for _, test := range []struct{ pkg, fn string }{ + {"io/ioutil", "TestTempFile"}, + {"regexp", "TestRE2Search"}, + {"compress/bzip2", "TestBitReader"}, + } { + info := prog.Imported[test.pkg] + if info == nil { + t.Errorf("failed to load package %q", test.pkg) + continue + } + obj, _ := info.Pkg.Scope().Lookup(test.fn).(*types.Func) + if obj == nil { + t.Errorf("package %q has no func %q", test.pkg, test.fn) + continue + } + } + + // Dump some statistics. + + // determine line count + var lineCount int + prog.Fset.Iterate(func(f *token.File) bool { + lineCount += f.LineCount() + return true + }) + + t.Log("GOMAXPROCS: ", runtime.GOMAXPROCS(0)) + t.Log("#Source lines: ", lineCount) + t.Log("Load/parse/typecheck: ", t1.Sub(t0)) + t.Log("#MB: ", int64(memstats.Alloc-alloc)/1000000) +} + +func TestCgoOption(t *testing.T) { + switch runtime.GOOS { + // On these systems, the net and os/user packages don't use cgo + // or the std library is incomplete (Android). + case "android", "plan9", "solaris", "windows": + t.Skipf("no cgo or incomplete std lib on %s", runtime.GOOS) + } + // In nocgo builds (e.g. linux-amd64-nocgo), + // there is no "runtime/cgo" package, + // so cgo-generated Go files will have a failing import. + if !build.Default.CgoEnabled { + return + } + // Test that we can load cgo-using packages with + // CGO_ENABLED=[01], which causes go/build to select pure + // Go/native implementations, respectively, based on build + // tags. + // + // Each entry specifies a package-level object and the generic + // file expected to define it when cgo is disabled. + // When cgo is enabled, the exact file is not specified (since + // it varies by platform), but must differ from the generic one. + // + // The test also loads the actual file to verify that the + // object is indeed defined at that location. + for _, test := range []struct { + pkg, name, genericFile string + }{ + {"net", "cgoLookupHost", "cgo_stub.go"}, + {"os/user", "lookupId", "lookup_stubs.go"}, + } { + ctxt := build.Default + for _, ctxt.CgoEnabled = range []bool{false, true} { + conf := loader.Config{Build: &ctxt} + conf.Import(test.pkg) + prog, err := conf.Load() + if err != nil { + t.Errorf("Load failed: %v", err) + continue + } + info := prog.Imported[test.pkg] + if info == nil { + t.Errorf("package %s not found", test.pkg) + continue + } + obj := info.Pkg.Scope().Lookup(test.name) + if obj == nil { + t.Errorf("no object %s.%s", test.pkg, test.name) + continue + } + posn := prog.Fset.Position(obj.Pos()) + t.Logf("%s: %s (CgoEnabled=%t)", posn, obj, ctxt.CgoEnabled) + + gotFile := filepath.Base(posn.Filename) + filesMatch := gotFile == test.genericFile + + if ctxt.CgoEnabled && filesMatch { + t.Errorf("CGO_ENABLED=1: %s found in %s, want native file", + obj, gotFile) + } else if !ctxt.CgoEnabled && !filesMatch { + t.Errorf("CGO_ENABLED=0: %s found in %s, want %s", + obj, gotFile, test.genericFile) + } + + // Load the file and check the object is declared at the right place. + b, err := ioutil.ReadFile(posn.Filename) + if err != nil { + t.Errorf("can't read %s: %s", posn.Filename, err) + continue + } + line := string(bytes.Split(b, []byte("\n"))[posn.Line-1]) + ident := line[posn.Column-1:] + if !strings.HasPrefix(ident, test.name) { + t.Errorf("%s: %s not declared here (looking at %q)", posn, obj, ident) + } + } + } +} diff --git a/vendor/golang.org/x/tools/go/loader/stdlib_test.go b/vendor/golang.org/x/tools/go/loader/stdlib_test.go new file mode 100644 index 0000000000..bc1618ef6b --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/stdlib_test.go @@ -0,0 +1,203 @@ +// Copyright 2013 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.5 + +package loader_test + +// This file enumerates all packages beneath $GOROOT, loads them, plus +// their external tests if any, runs the type checker on them, and +// prints some summary information. + +import ( + "bytes" + "fmt" + "go/ast" + "go/build" + "go/token" + "go/types" + "io/ioutil" + "path/filepath" + "runtime" + "strings" + "testing" + "time" + + "golang.org/x/tools/go/buildutil" + "golang.org/x/tools/go/loader" +) + +func TestStdlib(t *testing.T) { + if runtime.GOOS == "android" { + t.Skipf("incomplete std lib on %s", runtime.GOOS) + } + if testing.Short() { + t.Skip("skipping in short mode; uses tons of memory (golang.org/issue/14113)") + } + + runtime.GC() + t0 := time.Now() + var memstats runtime.MemStats + runtime.ReadMemStats(&memstats) + alloc := memstats.Alloc + + // Load, parse and type-check the program. + ctxt := build.Default // copy + ctxt.GOPATH = "" // disable GOPATH + conf := loader.Config{Build: &ctxt} + for _, path := range buildutil.AllPackages(conf.Build) { + conf.ImportWithTests(path) + } + + prog, err := conf.Load() + if err != nil { + t.Fatalf("Load failed: %v", err) + } + + t1 := time.Now() + runtime.GC() + runtime.ReadMemStats(&memstats) + + numPkgs := len(prog.AllPackages) + if want := 205; numPkgs < want { + t.Errorf("Loaded only %d packages, want at least %d", numPkgs, want) + } + + // Dump package members. + if false { + for pkg := range prog.AllPackages { + fmt.Printf("Package %s:\n", pkg.Path()) + scope := pkg.Scope() + qualifier := types.RelativeTo(pkg) + for _, name := range scope.Names() { + if ast.IsExported(name) { + fmt.Printf("\t%s\n", types.ObjectString(scope.Lookup(name), qualifier)) + } + } + fmt.Println() + } + } + + // Check that Test functions for io/ioutil, regexp and + // compress/bzip2 are all simultaneously present. + // (The apparent cycle formed when augmenting all three of + // these packages by their tests was the original motivation + // for reporting b/7114.) + // + // compress/bzip2.TestBitReader in bzip2_test.go imports io/ioutil + // io/ioutil.TestTempFile in tempfile_test.go imports regexp + // regexp.TestRE2Search in exec_test.go imports compress/bzip2 + for _, test := range []struct{ pkg, fn string }{ + {"io/ioutil", "TestTempFile"}, + {"regexp", "TestRE2Search"}, + {"compress/bzip2", "TestBitReader"}, + } { + info := prog.Imported[test.pkg] + if info == nil { + t.Errorf("failed to load package %q", test.pkg) + continue + } + obj, _ := info.Pkg.Scope().Lookup(test.fn).(*types.Func) + if obj == nil { + t.Errorf("package %q has no func %q", test.pkg, test.fn) + continue + } + } + + // Dump some statistics. + + // determine line count + var lineCount int + prog.Fset.Iterate(func(f *token.File) bool { + lineCount += f.LineCount() + return true + }) + + t.Log("GOMAXPROCS: ", runtime.GOMAXPROCS(0)) + t.Log("#Source lines: ", lineCount) + t.Log("Load/parse/typecheck: ", t1.Sub(t0)) + t.Log("#MB: ", int64(memstats.Alloc-alloc)/1000000) +} + +func TestCgoOption(t *testing.T) { + if testing.Short() { + t.Skip("skipping in short mode; uses tons of memory (golang.org/issue/14113)") + } + switch runtime.GOOS { + // On these systems, the net and os/user packages don't use cgo + // or the std library is incomplete (Android). + case "android", "plan9", "solaris", "windows": + t.Skipf("no cgo or incomplete std lib on %s", runtime.GOOS) + } + // In nocgo builds (e.g. linux-amd64-nocgo), + // there is no "runtime/cgo" package, + // so cgo-generated Go files will have a failing import. + if !build.Default.CgoEnabled { + return + } + // Test that we can load cgo-using packages with + // CGO_ENABLED=[01], which causes go/build to select pure + // Go/native implementations, respectively, based on build + // tags. + // + // Each entry specifies a package-level object and the generic + // file expected to define it when cgo is disabled. + // When cgo is enabled, the exact file is not specified (since + // it varies by platform), but must differ from the generic one. + // + // The test also loads the actual file to verify that the + // object is indeed defined at that location. + for _, test := range []struct { + pkg, name, genericFile string + }{ + {"net", "cgoLookupHost", "cgo_stub.go"}, + {"os/user", "current", "lookup_stubs.go"}, + } { + ctxt := build.Default + for _, ctxt.CgoEnabled = range []bool{false, true} { + conf := loader.Config{Build: &ctxt} + conf.Import(test.pkg) + prog, err := conf.Load() + if err != nil { + t.Errorf("Load failed: %v", err) + continue + } + info := prog.Imported[test.pkg] + if info == nil { + t.Errorf("package %s not found", test.pkg) + continue + } + obj := info.Pkg.Scope().Lookup(test.name) + if obj == nil { + t.Errorf("no object %s.%s", test.pkg, test.name) + continue + } + posn := prog.Fset.Position(obj.Pos()) + t.Logf("%s: %s (CgoEnabled=%t)", posn, obj, ctxt.CgoEnabled) + + gotFile := filepath.Base(posn.Filename) + filesMatch := gotFile == test.genericFile + + if ctxt.CgoEnabled && filesMatch { + t.Errorf("CGO_ENABLED=1: %s found in %s, want native file", + obj, gotFile) + } else if !ctxt.CgoEnabled && !filesMatch { + t.Errorf("CGO_ENABLED=0: %s found in %s, want %s", + obj, gotFile, test.genericFile) + } + + // Load the file and check the object is declared at the right place. + b, err := ioutil.ReadFile(posn.Filename) + if err != nil { + t.Errorf("can't read %s: %s", posn.Filename, err) + continue + } + line := string(bytes.Split(b, []byte("\n"))[posn.Line-1]) + ident := line[posn.Column-1:] + if !strings.HasPrefix(ident, test.name) { + t.Errorf("%s: %s not declared here (looking at %q)", posn, obj, ident) + } + } + } +} diff --git a/vendor/golang.org/x/tools/go/loader/testdata/a.go b/vendor/golang.org/x/tools/go/loader/testdata/a.go new file mode 100644 index 0000000000..bae3955088 --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/testdata/a.go @@ -0,0 +1 @@ +package P diff --git a/vendor/golang.org/x/tools/go/loader/testdata/b.go b/vendor/golang.org/x/tools/go/loader/testdata/b.go new file mode 100644 index 0000000000..bae3955088 --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/testdata/b.go @@ -0,0 +1 @@ +package P diff --git a/vendor/golang.org/x/tools/go/loader/testdata/badpkgdecl.go b/vendor/golang.org/x/tools/go/loader/testdata/badpkgdecl.go new file mode 100644 index 0000000000..1e393595c3 --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/testdata/badpkgdecl.go @@ -0,0 +1 @@ +// this file has no package decl diff --git a/vendor/golang.org/x/tools/go/loader/util.go b/vendor/golang.org/x/tools/go/loader/util.go new file mode 100644 index 0000000000..7f38dd7407 --- /dev/null +++ b/vendor/golang.org/x/tools/go/loader/util.go @@ -0,0 +1,124 @@ +// Copyright 2013 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 loader + +import ( + "go/ast" + "go/build" + "go/parser" + "go/token" + "io" + "os" + "strconv" + "sync" + + "golang.org/x/tools/go/buildutil" +) + +// We use a counting semaphore to limit +// the number of parallel I/O calls per process. +var ioLimit = make(chan bool, 10) + +// parseFiles parses the Go source files within directory dir and +// returns the ASTs of the ones that could be at least partially parsed, +// along with a list of I/O and parse errors encountered. +// +// I/O is done via ctxt, which may specify a virtual file system. +// displayPath is used to transform the filenames attached to the ASTs. +// +func parseFiles(fset *token.FileSet, ctxt *build.Context, displayPath func(string) string, dir string, files []string, mode parser.Mode) ([]*ast.File, []error) { + if displayPath == nil { + displayPath = func(path string) string { return path } + } + var wg sync.WaitGroup + n := len(files) + parsed := make([]*ast.File, n) + errors := make([]error, n) + for i, file := range files { + if !buildutil.IsAbsPath(ctxt, file) { + file = buildutil.JoinPath(ctxt, dir, file) + } + wg.Add(1) + go func(i int, file string) { + ioLimit <- true // wait + defer func() { + wg.Done() + <-ioLimit // signal + }() + var rd io.ReadCloser + var err error + if ctxt.OpenFile != nil { + rd, err = ctxt.OpenFile(file) + } else { + rd, err = os.Open(file) + } + if err != nil { + errors[i] = err // open failed + return + } + + // ParseFile may return both an AST and an error. + parsed[i], errors[i] = parser.ParseFile(fset, displayPath(file), rd, mode) + rd.Close() + }(i, file) + } + wg.Wait() + + // Eliminate nils, preserving order. + var o int + for _, f := range parsed { + if f != nil { + parsed[o] = f + o++ + } + } + parsed = parsed[:o] + + o = 0 + for _, err := range errors { + if err != nil { + errors[o] = err + o++ + } + } + errors = errors[:o] + + return parsed, errors +} + +// scanImports returns the set of all import paths from all +// import specs in the specified files. +func scanImports(files []*ast.File) map[string]bool { + imports := make(map[string]bool) + for _, f := range files { + for _, decl := range f.Decls { + if decl, ok := decl.(*ast.GenDecl); ok && decl.Tok == token.IMPORT { + for _, spec := range decl.Specs { + spec := spec.(*ast.ImportSpec) + + // NB: do not assume the program is well-formed! + path, err := strconv.Unquote(spec.Path.Value) + if err != nil { + continue // quietly ignore the error + } + if path == "C" { + continue // skip pseudopackage + } + imports[path] = true + } + } + } + } + return imports +} + +// ---------- Internal helpers ---------- + +// TODO(adonovan): make this a method: func (*token.File) Contains(token.Pos) +func tokenFileContainsPos(f *token.File, pos token.Pos) bool { + p := int(pos) + base := f.Base() + return base <= p && p < base+f.Size() +} diff --git a/vendor/golang.org/x/tools/go/pointer/TODO b/vendor/golang.org/x/tools/go/pointer/TODO new file mode 100644 index 0000000000..f95e70621d --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/TODO @@ -0,0 +1,33 @@ +-*- text -*- + +Pointer analysis to-do list +=========================== + +CONSTRAINT GENERATION: +- support reflection: + - a couple of operators are missing + - reflect.Values may contain lvalues (CanAddr) +- implement native intrinsics. These vary by platform. +- add to pts(a.panic) a label representing all runtime panics, e.g. + runtime.{TypeAssertionError,errorString,errorCString}. + +OPTIMISATIONS +- pre-solver: + pointer equivalence: extend HVN to HRU + location equivalence +- solver: HCD, LCD. +- experiment with map+slice worklist in lieu of bitset. + It may have faster insert. + +MISC: +- Test on all platforms. + Currently we assume these go/build tags: linux, amd64, !cgo. + +MAINTAINABILITY +- Think about ways to make debugging this code easier. PTA logs + routinely exceed a million lines and require training to read. + +BUGS: +- There's a crash bug in stdlib_test + reflection, rVCallConstraint. + + diff --git a/vendor/golang.org/x/tools/go/pointer/analysis.go b/vendor/golang.org/x/tools/go/pointer/analysis.go new file mode 100644 index 0000000000..9f3476ce42 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/analysis.go @@ -0,0 +1,449 @@ +// Copyright 2013 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.5 + +package pointer + +// This file defines the main datatypes and Analyze function of the pointer analysis. + +import ( + "fmt" + "go/token" + "go/types" + "io" + "os" + "reflect" + "runtime" + "runtime/debug" + "sort" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types/typeutil" +) + +const ( + // optimization options; enable all when committing + optRenumber = true // enable renumbering optimization (makes logs hard to read) + optHVN = true // enable pointer equivalence via Hash-Value Numbering + + // debugging options; disable all when committing + debugHVN = false // enable assertions in HVN + debugHVNVerbose = false // enable extra HVN logging + debugHVNCrossCheck = false // run solver with/without HVN and compare (caveats below) + debugTimers = false // show running time of each phase +) + +// object.flags bitmask values. +const ( + otTagged = 1 << iota // type-tagged object + otIndirect // type-tagged object with indirect payload + otFunction // function object +) + +// An object represents a contiguous block of memory to which some +// (generalized) pointer may point. +// +// (Note: most variables called 'obj' are not *objects but nodeids +// such that a.nodes[obj].obj != nil.) +// +type object struct { + // flags is a bitset of the node type (ot*) flags defined above. + flags uint32 + + // Number of following nodes belonging to the same "object" + // allocation. Zero for all other nodes. + size uint32 + + // data describes this object; it has one of these types: + // + // ssa.Value for an object allocated by an SSA operation. + // types.Type for an rtype instance object or *rtype-tagged object. + // string for an instrinsic object, e.g. the array behind os.Args. + // nil for an object allocated by an instrinsic. + // (cgn provides the identity of the intrinsic.) + data interface{} + + // The call-graph node (=context) in which this object was allocated. + // May be nil for global objects: Global, Const, some Functions. + cgn *cgnode +} + +// nodeid denotes a node. +// It is an index within analysis.nodes. +// We use small integers, not *node pointers, for many reasons: +// - they are smaller on 64-bit systems. +// - sets of them can be represented compactly in bitvectors or BDDs. +// - order matters; a field offset can be computed by simple addition. +type nodeid uint32 + +// A node is an equivalence class of memory locations. +// Nodes may be pointers, pointed-to locations, neither, or both. +// +// Nodes that are pointed-to locations ("labels") have an enclosing +// object (see analysis.enclosingObject). +// +type node struct { + // If non-nil, this node is the start of an object + // (addressable memory location). + // The following obj.size nodes implicitly belong to the object; + // they locate their object by scanning back. + obj *object + + // The type of the field denoted by this node. Non-aggregate, + // unless this is an tagged.T node (i.e. the thing + // pointed to by an interface) in which case typ is that type. + typ types.Type + + // subelement indicates which directly embedded subelement of + // an object of aggregate type (struct, tuple, array) this is. + subelement *fieldInfo // e.g. ".a.b[*].c" + + // Solver state for the canonical node of this pointer- + // equivalence class. Each node is created with its own state + // but they become shared after HVN. + solve *solverState +} + +// An analysis instance holds the state of a single pointer analysis problem. +type analysis struct { + config *Config // the client's control/observer interface + prog *ssa.Program // the program being analyzed + log io.Writer // log stream; nil to disable + panicNode nodeid // sink for panic, source for recover + nodes []*node // indexed by nodeid + flattenMemo map[types.Type][]*fieldInfo // memoization of flatten() + trackTypes map[types.Type]bool // memoization of shouldTrack() + constraints []constraint // set of constraints + cgnodes []*cgnode // all cgnodes + genq []*cgnode // queue of functions to generate constraints for + intrinsics map[*ssa.Function]intrinsic // non-nil values are summaries for intrinsic fns + globalval map[ssa.Value]nodeid // node for each global ssa.Value + globalobj map[ssa.Value]nodeid // maps v to sole member of pts(v), if singleton + localval map[ssa.Value]nodeid // node for each local ssa.Value + localobj map[ssa.Value]nodeid // maps v to sole member of pts(v), if singleton + atFuncs map[*ssa.Function]bool // address-taken functions (for presolver) + mapValues []nodeid // values of makemap objects (indirect in HVN) + work nodeset // solver's worklist + result *Result // results of the analysis + track track // pointerlike types whose aliasing we track + deltaSpace []int // working space for iterating over PTS deltas + + // Reflection & intrinsics: + hasher typeutil.Hasher // cache of type hashes + reflectValueObj types.Object // type symbol for reflect.Value (if present) + reflectValueCall *ssa.Function // (reflect.Value).Call + reflectRtypeObj types.Object // *types.TypeName for reflect.rtype (if present) + reflectRtypePtr *types.Pointer // *reflect.rtype + reflectType *types.Named // reflect.Type + rtypes typeutil.Map // nodeid of canonical *rtype-tagged object for type T + reflectZeros typeutil.Map // nodeid of canonical T-tagged object for zero value + runtimeSetFinalizer *ssa.Function // runtime.SetFinalizer +} + +// enclosingObj returns the first node of the addressable memory +// object that encloses node id. Panic ensues if that node does not +// belong to any object. +func (a *analysis) enclosingObj(id nodeid) nodeid { + // Find previous node with obj != nil. + for i := id; i >= 0; i-- { + n := a.nodes[i] + if obj := n.obj; obj != nil { + if i+nodeid(obj.size) <= id { + break // out of bounds + } + return i + } + } + panic("node has no enclosing object") +} + +// labelFor returns the Label for node id. +// Panic ensues if that node is not addressable. +func (a *analysis) labelFor(id nodeid) *Label { + return &Label{ + obj: a.nodes[a.enclosingObj(id)].obj, + subelement: a.nodes[id].subelement, + } +} + +func (a *analysis) warnf(pos token.Pos, format string, args ...interface{}) { + msg := fmt.Sprintf(format, args...) + if a.log != nil { + fmt.Fprintf(a.log, "%s: warning: %s\n", a.prog.Fset.Position(pos), msg) + } + a.result.Warnings = append(a.result.Warnings, Warning{pos, msg}) +} + +// computeTrackBits sets a.track to the necessary 'track' bits for the pointer queries. +func (a *analysis) computeTrackBits() { + var queryTypes []types.Type + for v := range a.config.Queries { + queryTypes = append(queryTypes, v.Type()) + } + for v := range a.config.IndirectQueries { + queryTypes = append(queryTypes, mustDeref(v.Type())) + } + for _, t := range queryTypes { + switch t.Underlying().(type) { + case *types.Chan: + a.track |= trackChan + case *types.Map: + a.track |= trackMap + case *types.Pointer: + a.track |= trackPtr + case *types.Slice: + a.track |= trackSlice + case *types.Interface: + a.track = trackAll + return + } + if rVObj := a.reflectValueObj; rVObj != nil && types.Identical(t, rVObj.Type()) { + a.track = trackAll + return + } + } +} + +// Analyze runs the pointer analysis with the scope and options +// specified by config, and returns the (synthetic) root of the callgraph. +// +// Pointer analysis of a transitively closed well-typed program should +// always succeed. An error can occur only due to an internal bug. +// +func Analyze(config *Config) (result *Result, err error) { + if config.Mains == nil { + return nil, fmt.Errorf("no main/test packages to analyze (check $GOROOT/$GOPATH)") + } + defer func() { + if p := recover(); p != nil { + err = fmt.Errorf("internal error in pointer analysis: %v (please report this bug)", p) + fmt.Fprintln(os.Stderr, "Internal panic in pointer analysis:") + debug.PrintStack() + } + }() + + a := &analysis{ + config: config, + log: config.Log, + prog: config.prog(), + globalval: make(map[ssa.Value]nodeid), + globalobj: make(map[ssa.Value]nodeid), + flattenMemo: make(map[types.Type][]*fieldInfo), + trackTypes: make(map[types.Type]bool), + atFuncs: make(map[*ssa.Function]bool), + hasher: typeutil.MakeHasher(), + intrinsics: make(map[*ssa.Function]intrinsic), + result: &Result{ + Queries: make(map[ssa.Value]Pointer), + IndirectQueries: make(map[ssa.Value]Pointer), + }, + deltaSpace: make([]int, 0, 100), + } + + if false { + a.log = os.Stderr // for debugging crashes; extremely verbose + } + + if a.log != nil { + fmt.Fprintln(a.log, "==== Starting analysis") + } + + // Pointer analysis requires a complete program for soundness. + // Check to prevent accidental misconfiguration. + for _, pkg := range a.prog.AllPackages() { + // (This only checks that the package scope is complete, + // not that func bodies exist, but it's a good signal.) + if !pkg.Pkg.Complete() { + return nil, fmt.Errorf(`pointer analysis requires a complete program yet package %q was incomplete`, pkg.Pkg.Path()) + } + } + + if reflect := a.prog.ImportedPackage("reflect"); reflect != nil { + rV := reflect.Pkg.Scope().Lookup("Value") + a.reflectValueObj = rV + a.reflectValueCall = a.prog.LookupMethod(rV.Type(), nil, "Call") + a.reflectType = reflect.Pkg.Scope().Lookup("Type").Type().(*types.Named) + a.reflectRtypeObj = reflect.Pkg.Scope().Lookup("rtype") + a.reflectRtypePtr = types.NewPointer(a.reflectRtypeObj.Type()) + + // Override flattening of reflect.Value, treating it like a basic type. + tReflectValue := a.reflectValueObj.Type() + a.flattenMemo[tReflectValue] = []*fieldInfo{{typ: tReflectValue}} + + // Override shouldTrack of reflect.Value and *reflect.rtype. + // Always track pointers of these types. + a.trackTypes[tReflectValue] = true + a.trackTypes[a.reflectRtypePtr] = true + + a.rtypes.SetHasher(a.hasher) + a.reflectZeros.SetHasher(a.hasher) + } + if runtime := a.prog.ImportedPackage("runtime"); runtime != nil { + a.runtimeSetFinalizer = runtime.Func("SetFinalizer") + } + a.computeTrackBits() + + a.generate() + a.showCounts() + + if optRenumber { + a.renumber() + } + + N := len(a.nodes) // excludes solver-created nodes + + if optHVN { + if debugHVNCrossCheck { + // Cross-check: run the solver once without + // optimization, once with, and compare the + // solutions. + savedConstraints := a.constraints + + a.solve() + a.dumpSolution("A.pts", N) + + // Restore. + a.constraints = savedConstraints + for _, n := range a.nodes { + n.solve = new(solverState) + } + a.nodes = a.nodes[:N] + + // rtypes is effectively part of the solver state. + a.rtypes = typeutil.Map{} + a.rtypes.SetHasher(a.hasher) + } + + a.hvn() + } + + if debugHVNCrossCheck { + runtime.GC() + runtime.GC() + } + + a.solve() + + // Compare solutions. + if optHVN && debugHVNCrossCheck { + a.dumpSolution("B.pts", N) + + if !diff("A.pts", "B.pts") { + return nil, fmt.Errorf("internal error: optimization changed solution") + } + } + + // Create callgraph.Nodes in deterministic order. + if cg := a.result.CallGraph; cg != nil { + for _, caller := range a.cgnodes { + cg.CreateNode(caller.fn) + } + } + + // Add dynamic edges to call graph. + var space [100]int + for _, caller := range a.cgnodes { + for _, site := range caller.sites { + for _, callee := range a.nodes[site.targets].solve.pts.AppendTo(space[:0]) { + a.callEdge(caller, site, nodeid(callee)) + } + } + } + + return a.result, nil +} + +// callEdge is called for each edge in the callgraph. +// calleeid is the callee's object node (has otFunction flag). +// +func (a *analysis) callEdge(caller *cgnode, site *callsite, calleeid nodeid) { + obj := a.nodes[calleeid].obj + if obj.flags&otFunction == 0 { + panic(fmt.Sprintf("callEdge %s -> n%d: not a function object", site, calleeid)) + } + callee := obj.cgn + + if cg := a.result.CallGraph; cg != nil { + // TODO(adonovan): opt: I would expect duplicate edges + // (to wrappers) to arise due to the elimination of + // context information, but I haven't observed any. + // Understand this better. + callgraph.AddEdge(cg.CreateNode(caller.fn), site.instr, cg.CreateNode(callee.fn)) + } + + if a.log != nil { + fmt.Fprintf(a.log, "\tcall edge %s -> %s\n", site, callee) + } + + // Warn about calls to non-intrinsic external functions. + // TODO(adonovan): de-dup these messages. + if fn := callee.fn; fn.Blocks == nil && a.findIntrinsic(fn) == nil { + a.warnf(site.pos(), "unsound call to unknown intrinsic: %s", fn) + a.warnf(fn.Pos(), " (declared here)") + } +} + +// dumpSolution writes the PTS solution to the specified file. +// +// It only dumps the nodes that existed before solving. The order in +// which solver-created nodes are created depends on pre-solver +// optimization, so we can't include them in the cross-check. +// +func (a *analysis) dumpSolution(filename string, N int) { + f, err := os.Create(filename) + if err != nil { + panic(err) + } + for id, n := range a.nodes[:N] { + if _, err := fmt.Fprintf(f, "pts(n%d) = {", id); err != nil { + panic(err) + } + var sep string + for _, l := range n.solve.pts.AppendTo(a.deltaSpace) { + if l >= N { + break + } + fmt.Fprintf(f, "%s%d", sep, l) + sep = " " + } + fmt.Fprintf(f, "} : %s\n", n.typ) + } + if err := f.Close(); err != nil { + panic(err) + } +} + +// showCounts logs the size of the constraint system. A typical +// optimized distribution is 65% copy, 13% load, 11% addr, 5% +// offsetAddr, 4% store, 2% others. +// +func (a *analysis) showCounts() { + if a.log != nil { + counts := make(map[reflect.Type]int) + for _, c := range a.constraints { + counts[reflect.TypeOf(c)]++ + } + fmt.Fprintf(a.log, "# constraints:\t%d\n", len(a.constraints)) + var lines []string + for t, n := range counts { + line := fmt.Sprintf("%7d (%2d%%)\t%s", n, 100*n/len(a.constraints), t) + lines = append(lines, line) + } + sort.Sort(sort.Reverse(sort.StringSlice(lines))) + for _, line := range lines { + fmt.Fprintf(a.log, "\t%s\n", line) + } + + fmt.Fprintf(a.log, "# nodes:\t%d\n", len(a.nodes)) + + // Show number of pointer equivalence classes. + m := make(map[*solverState]bool) + for _, n := range a.nodes { + m[n.solve] = true + } + fmt.Fprintf(a.log, "# ptsets:\t%d\n", len(m)) + } +} diff --git a/vendor/golang.org/x/tools/go/pointer/analysis14.go b/vendor/golang.org/x/tools/go/pointer/analysis14.go new file mode 100644 index 0000000000..70761feba6 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/analysis14.go @@ -0,0 +1,449 @@ +// Copyright 2013 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.5 + +package pointer + +// This file defines the main datatypes and Analyze function of the pointer analysis. + +import ( + "fmt" + "go/token" + "io" + "os" + "reflect" + "runtime" + "runtime/debug" + "sort" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types" + "golang.org/x/tools/go/types/typeutil" +) + +const ( + // optimization options; enable all when committing + optRenumber = true // enable renumbering optimization (makes logs hard to read) + optHVN = true // enable pointer equivalence via Hash-Value Numbering + + // debugging options; disable all when committing + debugHVN = false // enable assertions in HVN + debugHVNVerbose = false // enable extra HVN logging + debugHVNCrossCheck = false // run solver with/without HVN and compare (caveats below) + debugTimers = false // show running time of each phase +) + +// object.flags bitmask values. +const ( + otTagged = 1 << iota // type-tagged object + otIndirect // type-tagged object with indirect payload + otFunction // function object +) + +// An object represents a contiguous block of memory to which some +// (generalized) pointer may point. +// +// (Note: most variables called 'obj' are not *objects but nodeids +// such that a.nodes[obj].obj != nil.) +// +type object struct { + // flags is a bitset of the node type (ot*) flags defined above. + flags uint32 + + // Number of following nodes belonging to the same "object" + // allocation. Zero for all other nodes. + size uint32 + + // data describes this object; it has one of these types: + // + // ssa.Value for an object allocated by an SSA operation. + // types.Type for an rtype instance object or *rtype-tagged object. + // string for an instrinsic object, e.g. the array behind os.Args. + // nil for an object allocated by an instrinsic. + // (cgn provides the identity of the intrinsic.) + data interface{} + + // The call-graph node (=context) in which this object was allocated. + // May be nil for global objects: Global, Const, some Functions. + cgn *cgnode +} + +// nodeid denotes a node. +// It is an index within analysis.nodes. +// We use small integers, not *node pointers, for many reasons: +// - they are smaller on 64-bit systems. +// - sets of them can be represented compactly in bitvectors or BDDs. +// - order matters; a field offset can be computed by simple addition. +type nodeid uint32 + +// A node is an equivalence class of memory locations. +// Nodes may be pointers, pointed-to locations, neither, or both. +// +// Nodes that are pointed-to locations ("labels") have an enclosing +// object (see analysis.enclosingObject). +// +type node struct { + // If non-nil, this node is the start of an object + // (addressable memory location). + // The following obj.size nodes implicitly belong to the object; + // they locate their object by scanning back. + obj *object + + // The type of the field denoted by this node. Non-aggregate, + // unless this is an tagged.T node (i.e. the thing + // pointed to by an interface) in which case typ is that type. + typ types.Type + + // subelement indicates which directly embedded subelement of + // an object of aggregate type (struct, tuple, array) this is. + subelement *fieldInfo // e.g. ".a.b[*].c" + + // Solver state for the canonical node of this pointer- + // equivalence class. Each node is created with its own state + // but they become shared after HVN. + solve *solverState +} + +// An analysis instance holds the state of a single pointer analysis problem. +type analysis struct { + config *Config // the client's control/observer interface + prog *ssa.Program // the program being analyzed + log io.Writer // log stream; nil to disable + panicNode nodeid // sink for panic, source for recover + nodes []*node // indexed by nodeid + flattenMemo map[types.Type][]*fieldInfo // memoization of flatten() + trackTypes map[types.Type]bool // memoization of shouldTrack() + constraints []constraint // set of constraints + cgnodes []*cgnode // all cgnodes + genq []*cgnode // queue of functions to generate constraints for + intrinsics map[*ssa.Function]intrinsic // non-nil values are summaries for intrinsic fns + globalval map[ssa.Value]nodeid // node for each global ssa.Value + globalobj map[ssa.Value]nodeid // maps v to sole member of pts(v), if singleton + localval map[ssa.Value]nodeid // node for each local ssa.Value + localobj map[ssa.Value]nodeid // maps v to sole member of pts(v), if singleton + atFuncs map[*ssa.Function]bool // address-taken functions (for presolver) + mapValues []nodeid // values of makemap objects (indirect in HVN) + work nodeset // solver's worklist + result *Result // results of the analysis + track track // pointerlike types whose aliasing we track + deltaSpace []int // working space for iterating over PTS deltas + + // Reflection & intrinsics: + hasher typeutil.Hasher // cache of type hashes + reflectValueObj types.Object // type symbol for reflect.Value (if present) + reflectValueCall *ssa.Function // (reflect.Value).Call + reflectRtypeObj types.Object // *types.TypeName for reflect.rtype (if present) + reflectRtypePtr *types.Pointer // *reflect.rtype + reflectType *types.Named // reflect.Type + rtypes typeutil.Map // nodeid of canonical *rtype-tagged object for type T + reflectZeros typeutil.Map // nodeid of canonical T-tagged object for zero value + runtimeSetFinalizer *ssa.Function // runtime.SetFinalizer +} + +// enclosingObj returns the first node of the addressable memory +// object that encloses node id. Panic ensues if that node does not +// belong to any object. +func (a *analysis) enclosingObj(id nodeid) nodeid { + // Find previous node with obj != nil. + for i := id; i >= 0; i-- { + n := a.nodes[i] + if obj := n.obj; obj != nil { + if i+nodeid(obj.size) <= id { + break // out of bounds + } + return i + } + } + panic("node has no enclosing object") +} + +// labelFor returns the Label for node id. +// Panic ensues if that node is not addressable. +func (a *analysis) labelFor(id nodeid) *Label { + return &Label{ + obj: a.nodes[a.enclosingObj(id)].obj, + subelement: a.nodes[id].subelement, + } +} + +func (a *analysis) warnf(pos token.Pos, format string, args ...interface{}) { + msg := fmt.Sprintf(format, args...) + if a.log != nil { + fmt.Fprintf(a.log, "%s: warning: %s\n", a.prog.Fset.Position(pos), msg) + } + a.result.Warnings = append(a.result.Warnings, Warning{pos, msg}) +} + +// computeTrackBits sets a.track to the necessary 'track' bits for the pointer queries. +func (a *analysis) computeTrackBits() { + var queryTypes []types.Type + for v := range a.config.Queries { + queryTypes = append(queryTypes, v.Type()) + } + for v := range a.config.IndirectQueries { + queryTypes = append(queryTypes, mustDeref(v.Type())) + } + for _, t := range queryTypes { + switch t.Underlying().(type) { + case *types.Chan: + a.track |= trackChan + case *types.Map: + a.track |= trackMap + case *types.Pointer: + a.track |= trackPtr + case *types.Slice: + a.track |= trackSlice + case *types.Interface: + a.track = trackAll + return + } + if rVObj := a.reflectValueObj; rVObj != nil && types.Identical(t, rVObj.Type()) { + a.track = trackAll + return + } + } +} + +// Analyze runs the pointer analysis with the scope and options +// specified by config, and returns the (synthetic) root of the callgraph. +// +// Pointer analysis of a transitively closed well-typed program should +// always succeed. An error can occur only due to an internal bug. +// +func Analyze(config *Config) (result *Result, err error) { + if config.Mains == nil { + return nil, fmt.Errorf("no main/test packages to analyze (check $GOROOT/$GOPATH)") + } + defer func() { + if p := recover(); p != nil { + err = fmt.Errorf("internal error in pointer analysis: %v (please report this bug)", p) + fmt.Fprintln(os.Stderr, "Internal panic in pointer analysis:") + debug.PrintStack() + } + }() + + a := &analysis{ + config: config, + log: config.Log, + prog: config.prog(), + globalval: make(map[ssa.Value]nodeid), + globalobj: make(map[ssa.Value]nodeid), + flattenMemo: make(map[types.Type][]*fieldInfo), + trackTypes: make(map[types.Type]bool), + atFuncs: make(map[*ssa.Function]bool), + hasher: typeutil.MakeHasher(), + intrinsics: make(map[*ssa.Function]intrinsic), + result: &Result{ + Queries: make(map[ssa.Value]Pointer), + IndirectQueries: make(map[ssa.Value]Pointer), + }, + deltaSpace: make([]int, 0, 100), + } + + if false { + a.log = os.Stderr // for debugging crashes; extremely verbose + } + + if a.log != nil { + fmt.Fprintln(a.log, "==== Starting analysis") + } + + // Pointer analysis requires a complete program for soundness. + // Check to prevent accidental misconfiguration. + for _, pkg := range a.prog.AllPackages() { + // (This only checks that the package scope is complete, + // not that func bodies exist, but it's a good signal.) + if !pkg.Pkg.Complete() { + return nil, fmt.Errorf(`pointer analysis requires a complete program yet package %q was incomplete`, pkg.Pkg.Path()) + } + } + + if reflect := a.prog.ImportedPackage("reflect"); reflect != nil { + rV := reflect.Pkg.Scope().Lookup("Value") + a.reflectValueObj = rV + a.reflectValueCall = a.prog.LookupMethod(rV.Type(), nil, "Call") + a.reflectType = reflect.Pkg.Scope().Lookup("Type").Type().(*types.Named) + a.reflectRtypeObj = reflect.Pkg.Scope().Lookup("rtype") + a.reflectRtypePtr = types.NewPointer(a.reflectRtypeObj.Type()) + + // Override flattening of reflect.Value, treating it like a basic type. + tReflectValue := a.reflectValueObj.Type() + a.flattenMemo[tReflectValue] = []*fieldInfo{{typ: tReflectValue}} + + // Override shouldTrack of reflect.Value and *reflect.rtype. + // Always track pointers of these types. + a.trackTypes[tReflectValue] = true + a.trackTypes[a.reflectRtypePtr] = true + + a.rtypes.SetHasher(a.hasher) + a.reflectZeros.SetHasher(a.hasher) + } + if runtime := a.prog.ImportedPackage("runtime"); runtime != nil { + a.runtimeSetFinalizer = runtime.Func("SetFinalizer") + } + a.computeTrackBits() + + a.generate() + a.showCounts() + + if optRenumber { + a.renumber() + } + + N := len(a.nodes) // excludes solver-created nodes + + if optHVN { + if debugHVNCrossCheck { + // Cross-check: run the solver once without + // optimization, once with, and compare the + // solutions. + savedConstraints := a.constraints + + a.solve() + a.dumpSolution("A.pts", N) + + // Restore. + a.constraints = savedConstraints + for _, n := range a.nodes { + n.solve = new(solverState) + } + a.nodes = a.nodes[:N] + + // rtypes is effectively part of the solver state. + a.rtypes = typeutil.Map{} + a.rtypes.SetHasher(a.hasher) + } + + a.hvn() + } + + if debugHVNCrossCheck { + runtime.GC() + runtime.GC() + } + + a.solve() + + // Compare solutions. + if optHVN && debugHVNCrossCheck { + a.dumpSolution("B.pts", N) + + if !diff("A.pts", "B.pts") { + return nil, fmt.Errorf("internal error: optimization changed solution") + } + } + + // Create callgraph.Nodes in deterministic order. + if cg := a.result.CallGraph; cg != nil { + for _, caller := range a.cgnodes { + cg.CreateNode(caller.fn) + } + } + + // Add dynamic edges to call graph. + var space [100]int + for _, caller := range a.cgnodes { + for _, site := range caller.sites { + for _, callee := range a.nodes[site.targets].solve.pts.AppendTo(space[:0]) { + a.callEdge(caller, site, nodeid(callee)) + } + } + } + + return a.result, nil +} + +// callEdge is called for each edge in the callgraph. +// calleeid is the callee's object node (has otFunction flag). +// +func (a *analysis) callEdge(caller *cgnode, site *callsite, calleeid nodeid) { + obj := a.nodes[calleeid].obj + if obj.flags&otFunction == 0 { + panic(fmt.Sprintf("callEdge %s -> n%d: not a function object", site, calleeid)) + } + callee := obj.cgn + + if cg := a.result.CallGraph; cg != nil { + // TODO(adonovan): opt: I would expect duplicate edges + // (to wrappers) to arise due to the elimination of + // context information, but I haven't observed any. + // Understand this better. + callgraph.AddEdge(cg.CreateNode(caller.fn), site.instr, cg.CreateNode(callee.fn)) + } + + if a.log != nil { + fmt.Fprintf(a.log, "\tcall edge %s -> %s\n", site, callee) + } + + // Warn about calls to non-intrinsic external functions. + // TODO(adonovan): de-dup these messages. + if fn := callee.fn; fn.Blocks == nil && a.findIntrinsic(fn) == nil { + a.warnf(site.pos(), "unsound call to unknown intrinsic: %s", fn) + a.warnf(fn.Pos(), " (declared here)") + } +} + +// dumpSolution writes the PTS solution to the specified file. +// +// It only dumps the nodes that existed before solving. The order in +// which solver-created nodes are created depends on pre-solver +// optimization, so we can't include them in the cross-check. +// +func (a *analysis) dumpSolution(filename string, N int) { + f, err := os.Create(filename) + if err != nil { + panic(err) + } + for id, n := range a.nodes[:N] { + if _, err := fmt.Fprintf(f, "pts(n%d) = {", id); err != nil { + panic(err) + } + var sep string + for _, l := range n.solve.pts.AppendTo(a.deltaSpace) { + if l >= N { + break + } + fmt.Fprintf(f, "%s%d", sep, l) + sep = " " + } + fmt.Fprintf(f, "} : %s\n", n.typ) + } + if err := f.Close(); err != nil { + panic(err) + } +} + +// showCounts logs the size of the constraint system. A typical +// optimized distribution is 65% copy, 13% load, 11% addr, 5% +// offsetAddr, 4% store, 2% others. +// +func (a *analysis) showCounts() { + if a.log != nil { + counts := make(map[reflect.Type]int) + for _, c := range a.constraints { + counts[reflect.TypeOf(c)]++ + } + fmt.Fprintf(a.log, "# constraints:\t%d\n", len(a.constraints)) + var lines []string + for t, n := range counts { + line := fmt.Sprintf("%7d (%2d%%)\t%s", n, 100*n/len(a.constraints), t) + lines = append(lines, line) + } + sort.Sort(sort.Reverse(sort.StringSlice(lines))) + for _, line := range lines { + fmt.Fprintf(a.log, "\t%s\n", line) + } + + fmt.Fprintf(a.log, "# nodes:\t%d\n", len(a.nodes)) + + // Show number of pointer equivalence classes. + m := make(map[*solverState]bool) + for _, n := range a.nodes { + m[n.solve] = true + } + fmt.Fprintf(a.log, "# ptsets:\t%d\n", len(m)) + } +} diff --git a/vendor/golang.org/x/tools/go/pointer/api.go b/vendor/golang.org/x/tools/go/pointer/api.go new file mode 100644 index 0000000000..077ef56924 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/api.go @@ -0,0 +1,247 @@ +// Copyright 2013 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.5 + +package pointer + +import ( + "bytes" + "fmt" + "go/token" + "io" + + "golang.org/x/tools/container/intsets" + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types/typeutil" +) + +// A Config formulates a pointer analysis problem for Analyze(). +type Config struct { + // Mains contains the set of 'main' packages to analyze + // Clients must provide the analysis with at least one + // package defining a main() function. + // + // Non-main packages in the ssa.Program that are not + // dependencies of any main package may still affect the + // analysis result, because they contribute runtime types and + // thus methods. + // TODO(adonovan): investigate whether this is desirable. + Mains []*ssa.Package + + // Reflection determines whether to handle reflection + // operators soundly, which is currently rather slow since it + // causes constraint to be generated during solving + // proportional to the number of constraint variables, which + // has not yet been reduced by presolver optimisation. + Reflection bool + + // BuildCallGraph determines whether to construct a callgraph. + // If enabled, the graph will be available in Result.CallGraph. + BuildCallGraph bool + + // The client populates Queries[v] or IndirectQueries[v] + // for each ssa.Value v of interest, to request that the + // points-to sets pts(v) or pts(*v) be computed. If the + // client needs both points-to sets, v may appear in both + // maps. + // + // (IndirectQueries is typically used for Values corresponding + // to source-level lvalues, e.g. an *ssa.Global.) + // + // The analysis populates the corresponding + // Result.{Indirect,}Queries map when it creates the pointer + // variable for v or *v. Upon completion the client can + // inspect that map for the results. + // + // TODO(adonovan): this API doesn't scale well for batch tools + // that want to dump the entire solution. Perhaps optionally + // populate a map[*ssa.DebugRef]Pointer in the Result, one + // entry per source expression. + // + Queries map[ssa.Value]struct{} + IndirectQueries map[ssa.Value]struct{} + + // If Log is non-nil, log messages are written to it. + // Logging is extremely verbose. + Log io.Writer +} + +type track uint32 + +const ( + trackChan track = 1 << iota // track 'chan' references + trackMap // track 'map' references + trackPtr // track regular pointers + trackSlice // track slice references + + trackAll = ^track(0) +) + +// AddQuery adds v to Config.Queries. +// Precondition: CanPoint(v.Type()). +// TODO(adonovan): consider returning a new Pointer for this query, +// which will be initialized during analysis. That avoids the needs +// for the corresponding ssa.Value-keyed maps in Config and Result. +func (c *Config) AddQuery(v ssa.Value) { + if !CanPoint(v.Type()) { + panic(fmt.Sprintf("%s is not a pointer-like value: %s", v, v.Type())) + } + if c.Queries == nil { + c.Queries = make(map[ssa.Value]struct{}) + } + c.Queries[v] = struct{}{} +} + +// AddQuery adds v to Config.IndirectQueries. +// Precondition: CanPoint(v.Type().Underlying().(*types.Pointer).Elem()). +func (c *Config) AddIndirectQuery(v ssa.Value) { + if c.IndirectQueries == nil { + c.IndirectQueries = make(map[ssa.Value]struct{}) + } + if !CanPoint(mustDeref(v.Type())) { + panic(fmt.Sprintf("%s is not the address of a pointer-like value: %s", v, v.Type())) + } + c.IndirectQueries[v] = struct{}{} +} + +func (c *Config) prog() *ssa.Program { + for _, main := range c.Mains { + return main.Prog + } + panic("empty scope") +} + +type Warning struct { + Pos token.Pos + Message string +} + +// A Result contains the results of a pointer analysis. +// +// See Config for how to request the various Result components. +// +type Result struct { + CallGraph *callgraph.Graph // discovered call graph + Queries map[ssa.Value]Pointer // pts(v) for each v in Config.Queries. + IndirectQueries map[ssa.Value]Pointer // pts(*v) for each v in Config.IndirectQueries. + Warnings []Warning // warnings of unsoundness +} + +// A Pointer is an equivalence class of pointer-like values. +// +// A Pointer doesn't have a unique type because pointers of distinct +// types may alias the same object. +// +type Pointer struct { + a *analysis + n nodeid +} + +// A PointsToSet is a set of labels (locations or allocations). +type PointsToSet struct { + a *analysis // may be nil if pts is nil + pts *nodeset +} + +func (s PointsToSet) String() string { + var buf bytes.Buffer + buf.WriteByte('[') + if s.pts != nil { + var space [50]int + for i, l := range s.pts.AppendTo(space[:0]) { + if i > 0 { + buf.WriteString(", ") + } + buf.WriteString(s.a.labelFor(nodeid(l)).String()) + } + } + buf.WriteByte(']') + return buf.String() +} + +// PointsTo returns the set of labels that this points-to set +// contains. +func (s PointsToSet) Labels() []*Label { + var labels []*Label + if s.pts != nil { + var space [50]int + for _, l := range s.pts.AppendTo(space[:0]) { + labels = append(labels, s.a.labelFor(nodeid(l))) + } + } + return labels +} + +// If this PointsToSet came from a Pointer of interface kind +// or a reflect.Value, DynamicTypes returns the set of dynamic +// types that it may contain. (For an interface, they will +// always be concrete types.) +// +// The result is a mapping whose keys are the dynamic types to which +// it may point. For each pointer-like key type, the corresponding +// map value is the PointsToSet for pointers of that type. +// +// The result is empty unless CanHaveDynamicTypes(T). +// +func (s PointsToSet) DynamicTypes() *typeutil.Map { + var tmap typeutil.Map + tmap.SetHasher(s.a.hasher) + if s.pts != nil { + var space [50]int + for _, x := range s.pts.AppendTo(space[:0]) { + ifaceObjId := nodeid(x) + if !s.a.isTaggedObject(ifaceObjId) { + continue // !CanHaveDynamicTypes(tDyn) + } + tDyn, v, indirect := s.a.taggedValue(ifaceObjId) + if indirect { + panic("indirect tagged object") // implement later + } + pts, ok := tmap.At(tDyn).(PointsToSet) + if !ok { + pts = PointsToSet{s.a, new(nodeset)} + tmap.Set(tDyn, pts) + } + pts.pts.addAll(&s.a.nodes[v].solve.pts) + } + } + return &tmap +} + +// Intersects reports whether this points-to set and the +// argument points-to set contain common members. +func (x PointsToSet) Intersects(y PointsToSet) bool { + if x.pts == nil || y.pts == nil { + return false + } + // This takes Θ(|x|+|y|) time. + var z intsets.Sparse + z.Intersection(&x.pts.Sparse, &y.pts.Sparse) + return !z.IsEmpty() +} + +func (p Pointer) String() string { + return fmt.Sprintf("n%d", p.n) +} + +// PointsTo returns the points-to set of this pointer. +func (p Pointer) PointsTo() PointsToSet { + if p.n == 0 { + return PointsToSet{} + } + return PointsToSet{p.a, &p.a.nodes[p.n].solve.pts} +} + +// MayAlias reports whether the receiver pointer may alias +// the argument pointer. +func (p Pointer) MayAlias(q Pointer) bool { + return p.PointsTo().Intersects(q.PointsTo()) +} + +// DynamicTypes returns p.PointsTo().DynamicTypes(). +func (p Pointer) DynamicTypes() *typeutil.Map { + return p.PointsTo().DynamicTypes() +} diff --git a/vendor/golang.org/x/tools/go/pointer/api14.go b/vendor/golang.org/x/tools/go/pointer/api14.go new file mode 100644 index 0000000000..548173282d --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/api14.go @@ -0,0 +1,247 @@ +// Copyright 2013 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.5 + +package pointer + +import ( + "bytes" + "fmt" + "go/token" + "io" + + "golang.org/x/tools/container/intsets" + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types/typeutil" +) + +// A Config formulates a pointer analysis problem for Analyze(). +type Config struct { + // Mains contains the set of 'main' packages to analyze + // Clients must provide the analysis with at least one + // package defining a main() function. + // + // Non-main packages in the ssa.Program that are not + // dependencies of any main package may still affect the + // analysis result, because they contribute runtime types and + // thus methods. + // TODO(adonovan): investigate whether this is desirable. + Mains []*ssa.Package + + // Reflection determines whether to handle reflection + // operators soundly, which is currently rather slow since it + // causes constraint to be generated during solving + // proportional to the number of constraint variables, which + // has not yet been reduced by presolver optimisation. + Reflection bool + + // BuildCallGraph determines whether to construct a callgraph. + // If enabled, the graph will be available in Result.CallGraph. + BuildCallGraph bool + + // The client populates Queries[v] or IndirectQueries[v] + // for each ssa.Value v of interest, to request that the + // points-to sets pts(v) or pts(*v) be computed. If the + // client needs both points-to sets, v may appear in both + // maps. + // + // (IndirectQueries is typically used for Values corresponding + // to source-level lvalues, e.g. an *ssa.Global.) + // + // The analysis populates the corresponding + // Result.{Indirect,}Queries map when it creates the pointer + // variable for v or *v. Upon completion the client can + // inspect that map for the results. + // + // TODO(adonovan): this API doesn't scale well for batch tools + // that want to dump the entire solution. Perhaps optionally + // populate a map[*ssa.DebugRef]Pointer in the Result, one + // entry per source expression. + // + Queries map[ssa.Value]struct{} + IndirectQueries map[ssa.Value]struct{} + + // If Log is non-nil, log messages are written to it. + // Logging is extremely verbose. + Log io.Writer +} + +type track uint32 + +const ( + trackChan track = 1 << iota // track 'chan' references + trackMap // track 'map' references + trackPtr // track regular pointers + trackSlice // track slice references + + trackAll = ^track(0) +) + +// AddQuery adds v to Config.Queries. +// Precondition: CanPoint(v.Type()). +// TODO(adonovan): consider returning a new Pointer for this query, +// which will be initialized during analysis. That avoids the needs +// for the corresponding ssa.Value-keyed maps in Config and Result. +func (c *Config) AddQuery(v ssa.Value) { + if !CanPoint(v.Type()) { + panic(fmt.Sprintf("%s is not a pointer-like value: %s", v, v.Type())) + } + if c.Queries == nil { + c.Queries = make(map[ssa.Value]struct{}) + } + c.Queries[v] = struct{}{} +} + +// AddQuery adds v to Config.IndirectQueries. +// Precondition: CanPoint(v.Type().Underlying().(*types.Pointer).Elem()). +func (c *Config) AddIndirectQuery(v ssa.Value) { + if c.IndirectQueries == nil { + c.IndirectQueries = make(map[ssa.Value]struct{}) + } + if !CanPoint(mustDeref(v.Type())) { + panic(fmt.Sprintf("%s is not the address of a pointer-like value: %s", v, v.Type())) + } + c.IndirectQueries[v] = struct{}{} +} + +func (c *Config) prog() *ssa.Program { + for _, main := range c.Mains { + return main.Prog + } + panic("empty scope") +} + +type Warning struct { + Pos token.Pos + Message string +} + +// A Result contains the results of a pointer analysis. +// +// See Config for how to request the various Result components. +// +type Result struct { + CallGraph *callgraph.Graph // discovered call graph + Queries map[ssa.Value]Pointer // pts(v) for each v in Config.Queries. + IndirectQueries map[ssa.Value]Pointer // pts(*v) for each v in Config.IndirectQueries. + Warnings []Warning // warnings of unsoundness +} + +// A Pointer is an equivalence class of pointer-like values. +// +// A Pointer doesn't have a unique type because pointers of distinct +// types may alias the same object. +// +type Pointer struct { + a *analysis + n nodeid +} + +// A PointsToSet is a set of labels (locations or allocations). +type PointsToSet struct { + a *analysis // may be nil if pts is nil + pts *nodeset +} + +func (s PointsToSet) String() string { + var buf bytes.Buffer + buf.WriteByte('[') + if s.pts != nil { + var space [50]int + for i, l := range s.pts.AppendTo(space[:0]) { + if i > 0 { + buf.WriteString(", ") + } + buf.WriteString(s.a.labelFor(nodeid(l)).String()) + } + } + buf.WriteByte(']') + return buf.String() +} + +// PointsTo returns the set of labels that this points-to set +// contains. +func (s PointsToSet) Labels() []*Label { + var labels []*Label + if s.pts != nil { + var space [50]int + for _, l := range s.pts.AppendTo(space[:0]) { + labels = append(labels, s.a.labelFor(nodeid(l))) + } + } + return labels +} + +// If this PointsToSet came from a Pointer of interface kind +// or a reflect.Value, DynamicTypes returns the set of dynamic +// types that it may contain. (For an interface, they will +// always be concrete types.) +// +// The result is a mapping whose keys are the dynamic types to which +// it may point. For each pointer-like key type, the corresponding +// map value is the PointsToSet for pointers of that type. +// +// The result is empty unless CanHaveDynamicTypes(T). +// +func (s PointsToSet) DynamicTypes() *typeutil.Map { + var tmap typeutil.Map + tmap.SetHasher(s.a.hasher) + if s.pts != nil { + var space [50]int + for _, x := range s.pts.AppendTo(space[:0]) { + ifaceObjId := nodeid(x) + if !s.a.isTaggedObject(ifaceObjId) { + continue // !CanHaveDynamicTypes(tDyn) + } + tDyn, v, indirect := s.a.taggedValue(ifaceObjId) + if indirect { + panic("indirect tagged object") // implement later + } + pts, ok := tmap.At(tDyn).(PointsToSet) + if !ok { + pts = PointsToSet{s.a, new(nodeset)} + tmap.Set(tDyn, pts) + } + pts.pts.addAll(&s.a.nodes[v].solve.pts) + } + } + return &tmap +} + +// Intersects reports whether this points-to set and the +// argument points-to set contain common members. +func (x PointsToSet) Intersects(y PointsToSet) bool { + if x.pts == nil || y.pts == nil { + return false + } + // This takes Θ(|x|+|y|) time. + var z intsets.Sparse + z.Intersection(&x.pts.Sparse, &y.pts.Sparse) + return !z.IsEmpty() +} + +func (p Pointer) String() string { + return fmt.Sprintf("n%d", p.n) +} + +// PointsTo returns the points-to set of this pointer. +func (p Pointer) PointsTo() PointsToSet { + if p.n == 0 { + return PointsToSet{} + } + return PointsToSet{p.a, &p.a.nodes[p.n].solve.pts} +} + +// MayAlias reports whether the receiver pointer may alias +// the argument pointer. +func (p Pointer) MayAlias(q Pointer) bool { + return p.PointsTo().Intersects(q.PointsTo()) +} + +// DynamicTypes returns p.PointsTo().DynamicTypes(). +func (p Pointer) DynamicTypes() *typeutil.Map { + return p.PointsTo().DynamicTypes() +} diff --git a/vendor/golang.org/x/tools/go/pointer/callgraph.go b/vendor/golang.org/x/tools/go/pointer/callgraph.go new file mode 100644 index 0000000000..48e152e4af --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/callgraph.go @@ -0,0 +1,61 @@ +// Copyright 2013 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 pointer + +// This file defines the internal (context-sensitive) call graph. + +import ( + "fmt" + "go/token" + + "golang.org/x/tools/go/ssa" +) + +type cgnode struct { + fn *ssa.Function + obj nodeid // start of this contour's object block + sites []*callsite // ordered list of callsites within this function + callersite *callsite // where called from, if known; nil for shared contours +} + +// contour returns a description of this node's contour. +func (n *cgnode) contour() string { + if n.callersite == nil { + return "shared contour" + } + if n.callersite.instr != nil { + return fmt.Sprintf("as called from %s", n.callersite.instr.Parent()) + } + return fmt.Sprintf("as called from intrinsic (targets=n%d)", n.callersite.targets) +} + +func (n *cgnode) String() string { + return fmt.Sprintf("cg%d:%s", n.obj, n.fn) +} + +// A callsite represents a single call site within a cgnode; +// it is implicitly context-sensitive. +// callsites never represent calls to built-ins; +// they are handled as intrinsics. +// +type callsite struct { + targets nodeid // pts(·) contains objects for dynamically called functions + instr ssa.CallInstruction // the call instruction; nil for synthetic/intrinsic +} + +func (c *callsite) String() string { + if c.instr != nil { + return c.instr.Common().Description() + } + return "synthetic function call" +} + +// pos returns the source position of this callsite, or token.NoPos if implicit. +func (c *callsite) pos() token.Pos { + if c.instr != nil { + return c.instr.Pos() + } + return token.NoPos +} diff --git a/vendor/golang.org/x/tools/go/pointer/constraint.go b/vendor/golang.org/x/tools/go/pointer/constraint.go new file mode 100644 index 0000000000..ea442873c2 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/constraint.go @@ -0,0 +1,151 @@ +// Copyright 2013 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.5 + +package pointer + +import "go/types" + +type constraint interface { + // For a complex constraint, returns the nodeid of the pointer + // to which it is attached. For addr and copy, returns dst. + ptr() nodeid + + // renumber replaces each nodeid n in the constraint by mapping[n]. + renumber(mapping []nodeid) + + // presolve is a hook for constraint-specific behaviour during + // pre-solver optimization. Typical implementations mark as + // indirect the set of nodes to which the solver will add copy + // edges or PTS labels. + presolve(h *hvn) + + // solve is called for complex constraints when the pts for + // the node to which they are attached has changed. + solve(a *analysis, delta *nodeset) + + String() string +} + +// dst = &src +// pts(dst) ⊇ {src} +// A base constraint used to initialize the solver's pt sets +type addrConstraint struct { + dst nodeid // (ptr) + src nodeid +} + +func (c *addrConstraint) ptr() nodeid { return c.dst } +func (c *addrConstraint) renumber(mapping []nodeid) { + c.dst = mapping[c.dst] + c.src = mapping[c.src] +} + +// dst = src +// A simple constraint represented directly as a copyTo graph edge. +type copyConstraint struct { + dst nodeid // (ptr) + src nodeid +} + +func (c *copyConstraint) ptr() nodeid { return c.dst } +func (c *copyConstraint) renumber(mapping []nodeid) { + c.dst = mapping[c.dst] + c.src = mapping[c.src] +} + +// dst = src[offset] +// A complex constraint attached to src (the pointer) +type loadConstraint struct { + offset uint32 + dst nodeid + src nodeid // (ptr) +} + +func (c *loadConstraint) ptr() nodeid { return c.src } +func (c *loadConstraint) renumber(mapping []nodeid) { + c.dst = mapping[c.dst] + c.src = mapping[c.src] +} + +// dst[offset] = src +// A complex constraint attached to dst (the pointer) +type storeConstraint struct { + offset uint32 + dst nodeid // (ptr) + src nodeid +} + +func (c *storeConstraint) ptr() nodeid { return c.dst } +func (c *storeConstraint) renumber(mapping []nodeid) { + c.dst = mapping[c.dst] + c.src = mapping[c.src] +} + +// dst = &src.f or dst = &src[0] +// A complex constraint attached to dst (the pointer) +type offsetAddrConstraint struct { + offset uint32 + dst nodeid + src nodeid // (ptr) +} + +func (c *offsetAddrConstraint) ptr() nodeid { return c.src } +func (c *offsetAddrConstraint) renumber(mapping []nodeid) { + c.dst = mapping[c.dst] + c.src = mapping[c.src] +} + +// dst = src.(typ) where typ is an interface +// A complex constraint attached to src (the interface). +// No representation change: pts(dst) and pts(src) contains tagged objects. +type typeFilterConstraint struct { + typ types.Type // an interface type + dst nodeid + src nodeid // (ptr) +} + +func (c *typeFilterConstraint) ptr() nodeid { return c.src } +func (c *typeFilterConstraint) renumber(mapping []nodeid) { + c.dst = mapping[c.dst] + c.src = mapping[c.src] +} + +// dst = src.(typ) where typ is a concrete type +// A complex constraint attached to src (the interface). +// +// If exact, only tagged objects identical to typ are untagged. +// If !exact, tagged objects assignable to typ are untagged too. +// The latter is needed for various reflect operators, e.g. Send. +// +// This entails a representation change: +// pts(src) contains tagged objects, +// pts(dst) contains their payloads. +type untagConstraint struct { + typ types.Type // a concrete type + dst nodeid + src nodeid // (ptr) + exact bool +} + +func (c *untagConstraint) ptr() nodeid { return c.src } +func (c *untagConstraint) renumber(mapping []nodeid) { + c.dst = mapping[c.dst] + c.src = mapping[c.src] +} + +// src.method(params...) +// A complex constraint attached to iface. +type invokeConstraint struct { + method *types.Func // the abstract method + iface nodeid // (ptr) the interface + params nodeid // the start of the identity/params/results block +} + +func (c *invokeConstraint) ptr() nodeid { return c.iface } +func (c *invokeConstraint) renumber(mapping []nodeid) { + c.iface = mapping[c.iface] + c.params = mapping[c.params] +} diff --git a/vendor/golang.org/x/tools/go/pointer/constraint14.go b/vendor/golang.org/x/tools/go/pointer/constraint14.go new file mode 100644 index 0000000000..d18064ccbe --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/constraint14.go @@ -0,0 +1,153 @@ +// Copyright 2013 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.5 + +package pointer + +import ( + "golang.org/x/tools/go/types" +) + +type constraint interface { + // For a complex constraint, returns the nodeid of the pointer + // to which it is attached. For addr and copy, returns dst. + ptr() nodeid + + // renumber replaces each nodeid n in the constraint by mapping[n]. + renumber(mapping []nodeid) + + // presolve is a hook for constraint-specific behaviour during + // pre-solver optimization. Typical implementations mark as + // indirect the set of nodes to which the solver will add copy + // edges or PTS labels. + presolve(h *hvn) + + // solve is called for complex constraints when the pts for + // the node to which they are attached has changed. + solve(a *analysis, delta *nodeset) + + String() string +} + +// dst = &src +// pts(dst) ⊇ {src} +// A base constraint used to initialize the solver's pt sets +type addrConstraint struct { + dst nodeid // (ptr) + src nodeid +} + +func (c *addrConstraint) ptr() nodeid { return c.dst } +func (c *addrConstraint) renumber(mapping []nodeid) { + c.dst = mapping[c.dst] + c.src = mapping[c.src] +} + +// dst = src +// A simple constraint represented directly as a copyTo graph edge. +type copyConstraint struct { + dst nodeid // (ptr) + src nodeid +} + +func (c *copyConstraint) ptr() nodeid { return c.dst } +func (c *copyConstraint) renumber(mapping []nodeid) { + c.dst = mapping[c.dst] + c.src = mapping[c.src] +} + +// dst = src[offset] +// A complex constraint attached to src (the pointer) +type loadConstraint struct { + offset uint32 + dst nodeid + src nodeid // (ptr) +} + +func (c *loadConstraint) ptr() nodeid { return c.src } +func (c *loadConstraint) renumber(mapping []nodeid) { + c.dst = mapping[c.dst] + c.src = mapping[c.src] +} + +// dst[offset] = src +// A complex constraint attached to dst (the pointer) +type storeConstraint struct { + offset uint32 + dst nodeid // (ptr) + src nodeid +} + +func (c *storeConstraint) ptr() nodeid { return c.dst } +func (c *storeConstraint) renumber(mapping []nodeid) { + c.dst = mapping[c.dst] + c.src = mapping[c.src] +} + +// dst = &src.f or dst = &src[0] +// A complex constraint attached to dst (the pointer) +type offsetAddrConstraint struct { + offset uint32 + dst nodeid + src nodeid // (ptr) +} + +func (c *offsetAddrConstraint) ptr() nodeid { return c.src } +func (c *offsetAddrConstraint) renumber(mapping []nodeid) { + c.dst = mapping[c.dst] + c.src = mapping[c.src] +} + +// dst = src.(typ) where typ is an interface +// A complex constraint attached to src (the interface). +// No representation change: pts(dst) and pts(src) contains tagged objects. +type typeFilterConstraint struct { + typ types.Type // an interface type + dst nodeid + src nodeid // (ptr) +} + +func (c *typeFilterConstraint) ptr() nodeid { return c.src } +func (c *typeFilterConstraint) renumber(mapping []nodeid) { + c.dst = mapping[c.dst] + c.src = mapping[c.src] +} + +// dst = src.(typ) where typ is a concrete type +// A complex constraint attached to src (the interface). +// +// If exact, only tagged objects identical to typ are untagged. +// If !exact, tagged objects assignable to typ are untagged too. +// The latter is needed for various reflect operators, e.g. Send. +// +// This entails a representation change: +// pts(src) contains tagged objects, +// pts(dst) contains their payloads. +type untagConstraint struct { + typ types.Type // a concrete type + dst nodeid + src nodeid // (ptr) + exact bool +} + +func (c *untagConstraint) ptr() nodeid { return c.src } +func (c *untagConstraint) renumber(mapping []nodeid) { + c.dst = mapping[c.dst] + c.src = mapping[c.src] +} + +// src.method(params...) +// A complex constraint attached to iface. +type invokeConstraint struct { + method *types.Func // the abstract method + iface nodeid // (ptr) the interface + params nodeid // the start of the identity/params/results block +} + +func (c *invokeConstraint) ptr() nodeid { return c.iface } +func (c *invokeConstraint) renumber(mapping []nodeid) { + c.iface = mapping[c.iface] + c.params = mapping[c.params] +} diff --git a/vendor/golang.org/x/tools/go/pointer/doc.go b/vendor/golang.org/x/tools/go/pointer/doc.go new file mode 100644 index 0000000000..17d98cb125 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/doc.go @@ -0,0 +1,612 @@ +// Copyright 2013 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.5 + +/* + +Package pointer implements Andersen's analysis, an inclusion-based +pointer analysis algorithm first described in (Andersen, 1994). + +A pointer analysis relates every pointer expression in a whole program +to the set of memory locations to which it might point. This +information can be used to construct a call graph of the program that +precisely represents the destinations of dynamic function and method +calls. It can also be used to determine, for example, which pairs of +channel operations operate on the same channel. + +The package allows the client to request a set of expressions of +interest for which the points-to information will be returned once the +analysis is complete. In addition, the client may request that a +callgraph is constructed. The example program in example_test.go +demonstrates both of these features. Clients should not request more +information than they need since it may increase the cost of the +analysis significantly. + + +CLASSIFICATION + +Our algorithm is INCLUSION-BASED: the points-to sets for x and y will +be related by pts(y) ⊇ pts(x) if the program contains the statement +y = x. + +It is FLOW-INSENSITIVE: it ignores all control flow constructs and the +order of statements in a program. It is therefore a "MAY ALIAS" +analysis: its facts are of the form "P may/may not point to L", +not "P must point to L". + +It is FIELD-SENSITIVE: it builds separate points-to sets for distinct +fields, such as x and y in struct { x, y *int }. + +It is mostly CONTEXT-INSENSITIVE: most functions are analyzed once, +so values can flow in at one call to the function and return out at +another. Only some smaller functions are analyzed with consideration +of their calling context. + +It has a CONTEXT-SENSITIVE HEAP: objects are named by both allocation +site and context, so the objects returned by two distinct calls to f: + func f() *T { return new(T) } +are distinguished up to the limits of the calling context. + +It is a WHOLE PROGRAM analysis: it requires SSA-form IR for the +complete Go program and summaries for native code. + +See the (Hind, PASTE'01) survey paper for an explanation of these terms. + + +SOUNDNESS + +The analysis is fully sound when invoked on pure Go programs that do not +use reflection or unsafe.Pointer conversions. In other words, if there +is any possible execution of the program in which pointer P may point to +object O, the analysis will report that fact. + + +REFLECTION + +By default, the "reflect" library is ignored by the analysis, as if all +its functions were no-ops, but if the client enables the Reflection flag, +the analysis will make a reasonable attempt to model the effects of +calls into this library. However, this comes at a significant +performance cost, and not all features of that library are yet +implemented. In addition, some simplifying approximations must be made +to ensure that the analysis terminates; for example, reflection can be +used to construct an infinite set of types and values of those types, +but the analysis arbitrarily bounds the depth of such types. + +Most but not all reflection operations are supported. +In particular, addressable reflect.Values are not yet implemented, so +operations such as (reflect.Value).Set have no analytic effect. + + +UNSAFE POINTER CONVERSIONS + +The pointer analysis makes no attempt to understand aliasing between the +operand x and result y of an unsafe.Pointer conversion: + y = (*T)(unsafe.Pointer(x)) +It is as if the conversion allocated an entirely new object: + y = new(T) + + +NATIVE CODE + +The analysis cannot model the aliasing effects of functions written in +languages other than Go, such as runtime intrinsics in C or assembly, or +code accessed via cgo. The result is as if such functions are no-ops. +However, various important intrinsics are understood by the analysis, +along with built-ins such as append. + +The analysis currently provides no way for users to specify the aliasing +effects of native code. + +------------------------------------------------------------------------ + +IMPLEMENTATION + +The remaining documentation is intended for package maintainers and +pointer analysis specialists. Maintainers should have a solid +understanding of the referenced papers (especially those by H&L and PKH) +before making making significant changes. + +The implementation is similar to that described in (Pearce et al, +PASTE'04). Unlike many algorithms which interleave constraint +generation and solving, constructing the callgraph as they go, this +implementation for the most part observes a phase ordering (generation +before solving), with only simple (copy) constraints being generated +during solving. (The exception is reflection, which creates various +constraints during solving as new types flow to reflect.Value +operations.) This improves the traction of presolver optimisations, +but imposes certain restrictions, e.g. potential context sensitivity +is limited since all variants must be created a priori. + + +TERMINOLOGY + +A type is said to be "pointer-like" if it is a reference to an object. +Pointer-like types include pointers and also interfaces, maps, channels, +functions and slices. + +We occasionally use C's x->f notation to distinguish the case where x +is a struct pointer from x.f where is a struct value. + +Pointer analysis literature (and our comments) often uses the notation +dst=*src+offset to mean something different than what it means in Go. +It means: for each node index p in pts(src), the node index p+offset is +in pts(dst). Similarly *dst+offset=src is used for store constraints +and dst=src+offset for offset-address constraints. + + +NODES + +Nodes are the key datastructure of the analysis, and have a dual role: +they represent both constraint variables (equivalence classes of +pointers) and members of points-to sets (things that can be pointed +at, i.e. "labels"). + +Nodes are naturally numbered. The numbering enables compact +representations of sets of nodes such as bitvectors (or BDDs); and the +ordering enables a very cheap way to group related nodes together. For +example, passing n parameters consists of generating n parallel +constraints from caller+i to callee+i for 0<=i y is added. + + ChangeInterface is a simple copy because the representation of + tagged objects is independent of the interface type (in contrast + to the "method tables" approach used by the gc runtime). + + y := Invoke x.m(...) is implemented by allocating contiguous P/R + blocks for the callsite and adding a dynamic rule triggered by each + tagged object added to pts(x). The rule adds param/results copy + edges to/from each discovered concrete method. + + (Q. Why do we model an interface as a pointer to a pair of type and + value, rather than as a pair of a pointer to type and a pointer to + value? + A. Control-flow joins would merge interfaces ({T1}, {V1}) and ({T2}, + {V2}) to make ({T1,T2}, {V1,V2}), leading to the infeasible and + type-unsafe combination (T1,V2). Treating the value and its concrete + type as inseparable makes the analysis type-safe.) + +reflect.Value + A reflect.Value is modelled very similar to an interface{}, i.e. as + a pointer exclusively to tagged objects, but with two generalizations. + + 1) a reflect.Value that represents an lvalue points to an indirect + (obj.flags ⊇ {otIndirect}) tagged object, which has a similar + layout to an tagged object except that the value is a pointer to + the dynamic type. Indirect tagged objects preserve the correct + aliasing so that mutations made by (reflect.Value).Set can be + observed. + + Indirect objects only arise when an lvalue is derived from an + rvalue by indirection, e.g. the following code: + + type S struct { X T } + var s S + var i interface{} = &s // i points to a *S-tagged object (from MakeInterface) + v1 := reflect.ValueOf(i) // v1 points to same *S-tagged object as i + v2 := v1.Elem() // v2 points to an indirect S-tagged object, pointing to s + v3 := v2.FieldByName("X") // v3 points to an indirect int-tagged object, pointing to s.X + v3.Set(y) // pts(s.X) ⊇ pts(y) + + Whether indirect or not, the concrete type of the tagged object + corresponds to the user-visible dynamic type, and the existence + of a pointer is an implementation detail. + + (NB: indirect tagged objects are not yet implemented) + + 2) The dynamic type tag of a tagged object pointed to by a + reflect.Value may be an interface type; it need not be concrete. + + This arises in code such as this: + tEface := reflect.TypeOf(new(interface{}).Elem() // interface{} + eface := reflect.Zero(tEface) + pts(eface) is a singleton containing an interface{}-tagged + object. That tagged object's payload is an interface{} value, + i.e. the pts of the payload contains only concrete-tagged + objects, although in this example it's the zero interface{} value, + so its pts is empty. + +reflect.Type + Just as in the real "reflect" library, we represent a reflect.Type + as an interface whose sole implementation is the concrete type, + *reflect.rtype. (This choice is forced on us by go/types: clients + cannot fabricate types with arbitrary method sets.) + + rtype instances are canonical: there is at most one per dynamic + type. (rtypes are in fact large structs but since identity is all + that matters, we represent them by a single node.) + + The payload of each *rtype-tagged object is an *rtype pointer that + points to exactly one such canonical rtype object. We exploit this + by setting the node.typ of the payload to the dynamic type, not + '*rtype'. This saves us an indirection in each resolution rule. As + an optimisation, *rtype-tagged objects are canonicalized too. + + +Aggregate types: + +Aggregate types are treated as if all directly contained +aggregates are recursively flattened out. + +Structs + *ssa.Field y = x.f creates a simple edge to y from x's node at f's offset. + + *ssa.FieldAddr y = &x->f requires a dynamic closure rule to create + simple edges for each struct discovered in pts(x). + + The nodes of a struct consist of a special 'identity' node (whose + type is that of the struct itself), followed by the nodes for all + the struct's fields, recursively flattened out. A pointer to the + struct is a pointer to its identity node. That node allows us to + distinguish a pointer to a struct from a pointer to its first field. + + Field offsets are logical field offsets (plus one for the identity + node), so the sizes of the fields can be ignored by the analysis. + + (The identity node is non-traditional but enables the distiction + described above, which is valuable for code comprehension tools. + Typical pointer analyses for C, whose purpose is compiler + optimization, must soundly model unsafe.Pointer (void*) conversions, + and this requires fidelity to the actual memory layout using physical + field offsets.) + + *ssa.Field y = x.f creates a simple edge to y from x's node at f's offset. + + *ssa.FieldAddr y = &x->f requires a dynamic closure rule to create + simple edges for each struct discovered in pts(x). + +Arrays + We model an array by an identity node (whose type is that of the + array itself) followed by a node representing all the elements of + the array; the analysis does not distinguish elements with different + indices. Effectively, an array is treated like struct{elem T}, a + load y=x[i] like y=x.elem, and a store x[i]=y like x.elem=y; the + index i is ignored. + + A pointer to an array is pointer to its identity node. (A slice is + also a pointer to an array's identity node.) The identity node + allows us to distinguish a pointer to an array from a pointer to one + of its elements, but it is rather costly because it introduces more + offset constraints into the system. Furthermore, sound treatment of + unsafe.Pointer would require us to dispense with this node. + + Arrays may be allocated by Alloc, by make([]T), by calls to append, + and via reflection. + +Tuples (T, ...) + Tuples are treated like structs with naturally numbered fields. + *ssa.Extract is analogous to *ssa.Field. + + However, tuples have no identity field since by construction, they + cannot be address-taken. + + +FUNCTION CALLS + + There are three kinds of function call: + (1) static "call"-mode calls of functions. + (2) dynamic "call"-mode calls of functions. + (3) dynamic "invoke"-mode calls of interface methods. + Cases 1 and 2 apply equally to methods and standalone functions. + + Static calls. + A static call consists three steps: + - finding the function object of the callee; + - creating copy edges from the actual parameter value nodes to the + P-block in the function object (this includes the receiver if + the callee is a method); + - creating copy edges from the R-block in the function object to + the value nodes for the result of the call. + + A static function call is little more than two struct value copies + between the P/R blocks of caller and callee: + + callee.P = caller.P + caller.R = callee.R + + Context sensitivity + + Static calls (alone) may be treated context sensitively, + i.e. each callsite may cause a distinct re-analysis of the + callee, improving precision. Our current context-sensitivity + policy treats all intrinsics and getter/setter methods in this + manner since such functions are small and seem like an obvious + source of spurious confluences, though this has not yet been + evaluated. + + Dynamic function calls + + Dynamic calls work in a similar manner except that the creation of + copy edges occurs dynamically, in a similar fashion to a pair of + struct copies in which the callee is indirect: + + callee->P = caller.P + caller.R = callee->R + + (Recall that the function object's P- and R-blocks are contiguous.) + + Interface method invocation + + For invoke-mode calls, we create a params/results block for the + callsite and attach a dynamic closure rule to the interface. For + each new tagged object that flows to the interface, we look up + the concrete method, find its function object, and connect its P/R + blocks to the callsite's P/R blocks, adding copy edges to the graph + during solving. + + Recording call targets + + The analysis notifies its clients of each callsite it encounters, + passing a CallSite interface. Among other things, the CallSite + contains a synthetic constraint variable ("targets") whose + points-to solution includes the set of all function objects to + which the call may dispatch. + + It is via this mechanism that the callgraph is made available. + Clients may also elect to be notified of callgraph edges directly; + internally this just iterates all "targets" variables' pts(·)s. + + +PRESOLVER + +We implement Hash-Value Numbering (HVN), a pre-solver constraint +optimization described in Hardekopf & Lin, SAS'07. This is documented +in more detail in hvn.go. We intend to add its cousins HR and HU in +future. + + +SOLVER + +The solver is currently a naive Andersen-style implementation; it does +not perform online cycle detection, though we plan to add solver +optimisations such as Hybrid- and Lazy- Cycle Detection from (Hardekopf +& Lin, PLDI'07). + +It uses difference propagation (Pearce et al, SQC'04) to avoid +redundant re-triggering of closure rules for values already seen. + +Points-to sets are represented using sparse bit vectors (similar to +those used in LLVM and gcc), which are more space- and time-efficient +than sets based on Go's built-in map type or dense bit vectors. + +Nodes are permuted prior to solving so that object nodes (which may +appear in points-to sets) are lower numbered than non-object (var) +nodes. This improves the density of the set over which the PTSs +range, and thus the efficiency of the representation. + +Partly thanks to avoiding map iteration, the execution of the solver is +100% deterministic, a great help during debugging. + + +FURTHER READING + +Andersen, L. O. 1994. Program analysis and specialization for the C +programming language. Ph.D. dissertation. DIKU, University of +Copenhagen. + +David J. Pearce, Paul H. J. Kelly, and Chris Hankin. 2004. Efficient +field-sensitive pointer analysis for C. In Proceedings of the 5th ACM +SIGPLAN-SIGSOFT workshop on Program analysis for software tools and +engineering (PASTE '04). ACM, New York, NY, USA, 37-42. +http://doi.acm.org/10.1145/996821.996835 + +David J. Pearce, Paul H. J. Kelly, and Chris Hankin. 2004. Online +Cycle Detection and Difference Propagation: Applications to Pointer +Analysis. Software Quality Control 12, 4 (December 2004), 311-337. +http://dx.doi.org/10.1023/B:SQJO.0000039791.93071.a2 + +David Grove and Craig Chambers. 2001. A framework for call graph +construction algorithms. ACM Trans. Program. Lang. Syst. 23, 6 +(November 2001), 685-746. +http://doi.acm.org/10.1145/506315.506316 + +Ben Hardekopf and Calvin Lin. 2007. The ant and the grasshopper: fast +and accurate pointer analysis for millions of lines of code. In +Proceedings of the 2007 ACM SIGPLAN conference on Programming language +design and implementation (PLDI '07). ACM, New York, NY, USA, 290-299. +http://doi.acm.org/10.1145/1250734.1250767 + +Ben Hardekopf and Calvin Lin. 2007. Exploiting pointer and location +equivalence to optimize pointer analysis. In Proceedings of the 14th +international conference on Static Analysis (SAS'07), Hanne Riis +Nielson and Gilberto Filé (Eds.). Springer-Verlag, Berlin, Heidelberg, +265-280. + +Atanas Rountev and Satish Chandra. 2000. Off-line variable substitution +for scaling points-to analysis. In Proceedings of the ACM SIGPLAN 2000 +conference on Programming language design and implementation (PLDI '00). +ACM, New York, NY, USA, 47-56. DOI=10.1145/349299.349310 +http://doi.acm.org/10.1145/349299.349310 + +*/ +package pointer // import "golang.org/x/tools/go/pointer" diff --git a/vendor/golang.org/x/tools/go/pointer/doc14.go b/vendor/golang.org/x/tools/go/pointer/doc14.go new file mode 100644 index 0000000000..fe5ad6058d --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/doc14.go @@ -0,0 +1,612 @@ +// Copyright 2013 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.5 + +/* + +Package pointer implements Andersen's analysis, an inclusion-based +pointer analysis algorithm first described in (Andersen, 1994). + +A pointer analysis relates every pointer expression in a whole program +to the set of memory locations to which it might point. This +information can be used to construct a call graph of the program that +precisely represents the destinations of dynamic function and method +calls. It can also be used to determine, for example, which pairs of +channel operations operate on the same channel. + +The package allows the client to request a set of expressions of +interest for which the points-to information will be returned once the +analysis is complete. In addition, the client may request that a +callgraph is constructed. The example program in example_test.go +demonstrates both of these features. Clients should not request more +information than they need since it may increase the cost of the +analysis significantly. + + +CLASSIFICATION + +Our algorithm is INCLUSION-BASED: the points-to sets for x and y will +be related by pts(y) ⊇ pts(x) if the program contains the statement +y = x. + +It is FLOW-INSENSITIVE: it ignores all control flow constructs and the +order of statements in a program. It is therefore a "MAY ALIAS" +analysis: its facts are of the form "P may/may not point to L", +not "P must point to L". + +It is FIELD-SENSITIVE: it builds separate points-to sets for distinct +fields, such as x and y in struct { x, y *int }. + +It is mostly CONTEXT-INSENSITIVE: most functions are analyzed once, +so values can flow in at one call to the function and return out at +another. Only some smaller functions are analyzed with consideration +of their calling context. + +It has a CONTEXT-SENSITIVE HEAP: objects are named by both allocation +site and context, so the objects returned by two distinct calls to f: + func f() *T { return new(T) } +are distinguished up to the limits of the calling context. + +It is a WHOLE PROGRAM analysis: it requires SSA-form IR for the +complete Go program and summaries for native code. + +See the (Hind, PASTE'01) survey paper for an explanation of these terms. + + +SOUNDNESS + +The analysis is fully sound when invoked on pure Go programs that do not +use reflection or unsafe.Pointer conversions. In other words, if there +is any possible execution of the program in which pointer P may point to +object O, the analysis will report that fact. + + +REFLECTION + +By default, the "reflect" library is ignored by the analysis, as if all +its functions were no-ops, but if the client enables the Reflection flag, +the analysis will make a reasonable attempt to model the effects of +calls into this library. However, this comes at a significant +performance cost, and not all features of that library are yet +implemented. In addition, some simplifying approximations must be made +to ensure that the analysis terminates; for example, reflection can be +used to construct an infinite set of types and values of those types, +but the analysis arbitrarily bounds the depth of such types. + +Most but not all reflection operations are supported. +In particular, addressable reflect.Values are not yet implemented, so +operations such as (reflect.Value).Set have no analytic effect. + + +UNSAFE POINTER CONVERSIONS + +The pointer analysis makes no attempt to understand aliasing between the +operand x and result y of an unsafe.Pointer conversion: + y = (*T)(unsafe.Pointer(x)) +It is as if the conversion allocated an entirely new object: + y = new(T) + + +NATIVE CODE + +The analysis cannot model the aliasing effects of functions written in +languages other than Go, such as runtime intrinsics in C or assembly, or +code accessed via cgo. The result is as if such functions are no-ops. +However, various important intrinsics are understood by the analysis, +along with built-ins such as append. + +The analysis currently provides no way for users to specify the aliasing +effects of native code. + +------------------------------------------------------------------------ + +IMPLEMENTATION + +The remaining documentation is intended for package maintainers and +pointer analysis specialists. Maintainers should have a solid +understanding of the referenced papers (especially those by H&L and PKH) +before making making significant changes. + +The implementation is similar to that described in (Pearce et al, +PASTE'04). Unlike many algorithms which interleave constraint +generation and solving, constructing the callgraph as they go, this +implementation for the most part observes a phase ordering (generation +before solving), with only simple (copy) constraints being generated +during solving. (The exception is reflection, which creates various +constraints during solving as new types flow to reflect.Value +operations.) This improves the traction of presolver optimisations, +but imposes certain restrictions, e.g. potential context sensitivity +is limited since all variants must be created a priori. + + +TERMINOLOGY + +A type is said to be "pointer-like" if it is a reference to an object. +Pointer-like types include pointers and also interfaces, maps, channels, +functions and slices. + +We occasionally use C's x->f notation to distinguish the case where x +is a struct pointer from x.f where is a struct value. + +Pointer analysis literature (and our comments) often uses the notation +dst=*src+offset to mean something different than what it means in Go. +It means: for each node index p in pts(src), the node index p+offset is +in pts(dst). Similarly *dst+offset=src is used for store constraints +and dst=src+offset for offset-address constraints. + + +NODES + +Nodes are the key datastructure of the analysis, and have a dual role: +they represent both constraint variables (equivalence classes of +pointers) and members of points-to sets (things that can be pointed +at, i.e. "labels"). + +Nodes are naturally numbered. The numbering enables compact +representations of sets of nodes such as bitvectors (or BDDs); and the +ordering enables a very cheap way to group related nodes together. For +example, passing n parameters consists of generating n parallel +constraints from caller+i to callee+i for 0<=i y is added. + + ChangeInterface is a simple copy because the representation of + tagged objects is independent of the interface type (in contrast + to the "method tables" approach used by the gc runtime). + + y := Invoke x.m(...) is implemented by allocating contiguous P/R + blocks for the callsite and adding a dynamic rule triggered by each + tagged object added to pts(x). The rule adds param/results copy + edges to/from each discovered concrete method. + + (Q. Why do we model an interface as a pointer to a pair of type and + value, rather than as a pair of a pointer to type and a pointer to + value? + A. Control-flow joins would merge interfaces ({T1}, {V1}) and ({T2}, + {V2}) to make ({T1,T2}, {V1,V2}), leading to the infeasible and + type-unsafe combination (T1,V2). Treating the value and its concrete + type as inseparable makes the analysis type-safe.) + +reflect.Value + A reflect.Value is modelled very similar to an interface{}, i.e. as + a pointer exclusively to tagged objects, but with two generalizations. + + 1) a reflect.Value that represents an lvalue points to an indirect + (obj.flags ⊇ {otIndirect}) tagged object, which has a similar + layout to an tagged object except that the value is a pointer to + the dynamic type. Indirect tagged objects preserve the correct + aliasing so that mutations made by (reflect.Value).Set can be + observed. + + Indirect objects only arise when an lvalue is derived from an + rvalue by indirection, e.g. the following code: + + type S struct { X T } + var s S + var i interface{} = &s // i points to a *S-tagged object (from MakeInterface) + v1 := reflect.ValueOf(i) // v1 points to same *S-tagged object as i + v2 := v1.Elem() // v2 points to an indirect S-tagged object, pointing to s + v3 := v2.FieldByName("X") // v3 points to an indirect int-tagged object, pointing to s.X + v3.Set(y) // pts(s.X) ⊇ pts(y) + + Whether indirect or not, the concrete type of the tagged object + corresponds to the user-visible dynamic type, and the existence + of a pointer is an implementation detail. + + (NB: indirect tagged objects are not yet implemented) + + 2) The dynamic type tag of a tagged object pointed to by a + reflect.Value may be an interface type; it need not be concrete. + + This arises in code such as this: + tEface := reflect.TypeOf(new(interface{}).Elem() // interface{} + eface := reflect.Zero(tEface) + pts(eface) is a singleton containing an interface{}-tagged + object. That tagged object's payload is an interface{} value, + i.e. the pts of the payload contains only concrete-tagged + objects, although in this example it's the zero interface{} value, + so its pts is empty. + +reflect.Type + Just as in the real "reflect" library, we represent a reflect.Type + as an interface whose sole implementation is the concrete type, + *reflect.rtype. (This choice is forced on us by go/types: clients + cannot fabricate types with arbitrary method sets.) + + rtype instances are canonical: there is at most one per dynamic + type. (rtypes are in fact large structs but since identity is all + that matters, we represent them by a single node.) + + The payload of each *rtype-tagged object is an *rtype pointer that + points to exactly one such canonical rtype object. We exploit this + by setting the node.typ of the payload to the dynamic type, not + '*rtype'. This saves us an indirection in each resolution rule. As + an optimisation, *rtype-tagged objects are canonicalized too. + + +Aggregate types: + +Aggregate types are treated as if all directly contained +aggregates are recursively flattened out. + +Structs + *ssa.Field y = x.f creates a simple edge to y from x's node at f's offset. + + *ssa.FieldAddr y = &x->f requires a dynamic closure rule to create + simple edges for each struct discovered in pts(x). + + The nodes of a struct consist of a special 'identity' node (whose + type is that of the struct itself), followed by the nodes for all + the struct's fields, recursively flattened out. A pointer to the + struct is a pointer to its identity node. That node allows us to + distinguish a pointer to a struct from a pointer to its first field. + + Field offsets are logical field offsets (plus one for the identity + node), so the sizes of the fields can be ignored by the analysis. + + (The identity node is non-traditional but enables the distiction + described above, which is valuable for code comprehension tools. + Typical pointer analyses for C, whose purpose is compiler + optimization, must soundly model unsafe.Pointer (void*) conversions, + and this requires fidelity to the actual memory layout using physical + field offsets.) + + *ssa.Field y = x.f creates a simple edge to y from x's node at f's offset. + + *ssa.FieldAddr y = &x->f requires a dynamic closure rule to create + simple edges for each struct discovered in pts(x). + +Arrays + We model an array by an identity node (whose type is that of the + array itself) followed by a node representing all the elements of + the array; the analysis does not distinguish elements with different + indices. Effectively, an array is treated like struct{elem T}, a + load y=x[i] like y=x.elem, and a store x[i]=y like x.elem=y; the + index i is ignored. + + A pointer to an array is pointer to its identity node. (A slice is + also a pointer to an array's identity node.) The identity node + allows us to distinguish a pointer to an array from a pointer to one + of its elements, but it is rather costly because it introduces more + offset constraints into the system. Furthermore, sound treatment of + unsafe.Pointer would require us to dispense with this node. + + Arrays may be allocated by Alloc, by make([]T), by calls to append, + and via reflection. + +Tuples (T, ...) + Tuples are treated like structs with naturally numbered fields. + *ssa.Extract is analogous to *ssa.Field. + + However, tuples have no identity field since by construction, they + cannot be address-taken. + + +FUNCTION CALLS + + There are three kinds of function call: + (1) static "call"-mode calls of functions. + (2) dynamic "call"-mode calls of functions. + (3) dynamic "invoke"-mode calls of interface methods. + Cases 1 and 2 apply equally to methods and standalone functions. + + Static calls. + A static call consists three steps: + - finding the function object of the callee; + - creating copy edges from the actual parameter value nodes to the + P-block in the function object (this includes the receiver if + the callee is a method); + - creating copy edges from the R-block in the function object to + the value nodes for the result of the call. + + A static function call is little more than two struct value copies + between the P/R blocks of caller and callee: + + callee.P = caller.P + caller.R = callee.R + + Context sensitivity + + Static calls (alone) may be treated context sensitively, + i.e. each callsite may cause a distinct re-analysis of the + callee, improving precision. Our current context-sensitivity + policy treats all intrinsics and getter/setter methods in this + manner since such functions are small and seem like an obvious + source of spurious confluences, though this has not yet been + evaluated. + + Dynamic function calls + + Dynamic calls work in a similar manner except that the creation of + copy edges occurs dynamically, in a similar fashion to a pair of + struct copies in which the callee is indirect: + + callee->P = caller.P + caller.R = callee->R + + (Recall that the function object's P- and R-blocks are contiguous.) + + Interface method invocation + + For invoke-mode calls, we create a params/results block for the + callsite and attach a dynamic closure rule to the interface. For + each new tagged object that flows to the interface, we look up + the concrete method, find its function object, and connect its P/R + blocks to the callsite's P/R blocks, adding copy edges to the graph + during solving. + + Recording call targets + + The analysis notifies its clients of each callsite it encounters, + passing a CallSite interface. Among other things, the CallSite + contains a synthetic constraint variable ("targets") whose + points-to solution includes the set of all function objects to + which the call may dispatch. + + It is via this mechanism that the callgraph is made available. + Clients may also elect to be notified of callgraph edges directly; + internally this just iterates all "targets" variables' pts(·)s. + + +PRESOLVER + +We implement Hash-Value Numbering (HVN), a pre-solver constraint +optimization described in Hardekopf & Lin, SAS'07. This is documented +in more detail in hvn.go. We intend to add its cousins HR and HU in +future. + + +SOLVER + +The solver is currently a naive Andersen-style implementation; it does +not perform online cycle detection, though we plan to add solver +optimisations such as Hybrid- and Lazy- Cycle Detection from (Hardekopf +& Lin, PLDI'07). + +It uses difference propagation (Pearce et al, SQC'04) to avoid +redundant re-triggering of closure rules for values already seen. + +Points-to sets are represented using sparse bit vectors (similar to +those used in LLVM and gcc), which are more space- and time-efficient +than sets based on Go's built-in map type or dense bit vectors. + +Nodes are permuted prior to solving so that object nodes (which may +appear in points-to sets) are lower numbered than non-object (var) +nodes. This improves the density of the set over which the PTSs +range, and thus the efficiency of the representation. + +Partly thanks to avoiding map iteration, the execution of the solver is +100% deterministic, a great help during debugging. + + +FURTHER READING + +Andersen, L. O. 1994. Program analysis and specialization for the C +programming language. Ph.D. dissertation. DIKU, University of +Copenhagen. + +David J. Pearce, Paul H. J. Kelly, and Chris Hankin. 2004. Efficient +field-sensitive pointer analysis for C. In Proceedings of the 5th ACM +SIGPLAN-SIGSOFT workshop on Program analysis for software tools and +engineering (PASTE '04). ACM, New York, NY, USA, 37-42. +http://doi.acm.org/10.1145/996821.996835 + +David J. Pearce, Paul H. J. Kelly, and Chris Hankin. 2004. Online +Cycle Detection and Difference Propagation: Applications to Pointer +Analysis. Software Quality Control 12, 4 (December 2004), 311-337. +http://dx.doi.org/10.1023/B:SQJO.0000039791.93071.a2 + +David Grove and Craig Chambers. 2001. A framework for call graph +construction algorithms. ACM Trans. Program. Lang. Syst. 23, 6 +(November 2001), 685-746. +http://doi.acm.org/10.1145/506315.506316 + +Ben Hardekopf and Calvin Lin. 2007. The ant and the grasshopper: fast +and accurate pointer analysis for millions of lines of code. In +Proceedings of the 2007 ACM SIGPLAN conference on Programming language +design and implementation (PLDI '07). ACM, New York, NY, USA, 290-299. +http://doi.acm.org/10.1145/1250734.1250767 + +Ben Hardekopf and Calvin Lin. 2007. Exploiting pointer and location +equivalence to optimize pointer analysis. In Proceedings of the 14th +international conference on Static Analysis (SAS'07), Hanne Riis +Nielson and Gilberto Filé (Eds.). Springer-Verlag, Berlin, Heidelberg, +265-280. + +Atanas Rountev and Satish Chandra. 2000. Off-line variable substitution +for scaling points-to analysis. In Proceedings of the ACM SIGPLAN 2000 +conference on Programming language design and implementation (PLDI '00). +ACM, New York, NY, USA, 47-56. DOI=10.1145/349299.349310 +http://doi.acm.org/10.1145/349299.349310 + +*/ +package pointer // import "golang.org/x/tools/go/pointer" diff --git a/vendor/golang.org/x/tools/go/pointer/example_test.go b/vendor/golang.org/x/tools/go/pointer/example_test.go new file mode 100644 index 0000000000..673de7a495 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/example_test.go @@ -0,0 +1,126 @@ +// Copyright 2013 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 pointer_test + +import ( + "fmt" + "sort" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/pointer" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +// This program demonstrates how to use the pointer analysis to +// obtain a conservative call-graph of a Go program. +// It also shows how to compute the points-to set of a variable, +// in this case, (C).f's ch parameter. +// +func Example() { + const myprog = ` +package main + +import "fmt" + +type I interface { + f(map[string]int) +} + +type C struct{} + +func (C) f(m map[string]int) { + fmt.Println("C.f()") +} + +func main() { + var i I = C{} + x := map[string]int{"one":1} + i.f(x) // dynamic method call +} +` + var conf loader.Config + + // Parse the input file, a string. + // (Command-line tools should use conf.FromArgs.) + file, err := conf.ParseFile("myprog.go", myprog) + if err != nil { + fmt.Print(err) // parse error + return + } + + // Create single-file main package and import its dependencies. + conf.CreateFromFiles("main", file) + + iprog, err := conf.Load() + if err != nil { + fmt.Print(err) // type error in some package + return + } + + // Create SSA-form program representation. + prog := ssautil.CreateProgram(iprog, 0) + mainPkg := prog.Package(iprog.Created[0].Pkg) + + // Build SSA code for bodies of all functions in the whole program. + prog.Build() + + // Configure the pointer analysis to build a call-graph. + config := &pointer.Config{ + Mains: []*ssa.Package{mainPkg}, + BuildCallGraph: true, + } + + // Query points-to set of (C).f's parameter m, a map. + C := mainPkg.Type("C").Type() + Cfm := prog.LookupMethod(C, mainPkg.Pkg, "f").Params[1] + config.AddQuery(Cfm) + + // Run the pointer analysis. + result, err := pointer.Analyze(config) + if err != nil { + panic(err) // internal error in pointer analysis + } + + // Find edges originating from the main package. + // By converting to strings, we de-duplicate nodes + // representing the same function due to context sensitivity. + var edges []string + callgraph.GraphVisitEdges(result.CallGraph, func(edge *callgraph.Edge) error { + caller := edge.Caller.Func + if caller.Pkg == mainPkg { + edges = append(edges, fmt.Sprint(caller, " --> ", edge.Callee.Func)) + } + return nil + }) + + // Print the edges in sorted order. + sort.Strings(edges) + for _, edge := range edges { + fmt.Println(edge) + } + fmt.Println() + + // Print the labels of (C).f(m)'s points-to set. + fmt.Println("m may point to:") + var labels []string + for _, l := range result.Queries[Cfm].PointsTo().Labels() { + label := fmt.Sprintf(" %s: %s", prog.Fset.Position(l.Pos()), l) + labels = append(labels, label) + } + sort.Strings(labels) + for _, label := range labels { + fmt.Println(label) + } + + // Output: + // (main.C).f --> fmt.Println + // main.init --> fmt.init + // main.main --> (main.C).f + // + // m may point to: + // myprog.go:18:21: makemap +} diff --git a/vendor/golang.org/x/tools/go/pointer/gen.go b/vendor/golang.org/x/tools/go/pointer/gen.go new file mode 100644 index 0000000000..405a63b83b --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/gen.go @@ -0,0 +1,1315 @@ +// Copyright 2013 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.5 + +package pointer + +// This file defines the constraint generation phase. + +// TODO(adonovan): move the constraint definitions and the store() etc +// functions which add them (and are also used by the solver) into a +// new file, constraints.go. + +import ( + "fmt" + "go/token" + "go/types" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/ssa" +) + +var ( + tEface = types.NewInterface(nil, nil).Complete() + tInvalid = types.Typ[types.Invalid] + tUnsafePtr = types.Typ[types.UnsafePointer] +) + +// ---------- Node creation ---------- + +// nextNode returns the index of the next unused node. +func (a *analysis) nextNode() nodeid { + return nodeid(len(a.nodes)) +} + +// addNodes creates nodes for all scalar elements in type typ, and +// returns the id of the first one, or zero if the type was +// analytically uninteresting. +// +// comment explains the origin of the nodes, as a debugging aid. +// +func (a *analysis) addNodes(typ types.Type, comment string) nodeid { + id := a.nextNode() + for _, fi := range a.flatten(typ) { + a.addOneNode(fi.typ, comment, fi) + } + if id == a.nextNode() { + return 0 // type contained no pointers + } + return id +} + +// addOneNode creates a single node with type typ, and returns its id. +// +// typ should generally be scalar (except for tagged.T nodes +// and struct/array identity nodes). Use addNodes for non-scalar types. +// +// comment explains the origin of the nodes, as a debugging aid. +// subelement indicates the subelement, e.g. ".a.b[*].c". +// +func (a *analysis) addOneNode(typ types.Type, comment string, subelement *fieldInfo) nodeid { + id := a.nextNode() + a.nodes = append(a.nodes, &node{typ: typ, subelement: subelement, solve: new(solverState)}) + if a.log != nil { + fmt.Fprintf(a.log, "\tcreate n%d %s for %s%s\n", + id, typ, comment, subelement.path()) + } + return id +} + +// setValueNode associates node id with the value v. +// cgn identifies the context iff v is a local variable. +// +func (a *analysis) setValueNode(v ssa.Value, id nodeid, cgn *cgnode) { + if cgn != nil { + a.localval[v] = id + } else { + a.globalval[v] = id + } + if a.log != nil { + fmt.Fprintf(a.log, "\tval[%s] = n%d (%T)\n", v.Name(), id, v) + } + + // Due to context-sensitivity, we may encounter the same Value + // in many contexts. We merge them to a canonical node, since + // that's what all clients want. + + // Record the (v, id) relation if the client has queried pts(v). + if _, ok := a.config.Queries[v]; ok { + t := v.Type() + ptr, ok := a.result.Queries[v] + if !ok { + // First time? Create the canonical query node. + ptr = Pointer{a, a.addNodes(t, "query")} + a.result.Queries[v] = ptr + } + a.result.Queries[v] = ptr + a.copy(ptr.n, id, a.sizeof(t)) + } + + // Record the (*v, id) relation if the client has queried pts(*v). + if _, ok := a.config.IndirectQueries[v]; ok { + t := v.Type() + ptr, ok := a.result.IndirectQueries[v] + if !ok { + // First time? Create the canonical indirect query node. + ptr = Pointer{a, a.addNodes(v.Type(), "query.indirect")} + a.result.IndirectQueries[v] = ptr + } + a.genLoad(cgn, ptr.n, v, 0, a.sizeof(t)) + } +} + +// endObject marks the end of a sequence of calls to addNodes denoting +// a single object allocation. +// +// obj is the start node of the object, from a prior call to nextNode. +// Its size, flags and optional data will be updated. +// +func (a *analysis) endObject(obj nodeid, cgn *cgnode, data interface{}) *object { + // Ensure object is non-empty by padding; + // the pad will be the object node. + size := uint32(a.nextNode() - obj) + if size == 0 { + a.addOneNode(tInvalid, "padding", nil) + } + objNode := a.nodes[obj] + o := &object{ + size: size, // excludes padding + cgn: cgn, + data: data, + } + objNode.obj = o + + return o +} + +// makeFunctionObject creates and returns a new function object +// (contour) for fn, and returns the id of its first node. It also +// enqueues fn for subsequent constraint generation. +// +// For a context-sensitive contour, callersite identifies the sole +// callsite; for shared contours, caller is nil. +// +func (a *analysis) makeFunctionObject(fn *ssa.Function, callersite *callsite) nodeid { + if a.log != nil { + fmt.Fprintf(a.log, "\t---- makeFunctionObject %s\n", fn) + } + + // obj is the function object (identity, params, results). + obj := a.nextNode() + cgn := a.makeCGNode(fn, obj, callersite) + sig := fn.Signature + a.addOneNode(sig, "func.cgnode", nil) // (scalar with Signature type) + if recv := sig.Recv(); recv != nil { + a.addNodes(recv.Type(), "func.recv") + } + a.addNodes(sig.Params(), "func.params") + a.addNodes(sig.Results(), "func.results") + a.endObject(obj, cgn, fn).flags |= otFunction + + if a.log != nil { + fmt.Fprintf(a.log, "\t----\n") + } + + // Queue it up for constraint processing. + a.genq = append(a.genq, cgn) + + return obj +} + +// makeTagged creates a tagged object of type typ. +func (a *analysis) makeTagged(typ types.Type, cgn *cgnode, data interface{}) nodeid { + obj := a.addOneNode(typ, "tagged.T", nil) // NB: type may be non-scalar! + a.addNodes(typ, "tagged.v") + a.endObject(obj, cgn, data).flags |= otTagged + return obj +} + +// makeRtype returns the canonical tagged object of type *rtype whose +// payload points to the sole rtype object for T. +// +// TODO(adonovan): move to reflect.go; it's part of the solver really. +// +func (a *analysis) makeRtype(T types.Type) nodeid { + if v := a.rtypes.At(T); v != nil { + return v.(nodeid) + } + + // Create the object for the reflect.rtype itself, which is + // ordinarily a large struct but here a single node will do. + obj := a.nextNode() + a.addOneNode(T, "reflect.rtype", nil) + a.endObject(obj, nil, T) + + id := a.makeTagged(a.reflectRtypePtr, nil, T) + a.nodes[id+1].typ = T // trick (each *rtype tagged object is a singleton) + a.addressOf(a.reflectRtypePtr, id+1, obj) + + a.rtypes.Set(T, id) + return id +} + +// rtypeValue returns the type of the *reflect.rtype-tagged object obj. +func (a *analysis) rtypeTaggedValue(obj nodeid) types.Type { + tDyn, t, _ := a.taggedValue(obj) + if tDyn != a.reflectRtypePtr { + panic(fmt.Sprintf("not a *reflect.rtype-tagged object: obj=n%d tag=%v payload=n%d", obj, tDyn, t)) + } + return a.nodes[t].typ +} + +// valueNode returns the id of the value node for v, creating it (and +// the association) as needed. It may return zero for uninteresting +// values containing no pointers. +// +func (a *analysis) valueNode(v ssa.Value) nodeid { + // Value nodes for locals are created en masse by genFunc. + if id, ok := a.localval[v]; ok { + return id + } + + // Value nodes for globals are created on demand. + id, ok := a.globalval[v] + if !ok { + var comment string + if a.log != nil { + comment = v.String() + } + id = a.addNodes(v.Type(), comment) + if obj := a.objectNode(nil, v); obj != 0 { + a.addressOf(v.Type(), id, obj) + } + a.setValueNode(v, id, nil) + } + return id +} + +// valueOffsetNode ascertains the node for tuple/struct value v, +// then returns the node for its subfield #index. +// +func (a *analysis) valueOffsetNode(v ssa.Value, index int) nodeid { + id := a.valueNode(v) + if id == 0 { + panic(fmt.Sprintf("cannot offset within n0: %s = %s", v.Name(), v)) + } + return id + nodeid(a.offsetOf(v.Type(), index)) +} + +// isTaggedObject reports whether object obj is a tagged object. +func (a *analysis) isTaggedObject(obj nodeid) bool { + return a.nodes[obj].obj.flags&otTagged != 0 +} + +// taggedValue returns the dynamic type tag, the (first node of the) +// payload, and the indirect flag of the tagged object starting at id. +// Panic ensues if !isTaggedObject(id). +// +func (a *analysis) taggedValue(obj nodeid) (tDyn types.Type, v nodeid, indirect bool) { + n := a.nodes[obj] + flags := n.obj.flags + if flags&otTagged == 0 { + panic(fmt.Sprintf("not a tagged object: n%d", obj)) + } + return n.typ, obj + 1, flags&otIndirect != 0 +} + +// funcParams returns the first node of the params (P) block of the +// function whose object node (obj.flags&otFunction) is id. +// +func (a *analysis) funcParams(id nodeid) nodeid { + n := a.nodes[id] + if n.obj == nil || n.obj.flags&otFunction == 0 { + panic(fmt.Sprintf("funcParams(n%d): not a function object block", id)) + } + return id + 1 +} + +// funcResults returns the first node of the results (R) block of the +// function whose object node (obj.flags&otFunction) is id. +// +func (a *analysis) funcResults(id nodeid) nodeid { + n := a.nodes[id] + if n.obj == nil || n.obj.flags&otFunction == 0 { + panic(fmt.Sprintf("funcResults(n%d): not a function object block", id)) + } + sig := n.typ.(*types.Signature) + id += 1 + nodeid(a.sizeof(sig.Params())) + if sig.Recv() != nil { + id += nodeid(a.sizeof(sig.Recv().Type())) + } + return id +} + +// ---------- Constraint creation ---------- + +// copy creates a constraint of the form dst = src. +// sizeof is the width (in logical fields) of the copied type. +// +func (a *analysis) copy(dst, src nodeid, sizeof uint32) { + if src == dst || sizeof == 0 { + return // trivial + } + if src == 0 || dst == 0 { + panic(fmt.Sprintf("ill-typed copy dst=n%d src=n%d", dst, src)) + } + for i := uint32(0); i < sizeof; i++ { + a.addConstraint(©Constraint{dst, src}) + src++ + dst++ + } +} + +// addressOf creates a constraint of the form id = &obj. +// T is the type of the address. +func (a *analysis) addressOf(T types.Type, id, obj nodeid) { + if id == 0 { + panic("addressOf: zero id") + } + if obj == 0 { + panic("addressOf: zero obj") + } + if a.shouldTrack(T) { + a.addConstraint(&addrConstraint{id, obj}) + } +} + +// load creates a load constraint of the form dst = src[offset]. +// offset is the pointer offset in logical fields. +// sizeof is the width (in logical fields) of the loaded type. +// +func (a *analysis) load(dst, src nodeid, offset, sizeof uint32) { + if dst == 0 { + return // load of non-pointerlike value + } + if src == 0 && dst == 0 { + return // non-pointerlike operation + } + if src == 0 || dst == 0 { + panic(fmt.Sprintf("ill-typed load dst=n%d src=n%d", dst, src)) + } + for i := uint32(0); i < sizeof; i++ { + a.addConstraint(&loadConstraint{offset, dst, src}) + offset++ + dst++ + } +} + +// store creates a store constraint of the form dst[offset] = src. +// offset is the pointer offset in logical fields. +// sizeof is the width (in logical fields) of the stored type. +// +func (a *analysis) store(dst, src nodeid, offset uint32, sizeof uint32) { + if src == 0 { + return // store of non-pointerlike value + } + if src == 0 && dst == 0 { + return // non-pointerlike operation + } + if src == 0 || dst == 0 { + panic(fmt.Sprintf("ill-typed store dst=n%d src=n%d", dst, src)) + } + for i := uint32(0); i < sizeof; i++ { + a.addConstraint(&storeConstraint{offset, dst, src}) + offset++ + src++ + } +} + +// offsetAddr creates an offsetAddr constraint of the form dst = &src.#offset. +// offset is the field offset in logical fields. +// T is the type of the address. +// +func (a *analysis) offsetAddr(T types.Type, dst, src nodeid, offset uint32) { + if !a.shouldTrack(T) { + return + } + if offset == 0 { + // Simplify dst = &src->f0 + // to dst = src + // (NB: this optimisation is defeated by the identity + // field prepended to struct and array objects.) + a.copy(dst, src, 1) + } else { + a.addConstraint(&offsetAddrConstraint{offset, dst, src}) + } +} + +// typeAssert creates a typeFilter or untag constraint of the form dst = src.(T): +// typeFilter for an interface, untag for a concrete type. +// The exact flag is specified as for untagConstraint. +// +func (a *analysis) typeAssert(T types.Type, dst, src nodeid, exact bool) { + if isInterface(T) { + a.addConstraint(&typeFilterConstraint{T, dst, src}) + } else { + a.addConstraint(&untagConstraint{T, dst, src, exact}) + } +} + +// addConstraint adds c to the constraint set. +func (a *analysis) addConstraint(c constraint) { + a.constraints = append(a.constraints, c) + if a.log != nil { + fmt.Fprintf(a.log, "\t%s\n", c) + } +} + +// copyElems generates load/store constraints for *dst = *src, +// where src and dst are slices or *arrays. +// +func (a *analysis) copyElems(cgn *cgnode, typ types.Type, dst, src ssa.Value) { + tmp := a.addNodes(typ, "copy") + sz := a.sizeof(typ) + a.genLoad(cgn, tmp, src, 1, sz) + a.genStore(cgn, dst, tmp, 1, sz) +} + +// ---------- Constraint generation ---------- + +// genConv generates constraints for the conversion operation conv. +func (a *analysis) genConv(conv *ssa.Convert, cgn *cgnode) { + res := a.valueNode(conv) + if res == 0 { + return // result is non-pointerlike + } + + tSrc := conv.X.Type() + tDst := conv.Type() + + switch utSrc := tSrc.Underlying().(type) { + case *types.Slice: + // []byte/[]rune -> string? + return + + case *types.Pointer: + // *T -> unsafe.Pointer? + if tDst.Underlying() == tUnsafePtr { + return // we don't model unsafe aliasing (unsound) + } + + case *types.Basic: + switch tDst.Underlying().(type) { + case *types.Pointer: + // Treat unsafe.Pointer->*T conversions like + // new(T) and create an unaliased object. + if utSrc == tUnsafePtr { + obj := a.addNodes(mustDeref(tDst), "unsafe.Pointer conversion") + a.endObject(obj, cgn, conv) + a.addressOf(tDst, res, obj) + return + } + + case *types.Slice: + // string -> []byte/[]rune (or named aliases)? + if utSrc.Info()&types.IsString != 0 { + obj := a.addNodes(sliceToArray(tDst), "convert") + a.endObject(obj, cgn, conv) + a.addressOf(tDst, res, obj) + return + } + + case *types.Basic: + // All basic-to-basic type conversions are no-ops. + // This includes uintptr<->unsafe.Pointer conversions, + // which we (unsoundly) ignore. + return + } + } + + panic(fmt.Sprintf("illegal *ssa.Convert %s -> %s: %s", tSrc, tDst, conv.Parent())) +} + +// genAppend generates constraints for a call to append. +func (a *analysis) genAppend(instr *ssa.Call, cgn *cgnode) { + // Consider z = append(x, y). y is optional. + // This may allocate a new [1]T array; call its object w. + // We get the following constraints: + // z = x + // z = &w + // *z = *y + + x := instr.Call.Args[0] + + z := instr + a.copy(a.valueNode(z), a.valueNode(x), 1) // z = x + + if len(instr.Call.Args) == 1 { + return // no allocation for z = append(x) or _ = append(x). + } + + // TODO(adonovan): test append([]byte, ...string) []byte. + + y := instr.Call.Args[1] + tArray := sliceToArray(instr.Call.Args[0].Type()) + + var w nodeid + w = a.nextNode() + a.addNodes(tArray, "append") + a.endObject(w, cgn, instr) + + a.copyElems(cgn, tArray.Elem(), z, y) // *z = *y + a.addressOf(instr.Type(), a.valueNode(z), w) // z = &w +} + +// genBuiltinCall generates contraints for a call to a built-in. +func (a *analysis) genBuiltinCall(instr ssa.CallInstruction, cgn *cgnode) { + call := instr.Common() + switch call.Value.(*ssa.Builtin).Name() { + case "append": + // Safe cast: append cannot appear in a go or defer statement. + a.genAppend(instr.(*ssa.Call), cgn) + + case "copy": + tElem := call.Args[0].Type().Underlying().(*types.Slice).Elem() + a.copyElems(cgn, tElem, call.Args[0], call.Args[1]) + + case "panic": + a.copy(a.panicNode, a.valueNode(call.Args[0]), 1) + + case "recover": + if v := instr.Value(); v != nil { + a.copy(a.valueNode(v), a.panicNode, 1) + } + + case "print": + // In the tests, the probe might be the sole reference + // to its arg, so make sure we create nodes for it. + if len(call.Args) > 0 { + a.valueNode(call.Args[0]) + } + + case "ssa:wrapnilchk": + a.copy(a.valueNode(instr.Value()), a.valueNode(call.Args[0]), 1) + + default: + // No-ops: close len cap real imag complex print println delete. + } +} + +// shouldUseContext defines the context-sensitivity policy. It +// returns true if we should analyse all static calls to fn anew. +// +// Obviously this interface rather limits how much freedom we have to +// choose a policy. The current policy, rather arbitrarily, is true +// for intrinsics and accessor methods (actually: short, single-block, +// call-free functions). This is just a starting point. +// +func (a *analysis) shouldUseContext(fn *ssa.Function) bool { + if a.findIntrinsic(fn) != nil { + return true // treat intrinsics context-sensitively + } + if len(fn.Blocks) != 1 { + return false // too expensive + } + blk := fn.Blocks[0] + if len(blk.Instrs) > 10 { + return false // too expensive + } + if fn.Synthetic != "" && (fn.Pkg == nil || fn != fn.Pkg.Func("init")) { + return true // treat synthetic wrappers context-sensitively + } + for _, instr := range blk.Instrs { + switch instr := instr.(type) { + case ssa.CallInstruction: + // Disallow function calls (except to built-ins) + // because of the danger of unbounded recursion. + if _, ok := instr.Common().Value.(*ssa.Builtin); !ok { + return false + } + } + } + return true +} + +// genStaticCall generates constraints for a statically dispatched function call. +func (a *analysis) genStaticCall(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) { + fn := call.StaticCallee() + + // Special cases for inlined intrinsics. + switch fn { + case a.runtimeSetFinalizer: + // Inline SetFinalizer so the call appears direct. + site.targets = a.addOneNode(tInvalid, "SetFinalizer.targets", nil) + a.addConstraint(&runtimeSetFinalizerConstraint{ + targets: site.targets, + x: a.valueNode(call.Args[0]), + f: a.valueNode(call.Args[1]), + }) + return + + case a.reflectValueCall: + // Inline (reflect.Value).Call so the call appears direct. + dotdotdot := false + ret := reflectCallImpl(a, caller, site, a.valueNode(call.Args[0]), a.valueNode(call.Args[1]), dotdotdot) + if result != 0 { + a.addressOf(fn.Signature.Results().At(0).Type(), result, ret) + } + return + } + + // Ascertain the context (contour/cgnode) for a particular call. + var obj nodeid + if a.shouldUseContext(fn) { + obj = a.makeFunctionObject(fn, site) // new contour + } else { + obj = a.objectNode(nil, fn) // shared contour + } + a.callEdge(caller, site, obj) + + sig := call.Signature() + + // Copy receiver, if any. + params := a.funcParams(obj) + args := call.Args + if sig.Recv() != nil { + sz := a.sizeof(sig.Recv().Type()) + a.copy(params, a.valueNode(args[0]), sz) + params += nodeid(sz) + args = args[1:] + } + + // Copy actual parameters into formal params block. + // Must loop, since the actuals aren't contiguous. + for i, arg := range args { + sz := a.sizeof(sig.Params().At(i).Type()) + a.copy(params, a.valueNode(arg), sz) + params += nodeid(sz) + } + + // Copy formal results block to actual result. + if result != 0 { + a.copy(result, a.funcResults(obj), a.sizeof(sig.Results())) + } +} + +// genDynamicCall generates constraints for a dynamic function call. +func (a *analysis) genDynamicCall(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) { + // pts(targets) will be the set of possible call targets. + site.targets = a.valueNode(call.Value) + + // We add dynamic closure rules that store the arguments into + // the P-block and load the results from the R-block of each + // function discovered in pts(targets). + + sig := call.Signature() + var offset uint32 = 1 // P/R block starts at offset 1 + for i, arg := range call.Args { + sz := a.sizeof(sig.Params().At(i).Type()) + a.genStore(caller, call.Value, a.valueNode(arg), offset, sz) + offset += sz + } + if result != 0 { + a.genLoad(caller, result, call.Value, offset, a.sizeof(sig.Results())) + } +} + +// genInvoke generates constraints for a dynamic method invocation. +func (a *analysis) genInvoke(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) { + if call.Value.Type() == a.reflectType { + a.genInvokeReflectType(caller, site, call, result) + return + } + + sig := call.Signature() + + // Allocate a contiguous targets/params/results block for this call. + block := a.nextNode() + // pts(targets) will be the set of possible call targets + site.targets = a.addOneNode(sig, "invoke.targets", nil) + p := a.addNodes(sig.Params(), "invoke.params") + r := a.addNodes(sig.Results(), "invoke.results") + + // Copy the actual parameters into the call's params block. + for i, n := 0, sig.Params().Len(); i < n; i++ { + sz := a.sizeof(sig.Params().At(i).Type()) + a.copy(p, a.valueNode(call.Args[i]), sz) + p += nodeid(sz) + } + // Copy the call's results block to the actual results. + if result != 0 { + a.copy(result, r, a.sizeof(sig.Results())) + } + + // We add a dynamic invoke constraint that will connect the + // caller's and the callee's P/R blocks for each discovered + // call target. + a.addConstraint(&invokeConstraint{call.Method, a.valueNode(call.Value), block}) +} + +// genInvokeReflectType is a specialization of genInvoke where the +// receiver type is a reflect.Type, under the assumption that there +// can be at most one implementation of this interface, *reflect.rtype. +// +// (Though this may appear to be an instance of a pattern---method +// calls on interfaces known to have exactly one implementation---in +// practice it occurs rarely, so we special case for reflect.Type.) +// +// In effect we treat this: +// var rt reflect.Type = ... +// rt.F() +// as this: +// rt.(*reflect.rtype).F() +// +func (a *analysis) genInvokeReflectType(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) { + // Unpack receiver into rtype + rtype := a.addOneNode(a.reflectRtypePtr, "rtype.recv", nil) + recv := a.valueNode(call.Value) + a.typeAssert(a.reflectRtypePtr, rtype, recv, true) + + // Look up the concrete method. + fn := a.prog.LookupMethod(a.reflectRtypePtr, call.Method.Pkg(), call.Method.Name()) + + obj := a.makeFunctionObject(fn, site) // new contour for this call + a.callEdge(caller, site, obj) + + // From now on, it's essentially a static call, but little is + // gained by factoring together the code for both cases. + + sig := fn.Signature // concrete method + targets := a.addOneNode(sig, "call.targets", nil) + a.addressOf(sig, targets, obj) // (a singleton) + + // Copy receiver. + params := a.funcParams(obj) + a.copy(params, rtype, 1) + params++ + + // Copy actual parameters into formal P-block. + // Must loop, since the actuals aren't contiguous. + for i, arg := range call.Args { + sz := a.sizeof(sig.Params().At(i).Type()) + a.copy(params, a.valueNode(arg), sz) + params += nodeid(sz) + } + + // Copy formal R-block to actual R-block. + if result != 0 { + a.copy(result, a.funcResults(obj), a.sizeof(sig.Results())) + } +} + +// genCall generates constraints for call instruction instr. +func (a *analysis) genCall(caller *cgnode, instr ssa.CallInstruction) { + call := instr.Common() + + // Intrinsic implementations of built-in functions. + if _, ok := call.Value.(*ssa.Builtin); ok { + a.genBuiltinCall(instr, caller) + return + } + + var result nodeid + if v := instr.Value(); v != nil { + result = a.valueNode(v) + } + + site := &callsite{instr: instr} + if call.StaticCallee() != nil { + a.genStaticCall(caller, site, call, result) + } else if call.IsInvoke() { + a.genInvoke(caller, site, call, result) + } else { + a.genDynamicCall(caller, site, call, result) + } + + caller.sites = append(caller.sites, site) + + if a.log != nil { + // TODO(adonovan): debug: improve log message. + fmt.Fprintf(a.log, "\t%s to targets %s from %s\n", site, site.targets, caller) + } +} + +// objectNode returns the object to which v points, if known. +// In other words, if the points-to set of v is a singleton, it +// returns the sole label, zero otherwise. +// +// We exploit this information to make the generated constraints less +// dynamic. For example, a complex load constraint can be replaced by +// a simple copy constraint when the sole destination is known a priori. +// +// Some SSA instructions always have singletons points-to sets: +// Alloc, Function, Global, MakeChan, MakeClosure, MakeInterface, MakeMap, MakeSlice. +// Others may be singletons depending on their operands: +// FreeVar, Const, Convert, FieldAddr, IndexAddr, Slice. +// +// Idempotent. Objects are created as needed, possibly via recursion +// down the SSA value graph, e.g IndexAddr(FieldAddr(Alloc))). +// +func (a *analysis) objectNode(cgn *cgnode, v ssa.Value) nodeid { + switch v.(type) { + case *ssa.Global, *ssa.Function, *ssa.Const, *ssa.FreeVar: + // Global object. + obj, ok := a.globalobj[v] + if !ok { + switch v := v.(type) { + case *ssa.Global: + obj = a.nextNode() + a.addNodes(mustDeref(v.Type()), "global") + a.endObject(obj, nil, v) + + case *ssa.Function: + obj = a.makeFunctionObject(v, nil) + + case *ssa.Const: + // not addressable + + case *ssa.FreeVar: + // not addressable + } + + if a.log != nil { + fmt.Fprintf(a.log, "\tglobalobj[%s] = n%d\n", v, obj) + } + a.globalobj[v] = obj + } + return obj + } + + // Local object. + obj, ok := a.localobj[v] + if !ok { + switch v := v.(type) { + case *ssa.Alloc: + obj = a.nextNode() + a.addNodes(mustDeref(v.Type()), "alloc") + a.endObject(obj, cgn, v) + + case *ssa.MakeSlice: + obj = a.nextNode() + a.addNodes(sliceToArray(v.Type()), "makeslice") + a.endObject(obj, cgn, v) + + case *ssa.MakeChan: + obj = a.nextNode() + a.addNodes(v.Type().Underlying().(*types.Chan).Elem(), "makechan") + a.endObject(obj, cgn, v) + + case *ssa.MakeMap: + obj = a.nextNode() + tmap := v.Type().Underlying().(*types.Map) + a.addNodes(tmap.Key(), "makemap.key") + elem := a.addNodes(tmap.Elem(), "makemap.value") + + // To update the value field, MapUpdate + // generates store-with-offset constraints which + // the presolver can't model, so we must mark + // those nodes indirect. + for id, end := elem, elem+nodeid(a.sizeof(tmap.Elem())); id < end; id++ { + a.mapValues = append(a.mapValues, id) + } + a.endObject(obj, cgn, v) + + case *ssa.MakeInterface: + tConc := v.X.Type() + obj = a.makeTagged(tConc, cgn, v) + + // Copy the value into it, if nontrivial. + if x := a.valueNode(v.X); x != 0 { + a.copy(obj+1, x, a.sizeof(tConc)) + } + + case *ssa.FieldAddr: + if xobj := a.objectNode(cgn, v.X); xobj != 0 { + obj = xobj + nodeid(a.offsetOf(mustDeref(v.X.Type()), v.Field)) + } + + case *ssa.IndexAddr: + if xobj := a.objectNode(cgn, v.X); xobj != 0 { + obj = xobj + 1 + } + + case *ssa.Slice: + obj = a.objectNode(cgn, v.X) + + case *ssa.Convert: + // TODO(adonovan): opt: handle these cases too: + // - unsafe.Pointer->*T conversion acts like Alloc + // - string->[]byte/[]rune conversion acts like MakeSlice + } + + if a.log != nil { + fmt.Fprintf(a.log, "\tlocalobj[%s] = n%d\n", v.Name(), obj) + } + a.localobj[v] = obj + } + return obj +} + +// genLoad generates constraints for result = *(ptr + val). +func (a *analysis) genLoad(cgn *cgnode, result nodeid, ptr ssa.Value, offset, sizeof uint32) { + if obj := a.objectNode(cgn, ptr); obj != 0 { + // Pre-apply loadConstraint.solve(). + a.copy(result, obj+nodeid(offset), sizeof) + } else { + a.load(result, a.valueNode(ptr), offset, sizeof) + } +} + +// genOffsetAddr generates constraints for a 'v=ptr.field' (FieldAddr) +// or 'v=ptr[*]' (IndexAddr) instruction v. +func (a *analysis) genOffsetAddr(cgn *cgnode, v ssa.Value, ptr nodeid, offset uint32) { + dst := a.valueNode(v) + if obj := a.objectNode(cgn, v); obj != 0 { + // Pre-apply offsetAddrConstraint.solve(). + a.addressOf(v.Type(), dst, obj) + } else { + a.offsetAddr(v.Type(), dst, ptr, offset) + } +} + +// genStore generates constraints for *(ptr + offset) = val. +func (a *analysis) genStore(cgn *cgnode, ptr ssa.Value, val nodeid, offset, sizeof uint32) { + if obj := a.objectNode(cgn, ptr); obj != 0 { + // Pre-apply storeConstraint.solve(). + a.copy(obj+nodeid(offset), val, sizeof) + } else { + a.store(a.valueNode(ptr), val, offset, sizeof) + } +} + +// genInstr generates constraints for instruction instr in context cgn. +func (a *analysis) genInstr(cgn *cgnode, instr ssa.Instruction) { + if a.log != nil { + var prefix string + if val, ok := instr.(ssa.Value); ok { + prefix = val.Name() + " = " + } + fmt.Fprintf(a.log, "; %s%s\n", prefix, instr) + } + + switch instr := instr.(type) { + case *ssa.DebugRef: + // no-op. + + case *ssa.UnOp: + switch instr.Op { + case token.ARROW: // <-x + // We can ignore instr.CommaOk because the node we're + // altering is always at zero offset relative to instr + tElem := instr.X.Type().Underlying().(*types.Chan).Elem() + a.genLoad(cgn, a.valueNode(instr), instr.X, 0, a.sizeof(tElem)) + + case token.MUL: // *x + a.genLoad(cgn, a.valueNode(instr), instr.X, 0, a.sizeof(instr.Type())) + + default: + // NOT, SUB, XOR: no-op. + } + + case *ssa.BinOp: + // All no-ops. + + case ssa.CallInstruction: // *ssa.Call, *ssa.Go, *ssa.Defer + a.genCall(cgn, instr) + + case *ssa.ChangeType: + a.copy(a.valueNode(instr), a.valueNode(instr.X), 1) + + case *ssa.Convert: + a.genConv(instr, cgn) + + case *ssa.Extract: + a.copy(a.valueNode(instr), + a.valueOffsetNode(instr.Tuple, instr.Index), + a.sizeof(instr.Type())) + + case *ssa.FieldAddr: + a.genOffsetAddr(cgn, instr, a.valueNode(instr.X), + a.offsetOf(mustDeref(instr.X.Type()), instr.Field)) + + case *ssa.IndexAddr: + a.genOffsetAddr(cgn, instr, a.valueNode(instr.X), 1) + + case *ssa.Field: + a.copy(a.valueNode(instr), + a.valueOffsetNode(instr.X, instr.Field), + a.sizeof(instr.Type())) + + case *ssa.Index: + a.copy(a.valueNode(instr), 1+a.valueNode(instr.X), a.sizeof(instr.Type())) + + case *ssa.Select: + recv := a.valueOffsetNode(instr, 2) // instr : (index, recvOk, recv0, ... recv_n-1) + for _, st := range instr.States { + elemSize := a.sizeof(st.Chan.Type().Underlying().(*types.Chan).Elem()) + switch st.Dir { + case types.RecvOnly: + a.genLoad(cgn, recv, st.Chan, 0, elemSize) + recv += nodeid(elemSize) + + case types.SendOnly: + a.genStore(cgn, st.Chan, a.valueNode(st.Send), 0, elemSize) + } + } + + case *ssa.Return: + results := a.funcResults(cgn.obj) + for _, r := range instr.Results { + sz := a.sizeof(r.Type()) + a.copy(results, a.valueNode(r), sz) + results += nodeid(sz) + } + + case *ssa.Send: + a.genStore(cgn, instr.Chan, a.valueNode(instr.X), 0, a.sizeof(instr.X.Type())) + + case *ssa.Store: + a.genStore(cgn, instr.Addr, a.valueNode(instr.Val), 0, a.sizeof(instr.Val.Type())) + + case *ssa.Alloc, *ssa.MakeSlice, *ssa.MakeChan, *ssa.MakeMap, *ssa.MakeInterface: + v := instr.(ssa.Value) + a.addressOf(v.Type(), a.valueNode(v), a.objectNode(cgn, v)) + + case *ssa.ChangeInterface: + a.copy(a.valueNode(instr), a.valueNode(instr.X), 1) + + case *ssa.TypeAssert: + a.typeAssert(instr.AssertedType, a.valueNode(instr), a.valueNode(instr.X), true) + + case *ssa.Slice: + a.copy(a.valueNode(instr), a.valueNode(instr.X), 1) + + case *ssa.If, *ssa.Jump: + // no-op. + + case *ssa.Phi: + sz := a.sizeof(instr.Type()) + for _, e := range instr.Edges { + a.copy(a.valueNode(instr), a.valueNode(e), sz) + } + + case *ssa.MakeClosure: + fn := instr.Fn.(*ssa.Function) + a.copy(a.valueNode(instr), a.valueNode(fn), 1) + // Free variables are treated like global variables. + for i, b := range instr.Bindings { + a.copy(a.valueNode(fn.FreeVars[i]), a.valueNode(b), a.sizeof(b.Type())) + } + + case *ssa.RunDefers: + // The analysis is flow insensitive, so we just "call" + // defers as we encounter them. + + case *ssa.Range: + // Do nothing. Next{Iter: *ssa.Range} handles this case. + + case *ssa.Next: + if !instr.IsString { // map + // Assumes that Next is always directly applied to a Range result. + theMap := instr.Iter.(*ssa.Range).X + tMap := theMap.Type().Underlying().(*types.Map) + + ksize := a.sizeof(tMap.Key()) + vsize := a.sizeof(tMap.Elem()) + + // The k/v components of the Next tuple may each be invalid. + tTuple := instr.Type().(*types.Tuple) + + // Load from the map's (k,v) into the tuple's (ok, k, v). + osrc := uint32(0) // offset within map object + odst := uint32(1) // offset within tuple (initially just after 'ok bool') + sz := uint32(0) // amount to copy + + // Is key valid? + if tTuple.At(1).Type() != tInvalid { + sz += ksize + } else { + odst += ksize + osrc += ksize + } + + // Is value valid? + if tTuple.At(2).Type() != tInvalid { + sz += vsize + } + + a.genLoad(cgn, a.valueNode(instr)+nodeid(odst), theMap, osrc, sz) + } + + case *ssa.Lookup: + if tMap, ok := instr.X.Type().Underlying().(*types.Map); ok { + // CommaOk can be ignored: field 0 is a no-op. + ksize := a.sizeof(tMap.Key()) + vsize := a.sizeof(tMap.Elem()) + a.genLoad(cgn, a.valueNode(instr), instr.X, ksize, vsize) + } + + case *ssa.MapUpdate: + tmap := instr.Map.Type().Underlying().(*types.Map) + ksize := a.sizeof(tmap.Key()) + vsize := a.sizeof(tmap.Elem()) + a.genStore(cgn, instr.Map, a.valueNode(instr.Key), 0, ksize) + a.genStore(cgn, instr.Map, a.valueNode(instr.Value), ksize, vsize) + + case *ssa.Panic: + a.copy(a.panicNode, a.valueNode(instr.X), 1) + + default: + panic(fmt.Sprintf("unimplemented: %T", instr)) + } +} + +func (a *analysis) makeCGNode(fn *ssa.Function, obj nodeid, callersite *callsite) *cgnode { + cgn := &cgnode{fn: fn, obj: obj, callersite: callersite} + a.cgnodes = append(a.cgnodes, cgn) + return cgn +} + +// genRootCalls generates the synthetic root of the callgraph and the +// initial calls from it to the analysis scope, such as main, a test +// or a library. +// +func (a *analysis) genRootCalls() *cgnode { + r := a.prog.NewFunction("", new(types.Signature), "root of callgraph") + root := a.makeCGNode(r, 0, nil) + + // TODO(adonovan): make an ssa utility to construct an actual + // root function so we don't need to special-case site-less + // call edges. + + // For each main package, call main.init(), main.main(). + for _, mainPkg := range a.config.Mains { + main := mainPkg.Func("main") + if main == nil { + panic(fmt.Sprintf("%s has no main function", mainPkg)) + } + + targets := a.addOneNode(main.Signature, "root.targets", nil) + site := &callsite{targets: targets} + root.sites = append(root.sites, site) + for _, fn := range [2]*ssa.Function{mainPkg.Func("init"), main} { + if a.log != nil { + fmt.Fprintf(a.log, "\troot call to %s:\n", fn) + } + a.copy(targets, a.valueNode(fn), 1) + } + } + + return root +} + +// genFunc generates constraints for function fn. +func (a *analysis) genFunc(cgn *cgnode) { + fn := cgn.fn + + impl := a.findIntrinsic(fn) + + if a.log != nil { + fmt.Fprintf(a.log, "\n\n==== Generating constraints for %s, %s\n", cgn, cgn.contour()) + + // Hack: don't display body if intrinsic. + if impl != nil { + fn2 := *cgn.fn // copy + fn2.Locals = nil + fn2.Blocks = nil + fn2.WriteTo(a.log) + } else { + cgn.fn.WriteTo(a.log) + } + } + + if impl != nil { + impl(a, cgn) + return + } + + if fn.Blocks == nil { + // External function with no intrinsic treatment. + // We'll warn about calls to such functions at the end. + return + } + + if a.log != nil { + fmt.Fprintln(a.log, "; Creating nodes for local values") + } + + a.localval = make(map[ssa.Value]nodeid) + a.localobj = make(map[ssa.Value]nodeid) + + // The value nodes for the params are in the func object block. + params := a.funcParams(cgn.obj) + for _, p := range fn.Params { + a.setValueNode(p, params, cgn) + params += nodeid(a.sizeof(p.Type())) + } + + // Free variables have global cardinality: + // the outer function sets them with MakeClosure; + // the inner function accesses them with FreeVar. + // + // TODO(adonovan): treat free vars context-sensitively. + + // Create value nodes for all value instructions + // since SSA may contain forward references. + var space [10]*ssa.Value + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + switch instr := instr.(type) { + case *ssa.Range: + // do nothing: it has a funky type, + // and *ssa.Next does all the work. + + case ssa.Value: + var comment string + if a.log != nil { + comment = instr.Name() + } + id := a.addNodes(instr.Type(), comment) + a.setValueNode(instr, id, cgn) + } + + // Record all address-taken functions (for presolver). + rands := instr.Operands(space[:0]) + if call, ok := instr.(ssa.CallInstruction); ok && !call.Common().IsInvoke() { + // Skip CallCommon.Value in "call" mode. + // TODO(adonovan): fix: relies on unspecified ordering. Specify it. + rands = rands[1:] + } + for _, rand := range rands { + if atf, ok := (*rand).(*ssa.Function); ok { + a.atFuncs[atf] = true + } + } + } + } + + // Generate constraints for instructions. + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + a.genInstr(cgn, instr) + } + } + + a.localval = nil + a.localobj = nil +} + +// genMethodsOf generates nodes and constraints for all methods of type T. +func (a *analysis) genMethodsOf(T types.Type) { + itf := isInterface(T) + + // TODO(adonovan): can we skip this entirely if itf is true? + // I think so, but the answer may depend on reflection. + mset := a.prog.MethodSets.MethodSet(T) + for i, n := 0, mset.Len(); i < n; i++ { + m := a.prog.MethodValue(mset.At(i)) + a.valueNode(m) + + if !itf { + // Methods of concrete types are address-taken functions. + a.atFuncs[m] = true + } + } +} + +// generate generates offline constraints for the entire program. +func (a *analysis) generate() { + start("Constraint generation") + if a.log != nil { + fmt.Fprintln(a.log, "==== Generating constraints") + } + + // Create a dummy node since we use the nodeid 0 for + // non-pointerlike variables. + a.addNodes(tInvalid, "(zero)") + + // Create the global node for panic values. + a.panicNode = a.addNodes(tEface, "panic") + + // Create nodes and constraints for all methods of reflect.rtype. + // (Shared contours are used by dynamic calls to reflect.Type + // methods---typically just String().) + if rtype := a.reflectRtypePtr; rtype != nil { + a.genMethodsOf(rtype) + } + + root := a.genRootCalls() + + if a.config.BuildCallGraph { + a.result.CallGraph = callgraph.New(root.fn) + } + + // Create nodes and constraints for all methods of all types + // that are dynamically accessible via reflection or interfaces. + for _, T := range a.prog.RuntimeTypes() { + a.genMethodsOf(T) + } + + // Generate constraints for entire program. + for len(a.genq) > 0 { + cgn := a.genq[0] + a.genq = a.genq[1:] + a.genFunc(cgn) + } + + // The runtime magically allocates os.Args; so should we. + if os := a.prog.ImportedPackage("os"); os != nil { + // In effect: os.Args = new([1]string)[:] + T := types.NewSlice(types.Typ[types.String]) + obj := a.addNodes(sliceToArray(T), "") + a.endObject(obj, nil, "") + a.addressOf(T, a.objectNode(nil, os.Var("Args")), obj) + } + + // Discard generation state, to avoid confusion after node renumbering. + a.panicNode = 0 + a.globalval = nil + a.localval = nil + a.localobj = nil + + stop("Constraint generation") +} diff --git a/vendor/golang.org/x/tools/go/pointer/gen14.go b/vendor/golang.org/x/tools/go/pointer/gen14.go new file mode 100644 index 0000000000..c1bce7c2b1 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/gen14.go @@ -0,0 +1,1315 @@ +// Copyright 2013 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.5 + +package pointer + +// This file defines the constraint generation phase. + +// TODO(adonovan): move the constraint definitions and the store() etc +// functions which add them (and are also used by the solver) into a +// new file, constraints.go. + +import ( + "fmt" + "go/token" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types" +) + +var ( + tEface = types.NewInterface(nil, nil).Complete() + tInvalid = types.Typ[types.Invalid] + tUnsafePtr = types.Typ[types.UnsafePointer] +) + +// ---------- Node creation ---------- + +// nextNode returns the index of the next unused node. +func (a *analysis) nextNode() nodeid { + return nodeid(len(a.nodes)) +} + +// addNodes creates nodes for all scalar elements in type typ, and +// returns the id of the first one, or zero if the type was +// analytically uninteresting. +// +// comment explains the origin of the nodes, as a debugging aid. +// +func (a *analysis) addNodes(typ types.Type, comment string) nodeid { + id := a.nextNode() + for _, fi := range a.flatten(typ) { + a.addOneNode(fi.typ, comment, fi) + } + if id == a.nextNode() { + return 0 // type contained no pointers + } + return id +} + +// addOneNode creates a single node with type typ, and returns its id. +// +// typ should generally be scalar (except for tagged.T nodes +// and struct/array identity nodes). Use addNodes for non-scalar types. +// +// comment explains the origin of the nodes, as a debugging aid. +// subelement indicates the subelement, e.g. ".a.b[*].c". +// +func (a *analysis) addOneNode(typ types.Type, comment string, subelement *fieldInfo) nodeid { + id := a.nextNode() + a.nodes = append(a.nodes, &node{typ: typ, subelement: subelement, solve: new(solverState)}) + if a.log != nil { + fmt.Fprintf(a.log, "\tcreate n%d %s for %s%s\n", + id, typ, comment, subelement.path()) + } + return id +} + +// setValueNode associates node id with the value v. +// cgn identifies the context iff v is a local variable. +// +func (a *analysis) setValueNode(v ssa.Value, id nodeid, cgn *cgnode) { + if cgn != nil { + a.localval[v] = id + } else { + a.globalval[v] = id + } + if a.log != nil { + fmt.Fprintf(a.log, "\tval[%s] = n%d (%T)\n", v.Name(), id, v) + } + + // Due to context-sensitivity, we may encounter the same Value + // in many contexts. We merge them to a canonical node, since + // that's what all clients want. + + // Record the (v, id) relation if the client has queried pts(v). + if _, ok := a.config.Queries[v]; ok { + t := v.Type() + ptr, ok := a.result.Queries[v] + if !ok { + // First time? Create the canonical query node. + ptr = Pointer{a, a.addNodes(t, "query")} + a.result.Queries[v] = ptr + } + a.result.Queries[v] = ptr + a.copy(ptr.n, id, a.sizeof(t)) + } + + // Record the (*v, id) relation if the client has queried pts(*v). + if _, ok := a.config.IndirectQueries[v]; ok { + t := v.Type() + ptr, ok := a.result.IndirectQueries[v] + if !ok { + // First time? Create the canonical indirect query node. + ptr = Pointer{a, a.addNodes(v.Type(), "query.indirect")} + a.result.IndirectQueries[v] = ptr + } + a.genLoad(cgn, ptr.n, v, 0, a.sizeof(t)) + } +} + +// endObject marks the end of a sequence of calls to addNodes denoting +// a single object allocation. +// +// obj is the start node of the object, from a prior call to nextNode. +// Its size, flags and optional data will be updated. +// +func (a *analysis) endObject(obj nodeid, cgn *cgnode, data interface{}) *object { + // Ensure object is non-empty by padding; + // the pad will be the object node. + size := uint32(a.nextNode() - obj) + if size == 0 { + a.addOneNode(tInvalid, "padding", nil) + } + objNode := a.nodes[obj] + o := &object{ + size: size, // excludes padding + cgn: cgn, + data: data, + } + objNode.obj = o + + return o +} + +// makeFunctionObject creates and returns a new function object +// (contour) for fn, and returns the id of its first node. It also +// enqueues fn for subsequent constraint generation. +// +// For a context-sensitive contour, callersite identifies the sole +// callsite; for shared contours, caller is nil. +// +func (a *analysis) makeFunctionObject(fn *ssa.Function, callersite *callsite) nodeid { + if a.log != nil { + fmt.Fprintf(a.log, "\t---- makeFunctionObject %s\n", fn) + } + + // obj is the function object (identity, params, results). + obj := a.nextNode() + cgn := a.makeCGNode(fn, obj, callersite) + sig := fn.Signature + a.addOneNode(sig, "func.cgnode", nil) // (scalar with Signature type) + if recv := sig.Recv(); recv != nil { + a.addNodes(recv.Type(), "func.recv") + } + a.addNodes(sig.Params(), "func.params") + a.addNodes(sig.Results(), "func.results") + a.endObject(obj, cgn, fn).flags |= otFunction + + if a.log != nil { + fmt.Fprintf(a.log, "\t----\n") + } + + // Queue it up for constraint processing. + a.genq = append(a.genq, cgn) + + return obj +} + +// makeTagged creates a tagged object of type typ. +func (a *analysis) makeTagged(typ types.Type, cgn *cgnode, data interface{}) nodeid { + obj := a.addOneNode(typ, "tagged.T", nil) // NB: type may be non-scalar! + a.addNodes(typ, "tagged.v") + a.endObject(obj, cgn, data).flags |= otTagged + return obj +} + +// makeRtype returns the canonical tagged object of type *rtype whose +// payload points to the sole rtype object for T. +// +// TODO(adonovan): move to reflect.go; it's part of the solver really. +// +func (a *analysis) makeRtype(T types.Type) nodeid { + if v := a.rtypes.At(T); v != nil { + return v.(nodeid) + } + + // Create the object for the reflect.rtype itself, which is + // ordinarily a large struct but here a single node will do. + obj := a.nextNode() + a.addOneNode(T, "reflect.rtype", nil) + a.endObject(obj, nil, T) + + id := a.makeTagged(a.reflectRtypePtr, nil, T) + a.nodes[id+1].typ = T // trick (each *rtype tagged object is a singleton) + a.addressOf(a.reflectRtypePtr, id+1, obj) + + a.rtypes.Set(T, id) + return id +} + +// rtypeValue returns the type of the *reflect.rtype-tagged object obj. +func (a *analysis) rtypeTaggedValue(obj nodeid) types.Type { + tDyn, t, _ := a.taggedValue(obj) + if tDyn != a.reflectRtypePtr { + panic(fmt.Sprintf("not a *reflect.rtype-tagged object: obj=n%d tag=%v payload=n%d", obj, tDyn, t)) + } + return a.nodes[t].typ +} + +// valueNode returns the id of the value node for v, creating it (and +// the association) as needed. It may return zero for uninteresting +// values containing no pointers. +// +func (a *analysis) valueNode(v ssa.Value) nodeid { + // Value nodes for locals are created en masse by genFunc. + if id, ok := a.localval[v]; ok { + return id + } + + // Value nodes for globals are created on demand. + id, ok := a.globalval[v] + if !ok { + var comment string + if a.log != nil { + comment = v.String() + } + id = a.addNodes(v.Type(), comment) + if obj := a.objectNode(nil, v); obj != 0 { + a.addressOf(v.Type(), id, obj) + } + a.setValueNode(v, id, nil) + } + return id +} + +// valueOffsetNode ascertains the node for tuple/struct value v, +// then returns the node for its subfield #index. +// +func (a *analysis) valueOffsetNode(v ssa.Value, index int) nodeid { + id := a.valueNode(v) + if id == 0 { + panic(fmt.Sprintf("cannot offset within n0: %s = %s", v.Name(), v)) + } + return id + nodeid(a.offsetOf(v.Type(), index)) +} + +// isTaggedObject reports whether object obj is a tagged object. +func (a *analysis) isTaggedObject(obj nodeid) bool { + return a.nodes[obj].obj.flags&otTagged != 0 +} + +// taggedValue returns the dynamic type tag, the (first node of the) +// payload, and the indirect flag of the tagged object starting at id. +// Panic ensues if !isTaggedObject(id). +// +func (a *analysis) taggedValue(obj nodeid) (tDyn types.Type, v nodeid, indirect bool) { + n := a.nodes[obj] + flags := n.obj.flags + if flags&otTagged == 0 { + panic(fmt.Sprintf("not a tagged object: n%d", obj)) + } + return n.typ, obj + 1, flags&otIndirect != 0 +} + +// funcParams returns the first node of the params (P) block of the +// function whose object node (obj.flags&otFunction) is id. +// +func (a *analysis) funcParams(id nodeid) nodeid { + n := a.nodes[id] + if n.obj == nil || n.obj.flags&otFunction == 0 { + panic(fmt.Sprintf("funcParams(n%d): not a function object block", id)) + } + return id + 1 +} + +// funcResults returns the first node of the results (R) block of the +// function whose object node (obj.flags&otFunction) is id. +// +func (a *analysis) funcResults(id nodeid) nodeid { + n := a.nodes[id] + if n.obj == nil || n.obj.flags&otFunction == 0 { + panic(fmt.Sprintf("funcResults(n%d): not a function object block", id)) + } + sig := n.typ.(*types.Signature) + id += 1 + nodeid(a.sizeof(sig.Params())) + if sig.Recv() != nil { + id += nodeid(a.sizeof(sig.Recv().Type())) + } + return id +} + +// ---------- Constraint creation ---------- + +// copy creates a constraint of the form dst = src. +// sizeof is the width (in logical fields) of the copied type. +// +func (a *analysis) copy(dst, src nodeid, sizeof uint32) { + if src == dst || sizeof == 0 { + return // trivial + } + if src == 0 || dst == 0 { + panic(fmt.Sprintf("ill-typed copy dst=n%d src=n%d", dst, src)) + } + for i := uint32(0); i < sizeof; i++ { + a.addConstraint(©Constraint{dst, src}) + src++ + dst++ + } +} + +// addressOf creates a constraint of the form id = &obj. +// T is the type of the address. +func (a *analysis) addressOf(T types.Type, id, obj nodeid) { + if id == 0 { + panic("addressOf: zero id") + } + if obj == 0 { + panic("addressOf: zero obj") + } + if a.shouldTrack(T) { + a.addConstraint(&addrConstraint{id, obj}) + } +} + +// load creates a load constraint of the form dst = src[offset]. +// offset is the pointer offset in logical fields. +// sizeof is the width (in logical fields) of the loaded type. +// +func (a *analysis) load(dst, src nodeid, offset, sizeof uint32) { + if dst == 0 { + return // load of non-pointerlike value + } + if src == 0 && dst == 0 { + return // non-pointerlike operation + } + if src == 0 || dst == 0 { + panic(fmt.Sprintf("ill-typed load dst=n%d src=n%d", dst, src)) + } + for i := uint32(0); i < sizeof; i++ { + a.addConstraint(&loadConstraint{offset, dst, src}) + offset++ + dst++ + } +} + +// store creates a store constraint of the form dst[offset] = src. +// offset is the pointer offset in logical fields. +// sizeof is the width (in logical fields) of the stored type. +// +func (a *analysis) store(dst, src nodeid, offset uint32, sizeof uint32) { + if src == 0 { + return // store of non-pointerlike value + } + if src == 0 && dst == 0 { + return // non-pointerlike operation + } + if src == 0 || dst == 0 { + panic(fmt.Sprintf("ill-typed store dst=n%d src=n%d", dst, src)) + } + for i := uint32(0); i < sizeof; i++ { + a.addConstraint(&storeConstraint{offset, dst, src}) + offset++ + src++ + } +} + +// offsetAddr creates an offsetAddr constraint of the form dst = &src.#offset. +// offset is the field offset in logical fields. +// T is the type of the address. +// +func (a *analysis) offsetAddr(T types.Type, dst, src nodeid, offset uint32) { + if !a.shouldTrack(T) { + return + } + if offset == 0 { + // Simplify dst = &src->f0 + // to dst = src + // (NB: this optimisation is defeated by the identity + // field prepended to struct and array objects.) + a.copy(dst, src, 1) + } else { + a.addConstraint(&offsetAddrConstraint{offset, dst, src}) + } +} + +// typeAssert creates a typeFilter or untag constraint of the form dst = src.(T): +// typeFilter for an interface, untag for a concrete type. +// The exact flag is specified as for untagConstraint. +// +func (a *analysis) typeAssert(T types.Type, dst, src nodeid, exact bool) { + if isInterface(T) { + a.addConstraint(&typeFilterConstraint{T, dst, src}) + } else { + a.addConstraint(&untagConstraint{T, dst, src, exact}) + } +} + +// addConstraint adds c to the constraint set. +func (a *analysis) addConstraint(c constraint) { + a.constraints = append(a.constraints, c) + if a.log != nil { + fmt.Fprintf(a.log, "\t%s\n", c) + } +} + +// copyElems generates load/store constraints for *dst = *src, +// where src and dst are slices or *arrays. +// +func (a *analysis) copyElems(cgn *cgnode, typ types.Type, dst, src ssa.Value) { + tmp := a.addNodes(typ, "copy") + sz := a.sizeof(typ) + a.genLoad(cgn, tmp, src, 1, sz) + a.genStore(cgn, dst, tmp, 1, sz) +} + +// ---------- Constraint generation ---------- + +// genConv generates constraints for the conversion operation conv. +func (a *analysis) genConv(conv *ssa.Convert, cgn *cgnode) { + res := a.valueNode(conv) + if res == 0 { + return // result is non-pointerlike + } + + tSrc := conv.X.Type() + tDst := conv.Type() + + switch utSrc := tSrc.Underlying().(type) { + case *types.Slice: + // []byte/[]rune -> string? + return + + case *types.Pointer: + // *T -> unsafe.Pointer? + if tDst.Underlying() == tUnsafePtr { + return // we don't model unsafe aliasing (unsound) + } + + case *types.Basic: + switch tDst.Underlying().(type) { + case *types.Pointer: + // Treat unsafe.Pointer->*T conversions like + // new(T) and create an unaliased object. + if utSrc == tUnsafePtr { + obj := a.addNodes(mustDeref(tDst), "unsafe.Pointer conversion") + a.endObject(obj, cgn, conv) + a.addressOf(tDst, res, obj) + return + } + + case *types.Slice: + // string -> []byte/[]rune (or named aliases)? + if utSrc.Info()&types.IsString != 0 { + obj := a.addNodes(sliceToArray(tDst), "convert") + a.endObject(obj, cgn, conv) + a.addressOf(tDst, res, obj) + return + } + + case *types.Basic: + // All basic-to-basic type conversions are no-ops. + // This includes uintptr<->unsafe.Pointer conversions, + // which we (unsoundly) ignore. + return + } + } + + panic(fmt.Sprintf("illegal *ssa.Convert %s -> %s: %s", tSrc, tDst, conv.Parent())) +} + +// genAppend generates constraints for a call to append. +func (a *analysis) genAppend(instr *ssa.Call, cgn *cgnode) { + // Consider z = append(x, y). y is optional. + // This may allocate a new [1]T array; call its object w. + // We get the following constraints: + // z = x + // z = &w + // *z = *y + + x := instr.Call.Args[0] + + z := instr + a.copy(a.valueNode(z), a.valueNode(x), 1) // z = x + + if len(instr.Call.Args) == 1 { + return // no allocation for z = append(x) or _ = append(x). + } + + // TODO(adonovan): test append([]byte, ...string) []byte. + + y := instr.Call.Args[1] + tArray := sliceToArray(instr.Call.Args[0].Type()) + + var w nodeid + w = a.nextNode() + a.addNodes(tArray, "append") + a.endObject(w, cgn, instr) + + a.copyElems(cgn, tArray.Elem(), z, y) // *z = *y + a.addressOf(instr.Type(), a.valueNode(z), w) // z = &w +} + +// genBuiltinCall generates contraints for a call to a built-in. +func (a *analysis) genBuiltinCall(instr ssa.CallInstruction, cgn *cgnode) { + call := instr.Common() + switch call.Value.(*ssa.Builtin).Name() { + case "append": + // Safe cast: append cannot appear in a go or defer statement. + a.genAppend(instr.(*ssa.Call), cgn) + + case "copy": + tElem := call.Args[0].Type().Underlying().(*types.Slice).Elem() + a.copyElems(cgn, tElem, call.Args[0], call.Args[1]) + + case "panic": + a.copy(a.panicNode, a.valueNode(call.Args[0]), 1) + + case "recover": + if v := instr.Value(); v != nil { + a.copy(a.valueNode(v), a.panicNode, 1) + } + + case "print": + // In the tests, the probe might be the sole reference + // to its arg, so make sure we create nodes for it. + if len(call.Args) > 0 { + a.valueNode(call.Args[0]) + } + + case "ssa:wrapnilchk": + a.copy(a.valueNode(instr.Value()), a.valueNode(call.Args[0]), 1) + + default: + // No-ops: close len cap real imag complex print println delete. + } +} + +// shouldUseContext defines the context-sensitivity policy. It +// returns true if we should analyse all static calls to fn anew. +// +// Obviously this interface rather limits how much freedom we have to +// choose a policy. The current policy, rather arbitrarily, is true +// for intrinsics and accessor methods (actually: short, single-block, +// call-free functions). This is just a starting point. +// +func (a *analysis) shouldUseContext(fn *ssa.Function) bool { + if a.findIntrinsic(fn) != nil { + return true // treat intrinsics context-sensitively + } + if len(fn.Blocks) != 1 { + return false // too expensive + } + blk := fn.Blocks[0] + if len(blk.Instrs) > 10 { + return false // too expensive + } + if fn.Synthetic != "" && (fn.Pkg == nil || fn != fn.Pkg.Func("init")) { + return true // treat synthetic wrappers context-sensitively + } + for _, instr := range blk.Instrs { + switch instr := instr.(type) { + case ssa.CallInstruction: + // Disallow function calls (except to built-ins) + // because of the danger of unbounded recursion. + if _, ok := instr.Common().Value.(*ssa.Builtin); !ok { + return false + } + } + } + return true +} + +// genStaticCall generates constraints for a statically dispatched function call. +func (a *analysis) genStaticCall(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) { + fn := call.StaticCallee() + + // Special cases for inlined intrinsics. + switch fn { + case a.runtimeSetFinalizer: + // Inline SetFinalizer so the call appears direct. + site.targets = a.addOneNode(tInvalid, "SetFinalizer.targets", nil) + a.addConstraint(&runtimeSetFinalizerConstraint{ + targets: site.targets, + x: a.valueNode(call.Args[0]), + f: a.valueNode(call.Args[1]), + }) + return + + case a.reflectValueCall: + // Inline (reflect.Value).Call so the call appears direct. + dotdotdot := false + ret := reflectCallImpl(a, caller, site, a.valueNode(call.Args[0]), a.valueNode(call.Args[1]), dotdotdot) + if result != 0 { + a.addressOf(fn.Signature.Results().At(0).Type(), result, ret) + } + return + } + + // Ascertain the context (contour/cgnode) for a particular call. + var obj nodeid + if a.shouldUseContext(fn) { + obj = a.makeFunctionObject(fn, site) // new contour + } else { + obj = a.objectNode(nil, fn) // shared contour + } + a.callEdge(caller, site, obj) + + sig := call.Signature() + + // Copy receiver, if any. + params := a.funcParams(obj) + args := call.Args + if sig.Recv() != nil { + sz := a.sizeof(sig.Recv().Type()) + a.copy(params, a.valueNode(args[0]), sz) + params += nodeid(sz) + args = args[1:] + } + + // Copy actual parameters into formal params block. + // Must loop, since the actuals aren't contiguous. + for i, arg := range args { + sz := a.sizeof(sig.Params().At(i).Type()) + a.copy(params, a.valueNode(arg), sz) + params += nodeid(sz) + } + + // Copy formal results block to actual result. + if result != 0 { + a.copy(result, a.funcResults(obj), a.sizeof(sig.Results())) + } +} + +// genDynamicCall generates constraints for a dynamic function call. +func (a *analysis) genDynamicCall(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) { + // pts(targets) will be the set of possible call targets. + site.targets = a.valueNode(call.Value) + + // We add dynamic closure rules that store the arguments into + // the P-block and load the results from the R-block of each + // function discovered in pts(targets). + + sig := call.Signature() + var offset uint32 = 1 // P/R block starts at offset 1 + for i, arg := range call.Args { + sz := a.sizeof(sig.Params().At(i).Type()) + a.genStore(caller, call.Value, a.valueNode(arg), offset, sz) + offset += sz + } + if result != 0 { + a.genLoad(caller, result, call.Value, offset, a.sizeof(sig.Results())) + } +} + +// genInvoke generates constraints for a dynamic method invocation. +func (a *analysis) genInvoke(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) { + if call.Value.Type() == a.reflectType { + a.genInvokeReflectType(caller, site, call, result) + return + } + + sig := call.Signature() + + // Allocate a contiguous targets/params/results block for this call. + block := a.nextNode() + // pts(targets) will be the set of possible call targets + site.targets = a.addOneNode(sig, "invoke.targets", nil) + p := a.addNodes(sig.Params(), "invoke.params") + r := a.addNodes(sig.Results(), "invoke.results") + + // Copy the actual parameters into the call's params block. + for i, n := 0, sig.Params().Len(); i < n; i++ { + sz := a.sizeof(sig.Params().At(i).Type()) + a.copy(p, a.valueNode(call.Args[i]), sz) + p += nodeid(sz) + } + // Copy the call's results block to the actual results. + if result != 0 { + a.copy(result, r, a.sizeof(sig.Results())) + } + + // We add a dynamic invoke constraint that will connect the + // caller's and the callee's P/R blocks for each discovered + // call target. + a.addConstraint(&invokeConstraint{call.Method, a.valueNode(call.Value), block}) +} + +// genInvokeReflectType is a specialization of genInvoke where the +// receiver type is a reflect.Type, under the assumption that there +// can be at most one implementation of this interface, *reflect.rtype. +// +// (Though this may appear to be an instance of a pattern---method +// calls on interfaces known to have exactly one implementation---in +// practice it occurs rarely, so we special case for reflect.Type.) +// +// In effect we treat this: +// var rt reflect.Type = ... +// rt.F() +// as this: +// rt.(*reflect.rtype).F() +// +func (a *analysis) genInvokeReflectType(caller *cgnode, site *callsite, call *ssa.CallCommon, result nodeid) { + // Unpack receiver into rtype + rtype := a.addOneNode(a.reflectRtypePtr, "rtype.recv", nil) + recv := a.valueNode(call.Value) + a.typeAssert(a.reflectRtypePtr, rtype, recv, true) + + // Look up the concrete method. + fn := a.prog.LookupMethod(a.reflectRtypePtr, call.Method.Pkg(), call.Method.Name()) + + obj := a.makeFunctionObject(fn, site) // new contour for this call + a.callEdge(caller, site, obj) + + // From now on, it's essentially a static call, but little is + // gained by factoring together the code for both cases. + + sig := fn.Signature // concrete method + targets := a.addOneNode(sig, "call.targets", nil) + a.addressOf(sig, targets, obj) // (a singleton) + + // Copy receiver. + params := a.funcParams(obj) + a.copy(params, rtype, 1) + params++ + + // Copy actual parameters into formal P-block. + // Must loop, since the actuals aren't contiguous. + for i, arg := range call.Args { + sz := a.sizeof(sig.Params().At(i).Type()) + a.copy(params, a.valueNode(arg), sz) + params += nodeid(sz) + } + + // Copy formal R-block to actual R-block. + if result != 0 { + a.copy(result, a.funcResults(obj), a.sizeof(sig.Results())) + } +} + +// genCall generates constraints for call instruction instr. +func (a *analysis) genCall(caller *cgnode, instr ssa.CallInstruction) { + call := instr.Common() + + // Intrinsic implementations of built-in functions. + if _, ok := call.Value.(*ssa.Builtin); ok { + a.genBuiltinCall(instr, caller) + return + } + + var result nodeid + if v := instr.Value(); v != nil { + result = a.valueNode(v) + } + + site := &callsite{instr: instr} + if call.StaticCallee() != nil { + a.genStaticCall(caller, site, call, result) + } else if call.IsInvoke() { + a.genInvoke(caller, site, call, result) + } else { + a.genDynamicCall(caller, site, call, result) + } + + caller.sites = append(caller.sites, site) + + if a.log != nil { + // TODO(adonovan): debug: improve log message. + fmt.Fprintf(a.log, "\t%s to targets %s from %s\n", site, site.targets, caller) + } +} + +// objectNode returns the object to which v points, if known. +// In other words, if the points-to set of v is a singleton, it +// returns the sole label, zero otherwise. +// +// We exploit this information to make the generated constraints less +// dynamic. For example, a complex load constraint can be replaced by +// a simple copy constraint when the sole destination is known a priori. +// +// Some SSA instructions always have singletons points-to sets: +// Alloc, Function, Global, MakeChan, MakeClosure, MakeInterface, MakeMap, MakeSlice. +// Others may be singletons depending on their operands: +// FreeVar, Const, Convert, FieldAddr, IndexAddr, Slice. +// +// Idempotent. Objects are created as needed, possibly via recursion +// down the SSA value graph, e.g IndexAddr(FieldAddr(Alloc))). +// +func (a *analysis) objectNode(cgn *cgnode, v ssa.Value) nodeid { + switch v.(type) { + case *ssa.Global, *ssa.Function, *ssa.Const, *ssa.FreeVar: + // Global object. + obj, ok := a.globalobj[v] + if !ok { + switch v := v.(type) { + case *ssa.Global: + obj = a.nextNode() + a.addNodes(mustDeref(v.Type()), "global") + a.endObject(obj, nil, v) + + case *ssa.Function: + obj = a.makeFunctionObject(v, nil) + + case *ssa.Const: + // not addressable + + case *ssa.FreeVar: + // not addressable + } + + if a.log != nil { + fmt.Fprintf(a.log, "\tglobalobj[%s] = n%d\n", v, obj) + } + a.globalobj[v] = obj + } + return obj + } + + // Local object. + obj, ok := a.localobj[v] + if !ok { + switch v := v.(type) { + case *ssa.Alloc: + obj = a.nextNode() + a.addNodes(mustDeref(v.Type()), "alloc") + a.endObject(obj, cgn, v) + + case *ssa.MakeSlice: + obj = a.nextNode() + a.addNodes(sliceToArray(v.Type()), "makeslice") + a.endObject(obj, cgn, v) + + case *ssa.MakeChan: + obj = a.nextNode() + a.addNodes(v.Type().Underlying().(*types.Chan).Elem(), "makechan") + a.endObject(obj, cgn, v) + + case *ssa.MakeMap: + obj = a.nextNode() + tmap := v.Type().Underlying().(*types.Map) + a.addNodes(tmap.Key(), "makemap.key") + elem := a.addNodes(tmap.Elem(), "makemap.value") + + // To update the value field, MapUpdate + // generates store-with-offset constraints which + // the presolver can't model, so we must mark + // those nodes indirect. + for id, end := elem, elem+nodeid(a.sizeof(tmap.Elem())); id < end; id++ { + a.mapValues = append(a.mapValues, id) + } + a.endObject(obj, cgn, v) + + case *ssa.MakeInterface: + tConc := v.X.Type() + obj = a.makeTagged(tConc, cgn, v) + + // Copy the value into it, if nontrivial. + if x := a.valueNode(v.X); x != 0 { + a.copy(obj+1, x, a.sizeof(tConc)) + } + + case *ssa.FieldAddr: + if xobj := a.objectNode(cgn, v.X); xobj != 0 { + obj = xobj + nodeid(a.offsetOf(mustDeref(v.X.Type()), v.Field)) + } + + case *ssa.IndexAddr: + if xobj := a.objectNode(cgn, v.X); xobj != 0 { + obj = xobj + 1 + } + + case *ssa.Slice: + obj = a.objectNode(cgn, v.X) + + case *ssa.Convert: + // TODO(adonovan): opt: handle these cases too: + // - unsafe.Pointer->*T conversion acts like Alloc + // - string->[]byte/[]rune conversion acts like MakeSlice + } + + if a.log != nil { + fmt.Fprintf(a.log, "\tlocalobj[%s] = n%d\n", v.Name(), obj) + } + a.localobj[v] = obj + } + return obj +} + +// genLoad generates constraints for result = *(ptr + val). +func (a *analysis) genLoad(cgn *cgnode, result nodeid, ptr ssa.Value, offset, sizeof uint32) { + if obj := a.objectNode(cgn, ptr); obj != 0 { + // Pre-apply loadConstraint.solve(). + a.copy(result, obj+nodeid(offset), sizeof) + } else { + a.load(result, a.valueNode(ptr), offset, sizeof) + } +} + +// genOffsetAddr generates constraints for a 'v=ptr.field' (FieldAddr) +// or 'v=ptr[*]' (IndexAddr) instruction v. +func (a *analysis) genOffsetAddr(cgn *cgnode, v ssa.Value, ptr nodeid, offset uint32) { + dst := a.valueNode(v) + if obj := a.objectNode(cgn, v); obj != 0 { + // Pre-apply offsetAddrConstraint.solve(). + a.addressOf(v.Type(), dst, obj) + } else { + a.offsetAddr(v.Type(), dst, ptr, offset) + } +} + +// genStore generates constraints for *(ptr + offset) = val. +func (a *analysis) genStore(cgn *cgnode, ptr ssa.Value, val nodeid, offset, sizeof uint32) { + if obj := a.objectNode(cgn, ptr); obj != 0 { + // Pre-apply storeConstraint.solve(). + a.copy(obj+nodeid(offset), val, sizeof) + } else { + a.store(a.valueNode(ptr), val, offset, sizeof) + } +} + +// genInstr generates constraints for instruction instr in context cgn. +func (a *analysis) genInstr(cgn *cgnode, instr ssa.Instruction) { + if a.log != nil { + var prefix string + if val, ok := instr.(ssa.Value); ok { + prefix = val.Name() + " = " + } + fmt.Fprintf(a.log, "; %s%s\n", prefix, instr) + } + + switch instr := instr.(type) { + case *ssa.DebugRef: + // no-op. + + case *ssa.UnOp: + switch instr.Op { + case token.ARROW: // <-x + // We can ignore instr.CommaOk because the node we're + // altering is always at zero offset relative to instr + tElem := instr.X.Type().Underlying().(*types.Chan).Elem() + a.genLoad(cgn, a.valueNode(instr), instr.X, 0, a.sizeof(tElem)) + + case token.MUL: // *x + a.genLoad(cgn, a.valueNode(instr), instr.X, 0, a.sizeof(instr.Type())) + + default: + // NOT, SUB, XOR: no-op. + } + + case *ssa.BinOp: + // All no-ops. + + case ssa.CallInstruction: // *ssa.Call, *ssa.Go, *ssa.Defer + a.genCall(cgn, instr) + + case *ssa.ChangeType: + a.copy(a.valueNode(instr), a.valueNode(instr.X), 1) + + case *ssa.Convert: + a.genConv(instr, cgn) + + case *ssa.Extract: + a.copy(a.valueNode(instr), + a.valueOffsetNode(instr.Tuple, instr.Index), + a.sizeof(instr.Type())) + + case *ssa.FieldAddr: + a.genOffsetAddr(cgn, instr, a.valueNode(instr.X), + a.offsetOf(mustDeref(instr.X.Type()), instr.Field)) + + case *ssa.IndexAddr: + a.genOffsetAddr(cgn, instr, a.valueNode(instr.X), 1) + + case *ssa.Field: + a.copy(a.valueNode(instr), + a.valueOffsetNode(instr.X, instr.Field), + a.sizeof(instr.Type())) + + case *ssa.Index: + a.copy(a.valueNode(instr), 1+a.valueNode(instr.X), a.sizeof(instr.Type())) + + case *ssa.Select: + recv := a.valueOffsetNode(instr, 2) // instr : (index, recvOk, recv0, ... recv_n-1) + for _, st := range instr.States { + elemSize := a.sizeof(st.Chan.Type().Underlying().(*types.Chan).Elem()) + switch st.Dir { + case types.RecvOnly: + a.genLoad(cgn, recv, st.Chan, 0, elemSize) + recv += nodeid(elemSize) + + case types.SendOnly: + a.genStore(cgn, st.Chan, a.valueNode(st.Send), 0, elemSize) + } + } + + case *ssa.Return: + results := a.funcResults(cgn.obj) + for _, r := range instr.Results { + sz := a.sizeof(r.Type()) + a.copy(results, a.valueNode(r), sz) + results += nodeid(sz) + } + + case *ssa.Send: + a.genStore(cgn, instr.Chan, a.valueNode(instr.X), 0, a.sizeof(instr.X.Type())) + + case *ssa.Store: + a.genStore(cgn, instr.Addr, a.valueNode(instr.Val), 0, a.sizeof(instr.Val.Type())) + + case *ssa.Alloc, *ssa.MakeSlice, *ssa.MakeChan, *ssa.MakeMap, *ssa.MakeInterface: + v := instr.(ssa.Value) + a.addressOf(v.Type(), a.valueNode(v), a.objectNode(cgn, v)) + + case *ssa.ChangeInterface: + a.copy(a.valueNode(instr), a.valueNode(instr.X), 1) + + case *ssa.TypeAssert: + a.typeAssert(instr.AssertedType, a.valueNode(instr), a.valueNode(instr.X), true) + + case *ssa.Slice: + a.copy(a.valueNode(instr), a.valueNode(instr.X), 1) + + case *ssa.If, *ssa.Jump: + // no-op. + + case *ssa.Phi: + sz := a.sizeof(instr.Type()) + for _, e := range instr.Edges { + a.copy(a.valueNode(instr), a.valueNode(e), sz) + } + + case *ssa.MakeClosure: + fn := instr.Fn.(*ssa.Function) + a.copy(a.valueNode(instr), a.valueNode(fn), 1) + // Free variables are treated like global variables. + for i, b := range instr.Bindings { + a.copy(a.valueNode(fn.FreeVars[i]), a.valueNode(b), a.sizeof(b.Type())) + } + + case *ssa.RunDefers: + // The analysis is flow insensitive, so we just "call" + // defers as we encounter them. + + case *ssa.Range: + // Do nothing. Next{Iter: *ssa.Range} handles this case. + + case *ssa.Next: + if !instr.IsString { // map + // Assumes that Next is always directly applied to a Range result. + theMap := instr.Iter.(*ssa.Range).X + tMap := theMap.Type().Underlying().(*types.Map) + + ksize := a.sizeof(tMap.Key()) + vsize := a.sizeof(tMap.Elem()) + + // The k/v components of the Next tuple may each be invalid. + tTuple := instr.Type().(*types.Tuple) + + // Load from the map's (k,v) into the tuple's (ok, k, v). + osrc := uint32(0) // offset within map object + odst := uint32(1) // offset within tuple (initially just after 'ok bool') + sz := uint32(0) // amount to copy + + // Is key valid? + if tTuple.At(1).Type() != tInvalid { + sz += ksize + } else { + odst += ksize + osrc += ksize + } + + // Is value valid? + if tTuple.At(2).Type() != tInvalid { + sz += vsize + } + + a.genLoad(cgn, a.valueNode(instr)+nodeid(odst), theMap, osrc, sz) + } + + case *ssa.Lookup: + if tMap, ok := instr.X.Type().Underlying().(*types.Map); ok { + // CommaOk can be ignored: field 0 is a no-op. + ksize := a.sizeof(tMap.Key()) + vsize := a.sizeof(tMap.Elem()) + a.genLoad(cgn, a.valueNode(instr), instr.X, ksize, vsize) + } + + case *ssa.MapUpdate: + tmap := instr.Map.Type().Underlying().(*types.Map) + ksize := a.sizeof(tmap.Key()) + vsize := a.sizeof(tmap.Elem()) + a.genStore(cgn, instr.Map, a.valueNode(instr.Key), 0, ksize) + a.genStore(cgn, instr.Map, a.valueNode(instr.Value), ksize, vsize) + + case *ssa.Panic: + a.copy(a.panicNode, a.valueNode(instr.X), 1) + + default: + panic(fmt.Sprintf("unimplemented: %T", instr)) + } +} + +func (a *analysis) makeCGNode(fn *ssa.Function, obj nodeid, callersite *callsite) *cgnode { + cgn := &cgnode{fn: fn, obj: obj, callersite: callersite} + a.cgnodes = append(a.cgnodes, cgn) + return cgn +} + +// genRootCalls generates the synthetic root of the callgraph and the +// initial calls from it to the analysis scope, such as main, a test +// or a library. +// +func (a *analysis) genRootCalls() *cgnode { + r := a.prog.NewFunction("", new(types.Signature), "root of callgraph") + root := a.makeCGNode(r, 0, nil) + + // TODO(adonovan): make an ssa utility to construct an actual + // root function so we don't need to special-case site-less + // call edges. + + // For each main package, call main.init(), main.main(). + for _, mainPkg := range a.config.Mains { + main := mainPkg.Func("main") + if main == nil { + panic(fmt.Sprintf("%s has no main function", mainPkg)) + } + + targets := a.addOneNode(main.Signature, "root.targets", nil) + site := &callsite{targets: targets} + root.sites = append(root.sites, site) + for _, fn := range [2]*ssa.Function{mainPkg.Func("init"), main} { + if a.log != nil { + fmt.Fprintf(a.log, "\troot call to %s:\n", fn) + } + a.copy(targets, a.valueNode(fn), 1) + } + } + + return root +} + +// genFunc generates constraints for function fn. +func (a *analysis) genFunc(cgn *cgnode) { + fn := cgn.fn + + impl := a.findIntrinsic(fn) + + if a.log != nil { + fmt.Fprintf(a.log, "\n\n==== Generating constraints for %s, %s\n", cgn, cgn.contour()) + + // Hack: don't display body if intrinsic. + if impl != nil { + fn2 := *cgn.fn // copy + fn2.Locals = nil + fn2.Blocks = nil + fn2.WriteTo(a.log) + } else { + cgn.fn.WriteTo(a.log) + } + } + + if impl != nil { + impl(a, cgn) + return + } + + if fn.Blocks == nil { + // External function with no intrinsic treatment. + // We'll warn about calls to such functions at the end. + return + } + + if a.log != nil { + fmt.Fprintln(a.log, "; Creating nodes for local values") + } + + a.localval = make(map[ssa.Value]nodeid) + a.localobj = make(map[ssa.Value]nodeid) + + // The value nodes for the params are in the func object block. + params := a.funcParams(cgn.obj) + for _, p := range fn.Params { + a.setValueNode(p, params, cgn) + params += nodeid(a.sizeof(p.Type())) + } + + // Free variables have global cardinality: + // the outer function sets them with MakeClosure; + // the inner function accesses them with FreeVar. + // + // TODO(adonovan): treat free vars context-sensitively. + + // Create value nodes for all value instructions + // since SSA may contain forward references. + var space [10]*ssa.Value + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + switch instr := instr.(type) { + case *ssa.Range: + // do nothing: it has a funky type, + // and *ssa.Next does all the work. + + case ssa.Value: + var comment string + if a.log != nil { + comment = instr.Name() + } + id := a.addNodes(instr.Type(), comment) + a.setValueNode(instr, id, cgn) + } + + // Record all address-taken functions (for presolver). + rands := instr.Operands(space[:0]) + if call, ok := instr.(ssa.CallInstruction); ok && !call.Common().IsInvoke() { + // Skip CallCommon.Value in "call" mode. + // TODO(adonovan): fix: relies on unspecified ordering. Specify it. + rands = rands[1:] + } + for _, rand := range rands { + if atf, ok := (*rand).(*ssa.Function); ok { + a.atFuncs[atf] = true + } + } + } + } + + // Generate constraints for instructions. + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + a.genInstr(cgn, instr) + } + } + + a.localval = nil + a.localobj = nil +} + +// genMethodsOf generates nodes and constraints for all methods of type T. +func (a *analysis) genMethodsOf(T types.Type) { + itf := isInterface(T) + + // TODO(adonovan): can we skip this entirely if itf is true? + // I think so, but the answer may depend on reflection. + mset := a.prog.MethodSets.MethodSet(T) + for i, n := 0, mset.Len(); i < n; i++ { + m := a.prog.MethodValue(mset.At(i)) + a.valueNode(m) + + if !itf { + // Methods of concrete types are address-taken functions. + a.atFuncs[m] = true + } + } +} + +// generate generates offline constraints for the entire program. +func (a *analysis) generate() { + start("Constraint generation") + if a.log != nil { + fmt.Fprintln(a.log, "==== Generating constraints") + } + + // Create a dummy node since we use the nodeid 0 for + // non-pointerlike variables. + a.addNodes(tInvalid, "(zero)") + + // Create the global node for panic values. + a.panicNode = a.addNodes(tEface, "panic") + + // Create nodes and constraints for all methods of reflect.rtype. + // (Shared contours are used by dynamic calls to reflect.Type + // methods---typically just String().) + if rtype := a.reflectRtypePtr; rtype != nil { + a.genMethodsOf(rtype) + } + + root := a.genRootCalls() + + if a.config.BuildCallGraph { + a.result.CallGraph = callgraph.New(root.fn) + } + + // Create nodes and constraints for all methods of all types + // that are dynamically accessible via reflection or interfaces. + for _, T := range a.prog.RuntimeTypes() { + a.genMethodsOf(T) + } + + // Generate constraints for entire program. + for len(a.genq) > 0 { + cgn := a.genq[0] + a.genq = a.genq[1:] + a.genFunc(cgn) + } + + // The runtime magically allocates os.Args; so should we. + if os := a.prog.ImportedPackage("os"); os != nil { + // In effect: os.Args = new([1]string)[:] + T := types.NewSlice(types.Typ[types.String]) + obj := a.addNodes(sliceToArray(T), "") + a.endObject(obj, nil, "") + a.addressOf(T, a.objectNode(nil, os.Var("Args")), obj) + } + + // Discard generation state, to avoid confusion after node renumbering. + a.panicNode = 0 + a.globalval = nil + a.localval = nil + a.localobj = nil + + stop("Constraint generation") +} diff --git a/vendor/golang.org/x/tools/go/pointer/hvn.go b/vendor/golang.org/x/tools/go/pointer/hvn.go new file mode 100644 index 0000000000..e550bc9cee --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/hvn.go @@ -0,0 +1,975 @@ +// Copyright 2013 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.5 + +package pointer + +// This file implements Hash-Value Numbering (HVN), a pre-solver +// constraint optimization described in Hardekopf & Lin, SAS'07 (see +// doc.go) that analyses the graph topology to determine which sets of +// variables are "pointer equivalent" (PE), i.e. must have identical +// points-to sets in the solution. +// +// A separate ("offline") graph is constructed. Its nodes are those of +// the main-graph, plus an additional node *X for each pointer node X. +// With this graph we can reason about the unknown points-to set of +// dereferenced pointers. (We do not generalize this to represent +// unknown fields x->f, perhaps because such fields would be numerous, +// though it might be worth an experiment.) +// +// Nodes whose points-to relations are not entirely captured by the +// graph are marked as "indirect": the *X nodes, the parameters of +// address-taken functions (which includes all functions in method +// sets), or nodes updated by the solver rules for reflection, etc. +// +// All addr (y=&x) nodes are initially assigned a pointer-equivalence +// (PE) label equal to x's nodeid in the main graph. (These are the +// only PE labels that are less than len(a.nodes).) +// +// All offsetAddr (y=&x.f) constraints are initially assigned a PE +// label; such labels are memoized, keyed by (x, f), so that equivalent +// nodes y as assigned the same label. +// +// Then we process each strongly connected component (SCC) of the graph +// in topological order, assigning it a PE label based on the set P of +// PE labels that flow to it from its immediate dependencies. +// +// If any node in P is "indirect", the entire SCC is assigned a fresh PE +// label. Otherwise: +// +// |P|=0 if P is empty, all nodes in the SCC are non-pointers (e.g. +// uninitialized variables, or formal params of dead functions) +// and the SCC is assigned the PE label of zero. +// +// |P|=1 if P is a singleton, the SCC is assigned the same label as the +// sole element of P. +// +// |P|>1 if P contains multiple labels, a unique label representing P is +// invented and recorded in an hash table, so that other +// equivalent SCCs may also be assigned this label, akin to +// conventional hash-value numbering in a compiler. +// +// Finally, a renumbering is computed such that each node is replaced by +// the lowest-numbered node with the same PE label. All constraints are +// renumbered, and any resulting duplicates are eliminated. +// +// The only nodes that are not renumbered are the objects x in addr +// (y=&x) constraints, since the ids of these nodes (and fields derived +// from them via offsetAddr rules) are the elements of all points-to +// sets, so they must remain as they are if we want the same solution. +// +// The solverStates (node.solve) for nodes in the same equivalence class +// are linked together so that all nodes in the class have the same +// solution. This avoids the need to renumber nodeids buried in +// Queries, cgnodes, etc (like (*analysis).renumber() does) since only +// the solution is needed. +// +// The result of HVN is that the number of distinct nodes and +// constraints is reduced, but the solution is identical (almost---see +// CROSS-CHECK below). In particular, both linear and cyclic chains of +// copies are each replaced by a single node. +// +// Nodes and constraints created "online" (e.g. while solving reflection +// constraints) are not subject to this optimization. +// +// PERFORMANCE +// +// In two benchmarks (oracle and godoc), HVN eliminates about two thirds +// of nodes, the majority accounted for by non-pointers: nodes of +// non-pointer type, pointers that remain nil, formal parameters of dead +// functions, nodes of untracked types, etc. It also reduces the number +// of constraints, also by about two thirds, and the solving time by +// 30--42%, although we must pay about 15% for the running time of HVN +// itself. The benefit is greater for larger applications. +// +// There are many possible optimizations to improve the performance: +// * Use fewer than 1:1 onodes to main graph nodes: many of the onodes +// we create are not needed. +// * HU (HVN with Union---see paper): coalesce "union" peLabels when +// their expanded-out sets are equal. +// * HR (HVN with deReference---see paper): this will require that we +// apply HVN until fixed point, which may need more bookkeeping of the +// correspondance of main nodes to onodes. +// * Location Equivalence (see paper): have points-to sets contain not +// locations but location-equivalence class labels, each representing +// a set of locations. +// * HVN with field-sensitive ref: model each of the fields of a +// pointer-to-struct. +// +// CROSS-CHECK +// +// To verify the soundness of the optimization, when the +// debugHVNCrossCheck option is enabled, we run the solver twice, once +// before and once after running HVN, dumping the solution to disk, and +// then we compare the results. If they are not identical, the analysis +// panics. +// +// The solution dumped to disk includes only the N*N submatrix of the +// complete solution where N is the number of nodes after generation. +// In other words, we ignore pointer variables and objects created by +// the solver itself, since their numbering depends on the solver order, +// which is affected by the optimization. In any case, that's the only +// part the client cares about. +// +// The cross-check is too strict and may fail spuriously. Although the +// H&L paper describing HVN states that the solutions obtained should be +// identical, this is not the case in practice because HVN can collapse +// cycles involving *p even when pts(p)={}. Consider this example +// distilled from testdata/hello.go: +// +// var x T +// func f(p **T) { +// t0 = *p +// ... +// t1 = φ(t0, &x) +// *p = t1 +// } +// +// If f is dead code, we get: +// unoptimized: pts(p)={} pts(t0)={} pts(t1)={&x} +// optimized: pts(p)={} pts(t0)=pts(t1)=pts(*p)={&x} +// +// It's hard to argue that this is a bug: the result is sound and the +// loss of precision is inconsequential---f is dead code, after all. +// But unfortunately it limits the usefulness of the cross-check since +// failures must be carefully analyzed. Ben Hardekopf suggests (in +// personal correspondence) some approaches to mitigating it: +// +// If there is a node with an HVN points-to set that is a superset +// of the NORM points-to set, then either it's a bug or it's a +// result of this issue. If it's a result of this issue, then in +// the offline constraint graph there should be a REF node inside +// some cycle that reaches this node, and in the NORM solution the +// pointer being dereferenced by that REF node should be the empty +// set. If that isn't true then this is a bug. If it is true, then +// you can further check that in the NORM solution the "extra" +// points-to info in the HVN solution does in fact come from that +// purported cycle (if it doesn't, then this is still a bug). If +// you're doing the further check then you'll need to do it for +// each "extra" points-to element in the HVN points-to set. +// +// There are probably ways to optimize these checks by taking +// advantage of graph properties. For example, extraneous points-to +// info will flow through the graph and end up in many +// nodes. Rather than checking every node with extra info, you +// could probably work out the "origin point" of the extra info and +// just check there. Note that the check in the first bullet is +// looking for soundness bugs, while the check in the second bullet +// is looking for precision bugs; depending on your needs, you may +// care more about one than the other. +// +// which we should evaluate. The cross-check is nonetheless invaluable +// for all but one of the programs in the pointer_test suite. + +import ( + "fmt" + "go/types" + "io" + "reflect" + + "golang.org/x/tools/container/intsets" +) + +// A peLabel is a pointer-equivalence label: two nodes with the same +// peLabel have identical points-to solutions. +// +// The numbers are allocated consecutively like so: +// 0 not a pointer +// 1..N-1 addrConstraints (equals the constraint's .src field, hence sparse) +// ... offsetAddr constraints +// ... SCCs (with indirect nodes or multiple inputs) +// +// Each PE label denotes a set of pointers containing a single addr, a +// single offsetAddr, or some set of other PE labels. +// +type peLabel int + +type hvn struct { + a *analysis + N int // len(a.nodes) immediately after constraint generation + log io.Writer // (optional) log of HVN lemmas + onodes []*onode // nodes of the offline graph + label peLabel // the next available PE label + hvnLabel map[string]peLabel // hash-value numbering (PE label) for each set of onodeids + stack []onodeid // DFS stack + index int32 // next onode.index, from Tarjan's SCC algorithm + + // For each distinct offsetAddrConstraint (src, offset) pair, + // offsetAddrLabels records a unique PE label >= N. + offsetAddrLabels map[offsetAddr]peLabel +} + +// The index of an node in the offline graph. +// (Currently the first N align with the main nodes, +// but this may change with HRU.) +type onodeid uint32 + +// An onode is a node in the offline constraint graph. +// (Where ambiguous, members of analysis.nodes are referred to as +// "main graph" nodes.) +// +// Edges in the offline constraint graph (edges and implicit) point to +// the source, i.e. against the flow of values: they are dependencies. +// Implicit edges are used for SCC computation, but not for gathering +// incoming labels. +// +type onode struct { + rep onodeid // index of representative of SCC in offline constraint graph + + edges intsets.Sparse // constraint edges X-->Y (this onode is X) + implicit intsets.Sparse // implicit edges *X-->*Y (this onode is X) + peLabels intsets.Sparse // set of peLabels are pointer-equivalent to this one + indirect bool // node has points-to relations not represented in graph + + // Tarjan's SCC algorithm + index, lowlink int32 // Tarjan numbering + scc int32 // -ve => on stack; 0 => unvisited; +ve => node is root of a found SCC +} + +type offsetAddr struct { + ptr nodeid + offset uint32 +} + +// nextLabel issues the next unused pointer-equivalence label. +func (h *hvn) nextLabel() peLabel { + h.label++ + return h.label +} + +// ref(X) returns the index of the onode for *X. +func (h *hvn) ref(id onodeid) onodeid { + return id + onodeid(len(h.a.nodes)) +} + +// hvn computes pointer-equivalence labels (peLabels) using the Hash-based +// Value Numbering (HVN) algorithm described in Hardekopf & Lin, SAS'07. +// +func (a *analysis) hvn() { + start("HVN") + + if a.log != nil { + fmt.Fprintf(a.log, "\n\n==== Pointer equivalence optimization\n\n") + } + + h := hvn{ + a: a, + N: len(a.nodes), + log: a.log, + hvnLabel: make(map[string]peLabel), + offsetAddrLabels: make(map[offsetAddr]peLabel), + } + + if h.log != nil { + fmt.Fprintf(h.log, "\nCreating offline graph nodes...\n") + } + + // Create offline nodes. The first N nodes correspond to main + // graph nodes; the next N are their corresponding ref() nodes. + h.onodes = make([]*onode, 2*h.N) + for id := range a.nodes { + id := onodeid(id) + h.onodes[id] = &onode{} + h.onodes[h.ref(id)] = &onode{indirect: true} + } + + // Each node initially represents just itself. + for id, o := range h.onodes { + o.rep = onodeid(id) + } + + h.markIndirectNodes() + + // Reserve the first N PE labels for addrConstraints. + h.label = peLabel(h.N) + + // Add offline constraint edges. + if h.log != nil { + fmt.Fprintf(h.log, "\nAdding offline graph edges...\n") + } + for _, c := range a.constraints { + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "; %s\n", c) + } + c.presolve(&h) + } + + // Find and collapse SCCs. + if h.log != nil { + fmt.Fprintf(h.log, "\nFinding SCCs...\n") + } + h.index = 1 + for id, o := range h.onodes { + if id > 0 && o.index == 0 { + // Start depth-first search at each unvisited node. + h.visit(onodeid(id)) + } + } + + // Dump the solution + // (NB: somewhat redundant with logging from simplify().) + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\nPointer equivalences:\n") + for id, o := range h.onodes { + if id == 0 { + continue + } + if id == int(h.N) { + fmt.Fprintf(h.log, "---\n") + } + fmt.Fprintf(h.log, "o%d\t", id) + if o.rep != onodeid(id) { + fmt.Fprintf(h.log, "rep=o%d", o.rep) + } else { + fmt.Fprintf(h.log, "p%d", o.peLabels.Min()) + if o.indirect { + fmt.Fprint(h.log, " indirect") + } + } + fmt.Fprintln(h.log) + } + } + + // Simplify the main constraint graph + h.simplify() + + a.showCounts() + + stop("HVN") +} + +// ---- constraint-specific rules ---- + +// dst := &src +func (c *addrConstraint) presolve(h *hvn) { + // Each object (src) is an initial PE label. + label := peLabel(c.src) // label < N + if debugHVNVerbose && h.log != nil { + // duplicate log messages are possible + fmt.Fprintf(h.log, "\tcreate p%d: {&n%d}\n", label, c.src) + } + odst := onodeid(c.dst) + osrc := onodeid(c.src) + + // Assign dst this label. + h.onodes[odst].peLabels.Insert(int(label)) + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\to%d has p%d\n", odst, label) + } + + h.addImplicitEdge(h.ref(odst), osrc) // *dst ~~> src. +} + +// dst = src +func (c *copyConstraint) presolve(h *hvn) { + odst := onodeid(c.dst) + osrc := onodeid(c.src) + h.addEdge(odst, osrc) // dst --> src + h.addImplicitEdge(h.ref(odst), h.ref(osrc)) // *dst ~~> *src +} + +// dst = *src + offset +func (c *loadConstraint) presolve(h *hvn) { + odst := onodeid(c.dst) + osrc := onodeid(c.src) + if c.offset == 0 { + h.addEdge(odst, h.ref(osrc)) // dst --> *src + } else { + // We don't interpret load-with-offset, e.g. results + // of map value lookup, R-block of dynamic call, slice + // copy/append, reflection. + h.markIndirect(odst, "load with offset") + } +} + +// *dst + offset = src +func (c *storeConstraint) presolve(h *hvn) { + odst := onodeid(c.dst) + osrc := onodeid(c.src) + if c.offset == 0 { + h.onodes[h.ref(odst)].edges.Insert(int(osrc)) // *dst --> src + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\to%d --> o%d\n", h.ref(odst), osrc) + } + } else { + // We don't interpret store-with-offset. + // See discussion of soundness at markIndirectNodes. + } +} + +// dst = &src.offset +func (c *offsetAddrConstraint) presolve(h *hvn) { + // Give each distinct (addr, offset) pair a fresh PE label. + // The cache performs CSE, effectively. + key := offsetAddr{c.src, c.offset} + label, ok := h.offsetAddrLabels[key] + if !ok { + label = h.nextLabel() + h.offsetAddrLabels[key] = label + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\tcreate p%d: {&n%d.#%d}\n", + label, c.src, c.offset) + } + } + + // Assign dst this label. + h.onodes[c.dst].peLabels.Insert(int(label)) + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\to%d has p%d\n", c.dst, label) + } +} + +// dst = src.(typ) where typ is an interface +func (c *typeFilterConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.dst), "typeFilter result") +} + +// dst = src.(typ) where typ is concrete +func (c *untagConstraint) presolve(h *hvn) { + odst := onodeid(c.dst) + for end := odst + onodeid(h.a.sizeof(c.typ)); odst < end; odst++ { + h.markIndirect(odst, "untag result") + } +} + +// dst = src.method(c.params...) +func (c *invokeConstraint) presolve(h *hvn) { + // All methods are address-taken functions, so + // their formal P-blocks were already marked indirect. + + // Mark the caller's targets node as indirect. + sig := c.method.Type().(*types.Signature) + id := c.params + h.markIndirect(onodeid(c.params), "invoke targets node") + id++ + + id += nodeid(h.a.sizeof(sig.Params())) + + // Mark the caller's R-block as indirect. + end := id + nodeid(h.a.sizeof(sig.Results())) + for id < end { + h.markIndirect(onodeid(id), "invoke R-block") + id++ + } +} + +// markIndirectNodes marks as indirect nodes whose points-to relations +// are not entirely captured by the offline graph, including: +// +// (a) All address-taken nodes (including the following nodes within +// the same object). This is described in the paper. +// +// The most subtle cause of indirect nodes is the generation of +// store-with-offset constraints since the offline graph doesn't +// represent them. A global audit of constraint generation reveals the +// following uses of store-with-offset: +// +// (b) genDynamicCall, for P-blocks of dynamically called functions, +// to which dynamic copy edges will be added to them during +// solving: from storeConstraint for standalone functions, +// and from invokeConstraint for methods. +// All such P-blocks must be marked indirect. +// (c) MakeUpdate, to update the value part of a map object. +// All MakeMap objects's value parts must be marked indirect. +// (d) copyElems, to update the destination array. +// All array elements must be marked indirect. +// +// Not all indirect marking happens here. ref() nodes are marked +// indirect at construction, and each constraint's presolve() method may +// mark additional nodes. +// +func (h *hvn) markIndirectNodes() { + // (a) all address-taken nodes, plus all nodes following them + // within the same object, since these may be indirectly + // stored or address-taken. + for _, c := range h.a.constraints { + if c, ok := c.(*addrConstraint); ok { + start := h.a.enclosingObj(c.src) + end := start + nodeid(h.a.nodes[start].obj.size) + for id := c.src; id < end; id++ { + h.markIndirect(onodeid(id), "A-T object") + } + } + } + + // (b) P-blocks of all address-taken functions. + for id := 0; id < h.N; id++ { + obj := h.a.nodes[id].obj + + // TODO(adonovan): opt: if obj.cgn.fn is a method and + // obj.cgn is not its shared contour, this is an + // "inlined" static method call. We needn't consider it + // address-taken since no invokeConstraint will affect it. + + if obj != nil && obj.flags&otFunction != 0 && h.a.atFuncs[obj.cgn.fn] { + // address-taken function + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "n%d is address-taken: %s\n", id, obj.cgn.fn) + } + h.markIndirect(onodeid(id), "A-T func identity") + id++ + sig := obj.cgn.fn.Signature + psize := h.a.sizeof(sig.Params()) + if sig.Recv() != nil { + psize += h.a.sizeof(sig.Recv().Type()) + } + for end := id + int(psize); id < end; id++ { + h.markIndirect(onodeid(id), "A-T func P-block") + } + id-- + continue + } + } + + // (c) all map objects' value fields. + for _, id := range h.a.mapValues { + h.markIndirect(onodeid(id), "makemap.value") + } + + // (d) all array element objects. + // TODO(adonovan): opt: can we do better? + for id := 0; id < h.N; id++ { + // Identity node for an object of array type? + if tArray, ok := h.a.nodes[id].typ.(*types.Array); ok { + // Mark the array element nodes indirect. + // (Skip past the identity field.) + for _ = range h.a.flatten(tArray.Elem()) { + id++ + h.markIndirect(onodeid(id), "array elem") + } + } + } +} + +func (h *hvn) markIndirect(oid onodeid, comment string) { + h.onodes[oid].indirect = true + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\to%d is indirect: %s\n", oid, comment) + } +} + +// Adds an edge dst-->src. +// Note the unusual convention: edges are dependency (contraflow) edges. +func (h *hvn) addEdge(odst, osrc onodeid) { + h.onodes[odst].edges.Insert(int(osrc)) + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\to%d --> o%d\n", odst, osrc) + } +} + +func (h *hvn) addImplicitEdge(odst, osrc onodeid) { + h.onodes[odst].implicit.Insert(int(osrc)) + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\to%d ~~> o%d\n", odst, osrc) + } +} + +// visit implements the depth-first search of Tarjan's SCC algorithm. +// Precondition: x is canonical. +func (h *hvn) visit(x onodeid) { + h.checkCanonical(x) + xo := h.onodes[x] + xo.index = h.index + xo.lowlink = h.index + h.index++ + + h.stack = append(h.stack, x) // push + assert(xo.scc == 0, "node revisited") + xo.scc = -1 + + var deps []int + deps = xo.edges.AppendTo(deps) + deps = xo.implicit.AppendTo(deps) + + for _, y := range deps { + // Loop invariant: x is canonical. + + y := h.find(onodeid(y)) + + if x == y { + continue // nodes already coalesced + } + + xo := h.onodes[x] + yo := h.onodes[y] + + switch { + case yo.scc > 0: + // y is already a collapsed SCC + + case yo.scc < 0: + // y is on the stack, and thus in the current SCC. + if yo.index < xo.lowlink { + xo.lowlink = yo.index + } + + default: + // y is unvisited; visit it now. + h.visit(y) + // Note: x and y are now non-canonical. + + x = h.find(onodeid(x)) + + if yo.lowlink < xo.lowlink { + xo.lowlink = yo.lowlink + } + } + } + h.checkCanonical(x) + + // Is x the root of an SCC? + if xo.lowlink == xo.index { + // Coalesce all nodes in the SCC. + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "scc o%d\n", x) + } + for { + // Pop y from stack. + i := len(h.stack) - 1 + y := h.stack[i] + h.stack = h.stack[:i] + + h.checkCanonical(x) + xo := h.onodes[x] + h.checkCanonical(y) + yo := h.onodes[y] + + if xo == yo { + // SCC is complete. + xo.scc = 1 + h.labelSCC(x) + break + } + h.coalesce(x, y) + } + } +} + +// Precondition: x is canonical. +func (h *hvn) labelSCC(x onodeid) { + h.checkCanonical(x) + xo := h.onodes[x] + xpe := &xo.peLabels + + // All indirect nodes get new labels. + if xo.indirect { + label := h.nextLabel() + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\tcreate p%d: indirect SCC\n", label) + fmt.Fprintf(h.log, "\to%d has p%d\n", x, label) + } + + // Remove pre-labeling, in case a direct pre-labeled node was + // merged with an indirect one. + xpe.Clear() + xpe.Insert(int(label)) + + return + } + + // Invariant: all peLabels sets are non-empty. + // Those that are logically empty contain zero as their sole element. + // No other sets contains zero. + + // Find all labels coming in to the coalesced SCC node. + for _, y := range xo.edges.AppendTo(nil) { + y := h.find(onodeid(y)) + if y == x { + continue // already coalesced + } + ype := &h.onodes[y].peLabels + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\tedge from o%d = %s\n", y, ype) + } + + if ype.IsEmpty() { + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\tnode has no PE label\n") + } + } + assert(!ype.IsEmpty(), "incoming node has no PE label") + + if ype.Has(0) { + // {0} represents a non-pointer. + assert(ype.Len() == 1, "PE set contains {0, ...}") + } else { + xpe.UnionWith(ype) + } + } + + switch xpe.Len() { + case 0: + // SCC has no incoming non-zero PE labels: it is a non-pointer. + xpe.Insert(0) + + case 1: + // already a singleton + + default: + // SCC has multiple incoming non-zero PE labels. + // Find the canonical label representing this set. + // We use String() as a fingerprint consistent with Equals(). + key := xpe.String() + label, ok := h.hvnLabel[key] + if !ok { + label = h.nextLabel() + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\tcreate p%d: union %s\n", label, xpe.String()) + } + h.hvnLabel[key] = label + } + xpe.Clear() + xpe.Insert(int(label)) + } + + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\to%d has p%d\n", x, xpe.Min()) + } +} + +// coalesce combines two nodes in the offline constraint graph. +// Precondition: x and y are canonical. +func (h *hvn) coalesce(x, y onodeid) { + xo := h.onodes[x] + yo := h.onodes[y] + + // x becomes y's canonical representative. + yo.rep = x + + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\tcoalesce o%d into o%d\n", y, x) + } + + // x accumulates y's edges. + xo.edges.UnionWith(&yo.edges) + yo.edges.Clear() + + // x accumulates y's implicit edges. + xo.implicit.UnionWith(&yo.implicit) + yo.implicit.Clear() + + // x accumulates y's pointer-equivalence labels. + xo.peLabels.UnionWith(&yo.peLabels) + yo.peLabels.Clear() + + // x accumulates y's indirect flag. + if yo.indirect { + xo.indirect = true + } +} + +// simplify computes a degenerate renumbering of nodeids from the PE +// labels assigned by the hvn, and uses it to simplify the main +// constraint graph, eliminating non-pointer nodes and duplicate +// constraints. +// +func (h *hvn) simplify() { + // canon maps each peLabel to its canonical main node. + canon := make([]nodeid, h.label) + for i := range canon { + canon[i] = nodeid(h.N) // indicates "unset" + } + + // mapping maps each main node index to the index of the canonical node. + mapping := make([]nodeid, len(h.a.nodes)) + + for id := range h.a.nodes { + id := nodeid(id) + if id == 0 { + canon[0] = 0 + mapping[0] = 0 + continue + } + oid := h.find(onodeid(id)) + peLabels := &h.onodes[oid].peLabels + assert(peLabels.Len() == 1, "PE class is not a singleton") + label := peLabel(peLabels.Min()) + + canonId := canon[label] + if canonId == nodeid(h.N) { + // id becomes the representative of the PE label. + canonId = id + canon[label] = canonId + + if h.a.log != nil { + fmt.Fprintf(h.a.log, "\tpts(n%d) is canonical : \t(%s)\n", + id, h.a.nodes[id].typ) + } + + } else { + // Link the solver states for the two nodes. + assert(h.a.nodes[canonId].solve != nil, "missing solver state") + h.a.nodes[id].solve = h.a.nodes[canonId].solve + + if h.a.log != nil { + // TODO(adonovan): debug: reorganize the log so it prints + // one line: + // pe y = x1, ..., xn + // for each canonical y. Requires allocation. + fmt.Fprintf(h.a.log, "\tpts(n%d) = pts(n%d) : %s\n", + id, canonId, h.a.nodes[id].typ) + } + } + + mapping[id] = canonId + } + + // Renumber the constraints, eliminate duplicates, and eliminate + // any containing non-pointers (n0). + addrs := make(map[addrConstraint]bool) + copys := make(map[copyConstraint]bool) + loads := make(map[loadConstraint]bool) + stores := make(map[storeConstraint]bool) + offsetAddrs := make(map[offsetAddrConstraint]bool) + untags := make(map[untagConstraint]bool) + typeFilters := make(map[typeFilterConstraint]bool) + invokes := make(map[invokeConstraint]bool) + + nbefore := len(h.a.constraints) + cc := h.a.constraints[:0] // in-situ compaction + for _, c := range h.a.constraints { + // Renumber. + switch c := c.(type) { + case *addrConstraint: + // Don't renumber c.src since it is the label of + // an addressable object and will appear in PT sets. + c.dst = mapping[c.dst] + default: + c.renumber(mapping) + } + + if c.ptr() == 0 { + continue // skip: constraint attached to non-pointer + } + + var dup bool + switch c := c.(type) { + case *addrConstraint: + _, dup = addrs[*c] + addrs[*c] = true + + case *copyConstraint: + if c.src == c.dst { + continue // skip degenerate copies + } + if c.src == 0 { + continue // skip copy from non-pointer + } + _, dup = copys[*c] + copys[*c] = true + + case *loadConstraint: + if c.src == 0 { + continue // skip load from non-pointer + } + _, dup = loads[*c] + loads[*c] = true + + case *storeConstraint: + if c.src == 0 { + continue // skip store from non-pointer + } + _, dup = stores[*c] + stores[*c] = true + + case *offsetAddrConstraint: + if c.src == 0 { + continue // skip offset from non-pointer + } + _, dup = offsetAddrs[*c] + offsetAddrs[*c] = true + + case *untagConstraint: + if c.src == 0 { + continue // skip untag of non-pointer + } + _, dup = untags[*c] + untags[*c] = true + + case *typeFilterConstraint: + if c.src == 0 { + continue // skip filter of non-pointer + } + _, dup = typeFilters[*c] + typeFilters[*c] = true + + case *invokeConstraint: + if c.params == 0 { + panic("non-pointer invoke.params") + } + if c.iface == 0 { + continue // skip invoke on non-pointer + } + _, dup = invokes[*c] + invokes[*c] = true + + default: + // We don't bother de-duping advanced constraints + // (e.g. reflection) since they are uncommon. + + // Eliminate constraints containing non-pointer nodeids. + // + // We use reflection to find the fields to avoid + // adding yet another method to constraint. + // + // TODO(adonovan): experiment with a constraint + // method that returns a slice of pointers to + // nodeids fields to enable uniform iteration; + // the renumber() method could be removed and + // implemented using the new one. + // + // TODO(adonovan): opt: this is unsound since + // some constraints still have an effect if one + // of the operands is zero: rVCall, rVMapIndex, + // rvSetMapIndex. Handle them specially. + rtNodeid := reflect.TypeOf(nodeid(0)) + x := reflect.ValueOf(c).Elem() + for i, nf := 0, x.NumField(); i < nf; i++ { + f := x.Field(i) + if f.Type() == rtNodeid { + if f.Uint() == 0 { + dup = true // skip it + break + } + } + } + } + if dup { + continue // skip duplicates + } + + cc = append(cc, c) + } + h.a.constraints = cc + + if h.log != nil { + fmt.Fprintf(h.log, "#constraints: was %d, now %d\n", nbefore, len(h.a.constraints)) + } +} + +// find returns the canonical onodeid for x. +// (The onodes form a disjoint set forest.) +func (h *hvn) find(x onodeid) onodeid { + // TODO(adonovan): opt: this is a CPU hotspot. Try "union by rank". + xo := h.onodes[x] + rep := xo.rep + if rep != x { + rep = h.find(rep) // simple path compression + xo.rep = rep + } + return rep +} + +func (h *hvn) checkCanonical(x onodeid) { + if debugHVN { + assert(x == h.find(x), "not canonical") + } +} + +func assert(p bool, msg string) { + if debugHVN && !p { + panic("assertion failed: " + msg) + } +} diff --git a/vendor/golang.org/x/tools/go/pointer/hvn14.go b/vendor/golang.org/x/tools/go/pointer/hvn14.go new file mode 100644 index 0000000000..bc387456fb --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/hvn14.go @@ -0,0 +1,975 @@ +// Copyright 2013 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.5 + +package pointer + +// This file implements Hash-Value Numbering (HVN), a pre-solver +// constraint optimization described in Hardekopf & Lin, SAS'07 (see +// doc.go) that analyses the graph topology to determine which sets of +// variables are "pointer equivalent" (PE), i.e. must have identical +// points-to sets in the solution. +// +// A separate ("offline") graph is constructed. Its nodes are those of +// the main-graph, plus an additional node *X for each pointer node X. +// With this graph we can reason about the unknown points-to set of +// dereferenced pointers. (We do not generalize this to represent +// unknown fields x->f, perhaps because such fields would be numerous, +// though it might be worth an experiment.) +// +// Nodes whose points-to relations are not entirely captured by the +// graph are marked as "indirect": the *X nodes, the parameters of +// address-taken functions (which includes all functions in method +// sets), or nodes updated by the solver rules for reflection, etc. +// +// All addr (y=&x) nodes are initially assigned a pointer-equivalence +// (PE) label equal to x's nodeid in the main graph. (These are the +// only PE labels that are less than len(a.nodes).) +// +// All offsetAddr (y=&x.f) constraints are initially assigned a PE +// label; such labels are memoized, keyed by (x, f), so that equivalent +// nodes y as assigned the same label. +// +// Then we process each strongly connected component (SCC) of the graph +// in topological order, assigning it a PE label based on the set P of +// PE labels that flow to it from its immediate dependencies. +// +// If any node in P is "indirect", the entire SCC is assigned a fresh PE +// label. Otherwise: +// +// |P|=0 if P is empty, all nodes in the SCC are non-pointers (e.g. +// uninitialized variables, or formal params of dead functions) +// and the SCC is assigned the PE label of zero. +// +// |P|=1 if P is a singleton, the SCC is assigned the same label as the +// sole element of P. +// +// |P|>1 if P contains multiple labels, a unique label representing P is +// invented and recorded in an hash table, so that other +// equivalent SCCs may also be assigned this label, akin to +// conventional hash-value numbering in a compiler. +// +// Finally, a renumbering is computed such that each node is replaced by +// the lowest-numbered node with the same PE label. All constraints are +// renumbered, and any resulting duplicates are eliminated. +// +// The only nodes that are not renumbered are the objects x in addr +// (y=&x) constraints, since the ids of these nodes (and fields derived +// from them via offsetAddr rules) are the elements of all points-to +// sets, so they must remain as they are if we want the same solution. +// +// The solverStates (node.solve) for nodes in the same equivalence class +// are linked together so that all nodes in the class have the same +// solution. This avoids the need to renumber nodeids buried in +// Queries, cgnodes, etc (like (*analysis).renumber() does) since only +// the solution is needed. +// +// The result of HVN is that the number of distinct nodes and +// constraints is reduced, but the solution is identical (almost---see +// CROSS-CHECK below). In particular, both linear and cyclic chains of +// copies are each replaced by a single node. +// +// Nodes and constraints created "online" (e.g. while solving reflection +// constraints) are not subject to this optimization. +// +// PERFORMANCE +// +// In two benchmarks (oracle and godoc), HVN eliminates about two thirds +// of nodes, the majority accounted for by non-pointers: nodes of +// non-pointer type, pointers that remain nil, formal parameters of dead +// functions, nodes of untracked types, etc. It also reduces the number +// of constraints, also by about two thirds, and the solving time by +// 30--42%, although we must pay about 15% for the running time of HVN +// itself. The benefit is greater for larger applications. +// +// There are many possible optimizations to improve the performance: +// * Use fewer than 1:1 onodes to main graph nodes: many of the onodes +// we create are not needed. +// * HU (HVN with Union---see paper): coalesce "union" peLabels when +// their expanded-out sets are equal. +// * HR (HVN with deReference---see paper): this will require that we +// apply HVN until fixed point, which may need more bookkeeping of the +// correspondance of main nodes to onodes. +// * Location Equivalence (see paper): have points-to sets contain not +// locations but location-equivalence class labels, each representing +// a set of locations. +// * HVN with field-sensitive ref: model each of the fields of a +// pointer-to-struct. +// +// CROSS-CHECK +// +// To verify the soundness of the optimization, when the +// debugHVNCrossCheck option is enabled, we run the solver twice, once +// before and once after running HVN, dumping the solution to disk, and +// then we compare the results. If they are not identical, the analysis +// panics. +// +// The solution dumped to disk includes only the N*N submatrix of the +// complete solution where N is the number of nodes after generation. +// In other words, we ignore pointer variables and objects created by +// the solver itself, since their numbering depends on the solver order, +// which is affected by the optimization. In any case, that's the only +// part the client cares about. +// +// The cross-check is too strict and may fail spuriously. Although the +// H&L paper describing HVN states that the solutions obtained should be +// identical, this is not the case in practice because HVN can collapse +// cycles involving *p even when pts(p)={}. Consider this example +// distilled from testdata/hello.go: +// +// var x T +// func f(p **T) { +// t0 = *p +// ... +// t1 = φ(t0, &x) +// *p = t1 +// } +// +// If f is dead code, we get: +// unoptimized: pts(p)={} pts(t0)={} pts(t1)={&x} +// optimized: pts(p)={} pts(t0)=pts(t1)=pts(*p)={&x} +// +// It's hard to argue that this is a bug: the result is sound and the +// loss of precision is inconsequential---f is dead code, after all. +// But unfortunately it limits the usefulness of the cross-check since +// failures must be carefully analyzed. Ben Hardekopf suggests (in +// personal correspondence) some approaches to mitigating it: +// +// If there is a node with an HVN points-to set that is a superset +// of the NORM points-to set, then either it's a bug or it's a +// result of this issue. If it's a result of this issue, then in +// the offline constraint graph there should be a REF node inside +// some cycle that reaches this node, and in the NORM solution the +// pointer being dereferenced by that REF node should be the empty +// set. If that isn't true then this is a bug. If it is true, then +// you can further check that in the NORM solution the "extra" +// points-to info in the HVN solution does in fact come from that +// purported cycle (if it doesn't, then this is still a bug). If +// you're doing the further check then you'll need to do it for +// each "extra" points-to element in the HVN points-to set. +// +// There are probably ways to optimize these checks by taking +// advantage of graph properties. For example, extraneous points-to +// info will flow through the graph and end up in many +// nodes. Rather than checking every node with extra info, you +// could probably work out the "origin point" of the extra info and +// just check there. Note that the check in the first bullet is +// looking for soundness bugs, while the check in the second bullet +// is looking for precision bugs; depending on your needs, you may +// care more about one than the other. +// +// which we should evaluate. The cross-check is nonetheless invaluable +// for all but one of the programs in the pointer_test suite. + +import ( + "fmt" + "io" + "reflect" + + "golang.org/x/tools/container/intsets" + "golang.org/x/tools/go/types" +) + +// A peLabel is a pointer-equivalence label: two nodes with the same +// peLabel have identical points-to solutions. +// +// The numbers are allocated consecutively like so: +// 0 not a pointer +// 1..N-1 addrConstraints (equals the constraint's .src field, hence sparse) +// ... offsetAddr constraints +// ... SCCs (with indirect nodes or multiple inputs) +// +// Each PE label denotes a set of pointers containing a single addr, a +// single offsetAddr, or some set of other PE labels. +// +type peLabel int + +type hvn struct { + a *analysis + N int // len(a.nodes) immediately after constraint generation + log io.Writer // (optional) log of HVN lemmas + onodes []*onode // nodes of the offline graph + label peLabel // the next available PE label + hvnLabel map[string]peLabel // hash-value numbering (PE label) for each set of onodeids + stack []onodeid // DFS stack + index int32 // next onode.index, from Tarjan's SCC algorithm + + // For each distinct offsetAddrConstraint (src, offset) pair, + // offsetAddrLabels records a unique PE label >= N. + offsetAddrLabels map[offsetAddr]peLabel +} + +// The index of an node in the offline graph. +// (Currently the first N align with the main nodes, +// but this may change with HRU.) +type onodeid uint32 + +// An onode is a node in the offline constraint graph. +// (Where ambiguous, members of analysis.nodes are referred to as +// "main graph" nodes.) +// +// Edges in the offline constraint graph (edges and implicit) point to +// the source, i.e. against the flow of values: they are dependencies. +// Implicit edges are used for SCC computation, but not for gathering +// incoming labels. +// +type onode struct { + rep onodeid // index of representative of SCC in offline constraint graph + + edges intsets.Sparse // constraint edges X-->Y (this onode is X) + implicit intsets.Sparse // implicit edges *X-->*Y (this onode is X) + peLabels intsets.Sparse // set of peLabels are pointer-equivalent to this one + indirect bool // node has points-to relations not represented in graph + + // Tarjan's SCC algorithm + index, lowlink int32 // Tarjan numbering + scc int32 // -ve => on stack; 0 => unvisited; +ve => node is root of a found SCC +} + +type offsetAddr struct { + ptr nodeid + offset uint32 +} + +// nextLabel issues the next unused pointer-equivalence label. +func (h *hvn) nextLabel() peLabel { + h.label++ + return h.label +} + +// ref(X) returns the index of the onode for *X. +func (h *hvn) ref(id onodeid) onodeid { + return id + onodeid(len(h.a.nodes)) +} + +// hvn computes pointer-equivalence labels (peLabels) using the Hash-based +// Value Numbering (HVN) algorithm described in Hardekopf & Lin, SAS'07. +// +func (a *analysis) hvn() { + start("HVN") + + if a.log != nil { + fmt.Fprintf(a.log, "\n\n==== Pointer equivalence optimization\n\n") + } + + h := hvn{ + a: a, + N: len(a.nodes), + log: a.log, + hvnLabel: make(map[string]peLabel), + offsetAddrLabels: make(map[offsetAddr]peLabel), + } + + if h.log != nil { + fmt.Fprintf(h.log, "\nCreating offline graph nodes...\n") + } + + // Create offline nodes. The first N nodes correspond to main + // graph nodes; the next N are their corresponding ref() nodes. + h.onodes = make([]*onode, 2*h.N) + for id := range a.nodes { + id := onodeid(id) + h.onodes[id] = &onode{} + h.onodes[h.ref(id)] = &onode{indirect: true} + } + + // Each node initially represents just itself. + for id, o := range h.onodes { + o.rep = onodeid(id) + } + + h.markIndirectNodes() + + // Reserve the first N PE labels for addrConstraints. + h.label = peLabel(h.N) + + // Add offline constraint edges. + if h.log != nil { + fmt.Fprintf(h.log, "\nAdding offline graph edges...\n") + } + for _, c := range a.constraints { + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "; %s\n", c) + } + c.presolve(&h) + } + + // Find and collapse SCCs. + if h.log != nil { + fmt.Fprintf(h.log, "\nFinding SCCs...\n") + } + h.index = 1 + for id, o := range h.onodes { + if id > 0 && o.index == 0 { + // Start depth-first search at each unvisited node. + h.visit(onodeid(id)) + } + } + + // Dump the solution + // (NB: somewhat redundant with logging from simplify().) + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\nPointer equivalences:\n") + for id, o := range h.onodes { + if id == 0 { + continue + } + if id == int(h.N) { + fmt.Fprintf(h.log, "---\n") + } + fmt.Fprintf(h.log, "o%d\t", id) + if o.rep != onodeid(id) { + fmt.Fprintf(h.log, "rep=o%d", o.rep) + } else { + fmt.Fprintf(h.log, "p%d", o.peLabels.Min()) + if o.indirect { + fmt.Fprint(h.log, " indirect") + } + } + fmt.Fprintln(h.log) + } + } + + // Simplify the main constraint graph + h.simplify() + + a.showCounts() + + stop("HVN") +} + +// ---- constraint-specific rules ---- + +// dst := &src +func (c *addrConstraint) presolve(h *hvn) { + // Each object (src) is an initial PE label. + label := peLabel(c.src) // label < N + if debugHVNVerbose && h.log != nil { + // duplicate log messages are possible + fmt.Fprintf(h.log, "\tcreate p%d: {&n%d}\n", label, c.src) + } + odst := onodeid(c.dst) + osrc := onodeid(c.src) + + // Assign dst this label. + h.onodes[odst].peLabels.Insert(int(label)) + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\to%d has p%d\n", odst, label) + } + + h.addImplicitEdge(h.ref(odst), osrc) // *dst ~~> src. +} + +// dst = src +func (c *copyConstraint) presolve(h *hvn) { + odst := onodeid(c.dst) + osrc := onodeid(c.src) + h.addEdge(odst, osrc) // dst --> src + h.addImplicitEdge(h.ref(odst), h.ref(osrc)) // *dst ~~> *src +} + +// dst = *src + offset +func (c *loadConstraint) presolve(h *hvn) { + odst := onodeid(c.dst) + osrc := onodeid(c.src) + if c.offset == 0 { + h.addEdge(odst, h.ref(osrc)) // dst --> *src + } else { + // We don't interpret load-with-offset, e.g. results + // of map value lookup, R-block of dynamic call, slice + // copy/append, reflection. + h.markIndirect(odst, "load with offset") + } +} + +// *dst + offset = src +func (c *storeConstraint) presolve(h *hvn) { + odst := onodeid(c.dst) + osrc := onodeid(c.src) + if c.offset == 0 { + h.onodes[h.ref(odst)].edges.Insert(int(osrc)) // *dst --> src + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\to%d --> o%d\n", h.ref(odst), osrc) + } + } else { + // We don't interpret store-with-offset. + // See discussion of soundness at markIndirectNodes. + } +} + +// dst = &src.offset +func (c *offsetAddrConstraint) presolve(h *hvn) { + // Give each distinct (addr, offset) pair a fresh PE label. + // The cache performs CSE, effectively. + key := offsetAddr{c.src, c.offset} + label, ok := h.offsetAddrLabels[key] + if !ok { + label = h.nextLabel() + h.offsetAddrLabels[key] = label + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\tcreate p%d: {&n%d.#%d}\n", + label, c.src, c.offset) + } + } + + // Assign dst this label. + h.onodes[c.dst].peLabels.Insert(int(label)) + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\to%d has p%d\n", c.dst, label) + } +} + +// dst = src.(typ) where typ is an interface +func (c *typeFilterConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.dst), "typeFilter result") +} + +// dst = src.(typ) where typ is concrete +func (c *untagConstraint) presolve(h *hvn) { + odst := onodeid(c.dst) + for end := odst + onodeid(h.a.sizeof(c.typ)); odst < end; odst++ { + h.markIndirect(odst, "untag result") + } +} + +// dst = src.method(c.params...) +func (c *invokeConstraint) presolve(h *hvn) { + // All methods are address-taken functions, so + // their formal P-blocks were already marked indirect. + + // Mark the caller's targets node as indirect. + sig := c.method.Type().(*types.Signature) + id := c.params + h.markIndirect(onodeid(c.params), "invoke targets node") + id++ + + id += nodeid(h.a.sizeof(sig.Params())) + + // Mark the caller's R-block as indirect. + end := id + nodeid(h.a.sizeof(sig.Results())) + for id < end { + h.markIndirect(onodeid(id), "invoke R-block") + id++ + } +} + +// markIndirectNodes marks as indirect nodes whose points-to relations +// are not entirely captured by the offline graph, including: +// +// (a) All address-taken nodes (including the following nodes within +// the same object). This is described in the paper. +// +// The most subtle cause of indirect nodes is the generation of +// store-with-offset constraints since the offline graph doesn't +// represent them. A global audit of constraint generation reveals the +// following uses of store-with-offset: +// +// (b) genDynamicCall, for P-blocks of dynamically called functions, +// to which dynamic copy edges will be added to them during +// solving: from storeConstraint for standalone functions, +// and from invokeConstraint for methods. +// All such P-blocks must be marked indirect. +// (c) MakeUpdate, to update the value part of a map object. +// All MakeMap objects's value parts must be marked indirect. +// (d) copyElems, to update the destination array. +// All array elements must be marked indirect. +// +// Not all indirect marking happens here. ref() nodes are marked +// indirect at construction, and each constraint's presolve() method may +// mark additional nodes. +// +func (h *hvn) markIndirectNodes() { + // (a) all address-taken nodes, plus all nodes following them + // within the same object, since these may be indirectly + // stored or address-taken. + for _, c := range h.a.constraints { + if c, ok := c.(*addrConstraint); ok { + start := h.a.enclosingObj(c.src) + end := start + nodeid(h.a.nodes[start].obj.size) + for id := c.src; id < end; id++ { + h.markIndirect(onodeid(id), "A-T object") + } + } + } + + // (b) P-blocks of all address-taken functions. + for id := 0; id < h.N; id++ { + obj := h.a.nodes[id].obj + + // TODO(adonovan): opt: if obj.cgn.fn is a method and + // obj.cgn is not its shared contour, this is an + // "inlined" static method call. We needn't consider it + // address-taken since no invokeConstraint will affect it. + + if obj != nil && obj.flags&otFunction != 0 && h.a.atFuncs[obj.cgn.fn] { + // address-taken function + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "n%d is address-taken: %s\n", id, obj.cgn.fn) + } + h.markIndirect(onodeid(id), "A-T func identity") + id++ + sig := obj.cgn.fn.Signature + psize := h.a.sizeof(sig.Params()) + if sig.Recv() != nil { + psize += h.a.sizeof(sig.Recv().Type()) + } + for end := id + int(psize); id < end; id++ { + h.markIndirect(onodeid(id), "A-T func P-block") + } + id-- + continue + } + } + + // (c) all map objects' value fields. + for _, id := range h.a.mapValues { + h.markIndirect(onodeid(id), "makemap.value") + } + + // (d) all array element objects. + // TODO(adonovan): opt: can we do better? + for id := 0; id < h.N; id++ { + // Identity node for an object of array type? + if tArray, ok := h.a.nodes[id].typ.(*types.Array); ok { + // Mark the array element nodes indirect. + // (Skip past the identity field.) + for _ = range h.a.flatten(tArray.Elem()) { + id++ + h.markIndirect(onodeid(id), "array elem") + } + } + } +} + +func (h *hvn) markIndirect(oid onodeid, comment string) { + h.onodes[oid].indirect = true + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\to%d is indirect: %s\n", oid, comment) + } +} + +// Adds an edge dst-->src. +// Note the unusual convention: edges are dependency (contraflow) edges. +func (h *hvn) addEdge(odst, osrc onodeid) { + h.onodes[odst].edges.Insert(int(osrc)) + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\to%d --> o%d\n", odst, osrc) + } +} + +func (h *hvn) addImplicitEdge(odst, osrc onodeid) { + h.onodes[odst].implicit.Insert(int(osrc)) + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\to%d ~~> o%d\n", odst, osrc) + } +} + +// visit implements the depth-first search of Tarjan's SCC algorithm. +// Precondition: x is canonical. +func (h *hvn) visit(x onodeid) { + h.checkCanonical(x) + xo := h.onodes[x] + xo.index = h.index + xo.lowlink = h.index + h.index++ + + h.stack = append(h.stack, x) // push + assert(xo.scc == 0, "node revisited") + xo.scc = -1 + + var deps []int + deps = xo.edges.AppendTo(deps) + deps = xo.implicit.AppendTo(deps) + + for _, y := range deps { + // Loop invariant: x is canonical. + + y := h.find(onodeid(y)) + + if x == y { + continue // nodes already coalesced + } + + xo := h.onodes[x] + yo := h.onodes[y] + + switch { + case yo.scc > 0: + // y is already a collapsed SCC + + case yo.scc < 0: + // y is on the stack, and thus in the current SCC. + if yo.index < xo.lowlink { + xo.lowlink = yo.index + } + + default: + // y is unvisited; visit it now. + h.visit(y) + // Note: x and y are now non-canonical. + + x = h.find(onodeid(x)) + + if yo.lowlink < xo.lowlink { + xo.lowlink = yo.lowlink + } + } + } + h.checkCanonical(x) + + // Is x the root of an SCC? + if xo.lowlink == xo.index { + // Coalesce all nodes in the SCC. + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "scc o%d\n", x) + } + for { + // Pop y from stack. + i := len(h.stack) - 1 + y := h.stack[i] + h.stack = h.stack[:i] + + h.checkCanonical(x) + xo := h.onodes[x] + h.checkCanonical(y) + yo := h.onodes[y] + + if xo == yo { + // SCC is complete. + xo.scc = 1 + h.labelSCC(x) + break + } + h.coalesce(x, y) + } + } +} + +// Precondition: x is canonical. +func (h *hvn) labelSCC(x onodeid) { + h.checkCanonical(x) + xo := h.onodes[x] + xpe := &xo.peLabels + + // All indirect nodes get new labels. + if xo.indirect { + label := h.nextLabel() + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\tcreate p%d: indirect SCC\n", label) + fmt.Fprintf(h.log, "\to%d has p%d\n", x, label) + } + + // Remove pre-labeling, in case a direct pre-labeled node was + // merged with an indirect one. + xpe.Clear() + xpe.Insert(int(label)) + + return + } + + // Invariant: all peLabels sets are non-empty. + // Those that are logically empty contain zero as their sole element. + // No other sets contains zero. + + // Find all labels coming in to the coalesced SCC node. + for _, y := range xo.edges.AppendTo(nil) { + y := h.find(onodeid(y)) + if y == x { + continue // already coalesced + } + ype := &h.onodes[y].peLabels + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\tedge from o%d = %s\n", y, ype) + } + + if ype.IsEmpty() { + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\tnode has no PE label\n") + } + } + assert(!ype.IsEmpty(), "incoming node has no PE label") + + if ype.Has(0) { + // {0} represents a non-pointer. + assert(ype.Len() == 1, "PE set contains {0, ...}") + } else { + xpe.UnionWith(ype) + } + } + + switch xpe.Len() { + case 0: + // SCC has no incoming non-zero PE labels: it is a non-pointer. + xpe.Insert(0) + + case 1: + // already a singleton + + default: + // SCC has multiple incoming non-zero PE labels. + // Find the canonical label representing this set. + // We use String() as a fingerprint consistent with Equals(). + key := xpe.String() + label, ok := h.hvnLabel[key] + if !ok { + label = h.nextLabel() + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\tcreate p%d: union %s\n", label, xpe.String()) + } + h.hvnLabel[key] = label + } + xpe.Clear() + xpe.Insert(int(label)) + } + + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\to%d has p%d\n", x, xpe.Min()) + } +} + +// coalesce combines two nodes in the offline constraint graph. +// Precondition: x and y are canonical. +func (h *hvn) coalesce(x, y onodeid) { + xo := h.onodes[x] + yo := h.onodes[y] + + // x becomes y's canonical representative. + yo.rep = x + + if debugHVNVerbose && h.log != nil { + fmt.Fprintf(h.log, "\tcoalesce o%d into o%d\n", y, x) + } + + // x accumulates y's edges. + xo.edges.UnionWith(&yo.edges) + yo.edges.Clear() + + // x accumulates y's implicit edges. + xo.implicit.UnionWith(&yo.implicit) + yo.implicit.Clear() + + // x accumulates y's pointer-equivalence labels. + xo.peLabels.UnionWith(&yo.peLabels) + yo.peLabels.Clear() + + // x accumulates y's indirect flag. + if yo.indirect { + xo.indirect = true + } +} + +// simplify computes a degenerate renumbering of nodeids from the PE +// labels assigned by the hvn, and uses it to simplify the main +// constraint graph, eliminating non-pointer nodes and duplicate +// constraints. +// +func (h *hvn) simplify() { + // canon maps each peLabel to its canonical main node. + canon := make([]nodeid, h.label) + for i := range canon { + canon[i] = nodeid(h.N) // indicates "unset" + } + + // mapping maps each main node index to the index of the canonical node. + mapping := make([]nodeid, len(h.a.nodes)) + + for id := range h.a.nodes { + id := nodeid(id) + if id == 0 { + canon[0] = 0 + mapping[0] = 0 + continue + } + oid := h.find(onodeid(id)) + peLabels := &h.onodes[oid].peLabels + assert(peLabels.Len() == 1, "PE class is not a singleton") + label := peLabel(peLabels.Min()) + + canonId := canon[label] + if canonId == nodeid(h.N) { + // id becomes the representative of the PE label. + canonId = id + canon[label] = canonId + + if h.a.log != nil { + fmt.Fprintf(h.a.log, "\tpts(n%d) is canonical : \t(%s)\n", + id, h.a.nodes[id].typ) + } + + } else { + // Link the solver states for the two nodes. + assert(h.a.nodes[canonId].solve != nil, "missing solver state") + h.a.nodes[id].solve = h.a.nodes[canonId].solve + + if h.a.log != nil { + // TODO(adonovan): debug: reorganize the log so it prints + // one line: + // pe y = x1, ..., xn + // for each canonical y. Requires allocation. + fmt.Fprintf(h.a.log, "\tpts(n%d) = pts(n%d) : %s\n", + id, canonId, h.a.nodes[id].typ) + } + } + + mapping[id] = canonId + } + + // Renumber the constraints, eliminate duplicates, and eliminate + // any containing non-pointers (n0). + addrs := make(map[addrConstraint]bool) + copys := make(map[copyConstraint]bool) + loads := make(map[loadConstraint]bool) + stores := make(map[storeConstraint]bool) + offsetAddrs := make(map[offsetAddrConstraint]bool) + untags := make(map[untagConstraint]bool) + typeFilters := make(map[typeFilterConstraint]bool) + invokes := make(map[invokeConstraint]bool) + + nbefore := len(h.a.constraints) + cc := h.a.constraints[:0] // in-situ compaction + for _, c := range h.a.constraints { + // Renumber. + switch c := c.(type) { + case *addrConstraint: + // Don't renumber c.src since it is the label of + // an addressable object and will appear in PT sets. + c.dst = mapping[c.dst] + default: + c.renumber(mapping) + } + + if c.ptr() == 0 { + continue // skip: constraint attached to non-pointer + } + + var dup bool + switch c := c.(type) { + case *addrConstraint: + _, dup = addrs[*c] + addrs[*c] = true + + case *copyConstraint: + if c.src == c.dst { + continue // skip degenerate copies + } + if c.src == 0 { + continue // skip copy from non-pointer + } + _, dup = copys[*c] + copys[*c] = true + + case *loadConstraint: + if c.src == 0 { + continue // skip load from non-pointer + } + _, dup = loads[*c] + loads[*c] = true + + case *storeConstraint: + if c.src == 0 { + continue // skip store from non-pointer + } + _, dup = stores[*c] + stores[*c] = true + + case *offsetAddrConstraint: + if c.src == 0 { + continue // skip offset from non-pointer + } + _, dup = offsetAddrs[*c] + offsetAddrs[*c] = true + + case *untagConstraint: + if c.src == 0 { + continue // skip untag of non-pointer + } + _, dup = untags[*c] + untags[*c] = true + + case *typeFilterConstraint: + if c.src == 0 { + continue // skip filter of non-pointer + } + _, dup = typeFilters[*c] + typeFilters[*c] = true + + case *invokeConstraint: + if c.params == 0 { + panic("non-pointer invoke.params") + } + if c.iface == 0 { + continue // skip invoke on non-pointer + } + _, dup = invokes[*c] + invokes[*c] = true + + default: + // We don't bother de-duping advanced constraints + // (e.g. reflection) since they are uncommon. + + // Eliminate constraints containing non-pointer nodeids. + // + // We use reflection to find the fields to avoid + // adding yet another method to constraint. + // + // TODO(adonovan): experiment with a constraint + // method that returns a slice of pointers to + // nodeids fields to enable uniform iteration; + // the renumber() method could be removed and + // implemented using the new one. + // + // TODO(adonovan): opt: this is unsound since + // some constraints still have an effect if one + // of the operands is zero: rVCall, rVMapIndex, + // rvSetMapIndex. Handle them specially. + rtNodeid := reflect.TypeOf(nodeid(0)) + x := reflect.ValueOf(c).Elem() + for i, nf := 0, x.NumField(); i < nf; i++ { + f := x.Field(i) + if f.Type() == rtNodeid { + if f.Uint() == 0 { + dup = true // skip it + break + } + } + } + } + if dup { + continue // skip duplicates + } + + cc = append(cc, c) + } + h.a.constraints = cc + + if h.log != nil { + fmt.Fprintf(h.log, "#constraints: was %d, now %d\n", nbefore, len(h.a.constraints)) + } +} + +// find returns the canonical onodeid for x. +// (The onodes form a disjoint set forest.) +func (h *hvn) find(x onodeid) onodeid { + // TODO(adonovan): opt: this is a CPU hotspot. Try "union by rank". + xo := h.onodes[x] + rep := xo.rep + if rep != x { + rep = h.find(rep) // simple path compression + xo.rep = rep + } + return rep +} + +func (h *hvn) checkCanonical(x onodeid) { + if debugHVN { + assert(x == h.find(x), "not canonical") + } +} + +func assert(p bool, msg string) { + if debugHVN && !p { + panic("assertion failed: " + msg) + } +} diff --git a/vendor/golang.org/x/tools/go/pointer/intrinsics.go b/vendor/golang.org/x/tools/go/pointer/intrinsics.go new file mode 100644 index 0000000000..0246f34a93 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/intrinsics.go @@ -0,0 +1,363 @@ +// Copyright 2013 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.5 + +package pointer + +// This package defines the treatment of intrinsics, i.e. library +// functions requiring special analytical treatment. +// +// Most of these are C or assembly functions, but even some Go +// functions require may special treatment if the analysis completely +// replaces the implementation of an API such as reflection. + +// TODO(adonovan): support a means of writing analytic summaries in +// the target code, so that users can summarise the effects of their +// own C functions using a snippet of Go. + +import ( + "fmt" + "go/types" + + "golang.org/x/tools/go/ssa" +) + +// Instances of 'intrinsic' generate analysis constraints for calls to +// intrinsic functions. +// Implementations may exploit information from the calling site +// via cgn.callersite; for shared contours this is nil. +type intrinsic func(a *analysis, cgn *cgnode) + +// Initialized in explicit init() to defeat (spurious) initialization +// cycle error. +var intrinsicsByName = make(map[string]intrinsic) + +func init() { + // Key strings are from Function.String(). + // That little dot ۰ is an Arabic zero numeral (U+06F0), + // categories [Nd]. + for name, fn := range map[string]intrinsic{ + // Other packages. + "bytes.Equal": ext۰NoEffect, + "bytes.IndexByte": ext۰NoEffect, + "crypto/aes.decryptBlockAsm": ext۰NoEffect, + "crypto/aes.encryptBlockAsm": ext۰NoEffect, + "crypto/aes.expandKeyAsm": ext۰NoEffect, + "crypto/aes.hasAsm": ext۰NoEffect, + "crypto/md5.block": ext۰NoEffect, + "crypto/rc4.xorKeyStream": ext۰NoEffect, + "crypto/sha1.block": ext۰NoEffect, + "crypto/sha256.block": ext۰NoEffect, + "hash/crc32.castagnoliSSE42": ext۰NoEffect, + "hash/crc32.haveSSE42": ext۰NoEffect, + "math.Abs": ext۰NoEffect, + "math.Acos": ext۰NoEffect, + "math.Asin": ext۰NoEffect, + "math.Atan": ext۰NoEffect, + "math.Atan2": ext۰NoEffect, + "math.Ceil": ext۰NoEffect, + "math.Cos": ext۰NoEffect, + "math.Dim": ext۰NoEffect, + "math.Exp": ext۰NoEffect, + "math.Exp2": ext۰NoEffect, + "math.Expm1": ext۰NoEffect, + "math.Float32bits": ext۰NoEffect, + "math.Float32frombits": ext۰NoEffect, + "math.Float64bits": ext۰NoEffect, + "math.Float64frombits": ext۰NoEffect, + "math.Floor": ext۰NoEffect, + "math.Frexp": ext۰NoEffect, + "math.Hypot": ext۰NoEffect, + "math.Ldexp": ext۰NoEffect, + "math.Log": ext۰NoEffect, + "math.Log10": ext۰NoEffect, + "math.Log1p": ext۰NoEffect, + "math.Log2": ext۰NoEffect, + "math.Max": ext۰NoEffect, + "math.Min": ext۰NoEffect, + "math.Mod": ext۰NoEffect, + "math.Modf": ext۰NoEffect, + "math.Remainder": ext۰NoEffect, + "math.Sin": ext۰NoEffect, + "math.Sincos": ext۰NoEffect, + "math.Sqrt": ext۰NoEffect, + "math.Tan": ext۰NoEffect, + "math.Trunc": ext۰NoEffect, + "math/big.addMulVVW": ext۰NoEffect, + "math/big.addVV": ext۰NoEffect, + "math/big.addVW": ext۰NoEffect, + "math/big.bitLen": ext۰NoEffect, + "math/big.divWVW": ext۰NoEffect, + "math/big.divWW": ext۰NoEffect, + "math/big.mulAddVWW": ext۰NoEffect, + "math/big.mulWW": ext۰NoEffect, + "math/big.shlVU": ext۰NoEffect, + "math/big.shrVU": ext۰NoEffect, + "math/big.subVV": ext۰NoEffect, + "math/big.subVW": ext۰NoEffect, + "net.runtime_Semacquire": ext۰NoEffect, + "net.runtime_Semrelease": ext۰NoEffect, + "net.runtime_pollClose": ext۰NoEffect, + "net.runtime_pollOpen": ext۰NoEffect, + "net.runtime_pollReset": ext۰NoEffect, + "net.runtime_pollServerInit": ext۰NoEffect, + "net.runtime_pollSetDeadline": ext۰NoEffect, + "net.runtime_pollUnblock": ext۰NoEffect, + "net.runtime_pollWait": ext۰NoEffect, + "net.runtime_pollWaitCanceled": ext۰NoEffect, + "os.epipecheck": ext۰NoEffect, + // All other runtime functions are treated as NoEffect. + "runtime.SetFinalizer": ext۰runtime۰SetFinalizer, + "strings.IndexByte": ext۰NoEffect, + "sync.runtime_Semacquire": ext۰NoEffect, + "sync.runtime_Semrelease": ext۰NoEffect, + "sync.runtime_Syncsemacquire": ext۰NoEffect, + "sync.runtime_Syncsemcheck": ext۰NoEffect, + "sync.runtime_Syncsemrelease": ext۰NoEffect, + "sync.runtime_procPin": ext۰NoEffect, + "sync.runtime_procUnpin": ext۰NoEffect, + "sync.runtime_registerPool": ext۰NoEffect, + "sync/atomic.AddInt32": ext۰NoEffect, + "sync/atomic.AddInt64": ext۰NoEffect, + "sync/atomic.AddUint32": ext۰NoEffect, + "sync/atomic.AddUint64": ext۰NoEffect, + "sync/atomic.AddUintptr": ext۰NoEffect, + "sync/atomic.CompareAndSwapInt32": ext۰NoEffect, + "sync/atomic.CompareAndSwapUint32": ext۰NoEffect, + "sync/atomic.CompareAndSwapUint64": ext۰NoEffect, + "sync/atomic.CompareAndSwapUintptr": ext۰NoEffect, + "sync/atomic.LoadInt32": ext۰NoEffect, + "sync/atomic.LoadInt64": ext۰NoEffect, + "sync/atomic.LoadPointer": ext۰NoEffect, // ignore unsafe.Pointers + "sync/atomic.LoadUint32": ext۰NoEffect, + "sync/atomic.LoadUint64": ext۰NoEffect, + "sync/atomic.LoadUintptr": ext۰NoEffect, + "sync/atomic.StoreInt32": ext۰NoEffect, + "sync/atomic.StorePointer": ext۰NoEffect, // ignore unsafe.Pointers + "sync/atomic.StoreUint32": ext۰NoEffect, + "sync/atomic.StoreUintptr": ext۰NoEffect, + "syscall.Close": ext۰NoEffect, + "syscall.Exit": ext۰NoEffect, + "syscall.Getpid": ext۰NoEffect, + "syscall.Getwd": ext۰NoEffect, + "syscall.Kill": ext۰NoEffect, + "syscall.RawSyscall": ext۰NoEffect, + "syscall.RawSyscall6": ext۰NoEffect, + "syscall.Syscall": ext۰NoEffect, + "syscall.Syscall6": ext۰NoEffect, + "syscall.runtime_AfterFork": ext۰NoEffect, + "syscall.runtime_BeforeFork": ext۰NoEffect, + "syscall.setenv_c": ext۰NoEffect, + "time.Sleep": ext۰NoEffect, + "time.now": ext۰NoEffect, + "time.startTimer": ext۰time۰startTimer, + "time.stopTimer": ext۰NoEffect, + } { + intrinsicsByName[name] = fn + } +} + +// findIntrinsic returns the constraint generation function for an +// intrinsic function fn, or nil if the function should be handled normally. +// +func (a *analysis) findIntrinsic(fn *ssa.Function) intrinsic { + // Consult the *Function-keyed cache. + // A cached nil indicates a normal non-intrinsic function. + impl, ok := a.intrinsics[fn] + if !ok { + impl = intrinsicsByName[fn.String()] // may be nil + + if a.isReflect(fn) { + if !a.config.Reflection { + impl = ext۰NoEffect // reflection disabled + } else if impl == nil { + // Ensure all "reflect" code is treated intrinsically. + impl = ext۰NotYetImplemented + } + } else if impl == nil && fn.Pkg != nil && fn.Pkg.Pkg.Path() == "runtime" { + // Ignore "runtime" (except SetFinalizer): + // it has few interesting effects on aliasing + // and is full of unsafe code we can't analyze. + impl = ext۰NoEffect + } + + a.intrinsics[fn] = impl + } + return impl +} + +// isReflect reports whether fn belongs to the "reflect" package. +func (a *analysis) isReflect(fn *ssa.Function) bool { + if a.reflectValueObj == nil { + return false // "reflect" package not loaded + } + reflectPackage := a.reflectValueObj.Pkg() + if fn.Pkg != nil && fn.Pkg.Pkg == reflectPackage { + return true + } + // Synthetic wrappers have a nil Pkg, so they slip through the + // previous check. Check the receiver package. + // TODO(adonovan): should synthetic wrappers have a non-nil Pkg? + if recv := fn.Signature.Recv(); recv != nil { + if named, ok := deref(recv.Type()).(*types.Named); ok { + if named.Obj().Pkg() == reflectPackage { + return true // e.g. wrapper of (reflect.Value).f + } + } + } + return false +} + +// A trivial intrinsic suitable for any function that does not: +// 1) induce aliases between its arguments or any global variables; +// 2) call any functions; or +// 3) create any labels. +// +// Many intrinsics (such as CompareAndSwapInt32) have a fourth kind of +// effect: loading or storing through a pointer. Though these could +// be significant, we deliberately ignore them because they are +// generally not worth the effort. +// +// We sometimes violate condition #3 if the function creates only +// non-function labels, as the control-flow graph is still sound. +// +func ext۰NoEffect(a *analysis, cgn *cgnode) {} + +func ext۰NotYetImplemented(a *analysis, cgn *cgnode) { + fn := cgn.fn + a.warnf(fn.Pos(), "unsound: intrinsic treatment of %s not yet implemented", fn) +} + +// ---------- func runtime.SetFinalizer(x, f interface{}) ---------- + +// runtime.SetFinalizer(x, f) +type runtimeSetFinalizerConstraint struct { + targets nodeid // (indirect) + f nodeid // (ptr) + x nodeid +} + +func (c *runtimeSetFinalizerConstraint) ptr() nodeid { return c.f } +func (c *runtimeSetFinalizerConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.targets), "SetFinalizer.targets") +} +func (c *runtimeSetFinalizerConstraint) renumber(mapping []nodeid) { + c.targets = mapping[c.targets] + c.f = mapping[c.f] + c.x = mapping[c.x] +} + +func (c *runtimeSetFinalizerConstraint) String() string { + return fmt.Sprintf("runtime.SetFinalizer(n%d, n%d)", c.x, c.f) +} + +func (c *runtimeSetFinalizerConstraint) solve(a *analysis, delta *nodeset) { + for _, fObj := range delta.AppendTo(a.deltaSpace) { + tDyn, f, indirect := a.taggedValue(nodeid(fObj)) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + tSig, ok := tDyn.Underlying().(*types.Signature) + if !ok { + continue // not a function + } + if tSig.Recv() != nil { + panic(tSig) + } + if tSig.Params().Len() != 1 { + continue // not a unary function + } + + // Extract x to tmp. + tx := tSig.Params().At(0).Type() + tmp := a.addNodes(tx, "SetFinalizer.tmp") + a.typeAssert(tx, tmp, c.x, false) + + // Call f(tmp). + a.store(f, tmp, 1, a.sizeof(tx)) + + // Add dynamic call target. + if a.onlineCopy(c.targets, f) { + a.addWork(c.targets) + } + } +} + +func ext۰runtime۰SetFinalizer(a *analysis, cgn *cgnode) { + // This is the shared contour, used for dynamic calls. + targets := a.addOneNode(tInvalid, "SetFinalizer.targets", nil) + cgn.sites = append(cgn.sites, &callsite{targets: targets}) + params := a.funcParams(cgn.obj) + a.addConstraint(&runtimeSetFinalizerConstraint{ + targets: targets, + x: params, + f: params + 1, + }) +} + +// ---------- func time.startTimer(t *runtimeTimer) ---------- + +// time.StartTimer(t) +type timeStartTimerConstraint struct { + targets nodeid // (indirect) + t nodeid // (ptr) +} + +func (c *timeStartTimerConstraint) ptr() nodeid { return c.t } +func (c *timeStartTimerConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.targets), "StartTimer.targets") +} +func (c *timeStartTimerConstraint) renumber(mapping []nodeid) { + c.targets = mapping[c.targets] + c.t = mapping[c.t] +} + +func (c *timeStartTimerConstraint) String() string { + return fmt.Sprintf("time.startTimer(n%d)", c.t) +} + +func (c *timeStartTimerConstraint) solve(a *analysis, delta *nodeset) { + for _, tObj := range delta.AppendTo(a.deltaSpace) { + t := nodeid(tObj) + + // We model startTimer as if it was defined thus: + // func startTimer(t *runtimeTimer) { t.f(t.arg) } + + // We hard-code the field offsets of time.runtimeTimer: + // type runtimeTimer struct { + // 0 __identity__ + // 1 i int32 + // 2 when int64 + // 3 period int64 + // 4 f func(int64, interface{}) + // 5 arg interface{} + // } + f := t + 4 + arg := t + 5 + + // store t.arg to t.f.params[0] + // (offset 1 => skip identity) + a.store(f, arg, 1, 1) + + // Add dynamic call target. + if a.onlineCopy(c.targets, f) { + a.addWork(c.targets) + } + } +} + +func ext۰time۰startTimer(a *analysis, cgn *cgnode) { + // This is the shared contour, used for dynamic calls. + targets := a.addOneNode(tInvalid, "startTimer.targets", nil) + cgn.sites = append(cgn.sites, &callsite{targets: targets}) + params := a.funcParams(cgn.obj) + a.addConstraint(&timeStartTimerConstraint{ + targets: targets, + t: params, + }) +} diff --git a/vendor/golang.org/x/tools/go/pointer/intrinsics14.go b/vendor/golang.org/x/tools/go/pointer/intrinsics14.go new file mode 100644 index 0000000000..5e108d27e1 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/intrinsics14.go @@ -0,0 +1,382 @@ +// Copyright 2013 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.5 + +package pointer + +// This package defines the treatment of intrinsics, i.e. library +// functions requiring special analytical treatment. +// +// Most of these are C or assembly functions, but even some Go +// functions require may special treatment if the analysis completely +// replaces the implementation of an API such as reflection. + +// TODO(adonovan): support a means of writing analytic summaries in +// the target code, so that users can summarise the effects of their +// own C functions using a snippet of Go. + +import ( + "fmt" + + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types" +) + +// Instances of 'intrinsic' generate analysis constraints for calls to +// intrinsic functions. +// Implementations may exploit information from the calling site +// via cgn.callersite; for shared contours this is nil. +type intrinsic func(a *analysis, cgn *cgnode) + +// Initialized in explicit init() to defeat (spurious) initialization +// cycle error. +var intrinsicsByName = make(map[string]intrinsic) + +func init() { + // Key strings are from Function.String(). + // That little dot ۰ is an Arabic zero numeral (U+06F0), + // categories [Nd]. + for name, fn := range map[string]intrinsic{ + // Other packages. + "bytes.Equal": ext۰NoEffect, + "bytes.IndexByte": ext۰NoEffect, + "crypto/aes.decryptBlockAsm": ext۰NoEffect, + "crypto/aes.encryptBlockAsm": ext۰NoEffect, + "crypto/aes.expandKeyAsm": ext۰NoEffect, + "crypto/aes.hasAsm": ext۰NoEffect, + "crypto/md5.block": ext۰NoEffect, + "crypto/rc4.xorKeyStream": ext۰NoEffect, + "crypto/sha1.block": ext۰NoEffect, + "crypto/sha256.block": ext۰NoEffect, + "hash/crc32.castagnoliSSE42": ext۰NoEffect, + "hash/crc32.haveSSE42": ext۰NoEffect, + "math.Abs": ext۰NoEffect, + "math.Acos": ext۰NoEffect, + "math.Asin": ext۰NoEffect, + "math.Atan": ext۰NoEffect, + "math.Atan2": ext۰NoEffect, + "math.Ceil": ext۰NoEffect, + "math.Cos": ext۰NoEffect, + "math.Dim": ext۰NoEffect, + "math.Exp": ext۰NoEffect, + "math.Exp2": ext۰NoEffect, + "math.Expm1": ext۰NoEffect, + "math.Float32bits": ext۰NoEffect, + "math.Float32frombits": ext۰NoEffect, + "math.Float64bits": ext۰NoEffect, + "math.Float64frombits": ext۰NoEffect, + "math.Floor": ext۰NoEffect, + "math.Frexp": ext۰NoEffect, + "math.Hypot": ext۰NoEffect, + "math.Ldexp": ext۰NoEffect, + "math.Log": ext۰NoEffect, + "math.Log10": ext۰NoEffect, + "math.Log1p": ext۰NoEffect, + "math.Log2": ext۰NoEffect, + "math.Max": ext۰NoEffect, + "math.Min": ext۰NoEffect, + "math.Mod": ext۰NoEffect, + "math.Modf": ext۰NoEffect, + "math.Remainder": ext۰NoEffect, + "math.Sin": ext۰NoEffect, + "math.Sincos": ext۰NoEffect, + "math.Sqrt": ext۰NoEffect, + "math.Tan": ext۰NoEffect, + "math.Trunc": ext۰NoEffect, + "math/big.addMulVVW": ext۰NoEffect, + "math/big.addVV": ext۰NoEffect, + "math/big.addVW": ext۰NoEffect, + "math/big.bitLen": ext۰NoEffect, + "math/big.divWVW": ext۰NoEffect, + "math/big.divWW": ext۰NoEffect, + "math/big.mulAddVWW": ext۰NoEffect, + "math/big.mulWW": ext۰NoEffect, + "math/big.shlVU": ext۰NoEffect, + "math/big.shrVU": ext۰NoEffect, + "math/big.subVV": ext۰NoEffect, + "math/big.subVW": ext۰NoEffect, + "net.runtime_Semacquire": ext۰NoEffect, + "net.runtime_Semrelease": ext۰NoEffect, + "net.runtime_pollClose": ext۰NoEffect, + "net.runtime_pollOpen": ext۰NoEffect, + "net.runtime_pollReset": ext۰NoEffect, + "net.runtime_pollServerInit": ext۰NoEffect, + "net.runtime_pollSetDeadline": ext۰NoEffect, + "net.runtime_pollUnblock": ext۰NoEffect, + "net.runtime_pollWait": ext۰NoEffect, + "net.runtime_pollWaitCanceled": ext۰NoEffect, + "os.epipecheck": ext۰NoEffect, + "runtime.BlockProfile": ext۰NoEffect, + "runtime.Breakpoint": ext۰NoEffect, + "runtime.CPUProfile": ext۰NoEffect, // good enough + "runtime.Caller": ext۰NoEffect, + "runtime.Callers": ext۰NoEffect, // good enough + "runtime.FuncForPC": ext۰NoEffect, + "runtime.GC": ext۰NoEffect, + "runtime.GOMAXPROCS": ext۰NoEffect, + "runtime.Goexit": ext۰NoEffect, + "runtime.GoroutineProfile": ext۰NoEffect, + "runtime.Gosched": ext۰NoEffect, + "runtime.MemProfile": ext۰NoEffect, + "runtime.NumCPU": ext۰NoEffect, + "runtime.NumGoroutine": ext۰NoEffect, + "runtime.ReadMemStats": ext۰NoEffect, + "runtime.SetBlockProfileRate": ext۰NoEffect, + "runtime.SetCPUProfileRate": ext۰NoEffect, + "runtime.SetFinalizer": ext۰runtime۰SetFinalizer, + "runtime.Stack": ext۰NoEffect, + "runtime.ThreadCreateProfile": ext۰NoEffect, + "runtime.cstringToGo": ext۰NoEffect, + "runtime.funcentry_go": ext۰NoEffect, + "runtime.funcline_go": ext۰NoEffect, + "runtime.funcname_go": ext۰NoEffect, + "runtime.getgoroot": ext۰NoEffect, + "runtime/pprof.runtime_cyclesPerSecond": ext۰NoEffect, + "strings.IndexByte": ext۰NoEffect, + "sync.runtime_Semacquire": ext۰NoEffect, + "sync.runtime_Semrelease": ext۰NoEffect, + "sync.runtime_Syncsemacquire": ext۰NoEffect, + "sync.runtime_Syncsemcheck": ext۰NoEffect, + "sync.runtime_Syncsemrelease": ext۰NoEffect, + "sync.runtime_procPin": ext۰NoEffect, + "sync.runtime_procUnpin": ext۰NoEffect, + "sync.runtime_registerPool": ext۰NoEffect, + "sync/atomic.AddInt32": ext۰NoEffect, + "sync/atomic.AddInt64": ext۰NoEffect, + "sync/atomic.AddUint32": ext۰NoEffect, + "sync/atomic.AddUint64": ext۰NoEffect, + "sync/atomic.AddUintptr": ext۰NoEffect, + "sync/atomic.CompareAndSwapInt32": ext۰NoEffect, + "sync/atomic.CompareAndSwapUint32": ext۰NoEffect, + "sync/atomic.CompareAndSwapUint64": ext۰NoEffect, + "sync/atomic.CompareAndSwapUintptr": ext۰NoEffect, + "sync/atomic.LoadInt32": ext۰NoEffect, + "sync/atomic.LoadInt64": ext۰NoEffect, + "sync/atomic.LoadPointer": ext۰NoEffect, // ignore unsafe.Pointers + "sync/atomic.LoadUint32": ext۰NoEffect, + "sync/atomic.LoadUint64": ext۰NoEffect, + "sync/atomic.LoadUintptr": ext۰NoEffect, + "sync/atomic.StoreInt32": ext۰NoEffect, + "sync/atomic.StorePointer": ext۰NoEffect, // ignore unsafe.Pointers + "sync/atomic.StoreUint32": ext۰NoEffect, + "sync/atomic.StoreUintptr": ext۰NoEffect, + "syscall.Close": ext۰NoEffect, + "syscall.Exit": ext۰NoEffect, + "syscall.Getpid": ext۰NoEffect, + "syscall.Getwd": ext۰NoEffect, + "syscall.Kill": ext۰NoEffect, + "syscall.RawSyscall": ext۰NoEffect, + "syscall.RawSyscall6": ext۰NoEffect, + "syscall.Syscall": ext۰NoEffect, + "syscall.Syscall6": ext۰NoEffect, + "syscall.runtime_AfterFork": ext۰NoEffect, + "syscall.runtime_BeforeFork": ext۰NoEffect, + "syscall.setenv_c": ext۰NoEffect, + "time.Sleep": ext۰NoEffect, + "time.now": ext۰NoEffect, + "time.startTimer": ext۰time۰startTimer, + "time.stopTimer": ext۰NoEffect, + } { + intrinsicsByName[name] = fn + } +} + +// findIntrinsic returns the constraint generation function for an +// intrinsic function fn, or nil if the function should be handled normally. +// +func (a *analysis) findIntrinsic(fn *ssa.Function) intrinsic { + // Consult the *Function-keyed cache. + // A cached nil indicates a normal non-intrinsic function. + impl, ok := a.intrinsics[fn] + if !ok { + impl = intrinsicsByName[fn.String()] // may be nil + + if a.isReflect(fn) { + if !a.config.Reflection { + impl = ext۰NoEffect // reflection disabled + } else if impl == nil { + // Ensure all "reflect" code is treated intrinsically. + impl = ext۰NotYetImplemented + } + } + + a.intrinsics[fn] = impl + } + return impl +} + +// isReflect reports whether fn belongs to the "reflect" package. +func (a *analysis) isReflect(fn *ssa.Function) bool { + if a.reflectValueObj == nil { + return false // "reflect" package not loaded + } + reflectPackage := a.reflectValueObj.Pkg() + if fn.Pkg != nil && fn.Pkg.Pkg == reflectPackage { + return true + } + // Synthetic wrappers have a nil Pkg, so they slip through the + // previous check. Check the receiver package. + // TODO(adonovan): should synthetic wrappers have a non-nil Pkg? + if recv := fn.Signature.Recv(); recv != nil { + if named, ok := deref(recv.Type()).(*types.Named); ok { + if named.Obj().Pkg() == reflectPackage { + return true // e.g. wrapper of (reflect.Value).f + } + } + } + return false +} + +// A trivial intrinsic suitable for any function that does not: +// 1) induce aliases between its arguments or any global variables; +// 2) call any functions; or +// 3) create any labels. +// +// Many intrinsics (such as CompareAndSwapInt32) have a fourth kind of +// effect: loading or storing through a pointer. Though these could +// be significant, we deliberately ignore them because they are +// generally not worth the effort. +// +// We sometimes violate condition #3 if the function creates only +// non-function labels, as the control-flow graph is still sound. +// +func ext۰NoEffect(a *analysis, cgn *cgnode) {} + +func ext۰NotYetImplemented(a *analysis, cgn *cgnode) { + fn := cgn.fn + a.warnf(fn.Pos(), "unsound: intrinsic treatment of %s not yet implemented", fn) +} + +// ---------- func runtime.SetFinalizer(x, f interface{}) ---------- + +// runtime.SetFinalizer(x, f) +type runtimeSetFinalizerConstraint struct { + targets nodeid // (indirect) + f nodeid // (ptr) + x nodeid +} + +func (c *runtimeSetFinalizerConstraint) ptr() nodeid { return c.f } +func (c *runtimeSetFinalizerConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.targets), "SetFinalizer.targets") +} +func (c *runtimeSetFinalizerConstraint) renumber(mapping []nodeid) { + c.targets = mapping[c.targets] + c.f = mapping[c.f] + c.x = mapping[c.x] +} + +func (c *runtimeSetFinalizerConstraint) String() string { + return fmt.Sprintf("runtime.SetFinalizer(n%d, n%d)", c.x, c.f) +} + +func (c *runtimeSetFinalizerConstraint) solve(a *analysis, delta *nodeset) { + for _, fObj := range delta.AppendTo(a.deltaSpace) { + tDyn, f, indirect := a.taggedValue(nodeid(fObj)) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + tSig, ok := tDyn.Underlying().(*types.Signature) + if !ok { + continue // not a function + } + if tSig.Recv() != nil { + panic(tSig) + } + if tSig.Params().Len() != 1 { + continue // not a unary function + } + + // Extract x to tmp. + tx := tSig.Params().At(0).Type() + tmp := a.addNodes(tx, "SetFinalizer.tmp") + a.typeAssert(tx, tmp, c.x, false) + + // Call f(tmp). + a.store(f, tmp, 1, a.sizeof(tx)) + + // Add dynamic call target. + if a.onlineCopy(c.targets, f) { + a.addWork(c.targets) + } + } +} + +func ext۰runtime۰SetFinalizer(a *analysis, cgn *cgnode) { + // This is the shared contour, used for dynamic calls. + targets := a.addOneNode(tInvalid, "SetFinalizer.targets", nil) + cgn.sites = append(cgn.sites, &callsite{targets: targets}) + params := a.funcParams(cgn.obj) + a.addConstraint(&runtimeSetFinalizerConstraint{ + targets: targets, + x: params, + f: params + 1, + }) +} + +// ---------- func time.startTimer(t *runtimeTimer) ---------- + +// time.StartTimer(t) +type timeStartTimerConstraint struct { + targets nodeid // (indirect) + t nodeid // (ptr) +} + +func (c *timeStartTimerConstraint) ptr() nodeid { return c.t } +func (c *timeStartTimerConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.targets), "StartTimer.targets") +} +func (c *timeStartTimerConstraint) renumber(mapping []nodeid) { + c.targets = mapping[c.targets] + c.t = mapping[c.t] +} + +func (c *timeStartTimerConstraint) String() string { + return fmt.Sprintf("time.startTimer(n%d)", c.t) +} + +func (c *timeStartTimerConstraint) solve(a *analysis, delta *nodeset) { + for _, tObj := range delta.AppendTo(a.deltaSpace) { + t := nodeid(tObj) + + // We model startTimer as if it was defined thus: + // func startTimer(t *runtimeTimer) { t.f(t.arg) } + + // We hard-code the field offsets of time.runtimeTimer: + // type runtimeTimer struct { + // 0 __identity__ + // 1 i int32 + // 2 when int64 + // 3 period int64 + // 4 f func(int64, interface{}) + // 5 arg interface{} + // } + f := t + 4 + arg := t + 5 + + // store t.arg to t.f.params[0] + // (offset 1 => skip identity) + a.store(f, arg, 1, 1) + + // Add dynamic call target. + if a.onlineCopy(c.targets, f) { + a.addWork(c.targets) + } + } +} + +func ext۰time۰startTimer(a *analysis, cgn *cgnode) { + // This is the shared contour, used for dynamic calls. + targets := a.addOneNode(tInvalid, "startTimer.targets", nil) + cgn.sites = append(cgn.sites, &callsite{targets: targets}) + params := a.funcParams(cgn.obj) + a.addConstraint(&timeStartTimerConstraint{ + targets: targets, + t: params, + }) +} diff --git a/vendor/golang.org/x/tools/go/pointer/labels.go b/vendor/golang.org/x/tools/go/pointer/labels.go new file mode 100644 index 0000000000..bfe60d2f56 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/labels.go @@ -0,0 +1,154 @@ +// Copyright 2013 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.5 + +package pointer + +import ( + "fmt" + "go/token" + "go/types" + "strings" + + "golang.org/x/tools/go/ssa" +) + +// A Label is an entity that may be pointed to by a pointer, map, +// channel, 'func', slice or interface. +// +// Labels include: +// - functions +// - globals +// - tagged objects, representing interfaces and reflect.Values +// - arrays created by conversions (e.g. []byte("foo"), []byte(s)) +// - stack- and heap-allocated variables (including composite literals) +// - channels, maps and arrays created by make() +// - intrinsic or reflective operations that allocate (e.g. append, reflect.New) +// - intrinsic objects, e.g. the initial array behind os.Args. +// - and their subelements, e.g. "alloc.y[*].z" +// +// Labels are so varied that they defy good generalizations; +// some have no value, no callgraph node, or no position. +// Many objects have types that are inexpressible in Go: +// maps, channels, functions, tagged objects. +// +// At most one of Value() or ReflectType() may return non-nil. +// +type Label struct { + obj *object // the addressable memory location containing this label + subelement *fieldInfo // subelement path within obj, e.g. ".a.b[*].c" +} + +// Value returns the ssa.Value that allocated this label's object, if any. +func (l Label) Value() ssa.Value { + val, _ := l.obj.data.(ssa.Value) + return val +} + +// ReflectType returns the type represented by this label if it is an +// reflect.rtype instance object or *reflect.rtype-tagged object. +// +func (l Label) ReflectType() types.Type { + rtype, _ := l.obj.data.(types.Type) + return rtype +} + +// Path returns the path to the subelement of the object containing +// this label. For example, ".x[*].y". +// +func (l Label) Path() string { + return l.subelement.path() +} + +// Pos returns the position of this label, if known, zero otherwise. +func (l Label) Pos() token.Pos { + switch data := l.obj.data.(type) { + case ssa.Value: + return data.Pos() + case types.Type: + if nt, ok := deref(data).(*types.Named); ok { + return nt.Obj().Pos() + } + } + if cgn := l.obj.cgn; cgn != nil { + return cgn.fn.Pos() + } + return token.NoPos +} + +// String returns the printed form of this label. +// +// Examples: Object type: +// x (a variable) +// (sync.Mutex).Lock (a function) +// convert (array created by conversion) +// makemap (map allocated via make) +// makechan (channel allocated via make) +// makeinterface (tagged object allocated by makeinterface) +// (allocation in instrinsic) +// sync.Mutex (a reflect.rtype instance) +// (an intrinsic object) +// +// Labels within compound objects have subelement paths: +// x.y[*].z (a struct variable, x) +// append.y[*].z (array allocated by append) +// makeslice.y[*].z (array allocated via make) +// +// TODO(adonovan): expose func LabelString(*types.Package, Label). +// +func (l Label) String() string { + var s string + switch v := l.obj.data.(type) { + case types.Type: + return v.String() + + case string: + s = v // an intrinsic object (e.g. os.Args[*]) + + case nil: + if l.obj.cgn != nil { + // allocation by intrinsic or reflective operation + s = fmt.Sprintf("", l.obj.cgn.fn) + } else { + s = "" // should be unreachable + } + + case *ssa.Function: + s = v.String() + + case *ssa.Global: + s = v.String() + + case *ssa.Const: + s = v.Name() + + case *ssa.Alloc: + s = v.Comment + if s == "" { + s = "alloc" + } + + case *ssa.Call: + // Currently only calls to append can allocate objects. + if v.Call.Value.(*ssa.Builtin).Object().Name() != "append" { + panic("unhandled *ssa.Call label: " + v.Name()) + } + s = "append" + + case *ssa.MakeMap, *ssa.MakeChan, *ssa.MakeSlice, *ssa.Convert: + s = strings.ToLower(strings.TrimPrefix(fmt.Sprintf("%T", v), "*ssa.")) + + case *ssa.MakeInterface: + // MakeInterface is usually implicit in Go source (so + // Pos()==0), and tagged objects may be allocated + // synthetically (so no *MakeInterface data). + s = "makeinterface:" + v.X.Type().String() + + default: + panic(fmt.Sprintf("unhandled object data type: %T", v)) + } + + return s + l.subelement.path() +} diff --git a/vendor/golang.org/x/tools/go/pointer/labels14.go b/vendor/golang.org/x/tools/go/pointer/labels14.go new file mode 100644 index 0000000000..c9ca6a3e37 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/labels14.go @@ -0,0 +1,154 @@ +// Copyright 2013 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.5 + +package pointer + +import ( + "fmt" + "go/token" + "strings" + + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types" +) + +// A Label is an entity that may be pointed to by a pointer, map, +// channel, 'func', slice or interface. +// +// Labels include: +// - functions +// - globals +// - tagged objects, representing interfaces and reflect.Values +// - arrays created by conversions (e.g. []byte("foo"), []byte(s)) +// - stack- and heap-allocated variables (including composite literals) +// - channels, maps and arrays created by make() +// - intrinsic or reflective operations that allocate (e.g. append, reflect.New) +// - intrinsic objects, e.g. the initial array behind os.Args. +// - and their subelements, e.g. "alloc.y[*].z" +// +// Labels are so varied that they defy good generalizations; +// some have no value, no callgraph node, or no position. +// Many objects have types that are inexpressible in Go: +// maps, channels, functions, tagged objects. +// +// At most one of Value() or ReflectType() may return non-nil. +// +type Label struct { + obj *object // the addressable memory location containing this label + subelement *fieldInfo // subelement path within obj, e.g. ".a.b[*].c" +} + +// Value returns the ssa.Value that allocated this label's object, if any. +func (l Label) Value() ssa.Value { + val, _ := l.obj.data.(ssa.Value) + return val +} + +// ReflectType returns the type represented by this label if it is an +// reflect.rtype instance object or *reflect.rtype-tagged object. +// +func (l Label) ReflectType() types.Type { + rtype, _ := l.obj.data.(types.Type) + return rtype +} + +// Path returns the path to the subelement of the object containing +// this label. For example, ".x[*].y". +// +func (l Label) Path() string { + return l.subelement.path() +} + +// Pos returns the position of this label, if known, zero otherwise. +func (l Label) Pos() token.Pos { + switch data := l.obj.data.(type) { + case ssa.Value: + return data.Pos() + case types.Type: + if nt, ok := deref(data).(*types.Named); ok { + return nt.Obj().Pos() + } + } + if cgn := l.obj.cgn; cgn != nil { + return cgn.fn.Pos() + } + return token.NoPos +} + +// String returns the printed form of this label. +// +// Examples: Object type: +// x (a variable) +// (sync.Mutex).Lock (a function) +// convert (array created by conversion) +// makemap (map allocated via make) +// makechan (channel allocated via make) +// makeinterface (tagged object allocated by makeinterface) +// (allocation in instrinsic) +// sync.Mutex (a reflect.rtype instance) +// (an intrinsic object) +// +// Labels within compound objects have subelement paths: +// x.y[*].z (a struct variable, x) +// append.y[*].z (array allocated by append) +// makeslice.y[*].z (array allocated via make) +// +// TODO(adonovan): expose func LabelString(*types.Package, Label). +// +func (l Label) String() string { + var s string + switch v := l.obj.data.(type) { + case types.Type: + return v.String() + + case string: + s = v // an intrinsic object (e.g. os.Args[*]) + + case nil: + if l.obj.cgn != nil { + // allocation by intrinsic or reflective operation + s = fmt.Sprintf("", l.obj.cgn.fn) + } else { + s = "" // should be unreachable + } + + case *ssa.Function: + s = v.String() + + case *ssa.Global: + s = v.String() + + case *ssa.Const: + s = v.Name() + + case *ssa.Alloc: + s = v.Comment + if s == "" { + s = "alloc" + } + + case *ssa.Call: + // Currently only calls to append can allocate objects. + if v.Call.Value.(*ssa.Builtin).Object().Name() != "append" { + panic("unhandled *ssa.Call label: " + v.Name()) + } + s = "append" + + case *ssa.MakeMap, *ssa.MakeChan, *ssa.MakeSlice, *ssa.Convert: + s = strings.ToLower(strings.TrimPrefix(fmt.Sprintf("%T", v), "*ssa.")) + + case *ssa.MakeInterface: + // MakeInterface is usually implicit in Go source (so + // Pos()==0), and tagged objects may be allocated + // synthetically (so no *MakeInterface data). + s = "makeinterface:" + v.X.Type().String() + + default: + panic(fmt.Sprintf("unhandled object data type: %T", v)) + } + + return s + l.subelement.path() +} diff --git a/vendor/golang.org/x/tools/go/pointer/opt.go b/vendor/golang.org/x/tools/go/pointer/opt.go new file mode 100644 index 0000000000..2620cc0d8f --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/opt.go @@ -0,0 +1,125 @@ +// Copyright 2013 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 pointer + +// This file implements renumbering, a pre-solver optimization to +// improve the efficiency of the solver's points-to set representation. +// +// TODO(adonovan): rename file "renumber.go" + +import "fmt" + +// renumber permutes a.nodes so that all nodes within an addressable +// object appear before all non-addressable nodes, maintaining the +// order of nodes within the same object (as required by offsetAddr). +// +// renumber must update every nodeid in the analysis (constraints, +// Pointers, callgraph, etc) to reflect the new ordering. +// +// This is an optimisation to increase the locality and efficiency of +// sparse representations of points-to sets. (Typically only about +// 20% of nodes are within an object.) +// +// NB: nodes added during solving (e.g. for reflection, SetFinalizer) +// will be appended to the end. +// +// Renumbering makes the PTA log inscrutable. To aid debugging, later +// phases (e.g. HVN) must not rely on it having occurred. +// +func (a *analysis) renumber() { + if a.log != nil { + fmt.Fprintf(a.log, "\n\n==== Renumbering\n\n") + } + + N := nodeid(len(a.nodes)) + newNodes := make([]*node, N, N) + renumbering := make([]nodeid, N, N) // maps old to new + + var i, j nodeid + + // The zero node is special. + newNodes[j] = a.nodes[i] + renumbering[i] = j + i++ + j++ + + // Pass 1: object nodes. + for i < N { + obj := a.nodes[i].obj + if obj == nil { + i++ + continue + } + + end := i + nodeid(obj.size) + for i < end { + newNodes[j] = a.nodes[i] + renumbering[i] = j + i++ + j++ + } + } + nobj := j + + // Pass 2: non-object nodes. + for i = 1; i < N; { + obj := a.nodes[i].obj + if obj != nil { + i += nodeid(obj.size) + continue + } + + newNodes[j] = a.nodes[i] + renumbering[i] = j + i++ + j++ + } + + if j != N { + panic(fmt.Sprintf("internal error: j=%d, N=%d", j, N)) + } + + // Log the remapping table. + if a.log != nil { + fmt.Fprintf(a.log, "Renumbering nodes to improve density:\n") + fmt.Fprintf(a.log, "(%d object nodes of %d total)\n", nobj, N) + for old, new := range renumbering { + fmt.Fprintf(a.log, "\tn%d -> n%d\n", old, new) + } + } + + // Now renumber all existing nodeids to use the new node permutation. + // It is critical that all reachable nodeids are accounted for! + + // Renumber nodeids in queried Pointers. + for v, ptr := range a.result.Queries { + ptr.n = renumbering[ptr.n] + a.result.Queries[v] = ptr + } + for v, ptr := range a.result.IndirectQueries { + ptr.n = renumbering[ptr.n] + a.result.IndirectQueries[v] = ptr + } + + // Renumber nodeids in global objects. + for v, id := range a.globalobj { + a.globalobj[v] = renumbering[id] + } + + // Renumber nodeids in constraints. + for _, c := range a.constraints { + c.renumber(renumbering) + } + + // Renumber nodeids in the call graph. + for _, cgn := range a.cgnodes { + cgn.obj = renumbering[cgn.obj] + for _, site := range cgn.sites { + site.targets = renumbering[site.targets] + } + } + + a.nodes = newNodes +} diff --git a/vendor/golang.org/x/tools/go/pointer/pointer14_test.go b/vendor/golang.org/x/tools/go/pointer/pointer14_test.go new file mode 100644 index 0000000000..2bcdd56388 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/pointer14_test.go @@ -0,0 +1,578 @@ +// Copyright 2013 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.5 + +// No testdata on Android. + +// +build !android + +package pointer_test + +// This test uses 'expectation' comments embedded within testdata/*.go +// files to specify the expected pointer analysis behaviour. +// See below for grammar. + +import ( + "bytes" + "errors" + "fmt" + "go/token" + "io/ioutil" + "os" + "regexp" + "strconv" + "strings" + "testing" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/pointer" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/go/types" + "golang.org/x/tools/go/types/typeutil" +) + +var inputs = []string{ + "testdata/a_test.go", + "testdata/another.go", + "testdata/arrayreflect.go", + "testdata/arrays.go", + "testdata/channels.go", + "testdata/chanreflect.go", + "testdata/context.go", + "testdata/conv.go", + "testdata/finalizer.go", + "testdata/flow.go", + "testdata/fmtexcerpt.go", + "testdata/func.go", + "testdata/funcreflect.go", + "testdata/hello.go", // NB: causes spurious failure of HVN cross-check + "testdata/interfaces.go", + "testdata/issue9002.go", + "testdata/mapreflect.go", + "testdata/maps.go", + "testdata/panic.go", + "testdata/recur.go", + "testdata/reflect.go", + "testdata/rtti.go", + "testdata/structreflect.go", + "testdata/structs.go", + "testdata/timer.go", +} + +// Expectation grammar: +// +// @calls f -> g +// +// A 'calls' expectation asserts that edge (f, g) appears in the +// callgraph. f and g are notated as per Function.String(), which +// may contain spaces (e.g. promoted method in anon struct). +// +// @pointsto a | b | c +// +// A 'pointsto' expectation asserts that the points-to set of its +// operand contains exactly the set of labels {a,b,c} notated as per +// labelString. +// +// A 'pointsto' expectation must appear on the same line as a +// print(x) statement; the expectation's operand is x. +// +// If one of the strings is "...", the expectation asserts that the +// points-to set at least the other labels. +// +// We use '|' because label names may contain spaces, e.g. methods +// of anonymous structs. +// +// From a theoretical perspective, concrete types in interfaces are +// labels too, but they are represented differently and so have a +// different expectation, @types, below. +// +// @types t | u | v +// +// A 'types' expectation asserts that the set of possible dynamic +// types of its interface operand is exactly {t,u,v}, notated per +// go/types.Type.String(). In other words, it asserts that the type +// component of the interface may point to that set of concrete type +// literals. It also works for reflect.Value, though the types +// needn't be concrete in that case. +// +// A 'types' expectation must appear on the same line as a +// print(x) statement; the expectation's operand is x. +// +// If one of the strings is "...", the expectation asserts that the +// interface's type may point to at least the other types. +// +// We use '|' because type names may contain spaces. +// +// @warning "regexp" +// +// A 'warning' expectation asserts that the analysis issues a +// warning that matches the regular expression within the string +// literal. +// +// @line id +// +// A line directive associates the name "id" with the current +// file:line. The string form of labels will use this id instead of +// a file:line, making @pointsto expectations more robust against +// perturbations in the source file. +// (NB, anon functions still include line numbers.) +// +type expectation struct { + kind string // "pointsto" | "types" | "calls" | "warning" + filename string + linenum int // source line number, 1-based + args []string + types []types.Type // for types +} + +func (e *expectation) String() string { + return fmt.Sprintf("@%s[%s]", e.kind, strings.Join(e.args, " | ")) +} + +func (e *expectation) errorf(format string, args ...interface{}) { + fmt.Printf("%s:%d: ", e.filename, e.linenum) + fmt.Printf(format, args...) + fmt.Println() +} + +func (e *expectation) needsProbe() bool { + return e.kind == "pointsto" || e.kind == "types" +} + +// Find probe (call to print(x)) of same source file/line as expectation. +func findProbe(prog *ssa.Program, probes map[*ssa.CallCommon]bool, queries map[ssa.Value]pointer.Pointer, e *expectation) (site *ssa.CallCommon, pts pointer.PointsToSet) { + for call := range probes { + pos := prog.Fset.Position(call.Pos()) + if pos.Line == e.linenum && pos.Filename == e.filename { + // TODO(adonovan): send this to test log (display only on failure). + // fmt.Printf("%s:%d: info: found probe for %s: %s\n", + // e.filename, e.linenum, e, p.arg0) // debugging + return call, queries[call.Args[0]].PointsTo() + } + } + return // e.g. analysis didn't reach this call +} + +func doOneInput(input, filename string) bool { + var conf loader.Config + + // Parsing. + f, err := conf.ParseFile(filename, input) + if err != nil { + fmt.Println(err) + return false + } + + // Create single-file main package and import its dependencies. + conf.CreateFromFiles("main", f) + iprog, err := conf.Load() + if err != nil { + fmt.Println(err) + return false + } + mainPkgInfo := iprog.Created[0].Pkg + + // SSA creation + building. + prog := ssautil.CreateProgram(iprog, ssa.SanityCheckFunctions) + prog.Build() + + mainpkg := prog.Package(mainPkgInfo) + ptrmain := mainpkg // main package for the pointer analysis + if mainpkg.Func("main") == nil { + // No main function; assume it's a test. + ptrmain = prog.CreateTestMainPackage(mainpkg) + } + + // Find all calls to the built-in print(x). Analytically, + // print is a no-op, but it's a convenient hook for testing + // the PTS of an expression, so our tests use it. + probes := make(map[*ssa.CallCommon]bool) + for fn := range ssautil.AllFunctions(prog) { + if fn.Pkg == mainpkg { + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + if instr, ok := instr.(ssa.CallInstruction); ok { + call := instr.Common() + if b, ok := call.Value.(*ssa.Builtin); ok && b.Name() == "print" && len(call.Args) == 1 { + probes[instr.Common()] = true + } + } + } + } + } + } + + ok := true + + lineMapping := make(map[string]string) // maps "file:line" to @line tag + + // Parse expectations in this input. + var exps []*expectation + re := regexp.MustCompile("// *@([a-z]*) *(.*)$") + lines := strings.Split(input, "\n") + for linenum, line := range lines { + linenum++ // make it 1-based + if matches := re.FindAllStringSubmatch(line, -1); matches != nil { + match := matches[0] + kind, rest := match[1], match[2] + e := &expectation{kind: kind, filename: filename, linenum: linenum} + + if kind == "line" { + if rest == "" { + ok = false + e.errorf("@%s expectation requires identifier", kind) + } else { + lineMapping[fmt.Sprintf("%s:%d", filename, linenum)] = rest + } + continue + } + + if e.needsProbe() && !strings.Contains(line, "print(") { + ok = false + e.errorf("@%s expectation must follow call to print(x)", kind) + continue + } + + switch kind { + case "pointsto": + e.args = split(rest, "|") + + case "types": + for _, typstr := range split(rest, "|") { + var t types.Type = types.Typ[types.Invalid] // means "..." + if typstr != "..." { + tv, err := types.Eval(prog.Fset, mainpkg.Pkg, f.Pos(), typstr) + if err != nil { + ok = false + // Don't print err since its location is bad. + e.errorf("'%s' is not a valid type: %s", typstr, err) + continue + } + t = tv.Type + } + e.types = append(e.types, t) + } + + case "calls": + e.args = split(rest, "->") + // TODO(adonovan): eagerly reject the + // expectation if fn doesn't denote + // existing function, rather than fail + // the expectation after analysis. + if len(e.args) != 2 { + ok = false + e.errorf("@calls expectation wants 'caller -> callee' arguments") + continue + } + + case "warning": + lit, err := strconv.Unquote(strings.TrimSpace(rest)) + if err != nil { + ok = false + e.errorf("couldn't parse @warning operand: %s", err.Error()) + continue + } + e.args = append(e.args, lit) + + default: + ok = false + e.errorf("unknown expectation kind: %s", e) + continue + } + exps = append(exps, e) + } + } + + var log bytes.Buffer + fmt.Fprintf(&log, "Input: %s\n", filename) + + // Run the analysis. + config := &pointer.Config{ + Reflection: true, + BuildCallGraph: true, + Mains: []*ssa.Package{ptrmain}, + Log: &log, + } + for probe := range probes { + v := probe.Args[0] + if pointer.CanPoint(v.Type()) { + config.AddQuery(v) + } + } + + // Print the log is there was an error or a panic. + complete := false + defer func() { + if !complete || !ok { + log.WriteTo(os.Stderr) + } + }() + + result, err := pointer.Analyze(config) + if err != nil { + panic(err) // internal error in pointer analysis + } + + // Check the expectations. + for _, e := range exps { + var call *ssa.CallCommon + var pts pointer.PointsToSet + var tProbe types.Type + if e.needsProbe() { + if call, pts = findProbe(prog, probes, result.Queries, e); call == nil { + ok = false + e.errorf("unreachable print() statement has expectation %s", e) + continue + } + tProbe = call.Args[0].Type() + if !pointer.CanPoint(tProbe) { + ok = false + e.errorf("expectation on non-pointerlike operand: %s", tProbe) + continue + } + } + + switch e.kind { + case "pointsto": + if !checkPointsToExpectation(e, pts, lineMapping, prog) { + ok = false + } + + case "types": + if !checkTypesExpectation(e, pts, tProbe) { + ok = false + } + + case "calls": + if !checkCallsExpectation(prog, e, result.CallGraph) { + ok = false + } + + case "warning": + if !checkWarningExpectation(prog, e, result.Warnings) { + ok = false + } + } + } + + complete = true + + // ok = false // debugging: uncomment to always see log + + return ok +} + +func labelString(l *pointer.Label, lineMapping map[string]string, prog *ssa.Program) string { + // Functions and Globals need no pos suffix, + // nor do allocations in intrinsic operations + // (for which we'll print the function name). + switch l.Value().(type) { + case nil, *ssa.Function, *ssa.Global: + return l.String() + } + + str := l.String() + if pos := l.Pos(); pos != token.NoPos { + // Append the position, using a @line tag instead of a line number, if defined. + posn := prog.Fset.Position(pos) + s := fmt.Sprintf("%s:%d", posn.Filename, posn.Line) + if tag, ok := lineMapping[s]; ok { + return fmt.Sprintf("%s@%s:%d", str, tag, posn.Column) + } + str = fmt.Sprintf("%s@%s", str, posn) + } + return str +} + +func checkPointsToExpectation(e *expectation, pts pointer.PointsToSet, lineMapping map[string]string, prog *ssa.Program) bool { + expected := make(map[string]int) + surplus := make(map[string]int) + exact := true + for _, g := range e.args { + if g == "..." { + exact = false + continue + } + expected[g]++ + } + // Find the set of labels that the probe's + // argument (x in print(x)) may point to. + for _, label := range pts.Labels() { + name := labelString(label, lineMapping, prog) + if expected[name] > 0 { + expected[name]-- + } else if exact { + surplus[name]++ + } + } + // Report multiset difference: + ok := true + for _, count := range expected { + if count > 0 { + ok = false + e.errorf("value does not alias these expected labels: %s", join(expected)) + break + } + } + for _, count := range surplus { + if count > 0 { + ok = false + e.errorf("value may additionally alias these labels: %s", join(surplus)) + break + } + } + return ok +} + +func checkTypesExpectation(e *expectation, pts pointer.PointsToSet, typ types.Type) bool { + var expected typeutil.Map + var surplus typeutil.Map + exact := true + for _, g := range e.types { + if g == types.Typ[types.Invalid] { + exact = false + continue + } + expected.Set(g, struct{}{}) + } + + if !pointer.CanHaveDynamicTypes(typ) { + e.errorf("@types expectation requires an interface- or reflect.Value-typed operand, got %s", typ) + return false + } + + // Find the set of types that the probe's + // argument (x in print(x)) may contain. + for _, T := range pts.DynamicTypes().Keys() { + if expected.At(T) != nil { + expected.Delete(T) + } else if exact { + surplus.Set(T, struct{}{}) + } + } + // Report set difference: + ok := true + if expected.Len() > 0 { + ok = false + e.errorf("interface cannot contain these types: %s", expected.KeysString()) + } + if surplus.Len() > 0 { + ok = false + e.errorf("interface may additionally contain these types: %s", surplus.KeysString()) + } + return ok +} + +var errOK = errors.New("OK") + +func checkCallsExpectation(prog *ssa.Program, e *expectation, cg *callgraph.Graph) bool { + found := make(map[string]int) + err := callgraph.GraphVisitEdges(cg, func(edge *callgraph.Edge) error { + // Name-based matching is inefficient but it allows us to + // match functions whose names that would not appear in an + // index ("") or which are not unique ("func@1.2"). + if edge.Caller.Func.String() == e.args[0] { + calleeStr := edge.Callee.Func.String() + if calleeStr == e.args[1] { + return errOK // expectation satisified; stop the search + } + found[calleeStr]++ + } + return nil + }) + if err == errOK { + return true + } + if len(found) == 0 { + e.errorf("didn't find any calls from %s", e.args[0]) + } + e.errorf("found no call from %s to %s, but only to %s", + e.args[0], e.args[1], join(found)) + return false +} + +func checkWarningExpectation(prog *ssa.Program, e *expectation, warnings []pointer.Warning) bool { + // TODO(adonovan): check the position part of the warning too? + re, err := regexp.Compile(e.args[0]) + if err != nil { + e.errorf("invalid regular expression in @warning expectation: %s", err.Error()) + return false + } + + if len(warnings) == 0 { + e.errorf("@warning %s expectation, but no warnings", strconv.Quote(e.args[0])) + return false + } + + for _, w := range warnings { + if re.MatchString(w.Message) { + return true + } + } + + e.errorf("@warning %s expectation not satised; found these warnings though:", strconv.Quote(e.args[0])) + for _, w := range warnings { + fmt.Printf("%s: warning: %s\n", prog.Fset.Position(w.Pos), w.Message) + } + return false +} + +func TestInput(t *testing.T) { + ok := true + + wd, err := os.Getwd() + if err != nil { + t.Errorf("os.Getwd: %s", err) + return + } + + // 'go test' does a chdir so that relative paths in + // diagnostics no longer make sense relative to the invoking + // shell's cwd. We print a special marker so that Emacs can + // make sense of them. + fmt.Fprintf(os.Stderr, "Entering directory `%s'\n", wd) + + for _, filename := range inputs { + content, err := ioutil.ReadFile(filename) + if err != nil { + t.Errorf("couldn't read file '%s': %s", filename, err) + continue + } + + if !doOneInput(string(content), filename) { + ok = false + } + } + if !ok { + t.Fail() + } +} + +// join joins the elements of multiset with " | "s. +func join(set map[string]int) string { + var buf bytes.Buffer + sep := "" + for name, count := range set { + for i := 0; i < count; i++ { + buf.WriteString(sep) + sep = " | " + buf.WriteString(name) + } + } + return buf.String() +} + +// split returns the list of sep-delimited non-empty strings in s. +func split(s, sep string) (r []string) { + for _, elem := range strings.Split(s, sep) { + elem = strings.TrimSpace(elem) + if elem != "" { + r = append(r, elem) + } + } + return +} diff --git a/vendor/golang.org/x/tools/go/pointer/pointer_test.go b/vendor/golang.org/x/tools/go/pointer/pointer_test.go new file mode 100644 index 0000000000..7cb16d75c4 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/pointer_test.go @@ -0,0 +1,581 @@ +// Copyright 2013 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.5 + +// No testdata on Android. + +// +build !android + +package pointer_test + +// This test uses 'expectation' comments embedded within testdata/*.go +// files to specify the expected pointer analysis behaviour. +// See below for grammar. + +import ( + "bytes" + "errors" + "fmt" + "go/token" + "go/types" + "io/ioutil" + "os" + "regexp" + "strconv" + "strings" + "testing" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/pointer" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/go/types/typeutil" +) + +var inputs = []string{ + "testdata/a_test.go", + "testdata/another.go", + "testdata/arrayreflect.go", + "testdata/arrays.go", + "testdata/channels.go", + "testdata/chanreflect.go", + "testdata/context.go", + "testdata/conv.go", + "testdata/finalizer.go", + "testdata/flow.go", + "testdata/fmtexcerpt.go", + "testdata/func.go", + "testdata/funcreflect.go", + "testdata/hello.go", // NB: causes spurious failure of HVN cross-check + "testdata/interfaces.go", + "testdata/issue9002.go", + "testdata/mapreflect.go", + "testdata/maps.go", + "testdata/panic.go", + "testdata/recur.go", + "testdata/reflect.go", + "testdata/rtti.go", + "testdata/structreflect.go", + "testdata/structs.go", + "testdata/timer.go", +} + +// Expectation grammar: +// +// @calls f -> g +// +// A 'calls' expectation asserts that edge (f, g) appears in the +// callgraph. f and g are notated as per Function.String(), which +// may contain spaces (e.g. promoted method in anon struct). +// +// @pointsto a | b | c +// +// A 'pointsto' expectation asserts that the points-to set of its +// operand contains exactly the set of labels {a,b,c} notated as per +// labelString. +// +// A 'pointsto' expectation must appear on the same line as a +// print(x) statement; the expectation's operand is x. +// +// If one of the strings is "...", the expectation asserts that the +// points-to set at least the other labels. +// +// We use '|' because label names may contain spaces, e.g. methods +// of anonymous structs. +// +// From a theoretical perspective, concrete types in interfaces are +// labels too, but they are represented differently and so have a +// different expectation, @types, below. +// +// @types t | u | v +// +// A 'types' expectation asserts that the set of possible dynamic +// types of its interface operand is exactly {t,u,v}, notated per +// go/types.Type.String(). In other words, it asserts that the type +// component of the interface may point to that set of concrete type +// literals. It also works for reflect.Value, though the types +// needn't be concrete in that case. +// +// A 'types' expectation must appear on the same line as a +// print(x) statement; the expectation's operand is x. +// +// If one of the strings is "...", the expectation asserts that the +// interface's type may point to at least the other types. +// +// We use '|' because type names may contain spaces. +// +// @warning "regexp" +// +// A 'warning' expectation asserts that the analysis issues a +// warning that matches the regular expression within the string +// literal. +// +// @line id +// +// A line directive associates the name "id" with the current +// file:line. The string form of labels will use this id instead of +// a file:line, making @pointsto expectations more robust against +// perturbations in the source file. +// (NB, anon functions still include line numbers.) +// +type expectation struct { + kind string // "pointsto" | "types" | "calls" | "warning" + filename string + linenum int // source line number, 1-based + args []string + types []types.Type // for types +} + +func (e *expectation) String() string { + return fmt.Sprintf("@%s[%s]", e.kind, strings.Join(e.args, " | ")) +} + +func (e *expectation) errorf(format string, args ...interface{}) { + fmt.Printf("%s:%d: ", e.filename, e.linenum) + fmt.Printf(format, args...) + fmt.Println() +} + +func (e *expectation) needsProbe() bool { + return e.kind == "pointsto" || e.kind == "types" +} + +// Find probe (call to print(x)) of same source file/line as expectation. +func findProbe(prog *ssa.Program, probes map[*ssa.CallCommon]bool, queries map[ssa.Value]pointer.Pointer, e *expectation) (site *ssa.CallCommon, pts pointer.PointsToSet) { + for call := range probes { + pos := prog.Fset.Position(call.Pos()) + if pos.Line == e.linenum && pos.Filename == e.filename { + // TODO(adonovan): send this to test log (display only on failure). + // fmt.Printf("%s:%d: info: found probe for %s: %s\n", + // e.filename, e.linenum, e, p.arg0) // debugging + return call, queries[call.Args[0]].PointsTo() + } + } + return // e.g. analysis didn't reach this call +} + +func doOneInput(input, filename string) bool { + var conf loader.Config + + // Parsing. + f, err := conf.ParseFile(filename, input) + if err != nil { + fmt.Println(err) + return false + } + + // Create single-file main package and import its dependencies. + conf.CreateFromFiles("main", f) + iprog, err := conf.Load() + if err != nil { + fmt.Println(err) + return false + } + mainPkgInfo := iprog.Created[0].Pkg + + // SSA creation + building. + prog := ssautil.CreateProgram(iprog, ssa.SanityCheckFunctions) + prog.Build() + + mainpkg := prog.Package(mainPkgInfo) + ptrmain := mainpkg // main package for the pointer analysis + if mainpkg.Func("main") == nil { + // No main function; assume it's a test. + ptrmain = prog.CreateTestMainPackage(mainpkg) + } + + // Find all calls to the built-in print(x). Analytically, + // print is a no-op, but it's a convenient hook for testing + // the PTS of an expression, so our tests use it. + probes := make(map[*ssa.CallCommon]bool) + for fn := range ssautil.AllFunctions(prog) { + if fn.Pkg == mainpkg { + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + if instr, ok := instr.(ssa.CallInstruction); ok { + call := instr.Common() + if b, ok := call.Value.(*ssa.Builtin); ok && b.Name() == "print" && len(call.Args) == 1 { + probes[instr.Common()] = true + } + } + } + } + } + } + + ok := true + + lineMapping := make(map[string]string) // maps "file:line" to @line tag + + // Parse expectations in this input. + var exps []*expectation + re := regexp.MustCompile("// *@([a-z]*) *(.*)$") + lines := strings.Split(input, "\n") + for linenum, line := range lines { + linenum++ // make it 1-based + if matches := re.FindAllStringSubmatch(line, -1); matches != nil { + match := matches[0] + kind, rest := match[1], match[2] + e := &expectation{kind: kind, filename: filename, linenum: linenum} + + if kind == "line" { + if rest == "" { + ok = false + e.errorf("@%s expectation requires identifier", kind) + } else { + lineMapping[fmt.Sprintf("%s:%d", filename, linenum)] = rest + } + continue + } + + if e.needsProbe() && !strings.Contains(line, "print(") { + ok = false + e.errorf("@%s expectation must follow call to print(x)", kind) + continue + } + + switch kind { + case "pointsto": + e.args = split(rest, "|") + + case "types": + for _, typstr := range split(rest, "|") { + var t types.Type = types.Typ[types.Invalid] // means "..." + if typstr != "..." { + tv, err := types.Eval(prog.Fset, mainpkg.Pkg, f.Pos(), typstr) + if err != nil { + ok = false + // Don't print err since its location is bad. + e.errorf("'%s' is not a valid type: %s", typstr, err) + continue + } + t = tv.Type + } + e.types = append(e.types, t) + } + + case "calls": + e.args = split(rest, "->") + // TODO(adonovan): eagerly reject the + // expectation if fn doesn't denote + // existing function, rather than fail + // the expectation after analysis. + if len(e.args) != 2 { + ok = false + e.errorf("@calls expectation wants 'caller -> callee' arguments") + continue + } + + case "warning": + lit, err := strconv.Unquote(strings.TrimSpace(rest)) + if err != nil { + ok = false + e.errorf("couldn't parse @warning operand: %s", err.Error()) + continue + } + e.args = append(e.args, lit) + + default: + ok = false + e.errorf("unknown expectation kind: %s", e) + continue + } + exps = append(exps, e) + } + } + + var log bytes.Buffer + fmt.Fprintf(&log, "Input: %s\n", filename) + + // Run the analysis. + config := &pointer.Config{ + Reflection: true, + BuildCallGraph: true, + Mains: []*ssa.Package{ptrmain}, + Log: &log, + } + for probe := range probes { + v := probe.Args[0] + if pointer.CanPoint(v.Type()) { + config.AddQuery(v) + } + } + + // Print the log is there was an error or a panic. + complete := false + defer func() { + if !complete || !ok { + log.WriteTo(os.Stderr) + } + }() + + result, err := pointer.Analyze(config) + if err != nil { + panic(err) // internal error in pointer analysis + } + + // Check the expectations. + for _, e := range exps { + var call *ssa.CallCommon + var pts pointer.PointsToSet + var tProbe types.Type + if e.needsProbe() { + if call, pts = findProbe(prog, probes, result.Queries, e); call == nil { + ok = false + e.errorf("unreachable print() statement has expectation %s", e) + continue + } + tProbe = call.Args[0].Type() + if !pointer.CanPoint(tProbe) { + ok = false + e.errorf("expectation on non-pointerlike operand: %s", tProbe) + continue + } + } + + switch e.kind { + case "pointsto": + if !checkPointsToExpectation(e, pts, lineMapping, prog) { + ok = false + } + + case "types": + if !checkTypesExpectation(e, pts, tProbe) { + ok = false + } + + case "calls": + if !checkCallsExpectation(prog, e, result.CallGraph) { + ok = false + } + + case "warning": + if !checkWarningExpectation(prog, e, result.Warnings) { + ok = false + } + } + } + + complete = true + + // ok = false // debugging: uncomment to always see log + + return ok +} + +func labelString(l *pointer.Label, lineMapping map[string]string, prog *ssa.Program) string { + // Functions and Globals need no pos suffix, + // nor do allocations in intrinsic operations + // (for which we'll print the function name). + switch l.Value().(type) { + case nil, *ssa.Function, *ssa.Global: + return l.String() + } + + str := l.String() + if pos := l.Pos(); pos != token.NoPos { + // Append the position, using a @line tag instead of a line number, if defined. + posn := prog.Fset.Position(pos) + s := fmt.Sprintf("%s:%d", posn.Filename, posn.Line) + if tag, ok := lineMapping[s]; ok { + return fmt.Sprintf("%s@%s:%d", str, tag, posn.Column) + } + str = fmt.Sprintf("%s@%s", str, posn) + } + return str +} + +func checkPointsToExpectation(e *expectation, pts pointer.PointsToSet, lineMapping map[string]string, prog *ssa.Program) bool { + expected := make(map[string]int) + surplus := make(map[string]int) + exact := true + for _, g := range e.args { + if g == "..." { + exact = false + continue + } + expected[g]++ + } + // Find the set of labels that the probe's + // argument (x in print(x)) may point to. + for _, label := range pts.Labels() { + name := labelString(label, lineMapping, prog) + if expected[name] > 0 { + expected[name]-- + } else if exact { + surplus[name]++ + } + } + // Report multiset difference: + ok := true + for _, count := range expected { + if count > 0 { + ok = false + e.errorf("value does not alias these expected labels: %s", join(expected)) + break + } + } + for _, count := range surplus { + if count > 0 { + ok = false + e.errorf("value may additionally alias these labels: %s", join(surplus)) + break + } + } + return ok +} + +func checkTypesExpectation(e *expectation, pts pointer.PointsToSet, typ types.Type) bool { + var expected typeutil.Map + var surplus typeutil.Map + exact := true + for _, g := range e.types { + if g == types.Typ[types.Invalid] { + exact = false + continue + } + expected.Set(g, struct{}{}) + } + + if !pointer.CanHaveDynamicTypes(typ) { + e.errorf("@types expectation requires an interface- or reflect.Value-typed operand, got %s", typ) + return false + } + + // Find the set of types that the probe's + // argument (x in print(x)) may contain. + for _, T := range pts.DynamicTypes().Keys() { + if expected.At(T) != nil { + expected.Delete(T) + } else if exact { + surplus.Set(T, struct{}{}) + } + } + // Report set difference: + ok := true + if expected.Len() > 0 { + ok = false + e.errorf("interface cannot contain these types: %s", expected.KeysString()) + } + if surplus.Len() > 0 { + ok = false + e.errorf("interface may additionally contain these types: %s", surplus.KeysString()) + } + return ok +} + +var errOK = errors.New("OK") + +func checkCallsExpectation(prog *ssa.Program, e *expectation, cg *callgraph.Graph) bool { + found := make(map[string]int) + err := callgraph.GraphVisitEdges(cg, func(edge *callgraph.Edge) error { + // Name-based matching is inefficient but it allows us to + // match functions whose names that would not appear in an + // index ("") or which are not unique ("func@1.2"). + if edge.Caller.Func.String() == e.args[0] { + calleeStr := edge.Callee.Func.String() + if calleeStr == e.args[1] { + return errOK // expectation satisified; stop the search + } + found[calleeStr]++ + } + return nil + }) + if err == errOK { + return true + } + if len(found) == 0 { + e.errorf("didn't find any calls from %s", e.args[0]) + } + e.errorf("found no call from %s to %s, but only to %s", + e.args[0], e.args[1], join(found)) + return false +} + +func checkWarningExpectation(prog *ssa.Program, e *expectation, warnings []pointer.Warning) bool { + // TODO(adonovan): check the position part of the warning too? + re, err := regexp.Compile(e.args[0]) + if err != nil { + e.errorf("invalid regular expression in @warning expectation: %s", err.Error()) + return false + } + + if len(warnings) == 0 { + e.errorf("@warning %s expectation, but no warnings", strconv.Quote(e.args[0])) + return false + } + + for _, w := range warnings { + if re.MatchString(w.Message) { + return true + } + } + + e.errorf("@warning %s expectation not satised; found these warnings though:", strconv.Quote(e.args[0])) + for _, w := range warnings { + fmt.Printf("%s: warning: %s\n", prog.Fset.Position(w.Pos), w.Message) + } + return false +} + +func TestInput(t *testing.T) { + if testing.Short() { + t.Skip("skipping in short mode; this test requires tons of memory; golang.org/issue/14113") + } + ok := true + + wd, err := os.Getwd() + if err != nil { + t.Errorf("os.Getwd: %s", err) + return + } + + // 'go test' does a chdir so that relative paths in + // diagnostics no longer make sense relative to the invoking + // shell's cwd. We print a special marker so that Emacs can + // make sense of them. + fmt.Fprintf(os.Stderr, "Entering directory `%s'\n", wd) + + for _, filename := range inputs { + content, err := ioutil.ReadFile(filename) + if err != nil { + t.Errorf("couldn't read file '%s': %s", filename, err) + continue + } + + if !doOneInput(string(content), filename) { + ok = false + } + } + if !ok { + t.Fail() + } +} + +// join joins the elements of multiset with " | "s. +func join(set map[string]int) string { + var buf bytes.Buffer + sep := "" + for name, count := range set { + for i := 0; i < count; i++ { + buf.WriteString(sep) + sep = " | " + buf.WriteString(name) + } + } + return buf.String() +} + +// split returns the list of sep-delimited non-empty strings in s. +func split(s, sep string) (r []string) { + for _, elem := range strings.Split(s, sep) { + elem = strings.TrimSpace(elem) + if elem != "" { + r = append(r, elem) + } + } + return +} diff --git a/vendor/golang.org/x/tools/go/pointer/print.go b/vendor/golang.org/x/tools/go/pointer/print.go new file mode 100644 index 0000000000..4f2f4c7ae1 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/print.go @@ -0,0 +1,43 @@ +// Copyright 2013 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 pointer + +import "fmt" + +func (c *addrConstraint) String() string { + return fmt.Sprintf("addr n%d <- {&n%d}", c.dst, c.src) +} + +func (c *copyConstraint) String() string { + return fmt.Sprintf("copy n%d <- n%d", c.dst, c.src) +} + +func (c *loadConstraint) String() string { + return fmt.Sprintf("load n%d <- n%d[%d]", c.dst, c.src, c.offset) +} + +func (c *storeConstraint) String() string { + return fmt.Sprintf("store n%d[%d] <- n%d", c.dst, c.offset, c.src) +} + +func (c *offsetAddrConstraint) String() string { + return fmt.Sprintf("offsetAddr n%d <- n%d.#%d", c.dst, c.src, c.offset) +} + +func (c *typeFilterConstraint) String() string { + return fmt.Sprintf("typeFilter n%d <- n%d.(%s)", c.dst, c.src, c.typ) +} + +func (c *untagConstraint) String() string { + return fmt.Sprintf("untag n%d <- n%d.(%s)", c.dst, c.src, c.typ) +} + +func (c *invokeConstraint) String() string { + return fmt.Sprintf("invoke n%d.%s(n%d ...)", c.iface, c.method.Name(), c.params) +} + +func (n nodeid) String() string { + return fmt.Sprintf("n%d", n) +} diff --git a/vendor/golang.org/x/tools/go/pointer/reflect.go b/vendor/golang.org/x/tools/go/pointer/reflect.go new file mode 100644 index 0000000000..bdb22cf92a --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/reflect.go @@ -0,0 +1,1977 @@ +// Copyright 2013 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.5 + +package pointer + +// This file implements the generation and resolution rules for +// constraints arising from the use of reflection in the target +// program. See doc.go for explanation of the representation. +// +// For consistency, the names of all parameters match those of the +// actual functions in the "reflect" package. +// +// To avoid proliferation of equivalent labels, intrinsics should +// memoize as much as possible, like TypeOf and Zero do for their +// tagged objects. +// +// TODO(adonovan): this file is rather subtle. Explain how we derive +// the implementation of each reflect operator from its spec, +// including the subtleties of reflect.flag{Addr,RO,Indir}. +// [Hint: our implementation is as if reflect.flagIndir was always +// true, i.e. reflect.Values are pointers to tagged objects, there is +// no inline allocation optimization; and indirect tagged objects (not +// yet implemented) correspond to reflect.Values with +// reflect.flagAddr.] +// A picture would help too. +// +// TODO(adonovan): try factoring up the common parts of the majority of +// these constraints that are single input, single output. + +import ( + "fmt" + exact "go/constant" + "go/types" + "reflect" + + "golang.org/x/tools/go/ssa" +) + +func init() { + for name, fn := range map[string]intrinsic{ + // reflect.Value methods. + "(reflect.Value).Addr": ext۰reflect۰Value۰Addr, + "(reflect.Value).Bool": ext۰NoEffect, + "(reflect.Value).Bytes": ext۰reflect۰Value۰Bytes, + "(reflect.Value).Call": ext۰reflect۰Value۰Call, + "(reflect.Value).CallSlice": ext۰reflect۰Value۰CallSlice, + "(reflect.Value).CanAddr": ext۰NoEffect, + "(reflect.Value).CanInterface": ext۰NoEffect, + "(reflect.Value).CanSet": ext۰NoEffect, + "(reflect.Value).Cap": ext۰NoEffect, + "(reflect.Value).Close": ext۰NoEffect, + "(reflect.Value).Complex": ext۰NoEffect, + "(reflect.Value).Convert": ext۰reflect۰Value۰Convert, + "(reflect.Value).Elem": ext۰reflect۰Value۰Elem, + "(reflect.Value).Field": ext۰reflect۰Value۰Field, + "(reflect.Value).FieldByIndex": ext۰reflect۰Value۰FieldByIndex, + "(reflect.Value).FieldByName": ext۰reflect۰Value۰FieldByName, + "(reflect.Value).FieldByNameFunc": ext۰reflect۰Value۰FieldByNameFunc, + "(reflect.Value).Float": ext۰NoEffect, + "(reflect.Value).Index": ext۰reflect۰Value۰Index, + "(reflect.Value).Int": ext۰NoEffect, + "(reflect.Value).Interface": ext۰reflect۰Value۰Interface, + "(reflect.Value).InterfaceData": ext۰NoEffect, + "(reflect.Value).IsNil": ext۰NoEffect, + "(reflect.Value).IsValid": ext۰NoEffect, + "(reflect.Value).Kind": ext۰NoEffect, + "(reflect.Value).Len": ext۰NoEffect, + "(reflect.Value).MapIndex": ext۰reflect۰Value۰MapIndex, + "(reflect.Value).MapKeys": ext۰reflect۰Value۰MapKeys, + "(reflect.Value).Method": ext۰reflect۰Value۰Method, + "(reflect.Value).MethodByName": ext۰reflect۰Value۰MethodByName, + "(reflect.Value).NumField": ext۰NoEffect, + "(reflect.Value).NumMethod": ext۰NoEffect, + "(reflect.Value).OverflowComplex": ext۰NoEffect, + "(reflect.Value).OverflowFloat": ext۰NoEffect, + "(reflect.Value).OverflowInt": ext۰NoEffect, + "(reflect.Value).OverflowUint": ext۰NoEffect, + "(reflect.Value).Pointer": ext۰NoEffect, + "(reflect.Value).Recv": ext۰reflect۰Value۰Recv, + "(reflect.Value).Send": ext۰reflect۰Value۰Send, + "(reflect.Value).Set": ext۰reflect۰Value۰Set, + "(reflect.Value).SetBool": ext۰NoEffect, + "(reflect.Value).SetBytes": ext۰reflect۰Value۰SetBytes, + "(reflect.Value).SetComplex": ext۰NoEffect, + "(reflect.Value).SetFloat": ext۰NoEffect, + "(reflect.Value).SetInt": ext۰NoEffect, + "(reflect.Value).SetLen": ext۰NoEffect, + "(reflect.Value).SetMapIndex": ext۰reflect۰Value۰SetMapIndex, + "(reflect.Value).SetPointer": ext۰reflect۰Value۰SetPointer, + "(reflect.Value).SetString": ext۰NoEffect, + "(reflect.Value).SetUint": ext۰NoEffect, + "(reflect.Value).Slice": ext۰reflect۰Value۰Slice, + "(reflect.Value).String": ext۰NoEffect, + "(reflect.Value).TryRecv": ext۰reflect۰Value۰Recv, + "(reflect.Value).TrySend": ext۰reflect۰Value۰Send, + "(reflect.Value).Type": ext۰NoEffect, + "(reflect.Value).Uint": ext۰NoEffect, + "(reflect.Value).UnsafeAddr": ext۰NoEffect, + + // Standalone reflect.* functions. + "reflect.Append": ext۰reflect۰Append, + "reflect.AppendSlice": ext۰reflect۰AppendSlice, + "reflect.Copy": ext۰reflect۰Copy, + "reflect.ChanOf": ext۰reflect۰ChanOf, + "reflect.DeepEqual": ext۰NoEffect, + "reflect.Indirect": ext۰reflect۰Indirect, + "reflect.MakeChan": ext۰reflect۰MakeChan, + "reflect.MakeFunc": ext۰reflect۰MakeFunc, + "reflect.MakeMap": ext۰reflect۰MakeMap, + "reflect.MakeSlice": ext۰reflect۰MakeSlice, + "reflect.MapOf": ext۰reflect۰MapOf, + "reflect.New": ext۰reflect۰New, + "reflect.NewAt": ext۰reflect۰NewAt, + "reflect.PtrTo": ext۰reflect۰PtrTo, + "reflect.Select": ext۰reflect۰Select, + "reflect.SliceOf": ext۰reflect۰SliceOf, + "reflect.TypeOf": ext۰reflect۰TypeOf, + "reflect.ValueOf": ext۰reflect۰ValueOf, + "reflect.Zero": ext۰reflect۰Zero, + "reflect.init": ext۰NoEffect, + + // *reflect.rtype methods + "(*reflect.rtype).Align": ext۰NoEffect, + "(*reflect.rtype).AssignableTo": ext۰NoEffect, + "(*reflect.rtype).Bits": ext۰NoEffect, + "(*reflect.rtype).ChanDir": ext۰NoEffect, + "(*reflect.rtype).ConvertibleTo": ext۰NoEffect, + "(*reflect.rtype).Elem": ext۰reflect۰rtype۰Elem, + "(*reflect.rtype).Field": ext۰reflect۰rtype۰Field, + "(*reflect.rtype).FieldAlign": ext۰NoEffect, + "(*reflect.rtype).FieldByIndex": ext۰reflect۰rtype۰FieldByIndex, + "(*reflect.rtype).FieldByName": ext۰reflect۰rtype۰FieldByName, + "(*reflect.rtype).FieldByNameFunc": ext۰reflect۰rtype۰FieldByNameFunc, + "(*reflect.rtype).Implements": ext۰NoEffect, + "(*reflect.rtype).In": ext۰reflect۰rtype۰In, + "(*reflect.rtype).IsVariadic": ext۰NoEffect, + "(*reflect.rtype).Key": ext۰reflect۰rtype۰Key, + "(*reflect.rtype).Kind": ext۰NoEffect, + "(*reflect.rtype).Len": ext۰NoEffect, + "(*reflect.rtype).Method": ext۰reflect۰rtype۰Method, + "(*reflect.rtype).MethodByName": ext۰reflect۰rtype۰MethodByName, + "(*reflect.rtype).Name": ext۰NoEffect, + "(*reflect.rtype).NumField": ext۰NoEffect, + "(*reflect.rtype).NumIn": ext۰NoEffect, + "(*reflect.rtype).NumMethod": ext۰NoEffect, + "(*reflect.rtype).NumOut": ext۰NoEffect, + "(*reflect.rtype).Out": ext۰reflect۰rtype۰Out, + "(*reflect.rtype).PkgPath": ext۰NoEffect, + "(*reflect.rtype).Size": ext۰NoEffect, + "(*reflect.rtype).String": ext۰NoEffect, + } { + intrinsicsByName[name] = fn + } +} + +// -------------------- (reflect.Value) -------------------- + +func ext۰reflect۰Value۰Addr(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func (Value).Bytes() Value ---------- + +// result = v.Bytes() +type rVBytesConstraint struct { + v nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rVBytesConstraint) ptr() nodeid { return c.v } +func (c *rVBytesConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rVBytes.result") +} +func (c *rVBytesConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.result = mapping[c.result] +} + +func (c *rVBytesConstraint) String() string { + return fmt.Sprintf("n%d = reflect n%d.Bytes()", c.result, c.v) +} + +func (c *rVBytesConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, slice, indirect := a.taggedValue(vObj) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + tSlice, ok := tDyn.Underlying().(*types.Slice) + if ok && types.Identical(tSlice.Elem(), types.Typ[types.Uint8]) { + if a.onlineCopy(c.result, slice) { + changed = true + } + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Value۰Bytes(a *analysis, cgn *cgnode) { + a.addConstraint(&rVBytesConstraint{ + v: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func (Value).Call(in []Value) []Value ---------- + +// result = v.Call(in) +type rVCallConstraint struct { + cgn *cgnode + targets nodeid // (indirect) + v nodeid // (ptr) + arg nodeid // = in[*] + result nodeid // (indirect) + dotdotdot bool // interpret last arg as a "..." slice +} + +func (c *rVCallConstraint) ptr() nodeid { return c.v } +func (c *rVCallConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.targets), "rVCall.targets") + h.markIndirect(onodeid(c.result), "rVCall.result") +} +func (c *rVCallConstraint) renumber(mapping []nodeid) { + c.targets = mapping[c.targets] + c.v = mapping[c.v] + c.arg = mapping[c.arg] + c.result = mapping[c.result] +} + +func (c *rVCallConstraint) String() string { + return fmt.Sprintf("n%d = reflect n%d.Call(n%d)", c.result, c.v, c.arg) +} + +func (c *rVCallConstraint) solve(a *analysis, delta *nodeset) { + if c.targets == 0 { + panic("no targets") + } + + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, fn, indirect := a.taggedValue(vObj) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + tSig, ok := tDyn.Underlying().(*types.Signature) + if !ok { + continue // not a function + } + if tSig.Recv() != nil { + panic(tSig) // TODO(adonovan): rethink when we implement Method() + } + + // Add dynamic call target. + if a.onlineCopy(c.targets, fn) { + a.addWork(c.targets) + // TODO(adonovan): is 'else continue' a sound optimisation here? + } + + // Allocate a P/R block. + tParams := tSig.Params() + tResults := tSig.Results() + params := a.addNodes(tParams, "rVCall.params") + results := a.addNodes(tResults, "rVCall.results") + + // Make a dynamic call to 'fn'. + a.store(fn, params, 1, a.sizeof(tParams)) + a.load(results, fn, 1+a.sizeof(tParams), a.sizeof(tResults)) + + // Populate P by type-asserting each actual arg (all merged in c.arg). + for i, n := 0, tParams.Len(); i < n; i++ { + T := tParams.At(i).Type() + a.typeAssert(T, params, c.arg, false) + params += nodeid(a.sizeof(T)) + } + + // Use R by tagging and copying each actual result to c.result. + for i, n := 0, tResults.Len(); i < n; i++ { + T := tResults.At(i).Type() + // Convert from an arbitrary type to a reflect.Value + // (like MakeInterface followed by reflect.ValueOf). + if isInterface(T) { + // (don't tag) + if a.onlineCopy(c.result, results) { + changed = true + } + } else { + obj := a.makeTagged(T, c.cgn, nil) + a.onlineCopyN(obj+1, results, a.sizeof(T)) + if a.addLabel(c.result, obj) { // (true) + changed = true + } + } + results += nodeid(a.sizeof(T)) + } + } + if changed { + a.addWork(c.result) + } +} + +// Common code for direct (inlined) and indirect calls to (reflect.Value).Call. +func reflectCallImpl(a *analysis, cgn *cgnode, site *callsite, recv, arg nodeid, dotdotdot bool) nodeid { + // Allocate []reflect.Value array for the result. + ret := a.nextNode() + a.addNodes(types.NewArray(a.reflectValueObj.Type(), 1), "rVCall.ret") + a.endObject(ret, cgn, nil) + + // pts(targets) will be the set of possible call targets. + site.targets = a.addOneNode(tInvalid, "rvCall.targets", nil) + + // All arguments are merged since they arrive in a slice. + argelts := a.addOneNode(a.reflectValueObj.Type(), "rVCall.args", nil) + a.load(argelts, arg, 1, 1) // slice elements + + a.addConstraint(&rVCallConstraint{ + cgn: cgn, + targets: site.targets, + v: recv, + arg: argelts, + result: ret + 1, // results go into elements of ret + dotdotdot: dotdotdot, + }) + return ret +} + +func reflectCall(a *analysis, cgn *cgnode, dotdotdot bool) { + // This is the shared contour implementation of (reflect.Value).Call + // and CallSlice, as used by indirect calls (rare). + // Direct calls are inlined in gen.go, eliding the + // intermediate cgnode for Call. + site := new(callsite) + cgn.sites = append(cgn.sites, site) + recv := a.funcParams(cgn.obj) + arg := recv + 1 + ret := reflectCallImpl(a, cgn, site, recv, arg, dotdotdot) + a.addressOf(cgn.fn.Signature.Results().At(0).Type(), a.funcResults(cgn.obj), ret) +} + +func ext۰reflect۰Value۰Call(a *analysis, cgn *cgnode) { + reflectCall(a, cgn, false) +} + +func ext۰reflect۰Value۰CallSlice(a *analysis, cgn *cgnode) { + // TODO(adonovan): implement. Also, inline direct calls in gen.go too. + if false { + reflectCall(a, cgn, true) + } +} + +func ext۰reflect۰Value۰Convert(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func (Value).Elem() Value ---------- + +// result = v.Elem() +type rVElemConstraint struct { + cgn *cgnode + v nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rVElemConstraint) ptr() nodeid { return c.v } +func (c *rVElemConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rVElem.result") +} +func (c *rVElemConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.result = mapping[c.result] +} + +func (c *rVElemConstraint) String() string { + return fmt.Sprintf("n%d = reflect n%d.Elem()", c.result, c.v) +} + +func (c *rVElemConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, payload, indirect := a.taggedValue(vObj) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + switch t := tDyn.Underlying().(type) { + case *types.Interface: + if a.onlineCopy(c.result, payload) { + changed = true + } + + case *types.Pointer: + obj := a.makeTagged(t.Elem(), c.cgn, nil) + a.load(obj+1, payload, 0, a.sizeof(t.Elem())) + if a.addLabel(c.result, obj) { + changed = true + } + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Value۰Elem(a *analysis, cgn *cgnode) { + a.addConstraint(&rVElemConstraint{ + cgn: cgn, + v: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +func ext۰reflect۰Value۰Field(a *analysis, cgn *cgnode) {} // TODO(adonovan) +func ext۰reflect۰Value۰FieldByIndex(a *analysis, cgn *cgnode) {} // TODO(adonovan) +func ext۰reflect۰Value۰FieldByName(a *analysis, cgn *cgnode) {} // TODO(adonovan) +func ext۰reflect۰Value۰FieldByNameFunc(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func (Value).Index() Value ---------- + +// result = v.Index() +type rVIndexConstraint struct { + cgn *cgnode + v nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rVIndexConstraint) ptr() nodeid { return c.v } +func (c *rVIndexConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rVIndex.result") +} +func (c *rVIndexConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.result = mapping[c.result] +} + +func (c *rVIndexConstraint) String() string { + return fmt.Sprintf("n%d = reflect n%d.Index()", c.result, c.v) +} + +func (c *rVIndexConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, payload, indirect := a.taggedValue(vObj) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + var res nodeid + switch t := tDyn.Underlying().(type) { + case *types.Array: + res = a.makeTagged(t.Elem(), c.cgn, nil) + a.onlineCopyN(res+1, payload+1, a.sizeof(t.Elem())) + + case *types.Slice: + res = a.makeTagged(t.Elem(), c.cgn, nil) + a.load(res+1, payload, 1, a.sizeof(t.Elem())) + + case *types.Basic: + if t.Kind() == types.String { + res = a.makeTagged(types.Typ[types.Rune], c.cgn, nil) + } + } + if res != 0 && a.addLabel(c.result, res) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Value۰Index(a *analysis, cgn *cgnode) { + a.addConstraint(&rVIndexConstraint{ + cgn: cgn, + v: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func (Value).Interface() Value ---------- + +// result = v.Interface() +type rVInterfaceConstraint struct { + v nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rVInterfaceConstraint) ptr() nodeid { return c.v } +func (c *rVInterfaceConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rVInterface.result") +} +func (c *rVInterfaceConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.result = mapping[c.result] +} + +func (c *rVInterfaceConstraint) String() string { + return fmt.Sprintf("n%d = reflect n%d.Interface()", c.result, c.v) +} + +func (c *rVInterfaceConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, payload, indirect := a.taggedValue(vObj) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + if isInterface(tDyn) { + if a.onlineCopy(c.result, payload) { + a.addWork(c.result) + } + } else { + if a.addLabel(c.result, vObj) { + changed = true + } + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Value۰Interface(a *analysis, cgn *cgnode) { + a.addConstraint(&rVInterfaceConstraint{ + v: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func (Value).MapIndex(Value) Value ---------- + +// result = v.MapIndex(_) +type rVMapIndexConstraint struct { + cgn *cgnode + v nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rVMapIndexConstraint) ptr() nodeid { return c.v } +func (c *rVMapIndexConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rVMapIndex.result") +} +func (c *rVMapIndexConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.result = mapping[c.result] +} + +func (c *rVMapIndexConstraint) String() string { + return fmt.Sprintf("n%d = reflect n%d.MapIndex(_)", c.result, c.v) +} + +func (c *rVMapIndexConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, m, indirect := a.taggedValue(vObj) + tMap, _ := tDyn.Underlying().(*types.Map) + if tMap == nil { + continue // not a map + } + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + obj := a.makeTagged(tMap.Elem(), c.cgn, nil) + a.load(obj+1, m, a.sizeof(tMap.Key()), a.sizeof(tMap.Elem())) + if a.addLabel(c.result, obj) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Value۰MapIndex(a *analysis, cgn *cgnode) { + a.addConstraint(&rVMapIndexConstraint{ + cgn: cgn, + v: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func (Value).MapKeys() []Value ---------- + +// result = v.MapKeys() +type rVMapKeysConstraint struct { + cgn *cgnode + v nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rVMapKeysConstraint) ptr() nodeid { return c.v } +func (c *rVMapKeysConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rVMapKeys.result") +} +func (c *rVMapKeysConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.result = mapping[c.result] +} + +func (c *rVMapKeysConstraint) String() string { + return fmt.Sprintf("n%d = reflect n%d.MapKeys()", c.result, c.v) +} + +func (c *rVMapKeysConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, m, indirect := a.taggedValue(vObj) + tMap, _ := tDyn.Underlying().(*types.Map) + if tMap == nil { + continue // not a map + } + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + kObj := a.makeTagged(tMap.Key(), c.cgn, nil) + a.load(kObj+1, m, 0, a.sizeof(tMap.Key())) + if a.addLabel(c.result, kObj) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Value۰MapKeys(a *analysis, cgn *cgnode) { + // Allocate an array for the result. + obj := a.nextNode() + T := types.NewSlice(a.reflectValueObj.Type()) + a.addNodes(sliceToArray(T), "reflect.MapKeys result") + a.endObject(obj, cgn, nil) + a.addressOf(T, a.funcResults(cgn.obj), obj) + + a.addConstraint(&rVMapKeysConstraint{ + cgn: cgn, + v: a.funcParams(cgn.obj), + result: obj + 1, // result is stored in array elems + }) +} + +func ext۰reflect۰Value۰Method(a *analysis, cgn *cgnode) {} // TODO(adonovan) +func ext۰reflect۰Value۰MethodByName(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func (Value).Recv(Value) Value ---------- + +// result, _ = v.Recv() +type rVRecvConstraint struct { + cgn *cgnode + v nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rVRecvConstraint) ptr() nodeid { return c.v } +func (c *rVRecvConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rVRecv.result") +} +func (c *rVRecvConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.result = mapping[c.result] +} + +func (c *rVRecvConstraint) String() string { + return fmt.Sprintf("n%d = reflect n%d.Recv()", c.result, c.v) +} + +func (c *rVRecvConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, ch, indirect := a.taggedValue(vObj) + tChan, _ := tDyn.Underlying().(*types.Chan) + if tChan == nil { + continue // not a channel + } + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + tElem := tChan.Elem() + elemObj := a.makeTagged(tElem, c.cgn, nil) + a.load(elemObj+1, ch, 0, a.sizeof(tElem)) + if a.addLabel(c.result, elemObj) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Value۰Recv(a *analysis, cgn *cgnode) { + a.addConstraint(&rVRecvConstraint{ + cgn: cgn, + v: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func (Value).Send(Value) ---------- + +// v.Send(x) +type rVSendConstraint struct { + cgn *cgnode + v nodeid // (ptr) + x nodeid +} + +func (c *rVSendConstraint) ptr() nodeid { return c.v } +func (c *rVSendConstraint) presolve(*hvn) {} +func (c *rVSendConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.x = mapping[c.x] +} + +func (c *rVSendConstraint) String() string { + return fmt.Sprintf("reflect n%d.Send(n%d)", c.v, c.x) +} + +func (c *rVSendConstraint) solve(a *analysis, delta *nodeset) { + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, ch, indirect := a.taggedValue(vObj) + tChan, _ := tDyn.Underlying().(*types.Chan) + if tChan == nil { + continue // not a channel + } + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + // Extract x's payload to xtmp, then store to channel. + tElem := tChan.Elem() + xtmp := a.addNodes(tElem, "Send.xtmp") + a.typeAssert(tElem, xtmp, c.x, false) + a.store(ch, xtmp, 0, a.sizeof(tElem)) + } +} + +func ext۰reflect۰Value۰Send(a *analysis, cgn *cgnode) { + params := a.funcParams(cgn.obj) + a.addConstraint(&rVSendConstraint{ + cgn: cgn, + v: params, + x: params + 1, + }) +} + +func ext۰reflect۰Value۰Set(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func (Value).SetBytes(x []byte) ---------- + +// v.SetBytes(x) +type rVSetBytesConstraint struct { + cgn *cgnode + v nodeid // (ptr) + x nodeid +} + +func (c *rVSetBytesConstraint) ptr() nodeid { return c.v } +func (c *rVSetBytesConstraint) presolve(*hvn) {} +func (c *rVSetBytesConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.x = mapping[c.x] +} + +func (c *rVSetBytesConstraint) String() string { + return fmt.Sprintf("reflect n%d.SetBytes(n%d)", c.v, c.x) +} + +func (c *rVSetBytesConstraint) solve(a *analysis, delta *nodeset) { + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, slice, indirect := a.taggedValue(vObj) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + tSlice, ok := tDyn.Underlying().(*types.Slice) + if ok && types.Identical(tSlice.Elem(), types.Typ[types.Uint8]) { + if a.onlineCopy(slice, c.x) { + a.addWork(slice) + } + } + } +} + +func ext۰reflect۰Value۰SetBytes(a *analysis, cgn *cgnode) { + params := a.funcParams(cgn.obj) + a.addConstraint(&rVSetBytesConstraint{ + cgn: cgn, + v: params, + x: params + 1, + }) +} + +// ---------- func (Value).SetMapIndex(k Value, v Value) ---------- + +// v.SetMapIndex(key, val) +type rVSetMapIndexConstraint struct { + cgn *cgnode + v nodeid // (ptr) + key nodeid + val nodeid +} + +func (c *rVSetMapIndexConstraint) ptr() nodeid { return c.v } +func (c *rVSetMapIndexConstraint) presolve(*hvn) {} +func (c *rVSetMapIndexConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.key = mapping[c.key] + c.val = mapping[c.val] +} + +func (c *rVSetMapIndexConstraint) String() string { + return fmt.Sprintf("reflect n%d.SetMapIndex(n%d, n%d)", c.v, c.key, c.val) +} + +func (c *rVSetMapIndexConstraint) solve(a *analysis, delta *nodeset) { + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, m, indirect := a.taggedValue(vObj) + tMap, _ := tDyn.Underlying().(*types.Map) + if tMap == nil { + continue // not a map + } + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + keysize := a.sizeof(tMap.Key()) + + // Extract key's payload to keytmp, then store to map key. + keytmp := a.addNodes(tMap.Key(), "SetMapIndex.keytmp") + a.typeAssert(tMap.Key(), keytmp, c.key, false) + a.store(m, keytmp, 0, keysize) + + // Extract val's payload to vtmp, then store to map value. + valtmp := a.addNodes(tMap.Elem(), "SetMapIndex.valtmp") + a.typeAssert(tMap.Elem(), valtmp, c.val, false) + a.store(m, valtmp, keysize, a.sizeof(tMap.Elem())) + } +} + +func ext۰reflect۰Value۰SetMapIndex(a *analysis, cgn *cgnode) { + params := a.funcParams(cgn.obj) + a.addConstraint(&rVSetMapIndexConstraint{ + cgn: cgn, + v: params, + key: params + 1, + val: params + 2, + }) +} + +func ext۰reflect۰Value۰SetPointer(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func (Value).Slice(v Value, i, j int) Value ---------- + +// result = v.Slice(_, _) +type rVSliceConstraint struct { + cgn *cgnode + v nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rVSliceConstraint) ptr() nodeid { return c.v } +func (c *rVSliceConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rVSlice.result") +} +func (c *rVSliceConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.result = mapping[c.result] +} + +func (c *rVSliceConstraint) String() string { + return fmt.Sprintf("n%d = reflect n%d.Slice(_, _)", c.result, c.v) +} + +func (c *rVSliceConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, payload, indirect := a.taggedValue(vObj) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + var res nodeid + switch t := tDyn.Underlying().(type) { + case *types.Pointer: + if tArr, ok := t.Elem().Underlying().(*types.Array); ok { + // pointer to array + res = a.makeTagged(types.NewSlice(tArr.Elem()), c.cgn, nil) + if a.onlineCopy(res+1, payload) { + a.addWork(res + 1) + } + } + + case *types.Array: + // TODO(adonovan): implement addressable + // arrays when we do indirect tagged objects. + + case *types.Slice: + res = vObj + + case *types.Basic: + if t == types.Typ[types.String] { + res = vObj + } + } + + if res != 0 && a.addLabel(c.result, res) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Value۰Slice(a *analysis, cgn *cgnode) { + a.addConstraint(&rVSliceConstraint{ + cgn: cgn, + v: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// -------------------- Standalone reflect functions -------------------- + +func ext۰reflect۰Append(a *analysis, cgn *cgnode) {} // TODO(adonovan) +func ext۰reflect۰AppendSlice(a *analysis, cgn *cgnode) {} // TODO(adonovan) +func ext۰reflect۰Copy(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func ChanOf(ChanDir, Type) Type ---------- + +// result = ChanOf(dir, t) +type reflectChanOfConstraint struct { + cgn *cgnode + t nodeid // (ptr) + result nodeid // (indirect) + dirs []types.ChanDir +} + +func (c *reflectChanOfConstraint) ptr() nodeid { return c.t } +func (c *reflectChanOfConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectChanOf.result") +} +func (c *reflectChanOfConstraint) renumber(mapping []nodeid) { + c.t = mapping[c.t] + c.result = mapping[c.result] +} + +func (c *reflectChanOfConstraint) String() string { + return fmt.Sprintf("n%d = reflect.ChanOf(n%d)", c.result, c.t) +} + +func (c *reflectChanOfConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + tObj := nodeid(x) + T := a.rtypeTaggedValue(tObj) + + if typeTooHigh(T) { + continue + } + + for _, dir := range c.dirs { + if a.addLabel(c.result, a.makeRtype(types.NewChan(dir, T))) { + changed = true + } + } + } + if changed { + a.addWork(c.result) + } +} + +// dirMap maps reflect.ChanDir to the set of channel types generated by ChanOf. +var dirMap = [...][]types.ChanDir{ + 0: {types.SendOnly, types.RecvOnly, types.SendRecv}, // unknown + reflect.RecvDir: {types.RecvOnly}, + reflect.SendDir: {types.SendOnly}, + reflect.BothDir: {types.SendRecv}, +} + +func ext۰reflect۰ChanOf(a *analysis, cgn *cgnode) { + // If we have access to the callsite, + // and the channel argument is a constant (as is usual), + // only generate the requested direction. + var dir reflect.ChanDir // unknown + if site := cgn.callersite; site != nil { + if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok { + v, _ := exact.Int64Val(c.Value) + if 0 <= v && v <= int64(reflect.BothDir) { + dir = reflect.ChanDir(v) + } + } + } + + params := a.funcParams(cgn.obj) + a.addConstraint(&reflectChanOfConstraint{ + cgn: cgn, + t: params + 1, + result: a.funcResults(cgn.obj), + dirs: dirMap[dir], + }) +} + +// ---------- func Indirect(v Value) Value ---------- + +// result = Indirect(v) +type reflectIndirectConstraint struct { + cgn *cgnode + v nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *reflectIndirectConstraint) ptr() nodeid { return c.v } +func (c *reflectIndirectConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectIndirect.result") +} +func (c *reflectIndirectConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.result = mapping[c.result] +} + +func (c *reflectIndirectConstraint) String() string { + return fmt.Sprintf("n%d = reflect.Indirect(n%d)", c.result, c.v) +} + +func (c *reflectIndirectConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, _, _ := a.taggedValue(vObj) + var res nodeid + if tPtr, ok := tDyn.Underlying().(*types.Pointer); ok { + // load the payload of the pointer's tagged object + // into a new tagged object + res = a.makeTagged(tPtr.Elem(), c.cgn, nil) + a.load(res+1, vObj+1, 0, a.sizeof(tPtr.Elem())) + } else { + res = vObj + } + + if a.addLabel(c.result, res) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Indirect(a *analysis, cgn *cgnode) { + a.addConstraint(&reflectIndirectConstraint{ + cgn: cgn, + v: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func MakeChan(Type) Value ---------- + +// result = MakeChan(typ) +type reflectMakeChanConstraint struct { + cgn *cgnode + typ nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *reflectMakeChanConstraint) ptr() nodeid { return c.typ } +func (c *reflectMakeChanConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectMakeChan.result") +} +func (c *reflectMakeChanConstraint) renumber(mapping []nodeid) { + c.typ = mapping[c.typ] + c.result = mapping[c.result] +} + +func (c *reflectMakeChanConstraint) String() string { + return fmt.Sprintf("n%d = reflect.MakeChan(n%d)", c.result, c.typ) +} + +func (c *reflectMakeChanConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + typObj := nodeid(x) + T := a.rtypeTaggedValue(typObj) + tChan, ok := T.Underlying().(*types.Chan) + if !ok || tChan.Dir() != types.SendRecv { + continue // not a bidirectional channel type + } + + obj := a.nextNode() + a.addNodes(tChan.Elem(), "reflect.MakeChan.value") + a.endObject(obj, c.cgn, nil) + + // put its address in a new T-tagged object + id := a.makeTagged(T, c.cgn, nil) + a.addLabel(id+1, obj) + + // flow the T-tagged object to the result + if a.addLabel(c.result, id) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰MakeChan(a *analysis, cgn *cgnode) { + a.addConstraint(&reflectMakeChanConstraint{ + cgn: cgn, + typ: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +func ext۰reflect۰MakeFunc(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func MakeMap(Type) Value ---------- + +// result = MakeMap(typ) +type reflectMakeMapConstraint struct { + cgn *cgnode + typ nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *reflectMakeMapConstraint) ptr() nodeid { return c.typ } +func (c *reflectMakeMapConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectMakeMap.result") +} +func (c *reflectMakeMapConstraint) renumber(mapping []nodeid) { + c.typ = mapping[c.typ] + c.result = mapping[c.result] +} + +func (c *reflectMakeMapConstraint) String() string { + return fmt.Sprintf("n%d = reflect.MakeMap(n%d)", c.result, c.typ) +} + +func (c *reflectMakeMapConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + typObj := nodeid(x) + T := a.rtypeTaggedValue(typObj) + tMap, ok := T.Underlying().(*types.Map) + if !ok { + continue // not a map type + } + + mapObj := a.nextNode() + a.addNodes(tMap.Key(), "reflect.MakeMap.key") + a.addNodes(tMap.Elem(), "reflect.MakeMap.value") + a.endObject(mapObj, c.cgn, nil) + + // put its address in a new T-tagged object + id := a.makeTagged(T, c.cgn, nil) + a.addLabel(id+1, mapObj) + + // flow the T-tagged object to the result + if a.addLabel(c.result, id) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰MakeMap(a *analysis, cgn *cgnode) { + a.addConstraint(&reflectMakeMapConstraint{ + cgn: cgn, + typ: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func MakeSlice(Type) Value ---------- + +// result = MakeSlice(typ) +type reflectMakeSliceConstraint struct { + cgn *cgnode + typ nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *reflectMakeSliceConstraint) ptr() nodeid { return c.typ } +func (c *reflectMakeSliceConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectMakeSlice.result") +} +func (c *reflectMakeSliceConstraint) renumber(mapping []nodeid) { + c.typ = mapping[c.typ] + c.result = mapping[c.result] +} + +func (c *reflectMakeSliceConstraint) String() string { + return fmt.Sprintf("n%d = reflect.MakeSlice(n%d)", c.result, c.typ) +} + +func (c *reflectMakeSliceConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + typObj := nodeid(x) + T := a.rtypeTaggedValue(typObj) + if _, ok := T.Underlying().(*types.Slice); !ok { + continue // not a slice type + } + + obj := a.nextNode() + a.addNodes(sliceToArray(T), "reflect.MakeSlice") + a.endObject(obj, c.cgn, nil) + + // put its address in a new T-tagged object + id := a.makeTagged(T, c.cgn, nil) + a.addLabel(id+1, obj) + + // flow the T-tagged object to the result + if a.addLabel(c.result, id) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰MakeSlice(a *analysis, cgn *cgnode) { + a.addConstraint(&reflectMakeSliceConstraint{ + cgn: cgn, + typ: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +func ext۰reflect۰MapOf(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func New(Type) Value ---------- + +// result = New(typ) +type reflectNewConstraint struct { + cgn *cgnode + typ nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *reflectNewConstraint) ptr() nodeid { return c.typ } +func (c *reflectNewConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectNew.result") +} +func (c *reflectNewConstraint) renumber(mapping []nodeid) { + c.typ = mapping[c.typ] + c.result = mapping[c.result] +} + +func (c *reflectNewConstraint) String() string { + return fmt.Sprintf("n%d = reflect.New(n%d)", c.result, c.typ) +} + +func (c *reflectNewConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + typObj := nodeid(x) + T := a.rtypeTaggedValue(typObj) + + // allocate new T object + newObj := a.nextNode() + a.addNodes(T, "reflect.New") + a.endObject(newObj, c.cgn, nil) + + // put its address in a new *T-tagged object + id := a.makeTagged(types.NewPointer(T), c.cgn, nil) + a.addLabel(id+1, newObj) + + // flow the pointer to the result + if a.addLabel(c.result, id) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰New(a *analysis, cgn *cgnode) { + a.addConstraint(&reflectNewConstraint{ + cgn: cgn, + typ: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +func ext۰reflect۰NewAt(a *analysis, cgn *cgnode) { + ext۰reflect۰New(a, cgn) + + // TODO(adonovan): also report dynamic calls to unsound intrinsics. + if site := cgn.callersite; site != nil { + a.warnf(site.pos(), "unsound: %s contains a reflect.NewAt() call", site.instr.Parent()) + } +} + +// ---------- func PtrTo(Type) Type ---------- + +// result = PtrTo(t) +type reflectPtrToConstraint struct { + cgn *cgnode + t nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *reflectPtrToConstraint) ptr() nodeid { return c.t } +func (c *reflectPtrToConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectPtrTo.result") +} +func (c *reflectPtrToConstraint) renumber(mapping []nodeid) { + c.t = mapping[c.t] + c.result = mapping[c.result] +} + +func (c *reflectPtrToConstraint) String() string { + return fmt.Sprintf("n%d = reflect.PtrTo(n%d)", c.result, c.t) +} + +func (c *reflectPtrToConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + tObj := nodeid(x) + T := a.rtypeTaggedValue(tObj) + + if typeTooHigh(T) { + continue + } + + if a.addLabel(c.result, a.makeRtype(types.NewPointer(T))) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰PtrTo(a *analysis, cgn *cgnode) { + a.addConstraint(&reflectPtrToConstraint{ + cgn: cgn, + t: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +func ext۰reflect۰Select(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func SliceOf(Type) Type ---------- + +// result = SliceOf(t) +type reflectSliceOfConstraint struct { + cgn *cgnode + t nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *reflectSliceOfConstraint) ptr() nodeid { return c.t } +func (c *reflectSliceOfConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectSliceOf.result") +} +func (c *reflectSliceOfConstraint) renumber(mapping []nodeid) { + c.t = mapping[c.t] + c.result = mapping[c.result] +} + +func (c *reflectSliceOfConstraint) String() string { + return fmt.Sprintf("n%d = reflect.SliceOf(n%d)", c.result, c.t) +} + +func (c *reflectSliceOfConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + tObj := nodeid(x) + T := a.rtypeTaggedValue(tObj) + + if typeTooHigh(T) { + continue + } + + if a.addLabel(c.result, a.makeRtype(types.NewSlice(T))) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰SliceOf(a *analysis, cgn *cgnode) { + a.addConstraint(&reflectSliceOfConstraint{ + cgn: cgn, + t: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func TypeOf(v Value) Type ---------- + +// result = TypeOf(i) +type reflectTypeOfConstraint struct { + cgn *cgnode + i nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *reflectTypeOfConstraint) ptr() nodeid { return c.i } +func (c *reflectTypeOfConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectTypeOf.result") +} +func (c *reflectTypeOfConstraint) renumber(mapping []nodeid) { + c.i = mapping[c.i] + c.result = mapping[c.result] +} + +func (c *reflectTypeOfConstraint) String() string { + return fmt.Sprintf("n%d = reflect.TypeOf(n%d)", c.result, c.i) +} + +func (c *reflectTypeOfConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + iObj := nodeid(x) + tDyn, _, _ := a.taggedValue(iObj) + if a.addLabel(c.result, a.makeRtype(tDyn)) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰TypeOf(a *analysis, cgn *cgnode) { + a.addConstraint(&reflectTypeOfConstraint{ + cgn: cgn, + i: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func ValueOf(interface{}) Value ---------- + +func ext۰reflect۰ValueOf(a *analysis, cgn *cgnode) { + // TODO(adonovan): when we start creating indirect tagged + // objects, we'll need to handle them specially here since + // they must never appear in the PTS of an interface{}. + a.copy(a.funcResults(cgn.obj), a.funcParams(cgn.obj), 1) +} + +// ---------- func Zero(Type) Value ---------- + +// result = Zero(typ) +type reflectZeroConstraint struct { + cgn *cgnode + typ nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *reflectZeroConstraint) ptr() nodeid { return c.typ } +func (c *reflectZeroConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectZero.result") +} +func (c *reflectZeroConstraint) renumber(mapping []nodeid) { + c.typ = mapping[c.typ] + c.result = mapping[c.result] +} + +func (c *reflectZeroConstraint) String() string { + return fmt.Sprintf("n%d = reflect.Zero(n%d)", c.result, c.typ) +} + +func (c *reflectZeroConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + typObj := nodeid(x) + T := a.rtypeTaggedValue(typObj) + + // TODO(adonovan): if T is an interface type, we need + // to create an indirect tagged object containing + // new(T). To avoid updates of such shared values, + // we'll need another flag on indirect tagged objects + // that marks whether they are addressable or + // readonly, just like the reflect package does. + + // memoize using a.reflectZeros[T] + var id nodeid + if z := a.reflectZeros.At(T); false && z != nil { + id = z.(nodeid) + } else { + id = a.makeTagged(T, c.cgn, nil) + a.reflectZeros.Set(T, id) + } + if a.addLabel(c.result, id) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Zero(a *analysis, cgn *cgnode) { + a.addConstraint(&reflectZeroConstraint{ + cgn: cgn, + typ: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// -------------------- (*reflect.rtype) methods -------------------- + +// ---------- func (*rtype) Elem() Type ---------- + +// result = Elem(t) +type rtypeElemConstraint struct { + cgn *cgnode + t nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rtypeElemConstraint) ptr() nodeid { return c.t } +func (c *rtypeElemConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rtypeElem.result") +} +func (c *rtypeElemConstraint) renumber(mapping []nodeid) { + c.t = mapping[c.t] + c.result = mapping[c.result] +} + +func (c *rtypeElemConstraint) String() string { + return fmt.Sprintf("n%d = (*reflect.rtype).Elem(n%d)", c.result, c.t) +} + +func (c *rtypeElemConstraint) solve(a *analysis, delta *nodeset) { + // Implemented by *types.{Map,Chan,Array,Slice,Pointer}. + type hasElem interface { + Elem() types.Type + } + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + tObj := nodeid(x) + T := a.nodes[tObj].obj.data.(types.Type) + if tHasElem, ok := T.Underlying().(hasElem); ok { + if a.addLabel(c.result, a.makeRtype(tHasElem.Elem())) { + changed = true + } + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰rtype۰Elem(a *analysis, cgn *cgnode) { + a.addConstraint(&rtypeElemConstraint{ + cgn: cgn, + t: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func (*rtype) Field(int) StructField ---------- +// ---------- func (*rtype) FieldByName(string) (StructField, bool) ---------- + +// result = FieldByName(t, name) +// result = Field(t, _) +type rtypeFieldByNameConstraint struct { + cgn *cgnode + name string // name of field; "" for unknown + t nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rtypeFieldByNameConstraint) ptr() nodeid { return c.t } +func (c *rtypeFieldByNameConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result+3), "rtypeFieldByName.result.Type") +} +func (c *rtypeFieldByNameConstraint) renumber(mapping []nodeid) { + c.t = mapping[c.t] + c.result = mapping[c.result] +} + +func (c *rtypeFieldByNameConstraint) String() string { + return fmt.Sprintf("n%d = (*reflect.rtype).FieldByName(n%d, %q)", c.result, c.t, c.name) +} + +func (c *rtypeFieldByNameConstraint) solve(a *analysis, delta *nodeset) { + // type StructField struct { + // 0 __identity__ + // 1 Name string + // 2 PkgPath string + // 3 Type Type + // 4 Tag StructTag + // 5 Offset uintptr + // 6 Index []int + // 7 Anonymous bool + // } + + for _, x := range delta.AppendTo(a.deltaSpace) { + tObj := nodeid(x) + T := a.nodes[tObj].obj.data.(types.Type) + tStruct, ok := T.Underlying().(*types.Struct) + if !ok { + continue // not a struct type + } + + n := tStruct.NumFields() + for i := 0; i < n; i++ { + f := tStruct.Field(i) + if c.name == "" || c.name == f.Name() { + + // a.offsetOf(Type) is 3. + if id := c.result + 3; a.addLabel(id, a.makeRtype(f.Type())) { + a.addWork(id) + } + // TODO(adonovan): StructField.Index should be non-nil. + } + } + } +} + +func ext۰reflect۰rtype۰FieldByName(a *analysis, cgn *cgnode) { + // If we have access to the callsite, + // and the argument is a string constant, + // return only that field. + var name string + if site := cgn.callersite; site != nil { + if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok { + name = exact.StringVal(c.Value) + } + } + + a.addConstraint(&rtypeFieldByNameConstraint{ + cgn: cgn, + name: name, + t: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +func ext۰reflect۰rtype۰Field(a *analysis, cgn *cgnode) { + // No-one ever calls Field with a constant argument, + // so we don't specialize that case. + a.addConstraint(&rtypeFieldByNameConstraint{ + cgn: cgn, + t: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +func ext۰reflect۰rtype۰FieldByIndex(a *analysis, cgn *cgnode) {} // TODO(adonovan) +func ext۰reflect۰rtype۰FieldByNameFunc(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func (*rtype) In/Out(i int) Type ---------- + +// result = In/Out(t, i) +type rtypeInOutConstraint struct { + cgn *cgnode + t nodeid // (ptr) + result nodeid // (indirect) + out bool + i int // -ve if not a constant +} + +func (c *rtypeInOutConstraint) ptr() nodeid { return c.t } +func (c *rtypeInOutConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rtypeInOut.result") +} +func (c *rtypeInOutConstraint) renumber(mapping []nodeid) { + c.t = mapping[c.t] + c.result = mapping[c.result] +} + +func (c *rtypeInOutConstraint) String() string { + return fmt.Sprintf("n%d = (*reflect.rtype).InOut(n%d, %d)", c.result, c.t, c.i) +} + +func (c *rtypeInOutConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + tObj := nodeid(x) + T := a.nodes[tObj].obj.data.(types.Type) + sig, ok := T.Underlying().(*types.Signature) + if !ok { + continue // not a func type + } + + tuple := sig.Params() + if c.out { + tuple = sig.Results() + } + for i, n := 0, tuple.Len(); i < n; i++ { + if c.i < 0 || c.i == i { + if a.addLabel(c.result, a.makeRtype(tuple.At(i).Type())) { + changed = true + } + } + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰rtype۰InOut(a *analysis, cgn *cgnode, out bool) { + // If we have access to the callsite, + // and the argument is an int constant, + // return only that parameter. + index := -1 + if site := cgn.callersite; site != nil { + if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok { + v, _ := exact.Int64Val(c.Value) + index = int(v) + } + } + a.addConstraint(&rtypeInOutConstraint{ + cgn: cgn, + t: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + out: out, + i: index, + }) +} + +func ext۰reflect۰rtype۰In(a *analysis, cgn *cgnode) { + ext۰reflect۰rtype۰InOut(a, cgn, false) +} + +func ext۰reflect۰rtype۰Out(a *analysis, cgn *cgnode) { + ext۰reflect۰rtype۰InOut(a, cgn, true) +} + +// ---------- func (*rtype) Key() Type ---------- + +// result = Key(t) +type rtypeKeyConstraint struct { + cgn *cgnode + t nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rtypeKeyConstraint) ptr() nodeid { return c.t } +func (c *rtypeKeyConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rtypeKey.result") +} +func (c *rtypeKeyConstraint) renumber(mapping []nodeid) { + c.t = mapping[c.t] + c.result = mapping[c.result] +} + +func (c *rtypeKeyConstraint) String() string { + return fmt.Sprintf("n%d = (*reflect.rtype).Key(n%d)", c.result, c.t) +} + +func (c *rtypeKeyConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + tObj := nodeid(x) + T := a.nodes[tObj].obj.data.(types.Type) + if tMap, ok := T.Underlying().(*types.Map); ok { + if a.addLabel(c.result, a.makeRtype(tMap.Key())) { + changed = true + } + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰rtype۰Key(a *analysis, cgn *cgnode) { + a.addConstraint(&rtypeKeyConstraint{ + cgn: cgn, + t: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func (*rtype) Method(int) (Method, bool) ---------- +// ---------- func (*rtype) MethodByName(string) (Method, bool) ---------- + +// result = MethodByName(t, name) +// result = Method(t, _) +type rtypeMethodByNameConstraint struct { + cgn *cgnode + name string // name of method; "" for unknown + t nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rtypeMethodByNameConstraint) ptr() nodeid { return c.t } +func (c *rtypeMethodByNameConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result+3), "rtypeMethodByName.result.Type") + h.markIndirect(onodeid(c.result+4), "rtypeMethodByName.result.Func") +} +func (c *rtypeMethodByNameConstraint) renumber(mapping []nodeid) { + c.t = mapping[c.t] + c.result = mapping[c.result] +} + +func (c *rtypeMethodByNameConstraint) String() string { + return fmt.Sprintf("n%d = (*reflect.rtype).MethodByName(n%d, %q)", c.result, c.t, c.name) +} + +// changeRecv returns sig with Recv prepended to Params(). +func changeRecv(sig *types.Signature) *types.Signature { + params := sig.Params() + n := params.Len() + p2 := make([]*types.Var, n+1) + p2[0] = sig.Recv() + for i := 0; i < n; i++ { + p2[i+1] = params.At(i) + } + return types.NewSignature(nil, types.NewTuple(p2...), sig.Results(), sig.Variadic()) +} + +func (c *rtypeMethodByNameConstraint) solve(a *analysis, delta *nodeset) { + for _, x := range delta.AppendTo(a.deltaSpace) { + tObj := nodeid(x) + T := a.nodes[tObj].obj.data.(types.Type) + + isIface := isInterface(T) + + // We don't use Lookup(c.name) when c.name != "" to avoid + // ambiguity: >1 unexported methods could match. + mset := a.prog.MethodSets.MethodSet(T) + for i, n := 0, mset.Len(); i < n; i++ { + sel := mset.At(i) + if c.name == "" || c.name == sel.Obj().Name() { + // type Method struct { + // 0 __identity__ + // 1 Name string + // 2 PkgPath string + // 3 Type Type + // 4 Func Value + // 5 Index int + // } + + var sig *types.Signature + var fn *ssa.Function + if isIface { + sig = sel.Type().(*types.Signature) + } else { + fn = a.prog.MethodValue(sel) + // move receiver to params[0] + sig = changeRecv(fn.Signature) + } + + // a.offsetOf(Type) is 3. + if id := c.result + 3; a.addLabel(id, a.makeRtype(sig)) { + a.addWork(id) + } + if fn != nil { + // a.offsetOf(Func) is 4. + if id := c.result + 4; a.addLabel(id, a.objectNode(nil, fn)) { + a.addWork(id) + } + } + } + } + } +} + +func ext۰reflect۰rtype۰MethodByName(a *analysis, cgn *cgnode) { + // If we have access to the callsite, + // and the argument is a string constant, + // return only that method. + var name string + if site := cgn.callersite; site != nil { + if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok { + name = exact.StringVal(c.Value) + } + } + + a.addConstraint(&rtypeMethodByNameConstraint{ + cgn: cgn, + name: name, + t: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +func ext۰reflect۰rtype۰Method(a *analysis, cgn *cgnode) { + // No-one ever calls Method with a constant argument, + // so we don't specialize that case. + a.addConstraint(&rtypeMethodByNameConstraint{ + cgn: cgn, + t: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// typeHeight returns the "height" of the type, which is roughly +// speaking the number of chan, map, pointer and slice type constructors +// at the root of T; these are the four type kinds that can be created +// via reflection. Chan and map constructors are counted as double the +// height of slice and pointer constructors since they are less often +// deeply nested. +// +// The solver rules for type constructors must somehow bound the set of +// types they create to ensure termination of the algorithm in cases +// where the output of a type constructor flows to its input, e.g. +// +// func f(t reflect.Type) { +// f(reflect.PtrTo(t)) +// } +// +// It does this by limiting the type height to k, but this still leaves +// a potentially exponential (4^k) number of of types that may be +// enumerated in pathological cases. +// +func typeHeight(T types.Type) int { + switch T := T.(type) { + case *types.Chan: + return 2 + typeHeight(T.Elem()) + case *types.Map: + k := typeHeight(T.Key()) + v := typeHeight(T.Elem()) + if v > k { + k = v // max(k, v) + } + return 2 + k + case *types.Slice: + return 1 + typeHeight(T.Elem()) + case *types.Pointer: + return 1 + typeHeight(T.Elem()) + } + return 0 +} + +func typeTooHigh(T types.Type) bool { + return typeHeight(T) > 3 +} diff --git a/vendor/golang.org/x/tools/go/pointer/reflect14.go b/vendor/golang.org/x/tools/go/pointer/reflect14.go new file mode 100644 index 0000000000..c55f69e4f9 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/reflect14.go @@ -0,0 +1,1977 @@ +// Copyright 2013 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.5 + +package pointer + +// This file implements the generation and resolution rules for +// constraints arising from the use of reflection in the target +// program. See doc.go for explanation of the representation. +// +// For consistency, the names of all parameters match those of the +// actual functions in the "reflect" package. +// +// To avoid proliferation of equivalent labels, intrinsics should +// memoize as much as possible, like TypeOf and Zero do for their +// tagged objects. +// +// TODO(adonovan): this file is rather subtle. Explain how we derive +// the implementation of each reflect operator from its spec, +// including the subtleties of reflect.flag{Addr,RO,Indir}. +// [Hint: our implementation is as if reflect.flagIndir was always +// true, i.e. reflect.Values are pointers to tagged objects, there is +// no inline allocation optimization; and indirect tagged objects (not +// yet implemented) correspond to reflect.Values with +// reflect.flagAddr.] +// A picture would help too. +// +// TODO(adonovan): try factoring up the common parts of the majority of +// these constraints that are single input, single output. + +import ( + "fmt" + "reflect" + + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types" +) + +func init() { + for name, fn := range map[string]intrinsic{ + // reflect.Value methods. + "(reflect.Value).Addr": ext۰reflect۰Value۰Addr, + "(reflect.Value).Bool": ext۰NoEffect, + "(reflect.Value).Bytes": ext۰reflect۰Value۰Bytes, + "(reflect.Value).Call": ext۰reflect۰Value۰Call, + "(reflect.Value).CallSlice": ext۰reflect۰Value۰CallSlice, + "(reflect.Value).CanAddr": ext۰NoEffect, + "(reflect.Value).CanInterface": ext۰NoEffect, + "(reflect.Value).CanSet": ext۰NoEffect, + "(reflect.Value).Cap": ext۰NoEffect, + "(reflect.Value).Close": ext۰NoEffect, + "(reflect.Value).Complex": ext۰NoEffect, + "(reflect.Value).Convert": ext۰reflect۰Value۰Convert, + "(reflect.Value).Elem": ext۰reflect۰Value۰Elem, + "(reflect.Value).Field": ext۰reflect۰Value۰Field, + "(reflect.Value).FieldByIndex": ext۰reflect۰Value۰FieldByIndex, + "(reflect.Value).FieldByName": ext۰reflect۰Value۰FieldByName, + "(reflect.Value).FieldByNameFunc": ext۰reflect۰Value۰FieldByNameFunc, + "(reflect.Value).Float": ext۰NoEffect, + "(reflect.Value).Index": ext۰reflect۰Value۰Index, + "(reflect.Value).Int": ext۰NoEffect, + "(reflect.Value).Interface": ext۰reflect۰Value۰Interface, + "(reflect.Value).InterfaceData": ext۰NoEffect, + "(reflect.Value).IsNil": ext۰NoEffect, + "(reflect.Value).IsValid": ext۰NoEffect, + "(reflect.Value).Kind": ext۰NoEffect, + "(reflect.Value).Len": ext۰NoEffect, + "(reflect.Value).MapIndex": ext۰reflect۰Value۰MapIndex, + "(reflect.Value).MapKeys": ext۰reflect۰Value۰MapKeys, + "(reflect.Value).Method": ext۰reflect۰Value۰Method, + "(reflect.Value).MethodByName": ext۰reflect۰Value۰MethodByName, + "(reflect.Value).NumField": ext۰NoEffect, + "(reflect.Value).NumMethod": ext۰NoEffect, + "(reflect.Value).OverflowComplex": ext۰NoEffect, + "(reflect.Value).OverflowFloat": ext۰NoEffect, + "(reflect.Value).OverflowInt": ext۰NoEffect, + "(reflect.Value).OverflowUint": ext۰NoEffect, + "(reflect.Value).Pointer": ext۰NoEffect, + "(reflect.Value).Recv": ext۰reflect۰Value۰Recv, + "(reflect.Value).Send": ext۰reflect۰Value۰Send, + "(reflect.Value).Set": ext۰reflect۰Value۰Set, + "(reflect.Value).SetBool": ext۰NoEffect, + "(reflect.Value).SetBytes": ext۰reflect۰Value۰SetBytes, + "(reflect.Value).SetComplex": ext۰NoEffect, + "(reflect.Value).SetFloat": ext۰NoEffect, + "(reflect.Value).SetInt": ext۰NoEffect, + "(reflect.Value).SetLen": ext۰NoEffect, + "(reflect.Value).SetMapIndex": ext۰reflect۰Value۰SetMapIndex, + "(reflect.Value).SetPointer": ext۰reflect۰Value۰SetPointer, + "(reflect.Value).SetString": ext۰NoEffect, + "(reflect.Value).SetUint": ext۰NoEffect, + "(reflect.Value).Slice": ext۰reflect۰Value۰Slice, + "(reflect.Value).String": ext۰NoEffect, + "(reflect.Value).TryRecv": ext۰reflect۰Value۰Recv, + "(reflect.Value).TrySend": ext۰reflect۰Value۰Send, + "(reflect.Value).Type": ext۰NoEffect, + "(reflect.Value).Uint": ext۰NoEffect, + "(reflect.Value).UnsafeAddr": ext۰NoEffect, + + // Standalone reflect.* functions. + "reflect.Append": ext۰reflect۰Append, + "reflect.AppendSlice": ext۰reflect۰AppendSlice, + "reflect.Copy": ext۰reflect۰Copy, + "reflect.ChanOf": ext۰reflect۰ChanOf, + "reflect.DeepEqual": ext۰NoEffect, + "reflect.Indirect": ext۰reflect۰Indirect, + "reflect.MakeChan": ext۰reflect۰MakeChan, + "reflect.MakeFunc": ext۰reflect۰MakeFunc, + "reflect.MakeMap": ext۰reflect۰MakeMap, + "reflect.MakeSlice": ext۰reflect۰MakeSlice, + "reflect.MapOf": ext۰reflect۰MapOf, + "reflect.New": ext۰reflect۰New, + "reflect.NewAt": ext۰reflect۰NewAt, + "reflect.PtrTo": ext۰reflect۰PtrTo, + "reflect.Select": ext۰reflect۰Select, + "reflect.SliceOf": ext۰reflect۰SliceOf, + "reflect.TypeOf": ext۰reflect۰TypeOf, + "reflect.ValueOf": ext۰reflect۰ValueOf, + "reflect.Zero": ext۰reflect۰Zero, + "reflect.init": ext۰NoEffect, + + // *reflect.rtype methods + "(*reflect.rtype).Align": ext۰NoEffect, + "(*reflect.rtype).AssignableTo": ext۰NoEffect, + "(*reflect.rtype).Bits": ext۰NoEffect, + "(*reflect.rtype).ChanDir": ext۰NoEffect, + "(*reflect.rtype).ConvertibleTo": ext۰NoEffect, + "(*reflect.rtype).Elem": ext۰reflect۰rtype۰Elem, + "(*reflect.rtype).Field": ext۰reflect۰rtype۰Field, + "(*reflect.rtype).FieldAlign": ext۰NoEffect, + "(*reflect.rtype).FieldByIndex": ext۰reflect۰rtype۰FieldByIndex, + "(*reflect.rtype).FieldByName": ext۰reflect۰rtype۰FieldByName, + "(*reflect.rtype).FieldByNameFunc": ext۰reflect۰rtype۰FieldByNameFunc, + "(*reflect.rtype).Implements": ext۰NoEffect, + "(*reflect.rtype).In": ext۰reflect۰rtype۰In, + "(*reflect.rtype).IsVariadic": ext۰NoEffect, + "(*reflect.rtype).Key": ext۰reflect۰rtype۰Key, + "(*reflect.rtype).Kind": ext۰NoEffect, + "(*reflect.rtype).Len": ext۰NoEffect, + "(*reflect.rtype).Method": ext۰reflect۰rtype۰Method, + "(*reflect.rtype).MethodByName": ext۰reflect۰rtype۰MethodByName, + "(*reflect.rtype).Name": ext۰NoEffect, + "(*reflect.rtype).NumField": ext۰NoEffect, + "(*reflect.rtype).NumIn": ext۰NoEffect, + "(*reflect.rtype).NumMethod": ext۰NoEffect, + "(*reflect.rtype).NumOut": ext۰NoEffect, + "(*reflect.rtype).Out": ext۰reflect۰rtype۰Out, + "(*reflect.rtype).PkgPath": ext۰NoEffect, + "(*reflect.rtype).Size": ext۰NoEffect, + "(*reflect.rtype).String": ext۰NoEffect, + } { + intrinsicsByName[name] = fn + } +} + +// -------------------- (reflect.Value) -------------------- + +func ext۰reflect۰Value۰Addr(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func (Value).Bytes() Value ---------- + +// result = v.Bytes() +type rVBytesConstraint struct { + v nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rVBytesConstraint) ptr() nodeid { return c.v } +func (c *rVBytesConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rVBytes.result") +} +func (c *rVBytesConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.result = mapping[c.result] +} + +func (c *rVBytesConstraint) String() string { + return fmt.Sprintf("n%d = reflect n%d.Bytes()", c.result, c.v) +} + +func (c *rVBytesConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, slice, indirect := a.taggedValue(vObj) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + tSlice, ok := tDyn.Underlying().(*types.Slice) + if ok && types.Identical(tSlice.Elem(), types.Typ[types.Uint8]) { + if a.onlineCopy(c.result, slice) { + changed = true + } + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Value۰Bytes(a *analysis, cgn *cgnode) { + a.addConstraint(&rVBytesConstraint{ + v: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func (Value).Call(in []Value) []Value ---------- + +// result = v.Call(in) +type rVCallConstraint struct { + cgn *cgnode + targets nodeid // (indirect) + v nodeid // (ptr) + arg nodeid // = in[*] + result nodeid // (indirect) + dotdotdot bool // interpret last arg as a "..." slice +} + +func (c *rVCallConstraint) ptr() nodeid { return c.v } +func (c *rVCallConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.targets), "rVCall.targets") + h.markIndirect(onodeid(c.result), "rVCall.result") +} +func (c *rVCallConstraint) renumber(mapping []nodeid) { + c.targets = mapping[c.targets] + c.v = mapping[c.v] + c.arg = mapping[c.arg] + c.result = mapping[c.result] +} + +func (c *rVCallConstraint) String() string { + return fmt.Sprintf("n%d = reflect n%d.Call(n%d)", c.result, c.v, c.arg) +} + +func (c *rVCallConstraint) solve(a *analysis, delta *nodeset) { + if c.targets == 0 { + panic("no targets") + } + + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, fn, indirect := a.taggedValue(vObj) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + tSig, ok := tDyn.Underlying().(*types.Signature) + if !ok { + continue // not a function + } + if tSig.Recv() != nil { + panic(tSig) // TODO(adonovan): rethink when we implement Method() + } + + // Add dynamic call target. + if a.onlineCopy(c.targets, fn) { + a.addWork(c.targets) + // TODO(adonovan): is 'else continue' a sound optimisation here? + } + + // Allocate a P/R block. + tParams := tSig.Params() + tResults := tSig.Results() + params := a.addNodes(tParams, "rVCall.params") + results := a.addNodes(tResults, "rVCall.results") + + // Make a dynamic call to 'fn'. + a.store(fn, params, 1, a.sizeof(tParams)) + a.load(results, fn, 1+a.sizeof(tParams), a.sizeof(tResults)) + + // Populate P by type-asserting each actual arg (all merged in c.arg). + for i, n := 0, tParams.Len(); i < n; i++ { + T := tParams.At(i).Type() + a.typeAssert(T, params, c.arg, false) + params += nodeid(a.sizeof(T)) + } + + // Use R by tagging and copying each actual result to c.result. + for i, n := 0, tResults.Len(); i < n; i++ { + T := tResults.At(i).Type() + // Convert from an arbitrary type to a reflect.Value + // (like MakeInterface followed by reflect.ValueOf). + if isInterface(T) { + // (don't tag) + if a.onlineCopy(c.result, results) { + changed = true + } + } else { + obj := a.makeTagged(T, c.cgn, nil) + a.onlineCopyN(obj+1, results, a.sizeof(T)) + if a.addLabel(c.result, obj) { // (true) + changed = true + } + } + results += nodeid(a.sizeof(T)) + } + } + if changed { + a.addWork(c.result) + } +} + +// Common code for direct (inlined) and indirect calls to (reflect.Value).Call. +func reflectCallImpl(a *analysis, cgn *cgnode, site *callsite, recv, arg nodeid, dotdotdot bool) nodeid { + // Allocate []reflect.Value array for the result. + ret := a.nextNode() + a.addNodes(types.NewArray(a.reflectValueObj.Type(), 1), "rVCall.ret") + a.endObject(ret, cgn, nil) + + // pts(targets) will be the set of possible call targets. + site.targets = a.addOneNode(tInvalid, "rvCall.targets", nil) + + // All arguments are merged since they arrive in a slice. + argelts := a.addOneNode(a.reflectValueObj.Type(), "rVCall.args", nil) + a.load(argelts, arg, 1, 1) // slice elements + + a.addConstraint(&rVCallConstraint{ + cgn: cgn, + targets: site.targets, + v: recv, + arg: argelts, + result: ret + 1, // results go into elements of ret + dotdotdot: dotdotdot, + }) + return ret +} + +func reflectCall(a *analysis, cgn *cgnode, dotdotdot bool) { + // This is the shared contour implementation of (reflect.Value).Call + // and CallSlice, as used by indirect calls (rare). + // Direct calls are inlined in gen.go, eliding the + // intermediate cgnode for Call. + site := new(callsite) + cgn.sites = append(cgn.sites, site) + recv := a.funcParams(cgn.obj) + arg := recv + 1 + ret := reflectCallImpl(a, cgn, site, recv, arg, dotdotdot) + a.addressOf(cgn.fn.Signature.Results().At(0).Type(), a.funcResults(cgn.obj), ret) +} + +func ext۰reflect۰Value۰Call(a *analysis, cgn *cgnode) { + reflectCall(a, cgn, false) +} + +func ext۰reflect۰Value۰CallSlice(a *analysis, cgn *cgnode) { + // TODO(adonovan): implement. Also, inline direct calls in gen.go too. + if false { + reflectCall(a, cgn, true) + } +} + +func ext۰reflect۰Value۰Convert(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func (Value).Elem() Value ---------- + +// result = v.Elem() +type rVElemConstraint struct { + cgn *cgnode + v nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rVElemConstraint) ptr() nodeid { return c.v } +func (c *rVElemConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rVElem.result") +} +func (c *rVElemConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.result = mapping[c.result] +} + +func (c *rVElemConstraint) String() string { + return fmt.Sprintf("n%d = reflect n%d.Elem()", c.result, c.v) +} + +func (c *rVElemConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, payload, indirect := a.taggedValue(vObj) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + switch t := tDyn.Underlying().(type) { + case *types.Interface: + if a.onlineCopy(c.result, payload) { + changed = true + } + + case *types.Pointer: + obj := a.makeTagged(t.Elem(), c.cgn, nil) + a.load(obj+1, payload, 0, a.sizeof(t.Elem())) + if a.addLabel(c.result, obj) { + changed = true + } + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Value۰Elem(a *analysis, cgn *cgnode) { + a.addConstraint(&rVElemConstraint{ + cgn: cgn, + v: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +func ext۰reflect۰Value۰Field(a *analysis, cgn *cgnode) {} // TODO(adonovan) +func ext۰reflect۰Value۰FieldByIndex(a *analysis, cgn *cgnode) {} // TODO(adonovan) +func ext۰reflect۰Value۰FieldByName(a *analysis, cgn *cgnode) {} // TODO(adonovan) +func ext۰reflect۰Value۰FieldByNameFunc(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func (Value).Index() Value ---------- + +// result = v.Index() +type rVIndexConstraint struct { + cgn *cgnode + v nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rVIndexConstraint) ptr() nodeid { return c.v } +func (c *rVIndexConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rVIndex.result") +} +func (c *rVIndexConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.result = mapping[c.result] +} + +func (c *rVIndexConstraint) String() string { + return fmt.Sprintf("n%d = reflect n%d.Index()", c.result, c.v) +} + +func (c *rVIndexConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, payload, indirect := a.taggedValue(vObj) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + var res nodeid + switch t := tDyn.Underlying().(type) { + case *types.Array: + res = a.makeTagged(t.Elem(), c.cgn, nil) + a.onlineCopyN(res+1, payload+1, a.sizeof(t.Elem())) + + case *types.Slice: + res = a.makeTagged(t.Elem(), c.cgn, nil) + a.load(res+1, payload, 1, a.sizeof(t.Elem())) + + case *types.Basic: + if t.Kind() == types.String { + res = a.makeTagged(types.Typ[types.Rune], c.cgn, nil) + } + } + if res != 0 && a.addLabel(c.result, res) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Value۰Index(a *analysis, cgn *cgnode) { + a.addConstraint(&rVIndexConstraint{ + cgn: cgn, + v: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func (Value).Interface() Value ---------- + +// result = v.Interface() +type rVInterfaceConstraint struct { + v nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rVInterfaceConstraint) ptr() nodeid { return c.v } +func (c *rVInterfaceConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rVInterface.result") +} +func (c *rVInterfaceConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.result = mapping[c.result] +} + +func (c *rVInterfaceConstraint) String() string { + return fmt.Sprintf("n%d = reflect n%d.Interface()", c.result, c.v) +} + +func (c *rVInterfaceConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, payload, indirect := a.taggedValue(vObj) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + if isInterface(tDyn) { + if a.onlineCopy(c.result, payload) { + a.addWork(c.result) + } + } else { + if a.addLabel(c.result, vObj) { + changed = true + } + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Value۰Interface(a *analysis, cgn *cgnode) { + a.addConstraint(&rVInterfaceConstraint{ + v: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func (Value).MapIndex(Value) Value ---------- + +// result = v.MapIndex(_) +type rVMapIndexConstraint struct { + cgn *cgnode + v nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rVMapIndexConstraint) ptr() nodeid { return c.v } +func (c *rVMapIndexConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rVMapIndex.result") +} +func (c *rVMapIndexConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.result = mapping[c.result] +} + +func (c *rVMapIndexConstraint) String() string { + return fmt.Sprintf("n%d = reflect n%d.MapIndex(_)", c.result, c.v) +} + +func (c *rVMapIndexConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, m, indirect := a.taggedValue(vObj) + tMap, _ := tDyn.Underlying().(*types.Map) + if tMap == nil { + continue // not a map + } + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + obj := a.makeTagged(tMap.Elem(), c.cgn, nil) + a.load(obj+1, m, a.sizeof(tMap.Key()), a.sizeof(tMap.Elem())) + if a.addLabel(c.result, obj) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Value۰MapIndex(a *analysis, cgn *cgnode) { + a.addConstraint(&rVMapIndexConstraint{ + cgn: cgn, + v: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func (Value).MapKeys() []Value ---------- + +// result = v.MapKeys() +type rVMapKeysConstraint struct { + cgn *cgnode + v nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rVMapKeysConstraint) ptr() nodeid { return c.v } +func (c *rVMapKeysConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rVMapKeys.result") +} +func (c *rVMapKeysConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.result = mapping[c.result] +} + +func (c *rVMapKeysConstraint) String() string { + return fmt.Sprintf("n%d = reflect n%d.MapKeys()", c.result, c.v) +} + +func (c *rVMapKeysConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, m, indirect := a.taggedValue(vObj) + tMap, _ := tDyn.Underlying().(*types.Map) + if tMap == nil { + continue // not a map + } + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + kObj := a.makeTagged(tMap.Key(), c.cgn, nil) + a.load(kObj+1, m, 0, a.sizeof(tMap.Key())) + if a.addLabel(c.result, kObj) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Value۰MapKeys(a *analysis, cgn *cgnode) { + // Allocate an array for the result. + obj := a.nextNode() + T := types.NewSlice(a.reflectValueObj.Type()) + a.addNodes(sliceToArray(T), "reflect.MapKeys result") + a.endObject(obj, cgn, nil) + a.addressOf(T, a.funcResults(cgn.obj), obj) + + a.addConstraint(&rVMapKeysConstraint{ + cgn: cgn, + v: a.funcParams(cgn.obj), + result: obj + 1, // result is stored in array elems + }) +} + +func ext۰reflect۰Value۰Method(a *analysis, cgn *cgnode) {} // TODO(adonovan) +func ext۰reflect۰Value۰MethodByName(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func (Value).Recv(Value) Value ---------- + +// result, _ = v.Recv() +type rVRecvConstraint struct { + cgn *cgnode + v nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rVRecvConstraint) ptr() nodeid { return c.v } +func (c *rVRecvConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rVRecv.result") +} +func (c *rVRecvConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.result = mapping[c.result] +} + +func (c *rVRecvConstraint) String() string { + return fmt.Sprintf("n%d = reflect n%d.Recv()", c.result, c.v) +} + +func (c *rVRecvConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, ch, indirect := a.taggedValue(vObj) + tChan, _ := tDyn.Underlying().(*types.Chan) + if tChan == nil { + continue // not a channel + } + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + tElem := tChan.Elem() + elemObj := a.makeTagged(tElem, c.cgn, nil) + a.load(elemObj+1, ch, 0, a.sizeof(tElem)) + if a.addLabel(c.result, elemObj) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Value۰Recv(a *analysis, cgn *cgnode) { + a.addConstraint(&rVRecvConstraint{ + cgn: cgn, + v: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func (Value).Send(Value) ---------- + +// v.Send(x) +type rVSendConstraint struct { + cgn *cgnode + v nodeid // (ptr) + x nodeid +} + +func (c *rVSendConstraint) ptr() nodeid { return c.v } +func (c *rVSendConstraint) presolve(*hvn) {} +func (c *rVSendConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.x = mapping[c.x] +} + +func (c *rVSendConstraint) String() string { + return fmt.Sprintf("reflect n%d.Send(n%d)", c.v, c.x) +} + +func (c *rVSendConstraint) solve(a *analysis, delta *nodeset) { + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, ch, indirect := a.taggedValue(vObj) + tChan, _ := tDyn.Underlying().(*types.Chan) + if tChan == nil { + continue // not a channel + } + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + // Extract x's payload to xtmp, then store to channel. + tElem := tChan.Elem() + xtmp := a.addNodes(tElem, "Send.xtmp") + a.typeAssert(tElem, xtmp, c.x, false) + a.store(ch, xtmp, 0, a.sizeof(tElem)) + } +} + +func ext۰reflect۰Value۰Send(a *analysis, cgn *cgnode) { + params := a.funcParams(cgn.obj) + a.addConstraint(&rVSendConstraint{ + cgn: cgn, + v: params, + x: params + 1, + }) +} + +func ext۰reflect۰Value۰Set(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func (Value).SetBytes(x []byte) ---------- + +// v.SetBytes(x) +type rVSetBytesConstraint struct { + cgn *cgnode + v nodeid // (ptr) + x nodeid +} + +func (c *rVSetBytesConstraint) ptr() nodeid { return c.v } +func (c *rVSetBytesConstraint) presolve(*hvn) {} +func (c *rVSetBytesConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.x = mapping[c.x] +} + +func (c *rVSetBytesConstraint) String() string { + return fmt.Sprintf("reflect n%d.SetBytes(n%d)", c.v, c.x) +} + +func (c *rVSetBytesConstraint) solve(a *analysis, delta *nodeset) { + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, slice, indirect := a.taggedValue(vObj) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + tSlice, ok := tDyn.Underlying().(*types.Slice) + if ok && types.Identical(tSlice.Elem(), types.Typ[types.Uint8]) { + if a.onlineCopy(slice, c.x) { + a.addWork(slice) + } + } + } +} + +func ext۰reflect۰Value۰SetBytes(a *analysis, cgn *cgnode) { + params := a.funcParams(cgn.obj) + a.addConstraint(&rVSetBytesConstraint{ + cgn: cgn, + v: params, + x: params + 1, + }) +} + +// ---------- func (Value).SetMapIndex(k Value, v Value) ---------- + +// v.SetMapIndex(key, val) +type rVSetMapIndexConstraint struct { + cgn *cgnode + v nodeid // (ptr) + key nodeid + val nodeid +} + +func (c *rVSetMapIndexConstraint) ptr() nodeid { return c.v } +func (c *rVSetMapIndexConstraint) presolve(*hvn) {} +func (c *rVSetMapIndexConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.key = mapping[c.key] + c.val = mapping[c.val] +} + +func (c *rVSetMapIndexConstraint) String() string { + return fmt.Sprintf("reflect n%d.SetMapIndex(n%d, n%d)", c.v, c.key, c.val) +} + +func (c *rVSetMapIndexConstraint) solve(a *analysis, delta *nodeset) { + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, m, indirect := a.taggedValue(vObj) + tMap, _ := tDyn.Underlying().(*types.Map) + if tMap == nil { + continue // not a map + } + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + keysize := a.sizeof(tMap.Key()) + + // Extract key's payload to keytmp, then store to map key. + keytmp := a.addNodes(tMap.Key(), "SetMapIndex.keytmp") + a.typeAssert(tMap.Key(), keytmp, c.key, false) + a.store(m, keytmp, 0, keysize) + + // Extract val's payload to vtmp, then store to map value. + valtmp := a.addNodes(tMap.Elem(), "SetMapIndex.valtmp") + a.typeAssert(tMap.Elem(), valtmp, c.val, false) + a.store(m, valtmp, keysize, a.sizeof(tMap.Elem())) + } +} + +func ext۰reflect۰Value۰SetMapIndex(a *analysis, cgn *cgnode) { + params := a.funcParams(cgn.obj) + a.addConstraint(&rVSetMapIndexConstraint{ + cgn: cgn, + v: params, + key: params + 1, + val: params + 2, + }) +} + +func ext۰reflect۰Value۰SetPointer(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func (Value).Slice(v Value, i, j int) Value ---------- + +// result = v.Slice(_, _) +type rVSliceConstraint struct { + cgn *cgnode + v nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rVSliceConstraint) ptr() nodeid { return c.v } +func (c *rVSliceConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rVSlice.result") +} +func (c *rVSliceConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.result = mapping[c.result] +} + +func (c *rVSliceConstraint) String() string { + return fmt.Sprintf("n%d = reflect n%d.Slice(_, _)", c.result, c.v) +} + +func (c *rVSliceConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, payload, indirect := a.taggedValue(vObj) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + var res nodeid + switch t := tDyn.Underlying().(type) { + case *types.Pointer: + if tArr, ok := t.Elem().Underlying().(*types.Array); ok { + // pointer to array + res = a.makeTagged(types.NewSlice(tArr.Elem()), c.cgn, nil) + if a.onlineCopy(res+1, payload) { + a.addWork(res + 1) + } + } + + case *types.Array: + // TODO(adonovan): implement addressable + // arrays when we do indirect tagged objects. + + case *types.Slice: + res = vObj + + case *types.Basic: + if t == types.Typ[types.String] { + res = vObj + } + } + + if res != 0 && a.addLabel(c.result, res) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Value۰Slice(a *analysis, cgn *cgnode) { + a.addConstraint(&rVSliceConstraint{ + cgn: cgn, + v: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// -------------------- Standalone reflect functions -------------------- + +func ext۰reflect۰Append(a *analysis, cgn *cgnode) {} // TODO(adonovan) +func ext۰reflect۰AppendSlice(a *analysis, cgn *cgnode) {} // TODO(adonovan) +func ext۰reflect۰Copy(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func ChanOf(ChanDir, Type) Type ---------- + +// result = ChanOf(dir, t) +type reflectChanOfConstraint struct { + cgn *cgnode + t nodeid // (ptr) + result nodeid // (indirect) + dirs []types.ChanDir +} + +func (c *reflectChanOfConstraint) ptr() nodeid { return c.t } +func (c *reflectChanOfConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectChanOf.result") +} +func (c *reflectChanOfConstraint) renumber(mapping []nodeid) { + c.t = mapping[c.t] + c.result = mapping[c.result] +} + +func (c *reflectChanOfConstraint) String() string { + return fmt.Sprintf("n%d = reflect.ChanOf(n%d)", c.result, c.t) +} + +func (c *reflectChanOfConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + tObj := nodeid(x) + T := a.rtypeTaggedValue(tObj) + + if typeTooHigh(T) { + continue + } + + for _, dir := range c.dirs { + if a.addLabel(c.result, a.makeRtype(types.NewChan(dir, T))) { + changed = true + } + } + } + if changed { + a.addWork(c.result) + } +} + +// dirMap maps reflect.ChanDir to the set of channel types generated by ChanOf. +var dirMap = [...][]types.ChanDir{ + 0: {types.SendOnly, types.RecvOnly, types.SendRecv}, // unknown + reflect.RecvDir: {types.RecvOnly}, + reflect.SendDir: {types.SendOnly}, + reflect.BothDir: {types.SendRecv}, +} + +func ext۰reflect۰ChanOf(a *analysis, cgn *cgnode) { + // If we have access to the callsite, + // and the channel argument is a constant (as is usual), + // only generate the requested direction. + var dir reflect.ChanDir // unknown + if site := cgn.callersite; site != nil { + if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok { + v, _ := exact.Int64Val(c.Value) + if 0 <= v && v <= int64(reflect.BothDir) { + dir = reflect.ChanDir(v) + } + } + } + + params := a.funcParams(cgn.obj) + a.addConstraint(&reflectChanOfConstraint{ + cgn: cgn, + t: params + 1, + result: a.funcResults(cgn.obj), + dirs: dirMap[dir], + }) +} + +// ---------- func Indirect(v Value) Value ---------- + +// result = Indirect(v) +type reflectIndirectConstraint struct { + cgn *cgnode + v nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *reflectIndirectConstraint) ptr() nodeid { return c.v } +func (c *reflectIndirectConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectIndirect.result") +} +func (c *reflectIndirectConstraint) renumber(mapping []nodeid) { + c.v = mapping[c.v] + c.result = mapping[c.result] +} + +func (c *reflectIndirectConstraint) String() string { + return fmt.Sprintf("n%d = reflect.Indirect(n%d)", c.result, c.v) +} + +func (c *reflectIndirectConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + vObj := nodeid(x) + tDyn, _, _ := a.taggedValue(vObj) + var res nodeid + if tPtr, ok := tDyn.Underlying().(*types.Pointer); ok { + // load the payload of the pointer's tagged object + // into a new tagged object + res = a.makeTagged(tPtr.Elem(), c.cgn, nil) + a.load(res+1, vObj+1, 0, a.sizeof(tPtr.Elem())) + } else { + res = vObj + } + + if a.addLabel(c.result, res) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Indirect(a *analysis, cgn *cgnode) { + a.addConstraint(&reflectIndirectConstraint{ + cgn: cgn, + v: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func MakeChan(Type) Value ---------- + +// result = MakeChan(typ) +type reflectMakeChanConstraint struct { + cgn *cgnode + typ nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *reflectMakeChanConstraint) ptr() nodeid { return c.typ } +func (c *reflectMakeChanConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectMakeChan.result") +} +func (c *reflectMakeChanConstraint) renumber(mapping []nodeid) { + c.typ = mapping[c.typ] + c.result = mapping[c.result] +} + +func (c *reflectMakeChanConstraint) String() string { + return fmt.Sprintf("n%d = reflect.MakeChan(n%d)", c.result, c.typ) +} + +func (c *reflectMakeChanConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + typObj := nodeid(x) + T := a.rtypeTaggedValue(typObj) + tChan, ok := T.Underlying().(*types.Chan) + if !ok || tChan.Dir() != types.SendRecv { + continue // not a bidirectional channel type + } + + obj := a.nextNode() + a.addNodes(tChan.Elem(), "reflect.MakeChan.value") + a.endObject(obj, c.cgn, nil) + + // put its address in a new T-tagged object + id := a.makeTagged(T, c.cgn, nil) + a.addLabel(id+1, obj) + + // flow the T-tagged object to the result + if a.addLabel(c.result, id) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰MakeChan(a *analysis, cgn *cgnode) { + a.addConstraint(&reflectMakeChanConstraint{ + cgn: cgn, + typ: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +func ext۰reflect۰MakeFunc(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func MakeMap(Type) Value ---------- + +// result = MakeMap(typ) +type reflectMakeMapConstraint struct { + cgn *cgnode + typ nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *reflectMakeMapConstraint) ptr() nodeid { return c.typ } +func (c *reflectMakeMapConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectMakeMap.result") +} +func (c *reflectMakeMapConstraint) renumber(mapping []nodeid) { + c.typ = mapping[c.typ] + c.result = mapping[c.result] +} + +func (c *reflectMakeMapConstraint) String() string { + return fmt.Sprintf("n%d = reflect.MakeMap(n%d)", c.result, c.typ) +} + +func (c *reflectMakeMapConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + typObj := nodeid(x) + T := a.rtypeTaggedValue(typObj) + tMap, ok := T.Underlying().(*types.Map) + if !ok { + continue // not a map type + } + + mapObj := a.nextNode() + a.addNodes(tMap.Key(), "reflect.MakeMap.key") + a.addNodes(tMap.Elem(), "reflect.MakeMap.value") + a.endObject(mapObj, c.cgn, nil) + + // put its address in a new T-tagged object + id := a.makeTagged(T, c.cgn, nil) + a.addLabel(id+1, mapObj) + + // flow the T-tagged object to the result + if a.addLabel(c.result, id) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰MakeMap(a *analysis, cgn *cgnode) { + a.addConstraint(&reflectMakeMapConstraint{ + cgn: cgn, + typ: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func MakeSlice(Type) Value ---------- + +// result = MakeSlice(typ) +type reflectMakeSliceConstraint struct { + cgn *cgnode + typ nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *reflectMakeSliceConstraint) ptr() nodeid { return c.typ } +func (c *reflectMakeSliceConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectMakeSlice.result") +} +func (c *reflectMakeSliceConstraint) renumber(mapping []nodeid) { + c.typ = mapping[c.typ] + c.result = mapping[c.result] +} + +func (c *reflectMakeSliceConstraint) String() string { + return fmt.Sprintf("n%d = reflect.MakeSlice(n%d)", c.result, c.typ) +} + +func (c *reflectMakeSliceConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + typObj := nodeid(x) + T := a.rtypeTaggedValue(typObj) + if _, ok := T.Underlying().(*types.Slice); !ok { + continue // not a slice type + } + + obj := a.nextNode() + a.addNodes(sliceToArray(T), "reflect.MakeSlice") + a.endObject(obj, c.cgn, nil) + + // put its address in a new T-tagged object + id := a.makeTagged(T, c.cgn, nil) + a.addLabel(id+1, obj) + + // flow the T-tagged object to the result + if a.addLabel(c.result, id) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰MakeSlice(a *analysis, cgn *cgnode) { + a.addConstraint(&reflectMakeSliceConstraint{ + cgn: cgn, + typ: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +func ext۰reflect۰MapOf(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func New(Type) Value ---------- + +// result = New(typ) +type reflectNewConstraint struct { + cgn *cgnode + typ nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *reflectNewConstraint) ptr() nodeid { return c.typ } +func (c *reflectNewConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectNew.result") +} +func (c *reflectNewConstraint) renumber(mapping []nodeid) { + c.typ = mapping[c.typ] + c.result = mapping[c.result] +} + +func (c *reflectNewConstraint) String() string { + return fmt.Sprintf("n%d = reflect.New(n%d)", c.result, c.typ) +} + +func (c *reflectNewConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + typObj := nodeid(x) + T := a.rtypeTaggedValue(typObj) + + // allocate new T object + newObj := a.nextNode() + a.addNodes(T, "reflect.New") + a.endObject(newObj, c.cgn, nil) + + // put its address in a new *T-tagged object + id := a.makeTagged(types.NewPointer(T), c.cgn, nil) + a.addLabel(id+1, newObj) + + // flow the pointer to the result + if a.addLabel(c.result, id) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰New(a *analysis, cgn *cgnode) { + a.addConstraint(&reflectNewConstraint{ + cgn: cgn, + typ: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +func ext۰reflect۰NewAt(a *analysis, cgn *cgnode) { + ext۰reflect۰New(a, cgn) + + // TODO(adonovan): also report dynamic calls to unsound intrinsics. + if site := cgn.callersite; site != nil { + a.warnf(site.pos(), "unsound: %s contains a reflect.NewAt() call", site.instr.Parent()) + } +} + +// ---------- func PtrTo(Type) Type ---------- + +// result = PtrTo(t) +type reflectPtrToConstraint struct { + cgn *cgnode + t nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *reflectPtrToConstraint) ptr() nodeid { return c.t } +func (c *reflectPtrToConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectPtrTo.result") +} +func (c *reflectPtrToConstraint) renumber(mapping []nodeid) { + c.t = mapping[c.t] + c.result = mapping[c.result] +} + +func (c *reflectPtrToConstraint) String() string { + return fmt.Sprintf("n%d = reflect.PtrTo(n%d)", c.result, c.t) +} + +func (c *reflectPtrToConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + tObj := nodeid(x) + T := a.rtypeTaggedValue(tObj) + + if typeTooHigh(T) { + continue + } + + if a.addLabel(c.result, a.makeRtype(types.NewPointer(T))) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰PtrTo(a *analysis, cgn *cgnode) { + a.addConstraint(&reflectPtrToConstraint{ + cgn: cgn, + t: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +func ext۰reflect۰Select(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func SliceOf(Type) Type ---------- + +// result = SliceOf(t) +type reflectSliceOfConstraint struct { + cgn *cgnode + t nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *reflectSliceOfConstraint) ptr() nodeid { return c.t } +func (c *reflectSliceOfConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectSliceOf.result") +} +func (c *reflectSliceOfConstraint) renumber(mapping []nodeid) { + c.t = mapping[c.t] + c.result = mapping[c.result] +} + +func (c *reflectSliceOfConstraint) String() string { + return fmt.Sprintf("n%d = reflect.SliceOf(n%d)", c.result, c.t) +} + +func (c *reflectSliceOfConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + tObj := nodeid(x) + T := a.rtypeTaggedValue(tObj) + + if typeTooHigh(T) { + continue + } + + if a.addLabel(c.result, a.makeRtype(types.NewSlice(T))) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰SliceOf(a *analysis, cgn *cgnode) { + a.addConstraint(&reflectSliceOfConstraint{ + cgn: cgn, + t: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func TypeOf(v Value) Type ---------- + +// result = TypeOf(i) +type reflectTypeOfConstraint struct { + cgn *cgnode + i nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *reflectTypeOfConstraint) ptr() nodeid { return c.i } +func (c *reflectTypeOfConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectTypeOf.result") +} +func (c *reflectTypeOfConstraint) renumber(mapping []nodeid) { + c.i = mapping[c.i] + c.result = mapping[c.result] +} + +func (c *reflectTypeOfConstraint) String() string { + return fmt.Sprintf("n%d = reflect.TypeOf(n%d)", c.result, c.i) +} + +func (c *reflectTypeOfConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + iObj := nodeid(x) + tDyn, _, _ := a.taggedValue(iObj) + if a.addLabel(c.result, a.makeRtype(tDyn)) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰TypeOf(a *analysis, cgn *cgnode) { + a.addConstraint(&reflectTypeOfConstraint{ + cgn: cgn, + i: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func ValueOf(interface{}) Value ---------- + +func ext۰reflect۰ValueOf(a *analysis, cgn *cgnode) { + // TODO(adonovan): when we start creating indirect tagged + // objects, we'll need to handle them specially here since + // they must never appear in the PTS of an interface{}. + a.copy(a.funcResults(cgn.obj), a.funcParams(cgn.obj), 1) +} + +// ---------- func Zero(Type) Value ---------- + +// result = Zero(typ) +type reflectZeroConstraint struct { + cgn *cgnode + typ nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *reflectZeroConstraint) ptr() nodeid { return c.typ } +func (c *reflectZeroConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "reflectZero.result") +} +func (c *reflectZeroConstraint) renumber(mapping []nodeid) { + c.typ = mapping[c.typ] + c.result = mapping[c.result] +} + +func (c *reflectZeroConstraint) String() string { + return fmt.Sprintf("n%d = reflect.Zero(n%d)", c.result, c.typ) +} + +func (c *reflectZeroConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + typObj := nodeid(x) + T := a.rtypeTaggedValue(typObj) + + // TODO(adonovan): if T is an interface type, we need + // to create an indirect tagged object containing + // new(T). To avoid updates of such shared values, + // we'll need another flag on indirect tagged objects + // that marks whether they are addressable or + // readonly, just like the reflect package does. + + // memoize using a.reflectZeros[T] + var id nodeid + if z := a.reflectZeros.At(T); false && z != nil { + id = z.(nodeid) + } else { + id = a.makeTagged(T, c.cgn, nil) + a.reflectZeros.Set(T, id) + } + if a.addLabel(c.result, id) { + changed = true + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰Zero(a *analysis, cgn *cgnode) { + a.addConstraint(&reflectZeroConstraint{ + cgn: cgn, + typ: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// -------------------- (*reflect.rtype) methods -------------------- + +// ---------- func (*rtype) Elem() Type ---------- + +// result = Elem(t) +type rtypeElemConstraint struct { + cgn *cgnode + t nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rtypeElemConstraint) ptr() nodeid { return c.t } +func (c *rtypeElemConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rtypeElem.result") +} +func (c *rtypeElemConstraint) renumber(mapping []nodeid) { + c.t = mapping[c.t] + c.result = mapping[c.result] +} + +func (c *rtypeElemConstraint) String() string { + return fmt.Sprintf("n%d = (*reflect.rtype).Elem(n%d)", c.result, c.t) +} + +func (c *rtypeElemConstraint) solve(a *analysis, delta *nodeset) { + // Implemented by *types.{Map,Chan,Array,Slice,Pointer}. + type hasElem interface { + Elem() types.Type + } + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + tObj := nodeid(x) + T := a.nodes[tObj].obj.data.(types.Type) + if tHasElem, ok := T.Underlying().(hasElem); ok { + if a.addLabel(c.result, a.makeRtype(tHasElem.Elem())) { + changed = true + } + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰rtype۰Elem(a *analysis, cgn *cgnode) { + a.addConstraint(&rtypeElemConstraint{ + cgn: cgn, + t: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func (*rtype) Field(int) StructField ---------- +// ---------- func (*rtype) FieldByName(string) (StructField, bool) ---------- + +// result = FieldByName(t, name) +// result = Field(t, _) +type rtypeFieldByNameConstraint struct { + cgn *cgnode + name string // name of field; "" for unknown + t nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rtypeFieldByNameConstraint) ptr() nodeid { return c.t } +func (c *rtypeFieldByNameConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result+3), "rtypeFieldByName.result.Type") +} +func (c *rtypeFieldByNameConstraint) renumber(mapping []nodeid) { + c.t = mapping[c.t] + c.result = mapping[c.result] +} + +func (c *rtypeFieldByNameConstraint) String() string { + return fmt.Sprintf("n%d = (*reflect.rtype).FieldByName(n%d, %q)", c.result, c.t, c.name) +} + +func (c *rtypeFieldByNameConstraint) solve(a *analysis, delta *nodeset) { + // type StructField struct { + // 0 __identity__ + // 1 Name string + // 2 PkgPath string + // 3 Type Type + // 4 Tag StructTag + // 5 Offset uintptr + // 6 Index []int + // 7 Anonymous bool + // } + + for _, x := range delta.AppendTo(a.deltaSpace) { + tObj := nodeid(x) + T := a.nodes[tObj].obj.data.(types.Type) + tStruct, ok := T.Underlying().(*types.Struct) + if !ok { + continue // not a struct type + } + + n := tStruct.NumFields() + for i := 0; i < n; i++ { + f := tStruct.Field(i) + if c.name == "" || c.name == f.Name() { + + // a.offsetOf(Type) is 3. + if id := c.result + 3; a.addLabel(id, a.makeRtype(f.Type())) { + a.addWork(id) + } + // TODO(adonovan): StructField.Index should be non-nil. + } + } + } +} + +func ext۰reflect۰rtype۰FieldByName(a *analysis, cgn *cgnode) { + // If we have access to the callsite, + // and the argument is a string constant, + // return only that field. + var name string + if site := cgn.callersite; site != nil { + if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok { + name = exact.StringVal(c.Value) + } + } + + a.addConstraint(&rtypeFieldByNameConstraint{ + cgn: cgn, + name: name, + t: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +func ext۰reflect۰rtype۰Field(a *analysis, cgn *cgnode) { + // No-one ever calls Field with a constant argument, + // so we don't specialize that case. + a.addConstraint(&rtypeFieldByNameConstraint{ + cgn: cgn, + t: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +func ext۰reflect۰rtype۰FieldByIndex(a *analysis, cgn *cgnode) {} // TODO(adonovan) +func ext۰reflect۰rtype۰FieldByNameFunc(a *analysis, cgn *cgnode) {} // TODO(adonovan) + +// ---------- func (*rtype) In/Out(i int) Type ---------- + +// result = In/Out(t, i) +type rtypeInOutConstraint struct { + cgn *cgnode + t nodeid // (ptr) + result nodeid // (indirect) + out bool + i int // -ve if not a constant +} + +func (c *rtypeInOutConstraint) ptr() nodeid { return c.t } +func (c *rtypeInOutConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rtypeInOut.result") +} +func (c *rtypeInOutConstraint) renumber(mapping []nodeid) { + c.t = mapping[c.t] + c.result = mapping[c.result] +} + +func (c *rtypeInOutConstraint) String() string { + return fmt.Sprintf("n%d = (*reflect.rtype).InOut(n%d, %d)", c.result, c.t, c.i) +} + +func (c *rtypeInOutConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + tObj := nodeid(x) + T := a.nodes[tObj].obj.data.(types.Type) + sig, ok := T.Underlying().(*types.Signature) + if !ok { + continue // not a func type + } + + tuple := sig.Params() + if c.out { + tuple = sig.Results() + } + for i, n := 0, tuple.Len(); i < n; i++ { + if c.i < 0 || c.i == i { + if a.addLabel(c.result, a.makeRtype(tuple.At(i).Type())) { + changed = true + } + } + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰rtype۰InOut(a *analysis, cgn *cgnode, out bool) { + // If we have access to the callsite, + // and the argument is an int constant, + // return only that parameter. + index := -1 + if site := cgn.callersite; site != nil { + if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok { + v, _ := exact.Int64Val(c.Value) + index = int(v) + } + } + a.addConstraint(&rtypeInOutConstraint{ + cgn: cgn, + t: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + out: out, + i: index, + }) +} + +func ext۰reflect۰rtype۰In(a *analysis, cgn *cgnode) { + ext۰reflect۰rtype۰InOut(a, cgn, false) +} + +func ext۰reflect۰rtype۰Out(a *analysis, cgn *cgnode) { + ext۰reflect۰rtype۰InOut(a, cgn, true) +} + +// ---------- func (*rtype) Key() Type ---------- + +// result = Key(t) +type rtypeKeyConstraint struct { + cgn *cgnode + t nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rtypeKeyConstraint) ptr() nodeid { return c.t } +func (c *rtypeKeyConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result), "rtypeKey.result") +} +func (c *rtypeKeyConstraint) renumber(mapping []nodeid) { + c.t = mapping[c.t] + c.result = mapping[c.result] +} + +func (c *rtypeKeyConstraint) String() string { + return fmt.Sprintf("n%d = (*reflect.rtype).Key(n%d)", c.result, c.t) +} + +func (c *rtypeKeyConstraint) solve(a *analysis, delta *nodeset) { + changed := false + for _, x := range delta.AppendTo(a.deltaSpace) { + tObj := nodeid(x) + T := a.nodes[tObj].obj.data.(types.Type) + if tMap, ok := T.Underlying().(*types.Map); ok { + if a.addLabel(c.result, a.makeRtype(tMap.Key())) { + changed = true + } + } + } + if changed { + a.addWork(c.result) + } +} + +func ext۰reflect۰rtype۰Key(a *analysis, cgn *cgnode) { + a.addConstraint(&rtypeKeyConstraint{ + cgn: cgn, + t: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// ---------- func (*rtype) Method(int) (Method, bool) ---------- +// ---------- func (*rtype) MethodByName(string) (Method, bool) ---------- + +// result = MethodByName(t, name) +// result = Method(t, _) +type rtypeMethodByNameConstraint struct { + cgn *cgnode + name string // name of method; "" for unknown + t nodeid // (ptr) + result nodeid // (indirect) +} + +func (c *rtypeMethodByNameConstraint) ptr() nodeid { return c.t } +func (c *rtypeMethodByNameConstraint) presolve(h *hvn) { + h.markIndirect(onodeid(c.result+3), "rtypeMethodByName.result.Type") + h.markIndirect(onodeid(c.result+4), "rtypeMethodByName.result.Func") +} +func (c *rtypeMethodByNameConstraint) renumber(mapping []nodeid) { + c.t = mapping[c.t] + c.result = mapping[c.result] +} + +func (c *rtypeMethodByNameConstraint) String() string { + return fmt.Sprintf("n%d = (*reflect.rtype).MethodByName(n%d, %q)", c.result, c.t, c.name) +} + +// changeRecv returns sig with Recv prepended to Params(). +func changeRecv(sig *types.Signature) *types.Signature { + params := sig.Params() + n := params.Len() + p2 := make([]*types.Var, n+1) + p2[0] = sig.Recv() + for i := 0; i < n; i++ { + p2[i+1] = params.At(i) + } + return types.NewSignature(nil, types.NewTuple(p2...), sig.Results(), sig.Variadic()) +} + +func (c *rtypeMethodByNameConstraint) solve(a *analysis, delta *nodeset) { + for _, x := range delta.AppendTo(a.deltaSpace) { + tObj := nodeid(x) + T := a.nodes[tObj].obj.data.(types.Type) + + isIface := isInterface(T) + + // We don't use Lookup(c.name) when c.name != "" to avoid + // ambiguity: >1 unexported methods could match. + mset := a.prog.MethodSets.MethodSet(T) + for i, n := 0, mset.Len(); i < n; i++ { + sel := mset.At(i) + if c.name == "" || c.name == sel.Obj().Name() { + // type Method struct { + // 0 __identity__ + // 1 Name string + // 2 PkgPath string + // 3 Type Type + // 4 Func Value + // 5 Index int + // } + + var sig *types.Signature + var fn *ssa.Function + if isIface { + sig = sel.Type().(*types.Signature) + } else { + fn = a.prog.MethodValue(sel) + // move receiver to params[0] + sig = changeRecv(fn.Signature) + } + + // a.offsetOf(Type) is 3. + if id := c.result + 3; a.addLabel(id, a.makeRtype(sig)) { + a.addWork(id) + } + if fn != nil { + // a.offsetOf(Func) is 4. + if id := c.result + 4; a.addLabel(id, a.objectNode(nil, fn)) { + a.addWork(id) + } + } + } + } + } +} + +func ext۰reflect۰rtype۰MethodByName(a *analysis, cgn *cgnode) { + // If we have access to the callsite, + // and the argument is a string constant, + // return only that method. + var name string + if site := cgn.callersite; site != nil { + if c, ok := site.instr.Common().Args[0].(*ssa.Const); ok { + name = exact.StringVal(c.Value) + } + } + + a.addConstraint(&rtypeMethodByNameConstraint{ + cgn: cgn, + name: name, + t: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +func ext۰reflect۰rtype۰Method(a *analysis, cgn *cgnode) { + // No-one ever calls Method with a constant argument, + // so we don't specialize that case. + a.addConstraint(&rtypeMethodByNameConstraint{ + cgn: cgn, + t: a.funcParams(cgn.obj), + result: a.funcResults(cgn.obj), + }) +} + +// typeHeight returns the "height" of the type, which is roughly +// speaking the number of chan, map, pointer and slice type constructors +// at the root of T; these are the four type kinds that can be created +// via reflection. Chan and map constructors are counted as double the +// height of slice and pointer constructors since they are less often +// deeply nested. +// +// The solver rules for type constructors must somehow bound the set of +// types they create to ensure termination of the algorithm in cases +// where the output of a type constructor flows to its input, e.g. +// +// func f(t reflect.Type) { +// f(reflect.PtrTo(t)) +// } +// +// It does this by limiting the type height to k, but this still leaves +// a potentially exponential (4^k) number of of types that may be +// enumerated in pathological cases. +// +func typeHeight(T types.Type) int { + switch T := T.(type) { + case *types.Chan: + return 2 + typeHeight(T.Elem()) + case *types.Map: + k := typeHeight(T.Key()) + v := typeHeight(T.Elem()) + if v > k { + k = v // max(k, v) + } + return 2 + k + case *types.Slice: + return 1 + typeHeight(T.Elem()) + case *types.Pointer: + return 1 + typeHeight(T.Elem()) + } + return 0 +} + +func typeTooHigh(T types.Type) bool { + return typeHeight(T) > 3 +} diff --git a/vendor/golang.org/x/tools/go/pointer/solve.go b/vendor/golang.org/x/tools/go/pointer/solve.go new file mode 100644 index 0000000000..3c606854d1 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/solve.go @@ -0,0 +1,372 @@ +// Copyright 2013 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.5 + +package pointer + +// This file defines a naive Andersen-style solver for the inclusion +// constraint system. + +import ( + "fmt" + "go/types" +) + +type solverState struct { + complex []constraint // complex constraints attached to this node + copyTo nodeset // simple copy constraint edges + pts nodeset // points-to set of this node + prevPTS nodeset // pts(n) in previous iteration (for difference propagation) +} + +func (a *analysis) solve() { + start("Solving") + if a.log != nil { + fmt.Fprintf(a.log, "\n\n==== Solving constraints\n\n") + } + + // Solver main loop. + var delta nodeset + for { + // Add new constraints to the graph: + // static constraints from SSA on round 1, + // dynamic constraints from reflection thereafter. + a.processNewConstraints() + + var x int + if !a.work.TakeMin(&x) { + break // empty + } + id := nodeid(x) + if a.log != nil { + fmt.Fprintf(a.log, "\tnode n%d\n", id) + } + + n := a.nodes[id] + + // Difference propagation. + delta.Difference(&n.solve.pts.Sparse, &n.solve.prevPTS.Sparse) + if delta.IsEmpty() { + continue + } + if a.log != nil { + fmt.Fprintf(a.log, "\t\tpts(n%d : %s) = %s + %s\n", + id, n.typ, &delta, &n.solve.prevPTS) + } + n.solve.prevPTS.Copy(&n.solve.pts.Sparse) + + // Apply all resolution rules attached to n. + a.solveConstraints(n, &delta) + + if a.log != nil { + fmt.Fprintf(a.log, "\t\tpts(n%d) = %s\n", id, &n.solve.pts) + } + } + + if !a.nodes[0].solve.pts.IsEmpty() { + panic(fmt.Sprintf("pts(0) is nonempty: %s", &a.nodes[0].solve.pts)) + } + + // Release working state (but keep final PTS). + for _, n := range a.nodes { + n.solve.complex = nil + n.solve.copyTo.Clear() + n.solve.prevPTS.Clear() + } + + if a.log != nil { + fmt.Fprintf(a.log, "Solver done\n") + + // Dump solution. + for i, n := range a.nodes { + if !n.solve.pts.IsEmpty() { + fmt.Fprintf(a.log, "pts(n%d) = %s : %s\n", i, &n.solve.pts, n.typ) + } + } + } + stop("Solving") +} + +// processNewConstraints takes the new constraints from a.constraints +// and adds them to the graph, ensuring +// that new constraints are applied to pre-existing labels and +// that pre-existing constraints are applied to new labels. +// +func (a *analysis) processNewConstraints() { + // Take the slice of new constraints. + // (May grow during call to solveConstraints.) + constraints := a.constraints + a.constraints = nil + + // Initialize points-to sets from addr-of (base) constraints. + for _, c := range constraints { + if c, ok := c.(*addrConstraint); ok { + dst := a.nodes[c.dst] + dst.solve.pts.add(c.src) + + // Populate the worklist with nodes that point to + // something initially (due to addrConstraints) and + // have other constraints attached. + // (A no-op in round 1.) + if !dst.solve.copyTo.IsEmpty() || len(dst.solve.complex) > 0 { + a.addWork(c.dst) + } + } + } + + // Attach simple (copy) and complex constraints to nodes. + var stale nodeset + for _, c := range constraints { + var id nodeid + switch c := c.(type) { + case *addrConstraint: + // base constraints handled in previous loop + continue + case *copyConstraint: + // simple (copy) constraint + id = c.src + a.nodes[id].solve.copyTo.add(c.dst) + default: + // complex constraint + id = c.ptr() + solve := a.nodes[id].solve + solve.complex = append(solve.complex, c) + } + + if n := a.nodes[id]; !n.solve.pts.IsEmpty() { + if !n.solve.prevPTS.IsEmpty() { + stale.add(id) + } + a.addWork(id) + } + } + // Apply new constraints to pre-existing PTS labels. + var space [50]int + for _, id := range stale.AppendTo(space[:0]) { + n := a.nodes[nodeid(id)] + a.solveConstraints(n, &n.solve.prevPTS) + } +} + +// solveConstraints applies each resolution rule attached to node n to +// the set of labels delta. It may generate new constraints in +// a.constraints. +// +func (a *analysis) solveConstraints(n *node, delta *nodeset) { + if delta.IsEmpty() { + return + } + + // Process complex constraints dependent on n. + for _, c := range n.solve.complex { + if a.log != nil { + fmt.Fprintf(a.log, "\t\tconstraint %s\n", c) + } + c.solve(a, delta) + } + + // Process copy constraints. + var copySeen nodeset + for _, x := range n.solve.copyTo.AppendTo(a.deltaSpace) { + mid := nodeid(x) + if copySeen.add(mid) { + if a.nodes[mid].solve.pts.addAll(delta) { + a.addWork(mid) + } + } + } +} + +// addLabel adds label to the points-to set of ptr and reports whether the set grew. +func (a *analysis) addLabel(ptr, label nodeid) bool { + b := a.nodes[ptr].solve.pts.add(label) + if b && a.log != nil { + fmt.Fprintf(a.log, "\t\tpts(n%d) += n%d\n", ptr, label) + } + return b +} + +func (a *analysis) addWork(id nodeid) { + a.work.Insert(int(id)) + if a.log != nil { + fmt.Fprintf(a.log, "\t\twork: n%d\n", id) + } +} + +// onlineCopy adds a copy edge. It is called online, i.e. during +// solving, so it adds edges and pts members directly rather than by +// instantiating a 'constraint'. +// +// The size of the copy is implicitly 1. +// It returns true if pts(dst) changed. +// +func (a *analysis) onlineCopy(dst, src nodeid) bool { + if dst != src { + if nsrc := a.nodes[src]; nsrc.solve.copyTo.add(dst) { + if a.log != nil { + fmt.Fprintf(a.log, "\t\t\tdynamic copy n%d <- n%d\n", dst, src) + } + // TODO(adonovan): most calls to onlineCopy + // are followed by addWork, possibly batched + // via a 'changed' flag; see if there's a + // noticeable penalty to calling addWork here. + return a.nodes[dst].solve.pts.addAll(&nsrc.solve.pts) + } + } + return false +} + +// Returns sizeof. +// Implicitly adds nodes to worklist. +// +// TODO(adonovan): now that we support a.copy() during solving, we +// could eliminate onlineCopyN, but it's much slower. Investigate. +// +func (a *analysis) onlineCopyN(dst, src nodeid, sizeof uint32) uint32 { + for i := uint32(0); i < sizeof; i++ { + if a.onlineCopy(dst, src) { + a.addWork(dst) + } + src++ + dst++ + } + return sizeof +} + +func (c *loadConstraint) solve(a *analysis, delta *nodeset) { + var changed bool + for _, x := range delta.AppendTo(a.deltaSpace) { + k := nodeid(x) + koff := k + nodeid(c.offset) + if a.onlineCopy(c.dst, koff) { + changed = true + } + } + if changed { + a.addWork(c.dst) + } +} + +func (c *storeConstraint) solve(a *analysis, delta *nodeset) { + for _, x := range delta.AppendTo(a.deltaSpace) { + k := nodeid(x) + koff := k + nodeid(c.offset) + if a.onlineCopy(koff, c.src) { + a.addWork(koff) + } + } +} + +func (c *offsetAddrConstraint) solve(a *analysis, delta *nodeset) { + dst := a.nodes[c.dst] + for _, x := range delta.AppendTo(a.deltaSpace) { + k := nodeid(x) + if dst.solve.pts.add(k + nodeid(c.offset)) { + a.addWork(c.dst) + } + } +} + +func (c *typeFilterConstraint) solve(a *analysis, delta *nodeset) { + for _, x := range delta.AppendTo(a.deltaSpace) { + ifaceObj := nodeid(x) + tDyn, _, indirect := a.taggedValue(ifaceObj) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + if types.AssignableTo(tDyn, c.typ) { + if a.addLabel(c.dst, ifaceObj) { + a.addWork(c.dst) + } + } + } +} + +func (c *untagConstraint) solve(a *analysis, delta *nodeset) { + predicate := types.AssignableTo + if c.exact { + predicate = types.Identical + } + for _, x := range delta.AppendTo(a.deltaSpace) { + ifaceObj := nodeid(x) + tDyn, v, indirect := a.taggedValue(ifaceObj) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + if predicate(tDyn, c.typ) { + // Copy payload sans tag to dst. + // + // TODO(adonovan): opt: if tDyn is + // nonpointerlike we can skip this entire + // constraint, perhaps. We only care about + // pointers among the fields. + a.onlineCopyN(c.dst, v, a.sizeof(tDyn)) + } + } +} + +func (c *invokeConstraint) solve(a *analysis, delta *nodeset) { + for _, x := range delta.AppendTo(a.deltaSpace) { + ifaceObj := nodeid(x) + tDyn, v, indirect := a.taggedValue(ifaceObj) + if indirect { + // TODO(adonovan): we may need to implement this if + // we ever apply invokeConstraints to reflect.Value PTSs, + // e.g. for (reflect.Value).Call. + panic("indirect tagged object") + } + + // Look up the concrete method. + fn := a.prog.LookupMethod(tDyn, c.method.Pkg(), c.method.Name()) + if fn == nil { + panic(fmt.Sprintf("n%d: no ssa.Function for %s", c.iface, c.method)) + } + sig := fn.Signature + + fnObj := a.globalobj[fn] // dynamic calls use shared contour + if fnObj == 0 { + // a.objectNode(fn) was not called during gen phase. + panic(fmt.Sprintf("a.globalobj[%s]==nil", fn)) + } + + // Make callsite's fn variable point to identity of + // concrete method. (There's no need to add it to + // worklist since it never has attached constraints.) + a.addLabel(c.params, fnObj) + + // Extract value and connect to method's receiver. + // Copy payload to method's receiver param (arg0). + arg0 := a.funcParams(fnObj) + recvSize := a.sizeof(sig.Recv().Type()) + a.onlineCopyN(arg0, v, recvSize) + + src := c.params + 1 // skip past identity + dst := arg0 + nodeid(recvSize) + + // Copy caller's argument block to method formal parameters. + paramsSize := a.sizeof(sig.Params()) + a.onlineCopyN(dst, src, paramsSize) + src += nodeid(paramsSize) + dst += nodeid(paramsSize) + + // Copy method results to caller's result block. + resultsSize := a.sizeof(sig.Results()) + a.onlineCopyN(src, dst, resultsSize) + } +} + +func (c *addrConstraint) solve(a *analysis, delta *nodeset) { + panic("addr is not a complex constraint") +} + +func (c *copyConstraint) solve(a *analysis, delta *nodeset) { + panic("copy is not a complex constraint") +} diff --git a/vendor/golang.org/x/tools/go/pointer/solve14.go b/vendor/golang.org/x/tools/go/pointer/solve14.go new file mode 100644 index 0000000000..25b52dbedf --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/solve14.go @@ -0,0 +1,373 @@ +// Copyright 2013 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.5 + +package pointer + +// This file defines a naive Andersen-style solver for the inclusion +// constraint system. + +import ( + "fmt" + + "golang.org/x/tools/go/types" +) + +type solverState struct { + complex []constraint // complex constraints attached to this node + copyTo nodeset // simple copy constraint edges + pts nodeset // points-to set of this node + prevPTS nodeset // pts(n) in previous iteration (for difference propagation) +} + +func (a *analysis) solve() { + start("Solving") + if a.log != nil { + fmt.Fprintf(a.log, "\n\n==== Solving constraints\n\n") + } + + // Solver main loop. + var delta nodeset + for { + // Add new constraints to the graph: + // static constraints from SSA on round 1, + // dynamic constraints from reflection thereafter. + a.processNewConstraints() + + var x int + if !a.work.TakeMin(&x) { + break // empty + } + id := nodeid(x) + if a.log != nil { + fmt.Fprintf(a.log, "\tnode n%d\n", id) + } + + n := a.nodes[id] + + // Difference propagation. + delta.Difference(&n.solve.pts.Sparse, &n.solve.prevPTS.Sparse) + if delta.IsEmpty() { + continue + } + if a.log != nil { + fmt.Fprintf(a.log, "\t\tpts(n%d : %s) = %s + %s\n", + id, n.typ, &delta, &n.solve.prevPTS) + } + n.solve.prevPTS.Copy(&n.solve.pts.Sparse) + + // Apply all resolution rules attached to n. + a.solveConstraints(n, &delta) + + if a.log != nil { + fmt.Fprintf(a.log, "\t\tpts(n%d) = %s\n", id, &n.solve.pts) + } + } + + if !a.nodes[0].solve.pts.IsEmpty() { + panic(fmt.Sprintf("pts(0) is nonempty: %s", &a.nodes[0].solve.pts)) + } + + // Release working state (but keep final PTS). + for _, n := range a.nodes { + n.solve.complex = nil + n.solve.copyTo.Clear() + n.solve.prevPTS.Clear() + } + + if a.log != nil { + fmt.Fprintf(a.log, "Solver done\n") + + // Dump solution. + for i, n := range a.nodes { + if !n.solve.pts.IsEmpty() { + fmt.Fprintf(a.log, "pts(n%d) = %s : %s\n", i, &n.solve.pts, n.typ) + } + } + } + stop("Solving") +} + +// processNewConstraints takes the new constraints from a.constraints +// and adds them to the graph, ensuring +// that new constraints are applied to pre-existing labels and +// that pre-existing constraints are applied to new labels. +// +func (a *analysis) processNewConstraints() { + // Take the slice of new constraints. + // (May grow during call to solveConstraints.) + constraints := a.constraints + a.constraints = nil + + // Initialize points-to sets from addr-of (base) constraints. + for _, c := range constraints { + if c, ok := c.(*addrConstraint); ok { + dst := a.nodes[c.dst] + dst.solve.pts.add(c.src) + + // Populate the worklist with nodes that point to + // something initially (due to addrConstraints) and + // have other constraints attached. + // (A no-op in round 1.) + if !dst.solve.copyTo.IsEmpty() || len(dst.solve.complex) > 0 { + a.addWork(c.dst) + } + } + } + + // Attach simple (copy) and complex constraints to nodes. + var stale nodeset + for _, c := range constraints { + var id nodeid + switch c := c.(type) { + case *addrConstraint: + // base constraints handled in previous loop + continue + case *copyConstraint: + // simple (copy) constraint + id = c.src + a.nodes[id].solve.copyTo.add(c.dst) + default: + // complex constraint + id = c.ptr() + solve := a.nodes[id].solve + solve.complex = append(solve.complex, c) + } + + if n := a.nodes[id]; !n.solve.pts.IsEmpty() { + if !n.solve.prevPTS.IsEmpty() { + stale.add(id) + } + a.addWork(id) + } + } + // Apply new constraints to pre-existing PTS labels. + var space [50]int + for _, id := range stale.AppendTo(space[:0]) { + n := a.nodes[nodeid(id)] + a.solveConstraints(n, &n.solve.prevPTS) + } +} + +// solveConstraints applies each resolution rule attached to node n to +// the set of labels delta. It may generate new constraints in +// a.constraints. +// +func (a *analysis) solveConstraints(n *node, delta *nodeset) { + if delta.IsEmpty() { + return + } + + // Process complex constraints dependent on n. + for _, c := range n.solve.complex { + if a.log != nil { + fmt.Fprintf(a.log, "\t\tconstraint %s\n", c) + } + c.solve(a, delta) + } + + // Process copy constraints. + var copySeen nodeset + for _, x := range n.solve.copyTo.AppendTo(a.deltaSpace) { + mid := nodeid(x) + if copySeen.add(mid) { + if a.nodes[mid].solve.pts.addAll(delta) { + a.addWork(mid) + } + } + } +} + +// addLabel adds label to the points-to set of ptr and reports whether the set grew. +func (a *analysis) addLabel(ptr, label nodeid) bool { + b := a.nodes[ptr].solve.pts.add(label) + if b && a.log != nil { + fmt.Fprintf(a.log, "\t\tpts(n%d) += n%d\n", ptr, label) + } + return b +} + +func (a *analysis) addWork(id nodeid) { + a.work.Insert(int(id)) + if a.log != nil { + fmt.Fprintf(a.log, "\t\twork: n%d\n", id) + } +} + +// onlineCopy adds a copy edge. It is called online, i.e. during +// solving, so it adds edges and pts members directly rather than by +// instantiating a 'constraint'. +// +// The size of the copy is implicitly 1. +// It returns true if pts(dst) changed. +// +func (a *analysis) onlineCopy(dst, src nodeid) bool { + if dst != src { + if nsrc := a.nodes[src]; nsrc.solve.copyTo.add(dst) { + if a.log != nil { + fmt.Fprintf(a.log, "\t\t\tdynamic copy n%d <- n%d\n", dst, src) + } + // TODO(adonovan): most calls to onlineCopy + // are followed by addWork, possibly batched + // via a 'changed' flag; see if there's a + // noticeable penalty to calling addWork here. + return a.nodes[dst].solve.pts.addAll(&nsrc.solve.pts) + } + } + return false +} + +// Returns sizeof. +// Implicitly adds nodes to worklist. +// +// TODO(adonovan): now that we support a.copy() during solving, we +// could eliminate onlineCopyN, but it's much slower. Investigate. +// +func (a *analysis) onlineCopyN(dst, src nodeid, sizeof uint32) uint32 { + for i := uint32(0); i < sizeof; i++ { + if a.onlineCopy(dst, src) { + a.addWork(dst) + } + src++ + dst++ + } + return sizeof +} + +func (c *loadConstraint) solve(a *analysis, delta *nodeset) { + var changed bool + for _, x := range delta.AppendTo(a.deltaSpace) { + k := nodeid(x) + koff := k + nodeid(c.offset) + if a.onlineCopy(c.dst, koff) { + changed = true + } + } + if changed { + a.addWork(c.dst) + } +} + +func (c *storeConstraint) solve(a *analysis, delta *nodeset) { + for _, x := range delta.AppendTo(a.deltaSpace) { + k := nodeid(x) + koff := k + nodeid(c.offset) + if a.onlineCopy(koff, c.src) { + a.addWork(koff) + } + } +} + +func (c *offsetAddrConstraint) solve(a *analysis, delta *nodeset) { + dst := a.nodes[c.dst] + for _, x := range delta.AppendTo(a.deltaSpace) { + k := nodeid(x) + if dst.solve.pts.add(k + nodeid(c.offset)) { + a.addWork(c.dst) + } + } +} + +func (c *typeFilterConstraint) solve(a *analysis, delta *nodeset) { + for _, x := range delta.AppendTo(a.deltaSpace) { + ifaceObj := nodeid(x) + tDyn, _, indirect := a.taggedValue(ifaceObj) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + if types.AssignableTo(tDyn, c.typ) { + if a.addLabel(c.dst, ifaceObj) { + a.addWork(c.dst) + } + } + } +} + +func (c *untagConstraint) solve(a *analysis, delta *nodeset) { + predicate := types.AssignableTo + if c.exact { + predicate = types.Identical + } + for _, x := range delta.AppendTo(a.deltaSpace) { + ifaceObj := nodeid(x) + tDyn, v, indirect := a.taggedValue(ifaceObj) + if indirect { + // TODO(adonovan): we'll need to implement this + // when we start creating indirect tagged objects. + panic("indirect tagged object") + } + + if predicate(tDyn, c.typ) { + // Copy payload sans tag to dst. + // + // TODO(adonovan): opt: if tDyn is + // nonpointerlike we can skip this entire + // constraint, perhaps. We only care about + // pointers among the fields. + a.onlineCopyN(c.dst, v, a.sizeof(tDyn)) + } + } +} + +func (c *invokeConstraint) solve(a *analysis, delta *nodeset) { + for _, x := range delta.AppendTo(a.deltaSpace) { + ifaceObj := nodeid(x) + tDyn, v, indirect := a.taggedValue(ifaceObj) + if indirect { + // TODO(adonovan): we may need to implement this if + // we ever apply invokeConstraints to reflect.Value PTSs, + // e.g. for (reflect.Value).Call. + panic("indirect tagged object") + } + + // Look up the concrete method. + fn := a.prog.LookupMethod(tDyn, c.method.Pkg(), c.method.Name()) + if fn == nil { + panic(fmt.Sprintf("n%d: no ssa.Function for %s", c.iface, c.method)) + } + sig := fn.Signature + + fnObj := a.globalobj[fn] // dynamic calls use shared contour + if fnObj == 0 { + // a.objectNode(fn) was not called during gen phase. + panic(fmt.Sprintf("a.globalobj[%s]==nil", fn)) + } + + // Make callsite's fn variable point to identity of + // concrete method. (There's no need to add it to + // worklist since it never has attached constraints.) + a.addLabel(c.params, fnObj) + + // Extract value and connect to method's receiver. + // Copy payload to method's receiver param (arg0). + arg0 := a.funcParams(fnObj) + recvSize := a.sizeof(sig.Recv().Type()) + a.onlineCopyN(arg0, v, recvSize) + + src := c.params + 1 // skip past identity + dst := arg0 + nodeid(recvSize) + + // Copy caller's argument block to method formal parameters. + paramsSize := a.sizeof(sig.Params()) + a.onlineCopyN(dst, src, paramsSize) + src += nodeid(paramsSize) + dst += nodeid(paramsSize) + + // Copy method results to caller's result block. + resultsSize := a.sizeof(sig.Results()) + a.onlineCopyN(src, dst, resultsSize) + } +} + +func (c *addrConstraint) solve(a *analysis, delta *nodeset) { + panic("addr is not a complex constraint") +} + +func (c *copyConstraint) solve(a *analysis, delta *nodeset) { + panic("copy is not a complex constraint") +} diff --git a/vendor/golang.org/x/tools/go/pointer/stdlib_test.go b/vendor/golang.org/x/tools/go/pointer/stdlib_test.go new file mode 100644 index 0000000000..d3d14ea333 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/stdlib_test.go @@ -0,0 +1,109 @@ +// 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. + +// Incomplete source tree on Android. + +// +build !android + +package pointer + +// This file runs the pointer analysis on all packages and tests beneath +// $GOROOT. It provides a "smoke test" that the analysis doesn't crash +// on a large input, and a benchmark for performance measurement. +// +// Because it is relatively slow, the --stdlib flag must be enabled for +// this test to run: +// % go test -v golang.org/x/tools/go/pointer --stdlib + +import ( + "flag" + "go/build" + "go/token" + "testing" + "time" + + "golang.org/x/tools/go/buildutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +var runStdlibTest = flag.Bool("stdlib", false, "Run the (slow) stdlib test") + +func TestStdlib(t *testing.T) { + if !*runStdlibTest { + t.Skip("skipping (slow) stdlib test (use --stdlib)") + } + + // Load, parse and type-check the program. + ctxt := build.Default // copy + ctxt.GOPATH = "" // disable GOPATH + conf := loader.Config{Build: &ctxt} + if _, err := conf.FromArgs(buildutil.AllPackages(conf.Build), true); err != nil { + t.Errorf("FromArgs failed: %v", err) + return + } + + iprog, err := conf.Load() + if err != nil { + t.Fatalf("Load failed: %v", err) + } + + // Create SSA packages. + prog := ssautil.CreateProgram(iprog, 0) + prog.Build() + + numPkgs := len(prog.AllPackages()) + if want := 240; numPkgs < want { + t.Errorf("Loaded only %d packages, want at least %d", numPkgs, want) + } + + // Determine the set of packages/tests to analyze. + var testPkgs []*ssa.Package + for _, info := range iprog.InitialPackages() { + testPkgs = append(testPkgs, prog.Package(info.Pkg)) + } + testmain := prog.CreateTestMainPackage(testPkgs...) + if testmain == nil { + t.Fatal("analysis scope has tests") + } + + // Run the analysis. + config := &Config{ + Reflection: false, // TODO(adonovan): fix remaining bug in rVCallConstraint, then enable. + BuildCallGraph: true, + Mains: []*ssa.Package{testmain}, + } + // TODO(adonovan): add some query values (affects track bits). + + t0 := time.Now() + + result, err := Analyze(config) + if err != nil { + t.Fatal(err) // internal error in pointer analysis + } + _ = result // TODO(adonovan): measure something + + t1 := time.Now() + + // Dump some statistics. + allFuncs := ssautil.AllFunctions(prog) + var numInstrs int + for fn := range allFuncs { + for _, b := range fn.Blocks { + numInstrs += len(b.Instrs) + } + } + + // determine line count + var lineCount int + prog.Fset.Iterate(func(f *token.File) bool { + lineCount += f.LineCount() + return true + }) + + t.Log("#Source lines: ", lineCount) + t.Log("#Instructions: ", numInstrs) + t.Log("Pointer analysis: ", t1.Sub(t0)) +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/a_test.go b/vendor/golang.org/x/tools/go/pointer/testdata/a_test.go new file mode 100644 index 0000000000..3baa9ac7ef --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/a_test.go @@ -0,0 +1,42 @@ +// +build ignore + +package a + +// This test exercises the synthesis of testmain packages for tests. +// The test framework doesn't directly let us perform negative +// assertions (i.e. that TestingQuux isn't called, or that its +// parameter's PTS is empty) so this test is rather roundabout. + +import "testing" + +func log(f func(*testing.T)) { + // The PTS of f is the set of called tests. TestingQuux is not present. + print(f) // @pointsto main.Test | main.TestFoo +} + +func Test(t *testing.T) { + // Don't assert @pointsto(t) since its label contains a fragile line number. + log(Test) +} + +func TestFoo(t *testing.T) { + // Don't assert @pointsto(t) since its label contains a fragile line number. + log(TestFoo) +} + +func TestingQuux(t *testing.T) { + // We can't assert @pointsto(t) since this is dead code. + log(TestingQuux) +} + +func BenchmarkFoo(b *testing.B) { +} + +func ExampleBar() { +} + +// Excludes TestingQuux. +// @calls testing.tRunner -> main.Test +// @calls testing.tRunner -> main.TestFoo +// @calls testing.runExample -> main.ExampleBar +// @calls (*testing.B).runN -> main.BenchmarkFoo diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/another.go b/vendor/golang.org/x/tools/go/pointer/testdata/another.go new file mode 100644 index 0000000000..12ed690e99 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/another.go @@ -0,0 +1,36 @@ +// +build ignore + +package main + +var unknown bool + +type S string + +func incr(x int) int { return x + 1 } + +func main() { + var i interface{} + i = 1 + if unknown { + i = S("foo") + } + if unknown { + i = (func(int, int))(nil) // NB type compares equal to that below. + } + // Look, the test harness can handle equal-but-not-String-equal + // types because we parse types and using a typemap. + if unknown { + i = (func(x int, y int))(nil) + } + if unknown { + i = incr + } + print(i) // @types int | S | func(int, int) | func(int) int + + // NB, an interface may never directly alias any global + // labels, even though it may contain pointers that do. + print(i) // @pointsto makeinterface:func(x int) int | makeinterface:func(x int, y int) | makeinterface:func(int, int) | makeinterface:int | makeinterface:main.S + print(i.(func(int) int)) // @pointsto main.incr + + print() // regression test for crash +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/arrayreflect.go b/vendor/golang.org/x/tools/go/pointer/testdata/arrayreflect.go new file mode 100644 index 0000000000..2b2367409c --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/arrayreflect.go @@ -0,0 +1,191 @@ +// +build ignore + +package main + +// Test of arrays & slices with reflection. + +import "reflect" + +var a, b int + +type S string + +func reflectValueSlice() { + // reflect.Value contains a slice. + slice := make([]*int, 10) // @line slice + slice[0] = &a + rvsl := reflect.ValueOf(slice).Slice(0, 0) + print(rvsl.Interface()) // @types []*int + print(rvsl.Interface().([]*int)) // @pointsto makeslice@slice:15 + print(rvsl.Interface().([]*int)[42]) // @pointsto main.a + + // reflect.Value contains an array (non-addressable). + array := [10]*int{&a} // @line array + rvarray := reflect.ValueOf(array).Slice(0, 0) + print(rvarray.Interface()) // @types + print(rvarray.Interface().([]*int)) // @pointsto + print(rvarray.Interface().([]*int)[42]) // @pointsto + + // reflect.Value contains a pointer-to-array + rvparray := reflect.ValueOf(&array).Slice(0, 0) + print(rvparray.Interface()) // @types []*int + print(rvparray.Interface().([]*int)) // @pointsto array@array:2 + print(rvparray.Interface().([]*int)[42]) // @pointsto main.a + + // reflect.Value contains a string. + rvstring := reflect.ValueOf("hi").Slice(0, 0) + print(rvstring.Interface()) // @types string + + // reflect.Value contains a (named) string type. + rvS := reflect.ValueOf(S("hi")).Slice(0, 0) + print(rvS.Interface()) // @types S + + // reflect.Value contains a non-array pointer. + rvptr := reflect.ValueOf(new(int)).Slice(0, 0) + print(rvptr.Interface()) // @types + + // reflect.Value contains a non-string basic type. + rvint := reflect.ValueOf(3).Slice(0, 0) + print(rvint.Interface()) // @types +} + +func reflectValueBytes() { + sl1 := make([]byte, 0) // @line ar5sl1 + sl2 := make([]byte, 0) // @line ar5sl2 + + rvsl1 := reflect.ValueOf(sl1) + print(rvsl1.Interface()) // @types []byte + print(rvsl1.Interface().([]byte)) // @pointsto makeslice@ar5sl1:13 + print(rvsl1.Bytes()) // @pointsto makeslice@ar5sl1:13 + + rvsl2 := reflect.ValueOf(123) + rvsl2.SetBytes(sl2) + print(rvsl2.Interface()) // @types int + print(rvsl2.Interface().([]byte)) // @pointsto + print(rvsl2.Bytes()) // @pointsto + + rvsl3 := reflect.ValueOf([]byte(nil)) + rvsl3.SetBytes(sl2) + print(rvsl3.Interface()) // @types []byte + print(rvsl3.Interface().([]byte)) // @pointsto makeslice@ar5sl2:13 + print(rvsl3.Bytes()) // @pointsto makeslice@ar5sl2:13 +} + +func reflectValueIndex() { + slice := []*int{&a} // @line ar6slice + rv1 := reflect.ValueOf(slice) + print(rv1.Index(42).Interface()) // @types *int + print(rv1.Index(42).Interface().(*int)) // @pointsto main.a + + array := [10]*int{&a} + rv2 := reflect.ValueOf(array) + print(rv2.Index(42).Interface()) // @types *int + print(rv2.Index(42).Interface().(*int)) // @pointsto main.a + + rv3 := reflect.ValueOf("string") + print(rv3.Index(42).Interface()) // @types rune + + rv4 := reflect.ValueOf(&array) + print(rv4.Index(42).Interface()) // @types + + rv5 := reflect.ValueOf(3) + print(rv5.Index(42).Interface()) // @types +} + +func reflectValueElem() { + // Interface. + var iface interface{} = &a + rv1 := reflect.ValueOf(&iface).Elem() + print(rv1.Interface()) // @types *int + print(rv1.Interface().(*int)) // @pointsto main.a + print(rv1.Elem().Interface()) // @types *int + print(rv1.Elem().Interface().(*int)) // @pointsto main.a + + print(reflect.ValueOf(new(interface{})).Elem().Elem()) // @types + + // Pointer. + ptr := &a + rv2 := reflect.ValueOf(&ptr) + print(rv2.Elem().Interface()) // @types *int + print(rv2.Elem().Interface().(*int)) // @pointsto main.a + + // No other type works with (rV).Elem, not even those that + // work with (rT).Elem: slice, array, map, chan. + + rv3 := reflect.ValueOf([]*int{&a}) + print(rv3.Elem().Interface()) // @types + + rv4 := reflect.ValueOf([10]*int{&a}) + print(rv4.Elem().Interface()) // @types + + rv5 := reflect.ValueOf(map[*int]*int{&a: &b}) + print(rv5.Elem().Interface()) // @types + + ch := make(chan *int) + ch <- &a + rv6 := reflect.ValueOf(ch) + print(rv6.Elem().Interface()) // @types + + rv7 := reflect.ValueOf(3) + print(rv7.Elem().Interface()) // @types +} + +func reflectTypeElem() { + rt1 := reflect.TypeOf(make([]*int, 0)) + print(reflect.Zero(rt1.Elem())) // @types *int + + rt2 := reflect.TypeOf([10]*int{}) + print(reflect.Zero(rt2.Elem())) // @types *int + + rt3 := reflect.TypeOf(map[*int]*int{}) + print(reflect.Zero(rt3.Elem())) // @types *int + + rt4 := reflect.TypeOf(make(chan *int)) + print(reflect.Zero(rt4.Elem())) // @types *int + + ptr := &a + rt5 := reflect.TypeOf(&ptr) + print(reflect.Zero(rt5.Elem())) // @types *int + + rt6 := reflect.TypeOf(3) + print(reflect.Zero(rt6.Elem())) // @types +} + +func reflectPtrTo() { + tInt := reflect.TypeOf(3) + tPtrInt := reflect.PtrTo(tInt) + print(reflect.Zero(tPtrInt)) // @types *int + tPtrPtrInt := reflect.PtrTo(tPtrInt) + print(reflect.Zero(tPtrPtrInt)) // @types **int +} + +func reflectSliceOf() { + tInt := reflect.TypeOf(3) + tSliceInt := reflect.SliceOf(tInt) + print(reflect.Zero(tSliceInt)) // @types []int +} + +type T struct{ x int } + +func reflectMakeSlice() { + rt := []reflect.Type{ + reflect.TypeOf(3), + reflect.TypeOf([]int{}), + reflect.TypeOf([]T{}), + }[0] + sl := reflect.MakeSlice(rt, 0, 0) + print(sl) // @types []int | []T + print(sl) // @pointsto | + print(&sl.Interface().([]T)[0].x) // @pointsto [*].x +} + +func main() { + reflectValueSlice() + reflectValueBytes() + reflectValueIndex() + reflectValueElem() + reflectTypeElem() + reflectPtrTo() + reflectSliceOf() + reflectMakeSlice() +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/arrays.go b/vendor/golang.org/x/tools/go/pointer/testdata/arrays.go new file mode 100644 index 0000000000..e57a15b4be --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/arrays.go @@ -0,0 +1,97 @@ +// +build ignore + +package main + +var unknown bool // defeat dead-code elimination + +var a, b int + +func array1() { + sliceA := make([]*int, 10) // @line a1make + sliceA[0] = &a + + var sliceB []*int + sliceB = append(sliceB, &b) // @line a1append + + print(sliceA) // @pointsto makeslice@a1make:16 + print(sliceA[0]) // @pointsto main.a + + print(sliceB) // @pointsto append@a1append:17 + print(sliceB[100]) // @pointsto main.b +} + +func array2() { + sliceA := make([]*int, 10) // @line a2make + sliceA[0] = &a + + sliceB := sliceA[:] + + print(sliceA) // @pointsto makeslice@a2make:16 + print(sliceA[0]) // @pointsto main.a + + print(sliceB) // @pointsto makeslice@a2make:16 + print(sliceB[0]) // @pointsto main.a +} + +func array3() { + a := []interface{}{"", 1} + b := []interface{}{true, func() {}} + print(a[0]) // @types string | int + print(b[0]) // @types bool | func() +} + +// Test of append, copy, slice. +func array4() { + var s2 struct { // @line a4L0 + a [3]int + b struct{ c, d int } + } + var sl1 = make([]*int, 10) // @line a4make + var someint int // @line a4L1 + sl1[1] = &someint + sl2 := append(sl1, &s2.a[1]) // @line a4append1 + print(sl1) // @pointsto makeslice@a4make:16 + print(sl2) // @pointsto append@a4append1:15 | makeslice@a4make:16 + print(sl1[0]) // @pointsto someint@a4L1:6 | s2.a[*]@a4L0:6 + print(sl2[0]) // @pointsto someint@a4L1:6 | s2.a[*]@a4L0:6 + + // In z=append(x,y) we should observe flow from y[*] to x[*]. + var sl3 = make([]*int, 10) // @line a4L2 + _ = append(sl3, &s2.a[1]) + print(sl3) // @pointsto makeslice@a4L2:16 + print(sl3[0]) // @pointsto s2.a[*]@a4L0:6 + + var sl4 = []*int{&a} // @line a4L3 + sl4a := append(sl4) // @line a4L4 + print(sl4a) // @pointsto slicelit@a4L3:18 | append@a4L4:16 + print(&sl4a[0]) // @pointsto slicelit[*]@a4L3:18 | append[*]@a4L4:16 + print(sl4a[0]) // @pointsto main.a + + var sl5 = []*int{&b} // @line a4L5 + copy(sl5, sl4) + print(sl5) // @pointsto slicelit@a4L5:18 + print(&sl5[0]) // @pointsto slicelit[*]@a4L5:18 + print(sl5[0]) // @pointsto main.b | main.a + + var sl6 = sl5[:0] + print(sl6) // @pointsto slicelit@a4L5:18 + print(&sl6[0]) // @pointsto slicelit[*]@a4L5:18 + print(sl6[0]) // @pointsto main.b | main.a +} + +func array5() { + var arr [2]*int + arr[0] = &a + arr[1] = &b + + var n int + print(arr[n]) // @pointsto main.a | main.b +} + +func main() { + array1() + array2() + array3() + array4() + array5() +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/channels.go b/vendor/golang.org/x/tools/go/pointer/testdata/channels.go new file mode 100644 index 0000000000..76eb5f8c10 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/channels.go @@ -0,0 +1,118 @@ +// +build ignore + +package main + +func incr(x int) int { return x + 1 } + +func decr(x int) int { return x - 1 } + +var unknown bool // defeat dead-code elimination + +func chan1() { + chA := make(chan func(int) int, 0) // @line c1makeA + chB := make(chan func(int) int, 0) // @line c1makeB + chA <- incr + chB <- decr + chB <- func(int) int { return 1 } + + print(chA) // @pointsto makechan@c1makeA:13 + print(<-chA) // @pointsto main.incr + + print(chB) // @pointsto makechan@c1makeB:13 + print(<-chB) // @pointsto main.decr | main.chan1$1 +} + +func chan2() { + chA := make(chan func(int) int, 0) // @line c2makeA + chB := make(chan func(int) int, 0) // @line c2makeB + chA <- incr + chB <- decr + chB <- func(int) int { return 1 } + + // Channels flow together. + // Labelsets remain distinct but elements are merged. + chAB := chA + if unknown { + chAB = chB + } + + print(chA) // @pointsto makechan@c2makeA:13 + print(<-chA) // @pointsto main.incr + + print(chB) // @pointsto makechan@c2makeB:13 + print(<-chB) // @pointsto main.decr | main.chan2$1 + + print(chAB) // @pointsto makechan@c2makeA:13 | makechan@c2makeB:13 + print(<-chAB) // @pointsto main.incr | main.decr | main.chan2$1 + + (<-chA)(3) +} + +// @calls main.chan2 -> main.incr + +func chan3() { + chA := make(chan func(int) int, 0) // @line c3makeA + chB := make(chan func(int) int, 0) // @line c3makeB + chA <- incr + chB <- decr + chB <- func(int) int { return 1 } + print(chA) // @pointsto makechan@c3makeA:13 + print(<-chA) // @pointsto main.incr + print(chB) // @pointsto makechan@c3makeB:13 + print(<-chB) // @pointsto main.decr | main.chan3$1 + + (<-chA)(3) +} + +// @calls main.chan3 -> main.incr + +func chan4() { + chA := make(chan func(int) int, 0) // @line c4makeA + chB := make(chan func(int) int, 0) // @line c4makeB + + select { + case chA <- incr: + case chB <- decr: + case a := <-chA: + print(a) // @pointsto main.incr + case b := <-chB: + print(b) // @pointsto main.decr + default: + print(chA) // @pointsto makechan@c4makeA:13 + print(chB) // @pointsto makechan@c4makeB:13 + } + + for k := range chA { + print(k) // @pointsto main.incr + } + // Exercise constraint generation (regtest for a crash). + for _ = range chA { + } +} + +// Multi-word channel value in select with multiple receive cases. +// (Regtest for a crash.) +func chan5() { + type T struct { + x *int + y interface{} + } + ch := make(chan T) + ch <- T{new(int), incr} // @line ch5new + select { + case a := <-ch: + print(a.x) // @pointsto new@ch5new:13 + print(a.y) // @types func(x int) int + case b := <-ch: + print(b.x) // @pointsto new@ch5new:13 + print(b.y) // @types func(x int) int + } +} + +func main() { + chan1() + chan2() + chan3() + chan4() + chan5() +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/chanreflect.go b/vendor/golang.org/x/tools/go/pointer/testdata/chanreflect.go new file mode 100644 index 0000000000..7d22efeb6c --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/chanreflect.go @@ -0,0 +1,85 @@ +// +build ignore + +package main + +import "reflect" + +// Test of channels with reflection. + +var a, b int + +func chanreflect1() { + ch := make(chan *int, 0) // @line cr1make + crv := reflect.ValueOf(ch) + crv.Send(reflect.ValueOf(&a)) + print(crv.Interface()) // @types chan *int + print(crv.Interface().(chan *int)) // @pointsto makechan@cr1make:12 + print(<-ch) // @pointsto main.a +} + +func chanreflect1i() { + // Exercises reflect.Value conversions to/from interfaces: + // a different code path than for concrete types. + ch := make(chan interface{}, 0) + reflect.ValueOf(ch).Send(reflect.ValueOf(&a)) + v := <-ch + print(v) // @types *int + print(v.(*int)) // @pointsto main.a +} + +func chanreflect2() { + ch := make(chan *int, 0) + ch <- &b + crv := reflect.ValueOf(ch) + r, _ := crv.Recv() + print(r.Interface()) // @types *int + print(r.Interface().(*int)) // @pointsto main.b +} + +func chanOfRecv() { + // MakeChan(<-chan) is a no-op. + t := reflect.ChanOf(reflect.RecvDir, reflect.TypeOf(&a)) + print(reflect.Zero(t).Interface()) // @types <-chan *int + print(reflect.MakeChan(t, 0).Interface().(<-chan *int)) // @pointsto + print(reflect.MakeChan(t, 0).Interface().(chan *int)) // @pointsto +} + +func chanOfSend() { + // MakeChan(chan<-) is a no-op. + t := reflect.ChanOf(reflect.SendDir, reflect.TypeOf(&a)) + print(reflect.Zero(t).Interface()) // @types chan<- *int + print(reflect.MakeChan(t, 0).Interface().(chan<- *int)) // @pointsto + print(reflect.MakeChan(t, 0).Interface().(chan *int)) // @pointsto +} + +func chanOfBoth() { + t := reflect.ChanOf(reflect.BothDir, reflect.TypeOf(&a)) + print(reflect.Zero(t).Interface()) // @types chan *int + ch := reflect.MakeChan(t, 0) + print(ch.Interface().(chan *int)) // @pointsto + ch.Send(reflect.ValueOf(&b)) + ch.Interface().(chan *int) <- &a + r, _ := ch.Recv() + print(r.Interface().(*int)) // @pointsto main.a | main.b + print(<-ch.Interface().(chan *int)) // @pointsto main.a | main.b +} + +var unknownDir reflect.ChanDir // not a constant + +func chanOfUnknown() { + // Unknown channel direction: assume all three. + // MakeChan only works on the bi-di channel type. + t := reflect.ChanOf(unknownDir, reflect.TypeOf(&a)) + print(reflect.Zero(t).Interface()) // @types <-chan *int | chan<- *int | chan *int + print(reflect.MakeChan(t, 0).Interface()) // @types chan *int +} + +func main() { + chanreflect1() + chanreflect1i() + chanreflect2() + chanOfRecv() + chanOfSend() + chanOfBoth() + chanOfUnknown() +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/chanreflect1.go b/vendor/golang.org/x/tools/go/pointer/testdata/chanreflect1.go new file mode 100644 index 0000000000..c5e2587433 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/chanreflect1.go @@ -0,0 +1,35 @@ +// +build ignore + +package main + +import "reflect" + +// +// This test is very sensitive to line-number perturbations! + +// Test of channels with reflection. + +var a, b int + +func chanreflect1() { + ch := make(chan *int, 0) + crv := reflect.ValueOf(ch) + crv.Send(reflect.ValueOf(&a)) + print(crv.Interface()) // @types chan *int + print(crv.Interface().(chan *int)) // @pointsto makechan@testdata/chanreflect.go:15:12 + print(<-ch) // @pointsto main.a +} + +func chanreflect2() { + ch := make(chan *int, 0) + ch <- &b + crv := reflect.ValueOf(ch) + r, _ := crv.Recv() + print(r.Interface()) // @types *int + print(r.Interface().(*int)) // @pointsto main.b +} + +func main() { + chanreflect1() + chanreflect2() +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/context.go b/vendor/golang.org/x/tools/go/pointer/testdata/context.go new file mode 100644 index 0000000000..ed616e7eca --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/context.go @@ -0,0 +1,48 @@ +// +build ignore + +package main + +// Test of context-sensitive treatment of certain function calls, +// e.g. static calls to simple accessor methods. + +var a, b int + +type T struct{ x *int } + +func (t *T) SetX(x *int) { t.x = x } +func (t *T) GetX() *int { return t.x } + +func context1() { + var t1, t2 T + t1.SetX(&a) + t2.SetX(&b) + print(t1.GetX()) // @pointsto main.a + print(t2.GetX()) // @pointsto main.b +} + +func context2() { + id := func(x *int) *int { + print(x) // @pointsto main.a | main.b + return x + } + print(id(&a)) // @pointsto main.a + print(id(&b)) // @pointsto main.b + + // Same again, but anon func has free vars. + var c int // @line context2c + id2 := func(x *int) (*int, *int) { + print(x) // @pointsto main.a | main.b + return x, &c + } + p, q := id2(&a) + print(p) // @pointsto main.a + print(q) // @pointsto c@context2c:6 + r, s := id2(&b) + print(r) // @pointsto main.b + print(s) // @pointsto c@context2c:6 +} + +func main() { + context1() + context2() +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/conv.go b/vendor/golang.org/x/tools/go/pointer/testdata/conv.go new file mode 100644 index 0000000000..692f0ceba6 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/conv.go @@ -0,0 +1,63 @@ +// +build ignore + +package main + +import "unsafe" + +var a int + +func conv1() { + // Conversions of channel direction. + ch := make(chan int) // @line c1make + print((<-chan int)(ch)) // @pointsto makechan@c1make:12 + print((chan<- int)(ch)) // @pointsto makechan@c1make:12 +} + +func conv2() { + // string -> []byte/[]rune conversion + s := "foo" + ba := []byte(s) // @line c2ba + ra := []rune(s) // @line c2ra + print(ba) // @pointsto convert@c2ba:14 + print(ra) // @pointsto convert@c2ra:14 +} + +func conv3() { + // Conversion of same underlying types. + type PI *int + pi := PI(&a) + print(pi) // @pointsto main.a + + pint := (*int)(pi) + print(pint) // @pointsto main.a + + // Conversions between pointers to identical base types. + var y *PI = &pi + var x **int = (**int)(y) + print(*x) // @pointsto main.a + print(*y) // @pointsto main.a + y = (*PI)(x) + print(*y) // @pointsto main.a +} + +func conv4() { + // Handling of unsafe.Pointer conversion is unsound: + // we lose the alias to main.a and get something like new(int) instead. + p := (*int)(unsafe.Pointer(&a)) // @line c2p + print(p) // @pointsto convert@c2p:13 +} + +// Regression test for b/8231. +func conv5() { + type P unsafe.Pointer + var i *struct{} + _ = P(i) +} + +func main() { + conv1() + conv2() + conv3() + conv4() + conv5() +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/finalizer.go b/vendor/golang.org/x/tools/go/pointer/testdata/finalizer.go new file mode 100644 index 0000000000..97f25c9047 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/finalizer.go @@ -0,0 +1,89 @@ +package main + +import "runtime" + +func final1a(x *int) int { + print(x) // @pointsto new@newint:10 + return *x +} + +func final1b(x *bool) { + print(x) // @pointsto +} + +func runtimeSetFinalizer1() { + x := new(int) // @line newint + runtime.SetFinalizer(x, final1a) // ok: final1a's result is ignored + runtime.SetFinalizer(x, final1b) // param type mismatch: no effect +} + +// @calls main.runtimeSetFinalizer1 -> main.final1a +// @calls main.runtimeSetFinalizer1 -> main.final1b + +func final2a(x *bool) { + print(x) // @pointsto new@newbool1:10 | new@newbool2:10 +} + +func final2b(x *bool) { + print(x) // @pointsto new@newbool1:10 | new@newbool2:10 +} + +func runtimeSetFinalizer2() { + x := new(bool) // @line newbool1 + f := final2a + if unknown { + x = new(bool) // @line newbool2 + f = final2b + } + runtime.SetFinalizer(x, f) +} + +// @calls main.runtimeSetFinalizer2 -> main.final2a +// @calls main.runtimeSetFinalizer2 -> main.final2b + +type T int + +func (t *T) finalize() { + print(t) // @pointsto new@final3:10 +} + +func runtimeSetFinalizer3() { + x := new(T) // @line final3 + runtime.SetFinalizer(x, (*T).finalize) +} + +// @calls main.runtimeSetFinalizer3 -> (*main.T).finalize$thunk + +// I hope I never live to see this code in the wild. +var setFinalizer = runtime.SetFinalizer + +func final4(x *int) { + print(x) // @pointsto new@finalIndirect:10 +} + +func runtimeSetFinalizerIndirect() { + // In an indirect call, the shared contour for SetFinalizer is + // used, i.e. the call is not inlined and appears in the call graph. + x := new(int) // @line finalIndirect + setFinalizer(x, final4) +} + +// Exercise the elimination of SetFinalizer +// constraints with non-pointer operands. +func runtimeSetFinalizerNonpointer() { + runtime.SetFinalizer(nil, (*T).finalize) // x is a non-pointer + runtime.SetFinalizer((*T).finalize, nil) // f is a non-pointer +} + +// @calls main.runtimeSetFinalizerIndirect -> runtime.SetFinalizer +// @calls runtime.SetFinalizer -> main.final4 + +func main() { + runtimeSetFinalizer1() + runtimeSetFinalizer2() + runtimeSetFinalizer3() + runtimeSetFinalizerIndirect() + runtimeSetFinalizerNonpointer() +} + +var unknown bool // defeat dead-code elimination diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/flow.go b/vendor/golang.org/x/tools/go/pointer/testdata/flow.go new file mode 100644 index 0000000000..6fb599e8d8 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/flow.go @@ -0,0 +1,63 @@ +// +build ignore + +package main + +// Demonstration of directionality of flow edges. + +func f1() {} +func f2() {} + +var somepred bool + +// Tracking functions. +func flow1() { + s := f1 + p := f2 + q := p + r := q + if somepred { + r = s + } + print(s) // @pointsto main.f1 + print(p) // @pointsto main.f2 + print(q) // @pointsto main.f2 + print(r) // @pointsto main.f1 | main.f2 +} + +// Tracking concrete types in interfaces. +func flow2() { + var s interface{} = 1 + var p interface{} = "foo" + q := p + r := q + if somepred { + r = s + } + print(s) // @types int + print(p) // @types string + print(q) // @types string + print(r) // @types int | string +} + +var g1, g2 int + +// Tracking addresses of globals. +func flow3() { + s := &g1 + p := &g2 + q := p + r := q + if somepred { + r = s + } + print(s) // @pointsto main.g1 + print(p) // @pointsto main.g2 + print(q) // @pointsto main.g2 + print(r) // @pointsto main.g2 | main.g1 +} + +func main() { + flow1() + flow2() + flow3() +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/fmtexcerpt.go b/vendor/golang.org/x/tools/go/pointer/testdata/fmtexcerpt.go new file mode 100644 index 0000000000..ee2a0e76c7 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/fmtexcerpt.go @@ -0,0 +1,42 @@ +// +build ignore + +// This is a slice of the fmt package. + +package main + +type pp struct { + field interface{} +} + +func newPrinter() *pp { + return new(pp) +} + +func Fprintln(a ...interface{}) { + p := newPrinter() + p.doPrint(a, true, true) +} + +func Println(a ...interface{}) { + Fprintln(a...) +} + +func (p *pp) doPrint(a []interface{}, addspace, addnewline bool) { + print(a[0]) // @types S | string + stringer := a[0].(interface { + String() string + }) + + stringer.String() + print(stringer) // @types S +} + +type S int + +func (S) String() string { return "" } + +func main() { + Println("Hello, World!", S(0)) +} + +// @calls (*main.pp).doPrint -> (main.S).String diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/func.go b/vendor/golang.org/x/tools/go/pointer/testdata/func.go new file mode 100644 index 0000000000..2155f8ef71 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/func.go @@ -0,0 +1,205 @@ +// +build ignore + +package main + +var a, b, c int + +var unknown bool // defeat dead-code elimination + +func func1() { + var h int // @line f1h + f := func(x *int) *int { + if unknown { + return &b + } + return x + } + + // FV(g) = {f, h} + g := func(x *int) *int { + if unknown { + return &h + } + return f(x) + } + + print(g(&a)) // @pointsto main.a | main.b | h@f1h:6 + print(f(&a)) // @pointsto main.a | main.b + print(&a) // @pointsto main.a +} + +// @calls main.func1 -> main.func1$2 +// @calls main.func1 -> main.func1$1 +// @calls main.func1$2 -> main.func1$1 + +func func2() { + var x, y *int + defer func() { + x = &a + }() + go func() { + y = &b + }() + print(x) // @pointsto main.a + print(y) // @pointsto main.b +} + +func func3() { + x, y := func() (x, y *int) { + x = &a + y = &b + if unknown { + return nil, &c + } + return + }() + print(x) // @pointsto main.a + print(y) // @pointsto main.b | main.c +} + +func swap(x, y *int) (*int, *int) { // @line swap + print(&x) // @pointsto x@swap:11 + print(x) // @pointsto makeslice[*]@func4make:11 + print(&y) // @pointsto y@swap:14 + print(y) // @pointsto j@f4j:5 + return y, x +} + +func func4() { + a := make([]int, 10) // @line func4make + i, j := 123, 456 // @line f4j + _ = i + p, q := swap(&a[3], &j) + print(p) // @pointsto j@f4j:5 + print(q) // @pointsto makeslice[*]@func4make:11 + + f := &b + print(f) // @pointsto main.b +} + +type T int + +func (t *T) f(x *int) *int { + print(t) // @pointsto main.a + print(x) // @pointsto main.c + return &b +} + +func (t *T) g(x *int) *int { + print(t) // @pointsto main.a + print(x) // @pointsto main.b + return &c +} + +func (t *T) h(x *int) *int { + print(t) // @pointsto main.a + print(x) // @pointsto main.b + return &c +} + +var h func(*T, *int) *int + +func func5() { + // Static call of method. + t := (*T)(&a) + print(t.f(&c)) // @pointsto main.b + + // Static call of method as function + print((*T).g(t, &b)) // @pointsto main.c + + // Dynamic call (not invoke) of method. + h = (*T).h + print(h(t, &b)) // @pointsto main.c +} + +// @calls main.func5 -> (*main.T).f +// @calls main.func5 -> (*main.T).g$thunk +// @calls main.func5 -> (*main.T).h$thunk + +func func6() { + A := &a + f := func() *int { + return A // (free variable) + } + print(f()) // @pointsto main.a +} + +// @calls main.func6 -> main.func6$1 + +type I interface { + f() +} + +type D struct{} + +func (D) f() {} + +func func7() { + var i I = D{} + imethodClosure := i.f + imethodClosure() + // @calls main.func7 -> (main.I).f$bound + // @calls (main.I).f$bound -> (main.D).f + + var d D + cmethodClosure := d.f + cmethodClosure() + // @calls main.func7 -> (main.D).f$bound + // @calls (main.D).f$bound ->(main.D).f + + methodExpr := D.f + methodExpr(d) + // @calls main.func7 -> (main.D).f$thunk +} + +func func8(x ...int) { + print(&x[0]) // @pointsto varargs[*]@varargs:15 +} + +type E struct { + x1, x2, x3, x4, x5 *int +} + +func (e E) f() {} + +func func9() { + // Regression test for bug reported by Jon Valdes on golang-dev, Jun 19 2014. + // The receiver of a bound method closure may be of a multi-node type, E. + // valueNode was reserving only a single node for it, so the + // nodes used by the immediately following constraints + // (e.g. param 'i') would get clobbered. + + var e E + e.x1 = &a + e.x2 = &a + e.x3 = &a + e.x4 = &a + e.x5 = &a + + _ = e.f // form a closure---must reserve sizeof(E) nodes + + func(i I) { + i.f() // must not crash the solver + }(new(D)) + + print(e.x1) // @pointsto main.a + print(e.x2) // @pointsto main.a + print(e.x3) // @pointsto main.a + print(e.x4) // @pointsto main.a + print(e.x5) // @pointsto main.a +} + +func main() { + func1() + func2() + func3() + func4() + func5() + func6() + func7() + func8(1, 2, 3) // @line varargs + func9() +} + +// @calls -> main.main +// @calls -> main.init diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/funcreflect.go b/vendor/golang.org/x/tools/go/pointer/testdata/funcreflect.go new file mode 100644 index 0000000000..a0a9a5faaa --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/funcreflect.go @@ -0,0 +1,130 @@ +// +build ignore + +package main + +import "reflect" + +var zero, a, b int +var false2 bool + +func f(p *int, q hasF) *int { + print(p) // @pointsto main.a + print(q) // @types *T + print(q.(*T)) // @pointsto new@newT1:22 + return &b +} + +func g(p *bool) (*int, *bool, hasF) { + return &b, p, new(T) // @line newT2 +} + +func reflectValueCall() { + rvf := reflect.ValueOf(f) + res := rvf.Call([]reflect.Value{ + // argument order is not significant: + reflect.ValueOf(new(T)), // @line newT1 + reflect.ValueOf(&a), + }) + print(res[0].Interface()) // @types *int + print(res[0].Interface().(*int)) // @pointsto main.b +} + +// @calls main.reflectValueCall -> main.f + +func reflectValueCallIndirect() { + rvf := reflect.ValueOf(g) + call := rvf.Call // kids, don't try this at home + + // Indirect call uses shared contour. + // + // Also notice that argument position doesn't matter, and args + // of inappropriate type (e.g. 'a') are ignored. + res := call([]reflect.Value{ + reflect.ValueOf(&a), + reflect.ValueOf(&false2), + }) + res0 := res[0].Interface() + print(res0) // @types *int | *bool | *T + print(res0.(*int)) // @pointsto main.b + print(res0.(*bool)) // @pointsto main.false2 + print(res0.(hasF)) // @types *T + print(res0.(*T)) // @pointsto new@newT2:19 +} + +// @calls main.reflectValueCallIndirect -> (reflect.Value).Call$bound +// @calls (reflect.Value).Call$bound -> main.g + +func reflectTypeInOut() { + var f func(float64, bool) (string, int) + print(reflect.Zero(reflect.TypeOf(f).In(0)).Interface()) // @types float64 + print(reflect.Zero(reflect.TypeOf(f).In(1)).Interface()) // @types bool + print(reflect.Zero(reflect.TypeOf(f).In(-1)).Interface()) // @types float64 | bool + print(reflect.Zero(reflect.TypeOf(f).In(zero)).Interface()) // @types float64 | bool + + print(reflect.Zero(reflect.TypeOf(f).Out(0)).Interface()) // @types string + print(reflect.Zero(reflect.TypeOf(f).Out(1)).Interface()) // @types int + print(reflect.Zero(reflect.TypeOf(f).Out(2)).Interface()) // @types + + print(reflect.Zero(reflect.TypeOf(3).Out(0)).Interface()) // @types +} + +type hasF interface { + F() +} + +type T struct{} + +func (T) F() {} +func (T) g(int) {} + +type U struct{} + +func (U) F(int) {} +func (U) g(string) {} + +type I interface { + f() +} + +var nonconst string + +func reflectTypeMethodByName() { + TU := reflect.TypeOf([]interface{}{T{}, U{}}[0]) + print(reflect.Zero(TU)) // @types T | U + + F, _ := TU.MethodByName("F") + print(reflect.Zero(F.Type)) // @types func(T) | func(U, int) + print(F.Func) // @pointsto (main.T).F | (main.U).F + + g, _ := TU.MethodByName("g") + print(reflect.Zero(g.Type)) // @types func(T, int) | func(U, string) + print(g.Func) // @pointsto (main.T).g | (main.U).g + + // Non-literal method names are treated less precisely. + U := reflect.TypeOf(U{}) + X, _ := U.MethodByName(nonconst) + print(reflect.Zero(X.Type)) // @types func(U, int) | func(U, string) + print(X.Func) // @pointsto (main.U).F | (main.U).g + + // Interface methods. + rThasF := reflect.TypeOf(new(hasF)).Elem() + print(reflect.Zero(rThasF)) // @types hasF + F2, _ := rThasF.MethodByName("F") + print(reflect.Zero(F2.Type)) // @types func() + print(F2.Func) // @pointsto + +} + +func reflectTypeMethod() { + m := reflect.TypeOf(T{}).Method(0) + print(reflect.Zero(m.Type)) // @types func(T) | func(T, int) + print(m.Func) // @pointsto (main.T).F | (main.T).g +} + +func main() { + reflectValueCall() + reflectValueCallIndirect() + reflectTypeInOut() + reflectTypeMethodByName() + reflectTypeMethod() +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/hello.go b/vendor/golang.org/x/tools/go/pointer/testdata/hello.go new file mode 100644 index 0000000000..b81784b22a --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/hello.go @@ -0,0 +1,27 @@ +// +build ignore + +package main + +import ( + "fmt" + "os" +) + +type S int + +var theS S + +func (s *S) String() string { + print(s) // @pointsto main.theS + return "" +} + +func main() { + // os.Args is considered intrinsically allocated, + // but may also be set explicitly (e.g. on Windows), hence '...'. + print(os.Args) // @pointsto | ... + fmt.Println("Hello, World!", &theS) +} + +// @calls main.main -> fmt.Println +// @calls (*fmt.pp).handleMethods -> (*main.S).String diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/interfaces.go b/vendor/golang.org/x/tools/go/pointer/testdata/interfaces.go new file mode 100644 index 0000000000..91c0fa9a90 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/interfaces.go @@ -0,0 +1,152 @@ +// +build ignore + +package main + +type I interface { + f() +} + +type C int + +func (*C) f() {} + +type D struct{ ptr *int } + +func (D) f() {} + +type E struct{} + +func (*E) f() {} + +var a, b int + +var unknown bool // defeat dead-code elimination + +func interface1() { + var i interface{} = &a + var j interface{} = D{&b} + k := j + if unknown { + k = i + } + + print(i) // @types *int + print(j) // @types D + print(k) // @types *int | D + + print(i.(*int)) // @pointsto main.a + print(j.(*int)) // @pointsto + print(k.(*int)) // @pointsto main.a + + print(i.(D).ptr) // @pointsto + print(j.(D).ptr) // @pointsto main.b + print(k.(D).ptr) // @pointsto main.b +} + +func interface2() { + var i I = (*C)(&a) + var j I = D{&a} + k := j + if unknown { + k = i + } + + print(i) // @types *C + print(j) // @types D + print(k) // @types *C | D + print(k) // @pointsto makeinterface:main.D | makeinterface:*main.C + + k.f() + // @calls main.interface2 -> (*main.C).f + // @calls main.interface2 -> (main.D).f + + print(i.(*C)) // @pointsto main.a + print(j.(D).ptr) // @pointsto main.a + print(k.(*C)) // @pointsto main.a + + switch x := k.(type) { + case *C: + print(x) // @pointsto main.a + case D: + print(x.ptr) // @pointsto main.a + case *E: + print(x) // @pointsto + } +} + +func interface3() { + // There should be no backflow of concrete types from the type-switch to x. + var x interface{} = 0 + print(x) // @types int + switch x.(type) { + case int: + case string: + } +} + +func interface4() { + var i interface{} = D{&a} + if unknown { + i = 123 + } + + print(i) // @types int | D + + j := i.(I) // interface narrowing type-assertion + print(j) // @types D + print(j.(D).ptr) // @pointsto main.a + + var l interface{} = j // interface widening assignment. + print(l) // @types D + print(l.(D).ptr) // @pointsto main.a + + m := j.(interface{}) // interface widening type-assertion. + print(m) // @types D + print(m.(D).ptr) // @pointsto main.a +} + +// Interface method calls and value flow: + +type J interface { + f(*int) *int +} + +type P struct { + x int +} + +func (p *P) f(pi *int) *int { + print(p) // @pointsto p@i5p:6 + print(pi) // @pointsto i@i5i:6 + return &p.x +} + +func interface5() { + var p P // @line i5p + var j J = &p + var i int // @line i5i + print(j.f(&i)) // @pointsto p.x@i5p:6 + print(&i) // @pointsto i@i5i:6 + + print(j) // @pointsto makeinterface:*main.P +} + +// @calls main.interface5 -> (*main.P).f + +func interface6() { + f := I.f + print(f) // @pointsto (main.I).f$thunk + f(new(struct{ D })) +} + +// @calls main.interface6 -> (main.I).f$thunk +// @calls (main.I).f$thunk -> (*struct{main.D}).f + +func main() { + interface1() + interface2() + interface3() + interface4() + interface5() + interface6() +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/issue9002.go b/vendor/golang.org/x/tools/go/pointer/testdata/issue9002.go new file mode 100644 index 0000000000..b7c2c61090 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/issue9002.go @@ -0,0 +1,17 @@ +package main + +func main() { + // Regression test for golang issue 9002. + // + // The two-result "value,ok" receive operation generated a + // too-wide constraint loading (value int, ok bool), not bool, + // from the channel. + // + // This bug manifested itself in an out-of-bounds array access + // when the makechan object was the highest-numbered node, as in + // this program. + // + // In more realistic programs it silently resulted in bogus + // constraints. + _, _ = <-make(chan int) +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/mapreflect.go b/vendor/golang.org/x/tools/go/pointer/testdata/mapreflect.go new file mode 100644 index 0000000000..bc5e7e6b7c --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/mapreflect.go @@ -0,0 +1,117 @@ +// +build ignore + +package main + +// Test of maps with reflection. + +import "reflect" + +var a int +var b bool + +func reflectMapKeysIndex() { + m := make(map[*int]*bool) // @line mr1make + m[&a] = &b + + mrv := reflect.ValueOf(m) + print(mrv.Interface()) // @types map[*int]*bool + print(mrv.Interface().(map[*int]*bool)) // @pointsto makemap@mr1make:11 + print(mrv) // @pointsto makeinterface:map[*int]*bool + print(mrv) // @types map[*int]*bool + + keys := mrv.MapKeys() + print(keys) // @pointsto + for _, k := range keys { + print(k) // @pointsto + print(k) // @types *int + print(k.Interface()) // @types *int + print(k.Interface().(*int)) // @pointsto main.a + + v := mrv.MapIndex(k) + print(v.Interface()) // @types *bool + print(v.Interface().(*bool)) // @pointsto main.b + } +} + +func reflectSetMapIndex() { + m := make(map[*int]*bool) + mrv := reflect.ValueOf(m) + mrv.SetMapIndex(reflect.ValueOf(&a), reflect.ValueOf(&b)) + + print(m[nil]) // @pointsto main.b + + for _, k := range mrv.MapKeys() { + print(k.Interface()) // @types *int + print(k.Interface().(*int)) // @pointsto main.a + } + + tmap := reflect.TypeOf(m) + // types.EvalNode won't let us refer to non-exported types: + // print(tmap) // #@types *reflect.rtype + print(tmap) // @pointsto map[*int]*bool + + zmap := reflect.Zero(tmap) + print(zmap) // @pointsto + print(zmap.Interface()) // @pointsto + + print(tmap.Key()) // @pointsto *int + print(tmap.Elem()) // @pointsto *bool + print(reflect.Zero(tmap.Key())) // @pointsto + print(reflect.Zero(tmap.Key()).Interface()) // @pointsto + print(reflect.Zero(tmap.Key()).Interface()) // @types *int + print(reflect.Zero(tmap.Elem())) // @pointsto + print(reflect.Zero(tmap.Elem()).Interface()) // @pointsto + print(reflect.Zero(tmap.Elem()).Interface()) // @types *bool +} + +func reflectSetMapIndexInterface() { + // Exercises reflect.Value conversions to/from interfaces: + // a different code path than for concrete types. + m := make(map[interface{}]interface{}) + reflect.ValueOf(m).SetMapIndex(reflect.ValueOf(&a), reflect.ValueOf(&b)) + for k, v := range m { + print(k) // @types *int + print(k.(*int)) // @pointsto main.a + print(v) // @types *bool + print(v.(*bool)) // @pointsto main.b + } +} + +func reflectSetMapIndexAssignable() { + // SetMapIndex performs implicit assignability conversions. + type I *int + type J *int + + str := reflect.ValueOf("") + + // *int is assignable to I. + m1 := make(map[string]I) + reflect.ValueOf(m1).SetMapIndex(str, reflect.ValueOf(new(int))) // @line int + print(m1[""]) // @pointsto new@int:58 + + // I is assignable to I. + m2 := make(map[string]I) + reflect.ValueOf(m2).SetMapIndex(str, reflect.ValueOf(I(new(int)))) // @line I + print(m2[""]) // @pointsto new@I:60 + + // J is not assignable to I. + m3 := make(map[string]I) + reflect.ValueOf(m3).SetMapIndex(str, reflect.ValueOf(J(new(int)))) + print(m3[""]) // @pointsto +} + +func reflectMakeMap() { + t := reflect.TypeOf(map[*int]*bool(nil)) + v := reflect.MakeMap(t) + print(v) // @types map[*int]*bool + print(v) // @pointsto +} + +func main() { + reflectMapKeysIndex() + reflectSetMapIndex() + reflectSetMapIndexInterface() + reflectSetMapIndexAssignable() + reflectMakeMap() + // TODO(adonovan): reflect.MapOf(Type) +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/maps.go b/vendor/golang.org/x/tools/go/pointer/testdata/maps.go new file mode 100644 index 0000000000..67293045bc --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/maps.go @@ -0,0 +1,74 @@ +// +build ignore + +package main + +// Test of maps. + +var a, b, c int + +func maps1() { + m1 := map[*int]*int{&a: &b} // @line m1m1 + m2 := make(map[*int]*int) // @line m1m2 + m2[&b] = &a + + print(m1[nil]) // @pointsto main.b | main.c + print(m2[nil]) // @pointsto main.a + + print(m1) // @pointsto makemap@m1m1:21 + print(m2) // @pointsto makemap@m1m2:12 + + m1[&b] = &c + + for k, v := range m1 { + print(k) // @pointsto main.a | main.b + print(v) // @pointsto main.b | main.c + } + + for k, v := range m2 { + print(k) // @pointsto main.b + print(v) // @pointsto main.a + } + + // Lookup doesn't create any aliases. + print(m2[&c]) // @pointsto main.a + if _, ok := m2[&a]; ok { + print(m2[&c]) // @pointsto main.a + } +} + +func maps2() { + m1 := map[*int]*int{&a: &b} + m2 := map[*int]*int{&b: &c} + _ = []map[*int]*int{m1, m2} // (no spurious merging of m1, m2) + + print(m1[nil]) // @pointsto main.b + print(m2[nil]) // @pointsto main.c +} + +var g int + +func maps3() { + // Regression test for a constraint generation bug for map range + // loops in which the key is unused: the (ok, k, v) tuple + // returned by ssa.Next may have type 'invalid' for the k and/or + // v components, so copying the map key or value may cause + // miswiring if the key has >1 components. In the worst case, + // this causes a crash. The test below used to report that + // pts(v) includes not just main.g but new(float64) too, which + // is ill-typed. + + // sizeof(K) > 1, abstractly + type K struct{ a, b *float64 } + k := K{new(float64), nil} + m := map[K]*int{k: &g} + + for _, v := range m { + print(v) // @pointsto main.g + } +} + +func main() { + maps1() + maps2() + maps3() +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/panic.go b/vendor/golang.org/x/tools/go/pointer/testdata/panic.go new file mode 100644 index 0000000000..ee8a7668e0 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/panic.go @@ -0,0 +1,36 @@ +// +build ignore + +package main + +// Test of value flow from panic() to recover(). +// We model them as stores/loads of a global location. +// We ignore concrete panic types originating from the runtime. + +var someval int + +type myPanic struct{} + +func f(int) {} + +func g() string { return "" } + +func deadcode() { + panic(123) // not reached +} + +func main() { + switch someval { + case 0: + panic("oops") + case 1: + panic(myPanic{}) + case 2: + panic(f) + case 3: + panic(g) + } + ex := recover() + print(ex) // @types myPanic | string | func(int) | func() string + print(ex.(func(int))) // @pointsto main.f + print(ex.(func() string)) // @pointsto main.g +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/recur.go b/vendor/golang.org/x/tools/go/pointer/testdata/recur.go new file mode 100644 index 0000000000..4c7229de94 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/recur.go @@ -0,0 +1,11 @@ +// +build ignore + +package main + +// Analysis abstraction of recursive calls is finite. + +func main() { + main() +} + +// @calls main.main -> main.main diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/reflect.go b/vendor/golang.org/x/tools/go/pointer/testdata/reflect.go new file mode 100644 index 0000000000..6b8d0f22eb --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/reflect.go @@ -0,0 +1,115 @@ +// +build ignore + +package main + +import "reflect" +import "unsafe" + +var a, b int +var unknown bool + +func reflectIndirect() { + ptr := &a + // Pointer: + print(reflect.Indirect(reflect.ValueOf(&ptr)).Interface().(*int)) // @pointsto main.a + // Non-pointer: + print(reflect.Indirect(reflect.ValueOf([]*int{ptr})).Interface().([]*int)[0]) // @pointsto main.a +} + +func reflectNewAt() { + var x [8]byte + print(reflect.NewAt(reflect.TypeOf(3), unsafe.Pointer(&x)).Interface()) // @types *int +} + +// @warning "unsound: main.reflectNewAt contains a reflect.NewAt.. call" + +func reflectTypeOf() { + t := reflect.TypeOf(3) + if unknown { + t = reflect.TypeOf("foo") + } + // TODO(adonovan): make types.Eval let us refer to unexported types. + print(t) // #@types *reflect.rtype + print(reflect.Zero(t).Interface()) // @types int | string + newint := reflect.New(t).Interface() // @line rtonew + print(newint) // @types *int | *string + print(newint.(*int)) // @pointsto + print(newint.(*string)) // @pointsto +} + +func reflectTypeElem() { + print(reflect.Zero(reflect.TypeOf(&a).Elem()).Interface()) // @types int + print(reflect.Zero(reflect.TypeOf([]string{}).Elem()).Interface()) // @types string + print(reflect.Zero(reflect.TypeOf(make(chan bool)).Elem()).Interface()) // @types bool + print(reflect.Zero(reflect.TypeOf(make(map[string]float64)).Elem()).Interface()) // @types float64 + print(reflect.Zero(reflect.TypeOf([3]complex64{}).Elem()).Interface()) // @types complex64 + print(reflect.Zero(reflect.TypeOf(3).Elem()).Interface()) // @types + print(reflect.Zero(reflect.TypeOf(new(interface{})).Elem())) // @types interface{} + print(reflect.Zero(reflect.TypeOf(new(interface{})).Elem()).Interface()) // @types +} + +// reflect.Values within reflect.Values. +func metareflection() { + // "box" a *int twice, unbox it twice. + v0 := reflect.ValueOf(&a) + print(v0) // @types *int + v1 := reflect.ValueOf(v0) // box + print(v1) // @types reflect.Value + v2 := reflect.ValueOf(v1) // box + print(v2) // @types reflect.Value + v1a := v2.Interface().(reflect.Value) // unbox + print(v1a) // @types reflect.Value + v0a := v1a.Interface().(reflect.Value) // unbox + print(v0a) // @types *int + print(v0a.Interface().(*int)) // @pointsto main.a + + // "box" an interface{} lvalue twice, unbox it twice. + var iface interface{} = 3 + x0 := reflect.ValueOf(&iface).Elem() + print(x0) // @types interface{} + x1 := reflect.ValueOf(x0) // box + print(x1) // @types reflect.Value + x2 := reflect.ValueOf(x1) // box + print(x2) // @types reflect.Value + x1a := x2.Interface().(reflect.Value) // unbox + print(x1a) // @types reflect.Value + x0a := x1a.Interface().(reflect.Value) // unbox + print(x0a) // @types interface{} + print(x0a.Interface()) // @types int +} + +type T struct{} + +// When the output of a type constructor flows to its input, we must +// bound the set of types created to ensure termination of the algorithm. +func typeCycle() { + t := reflect.TypeOf(0) + u := reflect.TypeOf("") + v := reflect.TypeOf(T{}) + for unknown { + t = reflect.PtrTo(t) + t = reflect.SliceOf(t) + + u = reflect.SliceOf(u) + + if unknown { + v = reflect.ChanOf(reflect.BothDir, v) + } else { + v = reflect.PtrTo(v) + } + } + + // Type height is bounded to about 4 map/slice/chan/pointer constructors. + print(reflect.Zero(t).Interface()) // @types int | []*int | []*[]*int + print(reflect.Zero(u).Interface()) // @types string | []string | [][]string | [][][]string | [][][][]string + print(reflect.Zero(v).Interface()) // @types T | *T | **T | ***T | ****T | chan T | *chan T | **chan T | chan *T | *chan *T | chan **T | chan ***T | chan chan T | chan *chan T | chan chan *T +} + +func main() { + reflectIndirect() + reflectNewAt() + reflectTypeOf() + reflectTypeElem() + metareflection() + typeCycle() +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/rtti.go b/vendor/golang.org/x/tools/go/pointer/testdata/rtti.go new file mode 100644 index 0000000000..826936de77 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/rtti.go @@ -0,0 +1,29 @@ +package main + +// Regression test for oracle crash +// https://code.google.com/p/go/issues/detail?id=6605 +// +// Using reflection, methods may be called on types that are not the +// operand of any ssa.MakeInterface instruction. In this example, +// (Y).F is called by deriving the type Y from *Y. Prior to the fix, +// no RTTI (or method set) for type Y was included in the program, so +// the F() call would crash. + +import "reflect" + +var a int + +type X struct{} + +func (X) F() *int { + return &a +} + +type I interface { + F() *int +} + +func main() { + type Y struct{ X } + print(reflect.Indirect(reflect.ValueOf(new(Y))).Interface().(I).F()) // @pointsto main.a +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/structreflect.go b/vendor/golang.org/x/tools/go/pointer/testdata/structreflect.go new file mode 100644 index 0000000000..9fb49f5590 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/structreflect.go @@ -0,0 +1,45 @@ +// +build ignore + +package main + +import "reflect" + +type A struct { + f *int + g interface{} + h bool +} + +var dyn string + +func reflectTypeFieldByName() { + f, _ := reflect.TypeOf(A{}).FieldByName("f") + print(f.Type) // @pointsto *int + + g, _ := reflect.TypeOf(A{}).FieldByName("g") + print(g.Type) // @pointsto interface{} + print(reflect.Zero(g.Type)) // @pointsto + print(reflect.Zero(g.Type)) // @types interface{} + + print(reflect.Zero(g.Type).Interface()) // @pointsto + print(reflect.Zero(g.Type).Interface()) // @types + + h, _ := reflect.TypeOf(A{}).FieldByName("h") + print(h.Type) // @pointsto bool + + missing, _ := reflect.TypeOf(A{}).FieldByName("missing") + print(missing.Type) // @pointsto + + dyn, _ := reflect.TypeOf(A{}).FieldByName(dyn) + print(dyn.Type) // @pointsto *int | bool | interface{} +} + +func reflectTypeField() { + fld := reflect.TypeOf(A{}).Field(0) + print(fld.Type) // @pointsto *int | bool | interface{} +} + +func main() { + reflectTypeFieldByName() + reflectTypeField() +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/structs.go b/vendor/golang.org/x/tools/go/pointer/testdata/structs.go new file mode 100644 index 0000000000..9036d608db --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/structs.go @@ -0,0 +1,100 @@ +// +build ignore + +package main + +var unknown bool // defeat dead-code elimination + +var p, q int + +type A struct { + f *int + g interface{} +} + +func (a A) m1() { + print(a.f) // @pointsto main.p +} + +func (a *A) m2() { + print(a) // @pointsto complit.A@struct1s:9 + print(a.f) // @pointsto main.p +} + +type B struct { + h *int + A +} + +func structs1() { + b := &B{ // @line struct1s + h: &q, + } + b.f = &p + b.g = b + + print(b.h) // @pointsto main.q + print(b.f) // @pointsto main.p + print(b.g) // @types *B + + ptr := &b.f + print(*ptr) // @pointsto main.p + + b.m1() + b.m2() +} + +// @calls main.structs1 -> (main.A).m1 +// @calls main.structs1 -> (*main.A).m2 +// @calls (*main.B).m1 -> (main.A).m1 +// @calls (*main.B).m2 -> (*main.A).m2 + +type T struct { + x int + y int +} + +type S struct { + a [3]T + b *[3]T + c [3]*T +} + +func structs2() { + var s S // @line s2s + print(&s) // @pointsto s@s2s:6 + print(&s.a) // @pointsto s.a@s2s:6 + print(&s.a[0]) // @pointsto s.a[*]@s2s:6 + print(&s.a[0].x) // @pointsto s.a[*].x@s2s:6 + print(&s.a[0].y) // @pointsto s.a[*].y@s2s:6 + print(&s.b) // @pointsto s.b@s2s:6 + print(&s.b[0]) // @pointsto + print(&s.b[0].x) // @pointsto + print(&s.b[0].y) // @pointsto + print(&s.c) // @pointsto s.c@s2s:6 + print(&s.c[0]) // @pointsto s.c[*]@s2s:6 + print(&s.c[0].x) // @pointsto + print(&s.c[0].y) // @pointsto + + var s2 S // @line s2s2 + s2.b = new([3]T) // @line s2s2b + print(s2.b) // @pointsto new@s2s2b:12 + print(&s2.b) // @pointsto s2.b@s2s2:6 + print(&s2.b[0]) // @pointsto new[*]@s2s2b:12 + print(&s2.b[0].x) // @pointsto new[*].x@s2s2b:12 + print(&s2.b[0].y) // @pointsto new[*].y@s2s2b:12 + print(&s2.c[0].x) // @pointsto + print(&s2.c[0].y) // @pointsto + + var s3 S // @line s2s3 + s3.c[2] = new(T) // @line s2s3c + print(&s3.c) // @pointsto s3.c@s2s3:6 + print(s3.c[1]) // @pointsto new@s2s3c:15 + print(&s3.c[1]) // @pointsto s3.c[*]@s2s3:6 + print(&s3.c[1].x) // @pointsto new.x@s2s3c:15 + print(&s3.c[1].y) // @pointsto new.y@s2s3c:15 +} + +func main() { + structs1() + structs2() +} diff --git a/vendor/golang.org/x/tools/go/pointer/testdata/timer.go b/vendor/golang.org/x/tools/go/pointer/testdata/timer.go new file mode 100644 index 0000000000..465d0813a1 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/testdata/timer.go @@ -0,0 +1,24 @@ +// +build ignore + +package main + +import "time" + +func after() {} + +func main() { + // @calls time.startTimer -> time.sendTime + ticker := time.NewTicker(1) + <-ticker.C + + // @calls time.startTimer -> time.sendTime + timer := time.NewTimer(time.Second) + <-timer.C + + // @calls time.startTimer -> time.goFunc + // @calls time.goFunc -> main.after + timer = time.AfterFunc(time.Second, after) + <-timer.C +} + +// @calls time.sendTime -> time.Now diff --git a/vendor/golang.org/x/tools/go/pointer/util.go b/vendor/golang.org/x/tools/go/pointer/util.go new file mode 100644 index 0000000000..4d2fa74f8b --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/util.go @@ -0,0 +1,316 @@ +// Copyright 2013 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.5 + +package pointer + +import ( + "bytes" + "fmt" + "go/types" + "log" + "os" + "os/exec" + "runtime" + "time" + + "golang.org/x/tools/container/intsets" +) + +// CanPoint reports whether the type T is pointerlike, +// for the purposes of this analysis. +func CanPoint(T types.Type) bool { + switch T := T.(type) { + case *types.Named: + if obj := T.Obj(); obj.Name() == "Value" && obj.Pkg().Path() == "reflect" { + return true // treat reflect.Value like interface{} + } + return CanPoint(T.Underlying()) + + case *types.Pointer, *types.Interface, *types.Map, *types.Chan, *types.Signature, *types.Slice: + return true + } + + return false // array struct tuple builtin basic +} + +// CanHaveDynamicTypes reports whether the type T can "hold" dynamic types, +// i.e. is an interface (incl. reflect.Type) or a reflect.Value. +// +func CanHaveDynamicTypes(T types.Type) bool { + switch T := T.(type) { + case *types.Named: + if obj := T.Obj(); obj.Name() == "Value" && obj.Pkg().Path() == "reflect" { + return true // reflect.Value + } + return CanHaveDynamicTypes(T.Underlying()) + case *types.Interface: + return true + } + return false +} + +func isInterface(T types.Type) bool { return types.IsInterface(T) } + +// mustDeref returns the element type of its argument, which must be a +// pointer; panic ensues otherwise. +func mustDeref(typ types.Type) types.Type { + return typ.Underlying().(*types.Pointer).Elem() +} + +// deref returns a pointer's element type; otherwise it returns typ. +func deref(typ types.Type) types.Type { + if p, ok := typ.Underlying().(*types.Pointer); ok { + return p.Elem() + } + return typ +} + +// A fieldInfo describes one subelement (node) of the flattening-out +// of a type T: the subelement's type and its path from the root of T. +// +// For example, for this type: +// type line struct{ points []struct{x, y int} } +// flatten() of the inner struct yields the following []fieldInfo: +// struct{ x, y int } "" +// int ".x" +// int ".y" +// and flatten(line) yields: +// struct{ points []struct{x, y int} } "" +// struct{ x, y int } ".points[*]" +// int ".points[*].x +// int ".points[*].y" +// +type fieldInfo struct { + typ types.Type + + // op and tail describe the path to the element (e.g. ".a#2.b[*].c"). + op interface{} // *Array: true; *Tuple: int; *Struct: *types.Var; *Named: nil + tail *fieldInfo +} + +// path returns a user-friendly string describing the subelement path. +// +func (fi *fieldInfo) path() string { + var buf bytes.Buffer + for p := fi; p != nil; p = p.tail { + switch op := p.op.(type) { + case bool: + fmt.Fprintf(&buf, "[*]") + case int: + fmt.Fprintf(&buf, "#%d", op) + case *types.Var: + fmt.Fprintf(&buf, ".%s", op.Name()) + } + } + return buf.String() +} + +// flatten returns a list of directly contained fields in the preorder +// traversal of the type tree of t. The resulting elements are all +// scalars (basic types or pointerlike types), except for struct/array +// "identity" nodes, whose type is that of the aggregate. +// +// reflect.Value is considered pointerlike, similar to interface{}. +// +// Callers must not mutate the result. +// +func (a *analysis) flatten(t types.Type) []*fieldInfo { + fl, ok := a.flattenMemo[t] + if !ok { + switch t := t.(type) { + case *types.Named: + u := t.Underlying() + if isInterface(u) { + // Debuggability hack: don't remove + // the named type from interfaces as + // they're very verbose. + fl = append(fl, &fieldInfo{typ: t}) + } else { + fl = a.flatten(u) + } + + case *types.Basic, + *types.Signature, + *types.Chan, + *types.Map, + *types.Interface, + *types.Slice, + *types.Pointer: + fl = append(fl, &fieldInfo{typ: t}) + + case *types.Array: + fl = append(fl, &fieldInfo{typ: t}) // identity node + for _, fi := range a.flatten(t.Elem()) { + fl = append(fl, &fieldInfo{typ: fi.typ, op: true, tail: fi}) + } + + case *types.Struct: + fl = append(fl, &fieldInfo{typ: t}) // identity node + for i, n := 0, t.NumFields(); i < n; i++ { + f := t.Field(i) + for _, fi := range a.flatten(f.Type()) { + fl = append(fl, &fieldInfo{typ: fi.typ, op: f, tail: fi}) + } + } + + case *types.Tuple: + // No identity node: tuples are never address-taken. + n := t.Len() + if n == 1 { + // Don't add a fieldInfo link for singletons, + // e.g. in params/results. + fl = append(fl, a.flatten(t.At(0).Type())...) + } else { + for i := 0; i < n; i++ { + f := t.At(i) + for _, fi := range a.flatten(f.Type()) { + fl = append(fl, &fieldInfo{typ: fi.typ, op: i, tail: fi}) + } + } + } + + default: + panic(t) + } + + a.flattenMemo[t] = fl + } + + return fl +} + +// sizeof returns the number of pointerlike abstractions (nodes) in the type t. +func (a *analysis) sizeof(t types.Type) uint32 { + return uint32(len(a.flatten(t))) +} + +// shouldTrack reports whether object type T contains (recursively) +// any fields whose addresses should be tracked. +func (a *analysis) shouldTrack(T types.Type) bool { + if a.track == trackAll { + return true // fast path + } + track, ok := a.trackTypes[T] + if !ok { + a.trackTypes[T] = true // break cycles conservatively + // NB: reflect.Value, reflect.Type are pre-populated to true. + for _, fi := range a.flatten(T) { + switch ft := fi.typ.Underlying().(type) { + case *types.Interface, *types.Signature: + track = true // needed for callgraph + case *types.Basic: + // no-op + case *types.Chan: + track = a.track&trackChan != 0 || a.shouldTrack(ft.Elem()) + case *types.Map: + track = a.track&trackMap != 0 || a.shouldTrack(ft.Key()) || a.shouldTrack(ft.Elem()) + case *types.Slice: + track = a.track&trackSlice != 0 || a.shouldTrack(ft.Elem()) + case *types.Pointer: + track = a.track&trackPtr != 0 || a.shouldTrack(ft.Elem()) + case *types.Array, *types.Struct: + // No need to look at field types since they will follow (flattened). + default: + // Includes *types.Tuple, which are never address-taken. + panic(ft) + } + if track { + break + } + } + a.trackTypes[T] = track + if !track && a.log != nil { + fmt.Fprintf(a.log, "\ttype not tracked: %s\n", T) + } + } + return track +} + +// offsetOf returns the (abstract) offset of field index within struct +// or tuple typ. +func (a *analysis) offsetOf(typ types.Type, index int) uint32 { + var offset uint32 + switch t := typ.Underlying().(type) { + case *types.Tuple: + for i := 0; i < index; i++ { + offset += a.sizeof(t.At(i).Type()) + } + case *types.Struct: + offset++ // the node for the struct itself + for i := 0; i < index; i++ { + offset += a.sizeof(t.Field(i).Type()) + } + default: + panic(fmt.Sprintf("offsetOf(%s : %T)", typ, typ)) + } + return offset +} + +// sliceToArray returns the type representing the arrays to which +// slice type slice points. +func sliceToArray(slice types.Type) *types.Array { + return types.NewArray(slice.Underlying().(*types.Slice).Elem(), 1) +} + +// Node set ------------------------------------------------------------------- + +type nodeset struct { + intsets.Sparse +} + +func (ns *nodeset) String() string { + var buf bytes.Buffer + buf.WriteRune('{') + var space [50]int + for i, n := range ns.AppendTo(space[:0]) { + if i > 0 { + buf.WriteString(", ") + } + buf.WriteRune('n') + fmt.Fprintf(&buf, "%d", n) + } + buf.WriteRune('}') + return buf.String() +} + +func (ns *nodeset) add(n nodeid) bool { + return ns.Sparse.Insert(int(n)) +} + +func (x *nodeset) addAll(y *nodeset) bool { + return x.UnionWith(&y.Sparse) +} + +// Profiling & debugging ------------------------------------------------------- + +var timers = make(map[string]time.Time) + +func start(name string) { + if debugTimers { + timers[name] = time.Now() + log.Printf("%s...\n", name) + } +} + +func stop(name string) { + if debugTimers { + log.Printf("%s took %s\n", name, time.Since(timers[name])) + } +} + +// diff runs the command "diff a b" and reports its success. +func diff(a, b string) bool { + var cmd *exec.Cmd + switch runtime.GOOS { + case "plan9": + cmd = exec.Command("/bin/diff", "-c", a, b) + default: + cmd = exec.Command("/usr/bin/diff", "-u", a, b) + } + cmd.Stdout = os.Stderr + cmd.Stderr = os.Stderr + return cmd.Run() == nil +} diff --git a/vendor/golang.org/x/tools/go/pointer/util14.go b/vendor/golang.org/x/tools/go/pointer/util14.go new file mode 100644 index 0000000000..d04deeb8d3 --- /dev/null +++ b/vendor/golang.org/x/tools/go/pointer/util14.go @@ -0,0 +1,316 @@ +// Copyright 2013 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.5 + +package pointer + +import ( + "bytes" + "fmt" + "log" + "os" + "os/exec" + "runtime" + "time" + + "golang.org/x/tools/container/intsets" + "golang.org/x/tools/go/types" +) + +// CanPoint reports whether the type T is pointerlike, +// for the purposes of this analysis. +func CanPoint(T types.Type) bool { + switch T := T.(type) { + case *types.Named: + if obj := T.Obj(); obj.Name() == "Value" && obj.Pkg().Path() == "reflect" { + return true // treat reflect.Value like interface{} + } + return CanPoint(T.Underlying()) + + case *types.Pointer, *types.Interface, *types.Map, *types.Chan, *types.Signature, *types.Slice: + return true + } + + return false // array struct tuple builtin basic +} + +// CanHaveDynamicTypes reports whether the type T can "hold" dynamic types, +// i.e. is an interface (incl. reflect.Type) or a reflect.Value. +// +func CanHaveDynamicTypes(T types.Type) bool { + switch T := T.(type) { + case *types.Named: + if obj := T.Obj(); obj.Name() == "Value" && obj.Pkg().Path() == "reflect" { + return true // reflect.Value + } + return CanHaveDynamicTypes(T.Underlying()) + case *types.Interface: + return true + } + return false +} + +func isInterface(T types.Type) bool { return types.IsInterface(T) } + +// mustDeref returns the element type of its argument, which must be a +// pointer; panic ensues otherwise. +func mustDeref(typ types.Type) types.Type { + return typ.Underlying().(*types.Pointer).Elem() +} + +// deref returns a pointer's element type; otherwise it returns typ. +func deref(typ types.Type) types.Type { + if p, ok := typ.Underlying().(*types.Pointer); ok { + return p.Elem() + } + return typ +} + +// A fieldInfo describes one subelement (node) of the flattening-out +// of a type T: the subelement's type and its path from the root of T. +// +// For example, for this type: +// type line struct{ points []struct{x, y int} } +// flatten() of the inner struct yields the following []fieldInfo: +// struct{ x, y int } "" +// int ".x" +// int ".y" +// and flatten(line) yields: +// struct{ points []struct{x, y int} } "" +// struct{ x, y int } ".points[*]" +// int ".points[*].x +// int ".points[*].y" +// +type fieldInfo struct { + typ types.Type + + // op and tail describe the path to the element (e.g. ".a#2.b[*].c"). + op interface{} // *Array: true; *Tuple: int; *Struct: *types.Var; *Named: nil + tail *fieldInfo +} + +// path returns a user-friendly string describing the subelement path. +// +func (fi *fieldInfo) path() string { + var buf bytes.Buffer + for p := fi; p != nil; p = p.tail { + switch op := p.op.(type) { + case bool: + fmt.Fprintf(&buf, "[*]") + case int: + fmt.Fprintf(&buf, "#%d", op) + case *types.Var: + fmt.Fprintf(&buf, ".%s", op.Name()) + } + } + return buf.String() +} + +// flatten returns a list of directly contained fields in the preorder +// traversal of the type tree of t. The resulting elements are all +// scalars (basic types or pointerlike types), except for struct/array +// "identity" nodes, whose type is that of the aggregate. +// +// reflect.Value is considered pointerlike, similar to interface{}. +// +// Callers must not mutate the result. +// +func (a *analysis) flatten(t types.Type) []*fieldInfo { + fl, ok := a.flattenMemo[t] + if !ok { + switch t := t.(type) { + case *types.Named: + u := t.Underlying() + if isInterface(u) { + // Debuggability hack: don't remove + // the named type from interfaces as + // they're very verbose. + fl = append(fl, &fieldInfo{typ: t}) + } else { + fl = a.flatten(u) + } + + case *types.Basic, + *types.Signature, + *types.Chan, + *types.Map, + *types.Interface, + *types.Slice, + *types.Pointer: + fl = append(fl, &fieldInfo{typ: t}) + + case *types.Array: + fl = append(fl, &fieldInfo{typ: t}) // identity node + for _, fi := range a.flatten(t.Elem()) { + fl = append(fl, &fieldInfo{typ: fi.typ, op: true, tail: fi}) + } + + case *types.Struct: + fl = append(fl, &fieldInfo{typ: t}) // identity node + for i, n := 0, t.NumFields(); i < n; i++ { + f := t.Field(i) + for _, fi := range a.flatten(f.Type()) { + fl = append(fl, &fieldInfo{typ: fi.typ, op: f, tail: fi}) + } + } + + case *types.Tuple: + // No identity node: tuples are never address-taken. + n := t.Len() + if n == 1 { + // Don't add a fieldInfo link for singletons, + // e.g. in params/results. + fl = append(fl, a.flatten(t.At(0).Type())...) + } else { + for i := 0; i < n; i++ { + f := t.At(i) + for _, fi := range a.flatten(f.Type()) { + fl = append(fl, &fieldInfo{typ: fi.typ, op: i, tail: fi}) + } + } + } + + default: + panic(t) + } + + a.flattenMemo[t] = fl + } + + return fl +} + +// sizeof returns the number of pointerlike abstractions (nodes) in the type t. +func (a *analysis) sizeof(t types.Type) uint32 { + return uint32(len(a.flatten(t))) +} + +// shouldTrack reports whether object type T contains (recursively) +// any fields whose addresses should be tracked. +func (a *analysis) shouldTrack(T types.Type) bool { + if a.track == trackAll { + return true // fast path + } + track, ok := a.trackTypes[T] + if !ok { + a.trackTypes[T] = true // break cycles conservatively + // NB: reflect.Value, reflect.Type are pre-populated to true. + for _, fi := range a.flatten(T) { + switch ft := fi.typ.Underlying().(type) { + case *types.Interface, *types.Signature: + track = true // needed for callgraph + case *types.Basic: + // no-op + case *types.Chan: + track = a.track&trackChan != 0 || a.shouldTrack(ft.Elem()) + case *types.Map: + track = a.track&trackMap != 0 || a.shouldTrack(ft.Key()) || a.shouldTrack(ft.Elem()) + case *types.Slice: + track = a.track&trackSlice != 0 || a.shouldTrack(ft.Elem()) + case *types.Pointer: + track = a.track&trackPtr != 0 || a.shouldTrack(ft.Elem()) + case *types.Array, *types.Struct: + // No need to look at field types since they will follow (flattened). + default: + // Includes *types.Tuple, which are never address-taken. + panic(ft) + } + if track { + break + } + } + a.trackTypes[T] = track + if !track && a.log != nil { + fmt.Fprintf(a.log, "\ttype not tracked: %s\n", T) + } + } + return track +} + +// offsetOf returns the (abstract) offset of field index within struct +// or tuple typ. +func (a *analysis) offsetOf(typ types.Type, index int) uint32 { + var offset uint32 + switch t := typ.Underlying().(type) { + case *types.Tuple: + for i := 0; i < index; i++ { + offset += a.sizeof(t.At(i).Type()) + } + case *types.Struct: + offset++ // the node for the struct itself + for i := 0; i < index; i++ { + offset += a.sizeof(t.Field(i).Type()) + } + default: + panic(fmt.Sprintf("offsetOf(%s : %T)", typ, typ)) + } + return offset +} + +// sliceToArray returns the type representing the arrays to which +// slice type slice points. +func sliceToArray(slice types.Type) *types.Array { + return types.NewArray(slice.Underlying().(*types.Slice).Elem(), 1) +} + +// Node set ------------------------------------------------------------------- + +type nodeset struct { + intsets.Sparse +} + +func (ns *nodeset) String() string { + var buf bytes.Buffer + buf.WriteRune('{') + var space [50]int + for i, n := range ns.AppendTo(space[:0]) { + if i > 0 { + buf.WriteString(", ") + } + buf.WriteRune('n') + fmt.Fprintf(&buf, "%d", n) + } + buf.WriteRune('}') + return buf.String() +} + +func (ns *nodeset) add(n nodeid) bool { + return ns.Sparse.Insert(int(n)) +} + +func (x *nodeset) addAll(y *nodeset) bool { + return x.UnionWith(&y.Sparse) +} + +// Profiling & debugging ------------------------------------------------------- + +var timers = make(map[string]time.Time) + +func start(name string) { + if debugTimers { + timers[name] = time.Now() + log.Printf("%s...\n", name) + } +} + +func stop(name string) { + if debugTimers { + log.Printf("%s took %s\n", name, time.Since(timers[name])) + } +} + +// diff runs the command "diff a b" and reports its success. +func diff(a, b string) bool { + var cmd *exec.Cmd + switch runtime.GOOS { + case "plan9": + cmd = exec.Command("/bin/diff", "-c", a, b) + default: + cmd = exec.Command("/usr/bin/diff", "-u", a, b) + } + cmd.Stdout = os.Stderr + cmd.Stderr = os.Stderr + return cmd.Run() == nil +} diff --git a/vendor/golang.org/x/tools/go/ssa/blockopt.go b/vendor/golang.org/x/tools/go/ssa/blockopt.go new file mode 100644 index 0000000000..e79260a21a --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/blockopt.go @@ -0,0 +1,187 @@ +// Copyright 2013 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 ssa + +// Simple block optimizations to simplify the control flow graph. + +// TODO(adonovan): opt: instead of creating several "unreachable" blocks +// per function in the Builder, reuse a single one (e.g. at Blocks[1]) +// to reduce garbage. + +import ( + "fmt" + "os" +) + +// If true, perform sanity checking and show progress at each +// successive iteration of optimizeBlocks. Very verbose. +const debugBlockOpt = false + +// markReachable sets Index=-1 for all blocks reachable from b. +func markReachable(b *BasicBlock) { + b.Index = -1 + for _, succ := range b.Succs { + if succ.Index == 0 { + markReachable(succ) + } + } +} + +// deleteUnreachableBlocks marks all reachable blocks of f and +// eliminates (nils) all others, including possibly cyclic subgraphs. +// +func deleteUnreachableBlocks(f *Function) { + const white, black = 0, -1 + // We borrow b.Index temporarily as the mark bit. + for _, b := range f.Blocks { + b.Index = white + } + markReachable(f.Blocks[0]) + if f.Recover != nil { + markReachable(f.Recover) + } + for i, b := range f.Blocks { + if b.Index == white { + for _, c := range b.Succs { + if c.Index == black { + c.removePred(b) // delete white->black edge + } + } + if debugBlockOpt { + fmt.Fprintln(os.Stderr, "unreachable", b) + } + f.Blocks[i] = nil // delete b + } + } + f.removeNilBlocks() +} + +// jumpThreading attempts to apply simple jump-threading to block b, +// in which a->b->c become a->c if b is just a Jump. +// The result is true if the optimization was applied. +// +func jumpThreading(f *Function, b *BasicBlock) bool { + if b.Index == 0 { + return false // don't apply to entry block + } + if b.Instrs == nil { + return false + } + if _, ok := b.Instrs[0].(*Jump); !ok { + return false // not just a jump + } + c := b.Succs[0] + if c == b { + return false // don't apply to degenerate jump-to-self. + } + if c.hasPhi() { + return false // not sound without more effort + } + for j, a := range b.Preds { + a.replaceSucc(b, c) + + // If a now has two edges to c, replace its degenerate If by Jump. + if len(a.Succs) == 2 && a.Succs[0] == c && a.Succs[1] == c { + jump := new(Jump) + jump.setBlock(a) + a.Instrs[len(a.Instrs)-1] = jump + a.Succs = a.Succs[:1] + c.removePred(b) + } else { + if j == 0 { + c.replacePred(b, a) + } else { + c.Preds = append(c.Preds, a) + } + } + + if debugBlockOpt { + fmt.Fprintln(os.Stderr, "jumpThreading", a, b, c) + } + } + f.Blocks[b.Index] = nil // delete b + return true +} + +// fuseBlocks attempts to apply the block fusion optimization to block +// a, in which a->b becomes ab if len(a.Succs)==len(b.Preds)==1. +// The result is true if the optimization was applied. +// +func fuseBlocks(f *Function, a *BasicBlock) bool { + if len(a.Succs) != 1 { + return false + } + b := a.Succs[0] + if len(b.Preds) != 1 { + return false + } + + // Degenerate &&/|| ops may result in a straight-line CFG + // containing φ-nodes. (Ideally we'd replace such them with + // their sole operand but that requires Referrers, built later.) + if b.hasPhi() { + return false // not sound without further effort + } + + // Eliminate jump at end of A, then copy all of B across. + a.Instrs = append(a.Instrs[:len(a.Instrs)-1], b.Instrs...) + for _, instr := range b.Instrs { + instr.setBlock(a) + } + + // A inherits B's successors + a.Succs = append(a.succs2[:0], b.Succs...) + + // Fix up Preds links of all successors of B. + for _, c := range b.Succs { + c.replacePred(b, a) + } + + if debugBlockOpt { + fmt.Fprintln(os.Stderr, "fuseBlocks", a, b) + } + + f.Blocks[b.Index] = nil // delete b + return true +} + +// optimizeBlocks() performs some simple block optimizations on a +// completed function: dead block elimination, block fusion, jump +// threading. +// +func optimizeBlocks(f *Function) { + deleteUnreachableBlocks(f) + + // Loop until no further progress. + changed := true + for changed { + changed = false + + if debugBlockOpt { + f.WriteTo(os.Stderr) + mustSanityCheck(f, nil) + } + + for _, b := range f.Blocks { + // f.Blocks will temporarily contain nils to indicate + // deleted blocks; we remove them at the end. + if b == nil { + continue + } + + // Fuse blocks. b->c becomes bc. + if fuseBlocks(f, b) { + changed = true + } + + // a->b->c becomes a->c if b contains only a Jump. + if jumpThreading(f, b) { + changed = true + continue // (b was disconnected) + } + } + } + f.removeNilBlocks() +} diff --git a/vendor/golang.org/x/tools/go/ssa/builder.go b/vendor/golang.org/x/tools/go/ssa/builder.go new file mode 100644 index 0000000000..4707ebeba0 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/builder.go @@ -0,0 +1,2385 @@ +// Copyright 2013 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.5 + +package ssa + +// This file implements the BUILD phase of SSA construction. +// +// SSA construction has two phases, CREATE and BUILD. In the CREATE phase +// (create.go), all packages are constructed and type-checked and +// definitions of all package members are created, method-sets are +// computed, and wrapper methods are synthesized. +// ssa.Packages are created in arbitrary order. +// +// In the BUILD phase (builder.go), the builder traverses the AST of +// each Go source function and generates SSA instructions for the +// function body. Initializer expressions for package-level variables +// are emitted to the package's init() function in the order specified +// by go/types.Info.InitOrder, then code for each function in the +// package is generated in lexical order. +// The BUILD phases for distinct packages are independent and are +// executed in parallel. +// +// TODO(adonovan): indeed, building functions is now embarrassingly parallel. +// Audit for concurrency then benchmark using more goroutines. +// +// The builder's and Program's indices (maps) are populated and +// mutated during the CREATE phase, but during the BUILD phase they +// remain constant. The sole exception is Prog.methodSets and its +// related maps, which are protected by a dedicated mutex. + +import ( + "fmt" + "go/ast" + exact "go/constant" + "go/token" + "go/types" + "os" + "sync" +) + +type opaqueType struct { + types.Type + name string +} + +func (t *opaqueType) String() string { return t.name } + +var ( + varOk = newVar("ok", tBool) + varIndex = newVar("index", tInt) + + // Type constants. + tBool = types.Typ[types.Bool] + tByte = types.Typ[types.Byte] + tInt = types.Typ[types.Int] + tInvalid = types.Typ[types.Invalid] + tString = types.Typ[types.String] + tUntypedNil = types.Typ[types.UntypedNil] + tRangeIter = &opaqueType{nil, "iter"} // the type of all "range" iterators + tEface = new(types.Interface) + + // SSA Value constants. + vZero = intConst(0) + vOne = intConst(1) + vTrue = NewConst(exact.MakeBool(true), tBool) +) + +// builder holds state associated with the package currently being built. +// Its methods contain all the logic for AST-to-SSA conversion. +type builder struct{} + +// cond emits to fn code to evaluate boolean condition e and jump +// to t or f depending on its value, performing various simplifications. +// +// Postcondition: fn.currentBlock is nil. +// +func (b *builder) cond(fn *Function, e ast.Expr, t, f *BasicBlock) { + switch e := e.(type) { + case *ast.ParenExpr: + b.cond(fn, e.X, t, f) + return + + case *ast.BinaryExpr: + switch e.Op { + case token.LAND: + ltrue := fn.newBasicBlock("cond.true") + b.cond(fn, e.X, ltrue, f) + fn.currentBlock = ltrue + b.cond(fn, e.Y, t, f) + return + + case token.LOR: + lfalse := fn.newBasicBlock("cond.false") + b.cond(fn, e.X, t, lfalse) + fn.currentBlock = lfalse + b.cond(fn, e.Y, t, f) + return + } + + case *ast.UnaryExpr: + if e.Op == token.NOT { + b.cond(fn, e.X, f, t) + return + } + } + + // A traditional compiler would simplify "if false" (etc) here + // but we do not, for better fidelity to the source code. + // + // The value of a constant condition may be platform-specific, + // and may cause blocks that are reachable in some configuration + // to be hidden from subsequent analyses such as bug-finding tools. + emitIf(fn, b.expr(fn, e), t, f) +} + +// logicalBinop emits code to fn to evaluate e, a &&- or +// ||-expression whose reified boolean value is wanted. +// The value is returned. +// +func (b *builder) logicalBinop(fn *Function, e *ast.BinaryExpr) Value { + rhs := fn.newBasicBlock("binop.rhs") + done := fn.newBasicBlock("binop.done") + + // T(e) = T(e.X) = T(e.Y) after untyped constants have been + // eliminated. + // TODO(adonovan): not true; MyBool==MyBool yields UntypedBool. + t := fn.Pkg.typeOf(e) + + var short Value // value of the short-circuit path + switch e.Op { + case token.LAND: + b.cond(fn, e.X, rhs, done) + short = NewConst(exact.MakeBool(false), t) + + case token.LOR: + b.cond(fn, e.X, done, rhs) + short = NewConst(exact.MakeBool(true), t) + } + + // Is rhs unreachable? + if rhs.Preds == nil { + // Simplify false&&y to false, true||y to true. + fn.currentBlock = done + return short + } + + // Is done unreachable? + if done.Preds == nil { + // Simplify true&&y (or false||y) to y. + fn.currentBlock = rhs + return b.expr(fn, e.Y) + } + + // All edges from e.X to done carry the short-circuit value. + var edges []Value + for _ = range done.Preds { + edges = append(edges, short) + } + + // The edge from e.Y to done carries the value of e.Y. + fn.currentBlock = rhs + edges = append(edges, b.expr(fn, e.Y)) + emitJump(fn, done) + fn.currentBlock = done + + phi := &Phi{Edges: edges, Comment: e.Op.String()} + phi.pos = e.OpPos + phi.typ = t + return done.emit(phi) +} + +// exprN lowers a multi-result expression e to SSA form, emitting code +// to fn and returning a single Value whose type is a *types.Tuple. +// The caller must access the components via Extract. +// +// Multi-result expressions include CallExprs in a multi-value +// assignment or return statement, and "value,ok" uses of +// TypeAssertExpr, IndexExpr (when X is a map), and UnaryExpr (when Op +// is token.ARROW). +// +func (b *builder) exprN(fn *Function, e ast.Expr) Value { + typ := fn.Pkg.typeOf(e).(*types.Tuple) + switch e := e.(type) { + case *ast.ParenExpr: + return b.exprN(fn, e.X) + + case *ast.CallExpr: + // Currently, no built-in function nor type conversion + // has multiple results, so we can avoid some of the + // cases for single-valued CallExpr. + var c Call + b.setCall(fn, e, &c.Call) + c.typ = typ + return fn.emit(&c) + + case *ast.IndexExpr: + mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map) + lookup := &Lookup{ + X: b.expr(fn, e.X), + Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()), + CommaOk: true, + } + lookup.setType(typ) + lookup.setPos(e.Lbrack) + return fn.emit(lookup) + + case *ast.TypeAssertExpr: + return emitTypeTest(fn, b.expr(fn, e.X), typ.At(0).Type(), e.Lparen) + + case *ast.UnaryExpr: // must be receive <- + unop := &UnOp{ + Op: token.ARROW, + X: b.expr(fn, e.X), + CommaOk: true, + } + unop.setType(typ) + unop.setPos(e.OpPos) + return fn.emit(unop) + } + panic(fmt.Sprintf("exprN(%T) in %s", e, fn)) +} + +// builtin emits to fn SSA instructions to implement a call to the +// built-in function obj with the specified arguments +// and return type. It returns the value defined by the result. +// +// The result is nil if no special handling was required; in this case +// the caller should treat this like an ordinary library function +// call. +// +func (b *builder) builtin(fn *Function, obj *types.Builtin, args []ast.Expr, typ types.Type, pos token.Pos) Value { + switch obj.Name() { + case "make": + switch typ.Underlying().(type) { + case *types.Slice: + n := b.expr(fn, args[1]) + m := n + if len(args) == 3 { + m = b.expr(fn, args[2]) + } + if m, ok := m.(*Const); ok { + // treat make([]T, n, m) as new([m]T)[:n] + cap := m.Int64() + at := types.NewArray(typ.Underlying().(*types.Slice).Elem(), cap) + alloc := emitNew(fn, at, pos) + alloc.Comment = "makeslice" + v := &Slice{ + X: alloc, + High: n, + } + v.setPos(pos) + v.setType(typ) + return fn.emit(v) + } + v := &MakeSlice{ + Len: n, + Cap: m, + } + v.setPos(pos) + v.setType(typ) + return fn.emit(v) + + case *types.Map: + var res Value + if len(args) == 2 { + res = b.expr(fn, args[1]) + } + v := &MakeMap{Reserve: res} + v.setPos(pos) + v.setType(typ) + return fn.emit(v) + + case *types.Chan: + var sz Value = vZero + if len(args) == 2 { + sz = b.expr(fn, args[1]) + } + v := &MakeChan{Size: sz} + v.setPos(pos) + v.setType(typ) + return fn.emit(v) + } + + case "new": + alloc := emitNew(fn, deref(typ), pos) + alloc.Comment = "new" + return alloc + + case "len", "cap": + // Special case: len or cap of an array or *array is + // based on the type, not the value which may be nil. + // We must still evaluate the value, though. (If it + // was side-effect free, the whole call would have + // been constant-folded.) + t := deref(fn.Pkg.typeOf(args[0])).Underlying() + if at, ok := t.(*types.Array); ok { + b.expr(fn, args[0]) // for effects only + return intConst(at.Len()) + } + // Otherwise treat as normal. + + case "panic": + fn.emit(&Panic{ + X: emitConv(fn, b.expr(fn, args[0]), tEface), + pos: pos, + }) + fn.currentBlock = fn.newBasicBlock("unreachable") + return vTrue // any non-nil Value will do + } + return nil // treat all others as a regular function call +} + +// addr lowers a single-result addressable expression e to SSA form, +// emitting code to fn and returning the location (an lvalue) defined +// by the expression. +// +// If escaping is true, addr marks the base variable of the +// addressable expression e as being a potentially escaping pointer +// value. For example, in this code: +// +// a := A{ +// b: [1]B{B{c: 1}} +// } +// return &a.b[0].c +// +// the application of & causes a.b[0].c to have its address taken, +// which means that ultimately the local variable a must be +// heap-allocated. This is a simple but very conservative escape +// analysis. +// +// Operations forming potentially escaping pointers include: +// - &x, including when implicit in method call or composite literals. +// - a[:] iff a is an array (not *array) +// - references to variables in lexically enclosing functions. +// +func (b *builder) addr(fn *Function, e ast.Expr, escaping bool) lvalue { + switch e := e.(type) { + case *ast.Ident: + if isBlankIdent(e) { + return blank{} + } + obj := fn.Pkg.objectOf(e) + v := fn.Prog.packageLevelValue(obj) // var (address) + if v == nil { + v = fn.lookup(obj, escaping) + } + return &address{addr: v, pos: e.Pos(), expr: e} + + case *ast.CompositeLit: + t := deref(fn.Pkg.typeOf(e)) + var v *Alloc + if escaping { + v = emitNew(fn, t, e.Lbrace) + } else { + v = fn.addLocal(t, e.Lbrace) + } + v.Comment = "complit" + var sb storebuf + b.compLit(fn, v, e, true, &sb) + sb.emit(fn) + return &address{addr: v, pos: e.Lbrace, expr: e} + + case *ast.ParenExpr: + return b.addr(fn, e.X, escaping) + + case *ast.SelectorExpr: + sel, ok := fn.Pkg.info.Selections[e] + if !ok { + // qualified identifier + return b.addr(fn, e.Sel, escaping) + } + if sel.Kind() != types.FieldVal { + panic(sel) + } + wantAddr := true + v := b.receiver(fn, e.X, wantAddr, escaping, sel) + last := len(sel.Index()) - 1 + return &address{ + addr: emitFieldSelection(fn, v, sel.Index()[last], true, e.Sel), + pos: e.Sel.Pos(), + expr: e.Sel, + } + + case *ast.IndexExpr: + var x Value + var et types.Type + switch t := fn.Pkg.typeOf(e.X).Underlying().(type) { + case *types.Array: + x = b.addr(fn, e.X, escaping).address(fn) + et = types.NewPointer(t.Elem()) + case *types.Pointer: // *array + x = b.expr(fn, e.X) + et = types.NewPointer(t.Elem().Underlying().(*types.Array).Elem()) + case *types.Slice: + x = b.expr(fn, e.X) + et = types.NewPointer(t.Elem()) + case *types.Map: + return &element{ + m: b.expr(fn, e.X), + k: emitConv(fn, b.expr(fn, e.Index), t.Key()), + t: t.Elem(), + pos: e.Lbrack, + } + default: + panic("unexpected container type in IndexExpr: " + t.String()) + } + v := &IndexAddr{ + X: x, + Index: emitConv(fn, b.expr(fn, e.Index), tInt), + } + v.setPos(e.Lbrack) + v.setType(et) + return &address{addr: fn.emit(v), pos: e.Lbrack, expr: e} + + case *ast.StarExpr: + return &address{addr: b.expr(fn, e.X), pos: e.Star, expr: e} + } + + panic(fmt.Sprintf("unexpected address expression: %T", e)) +} + +type store struct { + lhs lvalue + rhs Value +} + +type storebuf struct{ stores []store } + +func (sb *storebuf) store(lhs lvalue, rhs Value) { + sb.stores = append(sb.stores, store{lhs, rhs}) +} + +func (sb *storebuf) emit(fn *Function) { + for _, s := range sb.stores { + s.lhs.store(fn, s.rhs) + } +} + +// assign emits to fn code to initialize the lvalue loc with the value +// of expression e. If isZero is true, assign assumes that loc holds +// the zero value for its type. +// +// This is equivalent to loc.store(fn, b.expr(fn, e)), but may generate +// better code in some cases, e.g., for composite literals in an +// addressable location. +// +// If sb is not nil, assign generates code to evaluate expression e, but +// not to update loc. Instead, the necessary stores are appended to the +// storebuf sb so that they can be executed later. This allows correct +// in-place update of existing variables when the RHS is a composite +// literal that may reference parts of the LHS. +// +func (b *builder) assign(fn *Function, loc lvalue, e ast.Expr, isZero bool, sb *storebuf) { + // Can we initialize it in place? + if e, ok := unparen(e).(*ast.CompositeLit); ok { + // A CompositeLit never evaluates to a pointer, + // so if the type of the location is a pointer, + // an &-operation is implied. + if _, ok := loc.(blank); !ok { // avoid calling blank.typ() + if isPointer(loc.typ()) { + ptr := b.addr(fn, e, true).address(fn) + // copy address + if sb != nil { + sb.store(loc, ptr) + } else { + loc.store(fn, ptr) + } + return + } + } + + if _, ok := loc.(*address); ok { + if isInterface(loc.typ()) { + // e.g. var x interface{} = T{...} + // Can't in-place initialize an interface value. + // Fall back to copying. + } else { + // x = T{...} or x := T{...} + addr := loc.address(fn) + if sb != nil { + b.compLit(fn, addr, e, isZero, sb) + } else { + var sb storebuf + b.compLit(fn, addr, e, isZero, &sb) + sb.emit(fn) + } + + // Subtle: emit debug ref for aggregate types only; + // slice and map are handled by store ops in compLit. + switch loc.typ().Underlying().(type) { + case *types.Struct, *types.Array: + emitDebugRef(fn, e, addr, true) + } + + return + } + } + } + + // simple case: just copy + rhs := b.expr(fn, e) + if sb != nil { + sb.store(loc, rhs) + } else { + loc.store(fn, rhs) + } +} + +// expr lowers a single-result expression e to SSA form, emitting code +// to fn and returning the Value defined by the expression. +// +func (b *builder) expr(fn *Function, e ast.Expr) Value { + e = unparen(e) + + tv := fn.Pkg.info.Types[e] + + // Is expression a constant? + if tv.Value != nil { + return NewConst(tv.Value, tv.Type) + } + + var v Value + if tv.Addressable() { + // Prefer pointer arithmetic ({Index,Field}Addr) followed + // by Load over subelement extraction (e.g. Index, Field), + // to avoid large copies. + v = b.addr(fn, e, false).load(fn) + } else { + v = b.expr0(fn, e, tv) + } + if fn.debugInfo() { + emitDebugRef(fn, e, v, false) + } + return v +} + +func (b *builder) expr0(fn *Function, e ast.Expr, tv types.TypeAndValue) Value { + switch e := e.(type) { + case *ast.BasicLit: + panic("non-constant BasicLit") // unreachable + + case *ast.FuncLit: + fn2 := &Function{ + name: fmt.Sprintf("%s$%d", fn.Name(), 1+len(fn.AnonFuncs)), + Signature: fn.Pkg.typeOf(e.Type).Underlying().(*types.Signature), + pos: e.Type.Func, + parent: fn, + Pkg: fn.Pkg, + Prog: fn.Prog, + syntax: e, + } + fn.AnonFuncs = append(fn.AnonFuncs, fn2) + b.buildFunction(fn2) + if fn2.FreeVars == nil { + return fn2 + } + v := &MakeClosure{Fn: fn2} + v.setType(tv.Type) + for _, fv := range fn2.FreeVars { + v.Bindings = append(v.Bindings, fv.outer) + fv.outer = nil + } + return fn.emit(v) + + case *ast.TypeAssertExpr: // single-result form only + return emitTypeAssert(fn, b.expr(fn, e.X), tv.Type, e.Lparen) + + case *ast.CallExpr: + if fn.Pkg.info.Types[e.Fun].IsType() { + // Explicit type conversion, e.g. string(x) or big.Int(x) + x := b.expr(fn, e.Args[0]) + y := emitConv(fn, x, tv.Type) + if y != x { + switch y := y.(type) { + case *Convert: + y.pos = e.Lparen + case *ChangeType: + y.pos = e.Lparen + case *MakeInterface: + y.pos = e.Lparen + } + } + return y + } + // Call to "intrinsic" built-ins, e.g. new, make, panic. + if id, ok := unparen(e.Fun).(*ast.Ident); ok { + if obj, ok := fn.Pkg.info.Uses[id].(*types.Builtin); ok { + if v := b.builtin(fn, obj, e.Args, tv.Type, e.Lparen); v != nil { + return v + } + } + } + // Regular function call. + var v Call + b.setCall(fn, e, &v.Call) + v.setType(tv.Type) + return fn.emit(&v) + + case *ast.UnaryExpr: + switch e.Op { + case token.AND: // &X --- potentially escaping. + addr := b.addr(fn, e.X, true) + if _, ok := unparen(e.X).(*ast.StarExpr); ok { + // &*p must panic if p is nil (http://golang.org/s/go12nil). + // For simplicity, we'll just (suboptimally) rely + // on the side effects of a load. + // TODO(adonovan): emit dedicated nilcheck. + addr.load(fn) + } + return addr.address(fn) + case token.ADD: + return b.expr(fn, e.X) + case token.NOT, token.ARROW, token.SUB, token.XOR: // ! <- - ^ + v := &UnOp{ + Op: e.Op, + X: b.expr(fn, e.X), + } + v.setPos(e.OpPos) + v.setType(tv.Type) + return fn.emit(v) + default: + panic(e.Op) + } + + case *ast.BinaryExpr: + switch e.Op { + case token.LAND, token.LOR: + return b.logicalBinop(fn, e) + case token.SHL, token.SHR: + fallthrough + case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT: + return emitArith(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), tv.Type, e.OpPos) + + case token.EQL, token.NEQ, token.GTR, token.LSS, token.LEQ, token.GEQ: + cmp := emitCompare(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), e.OpPos) + // The type of x==y may be UntypedBool. + return emitConv(fn, cmp, DefaultType(tv.Type)) + default: + panic("illegal op in BinaryExpr: " + e.Op.String()) + } + + case *ast.SliceExpr: + var low, high, max Value + var x Value + switch fn.Pkg.typeOf(e.X).Underlying().(type) { + case *types.Array: + // Potentially escaping. + x = b.addr(fn, e.X, true).address(fn) + case *types.Basic, *types.Slice, *types.Pointer: // *array + x = b.expr(fn, e.X) + default: + panic("unreachable") + } + if e.High != nil { + high = b.expr(fn, e.High) + } + if e.Low != nil { + low = b.expr(fn, e.Low) + } + if e.Slice3 { + max = b.expr(fn, e.Max) + } + v := &Slice{ + X: x, + Low: low, + High: high, + Max: max, + } + v.setPos(e.Lbrack) + v.setType(tv.Type) + return fn.emit(v) + + case *ast.Ident: + obj := fn.Pkg.info.Uses[e] + // Universal built-in or nil? + switch obj := obj.(type) { + case *types.Builtin: + return &Builtin{name: obj.Name(), sig: tv.Type.(*types.Signature)} + case *types.Nil: + return nilConst(tv.Type) + } + // Package-level func or var? + if v := fn.Prog.packageLevelValue(obj); v != nil { + if _, ok := obj.(*types.Var); ok { + return emitLoad(fn, v) // var (address) + } + return v // (func) + } + // Local var. + return emitLoad(fn, fn.lookup(obj, false)) // var (address) + + case *ast.SelectorExpr: + sel, ok := fn.Pkg.info.Selections[e] + if !ok { + // qualified identifier + return b.expr(fn, e.Sel) + } + switch sel.Kind() { + case types.MethodExpr: + // (*T).f or T.f, the method f from the method-set of type T. + // The result is a "thunk". + return emitConv(fn, makeThunk(fn.Prog, sel), tv.Type) + + case types.MethodVal: + // e.f where e is an expression and f is a method. + // The result is a "bound". + obj := sel.Obj().(*types.Func) + rt := recvType(obj) + wantAddr := isPointer(rt) + escaping := true + v := b.receiver(fn, e.X, wantAddr, escaping, sel) + if isInterface(rt) { + // If v has interface type I, + // we must emit a check that v is non-nil. + // We use: typeassert v.(I). + emitTypeAssert(fn, v, rt, token.NoPos) + } + c := &MakeClosure{ + Fn: makeBound(fn.Prog, obj), + Bindings: []Value{v}, + } + c.setPos(e.Sel.Pos()) + c.setType(tv.Type) + return fn.emit(c) + + case types.FieldVal: + indices := sel.Index() + last := len(indices) - 1 + v := b.expr(fn, e.X) + v = emitImplicitSelections(fn, v, indices[:last]) + v = emitFieldSelection(fn, v, indices[last], false, e.Sel) + return v + } + + panic("unexpected expression-relative selector") + + case *ast.IndexExpr: + switch t := fn.Pkg.typeOf(e.X).Underlying().(type) { + case *types.Array: + // Non-addressable array (in a register). + v := &Index{ + X: b.expr(fn, e.X), + Index: emitConv(fn, b.expr(fn, e.Index), tInt), + } + v.setPos(e.Lbrack) + v.setType(t.Elem()) + return fn.emit(v) + + case *types.Map: + // Maps are not addressable. + mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map) + v := &Lookup{ + X: b.expr(fn, e.X), + Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()), + } + v.setPos(e.Lbrack) + v.setType(mapt.Elem()) + return fn.emit(v) + + case *types.Basic: // => string + // Strings are not addressable. + v := &Lookup{ + X: b.expr(fn, e.X), + Index: b.expr(fn, e.Index), + } + v.setPos(e.Lbrack) + v.setType(tByte) + return fn.emit(v) + + case *types.Slice, *types.Pointer: // *array + // Addressable slice/array; use IndexAddr and Load. + return b.addr(fn, e, false).load(fn) + + default: + panic("unexpected container type in IndexExpr: " + t.String()) + } + + case *ast.CompositeLit, *ast.StarExpr: + // Addressable types (lvalues) + return b.addr(fn, e, false).load(fn) + } + + panic(fmt.Sprintf("unexpected expr: %T", e)) +} + +// stmtList emits to fn code for all statements in list. +func (b *builder) stmtList(fn *Function, list []ast.Stmt) { + for _, s := range list { + b.stmt(fn, s) + } +} + +// receiver emits to fn code for expression e in the "receiver" +// position of selection e.f (where f may be a field or a method) and +// returns the effective receiver after applying the implicit field +// selections of sel. +// +// wantAddr requests that the result is an an address. If +// !sel.Indirect(), this may require that e be built in addr() mode; it +// must thus be addressable. +// +// escaping is defined as per builder.addr(). +// +func (b *builder) receiver(fn *Function, e ast.Expr, wantAddr, escaping bool, sel *types.Selection) Value { + var v Value + if wantAddr && !sel.Indirect() && !isPointer(fn.Pkg.typeOf(e)) { + v = b.addr(fn, e, escaping).address(fn) + } else { + v = b.expr(fn, e) + } + + last := len(sel.Index()) - 1 + v = emitImplicitSelections(fn, v, sel.Index()[:last]) + if !wantAddr && isPointer(v.Type()) { + v = emitLoad(fn, v) + } + return v +} + +// setCallFunc populates the function parts of a CallCommon structure +// (Func, Method, Recv, Args[0]) based on the kind of invocation +// occurring in e. +// +func (b *builder) setCallFunc(fn *Function, e *ast.CallExpr, c *CallCommon) { + c.pos = e.Lparen + + // Is this a method call? + if selector, ok := unparen(e.Fun).(*ast.SelectorExpr); ok { + sel, ok := fn.Pkg.info.Selections[selector] + if ok && sel.Kind() == types.MethodVal { + obj := sel.Obj().(*types.Func) + recv := recvType(obj) + wantAddr := isPointer(recv) + escaping := true + v := b.receiver(fn, selector.X, wantAddr, escaping, sel) + if isInterface(recv) { + // Invoke-mode call. + c.Value = v + c.Method = obj + } else { + // "Call"-mode call. + c.Value = fn.Prog.declaredFunc(obj) + c.Args = append(c.Args, v) + } + return + } + + // sel.Kind()==MethodExpr indicates T.f() or (*T).f(): + // a statically dispatched call to the method f in the + // method-set of T or *T. T may be an interface. + // + // e.Fun would evaluate to a concrete method, interface + // wrapper function, or promotion wrapper. + // + // For now, we evaluate it in the usual way. + // + // TODO(adonovan): opt: inline expr() here, to make the + // call static and to avoid generation of wrappers. + // It's somewhat tricky as it may consume the first + // actual parameter if the call is "invoke" mode. + // + // Examples: + // type T struct{}; func (T) f() {} // "call" mode + // type T interface { f() } // "invoke" mode + // + // type S struct{ T } + // + // var s S + // S.f(s) + // (*S).f(&s) + // + // Suggested approach: + // - consume the first actual parameter expression + // and build it with b.expr(). + // - apply implicit field selections. + // - use MethodVal logic to populate fields of c. + } + + // Evaluate the function operand in the usual way. + c.Value = b.expr(fn, e.Fun) +} + +// emitCallArgs emits to f code for the actual parameters of call e to +// a (possibly built-in) function of effective type sig. +// The argument values are appended to args, which is then returned. +// +func (b *builder) emitCallArgs(fn *Function, sig *types.Signature, e *ast.CallExpr, args []Value) []Value { + // f(x, y, z...): pass slice z straight through. + if e.Ellipsis != 0 { + for i, arg := range e.Args { + v := emitConv(fn, b.expr(fn, arg), sig.Params().At(i).Type()) + args = append(args, v) + } + return args + } + + offset := len(args) // 1 if call has receiver, 0 otherwise + + // Evaluate actual parameter expressions. + // + // If this is a chained call of the form f(g()) where g has + // multiple return values (MRV), they are flattened out into + // args; a suffix of them may end up in a varargs slice. + for _, arg := range e.Args { + v := b.expr(fn, arg) + if ttuple, ok := v.Type().(*types.Tuple); ok { // MRV chain + for i, n := 0, ttuple.Len(); i < n; i++ { + args = append(args, emitExtract(fn, v, i)) + } + } else { + args = append(args, v) + } + } + + // Actual->formal assignability conversions for normal parameters. + np := sig.Params().Len() // number of normal parameters + if sig.Variadic() { + np-- + } + for i := 0; i < np; i++ { + args[offset+i] = emitConv(fn, args[offset+i], sig.Params().At(i).Type()) + } + + // Actual->formal assignability conversions for variadic parameter, + // and construction of slice. + if sig.Variadic() { + varargs := args[offset+np:] + st := sig.Params().At(np).Type().(*types.Slice) + vt := st.Elem() + if len(varargs) == 0 { + args = append(args, nilConst(st)) + } else { + // Replace a suffix of args with a slice containing it. + at := types.NewArray(vt, int64(len(varargs))) + a := emitNew(fn, at, token.NoPos) + a.setPos(e.Rparen) + a.Comment = "varargs" + for i, arg := range varargs { + iaddr := &IndexAddr{ + X: a, + Index: intConst(int64(i)), + } + iaddr.setType(types.NewPointer(vt)) + fn.emit(iaddr) + emitStore(fn, iaddr, arg, arg.Pos()) + } + s := &Slice{X: a} + s.setType(st) + args[offset+np] = fn.emit(s) + args = args[:offset+np+1] + } + } + return args +} + +// setCall emits to fn code to evaluate all the parameters of a function +// call e, and populates *c with those values. +// +func (b *builder) setCall(fn *Function, e *ast.CallExpr, c *CallCommon) { + // First deal with the f(...) part and optional receiver. + b.setCallFunc(fn, e, c) + + // Then append the other actual parameters. + sig, _ := fn.Pkg.typeOf(e.Fun).Underlying().(*types.Signature) + if sig == nil { + panic(fmt.Sprintf("no signature for call of %s", e.Fun)) + } + c.Args = b.emitCallArgs(fn, sig, e, c.Args) +} + +// assignOp emits to fn code to perform loc += incr or loc -= incr. +func (b *builder) assignOp(fn *Function, loc lvalue, incr Value, op token.Token) { + oldv := loc.load(fn) + loc.store(fn, emitArith(fn, op, oldv, emitConv(fn, incr, oldv.Type()), loc.typ(), token.NoPos)) +} + +// localValueSpec emits to fn code to define all of the vars in the +// function-local ValueSpec, spec. +// +func (b *builder) localValueSpec(fn *Function, spec *ast.ValueSpec) { + switch { + case len(spec.Values) == len(spec.Names): + // e.g. var x, y = 0, 1 + // 1:1 assignment + for i, id := range spec.Names { + if !isBlankIdent(id) { + fn.addLocalForIdent(id) + } + lval := b.addr(fn, id, false) // non-escaping + b.assign(fn, lval, spec.Values[i], true, nil) + } + + case len(spec.Values) == 0: + // e.g. var x, y int + // Locals are implicitly zero-initialized. + for _, id := range spec.Names { + if !isBlankIdent(id) { + lhs := fn.addLocalForIdent(id) + if fn.debugInfo() { + emitDebugRef(fn, id, lhs, true) + } + } + } + + default: + // e.g. var x, y = pos() + tuple := b.exprN(fn, spec.Values[0]) + for i, id := range spec.Names { + if !isBlankIdent(id) { + fn.addLocalForIdent(id) + lhs := b.addr(fn, id, false) // non-escaping + lhs.store(fn, emitExtract(fn, tuple, i)) + } + } + } +} + +// assignStmt emits code to fn for a parallel assignment of rhss to lhss. +// isDef is true if this is a short variable declaration (:=). +// +// Note the similarity with localValueSpec. +// +func (b *builder) assignStmt(fn *Function, lhss, rhss []ast.Expr, isDef bool) { + // Side effects of all LHSs and RHSs must occur in left-to-right order. + lvals := make([]lvalue, len(lhss)) + isZero := make([]bool, len(lhss)) + for i, lhs := range lhss { + var lval lvalue = blank{} + if !isBlankIdent(lhs) { + if isDef { + if obj := fn.Pkg.info.Defs[lhs.(*ast.Ident)]; obj != nil { + fn.addNamedLocal(obj) + isZero[i] = true + } + } + lval = b.addr(fn, lhs, false) // non-escaping + } + lvals[i] = lval + } + if len(lhss) == len(rhss) { + // Simple assignment: x = f() (!isDef) + // Parallel assignment: x, y = f(), g() (!isDef) + // or short var decl: x, y := f(), g() (isDef) + // + // In all cases, the RHSs may refer to the LHSs, + // so we need a storebuf. + var sb storebuf + for i := range rhss { + b.assign(fn, lvals[i], rhss[i], isZero[i], &sb) + } + sb.emit(fn) + } else { + // e.g. x, y = pos() + tuple := b.exprN(fn, rhss[0]) + emitDebugRef(fn, rhss[0], tuple, false) + for i, lval := range lvals { + lval.store(fn, emitExtract(fn, tuple, i)) + } + } +} + +// arrayLen returns the length of the array whose composite literal elements are elts. +func (b *builder) arrayLen(fn *Function, elts []ast.Expr) int64 { + var max int64 = -1 + var i int64 = -1 + for _, e := range elts { + if kv, ok := e.(*ast.KeyValueExpr); ok { + i = b.expr(fn, kv.Key).(*Const).Int64() + } else { + i++ + } + if i > max { + max = i + } + } + return max + 1 +} + +// compLit emits to fn code to initialize a composite literal e at +// address addr with type typ. +// +// Nested composite literals are recursively initialized in place +// where possible. If isZero is true, compLit assumes that addr +// holds the zero value for typ. +// +// Because the elements of a composite literal may refer to the +// variables being updated, as in the second line below, +// x := T{a: 1} +// x = T{a: x.a} +// all the reads must occur before all the writes. Thus all stores to +// loc are emitted to the storebuf sb for later execution. +// +// A CompositeLit may have pointer type only in the recursive (nested) +// case when the type name is implicit. e.g. in []*T{{}}, the inner +// literal has type *T behaves like &T{}. +// In that case, addr must hold a T, not a *T. +// +func (b *builder) compLit(fn *Function, addr Value, e *ast.CompositeLit, isZero bool, sb *storebuf) { + typ := deref(fn.Pkg.typeOf(e)) + switch t := typ.Underlying().(type) { + case *types.Struct: + if !isZero && len(e.Elts) != t.NumFields() { + // memclear + sb.store(&address{addr, e.Lbrace, nil}, + zeroValue(fn, deref(addr.Type()))) + isZero = true + } + for i, e := range e.Elts { + fieldIndex := i + pos := e.Pos() + if kv, ok := e.(*ast.KeyValueExpr); ok { + fname := kv.Key.(*ast.Ident).Name + for i, n := 0, t.NumFields(); i < n; i++ { + sf := t.Field(i) + if sf.Name() == fname { + fieldIndex = i + pos = kv.Colon + e = kv.Value + break + } + } + } + sf := t.Field(fieldIndex) + faddr := &FieldAddr{ + X: addr, + Field: fieldIndex, + } + faddr.setType(types.NewPointer(sf.Type())) + fn.emit(faddr) + b.assign(fn, &address{addr: faddr, pos: pos, expr: e}, e, isZero, sb) + } + + case *types.Array, *types.Slice: + var at *types.Array + var array Value + switch t := t.(type) { + case *types.Slice: + at = types.NewArray(t.Elem(), b.arrayLen(fn, e.Elts)) + alloc := emitNew(fn, at, e.Lbrace) + alloc.Comment = "slicelit" + array = alloc + case *types.Array: + at = t + array = addr + + if !isZero && int64(len(e.Elts)) != at.Len() { + // memclear + sb.store(&address{array, e.Lbrace, nil}, + zeroValue(fn, deref(array.Type()))) + } + } + + var idx *Const + for _, e := range e.Elts { + pos := e.Pos() + if kv, ok := e.(*ast.KeyValueExpr); ok { + idx = b.expr(fn, kv.Key).(*Const) + pos = kv.Colon + e = kv.Value + } else { + var idxval int64 + if idx != nil { + idxval = idx.Int64() + 1 + } + idx = intConst(idxval) + } + iaddr := &IndexAddr{ + X: array, + Index: idx, + } + iaddr.setType(types.NewPointer(at.Elem())) + fn.emit(iaddr) + if t != at { // slice + // backing array is unaliased => storebuf not needed. + b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, nil) + } else { + b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, sb) + } + } + + if t != at { // slice + s := &Slice{X: array} + s.setPos(e.Lbrace) + s.setType(typ) + sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, fn.emit(s)) + } + + case *types.Map: + m := &MakeMap{Reserve: intConst(int64(len(e.Elts)))} + m.setPos(e.Lbrace) + m.setType(typ) + fn.emit(m) + for _, e := range e.Elts { + e := e.(*ast.KeyValueExpr) + + // If a key expression in a map literal is itself a + // composite literal, the type may be omitted. + // For example: + // map[*struct{}]bool{{}: true} + // An &-operation may be implied: + // map[*struct{}]bool{&struct{}{}: true} + var key Value + if _, ok := unparen(e.Key).(*ast.CompositeLit); ok && isPointer(t.Key()) { + // A CompositeLit never evaluates to a pointer, + // so if the type of the location is a pointer, + // an &-operation is implied. + key = b.addr(fn, e.Key, true).address(fn) + } else { + key = b.expr(fn, e.Key) + } + + loc := element{ + m: m, + k: emitConv(fn, key, t.Key()), + t: t.Elem(), + pos: e.Colon, + } + + // We call assign() only because it takes care + // of any &-operation required in the recursive + // case, e.g., + // map[int]*struct{}{0: {}} implies &struct{}{}. + // In-place update is of course impossible, + // and no storebuf is needed. + b.assign(fn, &loc, e.Value, true, nil) + } + sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, m) + + default: + panic("unexpected CompositeLit type: " + t.String()) + } +} + +// switchStmt emits to fn code for the switch statement s, optionally +// labelled by label. +// +func (b *builder) switchStmt(fn *Function, s *ast.SwitchStmt, label *lblock) { + // We treat SwitchStmt like a sequential if-else chain. + // Multiway dispatch can be recovered later by ssautil.Switches() + // to those cases that are free of side effects. + if s.Init != nil { + b.stmt(fn, s.Init) + } + var tag Value = vTrue + if s.Tag != nil { + tag = b.expr(fn, s.Tag) + } + done := fn.newBasicBlock("switch.done") + if label != nil { + label._break = done + } + // We pull the default case (if present) down to the end. + // But each fallthrough label must point to the next + // body block in source order, so we preallocate a + // body block (fallthru) for the next case. + // Unfortunately this makes for a confusing block order. + var dfltBody *[]ast.Stmt + var dfltFallthrough *BasicBlock + var fallthru, dfltBlock *BasicBlock + ncases := len(s.Body.List) + for i, clause := range s.Body.List { + body := fallthru + if body == nil { + body = fn.newBasicBlock("switch.body") // first case only + } + + // Preallocate body block for the next case. + fallthru = done + if i+1 < ncases { + fallthru = fn.newBasicBlock("switch.body") + } + + cc := clause.(*ast.CaseClause) + if cc.List == nil { + // Default case. + dfltBody = &cc.Body + dfltFallthrough = fallthru + dfltBlock = body + continue + } + + var nextCond *BasicBlock + for _, cond := range cc.List { + nextCond = fn.newBasicBlock("switch.next") + // TODO(adonovan): opt: when tag==vTrue, we'd + // get better code if we use b.cond(cond) + // instead of BinOp(EQL, tag, b.expr(cond)) + // followed by If. Don't forget conversions + // though. + cond := emitCompare(fn, token.EQL, tag, b.expr(fn, cond), token.NoPos) + emitIf(fn, cond, body, nextCond) + fn.currentBlock = nextCond + } + fn.currentBlock = body + fn.targets = &targets{ + tail: fn.targets, + _break: done, + _fallthrough: fallthru, + } + b.stmtList(fn, cc.Body) + fn.targets = fn.targets.tail + emitJump(fn, done) + fn.currentBlock = nextCond + } + if dfltBlock != nil { + emitJump(fn, dfltBlock) + fn.currentBlock = dfltBlock + fn.targets = &targets{ + tail: fn.targets, + _break: done, + _fallthrough: dfltFallthrough, + } + b.stmtList(fn, *dfltBody) + fn.targets = fn.targets.tail + } + emitJump(fn, done) + fn.currentBlock = done +} + +// typeSwitchStmt emits to fn code for the type switch statement s, optionally +// labelled by label. +// +func (b *builder) typeSwitchStmt(fn *Function, s *ast.TypeSwitchStmt, label *lblock) { + // We treat TypeSwitchStmt like a sequential if-else chain. + // Multiway dispatch can be recovered later by ssautil.Switches(). + + // Typeswitch lowering: + // + // var x X + // switch y := x.(type) { + // case T1, T2: S1 // >1 (y := x) + // case nil: SN // nil (y := x) + // default: SD // 0 types (y := x) + // case T3: S3 // 1 type (y := x.(T3)) + // } + // + // ...s.Init... + // x := eval x + // .caseT1: + // t1, ok1 := typeswitch,ok x + // if ok1 then goto S1 else goto .caseT2 + // .caseT2: + // t2, ok2 := typeswitch,ok x + // if ok2 then goto S1 else goto .caseNil + // .S1: + // y := x + // ...S1... + // goto done + // .caseNil: + // if t2, ok2 := typeswitch,ok x + // if x == nil then goto SN else goto .caseT3 + // .SN: + // y := x + // ...SN... + // goto done + // .caseT3: + // t3, ok3 := typeswitch,ok x + // if ok3 then goto S3 else goto default + // .S3: + // y := t3 + // ...S3... + // goto done + // .default: + // y := x + // ...SD... + // goto done + // .done: + + if s.Init != nil { + b.stmt(fn, s.Init) + } + + var x Value + switch ass := s.Assign.(type) { + case *ast.ExprStmt: // x.(type) + x = b.expr(fn, unparen(ass.X).(*ast.TypeAssertExpr).X) + case *ast.AssignStmt: // y := x.(type) + x = b.expr(fn, unparen(ass.Rhs[0]).(*ast.TypeAssertExpr).X) + } + + done := fn.newBasicBlock("typeswitch.done") + if label != nil { + label._break = done + } + var default_ *ast.CaseClause + for _, clause := range s.Body.List { + cc := clause.(*ast.CaseClause) + if cc.List == nil { + default_ = cc + continue + } + body := fn.newBasicBlock("typeswitch.body") + var next *BasicBlock + var casetype types.Type + var ti Value // ti, ok := typeassert,ok x + for _, cond := range cc.List { + next = fn.newBasicBlock("typeswitch.next") + casetype = fn.Pkg.typeOf(cond) + var condv Value + if casetype == tUntypedNil { + condv = emitCompare(fn, token.EQL, x, nilConst(x.Type()), token.NoPos) + ti = x + } else { + yok := emitTypeTest(fn, x, casetype, cc.Case) + ti = emitExtract(fn, yok, 0) + condv = emitExtract(fn, yok, 1) + } + emitIf(fn, condv, body, next) + fn.currentBlock = next + } + if len(cc.List) != 1 { + ti = x + } + fn.currentBlock = body + b.typeCaseBody(fn, cc, ti, done) + fn.currentBlock = next + } + if default_ != nil { + b.typeCaseBody(fn, default_, x, done) + } else { + emitJump(fn, done) + } + fn.currentBlock = done +} + +func (b *builder) typeCaseBody(fn *Function, cc *ast.CaseClause, x Value, done *BasicBlock) { + if obj := fn.Pkg.info.Implicits[cc]; obj != nil { + // In a switch y := x.(type), each case clause + // implicitly declares a distinct object y. + // In a single-type case, y has that type. + // In multi-type cases, 'case nil' and default, + // y has the same type as the interface operand. + emitStore(fn, fn.addNamedLocal(obj), x, obj.Pos()) + } + fn.targets = &targets{ + tail: fn.targets, + _break: done, + } + b.stmtList(fn, cc.Body) + fn.targets = fn.targets.tail + emitJump(fn, done) +} + +// selectStmt emits to fn code for the select statement s, optionally +// labelled by label. +// +func (b *builder) selectStmt(fn *Function, s *ast.SelectStmt, label *lblock) { + // A blocking select of a single case degenerates to a + // simple send or receive. + // TODO(adonovan): opt: is this optimization worth its weight? + if len(s.Body.List) == 1 { + clause := s.Body.List[0].(*ast.CommClause) + if clause.Comm != nil { + b.stmt(fn, clause.Comm) + done := fn.newBasicBlock("select.done") + if label != nil { + label._break = done + } + fn.targets = &targets{ + tail: fn.targets, + _break: done, + } + b.stmtList(fn, clause.Body) + fn.targets = fn.targets.tail + emitJump(fn, done) + fn.currentBlock = done + return + } + } + + // First evaluate all channels in all cases, and find + // the directions of each state. + var states []*SelectState + blocking := true + debugInfo := fn.debugInfo() + for _, clause := range s.Body.List { + var st *SelectState + switch comm := clause.(*ast.CommClause).Comm.(type) { + case nil: // default case + blocking = false + continue + + case *ast.SendStmt: // ch<- i + ch := b.expr(fn, comm.Chan) + st = &SelectState{ + Dir: types.SendOnly, + Chan: ch, + Send: emitConv(fn, b.expr(fn, comm.Value), + ch.Type().Underlying().(*types.Chan).Elem()), + Pos: comm.Arrow, + } + if debugInfo { + st.DebugNode = comm + } + + case *ast.AssignStmt: // x := <-ch + recv := unparen(comm.Rhs[0]).(*ast.UnaryExpr) + st = &SelectState{ + Dir: types.RecvOnly, + Chan: b.expr(fn, recv.X), + Pos: recv.OpPos, + } + if debugInfo { + st.DebugNode = recv + } + + case *ast.ExprStmt: // <-ch + recv := unparen(comm.X).(*ast.UnaryExpr) + st = &SelectState{ + Dir: types.RecvOnly, + Chan: b.expr(fn, recv.X), + Pos: recv.OpPos, + } + if debugInfo { + st.DebugNode = recv + } + } + states = append(states, st) + } + + // We dispatch on the (fair) result of Select using a + // sequential if-else chain, in effect: + // + // idx, recvOk, r0...r_n-1 := select(...) + // if idx == 0 { // receive on channel 0 (first receive => r0) + // x, ok := r0, recvOk + // ...state0... + // } else if v == 1 { // send on channel 1 + // ...state1... + // } else { + // ...default... + // } + sel := &Select{ + States: states, + Blocking: blocking, + } + sel.setPos(s.Select) + var vars []*types.Var + vars = append(vars, varIndex, varOk) + for _, st := range states { + if st.Dir == types.RecvOnly { + tElem := st.Chan.Type().Underlying().(*types.Chan).Elem() + vars = append(vars, anonVar(tElem)) + } + } + sel.setType(types.NewTuple(vars...)) + + fn.emit(sel) + idx := emitExtract(fn, sel, 0) + + done := fn.newBasicBlock("select.done") + if label != nil { + label._break = done + } + + var defaultBody *[]ast.Stmt + state := 0 + r := 2 // index in 'sel' tuple of value; increments if st.Dir==RECV + for _, cc := range s.Body.List { + clause := cc.(*ast.CommClause) + if clause.Comm == nil { + defaultBody = &clause.Body + continue + } + body := fn.newBasicBlock("select.body") + next := fn.newBasicBlock("select.next") + emitIf(fn, emitCompare(fn, token.EQL, idx, intConst(int64(state)), token.NoPos), body, next) + fn.currentBlock = body + fn.targets = &targets{ + tail: fn.targets, + _break: done, + } + switch comm := clause.Comm.(type) { + case *ast.ExprStmt: // <-ch + if debugInfo { + v := emitExtract(fn, sel, r) + emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false) + } + r++ + + case *ast.AssignStmt: // x := <-states[state].Chan + if comm.Tok == token.DEFINE { + fn.addLocalForIdent(comm.Lhs[0].(*ast.Ident)) + } + x := b.addr(fn, comm.Lhs[0], false) // non-escaping + v := emitExtract(fn, sel, r) + if debugInfo { + emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false) + } + x.store(fn, v) + + if len(comm.Lhs) == 2 { // x, ok := ... + if comm.Tok == token.DEFINE { + fn.addLocalForIdent(comm.Lhs[1].(*ast.Ident)) + } + ok := b.addr(fn, comm.Lhs[1], false) // non-escaping + ok.store(fn, emitExtract(fn, sel, 1)) + } + r++ + } + b.stmtList(fn, clause.Body) + fn.targets = fn.targets.tail + emitJump(fn, done) + fn.currentBlock = next + state++ + } + if defaultBody != nil { + fn.targets = &targets{ + tail: fn.targets, + _break: done, + } + b.stmtList(fn, *defaultBody) + fn.targets = fn.targets.tail + } else { + // A blocking select must match some case. + // (This should really be a runtime.errorString, not a string.) + fn.emit(&Panic{ + X: emitConv(fn, stringConst("blocking select matched no case"), tEface), + }) + fn.currentBlock = fn.newBasicBlock("unreachable") + } + emitJump(fn, done) + fn.currentBlock = done +} + +// forStmt emits to fn code for the for statement s, optionally +// labelled by label. +// +func (b *builder) forStmt(fn *Function, s *ast.ForStmt, label *lblock) { + // ...init... + // jump loop + // loop: + // if cond goto body else done + // body: + // ...body... + // jump post + // post: (target of continue) + // ...post... + // jump loop + // done: (target of break) + if s.Init != nil { + b.stmt(fn, s.Init) + } + body := fn.newBasicBlock("for.body") + done := fn.newBasicBlock("for.done") // target of 'break' + loop := body // target of back-edge + if s.Cond != nil { + loop = fn.newBasicBlock("for.loop") + } + cont := loop // target of 'continue' + if s.Post != nil { + cont = fn.newBasicBlock("for.post") + } + if label != nil { + label._break = done + label._continue = cont + } + emitJump(fn, loop) + fn.currentBlock = loop + if loop != body { + b.cond(fn, s.Cond, body, done) + fn.currentBlock = body + } + fn.targets = &targets{ + tail: fn.targets, + _break: done, + _continue: cont, + } + b.stmt(fn, s.Body) + fn.targets = fn.targets.tail + emitJump(fn, cont) + + if s.Post != nil { + fn.currentBlock = cont + b.stmt(fn, s.Post) + emitJump(fn, loop) // back-edge + } + fn.currentBlock = done +} + +// rangeIndexed emits to fn the header for an integer-indexed loop +// over array, *array or slice value x. +// The v result is defined only if tv is non-nil. +// forPos is the position of the "for" token. +// +func (b *builder) rangeIndexed(fn *Function, x Value, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) { + // + // length = len(x) + // index = -1 + // loop: (target of continue) + // index++ + // if index < length goto body else done + // body: + // k = index + // v = x[index] + // ...body... + // jump loop + // done: (target of break) + + // Determine number of iterations. + var length Value + if arr, ok := deref(x.Type()).Underlying().(*types.Array); ok { + // For array or *array, the number of iterations is + // known statically thanks to the type. We avoid a + // data dependence upon x, permitting later dead-code + // elimination if x is pure, static unrolling, etc. + // Ranging over a nil *array may have >0 iterations. + // We still generate code for x, in case it has effects. + length = intConst(arr.Len()) + } else { + // length = len(x). + var c Call + c.Call.Value = makeLen(x.Type()) + c.Call.Args = []Value{x} + c.setType(tInt) + length = fn.emit(&c) + } + + index := fn.addLocal(tInt, token.NoPos) + emitStore(fn, index, intConst(-1), pos) + + loop = fn.newBasicBlock("rangeindex.loop") + emitJump(fn, loop) + fn.currentBlock = loop + + incr := &BinOp{ + Op: token.ADD, + X: emitLoad(fn, index), + Y: vOne, + } + incr.setType(tInt) + emitStore(fn, index, fn.emit(incr), pos) + + body := fn.newBasicBlock("rangeindex.body") + done = fn.newBasicBlock("rangeindex.done") + emitIf(fn, emitCompare(fn, token.LSS, incr, length, token.NoPos), body, done) + fn.currentBlock = body + + k = emitLoad(fn, index) + if tv != nil { + switch t := x.Type().Underlying().(type) { + case *types.Array: + instr := &Index{ + X: x, + Index: k, + } + instr.setType(t.Elem()) + v = fn.emit(instr) + + case *types.Pointer: // *array + instr := &IndexAddr{ + X: x, + Index: k, + } + instr.setType(types.NewPointer(t.Elem().Underlying().(*types.Array).Elem())) + v = emitLoad(fn, fn.emit(instr)) + + case *types.Slice: + instr := &IndexAddr{ + X: x, + Index: k, + } + instr.setType(types.NewPointer(t.Elem())) + v = emitLoad(fn, fn.emit(instr)) + + default: + panic("rangeIndexed x:" + t.String()) + } + } + return +} + +// rangeIter emits to fn the header for a loop using +// Range/Next/Extract to iterate over map or string value x. +// tk and tv are the types of the key/value results k and v, or nil +// if the respective component is not wanted. +// +func (b *builder) rangeIter(fn *Function, x Value, tk, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) { + // + // it = range x + // loop: (target of continue) + // okv = next it (ok, key, value) + // ok = extract okv #0 + // if ok goto body else done + // body: + // k = extract okv #1 + // v = extract okv #2 + // ...body... + // jump loop + // done: (target of break) + // + + if tk == nil { + tk = tInvalid + } + if tv == nil { + tv = tInvalid + } + + rng := &Range{X: x} + rng.setPos(pos) + rng.setType(tRangeIter) + it := fn.emit(rng) + + loop = fn.newBasicBlock("rangeiter.loop") + emitJump(fn, loop) + fn.currentBlock = loop + + _, isString := x.Type().Underlying().(*types.Basic) + + okv := &Next{ + Iter: it, + IsString: isString, + } + okv.setType(types.NewTuple( + varOk, + newVar("k", tk), + newVar("v", tv), + )) + fn.emit(okv) + + body := fn.newBasicBlock("rangeiter.body") + done = fn.newBasicBlock("rangeiter.done") + emitIf(fn, emitExtract(fn, okv, 0), body, done) + fn.currentBlock = body + + if tk != tInvalid { + k = emitExtract(fn, okv, 1) + } + if tv != tInvalid { + v = emitExtract(fn, okv, 2) + } + return +} + +// rangeChan emits to fn the header for a loop that receives from +// channel x until it fails. +// tk is the channel's element type, or nil if the k result is +// not wanted +// pos is the position of the '=' or ':=' token. +// +func (b *builder) rangeChan(fn *Function, x Value, tk types.Type, pos token.Pos) (k Value, loop, done *BasicBlock) { + // + // loop: (target of continue) + // ko = <-x (key, ok) + // ok = extract ko #1 + // if ok goto body else done + // body: + // k = extract ko #0 + // ... + // goto loop + // done: (target of break) + + loop = fn.newBasicBlock("rangechan.loop") + emitJump(fn, loop) + fn.currentBlock = loop + recv := &UnOp{ + Op: token.ARROW, + X: x, + CommaOk: true, + } + recv.setPos(pos) + recv.setType(types.NewTuple( + newVar("k", x.Type().Underlying().(*types.Chan).Elem()), + varOk, + )) + ko := fn.emit(recv) + body := fn.newBasicBlock("rangechan.body") + done = fn.newBasicBlock("rangechan.done") + emitIf(fn, emitExtract(fn, ko, 1), body, done) + fn.currentBlock = body + if tk != nil { + k = emitExtract(fn, ko, 0) + } + return +} + +// rangeStmt emits to fn code for the range statement s, optionally +// labelled by label. +// +func (b *builder) rangeStmt(fn *Function, s *ast.RangeStmt, label *lblock) { + var tk, tv types.Type + if s.Key != nil && !isBlankIdent(s.Key) { + tk = fn.Pkg.typeOf(s.Key) + } + if s.Value != nil && !isBlankIdent(s.Value) { + tv = fn.Pkg.typeOf(s.Value) + } + + // If iteration variables are defined (:=), this + // occurs once outside the loop. + // + // Unlike a short variable declaration, a RangeStmt + // using := never redeclares an existing variable; it + // always creates a new one. + if s.Tok == token.DEFINE { + if tk != nil { + fn.addLocalForIdent(s.Key.(*ast.Ident)) + } + if tv != nil { + fn.addLocalForIdent(s.Value.(*ast.Ident)) + } + } + + x := b.expr(fn, s.X) + + var k, v Value + var loop, done *BasicBlock + switch rt := x.Type().Underlying().(type) { + case *types.Slice, *types.Array, *types.Pointer: // *array + k, v, loop, done = b.rangeIndexed(fn, x, tv, s.For) + + case *types.Chan: + k, loop, done = b.rangeChan(fn, x, tk, s.For) + + case *types.Map, *types.Basic: // string + k, v, loop, done = b.rangeIter(fn, x, tk, tv, s.For) + + default: + panic("Cannot range over: " + rt.String()) + } + + // Evaluate both LHS expressions before we update either. + var kl, vl lvalue + if tk != nil { + kl = b.addr(fn, s.Key, false) // non-escaping + } + if tv != nil { + vl = b.addr(fn, s.Value, false) // non-escaping + } + if tk != nil { + kl.store(fn, k) + } + if tv != nil { + vl.store(fn, v) + } + + if label != nil { + label._break = done + label._continue = loop + } + + fn.targets = &targets{ + tail: fn.targets, + _break: done, + _continue: loop, + } + b.stmt(fn, s.Body) + fn.targets = fn.targets.tail + emitJump(fn, loop) // back-edge + fn.currentBlock = done +} + +// stmt lowers statement s to SSA form, emitting code to fn. +func (b *builder) stmt(fn *Function, _s ast.Stmt) { + // The label of the current statement. If non-nil, its _goto + // target is always set; its _break and _continue are set only + // within the body of switch/typeswitch/select/for/range. + // It is effectively an additional default-nil parameter of stmt(). + var label *lblock +start: + switch s := _s.(type) { + case *ast.EmptyStmt: + // ignore. (Usually removed by gofmt.) + + case *ast.DeclStmt: // Con, Var or Typ + d := s.Decl.(*ast.GenDecl) + if d.Tok == token.VAR { + for _, spec := range d.Specs { + if vs, ok := spec.(*ast.ValueSpec); ok { + b.localValueSpec(fn, vs) + } + } + } + + case *ast.LabeledStmt: + label = fn.labelledBlock(s.Label) + emitJump(fn, label._goto) + fn.currentBlock = label._goto + _s = s.Stmt + goto start // effectively: tailcall stmt(fn, s.Stmt, label) + + case *ast.ExprStmt: + b.expr(fn, s.X) + + case *ast.SendStmt: + fn.emit(&Send{ + Chan: b.expr(fn, s.Chan), + X: emitConv(fn, b.expr(fn, s.Value), + fn.Pkg.typeOf(s.Chan).Underlying().(*types.Chan).Elem()), + pos: s.Arrow, + }) + + case *ast.IncDecStmt: + op := token.ADD + if s.Tok == token.DEC { + op = token.SUB + } + loc := b.addr(fn, s.X, false) + b.assignOp(fn, loc, NewConst(exact.MakeInt64(1), loc.typ()), op) + + case *ast.AssignStmt: + switch s.Tok { + case token.ASSIGN, token.DEFINE: + b.assignStmt(fn, s.Lhs, s.Rhs, s.Tok == token.DEFINE) + + default: // +=, etc. + op := s.Tok + token.ADD - token.ADD_ASSIGN + b.assignOp(fn, b.addr(fn, s.Lhs[0], false), b.expr(fn, s.Rhs[0]), op) + } + + case *ast.GoStmt: + // The "intrinsics" new/make/len/cap are forbidden here. + // panic is treated like an ordinary function call. + v := Go{pos: s.Go} + b.setCall(fn, s.Call, &v.Call) + fn.emit(&v) + + case *ast.DeferStmt: + // The "intrinsics" new/make/len/cap are forbidden here. + // panic is treated like an ordinary function call. + v := Defer{pos: s.Defer} + b.setCall(fn, s.Call, &v.Call) + fn.emit(&v) + + // A deferred call can cause recovery from panic, + // and control resumes at the Recover block. + createRecoverBlock(fn) + + case *ast.ReturnStmt: + var results []Value + if len(s.Results) == 1 && fn.Signature.Results().Len() > 1 { + // Return of one expression in a multi-valued function. + tuple := b.exprN(fn, s.Results[0]) + ttuple := tuple.Type().(*types.Tuple) + for i, n := 0, ttuple.Len(); i < n; i++ { + results = append(results, + emitConv(fn, emitExtract(fn, tuple, i), + fn.Signature.Results().At(i).Type())) + } + } else { + // 1:1 return, or no-arg return in non-void function. + for i, r := range s.Results { + v := emitConv(fn, b.expr(fn, r), fn.Signature.Results().At(i).Type()) + results = append(results, v) + } + } + if fn.namedResults != nil { + // Function has named result parameters (NRPs). + // Perform parallel assignment of return operands to NRPs. + for i, r := range results { + emitStore(fn, fn.namedResults[i], r, s.Return) + } + } + // Run function calls deferred in this + // function when explicitly returning from it. + fn.emit(new(RunDefers)) + if fn.namedResults != nil { + // Reload NRPs to form the result tuple. + results = results[:0] + for _, r := range fn.namedResults { + results = append(results, emitLoad(fn, r)) + } + } + fn.emit(&Return{Results: results, pos: s.Return}) + fn.currentBlock = fn.newBasicBlock("unreachable") + + case *ast.BranchStmt: + var block *BasicBlock + switch s.Tok { + case token.BREAK: + if s.Label != nil { + block = fn.labelledBlock(s.Label)._break + } else { + for t := fn.targets; t != nil && block == nil; t = t.tail { + block = t._break + } + } + + case token.CONTINUE: + if s.Label != nil { + block = fn.labelledBlock(s.Label)._continue + } else { + for t := fn.targets; t != nil && block == nil; t = t.tail { + block = t._continue + } + } + + case token.FALLTHROUGH: + for t := fn.targets; t != nil && block == nil; t = t.tail { + block = t._fallthrough + } + + case token.GOTO: + block = fn.labelledBlock(s.Label)._goto + } + emitJump(fn, block) + fn.currentBlock = fn.newBasicBlock("unreachable") + + case *ast.BlockStmt: + b.stmtList(fn, s.List) + + case *ast.IfStmt: + if s.Init != nil { + b.stmt(fn, s.Init) + } + then := fn.newBasicBlock("if.then") + done := fn.newBasicBlock("if.done") + els := done + if s.Else != nil { + els = fn.newBasicBlock("if.else") + } + b.cond(fn, s.Cond, then, els) + fn.currentBlock = then + b.stmt(fn, s.Body) + emitJump(fn, done) + + if s.Else != nil { + fn.currentBlock = els + b.stmt(fn, s.Else) + emitJump(fn, done) + } + + fn.currentBlock = done + + case *ast.SwitchStmt: + b.switchStmt(fn, s, label) + + case *ast.TypeSwitchStmt: + b.typeSwitchStmt(fn, s, label) + + case *ast.SelectStmt: + b.selectStmt(fn, s, label) + + case *ast.ForStmt: + b.forStmt(fn, s, label) + + case *ast.RangeStmt: + b.rangeStmt(fn, s, label) + + default: + panic(fmt.Sprintf("unexpected statement kind: %T", s)) + } +} + +// buildFunction builds SSA code for the body of function fn. Idempotent. +func (b *builder) buildFunction(fn *Function) { + if fn.Blocks != nil { + return // building already started + } + + var recvField *ast.FieldList + var body *ast.BlockStmt + var functype *ast.FuncType + switch n := fn.syntax.(type) { + case nil: + return // not a Go source function. (Synthetic, or from object file.) + case *ast.FuncDecl: + functype = n.Type + recvField = n.Recv + body = n.Body + case *ast.FuncLit: + functype = n.Type + body = n.Body + default: + panic(n) + } + + if body == nil { + // External function. + if fn.Params == nil { + // This condition ensures we add a non-empty + // params list once only, but we may attempt + // the degenerate empty case repeatedly. + // TODO(adonovan): opt: don't do that. + + // We set Function.Params even though there is no body + // code to reference them. This simplifies clients. + if recv := fn.Signature.Recv(); recv != nil { + fn.addParamObj(recv) + } + params := fn.Signature.Params() + for i, n := 0, params.Len(); i < n; i++ { + fn.addParamObj(params.At(i)) + } + } + return + } + if fn.Prog.mode&LogSource != 0 { + defer logStack("build function %s @ %s", fn, fn.Prog.Fset.Position(fn.pos))() + } + fn.startBody() + fn.createSyntacticParams(recvField, functype) + b.stmt(fn, body) + if cb := fn.currentBlock; cb != nil && (cb == fn.Blocks[0] || cb == fn.Recover || cb.Preds != nil) { + // Control fell off the end of the function's body block. + // + // Block optimizations eliminate the current block, if + // unreachable. It is a builder invariant that + // if this no-arg return is ill-typed for + // fn.Signature.Results, this block must be + // unreachable. The sanity checker checks this. + fn.emit(new(RunDefers)) + fn.emit(new(Return)) + } + fn.finishBody() +} + +// buildFuncDecl builds SSA code for the function or method declared +// by decl in package pkg. +// +func (b *builder) buildFuncDecl(pkg *Package, decl *ast.FuncDecl) { + id := decl.Name + if isBlankIdent(id) { + return // discard + } + fn := pkg.values[pkg.info.Defs[id]].(*Function) + if decl.Recv == nil && id.Name == "init" { + var v Call + v.Call.Value = fn + v.setType(types.NewTuple()) + pkg.init.emit(&v) + } + b.buildFunction(fn) +} + +// BuildAll calls Package.Build() for each package in prog. +// Building occurs in parallel unless the BuildSerially mode flag was set. +// +// BuildAll is intended for whole-program analysis; a typical compiler +// need only build a single package. +// +// BuildAll is idempotent and thread-safe. +// +func (prog *Program) Build() { + var wg sync.WaitGroup + for _, p := range prog.packages { + if prog.mode&BuildSerially != 0 { + p.Build() + } else { + wg.Add(1) + go func(p *Package) { + p.Build() + wg.Done() + }(p) + } + } + wg.Wait() +} + +// Build builds SSA code for all functions and vars in package p. +// +// Precondition: CreatePackage must have been called for all of p's +// direct imports (and hence its direct imports must have been +// error-free). +// +// Build is idempotent and thread-safe. +// +func (p *Package) Build() { p.buildOnce.Do(p.build) } + +func (p *Package) build() { + if p.info == nil { + return // synthetic package, e.g. "testmain" + } + if p.files == nil { + p.info = nil + return // package loaded from export data + } + + // Ensure we have runtime type info for all exported members. + // TODO(adonovan): ideally belongs in memberFromObject, but + // that would require package creation in topological order. + for name, mem := range p.Members { + if ast.IsExported(name) { + p.Prog.needMethodsOf(mem.Type()) + } + } + if p.Prog.mode&LogSource != 0 { + defer logStack("build %s", p)() + } + init := p.init + init.startBody() + + var done *BasicBlock + + if p.Prog.mode&BareInits == 0 { + // Make init() skip if package is already initialized. + initguard := p.Var("init$guard") + doinit := init.newBasicBlock("init.start") + done = init.newBasicBlock("init.done") + emitIf(init, emitLoad(init, initguard), done, doinit) + init.currentBlock = doinit + emitStore(init, initguard, vTrue, token.NoPos) + + // Call the init() function of each package we import. + for _, pkg := range p.Pkg.Imports() { + prereq := p.Prog.packages[pkg] + if prereq == nil { + panic(fmt.Sprintf("Package(%q).Build(): unsatisfied import: Program.CreatePackage(%q) was not called", p.Pkg.Path(), pkg.Path())) + } + var v Call + v.Call.Value = prereq.init + v.Call.pos = init.pos + v.setType(types.NewTuple()) + init.emit(&v) + } + } + + var b builder + + // Initialize package-level vars in correct order. + for _, varinit := range p.info.InitOrder { + if init.Prog.mode&LogSource != 0 { + fmt.Fprintf(os.Stderr, "build global initializer %v @ %s\n", + varinit.Lhs, p.Prog.Fset.Position(varinit.Rhs.Pos())) + } + if len(varinit.Lhs) == 1 { + // 1:1 initialization: var x, y = a(), b() + var lval lvalue + if v := varinit.Lhs[0]; v.Name() != "_" { + lval = &address{addr: p.values[v].(*Global), pos: v.Pos()} + } else { + lval = blank{} + } + b.assign(init, lval, varinit.Rhs, true, nil) + } else { + // n:1 initialization: var x, y := f() + tuple := b.exprN(init, varinit.Rhs) + for i, v := range varinit.Lhs { + if v.Name() == "_" { + continue + } + emitStore(init, p.values[v].(*Global), emitExtract(init, tuple, i), v.Pos()) + } + } + } + + // Build all package-level functions, init functions + // and methods, including unreachable/blank ones. + // We build them in source order, but it's not significant. + for _, file := range p.files { + for _, decl := range file.Decls { + if decl, ok := decl.(*ast.FuncDecl); ok { + b.buildFuncDecl(p, decl) + } + } + } + + // Finish up init(). + if p.Prog.mode&BareInits == 0 { + emitJump(init, done) + init.currentBlock = done + } + init.emit(new(Return)) + init.finishBody() + + p.info = nil // We no longer need ASTs or go/types deductions. + + if p.Prog.mode&SanityCheckFunctions != 0 { + sanityCheckPackage(p) + } +} + +// Like ObjectOf, but panics instead of returning nil. +// Only valid during p's create and build phases. +func (p *Package) objectOf(id *ast.Ident) types.Object { + if o := p.info.ObjectOf(id); o != nil { + return o + } + panic(fmt.Sprintf("no types.Object for ast.Ident %s @ %s", + id.Name, p.Prog.Fset.Position(id.Pos()))) +} + +// Like TypeOf, but panics instead of returning nil. +// Only valid during p's create and build phases. +func (p *Package) typeOf(e ast.Expr) types.Type { + if T := p.info.TypeOf(e); T != nil { + return T + } + panic(fmt.Sprintf("no type for %T @ %s", + e, p.Prog.Fset.Position(e.Pos()))) +} diff --git a/vendor/golang.org/x/tools/go/ssa/builder14.go b/vendor/golang.org/x/tools/go/ssa/builder14.go new file mode 100644 index 0000000000..fcc4b928e7 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/builder14.go @@ -0,0 +1,2386 @@ +// Copyright 2013 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.5 + +package ssa + +// This file implements the BUILD phase of SSA construction. +// +// SSA construction has two phases, CREATE and BUILD. In the CREATE phase +// (create.go), all packages are constructed and type-checked and +// definitions of all package members are created, method-sets are +// computed, and wrapper methods are synthesized. +// ssa.Packages are created in arbitrary order. +// +// In the BUILD phase (builder.go), the builder traverses the AST of +// each Go source function and generates SSA instructions for the +// function body. Initializer expressions for package-level variables +// are emitted to the package's init() function in the order specified +// by go/types.Info.InitOrder, then code for each function in the +// package is generated in lexical order. +// The BUILD phases for distinct packages are independent and are +// executed in parallel. +// +// TODO(adonovan): indeed, building functions is now embarrassingly parallel. +// Audit for concurrency then benchmark using more goroutines. +// +// The builder's and Program's indices (maps) are populated and +// mutated during the CREATE phase, but during the BUILD phase they +// remain constant. The sole exception is Prog.methodSets and its +// related maps, which are protected by a dedicated mutex. + +import ( + "fmt" + "go/ast" + "go/token" + "os" + "sync" + + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/types" +) + +type opaqueType struct { + types.Type + name string +} + +func (t *opaqueType) String() string { return t.name } + +var ( + varOk = newVar("ok", tBool) + varIndex = newVar("index", tInt) + + // Type constants. + tBool = types.Typ[types.Bool] + tByte = types.Typ[types.Byte] + tInt = types.Typ[types.Int] + tInvalid = types.Typ[types.Invalid] + tString = types.Typ[types.String] + tUntypedNil = types.Typ[types.UntypedNil] + tRangeIter = &opaqueType{nil, "iter"} // the type of all "range" iterators + tEface = new(types.Interface) + + // SSA Value constants. + vZero = intConst(0) + vOne = intConst(1) + vTrue = NewConst(exact.MakeBool(true), tBool) +) + +// builder holds state associated with the package currently being built. +// Its methods contain all the logic for AST-to-SSA conversion. +type builder struct{} + +// cond emits to fn code to evaluate boolean condition e and jump +// to t or f depending on its value, performing various simplifications. +// +// Postcondition: fn.currentBlock is nil. +// +func (b *builder) cond(fn *Function, e ast.Expr, t, f *BasicBlock) { + switch e := e.(type) { + case *ast.ParenExpr: + b.cond(fn, e.X, t, f) + return + + case *ast.BinaryExpr: + switch e.Op { + case token.LAND: + ltrue := fn.newBasicBlock("cond.true") + b.cond(fn, e.X, ltrue, f) + fn.currentBlock = ltrue + b.cond(fn, e.Y, t, f) + return + + case token.LOR: + lfalse := fn.newBasicBlock("cond.false") + b.cond(fn, e.X, t, lfalse) + fn.currentBlock = lfalse + b.cond(fn, e.Y, t, f) + return + } + + case *ast.UnaryExpr: + if e.Op == token.NOT { + b.cond(fn, e.X, f, t) + return + } + } + + // A traditional compiler would simplify "if false" (etc) here + // but we do not, for better fidelity to the source code. + // + // The value of a constant condition may be platform-specific, + // and may cause blocks that are reachable in some configuration + // to be hidden from subsequent analyses such as bug-finding tools. + emitIf(fn, b.expr(fn, e), t, f) +} + +// logicalBinop emits code to fn to evaluate e, a &&- or +// ||-expression whose reified boolean value is wanted. +// The value is returned. +// +func (b *builder) logicalBinop(fn *Function, e *ast.BinaryExpr) Value { + rhs := fn.newBasicBlock("binop.rhs") + done := fn.newBasicBlock("binop.done") + + // T(e) = T(e.X) = T(e.Y) after untyped constants have been + // eliminated. + // TODO(adonovan): not true; MyBool==MyBool yields UntypedBool. + t := fn.Pkg.typeOf(e) + + var short Value // value of the short-circuit path + switch e.Op { + case token.LAND: + b.cond(fn, e.X, rhs, done) + short = NewConst(exact.MakeBool(false), t) + + case token.LOR: + b.cond(fn, e.X, done, rhs) + short = NewConst(exact.MakeBool(true), t) + } + + // Is rhs unreachable? + if rhs.Preds == nil { + // Simplify false&&y to false, true||y to true. + fn.currentBlock = done + return short + } + + // Is done unreachable? + if done.Preds == nil { + // Simplify true&&y (or false||y) to y. + fn.currentBlock = rhs + return b.expr(fn, e.Y) + } + + // All edges from e.X to done carry the short-circuit value. + var edges []Value + for _ = range done.Preds { + edges = append(edges, short) + } + + // The edge from e.Y to done carries the value of e.Y. + fn.currentBlock = rhs + edges = append(edges, b.expr(fn, e.Y)) + emitJump(fn, done) + fn.currentBlock = done + + phi := &Phi{Edges: edges, Comment: e.Op.String()} + phi.pos = e.OpPos + phi.typ = t + return done.emit(phi) +} + +// exprN lowers a multi-result expression e to SSA form, emitting code +// to fn and returning a single Value whose type is a *types.Tuple. +// The caller must access the components via Extract. +// +// Multi-result expressions include CallExprs in a multi-value +// assignment or return statement, and "value,ok" uses of +// TypeAssertExpr, IndexExpr (when X is a map), and UnaryExpr (when Op +// is token.ARROW). +// +func (b *builder) exprN(fn *Function, e ast.Expr) Value { + typ := fn.Pkg.typeOf(e).(*types.Tuple) + switch e := e.(type) { + case *ast.ParenExpr: + return b.exprN(fn, e.X) + + case *ast.CallExpr: + // Currently, no built-in function nor type conversion + // has multiple results, so we can avoid some of the + // cases for single-valued CallExpr. + var c Call + b.setCall(fn, e, &c.Call) + c.typ = typ + return fn.emit(&c) + + case *ast.IndexExpr: + mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map) + lookup := &Lookup{ + X: b.expr(fn, e.X), + Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()), + CommaOk: true, + } + lookup.setType(typ) + lookup.setPos(e.Lbrack) + return fn.emit(lookup) + + case *ast.TypeAssertExpr: + return emitTypeTest(fn, b.expr(fn, e.X), typ.At(0).Type(), e.Lparen) + + case *ast.UnaryExpr: // must be receive <- + unop := &UnOp{ + Op: token.ARROW, + X: b.expr(fn, e.X), + CommaOk: true, + } + unop.setType(typ) + unop.setPos(e.OpPos) + return fn.emit(unop) + } + panic(fmt.Sprintf("exprN(%T) in %s", e, fn)) +} + +// builtin emits to fn SSA instructions to implement a call to the +// built-in function obj with the specified arguments +// and return type. It returns the value defined by the result. +// +// The result is nil if no special handling was required; in this case +// the caller should treat this like an ordinary library function +// call. +// +func (b *builder) builtin(fn *Function, obj *types.Builtin, args []ast.Expr, typ types.Type, pos token.Pos) Value { + switch obj.Name() { + case "make": + switch typ.Underlying().(type) { + case *types.Slice: + n := b.expr(fn, args[1]) + m := n + if len(args) == 3 { + m = b.expr(fn, args[2]) + } + if m, ok := m.(*Const); ok { + // treat make([]T, n, m) as new([m]T)[:n] + cap, _ := exact.Int64Val(m.Value) + at := types.NewArray(typ.Underlying().(*types.Slice).Elem(), cap) + alloc := emitNew(fn, at, pos) + alloc.Comment = "makeslice" + v := &Slice{ + X: alloc, + High: n, + } + v.setPos(pos) + v.setType(typ) + return fn.emit(v) + } + v := &MakeSlice{ + Len: n, + Cap: m, + } + v.setPos(pos) + v.setType(typ) + return fn.emit(v) + + case *types.Map: + var res Value + if len(args) == 2 { + res = b.expr(fn, args[1]) + } + v := &MakeMap{Reserve: res} + v.setPos(pos) + v.setType(typ) + return fn.emit(v) + + case *types.Chan: + var sz Value = vZero + if len(args) == 2 { + sz = b.expr(fn, args[1]) + } + v := &MakeChan{Size: sz} + v.setPos(pos) + v.setType(typ) + return fn.emit(v) + } + + case "new": + alloc := emitNew(fn, deref(typ), pos) + alloc.Comment = "new" + return alloc + + case "len", "cap": + // Special case: len or cap of an array or *array is + // based on the type, not the value which may be nil. + // We must still evaluate the value, though. (If it + // was side-effect free, the whole call would have + // been constant-folded.) + t := deref(fn.Pkg.typeOf(args[0])).Underlying() + if at, ok := t.(*types.Array); ok { + b.expr(fn, args[0]) // for effects only + return intConst(at.Len()) + } + // Otherwise treat as normal. + + case "panic": + fn.emit(&Panic{ + X: emitConv(fn, b.expr(fn, args[0]), tEface), + pos: pos, + }) + fn.currentBlock = fn.newBasicBlock("unreachable") + return vTrue // any non-nil Value will do + } + return nil // treat all others as a regular function call +} + +// addr lowers a single-result addressable expression e to SSA form, +// emitting code to fn and returning the location (an lvalue) defined +// by the expression. +// +// If escaping is true, addr marks the base variable of the +// addressable expression e as being a potentially escaping pointer +// value. For example, in this code: +// +// a := A{ +// b: [1]B{B{c: 1}} +// } +// return &a.b[0].c +// +// the application of & causes a.b[0].c to have its address taken, +// which means that ultimately the local variable a must be +// heap-allocated. This is a simple but very conservative escape +// analysis. +// +// Operations forming potentially escaping pointers include: +// - &x, including when implicit in method call or composite literals. +// - a[:] iff a is an array (not *array) +// - references to variables in lexically enclosing functions. +// +func (b *builder) addr(fn *Function, e ast.Expr, escaping bool) lvalue { + switch e := e.(type) { + case *ast.Ident: + if isBlankIdent(e) { + return blank{} + } + obj := fn.Pkg.objectOf(e) + v := fn.Prog.packageLevelValue(obj) // var (address) + if v == nil { + v = fn.lookup(obj, escaping) + } + return &address{addr: v, pos: e.Pos(), expr: e} + + case *ast.CompositeLit: + t := deref(fn.Pkg.typeOf(e)) + var v *Alloc + if escaping { + v = emitNew(fn, t, e.Lbrace) + } else { + v = fn.addLocal(t, e.Lbrace) + } + v.Comment = "complit" + var sb storebuf + b.compLit(fn, v, e, true, &sb) + sb.emit(fn) + return &address{addr: v, pos: e.Lbrace, expr: e} + + case *ast.ParenExpr: + return b.addr(fn, e.X, escaping) + + case *ast.SelectorExpr: + sel, ok := fn.Pkg.info.Selections[e] + if !ok { + // qualified identifier + return b.addr(fn, e.Sel, escaping) + } + if sel.Kind() != types.FieldVal { + panic(sel) + } + wantAddr := true + v := b.receiver(fn, e.X, wantAddr, escaping, sel) + last := len(sel.Index()) - 1 + return &address{ + addr: emitFieldSelection(fn, v, sel.Index()[last], true, e.Sel), + pos: e.Sel.Pos(), + expr: e.Sel, + } + + case *ast.IndexExpr: + var x Value + var et types.Type + switch t := fn.Pkg.typeOf(e.X).Underlying().(type) { + case *types.Array: + x = b.addr(fn, e.X, escaping).address(fn) + et = types.NewPointer(t.Elem()) + case *types.Pointer: // *array + x = b.expr(fn, e.X) + et = types.NewPointer(t.Elem().Underlying().(*types.Array).Elem()) + case *types.Slice: + x = b.expr(fn, e.X) + et = types.NewPointer(t.Elem()) + case *types.Map: + return &element{ + m: b.expr(fn, e.X), + k: emitConv(fn, b.expr(fn, e.Index), t.Key()), + t: t.Elem(), + pos: e.Lbrack, + } + default: + panic("unexpected container type in IndexExpr: " + t.String()) + } + v := &IndexAddr{ + X: x, + Index: emitConv(fn, b.expr(fn, e.Index), tInt), + } + v.setPos(e.Lbrack) + v.setType(et) + return &address{addr: fn.emit(v), pos: e.Lbrack, expr: e} + + case *ast.StarExpr: + return &address{addr: b.expr(fn, e.X), pos: e.Star, expr: e} + } + + panic(fmt.Sprintf("unexpected address expression: %T", e)) +} + +type store struct { + lhs lvalue + rhs Value +} + +type storebuf struct{ stores []store } + +func (sb *storebuf) store(lhs lvalue, rhs Value) { + sb.stores = append(sb.stores, store{lhs, rhs}) +} + +func (sb *storebuf) emit(fn *Function) { + for _, s := range sb.stores { + s.lhs.store(fn, s.rhs) + } +} + +// assign emits to fn code to initialize the lvalue loc with the value +// of expression e. If isZero is true, assign assumes that loc holds +// the zero value for its type. +// +// This is equivalent to loc.store(fn, b.expr(fn, e)), but may generate +// better code in some cases, e.g., for composite literals in an +// addressable location. +// +// If sb is not nil, assign generates code to evaluate expression e, but +// not to update loc. Instead, the necessary stores are appended to the +// storebuf sb so that they can be executed later. This allows correct +// in-place update of existing variables when the RHS is a composite +// literal that may reference parts of the LHS. +// +func (b *builder) assign(fn *Function, loc lvalue, e ast.Expr, isZero bool, sb *storebuf) { + // Can we initialize it in place? + if e, ok := unparen(e).(*ast.CompositeLit); ok { + // A CompositeLit never evaluates to a pointer, + // so if the type of the location is a pointer, + // an &-operation is implied. + if _, ok := loc.(blank); !ok { // avoid calling blank.typ() + if isPointer(loc.typ()) { + ptr := b.addr(fn, e, true).address(fn) + // copy address + if sb != nil { + sb.store(loc, ptr) + } else { + loc.store(fn, ptr) + } + return + } + } + + if _, ok := loc.(*address); ok { + if isInterface(loc.typ()) { + // e.g. var x interface{} = T{...} + // Can't in-place initialize an interface value. + // Fall back to copying. + } else { + // x = T{...} or x := T{...} + addr := loc.address(fn) + if sb != nil { + b.compLit(fn, addr, e, isZero, sb) + } else { + var sb storebuf + b.compLit(fn, addr, e, isZero, &sb) + sb.emit(fn) + } + + // Subtle: emit debug ref for aggregate types only; + // slice and map are handled by store ops in compLit. + switch loc.typ().Underlying().(type) { + case *types.Struct, *types.Array: + emitDebugRef(fn, e, addr, true) + } + + return + } + } + } + + // simple case: just copy + rhs := b.expr(fn, e) + if sb != nil { + sb.store(loc, rhs) + } else { + loc.store(fn, rhs) + } +} + +// expr lowers a single-result expression e to SSA form, emitting code +// to fn and returning the Value defined by the expression. +// +func (b *builder) expr(fn *Function, e ast.Expr) Value { + e = unparen(e) + + tv := fn.Pkg.info.Types[e] + + // Is expression a constant? + if tv.Value != nil { + return NewConst(tv.Value, tv.Type) + } + + var v Value + if tv.Addressable() { + // Prefer pointer arithmetic ({Index,Field}Addr) followed + // by Load over subelement extraction (e.g. Index, Field), + // to avoid large copies. + v = b.addr(fn, e, false).load(fn) + } else { + v = b.expr0(fn, e, tv) + } + if fn.debugInfo() { + emitDebugRef(fn, e, v, false) + } + return v +} + +func (b *builder) expr0(fn *Function, e ast.Expr, tv types.TypeAndValue) Value { + switch e := e.(type) { + case *ast.BasicLit: + panic("non-constant BasicLit") // unreachable + + case *ast.FuncLit: + fn2 := &Function{ + name: fmt.Sprintf("%s$%d", fn.Name(), 1+len(fn.AnonFuncs)), + Signature: fn.Pkg.typeOf(e.Type).Underlying().(*types.Signature), + pos: e.Type.Func, + parent: fn, + Pkg: fn.Pkg, + Prog: fn.Prog, + syntax: e, + } + fn.AnonFuncs = append(fn.AnonFuncs, fn2) + b.buildFunction(fn2) + if fn2.FreeVars == nil { + return fn2 + } + v := &MakeClosure{Fn: fn2} + v.setType(tv.Type) + for _, fv := range fn2.FreeVars { + v.Bindings = append(v.Bindings, fv.outer) + fv.outer = nil + } + return fn.emit(v) + + case *ast.TypeAssertExpr: // single-result form only + return emitTypeAssert(fn, b.expr(fn, e.X), tv.Type, e.Lparen) + + case *ast.CallExpr: + if fn.Pkg.info.Types[e.Fun].IsType() { + // Explicit type conversion, e.g. string(x) or big.Int(x) + x := b.expr(fn, e.Args[0]) + y := emitConv(fn, x, tv.Type) + if y != x { + switch y := y.(type) { + case *Convert: + y.pos = e.Lparen + case *ChangeType: + y.pos = e.Lparen + case *MakeInterface: + y.pos = e.Lparen + } + } + return y + } + // Call to "intrinsic" built-ins, e.g. new, make, panic. + if id, ok := unparen(e.Fun).(*ast.Ident); ok { + if obj, ok := fn.Pkg.info.Uses[id].(*types.Builtin); ok { + if v := b.builtin(fn, obj, e.Args, tv.Type, e.Lparen); v != nil { + return v + } + } + } + // Regular function call. + var v Call + b.setCall(fn, e, &v.Call) + v.setType(tv.Type) + return fn.emit(&v) + + case *ast.UnaryExpr: + switch e.Op { + case token.AND: // &X --- potentially escaping. + addr := b.addr(fn, e.X, true) + if _, ok := unparen(e.X).(*ast.StarExpr); ok { + // &*p must panic if p is nil (http://golang.org/s/go12nil). + // For simplicity, we'll just (suboptimally) rely + // on the side effects of a load. + // TODO(adonovan): emit dedicated nilcheck. + addr.load(fn) + } + return addr.address(fn) + case token.ADD: + return b.expr(fn, e.X) + case token.NOT, token.ARROW, token.SUB, token.XOR: // ! <- - ^ + v := &UnOp{ + Op: e.Op, + X: b.expr(fn, e.X), + } + v.setPos(e.OpPos) + v.setType(tv.Type) + return fn.emit(v) + default: + panic(e.Op) + } + + case *ast.BinaryExpr: + switch e.Op { + case token.LAND, token.LOR: + return b.logicalBinop(fn, e) + case token.SHL, token.SHR: + fallthrough + case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT: + return emitArith(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), tv.Type, e.OpPos) + + case token.EQL, token.NEQ, token.GTR, token.LSS, token.LEQ, token.GEQ: + cmp := emitCompare(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), e.OpPos) + // The type of x==y may be UntypedBool. + return emitConv(fn, cmp, DefaultType(tv.Type)) + default: + panic("illegal op in BinaryExpr: " + e.Op.String()) + } + + case *ast.SliceExpr: + var low, high, max Value + var x Value + switch fn.Pkg.typeOf(e.X).Underlying().(type) { + case *types.Array: + // Potentially escaping. + x = b.addr(fn, e.X, true).address(fn) + case *types.Basic, *types.Slice, *types.Pointer: // *array + x = b.expr(fn, e.X) + default: + panic("unreachable") + } + if e.High != nil { + high = b.expr(fn, e.High) + } + if e.Low != nil { + low = b.expr(fn, e.Low) + } + if e.Slice3 { + max = b.expr(fn, e.Max) + } + v := &Slice{ + X: x, + Low: low, + High: high, + Max: max, + } + v.setPos(e.Lbrack) + v.setType(tv.Type) + return fn.emit(v) + + case *ast.Ident: + obj := fn.Pkg.info.Uses[e] + // Universal built-in or nil? + switch obj := obj.(type) { + case *types.Builtin: + return &Builtin{name: obj.Name(), sig: tv.Type.(*types.Signature)} + case *types.Nil: + return nilConst(tv.Type) + } + // Package-level func or var? + if v := fn.Prog.packageLevelValue(obj); v != nil { + if _, ok := obj.(*types.Var); ok { + return emitLoad(fn, v) // var (address) + } + return v // (func) + } + // Local var. + return emitLoad(fn, fn.lookup(obj, false)) // var (address) + + case *ast.SelectorExpr: + sel, ok := fn.Pkg.info.Selections[e] + if !ok { + // qualified identifier + return b.expr(fn, e.Sel) + } + switch sel.Kind() { + case types.MethodExpr: + // (*T).f or T.f, the method f from the method-set of type T. + // The result is a "thunk". + return emitConv(fn, makeThunk(fn.Prog, sel), tv.Type) + + case types.MethodVal: + // e.f where e is an expression and f is a method. + // The result is a "bound". + obj := sel.Obj().(*types.Func) + rt := recvType(obj) + wantAddr := isPointer(rt) + escaping := true + v := b.receiver(fn, e.X, wantAddr, escaping, sel) + if isInterface(rt) { + // If v has interface type I, + // we must emit a check that v is non-nil. + // We use: typeassert v.(I). + emitTypeAssert(fn, v, rt, token.NoPos) + } + c := &MakeClosure{ + Fn: makeBound(fn.Prog, obj), + Bindings: []Value{v}, + } + c.setPos(e.Sel.Pos()) + c.setType(tv.Type) + return fn.emit(c) + + case types.FieldVal: + indices := sel.Index() + last := len(indices) - 1 + v := b.expr(fn, e.X) + v = emitImplicitSelections(fn, v, indices[:last]) + v = emitFieldSelection(fn, v, indices[last], false, e.Sel) + return v + } + + panic("unexpected expression-relative selector") + + case *ast.IndexExpr: + switch t := fn.Pkg.typeOf(e.X).Underlying().(type) { + case *types.Array: + // Non-addressable array (in a register). + v := &Index{ + X: b.expr(fn, e.X), + Index: emitConv(fn, b.expr(fn, e.Index), tInt), + } + v.setPos(e.Lbrack) + v.setType(t.Elem()) + return fn.emit(v) + + case *types.Map: + // Maps are not addressable. + mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map) + v := &Lookup{ + X: b.expr(fn, e.X), + Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()), + } + v.setPos(e.Lbrack) + v.setType(mapt.Elem()) + return fn.emit(v) + + case *types.Basic: // => string + // Strings are not addressable. + v := &Lookup{ + X: b.expr(fn, e.X), + Index: b.expr(fn, e.Index), + } + v.setPos(e.Lbrack) + v.setType(tByte) + return fn.emit(v) + + case *types.Slice, *types.Pointer: // *array + // Addressable slice/array; use IndexAddr and Load. + return b.addr(fn, e, false).load(fn) + + default: + panic("unexpected container type in IndexExpr: " + t.String()) + } + + case *ast.CompositeLit, *ast.StarExpr: + // Addressable types (lvalues) + return b.addr(fn, e, false).load(fn) + } + + panic(fmt.Sprintf("unexpected expr: %T", e)) +} + +// stmtList emits to fn code for all statements in list. +func (b *builder) stmtList(fn *Function, list []ast.Stmt) { + for _, s := range list { + b.stmt(fn, s) + } +} + +// receiver emits to fn code for expression e in the "receiver" +// position of selection e.f (where f may be a field or a method) and +// returns the effective receiver after applying the implicit field +// selections of sel. +// +// wantAddr requests that the result is an an address. If +// !sel.Indirect(), this may require that e be built in addr() mode; it +// must thus be addressable. +// +// escaping is defined as per builder.addr(). +// +func (b *builder) receiver(fn *Function, e ast.Expr, wantAddr, escaping bool, sel *types.Selection) Value { + var v Value + if wantAddr && !sel.Indirect() && !isPointer(fn.Pkg.typeOf(e)) { + v = b.addr(fn, e, escaping).address(fn) + } else { + v = b.expr(fn, e) + } + + last := len(sel.Index()) - 1 + v = emitImplicitSelections(fn, v, sel.Index()[:last]) + if !wantAddr && isPointer(v.Type()) { + v = emitLoad(fn, v) + } + return v +} + +// setCallFunc populates the function parts of a CallCommon structure +// (Func, Method, Recv, Args[0]) based on the kind of invocation +// occurring in e. +// +func (b *builder) setCallFunc(fn *Function, e *ast.CallExpr, c *CallCommon) { + c.pos = e.Lparen + + // Is this a method call? + if selector, ok := unparen(e.Fun).(*ast.SelectorExpr); ok { + sel, ok := fn.Pkg.info.Selections[selector] + if ok && sel.Kind() == types.MethodVal { + obj := sel.Obj().(*types.Func) + recv := recvType(obj) + wantAddr := isPointer(recv) + escaping := true + v := b.receiver(fn, selector.X, wantAddr, escaping, sel) + if isInterface(recv) { + // Invoke-mode call. + c.Value = v + c.Method = obj + } else { + // "Call"-mode call. + c.Value = fn.Prog.declaredFunc(obj) + c.Args = append(c.Args, v) + } + return + } + + // sel.Kind()==MethodExpr indicates T.f() or (*T).f(): + // a statically dispatched call to the method f in the + // method-set of T or *T. T may be an interface. + // + // e.Fun would evaluate to a concrete method, interface + // wrapper function, or promotion wrapper. + // + // For now, we evaluate it in the usual way. + // + // TODO(adonovan): opt: inline expr() here, to make the + // call static and to avoid generation of wrappers. + // It's somewhat tricky as it may consume the first + // actual parameter if the call is "invoke" mode. + // + // Examples: + // type T struct{}; func (T) f() {} // "call" mode + // type T interface { f() } // "invoke" mode + // + // type S struct{ T } + // + // var s S + // S.f(s) + // (*S).f(&s) + // + // Suggested approach: + // - consume the first actual parameter expression + // and build it with b.expr(). + // - apply implicit field selections. + // - use MethodVal logic to populate fields of c. + } + + // Evaluate the function operand in the usual way. + c.Value = b.expr(fn, e.Fun) +} + +// emitCallArgs emits to f code for the actual parameters of call e to +// a (possibly built-in) function of effective type sig. +// The argument values are appended to args, which is then returned. +// +func (b *builder) emitCallArgs(fn *Function, sig *types.Signature, e *ast.CallExpr, args []Value) []Value { + // f(x, y, z...): pass slice z straight through. + if e.Ellipsis != 0 { + for i, arg := range e.Args { + v := emitConv(fn, b.expr(fn, arg), sig.Params().At(i).Type()) + args = append(args, v) + } + return args + } + + offset := len(args) // 1 if call has receiver, 0 otherwise + + // Evaluate actual parameter expressions. + // + // If this is a chained call of the form f(g()) where g has + // multiple return values (MRV), they are flattened out into + // args; a suffix of them may end up in a varargs slice. + for _, arg := range e.Args { + v := b.expr(fn, arg) + if ttuple, ok := v.Type().(*types.Tuple); ok { // MRV chain + for i, n := 0, ttuple.Len(); i < n; i++ { + args = append(args, emitExtract(fn, v, i)) + } + } else { + args = append(args, v) + } + } + + // Actual->formal assignability conversions for normal parameters. + np := sig.Params().Len() // number of normal parameters + if sig.Variadic() { + np-- + } + for i := 0; i < np; i++ { + args[offset+i] = emitConv(fn, args[offset+i], sig.Params().At(i).Type()) + } + + // Actual->formal assignability conversions for variadic parameter, + // and construction of slice. + if sig.Variadic() { + varargs := args[offset+np:] + st := sig.Params().At(np).Type().(*types.Slice) + vt := st.Elem() + if len(varargs) == 0 { + args = append(args, nilConst(st)) + } else { + // Replace a suffix of args with a slice containing it. + at := types.NewArray(vt, int64(len(varargs))) + a := emitNew(fn, at, token.NoPos) + a.setPos(e.Rparen) + a.Comment = "varargs" + for i, arg := range varargs { + iaddr := &IndexAddr{ + X: a, + Index: intConst(int64(i)), + } + iaddr.setType(types.NewPointer(vt)) + fn.emit(iaddr) + emitStore(fn, iaddr, arg, arg.Pos()) + } + s := &Slice{X: a} + s.setType(st) + args[offset+np] = fn.emit(s) + args = args[:offset+np+1] + } + } + return args +} + +// setCall emits to fn code to evaluate all the parameters of a function +// call e, and populates *c with those values. +// +func (b *builder) setCall(fn *Function, e *ast.CallExpr, c *CallCommon) { + // First deal with the f(...) part and optional receiver. + b.setCallFunc(fn, e, c) + + // Then append the other actual parameters. + sig, _ := fn.Pkg.typeOf(e.Fun).Underlying().(*types.Signature) + if sig == nil { + panic(fmt.Sprintf("no signature for call of %s", e.Fun)) + } + c.Args = b.emitCallArgs(fn, sig, e, c.Args) +} + +// assignOp emits to fn code to perform loc += incr or loc -= incr. +func (b *builder) assignOp(fn *Function, loc lvalue, incr Value, op token.Token) { + oldv := loc.load(fn) + loc.store(fn, emitArith(fn, op, oldv, emitConv(fn, incr, oldv.Type()), loc.typ(), token.NoPos)) +} + +// localValueSpec emits to fn code to define all of the vars in the +// function-local ValueSpec, spec. +// +func (b *builder) localValueSpec(fn *Function, spec *ast.ValueSpec) { + switch { + case len(spec.Values) == len(spec.Names): + // e.g. var x, y = 0, 1 + // 1:1 assignment + for i, id := range spec.Names { + if !isBlankIdent(id) { + fn.addLocalForIdent(id) + } + lval := b.addr(fn, id, false) // non-escaping + b.assign(fn, lval, spec.Values[i], true, nil) + } + + case len(spec.Values) == 0: + // e.g. var x, y int + // Locals are implicitly zero-initialized. + for _, id := range spec.Names { + if !isBlankIdent(id) { + lhs := fn.addLocalForIdent(id) + if fn.debugInfo() { + emitDebugRef(fn, id, lhs, true) + } + } + } + + default: + // e.g. var x, y = pos() + tuple := b.exprN(fn, spec.Values[0]) + for i, id := range spec.Names { + if !isBlankIdent(id) { + fn.addLocalForIdent(id) + lhs := b.addr(fn, id, false) // non-escaping + lhs.store(fn, emitExtract(fn, tuple, i)) + } + } + } +} + +// assignStmt emits code to fn for a parallel assignment of rhss to lhss. +// isDef is true if this is a short variable declaration (:=). +// +// Note the similarity with localValueSpec. +// +func (b *builder) assignStmt(fn *Function, lhss, rhss []ast.Expr, isDef bool) { + // Side effects of all LHSs and RHSs must occur in left-to-right order. + lvals := make([]lvalue, len(lhss)) + isZero := make([]bool, len(lhss)) + for i, lhs := range lhss { + var lval lvalue = blank{} + if !isBlankIdent(lhs) { + if isDef { + if obj := fn.Pkg.info.Defs[lhs.(*ast.Ident)]; obj != nil { + fn.addNamedLocal(obj) + isZero[i] = true + } + } + lval = b.addr(fn, lhs, false) // non-escaping + } + lvals[i] = lval + } + if len(lhss) == len(rhss) { + // Simple assignment: x = f() (!isDef) + // Parallel assignment: x, y = f(), g() (!isDef) + // or short var decl: x, y := f(), g() (isDef) + // + // In all cases, the RHSs may refer to the LHSs, + // so we need a storebuf. + var sb storebuf + for i := range rhss { + b.assign(fn, lvals[i], rhss[i], isZero[i], &sb) + } + sb.emit(fn) + } else { + // e.g. x, y = pos() + tuple := b.exprN(fn, rhss[0]) + emitDebugRef(fn, rhss[0], tuple, false) + for i, lval := range lvals { + lval.store(fn, emitExtract(fn, tuple, i)) + } + } +} + +// arrayLen returns the length of the array whose composite literal elements are elts. +func (b *builder) arrayLen(fn *Function, elts []ast.Expr) int64 { + var max int64 = -1 + var i int64 = -1 + for _, e := range elts { + if kv, ok := e.(*ast.KeyValueExpr); ok { + i = b.expr(fn, kv.Key).(*Const).Int64() + } else { + i++ + } + if i > max { + max = i + } + } + return max + 1 +} + +// compLit emits to fn code to initialize a composite literal e at +// address addr with type typ. +// +// Nested composite literals are recursively initialized in place +// where possible. If isZero is true, compLit assumes that addr +// holds the zero value for typ. +// +// Because the elements of a composite literal may refer to the +// variables being updated, as in the second line below, +// x := T{a: 1} +// x = T{a: x.a} +// all the reads must occur before all the writes. Thus all stores to +// loc are emitted to the storebuf sb for later execution. +// +// A CompositeLit may have pointer type only in the recursive (nested) +// case when the type name is implicit. e.g. in []*T{{}}, the inner +// literal has type *T behaves like &T{}. +// In that case, addr must hold a T, not a *T. +// +func (b *builder) compLit(fn *Function, addr Value, e *ast.CompositeLit, isZero bool, sb *storebuf) { + typ := deref(fn.Pkg.typeOf(e)) + switch t := typ.Underlying().(type) { + case *types.Struct: + if !isZero && len(e.Elts) != t.NumFields() { + // memclear + sb.store(&address{addr, e.Lbrace, nil}, + zeroValue(fn, deref(addr.Type()))) + isZero = true + } + for i, e := range e.Elts { + fieldIndex := i + pos := e.Pos() + if kv, ok := e.(*ast.KeyValueExpr); ok { + fname := kv.Key.(*ast.Ident).Name + for i, n := 0, t.NumFields(); i < n; i++ { + sf := t.Field(i) + if sf.Name() == fname { + fieldIndex = i + pos = kv.Colon + e = kv.Value + break + } + } + } + sf := t.Field(fieldIndex) + faddr := &FieldAddr{ + X: addr, + Field: fieldIndex, + } + faddr.setType(types.NewPointer(sf.Type())) + fn.emit(faddr) + b.assign(fn, &address{addr: faddr, pos: pos, expr: e}, e, isZero, sb) + } + + case *types.Array, *types.Slice: + var at *types.Array + var array Value + switch t := t.(type) { + case *types.Slice: + at = types.NewArray(t.Elem(), b.arrayLen(fn, e.Elts)) + alloc := emitNew(fn, at, e.Lbrace) + alloc.Comment = "slicelit" + array = alloc + case *types.Array: + at = t + array = addr + + if !isZero && int64(len(e.Elts)) != at.Len() { + // memclear + sb.store(&address{array, e.Lbrace, nil}, + zeroValue(fn, deref(array.Type()))) + } + } + + var idx *Const + for _, e := range e.Elts { + pos := e.Pos() + if kv, ok := e.(*ast.KeyValueExpr); ok { + idx = b.expr(fn, kv.Key).(*Const) + pos = kv.Colon + e = kv.Value + } else { + var idxval int64 + if idx != nil { + idxval = idx.Int64() + 1 + } + idx = intConst(idxval) + } + iaddr := &IndexAddr{ + X: array, + Index: idx, + } + iaddr.setType(types.NewPointer(at.Elem())) + fn.emit(iaddr) + if t != at { // slice + // backing array is unaliased => storebuf not needed. + b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, nil) + } else { + b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, sb) + } + } + + if t != at { // slice + s := &Slice{X: array} + s.setPos(e.Lbrace) + s.setType(typ) + sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, fn.emit(s)) + } + + case *types.Map: + m := &MakeMap{Reserve: intConst(int64(len(e.Elts)))} + m.setPos(e.Lbrace) + m.setType(typ) + fn.emit(m) + for _, e := range e.Elts { + e := e.(*ast.KeyValueExpr) + + // If a key expression in a map literal is itself a + // composite literal, the type may be omitted. + // For example: + // map[*struct{}]bool{{}: true} + // An &-operation may be implied: + // map[*struct{}]bool{&struct{}{}: true} + var key Value + if _, ok := unparen(e.Key).(*ast.CompositeLit); ok && isPointer(t.Key()) { + // A CompositeLit never evaluates to a pointer, + // so if the type of the location is a pointer, + // an &-operation is implied. + key = b.addr(fn, e.Key, true).address(fn) + } else { + key = b.expr(fn, e.Key) + } + + loc := element{ + m: m, + k: emitConv(fn, key, t.Key()), + t: t.Elem(), + pos: e.Colon, + } + + // We call assign() only because it takes care + // of any &-operation required in the recursive + // case, e.g., + // map[int]*struct{}{0: {}} implies &struct{}{}. + // In-place update is of course impossible, + // and no storebuf is needed. + b.assign(fn, &loc, e.Value, true, nil) + } + sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, m) + + default: + panic("unexpected CompositeLit type: " + t.String()) + } +} + +// switchStmt emits to fn code for the switch statement s, optionally +// labelled by label. +// +func (b *builder) switchStmt(fn *Function, s *ast.SwitchStmt, label *lblock) { + // We treat SwitchStmt like a sequential if-else chain. + // Multiway dispatch can be recovered later by ssautil.Switches() + // to those cases that are free of side effects. + if s.Init != nil { + b.stmt(fn, s.Init) + } + var tag Value = vTrue + if s.Tag != nil { + tag = b.expr(fn, s.Tag) + } + done := fn.newBasicBlock("switch.done") + if label != nil { + label._break = done + } + // We pull the default case (if present) down to the end. + // But each fallthrough label must point to the next + // body block in source order, so we preallocate a + // body block (fallthru) for the next case. + // Unfortunately this makes for a confusing block order. + var dfltBody *[]ast.Stmt + var dfltFallthrough *BasicBlock + var fallthru, dfltBlock *BasicBlock + ncases := len(s.Body.List) + for i, clause := range s.Body.List { + body := fallthru + if body == nil { + body = fn.newBasicBlock("switch.body") // first case only + } + + // Preallocate body block for the next case. + fallthru = done + if i+1 < ncases { + fallthru = fn.newBasicBlock("switch.body") + } + + cc := clause.(*ast.CaseClause) + if cc.List == nil { + // Default case. + dfltBody = &cc.Body + dfltFallthrough = fallthru + dfltBlock = body + continue + } + + var nextCond *BasicBlock + for _, cond := range cc.List { + nextCond = fn.newBasicBlock("switch.next") + // TODO(adonovan): opt: when tag==vTrue, we'd + // get better code if we use b.cond(cond) + // instead of BinOp(EQL, tag, b.expr(cond)) + // followed by If. Don't forget conversions + // though. + cond := emitCompare(fn, token.EQL, tag, b.expr(fn, cond), token.NoPos) + emitIf(fn, cond, body, nextCond) + fn.currentBlock = nextCond + } + fn.currentBlock = body + fn.targets = &targets{ + tail: fn.targets, + _break: done, + _fallthrough: fallthru, + } + b.stmtList(fn, cc.Body) + fn.targets = fn.targets.tail + emitJump(fn, done) + fn.currentBlock = nextCond + } + if dfltBlock != nil { + emitJump(fn, dfltBlock) + fn.currentBlock = dfltBlock + fn.targets = &targets{ + tail: fn.targets, + _break: done, + _fallthrough: dfltFallthrough, + } + b.stmtList(fn, *dfltBody) + fn.targets = fn.targets.tail + } + emitJump(fn, done) + fn.currentBlock = done +} + +// typeSwitchStmt emits to fn code for the type switch statement s, optionally +// labelled by label. +// +func (b *builder) typeSwitchStmt(fn *Function, s *ast.TypeSwitchStmt, label *lblock) { + // We treat TypeSwitchStmt like a sequential if-else chain. + // Multiway dispatch can be recovered later by ssautil.Switches(). + + // Typeswitch lowering: + // + // var x X + // switch y := x.(type) { + // case T1, T2: S1 // >1 (y := x) + // case nil: SN // nil (y := x) + // default: SD // 0 types (y := x) + // case T3: S3 // 1 type (y := x.(T3)) + // } + // + // ...s.Init... + // x := eval x + // .caseT1: + // t1, ok1 := typeswitch,ok x + // if ok1 then goto S1 else goto .caseT2 + // .caseT2: + // t2, ok2 := typeswitch,ok x + // if ok2 then goto S1 else goto .caseNil + // .S1: + // y := x + // ...S1... + // goto done + // .caseNil: + // if t2, ok2 := typeswitch,ok x + // if x == nil then goto SN else goto .caseT3 + // .SN: + // y := x + // ...SN... + // goto done + // .caseT3: + // t3, ok3 := typeswitch,ok x + // if ok3 then goto S3 else goto default + // .S3: + // y := t3 + // ...S3... + // goto done + // .default: + // y := x + // ...SD... + // goto done + // .done: + + if s.Init != nil { + b.stmt(fn, s.Init) + } + + var x Value + switch ass := s.Assign.(type) { + case *ast.ExprStmt: // x.(type) + x = b.expr(fn, unparen(ass.X).(*ast.TypeAssertExpr).X) + case *ast.AssignStmt: // y := x.(type) + x = b.expr(fn, unparen(ass.Rhs[0]).(*ast.TypeAssertExpr).X) + } + + done := fn.newBasicBlock("typeswitch.done") + if label != nil { + label._break = done + } + var default_ *ast.CaseClause + for _, clause := range s.Body.List { + cc := clause.(*ast.CaseClause) + if cc.List == nil { + default_ = cc + continue + } + body := fn.newBasicBlock("typeswitch.body") + var next *BasicBlock + var casetype types.Type + var ti Value // ti, ok := typeassert,ok x + for _, cond := range cc.List { + next = fn.newBasicBlock("typeswitch.next") + casetype = fn.Pkg.typeOf(cond) + var condv Value + if casetype == tUntypedNil { + condv = emitCompare(fn, token.EQL, x, nilConst(x.Type()), token.NoPos) + ti = x + } else { + yok := emitTypeTest(fn, x, casetype, cc.Case) + ti = emitExtract(fn, yok, 0) + condv = emitExtract(fn, yok, 1) + } + emitIf(fn, condv, body, next) + fn.currentBlock = next + } + if len(cc.List) != 1 { + ti = x + } + fn.currentBlock = body + b.typeCaseBody(fn, cc, ti, done) + fn.currentBlock = next + } + if default_ != nil { + b.typeCaseBody(fn, default_, x, done) + } else { + emitJump(fn, done) + } + fn.currentBlock = done +} + +func (b *builder) typeCaseBody(fn *Function, cc *ast.CaseClause, x Value, done *BasicBlock) { + if obj := fn.Pkg.info.Implicits[cc]; obj != nil { + // In a switch y := x.(type), each case clause + // implicitly declares a distinct object y. + // In a single-type case, y has that type. + // In multi-type cases, 'case nil' and default, + // y has the same type as the interface operand. + emitStore(fn, fn.addNamedLocal(obj), x, obj.Pos()) + } + fn.targets = &targets{ + tail: fn.targets, + _break: done, + } + b.stmtList(fn, cc.Body) + fn.targets = fn.targets.tail + emitJump(fn, done) +} + +// selectStmt emits to fn code for the select statement s, optionally +// labelled by label. +// +func (b *builder) selectStmt(fn *Function, s *ast.SelectStmt, label *lblock) { + // A blocking select of a single case degenerates to a + // simple send or receive. + // TODO(adonovan): opt: is this optimization worth its weight? + if len(s.Body.List) == 1 { + clause := s.Body.List[0].(*ast.CommClause) + if clause.Comm != nil { + b.stmt(fn, clause.Comm) + done := fn.newBasicBlock("select.done") + if label != nil { + label._break = done + } + fn.targets = &targets{ + tail: fn.targets, + _break: done, + } + b.stmtList(fn, clause.Body) + fn.targets = fn.targets.tail + emitJump(fn, done) + fn.currentBlock = done + return + } + } + + // First evaluate all channels in all cases, and find + // the directions of each state. + var states []*SelectState + blocking := true + debugInfo := fn.debugInfo() + for _, clause := range s.Body.List { + var st *SelectState + switch comm := clause.(*ast.CommClause).Comm.(type) { + case nil: // default case + blocking = false + continue + + case *ast.SendStmt: // ch<- i + ch := b.expr(fn, comm.Chan) + st = &SelectState{ + Dir: types.SendOnly, + Chan: ch, + Send: emitConv(fn, b.expr(fn, comm.Value), + ch.Type().Underlying().(*types.Chan).Elem()), + Pos: comm.Arrow, + } + if debugInfo { + st.DebugNode = comm + } + + case *ast.AssignStmt: // x := <-ch + recv := unparen(comm.Rhs[0]).(*ast.UnaryExpr) + st = &SelectState{ + Dir: types.RecvOnly, + Chan: b.expr(fn, recv.X), + Pos: recv.OpPos, + } + if debugInfo { + st.DebugNode = recv + } + + case *ast.ExprStmt: // <-ch + recv := unparen(comm.X).(*ast.UnaryExpr) + st = &SelectState{ + Dir: types.RecvOnly, + Chan: b.expr(fn, recv.X), + Pos: recv.OpPos, + } + if debugInfo { + st.DebugNode = recv + } + } + states = append(states, st) + } + + // We dispatch on the (fair) result of Select using a + // sequential if-else chain, in effect: + // + // idx, recvOk, r0...r_n-1 := select(...) + // if idx == 0 { // receive on channel 0 (first receive => r0) + // x, ok := r0, recvOk + // ...state0... + // } else if v == 1 { // send on channel 1 + // ...state1... + // } else { + // ...default... + // } + sel := &Select{ + States: states, + Blocking: blocking, + } + sel.setPos(s.Select) + var vars []*types.Var + vars = append(vars, varIndex, varOk) + for _, st := range states { + if st.Dir == types.RecvOnly { + tElem := st.Chan.Type().Underlying().(*types.Chan).Elem() + vars = append(vars, anonVar(tElem)) + } + } + sel.setType(types.NewTuple(vars...)) + + fn.emit(sel) + idx := emitExtract(fn, sel, 0) + + done := fn.newBasicBlock("select.done") + if label != nil { + label._break = done + } + + var defaultBody *[]ast.Stmt + state := 0 + r := 2 // index in 'sel' tuple of value; increments if st.Dir==RECV + for _, cc := range s.Body.List { + clause := cc.(*ast.CommClause) + if clause.Comm == nil { + defaultBody = &clause.Body + continue + } + body := fn.newBasicBlock("select.body") + next := fn.newBasicBlock("select.next") + emitIf(fn, emitCompare(fn, token.EQL, idx, intConst(int64(state)), token.NoPos), body, next) + fn.currentBlock = body + fn.targets = &targets{ + tail: fn.targets, + _break: done, + } + switch comm := clause.Comm.(type) { + case *ast.ExprStmt: // <-ch + if debugInfo { + v := emitExtract(fn, sel, r) + emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false) + } + r++ + + case *ast.AssignStmt: // x := <-states[state].Chan + if comm.Tok == token.DEFINE { + fn.addLocalForIdent(comm.Lhs[0].(*ast.Ident)) + } + x := b.addr(fn, comm.Lhs[0], false) // non-escaping + v := emitExtract(fn, sel, r) + if debugInfo { + emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false) + } + x.store(fn, v) + + if len(comm.Lhs) == 2 { // x, ok := ... + if comm.Tok == token.DEFINE { + fn.addLocalForIdent(comm.Lhs[1].(*ast.Ident)) + } + ok := b.addr(fn, comm.Lhs[1], false) // non-escaping + ok.store(fn, emitExtract(fn, sel, 1)) + } + r++ + } + b.stmtList(fn, clause.Body) + fn.targets = fn.targets.tail + emitJump(fn, done) + fn.currentBlock = next + state++ + } + if defaultBody != nil { + fn.targets = &targets{ + tail: fn.targets, + _break: done, + } + b.stmtList(fn, *defaultBody) + fn.targets = fn.targets.tail + } else { + // A blocking select must match some case. + // (This should really be a runtime.errorString, not a string.) + fn.emit(&Panic{ + X: emitConv(fn, stringConst("blocking select matched no case"), tEface), + }) + fn.currentBlock = fn.newBasicBlock("unreachable") + } + emitJump(fn, done) + fn.currentBlock = done +} + +// forStmt emits to fn code for the for statement s, optionally +// labelled by label. +// +func (b *builder) forStmt(fn *Function, s *ast.ForStmt, label *lblock) { + // ...init... + // jump loop + // loop: + // if cond goto body else done + // body: + // ...body... + // jump post + // post: (target of continue) + // ...post... + // jump loop + // done: (target of break) + if s.Init != nil { + b.stmt(fn, s.Init) + } + body := fn.newBasicBlock("for.body") + done := fn.newBasicBlock("for.done") // target of 'break' + loop := body // target of back-edge + if s.Cond != nil { + loop = fn.newBasicBlock("for.loop") + } + cont := loop // target of 'continue' + if s.Post != nil { + cont = fn.newBasicBlock("for.post") + } + if label != nil { + label._break = done + label._continue = cont + } + emitJump(fn, loop) + fn.currentBlock = loop + if loop != body { + b.cond(fn, s.Cond, body, done) + fn.currentBlock = body + } + fn.targets = &targets{ + tail: fn.targets, + _break: done, + _continue: cont, + } + b.stmt(fn, s.Body) + fn.targets = fn.targets.tail + emitJump(fn, cont) + + if s.Post != nil { + fn.currentBlock = cont + b.stmt(fn, s.Post) + emitJump(fn, loop) // back-edge + } + fn.currentBlock = done +} + +// rangeIndexed emits to fn the header for an integer-indexed loop +// over array, *array or slice value x. +// The v result is defined only if tv is non-nil. +// forPos is the position of the "for" token. +// +func (b *builder) rangeIndexed(fn *Function, x Value, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) { + // + // length = len(x) + // index = -1 + // loop: (target of continue) + // index++ + // if index < length goto body else done + // body: + // k = index + // v = x[index] + // ...body... + // jump loop + // done: (target of break) + + // Determine number of iterations. + var length Value + if arr, ok := deref(x.Type()).Underlying().(*types.Array); ok { + // For array or *array, the number of iterations is + // known statically thanks to the type. We avoid a + // data dependence upon x, permitting later dead-code + // elimination if x is pure, static unrolling, etc. + // Ranging over a nil *array may have >0 iterations. + // We still generate code for x, in case it has effects. + length = intConst(arr.Len()) + } else { + // length = len(x). + var c Call + c.Call.Value = makeLen(x.Type()) + c.Call.Args = []Value{x} + c.setType(tInt) + length = fn.emit(&c) + } + + index := fn.addLocal(tInt, token.NoPos) + emitStore(fn, index, intConst(-1), pos) + + loop = fn.newBasicBlock("rangeindex.loop") + emitJump(fn, loop) + fn.currentBlock = loop + + incr := &BinOp{ + Op: token.ADD, + X: emitLoad(fn, index), + Y: vOne, + } + incr.setType(tInt) + emitStore(fn, index, fn.emit(incr), pos) + + body := fn.newBasicBlock("rangeindex.body") + done = fn.newBasicBlock("rangeindex.done") + emitIf(fn, emitCompare(fn, token.LSS, incr, length, token.NoPos), body, done) + fn.currentBlock = body + + k = emitLoad(fn, index) + if tv != nil { + switch t := x.Type().Underlying().(type) { + case *types.Array: + instr := &Index{ + X: x, + Index: k, + } + instr.setType(t.Elem()) + v = fn.emit(instr) + + case *types.Pointer: // *array + instr := &IndexAddr{ + X: x, + Index: k, + } + instr.setType(types.NewPointer(t.Elem().Underlying().(*types.Array).Elem())) + v = emitLoad(fn, fn.emit(instr)) + + case *types.Slice: + instr := &IndexAddr{ + X: x, + Index: k, + } + instr.setType(types.NewPointer(t.Elem())) + v = emitLoad(fn, fn.emit(instr)) + + default: + panic("rangeIndexed x:" + t.String()) + } + } + return +} + +// rangeIter emits to fn the header for a loop using +// Range/Next/Extract to iterate over map or string value x. +// tk and tv are the types of the key/value results k and v, or nil +// if the respective component is not wanted. +// +func (b *builder) rangeIter(fn *Function, x Value, tk, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) { + // + // it = range x + // loop: (target of continue) + // okv = next it (ok, key, value) + // ok = extract okv #0 + // if ok goto body else done + // body: + // k = extract okv #1 + // v = extract okv #2 + // ...body... + // jump loop + // done: (target of break) + // + + if tk == nil { + tk = tInvalid + } + if tv == nil { + tv = tInvalid + } + + rng := &Range{X: x} + rng.setPos(pos) + rng.setType(tRangeIter) + it := fn.emit(rng) + + loop = fn.newBasicBlock("rangeiter.loop") + emitJump(fn, loop) + fn.currentBlock = loop + + _, isString := x.Type().Underlying().(*types.Basic) + + okv := &Next{ + Iter: it, + IsString: isString, + } + okv.setType(types.NewTuple( + varOk, + newVar("k", tk), + newVar("v", tv), + )) + fn.emit(okv) + + body := fn.newBasicBlock("rangeiter.body") + done = fn.newBasicBlock("rangeiter.done") + emitIf(fn, emitExtract(fn, okv, 0), body, done) + fn.currentBlock = body + + if tk != tInvalid { + k = emitExtract(fn, okv, 1) + } + if tv != tInvalid { + v = emitExtract(fn, okv, 2) + } + return +} + +// rangeChan emits to fn the header for a loop that receives from +// channel x until it fails. +// tk is the channel's element type, or nil if the k result is +// not wanted +// pos is the position of the '=' or ':=' token. +// +func (b *builder) rangeChan(fn *Function, x Value, tk types.Type, pos token.Pos) (k Value, loop, done *BasicBlock) { + // + // loop: (target of continue) + // ko = <-x (key, ok) + // ok = extract ko #1 + // if ok goto body else done + // body: + // k = extract ko #0 + // ... + // goto loop + // done: (target of break) + + loop = fn.newBasicBlock("rangechan.loop") + emitJump(fn, loop) + fn.currentBlock = loop + recv := &UnOp{ + Op: token.ARROW, + X: x, + CommaOk: true, + } + recv.setPos(pos) + recv.setType(types.NewTuple( + newVar("k", x.Type().Underlying().(*types.Chan).Elem()), + varOk, + )) + ko := fn.emit(recv) + body := fn.newBasicBlock("rangechan.body") + done = fn.newBasicBlock("rangechan.done") + emitIf(fn, emitExtract(fn, ko, 1), body, done) + fn.currentBlock = body + if tk != nil { + k = emitExtract(fn, ko, 0) + } + return +} + +// rangeStmt emits to fn code for the range statement s, optionally +// labelled by label. +// +func (b *builder) rangeStmt(fn *Function, s *ast.RangeStmt, label *lblock) { + var tk, tv types.Type + if s.Key != nil && !isBlankIdent(s.Key) { + tk = fn.Pkg.typeOf(s.Key) + } + if s.Value != nil && !isBlankIdent(s.Value) { + tv = fn.Pkg.typeOf(s.Value) + } + + // If iteration variables are defined (:=), this + // occurs once outside the loop. + // + // Unlike a short variable declaration, a RangeStmt + // using := never redeclares an existing variable; it + // always creates a new one. + if s.Tok == token.DEFINE { + if tk != nil { + fn.addLocalForIdent(s.Key.(*ast.Ident)) + } + if tv != nil { + fn.addLocalForIdent(s.Value.(*ast.Ident)) + } + } + + x := b.expr(fn, s.X) + + var k, v Value + var loop, done *BasicBlock + switch rt := x.Type().Underlying().(type) { + case *types.Slice, *types.Array, *types.Pointer: // *array + k, v, loop, done = b.rangeIndexed(fn, x, tv, s.For) + + case *types.Chan: + k, loop, done = b.rangeChan(fn, x, tk, s.For) + + case *types.Map, *types.Basic: // string + k, v, loop, done = b.rangeIter(fn, x, tk, tv, s.For) + + default: + panic("Cannot range over: " + rt.String()) + } + + // Evaluate both LHS expressions before we update either. + var kl, vl lvalue + if tk != nil { + kl = b.addr(fn, s.Key, false) // non-escaping + } + if tv != nil { + vl = b.addr(fn, s.Value, false) // non-escaping + } + if tk != nil { + kl.store(fn, k) + } + if tv != nil { + vl.store(fn, v) + } + + if label != nil { + label._break = done + label._continue = loop + } + + fn.targets = &targets{ + tail: fn.targets, + _break: done, + _continue: loop, + } + b.stmt(fn, s.Body) + fn.targets = fn.targets.tail + emitJump(fn, loop) // back-edge + fn.currentBlock = done +} + +// stmt lowers statement s to SSA form, emitting code to fn. +func (b *builder) stmt(fn *Function, _s ast.Stmt) { + // The label of the current statement. If non-nil, its _goto + // target is always set; its _break and _continue are set only + // within the body of switch/typeswitch/select/for/range. + // It is effectively an additional default-nil parameter of stmt(). + var label *lblock +start: + switch s := _s.(type) { + case *ast.EmptyStmt: + // ignore. (Usually removed by gofmt.) + + case *ast.DeclStmt: // Con, Var or Typ + d := s.Decl.(*ast.GenDecl) + if d.Tok == token.VAR { + for _, spec := range d.Specs { + if vs, ok := spec.(*ast.ValueSpec); ok { + b.localValueSpec(fn, vs) + } + } + } + + case *ast.LabeledStmt: + label = fn.labelledBlock(s.Label) + emitJump(fn, label._goto) + fn.currentBlock = label._goto + _s = s.Stmt + goto start // effectively: tailcall stmt(fn, s.Stmt, label) + + case *ast.ExprStmt: + b.expr(fn, s.X) + + case *ast.SendStmt: + fn.emit(&Send{ + Chan: b.expr(fn, s.Chan), + X: emitConv(fn, b.expr(fn, s.Value), + fn.Pkg.typeOf(s.Chan).Underlying().(*types.Chan).Elem()), + pos: s.Arrow, + }) + + case *ast.IncDecStmt: + op := token.ADD + if s.Tok == token.DEC { + op = token.SUB + } + loc := b.addr(fn, s.X, false) + b.assignOp(fn, loc, NewConst(exact.MakeInt64(1), loc.typ()), op) + + case *ast.AssignStmt: + switch s.Tok { + case token.ASSIGN, token.DEFINE: + b.assignStmt(fn, s.Lhs, s.Rhs, s.Tok == token.DEFINE) + + default: // +=, etc. + op := s.Tok + token.ADD - token.ADD_ASSIGN + b.assignOp(fn, b.addr(fn, s.Lhs[0], false), b.expr(fn, s.Rhs[0]), op) + } + + case *ast.GoStmt: + // The "intrinsics" new/make/len/cap are forbidden here. + // panic is treated like an ordinary function call. + v := Go{pos: s.Go} + b.setCall(fn, s.Call, &v.Call) + fn.emit(&v) + + case *ast.DeferStmt: + // The "intrinsics" new/make/len/cap are forbidden here. + // panic is treated like an ordinary function call. + v := Defer{pos: s.Defer} + b.setCall(fn, s.Call, &v.Call) + fn.emit(&v) + + // A deferred call can cause recovery from panic, + // and control resumes at the Recover block. + createRecoverBlock(fn) + + case *ast.ReturnStmt: + var results []Value + if len(s.Results) == 1 && fn.Signature.Results().Len() > 1 { + // Return of one expression in a multi-valued function. + tuple := b.exprN(fn, s.Results[0]) + ttuple := tuple.Type().(*types.Tuple) + for i, n := 0, ttuple.Len(); i < n; i++ { + results = append(results, + emitConv(fn, emitExtract(fn, tuple, i), + fn.Signature.Results().At(i).Type())) + } + } else { + // 1:1 return, or no-arg return in non-void function. + for i, r := range s.Results { + v := emitConv(fn, b.expr(fn, r), fn.Signature.Results().At(i).Type()) + results = append(results, v) + } + } + if fn.namedResults != nil { + // Function has named result parameters (NRPs). + // Perform parallel assignment of return operands to NRPs. + for i, r := range results { + emitStore(fn, fn.namedResults[i], r, s.Return) + } + } + // Run function calls deferred in this + // function when explicitly returning from it. + fn.emit(new(RunDefers)) + if fn.namedResults != nil { + // Reload NRPs to form the result tuple. + results = results[:0] + for _, r := range fn.namedResults { + results = append(results, emitLoad(fn, r)) + } + } + fn.emit(&Return{Results: results, pos: s.Return}) + fn.currentBlock = fn.newBasicBlock("unreachable") + + case *ast.BranchStmt: + var block *BasicBlock + switch s.Tok { + case token.BREAK: + if s.Label != nil { + block = fn.labelledBlock(s.Label)._break + } else { + for t := fn.targets; t != nil && block == nil; t = t.tail { + block = t._break + } + } + + case token.CONTINUE: + if s.Label != nil { + block = fn.labelledBlock(s.Label)._continue + } else { + for t := fn.targets; t != nil && block == nil; t = t.tail { + block = t._continue + } + } + + case token.FALLTHROUGH: + for t := fn.targets; t != nil && block == nil; t = t.tail { + block = t._fallthrough + } + + case token.GOTO: + block = fn.labelledBlock(s.Label)._goto + } + emitJump(fn, block) + fn.currentBlock = fn.newBasicBlock("unreachable") + + case *ast.BlockStmt: + b.stmtList(fn, s.List) + + case *ast.IfStmt: + if s.Init != nil { + b.stmt(fn, s.Init) + } + then := fn.newBasicBlock("if.then") + done := fn.newBasicBlock("if.done") + els := done + if s.Else != nil { + els = fn.newBasicBlock("if.else") + } + b.cond(fn, s.Cond, then, els) + fn.currentBlock = then + b.stmt(fn, s.Body) + emitJump(fn, done) + + if s.Else != nil { + fn.currentBlock = els + b.stmt(fn, s.Else) + emitJump(fn, done) + } + + fn.currentBlock = done + + case *ast.SwitchStmt: + b.switchStmt(fn, s, label) + + case *ast.TypeSwitchStmt: + b.typeSwitchStmt(fn, s, label) + + case *ast.SelectStmt: + b.selectStmt(fn, s, label) + + case *ast.ForStmt: + b.forStmt(fn, s, label) + + case *ast.RangeStmt: + b.rangeStmt(fn, s, label) + + default: + panic(fmt.Sprintf("unexpected statement kind: %T", s)) + } +} + +// buildFunction builds SSA code for the body of function fn. Idempotent. +func (b *builder) buildFunction(fn *Function) { + if fn.Blocks != nil { + return // building already started + } + + var recvField *ast.FieldList + var body *ast.BlockStmt + var functype *ast.FuncType + switch n := fn.syntax.(type) { + case nil: + return // not a Go source function. (Synthetic, or from object file.) + case *ast.FuncDecl: + functype = n.Type + recvField = n.Recv + body = n.Body + case *ast.FuncLit: + functype = n.Type + body = n.Body + default: + panic(n) + } + + if body == nil { + // External function. + if fn.Params == nil { + // This condition ensures we add a non-empty + // params list once only, but we may attempt + // the degenerate empty case repeatedly. + // TODO(adonovan): opt: don't do that. + + // We set Function.Params even though there is no body + // code to reference them. This simplifies clients. + if recv := fn.Signature.Recv(); recv != nil { + fn.addParamObj(recv) + } + params := fn.Signature.Params() + for i, n := 0, params.Len(); i < n; i++ { + fn.addParamObj(params.At(i)) + } + } + return + } + if fn.Prog.mode&LogSource != 0 { + defer logStack("build function %s @ %s", fn, fn.Prog.Fset.Position(fn.pos))() + } + fn.startBody() + fn.createSyntacticParams(recvField, functype) + b.stmt(fn, body) + if cb := fn.currentBlock; cb != nil && (cb == fn.Blocks[0] || cb == fn.Recover || cb.Preds != nil) { + // Control fell off the end of the function's body block. + // + // Block optimizations eliminate the current block, if + // unreachable. It is a builder invariant that + // if this no-arg return is ill-typed for + // fn.Signature.Results, this block must be + // unreachable. The sanity checker checks this. + fn.emit(new(RunDefers)) + fn.emit(new(Return)) + } + fn.finishBody() +} + +// buildFuncDecl builds SSA code for the function or method declared +// by decl in package pkg. +// +func (b *builder) buildFuncDecl(pkg *Package, decl *ast.FuncDecl) { + id := decl.Name + if isBlankIdent(id) { + return // discard + } + fn := pkg.values[pkg.info.Defs[id]].(*Function) + if decl.Recv == nil && id.Name == "init" { + var v Call + v.Call.Value = fn + v.setType(types.NewTuple()) + pkg.init.emit(&v) + } + b.buildFunction(fn) +} + +// BuildAll calls Package.Build() for each package in prog. +// Building occurs in parallel unless the BuildSerially mode flag was set. +// +// BuildAll is intended for whole-program analysis; a typical compiler +// need only build a single package. +// +// BuildAll is idempotent and thread-safe. +// +func (prog *Program) Build() { + var wg sync.WaitGroup + for _, p := range prog.packages { + if prog.mode&BuildSerially != 0 { + p.Build() + } else { + wg.Add(1) + go func(p *Package) { + p.Build() + wg.Done() + }(p) + } + } + wg.Wait() +} + +// Build builds SSA code for all functions and vars in package p. +// +// Precondition: CreatePackage must have been called for all of p's +// direct imports (and hence its direct imports must have been +// error-free). +// +// Build is idempotent and thread-safe. +// +func (p *Package) Build() { p.buildOnce.Do(p.build) } + +func (p *Package) build() { + if p.info == nil { + return // synthetic package, e.g. "testmain" + } + if p.files == nil { + p.info = nil + return // package loaded from export data + } + + // Ensure we have runtime type info for all exported members. + // TODO(adonovan): ideally belongs in memberFromObject, but + // that would require package creation in topological order. + for name, mem := range p.Members { + if ast.IsExported(name) { + p.Prog.needMethodsOf(mem.Type()) + } + } + if p.Prog.mode&LogSource != 0 { + defer logStack("build %s", p)() + } + init := p.init + init.startBody() + + var done *BasicBlock + + if p.Prog.mode&BareInits == 0 { + // Make init() skip if package is already initialized. + initguard := p.Var("init$guard") + doinit := init.newBasicBlock("init.start") + done = init.newBasicBlock("init.done") + emitIf(init, emitLoad(init, initguard), done, doinit) + init.currentBlock = doinit + emitStore(init, initguard, vTrue, token.NoPos) + + // Call the init() function of each package we import. + for _, pkg := range p.Pkg.Imports() { + prereq := p.Prog.packages[pkg] + if prereq == nil { + panic(fmt.Sprintf("Package(%q).Build(): unsatisfied import: Program.CreatePackage(%q) was not called", p.Pkg.Path(), pkg.Path())) + } + var v Call + v.Call.Value = prereq.init + v.Call.pos = init.pos + v.setType(types.NewTuple()) + init.emit(&v) + } + } + + var b builder + + // Initialize package-level vars in correct order. + for _, varinit := range p.info.InitOrder { + if init.Prog.mode&LogSource != 0 { + fmt.Fprintf(os.Stderr, "build global initializer %v @ %s\n", + varinit.Lhs, p.Prog.Fset.Position(varinit.Rhs.Pos())) + } + if len(varinit.Lhs) == 1 { + // 1:1 initialization: var x, y = a(), b() + var lval lvalue + if v := varinit.Lhs[0]; v.Name() != "_" { + lval = &address{addr: p.values[v].(*Global), pos: v.Pos()} + } else { + lval = blank{} + } + b.assign(init, lval, varinit.Rhs, true, nil) + } else { + // n:1 initialization: var x, y := f() + tuple := b.exprN(init, varinit.Rhs) + for i, v := range varinit.Lhs { + if v.Name() == "_" { + continue + } + emitStore(init, p.values[v].(*Global), emitExtract(init, tuple, i), v.Pos()) + } + } + } + + // Build all package-level functions, init functions + // and methods, including unreachable/blank ones. + // We build them in source order, but it's not significant. + for _, file := range p.files { + for _, decl := range file.Decls { + if decl, ok := decl.(*ast.FuncDecl); ok { + b.buildFuncDecl(p, decl) + } + } + } + + // Finish up init(). + if p.Prog.mode&BareInits == 0 { + emitJump(init, done) + init.currentBlock = done + } + init.emit(new(Return)) + init.finishBody() + + p.info = nil // We no longer need ASTs or go/types deductions. + + if p.Prog.mode&SanityCheckFunctions != 0 { + sanityCheckPackage(p) + } +} + +// Like ObjectOf, but panics instead of returning nil. +// Only valid during p's create and build phases. +func (p *Package) objectOf(id *ast.Ident) types.Object { + if o := p.info.ObjectOf(id); o != nil { + return o + } + panic(fmt.Sprintf("no types.Object for ast.Ident %s @ %s", + id.Name, p.Prog.Fset.Position(id.Pos()))) +} + +// Like TypeOf, but panics instead of returning nil. +// Only valid during p's create and build phases. +func (p *Package) typeOf(e ast.Expr) types.Type { + if T := p.info.TypeOf(e); T != nil { + return T + } + panic(fmt.Sprintf("no type for %T @ %s", + e, p.Prog.Fset.Position(e.Pos()))) +} diff --git a/vendor/golang.org/x/tools/go/ssa/builder14_test.go b/vendor/golang.org/x/tools/go/ssa/builder14_test.go new file mode 100644 index 0000000000..3eaa825e2b --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/builder14_test.go @@ -0,0 +1,421 @@ +// Copyright 2013 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.5 + +package ssa_test + +import ( + "bytes" + "go/ast" + "go/parser" + "go/token" + "reflect" + "sort" + "strings" + "testing" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/go/types" + + _ "golang.org/x/tools/go/gcimporter" +) + +func isEmpty(f *ssa.Function) bool { return f.Blocks == nil } + +// Tests that programs partially loaded from gc object files contain +// functions with no code for the external portions, but are otherwise ok. +func TestBuildPackage(t *testing.T) { + input := ` +package main + +import ( + "bytes" + "io" + "testing" +) + +func main() { + var t testing.T + t.Parallel() // static call to external declared method + t.Fail() // static call to promoted external declared method + testing.Short() // static call to external package-level function + + var w io.Writer = new(bytes.Buffer) + w.Write(nil) // interface invoke of external declared method +} +` + + // Parse the file. + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, "input.go", input, 0) + if err != nil { + t.Error(err) + return + } + + // Build an SSA program from the parsed file. + // Load its dependencies from gc binary export data. + mainPkg, _, err := ssautil.BuildPackage(new(types.Config), fset, + types.NewPackage("main", ""), []*ast.File{f}, ssa.SanityCheckFunctions) + if err != nil { + t.Error(err) + return + } + + // The main package, its direct and indirect dependencies are loaded. + deps := []string{ + // directly imported dependencies: + "bytes", "io", "testing", + // indirect dependencies (partial list): + "errors", "fmt", "os", "runtime", + } + + prog := mainPkg.Prog + all := prog.AllPackages() + if len(all) <= len(deps) { + t.Errorf("unexpected set of loaded packages: %q", all) + } + for _, path := range deps { + pkg := prog.ImportedPackage(path) + if pkg == nil { + t.Errorf("package not loaded: %q", path) + continue + } + + // External packages should have no function bodies (except for wrappers). + isExt := pkg != mainPkg + + // init() + if isExt && !isEmpty(pkg.Func("init")) { + t.Errorf("external package %s has non-empty init", pkg) + } else if !isExt && isEmpty(pkg.Func("init")) { + t.Errorf("main package %s has empty init", pkg) + } + + for _, mem := range pkg.Members { + switch mem := mem.(type) { + case *ssa.Function: + // Functions at package level. + if isExt && !isEmpty(mem) { + t.Errorf("external function %s is non-empty", mem) + } else if !isExt && isEmpty(mem) { + t.Errorf("function %s is empty", mem) + } + + case *ssa.Type: + // Methods of named types T. + // (In this test, all exported methods belong to *T not T.) + if !isExt { + t.Fatalf("unexpected name type in main package: %s", mem) + } + mset := prog.MethodSets.MethodSet(types.NewPointer(mem.Type())) + for i, n := 0, mset.Len(); i < n; i++ { + m := prog.MethodValue(mset.At(i)) + // For external types, only synthetic wrappers have code. + expExt := !strings.Contains(m.Synthetic, "wrapper") + if expExt && !isEmpty(m) { + t.Errorf("external method %s is non-empty: %s", + m, m.Synthetic) + } else if !expExt && isEmpty(m) { + t.Errorf("method function %s is empty: %s", + m, m.Synthetic) + } + } + } + } + } + + expectedCallee := []string{ + "(*testing.T).Parallel", + "(*testing.common).Fail", + "testing.Short", + "N/A", + } + callNum := 0 + for _, b := range mainPkg.Func("main").Blocks { + for _, instr := range b.Instrs { + switch instr := instr.(type) { + case ssa.CallInstruction: + call := instr.Common() + if want := expectedCallee[callNum]; want != "N/A" { + got := call.StaticCallee().String() + if want != got { + t.Errorf("call #%d from main.main: got callee %s, want %s", + callNum, got, want) + } + } + callNum++ + } + } + } + if callNum != 4 { + t.Errorf("in main.main: got %d calls, want %d", callNum, 4) + } +} + +// TestRuntimeTypes tests that (*Program).RuntimeTypes() includes all necessary types. +func TestRuntimeTypes(t *testing.T) { + tests := []struct { + input string + want []string + }{ + // An exported package-level type is needed. + {`package A; type T struct{}; func (T) f() {}`, + []string{"*p.T", "p.T"}, + }, + // An unexported package-level type is not needed. + {`package B; type t struct{}; func (t) f() {}`, + nil, + }, + // Subcomponents of type of exported package-level var are needed. + {`package C; import "bytes"; var V struct {*bytes.Buffer}`, + []string{"*bytes.Buffer", "*struct{*bytes.Buffer}", "struct{*bytes.Buffer}"}, + }, + // Subcomponents of type of unexported package-level var are not needed. + {`package D; import "bytes"; var v struct {*bytes.Buffer}`, + nil, + }, + // Subcomponents of type of exported package-level function are needed. + {`package E; import "bytes"; func F(struct {*bytes.Buffer}) {}`, + []string{"*bytes.Buffer", "struct{*bytes.Buffer}"}, + }, + // Subcomponents of type of unexported package-level function are not needed. + {`package F; import "bytes"; func f(struct {*bytes.Buffer}) {}`, + nil, + }, + // Subcomponents of type of exported method of uninstantiated unexported type are not needed. + {`package G; import "bytes"; type x struct{}; func (x) G(struct {*bytes.Buffer}) {}; var v x`, + nil, + }, + // ...unless used by MakeInterface. + {`package G2; import "bytes"; type x struct{}; func (x) G(struct {*bytes.Buffer}) {}; var v interface{} = x{}`, + []string{"*bytes.Buffer", "*p.x", "p.x", "struct{*bytes.Buffer}"}, + }, + // Subcomponents of type of unexported method are not needed. + {`package I; import "bytes"; type X struct{}; func (X) G(struct {*bytes.Buffer}) {}`, + []string{"*bytes.Buffer", "*p.X", "p.X", "struct{*bytes.Buffer}"}, + }, + // Local types aren't needed. + {`package J; import "bytes"; func f() { type T struct {*bytes.Buffer}; var t T; _ = t }`, + nil, + }, + // ...unless used by MakeInterface. + {`package K; import "bytes"; func f() { type T struct {*bytes.Buffer}; _ = interface{}(T{}) }`, + []string{"*bytes.Buffer", "*p.T", "p.T"}, + }, + // Types used as operand of MakeInterface are needed. + {`package L; import "bytes"; func f() { _ = interface{}(struct{*bytes.Buffer}{}) }`, + []string{"*bytes.Buffer", "struct{*bytes.Buffer}"}, + }, + // MakeInterface is optimized away when storing to a blank. + {`package M; import "bytes"; var _ interface{} = struct{*bytes.Buffer}{}`, + nil, + }, + } + for _, test := range tests { + // Parse the file. + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, "input.go", test.input, 0) + if err != nil { + t.Errorf("test %q: %s", test.input[:15], err) + continue + } + + // Create a single-file main package. + // Load dependencies from gc binary export data. + ssapkg, _, err := ssautil.BuildPackage(new(types.Config), fset, + types.NewPackage("p", ""), []*ast.File{f}, ssa.SanityCheckFunctions) + if err != nil { + t.Errorf("test %q: %s", test.input[:15], err) + continue + } + + var typstrs []string + for _, T := range ssapkg.Prog.RuntimeTypes() { + typstrs = append(typstrs, T.String()) + } + sort.Strings(typstrs) + + if !reflect.DeepEqual(typstrs, test.want) { + t.Errorf("test 'package %s': got %q, want %q", + f.Name.Name, typstrs, test.want) + } + } +} + +// TestInit tests that synthesized init functions are correctly formed. +// Bare init functions omit calls to dependent init functions and the use of +// an init guard. They are useful in cases where the client uses a different +// calling convention for init functions, or cases where it is easier for a +// client to analyze bare init functions. Both of these aspects are used by +// the llgo compiler for simpler integration with gccgo's runtime library, +// and to simplify the analysis whereby it deduces which stores to globals +// can be lowered to global initializers. +func TestInit(t *testing.T) { + tests := []struct { + mode ssa.BuilderMode + input, want string + }{ + {0, `package A; import _ "errors"; var i int = 42`, + `# Name: A.init +# Package: A +# Synthetic: package initializer +func init(): +0: entry P:0 S:2 + t0 = *init$guard bool + if t0 goto 2 else 1 +1: init.start P:1 S:1 + *init$guard = true:bool + t1 = errors.init() () + *i = 42:int + jump 2 +2: init.done P:2 S:0 + return + +`}, + {ssa.BareInits, `package B; import _ "errors"; var i int = 42`, + `# Name: B.init +# Package: B +# Synthetic: package initializer +func init(): +0: entry P:0 S:0 + *i = 42:int + return + +`}, + } + for _, test := range tests { + // Create a single-file main package. + var conf loader.Config + f, err := conf.ParseFile("", test.input) + if err != nil { + t.Errorf("test %q: %s", test.input[:15], err) + continue + } + conf.CreateFromFiles(f.Name.Name, f) + + lprog, err := conf.Load() + if err != nil { + t.Errorf("test 'package %s': Load: %s", f.Name.Name, err) + continue + } + prog := ssautil.CreateProgram(lprog, test.mode) + mainPkg := prog.Package(lprog.Created[0].Pkg) + prog.Build() + initFunc := mainPkg.Func("init") + if initFunc == nil { + t.Errorf("test 'package %s': no init function", f.Name.Name) + continue + } + + var initbuf bytes.Buffer + _, err = initFunc.WriteTo(&initbuf) + if err != nil { + t.Errorf("test 'package %s': WriteTo: %s", f.Name.Name, err) + continue + } + + if initbuf.String() != test.want { + t.Errorf("test 'package %s': got %s, want %s", f.Name.Name, initbuf.String(), test.want) + } + } +} + +// TestSyntheticFuncs checks that the expected synthetic functions are +// created, reachable, and not duplicated. +func TestSyntheticFuncs(t *testing.T) { + const input = `package P +type T int +func (T) f() int +func (*T) g() int +var ( + // thunks + a = T.f + b = T.f + c = (struct{T}).f + d = (struct{T}).f + e = (*T).g + f = (*T).g + g = (struct{*T}).g + h = (struct{*T}).g + + // bounds + i = T(0).f + j = T(0).f + k = new(T).g + l = new(T).g + + // wrappers + m interface{} = struct{T}{} + n interface{} = struct{T}{} + o interface{} = struct{*T}{} + p interface{} = struct{*T}{} + q interface{} = new(struct{T}) + r interface{} = new(struct{T}) + s interface{} = new(struct{*T}) + t interface{} = new(struct{*T}) +) +` + // Parse + var conf loader.Config + f, err := conf.ParseFile("", input) + if err != nil { + t.Fatalf("parse: %v", err) + } + conf.CreateFromFiles(f.Name.Name, f) + + // Load + lprog, err := conf.Load() + if err != nil { + t.Fatalf("Load: %v", err) + } + + // Create and build SSA + prog := ssautil.CreateProgram(lprog, 0) + prog.Build() + + // Enumerate reachable synthetic functions + want := map[string]string{ + "(*P.T).g$bound": "bound method wrapper for func (*P.T).g() int", + "(P.T).f$bound": "bound method wrapper for func (P.T).f() int", + + "(*P.T).g$thunk": "thunk for func (*P.T).g() int", + "(P.T).f$thunk": "thunk for func (P.T).f() int", + "(struct{*P.T}).g$thunk": "thunk for func (*P.T).g() int", + "(struct{P.T}).f$thunk": "thunk for func (P.T).f() int", + + "(*P.T).f": "wrapper for func (P.T).f() int", + "(*struct{*P.T}).f": "wrapper for func (P.T).f() int", + "(*struct{*P.T}).g": "wrapper for func (*P.T).g() int", + "(*struct{P.T}).f": "wrapper for func (P.T).f() int", + "(*struct{P.T}).g": "wrapper for func (*P.T).g() int", + "(struct{*P.T}).f": "wrapper for func (P.T).f() int", + "(struct{*P.T}).g": "wrapper for func (*P.T).g() int", + "(struct{P.T}).f": "wrapper for func (P.T).f() int", + + "P.init": "package initializer", + } + for fn := range ssautil.AllFunctions(prog) { + if fn.Synthetic == "" { + continue + } + name := fn.String() + wantDescr, ok := want[name] + if !ok { + t.Errorf("got unexpected/duplicate func: %q: %q", name, fn.Synthetic) + continue + } + delete(want, name) + + if wantDescr != fn.Synthetic { + t.Errorf("(%s).Synthetic = %q, want %q", name, fn.Synthetic, wantDescr) + } + } + for fn, descr := range want { + t.Errorf("want func: %q: %q", fn, descr) + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/builder_test.go b/vendor/golang.org/x/tools/go/ssa/builder_test.go new file mode 100644 index 0000000000..fdb58ff90c --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/builder_test.go @@ -0,0 +1,420 @@ +// Copyright 2013 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.5 + +package ssa_test + +import ( + "bytes" + "go/ast" + "go/importer" + "go/parser" + "go/token" + "go/types" + "reflect" + "sort" + "strings" + "testing" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +func isEmpty(f *ssa.Function) bool { return f.Blocks == nil } + +// Tests that programs partially loaded from gc object files contain +// functions with no code for the external portions, but are otherwise ok. +func TestBuildPackage(t *testing.T) { + input := ` +package main + +import ( + "bytes" + "io" + "testing" +) + +func main() { + var t testing.T + t.Parallel() // static call to external declared method + t.Fail() // static call to promoted external declared method + testing.Short() // static call to external package-level function + + var w io.Writer = new(bytes.Buffer) + w.Write(nil) // interface invoke of external declared method +} +` + + // Parse the file. + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, "input.go", input, 0) + if err != nil { + t.Error(err) + return + } + + // Build an SSA program from the parsed file. + // Load its dependencies from gc binary export data. + mainPkg, _, err := ssautil.BuildPackage(&types.Config{Importer: importer.Default()}, fset, + types.NewPackage("main", ""), []*ast.File{f}, ssa.SanityCheckFunctions) + if err != nil { + t.Error(err) + return + } + + // The main package, its direct and indirect dependencies are loaded. + deps := []string{ + // directly imported dependencies: + "bytes", "io", "testing", + // indirect dependencies (partial list): + "errors", "fmt", "os", "runtime", + } + + prog := mainPkg.Prog + all := prog.AllPackages() + if len(all) <= len(deps) { + t.Errorf("unexpected set of loaded packages: %q", all) + } + for _, path := range deps { + pkg := prog.ImportedPackage(path) + if pkg == nil { + t.Errorf("package not loaded: %q", path) + continue + } + + // External packages should have no function bodies (except for wrappers). + isExt := pkg != mainPkg + + // init() + if isExt && !isEmpty(pkg.Func("init")) { + t.Errorf("external package %s has non-empty init", pkg) + } else if !isExt && isEmpty(pkg.Func("init")) { + t.Errorf("main package %s has empty init", pkg) + } + + for _, mem := range pkg.Members { + switch mem := mem.(type) { + case *ssa.Function: + // Functions at package level. + if isExt && !isEmpty(mem) { + t.Errorf("external function %s is non-empty", mem) + } else if !isExt && isEmpty(mem) { + t.Errorf("function %s is empty", mem) + } + + case *ssa.Type: + // Methods of named types T. + // (In this test, all exported methods belong to *T not T.) + if !isExt { + t.Fatalf("unexpected name type in main package: %s", mem) + } + mset := prog.MethodSets.MethodSet(types.NewPointer(mem.Type())) + for i, n := 0, mset.Len(); i < n; i++ { + m := prog.MethodValue(mset.At(i)) + // For external types, only synthetic wrappers have code. + expExt := !strings.Contains(m.Synthetic, "wrapper") + if expExt && !isEmpty(m) { + t.Errorf("external method %s is non-empty: %s", + m, m.Synthetic) + } else if !expExt && isEmpty(m) { + t.Errorf("method function %s is empty: %s", + m, m.Synthetic) + } + } + } + } + } + + expectedCallee := []string{ + "(*testing.T).Parallel", + "(*testing.common).Fail", + "testing.Short", + "N/A", + } + callNum := 0 + for _, b := range mainPkg.Func("main").Blocks { + for _, instr := range b.Instrs { + switch instr := instr.(type) { + case ssa.CallInstruction: + call := instr.Common() + if want := expectedCallee[callNum]; want != "N/A" { + got := call.StaticCallee().String() + if want != got { + t.Errorf("call #%d from main.main: got callee %s, want %s", + callNum, got, want) + } + } + callNum++ + } + } + } + if callNum != 4 { + t.Errorf("in main.main: got %d calls, want %d", callNum, 4) + } +} + +// TestRuntimeTypes tests that (*Program).RuntimeTypes() includes all necessary types. +func TestRuntimeTypes(t *testing.T) { + tests := []struct { + input string + want []string + }{ + // An exported package-level type is needed. + {`package A; type T struct{}; func (T) f() {}`, + []string{"*p.T", "p.T"}, + }, + // An unexported package-level type is not needed. + {`package B; type t struct{}; func (t) f() {}`, + nil, + }, + // Subcomponents of type of exported package-level var are needed. + {`package C; import "bytes"; var V struct {*bytes.Buffer}`, + []string{"*bytes.Buffer", "*struct{*bytes.Buffer}", "struct{*bytes.Buffer}"}, + }, + // Subcomponents of type of unexported package-level var are not needed. + {`package D; import "bytes"; var v struct {*bytes.Buffer}`, + nil, + }, + // Subcomponents of type of exported package-level function are needed. + {`package E; import "bytes"; func F(struct {*bytes.Buffer}) {}`, + []string{"*bytes.Buffer", "struct{*bytes.Buffer}"}, + }, + // Subcomponents of type of unexported package-level function are not needed. + {`package F; import "bytes"; func f(struct {*bytes.Buffer}) {}`, + nil, + }, + // Subcomponents of type of exported method of uninstantiated unexported type are not needed. + {`package G; import "bytes"; type x struct{}; func (x) G(struct {*bytes.Buffer}) {}; var v x`, + nil, + }, + // ...unless used by MakeInterface. + {`package G2; import "bytes"; type x struct{}; func (x) G(struct {*bytes.Buffer}) {}; var v interface{} = x{}`, + []string{"*bytes.Buffer", "*p.x", "p.x", "struct{*bytes.Buffer}"}, + }, + // Subcomponents of type of unexported method are not needed. + {`package I; import "bytes"; type X struct{}; func (X) G(struct {*bytes.Buffer}) {}`, + []string{"*bytes.Buffer", "*p.X", "p.X", "struct{*bytes.Buffer}"}, + }, + // Local types aren't needed. + {`package J; import "bytes"; func f() { type T struct {*bytes.Buffer}; var t T; _ = t }`, + nil, + }, + // ...unless used by MakeInterface. + {`package K; import "bytes"; func f() { type T struct {*bytes.Buffer}; _ = interface{}(T{}) }`, + []string{"*bytes.Buffer", "*p.T", "p.T"}, + }, + // Types used as operand of MakeInterface are needed. + {`package L; import "bytes"; func f() { _ = interface{}(struct{*bytes.Buffer}{}) }`, + []string{"*bytes.Buffer", "struct{*bytes.Buffer}"}, + }, + // MakeInterface is optimized away when storing to a blank. + {`package M; import "bytes"; var _ interface{} = struct{*bytes.Buffer}{}`, + nil, + }, + } + for _, test := range tests { + // Parse the file. + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, "input.go", test.input, 0) + if err != nil { + t.Errorf("test %q: %s", test.input[:15], err) + continue + } + + // Create a single-file main package. + // Load dependencies from gc binary export data. + ssapkg, _, err := ssautil.BuildPackage(&types.Config{Importer: importer.Default()}, fset, + types.NewPackage("p", ""), []*ast.File{f}, ssa.SanityCheckFunctions) + if err != nil { + t.Errorf("test %q: %s", test.input[:15], err) + continue + } + + var typstrs []string + for _, T := range ssapkg.Prog.RuntimeTypes() { + typstrs = append(typstrs, T.String()) + } + sort.Strings(typstrs) + + if !reflect.DeepEqual(typstrs, test.want) { + t.Errorf("test 'package %s': got %q, want %q", + f.Name.Name, typstrs, test.want) + } + } +} + +// TestInit tests that synthesized init functions are correctly formed. +// Bare init functions omit calls to dependent init functions and the use of +// an init guard. They are useful in cases where the client uses a different +// calling convention for init functions, or cases where it is easier for a +// client to analyze bare init functions. Both of these aspects are used by +// the llgo compiler for simpler integration with gccgo's runtime library, +// and to simplify the analysis whereby it deduces which stores to globals +// can be lowered to global initializers. +func TestInit(t *testing.T) { + tests := []struct { + mode ssa.BuilderMode + input, want string + }{ + {0, `package A; import _ "errors"; var i int = 42`, + `# Name: A.init +# Package: A +# Synthetic: package initializer +func init(): +0: entry P:0 S:2 + t0 = *init$guard bool + if t0 goto 2 else 1 +1: init.start P:1 S:1 + *init$guard = true:bool + t1 = errors.init() () + *i = 42:int + jump 2 +2: init.done P:2 S:0 + return + +`}, + {ssa.BareInits, `package B; import _ "errors"; var i int = 42`, + `# Name: B.init +# Package: B +# Synthetic: package initializer +func init(): +0: entry P:0 S:0 + *i = 42:int + return + +`}, + } + for _, test := range tests { + // Create a single-file main package. + var conf loader.Config + f, err := conf.ParseFile("", test.input) + if err != nil { + t.Errorf("test %q: %s", test.input[:15], err) + continue + } + conf.CreateFromFiles(f.Name.Name, f) + + lprog, err := conf.Load() + if err != nil { + t.Errorf("test 'package %s': Load: %s", f.Name.Name, err) + continue + } + prog := ssautil.CreateProgram(lprog, test.mode) + mainPkg := prog.Package(lprog.Created[0].Pkg) + prog.Build() + initFunc := mainPkg.Func("init") + if initFunc == nil { + t.Errorf("test 'package %s': no init function", f.Name.Name) + continue + } + + var initbuf bytes.Buffer + _, err = initFunc.WriteTo(&initbuf) + if err != nil { + t.Errorf("test 'package %s': WriteTo: %s", f.Name.Name, err) + continue + } + + if initbuf.String() != test.want { + t.Errorf("test 'package %s': got %s, want %s", f.Name.Name, initbuf.String(), test.want) + } + } +} + +// TestSyntheticFuncs checks that the expected synthetic functions are +// created, reachable, and not duplicated. +func TestSyntheticFuncs(t *testing.T) { + const input = `package P +type T int +func (T) f() int +func (*T) g() int +var ( + // thunks + a = T.f + b = T.f + c = (struct{T}).f + d = (struct{T}).f + e = (*T).g + f = (*T).g + g = (struct{*T}).g + h = (struct{*T}).g + + // bounds + i = T(0).f + j = T(0).f + k = new(T).g + l = new(T).g + + // wrappers + m interface{} = struct{T}{} + n interface{} = struct{T}{} + o interface{} = struct{*T}{} + p interface{} = struct{*T}{} + q interface{} = new(struct{T}) + r interface{} = new(struct{T}) + s interface{} = new(struct{*T}) + t interface{} = new(struct{*T}) +) +` + // Parse + var conf loader.Config + f, err := conf.ParseFile("", input) + if err != nil { + t.Fatalf("parse: %v", err) + } + conf.CreateFromFiles(f.Name.Name, f) + + // Load + lprog, err := conf.Load() + if err != nil { + t.Fatalf("Load: %v", err) + } + + // Create and build SSA + prog := ssautil.CreateProgram(lprog, 0) + prog.Build() + + // Enumerate reachable synthetic functions + want := map[string]string{ + "(*P.T).g$bound": "bound method wrapper for func (*P.T).g() int", + "(P.T).f$bound": "bound method wrapper for func (P.T).f() int", + + "(*P.T).g$thunk": "thunk for func (*P.T).g() int", + "(P.T).f$thunk": "thunk for func (P.T).f() int", + "(struct{*P.T}).g$thunk": "thunk for func (*P.T).g() int", + "(struct{P.T}).f$thunk": "thunk for func (P.T).f() int", + + "(*P.T).f": "wrapper for func (P.T).f() int", + "(*struct{*P.T}).f": "wrapper for func (P.T).f() int", + "(*struct{*P.T}).g": "wrapper for func (*P.T).g() int", + "(*struct{P.T}).f": "wrapper for func (P.T).f() int", + "(*struct{P.T}).g": "wrapper for func (*P.T).g() int", + "(struct{*P.T}).f": "wrapper for func (P.T).f() int", + "(struct{*P.T}).g": "wrapper for func (*P.T).g() int", + "(struct{P.T}).f": "wrapper for func (P.T).f() int", + + "P.init": "package initializer", + } + for fn := range ssautil.AllFunctions(prog) { + if fn.Synthetic == "" { + continue + } + name := fn.String() + wantDescr, ok := want[name] + if !ok { + t.Errorf("got unexpected/duplicate func: %q: %q", name, fn.Synthetic) + continue + } + delete(want, name) + + if wantDescr != fn.Synthetic { + t.Errorf("(%s).Synthetic = %q, want %q", name, fn.Synthetic, wantDescr) + } + } + for fn, descr := range want { + t.Errorf("want func: %q: %q", fn, descr) + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/const.go b/vendor/golang.org/x/tools/go/ssa/const.go new file mode 100644 index 0000000000..0690463df2 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/const.go @@ -0,0 +1,171 @@ +// Copyright 2013 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 ssa + +// This file defines the Const SSA value type. + +import ( + "fmt" + exact "go/constant" + "go/token" + "go/types" + "strconv" +) + +// NewConst returns a new constant of the specified value and type. +// val must be valid according to the specification of Const.Value. +// +func NewConst(val exact.Value, typ types.Type) *Const { + return &Const{typ, val} +} + +// intConst returns an 'int' constant that evaluates to i. +// (i is an int64 in case the host is narrower than the target.) +func intConst(i int64) *Const { + return NewConst(exact.MakeInt64(i), tInt) +} + +// nilConst returns a nil constant of the specified type, which may +// be any reference type, including interfaces. +// +func nilConst(typ types.Type) *Const { + return NewConst(nil, typ) +} + +// stringConst returns a 'string' constant that evaluates to s. +func stringConst(s string) *Const { + return NewConst(exact.MakeString(s), tString) +} + +// zeroConst returns a new "zero" constant of the specified type, +// which must not be an array or struct type: the zero values of +// aggregates are well-defined but cannot be represented by Const. +// +func zeroConst(t types.Type) *Const { + switch t := t.(type) { + case *types.Basic: + switch { + case t.Info()&types.IsBoolean != 0: + return NewConst(exact.MakeBool(false), t) + case t.Info()&types.IsNumeric != 0: + return NewConst(exact.MakeInt64(0), t) + case t.Info()&types.IsString != 0: + return NewConst(exact.MakeString(""), t) + case t.Kind() == types.UnsafePointer: + fallthrough + case t.Kind() == types.UntypedNil: + return nilConst(t) + default: + panic(fmt.Sprint("zeroConst for unexpected type:", t)) + } + case *types.Pointer, *types.Slice, *types.Interface, *types.Chan, *types.Map, *types.Signature: + return nilConst(t) + case *types.Named: + return NewConst(zeroConst(t.Underlying()).Value, t) + case *types.Array, *types.Struct, *types.Tuple: + panic(fmt.Sprint("zeroConst applied to aggregate:", t)) + } + panic(fmt.Sprint("zeroConst: unexpected ", t)) +} + +func (c *Const) RelString(from *types.Package) string { + var s string + if c.Value == nil { + s = "nil" + } else if c.Value.Kind() == exact.String { + s = exact.StringVal(c.Value) + const max = 20 + // TODO(adonovan): don't cut a rune in half. + if len(s) > max { + s = s[:max-3] + "..." // abbreviate + } + s = strconv.Quote(s) + } else { + s = c.Value.String() + } + return s + ":" + relType(c.Type(), from) +} + +func (c *Const) Name() string { + return c.RelString(nil) +} + +func (c *Const) String() string { + return c.Name() +} + +func (c *Const) Type() types.Type { + return c.typ +} + +func (c *Const) Referrers() *[]Instruction { + return nil +} + +func (c *Const) Parent() *Function { return nil } + +func (c *Const) Pos() token.Pos { + return token.NoPos +} + +// IsNil returns true if this constant represents a typed or untyped nil value. +func (c *Const) IsNil() bool { + return c.Value == nil +} + +// TODO(adonovan): move everything below into golang.org/x/tools/go/ssa/interp. + +// Int64 returns the numeric value of this constant truncated to fit +// a signed 64-bit integer. +// +func (c *Const) Int64() int64 { + switch x := exact.ToInt(c.Value); x.Kind() { + case exact.Int: + if i, ok := exact.Int64Val(x); ok { + return i + } + return 0 + case exact.Float: + f, _ := exact.Float64Val(x) + return int64(f) + } + panic(fmt.Sprintf("unexpected constant value: %T", c.Value)) +} + +// Uint64 returns the numeric value of this constant truncated to fit +// an unsigned 64-bit integer. +// +func (c *Const) Uint64() uint64 { + switch x := exact.ToInt(c.Value); x.Kind() { + case exact.Int: + if u, ok := exact.Uint64Val(x); ok { + return u + } + return 0 + case exact.Float: + f, _ := exact.Float64Val(x) + return uint64(f) + } + panic(fmt.Sprintf("unexpected constant value: %T", c.Value)) +} + +// Float64 returns the numeric value of this constant truncated to fit +// a float64. +// +func (c *Const) Float64() float64 { + f, _ := exact.Float64Val(c.Value) + return f +} + +// Complex128 returns the complex value of this constant truncated to +// fit a complex128. +// +func (c *Const) Complex128() complex128 { + re, _ := exact.Float64Val(exact.Real(c.Value)) + im, _ := exact.Float64Val(exact.Imag(c.Value)) + return complex(re, im) +} diff --git a/vendor/golang.org/x/tools/go/ssa/const14.go b/vendor/golang.org/x/tools/go/ssa/const14.go new file mode 100644 index 0000000000..0ec43b6f86 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/const14.go @@ -0,0 +1,170 @@ +// Copyright 2013 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.5 + +package ssa + +// This file defines the Const SSA value type. + +import ( + "fmt" + "go/token" + "strconv" + + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/types" +) + +// NewConst returns a new constant of the specified value and type. +// val must be valid according to the specification of Const.Value. +// +func NewConst(val exact.Value, typ types.Type) *Const { + return &Const{typ, val} +} + +// intConst returns an 'int' constant that evaluates to i. +// (i is an int64 in case the host is narrower than the target.) +func intConst(i int64) *Const { + return NewConst(exact.MakeInt64(i), tInt) +} + +// nilConst returns a nil constant of the specified type, which may +// be any reference type, including interfaces. +// +func nilConst(typ types.Type) *Const { + return NewConst(nil, typ) +} + +// stringConst returns a 'string' constant that evaluates to s. +func stringConst(s string) *Const { + return NewConst(exact.MakeString(s), tString) +} + +// zeroConst returns a new "zero" constant of the specified type, +// which must not be an array or struct type: the zero values of +// aggregates are well-defined but cannot be represented by Const. +// +func zeroConst(t types.Type) *Const { + switch t := t.(type) { + case *types.Basic: + switch { + case t.Info()&types.IsBoolean != 0: + return NewConst(exact.MakeBool(false), t) + case t.Info()&types.IsNumeric != 0: + return NewConst(exact.MakeInt64(0), t) + case t.Info()&types.IsString != 0: + return NewConst(exact.MakeString(""), t) + case t.Kind() == types.UnsafePointer: + fallthrough + case t.Kind() == types.UntypedNil: + return nilConst(t) + default: + panic(fmt.Sprint("zeroConst for unexpected type:", t)) + } + case *types.Pointer, *types.Slice, *types.Interface, *types.Chan, *types.Map, *types.Signature: + return nilConst(t) + case *types.Named: + return NewConst(zeroConst(t.Underlying()).Value, t) + case *types.Array, *types.Struct, *types.Tuple: + panic(fmt.Sprint("zeroConst applied to aggregate:", t)) + } + panic(fmt.Sprint("zeroConst: unexpected ", t)) +} + +func (c *Const) RelString(from *types.Package) string { + var s string + if c.Value == nil { + s = "nil" + } else if c.Value.Kind() == exact.String { + s = exact.StringVal(c.Value) + const max = 20 + // TODO(adonovan): don't cut a rune in half. + if len(s) > max { + s = s[:max-3] + "..." // abbreviate + } + s = strconv.Quote(s) + } else { + s = c.Value.String() + } + return s + ":" + relType(c.Type(), from) +} + +func (c *Const) Name() string { + return c.RelString(nil) +} + +func (c *Const) String() string { + return c.Name() +} + +func (c *Const) Type() types.Type { + return c.typ +} + +func (c *Const) Referrers() *[]Instruction { + return nil +} + +func (c *Const) Parent() *Function { return nil } + +func (c *Const) Pos() token.Pos { + return token.NoPos +} + +// IsNil returns true if this constant represents a typed or untyped nil value. +func (c *Const) IsNil() bool { + return c.Value == nil +} + +// Int64 returns the numeric value of this constant truncated to fit +// a signed 64-bit integer. +// +func (c *Const) Int64() int64 { + switch x := c.Value; x.Kind() { + case exact.Int: + if i, ok := exact.Int64Val(x); ok { + return i + } + return 0 + case exact.Float: + f, _ := exact.Float64Val(x) + return int64(f) + } + panic(fmt.Sprintf("unexpected constant value: %T", c.Value)) +} + +// Uint64 returns the numeric value of this constant truncated to fit +// an unsigned 64-bit integer. +// +func (c *Const) Uint64() uint64 { + switch x := c.Value; x.Kind() { + case exact.Int: + if u, ok := exact.Uint64Val(x); ok { + return u + } + return 0 + case exact.Float: + f, _ := exact.Float64Val(x) + return uint64(f) + } + panic(fmt.Sprintf("unexpected constant value: %T", c.Value)) +} + +// Float64 returns the numeric value of this constant truncated to fit +// a float64. +// +func (c *Const) Float64() float64 { + f, _ := exact.Float64Val(c.Value) + return f +} + +// Complex128 returns the complex value of this constant truncated to +// fit a complex128. +// +func (c *Const) Complex128() complex128 { + re, _ := exact.Float64Val(exact.Real(c.Value)) + im, _ := exact.Float64Val(exact.Imag(c.Value)) + return complex(re, im) +} diff --git a/vendor/golang.org/x/tools/go/ssa/const15.go b/vendor/golang.org/x/tools/go/ssa/const15.go new file mode 100644 index 0000000000..a42b255a67 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/const15.go @@ -0,0 +1,171 @@ +// Copyright 2013 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.5,!go1.6 + +package ssa + +// This file defines the Const SSA value type. + +import ( + "fmt" + exact "go/constant" + "go/token" + "go/types" + "strconv" +) + +// NewConst returns a new constant of the specified value and type. +// val must be valid according to the specification of Const.Value. +// +func NewConst(val exact.Value, typ types.Type) *Const { + return &Const{typ, val} +} + +// intConst returns an 'int' constant that evaluates to i. +// (i is an int64 in case the host is narrower than the target.) +func intConst(i int64) *Const { + return NewConst(exact.MakeInt64(i), tInt) +} + +// nilConst returns a nil constant of the specified type, which may +// be any reference type, including interfaces. +// +func nilConst(typ types.Type) *Const { + return NewConst(nil, typ) +} + +// stringConst returns a 'string' constant that evaluates to s. +func stringConst(s string) *Const { + return NewConst(exact.MakeString(s), tString) +} + +// zeroConst returns a new "zero" constant of the specified type, +// which must not be an array or struct type: the zero values of +// aggregates are well-defined but cannot be represented by Const. +// +func zeroConst(t types.Type) *Const { + switch t := t.(type) { + case *types.Basic: + switch { + case t.Info()&types.IsBoolean != 0: + return NewConst(exact.MakeBool(false), t) + case t.Info()&types.IsNumeric != 0: + return NewConst(exact.MakeInt64(0), t) + case t.Info()&types.IsString != 0: + return NewConst(exact.MakeString(""), t) + case t.Kind() == types.UnsafePointer: + fallthrough + case t.Kind() == types.UntypedNil: + return nilConst(t) + default: + panic(fmt.Sprint("zeroConst for unexpected type:", t)) + } + case *types.Pointer, *types.Slice, *types.Interface, *types.Chan, *types.Map, *types.Signature: + return nilConst(t) + case *types.Named: + return NewConst(zeroConst(t.Underlying()).Value, t) + case *types.Array, *types.Struct, *types.Tuple: + panic(fmt.Sprint("zeroConst applied to aggregate:", t)) + } + panic(fmt.Sprint("zeroConst: unexpected ", t)) +} + +func (c *Const) RelString(from *types.Package) string { + var s string + if c.Value == nil { + s = "nil" + } else if c.Value.Kind() == exact.String { + s = exact.StringVal(c.Value) + const max = 20 + // TODO(adonovan): don't cut a rune in half. + if len(s) > max { + s = s[:max-3] + "..." // abbreviate + } + s = strconv.Quote(s) + } else { + s = c.Value.String() + } + return s + ":" + relType(c.Type(), from) +} + +func (c *Const) Name() string { + return c.RelString(nil) +} + +func (c *Const) String() string { + return c.Name() +} + +func (c *Const) Type() types.Type { + return c.typ +} + +func (c *Const) Referrers() *[]Instruction { + return nil +} + +func (c *Const) Parent() *Function { return nil } + +func (c *Const) Pos() token.Pos { + return token.NoPos +} + +// IsNil returns true if this constant represents a typed or untyped nil value. +func (c *Const) IsNil() bool { + return c.Value == nil +} + +// TODO(adonovan): move everything below into golang.org/x/tools/go/ssa/interp. + +// Int64 returns the numeric value of this constant truncated to fit +// a signed 64-bit integer. +// +func (c *Const) Int64() int64 { + switch x := c.Value; x.Kind() { + case exact.Int: + if i, ok := exact.Int64Val(x); ok { + return i + } + return 0 + case exact.Float: + f, _ := exact.Float64Val(x) + return int64(f) + } + panic(fmt.Sprintf("unexpected constant value: %T", c.Value)) +} + +// Uint64 returns the numeric value of this constant truncated to fit +// an unsigned 64-bit integer. +// +func (c *Const) Uint64() uint64 { + switch x := c.Value; x.Kind() { + case exact.Int: + if u, ok := exact.Uint64Val(x); ok { + return u + } + return 0 + case exact.Float: + f, _ := exact.Float64Val(x) + return uint64(f) + } + panic(fmt.Sprintf("unexpected constant value: %T", c.Value)) +} + +// Float64 returns the numeric value of this constant truncated to fit +// a float64. +// +func (c *Const) Float64() float64 { + f, _ := exact.Float64Val(c.Value) + return f +} + +// Complex128 returns the complex value of this constant truncated to +// fit a complex128. +// +func (c *Const) Complex128() complex128 { + re, _ := exact.Float64Val(exact.Real(c.Value)) + im, _ := exact.Float64Val(exact.Imag(c.Value)) + return complex(re, im) +} diff --git a/vendor/golang.org/x/tools/go/ssa/create.go b/vendor/golang.org/x/tools/go/ssa/create.go new file mode 100644 index 0000000000..372d1c7288 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/create.go @@ -0,0 +1,259 @@ +// Copyright 2013 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.5 + +package ssa + +// This file implements the CREATE phase of SSA construction. +// See builder.go for explanation. + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" + "os" + "sync" + + "golang.org/x/tools/go/types/typeutil" +) + +// NewProgram returns a new SSA Program. +// +// mode controls diagnostics and checking during SSA construction. +// +func NewProgram(fset *token.FileSet, mode BuilderMode) *Program { + prog := &Program{ + Fset: fset, + imported: make(map[string]*Package), + packages: make(map[*types.Package]*Package), + thunks: make(map[selectionKey]*Function), + bounds: make(map[*types.Func]*Function), + mode: mode, + } + + h := typeutil.MakeHasher() // protected by methodsMu, in effect + prog.methodSets.SetHasher(h) + prog.canon.SetHasher(h) + + return prog +} + +// memberFromObject populates package pkg with a member for the +// typechecker object obj. +// +// For objects from Go source code, syntax is the associated syntax +// tree (for funcs and vars only); it will be used during the build +// phase. +// +func memberFromObject(pkg *Package, obj types.Object, syntax ast.Node) { + name := obj.Name() + switch obj := obj.(type) { + case *types.TypeName: + pkg.Members[name] = &Type{ + object: obj, + pkg: pkg, + } + + case *types.Const: + c := &NamedConst{ + object: obj, + Value: NewConst(obj.Val(), obj.Type()), + pkg: pkg, + } + pkg.values[obj] = c.Value + pkg.Members[name] = c + + case *types.Var: + g := &Global{ + Pkg: pkg, + name: name, + object: obj, + typ: types.NewPointer(obj.Type()), // address + pos: obj.Pos(), + } + pkg.values[obj] = g + pkg.Members[name] = g + + case *types.Func: + sig := obj.Type().(*types.Signature) + if sig.Recv() == nil && name == "init" { + pkg.ninit++ + name = fmt.Sprintf("init#%d", pkg.ninit) + } + fn := &Function{ + name: name, + object: obj, + Signature: sig, + syntax: syntax, + pos: obj.Pos(), + Pkg: pkg, + Prog: pkg.Prog, + } + if syntax == nil { + fn.Synthetic = "loaded from gc object file" + } + + pkg.values[obj] = fn + if sig.Recv() == nil { + pkg.Members[name] = fn // package-level function + } + + default: // (incl. *types.Package) + panic("unexpected Object type: " + obj.String()) + } +} + +// membersFromDecl populates package pkg with members for each +// typechecker object (var, func, const or type) associated with the +// specified decl. +// +func membersFromDecl(pkg *Package, decl ast.Decl) { + switch decl := decl.(type) { + case *ast.GenDecl: // import, const, type or var + switch decl.Tok { + case token.CONST: + for _, spec := range decl.Specs { + for _, id := range spec.(*ast.ValueSpec).Names { + if !isBlankIdent(id) { + memberFromObject(pkg, pkg.info.Defs[id], nil) + } + } + } + + case token.VAR: + for _, spec := range decl.Specs { + for _, id := range spec.(*ast.ValueSpec).Names { + if !isBlankIdent(id) { + memberFromObject(pkg, pkg.info.Defs[id], spec) + } + } + } + + case token.TYPE: + for _, spec := range decl.Specs { + id := spec.(*ast.TypeSpec).Name + if !isBlankIdent(id) { + memberFromObject(pkg, pkg.info.Defs[id], nil) + } + } + } + + case *ast.FuncDecl: + id := decl.Name + if !isBlankIdent(id) { + memberFromObject(pkg, pkg.info.Defs[id], decl) + } + } +} + +// CreatePackage constructs and returns an SSA Package from the +// specified type-checked, error-free file ASTs, and populates its +// Members mapping. +// +// importable determines whether this package should be returned by a +// subsequent call to ImportedPackage(pkg.Path()). +// +// The real work of building SSA form for each function is not done +// until a subsequent call to Package.Build(). +// +func (prog *Program) CreatePackage(pkg *types.Package, files []*ast.File, info *types.Info, importable bool) *Package { + p := &Package{ + Prog: prog, + Members: make(map[string]Member), + values: make(map[types.Object]Value), + Pkg: pkg, + info: info, // transient (CREATE and BUILD phases) + files: files, // transient (CREATE and BUILD phases) + } + + // Add init() function. + p.init = &Function{ + name: "init", + Signature: new(types.Signature), + Synthetic: "package initializer", + Pkg: p, + Prog: prog, + } + p.Members[p.init.name] = p.init + + // CREATE phase. + // Allocate all package members: vars, funcs, consts and types. + if len(files) > 0 { + // Go source package. + for _, file := range files { + for _, decl := range file.Decls { + membersFromDecl(p, decl) + } + } + } else { + // GC-compiled binary package. + // No code. + // No position information. + scope := p.Pkg.Scope() + for _, name := range scope.Names() { + obj := scope.Lookup(name) + memberFromObject(p, obj, nil) + if obj, ok := obj.(*types.TypeName); ok { + named := obj.Type().(*types.Named) + for i, n := 0, named.NumMethods(); i < n; i++ { + memberFromObject(p, named.Method(i), nil) + } + } + } + } + + if prog.mode&BareInits == 0 { + // Add initializer guard variable. + initguard := &Global{ + Pkg: p, + name: "init$guard", + typ: types.NewPointer(tBool), + } + p.Members[initguard.Name()] = initguard + } + + if prog.mode&GlobalDebug != 0 { + p.SetDebugMode(true) + } + + if prog.mode&PrintPackages != 0 { + printMu.Lock() + p.WriteTo(os.Stdout) + printMu.Unlock() + } + + if importable { + prog.imported[p.Pkg.Path()] = p + } + prog.packages[p.Pkg] = p + + return p +} + +// printMu serializes printing of Packages/Functions to stdout. +var printMu sync.Mutex + +// AllPackages returns a new slice containing all packages in the +// program prog in unspecified order. +// +func (prog *Program) AllPackages() []*Package { + pkgs := make([]*Package, 0, len(prog.packages)) + for _, pkg := range prog.packages { + pkgs = append(pkgs, pkg) + } + return pkgs +} + +// ImportedPackage returns the importable SSA Package whose import +// path is path, or nil if no such SSA package has been created. +// +// Not all packages are importable. For example, no import +// declaration can resolve to the x_test package created by 'go test' +// or the ad-hoc main package created 'go build foo.go'. +// +func (prog *Program) ImportedPackage(path string) *Package { + return prog.imported[path] +} diff --git a/vendor/golang.org/x/tools/go/ssa/create14.go b/vendor/golang.org/x/tools/go/ssa/create14.go new file mode 100644 index 0000000000..58be47e9ad --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/create14.go @@ -0,0 +1,259 @@ +// Copyright 2013 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.5 + +package ssa + +// This file implements the CREATE phase of SSA construction. +// See builder.go for explanation. + +import ( + "fmt" + "go/ast" + "go/token" + "os" + "sync" + + "golang.org/x/tools/go/types" + "golang.org/x/tools/go/types/typeutil" +) + +// NewProgram returns a new SSA Program. +// +// mode controls diagnostics and checking during SSA construction. +// +func NewProgram(fset *token.FileSet, mode BuilderMode) *Program { + prog := &Program{ + Fset: fset, + imported: make(map[string]*Package), + packages: make(map[*types.Package]*Package), + thunks: make(map[selectionKey]*Function), + bounds: make(map[*types.Func]*Function), + mode: mode, + } + + h := typeutil.MakeHasher() // protected by methodsMu, in effect + prog.methodSets.SetHasher(h) + prog.canon.SetHasher(h) + + return prog +} + +// memberFromObject populates package pkg with a member for the +// typechecker object obj. +// +// For objects from Go source code, syntax is the associated syntax +// tree (for funcs and vars only); it will be used during the build +// phase. +// +func memberFromObject(pkg *Package, obj types.Object, syntax ast.Node) { + name := obj.Name() + switch obj := obj.(type) { + case *types.TypeName: + pkg.Members[name] = &Type{ + object: obj, + pkg: pkg, + } + + case *types.Const: + c := &NamedConst{ + object: obj, + Value: NewConst(obj.Val(), obj.Type()), + pkg: pkg, + } + pkg.values[obj] = c.Value + pkg.Members[name] = c + + case *types.Var: + g := &Global{ + Pkg: pkg, + name: name, + object: obj, + typ: types.NewPointer(obj.Type()), // address + pos: obj.Pos(), + } + pkg.values[obj] = g + pkg.Members[name] = g + + case *types.Func: + sig := obj.Type().(*types.Signature) + if sig.Recv() == nil && name == "init" { + pkg.ninit++ + name = fmt.Sprintf("init#%d", pkg.ninit) + } + fn := &Function{ + name: name, + object: obj, + Signature: sig, + syntax: syntax, + pos: obj.Pos(), + Pkg: pkg, + Prog: pkg.Prog, + } + if syntax == nil { + fn.Synthetic = "loaded from gc object file" + } + + pkg.values[obj] = fn + if sig.Recv() == nil { + pkg.Members[name] = fn // package-level function + } + + default: // (incl. *types.Package) + panic("unexpected Object type: " + obj.String()) + } +} + +// membersFromDecl populates package pkg with members for each +// typechecker object (var, func, const or type) associated with the +// specified decl. +// +func membersFromDecl(pkg *Package, decl ast.Decl) { + switch decl := decl.(type) { + case *ast.GenDecl: // import, const, type or var + switch decl.Tok { + case token.CONST: + for _, spec := range decl.Specs { + for _, id := range spec.(*ast.ValueSpec).Names { + if !isBlankIdent(id) { + memberFromObject(pkg, pkg.info.Defs[id], nil) + } + } + } + + case token.VAR: + for _, spec := range decl.Specs { + for _, id := range spec.(*ast.ValueSpec).Names { + if !isBlankIdent(id) { + memberFromObject(pkg, pkg.info.Defs[id], spec) + } + } + } + + case token.TYPE: + for _, spec := range decl.Specs { + id := spec.(*ast.TypeSpec).Name + if !isBlankIdent(id) { + memberFromObject(pkg, pkg.info.Defs[id], nil) + } + } + } + + case *ast.FuncDecl: + id := decl.Name + if !isBlankIdent(id) { + memberFromObject(pkg, pkg.info.Defs[id], decl) + } + } +} + +// CreatePackage constructs and returns an SSA Package from the +// specified type-checked, error-free file ASTs, and populates its +// Members mapping. +// +// importable determines whether this package should be returned by a +// subsequent call to ImportedPackage(pkg.Path()). +// +// The real work of building SSA form for each function is not done +// until a subsequent call to Package.Build(). +// +func (prog *Program) CreatePackage(pkg *types.Package, files []*ast.File, info *types.Info, importable bool) *Package { + p := &Package{ + Prog: prog, + Members: make(map[string]Member), + values: make(map[types.Object]Value), + Pkg: pkg, + info: info, // transient (CREATE and BUILD phases) + files: files, // transient (CREATE and BUILD phases) + } + + // Add init() function. + p.init = &Function{ + name: "init", + Signature: new(types.Signature), + Synthetic: "package initializer", + Pkg: p, + Prog: prog, + } + p.Members[p.init.name] = p.init + + // CREATE phase. + // Allocate all package members: vars, funcs, consts and types. + if len(files) > 0 { + // Go source package. + for _, file := range files { + for _, decl := range file.Decls { + membersFromDecl(p, decl) + } + } + } else { + // GC-compiled binary package. + // No code. + // No position information. + scope := p.Pkg.Scope() + for _, name := range scope.Names() { + obj := scope.Lookup(name) + memberFromObject(p, obj, nil) + if obj, ok := obj.(*types.TypeName); ok { + named := obj.Type().(*types.Named) + for i, n := 0, named.NumMethods(); i < n; i++ { + memberFromObject(p, named.Method(i), nil) + } + } + } + } + + if prog.mode&BareInits == 0 { + // Add initializer guard variable. + initguard := &Global{ + Pkg: p, + name: "init$guard", + typ: types.NewPointer(tBool), + } + p.Members[initguard.Name()] = initguard + } + + if prog.mode&GlobalDebug != 0 { + p.SetDebugMode(true) + } + + if prog.mode&PrintPackages != 0 { + printMu.Lock() + p.WriteTo(os.Stdout) + printMu.Unlock() + } + + if importable { + prog.imported[p.Pkg.Path()] = p + } + prog.packages[p.Pkg] = p + + return p +} + +// printMu serializes printing of Packages/Functions to stdout. +var printMu sync.Mutex + +// AllPackages returns a new slice containing all packages in the +// program prog in unspecified order. +// +func (prog *Program) AllPackages() []*Package { + pkgs := make([]*Package, 0, len(prog.packages)) + for _, pkg := range prog.packages { + pkgs = append(pkgs, pkg) + } + return pkgs +} + +// ImportedPackage returns the importable SSA Package whose import +// path is path, or nil if no such SSA package has been created. +// +// Not all packages are importable. For example, no import +// declaration can resolve to the x_test package created by 'go test' +// or the ad-hoc main package created 'go build foo.go'. +// +func (prog *Program) ImportedPackage(path string) *Package { + return prog.imported[path] +} diff --git a/vendor/golang.org/x/tools/go/ssa/doc.go b/vendor/golang.org/x/tools/go/ssa/doc.go new file mode 100644 index 0000000000..2aa04f4365 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/doc.go @@ -0,0 +1,123 @@ +// Copyright 2013 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 ssa defines a representation of the elements of Go programs +// (packages, types, functions, variables and constants) using a +// static single-assignment (SSA) form intermediate representation +// (IR) for the bodies of functions. +// +// THIS INTERFACE IS EXPERIMENTAL AND IS LIKELY TO CHANGE. +// +// For an introduction to SSA form, see +// http://en.wikipedia.org/wiki/Static_single_assignment_form. +// This page provides a broader reading list: +// http://www.dcs.gla.ac.uk/~jsinger/ssa.html. +// +// The level of abstraction of the SSA form is intentionally close to +// the source language to facilitate construction of source analysis +// tools. It is not intended for machine code generation. +// +// All looping, branching and switching constructs are replaced with +// unstructured control flow. Higher-level control flow constructs +// such as multi-way branch can be reconstructed as needed; see +// ssautil.Switches() for an example. +// +// To construct an SSA-form program, call ssautil.CreateProgram on a +// loader.Program, a set of type-checked packages created from +// parsed Go source files. The resulting ssa.Program contains all the +// packages and their members, but SSA code is not created for +// function bodies until a subsequent call to (*Package).Build. +// +// The builder initially builds a naive SSA form in which all local +// variables are addresses of stack locations with explicit loads and +// stores. Registerisation of eligible locals and φ-node insertion +// using dominance and dataflow are then performed as a second pass +// called "lifting" to improve the accuracy and performance of +// subsequent analyses; this pass can be skipped by setting the +// NaiveForm builder flag. +// +// The primary interfaces of this package are: +// +// - Member: a named member of a Go package. +// - Value: an expression that yields a value. +// - Instruction: a statement that consumes values and performs computation. +// - Node: a Value or Instruction (emphasizing its membership in the SSA value graph) +// +// A computation that yields a result implements both the Value and +// Instruction interfaces. The following table shows for each +// concrete type which of these interfaces it implements. +// +// Value? Instruction? Member? +// *Alloc ✔ ✔ +// *BinOp ✔ ✔ +// *Builtin ✔ +// *Call ✔ ✔ +// *ChangeInterface ✔ ✔ +// *ChangeType ✔ ✔ +// *Const ✔ +// *Convert ✔ ✔ +// *DebugRef ✔ +// *Defer ✔ +// *Extract ✔ ✔ +// *Field ✔ ✔ +// *FieldAddr ✔ ✔ +// *FreeVar ✔ +// *Function ✔ ✔ (func) +// *Global ✔ ✔ (var) +// *Go ✔ +// *If ✔ +// *Index ✔ ✔ +// *IndexAddr ✔ ✔ +// *Jump ✔ +// *Lookup ✔ ✔ +// *MakeChan ✔ ✔ +// *MakeClosure ✔ ✔ +// *MakeInterface ✔ ✔ +// *MakeMap ✔ ✔ +// *MakeSlice ✔ ✔ +// *MapUpdate ✔ +// *NamedConst ✔ (const) +// *Next ✔ ✔ +// *Panic ✔ +// *Parameter ✔ +// *Phi ✔ ✔ +// *Range ✔ ✔ +// *Return ✔ +// *RunDefers ✔ +// *Select ✔ ✔ +// *Send ✔ +// *Slice ✔ ✔ +// *Store ✔ +// *Type ✔ (type) +// *TypeAssert ✔ ✔ +// *UnOp ✔ ✔ +// +// Other key types in this package include: Program, Package, Function +// and BasicBlock. +// +// The program representation constructed by this package is fully +// resolved internally, i.e. it does not rely on the names of Values, +// Packages, Functions, Types or BasicBlocks for the correct +// interpretation of the program. Only the identities of objects and +// the topology of the SSA and type graphs are semantically +// significant. (There is one exception: Ids, used to identify field +// and method names, contain strings.) Avoidance of name-based +// operations simplifies the implementation of subsequent passes and +// can make them very efficient. Many objects are nonetheless named +// to aid in debugging, but it is not essential that the names be +// either accurate or unambiguous. The public API exposes a number of +// name-based maps for client convenience. +// +// The ssa/ssautil package provides various utilities that depend only +// on the public API of this package. +// +// TODO(adonovan): Consider the exceptional control-flow implications +// of defer and recover(). +// +// TODO(adonovan): write a how-to document for all the various cases +// of trying to determine corresponding elements across the four +// domains of source locations, ast.Nodes, types.Objects, +// ssa.Values/Instructions. +// +package ssa // import "golang.org/x/tools/go/ssa" diff --git a/vendor/golang.org/x/tools/go/ssa/dom.go b/vendor/golang.org/x/tools/go/ssa/dom.go new file mode 100644 index 0000000000..12ef4308f3 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/dom.go @@ -0,0 +1,341 @@ +// Copyright 2013 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 ssa + +// This file defines algorithms related to dominance. + +// Dominator tree construction ---------------------------------------- +// +// We use the algorithm described in Lengauer & Tarjan. 1979. A fast +// algorithm for finding dominators in a flowgraph. +// http://doi.acm.org/10.1145/357062.357071 +// +// We also apply the optimizations to SLT described in Georgiadis et +// al, Finding Dominators in Practice, JGAA 2006, +// http://jgaa.info/accepted/2006/GeorgiadisTarjanWerneck2006.10.1.pdf +// to avoid the need for buckets of size > 1. + +import ( + "bytes" + "fmt" + "math/big" + "os" + "sort" +) + +// Idom returns the block that immediately dominates b: +// its parent in the dominator tree, if any. +// Neither the entry node (b.Index==0) nor recover node +// (b==b.Parent().Recover()) have a parent. +// +func (b *BasicBlock) Idom() *BasicBlock { return b.dom.idom } + +// Dominees returns the list of blocks that b immediately dominates: +// its children in the dominator tree. +// +func (b *BasicBlock) Dominees() []*BasicBlock { return b.dom.children } + +// Dominates reports whether b dominates c. +func (b *BasicBlock) Dominates(c *BasicBlock) bool { + return b.dom.pre <= c.dom.pre && c.dom.post <= b.dom.post +} + +type byDomPreorder []*BasicBlock + +func (a byDomPreorder) Len() int { return len(a) } +func (a byDomPreorder) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byDomPreorder) Less(i, j int) bool { return a[i].dom.pre < a[j].dom.pre } + +// DomPreorder returns a new slice containing the blocks of f in +// dominator tree preorder. +// +func (f *Function) DomPreorder() []*BasicBlock { + n := len(f.Blocks) + order := make(byDomPreorder, n, n) + copy(order, f.Blocks) + sort.Sort(order) + return order +} + +// domInfo contains a BasicBlock's dominance information. +type domInfo struct { + idom *BasicBlock // immediate dominator (parent in domtree) + children []*BasicBlock // nodes immediately dominated by this one + pre, post int32 // pre- and post-order numbering within domtree +} + +// ltState holds the working state for Lengauer-Tarjan algorithm +// (during which domInfo.pre is repurposed for CFG DFS preorder number). +type ltState struct { + // Each slice is indexed by b.Index. + sdom []*BasicBlock // b's semidominator + parent []*BasicBlock // b's parent in DFS traversal of CFG + ancestor []*BasicBlock // b's ancestor with least sdom +} + +// dfs implements the depth-first search part of the LT algorithm. +func (lt *ltState) dfs(v *BasicBlock, i int32, preorder []*BasicBlock) int32 { + preorder[i] = v + v.dom.pre = i // For now: DFS preorder of spanning tree of CFG + i++ + lt.sdom[v.Index] = v + lt.link(nil, v) + for _, w := range v.Succs { + if lt.sdom[w.Index] == nil { + lt.parent[w.Index] = v + i = lt.dfs(w, i, preorder) + } + } + return i +} + +// eval implements the EVAL part of the LT algorithm. +func (lt *ltState) eval(v *BasicBlock) *BasicBlock { + // TODO(adonovan): opt: do path compression per simple LT. + u := v + for ; lt.ancestor[v.Index] != nil; v = lt.ancestor[v.Index] { + if lt.sdom[v.Index].dom.pre < lt.sdom[u.Index].dom.pre { + u = v + } + } + return u +} + +// link implements the LINK part of the LT algorithm. +func (lt *ltState) link(v, w *BasicBlock) { + lt.ancestor[w.Index] = v +} + +// buildDomTree computes the dominator tree of f using the LT algorithm. +// Precondition: all blocks are reachable (e.g. optimizeBlocks has been run). +// +func buildDomTree(f *Function) { + // The step numbers refer to the original LT paper; the + // reordering is due to Georgiadis. + + // Clear any previous domInfo. + for _, b := range f.Blocks { + b.dom = domInfo{} + } + + n := len(f.Blocks) + // Allocate space for 5 contiguous [n]*BasicBlock arrays: + // sdom, parent, ancestor, preorder, buckets. + space := make([]*BasicBlock, 5*n, 5*n) + lt := ltState{ + sdom: space[0:n], + parent: space[n : 2*n], + ancestor: space[2*n : 3*n], + } + + // Step 1. Number vertices by depth-first preorder. + preorder := space[3*n : 4*n] + root := f.Blocks[0] + prenum := lt.dfs(root, 0, preorder) + recover := f.Recover + if recover != nil { + lt.dfs(recover, prenum, preorder) + } + + buckets := space[4*n : 5*n] + copy(buckets, preorder) + + // In reverse preorder... + for i := int32(n) - 1; i > 0; i-- { + w := preorder[i] + + // Step 3. Implicitly define the immediate dominator of each node. + for v := buckets[i]; v != w; v = buckets[v.dom.pre] { + u := lt.eval(v) + if lt.sdom[u.Index].dom.pre < i { + v.dom.idom = u + } else { + v.dom.idom = w + } + } + + // Step 2. Compute the semidominators of all nodes. + lt.sdom[w.Index] = lt.parent[w.Index] + for _, v := range w.Preds { + u := lt.eval(v) + if lt.sdom[u.Index].dom.pre < lt.sdom[w.Index].dom.pre { + lt.sdom[w.Index] = lt.sdom[u.Index] + } + } + + lt.link(lt.parent[w.Index], w) + + if lt.parent[w.Index] == lt.sdom[w.Index] { + w.dom.idom = lt.parent[w.Index] + } else { + buckets[i] = buckets[lt.sdom[w.Index].dom.pre] + buckets[lt.sdom[w.Index].dom.pre] = w + } + } + + // The final 'Step 3' is now outside the loop. + for v := buckets[0]; v != root; v = buckets[v.dom.pre] { + v.dom.idom = root + } + + // Step 4. Explicitly define the immediate dominator of each + // node, in preorder. + for _, w := range preorder[1:] { + if w == root || w == recover { + w.dom.idom = nil + } else { + if w.dom.idom != lt.sdom[w.Index] { + w.dom.idom = w.dom.idom.dom.idom + } + // Calculate Children relation as inverse of Idom. + w.dom.idom.dom.children = append(w.dom.idom.dom.children, w) + } + } + + pre, post := numberDomTree(root, 0, 0) + if recover != nil { + numberDomTree(recover, pre, post) + } + + // printDomTreeDot(os.Stderr, f) // debugging + // printDomTreeText(os.Stderr, root, 0) // debugging + + if f.Prog.mode&SanityCheckFunctions != 0 { + sanityCheckDomTree(f) + } +} + +// numberDomTree sets the pre- and post-order numbers of a depth-first +// traversal of the dominator tree rooted at v. These are used to +// answer dominance queries in constant time. +// +func numberDomTree(v *BasicBlock, pre, post int32) (int32, int32) { + v.dom.pre = pre + pre++ + for _, child := range v.dom.children { + pre, post = numberDomTree(child, pre, post) + } + v.dom.post = post + post++ + return pre, post +} + +// Testing utilities ---------------------------------------- + +// sanityCheckDomTree checks the correctness of the dominator tree +// computed by the LT algorithm by comparing against the dominance +// relation computed by a naive Kildall-style forward dataflow +// analysis (Algorithm 10.16 from the "Dragon" book). +// +func sanityCheckDomTree(f *Function) { + n := len(f.Blocks) + + // D[i] is the set of blocks that dominate f.Blocks[i], + // represented as a bit-set of block indices. + D := make([]big.Int, n) + + one := big.NewInt(1) + + // all is the set of all blocks; constant. + var all big.Int + all.Set(one).Lsh(&all, uint(n)).Sub(&all, one) + + // Initialization. + for i, b := range f.Blocks { + if i == 0 || b == f.Recover { + // A root is dominated only by itself. + D[i].SetBit(&D[0], 0, 1) + } else { + // All other blocks are (initially) dominated + // by every block. + D[i].Set(&all) + } + } + + // Iteration until fixed point. + for changed := true; changed; { + changed = false + for i, b := range f.Blocks { + if i == 0 || b == f.Recover { + continue + } + // Compute intersection across predecessors. + var x big.Int + x.Set(&all) + for _, pred := range b.Preds { + x.And(&x, &D[pred.Index]) + } + x.SetBit(&x, i, 1) // a block always dominates itself. + if D[i].Cmp(&x) != 0 { + D[i].Set(&x) + changed = true + } + } + } + + // Check the entire relation. O(n^2). + // The Recover block (if any) must be treated specially so we skip it. + ok := true + for i := 0; i < n; i++ { + for j := 0; j < n; j++ { + b, c := f.Blocks[i], f.Blocks[j] + if c == f.Recover { + continue + } + actual := b.Dominates(c) + expected := D[j].Bit(i) == 1 + if actual != expected { + fmt.Fprintf(os.Stderr, "dominates(%s, %s)==%t, want %t\n", b, c, actual, expected) + ok = false + } + } + } + + preorder := f.DomPreorder() + for _, b := range f.Blocks { + if got := preorder[b.dom.pre]; got != b { + fmt.Fprintf(os.Stderr, "preorder[%d]==%s, want %s\n", b.dom.pre, got, b) + ok = false + } + } + + if !ok { + panic("sanityCheckDomTree failed for " + f.String()) + } + +} + +// Printing functions ---------------------------------------- + +// printDomTree prints the dominator tree as text, using indentation. +func printDomTreeText(buf *bytes.Buffer, v *BasicBlock, indent int) { + fmt.Fprintf(buf, "%*s%s\n", 4*indent, "", v) + for _, child := range v.dom.children { + printDomTreeText(buf, child, indent+1) + } +} + +// printDomTreeDot prints the dominator tree of f in AT&T GraphViz +// (.dot) format. +func printDomTreeDot(buf *bytes.Buffer, f *Function) { + fmt.Fprintln(buf, "//", f) + fmt.Fprintln(buf, "digraph domtree {") + for i, b := range f.Blocks { + v := b.dom + fmt.Fprintf(buf, "\tn%d [label=\"%s (%d, %d)\",shape=\"rectangle\"];\n", v.pre, b, v.pre, v.post) + // TODO(adonovan): improve appearance of edges + // belonging to both dominator tree and CFG. + + // Dominator tree edge. + if i != 0 { + fmt.Fprintf(buf, "\tn%d -> n%d [style=\"solid\",weight=100];\n", v.idom.dom.pre, v.pre) + } + // CFG edges. + for _, pred := range b.Preds { + fmt.Fprintf(buf, "\tn%d -> n%d [style=\"dotted\",weight=0];\n", pred.dom.pre, v.pre) + } + } + fmt.Fprintln(buf, "}") +} diff --git a/vendor/golang.org/x/tools/go/ssa/emit.go b/vendor/golang.org/x/tools/go/ssa/emit.go new file mode 100644 index 0000000000..238c07064e --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/emit.go @@ -0,0 +1,470 @@ +// Copyright 2013 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.5 + +package ssa + +// Helpers for emitting SSA instructions. + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" +) + +// emitNew emits to f a new (heap Alloc) instruction allocating an +// object of type typ. pos is the optional source location. +// +func emitNew(f *Function, typ types.Type, pos token.Pos) *Alloc { + v := &Alloc{Heap: true} + v.setType(types.NewPointer(typ)) + v.setPos(pos) + f.emit(v) + return v +} + +// emitLoad emits to f an instruction to load the address addr into a +// new temporary, and returns the value so defined. +// +func emitLoad(f *Function, addr Value) *UnOp { + v := &UnOp{Op: token.MUL, X: addr} + v.setType(deref(addr.Type())) + f.emit(v) + return v +} + +// emitDebugRef emits to f a DebugRef pseudo-instruction associating +// expression e with value v. +// +func emitDebugRef(f *Function, e ast.Expr, v Value, isAddr bool) { + if !f.debugInfo() { + return // debugging not enabled + } + if v == nil || e == nil { + panic("nil") + } + var obj types.Object + e = unparen(e) + if id, ok := e.(*ast.Ident); ok { + if isBlankIdent(id) { + return + } + obj = f.Pkg.objectOf(id) + switch obj.(type) { + case *types.Nil, *types.Const, *types.Builtin: + return + } + } + f.emit(&DebugRef{ + X: v, + Expr: e, + IsAddr: isAddr, + object: obj, + }) +} + +// emitArith emits to f code to compute the binary operation op(x, y) +// where op is an eager shift, logical or arithmetic operation. +// (Use emitCompare() for comparisons and Builder.logicalBinop() for +// non-eager operations.) +// +func emitArith(f *Function, op token.Token, x, y Value, t types.Type, pos token.Pos) Value { + switch op { + case token.SHL, token.SHR: + x = emitConv(f, x, t) + // y may be signed or an 'untyped' constant. + // TODO(adonovan): whence signed values? + if b, ok := y.Type().Underlying().(*types.Basic); ok && b.Info()&types.IsUnsigned == 0 { + y = emitConv(f, y, types.Typ[types.Uint64]) + } + + case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT: + x = emitConv(f, x, t) + y = emitConv(f, y, t) + + default: + panic("illegal op in emitArith: " + op.String()) + + } + v := &BinOp{ + Op: op, + X: x, + Y: y, + } + v.setPos(pos) + v.setType(t) + return f.emit(v) +} + +// emitCompare emits to f code compute the boolean result of +// comparison comparison 'x op y'. +// +func emitCompare(f *Function, op token.Token, x, y Value, pos token.Pos) Value { + xt := x.Type().Underlying() + yt := y.Type().Underlying() + + // Special case to optimise a tagless SwitchStmt so that + // these are equivalent + // switch { case e: ...} + // switch true { case e: ... } + // if e==true { ... } + // even in the case when e's type is an interface. + // TODO(adonovan): opt: generalise to x==true, false!=y, etc. + if x == vTrue && op == token.EQL { + if yt, ok := yt.(*types.Basic); ok && yt.Info()&types.IsBoolean != 0 { + return y + } + } + + if types.Identical(xt, yt) { + // no conversion necessary + } else if _, ok := xt.(*types.Interface); ok { + y = emitConv(f, y, x.Type()) + } else if _, ok := yt.(*types.Interface); ok { + x = emitConv(f, x, y.Type()) + } else if _, ok := x.(*Const); ok { + x = emitConv(f, x, y.Type()) + } else if _, ok := y.(*Const); ok { + y = emitConv(f, y, x.Type()) + } else { + // other cases, e.g. channels. No-op. + } + + v := &BinOp{ + Op: op, + X: x, + Y: y, + } + v.setPos(pos) + v.setType(tBool) + return f.emit(v) +} + +// isValuePreserving returns true if a conversion from ut_src to +// ut_dst is value-preserving, i.e. just a change of type. +// Precondition: neither argument is a named type. +// +func isValuePreserving(ut_src, ut_dst types.Type) bool { + // Identical underlying types? + if types.Identical(ut_dst, ut_src) { + return true + } + + switch ut_dst.(type) { + case *types.Chan: + // Conversion between channel types? + _, ok := ut_src.(*types.Chan) + return ok + + case *types.Pointer: + // Conversion between pointers with identical base types? + _, ok := ut_src.(*types.Pointer) + return ok + } + return false +} + +// emitConv emits to f code to convert Value val to exactly type typ, +// and returns the converted value. Implicit conversions are required +// by language assignability rules in assignments, parameter passing, +// etc. Conversions cannot fail dynamically. +// +func emitConv(f *Function, val Value, typ types.Type) Value { + t_src := val.Type() + + // Identical types? Conversion is a no-op. + if types.Identical(t_src, typ) { + return val + } + + ut_dst := typ.Underlying() + ut_src := t_src.Underlying() + + // Just a change of type, but not value or representation? + if isValuePreserving(ut_src, ut_dst) { + c := &ChangeType{X: val} + c.setType(typ) + return f.emit(c) + } + + // Conversion to, or construction of a value of, an interface type? + if _, ok := ut_dst.(*types.Interface); ok { + // Assignment from one interface type to another? + if _, ok := ut_src.(*types.Interface); ok { + c := &ChangeInterface{X: val} + c.setType(typ) + return f.emit(c) + } + + // Untyped nil constant? Return interface-typed nil constant. + if ut_src == tUntypedNil { + return nilConst(typ) + } + + // Convert (non-nil) "untyped" literals to their default type. + if t, ok := ut_src.(*types.Basic); ok && t.Info()&types.IsUntyped != 0 { + val = emitConv(f, val, DefaultType(ut_src)) + } + + f.Pkg.Prog.needMethodsOf(val.Type()) + mi := &MakeInterface{X: val} + mi.setType(typ) + return f.emit(mi) + } + + // Conversion of a compile-time constant value? + if c, ok := val.(*Const); ok { + if _, ok := ut_dst.(*types.Basic); ok || c.IsNil() { + // Conversion of a compile-time constant to + // another constant type results in a new + // constant of the destination type and + // (initially) the same abstract value. + // We don't truncate the value yet. + return NewConst(c.Value, typ) + } + + // We're converting from constant to non-constant type, + // e.g. string -> []byte/[]rune. + } + + // A representation-changing conversion? + // At least one of {ut_src,ut_dst} must be *Basic. + // (The other may be []byte or []rune.) + _, ok1 := ut_src.(*types.Basic) + _, ok2 := ut_dst.(*types.Basic) + if ok1 || ok2 { + c := &Convert{X: val} + c.setType(typ) + return f.emit(c) + } + + panic(fmt.Sprintf("in %s: cannot convert %s (%s) to %s", f, val, val.Type(), typ)) +} + +// emitStore emits to f an instruction to store value val at location +// addr, applying implicit conversions as required by assignability rules. +// +func emitStore(f *Function, addr, val Value, pos token.Pos) *Store { + s := &Store{ + Addr: addr, + Val: emitConv(f, val, deref(addr.Type())), + pos: pos, + } + f.emit(s) + return s +} + +// emitJump emits to f a jump to target, and updates the control-flow graph. +// Postcondition: f.currentBlock is nil. +// +func emitJump(f *Function, target *BasicBlock) { + b := f.currentBlock + b.emit(new(Jump)) + addEdge(b, target) + f.currentBlock = nil +} + +// emitIf emits to f a conditional jump to tblock or fblock based on +// cond, and updates the control-flow graph. +// Postcondition: f.currentBlock is nil. +// +func emitIf(f *Function, cond Value, tblock, fblock *BasicBlock) { + b := f.currentBlock + b.emit(&If{Cond: cond}) + addEdge(b, tblock) + addEdge(b, fblock) + f.currentBlock = nil +} + +// emitExtract emits to f an instruction to extract the index'th +// component of tuple. It returns the extracted value. +// +func emitExtract(f *Function, tuple Value, index int) Value { + e := &Extract{Tuple: tuple, Index: index} + e.setType(tuple.Type().(*types.Tuple).At(index).Type()) + return f.emit(e) +} + +// emitTypeAssert emits to f a type assertion value := x.(t) and +// returns the value. x.Type() must be an interface. +// +func emitTypeAssert(f *Function, x Value, t types.Type, pos token.Pos) Value { + a := &TypeAssert{X: x, AssertedType: t} + a.setPos(pos) + a.setType(t) + return f.emit(a) +} + +// emitTypeTest emits to f a type test value,ok := x.(t) and returns +// a (value, ok) tuple. x.Type() must be an interface. +// +func emitTypeTest(f *Function, x Value, t types.Type, pos token.Pos) Value { + a := &TypeAssert{ + X: x, + AssertedType: t, + CommaOk: true, + } + a.setPos(pos) + a.setType(types.NewTuple( + newVar("value", t), + varOk, + )) + return f.emit(a) +} + +// emitTailCall emits to f a function call in tail position. The +// caller is responsible for all fields of 'call' except its type. +// Intended for wrapper methods. +// Precondition: f does/will not use deferred procedure calls. +// Postcondition: f.currentBlock is nil. +// +func emitTailCall(f *Function, call *Call) { + tresults := f.Signature.Results() + nr := tresults.Len() + if nr == 1 { + call.typ = tresults.At(0).Type() + } else { + call.typ = tresults + } + tuple := f.emit(call) + var ret Return + switch nr { + case 0: + // no-op + case 1: + ret.Results = []Value{tuple} + default: + for i := 0; i < nr; i++ { + v := emitExtract(f, tuple, i) + // TODO(adonovan): in principle, this is required: + // v = emitConv(f, o.Type, f.Signature.Results[i].Type) + // but in practice emitTailCall is only used when + // the types exactly match. + ret.Results = append(ret.Results, v) + } + } + f.emit(&ret) + f.currentBlock = nil +} + +// emitImplicitSelections emits to f code to apply the sequence of +// implicit field selections specified by indices to base value v, and +// returns the selected value. +// +// If v is the address of a struct, the result will be the address of +// a field; if it is the value of a struct, the result will be the +// value of a field. +// +func emitImplicitSelections(f *Function, v Value, indices []int) Value { + for _, index := range indices { + fld := deref(v.Type()).Underlying().(*types.Struct).Field(index) + + if isPointer(v.Type()) { + instr := &FieldAddr{ + X: v, + Field: index, + } + instr.setType(types.NewPointer(fld.Type())) + v = f.emit(instr) + // Load the field's value iff indirectly embedded. + if isPointer(fld.Type()) { + v = emitLoad(f, v) + } + } else { + instr := &Field{ + X: v, + Field: index, + } + instr.setType(fld.Type()) + v = f.emit(instr) + } + } + return v +} + +// emitFieldSelection emits to f code to select the index'th field of v. +// +// If wantAddr, the input must be a pointer-to-struct and the result +// will be the field's address; otherwise the result will be the +// field's value. +// Ident id is used for position and debug info. +// +func emitFieldSelection(f *Function, v Value, index int, wantAddr bool, id *ast.Ident) Value { + fld := deref(v.Type()).Underlying().(*types.Struct).Field(index) + if isPointer(v.Type()) { + instr := &FieldAddr{ + X: v, + Field: index, + } + instr.setPos(id.Pos()) + instr.setType(types.NewPointer(fld.Type())) + v = f.emit(instr) + // Load the field's value iff we don't want its address. + if !wantAddr { + v = emitLoad(f, v) + } + } else { + instr := &Field{ + X: v, + Field: index, + } + instr.setPos(id.Pos()) + instr.setType(fld.Type()) + v = f.emit(instr) + } + emitDebugRef(f, id, v, wantAddr) + return v +} + +// zeroValue emits to f code to produce a zero value of type t, +// and returns it. +// +func zeroValue(f *Function, t types.Type) Value { + switch t.Underlying().(type) { + case *types.Struct, *types.Array: + return emitLoad(f, f.addLocal(t, token.NoPos)) + default: + return zeroConst(t) + } +} + +// createRecoverBlock emits to f a block of code to return after a +// recovered panic, and sets f.Recover to it. +// +// If f's result parameters are named, the code loads and returns +// their current values, otherwise it returns the zero values of their +// type. +// +// Idempotent. +// +func createRecoverBlock(f *Function) { + if f.Recover != nil { + return // already created + } + saved := f.currentBlock + + f.Recover = f.newBasicBlock("recover") + f.currentBlock = f.Recover + + var results []Value + if f.namedResults != nil { + // Reload NRPs to form value tuple. + for _, r := range f.namedResults { + results = append(results, emitLoad(f, r)) + } + } else { + R := f.Signature.Results() + for i, n := 0, R.Len(); i < n; i++ { + T := R.At(i).Type() + + // Return zero value of each result type. + results = append(results, zeroValue(f, T)) + } + } + f.emit(&Return{Results: results}) + + f.currentBlock = saved +} diff --git a/vendor/golang.org/x/tools/go/ssa/emit14.go b/vendor/golang.org/x/tools/go/ssa/emit14.go new file mode 100644 index 0000000000..454aea0505 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/emit14.go @@ -0,0 +1,471 @@ +// Copyright 2013 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.5 + +package ssa + +// Helpers for emitting SSA instructions. + +import ( + "fmt" + "go/ast" + "go/token" + + "golang.org/x/tools/go/types" +) + +// emitNew emits to f a new (heap Alloc) instruction allocating an +// object of type typ. pos is the optional source location. +// +func emitNew(f *Function, typ types.Type, pos token.Pos) *Alloc { + v := &Alloc{Heap: true} + v.setType(types.NewPointer(typ)) + v.setPos(pos) + f.emit(v) + return v +} + +// emitLoad emits to f an instruction to load the address addr into a +// new temporary, and returns the value so defined. +// +func emitLoad(f *Function, addr Value) *UnOp { + v := &UnOp{Op: token.MUL, X: addr} + v.setType(deref(addr.Type())) + f.emit(v) + return v +} + +// emitDebugRef emits to f a DebugRef pseudo-instruction associating +// expression e with value v. +// +func emitDebugRef(f *Function, e ast.Expr, v Value, isAddr bool) { + if !f.debugInfo() { + return // debugging not enabled + } + if v == nil || e == nil { + panic("nil") + } + var obj types.Object + e = unparen(e) + if id, ok := e.(*ast.Ident); ok { + if isBlankIdent(id) { + return + } + obj = f.Pkg.objectOf(id) + switch obj.(type) { + case *types.Nil, *types.Const, *types.Builtin: + return + } + } + f.emit(&DebugRef{ + X: v, + Expr: e, + IsAddr: isAddr, + object: obj, + }) +} + +// emitArith emits to f code to compute the binary operation op(x, y) +// where op is an eager shift, logical or arithmetic operation. +// (Use emitCompare() for comparisons and Builder.logicalBinop() for +// non-eager operations.) +// +func emitArith(f *Function, op token.Token, x, y Value, t types.Type, pos token.Pos) Value { + switch op { + case token.SHL, token.SHR: + x = emitConv(f, x, t) + // y may be signed or an 'untyped' constant. + // TODO(adonovan): whence signed values? + if b, ok := y.Type().Underlying().(*types.Basic); ok && b.Info()&types.IsUnsigned == 0 { + y = emitConv(f, y, types.Typ[types.Uint64]) + } + + case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT: + x = emitConv(f, x, t) + y = emitConv(f, y, t) + + default: + panic("illegal op in emitArith: " + op.String()) + + } + v := &BinOp{ + Op: op, + X: x, + Y: y, + } + v.setPos(pos) + v.setType(t) + return f.emit(v) +} + +// emitCompare emits to f code compute the boolean result of +// comparison comparison 'x op y'. +// +func emitCompare(f *Function, op token.Token, x, y Value, pos token.Pos) Value { + xt := x.Type().Underlying() + yt := y.Type().Underlying() + + // Special case to optimise a tagless SwitchStmt so that + // these are equivalent + // switch { case e: ...} + // switch true { case e: ... } + // if e==true { ... } + // even in the case when e's type is an interface. + // TODO(adonovan): opt: generalise to x==true, false!=y, etc. + if x == vTrue && op == token.EQL { + if yt, ok := yt.(*types.Basic); ok && yt.Info()&types.IsBoolean != 0 { + return y + } + } + + if types.Identical(xt, yt) { + // no conversion necessary + } else if _, ok := xt.(*types.Interface); ok { + y = emitConv(f, y, x.Type()) + } else if _, ok := yt.(*types.Interface); ok { + x = emitConv(f, x, y.Type()) + } else if _, ok := x.(*Const); ok { + x = emitConv(f, x, y.Type()) + } else if _, ok := y.(*Const); ok { + y = emitConv(f, y, x.Type()) + } else { + // other cases, e.g. channels. No-op. + } + + v := &BinOp{ + Op: op, + X: x, + Y: y, + } + v.setPos(pos) + v.setType(tBool) + return f.emit(v) +} + +// isValuePreserving returns true if a conversion from ut_src to +// ut_dst is value-preserving, i.e. just a change of type. +// Precondition: neither argument is a named type. +// +func isValuePreserving(ut_src, ut_dst types.Type) bool { + // Identical underlying types? + if types.Identical(ut_dst, ut_src) { + return true + } + + switch ut_dst.(type) { + case *types.Chan: + // Conversion between channel types? + _, ok := ut_src.(*types.Chan) + return ok + + case *types.Pointer: + // Conversion between pointers with identical base types? + _, ok := ut_src.(*types.Pointer) + return ok + } + return false +} + +// emitConv emits to f code to convert Value val to exactly type typ, +// and returns the converted value. Implicit conversions are required +// by language assignability rules in assignments, parameter passing, +// etc. Conversions cannot fail dynamically. +// +func emitConv(f *Function, val Value, typ types.Type) Value { + t_src := val.Type() + + // Identical types? Conversion is a no-op. + if types.Identical(t_src, typ) { + return val + } + + ut_dst := typ.Underlying() + ut_src := t_src.Underlying() + + // Just a change of type, but not value or representation? + if isValuePreserving(ut_src, ut_dst) { + c := &ChangeType{X: val} + c.setType(typ) + return f.emit(c) + } + + // Conversion to, or construction of a value of, an interface type? + if _, ok := ut_dst.(*types.Interface); ok { + // Assignment from one interface type to another? + if _, ok := ut_src.(*types.Interface); ok { + c := &ChangeInterface{X: val} + c.setType(typ) + return f.emit(c) + } + + // Untyped nil constant? Return interface-typed nil constant. + if ut_src == tUntypedNil { + return nilConst(typ) + } + + // Convert (non-nil) "untyped" literals to their default type. + if t, ok := ut_src.(*types.Basic); ok && t.Info()&types.IsUntyped != 0 { + val = emitConv(f, val, DefaultType(ut_src)) + } + + f.Pkg.Prog.needMethodsOf(val.Type()) + mi := &MakeInterface{X: val} + mi.setType(typ) + return f.emit(mi) + } + + // Conversion of a compile-time constant value? + if c, ok := val.(*Const); ok { + if _, ok := ut_dst.(*types.Basic); ok || c.IsNil() { + // Conversion of a compile-time constant to + // another constant type results in a new + // constant of the destination type and + // (initially) the same abstract value. + // We don't truncate the value yet. + return NewConst(c.Value, typ) + } + + // We're converting from constant to non-constant type, + // e.g. string -> []byte/[]rune. + } + + // A representation-changing conversion? + // At least one of {ut_src,ut_dst} must be *Basic. + // (The other may be []byte or []rune.) + _, ok1 := ut_src.(*types.Basic) + _, ok2 := ut_dst.(*types.Basic) + if ok1 || ok2 { + c := &Convert{X: val} + c.setType(typ) + return f.emit(c) + } + + panic(fmt.Sprintf("in %s: cannot convert %s (%s) to %s", f, val, val.Type(), typ)) +} + +// emitStore emits to f an instruction to store value val at location +// addr, applying implicit conversions as required by assignability rules. +// +func emitStore(f *Function, addr, val Value, pos token.Pos) *Store { + s := &Store{ + Addr: addr, + Val: emitConv(f, val, deref(addr.Type())), + pos: pos, + } + f.emit(s) + return s +} + +// emitJump emits to f a jump to target, and updates the control-flow graph. +// Postcondition: f.currentBlock is nil. +// +func emitJump(f *Function, target *BasicBlock) { + b := f.currentBlock + b.emit(new(Jump)) + addEdge(b, target) + f.currentBlock = nil +} + +// emitIf emits to f a conditional jump to tblock or fblock based on +// cond, and updates the control-flow graph. +// Postcondition: f.currentBlock is nil. +// +func emitIf(f *Function, cond Value, tblock, fblock *BasicBlock) { + b := f.currentBlock + b.emit(&If{Cond: cond}) + addEdge(b, tblock) + addEdge(b, fblock) + f.currentBlock = nil +} + +// emitExtract emits to f an instruction to extract the index'th +// component of tuple. It returns the extracted value. +// +func emitExtract(f *Function, tuple Value, index int) Value { + e := &Extract{Tuple: tuple, Index: index} + e.setType(tuple.Type().(*types.Tuple).At(index).Type()) + return f.emit(e) +} + +// emitTypeAssert emits to f a type assertion value := x.(t) and +// returns the value. x.Type() must be an interface. +// +func emitTypeAssert(f *Function, x Value, t types.Type, pos token.Pos) Value { + a := &TypeAssert{X: x, AssertedType: t} + a.setPos(pos) + a.setType(t) + return f.emit(a) +} + +// emitTypeTest emits to f a type test value,ok := x.(t) and returns +// a (value, ok) tuple. x.Type() must be an interface. +// +func emitTypeTest(f *Function, x Value, t types.Type, pos token.Pos) Value { + a := &TypeAssert{ + X: x, + AssertedType: t, + CommaOk: true, + } + a.setPos(pos) + a.setType(types.NewTuple( + newVar("value", t), + varOk, + )) + return f.emit(a) +} + +// emitTailCall emits to f a function call in tail position. The +// caller is responsible for all fields of 'call' except its type. +// Intended for wrapper methods. +// Precondition: f does/will not use deferred procedure calls. +// Postcondition: f.currentBlock is nil. +// +func emitTailCall(f *Function, call *Call) { + tresults := f.Signature.Results() + nr := tresults.Len() + if nr == 1 { + call.typ = tresults.At(0).Type() + } else { + call.typ = tresults + } + tuple := f.emit(call) + var ret Return + switch nr { + case 0: + // no-op + case 1: + ret.Results = []Value{tuple} + default: + for i := 0; i < nr; i++ { + v := emitExtract(f, tuple, i) + // TODO(adonovan): in principle, this is required: + // v = emitConv(f, o.Type, f.Signature.Results[i].Type) + // but in practice emitTailCall is only used when + // the types exactly match. + ret.Results = append(ret.Results, v) + } + } + f.emit(&ret) + f.currentBlock = nil +} + +// emitImplicitSelections emits to f code to apply the sequence of +// implicit field selections specified by indices to base value v, and +// returns the selected value. +// +// If v is the address of a struct, the result will be the address of +// a field; if it is the value of a struct, the result will be the +// value of a field. +// +func emitImplicitSelections(f *Function, v Value, indices []int) Value { + for _, index := range indices { + fld := deref(v.Type()).Underlying().(*types.Struct).Field(index) + + if isPointer(v.Type()) { + instr := &FieldAddr{ + X: v, + Field: index, + } + instr.setType(types.NewPointer(fld.Type())) + v = f.emit(instr) + // Load the field's value iff indirectly embedded. + if isPointer(fld.Type()) { + v = emitLoad(f, v) + } + } else { + instr := &Field{ + X: v, + Field: index, + } + instr.setType(fld.Type()) + v = f.emit(instr) + } + } + return v +} + +// emitFieldSelection emits to f code to select the index'th field of v. +// +// If wantAddr, the input must be a pointer-to-struct and the result +// will be the field's address; otherwise the result will be the +// field's value. +// Ident id is used for position and debug info. +// +func emitFieldSelection(f *Function, v Value, index int, wantAddr bool, id *ast.Ident) Value { + fld := deref(v.Type()).Underlying().(*types.Struct).Field(index) + if isPointer(v.Type()) { + instr := &FieldAddr{ + X: v, + Field: index, + } + instr.setPos(id.Pos()) + instr.setType(types.NewPointer(fld.Type())) + v = f.emit(instr) + // Load the field's value iff we don't want its address. + if !wantAddr { + v = emitLoad(f, v) + } + } else { + instr := &Field{ + X: v, + Field: index, + } + instr.setPos(id.Pos()) + instr.setType(fld.Type()) + v = f.emit(instr) + } + emitDebugRef(f, id, v, wantAddr) + return v +} + +// zeroValue emits to f code to produce a zero value of type t, +// and returns it. +// +func zeroValue(f *Function, t types.Type) Value { + switch t.Underlying().(type) { + case *types.Struct, *types.Array: + return emitLoad(f, f.addLocal(t, token.NoPos)) + default: + return zeroConst(t) + } +} + +// createRecoverBlock emits to f a block of code to return after a +// recovered panic, and sets f.Recover to it. +// +// If f's result parameters are named, the code loads and returns +// their current values, otherwise it returns the zero values of their +// type. +// +// Idempotent. +// +func createRecoverBlock(f *Function) { + if f.Recover != nil { + return // already created + } + saved := f.currentBlock + + f.Recover = f.newBasicBlock("recover") + f.currentBlock = f.Recover + + var results []Value + if f.namedResults != nil { + // Reload NRPs to form value tuple. + for _, r := range f.namedResults { + results = append(results, emitLoad(f, r)) + } + } else { + R := f.Signature.Results() + for i, n := 0, R.Len(); i < n; i++ { + T := R.At(i).Type() + + // Return zero value of each result type. + results = append(results, zeroValue(f, T)) + } + } + f.emit(&Return{Results: results}) + + f.currentBlock = saved +} diff --git a/vendor/golang.org/x/tools/go/ssa/example14_test.go b/vendor/golang.org/x/tools/go/ssa/example14_test.go new file mode 100644 index 0000000000..0171d4fb18 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/example14_test.go @@ -0,0 +1,140 @@ +// Copyright 2013 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.5 + +package ssa_test + +import ( + "fmt" + "os" + + "go/ast" + "go/parser" + "go/token" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/go/types" +) + +const hello = ` +package main + +import "fmt" + +const message = "Hello, World!" + +func main() { + fmt.Println(message) +} +` + +// This program demonstrates how to run the SSA builder on a single +// package of one or more already-parsed files. Its dependencies are +// loaded from compiler export data. This is what you'd typically use +// for a compiler; it does not depend on golang.org/x/tools/go/loader. +// +// It shows the printed representation of packages, functions, and +// instructions. Within the function listing, the name of each +// BasicBlock such as ".0.entry" is printed left-aligned, followed by +// the block's Instructions. +// +// For each instruction that defines an SSA virtual register +// (i.e. implements Value), the type of that value is shown in the +// right column. +// +// Build and run the ssadump.go program if you want a standalone tool +// with similar functionality. It is located at +// golang.org/x/tools/cmd/ssadump. +// +func ExampleBuildPackage() { + // Parse the source files. + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, "hello.go", hello, parser.ParseComments) + if err != nil { + fmt.Print(err) // parse error + return + } + files := []*ast.File{f} + + // Create the type-checker's package. + pkg := types.NewPackage("hello", "") + + // Type-check the package, load dependencies. + // Create and build the SSA program. + hello, _, err := ssautil.BuildPackage( + new(types.Config), fset, pkg, files, ssa.SanityCheckFunctions) + if err != nil { + fmt.Print(err) // type error in some package + return + } + + // Print out the package. + hello.WriteTo(os.Stdout) + + // Print out the package-level functions. + hello.Func("init").WriteTo(os.Stdout) + hello.Func("main").WriteTo(os.Stdout) + + // Output: + // + // package hello: + // func init func() + // var init$guard bool + // func main func() + // const message message = "Hello, World!":untyped string + // + // # Name: hello.init + // # Package: hello + // # Synthetic: package initializer + // func init(): + // 0: entry P:0 S:2 + // t0 = *init$guard bool + // if t0 goto 2 else 1 + // 1: init.start P:1 S:1 + // *init$guard = true:bool + // t1 = fmt.init() () + // jump 2 + // 2: init.done P:2 S:0 + // return + // + // # Name: hello.main + // # Package: hello + // # Location: hello.go:8:6 + // func main(): + // 0: entry P:0 S:0 + // t0 = new [1]interface{} (varargs) *[1]interface{} + // t1 = &t0[0:int] *interface{} + // t2 = make interface{} <- string ("Hello, World!":string) interface{} + // *t1 = t2 + // t3 = slice t0[:] []interface{} + // t4 = fmt.Println(t3...) (n int, err error) + // return +} + +// This program shows how to load a main package (cmd/cover) and all its +// dependencies from source, using the loader, and then build SSA code +// for the entire program. This is what you'd typically use for a +// whole-program analysis. +// +func ExampleLoadProgram() { + // Load cmd/cover and its dependencies. + var conf loader.Config + conf.Import("cmd/cover") + lprog, err := conf.Load() + if err != nil { + fmt.Print(err) // type error in some package + return + } + + // Create SSA-form program representation. + prog := ssautil.CreateProgram(lprog, ssa.SanityCheckFunctions) + + // Build SSA code for the entire cmd/cover program. + prog.Build() + + // Output: +} diff --git a/vendor/golang.org/x/tools/go/ssa/example_test.go b/vendor/golang.org/x/tools/go/ssa/example_test.go new file mode 100644 index 0000000000..718817ccd1 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/example_test.go @@ -0,0 +1,140 @@ +// Copyright 2013 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.5 + +package ssa_test + +import ( + "fmt" + "go/ast" + "go/importer" + "go/parser" + "go/token" + "go/types" + "os" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +const hello = ` +package main + +import "fmt" + +const message = "Hello, World!" + +func main() { + fmt.Println(message) +} +` + +// This program demonstrates how to run the SSA builder on a single +// package of one or more already-parsed files. Its dependencies are +// loaded from compiler export data. This is what you'd typically use +// for a compiler; it does not depend on golang.org/x/tools/go/loader. +// +// It shows the printed representation of packages, functions, and +// instructions. Within the function listing, the name of each +// BasicBlock such as ".0.entry" is printed left-aligned, followed by +// the block's Instructions. +// +// For each instruction that defines an SSA virtual register +// (i.e. implements Value), the type of that value is shown in the +// right column. +// +// Build and run the ssadump.go program if you want a standalone tool +// with similar functionality. It is located at +// golang.org/x/tools/cmd/ssadump. +// +func ExampleBuildPackage() { + // Parse the source files. + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, "hello.go", hello, parser.ParseComments) + if err != nil { + fmt.Print(err) // parse error + return + } + files := []*ast.File{f} + + // Create the type-checker's package. + pkg := types.NewPackage("hello", "") + + // Type-check the package, load dependencies. + // Create and build the SSA program. + hello, _, err := ssautil.BuildPackage( + &types.Config{Importer: importer.Default()}, fset, pkg, files, ssa.SanityCheckFunctions) + if err != nil { + fmt.Print(err) // type error in some package + return + } + + // Print out the package. + hello.WriteTo(os.Stdout) + + // Print out the package-level functions. + hello.Func("init").WriteTo(os.Stdout) + hello.Func("main").WriteTo(os.Stdout) + + // Output: + // + // package hello: + // func init func() + // var init$guard bool + // func main func() + // const message message = "Hello, World!":untyped string + // + // # Name: hello.init + // # Package: hello + // # Synthetic: package initializer + // func init(): + // 0: entry P:0 S:2 + // t0 = *init$guard bool + // if t0 goto 2 else 1 + // 1: init.start P:1 S:1 + // *init$guard = true:bool + // t1 = fmt.init() () + // jump 2 + // 2: init.done P:2 S:0 + // return + // + // # Name: hello.main + // # Package: hello + // # Location: hello.go:8:6 + // func main(): + // 0: entry P:0 S:0 + // t0 = new [1]interface{} (varargs) *[1]interface{} + // t1 = &t0[0:int] *interface{} + // t2 = make interface{} <- string ("Hello, World!":string) interface{} + // *t1 = t2 + // t3 = slice t0[:] []interface{} + // t4 = fmt.Println(t3...) (n int, err error) + // return +} + +// This program shows how to load a main package (cmd/cover) and all its +// dependencies from source, using the loader, and then build SSA code +// for the entire program. This is what you'd typically use for a +// whole-program analysis. +// +func ExampleLoadProgram() { + // Load cmd/cover and its dependencies. + var conf loader.Config + conf.Import("cmd/cover") + lprog, err := conf.Load() + if err != nil { + fmt.Print(err) // type error in some package + return + } + + // Create SSA-form program representation. + prog := ssautil.CreateProgram(lprog, ssa.SanityCheckFunctions) + + // Build SSA code for the entire cmd/cover program. + prog.Build() + + // Output: +} diff --git a/vendor/golang.org/x/tools/go/ssa/func.go b/vendor/golang.org/x/tools/go/ssa/func.go new file mode 100644 index 0000000000..88052c32ee --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/func.go @@ -0,0 +1,691 @@ +// Copyright 2013 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.5 + +package ssa + +// This file implements the Function and BasicBlock types. + +import ( + "bytes" + "fmt" + "go/ast" + "go/token" + "go/types" + "io" + "os" + "strings" +) + +// addEdge adds a control-flow graph edge from from to to. +func addEdge(from, to *BasicBlock) { + from.Succs = append(from.Succs, to) + to.Preds = append(to.Preds, from) +} + +// Parent returns the function that contains block b. +func (b *BasicBlock) Parent() *Function { return b.parent } + +// String returns a human-readable label of this block. +// It is not guaranteed unique within the function. +// +func (b *BasicBlock) String() string { + return fmt.Sprintf("%d", b.Index) +} + +// emit appends an instruction to the current basic block. +// If the instruction defines a Value, it is returned. +// +func (b *BasicBlock) emit(i Instruction) Value { + i.setBlock(b) + b.Instrs = append(b.Instrs, i) + v, _ := i.(Value) + return v +} + +// predIndex returns the i such that b.Preds[i] == c or panics if +// there is none. +func (b *BasicBlock) predIndex(c *BasicBlock) int { + for i, pred := range b.Preds { + if pred == c { + return i + } + } + panic(fmt.Sprintf("no edge %s -> %s", c, b)) +} + +// hasPhi returns true if b.Instrs contains φ-nodes. +func (b *BasicBlock) hasPhi() bool { + _, ok := b.Instrs[0].(*Phi) + return ok +} + +// phis returns the prefix of b.Instrs containing all the block's φ-nodes. +func (b *BasicBlock) phis() []Instruction { + for i, instr := range b.Instrs { + if _, ok := instr.(*Phi); !ok { + return b.Instrs[:i] + } + } + return nil // unreachable in well-formed blocks +} + +// replacePred replaces all occurrences of p in b's predecessor list with q. +// Ordinarily there should be at most one. +// +func (b *BasicBlock) replacePred(p, q *BasicBlock) { + for i, pred := range b.Preds { + if pred == p { + b.Preds[i] = q + } + } +} + +// replaceSucc replaces all occurrences of p in b's successor list with q. +// Ordinarily there should be at most one. +// +func (b *BasicBlock) replaceSucc(p, q *BasicBlock) { + for i, succ := range b.Succs { + if succ == p { + b.Succs[i] = q + } + } +} + +// removePred removes all occurrences of p in b's +// predecessor list and φ-nodes. +// Ordinarily there should be at most one. +// +func (b *BasicBlock) removePred(p *BasicBlock) { + phis := b.phis() + + // We must preserve edge order for φ-nodes. + j := 0 + for i, pred := range b.Preds { + if pred != p { + b.Preds[j] = b.Preds[i] + // Strike out φ-edge too. + for _, instr := range phis { + phi := instr.(*Phi) + phi.Edges[j] = phi.Edges[i] + } + j++ + } + } + // Nil out b.Preds[j:] and φ-edges[j:] to aid GC. + for i := j; i < len(b.Preds); i++ { + b.Preds[i] = nil + for _, instr := range phis { + instr.(*Phi).Edges[i] = nil + } + } + b.Preds = b.Preds[:j] + for _, instr := range phis { + phi := instr.(*Phi) + phi.Edges = phi.Edges[:j] + } +} + +// Destinations associated with unlabelled for/switch/select stmts. +// We push/pop one of these as we enter/leave each construct and for +// each BranchStmt we scan for the innermost target of the right type. +// +type targets struct { + tail *targets // rest of stack + _break *BasicBlock + _continue *BasicBlock + _fallthrough *BasicBlock +} + +// Destinations associated with a labelled block. +// We populate these as labels are encountered in forward gotos or +// labelled statements. +// +type lblock struct { + _goto *BasicBlock + _break *BasicBlock + _continue *BasicBlock +} + +// labelledBlock returns the branch target associated with the +// specified label, creating it if needed. +// +func (f *Function) labelledBlock(label *ast.Ident) *lblock { + lb := f.lblocks[label.Obj] + if lb == nil { + lb = &lblock{_goto: f.newBasicBlock(label.Name)} + if f.lblocks == nil { + f.lblocks = make(map[*ast.Object]*lblock) + } + f.lblocks[label.Obj] = lb + } + return lb +} + +// addParam adds a (non-escaping) parameter to f.Params of the +// specified name, type and source position. +// +func (f *Function) addParam(name string, typ types.Type, pos token.Pos) *Parameter { + v := &Parameter{ + name: name, + typ: typ, + pos: pos, + parent: f, + } + f.Params = append(f.Params, v) + return v +} + +func (f *Function) addParamObj(obj types.Object) *Parameter { + name := obj.Name() + if name == "" { + name = fmt.Sprintf("arg%d", len(f.Params)) + } + param := f.addParam(name, obj.Type(), obj.Pos()) + param.object = obj + return param +} + +// addSpilledParam declares a parameter that is pre-spilled to the +// stack; the function body will load/store the spilled location. +// Subsequent lifting will eliminate spills where possible. +// +func (f *Function) addSpilledParam(obj types.Object) { + param := f.addParamObj(obj) + spill := &Alloc{Comment: obj.Name()} + spill.setType(types.NewPointer(obj.Type())) + spill.setPos(obj.Pos()) + f.objects[obj] = spill + f.Locals = append(f.Locals, spill) + f.emit(spill) + f.emit(&Store{Addr: spill, Val: param}) +} + +// startBody initializes the function prior to generating SSA code for its body. +// Precondition: f.Type() already set. +// +func (f *Function) startBody() { + f.currentBlock = f.newBasicBlock("entry") + f.objects = make(map[types.Object]Value) // needed for some synthetics, e.g. init +} + +// createSyntacticParams populates f.Params and generates code (spills +// and named result locals) for all the parameters declared in the +// syntax. In addition it populates the f.objects mapping. +// +// Preconditions: +// f.startBody() was called. +// Postcondition: +// len(f.Params) == len(f.Signature.Params) + (f.Signature.Recv() ? 1 : 0) +// +func (f *Function) createSyntacticParams(recv *ast.FieldList, functype *ast.FuncType) { + // Receiver (at most one inner iteration). + if recv != nil { + for _, field := range recv.List { + for _, n := range field.Names { + f.addSpilledParam(f.Pkg.info.Defs[n]) + } + // Anonymous receiver? No need to spill. + if field.Names == nil { + f.addParamObj(f.Signature.Recv()) + } + } + } + + // Parameters. + if functype.Params != nil { + n := len(f.Params) // 1 if has recv, 0 otherwise + for _, field := range functype.Params.List { + for _, n := range field.Names { + f.addSpilledParam(f.Pkg.info.Defs[n]) + } + // Anonymous parameter? No need to spill. + if field.Names == nil { + f.addParamObj(f.Signature.Params().At(len(f.Params) - n)) + } + } + } + + // Named results. + if functype.Results != nil { + for _, field := range functype.Results.List { + // Implicit "var" decl of locals for named results. + for _, n := range field.Names { + f.namedResults = append(f.namedResults, f.addLocalForIdent(n)) + } + } + } +} + +// numberRegisters assigns numbers to all SSA registers +// (value-defining Instructions) in f, to aid debugging. +// (Non-Instruction Values are named at construction.) +// +func numberRegisters(f *Function) { + v := 0 + for _, b := range f.Blocks { + for _, instr := range b.Instrs { + switch instr.(type) { + case Value: + instr.(interface { + setNum(int) + }).setNum(v) + v++ + } + } + } +} + +// buildReferrers populates the def/use information in all non-nil +// Value.Referrers slice. +// Precondition: all such slices are initially empty. +func buildReferrers(f *Function) { + var rands []*Value + for _, b := range f.Blocks { + for _, instr := range b.Instrs { + rands = instr.Operands(rands[:0]) // recycle storage + for _, rand := range rands { + if r := *rand; r != nil { + if ref := r.Referrers(); ref != nil { + *ref = append(*ref, instr) + } + } + } + } + } +} + +// finishBody() finalizes the function after SSA code generation of its body. +func (f *Function) finishBody() { + f.objects = nil + f.currentBlock = nil + f.lblocks = nil + + // Don't pin the AST in memory (except in debug mode). + if n := f.syntax; n != nil && !f.debugInfo() { + f.syntax = extentNode{n.Pos(), n.End()} + } + + // Remove from f.Locals any Allocs that escape to the heap. + j := 0 + for _, l := range f.Locals { + if !l.Heap { + f.Locals[j] = l + j++ + } + } + // Nil out f.Locals[j:] to aid GC. + for i := j; i < len(f.Locals); i++ { + f.Locals[i] = nil + } + f.Locals = f.Locals[:j] + + optimizeBlocks(f) + + buildReferrers(f) + + buildDomTree(f) + + if f.Prog.mode&NaiveForm == 0 { + // For debugging pre-state of lifting pass: + // numberRegisters(f) + // f.WriteTo(os.Stderr) + lift(f) + } + + f.namedResults = nil // (used by lifting) + + numberRegisters(f) + + if f.Prog.mode&PrintFunctions != 0 { + printMu.Lock() + f.WriteTo(os.Stdout) + printMu.Unlock() + } + + if f.Prog.mode&SanityCheckFunctions != 0 { + mustSanityCheck(f, nil) + } +} + +// removeNilBlocks eliminates nils from f.Blocks and updates each +// BasicBlock.Index. Use this after any pass that may delete blocks. +// +func (f *Function) removeNilBlocks() { + j := 0 + for _, b := range f.Blocks { + if b != nil { + b.Index = j + f.Blocks[j] = b + j++ + } + } + // Nil out f.Blocks[j:] to aid GC. + for i := j; i < len(f.Blocks); i++ { + f.Blocks[i] = nil + } + f.Blocks = f.Blocks[:j] +} + +// SetDebugMode sets the debug mode for package pkg. If true, all its +// functions will include full debug info. This greatly increases the +// size of the instruction stream, and causes Functions to depend upon +// the ASTs, potentially keeping them live in memory for longer. +// +func (pkg *Package) SetDebugMode(debug bool) { + // TODO(adonovan): do we want ast.File granularity? + pkg.debug = debug +} + +// debugInfo reports whether debug info is wanted for this function. +func (f *Function) debugInfo() bool { + return f.Pkg != nil && f.Pkg.debug +} + +// addNamedLocal creates a local variable, adds it to function f and +// returns it. Its name and type are taken from obj. Subsequent +// calls to f.lookup(obj) will return the same local. +// +func (f *Function) addNamedLocal(obj types.Object) *Alloc { + l := f.addLocal(obj.Type(), obj.Pos()) + l.Comment = obj.Name() + f.objects[obj] = l + return l +} + +func (f *Function) addLocalForIdent(id *ast.Ident) *Alloc { + return f.addNamedLocal(f.Pkg.info.Defs[id]) +} + +// addLocal creates an anonymous local variable of type typ, adds it +// to function f and returns it. pos is the optional source location. +// +func (f *Function) addLocal(typ types.Type, pos token.Pos) *Alloc { + v := &Alloc{} + v.setType(types.NewPointer(typ)) + v.setPos(pos) + f.Locals = append(f.Locals, v) + f.emit(v) + return v +} + +// lookup returns the address of the named variable identified by obj +// that is local to function f or one of its enclosing functions. +// If escaping, the reference comes from a potentially escaping pointer +// expression and the referent must be heap-allocated. +// +func (f *Function) lookup(obj types.Object, escaping bool) Value { + if v, ok := f.objects[obj]; ok { + if alloc, ok := v.(*Alloc); ok && escaping { + alloc.Heap = true + } + return v // function-local var (address) + } + + // Definition must be in an enclosing function; + // plumb it through intervening closures. + if f.parent == nil { + panic("no ssa.Value for " + obj.String()) + } + outer := f.parent.lookup(obj, true) // escaping + v := &FreeVar{ + name: obj.Name(), + typ: outer.Type(), + pos: outer.Pos(), + outer: outer, + parent: f, + } + f.objects[obj] = v + f.FreeVars = append(f.FreeVars, v) + return v +} + +// emit emits the specified instruction to function f. +func (f *Function) emit(instr Instruction) Value { + return f.currentBlock.emit(instr) +} + +// RelString returns the full name of this function, qualified by +// package name, receiver type, etc. +// +// The specific formatting rules are not guaranteed and may change. +// +// Examples: +// "math.IsNaN" // a package-level function +// "(*bytes.Buffer).Bytes" // a declared method or a wrapper +// "(*bytes.Buffer).Bytes$thunk" // thunk (func wrapping method; receiver is param 0) +// "(*bytes.Buffer).Bytes$bound" // bound (func wrapping method; receiver supplied by closure) +// "main.main$1" // an anonymous function in main +// "main.init#1" // a declared init function +// "main.init" // the synthesized package initializer +// +// When these functions are referred to from within the same package +// (i.e. from == f.Pkg.Object), they are rendered without the package path. +// For example: "IsNaN", "(*Buffer).Bytes", etc. +// +// All non-synthetic functions have distinct package-qualified names. +// (But two methods may have the same name "(T).f" if one is a synthetic +// wrapper promoting a non-exported method "f" from another package; in +// that case, the strings are equal but the identifiers "f" are distinct.) +// +func (f *Function) RelString(from *types.Package) string { + // Anonymous? + if f.parent != nil { + // An anonymous function's Name() looks like "parentName$1", + // but its String() should include the type/package/etc. + parent := f.parent.RelString(from) + for i, anon := range f.parent.AnonFuncs { + if anon == f { + return fmt.Sprintf("%s$%d", parent, 1+i) + } + } + + return f.name // should never happen + } + + // Method (declared or wrapper)? + if recv := f.Signature.Recv(); recv != nil { + return f.relMethod(from, recv.Type()) + } + + // Thunk? + if f.method != nil { + return f.relMethod(from, f.method.Recv()) + } + + // Bound? + if len(f.FreeVars) == 1 && strings.HasSuffix(f.name, "$bound") { + return f.relMethod(from, f.FreeVars[0].Type()) + } + + // Package-level function? + // Prefix with package name for cross-package references only. + if p := f.pkg(); p != nil && p != from { + return fmt.Sprintf("%s.%s", p.Path(), f.name) + } + + // Unknown. + return f.name +} + +func (f *Function) relMethod(from *types.Package, recv types.Type) string { + return fmt.Sprintf("(%s).%s", relType(recv, from), f.name) +} + +// writeSignature writes to buf the signature sig in declaration syntax. +func writeSignature(buf *bytes.Buffer, from *types.Package, name string, sig *types.Signature, params []*Parameter) { + buf.WriteString("func ") + if recv := sig.Recv(); recv != nil { + buf.WriteString("(") + if n := params[0].Name(); n != "" { + buf.WriteString(n) + buf.WriteString(" ") + } + types.WriteType(buf, params[0].Type(), types.RelativeTo(from)) + buf.WriteString(") ") + } + buf.WriteString(name) + types.WriteSignature(buf, sig, types.RelativeTo(from)) +} + +func (f *Function) pkg() *types.Package { + if f.Pkg != nil { + return f.Pkg.Pkg + } + return nil +} + +var _ io.WriterTo = (*Function)(nil) // *Function implements io.Writer + +func (f *Function) WriteTo(w io.Writer) (int64, error) { + var buf bytes.Buffer + WriteFunction(&buf, f) + n, err := w.Write(buf.Bytes()) + return int64(n), err +} + +// WriteFunction writes to buf a human-readable "disassembly" of f. +func WriteFunction(buf *bytes.Buffer, f *Function) { + fmt.Fprintf(buf, "# Name: %s\n", f.String()) + if f.Pkg != nil { + fmt.Fprintf(buf, "# Package: %s\n", f.Pkg.Pkg.Path()) + } + if syn := f.Synthetic; syn != "" { + fmt.Fprintln(buf, "# Synthetic:", syn) + } + if pos := f.Pos(); pos.IsValid() { + fmt.Fprintf(buf, "# Location: %s\n", f.Prog.Fset.Position(pos)) + } + + if f.parent != nil { + fmt.Fprintf(buf, "# Parent: %s\n", f.parent.Name()) + } + + if f.Recover != nil { + fmt.Fprintf(buf, "# Recover: %s\n", f.Recover) + } + + from := f.pkg() + + if f.FreeVars != nil { + buf.WriteString("# Free variables:\n") + for i, fv := range f.FreeVars { + fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, fv.Name(), relType(fv.Type(), from)) + } + } + + if len(f.Locals) > 0 { + buf.WriteString("# Locals:\n") + for i, l := range f.Locals { + fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, l.Name(), relType(deref(l.Type()), from)) + } + } + writeSignature(buf, from, f.Name(), f.Signature, f.Params) + buf.WriteString(":\n") + + if f.Blocks == nil { + buf.WriteString("\t(external)\n") + } + + // NB. column calculations are confused by non-ASCII + // characters and assume 8-space tabs. + const punchcard = 80 // for old time's sake. + const tabwidth = 8 + for _, b := range f.Blocks { + if b == nil { + // Corrupt CFG. + fmt.Fprintf(buf, ".nil:\n") + continue + } + n, _ := fmt.Fprintf(buf, "%d:", b.Index) + bmsg := fmt.Sprintf("%s P:%d S:%d", b.Comment, len(b.Preds), len(b.Succs)) + fmt.Fprintf(buf, "%*s%s\n", punchcard-1-n-len(bmsg), "", bmsg) + + if false { // CFG debugging + fmt.Fprintf(buf, "\t# CFG: %s --> %s --> %s\n", b.Preds, b, b.Succs) + } + for _, instr := range b.Instrs { + buf.WriteString("\t") + switch v := instr.(type) { + case Value: + l := punchcard - tabwidth + // Left-align the instruction. + if name := v.Name(); name != "" { + n, _ := fmt.Fprintf(buf, "%s = ", name) + l -= n + } + n, _ := buf.WriteString(instr.String()) + l -= n + // Right-align the type if there's space. + if t := v.Type(); t != nil { + buf.WriteByte(' ') + ts := relType(t, from) + l -= len(ts) + len(" ") // (spaces before and after type) + if l > 0 { + fmt.Fprintf(buf, "%*s", l, "") + } + buf.WriteString(ts) + } + case nil: + // Be robust against bad transforms. + buf.WriteString("") + default: + buf.WriteString(instr.String()) + } + buf.WriteString("\n") + } + } + fmt.Fprintf(buf, "\n") +} + +// newBasicBlock adds to f a new basic block and returns it. It does +// not automatically become the current block for subsequent calls to emit. +// comment is an optional string for more readable debugging output. +// +func (f *Function) newBasicBlock(comment string) *BasicBlock { + b := &BasicBlock{ + Index: len(f.Blocks), + Comment: comment, + parent: f, + } + b.Succs = b.succs2[:0] + f.Blocks = append(f.Blocks, b) + return b +} + +// NewFunction returns a new synthetic Function instance belonging to +// prog, with its name and signature fields set as specified. +// +// The caller is responsible for initializing the remaining fields of +// the function object, e.g. Pkg, Params, Blocks. +// +// It is practically impossible for clients to construct well-formed +// SSA functions/packages/programs directly, so we assume this is the +// job of the Builder alone. NewFunction exists to provide clients a +// little flexibility. For example, analysis tools may wish to +// construct fake Functions for the root of the callgraph, a fake +// "reflect" package, etc. +// +// TODO(adonovan): think harder about the API here. +// +func (prog *Program) NewFunction(name string, sig *types.Signature, provenance string) *Function { + return &Function{Prog: prog, name: name, Signature: sig, Synthetic: provenance} +} + +type extentNode [2]token.Pos + +func (n extentNode) Pos() token.Pos { return n[0] } +func (n extentNode) End() token.Pos { return n[1] } + +// Syntax returns an ast.Node whose Pos/End methods provide the +// lexical extent of the function if it was defined by Go source code +// (f.Synthetic==""), or nil otherwise. +// +// If f was built with debug information (see Package.SetDebugRef), +// the result is the *ast.FuncDecl or *ast.FuncLit that declared the +// function. Otherwise, it is an opaque Node providing only position +// information; this avoids pinning the AST in memory. +// +func (f *Function) Syntax() ast.Node { return f.syntax } diff --git a/vendor/golang.org/x/tools/go/ssa/func14.go b/vendor/golang.org/x/tools/go/ssa/func14.go new file mode 100644 index 0000000000..528f66e2db --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/func14.go @@ -0,0 +1,692 @@ +// Copyright 2013 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.5 + +package ssa + +// This file implements the Function and BasicBlock types. + +import ( + "bytes" + "fmt" + "go/ast" + "go/token" + "io" + "os" + "strings" + + "golang.org/x/tools/go/types" +) + +// addEdge adds a control-flow graph edge from from to to. +func addEdge(from, to *BasicBlock) { + from.Succs = append(from.Succs, to) + to.Preds = append(to.Preds, from) +} + +// Parent returns the function that contains block b. +func (b *BasicBlock) Parent() *Function { return b.parent } + +// String returns a human-readable label of this block. +// It is not guaranteed unique within the function. +// +func (b *BasicBlock) String() string { + return fmt.Sprintf("%d", b.Index) +} + +// emit appends an instruction to the current basic block. +// If the instruction defines a Value, it is returned. +// +func (b *BasicBlock) emit(i Instruction) Value { + i.setBlock(b) + b.Instrs = append(b.Instrs, i) + v, _ := i.(Value) + return v +} + +// predIndex returns the i such that b.Preds[i] == c or panics if +// there is none. +func (b *BasicBlock) predIndex(c *BasicBlock) int { + for i, pred := range b.Preds { + if pred == c { + return i + } + } + panic(fmt.Sprintf("no edge %s -> %s", c, b)) +} + +// hasPhi returns true if b.Instrs contains φ-nodes. +func (b *BasicBlock) hasPhi() bool { + _, ok := b.Instrs[0].(*Phi) + return ok +} + +// phis returns the prefix of b.Instrs containing all the block's φ-nodes. +func (b *BasicBlock) phis() []Instruction { + for i, instr := range b.Instrs { + if _, ok := instr.(*Phi); !ok { + return b.Instrs[:i] + } + } + return nil // unreachable in well-formed blocks +} + +// replacePred replaces all occurrences of p in b's predecessor list with q. +// Ordinarily there should be at most one. +// +func (b *BasicBlock) replacePred(p, q *BasicBlock) { + for i, pred := range b.Preds { + if pred == p { + b.Preds[i] = q + } + } +} + +// replaceSucc replaces all occurrences of p in b's successor list with q. +// Ordinarily there should be at most one. +// +func (b *BasicBlock) replaceSucc(p, q *BasicBlock) { + for i, succ := range b.Succs { + if succ == p { + b.Succs[i] = q + } + } +} + +// removePred removes all occurrences of p in b's +// predecessor list and φ-nodes. +// Ordinarily there should be at most one. +// +func (b *BasicBlock) removePred(p *BasicBlock) { + phis := b.phis() + + // We must preserve edge order for φ-nodes. + j := 0 + for i, pred := range b.Preds { + if pred != p { + b.Preds[j] = b.Preds[i] + // Strike out φ-edge too. + for _, instr := range phis { + phi := instr.(*Phi) + phi.Edges[j] = phi.Edges[i] + } + j++ + } + } + // Nil out b.Preds[j:] and φ-edges[j:] to aid GC. + for i := j; i < len(b.Preds); i++ { + b.Preds[i] = nil + for _, instr := range phis { + instr.(*Phi).Edges[i] = nil + } + } + b.Preds = b.Preds[:j] + for _, instr := range phis { + phi := instr.(*Phi) + phi.Edges = phi.Edges[:j] + } +} + +// Destinations associated with unlabelled for/switch/select stmts. +// We push/pop one of these as we enter/leave each construct and for +// each BranchStmt we scan for the innermost target of the right type. +// +type targets struct { + tail *targets // rest of stack + _break *BasicBlock + _continue *BasicBlock + _fallthrough *BasicBlock +} + +// Destinations associated with a labelled block. +// We populate these as labels are encountered in forward gotos or +// labelled statements. +// +type lblock struct { + _goto *BasicBlock + _break *BasicBlock + _continue *BasicBlock +} + +// labelledBlock returns the branch target associated with the +// specified label, creating it if needed. +// +func (f *Function) labelledBlock(label *ast.Ident) *lblock { + lb := f.lblocks[label.Obj] + if lb == nil { + lb = &lblock{_goto: f.newBasicBlock(label.Name)} + if f.lblocks == nil { + f.lblocks = make(map[*ast.Object]*lblock) + } + f.lblocks[label.Obj] = lb + } + return lb +} + +// addParam adds a (non-escaping) parameter to f.Params of the +// specified name, type and source position. +// +func (f *Function) addParam(name string, typ types.Type, pos token.Pos) *Parameter { + v := &Parameter{ + name: name, + typ: typ, + pos: pos, + parent: f, + } + f.Params = append(f.Params, v) + return v +} + +func (f *Function) addParamObj(obj types.Object) *Parameter { + name := obj.Name() + if name == "" { + name = fmt.Sprintf("arg%d", len(f.Params)) + } + param := f.addParam(name, obj.Type(), obj.Pos()) + param.object = obj + return param +} + +// addSpilledParam declares a parameter that is pre-spilled to the +// stack; the function body will load/store the spilled location. +// Subsequent lifting will eliminate spills where possible. +// +func (f *Function) addSpilledParam(obj types.Object) { + param := f.addParamObj(obj) + spill := &Alloc{Comment: obj.Name()} + spill.setType(types.NewPointer(obj.Type())) + spill.setPos(obj.Pos()) + f.objects[obj] = spill + f.Locals = append(f.Locals, spill) + f.emit(spill) + f.emit(&Store{Addr: spill, Val: param}) +} + +// startBody initializes the function prior to generating SSA code for its body. +// Precondition: f.Type() already set. +// +func (f *Function) startBody() { + f.currentBlock = f.newBasicBlock("entry") + f.objects = make(map[types.Object]Value) // needed for some synthetics, e.g. init +} + +// createSyntacticParams populates f.Params and generates code (spills +// and named result locals) for all the parameters declared in the +// syntax. In addition it populates the f.objects mapping. +// +// Preconditions: +// f.startBody() was called. +// Postcondition: +// len(f.Params) == len(f.Signature.Params) + (f.Signature.Recv() ? 1 : 0) +// +func (f *Function) createSyntacticParams(recv *ast.FieldList, functype *ast.FuncType) { + // Receiver (at most one inner iteration). + if recv != nil { + for _, field := range recv.List { + for _, n := range field.Names { + f.addSpilledParam(f.Pkg.info.Defs[n]) + } + // Anonymous receiver? No need to spill. + if field.Names == nil { + f.addParamObj(f.Signature.Recv()) + } + } + } + + // Parameters. + if functype.Params != nil { + n := len(f.Params) // 1 if has recv, 0 otherwise + for _, field := range functype.Params.List { + for _, n := range field.Names { + f.addSpilledParam(f.Pkg.info.Defs[n]) + } + // Anonymous parameter? No need to spill. + if field.Names == nil { + f.addParamObj(f.Signature.Params().At(len(f.Params) - n)) + } + } + } + + // Named results. + if functype.Results != nil { + for _, field := range functype.Results.List { + // Implicit "var" decl of locals for named results. + for _, n := range field.Names { + f.namedResults = append(f.namedResults, f.addLocalForIdent(n)) + } + } + } +} + +// numberRegisters assigns numbers to all SSA registers +// (value-defining Instructions) in f, to aid debugging. +// (Non-Instruction Values are named at construction.) +// +func numberRegisters(f *Function) { + v := 0 + for _, b := range f.Blocks { + for _, instr := range b.Instrs { + switch instr.(type) { + case Value: + instr.(interface { + setNum(int) + }).setNum(v) + v++ + } + } + } +} + +// buildReferrers populates the def/use information in all non-nil +// Value.Referrers slice. +// Precondition: all such slices are initially empty. +func buildReferrers(f *Function) { + var rands []*Value + for _, b := range f.Blocks { + for _, instr := range b.Instrs { + rands = instr.Operands(rands[:0]) // recycle storage + for _, rand := range rands { + if r := *rand; r != nil { + if ref := r.Referrers(); ref != nil { + *ref = append(*ref, instr) + } + } + } + } + } +} + +// finishBody() finalizes the function after SSA code generation of its body. +func (f *Function) finishBody() { + f.objects = nil + f.currentBlock = nil + f.lblocks = nil + + // Don't pin the AST in memory (except in debug mode). + if n := f.syntax; n != nil && !f.debugInfo() { + f.syntax = extentNode{n.Pos(), n.End()} + } + + // Remove from f.Locals any Allocs that escape to the heap. + j := 0 + for _, l := range f.Locals { + if !l.Heap { + f.Locals[j] = l + j++ + } + } + // Nil out f.Locals[j:] to aid GC. + for i := j; i < len(f.Locals); i++ { + f.Locals[i] = nil + } + f.Locals = f.Locals[:j] + + optimizeBlocks(f) + + buildReferrers(f) + + buildDomTree(f) + + if f.Prog.mode&NaiveForm == 0 { + // For debugging pre-state of lifting pass: + // numberRegisters(f) + // f.WriteTo(os.Stderr) + lift(f) + } + + f.namedResults = nil // (used by lifting) + + numberRegisters(f) + + if f.Prog.mode&PrintFunctions != 0 { + printMu.Lock() + f.WriteTo(os.Stdout) + printMu.Unlock() + } + + if f.Prog.mode&SanityCheckFunctions != 0 { + mustSanityCheck(f, nil) + } +} + +// removeNilBlocks eliminates nils from f.Blocks and updates each +// BasicBlock.Index. Use this after any pass that may delete blocks. +// +func (f *Function) removeNilBlocks() { + j := 0 + for _, b := range f.Blocks { + if b != nil { + b.Index = j + f.Blocks[j] = b + j++ + } + } + // Nil out f.Blocks[j:] to aid GC. + for i := j; i < len(f.Blocks); i++ { + f.Blocks[i] = nil + } + f.Blocks = f.Blocks[:j] +} + +// SetDebugMode sets the debug mode for package pkg. If true, all its +// functions will include full debug info. This greatly increases the +// size of the instruction stream, and causes Functions to depend upon +// the ASTs, potentially keeping them live in memory for longer. +// +func (pkg *Package) SetDebugMode(debug bool) { + // TODO(adonovan): do we want ast.File granularity? + pkg.debug = debug +} + +// debugInfo reports whether debug info is wanted for this function. +func (f *Function) debugInfo() bool { + return f.Pkg != nil && f.Pkg.debug +} + +// addNamedLocal creates a local variable, adds it to function f and +// returns it. Its name and type are taken from obj. Subsequent +// calls to f.lookup(obj) will return the same local. +// +func (f *Function) addNamedLocal(obj types.Object) *Alloc { + l := f.addLocal(obj.Type(), obj.Pos()) + l.Comment = obj.Name() + f.objects[obj] = l + return l +} + +func (f *Function) addLocalForIdent(id *ast.Ident) *Alloc { + return f.addNamedLocal(f.Pkg.info.Defs[id]) +} + +// addLocal creates an anonymous local variable of type typ, adds it +// to function f and returns it. pos is the optional source location. +// +func (f *Function) addLocal(typ types.Type, pos token.Pos) *Alloc { + v := &Alloc{} + v.setType(types.NewPointer(typ)) + v.setPos(pos) + f.Locals = append(f.Locals, v) + f.emit(v) + return v +} + +// lookup returns the address of the named variable identified by obj +// that is local to function f or one of its enclosing functions. +// If escaping, the reference comes from a potentially escaping pointer +// expression and the referent must be heap-allocated. +// +func (f *Function) lookup(obj types.Object, escaping bool) Value { + if v, ok := f.objects[obj]; ok { + if alloc, ok := v.(*Alloc); ok && escaping { + alloc.Heap = true + } + return v // function-local var (address) + } + + // Definition must be in an enclosing function; + // plumb it through intervening closures. + if f.parent == nil { + panic("no ssa.Value for " + obj.String()) + } + outer := f.parent.lookup(obj, true) // escaping + v := &FreeVar{ + name: obj.Name(), + typ: outer.Type(), + pos: outer.Pos(), + outer: outer, + parent: f, + } + f.objects[obj] = v + f.FreeVars = append(f.FreeVars, v) + return v +} + +// emit emits the specified instruction to function f. +func (f *Function) emit(instr Instruction) Value { + return f.currentBlock.emit(instr) +} + +// RelString returns the full name of this function, qualified by +// package name, receiver type, etc. +// +// The specific formatting rules are not guaranteed and may change. +// +// Examples: +// "math.IsNaN" // a package-level function +// "(*bytes.Buffer).Bytes" // a declared method or a wrapper +// "(*bytes.Buffer).Bytes$thunk" // thunk (func wrapping method; receiver is param 0) +// "(*bytes.Buffer).Bytes$bound" // bound (func wrapping method; receiver supplied by closure) +// "main.main$1" // an anonymous function in main +// "main.init#1" // a declared init function +// "main.init" // the synthesized package initializer +// +// When these functions are referred to from within the same package +// (i.e. from == f.Pkg.Object), they are rendered without the package path. +// For example: "IsNaN", "(*Buffer).Bytes", etc. +// +// All non-synthetic functions have distinct package-qualified names. +// (But two methods may have the same name "(T).f" if one is a synthetic +// wrapper promoting a non-exported method "f" from another package; in +// that case, the strings are equal but the identifiers "f" are distinct.) +// +func (f *Function) RelString(from *types.Package) string { + // Anonymous? + if f.parent != nil { + // An anonymous function's Name() looks like "parentName$1", + // but its String() should include the type/package/etc. + parent := f.parent.RelString(from) + for i, anon := range f.parent.AnonFuncs { + if anon == f { + return fmt.Sprintf("%s$%d", parent, 1+i) + } + } + + return f.name // should never happen + } + + // Method (declared or wrapper)? + if recv := f.Signature.Recv(); recv != nil { + return f.relMethod(from, recv.Type()) + } + + // Thunk? + if f.method != nil { + return f.relMethod(from, f.method.Recv()) + } + + // Bound? + if len(f.FreeVars) == 1 && strings.HasSuffix(f.name, "$bound") { + return f.relMethod(from, f.FreeVars[0].Type()) + } + + // Package-level function? + // Prefix with package name for cross-package references only. + if p := f.pkg(); p != nil && p != from { + return fmt.Sprintf("%s.%s", p.Path(), f.name) + } + + // Unknown. + return f.name +} + +func (f *Function) relMethod(from *types.Package, recv types.Type) string { + return fmt.Sprintf("(%s).%s", relType(recv, from), f.name) +} + +// writeSignature writes to buf the signature sig in declaration syntax. +func writeSignature(buf *bytes.Buffer, from *types.Package, name string, sig *types.Signature, params []*Parameter) { + buf.WriteString("func ") + if recv := sig.Recv(); recv != nil { + buf.WriteString("(") + if n := params[0].Name(); n != "" { + buf.WriteString(n) + buf.WriteString(" ") + } + types.WriteType(buf, params[0].Type(), types.RelativeTo(from)) + buf.WriteString(") ") + } + buf.WriteString(name) + types.WriteSignature(buf, sig, types.RelativeTo(from)) +} + +func (f *Function) pkg() *types.Package { + if f.Pkg != nil { + return f.Pkg.Pkg + } + return nil +} + +var _ io.WriterTo = (*Function)(nil) // *Function implements io.Writer + +func (f *Function) WriteTo(w io.Writer) (int64, error) { + var buf bytes.Buffer + WriteFunction(&buf, f) + n, err := w.Write(buf.Bytes()) + return int64(n), err +} + +// WriteFunction writes to buf a human-readable "disassembly" of f. +func WriteFunction(buf *bytes.Buffer, f *Function) { + fmt.Fprintf(buf, "# Name: %s\n", f.String()) + if f.Pkg != nil { + fmt.Fprintf(buf, "# Package: %s\n", f.Pkg.Pkg.Path()) + } + if syn := f.Synthetic; syn != "" { + fmt.Fprintln(buf, "# Synthetic:", syn) + } + if pos := f.Pos(); pos.IsValid() { + fmt.Fprintf(buf, "# Location: %s\n", f.Prog.Fset.Position(pos)) + } + + if f.parent != nil { + fmt.Fprintf(buf, "# Parent: %s\n", f.parent.Name()) + } + + if f.Recover != nil { + fmt.Fprintf(buf, "# Recover: %s\n", f.Recover) + } + + from := f.pkg() + + if f.FreeVars != nil { + buf.WriteString("# Free variables:\n") + for i, fv := range f.FreeVars { + fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, fv.Name(), relType(fv.Type(), from)) + } + } + + if len(f.Locals) > 0 { + buf.WriteString("# Locals:\n") + for i, l := range f.Locals { + fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, l.Name(), relType(deref(l.Type()), from)) + } + } + writeSignature(buf, from, f.Name(), f.Signature, f.Params) + buf.WriteString(":\n") + + if f.Blocks == nil { + buf.WriteString("\t(external)\n") + } + + // NB. column calculations are confused by non-ASCII + // characters and assume 8-space tabs. + const punchcard = 80 // for old time's sake. + const tabwidth = 8 + for _, b := range f.Blocks { + if b == nil { + // Corrupt CFG. + fmt.Fprintf(buf, ".nil:\n") + continue + } + n, _ := fmt.Fprintf(buf, "%d:", b.Index) + bmsg := fmt.Sprintf("%s P:%d S:%d", b.Comment, len(b.Preds), len(b.Succs)) + fmt.Fprintf(buf, "%*s%s\n", punchcard-1-n-len(bmsg), "", bmsg) + + if false { // CFG debugging + fmt.Fprintf(buf, "\t# CFG: %s --> %s --> %s\n", b.Preds, b, b.Succs) + } + for _, instr := range b.Instrs { + buf.WriteString("\t") + switch v := instr.(type) { + case Value: + l := punchcard - tabwidth + // Left-align the instruction. + if name := v.Name(); name != "" { + n, _ := fmt.Fprintf(buf, "%s = ", name) + l -= n + } + n, _ := buf.WriteString(instr.String()) + l -= n + // Right-align the type if there's space. + if t := v.Type(); t != nil { + buf.WriteByte(' ') + ts := relType(t, from) + l -= len(ts) + len(" ") // (spaces before and after type) + if l > 0 { + fmt.Fprintf(buf, "%*s", l, "") + } + buf.WriteString(ts) + } + case nil: + // Be robust against bad transforms. + buf.WriteString("") + default: + buf.WriteString(instr.String()) + } + buf.WriteString("\n") + } + } + fmt.Fprintf(buf, "\n") +} + +// newBasicBlock adds to f a new basic block and returns it. It does +// not automatically become the current block for subsequent calls to emit. +// comment is an optional string for more readable debugging output. +// +func (f *Function) newBasicBlock(comment string) *BasicBlock { + b := &BasicBlock{ + Index: len(f.Blocks), + Comment: comment, + parent: f, + } + b.Succs = b.succs2[:0] + f.Blocks = append(f.Blocks, b) + return b +} + +// NewFunction returns a new synthetic Function instance belonging to +// prog, with its name and signature fields set as specified. +// +// The caller is responsible for initializing the remaining fields of +// the function object, e.g. Pkg, Params, Blocks. +// +// It is practically impossible for clients to construct well-formed +// SSA functions/packages/programs directly, so we assume this is the +// job of the Builder alone. NewFunction exists to provide clients a +// little flexibility. For example, analysis tools may wish to +// construct fake Functions for the root of the callgraph, a fake +// "reflect" package, etc. +// +// TODO(adonovan): think harder about the API here. +// +func (prog *Program) NewFunction(name string, sig *types.Signature, provenance string) *Function { + return &Function{Prog: prog, name: name, Signature: sig, Synthetic: provenance} +} + +type extentNode [2]token.Pos + +func (n extentNode) Pos() token.Pos { return n[0] } +func (n extentNode) End() token.Pos { return n[1] } + +// Syntax returns an ast.Node whose Pos/End methods provide the +// lexical extent of the function if it was defined by Go source code +// (f.Synthetic==""), or nil otherwise. +// +// If f was built with debug information (see Package.SetDebugRef), +// the result is the *ast.FuncDecl or *ast.FuncLit that declared the +// function. Otherwise, it is an opaque Node providing only position +// information; this avoids pinning the AST in memory. +// +func (f *Function) Syntax() ast.Node { return f.syntax } diff --git a/vendor/golang.org/x/tools/go/ssa/interp/external.go b/vendor/golang.org/x/tools/go/ssa/interp/external.go new file mode 100644 index 0000000000..9c02e54745 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/external.go @@ -0,0 +1,531 @@ +// Copyright 2013 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.5 + +package interp + +// Emulated functions that we cannot interpret because they are +// external or because they use "unsafe" or "reflect" operations. + +import ( + "go/types" + "math" + "os" + "runtime" + "strings" + "syscall" + "time" + "unsafe" + + "golang.org/x/tools/go/ssa" +) + +type externalFn func(fr *frame, args []value) value + +// TODO(adonovan): fix: reflect.Value abstracts an lvalue or an +// rvalue; Set() causes mutations that can be observed via aliases. +// We have not captured that correctly here. + +// Key strings are from Function.String(). +var externals map[string]externalFn + +func init() { + // That little dot ۰ is an Arabic zero numeral (U+06F0), categories [Nd]. + externals = map[string]externalFn{ + "(*sync.Pool).Get": ext۰sync۰Pool۰Get, + "(*sync.Pool).Put": ext۰sync۰Pool۰Put, + "(reflect.Value).Bool": ext۰reflect۰Value۰Bool, + "(reflect.Value).CanAddr": ext۰reflect۰Value۰CanAddr, + "(reflect.Value).CanInterface": ext۰reflect۰Value۰CanInterface, + "(reflect.Value).Elem": ext۰reflect۰Value۰Elem, + "(reflect.Value).Field": ext۰reflect۰Value۰Field, + "(reflect.Value).Float": ext۰reflect۰Value۰Float, + "(reflect.Value).Index": ext۰reflect۰Value۰Index, + "(reflect.Value).Int": ext۰reflect۰Value۰Int, + "(reflect.Value).Interface": ext۰reflect۰Value۰Interface, + "(reflect.Value).IsNil": ext۰reflect۰Value۰IsNil, + "(reflect.Value).IsValid": ext۰reflect۰Value۰IsValid, + "(reflect.Value).Kind": ext۰reflect۰Value۰Kind, + "(reflect.Value).Len": ext۰reflect۰Value۰Len, + "(reflect.Value).MapIndex": ext۰reflect۰Value۰MapIndex, + "(reflect.Value).MapKeys": ext۰reflect۰Value۰MapKeys, + "(reflect.Value).NumField": ext۰reflect۰Value۰NumField, + "(reflect.Value).NumMethod": ext۰reflect۰Value۰NumMethod, + "(reflect.Value).Pointer": ext۰reflect۰Value۰Pointer, + "(reflect.Value).Set": ext۰reflect۰Value۰Set, + "(reflect.Value).String": ext۰reflect۰Value۰String, + "(reflect.Value).Type": ext۰reflect۰Value۰Type, + "(reflect.Value).Uint": ext۰reflect۰Value۰Uint, + "(reflect.error).Error": ext۰reflect۰error۰Error, + "(reflect.rtype).Bits": ext۰reflect۰rtype۰Bits, + "(reflect.rtype).Elem": ext۰reflect۰rtype۰Elem, + "(reflect.rtype).Field": ext۰reflect۰rtype۰Field, + "(reflect.rtype).In": ext۰reflect۰rtype۰In, + "(reflect.rtype).Kind": ext۰reflect۰rtype۰Kind, + "(reflect.rtype).NumField": ext۰reflect۰rtype۰NumField, + "(reflect.rtype).NumIn": ext۰reflect۰rtype۰NumIn, + "(reflect.rtype).NumMethod": ext۰reflect۰rtype۰NumMethod, + "(reflect.rtype).NumOut": ext۰reflect۰rtype۰NumOut, + "(reflect.rtype).Out": ext۰reflect۰rtype۰Out, + "(reflect.rtype).Size": ext۰reflect۰rtype۰Size, + "(reflect.rtype).String": ext۰reflect۰rtype۰String, + "bytes.Equal": ext۰bytes۰Equal, + "bytes.IndexByte": ext۰bytes۰IndexByte, + "hash/crc32.haveSSE42": ext۰crc32۰haveSSE42, + "math.Abs": ext۰math۰Abs, + "math.Exp": ext۰math۰Exp, + "math.Float32bits": ext۰math۰Float32bits, + "math.Float32frombits": ext۰math۰Float32frombits, + "math.Float64bits": ext۰math۰Float64bits, + "math.Float64frombits": ext۰math۰Float64frombits, + "math.Ldexp": ext۰math۰Ldexp, + "math.Log": ext۰math۰Log, + "math.Min": ext۰math۰Min, + "math.hasSSE4": ext۰math۰hasSSE4, + "os.Pipe": ext۰os۰Pipe, + "os.runtime_args": ext۰os۰runtime_args, + "os.runtime_beforeExit": ext۰os۰runtime_beforeExit, + "reflect.New": ext۰reflect۰New, + "reflect.SliceOf": ext۰reflect۰SliceOf, + "reflect.TypeOf": ext۰reflect۰TypeOf, + "reflect.ValueOf": ext۰reflect۰ValueOf, + "reflect.Zero": ext۰reflect۰Zero, + "reflect.init": ext۰reflect۰Init, + "reflect.valueInterface": ext۰reflect۰valueInterface, + "runtime.Breakpoint": ext۰runtime۰Breakpoint, + "runtime.Caller": ext۰runtime۰Caller, + "runtime.Callers": ext۰runtime۰Callers, + "runtime.FuncForPC": ext۰runtime۰FuncForPC, + "runtime.GC": ext۰runtime۰GC, + "runtime.GOMAXPROCS": ext۰runtime۰GOMAXPROCS, + "runtime.Goexit": ext۰runtime۰Goexit, + "runtime.Gosched": ext۰runtime۰Gosched, + "runtime.init": ext۰runtime۰init, + "runtime.NumCPU": ext۰runtime۰NumCPU, + "runtime.ReadMemStats": ext۰runtime۰ReadMemStats, + "runtime.SetFinalizer": ext۰runtime۰SetFinalizer, + "(*runtime.Func).Entry": ext۰runtime۰Func۰Entry, + "(*runtime.Func).FileLine": ext۰runtime۰Func۰FileLine, + "(*runtime.Func).Name": ext۰runtime۰Func۰Name, + "runtime.environ": ext۰runtime۰environ, + "runtime.getgoroot": ext۰runtime۰getgoroot, + "strings.Index": ext۰strings۰Index, + "strings.IndexByte": ext۰strings۰IndexByte, + "sync.runtime_Semacquire": ext۰sync۰runtime_Semacquire, + "sync.runtime_Semrelease": ext۰sync۰runtime_Semrelease, + "sync.runtime_Syncsemcheck": ext۰sync۰runtime_Syncsemcheck, + "sync.runtime_notifyListCheck": ext۰sync۰runtime_notifyListCheck, + "sync.runtime_registerPoolCleanup": ext۰sync۰runtime_registerPoolCleanup, + "sync/atomic.AddInt32": ext۰atomic۰AddInt32, + "sync/atomic.AddUint32": ext۰atomic۰AddUint32, + "sync/atomic.AddUint64": ext۰atomic۰AddUint64, + "sync/atomic.CompareAndSwapInt32": ext۰atomic۰CompareAndSwapInt32, + "sync/atomic.LoadInt32": ext۰atomic۰LoadInt32, + "sync/atomic.LoadUint32": ext۰atomic۰LoadUint32, + "sync/atomic.StoreInt32": ext۰atomic۰StoreInt32, + "sync/atomic.StoreUint32": ext۰atomic۰StoreUint32, + "syscall.Close": ext۰syscall۰Close, + "syscall.Exit": ext۰syscall۰Exit, + "syscall.Fstat": ext۰syscall۰Fstat, + "syscall.Getpid": ext۰syscall۰Getpid, + "syscall.Getwd": ext۰syscall۰Getwd, + "syscall.Kill": ext۰syscall۰Kill, + "syscall.Lstat": ext۰syscall۰Lstat, + "syscall.Open": ext۰syscall۰Open, + "syscall.ParseDirent": ext۰syscall۰ParseDirent, + "syscall.RawSyscall": ext۰syscall۰RawSyscall, + "syscall.Read": ext۰syscall۰Read, + "syscall.ReadDirent": ext۰syscall۰ReadDirent, + "syscall.Stat": ext۰syscall۰Stat, + "syscall.Write": ext۰syscall۰Write, + "syscall.runtime_envs": ext۰runtime۰environ, + "testing.runExample": ext۰testing۰runExample, + "time.Sleep": ext۰time۰Sleep, + "time.now": ext۰time۰now, + } +} + +// wrapError returns an interpreted 'error' interface value for err. +func wrapError(err error) value { + if err == nil { + return iface{} + } + return iface{t: errorType, v: err.Error()} +} + +func ext۰sync۰Pool۰Get(fr *frame, args []value) value { + Pool := fr.i.prog.ImportedPackage("sync").Type("Pool").Object() + _, newIndex, _ := types.LookupFieldOrMethod(Pool.Type(), false, Pool.Pkg(), "New") + + if New := (*args[0].(*value)).(structure)[newIndex[0]]; New != nil { + return call(fr.i, fr, 0, New, nil) + } + return nil +} + +func ext۰sync۰Pool۰Put(fr *frame, args []value) value { + return nil +} + +func ext۰bytes۰Equal(fr *frame, args []value) value { + // func Equal(a, b []byte) bool + a := args[0].([]value) + b := args[1].([]value) + if len(a) != len(b) { + return false + } + for i := range a { + if a[i] != b[i] { + return false + } + } + return true +} + +func ext۰bytes۰IndexByte(fr *frame, args []value) value { + // func IndexByte(s []byte, c byte) int + s := args[0].([]value) + c := args[1].(byte) + for i, b := range s { + if b.(byte) == c { + return i + } + } + return -1 +} + +func ext۰crc32۰haveSSE42(fr *frame, args []value) value { + return false +} + +func ext۰math۰Float64frombits(fr *frame, args []value) value { + return math.Float64frombits(args[0].(uint64)) +} + +func ext۰math۰Float64bits(fr *frame, args []value) value { + return math.Float64bits(args[0].(float64)) +} + +func ext۰math۰Float32frombits(fr *frame, args []value) value { + return math.Float32frombits(args[0].(uint32)) +} + +func ext۰math۰Abs(fr *frame, args []value) value { + return math.Abs(args[0].(float64)) +} + +func ext۰math۰Exp(fr *frame, args []value) value { + return math.Exp(args[0].(float64)) +} + +func ext۰math۰Float32bits(fr *frame, args []value) value { + return math.Float32bits(args[0].(float32)) +} + +func ext۰math۰Min(fr *frame, args []value) value { + return math.Min(args[0].(float64), args[1].(float64)) +} + +func ext۰math۰hasSSE4(fr *frame, args []value) value { + return false +} + +func ext۰math۰Ldexp(fr *frame, args []value) value { + return math.Ldexp(args[0].(float64), args[1].(int)) +} + +func ext۰math۰Log(fr *frame, args []value) value { + return math.Log(args[0].(float64)) +} + +func ext۰os۰runtime_args(fr *frame, args []value) value { + return fr.i.osArgs +} + +func ext۰os۰runtime_beforeExit(fr *frame, args []value) value { + return nil +} + +func ext۰runtime۰Breakpoint(fr *frame, args []value) value { + runtime.Breakpoint() + return nil +} + +func ext۰runtime۰Caller(fr *frame, args []value) value { + // func Caller(skip int) (pc uintptr, file string, line int, ok bool) + skip := 1 + args[0].(int) + for i := 0; i < skip; i++ { + if fr != nil { + fr = fr.caller + } + } + var pc uintptr + var file string + var line int + var ok bool + if fr != nil { + fn := fr.fn + // TODO(adonovan): use pc/posn of current instruction, not start of fn. + // (Required to interpret the log package's tests.) + pc = uintptr(unsafe.Pointer(fn)) + posn := fn.Prog.Fset.Position(fn.Pos()) + file = posn.Filename + line = posn.Line + ok = true + } + return tuple{pc, file, line, ok} +} + +func ext۰runtime۰Callers(fr *frame, args []value) value { + // Callers(skip int, pc []uintptr) int + skip := args[0].(int) + pc := args[1].([]value) + for i := 0; i < skip; i++ { + if fr != nil { + fr = fr.caller + } + } + i := 0 + for fr != nil { + pc[i] = uintptr(unsafe.Pointer(fr.fn)) + i++ + fr = fr.caller + } + return i +} + +func ext۰runtime۰FuncForPC(fr *frame, args []value) value { + // FuncForPC(pc uintptr) *Func + pc := args[0].(uintptr) + var fn *ssa.Function + if pc != 0 { + fn = (*ssa.Function)(unsafe.Pointer(pc)) // indeed unsafe! + } + var Func value + Func = structure{fn} // a runtime.Func + return &Func +} + +func ext۰runtime۰environ(fr *frame, args []value) value { + // This function also implements syscall.runtime_envs. + return environ +} + +func ext۰runtime۰getgoroot(fr *frame, args []value) value { + return os.Getenv("GOROOT") +} + +func ext۰strings۰IndexByte(fr *frame, args []value) value { + // func IndexByte(s string, c byte) int + s := args[0].(string) + c := args[1].(byte) + for i := 0; i < len(s); i++ { + if s[i] == c { + return i + } + } + return -1 +} + +func ext۰strings۰Index(fr *frame, args []value) value { + // Call compiled version to avoid tricky asm dependency. + return strings.Index(args[0].(string), args[1].(string)) +} + +func ext۰sync۰runtime_Semacquire(fr *frame, args []value) value { + // TODO(adonovan): fix: implement. + return nil +} + +func ext۰sync۰runtime_Semrelease(fr *frame, args []value) value { + // TODO(adonovan): fix: implement. + return nil +} + +func ext۰sync۰runtime_Syncsemcheck(fr *frame, args []value) value { + // TODO(adonovan): fix: implement. + return nil +} + +func ext۰sync۰runtime_notifyListCheck(fr *frame, args []value) value { + return nil // no-op +} + +func ext۰sync۰runtime_registerPoolCleanup(fr *frame, args []value) value { + return nil // no-op +} + +func ext۰runtime۰GOMAXPROCS(fr *frame, args []value) value { + // Ignore args[0]; don't let the interpreted program + // set the interpreter's GOMAXPROCS! + return runtime.GOMAXPROCS(0) +} + +func ext۰runtime۰Goexit(fr *frame, args []value) value { + // TODO(adonovan): don't kill the interpreter's main goroutine. + runtime.Goexit() + return nil +} + +func ext۰runtime۰GC(fr *frame, args []value) value { + runtime.GC() + return nil +} + +func ext۰runtime۰Gosched(fr *frame, args []value) value { + runtime.Gosched() + return nil +} + +func ext۰runtime۰init(fr *frame, args []value) value { + return nil +} + +func ext۰runtime۰NumCPU(fr *frame, args []value) value { + return runtime.NumCPU() +} + +func ext۰runtime۰ReadMemStats(fr *frame, args []value) value { + // TODO(adonovan): populate args[0].(Struct) + return nil +} + +func ext۰atomic۰LoadUint32(fr *frame, args []value) value { + // TODO(adonovan): fix: not atomic! + return (*args[0].(*value)).(uint32) +} + +func ext۰atomic۰StoreUint32(fr *frame, args []value) value { + // TODO(adonovan): fix: not atomic! + *args[0].(*value) = args[1].(uint32) + return nil +} + +func ext۰atomic۰LoadInt32(fr *frame, args []value) value { + // TODO(adonovan): fix: not atomic! + return (*args[0].(*value)).(int32) +} + +func ext۰atomic۰StoreInt32(fr *frame, args []value) value { + // TODO(adonovan): fix: not atomic! + *args[0].(*value) = args[1].(int32) + return nil +} + +func ext۰atomic۰CompareAndSwapInt32(fr *frame, args []value) value { + // TODO(adonovan): fix: not atomic! + p := args[0].(*value) + if (*p).(int32) == args[1].(int32) { + *p = args[2].(int32) + return true + } + return false +} + +func ext۰atomic۰AddInt32(fr *frame, args []value) value { + // TODO(adonovan): fix: not atomic! + p := args[0].(*value) + newv := (*p).(int32) + args[1].(int32) + *p = newv + return newv +} + +func ext۰atomic۰AddUint32(fr *frame, args []value) value { + // TODO(adonovan): fix: not atomic! + p := args[0].(*value) + newv := (*p).(uint32) + args[1].(uint32) + *p = newv + return newv +} + +func ext۰atomic۰AddUint64(fr *frame, args []value) value { + // TODO(adonovan): fix: not atomic! + p := args[0].(*value) + newv := (*p).(uint64) + args[1].(uint64) + *p = newv + return newv +} + +func ext۰runtime۰SetFinalizer(fr *frame, args []value) value { + return nil // ignore +} + +// Pretend: type runtime.Func struct { entry *ssa.Function } + +func ext۰runtime۰Func۰FileLine(fr *frame, args []value) value { + // func (*runtime.Func) FileLine(uintptr) (string, int) + f, _ := (*args[0].(*value)).(structure)[0].(*ssa.Function) + pc := args[1].(uintptr) + _ = pc + if f != nil { + // TODO(adonovan): use position of current instruction, not fn. + posn := f.Prog.Fset.Position(f.Pos()) + return tuple{posn.Filename, posn.Line} + } + return tuple{"", 0} +} + +func ext۰runtime۰Func۰Name(fr *frame, args []value) value { + // func (*runtime.Func) Name() string + f, _ := (*args[0].(*value)).(structure)[0].(*ssa.Function) + if f != nil { + return f.String() + } + return "" +} + +func ext۰runtime۰Func۰Entry(fr *frame, args []value) value { + // func (*runtime.Func) Entry() uintptr + f, _ := (*args[0].(*value)).(structure)[0].(*ssa.Function) + return uintptr(unsafe.Pointer(f)) +} + +// This is a workaround for a bug in go/ssa/testmain.go: it creates +// InternalExamples even for Example functions with no Output comment. +// TODO(adonovan): fix (and redesign) testmain.go after Go 1.6. +func ext۰testing۰runExample(fr *frame, args []value) value { + // This is a stripped down runExample that simply calls the function. + // It does not capture and compare output nor recover from panic. + // + // func runExample(eg testing.InternalExample) bool { + // eg.F() + // return true + // } + F := args[0].(structure)[1] + call(fr.i, fr, 0, F, nil) + return true +} + +func ext۰time۰now(fr *frame, args []value) value { + nano := time.Now().UnixNano() + return tuple{int64(nano / 1e9), int32(nano % 1e9)} +} + +func ext۰time۰Sleep(fr *frame, args []value) value { + time.Sleep(time.Duration(args[0].(int64))) + return nil +} + +func ext۰syscall۰Exit(fr *frame, args []value) value { + panic(exitPanic(args[0].(int))) +} + +func ext۰syscall۰Getwd(fr *frame, args []value) value { + s, err := syscall.Getwd() + return tuple{s, wrapError(err)} +} + +func ext۰syscall۰Getpid(fr *frame, args []value) value { + return syscall.Getpid() +} + +func valueToBytes(v value) []byte { + in := v.([]value) + b := make([]byte, len(in)) + for i := range in { + b[i] = in[i].(byte) + } + return b +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/external14.go b/vendor/golang.org/x/tools/go/ssa/interp/external14.go new file mode 100644 index 0000000000..c07c562e49 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/external14.go @@ -0,0 +1,526 @@ +// Copyright 2013 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.5 + +package interp + +// Emulated functions that we cannot interpret because they are +// external or because they use "unsafe" or "reflect" operations. + +import ( + "math" + "os" + "runtime" + "strings" + "syscall" + "time" + "unsafe" + + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types" +) + +type externalFn func(fr *frame, args []value) value + +// TODO(adonovan): fix: reflect.Value abstracts an lvalue or an +// rvalue; Set() causes mutations that can be observed via aliases. +// We have not captured that correctly here. + +// Key strings are from Function.String(). +var externals map[string]externalFn + +func init() { + // That little dot ۰ is an Arabic zero numeral (U+06F0), categories [Nd]. + externals = map[string]externalFn{ + "(*sync.Pool).Get": ext۰sync۰Pool۰Get, + "(*sync.Pool).Put": ext۰sync۰Pool۰Put, + "(reflect.Value).Bool": ext۰reflect۰Value۰Bool, + "(reflect.Value).CanAddr": ext۰reflect۰Value۰CanAddr, + "(reflect.Value).CanInterface": ext۰reflect۰Value۰CanInterface, + "(reflect.Value).Elem": ext۰reflect۰Value۰Elem, + "(reflect.Value).Field": ext۰reflect۰Value۰Field, + "(reflect.Value).Float": ext۰reflect۰Value۰Float, + "(reflect.Value).Index": ext۰reflect۰Value۰Index, + "(reflect.Value).Int": ext۰reflect۰Value۰Int, + "(reflect.Value).Interface": ext۰reflect۰Value۰Interface, + "(reflect.Value).IsNil": ext۰reflect۰Value۰IsNil, + "(reflect.Value).IsValid": ext۰reflect۰Value۰IsValid, + "(reflect.Value).Kind": ext۰reflect۰Value۰Kind, + "(reflect.Value).Len": ext۰reflect۰Value۰Len, + "(reflect.Value).MapIndex": ext۰reflect۰Value۰MapIndex, + "(reflect.Value).MapKeys": ext۰reflect۰Value۰MapKeys, + "(reflect.Value).NumField": ext۰reflect۰Value۰NumField, + "(reflect.Value).NumMethod": ext۰reflect۰Value۰NumMethod, + "(reflect.Value).Pointer": ext۰reflect۰Value۰Pointer, + "(reflect.Value).Set": ext۰reflect۰Value۰Set, + "(reflect.Value).String": ext۰reflect۰Value۰String, + "(reflect.Value).Type": ext۰reflect۰Value۰Type, + "(reflect.Value).Uint": ext۰reflect۰Value۰Uint, + "(reflect.error).Error": ext۰reflect۰error۰Error, + "(reflect.rtype).Bits": ext۰reflect۰rtype۰Bits, + "(reflect.rtype).Elem": ext۰reflect۰rtype۰Elem, + "(reflect.rtype).Field": ext۰reflect۰rtype۰Field, + "(reflect.rtype).In": ext۰reflect۰rtype۰In, + "(reflect.rtype).Kind": ext۰reflect۰rtype۰Kind, + "(reflect.rtype).NumField": ext۰reflect۰rtype۰NumField, + "(reflect.rtype).NumIn": ext۰reflect۰rtype۰NumIn, + "(reflect.rtype).NumMethod": ext۰reflect۰rtype۰NumMethod, + "(reflect.rtype).NumOut": ext۰reflect۰rtype۰NumOut, + "(reflect.rtype).Out": ext۰reflect۰rtype۰Out, + "(reflect.rtype).Size": ext۰reflect۰rtype۰Size, + "(reflect.rtype).String": ext۰reflect۰rtype۰String, + "bytes.Equal": ext۰bytes۰Equal, + "bytes.IndexByte": ext۰bytes۰IndexByte, + "hash/crc32.haveSSE42": ext۰crc32۰haveSSE42, + "math.Abs": ext۰math۰Abs, + "math.Exp": ext۰math۰Exp, + "math.Float32bits": ext۰math۰Float32bits, + "math.Float32frombits": ext۰math۰Float32frombits, + "math.Float64bits": ext۰math۰Float64bits, + "math.Float64frombits": ext۰math۰Float64frombits, + "math.Ldexp": ext۰math۰Ldexp, + "math.Log": ext۰math۰Log, + "math.Min": ext۰math۰Min, + "math.hasSSE4": ext۰math۰hasSSE4, + "os.Pipe": ext۰os۰Pipe, + "os.runtime_args": ext۰os۰runtime_args, + "os.runtime_beforeExit": ext۰os۰runtime_beforeExit, + "reflect.New": ext۰reflect۰New, + "reflect.SliceOf": ext۰reflect۰SliceOf, + "reflect.TypeOf": ext۰reflect۰TypeOf, + "reflect.ValueOf": ext۰reflect۰ValueOf, + "reflect.Zero": ext۰reflect۰Zero, + "reflect.init": ext۰reflect۰Init, + "reflect.valueInterface": ext۰reflect۰valueInterface, + "runtime.Breakpoint": ext۰runtime۰Breakpoint, + "runtime.Caller": ext۰runtime۰Caller, + "runtime.Callers": ext۰runtime۰Callers, + "runtime.FuncForPC": ext۰runtime۰FuncForPC, + "runtime.GC": ext۰runtime۰GC, + "runtime.GOMAXPROCS": ext۰runtime۰GOMAXPROCS, + "runtime.Goexit": ext۰runtime۰Goexit, + "runtime.Gosched": ext۰runtime۰Gosched, + "runtime.init": ext۰runtime۰init, + "runtime.NumCPU": ext۰runtime۰NumCPU, + "runtime.ReadMemStats": ext۰runtime۰ReadMemStats, + "runtime.SetFinalizer": ext۰runtime۰SetFinalizer, + "(*runtime.Func).Entry": ext۰runtime۰Func۰Entry, + "(*runtime.Func).FileLine": ext۰runtime۰Func۰FileLine, + "(*runtime.Func).Name": ext۰runtime۰Func۰Name, + "runtime.environ": ext۰runtime۰environ, + "runtime.getgoroot": ext۰runtime۰getgoroot, + "strings.Index": ext۰strings۰Index, + "strings.IndexByte": ext۰strings۰IndexByte, + "sync.runtime_Semacquire": ext۰sync۰runtime_Semacquire, + "sync.runtime_Semrelease": ext۰sync۰runtime_Semrelease, + "sync.runtime_Syncsemcheck": ext۰sync۰runtime_Syncsemcheck, + "sync.runtime_registerPoolCleanup": ext۰sync۰runtime_registerPoolCleanup, + "sync/atomic.AddInt32": ext۰atomic۰AddInt32, + "sync/atomic.AddUint32": ext۰atomic۰AddUint32, + "sync/atomic.AddUint64": ext۰atomic۰AddUint64, + "sync/atomic.CompareAndSwapInt32": ext۰atomic۰CompareAndSwapInt32, + "sync/atomic.LoadInt32": ext۰atomic۰LoadInt32, + "sync/atomic.LoadUint32": ext۰atomic۰LoadUint32, + "sync/atomic.StoreInt32": ext۰atomic۰StoreInt32, + "sync/atomic.StoreUint32": ext۰atomic۰StoreUint32, + "syscall.Close": ext۰syscall۰Close, + "syscall.Exit": ext۰syscall۰Exit, + "syscall.Fstat": ext۰syscall۰Fstat, + "syscall.Getpid": ext۰syscall۰Getpid, + "syscall.Getwd": ext۰syscall۰Getwd, + "syscall.Kill": ext۰syscall۰Kill, + "syscall.Lstat": ext۰syscall۰Lstat, + "syscall.Open": ext۰syscall۰Open, + "syscall.ParseDirent": ext۰syscall۰ParseDirent, + "syscall.RawSyscall": ext۰syscall۰RawSyscall, + "syscall.Read": ext۰syscall۰Read, + "syscall.ReadDirent": ext۰syscall۰ReadDirent, + "syscall.Stat": ext۰syscall۰Stat, + "syscall.Write": ext۰syscall۰Write, + "syscall.runtime_envs": ext۰runtime۰environ, + "testing.runExample": ext۰testing۰runExample, + "time.Sleep": ext۰time۰Sleep, + "time.now": ext۰time۰now, + } +} + +// wrapError returns an interpreted 'error' interface value for err. +func wrapError(err error) value { + if err == nil { + return iface{} + } + return iface{t: errorType, v: err.Error()} +} + +func ext۰sync۰Pool۰Get(fr *frame, args []value) value { + Pool := fr.i.prog.ImportedPackage("sync").Type("Pool").Object() + _, newIndex, _ := types.LookupFieldOrMethod(Pool.Type(), false, Pool.Pkg(), "New") + + if New := (*args[0].(*value)).(structure)[newIndex[0]]; New != nil { + return call(fr.i, fr, 0, New, nil) + } + return nil +} + +func ext۰sync۰Pool۰Put(fr *frame, args []value) value { + return nil +} + +func ext۰bytes۰Equal(fr *frame, args []value) value { + // func Equal(a, b []byte) bool + a := args[0].([]value) + b := args[1].([]value) + if len(a) != len(b) { + return false + } + for i := range a { + if a[i] != b[i] { + return false + } + } + return true +} + +func ext۰bytes۰IndexByte(fr *frame, args []value) value { + // func IndexByte(s []byte, c byte) int + s := args[0].([]value) + c := args[1].(byte) + for i, b := range s { + if b.(byte) == c { + return i + } + } + return -1 +} + +func ext۰crc32۰haveSSE42(fr *frame, args []value) value { + return false +} + +func ext۰math۰Float64frombits(fr *frame, args []value) value { + return math.Float64frombits(args[0].(uint64)) +} + +func ext۰math۰Float64bits(fr *frame, args []value) value { + return math.Float64bits(args[0].(float64)) +} + +func ext۰math۰Float32frombits(fr *frame, args []value) value { + return math.Float32frombits(args[0].(uint32)) +} + +func ext۰math۰Abs(fr *frame, args []value) value { + return math.Abs(args[0].(float64)) +} + +func ext۰math۰Exp(fr *frame, args []value) value { + return math.Exp(args[0].(float64)) +} + +func ext۰math۰Float32bits(fr *frame, args []value) value { + return math.Float32bits(args[0].(float32)) +} + +func ext۰math۰Min(fr *frame, args []value) value { + return math.Min(args[0].(float64), args[1].(float64)) +} + +func ext۰math۰hasSSE4(fr *frame, args []value) value { + return false +} + +func ext۰math۰Ldexp(fr *frame, args []value) value { + return math.Ldexp(args[0].(float64), args[1].(int)) +} + +func ext۰math۰Log(fr *frame, args []value) value { + return math.Log(args[0].(float64)) +} + +func ext۰os۰runtime_args(fr *frame, args []value) value { + return fr.i.osArgs +} + +func ext۰os۰runtime_beforeExit(fr *frame, args []value) value { + return nil +} + +func ext۰runtime۰Breakpoint(fr *frame, args []value) value { + runtime.Breakpoint() + return nil +} + +func ext۰runtime۰Caller(fr *frame, args []value) value { + // func Caller(skip int) (pc uintptr, file string, line int, ok bool) + skip := 1 + args[0].(int) + for i := 0; i < skip; i++ { + if fr != nil { + fr = fr.caller + } + } + var pc uintptr + var file string + var line int + var ok bool + if fr != nil { + fn := fr.fn + // TODO(adonovan): use pc/posn of current instruction, not start of fn. + // (Required to interpret the log package's tests.) + pc = uintptr(unsafe.Pointer(fn)) + posn := fn.Prog.Fset.Position(fn.Pos()) + file = posn.Filename + line = posn.Line + ok = true + } + return tuple{pc, file, line, ok} +} + +func ext۰runtime۰Callers(fr *frame, args []value) value { + // Callers(skip int, pc []uintptr) int + skip := args[0].(int) + pc := args[1].([]value) + for i := 0; i < skip; i++ { + if fr != nil { + fr = fr.caller + } + } + i := 0 + for fr != nil { + pc[i] = uintptr(unsafe.Pointer(fr.fn)) + i++ + fr = fr.caller + } + return i +} + +func ext۰runtime۰FuncForPC(fr *frame, args []value) value { + // FuncForPC(pc uintptr) *Func + pc := args[0].(uintptr) + var fn *ssa.Function + if pc != 0 { + fn = (*ssa.Function)(unsafe.Pointer(pc)) // indeed unsafe! + } + var Func value + Func = structure{fn} // a runtime.Func + return &Func +} + +func ext۰runtime۰environ(fr *frame, args []value) value { + // This function also implements syscall.runtime_envs. + return environ +} + +func ext۰runtime۰getgoroot(fr *frame, args []value) value { + return os.Getenv("GOROOT") +} + +func ext۰strings۰IndexByte(fr *frame, args []value) value { + // func IndexByte(s string, c byte) int + s := args[0].(string) + c := args[1].(byte) + for i := 0; i < len(s); i++ { + if s[i] == c { + return i + } + } + return -1 +} + +func ext۰strings۰Index(fr *frame, args []value) value { + // Call compiled version to avoid tricky asm dependency. + return strings.Index(args[0].(string), args[1].(string)) +} + +func ext۰sync۰runtime_Syncsemcheck(fr *frame, args []value) value { + // TODO(adonovan): fix: implement. + return nil +} + +func ext۰sync۰runtime_registerPoolCleanup(fr *frame, args []value) value { + return nil +} + +func ext۰sync۰runtime_Semacquire(fr *frame, args []value) value { + // TODO(adonovan): fix: implement. + return nil +} + +func ext۰sync۰runtime_Semrelease(fr *frame, args []value) value { + // TODO(adonovan): fix: implement. + return nil +} + +func ext۰runtime۰GOMAXPROCS(fr *frame, args []value) value { + // Ignore args[0]; don't let the interpreted program + // set the interpreter's GOMAXPROCS! + return runtime.GOMAXPROCS(0) +} + +func ext۰runtime۰Goexit(fr *frame, args []value) value { + // TODO(adonovan): don't kill the interpreter's main goroutine. + runtime.Goexit() + return nil +} + +func ext۰runtime۰GC(fr *frame, args []value) value { + runtime.GC() + return nil +} + +func ext۰runtime۰Gosched(fr *frame, args []value) value { + runtime.Gosched() + return nil +} + +func ext۰runtime۰init(fr *frame, args []value) value { + return nil +} + +func ext۰runtime۰NumCPU(fr *frame, args []value) value { + return runtime.NumCPU() +} + +func ext۰runtime۰ReadMemStats(fr *frame, args []value) value { + // TODO(adonovan): populate args[0].(Struct) + return nil +} + +func ext۰atomic۰LoadUint32(fr *frame, args []value) value { + // TODO(adonovan): fix: not atomic! + return (*args[0].(*value)).(uint32) +} + +func ext۰atomic۰StoreUint32(fr *frame, args []value) value { + // TODO(adonovan): fix: not atomic! + *args[0].(*value) = args[1].(uint32) + return nil +} + +func ext۰atomic۰LoadInt32(fr *frame, args []value) value { + // TODO(adonovan): fix: not atomic! + return (*args[0].(*value)).(int32) +} + +func ext۰atomic۰StoreInt32(fr *frame, args []value) value { + // TODO(adonovan): fix: not atomic! + *args[0].(*value) = args[1].(int32) + return nil +} + +func ext۰atomic۰CompareAndSwapInt32(fr *frame, args []value) value { + // TODO(adonovan): fix: not atomic! + p := args[0].(*value) + if (*p).(int32) == args[1].(int32) { + *p = args[2].(int32) + return true + } + return false +} + +func ext۰atomic۰AddInt32(fr *frame, args []value) value { + // TODO(adonovan): fix: not atomic! + p := args[0].(*value) + newv := (*p).(int32) + args[1].(int32) + *p = newv + return newv +} + +func ext۰atomic۰AddUint32(fr *frame, args []value) value { + // TODO(adonovan): fix: not atomic! + p := args[0].(*value) + newv := (*p).(uint32) + args[1].(uint32) + *p = newv + return newv +} + +func ext۰atomic۰AddUint64(fr *frame, args []value) value { + // TODO(adonovan): fix: not atomic! + p := args[0].(*value) + newv := (*p).(uint64) + args[1].(uint64) + *p = newv + return newv +} + +func ext۰runtime۰SetFinalizer(fr *frame, args []value) value { + return nil // ignore +} + +// Pretend: type runtime.Func struct { entry *ssa.Function } + +func ext۰runtime۰Func۰FileLine(fr *frame, args []value) value { + // func (*runtime.Func) FileLine(uintptr) (string, int) + f, _ := (*args[0].(*value)).(structure)[0].(*ssa.Function) + pc := args[1].(uintptr) + _ = pc + if f != nil { + // TODO(adonovan): use position of current instruction, not fn. + posn := f.Prog.Fset.Position(f.Pos()) + return tuple{posn.Filename, posn.Line} + } + return tuple{"", 0} +} + +func ext۰runtime۰Func۰Name(fr *frame, args []value) value { + // func (*runtime.Func) Name() string + f, _ := (*args[0].(*value)).(structure)[0].(*ssa.Function) + if f != nil { + return f.String() + } + return "" +} + +func ext۰runtime۰Func۰Entry(fr *frame, args []value) value { + // func (*runtime.Func) Entry() uintptr + f, _ := (*args[0].(*value)).(structure)[0].(*ssa.Function) + return uintptr(unsafe.Pointer(f)) +} + +// This is a workaround for a bug in go/ssa/testmain.go: it creates +// InternalExamples even for Example functions with no Output comment. +// TODO(adonovan): fix (and redesign) testmain.go after Go 1.6. +func ext۰testing۰runExample(fr *frame, args []value) value { + // This is a stripped down runExample that simply calls the function. + // It does not capture and compare output nor recover from panic. + // + // func runExample(eg testing.InternalExample) bool { + // eg.F() + // return true + // } + F := args[0].(structure)[1] + call(fr.i, fr, 0, F, nil) + return true +} + +func ext۰time۰now(fr *frame, args []value) value { + nano := time.Now().UnixNano() + return tuple{int64(nano / 1e9), int32(nano % 1e9)} +} + +func ext۰time۰Sleep(fr *frame, args []value) value { + time.Sleep(time.Duration(args[0].(int64))) + return nil +} + +func ext۰syscall۰Exit(fr *frame, args []value) value { + panic(exitPanic(args[0].(int))) +} + +func ext۰syscall۰Getwd(fr *frame, args []value) value { + s, err := syscall.Getwd() + return tuple{s, wrapError(err)} +} + +func ext۰syscall۰Getpid(fr *frame, args []value) value { + return syscall.Getpid() +} + +func valueToBytes(v value) []byte { + in := v.([]value) + b := make([]byte, len(in)) + for i := range in { + b[i] = in[i].(byte) + } + return b +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/external_darwin.go b/vendor/golang.org/x/tools/go/ssa/interp/external_darwin.go new file mode 100644 index 0000000000..4974ad6016 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/external_darwin.go @@ -0,0 +1,18 @@ +// 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 darwin + +package interp + +import "syscall" + +func init() { + externals["syscall.Sysctl"] = ext۰syscall۰Sysctl +} + +func ext۰syscall۰Sysctl(fr *frame, args []value) value { + r, err := syscall.Sysctl(args[0].(string)) + return tuple{r, wrapError(err)} +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/external_freebsd.go b/vendor/golang.org/x/tools/go/ssa/interp/external_freebsd.go new file mode 100644 index 0000000000..5203303823 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/external_freebsd.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. + +// +build freebsd + +package interp + +import "syscall" + +func init() { + externals["syscall.Sysctl"] = ext۰syscall۰Sysctl + externals["syscall.SysctlUint32"] = ext۰syscall۰SysctlUint32 +} + +func ext۰syscall۰Sysctl(fr *frame, args []value) value { + r, err := syscall.Sysctl(args[0].(string)) + return tuple{r, wrapError(err)} +} + +func ext۰syscall۰SysctlUint32(fr *frame, args []value) value { + r, err := syscall.SysctlUint32(args[0].(string)) + return tuple{r, wrapError(err)} +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/external_plan9.go b/vendor/golang.org/x/tools/go/ssa/interp/external_plan9.go new file mode 100644 index 0000000000..81bedcf021 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/external_plan9.go @@ -0,0 +1,50 @@ +// Copyright 2013 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 interp + +import "syscall" + +func ext۰os۰Pipe(fr *frame, args []value) value { + panic("os.Pipe not yet implemented") +} +func ext۰syscall۰Close(fr *frame, args []value) value { + panic("syscall.Close not yet implemented") +} +func ext۰syscall۰Fstat(fr *frame, args []value) value { + panic("syscall.Fstat not yet implemented") +} +func ext۰syscall۰Kill(fr *frame, args []value) value { + panic("syscall.Kill not yet implemented") +} +func ext۰syscall۰Lstat(fr *frame, args []value) value { + panic("syscall.Lstat not yet implemented") +} +func ext۰syscall۰Open(fr *frame, args []value) value { + panic("syscall.Open not yet implemented") +} +func ext۰syscall۰ParseDirent(fr *frame, args []value) value { + panic("syscall.ParseDirent not yet implemented") +} +func ext۰syscall۰Read(fr *frame, args []value) value { + panic("syscall.Read not yet implemented") +} +func ext۰syscall۰ReadDirent(fr *frame, args []value) value { + panic("syscall.ReadDirent not yet implemented") +} +func ext۰syscall۰Stat(fr *frame, args []value) value { + panic("syscall.Stat not yet implemented") +} +func ext۰syscall۰Write(fr *frame, args []value) value { + // func Write(fd int, p []byte) (n int, err error) + n, err := write(args[0].(int), valueToBytes(args[1])) + return tuple{n, wrapError(err)} +} +func ext۰syscall۰RawSyscall(fr *frame, args []value) value { + return tuple{^uintptr(0), uintptr(0), uintptr(0)} +} + +func syswrite(fd int, b []byte) (int, error) { + return syscall.Write(fd, b) +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/external_unix.go b/vendor/golang.org/x/tools/go/ssa/interp/external_unix.go new file mode 100644 index 0000000000..be125866c5 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/external_unix.go @@ -0,0 +1,148 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !windows,!plan9 + +package interp + +import "syscall" + +func ext۰os۰Pipe(fr *frame, args []value) value { + // func os.Pipe() (r *File, w *File, err error) + + // The portable POSIX pipe(2) call is good enough for our needs. + var p [2]int + if err := syscall.Pipe(p[:]); err != nil { + // TODO(adonovan): fix: return an *os.SyscallError. + return tuple{nil, nil, wrapError(err)} + } + + NewFile := fr.i.prog.ImportedPackage("os").Func("NewFile") + r := call(fr.i, fr, 0, NewFile, []value{uintptr(p[0]), "|0"}) + w := call(fr.i, fr, 0, NewFile, []value{uintptr(p[1]), "|1"}) + return tuple{r, w, wrapError(nil)} +} + +func fillStat(st *syscall.Stat_t, stat structure) { + stat[0] = st.Dev + stat[1] = st.Ino + stat[2] = st.Nlink + stat[3] = st.Mode + stat[4] = st.Uid + stat[5] = st.Gid + + stat[7] = st.Rdev + stat[8] = st.Size + stat[9] = st.Blksize + stat[10] = st.Blocks + // TODO(adonovan): fix: copy Timespecs. + // stat[11] = st.Atim + // stat[12] = st.Mtim + // stat[13] = st.Ctim +} + +func ext۰syscall۰Close(fr *frame, args []value) value { + // func Close(fd int) (err error) + return wrapError(syscall.Close(args[0].(int))) +} + +func ext۰syscall۰Fstat(fr *frame, args []value) value { + // func Fstat(fd int, stat *Stat_t) (err error) + fd := args[0].(int) + stat := (*args[1].(*value)).(structure) + + var st syscall.Stat_t + err := syscall.Fstat(fd, &st) + fillStat(&st, stat) + return wrapError(err) +} + +func ext۰syscall۰ReadDirent(fr *frame, args []value) value { + // func ReadDirent(fd int, buf []byte) (n int, err error) + fd := args[0].(int) + p := args[1].([]value) + b := make([]byte, len(p)) + n, err := syscall.ReadDirent(fd, b) + for i := 0; i < n; i++ { + p[i] = b[i] + } + return tuple{n, wrapError(err)} +} + +func ext۰syscall۰Kill(fr *frame, args []value) value { + // func Kill(pid int, sig Signal) (err error) + return wrapError(syscall.Kill(args[0].(int), syscall.Signal(args[1].(int)))) +} + +func ext۰syscall۰Lstat(fr *frame, args []value) value { + // func Lstat(name string, stat *Stat_t) (err error) + name := args[0].(string) + stat := (*args[1].(*value)).(structure) + + var st syscall.Stat_t + err := syscall.Lstat(name, &st) + fillStat(&st, stat) + return wrapError(err) +} + +func ext۰syscall۰Open(fr *frame, args []value) value { + // func Open(path string, mode int, perm uint32) (fd int, err error) { + path := args[0].(string) + mode := args[1].(int) + perm := args[2].(uint32) + fd, err := syscall.Open(path, mode, perm) + return tuple{fd, wrapError(err)} +} + +func ext۰syscall۰ParseDirent(fr *frame, args []value) value { + // func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) + max := args[1].(int) + var names []string + for _, iname := range args[2].([]value) { + names = append(names, iname.(string)) + } + consumed, count, newnames := syscall.ParseDirent(valueToBytes(args[0]), max, names) + var inewnames []value + for _, newname := range newnames { + inewnames = append(inewnames, newname) + } + return tuple{consumed, count, inewnames} +} + +func ext۰syscall۰Read(fr *frame, args []value) value { + // func Read(fd int, p []byte) (n int, err error) + fd := args[0].(int) + p := args[1].([]value) + b := make([]byte, len(p)) + n, err := syscall.Read(fd, b) + for i := 0; i < n; i++ { + p[i] = b[i] + } + return tuple{n, wrapError(err)} +} + +func ext۰syscall۰Stat(fr *frame, args []value) value { + // func Stat(name string, stat *Stat_t) (err error) + name := args[0].(string) + stat := (*args[1].(*value)).(structure) + + var st syscall.Stat_t + err := syscall.Stat(name, &st) + fillStat(&st, stat) + return wrapError(err) +} + +func ext۰syscall۰Write(fr *frame, args []value) value { + // func Write(fd int, p []byte) (n int, err error) + n, err := write(args[0].(int), valueToBytes(args[1])) + return tuple{n, wrapError(err)} +} + +func ext۰syscall۰RawSyscall(fr *frame, args []value) value { + return tuple{uintptr(0), uintptr(0), uintptr(syscall.ENOSYS)} +} + +func syswrite(fd int, b []byte) (int, error) { + return syscall.Write(fd, b) +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/external_windows.go b/vendor/golang.org/x/tools/go/ssa/interp/external_windows.go new file mode 100644 index 0000000000..24d1a876c7 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/external_windows.go @@ -0,0 +1,47 @@ +// Copyright 2013 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 interp + +import "syscall" + +func ext۰os۰Pipe(fr *frame, args []value) value { + panic("os.Pipe not yet implemented") +} +func ext۰syscall۰Close(fr *frame, args []value) value { + panic("syscall.Close not yet implemented") +} +func ext۰syscall۰Fstat(fr *frame, args []value) value { + panic("syscall.Fstat not yet implemented") +} +func ext۰syscall۰Kill(fr *frame, args []value) value { + panic("syscall.Kill not yet implemented") +} +func ext۰syscall۰Lstat(fr *frame, args []value) value { + panic("syscall.Lstat not yet implemented") +} +func ext۰syscall۰Open(fr *frame, args []value) value { + panic("syscall.Open not yet implemented") +} +func ext۰syscall۰ParseDirent(fr *frame, args []value) value { + panic("syscall.ParseDirent not yet implemented") +} +func ext۰syscall۰Read(fr *frame, args []value) value { + panic("syscall.Read not yet implemented") +} +func ext۰syscall۰ReadDirent(fr *frame, args []value) value { + panic("syscall.ReadDirent not yet implemented") +} +func ext۰syscall۰Stat(fr *frame, args []value) value { + panic("syscall.Stat not yet implemented") +} +func ext۰syscall۰Write(fr *frame, args []value) value { + panic("syscall.Write not yet implemented") +} +func ext۰syscall۰RawSyscall(fr *frame, args []value) value { + return tuple{uintptr(0), uintptr(0), uintptr(syscall.ENOSYS)} +} +func syswrite(fd int, b []byte) (int, error) { + panic("syswrite not yet implemented") +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/interp.go b/vendor/golang.org/x/tools/go/ssa/interp/interp.go new file mode 100644 index 0000000000..b855645f32 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/interp.go @@ -0,0 +1,752 @@ +// Copyright 2013 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.5 + +// Package ssa/interp defines an interpreter for the SSA +// representation of Go programs. +// +// This interpreter is provided as an adjunct for testing the SSA +// construction algorithm. Its purpose is to provide a minimal +// metacircular implementation of the dynamic semantics of each SSA +// instruction. It is not, and will never be, a production-quality Go +// interpreter. +// +// The following is a partial list of Go features that are currently +// unsupported or incomplete in the interpreter. +// +// * Unsafe operations, including all uses of unsafe.Pointer, are +// impossible to support given the "boxed" value representation we +// have chosen. +// +// * The reflect package is only partially implemented. +// +// * "sync/atomic" operations are not currently atomic due to the +// "boxed" value representation: it is not possible to read, modify +// and write an interface value atomically. As a consequence, Mutexes +// are currently broken. TODO(adonovan): provide a metacircular +// implementation of Mutex avoiding the broken atomic primitives. +// +// * recover is only partially implemented. Also, the interpreter +// makes no attempt to distinguish target panics from interpreter +// crashes. +// +// * map iteration is asymptotically inefficient. +// +// * the sizes of the int, uint and uintptr types in the target +// program are assumed to be the same as those of the interpreter +// itself. +// +// * all values occupy space, even those of types defined by the spec +// to have zero size, e.g. struct{}. This can cause asymptotic +// performance degradation. +// +// * os.Exit is implemented using panic, causing deferred functions to +// run. +package interp // import "golang.org/x/tools/go/ssa/interp" + +import ( + "fmt" + "go/token" + "go/types" + "os" + "reflect" + "runtime" + + "golang.org/x/tools/go/ssa" +) + +type continuation int + +const ( + kNext continuation = iota + kReturn + kJump +) + +// Mode is a bitmask of options affecting the interpreter. +type Mode uint + +const ( + DisableRecover Mode = 1 << iota // Disable recover() in target programs; show interpreter crash instead. + EnableTracing // Print a trace of all instructions as they are interpreted. +) + +type methodSet map[string]*ssa.Function + +// State shared between all interpreted goroutines. +type interpreter struct { + osArgs []value // the value of os.Args + prog *ssa.Program // the SSA program + globals map[ssa.Value]*value // addresses of global variables (immutable) + mode Mode // interpreter options + reflectPackage *ssa.Package // the fake reflect package + errorMethods methodSet // the method set of reflect.error, which implements the error interface. + rtypeMethods methodSet // the method set of rtype, which implements the reflect.Type interface. + runtimeErrorString types.Type // the runtime.errorString type + sizes types.Sizes // the effective type-sizing function +} + +type deferred struct { + fn value + args []value + instr *ssa.Defer + tail *deferred +} + +type frame struct { + i *interpreter + caller *frame + fn *ssa.Function + block, prevBlock *ssa.BasicBlock + env map[ssa.Value]value // dynamic values of SSA variables + locals []value + defers *deferred + result value + panicking bool + panic interface{} +} + +func (fr *frame) get(key ssa.Value) value { + switch key := key.(type) { + case nil: + // Hack; simplifies handling of optional attributes + // such as ssa.Slice.{Low,High}. + return nil + case *ssa.Function, *ssa.Builtin: + return key + case *ssa.Const: + return constValue(key) + case *ssa.Global: + if r, ok := fr.i.globals[key]; ok { + return r + } + } + if r, ok := fr.env[key]; ok { + return r + } + panic(fmt.Sprintf("get: no value for %T: %v", key, key.Name())) +} + +// runDefer runs a deferred call d. +// It always returns normally, but may set or clear fr.panic. +// +func (fr *frame) runDefer(d *deferred) { + if fr.i.mode&EnableTracing != 0 { + fmt.Fprintf(os.Stderr, "%s: invoking deferred function call\n", + fr.i.prog.Fset.Position(d.instr.Pos())) + } + var ok bool + defer func() { + if !ok { + // Deferred call created a new state of panic. + fr.panicking = true + fr.panic = recover() + } + }() + call(fr.i, fr, d.instr.Pos(), d.fn, d.args) + ok = true +} + +// runDefers executes fr's deferred function calls in LIFO order. +// +// On entry, fr.panicking indicates a state of panic; if +// true, fr.panic contains the panic value. +// +// On completion, if a deferred call started a panic, or if no +// deferred call recovered from a previous state of panic, then +// runDefers itself panics after the last deferred call has run. +// +// If there was no initial state of panic, or it was recovered from, +// runDefers returns normally. +// +func (fr *frame) runDefers() { + for d := fr.defers; d != nil; d = d.tail { + fr.runDefer(d) + } + fr.defers = nil + if fr.panicking { + panic(fr.panic) // new panic, or still panicking + } +} + +// lookupMethod returns the method set for type typ, which may be one +// of the interpreter's fake types. +func lookupMethod(i *interpreter, typ types.Type, meth *types.Func) *ssa.Function { + switch typ { + case rtypeType: + return i.rtypeMethods[meth.Id()] + case errorType: + return i.errorMethods[meth.Id()] + } + return i.prog.LookupMethod(typ, meth.Pkg(), meth.Name()) +} + +// visitInstr interprets a single ssa.Instruction within the activation +// record frame. It returns a continuation value indicating where to +// read the next instruction from. +func visitInstr(fr *frame, instr ssa.Instruction) continuation { + switch instr := instr.(type) { + case *ssa.DebugRef: + // no-op + + case *ssa.UnOp: + fr.env[instr] = unop(instr, fr.get(instr.X)) + + case *ssa.BinOp: + fr.env[instr] = binop(instr.Op, instr.X.Type(), fr.get(instr.X), fr.get(instr.Y)) + + case *ssa.Call: + fn, args := prepareCall(fr, &instr.Call) + fr.env[instr] = call(fr.i, fr, instr.Pos(), fn, args) + + case *ssa.ChangeInterface: + fr.env[instr] = fr.get(instr.X) + + case *ssa.ChangeType: + fr.env[instr] = fr.get(instr.X) // (can't fail) + + case *ssa.Convert: + fr.env[instr] = conv(instr.Type(), instr.X.Type(), fr.get(instr.X)) + + case *ssa.MakeInterface: + fr.env[instr] = iface{t: instr.X.Type(), v: fr.get(instr.X)} + + case *ssa.Extract: + fr.env[instr] = fr.get(instr.Tuple).(tuple)[instr.Index] + + case *ssa.Slice: + fr.env[instr] = slice(fr.get(instr.X), fr.get(instr.Low), fr.get(instr.High), fr.get(instr.Max)) + + case *ssa.Return: + switch len(instr.Results) { + case 0: + case 1: + fr.result = fr.get(instr.Results[0]) + default: + var res []value + for _, r := range instr.Results { + res = append(res, fr.get(r)) + } + fr.result = tuple(res) + } + fr.block = nil + return kReturn + + case *ssa.RunDefers: + fr.runDefers() + + case *ssa.Panic: + panic(targetPanic{fr.get(instr.X)}) + + case *ssa.Send: + fr.get(instr.Chan).(chan value) <- fr.get(instr.X) + + case *ssa.Store: + store(deref(instr.Addr.Type()), fr.get(instr.Addr).(*value), fr.get(instr.Val)) + + case *ssa.If: + succ := 1 + if fr.get(instr.Cond).(bool) { + succ = 0 + } + fr.prevBlock, fr.block = fr.block, fr.block.Succs[succ] + return kJump + + case *ssa.Jump: + fr.prevBlock, fr.block = fr.block, fr.block.Succs[0] + return kJump + + case *ssa.Defer: + fn, args := prepareCall(fr, &instr.Call) + fr.defers = &deferred{ + fn: fn, + args: args, + instr: instr, + tail: fr.defers, + } + + case *ssa.Go: + fn, args := prepareCall(fr, &instr.Call) + go call(fr.i, nil, instr.Pos(), fn, args) + + case *ssa.MakeChan: + fr.env[instr] = make(chan value, asInt(fr.get(instr.Size))) + + case *ssa.Alloc: + var addr *value + if instr.Heap { + // new + addr = new(value) + fr.env[instr] = addr + } else { + // local + addr = fr.env[instr].(*value) + } + *addr = zero(deref(instr.Type())) + + case *ssa.MakeSlice: + slice := make([]value, asInt(fr.get(instr.Cap))) + tElt := instr.Type().Underlying().(*types.Slice).Elem() + for i := range slice { + slice[i] = zero(tElt) + } + fr.env[instr] = slice[:asInt(fr.get(instr.Len))] + + case *ssa.MakeMap: + reserve := 0 + if instr.Reserve != nil { + reserve = asInt(fr.get(instr.Reserve)) + } + fr.env[instr] = makeMap(instr.Type().Underlying().(*types.Map).Key(), reserve) + + case *ssa.Range: + fr.env[instr] = rangeIter(fr.get(instr.X), instr.X.Type()) + + case *ssa.Next: + fr.env[instr] = fr.get(instr.Iter).(iter).next() + + case *ssa.FieldAddr: + x := fr.get(instr.X) + // FIXME wrong! &global.f must not change if we do *global = zero! + fr.env[instr] = &(*x.(*value)).(structure)[instr.Field] + + case *ssa.Field: + fr.env[instr] = fr.get(instr.X).(structure)[instr.Field] + + case *ssa.IndexAddr: + x := fr.get(instr.X) + idx := fr.get(instr.Index) + switch x := x.(type) { + case []value: + fr.env[instr] = &x[asInt(idx)] + case *value: // *array + fr.env[instr] = &(*x).(array)[asInt(idx)] + default: + panic(fmt.Sprintf("unexpected x type in IndexAddr: %T", x)) + } + + case *ssa.Index: + fr.env[instr] = fr.get(instr.X).(array)[asInt(fr.get(instr.Index))] + + case *ssa.Lookup: + fr.env[instr] = lookup(instr, fr.get(instr.X), fr.get(instr.Index)) + + case *ssa.MapUpdate: + m := fr.get(instr.Map) + key := fr.get(instr.Key) + v := fr.get(instr.Value) + switch m := m.(type) { + case map[value]value: + m[key] = v + case *hashmap: + m.insert(key.(hashable), v) + default: + panic(fmt.Sprintf("illegal map type: %T", m)) + } + + case *ssa.TypeAssert: + fr.env[instr] = typeAssert(fr.i, instr, fr.get(instr.X).(iface)) + + case *ssa.MakeClosure: + var bindings []value + for _, binding := range instr.Bindings { + bindings = append(bindings, fr.get(binding)) + } + fr.env[instr] = &closure{instr.Fn.(*ssa.Function), bindings} + + case *ssa.Phi: + for i, pred := range instr.Block().Preds { + if fr.prevBlock == pred { + fr.env[instr] = fr.get(instr.Edges[i]) + break + } + } + + case *ssa.Select: + var cases []reflect.SelectCase + if !instr.Blocking { + cases = append(cases, reflect.SelectCase{ + Dir: reflect.SelectDefault, + }) + } + for _, state := range instr.States { + var dir reflect.SelectDir + if state.Dir == types.RecvOnly { + dir = reflect.SelectRecv + } else { + dir = reflect.SelectSend + } + var send reflect.Value + if state.Send != nil { + send = reflect.ValueOf(fr.get(state.Send)) + } + cases = append(cases, reflect.SelectCase{ + Dir: dir, + Chan: reflect.ValueOf(fr.get(state.Chan)), + Send: send, + }) + } + chosen, recv, recvOk := reflect.Select(cases) + if !instr.Blocking { + chosen-- // default case should have index -1. + } + r := tuple{chosen, recvOk} + for i, st := range instr.States { + if st.Dir == types.RecvOnly { + var v value + if i == chosen && recvOk { + // No need to copy since send makes an unaliased copy. + v = recv.Interface().(value) + } else { + v = zero(st.Chan.Type().Underlying().(*types.Chan).Elem()) + } + r = append(r, v) + } + } + fr.env[instr] = r + + default: + panic(fmt.Sprintf("unexpected instruction: %T", instr)) + } + + // if val, ok := instr.(ssa.Value); ok { + // fmt.Println(toString(fr.env[val])) // debugging + // } + + return kNext +} + +// prepareCall determines the function value and argument values for a +// function call in a Call, Go or Defer instruction, performing +// interface method lookup if needed. +// +func prepareCall(fr *frame, call *ssa.CallCommon) (fn value, args []value) { + v := fr.get(call.Value) + if call.Method == nil { + // Function call. + fn = v + } else { + // Interface method invocation. + recv := v.(iface) + if recv.t == nil { + panic("method invoked on nil interface") + } + if f := lookupMethod(fr.i, recv.t, call.Method); f == nil { + // Unreachable in well-typed programs. + panic(fmt.Sprintf("method set for dynamic type %v does not contain %s", recv.t, call.Method)) + } else { + fn = f + } + args = append(args, recv.v) + } + for _, arg := range call.Args { + args = append(args, fr.get(arg)) + } + return +} + +// call interprets a call to a function (function, builtin or closure) +// fn with arguments args, returning its result. +// callpos is the position of the callsite. +// +func call(i *interpreter, caller *frame, callpos token.Pos, fn value, args []value) value { + switch fn := fn.(type) { + case *ssa.Function: + if fn == nil { + panic("call of nil function") // nil of func type + } + return callSSA(i, caller, callpos, fn, args, nil) + case *closure: + return callSSA(i, caller, callpos, fn.Fn, args, fn.Env) + case *ssa.Builtin: + return callBuiltin(caller, callpos, fn, args) + } + panic(fmt.Sprintf("cannot call %T", fn)) +} + +func loc(fset *token.FileSet, pos token.Pos) string { + if pos == token.NoPos { + return "" + } + return " at " + fset.Position(pos).String() +} + +// callSSA interprets a call to function fn with arguments args, +// and lexical environment env, returning its result. +// callpos is the position of the callsite. +// +func callSSA(i *interpreter, caller *frame, callpos token.Pos, fn *ssa.Function, args []value, env []value) value { + if i.mode&EnableTracing != 0 { + fset := fn.Prog.Fset + // TODO(adonovan): fix: loc() lies for external functions. + fmt.Fprintf(os.Stderr, "Entering %s%s.\n", fn, loc(fset, fn.Pos())) + suffix := "" + if caller != nil { + suffix = ", resuming " + caller.fn.String() + loc(fset, callpos) + } + defer fmt.Fprintf(os.Stderr, "Leaving %s%s.\n", fn, suffix) + } + fr := &frame{ + i: i, + caller: caller, // for panic/recover + fn: fn, + } + if fn.Parent() == nil { + name := fn.String() + if ext := externals[name]; ext != nil { + if i.mode&EnableTracing != 0 { + fmt.Fprintln(os.Stderr, "\t(external)") + } + return ext(fr, args) + } + if fn.Blocks == nil { + panic("no code for function: " + name) + } + } + fr.env = make(map[ssa.Value]value) + fr.block = fn.Blocks[0] + fr.locals = make([]value, len(fn.Locals)) + for i, l := range fn.Locals { + fr.locals[i] = zero(deref(l.Type())) + fr.env[l] = &fr.locals[i] + } + for i, p := range fn.Params { + fr.env[p] = args[i] + } + for i, fv := range fn.FreeVars { + fr.env[fv] = env[i] + } + for fr.block != nil { + runFrame(fr) + } + // Destroy the locals to avoid accidental use after return. + for i := range fn.Locals { + fr.locals[i] = bad{} + } + return fr.result +} + +// runFrame executes SSA instructions starting at fr.block and +// continuing until a return, a panic, or a recovered panic. +// +// After a panic, runFrame panics. +// +// After a normal return, fr.result contains the result of the call +// and fr.block is nil. +// +// A recovered panic in a function without named return parameters +// (NRPs) becomes a normal return of the zero value of the function's +// result type. +// +// After a recovered panic in a function with NRPs, fr.result is +// undefined and fr.block contains the block at which to resume +// control. +// +func runFrame(fr *frame) { + defer func() { + if fr.block == nil { + return // normal return + } + if fr.i.mode&DisableRecover != 0 { + return // let interpreter crash + } + fr.panicking = true + fr.panic = recover() + if fr.i.mode&EnableTracing != 0 { + fmt.Fprintf(os.Stderr, "Panicking: %T %v.\n", fr.panic, fr.panic) + } + fr.runDefers() + fr.block = fr.fn.Recover + }() + + for { + if fr.i.mode&EnableTracing != 0 { + fmt.Fprintf(os.Stderr, ".%s:\n", fr.block) + } + block: + for _, instr := range fr.block.Instrs { + if fr.i.mode&EnableTracing != 0 { + if v, ok := instr.(ssa.Value); ok { + fmt.Fprintln(os.Stderr, "\t", v.Name(), "=", instr) + } else { + fmt.Fprintln(os.Stderr, "\t", instr) + } + } + switch visitInstr(fr, instr) { + case kReturn: + return + case kNext: + // no-op + case kJump: + break block + } + } + } +} + +// doRecover implements the recover() built-in. +func doRecover(caller *frame) value { + // recover() must be exactly one level beneath the deferred + // function (two levels beneath the panicking function) to + // have any effect. Thus we ignore both "defer recover()" and + // "defer f() -> g() -> recover()". + if caller.i.mode&DisableRecover == 0 && + caller != nil && !caller.panicking && + caller.caller != nil && caller.caller.panicking { + caller.caller.panicking = false + p := caller.caller.panic + caller.caller.panic = nil + switch p := p.(type) { + case targetPanic: + // The target program explicitly called panic(). + return p.v + case runtime.Error: + // The interpreter encountered a runtime error. + return iface{caller.i.runtimeErrorString, p.Error()} + case string: + // The interpreter explicitly called panic(). + return iface{caller.i.runtimeErrorString, p} + default: + panic(fmt.Sprintf("unexpected panic type %T in target call to recover()", p)) + } + } + return iface{} +} + +// setGlobal sets the value of a system-initialized global variable. +func setGlobal(i *interpreter, pkg *ssa.Package, name string, v value) { + if g, ok := i.globals[pkg.Var(name)]; ok { + *g = v + return + } + panic("no global variable: " + pkg.Pkg.Path() + "." + name) +} + +var environ []value + +func init() { + for _, s := range os.Environ() { + environ = append(environ, s) + } + environ = append(environ, "GOSSAINTERP=1") + environ = append(environ, "GOARCH="+runtime.GOARCH) +} + +// deleteBodies delete the bodies of all standalone functions except the +// specified ones. A missing intrinsic leads to a clear runtime error. +func deleteBodies(pkg *ssa.Package, except ...string) { + keep := make(map[string]bool) + for _, e := range except { + keep[e] = true + } + for _, mem := range pkg.Members { + if fn, ok := mem.(*ssa.Function); ok && !keep[fn.Name()] { + fn.Blocks = nil + } + } +} + +// Interpret interprets the Go program whose main package is mainpkg. +// mode specifies various interpreter options. filename and args are +// the initial values of os.Args for the target program. sizes is the +// effective type-sizing function for this program. +// +// Interpret returns the exit code of the program: 2 for panic (like +// gc does), or the argument to os.Exit for normal termination. +// +// The SSA program must include the "runtime" package. +// +func Interpret(mainpkg *ssa.Package, mode Mode, sizes types.Sizes, filename string, args []string) (exitCode int) { + i := &interpreter{ + prog: mainpkg.Prog, + globals: make(map[ssa.Value]*value), + mode: mode, + sizes: sizes, + } + runtimePkg := i.prog.ImportedPackage("runtime") + if runtimePkg == nil { + panic("ssa.Program doesn't include runtime package") + } + i.runtimeErrorString = runtimePkg.Type("errorString").Object().Type() + + initReflect(i) + + i.osArgs = append(i.osArgs, filename) + for _, arg := range args { + i.osArgs = append(i.osArgs, arg) + } + + for _, pkg := range i.prog.AllPackages() { + // Initialize global storage. + for _, m := range pkg.Members { + switch v := m.(type) { + case *ssa.Global: + cell := zero(deref(v.Type())) + i.globals[v] = &cell + } + } + + // Ad-hoc initialization for magic system variables. + switch pkg.Pkg.Path() { + case "syscall": + setGlobal(i, pkg, "envs", environ) + + case "reflect": + deleteBodies(pkg, "DeepEqual", "deepValueEqual") + + case "runtime": + sz := sizes.Sizeof(pkg.Pkg.Scope().Lookup("MemStats").Type()) + setGlobal(i, pkg, "sizeof_C_MStats", uintptr(sz)) + deleteBodies(pkg, "GOROOT", "gogetenv") + } + } + + // Top-level error handler. + exitCode = 2 + defer func() { + if exitCode != 2 || i.mode&DisableRecover != 0 { + return + } + switch p := recover().(type) { + case exitPanic: + exitCode = int(p) + return + case targetPanic: + fmt.Fprintln(os.Stderr, "panic:", toString(p.v)) + case runtime.Error: + fmt.Fprintln(os.Stderr, "panic:", p.Error()) + case string: + fmt.Fprintln(os.Stderr, "panic:", p) + default: + fmt.Fprintf(os.Stderr, "panic: unexpected type: %T: %v\n", p, p) + } + + // TODO(adonovan): dump panicking interpreter goroutine? + // buf := make([]byte, 0x10000) + // runtime.Stack(buf, false) + // fmt.Fprintln(os.Stderr, string(buf)) + // (Or dump panicking target goroutine?) + }() + + // Run! + call(i, nil, token.NoPos, mainpkg.Func("init"), nil) + if mainFn := mainpkg.Func("main"); mainFn != nil { + call(i, nil, token.NoPos, mainFn, nil) + exitCode = 0 + } else { + fmt.Fprintln(os.Stderr, "No main function.") + exitCode = 1 + } + return +} + +// deref returns a pointer's element type; otherwise it returns typ. +// TODO(adonovan): Import from ssa? +func deref(typ types.Type) types.Type { + if p, ok := typ.Underlying().(*types.Pointer); ok { + return p.Elem() + } + return typ +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/interp14.go b/vendor/golang.org/x/tools/go/ssa/interp/interp14.go new file mode 100644 index 0000000000..dbd4dacd79 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/interp14.go @@ -0,0 +1,752 @@ +// Copyright 2013 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.5 + +// Package ssa/interp defines an interpreter for the SSA +// representation of Go programs. +// +// This interpreter is provided as an adjunct for testing the SSA +// construction algorithm. Its purpose is to provide a minimal +// metacircular implementation of the dynamic semantics of each SSA +// instruction. It is not, and will never be, a production-quality Go +// interpreter. +// +// The following is a partial list of Go features that are currently +// unsupported or incomplete in the interpreter. +// +// * Unsafe operations, including all uses of unsafe.Pointer, are +// impossible to support given the "boxed" value representation we +// have chosen. +// +// * The reflect package is only partially implemented. +// +// * "sync/atomic" operations are not currently atomic due to the +// "boxed" value representation: it is not possible to read, modify +// and write an interface value atomically. As a consequence, Mutexes +// are currently broken. TODO(adonovan): provide a metacircular +// implementation of Mutex avoiding the broken atomic primitives. +// +// * recover is only partially implemented. Also, the interpreter +// makes no attempt to distinguish target panics from interpreter +// crashes. +// +// * map iteration is asymptotically inefficient. +// +// * the sizes of the int, uint and uintptr types in the target +// program are assumed to be the same as those of the interpreter +// itself. +// +// * all values occupy space, even those of types defined by the spec +// to have zero size, e.g. struct{}. This can cause asymptotic +// performance degradation. +// +// * os.Exit is implemented using panic, causing deferred functions to +// run. +package interp // import "golang.org/x/tools/go/ssa/interp" + +import ( + "fmt" + "go/token" + "os" + "reflect" + "runtime" + + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types" +) + +type continuation int + +const ( + kNext continuation = iota + kReturn + kJump +) + +// Mode is a bitmask of options affecting the interpreter. +type Mode uint + +const ( + DisableRecover Mode = 1 << iota // Disable recover() in target programs; show interpreter crash instead. + EnableTracing // Print a trace of all instructions as they are interpreted. +) + +type methodSet map[string]*ssa.Function + +// State shared between all interpreted goroutines. +type interpreter struct { + osArgs []value // the value of os.Args + prog *ssa.Program // the SSA program + globals map[ssa.Value]*value // addresses of global variables (immutable) + mode Mode // interpreter options + reflectPackage *ssa.Package // the fake reflect package + errorMethods methodSet // the method set of reflect.error, which implements the error interface. + rtypeMethods methodSet // the method set of rtype, which implements the reflect.Type interface. + runtimeErrorString types.Type // the runtime.errorString type + sizes types.Sizes // the effective type-sizing function +} + +type deferred struct { + fn value + args []value + instr *ssa.Defer + tail *deferred +} + +type frame struct { + i *interpreter + caller *frame + fn *ssa.Function + block, prevBlock *ssa.BasicBlock + env map[ssa.Value]value // dynamic values of SSA variables + locals []value + defers *deferred + result value + panicking bool + panic interface{} +} + +func (fr *frame) get(key ssa.Value) value { + switch key := key.(type) { + case nil: + // Hack; simplifies handling of optional attributes + // such as ssa.Slice.{Low,High}. + return nil + case *ssa.Function, *ssa.Builtin: + return key + case *ssa.Const: + return constValue(key) + case *ssa.Global: + if r, ok := fr.i.globals[key]; ok { + return r + } + } + if r, ok := fr.env[key]; ok { + return r + } + panic(fmt.Sprintf("get: no value for %T: %v", key, key.Name())) +} + +// runDefer runs a deferred call d. +// It always returns normally, but may set or clear fr.panic. +// +func (fr *frame) runDefer(d *deferred) { + if fr.i.mode&EnableTracing != 0 { + fmt.Fprintf(os.Stderr, "%s: invoking deferred function call\n", + fr.i.prog.Fset.Position(d.instr.Pos())) + } + var ok bool + defer func() { + if !ok { + // Deferred call created a new state of panic. + fr.panicking = true + fr.panic = recover() + } + }() + call(fr.i, fr, d.instr.Pos(), d.fn, d.args) + ok = true +} + +// runDefers executes fr's deferred function calls in LIFO order. +// +// On entry, fr.panicking indicates a state of panic; if +// true, fr.panic contains the panic value. +// +// On completion, if a deferred call started a panic, or if no +// deferred call recovered from a previous state of panic, then +// runDefers itself panics after the last deferred call has run. +// +// If there was no initial state of panic, or it was recovered from, +// runDefers returns normally. +// +func (fr *frame) runDefers() { + for d := fr.defers; d != nil; d = d.tail { + fr.runDefer(d) + } + fr.defers = nil + if fr.panicking { + panic(fr.panic) // new panic, or still panicking + } +} + +// lookupMethod returns the method set for type typ, which may be one +// of the interpreter's fake types. +func lookupMethod(i *interpreter, typ types.Type, meth *types.Func) *ssa.Function { + switch typ { + case rtypeType: + return i.rtypeMethods[meth.Id()] + case errorType: + return i.errorMethods[meth.Id()] + } + return i.prog.LookupMethod(typ, meth.Pkg(), meth.Name()) +} + +// visitInstr interprets a single ssa.Instruction within the activation +// record frame. It returns a continuation value indicating where to +// read the next instruction from. +func visitInstr(fr *frame, instr ssa.Instruction) continuation { + switch instr := instr.(type) { + case *ssa.DebugRef: + // no-op + + case *ssa.UnOp: + fr.env[instr] = unop(instr, fr.get(instr.X)) + + case *ssa.BinOp: + fr.env[instr] = binop(instr.Op, instr.X.Type(), fr.get(instr.X), fr.get(instr.Y)) + + case *ssa.Call: + fn, args := prepareCall(fr, &instr.Call) + fr.env[instr] = call(fr.i, fr, instr.Pos(), fn, args) + + case *ssa.ChangeInterface: + fr.env[instr] = fr.get(instr.X) + + case *ssa.ChangeType: + fr.env[instr] = fr.get(instr.X) // (can't fail) + + case *ssa.Convert: + fr.env[instr] = conv(instr.Type(), instr.X.Type(), fr.get(instr.X)) + + case *ssa.MakeInterface: + fr.env[instr] = iface{t: instr.X.Type(), v: fr.get(instr.X)} + + case *ssa.Extract: + fr.env[instr] = fr.get(instr.Tuple).(tuple)[instr.Index] + + case *ssa.Slice: + fr.env[instr] = slice(fr.get(instr.X), fr.get(instr.Low), fr.get(instr.High), fr.get(instr.Max)) + + case *ssa.Return: + switch len(instr.Results) { + case 0: + case 1: + fr.result = fr.get(instr.Results[0]) + default: + var res []value + for _, r := range instr.Results { + res = append(res, fr.get(r)) + } + fr.result = tuple(res) + } + fr.block = nil + return kReturn + + case *ssa.RunDefers: + fr.runDefers() + + case *ssa.Panic: + panic(targetPanic{fr.get(instr.X)}) + + case *ssa.Send: + fr.get(instr.Chan).(chan value) <- fr.get(instr.X) + + case *ssa.Store: + store(deref(instr.Addr.Type()), fr.get(instr.Addr).(*value), fr.get(instr.Val)) + + case *ssa.If: + succ := 1 + if fr.get(instr.Cond).(bool) { + succ = 0 + } + fr.prevBlock, fr.block = fr.block, fr.block.Succs[succ] + return kJump + + case *ssa.Jump: + fr.prevBlock, fr.block = fr.block, fr.block.Succs[0] + return kJump + + case *ssa.Defer: + fn, args := prepareCall(fr, &instr.Call) + fr.defers = &deferred{ + fn: fn, + args: args, + instr: instr, + tail: fr.defers, + } + + case *ssa.Go: + fn, args := prepareCall(fr, &instr.Call) + go call(fr.i, nil, instr.Pos(), fn, args) + + case *ssa.MakeChan: + fr.env[instr] = make(chan value, asInt(fr.get(instr.Size))) + + case *ssa.Alloc: + var addr *value + if instr.Heap { + // new + addr = new(value) + fr.env[instr] = addr + } else { + // local + addr = fr.env[instr].(*value) + } + *addr = zero(deref(instr.Type())) + + case *ssa.MakeSlice: + slice := make([]value, asInt(fr.get(instr.Cap))) + tElt := instr.Type().Underlying().(*types.Slice).Elem() + for i := range slice { + slice[i] = zero(tElt) + } + fr.env[instr] = slice[:asInt(fr.get(instr.Len))] + + case *ssa.MakeMap: + reserve := 0 + if instr.Reserve != nil { + reserve = asInt(fr.get(instr.Reserve)) + } + fr.env[instr] = makeMap(instr.Type().Underlying().(*types.Map).Key(), reserve) + + case *ssa.Range: + fr.env[instr] = rangeIter(fr.get(instr.X), instr.X.Type()) + + case *ssa.Next: + fr.env[instr] = fr.get(instr.Iter).(iter).next() + + case *ssa.FieldAddr: + x := fr.get(instr.X) + // FIXME wrong! &global.f must not change if we do *global = zero! + fr.env[instr] = &(*x.(*value)).(structure)[instr.Field] + + case *ssa.Field: + fr.env[instr] = fr.get(instr.X).(structure)[instr.Field] + + case *ssa.IndexAddr: + x := fr.get(instr.X) + idx := fr.get(instr.Index) + switch x := x.(type) { + case []value: + fr.env[instr] = &x[asInt(idx)] + case *value: // *array + fr.env[instr] = &(*x).(array)[asInt(idx)] + default: + panic(fmt.Sprintf("unexpected x type in IndexAddr: %T", x)) + } + + case *ssa.Index: + fr.env[instr] = fr.get(instr.X).(array)[asInt(fr.get(instr.Index))] + + case *ssa.Lookup: + fr.env[instr] = lookup(instr, fr.get(instr.X), fr.get(instr.Index)) + + case *ssa.MapUpdate: + m := fr.get(instr.Map) + key := fr.get(instr.Key) + v := fr.get(instr.Value) + switch m := m.(type) { + case map[value]value: + m[key] = v + case *hashmap: + m.insert(key.(hashable), v) + default: + panic(fmt.Sprintf("illegal map type: %T", m)) + } + + case *ssa.TypeAssert: + fr.env[instr] = typeAssert(fr.i, instr, fr.get(instr.X).(iface)) + + case *ssa.MakeClosure: + var bindings []value + for _, binding := range instr.Bindings { + bindings = append(bindings, fr.get(binding)) + } + fr.env[instr] = &closure{instr.Fn.(*ssa.Function), bindings} + + case *ssa.Phi: + for i, pred := range instr.Block().Preds { + if fr.prevBlock == pred { + fr.env[instr] = fr.get(instr.Edges[i]) + break + } + } + + case *ssa.Select: + var cases []reflect.SelectCase + if !instr.Blocking { + cases = append(cases, reflect.SelectCase{ + Dir: reflect.SelectDefault, + }) + } + for _, state := range instr.States { + var dir reflect.SelectDir + if state.Dir == types.RecvOnly { + dir = reflect.SelectRecv + } else { + dir = reflect.SelectSend + } + var send reflect.Value + if state.Send != nil { + send = reflect.ValueOf(fr.get(state.Send)) + } + cases = append(cases, reflect.SelectCase{ + Dir: dir, + Chan: reflect.ValueOf(fr.get(state.Chan)), + Send: send, + }) + } + chosen, recv, recvOk := reflect.Select(cases) + if !instr.Blocking { + chosen-- // default case should have index -1. + } + r := tuple{chosen, recvOk} + for i, st := range instr.States { + if st.Dir == types.RecvOnly { + var v value + if i == chosen && recvOk { + // No need to copy since send makes an unaliased copy. + v = recv.Interface().(value) + } else { + v = zero(st.Chan.Type().Underlying().(*types.Chan).Elem()) + } + r = append(r, v) + } + } + fr.env[instr] = r + + default: + panic(fmt.Sprintf("unexpected instruction: %T", instr)) + } + + // if val, ok := instr.(ssa.Value); ok { + // fmt.Println(toString(fr.env[val])) // debugging + // } + + return kNext +} + +// prepareCall determines the function value and argument values for a +// function call in a Call, Go or Defer instruction, performing +// interface method lookup if needed. +// +func prepareCall(fr *frame, call *ssa.CallCommon) (fn value, args []value) { + v := fr.get(call.Value) + if call.Method == nil { + // Function call. + fn = v + } else { + // Interface method invocation. + recv := v.(iface) + if recv.t == nil { + panic("method invoked on nil interface") + } + if f := lookupMethod(fr.i, recv.t, call.Method); f == nil { + // Unreachable in well-typed programs. + panic(fmt.Sprintf("method set for dynamic type %v does not contain %s", recv.t, call.Method)) + } else { + fn = f + } + args = append(args, recv.v) + } + for _, arg := range call.Args { + args = append(args, fr.get(arg)) + } + return +} + +// call interprets a call to a function (function, builtin or closure) +// fn with arguments args, returning its result. +// callpos is the position of the callsite. +// +func call(i *interpreter, caller *frame, callpos token.Pos, fn value, args []value) value { + switch fn := fn.(type) { + case *ssa.Function: + if fn == nil { + panic("call of nil function") // nil of func type + } + return callSSA(i, caller, callpos, fn, args, nil) + case *closure: + return callSSA(i, caller, callpos, fn.Fn, args, fn.Env) + case *ssa.Builtin: + return callBuiltin(caller, callpos, fn, args) + } + panic(fmt.Sprintf("cannot call %T", fn)) +} + +func loc(fset *token.FileSet, pos token.Pos) string { + if pos == token.NoPos { + return "" + } + return " at " + fset.Position(pos).String() +} + +// callSSA interprets a call to function fn with arguments args, +// and lexical environment env, returning its result. +// callpos is the position of the callsite. +// +func callSSA(i *interpreter, caller *frame, callpos token.Pos, fn *ssa.Function, args []value, env []value) value { + if i.mode&EnableTracing != 0 { + fset := fn.Prog.Fset + // TODO(adonovan): fix: loc() lies for external functions. + fmt.Fprintf(os.Stderr, "Entering %s%s.\n", fn, loc(fset, fn.Pos())) + suffix := "" + if caller != nil { + suffix = ", resuming " + caller.fn.String() + loc(fset, callpos) + } + defer fmt.Fprintf(os.Stderr, "Leaving %s%s.\n", fn, suffix) + } + fr := &frame{ + i: i, + caller: caller, // for panic/recover + fn: fn, + } + if fn.Parent() == nil { + name := fn.String() + if ext := externals[name]; ext != nil { + if i.mode&EnableTracing != 0 { + fmt.Fprintln(os.Stderr, "\t(external)") + } + return ext(fr, args) + } + if fn.Blocks == nil { + panic("no code for function: " + name) + } + } + fr.env = make(map[ssa.Value]value) + fr.block = fn.Blocks[0] + fr.locals = make([]value, len(fn.Locals)) + for i, l := range fn.Locals { + fr.locals[i] = zero(deref(l.Type())) + fr.env[l] = &fr.locals[i] + } + for i, p := range fn.Params { + fr.env[p] = args[i] + } + for i, fv := range fn.FreeVars { + fr.env[fv] = env[i] + } + for fr.block != nil { + runFrame(fr) + } + // Destroy the locals to avoid accidental use after return. + for i := range fn.Locals { + fr.locals[i] = bad{} + } + return fr.result +} + +// runFrame executes SSA instructions starting at fr.block and +// continuing until a return, a panic, or a recovered panic. +// +// After a panic, runFrame panics. +// +// After a normal return, fr.result contains the result of the call +// and fr.block is nil. +// +// A recovered panic in a function without named return parameters +// (NRPs) becomes a normal return of the zero value of the function's +// result type. +// +// After a recovered panic in a function with NRPs, fr.result is +// undefined and fr.block contains the block at which to resume +// control. +// +func runFrame(fr *frame) { + defer func() { + if fr.block == nil { + return // normal return + } + if fr.i.mode&DisableRecover != 0 { + return // let interpreter crash + } + fr.panicking = true + fr.panic = recover() + if fr.i.mode&EnableTracing != 0 { + fmt.Fprintf(os.Stderr, "Panicking: %T %v.\n", fr.panic, fr.panic) + } + fr.runDefers() + fr.block = fr.fn.Recover + }() + + for { + if fr.i.mode&EnableTracing != 0 { + fmt.Fprintf(os.Stderr, ".%s:\n", fr.block) + } + block: + for _, instr := range fr.block.Instrs { + if fr.i.mode&EnableTracing != 0 { + if v, ok := instr.(ssa.Value); ok { + fmt.Fprintln(os.Stderr, "\t", v.Name(), "=", instr) + } else { + fmt.Fprintln(os.Stderr, "\t", instr) + } + } + switch visitInstr(fr, instr) { + case kReturn: + return + case kNext: + // no-op + case kJump: + break block + } + } + } +} + +// doRecover implements the recover() built-in. +func doRecover(caller *frame) value { + // recover() must be exactly one level beneath the deferred + // function (two levels beneath the panicking function) to + // have any effect. Thus we ignore both "defer recover()" and + // "defer f() -> g() -> recover()". + if caller.i.mode&DisableRecover == 0 && + caller != nil && !caller.panicking && + caller.caller != nil && caller.caller.panicking { + caller.caller.panicking = false + p := caller.caller.panic + caller.caller.panic = nil + switch p := p.(type) { + case targetPanic: + // The target program explicitly called panic(). + return p.v + case runtime.Error: + // The interpreter encountered a runtime error. + return iface{caller.i.runtimeErrorString, p.Error()} + case string: + // The interpreter explicitly called panic(). + return iface{caller.i.runtimeErrorString, p} + default: + panic(fmt.Sprintf("unexpected panic type %T in target call to recover()", p)) + } + } + return iface{} +} + +// setGlobal sets the value of a system-initialized global variable. +func setGlobal(i *interpreter, pkg *ssa.Package, name string, v value) { + if g, ok := i.globals[pkg.Var(name)]; ok { + *g = v + return + } + panic("no global variable: " + pkg.Pkg.Path() + "." + name) +} + +var environ []value + +func init() { + for _, s := range os.Environ() { + environ = append(environ, s) + } + environ = append(environ, "GOSSAINTERP=1") + environ = append(environ, "GOARCH="+runtime.GOARCH) +} + +// deleteBodies delete the bodies of all standalone functions except the +// specified ones. A missing intrinsic leads to a clear runtime error. +func deleteBodies(pkg *ssa.Package, except ...string) { + keep := make(map[string]bool) + for _, e := range except { + keep[e] = true + } + for _, mem := range pkg.Members { + if fn, ok := mem.(*ssa.Function); ok && !keep[fn.Name()] { + fn.Blocks = nil + } + } +} + +// Interpret interprets the Go program whose main package is mainpkg. +// mode specifies various interpreter options. filename and args are +// the initial values of os.Args for the target program. sizes is the +// effective type-sizing function for this program. +// +// Interpret returns the exit code of the program: 2 for panic (like +// gc does), or the argument to os.Exit for normal termination. +// +// The SSA program must include the "runtime" package. +// +func Interpret(mainpkg *ssa.Package, mode Mode, sizes types.Sizes, filename string, args []string) (exitCode int) { + i := &interpreter{ + prog: mainpkg.Prog, + globals: make(map[ssa.Value]*value), + mode: mode, + sizes: sizes, + } + runtimePkg := i.prog.ImportedPackage("runtime") + if runtimePkg == nil { + panic("ssa.Program doesn't include runtime package") + } + i.runtimeErrorString = runtimePkg.Type("errorString").Object().Type() + + initReflect(i) + + i.osArgs = append(i.osArgs, filename) + for _, arg := range args { + i.osArgs = append(i.osArgs, arg) + } + + for _, pkg := range i.prog.AllPackages() { + // Initialize global storage. + for _, m := range pkg.Members { + switch v := m.(type) { + case *ssa.Global: + cell := zero(deref(v.Type())) + i.globals[v] = &cell + } + } + + // Ad-hoc initialization for magic system variables. + switch pkg.Pkg.Path() { + case "syscall": + setGlobal(i, pkg, "envs", environ) + + case "reflect": + deleteBodies(pkg, "DeepEqual", "deepValueEqual") + + case "runtime": + sz := sizes.Sizeof(pkg.Pkg.Scope().Lookup("MemStats").Type()) + setGlobal(i, pkg, "sizeof_C_MStats", uintptr(sz)) + deleteBodies(pkg, "GOROOT", "gogetenv") + } + } + + // Top-level error handler. + exitCode = 2 + defer func() { + if exitCode != 2 || i.mode&DisableRecover != 0 { + return + } + switch p := recover().(type) { + case exitPanic: + exitCode = int(p) + return + case targetPanic: + fmt.Fprintln(os.Stderr, "panic:", toString(p.v)) + case runtime.Error: + fmt.Fprintln(os.Stderr, "panic:", p.Error()) + case string: + fmt.Fprintln(os.Stderr, "panic:", p) + default: + fmt.Fprintf(os.Stderr, "panic: unexpected type: %T: %v\n", p, p) + } + + // TODO(adonovan): dump panicking interpreter goroutine? + // buf := make([]byte, 0x10000) + // runtime.Stack(buf, false) + // fmt.Fprintln(os.Stderr, string(buf)) + // (Or dump panicking target goroutine?) + }() + + // Run! + call(i, nil, token.NoPos, mainpkg.Func("init"), nil) + if mainFn := mainpkg.Func("main"); mainFn != nil { + call(i, nil, token.NoPos, mainFn, nil) + exitCode = 0 + } else { + fmt.Fprintln(os.Stderr, "No main function.") + exitCode = 1 + } + return +} + +// deref returns a pointer's element type; otherwise it returns typ. +// TODO(adonovan): Import from ssa? +func deref(typ types.Type) types.Type { + if p, ok := typ.Underlying().(*types.Pointer); ok { + return p.Elem() + } + return typ +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/interp14_test.go b/vendor/golang.org/x/tools/go/ssa/interp/interp14_test.go new file mode 100644 index 0000000000..63c3f5301d --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/interp14_test.go @@ -0,0 +1,367 @@ +// Copyright 2013 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.5 + +// +build !android,!windows,!plan9 + +package interp_test + +import ( + "bytes" + "fmt" + "go/build" + "os" + "path/filepath" + "strings" + "testing" + "time" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/interp" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/go/types" +) + +// Each line contains a space-separated list of $GOROOT/test/ +// filenames comprising the main package of a program. +// They are ordered quickest-first, roughly. +// +// TODO(adonovan): integrate into the $GOROOT/test driver scripts, +// golden file checking, etc. +var gorootTestTests = []string{ + "235.go", + "alias1.go", + "chancap.go", + "func5.go", + "func6.go", + "func7.go", + "func8.go", + "helloworld.go", + "varinit.go", + "escape3.go", + "initcomma.go", + "cmp.go", + "compos.go", + "turing.go", + "indirect.go", + // "complit.go", // tests go1.5 features + "for.go", + "struct0.go", + "intcvt.go", + "printbig.go", + "deferprint.go", + "escape.go", + "range.go", + "const4.go", + "float_lit.go", + "bigalg.go", + "decl.go", + "if.go", + "named.go", + "bigmap.go", + "func.go", + "reorder2.go", + "closure.go", + "gc.go", + "simassign.go", + "iota.go", + "nilptr2.go", + "goprint.go", // doesn't actually assert anything (cmpout) + "utf.go", + "method.go", + "char_lit.go", + "env.go", + "int_lit.go", + "string_lit.go", + "defer.go", + "typeswitch.go", + "stringrange.go", + "reorder.go", + "method3.go", + "literal.go", + "nul1.go", // doesn't actually assert anything (errorcheckoutput) + "zerodivide.go", + "convert.go", + "convT2X.go", + "switch.go", + "initialize.go", + "ddd.go", + "blank.go", // partly disabled + "map.go", + "closedchan.go", + "divide.go", + "rename.go", + "const3.go", + "nil.go", + "recover.go", // reflection parts disabled + "recover1.go", + "recover2.go", + "recover3.go", + "typeswitch1.go", + "floatcmp.go", + "crlf.go", // doesn't actually assert anything (runoutput) + // Slow tests follow. + "bom.go", // ~1.7s + "gc1.go", // ~1.7s + "cmplxdivide.go cmplxdivide1.go", // ~2.4s + + // Working, but not worth enabling: + // "append.go", // works, but slow (15s). + // "gc2.go", // works, but slow, and cheats on the memory check. + // "sigchld.go", // works, but only on POSIX. + // "peano.go", // works only up to n=9, and slow even then. + // "stack.go", // works, but too slow (~30s) by default. + // "solitaire.go", // works, but too slow (~30s). + // "const.go", // works but for but one bug: constant folder doesn't consider representations. + // "init1.go", // too slow (80s) and not that interesting. Cheats on ReadMemStats check too. + // "rotate.go rotate0.go", // emits source for a test + // "rotate.go rotate1.go", // emits source for a test + // "rotate.go rotate2.go", // emits source for a test + // "rotate.go rotate3.go", // emits source for a test + // "64bit.go", // emits source for a test + // "run.go", // test driver, not a test. + + // Broken. TODO(adonovan): fix. + // copy.go // very slow; but with N=4 quickly crashes, slice index out of range. + // nilptr.go // interp: V > uintptr not implemented. Slow test, lots of mem + // args.go // works, but requires specific os.Args from the driver. + // index.go // a template, not a real test. + // mallocfin.go // SetFinalizer not implemented. + + // TODO(adonovan): add tests from $GOROOT/test/* subtrees: + // bench chan bugs fixedbugs interface ken. +} + +// These are files in go.tools/go/ssa/interp/testdata/. +var testdataTests = []string{ + "boundmeth.go", + // "complit.go", // requires go1.5 + "coverage.go", + "defer.go", + "fieldprom.go", + "ifaceconv.go", + "ifaceprom.go", + "initorder.go", + "methprom.go", + "mrvchain.go", + "range.go", + "recover.go", + "reflect.go", + "static.go", + "callstack.go", +} + +// These are files and packages in $GOROOT/src/. +var gorootSrcTests = []string{ + "encoding/ascii85", + "encoding/hex", + // "encoding/pem", // TODO(adonovan): implement (reflect.Value).SetString + // "testing", // TODO(adonovan): implement runtime.Goexit correctly + // "hash/crc32", // TODO(adonovan): implement hash/crc32.haveCLMUL + // "log", // TODO(adonovan): implement runtime.Callers correctly + + // Too slow: + // "container/ring", + // "hash/adler32", + + "unicode/utf8", + "path", + "flag", + "encoding/csv", + "text/scanner", + "unicode", +} + +type successPredicate func(exitcode int, output string) error + +func run(t *testing.T, dir, input string, success successPredicate) bool { + fmt.Printf("Input: %s\n", input) + + start := time.Now() + + var inputs []string + for _, i := range strings.Split(input, " ") { + if strings.HasSuffix(i, ".go") { + i = dir + i + } + inputs = append(inputs, i) + } + + var conf loader.Config + if _, err := conf.FromArgs(inputs, true); err != nil { + t.Errorf("FromArgs(%s) failed: %s", inputs, err) + return false + } + + conf.Import("runtime") + + // Print a helpful hint if we don't make it to the end. + var hint string + defer func() { + if hint != "" { + fmt.Println("FAIL") + fmt.Println(hint) + } else { + fmt.Println("PASS") + } + + interp.CapturedOutput = nil + }() + + hint = fmt.Sprintf("To dump SSA representation, run:\n%% go build golang.org/x/tools/cmd/ssadump && ./ssadump -test -build=CFP %s\n", input) + + iprog, err := conf.Load() + if err != nil { + t.Errorf("conf.Load(%s) failed: %s", inputs, err) + return false + } + + prog := ssautil.CreateProgram(iprog, ssa.SanityCheckFunctions) + prog.Build() + + var mainPkg *ssa.Package + var initialPkgs []*ssa.Package + for _, info := range iprog.InitialPackages() { + if info.Pkg.Path() == "runtime" { + continue // not an initial package + } + p := prog.Package(info.Pkg) + initialPkgs = append(initialPkgs, p) + if mainPkg == nil && p.Func("main") != nil { + mainPkg = p + } + } + if mainPkg == nil { + testmainPkg := prog.CreateTestMainPackage(initialPkgs...) + if testmainPkg == nil { + t.Errorf("CreateTestMainPackage(%s) returned nil", mainPkg) + return false + } + if testmainPkg.Func("main") == nil { + t.Errorf("synthetic testmain package has no main") + return false + } + mainPkg = testmainPkg + } + + var out bytes.Buffer + interp.CapturedOutput = &out + + hint = fmt.Sprintf("To trace execution, run:\n%% go build golang.org/x/tools/cmd/ssadump && ./ssadump -build=C -run --interp=T %s\n", input) + exitCode := interp.Interpret(mainPkg, 0, &types.StdSizes{8, 8}, inputs[0], []string{}) + + // The definition of success varies with each file. + if err := success(exitCode, out.String()); err != nil { + t.Errorf("interp.Interpret(%s) failed: %s", inputs, err) + return false + } + + hint = "" // call off the hounds + + if false { + fmt.Println(input, time.Since(start)) // test profiling + } + + return true +} + +const slash = string(os.PathSeparator) + +func printFailures(failures []string) { + if failures != nil { + fmt.Println("The following tests failed:") + for _, f := range failures { + fmt.Printf("\t%s\n", f) + } + } +} + +func success(exitcode int, output string) error { + if exitcode != 0 { + return fmt.Errorf("exit code was %d", exitcode) + } + if strings.Contains(output, "BUG") { + return fmt.Errorf("exited zero but output contained 'BUG'") + } + return nil +} + +// TestTestdataFiles runs the interpreter on testdata/*.go. +func TestTestdataFiles(t *testing.T) { + var failures []string + start := time.Now() + for _, input := range testdataTests { + if testing.Short() && time.Since(start) > 30*time.Second { + printFailures(failures) + t.Skipf("timeout - aborting test") + } + if !run(t, "testdata"+slash, input, success) { + failures = append(failures, input) + } + } + printFailures(failures) +} + +// TestGorootTest runs the interpreter on $GOROOT/test/*.go. +func TestGorootTest(t *testing.T) { + if testing.Short() { + t.Skip() // too slow (~30s) + } + + var failures []string + + for _, input := range gorootTestTests { + if !run(t, filepath.Join(build.Default.GOROOT, "test")+slash, input, success) { + failures = append(failures, input) + } + } + for _, input := range gorootSrcTests { + if !run(t, filepath.Join(build.Default.GOROOT, "src")+slash, input, success) { + failures = append(failures, input) + } + } + printFailures(failures) +} + +// TestTestmainPackage runs the interpreter on a synthetic "testmain" package. +func TestTestmainPackage(t *testing.T) { + if testing.Short() { + t.Skip() // too slow on some platforms + } + + success := func(exitcode int, output string) error { + if exitcode == 0 { + return fmt.Errorf("unexpected success") + } + if !strings.Contains(output, "FAIL: TestFoo") { + return fmt.Errorf("missing failure log for TestFoo") + } + if !strings.Contains(output, "FAIL: TestBar") { + return fmt.Errorf("missing failure log for TestBar") + } + // TODO(adonovan): test benchmarks too + return nil + } + run(t, "testdata"+slash, "a_test.go", success) +} + +// CreateTestMainPackage should return nil if there were no tests. +func TestNullTestmainPackage(t *testing.T) { + var conf loader.Config + conf.CreateFromFilenames("", "testdata/b_test.go") + iprog, err := conf.Load() + if err != nil { + t.Fatalf("CreatePackages failed: %s", err) + } + prog := ssautil.CreateProgram(iprog, ssa.SanityCheckFunctions) + mainPkg := prog.Package(iprog.Created[0].Pkg) + if mainPkg.Func("main") != nil { + t.Fatalf("unexpected main function") + } + if prog.CreateTestMainPackage(mainPkg) != nil { + t.Fatalf("CreateTestMainPackage returned non-nil") + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/interp_test.go b/vendor/golang.org/x/tools/go/ssa/interp/interp_test.go new file mode 100644 index 0000000000..70c2f400d4 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/interp_test.go @@ -0,0 +1,367 @@ +// Copyright 2013 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.5 + +// +build !android,!windows,!plan9 + +package interp_test + +import ( + "bytes" + "fmt" + "go/build" + "go/types" + "os" + "path/filepath" + "strings" + "testing" + "time" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/interp" + "golang.org/x/tools/go/ssa/ssautil" +) + +// Each line contains a space-separated list of $GOROOT/test/ +// filenames comprising the main package of a program. +// They are ordered quickest-first, roughly. +// +// TODO(adonovan): integrate into the $GOROOT/test driver scripts, +// golden file checking, etc. +var gorootTestTests = []string{ + "235.go", + "alias1.go", + "chancap.go", + "func5.go", + "func6.go", + "func7.go", + "func8.go", + "helloworld.go", + "varinit.go", + "escape3.go", + "initcomma.go", + "cmp.go", + "compos.go", + "turing.go", + "indirect.go", + "complit.go", + "for.go", + "struct0.go", + "intcvt.go", + "printbig.go", + "deferprint.go", + "escape.go", + "range.go", + "const4.go", + "float_lit.go", + "bigalg.go", + "decl.go", + "if.go", + "named.go", + "bigmap.go", + "func.go", + "reorder2.go", + "closure.go", + "gc.go", + "simassign.go", + "iota.go", + "nilptr2.go", + "goprint.go", // doesn't actually assert anything (cmpout) + "utf.go", + "method.go", + "char_lit.go", + "env.go", + "int_lit.go", + "string_lit.go", + "defer.go", + "typeswitch.go", + "stringrange.go", + "reorder.go", + "method3.go", + "literal.go", + "nul1.go", // doesn't actually assert anything (errorcheckoutput) + "zerodivide.go", + "convert.go", + "convT2X.go", + "switch.go", + "initialize.go", + "ddd.go", + "blank.go", // partly disabled + "map.go", + "closedchan.go", + "divide.go", + "rename.go", + "const3.go", + "nil.go", + "recover.go", // reflection parts disabled + "recover1.go", + "recover2.go", + "recover3.go", + "typeswitch1.go", + "floatcmp.go", + "crlf.go", // doesn't actually assert anything (runoutput) + // Slow tests follow. + "bom.go", // ~1.7s + "gc1.go", // ~1.7s + "cmplxdivide.go cmplxdivide1.go", // ~2.4s + + // Working, but not worth enabling: + // "append.go", // works, but slow (15s). + // "gc2.go", // works, but slow, and cheats on the memory check. + // "sigchld.go", // works, but only on POSIX. + // "peano.go", // works only up to n=9, and slow even then. + // "stack.go", // works, but too slow (~30s) by default. + // "solitaire.go", // works, but too slow (~30s). + // "const.go", // works but for but one bug: constant folder doesn't consider representations. + // "init1.go", // too slow (80s) and not that interesting. Cheats on ReadMemStats check too. + // "rotate.go rotate0.go", // emits source for a test + // "rotate.go rotate1.go", // emits source for a test + // "rotate.go rotate2.go", // emits source for a test + // "rotate.go rotate3.go", // emits source for a test + // "64bit.go", // emits source for a test + // "run.go", // test driver, not a test. + + // Broken. TODO(adonovan): fix. + // copy.go // very slow; but with N=4 quickly crashes, slice index out of range. + // nilptr.go // interp: V > uintptr not implemented. Slow test, lots of mem + // args.go // works, but requires specific os.Args from the driver. + // index.go // a template, not a real test. + // mallocfin.go // SetFinalizer not implemented. + + // TODO(adonovan): add tests from $GOROOT/test/* subtrees: + // bench chan bugs fixedbugs interface ken. +} + +// These are files in go.tools/go/ssa/interp/testdata/. +var testdataTests = []string{ + "boundmeth.go", + "complit.go", + "coverage.go", + "defer.go", + "fieldprom.go", + "ifaceconv.go", + "ifaceprom.go", + "initorder.go", + "methprom.go", + "mrvchain.go", + "range.go", + "recover.go", + "reflect.go", + "static.go", + "callstack.go", +} + +// These are files and packages in $GOROOT/src/. +var gorootSrcTests = []string{ + "encoding/ascii85", + "encoding/hex", + // "encoding/pem", // TODO(adonovan): implement (reflect.Value).SetString + // "testing", // TODO(adonovan): implement runtime.Goexit correctly + // "hash/crc32", // TODO(adonovan): implement hash/crc32.haveCLMUL + // "log", // TODO(adonovan): implement runtime.Callers correctly + + // Too slow: + // "container/ring", + // "hash/adler32", + + "unicode/utf8", + "path", + "flag", + "encoding/csv", + "text/scanner", + "unicode", +} + +type successPredicate func(exitcode int, output string) error + +func run(t *testing.T, dir, input string, success successPredicate) bool { + fmt.Printf("Input: %s\n", input) + + start := time.Now() + + var inputs []string + for _, i := range strings.Split(input, " ") { + if strings.HasSuffix(i, ".go") { + i = dir + i + } + inputs = append(inputs, i) + } + + var conf loader.Config + if _, err := conf.FromArgs(inputs, true); err != nil { + t.Errorf("FromArgs(%s) failed: %s", inputs, err) + return false + } + + conf.Import("runtime") + + // Print a helpful hint if we don't make it to the end. + var hint string + defer func() { + if hint != "" { + fmt.Println("FAIL") + fmt.Println(hint) + } else { + fmt.Println("PASS") + } + + interp.CapturedOutput = nil + }() + + hint = fmt.Sprintf("To dump SSA representation, run:\n%% go build golang.org/x/tools/cmd/ssadump && ./ssadump -test -build=CFP %s\n", input) + + iprog, err := conf.Load() + if err != nil { + t.Errorf("conf.Load(%s) failed: %s", inputs, err) + return false + } + + prog := ssautil.CreateProgram(iprog, ssa.SanityCheckFunctions) + prog.Build() + + var mainPkg *ssa.Package + var initialPkgs []*ssa.Package + for _, info := range iprog.InitialPackages() { + if info.Pkg.Path() == "runtime" { + continue // not an initial package + } + p := prog.Package(info.Pkg) + initialPkgs = append(initialPkgs, p) + if mainPkg == nil && p.Func("main") != nil { + mainPkg = p + } + } + if mainPkg == nil { + testmainPkg := prog.CreateTestMainPackage(initialPkgs...) + if testmainPkg == nil { + t.Errorf("CreateTestMainPackage(%s) returned nil", mainPkg) + return false + } + if testmainPkg.Func("main") == nil { + t.Errorf("synthetic testmain package has no main") + return false + } + mainPkg = testmainPkg + } + + var out bytes.Buffer + interp.CapturedOutput = &out + + hint = fmt.Sprintf("To trace execution, run:\n%% go build golang.org/x/tools/cmd/ssadump && ./ssadump -build=C -run --interp=T %s\n", input) + exitCode := interp.Interpret(mainPkg, 0, &types.StdSizes{WordSize: 8, MaxAlign: 8}, inputs[0], []string{}) + + // The definition of success varies with each file. + if err := success(exitCode, out.String()); err != nil { + t.Errorf("interp.Interpret(%s) failed: %s", inputs, err) + return false + } + + hint = "" // call off the hounds + + if false { + fmt.Println(input, time.Since(start)) // test profiling + } + + return true +} + +const slash = string(os.PathSeparator) + +func printFailures(failures []string) { + if failures != nil { + fmt.Println("The following tests failed:") + for _, f := range failures { + fmt.Printf("\t%s\n", f) + } + } +} + +func success(exitcode int, output string) error { + if exitcode != 0 { + return fmt.Errorf("exit code was %d", exitcode) + } + if strings.Contains(output, "BUG") { + return fmt.Errorf("exited zero but output contained 'BUG'") + } + return nil +} + +// TestTestdataFiles runs the interpreter on testdata/*.go. +func TestTestdataFiles(t *testing.T) { + var failures []string + start := time.Now() + for _, input := range testdataTests { + if testing.Short() && time.Since(start) > 30*time.Second { + printFailures(failures) + t.Skipf("timeout - aborting test") + } + if !run(t, "testdata"+slash, input, success) { + failures = append(failures, input) + } + } + printFailures(failures) +} + +// TestGorootTest runs the interpreter on $GOROOT/test/*.go. +func TestGorootTest(t *testing.T) { + if testing.Short() { + t.Skip() // too slow (~30s) + } + + var failures []string + + for _, input := range gorootTestTests { + if !run(t, filepath.Join(build.Default.GOROOT, "test")+slash, input, success) { + failures = append(failures, input) + } + } + for _, input := range gorootSrcTests { + if !run(t, filepath.Join(build.Default.GOROOT, "src")+slash, input, success) { + failures = append(failures, input) + } + } + printFailures(failures) +} + +// TestTestmainPackage runs the interpreter on a synthetic "testmain" package. +func TestTestmainPackage(t *testing.T) { + if testing.Short() { + t.Skip() // too slow on some platforms + } + + success := func(exitcode int, output string) error { + if exitcode == 0 { + return fmt.Errorf("unexpected success") + } + if !strings.Contains(output, "FAIL: TestFoo") { + return fmt.Errorf("missing failure log for TestFoo") + } + if !strings.Contains(output, "FAIL: TestBar") { + return fmt.Errorf("missing failure log for TestBar") + } + // TODO(adonovan): test benchmarks too + return nil + } + run(t, "testdata"+slash, "a_test.go", success) +} + +// CreateTestMainPackage should return nil if there were no tests. +func TestNullTestmainPackage(t *testing.T) { + var conf loader.Config + conf.CreateFromFilenames("", "testdata/b_test.go") + iprog, err := conf.Load() + if err != nil { + t.Fatalf("CreatePackages failed: %s", err) + } + prog := ssautil.CreateProgram(iprog, ssa.SanityCheckFunctions) + mainPkg := prog.Package(iprog.Created[0].Pkg) + if mainPkg.Func("main") != nil { + t.Fatalf("unexpected main function") + } + if prog.CreateTestMainPackage(mainPkg) != nil { + t.Fatalf("CreateTestMainPackage returned non-nil") + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/map.go b/vendor/golang.org/x/tools/go/ssa/interp/map.go new file mode 100644 index 0000000000..4c092b3e06 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/map.go @@ -0,0 +1,115 @@ +// Copyright 2013 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.5 + +package interp + +// Custom hashtable atop map. +// For use when the key's equivalence relation is not consistent with ==. + +// The Go specification doesn't address the atomicity of map operations. +// The FAQ states that an implementation is permitted to crash on +// concurrent map access. + +import ( + "go/types" +) + +type hashable interface { + hash(t types.Type) int + eq(t types.Type, x interface{}) bool +} + +type entry struct { + key hashable + value value + next *entry +} + +// A hashtable atop the built-in map. Since each bucket contains +// exactly one hash value, there's no need to perform hash-equality +// tests when walking the linked list. Rehashing is done by the +// underlying map. +type hashmap struct { + keyType types.Type + table map[int]*entry + length int // number of entries in map +} + +// makeMap returns an empty initialized map of key type kt, +// preallocating space for reserve elements. +func makeMap(kt types.Type, reserve int) value { + if usesBuiltinMap(kt) { + return make(map[value]value, reserve) + } + return &hashmap{keyType: kt, table: make(map[int]*entry, reserve)} +} + +// delete removes the association for key k, if any. +func (m *hashmap) delete(k hashable) { + if m != nil { + hash := k.hash(m.keyType) + head := m.table[hash] + if head != nil { + if k.eq(m.keyType, head.key) { + m.table[hash] = head.next + m.length-- + return + } + prev := head + for e := head.next; e != nil; e = e.next { + if k.eq(m.keyType, e.key) { + prev.next = e.next + m.length-- + return + } + prev = e + } + } + } +} + +// lookup returns the value associated with key k, if present, or +// value(nil) otherwise. +func (m *hashmap) lookup(k hashable) value { + if m != nil { + hash := k.hash(m.keyType) + for e := m.table[hash]; e != nil; e = e.next { + if k.eq(m.keyType, e.key) { + return e.value + } + } + } + return nil +} + +// insert updates the map to associate key k with value v. If there +// was already an association for an eq() (though not necessarily ==) +// k, the previous key remains in the map and its associated value is +// updated. +func (m *hashmap) insert(k hashable, v value) { + hash := k.hash(m.keyType) + head := m.table[hash] + for e := head; e != nil; e = e.next { + if k.eq(m.keyType, e.key) { + e.value = v + return + } + } + m.table[hash] = &entry{ + key: k, + value: v, + next: head, + } + m.length++ +} + +// len returns the number of key/value associations in the map. +func (m *hashmap) len() int { + if m != nil { + return m.length + } + return 0 +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/map14.go b/vendor/golang.org/x/tools/go/ssa/interp/map14.go new file mode 100644 index 0000000000..a268c812fa --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/map14.go @@ -0,0 +1,115 @@ +// Copyright 2013 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.5 + +package interp + +// Custom hashtable atop map. +// For use when the key's equivalence relation is not consistent with ==. + +// The Go specification doesn't address the atomicity of map operations. +// The FAQ states that an implementation is permitted to crash on +// concurrent map access. + +import ( + "golang.org/x/tools/go/types" +) + +type hashable interface { + hash(t types.Type) int + eq(t types.Type, x interface{}) bool +} + +type entry struct { + key hashable + value value + next *entry +} + +// A hashtable atop the built-in map. Since each bucket contains +// exactly one hash value, there's no need to perform hash-equality +// tests when walking the linked list. Rehashing is done by the +// underlying map. +type hashmap struct { + keyType types.Type + table map[int]*entry + length int // number of entries in map +} + +// makeMap returns an empty initialized map of key type kt, +// preallocating space for reserve elements. +func makeMap(kt types.Type, reserve int) value { + if usesBuiltinMap(kt) { + return make(map[value]value, reserve) + } + return &hashmap{keyType: kt, table: make(map[int]*entry, reserve)} +} + +// delete removes the association for key k, if any. +func (m *hashmap) delete(k hashable) { + if m != nil { + hash := k.hash(m.keyType) + head := m.table[hash] + if head != nil { + if k.eq(m.keyType, head.key) { + m.table[hash] = head.next + m.length-- + return + } + prev := head + for e := head.next; e != nil; e = e.next { + if k.eq(m.keyType, e.key) { + prev.next = e.next + m.length-- + return + } + prev = e + } + } + } +} + +// lookup returns the value associated with key k, if present, or +// value(nil) otherwise. +func (m *hashmap) lookup(k hashable) value { + if m != nil { + hash := k.hash(m.keyType) + for e := m.table[hash]; e != nil; e = e.next { + if k.eq(m.keyType, e.key) { + return e.value + } + } + } + return nil +} + +// insert updates the map to associate key k with value v. If there +// was already an association for an eq() (though not necessarily ==) +// k, the previous key remains in the map and its associated value is +// updated. +func (m *hashmap) insert(k hashable, v value) { + hash := k.hash(m.keyType) + head := m.table[hash] + for e := head; e != nil; e = e.next { + if k.eq(m.keyType, e.key) { + e.value = v + return + } + } + m.table[hash] = &entry{ + key: k, + value: v, + next: head, + } + m.length++ +} + +// len returns the number of key/value associations in the map. +func (m *hashmap) len() int { + if m != nil { + return m.length + } + return 0 +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/ops.go b/vendor/golang.org/x/tools/go/ssa/interp/ops.go new file mode 100644 index 0000000000..c7a0a4064f --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/ops.go @@ -0,0 +1,1396 @@ +// Copyright 2013 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.5 + +package interp + +import ( + "bytes" + "fmt" + exact "go/constant" + "go/token" + "go/types" + "strings" + "sync" + "unsafe" + + "golang.org/x/tools/go/ssa" +) + +// If the target program panics, the interpreter panics with this type. +type targetPanic struct { + v value +} + +func (p targetPanic) String() string { + return toString(p.v) +} + +// If the target program calls exit, the interpreter panics with this type. +type exitPanic int + +// constValue returns the value of the constant with the +// dynamic type tag appropriate for c.Type(). +func constValue(c *ssa.Const) value { + if c.IsNil() { + return zero(c.Type()) // typed nil + } + + if t, ok := c.Type().Underlying().(*types.Basic); ok { + // TODO(adonovan): eliminate untyped constants from SSA form. + switch t.Kind() { + case types.Bool, types.UntypedBool: + return exact.BoolVal(c.Value) + case types.Int, types.UntypedInt: + // Assume sizeof(int) is same on host and target. + return int(c.Int64()) + case types.Int8: + return int8(c.Int64()) + case types.Int16: + return int16(c.Int64()) + case types.Int32, types.UntypedRune: + return int32(c.Int64()) + case types.Int64: + return c.Int64() + case types.Uint: + // Assume sizeof(uint) is same on host and target. + return uint(c.Uint64()) + case types.Uint8: + return uint8(c.Uint64()) + case types.Uint16: + return uint16(c.Uint64()) + case types.Uint32: + return uint32(c.Uint64()) + case types.Uint64: + return c.Uint64() + case types.Uintptr: + // Assume sizeof(uintptr) is same on host and target. + return uintptr(c.Uint64()) + case types.Float32: + return float32(c.Float64()) + case types.Float64, types.UntypedFloat: + return c.Float64() + case types.Complex64: + return complex64(c.Complex128()) + case types.Complex128, types.UntypedComplex: + return c.Complex128() + case types.String, types.UntypedString: + if c.Value.Kind() == exact.String { + return exact.StringVal(c.Value) + } + return string(rune(c.Int64())) + } + } + + panic(fmt.Sprintf("constValue: %s", c)) +} + +// asInt converts x, which must be an integer, to an int suitable for +// use as a slice or array index or operand to make(). +func asInt(x value) int { + switch x := x.(type) { + case int: + return x + case int8: + return int(x) + case int16: + return int(x) + case int32: + return int(x) + case int64: + return int(x) + case uint: + return int(x) + case uint8: + return int(x) + case uint16: + return int(x) + case uint32: + return int(x) + case uint64: + return int(x) + case uintptr: + return int(x) + } + panic(fmt.Sprintf("cannot convert %T to int", x)) +} + +// asUint64 converts x, which must be an unsigned integer, to a uint64 +// suitable for use as a bitwise shift count. +func asUint64(x value) uint64 { + switch x := x.(type) { + case uint: + return uint64(x) + case uint8: + return uint64(x) + case uint16: + return uint64(x) + case uint32: + return uint64(x) + case uint64: + return x + case uintptr: + return uint64(x) + } + panic(fmt.Sprintf("cannot convert %T to uint64", x)) +} + +// zero returns a new "zero" value of the specified type. +func zero(t types.Type) value { + switch t := t.(type) { + case *types.Basic: + if t.Kind() == types.UntypedNil { + panic("untyped nil has no zero value") + } + if t.Info()&types.IsUntyped != 0 { + // TODO(adonovan): make it an invariant that + // this is unreachable. Currently some + // constants have 'untyped' types when they + // should be defaulted by the typechecker. + t = ssa.DefaultType(t).(*types.Basic) + } + switch t.Kind() { + case types.Bool: + return false + case types.Int: + return int(0) + case types.Int8: + return int8(0) + case types.Int16: + return int16(0) + case types.Int32: + return int32(0) + case types.Int64: + return int64(0) + case types.Uint: + return uint(0) + case types.Uint8: + return uint8(0) + case types.Uint16: + return uint16(0) + case types.Uint32: + return uint32(0) + case types.Uint64: + return uint64(0) + case types.Uintptr: + return uintptr(0) + case types.Float32: + return float32(0) + case types.Float64: + return float64(0) + case types.Complex64: + return complex64(0) + case types.Complex128: + return complex128(0) + case types.String: + return "" + case types.UnsafePointer: + return unsafe.Pointer(nil) + default: + panic(fmt.Sprint("zero for unexpected type:", t)) + } + case *types.Pointer: + return (*value)(nil) + case *types.Array: + a := make(array, t.Len()) + for i := range a { + a[i] = zero(t.Elem()) + } + return a + case *types.Named: + return zero(t.Underlying()) + case *types.Interface: + return iface{} // nil type, methodset and value + case *types.Slice: + return []value(nil) + case *types.Struct: + s := make(structure, t.NumFields()) + for i := range s { + s[i] = zero(t.Field(i).Type()) + } + return s + case *types.Tuple: + if t.Len() == 1 { + return zero(t.At(0).Type()) + } + s := make(tuple, t.Len()) + for i := range s { + s[i] = zero(t.At(i).Type()) + } + return s + case *types.Chan: + return chan value(nil) + case *types.Map: + if usesBuiltinMap(t.Key()) { + return map[value]value(nil) + } + return (*hashmap)(nil) + case *types.Signature: + return (*ssa.Function)(nil) + } + panic(fmt.Sprint("zero: unexpected ", t)) +} + +// slice returns x[lo:hi:max]. Any of lo, hi and max may be nil. +func slice(x, lo, hi, max value) value { + var Len, Cap int + switch x := x.(type) { + case string: + Len = len(x) + case []value: + Len = len(x) + Cap = cap(x) + case *value: // *array + a := (*x).(array) + Len = len(a) + Cap = cap(a) + } + + l := 0 + if lo != nil { + l = asInt(lo) + } + + h := Len + if hi != nil { + h = asInt(hi) + } + + m := Cap + if max != nil { + m = asInt(max) + } + + switch x := x.(type) { + case string: + return x[l:h] + case []value: + return x[l:h:m] + case *value: // *array + a := (*x).(array) + return []value(a)[l:h:m] + } + panic(fmt.Sprintf("slice: unexpected X type: %T", x)) +} + +// lookup returns x[idx] where x is a map or string. +func lookup(instr *ssa.Lookup, x, idx value) value { + switch x := x.(type) { // map or string + case map[value]value, *hashmap: + var v value + var ok bool + switch x := x.(type) { + case map[value]value: + v, ok = x[idx] + case *hashmap: + v = x.lookup(idx.(hashable)) + ok = v != nil + } + if !ok { + v = zero(instr.X.Type().Underlying().(*types.Map).Elem()) + } + if instr.CommaOk { + v = tuple{v, ok} + } + return v + case string: + return x[asInt(idx)] + } + panic(fmt.Sprintf("unexpected x type in Lookup: %T", x)) +} + +// binop implements all arithmetic and logical binary operators for +// numeric datatypes and strings. Both operands must have identical +// dynamic type. +// +func binop(op token.Token, t types.Type, x, y value) value { + switch op { + case token.ADD: + switch x.(type) { + case int: + return x.(int) + y.(int) + case int8: + return x.(int8) + y.(int8) + case int16: + return x.(int16) + y.(int16) + case int32: + return x.(int32) + y.(int32) + case int64: + return x.(int64) + y.(int64) + case uint: + return x.(uint) + y.(uint) + case uint8: + return x.(uint8) + y.(uint8) + case uint16: + return x.(uint16) + y.(uint16) + case uint32: + return x.(uint32) + y.(uint32) + case uint64: + return x.(uint64) + y.(uint64) + case uintptr: + return x.(uintptr) + y.(uintptr) + case float32: + return x.(float32) + y.(float32) + case float64: + return x.(float64) + y.(float64) + case complex64: + return x.(complex64) + y.(complex64) + case complex128: + return x.(complex128) + y.(complex128) + case string: + return x.(string) + y.(string) + } + + case token.SUB: + switch x.(type) { + case int: + return x.(int) - y.(int) + case int8: + return x.(int8) - y.(int8) + case int16: + return x.(int16) - y.(int16) + case int32: + return x.(int32) - y.(int32) + case int64: + return x.(int64) - y.(int64) + case uint: + return x.(uint) - y.(uint) + case uint8: + return x.(uint8) - y.(uint8) + case uint16: + return x.(uint16) - y.(uint16) + case uint32: + return x.(uint32) - y.(uint32) + case uint64: + return x.(uint64) - y.(uint64) + case uintptr: + return x.(uintptr) - y.(uintptr) + case float32: + return x.(float32) - y.(float32) + case float64: + return x.(float64) - y.(float64) + case complex64: + return x.(complex64) - y.(complex64) + case complex128: + return x.(complex128) - y.(complex128) + } + + case token.MUL: + switch x.(type) { + case int: + return x.(int) * y.(int) + case int8: + return x.(int8) * y.(int8) + case int16: + return x.(int16) * y.(int16) + case int32: + return x.(int32) * y.(int32) + case int64: + return x.(int64) * y.(int64) + case uint: + return x.(uint) * y.(uint) + case uint8: + return x.(uint8) * y.(uint8) + case uint16: + return x.(uint16) * y.(uint16) + case uint32: + return x.(uint32) * y.(uint32) + case uint64: + return x.(uint64) * y.(uint64) + case uintptr: + return x.(uintptr) * y.(uintptr) + case float32: + return x.(float32) * y.(float32) + case float64: + return x.(float64) * y.(float64) + case complex64: + return x.(complex64) * y.(complex64) + case complex128: + return x.(complex128) * y.(complex128) + } + + case token.QUO: + switch x.(type) { + case int: + return x.(int) / y.(int) + case int8: + return x.(int8) / y.(int8) + case int16: + return x.(int16) / y.(int16) + case int32: + return x.(int32) / y.(int32) + case int64: + return x.(int64) / y.(int64) + case uint: + return x.(uint) / y.(uint) + case uint8: + return x.(uint8) / y.(uint8) + case uint16: + return x.(uint16) / y.(uint16) + case uint32: + return x.(uint32) / y.(uint32) + case uint64: + return x.(uint64) / y.(uint64) + case uintptr: + return x.(uintptr) / y.(uintptr) + case float32: + return x.(float32) / y.(float32) + case float64: + return x.(float64) / y.(float64) + case complex64: + return x.(complex64) / y.(complex64) + case complex128: + return x.(complex128) / y.(complex128) + } + + case token.REM: + switch x.(type) { + case int: + return x.(int) % y.(int) + case int8: + return x.(int8) % y.(int8) + case int16: + return x.(int16) % y.(int16) + case int32: + return x.(int32) % y.(int32) + case int64: + return x.(int64) % y.(int64) + case uint: + return x.(uint) % y.(uint) + case uint8: + return x.(uint8) % y.(uint8) + case uint16: + return x.(uint16) % y.(uint16) + case uint32: + return x.(uint32) % y.(uint32) + case uint64: + return x.(uint64) % y.(uint64) + case uintptr: + return x.(uintptr) % y.(uintptr) + } + + case token.AND: + switch x.(type) { + case int: + return x.(int) & y.(int) + case int8: + return x.(int8) & y.(int8) + case int16: + return x.(int16) & y.(int16) + case int32: + return x.(int32) & y.(int32) + case int64: + return x.(int64) & y.(int64) + case uint: + return x.(uint) & y.(uint) + case uint8: + return x.(uint8) & y.(uint8) + case uint16: + return x.(uint16) & y.(uint16) + case uint32: + return x.(uint32) & y.(uint32) + case uint64: + return x.(uint64) & y.(uint64) + case uintptr: + return x.(uintptr) & y.(uintptr) + } + + case token.OR: + switch x.(type) { + case int: + return x.(int) | y.(int) + case int8: + return x.(int8) | y.(int8) + case int16: + return x.(int16) | y.(int16) + case int32: + return x.(int32) | y.(int32) + case int64: + return x.(int64) | y.(int64) + case uint: + return x.(uint) | y.(uint) + case uint8: + return x.(uint8) | y.(uint8) + case uint16: + return x.(uint16) | y.(uint16) + case uint32: + return x.(uint32) | y.(uint32) + case uint64: + return x.(uint64) | y.(uint64) + case uintptr: + return x.(uintptr) | y.(uintptr) + } + + case token.XOR: + switch x.(type) { + case int: + return x.(int) ^ y.(int) + case int8: + return x.(int8) ^ y.(int8) + case int16: + return x.(int16) ^ y.(int16) + case int32: + return x.(int32) ^ y.(int32) + case int64: + return x.(int64) ^ y.(int64) + case uint: + return x.(uint) ^ y.(uint) + case uint8: + return x.(uint8) ^ y.(uint8) + case uint16: + return x.(uint16) ^ y.(uint16) + case uint32: + return x.(uint32) ^ y.(uint32) + case uint64: + return x.(uint64) ^ y.(uint64) + case uintptr: + return x.(uintptr) ^ y.(uintptr) + } + + case token.AND_NOT: + switch x.(type) { + case int: + return x.(int) &^ y.(int) + case int8: + return x.(int8) &^ y.(int8) + case int16: + return x.(int16) &^ y.(int16) + case int32: + return x.(int32) &^ y.(int32) + case int64: + return x.(int64) &^ y.(int64) + case uint: + return x.(uint) &^ y.(uint) + case uint8: + return x.(uint8) &^ y.(uint8) + case uint16: + return x.(uint16) &^ y.(uint16) + case uint32: + return x.(uint32) &^ y.(uint32) + case uint64: + return x.(uint64) &^ y.(uint64) + case uintptr: + return x.(uintptr) &^ y.(uintptr) + } + + case token.SHL: + y := asUint64(y) + switch x.(type) { + case int: + return x.(int) << y + case int8: + return x.(int8) << y + case int16: + return x.(int16) << y + case int32: + return x.(int32) << y + case int64: + return x.(int64) << y + case uint: + return x.(uint) << y + case uint8: + return x.(uint8) << y + case uint16: + return x.(uint16) << y + case uint32: + return x.(uint32) << y + case uint64: + return x.(uint64) << y + case uintptr: + return x.(uintptr) << y + } + + case token.SHR: + y := asUint64(y) + switch x.(type) { + case int: + return x.(int) >> y + case int8: + return x.(int8) >> y + case int16: + return x.(int16) >> y + case int32: + return x.(int32) >> y + case int64: + return x.(int64) >> y + case uint: + return x.(uint) >> y + case uint8: + return x.(uint8) >> y + case uint16: + return x.(uint16) >> y + case uint32: + return x.(uint32) >> y + case uint64: + return x.(uint64) >> y + case uintptr: + return x.(uintptr) >> y + } + + case token.LSS: + switch x.(type) { + case int: + return x.(int) < y.(int) + case int8: + return x.(int8) < y.(int8) + case int16: + return x.(int16) < y.(int16) + case int32: + return x.(int32) < y.(int32) + case int64: + return x.(int64) < y.(int64) + case uint: + return x.(uint) < y.(uint) + case uint8: + return x.(uint8) < y.(uint8) + case uint16: + return x.(uint16) < y.(uint16) + case uint32: + return x.(uint32) < y.(uint32) + case uint64: + return x.(uint64) < y.(uint64) + case uintptr: + return x.(uintptr) < y.(uintptr) + case float32: + return x.(float32) < y.(float32) + case float64: + return x.(float64) < y.(float64) + case string: + return x.(string) < y.(string) + } + + case token.LEQ: + switch x.(type) { + case int: + return x.(int) <= y.(int) + case int8: + return x.(int8) <= y.(int8) + case int16: + return x.(int16) <= y.(int16) + case int32: + return x.(int32) <= y.(int32) + case int64: + return x.(int64) <= y.(int64) + case uint: + return x.(uint) <= y.(uint) + case uint8: + return x.(uint8) <= y.(uint8) + case uint16: + return x.(uint16) <= y.(uint16) + case uint32: + return x.(uint32) <= y.(uint32) + case uint64: + return x.(uint64) <= y.(uint64) + case uintptr: + return x.(uintptr) <= y.(uintptr) + case float32: + return x.(float32) <= y.(float32) + case float64: + return x.(float64) <= y.(float64) + case string: + return x.(string) <= y.(string) + } + + case token.EQL: + return eqnil(t, x, y) + + case token.NEQ: + return !eqnil(t, x, y) + + case token.GTR: + switch x.(type) { + case int: + return x.(int) > y.(int) + case int8: + return x.(int8) > y.(int8) + case int16: + return x.(int16) > y.(int16) + case int32: + return x.(int32) > y.(int32) + case int64: + return x.(int64) > y.(int64) + case uint: + return x.(uint) > y.(uint) + case uint8: + return x.(uint8) > y.(uint8) + case uint16: + return x.(uint16) > y.(uint16) + case uint32: + return x.(uint32) > y.(uint32) + case uint64: + return x.(uint64) > y.(uint64) + case uintptr: + return x.(uintptr) > y.(uintptr) + case float32: + return x.(float32) > y.(float32) + case float64: + return x.(float64) > y.(float64) + case string: + return x.(string) > y.(string) + } + + case token.GEQ: + switch x.(type) { + case int: + return x.(int) >= y.(int) + case int8: + return x.(int8) >= y.(int8) + case int16: + return x.(int16) >= y.(int16) + case int32: + return x.(int32) >= y.(int32) + case int64: + return x.(int64) >= y.(int64) + case uint: + return x.(uint) >= y.(uint) + case uint8: + return x.(uint8) >= y.(uint8) + case uint16: + return x.(uint16) >= y.(uint16) + case uint32: + return x.(uint32) >= y.(uint32) + case uint64: + return x.(uint64) >= y.(uint64) + case uintptr: + return x.(uintptr) >= y.(uintptr) + case float32: + return x.(float32) >= y.(float32) + case float64: + return x.(float64) >= y.(float64) + case string: + return x.(string) >= y.(string) + } + } + panic(fmt.Sprintf("invalid binary op: %T %s %T", x, op, y)) +} + +// eqnil returns the comparison x == y using the equivalence relation +// appropriate for type t. +// If t is a reference type, at most one of x or y may be a nil value +// of that type. +// +func eqnil(t types.Type, x, y value) bool { + switch t.Underlying().(type) { + case *types.Map, *types.Signature, *types.Slice: + // Since these types don't support comparison, + // one of the operands must be a literal nil. + switch x := x.(type) { + case *hashmap: + return (x != nil) == (y.(*hashmap) != nil) + case map[value]value: + return (x != nil) == (y.(map[value]value) != nil) + case *ssa.Function: + switch y := y.(type) { + case *ssa.Function: + return (x != nil) == (y != nil) + case *closure: + return true + } + case *closure: + return (x != nil) == (y.(*ssa.Function) != nil) + case []value: + return (x != nil) == (y.([]value) != nil) + } + panic(fmt.Sprintf("eqnil(%s): illegal dynamic type: %T", t, x)) + } + + return equals(t, x, y) +} + +func unop(instr *ssa.UnOp, x value) value { + switch instr.Op { + case token.ARROW: // receive + v, ok := <-x.(chan value) + if !ok { + v = zero(instr.X.Type().Underlying().(*types.Chan).Elem()) + } + if instr.CommaOk { + v = tuple{v, ok} + } + return v + case token.SUB: + switch x := x.(type) { + case int: + return -x + case int8: + return -x + case int16: + return -x + case int32: + return -x + case int64: + return -x + case uint: + return -x + case uint8: + return -x + case uint16: + return -x + case uint32: + return -x + case uint64: + return -x + case uintptr: + return -x + case float32: + return -x + case float64: + return -x + case complex64: + return -x + case complex128: + return -x + } + case token.MUL: + return load(deref(instr.X.Type()), x.(*value)) + case token.NOT: + return !x.(bool) + case token.XOR: + switch x := x.(type) { + case int: + return ^x + case int8: + return ^x + case int16: + return ^x + case int32: + return ^x + case int64: + return ^x + case uint: + return ^x + case uint8: + return ^x + case uint16: + return ^x + case uint32: + return ^x + case uint64: + return ^x + case uintptr: + return ^x + } + } + panic(fmt.Sprintf("invalid unary op %s %T", instr.Op, x)) +} + +// typeAssert checks whether dynamic type of itf is instr.AssertedType. +// It returns the extracted value on success, and panics on failure, +// unless instr.CommaOk, in which case it always returns a "value,ok" tuple. +// +func typeAssert(i *interpreter, instr *ssa.TypeAssert, itf iface) value { + var v value + err := "" + if itf.t == nil { + err = fmt.Sprintf("interface conversion: interface is nil, not %s", instr.AssertedType) + + } else if idst, ok := instr.AssertedType.Underlying().(*types.Interface); ok { + v = itf + err = checkInterface(i, idst, itf) + + } else if types.Identical(itf.t, instr.AssertedType) { + v = itf.v // extract value + + } else { + err = fmt.Sprintf("interface conversion: interface is %s, not %s", itf.t, instr.AssertedType) + } + + if err != "" { + if !instr.CommaOk { + panic(err) + } + return tuple{zero(instr.AssertedType), false} + } + if instr.CommaOk { + return tuple{v, true} + } + return v +} + +// If CapturedOutput is non-nil, all writes by the interpreted program +// to file descriptors 1 and 2 will also be written to CapturedOutput. +// +// (The $GOROOT/test system requires that the test be considered a +// failure if "BUG" appears in the combined stdout/stderr output, even +// if it exits zero. This is a global variable shared by all +// interpreters in the same process.) +// +var CapturedOutput *bytes.Buffer +var capturedOutputMu sync.Mutex + +// write writes bytes b to the target program's file descriptor fd. +// The print/println built-ins and the write() system call funnel +// through here so they can be captured by the test driver. +func write(fd int, b []byte) (int, error) { + // TODO(adonovan): fix: on Windows, std{out,err} are not 1, 2. + if CapturedOutput != nil && (fd == 1 || fd == 2) { + capturedOutputMu.Lock() + CapturedOutput.Write(b) // ignore errors + capturedOutputMu.Unlock() + } + return syswrite(fd, b) +} + +// callBuiltin interprets a call to builtin fn with arguments args, +// returning its result. +func callBuiltin(caller *frame, callpos token.Pos, fn *ssa.Builtin, args []value) value { + switch fn.Name() { + case "append": + if len(args) == 1 { + return args[0] + } + if s, ok := args[1].(string); ok { + // append([]byte, ...string) []byte + arg0 := args[0].([]value) + for i := 0; i < len(s); i++ { + arg0 = append(arg0, s[i]) + } + return arg0 + } + // append([]T, ...[]T) []T + return append(args[0].([]value), args[1].([]value)...) + + case "copy": // copy([]T, []T) int or copy([]byte, string) int + src := args[1] + if _, ok := src.(string); ok { + params := fn.Type().(*types.Signature).Params() + src = conv(params.At(0).Type(), params.At(1).Type(), src) + } + return copy(args[0].([]value), src.([]value)) + + case "close": // close(chan T) + close(args[0].(chan value)) + return nil + + case "delete": // delete(map[K]value, K) + switch m := args[0].(type) { + case map[value]value: + delete(m, args[1]) + case *hashmap: + m.delete(args[1].(hashable)) + default: + panic(fmt.Sprintf("illegal map type: %T", m)) + } + return nil + + case "print", "println": // print(any, ...) + ln := fn.Name() == "println" + var buf bytes.Buffer + for i, arg := range args { + if i > 0 && ln { + buf.WriteRune(' ') + } + buf.WriteString(toString(arg)) + } + if ln { + buf.WriteRune('\n') + } + write(1, buf.Bytes()) + return nil + + case "len": + switch x := args[0].(type) { + case string: + return len(x) + case array: + return len(x) + case *value: + return len((*x).(array)) + case []value: + return len(x) + case map[value]value: + return len(x) + case *hashmap: + return x.len() + case chan value: + return len(x) + default: + panic(fmt.Sprintf("len: illegal operand: %T", x)) + } + + case "cap": + switch x := args[0].(type) { + case array: + return cap(x) + case *value: + return cap((*x).(array)) + case []value: + return cap(x) + case chan value: + return cap(x) + default: + panic(fmt.Sprintf("cap: illegal operand: %T", x)) + } + + case "real": + switch c := args[0].(type) { + case complex64: + return real(c) + case complex128: + return real(c) + default: + panic(fmt.Sprintf("real: illegal operand: %T", c)) + } + + case "imag": + switch c := args[0].(type) { + case complex64: + return imag(c) + case complex128: + return imag(c) + default: + panic(fmt.Sprintf("imag: illegal operand: %T", c)) + } + + case "complex": + switch f := args[0].(type) { + case float32: + return complex(f, args[1].(float32)) + case float64: + return complex(f, args[1].(float64)) + default: + panic(fmt.Sprintf("complex: illegal operand: %T", f)) + } + + case "panic": + // ssa.Panic handles most cases; this is only for "go + // panic" or "defer panic". + panic(targetPanic{args[0]}) + + case "recover": + return doRecover(caller) + + case "ssa:wrapnilchk": + recv := args[0] + if recv.(*value) == nil { + recvType := args[1] + methodName := args[2] + panic(fmt.Sprintf("value method (%s).%s called using nil *%s pointer", + recvType, methodName, recvType)) + } + return recv + } + + panic("unknown built-in: " + fn.Name()) +} + +func rangeIter(x value, t types.Type) iter { + switch x := x.(type) { + case map[value]value: + // TODO(adonovan): fix: leaks goroutines and channels + // on each incomplete map iteration. We need to open + // up an iteration interface using the + // reflect.(Value).MapKeys machinery. + it := make(mapIter) + go func() { + for k, v := range x { + it <- [2]value{k, v} + } + close(it) + }() + return it + case *hashmap: + // TODO(adonovan): fix: leaks goroutines and channels + // on each incomplete map iteration. We need to open + // up an iteration interface using the + // reflect.(Value).MapKeys machinery. + it := make(mapIter) + go func() { + for _, e := range x.table { + for e != nil { + it <- [2]value{e.key, e.value} + e = e.next + } + } + close(it) + }() + return it + case string: + return &stringIter{Reader: strings.NewReader(x)} + } + panic(fmt.Sprintf("cannot range over %T", x)) +} + +// widen widens a basic typed value x to the widest type of its +// category, one of: +// bool, int64, uint64, float64, complex128, string. +// This is inefficient but reduces the size of the cross-product of +// cases we have to consider. +// +func widen(x value) value { + switch y := x.(type) { + case bool, int64, uint64, float64, complex128, string, unsafe.Pointer: + return x + case int: + return int64(y) + case int8: + return int64(y) + case int16: + return int64(y) + case int32: + return int64(y) + case uint: + return uint64(y) + case uint8: + return uint64(y) + case uint16: + return uint64(y) + case uint32: + return uint64(y) + case uintptr: + return uint64(y) + case float32: + return float64(y) + case complex64: + return complex128(y) + } + panic(fmt.Sprintf("cannot widen %T", x)) +} + +// conv converts the value x of type t_src to type t_dst and returns +// the result. +// Possible cases are described with the ssa.Convert operator. +// +func conv(t_dst, t_src types.Type, x value) value { + ut_src := t_src.Underlying() + ut_dst := t_dst.Underlying() + + // Destination type is not an "untyped" type. + if b, ok := ut_dst.(*types.Basic); ok && b.Info()&types.IsUntyped != 0 { + panic("oops: conversion to 'untyped' type: " + b.String()) + } + + // Nor is it an interface type. + if _, ok := ut_dst.(*types.Interface); ok { + if _, ok := ut_src.(*types.Interface); ok { + panic("oops: Convert should be ChangeInterface") + } else { + panic("oops: Convert should be MakeInterface") + } + } + + // Remaining conversions: + // + untyped string/number/bool constant to a specific + // representation. + // + conversions between non-complex numeric types. + // + conversions between complex numeric types. + // + integer/[]byte/[]rune -> string. + // + string -> []byte/[]rune. + // + // All are treated the same: first we extract the value to the + // widest representation (int64, uint64, float64, complex128, + // or string), then we convert it to the desired type. + + switch ut_src := ut_src.(type) { + case *types.Pointer: + switch ut_dst := ut_dst.(type) { + case *types.Basic: + // *value to unsafe.Pointer? + if ut_dst.Kind() == types.UnsafePointer { + return unsafe.Pointer(x.(*value)) + } + } + + case *types.Slice: + // []byte or []rune -> string + // TODO(adonovan): fix: type B byte; conv([]B -> string). + switch ut_src.Elem().(*types.Basic).Kind() { + case types.Byte: + x := x.([]value) + b := make([]byte, 0, len(x)) + for i := range x { + b = append(b, x[i].(byte)) + } + return string(b) + + case types.Rune: + x := x.([]value) + r := make([]rune, 0, len(x)) + for i := range x { + r = append(r, x[i].(rune)) + } + return string(r) + } + + case *types.Basic: + x = widen(x) + + // integer -> string? + // TODO(adonovan): fix: test integer -> named alias of string. + if ut_src.Info()&types.IsInteger != 0 { + if ut_dst, ok := ut_dst.(*types.Basic); ok && ut_dst.Kind() == types.String { + return string(asInt(x)) + } + } + + // string -> []rune, []byte or string? + if s, ok := x.(string); ok { + switch ut_dst := ut_dst.(type) { + case *types.Slice: + var res []value + // TODO(adonovan): fix: test named alias of rune, byte. + switch ut_dst.Elem().(*types.Basic).Kind() { + case types.Rune: + for _, r := range []rune(s) { + res = append(res, r) + } + return res + case types.Byte: + for _, b := range []byte(s) { + res = append(res, b) + } + return res + } + case *types.Basic: + if ut_dst.Kind() == types.String { + return x.(string) + } + } + break // fail: no other conversions for string + } + + // unsafe.Pointer -> *value + if ut_src.Kind() == types.UnsafePointer { + // TODO(adonovan): this is wrong and cannot + // really be fixed with the current design. + // + // return (*value)(x.(unsafe.Pointer)) + // creates a new pointer of a different + // type but the underlying interface value + // knows its "true" type and so cannot be + // meaningfully used through the new pointer. + // + // To make this work, the interpreter needs to + // simulate the memory layout of a real + // compiled implementation. + // + // To at least preserve type-safety, we'll + // just return the zero value of the + // destination type. + return zero(t_dst) + } + + // Conversions between complex numeric types? + if ut_src.Info()&types.IsComplex != 0 { + switch ut_dst.(*types.Basic).Kind() { + case types.Complex64: + return complex64(x.(complex128)) + case types.Complex128: + return x.(complex128) + } + break // fail: no other conversions for complex + } + + // Conversions between non-complex numeric types? + if ut_src.Info()&types.IsNumeric != 0 { + kind := ut_dst.(*types.Basic).Kind() + switch x := x.(type) { + case int64: // signed integer -> numeric? + switch kind { + case types.Int: + return int(x) + case types.Int8: + return int8(x) + case types.Int16: + return int16(x) + case types.Int32: + return int32(x) + case types.Int64: + return int64(x) + case types.Uint: + return uint(x) + case types.Uint8: + return uint8(x) + case types.Uint16: + return uint16(x) + case types.Uint32: + return uint32(x) + case types.Uint64: + return uint64(x) + case types.Uintptr: + return uintptr(x) + case types.Float32: + return float32(x) + case types.Float64: + return float64(x) + } + + case uint64: // unsigned integer -> numeric? + switch kind { + case types.Int: + return int(x) + case types.Int8: + return int8(x) + case types.Int16: + return int16(x) + case types.Int32: + return int32(x) + case types.Int64: + return int64(x) + case types.Uint: + return uint(x) + case types.Uint8: + return uint8(x) + case types.Uint16: + return uint16(x) + case types.Uint32: + return uint32(x) + case types.Uint64: + return uint64(x) + case types.Uintptr: + return uintptr(x) + case types.Float32: + return float32(x) + case types.Float64: + return float64(x) + } + + case float64: // floating point -> numeric? + switch kind { + case types.Int: + return int(x) + case types.Int8: + return int8(x) + case types.Int16: + return int16(x) + case types.Int32: + return int32(x) + case types.Int64: + return int64(x) + case types.Uint: + return uint(x) + case types.Uint8: + return uint8(x) + case types.Uint16: + return uint16(x) + case types.Uint32: + return uint32(x) + case types.Uint64: + return uint64(x) + case types.Uintptr: + return uintptr(x) + case types.Float32: + return float32(x) + case types.Float64: + return float64(x) + } + } + } + } + + panic(fmt.Sprintf("unsupported conversion: %s -> %s, dynamic type %T", t_src, t_dst, x)) +} + +// checkInterface checks that the method set of x implements the +// interface itype. +// On success it returns "", on failure, an error message. +// +func checkInterface(i *interpreter, itype *types.Interface, x iface) string { + if meth, _ := types.MissingMethod(x.t, itype, true); meth != nil { + return fmt.Sprintf("interface conversion: %v is not %v: missing method %s", + x.t, itype, meth.Name()) + } + return "" // ok +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/ops14.go b/vendor/golang.org/x/tools/go/ssa/interp/ops14.go new file mode 100644 index 0000000000..2490dff9c1 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/ops14.go @@ -0,0 +1,1396 @@ +// Copyright 2013 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.5 + +package interp + +import ( + "bytes" + "fmt" + "go/token" + "strings" + "sync" + "unsafe" + + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types" +) + +// If the target program panics, the interpreter panics with this type. +type targetPanic struct { + v value +} + +func (p targetPanic) String() string { + return toString(p.v) +} + +// If the target program calls exit, the interpreter panics with this type. +type exitPanic int + +// constValue returns the value of the constant with the +// dynamic type tag appropriate for c.Type(). +func constValue(c *ssa.Const) value { + if c.IsNil() { + return zero(c.Type()) // typed nil + } + + if t, ok := c.Type().Underlying().(*types.Basic); ok { + // TODO(adonovan): eliminate untyped constants from SSA form. + switch t.Kind() { + case types.Bool, types.UntypedBool: + return exact.BoolVal(c.Value) + case types.Int, types.UntypedInt: + // Assume sizeof(int) is same on host and target. + return int(c.Int64()) + case types.Int8: + return int8(c.Int64()) + case types.Int16: + return int16(c.Int64()) + case types.Int32, types.UntypedRune: + return int32(c.Int64()) + case types.Int64: + return c.Int64() + case types.Uint: + // Assume sizeof(uint) is same on host and target. + return uint(c.Uint64()) + case types.Uint8: + return uint8(c.Uint64()) + case types.Uint16: + return uint16(c.Uint64()) + case types.Uint32: + return uint32(c.Uint64()) + case types.Uint64: + return c.Uint64() + case types.Uintptr: + // Assume sizeof(uintptr) is same on host and target. + return uintptr(c.Uint64()) + case types.Float32: + return float32(c.Float64()) + case types.Float64, types.UntypedFloat: + return c.Float64() + case types.Complex64: + return complex64(c.Complex128()) + case types.Complex128, types.UntypedComplex: + return c.Complex128() + case types.String, types.UntypedString: + if c.Value.Kind() == exact.String { + return exact.StringVal(c.Value) + } + return string(rune(c.Int64())) + } + } + + panic(fmt.Sprintf("constValue: %s", c)) +} + +// asInt converts x, which must be an integer, to an int suitable for +// use as a slice or array index or operand to make(). +func asInt(x value) int { + switch x := x.(type) { + case int: + return x + case int8: + return int(x) + case int16: + return int(x) + case int32: + return int(x) + case int64: + return int(x) + case uint: + return int(x) + case uint8: + return int(x) + case uint16: + return int(x) + case uint32: + return int(x) + case uint64: + return int(x) + case uintptr: + return int(x) + } + panic(fmt.Sprintf("cannot convert %T to int", x)) +} + +// asUint64 converts x, which must be an unsigned integer, to a uint64 +// suitable for use as a bitwise shift count. +func asUint64(x value) uint64 { + switch x := x.(type) { + case uint: + return uint64(x) + case uint8: + return uint64(x) + case uint16: + return uint64(x) + case uint32: + return uint64(x) + case uint64: + return x + case uintptr: + return uint64(x) + } + panic(fmt.Sprintf("cannot convert %T to uint64", x)) +} + +// zero returns a new "zero" value of the specified type. +func zero(t types.Type) value { + switch t := t.(type) { + case *types.Basic: + if t.Kind() == types.UntypedNil { + panic("untyped nil has no zero value") + } + if t.Info()&types.IsUntyped != 0 { + // TODO(adonovan): make it an invariant that + // this is unreachable. Currently some + // constants have 'untyped' types when they + // should be defaulted by the typechecker. + t = ssa.DefaultType(t).(*types.Basic) + } + switch t.Kind() { + case types.Bool: + return false + case types.Int: + return int(0) + case types.Int8: + return int8(0) + case types.Int16: + return int16(0) + case types.Int32: + return int32(0) + case types.Int64: + return int64(0) + case types.Uint: + return uint(0) + case types.Uint8: + return uint8(0) + case types.Uint16: + return uint16(0) + case types.Uint32: + return uint32(0) + case types.Uint64: + return uint64(0) + case types.Uintptr: + return uintptr(0) + case types.Float32: + return float32(0) + case types.Float64: + return float64(0) + case types.Complex64: + return complex64(0) + case types.Complex128: + return complex128(0) + case types.String: + return "" + case types.UnsafePointer: + return unsafe.Pointer(nil) + default: + panic(fmt.Sprint("zero for unexpected type:", t)) + } + case *types.Pointer: + return (*value)(nil) + case *types.Array: + a := make(array, t.Len()) + for i := range a { + a[i] = zero(t.Elem()) + } + return a + case *types.Named: + return zero(t.Underlying()) + case *types.Interface: + return iface{} // nil type, methodset and value + case *types.Slice: + return []value(nil) + case *types.Struct: + s := make(structure, t.NumFields()) + for i := range s { + s[i] = zero(t.Field(i).Type()) + } + return s + case *types.Tuple: + if t.Len() == 1 { + return zero(t.At(0).Type()) + } + s := make(tuple, t.Len()) + for i := range s { + s[i] = zero(t.At(i).Type()) + } + return s + case *types.Chan: + return chan value(nil) + case *types.Map: + if usesBuiltinMap(t.Key()) { + return map[value]value(nil) + } + return (*hashmap)(nil) + case *types.Signature: + return (*ssa.Function)(nil) + } + panic(fmt.Sprint("zero: unexpected ", t)) +} + +// slice returns x[lo:hi:max]. Any of lo, hi and max may be nil. +func slice(x, lo, hi, max value) value { + var Len, Cap int + switch x := x.(type) { + case string: + Len = len(x) + case []value: + Len = len(x) + Cap = cap(x) + case *value: // *array + a := (*x).(array) + Len = len(a) + Cap = cap(a) + } + + l := 0 + if lo != nil { + l = asInt(lo) + } + + h := Len + if hi != nil { + h = asInt(hi) + } + + m := Cap + if max != nil { + m = asInt(max) + } + + switch x := x.(type) { + case string: + return x[l:h] + case []value: + return x[l:h:m] + case *value: // *array + a := (*x).(array) + return []value(a)[l:h:m] + } + panic(fmt.Sprintf("slice: unexpected X type: %T", x)) +} + +// lookup returns x[idx] where x is a map or string. +func lookup(instr *ssa.Lookup, x, idx value) value { + switch x := x.(type) { // map or string + case map[value]value, *hashmap: + var v value + var ok bool + switch x := x.(type) { + case map[value]value: + v, ok = x[idx] + case *hashmap: + v = x.lookup(idx.(hashable)) + ok = v != nil + } + if !ok { + v = zero(instr.X.Type().Underlying().(*types.Map).Elem()) + } + if instr.CommaOk { + v = tuple{v, ok} + } + return v + case string: + return x[asInt(idx)] + } + panic(fmt.Sprintf("unexpected x type in Lookup: %T", x)) +} + +// binop implements all arithmetic and logical binary operators for +// numeric datatypes and strings. Both operands must have identical +// dynamic type. +// +func binop(op token.Token, t types.Type, x, y value) value { + switch op { + case token.ADD: + switch x.(type) { + case int: + return x.(int) + y.(int) + case int8: + return x.(int8) + y.(int8) + case int16: + return x.(int16) + y.(int16) + case int32: + return x.(int32) + y.(int32) + case int64: + return x.(int64) + y.(int64) + case uint: + return x.(uint) + y.(uint) + case uint8: + return x.(uint8) + y.(uint8) + case uint16: + return x.(uint16) + y.(uint16) + case uint32: + return x.(uint32) + y.(uint32) + case uint64: + return x.(uint64) + y.(uint64) + case uintptr: + return x.(uintptr) + y.(uintptr) + case float32: + return x.(float32) + y.(float32) + case float64: + return x.(float64) + y.(float64) + case complex64: + return x.(complex64) + y.(complex64) + case complex128: + return x.(complex128) + y.(complex128) + case string: + return x.(string) + y.(string) + } + + case token.SUB: + switch x.(type) { + case int: + return x.(int) - y.(int) + case int8: + return x.(int8) - y.(int8) + case int16: + return x.(int16) - y.(int16) + case int32: + return x.(int32) - y.(int32) + case int64: + return x.(int64) - y.(int64) + case uint: + return x.(uint) - y.(uint) + case uint8: + return x.(uint8) - y.(uint8) + case uint16: + return x.(uint16) - y.(uint16) + case uint32: + return x.(uint32) - y.(uint32) + case uint64: + return x.(uint64) - y.(uint64) + case uintptr: + return x.(uintptr) - y.(uintptr) + case float32: + return x.(float32) - y.(float32) + case float64: + return x.(float64) - y.(float64) + case complex64: + return x.(complex64) - y.(complex64) + case complex128: + return x.(complex128) - y.(complex128) + } + + case token.MUL: + switch x.(type) { + case int: + return x.(int) * y.(int) + case int8: + return x.(int8) * y.(int8) + case int16: + return x.(int16) * y.(int16) + case int32: + return x.(int32) * y.(int32) + case int64: + return x.(int64) * y.(int64) + case uint: + return x.(uint) * y.(uint) + case uint8: + return x.(uint8) * y.(uint8) + case uint16: + return x.(uint16) * y.(uint16) + case uint32: + return x.(uint32) * y.(uint32) + case uint64: + return x.(uint64) * y.(uint64) + case uintptr: + return x.(uintptr) * y.(uintptr) + case float32: + return x.(float32) * y.(float32) + case float64: + return x.(float64) * y.(float64) + case complex64: + return x.(complex64) * y.(complex64) + case complex128: + return x.(complex128) * y.(complex128) + } + + case token.QUO: + switch x.(type) { + case int: + return x.(int) / y.(int) + case int8: + return x.(int8) / y.(int8) + case int16: + return x.(int16) / y.(int16) + case int32: + return x.(int32) / y.(int32) + case int64: + return x.(int64) / y.(int64) + case uint: + return x.(uint) / y.(uint) + case uint8: + return x.(uint8) / y.(uint8) + case uint16: + return x.(uint16) / y.(uint16) + case uint32: + return x.(uint32) / y.(uint32) + case uint64: + return x.(uint64) / y.(uint64) + case uintptr: + return x.(uintptr) / y.(uintptr) + case float32: + return x.(float32) / y.(float32) + case float64: + return x.(float64) / y.(float64) + case complex64: + return x.(complex64) / y.(complex64) + case complex128: + return x.(complex128) / y.(complex128) + } + + case token.REM: + switch x.(type) { + case int: + return x.(int) % y.(int) + case int8: + return x.(int8) % y.(int8) + case int16: + return x.(int16) % y.(int16) + case int32: + return x.(int32) % y.(int32) + case int64: + return x.(int64) % y.(int64) + case uint: + return x.(uint) % y.(uint) + case uint8: + return x.(uint8) % y.(uint8) + case uint16: + return x.(uint16) % y.(uint16) + case uint32: + return x.(uint32) % y.(uint32) + case uint64: + return x.(uint64) % y.(uint64) + case uintptr: + return x.(uintptr) % y.(uintptr) + } + + case token.AND: + switch x.(type) { + case int: + return x.(int) & y.(int) + case int8: + return x.(int8) & y.(int8) + case int16: + return x.(int16) & y.(int16) + case int32: + return x.(int32) & y.(int32) + case int64: + return x.(int64) & y.(int64) + case uint: + return x.(uint) & y.(uint) + case uint8: + return x.(uint8) & y.(uint8) + case uint16: + return x.(uint16) & y.(uint16) + case uint32: + return x.(uint32) & y.(uint32) + case uint64: + return x.(uint64) & y.(uint64) + case uintptr: + return x.(uintptr) & y.(uintptr) + } + + case token.OR: + switch x.(type) { + case int: + return x.(int) | y.(int) + case int8: + return x.(int8) | y.(int8) + case int16: + return x.(int16) | y.(int16) + case int32: + return x.(int32) | y.(int32) + case int64: + return x.(int64) | y.(int64) + case uint: + return x.(uint) | y.(uint) + case uint8: + return x.(uint8) | y.(uint8) + case uint16: + return x.(uint16) | y.(uint16) + case uint32: + return x.(uint32) | y.(uint32) + case uint64: + return x.(uint64) | y.(uint64) + case uintptr: + return x.(uintptr) | y.(uintptr) + } + + case token.XOR: + switch x.(type) { + case int: + return x.(int) ^ y.(int) + case int8: + return x.(int8) ^ y.(int8) + case int16: + return x.(int16) ^ y.(int16) + case int32: + return x.(int32) ^ y.(int32) + case int64: + return x.(int64) ^ y.(int64) + case uint: + return x.(uint) ^ y.(uint) + case uint8: + return x.(uint8) ^ y.(uint8) + case uint16: + return x.(uint16) ^ y.(uint16) + case uint32: + return x.(uint32) ^ y.(uint32) + case uint64: + return x.(uint64) ^ y.(uint64) + case uintptr: + return x.(uintptr) ^ y.(uintptr) + } + + case token.AND_NOT: + switch x.(type) { + case int: + return x.(int) &^ y.(int) + case int8: + return x.(int8) &^ y.(int8) + case int16: + return x.(int16) &^ y.(int16) + case int32: + return x.(int32) &^ y.(int32) + case int64: + return x.(int64) &^ y.(int64) + case uint: + return x.(uint) &^ y.(uint) + case uint8: + return x.(uint8) &^ y.(uint8) + case uint16: + return x.(uint16) &^ y.(uint16) + case uint32: + return x.(uint32) &^ y.(uint32) + case uint64: + return x.(uint64) &^ y.(uint64) + case uintptr: + return x.(uintptr) &^ y.(uintptr) + } + + case token.SHL: + y := asUint64(y) + switch x.(type) { + case int: + return x.(int) << y + case int8: + return x.(int8) << y + case int16: + return x.(int16) << y + case int32: + return x.(int32) << y + case int64: + return x.(int64) << y + case uint: + return x.(uint) << y + case uint8: + return x.(uint8) << y + case uint16: + return x.(uint16) << y + case uint32: + return x.(uint32) << y + case uint64: + return x.(uint64) << y + case uintptr: + return x.(uintptr) << y + } + + case token.SHR: + y := asUint64(y) + switch x.(type) { + case int: + return x.(int) >> y + case int8: + return x.(int8) >> y + case int16: + return x.(int16) >> y + case int32: + return x.(int32) >> y + case int64: + return x.(int64) >> y + case uint: + return x.(uint) >> y + case uint8: + return x.(uint8) >> y + case uint16: + return x.(uint16) >> y + case uint32: + return x.(uint32) >> y + case uint64: + return x.(uint64) >> y + case uintptr: + return x.(uintptr) >> y + } + + case token.LSS: + switch x.(type) { + case int: + return x.(int) < y.(int) + case int8: + return x.(int8) < y.(int8) + case int16: + return x.(int16) < y.(int16) + case int32: + return x.(int32) < y.(int32) + case int64: + return x.(int64) < y.(int64) + case uint: + return x.(uint) < y.(uint) + case uint8: + return x.(uint8) < y.(uint8) + case uint16: + return x.(uint16) < y.(uint16) + case uint32: + return x.(uint32) < y.(uint32) + case uint64: + return x.(uint64) < y.(uint64) + case uintptr: + return x.(uintptr) < y.(uintptr) + case float32: + return x.(float32) < y.(float32) + case float64: + return x.(float64) < y.(float64) + case string: + return x.(string) < y.(string) + } + + case token.LEQ: + switch x.(type) { + case int: + return x.(int) <= y.(int) + case int8: + return x.(int8) <= y.(int8) + case int16: + return x.(int16) <= y.(int16) + case int32: + return x.(int32) <= y.(int32) + case int64: + return x.(int64) <= y.(int64) + case uint: + return x.(uint) <= y.(uint) + case uint8: + return x.(uint8) <= y.(uint8) + case uint16: + return x.(uint16) <= y.(uint16) + case uint32: + return x.(uint32) <= y.(uint32) + case uint64: + return x.(uint64) <= y.(uint64) + case uintptr: + return x.(uintptr) <= y.(uintptr) + case float32: + return x.(float32) <= y.(float32) + case float64: + return x.(float64) <= y.(float64) + case string: + return x.(string) <= y.(string) + } + + case token.EQL: + return eqnil(t, x, y) + + case token.NEQ: + return !eqnil(t, x, y) + + case token.GTR: + switch x.(type) { + case int: + return x.(int) > y.(int) + case int8: + return x.(int8) > y.(int8) + case int16: + return x.(int16) > y.(int16) + case int32: + return x.(int32) > y.(int32) + case int64: + return x.(int64) > y.(int64) + case uint: + return x.(uint) > y.(uint) + case uint8: + return x.(uint8) > y.(uint8) + case uint16: + return x.(uint16) > y.(uint16) + case uint32: + return x.(uint32) > y.(uint32) + case uint64: + return x.(uint64) > y.(uint64) + case uintptr: + return x.(uintptr) > y.(uintptr) + case float32: + return x.(float32) > y.(float32) + case float64: + return x.(float64) > y.(float64) + case string: + return x.(string) > y.(string) + } + + case token.GEQ: + switch x.(type) { + case int: + return x.(int) >= y.(int) + case int8: + return x.(int8) >= y.(int8) + case int16: + return x.(int16) >= y.(int16) + case int32: + return x.(int32) >= y.(int32) + case int64: + return x.(int64) >= y.(int64) + case uint: + return x.(uint) >= y.(uint) + case uint8: + return x.(uint8) >= y.(uint8) + case uint16: + return x.(uint16) >= y.(uint16) + case uint32: + return x.(uint32) >= y.(uint32) + case uint64: + return x.(uint64) >= y.(uint64) + case uintptr: + return x.(uintptr) >= y.(uintptr) + case float32: + return x.(float32) >= y.(float32) + case float64: + return x.(float64) >= y.(float64) + case string: + return x.(string) >= y.(string) + } + } + panic(fmt.Sprintf("invalid binary op: %T %s %T", x, op, y)) +} + +// eqnil returns the comparison x == y using the equivalence relation +// appropriate for type t. +// If t is a reference type, at most one of x or y may be a nil value +// of that type. +// +func eqnil(t types.Type, x, y value) bool { + switch t.Underlying().(type) { + case *types.Map, *types.Signature, *types.Slice: + // Since these types don't support comparison, + // one of the operands must be a literal nil. + switch x := x.(type) { + case *hashmap: + return (x != nil) == (y.(*hashmap) != nil) + case map[value]value: + return (x != nil) == (y.(map[value]value) != nil) + case *ssa.Function: + switch y := y.(type) { + case *ssa.Function: + return (x != nil) == (y != nil) + case *closure: + return true + } + case *closure: + return (x != nil) == (y.(*ssa.Function) != nil) + case []value: + return (x != nil) == (y.([]value) != nil) + } + panic(fmt.Sprintf("eqnil(%s): illegal dynamic type: %T", t, x)) + } + + return equals(t, x, y) +} + +func unop(instr *ssa.UnOp, x value) value { + switch instr.Op { + case token.ARROW: // receive + v, ok := <-x.(chan value) + if !ok { + v = zero(instr.X.Type().Underlying().(*types.Chan).Elem()) + } + if instr.CommaOk { + v = tuple{v, ok} + } + return v + case token.SUB: + switch x := x.(type) { + case int: + return -x + case int8: + return -x + case int16: + return -x + case int32: + return -x + case int64: + return -x + case uint: + return -x + case uint8: + return -x + case uint16: + return -x + case uint32: + return -x + case uint64: + return -x + case uintptr: + return -x + case float32: + return -x + case float64: + return -x + case complex64: + return -x + case complex128: + return -x + } + case token.MUL: + return load(deref(instr.X.Type()), x.(*value)) + case token.NOT: + return !x.(bool) + case token.XOR: + switch x := x.(type) { + case int: + return ^x + case int8: + return ^x + case int16: + return ^x + case int32: + return ^x + case int64: + return ^x + case uint: + return ^x + case uint8: + return ^x + case uint16: + return ^x + case uint32: + return ^x + case uint64: + return ^x + case uintptr: + return ^x + } + } + panic(fmt.Sprintf("invalid unary op %s %T", instr.Op, x)) +} + +// typeAssert checks whether dynamic type of itf is instr.AssertedType. +// It returns the extracted value on success, and panics on failure, +// unless instr.CommaOk, in which case it always returns a "value,ok" tuple. +// +func typeAssert(i *interpreter, instr *ssa.TypeAssert, itf iface) value { + var v value + err := "" + if itf.t == nil { + err = fmt.Sprintf("interface conversion: interface is nil, not %s", instr.AssertedType) + + } else if idst, ok := instr.AssertedType.Underlying().(*types.Interface); ok { + v = itf + err = checkInterface(i, idst, itf) + + } else if types.Identical(itf.t, instr.AssertedType) { + v = itf.v // extract value + + } else { + err = fmt.Sprintf("interface conversion: interface is %s, not %s", itf.t, instr.AssertedType) + } + + if err != "" { + if !instr.CommaOk { + panic(err) + } + return tuple{zero(instr.AssertedType), false} + } + if instr.CommaOk { + return tuple{v, true} + } + return v +} + +// If CapturedOutput is non-nil, all writes by the interpreted program +// to file descriptors 1 and 2 will also be written to CapturedOutput. +// +// (The $GOROOT/test system requires that the test be considered a +// failure if "BUG" appears in the combined stdout/stderr output, even +// if it exits zero. This is a global variable shared by all +// interpreters in the same process.) +// +var CapturedOutput *bytes.Buffer +var capturedOutputMu sync.Mutex + +// write writes bytes b to the target program's file descriptor fd. +// The print/println built-ins and the write() system call funnel +// through here so they can be captured by the test driver. +func write(fd int, b []byte) (int, error) { + // TODO(adonovan): fix: on Windows, std{out,err} are not 1, 2. + if CapturedOutput != nil && (fd == 1 || fd == 2) { + capturedOutputMu.Lock() + CapturedOutput.Write(b) // ignore errors + capturedOutputMu.Unlock() + } + return syswrite(fd, b) +} + +// callBuiltin interprets a call to builtin fn with arguments args, +// returning its result. +func callBuiltin(caller *frame, callpos token.Pos, fn *ssa.Builtin, args []value) value { + switch fn.Name() { + case "append": + if len(args) == 1 { + return args[0] + } + if s, ok := args[1].(string); ok { + // append([]byte, ...string) []byte + arg0 := args[0].([]value) + for i := 0; i < len(s); i++ { + arg0 = append(arg0, s[i]) + } + return arg0 + } + // append([]T, ...[]T) []T + return append(args[0].([]value), args[1].([]value)...) + + case "copy": // copy([]T, []T) int or copy([]byte, string) int + src := args[1] + if _, ok := src.(string); ok { + params := fn.Type().(*types.Signature).Params() + src = conv(params.At(0).Type(), params.At(1).Type(), src) + } + return copy(args[0].([]value), src.([]value)) + + case "close": // close(chan T) + close(args[0].(chan value)) + return nil + + case "delete": // delete(map[K]value, K) + switch m := args[0].(type) { + case map[value]value: + delete(m, args[1]) + case *hashmap: + m.delete(args[1].(hashable)) + default: + panic(fmt.Sprintf("illegal map type: %T", m)) + } + return nil + + case "print", "println": // print(any, ...) + ln := fn.Name() == "println" + var buf bytes.Buffer + for i, arg := range args { + if i > 0 && ln { + buf.WriteRune(' ') + } + buf.WriteString(toString(arg)) + } + if ln { + buf.WriteRune('\n') + } + write(1, buf.Bytes()) + return nil + + case "len": + switch x := args[0].(type) { + case string: + return len(x) + case array: + return len(x) + case *value: + return len((*x).(array)) + case []value: + return len(x) + case map[value]value: + return len(x) + case *hashmap: + return x.len() + case chan value: + return len(x) + default: + panic(fmt.Sprintf("len: illegal operand: %T", x)) + } + + case "cap": + switch x := args[0].(type) { + case array: + return cap(x) + case *value: + return cap((*x).(array)) + case []value: + return cap(x) + case chan value: + return cap(x) + default: + panic(fmt.Sprintf("cap: illegal operand: %T", x)) + } + + case "real": + switch c := args[0].(type) { + case complex64: + return real(c) + case complex128: + return real(c) + default: + panic(fmt.Sprintf("real: illegal operand: %T", c)) + } + + case "imag": + switch c := args[0].(type) { + case complex64: + return imag(c) + case complex128: + return imag(c) + default: + panic(fmt.Sprintf("imag: illegal operand: %T", c)) + } + + case "complex": + switch f := args[0].(type) { + case float32: + return complex(f, args[1].(float32)) + case float64: + return complex(f, args[1].(float64)) + default: + panic(fmt.Sprintf("complex: illegal operand: %T", f)) + } + + case "panic": + // ssa.Panic handles most cases; this is only for "go + // panic" or "defer panic". + panic(targetPanic{args[0]}) + + case "recover": + return doRecover(caller) + + case "ssa:wrapnilchk": + recv := args[0] + if recv.(*value) == nil { + recvType := args[1] + methodName := args[2] + panic(fmt.Sprintf("value method (%s).%s called using nil *%s pointer", + recvType, methodName, recvType)) + } + return recv + } + + panic("unknown built-in: " + fn.Name()) +} + +func rangeIter(x value, t types.Type) iter { + switch x := x.(type) { + case map[value]value: + // TODO(adonovan): fix: leaks goroutines and channels + // on each incomplete map iteration. We need to open + // up an iteration interface using the + // reflect.(Value).MapKeys machinery. + it := make(mapIter) + go func() { + for k, v := range x { + it <- [2]value{k, v} + } + close(it) + }() + return it + case *hashmap: + // TODO(adonovan): fix: leaks goroutines and channels + // on each incomplete map iteration. We need to open + // up an iteration interface using the + // reflect.(Value).MapKeys machinery. + it := make(mapIter) + go func() { + for _, e := range x.table { + for e != nil { + it <- [2]value{e.key, e.value} + e = e.next + } + } + close(it) + }() + return it + case string: + return &stringIter{Reader: strings.NewReader(x)} + } + panic(fmt.Sprintf("cannot range over %T", x)) +} + +// widen widens a basic typed value x to the widest type of its +// category, one of: +// bool, int64, uint64, float64, complex128, string. +// This is inefficient but reduces the size of the cross-product of +// cases we have to consider. +// +func widen(x value) value { + switch y := x.(type) { + case bool, int64, uint64, float64, complex128, string, unsafe.Pointer: + return x + case int: + return int64(y) + case int8: + return int64(y) + case int16: + return int64(y) + case int32: + return int64(y) + case uint: + return uint64(y) + case uint8: + return uint64(y) + case uint16: + return uint64(y) + case uint32: + return uint64(y) + case uintptr: + return uint64(y) + case float32: + return float64(y) + case complex64: + return complex128(y) + } + panic(fmt.Sprintf("cannot widen %T", x)) +} + +// conv converts the value x of type t_src to type t_dst and returns +// the result. +// Possible cases are described with the ssa.Convert operator. +// +func conv(t_dst, t_src types.Type, x value) value { + ut_src := t_src.Underlying() + ut_dst := t_dst.Underlying() + + // Destination type is not an "untyped" type. + if b, ok := ut_dst.(*types.Basic); ok && b.Info()&types.IsUntyped != 0 { + panic("oops: conversion to 'untyped' type: " + b.String()) + } + + // Nor is it an interface type. + if _, ok := ut_dst.(*types.Interface); ok { + if _, ok := ut_src.(*types.Interface); ok { + panic("oops: Convert should be ChangeInterface") + } else { + panic("oops: Convert should be MakeInterface") + } + } + + // Remaining conversions: + // + untyped string/number/bool constant to a specific + // representation. + // + conversions between non-complex numeric types. + // + conversions between complex numeric types. + // + integer/[]byte/[]rune -> string. + // + string -> []byte/[]rune. + // + // All are treated the same: first we extract the value to the + // widest representation (int64, uint64, float64, complex128, + // or string), then we convert it to the desired type. + + switch ut_src := ut_src.(type) { + case *types.Pointer: + switch ut_dst := ut_dst.(type) { + case *types.Basic: + // *value to unsafe.Pointer? + if ut_dst.Kind() == types.UnsafePointer { + return unsafe.Pointer(x.(*value)) + } + } + + case *types.Slice: + // []byte or []rune -> string + // TODO(adonovan): fix: type B byte; conv([]B -> string). + switch ut_src.Elem().(*types.Basic).Kind() { + case types.Byte: + x := x.([]value) + b := make([]byte, 0, len(x)) + for i := range x { + b = append(b, x[i].(byte)) + } + return string(b) + + case types.Rune: + x := x.([]value) + r := make([]rune, 0, len(x)) + for i := range x { + r = append(r, x[i].(rune)) + } + return string(r) + } + + case *types.Basic: + x = widen(x) + + // integer -> string? + // TODO(adonovan): fix: test integer -> named alias of string. + if ut_src.Info()&types.IsInteger != 0 { + if ut_dst, ok := ut_dst.(*types.Basic); ok && ut_dst.Kind() == types.String { + return string(asInt(x)) + } + } + + // string -> []rune, []byte or string? + if s, ok := x.(string); ok { + switch ut_dst := ut_dst.(type) { + case *types.Slice: + var res []value + // TODO(adonovan): fix: test named alias of rune, byte. + switch ut_dst.Elem().(*types.Basic).Kind() { + case types.Rune: + for _, r := range []rune(s) { + res = append(res, r) + } + return res + case types.Byte: + for _, b := range []byte(s) { + res = append(res, b) + } + return res + } + case *types.Basic: + if ut_dst.Kind() == types.String { + return x.(string) + } + } + break // fail: no other conversions for string + } + + // unsafe.Pointer -> *value + if ut_src.Kind() == types.UnsafePointer { + // TODO(adonovan): this is wrong and cannot + // really be fixed with the current design. + // + // return (*value)(x.(unsafe.Pointer)) + // creates a new pointer of a different + // type but the underlying interface value + // knows its "true" type and so cannot be + // meaningfully used through the new pointer. + // + // To make this work, the interpreter needs to + // simulate the memory layout of a real + // compiled implementation. + // + // To at least preserve type-safety, we'll + // just return the zero value of the + // destination type. + return zero(t_dst) + } + + // Conversions between complex numeric types? + if ut_src.Info()&types.IsComplex != 0 { + switch ut_dst.(*types.Basic).Kind() { + case types.Complex64: + return complex64(x.(complex128)) + case types.Complex128: + return x.(complex128) + } + break // fail: no other conversions for complex + } + + // Conversions between non-complex numeric types? + if ut_src.Info()&types.IsNumeric != 0 { + kind := ut_dst.(*types.Basic).Kind() + switch x := x.(type) { + case int64: // signed integer -> numeric? + switch kind { + case types.Int: + return int(x) + case types.Int8: + return int8(x) + case types.Int16: + return int16(x) + case types.Int32: + return int32(x) + case types.Int64: + return int64(x) + case types.Uint: + return uint(x) + case types.Uint8: + return uint8(x) + case types.Uint16: + return uint16(x) + case types.Uint32: + return uint32(x) + case types.Uint64: + return uint64(x) + case types.Uintptr: + return uintptr(x) + case types.Float32: + return float32(x) + case types.Float64: + return float64(x) + } + + case uint64: // unsigned integer -> numeric? + switch kind { + case types.Int: + return int(x) + case types.Int8: + return int8(x) + case types.Int16: + return int16(x) + case types.Int32: + return int32(x) + case types.Int64: + return int64(x) + case types.Uint: + return uint(x) + case types.Uint8: + return uint8(x) + case types.Uint16: + return uint16(x) + case types.Uint32: + return uint32(x) + case types.Uint64: + return uint64(x) + case types.Uintptr: + return uintptr(x) + case types.Float32: + return float32(x) + case types.Float64: + return float64(x) + } + + case float64: // floating point -> numeric? + switch kind { + case types.Int: + return int(x) + case types.Int8: + return int8(x) + case types.Int16: + return int16(x) + case types.Int32: + return int32(x) + case types.Int64: + return int64(x) + case types.Uint: + return uint(x) + case types.Uint8: + return uint8(x) + case types.Uint16: + return uint16(x) + case types.Uint32: + return uint32(x) + case types.Uint64: + return uint64(x) + case types.Uintptr: + return uintptr(x) + case types.Float32: + return float32(x) + case types.Float64: + return float64(x) + } + } + } + } + + panic(fmt.Sprintf("unsupported conversion: %s -> %s, dynamic type %T", t_src, t_dst, x)) +} + +// checkInterface checks that the method set of x implements the +// interface itype. +// On success it returns "", on failure, an error message. +// +func checkInterface(i *interpreter, itype *types.Interface, x iface) string { + if meth, _ := types.MissingMethod(x.t, itype, true); meth != nil { + return fmt.Sprintf("interface conversion: %v is not %v: missing method %s", + x.t, itype, meth.Name()) + } + return "" // ok +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/reflect.go b/vendor/golang.org/x/tools/go/ssa/interp/reflect.go new file mode 100644 index 0000000000..48bb911214 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/reflect.go @@ -0,0 +1,576 @@ +// Copyright 2013 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.5 + +package interp + +// Emulated "reflect" package. +// +// We completely replace the built-in "reflect" package. +// The only thing clients can depend upon are that reflect.Type is an +// interface and reflect.Value is an (opaque) struct. + +import ( + "fmt" + "go/token" + "go/types" + "reflect" + "unsafe" + + "golang.org/x/tools/go/ssa" +) + +type opaqueType struct { + types.Type + name string +} + +func (t *opaqueType) String() string { return t.name } + +// A bogus "reflect" type-checker package. Shared across interpreters. +var reflectTypesPackage = types.NewPackage("reflect", "reflect") + +// rtype is the concrete type the interpreter uses to implement the +// reflect.Type interface. +// +// type rtype +var rtypeType = makeNamedType("rtype", &opaqueType{nil, "rtype"}) + +// error is an (interpreted) named type whose underlying type is string. +// The interpreter uses it for all implementations of the built-in error +// interface that it creates. +// We put it in the "reflect" package for expedience. +// +// type error string +var errorType = makeNamedType("error", &opaqueType{nil, "error"}) + +func makeNamedType(name string, underlying types.Type) *types.Named { + obj := types.NewTypeName(token.NoPos, reflectTypesPackage, name, nil) + return types.NewNamed(obj, underlying, nil) +} + +func makeReflectValue(t types.Type, v value) value { + return structure{rtype{t}, v} +} + +// Given a reflect.Value, returns its rtype. +func rV2T(v value) rtype { + return v.(structure)[0].(rtype) +} + +// Given a reflect.Value, returns the underlying interpreter value. +func rV2V(v value) value { + return v.(structure)[1] +} + +// makeReflectType boxes up an rtype in a reflect.Type interface. +func makeReflectType(rt rtype) value { + return iface{rtypeType, rt} +} + +func ext۰reflect۰Init(fr *frame, args []value) value { + // Signature: func() + return nil +} + +func ext۰reflect۰rtype۰Bits(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) int + rt := args[0].(rtype).t + basic, ok := rt.Underlying().(*types.Basic) + if !ok { + panic(fmt.Sprintf("reflect.Type.Bits(%T): non-basic type", rt)) + } + return int(fr.i.sizes.Sizeof(basic)) * 8 +} + +func ext۰reflect۰rtype۰Elem(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) reflect.Type + return makeReflectType(rtype{args[0].(rtype).t.Underlying().(interface { + Elem() types.Type + }).Elem()}) +} + +func ext۰reflect۰rtype۰Field(fr *frame, args []value) value { + // Signature: func (t reflect.rtype, i int) reflect.StructField + st := args[0].(rtype).t.Underlying().(*types.Struct) + i := args[1].(int) + f := st.Field(i) + return structure{ + f.Name(), + f.Pkg().Path(), + makeReflectType(rtype{f.Type()}), + st.Tag(i), + 0, // TODO(adonovan): offset + []value{}, // TODO(adonovan): indices + f.Anonymous(), + } +} + +func ext۰reflect۰rtype۰In(fr *frame, args []value) value { + // Signature: func (t reflect.rtype, i int) int + i := args[1].(int) + return makeReflectType(rtype{args[0].(rtype).t.(*types.Signature).Params().At(i).Type()}) +} + +func ext۰reflect۰rtype۰Kind(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) uint + return uint(reflectKind(args[0].(rtype).t)) +} + +func ext۰reflect۰rtype۰NumField(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) int + return args[0].(rtype).t.Underlying().(*types.Struct).NumFields() +} + +func ext۰reflect۰rtype۰NumIn(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) int + return args[0].(rtype).t.(*types.Signature).Params().Len() +} + +func ext۰reflect۰rtype۰NumMethod(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) int + return fr.i.prog.MethodSets.MethodSet(args[0].(rtype).t).Len() +} + +func ext۰reflect۰rtype۰NumOut(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) int + return args[0].(rtype).t.(*types.Signature).Results().Len() +} + +func ext۰reflect۰rtype۰Out(fr *frame, args []value) value { + // Signature: func (t reflect.rtype, i int) int + i := args[1].(int) + return makeReflectType(rtype{args[0].(rtype).t.(*types.Signature).Results().At(i).Type()}) +} + +func ext۰reflect۰rtype۰Size(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) uintptr + return uintptr(fr.i.sizes.Sizeof(args[0].(rtype).t)) +} + +func ext۰reflect۰rtype۰String(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) string + return args[0].(rtype).t.String() +} + +func ext۰reflect۰New(fr *frame, args []value) value { + // Signature: func (t reflect.Type) reflect.Value + t := args[0].(iface).v.(rtype).t + alloc := zero(t) + return makeReflectValue(types.NewPointer(t), &alloc) +} + +func ext۰reflect۰SliceOf(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) Type + return makeReflectType(rtype{types.NewSlice(args[0].(iface).v.(rtype).t)}) +} + +func ext۰reflect۰TypeOf(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) Type + return makeReflectType(rtype{args[0].(iface).t}) +} + +func ext۰reflect۰ValueOf(fr *frame, args []value) value { + // Signature: func (interface{}) reflect.Value + itf := args[0].(iface) + return makeReflectValue(itf.t, itf.v) +} + +func ext۰reflect۰Zero(fr *frame, args []value) value { + // Signature: func (t reflect.Type) reflect.Value + t := args[0].(iface).v.(rtype).t + return makeReflectValue(t, zero(t)) +} + +func reflectKind(t types.Type) reflect.Kind { + switch t := t.(type) { + case *types.Named: + return reflectKind(t.Underlying()) + case *types.Basic: + switch t.Kind() { + case types.Bool: + return reflect.Bool + case types.Int: + return reflect.Int + case types.Int8: + return reflect.Int8 + case types.Int16: + return reflect.Int16 + case types.Int32: + return reflect.Int32 + case types.Int64: + return reflect.Int64 + case types.Uint: + return reflect.Uint + case types.Uint8: + return reflect.Uint8 + case types.Uint16: + return reflect.Uint16 + case types.Uint32: + return reflect.Uint32 + case types.Uint64: + return reflect.Uint64 + case types.Uintptr: + return reflect.Uintptr + case types.Float32: + return reflect.Float32 + case types.Float64: + return reflect.Float64 + case types.Complex64: + return reflect.Complex64 + case types.Complex128: + return reflect.Complex128 + case types.String: + return reflect.String + case types.UnsafePointer: + return reflect.UnsafePointer + } + case *types.Array: + return reflect.Array + case *types.Chan: + return reflect.Chan + case *types.Signature: + return reflect.Func + case *types.Interface: + return reflect.Interface + case *types.Map: + return reflect.Map + case *types.Pointer: + return reflect.Ptr + case *types.Slice: + return reflect.Slice + case *types.Struct: + return reflect.Struct + } + panic(fmt.Sprint("unexpected type: ", t)) +} + +func ext۰reflect۰Value۰Kind(fr *frame, args []value) value { + // Signature: func (reflect.Value) uint + return uint(reflectKind(rV2T(args[0]).t)) +} + +func ext۰reflect۰Value۰String(fr *frame, args []value) value { + // Signature: func (reflect.Value) string + return toString(rV2V(args[0])) +} + +func ext۰reflect۰Value۰Type(fr *frame, args []value) value { + // Signature: func (reflect.Value) reflect.Type + return makeReflectType(rV2T(args[0])) +} + +func ext۰reflect۰Value۰Uint(fr *frame, args []value) value { + // Signature: func (reflect.Value) uint64 + switch v := rV2V(args[0]).(type) { + case uint: + return uint64(v) + case uint8: + return uint64(v) + case uint16: + return uint64(v) + case uint32: + return uint64(v) + case uint64: + return uint64(v) + case uintptr: + return uint64(v) + } + panic("reflect.Value.Uint") +} + +func ext۰reflect۰Value۰Len(fr *frame, args []value) value { + // Signature: func (reflect.Value) int + switch v := rV2V(args[0]).(type) { + case string: + return len(v) + case array: + return len(v) + case chan value: + return cap(v) + case []value: + return len(v) + case *hashmap: + return v.len() + case map[value]value: + return len(v) + default: + panic(fmt.Sprintf("reflect.(Value).Len(%v)", v)) + } +} + +func ext۰reflect۰Value۰MapIndex(fr *frame, args []value) value { + // Signature: func (reflect.Value) Value + tValue := rV2T(args[0]).t.Underlying().(*types.Map).Key() + k := rV2V(args[1]) + switch m := rV2V(args[0]).(type) { + case map[value]value: + if v, ok := m[k]; ok { + return makeReflectValue(tValue, v) + } + + case *hashmap: + if v := m.lookup(k.(hashable)); v != nil { + return makeReflectValue(tValue, v) + } + + default: + panic(fmt.Sprintf("(reflect.Value).MapIndex(%T, %T)", m, k)) + } + return makeReflectValue(nil, nil) +} + +func ext۰reflect۰Value۰MapKeys(fr *frame, args []value) value { + // Signature: func (reflect.Value) []Value + var keys []value + tKey := rV2T(args[0]).t.Underlying().(*types.Map).Key() + switch v := rV2V(args[0]).(type) { + case map[value]value: + for k := range v { + keys = append(keys, makeReflectValue(tKey, k)) + } + + case *hashmap: + for _, e := range v.table { + for ; e != nil; e = e.next { + keys = append(keys, makeReflectValue(tKey, e.key)) + } + } + + default: + panic(fmt.Sprintf("(reflect.Value).MapKeys(%T)", v)) + } + return keys +} + +func ext۰reflect۰Value۰NumField(fr *frame, args []value) value { + // Signature: func (reflect.Value) int + return len(rV2V(args[0]).(structure)) +} + +func ext۰reflect۰Value۰NumMethod(fr *frame, args []value) value { + // Signature: func (reflect.Value) int + return fr.i.prog.MethodSets.MethodSet(rV2T(args[0]).t).Len() +} + +func ext۰reflect۰Value۰Pointer(fr *frame, args []value) value { + // Signature: func (v reflect.Value) uintptr + switch v := rV2V(args[0]).(type) { + case *value: + return uintptr(unsafe.Pointer(v)) + case chan value: + return reflect.ValueOf(v).Pointer() + case []value: + return reflect.ValueOf(v).Pointer() + case *hashmap: + return reflect.ValueOf(v.table).Pointer() + case map[value]value: + return reflect.ValueOf(v).Pointer() + case *ssa.Function: + return uintptr(unsafe.Pointer(v)) + case *closure: + return uintptr(unsafe.Pointer(v)) + default: + panic(fmt.Sprintf("reflect.(Value).Pointer(%T)", v)) + } +} + +func ext۰reflect۰Value۰Index(fr *frame, args []value) value { + // Signature: func (v reflect.Value, i int) Value + i := args[1].(int) + t := rV2T(args[0]).t.Underlying() + switch v := rV2V(args[0]).(type) { + case array: + return makeReflectValue(t.(*types.Array).Elem(), v[i]) + case []value: + return makeReflectValue(t.(*types.Slice).Elem(), v[i]) + default: + panic(fmt.Sprintf("reflect.(Value).Index(%T)", v)) + } +} + +func ext۰reflect۰Value۰Bool(fr *frame, args []value) value { + // Signature: func (reflect.Value) bool + return rV2V(args[0]).(bool) +} + +func ext۰reflect۰Value۰CanAddr(fr *frame, args []value) value { + // Signature: func (v reflect.Value) bool + // Always false for our representation. + return false +} + +func ext۰reflect۰Value۰CanInterface(fr *frame, args []value) value { + // Signature: func (v reflect.Value) bool + // Always true for our representation. + return true +} + +func ext۰reflect۰Value۰Elem(fr *frame, args []value) value { + // Signature: func (v reflect.Value) reflect.Value + switch x := rV2V(args[0]).(type) { + case iface: + return makeReflectValue(x.t, x.v) + case *value: + return makeReflectValue(rV2T(args[0]).t.Underlying().(*types.Pointer).Elem(), *x) + default: + panic(fmt.Sprintf("reflect.(Value).Elem(%T)", x)) + } +} + +func ext۰reflect۰Value۰Field(fr *frame, args []value) value { + // Signature: func (v reflect.Value, i int) reflect.Value + v := args[0] + i := args[1].(int) + return makeReflectValue(rV2T(v).t.Underlying().(*types.Struct).Field(i).Type(), rV2V(v).(structure)[i]) +} + +func ext۰reflect۰Value۰Float(fr *frame, args []value) value { + // Signature: func (reflect.Value) float64 + switch v := rV2V(args[0]).(type) { + case float32: + return float64(v) + case float64: + return float64(v) + } + panic("reflect.Value.Float") +} + +func ext۰reflect۰Value۰Interface(fr *frame, args []value) value { + // Signature: func (v reflect.Value) interface{} + return ext۰reflect۰valueInterface(fr, args) +} + +func ext۰reflect۰Value۰Int(fr *frame, args []value) value { + // Signature: func (reflect.Value) int64 + switch x := rV2V(args[0]).(type) { + case int: + return int64(x) + case int8: + return int64(x) + case int16: + return int64(x) + case int32: + return int64(x) + case int64: + return x + default: + panic(fmt.Sprintf("reflect.(Value).Int(%T)", x)) + } +} + +func ext۰reflect۰Value۰IsNil(fr *frame, args []value) value { + // Signature: func (reflect.Value) bool + switch x := rV2V(args[0]).(type) { + case *value: + return x == nil + case chan value: + return x == nil + case map[value]value: + return x == nil + case *hashmap: + return x == nil + case iface: + return x.t == nil + case []value: + return x == nil + case *ssa.Function: + return x == nil + case *ssa.Builtin: + return x == nil + case *closure: + return x == nil + default: + panic(fmt.Sprintf("reflect.(Value).IsNil(%T)", x)) + } +} + +func ext۰reflect۰Value۰IsValid(fr *frame, args []value) value { + // Signature: func (reflect.Value) bool + return rV2V(args[0]) != nil +} + +func ext۰reflect۰Value۰Set(fr *frame, args []value) value { + // TODO(adonovan): implement. + return nil +} + +func ext۰reflect۰valueInterface(fr *frame, args []value) value { + // Signature: func (v reflect.Value, safe bool) interface{} + v := args[0].(structure) + return iface{rV2T(v).t, rV2V(v)} +} + +func ext۰reflect۰error۰Error(fr *frame, args []value) value { + return args[0] +} + +// newMethod creates a new method of the specified name, package and receiver type. +func newMethod(pkg *ssa.Package, recvType types.Type, name string) *ssa.Function { + // TODO(adonovan): fix: hack: currently the only part of Signature + // that is needed is the "pointerness" of Recv.Type, and for + // now, we'll set it to always be false since we're only + // concerned with rtype. Encapsulate this better. + sig := types.NewSignature(types.NewVar(token.NoPos, nil, "recv", recvType), nil, nil, false) + fn := pkg.Prog.NewFunction(name, sig, "fake reflect method") + fn.Pkg = pkg + return fn +} + +func initReflect(i *interpreter) { + i.reflectPackage = &ssa.Package{ + Prog: i.prog, + Pkg: reflectTypesPackage, + Members: make(map[string]ssa.Member), + } + + // Clobber the type-checker's notion of reflect.Value's + // underlying type so that it more closely matches the fake one + // (at least in the number of fields---we lie about the type of + // the rtype field). + // + // We must ensure that calls to (ssa.Value).Type() return the + // fake type so that correct "shape" is used when allocating + // variables, making zero values, loading, and storing. + // + // TODO(adonovan): obviously this is a hack. We need a cleaner + // way to fake the reflect package (almost---DeepEqual is fine). + // One approach would be not to even load its source code, but + // provide fake source files. This would guarantee that no bad + // information leaks into other packages. + if r := i.prog.ImportedPackage("reflect"); r != nil { + rV := r.Pkg.Scope().Lookup("Value").Type().(*types.Named) + + // delete bodies of the old methods + mset := i.prog.MethodSets.MethodSet(rV) + for j := 0; j < mset.Len(); j++ { + i.prog.MethodValue(mset.At(j)).Blocks = nil + } + + tEface := types.NewInterface(nil, nil).Complete() + rV.SetUnderlying(types.NewStruct([]*types.Var{ + types.NewField(token.NoPos, r.Pkg, "t", tEface, false), // a lie + types.NewField(token.NoPos, r.Pkg, "v", tEface, false), + }, nil)) + } + + i.rtypeMethods = methodSet{ + "Bits": newMethod(i.reflectPackage, rtypeType, "Bits"), + "Elem": newMethod(i.reflectPackage, rtypeType, "Elem"), + "Field": newMethod(i.reflectPackage, rtypeType, "Field"), + "In": newMethod(i.reflectPackage, rtypeType, "In"), + "Kind": newMethod(i.reflectPackage, rtypeType, "Kind"), + "NumField": newMethod(i.reflectPackage, rtypeType, "NumField"), + "NumIn": newMethod(i.reflectPackage, rtypeType, "NumIn"), + "NumMethod": newMethod(i.reflectPackage, rtypeType, "NumMethod"), + "NumOut": newMethod(i.reflectPackage, rtypeType, "NumOut"), + "Out": newMethod(i.reflectPackage, rtypeType, "Out"), + "Size": newMethod(i.reflectPackage, rtypeType, "Size"), + "String": newMethod(i.reflectPackage, rtypeType, "String"), + } + i.errorMethods = methodSet{ + "Error": newMethod(i.reflectPackage, errorType, "Error"), + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/reflect14.go b/vendor/golang.org/x/tools/go/ssa/interp/reflect14.go new file mode 100644 index 0000000000..9f42327d49 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/reflect14.go @@ -0,0 +1,576 @@ +// Copyright 2013 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.5 + +package interp + +// Emulated "reflect" package. +// +// We completely replace the built-in "reflect" package. +// The only thing clients can depend upon are that reflect.Type is an +// interface and reflect.Value is an (opaque) struct. + +import ( + "fmt" + "go/token" + "reflect" + "unsafe" + + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types" +) + +type opaqueType struct { + types.Type + name string +} + +func (t *opaqueType) String() string { return t.name } + +// A bogus "reflect" type-checker package. Shared across interpreters. +var reflectTypesPackage = types.NewPackage("reflect", "reflect") + +// rtype is the concrete type the interpreter uses to implement the +// reflect.Type interface. +// +// type rtype +var rtypeType = makeNamedType("rtype", &opaqueType{nil, "rtype"}) + +// error is an (interpreted) named type whose underlying type is string. +// The interpreter uses it for all implementations of the built-in error +// interface that it creates. +// We put it in the "reflect" package for expedience. +// +// type error string +var errorType = makeNamedType("error", &opaqueType{nil, "error"}) + +func makeNamedType(name string, underlying types.Type) *types.Named { + obj := types.NewTypeName(token.NoPos, reflectTypesPackage, name, nil) + return types.NewNamed(obj, underlying, nil) +} + +func makeReflectValue(t types.Type, v value) value { + return structure{rtype{t}, v} +} + +// Given a reflect.Value, returns its rtype. +func rV2T(v value) rtype { + return v.(structure)[0].(rtype) +} + +// Given a reflect.Value, returns the underlying interpreter value. +func rV2V(v value) value { + return v.(structure)[1] +} + +// makeReflectType boxes up an rtype in a reflect.Type interface. +func makeReflectType(rt rtype) value { + return iface{rtypeType, rt} +} + +func ext۰reflect۰Init(fr *frame, args []value) value { + // Signature: func() + return nil +} + +func ext۰reflect۰rtype۰Bits(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) int + rt := args[0].(rtype).t + basic, ok := rt.Underlying().(*types.Basic) + if !ok { + panic(fmt.Sprintf("reflect.Type.Bits(%T): non-basic type", rt)) + } + return int(fr.i.sizes.Sizeof(basic)) * 8 +} + +func ext۰reflect۰rtype۰Elem(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) reflect.Type + return makeReflectType(rtype{args[0].(rtype).t.Underlying().(interface { + Elem() types.Type + }).Elem()}) +} + +func ext۰reflect۰rtype۰Field(fr *frame, args []value) value { + // Signature: func (t reflect.rtype, i int) reflect.StructField + st := args[0].(rtype).t.Underlying().(*types.Struct) + i := args[1].(int) + f := st.Field(i) + return structure{ + f.Name(), + f.Pkg().Path(), + makeReflectType(rtype{f.Type()}), + st.Tag(i), + 0, // TODO(adonovan): offset + []value{}, // TODO(adonovan): indices + f.Anonymous(), + } +} + +func ext۰reflect۰rtype۰In(fr *frame, args []value) value { + // Signature: func (t reflect.rtype, i int) int + i := args[1].(int) + return makeReflectType(rtype{args[0].(rtype).t.(*types.Signature).Params().At(i).Type()}) +} + +func ext۰reflect۰rtype۰Kind(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) uint + return uint(reflectKind(args[0].(rtype).t)) +} + +func ext۰reflect۰rtype۰NumField(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) int + return args[0].(rtype).t.Underlying().(*types.Struct).NumFields() +} + +func ext۰reflect۰rtype۰NumIn(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) int + return args[0].(rtype).t.(*types.Signature).Params().Len() +} + +func ext۰reflect۰rtype۰NumMethod(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) int + return fr.i.prog.MethodSets.MethodSet(args[0].(rtype).t).Len() +} + +func ext۰reflect۰rtype۰NumOut(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) int + return args[0].(rtype).t.(*types.Signature).Results().Len() +} + +func ext۰reflect۰rtype۰Out(fr *frame, args []value) value { + // Signature: func (t reflect.rtype, i int) int + i := args[1].(int) + return makeReflectType(rtype{args[0].(rtype).t.(*types.Signature).Results().At(i).Type()}) +} + +func ext۰reflect۰rtype۰Size(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) uintptr + return uintptr(fr.i.sizes.Sizeof(args[0].(rtype).t)) +} + +func ext۰reflect۰rtype۰String(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) string + return args[0].(rtype).t.String() +} + +func ext۰reflect۰New(fr *frame, args []value) value { + // Signature: func (t reflect.Type) reflect.Value + t := args[0].(iface).v.(rtype).t + alloc := zero(t) + return makeReflectValue(types.NewPointer(t), &alloc) +} + +func ext۰reflect۰SliceOf(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) Type + return makeReflectType(rtype{types.NewSlice(args[0].(iface).v.(rtype).t)}) +} + +func ext۰reflect۰TypeOf(fr *frame, args []value) value { + // Signature: func (t reflect.rtype) Type + return makeReflectType(rtype{args[0].(iface).t}) +} + +func ext۰reflect۰ValueOf(fr *frame, args []value) value { + // Signature: func (interface{}) reflect.Value + itf := args[0].(iface) + return makeReflectValue(itf.t, itf.v) +} + +func ext۰reflect۰Zero(fr *frame, args []value) value { + // Signature: func (t reflect.Type) reflect.Value + t := args[0].(iface).v.(rtype).t + return makeReflectValue(t, zero(t)) +} + +func reflectKind(t types.Type) reflect.Kind { + switch t := t.(type) { + case *types.Named: + return reflectKind(t.Underlying()) + case *types.Basic: + switch t.Kind() { + case types.Bool: + return reflect.Bool + case types.Int: + return reflect.Int + case types.Int8: + return reflect.Int8 + case types.Int16: + return reflect.Int16 + case types.Int32: + return reflect.Int32 + case types.Int64: + return reflect.Int64 + case types.Uint: + return reflect.Uint + case types.Uint8: + return reflect.Uint8 + case types.Uint16: + return reflect.Uint16 + case types.Uint32: + return reflect.Uint32 + case types.Uint64: + return reflect.Uint64 + case types.Uintptr: + return reflect.Uintptr + case types.Float32: + return reflect.Float32 + case types.Float64: + return reflect.Float64 + case types.Complex64: + return reflect.Complex64 + case types.Complex128: + return reflect.Complex128 + case types.String: + return reflect.String + case types.UnsafePointer: + return reflect.UnsafePointer + } + case *types.Array: + return reflect.Array + case *types.Chan: + return reflect.Chan + case *types.Signature: + return reflect.Func + case *types.Interface: + return reflect.Interface + case *types.Map: + return reflect.Map + case *types.Pointer: + return reflect.Ptr + case *types.Slice: + return reflect.Slice + case *types.Struct: + return reflect.Struct + } + panic(fmt.Sprint("unexpected type: ", t)) +} + +func ext۰reflect۰Value۰Kind(fr *frame, args []value) value { + // Signature: func (reflect.Value) uint + return uint(reflectKind(rV2T(args[0]).t)) +} + +func ext۰reflect۰Value۰String(fr *frame, args []value) value { + // Signature: func (reflect.Value) string + return toString(rV2V(args[0])) +} + +func ext۰reflect۰Value۰Type(fr *frame, args []value) value { + // Signature: func (reflect.Value) reflect.Type + return makeReflectType(rV2T(args[0])) +} + +func ext۰reflect۰Value۰Uint(fr *frame, args []value) value { + // Signature: func (reflect.Value) uint64 + switch v := rV2V(args[0]).(type) { + case uint: + return uint64(v) + case uint8: + return uint64(v) + case uint16: + return uint64(v) + case uint32: + return uint64(v) + case uint64: + return uint64(v) + case uintptr: + return uint64(v) + } + panic("reflect.Value.Uint") +} + +func ext۰reflect۰Value۰Len(fr *frame, args []value) value { + // Signature: func (reflect.Value) int + switch v := rV2V(args[0]).(type) { + case string: + return len(v) + case array: + return len(v) + case chan value: + return cap(v) + case []value: + return len(v) + case *hashmap: + return v.len() + case map[value]value: + return len(v) + default: + panic(fmt.Sprintf("reflect.(Value).Len(%v)", v)) + } +} + +func ext۰reflect۰Value۰MapIndex(fr *frame, args []value) value { + // Signature: func (reflect.Value) Value + tValue := rV2T(args[0]).t.Underlying().(*types.Map).Key() + k := rV2V(args[1]) + switch m := rV2V(args[0]).(type) { + case map[value]value: + if v, ok := m[k]; ok { + return makeReflectValue(tValue, v) + } + + case *hashmap: + if v := m.lookup(k.(hashable)); v != nil { + return makeReflectValue(tValue, v) + } + + default: + panic(fmt.Sprintf("(reflect.Value).MapIndex(%T, %T)", m, k)) + } + return makeReflectValue(nil, nil) +} + +func ext۰reflect۰Value۰MapKeys(fr *frame, args []value) value { + // Signature: func (reflect.Value) []Value + var keys []value + tKey := rV2T(args[0]).t.Underlying().(*types.Map).Key() + switch v := rV2V(args[0]).(type) { + case map[value]value: + for k := range v { + keys = append(keys, makeReflectValue(tKey, k)) + } + + case *hashmap: + for _, e := range v.table { + for ; e != nil; e = e.next { + keys = append(keys, makeReflectValue(tKey, e.key)) + } + } + + default: + panic(fmt.Sprintf("(reflect.Value).MapKeys(%T)", v)) + } + return keys +} + +func ext۰reflect۰Value۰NumField(fr *frame, args []value) value { + // Signature: func (reflect.Value) int + return len(rV2V(args[0]).(structure)) +} + +func ext۰reflect۰Value۰NumMethod(fr *frame, args []value) value { + // Signature: func (reflect.Value) int + return fr.i.prog.MethodSets.MethodSet(rV2T(args[0]).t).Len() +} + +func ext۰reflect۰Value۰Pointer(fr *frame, args []value) value { + // Signature: func (v reflect.Value) uintptr + switch v := rV2V(args[0]).(type) { + case *value: + return uintptr(unsafe.Pointer(v)) + case chan value: + return reflect.ValueOf(v).Pointer() + case []value: + return reflect.ValueOf(v).Pointer() + case *hashmap: + return reflect.ValueOf(v.table).Pointer() + case map[value]value: + return reflect.ValueOf(v).Pointer() + case *ssa.Function: + return uintptr(unsafe.Pointer(v)) + case *closure: + return uintptr(unsafe.Pointer(v)) + default: + panic(fmt.Sprintf("reflect.(Value).Pointer(%T)", v)) + } +} + +func ext۰reflect۰Value۰Index(fr *frame, args []value) value { + // Signature: func (v reflect.Value, i int) Value + i := args[1].(int) + t := rV2T(args[0]).t.Underlying() + switch v := rV2V(args[0]).(type) { + case array: + return makeReflectValue(t.(*types.Array).Elem(), v[i]) + case []value: + return makeReflectValue(t.(*types.Slice).Elem(), v[i]) + default: + panic(fmt.Sprintf("reflect.(Value).Index(%T)", v)) + } +} + +func ext۰reflect۰Value۰Bool(fr *frame, args []value) value { + // Signature: func (reflect.Value) bool + return rV2V(args[0]).(bool) +} + +func ext۰reflect۰Value۰CanAddr(fr *frame, args []value) value { + // Signature: func (v reflect.Value) bool + // Always false for our representation. + return false +} + +func ext۰reflect۰Value۰CanInterface(fr *frame, args []value) value { + // Signature: func (v reflect.Value) bool + // Always true for our representation. + return true +} + +func ext۰reflect۰Value۰Elem(fr *frame, args []value) value { + // Signature: func (v reflect.Value) reflect.Value + switch x := rV2V(args[0]).(type) { + case iface: + return makeReflectValue(x.t, x.v) + case *value: + return makeReflectValue(rV2T(args[0]).t.Underlying().(*types.Pointer).Elem(), *x) + default: + panic(fmt.Sprintf("reflect.(Value).Elem(%T)", x)) + } +} + +func ext۰reflect۰Value۰Field(fr *frame, args []value) value { + // Signature: func (v reflect.Value, i int) reflect.Value + v := args[0] + i := args[1].(int) + return makeReflectValue(rV2T(v).t.Underlying().(*types.Struct).Field(i).Type(), rV2V(v).(structure)[i]) +} + +func ext۰reflect۰Value۰Float(fr *frame, args []value) value { + // Signature: func (reflect.Value) float64 + switch v := rV2V(args[0]).(type) { + case float32: + return float64(v) + case float64: + return float64(v) + } + panic("reflect.Value.Float") +} + +func ext۰reflect۰Value۰Interface(fr *frame, args []value) value { + // Signature: func (v reflect.Value) interface{} + return ext۰reflect۰valueInterface(fr, args) +} + +func ext۰reflect۰Value۰Int(fr *frame, args []value) value { + // Signature: func (reflect.Value) int64 + switch x := rV2V(args[0]).(type) { + case int: + return int64(x) + case int8: + return int64(x) + case int16: + return int64(x) + case int32: + return int64(x) + case int64: + return x + default: + panic(fmt.Sprintf("reflect.(Value).Int(%T)", x)) + } +} + +func ext۰reflect۰Value۰IsNil(fr *frame, args []value) value { + // Signature: func (reflect.Value) bool + switch x := rV2V(args[0]).(type) { + case *value: + return x == nil + case chan value: + return x == nil + case map[value]value: + return x == nil + case *hashmap: + return x == nil + case iface: + return x.t == nil + case []value: + return x == nil + case *ssa.Function: + return x == nil + case *ssa.Builtin: + return x == nil + case *closure: + return x == nil + default: + panic(fmt.Sprintf("reflect.(Value).IsNil(%T)", x)) + } +} + +func ext۰reflect۰Value۰IsValid(fr *frame, args []value) value { + // Signature: func (reflect.Value) bool + return rV2V(args[0]) != nil +} + +func ext۰reflect۰Value۰Set(fr *frame, args []value) value { + // TODO(adonovan): implement. + return nil +} + +func ext۰reflect۰valueInterface(fr *frame, args []value) value { + // Signature: func (v reflect.Value, safe bool) interface{} + v := args[0].(structure) + return iface{rV2T(v).t, rV2V(v)} +} + +func ext۰reflect۰error۰Error(fr *frame, args []value) value { + return args[0] +} + +// newMethod creates a new method of the specified name, package and receiver type. +func newMethod(pkg *ssa.Package, recvType types.Type, name string) *ssa.Function { + // TODO(adonovan): fix: hack: currently the only part of Signature + // that is needed is the "pointerness" of Recv.Type, and for + // now, we'll set it to always be false since we're only + // concerned with rtype. Encapsulate this better. + sig := types.NewSignature(types.NewVar(token.NoPos, nil, "recv", recvType), nil, nil, false) + fn := pkg.Prog.NewFunction(name, sig, "fake reflect method") + fn.Pkg = pkg + return fn +} + +func initReflect(i *interpreter) { + i.reflectPackage = &ssa.Package{ + Prog: i.prog, + Pkg: reflectTypesPackage, + Members: make(map[string]ssa.Member), + } + + // Clobber the type-checker's notion of reflect.Value's + // underlying type so that it more closely matches the fake one + // (at least in the number of fields---we lie about the type of + // the rtype field). + // + // We must ensure that calls to (ssa.Value).Type() return the + // fake type so that correct "shape" is used when allocating + // variables, making zero values, loading, and storing. + // + // TODO(adonovan): obviously this is a hack. We need a cleaner + // way to fake the reflect package (almost---DeepEqual is fine). + // One approach would be not to even load its source code, but + // provide fake source files. This would guarantee that no bad + // information leaks into other packages. + if r := i.prog.ImportedPackage("reflect"); r != nil { + rV := r.Pkg.Scope().Lookup("Value").Type().(*types.Named) + + // delete bodies of the old methods + mset := i.prog.MethodSets.MethodSet(rV) + for j := 0; j < mset.Len(); j++ { + i.prog.MethodValue(mset.At(j)).Blocks = nil + } + + tEface := types.NewInterface(nil, nil).Complete() + rV.SetUnderlying(types.NewStruct([]*types.Var{ + types.NewField(token.NoPos, r.Pkg, "t", tEface, false), // a lie + types.NewField(token.NoPos, r.Pkg, "v", tEface, false), + }, nil)) + } + + i.rtypeMethods = methodSet{ + "Bits": newMethod(i.reflectPackage, rtypeType, "Bits"), + "Elem": newMethod(i.reflectPackage, rtypeType, "Elem"), + "Field": newMethod(i.reflectPackage, rtypeType, "Field"), + "In": newMethod(i.reflectPackage, rtypeType, "In"), + "Kind": newMethod(i.reflectPackage, rtypeType, "Kind"), + "NumField": newMethod(i.reflectPackage, rtypeType, "NumField"), + "NumIn": newMethod(i.reflectPackage, rtypeType, "NumIn"), + "NumMethod": newMethod(i.reflectPackage, rtypeType, "NumMethod"), + "NumOut": newMethod(i.reflectPackage, rtypeType, "NumOut"), + "Out": newMethod(i.reflectPackage, rtypeType, "Out"), + "Size": newMethod(i.reflectPackage, rtypeType, "Size"), + "String": newMethod(i.reflectPackage, rtypeType, "String"), + } + i.errorMethods = methodSet{ + "Error": newMethod(i.reflectPackage, errorType, "Error"), + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/a_test.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/a_test.go new file mode 100644 index 0000000000..844ec5cdc6 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/testdata/a_test.go @@ -0,0 +1,17 @@ +package a + +import "testing" + +func TestFoo(t *testing.T) { + t.Error("foo") +} + +func TestBar(t *testing.T) { + t.Error("bar") +} + +func BenchmarkWiz(b *testing.B) { + b.Error("wiz") +} + +// Don't test Examples since that testing package needs pipe(2) for that. diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/b_test.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/b_test.go new file mode 100644 index 0000000000..4a30e96a85 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/testdata/b_test.go @@ -0,0 +1,11 @@ +package b + +import "testing" + +func NotATest(t *testing.T) { + t.Error("foo") +} + +func NotABenchmark(b *testing.B) { + b.Error("wiz") +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/boundmeth.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/boundmeth.go new file mode 100644 index 0000000000..255cc60703 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/testdata/boundmeth.go @@ -0,0 +1,144 @@ +// Tests of bound method closures. + +package main + +import "fmt" + +func assert(b bool) { + if !b { + panic("oops") + } +} + +type I int + +func (i I) add(x int) int { + return int(i) + x +} + +func valueReceiver() { + var three I = 3 + assert(three.add(5) == 8) + var add3 func(int) int = three.add + assert(add3(5) == 8) +} + +type S struct{ x int } + +func (s *S) incr() { + s.x++ +} + +func (s *S) get() int { + return s.x +} + +func pointerReceiver() { + ps := new(S) + incr := ps.incr + get := ps.get + assert(get() == 0) + incr() + incr() + incr() + assert(get() == 3) +} + +func addressibleValuePointerReceiver() { + var s S + incr := s.incr + get := s.get + assert(get() == 0) + incr() + incr() + incr() + assert(get() == 3) +} + +type S2 struct { + S +} + +func promotedReceiver() { + var s2 S2 + incr := s2.incr + get := s2.get + assert(get() == 0) + incr() + incr() + incr() + assert(get() == 3) +} + +func anonStruct() { + var s struct{ S } + incr := s.incr + get := s.get + assert(get() == 0) + incr() + incr() + incr() + assert(get() == 3) +} + +func typeCheck() { + var i interface{} + i = (*S).incr + _ = i.(func(*S)) // type assertion: receiver type prepended to params + + var s S + i = s.incr + _ = i.(func()) // type assertion: receiver type disappears +} + +type errString string + +func (err errString) Error() string { + return string(err) +} + +// Regression test for a builder crash. +func regress1(x error) func() string { + return x.Error +} + +// Regression test for b/7269: +// taking the value of an interface method performs a nil check. +func nilInterfaceMethodValue() { + err := fmt.Errorf("ok") + f := err.Error + if got := f(); got != "ok" { + panic(got) + } + + err = nil + if got := f(); got != "ok" { + panic(got) + } + + defer func() { + r := fmt.Sprint(recover()) + // runtime panic string varies across toolchains + if r != "runtime error: interface conversion: interface is nil, not error" && + r != "runtime error: invalid memory address or nil pointer dereference" { + panic("want runtime panic from nil interface method value, got " + r) + } + }() + f = err.Error // runtime panic: err is nil + panic("unreachable") +} + +func main() { + valueReceiver() + pointerReceiver() + addressibleValuePointerReceiver() + promotedReceiver() + anonStruct() + typeCheck() + + if e := regress1(errString("hi"))(); e != "hi" { + panic(e) + } + + nilInterfaceMethodValue() +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/callstack.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/callstack.go new file mode 100644 index 0000000000..56f3b28124 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/testdata/callstack.go @@ -0,0 +1,52 @@ +package main + +import ( + "fmt" + "path" + "runtime" + "strings" +) + +var stack string + +func f() { + pc := make([]uintptr, 6) + pc = pc[:runtime.Callers(1, pc)] + for _, f := range pc { + Func := runtime.FuncForPC(f) + name := Func.Name() + if strings.Contains(name, "$") || strings.Contains(name, ".func") { + name = "func" // anon funcs vary across toolchains + } + file, line := Func.FileLine(0) + stack += fmt.Sprintf("%s at %s:%d\n", name, path.Base(file), line) + } +} + +func g() { f() } +func h() { g() } +func i() { func() { h() }() } + +// Hack: the 'func' and the call to Caller are on the same line, +// to paper over differences between toolchains. +// (The interpreter's location info isn't yet complete.) +func runtimeCaller0() (uintptr, string, int, bool) { return runtime.Caller(0) } + +func main() { + i() + if stack != `main.f at callstack.go:12 +main.g at callstack.go:26 +main.h at callstack.go:27 +func at callstack.go:28 +main.i at callstack.go:28 +main.main at callstack.go:35 +` { + panic("unexpected stack: " + stack) + } + + pc, file, line, _ := runtimeCaller0() + got := fmt.Sprintf("%s @ %s:%d", runtime.FuncForPC(pc).Name(), path.Base(file), line) + if got != "main.runtimeCaller0 @ callstack.go:33" { + panic("runtime.Caller: " + got) + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/complit.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/complit.go new file mode 100644 index 0000000000..7bec5231d4 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/testdata/complit.go @@ -0,0 +1,184 @@ +package main + +// Tests of composite literals. + +import "fmt" + +// Map literals. +func init() { + type M map[int]int + m1 := []*M{{1: 1}, &M{2: 2}} + want := "map[1:1] map[2:2]" + if got := fmt.Sprint(*m1[0], *m1[1]); got != want { + panic(got) + } + m2 := []M{{1: 1}, M{2: 2}} + if got := fmt.Sprint(m2[0], m2[1]); got != want { + panic(got) + } +} + +// Nonliteral keys in composite literal. +func init() { + const zero int = 1 + var v = []int{1 + zero: 42} + if x := fmt.Sprint(v); x != "[0 0 42]" { + panic(x) + } +} + +// Test for in-place initialization. +func init() { + // struct + type S struct { + a, b int + } + s := S{1, 2} + s = S{b: 3} + if s.a != 0 { + panic("s.a != 0") + } + if s.b != 3 { + panic("s.b != 3") + } + s = S{} + if s.a != 0 { + panic("s.a != 0") + } + if s.b != 0 { + panic("s.b != 0") + } + + // array + type A [4]int + a := A{2, 4, 6, 8} + a = A{1: 6, 2: 4} + if a[0] != 0 { + panic("a[0] != 0") + } + if a[1] != 6 { + panic("a[1] != 6") + } + if a[2] != 4 { + panic("a[2] != 4") + } + if a[3] != 0 { + panic("a[3] != 0") + } + a = A{} + if a[0] != 0 { + panic("a[0] != 0") + } + if a[1] != 0 { + panic("a[1] != 0") + } + if a[2] != 0 { + panic("a[2] != 0") + } + if a[3] != 0 { + panic("a[3] != 0") + } +} + +// Regression test for https://github.com/golang/go/issues/10127: +// composite literal clobbers destination before reading from it. +func init() { + // map + { + type M map[string]int + m := M{"x": 1, "y": 2} + m = M{"x": m["y"], "y": m["x"]} + if m["x"] != 2 || m["y"] != 1 { + panic(fmt.Sprint(m)) + } + + n := M{"x": 3} + m, n = M{"x": n["x"]}, M{"x": m["x"]} // parallel assignment + if got := fmt.Sprint(m["x"], n["x"]); got != "3 2" { + panic(got) + } + } + + // struct + { + type T struct{ x, y, z int } + t := T{x: 1, y: 2, z: 3} + + t = T{x: t.y, y: t.z, z: t.x} // all fields + if got := fmt.Sprint(t); got != "{2 3 1}" { + panic(got) + } + + t = T{x: t.y, y: t.z + 3} // not all fields + if got := fmt.Sprint(t); got != "{3 4 0}" { + panic(got) + } + + u := T{x: 5, y: 6, z: 7} + t, u = T{x: u.x}, T{x: t.x} // parallel assignment + if got := fmt.Sprint(t, u); got != "{5 0 0} {3 0 0}" { + panic(got) + } + } + + // array + { + a := [3]int{0: 1, 1: 2, 2: 3} + + a = [3]int{0: a[1], 1: a[2], 2: a[0]} // all elements + if got := fmt.Sprint(a); got != "[2 3 1]" { + panic(got) + } + + a = [3]int{0: a[1], 1: a[2] + 3} // not all elements + if got := fmt.Sprint(a); got != "[3 4 0]" { + panic(got) + } + + b := [3]int{0: 5, 1: 6, 2: 7} + a, b = [3]int{0: b[0]}, [3]int{0: a[0]} // parallel assignment + if got := fmt.Sprint(a, b); got != "[5 0 0] [3 0 0]" { + panic(got) + } + } + + // slice + { + s := []int{0: 1, 1: 2, 2: 3} + + s = []int{0: s[1], 1: s[2], 2: s[0]} // all elements + if got := fmt.Sprint(s); got != "[2 3 1]" { + panic(got) + } + + s = []int{0: s[1], 1: s[2] + 3} // not all elements + if got := fmt.Sprint(s); got != "[3 4]" { + panic(got) + } + + t := []int{0: 5, 1: 6, 2: 7} + s, t = []int{0: t[0]}, []int{0: s[0]} // parallel assignment + if got := fmt.Sprint(s, t); got != "[5] [3]" { + panic(got) + } + } +} + +// Regression test for https://github.com/golang/go/issues/13341: +// within a map literal, if a key expression is a composite literal, +// Go 1.5 allows its type to be omitted. An & operation may be implied. +func init() { + type S struct{ x int } + // same as map[*S]bool{&S{x: 1}: true} + m := map[*S]bool{{x: 1}: true} + for s := range m { + if s.x != 1 { + panic(s) // wrong key + } + return + } + panic("map is empty") +} + +func main() { +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/coverage.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/coverage.go new file mode 100644 index 0000000000..0bc0586c1d --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/testdata/coverage.go @@ -0,0 +1,534 @@ +// This interpreter test is designed to run very quickly yet provide +// some coverage of a broad selection of constructs. +// +// Validate this file with 'go run' after editing. +// TODO(adonovan): break this into small files organized by theme. + +package main + +import ( + "fmt" + "reflect" +) + +func init() { + // Call of variadic function with (implicit) empty slice. + if x := fmt.Sprint(); x != "" { + panic(x) + } +} + +type empty interface{} + +type I interface { + f() int +} + +type T struct{ z int } + +func (t T) f() int { return t.z } + +func use(interface{}) {} + +var counter = 2 + +// Test initialization, including init blocks containing 'return'. +// Assertion is in main. +func init() { + counter *= 3 + return + counter *= 3 +} + +func init() { + counter *= 5 + return + counter *= 5 +} + +// Recursion. +func fib(x int) int { + if x < 2 { + return x + } + return fib(x-1) + fib(x-2) +} + +func fibgen(ch chan int) { + for x := 0; x < 10; x++ { + ch <- fib(x) + } + close(ch) +} + +// Goroutines and channels. +func init() { + ch := make(chan int) + go fibgen(ch) + var fibs []int + for v := range ch { + fibs = append(fibs, v) + if len(fibs) == 10 { + break + } + } + if x := fmt.Sprint(fibs); x != "[0 1 1 2 3 5 8 13 21 34]" { + panic(x) + } +} + +// Test of aliasing. +func init() { + type S struct { + a, b string + } + + s1 := []string{"foo", "bar"} + s2 := s1 // creates an alias + s2[0] = "wiz" + if x := fmt.Sprint(s1, s2); x != "[wiz bar] [wiz bar]" { + panic(x) + } + + pa1 := &[2]string{"foo", "bar"} + pa2 := pa1 // creates an alias + pa2[0] = "wiz" + if x := fmt.Sprint(*pa1, *pa2); x != "[wiz bar] [wiz bar]" { + panic(x) + } + + a1 := [2]string{"foo", "bar"} + a2 := a1 // creates a copy + a2[0] = "wiz" + if x := fmt.Sprint(a1, a2); x != "[foo bar] [wiz bar]" { + panic(x) + } + + t1 := S{"foo", "bar"} + t2 := t1 // copy + t2.a = "wiz" + if x := fmt.Sprint(t1, t2); x != "{foo bar} {wiz bar}" { + panic(x) + } +} + +func main() { + print() // legal + + if counter != 2*3*5 { + panic(counter) + } + + // Test builtins (e.g. complex) preserve named argument types. + type N complex128 + var n N + n = complex(1.0, 2.0) + if n != complex(1.0, 2.0) { + panic(n) + } + if x := reflect.TypeOf(n).String(); x != "main.N" { + panic(x) + } + if real(n) != 1.0 || imag(n) != 2.0 { + panic(n) + } + + // Channel + select. + ch := make(chan int, 1) + select { + case ch <- 1: + // ok + default: + panic("couldn't send") + } + if <-ch != 1 { + panic("couldn't receive") + } + // A "receive" select-case that doesn't declare its vars. (regression test) + anint := 0 + ok := false + select { + case anint, ok = <-ch: + case anint = <-ch: + default: + } + _ = anint + _ = ok + + // Anon structs with methods. + anon := struct{ T }{T: T{z: 1}} + if x := anon.f(); x != 1 { + panic(x) + } + var i I = anon + if x := i.f(); x != 1 { + panic(x) + } + // NB. precise output of reflect.Type.String is undefined. + if x := reflect.TypeOf(i).String(); x != "struct { main.T }" && x != "struct{main.T}" { + panic(x) + } + + // fmt. + const message = "Hello, World!" + if fmt.Sprintf("%s, %s!", "Hello", "World") != message { + panic("oops") + } + + // Type assertion. + type S struct { + f int + } + var e empty = S{f: 42} + switch v := e.(type) { + case S: + if v.f != 42 { + panic(v.f) + } + default: + panic(reflect.TypeOf(v)) + } + if i, ok := e.(I); ok { + panic(i) + } + + // Switch. + var x int + switch x { + case 1: + panic(x) + fallthrough + case 2, 3: + panic(x) + default: + // ok + } + // empty switch + switch { + } + // empty switch + switch { + default: + } + // empty switch + switch { + default: + fallthrough + case false: + } + + // string -> []rune conversion. + use([]rune("foo")) + + // Calls of form x.f(). + type S2 struct { + f func() int + } + S2{f: func() int { return 1 }}.f() // field is a func value + T{}.f() // method call + i.f() // interface method invocation + (interface { + f() int + }(T{})).f() // anon interface method invocation + + // Map lookup. + if v, ok := map[string]string{}["foo5"]; v != "" || ok { + panic("oops") + } + + // Regression test: implicit address-taken struct literal + // inside literal map element. + _ = map[int]*struct{}{0: {}} +} + +type mybool bool + +func (mybool) f() {} + +func init() { + type mybool bool + var b mybool + var i interface{} = b || b // result preserves types of operands + _ = i.(mybool) + + i = false && b // result preserves type of "typed" operand + _ = i.(mybool) + + i = b || true // result preserves type of "typed" operand + _ = i.(mybool) +} + +func init() { + var x, y int + var b mybool = x == y // x==y is an untyped bool + b.f() +} + +// Simple closures. +func init() { + b := 3 + f := func(a int) int { + return a + b + } + b++ + if x := f(1); x != 5 { // 1+4 == 5 + panic(x) + } + b++ + if x := f(2); x != 7 { // 2+5 == 7 + panic(x) + } + if b := f(1) < 16 || f(2) < 17; !b { + panic("oops") + } +} + +// Shifts. +func init() { + var i int64 = 1 + var u uint64 = 1 << 32 + if x := i << uint32(u); x != 1 { + panic(x) + } + if x := i << uint64(u); x != 0 { + panic(x) + } +} + +// Implicit conversion of delete() key operand. +func init() { + type I interface{} + m := make(map[I]bool) + m[1] = true + m[I(2)] = true + if len(m) != 2 { + panic(m) + } + delete(m, I(1)) + delete(m, 2) + if len(m) != 0 { + panic(m) + } +} + +// An I->I conversion always succeeds. +func init() { + var x I + if I(x) != I(nil) { + panic("I->I conversion failed") + } +} + +// An I->I type-assert fails iff the value is nil. +func init() { + defer func() { + r := fmt.Sprint(recover()) + // Exact error varies by toolchain. + if r != "runtime error: interface conversion: interface is nil, not main.I" && + r != "interface conversion: interface is nil, not main.I" { + panic("I->I type assertion succeeded for nil value") + } + }() + var x I + _ = x.(I) +} + +////////////////////////////////////////////////////////////////////// +// Variadic bridge methods and interface thunks. + +type VT int + +var vcount = 0 + +func (VT) f(x int, y ...string) { + vcount++ + if x != 1 { + panic(x) + } + if len(y) != 2 || y[0] != "foo" || y[1] != "bar" { + panic(y) + } +} + +type VS struct { + VT +} + +type VI interface { + f(x int, y ...string) +} + +func init() { + foobar := []string{"foo", "bar"} + var s VS + s.f(1, "foo", "bar") + s.f(1, foobar...) + if vcount != 2 { + panic("s.f not called twice") + } + + fn := VI.f + fn(s, 1, "foo", "bar") + fn(s, 1, foobar...) + if vcount != 4 { + panic("I.f not called twice") + } +} + +// Multiple labels on same statement. +func multipleLabels() { + var trace []int + i := 0 +one: +two: + for ; i < 3; i++ { + trace = append(trace, i) + switch i { + case 0: + continue two + case 1: + i++ + goto one + case 2: + break two + } + } + if x := fmt.Sprint(trace); x != "[0 1 2]" { + panic(x) + } +} + +func init() { + multipleLabels() +} + +func init() { + // Struct equivalence ignores blank fields. + type s struct{ x, _, z int } + s1 := s{x: 1, z: 3} + s2 := s{x: 1, z: 3} + if s1 != s2 { + panic("not equal") + } +} + +func init() { + // A slice var can be compared to const []T nil. + var i interface{} = []string{"foo"} + var j interface{} = []string(nil) + if i.([]string) == nil { + panic("expected i non-nil") + } + if j.([]string) != nil { + panic("expected j nil") + } + // But two slices cannot be compared, even if one is nil. + defer func() { + r := fmt.Sprint(recover()) + if r != "runtime error: comparing uncomparable type []string" { + panic("want panic from slice comparison, got " + r) + } + }() + _ = i == j // interface comparison recurses on types +} + +func init() { + // Regression test for SSA renaming bug. + var ints []int + for _ = range "foo" { + var x int + x++ + ints = append(ints, x) + } + if fmt.Sprint(ints) != "[1 1 1]" { + panic(ints) + } +} + +// Regression test for issue 6949: +// []byte("foo") is not a constant since it allocates memory. +func init() { + var r string + for i, b := range "ABC" { + x := []byte("abc") + x[i] = byte(b) + r += string(x) + } + if r != "AbcaBcabC" { + panic(r) + } +} + +// Test of 3-operand x[lo:hi:max] slice. +func init() { + s := []int{0, 1, 2, 3} + lenCapLoHi := func(x []int) [4]int { return [4]int{len(x), cap(x), x[0], x[len(x)-1]} } + if got := lenCapLoHi(s[1:3]); got != [4]int{2, 3, 1, 2} { + panic(got) + } + if got := lenCapLoHi(s[1:3:3]); got != [4]int{2, 2, 1, 2} { + panic(got) + } + max := 3 + if "a"[0] == 'a' { + max = 2 // max is non-constant, even in SSA form + } + if got := lenCapLoHi(s[1:2:max]); got != [4]int{1, 1, 1, 1} { + panic(got) + } +} + +var one = 1 // not a constant + +// Test makeslice. +func init() { + check := func(s []string, wantLen, wantCap int) { + if len(s) != wantLen { + panic(len(s)) + } + if cap(s) != wantCap { + panic(cap(s)) + } + } + // SSA form: + check(make([]string, 10), 10, 10) // new([10]string)[:10] + check(make([]string, one), 1, 1) // make([]string, one, one) + check(make([]string, 0, 10), 0, 10) // new([10]string)[:0] + check(make([]string, 0, one), 0, 1) // make([]string, 0, one) + check(make([]string, one, 10), 1, 10) // new([10]string)[:one] + check(make([]string, one, one), 1, 1) // make([]string, one, one) +} + +// Test that a nice error is issued by indirection wrappers. +func init() { + var ptr *T + var i I = ptr + + defer func() { + r := fmt.Sprint(recover()) + // Exact error varies by toolchain: + if r != "runtime error: value method (main.T).f called using nil *main.T pointer" && + r != "value method main.T.f called using nil *T pointer" { + panic("want panic from call with nil receiver, got " + r) + } + }() + i.f() + panic("unreachable") +} + +// Regression test for a subtle bug in which copying values would causes +// subcomponents of aggregate variables to change address, breaking +// aliases. +func init() { + type T struct{ f int } + var x T + p := &x.f + x = T{} + *p = 1 + if x.f != 1 { + panic("lost store") + } + if p != &x.f { + panic("unstable address") + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/defer.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/defer.go new file mode 100644 index 0000000000..f5bae6c3f4 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/testdata/defer.go @@ -0,0 +1,53 @@ +package main + +// Tests of defer. (Deferred recover() belongs is recover.go.) + +import "fmt" + +func deferMutatesResults(noArgReturn bool) (a, b int) { + defer func() { + if a != 1 || b != 2 { + panic(fmt.Sprint(a, b)) + } + a, b = 3, 4 + }() + if noArgReturn { + a, b = 1, 2 + return + } + return 1, 2 +} + +func init() { + a, b := deferMutatesResults(true) + if a != 3 || b != 4 { + panic(fmt.Sprint(a, b)) + } + a, b = deferMutatesResults(false) + if a != 3 || b != 4 { + panic(fmt.Sprint(a, b)) + } +} + +// We concatenate init blocks to make a single function, but we must +// run defers at the end of each block, not the combined function. +var deferCount = 0 + +func init() { + deferCount = 1 + defer func() { + deferCount++ + }() + // defer runs HERE +} + +func init() { + // Strictly speaking the spec says deferCount may be 0 or 2 + // since the relative order of init blocks is unspecified. + if deferCount != 2 { + panic(deferCount) // defer call has not run! + } +} + +func main() { +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/fieldprom.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/fieldprom.go new file mode 100644 index 0000000000..fc276ddbf0 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/testdata/fieldprom.go @@ -0,0 +1,114 @@ +package main + +// Tests of field promotion logic. + +type A struct { + x int + y *int +} + +type B struct { + p int + q *int +} + +type C struct { + A + *B +} + +type D struct { + a int + C +} + +func assert(cond bool) { + if !cond { + panic("failed") + } +} + +func f1(c C) { + assert(c.x == c.A.x) + assert(c.y == c.A.y) + assert(&c.x == &c.A.x) + assert(&c.y == &c.A.y) + + assert(c.p == c.B.p) + assert(c.q == c.B.q) + assert(&c.p == &c.B.p) + assert(&c.q == &c.B.q) + + c.x = 1 + *c.y = 1 + c.p = 1 + *c.q = 1 +} + +func f2(c *C) { + assert(c.x == c.A.x) + assert(c.y == c.A.y) + assert(&c.x == &c.A.x) + assert(&c.y == &c.A.y) + + assert(c.p == c.B.p) + assert(c.q == c.B.q) + assert(&c.p == &c.B.p) + assert(&c.q == &c.B.q) + + c.x = 1 + *c.y = 1 + c.p = 1 + *c.q = 1 +} + +func f3(d D) { + assert(d.x == d.C.A.x) + assert(d.y == d.C.A.y) + assert(&d.x == &d.C.A.x) + assert(&d.y == &d.C.A.y) + + assert(d.p == d.C.B.p) + assert(d.q == d.C.B.q) + assert(&d.p == &d.C.B.p) + assert(&d.q == &d.C.B.q) + + d.x = 1 + *d.y = 1 + d.p = 1 + *d.q = 1 +} + +func f4(d *D) { + assert(d.x == d.C.A.x) + assert(d.y == d.C.A.y) + assert(&d.x == &d.C.A.x) + assert(&d.y == &d.C.A.y) + + assert(d.p == d.C.B.p) + assert(d.q == d.C.B.q) + assert(&d.p == &d.C.B.p) + assert(&d.q == &d.C.B.q) + + d.x = 1 + *d.y = 1 + d.p = 1 + *d.q = 1 +} + +func main() { + y := 123 + c := C{ + A{x: 42, y: &y}, + &B{p: 42, q: &y}, + } + + assert(&c.x == &c.A.x) + + f1(c) + f2(&c) + + d := D{C: c} + f3(d) + f4(&d) +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/ifaceconv.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/ifaceconv.go new file mode 100644 index 0000000000..96fc105862 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/testdata/ifaceconv.go @@ -0,0 +1,83 @@ +package main + +// Tests of interface conversions and type assertions. + +type I0 interface { +} +type I1 interface { + f() +} +type I2 interface { + f() + g() +} + +type C0 struct{} +type C1 struct{} + +func (C1) f() {} + +type C2 struct{} + +func (C2) f() {} +func (C2) g() {} + +func main() { + var i0 I0 + var i1 I1 + var i2 I2 + + // Nil always causes a type assertion to fail, even to the + // same type. + if _, ok := i0.(I0); ok { + panic("nil i0.(I0) succeeded") + } + if _, ok := i1.(I1); ok { + panic("nil i1.(I1) succeeded") + } + if _, ok := i2.(I2); ok { + panic("nil i2.(I2) succeeded") + } + + // Conversions can't fail, even with nil. + _ = I0(i0) + + _ = I0(i1) + _ = I1(i1) + + _ = I0(i2) + _ = I1(i2) + _ = I2(i2) + + // Non-nil type assertions pass or fail based on the concrete type. + i1 = C1{} + if _, ok := i1.(I0); !ok { + panic("C1 i1.(I0) failed") + } + if _, ok := i1.(I1); !ok { + panic("C1 i1.(I1) failed") + } + if _, ok := i1.(I2); ok { + panic("C1 i1.(I2) succeeded") + } + + i1 = C2{} + if _, ok := i1.(I0); !ok { + panic("C2 i1.(I0) failed") + } + if _, ok := i1.(I1); !ok { + panic("C2 i1.(I1) failed") + } + if _, ok := i1.(I2); !ok { + panic("C2 i1.(I2) failed") + } + + // Conversions can't fail. + i1 = C1{} + if I0(i1) == nil { + panic("C1 I0(i1) was nil") + } + if I1(i1) == nil { + panic("C1 I1(i1) was nil") + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/ifaceprom.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/ifaceprom.go new file mode 100644 index 0000000000..414dc73636 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/testdata/ifaceprom.go @@ -0,0 +1,58 @@ +package main + +// Test of promotion of methods of an interface embedded within a +// struct. In particular, this test exercises that the correct +// method is called. + +type I interface { + one() int + two() string +} + +type S struct { + I +} + +type impl struct{} + +func (impl) one() int { + return 1 +} + +func (impl) two() string { + return "two" +} + +func main() { + var s S + s.I = impl{} + if one := s.I.one(); one != 1 { + panic(one) + } + if one := s.one(); one != 1 { + panic(one) + } + closOne := s.I.one + if one := closOne(); one != 1 { + panic(one) + } + closOne = s.one + if one := closOne(); one != 1 { + panic(one) + } + + if two := s.I.two(); two != "two" { + panic(two) + } + if two := s.two(); two != "two" { + panic(two) + } + closTwo := s.I.two + if two := closTwo(); two != "two" { + panic(two) + } + closTwo = s.two + if two := closTwo(); two != "two" { + panic(two) + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/initorder.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/initorder.go new file mode 100644 index 0000000000..0f26bed695 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/testdata/initorder.go @@ -0,0 +1,67 @@ +package main + +import "fmt" + +// Test of initialization order of package-level vars. + +var counter int + +func next() int { + c := counter + counter++ + return c +} + +func next2() (x int, y int) { + x = next() + y = next() + return +} + +func makeOrder() int { + _, _, _, _ = f, b, d, e + return 0 +} + +func main() { + // Initialization constraints: + // - {f,b,c/d,e} < order (ref graph traversal) + // - order < {a} (lexical order) + // - b < c/d < e < f (lexical order) + // Solution: a b c/d e f + abcdef := [6]int{a, b, c, d, e, f} + if abcdef != [6]int{0, 1, 2, 3, 4, 5} { + panic(abcdef) + } +} + +var order = makeOrder() + +var a, b = next(), next() +var c, d = next2() +var e, f = next(), next() + +// ------------------------------------------------------------------------ + +var order2 []string + +func create(x int, name string) int { + order2 = append(order2, name) + return x +} + +var C = create(B+1, "C") +var A, B = create(1, "A"), create(2, "B") + +// Initialization order of package-level value specs. +func init() { + x := fmt.Sprint(order2) + // Result varies by toolchain. This is a spec bug. + if x != "[B C A]" && // gc + x != "[A B C]" { // go/types + panic(x) + } + if C != 3 { + panic(c) + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/methprom.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/methprom.go new file mode 100644 index 0000000000..e8e384c311 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/testdata/methprom.go @@ -0,0 +1,93 @@ +package main + +// Tests of method promotion logic. + +type A struct{ magic int } + +func (a A) x() { + if a.magic != 1 { + panic(a.magic) + } +} +func (a *A) y() *A { + return a +} + +type B struct{ magic int } + +func (b B) p() { + if b.magic != 2 { + panic(b.magic) + } +} +func (b *B) q() { + if b != theC.B { + panic("oops") + } +} + +type I interface { + f() +} + +type impl struct{ magic int } + +func (i impl) f() { + if i.magic != 3 { + panic("oops") + } +} + +type C struct { + A + *B + I +} + +func assert(cond bool) { + if !cond { + panic("failed") + } +} + +var theC = C{ + A: A{1}, + B: &B{2}, + I: impl{3}, +} + +func addr() *C { + return &theC +} + +func value() C { + return theC +} + +func main() { + // address + addr().x() + if addr().y() != &theC.A { + panic("oops") + } + addr().p() + addr().q() + addr().f() + + // addressable value + var c C = value() + c.x() + if c.y() != &c.A { + panic("oops") + } + c.p() + c.q() + c.f() + + // non-addressable value + value().x() + // value().y() // not in method set + value().p() + value().q() + value().f() +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/mrvchain.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/mrvchain.go new file mode 100644 index 0000000000..70dfd02732 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/testdata/mrvchain.go @@ -0,0 +1,75 @@ +// Tests of call chaining f(g()) when g has multiple return values (MRVs). +// See https://code.google.com/p/go/issues/detail?id=4573. + +package main + +func assert(actual, expected int) { + if actual != expected { + panic(actual) + } +} + +func g() (int, int) { + return 5, 7 +} + +func g2() (float64, float64) { + return 5, 7 +} + +func f1v(x int, v ...int) { + assert(x, 5) + assert(v[0], 7) +} + +func f2(x, y int) { + assert(x, 5) + assert(y, 7) +} + +func f2v(x, y int, v ...int) { + assert(x, 5) + assert(y, 7) + assert(len(v), 0) +} + +func complexArgs() (float64, float64) { + return 5, 7 +} + +func appendArgs() ([]string, string) { + return []string{"foo"}, "bar" +} + +func h() (i interface{}, ok bool) { + m := map[int]string{1: "hi"} + i, ok = m[1] // string->interface{} conversion within multi-valued expression + return +} + +func h2() (i interface{}, ok bool) { + ch := make(chan string, 1) + ch <- "hi" + i, ok = <-ch // string->interface{} conversion within multi-valued expression + return +} + +func main() { + f1v(g()) + f2(g()) + f2v(g()) + if c := complex(complexArgs()); c != 5+7i { + panic(c) + } + if s := append(appendArgs()); len(s) != 2 || s[0] != "foo" || s[1] != "bar" { + panic(s) + } + i, ok := h() + if !ok || i.(string) != "hi" { + panic(i) + } + i, ok = h2() + if !ok || i.(string) != "hi" { + panic(i) + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/range.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/range.go new file mode 100644 index 0000000000..da8a421e62 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/testdata/range.go @@ -0,0 +1,55 @@ +package main + +// Tests of range loops. + +import "fmt" + +// Range over string. +func init() { + if x := len("Hello, 世界"); x != 13 { // bytes + panic(x) + } + var indices []int + var runes []rune + for i, r := range "Hello, 世界" { + runes = append(runes, r) + indices = append(indices, i) + } + if x := fmt.Sprint(runes); x != "[72 101 108 108 111 44 32 19990 30028]" { + panic(x) + } + if x := fmt.Sprint(indices); x != "[0 1 2 3 4 5 6 7 10]" { + panic(x) + } + s := "" + for _, r := range runes { + s = fmt.Sprintf("%s%c", s, r) + } + if s != "Hello, 世界" { + panic(s) + } + + var x int + for range "Hello, 世界" { + x++ + } + if x != len(indices) { + panic(x) + } +} + +// Regression test for range of pointer to named array type. +func init() { + type intarr [3]int + ia := intarr{1, 2, 3} + var count int + for _, x := range &ia { + count += x + } + if count != 6 { + panic(count) + } +} + +func main() { +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/recover.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/recover.go new file mode 100644 index 0000000000..b560052263 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/testdata/recover.go @@ -0,0 +1,34 @@ +package main + +// Tests of panic/recover. + +import "fmt" + +func fortyTwo() (r int) { + r = 42 + // The next two statements simulate a 'return' statement. + defer func() { recover() }() + panic(nil) +} + +func zero() int { + defer func() { recover() }() + panic(1) +} + +func zeroEmpty() (int, string) { + defer func() { recover() }() + panic(1) +} + +func main() { + if r := fortyTwo(); r != 42 { + panic(r) + } + if r := zero(); r != 0 { + panic(r) + } + if r, s := zeroEmpty(); r != 0 || s != "" { + panic(fmt.Sprint(r, s)) + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/reflect.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/reflect.go new file mode 100644 index 0000000000..6aa9a67a45 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/testdata/reflect.go @@ -0,0 +1,11 @@ +package main + +import "reflect" + +func main() { + // Regression test for issue 9462. + got := reflect.SliceOf(reflect.TypeOf(byte(0))).String() + if got != "[]uint8" && got != "[]byte" { // result varies by toolchain + println("BUG: " + got) + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/testdata/static.go b/vendor/golang.org/x/tools/go/ssa/interp/testdata/static.go new file mode 100644 index 0000000000..b115513c63 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/testdata/static.go @@ -0,0 +1,58 @@ +package main + +// Static tests of SSA builder (via the sanity checker). +// Dynamic semantics are not exercised. + +func init() { + // Regression test for issue 6806. + ch := make(chan int) + select { + case n, _ := <-ch: + _ = n + default: + // The default case disables the simplification of + // select to a simple receive statement. + } + + // value,ok-form receive where TypeOf(ok) is a named boolean. + type mybool bool + var x int + var y mybool + select { + case x, y = <-ch: + default: + // The default case disables the simplification of + // select to a simple receive statement. + } + _ = x + _ = y +} + +var a int + +// Regression test for issue 7840 (covered by SSA sanity checker). +func bug7840() bool { + // This creates a single-predecessor block with a φ-node. + return false && a == 0 && a == 0 +} + +// A blocking select (sans "default:") cannot fall through. +// Regression test for issue 7022. +func bug7022() int { + var c1, c2 chan int + select { + case <-c1: + return 123 + case <-c2: + return 456 + } +} + +// Parens should not prevent intrinsic treatment of built-ins. +// (Regression test for a crash.) +func init() { + _ = (new)(int) + _ = (make)([]int, 0) +} + +func main() {} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/value.go b/vendor/golang.org/x/tools/go/ssa/interp/value.go new file mode 100644 index 0000000000..2194b013f5 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/value.go @@ -0,0 +1,499 @@ +// Copyright 2013 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.5 + +package interp + +// Values +// +// All interpreter values are "boxed" in the empty interface, value. +// The range of possible dynamic types within value are: +// +// - bool +// - numbers (all built-in int/float/complex types are distinguished) +// - string +// - map[value]value --- maps for which usesBuiltinMap(keyType) +// *hashmap --- maps for which !usesBuiltinMap(keyType) +// - chan value +// - []value --- slices +// - iface --- interfaces. +// - structure --- structs. Fields are ordered and accessed by numeric indices. +// - array --- arrays. +// - *value --- pointers. Careful: *value is a distinct type from *array etc. +// - *ssa.Function \ +// *ssa.Builtin } --- functions. A nil 'func' is always of type *ssa.Function. +// *closure / +// - tuple --- as returned by Return, Next, "value,ok" modes, etc. +// - iter --- iterators from 'range' over map or string. +// - bad --- a poison pill for locals that have gone out of scope. +// - rtype -- the interpreter's concrete implementation of reflect.Type +// +// Note that nil is not on this list. +// +// Pay close attention to whether or not the dynamic type is a pointer. +// The compiler cannot help you since value is an empty interface. + +import ( + "bytes" + "fmt" + "go/types" + "io" + "reflect" + "strings" + "sync" + "unsafe" + + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types/typeutil" +) + +type value interface{} + +type tuple []value + +type array []value + +type iface struct { + t types.Type // never an "untyped" type + v value +} + +type structure []value + +// For map, array, *array, slice, string or channel. +type iter interface { + // next returns a Tuple (key, value, ok). + // key and value are unaliased, e.g. copies of the sequence element. + next() tuple +} + +type closure struct { + Fn *ssa.Function + Env []value +} + +type bad struct{} + +type rtype struct { + t types.Type +} + +// Hash functions and equivalence relation: + +// hashString computes the FNV hash of s. +func hashString(s string) int { + var h uint32 + for i := 0; i < len(s); i++ { + h ^= uint32(s[i]) + h *= 16777619 + } + return int(h) +} + +var ( + mu sync.Mutex + hasher = typeutil.MakeHasher() +) + +// hashType returns a hash for t such that +// types.Identical(x, y) => hashType(x) == hashType(y). +func hashType(t types.Type) int { + mu.Lock() + h := int(hasher.Hash(t)) + mu.Unlock() + return h +} + +// usesBuiltinMap returns true if the built-in hash function and +// equivalence relation for type t are consistent with those of the +// interpreter's representation of type t. Such types are: all basic +// types (bool, numbers, string), pointers and channels. +// +// usesBuiltinMap returns false for types that require a custom map +// implementation: interfaces, arrays and structs. +// +// Panic ensues if t is an invalid map key type: function, map or slice. +func usesBuiltinMap(t types.Type) bool { + switch t := t.(type) { + case *types.Basic, *types.Chan, *types.Pointer: + return true + case *types.Named: + return usesBuiltinMap(t.Underlying()) + case *types.Interface, *types.Array, *types.Struct: + return false + } + panic(fmt.Sprintf("invalid map key type: %T", t)) +} + +func (x array) eq(t types.Type, _y interface{}) bool { + y := _y.(array) + tElt := t.Underlying().(*types.Array).Elem() + for i, xi := range x { + if !equals(tElt, xi, y[i]) { + return false + } + } + return true +} + +func (x array) hash(t types.Type) int { + h := 0 + tElt := t.Underlying().(*types.Array).Elem() + for _, xi := range x { + h += hash(tElt, xi) + } + return h +} + +func (x structure) eq(t types.Type, _y interface{}) bool { + y := _y.(structure) + tStruct := t.Underlying().(*types.Struct) + for i, n := 0, tStruct.NumFields(); i < n; i++ { + if f := tStruct.Field(i); !f.Anonymous() { + if !equals(f.Type(), x[i], y[i]) { + return false + } + } + } + return true +} + +func (x structure) hash(t types.Type) int { + tStruct := t.Underlying().(*types.Struct) + h := 0 + for i, n := 0, tStruct.NumFields(); i < n; i++ { + if f := tStruct.Field(i); !f.Anonymous() { + h += hash(f.Type(), x[i]) + } + } + return h +} + +// nil-tolerant variant of types.Identical. +func sameType(x, y types.Type) bool { + if x == nil { + return y == nil + } + return y != nil && types.Identical(x, y) +} + +func (x iface) eq(t types.Type, _y interface{}) bool { + y := _y.(iface) + return sameType(x.t, y.t) && (x.t == nil || equals(x.t, x.v, y.v)) +} + +func (x iface) hash(_ types.Type) int { + return hashType(x.t)*8581 + hash(x.t, x.v) +} + +func (x rtype) hash(_ types.Type) int { + return hashType(x.t) +} + +func (x rtype) eq(_ types.Type, y interface{}) bool { + return types.Identical(x.t, y.(rtype).t) +} + +// equals returns true iff x and y are equal according to Go's +// linguistic equivalence relation for type t. +// In a well-typed program, the dynamic types of x and y are +// guaranteed equal. +func equals(t types.Type, x, y value) bool { + switch x := x.(type) { + case bool: + return x == y.(bool) + case int: + return x == y.(int) + case int8: + return x == y.(int8) + case int16: + return x == y.(int16) + case int32: + return x == y.(int32) + case int64: + return x == y.(int64) + case uint: + return x == y.(uint) + case uint8: + return x == y.(uint8) + case uint16: + return x == y.(uint16) + case uint32: + return x == y.(uint32) + case uint64: + return x == y.(uint64) + case uintptr: + return x == y.(uintptr) + case float32: + return x == y.(float32) + case float64: + return x == y.(float64) + case complex64: + return x == y.(complex64) + case complex128: + return x == y.(complex128) + case string: + return x == y.(string) + case *value: + return x == y.(*value) + case chan value: + return x == y.(chan value) + case structure: + return x.eq(t, y) + case array: + return x.eq(t, y) + case iface: + return x.eq(t, y) + case rtype: + return x.eq(t, y) + } + + // Since map, func and slice don't support comparison, this + // case is only reachable if one of x or y is literally nil + // (handled in eqnil) or via interface{} values. + panic(fmt.Sprintf("comparing uncomparable type %s", t)) +} + +// Returns an integer hash of x such that equals(x, y) => hash(x) == hash(y). +func hash(t types.Type, x value) int { + switch x := x.(type) { + case bool: + if x { + return 1 + } + return 0 + case int: + return x + case int8: + return int(x) + case int16: + return int(x) + case int32: + return int(x) + case int64: + return int(x) + case uint: + return int(x) + case uint8: + return int(x) + case uint16: + return int(x) + case uint32: + return int(x) + case uint64: + return int(x) + case uintptr: + return int(x) + case float32: + return int(x) + case float64: + return int(x) + case complex64: + return int(real(x)) + case complex128: + return int(real(x)) + case string: + return hashString(x) + case *value: + return int(uintptr(unsafe.Pointer(x))) + case chan value: + return int(uintptr(reflect.ValueOf(x).Pointer())) + case structure: + return x.hash(t) + case array: + return x.hash(t) + case iface: + return x.hash(t) + case rtype: + return x.hash(t) + } + panic(fmt.Sprintf("%T is unhashable", x)) +} + +// reflect.Value struct values don't have a fixed shape, since the +// payload can be a scalar or an aggregate depending on the instance. +// So store (and load) can't simply use recursion over the shape of the +// rhs value, or the lhs, to copy the value; we need the static type +// information. (We can't make reflect.Value a new basic data type +// because its "structness" is exposed to Go programs.) + +// load returns the value of type T in *addr. +func load(T types.Type, addr *value) value { + switch T := T.Underlying().(type) { + case *types.Struct: + v := (*addr).(structure) + a := make(structure, len(v)) + for i := range a { + a[i] = load(T.Field(i).Type(), &v[i]) + } + return a + case *types.Array: + v := (*addr).(array) + a := make(array, len(v)) + for i := range a { + a[i] = load(T.Elem(), &v[i]) + } + return a + default: + return *addr + } +} + +// store stores value v of type T into *addr. +func store(T types.Type, addr *value, v value) { + switch T := T.Underlying().(type) { + case *types.Struct: + lhs := (*addr).(structure) + rhs := v.(structure) + for i := range lhs { + store(T.Field(i).Type(), &lhs[i], rhs[i]) + } + case *types.Array: + lhs := (*addr).(array) + rhs := v.(array) + for i := range lhs { + store(T.Elem(), &lhs[i], rhs[i]) + } + default: + *addr = v + } +} + +// Prints in the style of built-in println. +// (More or less; in gc println is actually a compiler intrinsic and +// can distinguish println(1) from println(interface{}(1)).) +func writeValue(buf *bytes.Buffer, v value) { + switch v := v.(type) { + case nil, bool, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr, float32, float64, complex64, complex128, string: + fmt.Fprintf(buf, "%v", v) + + case map[value]value: + buf.WriteString("map[") + sep := "" + for k, e := range v { + buf.WriteString(sep) + sep = " " + writeValue(buf, k) + buf.WriteString(":") + writeValue(buf, e) + } + buf.WriteString("]") + + case *hashmap: + buf.WriteString("map[") + sep := " " + for _, e := range v.table { + for e != nil { + buf.WriteString(sep) + sep = " " + writeValue(buf, e.key) + buf.WriteString(":") + writeValue(buf, e.value) + e = e.next + } + } + buf.WriteString("]") + + case chan value: + fmt.Fprintf(buf, "%v", v) // (an address) + + case *value: + if v == nil { + buf.WriteString("") + } else { + fmt.Fprintf(buf, "%p", v) + } + + case iface: + fmt.Fprintf(buf, "(%s, ", v.t) + writeValue(buf, v.v) + buf.WriteString(")") + + case structure: + buf.WriteString("{") + for i, e := range v { + if i > 0 { + buf.WriteString(" ") + } + writeValue(buf, e) + } + buf.WriteString("}") + + case array: + buf.WriteString("[") + for i, e := range v { + if i > 0 { + buf.WriteString(" ") + } + writeValue(buf, e) + } + buf.WriteString("]") + + case []value: + buf.WriteString("[") + for i, e := range v { + if i > 0 { + buf.WriteString(" ") + } + writeValue(buf, e) + } + buf.WriteString("]") + + case *ssa.Function, *ssa.Builtin, *closure: + fmt.Fprintf(buf, "%p", v) // (an address) + + case rtype: + buf.WriteString(v.t.String()) + + case tuple: + // Unreachable in well-formed Go programs + buf.WriteString("(") + for i, e := range v { + if i > 0 { + buf.WriteString(", ") + } + writeValue(buf, e) + } + buf.WriteString(")") + + default: + fmt.Fprintf(buf, "<%T>", v) + } +} + +// Implements printing of Go values in the style of built-in println. +func toString(v value) string { + var b bytes.Buffer + writeValue(&b, v) + return b.String() +} + +// ------------------------------------------------------------------------ +// Iterators + +type stringIter struct { + *strings.Reader + i int +} + +func (it *stringIter) next() tuple { + okv := make(tuple, 3) + ch, n, err := it.ReadRune() + ok := err != io.EOF + okv[0] = ok + if ok { + okv[1] = it.i + okv[2] = ch + } + it.i += n + return okv +} + +type mapIter chan [2]value + +func (it mapIter) next() tuple { + kv, ok := <-it + return tuple{ok, kv[0], kv[1]} +} diff --git a/vendor/golang.org/x/tools/go/ssa/interp/value14.go b/vendor/golang.org/x/tools/go/ssa/interp/value14.go new file mode 100644 index 0000000000..f8fedd3fc0 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/interp/value14.go @@ -0,0 +1,499 @@ +// Copyright 2013 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.5 + +package interp + +// Values +// +// All interpreter values are "boxed" in the empty interface, value. +// The range of possible dynamic types within value are: +// +// - bool +// - numbers (all built-in int/float/complex types are distinguished) +// - string +// - map[value]value --- maps for which usesBuiltinMap(keyType) +// *hashmap --- maps for which !usesBuiltinMap(keyType) +// - chan value +// - []value --- slices +// - iface --- interfaces. +// - structure --- structs. Fields are ordered and accessed by numeric indices. +// - array --- arrays. +// - *value --- pointers. Careful: *value is a distinct type from *array etc. +// - *ssa.Function \ +// *ssa.Builtin } --- functions. A nil 'func' is always of type *ssa.Function. +// *closure / +// - tuple --- as returned by Return, Next, "value,ok" modes, etc. +// - iter --- iterators from 'range' over map or string. +// - bad --- a poison pill for locals that have gone out of scope. +// - rtype -- the interpreter's concrete implementation of reflect.Type +// +// Note that nil is not on this list. +// +// Pay close attention to whether or not the dynamic type is a pointer. +// The compiler cannot help you since value is an empty interface. + +import ( + "bytes" + "fmt" + "io" + "reflect" + "strings" + "sync" + "unsafe" + + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types" + "golang.org/x/tools/go/types/typeutil" +) + +type value interface{} + +type tuple []value + +type array []value + +type iface struct { + t types.Type // never an "untyped" type + v value +} + +type structure []value + +// For map, array, *array, slice, string or channel. +type iter interface { + // next returns a Tuple (key, value, ok). + // key and value are unaliased, e.g. copies of the sequence element. + next() tuple +} + +type closure struct { + Fn *ssa.Function + Env []value +} + +type bad struct{} + +type rtype struct { + t types.Type +} + +// Hash functions and equivalence relation: + +// hashString computes the FNV hash of s. +func hashString(s string) int { + var h uint32 + for i := 0; i < len(s); i++ { + h ^= uint32(s[i]) + h *= 16777619 + } + return int(h) +} + +var ( + mu sync.Mutex + hasher = typeutil.MakeHasher() +) + +// hashType returns a hash for t such that +// types.Identical(x, y) => hashType(x) == hashType(y). +func hashType(t types.Type) int { + mu.Lock() + h := int(hasher.Hash(t)) + mu.Unlock() + return h +} + +// usesBuiltinMap returns true if the built-in hash function and +// equivalence relation for type t are consistent with those of the +// interpreter's representation of type t. Such types are: all basic +// types (bool, numbers, string), pointers and channels. +// +// usesBuiltinMap returns false for types that require a custom map +// implementation: interfaces, arrays and structs. +// +// Panic ensues if t is an invalid map key type: function, map or slice. +func usesBuiltinMap(t types.Type) bool { + switch t := t.(type) { + case *types.Basic, *types.Chan, *types.Pointer: + return true + case *types.Named: + return usesBuiltinMap(t.Underlying()) + case *types.Interface, *types.Array, *types.Struct: + return false + } + panic(fmt.Sprintf("invalid map key type: %T", t)) +} + +func (x array) eq(t types.Type, _y interface{}) bool { + y := _y.(array) + tElt := t.Underlying().(*types.Array).Elem() + for i, xi := range x { + if !equals(tElt, xi, y[i]) { + return false + } + } + return true +} + +func (x array) hash(t types.Type) int { + h := 0 + tElt := t.Underlying().(*types.Array).Elem() + for _, xi := range x { + h += hash(tElt, xi) + } + return h +} + +func (x structure) eq(t types.Type, _y interface{}) bool { + y := _y.(structure) + tStruct := t.Underlying().(*types.Struct) + for i, n := 0, tStruct.NumFields(); i < n; i++ { + if f := tStruct.Field(i); !f.Anonymous() { + if !equals(f.Type(), x[i], y[i]) { + return false + } + } + } + return true +} + +func (x structure) hash(t types.Type) int { + tStruct := t.Underlying().(*types.Struct) + h := 0 + for i, n := 0, tStruct.NumFields(); i < n; i++ { + if f := tStruct.Field(i); !f.Anonymous() { + h += hash(f.Type(), x[i]) + } + } + return h +} + +// nil-tolerant variant of types.Identical. +func sameType(x, y types.Type) bool { + if x == nil { + return y == nil + } + return y != nil && types.Identical(x, y) +} + +func (x iface) eq(t types.Type, _y interface{}) bool { + y := _y.(iface) + return sameType(x.t, y.t) && (x.t == nil || equals(x.t, x.v, y.v)) +} + +func (x iface) hash(_ types.Type) int { + return hashType(x.t)*8581 + hash(x.t, x.v) +} + +func (x rtype) hash(_ types.Type) int { + return hashType(x.t) +} + +func (x rtype) eq(_ types.Type, y interface{}) bool { + return types.Identical(x.t, y.(rtype).t) +} + +// equals returns true iff x and y are equal according to Go's +// linguistic equivalence relation for type t. +// In a well-typed program, the dynamic types of x and y are +// guaranteed equal. +func equals(t types.Type, x, y value) bool { + switch x := x.(type) { + case bool: + return x == y.(bool) + case int: + return x == y.(int) + case int8: + return x == y.(int8) + case int16: + return x == y.(int16) + case int32: + return x == y.(int32) + case int64: + return x == y.(int64) + case uint: + return x == y.(uint) + case uint8: + return x == y.(uint8) + case uint16: + return x == y.(uint16) + case uint32: + return x == y.(uint32) + case uint64: + return x == y.(uint64) + case uintptr: + return x == y.(uintptr) + case float32: + return x == y.(float32) + case float64: + return x == y.(float64) + case complex64: + return x == y.(complex64) + case complex128: + return x == y.(complex128) + case string: + return x == y.(string) + case *value: + return x == y.(*value) + case chan value: + return x == y.(chan value) + case structure: + return x.eq(t, y) + case array: + return x.eq(t, y) + case iface: + return x.eq(t, y) + case rtype: + return x.eq(t, y) + } + + // Since map, func and slice don't support comparison, this + // case is only reachable if one of x or y is literally nil + // (handled in eqnil) or via interface{} values. + panic(fmt.Sprintf("comparing uncomparable type %s", t)) +} + +// Returns an integer hash of x such that equals(x, y) => hash(x) == hash(y). +func hash(t types.Type, x value) int { + switch x := x.(type) { + case bool: + if x { + return 1 + } + return 0 + case int: + return x + case int8: + return int(x) + case int16: + return int(x) + case int32: + return int(x) + case int64: + return int(x) + case uint: + return int(x) + case uint8: + return int(x) + case uint16: + return int(x) + case uint32: + return int(x) + case uint64: + return int(x) + case uintptr: + return int(x) + case float32: + return int(x) + case float64: + return int(x) + case complex64: + return int(real(x)) + case complex128: + return int(real(x)) + case string: + return hashString(x) + case *value: + return int(uintptr(unsafe.Pointer(x))) + case chan value: + return int(uintptr(reflect.ValueOf(x).Pointer())) + case structure: + return x.hash(t) + case array: + return x.hash(t) + case iface: + return x.hash(t) + case rtype: + return x.hash(t) + } + panic(fmt.Sprintf("%T is unhashable", x)) +} + +// reflect.Value struct values don't have a fixed shape, since the +// payload can be a scalar or an aggregate depending on the instance. +// So store (and load) can't simply use recursion over the shape of the +// rhs value, or the lhs, to copy the value; we need the static type +// information. (We can't make reflect.Value a new basic data type +// because its "structness" is exposed to Go programs.) + +// load returns the value of type T in *addr. +func load(T types.Type, addr *value) value { + switch T := T.Underlying().(type) { + case *types.Struct: + v := (*addr).(structure) + a := make(structure, len(v)) + for i := range a { + a[i] = load(T.Field(i).Type(), &v[i]) + } + return a + case *types.Array: + v := (*addr).(array) + a := make(array, len(v)) + for i := range a { + a[i] = load(T.Elem(), &v[i]) + } + return a + default: + return *addr + } +} + +// store stores value v of type T into *addr. +func store(T types.Type, addr *value, v value) { + switch T := T.Underlying().(type) { + case *types.Struct: + lhs := (*addr).(structure) + rhs := v.(structure) + for i := range lhs { + store(T.Field(i).Type(), &lhs[i], rhs[i]) + } + case *types.Array: + lhs := (*addr).(array) + rhs := v.(array) + for i := range lhs { + store(T.Elem(), &lhs[i], rhs[i]) + } + default: + *addr = v + } +} + +// Prints in the style of built-in println. +// (More or less; in gc println is actually a compiler intrinsic and +// can distinguish println(1) from println(interface{}(1)).) +func writeValue(buf *bytes.Buffer, v value) { + switch v := v.(type) { + case nil, bool, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr, float32, float64, complex64, complex128, string: + fmt.Fprintf(buf, "%v", v) + + case map[value]value: + buf.WriteString("map[") + sep := "" + for k, e := range v { + buf.WriteString(sep) + sep = " " + writeValue(buf, k) + buf.WriteString(":") + writeValue(buf, e) + } + buf.WriteString("]") + + case *hashmap: + buf.WriteString("map[") + sep := " " + for _, e := range v.table { + for e != nil { + buf.WriteString(sep) + sep = " " + writeValue(buf, e.key) + buf.WriteString(":") + writeValue(buf, e.value) + e = e.next + } + } + buf.WriteString("]") + + case chan value: + fmt.Fprintf(buf, "%v", v) // (an address) + + case *value: + if v == nil { + buf.WriteString("") + } else { + fmt.Fprintf(buf, "%p", v) + } + + case iface: + fmt.Fprintf(buf, "(%s, ", v.t) + writeValue(buf, v.v) + buf.WriteString(")") + + case structure: + buf.WriteString("{") + for i, e := range v { + if i > 0 { + buf.WriteString(" ") + } + writeValue(buf, e) + } + buf.WriteString("}") + + case array: + buf.WriteString("[") + for i, e := range v { + if i > 0 { + buf.WriteString(" ") + } + writeValue(buf, e) + } + buf.WriteString("]") + + case []value: + buf.WriteString("[") + for i, e := range v { + if i > 0 { + buf.WriteString(" ") + } + writeValue(buf, e) + } + buf.WriteString("]") + + case *ssa.Function, *ssa.Builtin, *closure: + fmt.Fprintf(buf, "%p", v) // (an address) + + case rtype: + buf.WriteString(v.t.String()) + + case tuple: + // Unreachable in well-formed Go programs + buf.WriteString("(") + for i, e := range v { + if i > 0 { + buf.WriteString(", ") + } + writeValue(buf, e) + } + buf.WriteString(")") + + default: + fmt.Fprintf(buf, "<%T>", v) + } +} + +// Implements printing of Go values in the style of built-in println. +func toString(v value) string { + var b bytes.Buffer + writeValue(&b, v) + return b.String() +} + +// ------------------------------------------------------------------------ +// Iterators + +type stringIter struct { + *strings.Reader + i int +} + +func (it *stringIter) next() tuple { + okv := make(tuple, 3) + ch, n, err := it.ReadRune() + ok := err != io.EOF + okv[0] = ok + if ok { + okv[1] = it.i + okv[2] = ch + } + it.i += n + return okv +} + +type mapIter chan [2]value + +func (it mapIter) next() tuple { + kv, ok := <-it + return tuple{ok, kv[0], kv[1]} +} diff --git a/vendor/golang.org/x/tools/go/ssa/lift.go b/vendor/golang.org/x/tools/go/ssa/lift.go new file mode 100644 index 0000000000..722d086f66 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/lift.go @@ -0,0 +1,600 @@ +// Copyright 2013 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.5 + +package ssa + +// This file defines the lifting pass which tries to "lift" Alloc +// cells (new/local variables) into SSA registers, replacing loads +// with the dominating stored value, eliminating loads and stores, and +// inserting φ-nodes as needed. + +// Cited papers and resources: +// +// Ron Cytron et al. 1991. Efficiently computing SSA form... +// http://doi.acm.org/10.1145/115372.115320 +// +// Cooper, Harvey, Kennedy. 2001. A Simple, Fast Dominance Algorithm. +// Software Practice and Experience 2001, 4:1-10. +// http://www.hipersoft.rice.edu/grads/publications/dom14.pdf +// +// Daniel Berlin, llvmdev mailing list, 2012. +// http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-January/046638.html +// (Be sure to expand the whole thread.) + +// TODO(adonovan): opt: there are many optimizations worth evaluating, and +// the conventional wisdom for SSA construction is that a simple +// algorithm well engineered often beats those of better asymptotic +// complexity on all but the most egregious inputs. +// +// Danny Berlin suggests that the Cooper et al. algorithm for +// computing the dominance frontier is superior to Cytron et al. +// Furthermore he recommends that rather than computing the DF for the +// whole function then renaming all alloc cells, it may be cheaper to +// compute the DF for each alloc cell separately and throw it away. +// +// Consider exploiting liveness information to avoid creating dead +// φ-nodes which we then immediately remove. +// +// Integrate lifting with scalar replacement of aggregates (SRA) since +// the two are synergistic. +// +// Also see many other "TODO: opt" suggestions in the code. + +import ( + "fmt" + "go/token" + "go/types" + "math/big" + "os" +) + +// If true, perform sanity checking and show diagnostic information at +// each step of lifting. Very verbose. +const debugLifting = false + +// domFrontier maps each block to the set of blocks in its dominance +// frontier. The outer slice is conceptually a map keyed by +// Block.Index. The inner slice is conceptually a set, possibly +// containing duplicates. +// +// TODO(adonovan): opt: measure impact of dups; consider a packed bit +// representation, e.g. big.Int, and bitwise parallel operations for +// the union step in the Children loop. +// +// domFrontier's methods mutate the slice's elements but not its +// length, so their receivers needn't be pointers. +// +type domFrontier [][]*BasicBlock + +func (df domFrontier) add(u, v *BasicBlock) { + p := &df[u.Index] + *p = append(*p, v) +} + +// build builds the dominance frontier df for the dominator (sub)tree +// rooted at u, using the Cytron et al. algorithm. +// +// TODO(adonovan): opt: consider Berlin approach, computing pruned SSA +// by pruning the entire IDF computation, rather than merely pruning +// the DF -> IDF step. +func (df domFrontier) build(u *BasicBlock) { + // Encounter each node u in postorder of dom tree. + for _, child := range u.dom.children { + df.build(child) + } + for _, vb := range u.Succs { + if v := vb.dom; v.idom != u { + df.add(u, vb) + } + } + for _, w := range u.dom.children { + for _, vb := range df[w.Index] { + // TODO(adonovan): opt: use word-parallel bitwise union. + if v := vb.dom; v.idom != u { + df.add(u, vb) + } + } + } +} + +func buildDomFrontier(fn *Function) domFrontier { + df := make(domFrontier, len(fn.Blocks)) + df.build(fn.Blocks[0]) + if fn.Recover != nil { + df.build(fn.Recover) + } + return df +} + +func removeInstr(refs []Instruction, instr Instruction) []Instruction { + i := 0 + for _, ref := range refs { + if ref == instr { + continue + } + refs[i] = ref + i++ + } + for j := i; j != len(refs); j++ { + refs[j] = nil // aid GC + } + return refs[:i] +} + +// lift attempts to replace local and new Allocs accessed only with +// load/store by SSA registers, inserting φ-nodes where necessary. +// The result is a program in classical pruned SSA form. +// +// Preconditions: +// - fn has no dead blocks (blockopt has run). +// - Def/use info (Operands and Referrers) is up-to-date. +// - The dominator tree is up-to-date. +// +func lift(fn *Function) { + // TODO(adonovan): opt: lots of little optimizations may be + // worthwhile here, especially if they cause us to avoid + // buildDomFrontier. For example: + // + // - Alloc never loaded? Eliminate. + // - Alloc never stored? Replace all loads with a zero constant. + // - Alloc stored once? Replace loads with dominating store; + // don't forget that an Alloc is itself an effective store + // of zero. + // - Alloc used only within a single block? + // Use degenerate algorithm avoiding φ-nodes. + // - Consider synergy with scalar replacement of aggregates (SRA). + // e.g. *(&x.f) where x is an Alloc. + // Perhaps we'd get better results if we generated this as x.f + // i.e. Field(x, .f) instead of Load(FieldIndex(x, .f)). + // Unclear. + // + // But we will start with the simplest correct code. + df := buildDomFrontier(fn) + + if debugLifting { + title := false + for i, blocks := range df { + if blocks != nil { + if !title { + fmt.Fprintf(os.Stderr, "Dominance frontier of %s:\n", fn) + title = true + } + fmt.Fprintf(os.Stderr, "\t%s: %s\n", fn.Blocks[i], blocks) + } + } + } + + newPhis := make(newPhiMap) + + // During this pass we will replace some BasicBlock.Instrs + // (allocs, loads and stores) with nil, keeping a count in + // BasicBlock.gaps. At the end we will reset Instrs to the + // concatenation of all non-dead newPhis and non-nil Instrs + // for the block, reusing the original array if space permits. + + // While we're here, we also eliminate 'rundefers' + // instructions in functions that contain no 'defer' + // instructions. + usesDefer := false + + // Determine which allocs we can lift and number them densely. + // The renaming phase uses this numbering for compact maps. + numAllocs := 0 + for _, b := range fn.Blocks { + b.gaps = 0 + b.rundefers = 0 + for _, instr := range b.Instrs { + switch instr := instr.(type) { + case *Alloc: + index := -1 + if liftAlloc(df, instr, newPhis) { + index = numAllocs + numAllocs++ + } + instr.index = index + case *Defer: + usesDefer = true + case *RunDefers: + b.rundefers++ + } + } + } + + // renaming maps an alloc (keyed by index) to its replacement + // value. Initially the renaming contains nil, signifying the + // zero constant of the appropriate type; we construct the + // Const lazily at most once on each path through the domtree. + // TODO(adonovan): opt: cache per-function not per subtree. + renaming := make([]Value, numAllocs) + + // Renaming. + rename(fn.Blocks[0], renaming, newPhis) + + // Eliminate dead new phis, then prepend the live ones to each block. + for _, b := range fn.Blocks { + + // Compress the newPhis slice to eliminate unused phis. + // TODO(adonovan): opt: compute liveness to avoid + // placing phis in blocks for which the alloc cell is + // not live. + nps := newPhis[b] + j := 0 + for _, np := range nps { + if !phiIsLive(np.phi) { + // discard it, first removing it from referrers + for _, newval := range np.phi.Edges { + if refs := newval.Referrers(); refs != nil { + *refs = removeInstr(*refs, np.phi) + } + } + continue + } + nps[j] = np + j++ + } + nps = nps[:j] + + rundefersToKill := b.rundefers + if usesDefer { + rundefersToKill = 0 + } + + if j+b.gaps+rundefersToKill == 0 { + continue // fast path: no new phis or gaps + } + + // Compact nps + non-nil Instrs into a new slice. + // TODO(adonovan): opt: compact in situ if there is + // sufficient space or slack in the slice. + dst := make([]Instruction, len(b.Instrs)+j-b.gaps-rundefersToKill) + for i, np := range nps { + dst[i] = np.phi + } + for _, instr := range b.Instrs { + if instr == nil { + continue + } + if !usesDefer { + if _, ok := instr.(*RunDefers); ok { + continue + } + } + dst[j] = instr + j++ + } + for i, np := range nps { + dst[i] = np.phi + } + b.Instrs = dst + } + + // Remove any fn.Locals that were lifted. + j := 0 + for _, l := range fn.Locals { + if l.index < 0 { + fn.Locals[j] = l + j++ + } + } + // Nil out fn.Locals[j:] to aid GC. + for i := j; i < len(fn.Locals); i++ { + fn.Locals[i] = nil + } + fn.Locals = fn.Locals[:j] +} + +func phiIsLive(phi *Phi) bool { + for _, instr := range *phi.Referrers() { + if instr == phi { + continue // self-refs don't count + } + if _, ok := instr.(*DebugRef); ok { + continue // debug refs don't count + } + return true + } + return false +} + +type blockSet struct{ big.Int } // (inherit methods from Int) + +// add adds b to the set and returns true if the set changed. +func (s *blockSet) add(b *BasicBlock) bool { + i := b.Index + if s.Bit(i) != 0 { + return false + } + s.SetBit(&s.Int, i, 1) + return true +} + +// take removes an arbitrary element from a set s and +// returns its index, or returns -1 if empty. +func (s *blockSet) take() int { + l := s.BitLen() + for i := 0; i < l; i++ { + if s.Bit(i) == 1 { + s.SetBit(&s.Int, i, 0) + return i + } + } + return -1 +} + +// newPhi is a pair of a newly introduced φ-node and the lifted Alloc +// it replaces. +type newPhi struct { + phi *Phi + alloc *Alloc +} + +// newPhiMap records for each basic block, the set of newPhis that +// must be prepended to the block. +type newPhiMap map[*BasicBlock][]newPhi + +// liftAlloc determines whether alloc can be lifted into registers, +// and if so, it populates newPhis with all the φ-nodes it may require +// and returns true. +// +func liftAlloc(df domFrontier, alloc *Alloc, newPhis newPhiMap) bool { + // Don't lift aggregates into registers, because we don't have + // a way to express their zero-constants. + switch deref(alloc.Type()).Underlying().(type) { + case *types.Array, *types.Struct: + return false + } + + // Don't lift named return values in functions that defer + // calls that may recover from panic. + if fn := alloc.Parent(); fn.Recover != nil { + for _, nr := range fn.namedResults { + if nr == alloc { + return false + } + } + } + + // Compute defblocks, the set of blocks containing a + // definition of the alloc cell. + var defblocks blockSet + for _, instr := range *alloc.Referrers() { + // Bail out if we discover the alloc is not liftable; + // the only operations permitted to use the alloc are + // loads/stores into the cell, and DebugRef. + switch instr := instr.(type) { + case *Store: + if instr.Val == alloc { + return false // address used as value + } + if instr.Addr != alloc { + panic("Alloc.Referrers is inconsistent") + } + defblocks.add(instr.Block()) + case *UnOp: + if instr.Op != token.MUL { + return false // not a load + } + if instr.X != alloc { + panic("Alloc.Referrers is inconsistent") + } + case *DebugRef: + // ok + default: + return false // some other instruction + } + } + // The Alloc itself counts as a (zero) definition of the cell. + defblocks.add(alloc.Block()) + + if debugLifting { + fmt.Fprintln(os.Stderr, "\tlifting ", alloc, alloc.Name()) + } + + fn := alloc.Parent() + + // Φ-insertion. + // + // What follows is the body of the main loop of the insert-φ + // function described by Cytron et al, but instead of using + // counter tricks, we just reset the 'hasAlready' and 'work' + // sets each iteration. These are bitmaps so it's pretty cheap. + // + // TODO(adonovan): opt: recycle slice storage for W, + // hasAlready, defBlocks across liftAlloc calls. + var hasAlready blockSet + + // Initialize W and work to defblocks. + var work blockSet = defblocks // blocks seen + var W blockSet // blocks to do + W.Set(&defblocks.Int) + + // Traverse iterated dominance frontier, inserting φ-nodes. + for i := W.take(); i != -1; i = W.take() { + u := fn.Blocks[i] + for _, v := range df[u.Index] { + if hasAlready.add(v) { + // Create φ-node. + // It will be prepended to v.Instrs later, if needed. + phi := &Phi{ + Edges: make([]Value, len(v.Preds)), + Comment: alloc.Comment, + } + phi.pos = alloc.Pos() + phi.setType(deref(alloc.Type())) + phi.block = v + if debugLifting { + fmt.Fprintf(os.Stderr, "\tplace %s = %s at block %s\n", phi.Name(), phi, v) + } + newPhis[v] = append(newPhis[v], newPhi{phi, alloc}) + + if work.add(v) { + W.add(v) + } + } + } + } + + return true +} + +// replaceAll replaces all intraprocedural uses of x with y, +// updating x.Referrers and y.Referrers. +// Precondition: x.Referrers() != nil, i.e. x must be local to some function. +// +func replaceAll(x, y Value) { + var rands []*Value + pxrefs := x.Referrers() + pyrefs := y.Referrers() + for _, instr := range *pxrefs { + rands = instr.Operands(rands[:0]) // recycle storage + for _, rand := range rands { + if *rand != nil { + if *rand == x { + *rand = y + } + } + } + if pyrefs != nil { + *pyrefs = append(*pyrefs, instr) // dups ok + } + } + *pxrefs = nil // x is now unreferenced +} + +// renamed returns the value to which alloc is being renamed, +// constructing it lazily if it's the implicit zero initialization. +// +func renamed(renaming []Value, alloc *Alloc) Value { + v := renaming[alloc.index] + if v == nil { + v = zeroConst(deref(alloc.Type())) + renaming[alloc.index] = v + } + return v +} + +// rename implements the (Cytron et al) SSA renaming algorithm, a +// preorder traversal of the dominator tree replacing all loads of +// Alloc cells with the value stored to that cell by the dominating +// store instruction. For lifting, we need only consider loads, +// stores and φ-nodes. +// +// renaming is a map from *Alloc (keyed by index number) to its +// dominating stored value; newPhis[x] is the set of new φ-nodes to be +// prepended to block x. +// +func rename(u *BasicBlock, renaming []Value, newPhis newPhiMap) { + // Each φ-node becomes the new name for its associated Alloc. + for _, np := range newPhis[u] { + phi := np.phi + alloc := np.alloc + renaming[alloc.index] = phi + } + + // Rename loads and stores of allocs. + for i, instr := range u.Instrs { + switch instr := instr.(type) { + case *Alloc: + if instr.index >= 0 { // store of zero to Alloc cell + // Replace dominated loads by the zero value. + renaming[instr.index] = nil + if debugLifting { + fmt.Fprintf(os.Stderr, "\tkill alloc %s\n", instr) + } + // Delete the Alloc. + u.Instrs[i] = nil + u.gaps++ + } + + case *Store: + if alloc, ok := instr.Addr.(*Alloc); ok && alloc.index >= 0 { // store to Alloc cell + // Replace dominated loads by the stored value. + renaming[alloc.index] = instr.Val + if debugLifting { + fmt.Fprintf(os.Stderr, "\tkill store %s; new value: %s\n", + instr, instr.Val.Name()) + } + // Remove the store from the referrer list of the stored value. + if refs := instr.Val.Referrers(); refs != nil { + *refs = removeInstr(*refs, instr) + } + // Delete the Store. + u.Instrs[i] = nil + u.gaps++ + } + + case *UnOp: + if instr.Op == token.MUL { + if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // load of Alloc cell + newval := renamed(renaming, alloc) + if debugLifting { + fmt.Fprintf(os.Stderr, "\tupdate load %s = %s with %s\n", + instr.Name(), instr, newval.Name()) + } + // Replace all references to + // the loaded value by the + // dominating stored value. + replaceAll(instr, newval) + // Delete the Load. + u.Instrs[i] = nil + u.gaps++ + } + } + + case *DebugRef: + if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // ref of Alloc cell + if instr.IsAddr { + instr.X = renamed(renaming, alloc) + instr.IsAddr = false + + // Add DebugRef to instr.X's referrers. + if refs := instr.X.Referrers(); refs != nil { + *refs = append(*refs, instr) + } + } else { + // A source expression denotes the address + // of an Alloc that was optimized away. + instr.X = nil + + // Delete the DebugRef. + u.Instrs[i] = nil + u.gaps++ + } + } + } + } + + // For each φ-node in a CFG successor, rename the edge. + for _, v := range u.Succs { + phis := newPhis[v] + if len(phis) == 0 { + continue + } + i := v.predIndex(u) + for _, np := range phis { + phi := np.phi + alloc := np.alloc + newval := renamed(renaming, alloc) + if debugLifting { + fmt.Fprintf(os.Stderr, "\tsetphi %s edge %s -> %s (#%d) (alloc=%s) := %s\n", + phi.Name(), u, v, i, alloc.Name(), newval.Name()) + } + phi.Edges[i] = newval + if prefs := newval.Referrers(); prefs != nil { + *prefs = append(*prefs, phi) + } + } + } + + // Continue depth-first recursion over domtree, pushing a + // fresh copy of the renaming map for each subtree. + for _, v := range u.dom.children { + // TODO(adonovan): opt: avoid copy on final iteration; use destructive update. + r := make([]Value, len(renaming)) + copy(r, renaming) + rename(v, r, newPhis) + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/lift14.go b/vendor/golang.org/x/tools/go/ssa/lift14.go new file mode 100644 index 0000000000..d57a85ccfc --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/lift14.go @@ -0,0 +1,601 @@ +// Copyright 2013 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.5 + +package ssa + +// This file defines the lifting pass which tries to "lift" Alloc +// cells (new/local variables) into SSA registers, replacing loads +// with the dominating stored value, eliminating loads and stores, and +// inserting φ-nodes as needed. + +// Cited papers and resources: +// +// Ron Cytron et al. 1991. Efficiently computing SSA form... +// http://doi.acm.org/10.1145/115372.115320 +// +// Cooper, Harvey, Kennedy. 2001. A Simple, Fast Dominance Algorithm. +// Software Practice and Experience 2001, 4:1-10. +// http://www.hipersoft.rice.edu/grads/publications/dom14.pdf +// +// Daniel Berlin, llvmdev mailing list, 2012. +// http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-January/046638.html +// (Be sure to expand the whole thread.) + +// TODO(adonovan): opt: there are many optimizations worth evaluating, and +// the conventional wisdom for SSA construction is that a simple +// algorithm well engineered often beats those of better asymptotic +// complexity on all but the most egregious inputs. +// +// Danny Berlin suggests that the Cooper et al. algorithm for +// computing the dominance frontier is superior to Cytron et al. +// Furthermore he recommends that rather than computing the DF for the +// whole function then renaming all alloc cells, it may be cheaper to +// compute the DF for each alloc cell separately and throw it away. +// +// Consider exploiting liveness information to avoid creating dead +// φ-nodes which we then immediately remove. +// +// Integrate lifting with scalar replacement of aggregates (SRA) since +// the two are synergistic. +// +// Also see many other "TODO: opt" suggestions in the code. + +import ( + "fmt" + "go/token" + "math/big" + "os" + + "golang.org/x/tools/go/types" +) + +// If true, perform sanity checking and show diagnostic information at +// each step of lifting. Very verbose. +const debugLifting = false + +// domFrontier maps each block to the set of blocks in its dominance +// frontier. The outer slice is conceptually a map keyed by +// Block.Index. The inner slice is conceptually a set, possibly +// containing duplicates. +// +// TODO(adonovan): opt: measure impact of dups; consider a packed bit +// representation, e.g. big.Int, and bitwise parallel operations for +// the union step in the Children loop. +// +// domFrontier's methods mutate the slice's elements but not its +// length, so their receivers needn't be pointers. +// +type domFrontier [][]*BasicBlock + +func (df domFrontier) add(u, v *BasicBlock) { + p := &df[u.Index] + *p = append(*p, v) +} + +// build builds the dominance frontier df for the dominator (sub)tree +// rooted at u, using the Cytron et al. algorithm. +// +// TODO(adonovan): opt: consider Berlin approach, computing pruned SSA +// by pruning the entire IDF computation, rather than merely pruning +// the DF -> IDF step. +func (df domFrontier) build(u *BasicBlock) { + // Encounter each node u in postorder of dom tree. + for _, child := range u.dom.children { + df.build(child) + } + for _, vb := range u.Succs { + if v := vb.dom; v.idom != u { + df.add(u, vb) + } + } + for _, w := range u.dom.children { + for _, vb := range df[w.Index] { + // TODO(adonovan): opt: use word-parallel bitwise union. + if v := vb.dom; v.idom != u { + df.add(u, vb) + } + } + } +} + +func buildDomFrontier(fn *Function) domFrontier { + df := make(domFrontier, len(fn.Blocks)) + df.build(fn.Blocks[0]) + if fn.Recover != nil { + df.build(fn.Recover) + } + return df +} + +func removeInstr(refs []Instruction, instr Instruction) []Instruction { + i := 0 + for _, ref := range refs { + if ref == instr { + continue + } + refs[i] = ref + i++ + } + for j := i; j != len(refs); j++ { + refs[j] = nil // aid GC + } + return refs[:i] +} + +// lift attempts to replace local and new Allocs accessed only with +// load/store by SSA registers, inserting φ-nodes where necessary. +// The result is a program in classical pruned SSA form. +// +// Preconditions: +// - fn has no dead blocks (blockopt has run). +// - Def/use info (Operands and Referrers) is up-to-date. +// - The dominator tree is up-to-date. +// +func lift(fn *Function) { + // TODO(adonovan): opt: lots of little optimizations may be + // worthwhile here, especially if they cause us to avoid + // buildDomFrontier. For example: + // + // - Alloc never loaded? Eliminate. + // - Alloc never stored? Replace all loads with a zero constant. + // - Alloc stored once? Replace loads with dominating store; + // don't forget that an Alloc is itself an effective store + // of zero. + // - Alloc used only within a single block? + // Use degenerate algorithm avoiding φ-nodes. + // - Consider synergy with scalar replacement of aggregates (SRA). + // e.g. *(&x.f) where x is an Alloc. + // Perhaps we'd get better results if we generated this as x.f + // i.e. Field(x, .f) instead of Load(FieldIndex(x, .f)). + // Unclear. + // + // But we will start with the simplest correct code. + df := buildDomFrontier(fn) + + if debugLifting { + title := false + for i, blocks := range df { + if blocks != nil { + if !title { + fmt.Fprintf(os.Stderr, "Dominance frontier of %s:\n", fn) + title = true + } + fmt.Fprintf(os.Stderr, "\t%s: %s\n", fn.Blocks[i], blocks) + } + } + } + + newPhis := make(newPhiMap) + + // During this pass we will replace some BasicBlock.Instrs + // (allocs, loads and stores) with nil, keeping a count in + // BasicBlock.gaps. At the end we will reset Instrs to the + // concatenation of all non-dead newPhis and non-nil Instrs + // for the block, reusing the original array if space permits. + + // While we're here, we also eliminate 'rundefers' + // instructions in functions that contain no 'defer' + // instructions. + usesDefer := false + + // Determine which allocs we can lift and number them densely. + // The renaming phase uses this numbering for compact maps. + numAllocs := 0 + for _, b := range fn.Blocks { + b.gaps = 0 + b.rundefers = 0 + for _, instr := range b.Instrs { + switch instr := instr.(type) { + case *Alloc: + index := -1 + if liftAlloc(df, instr, newPhis) { + index = numAllocs + numAllocs++ + } + instr.index = index + case *Defer: + usesDefer = true + case *RunDefers: + b.rundefers++ + } + } + } + + // renaming maps an alloc (keyed by index) to its replacement + // value. Initially the renaming contains nil, signifying the + // zero constant of the appropriate type; we construct the + // Const lazily at most once on each path through the domtree. + // TODO(adonovan): opt: cache per-function not per subtree. + renaming := make([]Value, numAllocs) + + // Renaming. + rename(fn.Blocks[0], renaming, newPhis) + + // Eliminate dead new phis, then prepend the live ones to each block. + for _, b := range fn.Blocks { + + // Compress the newPhis slice to eliminate unused phis. + // TODO(adonovan): opt: compute liveness to avoid + // placing phis in blocks for which the alloc cell is + // not live. + nps := newPhis[b] + j := 0 + for _, np := range nps { + if !phiIsLive(np.phi) { + // discard it, first removing it from referrers + for _, newval := range np.phi.Edges { + if refs := newval.Referrers(); refs != nil { + *refs = removeInstr(*refs, np.phi) + } + } + continue + } + nps[j] = np + j++ + } + nps = nps[:j] + + rundefersToKill := b.rundefers + if usesDefer { + rundefersToKill = 0 + } + + if j+b.gaps+rundefersToKill == 0 { + continue // fast path: no new phis or gaps + } + + // Compact nps + non-nil Instrs into a new slice. + // TODO(adonovan): opt: compact in situ if there is + // sufficient space or slack in the slice. + dst := make([]Instruction, len(b.Instrs)+j-b.gaps-rundefersToKill) + for i, np := range nps { + dst[i] = np.phi + } + for _, instr := range b.Instrs { + if instr == nil { + continue + } + if !usesDefer { + if _, ok := instr.(*RunDefers); ok { + continue + } + } + dst[j] = instr + j++ + } + for i, np := range nps { + dst[i] = np.phi + } + b.Instrs = dst + } + + // Remove any fn.Locals that were lifted. + j := 0 + for _, l := range fn.Locals { + if l.index < 0 { + fn.Locals[j] = l + j++ + } + } + // Nil out fn.Locals[j:] to aid GC. + for i := j; i < len(fn.Locals); i++ { + fn.Locals[i] = nil + } + fn.Locals = fn.Locals[:j] +} + +func phiIsLive(phi *Phi) bool { + for _, instr := range *phi.Referrers() { + if instr == phi { + continue // self-refs don't count + } + if _, ok := instr.(*DebugRef); ok { + continue // debug refs don't count + } + return true + } + return false +} + +type blockSet struct{ big.Int } // (inherit methods from Int) + +// add adds b to the set and returns true if the set changed. +func (s *blockSet) add(b *BasicBlock) bool { + i := b.Index + if s.Bit(i) != 0 { + return false + } + s.SetBit(&s.Int, i, 1) + return true +} + +// take removes an arbitrary element from a set s and +// returns its index, or returns -1 if empty. +func (s *blockSet) take() int { + l := s.BitLen() + for i := 0; i < l; i++ { + if s.Bit(i) == 1 { + s.SetBit(&s.Int, i, 0) + return i + } + } + return -1 +} + +// newPhi is a pair of a newly introduced φ-node and the lifted Alloc +// it replaces. +type newPhi struct { + phi *Phi + alloc *Alloc +} + +// newPhiMap records for each basic block, the set of newPhis that +// must be prepended to the block. +type newPhiMap map[*BasicBlock][]newPhi + +// liftAlloc determines whether alloc can be lifted into registers, +// and if so, it populates newPhis with all the φ-nodes it may require +// and returns true. +// +func liftAlloc(df domFrontier, alloc *Alloc, newPhis newPhiMap) bool { + // Don't lift aggregates into registers, because we don't have + // a way to express their zero-constants. + switch deref(alloc.Type()).Underlying().(type) { + case *types.Array, *types.Struct: + return false + } + + // Don't lift named return values in functions that defer + // calls that may recover from panic. + if fn := alloc.Parent(); fn.Recover != nil { + for _, nr := range fn.namedResults { + if nr == alloc { + return false + } + } + } + + // Compute defblocks, the set of blocks containing a + // definition of the alloc cell. + var defblocks blockSet + for _, instr := range *alloc.Referrers() { + // Bail out if we discover the alloc is not liftable; + // the only operations permitted to use the alloc are + // loads/stores into the cell, and DebugRef. + switch instr := instr.(type) { + case *Store: + if instr.Val == alloc { + return false // address used as value + } + if instr.Addr != alloc { + panic("Alloc.Referrers is inconsistent") + } + defblocks.add(instr.Block()) + case *UnOp: + if instr.Op != token.MUL { + return false // not a load + } + if instr.X != alloc { + panic("Alloc.Referrers is inconsistent") + } + case *DebugRef: + // ok + default: + return false // some other instruction + } + } + // The Alloc itself counts as a (zero) definition of the cell. + defblocks.add(alloc.Block()) + + if debugLifting { + fmt.Fprintln(os.Stderr, "\tlifting ", alloc, alloc.Name()) + } + + fn := alloc.Parent() + + // Φ-insertion. + // + // What follows is the body of the main loop of the insert-φ + // function described by Cytron et al, but instead of using + // counter tricks, we just reset the 'hasAlready' and 'work' + // sets each iteration. These are bitmaps so it's pretty cheap. + // + // TODO(adonovan): opt: recycle slice storage for W, + // hasAlready, defBlocks across liftAlloc calls. + var hasAlready blockSet + + // Initialize W and work to defblocks. + var work blockSet = defblocks // blocks seen + var W blockSet // blocks to do + W.Set(&defblocks.Int) + + // Traverse iterated dominance frontier, inserting φ-nodes. + for i := W.take(); i != -1; i = W.take() { + u := fn.Blocks[i] + for _, v := range df[u.Index] { + if hasAlready.add(v) { + // Create φ-node. + // It will be prepended to v.Instrs later, if needed. + phi := &Phi{ + Edges: make([]Value, len(v.Preds)), + Comment: alloc.Comment, + } + phi.pos = alloc.Pos() + phi.setType(deref(alloc.Type())) + phi.block = v + if debugLifting { + fmt.Fprintf(os.Stderr, "\tplace %s = %s at block %s\n", phi.Name(), phi, v) + } + newPhis[v] = append(newPhis[v], newPhi{phi, alloc}) + + if work.add(v) { + W.add(v) + } + } + } + } + + return true +} + +// replaceAll replaces all intraprocedural uses of x with y, +// updating x.Referrers and y.Referrers. +// Precondition: x.Referrers() != nil, i.e. x must be local to some function. +// +func replaceAll(x, y Value) { + var rands []*Value + pxrefs := x.Referrers() + pyrefs := y.Referrers() + for _, instr := range *pxrefs { + rands = instr.Operands(rands[:0]) // recycle storage + for _, rand := range rands { + if *rand != nil { + if *rand == x { + *rand = y + } + } + } + if pyrefs != nil { + *pyrefs = append(*pyrefs, instr) // dups ok + } + } + *pxrefs = nil // x is now unreferenced +} + +// renamed returns the value to which alloc is being renamed, +// constructing it lazily if it's the implicit zero initialization. +// +func renamed(renaming []Value, alloc *Alloc) Value { + v := renaming[alloc.index] + if v == nil { + v = zeroConst(deref(alloc.Type())) + renaming[alloc.index] = v + } + return v +} + +// rename implements the (Cytron et al) SSA renaming algorithm, a +// preorder traversal of the dominator tree replacing all loads of +// Alloc cells with the value stored to that cell by the dominating +// store instruction. For lifting, we need only consider loads, +// stores and φ-nodes. +// +// renaming is a map from *Alloc (keyed by index number) to its +// dominating stored value; newPhis[x] is the set of new φ-nodes to be +// prepended to block x. +// +func rename(u *BasicBlock, renaming []Value, newPhis newPhiMap) { + // Each φ-node becomes the new name for its associated Alloc. + for _, np := range newPhis[u] { + phi := np.phi + alloc := np.alloc + renaming[alloc.index] = phi + } + + // Rename loads and stores of allocs. + for i, instr := range u.Instrs { + switch instr := instr.(type) { + case *Alloc: + if instr.index >= 0 { // store of zero to Alloc cell + // Replace dominated loads by the zero value. + renaming[instr.index] = nil + if debugLifting { + fmt.Fprintf(os.Stderr, "\tkill alloc %s\n", instr) + } + // Delete the Alloc. + u.Instrs[i] = nil + u.gaps++ + } + + case *Store: + if alloc, ok := instr.Addr.(*Alloc); ok && alloc.index >= 0 { // store to Alloc cell + // Replace dominated loads by the stored value. + renaming[alloc.index] = instr.Val + if debugLifting { + fmt.Fprintf(os.Stderr, "\tkill store %s; new value: %s\n", + instr, instr.Val.Name()) + } + // Remove the store from the referrer list of the stored value. + if refs := instr.Val.Referrers(); refs != nil { + *refs = removeInstr(*refs, instr) + } + // Delete the Store. + u.Instrs[i] = nil + u.gaps++ + } + + case *UnOp: + if instr.Op == token.MUL { + if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // load of Alloc cell + newval := renamed(renaming, alloc) + if debugLifting { + fmt.Fprintf(os.Stderr, "\tupdate load %s = %s with %s\n", + instr.Name(), instr, newval.Name()) + } + // Replace all references to + // the loaded value by the + // dominating stored value. + replaceAll(instr, newval) + // Delete the Load. + u.Instrs[i] = nil + u.gaps++ + } + } + + case *DebugRef: + if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // ref of Alloc cell + if instr.IsAddr { + instr.X = renamed(renaming, alloc) + instr.IsAddr = false + + // Add DebugRef to instr.X's referrers. + if refs := instr.X.Referrers(); refs != nil { + *refs = append(*refs, instr) + } + } else { + // A source expression denotes the address + // of an Alloc that was optimized away. + instr.X = nil + + // Delete the DebugRef. + u.Instrs[i] = nil + u.gaps++ + } + } + } + } + + // For each φ-node in a CFG successor, rename the edge. + for _, v := range u.Succs { + phis := newPhis[v] + if len(phis) == 0 { + continue + } + i := v.predIndex(u) + for _, np := range phis { + phi := np.phi + alloc := np.alloc + newval := renamed(renaming, alloc) + if debugLifting { + fmt.Fprintf(os.Stderr, "\tsetphi %s edge %s -> %s (#%d) (alloc=%s) := %s\n", + phi.Name(), u, v, i, alloc.Name(), newval.Name()) + } + phi.Edges[i] = newval + if prefs := newval.Referrers(); prefs != nil { + *prefs = append(*prefs, phi) + } + } + } + + // Continue depth-first recursion over domtree, pushing a + // fresh copy of the renaming map for each subtree. + for _, v := range u.dom.children { + // TODO(adonovan): opt: avoid copy on final iteration; use destructive update. + r := make([]Value, len(renaming)) + copy(r, renaming) + rename(v, r, newPhis) + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/lvalue.go b/vendor/golang.org/x/tools/go/ssa/lvalue.go new file mode 100644 index 0000000000..85e090f4b8 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/lvalue.go @@ -0,0 +1,122 @@ +// Copyright 2013 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.5 + +package ssa + +// lvalues are the union of addressable expressions and map-index +// expressions. + +import ( + "go/ast" + "go/token" + "go/types" +) + +// An lvalue represents an assignable location that may appear on the +// left-hand side of an assignment. This is a generalization of a +// pointer to permit updates to elements of maps. +// +type lvalue interface { + store(fn *Function, v Value) // stores v into the location + load(fn *Function) Value // loads the contents of the location + address(fn *Function) Value // address of the location + typ() types.Type // returns the type of the location +} + +// An address is an lvalue represented by a true pointer. +type address struct { + addr Value + pos token.Pos // source position + expr ast.Expr // source syntax of the value (not address) [debug mode] +} + +func (a *address) load(fn *Function) Value { + load := emitLoad(fn, a.addr) + load.pos = a.pos + return load +} + +func (a *address) store(fn *Function, v Value) { + store := emitStore(fn, a.addr, v, a.pos) + if a.expr != nil { + // store.Val is v, converted for assignability. + emitDebugRef(fn, a.expr, store.Val, false) + } +} + +func (a *address) address(fn *Function) Value { + if a.expr != nil { + emitDebugRef(fn, a.expr, a.addr, true) + } + return a.addr +} + +func (a *address) typ() types.Type { + return deref(a.addr.Type()) +} + +// An element is an lvalue represented by m[k], the location of an +// element of a map or string. These locations are not addressable +// since pointers cannot be formed from them, but they do support +// load(), and in the case of maps, store(). +// +type element struct { + m, k Value // map or string + t types.Type // map element type or string byte type + pos token.Pos // source position of colon ({k:v}) or lbrack (m[k]=v) +} + +func (e *element) load(fn *Function) Value { + l := &Lookup{ + X: e.m, + Index: e.k, + } + l.setPos(e.pos) + l.setType(e.t) + return fn.emit(l) +} + +func (e *element) store(fn *Function, v Value) { + up := &MapUpdate{ + Map: e.m, + Key: e.k, + Value: emitConv(fn, v, e.t), + } + up.pos = e.pos + fn.emit(up) +} + +func (e *element) address(fn *Function) Value { + panic("map/string elements are not addressable") +} + +func (e *element) typ() types.Type { + return e.t +} + +// A blank is a dummy variable whose name is "_". +// It is not reified: loads are illegal and stores are ignored. +// +type blank struct{} + +func (bl blank) load(fn *Function) Value { + panic("blank.load is illegal") +} + +func (bl blank) store(fn *Function, v Value) { + // no-op +} + +func (bl blank) address(fn *Function) Value { + panic("blank var is not addressable") +} + +func (bl blank) typ() types.Type { + // This should be the type of the blank Ident; the typechecker + // doesn't provide this yet, but fortunately, we don't need it + // yet either. + panic("blank.typ is unimplemented") +} diff --git a/vendor/golang.org/x/tools/go/ssa/lvalue14.go b/vendor/golang.org/x/tools/go/ssa/lvalue14.go new file mode 100644 index 0000000000..597761b31a --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/lvalue14.go @@ -0,0 +1,123 @@ +// Copyright 2013 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.5 + +package ssa + +// lvalues are the union of addressable expressions and map-index +// expressions. + +import ( + "go/ast" + "go/token" + + "golang.org/x/tools/go/types" +) + +// An lvalue represents an assignable location that may appear on the +// left-hand side of an assignment. This is a generalization of a +// pointer to permit updates to elements of maps. +// +type lvalue interface { + store(fn *Function, v Value) // stores v into the location + load(fn *Function) Value // loads the contents of the location + address(fn *Function) Value // address of the location + typ() types.Type // returns the type of the location +} + +// An address is an lvalue represented by a true pointer. +type address struct { + addr Value + pos token.Pos // source position + expr ast.Expr // source syntax of the value (not address) [debug mode] +} + +func (a *address) load(fn *Function) Value { + load := emitLoad(fn, a.addr) + load.pos = a.pos + return load +} + +func (a *address) store(fn *Function, v Value) { + store := emitStore(fn, a.addr, v, a.pos) + if a.expr != nil { + // store.Val is v, converted for assignability. + emitDebugRef(fn, a.expr, store.Val, false) + } +} + +func (a *address) address(fn *Function) Value { + if a.expr != nil { + emitDebugRef(fn, a.expr, a.addr, true) + } + return a.addr +} + +func (a *address) typ() types.Type { + return deref(a.addr.Type()) +} + +// An element is an lvalue represented by m[k], the location of an +// element of a map or string. These locations are not addressable +// since pointers cannot be formed from them, but they do support +// load(), and in the case of maps, store(). +// +type element struct { + m, k Value // map or string + t types.Type // map element type or string byte type + pos token.Pos // source position of colon ({k:v}) or lbrack (m[k]=v) +} + +func (e *element) load(fn *Function) Value { + l := &Lookup{ + X: e.m, + Index: e.k, + } + l.setPos(e.pos) + l.setType(e.t) + return fn.emit(l) +} + +func (e *element) store(fn *Function, v Value) { + up := &MapUpdate{ + Map: e.m, + Key: e.k, + Value: emitConv(fn, v, e.t), + } + up.pos = e.pos + fn.emit(up) +} + +func (e *element) address(fn *Function) Value { + panic("map/string elements are not addressable") +} + +func (e *element) typ() types.Type { + return e.t +} + +// A blank is a dummy variable whose name is "_". +// It is not reified: loads are illegal and stores are ignored. +// +type blank struct{} + +func (bl blank) load(fn *Function) Value { + panic("blank.load is illegal") +} + +func (bl blank) store(fn *Function, v Value) { + // no-op +} + +func (bl blank) address(fn *Function) Value { + panic("blank var is not addressable") +} + +func (bl blank) typ() types.Type { + // This should be the type of the blank Ident; the typechecker + // doesn't provide this yet, but fortunately, we don't need it + // yet either. + panic("blank.typ is unimplemented") +} diff --git a/vendor/golang.org/x/tools/go/ssa/methods.go b/vendor/golang.org/x/tools/go/ssa/methods.go new file mode 100644 index 0000000000..7d1fb42b57 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/methods.go @@ -0,0 +1,241 @@ +// Copyright 2013 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.5 + +package ssa + +// This file defines utilities for population of method sets. + +import ( + "fmt" + "go/types" +) + +// MethodValue returns the Function implementing method sel, building +// wrapper methods on demand. It returns nil if sel denotes an +// abstract (interface) method. +// +// Precondition: sel.Kind() == MethodVal. +// +// Thread-safe. +// +// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu) +// +func (prog *Program) MethodValue(sel *types.Selection) *Function { + if sel.Kind() != types.MethodVal { + panic(fmt.Sprintf("Method(%s) kind != MethodVal", sel)) + } + T := sel.Recv() + if isInterface(T) { + return nil // abstract method + } + if prog.mode&LogSource != 0 { + defer logStack("Method %s %v", T, sel)() + } + + prog.methodsMu.Lock() + defer prog.methodsMu.Unlock() + + return prog.addMethod(prog.createMethodSet(T), sel) +} + +// LookupMethod returns the implementation of the method of type T +// identified by (pkg, name). It returns nil if the method exists but +// is abstract, and panics if T has no such method. +// +func (prog *Program) LookupMethod(T types.Type, pkg *types.Package, name string) *Function { + sel := prog.MethodSets.MethodSet(T).Lookup(pkg, name) + if sel == nil { + panic(fmt.Sprintf("%s has no method %s", T, types.Id(pkg, name))) + } + return prog.MethodValue(sel) +} + +// methodSet contains the (concrete) methods of a non-interface type. +type methodSet struct { + mapping map[string]*Function // populated lazily + complete bool // mapping contains all methods +} + +// Precondition: !isInterface(T). +// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu) +func (prog *Program) createMethodSet(T types.Type) *methodSet { + mset, ok := prog.methodSets.At(T).(*methodSet) + if !ok { + mset = &methodSet{mapping: make(map[string]*Function)} + prog.methodSets.Set(T, mset) + } + return mset +} + +// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu) +func (prog *Program) addMethod(mset *methodSet, sel *types.Selection) *Function { + if sel.Kind() == types.MethodExpr { + panic(sel) + } + id := sel.Obj().Id() + fn := mset.mapping[id] + if fn == nil { + obj := sel.Obj().(*types.Func) + + needsPromotion := len(sel.Index()) > 1 + needsIndirection := !isPointer(recvType(obj)) && isPointer(sel.Recv()) + if needsPromotion || needsIndirection { + fn = makeWrapper(prog, sel) + } else { + fn = prog.declaredFunc(obj) + } + if fn.Signature.Recv() == nil { + panic(fn) // missing receiver + } + mset.mapping[id] = fn + } + return fn +} + +// RuntimeTypes returns a new unordered slice containing all +// concrete types in the program for which a complete (non-empty) +// method set is required at run-time. +// +// Thread-safe. +// +// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu) +// +func (prog *Program) RuntimeTypes() []types.Type { + prog.methodsMu.Lock() + defer prog.methodsMu.Unlock() + + var res []types.Type + prog.methodSets.Iterate(func(T types.Type, v interface{}) { + if v.(*methodSet).complete { + res = append(res, T) + } + }) + return res +} + +// declaredFunc returns the concrete function/method denoted by obj. +// Panic ensues if there is none. +// +func (prog *Program) declaredFunc(obj *types.Func) *Function { + if v := prog.packageLevelValue(obj); v != nil { + return v.(*Function) + } + panic("no concrete method: " + obj.String()) +} + +// needMethodsOf ensures that runtime type information (including the +// complete method set) is available for the specified type T and all +// its subcomponents. +// +// needMethodsOf must be called for at least every type that is an +// operand of some MakeInterface instruction, and for the type of +// every exported package member. +// +// Precondition: T is not a method signature (*Signature with Recv()!=nil). +// +// Thread-safe. (Called via emitConv from multiple builder goroutines.) +// +// TODO(adonovan): make this faster. It accounts for 20% of SSA build time. +// +// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu) +// +func (prog *Program) needMethodsOf(T types.Type) { + prog.methodsMu.Lock() + prog.needMethods(T, false) + prog.methodsMu.Unlock() +} + +// Precondition: T is not a method signature (*Signature with Recv()!=nil). +// Recursive case: skip => don't create methods for T. +// +// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu) +// +func (prog *Program) needMethods(T types.Type, skip bool) { + // Each package maintains its own set of types it has visited. + if prevSkip, ok := prog.runtimeTypes.At(T).(bool); ok { + // needMethods(T) was previously called + if !prevSkip || skip { + return // already seen, with same or false 'skip' value + } + } + prog.runtimeTypes.Set(T, skip) + + tmset := prog.MethodSets.MethodSet(T) + + if !skip && !isInterface(T) && tmset.Len() > 0 { + // Create methods of T. + mset := prog.createMethodSet(T) + if !mset.complete { + mset.complete = true + n := tmset.Len() + for i := 0; i < n; i++ { + prog.addMethod(mset, tmset.At(i)) + } + } + } + + // Recursion over signatures of each method. + for i := 0; i < tmset.Len(); i++ { + sig := tmset.At(i).Type().(*types.Signature) + prog.needMethods(sig.Params(), false) + prog.needMethods(sig.Results(), false) + } + + switch t := T.(type) { + case *types.Basic: + // nop + + case *types.Interface: + // nop---handled by recursion over method set. + + case *types.Pointer: + prog.needMethods(t.Elem(), false) + + case *types.Slice: + prog.needMethods(t.Elem(), false) + + case *types.Chan: + prog.needMethods(t.Elem(), false) + + case *types.Map: + prog.needMethods(t.Key(), false) + prog.needMethods(t.Elem(), false) + + case *types.Signature: + if t.Recv() != nil { + panic(fmt.Sprintf("Signature %s has Recv %s", t, t.Recv())) + } + prog.needMethods(t.Params(), false) + prog.needMethods(t.Results(), false) + + case *types.Named: + // A pointer-to-named type can be derived from a named + // type via reflection. It may have methods too. + prog.needMethods(types.NewPointer(T), false) + + // Consider 'type T struct{S}' where S has methods. + // Reflection provides no way to get from T to struct{S}, + // only to S, so the method set of struct{S} is unwanted, + // so set 'skip' flag during recursion. + prog.needMethods(t.Underlying(), true) + + case *types.Array: + prog.needMethods(t.Elem(), false) + + case *types.Struct: + for i, n := 0, t.NumFields(); i < n; i++ { + prog.needMethods(t.Field(i).Type(), false) + } + + case *types.Tuple: + for i, n := 0, t.Len(); i < n; i++ { + prog.needMethods(t.At(i).Type(), false) + } + + default: + panic(T) + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/methods14.go b/vendor/golang.org/x/tools/go/ssa/methods14.go new file mode 100644 index 0000000000..7c2a40d62c --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/methods14.go @@ -0,0 +1,242 @@ +// Copyright 2013 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.5 + +package ssa + +// This file defines utilities for population of method sets. + +import ( + "fmt" + + "golang.org/x/tools/go/types" +) + +// MethodValue returns the Function implementing method sel, building +// wrapper methods on demand. It returns nil if sel denotes an +// abstract (interface) method. +// +// Precondition: sel.Kind() == MethodVal. +// +// Thread-safe. +// +// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu) +// +func (prog *Program) MethodValue(sel *types.Selection) *Function { + if sel.Kind() != types.MethodVal { + panic(fmt.Sprintf("Method(%s) kind != MethodVal", sel)) + } + T := sel.Recv() + if isInterface(T) { + return nil // abstract method + } + if prog.mode&LogSource != 0 { + defer logStack("Method %s %v", T, sel)() + } + + prog.methodsMu.Lock() + defer prog.methodsMu.Unlock() + + return prog.addMethod(prog.createMethodSet(T), sel) +} + +// LookupMethod returns the implementation of the method of type T +// identified by (pkg, name). It returns nil if the method exists but +// is abstract, and panics if T has no such method. +// +func (prog *Program) LookupMethod(T types.Type, pkg *types.Package, name string) *Function { + sel := prog.MethodSets.MethodSet(T).Lookup(pkg, name) + if sel == nil { + panic(fmt.Sprintf("%s has no method %s", T, types.Id(pkg, name))) + } + return prog.MethodValue(sel) +} + +// methodSet contains the (concrete) methods of a non-interface type. +type methodSet struct { + mapping map[string]*Function // populated lazily + complete bool // mapping contains all methods +} + +// Precondition: !isInterface(T). +// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu) +func (prog *Program) createMethodSet(T types.Type) *methodSet { + mset, ok := prog.methodSets.At(T).(*methodSet) + if !ok { + mset = &methodSet{mapping: make(map[string]*Function)} + prog.methodSets.Set(T, mset) + } + return mset +} + +// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu) +func (prog *Program) addMethod(mset *methodSet, sel *types.Selection) *Function { + if sel.Kind() == types.MethodExpr { + panic(sel) + } + id := sel.Obj().Id() + fn := mset.mapping[id] + if fn == nil { + obj := sel.Obj().(*types.Func) + + needsPromotion := len(sel.Index()) > 1 + needsIndirection := !isPointer(recvType(obj)) && isPointer(sel.Recv()) + if needsPromotion || needsIndirection { + fn = makeWrapper(prog, sel) + } else { + fn = prog.declaredFunc(obj) + } + if fn.Signature.Recv() == nil { + panic(fn) // missing receiver + } + mset.mapping[id] = fn + } + return fn +} + +// RuntimeTypes returns a new unordered slice containing all +// concrete types in the program for which a complete (non-empty) +// method set is required at run-time. +// +// Thread-safe. +// +// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu) +// +func (prog *Program) RuntimeTypes() []types.Type { + prog.methodsMu.Lock() + defer prog.methodsMu.Unlock() + + var res []types.Type + prog.methodSets.Iterate(func(T types.Type, v interface{}) { + if v.(*methodSet).complete { + res = append(res, T) + } + }) + return res +} + +// declaredFunc returns the concrete function/method denoted by obj. +// Panic ensues if there is none. +// +func (prog *Program) declaredFunc(obj *types.Func) *Function { + if v := prog.packageLevelValue(obj); v != nil { + return v.(*Function) + } + panic("no concrete method: " + obj.String()) +} + +// needMethodsOf ensures that runtime type information (including the +// complete method set) is available for the specified type T and all +// its subcomponents. +// +// needMethodsOf must be called for at least every type that is an +// operand of some MakeInterface instruction, and for the type of +// every exported package member. +// +// Precondition: T is not a method signature (*Signature with Recv()!=nil). +// +// Thread-safe. (Called via emitConv from multiple builder goroutines.) +// +// TODO(adonovan): make this faster. It accounts for 20% of SSA build time. +// +// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu) +// +func (prog *Program) needMethodsOf(T types.Type) { + prog.methodsMu.Lock() + prog.needMethods(T, false) + prog.methodsMu.Unlock() +} + +// Precondition: T is not a method signature (*Signature with Recv()!=nil). +// Recursive case: skip => don't create methods for T. +// +// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu) +// +func (prog *Program) needMethods(T types.Type, skip bool) { + // Each package maintains its own set of types it has visited. + if prevSkip, ok := prog.runtimeTypes.At(T).(bool); ok { + // needMethods(T) was previously called + if !prevSkip || skip { + return // already seen, with same or false 'skip' value + } + } + prog.runtimeTypes.Set(T, skip) + + tmset := prog.MethodSets.MethodSet(T) + + if !skip && !isInterface(T) && tmset.Len() > 0 { + // Create methods of T. + mset := prog.createMethodSet(T) + if !mset.complete { + mset.complete = true + n := tmset.Len() + for i := 0; i < n; i++ { + prog.addMethod(mset, tmset.At(i)) + } + } + } + + // Recursion over signatures of each method. + for i := 0; i < tmset.Len(); i++ { + sig := tmset.At(i).Type().(*types.Signature) + prog.needMethods(sig.Params(), false) + prog.needMethods(sig.Results(), false) + } + + switch t := T.(type) { + case *types.Basic: + // nop + + case *types.Interface: + // nop---handled by recursion over method set. + + case *types.Pointer: + prog.needMethods(t.Elem(), false) + + case *types.Slice: + prog.needMethods(t.Elem(), false) + + case *types.Chan: + prog.needMethods(t.Elem(), false) + + case *types.Map: + prog.needMethods(t.Key(), false) + prog.needMethods(t.Elem(), false) + + case *types.Signature: + if t.Recv() != nil { + panic(fmt.Sprintf("Signature %s has Recv %s", t, t.Recv())) + } + prog.needMethods(t.Params(), false) + prog.needMethods(t.Results(), false) + + case *types.Named: + // A pointer-to-named type can be derived from a named + // type via reflection. It may have methods too. + prog.needMethods(types.NewPointer(T), false) + + // Consider 'type T struct{S}' where S has methods. + // Reflection provides no way to get from T to struct{S}, + // only to S, so the method set of struct{S} is unwanted, + // so set 'skip' flag during recursion. + prog.needMethods(t.Underlying(), true) + + case *types.Array: + prog.needMethods(t.Elem(), false) + + case *types.Struct: + for i, n := 0, t.NumFields(); i < n; i++ { + prog.needMethods(t.Field(i).Type(), false) + } + + case *types.Tuple: + for i, n := 0, t.Len(); i < n; i++ { + prog.needMethods(t.At(i).Type(), false) + } + + default: + panic(T) + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/mode.go b/vendor/golang.org/x/tools/go/ssa/mode.go new file mode 100644 index 0000000000..d2a269893a --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/mode.go @@ -0,0 +1,100 @@ +// 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 ssa + +// This file defines the BuilderMode type and its command-line flag. + +import ( + "bytes" + "fmt" +) + +// BuilderMode is a bitmask of options for diagnostics and checking. +// +// *BuilderMode satisfies the flag.Value interface. Example: +// +// var mode = ssa.BuilderMode(0) +// func init() { flag.Var(&mode, "build", ssa.BuilderModeDoc) } +// +type BuilderMode uint + +const ( + PrintPackages BuilderMode = 1 << iota // Print package inventory to stdout + PrintFunctions // Print function SSA code to stdout + LogSource // Log source locations as SSA builder progresses + SanityCheckFunctions // Perform sanity checking of function bodies + NaiveForm // Build naïve SSA form: don't replace local loads/stores with registers + BuildSerially // Build packages serially, not in parallel. + GlobalDebug // Enable debug info for all packages + BareInits // Build init functions without guards or calls to dependent inits +) + +const BuilderModeDoc = `Options controlling the SSA builder. +The value is a sequence of zero or more of these letters: +C perform sanity [C]hecking of the SSA form. +D include [D]ebug info for every function. +P print [P]ackage inventory. +F print [F]unction SSA code. +S log [S]ource locations as SSA builder progresses. +L build distinct packages seria[L]ly instead of in parallel. +N build [N]aive SSA form: don't replace local loads/stores with registers. +I build bare [I]nit functions: no init guards or calls to dependent inits. +` + +func (m BuilderMode) String() string { + var buf bytes.Buffer + if m&GlobalDebug != 0 { + buf.WriteByte('D') + } + if m&PrintPackages != 0 { + buf.WriteByte('P') + } + if m&PrintFunctions != 0 { + buf.WriteByte('F') + } + if m&LogSource != 0 { + buf.WriteByte('S') + } + if m&SanityCheckFunctions != 0 { + buf.WriteByte('C') + } + if m&NaiveForm != 0 { + buf.WriteByte('N') + } + if m&BuildSerially != 0 { + buf.WriteByte('L') + } + return buf.String() +} + +// Set parses the flag characters in s and updates *m. +func (m *BuilderMode) Set(s string) error { + var mode BuilderMode + for _, c := range s { + switch c { + case 'D': + mode |= GlobalDebug + case 'P': + mode |= PrintPackages + case 'F': + mode |= PrintFunctions + case 'S': + mode |= LogSource | BuildSerially + case 'C': + mode |= SanityCheckFunctions + case 'N': + mode |= NaiveForm + case 'L': + mode |= BuildSerially + default: + return fmt.Errorf("unknown BuilderMode option: %q", c) + } + } + *m = mode + return nil +} + +// Get returns m. +func (m BuilderMode) Get() interface{} { return m } diff --git a/vendor/golang.org/x/tools/go/ssa/print.go b/vendor/golang.org/x/tools/go/ssa/print.go new file mode 100644 index 0000000000..55c92660d2 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/print.go @@ -0,0 +1,429 @@ +// Copyright 2013 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.5 + +package ssa + +// This file implements the String() methods for all Value and +// Instruction types. + +import ( + "bytes" + "fmt" + "go/types" + "io" + "reflect" + "sort" + + "golang.org/x/tools/go/types/typeutil" +) + +// relName returns the name of v relative to i. +// In most cases, this is identical to v.Name(), but references to +// Functions (including methods) and Globals use RelString and +// all types are displayed with relType, so that only cross-package +// references are package-qualified. +// +func relName(v Value, i Instruction) string { + var from *types.Package + if i != nil { + from = i.Parent().pkg() + } + switch v := v.(type) { + case Member: // *Function or *Global + return v.RelString(from) + case *Const: + return v.RelString(from) + } + return v.Name() +} + +func relType(t types.Type, from *types.Package) string { + return types.TypeString(t, types.RelativeTo(from)) +} + +func relString(m Member, from *types.Package) string { + // NB: not all globals have an Object (e.g. init$guard), + // so use Package().Object not Object.Package(). + if pkg := m.Package().Pkg; pkg != nil && pkg != from { + return fmt.Sprintf("%s.%s", pkg.Path(), m.Name()) + } + return m.Name() +} + +// Value.String() +// +// This method is provided only for debugging. +// It never appears in disassembly, which uses Value.Name(). + +func (v *Parameter) String() string { + from := v.Parent().pkg() + return fmt.Sprintf("parameter %s : %s", v.Name(), relType(v.Type(), from)) +} + +func (v *FreeVar) String() string { + from := v.Parent().pkg() + return fmt.Sprintf("freevar %s : %s", v.Name(), relType(v.Type(), from)) +} + +func (v *Builtin) String() string { + return fmt.Sprintf("builtin %s", v.Name()) +} + +// Instruction.String() + +func (v *Alloc) String() string { + op := "local" + if v.Heap { + op = "new" + } + from := v.Parent().pkg() + return fmt.Sprintf("%s %s (%s)", op, relType(deref(v.Type()), from), v.Comment) +} + +func (v *Phi) String() string { + var b bytes.Buffer + b.WriteString("phi [") + for i, edge := range v.Edges { + if i > 0 { + b.WriteString(", ") + } + // Be robust against malformed CFG. + block := -1 + if v.block != nil && i < len(v.block.Preds) { + block = v.block.Preds[i].Index + } + fmt.Fprintf(&b, "%d: ", block) + edgeVal := "" // be robust + if edge != nil { + edgeVal = relName(edge, v) + } + b.WriteString(edgeVal) + } + b.WriteString("]") + if v.Comment != "" { + b.WriteString(" #") + b.WriteString(v.Comment) + } + return b.String() +} + +func printCall(v *CallCommon, prefix string, instr Instruction) string { + var b bytes.Buffer + b.WriteString(prefix) + if !v.IsInvoke() { + b.WriteString(relName(v.Value, instr)) + } else { + fmt.Fprintf(&b, "invoke %s.%s", relName(v.Value, instr), v.Method.Name()) + } + b.WriteString("(") + for i, arg := range v.Args { + if i > 0 { + b.WriteString(", ") + } + b.WriteString(relName(arg, instr)) + } + if v.Signature().Variadic() { + b.WriteString("...") + } + b.WriteString(")") + return b.String() +} + +func (c *CallCommon) String() string { + return printCall(c, "", nil) +} + +func (v *Call) String() string { + return printCall(&v.Call, "", v) +} + +func (v *BinOp) String() string { + return fmt.Sprintf("%s %s %s", relName(v.X, v), v.Op.String(), relName(v.Y, v)) +} + +func (v *UnOp) String() string { + return fmt.Sprintf("%s%s%s", v.Op, relName(v.X, v), commaOk(v.CommaOk)) +} + +func printConv(prefix string, v, x Value) string { + from := v.Parent().pkg() + return fmt.Sprintf("%s %s <- %s (%s)", + prefix, + relType(v.Type(), from), + relType(x.Type(), from), + relName(x, v.(Instruction))) +} + +func (v *ChangeType) String() string { return printConv("changetype", v, v.X) } +func (v *Convert) String() string { return printConv("convert", v, v.X) } +func (v *ChangeInterface) String() string { return printConv("change interface", v, v.X) } +func (v *MakeInterface) String() string { return printConv("make", v, v.X) } + +func (v *MakeClosure) String() string { + var b bytes.Buffer + fmt.Fprintf(&b, "make closure %s", relName(v.Fn, v)) + if v.Bindings != nil { + b.WriteString(" [") + for i, c := range v.Bindings { + if i > 0 { + b.WriteString(", ") + } + b.WriteString(relName(c, v)) + } + b.WriteString("]") + } + return b.String() +} + +func (v *MakeSlice) String() string { + from := v.Parent().pkg() + return fmt.Sprintf("make %s %s %s", + relType(v.Type(), from), + relName(v.Len, v), + relName(v.Cap, v)) +} + +func (v *Slice) String() string { + var b bytes.Buffer + b.WriteString("slice ") + b.WriteString(relName(v.X, v)) + b.WriteString("[") + if v.Low != nil { + b.WriteString(relName(v.Low, v)) + } + b.WriteString(":") + if v.High != nil { + b.WriteString(relName(v.High, v)) + } + if v.Max != nil { + b.WriteString(":") + b.WriteString(relName(v.Max, v)) + } + b.WriteString("]") + return b.String() +} + +func (v *MakeMap) String() string { + res := "" + if v.Reserve != nil { + res = relName(v.Reserve, v) + } + from := v.Parent().pkg() + return fmt.Sprintf("make %s %s", relType(v.Type(), from), res) +} + +func (v *MakeChan) String() string { + from := v.Parent().pkg() + return fmt.Sprintf("make %s %s", relType(v.Type(), from), relName(v.Size, v)) +} + +func (v *FieldAddr) String() string { + st := deref(v.X.Type()).Underlying().(*types.Struct) + // Be robust against a bad index. + name := "?" + if 0 <= v.Field && v.Field < st.NumFields() { + name = st.Field(v.Field).Name() + } + return fmt.Sprintf("&%s.%s [#%d]", relName(v.X, v), name, v.Field) +} + +func (v *Field) String() string { + st := v.X.Type().Underlying().(*types.Struct) + // Be robust against a bad index. + name := "?" + if 0 <= v.Field && v.Field < st.NumFields() { + name = st.Field(v.Field).Name() + } + return fmt.Sprintf("%s.%s [#%d]", relName(v.X, v), name, v.Field) +} + +func (v *IndexAddr) String() string { + return fmt.Sprintf("&%s[%s]", relName(v.X, v), relName(v.Index, v)) +} + +func (v *Index) String() string { + return fmt.Sprintf("%s[%s]", relName(v.X, v), relName(v.Index, v)) +} + +func (v *Lookup) String() string { + return fmt.Sprintf("%s[%s]%s", relName(v.X, v), relName(v.Index, v), commaOk(v.CommaOk)) +} + +func (v *Range) String() string { + return "range " + relName(v.X, v) +} + +func (v *Next) String() string { + return "next " + relName(v.Iter, v) +} + +func (v *TypeAssert) String() string { + from := v.Parent().pkg() + return fmt.Sprintf("typeassert%s %s.(%s)", commaOk(v.CommaOk), relName(v.X, v), relType(v.AssertedType, from)) +} + +func (v *Extract) String() string { + return fmt.Sprintf("extract %s #%d", relName(v.Tuple, v), v.Index) +} + +func (s *Jump) String() string { + // Be robust against malformed CFG. + block := -1 + if s.block != nil && len(s.block.Succs) == 1 { + block = s.block.Succs[0].Index + } + return fmt.Sprintf("jump %d", block) +} + +func (s *If) String() string { + // Be robust against malformed CFG. + tblock, fblock := -1, -1 + if s.block != nil && len(s.block.Succs) == 2 { + tblock = s.block.Succs[0].Index + fblock = s.block.Succs[1].Index + } + return fmt.Sprintf("if %s goto %d else %d", relName(s.Cond, s), tblock, fblock) +} + +func (s *Go) String() string { + return printCall(&s.Call, "go ", s) +} + +func (s *Panic) String() string { + return "panic " + relName(s.X, s) +} + +func (s *Return) String() string { + var b bytes.Buffer + b.WriteString("return") + for i, r := range s.Results { + if i == 0 { + b.WriteString(" ") + } else { + b.WriteString(", ") + } + b.WriteString(relName(r, s)) + } + return b.String() +} + +func (*RunDefers) String() string { + return "rundefers" +} + +func (s *Send) String() string { + return fmt.Sprintf("send %s <- %s", relName(s.Chan, s), relName(s.X, s)) +} + +func (s *Defer) String() string { + return printCall(&s.Call, "defer ", s) +} + +func (s *Select) String() string { + var b bytes.Buffer + for i, st := range s.States { + if i > 0 { + b.WriteString(", ") + } + if st.Dir == types.RecvOnly { + b.WriteString("<-") + b.WriteString(relName(st.Chan, s)) + } else { + b.WriteString(relName(st.Chan, s)) + b.WriteString("<-") + b.WriteString(relName(st.Send, s)) + } + } + non := "" + if !s.Blocking { + non = "non" + } + return fmt.Sprintf("select %sblocking [%s]", non, b.String()) +} + +func (s *Store) String() string { + return fmt.Sprintf("*%s = %s", relName(s.Addr, s), relName(s.Val, s)) +} + +func (s *MapUpdate) String() string { + return fmt.Sprintf("%s[%s] = %s", relName(s.Map, s), relName(s.Key, s), relName(s.Value, s)) +} + +func (s *DebugRef) String() string { + p := s.Parent().Prog.Fset.Position(s.Pos()) + var descr interface{} + if s.object != nil { + descr = s.object // e.g. "var x int" + } else { + descr = reflect.TypeOf(s.Expr) // e.g. "*ast.CallExpr" + } + var addr string + if s.IsAddr { + addr = "address of " + } + return fmt.Sprintf("; %s%s @ %d:%d is %s", addr, descr, p.Line, p.Column, s.X.Name()) +} + +func (p *Package) String() string { + return "package " + p.Pkg.Path() +} + +var _ io.WriterTo = (*Package)(nil) // *Package implements io.Writer + +func (p *Package) WriteTo(w io.Writer) (int64, error) { + var buf bytes.Buffer + WritePackage(&buf, p) + n, err := w.Write(buf.Bytes()) + return int64(n), err +} + +// WritePackage writes to buf a human-readable summary of p. +func WritePackage(buf *bytes.Buffer, p *Package) { + fmt.Fprintf(buf, "%s:\n", p) + + var names []string + maxname := 0 + for name := range p.Members { + if l := len(name); l > maxname { + maxname = l + } + names = append(names, name) + } + + from := p.Pkg + sort.Strings(names) + for _, name := range names { + switch mem := p.Members[name].(type) { + case *NamedConst: + fmt.Fprintf(buf, " const %-*s %s = %s\n", + maxname, name, mem.Name(), mem.Value.RelString(from)) + + case *Function: + fmt.Fprintf(buf, " func %-*s %s\n", + maxname, name, relType(mem.Type(), from)) + + case *Type: + fmt.Fprintf(buf, " type %-*s %s\n", + maxname, name, relType(mem.Type().Underlying(), from)) + for _, meth := range typeutil.IntuitiveMethodSet(mem.Type(), &p.Prog.MethodSets) { + fmt.Fprintf(buf, " %s\n", types.SelectionString(meth, types.RelativeTo(from))) + } + + case *Global: + fmt.Fprintf(buf, " var %-*s %s\n", + maxname, name, relType(mem.Type().(*types.Pointer).Elem(), from)) + } + } + + fmt.Fprintf(buf, "\n") +} + +func commaOk(x bool) string { + if x { + return ",ok" + } + return "" +} diff --git a/vendor/golang.org/x/tools/go/ssa/print14.go b/vendor/golang.org/x/tools/go/ssa/print14.go new file mode 100644 index 0000000000..155d5ecc87 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/print14.go @@ -0,0 +1,429 @@ +// Copyright 2013 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.5 + +package ssa + +// This file implements the String() methods for all Value and +// Instruction types. + +import ( + "bytes" + "fmt" + "io" + "reflect" + "sort" + + "golang.org/x/tools/go/types" + "golang.org/x/tools/go/types/typeutil" +) + +// relName returns the name of v relative to i. +// In most cases, this is identical to v.Name(), but references to +// Functions (including methods) and Globals use RelString and +// all types are displayed with relType, so that only cross-package +// references are package-qualified. +// +func relName(v Value, i Instruction) string { + var from *types.Package + if i != nil { + from = i.Parent().pkg() + } + switch v := v.(type) { + case Member: // *Function or *Global + return v.RelString(from) + case *Const: + return v.RelString(from) + } + return v.Name() +} + +func relType(t types.Type, from *types.Package) string { + return types.TypeString(t, types.RelativeTo(from)) +} + +func relString(m Member, from *types.Package) string { + // NB: not all globals have an Object (e.g. init$guard), + // so use Package().Object not Object.Package(). + if pkg := m.Package().Pkg; pkg != nil && pkg != from { + return fmt.Sprintf("%s.%s", pkg.Path(), m.Name()) + } + return m.Name() +} + +// Value.String() +// +// This method is provided only for debugging. +// It never appears in disassembly, which uses Value.Name(). + +func (v *Parameter) String() string { + from := v.Parent().pkg() + return fmt.Sprintf("parameter %s : %s", v.Name(), relType(v.Type(), from)) +} + +func (v *FreeVar) String() string { + from := v.Parent().pkg() + return fmt.Sprintf("freevar %s : %s", v.Name(), relType(v.Type(), from)) +} + +func (v *Builtin) String() string { + return fmt.Sprintf("builtin %s", v.Name()) +} + +// Instruction.String() + +func (v *Alloc) String() string { + op := "local" + if v.Heap { + op = "new" + } + from := v.Parent().pkg() + return fmt.Sprintf("%s %s (%s)", op, relType(deref(v.Type()), from), v.Comment) +} + +func (v *Phi) String() string { + var b bytes.Buffer + b.WriteString("phi [") + for i, edge := range v.Edges { + if i > 0 { + b.WriteString(", ") + } + // Be robust against malformed CFG. + block := -1 + if v.block != nil && i < len(v.block.Preds) { + block = v.block.Preds[i].Index + } + fmt.Fprintf(&b, "%d: ", block) + edgeVal := "" // be robust + if edge != nil { + edgeVal = relName(edge, v) + } + b.WriteString(edgeVal) + } + b.WriteString("]") + if v.Comment != "" { + b.WriteString(" #") + b.WriteString(v.Comment) + } + return b.String() +} + +func printCall(v *CallCommon, prefix string, instr Instruction) string { + var b bytes.Buffer + b.WriteString(prefix) + if !v.IsInvoke() { + b.WriteString(relName(v.Value, instr)) + } else { + fmt.Fprintf(&b, "invoke %s.%s", relName(v.Value, instr), v.Method.Name()) + } + b.WriteString("(") + for i, arg := range v.Args { + if i > 0 { + b.WriteString(", ") + } + b.WriteString(relName(arg, instr)) + } + if v.Signature().Variadic() { + b.WriteString("...") + } + b.WriteString(")") + return b.String() +} + +func (c *CallCommon) String() string { + return printCall(c, "", nil) +} + +func (v *Call) String() string { + return printCall(&v.Call, "", v) +} + +func (v *BinOp) String() string { + return fmt.Sprintf("%s %s %s", relName(v.X, v), v.Op.String(), relName(v.Y, v)) +} + +func (v *UnOp) String() string { + return fmt.Sprintf("%s%s%s", v.Op, relName(v.X, v), commaOk(v.CommaOk)) +} + +func printConv(prefix string, v, x Value) string { + from := v.Parent().pkg() + return fmt.Sprintf("%s %s <- %s (%s)", + prefix, + relType(v.Type(), from), + relType(x.Type(), from), + relName(x, v.(Instruction))) +} + +func (v *ChangeType) String() string { return printConv("changetype", v, v.X) } +func (v *Convert) String() string { return printConv("convert", v, v.X) } +func (v *ChangeInterface) String() string { return printConv("change interface", v, v.X) } +func (v *MakeInterface) String() string { return printConv("make", v, v.X) } + +func (v *MakeClosure) String() string { + var b bytes.Buffer + fmt.Fprintf(&b, "make closure %s", relName(v.Fn, v)) + if v.Bindings != nil { + b.WriteString(" [") + for i, c := range v.Bindings { + if i > 0 { + b.WriteString(", ") + } + b.WriteString(relName(c, v)) + } + b.WriteString("]") + } + return b.String() +} + +func (v *MakeSlice) String() string { + from := v.Parent().pkg() + return fmt.Sprintf("make %s %s %s", + relType(v.Type(), from), + relName(v.Len, v), + relName(v.Cap, v)) +} + +func (v *Slice) String() string { + var b bytes.Buffer + b.WriteString("slice ") + b.WriteString(relName(v.X, v)) + b.WriteString("[") + if v.Low != nil { + b.WriteString(relName(v.Low, v)) + } + b.WriteString(":") + if v.High != nil { + b.WriteString(relName(v.High, v)) + } + if v.Max != nil { + b.WriteString(":") + b.WriteString(relName(v.Max, v)) + } + b.WriteString("]") + return b.String() +} + +func (v *MakeMap) String() string { + res := "" + if v.Reserve != nil { + res = relName(v.Reserve, v) + } + from := v.Parent().pkg() + return fmt.Sprintf("make %s %s", relType(v.Type(), from), res) +} + +func (v *MakeChan) String() string { + from := v.Parent().pkg() + return fmt.Sprintf("make %s %s", relType(v.Type(), from), relName(v.Size, v)) +} + +func (v *FieldAddr) String() string { + st := deref(v.X.Type()).Underlying().(*types.Struct) + // Be robust against a bad index. + name := "?" + if 0 <= v.Field && v.Field < st.NumFields() { + name = st.Field(v.Field).Name() + } + return fmt.Sprintf("&%s.%s [#%d]", relName(v.X, v), name, v.Field) +} + +func (v *Field) String() string { + st := v.X.Type().Underlying().(*types.Struct) + // Be robust against a bad index. + name := "?" + if 0 <= v.Field && v.Field < st.NumFields() { + name = st.Field(v.Field).Name() + } + return fmt.Sprintf("%s.%s [#%d]", relName(v.X, v), name, v.Field) +} + +func (v *IndexAddr) String() string { + return fmt.Sprintf("&%s[%s]", relName(v.X, v), relName(v.Index, v)) +} + +func (v *Index) String() string { + return fmt.Sprintf("%s[%s]", relName(v.X, v), relName(v.Index, v)) +} + +func (v *Lookup) String() string { + return fmt.Sprintf("%s[%s]%s", relName(v.X, v), relName(v.Index, v), commaOk(v.CommaOk)) +} + +func (v *Range) String() string { + return "range " + relName(v.X, v) +} + +func (v *Next) String() string { + return "next " + relName(v.Iter, v) +} + +func (v *TypeAssert) String() string { + from := v.Parent().pkg() + return fmt.Sprintf("typeassert%s %s.(%s)", commaOk(v.CommaOk), relName(v.X, v), relType(v.AssertedType, from)) +} + +func (v *Extract) String() string { + return fmt.Sprintf("extract %s #%d", relName(v.Tuple, v), v.Index) +} + +func (s *Jump) String() string { + // Be robust against malformed CFG. + block := -1 + if s.block != nil && len(s.block.Succs) == 1 { + block = s.block.Succs[0].Index + } + return fmt.Sprintf("jump %d", block) +} + +func (s *If) String() string { + // Be robust against malformed CFG. + tblock, fblock := -1, -1 + if s.block != nil && len(s.block.Succs) == 2 { + tblock = s.block.Succs[0].Index + fblock = s.block.Succs[1].Index + } + return fmt.Sprintf("if %s goto %d else %d", relName(s.Cond, s), tblock, fblock) +} + +func (s *Go) String() string { + return printCall(&s.Call, "go ", s) +} + +func (s *Panic) String() string { + return "panic " + relName(s.X, s) +} + +func (s *Return) String() string { + var b bytes.Buffer + b.WriteString("return") + for i, r := range s.Results { + if i == 0 { + b.WriteString(" ") + } else { + b.WriteString(", ") + } + b.WriteString(relName(r, s)) + } + return b.String() +} + +func (*RunDefers) String() string { + return "rundefers" +} + +func (s *Send) String() string { + return fmt.Sprintf("send %s <- %s", relName(s.Chan, s), relName(s.X, s)) +} + +func (s *Defer) String() string { + return printCall(&s.Call, "defer ", s) +} + +func (s *Select) String() string { + var b bytes.Buffer + for i, st := range s.States { + if i > 0 { + b.WriteString(", ") + } + if st.Dir == types.RecvOnly { + b.WriteString("<-") + b.WriteString(relName(st.Chan, s)) + } else { + b.WriteString(relName(st.Chan, s)) + b.WriteString("<-") + b.WriteString(relName(st.Send, s)) + } + } + non := "" + if !s.Blocking { + non = "non" + } + return fmt.Sprintf("select %sblocking [%s]", non, b.String()) +} + +func (s *Store) String() string { + return fmt.Sprintf("*%s = %s", relName(s.Addr, s), relName(s.Val, s)) +} + +func (s *MapUpdate) String() string { + return fmt.Sprintf("%s[%s] = %s", relName(s.Map, s), relName(s.Key, s), relName(s.Value, s)) +} + +func (s *DebugRef) String() string { + p := s.Parent().Prog.Fset.Position(s.Pos()) + var descr interface{} + if s.object != nil { + descr = s.object // e.g. "var x int" + } else { + descr = reflect.TypeOf(s.Expr) // e.g. "*ast.CallExpr" + } + var addr string + if s.IsAddr { + addr = "address of " + } + return fmt.Sprintf("; %s%s @ %d:%d is %s", addr, descr, p.Line, p.Column, s.X.Name()) +} + +func (p *Package) String() string { + return "package " + p.Pkg.Path() +} + +var _ io.WriterTo = (*Package)(nil) // *Package implements io.Writer + +func (p *Package) WriteTo(w io.Writer) (int64, error) { + var buf bytes.Buffer + WritePackage(&buf, p) + n, err := w.Write(buf.Bytes()) + return int64(n), err +} + +// WritePackage writes to buf a human-readable summary of p. +func WritePackage(buf *bytes.Buffer, p *Package) { + fmt.Fprintf(buf, "%s:\n", p) + + var names []string + maxname := 0 + for name := range p.Members { + if l := len(name); l > maxname { + maxname = l + } + names = append(names, name) + } + + from := p.Pkg + sort.Strings(names) + for _, name := range names { + switch mem := p.Members[name].(type) { + case *NamedConst: + fmt.Fprintf(buf, " const %-*s %s = %s\n", + maxname, name, mem.Name(), mem.Value.RelString(from)) + + case *Function: + fmt.Fprintf(buf, " func %-*s %s\n", + maxname, name, relType(mem.Type(), from)) + + case *Type: + fmt.Fprintf(buf, " type %-*s %s\n", + maxname, name, relType(mem.Type().Underlying(), from)) + for _, meth := range typeutil.IntuitiveMethodSet(mem.Type(), &p.Prog.MethodSets) { + fmt.Fprintf(buf, " %s\n", types.SelectionString(meth, types.RelativeTo(from))) + } + + case *Global: + fmt.Fprintf(buf, " var %-*s %s\n", + maxname, name, relType(mem.Type().(*types.Pointer).Elem(), from)) + } + } + + fmt.Fprintf(buf, "\n") +} + +func commaOk(x bool) string { + if x { + return ",ok" + } + return "" +} diff --git a/vendor/golang.org/x/tools/go/ssa/sanity.go b/vendor/golang.org/x/tools/go/ssa/sanity.go new file mode 100644 index 0000000000..4babb3757f --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/sanity.go @@ -0,0 +1,521 @@ +// Copyright 2013 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.5 + +package ssa + +// An optional pass for sanity-checking invariants of the SSA representation. +// Currently it checks CFG invariants but little at the instruction level. + +import ( + "fmt" + "go/types" + "io" + "os" + "strings" +) + +type sanity struct { + reporter io.Writer + fn *Function + block *BasicBlock + instrs map[Instruction]struct{} + insane bool +} + +// sanityCheck performs integrity checking of the SSA representation +// of the function fn and returns true if it was valid. Diagnostics +// are written to reporter if non-nil, os.Stderr otherwise. Some +// diagnostics are only warnings and do not imply a negative result. +// +// Sanity-checking is intended to facilitate the debugging of code +// transformation passes. +// +func sanityCheck(fn *Function, reporter io.Writer) bool { + if reporter == nil { + reporter = os.Stderr + } + return (&sanity{reporter: reporter}).checkFunction(fn) +} + +// mustSanityCheck is like sanityCheck but panics instead of returning +// a negative result. +// +func mustSanityCheck(fn *Function, reporter io.Writer) { + if !sanityCheck(fn, reporter) { + fn.WriteTo(os.Stderr) + panic("SanityCheck failed") + } +} + +func (s *sanity) diagnostic(prefix, format string, args ...interface{}) { + fmt.Fprintf(s.reporter, "%s: function %s", prefix, s.fn) + if s.block != nil { + fmt.Fprintf(s.reporter, ", block %s", s.block) + } + io.WriteString(s.reporter, ": ") + fmt.Fprintf(s.reporter, format, args...) + io.WriteString(s.reporter, "\n") +} + +func (s *sanity) errorf(format string, args ...interface{}) { + s.insane = true + s.diagnostic("Error", format, args...) +} + +func (s *sanity) warnf(format string, args ...interface{}) { + s.diagnostic("Warning", format, args...) +} + +// findDuplicate returns an arbitrary basic block that appeared more +// than once in blocks, or nil if all were unique. +func findDuplicate(blocks []*BasicBlock) *BasicBlock { + if len(blocks) < 2 { + return nil + } + if blocks[0] == blocks[1] { + return blocks[0] + } + // Slow path: + m := make(map[*BasicBlock]bool) + for _, b := range blocks { + if m[b] { + return b + } + m[b] = true + } + return nil +} + +func (s *sanity) checkInstr(idx int, instr Instruction) { + switch instr := instr.(type) { + case *If, *Jump, *Return, *Panic: + s.errorf("control flow instruction not at end of block") + case *Phi: + if idx == 0 { + // It suffices to apply this check to just the first phi node. + if dup := findDuplicate(s.block.Preds); dup != nil { + s.errorf("phi node in block with duplicate predecessor %s", dup) + } + } else { + prev := s.block.Instrs[idx-1] + if _, ok := prev.(*Phi); !ok { + s.errorf("Phi instruction follows a non-Phi: %T", prev) + } + } + if ne, np := len(instr.Edges), len(s.block.Preds); ne != np { + s.errorf("phi node has %d edges but %d predecessors", ne, np) + + } else { + for i, e := range instr.Edges { + if e == nil { + s.errorf("phi node '%s' has no value for edge #%d from %s", instr.Comment, i, s.block.Preds[i]) + } + } + } + + case *Alloc: + if !instr.Heap { + found := false + for _, l := range s.fn.Locals { + if l == instr { + found = true + break + } + } + if !found { + s.errorf("local alloc %s = %s does not appear in Function.Locals", instr.Name(), instr) + } + } + + case *BinOp: + case *Call: + case *ChangeInterface: + case *ChangeType: + case *Convert: + if _, ok := instr.X.Type().Underlying().(*types.Basic); !ok { + if _, ok := instr.Type().Underlying().(*types.Basic); !ok { + s.errorf("convert %s -> %s: at least one type must be basic", instr.X.Type(), instr.Type()) + } + } + + case *Defer: + case *Extract: + case *Field: + case *FieldAddr: + case *Go: + case *Index: + case *IndexAddr: + case *Lookup: + case *MakeChan: + case *MakeClosure: + numFree := len(instr.Fn.(*Function).FreeVars) + numBind := len(instr.Bindings) + if numFree != numBind { + s.errorf("MakeClosure has %d Bindings for function %s with %d free vars", + numBind, instr.Fn, numFree) + + } + if recv := instr.Type().(*types.Signature).Recv(); recv != nil { + s.errorf("MakeClosure's type includes receiver %s", recv.Type()) + } + + case *MakeInterface: + case *MakeMap: + case *MakeSlice: + case *MapUpdate: + case *Next: + case *Range: + case *RunDefers: + case *Select: + case *Send: + case *Slice: + case *Store: + case *TypeAssert: + case *UnOp: + case *DebugRef: + // TODO(adonovan): implement checks. + default: + panic(fmt.Sprintf("Unknown instruction type: %T", instr)) + } + + if call, ok := instr.(CallInstruction); ok { + if call.Common().Signature() == nil { + s.errorf("nil signature: %s", call) + } + } + + // Check that value-defining instructions have valid types + // and a valid referrer list. + if v, ok := instr.(Value); ok { + t := v.Type() + if t == nil { + s.errorf("no type: %s = %s", v.Name(), v) + } else if t == tRangeIter { + // not a proper type; ignore. + } else if b, ok := t.Underlying().(*types.Basic); ok && b.Info()&types.IsUntyped != 0 { + s.errorf("instruction has 'untyped' result: %s = %s : %s", v.Name(), v, t) + } + s.checkReferrerList(v) + } + + // Untyped constants are legal as instruction Operands(), + // for example: + // _ = "foo"[0] + // or: + // if wordsize==64 {...} + + // All other non-Instruction Values can be found via their + // enclosing Function or Package. +} + +func (s *sanity) checkFinalInstr(idx int, instr Instruction) { + switch instr := instr.(type) { + case *If: + if nsuccs := len(s.block.Succs); nsuccs != 2 { + s.errorf("If-terminated block has %d successors; expected 2", nsuccs) + return + } + if s.block.Succs[0] == s.block.Succs[1] { + s.errorf("If-instruction has same True, False target blocks: %s", s.block.Succs[0]) + return + } + + case *Jump: + if nsuccs := len(s.block.Succs); nsuccs != 1 { + s.errorf("Jump-terminated block has %d successors; expected 1", nsuccs) + return + } + + case *Return: + if nsuccs := len(s.block.Succs); nsuccs != 0 { + s.errorf("Return-terminated block has %d successors; expected none", nsuccs) + return + } + if na, nf := len(instr.Results), s.fn.Signature.Results().Len(); nf != na { + s.errorf("%d-ary return in %d-ary function", na, nf) + } + + case *Panic: + if nsuccs := len(s.block.Succs); nsuccs != 0 { + s.errorf("Panic-terminated block has %d successors; expected none", nsuccs) + return + } + + default: + s.errorf("non-control flow instruction at end of block") + } +} + +func (s *sanity) checkBlock(b *BasicBlock, index int) { + s.block = b + + if b.Index != index { + s.errorf("block has incorrect Index %d", b.Index) + } + if b.parent != s.fn { + s.errorf("block has incorrect parent %s", b.parent) + } + + // Check all blocks are reachable. + // (The entry block is always implicitly reachable, + // as is the Recover block, if any.) + if (index > 0 && b != b.parent.Recover) && len(b.Preds) == 0 { + s.warnf("unreachable block") + if b.Instrs == nil { + // Since this block is about to be pruned, + // tolerating transient problems in it + // simplifies other optimizations. + return + } + } + + // Check predecessor and successor relations are dual, + // and that all blocks in CFG belong to same function. + for _, a := range b.Preds { + found := false + for _, bb := range a.Succs { + if bb == b { + found = true + break + } + } + if !found { + s.errorf("expected successor edge in predecessor %s; found only: %s", a, a.Succs) + } + if a.parent != s.fn { + s.errorf("predecessor %s belongs to different function %s", a, a.parent) + } + } + for _, c := range b.Succs { + found := false + for _, bb := range c.Preds { + if bb == b { + found = true + break + } + } + if !found { + s.errorf("expected predecessor edge in successor %s; found only: %s", c, c.Preds) + } + if c.parent != s.fn { + s.errorf("successor %s belongs to different function %s", c, c.parent) + } + } + + // Check each instruction is sane. + n := len(b.Instrs) + if n == 0 { + s.errorf("basic block contains no instructions") + } + var rands [10]*Value // reuse storage + for j, instr := range b.Instrs { + if instr == nil { + s.errorf("nil instruction at index %d", j) + continue + } + if b2 := instr.Block(); b2 == nil { + s.errorf("nil Block() for instruction at index %d", j) + continue + } else if b2 != b { + s.errorf("wrong Block() (%s) for instruction at index %d ", b2, j) + continue + } + if j < n-1 { + s.checkInstr(j, instr) + } else { + s.checkFinalInstr(j, instr) + } + + // Check Instruction.Operands. + operands: + for i, op := range instr.Operands(rands[:0]) { + if op == nil { + s.errorf("nil operand pointer %d of %s", i, instr) + continue + } + val := *op + if val == nil { + continue // a nil operand is ok + } + + // Check that "untyped" types only appear on constant operands. + if _, ok := (*op).(*Const); !ok { + if basic, ok := (*op).Type().(*types.Basic); ok { + if basic.Info()&types.IsUntyped != 0 { + s.errorf("operand #%d of %s is untyped: %s", i, instr, basic) + } + } + } + + // Check that Operands that are also Instructions belong to same function. + // TODO(adonovan): also check their block dominates block b. + if val, ok := val.(Instruction); ok { + if val.Parent() != s.fn { + s.errorf("operand %d of %s is an instruction (%s) from function %s", i, instr, val, val.Parent()) + } + } + + // Check that each function-local operand of + // instr refers back to instr. (NB: quadratic) + switch val := val.(type) { + case *Const, *Global, *Builtin: + continue // not local + case *Function: + if val.parent == nil { + continue // only anon functions are local + } + } + + // TODO(adonovan): check val.Parent() != nil <=> val.Referrers() is defined. + + if refs := val.Referrers(); refs != nil { + for _, ref := range *refs { + if ref == instr { + continue operands + } + } + s.errorf("operand %d of %s (%s) does not refer to us", i, instr, val) + } else { + s.errorf("operand %d of %s (%s) has no referrers", i, instr, val) + } + } + } +} + +func (s *sanity) checkReferrerList(v Value) { + refs := v.Referrers() + if refs == nil { + s.errorf("%s has missing referrer list", v.Name()) + return + } + for i, ref := range *refs { + if _, ok := s.instrs[ref]; !ok { + s.errorf("%s.Referrers()[%d] = %s is not an instruction belonging to this function", v.Name(), i, ref) + } + } +} + +func (s *sanity) checkFunction(fn *Function) bool { + // TODO(adonovan): check Function invariants: + // - check params match signature + // - check transient fields are nil + // - warn if any fn.Locals do not appear among block instructions. + s.fn = fn + if fn.Prog == nil { + s.errorf("nil Prog") + } + + fn.String() // must not crash + fn.RelString(fn.pkg()) // must not crash + + // All functions have a package, except delegates (which are + // shared across packages, or duplicated as weak symbols in a + // separate-compilation model), and error.Error. + if fn.Pkg == nil { + if strings.HasPrefix(fn.Synthetic, "wrapper ") || + strings.HasPrefix(fn.Synthetic, "bound ") || + strings.HasPrefix(fn.Synthetic, "thunk ") || + strings.HasSuffix(fn.name, "Error") { + // ok + } else { + s.errorf("nil Pkg") + } + } + if src, syn := fn.Synthetic == "", fn.Syntax() != nil; src != syn { + s.errorf("got fromSource=%t, hasSyntax=%t; want same values", src, syn) + } + for i, l := range fn.Locals { + if l.Parent() != fn { + s.errorf("Local %s at index %d has wrong parent", l.Name(), i) + } + if l.Heap { + s.errorf("Local %s at index %d has Heap flag set", l.Name(), i) + } + } + // Build the set of valid referrers. + s.instrs = make(map[Instruction]struct{}) + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + s.instrs[instr] = struct{}{} + } + } + for i, p := range fn.Params { + if p.Parent() != fn { + s.errorf("Param %s at index %d has wrong parent", p.Name(), i) + } + s.checkReferrerList(p) + } + for i, fv := range fn.FreeVars { + if fv.Parent() != fn { + s.errorf("FreeVar %s at index %d has wrong parent", fv.Name(), i) + } + s.checkReferrerList(fv) + } + + if fn.Blocks != nil && len(fn.Blocks) == 0 { + // Function _had_ blocks (so it's not external) but + // they were "optimized" away, even the entry block. + s.errorf("Blocks slice is non-nil but empty") + } + for i, b := range fn.Blocks { + if b == nil { + s.warnf("nil *BasicBlock at f.Blocks[%d]", i) + continue + } + s.checkBlock(b, i) + } + if fn.Recover != nil && fn.Blocks[fn.Recover.Index] != fn.Recover { + s.errorf("Recover block is not in Blocks slice") + } + + s.block = nil + for i, anon := range fn.AnonFuncs { + if anon.Parent() != fn { + s.errorf("AnonFuncs[%d]=%s but %s.Parent()=%s", i, anon, anon, anon.Parent()) + } + } + s.fn = nil + return !s.insane +} + +// sanityCheckPackage checks invariants of packages upon creation. +// It does not require that the package is built. +// Unlike sanityCheck (for functions), it just panics at the first error. +func sanityCheckPackage(pkg *Package) { + if pkg.Pkg == nil { + panic(fmt.Sprintf("Package %s has no Object", pkg)) + } + pkg.String() // must not crash + + for name, mem := range pkg.Members { + if name != mem.Name() { + panic(fmt.Sprintf("%s: %T.Name() = %s, want %s", + pkg.Pkg.Path(), mem, mem.Name(), name)) + } + obj := mem.Object() + if obj == nil { + // This check is sound because fields + // {Global,Function}.object have type + // types.Object. (If they were declared as + // *types.{Var,Func}, we'd have a non-empty + // interface containing a nil pointer.) + + continue // not all members have typechecker objects + } + if obj.Name() != name { + if obj.Name() == "init" && strings.HasPrefix(mem.Name(), "init#") { + // Ok. The name of a declared init function varies between + // its types.Func ("init") and its ssa.Function ("init#%d"). + } else { + panic(fmt.Sprintf("%s: %T.Object().Name() = %s, want %s", + pkg.Pkg.Path(), mem, obj.Name(), name)) + } + } + if obj.Pos() != mem.Pos() { + panic(fmt.Sprintf("%s Pos=%d obj.Pos=%d", mem, mem.Pos(), obj.Pos())) + } + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/sanity14.go b/vendor/golang.org/x/tools/go/ssa/sanity14.go new file mode 100644 index 0000000000..fe4d4ed252 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/sanity14.go @@ -0,0 +1,522 @@ +// Copyright 2013 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.5 + +package ssa + +// An optional pass for sanity-checking invariants of the SSA representation. +// Currently it checks CFG invariants but little at the instruction level. + +import ( + "fmt" + "io" + "os" + "strings" + + "golang.org/x/tools/go/types" +) + +type sanity struct { + reporter io.Writer + fn *Function + block *BasicBlock + instrs map[Instruction]struct{} + insane bool +} + +// sanityCheck performs integrity checking of the SSA representation +// of the function fn and returns true if it was valid. Diagnostics +// are written to reporter if non-nil, os.Stderr otherwise. Some +// diagnostics are only warnings and do not imply a negative result. +// +// Sanity-checking is intended to facilitate the debugging of code +// transformation passes. +// +func sanityCheck(fn *Function, reporter io.Writer) bool { + if reporter == nil { + reporter = os.Stderr + } + return (&sanity{reporter: reporter}).checkFunction(fn) +} + +// mustSanityCheck is like sanityCheck but panics instead of returning +// a negative result. +// +func mustSanityCheck(fn *Function, reporter io.Writer) { + if !sanityCheck(fn, reporter) { + fn.WriteTo(os.Stderr) + panic("SanityCheck failed") + } +} + +func (s *sanity) diagnostic(prefix, format string, args ...interface{}) { + fmt.Fprintf(s.reporter, "%s: function %s", prefix, s.fn) + if s.block != nil { + fmt.Fprintf(s.reporter, ", block %s", s.block) + } + io.WriteString(s.reporter, ": ") + fmt.Fprintf(s.reporter, format, args...) + io.WriteString(s.reporter, "\n") +} + +func (s *sanity) errorf(format string, args ...interface{}) { + s.insane = true + s.diagnostic("Error", format, args...) +} + +func (s *sanity) warnf(format string, args ...interface{}) { + s.diagnostic("Warning", format, args...) +} + +// findDuplicate returns an arbitrary basic block that appeared more +// than once in blocks, or nil if all were unique. +func findDuplicate(blocks []*BasicBlock) *BasicBlock { + if len(blocks) < 2 { + return nil + } + if blocks[0] == blocks[1] { + return blocks[0] + } + // Slow path: + m := make(map[*BasicBlock]bool) + for _, b := range blocks { + if m[b] { + return b + } + m[b] = true + } + return nil +} + +func (s *sanity) checkInstr(idx int, instr Instruction) { + switch instr := instr.(type) { + case *If, *Jump, *Return, *Panic: + s.errorf("control flow instruction not at end of block") + case *Phi: + if idx == 0 { + // It suffices to apply this check to just the first phi node. + if dup := findDuplicate(s.block.Preds); dup != nil { + s.errorf("phi node in block with duplicate predecessor %s", dup) + } + } else { + prev := s.block.Instrs[idx-1] + if _, ok := prev.(*Phi); !ok { + s.errorf("Phi instruction follows a non-Phi: %T", prev) + } + } + if ne, np := len(instr.Edges), len(s.block.Preds); ne != np { + s.errorf("phi node has %d edges but %d predecessors", ne, np) + + } else { + for i, e := range instr.Edges { + if e == nil { + s.errorf("phi node '%s' has no value for edge #%d from %s", instr.Comment, i, s.block.Preds[i]) + } + } + } + + case *Alloc: + if !instr.Heap { + found := false + for _, l := range s.fn.Locals { + if l == instr { + found = true + break + } + } + if !found { + s.errorf("local alloc %s = %s does not appear in Function.Locals", instr.Name(), instr) + } + } + + case *BinOp: + case *Call: + case *ChangeInterface: + case *ChangeType: + case *Convert: + if _, ok := instr.X.Type().Underlying().(*types.Basic); !ok { + if _, ok := instr.Type().Underlying().(*types.Basic); !ok { + s.errorf("convert %s -> %s: at least one type must be basic", instr.X.Type(), instr.Type()) + } + } + + case *Defer: + case *Extract: + case *Field: + case *FieldAddr: + case *Go: + case *Index: + case *IndexAddr: + case *Lookup: + case *MakeChan: + case *MakeClosure: + numFree := len(instr.Fn.(*Function).FreeVars) + numBind := len(instr.Bindings) + if numFree != numBind { + s.errorf("MakeClosure has %d Bindings for function %s with %d free vars", + numBind, instr.Fn, numFree) + + } + if recv := instr.Type().(*types.Signature).Recv(); recv != nil { + s.errorf("MakeClosure's type includes receiver %s", recv.Type()) + } + + case *MakeInterface: + case *MakeMap: + case *MakeSlice: + case *MapUpdate: + case *Next: + case *Range: + case *RunDefers: + case *Select: + case *Send: + case *Slice: + case *Store: + case *TypeAssert: + case *UnOp: + case *DebugRef: + // TODO(adonovan): implement checks. + default: + panic(fmt.Sprintf("Unknown instruction type: %T", instr)) + } + + if call, ok := instr.(CallInstruction); ok { + if call.Common().Signature() == nil { + s.errorf("nil signature: %s", call) + } + } + + // Check that value-defining instructions have valid types + // and a valid referrer list. + if v, ok := instr.(Value); ok { + t := v.Type() + if t == nil { + s.errorf("no type: %s = %s", v.Name(), v) + } else if t == tRangeIter { + // not a proper type; ignore. + } else if b, ok := t.Underlying().(*types.Basic); ok && b.Info()&types.IsUntyped != 0 { + s.errorf("instruction has 'untyped' result: %s = %s : %s", v.Name(), v, t) + } + s.checkReferrerList(v) + } + + // Untyped constants are legal as instruction Operands(), + // for example: + // _ = "foo"[0] + // or: + // if wordsize==64 {...} + + // All other non-Instruction Values can be found via their + // enclosing Function or Package. +} + +func (s *sanity) checkFinalInstr(idx int, instr Instruction) { + switch instr := instr.(type) { + case *If: + if nsuccs := len(s.block.Succs); nsuccs != 2 { + s.errorf("If-terminated block has %d successors; expected 2", nsuccs) + return + } + if s.block.Succs[0] == s.block.Succs[1] { + s.errorf("If-instruction has same True, False target blocks: %s", s.block.Succs[0]) + return + } + + case *Jump: + if nsuccs := len(s.block.Succs); nsuccs != 1 { + s.errorf("Jump-terminated block has %d successors; expected 1", nsuccs) + return + } + + case *Return: + if nsuccs := len(s.block.Succs); nsuccs != 0 { + s.errorf("Return-terminated block has %d successors; expected none", nsuccs) + return + } + if na, nf := len(instr.Results), s.fn.Signature.Results().Len(); nf != na { + s.errorf("%d-ary return in %d-ary function", na, nf) + } + + case *Panic: + if nsuccs := len(s.block.Succs); nsuccs != 0 { + s.errorf("Panic-terminated block has %d successors; expected none", nsuccs) + return + } + + default: + s.errorf("non-control flow instruction at end of block") + } +} + +func (s *sanity) checkBlock(b *BasicBlock, index int) { + s.block = b + + if b.Index != index { + s.errorf("block has incorrect Index %d", b.Index) + } + if b.parent != s.fn { + s.errorf("block has incorrect parent %s", b.parent) + } + + // Check all blocks are reachable. + // (The entry block is always implicitly reachable, + // as is the Recover block, if any.) + if (index > 0 && b != b.parent.Recover) && len(b.Preds) == 0 { + s.warnf("unreachable block") + if b.Instrs == nil { + // Since this block is about to be pruned, + // tolerating transient problems in it + // simplifies other optimizations. + return + } + } + + // Check predecessor and successor relations are dual, + // and that all blocks in CFG belong to same function. + for _, a := range b.Preds { + found := false + for _, bb := range a.Succs { + if bb == b { + found = true + break + } + } + if !found { + s.errorf("expected successor edge in predecessor %s; found only: %s", a, a.Succs) + } + if a.parent != s.fn { + s.errorf("predecessor %s belongs to different function %s", a, a.parent) + } + } + for _, c := range b.Succs { + found := false + for _, bb := range c.Preds { + if bb == b { + found = true + break + } + } + if !found { + s.errorf("expected predecessor edge in successor %s; found only: %s", c, c.Preds) + } + if c.parent != s.fn { + s.errorf("successor %s belongs to different function %s", c, c.parent) + } + } + + // Check each instruction is sane. + n := len(b.Instrs) + if n == 0 { + s.errorf("basic block contains no instructions") + } + var rands [10]*Value // reuse storage + for j, instr := range b.Instrs { + if instr == nil { + s.errorf("nil instruction at index %d", j) + continue + } + if b2 := instr.Block(); b2 == nil { + s.errorf("nil Block() for instruction at index %d", j) + continue + } else if b2 != b { + s.errorf("wrong Block() (%s) for instruction at index %d ", b2, j) + continue + } + if j < n-1 { + s.checkInstr(j, instr) + } else { + s.checkFinalInstr(j, instr) + } + + // Check Instruction.Operands. + operands: + for i, op := range instr.Operands(rands[:0]) { + if op == nil { + s.errorf("nil operand pointer %d of %s", i, instr) + continue + } + val := *op + if val == nil { + continue // a nil operand is ok + } + + // Check that "untyped" types only appear on constant operands. + if _, ok := (*op).(*Const); !ok { + if basic, ok := (*op).Type().(*types.Basic); ok { + if basic.Info()&types.IsUntyped != 0 { + s.errorf("operand #%d of %s is untyped: %s", i, instr, basic) + } + } + } + + // Check that Operands that are also Instructions belong to same function. + // TODO(adonovan): also check their block dominates block b. + if val, ok := val.(Instruction); ok { + if val.Parent() != s.fn { + s.errorf("operand %d of %s is an instruction (%s) from function %s", i, instr, val, val.Parent()) + } + } + + // Check that each function-local operand of + // instr refers back to instr. (NB: quadratic) + switch val := val.(type) { + case *Const, *Global, *Builtin: + continue // not local + case *Function: + if val.parent == nil { + continue // only anon functions are local + } + } + + // TODO(adonovan): check val.Parent() != nil <=> val.Referrers() is defined. + + if refs := val.Referrers(); refs != nil { + for _, ref := range *refs { + if ref == instr { + continue operands + } + } + s.errorf("operand %d of %s (%s) does not refer to us", i, instr, val) + } else { + s.errorf("operand %d of %s (%s) has no referrers", i, instr, val) + } + } + } +} + +func (s *sanity) checkReferrerList(v Value) { + refs := v.Referrers() + if refs == nil { + s.errorf("%s has missing referrer list", v.Name()) + return + } + for i, ref := range *refs { + if _, ok := s.instrs[ref]; !ok { + s.errorf("%s.Referrers()[%d] = %s is not an instruction belonging to this function", v.Name(), i, ref) + } + } +} + +func (s *sanity) checkFunction(fn *Function) bool { + // TODO(adonovan): check Function invariants: + // - check params match signature + // - check transient fields are nil + // - warn if any fn.Locals do not appear among block instructions. + s.fn = fn + if fn.Prog == nil { + s.errorf("nil Prog") + } + + fn.String() // must not crash + fn.RelString(fn.pkg()) // must not crash + + // All functions have a package, except delegates (which are + // shared across packages, or duplicated as weak symbols in a + // separate-compilation model), and error.Error. + if fn.Pkg == nil { + if strings.HasPrefix(fn.Synthetic, "wrapper ") || + strings.HasPrefix(fn.Synthetic, "bound ") || + strings.HasPrefix(fn.Synthetic, "thunk ") || + strings.HasSuffix(fn.name, "Error") { + // ok + } else { + s.errorf("nil Pkg") + } + } + if src, syn := fn.Synthetic == "", fn.Syntax() != nil; src != syn { + s.errorf("got fromSource=%t, hasSyntax=%t; want same values", src, syn) + } + for i, l := range fn.Locals { + if l.Parent() != fn { + s.errorf("Local %s at index %d has wrong parent", l.Name(), i) + } + if l.Heap { + s.errorf("Local %s at index %d has Heap flag set", l.Name(), i) + } + } + // Build the set of valid referrers. + s.instrs = make(map[Instruction]struct{}) + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + s.instrs[instr] = struct{}{} + } + } + for i, p := range fn.Params { + if p.Parent() != fn { + s.errorf("Param %s at index %d has wrong parent", p.Name(), i) + } + s.checkReferrerList(p) + } + for i, fv := range fn.FreeVars { + if fv.Parent() != fn { + s.errorf("FreeVar %s at index %d has wrong parent", fv.Name(), i) + } + s.checkReferrerList(fv) + } + + if fn.Blocks != nil && len(fn.Blocks) == 0 { + // Function _had_ blocks (so it's not external) but + // they were "optimized" away, even the entry block. + s.errorf("Blocks slice is non-nil but empty") + } + for i, b := range fn.Blocks { + if b == nil { + s.warnf("nil *BasicBlock at f.Blocks[%d]", i) + continue + } + s.checkBlock(b, i) + } + if fn.Recover != nil && fn.Blocks[fn.Recover.Index] != fn.Recover { + s.errorf("Recover block is not in Blocks slice") + } + + s.block = nil + for i, anon := range fn.AnonFuncs { + if anon.Parent() != fn { + s.errorf("AnonFuncs[%d]=%s but %s.Parent()=%s", i, anon, anon, anon.Parent()) + } + } + s.fn = nil + return !s.insane +} + +// sanityCheckPackage checks invariants of packages upon creation. +// It does not require that the package is built. +// Unlike sanityCheck (for functions), it just panics at the first error. +func sanityCheckPackage(pkg *Package) { + if pkg.Pkg == nil { + panic(fmt.Sprintf("Package %s has no Object", pkg)) + } + pkg.String() // must not crash + + for name, mem := range pkg.Members { + if name != mem.Name() { + panic(fmt.Sprintf("%s: %T.Name() = %s, want %s", + pkg.Pkg.Path(), mem, mem.Name(), name)) + } + obj := mem.Object() + if obj == nil { + // This check is sound because fields + // {Global,Function}.object have type + // types.Object. (If they were declared as + // *types.{Var,Func}, we'd have a non-empty + // interface containing a nil pointer.) + + continue // not all members have typechecker objects + } + if obj.Name() != name { + if obj.Name() == "init" && strings.HasPrefix(mem.Name(), "init#") { + // Ok. The name of a declared init function varies between + // its types.Func ("init") and its ssa.Function ("init#%d"). + } else { + panic(fmt.Sprintf("%s: %T.Object().Name() = %s, want %s", + pkg.Pkg.Path(), mem, obj.Name(), name)) + } + } + if obj.Pos() != mem.Pos() { + panic(fmt.Sprintf("%s Pos=%d obj.Pos=%d", mem, mem.Pos(), obj.Pos())) + } + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/source.go b/vendor/golang.org/x/tools/go/ssa/source.go new file mode 100644 index 0000000000..3a6f0392eb --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/source.go @@ -0,0 +1,295 @@ +// Copyright 2013 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.5 + +package ssa + +// This file defines utilities for working with source positions +// or source-level named entities ("objects"). + +// TODO(adonovan): test that {Value,Instruction}.Pos() positions match +// the originating syntax, as specified. + +import ( + "go/ast" + "go/token" + "go/types" +) + +// EnclosingFunction returns the function that contains the syntax +// node denoted by path. +// +// Syntax associated with package-level variable specifications is +// enclosed by the package's init() function. +// +// Returns nil if not found; reasons might include: +// - the node is not enclosed by any function. +// - the node is within an anonymous function (FuncLit) and +// its SSA function has not been created yet +// (pkg.Build() has not yet been called). +// +func EnclosingFunction(pkg *Package, path []ast.Node) *Function { + // Start with package-level function... + fn := findEnclosingPackageLevelFunction(pkg, path) + if fn == nil { + return nil // not in any function + } + + // ...then walk down the nested anonymous functions. + n := len(path) +outer: + for i := range path { + if lit, ok := path[n-1-i].(*ast.FuncLit); ok { + for _, anon := range fn.AnonFuncs { + if anon.Pos() == lit.Type.Func { + fn = anon + continue outer + } + } + // SSA function not found: + // - package not yet built, or maybe + // - builder skipped FuncLit in dead block + // (in principle; but currently the Builder + // generates even dead FuncLits). + return nil + } + } + return fn +} + +// HasEnclosingFunction returns true if the AST node denoted by path +// is contained within the declaration of some function or +// package-level variable. +// +// Unlike EnclosingFunction, the behaviour of this function does not +// depend on whether SSA code for pkg has been built, so it can be +// used to quickly reject check inputs that will cause +// EnclosingFunction to fail, prior to SSA building. +// +func HasEnclosingFunction(pkg *Package, path []ast.Node) bool { + return findEnclosingPackageLevelFunction(pkg, path) != nil +} + +// findEnclosingPackageLevelFunction returns the Function +// corresponding to the package-level function enclosing path. +// +func findEnclosingPackageLevelFunction(pkg *Package, path []ast.Node) *Function { + if n := len(path); n >= 2 { // [... {Gen,Func}Decl File] + switch decl := path[n-2].(type) { + case *ast.GenDecl: + if decl.Tok == token.VAR && n >= 3 { + // Package-level 'var' initializer. + return pkg.init + } + + case *ast.FuncDecl: + if decl.Recv == nil && decl.Name.Name == "init" { + // Explicit init() function. + for _, b := range pkg.init.Blocks { + for _, instr := range b.Instrs { + if instr, ok := instr.(*Call); ok { + if callee, ok := instr.Call.Value.(*Function); ok && callee.Pkg == pkg && callee.Pos() == decl.Name.NamePos { + return callee + } + } + } + } + // Hack: return non-nil when SSA is not yet + // built so that HasEnclosingFunction works. + return pkg.init + } + // Declared function/method. + return findNamedFunc(pkg, decl.Name.NamePos) + } + } + return nil // not in any function +} + +// findNamedFunc returns the named function whose FuncDecl.Ident is at +// position pos. +// +func findNamedFunc(pkg *Package, pos token.Pos) *Function { + // Look at all package members and method sets of named types. + // Not very efficient. + for _, mem := range pkg.Members { + switch mem := mem.(type) { + case *Function: + if mem.Pos() == pos { + return mem + } + case *Type: + mset := pkg.Prog.MethodSets.MethodSet(types.NewPointer(mem.Type())) + for i, n := 0, mset.Len(); i < n; i++ { + // Don't call Program.Method: avoid creating wrappers. + obj := mset.At(i).Obj().(*types.Func) + if obj.Pos() == pos { + return pkg.values[obj].(*Function) + } + } + } + } + return nil +} + +// ValueForExpr returns the SSA Value that corresponds to non-constant +// expression e. +// +// It returns nil if no value was found, e.g. +// - the expression is not lexically contained within f; +// - f was not built with debug information; or +// - e is a constant expression. (For efficiency, no debug +// information is stored for constants. Use +// go/types.Info.Types[e].Value instead.) +// - e is a reference to nil or a built-in function. +// - the value was optimised away. +// +// If e is an addressable expression used in an lvalue context, +// value is the address denoted by e, and isAddr is true. +// +// The types of e (or &e, if isAddr) and the result are equal +// (modulo "untyped" bools resulting from comparisons). +// +// (Tip: to find the ssa.Value given a source position, use +// importer.PathEnclosingInterval to locate the ast.Node, then +// EnclosingFunction to locate the Function, then ValueForExpr to find +// the ssa.Value.) +// +func (f *Function) ValueForExpr(e ast.Expr) (value Value, isAddr bool) { + if f.debugInfo() { // (opt) + e = unparen(e) + for _, b := range f.Blocks { + for _, instr := range b.Instrs { + if ref, ok := instr.(*DebugRef); ok { + if ref.Expr == e { + return ref.X, ref.IsAddr + } + } + } + } + } + return +} + +// --- Lookup functions for source-level named entities (types.Objects) --- + +// Package returns the SSA Package corresponding to the specified +// type-checker package object. +// It returns nil if no such SSA package has been created. +// +func (prog *Program) Package(obj *types.Package) *Package { + return prog.packages[obj] +} + +// packageLevelValue returns the package-level value corresponding to +// the specified named object, which may be a package-level const +// (*Const), var (*Global) or func (*Function) of some package in +// prog. It returns nil if the object is not found. +// +func (prog *Program) packageLevelValue(obj types.Object) Value { + if pkg, ok := prog.packages[obj.Pkg()]; ok { + return pkg.values[obj] + } + return nil +} + +// FuncValue returns the concrete Function denoted by the source-level +// named function obj, or nil if obj denotes an interface method. +// +// TODO(adonovan): check the invariant that obj.Type() matches the +// result's Signature, both in the params/results and in the receiver. +// +func (prog *Program) FuncValue(obj *types.Func) *Function { + fn, _ := prog.packageLevelValue(obj).(*Function) + return fn +} + +// ConstValue returns the SSA Value denoted by the source-level named +// constant obj. +// +func (prog *Program) ConstValue(obj *types.Const) *Const { + // TODO(adonovan): opt: share (don't reallocate) + // Consts for const objects and constant ast.Exprs. + + // Universal constant? {true,false,nil} + if obj.Parent() == types.Universe { + return NewConst(obj.Val(), obj.Type()) + } + // Package-level named constant? + if v := prog.packageLevelValue(obj); v != nil { + return v.(*Const) + } + return NewConst(obj.Val(), obj.Type()) +} + +// VarValue returns the SSA Value that corresponds to a specific +// identifier denoting the source-level named variable obj. +// +// VarValue returns nil if a local variable was not found, perhaps +// because its package was not built, the debug information was not +// requested during SSA construction, or the value was optimized away. +// +// ref is the path to an ast.Ident (e.g. from PathEnclosingInterval), +// and that ident must resolve to obj. +// +// pkg is the package enclosing the reference. (A reference to a var +// always occurs within a function, so we need to know where to find it.) +// +// If the identifier is a field selector and its base expression is +// non-addressable, then VarValue returns the value of that field. +// For example: +// func f() struct {x int} +// f().x // VarValue(x) returns a *Field instruction of type int +// +// All other identifiers denote addressable locations (variables). +// For them, VarValue may return either the variable's address or its +// value, even when the expression is evaluated only for its value; the +// situation is reported by isAddr, the second component of the result. +// +// If !isAddr, the returned value is the one associated with the +// specific identifier. For example, +// var x int // VarValue(x) returns Const 0 here +// x = 1 // VarValue(x) returns Const 1 here +// +// It is not specified whether the value or the address is returned in +// any particular case, as it may depend upon optimizations performed +// during SSA code generation, such as registerization, constant +// folding, avoidance of materialization of subexpressions, etc. +// +func (prog *Program) VarValue(obj *types.Var, pkg *Package, ref []ast.Node) (value Value, isAddr bool) { + // All references to a var are local to some function, possibly init. + fn := EnclosingFunction(pkg, ref) + if fn == nil { + return // e.g. def of struct field; SSA not built? + } + + id := ref[0].(*ast.Ident) + + // Defining ident of a parameter? + if id.Pos() == obj.Pos() { + for _, param := range fn.Params { + if param.Object() == obj { + return param, false + } + } + } + + // Other ident? + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + if dr, ok := instr.(*DebugRef); ok { + if dr.Pos() == id.Pos() { + return dr.X, dr.IsAddr + } + } + } + } + + // Defining ident of package-level var? + if v := prog.packageLevelValue(obj); v != nil { + return v.(*Global), true + } + + return // e.g. debug info not requested, or var optimized away +} diff --git a/vendor/golang.org/x/tools/go/ssa/source14.go b/vendor/golang.org/x/tools/go/ssa/source14.go new file mode 100644 index 0000000000..af93136cef --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/source14.go @@ -0,0 +1,296 @@ +// Copyright 2013 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.5 + +package ssa + +// This file defines utilities for working with source positions +// or source-level named entities ("objects"). + +// TODO(adonovan): test that {Value,Instruction}.Pos() positions match +// the originating syntax, as specified. + +import ( + "go/ast" + "go/token" + + "golang.org/x/tools/go/types" +) + +// EnclosingFunction returns the function that contains the syntax +// node denoted by path. +// +// Syntax associated with package-level variable specifications is +// enclosed by the package's init() function. +// +// Returns nil if not found; reasons might include: +// - the node is not enclosed by any function. +// - the node is within an anonymous function (FuncLit) and +// its SSA function has not been created yet +// (pkg.Build() has not yet been called). +// +func EnclosingFunction(pkg *Package, path []ast.Node) *Function { + // Start with package-level function... + fn := findEnclosingPackageLevelFunction(pkg, path) + if fn == nil { + return nil // not in any function + } + + // ...then walk down the nested anonymous functions. + n := len(path) +outer: + for i := range path { + if lit, ok := path[n-1-i].(*ast.FuncLit); ok { + for _, anon := range fn.AnonFuncs { + if anon.Pos() == lit.Type.Func { + fn = anon + continue outer + } + } + // SSA function not found: + // - package not yet built, or maybe + // - builder skipped FuncLit in dead block + // (in principle; but currently the Builder + // generates even dead FuncLits). + return nil + } + } + return fn +} + +// HasEnclosingFunction returns true if the AST node denoted by path +// is contained within the declaration of some function or +// package-level variable. +// +// Unlike EnclosingFunction, the behaviour of this function does not +// depend on whether SSA code for pkg has been built, so it can be +// used to quickly reject check inputs that will cause +// EnclosingFunction to fail, prior to SSA building. +// +func HasEnclosingFunction(pkg *Package, path []ast.Node) bool { + return findEnclosingPackageLevelFunction(pkg, path) != nil +} + +// findEnclosingPackageLevelFunction returns the Function +// corresponding to the package-level function enclosing path. +// +func findEnclosingPackageLevelFunction(pkg *Package, path []ast.Node) *Function { + if n := len(path); n >= 2 { // [... {Gen,Func}Decl File] + switch decl := path[n-2].(type) { + case *ast.GenDecl: + if decl.Tok == token.VAR && n >= 3 { + // Package-level 'var' initializer. + return pkg.init + } + + case *ast.FuncDecl: + if decl.Recv == nil && decl.Name.Name == "init" { + // Explicit init() function. + for _, b := range pkg.init.Blocks { + for _, instr := range b.Instrs { + if instr, ok := instr.(*Call); ok { + if callee, ok := instr.Call.Value.(*Function); ok && callee.Pkg == pkg && callee.Pos() == decl.Name.NamePos { + return callee + } + } + } + } + // Hack: return non-nil when SSA is not yet + // built so that HasEnclosingFunction works. + return pkg.init + } + // Declared function/method. + return findNamedFunc(pkg, decl.Name.NamePos) + } + } + return nil // not in any function +} + +// findNamedFunc returns the named function whose FuncDecl.Ident is at +// position pos. +// +func findNamedFunc(pkg *Package, pos token.Pos) *Function { + // Look at all package members and method sets of named types. + // Not very efficient. + for _, mem := range pkg.Members { + switch mem := mem.(type) { + case *Function: + if mem.Pos() == pos { + return mem + } + case *Type: + mset := pkg.Prog.MethodSets.MethodSet(types.NewPointer(mem.Type())) + for i, n := 0, mset.Len(); i < n; i++ { + // Don't call Program.Method: avoid creating wrappers. + obj := mset.At(i).Obj().(*types.Func) + if obj.Pos() == pos { + return pkg.values[obj].(*Function) + } + } + } + } + return nil +} + +// ValueForExpr returns the SSA Value that corresponds to non-constant +// expression e. +// +// It returns nil if no value was found, e.g. +// - the expression is not lexically contained within f; +// - f was not built with debug information; or +// - e is a constant expression. (For efficiency, no debug +// information is stored for constants. Use +// go/types.Info.Types[e].Value instead.) +// - e is a reference to nil or a built-in function. +// - the value was optimised away. +// +// If e is an addressable expression used in an lvalue context, +// value is the address denoted by e, and isAddr is true. +// +// The types of e (or &e, if isAddr) and the result are equal +// (modulo "untyped" bools resulting from comparisons). +// +// (Tip: to find the ssa.Value given a source position, use +// importer.PathEnclosingInterval to locate the ast.Node, then +// EnclosingFunction to locate the Function, then ValueForExpr to find +// the ssa.Value.) +// +func (f *Function) ValueForExpr(e ast.Expr) (value Value, isAddr bool) { + if f.debugInfo() { // (opt) + e = unparen(e) + for _, b := range f.Blocks { + for _, instr := range b.Instrs { + if ref, ok := instr.(*DebugRef); ok { + if ref.Expr == e { + return ref.X, ref.IsAddr + } + } + } + } + } + return +} + +// --- Lookup functions for source-level named entities (types.Objects) --- + +// Package returns the SSA Package corresponding to the specified +// type-checker package object. +// It returns nil if no such SSA package has been created. +// +func (prog *Program) Package(obj *types.Package) *Package { + return prog.packages[obj] +} + +// packageLevelValue returns the package-level value corresponding to +// the specified named object, which may be a package-level const +// (*Const), var (*Global) or func (*Function) of some package in +// prog. It returns nil if the object is not found. +// +func (prog *Program) packageLevelValue(obj types.Object) Value { + if pkg, ok := prog.packages[obj.Pkg()]; ok { + return pkg.values[obj] + } + return nil +} + +// FuncValue returns the concrete Function denoted by the source-level +// named function obj, or nil if obj denotes an interface method. +// +// TODO(adonovan): check the invariant that obj.Type() matches the +// result's Signature, both in the params/results and in the receiver. +// +func (prog *Program) FuncValue(obj *types.Func) *Function { + fn, _ := prog.packageLevelValue(obj).(*Function) + return fn +} + +// ConstValue returns the SSA Value denoted by the source-level named +// constant obj. +// +func (prog *Program) ConstValue(obj *types.Const) *Const { + // TODO(adonovan): opt: share (don't reallocate) + // Consts for const objects and constant ast.Exprs. + + // Universal constant? {true,false,nil} + if obj.Parent() == types.Universe { + return NewConst(obj.Val(), obj.Type()) + } + // Package-level named constant? + if v := prog.packageLevelValue(obj); v != nil { + return v.(*Const) + } + return NewConst(obj.Val(), obj.Type()) +} + +// VarValue returns the SSA Value that corresponds to a specific +// identifier denoting the source-level named variable obj. +// +// VarValue returns nil if a local variable was not found, perhaps +// because its package was not built, the debug information was not +// requested during SSA construction, or the value was optimized away. +// +// ref is the path to an ast.Ident (e.g. from PathEnclosingInterval), +// and that ident must resolve to obj. +// +// pkg is the package enclosing the reference. (A reference to a var +// always occurs within a function, so we need to know where to find it.) +// +// If the identifier is a field selector and its base expression is +// non-addressable, then VarValue returns the value of that field. +// For example: +// func f() struct {x int} +// f().x // VarValue(x) returns a *Field instruction of type int +// +// All other identifiers denote addressable locations (variables). +// For them, VarValue may return either the variable's address or its +// value, even when the expression is evaluated only for its value; the +// situation is reported by isAddr, the second component of the result. +// +// If !isAddr, the returned value is the one associated with the +// specific identifier. For example, +// var x int // VarValue(x) returns Const 0 here +// x = 1 // VarValue(x) returns Const 1 here +// +// It is not specified whether the value or the address is returned in +// any particular case, as it may depend upon optimizations performed +// during SSA code generation, such as registerization, constant +// folding, avoidance of materialization of subexpressions, etc. +// +func (prog *Program) VarValue(obj *types.Var, pkg *Package, ref []ast.Node) (value Value, isAddr bool) { + // All references to a var are local to some function, possibly init. + fn := EnclosingFunction(pkg, ref) + if fn == nil { + return // e.g. def of struct field; SSA not built? + } + + id := ref[0].(*ast.Ident) + + // Defining ident of a parameter? + if id.Pos() == obj.Pos() { + for _, param := range fn.Params { + if param.Object() == obj { + return param, false + } + } + } + + // Other ident? + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + if dr, ok := instr.(*DebugRef); ok { + if dr.Pos() == id.Pos() { + return dr.X, dr.IsAddr + } + } + } + } + + // Defining ident of package-level var? + if v := prog.packageLevelValue(obj); v != nil { + return v.(*Global), true + } + + return // e.g. debug info not requested, or var optimized away +} diff --git a/vendor/golang.org/x/tools/go/ssa/source14_test.go b/vendor/golang.org/x/tools/go/ssa/source14_test.go new file mode 100644 index 0000000000..cd7b268d05 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/source14_test.go @@ -0,0 +1,395 @@ +// Copyright 2013 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.5 + +package ssa_test + +// This file defines tests of source-level debugging utilities. + +import ( + "fmt" + "go/ast" + "go/parser" + "go/token" + "os" + "regexp" + "runtime" + "strings" + "testing" + + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/go/types" +) + +func TestObjValueLookup(t *testing.T) { + if runtime.GOOS == "android" { + t.Skipf("no testdata directory on %s", runtime.GOOS) + } + + conf := loader.Config{ParserMode: parser.ParseComments} + f, err := conf.ParseFile("testdata/objlookup.go", nil) + if err != nil { + t.Error(err) + return + } + conf.CreateFromFiles("main", f) + + // Maps each var Ident (represented "name:linenum") to the + // kind of ssa.Value we expect (represented "Constant", "&Alloc"). + expectations := make(map[string]string) + + // Find all annotations of form x::BinOp, &y::Alloc, etc. + re := regexp.MustCompile(`(\b|&)?(\w*)::(\w*)\b`) + for _, c := range f.Comments { + text := c.Text() + pos := conf.Fset.Position(c.Pos()) + for _, m := range re.FindAllStringSubmatch(text, -1) { + key := fmt.Sprintf("%s:%d", m[2], pos.Line) + value := m[1] + m[3] + expectations[key] = value + } + } + + iprog, err := conf.Load() + if err != nil { + t.Error(err) + return + } + + prog := ssautil.CreateProgram(iprog, 0 /*|ssa.PrintFunctions*/) + mainInfo := iprog.Created[0] + mainPkg := prog.Package(mainInfo.Pkg) + mainPkg.SetDebugMode(true) + mainPkg.Build() + + var varIds []*ast.Ident + var varObjs []*types.Var + for id, obj := range mainInfo.Defs { + // Check invariants for func and const objects. + switch obj := obj.(type) { + case *types.Func: + checkFuncValue(t, prog, obj) + + case *types.Const: + checkConstValue(t, prog, obj) + + case *types.Var: + if id.Name == "_" { + continue + } + varIds = append(varIds, id) + varObjs = append(varObjs, obj) + } + } + for id, obj := range mainInfo.Uses { + if obj, ok := obj.(*types.Var); ok { + varIds = append(varIds, id) + varObjs = append(varObjs, obj) + } + } + + // Check invariants for var objects. + // The result varies based on the specific Ident. + for i, id := range varIds { + obj := varObjs[i] + ref, _ := astutil.PathEnclosingInterval(f, id.Pos(), id.Pos()) + pos := prog.Fset.Position(id.Pos()) + exp := expectations[fmt.Sprintf("%s:%d", id.Name, pos.Line)] + if exp == "" { + t.Errorf("%s: no expectation for var ident %s ", pos, id.Name) + continue + } + wantAddr := false + if exp[0] == '&' { + wantAddr = true + exp = exp[1:] + } + checkVarValue(t, prog, mainPkg, ref, obj, exp, wantAddr) + } +} + +func checkFuncValue(t *testing.T, prog *ssa.Program, obj *types.Func) { + fn := prog.FuncValue(obj) + // fmt.Printf("FuncValue(%s) = %s\n", obj, fn) // debugging + if fn == nil { + if obj.Name() != "interfaceMethod" { + t.Errorf("FuncValue(%s) == nil", obj) + } + return + } + if fnobj := fn.Object(); fnobj != obj { + t.Errorf("FuncValue(%s).Object() == %s; value was %s", + obj, fnobj, fn.Name()) + return + } + if !types.Identical(fn.Type(), obj.Type()) { + t.Errorf("FuncValue(%s).Type() == %s", obj, fn.Type()) + return + } +} + +func checkConstValue(t *testing.T, prog *ssa.Program, obj *types.Const) { + c := prog.ConstValue(obj) + // fmt.Printf("ConstValue(%s) = %s\n", obj, c) // debugging + if c == nil { + t.Errorf("ConstValue(%s) == nil", obj) + return + } + if !types.Identical(c.Type(), obj.Type()) { + t.Errorf("ConstValue(%s).Type() == %s", obj, c.Type()) + return + } + if obj.Name() != "nil" { + if !exact.Compare(c.Value, token.EQL, obj.Val()) { + t.Errorf("ConstValue(%s).Value (%s) != %s", + obj, c.Value, obj.Val()) + return + } + } +} + +func checkVarValue(t *testing.T, prog *ssa.Program, pkg *ssa.Package, ref []ast.Node, obj *types.Var, expKind string, wantAddr bool) { + // The prefix of all assertions messages. + prefix := fmt.Sprintf("VarValue(%s @ L%d)", + obj, prog.Fset.Position(ref[0].Pos()).Line) + + v, gotAddr := prog.VarValue(obj, pkg, ref) + + // Kind is the concrete type of the ssa Value. + gotKind := "nil" + if v != nil { + gotKind = fmt.Sprintf("%T", v)[len("*ssa."):] + } + + // fmt.Printf("%s = %v (kind %q; expect %q) wantAddr=%t gotAddr=%t\n", prefix, v, gotKind, expKind, wantAddr, gotAddr) // debugging + + // Check the kinds match. + // "nil" indicates expected failure (e.g. optimized away). + if expKind != gotKind { + t.Errorf("%s concrete type == %s, want %s", prefix, gotKind, expKind) + } + + // Check the types match. + // If wantAddr, the expected type is the object's address. + if v != nil { + expType := obj.Type() + if wantAddr { + expType = types.NewPointer(expType) + if !gotAddr { + t.Errorf("%s: got value, want address", prefix) + } + } else if gotAddr { + t.Errorf("%s: got address, want value", prefix) + } + if !types.Identical(v.Type(), expType) { + t.Errorf("%s.Type() == %s, want %s", prefix, v.Type(), expType) + } + } +} + +// Ensure that, in debug mode, we can determine the ssa.Value +// corresponding to every ast.Expr. +func TestValueForExpr(t *testing.T) { + if runtime.GOOS == "android" { + t.Skipf("no testdata dir on %s", runtime.GOOS) + } + + conf := loader.Config{ParserMode: parser.ParseComments} + f, err := conf.ParseFile("testdata/valueforexpr.go", nil) + if err != nil { + t.Error(err) + return + } + conf.CreateFromFiles("main", f) + + iprog, err := conf.Load() + if err != nil { + t.Error(err) + return + } + + mainInfo := iprog.Created[0] + + prog := ssautil.CreateProgram(iprog, 0) + mainPkg := prog.Package(mainInfo.Pkg) + mainPkg.SetDebugMode(true) + mainPkg.Build() + + if false { + // debugging + for _, mem := range mainPkg.Members { + if fn, ok := mem.(*ssa.Function); ok { + fn.WriteTo(os.Stderr) + } + } + } + + // Find the actual AST node for each canonical position. + parenExprByPos := make(map[token.Pos]*ast.ParenExpr) + ast.Inspect(f, func(n ast.Node) bool { + if n != nil { + if e, ok := n.(*ast.ParenExpr); ok { + parenExprByPos[e.Pos()] = e + } + } + return true + }) + + // Find all annotations of form /*@kind*/. + for _, c := range f.Comments { + text := strings.TrimSpace(c.Text()) + if text == "" || text[0] != '@' { + continue + } + text = text[1:] + pos := c.End() + 1 + position := prog.Fset.Position(pos) + var e ast.Expr + if target := parenExprByPos[pos]; target == nil { + t.Errorf("%s: annotation doesn't precede ParenExpr: %q", position, text) + continue + } else { + e = target.X + } + + path, _ := astutil.PathEnclosingInterval(f, pos, pos) + if path == nil { + t.Errorf("%s: can't find AST path from root to comment: %s", position, text) + continue + } + + fn := ssa.EnclosingFunction(mainPkg, path) + if fn == nil { + t.Errorf("%s: can't find enclosing function", position) + continue + } + + v, gotAddr := fn.ValueForExpr(e) // (may be nil) + got := strings.TrimPrefix(fmt.Sprintf("%T", v), "*ssa.") + if want := text; got != want { + t.Errorf("%s: got value %q, want %q", position, got, want) + } + if v != nil { + T := v.Type() + if gotAddr { + T = T.Underlying().(*types.Pointer).Elem() // deref + } + if !types.Identical(T, mainInfo.TypeOf(e)) { + t.Errorf("%s: got type %s, want %s", position, mainInfo.TypeOf(e), T) + } + } + } +} + +// findInterval parses input and returns the [start, end) positions of +// the first occurrence of substr in input. f==nil indicates failure; +// an error has already been reported in that case. +// +func findInterval(t *testing.T, fset *token.FileSet, input, substr string) (f *ast.File, start, end token.Pos) { + f, err := parser.ParseFile(fset, "", input, 0) + if err != nil { + t.Errorf("parse error: %s", err) + return + } + + i := strings.Index(input, substr) + if i < 0 { + t.Errorf("%q is not a substring of input", substr) + f = nil + return + } + + filePos := fset.File(f.Package) + return f, filePos.Pos(i), filePos.Pos(i + len(substr)) +} + +func TestEnclosingFunction(t *testing.T) { + tests := []struct { + input string // the input file + substr string // first occurrence of this string denotes interval + fn string // name of expected containing function + }{ + // We use distinctive numbers as syntactic landmarks. + + // Ordinary function: + {`package main + func f() { println(1003) }`, + "100", "main.f"}, + // Methods: + {`package main + type T int + func (t T) f() { println(200) }`, + "200", "(main.T).f"}, + // Function literal: + {`package main + func f() { println(func() { print(300) }) }`, + "300", "main.f$1"}, + // Doubly nested + {`package main + func f() { println(func() { print(func() { print(350) })})}`, + "350", "main.f$1$1"}, + // Implicit init for package-level var initializer. + {"package main; var a = 400", "400", "main.init"}, + // No code for constants: + {"package main; const a = 500", "500", "(none)"}, + // Explicit init() + {"package main; func init() { println(600) }", "600", "main.init#1"}, + // Multiple explicit init functions: + {`package main + func init() { println("foo") } + func init() { println(800) }`, + "800", "main.init#2"}, + // init() containing FuncLit. + {`package main + func init() { println(func(){print(900)}) }`, + "900", "main.init#1$1"}, + } + for _, test := range tests { + conf := loader.Config{Fset: token.NewFileSet()} + f, start, end := findInterval(t, conf.Fset, test.input, test.substr) + if f == nil { + continue + } + path, exact := astutil.PathEnclosingInterval(f, start, end) + if !exact { + t.Errorf("EnclosingFunction(%q) not exact", test.substr) + continue + } + + conf.CreateFromFiles("main", f) + + iprog, err := conf.Load() + if err != nil { + t.Error(err) + continue + } + prog := ssautil.CreateProgram(iprog, 0) + pkg := prog.Package(iprog.Created[0].Pkg) + pkg.Build() + + name := "(none)" + fn := ssa.EnclosingFunction(pkg, path) + if fn != nil { + name = fn.String() + } + + if name != test.fn { + t.Errorf("EnclosingFunction(%q in %q) got %s, want %s", + test.substr, test.input, name, test.fn) + continue + } + + // While we're here: test HasEnclosingFunction. + if has := ssa.HasEnclosingFunction(pkg, path); has != (fn != nil) { + t.Errorf("HasEnclosingFunction(%q in %q) got %v, want %v", + test.substr, test.input, has, fn != nil) + continue + } + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/source_test.go b/vendor/golang.org/x/tools/go/ssa/source_test.go new file mode 100644 index 0000000000..3fd7ac4a01 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/source_test.go @@ -0,0 +1,395 @@ +// Copyright 2013 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.5 + +package ssa_test + +// This file defines tests of source-level debugging utilities. + +import ( + "fmt" + "go/ast" + exact "go/constant" + "go/parser" + "go/token" + "go/types" + "os" + "regexp" + "runtime" + "strings" + "testing" + + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +func TestObjValueLookup(t *testing.T) { + if runtime.GOOS == "android" { + t.Skipf("no testdata directory on %s", runtime.GOOS) + } + + conf := loader.Config{ParserMode: parser.ParseComments} + f, err := conf.ParseFile("testdata/objlookup.go", nil) + if err != nil { + t.Error(err) + return + } + conf.CreateFromFiles("main", f) + + // Maps each var Ident (represented "name:linenum") to the + // kind of ssa.Value we expect (represented "Constant", "&Alloc"). + expectations := make(map[string]string) + + // Find all annotations of form x::BinOp, &y::Alloc, etc. + re := regexp.MustCompile(`(\b|&)?(\w*)::(\w*)\b`) + for _, c := range f.Comments { + text := c.Text() + pos := conf.Fset.Position(c.Pos()) + for _, m := range re.FindAllStringSubmatch(text, -1) { + key := fmt.Sprintf("%s:%d", m[2], pos.Line) + value := m[1] + m[3] + expectations[key] = value + } + } + + iprog, err := conf.Load() + if err != nil { + t.Error(err) + return + } + + prog := ssautil.CreateProgram(iprog, 0 /*|ssa.PrintFunctions*/) + mainInfo := iprog.Created[0] + mainPkg := prog.Package(mainInfo.Pkg) + mainPkg.SetDebugMode(true) + mainPkg.Build() + + var varIds []*ast.Ident + var varObjs []*types.Var + for id, obj := range mainInfo.Defs { + // Check invariants for func and const objects. + switch obj := obj.(type) { + case *types.Func: + checkFuncValue(t, prog, obj) + + case *types.Const: + checkConstValue(t, prog, obj) + + case *types.Var: + if id.Name == "_" { + continue + } + varIds = append(varIds, id) + varObjs = append(varObjs, obj) + } + } + for id, obj := range mainInfo.Uses { + if obj, ok := obj.(*types.Var); ok { + varIds = append(varIds, id) + varObjs = append(varObjs, obj) + } + } + + // Check invariants for var objects. + // The result varies based on the specific Ident. + for i, id := range varIds { + obj := varObjs[i] + ref, _ := astutil.PathEnclosingInterval(f, id.Pos(), id.Pos()) + pos := prog.Fset.Position(id.Pos()) + exp := expectations[fmt.Sprintf("%s:%d", id.Name, pos.Line)] + if exp == "" { + t.Errorf("%s: no expectation for var ident %s ", pos, id.Name) + continue + } + wantAddr := false + if exp[0] == '&' { + wantAddr = true + exp = exp[1:] + } + checkVarValue(t, prog, mainPkg, ref, obj, exp, wantAddr) + } +} + +func checkFuncValue(t *testing.T, prog *ssa.Program, obj *types.Func) { + fn := prog.FuncValue(obj) + // fmt.Printf("FuncValue(%s) = %s\n", obj, fn) // debugging + if fn == nil { + if obj.Name() != "interfaceMethod" { + t.Errorf("FuncValue(%s) == nil", obj) + } + return + } + if fnobj := fn.Object(); fnobj != obj { + t.Errorf("FuncValue(%s).Object() == %s; value was %s", + obj, fnobj, fn.Name()) + return + } + if !types.Identical(fn.Type(), obj.Type()) { + t.Errorf("FuncValue(%s).Type() == %s", obj, fn.Type()) + return + } +} + +func checkConstValue(t *testing.T, prog *ssa.Program, obj *types.Const) { + c := prog.ConstValue(obj) + // fmt.Printf("ConstValue(%s) = %s\n", obj, c) // debugging + if c == nil { + t.Errorf("ConstValue(%s) == nil", obj) + return + } + if !types.Identical(c.Type(), obj.Type()) { + t.Errorf("ConstValue(%s).Type() == %s", obj, c.Type()) + return + } + if obj.Name() != "nil" { + if !exact.Compare(c.Value, token.EQL, obj.Val()) { + t.Errorf("ConstValue(%s).Value (%s) != %s", + obj, c.Value, obj.Val()) + return + } + } +} + +func checkVarValue(t *testing.T, prog *ssa.Program, pkg *ssa.Package, ref []ast.Node, obj *types.Var, expKind string, wantAddr bool) { + // The prefix of all assertions messages. + prefix := fmt.Sprintf("VarValue(%s @ L%d)", + obj, prog.Fset.Position(ref[0].Pos()).Line) + + v, gotAddr := prog.VarValue(obj, pkg, ref) + + // Kind is the concrete type of the ssa Value. + gotKind := "nil" + if v != nil { + gotKind = fmt.Sprintf("%T", v)[len("*ssa."):] + } + + // fmt.Printf("%s = %v (kind %q; expect %q) wantAddr=%t gotAddr=%t\n", prefix, v, gotKind, expKind, wantAddr, gotAddr) // debugging + + // Check the kinds match. + // "nil" indicates expected failure (e.g. optimized away). + if expKind != gotKind { + t.Errorf("%s concrete type == %s, want %s", prefix, gotKind, expKind) + } + + // Check the types match. + // If wantAddr, the expected type is the object's address. + if v != nil { + expType := obj.Type() + if wantAddr { + expType = types.NewPointer(expType) + if !gotAddr { + t.Errorf("%s: got value, want address", prefix) + } + } else if gotAddr { + t.Errorf("%s: got address, want value", prefix) + } + if !types.Identical(v.Type(), expType) { + t.Errorf("%s.Type() == %s, want %s", prefix, v.Type(), expType) + } + } +} + +// Ensure that, in debug mode, we can determine the ssa.Value +// corresponding to every ast.Expr. +func TestValueForExpr(t *testing.T) { + if runtime.GOOS == "android" { + t.Skipf("no testdata dir on %s", runtime.GOOS) + } + + conf := loader.Config{ParserMode: parser.ParseComments} + f, err := conf.ParseFile("testdata/valueforexpr.go", nil) + if err != nil { + t.Error(err) + return + } + conf.CreateFromFiles("main", f) + + iprog, err := conf.Load() + if err != nil { + t.Error(err) + return + } + + mainInfo := iprog.Created[0] + + prog := ssautil.CreateProgram(iprog, 0) + mainPkg := prog.Package(mainInfo.Pkg) + mainPkg.SetDebugMode(true) + mainPkg.Build() + + if false { + // debugging + for _, mem := range mainPkg.Members { + if fn, ok := mem.(*ssa.Function); ok { + fn.WriteTo(os.Stderr) + } + } + } + + // Find the actual AST node for each canonical position. + parenExprByPos := make(map[token.Pos]*ast.ParenExpr) + ast.Inspect(f, func(n ast.Node) bool { + if n != nil { + if e, ok := n.(*ast.ParenExpr); ok { + parenExprByPos[e.Pos()] = e + } + } + return true + }) + + // Find all annotations of form /*@kind*/. + for _, c := range f.Comments { + text := strings.TrimSpace(c.Text()) + if text == "" || text[0] != '@' { + continue + } + text = text[1:] + pos := c.End() + 1 + position := prog.Fset.Position(pos) + var e ast.Expr + if target := parenExprByPos[pos]; target == nil { + t.Errorf("%s: annotation doesn't precede ParenExpr: %q", position, text) + continue + } else { + e = target.X + } + + path, _ := astutil.PathEnclosingInterval(f, pos, pos) + if path == nil { + t.Errorf("%s: can't find AST path from root to comment: %s", position, text) + continue + } + + fn := ssa.EnclosingFunction(mainPkg, path) + if fn == nil { + t.Errorf("%s: can't find enclosing function", position) + continue + } + + v, gotAddr := fn.ValueForExpr(e) // (may be nil) + got := strings.TrimPrefix(fmt.Sprintf("%T", v), "*ssa.") + if want := text; got != want { + t.Errorf("%s: got value %q, want %q", position, got, want) + } + if v != nil { + T := v.Type() + if gotAddr { + T = T.Underlying().(*types.Pointer).Elem() // deref + } + if !types.Identical(T, mainInfo.TypeOf(e)) { + t.Errorf("%s: got type %s, want %s", position, mainInfo.TypeOf(e), T) + } + } + } +} + +// findInterval parses input and returns the [start, end) positions of +// the first occurrence of substr in input. f==nil indicates failure; +// an error has already been reported in that case. +// +func findInterval(t *testing.T, fset *token.FileSet, input, substr string) (f *ast.File, start, end token.Pos) { + f, err := parser.ParseFile(fset, "", input, 0) + if err != nil { + t.Errorf("parse error: %s", err) + return + } + + i := strings.Index(input, substr) + if i < 0 { + t.Errorf("%q is not a substring of input", substr) + f = nil + return + } + + filePos := fset.File(f.Package) + return f, filePos.Pos(i), filePos.Pos(i + len(substr)) +} + +func TestEnclosingFunction(t *testing.T) { + tests := []struct { + input string // the input file + substr string // first occurrence of this string denotes interval + fn string // name of expected containing function + }{ + // We use distinctive numbers as syntactic landmarks. + + // Ordinary function: + {`package main + func f() { println(1003) }`, + "100", "main.f"}, + // Methods: + {`package main + type T int + func (t T) f() { println(200) }`, + "200", "(main.T).f"}, + // Function literal: + {`package main + func f() { println(func() { print(300) }) }`, + "300", "main.f$1"}, + // Doubly nested + {`package main + func f() { println(func() { print(func() { print(350) })})}`, + "350", "main.f$1$1"}, + // Implicit init for package-level var initializer. + {"package main; var a = 400", "400", "main.init"}, + // No code for constants: + {"package main; const a = 500", "500", "(none)"}, + // Explicit init() + {"package main; func init() { println(600) }", "600", "main.init#1"}, + // Multiple explicit init functions: + {`package main + func init() { println("foo") } + func init() { println(800) }`, + "800", "main.init#2"}, + // init() containing FuncLit. + {`package main + func init() { println(func(){print(900)}) }`, + "900", "main.init#1$1"}, + } + for _, test := range tests { + conf := loader.Config{Fset: token.NewFileSet()} + f, start, end := findInterval(t, conf.Fset, test.input, test.substr) + if f == nil { + continue + } + path, exact := astutil.PathEnclosingInterval(f, start, end) + if !exact { + t.Errorf("EnclosingFunction(%q) not exact", test.substr) + continue + } + + conf.CreateFromFiles("main", f) + + iprog, err := conf.Load() + if err != nil { + t.Error(err) + continue + } + prog := ssautil.CreateProgram(iprog, 0) + pkg := prog.Package(iprog.Created[0].Pkg) + pkg.Build() + + name := "(none)" + fn := ssa.EnclosingFunction(pkg, path) + if fn != nil { + name = fn.String() + } + + if name != test.fn { + t.Errorf("EnclosingFunction(%q in %q) got %s, want %s", + test.substr, test.input, name, test.fn) + continue + } + + // While we're here: test HasEnclosingFunction. + if has := ssa.HasEnclosingFunction(pkg, path); has != (fn != nil) { + t.Errorf("HasEnclosingFunction(%q in %q) got %v, want %v", + test.substr, test.input, has, fn != nil) + continue + } + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/ssa.go b/vendor/golang.org/x/tools/go/ssa/ssa.go new file mode 100644 index 0000000000..c547af8ab1 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/ssa.go @@ -0,0 +1,1702 @@ +// Copyright 2013 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.5 + +package ssa + +// This package defines a high-level intermediate representation for +// Go programs using static single-assignment (SSA) form. + +import ( + "fmt" + "go/ast" + exact "go/constant" + "go/token" + "go/types" + "sync" + + "golang.org/x/tools/go/types/typeutil" +) + +// A Program is a partial or complete Go program converted to SSA form. +type Program struct { + Fset *token.FileSet // position information for the files of this Program + imported map[string]*Package // all importable Packages, keyed by import path + packages map[*types.Package]*Package // all loaded Packages, keyed by object + mode BuilderMode // set of mode bits for SSA construction + MethodSets typeutil.MethodSetCache // cache of type-checker's method-sets + + methodsMu sync.Mutex // guards the following maps: + methodSets typeutil.Map // maps type to its concrete methodSet + runtimeTypes typeutil.Map // types for which rtypes are needed + canon typeutil.Map // type canonicalization map + bounds map[*types.Func]*Function // bounds for curried x.Method closures + thunks map[selectionKey]*Function // thunks for T.Method expressions +} + +// A Package is a single analyzed Go package containing Members for +// all package-level functions, variables, constants and types it +// declares. These may be accessed directly via Members, or via the +// type-specific accessor methods Func, Type, Var and Const. +// +// Members also contains entries for "init" (the synthetic package +// initializer) and "init#%d", the nth declared init function, +// and unspecified other things too. +// +type Package struct { + Prog *Program // the owning program + Pkg *types.Package // the corresponding go/types.Package + Members map[string]Member // all package members keyed by name (incl. init and init#%d) + values map[types.Object]Value // package members (incl. types and methods), keyed by object + init *Function // Func("init"); the package's init function + debug bool // include full debug info in this package + + // The following fields are set transiently, then cleared + // after building. + buildOnce sync.Once // ensures package building occurs once + ninit int32 // number of init functions + info *types.Info // package type information + files []*ast.File // package ASTs +} + +// A Member is a member of a Go package, implemented by *NamedConst, +// *Global, *Function, or *Type; they are created by package-level +// const, var, func and type declarations respectively. +// +type Member interface { + Name() string // declared name of the package member + String() string // package-qualified name of the package member + RelString(*types.Package) string // like String, but relative refs are unqualified + Object() types.Object // typechecker's object for this member, if any + Pos() token.Pos // position of member's declaration, if known + Type() types.Type // type of the package member + Token() token.Token // token.{VAR,FUNC,CONST,TYPE} + Package() *Package // the containing package +} + +// A Type is a Member of a Package representing a package-level named type. +// +// Type() returns a *types.Named. +// +type Type struct { + object *types.TypeName + pkg *Package +} + +// A NamedConst is a Member of a Package representing a package-level +// named constant. +// +// Pos() returns the position of the declaring ast.ValueSpec.Names[*] +// identifier. +// +// NB: a NamedConst is not a Value; it contains a constant Value, which +// it augments with the name and position of its 'const' declaration. +// +type NamedConst struct { + object *types.Const + Value *Const + pos token.Pos + pkg *Package +} + +// A Value is an SSA value that can be referenced by an instruction. +type Value interface { + // Name returns the name of this value, and determines how + // this Value appears when used as an operand of an + // Instruction. + // + // This is the same as the source name for Parameters, + // Builtins, Functions, FreeVars, Globals. + // For constants, it is a representation of the constant's value + // and type. For all other Values this is the name of the + // virtual register defined by the instruction. + // + // The name of an SSA Value is not semantically significant, + // and may not even be unique within a function. + Name() string + + // If this value is an Instruction, String returns its + // disassembled form; otherwise it returns unspecified + // human-readable information about the Value, such as its + // kind, name and type. + String() string + + // Type returns the type of this value. Many instructions + // (e.g. IndexAddr) change their behaviour depending on the + // types of their operands. + Type() types.Type + + // Parent returns the function to which this Value belongs. + // It returns nil for named Functions, Builtin, Const and Global. + Parent() *Function + + // Referrers returns the list of instructions that have this + // value as one of their operands; it may contain duplicates + // if an instruction has a repeated operand. + // + // Referrers actually returns a pointer through which the + // caller may perform mutations to the object's state. + // + // Referrers is currently only defined if Parent()!=nil, + // i.e. for the function-local values FreeVar, Parameter, + // Functions (iff anonymous) and all value-defining instructions. + // It returns nil for named Functions, Builtin, Const and Global. + // + // Instruction.Operands contains the inverse of this relation. + Referrers() *[]Instruction + + // Pos returns the location of the AST token most closely + // associated with the operation that gave rise to this value, + // or token.NoPos if it was not explicit in the source. + // + // For each ast.Node type, a particular token is designated as + // the closest location for the expression, e.g. the Lparen + // for an *ast.CallExpr. This permits a compact but + // approximate mapping from Values to source positions for use + // in diagnostic messages, for example. + // + // (Do not use this position to determine which Value + // corresponds to an ast.Expr; use Function.ValueForExpr + // instead. NB: it requires that the function was built with + // debug information.) + Pos() token.Pos +} + +// An Instruction is an SSA instruction that computes a new Value or +// has some effect. +// +// An Instruction that defines a value (e.g. BinOp) also implements +// the Value interface; an Instruction that only has an effect (e.g. Store) +// does not. +// +type Instruction interface { + // String returns the disassembled form of this value. + // + // Examples of Instructions that are Values: + // "x + y" (BinOp) + // "len([])" (Call) + // Note that the name of the Value is not printed. + // + // Examples of Instructions that are not Values: + // "return x" (Return) + // "*y = x" (Store) + // + // (The separation Value.Name() from Value.String() is useful + // for some analyses which distinguish the operation from the + // value it defines, e.g., 'y = local int' is both an allocation + // of memory 'local int' and a definition of a pointer y.) + String() string + + // Parent returns the function to which this instruction + // belongs. + Parent() *Function + + // Block returns the basic block to which this instruction + // belongs. + Block() *BasicBlock + + // setBlock sets the basic block to which this instruction belongs. + setBlock(*BasicBlock) + + // Operands returns the operands of this instruction: the + // set of Values it references. + // + // Specifically, it appends their addresses to rands, a + // user-provided slice, and returns the resulting slice, + // permitting avoidance of memory allocation. + // + // The operands are appended in undefined order, but the order + // is consistent for a given Instruction; the addresses are + // always non-nil but may point to a nil Value. Clients may + // store through the pointers, e.g. to effect a value + // renaming. + // + // Value.Referrers is a subset of the inverse of this + // relation. (Referrers are not tracked for all types of + // Values.) + Operands(rands []*Value) []*Value + + // Pos returns the location of the AST token most closely + // associated with the operation that gave rise to this + // instruction, or token.NoPos if it was not explicit in the + // source. + // + // For each ast.Node type, a particular token is designated as + // the closest location for the expression, e.g. the Go token + // for an *ast.GoStmt. This permits a compact but approximate + // mapping from Instructions to source positions for use in + // diagnostic messages, for example. + // + // (Do not use this position to determine which Instruction + // corresponds to an ast.Expr; see the notes for Value.Pos. + // This position may be used to determine which non-Value + // Instruction corresponds to some ast.Stmts, but not all: If + // and Jump instructions have no Pos(), for example.) + Pos() token.Pos +} + +// A Node is a node in the SSA value graph. Every concrete type that +// implements Node is also either a Value, an Instruction, or both. +// +// Node contains the methods common to Value and Instruction, plus the +// Operands and Referrers methods generalized to return nil for +// non-Instructions and non-Values, respectively. +// +// Node is provided to simplify SSA graph algorithms. Clients should +// use the more specific and informative Value or Instruction +// interfaces where appropriate. +// +type Node interface { + // Common methods: + String() string + Pos() token.Pos + Parent() *Function + + // Partial methods: + Operands(rands []*Value) []*Value // nil for non-Instructions + Referrers() *[]Instruction // nil for non-Values +} + +// Function represents the parameters, results, and code of a function +// or method. +// +// If Blocks is nil, this indicates an external function for which no +// Go source code is available. In this case, FreeVars and Locals +// are nil too. Clients performing whole-program analysis must +// handle external functions specially. +// +// Blocks contains the function's control-flow graph (CFG). +// Blocks[0] is the function entry point; block order is not otherwise +// semantically significant, though it may affect the readability of +// the disassembly. +// To iterate over the blocks in dominance order, use DomPreorder(). +// +// Recover is an optional second entry point to which control resumes +// after a recovered panic. The Recover block may contain only a return +// statement, preceded by a load of the function's named return +// parameters, if any. +// +// A nested function (Parent()!=nil) that refers to one or more +// lexically enclosing local variables ("free variables") has FreeVars. +// Such functions cannot be called directly but require a +// value created by MakeClosure which, via its Bindings, supplies +// values for these parameters. +// +// If the function is a method (Signature.Recv() != nil) then the first +// element of Params is the receiver parameter. +// +// A Go package may declare many functions called "init". +// For each one, Object().Name() returns "init" but Name() returns +// "init#1", etc, in declaration order. +// +// Pos() returns the declaring ast.FuncLit.Type.Func or the position +// of the ast.FuncDecl.Name, if the function was explicit in the +// source. Synthetic wrappers, for which Synthetic != "", may share +// the same position as the function they wrap. +// Syntax.Pos() always returns the position of the declaring "func" token. +// +// Type() returns the function's Signature. +// +type Function struct { + name string + object types.Object // a declared *types.Func or one of its wrappers + method *types.Selection // info about provenance of synthetic methods + Signature *types.Signature + pos token.Pos + + Synthetic string // provenance of synthetic function; "" for true source functions + syntax ast.Node // *ast.Func{Decl,Lit}; replaced with simple ast.Node after build, unless debug mode + parent *Function // enclosing function if anon; nil if global + Pkg *Package // enclosing package; nil for shared funcs (wrappers and error.Error) + Prog *Program // enclosing program + Params []*Parameter // function parameters; for methods, includes receiver + FreeVars []*FreeVar // free variables whose values must be supplied by closure + Locals []*Alloc // local variables of this function + Blocks []*BasicBlock // basic blocks of the function; nil => external + Recover *BasicBlock // optional; control transfers here after recovered panic + AnonFuncs []*Function // anonymous functions directly beneath this one + referrers []Instruction // referring instructions (iff Parent() != nil) + + // The following fields are set transiently during building, + // then cleared. + currentBlock *BasicBlock // where to emit code + objects map[types.Object]Value // addresses of local variables + namedResults []*Alloc // tuple of named results + targets *targets // linked stack of branch targets + lblocks map[*ast.Object]*lblock // labelled blocks +} + +// BasicBlock represents an SSA basic block. +// +// The final element of Instrs is always an explicit transfer of +// control (If, Jump, Return, or Panic). +// +// A block may contain no Instructions only if it is unreachable, +// i.e., Preds is nil. Empty blocks are typically pruned. +// +// BasicBlocks and their Preds/Succs relation form a (possibly cyclic) +// graph independent of the SSA Value graph: the control-flow graph or +// CFG. It is illegal for multiple edges to exist between the same +// pair of blocks. +// +// Each BasicBlock is also a node in the dominator tree of the CFG. +// The tree may be navigated using Idom()/Dominees() and queried using +// Dominates(). +// +// The order of Preds and Succs is significant (to Phi and If +// instructions, respectively). +// +type BasicBlock struct { + Index int // index of this block within Parent().Blocks + Comment string // optional label; no semantic significance + parent *Function // parent function + Instrs []Instruction // instructions in order + Preds, Succs []*BasicBlock // predecessors and successors + succs2 [2]*BasicBlock // initial space for Succs + dom domInfo // dominator tree info + gaps int // number of nil Instrs (transient) + rundefers int // number of rundefers (transient) +} + +// Pure values ---------------------------------------- + +// A FreeVar represents a free variable of the function to which it +// belongs. +// +// FreeVars are used to implement anonymous functions, whose free +// variables are lexically captured in a closure formed by +// MakeClosure. The value of such a free var is an Alloc or another +// FreeVar and is considered a potentially escaping heap address, with +// pointer type. +// +// FreeVars are also used to implement bound method closures. Such a +// free var represents the receiver value and may be of any type that +// has concrete methods. +// +// Pos() returns the position of the value that was captured, which +// belongs to an enclosing function. +// +type FreeVar struct { + name string + typ types.Type + pos token.Pos + parent *Function + referrers []Instruction + + // Transiently needed during building. + outer Value // the Value captured from the enclosing context. +} + +// A Parameter represents an input parameter of a function. +// +type Parameter struct { + name string + object types.Object // a *types.Var; nil for non-source locals + typ types.Type + pos token.Pos + parent *Function + referrers []Instruction +} + +// A Const represents the value of a constant expression. +// +// The underlying type of a constant may be any boolean, numeric, or +// string type. In addition, a Const may represent the nil value of +// any reference type---interface, map, channel, pointer, slice, or +// function---but not "untyped nil". +// +// All source-level constant expressions are represented by a Const +// of the same type and value. +// +// Value holds the exact value of the constant, independent of its +// Type(), using the same representation as package go/exact uses for +// constants, or nil for a typed nil value. +// +// Pos() returns token.NoPos. +// +// Example printed form: +// 42:int +// "hello":untyped string +// 3+4i:MyComplex +// +type Const struct { + typ types.Type + Value exact.Value +} + +// A Global is a named Value holding the address of a package-level +// variable. +// +// Pos() returns the position of the ast.ValueSpec.Names[*] +// identifier. +// +type Global struct { + name string + object types.Object // a *types.Var; may be nil for synthetics e.g. init$guard + typ types.Type + pos token.Pos + + Pkg *Package +} + +// A Builtin represents a specific use of a built-in function, e.g. len. +// +// Builtins are immutable values. Builtins do not have addresses. +// Builtins can only appear in CallCommon.Func. +// +// Name() indicates the function: one of the built-in functions from the +// Go spec (excluding "make" and "new") or one of these ssa-defined +// intrinsics: +// +// // wrapnilchk returns ptr if non-nil, panics otherwise. +// // (For use in indirection wrappers.) +// func ssa:wrapnilchk(ptr *T, recvType, methodName string) *T +// +// Object() returns a *types.Builtin for built-ins defined by the spec, +// nil for others. +// +// Type() returns a *types.Signature representing the effective +// signature of the built-in for this call. +// +type Builtin struct { + name string + sig *types.Signature +} + +// Value-defining instructions ---------------------------------------- + +// The Alloc instruction reserves space for a variable of the given type, +// zero-initializes it, and yields its address. +// +// Alloc values are always addresses, and have pointer types, so the +// type of the allocated variable is actually +// Type().Underlying().(*types.Pointer).Elem(). +// +// If Heap is false, Alloc allocates space in the function's +// activation record (frame); we refer to an Alloc(Heap=false) as a +// "local" alloc. Each local Alloc returns the same address each time +// it is executed within the same activation; the space is +// re-initialized to zero. +// +// If Heap is true, Alloc allocates space in the heap; we +// refer to an Alloc(Heap=true) as a "new" alloc. Each new Alloc +// returns a different address each time it is executed. +// +// When Alloc is applied to a channel, map or slice type, it returns +// the address of an uninitialized (nil) reference of that kind; store +// the result of MakeSlice, MakeMap or MakeChan in that location to +// instantiate these types. +// +// Pos() returns the ast.CompositeLit.Lbrace for a composite literal, +// or the ast.CallExpr.Rparen for a call to new() or for a call that +// allocates a varargs slice. +// +// Example printed form: +// t0 = local int +// t1 = new int +// +type Alloc struct { + register + Comment string + Heap bool + index int // dense numbering; for lifting +} + +// The Phi instruction represents an SSA φ-node, which combines values +// that differ across incoming control-flow edges and yields a new +// value. Within a block, all φ-nodes must appear before all non-φ +// nodes. +// +// Pos() returns the position of the && or || for short-circuit +// control-flow joins, or that of the *Alloc for φ-nodes inserted +// during SSA renaming. +// +// Example printed form: +// t2 = phi [0: t0, 1: t1] +// +type Phi struct { + register + Comment string // a hint as to its purpose + Edges []Value // Edges[i] is value for Block().Preds[i] +} + +// The Call instruction represents a function or method call. +// +// The Call instruction yields the function result if there is exactly +// one. Otherwise it returns a tuple, the components of which are +// accessed via Extract. +// +// See CallCommon for generic function call documentation. +// +// Pos() returns the ast.CallExpr.Lparen, if explicit in the source. +// +// Example printed form: +// t2 = println(t0, t1) +// t4 = t3() +// t7 = invoke t5.Println(...t6) +// +type Call struct { + register + Call CallCommon +} + +// The BinOp instruction yields the result of binary operation X Op Y. +// +// Pos() returns the ast.BinaryExpr.OpPos, if explicit in the source. +// +// Example printed form: +// t1 = t0 + 1:int +// +type BinOp struct { + register + // One of: + // ADD SUB MUL QUO REM + - * / % + // AND OR XOR SHL SHR AND_NOT & | ^ << >> &~ + // EQL LSS GTR NEQ LEQ GEQ == != < <= < >= + Op token.Token + X, Y Value +} + +// The UnOp instruction yields the result of Op X. +// ARROW is channel receive. +// MUL is pointer indirection (load). +// XOR is bitwise complement. +// SUB is negation. +// NOT is logical negation. +// +// If CommaOk and Op=ARROW, the result is a 2-tuple of the value above +// and a boolean indicating the success of the receive. The +// components of the tuple are accessed using Extract. +// +// Pos() returns the ast.UnaryExpr.OpPos, if explicit in the source. +// For receive operations (ARROW) implicit in ranging over a channel, +// Pos() returns the ast.RangeStmt.For. +// For implicit memory loads (STAR), Pos() returns the position of the +// most closely associated source-level construct; the details are not +// specified. +// +// Example printed form: +// t0 = *x +// t2 = <-t1,ok +// +type UnOp struct { + register + Op token.Token // One of: NOT SUB ARROW MUL XOR ! - <- * ^ + X Value + CommaOk bool +} + +// The ChangeType instruction applies to X a value-preserving type +// change to Type(). +// +// Type changes are permitted: +// - between a named type and its underlying type. +// - between two named types of the same underlying type. +// - between (possibly named) pointers to identical base types. +// - from a bidirectional channel to a read- or write-channel, +// optionally adding/removing a name. +// +// This operation cannot fail dynamically. +// +// Pos() returns the ast.CallExpr.Lparen, if the instruction arose +// from an explicit conversion in the source. +// +// Example printed form: +// t1 = changetype *int <- IntPtr (t0) +// +type ChangeType struct { + register + X Value +} + +// The Convert instruction yields the conversion of value X to type +// Type(). One or both of those types is basic (but possibly named). +// +// A conversion may change the value and representation of its operand. +// Conversions are permitted: +// - between real numeric types. +// - between complex numeric types. +// - between string and []byte or []rune. +// - between pointers and unsafe.Pointer. +// - between unsafe.Pointer and uintptr. +// - from (Unicode) integer to (UTF-8) string. +// A conversion may imply a type name change also. +// +// This operation cannot fail dynamically. +// +// Conversions of untyped string/number/bool constants to a specific +// representation are eliminated during SSA construction. +// +// Pos() returns the ast.CallExpr.Lparen, if the instruction arose +// from an explicit conversion in the source. +// +// Example printed form: +// t1 = convert []byte <- string (t0) +// +type Convert struct { + register + X Value +} + +// ChangeInterface constructs a value of one interface type from a +// value of another interface type known to be assignable to it. +// This operation cannot fail. +// +// Pos() returns the ast.CallExpr.Lparen if the instruction arose from +// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the +// instruction arose from an explicit e.(T) operation; or token.NoPos +// otherwise. +// +// Example printed form: +// t1 = change interface interface{} <- I (t0) +// +type ChangeInterface struct { + register + X Value +} + +// MakeInterface constructs an instance of an interface type from a +// value of a concrete type. +// +// Use Program.MethodSets.MethodSet(X.Type()) to find the method-set +// of X, and Program.Method(m) to find the implementation of a method. +// +// To construct the zero value of an interface type T, use: +// NewConst(exact.MakeNil(), T, pos) +// +// Pos() returns the ast.CallExpr.Lparen, if the instruction arose +// from an explicit conversion in the source. +// +// Example printed form: +// t1 = make interface{} <- int (42:int) +// t2 = make Stringer <- t0 +// +type MakeInterface struct { + register + X Value +} + +// The MakeClosure instruction yields a closure value whose code is +// Fn and whose free variables' values are supplied by Bindings. +// +// Type() returns a (possibly named) *types.Signature. +// +// Pos() returns the ast.FuncLit.Type.Func for a function literal +// closure or the ast.SelectorExpr.Sel for a bound method closure. +// +// Example printed form: +// t0 = make closure anon@1.2 [x y z] +// t1 = make closure bound$(main.I).add [i] +// +type MakeClosure struct { + register + Fn Value // always a *Function + Bindings []Value // values for each free variable in Fn.FreeVars +} + +// The MakeMap instruction creates a new hash-table-based map object +// and yields a value of kind map. +// +// Type() returns a (possibly named) *types.Map. +// +// Pos() returns the ast.CallExpr.Lparen, if created by make(map), or +// the ast.CompositeLit.Lbrack if created by a literal. +// +// Example printed form: +// t1 = make map[string]int t0 +// t1 = make StringIntMap t0 +// +type MakeMap struct { + register + Reserve Value // initial space reservation; nil => default +} + +// The MakeChan instruction creates a new channel object and yields a +// value of kind chan. +// +// Type() returns a (possibly named) *types.Chan. +// +// Pos() returns the ast.CallExpr.Lparen for the make(chan) that +// created it. +// +// Example printed form: +// t0 = make chan int 0 +// t0 = make IntChan 0 +// +type MakeChan struct { + register + Size Value // int; size of buffer; zero => synchronous. +} + +// The MakeSlice instruction yields a slice of length Len backed by a +// newly allocated array of length Cap. +// +// Both Len and Cap must be non-nil Values of integer type. +// +// (Alloc(types.Array) followed by Slice will not suffice because +// Alloc can only create arrays of constant length.) +// +// Type() returns a (possibly named) *types.Slice. +// +// Pos() returns the ast.CallExpr.Lparen for the make([]T) that +// created it. +// +// Example printed form: +// t1 = make []string 1:int t0 +// t1 = make StringSlice 1:int t0 +// +type MakeSlice struct { + register + Len Value + Cap Value +} + +// The Slice instruction yields a slice of an existing string, slice +// or *array X between optional integer bounds Low and High. +// +// Dynamically, this instruction panics if X evaluates to a nil *array +// pointer. +// +// Type() returns string if the type of X was string, otherwise a +// *types.Slice with the same element type as X. +// +// Pos() returns the ast.SliceExpr.Lbrack if created by a x[:] slice +// operation, the ast.CompositeLit.Lbrace if created by a literal, or +// NoPos if not explicit in the source (e.g. a variadic argument slice). +// +// Example printed form: +// t1 = slice t0[1:] +// +type Slice struct { + register + X Value // slice, string, or *array + Low, High, Max Value // each may be nil +} + +// The FieldAddr instruction yields the address of Field of *struct X. +// +// The field is identified by its index within the field list of the +// struct type of X. +// +// Dynamically, this instruction panics if X evaluates to a nil +// pointer. +// +// Type() returns a (possibly named) *types.Pointer. +// +// Pos() returns the position of the ast.SelectorExpr.Sel for the +// field, if explicit in the source. +// +// Example printed form: +// t1 = &t0.name [#1] +// +type FieldAddr struct { + register + X Value // *struct + Field int // index into X.Type().Deref().(*types.Struct).Fields +} + +// The Field instruction yields the Field of struct X. +// +// The field is identified by its index within the field list of the +// struct type of X; by using numeric indices we avoid ambiguity of +// package-local identifiers and permit compact representations. +// +// Pos() returns the position of the ast.SelectorExpr.Sel for the +// field, if explicit in the source. +// +// Example printed form: +// t1 = t0.name [#1] +// +type Field struct { + register + X Value // struct + Field int // index into X.Type().(*types.Struct).Fields +} + +// The IndexAddr instruction yields the address of the element at +// index Index of collection X. Index is an integer expression. +// +// The elements of maps and strings are not addressable; use Lookup or +// MapUpdate instead. +// +// Dynamically, this instruction panics if X evaluates to a nil *array +// pointer. +// +// Type() returns a (possibly named) *types.Pointer. +// +// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if +// explicit in the source. +// +// Example printed form: +// t2 = &t0[t1] +// +type IndexAddr struct { + register + X Value // slice or *array, + Index Value // numeric index +} + +// The Index instruction yields element Index of array X. +// +// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if +// explicit in the source. +// +// Example printed form: +// t2 = t0[t1] +// +type Index struct { + register + X Value // array + Index Value // integer index +} + +// The Lookup instruction yields element Index of collection X, a map +// or string. Index is an integer expression if X is a string or the +// appropriate key type if X is a map. +// +// If CommaOk, the result is a 2-tuple of the value above and a +// boolean indicating the result of a map membership test for the key. +// The components of the tuple are accessed using Extract. +// +// Pos() returns the ast.IndexExpr.Lbrack, if explicit in the source. +// +// Example printed form: +// t2 = t0[t1] +// t5 = t3[t4],ok +// +type Lookup struct { + register + X Value // string or map + Index Value // numeric or key-typed index + CommaOk bool // return a value,ok pair +} + +// SelectState is a helper for Select. +// It represents one goal state and its corresponding communication. +// +type SelectState struct { + Dir types.ChanDir // direction of case (SendOnly or RecvOnly) + Chan Value // channel to use (for send or receive) + Send Value // value to send (for send) + Pos token.Pos // position of token.ARROW + DebugNode ast.Node // ast.SendStmt or ast.UnaryExpr(<-) [debug mode] +} + +// The Select instruction tests whether (or blocks until) one +// of the specified sent or received states is entered. +// +// Let n be the number of States for which Dir==RECV and T_i (0<=i string iterator; false => map iterator. +} + +// The TypeAssert instruction tests whether interface value X has type +// AssertedType. +// +// If !CommaOk, on success it returns v, the result of the conversion +// (defined below); on failure it panics. +// +// If CommaOk: on success it returns a pair (v, true) where v is the +// result of the conversion; on failure it returns (z, false) where z +// is AssertedType's zero value. The components of the pair must be +// accessed using the Extract instruction. +// +// If AssertedType is a concrete type, TypeAssert checks whether the +// dynamic type in interface X is equal to it, and if so, the result +// of the conversion is a copy of the value in the interface. +// +// If AssertedType is an interface, TypeAssert checks whether the +// dynamic type of the interface is assignable to it, and if so, the +// result of the conversion is a copy of the interface value X. +// If AssertedType is a superinterface of X.Type(), the operation will +// fail iff the operand is nil. (Contrast with ChangeInterface, which +// performs no nil-check.) +// +// Type() reflects the actual type of the result, possibly a +// 2-types.Tuple; AssertedType is the asserted type. +// +// Pos() returns the ast.CallExpr.Lparen if the instruction arose from +// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the +// instruction arose from an explicit e.(T) operation; or the +// ast.CaseClause.Case if the instruction arose from a case of a +// type-switch statement. +// +// Example printed form: +// t1 = typeassert t0.(int) +// t3 = typeassert,ok t2.(T) +// +type TypeAssert struct { + register + X Value + AssertedType types.Type + CommaOk bool +} + +// The Extract instruction yields component Index of Tuple. +// +// This is used to access the results of instructions with multiple +// return values, such as Call, TypeAssert, Next, UnOp(ARROW) and +// IndexExpr(Map). +// +// Example printed form: +// t1 = extract t0 #1 +// +type Extract struct { + register + Tuple Value + Index int +} + +// Instructions executed for effect. They do not yield a value. -------------------- + +// The Jump instruction transfers control to the sole successor of its +// owning block. +// +// A Jump must be the last instruction of its containing BasicBlock. +// +// Pos() returns NoPos. +// +// Example printed form: +// jump done +// +type Jump struct { + anInstruction +} + +// The If instruction transfers control to one of the two successors +// of its owning block, depending on the boolean Cond: the first if +// true, the second if false. +// +// An If instruction must be the last instruction of its containing +// BasicBlock. +// +// Pos() returns NoPos. +// +// Example printed form: +// if t0 goto done else body +// +type If struct { + anInstruction + Cond Value +} + +// The Return instruction returns values and control back to the calling +// function. +// +// len(Results) is always equal to the number of results in the +// function's signature. +// +// If len(Results) > 1, Return returns a tuple value with the specified +// components which the caller must access using Extract instructions. +// +// There is no instruction to return a ready-made tuple like those +// returned by a "value,ok"-mode TypeAssert, Lookup or UnOp(ARROW) or +// a tail-call to a function with multiple result parameters. +// +// Return must be the last instruction of its containing BasicBlock. +// Such a block has no successors. +// +// Pos() returns the ast.ReturnStmt.Return, if explicit in the source. +// +// Example printed form: +// return +// return nil:I, 2:int +// +type Return struct { + anInstruction + Results []Value + pos token.Pos +} + +// The RunDefers instruction pops and invokes the entire stack of +// procedure calls pushed by Defer instructions in this function. +// +// It is legal to encounter multiple 'rundefers' instructions in a +// single control-flow path through a function; this is useful in +// the combined init() function, for example. +// +// Pos() returns NoPos. +// +// Example printed form: +// rundefers +// +type RunDefers struct { + anInstruction +} + +// The Panic instruction initiates a panic with value X. +// +// A Panic instruction must be the last instruction of its containing +// BasicBlock, which must have no successors. +// +// NB: 'go panic(x)' and 'defer panic(x)' do not use this instruction; +// they are treated as calls to a built-in function. +// +// Pos() returns the ast.CallExpr.Lparen if this panic was explicit +// in the source. +// +// Example printed form: +// panic t0 +// +type Panic struct { + anInstruction + X Value // an interface{} + pos token.Pos +} + +// The Go instruction creates a new goroutine and calls the specified +// function within it. +// +// See CallCommon for generic function call documentation. +// +// Pos() returns the ast.GoStmt.Go. +// +// Example printed form: +// go println(t0, t1) +// go t3() +// go invoke t5.Println(...t6) +// +type Go struct { + anInstruction + Call CallCommon + pos token.Pos +} + +// The Defer instruction pushes the specified call onto a stack of +// functions to be called by a RunDefers instruction or by a panic. +// +// See CallCommon for generic function call documentation. +// +// Pos() returns the ast.DeferStmt.Defer. +// +// Example printed form: +// defer println(t0, t1) +// defer t3() +// defer invoke t5.Println(...t6) +// +type Defer struct { + anInstruction + Call CallCommon + pos token.Pos +} + +// The Send instruction sends X on channel Chan. +// +// Pos() returns the ast.SendStmt.Arrow, if explicit in the source. +// +// Example printed form: +// send t0 <- t1 +// +type Send struct { + anInstruction + Chan, X Value + pos token.Pos +} + +// The Store instruction stores Val at address Addr. +// Stores can be of arbitrary types. +// +// Pos() returns the position of the source-level construct most closely +// associated with the memory store operation. +// Since implicit memory stores are numerous and varied and depend upon +// implementation choices, the details are not specified. +// +// Example printed form: +// *x = y +// +type Store struct { + anInstruction + Addr Value + Val Value + pos token.Pos +} + +// The MapUpdate instruction updates the association of Map[Key] to +// Value. +// +// Pos() returns the ast.KeyValueExpr.Colon or ast.IndexExpr.Lbrack, +// if explicit in the source. +// +// Example printed form: +// t0[t1] = t2 +// +type MapUpdate struct { + anInstruction + Map Value + Key Value + Value Value + pos token.Pos +} + +// A DebugRef instruction maps a source-level expression Expr to the +// SSA value X that represents the value (!IsAddr) or address (IsAddr) +// of that expression. +// +// DebugRef is a pseudo-instruction: it has no dynamic effect. +// +// Pos() returns Expr.Pos(), the start position of the source-level +// expression. This is not the same as the "designated" token as +// documented at Value.Pos(). e.g. CallExpr.Pos() does not return the +// position of the ("designated") Lparen token. +// +// If Expr is an *ast.Ident denoting a var or func, Object() returns +// the object; though this information can be obtained from the type +// checker, including it here greatly facilitates debugging. +// For non-Ident expressions, Object() returns nil. +// +// DebugRefs are generated only for functions built with debugging +// enabled; see Package.SetDebugMode() and the GlobalDebug builder +// mode flag. +// +// DebugRefs are not emitted for ast.Idents referring to constants or +// predeclared identifiers, since they are trivial and numerous. +// Nor are they emitted for ast.ParenExprs. +// +// (By representing these as instructions, rather than out-of-band, +// consistency is maintained during transformation passes by the +// ordinary SSA renaming machinery.) +// +// Example printed form: +// ; *ast.CallExpr @ 102:9 is t5 +// ; var x float64 @ 109:72 is x +// ; address of *ast.CompositeLit @ 216:10 is t0 +// +type DebugRef struct { + anInstruction + Expr ast.Expr // the referring expression (never *ast.ParenExpr) + object types.Object // the identity of the source var/func + IsAddr bool // Expr is addressable and X is the address it denotes + X Value // the value or address of Expr +} + +// Embeddable mix-ins and helpers for common parts of other structs. ----------- + +// register is a mix-in embedded by all SSA values that are also +// instructions, i.e. virtual registers, and provides a uniform +// implementation of most of the Value interface: Value.Name() is a +// numbered register (e.g. "t0"); the other methods are field accessors. +// +// Temporary names are automatically assigned to each register on +// completion of building a function in SSA form. +// +// Clients must not assume that the 'id' value (and the Name() derived +// from it) is unique within a function. As always in this API, +// semantics are determined only by identity; names exist only to +// facilitate debugging. +// +type register struct { + anInstruction + num int // "name" of virtual register, e.g. "t0". Not guaranteed unique. + typ types.Type // type of virtual register + pos token.Pos // position of source expression, or NoPos + referrers []Instruction +} + +// anInstruction is a mix-in embedded by all Instructions. +// It provides the implementations of the Block and setBlock methods. +type anInstruction struct { + block *BasicBlock // the basic block of this instruction +} + +// CallCommon is contained by Go, Defer and Call to hold the +// common parts of a function or method call. +// +// Each CallCommon exists in one of two modes, function call and +// interface method invocation, or "call" and "invoke" for short. +// +// 1. "call" mode: when Method is nil (!IsInvoke), a CallCommon +// represents an ordinary function call of the value in Value, +// which may be a *Builtin, a *Function or any other value of kind +// 'func'. +// +// Value may be one of: +// (a) a *Function, indicating a statically dispatched call +// to a package-level function, an anonymous function, or +// a method of a named type. +// (b) a *MakeClosure, indicating an immediately applied +// function literal with free variables. +// (c) a *Builtin, indicating a statically dispatched call +// to a built-in function. +// (d) any other value, indicating a dynamically dispatched +// function call. +// StaticCallee returns the identity of the callee in cases +// (a) and (b), nil otherwise. +// +// Args contains the arguments to the call. If Value is a method, +// Args[0] contains the receiver parameter. +// +// Example printed form: +// t2 = println(t0, t1) +// go t3() +// defer t5(...t6) +// +// 2. "invoke" mode: when Method is non-nil (IsInvoke), a CallCommon +// represents a dynamically dispatched call to an interface method. +// In this mode, Value is the interface value and Method is the +// interface's abstract method. Note: an abstract method may be +// shared by multiple interfaces due to embedding; Value.Type() +// provides the specific interface used for this call. +// +// Value is implicitly supplied to the concrete method implementation +// as the receiver parameter; in other words, Args[0] holds not the +// receiver but the first true argument. +// +// Example printed form: +// t1 = invoke t0.String() +// go invoke t3.Run(t2) +// defer invoke t4.Handle(...t5) +// +// For all calls to variadic functions (Signature().Variadic()), +// the last element of Args is a slice. +// +type CallCommon struct { + Value Value // receiver (invoke mode) or func value (call mode) + Method *types.Func // abstract method (invoke mode) + Args []Value // actual parameters (in static method call, includes receiver) + pos token.Pos // position of CallExpr.Lparen, iff explicit in source +} + +// IsInvoke returns true if this call has "invoke" (not "call") mode. +func (c *CallCommon) IsInvoke() bool { + return c.Method != nil +} + +func (c *CallCommon) Pos() token.Pos { return c.pos } + +// Signature returns the signature of the called function. +// +// For an "invoke"-mode call, the signature of the interface method is +// returned. +// +// In either "call" or "invoke" mode, if the callee is a method, its +// receiver is represented by sig.Recv, not sig.Params().At(0). +// +func (c *CallCommon) Signature() *types.Signature { + if c.Method != nil { + return c.Method.Type().(*types.Signature) + } + return c.Value.Type().Underlying().(*types.Signature) +} + +// StaticCallee returns the callee if this is a trivially static +// "call"-mode call to a function. +func (c *CallCommon) StaticCallee() *Function { + switch fn := c.Value.(type) { + case *Function: + return fn + case *MakeClosure: + return fn.Fn.(*Function) + } + return nil +} + +// Description returns a description of the mode of this call suitable +// for a user interface, e.g., "static method call". +func (c *CallCommon) Description() string { + switch fn := c.Value.(type) { + case *Builtin: + return "built-in function call" + case *MakeClosure: + return "static function closure call" + case *Function: + if fn.Signature.Recv() != nil { + return "static method call" + } + return "static function call" + } + if c.IsInvoke() { + return "dynamic method call" // ("invoke" mode) + } + return "dynamic function call" +} + +// The CallInstruction interface, implemented by *Go, *Defer and *Call, +// exposes the common parts of function-calling instructions, +// yet provides a way back to the Value defined by *Call alone. +// +type CallInstruction interface { + Instruction + Common() *CallCommon // returns the common parts of the call + Value() *Call // returns the result value of the call (*Call) or nil (*Go, *Defer) +} + +func (s *Call) Common() *CallCommon { return &s.Call } +func (s *Defer) Common() *CallCommon { return &s.Call } +func (s *Go) Common() *CallCommon { return &s.Call } + +func (s *Call) Value() *Call { return s } +func (s *Defer) Value() *Call { return nil } +func (s *Go) Value() *Call { return nil } + +func (v *Builtin) Type() types.Type { return v.sig } +func (v *Builtin) Name() string { return v.name } +func (*Builtin) Referrers() *[]Instruction { return nil } +func (v *Builtin) Pos() token.Pos { return token.NoPos } +func (v *Builtin) Object() types.Object { return types.Universe.Lookup(v.name) } +func (v *Builtin) Parent() *Function { return nil } + +func (v *FreeVar) Type() types.Type { return v.typ } +func (v *FreeVar) Name() string { return v.name } +func (v *FreeVar) Referrers() *[]Instruction { return &v.referrers } +func (v *FreeVar) Pos() token.Pos { return v.pos } +func (v *FreeVar) Parent() *Function { return v.parent } + +func (v *Global) Type() types.Type { return v.typ } +func (v *Global) Name() string { return v.name } +func (v *Global) Parent() *Function { return nil } +func (v *Global) Pos() token.Pos { return v.pos } +func (v *Global) Referrers() *[]Instruction { return nil } +func (v *Global) Token() token.Token { return token.VAR } +func (v *Global) Object() types.Object { return v.object } +func (v *Global) String() string { return v.RelString(nil) } +func (v *Global) Package() *Package { return v.Pkg } +func (v *Global) RelString(from *types.Package) string { return relString(v, from) } + +func (v *Function) Name() string { return v.name } +func (v *Function) Type() types.Type { return v.Signature } +func (v *Function) Pos() token.Pos { return v.pos } +func (v *Function) Token() token.Token { return token.FUNC } +func (v *Function) Object() types.Object { return v.object } +func (v *Function) String() string { return v.RelString(nil) } +func (v *Function) Package() *Package { return v.Pkg } +func (v *Function) Parent() *Function { return v.parent } +func (v *Function) Referrers() *[]Instruction { + if v.parent != nil { + return &v.referrers + } + return nil +} + +func (v *Parameter) Type() types.Type { return v.typ } +func (v *Parameter) Name() string { return v.name } +func (v *Parameter) Object() types.Object { return v.object } +func (v *Parameter) Referrers() *[]Instruction { return &v.referrers } +func (v *Parameter) Pos() token.Pos { return v.pos } +func (v *Parameter) Parent() *Function { return v.parent } + +func (v *Alloc) Type() types.Type { return v.typ } +func (v *Alloc) Referrers() *[]Instruction { return &v.referrers } +func (v *Alloc) Pos() token.Pos { return v.pos } + +func (v *register) Type() types.Type { return v.typ } +func (v *register) setType(typ types.Type) { v.typ = typ } +func (v *register) Name() string { return fmt.Sprintf("t%d", v.num) } +func (v *register) setNum(num int) { v.num = num } +func (v *register) Referrers() *[]Instruction { return &v.referrers } +func (v *register) Pos() token.Pos { return v.pos } +func (v *register) setPos(pos token.Pos) { v.pos = pos } + +func (v *anInstruction) Parent() *Function { return v.block.parent } +func (v *anInstruction) Block() *BasicBlock { return v.block } +func (v *anInstruction) setBlock(block *BasicBlock) { v.block = block } +func (v *anInstruction) Referrers() *[]Instruction { return nil } + +func (t *Type) Name() string { return t.object.Name() } +func (t *Type) Pos() token.Pos { return t.object.Pos() } +func (t *Type) Type() types.Type { return t.object.Type() } +func (t *Type) Token() token.Token { return token.TYPE } +func (t *Type) Object() types.Object { return t.object } +func (t *Type) String() string { return t.RelString(nil) } +func (t *Type) Package() *Package { return t.pkg } +func (t *Type) RelString(from *types.Package) string { return relString(t, from) } + +func (c *NamedConst) Name() string { return c.object.Name() } +func (c *NamedConst) Pos() token.Pos { return c.object.Pos() } +func (c *NamedConst) String() string { return c.RelString(nil) } +func (c *NamedConst) Type() types.Type { return c.object.Type() } +func (c *NamedConst) Token() token.Token { return token.CONST } +func (c *NamedConst) Object() types.Object { return c.object } +func (c *NamedConst) Package() *Package { return c.pkg } +func (c *NamedConst) RelString(from *types.Package) string { return relString(c, from) } + +// Func returns the package-level function of the specified name, +// or nil if not found. +// +func (p *Package) Func(name string) (f *Function) { + f, _ = p.Members[name].(*Function) + return +} + +// Var returns the package-level variable of the specified name, +// or nil if not found. +// +func (p *Package) Var(name string) (g *Global) { + g, _ = p.Members[name].(*Global) + return +} + +// Const returns the package-level constant of the specified name, +// or nil if not found. +// +func (p *Package) Const(name string) (c *NamedConst) { + c, _ = p.Members[name].(*NamedConst) + return +} + +// Type returns the package-level type of the specified name, +// or nil if not found. +// +func (p *Package) Type(name string) (t *Type) { + t, _ = p.Members[name].(*Type) + return +} + +func (v *Call) Pos() token.Pos { return v.Call.pos } +func (s *Defer) Pos() token.Pos { return s.pos } +func (s *Go) Pos() token.Pos { return s.pos } +func (s *MapUpdate) Pos() token.Pos { return s.pos } +func (s *Panic) Pos() token.Pos { return s.pos } +func (s *Return) Pos() token.Pos { return s.pos } +func (s *Send) Pos() token.Pos { return s.pos } +func (s *Store) Pos() token.Pos { return s.pos } +func (s *If) Pos() token.Pos { return token.NoPos } +func (s *Jump) Pos() token.Pos { return token.NoPos } +func (s *RunDefers) Pos() token.Pos { return token.NoPos } +func (s *DebugRef) Pos() token.Pos { return s.Expr.Pos() } + +// Operands. + +func (v *Alloc) Operands(rands []*Value) []*Value { + return rands +} + +func (v *BinOp) Operands(rands []*Value) []*Value { + return append(rands, &v.X, &v.Y) +} + +func (c *CallCommon) Operands(rands []*Value) []*Value { + rands = append(rands, &c.Value) + for i := range c.Args { + rands = append(rands, &c.Args[i]) + } + return rands +} + +func (s *Go) Operands(rands []*Value) []*Value { + return s.Call.Operands(rands) +} + +func (s *Call) Operands(rands []*Value) []*Value { + return s.Call.Operands(rands) +} + +func (s *Defer) Operands(rands []*Value) []*Value { + return s.Call.Operands(rands) +} + +func (v *ChangeInterface) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (v *ChangeType) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (v *Convert) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (s *DebugRef) Operands(rands []*Value) []*Value { + return append(rands, &s.X) +} + +func (v *Extract) Operands(rands []*Value) []*Value { + return append(rands, &v.Tuple) +} + +func (v *Field) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (v *FieldAddr) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (s *If) Operands(rands []*Value) []*Value { + return append(rands, &s.Cond) +} + +func (v *Index) Operands(rands []*Value) []*Value { + return append(rands, &v.X, &v.Index) +} + +func (v *IndexAddr) Operands(rands []*Value) []*Value { + return append(rands, &v.X, &v.Index) +} + +func (*Jump) Operands(rands []*Value) []*Value { + return rands +} + +func (v *Lookup) Operands(rands []*Value) []*Value { + return append(rands, &v.X, &v.Index) +} + +func (v *MakeChan) Operands(rands []*Value) []*Value { + return append(rands, &v.Size) +} + +func (v *MakeClosure) Operands(rands []*Value) []*Value { + rands = append(rands, &v.Fn) + for i := range v.Bindings { + rands = append(rands, &v.Bindings[i]) + } + return rands +} + +func (v *MakeInterface) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (v *MakeMap) Operands(rands []*Value) []*Value { + return append(rands, &v.Reserve) +} + +func (v *MakeSlice) Operands(rands []*Value) []*Value { + return append(rands, &v.Len, &v.Cap) +} + +func (v *MapUpdate) Operands(rands []*Value) []*Value { + return append(rands, &v.Map, &v.Key, &v.Value) +} + +func (v *Next) Operands(rands []*Value) []*Value { + return append(rands, &v.Iter) +} + +func (s *Panic) Operands(rands []*Value) []*Value { + return append(rands, &s.X) +} + +func (v *Phi) Operands(rands []*Value) []*Value { + for i := range v.Edges { + rands = append(rands, &v.Edges[i]) + } + return rands +} + +func (v *Range) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (s *Return) Operands(rands []*Value) []*Value { + for i := range s.Results { + rands = append(rands, &s.Results[i]) + } + return rands +} + +func (*RunDefers) Operands(rands []*Value) []*Value { + return rands +} + +func (v *Select) Operands(rands []*Value) []*Value { + for i := range v.States { + rands = append(rands, &v.States[i].Chan, &v.States[i].Send) + } + return rands +} + +func (s *Send) Operands(rands []*Value) []*Value { + return append(rands, &s.Chan, &s.X) +} + +func (v *Slice) Operands(rands []*Value) []*Value { + return append(rands, &v.X, &v.Low, &v.High, &v.Max) +} + +func (s *Store) Operands(rands []*Value) []*Value { + return append(rands, &s.Addr, &s.Val) +} + +func (v *TypeAssert) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (v *UnOp) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +// Non-Instruction Values: +func (v *Builtin) Operands(rands []*Value) []*Value { return rands } +func (v *FreeVar) Operands(rands []*Value) []*Value { return rands } +func (v *Const) Operands(rands []*Value) []*Value { return rands } +func (v *Function) Operands(rands []*Value) []*Value { return rands } +func (v *Global) Operands(rands []*Value) []*Value { return rands } +func (v *Parameter) Operands(rands []*Value) []*Value { return rands } diff --git a/vendor/golang.org/x/tools/go/ssa/ssa14.go b/vendor/golang.org/x/tools/go/ssa/ssa14.go new file mode 100644 index 0000000000..dcc62daabb --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/ssa14.go @@ -0,0 +1,1702 @@ +// Copyright 2013 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.5 + +package ssa + +// This package defines a high-level intermediate representation for +// Go programs using static single-assignment (SSA) form. + +import ( + "fmt" + "go/ast" + "go/token" + "sync" + + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/types" + "golang.org/x/tools/go/types/typeutil" +) + +// A Program is a partial or complete Go program converted to SSA form. +type Program struct { + Fset *token.FileSet // position information for the files of this Program + imported map[string]*Package // all importable Packages, keyed by import path + packages map[*types.Package]*Package // all loaded Packages, keyed by object + mode BuilderMode // set of mode bits for SSA construction + MethodSets typeutil.MethodSetCache // cache of type-checker's method-sets + + methodsMu sync.Mutex // guards the following maps: + methodSets typeutil.Map // maps type to its concrete methodSet + runtimeTypes typeutil.Map // types for which rtypes are needed + canon typeutil.Map // type canonicalization map + bounds map[*types.Func]*Function // bounds for curried x.Method closures + thunks map[selectionKey]*Function // thunks for T.Method expressions +} + +// A Package is a single analyzed Go package containing Members for +// all package-level functions, variables, constants and types it +// declares. These may be accessed directly via Members, or via the +// type-specific accessor methods Func, Type, Var and Const. +// +// Members also contains entries for "init" (the synthetic package +// initializer) and "init#%d", the nth declared init function, +// and unspecified other things too. +// +type Package struct { + Prog *Program // the owning program + Pkg *types.Package // the corresponding go/types.Package + Members map[string]Member // all package members keyed by name (incl. init and init#%d) + values map[types.Object]Value // package members (incl. types and methods), keyed by object + init *Function // Func("init"); the package's init function + debug bool // include full debug info in this package + + // The following fields are set transiently, then cleared + // after building. + buildOnce sync.Once // ensures package building occurs once + ninit int32 // number of init functions + info *types.Info // package type information + files []*ast.File // package ASTs +} + +// A Member is a member of a Go package, implemented by *NamedConst, +// *Global, *Function, or *Type; they are created by package-level +// const, var, func and type declarations respectively. +// +type Member interface { + Name() string // declared name of the package member + String() string // package-qualified name of the package member + RelString(*types.Package) string // like String, but relative refs are unqualified + Object() types.Object // typechecker's object for this member, if any + Pos() token.Pos // position of member's declaration, if known + Type() types.Type // type of the package member + Token() token.Token // token.{VAR,FUNC,CONST,TYPE} + Package() *Package // the containing package +} + +// A Type is a Member of a Package representing a package-level named type. +// +// Type() returns a *types.Named. +// +type Type struct { + object *types.TypeName + pkg *Package +} + +// A NamedConst is a Member of a Package representing a package-level +// named constant. +// +// Pos() returns the position of the declaring ast.ValueSpec.Names[*] +// identifier. +// +// NB: a NamedConst is not a Value; it contains a constant Value, which +// it augments with the name and position of its 'const' declaration. +// +type NamedConst struct { + object *types.Const + Value *Const + pos token.Pos + pkg *Package +} + +// A Value is an SSA value that can be referenced by an instruction. +type Value interface { + // Name returns the name of this value, and determines how + // this Value appears when used as an operand of an + // Instruction. + // + // This is the same as the source name for Parameters, + // Builtins, Functions, FreeVars, Globals. + // For constants, it is a representation of the constant's value + // and type. For all other Values this is the name of the + // virtual register defined by the instruction. + // + // The name of an SSA Value is not semantically significant, + // and may not even be unique within a function. + Name() string + + // If this value is an Instruction, String returns its + // disassembled form; otherwise it returns unspecified + // human-readable information about the Value, such as its + // kind, name and type. + String() string + + // Type returns the type of this value. Many instructions + // (e.g. IndexAddr) change their behaviour depending on the + // types of their operands. + Type() types.Type + + // Parent returns the function to which this Value belongs. + // It returns nil for named Functions, Builtin, Const and Global. + Parent() *Function + + // Referrers returns the list of instructions that have this + // value as one of their operands; it may contain duplicates + // if an instruction has a repeated operand. + // + // Referrers actually returns a pointer through which the + // caller may perform mutations to the object's state. + // + // Referrers is currently only defined if Parent()!=nil, + // i.e. for the function-local values FreeVar, Parameter, + // Functions (iff anonymous) and all value-defining instructions. + // It returns nil for named Functions, Builtin, Const and Global. + // + // Instruction.Operands contains the inverse of this relation. + Referrers() *[]Instruction + + // Pos returns the location of the AST token most closely + // associated with the operation that gave rise to this value, + // or token.NoPos if it was not explicit in the source. + // + // For each ast.Node type, a particular token is designated as + // the closest location for the expression, e.g. the Lparen + // for an *ast.CallExpr. This permits a compact but + // approximate mapping from Values to source positions for use + // in diagnostic messages, for example. + // + // (Do not use this position to determine which Value + // corresponds to an ast.Expr; use Function.ValueForExpr + // instead. NB: it requires that the function was built with + // debug information.) + Pos() token.Pos +} + +// An Instruction is an SSA instruction that computes a new Value or +// has some effect. +// +// An Instruction that defines a value (e.g. BinOp) also implements +// the Value interface; an Instruction that only has an effect (e.g. Store) +// does not. +// +type Instruction interface { + // String returns the disassembled form of this value. + // + // Examples of Instructions that are Values: + // "x + y" (BinOp) + // "len([])" (Call) + // Note that the name of the Value is not printed. + // + // Examples of Instructions that are not Values: + // "return x" (Return) + // "*y = x" (Store) + // + // (The separation Value.Name() from Value.String() is useful + // for some analyses which distinguish the operation from the + // value it defines, e.g., 'y = local int' is both an allocation + // of memory 'local int' and a definition of a pointer y.) + String() string + + // Parent returns the function to which this instruction + // belongs. + Parent() *Function + + // Block returns the basic block to which this instruction + // belongs. + Block() *BasicBlock + + // setBlock sets the basic block to which this instruction belongs. + setBlock(*BasicBlock) + + // Operands returns the operands of this instruction: the + // set of Values it references. + // + // Specifically, it appends their addresses to rands, a + // user-provided slice, and returns the resulting slice, + // permitting avoidance of memory allocation. + // + // The operands are appended in undefined order, but the order + // is consistent for a given Instruction; the addresses are + // always non-nil but may point to a nil Value. Clients may + // store through the pointers, e.g. to effect a value + // renaming. + // + // Value.Referrers is a subset of the inverse of this + // relation. (Referrers are not tracked for all types of + // Values.) + Operands(rands []*Value) []*Value + + // Pos returns the location of the AST token most closely + // associated with the operation that gave rise to this + // instruction, or token.NoPos if it was not explicit in the + // source. + // + // For each ast.Node type, a particular token is designated as + // the closest location for the expression, e.g. the Go token + // for an *ast.GoStmt. This permits a compact but approximate + // mapping from Instructions to source positions for use in + // diagnostic messages, for example. + // + // (Do not use this position to determine which Instruction + // corresponds to an ast.Expr; see the notes for Value.Pos. + // This position may be used to determine which non-Value + // Instruction corresponds to some ast.Stmts, but not all: If + // and Jump instructions have no Pos(), for example.) + Pos() token.Pos +} + +// A Node is a node in the SSA value graph. Every concrete type that +// implements Node is also either a Value, an Instruction, or both. +// +// Node contains the methods common to Value and Instruction, plus the +// Operands and Referrers methods generalized to return nil for +// non-Instructions and non-Values, respectively. +// +// Node is provided to simplify SSA graph algorithms. Clients should +// use the more specific and informative Value or Instruction +// interfaces where appropriate. +// +type Node interface { + // Common methods: + String() string + Pos() token.Pos + Parent() *Function + + // Partial methods: + Operands(rands []*Value) []*Value // nil for non-Instructions + Referrers() *[]Instruction // nil for non-Values +} + +// Function represents the parameters, results, and code of a function +// or method. +// +// If Blocks is nil, this indicates an external function for which no +// Go source code is available. In this case, FreeVars and Locals +// are nil too. Clients performing whole-program analysis must +// handle external functions specially. +// +// Blocks contains the function's control-flow graph (CFG). +// Blocks[0] is the function entry point; block order is not otherwise +// semantically significant, though it may affect the readability of +// the disassembly. +// To iterate over the blocks in dominance order, use DomPreorder(). +// +// Recover is an optional second entry point to which control resumes +// after a recovered panic. The Recover block may contain only a return +// statement, preceded by a load of the function's named return +// parameters, if any. +// +// A nested function (Parent()!=nil) that refers to one or more +// lexically enclosing local variables ("free variables") has FreeVars. +// Such functions cannot be called directly but require a +// value created by MakeClosure which, via its Bindings, supplies +// values for these parameters. +// +// If the function is a method (Signature.Recv() != nil) then the first +// element of Params is the receiver parameter. +// +// A Go package may declare many functions called "init". +// For each one, Object().Name() returns "init" but Name() returns +// "init#1", etc, in declaration order. +// +// Pos() returns the declaring ast.FuncLit.Type.Func or the position +// of the ast.FuncDecl.Name, if the function was explicit in the +// source. Synthetic wrappers, for which Synthetic != "", may share +// the same position as the function they wrap. +// Syntax.Pos() always returns the position of the declaring "func" token. +// +// Type() returns the function's Signature. +// +type Function struct { + name string + object types.Object // a declared *types.Func or one of its wrappers + method *types.Selection // info about provenance of synthetic methods + Signature *types.Signature + pos token.Pos + + Synthetic string // provenance of synthetic function; "" for true source functions + syntax ast.Node // *ast.Func{Decl,Lit}; replaced with simple ast.Node after build, unless debug mode + parent *Function // enclosing function if anon; nil if global + Pkg *Package // enclosing package; nil for shared funcs (wrappers and error.Error) + Prog *Program // enclosing program + Params []*Parameter // function parameters; for methods, includes receiver + FreeVars []*FreeVar // free variables whose values must be supplied by closure + Locals []*Alloc // local variables of this function + Blocks []*BasicBlock // basic blocks of the function; nil => external + Recover *BasicBlock // optional; control transfers here after recovered panic + AnonFuncs []*Function // anonymous functions directly beneath this one + referrers []Instruction // referring instructions (iff Parent() != nil) + + // The following fields are set transiently during building, + // then cleared. + currentBlock *BasicBlock // where to emit code + objects map[types.Object]Value // addresses of local variables + namedResults []*Alloc // tuple of named results + targets *targets // linked stack of branch targets + lblocks map[*ast.Object]*lblock // labelled blocks +} + +// BasicBlock represents an SSA basic block. +// +// The final element of Instrs is always an explicit transfer of +// control (If, Jump, Return, or Panic). +// +// A block may contain no Instructions only if it is unreachable, +// i.e., Preds is nil. Empty blocks are typically pruned. +// +// BasicBlocks and their Preds/Succs relation form a (possibly cyclic) +// graph independent of the SSA Value graph: the control-flow graph or +// CFG. It is illegal for multiple edges to exist between the same +// pair of blocks. +// +// Each BasicBlock is also a node in the dominator tree of the CFG. +// The tree may be navigated using Idom()/Dominees() and queried using +// Dominates(). +// +// The order of Preds and Succs is significant (to Phi and If +// instructions, respectively). +// +type BasicBlock struct { + Index int // index of this block within Parent().Blocks + Comment string // optional label; no semantic significance + parent *Function // parent function + Instrs []Instruction // instructions in order + Preds, Succs []*BasicBlock // predecessors and successors + succs2 [2]*BasicBlock // initial space for Succs + dom domInfo // dominator tree info + gaps int // number of nil Instrs (transient) + rundefers int // number of rundefers (transient) +} + +// Pure values ---------------------------------------- + +// A FreeVar represents a free variable of the function to which it +// belongs. +// +// FreeVars are used to implement anonymous functions, whose free +// variables are lexically captured in a closure formed by +// MakeClosure. The value of such a free var is an Alloc or another +// FreeVar and is considered a potentially escaping heap address, with +// pointer type. +// +// FreeVars are also used to implement bound method closures. Such a +// free var represents the receiver value and may be of any type that +// has concrete methods. +// +// Pos() returns the position of the value that was captured, which +// belongs to an enclosing function. +// +type FreeVar struct { + name string + typ types.Type + pos token.Pos + parent *Function + referrers []Instruction + + // Transiently needed during building. + outer Value // the Value captured from the enclosing context. +} + +// A Parameter represents an input parameter of a function. +// +type Parameter struct { + name string + object types.Object // a *types.Var; nil for non-source locals + typ types.Type + pos token.Pos + parent *Function + referrers []Instruction +} + +// A Const represents the value of a constant expression. +// +// The underlying type of a constant may be any boolean, numeric, or +// string type. In addition, a Const may represent the nil value of +// any reference type---interface, map, channel, pointer, slice, or +// function---but not "untyped nil". +// +// All source-level constant expressions are represented by a Const +// of the same type and value. +// +// Value holds the exact value of the constant, independent of its +// Type(), using the same representation as package go/exact uses for +// constants, or nil for a typed nil value. +// +// Pos() returns token.NoPos. +// +// Example printed form: +// 42:int +// "hello":untyped string +// 3+4i:MyComplex +// +type Const struct { + typ types.Type + Value exact.Value +} + +// A Global is a named Value holding the address of a package-level +// variable. +// +// Pos() returns the position of the ast.ValueSpec.Names[*] +// identifier. +// +type Global struct { + name string + object types.Object // a *types.Var; may be nil for synthetics e.g. init$guard + typ types.Type + pos token.Pos + + Pkg *Package +} + +// A Builtin represents a specific use of a built-in function, e.g. len. +// +// Builtins are immutable values. Builtins do not have addresses. +// Builtins can only appear in CallCommon.Func. +// +// Name() indicates the function: one of the built-in functions from the +// Go spec (excluding "make" and "new") or one of these ssa-defined +// intrinsics: +// +// // wrapnilchk returns ptr if non-nil, panics otherwise. +// // (For use in indirection wrappers.) +// func ssa:wrapnilchk(ptr *T, recvType, methodName string) *T +// +// Object() returns a *types.Builtin for built-ins defined by the spec, +// nil for others. +// +// Type() returns a *types.Signature representing the effective +// signature of the built-in for this call. +// +type Builtin struct { + name string + sig *types.Signature +} + +// Value-defining instructions ---------------------------------------- + +// The Alloc instruction reserves space for a variable of the given type, +// zero-initializes it, and yields its address. +// +// Alloc values are always addresses, and have pointer types, so the +// type of the allocated variable is actually +// Type().Underlying().(*types.Pointer).Elem(). +// +// If Heap is false, Alloc allocates space in the function's +// activation record (frame); we refer to an Alloc(Heap=false) as a +// "local" alloc. Each local Alloc returns the same address each time +// it is executed within the same activation; the space is +// re-initialized to zero. +// +// If Heap is true, Alloc allocates space in the heap; we +// refer to an Alloc(Heap=true) as a "new" alloc. Each new Alloc +// returns a different address each time it is executed. +// +// When Alloc is applied to a channel, map or slice type, it returns +// the address of an uninitialized (nil) reference of that kind; store +// the result of MakeSlice, MakeMap or MakeChan in that location to +// instantiate these types. +// +// Pos() returns the ast.CompositeLit.Lbrace for a composite literal, +// or the ast.CallExpr.Rparen for a call to new() or for a call that +// allocates a varargs slice. +// +// Example printed form: +// t0 = local int +// t1 = new int +// +type Alloc struct { + register + Comment string + Heap bool + index int // dense numbering; for lifting +} + +// The Phi instruction represents an SSA φ-node, which combines values +// that differ across incoming control-flow edges and yields a new +// value. Within a block, all φ-nodes must appear before all non-φ +// nodes. +// +// Pos() returns the position of the && or || for short-circuit +// control-flow joins, or that of the *Alloc for φ-nodes inserted +// during SSA renaming. +// +// Example printed form: +// t2 = phi [0: t0, 1: t1] +// +type Phi struct { + register + Comment string // a hint as to its purpose + Edges []Value // Edges[i] is value for Block().Preds[i] +} + +// The Call instruction represents a function or method call. +// +// The Call instruction yields the function result if there is exactly +// one. Otherwise it returns a tuple, the components of which are +// accessed via Extract. +// +// See CallCommon for generic function call documentation. +// +// Pos() returns the ast.CallExpr.Lparen, if explicit in the source. +// +// Example printed form: +// t2 = println(t0, t1) +// t4 = t3() +// t7 = invoke t5.Println(...t6) +// +type Call struct { + register + Call CallCommon +} + +// The BinOp instruction yields the result of binary operation X Op Y. +// +// Pos() returns the ast.BinaryExpr.OpPos, if explicit in the source. +// +// Example printed form: +// t1 = t0 + 1:int +// +type BinOp struct { + register + // One of: + // ADD SUB MUL QUO REM + - * / % + // AND OR XOR SHL SHR AND_NOT & | ^ << >> &~ + // EQL LSS GTR NEQ LEQ GEQ == != < <= < >= + Op token.Token + X, Y Value +} + +// The UnOp instruction yields the result of Op X. +// ARROW is channel receive. +// MUL is pointer indirection (load). +// XOR is bitwise complement. +// SUB is negation. +// NOT is logical negation. +// +// If CommaOk and Op=ARROW, the result is a 2-tuple of the value above +// and a boolean indicating the success of the receive. The +// components of the tuple are accessed using Extract. +// +// Pos() returns the ast.UnaryExpr.OpPos, if explicit in the source. +// For receive operations (ARROW) implicit in ranging over a channel, +// Pos() returns the ast.RangeStmt.For. +// For implicit memory loads (STAR), Pos() returns the position of the +// most closely associated source-level construct; the details are not +// specified. +// +// Example printed form: +// t0 = *x +// t2 = <-t1,ok +// +type UnOp struct { + register + Op token.Token // One of: NOT SUB ARROW MUL XOR ! - <- * ^ + X Value + CommaOk bool +} + +// The ChangeType instruction applies to X a value-preserving type +// change to Type(). +// +// Type changes are permitted: +// - between a named type and its underlying type. +// - between two named types of the same underlying type. +// - between (possibly named) pointers to identical base types. +// - from a bidirectional channel to a read- or write-channel, +// optionally adding/removing a name. +// +// This operation cannot fail dynamically. +// +// Pos() returns the ast.CallExpr.Lparen, if the instruction arose +// from an explicit conversion in the source. +// +// Example printed form: +// t1 = changetype *int <- IntPtr (t0) +// +type ChangeType struct { + register + X Value +} + +// The Convert instruction yields the conversion of value X to type +// Type(). One or both of those types is basic (but possibly named). +// +// A conversion may change the value and representation of its operand. +// Conversions are permitted: +// - between real numeric types. +// - between complex numeric types. +// - between string and []byte or []rune. +// - between pointers and unsafe.Pointer. +// - between unsafe.Pointer and uintptr. +// - from (Unicode) integer to (UTF-8) string. +// A conversion may imply a type name change also. +// +// This operation cannot fail dynamically. +// +// Conversions of untyped string/number/bool constants to a specific +// representation are eliminated during SSA construction. +// +// Pos() returns the ast.CallExpr.Lparen, if the instruction arose +// from an explicit conversion in the source. +// +// Example printed form: +// t1 = convert []byte <- string (t0) +// +type Convert struct { + register + X Value +} + +// ChangeInterface constructs a value of one interface type from a +// value of another interface type known to be assignable to it. +// This operation cannot fail. +// +// Pos() returns the ast.CallExpr.Lparen if the instruction arose from +// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the +// instruction arose from an explicit e.(T) operation; or token.NoPos +// otherwise. +// +// Example printed form: +// t1 = change interface interface{} <- I (t0) +// +type ChangeInterface struct { + register + X Value +} + +// MakeInterface constructs an instance of an interface type from a +// value of a concrete type. +// +// Use Program.MethodSets.MethodSet(X.Type()) to find the method-set +// of X, and Program.Method(m) to find the implementation of a method. +// +// To construct the zero value of an interface type T, use: +// NewConst(exact.MakeNil(), T, pos) +// +// Pos() returns the ast.CallExpr.Lparen, if the instruction arose +// from an explicit conversion in the source. +// +// Example printed form: +// t1 = make interface{} <- int (42:int) +// t2 = make Stringer <- t0 +// +type MakeInterface struct { + register + X Value +} + +// The MakeClosure instruction yields a closure value whose code is +// Fn and whose free variables' values are supplied by Bindings. +// +// Type() returns a (possibly named) *types.Signature. +// +// Pos() returns the ast.FuncLit.Type.Func for a function literal +// closure or the ast.SelectorExpr.Sel for a bound method closure. +// +// Example printed form: +// t0 = make closure anon@1.2 [x y z] +// t1 = make closure bound$(main.I).add [i] +// +type MakeClosure struct { + register + Fn Value // always a *Function + Bindings []Value // values for each free variable in Fn.FreeVars +} + +// The MakeMap instruction creates a new hash-table-based map object +// and yields a value of kind map. +// +// Type() returns a (possibly named) *types.Map. +// +// Pos() returns the ast.CallExpr.Lparen, if created by make(map), or +// the ast.CompositeLit.Lbrack if created by a literal. +// +// Example printed form: +// t1 = make map[string]int t0 +// t1 = make StringIntMap t0 +// +type MakeMap struct { + register + Reserve Value // initial space reservation; nil => default +} + +// The MakeChan instruction creates a new channel object and yields a +// value of kind chan. +// +// Type() returns a (possibly named) *types.Chan. +// +// Pos() returns the ast.CallExpr.Lparen for the make(chan) that +// created it. +// +// Example printed form: +// t0 = make chan int 0 +// t0 = make IntChan 0 +// +type MakeChan struct { + register + Size Value // int; size of buffer; zero => synchronous. +} + +// The MakeSlice instruction yields a slice of length Len backed by a +// newly allocated array of length Cap. +// +// Both Len and Cap must be non-nil Values of integer type. +// +// (Alloc(types.Array) followed by Slice will not suffice because +// Alloc can only create arrays of constant length.) +// +// Type() returns a (possibly named) *types.Slice. +// +// Pos() returns the ast.CallExpr.Lparen for the make([]T) that +// created it. +// +// Example printed form: +// t1 = make []string 1:int t0 +// t1 = make StringSlice 1:int t0 +// +type MakeSlice struct { + register + Len Value + Cap Value +} + +// The Slice instruction yields a slice of an existing string, slice +// or *array X between optional integer bounds Low and High. +// +// Dynamically, this instruction panics if X evaluates to a nil *array +// pointer. +// +// Type() returns string if the type of X was string, otherwise a +// *types.Slice with the same element type as X. +// +// Pos() returns the ast.SliceExpr.Lbrack if created by a x[:] slice +// operation, the ast.CompositeLit.Lbrace if created by a literal, or +// NoPos if not explicit in the source (e.g. a variadic argument slice). +// +// Example printed form: +// t1 = slice t0[1:] +// +type Slice struct { + register + X Value // slice, string, or *array + Low, High, Max Value // each may be nil +} + +// The FieldAddr instruction yields the address of Field of *struct X. +// +// The field is identified by its index within the field list of the +// struct type of X. +// +// Dynamically, this instruction panics if X evaluates to a nil +// pointer. +// +// Type() returns a (possibly named) *types.Pointer. +// +// Pos() returns the position of the ast.SelectorExpr.Sel for the +// field, if explicit in the source. +// +// Example printed form: +// t1 = &t0.name [#1] +// +type FieldAddr struct { + register + X Value // *struct + Field int // index into X.Type().Deref().(*types.Struct).Fields +} + +// The Field instruction yields the Field of struct X. +// +// The field is identified by its index within the field list of the +// struct type of X; by using numeric indices we avoid ambiguity of +// package-local identifiers and permit compact representations. +// +// Pos() returns the position of the ast.SelectorExpr.Sel for the +// field, if explicit in the source. +// +// Example printed form: +// t1 = t0.name [#1] +// +type Field struct { + register + X Value // struct + Field int // index into X.Type().(*types.Struct).Fields +} + +// The IndexAddr instruction yields the address of the element at +// index Index of collection X. Index is an integer expression. +// +// The elements of maps and strings are not addressable; use Lookup or +// MapUpdate instead. +// +// Dynamically, this instruction panics if X evaluates to a nil *array +// pointer. +// +// Type() returns a (possibly named) *types.Pointer. +// +// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if +// explicit in the source. +// +// Example printed form: +// t2 = &t0[t1] +// +type IndexAddr struct { + register + X Value // slice or *array, + Index Value // numeric index +} + +// The Index instruction yields element Index of array X. +// +// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if +// explicit in the source. +// +// Example printed form: +// t2 = t0[t1] +// +type Index struct { + register + X Value // array + Index Value // integer index +} + +// The Lookup instruction yields element Index of collection X, a map +// or string. Index is an integer expression if X is a string or the +// appropriate key type if X is a map. +// +// If CommaOk, the result is a 2-tuple of the value above and a +// boolean indicating the result of a map membership test for the key. +// The components of the tuple are accessed using Extract. +// +// Pos() returns the ast.IndexExpr.Lbrack, if explicit in the source. +// +// Example printed form: +// t2 = t0[t1] +// t5 = t3[t4],ok +// +type Lookup struct { + register + X Value // string or map + Index Value // numeric or key-typed index + CommaOk bool // return a value,ok pair +} + +// SelectState is a helper for Select. +// It represents one goal state and its corresponding communication. +// +type SelectState struct { + Dir types.ChanDir // direction of case (SendOnly or RecvOnly) + Chan Value // channel to use (for send or receive) + Send Value // value to send (for send) + Pos token.Pos // position of token.ARROW + DebugNode ast.Node // ast.SendStmt or ast.UnaryExpr(<-) [debug mode] +} + +// The Select instruction tests whether (or blocks until) one +// of the specified sent or received states is entered. +// +// Let n be the number of States for which Dir==RECV and T_i (0<=i string iterator; false => map iterator. +} + +// The TypeAssert instruction tests whether interface value X has type +// AssertedType. +// +// If !CommaOk, on success it returns v, the result of the conversion +// (defined below); on failure it panics. +// +// If CommaOk: on success it returns a pair (v, true) where v is the +// result of the conversion; on failure it returns (z, false) where z +// is AssertedType's zero value. The components of the pair must be +// accessed using the Extract instruction. +// +// If AssertedType is a concrete type, TypeAssert checks whether the +// dynamic type in interface X is equal to it, and if so, the result +// of the conversion is a copy of the value in the interface. +// +// If AssertedType is an interface, TypeAssert checks whether the +// dynamic type of the interface is assignable to it, and if so, the +// result of the conversion is a copy of the interface value X. +// If AssertedType is a superinterface of X.Type(), the operation will +// fail iff the operand is nil. (Contrast with ChangeInterface, which +// performs no nil-check.) +// +// Type() reflects the actual type of the result, possibly a +// 2-types.Tuple; AssertedType is the asserted type. +// +// Pos() returns the ast.CallExpr.Lparen if the instruction arose from +// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the +// instruction arose from an explicit e.(T) operation; or the +// ast.CaseClause.Case if the instruction arose from a case of a +// type-switch statement. +// +// Example printed form: +// t1 = typeassert t0.(int) +// t3 = typeassert,ok t2.(T) +// +type TypeAssert struct { + register + X Value + AssertedType types.Type + CommaOk bool +} + +// The Extract instruction yields component Index of Tuple. +// +// This is used to access the results of instructions with multiple +// return values, such as Call, TypeAssert, Next, UnOp(ARROW) and +// IndexExpr(Map). +// +// Example printed form: +// t1 = extract t0 #1 +// +type Extract struct { + register + Tuple Value + Index int +} + +// Instructions executed for effect. They do not yield a value. -------------------- + +// The Jump instruction transfers control to the sole successor of its +// owning block. +// +// A Jump must be the last instruction of its containing BasicBlock. +// +// Pos() returns NoPos. +// +// Example printed form: +// jump done +// +type Jump struct { + anInstruction +} + +// The If instruction transfers control to one of the two successors +// of its owning block, depending on the boolean Cond: the first if +// true, the second if false. +// +// An If instruction must be the last instruction of its containing +// BasicBlock. +// +// Pos() returns NoPos. +// +// Example printed form: +// if t0 goto done else body +// +type If struct { + anInstruction + Cond Value +} + +// The Return instruction returns values and control back to the calling +// function. +// +// len(Results) is always equal to the number of results in the +// function's signature. +// +// If len(Results) > 1, Return returns a tuple value with the specified +// components which the caller must access using Extract instructions. +// +// There is no instruction to return a ready-made tuple like those +// returned by a "value,ok"-mode TypeAssert, Lookup or UnOp(ARROW) or +// a tail-call to a function with multiple result parameters. +// +// Return must be the last instruction of its containing BasicBlock. +// Such a block has no successors. +// +// Pos() returns the ast.ReturnStmt.Return, if explicit in the source. +// +// Example printed form: +// return +// return nil:I, 2:int +// +type Return struct { + anInstruction + Results []Value + pos token.Pos +} + +// The RunDefers instruction pops and invokes the entire stack of +// procedure calls pushed by Defer instructions in this function. +// +// It is legal to encounter multiple 'rundefers' instructions in a +// single control-flow path through a function; this is useful in +// the combined init() function, for example. +// +// Pos() returns NoPos. +// +// Example printed form: +// rundefers +// +type RunDefers struct { + anInstruction +} + +// The Panic instruction initiates a panic with value X. +// +// A Panic instruction must be the last instruction of its containing +// BasicBlock, which must have no successors. +// +// NB: 'go panic(x)' and 'defer panic(x)' do not use this instruction; +// they are treated as calls to a built-in function. +// +// Pos() returns the ast.CallExpr.Lparen if this panic was explicit +// in the source. +// +// Example printed form: +// panic t0 +// +type Panic struct { + anInstruction + X Value // an interface{} + pos token.Pos +} + +// The Go instruction creates a new goroutine and calls the specified +// function within it. +// +// See CallCommon for generic function call documentation. +// +// Pos() returns the ast.GoStmt.Go. +// +// Example printed form: +// go println(t0, t1) +// go t3() +// go invoke t5.Println(...t6) +// +type Go struct { + anInstruction + Call CallCommon + pos token.Pos +} + +// The Defer instruction pushes the specified call onto a stack of +// functions to be called by a RunDefers instruction or by a panic. +// +// See CallCommon for generic function call documentation. +// +// Pos() returns the ast.DeferStmt.Defer. +// +// Example printed form: +// defer println(t0, t1) +// defer t3() +// defer invoke t5.Println(...t6) +// +type Defer struct { + anInstruction + Call CallCommon + pos token.Pos +} + +// The Send instruction sends X on channel Chan. +// +// Pos() returns the ast.SendStmt.Arrow, if explicit in the source. +// +// Example printed form: +// send t0 <- t1 +// +type Send struct { + anInstruction + Chan, X Value + pos token.Pos +} + +// The Store instruction stores Val at address Addr. +// Stores can be of arbitrary types. +// +// Pos() returns the position of the source-level construct most closely +// associated with the memory store operation. +// Since implicit memory stores are numerous and varied and depend upon +// implementation choices, the details are not specified. +// +// Example printed form: +// *x = y +// +type Store struct { + anInstruction + Addr Value + Val Value + pos token.Pos +} + +// The MapUpdate instruction updates the association of Map[Key] to +// Value. +// +// Pos() returns the ast.KeyValueExpr.Colon or ast.IndexExpr.Lbrack, +// if explicit in the source. +// +// Example printed form: +// t0[t1] = t2 +// +type MapUpdate struct { + anInstruction + Map Value + Key Value + Value Value + pos token.Pos +} + +// A DebugRef instruction maps a source-level expression Expr to the +// SSA value X that represents the value (!IsAddr) or address (IsAddr) +// of that expression. +// +// DebugRef is a pseudo-instruction: it has no dynamic effect. +// +// Pos() returns Expr.Pos(), the start position of the source-level +// expression. This is not the same as the "designated" token as +// documented at Value.Pos(). e.g. CallExpr.Pos() does not return the +// position of the ("designated") Lparen token. +// +// If Expr is an *ast.Ident denoting a var or func, Object() returns +// the object; though this information can be obtained from the type +// checker, including it here greatly facilitates debugging. +// For non-Ident expressions, Object() returns nil. +// +// DebugRefs are generated only for functions built with debugging +// enabled; see Package.SetDebugMode() and the GlobalDebug builder +// mode flag. +// +// DebugRefs are not emitted for ast.Idents referring to constants or +// predeclared identifiers, since they are trivial and numerous. +// Nor are they emitted for ast.ParenExprs. +// +// (By representing these as instructions, rather than out-of-band, +// consistency is maintained during transformation passes by the +// ordinary SSA renaming machinery.) +// +// Example printed form: +// ; *ast.CallExpr @ 102:9 is t5 +// ; var x float64 @ 109:72 is x +// ; address of *ast.CompositeLit @ 216:10 is t0 +// +type DebugRef struct { + anInstruction + Expr ast.Expr // the referring expression (never *ast.ParenExpr) + object types.Object // the identity of the source var/func + IsAddr bool // Expr is addressable and X is the address it denotes + X Value // the value or address of Expr +} + +// Embeddable mix-ins and helpers for common parts of other structs. ----------- + +// register is a mix-in embedded by all SSA values that are also +// instructions, i.e. virtual registers, and provides a uniform +// implementation of most of the Value interface: Value.Name() is a +// numbered register (e.g. "t0"); the other methods are field accessors. +// +// Temporary names are automatically assigned to each register on +// completion of building a function in SSA form. +// +// Clients must not assume that the 'id' value (and the Name() derived +// from it) is unique within a function. As always in this API, +// semantics are determined only by identity; names exist only to +// facilitate debugging. +// +type register struct { + anInstruction + num int // "name" of virtual register, e.g. "t0". Not guaranteed unique. + typ types.Type // type of virtual register + pos token.Pos // position of source expression, or NoPos + referrers []Instruction +} + +// anInstruction is a mix-in embedded by all Instructions. +// It provides the implementations of the Block and setBlock methods. +type anInstruction struct { + block *BasicBlock // the basic block of this instruction +} + +// CallCommon is contained by Go, Defer and Call to hold the +// common parts of a function or method call. +// +// Each CallCommon exists in one of two modes, function call and +// interface method invocation, or "call" and "invoke" for short. +// +// 1. "call" mode: when Method is nil (!IsInvoke), a CallCommon +// represents an ordinary function call of the value in Value, +// which may be a *Builtin, a *Function or any other value of kind +// 'func'. +// +// Value may be one of: +// (a) a *Function, indicating a statically dispatched call +// to a package-level function, an anonymous function, or +// a method of a named type. +// (b) a *MakeClosure, indicating an immediately applied +// function literal with free variables. +// (c) a *Builtin, indicating a statically dispatched call +// to a built-in function. +// (d) any other value, indicating a dynamically dispatched +// function call. +// StaticCallee returns the identity of the callee in cases +// (a) and (b), nil otherwise. +// +// Args contains the arguments to the call. If Value is a method, +// Args[0] contains the receiver parameter. +// +// Example printed form: +// t2 = println(t0, t1) +// go t3() +// defer t5(...t6) +// +// 2. "invoke" mode: when Method is non-nil (IsInvoke), a CallCommon +// represents a dynamically dispatched call to an interface method. +// In this mode, Value is the interface value and Method is the +// interface's abstract method. Note: an abstract method may be +// shared by multiple interfaces due to embedding; Value.Type() +// provides the specific interface used for this call. +// +// Value is implicitly supplied to the concrete method implementation +// as the receiver parameter; in other words, Args[0] holds not the +// receiver but the first true argument. +// +// Example printed form: +// t1 = invoke t0.String() +// go invoke t3.Run(t2) +// defer invoke t4.Handle(...t5) +// +// For all calls to variadic functions (Signature().Variadic()), +// the last element of Args is a slice. +// +type CallCommon struct { + Value Value // receiver (invoke mode) or func value (call mode) + Method *types.Func // abstract method (invoke mode) + Args []Value // actual parameters (in static method call, includes receiver) + pos token.Pos // position of CallExpr.Lparen, iff explicit in source +} + +// IsInvoke returns true if this call has "invoke" (not "call") mode. +func (c *CallCommon) IsInvoke() bool { + return c.Method != nil +} + +func (c *CallCommon) Pos() token.Pos { return c.pos } + +// Signature returns the signature of the called function. +// +// For an "invoke"-mode call, the signature of the interface method is +// returned. +// +// In either "call" or "invoke" mode, if the callee is a method, its +// receiver is represented by sig.Recv, not sig.Params().At(0). +// +func (c *CallCommon) Signature() *types.Signature { + if c.Method != nil { + return c.Method.Type().(*types.Signature) + } + return c.Value.Type().Underlying().(*types.Signature) +} + +// StaticCallee returns the callee if this is a trivially static +// "call"-mode call to a function. +func (c *CallCommon) StaticCallee() *Function { + switch fn := c.Value.(type) { + case *Function: + return fn + case *MakeClosure: + return fn.Fn.(*Function) + } + return nil +} + +// Description returns a description of the mode of this call suitable +// for a user interface, e.g., "static method call". +func (c *CallCommon) Description() string { + switch fn := c.Value.(type) { + case *Builtin: + return "built-in function call" + case *MakeClosure: + return "static function closure call" + case *Function: + if fn.Signature.Recv() != nil { + return "static method call" + } + return "static function call" + } + if c.IsInvoke() { + return "dynamic method call" // ("invoke" mode) + } + return "dynamic function call" +} + +// The CallInstruction interface, implemented by *Go, *Defer and *Call, +// exposes the common parts of function-calling instructions, +// yet provides a way back to the Value defined by *Call alone. +// +type CallInstruction interface { + Instruction + Common() *CallCommon // returns the common parts of the call + Value() *Call // returns the result value of the call (*Call) or nil (*Go, *Defer) +} + +func (s *Call) Common() *CallCommon { return &s.Call } +func (s *Defer) Common() *CallCommon { return &s.Call } +func (s *Go) Common() *CallCommon { return &s.Call } + +func (s *Call) Value() *Call { return s } +func (s *Defer) Value() *Call { return nil } +func (s *Go) Value() *Call { return nil } + +func (v *Builtin) Type() types.Type { return v.sig } +func (v *Builtin) Name() string { return v.name } +func (*Builtin) Referrers() *[]Instruction { return nil } +func (v *Builtin) Pos() token.Pos { return token.NoPos } +func (v *Builtin) Object() types.Object { return types.Universe.Lookup(v.name) } +func (v *Builtin) Parent() *Function { return nil } + +func (v *FreeVar) Type() types.Type { return v.typ } +func (v *FreeVar) Name() string { return v.name } +func (v *FreeVar) Referrers() *[]Instruction { return &v.referrers } +func (v *FreeVar) Pos() token.Pos { return v.pos } +func (v *FreeVar) Parent() *Function { return v.parent } + +func (v *Global) Type() types.Type { return v.typ } +func (v *Global) Name() string { return v.name } +func (v *Global) Parent() *Function { return nil } +func (v *Global) Pos() token.Pos { return v.pos } +func (v *Global) Referrers() *[]Instruction { return nil } +func (v *Global) Token() token.Token { return token.VAR } +func (v *Global) Object() types.Object { return v.object } +func (v *Global) String() string { return v.RelString(nil) } +func (v *Global) Package() *Package { return v.Pkg } +func (v *Global) RelString(from *types.Package) string { return relString(v, from) } + +func (v *Function) Name() string { return v.name } +func (v *Function) Type() types.Type { return v.Signature } +func (v *Function) Pos() token.Pos { return v.pos } +func (v *Function) Token() token.Token { return token.FUNC } +func (v *Function) Object() types.Object { return v.object } +func (v *Function) String() string { return v.RelString(nil) } +func (v *Function) Package() *Package { return v.Pkg } +func (v *Function) Parent() *Function { return v.parent } +func (v *Function) Referrers() *[]Instruction { + if v.parent != nil { + return &v.referrers + } + return nil +} + +func (v *Parameter) Type() types.Type { return v.typ } +func (v *Parameter) Name() string { return v.name } +func (v *Parameter) Object() types.Object { return v.object } +func (v *Parameter) Referrers() *[]Instruction { return &v.referrers } +func (v *Parameter) Pos() token.Pos { return v.pos } +func (v *Parameter) Parent() *Function { return v.parent } + +func (v *Alloc) Type() types.Type { return v.typ } +func (v *Alloc) Referrers() *[]Instruction { return &v.referrers } +func (v *Alloc) Pos() token.Pos { return v.pos } + +func (v *register) Type() types.Type { return v.typ } +func (v *register) setType(typ types.Type) { v.typ = typ } +func (v *register) Name() string { return fmt.Sprintf("t%d", v.num) } +func (v *register) setNum(num int) { v.num = num } +func (v *register) Referrers() *[]Instruction { return &v.referrers } +func (v *register) Pos() token.Pos { return v.pos } +func (v *register) setPos(pos token.Pos) { v.pos = pos } + +func (v *anInstruction) Parent() *Function { return v.block.parent } +func (v *anInstruction) Block() *BasicBlock { return v.block } +func (v *anInstruction) setBlock(block *BasicBlock) { v.block = block } +func (v *anInstruction) Referrers() *[]Instruction { return nil } + +func (t *Type) Name() string { return t.object.Name() } +func (t *Type) Pos() token.Pos { return t.object.Pos() } +func (t *Type) Type() types.Type { return t.object.Type() } +func (t *Type) Token() token.Token { return token.TYPE } +func (t *Type) Object() types.Object { return t.object } +func (t *Type) String() string { return t.RelString(nil) } +func (t *Type) Package() *Package { return t.pkg } +func (t *Type) RelString(from *types.Package) string { return relString(t, from) } + +func (c *NamedConst) Name() string { return c.object.Name() } +func (c *NamedConst) Pos() token.Pos { return c.object.Pos() } +func (c *NamedConst) String() string { return c.RelString(nil) } +func (c *NamedConst) Type() types.Type { return c.object.Type() } +func (c *NamedConst) Token() token.Token { return token.CONST } +func (c *NamedConst) Object() types.Object { return c.object } +func (c *NamedConst) Package() *Package { return c.pkg } +func (c *NamedConst) RelString(from *types.Package) string { return relString(c, from) } + +// Func returns the package-level function of the specified name, +// or nil if not found. +// +func (p *Package) Func(name string) (f *Function) { + f, _ = p.Members[name].(*Function) + return +} + +// Var returns the package-level variable of the specified name, +// or nil if not found. +// +func (p *Package) Var(name string) (g *Global) { + g, _ = p.Members[name].(*Global) + return +} + +// Const returns the package-level constant of the specified name, +// or nil if not found. +// +func (p *Package) Const(name string) (c *NamedConst) { + c, _ = p.Members[name].(*NamedConst) + return +} + +// Type returns the package-level type of the specified name, +// or nil if not found. +// +func (p *Package) Type(name string) (t *Type) { + t, _ = p.Members[name].(*Type) + return +} + +func (v *Call) Pos() token.Pos { return v.Call.pos } +func (s *Defer) Pos() token.Pos { return s.pos } +func (s *Go) Pos() token.Pos { return s.pos } +func (s *MapUpdate) Pos() token.Pos { return s.pos } +func (s *Panic) Pos() token.Pos { return s.pos } +func (s *Return) Pos() token.Pos { return s.pos } +func (s *Send) Pos() token.Pos { return s.pos } +func (s *Store) Pos() token.Pos { return s.pos } +func (s *If) Pos() token.Pos { return token.NoPos } +func (s *Jump) Pos() token.Pos { return token.NoPos } +func (s *RunDefers) Pos() token.Pos { return token.NoPos } +func (s *DebugRef) Pos() token.Pos { return s.Expr.Pos() } + +// Operands. + +func (v *Alloc) Operands(rands []*Value) []*Value { + return rands +} + +func (v *BinOp) Operands(rands []*Value) []*Value { + return append(rands, &v.X, &v.Y) +} + +func (c *CallCommon) Operands(rands []*Value) []*Value { + rands = append(rands, &c.Value) + for i := range c.Args { + rands = append(rands, &c.Args[i]) + } + return rands +} + +func (s *Go) Operands(rands []*Value) []*Value { + return s.Call.Operands(rands) +} + +func (s *Call) Operands(rands []*Value) []*Value { + return s.Call.Operands(rands) +} + +func (s *Defer) Operands(rands []*Value) []*Value { + return s.Call.Operands(rands) +} + +func (v *ChangeInterface) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (v *ChangeType) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (v *Convert) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (s *DebugRef) Operands(rands []*Value) []*Value { + return append(rands, &s.X) +} + +func (v *Extract) Operands(rands []*Value) []*Value { + return append(rands, &v.Tuple) +} + +func (v *Field) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (v *FieldAddr) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (s *If) Operands(rands []*Value) []*Value { + return append(rands, &s.Cond) +} + +func (v *Index) Operands(rands []*Value) []*Value { + return append(rands, &v.X, &v.Index) +} + +func (v *IndexAddr) Operands(rands []*Value) []*Value { + return append(rands, &v.X, &v.Index) +} + +func (*Jump) Operands(rands []*Value) []*Value { + return rands +} + +func (v *Lookup) Operands(rands []*Value) []*Value { + return append(rands, &v.X, &v.Index) +} + +func (v *MakeChan) Operands(rands []*Value) []*Value { + return append(rands, &v.Size) +} + +func (v *MakeClosure) Operands(rands []*Value) []*Value { + rands = append(rands, &v.Fn) + for i := range v.Bindings { + rands = append(rands, &v.Bindings[i]) + } + return rands +} + +func (v *MakeInterface) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (v *MakeMap) Operands(rands []*Value) []*Value { + return append(rands, &v.Reserve) +} + +func (v *MakeSlice) Operands(rands []*Value) []*Value { + return append(rands, &v.Len, &v.Cap) +} + +func (v *MapUpdate) Operands(rands []*Value) []*Value { + return append(rands, &v.Map, &v.Key, &v.Value) +} + +func (v *Next) Operands(rands []*Value) []*Value { + return append(rands, &v.Iter) +} + +func (s *Panic) Operands(rands []*Value) []*Value { + return append(rands, &s.X) +} + +func (v *Phi) Operands(rands []*Value) []*Value { + for i := range v.Edges { + rands = append(rands, &v.Edges[i]) + } + return rands +} + +func (v *Range) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (s *Return) Operands(rands []*Value) []*Value { + for i := range s.Results { + rands = append(rands, &s.Results[i]) + } + return rands +} + +func (*RunDefers) Operands(rands []*Value) []*Value { + return rands +} + +func (v *Select) Operands(rands []*Value) []*Value { + for i := range v.States { + rands = append(rands, &v.States[i].Chan, &v.States[i].Send) + } + return rands +} + +func (s *Send) Operands(rands []*Value) []*Value { + return append(rands, &s.Chan, &s.X) +} + +func (v *Slice) Operands(rands []*Value) []*Value { + return append(rands, &v.X, &v.Low, &v.High, &v.Max) +} + +func (s *Store) Operands(rands []*Value) []*Value { + return append(rands, &s.Addr, &s.Val) +} + +func (v *TypeAssert) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +func (v *UnOp) Operands(rands []*Value) []*Value { + return append(rands, &v.X) +} + +// Non-Instruction Values: +func (v *Builtin) Operands(rands []*Value) []*Value { return rands } +func (v *FreeVar) Operands(rands []*Value) []*Value { return rands } +func (v *Const) Operands(rands []*Value) []*Value { return rands } +func (v *Function) Operands(rands []*Value) []*Value { return rands } +func (v *Global) Operands(rands []*Value) []*Value { return rands } +func (v *Parameter) Operands(rands []*Value) []*Value { return rands } diff --git a/vendor/golang.org/x/tools/go/ssa/ssautil/load.go b/vendor/golang.org/x/tools/go/ssa/ssautil/load.go new file mode 100644 index 0000000000..7c57838668 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/ssautil/load.go @@ -0,0 +1,97 @@ +// 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.5 + +package ssautil + +// This file defines utility functions for constructing programs in SSA form. + +import ( + "go/ast" + "go/token" + "go/types" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" +) + +// CreateProgram returns a new program in SSA form, given a program +// loaded from source. An SSA package is created for each transitively +// error-free package of lprog. +// +// Code for bodies of functions is not built until BuildAll() is called +// on the result. +// +// mode controls diagnostics and checking during SSA construction. +// +func CreateProgram(lprog *loader.Program, mode ssa.BuilderMode) *ssa.Program { + prog := ssa.NewProgram(lprog.Fset, mode) + + for _, info := range lprog.AllPackages { + if info.TransitivelyErrorFree { + prog.CreatePackage(info.Pkg, info.Files, &info.Info, info.Importable) + } + } + + return prog +} + +// BuildPackage builds an SSA program with IR for a single package. +// +// It populates pkg by type-checking the specified file ASTs. All +// dependencies are loaded using the importer specified by tc, which +// typically loads compiler export data; SSA code cannot be built for +// those packages. BuildPackage then constructs an ssa.Program with all +// dependency packages created, and builds and returns the SSA package +// corresponding to pkg. +// +// The caller must have set pkg.Path() to the import path. +// +// The operation fails if there were any type-checking or import errors. +// +// See ../ssa/example_test.go for an example. +// +func BuildPackage(tc *types.Config, fset *token.FileSet, pkg *types.Package, files []*ast.File, mode ssa.BuilderMode) (*ssa.Package, *types.Info, error) { + if fset == nil { + panic("no token.FileSet") + } + if pkg.Path() == "" { + panic("package has no import path") + } + + info := &types.Info{ + Types: make(map[ast.Expr]types.TypeAndValue), + Defs: make(map[*ast.Ident]types.Object), + Uses: make(map[*ast.Ident]types.Object), + Implicits: make(map[ast.Node]types.Object), + Scopes: make(map[ast.Node]*types.Scope), + Selections: make(map[*ast.SelectorExpr]*types.Selection), + } + if err := types.NewChecker(tc, fset, pkg, info).Files(files); err != nil { + return nil, nil, err + } + + prog := ssa.NewProgram(fset, mode) + + // Create SSA packages for all imports. + // Order is not significant. + created := make(map[*types.Package]bool) + var createAll func(pkgs []*types.Package) + createAll = func(pkgs []*types.Package) { + for _, p := range pkgs { + if !created[p] { + created[p] = true + prog.CreatePackage(p, nil, nil, true) + createAll(p.Imports()) + } + } + } + createAll(pkg.Imports()) + + // Create and build the primary package. + ssapkg := prog.CreatePackage(pkg, files, info, false) + ssapkg.Build() + return ssapkg, info, nil +} diff --git a/vendor/golang.org/x/tools/go/ssa/ssautil/load14.go b/vendor/golang.org/x/tools/go/ssa/ssautil/load14.go new file mode 100644 index 0000000000..752a9d9a43 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/ssautil/load14.go @@ -0,0 +1,97 @@ +// 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.5 + +package ssautil + +// This file defines utility functions for constructing programs in SSA form. + +import ( + "go/ast" + "go/token" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types" +) + +// CreateProgram returns a new program in SSA form, given a program +// loaded from source. An SSA package is created for each transitively +// error-free package of lprog. +// +// Code for bodies of functions is not built until BuildAll() is called +// on the result. +// +// mode controls diagnostics and checking during SSA construction. +// +func CreateProgram(lprog *loader.Program, mode ssa.BuilderMode) *ssa.Program { + prog := ssa.NewProgram(lprog.Fset, mode) + + for _, info := range lprog.AllPackages { + if info.TransitivelyErrorFree { + prog.CreatePackage(info.Pkg, info.Files, &info.Info, info.Importable) + } + } + + return prog +} + +// BuildPackage builds an SSA program with IR for a single package. +// +// It populates pkg by type-checking the specified file ASTs. All +// dependencies are loaded using the importer specified by tc, which +// typically loads compiler export data; SSA code cannot be built for +// those packages. BuildPackage then constructs an ssa.Program with all +// dependency packages created, and builds and returns the SSA package +// corresponding to pkg. +// +// The caller must have set pkg.Path() to the import path. +// +// The operation fails if there were any type-checking or import errors. +// +// See ../ssa/example_test.go for an example. +// +func BuildPackage(tc *types.Config, fset *token.FileSet, pkg *types.Package, files []*ast.File, mode ssa.BuilderMode) (*ssa.Package, *types.Info, error) { + if fset == nil { + panic("no token.FileSet") + } + if pkg.Path() == "" { + panic("package has no import path") + } + + info := &types.Info{ + Types: make(map[ast.Expr]types.TypeAndValue), + Defs: make(map[*ast.Ident]types.Object), + Uses: make(map[*ast.Ident]types.Object), + Implicits: make(map[ast.Node]types.Object), + Scopes: make(map[ast.Node]*types.Scope), + Selections: make(map[*ast.SelectorExpr]*types.Selection), + } + if err := types.NewChecker(tc, fset, pkg, info).Files(files); err != nil { + return nil, nil, err + } + + prog := ssa.NewProgram(fset, mode) + + // Create SSA packages for all imports. + // Order is not significant. + created := make(map[*types.Package]bool) + var createAll func(pkgs []*types.Package) + createAll = func(pkgs []*types.Package) { + for _, p := range pkgs { + if !created[p] { + created[p] = true + prog.CreatePackage(p, nil, nil, true) + createAll(p.Imports()) + } + } + } + createAll(pkg.Imports()) + + // Create and build the primary package. + ssapkg := prog.CreatePackage(pkg, files, info, false) + ssapkg.Build() + return ssapkg, info, nil +} diff --git a/vendor/golang.org/x/tools/go/ssa/ssautil/load14_test.go b/vendor/golang.org/x/tools/go/ssa/ssautil/load14_test.go new file mode 100644 index 0000000000..41955ec508 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/ssautil/load14_test.go @@ -0,0 +1,67 @@ +// 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.5 + +package ssautil_test + +import ( + "go/ast" + "go/parser" + "go/token" + "os" + "testing" + + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/go/types" + + _ "golang.org/x/tools/go/gcimporter" +) + +const hello = `package main + +import "fmt" + +func main() { + fmt.Println("Hello, world") +} +` + +func TestBuildPackage(t *testing.T) { + // There is a more substantial test of BuildPackage and the + // SSA program it builds in ../ssa/builder_test.go. + + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, "hello.go", hello, 0) + if err != nil { + t.Fatal(err) + } + + pkg := types.NewPackage("hello", "") + ssapkg, _, err := ssautil.BuildPackage(new(types.Config), fset, pkg, []*ast.File{f}, 0) + if err != nil { + t.Fatal(err) + } + if pkg.Name() != "main" { + t.Errorf("pkg.Name() = %s, want main", pkg.Name()) + } + if ssapkg.Func("main") == nil { + ssapkg.WriteTo(os.Stderr) + t.Errorf("ssapkg has no main function") + } +} + +func TestBuildPackage_MissingImport(t *testing.T) { + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, "bad.go", `package bad; import "missing"`, 0) + if err != nil { + t.Fatal(err) + } + + pkg := types.NewPackage("bad", "") + ssapkg, _, err := ssautil.BuildPackage(new(types.Config), fset, pkg, []*ast.File{f}, 0) + if err == nil || ssapkg != nil { + t.Fatal("BuildPackage succeeded unexpectedly") + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/ssautil/load_test.go b/vendor/golang.org/x/tools/go/ssa/ssautil/load_test.go new file mode 100644 index 0000000000..8ce73bc2af --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/ssautil/load_test.go @@ -0,0 +1,66 @@ +// 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.5 + +package ssautil_test + +import ( + "go/ast" + "go/importer" + "go/parser" + "go/token" + "go/types" + "os" + "testing" + + "golang.org/x/tools/go/ssa/ssautil" +) + +const hello = `package main + +import "fmt" + +func main() { + fmt.Println("Hello, world") +} +` + +func TestBuildPackage(t *testing.T) { + // There is a more substantial test of BuildPackage and the + // SSA program it builds in ../ssa/builder_test.go. + + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, "hello.go", hello, 0) + if err != nil { + t.Fatal(err) + } + + pkg := types.NewPackage("hello", "") + ssapkg, _, err := ssautil.BuildPackage(&types.Config{Importer: importer.Default()}, fset, pkg, []*ast.File{f}, 0) + if err != nil { + t.Fatal(err) + } + if pkg.Name() != "main" { + t.Errorf("pkg.Name() = %s, want main", pkg.Name()) + } + if ssapkg.Func("main") == nil { + ssapkg.WriteTo(os.Stderr) + t.Errorf("ssapkg has no main function") + } +} + +func TestBuildPackage_MissingImport(t *testing.T) { + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, "bad.go", `package bad; import "missing"`, 0) + if err != nil { + t.Fatal(err) + } + + pkg := types.NewPackage("bad", "") + ssapkg, _, err := ssautil.BuildPackage(new(types.Config), fset, pkg, []*ast.File{f}, 0) + if err == nil || ssapkg != nil { + t.Fatal("BuildPackage succeeded unexpectedly") + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/ssautil/switch.go b/vendor/golang.org/x/tools/go/ssa/ssautil/switch.go new file mode 100644 index 0000000000..2fcc1672d4 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/ssautil/switch.go @@ -0,0 +1,236 @@ +// Copyright 2013 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.5 + +package ssautil + +// This file implements discovery of switch and type-switch constructs +// from low-level control flow. +// +// Many techniques exist for compiling a high-level switch with +// constant cases to efficient machine code. The optimal choice will +// depend on the data type, the specific case values, the code in the +// body of each case, and the hardware. +// Some examples: +// - a lookup table (for a switch that maps constants to constants) +// - a computed goto +// - a binary tree +// - a perfect hash +// - a two-level switch (to partition constant strings by their first byte). + +import ( + "bytes" + "fmt" + "go/token" + "go/types" + + "golang.org/x/tools/go/ssa" +) + +// A ConstCase represents a single constant comparison. +// It is part of a Switch. +type ConstCase struct { + Block *ssa.BasicBlock // block performing the comparison + Body *ssa.BasicBlock // body of the case + Value *ssa.Const // case comparand +} + +// A TypeCase represents a single type assertion. +// It is part of a Switch. +type TypeCase struct { + Block *ssa.BasicBlock // block performing the type assert + Body *ssa.BasicBlock // body of the case + Type types.Type // case type + Binding ssa.Value // value bound by this case +} + +// A Switch is a logical high-level control flow operation +// (a multiway branch) discovered by analysis of a CFG containing +// only if/else chains. It is not part of the ssa.Instruction set. +// +// One of ConstCases and TypeCases has length >= 2; +// the other is nil. +// +// In a value switch, the list of cases may contain duplicate constants. +// A type switch may contain duplicate types, or types assignable +// to an interface type also in the list. +// TODO(adonovan): eliminate such duplicates. +// +type Switch struct { + Start *ssa.BasicBlock // block containing start of if/else chain + X ssa.Value // the switch operand + ConstCases []ConstCase // ordered list of constant comparisons + TypeCases []TypeCase // ordered list of type assertions + Default *ssa.BasicBlock // successor if all comparisons fail +} + +func (sw *Switch) String() string { + // We represent each block by the String() of its + // first Instruction, e.g. "print(42:int)". + var buf bytes.Buffer + if sw.ConstCases != nil { + fmt.Fprintf(&buf, "switch %s {\n", sw.X.Name()) + for _, c := range sw.ConstCases { + fmt.Fprintf(&buf, "case %s: %s\n", c.Value, c.Body.Instrs[0]) + } + } else { + fmt.Fprintf(&buf, "switch %s.(type) {\n", sw.X.Name()) + for _, c := range sw.TypeCases { + fmt.Fprintf(&buf, "case %s %s: %s\n", + c.Binding.Name(), c.Type, c.Body.Instrs[0]) + } + } + if sw.Default != nil { + fmt.Fprintf(&buf, "default: %s\n", sw.Default.Instrs[0]) + } + fmt.Fprintf(&buf, "}") + return buf.String() +} + +// Switches examines the control-flow graph of fn and returns the +// set of inferred value and type switches. A value switch tests an +// ssa.Value for equality against two or more compile-time constant +// values. Switches involving link-time constants (addresses) are +// ignored. A type switch type-asserts an ssa.Value against two or +// more types. +// +// The switches are returned in dominance order. +// +// The resulting switches do not necessarily correspond to uses of the +// 'switch' keyword in the source: for example, a single source-level +// switch statement with non-constant cases may result in zero, one or +// many Switches, one per plural sequence of constant cases. +// Switches may even be inferred from if/else- or goto-based control flow. +// (In general, the control flow constructs of the source program +// cannot be faithfully reproduced from the SSA representation.) +// +func Switches(fn *ssa.Function) []Switch { + // Traverse the CFG in dominance order, so we don't + // enter an if/else-chain in the middle. + var switches []Switch + seen := make(map[*ssa.BasicBlock]bool) // TODO(adonovan): opt: use ssa.blockSet + for _, b := range fn.DomPreorder() { + if x, k := isComparisonBlock(b); x != nil { + // Block b starts a switch. + sw := Switch{Start: b, X: x} + valueSwitch(&sw, k, seen) + if len(sw.ConstCases) > 1 { + switches = append(switches, sw) + } + } + + if y, x, T := isTypeAssertBlock(b); y != nil { + // Block b starts a type switch. + sw := Switch{Start: b, X: x} + typeSwitch(&sw, y, T, seen) + if len(sw.TypeCases) > 1 { + switches = append(switches, sw) + } + } + } + return switches +} + +func valueSwitch(sw *Switch, k *ssa.Const, seen map[*ssa.BasicBlock]bool) { + b := sw.Start + x := sw.X + for x == sw.X { + if seen[b] { + break + } + seen[b] = true + + sw.ConstCases = append(sw.ConstCases, ConstCase{ + Block: b, + Body: b.Succs[0], + Value: k, + }) + b = b.Succs[1] + if len(b.Instrs) > 2 { + // Block b contains not just 'if x == k', + // so it may have side effects that + // make it unsafe to elide. + break + } + if len(b.Preds) != 1 { + // Block b has multiple predecessors, + // so it cannot be treated as a case. + break + } + x, k = isComparisonBlock(b) + } + sw.Default = b +} + +func typeSwitch(sw *Switch, y ssa.Value, T types.Type, seen map[*ssa.BasicBlock]bool) { + b := sw.Start + x := sw.X + for x == sw.X { + if seen[b] { + break + } + seen[b] = true + + sw.TypeCases = append(sw.TypeCases, TypeCase{ + Block: b, + Body: b.Succs[0], + Type: T, + Binding: y, + }) + b = b.Succs[1] + if len(b.Instrs) > 4 { + // Block b contains not just + // {TypeAssert; Extract #0; Extract #1; If} + // so it may have side effects that + // make it unsafe to elide. + break + } + if len(b.Preds) != 1 { + // Block b has multiple predecessors, + // so it cannot be treated as a case. + break + } + y, x, T = isTypeAssertBlock(b) + } + sw.Default = b +} + +// isComparisonBlock returns the operands (v, k) if a block ends with +// a comparison v==k, where k is a compile-time constant. +// +func isComparisonBlock(b *ssa.BasicBlock) (v ssa.Value, k *ssa.Const) { + if n := len(b.Instrs); n >= 2 { + if i, ok := b.Instrs[n-1].(*ssa.If); ok { + if binop, ok := i.Cond.(*ssa.BinOp); ok && binop.Block() == b && binop.Op == token.EQL { + if k, ok := binop.Y.(*ssa.Const); ok { + return binop.X, k + } + if k, ok := binop.X.(*ssa.Const); ok { + return binop.Y, k + } + } + } + } + return +} + +// isTypeAssertBlock returns the operands (y, x, T) if a block ends with +// a type assertion "if y, ok := x.(T); ok {". +// +func isTypeAssertBlock(b *ssa.BasicBlock) (y, x ssa.Value, T types.Type) { + if n := len(b.Instrs); n >= 4 { + if i, ok := b.Instrs[n-1].(*ssa.If); ok { + if ext1, ok := i.Cond.(*ssa.Extract); ok && ext1.Block() == b && ext1.Index == 1 { + if ta, ok := ext1.Tuple.(*ssa.TypeAssert); ok && ta.Block() == b { + // hack: relies upon instruction ordering. + if ext0, ok := b.Instrs[n-3].(*ssa.Extract); ok { + return ext0, ta.X, ta.AssertedType + } + } + } + } + } + return +} diff --git a/vendor/golang.org/x/tools/go/ssa/ssautil/switch14.go b/vendor/golang.org/x/tools/go/ssa/ssautil/switch14.go new file mode 100644 index 0000000000..b2f7f21e92 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/ssautil/switch14.go @@ -0,0 +1,236 @@ +// Copyright 2013 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.5 + +package ssautil + +// This file implements discovery of switch and type-switch constructs +// from low-level control flow. +// +// Many techniques exist for compiling a high-level switch with +// constant cases to efficient machine code. The optimal choice will +// depend on the data type, the specific case values, the code in the +// body of each case, and the hardware. +// Some examples: +// - a lookup table (for a switch that maps constants to constants) +// - a computed goto +// - a binary tree +// - a perfect hash +// - a two-level switch (to partition constant strings by their first byte). + +import ( + "bytes" + "fmt" + "go/token" + + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types" +) + +// A ConstCase represents a single constant comparison. +// It is part of a Switch. +type ConstCase struct { + Block *ssa.BasicBlock // block performing the comparison + Body *ssa.BasicBlock // body of the case + Value *ssa.Const // case comparand +} + +// A TypeCase represents a single type assertion. +// It is part of a Switch. +type TypeCase struct { + Block *ssa.BasicBlock // block performing the type assert + Body *ssa.BasicBlock // body of the case + Type types.Type // case type + Binding ssa.Value // value bound by this case +} + +// A Switch is a logical high-level control flow operation +// (a multiway branch) discovered by analysis of a CFG containing +// only if/else chains. It is not part of the ssa.Instruction set. +// +// One of ConstCases and TypeCases has length >= 2; +// the other is nil. +// +// In a value switch, the list of cases may contain duplicate constants. +// A type switch may contain duplicate types, or types assignable +// to an interface type also in the list. +// TODO(adonovan): eliminate such duplicates. +// +type Switch struct { + Start *ssa.BasicBlock // block containing start of if/else chain + X ssa.Value // the switch operand + ConstCases []ConstCase // ordered list of constant comparisons + TypeCases []TypeCase // ordered list of type assertions + Default *ssa.BasicBlock // successor if all comparisons fail +} + +func (sw *Switch) String() string { + // We represent each block by the String() of its + // first Instruction, e.g. "print(42:int)". + var buf bytes.Buffer + if sw.ConstCases != nil { + fmt.Fprintf(&buf, "switch %s {\n", sw.X.Name()) + for _, c := range sw.ConstCases { + fmt.Fprintf(&buf, "case %s: %s\n", c.Value, c.Body.Instrs[0]) + } + } else { + fmt.Fprintf(&buf, "switch %s.(type) {\n", sw.X.Name()) + for _, c := range sw.TypeCases { + fmt.Fprintf(&buf, "case %s %s: %s\n", + c.Binding.Name(), c.Type, c.Body.Instrs[0]) + } + } + if sw.Default != nil { + fmt.Fprintf(&buf, "default: %s\n", sw.Default.Instrs[0]) + } + fmt.Fprintf(&buf, "}") + return buf.String() +} + +// Switches examines the control-flow graph of fn and returns the +// set of inferred value and type switches. A value switch tests an +// ssa.Value for equality against two or more compile-time constant +// values. Switches involving link-time constants (addresses) are +// ignored. A type switch type-asserts an ssa.Value against two or +// more types. +// +// The switches are returned in dominance order. +// +// The resulting switches do not necessarily correspond to uses of the +// 'switch' keyword in the source: for example, a single source-level +// switch statement with non-constant cases may result in zero, one or +// many Switches, one per plural sequence of constant cases. +// Switches may even be inferred from if/else- or goto-based control flow. +// (In general, the control flow constructs of the source program +// cannot be faithfully reproduced from the SSA representation.) +// +func Switches(fn *ssa.Function) []Switch { + // Traverse the CFG in dominance order, so we don't + // enter an if/else-chain in the middle. + var switches []Switch + seen := make(map[*ssa.BasicBlock]bool) // TODO(adonovan): opt: use ssa.blockSet + for _, b := range fn.DomPreorder() { + if x, k := isComparisonBlock(b); x != nil { + // Block b starts a switch. + sw := Switch{Start: b, X: x} + valueSwitch(&sw, k, seen) + if len(sw.ConstCases) > 1 { + switches = append(switches, sw) + } + } + + if y, x, T := isTypeAssertBlock(b); y != nil { + // Block b starts a type switch. + sw := Switch{Start: b, X: x} + typeSwitch(&sw, y, T, seen) + if len(sw.TypeCases) > 1 { + switches = append(switches, sw) + } + } + } + return switches +} + +func valueSwitch(sw *Switch, k *ssa.Const, seen map[*ssa.BasicBlock]bool) { + b := sw.Start + x := sw.X + for x == sw.X { + if seen[b] { + break + } + seen[b] = true + + sw.ConstCases = append(sw.ConstCases, ConstCase{ + Block: b, + Body: b.Succs[0], + Value: k, + }) + b = b.Succs[1] + if len(b.Instrs) > 2 { + // Block b contains not just 'if x == k', + // so it may have side effects that + // make it unsafe to elide. + break + } + if len(b.Preds) != 1 { + // Block b has multiple predecessors, + // so it cannot be treated as a case. + break + } + x, k = isComparisonBlock(b) + } + sw.Default = b +} + +func typeSwitch(sw *Switch, y ssa.Value, T types.Type, seen map[*ssa.BasicBlock]bool) { + b := sw.Start + x := sw.X + for x == sw.X { + if seen[b] { + break + } + seen[b] = true + + sw.TypeCases = append(sw.TypeCases, TypeCase{ + Block: b, + Body: b.Succs[0], + Type: T, + Binding: y, + }) + b = b.Succs[1] + if len(b.Instrs) > 4 { + // Block b contains not just + // {TypeAssert; Extract #0; Extract #1; If} + // so it may have side effects that + // make it unsafe to elide. + break + } + if len(b.Preds) != 1 { + // Block b has multiple predecessors, + // so it cannot be treated as a case. + break + } + y, x, T = isTypeAssertBlock(b) + } + sw.Default = b +} + +// isComparisonBlock returns the operands (v, k) if a block ends with +// a comparison v==k, where k is a compile-time constant. +// +func isComparisonBlock(b *ssa.BasicBlock) (v ssa.Value, k *ssa.Const) { + if n := len(b.Instrs); n >= 2 { + if i, ok := b.Instrs[n-1].(*ssa.If); ok { + if binop, ok := i.Cond.(*ssa.BinOp); ok && binop.Block() == b && binop.Op == token.EQL { + if k, ok := binop.Y.(*ssa.Const); ok { + return binop.X, k + } + if k, ok := binop.X.(*ssa.Const); ok { + return binop.Y, k + } + } + } + } + return +} + +// isTypeAssertBlock returns the operands (y, x, T) if a block ends with +// a type assertion "if y, ok := x.(T); ok {". +// +func isTypeAssertBlock(b *ssa.BasicBlock) (y, x ssa.Value, T types.Type) { + if n := len(b.Instrs); n >= 4 { + if i, ok := b.Instrs[n-1].(*ssa.If); ok { + if ext1, ok := i.Cond.(*ssa.Extract); ok && ext1.Block() == b && ext1.Index == 1 { + if ta, ok := ext1.Tuple.(*ssa.TypeAssert); ok && ta.Block() == b { + // hack: relies upon instruction ordering. + if ext0, ok := b.Instrs[n-3].(*ssa.Extract); ok { + return ext0, ta.X, ta.AssertedType + } + } + } + } + } + return +} diff --git a/vendor/golang.org/x/tools/go/ssa/ssautil/switch_test.go b/vendor/golang.org/x/tools/go/ssa/ssautil/switch_test.go new file mode 100644 index 0000000000..a47dbeff7f --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/ssautil/switch_test.go @@ -0,0 +1,74 @@ +// Copyright 2013 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. + +// No testdata on Android. + +// +build !android + +package ssautil_test + +import ( + "go/parser" + "strings" + "testing" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +func TestSwitches(t *testing.T) { + conf := loader.Config{ParserMode: parser.ParseComments} + f, err := conf.ParseFile("testdata/switches.go", nil) + if err != nil { + t.Error(err) + return + } + + conf.CreateFromFiles("main", f) + iprog, err := conf.Load() + if err != nil { + t.Error(err) + return + } + + prog := ssautil.CreateProgram(iprog, 0) + mainPkg := prog.Package(iprog.Created[0].Pkg) + mainPkg.Build() + + for _, mem := range mainPkg.Members { + if fn, ok := mem.(*ssa.Function); ok { + if fn.Synthetic != "" { + continue // e.g. init() + } + // Each (multi-line) "switch" comment within + // this function must match the printed form + // of a ConstSwitch. + var wantSwitches []string + for _, c := range f.Comments { + if fn.Syntax().Pos() <= c.Pos() && c.Pos() < fn.Syntax().End() { + text := strings.TrimSpace(c.Text()) + if strings.HasPrefix(text, "switch ") { + wantSwitches = append(wantSwitches, text) + } + } + } + + switches := ssautil.Switches(fn) + if len(switches) != len(wantSwitches) { + t.Errorf("in %s, found %d switches, want %d", fn, len(switches), len(wantSwitches)) + } + for i, sw := range switches { + got := sw.String() + if i >= len(wantSwitches) { + continue + } + want := wantSwitches[i] + if got != want { + t.Errorf("in %s, found switch %d: got <<%s>>, want <<%s>>", fn, i, got, want) + } + } + } + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/ssautil/testdata/switches.go b/vendor/golang.org/x/tools/go/ssa/ssautil/testdata/switches.go new file mode 100644 index 0000000000..8ab4c118f1 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/ssautil/testdata/switches.go @@ -0,0 +1,357 @@ +// +build ignore + +package main + +// This file is the input to TestSwitches in switch_test.go. +// Each multiway conditional with constant or type cases (Switch) +// discovered by Switches is printed, and compared with the +// comments. +// +// The body of each case is printed as the value of its first +// instruction. + +// -------- Value switches -------- + +func SimpleSwitch(x, y int) { + // switch x { + // case 1:int: print(1:int) + // case 2:int: print(23:int) + // case 3:int: print(23:int) + // case 4:int: print(3:int) + // default: x == y + // } + switch x { + case 1: + print(1) + case 2, 3: + print(23) + fallthrough + case 4: + print(3) + default: + print(4) + case y: + print(5) + } + print(6) +} + +func four() int { return 4 } + +// A non-constant case makes a switch "impure", but its pure +// cases form two separate switches. +func SwitchWithNonConstantCase(x int) { + // switch x { + // case 1:int: print(1:int) + // case 2:int: print(23:int) + // case 3:int: print(23:int) + // default: four() + // } + + // switch x { + // case 5:int: print(5:int) + // case 6:int: print(6:int) + // default: print("done":string) + // } + switch x { + case 1: + print(1) + case 2, 3: + print(23) + case four(): + print(3) + case 5: + print(5) + case 6: + print(6) + } + print("done") +} + +// Switches may be found even where the source +// program doesn't have a switch statement. + +func ImplicitSwitches(x, y int) { + // switch x { + // case 1:int: print(12:int) + // case 2:int: print(12:int) + // default: x < 5:int + // } + if x == 1 || 2 == x || x < 5 { + print(12) + } + + // switch x { + // case 3:int: print(34:int) + // case 4:int: print(34:int) + // default: x == y + // } + if x == 3 || 4 == x || x == y { + print(34) + } + + // Not a switch: no consistent variable. + if x == 5 || y == 6 { + print(56) + } + + // Not a switch: only one constant comparison. + if x == 7 || x == y { + print(78) + } +} + +func IfElseBasedSwitch(x int) { + // switch x { + // case 1:int: print(1:int) + // case 2:int: print(2:int) + // default: print("else":string) + // } + if x == 1 { + print(1) + } else if x == 2 { + print(2) + } else { + print("else") + } +} + +func GotoBasedSwitch(x int) { + // switch x { + // case 1:int: print(1:int) + // case 2:int: print(2:int) + // default: print("else":string) + // } + if x == 1 { + goto L1 + } + if x == 2 { + goto L2 + } + print("else") +L1: + print(1) + goto end +L2: + print(2) +end: +} + +func SwitchInAForLoop(x int) { + // switch x { + // case 1:int: print(1:int) + // case 2:int: print(2:int) + // default: print("head":string) + // } +loop: + for { + print("head") + switch x { + case 1: + print(1) + break loop + case 2: + print(2) + break loop + } + } +} + +// This case is a switch in a for-loop, both constructed using goto. +// As before, the default case points back to the block containing the +// switch, but that's ok. +func SwitchInAForLoopUsingGoto(x int) { + // switch x { + // case 1:int: print(1:int) + // case 2:int: print(2:int) + // default: print("head":string) + // } +loop: + print("head") + if x == 1 { + goto L1 + } + if x == 2 { + goto L2 + } + goto loop +L1: + print(1) + goto end +L2: + print(2) +end: +} + +func UnstructuredSwitchInAForLoop(x int) { + // switch x { + // case 1:int: print(1:int) + // case 2:int: x == 1:int + // default: print("end":string) + // } + for { + if x == 1 { + print(1) + return + } + if x == 2 { + continue + } + break + } + print("end") +} + +func CaseWithMultiplePreds(x int) { + for { + if x == 1 { + print(1) + return + } + loop: + // This block has multiple predecessors, + // so can't be treated as a switch case. + if x == 2 { + goto loop + } + break + } + print("end") +} + +func DuplicateConstantsAreNotEliminated(x int) { + // switch x { + // case 1:int: print(1:int) + // case 1:int: print("1a":string) + // case 2:int: print(2:int) + // default: return + // } + if x == 1 { + print(1) + } else if x == 1 { // duplicate => unreachable + print("1a") + } else if x == 2 { + print(2) + } +} + +// Interface values (created by comparisons) are not constants, +// so ConstSwitch.X is never of interface type. +func MakeInterfaceIsNotAConstant(x interface{}) { + if x == "foo" { + print("foo") + } else if x == 1 { + print(1) + } +} + +func ZeroInitializedVarsAreConstants(x int) { + // switch x { + // case 0:int: print(1:int) + // case 2:int: print(2:int) + // default: print("end":string) + // } + var zero int // SSA construction replaces zero with 0 + if x == zero { + print(1) + } else if x == 2 { + print(2) + } + print("end") +} + +// -------- Select -------- + +// NB, potentially fragile reliance on register number. +func SelectDesugarsToSwitch(ch chan int) { + // switch t1 { + // case 0:int: extract t0 #2 + // case 1:int: println(0:int) + // case 2:int: println(1:int) + // default: println("default":string) + // } + select { + case x := <-ch: + println(x) + case <-ch: + println(0) + case ch <- 1: + println(1) + default: + println("default") + } +} + +// NB, potentially fragile reliance on register number. +func NonblockingSelectDefaultCasePanics(ch chan int) { + // switch t1 { + // case 0:int: extract t0 #2 + // case 1:int: println(0:int) + // case 2:int: println(1:int) + // default: make interface{} <- string ("blocking select m...":string) + // } + select { + case x := <-ch: + println(x) + case <-ch: + println(0) + case ch <- 1: + println(1) + } +} + +// -------- Type switches -------- + +// NB, reliance on fragile register numbering. +func SimpleTypeSwitch(x interface{}) { + // switch x.(type) { + // case t3 int: println(x) + // case t7 bool: println(x) + // case t10 string: println(t10) + // default: println(x) + // } + switch y := x.(type) { + case nil: + println(y) + case int, bool: + println(y) + case string: + println(y) + default: + println(y) + } +} + +// NB, potentially fragile reliance on register number. +func DuplicateTypesAreNotEliminated(x interface{}) { + // switch x.(type) { + // case t1 string: println(1:int) + // case t5 interface{}: println(t5) + // case t9 int: println(3:int) + // default: return + // } + switch y := x.(type) { + case string: + println(1) + case interface{}: + println(y) + case int: + println(3) // unreachable! + } +} + +// NB, potentially fragile reliance on register number. +func AdHocTypeSwitch(x interface{}) { + // switch x.(type) { + // case t1 int: println(t1) + // case t5 string: println(t5) + // default: print("default":string) + // } + if i, ok := x.(int); ok { + println(i) + } else if s, ok := x.(string); ok { + println(s) + } else { + print("default") + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/ssautil/visit.go b/vendor/golang.org/x/tools/go/ssa/ssautil/visit.go new file mode 100644 index 0000000000..6c51f93032 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/ssautil/visit.go @@ -0,0 +1,66 @@ +// Copyright 2013 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 ssautil // import "golang.org/x/tools/go/ssa/ssautil" + +import "golang.org/x/tools/go/ssa" + +// This file defines utilities for visiting the SSA representation of +// a Program. +// +// TODO(adonovan): test coverage. + +// AllFunctions finds and returns the set of functions potentially +// needed by program prog, as determined by a simple linker-style +// reachability algorithm starting from the members and method-sets of +// each package. The result may include anonymous functions and +// synthetic wrappers. +// +// Precondition: all packages are built. +// +func AllFunctions(prog *ssa.Program) map[*ssa.Function]bool { + visit := visitor{ + prog: prog, + seen: make(map[*ssa.Function]bool), + } + visit.program() + return visit.seen +} + +type visitor struct { + prog *ssa.Program + seen map[*ssa.Function]bool +} + +func (visit *visitor) program() { + for _, pkg := range visit.prog.AllPackages() { + for _, mem := range pkg.Members { + if fn, ok := mem.(*ssa.Function); ok { + visit.function(fn) + } + } + } + for _, T := range visit.prog.RuntimeTypes() { + mset := visit.prog.MethodSets.MethodSet(T) + for i, n := 0, mset.Len(); i < n; i++ { + visit.function(visit.prog.MethodValue(mset.At(i))) + } + } +} + +func (visit *visitor) function(fn *ssa.Function) { + if !visit.seen[fn] { + visit.seen[fn] = true + var buf [10]*ssa.Value // avoid alloc in common case + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + for _, op := range instr.Operands(buf[:0]) { + if fn, ok := (*op).(*ssa.Function); ok { + visit.function(fn) + } + } + } + } + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/stdlib_test.go b/vendor/golang.org/x/tools/go/ssa/stdlib_test.go new file mode 100644 index 0000000000..99c615d45e --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/stdlib_test.go @@ -0,0 +1,151 @@ +// Copyright 2013 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. + +// Incomplete source tree on Android. + +// +build !android + +package ssa_test + +// This file runs the SSA builder in sanity-checking mode on all +// packages beneath $GOROOT and prints some summary information. +// +// Run with "go test -cpu=8 to" set GOMAXPROCS. + +import ( + "go/ast" + "go/build" + "go/token" + "runtime" + "testing" + "time" + + "golang.org/x/tools/go/buildutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +// Skip the set of packages that transitively depend on +// cmd/internal/objfile, which uses vendoring, +// which go/loader does not yet support. +// TODO(adonovan): add support for vendoring and delete this. +var skip = map[string]bool{ + "cmd/addr2line": true, + "cmd/internal/objfile": true, + "cmd/nm": true, + "cmd/objdump": true, + "cmd/pprof": true, +} + +func bytesAllocated() uint64 { + runtime.GC() + var stats runtime.MemStats + runtime.ReadMemStats(&stats) + return stats.Alloc +} + +func TestStdlib(t *testing.T) { + if testing.Short() { + t.Skip("skipping in short mode; too slow (golang.org/issue/14113)") + } + // Load, parse and type-check the program. + t0 := time.Now() + alloc0 := bytesAllocated() + + // Load, parse and type-check the program. + ctxt := build.Default // copy + ctxt.GOPATH = "" // disable GOPATH + conf := loader.Config{Build: &ctxt} + for _, path := range buildutil.AllPackages(conf.Build) { + if skip[path] { + continue + } + conf.ImportWithTests(path) + } + + iprog, err := conf.Load() + if err != nil { + t.Fatalf("Load failed: %v", err) + } + + t1 := time.Now() + alloc1 := bytesAllocated() + + // Create SSA packages. + var mode ssa.BuilderMode + // Comment out these lines during benchmarking. Approx SSA build costs are noted. + mode |= ssa.SanityCheckFunctions // + 2% space, + 4% time + mode |= ssa.GlobalDebug // +30% space, +18% time + prog := ssautil.CreateProgram(iprog, mode) + + t2 := time.Now() + + // Build SSA. + prog.Build() + + t3 := time.Now() + alloc3 := bytesAllocated() + + numPkgs := len(prog.AllPackages()) + if want := 140; numPkgs < want { + t.Errorf("Loaded only %d packages, want at least %d", numPkgs, want) + } + + // Keep iprog reachable until after we've measured memory usage. + if len(iprog.AllPackages) == 0 { + print() // unreachable + } + + allFuncs := ssautil.AllFunctions(prog) + + // Check that all non-synthetic functions have distinct names. + // Synthetic wrappers for exported methods should be distinct too, + // except for unexported ones (explained at (*Function).RelString). + byName := make(map[string]*ssa.Function) + for fn := range allFuncs { + if fn.Synthetic == "" || ast.IsExported(fn.Name()) { + str := fn.String() + prev := byName[str] + byName[str] = fn + if prev != nil { + t.Errorf("%s: duplicate function named %s", + prog.Fset.Position(fn.Pos()), str) + t.Errorf("%s: (previously defined here)", + prog.Fset.Position(prev.Pos())) + } + } + } + + // Dump some statistics. + var numInstrs int + for fn := range allFuncs { + for _, b := range fn.Blocks { + numInstrs += len(b.Instrs) + } + } + + // determine line count + var lineCount int + prog.Fset.Iterate(func(f *token.File) bool { + lineCount += f.LineCount() + return true + }) + + // NB: when benchmarking, don't forget to clear the debug + + // sanity builder flags for better performance. + + t.Log("GOMAXPROCS: ", runtime.GOMAXPROCS(0)) + t.Log("#Source lines: ", lineCount) + t.Log("Load/parse/typecheck: ", t1.Sub(t0)) + t.Log("SSA create: ", t2.Sub(t1)) + t.Log("SSA build: ", t3.Sub(t2)) + + // SSA stats: + t.Log("#Packages: ", numPkgs) + t.Log("#Functions: ", len(allFuncs)) + t.Log("#Instructions: ", numInstrs) + t.Log("#MB AST+types: ", int64(alloc1-alloc0)/1e6) + t.Log("#MB SSA: ", int64(alloc3-alloc1)/1e6) +} diff --git a/vendor/golang.org/x/tools/go/ssa/testdata/objlookup.go b/vendor/golang.org/x/tools/go/ssa/testdata/objlookup.go new file mode 100644 index 0000000000..1aaa417e80 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/testdata/objlookup.go @@ -0,0 +1,160 @@ +//+build ignore + +package main + +// This file is the input to TestObjValueLookup in source_test.go, +// which ensures that each occurrence of an ident defining or +// referring to a func, var or const object can be mapped to its +// corresponding SSA Value. +// +// For every reference to a var object, we use annotations in comments +// to denote both the expected SSA Value kind, and whether to expect +// its value (x) or its address (&x). +// +// For const and func objects, the results don't vary by reference and +// are always values not addresses, so no annotations are needed. The +// declaration is enough. + +import "fmt" +import "os" + +type J int + +func (*J) method() {} + +const globalConst = 0 + +var globalVar int // &globalVar::Global + +func globalFunc() {} + +type I interface { + interfaceMethod() +} + +type S struct { + x int // x::nil +} + +func main() { + print(globalVar) // globalVar::UnOp + globalVar = 1 // globalVar::Const + + var v0 int = 1 // v0::Const (simple local value spec) + if v0 > 0 { // v0::Const + v0 = 2 // v0::Const + } + print(v0) // v0::Phi + + // v1 is captured and thus implicitly address-taken. + var v1 int = 1 // v1::Const + v1 = 2 // v1::Const + fmt.Println(v1) // v1::UnOp (load) + f := func(param int) { // f::MakeClosure param::Parameter + if y := 1; y > 0 { // y::Const + print(v1, param) // v1::UnOp (load) param::Parameter + } + param = 2 // param::Const + println(param) // param::Const + } + + f(0) // f::MakeClosure + + var v2 int // v2::Const (implicitly zero-initialized local value spec) + print(v2) // v2::Const + + m := make(map[string]int) // m::MakeMap + + // Local value spec with multi-valued RHS: + var v3, v4 = m[""] // v3::Extract v4::Extract m::MakeMap + print(v3) // v3::Extract + print(v4) // v4::Extract + + v3++ // v3::BinOp (assign with op) + v3 += 2 // v3::BinOp (assign with op) + + v5, v6 := false, "" // v5::Const v6::Const (defining assignment) + print(v5) // v5::Const + print(v6) // v6::Const + + var v7 S // &v7::Alloc + v7.x = 1 // &v7::Alloc &x::FieldAddr + print(v7.x) // &v7::Alloc &x::FieldAddr + + var v8 [1]int // &v8::Alloc + v8[0] = 0 // &v8::Alloc + print(v8[:]) // &v8::Alloc + _ = v8[0] // &v8::Alloc + _ = v8[:][0] // &v8::Alloc + v8ptr := &v8 // v8ptr::Alloc &v8::Alloc + _ = v8ptr[0] // v8ptr::Alloc + _ = *v8ptr // v8ptr::Alloc + + v8a := make([]int, 1) // v8a::Slice + v8a[0] = 0 // v8a::Slice + print(v8a[:]) // v8a::Slice + + v9 := S{} // &v9::Alloc + + v10 := &v9 // v10::Alloc &v9::Alloc + _ = v10 // v10::Alloc + + var v11 *J = nil // v11::Const + v11.method() // v11::Const + + var v12 J // &v12::Alloc + v12.method() // &v12::Alloc (implicitly address-taken) + + // NB, in the following, 'method' resolves to the *types.Func + // of (*J).method, so it doesn't help us locate the specific + // ssa.Values here: a bound-method closure and a promotion + // wrapper. + _ = v11.method // v11::Const + _ = (*struct{ J }).method // J::nil + + // These vars are not optimised away. + if false { + v13 := 0 // v13::Const + println(v13) // v13::Const + } + + switch x := 1; x { // x::Const + case v0: // v0::Phi + } + + for k, v := range m { // k::Extract v::Extract m::MakeMap + _ = k // k::Extract + v++ // v::BinOp + } + + if y := 0; y > 1 { // y::Const y::Const + } + + var i interface{} // i::Const (nil interface) + i = 1 // i::MakeInterface + switch i := i.(type) { // i::MakeInterface i::MakeInterface + case int: + println(i) // i::Extract + } + + ch := make(chan int) // ch::MakeChan + select { + case x := <-ch: // x::UnOp (receive) ch::MakeChan + _ = x // x::UnOp + } + + // .Op is an inter-package FieldVal-selection. + var err os.PathError // &err::Alloc + _ = err.Op // &err::Alloc &Op::FieldAddr + _ = &err.Op // &err::Alloc &Op::FieldAddr + + // Exercise corner-cases of lvalues vs rvalues. + // (Guessing IsAddr from the 'pointerness' won't cut it here.) + type N *N + var n N // n::Const + n1 := n // n1::Const n::Const + n2 := &n1 // n2::Alloc &n1::Alloc + n3 := *n2 // n3::UnOp n2::Alloc + n4 := **n3 // n4::UnOp n3::UnOp + _ = n4 // n4::UnOp +} diff --git a/vendor/golang.org/x/tools/go/ssa/testdata/valueforexpr.go b/vendor/golang.org/x/tools/go/ssa/testdata/valueforexpr.go new file mode 100644 index 0000000000..4a2cb85a38 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/testdata/valueforexpr.go @@ -0,0 +1,152 @@ +//+build ignore + +package main + +// This file is the input to TestValueForExpr in source_test.go, which +// ensures that each expression e immediately following a /*@kind*/(x) +// annotation, when passed to Function.ValueForExpr(e), returns a +// non-nil Value of the same type as e and of kind 'kind'. + +func f(spilled, unspilled int) { + _ = /*@UnOp*/ (spilled) + _ = /*@Parameter*/ (unspilled) + _ = /*@*/ (1 + 2) // (constant) + i := 0 + + f := func() (int, int) { return 0, 0 } + + /*@Call*/ (print( /*@BinOp*/ (i + 1))) + _, _ = /*@Call*/ (f()) + ch := /*@MakeChan*/ (make(chan int)) + /*@UnOp*/ (<-ch) + x := /*@UnOp*/ (<-ch) + _ = x + select { + case /*@Extract*/ (<-ch): + case x := /*@Extract*/ (<-ch): + _ = x + } + defer /*@Function*/ (func() { + })() + go /*@Function*/ (func() { + })() + y := 0 + if true && /*@BinOp*/ (bool(y > 0)) { + y = 1 + } + _ = /*@Phi*/ (y) + map1 := /*@MakeMap*/ (make(map[string]string)) + _ = map1 + _ = /*@Slice*/ (make([]int, 0)) + _ = /*@MakeClosure*/ (func() { print(spilled) }) + + sl := []int{} + _ = /*@Slice*/ (sl[:0]) + + _ = /*@*/ (new(int)) // optimized away + tmp := /*@Alloc*/ (new(int)) + _ = tmp + var iface interface{} + _ = /*@TypeAssert*/ (iface.(int)) + _ = /*@UnOp*/ (sl[0]) + _ = /*@IndexAddr*/ (&sl[0]) + _ = /*@Index*/ ([2]int{}[0]) + var p *int + _ = /*@UnOp*/ (*p) + + _ = /*@UnOp*/ (global) + /*@UnOp*/ (global)[""] = "" + /*@Global*/ (global) = map[string]string{} + + var local t + /*UnOp*/ (local.x) = 1 + + // Exercise corner-cases of lvalues vs rvalues. + type N *N + var n N + /*@UnOp*/ (n) = /*@UnOp*/ (n) + /*@ChangeType*/ (n) = /*@Alloc*/ (&n) + /*@UnOp*/ (n) = /*@UnOp*/ (*n) + /*@UnOp*/ (n) = /*@UnOp*/ (**n) +} + +func complit() { + // Composite literals. + // We get different results for + // - composite literal as value (e.g. operand to print) + // - composite literal initializer for addressable value + // - composite literal value assigned to blank var + + // 1. Slices + print( /*@Slice*/ ([]int{})) + print( /*@Alloc*/ (&[]int{})) + print(& /*@Slice*/ ([]int{})) + + sl1 := /*@Slice*/ ([]int{}) + sl2 := /*@Alloc*/ (&[]int{}) + sl3 := & /*@Slice*/ ([]int{}) + _, _, _ = sl1, sl2, sl3 + + _ = /*@Slice*/ ([]int{}) + _ = /*@*/ (& /*@Slice*/ ([]int{})) // & optimized away + _ = & /*@Slice*/ ([]int{}) + + // 2. Arrays + print( /*@UnOp*/ ([1]int{})) + print( /*@Alloc*/ (&[1]int{})) + print(& /*@Alloc*/ ([1]int{})) + + arr1 := /*@Alloc*/ ([1]int{}) + arr2 := /*@Alloc*/ (&[1]int{}) + arr3 := & /*@Alloc*/ ([1]int{}) + _, _, _ = arr1, arr2, arr3 + + _ = /*@UnOp*/ ([1]int{}) + _ = /*@Alloc*/ (& /*@Alloc*/ ([1]int{})) + _ = & /*@Alloc*/ ([1]int{}) + + // 3. Maps + type M map[int]int + print( /*@MakeMap*/ (M{})) + print( /*@Alloc*/ (&M{})) + print(& /*@MakeMap*/ (M{})) + + m1 := /*@MakeMap*/ (M{}) + m2 := /*@Alloc*/ (&M{}) + m3 := & /*@MakeMap*/ (M{}) + _, _, _ = m1, m2, m3 + + _ = /*@MakeMap*/ (M{}) + _ = /*@*/ (& /*@MakeMap*/ (M{})) // & optimized away + _ = & /*@MakeMap*/ (M{}) + + // 4. Structs + print( /*@UnOp*/ (struct{}{})) + print( /*@Alloc*/ (&struct{}{})) + print(& /*@Alloc*/ (struct{}{})) + + s1 := /*@Alloc*/ (struct{}{}) + s2 := /*@Alloc*/ (&struct{}{}) + s3 := & /*@Alloc*/ (struct{}{}) + _, _, _ = s1, s2, s3 + + _ = /*@UnOp*/ (struct{}{}) + _ = /*@Alloc*/ (& /*@Alloc*/ (struct{}{})) + _ = & /*@Alloc*/ (struct{}{}) +} + +type t struct{ x int } + +// Ensure we can locate methods of named types. +func (t) f(param int) { + _ = /*@Parameter*/ (param) +} + +// Ensure we can locate init functions. +func init() { + m := /*@MakeMap*/ (make(map[string]string)) + _ = m +} + +// Ensure we can locate variables in initializer expressions. +var global = /*@MakeMap*/ (make(map[string]string)) diff --git a/vendor/golang.org/x/tools/go/ssa/testmain.go b/vendor/golang.org/x/tools/go/ssa/testmain.go new file mode 100644 index 0000000000..48b184a32c --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/testmain.go @@ -0,0 +1,303 @@ +// Copyright 2013 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.5 + +package ssa + +// CreateTestMainPackage synthesizes a main package that runs all the +// tests of the supplied packages. +// It is closely coupled to $GOROOT/src/cmd/go/test.go and $GOROOT/src/testing. + +import ( + "go/ast" + exact "go/constant" + "go/token" + "go/types" + "os" + "sort" + "strings" +) + +// FindTests returns the list of packages that define at least one Test, +// Example or Benchmark function (as defined by "go test"), and the +// lists of all such functions. +// +func FindTests(pkgs []*Package) (testpkgs []*Package, tests, benchmarks, examples []*Function) { + if len(pkgs) == 0 { + return + } + prog := pkgs[0].Prog + + // The first two of these may be nil: if the program doesn't import "testing", + // it can't contain any tests, but it may yet contain Examples. + var testSig *types.Signature // func(*testing.T) + var benchmarkSig *types.Signature // func(*testing.B) + var exampleSig = types.NewSignature(nil, nil, nil, false) // func() + + // Obtain the types from the parameters of testing.Main(). + if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil { + params := testingPkg.Func("Main").Signature.Params() + testSig = funcField(params.At(1).Type()) + benchmarkSig = funcField(params.At(2).Type()) + } + + seen := make(map[*Package]bool) + for _, pkg := range pkgs { + if pkg.Prog != prog { + panic("wrong Program") + } + + // TODO(adonovan): use a stable order, e.g. lexical. + for _, mem := range pkg.Members { + if f, ok := mem.(*Function); ok && + ast.IsExported(f.Name()) && + strings.HasSuffix(prog.Fset.Position(f.Pos()).Filename, "_test.go") { + + switch { + case testSig != nil && isTestSig(f, "Test", testSig): + tests = append(tests, f) + case benchmarkSig != nil && isTestSig(f, "Benchmark", benchmarkSig): + benchmarks = append(benchmarks, f) + case isTestSig(f, "Example", exampleSig): + examples = append(examples, f) + default: + continue + } + + if !seen[pkg] { + seen[pkg] = true + testpkgs = append(testpkgs, pkg) + } + } + } + } + return +} + +// Like isTest, but checks the signature too. +func isTestSig(f *Function, prefix string, sig *types.Signature) bool { + return isTest(f.Name(), prefix) && types.Identical(f.Signature, sig) +} + +// If non-nil, testMainStartBodyHook is called immediately after +// startBody for main.init and main.main, making it easy for users to +// add custom imports and initialization steps for proprietary build +// systems that don't exactly follow 'go test' conventions. +var testMainStartBodyHook func(*Function) + +// CreateTestMainPackage creates and returns a synthetic "main" +// package that runs all the tests of the supplied packages, similar +// to the one that would be created by the 'go test' tool. +// +// It returns nil if the program contains no tests. +// +func (prog *Program) CreateTestMainPackage(pkgs ...*Package) *Package { + pkgs, tests, benchmarks, examples := FindTests(pkgs) + if len(pkgs) == 0 { + return nil + } + + testmain := &Package{ + Prog: prog, + Members: make(map[string]Member), + values: make(map[types.Object]Value), + Pkg: types.NewPackage("test$main", "main"), + } + + // Build package's init function. + init := &Function{ + name: "init", + Signature: new(types.Signature), + Synthetic: "package initializer", + Pkg: testmain, + Prog: prog, + } + init.startBody() + + if testMainStartBodyHook != nil { + testMainStartBodyHook(init) + } + + // Initialize packages to test. + var pkgpaths []string + for _, pkg := range pkgs { + var v Call + v.Call.Value = pkg.init + v.setType(types.NewTuple()) + init.emit(&v) + + pkgpaths = append(pkgpaths, pkg.Pkg.Path()) + } + sort.Strings(pkgpaths) + init.emit(new(Return)) + init.finishBody() + testmain.init = init + testmain.Pkg.MarkComplete() + testmain.Members[init.name] = init + + // For debugging convenience, define an unexported const + // that enumerates the packages. + packagesConst := types.NewConst(token.NoPos, testmain.Pkg, "packages", tString, + exact.MakeString(strings.Join(pkgpaths, " "))) + memberFromObject(testmain, packagesConst, nil) + + // Create main *types.Func and *ssa.Function + mainFunc := types.NewFunc(token.NoPos, testmain.Pkg, "main", new(types.Signature)) + memberFromObject(testmain, mainFunc, nil) + main := testmain.Func("main") + main.Synthetic = "test main function" + + main.startBody() + + if testMainStartBodyHook != nil { + testMainStartBodyHook(main) + } + + if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil { + testingMain := testingPkg.Func("Main") + testingMainParams := testingMain.Signature.Params() + + // The generated code is as if compiled from this: + // + // func main() { + // match := func(_, _ string) (bool, error) { return true, nil } + // tests := []testing.InternalTest{{"TestFoo", TestFoo}, ...} + // benchmarks := []testing.InternalBenchmark{...} + // examples := []testing.InternalExample{...} + // testing.Main(match, tests, benchmarks, examples) + // } + + matcher := &Function{ + name: "matcher", + Signature: testingMainParams.At(0).Type().(*types.Signature), + Synthetic: "test matcher predicate", + parent: main, + Pkg: testmain, + Prog: prog, + } + main.AnonFuncs = append(main.AnonFuncs, matcher) + matcher.startBody() + matcher.emit(&Return{Results: []Value{vTrue, nilConst(types.Universe.Lookup("error").Type())}}) + matcher.finishBody() + + // Emit call: testing.Main(matcher, tests, benchmarks, examples). + var c Call + c.Call.Value = testingMain + c.Call.Args = []Value{ + matcher, + testMainSlice(main, tests, testingMainParams.At(1).Type()), + testMainSlice(main, benchmarks, testingMainParams.At(2).Type()), + testMainSlice(main, examples, testingMainParams.At(3).Type()), + } + emitTailCall(main, &c) + } else { + // The program does not import "testing", but FindTests + // returned non-nil, which must mean there were Examples + // but no Tests or Benchmarks. + // We'll simply call them from testmain.main; this will + // ensure they don't panic, but will not check any + // "Output:" comments. + for _, eg := range examples { + var c Call + c.Call.Value = eg + c.setType(types.NewTuple()) + main.emit(&c) + } + main.emit(&Return{}) + main.currentBlock = nil + } + + main.finishBody() + + testmain.Members["main"] = main + + if prog.mode&PrintPackages != 0 { + printMu.Lock() + testmain.WriteTo(os.Stdout) + printMu.Unlock() + } + + if prog.mode&SanityCheckFunctions != 0 { + sanityCheckPackage(testmain) + } + + prog.packages[testmain.Pkg] = testmain + + return testmain +} + +// testMainSlice emits to fn code to construct a slice of type slice +// (one of []testing.Internal{Test,Benchmark,Example}) for all +// functions in testfuncs. It returns the slice value. +// +func testMainSlice(fn *Function, testfuncs []*Function, slice types.Type) Value { + if testfuncs == nil { + return nilConst(slice) + } + + tElem := slice.(*types.Slice).Elem() + tPtrString := types.NewPointer(tString) + tPtrElem := types.NewPointer(tElem) + tPtrFunc := types.NewPointer(funcField(slice)) + + // TODO(adonovan): fix: populate the + // testing.InternalExample.Output field correctly so that tests + // work correctly under the interpreter. This requires that we + // do this step using ASTs, not *ssa.Functions---quite a + // redesign. See also the fake runExample in go/ssa/interp. + + // Emit: array = new [n]testing.InternalTest + tArray := types.NewArray(tElem, int64(len(testfuncs))) + array := emitNew(fn, tArray, token.NoPos) + array.Comment = "test main" + for i, testfunc := range testfuncs { + // Emit: pitem = &array[i] + ia := &IndexAddr{X: array, Index: intConst(int64(i))} + ia.setType(tPtrElem) + pitem := fn.emit(ia) + + // Emit: pname = &pitem.Name + fa := &FieldAddr{X: pitem, Field: 0} // .Name + fa.setType(tPtrString) + pname := fn.emit(fa) + + // Emit: *pname = "testfunc" + emitStore(fn, pname, stringConst(testfunc.Name()), token.NoPos) + + // Emit: pfunc = &pitem.F + fa = &FieldAddr{X: pitem, Field: 1} // .F + fa.setType(tPtrFunc) + pfunc := fn.emit(fa) + + // Emit: *pfunc = testfunc + emitStore(fn, pfunc, testfunc, token.NoPos) + } + + // Emit: slice array[:] + sl := &Slice{X: array} + sl.setType(slice) + return fn.emit(sl) +} + +// Given the type of one of the three slice parameters of testing.Main, +// returns the function type. +func funcField(slice types.Type) *types.Signature { + return slice.(*types.Slice).Elem().Underlying().(*types.Struct).Field(1).Type().(*types.Signature) +} + +// Plundered from $GOROOT/src/cmd/go/test.go + +// isTest tells whether name looks like a test (or benchmark, according to prefix). +// It is a Test (say) if there is a character after Test that is not a lower-case letter. +// We don't want TesticularCancer. +func isTest(name, prefix string) bool { + if !strings.HasPrefix(name, prefix) { + return false + } + if len(name) == len(prefix) { // "Test" is ok + return true + } + return ast.IsExported(name[len(prefix):]) +} diff --git a/vendor/golang.org/x/tools/go/ssa/testmain14.go b/vendor/golang.org/x/tools/go/ssa/testmain14.go new file mode 100644 index 0000000000..ddd27a1c59 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/testmain14.go @@ -0,0 +1,304 @@ +// Copyright 2013 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.5 + +package ssa + +// CreateTestMainPackage synthesizes a main package that runs all the +// tests of the supplied packages. +// It is closely coupled to $GOROOT/src/cmd/go/test.go and $GOROOT/src/testing. + +import ( + "go/ast" + "go/token" + "os" + "sort" + "strings" + + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/types" +) + +// FindTests returns the list of packages that define at least one Test, +// Example or Benchmark function (as defined by "go test"), and the +// lists of all such functions. +// +func FindTests(pkgs []*Package) (testpkgs []*Package, tests, benchmarks, examples []*Function) { + if len(pkgs) == 0 { + return + } + prog := pkgs[0].Prog + + // The first two of these may be nil: if the program doesn't import "testing", + // it can't contain any tests, but it may yet contain Examples. + var testSig *types.Signature // func(*testing.T) + var benchmarkSig *types.Signature // func(*testing.B) + var exampleSig = types.NewSignature(nil, nil, nil, false) // func() + + // Obtain the types from the parameters of testing.Main(). + if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil { + params := testingPkg.Func("Main").Signature.Params() + testSig = funcField(params.At(1).Type()) + benchmarkSig = funcField(params.At(2).Type()) + } + + seen := make(map[*Package]bool) + for _, pkg := range pkgs { + if pkg.Prog != prog { + panic("wrong Program") + } + + // TODO(adonovan): use a stable order, e.g. lexical. + for _, mem := range pkg.Members { + if f, ok := mem.(*Function); ok && + ast.IsExported(f.Name()) && + strings.HasSuffix(prog.Fset.Position(f.Pos()).Filename, "_test.go") { + + switch { + case testSig != nil && isTestSig(f, "Test", testSig): + tests = append(tests, f) + case benchmarkSig != nil && isTestSig(f, "Benchmark", benchmarkSig): + benchmarks = append(benchmarks, f) + case isTestSig(f, "Example", exampleSig): + examples = append(examples, f) + default: + continue + } + + if !seen[pkg] { + seen[pkg] = true + testpkgs = append(testpkgs, pkg) + } + } + } + } + return +} + +// Like isTest, but checks the signature too. +func isTestSig(f *Function, prefix string, sig *types.Signature) bool { + return isTest(f.Name(), prefix) && types.Identical(f.Signature, sig) +} + +// If non-nil, testMainStartBodyHook is called immediately after +// startBody for main.init and main.main, making it easy for users to +// add custom imports and initialization steps for proprietary build +// systems that don't exactly follow 'go test' conventions. +var testMainStartBodyHook func(*Function) + +// CreateTestMainPackage creates and returns a synthetic "main" +// package that runs all the tests of the supplied packages, similar +// to the one that would be created by the 'go test' tool. +// +// It returns nil if the program contains no tests. +// +func (prog *Program) CreateTestMainPackage(pkgs ...*Package) *Package { + pkgs, tests, benchmarks, examples := FindTests(pkgs) + if len(pkgs) == 0 { + return nil + } + + testmain := &Package{ + Prog: prog, + Members: make(map[string]Member), + values: make(map[types.Object]Value), + Pkg: types.NewPackage("test$main", "main"), + } + + // Build package's init function. + init := &Function{ + name: "init", + Signature: new(types.Signature), + Synthetic: "package initializer", + Pkg: testmain, + Prog: prog, + } + init.startBody() + + if testMainStartBodyHook != nil { + testMainStartBodyHook(init) + } + + // Initialize packages to test. + var pkgpaths []string + for _, pkg := range pkgs { + var v Call + v.Call.Value = pkg.init + v.setType(types.NewTuple()) + init.emit(&v) + + pkgpaths = append(pkgpaths, pkg.Pkg.Path()) + } + sort.Strings(pkgpaths) + init.emit(new(Return)) + init.finishBody() + testmain.init = init + testmain.Pkg.MarkComplete() + testmain.Members[init.name] = init + + // For debugging convenience, define an unexported const + // that enumerates the packages. + packagesConst := types.NewConst(token.NoPos, testmain.Pkg, "packages", tString, + exact.MakeString(strings.Join(pkgpaths, " "))) + memberFromObject(testmain, packagesConst, nil) + + // Create main *types.Func and *ssa.Function + mainFunc := types.NewFunc(token.NoPos, testmain.Pkg, "main", new(types.Signature)) + memberFromObject(testmain, mainFunc, nil) + main := testmain.Func("main") + main.Synthetic = "test main function" + + main.startBody() + + if testMainStartBodyHook != nil { + testMainStartBodyHook(main) + } + + if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil { + testingMain := testingPkg.Func("Main") + testingMainParams := testingMain.Signature.Params() + + // The generated code is as if compiled from this: + // + // func main() { + // match := func(_, _ string) (bool, error) { return true, nil } + // tests := []testing.InternalTest{{"TestFoo", TestFoo}, ...} + // benchmarks := []testing.InternalBenchmark{...} + // examples := []testing.InternalExample{...} + // testing.Main(match, tests, benchmarks, examples) + // } + + matcher := &Function{ + name: "matcher", + Signature: testingMainParams.At(0).Type().(*types.Signature), + Synthetic: "test matcher predicate", + parent: main, + Pkg: testmain, + Prog: prog, + } + main.AnonFuncs = append(main.AnonFuncs, matcher) + matcher.startBody() + matcher.emit(&Return{Results: []Value{vTrue, nilConst(types.Universe.Lookup("error").Type())}}) + matcher.finishBody() + + // Emit call: testing.Main(matcher, tests, benchmarks, examples). + var c Call + c.Call.Value = testingMain + c.Call.Args = []Value{ + matcher, + testMainSlice(main, tests, testingMainParams.At(1).Type()), + testMainSlice(main, benchmarks, testingMainParams.At(2).Type()), + testMainSlice(main, examples, testingMainParams.At(3).Type()), + } + emitTailCall(main, &c) + } else { + // The program does not import "testing", but FindTests + // returned non-nil, which must mean there were Examples + // but no Tests or Benchmarks. + // We'll simply call them from testmain.main; this will + // ensure they don't panic, but will not check any + // "Output:" comments. + for _, eg := range examples { + var c Call + c.Call.Value = eg + c.setType(types.NewTuple()) + main.emit(&c) + } + main.emit(&Return{}) + main.currentBlock = nil + } + + main.finishBody() + + testmain.Members["main"] = main + + if prog.mode&PrintPackages != 0 { + printMu.Lock() + testmain.WriteTo(os.Stdout) + printMu.Unlock() + } + + if prog.mode&SanityCheckFunctions != 0 { + sanityCheckPackage(testmain) + } + + prog.packages[testmain.Pkg] = testmain + + return testmain +} + +// testMainSlice emits to fn code to construct a slice of type slice +// (one of []testing.Internal{Test,Benchmark,Example}) for all +// functions in testfuncs. It returns the slice value. +// +func testMainSlice(fn *Function, testfuncs []*Function, slice types.Type) Value { + if testfuncs == nil { + return nilConst(slice) + } + + tElem := slice.(*types.Slice).Elem() + tPtrString := types.NewPointer(tString) + tPtrElem := types.NewPointer(tElem) + tPtrFunc := types.NewPointer(funcField(slice)) + + // TODO(adonovan): fix: populate the + // testing.InternalExample.Output field correctly so that tests + // work correctly under the interpreter. This requires that we + // do this step using ASTs, not *ssa.Functions---quite a + // redesign. See also the fake runExample in go/ssa/interp. + + // Emit: array = new [n]testing.InternalTest + tArray := types.NewArray(tElem, int64(len(testfuncs))) + array := emitNew(fn, tArray, token.NoPos) + array.Comment = "test main" + for i, testfunc := range testfuncs { + // Emit: pitem = &array[i] + ia := &IndexAddr{X: array, Index: intConst(int64(i))} + ia.setType(tPtrElem) + pitem := fn.emit(ia) + + // Emit: pname = &pitem.Name + fa := &FieldAddr{X: pitem, Field: 0} // .Name + fa.setType(tPtrString) + pname := fn.emit(fa) + + // Emit: *pname = "testfunc" + emitStore(fn, pname, stringConst(testfunc.Name()), token.NoPos) + + // Emit: pfunc = &pitem.F + fa = &FieldAddr{X: pitem, Field: 1} // .F + fa.setType(tPtrFunc) + pfunc := fn.emit(fa) + + // Emit: *pfunc = testfunc + emitStore(fn, pfunc, testfunc, token.NoPos) + } + + // Emit: slice array[:] + sl := &Slice{X: array} + sl.setType(slice) + return fn.emit(sl) +} + +// Given the type of one of the three slice parameters of testing.Main, +// returns the function type. +func funcField(slice types.Type) *types.Signature { + return slice.(*types.Slice).Elem().Underlying().(*types.Struct).Field(1).Type().(*types.Signature) +} + +// Plundered from $GOROOT/src/cmd/go/test.go + +// isTest tells whether name looks like a test (or benchmark, according to prefix). +// It is a Test (say) if there is a character after Test that is not a lower-case letter. +// We don't want TesticularCancer. +func isTest(name, prefix string) bool { + if !strings.HasPrefix(name, prefix) { + return false + } + if len(name) == len(prefix) { // "Test" is ok + return true + } + return ast.IsExported(name[len(prefix):]) +} diff --git a/vendor/golang.org/x/tools/go/ssa/testmain_test.go b/vendor/golang.org/x/tools/go/ssa/testmain_test.go new file mode 100644 index 0000000000..56cb60400b --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/testmain_test.go @@ -0,0 +1,123 @@ +// 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 ssa_test + +// Tests of FindTests. CreateTestMainPackage is tested via the interpreter. +// TODO(adonovan): test the 'pkgs' result from FindTests. + +import ( + "fmt" + "sort" + "testing" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +func create(t *testing.T, content string) []*ssa.Package { + var conf loader.Config + f, err := conf.ParseFile("foo_test.go", content) + if err != nil { + t.Fatal(err) + } + conf.CreateFromFiles("foo", f) + + iprog, err := conf.Load() + if err != nil { + t.Fatal(err) + } + + // We needn't call Build. + return ssautil.CreateProgram(iprog, ssa.SanityCheckFunctions).AllPackages() +} + +func TestFindTests(t *testing.T) { + test := ` +package foo + +import "testing" + +type T int + +// Tests: +func Test(t *testing.T) {} +func TestA(t *testing.T) {} +func TestB(t *testing.T) {} + +// Not tests: +func testC(t *testing.T) {} +func TestD() {} +func testE(t *testing.T) int { return 0 } +func (T) Test(t *testing.T) {} + +// Benchmarks: +func Benchmark(*testing.B) {} +func BenchmarkA(b *testing.B) {} +func BenchmarkB(*testing.B) {} + +// Not benchmarks: +func benchmarkC(t *testing.T) {} +func BenchmarkD() {} +func benchmarkE(t *testing.T) int { return 0 } +func (T) Benchmark(t *testing.T) {} + +// Examples: +func Example() {} +func ExampleA() {} + +// Not examples: +func exampleC() {} +func ExampleD(t *testing.T) {} +func exampleE() int { return 0 } +func (T) Example() {} +` + pkgs := create(t, test) + _, tests, benchmarks, examples := ssa.FindTests(pkgs) + + sort.Sort(funcsByPos(tests)) + if got, want := fmt.Sprint(tests), "[foo.Test foo.TestA foo.TestB]"; got != want { + t.Errorf("FindTests.tests = %s, want %s", got, want) + } + + sort.Sort(funcsByPos(benchmarks)) + if got, want := fmt.Sprint(benchmarks), "[foo.Benchmark foo.BenchmarkA foo.BenchmarkB]"; got != want { + t.Errorf("FindTests.benchmarks = %s, want %s", got, want) + } + + sort.Sort(funcsByPos(examples)) + if got, want := fmt.Sprint(examples), "[foo.Example foo.ExampleA]"; got != want { + t.Errorf("FindTests examples = %s, want %s", got, want) + } +} + +func TestFindTestsTesting(t *testing.T) { + test := ` +package foo + +// foo does not import "testing", but defines Examples. + +func Example() {} +func ExampleA() {} +` + pkgs := create(t, test) + _, tests, benchmarks, examples := ssa.FindTests(pkgs) + if len(tests) > 0 { + t.Errorf("FindTests.tests = %s, want none", tests) + } + if len(benchmarks) > 0 { + t.Errorf("FindTests.benchmarks = %s, want none", benchmarks) + } + sort.Sort(funcsByPos(examples)) + if got, want := fmt.Sprint(examples), "[foo.Example foo.ExampleA]"; got != want { + t.Errorf("FindTests examples = %s, want %s", got, want) + } +} + +type funcsByPos []*ssa.Function + +func (p funcsByPos) Len() int { return len(p) } +func (p funcsByPos) Less(i, j int) bool { return p[i].Pos() < p[j].Pos() } +func (p funcsByPos) Swap(i, j int) { p[i], p[j] = p[j], p[i] } diff --git a/vendor/golang.org/x/tools/go/ssa/util.go b/vendor/golang.org/x/tools/go/ssa/util.go new file mode 100644 index 0000000000..317a0130b1 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/util.go @@ -0,0 +1,121 @@ +// Copyright 2013 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.5 + +package ssa + +// This file defines a number of miscellaneous utility functions. + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" + "io" + "os" + + "golang.org/x/tools/go/ast/astutil" +) + +//// AST utilities + +func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) } + +// isBlankIdent returns true iff e is an Ident with name "_". +// They have no associated types.Object, and thus no type. +// +func isBlankIdent(e ast.Expr) bool { + id, ok := e.(*ast.Ident) + return ok && id.Name == "_" +} + +//// Type utilities. Some of these belong in go/types. + +// isPointer returns true for types whose underlying type is a pointer. +func isPointer(typ types.Type) bool { + _, ok := typ.Underlying().(*types.Pointer) + return ok +} + +func isInterface(T types.Type) bool { return types.IsInterface(T) } + +// deref returns a pointer's element type; otherwise it returns typ. +func deref(typ types.Type) types.Type { + if p, ok := typ.Underlying().(*types.Pointer); ok { + return p.Elem() + } + return typ +} + +// recvType returns the receiver type of method obj. +func recvType(obj *types.Func) types.Type { + return obj.Type().(*types.Signature).Recv().Type() +} + +// DefaultType returns the default "typed" type for an "untyped" type; +// it returns the incoming type for all other types. The default type +// for untyped nil is untyped nil. +// +// Exported to ssa/interp. +// +// TODO(gri): this is a copy of go/types.defaultType; export that function. +// +func DefaultType(typ types.Type) types.Type { + if t, ok := typ.(*types.Basic); ok { + k := t.Kind() + switch k { + case types.UntypedBool: + k = types.Bool + case types.UntypedInt: + k = types.Int + case types.UntypedRune: + k = types.Rune + case types.UntypedFloat: + k = types.Float64 + case types.UntypedComplex: + k = types.Complex128 + case types.UntypedString: + k = types.String + } + typ = types.Typ[k] + } + return typ +} + +// logStack prints the formatted "start" message to stderr and +// returns a closure that prints the corresponding "end" message. +// Call using 'defer logStack(...)()' to show builder stack on panic. +// Don't forget trailing parens! +// +func logStack(format string, args ...interface{}) func() { + msg := fmt.Sprintf(format, args...) + io.WriteString(os.Stderr, msg) + io.WriteString(os.Stderr, "\n") + return func() { + io.WriteString(os.Stderr, msg) + io.WriteString(os.Stderr, " end\n") + } +} + +// newVar creates a 'var' for use in a types.Tuple. +func newVar(name string, typ types.Type) *types.Var { + return types.NewParam(token.NoPos, nil, name, typ) +} + +// anonVar creates an anonymous 'var' for use in a types.Tuple. +func anonVar(typ types.Type) *types.Var { + return newVar("", typ) +} + +var lenResults = types.NewTuple(anonVar(tInt)) + +// makeLen returns the len builtin specialized to type func(T)int. +func makeLen(T types.Type) *Builtin { + lenParams := types.NewTuple(anonVar(T)) + return &Builtin{ + name: "len", + sig: types.NewSignature(nil, lenParams, lenResults, false), + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/util14.go b/vendor/golang.org/x/tools/go/ssa/util14.go new file mode 100644 index 0000000000..444d69c415 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/util14.go @@ -0,0 +1,121 @@ +// Copyright 2013 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.5 + +package ssa + +// This file defines a number of miscellaneous utility functions. + +import ( + "fmt" + "go/ast" + "go/token" + "io" + "os" + + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/types" +) + +//// AST utilities + +func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) } + +// isBlankIdent returns true iff e is an Ident with name "_". +// They have no associated types.Object, and thus no type. +// +func isBlankIdent(e ast.Expr) bool { + id, ok := e.(*ast.Ident) + return ok && id.Name == "_" +} + +//// Type utilities. Some of these belong in go/types. + +// isPointer returns true for types whose underlying type is a pointer. +func isPointer(typ types.Type) bool { + _, ok := typ.Underlying().(*types.Pointer) + return ok +} + +func isInterface(T types.Type) bool { return types.IsInterface(T) } + +// deref returns a pointer's element type; otherwise it returns typ. +func deref(typ types.Type) types.Type { + if p, ok := typ.Underlying().(*types.Pointer); ok { + return p.Elem() + } + return typ +} + +// recvType returns the receiver type of method obj. +func recvType(obj *types.Func) types.Type { + return obj.Type().(*types.Signature).Recv().Type() +} + +// DefaultType returns the default "typed" type for an "untyped" type; +// it returns the incoming type for all other types. The default type +// for untyped nil is untyped nil. +// +// Exported to ssa/interp. +// +// TODO(gri): this is a copy of go/types.defaultType; export that function. +// +func DefaultType(typ types.Type) types.Type { + if t, ok := typ.(*types.Basic); ok { + k := t.Kind() + switch k { + case types.UntypedBool: + k = types.Bool + case types.UntypedInt: + k = types.Int + case types.UntypedRune: + k = types.Rune + case types.UntypedFloat: + k = types.Float64 + case types.UntypedComplex: + k = types.Complex128 + case types.UntypedString: + k = types.String + } + typ = types.Typ[k] + } + return typ +} + +// logStack prints the formatted "start" message to stderr and +// returns a closure that prints the corresponding "end" message. +// Call using 'defer logStack(...)()' to show builder stack on panic. +// Don't forget trailing parens! +// +func logStack(format string, args ...interface{}) func() { + msg := fmt.Sprintf(format, args...) + io.WriteString(os.Stderr, msg) + io.WriteString(os.Stderr, "\n") + return func() { + io.WriteString(os.Stderr, msg) + io.WriteString(os.Stderr, " end\n") + } +} + +// newVar creates a 'var' for use in a types.Tuple. +func newVar(name string, typ types.Type) *types.Var { + return types.NewParam(token.NoPos, nil, name, typ) +} + +// anonVar creates an anonymous 'var' for use in a types.Tuple. +func anonVar(typ types.Type) *types.Var { + return newVar("", typ) +} + +var lenResults = types.NewTuple(anonVar(tInt)) + +// makeLen returns the len builtin specialized to type func(T)int. +func makeLen(T types.Type) *Builtin { + lenParams := types.NewTuple(anonVar(T)) + return &Builtin{ + name: "len", + sig: types.NewSignature(nil, lenParams, lenResults, false), + } +} diff --git a/vendor/golang.org/x/tools/go/ssa/wrappers.go b/vendor/golang.org/x/tools/go/ssa/wrappers.go new file mode 100644 index 0000000000..6ca01ab35f --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/wrappers.go @@ -0,0 +1,296 @@ +// Copyright 2013 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.5 + +package ssa + +// This file defines synthesis of Functions that delegate to declared +// methods; they come in three kinds: +// +// (1) wrappers: methods that wrap declared methods, performing +// implicit pointer indirections and embedded field selections. +// +// (2) thunks: funcs that wrap declared methods. Like wrappers, +// thunks perform indirections and field selections. The thunk's +// first parameter is used as the receiver for the method call. +// +// (3) bounds: funcs that wrap declared methods. The bound's sole +// free variable, supplied by a closure, is used as the receiver +// for the method call. No indirections or field selections are +// performed since they can be done before the call. + +import ( + "fmt" + + "go/types" +) + +// -- wrappers ----------------------------------------------------------- + +// makeWrapper returns a synthetic method that delegates to the +// declared method denoted by meth.Obj(), first performing any +// necessary pointer indirections or field selections implied by meth. +// +// The resulting method's receiver type is meth.Recv(). +// +// This function is versatile but quite subtle! Consider the +// following axes of variation when making changes: +// - optional receiver indirection +// - optional implicit field selections +// - meth.Obj() may denote a concrete or an interface method +// - the result may be a thunk or a wrapper. +// +// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu) +// +func makeWrapper(prog *Program, sel *types.Selection) *Function { + obj := sel.Obj().(*types.Func) // the declared function + sig := sel.Type().(*types.Signature) // type of this wrapper + + var recv *types.Var // wrapper's receiver or thunk's params[0] + name := obj.Name() + var description string + var start int // first regular param + if sel.Kind() == types.MethodExpr { + name += "$thunk" + description = "thunk" + recv = sig.Params().At(0) + start = 1 + } else { + description = "wrapper" + recv = sig.Recv() + } + + description = fmt.Sprintf("%s for %s", description, sel.Obj()) + if prog.mode&LogSource != 0 { + defer logStack("make %s to (%s)", description, recv.Type())() + } + fn := &Function{ + name: name, + method: sel, + object: obj, + Signature: sig, + Synthetic: description, + Prog: prog, + pos: obj.Pos(), + } + fn.startBody() + fn.addSpilledParam(recv) + createParams(fn, start) + + indices := sel.Index() + + var v Value = fn.Locals[0] // spilled receiver + if isPointer(sel.Recv()) { + v = emitLoad(fn, v) + + // For simple indirection wrappers, perform an informative nil-check: + // "value method (T).f called using nil *T pointer" + if len(indices) == 1 && !isPointer(recvType(obj)) { + var c Call + c.Call.Value = &Builtin{ + name: "ssa:wrapnilchk", + sig: types.NewSignature(nil, + types.NewTuple(anonVar(sel.Recv()), anonVar(tString), anonVar(tString)), + types.NewTuple(anonVar(sel.Recv())), false), + } + c.Call.Args = []Value{ + v, + stringConst(deref(sel.Recv()).String()), + stringConst(sel.Obj().Name()), + } + c.setType(v.Type()) + v = fn.emit(&c) + } + } + + // Invariant: v is a pointer, either + // value of *A receiver param, or + // address of A spilled receiver. + + // We use pointer arithmetic (FieldAddr possibly followed by + // Load) in preference to value extraction (Field possibly + // preceded by Load). + + v = emitImplicitSelections(fn, v, indices[:len(indices)-1]) + + // Invariant: v is a pointer, either + // value of implicit *C field, or + // address of implicit C field. + + var c Call + if r := recvType(obj); !isInterface(r) { // concrete method + if !isPointer(r) { + v = emitLoad(fn, v) + } + c.Call.Value = prog.declaredFunc(obj) + c.Call.Args = append(c.Call.Args, v) + } else { + c.Call.Method = obj + c.Call.Value = emitLoad(fn, v) + } + for _, arg := range fn.Params[1:] { + c.Call.Args = append(c.Call.Args, arg) + } + emitTailCall(fn, &c) + fn.finishBody() + return fn +} + +// createParams creates parameters for wrapper method fn based on its +// Signature.Params, which do not include the receiver. +// start is the index of the first regular parameter to use. +// +func createParams(fn *Function, start int) { + var last *Parameter + tparams := fn.Signature.Params() + for i, n := start, tparams.Len(); i < n; i++ { + last = fn.addParamObj(tparams.At(i)) + } + if fn.Signature.Variadic() { + last.typ = types.NewSlice(last.typ) + } +} + +// -- bounds ----------------------------------------------------------- + +// makeBound returns a bound method wrapper (or "bound"), a synthetic +// function that delegates to a concrete or interface method denoted +// by obj. The resulting function has no receiver, but has one free +// variable which will be used as the method's receiver in the +// tail-call. +// +// Use MakeClosure with such a wrapper to construct a bound method +// closure. e.g.: +// +// type T int or: type T interface { meth() } +// func (t T) meth() +// var t T +// f := t.meth +// f() // calls t.meth() +// +// f is a closure of a synthetic wrapper defined as if by: +// +// f := func() { return t.meth() } +// +// Unlike makeWrapper, makeBound need perform no indirection or field +// selections because that can be done before the closure is +// constructed. +// +// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu) +// +func makeBound(prog *Program, obj *types.Func) *Function { + prog.methodsMu.Lock() + defer prog.methodsMu.Unlock() + fn, ok := prog.bounds[obj] + if !ok { + description := fmt.Sprintf("bound method wrapper for %s", obj) + if prog.mode&LogSource != 0 { + defer logStack("%s", description)() + } + fn = &Function{ + name: obj.Name() + "$bound", + object: obj, + Signature: changeRecv(obj.Type().(*types.Signature), nil), // drop receiver + Synthetic: description, + Prog: prog, + pos: obj.Pos(), + } + + fv := &FreeVar{name: "recv", typ: recvType(obj), parent: fn} + fn.FreeVars = []*FreeVar{fv} + fn.startBody() + createParams(fn, 0) + var c Call + + if !isInterface(recvType(obj)) { // concrete + c.Call.Value = prog.declaredFunc(obj) + c.Call.Args = []Value{fv} + } else { + c.Call.Value = fv + c.Call.Method = obj + } + for _, arg := range fn.Params { + c.Call.Args = append(c.Call.Args, arg) + } + emitTailCall(fn, &c) + fn.finishBody() + + prog.bounds[obj] = fn + } + return fn +} + +// -- thunks ----------------------------------------------------------- + +// makeThunk returns a thunk, a synthetic function that delegates to a +// concrete or interface method denoted by sel.Obj(). The resulting +// function has no receiver, but has an additional (first) regular +// parameter. +// +// Precondition: sel.Kind() == types.MethodExpr. +// +// type T int or: type T interface { meth() } +// func (t T) meth() +// f := T.meth +// var t T +// f(t) // calls t.meth() +// +// f is a synthetic wrapper defined as if by: +// +// f := func(t T) { return t.meth() } +// +// TODO(adonovan): opt: currently the stub is created even when used +// directly in a function call: C.f(i, 0). This is less efficient +// than inlining the stub. +// +// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu) +// +func makeThunk(prog *Program, sel *types.Selection) *Function { + if sel.Kind() != types.MethodExpr { + panic(sel) + } + + key := selectionKey{ + kind: sel.Kind(), + recv: sel.Recv(), + obj: sel.Obj(), + index: fmt.Sprint(sel.Index()), + indirect: sel.Indirect(), + } + + prog.methodsMu.Lock() + defer prog.methodsMu.Unlock() + + // Canonicalize key.recv to avoid constructing duplicate thunks. + canonRecv, ok := prog.canon.At(key.recv).(types.Type) + if !ok { + canonRecv = key.recv + prog.canon.Set(key.recv, canonRecv) + } + key.recv = canonRecv + + fn, ok := prog.thunks[key] + if !ok { + fn = makeWrapper(prog, sel) + if fn.Signature.Recv() != nil { + panic(fn) // unexpected receiver + } + prog.thunks[key] = fn + } + return fn +} + +func changeRecv(s *types.Signature, recv *types.Var) *types.Signature { + return types.NewSignature(recv, s.Params(), s.Results(), s.Variadic()) +} + +// selectionKey is like types.Selection but a usable map key. +type selectionKey struct { + kind types.SelectionKind + recv types.Type // canonicalized via Program.canon + obj types.Object + index string + indirect bool +} diff --git a/vendor/golang.org/x/tools/go/ssa/wrappers14.go b/vendor/golang.org/x/tools/go/ssa/wrappers14.go new file mode 100644 index 0000000000..89f71b7b24 --- /dev/null +++ b/vendor/golang.org/x/tools/go/ssa/wrappers14.go @@ -0,0 +1,296 @@ +// Copyright 2013 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.5 + +package ssa + +// This file defines synthesis of Functions that delegate to declared +// methods; they come in three kinds: +// +// (1) wrappers: methods that wrap declared methods, performing +// implicit pointer indirections and embedded field selections. +// +// (2) thunks: funcs that wrap declared methods. Like wrappers, +// thunks perform indirections and field selections. The thunk's +// first parameter is used as the receiver for the method call. +// +// (3) bounds: funcs that wrap declared methods. The bound's sole +// free variable, supplied by a closure, is used as the receiver +// for the method call. No indirections or field selections are +// performed since they can be done before the call. + +import ( + "fmt" + + "golang.org/x/tools/go/types" +) + +// -- wrappers ----------------------------------------------------------- + +// makeWrapper returns a synthetic method that delegates to the +// declared method denoted by meth.Obj(), first performing any +// necessary pointer indirections or field selections implied by meth. +// +// The resulting method's receiver type is meth.Recv(). +// +// This function is versatile but quite subtle! Consider the +// following axes of variation when making changes: +// - optional receiver indirection +// - optional implicit field selections +// - meth.Obj() may denote a concrete or an interface method +// - the result may be a thunk or a wrapper. +// +// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu) +// +func makeWrapper(prog *Program, sel *types.Selection) *Function { + obj := sel.Obj().(*types.Func) // the declared function + sig := sel.Type().(*types.Signature) // type of this wrapper + + var recv *types.Var // wrapper's receiver or thunk's params[0] + name := obj.Name() + var description string + var start int // first regular param + if sel.Kind() == types.MethodExpr { + name += "$thunk" + description = "thunk" + recv = sig.Params().At(0) + start = 1 + } else { + description = "wrapper" + recv = sig.Recv() + } + + description = fmt.Sprintf("%s for %s", description, sel.Obj()) + if prog.mode&LogSource != 0 { + defer logStack("make %s to (%s)", description, recv.Type())() + } + fn := &Function{ + name: name, + method: sel, + object: obj, + Signature: sig, + Synthetic: description, + Prog: prog, + pos: obj.Pos(), + } + fn.startBody() + fn.addSpilledParam(recv) + createParams(fn, start) + + indices := sel.Index() + + var v Value = fn.Locals[0] // spilled receiver + if isPointer(sel.Recv()) { + v = emitLoad(fn, v) + + // For simple indirection wrappers, perform an informative nil-check: + // "value method (T).f called using nil *T pointer" + if len(indices) == 1 && !isPointer(recvType(obj)) { + var c Call + c.Call.Value = &Builtin{ + name: "ssa:wrapnilchk", + sig: types.NewSignature(nil, + types.NewTuple(anonVar(sel.Recv()), anonVar(tString), anonVar(tString)), + types.NewTuple(anonVar(sel.Recv())), false), + } + c.Call.Args = []Value{ + v, + stringConst(deref(sel.Recv()).String()), + stringConst(sel.Obj().Name()), + } + c.setType(v.Type()) + v = fn.emit(&c) + } + } + + // Invariant: v is a pointer, either + // value of *A receiver param, or + // address of A spilled receiver. + + // We use pointer arithmetic (FieldAddr possibly followed by + // Load) in preference to value extraction (Field possibly + // preceded by Load). + + v = emitImplicitSelections(fn, v, indices[:len(indices)-1]) + + // Invariant: v is a pointer, either + // value of implicit *C field, or + // address of implicit C field. + + var c Call + if r := recvType(obj); !isInterface(r) { // concrete method + if !isPointer(r) { + v = emitLoad(fn, v) + } + c.Call.Value = prog.declaredFunc(obj) + c.Call.Args = append(c.Call.Args, v) + } else { + c.Call.Method = obj + c.Call.Value = emitLoad(fn, v) + } + for _, arg := range fn.Params[1:] { + c.Call.Args = append(c.Call.Args, arg) + } + emitTailCall(fn, &c) + fn.finishBody() + return fn +} + +// createParams creates parameters for wrapper method fn based on its +// Signature.Params, which do not include the receiver. +// start is the index of the first regular parameter to use. +// +func createParams(fn *Function, start int) { + var last *Parameter + tparams := fn.Signature.Params() + for i, n := start, tparams.Len(); i < n; i++ { + last = fn.addParamObj(tparams.At(i)) + } + if fn.Signature.Variadic() { + last.typ = types.NewSlice(last.typ) + } +} + +// -- bounds ----------------------------------------------------------- + +// makeBound returns a bound method wrapper (or "bound"), a synthetic +// function that delegates to a concrete or interface method denoted +// by obj. The resulting function has no receiver, but has one free +// variable which will be used as the method's receiver in the +// tail-call. +// +// Use MakeClosure with such a wrapper to construct a bound method +// closure. e.g.: +// +// type T int or: type T interface { meth() } +// func (t T) meth() +// var t T +// f := t.meth +// f() // calls t.meth() +// +// f is a closure of a synthetic wrapper defined as if by: +// +// f := func() { return t.meth() } +// +// Unlike makeWrapper, makeBound need perform no indirection or field +// selections because that can be done before the closure is +// constructed. +// +// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu) +// +func makeBound(prog *Program, obj *types.Func) *Function { + prog.methodsMu.Lock() + defer prog.methodsMu.Unlock() + fn, ok := prog.bounds[obj] + if !ok { + description := fmt.Sprintf("bound method wrapper for %s", obj) + if prog.mode&LogSource != 0 { + defer logStack("%s", description)() + } + fn = &Function{ + name: obj.Name() + "$bound", + object: obj, + Signature: changeRecv(obj.Type().(*types.Signature), nil), // drop receiver + Synthetic: description, + Prog: prog, + pos: obj.Pos(), + } + + fv := &FreeVar{name: "recv", typ: recvType(obj), parent: fn} + fn.FreeVars = []*FreeVar{fv} + fn.startBody() + createParams(fn, 0) + var c Call + + if !isInterface(recvType(obj)) { // concrete + c.Call.Value = prog.declaredFunc(obj) + c.Call.Args = []Value{fv} + } else { + c.Call.Value = fv + c.Call.Method = obj + } + for _, arg := range fn.Params { + c.Call.Args = append(c.Call.Args, arg) + } + emitTailCall(fn, &c) + fn.finishBody() + + prog.bounds[obj] = fn + } + return fn +} + +// -- thunks ----------------------------------------------------------- + +// makeThunk returns a thunk, a synthetic function that delegates to a +// concrete or interface method denoted by sel.Obj(). The resulting +// function has no receiver, but has an additional (first) regular +// parameter. +// +// Precondition: sel.Kind() == types.MethodExpr. +// +// type T int or: type T interface { meth() } +// func (t T) meth() +// f := T.meth +// var t T +// f(t) // calls t.meth() +// +// f is a synthetic wrapper defined as if by: +// +// f := func(t T) { return t.meth() } +// +// TODO(adonovan): opt: currently the stub is created even when used +// directly in a function call: C.f(i, 0). This is less efficient +// than inlining the stub. +// +// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu) +// +func makeThunk(prog *Program, sel *types.Selection) *Function { + if sel.Kind() != types.MethodExpr { + panic(sel) + } + + key := selectionKey{ + kind: sel.Kind(), + recv: sel.Recv(), + obj: sel.Obj(), + index: fmt.Sprint(sel.Index()), + indirect: sel.Indirect(), + } + + prog.methodsMu.Lock() + defer prog.methodsMu.Unlock() + + // Canonicalize key.recv to avoid constructing duplicate thunks. + canonRecv, ok := prog.canon.At(key.recv).(types.Type) + if !ok { + canonRecv = key.recv + prog.canon.Set(key.recv, canonRecv) + } + key.recv = canonRecv + + fn, ok := prog.thunks[key] + if !ok { + fn = makeWrapper(prog, sel) + if fn.Signature.Recv() != nil { + panic(fn) // unexpected receiver + } + prog.thunks[key] = fn + } + return fn +} + +func changeRecv(s *types.Signature, recv *types.Var) *types.Signature { + return types.NewSignature(recv, s.Params(), s.Results(), s.Variadic()) +} + +// selectionKey is like types.Selection but a usable map key. +type selectionKey struct { + kind types.SelectionKind + recv types.Type // canonicalized via Program.canon + obj types.Object + index string + indirect bool +} diff --git a/vendor/golang.org/x/tools/go/types/api.go b/vendor/golang.org/x/tools/go/types/api.go new file mode 100644 index 0000000000..5344a39e7f --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/api.go @@ -0,0 +1,365 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package types declares the data types and implements +// the algorithms for type-checking of Go packages. +// Use Check and Config.Check to invoke the type-checker. +// +// Type-checking consists of several interdependent phases: +// +// Name resolution maps each identifier (ast.Ident) in the program to the +// language object (Object) it denotes. +// Use Info.{Defs,Uses,Implicits} for the results of name resolution. +// +// Constant folding computes the exact constant value (exact.Value) for +// every expression (ast.Expr) that is a compile-time constant. +// Use Info.Types[expr].Value for the results of constant folding. +// +// Type inference computes the type (Type) of every expression (ast.Expr) +// and checks for compliance with the language specification. +// Use Info.Types[expr].Type for the results of type inference. +// +package types // import "golang.org/x/tools/go/types" + +import ( + "bytes" + "fmt" + "go/ast" + "go/token" + + "golang.org/x/tools/go/exact" +) + +// Check type-checks a package and returns the resulting complete package +// object, or a nil package and the first error. The package is specified +// by a list of *ast.Files and corresponding file set, and the import path +// the package is identified with. The clean path must not be empty or dot ("."). +// +// For more control over type-checking and results, use Config.Check. +func Check(path string, fset *token.FileSet, files []*ast.File) (*Package, error) { + var conf Config + pkg, err := conf.Check(path, fset, files, nil) + if err != nil { + return nil, err + } + return pkg, nil +} + +// An Error describes a type-checking error; it implements the error interface. +// A "soft" error is an error that still permits a valid interpretation of a +// package (such as "unused variable"); "hard" errors may lead to unpredictable +// behavior if ignored. +type Error struct { + Fset *token.FileSet // file set for interpretation of Pos + Pos token.Pos // error position + Msg string // error message + Soft bool // if set, error is "soft" +} + +// Error returns an error string formatted as follows: +// filename:line:column: message +func (err Error) Error() string { + return fmt.Sprintf("%s: %s", err.Fset.Position(err.Pos), err.Msg) +} + +// An importer resolves import paths to Packages. +// The imports map records packages already known, +// indexed by package path. The type-checker +// will invoke Import with Config.Packages. +// An importer must determine the canonical package path and +// check imports to see if it is already present in the map. +// If so, the Importer can return the map entry. Otherwise, +// the importer must load the package data for the given path +// into a new *Package, record it in imports map, and return +// the package. +// TODO(gri) Need to be clearer about requirements of completeness. +type Importer func(map[string]*Package, string) (*Package, error) + +// A Config specifies the configuration for type checking. +// The zero value for Config is a ready-to-use default configuration. +type Config struct { + // If IgnoreFuncBodies is set, function bodies are not + // type-checked. + IgnoreFuncBodies bool + + // If FakeImportC is set, `import "C"` (for packages requiring Cgo) + // declares an empty "C" package and errors are omitted for qualified + // identifiers referring to package C (which won't find an object). + // This feature is intended for the standard library cmd/api tool. + // + // Caution: Effects may be unpredictable due to follow-up errors. + // Do not use casually! + FakeImportC bool + + // Packages is used to look up (and thus canonicalize) packages by + // package path. If Packages is nil, it is set to a new empty map. + // During type-checking, imported packages are added to the map. + Packages map[string]*Package + + // If Error != nil, it is called with each error found + // during type checking; err has dynamic type Error. + // Secondary errors (for instance, to enumerate all types + // involved in an invalid recursive type declaration) have + // error strings that start with a '\t' character. + // If Error == nil, type-checking stops with the first + // error found. + Error func(err error) + + // If Import != nil, it is called for each imported package. + // Otherwise, DefaultImport is called. + Import Importer + + // If Sizes != nil, it provides the sizing functions for package unsafe. + // Otherwise &StdSizes{WordSize: 8, MaxAlign: 8} is used instead. + Sizes Sizes + + // If DisableUnusedImportCheck is set, packages are not checked + // for unused imports. + DisableUnusedImportCheck bool +} + +// DefaultImport is the default importer invoked if Config.Import == nil. +// The declaration: +// +// import _ "golang.org/x/tools/go/gcimporter" +// +// in a client of go/types will initialize DefaultImport to gcimporter.Import. +var DefaultImport Importer + +// Info holds result type information for a type-checked package. +// Only the information for which a map is provided is collected. +// If the package has type errors, the collected information may +// be incomplete. +type Info struct { + // Types maps expressions to their types, and for constant + // expressions, their values. Invalid expressions are omitted. + // + // For (possibly parenthesized) identifiers denoting built-in + // functions, the recorded signatures are call-site specific: + // if the call result is not a constant, the recorded type is + // an argument-specific signature. Otherwise, the recorded type + // is invalid. + // + // Identifiers on the lhs of declarations (i.e., the identifiers + // which are being declared) are collected in the Defs map. + // Identifiers denoting packages are collected in the Uses maps. + Types map[ast.Expr]TypeAndValue + + // Defs maps identifiers to the objects they define (including + // package names, dots "." of dot-imports, and blank "_" identifiers). + // For identifiers that do not denote objects (e.g., the package name + // in package clauses, or symbolic variables t in t := x.(type) of + // type switch headers), the corresponding objects are nil. + // + // For an anonymous field, Defs returns the field *Var it defines. + // + // Invariant: Defs[id] == nil || Defs[id].Pos() == id.Pos() + Defs map[*ast.Ident]Object + + // Uses maps identifiers to the objects they denote. + // + // For an anonymous field, Uses returns the *TypeName it denotes. + // + // Invariant: Uses[id].Pos() != id.Pos() + Uses map[*ast.Ident]Object + + // Implicits maps nodes to their implicitly declared objects, if any. + // The following node and object types may appear: + // + // node declared object + // + // *ast.ImportSpec *PkgName for dot-imports and imports without renames + // *ast.CaseClause type-specific *Var for each type switch case clause (incl. default) + // *ast.Field anonymous struct field or parameter *Var + // + Implicits map[ast.Node]Object + + // Selections maps selector expressions (excluding qualified identifiers) + // to their corresponding selections. + Selections map[*ast.SelectorExpr]*Selection + + // Scopes maps ast.Nodes to the scopes they define. Package scopes are not + // associated with a specific node but with all files belonging to a package. + // Thus, the package scope can be found in the type-checked Package object. + // Scopes nest, with the Universe scope being the outermost scope, enclosing + // the package scope, which contains (one or more) files scopes, which enclose + // function scopes which in turn enclose statement and function literal scopes. + // Note that even though package-level functions are declared in the package + // scope, the function scopes are embedded in the file scope of the file + // containing the function declaration. + // + // The following node types may appear in Scopes: + // + // *ast.File + // *ast.FuncType + // *ast.BlockStmt + // *ast.IfStmt + // *ast.SwitchStmt + // *ast.TypeSwitchStmt + // *ast.CaseClause + // *ast.CommClause + // *ast.ForStmt + // *ast.RangeStmt + // + Scopes map[ast.Node]*Scope + + // InitOrder is the list of package-level initializers in the order in which + // they must be executed. Initializers referring to variables related by an + // initialization dependency appear in topological order, the others appear + // in source order. Variables without an initialization expression do not + // appear in this list. + InitOrder []*Initializer +} + +// TypeOf returns the type of expression e, or nil if not found. +// Precondition: the Types, Uses and Defs maps are populated. +// +func (info *Info) TypeOf(e ast.Expr) Type { + if t, ok := info.Types[e]; ok { + return t.Type + } + if id, _ := e.(*ast.Ident); id != nil { + if obj := info.ObjectOf(id); obj != nil { + return obj.Type() + } + } + return nil +} + +// ObjectOf returns the object denoted by the specified id, +// or nil if not found. +// +// If id is an anonymous struct field, ObjectOf returns the field (*Var) +// it uses, not the type (*TypeName) it defines. +// +// Precondition: the Uses and Defs maps are populated. +// +func (info *Info) ObjectOf(id *ast.Ident) Object { + if obj, _ := info.Defs[id]; obj != nil { + return obj + } + return info.Uses[id] +} + +// TypeAndValue reports the type and value (for constants) +// of the corresponding expression. +type TypeAndValue struct { + mode operandMode + Type Type + Value exact.Value +} + +// TODO(gri) Consider eliminating the IsVoid predicate. Instead, report +// "void" values as regular values but with the empty tuple type. + +// IsVoid reports whether the corresponding expression +// is a function call without results. +func (tv TypeAndValue) IsVoid() bool { + return tv.mode == novalue +} + +// IsType reports whether the corresponding expression specifies a type. +func (tv TypeAndValue) IsType() bool { + return tv.mode == typexpr +} + +// IsBuiltin reports whether the corresponding expression denotes +// a (possibly parenthesized) built-in function. +func (tv TypeAndValue) IsBuiltin() bool { + return tv.mode == builtin +} + +// IsValue reports whether the corresponding expression is a value. +// Builtins are not considered values. Constant values have a non- +// nil Value. +func (tv TypeAndValue) IsValue() bool { + switch tv.mode { + case constant, variable, mapindex, value, commaok: + return true + } + return false +} + +// IsNil reports whether the corresponding expression denotes the +// predeclared value nil. +func (tv TypeAndValue) IsNil() bool { + return tv.mode == value && tv.Type == Typ[UntypedNil] +} + +// Addressable reports whether the corresponding expression +// is addressable (http://golang.org/ref/spec#Address_operators). +func (tv TypeAndValue) Addressable() bool { + return tv.mode == variable +} + +// Assignable reports whether the corresponding expression +// is assignable to (provided a value of the right type). +func (tv TypeAndValue) Assignable() bool { + return tv.mode == variable || tv.mode == mapindex +} + +// HasOk reports whether the corresponding expression may be +// used on the lhs of a comma-ok assignment. +func (tv TypeAndValue) HasOk() bool { + return tv.mode == commaok || tv.mode == mapindex +} + +// An Initializer describes a package-level variable, or a list of variables in case +// of a multi-valued initialization expression, and the corresponding initialization +// expression. +type Initializer struct { + Lhs []*Var // var Lhs = Rhs + Rhs ast.Expr +} + +func (init *Initializer) String() string { + var buf bytes.Buffer + for i, lhs := range init.Lhs { + if i > 0 { + buf.WriteString(", ") + } + buf.WriteString(lhs.Name()) + } + buf.WriteString(" = ") + WriteExpr(&buf, init.Rhs) + return buf.String() +} + +// Check type-checks a package and returns the resulting package object, +// the first error if any, and if info != nil, additional type information. +// The package is marked as complete if no errors occurred, otherwise it is +// incomplete. See Config.Error for controlling behavior in the presence of +// errors. +// +// The package is specified by a list of *ast.Files and corresponding +// file set, and the package path the package is identified with. +// The clean path must not be empty or dot ("."). +func (conf *Config) Check(path string, fset *token.FileSet, files []*ast.File, info *Info) (*Package, error) { + pkg := NewPackage(path, "") + return pkg, NewChecker(conf, fset, pkg, info).Files(files) +} + +// AssertableTo reports whether a value of type V can be asserted to have type T. +func AssertableTo(V *Interface, T Type) bool { + m, _ := assertableTo(V, T) + return m == nil +} + +// AssignableTo reports whether a value of type V is assignable to a variable of type T. +func AssignableTo(V, T Type) bool { + x := operand{mode: value, typ: V} + return x.assignableTo(nil, T) // config not needed for non-constant x +} + +// ConvertibleTo reports whether a value of type V is convertible to a value of type T. +func ConvertibleTo(V, T Type) bool { + x := operand{mode: value, typ: V} + return x.convertibleTo(nil, T) // config not needed for non-constant x +} + +// Implements reports whether type V implements interface T. +func Implements(V Type, T *Interface) bool { + f, _ := MissingMethod(V, T, true) + return f == nil +} diff --git a/vendor/golang.org/x/tools/go/types/api_test.go b/vendor/golang.org/x/tools/go/types/api_test.go new file mode 100644 index 0000000000..5a0535f5b6 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/api_test.go @@ -0,0 +1,1060 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package types_test + +import ( + "bytes" + "fmt" + "go/ast" + "go/parser" + "go/token" + "reflect" + "regexp" + "runtime" + "strings" + "testing" + + _ "golang.org/x/tools/go/gcimporter" + . "golang.org/x/tools/go/types" +) + +// skipSpecialPlatforms causes the test to be skipped for platforms where +// builders (build.golang.org) don't have access to compiled packages for +// import. +func skipSpecialPlatforms(t *testing.T) { + switch platform := runtime.GOOS + "-" + runtime.GOARCH; platform { + case "android-arm", + "nacl-amd64p32", + "nacl-386", + "nacl-arm", + "darwin-arm", + "darwin-arm64": + t.Skipf("no compiled packages available for import on %s", platform) + } +} + +func pkgFor(path, source string, info *Info) (*Package, error) { + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, path, source, 0) + if err != nil { + return nil, err + } + + var conf Config + return conf.Check(f.Name.Name, fset, []*ast.File{f}, info) +} + +func mustTypecheck(t *testing.T, path, source string, info *Info) string { + pkg, err := pkgFor(path, source, info) + if err != nil { + name := path + if pkg != nil { + name = "package " + pkg.Name() + } + t.Fatalf("%s: didn't type-check (%s)", name, err) + } + return pkg.Name() +} + +func TestValuesInfo(t *testing.T) { + var tests = []struct { + src string + expr string // constant expression + typ string // constant type + val string // constant value + }{ + {`package a0; const _ = false`, `false`, `untyped bool`, `false`}, + {`package a1; const _ = 0`, `0`, `untyped int`, `0`}, + {`package a2; const _ = 'A'`, `'A'`, `untyped rune`, `65`}, + {`package a3; const _ = 0.`, `0.`, `untyped float`, `0`}, + {`package a4; const _ = 0i`, `0i`, `untyped complex`, `0`}, + {`package a5; const _ = "foo"`, `"foo"`, `untyped string`, `"foo"`}, + + {`package b0; var _ = false`, `false`, `bool`, `false`}, + {`package b1; var _ = 0`, `0`, `int`, `0`}, + {`package b2; var _ = 'A'`, `'A'`, `rune`, `65`}, + {`package b3; var _ = 0.`, `0.`, `float64`, `0`}, + {`package b4; var _ = 0i`, `0i`, `complex128`, `0`}, + {`package b5; var _ = "foo"`, `"foo"`, `string`, `"foo"`}, + + {`package c0a; var _ = bool(false)`, `false`, `bool`, `false`}, + {`package c0b; var _ = bool(false)`, `bool(false)`, `bool`, `false`}, + {`package c0c; type T bool; var _ = T(false)`, `T(false)`, `c0c.T`, `false`}, + + {`package c1a; var _ = int(0)`, `0`, `int`, `0`}, + {`package c1b; var _ = int(0)`, `int(0)`, `int`, `0`}, + {`package c1c; type T int; var _ = T(0)`, `T(0)`, `c1c.T`, `0`}, + + {`package c2a; var _ = rune('A')`, `'A'`, `rune`, `65`}, + {`package c2b; var _ = rune('A')`, `rune('A')`, `rune`, `65`}, + {`package c2c; type T rune; var _ = T('A')`, `T('A')`, `c2c.T`, `65`}, + + {`package c3a; var _ = float32(0.)`, `0.`, `float32`, `0`}, + {`package c3b; var _ = float32(0.)`, `float32(0.)`, `float32`, `0`}, + {`package c3c; type T float32; var _ = T(0.)`, `T(0.)`, `c3c.T`, `0`}, + + {`package c4a; var _ = complex64(0i)`, `0i`, `complex64`, `0`}, + {`package c4b; var _ = complex64(0i)`, `complex64(0i)`, `complex64`, `0`}, + {`package c4c; type T complex64; var _ = T(0i)`, `T(0i)`, `c4c.T`, `0`}, + + {`package c5a; var _ = string("foo")`, `"foo"`, `string`, `"foo"`}, + {`package c5b; var _ = string("foo")`, `string("foo")`, `string`, `"foo"`}, + {`package c5c; type T string; var _ = T("foo")`, `T("foo")`, `c5c.T`, `"foo"`}, + + {`package d0; var _ = []byte("foo")`, `"foo"`, `string`, `"foo"`}, + {`package d1; var _ = []byte(string("foo"))`, `"foo"`, `string`, `"foo"`}, + {`package d2; var _ = []byte(string("foo"))`, `string("foo")`, `string`, `"foo"`}, + {`package d3; type T []byte; var _ = T("foo")`, `"foo"`, `string`, `"foo"`}, + + {`package e0; const _ = float32( 1e-200)`, `float32(1e-200)`, `float32`, `0`}, + {`package e1; const _ = float32(-1e-200)`, `float32(-1e-200)`, `float32`, `0`}, + {`package e2; const _ = float64( 1e-2000)`, `float64(1e-2000)`, `float64`, `0`}, + {`package e3; const _ = float64(-1e-2000)`, `float64(-1e-2000)`, `float64`, `0`}, + {`package e4; const _ = complex64( 1e-200)`, `complex64(1e-200)`, `complex64`, `0`}, + {`package e5; const _ = complex64(-1e-200)`, `complex64(-1e-200)`, `complex64`, `0`}, + {`package e6; const _ = complex128( 1e-2000)`, `complex128(1e-2000)`, `complex128`, `0`}, + {`package e7; const _ = complex128(-1e-2000)`, `complex128(-1e-2000)`, `complex128`, `0`}, + + {`package f0 ; var _ float32 = 1e-200`, `1e-200`, `float32`, `0`}, + {`package f1 ; var _ float32 = -1e-200`, `-1e-200`, `float32`, `0`}, + {`package f2a; var _ float64 = 1e-2000`, `1e-2000`, `float64`, `0`}, + {`package f3a; var _ float64 = -1e-2000`, `-1e-2000`, `float64`, `0`}, + {`package f2b; var _ = 1e-2000`, `1e-2000`, `float64`, `0`}, + {`package f3b; var _ = -1e-2000`, `-1e-2000`, `float64`, `0`}, + {`package f4 ; var _ complex64 = 1e-200 `, `1e-200`, `complex64`, `0`}, + {`package f5 ; var _ complex64 = -1e-200 `, `-1e-200`, `complex64`, `0`}, + {`package f6a; var _ complex128 = 1e-2000i`, `1e-2000i`, `complex128`, `0`}, + {`package f7a; var _ complex128 = -1e-2000i`, `-1e-2000i`, `complex128`, `0`}, + {`package f6b; var _ = 1e-2000i`, `1e-2000i`, `complex128`, `0`}, + {`package f7b; var _ = -1e-2000i`, `-1e-2000i`, `complex128`, `0`}, + } + + for _, test := range tests { + info := Info{ + Types: make(map[ast.Expr]TypeAndValue), + } + name := mustTypecheck(t, "ValuesInfo", test.src, &info) + + // look for constant expression + var expr ast.Expr + for e := range info.Types { + if ExprString(e) == test.expr { + expr = e + break + } + } + if expr == nil { + t.Errorf("package %s: no expression found for %s", name, test.expr) + continue + } + tv := info.Types[expr] + + // check that type is correct + if got := tv.Type.String(); got != test.typ { + t.Errorf("package %s: got type %s; want %s", name, got, test.typ) + continue + } + + // check that value is correct + if got := tv.Value.String(); got != test.val { + t.Errorf("package %s: got value %s; want %s", name, got, test.val) + } + } +} + +func TestTypesInfo(t *testing.T) { + var tests = []struct { + src string + expr string // expression + typ string // value type + }{ + // single-valued expressions of untyped constants + {`package b0; var x interface{} = false`, `false`, `bool`}, + {`package b1; var x interface{} = 0`, `0`, `int`}, + {`package b2; var x interface{} = 0.`, `0.`, `float64`}, + {`package b3; var x interface{} = 0i`, `0i`, `complex128`}, + {`package b4; var x interface{} = "foo"`, `"foo"`, `string`}, + + // comma-ok expressions + {`package p0; var x interface{}; var _, _ = x.(int)`, + `x.(int)`, + `(int, bool)`, + }, + {`package p1; var x interface{}; func _() { _, _ = x.(int) }`, + `x.(int)`, + `(int, bool)`, + }, + // TODO(gri): uncomment if we accept issue 8189. + // {`package p2; type mybool bool; var m map[string]complex128; var b mybool; func _() { _, b = m["foo"] }`, + // `m["foo"]`, + // `(complex128, p2.mybool)`, + // }, + // TODO(gri): remove if we accept issue 8189. + {`package p2; var m map[string]complex128; var b bool; func _() { _, b = m["foo"] }`, + `m["foo"]`, + `(complex128, bool)`, + }, + {`package p3; var c chan string; var _, _ = <-c`, + `<-c`, + `(string, bool)`, + }, + + // issue 6796 + {`package issue6796_a; var x interface{}; var _, _ = (x.(int))`, + `x.(int)`, + `(int, bool)`, + }, + {`package issue6796_b; var c chan string; var _, _ = (<-c)`, + `(<-c)`, + `(string, bool)`, + }, + {`package issue6796_c; var c chan string; var _, _ = (<-c)`, + `<-c`, + `(string, bool)`, + }, + {`package issue6796_d; var c chan string; var _, _ = ((<-c))`, + `(<-c)`, + `(string, bool)`, + }, + {`package issue6796_e; func f(c chan string) { _, _ = ((<-c)) }`, + `(<-c)`, + `(string, bool)`, + }, + + // issue 7060 + {`package issue7060_a; var ( m map[int]string; x, ok = m[0] )`, + `m[0]`, + `(string, bool)`, + }, + {`package issue7060_b; var ( m map[int]string; x, ok interface{} = m[0] )`, + `m[0]`, + `(string, bool)`, + }, + {`package issue7060_c; func f(x interface{}, ok bool, m map[int]string) { x, ok = m[0] }`, + `m[0]`, + `(string, bool)`, + }, + {`package issue7060_d; var ( ch chan string; x, ok = <-ch )`, + `<-ch`, + `(string, bool)`, + }, + {`package issue7060_e; var ( ch chan string; x, ok interface{} = <-ch )`, + `<-ch`, + `(string, bool)`, + }, + {`package issue7060_f; func f(x interface{}, ok bool, ch chan string) { x, ok = <-ch }`, + `<-ch`, + `(string, bool)`, + }, + } + + for _, test := range tests { + info := Info{Types: make(map[ast.Expr]TypeAndValue)} + name := mustTypecheck(t, "TypesInfo", test.src, &info) + + // look for expression type + var typ Type + for e, tv := range info.Types { + if ExprString(e) == test.expr { + typ = tv.Type + break + } + } + if typ == nil { + t.Errorf("package %s: no type found for %s", name, test.expr) + continue + } + + // check that type is correct + if got := typ.String(); got != test.typ { + t.Errorf("package %s: got %s; want %s", name, got, test.typ) + } + } +} + +func predString(tv TypeAndValue) string { + var buf bytes.Buffer + pred := func(b bool, s string) { + if b { + if buf.Len() > 0 { + buf.WriteString(", ") + } + buf.WriteString(s) + } + } + + pred(tv.IsVoid(), "void") + pred(tv.IsType(), "type") + pred(tv.IsBuiltin(), "builtin") + pred(tv.IsValue() && tv.Value != nil, "const") + pred(tv.IsValue() && tv.Value == nil, "value") + pred(tv.IsNil(), "nil") + pred(tv.Addressable(), "addressable") + pred(tv.Assignable(), "assignable") + pred(tv.HasOk(), "hasOk") + + if buf.Len() == 0 { + return "invalid" + } + return buf.String() +} + +func TestPredicatesInfo(t *testing.T) { + skipSpecialPlatforms(t) + + var tests = []struct { + src string + expr string + pred string + }{ + // void + {`package n0; func f() { f() }`, `f()`, `void`}, + + // types + {`package t0; type _ int`, `int`, `type`}, + {`package t1; type _ []int`, `[]int`, `type`}, + {`package t2; type _ func()`, `func()`, `type`}, + + // built-ins + {`package b0; var _ = len("")`, `len`, `builtin`}, + {`package b1; var _ = (len)("")`, `(len)`, `builtin`}, + + // constants + {`package c0; var _ = 42`, `42`, `const`}, + {`package c1; var _ = "foo" + "bar"`, `"foo" + "bar"`, `const`}, + {`package c2; const (i = 1i; _ = i)`, `i`, `const`}, + + // values + {`package v0; var (a, b int; _ = a + b)`, `a + b`, `value`}, + {`package v1; var _ = &[]int{1}`, `([]int literal)`, `value`}, + {`package v2; var _ = func(){}`, `(func() literal)`, `value`}, + {`package v4; func f() { _ = f }`, `f`, `value`}, + {`package v3; var _ *int = nil`, `nil`, `value, nil`}, + {`package v3; var _ *int = (nil)`, `(nil)`, `value, nil`}, + + // addressable (and thus assignable) operands + {`package a0; var (x int; _ = x)`, `x`, `value, addressable, assignable`}, + {`package a1; var (p *int; _ = *p)`, `*p`, `value, addressable, assignable`}, + {`package a2; var (s []int; _ = s[0])`, `s[0]`, `value, addressable, assignable`}, + {`package a3; var (s struct{f int}; _ = s.f)`, `s.f`, `value, addressable, assignable`}, + {`package a4; var (a [10]int; _ = a[0])`, `a[0]`, `value, addressable, assignable`}, + {`package a5; func _(x int) { _ = x }`, `x`, `value, addressable, assignable`}, + {`package a6; func _()(x int) { _ = x; return }`, `x`, `value, addressable, assignable`}, + {`package a7; type T int; func (x T) _() { _ = x }`, `x`, `value, addressable, assignable`}, + // composite literals are not addressable + + // assignable but not addressable values + {`package s0; var (m map[int]int; _ = m[0])`, `m[0]`, `value, assignable, hasOk`}, + {`package s1; var (m map[int]int; _, _ = m[0])`, `m[0]`, `value, assignable, hasOk`}, + + // hasOk expressions + {`package k0; var (ch chan int; _ = <-ch)`, `<-ch`, `value, hasOk`}, + {`package k1; var (ch chan int; _, _ = <-ch)`, `<-ch`, `value, hasOk`}, + + // missing entries + // - package names are collected in the Uses map + // - identifiers being declared are collected in the Defs map + {`package m0; import "os"; func _() { _ = os.Stdout }`, `os`, ``}, + {`package m1; import p "os"; func _() { _ = p.Stdout }`, `p`, ``}, + {`package m2; const c = 0`, `c`, ``}, + {`package m3; type T int`, `T`, ``}, + {`package m4; var v int`, `v`, ``}, + {`package m5; func f() {}`, `f`, ``}, + {`package m6; func _(x int) {}`, `x`, ``}, + {`package m6; func _()(x int) { return }`, `x`, ``}, + {`package m6; type T int; func (x T) _() {}`, `x`, ``}, + } + + for _, test := range tests { + info := Info{Types: make(map[ast.Expr]TypeAndValue)} + name := mustTypecheck(t, "PredicatesInfo", test.src, &info) + + // look for expression predicates + got := "" + for e, tv := range info.Types { + //println(name, ExprString(e)) + if ExprString(e) == test.expr { + got = predString(tv) + break + } + } + + if got != test.pred { + t.Errorf("package %s: got %s; want %s", name, got, test.pred) + } + } +} + +func TestScopesInfo(t *testing.T) { + skipSpecialPlatforms(t) + + var tests = []struct { + src string + scopes []string // list of scope descriptors of the form kind:varlist + }{ + {`package p0`, []string{ + "file:", + }}, + {`package p1; import ( "fmt"; m "math"; _ "os" ); var ( _ = fmt.Println; _ = m.Pi )`, []string{ + "file:fmt m", + }}, + {`package p2; func _() {}`, []string{ + "file:", "func:", + }}, + {`package p3; func _(x, y int) {}`, []string{ + "file:", "func:x y", + }}, + {`package p4; func _(x, y int) { x, z := 1, 2; _ = z }`, []string{ + "file:", "func:x y z", // redeclaration of x + }}, + {`package p5; func _(x, y int) (u, _ int) { return }`, []string{ + "file:", "func:u x y", + }}, + {`package p6; func _() { { var x int; _ = x } }`, []string{ + "file:", "func:", "block:x", + }}, + {`package p7; func _() { if true {} }`, []string{ + "file:", "func:", "if:", "block:", + }}, + {`package p8; func _() { if x := 0; x < 0 { y := x; _ = y } }`, []string{ + "file:", "func:", "if:x", "block:y", + }}, + {`package p9; func _() { switch x := 0; x {} }`, []string{ + "file:", "func:", "switch:x", + }}, + {`package p10; func _() { switch x := 0; x { case 1: y := x; _ = y; default: }}`, []string{ + "file:", "func:", "switch:x", "case:y", "case:", + }}, + {`package p11; func _(t interface{}) { switch t.(type) {} }`, []string{ + "file:", "func:t", "type switch:", + }}, + {`package p12; func _(t interface{}) { switch t := t; t.(type) {} }`, []string{ + "file:", "func:t", "type switch:t", + }}, + {`package p13; func _(t interface{}) { switch x := t.(type) { case int: _ = x } }`, []string{ + "file:", "func:t", "type switch:", "case:x", // x implicitly declared + }}, + {`package p14; func _() { select{} }`, []string{ + "file:", "func:", + }}, + {`package p15; func _(c chan int) { select{ case <-c: } }`, []string{ + "file:", "func:c", "comm:", + }}, + {`package p16; func _(c chan int) { select{ case i := <-c: x := i; _ = x} }`, []string{ + "file:", "func:c", "comm:i x", + }}, + {`package p17; func _() { for{} }`, []string{ + "file:", "func:", "for:", "block:", + }}, + {`package p18; func _(n int) { for i := 0; i < n; i++ { _ = i } }`, []string{ + "file:", "func:n", "for:i", "block:", + }}, + {`package p19; func _(a []int) { for i := range a { _ = i} }`, []string{ + "file:", "func:a", "range:i", "block:", + }}, + {`package p20; var s int; func _(a []int) { for i, x := range a { s += x; _ = i } }`, []string{ + "file:", "func:a", "range:i x", "block:", + }}, + } + + for _, test := range tests { + info := Info{Scopes: make(map[ast.Node]*Scope)} + name := mustTypecheck(t, "ScopesInfo", test.src, &info) + + // number of scopes must match + if len(info.Scopes) != len(test.scopes) { + t.Errorf("package %s: got %d scopes; want %d", name, len(info.Scopes), len(test.scopes)) + } + + // scope descriptions must match + for node, scope := range info.Scopes { + kind := "" + switch node.(type) { + case *ast.File: + kind = "file" + case *ast.FuncType: + kind = "func" + case *ast.BlockStmt: + kind = "block" + case *ast.IfStmt: + kind = "if" + case *ast.SwitchStmt: + kind = "switch" + case *ast.TypeSwitchStmt: + kind = "type switch" + case *ast.CaseClause: + kind = "case" + case *ast.CommClause: + kind = "comm" + case *ast.ForStmt: + kind = "for" + case *ast.RangeStmt: + kind = "range" + } + + // look for matching scope description + desc := kind + ":" + strings.Join(scope.Names(), " ") + found := false + for _, d := range test.scopes { + if desc == d { + found = true + break + } + } + if !found { + t.Errorf("package %s: no matching scope found for %s", name, desc) + } + } + } +} + +func TestInitOrderInfo(t *testing.T) { + var tests = []struct { + src string + inits []string + }{ + {`package p0; var (x = 1; y = x)`, []string{ + "x = 1", "y = x", + }}, + {`package p1; var (a = 1; b = 2; c = 3)`, []string{ + "a = 1", "b = 2", "c = 3", + }}, + {`package p2; var (a, b, c = 1, 2, 3)`, []string{ + "a = 1", "b = 2", "c = 3", + }}, + {`package p3; var _ = f(); func f() int { return 1 }`, []string{ + "_ = f()", // blank var + }}, + {`package p4; var (a = 0; x = y; y = z; z = 0)`, []string{ + "a = 0", "z = 0", "y = z", "x = y", + }}, + {`package p5; var (a, _ = m[0]; m map[int]string)`, []string{ + "a, _ = m[0]", // blank var + }}, + {`package p6; var a, b = f(); func f() (_, _ int) { return z, z }; var z = 0`, []string{ + "z = 0", "a, b = f()", + }}, + {`package p7; var (a = func() int { return b }(); b = 1)`, []string{ + "b = 1", "a = (func() int literal)()", + }}, + {`package p8; var (a, b = func() (_, _ int) { return c, c }(); c = 1)`, []string{ + "c = 1", "a, b = (func() (_, _ int) literal)()", + }}, + {`package p9; type T struct{}; func (T) m() int { _ = y; return 0 }; var x, y = T.m, 1`, []string{ + "y = 1", "x = T.m", + }}, + {`package p10; var (d = c + b; a = 0; b = 0; c = 0)`, []string{ + "a = 0", "b = 0", "c = 0", "d = c + b", + }}, + {`package p11; var (a = e + c; b = d + c; c = 0; d = 0; e = 0)`, []string{ + "c = 0", "d = 0", "b = d + c", "e = 0", "a = e + c", + }}, + // emit an initializer for n:1 initializations only once (not for each node + // on the lhs which may appear in different order in the dependency graph) + {`package p12; var (a = x; b = 0; x, y = m[0]; m map[int]int)`, []string{ + "b = 0", "x, y = m[0]", "a = x", + }}, + // test case from spec section on package initialization + {`package p12 + + var ( + a = c + b + b = f() + c = f() + d = 3 + ) + + func f() int { + d++ + return d + }`, []string{ + "d = 3", "b = f()", "c = f()", "a = c + b", + }}, + // test case for issue 7131 + {`package main + + var counter int + func next() int { counter++; return counter } + + var _ = makeOrder() + func makeOrder() []int { return []int{f, b, d, e, c, a} } + + var a = next() + var b, c = next(), next() + var d, e, f = next(), next(), next() + `, []string{ + "a = next()", "b = next()", "c = next()", "d = next()", "e = next()", "f = next()", "_ = makeOrder()", + }}, + } + + for _, test := range tests { + info := Info{} + name := mustTypecheck(t, "InitOrderInfo", test.src, &info) + + // number of initializers must match + if len(info.InitOrder) != len(test.inits) { + t.Errorf("package %s: got %d initializers; want %d", name, len(info.InitOrder), len(test.inits)) + continue + } + + // initializers must match + for i, want := range test.inits { + got := info.InitOrder[i].String() + if got != want { + t.Errorf("package %s, init %d: got %s; want %s", name, i, got, want) + continue + } + } + } +} + +func TestMultiFileInitOrder(t *testing.T) { + fset := token.NewFileSet() + mustParse := func(src string) *ast.File { + f, err := parser.ParseFile(fset, "main", src, 0) + if err != nil { + t.Fatal(err) + } + return f + } + + fileA := mustParse(`package main; var a = 1`) + fileB := mustParse(`package main; var b = 2`) + + // The initialization order must not depend on the parse + // order of the files, only on the presentation order to + // the type-checker. + for _, test := range []struct { + files []*ast.File + want string + }{ + {[]*ast.File{fileA, fileB}, "[a = 1 b = 2]"}, + {[]*ast.File{fileB, fileA}, "[b = 2 a = 1]"}, + } { + var info Info + if _, err := new(Config).Check("main", fset, test.files, &info); err != nil { + t.Fatal(err) + } + if got := fmt.Sprint(info.InitOrder); got != test.want { + t.Fatalf("got %s; want %s", got, test.want) + } + } +} + +func TestFiles(t *testing.T) { + var sources = []string{ + "package p; type T struct{}; func (T) m1() {}", + "package p; func (T) m2() {}; var x interface{ m1(); m2() } = T{}", + "package p; func (T) m3() {}; var y interface{ m1(); m2(); m3() } = T{}", + "package p", + } + + var conf Config + fset := token.NewFileSet() + pkg := NewPackage("p", "p") + var info Info + check := NewChecker(&conf, fset, pkg, &info) + + for i, src := range sources { + filename := fmt.Sprintf("sources%d", i) + f, err := parser.ParseFile(fset, filename, src, 0) + if err != nil { + t.Fatal(err) + } + if err := check.Files([]*ast.File{f}); err != nil { + t.Error(err) + } + } + + // check InitOrder is [x y] + var vars []string + for _, init := range info.InitOrder { + for _, v := range init.Lhs { + vars = append(vars, v.Name()) + } + } + if got, want := fmt.Sprint(vars), "[x y]"; got != want { + t.Errorf("InitOrder == %s, want %s", got, want) + } +} + +func TestSelection(t *testing.T) { + selections := make(map[*ast.SelectorExpr]*Selection) + + fset := token.NewFileSet() + conf := Config{ + Packages: make(map[string]*Package), + Import: func(imports map[string]*Package, path string) (*Package, error) { + return imports[path], nil + }, + } + makePkg := func(path, src string) { + f, err := parser.ParseFile(fset, path+".go", src, 0) + if err != nil { + t.Fatal(err) + } + pkg, err := conf.Check(path, fset, []*ast.File{f}, &Info{Selections: selections}) + if err != nil { + t.Fatal(err) + } + conf.Packages[path] = pkg + } + + const libSrc = ` +package lib +type T float64 +const C T = 3 +var V T +func F() {} +func (T) M() {} +` + const mainSrc = ` +package main +import "lib" + +type A struct { + *B + C +} + +type B struct { + b int +} + +func (B) f(int) + +type C struct { + c int +} + +func (C) g() +func (*C) h() + +func main() { + // qualified identifiers + var _ lib.T + _ = lib.C + _ = lib.F + _ = lib.V + _ = lib.T.M + + // fields + _ = A{}.B + _ = new(A).B + + _ = A{}.C + _ = new(A).C + + _ = A{}.b + _ = new(A).b + + _ = A{}.c + _ = new(A).c + + // methods + _ = A{}.f + _ = new(A).f + _ = A{}.g + _ = new(A).g + _ = new(A).h + + _ = B{}.f + _ = new(B).f + + _ = C{}.g + _ = new(C).g + _ = new(C).h + + // method expressions + _ = A.f + _ = (*A).f + _ = B.f + _ = (*B).f +}` + + wantOut := map[string][2]string{ + "lib.T.M": {"method expr (lib.T) M(lib.T)", ".[0]"}, + + "A{}.B": {"field (main.A) B *main.B", ".[0]"}, + "new(A).B": {"field (*main.A) B *main.B", "->[0]"}, + "A{}.C": {"field (main.A) C main.C", ".[1]"}, + "new(A).C": {"field (*main.A) C main.C", "->[1]"}, + "A{}.b": {"field (main.A) b int", "->[0 0]"}, + "new(A).b": {"field (*main.A) b int", "->[0 0]"}, + "A{}.c": {"field (main.A) c int", ".[1 0]"}, + "new(A).c": {"field (*main.A) c int", "->[1 0]"}, + + "A{}.f": {"method (main.A) f(int)", "->[0 0]"}, + "new(A).f": {"method (*main.A) f(int)", "->[0 0]"}, + "A{}.g": {"method (main.A) g()", ".[1 0]"}, + "new(A).g": {"method (*main.A) g()", "->[1 0]"}, + "new(A).h": {"method (*main.A) h()", "->[1 1]"}, // TODO(gri) should this report .[1 1] ? + "B{}.f": {"method (main.B) f(int)", ".[0]"}, + "new(B).f": {"method (*main.B) f(int)", "->[0]"}, + "C{}.g": {"method (main.C) g()", ".[0]"}, + "new(C).g": {"method (*main.C) g()", "->[0]"}, + "new(C).h": {"method (*main.C) h()", "->[1]"}, // TODO(gri) should this report .[1] ? + + "A.f": {"method expr (main.A) f(main.A, int)", "->[0 0]"}, + "(*A).f": {"method expr (*main.A) f(*main.A, int)", "->[0 0]"}, + "B.f": {"method expr (main.B) f(main.B, int)", ".[0]"}, + "(*B).f": {"method expr (*main.B) f(*main.B, int)", "->[0]"}, + } + + makePkg("lib", libSrc) + makePkg("main", mainSrc) + + for e, sel := range selections { + sel.String() // assertion: must not panic + + start := fset.Position(e.Pos()).Offset + end := fset.Position(e.End()).Offset + syntax := mainSrc[start:end] // (all SelectorExprs are in main, not lib) + + direct := "." + if sel.Indirect() { + direct = "->" + } + got := [2]string{ + sel.String(), + fmt.Sprintf("%s%v", direct, sel.Index()), + } + want := wantOut[syntax] + if want != got { + t.Errorf("%s: got %q; want %q", syntax, got, want) + } + delete(wantOut, syntax) + + // We must explicitly assert properties of the + // Signature's receiver since it doesn't participate + // in Identical() or String(). + sig, _ := sel.Type().(*Signature) + if sel.Kind() == MethodVal { + got := sig.Recv().Type() + want := sel.Recv() + if !Identical(got, want) { + t.Errorf("%s: Recv() = %s, want %s", syntax, got, want) + } + } else if sig != nil && sig.Recv() != nil { + t.Errorf("%s: signature has receiver %s", sig, sig.Recv().Type()) + } + } + // Assert that all wantOut entries were used exactly once. + for syntax := range wantOut { + t.Errorf("no ast.Selection found with syntax %q", syntax) + } +} + +func TestIssue8518(t *testing.T) { + fset := token.NewFileSet() + conf := Config{ + Packages: make(map[string]*Package), + Error: func(err error) { t.Log(err) }, // don't exit after first error + Import: func(imports map[string]*Package, path string) (*Package, error) { + return imports[path], nil + }, + } + makePkg := func(path, src string) { + f, err := parser.ParseFile(fset, path, src, 0) + if err != nil { + t.Fatal(err) + } + pkg, _ := conf.Check(path, fset, []*ast.File{f}, nil) // errors logged via conf.Error + conf.Packages[path] = pkg + } + + const libSrc = ` +package a +import "missing" +const C1 = foo +const C2 = missing.C +` + + const mainSrc = ` +package main +import "a" +var _ = a.C1 +var _ = a.C2 +` + + makePkg("a", libSrc) + makePkg("main", mainSrc) // don't crash when type-checking this package +} + +func TestLookupFieldOrMethod(t *testing.T) { + // Test cases assume a lookup of the form a.f or x.f, where a stands for an + // addressable value, and x for a non-addressable value (even though a variable + // for ease of test case writing). + var tests = []struct { + src string + found bool + index []int + indirect bool + }{ + // field lookups + {"var x T; type T struct{}", false, nil, false}, + {"var x T; type T struct{ f int }", true, []int{0}, false}, + {"var x T; type T struct{ a, b, f, c int }", true, []int{2}, false}, + + // method lookups + {"var a T; type T struct{}; func (T) f() {}", true, []int{0}, false}, + {"var a *T; type T struct{}; func (T) f() {}", true, []int{0}, true}, + {"var a T; type T struct{}; func (*T) f() {}", true, []int{0}, false}, + {"var a *T; type T struct{}; func (*T) f() {}", true, []int{0}, true}, // TODO(gri) should this report indirect = false? + + // collisions + {"type ( E1 struct{ f int }; E2 struct{ f int }; x struct{ E1; *E2 })", false, []int{1, 0}, false}, + {"type ( E1 struct{ f int }; E2 struct{}; x struct{ E1; *E2 }); func (E2) f() {}", false, []int{1, 0}, false}, + + // outside methodset + // (*T).f method exists, but value of type T is not addressable + {"var x T; type T struct{}; func (*T) f() {}", false, nil, true}, + } + + for _, test := range tests { + pkg, err := pkgFor("test", "package p;"+test.src, nil) + if err != nil { + t.Errorf("%s: incorrect test case: %s", test.src, err) + continue + } + + obj := pkg.Scope().Lookup("a") + if obj == nil { + if obj = pkg.Scope().Lookup("x"); obj == nil { + t.Errorf("%s: incorrect test case - no object a or x", test.src) + continue + } + } + + f, index, indirect := LookupFieldOrMethod(obj.Type(), obj.Name() == "a", pkg, "f") + if (f != nil) != test.found { + if f == nil { + t.Errorf("%s: got no object; want one", test.src) + } else { + t.Errorf("%s: got object = %v; want none", test.src, f) + } + } + if !sameSlice(index, test.index) { + t.Errorf("%s: got index = %v; want %v", test.src, index, test.index) + } + if indirect != test.indirect { + t.Errorf("%s: got indirect = %v; want %v", test.src, indirect, test.indirect) + } + } +} + +func sameSlice(a, b []int) bool { + if len(a) != len(b) { + return false + } + for i, x := range a { + if x != b[i] { + return false + } + } + return true +} + +// TestScopeLookupParent ensures that (*Scope).LookupParent returns +// the correct result at various positions with the source. +func TestScopeLookupParent(t *testing.T) { + fset := token.NewFileSet() + conf := Config{ + Packages: make(map[string]*Package), + Import: func(imports map[string]*Package, path string) (*Package, error) { + return imports[path], nil + }, + } + mustParse := func(src string) *ast.File { + f, err := parser.ParseFile(fset, "dummy.go", src, parser.ParseComments) + if err != nil { + t.Fatal(err) + } + return f + } + var info Info + makePkg := func(path string, files ...*ast.File) { + conf.Packages[path], _ = conf.Check(path, fset, files, &info) + } + + makePkg("lib", mustParse("package lib; var X int")) + // Each /*name=kind:line*/ comment makes the test look up the + // name at that point and checks that it resolves to a decl of + // the specified kind and line number. "undef" means undefined. + mainSrc := ` +package main +import "lib" +var Y = lib.X +func f() { + print(Y) /*Y=var:4*/ + z /*z=undef*/ := /*z=undef*/ 1 /*z=var:7*/ + print(z) + /*f=func:5*/ /*lib=pkgname:3*/ + type /*T=undef*/ T /*T=typename:10*/ *T +} +` + info.Uses = make(map[*ast.Ident]Object) + f := mustParse(mainSrc) + makePkg("main", f) + mainScope := conf.Packages["main"].Scope() + rx := regexp.MustCompile(`^/\*(\w*)=([\w:]*)\*/$`) + for _, group := range f.Comments { + for _, comment := range group.List { + // Parse the assertion in the comment. + m := rx.FindStringSubmatch(comment.Text) + if m == nil { + t.Errorf("%s: bad comment: %s", + fset.Position(comment.Pos()), comment.Text) + continue + } + name, want := m[1], m[2] + + // Look up the name in the innermost enclosing scope. + inner := mainScope.Innermost(comment.Pos()) + if inner == nil { + t.Errorf("%s: at %s: can't find innermost scope", + fset.Position(comment.Pos()), comment.Text) + continue + } + got := "undef" + if _, obj := inner.LookupParent(name, comment.Pos()); obj != nil { + kind := strings.ToLower(strings.TrimPrefix(reflect.TypeOf(obj).String(), "*types.")) + got = fmt.Sprintf("%s:%d", kind, fset.Position(obj.Pos()).Line) + } + if got != want { + t.Errorf("%s: at %s: %s resolved to %s, want %s", + fset.Position(comment.Pos()), comment.Text, name, got, want) + } + } + } + + // Check that for each referring identifier, + // a lookup of its name on the innermost + // enclosing scope returns the correct object. + + for id, wantObj := range info.Uses { + inner := mainScope.Innermost(id.Pos()) + if inner == nil { + t.Errorf("%s: can't find innermost scope enclosing %q", + fset.Position(id.Pos()), id.Name) + continue + } + + // Exclude selectors and qualified identifiers---lexical + // refs only. (Ideally, we'd see if the AST parent is a + // SelectorExpr, but that requires PathEnclosingInterval + // from golang.org/x/tools/go/ast/astutil.) + if id.Name == "X" { + continue + } + + _, gotObj := inner.LookupParent(id.Name, id.Pos()) + if gotObj != wantObj { + t.Errorf("%s: got %v, want %v", + fset.Position(id.Pos()), gotObj, wantObj) + continue + } + } +} diff --git a/vendor/golang.org/x/tools/go/types/assignments.go b/vendor/golang.org/x/tools/go/types/assignments.go new file mode 100644 index 0000000000..93b842eaa0 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/assignments.go @@ -0,0 +1,328 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements initialization and assignment checks. + +package types + +import ( + "go/ast" + "go/token" +) + +// assignment reports whether x can be assigned to a variable of type T, +// if necessary by attempting to convert untyped values to the appropriate +// type. If x.mode == invalid upon return, then assignment has already +// issued an error message and the caller doesn't have to report another. +// Use T == nil to indicate assignment to an untyped blank identifier. +// +// TODO(gri) Should find a better way to handle in-band errors. +// +func (check *Checker) assignment(x *operand, T Type) bool { + switch x.mode { + case invalid: + return true // error reported before + case constant, variable, mapindex, value, commaok: + // ok + default: + unreachable() + } + + // x must be a single value + // (tuple types are never named - no need for underlying type) + if t, _ := x.typ.(*Tuple); t != nil { + assert(t.Len() > 1) + check.errorf(x.pos(), "%d-valued expression %s used as single value", t.Len(), x) + x.mode = invalid + return false + } + + if isUntyped(x.typ) { + target := T + // spec: "If an untyped constant is assigned to a variable of interface + // type or the blank identifier, the constant is first converted to type + // bool, rune, int, float64, complex128 or string respectively, depending + // on whether the value is a boolean, rune, integer, floating-point, complex, + // or string constant." + if T == nil || IsInterface(T) { + if T == nil && x.typ == Typ[UntypedNil] { + check.errorf(x.pos(), "use of untyped nil") + x.mode = invalid + return false + } + target = defaultType(x.typ) + } + check.convertUntyped(x, target) + if x.mode == invalid { + return false + } + } + + // spec: "If a left-hand side is the blank identifier, any typed or + // non-constant value except for the predeclared identifier nil may + // be assigned to it." + return T == nil || x.assignableTo(check.conf, T) +} + +func (check *Checker) initConst(lhs *Const, x *operand) { + if x.mode == invalid || x.typ == Typ[Invalid] || lhs.typ == Typ[Invalid] { + if lhs.typ == nil { + lhs.typ = Typ[Invalid] + } + return + } + + // rhs must be a constant + if x.mode != constant { + check.errorf(x.pos(), "%s is not constant", x) + if lhs.typ == nil { + lhs.typ = Typ[Invalid] + } + return + } + assert(isConstType(x.typ)) + + // If the lhs doesn't have a type yet, use the type of x. + if lhs.typ == nil { + lhs.typ = x.typ + } + + if !check.assignment(x, lhs.typ) { + if x.mode != invalid { + check.errorf(x.pos(), "cannot define constant %s (type %s) as %s", lhs.Name(), lhs.typ, x) + } + return + } + + lhs.val = x.val +} + +// If result is set, lhs is a function result parameter and x is a return result. +func (check *Checker) initVar(lhs *Var, x *operand, result bool) Type { + if x.mode == invalid || x.typ == Typ[Invalid] || lhs.typ == Typ[Invalid] { + if lhs.typ == nil { + lhs.typ = Typ[Invalid] + } + return nil + } + + // If the lhs doesn't have a type yet, use the type of x. + if lhs.typ == nil { + typ := x.typ + if isUntyped(typ) { + // convert untyped types to default types + if typ == Typ[UntypedNil] { + check.errorf(x.pos(), "use of untyped nil") + lhs.typ = Typ[Invalid] + return nil + } + typ = defaultType(typ) + } + lhs.typ = typ + } + + if !check.assignment(x, lhs.typ) { + if x.mode != invalid { + if result { + // don't refer to lhs.name because it may be an anonymous result parameter + check.errorf(x.pos(), "cannot return %s as value of type %s", x, lhs.typ) + } else { + check.errorf(x.pos(), "cannot initialize %s with %s", lhs, x) + } + } + return nil + } + + return x.typ +} + +func (check *Checker) assignVar(lhs ast.Expr, x *operand) Type { + if x.mode == invalid || x.typ == Typ[Invalid] { + return nil + } + + // Determine if the lhs is a (possibly parenthesized) identifier. + ident, _ := unparen(lhs).(*ast.Ident) + + // Don't evaluate lhs if it is the blank identifier. + if ident != nil && ident.Name == "_" { + check.recordDef(ident, nil) + if !check.assignment(x, nil) { + assert(x.mode == invalid) + x.typ = nil + } + return x.typ + } + + // If the lhs is an identifier denoting a variable v, this assignment + // is not a 'use' of v. Remember current value of v.used and restore + // after evaluating the lhs via check.expr. + var v *Var + var v_used bool + if ident != nil { + if _, obj := check.scope.LookupParent(ident.Name, token.NoPos); obj != nil { + v, _ = obj.(*Var) + if v != nil { + v_used = v.used + } + } + } + + var z operand + check.expr(&z, lhs) + if v != nil { + v.used = v_used // restore v.used + } + + if z.mode == invalid || z.typ == Typ[Invalid] { + return nil + } + + // spec: "Each left-hand side operand must be addressable, a map index + // expression, or the blank identifier. Operands may be parenthesized." + switch z.mode { + case invalid: + return nil + case variable, mapindex: + // ok + default: + check.errorf(z.pos(), "cannot assign to %s", &z) + return nil + } + + if !check.assignment(x, z.typ) { + if x.mode != invalid { + check.errorf(x.pos(), "cannot assign %s to %s", x, &z) + } + return nil + } + + return x.typ +} + +// If returnPos is valid, initVars is called to type-check the assignment of +// return expressions, and returnPos is the position of the return statement. +func (check *Checker) initVars(lhs []*Var, rhs []ast.Expr, returnPos token.Pos) { + l := len(lhs) + get, r, commaOk := unpack(func(x *operand, i int) { check.expr(x, rhs[i]) }, len(rhs), l == 2 && !returnPos.IsValid()) + if get == nil || l != r { + // invalidate lhs and use rhs + for _, obj := range lhs { + if obj.typ == nil { + obj.typ = Typ[Invalid] + } + } + if get == nil { + return // error reported by unpack + } + check.useGetter(get, r) + if returnPos.IsValid() { + check.errorf(returnPos, "wrong number of return values (want %d, got %d)", l, r) + return + } + check.errorf(rhs[0].Pos(), "assignment count mismatch (%d vs %d)", l, r) + return + } + + var x operand + if commaOk { + var a [2]Type + for i := range a { + get(&x, i) + a[i] = check.initVar(lhs[i], &x, returnPos.IsValid()) + } + check.recordCommaOkTypes(rhs[0], a) + return + } + + for i, lhs := range lhs { + get(&x, i) + check.initVar(lhs, &x, returnPos.IsValid()) + } +} + +func (check *Checker) assignVars(lhs, rhs []ast.Expr) { + l := len(lhs) + get, r, commaOk := unpack(func(x *operand, i int) { check.expr(x, rhs[i]) }, len(rhs), l == 2) + if get == nil { + return // error reported by unpack + } + if l != r { + check.useGetter(get, r) + check.errorf(rhs[0].Pos(), "assignment count mismatch (%d vs %d)", l, r) + return + } + + var x operand + if commaOk { + var a [2]Type + for i := range a { + get(&x, i) + a[i] = check.assignVar(lhs[i], &x) + } + check.recordCommaOkTypes(rhs[0], a) + return + } + + for i, lhs := range lhs { + get(&x, i) + check.assignVar(lhs, &x) + } +} + +func (check *Checker) shortVarDecl(pos token.Pos, lhs, rhs []ast.Expr) { + scope := check.scope + + // collect lhs variables + var newVars []*Var + var lhsVars = make([]*Var, len(lhs)) + for i, lhs := range lhs { + var obj *Var + if ident, _ := lhs.(*ast.Ident); ident != nil { + // Use the correct obj if the ident is redeclared. The + // variable's scope starts after the declaration; so we + // must use Scope.Lookup here and call Scope.Insert + // (via check.declare) later. + name := ident.Name + if alt := scope.Lookup(name); alt != nil { + // redeclared object must be a variable + if alt, _ := alt.(*Var); alt != nil { + obj = alt + } else { + check.errorf(lhs.Pos(), "cannot assign to %s", lhs) + } + check.recordUse(ident, alt) + } else { + // declare new variable, possibly a blank (_) variable + obj = NewVar(ident.Pos(), check.pkg, name, nil) + if name != "_" { + newVars = append(newVars, obj) + } + check.recordDef(ident, obj) + } + } else { + check.errorf(lhs.Pos(), "cannot declare %s", lhs) + } + if obj == nil { + obj = NewVar(lhs.Pos(), check.pkg, "_", nil) // dummy variable + } + lhsVars[i] = obj + } + + check.initVars(lhsVars, rhs, token.NoPos) + + // declare new variables + if len(newVars) > 0 { + // spec: "The scope of a constant or variable identifier declared inside + // a function begins at the end of the ConstSpec or VarSpec (ShortVarDecl + // for short variable declarations) and ends at the end of the innermost + // containing block." + scopePos := rhs[len(rhs)-1].End() + for _, obj := range newVars { + check.declare(scope, nil, obj, scopePos) // recordObject already called + } + } else { + check.softErrorf(pos, "no new variables on left side of :=") + } +} diff --git a/vendor/golang.org/x/tools/go/types/builtins.go b/vendor/golang.org/x/tools/go/types/builtins.go new file mode 100644 index 0000000000..f45f930a42 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/builtins.go @@ -0,0 +1,628 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements typechecking of builtin function calls. + +package types + +import ( + "go/ast" + "go/token" + + "golang.org/x/tools/go/exact" +) + +// builtin type-checks a call to the built-in specified by id and +// returns true if the call is valid, with *x holding the result; +// but x.expr is not set. If the call is invalid, the result is +// false, and *x is undefined. +// +func (check *Checker) builtin(x *operand, call *ast.CallExpr, id builtinId) (_ bool) { + // append is the only built-in that permits the use of ... for the last argument + bin := predeclaredFuncs[id] + if call.Ellipsis.IsValid() && id != _Append { + check.invalidOp(call.Ellipsis, "invalid use of ... with built-in %s", bin.name) + check.use(call.Args...) + return + } + + // For len(x) and cap(x) we need to know if x contains any function calls or + // receive operations. Save/restore current setting and set hasCallOrRecv to + // false for the evaluation of x so that we can check it afterwards. + // Note: We must do this _before_ calling unpack because unpack evaluates the + // first argument before we even call arg(x, 0)! + if id == _Len || id == _Cap { + defer func(b bool) { + check.hasCallOrRecv = b + }(check.hasCallOrRecv) + check.hasCallOrRecv = false + } + + // determine actual arguments + var arg getter + nargs := len(call.Args) + switch id { + default: + // make argument getter + arg, nargs, _ = unpack(func(x *operand, i int) { check.expr(x, call.Args[i]) }, nargs, false) + if arg == nil { + return + } + // evaluate first argument, if present + if nargs > 0 { + arg(x, 0) + if x.mode == invalid { + return + } + } + case _Make, _New, _Offsetof, _Trace: + // arguments require special handling + } + + // check argument count + { + msg := "" + if nargs < bin.nargs { + msg = "not enough" + } else if !bin.variadic && nargs > bin.nargs { + msg = "too many" + } + if msg != "" { + check.invalidOp(call.Rparen, "%s arguments for %s (expected %d, found %d)", msg, call, bin.nargs, nargs) + return + } + } + + switch id { + case _Append: + // append(s S, x ...T) S, where T is the element type of S + // spec: "The variadic function append appends zero or more values x to s of type + // S, which must be a slice type, and returns the resulting slice, also of type S. + // The values x are passed to a parameter of type ...T where T is the element type + // of S and the respective parameter passing rules apply." + S := x.typ + var T Type + if s, _ := S.Underlying().(*Slice); s != nil { + T = s.elem + } else { + check.invalidArg(x.pos(), "%s is not a slice", x) + return + } + + // remember arguments that have been evaluated already + alist := []operand{*x} + + // spec: "As a special case, append also accepts a first argument assignable + // to type []byte with a second argument of string type followed by ... . + // This form appends the bytes of the string. + if nargs == 2 && call.Ellipsis.IsValid() && x.assignableTo(check.conf, NewSlice(universeByte)) { + arg(x, 1) + if x.mode == invalid { + return + } + if isString(x.typ) { + if check.Types != nil { + sig := makeSig(S, S, x.typ) + sig.variadic = true + check.recordBuiltinType(call.Fun, sig) + } + x.mode = value + x.typ = S + break + } + alist = append(alist, *x) + // fallthrough + } + + // check general case by creating custom signature + sig := makeSig(S, S, NewSlice(T)) // []T required for variadic signature + sig.variadic = true + check.arguments(x, call, sig, func(x *operand, i int) { + // only evaluate arguments that have not been evaluated before + if i < len(alist) { + *x = alist[i] + return + } + arg(x, i) + }, nargs) + // ok to continue even if check.arguments reported errors + + x.mode = value + x.typ = S + if check.Types != nil { + check.recordBuiltinType(call.Fun, sig) + } + + case _Cap, _Len: + // cap(x) + // len(x) + mode := invalid + var typ Type + var val exact.Value + switch typ = implicitArrayDeref(x.typ.Underlying()); t := typ.(type) { + case *Basic: + if isString(t) && id == _Len { + if x.mode == constant { + mode = constant + val = exact.MakeInt64(int64(len(exact.StringVal(x.val)))) + } else { + mode = value + } + } + + case *Array: + mode = value + // spec: "The expressions len(s) and cap(s) are constants + // if the type of s is an array or pointer to an array and + // the expression s does not contain channel receives or + // function calls; in this case s is not evaluated." + if !check.hasCallOrRecv { + mode = constant + val = exact.MakeInt64(t.len) + } + + case *Slice, *Chan: + mode = value + + case *Map: + if id == _Len { + mode = value + } + } + + if mode == invalid { + check.invalidArg(x.pos(), "%s for %s", x, bin.name) + return + } + + x.mode = mode + x.typ = Typ[Int] + x.val = val + if check.Types != nil && mode != constant { + check.recordBuiltinType(call.Fun, makeSig(x.typ, typ)) + } + + case _Close: + // close(c) + c, _ := x.typ.Underlying().(*Chan) + if c == nil { + check.invalidArg(x.pos(), "%s is not a channel", x) + return + } + if c.dir == RecvOnly { + check.invalidArg(x.pos(), "%s must not be a receive-only channel", x) + return + } + + x.mode = novalue + if check.Types != nil { + check.recordBuiltinType(call.Fun, makeSig(nil, c)) + } + + case _Complex: + // complex(x, y realT) complexT + if !check.complexArg(x) { + return + } + + var y operand + arg(&y, 1) + if y.mode == invalid { + return + } + if !check.complexArg(&y) { + return + } + + check.convertUntyped(x, y.typ) + if x.mode == invalid { + return + } + check.convertUntyped(&y, x.typ) + if y.mode == invalid { + return + } + + if !Identical(x.typ, y.typ) { + check.invalidArg(x.pos(), "mismatched types %s and %s", x.typ, y.typ) + return + } + + if x.mode == constant && y.mode == constant { + x.val = exact.BinaryOp(x.val, token.ADD, exact.MakeImag(y.val)) + } else { + x.mode = value + } + + realT := x.typ + complexT := Typ[Invalid] + switch realT.Underlying().(*Basic).kind { + case Float32: + complexT = Typ[Complex64] + case Float64: + complexT = Typ[Complex128] + case UntypedInt, UntypedRune, UntypedFloat: + if x.mode == constant { + realT = defaultType(realT).(*Basic) + complexT = Typ[UntypedComplex] + } else { + // untyped but not constant; probably because one + // operand is a non-constant shift of untyped lhs + realT = Typ[Float64] + complexT = Typ[Complex128] + } + default: + check.invalidArg(x.pos(), "float32 or float64 arguments expected") + return + } + + x.typ = complexT + if check.Types != nil && x.mode != constant { + check.recordBuiltinType(call.Fun, makeSig(complexT, realT, realT)) + } + + if x.mode != constant { + // The arguments have now their final types, which at run- + // time will be materialized. Update the expression trees. + // If the current types are untyped, the materialized type + // is the respective default type. + // (If the result is constant, the arguments are never + // materialized and there is nothing to do.) + check.updateExprType(x.expr, realT, true) + check.updateExprType(y.expr, realT, true) + } + + case _Copy: + // copy(x, y []T) int + var dst Type + if t, _ := x.typ.Underlying().(*Slice); t != nil { + dst = t.elem + } + + var y operand + arg(&y, 1) + if y.mode == invalid { + return + } + var src Type + switch t := y.typ.Underlying().(type) { + case *Basic: + if isString(y.typ) { + src = universeByte + } + case *Slice: + src = t.elem + } + + if dst == nil || src == nil { + check.invalidArg(x.pos(), "copy expects slice arguments; found %s and %s", x, &y) + return + } + + if !Identical(dst, src) { + check.invalidArg(x.pos(), "arguments to copy %s and %s have different element types %s and %s", x, &y, dst, src) + return + } + + if check.Types != nil { + check.recordBuiltinType(call.Fun, makeSig(Typ[Int], x.typ, y.typ)) + } + x.mode = value + x.typ = Typ[Int] + + case _Delete: + // delete(m, k) + m, _ := x.typ.Underlying().(*Map) + if m == nil { + check.invalidArg(x.pos(), "%s is not a map", x) + return + } + arg(x, 1) // k + if x.mode == invalid { + return + } + + if !x.assignableTo(check.conf, m.key) { + check.invalidArg(x.pos(), "%s is not assignable to %s", x, m.key) + return + } + + x.mode = novalue + if check.Types != nil { + check.recordBuiltinType(call.Fun, makeSig(nil, m, m.key)) + } + + case _Imag, _Real: + // imag(complexT) realT + // real(complexT) realT + if !isComplex(x.typ) { + check.invalidArg(x.pos(), "%s must be a complex number", x) + return + } + if x.mode == constant { + if id == _Real { + x.val = exact.Real(x.val) + } else { + x.val = exact.Imag(x.val) + } + } else { + x.mode = value + } + var k BasicKind + switch x.typ.Underlying().(*Basic).kind { + case Complex64: + k = Float32 + case Complex128: + k = Float64 + case UntypedComplex: + k = UntypedFloat + default: + unreachable() + } + + if check.Types != nil && x.mode != constant { + check.recordBuiltinType(call.Fun, makeSig(Typ[k], x.typ)) + } + x.typ = Typ[k] + + case _Make: + // make(T, n) + // make(T, n, m) + // (no argument evaluated yet) + arg0 := call.Args[0] + T := check.typ(arg0) + if T == Typ[Invalid] { + return + } + + var min int // minimum number of arguments + switch T.Underlying().(type) { + case *Slice: + min = 2 + case *Map, *Chan: + min = 1 + default: + check.invalidArg(arg0.Pos(), "cannot make %s; type must be slice, map, or channel", arg0) + return + } + if nargs < min || min+1 < nargs { + check.errorf(call.Pos(), "%s expects %d or %d arguments; found %d", call, min, min+1, nargs) + return + } + var sizes []int64 // constant integer arguments, if any + for _, arg := range call.Args[1:] { + if s, ok := check.index(arg, -1); ok && s >= 0 { + sizes = append(sizes, s) + } + } + if len(sizes) == 2 && sizes[0] > sizes[1] { + check.invalidArg(call.Args[1].Pos(), "length and capacity swapped") + // safe to continue + } + x.mode = value + x.typ = T + if check.Types != nil { + params := [...]Type{T, Typ[Int], Typ[Int]} + check.recordBuiltinType(call.Fun, makeSig(x.typ, params[:1+len(sizes)]...)) + } + + case _New: + // new(T) + // (no argument evaluated yet) + T := check.typ(call.Args[0]) + if T == Typ[Invalid] { + return + } + + x.mode = value + x.typ = &Pointer{base: T} + if check.Types != nil { + check.recordBuiltinType(call.Fun, makeSig(x.typ, T)) + } + + case _Panic: + // panic(x) + T := new(Interface) + if !check.assignment(x, T) { + assert(x.mode == invalid) + return + } + + x.mode = novalue + if check.Types != nil { + check.recordBuiltinType(call.Fun, makeSig(nil, T)) + } + + case _Print, _Println: + // print(x, y, ...) + // println(x, y, ...) + var params []Type + if nargs > 0 { + params = make([]Type, nargs) + for i := 0; i < nargs; i++ { + if i > 0 { + arg(x, i) // first argument already evaluated + } + if !check.assignment(x, nil) { + assert(x.mode == invalid) + return + } + params[i] = x.typ + } + } + + x.mode = novalue + if check.Types != nil { + check.recordBuiltinType(call.Fun, makeSig(nil, params...)) + } + + case _Recover: + // recover() interface{} + x.mode = value + x.typ = new(Interface) + if check.Types != nil { + check.recordBuiltinType(call.Fun, makeSig(x.typ)) + } + + case _Alignof: + // unsafe.Alignof(x T) uintptr + if !check.assignment(x, nil) { + assert(x.mode == invalid) + return + } + + x.mode = constant + x.val = exact.MakeInt64(check.conf.alignof(x.typ)) + x.typ = Typ[Uintptr] + // result is constant - no need to record signature + + case _Offsetof: + // unsafe.Offsetof(x T) uintptr, where x must be a selector + // (no argument evaluated yet) + arg0 := call.Args[0] + selx, _ := unparen(arg0).(*ast.SelectorExpr) + if selx == nil { + check.invalidArg(arg0.Pos(), "%s is not a selector expression", arg0) + check.use(arg0) + return + } + + check.expr(x, selx.X) + if x.mode == invalid { + return + } + + base := derefStructPtr(x.typ) + sel := selx.Sel.Name + obj, index, indirect := LookupFieldOrMethod(base, false, check.pkg, sel) + switch obj.(type) { + case nil: + check.invalidArg(x.pos(), "%s has no single field %s", base, sel) + return + case *Func: + // TODO(gri) Using derefStructPtr may result in methods being found + // that don't actually exist. An error either way, but the error + // message is confusing. See: http://play.golang.org/p/al75v23kUy , + // but go/types reports: "invalid argument: x.m is a method value". + check.invalidArg(arg0.Pos(), "%s is a method value", arg0) + return + } + if indirect { + check.invalidArg(x.pos(), "field %s is embedded via a pointer in %s", sel, base) + return + } + + // TODO(gri) Should we pass x.typ instead of base (and indirect report if derefStructPtr indirected)? + check.recordSelection(selx, FieldVal, base, obj, index, false) + + offs := check.conf.offsetof(base, index) + x.mode = constant + x.val = exact.MakeInt64(offs) + x.typ = Typ[Uintptr] + // result is constant - no need to record signature + + case _Sizeof: + // unsafe.Sizeof(x T) uintptr + if !check.assignment(x, nil) { + assert(x.mode == invalid) + return + } + + x.mode = constant + x.val = exact.MakeInt64(check.conf.sizeof(x.typ)) + x.typ = Typ[Uintptr] + // result is constant - no need to record signature + + case _Assert: + // assert(pred) causes a typechecker error if pred is false. + // The result of assert is the value of pred if there is no error. + // Note: assert is only available in self-test mode. + if x.mode != constant || !isBoolean(x.typ) { + check.invalidArg(x.pos(), "%s is not a boolean constant", x) + return + } + if x.val.Kind() != exact.Bool { + check.errorf(x.pos(), "internal error: value of %s should be a boolean constant", x) + return + } + if !exact.BoolVal(x.val) { + check.errorf(call.Pos(), "%s failed", call) + // compile-time assertion failure - safe to continue + } + // result is constant - no need to record signature + + case _Trace: + // trace(x, y, z, ...) dumps the positions, expressions, and + // values of its arguments. The result of trace is the value + // of the first argument. + // Note: trace is only available in self-test mode. + // (no argument evaluated yet) + if nargs == 0 { + check.dump("%s: trace() without arguments", call.Pos()) + x.mode = novalue + break + } + var t operand + x1 := x + for _, arg := range call.Args { + check.rawExpr(x1, arg, nil) // permit trace for types, e.g.: new(trace(T)) + check.dump("%s: %s", x1.pos(), x1) + x1 = &t // use incoming x only for first argument + } + // trace is only available in test mode - no need to record signature + + default: + unreachable() + } + + return true +} + +// makeSig makes a signature for the given argument and result types. +// Default types are used for untyped arguments, and res may be nil. +func makeSig(res Type, args ...Type) *Signature { + list := make([]*Var, len(args)) + for i, param := range args { + list[i] = NewVar(token.NoPos, nil, "", defaultType(param)) + } + params := NewTuple(list...) + var result *Tuple + if res != nil { + assert(!isUntyped(res)) + result = NewTuple(NewVar(token.NoPos, nil, "", res)) + } + return &Signature{params: params, results: result} +} + +// implicitArrayDeref returns A if typ is of the form *A and A is an array; +// otherwise it returns typ. +// +func implicitArrayDeref(typ Type) Type { + if p, ok := typ.(*Pointer); ok { + if a, ok := p.base.Underlying().(*Array); ok { + return a + } + } + return typ +} + +// unparen returns e with any enclosing parentheses stripped. +func unparen(e ast.Expr) ast.Expr { + for { + p, ok := e.(*ast.ParenExpr) + if !ok { + return e + } + e = p.X + } +} + +func (check *Checker) complexArg(x *operand) bool { + t, _ := x.typ.Underlying().(*Basic) + if t != nil && (t.info&IsFloat != 0 || t.kind == UntypedInt || t.kind == UntypedRune) { + return true + } + check.invalidArg(x.pos(), "%s must be a float32, float64, or an untyped non-complex numeric constant", x) + return false +} diff --git a/vendor/golang.org/x/tools/go/types/builtins_test.go b/vendor/golang.org/x/tools/go/types/builtins_test.go new file mode 100644 index 0000000000..e7857994ac --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/builtins_test.go @@ -0,0 +1,204 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package types_test + +import ( + "fmt" + "go/ast" + "go/parser" + "testing" + + _ "golang.org/x/tools/go/gcimporter" + . "golang.org/x/tools/go/types" +) + +var builtinCalls = []struct { + name, src, sig string +}{ + {"append", `var s []int; _ = append(s)`, `func([]int, ...int) []int`}, + {"append", `var s []int; _ = append(s, 0)`, `func([]int, ...int) []int`}, + {"append", `var s []int; _ = (append)(s, 0)`, `func([]int, ...int) []int`}, + {"append", `var s []byte; _ = ((append))(s, 0)`, `func([]byte, ...byte) []byte`}, + {"append", `var s []byte; _ = append(s, "foo"...)`, `func([]byte, string...) []byte`}, + {"append", `type T []byte; var s T; var str string; _ = append(s, str...)`, `func(p.T, string...) p.T`}, + {"append", `type T []byte; type U string; var s T; var str U; _ = append(s, str...)`, `func(p.T, p.U...) p.T`}, + + {"cap", `var s [10]int; _ = cap(s)`, `invalid type`}, // constant + {"cap", `var s [10]int; _ = cap(&s)`, `invalid type`}, // constant + {"cap", `var s []int64; _ = cap(s)`, `func([]int64) int`}, + {"cap", `var c chan<-bool; _ = cap(c)`, `func(chan<- bool) int`}, + + {"len", `_ = len("foo")`, `invalid type`}, // constant + {"len", `var s string; _ = len(s)`, `func(string) int`}, + {"len", `var s [10]int; _ = len(s)`, `invalid type`}, // constant + {"len", `var s [10]int; _ = len(&s)`, `invalid type`}, // constant + {"len", `var s []int64; _ = len(s)`, `func([]int64) int`}, + {"len", `var c chan<-bool; _ = len(c)`, `func(chan<- bool) int`}, + {"len", `var m map[string]float32; _ = len(m)`, `func(map[string]float32) int`}, + + {"close", `var c chan int; close(c)`, `func(chan int)`}, + {"close", `var c chan<- chan string; close(c)`, `func(chan<- chan string)`}, + + {"complex", `_ = complex(1, 0)`, `invalid type`}, // constant + {"complex", `var re float32; _ = complex(re, 1.0)`, `func(float32, float32) complex64`}, + {"complex", `var im float64; _ = complex(1, im)`, `func(float64, float64) complex128`}, + {"complex", `type F32 float32; var re, im F32; _ = complex(re, im)`, `func(p.F32, p.F32) complex64`}, + {"complex", `type F64 float64; var re, im F64; _ = complex(re, im)`, `func(p.F64, p.F64) complex128`}, + + {"copy", `var src, dst []byte; copy(dst, src)`, `func([]byte, []byte) int`}, + {"copy", `type T [][]int; var src, dst T; _ = copy(dst, src)`, `func(p.T, p.T) int`}, + {"copy", `var src string; var dst []byte; copy(dst, src)`, `func([]byte, string) int`}, + {"copy", `type T string; type U []byte; var src T; var dst U; copy(dst, src)`, `func(p.U, p.T) int`}, + {"copy", `var dst []byte; copy(dst, "hello")`, `func([]byte, string) int`}, + + {"delete", `var m map[string]bool; delete(m, "foo")`, `func(map[string]bool, string)`}, + {"delete", `type (K string; V int); var m map[K]V; delete(m, "foo")`, `func(map[p.K]p.V, p.K)`}, + + {"imag", `_ = imag(1i)`, `invalid type`}, // constant + {"imag", `var c complex64; _ = imag(c)`, `func(complex64) float32`}, + {"imag", `var c complex128; _ = imag(c)`, `func(complex128) float64`}, + {"imag", `type C64 complex64; var c C64; _ = imag(c)`, `func(p.C64) float32`}, + {"imag", `type C128 complex128; var c C128; _ = imag(c)`, `func(p.C128) float64`}, + + {"real", `_ = real(1i)`, `invalid type`}, // constant + {"real", `var c complex64; _ = real(c)`, `func(complex64) float32`}, + {"real", `var c complex128; _ = real(c)`, `func(complex128) float64`}, + {"real", `type C64 complex64; var c C64; _ = real(c)`, `func(p.C64) float32`}, + {"real", `type C128 complex128; var c C128; _ = real(c)`, `func(p.C128) float64`}, + + {"make", `_ = make([]int, 10)`, `func([]int, int) []int`}, + {"make", `type T []byte; _ = make(T, 10, 20)`, `func(p.T, int, int) p.T`}, + + {"new", `_ = new(int)`, `func(int) *int`}, + {"new", `type T struct{}; _ = new(T)`, `func(p.T) *p.T`}, + + {"panic", `panic(0)`, `func(interface{})`}, + {"panic", `panic("foo")`, `func(interface{})`}, + + {"print", `print()`, `func()`}, + {"print", `print(0)`, `func(int)`}, + {"print", `print(1, 2.0, "foo", true)`, `func(int, float64, string, bool)`}, + + {"println", `println()`, `func()`}, + {"println", `println(0)`, `func(int)`}, + {"println", `println(1, 2.0, "foo", true)`, `func(int, float64, string, bool)`}, + + {"recover", `recover()`, `func() interface{}`}, + {"recover", `_ = recover()`, `func() interface{}`}, + + {"Alignof", `_ = unsafe.Alignof(0)`, `invalid type`}, // constant + {"Alignof", `var x struct{}; _ = unsafe.Alignof(x)`, `invalid type`}, // constant + + {"Offsetof", `var x struct{f bool}; _ = unsafe.Offsetof(x.f)`, `invalid type`}, // constant + {"Offsetof", `var x struct{_ int; f bool}; _ = unsafe.Offsetof((&x).f)`, `invalid type`}, // constant + + {"Sizeof", `_ = unsafe.Sizeof(0)`, `invalid type`}, // constant + {"Sizeof", `var x struct{}; _ = unsafe.Sizeof(x)`, `invalid type`}, // constant + + {"assert", `assert(true)`, `invalid type`}, // constant + {"assert", `type B bool; const pred B = 1 < 2; assert(pred)`, `invalid type`}, // constant + + // no tests for trace since it produces output as a side-effect +} + +func TestBuiltinSignatures(t *testing.T) { + DefPredeclaredTestFuncs() + + seen := map[string]bool{"trace": true} // no test for trace built-in; add it manually + for _, call := range builtinCalls { + testBuiltinSignature(t, call.name, call.src, call.sig) + seen[call.name] = true + } + + // make sure we didn't miss one + for _, name := range Universe.Names() { + if _, ok := Universe.Lookup(name).(*Builtin); ok && !seen[name] { + t.Errorf("missing test for %s", name) + } + } + for _, name := range Unsafe.Scope().Names() { + if _, ok := Unsafe.Scope().Lookup(name).(*Builtin); ok && !seen[name] { + t.Errorf("missing test for unsafe.%s", name) + } + } +} + +func testBuiltinSignature(t *testing.T, name, src0, want string) { + src := fmt.Sprintf(`package p; import "unsafe"; type _ unsafe.Pointer /* use unsafe */; func _() { %s }`, src0) + f, err := parser.ParseFile(fset, "", src, 0) + if err != nil { + t.Errorf("%s: %s", src0, err) + return + } + + var conf Config + uses := make(map[*ast.Ident]Object) + types := make(map[ast.Expr]TypeAndValue) + _, err = conf.Check(f.Name.Name, fset, []*ast.File{f}, &Info{Uses: uses, Types: types}) + if err != nil { + t.Errorf("%s: %s", src0, err) + return + } + + // find called function + n := 0 + var fun ast.Expr + for x := range types { + if call, _ := x.(*ast.CallExpr); call != nil { + fun = call.Fun + n++ + } + } + if n != 1 { + t.Errorf("%s: got %d CallExprs; want 1", src0, n) + return + } + + // check recorded types for fun and descendents (may be parenthesized) + for { + // the recorded type for the built-in must match the wanted signature + typ := types[fun].Type + if typ == nil { + t.Errorf("%s: no type recorded for %s", src0, ExprString(fun)) + return + } + if got := typ.String(); got != want { + t.Errorf("%s: got type %s; want %s", src0, got, want) + return + } + + // called function must be a (possibly parenthesized, qualified) + // identifier denoting the expected built-in + switch p := fun.(type) { + case *ast.Ident: + obj := uses[p] + if obj == nil { + t.Errorf("%s: no object found for %s", src0, p) + return + } + bin, _ := obj.(*Builtin) + if bin == nil { + t.Errorf("%s: %s does not denote a built-in", src0, p) + return + } + if bin.Name() != name { + t.Errorf("%s: got built-in %s; want %s", src0, bin.Name(), name) + return + } + return // we're done + + case *ast.ParenExpr: + fun = p.X // unpack + + case *ast.SelectorExpr: + // built-in from package unsafe - ignore details + return // we're done + + default: + t.Errorf("%s: invalid function call", src0) + return + } + } +} diff --git a/vendor/golang.org/x/tools/go/types/call.go b/vendor/golang.org/x/tools/go/types/call.go new file mode 100644 index 0000000000..1e94212398 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/call.go @@ -0,0 +1,441 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements typechecking of call and selector expressions. + +package types + +import ( + "go/ast" + "go/token" +) + +func (check *Checker) call(x *operand, e *ast.CallExpr) exprKind { + check.exprOrType(x, e.Fun) + + switch x.mode { + case invalid: + check.use(e.Args...) + x.mode = invalid + x.expr = e + return statement + + case typexpr: + // conversion + T := x.typ + x.mode = invalid + switch n := len(e.Args); n { + case 0: + check.errorf(e.Rparen, "missing argument in conversion to %s", T) + case 1: + check.expr(x, e.Args[0]) + if x.mode != invalid { + check.conversion(x, T) + } + default: + check.errorf(e.Args[n-1].Pos(), "too many arguments in conversion to %s", T) + } + x.expr = e + return conversion + + case builtin: + id := x.id + if !check.builtin(x, e, id) { + x.mode = invalid + } + x.expr = e + // a non-constant result implies a function call + if x.mode != invalid && x.mode != constant { + check.hasCallOrRecv = true + } + return predeclaredFuncs[id].kind + + default: + // function/method call + sig, _ := x.typ.Underlying().(*Signature) + if sig == nil { + check.invalidOp(x.pos(), "cannot call non-function %s", x) + x.mode = invalid + x.expr = e + return statement + } + + arg, n, _ := unpack(func(x *operand, i int) { check.expr(x, e.Args[i]) }, len(e.Args), false) + if arg == nil { + x.mode = invalid + x.expr = e + return statement + } + + check.arguments(x, e, sig, arg, n) + + // determine result + switch sig.results.Len() { + case 0: + x.mode = novalue + case 1: + x.mode = value + x.typ = sig.results.vars[0].typ // unpack tuple + default: + x.mode = value + x.typ = sig.results + } + x.expr = e + check.hasCallOrRecv = true + + return statement + } +} + +// use type-checks each argument. +// Useful to make sure expressions are evaluated +// (and variables are "used") in the presence of other errors. +func (check *Checker) use(arg ...ast.Expr) { + var x operand + for _, e := range arg { + check.rawExpr(&x, e, nil) + } +} + +// useGetter is like use, but takes a getter instead of a list of expressions. +// It should be called instead of use if a getter is present to avoid repeated +// evaluation of the first argument (since the getter was likely obtained via +// unpack, which may have evaluated the first argument already). +func (check *Checker) useGetter(get getter, n int) { + var x operand + for i := 0; i < n; i++ { + get(&x, i) + } +} + +// A getter sets x as the i'th operand, where 0 <= i < n and n is the total +// number of operands (context-specific, and maintained elsewhere). A getter +// type-checks the i'th operand; the details of the actual check are getter- +// specific. +type getter func(x *operand, i int) + +// unpack takes a getter get and a number of operands n. If n == 1, unpack +// calls the incoming getter for the first operand. If that operand is +// invalid, unpack returns (nil, 0, false). Otherwise, if that operand is a +// function call, or a comma-ok expression and allowCommaOk is set, the result +// is a new getter and operand count providing access to the function results, +// or comma-ok values, respectively. The third result value reports if it +// is indeed the comma-ok case. In all other cases, the incoming getter and +// operand count are returned unchanged, and the third result value is false. +// +// In other words, if there's exactly one operand that - after type-checking +// by calling get - stands for multiple operands, the resulting getter provides +// access to those operands instead. +// +// If the returned getter is called at most once for a given operand index i +// (including i == 0), that operand is guaranteed to cause only one call of +// the incoming getter with that i. +// +func unpack(get getter, n int, allowCommaOk bool) (getter, int, bool) { + if n == 1 { + // possibly result of an n-valued function call or comma,ok value + var x0 operand + get(&x0, 0) + if x0.mode == invalid { + return nil, 0, false + } + + if t, ok := x0.typ.(*Tuple); ok { + // result of an n-valued function call + return func(x *operand, i int) { + x.mode = value + x.expr = x0.expr + x.typ = t.At(i).typ + }, t.Len(), false + } + + if x0.mode == mapindex || x0.mode == commaok { + // comma-ok value + if allowCommaOk { + a := [2]Type{x0.typ, Typ[UntypedBool]} + return func(x *operand, i int) { + x.mode = value + x.expr = x0.expr + x.typ = a[i] + }, 2, true + } + x0.mode = value + } + + // single value + return func(x *operand, i int) { + if i != 0 { + unreachable() + } + *x = x0 + }, 1, false + } + + // zero or multiple values + return get, n, false +} + +// arguments checks argument passing for the call with the given signature. +// The arg function provides the operand for the i'th argument. +func (check *Checker) arguments(x *operand, call *ast.CallExpr, sig *Signature, arg getter, n int) { + if call.Ellipsis.IsValid() { + // last argument is of the form x... + if len(call.Args) == 1 && n > 1 { + // f()... is not permitted if f() is multi-valued + check.errorf(call.Ellipsis, "cannot use ... with %d-valued expression %s", n, call.Args[0]) + check.useGetter(arg, n) + return + } + if !sig.variadic { + check.errorf(call.Ellipsis, "cannot use ... in call to non-variadic %s", call.Fun) + check.useGetter(arg, n) + return + } + } + + // evaluate arguments + for i := 0; i < n; i++ { + arg(x, i) + if x.mode != invalid { + var ellipsis token.Pos + if i == n-1 && call.Ellipsis.IsValid() { + ellipsis = call.Ellipsis + } + check.argument(sig, i, x, ellipsis) + } + } + + // check argument count + if sig.variadic { + // a variadic function accepts an "empty" + // last argument: count one extra + n++ + } + if n < sig.params.Len() { + check.errorf(call.Rparen, "too few arguments in call to %s", call.Fun) + // ok to continue + } +} + +// argument checks passing of argument x to the i'th parameter of the given signature. +// If ellipsis is valid, the argument is followed by ... at that position in the call. +func (check *Checker) argument(sig *Signature, i int, x *operand, ellipsis token.Pos) { + n := sig.params.Len() + + // determine parameter type + var typ Type + switch { + case i < n: + typ = sig.params.vars[i].typ + case sig.variadic: + typ = sig.params.vars[n-1].typ + if debug { + if _, ok := typ.(*Slice); !ok { + check.dump("%s: expected unnamed slice type, got %s", sig.params.vars[n-1].Pos(), typ) + } + } + default: + check.errorf(x.pos(), "too many arguments") + return + } + + if ellipsis.IsValid() { + // argument is of the form x... + if i != n-1 { + check.errorf(ellipsis, "can only use ... with matching parameter") + return + } + switch t := x.typ.Underlying().(type) { + case *Slice: + // ok + case *Tuple: + check.errorf(ellipsis, "cannot use ... with %d-valued expression %s", t.Len(), x) + return + default: + check.errorf(x.pos(), "cannot use %s as parameter of type %s", x, typ) + return + } + } else if sig.variadic && i >= n-1 { + // use the variadic parameter slice's element type + typ = typ.(*Slice).elem + } + + if !check.assignment(x, typ) && x.mode != invalid { + check.errorf(x.pos(), "cannot pass argument %s to parameter of type %s", x, typ) + } +} + +func (check *Checker) selector(x *operand, e *ast.SelectorExpr) { + // these must be declared before the "goto Error" statements + var ( + obj Object + index []int + indirect bool + ) + + sel := e.Sel.Name + // If the identifier refers to a package, handle everything here + // so we don't need a "package" mode for operands: package names + // can only appear in qualified identifiers which are mapped to + // selector expressions. + if ident, ok := e.X.(*ast.Ident); ok { + _, obj := check.scope.LookupParent(ident.Name, check.pos) + if pkg, _ := obj.(*PkgName); pkg != nil { + assert(pkg.pkg == check.pkg) + check.recordUse(ident, pkg) + pkg.used = true + exp := pkg.imported.scope.Lookup(sel) + if exp == nil { + if !pkg.imported.fake { + check.errorf(e.Pos(), "%s not declared by package %s", sel, ident) + } + goto Error + } + if !exp.Exported() { + check.errorf(e.Pos(), "%s not exported by package %s", sel, ident) + // ok to continue + } + check.recordUse(e.Sel, exp) + // Simplified version of the code for *ast.Idents: + // - imported objects are always fully initialized + switch exp := exp.(type) { + case *Const: + assert(exp.Val() != nil) + x.mode = constant + x.typ = exp.typ + x.val = exp.val + case *TypeName: + x.mode = typexpr + x.typ = exp.typ + case *Var: + x.mode = variable + x.typ = exp.typ + case *Func: + x.mode = value + x.typ = exp.typ + case *Builtin: + x.mode = builtin + x.typ = exp.typ + x.id = exp.id + default: + unreachable() + } + x.expr = e + return + } + } + + check.exprOrType(x, e.X) + if x.mode == invalid { + goto Error + } + + obj, index, indirect = LookupFieldOrMethod(x.typ, x.mode == variable, check.pkg, sel) + if obj == nil { + switch { + case index != nil: + // TODO(gri) should provide actual type where the conflict happens + check.invalidOp(e.Pos(), "ambiguous selector %s", sel) + case indirect: + check.invalidOp(e.Pos(), "%s is not in method set of %s", sel, x.typ) + default: + check.invalidOp(e.Pos(), "%s has no field or method %s", x, sel) + } + goto Error + } + + if x.mode == typexpr { + // method expression + m, _ := obj.(*Func) + if m == nil { + check.invalidOp(e.Pos(), "%s has no method %s", x, sel) + goto Error + } + + check.recordSelection(e, MethodExpr, x.typ, m, index, indirect) + + // the receiver type becomes the type of the first function + // argument of the method expression's function type + var params []*Var + sig := m.typ.(*Signature) + if sig.params != nil { + params = sig.params.vars + } + x.mode = value + x.typ = &Signature{ + params: NewTuple(append([]*Var{NewVar(token.NoPos, check.pkg, "", x.typ)}, params...)...), + results: sig.results, + variadic: sig.variadic, + } + + check.addDeclDep(m) + + } else { + // regular selector + switch obj := obj.(type) { + case *Var: + check.recordSelection(e, FieldVal, x.typ, obj, index, indirect) + if x.mode == variable || indirect { + x.mode = variable + } else { + x.mode = value + } + x.typ = obj.typ + + case *Func: + // TODO(gri) If we needed to take into account the receiver's + // addressability, should we report the type &(x.typ) instead? + check.recordSelection(e, MethodVal, x.typ, obj, index, indirect) + + if debug { + // Verify that LookupFieldOrMethod and MethodSet.Lookup agree. + typ := x.typ + if x.mode == variable { + // If typ is not an (unnamed) pointer or an interface, + // use *typ instead, because the method set of *typ + // includes the methods of typ. + // Variables are addressable, so we can always take their + // address. + if _, ok := typ.(*Pointer); !ok && !IsInterface(typ) { + typ = &Pointer{base: typ} + } + } + // If we created a synthetic pointer type above, we will throw + // away the method set computed here after use. + // TODO(gri) Method set computation should probably always compute + // both, the value and the pointer receiver method set and represent + // them in a single structure. + // TODO(gri) Consider also using a method set cache for the lifetime + // of checker once we rely on MethodSet lookup instead of individual + // lookup. + mset := NewMethodSet(typ) + if m := mset.Lookup(check.pkg, sel); m == nil || m.obj != obj { + check.dump("%s: (%s).%v -> %s", e.Pos(), typ, obj.name, m) + check.dump("%s\n", mset) + panic("method sets and lookup don't agree") + } + } + + x.mode = value + + // remove receiver + sig := *obj.typ.(*Signature) + sig.recv = nil + x.typ = &sig + + check.addDeclDep(obj) + + default: + unreachable() + } + } + + // everything went well + x.expr = e + return + +Error: + x.mode = invalid + x.expr = e +} diff --git a/vendor/golang.org/x/tools/go/types/check.go b/vendor/golang.org/x/tools/go/types/check.go new file mode 100644 index 0000000000..964d2bde03 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/check.go @@ -0,0 +1,364 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements the Check function, which drives type-checking. + +package types + +import ( + "go/ast" + "go/token" + + "golang.org/x/tools/go/exact" +) + +// debugging/development support +const ( + debug = false // leave on during development + trace = false // turn on for detailed type resolution traces +) + +// If Strict is set, the type-checker enforces additional +// rules not specified by the Go 1 spec, but which will +// catch guaranteed run-time errors if the respective +// code is executed. In other words, programs passing in +// Strict mode are Go 1 compliant, but not all Go 1 programs +// will pass in Strict mode. The additional rules are: +// +// - A type assertion x.(T) where T is an interface type +// is invalid if any (statically known) method that exists +// for both x and T have different signatures. +// +const strict = false + +// exprInfo stores information about an untyped expression. +type exprInfo struct { + isLhs bool // expression is lhs operand of a shift with delayed type-check + mode operandMode + typ *Basic + val exact.Value // constant value; or nil (if not a constant) +} + +// funcInfo stores the information required for type-checking a function. +type funcInfo struct { + name string // for debugging/tracing only + decl *declInfo // for cycle detection + sig *Signature + body *ast.BlockStmt +} + +// A context represents the context within which an object is type-checked. +type context struct { + decl *declInfo // package-level declaration whose init expression/function body is checked + scope *Scope // top-most scope for lookups + iota exact.Value // value of iota in a constant declaration; nil otherwise + sig *Signature // function signature if inside a function; nil otherwise + hasLabel bool // set if a function makes use of labels (only ~1% of functions); unused outside functions + hasCallOrRecv bool // set if an expression contains a function call or channel receive operation +} + +// A Checker maintains the state of the type checker. +// It must be created with NewChecker. +type Checker struct { + // package information + // (initialized by NewChecker, valid for the life-time of checker) + conf *Config + fset *token.FileSet + pkg *Package + *Info + objMap map[Object]*declInfo // maps package-level object to declaration info + + // information collected during type-checking of a set of package files + // (initialized by Files, valid only for the duration of check.Files; + // maps and lists are allocated on demand) + files []*ast.File // package files + unusedDotImports map[*Scope]map[*Package]token.Pos // positions of unused dot-imported packages for each file scope + + firstErr error // first error encountered + methods map[string][]*Func // maps type names to associated methods + untyped map[ast.Expr]exprInfo // map of expressions without final type + funcs []funcInfo // list of functions to type-check + delayed []func() // delayed checks requiring fully setup types + + // context within which the current object is type-checked + // (valid only for the duration of type-checking a specific object) + context + pos token.Pos // if valid, identifiers are looked up as if at position pos (used by Eval) + + // debugging + indent int // indentation for tracing +} + +// addUnusedImport adds the position of a dot-imported package +// pkg to the map of dot imports for the given file scope. +func (check *Checker) addUnusedDotImport(scope *Scope, pkg *Package, pos token.Pos) { + mm := check.unusedDotImports + if mm == nil { + mm = make(map[*Scope]map[*Package]token.Pos) + check.unusedDotImports = mm + } + m := mm[scope] + if m == nil { + m = make(map[*Package]token.Pos) + mm[scope] = m + } + m[pkg] = pos +} + +// addDeclDep adds the dependency edge (check.decl -> to) if check.decl exists +func (check *Checker) addDeclDep(to Object) { + from := check.decl + if from == nil { + return // not in a package-level init expression + } + if _, found := check.objMap[to]; !found { + return // to is not a package-level object + } + from.addDep(to) +} + +func (check *Checker) assocMethod(tname string, meth *Func) { + m := check.methods + if m == nil { + m = make(map[string][]*Func) + check.methods = m + } + m[tname] = append(m[tname], meth) +} + +func (check *Checker) rememberUntyped(e ast.Expr, lhs bool, mode operandMode, typ *Basic, val exact.Value) { + m := check.untyped + if m == nil { + m = make(map[ast.Expr]exprInfo) + check.untyped = m + } + m[e] = exprInfo{lhs, mode, typ, val} +} + +func (check *Checker) later(name string, decl *declInfo, sig *Signature, body *ast.BlockStmt) { + check.funcs = append(check.funcs, funcInfo{name, decl, sig, body}) +} + +func (check *Checker) delay(f func()) { + check.delayed = append(check.delayed, f) +} + +// NewChecker returns a new Checker instance for a given package. +// Package files may be added incrementally via checker.Files. +func NewChecker(conf *Config, fset *token.FileSet, pkg *Package, info *Info) *Checker { + // make sure we have a configuration + if conf == nil { + conf = new(Config) + } + + // make sure we have a package canonicalization map + if conf.Packages == nil { + conf.Packages = make(map[string]*Package) + } + + // make sure we have an info struct + if info == nil { + info = new(Info) + } + + return &Checker{ + conf: conf, + fset: fset, + pkg: pkg, + Info: info, + objMap: make(map[Object]*declInfo), + } +} + +// initFiles initializes the files-specific portion of checker. +// The provided files must all belong to the same package. +func (check *Checker) initFiles(files []*ast.File) { + // start with a clean slate (check.Files may be called multiple times) + check.files = nil + check.unusedDotImports = nil + + check.firstErr = nil + check.methods = nil + check.untyped = nil + check.funcs = nil + check.delayed = nil + + // determine package name and collect valid files + pkg := check.pkg + for _, file := range files { + switch name := file.Name.Name; pkg.name { + case "": + if name != "_" { + pkg.name = name + } else { + check.errorf(file.Name.Pos(), "invalid package name _") + } + fallthrough + + case name: + check.files = append(check.files, file) + + default: + check.errorf(file.Package, "package %s; expected %s", name, pkg.name) + // ignore this file + } + } +} + +// A bailout panic is used for early termination. +type bailout struct{} + +func (check *Checker) handleBailout(err *error) { + switch p := recover().(type) { + case nil, bailout: + // normal return or early exit + *err = check.firstErr + default: + // re-panic + panic(p) + } +} + +// Files checks the provided files as part of the checker's package. +func (check *Checker) Files(files []*ast.File) (err error) { + defer check.handleBailout(&err) + + check.initFiles(files) + + check.collectObjects() + + check.packageObjects(check.resolveOrder()) + + check.functionBodies() + + check.initOrder() + + if !check.conf.DisableUnusedImportCheck { + check.unusedImports() + } + + // perform delayed checks + for _, f := range check.delayed { + f() + } + + check.recordUntyped() + + check.pkg.complete = true + return +} + +func (check *Checker) recordUntyped() { + if !debug && check.Types == nil { + return // nothing to do + } + + for x, info := range check.untyped { + if debug && isTyped(info.typ) { + check.dump("%s: %s (type %s) is typed", x.Pos(), x, info.typ) + unreachable() + } + check.recordTypeAndValue(x, info.mode, info.typ, info.val) + } +} + +func (check *Checker) recordTypeAndValue(x ast.Expr, mode operandMode, typ Type, val exact.Value) { + assert(x != nil) + assert(typ != nil) + if mode == invalid { + return // omit + } + assert(typ != nil) + if mode == constant { + assert(val != nil) + assert(typ == Typ[Invalid] || isConstType(typ)) + } + if m := check.Types; m != nil { + m[x] = TypeAndValue{mode, typ, val} + } +} + +func (check *Checker) recordBuiltinType(f ast.Expr, sig *Signature) { + // f must be a (possibly parenthesized) identifier denoting a built-in + // (built-ins in package unsafe always produce a constant result and + // we don't record their signatures, so we don't see qualified idents + // here): record the signature for f and possible children. + for { + check.recordTypeAndValue(f, builtin, sig, nil) + switch p := f.(type) { + case *ast.Ident: + return // we're done + case *ast.ParenExpr: + f = p.X + default: + unreachable() + } + } +} + +func (check *Checker) recordCommaOkTypes(x ast.Expr, a [2]Type) { + assert(x != nil) + if a[0] == nil || a[1] == nil { + return + } + assert(isTyped(a[0]) && isTyped(a[1]) && isBoolean(a[1])) + if m := check.Types; m != nil { + for { + tv := m[x] + assert(tv.Type != nil) // should have been recorded already + pos := x.Pos() + tv.Type = NewTuple( + NewVar(pos, check.pkg, "", a[0]), + NewVar(pos, check.pkg, "", a[1]), + ) + m[x] = tv + // if x is a parenthesized expression (p.X), update p.X + p, _ := x.(*ast.ParenExpr) + if p == nil { + break + } + x = p.X + } + } +} + +func (check *Checker) recordDef(id *ast.Ident, obj Object) { + assert(id != nil) + if m := check.Defs; m != nil { + m[id] = obj + } +} + +func (check *Checker) recordUse(id *ast.Ident, obj Object) { + assert(id != nil) + assert(obj != nil) + if m := check.Uses; m != nil { + m[id] = obj + } +} + +func (check *Checker) recordImplicit(node ast.Node, obj Object) { + assert(node != nil) + assert(obj != nil) + if m := check.Implicits; m != nil { + m[node] = obj + } +} + +func (check *Checker) recordSelection(x *ast.SelectorExpr, kind SelectionKind, recv Type, obj Object, index []int, indirect bool) { + assert(obj != nil && (recv == nil || len(index) > 0)) + check.recordUse(x.Sel, obj) + // TODO(gri) Should we also call recordTypeAndValue? + if m := check.Selections; m != nil { + m[x] = &Selection{kind, recv, obj, index, indirect} + } +} + +func (check *Checker) recordScope(node ast.Node, scope *Scope) { + assert(node != nil) + assert(scope != nil) + if m := check.Scopes; m != nil { + m[node] = scope + } +} diff --git a/vendor/golang.org/x/tools/go/types/check_test.go b/vendor/golang.org/x/tools/go/types/check_test.go new file mode 100644 index 0000000000..fd4dadb00e --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/check_test.go @@ -0,0 +1,303 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements a typechecker test harness. The packages specified +// in tests are typechecked. Error messages reported by the typechecker are +// compared against the error messages expected in the test files. +// +// Expected errors are indicated in the test files by putting a comment +// of the form /* ERROR "rx" */ immediately following an offending token. +// The harness will verify that an error matching the regular expression +// rx is reported at that source position. Consecutive comments may be +// used to indicate multiple errors for the same token position. +// +// For instance, the following test file indicates that a "not declared" +// error should be reported for the undeclared variable x: +// +// package p +// func f() { +// _ = x /* ERROR "not declared" */ + 1 +// } + +package types_test + +import ( + "flag" + "go/ast" + "go/parser" + "go/scanner" + "go/token" + "io/ioutil" + "regexp" + "runtime" + "strings" + "testing" + + _ "golang.org/x/tools/go/gcimporter" + . "golang.org/x/tools/go/types" +) + +var ( + listErrors = flag.Bool("list", false, "list errors") + testFiles = flag.String("files", "", "space-separated list of test files") +) + +// The test filenames do not end in .go so that they are invisible +// to gofmt since they contain comments that must not change their +// positions relative to surrounding tokens. + +// Each tests entry is list of files belonging to the same package. +var tests = []struct { + files string // blank-separated list of file names + cond func() bool // condition under which the test should be run; nil means always +}{ + {"testdata/errors.src", nil}, + {"testdata/importdecl0a.src testdata/importdecl0b.src", nil}, + {"testdata/importdecl1a.src testdata/importdecl1b.src", nil}, + {"testdata/cycles.src", nil}, + {"testdata/cycles1.src", nil}, + {"testdata/cycles2.src", nil}, + {"testdata/cycles3.src", nil}, + {"testdata/cycles4.src", nil}, + {"testdata/init0.src", nil}, + {"testdata/init1.src", nil}, + {"testdata/init2.src", nil}, + {"testdata/decls0.src", nil}, + {"testdata/decls1.src", nil}, + {"testdata/decls2a.src testdata/decls2b.src", nil}, + {"testdata/decls3.src", nil}, + {"testdata/const0.src", nil}, + {"testdata/const1.src", nil}, + {"testdata/constdecl.src", notGo1_4}, // Go 1.4 parser doesn't report certain errors + {"testdata/vardecl.src", notGo1_4}, // Go 1.4 parser doesn't report certain errors + {"testdata/expr0.src", nil}, + {"testdata/expr1.src", nil}, + {"testdata/expr2.src", nil}, + {"testdata/expr3.src", notGo1_4}, // Go 1.4 parser doesn't permit omitting key type in map literals + {"testdata/methodsets.src", nil}, + {"testdata/shifts.src", nil}, + {"testdata/builtins.src", nil}, + {"testdata/conversions.src", nil}, + {"testdata/stmt0.src", nil}, + {"testdata/stmt1.src", nil}, + {"testdata/gotos.src", nil}, + {"testdata/labels.src", nil}, + {"testdata/issues.src", nil}, + {"testdata/blank.src", nil}, +} + +func notGo1_4() bool { + return !strings.HasPrefix(runtime.Version(), "go1.4") +} + +var fset = token.NewFileSet() + +// Positioned errors are of the form filename:line:column: message . +var posMsgRx = regexp.MustCompile(`^(.*:[0-9]+:[0-9]+): *(.*)`) + +// splitError splits an error's error message into a position string +// and the actual error message. If there's no position information, +// pos is the empty string, and msg is the entire error message. +// +func splitError(err error) (pos, msg string) { + msg = err.Error() + if m := posMsgRx.FindStringSubmatch(msg); len(m) == 3 { + pos = m[1] + msg = m[2] + } + return +} + +func parseFiles(t *testing.T, filenames string) ([]*ast.File, []error) { + var files []*ast.File + var errlist []error + for _, filename := range strings.Split(filenames, " ") { + file, err := parser.ParseFile(fset, filename, nil, parser.AllErrors) + if file == nil { + t.Fatalf("%s: %s", filename, err) + } + files = append(files, file) + if err != nil { + if list, _ := err.(scanner.ErrorList); len(list) > 0 { + for _, err := range list { + errlist = append(errlist, err) + } + } else { + errlist = append(errlist, err) + } + } + } + return files, errlist +} + +// ERROR comments must start with text `ERROR "rx"` or `ERROR rx` where +// rx is a regular expression that matches the expected error message. +// Space around "rx" or rx is ignored. Use the form `ERROR HERE "rx"` +// for error messages that are located immediately after rather than +// at a token's position. +// +var errRx = regexp.MustCompile(`^ *ERROR *(HERE)? *"?([^"]*)"?`) + +// errMap collects the regular expressions of ERROR comments found +// in files and returns them as a map of error positions to error messages. +// +func errMap(t *testing.T, testname string, files []*ast.File) map[string][]string { + // map of position strings to lists of error message patterns + errmap := make(map[string][]string) + + for _, file := range files { + filename := fset.Position(file.Package).Filename + src, err := ioutil.ReadFile(filename) + if err != nil { + t.Fatalf("%s: could not read %s", testname, filename) + } + + var s scanner.Scanner + s.Init(fset.AddFile(filename, -1, len(src)), src, nil, scanner.ScanComments) + var prev token.Pos // position of last non-comment, non-semicolon token + var here token.Pos // position immediately after the token at position prev + + scanFile: + for { + pos, tok, lit := s.Scan() + switch tok { + case token.EOF: + break scanFile + case token.COMMENT: + if lit[1] == '*' { + lit = lit[:len(lit)-2] // strip trailing */ + } + if s := errRx.FindStringSubmatch(lit[2:]); len(s) == 3 { + pos := prev + if s[1] == "HERE" { + pos = here + } + p := fset.Position(pos).String() + errmap[p] = append(errmap[p], strings.TrimSpace(s[2])) + } + case token.SEMICOLON: + // ignore automatically inserted semicolon + if lit == "\n" { + continue scanFile + } + fallthrough + default: + prev = pos + var l int // token length + if tok.IsLiteral() { + l = len(lit) + } else { + l = len(tok.String()) + } + here = prev + token.Pos(l) + } + } + } + + return errmap +} + +func eliminate(t *testing.T, errmap map[string][]string, errlist []error) { + for _, err := range errlist { + pos, gotMsg := splitError(err) + list := errmap[pos] + index := -1 // list index of matching message, if any + // we expect one of the messages in list to match the error at pos + for i, wantRx := range list { + rx, err := regexp.Compile(wantRx) + if err != nil { + t.Errorf("%s: %v", pos, err) + continue + } + if rx.MatchString(gotMsg) { + index = i + break + } + } + if index >= 0 { + // eliminate from list + if n := len(list) - 1; n > 0 { + // not the last entry - swap in last element and shorten list by 1 + list[index] = list[n] + errmap[pos] = list[:n] + } else { + // last entry - remove list from map + delete(errmap, pos) + } + } else { + t.Errorf("%s: no error expected: %q", pos, gotMsg) + } + } +} + +func checkFiles(t *testing.T, filenames string) { + // parse files and collect parser errors + files, errlist := parseFiles(t, filenames) + + pkgName := "" + if len(files) > 0 { + pkgName = files[0].Name.Name + } + + if *listErrors && len(errlist) > 0 { + t.Errorf("--- %s:", pkgName) + for _, err := range errlist { + t.Error(err) + } + } + + // typecheck and collect typechecker errors + var conf Config + conf.Error = func(err error) { + if *listErrors { + t.Error(err) + return + } + // Ignore secondary error messages starting with "\t"; + // they are clarifying messages for a primary error. + if !strings.Contains(err.Error(), ": \t") { + errlist = append(errlist, err) + } + } + conf.Check(pkgName, fset, files, nil) + + if *listErrors { + return + } + + // match and eliminate errors; + // we are expecting the following errors + errmap := errMap(t, pkgName, files) + eliminate(t, errmap, errlist) + + // there should be no expected errors left + if len(errmap) > 0 { + t.Errorf("--- %s: %d source positions with expected (but not reported) errors:", pkgName, len(errmap)) + for pos, list := range errmap { + for _, rx := range list { + t.Errorf("%s: %q", pos, rx) + } + } + } +} + +func TestCheck(t *testing.T) { + skipSpecialPlatforms(t) + + // Declare builtins for testing. + DefPredeclaredTestFuncs() + + // If explicit test files are specified, only check those. + if *testFiles != "" { + checkFiles(t, *testFiles) + return + } + + // Otherwise, run all the tests. + for _, test := range tests { + if test.cond == nil || test.cond() { + checkFiles(t, test.files) + } + } +} diff --git a/vendor/golang.org/x/tools/go/types/conversions.go b/vendor/golang.org/x/tools/go/types/conversions.go new file mode 100644 index 0000000000..6e279ca3ee --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/conversions.go @@ -0,0 +1,146 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements typechecking of conversions. + +package types + +import "golang.org/x/tools/go/exact" + +// Conversion type-checks the conversion T(x). +// The result is in x. +func (check *Checker) conversion(x *operand, T Type) { + constArg := x.mode == constant + + var ok bool + switch { + case constArg && isConstType(T): + // constant conversion + switch t := T.Underlying().(*Basic); { + case representableConst(x.val, check.conf, t.kind, &x.val): + ok = true + case isInteger(x.typ) && isString(t): + codepoint := int64(-1) + if i, ok := exact.Int64Val(x.val); ok { + codepoint = i + } + // If codepoint < 0 the absolute value is too large (or unknown) for + // conversion. This is the same as converting any other out-of-range + // value - let string(codepoint) do the work. + x.val = exact.MakeString(string(codepoint)) + ok = true + } + case x.convertibleTo(check.conf, T): + // non-constant conversion + x.mode = value + ok = true + } + + if !ok { + check.errorf(x.pos(), "cannot convert %s to %s", x, T) + x.mode = invalid + return + } + + // The conversion argument types are final. For untyped values the + // conversion provides the type, per the spec: "A constant may be + // given a type explicitly by a constant declaration or conversion,...". + final := x.typ + if isUntyped(x.typ) { + final = T + // - For conversions to interfaces, use the argument's default type. + // - For conversions of untyped constants to non-constant types, also + // use the default type (e.g., []byte("foo") should report string + // not []byte as type for the constant "foo"). + // - Keep untyped nil for untyped nil arguments. + if IsInterface(T) || constArg && !isConstType(T) { + final = defaultType(x.typ) + } + check.updateExprType(x.expr, final, true) + } + + x.typ = T +} + +func (x *operand) convertibleTo(conf *Config, T Type) bool { + // "x is assignable to T" + if x.assignableTo(conf, T) { + return true + } + + // "x's type and T have identical underlying types" + V := x.typ + Vu := V.Underlying() + Tu := T.Underlying() + if Identical(Vu, Tu) { + return true + } + + // "x's type and T are unnamed pointer types and their pointer base types have identical underlying types" + if V, ok := V.(*Pointer); ok { + if T, ok := T.(*Pointer); ok { + if Identical(V.base.Underlying(), T.base.Underlying()) { + return true + } + } + } + + // "x's type and T are both integer or floating point types" + if (isInteger(V) || isFloat(V)) && (isInteger(T) || isFloat(T)) { + return true + } + + // "x's type and T are both complex types" + if isComplex(V) && isComplex(T) { + return true + } + + // "x is an integer or a slice of bytes or runes and T is a string type" + if (isInteger(V) || isBytesOrRunes(Vu)) && isString(T) { + return true + } + + // "x is a string and T is a slice of bytes or runes" + if isString(V) && isBytesOrRunes(Tu) { + return true + } + + // package unsafe: + // "any pointer or value of underlying type uintptr can be converted into a unsafe.Pointer" + if (isPointer(Vu) || isUintptr(Vu)) && isUnsafePointer(T) { + return true + } + // "and vice versa" + if isUnsafePointer(V) && (isPointer(Tu) || isUintptr(Tu)) { + return true + } + + return false +} + +func isUintptr(typ Type) bool { + t, ok := typ.Underlying().(*Basic) + return ok && t.kind == Uintptr +} + +func isUnsafePointer(typ Type) bool { + // TODO(gri): Is this (typ.Underlying() instead of just typ) correct? + // The spec does not say so, but gc claims it is. See also + // issue 6326. + t, ok := typ.Underlying().(*Basic) + return ok && t.kind == UnsafePointer +} + +func isPointer(typ Type) bool { + _, ok := typ.Underlying().(*Pointer) + return ok +} + +func isBytesOrRunes(typ Type) bool { + if s, ok := typ.(*Slice); ok { + t, ok := s.elem.Underlying().(*Basic) + return ok && (t.kind == Byte || t.kind == Rune) + } + return false +} diff --git a/vendor/golang.org/x/tools/go/types/decl.go b/vendor/golang.org/x/tools/go/types/decl.go new file mode 100644 index 0000000000..9eba85c1c3 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/decl.go @@ -0,0 +1,431 @@ +// 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 types + +import ( + "go/ast" + "go/token" + + "golang.org/x/tools/go/exact" +) + +func (check *Checker) reportAltDecl(obj Object) { + if pos := obj.Pos(); pos.IsValid() { + // We use "other" rather than "previous" here because + // the first declaration seen may not be textually + // earlier in the source. + check.errorf(pos, "\tother declaration of %s", obj.Name()) // secondary error, \t indented + } +} + +func (check *Checker) declare(scope *Scope, id *ast.Ident, obj Object, pos token.Pos) { + // spec: "The blank identifier, represented by the underscore + // character _, may be used in a declaration like any other + // identifier but the declaration does not introduce a new + // binding." + if obj.Name() != "_" { + if alt := scope.Insert(obj); alt != nil { + check.errorf(obj.Pos(), "%s redeclared in this block", obj.Name()) + check.reportAltDecl(alt) + return + } + obj.setScopePos(pos) + } + if id != nil { + check.recordDef(id, obj) + } +} + +// objDecl type-checks the declaration of obj in its respective (file) context. +// See check.typ for the details on def and path. +func (check *Checker) objDecl(obj Object, def *Named, path []*TypeName) { + if obj.Type() != nil { + return // already checked - nothing to do + } + + if trace { + check.trace(obj.Pos(), "-- declaring %s", obj.Name()) + check.indent++ + defer func() { + check.indent-- + check.trace(obj.Pos(), "=> %s", obj) + }() + } + + d := check.objMap[obj] + if d == nil { + check.dump("%s: %s should have been declared", obj.Pos(), obj.Name()) + unreachable() + } + + // save/restore current context and setup object context + defer func(ctxt context) { + check.context = ctxt + }(check.context) + check.context = context{ + scope: d.file, + } + + // Const and var declarations must not have initialization + // cycles. We track them by remembering the current declaration + // in check.decl. Initialization expressions depending on other + // consts, vars, or functions, add dependencies to the current + // check.decl. + switch obj := obj.(type) { + case *Const: + check.decl = d // new package-level const decl + check.constDecl(obj, d.typ, d.init) + case *Var: + check.decl = d // new package-level var decl + check.varDecl(obj, d.lhs, d.typ, d.init) + case *TypeName: + // invalid recursive types are detected via path + check.typeDecl(obj, d.typ, def, path) + case *Func: + // functions may be recursive - no need to track dependencies + check.funcDecl(obj, d) + default: + unreachable() + } +} + +func (check *Checker) constDecl(obj *Const, typ, init ast.Expr) { + assert(obj.typ == nil) + + if obj.visited { + obj.typ = Typ[Invalid] + return + } + obj.visited = true + + // use the correct value of iota + assert(check.iota == nil) + check.iota = obj.val + defer func() { check.iota = nil }() + + // provide valid constant value under all circumstances + obj.val = exact.MakeUnknown() + + // determine type, if any + if typ != nil { + t := check.typ(typ) + if !isConstType(t) { + check.errorf(typ.Pos(), "invalid constant type %s", t) + obj.typ = Typ[Invalid] + return + } + obj.typ = t + } + + // check initialization + var x operand + if init != nil { + check.expr(&x, init) + } + check.initConst(obj, &x) +} + +func (check *Checker) varDecl(obj *Var, lhs []*Var, typ, init ast.Expr) { + assert(obj.typ == nil) + + if obj.visited { + obj.typ = Typ[Invalid] + return + } + obj.visited = true + + // var declarations cannot use iota + assert(check.iota == nil) + + // determine type, if any + if typ != nil { + obj.typ = check.typ(typ) + } + + // check initialization + if init == nil { + if typ == nil { + // error reported before by arityMatch + obj.typ = Typ[Invalid] + } + return + } + + if lhs == nil || len(lhs) == 1 { + assert(lhs == nil || lhs[0] == obj) + var x operand + check.expr(&x, init) + check.initVar(obj, &x, false) + return + } + + if debug { + // obj must be one of lhs + found := false + for _, lhs := range lhs { + if obj == lhs { + found = true + break + } + } + if !found { + panic("inconsistent lhs") + } + } + check.initVars(lhs, []ast.Expr{init}, token.NoPos) +} + +// underlying returns the underlying type of typ; possibly by following +// forward chains of named types. Such chains only exist while named types +// are incomplete. +func underlying(typ Type) Type { + for { + n, _ := typ.(*Named) + if n == nil { + break + } + typ = n.underlying + } + return typ +} + +func (n *Named) setUnderlying(typ Type) { + if n != nil { + n.underlying = typ + } +} + +func (check *Checker) typeDecl(obj *TypeName, typ ast.Expr, def *Named, path []*TypeName) { + assert(obj.typ == nil) + + // type declarations cannot use iota + assert(check.iota == nil) + + named := &Named{obj: obj} + def.setUnderlying(named) + obj.typ = named // make sure recursive type declarations terminate + + // determine underlying type of named + check.typExpr(typ, named, append(path, obj)) + + // The underlying type of named may be itself a named type that is + // incomplete: + // + // type ( + // A B + // B *C + // C A + // ) + // + // The type of C is the (named) type of A which is incomplete, + // and which has as its underlying type the named type B. + // Determine the (final, unnamed) underlying type by resolving + // any forward chain (they always end in an unnamed type). + named.underlying = underlying(named.underlying) + + // check and add associated methods + // TODO(gri) It's easy to create pathological cases where the + // current approach is incorrect: In general we need to know + // and add all methods _before_ type-checking the type. + // See http://play.golang.org/p/WMpE0q2wK8 + check.addMethodDecls(obj) +} + +func (check *Checker) addMethodDecls(obj *TypeName) { + // get associated methods + methods := check.methods[obj.name] + if len(methods) == 0 { + return // no methods + } + delete(check.methods, obj.name) + + // use an objset to check for name conflicts + var mset objset + + // spec: "If the base type is a struct type, the non-blank method + // and field names must be distinct." + base := obj.typ.(*Named) + if t, _ := base.underlying.(*Struct); t != nil { + for _, fld := range t.fields { + if fld.name != "_" { + assert(mset.insert(fld) == nil) + } + } + } + + // Checker.Files may be called multiple times; additional package files + // may add methods to already type-checked types. Add pre-existing methods + // so that we can detect redeclarations. + for _, m := range base.methods { + assert(m.name != "_") + assert(mset.insert(m) == nil) + } + + // type-check methods + for _, m := range methods { + // spec: "For a base type, the non-blank names of methods bound + // to it must be unique." + if m.name != "_" { + if alt := mset.insert(m); alt != nil { + switch alt.(type) { + case *Var: + check.errorf(m.pos, "field and method with the same name %s", m.name) + case *Func: + check.errorf(m.pos, "method %s already declared for %s", m.name, base) + default: + unreachable() + } + check.reportAltDecl(alt) + continue + } + } + check.objDecl(m, nil, nil) + // methods with blank _ names cannot be found - don't keep them + if m.name != "_" { + base.methods = append(base.methods, m) + } + } +} + +func (check *Checker) funcDecl(obj *Func, decl *declInfo) { + assert(obj.typ == nil) + + // func declarations cannot use iota + assert(check.iota == nil) + + sig := new(Signature) + obj.typ = sig // guard against cycles + fdecl := decl.fdecl + check.funcType(sig, fdecl.Recv, fdecl.Type) + if sig.recv == nil && obj.name == "init" && (sig.params.Len() > 0 || sig.results.Len() > 0) { + check.errorf(fdecl.Pos(), "func init must have no arguments and no return values") + // ok to continue + } + + // function body must be type-checked after global declarations + // (functions implemented elsewhere have no body) + if !check.conf.IgnoreFuncBodies && fdecl.Body != nil { + check.later(obj.name, decl, sig, fdecl.Body) + } +} + +func (check *Checker) declStmt(decl ast.Decl) { + pkg := check.pkg + + switch d := decl.(type) { + case *ast.BadDecl: + // ignore + + case *ast.GenDecl: + var last *ast.ValueSpec // last ValueSpec with type or init exprs seen + for iota, spec := range d.Specs { + switch s := spec.(type) { + case *ast.ValueSpec: + switch d.Tok { + case token.CONST: + // determine which init exprs to use + switch { + case s.Type != nil || len(s.Values) > 0: + last = s + case last == nil: + last = new(ast.ValueSpec) // make sure last exists + } + + // declare all constants + lhs := make([]*Const, len(s.Names)) + for i, name := range s.Names { + obj := NewConst(name.Pos(), pkg, name.Name, nil, exact.MakeInt64(int64(iota))) + lhs[i] = obj + + var init ast.Expr + if i < len(last.Values) { + init = last.Values[i] + } + + check.constDecl(obj, last.Type, init) + } + + check.arityMatch(s, last) + + // spec: "The scope of a constant or variable identifier declared + // inside a function begins at the end of the ConstSpec or VarSpec + // (ShortVarDecl for short variable declarations) and ends at the + // end of the innermost containing block." + scopePos := s.End() + for i, name := range s.Names { + check.declare(check.scope, name, lhs[i], scopePos) + } + + case token.VAR: + lhs0 := make([]*Var, len(s.Names)) + for i, name := range s.Names { + lhs0[i] = NewVar(name.Pos(), pkg, name.Name, nil) + } + + // initialize all variables + for i, obj := range lhs0 { + var lhs []*Var + var init ast.Expr + switch len(s.Values) { + case len(s.Names): + // lhs and rhs match + init = s.Values[i] + case 1: + // rhs is expected to be a multi-valued expression + lhs = lhs0 + init = s.Values[0] + default: + if i < len(s.Values) { + init = s.Values[i] + } + } + check.varDecl(obj, lhs, s.Type, init) + if len(s.Values) == 1 { + // If we have a single lhs variable we are done either way. + // If we have a single rhs expression, it must be a multi- + // valued expression, in which case handling the first lhs + // variable will cause all lhs variables to have a type + // assigned, and we are done as well. + if debug { + for _, obj := range lhs0 { + assert(obj.typ != nil) + } + } + break + } + } + + check.arityMatch(s, nil) + + // declare all variables + // (only at this point are the variable scopes (parents) set) + scopePos := s.End() // see constant declarations + for i, name := range s.Names { + // see constant declarations + check.declare(check.scope, name, lhs0[i], scopePos) + } + + default: + check.invalidAST(s.Pos(), "invalid token %s", d.Tok) + } + + case *ast.TypeSpec: + obj := NewTypeName(s.Name.Pos(), pkg, s.Name.Name, nil) + // spec: "The scope of a type identifier declared inside a function + // begins at the identifier in the TypeSpec and ends at the end of + // the innermost containing block." + scopePos := s.Name.Pos() + check.declare(check.scope, s.Name, obj, scopePos) + check.typeDecl(obj, s.Type, nil, nil) + + default: + check.invalidAST(s.Pos(), "const, type, or var declaration expected") + } + } + + default: + check.invalidAST(d.Pos(), "unknown ast.Decl node %T", d) + } +} diff --git a/vendor/golang.org/x/tools/go/types/errors.go b/vendor/golang.org/x/tools/go/types/errors.go new file mode 100644 index 0000000000..0c0049b1f3 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/errors.go @@ -0,0 +1,103 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements various error reporters. + +package types + +import ( + "fmt" + "go/ast" + "go/token" + "strings" +) + +func assert(p bool) { + if !p { + panic("assertion failed") + } +} + +func unreachable() { + panic("unreachable") +} + +func (check *Checker) qualifier(pkg *Package) string { + if pkg != check.pkg { + return pkg.path + } + return "" +} + +func (check *Checker) sprintf(format string, args ...interface{}) string { + for i, arg := range args { + switch a := arg.(type) { + case nil: + arg = "" + case operand: + panic("internal error: should always pass *operand") + case *operand: + arg = operandString(a, check.qualifier) + case token.Pos: + arg = check.fset.Position(a).String() + case ast.Expr: + arg = ExprString(a) + case Object: + arg = ObjectString(a, check.qualifier) + case Type: + arg = TypeString(a, check.qualifier) + } + args[i] = arg + } + return fmt.Sprintf(format, args...) +} + +func (check *Checker) trace(pos token.Pos, format string, args ...interface{}) { + fmt.Printf("%s:\t%s%s\n", + check.fset.Position(pos), + strings.Repeat(". ", check.indent), + check.sprintf(format, args...), + ) +} + +// dump is only needed for debugging +func (check *Checker) dump(format string, args ...interface{}) { + fmt.Println(check.sprintf(format, args...)) +} + +func (check *Checker) err(pos token.Pos, msg string, soft bool) { + err := Error{check.fset, pos, msg, soft} + if check.firstErr == nil { + check.firstErr = err + } + f := check.conf.Error + if f == nil { + panic(bailout{}) // report only first error + } + f(err) +} + +func (check *Checker) error(pos token.Pos, msg string) { + check.err(pos, msg, false) +} + +func (check *Checker) errorf(pos token.Pos, format string, args ...interface{}) { + check.err(pos, check.sprintf(format, args...), false) +} + +func (check *Checker) softErrorf(pos token.Pos, format string, args ...interface{}) { + check.err(pos, check.sprintf(format, args...), true) +} + +func (check *Checker) invalidAST(pos token.Pos, format string, args ...interface{}) { + check.errorf(pos, "invalid AST: "+format, args...) +} + +func (check *Checker) invalidArg(pos token.Pos, format string, args ...interface{}) { + check.errorf(pos, "invalid argument: "+format, args...) +} + +func (check *Checker) invalidOp(pos token.Pos, format string, args ...interface{}) { + check.errorf(pos, "invalid operation: "+format, args...) +} diff --git a/vendor/golang.org/x/tools/go/types/eval.go b/vendor/golang.org/x/tools/go/types/eval.go new file mode 100644 index 0000000000..c09f2a3ba4 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/eval.go @@ -0,0 +1,87 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package types + +import ( + "fmt" + "go/parser" + "go/token" +) + +// Eval returns the type and, if constant, the value for the +// expression expr, evaluated at position pos of package pkg, +// which must have been derived from type-checking an AST with +// complete position information relative to the provided file +// set. +// +// If the expression contains function literals, their bodies +// are ignored (i.e., the bodies are not type-checked). +// +// If pkg == nil, the Universe scope is used and the provided +// position pos is ignored. If pkg != nil, and pos is invalid, +// the package scope is used. Otherwise, pos must belong to the +// package. +// +// An error is returned if pos is not within the package or +// if the node cannot be evaluated. +// +// Note: Eval should not be used instead of running Check to compute +// types and values, but in addition to Check. Eval will re-evaluate +// its argument each time, and it also does not know about the context +// in which an expression is used (e.g., an assignment). Thus, top- +// level untyped constants will return an untyped type rather then the +// respective context-specific type. +// +func Eval(fset *token.FileSet, pkg *Package, pos token.Pos, expr string) (tv TypeAndValue, err error) { + // determine scope + var scope *Scope + if pkg == nil { + scope = Universe + pos = token.NoPos + } else if !pos.IsValid() { + scope = pkg.scope + } else { + // The package scope extent (position information) may be + // incorrect (files spread accross a wide range of fset + // positions) - ignore it and just consider its children + // (file scopes). + for _, fscope := range pkg.scope.children { + if scope = fscope.Innermost(pos); scope != nil { + break + } + } + if scope == nil || debug { + s := scope + for s != nil && s != pkg.scope { + s = s.parent + } + // s == nil || s == pkg.scope + if s == nil { + return TypeAndValue{}, fmt.Errorf("no position %s found in package %s", fset.Position(pos), pkg.name) + } + } + } + + // parse expressions + // BUG(gri) In case of type-checking errors below, the type checker + // doesn't have the correct file set for expr. The correct + // solution requires a ParseExpr that uses the incoming + // file set fset. + node, err := parser.ParseExpr(expr) + if err != nil { + return TypeAndValue{}, err + } + + // initialize checker + check := NewChecker(nil, fset, pkg, nil) + check.scope = scope + check.pos = pos + defer check.handleBailout(&err) + + // evaluate node + var x operand + check.rawExpr(&x, node, nil) + return TypeAndValue{x.mode, x.typ, x.val}, err +} diff --git a/vendor/golang.org/x/tools/go/types/eval_test.go b/vendor/golang.org/x/tools/go/types/eval_test.go new file mode 100644 index 0000000000..b68b244f95 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/eval_test.go @@ -0,0 +1,186 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains tests for Eval. + +package types_test + +import ( + "go/ast" + "go/parser" + "go/token" + "strings" + "testing" + + _ "golang.org/x/tools/go/gcimporter" + . "golang.org/x/tools/go/types" +) + +func testEval(t *testing.T, fset *token.FileSet, pkg *Package, pos token.Pos, expr string, typ Type, typStr, valStr string) { + gotTv, err := Eval(fset, pkg, pos, expr) + if err != nil { + t.Errorf("Eval(%q) failed: %s", expr, err) + return + } + if gotTv.Type == nil { + t.Errorf("Eval(%q) got nil type but no error", expr) + return + } + + // compare types + if typ != nil { + // we have a type, check identity + if !Identical(gotTv.Type, typ) { + t.Errorf("Eval(%q) got type %s, want %s", expr, gotTv.Type, typ) + return + } + } else { + // we have a string, compare type string + gotStr := gotTv.Type.String() + if gotStr != typStr { + t.Errorf("Eval(%q) got type %s, want %s", expr, gotStr, typStr) + return + } + } + + // compare values + gotStr := "" + if gotTv.Value != nil { + gotStr = gotTv.Value.String() + } + if gotStr != valStr { + t.Errorf("Eval(%q) got value %s, want %s", expr, gotStr, valStr) + } +} + +func TestEvalBasic(t *testing.T) { + fset := token.NewFileSet() + for _, typ := range Typ[Bool : String+1] { + testEval(t, fset, nil, token.NoPos, typ.Name(), typ, "", "") + } +} + +func TestEvalComposite(t *testing.T) { + fset := token.NewFileSet() + for _, test := range independentTestTypes { + testEval(t, fset, nil, token.NoPos, test.src, nil, test.str, "") + } +} + +func TestEvalArith(t *testing.T) { + var tests = []string{ + `true`, + `false == false`, + `12345678 + 87654321 == 99999999`, + `10 * 20 == 200`, + `(1<<1000)*2 >> 100 == 2<<900`, + `"foo" + "bar" == "foobar"`, + `"abc" <= "bcd"`, + `len([10]struct{}{}) == 2*5`, + } + fset := token.NewFileSet() + for _, test := range tests { + testEval(t, fset, nil, token.NoPos, test, Typ[UntypedBool], "", "true") + } +} + +func TestEvalPos(t *testing.T) { + skipSpecialPlatforms(t) + + // The contents of /*-style comments are of the form + // expr => value, type + // where value may be the empty string. + // Each expr is evaluated at the position of the comment + // and the result is compared with the expected value + // and type. + var sources = []string{ + ` + package p + import "fmt" + import m "math" + const c = 3.0 + type T []int + func f(a int, s string) float64 { + fmt.Println("calling f") + _ = m.Pi // use package math + const d int = c + 1 + var x int + x = a + len(s) + return float64(x) + /* true => true, untyped bool */ + /* fmt.Println => , func(a ...interface{}) (n int, err error) */ + /* c => 3, untyped float */ + /* T => , p.T */ + /* a => , int */ + /* s => , string */ + /* d => 4, int */ + /* x => , int */ + /* d/c => 1, int */ + /* c/2 => 3/2, untyped float */ + /* m.Pi < m.E => false, untyped bool */ + } + `, + ` + package p + /* c => 3, untyped float */ + type T1 /* T1 => , p.T1 */ struct {} + var v1 /* v1 => , int */ = 42 + func /* f1 => , func(v1 float64) */ f1(v1 float64) { + /* f1 => , func(v1 float64) */ + /* v1 => , float64 */ + var c /* c => 3, untyped float */ = "foo" /* c => , string */ + { + var c struct { + c /* c => , string */ int + } + /* c => , struct{c int} */ + _ = c + } + _ = func(a, b, c int) /* c => , string */ { + /* c => , int */ + } + _ = c + type FT /* FT => , p.FT */ interface{} + } + `, + ` + package p + /* T => , p.T */ + `, + } + + fset := token.NewFileSet() + var files []*ast.File + for i, src := range sources { + file, err := parser.ParseFile(fset, "p", src, parser.ParseComments) + if err != nil { + t.Fatalf("could not parse file %d: %s", i, err) + } + files = append(files, file) + } + + pkg, err := Check("p", fset, files) + if err != nil { + t.Fatal(err) + } + + for _, file := range files { + for _, group := range file.Comments { + for _, comment := range group.List { + s := comment.Text + if len(s) >= 4 && s[:2] == "/*" && s[len(s)-2:] == "*/" { + str, typ := split(s[2:len(s)-2], ", ") + str, val := split(str, "=>") + testEval(t, fset, pkg, comment.Pos(), str, nil, typ, val) + } + } + } + } +} + +// split splits string s at the first occurrence of s. +func split(s, sep string) (string, string) { + i := strings.Index(s, sep) + return strings.TrimSpace(s[:i]), strings.TrimSpace(s[i+len(sep):]) +} diff --git a/vendor/golang.org/x/tools/go/types/expr.go b/vendor/golang.org/x/tools/go/types/expr.go new file mode 100644 index 0000000000..79dad12e06 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/expr.go @@ -0,0 +1,1497 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements typechecking of expressions. + +package types + +import ( + "fmt" + "go/ast" + "go/token" + "math" + + "golang.org/x/tools/go/exact" +) + +/* +Basic algorithm: + +Expressions are checked recursively, top down. Expression checker functions +are generally of the form: + + func f(x *operand, e *ast.Expr, ...) + +where e is the expression to be checked, and x is the result of the check. +The check performed by f may fail in which case x.mode == invalid, and +related error messages will have been issued by f. + +If a hint argument is present, it is the composite literal element type +of an outer composite literal; it is used to type-check composite literal +elements that have no explicit type specification in the source +(e.g.: []T{{...}, {...}}, the hint is the type T in this case). + +All expressions are checked via rawExpr, which dispatches according +to expression kind. Upon returning, rawExpr is recording the types and +constant values for all expressions that have an untyped type (those types +may change on the way up in the expression tree). Usually these are constants, +but the results of comparisons or non-constant shifts of untyped constants +may also be untyped, but not constant. + +Untyped expressions may eventually become fully typed (i.e., not untyped), +typically when the value is assigned to a variable, or is used otherwise. +The updateExprType method is used to record this final type and update +the recorded types: the type-checked expression tree is again traversed down, +and the new type is propagated as needed. Untyped constant expression values +that become fully typed must now be representable by the full type (constant +sub-expression trees are left alone except for their roots). This mechanism +ensures that a client sees the actual (run-time) type an untyped value would +have. It also permits type-checking of lhs shift operands "as if the shift +were not present": when updateExprType visits an untyped lhs shift operand +and assigns it it's final type, that type must be an integer type, and a +constant lhs must be representable as an integer. + +When an expression gets its final type, either on the way out from rawExpr, +on the way down in updateExprType, or at the end of the type checker run, +the type (and constant value, if any) is recorded via Info.Types, if present. +*/ + +type opPredicates map[token.Token]func(Type) bool + +var unaryOpPredicates = opPredicates{ + token.ADD: isNumeric, + token.SUB: isNumeric, + token.XOR: isInteger, + token.NOT: isBoolean, +} + +func (check *Checker) op(m opPredicates, x *operand, op token.Token) bool { + if pred := m[op]; pred != nil { + if !pred(x.typ) { + check.invalidOp(x.pos(), "operator %s not defined for %s", op, x) + return false + } + } else { + check.invalidAST(x.pos(), "unknown operator %s", op) + return false + } + return true +} + +// The unary expression e may be nil. It's passed in for better error messages only. +func (check *Checker) unary(x *operand, e *ast.UnaryExpr, op token.Token) { + switch op { + case token.AND: + // spec: "As an exception to the addressability + // requirement x may also be a composite literal." + if _, ok := unparen(x.expr).(*ast.CompositeLit); !ok && x.mode != variable { + check.invalidOp(x.pos(), "cannot take address of %s", x) + x.mode = invalid + return + } + x.mode = value + x.typ = &Pointer{base: x.typ} + return + + case token.ARROW: + typ, ok := x.typ.Underlying().(*Chan) + if !ok { + check.invalidOp(x.pos(), "cannot receive from non-channel %s", x) + x.mode = invalid + return + } + if typ.dir == SendOnly { + check.invalidOp(x.pos(), "cannot receive from send-only channel %s", x) + x.mode = invalid + return + } + x.mode = commaok + x.typ = typ.elem + check.hasCallOrRecv = true + return + } + + if !check.op(unaryOpPredicates, x, op) { + x.mode = invalid + return + } + + if x.mode == constant { + typ := x.typ.Underlying().(*Basic) + size := -1 + if isUnsigned(typ) { + size = int(check.conf.sizeof(typ)) + } + x.val = exact.UnaryOp(op, x.val, size) + // Typed constants must be representable in + // their type after each constant operation. + if isTyped(typ) { + if e != nil { + x.expr = e // for better error message + } + check.representable(x, typ) + } + return + } + + x.mode = value + // x.typ remains unchanged +} + +func isShift(op token.Token) bool { + return op == token.SHL || op == token.SHR +} + +func isComparison(op token.Token) bool { + // Note: tokens are not ordered well to make this much easier + switch op { + case token.EQL, token.NEQ, token.LSS, token.LEQ, token.GTR, token.GEQ: + return true + } + return false +} + +func fitsFloat32(x exact.Value) bool { + f32, _ := exact.Float32Val(x) + f := float64(f32) + return !math.IsInf(f, 0) +} + +func roundFloat32(x exact.Value) exact.Value { + f32, _ := exact.Float32Val(x) + f := float64(f32) + if !math.IsInf(f, 0) { + return exact.MakeFloat64(f) + } + return nil +} + +func fitsFloat64(x exact.Value) bool { + f, _ := exact.Float64Val(x) + return !math.IsInf(f, 0) +} + +func roundFloat64(x exact.Value) exact.Value { + f, _ := exact.Float64Val(x) + if !math.IsInf(f, 0) { + return exact.MakeFloat64(f) + } + return nil +} + +// representableConst reports whether x can be represented as +// value of the given basic type kind and for the configuration +// provided (only needed for int/uint sizes). +// +// If rounded != nil, *rounded is set to the rounded value of x for +// representable floating-point values; it is left alone otherwise. +// It is ok to provide the addressof the first argument for rounded. +func representableConst(x exact.Value, conf *Config, as BasicKind, rounded *exact.Value) bool { + switch x.Kind() { + case exact.Unknown: + return true + + case exact.Bool: + return as == Bool || as == UntypedBool + + case exact.Int: + if x, ok := exact.Int64Val(x); ok { + switch as { + case Int: + var s = uint(conf.sizeof(Typ[as])) * 8 + return int64(-1)<<(s-1) <= x && x <= int64(1)<<(s-1)-1 + case Int8: + const s = 8 + return -1<<(s-1) <= x && x <= 1<<(s-1)-1 + case Int16: + const s = 16 + return -1<<(s-1) <= x && x <= 1<<(s-1)-1 + case Int32: + const s = 32 + return -1<<(s-1) <= x && x <= 1<<(s-1)-1 + case Int64: + return true + case Uint, Uintptr: + if s := uint(conf.sizeof(Typ[as])) * 8; s < 64 { + return 0 <= x && x <= int64(1)<= 0 && n <= int(s) + case Uint64: + return exact.Sign(x) >= 0 && n <= 64 + case Float32, Complex64: + if rounded == nil { + return fitsFloat32(x) + } + r := roundFloat32(x) + if r != nil { + *rounded = r + return true + } + case Float64, Complex128: + if rounded == nil { + return fitsFloat64(x) + } + r := roundFloat64(x) + if r != nil { + *rounded = r + return true + } + case UntypedInt, UntypedFloat, UntypedComplex: + return true + } + + case exact.Float: + switch as { + case Float32, Complex64: + if rounded == nil { + return fitsFloat32(x) + } + r := roundFloat32(x) + if r != nil { + *rounded = r + return true + } + case Float64, Complex128: + if rounded == nil { + return fitsFloat64(x) + } + r := roundFloat64(x) + if r != nil { + *rounded = r + return true + } + case UntypedFloat, UntypedComplex: + return true + } + + case exact.Complex: + switch as { + case Complex64: + if rounded == nil { + return fitsFloat32(exact.Real(x)) && fitsFloat32(exact.Imag(x)) + } + re := roundFloat32(exact.Real(x)) + im := roundFloat32(exact.Imag(x)) + if re != nil && im != nil { + *rounded = exact.BinaryOp(re, token.ADD, exact.MakeImag(im)) + return true + } + case Complex128: + if rounded == nil { + return fitsFloat64(exact.Real(x)) && fitsFloat64(exact.Imag(x)) + } + re := roundFloat64(exact.Real(x)) + im := roundFloat64(exact.Imag(x)) + if re != nil && im != nil { + *rounded = exact.BinaryOp(re, token.ADD, exact.MakeImag(im)) + return true + } + case UntypedComplex: + return true + } + + case exact.String: + return as == String || as == UntypedString + + default: + unreachable() + } + + return false +} + +// representable checks that a constant operand is representable in the given basic type. +func (check *Checker) representable(x *operand, typ *Basic) { + assert(x.mode == constant) + if !representableConst(x.val, check.conf, typ.kind, &x.val) { + var msg string + if isNumeric(x.typ) && isNumeric(typ) { + // numeric conversion : error msg + // + // integer -> integer : overflows + // integer -> float : overflows (actually not possible) + // float -> integer : truncated + // float -> float : overflows + // + if !isInteger(x.typ) && isInteger(typ) { + msg = "%s truncated to %s" + } else { + msg = "%s overflows %s" + } + } else { + msg = "cannot convert %s to %s" + } + check.errorf(x.pos(), msg, x, typ) + x.mode = invalid + } +} + +// updateExprType updates the type of x to typ and invokes itself +// recursively for the operands of x, depending on expression kind. +// If typ is still an untyped and not the final type, updateExprType +// only updates the recorded untyped type for x and possibly its +// operands. Otherwise (i.e., typ is not an untyped type anymore, +// or it is the final type for x), the type and value are recorded. +// Also, if x is a constant, it must be representable as a value of typ, +// and if x is the (formerly untyped) lhs operand of a non-constant +// shift, it must be an integer value. +// +func (check *Checker) updateExprType(x ast.Expr, typ Type, final bool) { + old, found := check.untyped[x] + if !found { + return // nothing to do + } + + // update operands of x if necessary + switch x := x.(type) { + case *ast.BadExpr, + *ast.FuncLit, + *ast.CompositeLit, + *ast.IndexExpr, + *ast.SliceExpr, + *ast.TypeAssertExpr, + *ast.StarExpr, + *ast.KeyValueExpr, + *ast.ArrayType, + *ast.StructType, + *ast.FuncType, + *ast.InterfaceType, + *ast.MapType, + *ast.ChanType: + // These expression are never untyped - nothing to do. + // The respective sub-expressions got their final types + // upon assignment or use. + if debug { + check.dump("%s: found old type(%s): %s (new: %s)", x.Pos(), x, old.typ, typ) + unreachable() + } + return + + case *ast.CallExpr: + // Resulting in an untyped constant (e.g., built-in complex). + // The respective calls take care of calling updateExprType + // for the arguments if necessary. + + case *ast.Ident, *ast.BasicLit, *ast.SelectorExpr: + // An identifier denoting a constant, a constant literal, + // or a qualified identifier (imported untyped constant). + // No operands to take care of. + + case *ast.ParenExpr: + check.updateExprType(x.X, typ, final) + + case *ast.UnaryExpr: + // If x is a constant, the operands were constants. + // They don't need to be updated since they never + // get "materialized" into a typed value; and they + // will be processed at the end of the type check. + if old.val != nil { + break + } + check.updateExprType(x.X, typ, final) + + case *ast.BinaryExpr: + if old.val != nil { + break // see comment for unary expressions + } + if isComparison(x.Op) { + // The result type is independent of operand types + // and the operand types must have final types. + } else if isShift(x.Op) { + // The result type depends only on lhs operand. + // The rhs type was updated when checking the shift. + check.updateExprType(x.X, typ, final) + } else { + // The operand types match the result type. + check.updateExprType(x.X, typ, final) + check.updateExprType(x.Y, typ, final) + } + + default: + unreachable() + } + + // If the new type is not final and still untyped, just + // update the recorded type. + if !final && isUntyped(typ) { + old.typ = typ.Underlying().(*Basic) + check.untyped[x] = old + return + } + + // Otherwise we have the final (typed or untyped type). + // Remove it from the map of yet untyped expressions. + delete(check.untyped, x) + + // If x is the lhs of a shift, its final type must be integer. + // We already know from the shift check that it is representable + // as an integer if it is a constant. + if old.isLhs && !isInteger(typ) { + check.invalidOp(x.Pos(), "shifted operand %s (type %s) must be integer", x, typ) + return + } + + // Everything's fine, record final type and value for x. + check.recordTypeAndValue(x, old.mode, typ, old.val) +} + +// updateExprVal updates the value of x to val. +func (check *Checker) updateExprVal(x ast.Expr, val exact.Value) { + if info, ok := check.untyped[x]; ok { + info.val = val + check.untyped[x] = info + } +} + +// convertUntyped attempts to set the type of an untyped value to the target type. +func (check *Checker) convertUntyped(x *operand, target Type) { + if x.mode == invalid || isTyped(x.typ) || target == Typ[Invalid] { + return + } + + // TODO(gri) Sloppy code - clean up. This function is central + // to assignment and expression checking. + + if isUntyped(target) { + // both x and target are untyped + xkind := x.typ.(*Basic).kind + tkind := target.(*Basic).kind + if isNumeric(x.typ) && isNumeric(target) { + if xkind < tkind { + x.typ = target + check.updateExprType(x.expr, target, false) + } + } else if xkind != tkind { + goto Error + } + return + } + + // typed target + switch t := target.Underlying().(type) { + case *Basic: + if x.mode == constant { + check.representable(x, t) + if x.mode == invalid { + return + } + // expression value may have been rounded - update if needed + // TODO(gri) A floating-point value may silently underflow to + // zero. If it was negative, the sign is lost. See issue 6898. + check.updateExprVal(x.expr, x.val) + } else { + // Non-constant untyped values may appear as the + // result of comparisons (untyped bool), intermediate + // (delayed-checked) rhs operands of shifts, and as + // the value nil. + switch x.typ.(*Basic).kind { + case UntypedBool: + if !isBoolean(target) { + goto Error + } + case UntypedInt, UntypedRune, UntypedFloat, UntypedComplex: + if !isNumeric(target) { + goto Error + } + case UntypedString: + // Non-constant untyped string values are not + // permitted by the spec and should not occur. + unreachable() + case UntypedNil: + // Unsafe.Pointer is a basic type that includes nil. + if !hasNil(target) { + goto Error + } + default: + goto Error + } + } + case *Interface: + if !x.isNil() && !t.Empty() /* empty interfaces are ok */ { + goto Error + } + // Update operand types to the default type rather then + // the target (interface) type: values must have concrete + // dynamic types. If the value is nil, keep it untyped + // (this is important for tools such as go vet which need + // the dynamic type for argument checking of say, print + // functions) + if x.isNil() { + target = Typ[UntypedNil] + } else { + // cannot assign untyped values to non-empty interfaces + if !t.Empty() { + goto Error + } + target = defaultType(x.typ) + } + case *Pointer, *Signature, *Slice, *Map, *Chan: + if !x.isNil() { + goto Error + } + // keep nil untyped - see comment for interfaces, above + target = Typ[UntypedNil] + default: + goto Error + } + + x.typ = target + check.updateExprType(x.expr, target, true) // UntypedNils are final + return + +Error: + check.errorf(x.pos(), "cannot convert %s to %s", x, target) + x.mode = invalid +} + +func (check *Checker) comparison(x, y *operand, op token.Token) { + // spec: "In any comparison, the first operand must be assignable + // to the type of the second operand, or vice versa." + err := "" + if x.assignableTo(check.conf, y.typ) || y.assignableTo(check.conf, x.typ) { + defined := false + switch op { + case token.EQL, token.NEQ: + // spec: "The equality operators == and != apply to operands that are comparable." + defined = Comparable(x.typ) || x.isNil() && hasNil(y.typ) || y.isNil() && hasNil(x.typ) + case token.LSS, token.LEQ, token.GTR, token.GEQ: + // spec: The ordering operators <, <=, >, and >= apply to operands that are ordered." + defined = isOrdered(x.typ) + default: + unreachable() + } + if !defined { + typ := x.typ + if x.isNil() { + typ = y.typ + } + err = check.sprintf("operator %s not defined for %s", op, typ) + } + } else { + err = check.sprintf("mismatched types %s and %s", x.typ, y.typ) + } + + if err != "" { + check.errorf(x.pos(), "cannot compare %s %s %s (%s)", x.expr, op, y.expr, err) + x.mode = invalid + return + } + + if x.mode == constant && y.mode == constant { + x.val = exact.MakeBool(exact.Compare(x.val, op, y.val)) + // The operands are never materialized; no need to update + // their types. + } else { + x.mode = value + // The operands have now their final types, which at run- + // time will be materialized. Update the expression trees. + // If the current types are untyped, the materialized type + // is the respective default type. + check.updateExprType(x.expr, defaultType(x.typ), true) + check.updateExprType(y.expr, defaultType(y.typ), true) + } + + // spec: "Comparison operators compare two operands and yield + // an untyped boolean value." + x.typ = Typ[UntypedBool] +} + +func (check *Checker) shift(x, y *operand, op token.Token) { + untypedx := isUntyped(x.typ) + + // The lhs must be of integer type or be representable + // as an integer; otherwise the shift has no chance. + if !x.isInteger() { + check.invalidOp(x.pos(), "shifted operand %s must be integer", x) + x.mode = invalid + return + } + + // spec: "The right operand in a shift expression must have unsigned + // integer type or be an untyped constant that can be converted to + // unsigned integer type." + switch { + case isInteger(y.typ) && isUnsigned(y.typ): + // nothing to do + case isUntyped(y.typ): + check.convertUntyped(y, Typ[UntypedInt]) + if y.mode == invalid { + x.mode = invalid + return + } + default: + check.invalidOp(y.pos(), "shift count %s must be unsigned integer", y) + x.mode = invalid + return + } + + if x.mode == constant { + if y.mode == constant { + // rhs must be an integer value + if !y.isInteger() { + check.invalidOp(y.pos(), "shift count %s must be unsigned integer", y) + x.mode = invalid + return + } + // rhs must be within reasonable bounds + const stupidShift = 1023 - 1 + 52 // so we can express smallestFloat64 + s, ok := exact.Uint64Val(y.val) + if !ok || s > stupidShift { + check.invalidOp(y.pos(), "stupid shift count %s", y) + x.mode = invalid + return + } + // The lhs is representable as an integer but may not be an integer + // (e.g., 2.0, an untyped float) - this can only happen for untyped + // non-integer numeric constants. Correct the type so that the shift + // result is of integer type. + if !isInteger(x.typ) { + x.typ = Typ[UntypedInt] + } + x.val = exact.Shift(x.val, op, uint(s)) + return + } + + // non-constant shift with constant lhs + if untypedx { + // spec: "If the left operand of a non-constant shift + // expression is an untyped constant, the type of the + // constant is what it would be if the shift expression + // were replaced by its left operand alone.". + // + // Delay operand checking until we know the final type: + // The lhs expression must be in the untyped map, mark + // the entry as lhs shift operand. + info, found := check.untyped[x.expr] + assert(found) + info.isLhs = true + check.untyped[x.expr] = info + // keep x's type + x.mode = value + return + } + } + + // constant rhs must be >= 0 + if y.mode == constant && exact.Sign(y.val) < 0 { + check.invalidOp(y.pos(), "shift count %s must not be negative", y) + } + + // non-constant shift - lhs must be an integer + if !isInteger(x.typ) { + check.invalidOp(x.pos(), "shifted operand %s must be integer", x) + x.mode = invalid + return + } + + x.mode = value +} + +var binaryOpPredicates = opPredicates{ + token.ADD: func(typ Type) bool { return isNumeric(typ) || isString(typ) }, + token.SUB: isNumeric, + token.MUL: isNumeric, + token.QUO: isNumeric, + token.REM: isInteger, + + token.AND: isInteger, + token.OR: isInteger, + token.XOR: isInteger, + token.AND_NOT: isInteger, + + token.LAND: isBoolean, + token.LOR: isBoolean, +} + +// The binary expression e may be nil. It's passed in for better error messages only. +func (check *Checker) binary(x *operand, e *ast.BinaryExpr, lhs, rhs ast.Expr, op token.Token) { + var y operand + + check.expr(x, lhs) + check.expr(&y, rhs) + + if x.mode == invalid { + return + } + if y.mode == invalid { + x.mode = invalid + x.expr = y.expr + return + } + + if isShift(op) { + check.shift(x, &y, op) + return + } + + check.convertUntyped(x, y.typ) + if x.mode == invalid { + return + } + check.convertUntyped(&y, x.typ) + if y.mode == invalid { + x.mode = invalid + return + } + + if isComparison(op) { + check.comparison(x, &y, op) + return + } + + if !Identical(x.typ, y.typ) { + // only report an error if we have valid types + // (otherwise we had an error reported elsewhere already) + if x.typ != Typ[Invalid] && y.typ != Typ[Invalid] { + check.invalidOp(x.pos(), "mismatched types %s and %s", x.typ, y.typ) + } + x.mode = invalid + return + } + + if !check.op(binaryOpPredicates, x, op) { + x.mode = invalid + return + } + + if (op == token.QUO || op == token.REM) && (x.mode == constant || isInteger(x.typ)) && y.mode == constant && exact.Sign(y.val) == 0 { + check.invalidOp(y.pos(), "division by zero") + x.mode = invalid + return + } + + if x.mode == constant && y.mode == constant { + typ := x.typ.Underlying().(*Basic) + // force integer division of integer operands + if op == token.QUO && isInteger(typ) { + op = token.QUO_ASSIGN + } + x.val = exact.BinaryOp(x.val, op, y.val) + // Typed constants must be representable in + // their type after each constant operation. + if isTyped(typ) { + if e != nil { + x.expr = e // for better error message + } + check.representable(x, typ) + } + return + } + + x.mode = value + // x.typ is unchanged +} + +// index checks an index expression for validity. +// If max >= 0, it is the upper bound for index. +// If index is valid and the result i >= 0, then i is the constant value of index. +func (check *Checker) index(index ast.Expr, max int64) (i int64, valid bool) { + var x operand + check.expr(&x, index) + if x.mode == invalid { + return + } + + // an untyped constant must be representable as Int + check.convertUntyped(&x, Typ[Int]) + if x.mode == invalid { + return + } + + // the index must be of integer type + if !isInteger(x.typ) { + check.invalidArg(x.pos(), "index %s must be integer", &x) + return + } + + // a constant index i must be in bounds + if x.mode == constant { + if exact.Sign(x.val) < 0 { + check.invalidArg(x.pos(), "index %s must not be negative", &x) + return + } + i, valid = exact.Int64Val(x.val) + if !valid || max >= 0 && i >= max { + check.errorf(x.pos(), "index %s is out of bounds", &x) + return i, false + } + // 0 <= i [ && i < max ] + return i, true + } + + return -1, true +} + +// indexElts checks the elements (elts) of an array or slice composite literal +// against the literal's element type (typ), and the element indices against +// the literal length if known (length >= 0). It returns the length of the +// literal (maximum index value + 1). +// +func (check *Checker) indexedElts(elts []ast.Expr, typ Type, length int64) int64 { + visited := make(map[int64]bool, len(elts)) + var index, max int64 + for _, e := range elts { + // determine and check index + validIndex := false + eval := e + if kv, _ := e.(*ast.KeyValueExpr); kv != nil { + if i, ok := check.index(kv.Key, length); ok { + if i >= 0 { + index = i + validIndex = true + } else { + check.errorf(e.Pos(), "index %s must be integer constant", kv.Key) + } + } + eval = kv.Value + } else if length >= 0 && index >= length { + check.errorf(e.Pos(), "index %d is out of bounds (>= %d)", index, length) + } else { + validIndex = true + } + + // if we have a valid index, check for duplicate entries + if validIndex { + if visited[index] { + check.errorf(e.Pos(), "duplicate index %d in array or slice literal", index) + } + visited[index] = true + } + index++ + if index > max { + max = index + } + + // check element against composite literal element type + var x operand + check.exprWithHint(&x, eval, typ) + if !check.assignment(&x, typ) && x.mode != invalid { + check.errorf(x.pos(), "cannot use %s as %s value in array or slice literal", &x, typ) + } + } + return max +} + +// exprKind describes the kind of an expression; the kind +// determines if an expression is valid in 'statement context'. +type exprKind int + +const ( + conversion exprKind = iota + expression + statement +) + +// rawExpr typechecks expression e and initializes x with the expression +// value or type. If an error occurred, x.mode is set to invalid. +// If hint != nil, it is the type of a composite literal element. +// +func (check *Checker) rawExpr(x *operand, e ast.Expr, hint Type) exprKind { + if trace { + check.trace(e.Pos(), "%s", e) + check.indent++ + defer func() { + check.indent-- + check.trace(e.Pos(), "=> %s", x) + }() + } + + kind := check.exprInternal(x, e, hint) + + // convert x into a user-friendly set of values + // TODO(gri) this code can be simplified + var typ Type + var val exact.Value + switch x.mode { + case invalid: + typ = Typ[Invalid] + case novalue: + typ = (*Tuple)(nil) + case constant: + typ = x.typ + val = x.val + default: + typ = x.typ + } + assert(x.expr != nil && typ != nil) + + if isUntyped(typ) { + // delay type and value recording until we know the type + // or until the end of type checking + check.rememberUntyped(x.expr, false, x.mode, typ.(*Basic), val) + } else { + check.recordTypeAndValue(e, x.mode, typ, val) + } + + return kind +} + +// exprInternal contains the core of type checking of expressions. +// Must only be called by rawExpr. +// +func (check *Checker) exprInternal(x *operand, e ast.Expr, hint Type) exprKind { + // make sure x has a valid state in case of bailout + // (was issue 5770) + x.mode = invalid + x.typ = Typ[Invalid] + + switch e := e.(type) { + case *ast.BadExpr: + goto Error // error was reported before + + case *ast.Ident: + check.ident(x, e, nil, nil) + + case *ast.Ellipsis: + // ellipses are handled explicitly where they are legal + // (array composite literals and parameter lists) + check.error(e.Pos(), "invalid use of '...'") + goto Error + + case *ast.BasicLit: + x.setConst(e.Kind, e.Value) + if x.mode == invalid { + check.invalidAST(e.Pos(), "invalid literal %v", e.Value) + goto Error + } + + case *ast.FuncLit: + if sig, ok := check.typ(e.Type).(*Signature); ok { + // Anonymous functions are considered part of the + // init expression/func declaration which contains + // them: use existing package-level declaration info. + check.funcBody(check.decl, "", sig, e.Body) + x.mode = value + x.typ = sig + } else { + check.invalidAST(e.Pos(), "invalid function literal %s", e) + goto Error + } + + case *ast.CompositeLit: + typ := hint + openArray := false + if e.Type != nil { + // [...]T array types may only appear with composite literals. + // Check for them here so we don't have to handle ... in general. + typ = nil + if atyp, _ := e.Type.(*ast.ArrayType); atyp != nil && atyp.Len != nil { + if ellip, _ := atyp.Len.(*ast.Ellipsis); ellip != nil && ellip.Elt == nil { + // We have an "open" [...]T array type. + // Create a new ArrayType with unknown length (-1) + // and finish setting it up after analyzing the literal. + typ = &Array{len: -1, elem: check.typ(atyp.Elt)} + openArray = true + } + } + if typ == nil { + typ = check.typ(e.Type) + } + } + if typ == nil { + // TODO(gri) provide better error messages depending on context + check.error(e.Pos(), "missing type in composite literal") + goto Error + } + + switch typ, _ := deref(typ); utyp := typ.Underlying().(type) { + case *Struct: + if len(e.Elts) == 0 { + break + } + fields := utyp.fields + if _, ok := e.Elts[0].(*ast.KeyValueExpr); ok { + // all elements must have keys + visited := make([]bool, len(fields)) + for _, e := range e.Elts { + kv, _ := e.(*ast.KeyValueExpr) + if kv == nil { + check.error(e.Pos(), "mixture of field:value and value elements in struct literal") + continue + } + key, _ := kv.Key.(*ast.Ident) + if key == nil { + check.errorf(kv.Pos(), "invalid field name %s in struct literal", kv.Key) + continue + } + i := fieldIndex(utyp.fields, check.pkg, key.Name) + if i < 0 { + check.errorf(kv.Pos(), "unknown field %s in struct literal", key.Name) + continue + } + fld := fields[i] + check.recordUse(key, fld) + // 0 <= i < len(fields) + if visited[i] { + check.errorf(kv.Pos(), "duplicate field name %s in struct literal", key.Name) + continue + } + visited[i] = true + check.expr(x, kv.Value) + etyp := fld.typ + if !check.assignment(x, etyp) { + if x.mode != invalid { + check.errorf(x.pos(), "cannot use %s as %s value in struct literal", x, etyp) + } + continue + } + } + } else { + // no element must have a key + for i, e := range e.Elts { + if kv, _ := e.(*ast.KeyValueExpr); kv != nil { + check.error(kv.Pos(), "mixture of field:value and value elements in struct literal") + continue + } + check.expr(x, e) + if i >= len(fields) { + check.error(x.pos(), "too many values in struct literal") + break // cannot continue + } + // i < len(fields) + fld := fields[i] + if !fld.Exported() && fld.pkg != check.pkg { + check.errorf(x.pos(), "implicit assignment to unexported field %s in %s literal", fld.name, typ) + continue + } + etyp := fld.typ + if !check.assignment(x, etyp) { + if x.mode != invalid { + check.errorf(x.pos(), "cannot use %s as %s value in struct literal", x, etyp) + } + continue + } + } + if len(e.Elts) < len(fields) { + check.error(e.Rbrace, "too few values in struct literal") + // ok to continue + } + } + + case *Array: + n := check.indexedElts(e.Elts, utyp.elem, utyp.len) + // if we have an "open" [...]T array, set the length now that we know it + if openArray { + utyp.len = n + } + + case *Slice: + check.indexedElts(e.Elts, utyp.elem, -1) + + case *Map: + visited := make(map[interface{}][]Type, len(e.Elts)) + for _, e := range e.Elts { + kv, _ := e.(*ast.KeyValueExpr) + if kv == nil { + check.error(e.Pos(), "missing key in map literal") + continue + } + check.exprWithHint(x, kv.Key, utyp.key) + if !check.assignment(x, utyp.key) { + if x.mode != invalid { + check.errorf(x.pos(), "cannot use %s as %s key in map literal", x, utyp.key) + } + continue + } + if x.mode == constant { + duplicate := false + // if the key is of interface type, the type is also significant when checking for duplicates + if _, ok := utyp.key.Underlying().(*Interface); ok { + for _, vtyp := range visited[x.val] { + if Identical(vtyp, x.typ) { + duplicate = true + break + } + } + visited[x.val] = append(visited[x.val], x.typ) + } else { + _, duplicate = visited[x.val] + visited[x.val] = nil + } + if duplicate { + check.errorf(x.pos(), "duplicate key %s in map literal", x.val) + continue + } + } + check.exprWithHint(x, kv.Value, utyp.elem) + if !check.assignment(x, utyp.elem) { + if x.mode != invalid { + check.errorf(x.pos(), "cannot use %s as %s value in map literal", x, utyp.elem) + } + continue + } + } + + default: + // if utyp is invalid, an error was reported before + if utyp != Typ[Invalid] { + check.errorf(e.Pos(), "invalid composite literal type %s", typ) + goto Error + } + } + + x.mode = value + x.typ = typ + + case *ast.ParenExpr: + kind := check.rawExpr(x, e.X, nil) + x.expr = e + return kind + + case *ast.SelectorExpr: + check.selector(x, e) + + case *ast.IndexExpr: + check.expr(x, e.X) + if x.mode == invalid { + goto Error + } + + valid := false + length := int64(-1) // valid if >= 0 + switch typ := x.typ.Underlying().(type) { + case *Basic: + if isString(typ) { + valid = true + if x.mode == constant { + length = int64(len(exact.StringVal(x.val))) + } + // an indexed string always yields a byte value + // (not a constant) even if the string and the + // index are constant + x.mode = value + x.typ = universeByte // use 'byte' name + } + + case *Array: + valid = true + length = typ.len + if x.mode != variable { + x.mode = value + } + x.typ = typ.elem + + case *Pointer: + if typ, _ := typ.base.Underlying().(*Array); typ != nil { + valid = true + length = typ.len + x.mode = variable + x.typ = typ.elem + } + + case *Slice: + valid = true + x.mode = variable + x.typ = typ.elem + + case *Map: + var key operand + check.expr(&key, e.Index) + if !check.assignment(&key, typ.key) { + if key.mode != invalid { + check.invalidOp(key.pos(), "cannot use %s as map index of type %s", &key, typ.key) + } + goto Error + } + x.mode = mapindex + x.typ = typ.elem + x.expr = e + return expression + } + + if !valid { + check.invalidOp(x.pos(), "cannot index %s", x) + goto Error + } + + if e.Index == nil { + check.invalidAST(e.Pos(), "missing index for %s", x) + goto Error + } + + check.index(e.Index, length) + // ok to continue + + case *ast.SliceExpr: + check.expr(x, e.X) + if x.mode == invalid { + goto Error + } + + valid := false + length := int64(-1) // valid if >= 0 + switch typ := x.typ.Underlying().(type) { + case *Basic: + if isString(typ) { + if e.Slice3 { + check.invalidOp(x.pos(), "3-index slice of string") + goto Error + } + valid = true + if x.mode == constant { + length = int64(len(exact.StringVal(x.val))) + } + // spec: "For untyped string operands the result + // is a non-constant value of type string." + if typ.kind == UntypedString { + x.typ = Typ[String] + } + } + + case *Array: + valid = true + length = typ.len + if x.mode != variable { + check.invalidOp(x.pos(), "cannot slice %s (value not addressable)", x) + goto Error + } + x.typ = &Slice{elem: typ.elem} + + case *Pointer: + if typ, _ := typ.base.Underlying().(*Array); typ != nil { + valid = true + length = typ.len + x.typ = &Slice{elem: typ.elem} + } + + case *Slice: + valid = true + // x.typ doesn't change + } + + if !valid { + check.invalidOp(x.pos(), "cannot slice %s", x) + goto Error + } + + x.mode = value + + // spec: "Only the first index may be omitted; it defaults to 0." + if e.Slice3 && (e.High == nil || e.Max == nil) { + check.error(e.Rbrack, "2nd and 3rd index required in 3-index slice") + goto Error + } + + // check indices + var ind [3]int64 + for i, expr := range []ast.Expr{e.Low, e.High, e.Max} { + x := int64(-1) + switch { + case expr != nil: + // The "capacity" is only known statically for strings, arrays, + // and pointers to arrays, and it is the same as the length for + // those types. + max := int64(-1) + if length >= 0 { + max = length + 1 + } + if t, ok := check.index(expr, max); ok && t >= 0 { + x = t + } + case i == 0: + // default is 0 for the first index + x = 0 + case length >= 0: + // default is length (== capacity) otherwise + x = length + } + ind[i] = x + } + + // constant indices must be in range + // (check.index already checks that existing indices >= 0) + L: + for i, x := range ind[:len(ind)-1] { + if x > 0 { + for _, y := range ind[i+1:] { + if y >= 0 && x > y { + check.errorf(e.Rbrack, "invalid slice indices: %d > %d", x, y) + break L // only report one error, ok to continue + } + } + } + } + + case *ast.TypeAssertExpr: + check.expr(x, e.X) + if x.mode == invalid { + goto Error + } + xtyp, _ := x.typ.Underlying().(*Interface) + if xtyp == nil { + check.invalidOp(x.pos(), "%s is not an interface", x) + goto Error + } + // x.(type) expressions are handled explicitly in type switches + if e.Type == nil { + check.invalidAST(e.Pos(), "use of .(type) outside type switch") + goto Error + } + T := check.typ(e.Type) + if T == Typ[Invalid] { + goto Error + } + check.typeAssertion(x.pos(), x, xtyp, T) + x.mode = commaok + x.typ = T + + case *ast.CallExpr: + return check.call(x, e) + + case *ast.StarExpr: + check.exprOrType(x, e.X) + switch x.mode { + case invalid: + goto Error + case typexpr: + x.typ = &Pointer{base: x.typ} + default: + if typ, ok := x.typ.Underlying().(*Pointer); ok { + x.mode = variable + x.typ = typ.base + } else { + check.invalidOp(x.pos(), "cannot indirect %s", x) + goto Error + } + } + + case *ast.UnaryExpr: + check.expr(x, e.X) + if x.mode == invalid { + goto Error + } + check.unary(x, e, e.Op) + if x.mode == invalid { + goto Error + } + if e.Op == token.ARROW { + x.expr = e + return statement // receive operations may appear in statement context + } + + case *ast.BinaryExpr: + check.binary(x, e, e.X, e.Y, e.Op) + if x.mode == invalid { + goto Error + } + + case *ast.KeyValueExpr: + // key:value expressions are handled in composite literals + check.invalidAST(e.Pos(), "no key:value expected") + goto Error + + case *ast.ArrayType, *ast.StructType, *ast.FuncType, + *ast.InterfaceType, *ast.MapType, *ast.ChanType: + x.mode = typexpr + x.typ = check.typ(e) + // Note: rawExpr (caller of exprInternal) will call check.recordTypeAndValue + // even though check.typ has already called it. This is fine as both + // times the same expression and type are recorded. It is also not a + // performance issue because we only reach here for composite literal + // types, which are comparatively rare. + + default: + panic(fmt.Sprintf("%s: unknown expression type %T", check.fset.Position(e.Pos()), e)) + } + + // everything went well + x.expr = e + return expression + +Error: + x.mode = invalid + x.expr = e + return statement // avoid follow-up errors +} + +// typeAssertion checks that x.(T) is legal; xtyp must be the type of x. +func (check *Checker) typeAssertion(pos token.Pos, x *operand, xtyp *Interface, T Type) { + method, wrongType := assertableTo(xtyp, T) + if method == nil { + return + } + + var msg string + if wrongType { + msg = "wrong type for method" + } else { + msg = "missing method" + } + check.errorf(pos, "%s cannot have dynamic type %s (%s %s)", x, T, msg, method.name) +} + +// expr typechecks expression e and initializes x with the expression value. +// If an error occurred, x.mode is set to invalid. +// +func (check *Checker) expr(x *operand, e ast.Expr) { + check.rawExpr(x, e, nil) + var msg string + switch x.mode { + default: + return + case novalue: + msg = "used as value" + case builtin: + msg = "must be called" + case typexpr: + msg = "is not an expression" + } + check.errorf(x.pos(), "%s %s", x, msg) + x.mode = invalid +} + +// exprWithHint typechecks expression e and initializes x with the expression value. +// If an error occurred, x.mode is set to invalid. +// If hint != nil, it is the type of a composite literal element. +// +func (check *Checker) exprWithHint(x *operand, e ast.Expr, hint Type) { + assert(hint != nil) + check.rawExpr(x, e, hint) + var msg string + switch x.mode { + default: + return + case novalue: + msg = "used as value" + case builtin: + msg = "must be called" + case typexpr: + msg = "is not an expression" + } + check.errorf(x.pos(), "%s %s", x, msg) + x.mode = invalid +} + +// exprOrType typechecks expression or type e and initializes x with the expression value or type. +// If an error occurred, x.mode is set to invalid. +// +func (check *Checker) exprOrType(x *operand, e ast.Expr) { + check.rawExpr(x, e, nil) + if x.mode == novalue { + check.errorf(x.pos(), "%s used as value or type", x) + x.mode = invalid + } +} diff --git a/vendor/golang.org/x/tools/go/types/exprstring.go b/vendor/golang.org/x/tools/go/types/exprstring.go new file mode 100644 index 0000000000..370bdf3532 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/exprstring.go @@ -0,0 +1,220 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements printing of expressions. + +package types + +import ( + "bytes" + "go/ast" +) + +// ExprString returns the (possibly simplified) string representation for x. +func ExprString(x ast.Expr) string { + var buf bytes.Buffer + WriteExpr(&buf, x) + return buf.String() +} + +// WriteExpr writes the (possibly simplified) string representation for x to buf. +func WriteExpr(buf *bytes.Buffer, x ast.Expr) { + // The AST preserves source-level parentheses so there is + // no need to introduce them here to correct for different + // operator precedences. (This assumes that the AST was + // generated by a Go parser.) + + switch x := x.(type) { + default: + buf.WriteString("(bad expr)") // nil, ast.BadExpr, ast.KeyValueExpr + + case *ast.Ident: + buf.WriteString(x.Name) + + case *ast.Ellipsis: + buf.WriteString("...") + if x.Elt != nil { + WriteExpr(buf, x.Elt) + } + + case *ast.BasicLit: + buf.WriteString(x.Value) + + case *ast.FuncLit: + buf.WriteByte('(') + WriteExpr(buf, x.Type) + buf.WriteString(" literal)") // simplified + + case *ast.CompositeLit: + buf.WriteByte('(') + WriteExpr(buf, x.Type) + buf.WriteString(" literal)") // simplified + + case *ast.ParenExpr: + buf.WriteByte('(') + WriteExpr(buf, x.X) + buf.WriteByte(')') + + case *ast.SelectorExpr: + WriteExpr(buf, x.X) + buf.WriteByte('.') + buf.WriteString(x.Sel.Name) + + case *ast.IndexExpr: + WriteExpr(buf, x.X) + buf.WriteByte('[') + WriteExpr(buf, x.Index) + buf.WriteByte(']') + + case *ast.SliceExpr: + WriteExpr(buf, x.X) + buf.WriteByte('[') + if x.Low != nil { + WriteExpr(buf, x.Low) + } + buf.WriteByte(':') + if x.High != nil { + WriteExpr(buf, x.High) + } + if x.Slice3 { + buf.WriteByte(':') + if x.Max != nil { + WriteExpr(buf, x.Max) + } + } + buf.WriteByte(']') + + case *ast.TypeAssertExpr: + WriteExpr(buf, x.X) + buf.WriteString(".(") + WriteExpr(buf, x.Type) + buf.WriteByte(')') + + case *ast.CallExpr: + WriteExpr(buf, x.Fun) + buf.WriteByte('(') + for i, arg := range x.Args { + if i > 0 { + buf.WriteString(", ") + } + WriteExpr(buf, arg) + } + if x.Ellipsis.IsValid() { + buf.WriteString("...") + } + buf.WriteByte(')') + + case *ast.StarExpr: + buf.WriteByte('*') + WriteExpr(buf, x.X) + + case *ast.UnaryExpr: + buf.WriteString(x.Op.String()) + WriteExpr(buf, x.X) + + case *ast.BinaryExpr: + WriteExpr(buf, x.X) + buf.WriteByte(' ') + buf.WriteString(x.Op.String()) + buf.WriteByte(' ') + WriteExpr(buf, x.Y) + + case *ast.ArrayType: + buf.WriteByte('[') + if x.Len != nil { + WriteExpr(buf, x.Len) + } + buf.WriteByte(']') + WriteExpr(buf, x.Elt) + + case *ast.StructType: + buf.WriteString("struct{") + writeFieldList(buf, x.Fields, "; ", false) + buf.WriteByte('}') + + case *ast.FuncType: + buf.WriteString("func") + writeSigExpr(buf, x) + + case *ast.InterfaceType: + buf.WriteString("interface{") + writeFieldList(buf, x.Methods, "; ", true) + buf.WriteByte('}') + + case *ast.MapType: + buf.WriteString("map[") + WriteExpr(buf, x.Key) + buf.WriteByte(']') + WriteExpr(buf, x.Value) + + case *ast.ChanType: + var s string + switch x.Dir { + case ast.SEND: + s = "chan<- " + case ast.RECV: + s = "<-chan " + default: + s = "chan " + } + buf.WriteString(s) + WriteExpr(buf, x.Value) + } +} + +func writeSigExpr(buf *bytes.Buffer, sig *ast.FuncType) { + buf.WriteByte('(') + writeFieldList(buf, sig.Params, ", ", false) + buf.WriteByte(')') + + res := sig.Results + n := res.NumFields() + if n == 0 { + // no result + return + } + + buf.WriteByte(' ') + if n == 1 && len(res.List[0].Names) == 0 { + // single unnamed result + WriteExpr(buf, res.List[0].Type) + return + } + + // multiple or named result(s) + buf.WriteByte('(') + writeFieldList(buf, res, ", ", false) + buf.WriteByte(')') +} + +func writeFieldList(buf *bytes.Buffer, fields *ast.FieldList, sep string, iface bool) { + for i, f := range fields.List { + if i > 0 { + buf.WriteString(sep) + } + + // field list names + for i, name := range f.Names { + if i > 0 { + buf.WriteString(", ") + } + buf.WriteString(name.Name) + } + + // types of interface methods consist of signatures only + if sig, _ := f.Type.(*ast.FuncType); sig != nil && iface { + writeSigExpr(buf, sig) + continue + } + + // named fields are separated with a blank from the field type + if len(f.Names) > 0 { + buf.WriteByte(' ') + } + + WriteExpr(buf, f.Type) + + // ignore tag + } +} diff --git a/vendor/golang.org/x/tools/go/types/exprstring_test.go b/vendor/golang.org/x/tools/go/types/exprstring_test.go new file mode 100644 index 0000000000..cfd1472216 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/exprstring_test.go @@ -0,0 +1,94 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package types_test + +import ( + "go/parser" + "testing" + + . "golang.org/x/tools/go/types" +) + +var testExprs = []testEntry{ + // basic type literals + dup("x"), + dup("true"), + dup("42"), + dup("3.1415"), + dup("2.71828i"), + dup(`'a'`), + dup(`"foo"`), + dup("`bar`"), + + // func and composite literals + {"func(){}", "(func() literal)"}, + {"func(x int) complex128 {}", "(func(x int) complex128 literal)"}, + {"[]int{1, 2, 3}", "([]int literal)"}, + + // non-type expressions + dup("(x)"), + dup("x.f"), + dup("a[i]"), + + dup("s[:]"), + dup("s[i:]"), + dup("s[:j]"), + dup("s[i:j]"), + dup("s[:j:k]"), + dup("s[i:j:k]"), + + dup("x.(T)"), + + dup("x.([10]int)"), + dup("x.([...]int)"), + + dup("x.(struct{})"), + dup("x.(struct{x int; y, z float32; E})"), + + dup("x.(func())"), + dup("x.(func(x int))"), + dup("x.(func() int)"), + dup("x.(func(x, y int, z float32) (r int))"), + dup("x.(func(a, b, c int))"), + dup("x.(func(x ...T))"), + + dup("x.(interface{})"), + dup("x.(interface{m(); n(x int); E})"), + dup("x.(interface{m(); n(x int) T; E; F})"), + + dup("x.(map[K]V)"), + + dup("x.(chan E)"), + dup("x.(<-chan E)"), + dup("x.(chan<- chan int)"), + dup("x.(chan<- <-chan int)"), + dup("x.(<-chan chan int)"), + dup("x.(chan (<-chan int))"), + + dup("f()"), + dup("f(x)"), + dup("int(x)"), + dup("f(x, x + y)"), + dup("f(s...)"), + dup("f(a, s...)"), + + dup("*x"), + dup("&x"), + dup("x + y"), + dup("x + y << (2 * s)"), +} + +func TestExprString(t *testing.T) { + for _, test := range testExprs { + x, err := parser.ParseExpr(test.src) + if err != nil { + t.Errorf("%s: %s", test.src, err) + continue + } + if got := ExprString(x); got != test.str { + t.Errorf("%s: got %s, want %s", test.src, got, test.str) + } + } +} diff --git a/vendor/golang.org/x/tools/go/types/hilbert_test.go b/vendor/golang.org/x/tools/go/types/hilbert_test.go new file mode 100644 index 0000000000..b555721819 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/hilbert_test.go @@ -0,0 +1,232 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package types_test + +import ( + "bytes" + "flag" + "fmt" + "go/ast" + "go/parser" + "go/token" + "io/ioutil" + "testing" + + . "golang.org/x/tools/go/types" +) + +var ( + H = flag.Int("H", 5, "Hilbert matrix size") + out = flag.String("out", "", "write generated program to out") +) + +func TestHilbert(t *testing.T) { + // generate source + src := program(*H, *out) + if *out != "" { + ioutil.WriteFile(*out, src, 0666) + return + } + + // parse source + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, "hilbert.go", src, 0) + if err != nil { + t.Fatal(err) + } + + // type-check file + DefPredeclaredTestFuncs() // define assert built-in + _, err = Check(f.Name.Name, fset, []*ast.File{f}) + if err != nil { + t.Fatal(err) + } +} + +func program(n int, out string) []byte { + var g gen + + g.p(`// WARNING: GENERATED FILE - DO NOT MODIFY MANUALLY! +// (To generate, in go/types directory: go test -run=Hilbert -H=%d -out=%q) + +// This program tests arbitrary precision constant arithmetic +// by generating the constant elements of a Hilbert matrix H, +// its inverse I, and the product P = H*I. The product should +// be the identity matrix. +package main + +func main() { + if !ok { + printProduct() + return + } + println("PASS") +} + +`, n, out) + g.hilbert(n) + g.inverse(n) + g.product(n) + g.verify(n) + g.printProduct(n) + g.binomials(2*n - 1) + g.factorials(2*n - 1) + + return g.Bytes() +} + +type gen struct { + bytes.Buffer +} + +func (g *gen) p(format string, args ...interface{}) { + fmt.Fprintf(&g.Buffer, format, args...) +} + +func (g *gen) hilbert(n int) { + g.p(`// Hilbert matrix, n = %d +const ( +`, n) + for i := 0; i < n; i++ { + g.p("\t") + for j := 0; j < n; j++ { + if j > 0 { + g.p(", ") + } + g.p("h%d_%d", i, j) + } + if i == 0 { + g.p(" = ") + for j := 0; j < n; j++ { + if j > 0 { + g.p(", ") + } + g.p("1.0/(iota + %d)", j+1) + } + } + g.p("\n") + } + g.p(")\n\n") +} + +func (g *gen) inverse(n int) { + g.p(`// Inverse Hilbert matrix +const ( +`) + for i := 0; i < n; i++ { + for j := 0; j < n; j++ { + s := "+" + if (i+j)&1 != 0 { + s = "-" + } + g.p("\ti%d_%d = %s%d * b%d_%d * b%d_%d * b%d_%d * b%d_%d\n", + i, j, s, i+j+1, n+i, n-j-1, n+j, n-i-1, i+j, i, i+j, i) + } + g.p("\n") + } + g.p(")\n\n") +} + +func (g *gen) product(n int) { + g.p(`// Product matrix +const ( +`) + for i := 0; i < n; i++ { + for j := 0; j < n; j++ { + g.p("\tp%d_%d = ", i, j) + for k := 0; k < n; k++ { + if k > 0 { + g.p(" + ") + } + g.p("h%d_%d*i%d_%d", i, k, k, j) + } + g.p("\n") + } + g.p("\n") + } + g.p(")\n\n") +} + +func (g *gen) verify(n int) { + g.p(`// Verify that product is the identity matrix +const ok = +`) + for i := 0; i < n; i++ { + for j := 0; j < n; j++ { + if j == 0 { + g.p("\t") + } else { + g.p(" && ") + } + v := 0 + if i == j { + v = 1 + } + g.p("p%d_%d == %d", i, j, v) + } + g.p(" &&\n") + } + g.p("\ttrue\n\n") + + // verify ok at type-check time + if *out == "" { + g.p("const _ = assert(ok)\n\n") + } +} + +func (g *gen) printProduct(n int) { + g.p("func printProduct() {\n") + for i := 0; i < n; i++ { + g.p("\tprintln(") + for j := 0; j < n; j++ { + if j > 0 { + g.p(", ") + } + g.p("p%d_%d", i, j) + } + g.p(")\n") + } + g.p("}\n\n") +} + +func (g *gen) mulRange(a, b int) { + if a > b { + g.p("1") + return + } + for i := a; i <= b; i++ { + if i > a { + g.p("*") + } + g.p("%d", i) + } +} + +func (g *gen) binomials(n int) { + g.p(`// Binomials +const ( +`) + for j := 0; j <= n; j++ { + if j > 0 { + g.p("\n") + } + for k := 0; k <= j; k++ { + g.p("\tb%d_%d = f%d / (f%d*f%d)\n", j, k, j, k, j-k) + } + } + g.p(")\n\n") +} + +func (g *gen) factorials(n int) { + g.p(`// Factorials +const ( + f0 = 1 + f1 = 1 +`) + for i := 2; i <= n; i++ { + g.p("\tf%d = f%d * %d\n", i, i-1, i) + } + g.p(")\n\n") +} diff --git a/vendor/golang.org/x/tools/go/types/initorder.go b/vendor/golang.org/x/tools/go/types/initorder.go new file mode 100644 index 0000000000..0fd567b269 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/initorder.go @@ -0,0 +1,222 @@ +// 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 types + +import ( + "container/heap" + "fmt" +) + +// initOrder computes the Info.InitOrder for package variables. +func (check *Checker) initOrder() { + // An InitOrder may already have been computed if a package is + // built from several calls to (*Checker).Files. Clear it. + check.Info.InitOrder = check.Info.InitOrder[:0] + + // compute the object dependency graph and + // initialize a priority queue with the list + // of graph nodes + pq := nodeQueue(dependencyGraph(check.objMap)) + heap.Init(&pq) + + const debug = false + if debug { + fmt.Printf("package %s: object dependency graph\n", check.pkg.Name()) + for _, n := range pq { + for _, o := range n.out { + fmt.Printf("\t%s -> %s\n", n.obj.Name(), o.obj.Name()) + } + } + fmt.Println() + fmt.Printf("package %s: initialization order\n", check.pkg.Name()) + } + + // determine initialization order by removing the highest priority node + // (the one with the fewest dependencies) and its edges from the graph, + // repeatedly, until there are no nodes left. + // In a valid Go program, those nodes always have zero dependencies (after + // removing all incoming dependencies), otherwise there are initialization + // cycles. + mark := 0 + emitted := make(map[*declInfo]bool) + for len(pq) > 0 { + // get the next node + n := heap.Pop(&pq).(*objNode) + + // if n still depends on other nodes, we have a cycle + if n.in > 0 { + mark++ // mark nodes using a different value each time + cycle := findPath(n, n, mark) + if i := valIndex(cycle); i >= 0 { + check.reportCycle(cycle, i) + } + // ok to continue, but the variable initialization order + // will be incorrect at this point since it assumes no + // cycle errors + } + + // reduce dependency count of all dependent nodes + // and update priority queue + for _, out := range n.out { + out.in-- + heap.Fix(&pq, out.index) + } + + // record the init order for variables with initializers only + v, _ := n.obj.(*Var) + info := check.objMap[v] + if v == nil || !info.hasInitializer() { + continue + } + + // n:1 variable declarations such as: a, b = f() + // introduce a node for each lhs variable (here: a, b); + // but they all have the same initializer - emit only + // one, for the first variable seen + if emitted[info] { + continue // initializer already emitted, if any + } + emitted[info] = true + + infoLhs := info.lhs // possibly nil (see declInfo.lhs field comment) + if infoLhs == nil { + infoLhs = []*Var{v} + } + init := &Initializer{infoLhs, info.init} + check.Info.InitOrder = append(check.Info.InitOrder, init) + + if debug { + fmt.Printf("\t%s\n", init) + } + } + + if debug { + fmt.Println() + } +} + +// findPath returns the (reversed) list of nodes z, ... c, b, a, +// such that there is a path (list of edges) from a to z. +// If there is no such path, the result is nil. +// Nodes marked with the value mark are considered "visited"; +// unvisited nodes are marked during the graph search. +func findPath(a, z *objNode, mark int) []*objNode { + if a.mark == mark { + return nil // node already seen + } + a.mark = mark + + for _, n := range a.out { + if n == z { + return []*objNode{z} + } + if P := findPath(n, z, mark); P != nil { + return append(P, n) + } + } + + return nil +} + +// valIndex returns the index of the first constant or variable in a, +// if any; or a value < 0. +func valIndex(a []*objNode) int { + for i, n := range a { + switch n.obj.(type) { + case *Const, *Var: + return i + } + } + return -1 +} + +// reportCycle reports an error for the cycle starting at i. +func (check *Checker) reportCycle(cycle []*objNode, i int) { + obj := cycle[i].obj + check.errorf(obj.Pos(), "initialization cycle for %s", obj.Name()) + // print cycle + for _ = range cycle { + check.errorf(obj.Pos(), "\t%s refers to", obj.Name()) // secondary error, \t indented + i++ + if i >= len(cycle) { + i = 0 + } + obj = cycle[i].obj + } + check.errorf(obj.Pos(), "\t%s", obj.Name()) +} + +// An objNode represents a node in the object dependency graph. +// Each node b in a.out represents an edge a->b indicating that +// b depends on a. +// Nodes may be marked for cycle detection. A node n is marked +// if n.mark corresponds to the current mark value. +type objNode struct { + obj Object // object represented by this node + in int // number of nodes this node depends on + out []*objNode // list of nodes that depend on this node + index int // node index in list of nodes + mark int // for cycle detection +} + +// dependencyGraph computes the transposed object dependency graph +// from the given objMap. The transposed graph is returned as a list +// of nodes; an edge d->n indicates that node n depends on node d. +func dependencyGraph(objMap map[Object]*declInfo) []*objNode { + // M maps each object to its corresponding node + M := make(map[Object]*objNode, len(objMap)) + for obj := range objMap { + M[obj] = &objNode{obj: obj} + } + + // G is the graph of nodes n + G := make([]*objNode, len(M)) + i := 0 + for obj, n := range M { + deps := objMap[obj].deps + n.in = len(deps) + for d := range deps { + d := M[d] // node n depends on node d + d.out = append(d.out, n) // add edge d->n + } + + G[i] = n + n.index = i + i++ + } + + return G +} + +// nodeQueue implements the container/heap interface; +// a nodeQueue may be used as a priority queue. +type nodeQueue []*objNode + +func (a nodeQueue) Len() int { return len(a) } + +func (a nodeQueue) Swap(i, j int) { + x, y := a[i], a[j] + a[i], a[j] = y, x + x.index, y.index = j, i +} + +func (a nodeQueue) Less(i, j int) bool { + x, y := a[i], a[j] + // nodes are prioritized by number of incoming dependencies (1st key) + // and source order (2nd key) + return x.in < y.in || x.in == y.in && x.obj.order() < y.obj.order() +} + +func (a *nodeQueue) Push(x interface{}) { + panic("unreachable") +} + +func (a *nodeQueue) Pop() interface{} { + n := len(*a) + x := (*a)[n-1] + x.index = -1 // for safety + *a = (*a)[:n-1] + return x +} diff --git a/vendor/golang.org/x/tools/go/types/issues_test.go b/vendor/golang.org/x/tools/go/types/issues_test.go new file mode 100644 index 0000000000..04d8b37192 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/issues_test.go @@ -0,0 +1,205 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements tests for various issues. + +package types_test + +import ( + "fmt" + "go/ast" + "go/parser" + "sort" + "strings" + "testing" + + _ "golang.org/x/tools/go/gcimporter" + . "golang.org/x/tools/go/types" +) + +func TestIssue5770(t *testing.T) { + src := `package p; type S struct{T}` + f, err := parser.ParseFile(fset, "", src, 0) + if err != nil { + t.Fatal(err) + } + + _, err = Check(f.Name.Name, fset, []*ast.File{f}) // do not crash + want := "undeclared name: T" + if err == nil || !strings.Contains(err.Error(), want) { + t.Errorf("got: %v; want: %s", err, want) + } +} + +func TestIssue5849(t *testing.T) { + src := ` +package p +var ( + s uint + _ = uint8(8) + _ = uint16(16) << s + _ = uint32(32 << s) + _ = uint64(64 << s + s) + _ = (interface{})("foo") + _ = (interface{})(nil) +)` + f, err := parser.ParseFile(fset, "", src, 0) + if err != nil { + t.Fatal(err) + } + + var conf Config + types := make(map[ast.Expr]TypeAndValue) + _, err = conf.Check(f.Name.Name, fset, []*ast.File{f}, &Info{Types: types}) + if err != nil { + t.Fatal(err) + } + + for x, tv := range types { + var want Type + switch x := x.(type) { + case *ast.BasicLit: + switch x.Value { + case `8`: + want = Typ[Uint8] + case `16`: + want = Typ[Uint16] + case `32`: + want = Typ[Uint32] + case `64`: + want = Typ[Uint] // because of "+ s", s is of type uint + case `"foo"`: + want = Typ[String] + } + case *ast.Ident: + if x.Name == "nil" { + want = Typ[UntypedNil] + } + } + if want != nil && !Identical(tv.Type, want) { + t.Errorf("got %s; want %s", tv.Type, want) + } + } +} + +func TestIssue6413(t *testing.T) { + src := ` +package p +func f() int { + defer f() + go f() + return 0 +} +` + f, err := parser.ParseFile(fset, "", src, 0) + if err != nil { + t.Fatal(err) + } + + var conf Config + types := make(map[ast.Expr]TypeAndValue) + _, err = conf.Check(f.Name.Name, fset, []*ast.File{f}, &Info{Types: types}) + if err != nil { + t.Fatal(err) + } + + want := Typ[Int] + n := 0 + for x, tv := range types { + if _, ok := x.(*ast.CallExpr); ok { + if tv.Type != want { + t.Errorf("%s: got %s; want %s", fset.Position(x.Pos()), tv.Type, want) + } + n++ + } + } + + if n != 2 { + t.Errorf("got %d CallExprs; want 2", n) + } +} + +func TestIssue7245(t *testing.T) { + src := ` +package p +func (T) m() (res bool) { return } +type T struct{} // receiver type after method declaration +` + f, err := parser.ParseFile(fset, "", src, 0) + if err != nil { + t.Fatal(err) + } + + var conf Config + defs := make(map[*ast.Ident]Object) + _, err = conf.Check(f.Name.Name, fset, []*ast.File{f}, &Info{Defs: defs}) + if err != nil { + t.Fatal(err) + } + + m := f.Decls[0].(*ast.FuncDecl) + res1 := defs[m.Name].(*Func).Type().(*Signature).Results().At(0) + res2 := defs[m.Type.Results.List[0].Names[0]].(*Var) + + if res1 != res2 { + t.Errorf("got %s (%p) != %s (%p)", res1, res2, res1, res2) + } +} + +// This tests that uses of existing vars on the LHS of an assignment +// are Uses, not Defs; and also that the (illegal) use of a non-var on +// the LHS of an assignment is a Use nonetheless. +func TestIssue7827(t *testing.T) { + const src = ` +package p +func _() { + const w = 1 // defs w + x, y := 2, 3 // defs x, y + w, x, z := 4, 5, 6 // uses w, x, defs z; error: cannot assign to w + _, _, _ = x, y, z // uses x, y, z +} +` + const want = `L3 defs func p._() +L4 defs const w untyped int +L5 defs var x int +L5 defs var y int +L6 defs var z int +L6 uses const w untyped int +L6 uses var x int +L7 uses var x int +L7 uses var y int +L7 uses var z int` + + f, err := parser.ParseFile(fset, "", src, 0) + if err != nil { + t.Fatal(err) + } + + // don't abort at the first error + conf := Config{Error: func(err error) { t.Log(err) }} + defs := make(map[*ast.Ident]Object) + uses := make(map[*ast.Ident]Object) + _, err = conf.Check(f.Name.Name, fset, []*ast.File{f}, &Info{Defs: defs, Uses: uses}) + if s := fmt.Sprint(err); !strings.HasSuffix(s, "cannot assign to w") { + t.Errorf("Check: unexpected error: %s", s) + } + + var facts []string + for id, obj := range defs { + if obj != nil { + fact := fmt.Sprintf("L%d defs %s", fset.Position(id.Pos()).Line, obj) + facts = append(facts, fact) + } + } + for id, obj := range uses { + fact := fmt.Sprintf("L%d uses %s", fset.Position(id.Pos()).Line, obj) + facts = append(facts, fact) + } + sort.Strings(facts) + + got := strings.Join(facts, "\n") + if got != want { + t.Errorf("Unexpected defs/uses\ngot:\n%s\nwant:\n%s", got, want) + } +} diff --git a/vendor/golang.org/x/tools/go/types/labels.go b/vendor/golang.org/x/tools/go/types/labels.go new file mode 100644 index 0000000000..7364d4dbe6 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/labels.go @@ -0,0 +1,268 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package types + +import ( + "go/ast" + "go/token" +) + +// labels checks correct label use in body. +func (check *Checker) labels(body *ast.BlockStmt) { + // set of all labels in this body + all := NewScope(nil, body.Pos(), body.End(), "label") + + fwdJumps := check.blockBranches(all, nil, nil, body.List) + + // If there are any forward jumps left, no label was found for + // the corresponding goto statements. Either those labels were + // never defined, or they are inside blocks and not reachable + // for the respective gotos. + for _, jmp := range fwdJumps { + var msg string + name := jmp.Label.Name + if alt := all.Lookup(name); alt != nil { + msg = "goto %s jumps into block" + alt.(*Label).used = true // avoid another error + } else { + msg = "label %s not declared" + } + check.errorf(jmp.Label.Pos(), msg, name) + } + + // spec: "It is illegal to define a label that is never used." + for _, obj := range all.elems { + if lbl := obj.(*Label); !lbl.used { + check.softErrorf(lbl.pos, "label %s declared but not used", lbl.name) + } + } +} + +// A block tracks label declarations in a block and its enclosing blocks. +type block struct { + parent *block // enclosing block + lstmt *ast.LabeledStmt // labeled statement to which this block belongs, or nil + labels map[string]*ast.LabeledStmt // allocated lazily +} + +// insert records a new label declaration for the current block. +// The label must not have been declared before in any block. +func (b *block) insert(s *ast.LabeledStmt) { + name := s.Label.Name + if debug { + assert(b.gotoTarget(name) == nil) + } + labels := b.labels + if labels == nil { + labels = make(map[string]*ast.LabeledStmt) + b.labels = labels + } + labels[name] = s +} + +// gotoTarget returns the labeled statement in the current +// or an enclosing block with the given label name, or nil. +func (b *block) gotoTarget(name string) *ast.LabeledStmt { + for s := b; s != nil; s = s.parent { + if t := s.labels[name]; t != nil { + return t + } + } + return nil +} + +// enclosingTarget returns the innermost enclosing labeled +// statement with the given label name, or nil. +func (b *block) enclosingTarget(name string) *ast.LabeledStmt { + for s := b; s != nil; s = s.parent { + if t := s.lstmt; t != nil && t.Label.Name == name { + return t + } + } + return nil +} + +// blockBranches processes a block's statement list and returns the set of outgoing forward jumps. +// all is the scope of all declared labels, parent the set of labels declared in the immediately +// enclosing block, and lstmt is the labeled statement this block is associated with (or nil). +func (check *Checker) blockBranches(all *Scope, parent *block, lstmt *ast.LabeledStmt, list []ast.Stmt) []*ast.BranchStmt { + b := &block{parent: parent, lstmt: lstmt} + + var ( + varDeclPos token.Pos + fwdJumps, badJumps []*ast.BranchStmt + ) + + // All forward jumps jumping over a variable declaration are possibly + // invalid (they may still jump out of the block and be ok). + // recordVarDecl records them for the given position. + recordVarDecl := func(pos token.Pos) { + varDeclPos = pos + badJumps = append(badJumps[:0], fwdJumps...) // copy fwdJumps to badJumps + } + + jumpsOverVarDecl := func(jmp *ast.BranchStmt) bool { + if varDeclPos.IsValid() { + for _, bad := range badJumps { + if jmp == bad { + return true + } + } + } + return false + } + + blockBranches := func(lstmt *ast.LabeledStmt, list []ast.Stmt) { + // Unresolved forward jumps inside the nested block + // become forward jumps in the current block. + fwdJumps = append(fwdJumps, check.blockBranches(all, b, lstmt, list)...) + } + + var stmtBranches func(ast.Stmt) + stmtBranches = func(s ast.Stmt) { + switch s := s.(type) { + case *ast.DeclStmt: + if d, _ := s.Decl.(*ast.GenDecl); d != nil && d.Tok == token.VAR { + recordVarDecl(d.Pos()) + } + + case *ast.LabeledStmt: + // declare non-blank label + if name := s.Label.Name; name != "_" { + lbl := NewLabel(s.Label.Pos(), check.pkg, name) + if alt := all.Insert(lbl); alt != nil { + check.softErrorf(lbl.pos, "label %s already declared", name) + check.reportAltDecl(alt) + // ok to continue + } else { + b.insert(s) + check.recordDef(s.Label, lbl) + } + // resolve matching forward jumps and remove them from fwdJumps + i := 0 + for _, jmp := range fwdJumps { + if jmp.Label.Name == name { + // match + lbl.used = true + check.recordUse(jmp.Label, lbl) + if jumpsOverVarDecl(jmp) { + check.softErrorf( + jmp.Label.Pos(), + "goto %s jumps over variable declaration at line %d", + name, + check.fset.Position(varDeclPos).Line, + ) + // ok to continue + } + } else { + // no match - record new forward jump + fwdJumps[i] = jmp + i++ + } + } + fwdJumps = fwdJumps[:i] + lstmt = s + } + stmtBranches(s.Stmt) + + case *ast.BranchStmt: + if s.Label == nil { + return // checked in 1st pass (check.stmt) + } + + // determine and validate target + name := s.Label.Name + switch s.Tok { + case token.BREAK: + // spec: "If there is a label, it must be that of an enclosing + // "for", "switch", or "select" statement, and that is the one + // whose execution terminates." + valid := false + if t := b.enclosingTarget(name); t != nil { + switch t.Stmt.(type) { + case *ast.SwitchStmt, *ast.TypeSwitchStmt, *ast.SelectStmt, *ast.ForStmt, *ast.RangeStmt: + valid = true + } + } + if !valid { + check.errorf(s.Label.Pos(), "invalid break label %s", name) + return + } + + case token.CONTINUE: + // spec: "If there is a label, it must be that of an enclosing + // "for" statement, and that is the one whose execution advances." + valid := false + if t := b.enclosingTarget(name); t != nil { + switch t.Stmt.(type) { + case *ast.ForStmt, *ast.RangeStmt: + valid = true + } + } + if !valid { + check.errorf(s.Label.Pos(), "invalid continue label %s", name) + return + } + + case token.GOTO: + if b.gotoTarget(name) == nil { + // label may be declared later - add branch to forward jumps + fwdJumps = append(fwdJumps, s) + return + } + + default: + check.invalidAST(s.Pos(), "branch statement: %s %s", s.Tok, name) + return + } + + // record label use + obj := all.Lookup(name) + obj.(*Label).used = true + check.recordUse(s.Label, obj) + + case *ast.AssignStmt: + if s.Tok == token.DEFINE { + recordVarDecl(s.Pos()) + } + + case *ast.BlockStmt: + blockBranches(lstmt, s.List) + + case *ast.IfStmt: + stmtBranches(s.Body) + if s.Else != nil { + stmtBranches(s.Else) + } + + case *ast.CaseClause: + blockBranches(nil, s.Body) + + case *ast.SwitchStmt: + stmtBranches(s.Body) + + case *ast.TypeSwitchStmt: + stmtBranches(s.Body) + + case *ast.CommClause: + blockBranches(nil, s.Body) + + case *ast.SelectStmt: + stmtBranches(s.Body) + + case *ast.ForStmt: + stmtBranches(s.Body) + + case *ast.RangeStmt: + stmtBranches(s.Body) + } + } + + for _, s := range list { + stmtBranches(s) + } + + return fwdJumps +} diff --git a/vendor/golang.org/x/tools/go/types/lookup.go b/vendor/golang.org/x/tools/go/types/lookup.go new file mode 100644 index 0000000000..3caca5519b --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/lookup.go @@ -0,0 +1,341 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements various field and method lookup functions. + +package types + +// LookupFieldOrMethod looks up a field or method with given package and name +// in T and returns the corresponding *Var or *Func, an index sequence, and a +// bool indicating if there were any pointer indirections on the path to the +// field or method. If addressable is set, T is the type of an addressable +// variable (only matters for method lookups). +// +// The last index entry is the field or method index in the (possibly embedded) +// type where the entry was found, either: +// +// 1) the list of declared methods of a named type; or +// 2) the list of all methods (method set) of an interface type; or +// 3) the list of fields of a struct type. +// +// The earlier index entries are the indices of the anonymous struct fields +// traversed to get to the found entry, starting at depth 0. +// +// If no entry is found, a nil object is returned. In this case, the returned +// index and indirect values have the following meaning: +// +// - If index != nil, the index sequence points to an ambiguous entry +// (the same name appeared more than once at the same embedding level). +// +// - If indirect is set, a method with a pointer receiver type was found +// but there was no pointer on the path from the actual receiver type to +// the method's formal receiver base type, nor was the receiver addressable. +// +func LookupFieldOrMethod(T Type, addressable bool, pkg *Package, name string) (obj Object, index []int, indirect bool) { + // Methods cannot be associated to a named pointer type + // (spec: "The type denoted by T is called the receiver base type; + // it must not be a pointer or interface type and it must be declared + // in the same package as the method."). + // Thus, if we have a named pointer type, proceed with the underlying + // pointer type but discard the result if it is a method since we would + // not have found it for T (see also issue 8590). + if t, _ := T.(*Named); t != nil { + if p, _ := t.underlying.(*Pointer); p != nil { + obj, index, indirect = lookupFieldOrMethod(p, false, pkg, name) + if _, ok := obj.(*Func); ok { + return nil, nil, false + } + return + } + } + + return lookupFieldOrMethod(T, addressable, pkg, name) +} + +// TODO(gri) The named type consolidation and seen maps below must be +// indexed by unique keys for a given type. Verify that named +// types always have only one representation (even when imported +// indirectly via different packages.) + +func lookupFieldOrMethod(T Type, addressable bool, pkg *Package, name string) (obj Object, index []int, indirect bool) { + // WARNING: The code in this function is extremely subtle - do not modify casually! + // This function and NewMethodSet should be kept in sync. + + if name == "_" { + return // blank fields/methods are never found + } + + typ, isPtr := deref(T) + named, _ := typ.(*Named) + + // *typ where typ is an interface has no methods. + if isPtr { + utyp := typ + if named != nil { + utyp = named.underlying + } + if _, ok := utyp.(*Interface); ok { + return + } + } + + // Start with typ as single entry at shallowest depth. + // If typ is not a named type, insert a nil type instead. + current := []embeddedType{{named, nil, isPtr, false}} + + // named types that we have seen already, allocated lazily + var seen map[*Named]bool + + // search current depth + for len(current) > 0 { + var next []embeddedType // embedded types found at current depth + + // look for (pkg, name) in all types at current depth + for _, e := range current { + // The very first time only, e.typ may be nil. + // In this case, we don't have a named type and + // we simply continue with the underlying type. + if e.typ != nil { + if seen[e.typ] { + // We have seen this type before, at a more shallow depth + // (note that multiples of this type at the current depth + // were consolidated before). The type at that depth shadows + // this same type at the current depth, so we can ignore + // this one. + continue + } + if seen == nil { + seen = make(map[*Named]bool) + } + seen[e.typ] = true + + // look for a matching attached method + if i, m := lookupMethod(e.typ.methods, pkg, name); m != nil { + // potential match + assert(m.typ != nil) + index = concat(e.index, i) + if obj != nil || e.multiples { + return nil, index, false // collision + } + obj = m + indirect = e.indirect + continue // we can't have a matching field or interface method + } + + // continue with underlying type + typ = e.typ.underlying + } + + switch t := typ.(type) { + case *Struct: + // look for a matching field and collect embedded types + for i, f := range t.fields { + if f.sameId(pkg, name) { + assert(f.typ != nil) + index = concat(e.index, i) + if obj != nil || e.multiples { + return nil, index, false // collision + } + obj = f + indirect = e.indirect + continue // we can't have a matching interface method + } + // Collect embedded struct fields for searching the next + // lower depth, but only if we have not seen a match yet + // (if we have a match it is either the desired field or + // we have a name collision on the same depth; in either + // case we don't need to look further). + // Embedded fields are always of the form T or *T where + // T is a named type. If e.typ appeared multiple times at + // this depth, f.typ appears multiple times at the next + // depth. + if obj == nil && f.anonymous { + // Ignore embedded basic types - only user-defined + // named types can have methods or struct fields. + typ, isPtr := deref(f.typ) + if t, _ := typ.(*Named); t != nil { + next = append(next, embeddedType{t, concat(e.index, i), e.indirect || isPtr, e.multiples}) + } + } + } + + case *Interface: + // look for a matching method + // TODO(gri) t.allMethods is sorted - use binary search + if i, m := lookupMethod(t.allMethods, pkg, name); m != nil { + assert(m.typ != nil) + index = concat(e.index, i) + if obj != nil || e.multiples { + return nil, index, false // collision + } + obj = m + indirect = e.indirect + } + } + } + + if obj != nil { + // found a potential match + // spec: "A method call x.m() is valid if the method set of (the type of) x + // contains m and the argument list can be assigned to the parameter + // list of m. If x is addressable and &x's method set contains m, x.m() + // is shorthand for (&x).m()". + if f, _ := obj.(*Func); f != nil && ptrRecv(f) && !indirect && !addressable { + return nil, nil, true // pointer/addressable receiver required + } + return + } + + current = consolidateMultiples(next) + } + + return nil, nil, false // not found +} + +// embeddedType represents an embedded named type +type embeddedType struct { + typ *Named // nil means use the outer typ variable instead + index []int // embedded field indices, starting with index at depth 0 + indirect bool // if set, there was a pointer indirection on the path to this field + multiples bool // if set, typ appears multiple times at this depth +} + +// consolidateMultiples collects multiple list entries with the same type +// into a single entry marked as containing multiples. The result is the +// consolidated list. +func consolidateMultiples(list []embeddedType) []embeddedType { + if len(list) <= 1 { + return list // at most one entry - nothing to do + } + + n := 0 // number of entries w/ unique type + prev := make(map[*Named]int) // index at which type was previously seen + for _, e := range list { + if i, found := prev[e.typ]; found { + list[i].multiples = true + // ignore this entry + } else { + prev[e.typ] = n + list[n] = e + n++ + } + } + return list[:n] +} + +// MissingMethod returns (nil, false) if V implements T, otherwise it +// returns a missing method required by T and whether it is missing or +// just has the wrong type. +// +// For non-interface types V, or if static is set, V implements T if all +// methods of T are present in V. Otherwise (V is an interface and static +// is not set), MissingMethod only checks that methods of T which are also +// present in V have matching types (e.g., for a type assertion x.(T) where +// x is of interface type V). +// +func MissingMethod(V Type, T *Interface, static bool) (method *Func, wrongType bool) { + // fast path for common case + if T.Empty() { + return + } + + // TODO(gri) Consider using method sets here. Might be more efficient. + + if ityp, _ := V.Underlying().(*Interface); ityp != nil { + // TODO(gri) allMethods is sorted - can do this more efficiently + for _, m := range T.allMethods { + _, obj := lookupMethod(ityp.allMethods, m.pkg, m.name) + switch { + case obj == nil: + if static { + return m, false + } + case !Identical(obj.Type(), m.typ): + return m, true + } + } + return + } + + // A concrete type implements T if it implements all methods of T. + for _, m := range T.allMethods { + obj, _, _ := lookupFieldOrMethod(V, false, m.pkg, m.name) + + f, _ := obj.(*Func) + if f == nil { + return m, false + } + + if !Identical(f.typ, m.typ) { + return m, true + } + } + + return +} + +// assertableTo reports whether a value of type V can be asserted to have type T. +// It returns (nil, false) as affirmative answer. Otherwise it returns a missing +// method required by V and whether it is missing or just has the wrong type. +func assertableTo(V *Interface, T Type) (method *Func, wrongType bool) { + // no static check is required if T is an interface + // spec: "If T is an interface type, x.(T) asserts that the + // dynamic type of x implements the interface T." + if _, ok := T.Underlying().(*Interface); ok && !strict { + return + } + return MissingMethod(T, V, false) +} + +// deref dereferences typ if it is a *Pointer and returns its base and true. +// Otherwise it returns (typ, false). +func deref(typ Type) (Type, bool) { + if p, _ := typ.(*Pointer); p != nil { + return p.base, true + } + return typ, false +} + +// derefStructPtr dereferences typ if it is a (named or unnamed) pointer to a +// (named or unnamed) struct and returns its base. Otherwise it returns typ. +func derefStructPtr(typ Type) Type { + if p, _ := typ.Underlying().(*Pointer); p != nil { + if _, ok := p.base.Underlying().(*Struct); ok { + return p.base + } + } + return typ +} + +// concat returns the result of concatenating list and i. +// The result does not share its underlying array with list. +func concat(list []int, i int) []int { + var t []int + t = append(t, list...) + return append(t, i) +} + +// fieldIndex returns the index for the field with matching package and name, or a value < 0. +func fieldIndex(fields []*Var, pkg *Package, name string) int { + if name != "_" { + for i, f := range fields { + if f.sameId(pkg, name) { + return i + } + } + } + return -1 +} + +// lookupMethod returns the index of and method with matching package and name, or (-1, nil). +func lookupMethod(methods []*Func, pkg *Package, name string) (int, *Func) { + if name != "_" { + for i, m := range methods { + if m.sameId(pkg, name) { + return i, m + } + } + } + return -1, nil +} diff --git a/vendor/golang.org/x/tools/go/types/methodset.go b/vendor/golang.org/x/tools/go/types/methodset.go new file mode 100644 index 0000000000..8aff6f9ba4 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/methodset.go @@ -0,0 +1,271 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements method sets. + +package types + +import ( + "bytes" + "fmt" + "sort" +) + +// A MethodSet is an ordered set of concrete or abstract (interface) methods; +// a method is a MethodVal selection, and they are ordered by ascending m.Obj().Id(). +// The zero value for a MethodSet is a ready-to-use empty method set. +type MethodSet struct { + list []*Selection +} + +func (s *MethodSet) String() string { + if s.Len() == 0 { + return "MethodSet {}" + } + + var buf bytes.Buffer + fmt.Fprintln(&buf, "MethodSet {") + for _, f := range s.list { + fmt.Fprintf(&buf, "\t%s\n", f) + } + fmt.Fprintln(&buf, "}") + return buf.String() +} + +// Len returns the number of methods in s. +func (s *MethodSet) Len() int { return len(s.list) } + +// At returns the i'th method in s for 0 <= i < s.Len(). +func (s *MethodSet) At(i int) *Selection { return s.list[i] } + +// Lookup returns the method with matching package and name, or nil if not found. +func (s *MethodSet) Lookup(pkg *Package, name string) *Selection { + if s.Len() == 0 { + return nil + } + + key := Id(pkg, name) + i := sort.Search(len(s.list), func(i int) bool { + m := s.list[i] + return m.obj.Id() >= key + }) + if i < len(s.list) { + m := s.list[i] + if m.obj.Id() == key { + return m + } + } + return nil +} + +// Shared empty method set. +var emptyMethodSet MethodSet + +// NewMethodSet returns the method set for the given type T. It +// always returns a non-nil method set, even if it is empty. +// +// A MethodSetCache handles repeat queries more efficiently. +// +func NewMethodSet(T Type) *MethodSet { + // WARNING: The code in this function is extremely subtle - do not modify casually! + // This function and lookupFieldOrMethod should be kept in sync. + + // method set up to the current depth, allocated lazily + var base methodSet + + typ, isPtr := deref(T) + named, _ := typ.(*Named) + + // *typ where typ is an interface has no methods. + if isPtr { + utyp := typ + if named != nil { + utyp = named.underlying + } + if _, ok := utyp.(*Interface); ok { + return &emptyMethodSet + } + } + + // Start with typ as single entry at shallowest depth. + // If typ is not a named type, insert a nil type instead. + current := []embeddedType{{named, nil, isPtr, false}} + + // named types that we have seen already, allocated lazily + var seen map[*Named]bool + + // collect methods at current depth + for len(current) > 0 { + var next []embeddedType // embedded types found at current depth + + // field and method sets at current depth, allocated lazily + var fset fieldSet + var mset methodSet + + for _, e := range current { + // The very first time only, e.typ may be nil. + // In this case, we don't have a named type and + // we simply continue with the underlying type. + if e.typ != nil { + if seen[e.typ] { + // We have seen this type before, at a more shallow depth + // (note that multiples of this type at the current depth + // were consolidated before). The type at that depth shadows + // this same type at the current depth, so we can ignore + // this one. + continue + } + if seen == nil { + seen = make(map[*Named]bool) + } + seen[e.typ] = true + + mset = mset.add(e.typ.methods, e.index, e.indirect, e.multiples) + + // continue with underlying type + typ = e.typ.underlying + } + + switch t := typ.(type) { + case *Struct: + for i, f := range t.fields { + fset = fset.add(f, e.multiples) + + // Embedded fields are always of the form T or *T where + // T is a named type. If typ appeared multiple times at + // this depth, f.Type appears multiple times at the next + // depth. + if f.anonymous { + // Ignore embedded basic types - only user-defined + // named types can have methods or struct fields. + typ, isPtr := deref(f.typ) + if t, _ := typ.(*Named); t != nil { + next = append(next, embeddedType{t, concat(e.index, i), e.indirect || isPtr, e.multiples}) + } + } + } + + case *Interface: + mset = mset.add(t.allMethods, e.index, true, e.multiples) + } + } + + // Add methods and collisions at this depth to base if no entries with matching + // names exist already. + for k, m := range mset { + if _, found := base[k]; !found { + // Fields collide with methods of the same name at this depth. + if _, found := fset[k]; found { + m = nil // collision + } + if base == nil { + base = make(methodSet) + } + base[k] = m + } + } + + // Multiple fields with matching names collide at this depth and shadow all + // entries further down; add them as collisions to base if no entries with + // matching names exist already. + for k, f := range fset { + if f == nil { + if _, found := base[k]; !found { + if base == nil { + base = make(methodSet) + } + base[k] = nil // collision + } + } + } + + current = consolidateMultiples(next) + } + + if len(base) == 0 { + return &emptyMethodSet + } + + // collect methods + var list []*Selection + for _, m := range base { + if m != nil { + m.recv = T + list = append(list, m) + } + } + sort.Sort(byUniqueName(list)) + return &MethodSet{list} +} + +// A fieldSet is a set of fields and name collisions. +// A collision indicates that multiple fields with the +// same unique id appeared. +type fieldSet map[string]*Var // a nil entry indicates a name collision + +// Add adds field f to the field set s. +// If multiples is set, f appears multiple times +// and is treated as a collision. +func (s fieldSet) add(f *Var, multiples bool) fieldSet { + if s == nil { + s = make(fieldSet) + } + key := f.Id() + // if f is not in the set, add it + if !multiples { + if _, found := s[key]; !found { + s[key] = f + return s + } + } + s[key] = nil // collision + return s +} + +// A methodSet is a set of methods and name collisions. +// A collision indicates that multiple methods with the +// same unique id appeared. +type methodSet map[string]*Selection // a nil entry indicates a name collision + +// Add adds all functions in list to the method set s. +// If multiples is set, every function in list appears multiple times +// and is treated as a collision. +func (s methodSet) add(list []*Func, index []int, indirect bool, multiples bool) methodSet { + if len(list) == 0 { + return s + } + if s == nil { + s = make(methodSet) + } + for i, f := range list { + key := f.Id() + // if f is not in the set, add it + if !multiples { + // TODO(gri) A found method may not be added because it's not in the method set + // (!indirect && ptrRecv(f)). A 2nd method on the same level may be in the method + // set and may not collide with the first one, thus leading to a false positive. + // Is that possible? Investigate. + if _, found := s[key]; !found && (indirect || !ptrRecv(f)) { + s[key] = &Selection{MethodVal, nil, f, concat(index, i), indirect} + continue + } + } + s[key] = nil // collision + } + return s +} + +// ptrRecv reports whether the receiver is of the form *T. +// The receiver must exist. +func ptrRecv(f *Func) bool { + _, isPtr := deref(f.typ.(*Signature).recv.typ) + return isPtr +} + +// byUniqueName function lists can be sorted by their unique names. +type byUniqueName []*Selection + +func (a byUniqueName) Len() int { return len(a) } +func (a byUniqueName) Less(i, j int) bool { return a[i].obj.Id() < a[j].obj.Id() } +func (a byUniqueName) Swap(i, j int) { a[i], a[j] = a[j], a[i] } diff --git a/vendor/golang.org/x/tools/go/types/object.go b/vendor/golang.org/x/tools/go/types/object.go new file mode 100644 index 0000000000..a9b6c43f5a --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/object.go @@ -0,0 +1,361 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package types + +import ( + "bytes" + "fmt" + "go/ast" + "go/token" + + "golang.org/x/tools/go/exact" +) + +// TODO(gri) Document factory, accessor methods, and fields. General clean-up. + +// An Object describes a named language entity such as a package, +// constant, type, variable, function (incl. methods), or label. +// All objects implement the Object interface. +// +type Object interface { + Parent() *Scope // scope in which this object is declared + Pos() token.Pos // position of object identifier in declaration + Pkg() *Package // nil for objects in the Universe scope and labels + Name() string // package local object name + Type() Type // object type + Exported() bool // reports whether the name starts with a capital letter + Id() string // object id (see Id below) + + // String returns a human-readable string of the object. + String() string + + // order reflects a package-level object's source order: if object + // a is before object b in the source, then a.order() < b.order(). + // order returns a value > 0 for package-level objects; it returns + // 0 for all other objects (including objects in file scopes). + order() uint32 + + // setOrder sets the order number of the object. It must be > 0. + setOrder(uint32) + + // setParent sets the parent scope of the object. + setParent(*Scope) + + // sameId reports whether obj.Id() and Id(pkg, name) are the same. + sameId(pkg *Package, name string) bool + + // scopePos returns the start position of the scope of this Object + scopePos() token.Pos + + // setScopePos sets the start position of the scope for this Object. + setScopePos(pos token.Pos) +} + +// Id returns name if it is exported, otherwise it +// returns the name qualified with the package path. +func Id(pkg *Package, name string) string { + if ast.IsExported(name) { + return name + } + // unexported names need the package path for differentiation + // (if there's no package, make sure we don't start with '.' + // as that may change the order of methods between a setup + // inside a package and outside a package - which breaks some + // tests) + path := "_" + // TODO(gri): shouldn't !ast.IsExported(name) => pkg != nil be an precondition? + // if pkg == nil { + // panic("nil package in lookup of unexported name") + // } + if pkg != nil { + path = pkg.path + if path == "" { + path = "_" + } + } + return path + "." + name +} + +// An object implements the common parts of an Object. +type object struct { + parent *Scope + pos token.Pos + pkg *Package + name string + typ Type + order_ uint32 + scopePos_ token.Pos +} + +func (obj *object) Parent() *Scope { return obj.parent } +func (obj *object) Pos() token.Pos { return obj.pos } +func (obj *object) Pkg() *Package { return obj.pkg } +func (obj *object) Name() string { return obj.name } +func (obj *object) Type() Type { return obj.typ } +func (obj *object) Exported() bool { return ast.IsExported(obj.name) } +func (obj *object) Id() string { return Id(obj.pkg, obj.name) } +func (obj *object) String() string { panic("abstract") } +func (obj *object) order() uint32 { return obj.order_ } +func (obj *object) scopePos() token.Pos { return obj.scopePos_ } + +func (obj *object) setParent(parent *Scope) { obj.parent = parent } +func (obj *object) setOrder(order uint32) { assert(order > 0); obj.order_ = order } +func (obj *object) setScopePos(pos token.Pos) { obj.scopePos_ = pos } + +func (obj *object) sameId(pkg *Package, name string) bool { + // spec: + // "Two identifiers are different if they are spelled differently, + // or if they appear in different packages and are not exported. + // Otherwise, they are the same." + if name != obj.name { + return false + } + // obj.Name == name + if obj.Exported() { + return true + } + // not exported, so packages must be the same (pkg == nil for + // fields in Universe scope; this can only happen for types + // introduced via Eval) + if pkg == nil || obj.pkg == nil { + return pkg == obj.pkg + } + // pkg != nil && obj.pkg != nil + return pkg.path == obj.pkg.path +} + +// A PkgName represents an imported Go package. +type PkgName struct { + object + imported *Package + used bool // set if the package was used +} + +func NewPkgName(pos token.Pos, pkg *Package, name string, imported *Package) *PkgName { + return &PkgName{object{nil, pos, pkg, name, Typ[Invalid], 0, token.NoPos}, imported, false} +} + +// Imported returns the package that was imported. +// It is distinct from Pkg(), which is the package containing the import statement. +func (obj *PkgName) Imported() *Package { return obj.imported } + +// A Const represents a declared constant. +type Const struct { + object + val exact.Value + visited bool // for initialization cycle detection +} + +func NewConst(pos token.Pos, pkg *Package, name string, typ Type, val exact.Value) *Const { + return &Const{object{nil, pos, pkg, name, typ, 0, token.NoPos}, val, false} +} + +func (obj *Const) Val() exact.Value { return obj.val } + +// A TypeName represents a declared type. +type TypeName struct { + object +} + +func NewTypeName(pos token.Pos, pkg *Package, name string, typ Type) *TypeName { + return &TypeName{object{nil, pos, pkg, name, typ, 0, token.NoPos}} +} + +// A Variable represents a declared variable (including function parameters and results, and struct fields). +type Var struct { + object + anonymous bool // if set, the variable is an anonymous struct field, and name is the type name + visited bool // for initialization cycle detection + isField bool // var is struct field + used bool // set if the variable was used +} + +func NewVar(pos token.Pos, pkg *Package, name string, typ Type) *Var { + return &Var{object: object{nil, pos, pkg, name, typ, 0, token.NoPos}} +} + +func NewParam(pos token.Pos, pkg *Package, name string, typ Type) *Var { + return &Var{object: object{nil, pos, pkg, name, typ, 0, token.NoPos}, used: true} // parameters are always 'used' +} + +func NewField(pos token.Pos, pkg *Package, name string, typ Type, anonymous bool) *Var { + return &Var{object: object{nil, pos, pkg, name, typ, 0, token.NoPos}, anonymous: anonymous, isField: true} +} + +func (obj *Var) Anonymous() bool { return obj.anonymous } + +func (obj *Var) IsField() bool { return obj.isField } + +// A Func represents a declared function, concrete method, or abstract +// (interface) method. Its Type() is always a *Signature. +// An abstract method may belong to many interfaces due to embedding. +type Func struct { + object +} + +func NewFunc(pos token.Pos, pkg *Package, name string, sig *Signature) *Func { + // don't store a nil signature + var typ Type + if sig != nil { + typ = sig + } + return &Func{object{nil, pos, pkg, name, typ, 0, token.NoPos}} +} + +// FullName returns the package- or receiver-type-qualified name of +// function or method obj. +func (obj *Func) FullName() string { + var buf bytes.Buffer + writeFuncName(&buf, obj, nil) + return buf.String() +} + +func (obj *Func) Scope() *Scope { + return obj.typ.(*Signature).scope +} + +// A Label represents a declared label. +type Label struct { + object + used bool // set if the label was used +} + +func NewLabel(pos token.Pos, pkg *Package, name string) *Label { + return &Label{object{pos: pos, pkg: pkg, name: name, typ: Typ[Invalid]}, false} +} + +// A Builtin represents a built-in function. +// Builtins don't have a valid type. +type Builtin struct { + object + id builtinId +} + +func newBuiltin(id builtinId) *Builtin { + return &Builtin{object{name: predeclaredFuncs[id].name, typ: Typ[Invalid]}, id} +} + +// Nil represents the predeclared value nil. +type Nil struct { + object +} + +func writeObject(buf *bytes.Buffer, obj Object, qf Qualifier) { + typ := obj.Type() + switch obj := obj.(type) { + case *PkgName: + fmt.Fprintf(buf, "package %s", obj.Name()) + if path := obj.imported.path; path != "" && path != obj.name { + fmt.Fprintf(buf, " (%q)", path) + } + return + + case *Const: + buf.WriteString("const") + + case *TypeName: + buf.WriteString("type") + typ = typ.Underlying() + + case *Var: + if obj.isField { + buf.WriteString("field") + } else { + buf.WriteString("var") + } + + case *Func: + buf.WriteString("func ") + writeFuncName(buf, obj, qf) + if typ != nil { + WriteSignature(buf, typ.(*Signature), qf) + } + return + + case *Label: + buf.WriteString("label") + typ = nil + + case *Builtin: + buf.WriteString("builtin") + typ = nil + + case *Nil: + buf.WriteString("nil") + return + + default: + panic(fmt.Sprintf("writeObject(%T)", obj)) + } + + buf.WriteByte(' ') + + // For package-level objects, qualify the name. + if obj.Pkg() != nil && obj.Pkg().scope.Lookup(obj.Name()) == obj { + writePackage(buf, obj.Pkg(), qf) + } + buf.WriteString(obj.Name()) + if typ != nil { + buf.WriteByte(' ') + WriteType(buf, typ, qf) + } +} + +func writePackage(buf *bytes.Buffer, pkg *Package, qf Qualifier) { + if pkg == nil { + return + } + var s string + if qf != nil { + s = qf(pkg) + } else { + s = pkg.Path() + } + if s != "" { + buf.WriteString(s) + buf.WriteByte('.') + } +} + +// ObjectString returns the string form of obj. +// The Qualifier controls the printing of +// package-level objects, and may be nil. +func ObjectString(obj Object, qf Qualifier) string { + var buf bytes.Buffer + writeObject(&buf, obj, qf) + return buf.String() +} + +func (obj *PkgName) String() string { return ObjectString(obj, nil) } +func (obj *Const) String() string { return ObjectString(obj, nil) } +func (obj *TypeName) String() string { return ObjectString(obj, nil) } +func (obj *Var) String() string { return ObjectString(obj, nil) } +func (obj *Func) String() string { return ObjectString(obj, nil) } +func (obj *Label) String() string { return ObjectString(obj, nil) } +func (obj *Builtin) String() string { return ObjectString(obj, nil) } +func (obj *Nil) String() string { return ObjectString(obj, nil) } + +func writeFuncName(buf *bytes.Buffer, f *Func, qf Qualifier) { + if f.typ != nil { + sig := f.typ.(*Signature) + if recv := sig.Recv(); recv != nil { + buf.WriteByte('(') + if _, ok := recv.Type().(*Interface); ok { + // gcimporter creates abstract methods of + // named interfaces using the interface type + // (not the named type) as the receiver. + // Don't print it in full. + buf.WriteString("interface") + } else { + WriteType(buf, recv.Type(), qf) + } + buf.WriteByte(')') + buf.WriteByte('.') + } else if f.pkg != nil { + writePackage(buf, f.pkg, qf) + } + } + buf.WriteString(f.name) +} diff --git a/vendor/golang.org/x/tools/go/types/objset.go b/vendor/golang.org/x/tools/go/types/objset.go new file mode 100644 index 0000000000..55eb74addb --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/objset.go @@ -0,0 +1,31 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements objsets. +// +// An objset is similar to a Scope but objset elements +// are identified by their unique id, instead of their +// object name. + +package types + +// An objset is a set of objects identified by their unique id. +// The zero value for objset is a ready-to-use empty objset. +type objset map[string]Object // initialized lazily + +// insert attempts to insert an object obj into objset s. +// If s already contains an alternative object alt with +// the same name, insert leaves s unchanged and returns alt. +// Otherwise it inserts obj and returns nil. +func (s *objset) insert(obj Object) Object { + id := obj.Id() + if alt := (*s)[id]; alt != nil { + return alt + } + if *s == nil { + *s = make(map[string]Object) + } + (*s)[id] = obj + return nil +} diff --git a/vendor/golang.org/x/tools/go/types/operand.go b/vendor/golang.org/x/tools/go/types/operand.go new file mode 100644 index 0000000000..d52b30e161 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/operand.go @@ -0,0 +1,288 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file defines operands and associated operations. + +package types + +import ( + "bytes" + "go/ast" + "go/token" + + "golang.org/x/tools/go/exact" +) + +// An operandMode specifies the (addressing) mode of an operand. +type operandMode byte + +const ( + invalid operandMode = iota // operand is invalid + novalue // operand represents no value (result of a function call w/o result) + builtin // operand is a built-in function + typexpr // operand is a type + constant // operand is a constant; the operand's typ is a Basic type + variable // operand is an addressable variable + mapindex // operand is a map index expression (acts like a variable on lhs, commaok on rhs of an assignment) + value // operand is a computed value + commaok // like value, but operand may be used in a comma,ok expression +) + +var operandModeString = [...]string{ + invalid: "invalid operand", + novalue: "no value", + builtin: "built-in", + typexpr: "type", + constant: "constant", + variable: "variable", + mapindex: "map index expression", + value: "value", + commaok: "comma, ok expression", +} + +// An operand represents an intermediate value during type checking. +// Operands have an (addressing) mode, the expression evaluating to +// the operand, the operand's type, a value for constants, and an id +// for built-in functions. +// The zero value of operand is a ready to use invalid operand. +// +type operand struct { + mode operandMode + expr ast.Expr + typ Type + val exact.Value + id builtinId +} + +// pos returns the position of the expression corresponding to x. +// If x is invalid the position is token.NoPos. +// +func (x *operand) pos() token.Pos { + // x.expr may not be set if x is invalid + if x.expr == nil { + return token.NoPos + } + return x.expr.Pos() +} + +// Operand string formats +// (not all "untyped" cases can appear due to the type system, +// but they fall out naturally here) +// +// mode format +// +// invalid ( ) +// novalue ( ) +// builtin ( ) +// typexpr ( ) +// +// constant ( ) +// constant ( of type ) +// constant ( ) +// constant ( of type ) +// +// variable ( ) +// variable ( of type ) +// +// mapindex ( ) +// mapindex ( of type ) +// +// value ( ) +// value ( of type ) +// +// commaok ( ) +// commaok ( of type ) +// +func operandString(x *operand, qf Qualifier) string { + var buf bytes.Buffer + + var expr string + if x.expr != nil { + expr = ExprString(x.expr) + } else { + switch x.mode { + case builtin: + expr = predeclaredFuncs[x.id].name + case typexpr: + expr = TypeString(x.typ, qf) + case constant: + expr = x.val.String() + } + } + + // ( + if expr != "" { + buf.WriteString(expr) + buf.WriteString(" (") + } + + // + hasType := false + switch x.mode { + case invalid, novalue, builtin, typexpr: + // no type + default: + // has type + if isUntyped(x.typ) { + buf.WriteString(x.typ.(*Basic).name) + buf.WriteByte(' ') + break + } + hasType = true + } + + // + buf.WriteString(operandModeString[x.mode]) + + // + if x.mode == constant { + if s := x.val.String(); s != expr { + buf.WriteByte(' ') + buf.WriteString(s) + } + } + + // + if hasType { + if x.typ != Typ[Invalid] { + buf.WriteString(" of type ") + WriteType(&buf, x.typ, qf) + } else { + buf.WriteString(" with invalid type") + } + } + + // ) + if expr != "" { + buf.WriteByte(')') + } + + return buf.String() +} + +func (x *operand) String() string { + return operandString(x, nil) +} + +// setConst sets x to the untyped constant for literal lit. +func (x *operand) setConst(tok token.Token, lit string) { + val := exact.MakeFromLiteral(lit, tok) + if val == nil { + // TODO(gri) Should we make it an unknown constant instead? + x.mode = invalid + return + } + + var kind BasicKind + switch tok { + case token.INT: + kind = UntypedInt + case token.FLOAT: + kind = UntypedFloat + case token.IMAG: + kind = UntypedComplex + case token.CHAR: + kind = UntypedRune + case token.STRING: + kind = UntypedString + } + + x.mode = constant + x.typ = Typ[kind] + x.val = val +} + +// isNil reports whether x is the nil value. +func (x *operand) isNil() bool { + return x.mode == value && x.typ == Typ[UntypedNil] +} + +// TODO(gri) The functions operand.assignableTo, checker.convertUntyped, +// checker.representable, and checker.assignment are +// overlapping in functionality. Need to simplify and clean up. + +// assignableTo reports whether x is assignable to a variable of type T. +func (x *operand) assignableTo(conf *Config, T Type) bool { + if x.mode == invalid || T == Typ[Invalid] { + return true // avoid spurious errors + } + + V := x.typ + + // x's type is identical to T + if Identical(V, T) { + return true + } + + Vu := V.Underlying() + Tu := T.Underlying() + + // T is an interface type and x implements T + // (Do this check first as it might succeed early.) + if Ti, ok := Tu.(*Interface); ok { + if Implements(x.typ, Ti) { + return true + } + } + + // x's type V and T have identical underlying types + // and at least one of V or T is not a named type + if Identical(Vu, Tu) && (!isNamed(V) || !isNamed(T)) { + return true + } + + // x is a bidirectional channel value, T is a channel + // type, x's type V and T have identical element types, + // and at least one of V or T is not a named type + if Vc, ok := Vu.(*Chan); ok && Vc.dir == SendRecv { + if Tc, ok := Tu.(*Chan); ok && Identical(Vc.elem, Tc.elem) { + return !isNamed(V) || !isNamed(T) + } + } + + // x is the predeclared identifier nil and T is a pointer, + // function, slice, map, channel, or interface type + if x.isNil() { + switch t := Tu.(type) { + case *Basic: + if t.kind == UnsafePointer { + return true + } + case *Pointer, *Signature, *Slice, *Map, *Chan, *Interface: + return true + } + return false + } + + // x is an untyped constant representable by a value of type T + // TODO(gri) This is borrowing from checker.convertUntyped and + // checker.representable. Need to clean up. + if isUntyped(Vu) { + switch t := Tu.(type) { + case *Basic: + if x.mode == constant { + return representableConst(x.val, conf, t.kind, nil) + } + // The result of a comparison is an untyped boolean, + // but may not be a constant. + if Vb, _ := Vu.(*Basic); Vb != nil { + return Vb.kind == UntypedBool && isBoolean(Tu) + } + case *Interface: + return x.isNil() || t.Empty() + case *Pointer, *Signature, *Slice, *Map, *Chan: + return x.isNil() + } + } + + return false +} + +// isInteger reports whether x is a value of integer type +// or an untyped constant representable as an integer. +func (x *operand) isInteger() bool { + return x.mode == invalid || + isInteger(x.typ) || + isUntyped(x.typ) && x.mode == constant && representableConst(x.val, nil, UntypedInt, nil) // no *Config required for UntypedInt +} diff --git a/vendor/golang.org/x/tools/go/types/ordering.go b/vendor/golang.org/x/tools/go/types/ordering.go new file mode 100644 index 0000000000..6bb98f2dc1 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/ordering.go @@ -0,0 +1,127 @@ +// 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. + +// This file implements resolveOrder. + +package types + +import ( + "go/ast" + "sort" +) + +// resolveOrder computes the order in which package-level objects +// must be type-checked. +// +// Interface types appear first in the list, sorted topologically +// by dependencies on embedded interfaces that are also declared +// in this package, followed by all other objects sorted in source +// order. +// +// TODO(gri) Consider sorting all types by dependencies here, and +// in the process check _and_ report type cycles. This may simplify +// the full type-checking phase. +// +func (check *Checker) resolveOrder() []Object { + var ifaces, others []Object + + // collect interface types with their dependencies, and all other objects + for obj := range check.objMap { + if ityp := check.interfaceFor(obj); ityp != nil { + ifaces = append(ifaces, obj) + // determine dependencies on embedded interfaces + for _, f := range ityp.Methods.List { + if len(f.Names) == 0 { + // Embedded interface: The type must be a (possibly + // qualified) identifier denoting another interface. + // Imported interfaces are already fully resolved, + // so we can ignore qualified identifiers. + if ident, _ := f.Type.(*ast.Ident); ident != nil { + embedded := check.pkg.scope.Lookup(ident.Name) + if check.interfaceFor(embedded) != nil { + check.objMap[obj].addDep(embedded) + } + } + } + } + } else { + others = append(others, obj) + } + } + + // final object order + var order []Object + + // sort interface types topologically by dependencies, + // and in source order if there are no dependencies + sort.Sort(inSourceOrder(ifaces)) + if debug { + for _, obj := range ifaces { + assert(check.objMap[obj].mark == 0) + } + } + for _, obj := range ifaces { + check.appendInPostOrder(&order, obj) + } + + // sort everything else in source order + sort.Sort(inSourceOrder(others)) + + return append(order, others...) +} + +// interfaceFor returns the AST interface denoted by obj, or nil. +func (check *Checker) interfaceFor(obj Object) *ast.InterfaceType { + tname, _ := obj.(*TypeName) + if tname == nil { + return nil // not a type + } + d := check.objMap[obj] + if d == nil { + check.dump("%s: %s should have been declared", obj.Pos(), obj.Name()) + unreachable() + } + if d.typ == nil { + return nil // invalid AST - ignore (will be handled later) + } + ityp, _ := d.typ.(*ast.InterfaceType) + return ityp +} + +func (check *Checker) appendInPostOrder(order *[]Object, obj Object) { + d := check.objMap[obj] + if d.mark != 0 { + // We've already seen this object; either because it's + // already added to order, or because we have a cycle. + // In both cases we stop. Cycle errors are reported + // when type-checking types. + return + } + d.mark = 1 + + for _, obj := range orderedSetObjects(d.deps) { + check.appendInPostOrder(order, obj) + } + + *order = append(*order, obj) +} + +func orderedSetObjects(set map[Object]bool) []Object { + list := make([]Object, len(set)) + i := 0 + for obj := range set { + // we don't care about the map element value + list[i] = obj + i++ + } + sort.Sort(inSourceOrder(list)) + return list +} + +// inSourceOrder implements the sort.Sort interface. +type inSourceOrder []Object + +func (a inSourceOrder) Len() int { return len(a) } +func (a inSourceOrder) Less(i, j int) bool { return a[i].order() < a[j].order() } +func (a inSourceOrder) Swap(i, j int) { a[i], a[j] = a[j], a[i] } diff --git a/vendor/golang.org/x/tools/go/types/package.go b/vendor/golang.org/x/tools/go/types/package.go new file mode 100644 index 0000000000..48fe8398fe --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/package.go @@ -0,0 +1,65 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package types + +import ( + "fmt" + "go/token" +) + +// A Package describes a Go package. +type Package struct { + path string + name string + scope *Scope + complete bool + imports []*Package + fake bool // scope lookup errors are silently dropped if package is fake (internal use only) +} + +// NewPackage returns a new Package for the given package path and name; +// the name must not be the blank identifier. +// The package is not complete and contains no explicit imports. +func NewPackage(path, name string) *Package { + if name == "_" { + panic("invalid package name _") + } + scope := NewScope(Universe, token.NoPos, token.NoPos, fmt.Sprintf("package %q", path)) + return &Package{path: path, name: name, scope: scope} +} + +// Path returns the package path. +func (pkg *Package) Path() string { return pkg.path } + +// Name returns the package name. +func (pkg *Package) Name() string { return pkg.name } + +// Scope returns the (complete or incomplete) package scope +// holding the objects declared at package level (TypeNames, +// Consts, Vars, and Funcs). +func (pkg *Package) Scope() *Scope { return pkg.scope } + +// A package is complete if its scope contains (at least) all +// exported objects; otherwise it is incomplete. +func (pkg *Package) Complete() bool { return pkg.complete } + +// MarkComplete marks a package as complete. +func (pkg *Package) MarkComplete() { pkg.complete = true } + +// Imports returns the list of packages directly imported by +// pkg; the list is in source order. Package unsafe is excluded. +// +// If pkg was loaded from export data, Imports includes packages that +// provide package-level objects referenced by pkg. This may be more or +// less than the set of packages directly imported by pkg's source code. +func (pkg *Package) Imports() []*Package { return pkg.imports } + +// SetImports sets the list of explicitly imported packages to list. +// It is the caller's responsibility to make sure list elements are unique. +func (pkg *Package) SetImports(list []*Package) { pkg.imports = list } + +func (pkg *Package) String() string { + return fmt.Sprintf("package %s (%q)", pkg.name, pkg.path) +} diff --git a/vendor/golang.org/x/tools/go/types/predicates.go b/vendor/golang.org/x/tools/go/types/predicates.go new file mode 100644 index 0000000000..993c6d290b --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/predicates.go @@ -0,0 +1,309 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements commonly used type predicates. + +package types + +import "sort" + +func isNamed(typ Type) bool { + if _, ok := typ.(*Basic); ok { + return ok + } + _, ok := typ.(*Named) + return ok +} + +func isBoolean(typ Type) bool { + t, ok := typ.Underlying().(*Basic) + return ok && t.info&IsBoolean != 0 +} + +func isInteger(typ Type) bool { + t, ok := typ.Underlying().(*Basic) + return ok && t.info&IsInteger != 0 +} + +func isUnsigned(typ Type) bool { + t, ok := typ.Underlying().(*Basic) + return ok && t.info&IsUnsigned != 0 +} + +func isFloat(typ Type) bool { + t, ok := typ.Underlying().(*Basic) + return ok && t.info&IsFloat != 0 +} + +func isComplex(typ Type) bool { + t, ok := typ.Underlying().(*Basic) + return ok && t.info&IsComplex != 0 +} + +func isNumeric(typ Type) bool { + t, ok := typ.Underlying().(*Basic) + return ok && t.info&IsNumeric != 0 +} + +func isString(typ Type) bool { + t, ok := typ.Underlying().(*Basic) + return ok && t.info&IsString != 0 +} + +func isTyped(typ Type) bool { + t, ok := typ.Underlying().(*Basic) + return !ok || t.info&IsUntyped == 0 +} + +func isUntyped(typ Type) bool { + t, ok := typ.Underlying().(*Basic) + return ok && t.info&IsUntyped != 0 +} + +func isOrdered(typ Type) bool { + t, ok := typ.Underlying().(*Basic) + return ok && t.info&IsOrdered != 0 +} + +func isConstType(typ Type) bool { + t, ok := typ.Underlying().(*Basic) + return ok && t.info&IsConstType != 0 +} + +// IsInterface reports whether typ is an interface type. +func IsInterface(typ Type) bool { + _, ok := typ.Underlying().(*Interface) + return ok +} + +// Comparable reports whether values of type T are comparable. +func Comparable(T Type) bool { + switch t := T.Underlying().(type) { + case *Basic: + // assume invalid types to be comparable + // to avoid follow-up errors + return t.kind != UntypedNil + case *Pointer, *Interface, *Chan: + return true + case *Struct: + for _, f := range t.fields { + if !Comparable(f.typ) { + return false + } + } + return true + case *Array: + return Comparable(t.elem) + } + return false +} + +// hasNil reports whether a type includes the nil value. +func hasNil(typ Type) bool { + switch t := typ.Underlying().(type) { + case *Basic: + return t.kind == UnsafePointer + case *Slice, *Pointer, *Signature, *Interface, *Map, *Chan: + return true + } + return false +} + +// Identical reports whether x and y are identical. +func Identical(x, y Type) bool { + return identical(x, y, nil) +} + +// An ifacePair is a node in a stack of interface type pairs compared for identity. +type ifacePair struct { + x, y *Interface + prev *ifacePair +} + +func (p *ifacePair) identical(q *ifacePair) bool { + return p.x == q.x && p.y == q.y || p.x == q.y && p.y == q.x +} + +func identical(x, y Type, p *ifacePair) bool { + if x == y { + return true + } + + switch x := x.(type) { + case *Basic: + // Basic types are singletons except for the rune and byte + // aliases, thus we cannot solely rely on the x == y check + // above. + if y, ok := y.(*Basic); ok { + return x.kind == y.kind + } + + case *Array: + // Two array types are identical if they have identical element types + // and the same array length. + if y, ok := y.(*Array); ok { + return x.len == y.len && identical(x.elem, y.elem, p) + } + + case *Slice: + // Two slice types are identical if they have identical element types. + if y, ok := y.(*Slice); ok { + return identical(x.elem, y.elem, p) + } + + case *Struct: + // Two struct types are identical if they have the same sequence of fields, + // and if corresponding fields have the same names, and identical types, + // and identical tags. Two anonymous fields are considered to have the same + // name. Lower-case field names from different packages are always different. + if y, ok := y.(*Struct); ok { + if x.NumFields() == y.NumFields() { + for i, f := range x.fields { + g := y.fields[i] + if f.anonymous != g.anonymous || + x.Tag(i) != y.Tag(i) || + !f.sameId(g.pkg, g.name) || + !identical(f.typ, g.typ, p) { + return false + } + } + return true + } + } + + case *Pointer: + // Two pointer types are identical if they have identical base types. + if y, ok := y.(*Pointer); ok { + return identical(x.base, y.base, p) + } + + case *Tuple: + // Two tuples types are identical if they have the same number of elements + // and corresponding elements have identical types. + if y, ok := y.(*Tuple); ok { + if x.Len() == y.Len() { + if x != nil { + for i, v := range x.vars { + w := y.vars[i] + if !identical(v.typ, w.typ, p) { + return false + } + } + } + return true + } + } + + case *Signature: + // Two function types are identical if they have the same number of parameters + // and result values, corresponding parameter and result types are identical, + // and either both functions are variadic or neither is. Parameter and result + // names are not required to match. + if y, ok := y.(*Signature); ok { + return x.variadic == y.variadic && + identical(x.params, y.params, p) && + identical(x.results, y.results, p) + } + + case *Interface: + // Two interface types are identical if they have the same set of methods with + // the same names and identical function types. Lower-case method names from + // different packages are always different. The order of the methods is irrelevant. + if y, ok := y.(*Interface); ok { + a := x.allMethods + b := y.allMethods + if len(a) == len(b) { + // Interface types are the only types where cycles can occur + // that are not "terminated" via named types; and such cycles + // can only be created via method parameter types that are + // anonymous interfaces (directly or indirectly) embedding + // the current interface. Example: + // + // type T interface { + // m() interface{T} + // } + // + // If two such (differently named) interfaces are compared, + // endless recursion occurs if the cycle is not detected. + // + // If x and y were compared before, they must be equal + // (if they were not, the recursion would have stopped); + // search the ifacePair stack for the same pair. + // + // This is a quadratic algorithm, but in practice these stacks + // are extremely short (bounded by the nesting depth of interface + // type declarations that recur via parameter types, an extremely + // rare occurrence). An alternative implementation might use a + // "visited" map, but that is probably less efficient overall. + q := &ifacePair{x, y, p} + for p != nil { + if p.identical(q) { + return true // same pair was compared before + } + p = p.prev + } + if debug { + assert(sort.IsSorted(byUniqueMethodName(a))) + assert(sort.IsSorted(byUniqueMethodName(b))) + } + for i, f := range a { + g := b[i] + if f.Id() != g.Id() || !identical(f.typ, g.typ, q) { + return false + } + } + return true + } + } + + case *Map: + // Two map types are identical if they have identical key and value types. + if y, ok := y.(*Map); ok { + return identical(x.key, y.key, p) && identical(x.elem, y.elem, p) + } + + case *Chan: + // Two channel types are identical if they have identical value types + // and the same direction. + if y, ok := y.(*Chan); ok { + return x.dir == y.dir && identical(x.elem, y.elem, p) + } + + case *Named: + // Two named types are identical if their type names originate + // in the same type declaration. + if y, ok := y.(*Named); ok { + return x.obj == y.obj + } + + default: + unreachable() + } + + return false +} + +// defaultType returns the default "typed" type for an "untyped" type; +// it returns the incoming type for all other types. The default type +// for untyped nil is untyped nil. +// +func defaultType(typ Type) Type { + if t, ok := typ.(*Basic); ok { + switch t.kind { + case UntypedBool: + return Typ[Bool] + case UntypedInt: + return Typ[Int] + case UntypedRune: + return universeRune // use 'rune' name + case UntypedFloat: + return Typ[Float64] + case UntypedComplex: + return Typ[Complex128] + case UntypedString: + return Typ[String] + } + } + return typ +} diff --git a/vendor/golang.org/x/tools/go/types/resolver.go b/vendor/golang.org/x/tools/go/types/resolver.go new file mode 100644 index 0000000000..374ffc2800 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/resolver.go @@ -0,0 +1,453 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package types + +import ( + "errors" + "fmt" + "go/ast" + "go/token" + pathLib "path" + "strconv" + "strings" + "unicode" + + "golang.org/x/tools/go/exact" +) + +// A declInfo describes a package-level const, type, var, or func declaration. +type declInfo struct { + file *Scope // scope of file containing this declaration + lhs []*Var // lhs of n:1 variable declarations, or nil + typ ast.Expr // type, or nil + init ast.Expr // init expression, or nil + fdecl *ast.FuncDecl // func declaration, or nil + + deps map[Object]bool // type and init dependencies; lazily allocated + mark int // for dependency analysis +} + +// hasInitializer reports whether the declared object has an initialization +// expression or function body. +func (d *declInfo) hasInitializer() bool { + return d.init != nil || d.fdecl != nil && d.fdecl.Body != nil +} + +// addDep adds obj as a dependency to d. +func (d *declInfo) addDep(obj Object) { + m := d.deps + if m == nil { + m = make(map[Object]bool) + d.deps = m + } + m[obj] = true +} + +// arityMatch checks that the lhs and rhs of a const or var decl +// have the appropriate number of names and init exprs. For const +// decls, init is the value spec providing the init exprs; for +// var decls, init is nil (the init exprs are in s in this case). +func (check *Checker) arityMatch(s, init *ast.ValueSpec) { + l := len(s.Names) + r := len(s.Values) + if init != nil { + r = len(init.Values) + } + + switch { + case init == nil && r == 0: + // var decl w/o init expr + if s.Type == nil { + check.errorf(s.Pos(), "missing type or init expr") + } + case l < r: + if l < len(s.Values) { + // init exprs from s + n := s.Values[l] + check.errorf(n.Pos(), "extra init expr %s", n) + // TODO(gri) avoid declared but not used error here + } else { + // init exprs "inherited" + check.errorf(s.Pos(), "extra init expr at %s", init.Pos()) + // TODO(gri) avoid declared but not used error here + } + case l > r && (init != nil || r != 1): + n := s.Names[r] + check.errorf(n.Pos(), "missing init expr for %s", n) + } +} + +func validatedImportPath(path string) (string, error) { + s, err := strconv.Unquote(path) + if err != nil { + return "", err + } + if s == "" { + return "", fmt.Errorf("empty string") + } + const illegalChars = `!"#$%&'()*,:;<=>?[\]^{|}` + "`\uFFFD" + for _, r := range s { + if !unicode.IsGraphic(r) || unicode.IsSpace(r) || strings.ContainsRune(illegalChars, r) { + return s, fmt.Errorf("invalid character %#U", r) + } + } + return s, nil +} + +// declarePkgObj declares obj in the package scope, records its ident -> obj mapping, +// and updates check.objMap. The object must not be a function or method. +func (check *Checker) declarePkgObj(ident *ast.Ident, obj Object, d *declInfo) { + assert(ident.Name == obj.Name()) + + // spec: "A package-scope or file-scope identifier with name init + // may only be declared to be a function with this (func()) signature." + if ident.Name == "init" { + check.errorf(ident.Pos(), "cannot declare init - must be func") + return + } + + check.declare(check.pkg.scope, ident, obj, token.NoPos) + check.objMap[obj] = d + obj.setOrder(uint32(len(check.objMap))) +} + +// filename returns a filename suitable for debugging output. +func (check *Checker) filename(fileNo int) string { + file := check.files[fileNo] + if pos := file.Pos(); pos.IsValid() { + return check.fset.File(pos).Name() + } + return fmt.Sprintf("file[%d]", fileNo) +} + +// collectObjects collects all file and package objects and inserts them +// into their respective scopes. It also performs imports and associates +// methods with receiver base type names. +func (check *Checker) collectObjects() { + pkg := check.pkg + + importer := check.conf.Import + if importer == nil { + if DefaultImport != nil { + importer = DefaultImport + } else { + // Panic if we encounter an import. + importer = func(map[string]*Package, string) (*Package, error) { + panic(`no Config.Import or DefaultImport (missing import _ "golang.org/x/tools/go/gcimporter"?)`) + } + } + } + + // pkgImports is the set of packages already imported by any package file seen + // so far. Used to avoid duplicate entries in pkg.imports. Allocate and populate + // it (pkg.imports may not be empty if we are checking test files incrementally). + var pkgImports = make(map[*Package]bool) + for _, imp := range pkg.imports { + pkgImports[imp] = true + } + + for fileNo, file := range check.files { + // The package identifier denotes the current package, + // but there is no corresponding package object. + check.recordDef(file.Name, nil) + + // Use the actual source file extent rather than *ast.File extent since the + // latter doesn't include comments which appear at the start or end of the file. + // Be conservative and use the *ast.File extent if we don't have a *token.File. + pos, end := file.Pos(), file.End() + if f := check.fset.File(file.Pos()); f != nil { + pos, end = token.Pos(f.Base()), token.Pos(f.Base()+f.Size()) + } + fileScope := NewScope(check.pkg.scope, pos, end, check.filename(fileNo)) + check.recordScope(file, fileScope) + + for _, decl := range file.Decls { + switch d := decl.(type) { + case *ast.BadDecl: + // ignore + + case *ast.GenDecl: + var last *ast.ValueSpec // last ValueSpec with type or init exprs seen + for iota, spec := range d.Specs { + switch s := spec.(type) { + case *ast.ImportSpec: + // import package + var imp *Package + path, err := validatedImportPath(s.Path.Value) + if err != nil { + check.errorf(s.Path.Pos(), "invalid import path (%s)", err) + continue + } + if path == "C" && check.conf.FakeImportC { + // TODO(gri) shouldn't create a new one each time + imp = NewPackage("C", "C") + imp.fake = true + } else { + var err error + imp, err = importer(check.conf.Packages, path) + if imp == nil && err == nil { + err = errors.New("Config.Import returned nil but no error") + } + if err != nil { + check.errorf(s.Path.Pos(), "could not import %s (%s)", path, err) + continue + } + } + + // add package to list of explicit imports + // (this functionality is provided as a convenience + // for clients; it is not needed for type-checking) + if !pkgImports[imp] { + pkgImports[imp] = true + if imp != Unsafe { + pkg.imports = append(pkg.imports, imp) + } + } + + // local name overrides imported package name + name := imp.name + if s.Name != nil { + name = s.Name.Name + if name == "init" { + check.errorf(s.Name.Pos(), "cannot declare init - must be func") + continue + } + } + + obj := NewPkgName(s.Pos(), pkg, name, imp) + if s.Name != nil { + // in a dot-import, the dot represents the package + check.recordDef(s.Name, obj) + } else { + check.recordImplicit(s, obj) + } + + // add import to file scope + if name == "." { + // merge imported scope with file scope + for _, obj := range imp.scope.elems { + // A package scope may contain non-exported objects, + // do not import them! + if obj.Exported() { + // TODO(gri) When we import a package, we create + // a new local package object. We should do the + // same for each dot-imported object. That way + // they can have correct position information. + // (We must not modify their existing position + // information because the same package - found + // via Config.Packages - may be dot-imported in + // another package!) + check.declare(fileScope, nil, obj, token.NoPos) + check.recordImplicit(s, obj) + } + } + // add position to set of dot-import positions for this file + // (this is only needed for "imported but not used" errors) + check.addUnusedDotImport(fileScope, imp, s.Pos()) + } else { + // declare imported package object in file scope + check.declare(fileScope, nil, obj, token.NoPos) + } + + case *ast.ValueSpec: + switch d.Tok { + case token.CONST: + // determine which initialization expressions to use + switch { + case s.Type != nil || len(s.Values) > 0: + last = s + case last == nil: + last = new(ast.ValueSpec) // make sure last exists + } + + // declare all constants + for i, name := range s.Names { + obj := NewConst(name.Pos(), pkg, name.Name, nil, exact.MakeInt64(int64(iota))) + + var init ast.Expr + if i < len(last.Values) { + init = last.Values[i] + } + + d := &declInfo{file: fileScope, typ: last.Type, init: init} + check.declarePkgObj(name, obj, d) + } + + check.arityMatch(s, last) + + case token.VAR: + lhs := make([]*Var, len(s.Names)) + // If there's exactly one rhs initializer, use + // the same declInfo d1 for all lhs variables + // so that each lhs variable depends on the same + // rhs initializer (n:1 var declaration). + var d1 *declInfo + if len(s.Values) == 1 { + // The lhs elements are only set up after the for loop below, + // but that's ok because declareVar only collects the declInfo + // for a later phase. + d1 = &declInfo{file: fileScope, lhs: lhs, typ: s.Type, init: s.Values[0]} + } + + // declare all variables + for i, name := range s.Names { + obj := NewVar(name.Pos(), pkg, name.Name, nil) + lhs[i] = obj + + d := d1 + if d == nil { + // individual assignments + var init ast.Expr + if i < len(s.Values) { + init = s.Values[i] + } + d = &declInfo{file: fileScope, typ: s.Type, init: init} + } + + check.declarePkgObj(name, obj, d) + } + + check.arityMatch(s, nil) + + default: + check.invalidAST(s.Pos(), "invalid token %s", d.Tok) + } + + case *ast.TypeSpec: + obj := NewTypeName(s.Name.Pos(), pkg, s.Name.Name, nil) + check.declarePkgObj(s.Name, obj, &declInfo{file: fileScope, typ: s.Type}) + + default: + check.invalidAST(s.Pos(), "unknown ast.Spec node %T", s) + } + } + + case *ast.FuncDecl: + name := d.Name.Name + obj := NewFunc(d.Name.Pos(), pkg, name, nil) + if d.Recv == nil { + // regular function + if name == "init" { + // don't declare init functions in the package scope - they are invisible + obj.parent = pkg.scope + check.recordDef(d.Name, obj) + // init functions must have a body + if d.Body == nil { + check.softErrorf(obj.pos, "missing function body") + } + } else { + check.declare(pkg.scope, d.Name, obj, token.NoPos) + } + } else { + // method + check.recordDef(d.Name, obj) + // Associate method with receiver base type name, if possible. + // Ignore methods that have an invalid receiver, or a blank _ + // receiver name. They will be type-checked later, with regular + // functions. + if list := d.Recv.List; len(list) > 0 { + typ := list[0].Type + if ptr, _ := typ.(*ast.StarExpr); ptr != nil { + typ = ptr.X + } + if base, _ := typ.(*ast.Ident); base != nil && base.Name != "_" { + check.assocMethod(base.Name, obj) + } + } + } + info := &declInfo{file: fileScope, fdecl: d} + check.objMap[obj] = info + obj.setOrder(uint32(len(check.objMap))) + + default: + check.invalidAST(d.Pos(), "unknown ast.Decl node %T", d) + } + } + } + + // verify that objects in package and file scopes have different names + for _, scope := range check.pkg.scope.children /* file scopes */ { + for _, obj := range scope.elems { + if alt := pkg.scope.Lookup(obj.Name()); alt != nil { + if pkg, ok := obj.(*PkgName); ok { + check.errorf(alt.Pos(), "%s already declared through import of %s", alt.Name(), pkg.Imported()) + check.reportAltDecl(pkg) + } else { + check.errorf(alt.Pos(), "%s already declared through dot-import of %s", alt.Name(), obj.Pkg()) + // TODO(gri) dot-imported objects don't have a position; reportAltDecl won't print anything + check.reportAltDecl(obj) + } + } + } + } +} + +// packageObjects typechecks all package objects in objList, but not function bodies. +func (check *Checker) packageObjects(objList []Object) { + // add new methods to already type-checked types (from a prior Checker.Files call) + for _, obj := range objList { + if obj, _ := obj.(*TypeName); obj != nil && obj.typ != nil { + check.addMethodDecls(obj) + } + } + + // pre-allocate space for type declaration paths so that the underlying array is reused + typePath := make([]*TypeName, 0, 8) + + for _, obj := range objList { + check.objDecl(obj, nil, typePath) + } + + // At this point we may have a non-empty check.methods map; this means that not all + // entries were deleted at the end of typeDecl because the respective receiver base + // types were not found. In that case, an error was reported when declaring those + // methods. We can now safely discard this map. + check.methods = nil +} + +// functionBodies typechecks all function bodies. +func (check *Checker) functionBodies() { + for _, f := range check.funcs { + check.funcBody(f.decl, f.name, f.sig, f.body) + } +} + +// unusedImports checks for unused imports. +func (check *Checker) unusedImports() { + // if function bodies are not checked, packages' uses are likely missing - don't check + if check.conf.IgnoreFuncBodies { + return + } + + // spec: "It is illegal (...) to directly import a package without referring to + // any of its exported identifiers. To import a package solely for its side-effects + // (initialization), use the blank identifier as explicit package name." + + // check use of regular imported packages + for _, scope := range check.pkg.scope.children /* file scopes */ { + for _, obj := range scope.elems { + if obj, ok := obj.(*PkgName); ok { + // Unused "blank imports" are automatically ignored + // since _ identifiers are not entered into scopes. + if !obj.used { + path := obj.imported.path + base := pathLib.Base(path) + if obj.name == base { + check.softErrorf(obj.pos, "%q imported but not used", path) + } else { + check.softErrorf(obj.pos, "%q imported but not used as %s", path, obj.name) + } + } + } + } + } + + // check use of dot-imported packages + for _, unusedDotImports := range check.unusedDotImports { + for pkg, pos := range unusedDotImports { + check.softErrorf(pos, "%q imported but not used", pkg.path) + } + } +} diff --git a/vendor/golang.org/x/tools/go/types/resolver_test.go b/vendor/golang.org/x/tools/go/types/resolver_test.go new file mode 100644 index 0000000000..2ef1f18648 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/resolver_test.go @@ -0,0 +1,189 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package types_test + +import ( + "fmt" + "go/ast" + "go/parser" + "go/token" + "sort" + "testing" + + _ "golang.org/x/tools/go/gcimporter" + . "golang.org/x/tools/go/types" +) + +func TestResolveIdents(t *testing.T) { + skipSpecialPlatforms(t) + + sources := []string{ + ` + package p + import "fmt" + import "math" + const pi = math.Pi + func sin(x float64) float64 { + return math.Sin(x) + } + var Println = fmt.Println + `, + ` + package p + import "fmt" + type errorStringer struct { fmt.Stringer; error } + func f() string { + _ = "foo" + return fmt.Sprintf("%d", g()) + } + func g() (x int) { return } + `, + ` + package p + import . "go/parser" + import "sync" + func h() Mode { return ImportsOnly } + var _, x int = 1, 2 + func init() {} + type T struct{ *sync.Mutex; a, b, c int} + type I interface{ m() } + var _ = T{a: 1, b: 2, c: 3} + func (_ T) m() {} + func (T) _() {} + var i I + var _ = i.m + func _(s []int) { for i, x := range s { _, _ = i, x } } + func _(x interface{}) { + switch x := x.(type) { + case int: + _ = x + } + switch {} // implicit 'true' tag + } + `, + ` + package p + type S struct{} + func (T) _() {} + func (T) _() {} + `, + ` + package p + func _() { + L0: + L1: + goto L0 + for { + goto L1 + } + if true { + goto L2 + } + L2: + } + `, + } + + pkgnames := []string{ + "fmt", + "math", + } + + // parse package files + fset := token.NewFileSet() + var files []*ast.File + for i, src := range sources { + f, err := parser.ParseFile(fset, fmt.Sprintf("sources[%d]", i), src, parser.DeclarationErrors) + if err != nil { + t.Fatal(err) + } + files = append(files, f) + } + + // resolve and type-check package AST + var conf Config + uses := make(map[*ast.Ident]Object) + defs := make(map[*ast.Ident]Object) + _, err := conf.Check("testResolveIdents", fset, files, &Info{Defs: defs, Uses: uses}) + if err != nil { + t.Fatal(err) + } + + // check that all packages were imported + for _, name := range pkgnames { + if conf.Packages[name] == nil { + t.Errorf("package %s not imported", name) + } + } + + // check that qualified identifiers are resolved + for _, f := range files { + ast.Inspect(f, func(n ast.Node) bool { + if s, ok := n.(*ast.SelectorExpr); ok { + if x, ok := s.X.(*ast.Ident); ok { + obj := uses[x] + if obj == nil { + t.Errorf("%s: unresolved qualified identifier %s", fset.Position(x.Pos()), x.Name) + return false + } + if _, ok := obj.(*PkgName); ok && uses[s.Sel] == nil { + t.Errorf("%s: unresolved selector %s", fset.Position(s.Sel.Pos()), s.Sel.Name) + return false + } + return false + } + return false + } + return true + }) + } + + for id, obj := range uses { + if obj == nil { + t.Errorf("%s: Uses[%s] == nil", fset.Position(id.Pos()), id.Name) + } + } + + // check that each identifier in the source is found in uses or defs or both + var both []string + for _, f := range files { + ast.Inspect(f, func(n ast.Node) bool { + if x, ok := n.(*ast.Ident); ok { + var objects int + if _, found := uses[x]; found { + objects |= 1 + delete(uses, x) + } + if _, found := defs[x]; found { + objects |= 2 + delete(defs, x) + } + if objects == 0 { + t.Errorf("%s: unresolved identifier %s", fset.Position(x.Pos()), x.Name) + } else if objects == 3 { + both = append(both, x.Name) + } + return false + } + return true + }) + } + + // check the expected set of idents that are simultaneously uses and defs + sort.Strings(both) + if got, want := fmt.Sprint(both), "[Mutex Stringer error]"; got != want { + t.Errorf("simultaneous uses/defs = %s, want %s", got, want) + } + + // any left-over identifiers didn't exist in the source + for x := range uses { + t.Errorf("%s: identifier %s not present in source", fset.Position(x.Pos()), x.Name) + } + for x := range defs { + t.Errorf("%s: identifier %s not present in source", fset.Position(x.Pos()), x.Name) + } + + // TODO(gri) add tests to check ImplicitObj callbacks +} diff --git a/vendor/golang.org/x/tools/go/types/return.go b/vendor/golang.org/x/tools/go/types/return.go new file mode 100644 index 0000000000..6628985214 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/return.go @@ -0,0 +1,185 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements isTerminating. + +package types + +import ( + "go/ast" + "go/token" +) + +// isTerminating reports if s is a terminating statement. +// If s is labeled, label is the label name; otherwise s +// is "". +func (check *Checker) isTerminating(s ast.Stmt, label string) bool { + switch s := s.(type) { + default: + unreachable() + + case *ast.BadStmt, *ast.DeclStmt, *ast.EmptyStmt, *ast.SendStmt, + *ast.IncDecStmt, *ast.AssignStmt, *ast.GoStmt, *ast.DeferStmt, + *ast.RangeStmt: + // no chance + + case *ast.LabeledStmt: + return check.isTerminating(s.Stmt, s.Label.Name) + + case *ast.ExprStmt: + // the predeclared (possibly parenthesized) panic() function is terminating + if call, _ := unparen(s.X).(*ast.CallExpr); call != nil { + if id, _ := call.Fun.(*ast.Ident); id != nil { + if _, obj := check.scope.LookupParent(id.Name, token.NoPos); obj != nil { + if b, _ := obj.(*Builtin); b != nil && b.id == _Panic { + return true + } + } + } + } + + case *ast.ReturnStmt: + return true + + case *ast.BranchStmt: + if s.Tok == token.GOTO || s.Tok == token.FALLTHROUGH { + return true + } + + case *ast.BlockStmt: + return check.isTerminatingList(s.List, "") + + case *ast.IfStmt: + if s.Else != nil && + check.isTerminating(s.Body, "") && + check.isTerminating(s.Else, "") { + return true + } + + case *ast.SwitchStmt: + return check.isTerminatingSwitch(s.Body, label) + + case *ast.TypeSwitchStmt: + return check.isTerminatingSwitch(s.Body, label) + + case *ast.SelectStmt: + for _, s := range s.Body.List { + cc := s.(*ast.CommClause) + if !check.isTerminatingList(cc.Body, "") || hasBreakList(cc.Body, label, true) { + return false + } + + } + return true + + case *ast.ForStmt: + if s.Cond == nil && !hasBreak(s.Body, label, true) { + return true + } + } + + return false +} + +func (check *Checker) isTerminatingList(list []ast.Stmt, label string) bool { + n := len(list) + return n > 0 && check.isTerminating(list[n-1], label) +} + +func (check *Checker) isTerminatingSwitch(body *ast.BlockStmt, label string) bool { + hasDefault := false + for _, s := range body.List { + cc := s.(*ast.CaseClause) + if cc.List == nil { + hasDefault = true + } + if !check.isTerminatingList(cc.Body, "") || hasBreakList(cc.Body, label, true) { + return false + } + } + return hasDefault +} + +// TODO(gri) For nested breakable statements, the current implementation of hasBreak +// will traverse the same subtree repeatedly, once for each label. Replace +// with a single-pass label/break matching phase. + +// hasBreak reports if s is or contains a break statement +// referring to the label-ed statement or implicit-ly the +// closest outer breakable statement. +func hasBreak(s ast.Stmt, label string, implicit bool) bool { + switch s := s.(type) { + default: + unreachable() + + case *ast.BadStmt, *ast.DeclStmt, *ast.EmptyStmt, *ast.ExprStmt, + *ast.SendStmt, *ast.IncDecStmt, *ast.AssignStmt, *ast.GoStmt, + *ast.DeferStmt, *ast.ReturnStmt: + // no chance + + case *ast.LabeledStmt: + return hasBreak(s.Stmt, label, implicit) + + case *ast.BranchStmt: + if s.Tok == token.BREAK { + if s.Label == nil { + return implicit + } + if s.Label.Name == label { + return true + } + } + + case *ast.BlockStmt: + return hasBreakList(s.List, label, implicit) + + case *ast.IfStmt: + if hasBreak(s.Body, label, implicit) || + s.Else != nil && hasBreak(s.Else, label, implicit) { + return true + } + + case *ast.CaseClause: + return hasBreakList(s.Body, label, implicit) + + case *ast.SwitchStmt: + if label != "" && hasBreak(s.Body, label, false) { + return true + } + + case *ast.TypeSwitchStmt: + if label != "" && hasBreak(s.Body, label, false) { + return true + } + + case *ast.CommClause: + return hasBreakList(s.Body, label, implicit) + + case *ast.SelectStmt: + if label != "" && hasBreak(s.Body, label, false) { + return true + } + + case *ast.ForStmt: + if label != "" && hasBreak(s.Body, label, false) { + return true + } + + case *ast.RangeStmt: + if label != "" && hasBreak(s.Body, label, false) { + return true + } + } + + return false +} + +func hasBreakList(list []ast.Stmt, label string, implicit bool) bool { + for _, s := range list { + if hasBreak(s, label, implicit) { + return true + } + } + return false +} diff --git a/vendor/golang.org/x/tools/go/types/scope.go b/vendor/golang.org/x/tools/go/types/scope.go new file mode 100644 index 0000000000..3502840225 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/scope.go @@ -0,0 +1,190 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements Scopes. + +package types + +import ( + "bytes" + "fmt" + "go/token" + "io" + "sort" + "strings" +) + +// TODO(gri) Provide scopes with a name or other mechanism so that +// objects can use that information for better printing. + +// A Scope maintains a set of objects and links to its containing +// (parent) and contained (children) scopes. Objects may be inserted +// and looked up by name. The zero value for Scope is a ready-to-use +// empty scope. +type Scope struct { + parent *Scope + children []*Scope + elems map[string]Object // lazily allocated + pos, end token.Pos // scope extent; may be invalid + comment string // for debugging only +} + +// NewScope returns a new, empty scope contained in the given parent +// scope, if any. The comment is for debugging only. +func NewScope(parent *Scope, pos, end token.Pos, comment string) *Scope { + s := &Scope{parent, nil, nil, pos, end, comment} + // don't add children to Universe scope! + if parent != nil && parent != Universe { + parent.children = append(parent.children, s) + } + return s +} + +// Parent returns the scope's containing (parent) scope. +func (s *Scope) Parent() *Scope { return s.parent } + +// Len() returns the number of scope elements. +func (s *Scope) Len() int { return len(s.elems) } + +// Names returns the scope's element names in sorted order. +func (s *Scope) Names() []string { + names := make([]string, len(s.elems)) + i := 0 + for name := range s.elems { + names[i] = name + i++ + } + sort.Strings(names) + return names +} + +// NumChildren() returns the number of scopes nested in s. +func (s *Scope) NumChildren() int { return len(s.children) } + +// Child returns the i'th child scope for 0 <= i < NumChildren(). +func (s *Scope) Child(i int) *Scope { return s.children[i] } + +// Lookup returns the object in scope s with the given name if such an +// object exists; otherwise the result is nil. +func (s *Scope) Lookup(name string) Object { + return s.elems[name] +} + +// LookupParent follows the parent chain of scopes starting with s until +// it finds a scope where Lookup(name) returns a non-nil object, and then +// returns that scope and object. If a valid position pos is provided, +// only objects that were declared at or before pos are considered. +// If no such scope and object exists, the result is (nil, nil). +// +// Note that obj.Parent() may be different from the returned scope if the +// object was inserted into the scope and already had a parent at that +// time (see Insert, below). This can only happen for dot-imported objects +// whose scope is the scope of the package that exported them. +func (s *Scope) LookupParent(name string, pos token.Pos) (*Scope, Object) { + for ; s != nil; s = s.parent { + if obj := s.elems[name]; obj != nil && (!pos.IsValid() || obj.scopePos() <= pos) { + return s, obj + } + } + return nil, nil +} + +// Insert attempts to insert an object obj into scope s. +// If s already contains an alternative object alt with +// the same name, Insert leaves s unchanged and returns alt. +// Otherwise it inserts obj, sets the object's parent scope +// if not already set, and returns nil. +func (s *Scope) Insert(obj Object) Object { + name := obj.Name() + if alt := s.elems[name]; alt != nil { + return alt + } + if s.elems == nil { + s.elems = make(map[string]Object) + } + s.elems[name] = obj + if obj.Parent() == nil { + obj.setParent(s) + } + return nil +} + +// Pos and End describe the scope's source code extent [pos, end). +// The results are guaranteed to be valid only if the type-checked +// AST has complete position information. The extent is undefined +// for Universe and package scopes. +func (s *Scope) Pos() token.Pos { return s.pos } +func (s *Scope) End() token.Pos { return s.end } + +// Contains returns true if pos is within the scope's extent. +// The result is guaranteed to be valid only if the type-checked +// AST has complete position information. +func (s *Scope) Contains(pos token.Pos) bool { + return s.pos <= pos && pos < s.end +} + +// Innermost returns the innermost (child) scope containing +// pos. If pos is not within any scope, the result is nil. +// The result is also nil for the Universe scope. +// The result is guaranteed to be valid only if the type-checked +// AST has complete position information. +func (s *Scope) Innermost(pos token.Pos) *Scope { + // Package scopes do not have extents since they may be + // discontiguous, so iterate over the package's files. + if s.parent == Universe { + for _, s := range s.children { + if inner := s.Innermost(pos); inner != nil { + return inner + } + } + } + + if s.Contains(pos) { + for _, s := range s.children { + if s.Contains(pos) { + return s.Innermost(pos) + } + } + return s + } + return nil +} + +// WriteTo writes a string representation of the scope to w, +// with the scope elements sorted by name. +// The level of indentation is controlled by n >= 0, with +// n == 0 for no indentation. +// If recurse is set, it also writes nested (children) scopes. +func (s *Scope) WriteTo(w io.Writer, n int, recurse bool) { + const ind = ". " + indn := strings.Repeat(ind, n) + + fmt.Fprintf(w, "%s%s scope %p {", indn, s.comment, s) + if len(s.elems) == 0 { + fmt.Fprintf(w, "}\n") + return + } + + fmt.Fprintln(w) + indn1 := indn + ind + for _, name := range s.Names() { + fmt.Fprintf(w, "%s%s\n", indn1, s.elems[name]) + } + + if recurse { + for _, s := range s.children { + fmt.Fprintln(w) + s.WriteTo(w, n+1, recurse) + } + } + + fmt.Fprintf(w, "%s}", indn) +} + +// String returns a string representation of the scope, for debugging. +func (s *Scope) String() string { + var buf bytes.Buffer + s.WriteTo(&buf, 0, false) + return buf.String() +} diff --git a/vendor/golang.org/x/tools/go/types/selection.go b/vendor/golang.org/x/tools/go/types/selection.go new file mode 100644 index 0000000000..124e0d39f0 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/selection.go @@ -0,0 +1,143 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements Selections. + +package types + +import ( + "bytes" + "fmt" +) + +// SelectionKind describes the kind of a selector expression x.f +// (excluding qualified identifiers). +type SelectionKind int + +const ( + FieldVal SelectionKind = iota // x.f is a struct field selector + MethodVal // x.f is a method selector + MethodExpr // x.f is a method expression +) + +// A Selection describes a selector expression x.f. +// For the declarations: +// +// type T struct{ x int; E } +// type E struct{} +// func (e E) m() {} +// var p *T +// +// the following relations exist: +// +// Selector Kind Recv Obj Type Index Indirect +// +// p.x FieldVal T x int {0} true +// p.m MethodVal *T m func (e *T) m() {1, 0} true +// T.m MethodExpr T m func m(_ T) {1, 0} false +// +type Selection struct { + kind SelectionKind + recv Type // type of x + obj Object // object denoted by x.f + index []int // path from x to x.f + indirect bool // set if there was any pointer indirection on the path +} + +// Kind returns the selection kind. +func (s *Selection) Kind() SelectionKind { return s.kind } + +// Recv returns the type of x in x.f. +func (s *Selection) Recv() Type { return s.recv } + +// Obj returns the object denoted by x.f; a *Var for +// a field selection, and a *Func in all other cases. +func (s *Selection) Obj() Object { return s.obj } + +// Type returns the type of x.f, which may be different from the type of f. +// See Selection for more information. +func (s *Selection) Type() Type { + switch s.kind { + case MethodVal: + // The type of x.f is a method with its receiver type set + // to the type of x. + sig := *s.obj.(*Func).typ.(*Signature) + recv := *sig.recv + recv.typ = s.recv + sig.recv = &recv + return &sig + + case MethodExpr: + // The type of x.f is a function (without receiver) + // and an additional first argument with the same type as x. + // TODO(gri) Similar code is already in call.go - factor! + // TODO(gri) Compute this eagerly to avoid allocations. + sig := *s.obj.(*Func).typ.(*Signature) + arg0 := *sig.recv + sig.recv = nil + arg0.typ = s.recv + var params []*Var + if sig.params != nil { + params = sig.params.vars + } + sig.params = NewTuple(append([]*Var{&arg0}, params...)...) + return &sig + } + + // In all other cases, the type of x.f is the type of x. + return s.obj.Type() +} + +// Index describes the path from x to f in x.f. +// The last index entry is the field or method index of the type declaring f; +// either: +// +// 1) the list of declared methods of a named type; or +// 2) the list of methods of an interface type; or +// 3) the list of fields of a struct type. +// +// The earlier index entries are the indices of the embedded fields implicitly +// traversed to get from (the type of) x to f, starting at embedding depth 0. +func (s *Selection) Index() []int { return s.index } + +// Indirect reports whether any pointer indirection was required to get from +// x to f in x.f. +func (s *Selection) Indirect() bool { return s.indirect } + +func (s *Selection) String() string { return SelectionString(s, nil) } + +// SelectionString returns the string form of s. +// The Qualifier controls the printing of +// package-level objects, and may be nil. +// +// Examples: +// "field (T) f int" +// "method (T) f(X) Y" +// "method expr (T) f(X) Y" +// +func SelectionString(s *Selection, qf Qualifier) string { + var k string + switch s.kind { + case FieldVal: + k = "field " + case MethodVal: + k = "method " + case MethodExpr: + k = "method expr " + default: + unreachable() + } + var buf bytes.Buffer + buf.WriteString(k) + buf.WriteByte('(') + WriteType(&buf, s.Recv(), qf) + fmt.Fprintf(&buf, ") %s", s.obj.Name()) + if T := s.Type(); s.kind == FieldVal { + buf.WriteByte(' ') + WriteType(&buf, T, qf) + } else { + WriteSignature(&buf, T.(*Signature), qf) + } + return buf.String() +} diff --git a/vendor/golang.org/x/tools/go/types/self_test.go b/vendor/golang.org/x/tools/go/types/self_test.go new file mode 100644 index 0000000000..01d12c71a0 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/self_test.go @@ -0,0 +1,101 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package types_test + +import ( + "flag" + "fmt" + "go/ast" + "go/parser" + "go/token" + "path/filepath" + "testing" + "time" + + _ "golang.org/x/tools/go/gcimporter" + . "golang.org/x/tools/go/types" +) + +var benchmark = flag.Bool("b", false, "run benchmarks") + +func TestSelf(t *testing.T) { + fset := token.NewFileSet() + files, err := pkgFiles(fset, ".") + if err != nil { + t.Fatal(err) + } + + _, err = Check("go/types", fset, files) + if err != nil { + // Importing go.tools/go/exact doensn't work in the + // build dashboard environment. Don't report an error + // for now so that the build remains green. + // TODO(gri) fix this + t.Log(err) // replace w/ t.Fatal eventually + return + } +} + +func TestBenchmark(t *testing.T) { + if !*benchmark { + return + } + + // We're not using testing's benchmarking mechanism directly + // because we want custom output. + + for _, p := range []string{"types", "exact", "gcimporter"} { + path := filepath.Join("..", p) + runbench(t, path, false) + runbench(t, path, true) + fmt.Println() + } +} + +func runbench(t *testing.T, path string, ignoreFuncBodies bool) { + fset := token.NewFileSet() + files, err := pkgFiles(fset, path) + if err != nil { + t.Fatal(err) + } + + b := testing.Benchmark(func(b *testing.B) { + for i := 0; i < b.N; i++ { + conf := Config{IgnoreFuncBodies: ignoreFuncBodies} + conf.Check(path, fset, files, nil) + } + }) + + // determine line count + lines := 0 + fset.Iterate(func(f *token.File) bool { + lines += f.LineCount() + return true + }) + + d := time.Duration(b.NsPerOp()) + fmt.Printf( + "%s: %s for %d lines (%d lines/s), ignoreFuncBodies = %v\n", + filepath.Base(path), d, lines, int64(float64(lines)/d.Seconds()), ignoreFuncBodies, + ) +} + +func pkgFiles(fset *token.FileSet, path string) ([]*ast.File, error) { + filenames, err := pkgFilenames(path) // from stdlib_test.go + if err != nil { + return nil, err + } + + var files []*ast.File + for _, filename := range filenames { + file, err := parser.ParseFile(fset, filename, nil, 0) + if err != nil { + return nil, err + } + files = append(files, file) + } + + return files, nil +} diff --git a/vendor/golang.org/x/tools/go/types/sizes.go b/vendor/golang.org/x/tools/go/types/sizes.go new file mode 100644 index 0000000000..56fb310c29 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/sizes.go @@ -0,0 +1,211 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements Sizes. + +package types + +// Sizes defines the sizing functions for package unsafe. +type Sizes interface { + // Alignof returns the alignment of a variable of type T. + // Alignof must implement the alignment guarantees required by the spec. + Alignof(T Type) int64 + + // Offsetsof returns the offsets of the given struct fields, in bytes. + // Offsetsof must implement the offset guarantees required by the spec. + Offsetsof(fields []*Var) []int64 + + // Sizeof returns the size of a variable of type T. + // Sizeof must implement the size guarantees required by the spec. + Sizeof(T Type) int64 +} + +// StdSizes is a convenience type for creating commonly used Sizes. +// It makes the following simplifying assumptions: +// +// - The size of explicitly sized basic types (int16, etc.) is the +// specified size. +// - The size of strings and interfaces is 2*WordSize. +// - The size of slices is 3*WordSize. +// - The size of an array of n elements corresponds to the size of +// a struct of n consecutive fields of the array's element type. +// - The size of a struct is the offset of the last field plus that +// field's size. As with all element types, if the struct is used +// in an array its size must first be aligned to a multiple of the +// struct's alignment. +// - All other types have size WordSize. +// - Arrays and structs are aligned per spec definition; all other +// types are naturally aligned with a maximum alignment MaxAlign. +// +// *StdSizes implements Sizes. +// +type StdSizes struct { + WordSize int64 // word size in bytes - must be >= 4 (32bits) + MaxAlign int64 // maximum alignment in bytes - must be >= 1 +} + +func (s *StdSizes) Alignof(T Type) int64 { + // For arrays and structs, alignment is defined in terms + // of alignment of the elements and fields, respectively. + switch t := T.Underlying().(type) { + case *Array: + // spec: "For a variable x of array type: unsafe.Alignof(x) + // is the same as unsafe.Alignof(x[0]), but at least 1." + return s.Alignof(t.elem) + case *Struct: + // spec: "For a variable x of struct type: unsafe.Alignof(x) + // is the largest of the values unsafe.Alignof(x.f) for each + // field f of x, but at least 1." + max := int64(1) + for _, f := range t.fields { + if a := s.Alignof(f.typ); a > max { + max = a + } + } + return max + } + a := s.Sizeof(T) // may be 0 + // spec: "For a variable x of any type: unsafe.Alignof(x) is at least 1." + if a < 1 { + return 1 + } + if a > s.MaxAlign { + return s.MaxAlign + } + return a +} + +func (s *StdSizes) Offsetsof(fields []*Var) []int64 { + offsets := make([]int64, len(fields)) + var o int64 + for i, f := range fields { + a := s.Alignof(f.typ) + o = align(o, a) + offsets[i] = o + o += s.Sizeof(f.typ) + } + return offsets +} + +var basicSizes = [...]byte{ + Bool: 1, + Int8: 1, + Int16: 2, + Int32: 4, + Int64: 8, + Uint8: 1, + Uint16: 2, + Uint32: 4, + Uint64: 8, + Float32: 4, + Float64: 8, + Complex64: 8, + Complex128: 16, +} + +func (s *StdSizes) Sizeof(T Type) int64 { + switch t := T.Underlying().(type) { + case *Basic: + assert(isTyped(T)) + k := t.kind + if int(k) < len(basicSizes) { + if s := basicSizes[k]; s > 0 { + return int64(s) + } + } + if k == String { + return s.WordSize * 2 + } + case *Array: + n := t.len + if n == 0 { + return 0 + } + a := s.Alignof(t.elem) + z := s.Sizeof(t.elem) + return align(z, a)*(n-1) + z + case *Slice: + return s.WordSize * 3 + case *Struct: + n := t.NumFields() + if n == 0 { + return 0 + } + offsets := t.offsets + if t.offsets == nil { + // compute offsets on demand + offsets = s.Offsetsof(t.fields) + t.offsets = offsets + } + return offsets[n-1] + s.Sizeof(t.fields[n-1].typ) + case *Interface: + return s.WordSize * 2 + } + return s.WordSize // catch-all +} + +// stdSizes is used if Config.Sizes == nil. +var stdSizes = StdSizes{8, 8} + +func (conf *Config) alignof(T Type) int64 { + if s := conf.Sizes; s != nil { + if a := s.Alignof(T); a >= 1 { + return a + } + panic("Config.Sizes.Alignof returned an alignment < 1") + } + return stdSizes.Alignof(T) +} + +func (conf *Config) offsetsof(T *Struct) []int64 { + offsets := T.offsets + if offsets == nil && T.NumFields() > 0 { + // compute offsets on demand + if s := conf.Sizes; s != nil { + offsets = s.Offsetsof(T.fields) + // sanity checks + if len(offsets) != T.NumFields() { + panic("Config.Sizes.Offsetsof returned the wrong number of offsets") + } + for _, o := range offsets { + if o < 0 { + panic("Config.Sizes.Offsetsof returned an offset < 0") + } + } + } else { + offsets = stdSizes.Offsetsof(T.fields) + } + T.offsets = offsets + } + return offsets +} + +// offsetof returns the offset of the field specified via +// the index sequence relative to typ. All embedded fields +// must be structs (rather than pointer to structs). +func (conf *Config) offsetof(typ Type, index []int) int64 { + var o int64 + for _, i := range index { + s := typ.Underlying().(*Struct) + o += conf.offsetsof(s)[i] + typ = s.fields[i].typ + } + return o +} + +func (conf *Config) sizeof(T Type) int64 { + if s := conf.Sizes; s != nil { + if z := s.Sizeof(T); z >= 0 { + return z + } + panic("Config.Sizes.Sizeof returned a size < 0") + } + return stdSizes.Sizeof(T) +} + +// align returns the smallest y >= x such that y % a == 0. +func align(x, a int64) int64 { + y := x + a - 1 + return y - y%a +} diff --git a/vendor/golang.org/x/tools/go/types/stdlib_test.go b/vendor/golang.org/x/tools/go/types/stdlib_test.go new file mode 100644 index 0000000000..7554f91578 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/stdlib_test.go @@ -0,0 +1,279 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file tests types.Check by using it to +// typecheck the standard library and tests. + +package types_test + +import ( + "fmt" + "go/ast" + "go/build" + "go/parser" + "go/scanner" + "go/token" + "io/ioutil" + "os" + "path/filepath" + "runtime" + "strings" + "testing" + "time" + + _ "golang.org/x/tools/go/gcimporter" + . "golang.org/x/tools/go/types" +) + +var ( + pkgCount int // number of packages processed + start = time.Now() +) + +func TestStdlib(t *testing.T) { + skipSpecialPlatforms(t) + + walkDirs(t, filepath.Join(runtime.GOROOT(), "src")) + if testing.Verbose() { + fmt.Println(pkgCount, "packages typechecked in", time.Since(start)) + } +} + +// firstComment returns the contents of the first comment in +// the given file, assuming there's one within the first KB. +func firstComment(filename string) string { + f, err := os.Open(filename) + if err != nil { + return "" + } + defer f.Close() + + var src [1 << 10]byte // read at most 1KB + n, _ := f.Read(src[:]) + + var s scanner.Scanner + s.Init(fset.AddFile("", fset.Base(), n), src[:n], nil, scanner.ScanComments) + for { + _, tok, lit := s.Scan() + switch tok { + case token.COMMENT: + // remove trailing */ of multi-line comment + if lit[1] == '*' { + lit = lit[:len(lit)-2] + } + return strings.TrimSpace(lit[2:]) + case token.EOF: + return "" + } + } +} + +func testTestDir(t *testing.T, path string, ignore ...string) { + files, err := ioutil.ReadDir(path) + if err != nil { + t.Fatal(err) + } + + excluded := make(map[string]bool) + for _, filename := range ignore { + excluded[filename] = true + } + + fset := token.NewFileSet() + for _, f := range files { + // filter directory contents + if f.IsDir() || !strings.HasSuffix(f.Name(), ".go") || excluded[f.Name()] { + continue + } + + // get per-file instructions + expectErrors := false + filename := filepath.Join(path, f.Name()) + if cmd := firstComment(filename); cmd != "" { + switch cmd { + case "skip", "compiledir": + continue // ignore this file + case "errorcheck": + expectErrors = true + } + } + + // parse and type-check file + file, err := parser.ParseFile(fset, filename, nil, 0) + if err == nil { + _, err = Check(filename, fset, []*ast.File{file}) + } + + if expectErrors { + if err == nil { + t.Errorf("expected errors but found none in %s", filename) + } + } else { + if err != nil { + t.Error(err) + } + } + } +} + +func TestStdTest(t *testing.T) { + skipSpecialPlatforms(t) + + // test/recover4.go is only built for Linux and Darwin. + // TODO(gri) Remove once tests consider +build tags (issue 10370). + if runtime.GOOS != "linux" && runtime.GOOS != "darwin" { + return + } + + testTestDir(t, filepath.Join(runtime.GOROOT(), "test"), + "cmplxdivide.go", // also needs file cmplxdivide1.go - ignore + "sigchld.go", // don't work on Windows; testTestDir should consult build tags + ) +} + +func TestStdFixed(t *testing.T) { + skipSpecialPlatforms(t) + + testTestDir(t, filepath.Join(runtime.GOROOT(), "test", "fixedbugs"), + "bug248.go", "bug302.go", "bug369.go", // complex test instructions - ignore + "bug459.go", // possibly incorrect test - see issue 6703 (pending spec clarification) + "issue3924.go", // possibly incorrect test - see issue 6671 (pending spec clarification) + "issue6889.go", // gc-specific test + "issue7746.go", // large constants - consumes too much memory + "issue11326.go", // large constants + "issue11326b.go", // large constants + "issue11362.go", // canonical import path check is implementation-defined behavior + "issue13471.go", // large constants + ) +} + +func TestStdKen(t *testing.T) { + skipSpecialPlatforms(t) + + testTestDir(t, filepath.Join(runtime.GOROOT(), "test", "ken")) +} + +// Package paths of excluded packages. +var excluded = map[string]bool{ + "builtin": true, +} + +// typecheck typechecks the given package files. +func typecheck(t *testing.T, path string, filenames []string) { + fset := token.NewFileSet() + + // parse package files + var files []*ast.File + for _, filename := range filenames { + file, err := parser.ParseFile(fset, filename, nil, parser.AllErrors) + if err != nil { + // the parser error may be a list of individual errors; report them all + if list, ok := err.(scanner.ErrorList); ok { + for _, err := range list { + t.Error(err) + } + return + } + t.Error(err) + return + } + + if testing.Verbose() { + if len(files) == 0 { + fmt.Println("package", file.Name.Name) + } + fmt.Println("\t", filename) + } + + files = append(files, file) + } + + // gcimporter doesn't support vendored imports. + // TODO(gri): fix. + if strings.HasSuffix(path, "src/cmd/internal/objfile") || + strings.HasSuffix(path, "src/net/http") { + return + } + + // typecheck package files + var conf Config + conf.Error = func(err error) { t.Error(err) } + info := Info{Uses: make(map[*ast.Ident]Object)} + conf.Check(path, fset, files, &info) + pkgCount++ + + // Perform checks of API invariants. + + // All Objects have a package, except predeclared ones. + errorError := Universe.Lookup("error").Type().Underlying().(*Interface).ExplicitMethod(0) // (error).Error + for id, obj := range info.Uses { + predeclared := obj == Universe.Lookup(obj.Name()) || obj == errorError + if predeclared == (obj.Pkg() != nil) { + posn := fset.Position(id.Pos()) + if predeclared { + t.Errorf("%s: predeclared object with package: %s", posn, obj) + } else { + t.Errorf("%s: user-defined object without package: %s", posn, obj) + } + } + } +} + +// pkgFilenames returns the list of package filenames for the given directory. +func pkgFilenames(dir string) ([]string, error) { + ctxt := build.Default + ctxt.CgoEnabled = false + pkg, err := ctxt.ImportDir(dir, 0) + if err != nil { + if _, nogo := err.(*build.NoGoError); nogo { + return nil, nil // no *.go files, not an error + } + return nil, err + } + if excluded[pkg.ImportPath] { + return nil, nil + } + var filenames []string + for _, name := range pkg.GoFiles { + filenames = append(filenames, filepath.Join(pkg.Dir, name)) + } + for _, name := range pkg.TestGoFiles { + filenames = append(filenames, filepath.Join(pkg.Dir, name)) + } + return filenames, nil +} + +// Note: Could use filepath.Walk instead of walkDirs but that wouldn't +// necessarily be shorter or clearer after adding the code to +// terminate early for -short tests. + +func walkDirs(t *testing.T, dir string) { + // limit run time for short tests + if testing.Short() && time.Since(start) >= 750*time.Millisecond { + return + } + + fis, err := ioutil.ReadDir(dir) + if err != nil { + t.Error(err) + return + } + + // typecheck package in directory + files, err := pkgFilenames(dir) + if err != nil { + t.Error(err) + return + } + if files != nil { + typecheck(t, dir, files) + } + + // traverse subdirectories, but don't walk into testdata + for _, fi := range fis { + if fi.IsDir() && fi.Name() != "testdata" { + walkDirs(t, filepath.Join(dir, fi.Name())) + } + } +} diff --git a/vendor/golang.org/x/tools/go/types/stmt.go b/vendor/golang.org/x/tools/go/types/stmt.go new file mode 100644 index 0000000000..eeb2c31730 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/stmt.go @@ -0,0 +1,745 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements typechecking of statements. + +package types + +import ( + "fmt" + "go/ast" + "go/token" + + "golang.org/x/tools/go/exact" +) + +func (check *Checker) funcBody(decl *declInfo, name string, sig *Signature, body *ast.BlockStmt) { + if trace { + if name == "" { + name = "" + } + fmt.Printf("--- %s: %s {\n", name, sig) + defer fmt.Println("--- ") + } + + // set function scope extent + sig.scope.pos = body.Pos() + sig.scope.end = body.End() + + // save/restore current context and setup function context + // (and use 0 indentation at function start) + defer func(ctxt context, indent int) { + check.context = ctxt + check.indent = indent + }(check.context, check.indent) + check.context = context{ + decl: decl, + scope: sig.scope, + sig: sig, + } + check.indent = 0 + + check.stmtList(0, body.List) + + if check.hasLabel { + check.labels(body) + } + + if sig.results.Len() > 0 && !check.isTerminating(body, "") { + check.error(body.Rbrace, "missing return") + } + + // spec: "Implementation restriction: A compiler may make it illegal to + // declare a variable inside a function body if the variable is never used." + // (One could check each scope after use, but that distributes this check + // over several places because CloseScope is not always called explicitly.) + check.usage(sig.scope) +} + +func (check *Checker) usage(scope *Scope) { + for _, obj := range scope.elems { + if v, _ := obj.(*Var); v != nil && !v.used { + check.softErrorf(v.pos, "%s declared but not used", v.name) + } + } + for _, scope := range scope.children { + check.usage(scope) + } +} + +// stmtContext is a bitset describing which +// control-flow statements are permissible. +type stmtContext uint + +const ( + breakOk stmtContext = 1 << iota + continueOk + fallthroughOk +) + +func (check *Checker) simpleStmt(s ast.Stmt) { + if s != nil { + check.stmt(0, s) + } +} + +func (check *Checker) stmtList(ctxt stmtContext, list []ast.Stmt) { + ok := ctxt&fallthroughOk != 0 + inner := ctxt &^ fallthroughOk + for i, s := range list { + inner := inner + if ok && i+1 == len(list) { + inner |= fallthroughOk + } + check.stmt(inner, s) + } +} + +func (check *Checker) multipleDefaults(list []ast.Stmt) { + var first ast.Stmt + for _, s := range list { + var d ast.Stmt + switch c := s.(type) { + case *ast.CaseClause: + if len(c.List) == 0 { + d = s + } + case *ast.CommClause: + if c.Comm == nil { + d = s + } + default: + check.invalidAST(s.Pos(), "case/communication clause expected") + } + if d != nil { + if first != nil { + check.errorf(d.Pos(), "multiple defaults (first at %s)", first.Pos()) + } else { + first = d + } + } + } +} + +func (check *Checker) openScope(s ast.Stmt, comment string) { + scope := NewScope(check.scope, s.Pos(), s.End(), comment) + check.recordScope(s, scope) + check.scope = scope +} + +func (check *Checker) closeScope() { + check.scope = check.scope.Parent() +} + +func assignOp(op token.Token) token.Token { + // token_test.go verifies the token ordering this function relies on + if token.ADD_ASSIGN <= op && op <= token.AND_NOT_ASSIGN { + return op + (token.ADD - token.ADD_ASSIGN) + } + return token.ILLEGAL +} + +func (check *Checker) suspendedCall(keyword string, call *ast.CallExpr) { + var x operand + var msg string + switch check.rawExpr(&x, call, nil) { + case conversion: + msg = "requires function call, not conversion" + case expression: + msg = "discards result of" + case statement: + return + default: + unreachable() + } + check.errorf(x.pos(), "%s %s %s", keyword, msg, &x) +} + +func (check *Checker) caseValues(x operand /* copy argument (not *operand!) */, values []ast.Expr) { + // No duplicate checking for now. See issue 4524. + for _, e := range values { + var y operand + check.expr(&y, e) + if y.mode == invalid { + return + } + // TODO(gri) The convertUntyped call pair below appears in other places. Factor! + // Order matters: By comparing y against x, error positions are at the case values. + check.convertUntyped(&y, x.typ) + if y.mode == invalid { + return + } + check.convertUntyped(&x, y.typ) + if x.mode == invalid { + return + } + check.comparison(&y, &x, token.EQL) + } +} + +func (check *Checker) caseTypes(x *operand, xtyp *Interface, types []ast.Expr, seen map[Type]token.Pos) (T Type) { +L: + for _, e := range types { + T = check.typOrNil(e) + if T == Typ[Invalid] { + continue + } + // complain about duplicate types + // TODO(gri) use a type hash to avoid quadratic algorithm + for t, pos := range seen { + if T == nil && t == nil || T != nil && t != nil && Identical(T, t) { + // talk about "case" rather than "type" because of nil case + check.error(e.Pos(), "duplicate case in type switch") + check.errorf(pos, "\tprevious case %s", T) // secondary error, \t indented + continue L + } + } + seen[T] = e.Pos() + if T != nil { + check.typeAssertion(e.Pos(), x, xtyp, T) + } + } + return +} + +// stmt typechecks statement s. +func (check *Checker) stmt(ctxt stmtContext, s ast.Stmt) { + // statements cannot use iota in general + // (constant declarations set it explicitly) + assert(check.iota == nil) + + // statements must end with the same top scope as they started with + if debug { + defer func(scope *Scope) { + // don't check if code is panicking + if p := recover(); p != nil { + panic(p) + } + assert(scope == check.scope) + }(check.scope) + } + + inner := ctxt &^ fallthroughOk + switch s := s.(type) { + case *ast.BadStmt, *ast.EmptyStmt: + // ignore + + case *ast.DeclStmt: + check.declStmt(s.Decl) + + case *ast.LabeledStmt: + check.hasLabel = true + check.stmt(ctxt, s.Stmt) + + case *ast.ExprStmt: + // spec: "With the exception of specific built-in functions, + // function and method calls and receive operations can appear + // in statement context. Such statements may be parenthesized." + var x operand + kind := check.rawExpr(&x, s.X, nil) + var msg string + switch x.mode { + default: + if kind == statement { + return + } + msg = "is not used" + case builtin: + msg = "must be called" + case typexpr: + msg = "is not an expression" + } + check.errorf(x.pos(), "%s %s", &x, msg) + + case *ast.SendStmt: + var ch, x operand + check.expr(&ch, s.Chan) + check.expr(&x, s.Value) + if ch.mode == invalid || x.mode == invalid { + return + } + if tch, ok := ch.typ.Underlying().(*Chan); !ok || tch.dir == RecvOnly || !check.assignment(&x, tch.elem) { + if x.mode != invalid { + check.invalidOp(ch.pos(), "cannot send %s to channel %s", &x, &ch) + } + } + + case *ast.IncDecStmt: + var op token.Token + switch s.Tok { + case token.INC: + op = token.ADD + case token.DEC: + op = token.SUB + default: + check.invalidAST(s.TokPos, "unknown inc/dec operation %s", s.Tok) + return + } + var x operand + Y := &ast.BasicLit{ValuePos: s.X.Pos(), Kind: token.INT, Value: "1"} // use x's position + check.binary(&x, nil, s.X, Y, op) + if x.mode == invalid { + return + } + check.assignVar(s.X, &x) + + case *ast.AssignStmt: + switch s.Tok { + case token.ASSIGN, token.DEFINE: + if len(s.Lhs) == 0 { + check.invalidAST(s.Pos(), "missing lhs in assignment") + return + } + if s.Tok == token.DEFINE { + check.shortVarDecl(s.TokPos, s.Lhs, s.Rhs) + } else { + // regular assignment + check.assignVars(s.Lhs, s.Rhs) + } + + default: + // assignment operations + if len(s.Lhs) != 1 || len(s.Rhs) != 1 { + check.errorf(s.TokPos, "assignment operation %s requires single-valued expressions", s.Tok) + return + } + op := assignOp(s.Tok) + if op == token.ILLEGAL { + check.invalidAST(s.TokPos, "unknown assignment operation %s", s.Tok) + return + } + var x operand + check.binary(&x, nil, s.Lhs[0], s.Rhs[0], op) + if x.mode == invalid { + return + } + check.assignVar(s.Lhs[0], &x) + } + + case *ast.GoStmt: + check.suspendedCall("go", s.Call) + + case *ast.DeferStmt: + check.suspendedCall("defer", s.Call) + + case *ast.ReturnStmt: + res := check.sig.results + if res.Len() > 0 { + // function returns results + // (if one, say the first, result parameter is named, all of them are named) + if len(s.Results) == 0 && res.vars[0].name != "" { + // spec: "Implementation restriction: A compiler may disallow an empty expression + // list in a "return" statement if a different entity (constant, type, or variable) + // with the same name as a result parameter is in scope at the place of the return." + for _, obj := range res.vars { + if _, alt := check.scope.LookupParent(obj.name, check.pos); alt != nil && alt != obj { + check.errorf(s.Pos(), "result parameter %s not in scope at return", obj.name) + check.errorf(alt.Pos(), "\tinner declaration of %s", obj) + // ok to continue + } + } + } else { + // return has results or result parameters are unnamed + check.initVars(res.vars, s.Results, s.Return) + } + } else if len(s.Results) > 0 { + check.error(s.Results[0].Pos(), "no result values expected") + check.use(s.Results...) + } + + case *ast.BranchStmt: + if s.Label != nil { + check.hasLabel = true + return // checked in 2nd pass (check.labels) + } + switch s.Tok { + case token.BREAK: + if ctxt&breakOk == 0 { + check.error(s.Pos(), "break not in for, switch, or select statement") + } + case token.CONTINUE: + if ctxt&continueOk == 0 { + check.error(s.Pos(), "continue not in for statement") + } + case token.FALLTHROUGH: + if ctxt&fallthroughOk == 0 { + check.error(s.Pos(), "fallthrough statement out of place") + } + default: + check.invalidAST(s.Pos(), "branch statement: %s", s.Tok) + } + + case *ast.BlockStmt: + check.openScope(s, "block") + defer check.closeScope() + + check.stmtList(inner, s.List) + + case *ast.IfStmt: + check.openScope(s, "if") + defer check.closeScope() + + check.simpleStmt(s.Init) + var x operand + check.expr(&x, s.Cond) + if x.mode != invalid && !isBoolean(x.typ) { + check.error(s.Cond.Pos(), "non-boolean condition in if statement") + } + check.stmt(inner, s.Body) + if s.Else != nil { + check.stmt(inner, s.Else) + } + + case *ast.SwitchStmt: + inner |= breakOk + check.openScope(s, "switch") + defer check.closeScope() + + check.simpleStmt(s.Init) + var x operand + if s.Tag != nil { + check.expr(&x, s.Tag) + } else { + // spec: "A missing switch expression is + // equivalent to the boolean value true." + x.mode = constant + x.typ = Typ[Bool] + x.val = exact.MakeBool(true) + x.expr = &ast.Ident{NamePos: s.Body.Lbrace, Name: "true"} + } + + check.multipleDefaults(s.Body.List) + + for i, c := range s.Body.List { + clause, _ := c.(*ast.CaseClause) + if clause == nil { + check.invalidAST(c.Pos(), "incorrect expression switch case") + continue + } + if x.mode != invalid { + check.caseValues(x, clause.List) + } + check.openScope(clause, "case") + inner := inner + if i+1 < len(s.Body.List) { + inner |= fallthroughOk + } + check.stmtList(inner, clause.Body) + check.closeScope() + } + + case *ast.TypeSwitchStmt: + inner |= breakOk + check.openScope(s, "type switch") + defer check.closeScope() + + check.simpleStmt(s.Init) + + // A type switch guard must be of the form: + // + // TypeSwitchGuard = [ identifier ":=" ] PrimaryExpr "." "(" "type" ")" . + // + // The parser is checking syntactic correctness; + // remaining syntactic errors are considered AST errors here. + // TODO(gri) better factoring of error handling (invalid ASTs) + // + var lhs *ast.Ident // lhs identifier or nil + var rhs ast.Expr + switch guard := s.Assign.(type) { + case *ast.ExprStmt: + rhs = guard.X + case *ast.AssignStmt: + if len(guard.Lhs) != 1 || guard.Tok != token.DEFINE || len(guard.Rhs) != 1 { + check.invalidAST(s.Pos(), "incorrect form of type switch guard") + return + } + + lhs, _ = guard.Lhs[0].(*ast.Ident) + if lhs == nil { + check.invalidAST(s.Pos(), "incorrect form of type switch guard") + return + } + + if lhs.Name == "_" { + // _ := x.(type) is an invalid short variable declaration + check.softErrorf(lhs.Pos(), "no new variable on left side of :=") + lhs = nil // avoid declared but not used error below + } else { + check.recordDef(lhs, nil) // lhs variable is implicitly declared in each cause clause + } + + rhs = guard.Rhs[0] + + default: + check.invalidAST(s.Pos(), "incorrect form of type switch guard") + return + } + + // rhs must be of the form: expr.(type) and expr must be an interface + expr, _ := rhs.(*ast.TypeAssertExpr) + if expr == nil || expr.Type != nil { + check.invalidAST(s.Pos(), "incorrect form of type switch guard") + return + } + var x operand + check.expr(&x, expr.X) + if x.mode == invalid { + return + } + xtyp, _ := x.typ.Underlying().(*Interface) + if xtyp == nil { + check.errorf(x.pos(), "%s is not an interface", &x) + return + } + + check.multipleDefaults(s.Body.List) + + var lhsVars []*Var // list of implicitly declared lhs variables + seen := make(map[Type]token.Pos) // map of seen types to positions + for _, s := range s.Body.List { + clause, _ := s.(*ast.CaseClause) + if clause == nil { + check.invalidAST(s.Pos(), "incorrect type switch case") + continue + } + // Check each type in this type switch case. + T := check.caseTypes(&x, xtyp, clause.List, seen) + check.openScope(clause, "case") + // If lhs exists, declare a corresponding variable in the case-local scope. + if lhs != nil { + // spec: "The TypeSwitchGuard may include a short variable declaration. + // When that form is used, the variable is declared at the beginning of + // the implicit block in each clause. In clauses with a case listing + // exactly one type, the variable has that type; otherwise, the variable + // has the type of the expression in the TypeSwitchGuard." + if len(clause.List) != 1 || T == nil { + T = x.typ + } + obj := NewVar(lhs.Pos(), check.pkg, lhs.Name, T) + scopePos := clause.End() + if len(clause.Body) > 0 { + scopePos = clause.Body[0].Pos() + } + check.declare(check.scope, nil, obj, scopePos) + check.recordImplicit(clause, obj) + // For the "declared but not used" error, all lhs variables act as + // one; i.e., if any one of them is 'used', all of them are 'used'. + // Collect them for later analysis. + lhsVars = append(lhsVars, obj) + } + check.stmtList(inner, clause.Body) + check.closeScope() + } + + // If lhs exists, we must have at least one lhs variable that was used. + if lhs != nil { + var used bool + for _, v := range lhsVars { + if v.used { + used = true + } + v.used = true // avoid usage error when checking entire function + } + if !used { + check.softErrorf(lhs.Pos(), "%s declared but not used", lhs.Name) + } + } + + case *ast.SelectStmt: + inner |= breakOk + + check.multipleDefaults(s.Body.List) + + for _, s := range s.Body.List { + clause, _ := s.(*ast.CommClause) + if clause == nil { + continue // error reported before + } + + // clause.Comm must be a SendStmt, RecvStmt, or default case + valid := false + var rhs ast.Expr // rhs of RecvStmt, or nil + switch s := clause.Comm.(type) { + case nil, *ast.SendStmt: + valid = true + case *ast.AssignStmt: + if len(s.Rhs) == 1 { + rhs = s.Rhs[0] + } + case *ast.ExprStmt: + rhs = s.X + } + + // if present, rhs must be a receive operation + if rhs != nil { + if x, _ := unparen(rhs).(*ast.UnaryExpr); x != nil && x.Op == token.ARROW { + valid = true + } + } + + if !valid { + check.error(clause.Comm.Pos(), "select case must be send or receive (possibly with assignment)") + continue + } + + check.openScope(s, "case") + if clause.Comm != nil { + check.stmt(inner, clause.Comm) + } + check.stmtList(inner, clause.Body) + check.closeScope() + } + + case *ast.ForStmt: + inner |= breakOk | continueOk + check.openScope(s, "for") + defer check.closeScope() + + check.simpleStmt(s.Init) + if s.Cond != nil { + var x operand + check.expr(&x, s.Cond) + if x.mode != invalid && !isBoolean(x.typ) { + check.error(s.Cond.Pos(), "non-boolean condition in for statement") + } + } + check.simpleStmt(s.Post) + // spec: "The init statement may be a short variable + // declaration, but the post statement must not." + if s, _ := s.Post.(*ast.AssignStmt); s != nil && s.Tok == token.DEFINE { + check.softErrorf(s.Pos(), "cannot declare in post statement") + check.use(s.Lhs...) // avoid follow-up errors + } + check.stmt(inner, s.Body) + + case *ast.RangeStmt: + inner |= breakOk | continueOk + check.openScope(s, "for") + defer check.closeScope() + + // check expression to iterate over + var x operand + check.expr(&x, s.X) + + // determine key/value types + var key, val Type + if x.mode != invalid { + switch typ := x.typ.Underlying().(type) { + case *Basic: + if isString(typ) { + key = Typ[Int] + val = universeRune // use 'rune' name + } + case *Array: + key = Typ[Int] + val = typ.elem + case *Slice: + key = Typ[Int] + val = typ.elem + case *Pointer: + if typ, _ := typ.base.Underlying().(*Array); typ != nil { + key = Typ[Int] + val = typ.elem + } + case *Map: + key = typ.key + val = typ.elem + case *Chan: + key = typ.elem + val = Typ[Invalid] + if typ.dir == SendOnly { + check.errorf(x.pos(), "cannot range over send-only channel %s", &x) + // ok to continue + } + if s.Value != nil { + check.errorf(s.Value.Pos(), "iteration over %s permits only one iteration variable", &x) + // ok to continue + } + } + } + + if key == nil { + check.errorf(x.pos(), "cannot range over %s", &x) + // ok to continue + } + + // check assignment to/declaration of iteration variables + // (irregular assignment, cannot easily map to existing assignment checks) + + // lhs expressions and initialization value (rhs) types + lhs := [2]ast.Expr{s.Key, s.Value} + rhs := [2]Type{key, val} // key, val may be nil + + if s.Tok == token.DEFINE { + // short variable declaration; variable scope starts after the range clause + // (the for loop opens a new scope, so variables on the lhs never redeclare + // previously declared variables) + var vars []*Var + for i, lhs := range lhs { + if lhs == nil { + continue + } + + // determine lhs variable + var obj *Var + if ident, _ := lhs.(*ast.Ident); ident != nil { + // declare new variable + name := ident.Name + obj = NewVar(ident.Pos(), check.pkg, name, nil) + check.recordDef(ident, obj) + // _ variables don't count as new variables + if name != "_" { + vars = append(vars, obj) + } + } else { + check.errorf(lhs.Pos(), "cannot declare %s", lhs) + obj = NewVar(lhs.Pos(), check.pkg, "_", nil) // dummy variable + } + + // initialize lhs variable + if typ := rhs[i]; typ != nil { + x.mode = value + x.expr = lhs // we don't have a better rhs expression to use here + x.typ = typ + check.initVar(obj, &x, false) + } else { + obj.typ = Typ[Invalid] + obj.used = true // don't complain about unused variable + } + } + + // declare variables + if len(vars) > 0 { + for _, obj := range vars { + // spec: "The scope of a constant or variable identifier declared inside + // a function begins at the end of the ConstSpec or VarSpec (ShortVarDecl + // for short variable declarations) and ends at the end of the innermost + // containing block." + scopePos := s.End() + check.declare(check.scope, nil /* recordDef already called */, obj, scopePos) + } + } else { + check.error(s.TokPos, "no new variables on left side of :=") + } + } else { + // ordinary assignment + for i, lhs := range lhs { + if lhs == nil { + continue + } + if typ := rhs[i]; typ != nil { + x.mode = value + x.expr = lhs // we don't have a better rhs expression to use here + x.typ = typ + check.assignVar(lhs, &x) + } + } + } + + check.stmt(inner, s.Body) + + default: + check.error(s.Pos(), "invalid statement") + } +} diff --git a/vendor/golang.org/x/tools/go/types/testdata/blank.src b/vendor/golang.org/x/tools/go/types/testdata/blank.src new file mode 100644 index 0000000000..6a2507f482 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/blank.src @@ -0,0 +1,5 @@ +// 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 _ /* ERROR invalid package name */ diff --git a/vendor/golang.org/x/tools/go/types/testdata/builtins.src b/vendor/golang.org/x/tools/go/types/testdata/builtins.src new file mode 100644 index 0000000000..9eb551dc10 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/builtins.src @@ -0,0 +1,881 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// builtin calls + +package builtins + +import "unsafe" + +func f0() {} + +func append1() { + var b byte + var x int + var s []byte + _ = append() // ERROR not enough arguments + _ = append("foo" /* ERROR not a slice */ ) + _ = append(nil /* ERROR not a slice */ , s) + _ = append(x /* ERROR not a slice */ , s) + _ = append(s) + append /* ERROR not used */ (s) + + _ = append(s, b) + _ = append(s, x /* ERROR cannot pass argument x */ ) + _ = append(s, s /* ERROR cannot pass argument s */ ) + _ = append(s... /* ERROR can only use ... with matching parameter */ ) + _ = append(s, b, s... /* ERROR can only use ... with matching parameter */ ) + _ = append(s, 1, 2, 3) + _ = append(s, 1, 2, 3, x /* ERROR cannot pass argument x */ , 5, 6, 6) + _ = append(s, 1, 2, s... /* ERROR can only use ... with matching parameter */ ) + _ = append([]interface{}(nil), 1, 2, "foo", x, 3.1425, false) + + type S []byte + type T string + var t T + _ = append(s, "foo" /* ERROR cannot convert */ ) + _ = append(s, "foo"...) + _ = append(S(s), "foo" /* ERROR cannot convert */ ) + _ = append(S(s), "foo"...) + _ = append(s, t /* ERROR cannot pass argument t */ ) + _ = append(s, t...) + _ = append(s, T("foo")...) + _ = append(S(s), t /* ERROR cannot pass argument t */ ) + _ = append(S(s), t...) + _ = append(S(s), T("foo")...) + _ = append([]string{}, t /* ERROR cannot pass argument t */ , "foo") + _ = append([]T{}, t, "foo") +} + +// from the spec +func append2() { + s0 := []int{0, 0} + s1 := append(s0, 2) // append a single element s1 == []int{0, 0, 2} + s2 := append(s1, 3, 5, 7) // append multiple elements s2 == []int{0, 0, 2, 3, 5, 7} + s3 := append(s2, s0...) // append a slice s3 == []int{0, 0, 2, 3, 5, 7, 0, 0} + s4 := append(s3[3:6], s3[2:]...) // append overlapping slice s4 == []int{3, 5, 7, 2, 3, 5, 7, 0, 0} + + var t []interface{} + t = append(t, 42, 3.1415, "foo") // t == []interface{}{42, 3.1415, "foo"} + + var b []byte + b = append(b, "bar"...) // append string contents b == []byte{'b', 'a', 'r' } + + _ = s4 +} + +func append3() { + f1 := func() (s []int) { return } + f2 := func() (s []int, x int) { return } + f3 := func() (s []int, x, y int) { return } + f5 := func() (s []interface{}, x int, y float32, z string, b bool) { return } + ff := func() (int, float32) { return 0, 0 } + _ = append(f0 /* ERROR used as value */ ()) + _ = append(f1()) + _ = append(f2()) + _ = append(f3()) + _ = append(f5()) + _ = append(ff /* ERROR not a slice */ ()) // TODO(gri) better error message +} + +func cap1() { + var a [10]bool + var p *[20]int + var c chan string + _ = cap() // ERROR not enough arguments + _ = cap(1, 2) // ERROR too many arguments + _ = cap(42 /* ERROR invalid */) + const _3 = cap(a) + assert(_3 == 10) + const _4 = cap(p) + assert(_4 == 20) + _ = cap(c) + cap /* ERROR not used */ (c) + + // issue 4744 + type T struct{ a [10]int } + const _ = cap(((*T)(nil)).a) + + var s [][]byte + _ = cap(s) + _ = cap(s... /* ERROR invalid use of \.\.\. */ ) +} + +func cap2() { + f1a := func() (a [10]int) { return } + f1s := func() (s []int) { return } + f2 := func() (s []int, x int) { return } + _ = cap(f0 /* ERROR used as value */ ()) + _ = cap(f1a()) + _ = cap(f1s()) + _ = cap(f2()) // ERROR too many arguments +} + +// test cases for issue 7387 +func cap3() { + var f = func() int { return 0 } + var x = f() + const ( + _ = cap([4]int{}) + _ = cap([4]int{x}) + _ = cap /* ERROR not constant */ ([4]int{f()}) + _ = cap /* ERROR not constant */ ([4]int{cap([]int{})}) + _ = cap([4]int{cap([4]int{})}) + ) + var y float64 + var z complex128 + const ( + _ = cap([4]float64{}) + _ = cap([4]float64{y}) + _ = cap([4]float64{real(2i)}) + _ = cap /* ERROR not constant */ ([4]float64{real(z)}) + ) + var ch chan [10]int + const ( + _ = cap /* ERROR not constant */ (<-ch) + _ = cap /* ERROR not constant */ ([4]int{(<-ch)[0]}) + ) +} + +func close1() { + var c chan int + var r <-chan int + close() // ERROR not enough arguments + close(1, 2) // ERROR too many arguments + close(42 /* ERROR not a channel */) + close(r /* ERROR receive-only channel */) + close(c) + _ = close /* ERROR used as value */ (c) + + var s []chan int + close(s... /* ERROR invalid use of \.\.\. */ ) +} + +func close2() { + f1 := func() (ch chan int) { return } + f2 := func() (ch chan int, x int) { return } + close(f0 /* ERROR used as value */ ()) + close(f1()) + close(f2()) // ERROR too many arguments +} + +func complex1() { + var i32 int32 + var f32 float32 + var f64 float64 + var c64 complex64 + var c128 complex128 + _ = complex() // ERROR not enough arguments + _ = complex(1) // ERROR not enough arguments + _ = complex(true /* ERROR invalid argument */ , 0) + _ = complex(i32 /* ERROR invalid argument */ , 0) + _ = complex("foo" /* ERROR invalid argument */ , 0) + _ = complex(c64 /* ERROR invalid argument */ , 0) + _ = complex(0, true /* ERROR invalid argument */ ) + _ = complex(0, i32 /* ERROR invalid argument */ ) + _ = complex(0, "foo" /* ERROR invalid argument */ ) + _ = complex(0, c64 /* ERROR invalid argument */ ) + _ = complex(f32, f32) + _ = complex(f32, 1) + _ = complex(f32, 1.0) + _ = complex(f32, 'a') + _ = complex(f64, f64) + _ = complex(f64, 1) + _ = complex(f64, 1.0) + _ = complex(f64, 'a') + _ = complex(f32 /* ERROR mismatched types */ , f64) + _ = complex(f64 /* ERROR mismatched types */ , f32) + _ = complex(1, 1) + _ = complex(1, 1.1) + _ = complex(1, 'a') + complex /* ERROR not used */ (1, 2) + + var _ complex64 = complex(f32, f32) + var _ complex64 = complex /* ERROR cannot initialize */ (f64, f64) + + var _ complex128 = complex /* ERROR cannot initialize */ (f32, f32) + var _ complex128 = complex(f64, f64) + + // untyped constants + const _ int = complex(1, 0) + const _ float32 = complex(1, 0) + const _ complex64 = complex(1, 0) + const _ complex128 = complex(1, 0) + + const _ int = complex /* ERROR int */ (1.1, 0) + const _ float32 = complex /* ERROR float32 */ (1, 2) + + // untyped values + var s uint + _ = complex(1 /* ERROR integer */ <>8&1 + mi>>16&1 + mi>>32&1) + logSizeofUint = uint(mu>>8&1 + mu>>16&1 + mu>>32&1) + logSizeofUintptr = uint(mp>>8&1 + mp>>16&1 + mp>>32&1) +) + +const ( + minInt8 = -1<<(8< 0) + _ = assert(smallestFloat64 > 0) +) + +const ( + maxFloat32 = 1<<127 * (1<<24 - 1) / (1.0<<23) + maxFloat64 = 1<<1023 * (1<<53 - 1) / (1.0<<52) +) + +const ( + _ int8 = minInt8 /* ERROR "overflows" */ - 1 + _ int8 = minInt8 + _ int8 = maxInt8 + _ int8 = maxInt8 /* ERROR "overflows" */ + 1 + _ int8 = smallestFloat64 /* ERROR "truncated" */ + + _ = int8(minInt8 /* ERROR "cannot convert" */ - 1) + _ = int8(minInt8) + _ = int8(maxInt8) + _ = int8(maxInt8 /* ERROR "cannot convert" */ + 1) + _ = int8(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ int16 = minInt16 /* ERROR "overflows" */ - 1 + _ int16 = minInt16 + _ int16 = maxInt16 + _ int16 = maxInt16 /* ERROR "overflows" */ + 1 + _ int16 = smallestFloat64 /* ERROR "truncated" */ + + _ = int16(minInt16 /* ERROR "cannot convert" */ - 1) + _ = int16(minInt16) + _ = int16(maxInt16) + _ = int16(maxInt16 /* ERROR "cannot convert" */ + 1) + _ = int16(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ int32 = minInt32 /* ERROR "overflows" */ - 1 + _ int32 = minInt32 + _ int32 = maxInt32 + _ int32 = maxInt32 /* ERROR "overflows" */ + 1 + _ int32 = smallestFloat64 /* ERROR "truncated" */ + + _ = int32(minInt32 /* ERROR "cannot convert" */ - 1) + _ = int32(minInt32) + _ = int32(maxInt32) + _ = int32(maxInt32 /* ERROR "cannot convert" */ + 1) + _ = int32(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ int64 = minInt64 /* ERROR "overflows" */ - 1 + _ int64 = minInt64 + _ int64 = maxInt64 + _ int64 = maxInt64 /* ERROR "overflows" */ + 1 + _ int64 = smallestFloat64 /* ERROR "truncated" */ + + _ = int64(minInt64 /* ERROR "cannot convert" */ - 1) + _ = int64(minInt64) + _ = int64(maxInt64) + _ = int64(maxInt64 /* ERROR "cannot convert" */ + 1) + _ = int64(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ int = minInt /* ERROR "overflows" */ - 1 + _ int = minInt + _ int = maxInt + _ int = maxInt /* ERROR "overflows" */ + 1 + _ int = smallestFloat64 /* ERROR "truncated" */ + + _ = int(minInt /* ERROR "cannot convert" */ - 1) + _ = int(minInt) + _ = int(maxInt) + _ = int(maxInt /* ERROR "cannot convert" */ + 1) + _ = int(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ uint8 = 0 /* ERROR "overflows" */ - 1 + _ uint8 = 0 + _ uint8 = maxUint8 + _ uint8 = maxUint8 /* ERROR "overflows" */ + 1 + _ uint8 = smallestFloat64 /* ERROR "truncated" */ + + _ = uint8(0 /* ERROR "cannot convert" */ - 1) + _ = uint8(0) + _ = uint8(maxUint8) + _ = uint8(maxUint8 /* ERROR "cannot convert" */ + 1) + _ = uint8(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ uint16 = 0 /* ERROR "overflows" */ - 1 + _ uint16 = 0 + _ uint16 = maxUint16 + _ uint16 = maxUint16 /* ERROR "overflows" */ + 1 + _ uint16 = smallestFloat64 /* ERROR "truncated" */ + + _ = uint16(0 /* ERROR "cannot convert" */ - 1) + _ = uint16(0) + _ = uint16(maxUint16) + _ = uint16(maxUint16 /* ERROR "cannot convert" */ + 1) + _ = uint16(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ uint32 = 0 /* ERROR "overflows" */ - 1 + _ uint32 = 0 + _ uint32 = maxUint32 + _ uint32 = maxUint32 /* ERROR "overflows" */ + 1 + _ uint32 = smallestFloat64 /* ERROR "truncated" */ + + _ = uint32(0 /* ERROR "cannot convert" */ - 1) + _ = uint32(0) + _ = uint32(maxUint32) + _ = uint32(maxUint32 /* ERROR "cannot convert" */ + 1) + _ = uint32(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ uint64 = 0 /* ERROR "overflows" */ - 1 + _ uint64 = 0 + _ uint64 = maxUint64 + _ uint64 = maxUint64 /* ERROR "overflows" */ + 1 + _ uint64 = smallestFloat64 /* ERROR "truncated" */ + + _ = uint64(0 /* ERROR "cannot convert" */ - 1) + _ = uint64(0) + _ = uint64(maxUint64) + _ = uint64(maxUint64 /* ERROR "cannot convert" */ + 1) + _ = uint64(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ uint = 0 /* ERROR "overflows" */ - 1 + _ uint = 0 + _ uint = maxUint + _ uint = maxUint /* ERROR "overflows" */ + 1 + _ uint = smallestFloat64 /* ERROR "truncated" */ + + _ = uint(0 /* ERROR "cannot convert" */ - 1) + _ = uint(0) + _ = uint(maxUint) + _ = uint(maxUint /* ERROR "cannot convert" */ + 1) + _ = uint(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ uintptr = 0 /* ERROR "overflows" */ - 1 + _ uintptr = 0 + _ uintptr = maxUintptr + _ uintptr = maxUintptr /* ERROR "overflows" */ + 1 + _ uintptr = smallestFloat64 /* ERROR "truncated" */ + + _ = uintptr(0 /* ERROR "cannot convert" */ - 1) + _ = uintptr(0) + _ = uintptr(maxUintptr) + _ = uintptr(maxUintptr /* ERROR "cannot convert" */ + 1) + _ = uintptr(smallestFloat64 /* ERROR "cannot convert" */) +) + +const ( + _ float32 = minInt64 + _ float64 = minInt64 + _ complex64 = minInt64 + _ complex128 = minInt64 + + _ = float32(minInt64) + _ = float64(minInt64) + _ = complex64(minInt64) + _ = complex128(minInt64) +) + +const ( + _ float32 = maxUint64 + _ float64 = maxUint64 + _ complex64 = maxUint64 + _ complex128 = maxUint64 + + _ = float32(maxUint64) + _ = float64(maxUint64) + _ = complex64(maxUint64) + _ = complex128(maxUint64) +) + +// TODO(gri) find smaller deltas below + +const delta32 = maxFloat32/(1 << 23) + +const ( + _ float32 = - /* ERROR "overflow" */ (maxFloat32 + delta32) + _ float32 = -maxFloat32 + _ float32 = maxFloat32 + _ float32 = maxFloat32 /* ERROR "overflow" */ + delta32 + + _ = float32(- /* ERROR "cannot convert" */ (maxFloat32 + delta32)) + _ = float32(-maxFloat32) + _ = float32(maxFloat32) + _ = float32(maxFloat32 /* ERROR "cannot convert" */ + delta32) + + _ = assert(float32(smallestFloat32) == smallestFloat32) + _ = assert(float32(smallestFloat32/2) == 0) + _ = assert(float32(smallestFloat64) == 0) + _ = assert(float32(smallestFloat64/2) == 0) +) + +const delta64 = maxFloat64/(1 << 52) + +const ( + _ float64 = - /* ERROR "overflow" */ (maxFloat64 + delta64) + _ float64 = -maxFloat64 + _ float64 = maxFloat64 + _ float64 = maxFloat64 /* ERROR "overflow" */ + delta64 + + _ = float64(- /* ERROR "cannot convert" */ (maxFloat64 + delta64)) + _ = float64(-maxFloat64) + _ = float64(maxFloat64) + _ = float64(maxFloat64 /* ERROR "cannot convert" */ + delta64) + + _ = assert(float64(smallestFloat32) == smallestFloat32) + _ = assert(float64(smallestFloat32/2) == smallestFloat32/2) + _ = assert(float64(smallestFloat64) == smallestFloat64) + _ = assert(float64(smallestFloat64/2) == 0) +) + +const ( + _ complex64 = - /* ERROR "overflow" */ (maxFloat32 + delta32) + _ complex64 = -maxFloat32 + _ complex64 = maxFloat32 + _ complex64 = maxFloat32 /* ERROR "overflow" */ + delta32 + + _ = complex64(- /* ERROR "cannot convert" */ (maxFloat32 + delta32)) + _ = complex64(-maxFloat32) + _ = complex64(maxFloat32) + _ = complex64(maxFloat32 /* ERROR "cannot convert" */ + delta32) +) + +const ( + _ complex128 = - /* ERROR "overflow" */ (maxFloat64 + delta64) + _ complex128 = -maxFloat64 + _ complex128 = maxFloat64 + _ complex128 = maxFloat64 /* ERROR "overflow" */ + delta64 + + _ = complex128(- /* ERROR "cannot convert" */ (maxFloat64 + delta64)) + _ = complex128(-maxFloat64) + _ = complex128(maxFloat64) + _ = complex128(maxFloat64 /* ERROR "cannot convert" */ + delta64) +) + +// Initialization of typed constant and conversion are the same: +const ( + f32 = 1 + smallestFloat32 + x32 float32 = f32 + y32 = float32(f32) + _ = assert(x32 - y32 == 0) +) + +const ( + f64 = 1 + smallestFloat64 + x64 float64 = f64 + y64 = float64(f64) + _ = assert(x64 - y64 == 0) +) diff --git a/vendor/golang.org/x/tools/go/types/testdata/constdecl.src b/vendor/golang.org/x/tools/go/types/testdata/constdecl.src new file mode 100644 index 0000000000..6de9b13d6e --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/constdecl.src @@ -0,0 +1,97 @@ +// Copyright 2013 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 constdecl + +import "math" + +var v int + +// Const decls must be initialized by constants. +const _ = v /* ERROR "not constant" */ +const _ = math /* ERROR "not constant" */ .Sin(0) +const _ = int /* ERROR "not an expression" */ + +func _() { + const _ = v /* ERROR "not constant" */ + const _ = math /* ERROR "not constant" */ .Sin(0) + const _ = int /* ERROR "not an expression" */ +} + +// Identifier and expression arity must match. +// The first error message is produced by the parser. +// In a real-world scenario, the type-checker would not be run +// in this case and the 2nd error message would not appear. +const _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ +const _ = 1, 2 /* ERROR "extra init expr 2" */ + +const _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ int +const _ int = 1, 2 /* ERROR "extra init expr 2" */ + +const ( + _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ + _ = 1, 2 /* ERROR "extra init expr 2" */ + + _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ int + _ int = 1, 2 /* ERROR "extra init expr 2" */ +) + +const ( + _ = 1 + _ + _, _ /* ERROR "missing init expr for _" */ + _ +) + +const ( + _, _ = 1, 2 + _, _ + _ /* ERROR "extra init expr at" */ + _, _ + _, _, _ /* ERROR "missing init expr for _" */ + _, _ +) + +func _() { + const _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ + const _ = 1, 2 /* ERROR "extra init expr 2" */ + + const _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ int + const _ int = 1, 2 /* ERROR "extra init expr 2" */ + + const ( + _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ + _ = 1, 2 /* ERROR "extra init expr 2" */ + + _ /* ERROR "missing constant value" */ /* ERROR "missing init expr for _" */ int + _ int = 1, 2 /* ERROR "extra init expr 2" */ + ) + + const ( + _ = 1 + _ + _, _ /* ERROR "missing init expr for _" */ + _ + ) + + const ( + _, _ = 1, 2 + _, _ + _ /* ERROR "extra init expr at" */ + _, _ + _, _, _ /* ERROR "missing init expr for _" */ + _, _ + ) +} + +// Test case for constant with invalid initialization. +// Caused panic because the constant value was not set up (gri - 7/8/2014). +func _() { + const ( + x string = missing /* ERROR "undeclared name" */ + y = x + "" + ) +} + +// TODO(gri) move extra tests from testdata/const0.src into here diff --git a/vendor/golang.org/x/tools/go/types/testdata/conversions.src b/vendor/golang.org/x/tools/go/types/testdata/conversions.src new file mode 100644 index 0000000000..e1336c0456 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/conversions.src @@ -0,0 +1,93 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// conversions + +package conversions + +import "unsafe" + +// argument count +var ( + _ = int() /* ERROR "missing argument" */ + _ = int(1, 2 /* ERROR "too many arguments" */ ) +) + +// numeric constant conversions are in const1.src. + +func string_conversions() { + const A = string(65) + assert(A == "A") + const E = string(-1) + assert(E == "\uFFFD") + assert(E == string(1234567890)) + + type myint int + assert(A == string(myint(65))) + + type mystring string + const _ mystring = mystring("foo") + + const _ = string(true /* ERROR "cannot convert" */ ) + const _ = string(1.2 /* ERROR "cannot convert" */ ) + const _ = string(nil /* ERROR "cannot convert" */ ) + + // issues 11357, 11353: argument must be of integer type + _ = string(0.0 /* ERROR "cannot convert" */ ) + _ = string(0i /* ERROR "cannot convert" */ ) + _ = string(1 /* ERROR "cannot convert" */ + 2i) +} + +func interface_conversions() { + type E interface{} + + type I1 interface{ + m1() + } + + type I2 interface{ + m1() + m2(x int) + } + + type I3 interface{ + m1() + m2() int + } + + var e E + var i1 I1 + var i2 I2 + var i3 I3 + + _ = E(0) + _ = E(nil) + _ = E(e) + _ = E(i1) + _ = E(i2) + + _ = I1(0 /* ERROR "cannot convert" */ ) + _ = I1(nil) + _ = I1(i1) + _ = I1(e /* ERROR "cannot convert" */ ) + _ = I1(i2) + + _ = I2(nil) + _ = I2(i1 /* ERROR "cannot convert" */ ) + _ = I2(i2) + _ = I2(i3 /* ERROR "cannot convert" */ ) + + _ = I3(nil) + _ = I3(i1 /* ERROR "cannot convert" */ ) + _ = I3(i2 /* ERROR "cannot convert" */ ) + _ = I3(i3) + + // TODO(gri) add more tests, improve error message +} + +func issue6326() { + type T unsafe.Pointer + var x T + _ = uintptr(x) // see issue 6326 +} diff --git a/vendor/golang.org/x/tools/go/types/testdata/cycles.src b/vendor/golang.org/x/tools/go/types/testdata/cycles.src new file mode 100644 index 0000000000..621d83c945 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/cycles.src @@ -0,0 +1,143 @@ +// Copyright 2013 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 cycles + +type ( + T0 int + T1 /* ERROR cycle */ T1 + T2 *T2 + + T3 /* ERROR cycle */ T4 + T4 T5 + T5 T3 + + T6 T7 + T7 *T8 + T8 T6 + + // arrays + A0 /* ERROR cycle */ [10]A0 + A1 [10]*A1 + + A2 /* ERROR cycle */ [10]A3 + A3 [10]A4 + A4 A2 + + A5 [10]A6 + A6 *A5 + + // slices + L0 []L0 + + // structs + S0 /* ERROR cycle */ struct{ _ S0 } + S1 /* ERROR cycle */ struct{ S1 } + S2 struct{ _ *S2 } + S3 struct{ *S3 } + + S4 /* ERROR cycle */ struct{ S5 } + S5 struct{ S6 } + S6 S4 + + // pointers + P0 *P0 + + // functions + F0 func(F0) + F1 func() F1 + F2 func(F2) F2 + + // interfaces + I0 /* ERROR cycle */ interface{ I0 } + + I1 interface{ I2 } + I2 interface{ I3 } + I3 /* ERROR cycle */ interface{ I1 } + + I4 interface{ f(I4) } + + // testcase for issue 5090 + I5 interface{ f(I6) } + I6 interface{ I5 } + + // maps + M0 map[M0 /* ERROR invalid map key */ ]M0 + + // channels + C0 chan C0 +) + +func _() { + type ( + t1 /* ERROR cycle */ t1 + t2 *t2 + + t3 t4 /* ERROR undeclared */ + t4 t5 /* ERROR undeclared */ + t5 t3 + + // arrays + a0 /* ERROR cycle */ [10]a0 + a1 [10]*a1 + + // slices + l0 []l0 + + // structs + s0 /* ERROR cycle */ struct{ _ s0 } + s1 /* ERROR cycle */ struct{ s1 } + s2 struct{ _ *s2 } + s3 struct{ *s3 } + + // pointers + p0 *p0 + + // functions + f0 func(f0) + f1 func() f1 + f2 func(f2) f2 + + // interfaces + i0 /* ERROR cycle */ interface{ i0 } + + // maps + m0 map[m0 /* ERROR invalid map key */ ]m0 + + // channels + c0 chan c0 + ) +} + +// test cases for issue 6667 + +type A [10]map[A /* ERROR invalid map key */ ]bool + +type S struct { + m map[S /* ERROR invalid map key */ ]bool +} + +// test cases for issue 7236 +// (cycle detection must not be dependent on starting point of resolution) + +type ( + P1 *T9 + T9 /* ERROR cycle */ T9 + + T10 /* ERROR cycle */ T10 + P2 *T10 +) + +func (T11) m() {} + +type T11 /* ERROR cycle */ struct{ T11 } + +type T12 /* ERROR cycle */ struct{ T12 } + +func (*T12) m() {} + +type ( + P3 *T13 + T13 /* ERROR cycle */ T13 +) \ No newline at end of file diff --git a/vendor/golang.org/x/tools/go/types/testdata/cycles1.src b/vendor/golang.org/x/tools/go/types/testdata/cycles1.src new file mode 100644 index 0000000000..ae2b38ebec --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/cycles1.src @@ -0,0 +1,77 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +type ( + A interface { + a() interface { + ABC1 + } + } + B interface { + b() interface { + ABC2 + } + } + C interface { + c() interface { + ABC3 + } + } + + AB interface { + A + B + } + BC interface { + B + C + } + + ABC1 interface { + A + B + C + } + ABC2 interface { + AB + C + } + ABC3 interface { + A + BC + } +) + +var ( + x1 ABC1 + x2 ABC2 + x3 ABC3 +) + +func _() { + // all types have the same method set + x1 = x2 + x2 = x1 + + x1 = x3 + x3 = x1 + + x2 = x3 + x3 = x2 + + // all methods return the same type again + x1 = x1.a() + x1 = x1.b() + x1 = x1.c() + + x2 = x2.a() + x2 = x2.b() + x2 = x2.c() + + x3 = x3.a() + x3 = x3.b() + x3 = x3.c() +} diff --git a/vendor/golang.org/x/tools/go/types/testdata/cycles2.src b/vendor/golang.org/x/tools/go/types/testdata/cycles2.src new file mode 100644 index 0000000000..345ab56ea6 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/cycles2.src @@ -0,0 +1,118 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +import "unsafe" + +// Test case for issue 5090 + +type t interface { + f(u) +} + +type u interface { + t +} + +func _() { + var t t + var u u + + t.f(t) + t.f(u) + + u.f(t) + u.f(u) +} + + +// Test case for issue 6589. + +type A interface { + a() interface { + AB + } +} + +type B interface { + a() interface { + AB + } +} + +type AB interface { + a() interface { + A + B /* ERROR a redeclared */ + } + b() interface { + A + B /* ERROR a redeclared */ + } +} + +var x AB +var y interface { + A + B /* ERROR a redeclared */ +} +var _ = x /* ERROR cannot compare */ == y + + +// Test case for issue 6638. + +type T interface { + m() [T /* ERROR no value */ (nil).m()[0]]int +} + +// Variations of this test case. + +type T1 interface { + m() [x1 /* ERROR no value */ .m()[0]]int +} + +var x1 T1 + +type T2 interface { + m() [len(x2 /* ERROR no value */ .m())]int +} + +var x2 T2 + +type T3 interface { + m() [unsafe.Sizeof(x3.m)]int +} + +var x3 T3 + +// The test case below should also report an error for +// the cast inside the T4 interface (like it does for the +// variable initialization). The reason why it does not is +// that inside T4, the method x4.m depends on T4 which is not +// fully set up yet. The x4.m method happens to have an empty +// signature which is why the cast is permitted. +// TODO(gri) Consider marking methods as incomplete and provide +// a better error message in that case. + +type T4 interface { + m() [unsafe.Sizeof(cast4(x4.m))]int +} + +var x4 T4 +var _ = cast4(x4 /* ERROR cannot convert */.m) + +type cast4 func() + +// This test is symmetric to the T4 case: Here the cast is +// "correct", but it doesn't work inside the T5 interface. + +type T5 interface { + m() [unsafe.Sizeof(cast5(x5 /* ERROR cannot convert */ .m))]int +} + +var x5 T5 +var _ = cast5(x5.m) + +type cast5 func() [0]int diff --git a/vendor/golang.org/x/tools/go/types/testdata/cycles3.src b/vendor/golang.org/x/tools/go/types/testdata/cycles3.src new file mode 100644 index 0000000000..3da4fb5761 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/cycles3.src @@ -0,0 +1,60 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +import "unsafe" + +var ( + _ A = A(nil).a().b().c().d().e().f() + _ A = A(nil).b().c().d().e().f() + _ A = A(nil).c().d().e().f() + _ A = A(nil).d().e().f() + _ A = A(nil).e().f() + _ A = A(nil).f() + _ A = A(nil) +) + +type ( + A interface { + a() B + B + } + + B interface { + b() C + C + } + + C interface { + c() D + D + } + + D interface { + d() E + E + } + + E interface { + e() F + F + } + + F interface { + f() A + } +) + +type ( + U interface { + V + } + + V interface { + v() [unsafe.Sizeof(u)]int + } +) + +var u U diff --git a/vendor/golang.org/x/tools/go/types/testdata/cycles4.src b/vendor/golang.org/x/tools/go/types/testdata/cycles4.src new file mode 100644 index 0000000000..445babca68 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/cycles4.src @@ -0,0 +1,110 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package p + +// Check that all methods of T are collected before +// determining the result type of m (which embeds +// all methods of T). + +type T interface { + m() interface {T} + E +} + +var _ = T.m(nil).m().e() + +type E interface { + e() int +} + +// Check that unresolved forward chains are followed +// (see also comment in resolver.go, checker.typeDecl). + +var _ = C.m(nil).m().e() + +type A B + +type B interface { + m() interface{C} + E +} + +type C A + +// Check that interface type comparison for identity +// does not recur endlessly. + +type T1 interface { + m() interface{T1} +} + +type T2 interface { + m() interface{T2} +} + +func _(x T1, y T2) { + // Checking for assignability of interfaces must check + // if all methods of x are present in y, and that they + // have identical signatures. The signatures recur via + // the result type, which is an interface that embeds + // a single method m that refers to the very interface + // that contains it. This requires cycle detection in + // identity checks for interface types. + x = y +} + +type T3 interface { + m() interface{T4} +} + +type T4 interface { + m() interface{T3} +} + +func _(x T1, y T3) { + x = y +} + +// Check that interfaces are type-checked in order of +// (embedded interface) dependencies (was issue 7158). + +var x1 T5 = T7(nil) + +type T5 interface { + T6 +} + +type T6 interface { + m() T7 +} +type T7 interface { + T5 +} + +// Actual test case from issue 7158. + +func wrapNode() Node { + return wrapElement() +} + +func wrapElement() Element { + return nil +} + +type EventTarget interface { + AddEventListener(Event) +} + +type Node interface { + EventTarget +} + +type Element interface { + Node +} + +type Event interface { + Target() Element +} diff --git a/vendor/golang.org/x/tools/go/types/testdata/decls0.src b/vendor/golang.org/x/tools/go/types/testdata/decls0.src new file mode 100644 index 0000000000..21baafe279 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/decls0.src @@ -0,0 +1,207 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// type declarations + +package decls0 + +import "unsafe" + +const pi = 3.1415 + +type ( + N undeclared /* ERROR "undeclared" */ + B bool + I int32 + A [10]P + T struct { + x, y P + } + P *T + R (*R) + F func(A) I + Y interface { + f(A) I + } + S [](((P))) + M map[I]F + C chan<- I + + // blank types must be typechecked + _ pi /* ERROR "not a type" */ + _ struct{} + _ struct{ pi /* ERROR "not a type" */ } +) + + +// declarations of init +const _, init /* ERROR "cannot declare init" */ , _ = 0, 1, 2 +type init /* ERROR "cannot declare init" */ struct{} +var _, init /* ERROR "cannot declare init" */ int + +func init() {} +func init /* ERROR "missing function body" */ () + +func _() { const init = 0 } +func _() { type init int } +func _() { var init int; _ = init } + +// invalid array types +type ( + iA0 [... /* ERROR "invalid use of '...'" */ ]byte + iA1 [1 /* ERROR "invalid array length" */ <<100]int + iA2 [- /* ERROR "invalid array length" */ 1]complex128 + iA3 ["foo" /* ERROR "must be integer" */ ]string + iA4 [float64 /* ERROR "must be integer" */ (0)]int +) + + +type ( + p1 pi /* ERROR "no field or method foo" */ .foo + p2 unsafe.Pointer +) + + +type ( + Pi pi /* ERROR "not a type" */ + + a /* ERROR "illegal cycle" */ a + a /* ERROR "redeclared" */ int + + // where the cycle error appears depends on the + // order in which declarations are processed + // (which depends on the order in which a map + // is iterated through) + b /* ERROR "illegal cycle" */ c + c d + d e + e b + + t *t + + U V + V *W + W U + + P1 *S2 + P2 P1 + + S0 struct { + } + S1 struct { + a, b, c int + u, v, a /* ERROR "redeclared" */ float32 + } + S2 struct { + S0 // anonymous field + S0 /* ERROR "redeclared" */ int + } + S3 struct { + x S2 + } + S4/* ERROR "illegal cycle" */ struct { + S4 + } + S5 /* ERROR "illegal cycle" */ struct { + S6 + } + S6 struct { + field S7 + } + S7 struct { + S5 + } + + L1 []L1 + L2 []int + + A1 [10.0]int + A2 /* ERROR "illegal cycle" */ [10]A2 + A3 /* ERROR "illegal cycle" */ [10]struct { + x A4 + } + A4 [10]A3 + + F1 func() + F2 func(x, y, z float32) + F3 func(x, y, x /* ERROR "redeclared" */ float32) + F4 func() (x, y, x /* ERROR "redeclared" */ float32) + F5 func(x int) (x /* ERROR "redeclared" */ float32) + F6 func(x ...int) + + I1 interface{} + I2 interface { + m1() + } + I3 interface { + m1() + m1 /* ERROR "redeclared" */ () + } + I4 interface { + m1(x, y, x /* ERROR "redeclared" */ float32) + m2() (x, y, x /* ERROR "redeclared" */ float32) + m3(x int) (x /* ERROR "redeclared" */ float32) + } + I5 interface { + m1(I5) + } + I6 interface { + S0 /* ERROR "not an interface" */ + } + I7 interface { + I1 + I1 + } + I8 /* ERROR "illegal cycle" */ interface { + I8 + } + I9 interface { + I10 + } + I10 interface { + I11 + } + I11 /* ERROR "illegal cycle" */ interface { + I9 + } + + C1 chan int + C2 <-chan int + C3 chan<- C3 + C4 chan C5 + C5 chan C6 + C6 chan C4 + + M1 map[Last]string + M2 map[string]M2 + + Last int +) + +// cycles in function/method declarations +// (test cases for issue 5217 and variants) +func f1(x f1 /* ERROR "not a type" */ ) {} +func f2(x *f2 /* ERROR "not a type" */ ) {} +func f3() (x f3 /* ERROR "not a type" */ ) { return } +func f4() (x *f4 /* ERROR "not a type" */ ) { return } + +func (S0) m1(x S0 /* ERROR "field or method" */ .m1) {} +func (S0) m2(x *S0 /* ERROR "field or method" */ .m2) {} +func (S0) m3() (x S0 /* ERROR "field or method" */ .m3) { return } +func (S0) m4() (x *S0 /* ERROR "field or method" */ .m4) { return } + +// interfaces may not have any blank methods +type BlankI interface { + _ /* ERROR "invalid method name" */ () + _ /* ERROR "invalid method name" */ (float32) int + m() +} + +// non-interface types may have multiple blank methods +type BlankT struct{} + +func (BlankT) _() {} +func (BlankT) _(int) {} +func (BlankT) _() int { return 0 } +func (BlankT) _(int) int { return 0} diff --git a/vendor/golang.org/x/tools/go/types/testdata/decls1.src b/vendor/golang.org/x/tools/go/types/testdata/decls1.src new file mode 100644 index 0000000000..7855e461e2 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/decls1.src @@ -0,0 +1,144 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// variable declarations + +package decls1 + +import ( + "math" +) + +// Global variables without initialization +var ( + a, b bool + c byte + d uint8 + r rune + i int + j, k, l int + x, y float32 + xx, yy float64 + u, v complex64 + uu, vv complex128 + s, t string + array []byte + iface interface{} + + blank _ /* ERROR "cannot use _" */ +) + +// Global variables with initialization +var ( + s1 = i + j + s2 = i /* ERROR "mismatched types" */ + x + s3 = c + d + s4 = s + t + s5 = s /* ERROR "invalid operation" */ / t + s6 = array[t1] + s7 = array[x /* ERROR "integer" */] + s8 = &a + s10 = &42 /* ERROR "cannot take address" */ + s11 = &v + s12 = -(u + *t11) / *&v + s13 = a /* ERROR "shifted operand" */ << d + s14 = i << j /* ERROR "must be unsigned" */ + s18 = math.Pi * 10.0 + s19 = s1 /* ERROR "cannot call" */ () + s20 = f0 /* ERROR "no value" */ () + s21 = f6(1, s1, i) + s22 = f6(1, s1, uu /* ERROR "cannot pass argument" */ ) + + t1 int = i + j + t2 int = i /* ERROR "mismatched types" */ + x + t3 int = c /* ERROR "cannot initialize" */ + d + t4 string = s + t + t5 string = s /* ERROR "invalid operation" */ / t + t6 byte = array[t1] + t7 byte = array[x /* ERROR "must be integer" */] + t8 *int = & /* ERROR "cannot initialize" */ a + t10 *int = &42 /* ERROR "cannot take address" */ + t11 *complex64 = &v + t12 complex64 = -(u + *t11) / *&v + t13 int = a /* ERROR "shifted operand" */ << d + t14 int = i << j /* ERROR "must be unsigned" */ + t15 math /* ERROR "not in selector" */ + t16 math /* ERROR "not declared" */ .xxx + t17 math /* ERROR "not a type" */ .Pi + t18 float64 = math.Pi * 10.0 + t19 int = t1 /* ERROR "cannot call" */ () + t20 int = f0 /* ERROR "no value" */ () + t21 int = a /* ERROR "cannot initialize" */ +) + +// Various more complex expressions +var ( + u1 = x /* ERROR "not an interface" */ .(int) + u2 = iface.([]int) + u3 = iface.(a /* ERROR "not a type" */ ) + u4, ok = iface.(int) + u5, ok2, ok3 = iface /* ERROR "assignment count mismatch" */ .(int) +) + +// Constant expression initializations +var ( + v1 = 1 /* ERROR "cannot convert" */ + "foo" + v2 = c + 255 + v3 = c + 256 /* ERROR "overflows" */ + v4 = r + 2147483647 + v5 = r + 2147483648 /* ERROR "overflows" */ + v6 = 42 + v7 = v6 + 9223372036854775807 + v8 = v6 + 9223372036854775808 /* ERROR "overflows" */ + v9 = i + 1 << 10 + v10 byte = 1024 /* ERROR "overflows" */ + v11 = xx/yy*yy - xx + v12 = true && false + v13 = nil /* ERROR "use of untyped nil" */ +) + +// Multiple assignment expressions +var ( + m1a, m1b = 1, 2 + m2a, m2b, m2c /* ERROR "missing init expr for m2c" */ = 1, 2 + m3a, m3b = 1, 2, 3 /* ERROR "extra init expr 3" */ +) + +func _() { + var ( + m1a, m1b = 1, 2 + m2a, m2b, m2c /* ERROR "missing init expr for m2c" */ = 1, 2 + m3a, m3b = 1, 2, 3 /* ERROR "extra init expr 3" */ + ) + + _, _ = m1a, m1b + _, _, _ = m2a, m2b, m2c + _, _ = m3a, m3b +} + +// Declaration of parameters and results +func f0() {} +func f1(a /* ERROR "not a type" */) {} +func f2(a, b, c d /* ERROR "not a type" */) {} + +func f3() int { return 0 } +func f4() a /* ERROR "not a type" */ { return 0 } +func f5() (a, b, c d /* ERROR "not a type" */) { return } + +func f6(a, b, c int) complex128 { return 0 } + +// Declaration of receivers +type T struct{} + +func (T) m0() {} +func (*T) m1() {} +func (x T) m2() {} +func (x *T) m3() {} + +// Initialization functions +func init() {} +func /* ERROR "no arguments and no return values" */ init(int) {} +func /* ERROR "no arguments and no return values" */ init() int { return 0 } +func /* ERROR "no arguments and no return values" */ init(int) int { return 0 } +func (T) init(int) int { return 0 } diff --git a/vendor/golang.org/x/tools/go/types/testdata/decls2a.src b/vendor/golang.org/x/tools/go/types/testdata/decls2a.src new file mode 100644 index 0000000000..bdbecd9dbb --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/decls2a.src @@ -0,0 +1,111 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// method declarations + +package decls2 + +import "time" +import "unsafe" + +// T1 declared before its methods. +type T1 struct{ + f int +} + +func (T1) m() {} +func (T1) m /* ERROR "already declared" */ () {} +func (x *T1) f /* ERROR "field and method" */ () {} + +// Conflict between embedded field and method name, +// with the embedded field being a basic type. +type T1b struct { + int +} + +func (T1b) int /* ERROR "field and method" */ () {} + +type T1c struct { + time.Time +} + +func (T1c) Time /* ERROR "field and method" */ () int { return 0 } + +// Disabled for now: LookupFieldOrMethod will find Pointer even though +// it's double-declared (it would cost extra in the common case to verify +// this). But the MethodSet computation will not find it due to the name +// collision caused by the double-declaration, leading to an internal +// inconsistency while we are verifying one computation against the other. +// var _ = T1c{}.Pointer + +// T2's method declared before the type. +func (*T2) f /* ERROR "field and method" */ () {} + +type T2 struct { + f int +} + +// Methods declared without a declared type. +func (undeclared /* ERROR "undeclared" */) m() {} +func (x *undeclared /* ERROR "undeclared" */) m() {} + +func (pi /* ERROR "not a type" */) m1() {} +func (x pi /* ERROR "not a type" */) m2() {} +func (x *pi /* ERROR "not a type" */ ) m3() {} + +// Blank types. +type _ struct { m int } +type _ struct { m int } + +func (_ /* ERROR "cannot use _" */) m() {} +func m(_ /* ERROR "cannot use _" */) {} + +// Methods with receiver base type declared in another file. +func (T3) m1() {} +func (*T3) m2() {} +func (x T3) m3() {} +func (x *T3) f /* ERROR "field and method" */ () {} + +// Methods of non-struct type. +type T4 func() + +func (self T4) m() func() { return self } + +// Methods associated with an interface. +type T5 interface { + m() int +} + +func (T5 /* ERROR "invalid receiver" */ ) m1() {} +func (T5 /* ERROR "invalid receiver" */ ) m2() {} + +// Methods associated with a named pointer type. +type ptr *int +func (ptr /* ERROR "invalid receiver" */ ) _() {} +func (* /* ERROR "invalid receiver" */ ptr) _() {} + +// Methods with zero or multiple receivers. +func ( /* ERROR "missing receiver" */ ) _() {} +func (T3, * /* ERROR "exactly one receiver" */ T3) _() {} +func (T3, T3, T3 /* ERROR "exactly one receiver" */ ) _() {} +func (a, b /* ERROR "exactly one receiver" */ T3) _() {} +func (a, b, c /* ERROR "exactly one receiver" */ T3) _() {} + +// Methods associated with non-local or unnamed types. +func (int /* ERROR "invalid receiver" */ ) m() {} +func ([ /* ERROR "invalid receiver" */ ]int) m() {} +func (time /* ERROR "invalid receiver" */ .Time) m() {} +func (* /* ERROR "invalid receiver" */ time.Time) m() {} +func (x /* ERROR "invalid receiver" */ interface{}) m() {} + +// Unsafe.Pointer is treated like a pointer when used as receiver type. +type UP unsafe.Pointer +func (UP /* ERROR "invalid" */ ) m1() {} +func (* /* ERROR "invalid" */ UP) m2() {} + +// Double declarations across package files +const c_double = 0 +type t_double int +var v_double int +func f_double() {} diff --git a/vendor/golang.org/x/tools/go/types/testdata/decls2b.src b/vendor/golang.org/x/tools/go/types/testdata/decls2b.src new file mode 100644 index 0000000000..e7bc394762 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/decls2b.src @@ -0,0 +1,65 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// method declarations + +package decls2 + +import "io" + +const pi = 3.1415 + +func (T1) m /* ERROR "already declared" */ () {} +func (T2) m(io.Writer) {} + +type T3 struct { + f *T3 +} + +type T6 struct { + x int +} + +func (t *T6) m1() int { + return t.x +} + +func f() { + var t *T6 + t.m1() +} + +// Double declarations across package files +const c_double /* ERROR "redeclared" */ = 0 +type t_double /* ERROR "redeclared" */ int +var v_double /* ERROR "redeclared" */ int +func f_double /* ERROR "redeclared" */ () {} + +// Blank methods need to be type-checked. +// Verify by checking that errors are reported. +func (T /* ERROR "undeclared" */ ) _() {} +func (T1) _(undeclared /* ERROR "undeclared" */ ) {} +func (T1) _() int { return "foo" /* ERROR "cannot convert" */ } + +// Methods with undeclared receiver type can still be checked. +// Verify by checking that errors are reported. +func (Foo /* ERROR "undeclared" */ ) m() {} +func (Foo /* ERROR "undeclared" */ ) m(undeclared /* ERROR "undeclared" */ ) {} +func (Foo /* ERROR "undeclared" */ ) m() int { return "foo" /* ERROR "cannot convert" */ } + +func (Foo /* ERROR "undeclared" */ ) _() {} +func (Foo /* ERROR "undeclared" */ ) _(undeclared /* ERROR "undeclared" */ ) {} +func (Foo /* ERROR "undeclared" */ ) _() int { return "foo" /* ERROR "cannot convert" */ } + +// Receiver declarations are regular parameter lists; +// receiver types may use parentheses, and the list +// may have a trailing comma. +type T7 struct {} + +func (T7) m1() {} +func ((T7)) m2() {} +func ((*T7)) m3() {} +func (x *(T7),) m4() {} +func (x (*(T7)),) m5() {} +func (x ((*((T7)))),) m6() {} diff --git a/vendor/golang.org/x/tools/go/types/testdata/decls3.src b/vendor/golang.org/x/tools/go/types/testdata/decls3.src new file mode 100644 index 0000000000..80d2bc8ff8 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/decls3.src @@ -0,0 +1,309 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// embedded types + +package decls3 + +import "unsafe" +import "fmt" + +// fields with the same name at the same level cancel each other out + +func _() { + type ( + T1 struct { X int } + T2 struct { X int } + T3 struct { T1; T2 } // X is embedded twice at the same level via T1->X, T2->X + ) + + var t T3 + _ = t /* ERROR "ambiguous selector" */ .X +} + +func _() { + type ( + T1 struct { X int } + T2 struct { T1 } + T3 struct { T1 } + T4 struct { T2; T3 } // X is embedded twice at the same level via T2->T1->X, T3->T1->X + ) + + var t T4 + _ = t /* ERROR "ambiguous selector" */ .X +} + +func issue4355() { + type ( + T1 struct {X int} + T2 struct {T1} + T3 struct {T2} + T4 struct {T2} + T5 struct {T3; T4} // X is embedded twice at the same level via T3->T2->T1->X, T4->T2->T1->X + ) + + var t T5 + _ = t /* ERROR "ambiguous selector" */ .X +} + +func _() { + type State int + type A struct{ State } + type B struct{ fmt.State } + type T struct{ A; B } + + var t T + _ = t /* ERROR "ambiguous selector" */ .State +} + +// Embedded fields can be predeclared types. + +func _() { + type T0 struct{ + int + float32 + f int + } + var x T0 + _ = x.int + _ = x.float32 + _ = x.f + + type T1 struct{ + T0 + } + var y T1 + _ = y.int + _ = y.float32 + _ = y.f +} + +// Restrictions on embedded field types. + +func _() { + type I1 interface{} + type I2 interface{} + type P1 *int + type P2 *int + type UP unsafe.Pointer + + type T1 struct { + I1 + * /* ERROR "cannot be a pointer to an interface" */ I2 + * /* ERROR "cannot be a pointer to an interface" */ error + P1 /* ERROR "cannot be a pointer" */ + * /* ERROR "cannot be a pointer" */ P2 + } + + // unsafe.Pointers are treated like regular pointers when embedded + type T2 struct { + unsafe /* ERROR "cannot be unsafe.Pointer" */ .Pointer + */* ERROR "cannot be unsafe.Pointer" */ unsafe.Pointer + UP /* ERROR "cannot be unsafe.Pointer" */ + * /* ERROR "cannot be unsafe.Pointer" */ UP + } +} + +// Named types that are pointers. + +type S struct{ x int } +func (*S) m() {} +type P *S + +func _() { + var s *S + _ = s.x + _ = s.m + + var p P + _ = p.x + _ = p /* ERROR "no field or method" */ .m + _ = P /* ERROR "no field or method" */ .m +} + +// Borrowed from the FieldByName test cases in reflect/all_test.go. + +type D1 struct { + d int +} +type D2 struct { + d int +} + +type S0 struct { + A, B, C int + D1 + D2 +} + +type S1 struct { + B int + S0 +} + +type S2 struct { + A int + *S1 +} + +type S1x struct { + S1 +} + +type S1y struct { + S1 +} + +type S3 struct { + S1x + S2 + D, E int + *S1y +} + +type S4 struct { + *S4 + A int +} + +// The X in S6 and S7 annihilate, but they also block the X in S8.S9. +type S5 struct { + S6 + S7 + S8 +} + +type S6 struct { + X int +} + +type S7 S6 + +type S8 struct { + S9 +} + +type S9 struct { + X int + Y int +} + +// The X in S11.S6 and S12.S6 annihilate, but they also block the X in S13.S8.S9. +type S10 struct { + S11 + S12 + S13 +} + +type S11 struct { + S6 +} + +type S12 struct { + S6 +} + +type S13 struct { + S8 +} + +func _() { + _ = struct /* ERROR "no field or method" */ {}{}.Foo + _ = S0{}.A + _ = S0 /* ERROR "no field or method" */ {}.D + _ = S1{}.A + _ = S1{}.B + _ = S1{}.S0 + _ = S1{}.C + _ = S2{}.A + _ = S2{}.S1 + _ = S2{}.B + _ = S2{}.C + _ = S2 /* ERROR "no field or method" */ {}.D + _ = S3 /* ERROR "ambiguous selector" */ {}.S1 + _ = S3{}.A + _ = S3 /* ERROR "ambiguous selector" */ {}.B + _ = S3{}.D + _ = S3{}.E + _ = S4{}.A + _ = S4 /* ERROR "no field or method" */ {}.B + _ = S5 /* ERROR "ambiguous selector" */ {}.X + _ = S5{}.Y + _ = S10 /* ERROR "ambiguous selector" */ {}.X + _ = S10{}.Y +} + +// Borrowed from the FieldByName benchmark in reflect/all_test.go. + +type R0 struct { + *R1 + *R2 + *R3 + *R4 +} + +type R1 struct { + *R5 + *R6 + *R7 + *R8 +} + +type R2 R1 +type R3 R1 +type R4 R1 + +type R5 struct { + *R9 + *R10 + *R11 + *R12 +} + +type R6 R5 +type R7 R5 +type R8 R5 + +type R9 struct { + *R13 + *R14 + *R15 + *R16 +} + +type R10 R9 +type R11 R9 +type R12 R9 + +type R13 struct { + *R17 + *R18 + *R19 + *R20 +} + +type R14 R13 +type R15 R13 +type R16 R13 + +type R17 struct { + *R21 + *R22 + *R23 + *R24 +} + +type R18 R17 +type R19 R17 +type R20 R17 + +type R21 struct { + X int +} + +type R22 R21 +type R23 R21 +type R24 R21 + +var _ = R0 /* ERROR "ambiguous selector" */ {}.X \ No newline at end of file diff --git a/vendor/golang.org/x/tools/go/types/testdata/errors.src b/vendor/golang.org/x/tools/go/types/testdata/errors.src new file mode 100644 index 0000000000..45bd45a13a --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/errors.src @@ -0,0 +1,55 @@ +// Copyright 2013 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 errors + +// Testing precise operand formatting in error messages +// (matching messages are regular expressions, hence the \'s). +func f(x int, m map[string]int) { + // no values + _ = f /* ERROR "f\(0, m\) \(no value\) used as value" */ (0, m) + + // built-ins + _ = println /* ERROR "println \(built-in\) must be called" */ + + // types + _ = complex128 /* ERROR "complex128 \(type\) is not an expression" */ + + // constants + const c1 = 991 + const c2 float32 = 0.5 + 0 /* ERROR "0 \(untyped int constant\) is not used" */ + c1 /* ERROR "c1 \(untyped int constant 991\) is not used" */ + c2 /* ERROR "c2 \(constant 1/2 of type float32\) is not used" */ + c1 /* ERROR "c1 \+ c2 \(constant 1983/2 of type float32\) is not used" */ + c2 + + // variables + x /* ERROR "x \(variable of type int\) is not used" */ + + // values + x /* ERROR "x != x \(untyped bool value\) is not used" */ != x + x /* ERROR "x \+ x \(value of type int\) is not used" */ + x + + // value, ok's + const s = "foo" + m /* ERROR "m\[s\] \(map index expression of type int\) is not used" */ [s] +} + +// Valid ERROR comments can have a variety of forms. +func _() { + 0 /* ERROR "0 .* is not used" */ + 0 /* ERROR 0 .* is not used */ + 0 // ERROR "0 .* is not used" + 0 // ERROR 0 .* is not used +} + +// Don't report spurious errors as a consequence of earlier errors. +// Add more tests as needed. +func _() { + if err := foo /* ERROR undeclared */ (); err != nil /* no error here */ {} +} + +// Use unqualified names for package-local objects. +type T struct{} +var _ int = T /* ERROR value of type T */ {} // use T in error message rather then errors.T diff --git a/vendor/golang.org/x/tools/go/types/testdata/expr0.src b/vendor/golang.org/x/tools/go/types/testdata/expr0.src new file mode 100644 index 0000000000..3120c6f078 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/expr0.src @@ -0,0 +1,174 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// unary expressions + +package expr0 + +type mybool bool + +var ( + // bool + b0 = true + b1 bool = b0 + b2 = !true + b3 = !b1 + b4 bool = !true + b5 bool = !b4 + b6 = +b0 /* ERROR "not defined" */ + b7 = -b0 /* ERROR "not defined" */ + b8 = ^b0 /* ERROR "not defined" */ + b9 = *b0 /* ERROR "cannot indirect" */ + b10 = &true /* ERROR "cannot take address" */ + b11 = &b0 + b12 = <-b0 /* ERROR "cannot receive" */ + b13 = & & /* ERROR "cannot take address" */ b0 + + // byte + _ = byte(0) + _ = byte(- /* ERROR "cannot convert" */ 1) + _ = - /* ERROR "-byte\(1\) \(constant -1 of type byte\) overflows byte" */ byte(1) // test for issue 11367 + _ = byte /* ERROR "overflows byte" */ (0) - byte(1) + + // int + i0 = 1 + i1 int = i0 + i2 = +1 + i3 = +i0 + i4 int = +1 + i5 int = +i4 + i6 = -1 + i7 = -i0 + i8 int = -1 + i9 int = -i4 + i10 = !i0 /* ERROR "not defined" */ + i11 = ^1 + i12 = ^i0 + i13 int = ^1 + i14 int = ^i4 + i15 = *i0 /* ERROR "cannot indirect" */ + i16 = &i0 + i17 = *i16 + i18 = <-i16 /* ERROR "cannot receive" */ + + // uint + u0 = uint(1) + u1 uint = u0 + u2 = +1 + u3 = +u0 + u4 uint = +1 + u5 uint = +u4 + u6 = -1 + u7 = -u0 + u8 uint = - /* ERROR "overflows" */ 1 + u9 uint = -u4 + u10 = !u0 /* ERROR "not defined" */ + u11 = ^1 + u12 = ^i0 + u13 uint = ^ /* ERROR "overflows" */ 1 + u14 uint = ^u4 + u15 = *u0 /* ERROR "cannot indirect" */ + u16 = &u0 + u17 = *u16 + u18 = <-u16 /* ERROR "cannot receive" */ + u19 = ^uint(0) + + // float64 + f0 = float64(1) + f1 float64 = f0 + f2 = +1 + f3 = +f0 + f4 float64 = +1 + f5 float64 = +f4 + f6 = -1 + f7 = -f0 + f8 float64 = -1 + f9 float64 = -f4 + f10 = !f0 /* ERROR "not defined" */ + f11 = ^1 + f12 = ^i0 + f13 float64 = ^1 + f14 float64 = ^f4 /* ERROR "not defined" */ + f15 = *f0 /* ERROR "cannot indirect" */ + f16 = &f0 + f17 = *u16 + f18 = <-u16 /* ERROR "cannot receive" */ + + // complex128 + c0 = complex128(1) + c1 complex128 = c0 + c2 = +1 + c3 = +c0 + c4 complex128 = +1 + c5 complex128 = +c4 + c6 = -1 + c7 = -c0 + c8 complex128 = -1 + c9 complex128 = -c4 + c10 = !c0 /* ERROR "not defined" */ + c11 = ^1 + c12 = ^i0 + c13 complex128 = ^1 + c14 complex128 = ^c4 /* ERROR "not defined" */ + c15 = *c0 /* ERROR "cannot indirect" */ + c16 = &c0 + c17 = *u16 + c18 = <-u16 /* ERROR "cannot receive" */ + + // string + s0 = "foo" + s1 = +"foo" /* ERROR "not defined" */ + s2 = -s0 /* ERROR "not defined" */ + s3 = !s0 /* ERROR "not defined" */ + s4 = ^s0 /* ERROR "not defined" */ + s5 = *s4 + s6 = &s4 + s7 = *s6 + s8 = <-s7 + + // channel + ch chan int + rc <-chan float64 + sc chan <- string + ch0 = +ch /* ERROR "not defined" */ + ch1 = -ch /* ERROR "not defined" */ + ch2 = !ch /* ERROR "not defined" */ + ch3 = ^ch /* ERROR "not defined" */ + ch4 = *ch /* ERROR "cannot indirect" */ + ch5 = &ch + ch6 = *ch5 + ch7 = <-ch + ch8 = <-rc + ch9 = <-sc /* ERROR "cannot receive" */ + ch10, ok = <-ch + // ok is of type bool + ch11, myok = <-ch + _ mybool = myok /* ERROR "cannot initialize" */ +) + +// address of composite literals +type T struct{x, y int} + +func f() T { return T{} } + +var ( + _ = &T{1, 2} + _ = &[...]int{} + _ = &[]int{} + _ = &[]int{} + _ = &map[string]T{} + _ = &(T{1, 2}) + _ = &((((T{1, 2})))) + _ = &f /* ERROR "cannot take address" */ () +) + +// recursive pointer types +type P *P + +var ( + p1 P = new(P) + p2 P = *p1 + p3 P = &p2 +) + diff --git a/vendor/golang.org/x/tools/go/types/testdata/expr1.src b/vendor/golang.org/x/tools/go/types/testdata/expr1.src new file mode 100644 index 0000000000..8ef0aed6d2 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/expr1.src @@ -0,0 +1,7 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// binary expressions + +package expr1 diff --git a/vendor/golang.org/x/tools/go/types/testdata/expr2.src b/vendor/golang.org/x/tools/go/types/testdata/expr2.src new file mode 100644 index 0000000000..31dc5f021c --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/expr2.src @@ -0,0 +1,247 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// comparisons + +package expr2 + +func _bool() { + const t = true == true + const f = true == false + _ = t /* ERROR "cannot compare" */ < f + _ = 0 /* ERROR "cannot convert" */ == t + var b bool + var x, y float32 + b = x < y + _ = b + _ = struct{b bool}{x < y} +} + +// corner cases +var ( + v0 = nil /* ERROR "cannot compare" */ == nil +) + +func arrays() { + // basics + var a, b [10]int + _ = a == b + _ = a != b + _ = a /* ERROR < not defined */ < b + _ = a == nil /* ERROR cannot convert */ + + type C [10]int + var c C + _ = a == c + + type D [10]int + var d D + _ = c /* ERROR mismatched types */ == d + + var e [10]func() int + _ = e /* ERROR == not defined */ == e +} + +func structs() { + // basics + var s, t struct { + x int + a [10]float32 + _ bool + } + _ = s == t + _ = s != t + _ = s /* ERROR < not defined */ < t + _ = s == nil /* ERROR cannot convert */ + + type S struct { + x int + a [10]float32 + _ bool + } + type T struct { + x int + a [10]float32 + _ bool + } + var ss S + var tt T + _ = s == ss + _ = ss /* ERROR mismatched types */ == tt + + var u struct { + x int + a [10]map[string]int + } + _ = u /* ERROR cannot compare */ == u +} + +func pointers() { + // nil + _ = nil /* ERROR == not defined */ == nil + _ = nil /* ERROR != not defined */ != nil + _ = nil /* ERROR < not defined */ < nil + _ = nil /* ERROR <= not defined */ <= nil + _ = nil /* ERROR > not defined */ > nil + _ = nil /* ERROR >= not defined */ >= nil + + // basics + var p, q *int + _ = p == q + _ = p != q + + _ = p == nil + _ = p != nil + _ = nil == q + _ = nil != q + + _ = p /* ERROR < not defined */ < q + _ = p /* ERROR <= not defined */ <= q + _ = p /* ERROR > not defined */ > q + _ = p /* ERROR >= not defined */ >= q + + // various element types + type ( + S1 struct{} + S2 struct{} + P1 *S1 + P2 *S2 + ) + var ( + ps1 *S1 + ps2 *S2 + p1 P1 + p2 P2 + ) + _ = ps1 == ps1 + _ = ps1 /* ERROR mismatched types */ == ps2 + _ = ps2 /* ERROR mismatched types */ == ps1 + + _ = p1 == p1 + _ = p1 /* ERROR mismatched types */ == p2 + + _ = p1 == ps1 +} + +func channels() { + // basics + var c, d chan int + _ = c == d + _ = c != d + _ = c == nil + _ = c /* ERROR < not defined */ < d + + // various element types (named types) + type ( + C1 chan int + C1r <-chan int + C1s chan<- int + C2 chan float32 + ) + var ( + c1 C1 + c1r C1r + c1s C1s + c1a chan int + c2 C2 + ) + _ = c1 == c1 + _ = c1 /* ERROR mismatched types */ == c1r + _ = c1 /* ERROR mismatched types */ == c1s + _ = c1r /* ERROR mismatched types */ == c1s + _ = c1 == c1a + _ = c1a == c1 + _ = c1 /* ERROR mismatched types */ == c2 + _ = c1a /* ERROR mismatched types */ == c2 + + // various element types (unnamed types) + var ( + d1 chan int + d1r <-chan int + d1s chan<- int + d1a chan<- int + d2 chan float32 + ) + _ = d1 == d1 + _ = d1 == d1r + _ = d1 == d1s + _ = d1r /* ERROR mismatched types */ == d1s + _ = d1 == d1a + _ = d1a == d1 + _ = d1 /* ERROR mismatched types */ == d2 + _ = d1a /* ERROR mismatched types */ == d2 +} + +// for interfaces test +type S1 struct{} +type S11 struct{} +type S2 struct{} +func (*S1) m() int +func (*S11) m() int +func (*S11) n() +func (*S2) m() float32 + +func interfaces() { + // basics + var i, j interface{ m() int } + _ = i == j + _ = i != j + _ = i == nil + _ = i /* ERROR < not defined */ < j + + // various interfaces + var ii interface { m() int; n() } + var k interface { m() float32 } + _ = i == ii + _ = i /* ERROR mismatched types */ == k + + // interfaces vs values + var s1 S1 + var s11 S11 + var s2 S2 + + _ = i == 0 /* ERROR cannot convert */ + _ = i /* ERROR mismatched types */ == s1 + _ = i == &s1 + _ = i == &s11 + + _ = i /* ERROR mismatched types */ == s2 + _ = i /* ERROR mismatched types */ == &s2 +} + +func slices() { + // basics + var s []int + _ = s == nil + _ = s != nil + _ = s /* ERROR < not defined */ < nil + + // slices are not otherwise comparable + _ = s /* ERROR == not defined */ == s + _ = s /* ERROR < not defined */ < s +} + +func maps() { + // basics + var m map[string]int + _ = m == nil + _ = m != nil + _ = m /* ERROR < not defined */ < nil + + // maps are not otherwise comparable + _ = m /* ERROR == not defined */ == m + _ = m /* ERROR < not defined */ < m +} + +func funcs() { + // basics + var f func(int) float32 + _ = f == nil + _ = f != nil + _ = f /* ERROR < not defined */ < nil + + // funcs are not otherwise comparable + _ = f /* ERROR == not defined */ == f + _ = f /* ERROR < not defined */ < f +} diff --git a/vendor/golang.org/x/tools/go/types/testdata/expr3.src b/vendor/golang.org/x/tools/go/types/testdata/expr3.src new file mode 100644 index 0000000000..57720954bd --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/expr3.src @@ -0,0 +1,534 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package expr3 + +import "time" + +func indexes() { + _ = 1 /* ERROR "cannot index" */ [0] + _ = indexes /* ERROR "cannot index" */ [0] + _ = ( /* ERROR "cannot slice" */ 12 + 3)[1:2] + + var a [10]int + _ = a[true /* ERROR "cannot convert" */ ] + _ = a["foo" /* ERROR "cannot convert" */ ] + _ = a[1.1 /* ERROR "truncated" */ ] + _ = a[1.0] + _ = a[- /* ERROR "negative" */ 1] + _ = a[- /* ERROR "negative" */ 1 :] + _ = a[: - /* ERROR "negative" */ 1] + _ = a[: /* ERROR "2nd index required" */ : /* ERROR "3rd index required" */ ] + _ = a[0: /* ERROR "2nd index required" */ : /* ERROR "3rd index required" */ ] + _ = a[0: /* ERROR "2nd index required" */ :10] + _ = a[:10:10] + + var a0 int + a0 = a[0] + _ = a0 + var a1 int32 + a1 = a /* ERROR "cannot assign" */ [1] + _ = a1 + + _ = a[9] + _ = a[10 /* ERROR "index .* out of bounds" */ ] + _ = a[1 /* ERROR "overflows" */ <<100] + _ = a[10:] + _ = a[:10] + _ = a[10:10] + _ = a[11 /* ERROR "index .* out of bounds" */ :] + _ = a[: 11 /* ERROR "index .* out of bounds" */ ] + _ = a[: 1 /* ERROR "overflows" */ <<100] + _ = a[:10:10] + _ = a[:11 /* ERROR "index .* out of bounds" */ :10] + _ = a[:10:11 /* ERROR "index .* out of bounds" */ ] + _ = a[10:0:10] /* ERROR "invalid slice indices" */ + _ = a[0:10:0] /* ERROR "invalid slice indices" */ + _ = a[10:0:0] /* ERROR "invalid slice indices" */ + _ = &a /* ERROR "cannot take address" */ [:10] + + pa := &a + _ = pa[9] + _ = pa[10 /* ERROR "index .* out of bounds" */ ] + _ = pa[1 /* ERROR "overflows" */ <<100] + _ = pa[10:] + _ = pa[:10] + _ = pa[10:10] + _ = pa[11 /* ERROR "index .* out of bounds" */ :] + _ = pa[: 11 /* ERROR "index .* out of bounds" */ ] + _ = pa[: 1 /* ERROR "overflows" */ <<100] + _ = pa[:10:10] + _ = pa[:11 /* ERROR "index .* out of bounds" */ :10] + _ = pa[:10:11 /* ERROR "index .* out of bounds" */ ] + _ = pa[10:0:10] /* ERROR "invalid slice indices" */ + _ = pa[0:10:0] /* ERROR "invalid slice indices" */ + _ = pa[10:0:0] /* ERROR "invalid slice indices" */ + _ = &pa /* ERROR "cannot take address" */ [:10] + + var b [0]int + _ = b[0 /* ERROR "index .* out of bounds" */ ] + _ = b[:] + _ = b[0:] + _ = b[:0] + _ = b[0:0] + _ = b[0:0:0] + _ = b[1 /* ERROR "index .* out of bounds" */ :0:0] + + var s []int + _ = s[- /* ERROR "negative" */ 1] + _ = s[- /* ERROR "negative" */ 1 :] + _ = s[: - /* ERROR "negative" */ 1] + _ = s[0] + _ = s[1:2] + _ = s[2:1] /* ERROR "invalid slice indices" */ + _ = s[2:] + _ = s[: 1 /* ERROR "overflows" */ <<100] + _ = s[1 /* ERROR "overflows" */ <<100 :] + _ = s[1 /* ERROR "overflows" */ <<100 : 1 /* ERROR "overflows" */ <<100] + _ = s[: /* ERROR "2nd index required" */ : /* ERROR "3rd index required" */ ] + _ = s[:10:10] + _ = s[10:0:10] /* ERROR "invalid slice indices" */ + _ = s[0:10:0] /* ERROR "invalid slice indices" */ + _ = s[10:0:0] /* ERROR "invalid slice indices" */ + _ = &s /* ERROR "cannot take address" */ [:10] + + var m map[string]int + _ = m[0 /* ERROR "cannot convert" */ ] + _ = m /* ERROR "cannot slice" */ ["foo" : "bar"] + _ = m["foo"] + // ok is of type bool + type mybool bool + var ok mybool + _, ok = m["bar"] + _ = ok + + var t string + _ = t[- /* ERROR "negative" */ 1] + _ = t[- /* ERROR "negative" */ 1 :] + _ = t[: - /* ERROR "negative" */ 1] + _ = t /* ERROR "3-index slice of string" */ [1:2:3] + _ = "foo" /* ERROR "3-index slice of string" */ [1:2:3] + var t0 byte + t0 = t[0] + _ = t0 + var t1 rune + t1 = t /* ERROR "cannot assign" */ [2] + _ = t1 + _ = ("foo" + "bar")[5] + _ = ("foo" + "bar")[6 /* ERROR "index .* out of bounds" */ ] + + const c = "foo" + _ = c[- /* ERROR "negative" */ 1] + _ = c[- /* ERROR "negative" */ 1 :] + _ = c[: - /* ERROR "negative" */ 1] + var c0 byte + c0 = c[0] + _ = c0 + var c2 float32 + c2 = c /* ERROR "cannot assign" */ [2] + _ = c[3 /* ERROR "index .* out of bounds" */ ] + _ = ""[0 /* ERROR "index .* out of bounds" */ ] + _ = c2 + + _ = s[1<<30] // no compile-time error here + + // issue 4913 + type mystring string + var ss string + var ms mystring + var i, j int + ss = "foo"[1:2] + ss = "foo"[i:j] + ms = "foo" /* ERROR "cannot assign" */ [1:2] + ms = "foo" /* ERROR "cannot assign" */ [i:j] + _, _ = ss, ms +} + +type T struct { + x int + y func() +} + +func (*T) m() {} + +func method_expressions() { + _ = T /* ERROR "no field or method" */ .a + _ = T /* ERROR "has no method" */ .x + _ = T /* ERROR "not in method set" */ .m + _ = (*T).m + + var f func(*T) = T /* ERROR "not in method set" */ .m + var g func(*T) = (*T).m + _, _ = f, g + + _ = T /* ERROR "has no method" */ .y + _ = ( /* ERROR "has no method" */ *T).y +} + +func struct_literals() { + type T0 struct { + a, b, c int + } + + type T1 struct { + T0 + a, b int + u float64 + s string + } + + // keyed elements + _ = T1{} + _ = T1{a: 0, 1 /* ERROR "mixture of .* elements" */ } + _ = T1{aa /* ERROR "unknown field" */ : 0} + _ = T1{1 /* ERROR "invalid field name" */ : 0} + _ = T1{a: 0, s: "foo", u: 0, a /* ERROR "duplicate field" */: 10} + _ = T1{a: "foo" /* ERROR "cannot convert" */ } + _ = T1{c /* ERROR "unknown field" */ : 0} + _ = T1{T0: { /* ERROR "missing type" */ }} // struct literal element type may not be elided + _ = T1{T0: T0{}} + _ = T1{T0 /* ERROR "invalid field name" */ .a: 0} + + // unkeyed elements + _ = T0{1, 2, 3} + _ = T0{1, b /* ERROR "mixture" */ : 2, 3} + _ = T0{1, 2} /* ERROR "too few values" */ + _ = T0{1, 2, 3, 4 /* ERROR "too many values" */ } + _ = T0{1, "foo" /* ERROR "cannot convert" */, 3.4 /* ERROR "truncated" */} + + // invalid type + type P *struct{ + x int + } + _ = P /* ERROR "invalid composite literal type" */ {} + + // unexported fields + _ = time.Time{} + _ = time.Time{sec /* ERROR "unknown field" */ : 0} + _ = time.Time{ + 0 /* ERROR implicit assignment to unexported field sec in time.Time literal */, + 0 /* ERROR implicit assignment */ , + nil /* ERROR implicit assignment */ , + } +} + +func array_literals() { + type A0 [0]int + _ = A0{} + _ = A0{0 /* ERROR "index .* out of bounds" */} + _ = A0{0 /* ERROR "index .* out of bounds" */ : 0} + + type A1 [10]int + _ = A1{} + _ = A1{0, 1, 2} + _ = A1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} + _ = A1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 /* ERROR "index .* out of bounds" */ } + _ = A1{- /* ERROR "negative" */ 1: 0} + _ = A1{8: 8, 9} + _ = A1{8: 8, 9, 10 /* ERROR "index .* out of bounds" */ } + _ = A1{0, 1, 2, 0 /* ERROR "duplicate index" */ : 0, 3: 3, 4} + _ = A1{5: 5, 6, 7, 3: 3, 4} + _ = A1{5: 5, 6, 7, 3: 3, 4, 5 /* ERROR "duplicate index" */ } + _ = A1{10 /* ERROR "index .* out of bounds" */ : 10, 10 /* ERROR "index .* out of bounds" */ : 10} + _ = A1{5: 5, 6, 7, 3: 3, 1 /* ERROR "overflows" */ <<100: 4, 5 /* ERROR "duplicate index" */ } + _ = A1{5: 5, 6, 7, 4: 4, 1 /* ERROR "overflows" */ <<100: 4} + _ = A1{2.0} + _ = A1{2.1 /* ERROR "truncated" */ } + _ = A1{"foo" /* ERROR "cannot convert" */ } + + // indices must be integer constants + i := 1 + const f = 2.1 + const s = "foo" + _ = A1{i /* ERROR "index i must be integer constant" */ : 0} + _ = A1{f /* ERROR "truncated" */ : 0} + _ = A1{s /* ERROR "cannot convert" */ : 0} + + a0 := [...]int{} + assert(len(a0) == 0) + + a1 := [...]int{0, 1, 2} + assert(len(a1) == 3) + var a13 [3]int + var a14 [4]int + a13 = a1 + a14 = a1 /* ERROR "cannot assign" */ + _, _ = a13, a14 + + a2 := [...]int{- /* ERROR "negative" */ 1: 0} + _ = a2 + + a3 := [...]int{0, 1, 2, 0 /* ERROR "duplicate index" */ : 0, 3: 3, 4} + assert(len(a3) == 5) // somewhat arbitrary + + a4 := [...]complex128{0, 1, 2, 1<<10-2: -1i, 1i, 400: 10, 12, 14} + assert(len(a4) == 1024) + + // composite literal element types may be elided + type T []int + _ = [10]T{T{}, {}, 5: T{1, 2, 3}, 7: {1, 2, 3}} + a6 := [...]T{T{}, {}, 5: T{1, 2, 3}, 7: {1, 2, 3}} + assert(len(a6) == 8) + + // recursively so + _ = [10][10]T{{}, [10]T{{}}, {{1, 2, 3}}} + + // from the spec + type Point struct { x, y float32 } + _ = [...]Point{Point{1.5, -3.5}, Point{0, 0}} + _ = [...]Point{{1.5, -3.5}, {0, 0}} + _ = [][]int{[]int{1, 2, 3}, []int{4, 5}} + _ = [][]int{{1, 2, 3}, {4, 5}} + _ = [...]*Point{&Point{1.5, -3.5}, &Point{0, 0}} + _ = [...]*Point{{1.5, -3.5}, {0, 0}} +} + +func slice_literals() { + type S0 []int + _ = S0{} + _ = S0{0, 1, 2} + _ = S0{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} + _ = S0{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} + _ = S0{- /* ERROR "negative" */ 1: 0} + _ = S0{8: 8, 9} + _ = S0{8: 8, 9, 10} + _ = S0{0, 1, 2, 0 /* ERROR "duplicate index" */ : 0, 3: 3, 4} + _ = S0{5: 5, 6, 7, 3: 3, 4} + _ = S0{5: 5, 6, 7, 3: 3, 4, 5 /* ERROR "duplicate index" */ } + _ = S0{10: 10, 10 /* ERROR "duplicate index" */ : 10} + _ = S0{5: 5, 6, 7, 3: 3, 1 /* ERROR "overflows" */ <<100: 4, 5 /* ERROR "duplicate index" */ } + _ = S0{5: 5, 6, 7, 4: 4, 1 /* ERROR "overflows" */ <<100: 4} + _ = S0{2.0} + _ = S0{2.1 /* ERROR "truncated" */ } + _ = S0{"foo" /* ERROR "cannot convert" */ } + + // indices must be resolved correctly + const index1 = 1 + _ = S0{index1: 1} + _ = S0{index2: 2} + _ = S0{index3 /* ERROR "undeclared name" */ : 3} + + // indices must be integer constants + i := 1 + const f = 2.1 + const s = "foo" + _ = S0{i /* ERROR "index i must be integer constant" */ : 0} + _ = S0{f /* ERROR "truncated" */ : 0} + _ = S0{s /* ERROR "cannot convert" */ : 0} + + // composite literal element types may be elided + type T []int + _ = []T{T{}, {}, 5: T{1, 2, 3}, 7: {1, 2, 3}} + _ = [][]int{{1, 2, 3}, {4, 5}} + + // recursively so + _ = [][]T{{}, []T{{}}, {{1, 2, 3}}} +} + +const index2 int = 2 + +type N int +func (N) f() {} + +func map_literals() { + type M0 map[string]int + type M1 map[bool]int + type M2 map[*int]int + + _ = M0{} + _ = M0{1 /* ERROR "missing key" */ } + _ = M0{1 /* ERROR "cannot convert" */ : 2} + _ = M0{"foo": "bar" /* ERROR "cannot convert" */ } + _ = M0{"foo": 1, "bar": 2, "foo" /* ERROR "duplicate key" */ : 3 } + + _ = map[interface{}]int{2: 1, 2 /* ERROR "duplicate key" */ : 1} + _ = map[interface{}]int{int(2): 1, int16(2): 1} + _ = map[interface{}]int{int16(2): 1, int16 /* ERROR "duplicate key" */ (2): 1} + + type S string + + _ = map[interface{}]int{"a": 1, "a" /* ERROR "duplicate key" */ : 1} + _ = map[interface{}]int{"a": 1, S("a"): 1} + _ = map[interface{}]int{S("a"): 1, S /* ERROR "duplicate key" */ ("a"): 1} + + type I interface { + f() + } + + _ = map[I]int{N(0): 1, N(2): 1} + _ = map[I]int{N(2): 1, N /* ERROR "duplicate key" */ (2): 1} + + // map keys must be resolved correctly + key1 := "foo" + _ = M0{key1: 1} + _ = M0{key2: 2} + _ = M0{key3 /* ERROR "undeclared name" */ : 2} + + var value int + _ = M1{true: 1, false: 0} + _ = M2{nil: 0, &value: 1} + + // composite literal element types may be elided + type T [2]int + _ = map[int]T{0: T{3, 4}, 1: {5, 6}} + + // recursively so + _ = map[int][]T{0: {}, 1: {{}, T{1, 2}}} + + // composite literal key types may be elided + _ = map[T]int{T{3, 4}: 0, {5, 6}: 1} + + // recursively so + _ = map[[2]T]int{{}: 0, {{}}: 1, [2]T{{}}: 2, {T{1, 2}}: 3} + + // composite literal element and key types may be elided + _ = map[T]T{{}: {}, {1, 2}: T{3, 4}, T{4, 5}: {}} + _ = map[T]M0{{} : {}, T{1, 2}: M0{"foo": 0}, {1, 3}: {"foo": 1}} + + // recursively so + _ = map[[2]T][]T{{}: {}, {{}}: {{}, T{1, 2}}, [2]T{{}}: nil, {T{1, 2}}: {{}, {}}} + + // from the spec + type Point struct { x, y float32 } + _ = map[string]Point{"orig": {0, 0}} + _ = map[*Point]string{{0, 0}: "orig"} +} + +var key2 string = "bar" + +type I interface { + m() +} + +type I2 interface { + m(int) +} + +type T1 struct{} +type T2 struct{} + +func (T2) m(int) {} + +type mybool bool + +func type_asserts() { + var x int + _ = x /* ERROR "not an interface" */ .(int) + + var e interface{} + var ok bool + x, ok = e.(int) + _ = ok + + // ok value is of type bool + var myok mybool + _, myok = e.(int) + _ = myok + + var t I + _ = t /* ERROR "use of .* outside type switch" */ .(type) + _ = t /* ERROR "missing method m" */ .(T) + _ = t.(*T) + _ = t /* ERROR "missing method m" */ .(T1) + _ = t /* ERROR "wrong type for method m" */ .(T2) + _ = t /* STRICT "wrong type for method m" */ .(I2) // only an error in strict mode (issue 8561) + + // e doesn't statically have an m, but may have one dynamically. + _ = e.(I2) +} + +func f0() {} +func f1(x int) {} +func f2(u float32, s string) {} +func fs(s []byte) {} +func fv(x ...int) {} +func fi(x ... interface{}) {} +func (T) fm(x ...int) + +func g0() {} +func g1() int { return 0} +func g2() (u float32, s string) { return } +func gs() []byte { return nil } + +func _calls() { + var x int + var y float32 + var s []int + + f0() + _ = f0 /* ERROR "used as value" */ () + f0(g0 /* ERROR "too many arguments" */ ) + + f1(0) + f1(x) + f1(10.0) + f1() /* ERROR "too few arguments" */ + f1(x, y /* ERROR "too many arguments" */ ) + f1(s /* ERROR "cannot pass" */ ) + f1(x ... /* ERROR "cannot use ..." */ ) + f1(g0 /* ERROR "used as value" */ ()) + f1(g1()) + // f1(g2()) // TODO(gri) missing position in error message + + f2() /* ERROR "too few arguments" */ + f2(3.14) /* ERROR "too few arguments" */ + f2(3.14, "foo") + f2(x /* ERROR "cannot pass" */ , "foo") + f2(g0 /* ERROR "used as value" */ ()) + f2(g1 /* ERROR "cannot pass" */ ()) /* ERROR "too few arguments" */ + f2(g2()) + + fs() /* ERROR "too few arguments" */ + fs(g0 /* ERROR "used as value" */ ()) + fs(g1 /* ERROR "cannot pass" */ ()) + fs(g2 /* ERROR "cannot pass" */ /* ERROR "too many arguments" */ ()) + fs(gs()) + + fv() + fv(1, 2.0, x) + fv(s /* ERROR "cannot pass" */ ) + fv(s...) + fv(x /* ERROR "cannot use" */ ...) + fv(1, s... /* ERROR "can only use ... with matching parameter" */ ) + fv(gs /* ERROR "cannot pass" */ ()) + fv(gs /* ERROR "cannot pass" */ ()...) + + var t T + t.fm() + t.fm(1, 2.0, x) + t.fm(s /* ERROR "cannot pass" */ ) + t.fm(g1()) + t.fm(1, s... /* ERROR "can only use ... with matching parameter" */ ) + t.fm(gs /* ERROR "cannot pass" */ ()) + t.fm(gs /* ERROR "cannot pass" */ ()...) + + T.fm(t, ) + T.fm(t, 1, 2.0, x) + T.fm(t, s /* ERROR "cannot pass" */ ) + T.fm(t, g1()) + T.fm(t, 1, s... /* ERROR "can only use ... with matching parameter" */ ) + T.fm(t, gs /* ERROR "cannot pass" */ ()) + T.fm(t, gs /* ERROR "cannot pass" */ ()...) + + var i interface{ fm(x ...int) } = t + i.fm() + i.fm(1, 2.0, x) + i.fm(s /* ERROR "cannot pass" */ ) + i.fm(g1()) + i.fm(1, s... /* ERROR "can only use ... with matching parameter" */ ) + i.fm(gs /* ERROR "cannot pass" */ ()) + i.fm(gs /* ERROR "cannot pass" */ ()...) + + fi() + fi(1, 2.0, x, 3.14, "foo") + fi(g2()) + fi(0, g2) + fi(0, g2 /* ERROR "2-valued expression" */ ()) +} + +func issue6344() { + type T []interface{} + var x T + fi(x...) // ... applies also to named slices +} diff --git a/vendor/golang.org/x/tools/go/types/testdata/gotos.src b/vendor/golang.org/x/tools/go/types/testdata/gotos.src new file mode 100644 index 0000000000..0c7ee44056 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/gotos.src @@ -0,0 +1,560 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file is a modified copy of $GOROOT/test/goto.go. + +package gotos + +var ( + i, n int + x []int + c chan int + m map[int]int + s string +) + +// goto after declaration okay +func _() { + x := 1 + goto L +L: + _ = x +} + +// goto before declaration okay +func _() { + goto L +L: + x := 1 + _ = x +} + +// goto across declaration not okay +func _() { + goto L /* ERROR "goto L jumps over variable declaration at line 36" */ + x := 1 + _ = x +L: +} + +// goto across declaration in inner scope okay +func _() { + goto L + { + x := 1 + _ = x + } +L: +} + +// goto across declaration after inner scope not okay +func _() { + goto L /* ERROR "goto L jumps over variable declaration at line 58" */ + { + x := 1 + _ = x + } + x := 1 + _ = x +L: +} + +// goto across declaration in reverse okay +func _() { +L: + x := 1 + _ = x + goto L +} + +func _() { +L: L1: + x := 1 + _ = x + goto L + goto L1 +} + +// error shows first offending variable +func _() { + goto L /* ERROR "goto L jumps over variable declaration at line 84" */ + x := 1 + _ = x + y := 1 + _ = y +L: +} + +// goto not okay even if code path is dead +func _() { + goto L /* ERROR "goto L jumps over variable declaration" */ + x := 1 + _ = x + y := 1 + _ = y + return +L: +} + +// goto into outer block okay +func _() { + { + goto L + } +L: +} + +func _() { + { + goto L + goto L1 + } +L: L1: +} + +// goto backward into outer block okay +func _() { +L: + { + goto L + } +} + +func _() { +L: L1: + { + goto L + goto L1 + } +} + +// goto into inner block not okay +func _() { + goto L /* ERROR "goto L jumps into block" */ + { + L: + } +} + +func _() { + goto L /* ERROR "goto L jumps into block" */ + goto L1 /* ERROR "goto L1 jumps into block" */ + { + L: L1: + } +} + +// goto backward into inner block still not okay +func _() { + { + L: + } + goto L /* ERROR "goto L jumps into block" */ +} + +func _() { + { + L: L1: + } + goto L /* ERROR "goto L jumps into block" */ + goto L1 /* ERROR "goto L1 jumps into block" */ +} + +// error shows first (outermost) offending block +func _() { + goto L /* ERROR "goto L jumps into block" */ + { + { + { + L: + } + } + } +} + +// error prefers block diagnostic over declaration diagnostic +func _() { + goto L /* ERROR "goto L jumps into block" */ + x := 1 + _ = x + { + L: + } +} + +// many kinds of blocks, all invalid to jump into or among, +// but valid to jump out of + +// if + +func _() { +L: + if true { + goto L + } +} + +func _() { +L: + if true { + goto L + } else { + } +} + +func _() { +L: + if false { + } else { + goto L + } +} + +func _() { + goto L /* ERROR "goto L jumps into block" */ + if true { + L: + } +} + +func _() { + goto L /* ERROR "goto L jumps into block" */ + if true { + L: + } else { + } +} + +func _() { + goto L /* ERROR "goto L jumps into block" */ + if true { + } else { + L: + } +} + +func _() { + if false { + L: + } else { + goto L /* ERROR "goto L jumps into block" */ + } +} + +func _() { + if true { + goto L /* ERROR "goto L jumps into block" */ + } else { + L: + } +} + +func _() { + if true { + goto L /* ERROR "goto L jumps into block" */ + } else if false { + L: + } +} + +func _() { + if true { + goto L /* ERROR "goto L jumps into block" */ + } else if false { + L: + } else { + } +} + +func _() { + if true { + goto L /* ERROR "goto L jumps into block" */ + } else if false { + } else { + L: + } +} + +func _() { + if true { + goto L /* ERROR "goto L jumps into block" */ + } else { + L: + } +} + +func _() { + if true { + L: + } else { + goto L /* ERROR "goto L jumps into block" */ + } +} + +// for + +func _() { + for { + goto L + } +L: +} + +func _() { + for { + goto L + L: + } +} + +func _() { + for { + L: + } + goto L /* ERROR "goto L jumps into block" */ +} + +func _() { + for { + goto L + L1: + } +L: + goto L1 /* ERROR "goto L1 jumps into block" */ +} + +func _() { + for i < n { + L: + } + goto L /* ERROR "goto L jumps into block" */ +} + +func _() { + for i = 0; i < n; i++ { + L: + } + goto L /* ERROR "goto L jumps into block" */ +} + +func _() { + for i = range x { + L: + } + goto L /* ERROR "goto L jumps into block" */ +} + +func _() { + for i = range c { + L: + } + goto L /* ERROR "goto L jumps into block" */ +} + +func _() { + for i = range m { + L: + } + goto L /* ERROR "goto L jumps into block" */ +} + +func _() { + for i = range s { + L: + } + goto L /* ERROR "goto L jumps into block" */ +} + +// switch + +func _() { +L: + switch i { + case 0: + goto L + } +} + +func _() { +L: + switch i { + case 0: + + default: + goto L + } +} + +func _() { + switch i { + case 0: + + default: + L: + goto L + } +} + +func _() { + switch i { + case 0: + + default: + goto L + L: + } +} + +func _() { + switch i { + case 0: + goto L + L: + ; + default: + } +} + +func _() { + goto L /* ERROR "goto L jumps into block" */ + switch i { + case 0: + L: + } +} + +func _() { + goto L /* ERROR "goto L jumps into block" */ + switch i { + case 0: + L: + ; + default: + } +} + +func _() { + goto L /* ERROR "goto L jumps into block" */ + switch i { + case 0: + default: + L: + } +} + +func _() { + switch i { + default: + goto L /* ERROR "goto L jumps into block" */ + case 0: + L: + } +} + +func _() { + switch i { + case 0: + L: + ; + default: + goto L /* ERROR "goto L jumps into block" */ + } +} + +// select +// different from switch. the statement has no implicit block around it. + +func _() { +L: + select { + case <-c: + goto L + } +} + +func _() { +L: + select { + case c <- 1: + + default: + goto L + } +} + +func _() { + select { + case <-c: + + default: + L: + goto L + } +} + +func _() { + select { + case c <- 1: + + default: + goto L + L: + } +} + +func _() { + select { + case <-c: + goto L + L: + ; + default: + } +} + +func _() { + goto L /* ERROR "goto L jumps into block" */ + select { + case c <- 1: + L: + } +} + +func _() { + goto L /* ERROR "goto L jumps into block" */ + select { + case c <- 1: + L: + ; + default: + } +} + +func _() { + goto L /* ERROR "goto L jumps into block" */ + select { + case <-c: + default: + L: + } +} + +func _() { + select { + default: + goto L /* ERROR "goto L jumps into block" */ + case <-c: + L: + } +} + +func _() { + select { + case <-c: + L: + ; + default: + goto L /* ERROR "goto L jumps into block" */ + } +} diff --git a/vendor/golang.org/x/tools/go/types/testdata/importdecl0a.src b/vendor/golang.org/x/tools/go/types/testdata/importdecl0a.src new file mode 100644 index 0000000000..463dcd083d --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/importdecl0a.src @@ -0,0 +1,53 @@ +// Copyright 2013 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 importdecl0 + +import () + +import ( + // we can have multiple blank imports (was bug) + _ "math" + _ "net/rpc" + init /* ERROR "cannot declare init" */ "fmt" + // reflect defines a type "flag" which shows up in the gc export data + "reflect" + . /* ERROR "imported but not used" */ "reflect" +) + +import "math" /* ERROR "imported but not used" */ +import m /* ERROR "imported but not used as m" */ "math" +import _ "math" + +import ( + "math/big" /* ERROR "imported but not used" */ + b /* ERROR "imported but not used" */ "math/big" + _ "math/big" +) + +import "fmt" +import f1 "fmt" +import f2 "fmt" + +// reflect.flag must not be visible in this package +type flag int +type _ reflect /* ERROR "not exported" */ .flag + +// imported package name may conflict with local objects +type reflect /* ERROR "reflect already declared" */ int + +// dot-imported exported objects may conflict with local objects +type Value /* ERROR "Value already declared through dot-import of package reflect" */ struct{} + +var _ = fmt.Println // use "fmt" + +func _() { + f1.Println() // use "fmt" +} + +func _() { + _ = func() { + f2.Println() // use "fmt" + } +} diff --git a/vendor/golang.org/x/tools/go/types/testdata/importdecl0b.src b/vendor/golang.org/x/tools/go/types/testdata/importdecl0b.src new file mode 100644 index 0000000000..6844e70982 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/importdecl0b.src @@ -0,0 +1,33 @@ +// Copyright 2013 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 importdecl0 + +import "math" +import m "math" + +import . "testing" // declares T in file scope +import . /* ERROR "imported but not used" */ "unsafe" +import . "fmt" // declares Println in file scope + +import ( + // TODO(gri) At the moment, 2 errors are reported because both go/parser + // and the type checker report it. Eventually, this test should not be + // done by the parser anymore. + "" /* ERROR invalid import path */ /* ERROR invalid import path */ + "a!b" /* ERROR invalid import path */ /* ERROR invalid import path */ + "abc\xffdef" /* ERROR invalid import path */ /* ERROR invalid import path */ +) + +// using "math" in this file doesn't affect its use in other files +const Pi0 = math.Pi +const Pi1 = m.Pi + +type _ T // use "testing" + +func _() func() interface{} { + return func() interface{} { + return Println // use "fmt" + } +} diff --git a/vendor/golang.org/x/tools/go/types/testdata/importdecl1a.src b/vendor/golang.org/x/tools/go/types/testdata/importdecl1a.src new file mode 100644 index 0000000000..8301820dda --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/importdecl1a.src @@ -0,0 +1,11 @@ +// 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. + +// Test case for issue 8969. + +package importdecl1 + +import . "unsafe" + +var _ Pointer // use dot-imported package unsafe diff --git a/vendor/golang.org/x/tools/go/types/testdata/importdecl1b.src b/vendor/golang.org/x/tools/go/types/testdata/importdecl1b.src new file mode 100644 index 0000000000..f24bb9ade9 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/importdecl1b.src @@ -0,0 +1,7 @@ +// 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 importdecl1 + +import . /* ERROR "imported but not used" */ "unsafe" diff --git a/vendor/golang.org/x/tools/go/types/testdata/init0.src b/vendor/golang.org/x/tools/go/types/testdata/init0.src new file mode 100644 index 0000000000..ef0349c70f --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/init0.src @@ -0,0 +1,106 @@ +// Copyright 2013 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. + +// initialization cycles + +package init0 + +// initialization cycles (we don't know the types) +const ( + s0 /* ERROR initialization cycle */ = s0 + + x0 /* ERROR initialization cycle */ = y0 + y0 = x0 + + a0 = b0 + b0 /* ERROR initialization cycle */ = c0 + c0 = d0 + d0 = b0 +) + +var ( + s1 /* ERROR initialization cycle */ = s1 + + x1 /* ERROR initialization cycle */ = y1 + y1 = x1 + + a1 = b1 + b1 /* ERROR initialization cycle */ = c1 + c1 = d1 + d1 = b1 +) + +// initialization cycles (we know the types) +const ( + s2 /* ERROR initialization cycle */ int = s2 + + x2 /* ERROR initialization cycle */ int = y2 + y2 = x2 + + a2 = b2 + b2 /* ERROR initialization cycle */ int = c2 + c2 = d2 + d2 = b2 +) + +var ( + s3 /* ERROR initialization cycle */ int = s3 + + x3 /* ERROR initialization cycle */ int = y3 + y3 = x3 + + a3 = b3 + b3 /* ERROR initialization cycle */ int = c3 + c3 = d3 + d3 = b3 +) + +// cycles via struct fields + +type S1 struct { + f int +} +const cx3 S1 /* ERROR invalid constant type */ = S1{cx3.f} +var vx3 /* ERROR initialization cycle */ S1 = S1{vx3.f} + +// cycles via functions + +var x4 = x5 +var x5 /* ERROR initialization cycle */ = f1() +func f1() int { return x5*10 } + +var x6, x7 /* ERROR initialization cycle */ = f2() +var x8 = x7 +func f2() (int, int) { return f3() + f3(), 0 } +func f3() int { return x8 } + +// cycles via closures + +var x9 /* ERROR initialization cycle */ = func() int { return x9 }() + +var x10 /* ERROR initialization cycle */ = f4() + +func f4() int { + _ = func() { + _ = x10 + } + return 0 +} + +// cycles via method expressions + +type T1 struct{} + +func (T1) m() bool { _ = x11; return false } + +var x11 /* ERROR initialization cycle */ = T1.m(T1{}) + +// cycles via method values + +type T2 struct{} + +func (T2) m() bool { _ = x12; return false } + +var t1 T2 +var x12 /* ERROR initialization cycle */ = t1.m diff --git a/vendor/golang.org/x/tools/go/types/testdata/init1.src b/vendor/golang.org/x/tools/go/types/testdata/init1.src new file mode 100644 index 0000000000..39ca31466b --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/init1.src @@ -0,0 +1,97 @@ +// Copyright 2013 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. + +// initialization cycles + +package init1 + +// issue 6683 (marked as WorkingAsIntended) + +type T0 struct{} + +func (T0) m() int { return y0 } + +var x0 = T0{} + +var y0 /* ERROR initialization cycle */ = x0.m() + +type T1 struct{} + +func (T1) m() int { return y1 } + +var x1 interface { + m() int +} = T1{} + +var y1 = x1.m() // no cycle reported, x1 is of interface type + +// issue 6703 (modified) + +var x2 /* ERROR initialization cycle */ = T2.m + +var y2 = x2 + +type T2 struct{} + +func (T2) m() int { + _ = y2 + return 0 +} + +var x3 /* ERROR initialization cycle */ = T3.m(T3{}) // <<<< added (T3{}) + +var y3 = x3 + +type T3 struct{} + +func (T3) m() int { + _ = y3 + return 0 +} + +var x4 /* ERROR initialization cycle */ = T4{}.m // <<<< added {} + +var y4 = x4 + +type T4 struct{} + +func (T4) m() int { + _ = y4 + return 0 +} + +var x5 /* ERROR initialization cycle */ = T5{}.m() // <<<< added () + +var y5 = x5 + +type T5 struct{} + +func (T5) m() int { + _ = y5 + return 0 +} + +// issue 4847 +// simplified test case + +var x6 = f6 +var y6 /* ERROR initialization cycle */ = f6 +func f6() { _ = y6 } + +// full test case + +type ( + E int + S int +) + +type matcher func(s *S) E + +func matchList(s *S) E { return matcher(matchAnyFn)(s) } + +var foo = matcher(matchList) + +var matchAny /* ERROR initialization cycle */ = matcher(matchList) + +func matchAnyFn(s *S) (err E) { return matchAny(s) } \ No newline at end of file diff --git a/vendor/golang.org/x/tools/go/types/testdata/init2.src b/vendor/golang.org/x/tools/go/types/testdata/init2.src new file mode 100644 index 0000000000..614db6c949 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/init2.src @@ -0,0 +1,139 @@ +// 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. + +// initialization cycles + +package init2 + +// cycles through functions + +func f1() int { _ = x1; return 0 } +var x1 /* ERROR initialization cycle */ = f1 + +func f2() int { _ = x2; return 0 } +var x2 /* ERROR initialization cycle */ = f2() + +// cycles through method expressions + +type T3 int +func (T3) m() int { _ = x3; return 0 } +var x3 /* ERROR initialization cycle */ = T3.m + +type T4 int +func (T4) m() int { _ = x4; return 0 } +var x4 /* ERROR initialization cycle */ = T4.m(0) + +type T3p int +func (*T3p) m() int { _ = x3p; return 0 } +var x3p /* ERROR initialization cycle */ = (*T3p).m + +type T4p int +func (*T4p) m() int { _ = x4p; return 0 } +var x4p /* ERROR initialization cycle */ = (*T4p).m(nil) + +// cycles through method expressions of embedded methods + +type T5 struct { E5 } +type E5 int +func (E5) m() int { _ = x5; return 0 } +var x5 /* ERROR initialization cycle */ = T5.m + +type T6 struct { E6 } +type E6 int +func (E6) m() int { _ = x6; return 0 } +var x6 /* ERROR initialization cycle */ = T6.m(T6{0}) + +type T5p struct { E5p } +type E5p int +func (*E5p) m() int { _ = x5p; return 0 } +var x5p /* ERROR initialization cycle */ = (*T5p).m + +type T6p struct { E6p } +type E6p int +func (*E6p) m() int { _ = x6p; return 0 } +var x6p /* ERROR initialization cycle */ = (*T6p).m(nil) + +// cycles through method values + +type T7 int +func (T7) m() int { _ = x7; return 0 } +var x7 /* ERROR initialization cycle */ = T7(0).m + +type T8 int +func (T8) m() int { _ = x8; return 0 } +var x8 /* ERROR initialization cycle */ = T8(0).m() + +type T7p int +func (*T7p) m() int { _ = x7p; return 0 } +var x7p /* ERROR initialization cycle */ = new(T7p).m + +type T8p int +func (*T8p) m() int { _ = x8p; return 0 } +var x8p /* ERROR initialization cycle */ = new(T8p).m() + +type T7v int +func (T7v) m() int { _ = x7v; return 0 } +var x7var T7v +var x7v /* ERROR initialization cycle */ = x7var.m + +type T8v int +func (T8v) m() int { _ = x8v; return 0 } +var x8var T8v +var x8v /* ERROR initialization cycle */ = x8var.m() + +type T7pv int +func (*T7pv) m() int { _ = x7pv; return 0 } +var x7pvar *T7pv +var x7pv /* ERROR initialization cycle */ = x7pvar.m + +type T8pv int +func (*T8pv) m() int { _ = x8pv; return 0 } +var x8pvar *T8pv +var x8pv /* ERROR initialization cycle */ = x8pvar.m() + +// cycles through method values of embedded methods + +type T9 struct { E9 } +type E9 int +func (E9) m() int { _ = x9; return 0 } +var x9 /* ERROR initialization cycle */ = T9{0}.m + +type T10 struct { E10 } +type E10 int +func (E10) m() int { _ = x10; return 0 } +var x10 /* ERROR initialization cycle */ = T10{0}.m() + +type T9p struct { E9p } +type E9p int +func (*E9p) m() int { _ = x9p; return 0 } +var x9p /* ERROR initialization cycle */ = new(T9p).m + +type T10p struct { E10p } +type E10p int +func (*E10p) m() int { _ = x10p; return 0 } +var x10p /* ERROR initialization cycle */ = new(T10p).m() + +type T9v struct { E9v } +type E9v int +func (E9v) m() int { _ = x9v; return 0 } +var x9var T9v +var x9v /* ERROR initialization cycle */ = x9var.m + +type T10v struct { E10v } +type E10v int +func (E10v) m() int { _ = x10v; return 0 } +var x10var T10v +var x10v /* ERROR initialization cycle */ = x10var.m() + +type T9pv struct { E9pv } +type E9pv int +func (*E9pv) m() int { _ = x9pv; return 0 } +var x9pvar *T9pv +var x9pv /* ERROR initialization cycle */ = x9pvar.m + +type T10pv struct { E10pv } +type E10pv int +func (*E10pv) m() int { _ = x10pv; return 0 } +var x10pvar *T10pv +var x10pv /* ERROR initialization cycle */ = x10pvar.m() diff --git a/vendor/golang.org/x/tools/go/types/testdata/issues.src b/vendor/golang.org/x/tools/go/types/testdata/issues.src new file mode 100644 index 0000000000..595a6342b7 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/issues.src @@ -0,0 +1,97 @@ +// 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 issues + +import "fmt" + +func issue7035() { + type T struct{ X int } + _ = func() { + fmt.Println() // must refer to imported fmt rather than the fmt below + } + fmt := new(T) + _ = fmt.X +} + +func issue8066() { + const ( + // TODO(gri) Enable test below for releases 1.4 and higher + // _ = float32(340282356779733661637539395458142568447) + _ = float32(340282356779733661637539395458142568448 /* ERROR cannot convert */ ) + ) +} + +// Check that a missing identifier doesn't lead to a spurious error cascade. +func issue8799a() { + x, ok := missing /* ERROR undeclared */ () + _ = !ok + _ = x +} + +func issue8799b(x int, ok bool) { + x, ok = missing /* ERROR undeclared */ () + _ = !ok + _ = x +} + +func issue9182() { + type Point C /* ERROR undeclared */ .Point + // no error for composite literal based on unknown type + _ = Point{x: 1, y: 2} +} + +func f0() (a []int) { return } +func f1() (a []int, b int) { return } +func f2() (a, b []int) { return } + +func append_([]int, ...int) {} + +func issue9473(a []int, b ...int) { + // variadic builtin function + _ = append(f0()) + _ = append(f0(), f0()...) + _ = append(f1()) + _ = append(f2 /* ERROR cannot pass argument */ ()) + _ = append(f2()... /* ERROR cannot use ... */ ) + _ = append(f0(), f1 /* ERROR 2-valued expression */ ()) + _ = append(f0(), f2 /* ERROR 2-valued expression */ ()) + _ = append(f0(), f1()... /* ERROR cannot use ... */ ) + _ = append(f0(), f2()... /* ERROR cannot use ... */ ) + + // variadic user-defined function + append_(f0()) + append_(f0(), f0()...) + append_(f1()) + append_(f2 /* ERROR cannot pass argument */ ()) + append_(f2()... /* ERROR cannot use ... */ ) + append_(f0(), f1 /* ERROR 2-valued expression */ ()) + append_(f0(), f2 /* ERROR 2-valued expression */ ()) + append_(f0(), f1()... /* ERROR cannot use */ ) + append_(f0(), f2()... /* ERROR cannot use */ ) +} + +// Check that embedding a non-interface type in an interface results in a good error message. +func issue10979() { + type _ interface { + int /* ERROR int is not an interface */ + } + type T struct{} + type _ interface { + T /* ERROR T is not an interface */ + } + type _ interface { + nosuchtype /* ERROR undeclared name: nosuchtype */ + } + type _ interface { + fmt /* ERROR Nosuchtype not declared by package fmt */ .Nosuchtype + } + type _ interface { + nosuchpkg /* ERROR undeclared name: nosuchpkg */ .Nosuchtype + } + type I interface { + I /* ERROR I\.m \(value of type func\(I\)\) is not a type */ .m + m() + } +} diff --git a/vendor/golang.org/x/tools/go/types/testdata/labels.src b/vendor/golang.org/x/tools/go/types/testdata/labels.src new file mode 100644 index 0000000000..102ffc7c17 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/labels.src @@ -0,0 +1,207 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file is a modified concatenation of the files +// $GOROOT/test/label.go and $GOROOT/test/label1.go. + +package labels + +var x int + +func f0() { +L1 /* ERROR "label L1 declared but not used" */ : + for { + } +L2 /* ERROR "label L2 declared but not used" */ : + select { + } +L3 /* ERROR "label L3 declared but not used" */ : + switch { + } +L4 /* ERROR "label L4 declared but not used" */ : + if true { + } +L5 /* ERROR "label L5 declared but not used" */ : + f0() +L6: + f0() +L6 /* ERROR "label L6 already declared" */ : + f0() + if x == 20 { + goto L6 + } + +L7: + for { + break L7 + break L8 /* ERROR "invalid break label L8" */ + } + +// A label must be directly associated with a switch, select, or +// for statement; it cannot be the label of a labeled statement. + +L7a /* ERROR "declared but not used" */ : L7b: + for { + break L7a /* ERROR "invalid break label L7a" */ + continue L7a /* ERROR "invalid continue label L7a" */ + continue L7b + } + +L8: + for { + if x == 21 { + continue L8 + continue L7 /* ERROR "invalid continue label L7" */ + } + } + +L9: + switch { + case true: + break L9 + defalt /* ERROR "label defalt declared but not used" */ : + } + +L10: + select { + default: + break L10 + break L9 /* ERROR "invalid break label L9" */ + } + + goto L10a +L10a: L10b: + select { + default: + break L10a /* ERROR "invalid break label L10a" */ + break L10b + continue L10b /* ERROR "invalid continue label L10b" */ + } +} + +func f1() { +L1: + for { + if x == 0 { + break L1 + } + if x == 1 { + continue L1 + } + goto L1 + } + +L2: + select { + default: + if x == 0 { + break L2 + } + if x == 1 { + continue L2 /* ERROR "invalid continue label L2" */ + } + goto L2 + } + +L3: + switch { + case x > 10: + if x == 11 { + break L3 + } + if x == 12 { + continue L3 /* ERROR "invalid continue label L3" */ + } + goto L3 + } + +L4: + if true { + if x == 13 { + break L4 /* ERROR "invalid break label L4" */ + } + if x == 14 { + continue L4 /* ERROR "invalid continue label L4" */ + } + if x == 15 { + goto L4 + } + } + +L5: + f1() + if x == 16 { + break L5 /* ERROR "invalid break label L5" */ + } + if x == 17 { + continue L5 /* ERROR "invalid continue label L5" */ + } + if x == 18 { + goto L5 + } + + for { + if x == 19 { + break L1 /* ERROR "invalid break label L1" */ + } + if x == 20 { + continue L1 /* ERROR "invalid continue label L1" */ + } + if x == 21 { + goto L1 + } + } +} + +// Additional tests not in the original files. + +func f2() { +L1 /* ERROR "label L1 declared but not used" */ : + if x == 0 { + for { + continue L1 /* ERROR "invalid continue label L1" */ + } + } +} + +func f3() { +L1: +L2: +L3: + for { + break L1 /* ERROR "invalid break label L1" */ + break L2 /* ERROR "invalid break label L2" */ + break L3 + continue L1 /* ERROR "invalid continue label L1" */ + continue L2 /* ERROR "invalid continue label L2" */ + continue L3 + goto L1 + goto L2 + goto L3 + } +} + +// Blank labels are never declared. + +func f4() { +_: +_: // multiple blank labels are ok + goto _ /* ERROR "label _ not declared" */ +} + +func f5() { +_: + for { + break _ /* ERROR "invalid break label _" */ + continue _ /* ERROR "invalid continue label _" */ + } +} + +func f6() { +_: + switch { + default: + break _ /* ERROR "invalid break label _" */ + } +} diff --git a/vendor/golang.org/x/tools/go/types/testdata/methodsets.src b/vendor/golang.org/x/tools/go/types/testdata/methodsets.src new file mode 100644 index 0000000000..89211468ea --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/methodsets.src @@ -0,0 +1,214 @@ +// Copyright 2013 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 methodsets + +type T0 struct {} + +func (T0) v0() {} +func (*T0) p0() {} + +type T1 struct {} // like T0 with different method names + +func (T1) v1() {} +func (*T1) p1() {} + +type T2 interface { + v2() + p2() +} + +type T3 struct { + T0 + *T1 + T2 +} + +// Method expressions +func _() { + var ( + _ func(T0) = T0.v0 + _ = T0 /* ERROR "not in method set" */ .p0 + + _ func (*T0) = (*T0).v0 + _ func (*T0) = (*T0).p0 + + // T1 is like T0 + + _ func(T2) = T2.v2 + _ func(T2) = T2.p2 + + _ func(T3) = T3.v0 + _ func(T3) = T3 /* ERROR "not in method set" */ .p0 + _ func(T3) = T3.v1 + _ func(T3) = T3.p1 + _ func(T3) = T3.v2 + _ func(T3) = T3.p2 + + _ func(*T3) = (*T3).v0 + _ func(*T3) = (*T3).p0 + _ func(*T3) = (*T3).v1 + _ func(*T3) = (*T3).p1 + _ func(*T3) = (*T3).v2 + _ func(*T3) = (*T3).p2 + ) +} + +// Method values with addressable receivers +func _() { + var ( + v0 T0 + _ func() = v0.v0 + _ func() = v0.p0 + ) + + var ( + p0 *T0 + _ func() = p0.v0 + _ func() = p0.p0 + ) + + // T1 is like T0 + + var ( + v2 T2 + _ func() = v2.v2 + _ func() = v2.p2 + ) + + var ( + v4 T3 + _ func() = v4.v0 + _ func() = v4.p0 + _ func() = v4.v1 + _ func() = v4.p1 + _ func() = v4.v2 + _ func() = v4.p2 + ) + + var ( + p4 *T3 + _ func() = p4.v0 + _ func() = p4.p0 + _ func() = p4.v1 + _ func() = p4.p1 + _ func() = p4.v2 + _ func() = p4.p2 + ) +} + +// Method calls with addressable receivers +func _() { + var v0 T0 + v0.v0() + v0.p0() + + var p0 *T0 + p0.v0() + p0.p0() + + // T1 is like T0 + + var v2 T2 + v2.v2() + v2.p2() + + var v4 T3 + v4.v0() + v4.p0() + v4.v1() + v4.p1() + v4.v2() + v4.p2() + + var p4 *T3 + p4.v0() + p4.p0() + p4.v1() + p4.p1() + p4.v2() + p4.p2() +} + +// Method values with value receivers +func _() { + var ( + _ func() = T0{}.v0 + _ func() = T0 /* ERROR "not in method set" */ {}.p0 + + _ func() = (&T0{}).v0 + _ func() = (&T0{}).p0 + + // T1 is like T0 + + // no values for T2 + + _ func() = T3{}.v0 + _ func() = T3 /* ERROR "not in method set" */ {}.p0 + _ func() = T3{}.v1 + _ func() = T3{}.p1 + _ func() = T3{}.v2 + _ func() = T3{}.p2 + + _ func() = (&T3{}).v0 + _ func() = (&T3{}).p0 + _ func() = (&T3{}).v1 + _ func() = (&T3{}).p1 + _ func() = (&T3{}).v2 + _ func() = (&T3{}).p2 + ) +} + +// Method calls with value receivers +func _() { + T0{}.v0() + T0 /* ERROR "not in method set" */ {}.p0() + + (&T0{}).v0() + (&T0{}).p0() + + // T1 is like T0 + + // no values for T2 + + T3{}.v0() + T3 /* ERROR "not in method set" */ {}.p0() + T3{}.v1() + T3{}.p1() + T3{}.v2() + T3{}.p2() + + (&T3{}).v0() + (&T3{}).p0() + (&T3{}).v1() + (&T3{}).p1() + (&T3{}).v2() + (&T3{}).p2() +} + +// *T has no methods if T is an interface type +func issue5918() { + var ( + err error + _ = err.Error() + _ func() string = err.Error + _ func(error) string = error.Error + + perr = &err + _ = perr /* ERROR "no field or method" */ .Error() + _ func() string = perr /* ERROR "no field or method" */ .Error + _ func(*error) string = ( /* ERROR "no field or method" */ *error).Error + ) + + type T *interface{ m() int } + var ( + x T + _ = (*x).m() + _ = (*x).m + + _ = x /* ERROR "no field or method" */ .m() + _ = x /* ERROR "no field or method" */ .m + _ = T /* ERROR "no field or method" */ .m + ) +} diff --git a/vendor/golang.org/x/tools/go/types/testdata/shifts.src b/vendor/golang.org/x/tools/go/types/testdata/shifts.src new file mode 100644 index 0000000000..fa4de9e899 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/shifts.src @@ -0,0 +1,341 @@ +// Copyright 2013 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 shifts + +func shifts0() { + // basic constant shifts + const ( + s = 10 + _ = 0<<0 + _ = 1<> s) + _, _, _ = u, v, x +} + +func shifts4() { + // shifts in comparisons w/ untyped operands + var s uint + + _ = 1<> 1.1 /* ERROR "must be unsigned integer" */ // example from issue 11325 + _ = 0 >> 1.1 /* ERROR "must be unsigned integer" */ + _ = 0 << 1.1 /* ERROR "must be unsigned integer" */ + _ = 0 >> 1. + _ = 1 >> 1.1 /* ERROR "must be unsigned integer" */ + _ = 1 >> 1. + _ = 1. >> 1 + _ = 1. >> 1. + _ = 1.1 /* ERROR "must be integer" */ >> 1 +} + +func issue11594() { + var _ = complex64 /* ERROR "must be integer" */ (1) << 2 // example from issue 11594 + _ = float32 /* ERROR "must be integer" */ (0) << 1 + _ = float64 /* ERROR "must be integer" */ (0) >> 2 + _ = complex64 /* ERROR "must be integer" */ (0) << 3 + _ = complex64 /* ERROR "must be integer" */ (0) >> 4 +} diff --git a/vendor/golang.org/x/tools/go/types/testdata/stmt0.src b/vendor/golang.org/x/tools/go/types/testdata/stmt0.src new file mode 100644 index 0000000000..fd1ddba2ec --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/testdata/stmt0.src @@ -0,0 +1,833 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// statements + +package stmt0 + +func assignments0() (int, int) { + var a, b, c int + var ch chan int + f0 := func() {} + f1 := func() int { return 1 } + f2 := func() (int, int) { return 1, 2 } + f3 := func() (int, int, int) { return 1, 2, 3 } + + a, b, c = 1, 2, 3 + a, b, c = 1 /* ERROR "assignment count mismatch" */ , 2 + a, b, c = 1 /* ERROR "assignment count mismatch" */ , 2, 3, 4 + _, _, _ = a, b, c + + a = f0 /* ERROR "used as value" */ () + a = f1() + a = f2 /* ERROR "assignment count mismatch" */ () + a, b = f2() + a, b, c = f2 /* ERROR "assignment count mismatch" */ () + a, b, c = f3() + a, b = f3 /* ERROR "assignment count mismatch" */ () + + a, b, c = <- /* ERROR "assignment count mismatch" */ ch + + return /* ERROR "wrong number of return values" */ + return /* ERROR "wrong number of return values" */ 1 + return 1, 2 + return /* ERROR "wrong number of return values" */ 1, 2, 3 +} + +func assignments1() { + b, i, f, c, s := false, 1, 1.0, 1i, "foo" + b = i /* ERROR "cannot assign" */ + i = f /* ERROR "cannot assign" */ + f = c /* ERROR "cannot assign" */ + c = s /* ERROR "cannot assign" */ + s = b /* ERROR "cannot assign" */ + + v0, v1, v2 := 1 /* ERROR "mismatch" */ , 2, 3, 4 + _, _, _ = v0, v1, v2 + + b = true + + i += 1 + i += "foo" /* ERROR "cannot convert.*int" */ + + f -= 1 + f /= 0 + f = float32(0)/0 /* ERROR "division by zero" */ + f -= "foo" /* ERROR "cannot convert.*float64" */ + + c *= 1 + c /= 0 + + s += "bar" + s += 1 /* ERROR "cannot convert.*string" */ + + var u64 uint64 + u64 += 1< len(fields) { + panic("more tags than fields") + } + return &Struct{fields: fields, tags: tags} +} + +// NumFields returns the number of fields in the struct (including blank and anonymous fields). +func (s *Struct) NumFields() int { return len(s.fields) } + +// Field returns the i'th field for 0 <= i < NumFields(). +func (s *Struct) Field(i int) *Var { return s.fields[i] } + +// Tag returns the i'th field tag for 0 <= i < NumFields(). +func (s *Struct) Tag(i int) string { + if i < len(s.tags) { + return s.tags[i] + } + return "" +} + +// A Pointer represents a pointer type. +type Pointer struct { + base Type // element type +} + +// NewPointer returns a new pointer type for the given element (base) type. +func NewPointer(elem Type) *Pointer { return &Pointer{base: elem} } + +// Elem returns the element type for the given pointer p. +func (p *Pointer) Elem() Type { return p.base } + +// A Tuple represents an ordered list of variables; a nil *Tuple is a valid (empty) tuple. +// Tuples are used as components of signatures and to represent the type of multiple +// assignments; they are not first class types of Go. +type Tuple struct { + vars []*Var +} + +// NewTuple returns a new tuple for the given variables. +func NewTuple(x ...*Var) *Tuple { + if len(x) > 0 { + return &Tuple{x} + } + return nil +} + +// Len returns the number variables of tuple t. +func (t *Tuple) Len() int { + if t != nil { + return len(t.vars) + } + return 0 +} + +// At returns the i'th variable of tuple t. +func (t *Tuple) At(i int) *Var { return t.vars[i] } + +// A Signature represents a (non-builtin) function or method type. +type Signature struct { + // We need to keep the scope in Signature (rather than passing it around + // and store it in the Func Object) because when type-checking a function + // literal we call the general type checker which returns a general Type. + // We then unpack the *Signature and use the scope for the literal body. + scope *Scope // function scope, present for package-local signatures + recv *Var // nil if not a method + params *Tuple // (incoming) parameters from left to right; or nil + results *Tuple // (outgoing) results from left to right; or nil + variadic bool // true if the last parameter's type is of the form ...T (or string, for append built-in only) +} + +// NewSignature returns a new function type for the given receiver, parameters, +// and results, either of which may be nil. If variadic is set, the function +// is variadic, it must have at least one parameter, and the last parameter +// must be of unnamed slice type. +func NewSignature(recv *Var, params, results *Tuple, variadic bool) *Signature { + if variadic { + n := params.Len() + if n == 0 { + panic("types.NewSignature: variadic function must have at least one parameter") + } + if _, ok := params.At(n - 1).typ.(*Slice); !ok { + panic("types.NewSignature: variadic parameter must be of unnamed slice type") + } + } + return &Signature{nil, recv, params, results, variadic} +} + +// Recv returns the receiver of signature s (if a method), or nil if a +// function. +// +// For an abstract method, Recv returns the enclosing interface either +// as a *Named or an *Interface. Due to embedding, an interface may +// contain methods whose receiver type is a different interface. +func (s *Signature) Recv() *Var { return s.recv } + +// Params returns the parameters of signature s, or nil. +func (s *Signature) Params() *Tuple { return s.params } + +// Results returns the results of signature s, or nil. +func (s *Signature) Results() *Tuple { return s.results } + +// Variadic reports whether the signature s is variadic. +func (s *Signature) Variadic() bool { return s.variadic } + +// An Interface represents an interface type. +type Interface struct { + methods []*Func // ordered list of explicitly declared methods + embeddeds []*Named // ordered list of explicitly embedded types + + allMethods []*Func // ordered list of methods declared with or embedded in this interface (TODO(gri): replace with mset) +} + +// NewInterface returns a new interface for the given methods and embedded types. +func NewInterface(methods []*Func, embeddeds []*Named) *Interface { + typ := new(Interface) + + var mset objset + for _, m := range methods { + if mset.insert(m) != nil { + panic("multiple methods with the same name") + } + // set receiver + // TODO(gri) Ideally, we should use a named type here instead of + // typ, for less verbose printing of interface method signatures. + m.typ.(*Signature).recv = NewVar(m.pos, m.pkg, "", typ) + } + sort.Sort(byUniqueMethodName(methods)) + + if embeddeds == nil { + sort.Sort(byUniqueTypeName(embeddeds)) + } + + typ.methods = methods + typ.embeddeds = embeddeds + return typ +} + +// NumExplicitMethods returns the number of explicitly declared methods of interface t. +func (t *Interface) NumExplicitMethods() int { return len(t.methods) } + +// ExplicitMethod returns the i'th explicitly declared method of interface t for 0 <= i < t.NumExplicitMethods(). +// The methods are ordered by their unique Id. +func (t *Interface) ExplicitMethod(i int) *Func { return t.methods[i] } + +// NumEmbeddeds returns the number of embedded types in interface t. +func (t *Interface) NumEmbeddeds() int { return len(t.embeddeds) } + +// Embedded returns the i'th embedded type of interface t for 0 <= i < t.NumEmbeddeds(). +// The types are ordered by the corresponding TypeName's unique Id. +func (t *Interface) Embedded(i int) *Named { return t.embeddeds[i] } + +// NumMethods returns the total number of methods of interface t. +func (t *Interface) NumMethods() int { return len(t.allMethods) } + +// Method returns the i'th method of interface t for 0 <= i < t.NumMethods(). +// The methods are ordered by their unique Id. +func (t *Interface) Method(i int) *Func { return t.allMethods[i] } + +// Empty returns true if t is the empty interface. +func (t *Interface) Empty() bool { return len(t.allMethods) == 0 } + +// Complete computes the interface's method set. It must be called by users of +// NewInterface after the interface's embedded types are fully defined and +// before using the interface type in any way other than to form other types. +// Complete returns the receiver. +func (t *Interface) Complete() *Interface { + if t.allMethods != nil { + return t + } + + var allMethods []*Func + if t.embeddeds == nil { + if t.methods == nil { + allMethods = make([]*Func, 0, 1) + } else { + allMethods = t.methods + } + } else { + allMethods = append(allMethods, t.methods...) + for _, et := range t.embeddeds { + it := et.Underlying().(*Interface) + it.Complete() + for _, tm := range it.allMethods { + // Make a copy of the method and adjust its receiver type. + newm := *tm + newmtyp := *tm.typ.(*Signature) + newm.typ = &newmtyp + newmtyp.recv = NewVar(newm.pos, newm.pkg, "", t) + allMethods = append(allMethods, &newm) + } + } + sort.Sort(byUniqueMethodName(allMethods)) + } + t.allMethods = allMethods + + return t +} + +// A Map represents a map type. +type Map struct { + key, elem Type +} + +// NewMap returns a new map for the given key and element types. +func NewMap(key, elem Type) *Map { + return &Map{key, elem} +} + +// Key returns the key type of map m. +func (m *Map) Key() Type { return m.key } + +// Elem returns the element type of map m. +func (m *Map) Elem() Type { return m.elem } + +// A Chan represents a channel type. +type Chan struct { + dir ChanDir + elem Type +} + +// A ChanDir value indicates a channel direction. +type ChanDir int + +// The direction of a channel is indicated by one of the following constants. +const ( + SendRecv ChanDir = iota + SendOnly + RecvOnly +) + +// NewChan returns a new channel type for the given direction and element type. +func NewChan(dir ChanDir, elem Type) *Chan { + return &Chan{dir, elem} +} + +// Dir returns the direction of channel c. +func (c *Chan) Dir() ChanDir { return c.dir } + +// Elem returns the element type of channel c. +func (c *Chan) Elem() Type { return c.elem } + +// A Named represents a named type. +type Named struct { + obj *TypeName // corresponding declared object + underlying Type // possibly a *Named during setup; never a *Named once set up completely + methods []*Func // methods declared for this type (not the method set of this type) +} + +// NewNamed returns a new named type for the given type name, underlying type, and associated methods. +// The underlying type must not be a *Named. +func NewNamed(obj *TypeName, underlying Type, methods []*Func) *Named { + if _, ok := underlying.(*Named); ok { + panic("types.NewNamed: underlying type must not be *Named") + } + typ := &Named{obj: obj, underlying: underlying, methods: methods} + if obj.typ == nil { + obj.typ = typ + } + return typ +} + +// Obj returns the type name for the named type t. +func (t *Named) Obj() *TypeName { return t.obj } + +// NumMethods returns the number of explicit methods whose receiver is named type t. +func (t *Named) NumMethods() int { return len(t.methods) } + +// Method returns the i'th method of named type t for 0 <= i < t.NumMethods(). +func (t *Named) Method(i int) *Func { return t.methods[i] } + +// SetUnderlying sets the underlying type and marks t as complete. +// TODO(gri) determine if there's a better solution rather than providing this function +func (t *Named) SetUnderlying(underlying Type) { + if underlying == nil { + panic("types.Named.SetUnderlying: underlying type must not be nil") + } + if _, ok := underlying.(*Named); ok { + panic("types.Named.SetUnderlying: underlying type must not be *Named") + } + t.underlying = underlying +} + +// AddMethod adds method m unless it is already in the method list. +// TODO(gri) find a better solution instead of providing this function +func (t *Named) AddMethod(m *Func) { + if i, _ := lookupMethod(t.methods, m.pkg, m.name); i < 0 { + t.methods = append(t.methods, m) + } +} + +// Implementations for Type methods. + +func (t *Basic) Underlying() Type { return t } +func (t *Array) Underlying() Type { return t } +func (t *Slice) Underlying() Type { return t } +func (t *Struct) Underlying() Type { return t } +func (t *Pointer) Underlying() Type { return t } +func (t *Tuple) Underlying() Type { return t } +func (t *Signature) Underlying() Type { return t } +func (t *Interface) Underlying() Type { return t } +func (t *Map) Underlying() Type { return t } +func (t *Chan) Underlying() Type { return t } +func (t *Named) Underlying() Type { return t.underlying } + +func (t *Basic) String() string { return TypeString(t, nil) } +func (t *Array) String() string { return TypeString(t, nil) } +func (t *Slice) String() string { return TypeString(t, nil) } +func (t *Struct) String() string { return TypeString(t, nil) } +func (t *Pointer) String() string { return TypeString(t, nil) } +func (t *Tuple) String() string { return TypeString(t, nil) } +func (t *Signature) String() string { return TypeString(t, nil) } +func (t *Interface) String() string { return TypeString(t, nil) } +func (t *Map) String() string { return TypeString(t, nil) } +func (t *Chan) String() string { return TypeString(t, nil) } +func (t *Named) String() string { return TypeString(t, nil) } diff --git a/vendor/golang.org/x/tools/go/types/typestring.go b/vendor/golang.org/x/tools/go/types/typestring.go new file mode 100644 index 0000000000..abee8abb56 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typestring.go @@ -0,0 +1,292 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements printing of types. + +package types + +import ( + "bytes" + "fmt" +) + +// A Qualifier controls how named package-level objects are printed in +// calls to TypeString, ObjectString, and SelectionString. +// +// These three formatting routines call the Qualifier for each +// package-level object O, and if the Qualifier returns a non-empty +// string p, the object is printed in the form p.O. +// If it returns an empty string, only the object name O is printed. +// +// Using a nil Qualifier is equivalent to using (*Package).Path: the +// object is qualified by the import path, e.g., "encoding/json.Marshal". +// +type Qualifier func(*Package) string + +// RelativeTo(pkg) returns a Qualifier that fully qualifies members of +// all packages other than pkg. +func RelativeTo(pkg *Package) Qualifier { + if pkg == nil { + return nil + } + return func(other *Package) string { + if pkg == other { + return "" // same package; unqualified + } + return other.Path() + } +} + +// If GcCompatibilityMode is set, printing of types is modified +// to match the representation of some types in the gc compiler: +// +// - byte and rune lose their alias name and simply stand for +// uint8 and int32 respectively +// - embedded interfaces get flattened (the embedding info is lost, +// and certain recursive interface types cannot be printed anymore) +// +// This makes it easier to compare packages computed with the type- +// checker vs packages imported from gc export data. +// +// Caution: This flag affects all uses of WriteType, globally. +// It is only provided for testing in conjunction with +// gc-generated data. It may be removed at any time. +var GcCompatibilityMode bool + +// TypeString returns the string representation of typ. +// The Qualifier controls the printing of +// package-level objects, and may be nil. +func TypeString(typ Type, qf Qualifier) string { + var buf bytes.Buffer + WriteType(&buf, typ, qf) + return buf.String() +} + +// WriteType writes the string representation of typ to buf. +// The Qualifier controls the printing of +// package-level objects, and may be nil. +func WriteType(buf *bytes.Buffer, typ Type, qf Qualifier) { + writeType(buf, typ, qf, make([]Type, 8)) +} + +func writeType(buf *bytes.Buffer, typ Type, qf Qualifier, visited []Type) { + // Theoretically, this is a quadratic lookup algorithm, but in + // practice deeply nested composite types with unnamed component + // types are uncommon. This code is likely more efficient than + // using a map. + for _, t := range visited { + if t == typ { + fmt.Fprintf(buf, "○%T", typ) // cycle to typ + return + } + } + visited = append(visited, typ) + + switch t := typ.(type) { + case nil: + buf.WriteString("") + + case *Basic: + if t.kind == UnsafePointer { + buf.WriteString("unsafe.") + } + if GcCompatibilityMode { + // forget the alias names + switch t.kind { + case Byte: + t = Typ[Uint8] + case Rune: + t = Typ[Int32] + } + } + buf.WriteString(t.name) + + case *Array: + fmt.Fprintf(buf, "[%d]", t.len) + writeType(buf, t.elem, qf, visited) + + case *Slice: + buf.WriteString("[]") + writeType(buf, t.elem, qf, visited) + + case *Struct: + buf.WriteString("struct{") + for i, f := range t.fields { + if i > 0 { + buf.WriteString("; ") + } + if !f.anonymous { + buf.WriteString(f.name) + buf.WriteByte(' ') + } + writeType(buf, f.typ, qf, visited) + if tag := t.Tag(i); tag != "" { + fmt.Fprintf(buf, " %q", tag) + } + } + buf.WriteByte('}') + + case *Pointer: + buf.WriteByte('*') + writeType(buf, t.base, qf, visited) + + case *Tuple: + writeTuple(buf, t, false, qf, visited) + + case *Signature: + buf.WriteString("func") + writeSignature(buf, t, qf, visited) + + case *Interface: + // We write the source-level methods and embedded types rather + // than the actual method set since resolved method signatures + // may have non-printable cycles if parameters have anonymous + // interface types that (directly or indirectly) embed the + // current interface. For instance, consider the result type + // of m: + // + // type T interface{ + // m() interface{ T } + // } + // + buf.WriteString("interface{") + if GcCompatibilityMode { + // print flattened interface + // (useful to compare against gc-generated interfaces) + for i, m := range t.allMethods { + if i > 0 { + buf.WriteString("; ") + } + buf.WriteString(m.name) + writeSignature(buf, m.typ.(*Signature), qf, visited) + } + } else { + // print explicit interface methods and embedded types + for i, m := range t.methods { + if i > 0 { + buf.WriteString("; ") + } + buf.WriteString(m.name) + writeSignature(buf, m.typ.(*Signature), qf, visited) + } + for i, typ := range t.embeddeds { + if i > 0 || len(t.methods) > 0 { + buf.WriteString("; ") + } + writeType(buf, typ, qf, visited) + } + } + buf.WriteByte('}') + + case *Map: + buf.WriteString("map[") + writeType(buf, t.key, qf, visited) + buf.WriteByte(']') + writeType(buf, t.elem, qf, visited) + + case *Chan: + var s string + var parens bool + switch t.dir { + case SendRecv: + s = "chan " + // chan (<-chan T) requires parentheses + if c, _ := t.elem.(*Chan); c != nil && c.dir == RecvOnly { + parens = true + } + case SendOnly: + s = "chan<- " + case RecvOnly: + s = "<-chan " + default: + panic("unreachable") + } + buf.WriteString(s) + if parens { + buf.WriteByte('(') + } + writeType(buf, t.elem, qf, visited) + if parens { + buf.WriteByte(')') + } + + case *Named: + s := "" + if obj := t.obj; obj != nil { + if obj.pkg != nil { + writePackage(buf, obj.pkg, qf) + } + // TODO(gri): function-local named types should be displayed + // differently from named types at package level to avoid + // ambiguity. + s = obj.name + } + buf.WriteString(s) + + default: + // For externally defined implementations of Type. + buf.WriteString(t.String()) + } +} + +func writeTuple(buf *bytes.Buffer, tup *Tuple, variadic bool, qf Qualifier, visited []Type) { + buf.WriteByte('(') + if tup != nil { + for i, v := range tup.vars { + if i > 0 { + buf.WriteString(", ") + } + if v.name != "" { + buf.WriteString(v.name) + buf.WriteByte(' ') + } + typ := v.typ + if variadic && i == len(tup.vars)-1 { + if s, ok := typ.(*Slice); ok { + buf.WriteString("...") + typ = s.elem + } else { + // special case: + // append(s, "foo"...) leads to signature func([]byte, string...) + if t, ok := typ.Underlying().(*Basic); !ok || t.kind != String { + panic("internal error: string type expected") + } + writeType(buf, typ, qf, visited) + buf.WriteString("...") + continue + } + } + writeType(buf, typ, qf, visited) + } + } + buf.WriteByte(')') +} + +// WriteSignature writes the representation of the signature sig to buf, +// without a leading "func" keyword. +// The Qualifier controls the printing of +// package-level objects, and may be nil. +func WriteSignature(buf *bytes.Buffer, sig *Signature, qf Qualifier) { + writeSignature(buf, sig, qf, make([]Type, 8)) +} + +func writeSignature(buf *bytes.Buffer, sig *Signature, qf Qualifier, visited []Type) { + writeTuple(buf, sig.params, sig.variadic, qf, visited) + + n := sig.results.Len() + if n == 0 { + // no result + return + } + + buf.WriteByte(' ') + if n == 1 && sig.results.vars[0].name == "" { + // single unnamed result + writeType(buf, sig.results.vars[0].typ, qf, visited) + return + } + + // multiple or named result(s) + writeTuple(buf, sig.results, false, qf, visited) +} diff --git a/vendor/golang.org/x/tools/go/types/typestring_test.go b/vendor/golang.org/x/tools/go/types/typestring_test.go new file mode 100644 index 0000000000..975b62389c --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typestring_test.go @@ -0,0 +1,166 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package types_test + +import ( + "go/ast" + "go/parser" + "go/token" + "testing" + + _ "golang.org/x/tools/go/gcimporter" + . "golang.org/x/tools/go/types" +) + +const filename = "" + +func makePkg(t *testing.T, src string) (*Package, error) { + fset := token.NewFileSet() + file, err := parser.ParseFile(fset, filename, src, parser.DeclarationErrors) + if err != nil { + return nil, err + } + // use the package name as package path + return Check(file.Name.Name, fset, []*ast.File{file}) +} + +type testEntry struct { + src, str string +} + +// dup returns a testEntry where both src and str are the same. +func dup(s string) testEntry { + return testEntry{s, s} +} + +// types that don't depend on any other type declarations +var independentTestTypes = []testEntry{ + // basic types + dup("int"), + dup("float32"), + dup("string"), + + // arrays + dup("[10]int"), + + // slices + dup("[]int"), + dup("[][]int"), + + // structs + dup("struct{}"), + dup("struct{x int}"), + {`struct { + x, y int + z float32 "foo" + }`, `struct{x int; y int; z float32 "foo"}`}, + {`struct { + string + elems []complex128 + }`, `struct{string; elems []complex128}`}, + + // pointers + dup("*int"), + dup("***struct{}"), + dup("*struct{a int; b float32}"), + + // functions + dup("func()"), + dup("func(x int)"), + {"func(x, y int)", "func(x int, y int)"}, + {"func(x, y int, z string)", "func(x int, y int, z string)"}, + dup("func(int)"), + {"func(int, string, byte)", "func(int, string, byte)"}, + + dup("func() int"), + {"func() (string)", "func() string"}, + dup("func() (u int)"), + {"func() (u, v int, w string)", "func() (u int, v int, w string)"}, + + dup("func(int) string"), + dup("func(x int) string"), + dup("func(x int) (u string)"), + {"func(x, y int) (u string)", "func(x int, y int) (u string)"}, + + dup("func(...int) string"), + dup("func(x ...int) string"), + dup("func(x ...int) (u string)"), + {"func(x, y ...int) (u string)", "func(x int, y ...int) (u string)"}, + + // interfaces + dup("interface{}"), + dup("interface{m()}"), + dup(`interface{String() string; m(int) float32}`), + + // maps + dup("map[string]int"), + {"map[struct{x, y int}][]byte", "map[struct{x int; y int}][]byte"}, + + // channels + dup("chan<- chan int"), + dup("chan<- <-chan int"), + dup("<-chan <-chan int"), + dup("chan (<-chan int)"), + dup("chan<- func()"), + dup("<-chan []func() int"), +} + +// types that depend on other type declarations (src in TestTypes) +var dependentTestTypes = []testEntry{ + // interfaces + dup(`interface{io.Reader; io.Writer}`), + dup(`interface{m() int; io.Writer}`), + {`interface{m() interface{T}}`, `interface{m() interface{p.T}}`}, +} + +func TestTypeString(t *testing.T) { + skipSpecialPlatforms(t) + + var tests []testEntry + tests = append(tests, independentTestTypes...) + tests = append(tests, dependentTestTypes...) + + for _, test := range tests { + src := `package p; import "io"; type _ io.Writer; type T ` + test.src + pkg, err := makePkg(t, src) + if err != nil { + t.Errorf("%s: %s", src, err) + continue + } + typ := pkg.Scope().Lookup("T").Type().Underlying() + if got := typ.String(); got != test.str { + t.Errorf("%s: got %s, want %s", test.src, got, test.str) + } + } +} + +func TestQualifiedTypeString(t *testing.T) { + p, _ := pkgFor("p.go", "package p; type T int", nil) + q, _ := pkgFor("q.go", "package q", nil) + + pT := p.Scope().Lookup("T").Type() + for _, test := range []struct { + typ Type + this *Package + want string + }{ + {pT, nil, "p.T"}, + {pT, p, "T"}, + {pT, q, "p.T"}, + {NewPointer(pT), p, "*T"}, + {NewPointer(pT), q, "*p.T"}, + } { + qualifier := func(pkg *Package) string { + if pkg != test.this { + return pkg.Name() + } + return "" + } + if got := TypeString(test.typ, qualifier); got != test.want { + t.Errorf("TypeString(%s, %s) = %s, want %s", + test.this, test.typ, got, test.want) + } + } +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/example_test.go b/vendor/golang.org/x/tools/go/types/typeutil/example_test.go new file mode 100644 index 0000000000..fe49644640 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/example_test.go @@ -0,0 +1,69 @@ +// 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 go1.5 + +package typeutil_test + +import ( + "fmt" + "go/ast" + "go/parser" + "go/token" + "go/types" + "sort" + + "golang.org/x/tools/go/types/typeutil" +) + +func ExampleMap() { + const source = `package P + +var X []string +var Y []string + +const p, q = 1.0, 2.0 + +func f(offset int32) (value byte, ok bool) +func g(rune) (uint8, bool) +` + + // Parse and type-check the package. + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, "P.go", source, 0) + if err != nil { + panic(err) + } + pkg, err := new(types.Config).Check("P", fset, []*ast.File{f}, nil) + if err != nil { + panic(err) + } + + scope := pkg.Scope() + + // Group names of package-level objects by their type. + var namesByType typeutil.Map // value is []string + for _, name := range scope.Names() { + T := scope.Lookup(name).Type() + + names, _ := namesByType.At(T).([]string) + names = append(names, name) + namesByType.Set(T, names) + } + + // Format, sort, and print the map entries. + var lines []string + namesByType.Iterate(func(T types.Type, names interface{}) { + lines = append(lines, fmt.Sprintf("%s %s", names, T)) + }) + sort.Strings(lines) + for _, line := range lines { + fmt.Println(line) + } + + // Output: + // [X Y] []string + // [f g] func(offset int32) (value byte, ok bool) + // [p q] untyped float +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/imports.go b/vendor/golang.org/x/tools/go/types/typeutil/imports.go new file mode 100644 index 0000000000..4b753f4f19 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/imports.go @@ -0,0 +1,33 @@ +// 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 go1.5 + +package typeutil + +import "go/types" + +// Dependencies returns all dependencies of the specified packages. +// +// Dependent packages appear in topological order: if package P imports +// package Q, Q appears earlier than P in the result. +// The algorithm follows import statements in the order they +// appear in the source code, so the result is a total order. +// +func Dependencies(pkgs ...*types.Package) []*types.Package { + var result []*types.Package + seen := make(map[*types.Package]bool) + var visit func(pkgs []*types.Package) + visit = func(pkgs []*types.Package) { + for _, p := range pkgs { + if !seen[p] { + seen[p] = true + visit(p.Imports()) + result = append(result, p) + } + } + } + visit(pkgs) + return result +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/imports14.go b/vendor/golang.org/x/tools/go/types/typeutil/imports14.go new file mode 100644 index 0000000000..9741df36de --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/imports14.go @@ -0,0 +1,33 @@ +// 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 !go1.5 + +package typeutil + +import "golang.org/x/tools/go/types" + +// Dependencies returns all dependencies of the specified packages. +// +// Dependent packages appear in topological order: if package P imports +// package Q, Q appears earlier than P in the result. +// The algorithm follows import statements in the order they +// appear in the source code, so the result is a total order. +// +func Dependencies(pkgs ...*types.Package) []*types.Package { + var result []*types.Package + seen := make(map[*types.Package]bool) + var visit func(pkgs []*types.Package) + visit = func(pkgs []*types.Package) { + for _, p := range pkgs { + if !seen[p] { + seen[p] = true + visit(p.Imports()) + result = append(result, p) + } + } + } + visit(pkgs) + return result +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/imports14_test.go b/vendor/golang.org/x/tools/go/types/typeutil/imports14_test.go new file mode 100644 index 0000000000..b70f5f048c --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/imports14_test.go @@ -0,0 +1,81 @@ +// 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 !go1.5 + +package typeutil_test + +import ( + "fmt" + "go/ast" + "go/parser" + "go/token" + "testing" + + "golang.org/x/tools/go/types" + "golang.org/x/tools/go/types/typeutil" +) + +func TestDependencies(t *testing.T) { + packages := make(map[string]*types.Package) + conf := types.Config{ + Packages: packages, + Import: func(_ map[string]*types.Package, path string) (*types.Package, error) { + return packages[path], nil + }, + } + fset := token.NewFileSet() + + // All edges go to the right. + // /--D--B--A + // F \_C_/ + // \__E_/ + for i, content := range []string{ + `package a`, + `package c; import (_ "a")`, + `package b; import (_ "a")`, + `package e; import (_ "c")`, + `package d; import (_ "b"; _ "c")`, + `package f; import (_ "d"; _ "e")`, + } { + f, err := parser.ParseFile(fset, fmt.Sprintf("%d.go", i), content, 0) + if err != nil { + t.Fatal(err) + } + pkg, err := conf.Check(f.Name.Name, fset, []*ast.File{f}, nil) + if err != nil { + t.Fatal(err) + } + packages[pkg.Path()] = pkg + } + + for _, test := range []struct { + roots, want string + }{ + {"a", "a"}, + {"b", "ab"}, + {"c", "ac"}, + {"d", "abcd"}, + {"e", "ace"}, + {"f", "abcdef"}, + + {"be", "abce"}, + {"eb", "aceb"}, + {"de", "abcde"}, + {"ed", "acebd"}, + {"ef", "acebdf"}, + } { + var pkgs []*types.Package + for _, r := range test.roots { + pkgs = append(pkgs, packages[string(r)]) + } + var got string + for _, p := range typeutil.Dependencies(pkgs...) { + got += p.Path() + } + if got != test.want { + t.Errorf("Dependencies(%q) = %q, want %q", test.roots, got, test.want) + } + } +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/imports_test.go b/vendor/golang.org/x/tools/go/types/typeutil/imports_test.go new file mode 100644 index 0000000000..b846fbb19b --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/imports_test.go @@ -0,0 +1,82 @@ +// 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 go1.5 + +package typeutil_test + +import ( + "fmt" + "go/ast" + "go/parser" + "go/token" + "go/types" + "testing" + + "golang.org/x/tools/go/types/typeutil" +) + +type closure map[string]*types.Package + +func (c closure) Import(path string) (*types.Package, error) { return c[path], nil } + +func TestDependencies(t *testing.T) { + packages := make(map[string]*types.Package) + conf := types.Config{ + Importer: closure(packages), + } + fset := token.NewFileSet() + + // All edges go to the right. + // /--D--B--A + // F \_C_/ + // \__E_/ + for i, content := range []string{ + `package a`, + `package c; import (_ "a")`, + `package b; import (_ "a")`, + `package e; import (_ "c")`, + `package d; import (_ "b"; _ "c")`, + `package f; import (_ "d"; _ "e")`, + } { + f, err := parser.ParseFile(fset, fmt.Sprintf("%d.go", i), content, 0) + if err != nil { + t.Fatal(err) + } + pkg, err := conf.Check(f.Name.Name, fset, []*ast.File{f}, nil) + if err != nil { + t.Fatal(err) + } + packages[pkg.Path()] = pkg + } + + for _, test := range []struct { + roots, want string + }{ + {"a", "a"}, + {"b", "ab"}, + {"c", "ac"}, + {"d", "abcd"}, + {"e", "ace"}, + {"f", "abcdef"}, + + {"be", "abce"}, + {"eb", "aceb"}, + {"de", "abcde"}, + {"ed", "acebd"}, + {"ef", "acebdf"}, + } { + var pkgs []*types.Package + for _, r := range test.roots { + pkgs = append(pkgs, packages[string(r)]) + } + var got string + for _, p := range typeutil.Dependencies(pkgs...) { + got += p.Path() + } + if got != test.want { + t.Errorf("Dependencies(%q) = %q, want %q", test.roots, got, test.want) + } + } +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/map.go b/vendor/golang.org/x/tools/go/types/typeutil/map.go new file mode 100644 index 0000000000..81dd556c06 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/map.go @@ -0,0 +1,315 @@ +// 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 go1.5 + +// Package typeutil defines various utilities for types, such as Map, +// a mapping from types.Type to interface{} values. +package typeutil // import "golang.org/x/tools/go/types/typeutil" + +import ( + "bytes" + "fmt" + "go/types" + "reflect" +) + +// Map is a hash-table-based mapping from types (types.Type) to +// arbitrary interface{} values. The concrete types that implement +// the Type interface are pointers. Since they are not canonicalized, +// == cannot be used to check for equivalence, and thus we cannot +// simply use a Go map. +// +// Just as with map[K]V, a nil *Map is a valid empty map. +// +// Not thread-safe. +// +type Map struct { + hasher Hasher // shared by many Maps + table map[uint32][]entry // maps hash to bucket; entry.key==nil means unused + length int // number of map entries +} + +// entry is an entry (key/value association) in a hash bucket. +type entry struct { + key types.Type + value interface{} +} + +// SetHasher sets the hasher used by Map. +// +// All Hashers are functionally equivalent but contain internal state +// used to cache the results of hashing previously seen types. +// +// A single Hasher created by MakeHasher() may be shared among many +// Maps. This is recommended if the instances have many keys in +// common, as it will amortize the cost of hash computation. +// +// A Hasher may grow without bound as new types are seen. Even when a +// type is deleted from the map, the Hasher never shrinks, since other +// types in the map may reference the deleted type indirectly. +// +// Hashers are not thread-safe, and read-only operations such as +// Map.Lookup require updates to the hasher, so a full Mutex lock (not a +// read-lock) is require around all Map operations if a shared +// hasher is accessed from multiple threads. +// +// If SetHasher is not called, the Map will create a private hasher at +// the first call to Insert. +// +func (m *Map) SetHasher(hasher Hasher) { + m.hasher = hasher +} + +// Delete removes the entry with the given key, if any. +// It returns true if the entry was found. +// +func (m *Map) Delete(key types.Type) bool { + if m != nil && m.table != nil { + hash := m.hasher.Hash(key) + bucket := m.table[hash] + for i, e := range bucket { + if e.key != nil && types.Identical(key, e.key) { + // We can't compact the bucket as it + // would disturb iterators. + bucket[i] = entry{} + m.length-- + return true + } + } + } + return false +} + +// At returns the map entry for the given key. +// The result is nil if the entry is not present. +// +func (m *Map) At(key types.Type) interface{} { + if m != nil && m.table != nil { + for _, e := range m.table[m.hasher.Hash(key)] { + if e.key != nil && types.Identical(key, e.key) { + return e.value + } + } + } + return nil +} + +// Set sets the map entry for key to val, +// and returns the previous entry, if any. +func (m *Map) Set(key types.Type, value interface{}) (prev interface{}) { + if m.table != nil { + hash := m.hasher.Hash(key) + bucket := m.table[hash] + var hole *entry + for i, e := range bucket { + if e.key == nil { + hole = &bucket[i] + } else if types.Identical(key, e.key) { + prev = e.value + bucket[i].value = value + return + } + } + + if hole != nil { + *hole = entry{key, value} // overwrite deleted entry + } else { + m.table[hash] = append(bucket, entry{key, value}) + } + } else { + if m.hasher.memo == nil { + m.hasher = MakeHasher() + } + hash := m.hasher.Hash(key) + m.table = map[uint32][]entry{hash: {entry{key, value}}} + } + + m.length++ + return +} + +// Len returns the number of map entries. +func (m *Map) Len() int { + if m != nil { + return m.length + } + return 0 +} + +// Iterate calls function f on each entry in the map in unspecified order. +// +// If f should mutate the map, Iterate provides the same guarantees as +// Go maps: if f deletes a map entry that Iterate has not yet reached, +// f will not be invoked for it, but if f inserts a map entry that +// Iterate has not yet reached, whether or not f will be invoked for +// it is unspecified. +// +func (m *Map) Iterate(f func(key types.Type, value interface{})) { + if m != nil { + for _, bucket := range m.table { + for _, e := range bucket { + if e.key != nil { + f(e.key, e.value) + } + } + } + } +} + +// Keys returns a new slice containing the set of map keys. +// The order is unspecified. +func (m *Map) Keys() []types.Type { + keys := make([]types.Type, 0, m.Len()) + m.Iterate(func(key types.Type, _ interface{}) { + keys = append(keys, key) + }) + return keys +} + +func (m *Map) toString(values bool) string { + if m == nil { + return "{}" + } + var buf bytes.Buffer + fmt.Fprint(&buf, "{") + sep := "" + m.Iterate(func(key types.Type, value interface{}) { + fmt.Fprint(&buf, sep) + sep = ", " + fmt.Fprint(&buf, key) + if values { + fmt.Fprintf(&buf, ": %q", value) + } + }) + fmt.Fprint(&buf, "}") + return buf.String() +} + +// String returns a string representation of the map's entries. +// Values are printed using fmt.Sprintf("%v", v). +// Order is unspecified. +// +func (m *Map) String() string { + return m.toString(true) +} + +// KeysString returns a string representation of the map's key set. +// Order is unspecified. +// +func (m *Map) KeysString() string { + return m.toString(false) +} + +//////////////////////////////////////////////////////////////////////// +// Hasher + +// A Hasher maps each type to its hash value. +// For efficiency, a hasher uses memoization; thus its memory +// footprint grows monotonically over time. +// Hashers are not thread-safe. +// Hashers have reference semantics. +// Call MakeHasher to create a Hasher. +type Hasher struct { + memo map[types.Type]uint32 +} + +// MakeHasher returns a new Hasher instance. +func MakeHasher() Hasher { + return Hasher{make(map[types.Type]uint32)} +} + +// Hash computes a hash value for the given type t such that +// Identical(t, t') => Hash(t) == Hash(t'). +func (h Hasher) Hash(t types.Type) uint32 { + hash, ok := h.memo[t] + if !ok { + hash = h.hashFor(t) + h.memo[t] = hash + } + return hash +} + +// hashString computes the Fowler–Noll–Vo hash of s. +func hashString(s string) uint32 { + var h uint32 + for i := 0; i < len(s); i++ { + h ^= uint32(s[i]) + h *= 16777619 + } + return h +} + +// hashFor computes the hash of t. +func (h Hasher) hashFor(t types.Type) uint32 { + // See Identical for rationale. + switch t := t.(type) { + case *types.Basic: + return uint32(t.Kind()) + + case *types.Array: + return 9043 + 2*uint32(t.Len()) + 3*h.Hash(t.Elem()) + + case *types.Slice: + return 9049 + 2*h.Hash(t.Elem()) + + case *types.Struct: + var hash uint32 = 9059 + for i, n := 0, t.NumFields(); i < n; i++ { + f := t.Field(i) + if f.Anonymous() { + hash += 8861 + } + hash += hashString(t.Tag(i)) + hash += hashString(f.Name()) // (ignore f.Pkg) + hash += h.Hash(f.Type()) + } + return hash + + case *types.Pointer: + return 9067 + 2*h.Hash(t.Elem()) + + case *types.Signature: + var hash uint32 = 9091 + if t.Variadic() { + hash *= 8863 + } + return hash + 3*h.hashTuple(t.Params()) + 5*h.hashTuple(t.Results()) + + case *types.Interface: + var hash uint32 = 9103 + for i, n := 0, t.NumMethods(); i < n; i++ { + // See go/types.identicalMethods for rationale. + // Method order is not significant. + // Ignore m.Pkg(). + m := t.Method(i) + hash += 3*hashString(m.Name()) + 5*h.Hash(m.Type()) + } + return hash + + case *types.Map: + return 9109 + 2*h.Hash(t.Key()) + 3*h.Hash(t.Elem()) + + case *types.Chan: + return 9127 + 2*uint32(t.Dir()) + 3*h.Hash(t.Elem()) + + case *types.Named: + // Not safe with a copying GC; objects may move. + return uint32(reflect.ValueOf(t.Obj()).Pointer()) + + case *types.Tuple: + return h.hashTuple(t) + } + panic(t) +} + +func (h Hasher) hashTuple(tuple *types.Tuple) uint32 { + // See go/types.identicalTypes for rationale. + n := tuple.Len() + var hash uint32 = 9137 + 2*uint32(n) + for i := 0; i < n; i++ { + hash += 3 * h.Hash(tuple.At(i).Type()) + } + return hash +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/map14.go b/vendor/golang.org/x/tools/go/types/typeutil/map14.go new file mode 100644 index 0000000000..16209e3bfc --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/map14.go @@ -0,0 +1,316 @@ +// 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 !go1.5 + +// Package typeutil defines various utilities for types, such as Map, +// a mapping from types.Type to interface{} values. +package typeutil // import "golang.org/x/tools/go/types/typeutil" + +import ( + "bytes" + "fmt" + "reflect" + + "golang.org/x/tools/go/types" +) + +// Map is a hash-table-based mapping from types (types.Type) to +// arbitrary interface{} values. The concrete types that implement +// the Type interface are pointers. Since they are not canonicalized, +// == cannot be used to check for equivalence, and thus we cannot +// simply use a Go map. +// +// Just as with map[K]V, a nil *Map is a valid empty map. +// +// Not thread-safe. +// +type Map struct { + hasher Hasher // shared by many Maps + table map[uint32][]entry // maps hash to bucket; entry.key==nil means unused + length int // number of map entries +} + +// entry is an entry (key/value association) in a hash bucket. +type entry struct { + key types.Type + value interface{} +} + +// SetHasher sets the hasher used by Map. +// +// All Hashers are functionally equivalent but contain internal state +// used to cache the results of hashing previously seen types. +// +// A single Hasher created by MakeHasher() may be shared among many +// Maps. This is recommended if the instances have many keys in +// common, as it will amortize the cost of hash computation. +// +// A Hasher may grow without bound as new types are seen. Even when a +// type is deleted from the map, the Hasher never shrinks, since other +// types in the map may reference the deleted type indirectly. +// +// Hashers are not thread-safe, and read-only operations such as +// Map.Lookup require updates to the hasher, so a full Mutex lock (not a +// read-lock) is require around all Map operations if a shared +// hasher is accessed from multiple threads. +// +// If SetHasher is not called, the Map will create a private hasher at +// the first call to Insert. +// +func (m *Map) SetHasher(hasher Hasher) { + m.hasher = hasher +} + +// Delete removes the entry with the given key, if any. +// It returns true if the entry was found. +// +func (m *Map) Delete(key types.Type) bool { + if m != nil && m.table != nil { + hash := m.hasher.Hash(key) + bucket := m.table[hash] + for i, e := range bucket { + if e.key != nil && types.Identical(key, e.key) { + // We can't compact the bucket as it + // would disturb iterators. + bucket[i] = entry{} + m.length-- + return true + } + } + } + return false +} + +// At returns the map entry for the given key. +// The result is nil if the entry is not present. +// +func (m *Map) At(key types.Type) interface{} { + if m != nil && m.table != nil { + for _, e := range m.table[m.hasher.Hash(key)] { + if e.key != nil && types.Identical(key, e.key) { + return e.value + } + } + } + return nil +} + +// Set sets the map entry for key to val, +// and returns the previous entry, if any. +func (m *Map) Set(key types.Type, value interface{}) (prev interface{}) { + if m.table != nil { + hash := m.hasher.Hash(key) + bucket := m.table[hash] + var hole *entry + for i, e := range bucket { + if e.key == nil { + hole = &bucket[i] + } else if types.Identical(key, e.key) { + prev = e.value + bucket[i].value = value + return + } + } + + if hole != nil { + *hole = entry{key, value} // overwrite deleted entry + } else { + m.table[hash] = append(bucket, entry{key, value}) + } + } else { + if m.hasher.memo == nil { + m.hasher = MakeHasher() + } + hash := m.hasher.Hash(key) + m.table = map[uint32][]entry{hash: {entry{key, value}}} + } + + m.length++ + return +} + +// Len returns the number of map entries. +func (m *Map) Len() int { + if m != nil { + return m.length + } + return 0 +} + +// Iterate calls function f on each entry in the map in unspecified order. +// +// If f should mutate the map, Iterate provides the same guarantees as +// Go maps: if f deletes a map entry that Iterate has not yet reached, +// f will not be invoked for it, but if f inserts a map entry that +// Iterate has not yet reached, whether or not f will be invoked for +// it is unspecified. +// +func (m *Map) Iterate(f func(key types.Type, value interface{})) { + if m != nil { + for _, bucket := range m.table { + for _, e := range bucket { + if e.key != nil { + f(e.key, e.value) + } + } + } + } +} + +// Keys returns a new slice containing the set of map keys. +// The order is unspecified. +func (m *Map) Keys() []types.Type { + keys := make([]types.Type, 0, m.Len()) + m.Iterate(func(key types.Type, _ interface{}) { + keys = append(keys, key) + }) + return keys +} + +func (m *Map) toString(values bool) string { + if m == nil { + return "{}" + } + var buf bytes.Buffer + fmt.Fprint(&buf, "{") + sep := "" + m.Iterate(func(key types.Type, value interface{}) { + fmt.Fprint(&buf, sep) + sep = ", " + fmt.Fprint(&buf, key) + if values { + fmt.Fprintf(&buf, ": %q", value) + } + }) + fmt.Fprint(&buf, "}") + return buf.String() +} + +// String returns a string representation of the map's entries. +// Values are printed using fmt.Sprintf("%v", v). +// Order is unspecified. +// +func (m *Map) String() string { + return m.toString(true) +} + +// KeysString returns a string representation of the map's key set. +// Order is unspecified. +// +func (m *Map) KeysString() string { + return m.toString(false) +} + +//////////////////////////////////////////////////////////////////////// +// Hasher + +// A Hasher maps each type to its hash value. +// For efficiency, a hasher uses memoization; thus its memory +// footprint grows monotonically over time. +// Hashers are not thread-safe. +// Hashers have reference semantics. +// Call MakeHasher to create a Hasher. +type Hasher struct { + memo map[types.Type]uint32 +} + +// MakeHasher returns a new Hasher instance. +func MakeHasher() Hasher { + return Hasher{make(map[types.Type]uint32)} +} + +// Hash computes a hash value for the given type t such that +// Identical(t, t') => Hash(t) == Hash(t'). +func (h Hasher) Hash(t types.Type) uint32 { + hash, ok := h.memo[t] + if !ok { + hash = h.hashFor(t) + h.memo[t] = hash + } + return hash +} + +// hashString computes the Fowler–Noll–Vo hash of s. +func hashString(s string) uint32 { + var h uint32 + for i := 0; i < len(s); i++ { + h ^= uint32(s[i]) + h *= 16777619 + } + return h +} + +// hashFor computes the hash of t. +func (h Hasher) hashFor(t types.Type) uint32 { + // See Identical for rationale. + switch t := t.(type) { + case *types.Basic: + return uint32(t.Kind()) + + case *types.Array: + return 9043 + 2*uint32(t.Len()) + 3*h.Hash(t.Elem()) + + case *types.Slice: + return 9049 + 2*h.Hash(t.Elem()) + + case *types.Struct: + var hash uint32 = 9059 + for i, n := 0, t.NumFields(); i < n; i++ { + f := t.Field(i) + if f.Anonymous() { + hash += 8861 + } + hash += hashString(t.Tag(i)) + hash += hashString(f.Name()) // (ignore f.Pkg) + hash += h.Hash(f.Type()) + } + return hash + + case *types.Pointer: + return 9067 + 2*h.Hash(t.Elem()) + + case *types.Signature: + var hash uint32 = 9091 + if t.Variadic() { + hash *= 8863 + } + return hash + 3*h.hashTuple(t.Params()) + 5*h.hashTuple(t.Results()) + + case *types.Interface: + var hash uint32 = 9103 + for i, n := 0, t.NumMethods(); i < n; i++ { + // See go/types.identicalMethods for rationale. + // Method order is not significant. + // Ignore m.Pkg(). + m := t.Method(i) + hash += 3*hashString(m.Name()) + 5*h.Hash(m.Type()) + } + return hash + + case *types.Map: + return 9109 + 2*h.Hash(t.Key()) + 3*h.Hash(t.Elem()) + + case *types.Chan: + return 9127 + 2*uint32(t.Dir()) + 3*h.Hash(t.Elem()) + + case *types.Named: + // Not safe with a copying GC; objects may move. + return uint32(reflect.ValueOf(t.Obj()).Pointer()) + + case *types.Tuple: + return h.hashTuple(t) + } + panic(t) +} + +func (h Hasher) hashTuple(tuple *types.Tuple) uint32 { + // See go/types.identicalTypes for rationale. + n := tuple.Len() + var hash uint32 = 9137 + 2*uint32(n) + for i := 0; i < n; i++ { + hash += 3 * h.Hash(tuple.At(i).Type()) + } + return hash +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/map14_test.go b/vendor/golang.org/x/tools/go/types/typeutil/map14_test.go new file mode 100644 index 0000000000..9043d05f28 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/map14_test.go @@ -0,0 +1,176 @@ +// 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 !go1.5 + +package typeutil_test + +// TODO(adonovan): +// - test use of explicit hasher across two maps. +// - test hashcodes are consistent with equals for a range of types +// (e.g. all types generated by type-checking some body of real code). + +import ( + "testing" + + "golang.org/x/tools/go/types" + "golang.org/x/tools/go/types/typeutil" +) + +var ( + tStr = types.Typ[types.String] // string + tPStr1 = types.NewPointer(tStr) // *string + tPStr2 = types.NewPointer(tStr) // *string, again + tInt = types.Typ[types.Int] // int + tChanInt1 = types.NewChan(types.RecvOnly, tInt) // <-chan int + tChanInt2 = types.NewChan(types.RecvOnly, tInt) // <-chan int, again +) + +func checkEqualButNotIdentical(t *testing.T, x, y types.Type, comment string) { + if !types.Identical(x, y) { + t.Errorf("%s: not equal: %s, %s", comment, x, y) + } + if x == y { + t.Errorf("%s: identical: %v, %v", comment, x, y) + } +} + +func TestAxioms(t *testing.T) { + checkEqualButNotIdentical(t, tPStr1, tPStr2, "tPstr{1,2}") + checkEqualButNotIdentical(t, tChanInt1, tChanInt2, "tChanInt{1,2}") +} + +func TestMap(t *testing.T) { + var tmap *typeutil.Map + + // All methods but Set are safe on on (*T)(nil). + tmap.Len() + tmap.At(tPStr1) + tmap.Delete(tPStr1) + tmap.KeysString() + tmap.String() + + tmap = new(typeutil.Map) + + // Length of empty map. + if l := tmap.Len(); l != 0 { + t.Errorf("Len() on empty Map: got %d, want 0", l) + } + // At of missing key. + if v := tmap.At(tPStr1); v != nil { + t.Errorf("At() on empty Map: got %v, want nil", v) + } + // Deletion of missing key. + if tmap.Delete(tPStr1) { + t.Errorf("Delete() on empty Map: got true, want false") + } + // Set of new key. + if prev := tmap.Set(tPStr1, "*string"); prev != nil { + t.Errorf("Set() on empty Map returned non-nil previous value %s", prev) + } + + // Now: {*string: "*string"} + + // Length of non-empty map. + if l := tmap.Len(); l != 1 { + t.Errorf("Len(): got %d, want 1", l) + } + // At via insertion key. + if v := tmap.At(tPStr1); v != "*string" { + t.Errorf("At(): got %q, want \"*string\"", v) + } + // At via equal key. + if v := tmap.At(tPStr2); v != "*string" { + t.Errorf("At(): got %q, want \"*string\"", v) + } + // Iteration over sole entry. + tmap.Iterate(func(key types.Type, value interface{}) { + if key != tPStr1 { + t.Errorf("Iterate: key: got %s, want %s", key, tPStr1) + } + if want := "*string"; value != want { + t.Errorf("Iterate: value: got %s, want %s", value, want) + } + }) + + // Setion with key equal to present one. + if prev := tmap.Set(tPStr2, "*string again"); prev != "*string" { + t.Errorf("Set() previous value: got %s, want \"*string\"", prev) + } + + // Setion of another association. + if prev := tmap.Set(tChanInt1, "<-chan int"); prev != nil { + t.Errorf("Set() previous value: got %s, want nil", prev) + } + + // Now: {*string: "*string again", <-chan int: "<-chan int"} + + want1 := "{*string: \"*string again\", <-chan int: \"<-chan int\"}" + want2 := "{<-chan int: \"<-chan int\", *string: \"*string again\"}" + if s := tmap.String(); s != want1 && s != want2 { + t.Errorf("String(): got %s, want %s", s, want1) + } + + want1 = "{*string, <-chan int}" + want2 = "{<-chan int, *string}" + if s := tmap.KeysString(); s != want1 && s != want2 { + t.Errorf("KeysString(): got %s, want %s", s, want1) + } + + // Keys(). + I := types.Identical + switch k := tmap.Keys(); { + case I(k[0], tChanInt1) && I(k[1], tPStr1): // ok + case I(k[1], tChanInt1) && I(k[0], tPStr1): // ok + default: + t.Errorf("Keys(): got %v, want %s", k, want2) + } + + if l := tmap.Len(); l != 2 { + t.Errorf("Len(): got %d, want 1", l) + } + // At via original key. + if v := tmap.At(tPStr1); v != "*string again" { + t.Errorf("At(): got %q, want \"*string again\"", v) + } + hamming := 1 + tmap.Iterate(func(key types.Type, value interface{}) { + switch { + case I(key, tChanInt1): + hamming *= 2 // ok + case I(key, tPStr1): + hamming *= 3 // ok + } + }) + if hamming != 6 { + t.Errorf("Iterate: hamming: got %d, want %d", hamming, 6) + } + + if v := tmap.At(tChanInt2); v != "<-chan int" { + t.Errorf("At(): got %q, want \"<-chan int\"", v) + } + // Deletion with key equal to present one. + if !tmap.Delete(tChanInt2) { + t.Errorf("Delete() of existing key: got false, want true") + } + + // Now: {*string: "*string again"} + + if l := tmap.Len(); l != 1 { + t.Errorf("Len(): got %d, want 1", l) + } + // Deletion again. + if !tmap.Delete(tPStr2) { + t.Errorf("Delete() of existing key: got false, want true") + } + + // Now: {} + + if l := tmap.Len(); l != 0 { + t.Errorf("Len(): got %d, want %d", l, 0) + } + if s := tmap.String(); s != "{}" { + t.Errorf("Len(): got %q, want %q", s, "") + } +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/map_test.go b/vendor/golang.org/x/tools/go/types/typeutil/map_test.go new file mode 100644 index 0000000000..e5dc4e4002 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/map_test.go @@ -0,0 +1,176 @@ +// 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 go1.5 + +package typeutil_test + +// TODO(adonovan): +// - test use of explicit hasher across two maps. +// - test hashcodes are consistent with equals for a range of types +// (e.g. all types generated by type-checking some body of real code). + +import ( + "go/types" + "testing" + + "golang.org/x/tools/go/types/typeutil" +) + +var ( + tStr = types.Typ[types.String] // string + tPStr1 = types.NewPointer(tStr) // *string + tPStr2 = types.NewPointer(tStr) // *string, again + tInt = types.Typ[types.Int] // int + tChanInt1 = types.NewChan(types.RecvOnly, tInt) // <-chan int + tChanInt2 = types.NewChan(types.RecvOnly, tInt) // <-chan int, again +) + +func checkEqualButNotIdentical(t *testing.T, x, y types.Type, comment string) { + if !types.Identical(x, y) { + t.Errorf("%s: not equal: %s, %s", comment, x, y) + } + if x == y { + t.Errorf("%s: identical: %v, %v", comment, x, y) + } +} + +func TestAxioms(t *testing.T) { + checkEqualButNotIdentical(t, tPStr1, tPStr2, "tPstr{1,2}") + checkEqualButNotIdentical(t, tChanInt1, tChanInt2, "tChanInt{1,2}") +} + +func TestMap(t *testing.T) { + var tmap *typeutil.Map + + // All methods but Set are safe on on (*T)(nil). + tmap.Len() + tmap.At(tPStr1) + tmap.Delete(tPStr1) + tmap.KeysString() + tmap.String() + + tmap = new(typeutil.Map) + + // Length of empty map. + if l := tmap.Len(); l != 0 { + t.Errorf("Len() on empty Map: got %d, want 0", l) + } + // At of missing key. + if v := tmap.At(tPStr1); v != nil { + t.Errorf("At() on empty Map: got %v, want nil", v) + } + // Deletion of missing key. + if tmap.Delete(tPStr1) { + t.Errorf("Delete() on empty Map: got true, want false") + } + // Set of new key. + if prev := tmap.Set(tPStr1, "*string"); prev != nil { + t.Errorf("Set() on empty Map returned non-nil previous value %s", prev) + } + + // Now: {*string: "*string"} + + // Length of non-empty map. + if l := tmap.Len(); l != 1 { + t.Errorf("Len(): got %d, want 1", l) + } + // At via insertion key. + if v := tmap.At(tPStr1); v != "*string" { + t.Errorf("At(): got %q, want \"*string\"", v) + } + // At via equal key. + if v := tmap.At(tPStr2); v != "*string" { + t.Errorf("At(): got %q, want \"*string\"", v) + } + // Iteration over sole entry. + tmap.Iterate(func(key types.Type, value interface{}) { + if key != tPStr1 { + t.Errorf("Iterate: key: got %s, want %s", key, tPStr1) + } + if want := "*string"; value != want { + t.Errorf("Iterate: value: got %s, want %s", value, want) + } + }) + + // Setion with key equal to present one. + if prev := tmap.Set(tPStr2, "*string again"); prev != "*string" { + t.Errorf("Set() previous value: got %s, want \"*string\"", prev) + } + + // Setion of another association. + if prev := tmap.Set(tChanInt1, "<-chan int"); prev != nil { + t.Errorf("Set() previous value: got %s, want nil", prev) + } + + // Now: {*string: "*string again", <-chan int: "<-chan int"} + + want1 := "{*string: \"*string again\", <-chan int: \"<-chan int\"}" + want2 := "{<-chan int: \"<-chan int\", *string: \"*string again\"}" + if s := tmap.String(); s != want1 && s != want2 { + t.Errorf("String(): got %s, want %s", s, want1) + } + + want1 = "{*string, <-chan int}" + want2 = "{<-chan int, *string}" + if s := tmap.KeysString(); s != want1 && s != want2 { + t.Errorf("KeysString(): got %s, want %s", s, want1) + } + + // Keys(). + I := types.Identical + switch k := tmap.Keys(); { + case I(k[0], tChanInt1) && I(k[1], tPStr1): // ok + case I(k[1], tChanInt1) && I(k[0], tPStr1): // ok + default: + t.Errorf("Keys(): got %v, want %s", k, want2) + } + + if l := tmap.Len(); l != 2 { + t.Errorf("Len(): got %d, want 1", l) + } + // At via original key. + if v := tmap.At(tPStr1); v != "*string again" { + t.Errorf("At(): got %q, want \"*string again\"", v) + } + hamming := 1 + tmap.Iterate(func(key types.Type, value interface{}) { + switch { + case I(key, tChanInt1): + hamming *= 2 // ok + case I(key, tPStr1): + hamming *= 3 // ok + } + }) + if hamming != 6 { + t.Errorf("Iterate: hamming: got %d, want %d", hamming, 6) + } + + if v := tmap.At(tChanInt2); v != "<-chan int" { + t.Errorf("At(): got %q, want \"<-chan int\"", v) + } + // Deletion with key equal to present one. + if !tmap.Delete(tChanInt2) { + t.Errorf("Delete() of existing key: got false, want true") + } + + // Now: {*string: "*string again"} + + if l := tmap.Len(); l != 1 { + t.Errorf("Len(): got %d, want 1", l) + } + // Deletion again. + if !tmap.Delete(tPStr2) { + t.Errorf("Delete() of existing key: got false, want true") + } + + // Now: {} + + if l := tmap.Len(); l != 0 { + t.Errorf("Len(): got %d, want %d", l, 0) + } + if s := tmap.String(); s != "{}" { + t.Errorf("Len(): got %q, want %q", s, "") + } +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go b/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go new file mode 100644 index 0000000000..edc3f5b824 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go @@ -0,0 +1,74 @@ +// 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 go1.5 + +// This file implements a cache of method sets. + +package typeutil + +import ( + "go/types" + "sync" +) + +// A MethodSetCache records the method set of each type T for which +// MethodSet(T) is called so that repeat queries are fast. +// The zero value is a ready-to-use cache instance. +type MethodSetCache struct { + mu sync.Mutex + named map[*types.Named]struct{ value, pointer *types.MethodSet } // method sets for named N and *N + others map[types.Type]*types.MethodSet // all other types +} + +// MethodSet returns the method set of type T. It is thread-safe. +// +// If cache is nil, this function is equivalent to types.NewMethodSet(T). +// Utility functions can thus expose an optional *MethodSetCache +// parameter to clients that care about performance. +// +func (cache *MethodSetCache) MethodSet(T types.Type) *types.MethodSet { + if cache == nil { + return types.NewMethodSet(T) + } + cache.mu.Lock() + defer cache.mu.Unlock() + + switch T := T.(type) { + case *types.Named: + return cache.lookupNamed(T).value + + case *types.Pointer: + if N, ok := T.Elem().(*types.Named); ok { + return cache.lookupNamed(N).pointer + } + } + + // all other types + // (The map uses pointer equivalence, not type identity.) + mset := cache.others[T] + if mset == nil { + mset = types.NewMethodSet(T) + if cache.others == nil { + cache.others = make(map[types.Type]*types.MethodSet) + } + cache.others[T] = mset + } + return mset +} + +func (cache *MethodSetCache) lookupNamed(named *types.Named) struct{ value, pointer *types.MethodSet } { + if cache.named == nil { + cache.named = make(map[*types.Named]struct{ value, pointer *types.MethodSet }) + } + // Avoid recomputing mset(*T) for each distinct Pointer + // instance whose underlying type is a named type. + msets, ok := cache.named[named] + if !ok { + msets.value = types.NewMethodSet(named) + msets.pointer = types.NewMethodSet(types.NewPointer(named)) + cache.named[named] = msets + } + return msets +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache14.go b/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache14.go new file mode 100644 index 0000000000..83b5e764c2 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache14.go @@ -0,0 +1,75 @@ +// 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 !go1.5 + +// This file implements a cache of method sets. + +package typeutil + +import ( + "sync" + + "golang.org/x/tools/go/types" +) + +// A MethodSetCache records the method set of each type T for which +// MethodSet(T) is called so that repeat queries are fast. +// The zero value is a ready-to-use cache instance. +type MethodSetCache struct { + mu sync.Mutex + named map[*types.Named]struct{ value, pointer *types.MethodSet } // method sets for named N and *N + others map[types.Type]*types.MethodSet // all other types +} + +// MethodSet returns the method set of type T. It is thread-safe. +// +// If cache is nil, this function is equivalent to types.NewMethodSet(T). +// Utility functions can thus expose an optional *MethodSetCache +// parameter to clients that care about performance. +// +func (cache *MethodSetCache) MethodSet(T types.Type) *types.MethodSet { + if cache == nil { + return types.NewMethodSet(T) + } + cache.mu.Lock() + defer cache.mu.Unlock() + + switch T := T.(type) { + case *types.Named: + return cache.lookupNamed(T).value + + case *types.Pointer: + if N, ok := T.Elem().(*types.Named); ok { + return cache.lookupNamed(N).pointer + } + } + + // all other types + // (The map uses pointer equivalence, not type identity.) + mset := cache.others[T] + if mset == nil { + mset = types.NewMethodSet(T) + if cache.others == nil { + cache.others = make(map[types.Type]*types.MethodSet) + } + cache.others[T] = mset + } + return mset +} + +func (cache *MethodSetCache) lookupNamed(named *types.Named) struct{ value, pointer *types.MethodSet } { + if cache.named == nil { + cache.named = make(map[*types.Named]struct{ value, pointer *types.MethodSet }) + } + // Avoid recomputing mset(*T) for each distinct Pointer + // instance whose underlying type is a named type. + msets, ok := cache.named[named] + if !ok { + msets.value = types.NewMethodSet(named) + msets.pointer = types.NewMethodSet(types.NewPointer(named)) + cache.named[named] = msets + } + return msets +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/ui.go b/vendor/golang.org/x/tools/go/types/typeutil/ui.go new file mode 100644 index 0000000000..a9e74473cd --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/ui.go @@ -0,0 +1,54 @@ +// 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 go1.5 + +package typeutil + +// This file defines utilities for user interfaces that display types. + +import "go/types" + +// IntuitiveMethodSet returns the intuitive method set of a type T, +// which is the set of methods you can call on an addressable value of +// that type. +// +// The result always contains MethodSet(T), and is exactly MethodSet(T) +// for interface types and for pointer-to-concrete types. +// For all other concrete types T, the result additionally +// contains each method belonging to *T if there is no identically +// named method on T itself. +// +// This corresponds to user intuition about method sets; +// this function is intended only for user interfaces. +// +// The order of the result is as for types.MethodSet(T). +// +func IntuitiveMethodSet(T types.Type, msets *MethodSetCache) []*types.Selection { + isPointerToConcrete := func(T types.Type) bool { + ptr, ok := T.(*types.Pointer) + return ok && !types.IsInterface(ptr.Elem()) + } + + var result []*types.Selection + mset := msets.MethodSet(T) + if types.IsInterface(T) || isPointerToConcrete(T) { + for i, n := 0, mset.Len(); i < n; i++ { + result = append(result, mset.At(i)) + } + } else { + // T is some other concrete type. + // Report methods of T and *T, preferring those of T. + pmset := msets.MethodSet(types.NewPointer(T)) + for i, n := 0, pmset.Len(); i < n; i++ { + meth := pmset.At(i) + if m := mset.Lookup(meth.Obj().Pkg(), meth.Obj().Name()); m != nil { + meth = m + } + result = append(result, meth) + } + + } + return result +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/ui14.go b/vendor/golang.org/x/tools/go/types/typeutil/ui14.go new file mode 100644 index 0000000000..bb78e0b2a2 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/ui14.go @@ -0,0 +1,40 @@ +// 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 !go1.5 + +package typeutil + +// This file defines utilities for user interfaces that display types. + +import "golang.org/x/tools/go/types" + +// IntuitiveMethodSet returns the intuitive method set of a type, T. +// +// The result contains MethodSet(T) and additionally, if T is a +// concrete type, methods belonging to *T if there is no identically +// named method on T itself. This corresponds to user intuition about +// method sets; this function is intended only for user interfaces. +// +// The order of the result is as for types.MethodSet(T). +// +func IntuitiveMethodSet(T types.Type, msets *MethodSetCache) []*types.Selection { + var result []*types.Selection + mset := msets.MethodSet(T) + if _, ok := T.Underlying().(*types.Interface); ok { + for i, n := 0, mset.Len(); i < n; i++ { + result = append(result, mset.At(i)) + } + } else { + pmset := msets.MethodSet(types.NewPointer(T)) + for i, n := 0, pmset.Len(); i < n; i++ { + meth := pmset.At(i) + if m := mset.Lookup(meth.Obj().Pkg(), meth.Obj().Name()); m != nil { + meth = m + } + result = append(result, meth) + } + } + return result +} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/ui_test.go b/vendor/golang.org/x/tools/go/types/typeutil/ui_test.go new file mode 100644 index 0000000000..4d5155eb42 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typeutil/ui_test.go @@ -0,0 +1,63 @@ +// +build go1.5 + +package typeutil_test + +import ( + "fmt" + "go/ast" + "go/parser" + "go/token" + "go/types" + "strings" + "testing" + + "golang.org/x/tools/go/types/typeutil" +) + +func TestIntuitiveMethodSet(t *testing.T) { + const source = ` +package P +type A int +func (A) f() +func (*A) g() +` + + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, "hello.go", source, 0) + if err != nil { + t.Fatal(err) + } + + var conf types.Config + pkg, err := conf.Check("P", fset, []*ast.File{f}, nil) + if err != nil { + t.Fatal(err) + } + qual := types.RelativeTo(pkg) + + for _, test := range []struct { + expr string // type expression + want string // intuitive method set + }{ + {"A", "(A).f (*A).g"}, + {"*A", "(*A).f (*A).g"}, + {"error", "(error).Error"}, + {"*error", ""}, + {"struct{A}", "(struct{A}).f (*struct{A}).g"}, + {"*struct{A}", "(*struct{A}).f (*struct{A}).g"}, + } { + tv, err := types.Eval(fset, pkg, 0, test.expr) + if err != nil { + t.Errorf("Eval(%s) failed: %v", test.expr, err) + } + var names []string + for _, m := range typeutil.IntuitiveMethodSet(tv.Type, nil) { + name := fmt.Sprintf("(%s).%s", types.TypeString(m.Recv(), qual), m.Obj().Name()) + names = append(names, name) + } + got := strings.Join(names, " ") + if got != test.want { + t.Errorf("IntuitiveMethodSet(%s) = %q, want %q", test.expr, got, test.want) + } + } +} diff --git a/vendor/golang.org/x/tools/go/types/typexpr.go b/vendor/golang.org/x/tools/go/types/typexpr.go new file mode 100644 index 0000000000..bd2d7ba272 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/typexpr.go @@ -0,0 +1,713 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements type-checking of identifiers and type expressions. + +package types + +import ( + "go/ast" + "go/token" + "sort" + "strconv" + + "golang.org/x/tools/go/exact" +) + +// ident type-checks identifier e and initializes x with the value or type of e. +// If an error occurred, x.mode is set to invalid. +// For the meaning of def and path, see check.typ, below. +// +func (check *Checker) ident(x *operand, e *ast.Ident, def *Named, path []*TypeName) { + x.mode = invalid + x.expr = e + + scope, obj := check.scope.LookupParent(e.Name, check.pos) + if obj == nil { + if e.Name == "_" { + check.errorf(e.Pos(), "cannot use _ as value or type") + } else { + check.errorf(e.Pos(), "undeclared name: %s", e.Name) + } + return + } + check.recordUse(e, obj) + + check.objDecl(obj, def, path) + typ := obj.Type() + assert(typ != nil) + + // The object may be dot-imported: If so, remove its package from + // the map of unused dot imports for the respective file scope. + // (This code is only needed for dot-imports. Without them, + // we only have to mark variables, see *Var case below). + if pkg := obj.Pkg(); pkg != check.pkg && pkg != nil { + delete(check.unusedDotImports[scope], pkg) + } + + switch obj := obj.(type) { + case *PkgName: + check.errorf(e.Pos(), "use of package %s not in selector", obj.name) + return + + case *Const: + check.addDeclDep(obj) + if typ == Typ[Invalid] { + return + } + if obj == universeIota { + if check.iota == nil { + check.errorf(e.Pos(), "cannot use iota outside constant declaration") + return + } + x.val = check.iota + } else { + x.val = obj.val + } + assert(x.val != nil) + x.mode = constant + + case *TypeName: + x.mode = typexpr + // check for cycle + // (it's ok to iterate forward because each named type appears at most once in path) + for i, prev := range path { + if prev == obj { + check.errorf(obj.pos, "illegal cycle in declaration of %s", obj.name) + // print cycle + for _, obj := range path[i:] { + check.errorf(obj.Pos(), "\t%s refers to", obj.Name()) // secondary error, \t indented + } + check.errorf(obj.Pos(), "\t%s", obj.Name()) + // maintain x.mode == typexpr despite error + typ = Typ[Invalid] + break + } + } + + case *Var: + if obj.pkg == check.pkg { + obj.used = true + } + check.addDeclDep(obj) + if typ == Typ[Invalid] { + return + } + x.mode = variable + + case *Func: + check.addDeclDep(obj) + x.mode = value + + case *Builtin: + x.id = obj.id + x.mode = builtin + + case *Nil: + x.mode = value + + default: + unreachable() + } + + x.typ = typ +} + +// typExpr type-checks the type expression e and returns its type, or Typ[Invalid]. +// If def != nil, e is the type specification for the named type def, declared +// in a type declaration, and def.underlying will be set to the type of e before +// any components of e are type-checked. Path contains the path of named types +// referring to this type. +// +func (check *Checker) typExpr(e ast.Expr, def *Named, path []*TypeName) (T Type) { + if trace { + check.trace(e.Pos(), "%s", e) + check.indent++ + defer func() { + check.indent-- + check.trace(e.Pos(), "=> %s", T) + }() + } + + T = check.typExprInternal(e, def, path) + assert(isTyped(T)) + check.recordTypeAndValue(e, typexpr, T, nil) + + return +} + +func (check *Checker) typ(e ast.Expr) Type { + return check.typExpr(e, nil, nil) +} + +// funcType type-checks a function or method type. +func (check *Checker) funcType(sig *Signature, recvPar *ast.FieldList, ftyp *ast.FuncType) { + scope := NewScope(check.scope, token.NoPos, token.NoPos, "function") + check.recordScope(ftyp, scope) + + recvList, _ := check.collectParams(scope, recvPar, false) + params, variadic := check.collectParams(scope, ftyp.Params, true) + results, _ := check.collectParams(scope, ftyp.Results, false) + + if recvPar != nil { + // recv parameter list present (may be empty) + // spec: "The receiver is specified via an extra parameter section preceeding the + // method name. That parameter section must declare a single parameter, the receiver." + var recv *Var + switch len(recvList) { + case 0: + check.error(recvPar.Pos(), "method is missing receiver") + recv = NewParam(0, nil, "", Typ[Invalid]) // ignore recv below + default: + // more than one receiver + check.error(recvList[len(recvList)-1].Pos(), "method must have exactly one receiver") + fallthrough // continue with first receiver + case 1: + recv = recvList[0] + } + // spec: "The receiver type must be of the form T or *T where T is a type name." + // (ignore invalid types - error was reported before) + if t, _ := deref(recv.typ); t != Typ[Invalid] { + var err string + if T, _ := t.(*Named); T != nil { + // spec: "The type denoted by T is called the receiver base type; it must not + // be a pointer or interface type and it must be declared in the same package + // as the method." + if T.obj.pkg != check.pkg { + err = "type not defined in this package" + } else { + // TODO(gri) This is not correct if the underlying type is unknown yet. + switch u := T.underlying.(type) { + case *Basic: + // unsafe.Pointer is treated like a regular pointer + if u.kind == UnsafePointer { + err = "unsafe.Pointer" + } + case *Pointer, *Interface: + err = "pointer or interface type" + } + } + } else { + err = "basic or unnamed type" + } + if err != "" { + check.errorf(recv.pos, "invalid receiver %s (%s)", recv.typ, err) + // ok to continue + } + } + sig.recv = recv + } + + sig.scope = scope + sig.params = NewTuple(params...) + sig.results = NewTuple(results...) + sig.variadic = variadic +} + +// typExprInternal drives type checking of types. +// Must only be called by typExpr. +// +func (check *Checker) typExprInternal(e ast.Expr, def *Named, path []*TypeName) Type { + switch e := e.(type) { + case *ast.BadExpr: + // ignore - error reported before + + case *ast.Ident: + var x operand + check.ident(&x, e, def, path) + + switch x.mode { + case typexpr: + typ := x.typ + def.setUnderlying(typ) + return typ + case invalid: + // ignore - error reported before + case novalue: + check.errorf(x.pos(), "%s used as type", &x) + default: + check.errorf(x.pos(), "%s is not a type", &x) + } + + case *ast.SelectorExpr: + var x operand + check.selector(&x, e) + + switch x.mode { + case typexpr: + typ := x.typ + def.setUnderlying(typ) + return typ + case invalid: + // ignore - error reported before + case novalue: + check.errorf(x.pos(), "%s used as type", &x) + default: + check.errorf(x.pos(), "%s is not a type", &x) + } + + case *ast.ParenExpr: + return check.typExpr(e.X, def, path) + + case *ast.ArrayType: + if e.Len != nil { + typ := new(Array) + def.setUnderlying(typ) + typ.len = check.arrayLength(e.Len) + typ.elem = check.typExpr(e.Elt, nil, path) + return typ + + } else { + typ := new(Slice) + def.setUnderlying(typ) + typ.elem = check.typ(e.Elt) + return typ + } + + case *ast.StructType: + typ := new(Struct) + def.setUnderlying(typ) + check.structType(typ, e, path) + return typ + + case *ast.StarExpr: + typ := new(Pointer) + def.setUnderlying(typ) + typ.base = check.typ(e.X) + return typ + + case *ast.FuncType: + typ := new(Signature) + def.setUnderlying(typ) + check.funcType(typ, nil, e) + return typ + + case *ast.InterfaceType: + typ := new(Interface) + def.setUnderlying(typ) + check.interfaceType(typ, e, def, path) + return typ + + case *ast.MapType: + typ := new(Map) + def.setUnderlying(typ) + + typ.key = check.typ(e.Key) + typ.elem = check.typ(e.Value) + + // spec: "The comparison operators == and != must be fully defined + // for operands of the key type; thus the key type must not be a + // function, map, or slice." + // + // Delay this check because it requires fully setup types; + // it is safe to continue in any case (was issue 6667). + check.delay(func() { + if !Comparable(typ.key) { + check.errorf(e.Key.Pos(), "invalid map key type %s", typ.key) + } + }) + + return typ + + case *ast.ChanType: + typ := new(Chan) + def.setUnderlying(typ) + + dir := SendRecv + switch e.Dir { + case ast.SEND | ast.RECV: + // nothing to do + case ast.SEND: + dir = SendOnly + case ast.RECV: + dir = RecvOnly + default: + check.invalidAST(e.Pos(), "unknown channel direction %d", e.Dir) + // ok to continue + } + + typ.dir = dir + typ.elem = check.typ(e.Value) + return typ + + default: + check.errorf(e.Pos(), "%s is not a type", e) + } + + typ := Typ[Invalid] + def.setUnderlying(typ) + return typ +} + +// typeOrNil type-checks the type expression (or nil value) e +// and returns the typ of e, or nil. +// If e is neither a type nor nil, typOrNil returns Typ[Invalid]. +// +func (check *Checker) typOrNil(e ast.Expr) Type { + var x operand + check.rawExpr(&x, e, nil) + switch x.mode { + case invalid: + // ignore - error reported before + case novalue: + check.errorf(x.pos(), "%s used as type", &x) + case typexpr: + return x.typ + case value: + if x.isNil() { + return nil + } + fallthrough + default: + check.errorf(x.pos(), "%s is not a type", &x) + } + return Typ[Invalid] +} + +func (check *Checker) arrayLength(e ast.Expr) int64 { + var x operand + check.expr(&x, e) + if x.mode != constant { + if x.mode != invalid { + check.errorf(x.pos(), "array length %s must be constant", &x) + } + return 0 + } + if !x.isInteger() { + check.errorf(x.pos(), "array length %s must be integer", &x) + return 0 + } + n, ok := exact.Int64Val(x.val) + if !ok || n < 0 { + check.errorf(x.pos(), "invalid array length %s", &x) + return 0 + } + return n +} + +func (check *Checker) collectParams(scope *Scope, list *ast.FieldList, variadicOk bool) (params []*Var, variadic bool) { + if list == nil { + return + } + + var named, anonymous bool + for i, field := range list.List { + ftype := field.Type + if t, _ := ftype.(*ast.Ellipsis); t != nil { + ftype = t.Elt + if variadicOk && i == len(list.List)-1 { + variadic = true + } else { + check.invalidAST(field.Pos(), "... not permitted") + // ignore ... and continue + } + } + typ := check.typ(ftype) + // The parser ensures that f.Tag is nil and we don't + // care if a constructed AST contains a non-nil tag. + if len(field.Names) > 0 { + // named parameter + for _, name := range field.Names { + if name.Name == "" { + check.invalidAST(name.Pos(), "anonymous parameter") + // ok to continue + } + par := NewParam(name.Pos(), check.pkg, name.Name, typ) + check.declare(scope, name, par, scope.pos) + params = append(params, par) + } + named = true + } else { + // anonymous parameter + par := NewParam(ftype.Pos(), check.pkg, "", typ) + check.recordImplicit(field, par) + params = append(params, par) + anonymous = true + } + } + + if named && anonymous { + check.invalidAST(list.Pos(), "list contains both named and anonymous parameters") + // ok to continue + } + + // For a variadic function, change the last parameter's type from T to []T. + if variadic && len(params) > 0 { + last := params[len(params)-1] + last.typ = &Slice{elem: last.typ} + } + + return +} + +func (check *Checker) declareInSet(oset *objset, pos token.Pos, obj Object) bool { + if alt := oset.insert(obj); alt != nil { + check.errorf(pos, "%s redeclared", obj.Name()) + check.reportAltDecl(alt) + return false + } + return true +} + +func (check *Checker) interfaceType(iface *Interface, ityp *ast.InterfaceType, def *Named, path []*TypeName) { + // empty interface: common case + if ityp.Methods == nil { + return + } + + // The parser ensures that field tags are nil and we don't + // care if a constructed AST contains non-nil tags. + + // use named receiver type if available (for better error messages) + var recvTyp Type = iface + if def != nil { + recvTyp = def + } + + // Phase 1: Collect explicitly declared methods, the corresponding + // signature (AST) expressions, and the list of embedded + // type (AST) expressions. Do not resolve signatures or + // embedded types yet to avoid cycles referring to this + // interface. + + var ( + mset objset + signatures []ast.Expr // list of corresponding method signatures + embedded []ast.Expr // list of embedded types + ) + for _, f := range ityp.Methods.List { + if len(f.Names) > 0 { + // The parser ensures that there's only one method + // and we don't care if a constructed AST has more. + name := f.Names[0] + pos := name.Pos() + // spec: "As with all method sets, in an interface type, + // each method must have a unique non-blank name." + if name.Name == "_" { + check.errorf(pos, "invalid method name _") + continue + } + // Don't type-check signature yet - use an + // empty signature now and update it later. + // Since we know the receiver, set it up now + // (required to avoid crash in ptrRecv; see + // e.g. test case for issue 6638). + // TODO(gri) Consider marking methods signatures + // as incomplete, for better error messages. See + // also the T4 and T5 tests in testdata/cycles2.src. + sig := new(Signature) + sig.recv = NewVar(pos, check.pkg, "", recvTyp) + m := NewFunc(pos, check.pkg, name.Name, sig) + if check.declareInSet(&mset, pos, m) { + iface.methods = append(iface.methods, m) + iface.allMethods = append(iface.allMethods, m) + signatures = append(signatures, f.Type) + check.recordDef(name, m) + } + } else { + // embedded type + embedded = append(embedded, f.Type) + } + } + + // Phase 2: Resolve embedded interfaces. Because an interface must not + // embed itself (directly or indirectly), each embedded interface + // can be fully resolved without depending on any method of this + // interface (if there is a cycle or another error, the embedded + // type resolves to an invalid type and is ignored). + // In particular, the list of methods for each embedded interface + // must be complete (it cannot depend on this interface), and so + // those methods can be added to the list of all methods of this + // interface. + + for _, e := range embedded { + pos := e.Pos() + typ := check.typExpr(e, nil, path) + // Determine underlying embedded (possibly incomplete) type + // by following its forward chain. + named, _ := typ.(*Named) + under := underlying(named) + embed, _ := under.(*Interface) + if embed == nil { + if typ != Typ[Invalid] { + check.errorf(pos, "%s is not an interface", typ) + } + continue + } + iface.embeddeds = append(iface.embeddeds, named) + // collect embedded methods + for _, m := range embed.allMethods { + if check.declareInSet(&mset, pos, m) { + iface.allMethods = append(iface.allMethods, m) + } + } + } + + // Phase 3: At this point all methods have been collected for this interface. + // It is now safe to type-check the signatures of all explicitly + // declared methods, even if they refer to this interface via a cycle + // and embed the methods of this interface in a parameter of interface + // type. + + for i, m := range iface.methods { + expr := signatures[i] + typ := check.typ(expr) + sig, _ := typ.(*Signature) + if sig == nil { + if typ != Typ[Invalid] { + check.invalidAST(expr.Pos(), "%s is not a method signature", typ) + } + continue // keep method with empty method signature + } + // update signature, but keep recv that was set up before + old := m.typ.(*Signature) + sig.recv = old.recv + *old = *sig // update signature (don't replace it!) + } + + // TODO(gri) The list of explicit methods is only sorted for now to + // produce the same Interface as NewInterface. We may be able to + // claim source order in the future. Revisit. + sort.Sort(byUniqueMethodName(iface.methods)) + + // TODO(gri) The list of embedded types is only sorted for now to + // produce the same Interface as NewInterface. We may be able to + // claim source order in the future. Revisit. + sort.Sort(byUniqueTypeName(iface.embeddeds)) + + sort.Sort(byUniqueMethodName(iface.allMethods)) +} + +// byUniqueTypeName named type lists can be sorted by their unique type names. +type byUniqueTypeName []*Named + +func (a byUniqueTypeName) Len() int { return len(a) } +func (a byUniqueTypeName) Less(i, j int) bool { return a[i].obj.Id() < a[j].obj.Id() } +func (a byUniqueTypeName) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +// byUniqueMethodName method lists can be sorted by their unique method names. +type byUniqueMethodName []*Func + +func (a byUniqueMethodName) Len() int { return len(a) } +func (a byUniqueMethodName) Less(i, j int) bool { return a[i].Id() < a[j].Id() } +func (a byUniqueMethodName) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +func (check *Checker) tag(t *ast.BasicLit) string { + if t != nil { + if t.Kind == token.STRING { + if val, err := strconv.Unquote(t.Value); err == nil { + return val + } + } + check.invalidAST(t.Pos(), "incorrect tag syntax: %q", t.Value) + } + return "" +} + +func (check *Checker) structType(styp *Struct, e *ast.StructType, path []*TypeName) { + list := e.Fields + if list == nil { + return + } + + // struct fields and tags + var fields []*Var + var tags []string + + // for double-declaration checks + var fset objset + + // current field typ and tag + var typ Type + var tag string + // anonymous != nil indicates an anonymous field. + add := func(field *ast.Field, ident *ast.Ident, anonymous *TypeName, pos token.Pos) { + if tag != "" && tags == nil { + tags = make([]string, len(fields)) + } + if tags != nil { + tags = append(tags, tag) + } + + name := ident.Name + fld := NewField(pos, check.pkg, name, typ, anonymous != nil) + // spec: "Within a struct, non-blank field names must be unique." + if name == "_" || check.declareInSet(&fset, pos, fld) { + fields = append(fields, fld) + check.recordDef(ident, fld) + } + if anonymous != nil { + check.recordUse(ident, anonymous) + } + } + + for _, f := range list.List { + typ = check.typExpr(f.Type, nil, path) + tag = check.tag(f.Tag) + if len(f.Names) > 0 { + // named fields + for _, name := range f.Names { + add(f, name, nil, name.Pos()) + } + } else { + // anonymous field + name := anonymousFieldIdent(f.Type) + pos := f.Type.Pos() + t, isPtr := deref(typ) + switch t := t.(type) { + case *Basic: + if t == Typ[Invalid] { + // error was reported before + continue + } + // unsafe.Pointer is treated like a regular pointer + if t.kind == UnsafePointer { + check.errorf(pos, "anonymous field type cannot be unsafe.Pointer") + continue + } + add(f, name, Universe.Lookup(t.name).(*TypeName), pos) + + case *Named: + // spec: "An embedded type must be specified as a type name + // T or as a pointer to a non-interface type name *T, and T + // itself may not be a pointer type." + switch u := t.underlying.(type) { + case *Basic: + // unsafe.Pointer is treated like a regular pointer + if u.kind == UnsafePointer { + check.errorf(pos, "anonymous field type cannot be unsafe.Pointer") + continue + } + case *Pointer: + check.errorf(pos, "anonymous field type cannot be a pointer") + continue + case *Interface: + if isPtr { + check.errorf(pos, "anonymous field type cannot be a pointer to an interface") + continue + } + } + add(f, name, t.obj, pos) + + default: + check.invalidAST(pos, "anonymous field type %s must be named", typ) + } + } + } + + styp.fields = fields + styp.tags = tags +} + +func anonymousFieldIdent(e ast.Expr) *ast.Ident { + switch e := e.(type) { + case *ast.Ident: + return e + case *ast.StarExpr: + return anonymousFieldIdent(e.X) + case *ast.SelectorExpr: + return e.Sel + } + return nil // invalid anonymous field +} diff --git a/vendor/golang.org/x/tools/go/types/universe.go b/vendor/golang.org/x/tools/go/types/universe.go new file mode 100644 index 0000000000..12a34ef853 --- /dev/null +++ b/vendor/golang.org/x/tools/go/types/universe.go @@ -0,0 +1,224 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file sets up the universe scope and the unsafe package. + +package types + +import ( + "go/token" + "strings" + + "golang.org/x/tools/go/exact" +) + +var ( + Universe *Scope + Unsafe *Package + universeIota *Const + universeByte *Basic // uint8 alias, but has name "byte" + universeRune *Basic // int32 alias, but has name "rune" +) + +var Typ = []*Basic{ + Invalid: {Invalid, 0, "invalid type"}, + + Bool: {Bool, IsBoolean, "bool"}, + Int: {Int, IsInteger, "int"}, + Int8: {Int8, IsInteger, "int8"}, + Int16: {Int16, IsInteger, "int16"}, + Int32: {Int32, IsInteger, "int32"}, + Int64: {Int64, IsInteger, "int64"}, + Uint: {Uint, IsInteger | IsUnsigned, "uint"}, + Uint8: {Uint8, IsInteger | IsUnsigned, "uint8"}, + Uint16: {Uint16, IsInteger | IsUnsigned, "uint16"}, + Uint32: {Uint32, IsInteger | IsUnsigned, "uint32"}, + Uint64: {Uint64, IsInteger | IsUnsigned, "uint64"}, + Uintptr: {Uintptr, IsInteger | IsUnsigned, "uintptr"}, + Float32: {Float32, IsFloat, "float32"}, + Float64: {Float64, IsFloat, "float64"}, + Complex64: {Complex64, IsComplex, "complex64"}, + Complex128: {Complex128, IsComplex, "complex128"}, + String: {String, IsString, "string"}, + UnsafePointer: {UnsafePointer, 0, "Pointer"}, + + UntypedBool: {UntypedBool, IsBoolean | IsUntyped, "untyped bool"}, + UntypedInt: {UntypedInt, IsInteger | IsUntyped, "untyped int"}, + UntypedRune: {UntypedRune, IsInteger | IsUntyped, "untyped rune"}, + UntypedFloat: {UntypedFloat, IsFloat | IsUntyped, "untyped float"}, + UntypedComplex: {UntypedComplex, IsComplex | IsUntyped, "untyped complex"}, + UntypedString: {UntypedString, IsString | IsUntyped, "untyped string"}, + UntypedNil: {UntypedNil, IsUntyped, "untyped nil"}, +} + +var aliases = [...]*Basic{ + {Byte, IsInteger | IsUnsigned, "byte"}, + {Rune, IsInteger, "rune"}, +} + +func defPredeclaredTypes() { + for _, t := range Typ { + def(NewTypeName(token.NoPos, nil, t.name, t)) + } + for _, t := range aliases { + def(NewTypeName(token.NoPos, nil, t.name, t)) + } + + // Error has a nil package in its qualified name since it is in no package + res := NewVar(token.NoPos, nil, "", Typ[String]) + sig := &Signature{results: NewTuple(res)} + err := NewFunc(token.NoPos, nil, "Error", sig) + typ := &Named{underlying: NewInterface([]*Func{err}, nil).Complete()} + sig.recv = NewVar(token.NoPos, nil, "", typ) + def(NewTypeName(token.NoPos, nil, "error", typ)) +} + +var predeclaredConsts = [...]struct { + name string + kind BasicKind + val exact.Value +}{ + {"true", UntypedBool, exact.MakeBool(true)}, + {"false", UntypedBool, exact.MakeBool(false)}, + {"iota", UntypedInt, exact.MakeInt64(0)}, +} + +func defPredeclaredConsts() { + for _, c := range predeclaredConsts { + def(NewConst(token.NoPos, nil, c.name, Typ[c.kind], c.val)) + } +} + +func defPredeclaredNil() { + def(&Nil{object{name: "nil", typ: Typ[UntypedNil]}}) +} + +// A builtinId is the id of a builtin function. +type builtinId int + +const ( + // universe scope + _Append builtinId = iota + _Cap + _Close + _Complex + _Copy + _Delete + _Imag + _Len + _Make + _New + _Panic + _Print + _Println + _Real + _Recover + + // package unsafe + _Alignof + _Offsetof + _Sizeof + + // testing support + _Assert + _Trace +) + +var predeclaredFuncs = [...]struct { + name string + nargs int + variadic bool + kind exprKind +}{ + _Append: {"append", 1, true, expression}, + _Cap: {"cap", 1, false, expression}, + _Close: {"close", 1, false, statement}, + _Complex: {"complex", 2, false, expression}, + _Copy: {"copy", 2, false, statement}, + _Delete: {"delete", 2, false, statement}, + _Imag: {"imag", 1, false, expression}, + _Len: {"len", 1, false, expression}, + _Make: {"make", 1, true, expression}, + _New: {"new", 1, false, expression}, + _Panic: {"panic", 1, false, statement}, + _Print: {"print", 0, true, statement}, + _Println: {"println", 0, true, statement}, + _Real: {"real", 1, false, expression}, + _Recover: {"recover", 0, false, statement}, + + _Alignof: {"Alignof", 1, false, expression}, + _Offsetof: {"Offsetof", 1, false, expression}, + _Sizeof: {"Sizeof", 1, false, expression}, + + _Assert: {"assert", 1, false, statement}, + _Trace: {"trace", 0, true, statement}, +} + +func defPredeclaredFuncs() { + for i := range predeclaredFuncs { + id := builtinId(i) + if id == _Assert || id == _Trace { + continue // only define these in testing environment + } + def(newBuiltin(id)) + } +} + +// DefPredeclaredTestFuncs defines the assert and trace built-ins. +// These built-ins are intended for debugging and testing of this +// package only. +func DefPredeclaredTestFuncs() { + if Universe.Lookup("assert") != nil { + return // already defined + } + def(newBuiltin(_Assert)) + def(newBuiltin(_Trace)) +} + +func init() { + Universe = NewScope(nil, token.NoPos, token.NoPos, "universe") + Unsafe = NewPackage("unsafe", "unsafe") + Unsafe.complete = true + + defPredeclaredTypes() + defPredeclaredConsts() + defPredeclaredNil() + defPredeclaredFuncs() + + universeIota = Universe.Lookup("iota").(*Const) + universeByte = Universe.Lookup("byte").(*TypeName).typ.(*Basic) + universeRune = Universe.Lookup("rune").(*TypeName).typ.(*Basic) +} + +// Objects with names containing blanks are internal and not entered into +// a scope. Objects with exported names are inserted in the unsafe package +// scope; other objects are inserted in the universe scope. +// +func def(obj Object) { + name := obj.Name() + if strings.Index(name, " ") >= 0 { + return // nothing to do + } + // fix Obj link for named types + if typ, ok := obj.Type().(*Named); ok { + typ.obj = obj.(*TypeName) + } + // exported identifiers go into package unsafe + scope := Universe + if obj.Exported() { + scope = Unsafe.scope + // set Pkg field + switch obj := obj.(type) { + case *TypeName: + obj.pkg = Unsafe + case *Builtin: + obj.pkg = Unsafe + default: + unreachable() + } + } + if scope.Insert(obj) != nil { + panic("internal error: double declaration") + } +} diff --git a/vendor/golang.org/x/tools/go/vcs/discovery.go b/vendor/golang.org/x/tools/go/vcs/discovery.go new file mode 100644 index 0000000000..f431dc1c5b --- /dev/null +++ b/vendor/golang.org/x/tools/go/vcs/discovery.go @@ -0,0 +1,76 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package vcs + +import ( + "encoding/xml" + "fmt" + "io" + "strings" +) + +// charsetReader returns a reader for the given charset. Currently +// it only supports UTF-8 and ASCII. Otherwise, it returns a meaningful +// error which is printed by go get, so the user can find why the package +// wasn't downloaded if the encoding is not supported. Note that, in +// order to reduce potential errors, ASCII is treated as UTF-8 (i.e. characters +// greater than 0x7f are not rejected). +func charsetReader(charset string, input io.Reader) (io.Reader, error) { + switch strings.ToLower(charset) { + case "ascii": + return input, nil + default: + return nil, fmt.Errorf("can't decode XML document using charset %q", charset) + } +} + +// parseMetaGoImports returns meta imports from the HTML in r. +// Parsing ends at the end of the section or the beginning of the . +func parseMetaGoImports(r io.Reader) (imports []metaImport, err error) { + d := xml.NewDecoder(r) + d.CharsetReader = charsetReader + d.Strict = false + var t xml.Token + for { + t, err = d.Token() + if err != nil { + if err == io.EOF || len(imports) > 0 { + err = nil + } + return + } + if e, ok := t.(xml.StartElement); ok && strings.EqualFold(e.Name.Local, "body") { + return + } + if e, ok := t.(xml.EndElement); ok && strings.EqualFold(e.Name.Local, "head") { + return + } + e, ok := t.(xml.StartElement) + if !ok || !strings.EqualFold(e.Name.Local, "meta") { + continue + } + if attrValue(e.Attr, "name") != "go-import" { + continue + } + if f := strings.Fields(attrValue(e.Attr, "content")); len(f) == 3 { + imports = append(imports, metaImport{ + Prefix: f[0], + VCS: f[1], + RepoRoot: f[2], + }) + } + } +} + +// attrValue returns the attribute value for the case-insensitive key +// `name', or the empty string if nothing is found. +func attrValue(attrs []xml.Attr, name string) string { + for _, a := range attrs { + if strings.EqualFold(a.Name.Local, name) { + return a.Value + } + } + return "" +} diff --git a/vendor/golang.org/x/tools/go/vcs/env.go b/vendor/golang.org/x/tools/go/vcs/env.go new file mode 100644 index 0000000000..e846f5b3b8 --- /dev/null +++ b/vendor/golang.org/x/tools/go/vcs/env.go @@ -0,0 +1,39 @@ +// Copyright 2013 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 vcs + +import ( + "os" + "strings" +) + +// envForDir returns a copy of the environment +// suitable for running in the given directory. +// The environment is the current process's environment +// but with an updated $PWD, so that an os.Getwd in the +// child will be faster. +func envForDir(dir string) []string { + env := os.Environ() + // Internally we only use rooted paths, so dir is rooted. + // Even if dir is not rooted, no harm done. + return mergeEnvLists([]string{"PWD=" + dir}, env) +} + +// mergeEnvLists merges the two environment lists such that +// variables with the same name in "in" replace those in "out". +func mergeEnvLists(in, out []string) []string { +NextVar: + for _, inkv := range in { + k := strings.SplitAfterN(inkv, "=", 2)[0] + for i, outkv := range out { + if strings.HasPrefix(outkv, k) { + out[i] = inkv + continue NextVar + } + } + out = append(out, inkv) + } + return out +} diff --git a/vendor/golang.org/x/tools/go/vcs/http.go b/vendor/golang.org/x/tools/go/vcs/http.go new file mode 100644 index 0000000000..96188185cb --- /dev/null +++ b/vendor/golang.org/x/tools/go/vcs/http.go @@ -0,0 +1,80 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package vcs + +import ( + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "net/url" +) + +// httpClient is the default HTTP client, but a variable so it can be +// changed by tests, without modifying http.DefaultClient. +var httpClient = http.DefaultClient + +// httpGET returns the data from an HTTP GET request for the given URL. +func httpGET(url string) ([]byte, error) { + resp, err := httpClient.Get(url) + if err != nil { + return nil, err + } + defer resp.Body.Close() + if resp.StatusCode != 200 { + return nil, fmt.Errorf("%s: %s", url, resp.Status) + } + b, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("%s: %v", url, err) + } + return b, nil +} + +// httpsOrHTTP returns the body of either the importPath's +// https resource or, if unavailable, the http resource. +func httpsOrHTTP(importPath string) (urlStr string, body io.ReadCloser, err error) { + fetch := func(scheme string) (urlStr string, res *http.Response, err error) { + u, err := url.Parse(scheme + "://" + importPath) + if err != nil { + return "", nil, err + } + u.RawQuery = "go-get=1" + urlStr = u.String() + if Verbose { + log.Printf("Fetching %s", urlStr) + } + res, err = httpClient.Get(urlStr) + return + } + closeBody := func(res *http.Response) { + if res != nil { + res.Body.Close() + } + } + urlStr, res, err := fetch("https") + if err != nil || res.StatusCode != 200 { + if Verbose { + if err != nil { + log.Printf("https fetch failed.") + } else { + log.Printf("ignoring https fetch with status code %d", res.StatusCode) + } + } + closeBody(res) + urlStr, res, err = fetch("http") + } + if err != nil { + closeBody(res) + return "", nil, err + } + // Note: accepting a non-200 OK here, so people can serve a + // meta import in their http 404 page. + if Verbose { + log.Printf("Parsing meta tags from %s (status code %d)", urlStr, res.StatusCode) + } + return urlStr, res.Body, nil +} diff --git a/vendor/golang.org/x/tools/go/vcs/vcs.go b/vendor/golang.org/x/tools/go/vcs/vcs.go new file mode 100644 index 0000000000..f0aed571f2 --- /dev/null +++ b/vendor/golang.org/x/tools/go/vcs/vcs.go @@ -0,0 +1,700 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package vcs // import "golang.org/x/tools/go/vcs" + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "log" + "os" + "os/exec" + "path/filepath" + "regexp" + "strconv" + "strings" +) + +// Verbose enables verbose operation logging. +var Verbose bool + +// ShowCmd controls whether VCS commands are printed. +var ShowCmd bool + +// A Cmd describes how to use a version control system +// like Mercurial, Git, or Subversion. +type Cmd struct { + Name string + Cmd string // name of binary to invoke command + + CreateCmd string // command to download a fresh copy of a repository + DownloadCmd string // command to download updates into an existing repository + + TagCmd []TagCmd // commands to list tags + TagLookupCmd []TagCmd // commands to lookup tags before running tagSyncCmd + TagSyncCmd string // command to sync to specific tag + TagSyncDefault string // command to sync to default tag + + LogCmd string // command to list repository changelogs in an XML format + + Scheme []string + PingCmd string +} + +// A TagCmd describes a command to list available tags +// that can be passed to Cmd.TagSyncCmd. +type TagCmd struct { + Cmd string // command to list tags + Pattern string // regexp to extract tags from list +} + +// vcsList lists the known version control systems +var vcsList = []*Cmd{ + vcsHg, + vcsGit, + vcsSvn, + vcsBzr, +} + +// ByCmd returns the version control system for the given +// command name (hg, git, svn, bzr). +func ByCmd(cmd string) *Cmd { + for _, vcs := range vcsList { + if vcs.Cmd == cmd { + return vcs + } + } + return nil +} + +// vcsHg describes how to use Mercurial. +var vcsHg = &Cmd{ + Name: "Mercurial", + Cmd: "hg", + + CreateCmd: "clone -U {repo} {dir}", + DownloadCmd: "pull", + + // We allow both tag and branch names as 'tags' + // for selecting a version. This lets people have + // a go.release.r60 branch and a go1 branch + // and make changes in both, without constantly + // editing .hgtags. + TagCmd: []TagCmd{ + {"tags", `^(\S+)`}, + {"branches", `^(\S+)`}, + }, + TagSyncCmd: "update -r {tag}", + TagSyncDefault: "update default", + + LogCmd: "log --encoding=utf-8 --limit={limit} --template={template}", + + Scheme: []string{"https", "http", "ssh"}, + PingCmd: "identify {scheme}://{repo}", +} + +// vcsGit describes how to use Git. +var vcsGit = &Cmd{ + Name: "Git", + Cmd: "git", + + CreateCmd: "clone {repo} {dir}", + DownloadCmd: "pull --ff-only", + + TagCmd: []TagCmd{ + // tags/xxx matches a git tag named xxx + // origin/xxx matches a git branch named xxx on the default remote repository + {"show-ref", `(?:tags|origin)/(\S+)$`}, + }, + TagLookupCmd: []TagCmd{ + {"show-ref tags/{tag} origin/{tag}", `((?:tags|origin)/\S+)$`}, + }, + TagSyncCmd: "checkout {tag}", + TagSyncDefault: "checkout master", + + Scheme: []string{"git", "https", "http", "git+ssh"}, + PingCmd: "ls-remote {scheme}://{repo}", +} + +// vcsBzr describes how to use Bazaar. +var vcsBzr = &Cmd{ + Name: "Bazaar", + Cmd: "bzr", + + CreateCmd: "branch {repo} {dir}", + + // Without --overwrite bzr will not pull tags that changed. + // Replace by --overwrite-tags after http://pad.lv/681792 goes in. + DownloadCmd: "pull --overwrite", + + TagCmd: []TagCmd{{"tags", `^(\S+)`}}, + TagSyncCmd: "update -r {tag}", + TagSyncDefault: "update -r revno:-1", + + Scheme: []string{"https", "http", "bzr", "bzr+ssh"}, + PingCmd: "info {scheme}://{repo}", +} + +// vcsSvn describes how to use Subversion. +var vcsSvn = &Cmd{ + Name: "Subversion", + Cmd: "svn", + + CreateCmd: "checkout {repo} {dir}", + DownloadCmd: "update", + + // There is no tag command in subversion. + // The branch information is all in the path names. + + LogCmd: "log --xml --limit={limit}", + + Scheme: []string{"https", "http", "svn", "svn+ssh"}, + PingCmd: "info {scheme}://{repo}", +} + +func (v *Cmd) String() string { + return v.Name +} + +// run runs the command line cmd in the given directory. +// keyval is a list of key, value pairs. run expands +// instances of {key} in cmd into value, but only after +// splitting cmd into individual arguments. +// If an error occurs, run prints the command line and the +// command's combined stdout+stderr to standard error. +// Otherwise run discards the command's output. +func (v *Cmd) run(dir string, cmd string, keyval ...string) error { + _, err := v.run1(dir, cmd, keyval, true) + return err +} + +// runVerboseOnly is like run but only generates error output to standard error in verbose mode. +func (v *Cmd) runVerboseOnly(dir string, cmd string, keyval ...string) error { + _, err := v.run1(dir, cmd, keyval, false) + return err +} + +// runOutput is like run but returns the output of the command. +func (v *Cmd) runOutput(dir string, cmd string, keyval ...string) ([]byte, error) { + return v.run1(dir, cmd, keyval, true) +} + +// run1 is the generalized implementation of run and runOutput. +func (v *Cmd) run1(dir string, cmdline string, keyval []string, verbose bool) ([]byte, error) { + m := make(map[string]string) + for i := 0; i < len(keyval); i += 2 { + m[keyval[i]] = keyval[i+1] + } + args := strings.Fields(cmdline) + for i, arg := range args { + args[i] = expand(m, arg) + } + + _, err := exec.LookPath(v.Cmd) + if err != nil { + fmt.Fprintf(os.Stderr, + "go: missing %s command. See http://golang.org/s/gogetcmd\n", + v.Name) + return nil, err + } + + cmd := exec.Command(v.Cmd, args...) + cmd.Dir = dir + cmd.Env = envForDir(cmd.Dir) + if ShowCmd { + fmt.Printf("cd %s\n", dir) + fmt.Printf("%s %s\n", v.Cmd, strings.Join(args, " ")) + } + var buf bytes.Buffer + cmd.Stdout = &buf + cmd.Stderr = &buf + err = cmd.Run() + out := buf.Bytes() + if err != nil { + if verbose || Verbose { + fmt.Fprintf(os.Stderr, "# cd %s; %s %s\n", dir, v.Cmd, strings.Join(args, " ")) + os.Stderr.Write(out) + } + return nil, err + } + return out, nil +} + +// Ping pings the repo to determine if scheme used is valid. +// This repo must be pingable with this scheme and VCS. +func (v *Cmd) Ping(scheme, repo string) error { + return v.runVerboseOnly(".", v.PingCmd, "scheme", scheme, "repo", repo) +} + +// Create creates a new copy of repo in dir. +// The parent of dir must exist; dir must not. +func (v *Cmd) Create(dir, repo string) error { + return v.run(".", v.CreateCmd, "dir", dir, "repo", repo) +} + +// CreateAtRev creates a new copy of repo in dir at revision rev. +// The parent of dir must exist; dir must not. +// rev must be a valid revision in repo. +func (v *Cmd) CreateAtRev(dir, repo, rev string) error { + if err := v.Create(dir, repo); err != nil { + return err + } + return v.run(dir, v.TagSyncCmd, "tag", rev) +} + +// Download downloads any new changes for the repo in dir. +// dir must be a valid VCS repo compatible with v. +func (v *Cmd) Download(dir string) error { + return v.run(dir, v.DownloadCmd) +} + +// Tags returns the list of available tags for the repo in dir. +// dir must be a valid VCS repo compatible with v. +func (v *Cmd) Tags(dir string) ([]string, error) { + var tags []string + for _, tc := range v.TagCmd { + out, err := v.runOutput(dir, tc.Cmd) + if err != nil { + return nil, err + } + re := regexp.MustCompile(`(?m-s)` + tc.Pattern) + for _, m := range re.FindAllStringSubmatch(string(out), -1) { + tags = append(tags, m[1]) + } + } + return tags, nil +} + +// TagSync syncs the repo in dir to the named tag, +// which either is a tag returned by tags or is v.TagDefault. +// dir must be a valid VCS repo compatible with v and the tag must exist. +func (v *Cmd) TagSync(dir, tag string) error { + if v.TagSyncCmd == "" { + return nil + } + if tag != "" { + for _, tc := range v.TagLookupCmd { + out, err := v.runOutput(dir, tc.Cmd, "tag", tag) + if err != nil { + return err + } + re := regexp.MustCompile(`(?m-s)` + tc.Pattern) + m := re.FindStringSubmatch(string(out)) + if len(m) > 1 { + tag = m[1] + break + } + } + } + if tag == "" && v.TagSyncDefault != "" { + return v.run(dir, v.TagSyncDefault) + } + return v.run(dir, v.TagSyncCmd, "tag", tag) +} + +// Log logs the changes for the repo in dir. +// dir must be a valid VCS repo compatible with v. +func (v *Cmd) Log(dir, logTemplate string) ([]byte, error) { + if err := v.Download(dir); err != nil { + return []byte{}, err + } + + const N = 50 // how many revisions to grab + return v.runOutput(dir, v.LogCmd, "limit", strconv.Itoa(N), "template", logTemplate) +} + +// LogAtRev logs the change for repo in dir at the rev revision. +// dir must be a valid VCS repo compatible with v. +// rev must be a valid revision for the repo in dir. +func (v *Cmd) LogAtRev(dir, rev, logTemplate string) ([]byte, error) { + if err := v.Download(dir); err != nil { + return []byte{}, err + } + + // Append revision flag to LogCmd. + logAtRevCmd := v.LogCmd + " --rev=" + rev + return v.runOutput(dir, logAtRevCmd, "limit", strconv.Itoa(1), "template", logTemplate) +} + +// A vcsPath describes how to convert an import path into a +// version control system and repository name. +type vcsPath struct { + prefix string // prefix this description applies to + re string // pattern for import path + repo string // repository to use (expand with match of re) + vcs string // version control system to use (expand with match of re) + check func(match map[string]string) error // additional checks + ping bool // ping for scheme to use to download repo + + regexp *regexp.Regexp // cached compiled form of re +} + +// FromDir inspects dir and its parents to determine the +// version control system and code repository to use. +// On return, root is the import path +// corresponding to the root of the repository. +func FromDir(dir, srcRoot string) (vcs *Cmd, root string, err error) { + // Clean and double-check that dir is in (a subdirectory of) srcRoot. + dir = filepath.Clean(dir) + srcRoot = filepath.Clean(srcRoot) + if len(dir) <= len(srcRoot) || dir[len(srcRoot)] != filepath.Separator { + return nil, "", fmt.Errorf("directory %q is outside source root %q", dir, srcRoot) + } + + for len(dir) > len(srcRoot) { + for _, vcs := range vcsList { + if fi, err := os.Stat(filepath.Join(dir, "."+vcs.Cmd)); err == nil && fi.IsDir() { + return vcs, filepath.ToSlash(dir[len(srcRoot)+1:]), nil + } + } + + // Move to parent. + ndir := filepath.Dir(dir) + if len(ndir) >= len(dir) { + // Shouldn't happen, but just in case, stop. + break + } + dir = ndir + } + + return nil, "", fmt.Errorf("directory %q is not using a known version control system", dir) +} + +// RepoRoot represents a version control system, a repo, and a root of +// where to put it on disk. +type RepoRoot struct { + VCS *Cmd + + // Repo is the repository URL, including scheme. + Repo string + + // Root is the import path corresponding to the root of the + // repository. + Root string +} + +// RepoRootForImportPath analyzes importPath to determine the +// version control system, and code repository to use. +func RepoRootForImportPath(importPath string, verbose bool) (*RepoRoot, error) { + rr, err := RepoRootForImportPathStatic(importPath, "") + if err == errUnknownSite { + rr, err = RepoRootForImportDynamic(importPath, verbose) + + // RepoRootForImportDynamic returns error detail + // that is irrelevant if the user didn't intend to use a + // dynamic import in the first place. + // Squelch it. + if err != nil { + if Verbose { + log.Printf("import %q: %v", importPath, err) + } + err = fmt.Errorf("unrecognized import path %q", importPath) + } + } + + if err == nil && strings.Contains(importPath, "...") && strings.Contains(rr.Root, "...") { + // Do not allow wildcards in the repo root. + rr = nil + err = fmt.Errorf("cannot expand ... in %q", importPath) + } + return rr, err +} + +var errUnknownSite = errors.New("dynamic lookup required to find mapping") + +// RepoRootForImportPathStatic attempts to map importPath to a +// RepoRoot using the commonly-used VCS hosting sites in vcsPaths +// (github.com/user/dir), or from a fully-qualified importPath already +// containing its VCS type (foo.com/repo.git/dir) +// +// If scheme is non-empty, that scheme is forced. +func RepoRootForImportPathStatic(importPath, scheme string) (*RepoRoot, error) { + if strings.Contains(importPath, "://") { + return nil, fmt.Errorf("invalid import path %q", importPath) + } + for _, srv := range vcsPaths { + if !strings.HasPrefix(importPath, srv.prefix) { + continue + } + m := srv.regexp.FindStringSubmatch(importPath) + if m == nil { + if srv.prefix != "" { + return nil, fmt.Errorf("invalid %s import path %q", srv.prefix, importPath) + } + continue + } + + // Build map of named subexpression matches for expand. + match := map[string]string{ + "prefix": srv.prefix, + "import": importPath, + } + for i, name := range srv.regexp.SubexpNames() { + if name != "" && match[name] == "" { + match[name] = m[i] + } + } + if srv.vcs != "" { + match["vcs"] = expand(match, srv.vcs) + } + if srv.repo != "" { + match["repo"] = expand(match, srv.repo) + } + if srv.check != nil { + if err := srv.check(match); err != nil { + return nil, err + } + } + vcs := ByCmd(match["vcs"]) + if vcs == nil { + return nil, fmt.Errorf("unknown version control system %q", match["vcs"]) + } + if srv.ping { + if scheme != "" { + match["repo"] = scheme + "://" + match["repo"] + } else { + for _, scheme := range vcs.Scheme { + if vcs.Ping(scheme, match["repo"]) == nil { + match["repo"] = scheme + "://" + match["repo"] + break + } + } + } + } + rr := &RepoRoot{ + VCS: vcs, + Repo: match["repo"], + Root: match["root"], + } + return rr, nil + } + return nil, errUnknownSite +} + +// RepoRootForImportDynamic finds a *RepoRoot for a custom domain that's not +// statically known by RepoRootForImportPathStatic. +// +// This handles custom import paths like "name.tld/pkg/foo" or just "name.tld". +func RepoRootForImportDynamic(importPath string, verbose bool) (*RepoRoot, error) { + slash := strings.Index(importPath, "/") + if slash < 0 { + slash = len(importPath) + } + host := importPath[:slash] + if !strings.Contains(host, ".") { + return nil, errors.New("import path doesn't contain a hostname") + } + urlStr, body, err := httpsOrHTTP(importPath) + if err != nil { + return nil, fmt.Errorf("http/https fetch: %v", err) + } + defer body.Close() + imports, err := parseMetaGoImports(body) + if err != nil { + return nil, fmt.Errorf("parsing %s: %v", importPath, err) + } + metaImport, err := matchGoImport(imports, importPath) + if err != nil { + if err != errNoMatch { + return nil, fmt.Errorf("parse %s: %v", urlStr, err) + } + return nil, fmt.Errorf("parse %s: no go-import meta tags", urlStr) + } + if verbose { + log.Printf("get %q: found meta tag %#v at %s", importPath, metaImport, urlStr) + } + // If the import was "uni.edu/bob/project", which said the + // prefix was "uni.edu" and the RepoRoot was "evilroot.com", + // make sure we don't trust Bob and check out evilroot.com to + // "uni.edu" yet (possibly overwriting/preempting another + // non-evil student). Instead, first verify the root and see + // if it matches Bob's claim. + if metaImport.Prefix != importPath { + if verbose { + log.Printf("get %q: verifying non-authoritative meta tag", importPath) + } + urlStr0 := urlStr + urlStr, body, err = httpsOrHTTP(metaImport.Prefix) + if err != nil { + return nil, fmt.Errorf("fetch %s: %v", urlStr, err) + } + imports, err := parseMetaGoImports(body) + if err != nil { + return nil, fmt.Errorf("parsing %s: %v", importPath, err) + } + if len(imports) == 0 { + return nil, fmt.Errorf("fetch %s: no go-import meta tag", urlStr) + } + metaImport2, err := matchGoImport(imports, importPath) + if err != nil || metaImport != metaImport2 { + return nil, fmt.Errorf("%s and %s disagree about go-import for %s", urlStr0, urlStr, metaImport.Prefix) + } + } + + if !strings.Contains(metaImport.RepoRoot, "://") { + return nil, fmt.Errorf("%s: invalid repo root %q; no scheme", urlStr, metaImport.RepoRoot) + } + rr := &RepoRoot{ + VCS: ByCmd(metaImport.VCS), + Repo: metaImport.RepoRoot, + Root: metaImport.Prefix, + } + if rr.VCS == nil { + return nil, fmt.Errorf("%s: unknown vcs %q", urlStr, metaImport.VCS) + } + return rr, nil +} + +// metaImport represents the parsed tags from HTML files. +type metaImport struct { + Prefix, VCS, RepoRoot string +} + +// errNoMatch is returned from matchGoImport when there's no applicable match. +var errNoMatch = errors.New("no import match") + +// matchGoImport returns the metaImport from imports matching importPath. +// An error is returned if there are multiple matches. +// errNoMatch is returned if none match. +func matchGoImport(imports []metaImport, importPath string) (_ metaImport, err error) { + match := -1 + for i, im := range imports { + if !strings.HasPrefix(importPath, im.Prefix) { + continue + } + if match != -1 { + err = fmt.Errorf("multiple meta tags match import path %q", importPath) + return + } + match = i + } + if match == -1 { + err = errNoMatch + return + } + return imports[match], nil +} + +// expand rewrites s to replace {k} with match[k] for each key k in match. +func expand(match map[string]string, s string) string { + for k, v := range match { + s = strings.Replace(s, "{"+k+"}", v, -1) + } + return s +} + +// vcsPaths lists the known vcs paths. +var vcsPaths = []*vcsPath{ + // go.googlesource.com + { + prefix: "go.googlesource.com", + re: `^(?Pgo\.googlesource\.com/[A-Za-z0-9_.\-]+/?)$`, + vcs: "git", + repo: "https://{root}", + check: noVCSSuffix, + }, + + // Github + { + prefix: "github.com/", + re: `^(?Pgithub\.com/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(/[A-Za-z0-9_.\-]+)*$`, + vcs: "git", + repo: "https://{root}", + check: noVCSSuffix, + }, + + // Bitbucket + { + prefix: "bitbucket.org/", + re: `^(?Pbitbucket\.org/(?P[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*$`, + repo: "https://{root}", + check: bitbucketVCS, + }, + + // Launchpad + { + prefix: "launchpad.net/", + re: `^(?Plaunchpad\.net/((?P[A-Za-z0-9_.\-]+)(?P/[A-Za-z0-9_.\-]+)?|~[A-Za-z0-9_.\-]+/(\+junk|[A-Za-z0-9_.\-]+)/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*$`, + vcs: "bzr", + repo: "https://{root}", + check: launchpadVCS, + }, + + // General syntax for any server. + { + re: `^(?P(?P([a-z0-9.\-]+\.)+[a-z0-9.\-]+(:[0-9]+)?/[A-Za-z0-9_.\-/]*?)\.(?Pbzr|git|hg|svn))(/[A-Za-z0-9_.\-]+)*$`, + ping: true, + }, +} + +func init() { + // fill in cached regexps. + // Doing this eagerly discovers invalid regexp syntax + // without having to run a command that needs that regexp. + for _, srv := range vcsPaths { + srv.regexp = regexp.MustCompile(srv.re) + } +} + +// noVCSSuffix checks that the repository name does not +// end in .foo for any version control system foo. +// The usual culprit is ".git". +func noVCSSuffix(match map[string]string) error { + repo := match["repo"] + for _, vcs := range vcsList { + if strings.HasSuffix(repo, "."+vcs.Cmd) { + return fmt.Errorf("invalid version control suffix in %s path", match["prefix"]) + } + } + return nil +} + +// bitbucketVCS determines the version control system for a +// Bitbucket repository, by using the Bitbucket API. +func bitbucketVCS(match map[string]string) error { + if err := noVCSSuffix(match); err != nil { + return err + } + + var resp struct { + SCM string `json:"scm"` + } + url := expand(match, "https://api.bitbucket.org/1.0/repositories/{bitname}") + data, err := httpGET(url) + if err != nil { + return err + } + if err := json.Unmarshal(data, &resp); err != nil { + return fmt.Errorf("decoding %s: %v", url, err) + } + + if ByCmd(resp.SCM) != nil { + match["vcs"] = resp.SCM + if resp.SCM == "git" { + match["repo"] += ".git" + } + return nil + } + + return fmt.Errorf("unable to detect version control system for bitbucket.org/ path") +} + +// launchpadVCS solves the ambiguity for "lp.net/project/foo". In this case, +// "foo" could be a series name registered in Launchpad with its own branch, +// and it could also be the name of a directory within the main project +// branch one level up. +func launchpadVCS(match map[string]string) error { + if match["project"] == "" || match["series"] == "" { + return nil + } + _, err := httpGET(expand(match, "https://code.launchpad.net/{project}{series}/.bzr/branch-format")) + if err != nil { + match["root"] = expand(match, "launchpad.net/{project}") + match["repo"] = expand(match, "https://{root}") + } + return nil +} diff --git a/vendor/golang.org/x/tools/go/vcs/vcs_test.go b/vendor/golang.org/x/tools/go/vcs/vcs_test.go new file mode 100644 index 0000000000..2d4bcda39b --- /dev/null +++ b/vendor/golang.org/x/tools/go/vcs/vcs_test.go @@ -0,0 +1,135 @@ +// Copyright 2013 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 vcs + +import ( + "io/ioutil" + "os" + pathpkg "path" + "path/filepath" + "reflect" + "runtime" + "strings" + "testing" +) + +// Test that RepoRootForImportPath creates the correct RepoRoot for a given importPath. +// TODO(cmang): Add tests for SVN and BZR. +func TestRepoRootForImportPath(t *testing.T) { + if runtime.GOOS == "android" { + t.Skipf("incomplete source tree on %s", runtime.GOOS) + } + + tests := []struct { + path string + want *RepoRoot + }{ + { + "github.com/golang/groupcache", + &RepoRoot{ + VCS: vcsGit, + Repo: "https://github.com/golang/groupcache", + }, + }, + } + + for _, test := range tests { + got, err := RepoRootForImportPath(test.path, false) + if err != nil { + t.Errorf("RepoRootForImport(%q): %v", test.path, err) + continue + } + want := test.want + if got.VCS.Name != want.VCS.Name || got.Repo != want.Repo { + t.Errorf("RepoRootForImport(%q) = VCS(%s) Repo(%s), want VCS(%s) Repo(%s)", test.path, got.VCS, got.Repo, want.VCS, want.Repo) + } + } +} + +// Test that FromDir correctly inspects a given directory and returns the right VCS and root. +func TestFromDir(t *testing.T) { + type testStruct struct { + path string + want *RepoRoot + } + + tests := make([]testStruct, len(vcsList)) + tempDir, err := ioutil.TempDir("", "vcstest") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + for i, vcs := range vcsList { + tests[i] = testStruct{ + path: filepath.Join(tempDir, "example.com", vcs.Name, "."+vcs.Cmd), + want: &RepoRoot{ + VCS: vcs, + Root: pathpkg.Join("example.com", vcs.Name), + }, + } + } + + for _, test := range tests { + os.MkdirAll(test.path, 0755) + var ( + got = new(RepoRoot) + err error + ) + got.VCS, got.Root, err = FromDir(test.path, tempDir) + if err != nil { + t.Errorf("FromDir(%q, %q): %v", test.path, tempDir, err) + os.RemoveAll(test.path) + continue + } + want := test.want + if got.VCS.Name != want.VCS.Name || got.Root != want.Root { + t.Errorf("FromDir(%q, %q) = VCS(%s) Root(%s), want VCS(%s) Root(%s)", test.path, tempDir, got.VCS, got.Root, want.VCS, want.Root) + } + os.RemoveAll(test.path) + } +} + +var parseMetaGoImportsTests = []struct { + in string + out []metaImport +}{ + { + ``, + []metaImport{{"foo/bar", "git", "https://github.com/rsc/foo/bar"}}, + }, + { + ` + `, + []metaImport{ + {"foo/bar", "git", "https://github.com/rsc/foo/bar"}, + {"baz/quux", "git", "http://github.com/rsc/baz/quux"}, + }, + }, + { + ` + + `, + []metaImport{{"foo/bar", "git", "https://github.com/rsc/foo/bar"}}, + }, + { + ` + `, + []metaImport{{"foo/bar", "git", "https://github.com/rsc/foo/bar"}}, + }, +} + +func TestParseMetaGoImports(t *testing.T) { + for i, tt := range parseMetaGoImportsTests { + out, err := parseMetaGoImports(strings.NewReader(tt.in)) + if err != nil { + t.Errorf("test#%d: %v", i, err) + continue + } + if !reflect.DeepEqual(out, tt.out) { + t.Errorf("test#%d:\n\thave %q\n\twant %q", i, out, tt.out) + } + } +} diff --git a/vendor/golang.org/x/tools/godoc/analysis/README b/vendor/golang.org/x/tools/godoc/analysis/README new file mode 100644 index 0000000000..411af1cbaf --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/analysis/README @@ -0,0 +1,111 @@ + +Type and Pointer Analysis to-do list +==================================== + +Alan Donovan + + +Overall design +-------------- + +We should re-run the type and pointer analyses periodically, +as we do with the indexer. + +Version skew: how to mitigate the bad effects of stale URLs in old pages? +We could record the file's length/CRC32/mtime in the go/loader, and +refuse to decorate it with links unless they match at serving time. + +Use the VFS mechanism when (a) enumerating packages and (b) loading +them. (Requires planned changes to go/loader.) + +Future work: shard this using map/reduce for larger corpora. + +Testing: how does one test that a web page "looks right"? + + +Bugs +---- + +(*ssa.Program).Create requires transitively error-free packages. We +can make this more robust by making the requirement transitively free +of "hard" errors; soft errors are fine. + +Markup of compiler errors is slightly buggy because they overlap with +other selections (e.g. Idents). Fix. + + +User Interface +-------------- + +CALLGRAPH: +- Add a search box: given a search node, expand path from each entry + point to it. +- Cause hovering over a given node to highlight that node, and all + nodes that are logically identical to it. +- Initially expand the callgraph trees (but not their toggle divs). + +CALLEES: +- The '(' links are not very discoverable. Highlight them? + +Type info: +- In the source viewer's lower pane, use a toggle div around the + IMPLEMENTS and METHODSETS lists, like we do in the pacakge view. + Only expand them initially if short. +- Include IMPLEMENTS and METHOD SETS information in search index. +- URLs in IMPLEMENTS/METHOD SETS always link to source, even from the + package docs view. This makes sense for links to non-exported + types, but links to exported types and funcs should probably go to + other package docs. +- Suppress toggle divs for empty method sets. + +Misc: +- The [X] button in the lower pane is subject to scrolling. +- Should the lower pane be floating? An iframe? + When we change document.location by clicking on a link, it will go away. + How do we prevent that (a la Gmail's chat windows)? +- Progress/status: for each file, display its analysis status, one of: + - not in analysis scope + - type analysis running... + - type analysis complete + (+ optionally: there were type errors in this file) + And if PTA requested: + - type analysis complete; PTA not attempted due to type errors + - PTA running... + - PTA complete +- Scroll the selection into view, e.g. the vertical center, or better + still, under the pointer (assuming we have a mouse). + + +More features +------------- + +Display the REFERRERS relation? (Useful but potentially large.) + +Display the INSTANTIATIONS relation? i.e. given a type T, show the set of +syntactic constructs that can instantiate it: + var x T + x := T{...} + x = new(T) + x = make([]T, n) + etc + + all INSTANTIATIONS of all S defined as struct{t T} or [n]T +(Potentially a lot of information.) +(Add this to oracle too.) + + +Optimisations +------------- + +Each call to addLink takes a (per-file) lock. The locking is +fine-grained so server latency isn't terrible, but overall it makes +the link computation quite slow. Batch update might be better. + +Memory usage is now about 1.5GB for GOROOT + go.tools. It used to be 700MB. + +Optimize for time and space. The main slowdown is the network I/O +time caused by an increase in page size of about 3x: about 2x from +HTML, and 0.7--2.1x from JSON (unindented vs indented). The JSON +contains a lot of filenames (e.g. 820 copies of 16 distinct +filenames). 20% of the HTML is L%d spans (now disabled). The HTML +also contains lots of tooltips for long struct/interface types. +De-dup or just abbreviate? The actual formatting is very fast. diff --git a/vendor/golang.org/x/tools/godoc/analysis/analysis.go b/vendor/golang.org/x/tools/godoc/analysis/analysis.go new file mode 100644 index 0000000000..633428ca19 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/analysis/analysis.go @@ -0,0 +1,621 @@ +// 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 go1.5 + +// Package analysis performs type and pointer analysis +// and generates mark-up for the Go source view. +// +// The Run method populates a Result object by running type and +// (optionally) pointer analysis. The Result object is thread-safe +// and at all times may be accessed by a serving thread, even as it is +// progressively populated as analysis facts are derived. +// +// The Result is a mapping from each godoc file URL +// (e.g. /src/fmt/print.go) to information about that file. The +// information is a list of HTML markup links and a JSON array of +// structured data values. Some of the links call client-side +// JavaScript functions that index this array. +// +// The analysis computes mark-up for the following relations: +// +// IMPORTS: for each ast.ImportSpec, the package that it denotes. +// +// RESOLUTION: for each ast.Ident, its kind and type, and the location +// of its definition. +// +// METHOD SETS, IMPLEMENTS: for each ast.Ident defining a named type, +// its method-set, the set of interfaces it implements or is +// implemented by, and its size/align values. +// +// CALLERS, CALLEES: for each function declaration ('func' token), its +// callers, and for each call-site ('(' token), its callees. +// +// CALLGRAPH: the package docs include an interactive viewer for the +// intra-package call graph of "fmt". +// +// CHANNEL PEERS: for each channel operation make/<-/close, the set of +// other channel ops that alias the same channel(s). +// +// ERRORS: for each locus of a frontend (scanner/parser/type) error, the +// location is highlighted in red and hover text provides the compiler +// error message. +// +package analysis // import "golang.org/x/tools/godoc/analysis" + +import ( + "fmt" + "go/build" + exact "go/constant" + "go/scanner" + "go/token" + "go/types" + "html" + "io" + "log" + "os" + "path/filepath" + "sort" + "strings" + "sync" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/pointer" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" +) + +// -- links ------------------------------------------------------------ + +// A Link is an HTML decoration of the bytes [Start, End) of a file. +// Write is called before/after those bytes to emit the mark-up. +type Link interface { + Start() int + End() int + Write(w io.Writer, _ int, start bool) // the godoc.LinkWriter signature +} + +// An element. +type aLink struct { + start, end int // =godoc.Segment + title string // hover text + onclick string // JS code (NB: trusted) + href string // URL (NB: trusted) +} + +func (a aLink) Start() int { return a.start } +func (a aLink) End() int { return a.end } +func (a aLink) Write(w io.Writer, _ int, start bool) { + if start { + fmt.Fprintf(w, `") + } else { + fmt.Fprintf(w, "") + } +} + +// An element. +type errorLink struct { + start int + msg string +} + +func (e errorLink) Start() int { return e.start } +func (e errorLink) End() int { return e.start + 1 } + +func (e errorLink) Write(w io.Writer, _ int, start bool) { + // causes havoc, not sure why, so use . + if start { + fmt.Fprintf(w, ``, html.EscapeString(e.msg)) + } else { + fmt.Fprintf(w, "") + } +} + +// -- fileInfo --------------------------------------------------------- + +// FileInfo holds analysis information for the source file view. +// Clients must not mutate it. +type FileInfo struct { + Data []interface{} // JSON serializable values + Links []Link // HTML link markup +} + +// A fileInfo is the server's store of hyperlinks and JSON data for a +// particular file. +type fileInfo struct { + mu sync.Mutex + data []interface{} // JSON objects + links []Link + sorted bool + hasErrors bool // TODO(adonovan): surface this in the UI +} + +// addLink adds a link to the Go source file fi. +func (fi *fileInfo) addLink(link Link) { + fi.mu.Lock() + fi.links = append(fi.links, link) + fi.sorted = false + if _, ok := link.(errorLink); ok { + fi.hasErrors = true + } + fi.mu.Unlock() +} + +// addData adds the structured value x to the JSON data for the Go +// source file fi. Its index is returned. +func (fi *fileInfo) addData(x interface{}) int { + fi.mu.Lock() + index := len(fi.data) + fi.data = append(fi.data, x) + fi.mu.Unlock() + return index +} + +// get returns the file info in external form. +// Callers must not mutate its fields. +func (fi *fileInfo) get() FileInfo { + var r FileInfo + // Copy slices, to avoid races. + fi.mu.Lock() + r.Data = append(r.Data, fi.data...) + if !fi.sorted { + sort.Sort(linksByStart(fi.links)) + fi.sorted = true + } + r.Links = append(r.Links, fi.links...) + fi.mu.Unlock() + return r +} + +// PackageInfo holds analysis information for the package view. +// Clients must not mutate it. +type PackageInfo struct { + CallGraph []*PCGNodeJSON + CallGraphIndex map[string]int + Types []*TypeInfoJSON +} + +type pkgInfo struct { + mu sync.Mutex + callGraph []*PCGNodeJSON + callGraphIndex map[string]int // keys are (*ssa.Function).RelString() + types []*TypeInfoJSON // type info for exported types +} + +func (pi *pkgInfo) setCallGraph(callGraph []*PCGNodeJSON, callGraphIndex map[string]int) { + pi.mu.Lock() + pi.callGraph = callGraph + pi.callGraphIndex = callGraphIndex + pi.mu.Unlock() +} + +func (pi *pkgInfo) addType(t *TypeInfoJSON) { + pi.mu.Lock() + pi.types = append(pi.types, t) + pi.mu.Unlock() +} + +// get returns the package info in external form. +// Callers must not mutate its fields. +func (pi *pkgInfo) get() PackageInfo { + var r PackageInfo + // Copy slices, to avoid races. + pi.mu.Lock() + r.CallGraph = append(r.CallGraph, pi.callGraph...) + r.CallGraphIndex = pi.callGraphIndex + r.Types = append(r.Types, pi.types...) + pi.mu.Unlock() + return r +} + +// -- Result ----------------------------------------------------------- + +// Result contains the results of analysis. +// The result contains a mapping from filenames to a set of HTML links +// and JavaScript data referenced by the links. +type Result struct { + mu sync.Mutex // guards maps (but not their contents) + status string // global analysis status + fileInfos map[string]*fileInfo // keys are godoc file URLs + pkgInfos map[string]*pkgInfo // keys are import paths +} + +// fileInfo returns the fileInfo for the specified godoc file URL, +// constructing it as needed. Thread-safe. +func (res *Result) fileInfo(url string) *fileInfo { + res.mu.Lock() + fi, ok := res.fileInfos[url] + if !ok { + if res.fileInfos == nil { + res.fileInfos = make(map[string]*fileInfo) + } + fi = new(fileInfo) + res.fileInfos[url] = fi + } + res.mu.Unlock() + return fi +} + +// Status returns a human-readable description of the current analysis status. +func (res *Result) Status() string { + res.mu.Lock() + defer res.mu.Unlock() + return res.status +} + +func (res *Result) setStatusf(format string, args ...interface{}) { + res.mu.Lock() + res.status = fmt.Sprintf(format, args...) + log.Printf(format, args...) + res.mu.Unlock() +} + +// FileInfo returns new slices containing opaque JSON values and the +// HTML link markup for the specified godoc file URL. Thread-safe. +// Callers must not mutate the elements. +// It returns "zero" if no data is available. +// +func (res *Result) FileInfo(url string) (fi FileInfo) { + return res.fileInfo(url).get() +} + +// pkgInfo returns the pkgInfo for the specified import path, +// constructing it as needed. Thread-safe. +func (res *Result) pkgInfo(importPath string) *pkgInfo { + res.mu.Lock() + pi, ok := res.pkgInfos[importPath] + if !ok { + if res.pkgInfos == nil { + res.pkgInfos = make(map[string]*pkgInfo) + } + pi = new(pkgInfo) + res.pkgInfos[importPath] = pi + } + res.mu.Unlock() + return pi +} + +// PackageInfo returns new slices of JSON values for the callgraph and +// type info for the specified package. Thread-safe. +// Callers must not mutate its fields. +// PackageInfo returns "zero" if no data is available. +// +func (res *Result) PackageInfo(importPath string) PackageInfo { + return res.pkgInfo(importPath).get() +} + +// -- analysis --------------------------------------------------------- + +type analysis struct { + result *Result + prog *ssa.Program + ops []chanOp // all channel ops in program + allNamed []*types.Named // all named types in the program + ptaConfig pointer.Config + path2url map[string]string // maps openable path to godoc file URL (/src/fmt/print.go) + pcgs map[*ssa.Package]*packageCallGraph +} + +// fileAndOffset returns the file and offset for a given pos. +func (a *analysis) fileAndOffset(pos token.Pos) (fi *fileInfo, offset int) { + return a.fileAndOffsetPosn(a.prog.Fset.Position(pos)) +} + +// fileAndOffsetPosn returns the file and offset for a given position. +func (a *analysis) fileAndOffsetPosn(posn token.Position) (fi *fileInfo, offset int) { + url := a.path2url[posn.Filename] + return a.result.fileInfo(url), posn.Offset +} + +// posURL returns the URL of the source extent [pos, pos+len). +func (a *analysis) posURL(pos token.Pos, len int) string { + if pos == token.NoPos { + return "" + } + posn := a.prog.Fset.Position(pos) + url := a.path2url[posn.Filename] + return fmt.Sprintf("%s?s=%d:%d#L%d", + url, posn.Offset, posn.Offset+len, posn.Line) +} + +// ---------------------------------------------------------------------- + +// Run runs program analysis and computes the resulting markup, +// populating *result in a thread-safe manner, first with type +// information then later with pointer analysis information if +// enabled by the pta flag. +// +func Run(pta bool, result *Result) { + conf := loader.Config{ + AllowErrors: true, + } + + // Silence the default error handler. + // Don't print all errors; we'll report just + // one per errant package later. + conf.TypeChecker.Error = func(e error) {} + + var roots, args []string // roots[i] ends with os.PathSeparator + + // Enumerate packages in $GOROOT. + root := filepath.Join(build.Default.GOROOT, "src") + string(os.PathSeparator) + roots = append(roots, root) + args = allPackages(root) + log.Printf("GOROOT=%s: %s\n", root, args) + + // Enumerate packages in $GOPATH. + for i, dir := range filepath.SplitList(build.Default.GOPATH) { + root := filepath.Join(dir, "src") + string(os.PathSeparator) + roots = append(roots, root) + pkgs := allPackages(root) + log.Printf("GOPATH[%d]=%s: %s\n", i, root, pkgs) + args = append(args, pkgs...) + } + + // Uncomment to make startup quicker during debugging. + //args = []string{"golang.org/x/tools/cmd/godoc"} + //args = []string{"fmt"} + + if _, err := conf.FromArgs(args, true); err != nil { + // TODO(adonovan): degrade gracefully, not fail totally. + // (The crippling case is a parse error in an external test file.) + result.setStatusf("Analysis failed: %s.", err) // import error + return + } + + result.setStatusf("Loading and type-checking packages...") + iprog, err := conf.Load() + if iprog != nil { + // Report only the first error of each package. + for _, info := range iprog.AllPackages { + for _, err := range info.Errors { + fmt.Fprintln(os.Stderr, err) + break + } + } + log.Printf("Loaded %d packages.", len(iprog.AllPackages)) + } + if err != nil { + result.setStatusf("Loading failed: %s.\n", err) + return + } + + // Create SSA-form program representation. + // Only the transitively error-free packages are used. + prog := ssautil.CreateProgram(iprog, ssa.GlobalDebug) + + // Compute the set of main packages, including testmain. + allPackages := prog.AllPackages() + var mainPkgs []*ssa.Package + if testmain := prog.CreateTestMainPackage(allPackages...); testmain != nil { + mainPkgs = append(mainPkgs, testmain) + if p := testmain.Const("packages"); p != nil { + log.Printf("Tested packages: %v", exact.StringVal(p.Value.Value)) + } + } + for _, pkg := range allPackages { + if pkg.Pkg.Name() == "main" && pkg.Func("main") != nil { + mainPkgs = append(mainPkgs, pkg) + } + } + log.Print("Transitively error-free main packages: ", mainPkgs) + + // Build SSA code for bodies of all functions in the whole program. + result.setStatusf("Constructing SSA form...") + prog.Build() + log.Print("SSA construction complete") + + a := analysis{ + result: result, + prog: prog, + pcgs: make(map[*ssa.Package]*packageCallGraph), + } + + // Build a mapping from openable filenames to godoc file URLs, + // i.e. "/src/" plus path relative to GOROOT/src or GOPATH[i]/src. + a.path2url = make(map[string]string) + for _, info := range iprog.AllPackages { + nextfile: + for _, f := range info.Files { + if f.Pos() == 0 { + continue // e.g. files generated by cgo + } + abs := iprog.Fset.File(f.Pos()).Name() + // Find the root to which this file belongs. + for _, root := range roots { + rel := strings.TrimPrefix(abs, root) + if len(rel) < len(abs) { + a.path2url[abs] = "/src/" + filepath.ToSlash(rel) + continue nextfile + } + } + + log.Printf("Can't locate file %s (package %q) beneath any root", + abs, info.Pkg.Path()) + } + } + + // Add links for scanner, parser, type-checker errors. + // TODO(adonovan): fix: these links can overlap with + // identifier markup, causing the renderer to emit some + // characters twice. + errors := make(map[token.Position][]string) + for _, info := range iprog.AllPackages { + for _, err := range info.Errors { + switch err := err.(type) { + case types.Error: + posn := a.prog.Fset.Position(err.Pos) + errors[posn] = append(errors[posn], err.Msg) + case scanner.ErrorList: + for _, e := range err { + errors[e.Pos] = append(errors[e.Pos], e.Msg) + } + default: + log.Printf("Package %q has error (%T) without position: %v\n", + info.Pkg.Path(), err, err) + } + } + } + for posn, errs := range errors { + fi, offset := a.fileAndOffsetPosn(posn) + fi.addLink(errorLink{ + start: offset, + msg: strings.Join(errs, "\n"), + }) + } + + // ---------- type-based analyses ---------- + + // Compute the all-pairs IMPLEMENTS relation. + // Collect all named types, even local types + // (which can have methods via promotion) + // and the built-in "error". + errorType := types.Universe.Lookup("error").Type().(*types.Named) + a.allNamed = append(a.allNamed, errorType) + for _, info := range iprog.AllPackages { + for _, obj := range info.Defs { + if obj, ok := obj.(*types.TypeName); ok { + a.allNamed = append(a.allNamed, obj.Type().(*types.Named)) + } + } + } + log.Print("Computing implements relation...") + facts := computeImplements(&a.prog.MethodSets, a.allNamed) + + // Add the type-based analysis results. + log.Print("Extracting type info...") + for _, info := range iprog.AllPackages { + a.doTypeInfo(info, facts) + } + + a.visitInstrs(pta) + + result.setStatusf("Type analysis complete.") + + if pta { + a.pointer(mainPkgs) + } +} + +// visitInstrs visits all SSA instructions in the program. +func (a *analysis) visitInstrs(pta bool) { + log.Print("Visit instructions...") + for fn := range ssautil.AllFunctions(a.prog) { + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + // CALLEES (static) + // (Dynamic calls require pointer analysis.) + // + // We use the SSA representation to find the static callee, + // since in many cases it does better than the + // types.Info.{Refs,Selection} information. For example: + // + // defer func(){}() // static call to anon function + // f := func(){}; f() // static call to anon function + // f := fmt.Println; f() // static call to named function + // + // The downside is that we get no static callee information + // for packages that (transitively) contain errors. + if site, ok := instr.(ssa.CallInstruction); ok { + if callee := site.Common().StaticCallee(); callee != nil { + // TODO(adonovan): callgraph: elide wrappers. + // (Do static calls ever go to wrappers?) + if site.Common().Pos() != token.NoPos { + a.addCallees(site, []*ssa.Function{callee}) + } + } + } + + if !pta { + continue + } + + // CHANNEL PEERS + // Collect send/receive/close instructions in the whole ssa.Program. + for _, op := range chanOps(instr) { + a.ops = append(a.ops, op) + a.ptaConfig.AddQuery(op.ch) // add channel ssa.Value to PTA query + } + } + } + } + log.Print("Visit instructions complete") +} + +// pointer runs the pointer analysis. +func (a *analysis) pointer(mainPkgs []*ssa.Package) { + // Run the pointer analysis and build the complete callgraph. + a.ptaConfig.Mains = mainPkgs + a.ptaConfig.BuildCallGraph = true + a.ptaConfig.Reflection = false // (for now) + + a.result.setStatusf("Pointer analysis running...") + + ptares, err := pointer.Analyze(&a.ptaConfig) + if err != nil { + // If this happens, it indicates a bug. + a.result.setStatusf("Pointer analysis failed: %s.", err) + return + } + log.Print("Pointer analysis complete.") + + // Add the results of pointer analysis. + + a.result.setStatusf("Computing channel peers...") + a.doChannelPeers(ptares.Queries) + a.result.setStatusf("Computing dynamic call graph edges...") + a.doCallgraph(ptares.CallGraph) + + a.result.setStatusf("Analysis complete.") +} + +type linksByStart []Link + +func (a linksByStart) Less(i, j int) bool { return a[i].Start() < a[j].Start() } +func (a linksByStart) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a linksByStart) Len() int { return len(a) } + +// allPackages returns a new sorted slice of all packages beneath the +// specified package root directory, e.g. $GOROOT/src or $GOPATH/src. +// Derived from from go/ssa/stdlib_test.go +// root must end with os.PathSeparator. +// +// TODO(adonovan): use buildutil.AllPackages when the tree thaws. +func allPackages(root string) []string { + var pkgs []string + filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + if info == nil { + return nil // non-existent root directory? + } + if !info.IsDir() { + return nil // not a directory + } + // Prune the search if we encounter any of these names: + base := filepath.Base(path) + if base == "testdata" || strings.HasPrefix(base, ".") { + return filepath.SkipDir + } + pkg := filepath.ToSlash(strings.TrimPrefix(path, root)) + switch pkg { + case "builtin": + return filepath.SkipDir + case "": + return nil // ignore root of tree + } + pkgs = append(pkgs, pkg) + return nil + }) + return pkgs +} diff --git a/vendor/golang.org/x/tools/godoc/analysis/analysis14.go b/vendor/golang.org/x/tools/godoc/analysis/analysis14.go new file mode 100644 index 0000000000..ca35b41086 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/analysis/analysis14.go @@ -0,0 +1,622 @@ +// 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 !go1.5 + +// Package analysis performs type and pointer analysis +// and generates mark-up for the Go source view. +// +// The Run method populates a Result object by running type and +// (optionally) pointer analysis. The Result object is thread-safe +// and at all times may be accessed by a serving thread, even as it is +// progressively populated as analysis facts are derived. +// +// The Result is a mapping from each godoc file URL +// (e.g. /src/fmt/print.go) to information about that file. The +// information is a list of HTML markup links and a JSON array of +// structured data values. Some of the links call client-side +// JavaScript functions that index this array. +// +// The analysis computes mark-up for the following relations: +// +// IMPORTS: for each ast.ImportSpec, the package that it denotes. +// +// RESOLUTION: for each ast.Ident, its kind and type, and the location +// of its definition. +// +// METHOD SETS, IMPLEMENTS: for each ast.Ident defining a named type, +// its method-set, the set of interfaces it implements or is +// implemented by, and its size/align values. +// +// CALLERS, CALLEES: for each function declaration ('func' token), its +// callers, and for each call-site ('(' token), its callees. +// +// CALLGRAPH: the package docs include an interactive viewer for the +// intra-package call graph of "fmt". +// +// CHANNEL PEERS: for each channel operation make/<-/close, the set of +// other channel ops that alias the same channel(s). +// +// ERRORS: for each locus of a frontend (scanner/parser/type) error, the +// location is highlighted in red and hover text provides the compiler +// error message. +// +package analysis // import "golang.org/x/tools/godoc/analysis" + +import ( + "fmt" + "go/build" + "go/scanner" + "go/token" + "html" + "io" + "log" + "os" + "path/filepath" + "runtime" + "sort" + "strings" + "sync" + + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/pointer" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/go/types" +) + +// -- links ------------------------------------------------------------ + +// A Link is an HTML decoration of the bytes [Start, End) of a file. +// Write is called before/after those bytes to emit the mark-up. +type Link interface { + Start() int + End() int + Write(w io.Writer, _ int, start bool) // the godoc.LinkWriter signature +} + +// An element. +type aLink struct { + start, end int // =godoc.Segment + title string // hover text + onclick string // JS code (NB: trusted) + href string // URL (NB: trusted) +} + +func (a aLink) Start() int { return a.start } +func (a aLink) End() int { return a.end } +func (a aLink) Write(w io.Writer, _ int, start bool) { + if start { + fmt.Fprintf(w, `") + } else { + fmt.Fprintf(w, "") + } +} + +// An element. +type errorLink struct { + start int + msg string +} + +func (e errorLink) Start() int { return e.start } +func (e errorLink) End() int { return e.start + 1 } + +func (e errorLink) Write(w io.Writer, _ int, start bool) { + // causes havoc, not sure why, so use . + if start { + fmt.Fprintf(w, ``, html.EscapeString(e.msg)) + } else { + fmt.Fprintf(w, "") + } +} + +// -- fileInfo --------------------------------------------------------- + +// FileInfo holds analysis information for the source file view. +// Clients must not mutate it. +type FileInfo struct { + Data []interface{} // JSON serializable values + Links []Link // HTML link markup +} + +// A fileInfo is the server's store of hyperlinks and JSON data for a +// particular file. +type fileInfo struct { + mu sync.Mutex + data []interface{} // JSON objects + links []Link + sorted bool + hasErrors bool // TODO(adonovan): surface this in the UI +} + +// addLink adds a link to the Go source file fi. +func (fi *fileInfo) addLink(link Link) { + fi.mu.Lock() + fi.links = append(fi.links, link) + fi.sorted = false + if _, ok := link.(errorLink); ok { + fi.hasErrors = true + } + fi.mu.Unlock() +} + +// addData adds the structured value x to the JSON data for the Go +// source file fi. Its index is returned. +func (fi *fileInfo) addData(x interface{}) int { + fi.mu.Lock() + index := len(fi.data) + fi.data = append(fi.data, x) + fi.mu.Unlock() + return index +} + +// get returns the file info in external form. +// Callers must not mutate its fields. +func (fi *fileInfo) get() FileInfo { + var r FileInfo + // Copy slices, to avoid races. + fi.mu.Lock() + r.Data = append(r.Data, fi.data...) + if !fi.sorted { + sort.Sort(linksByStart(fi.links)) + fi.sorted = true + } + r.Links = append(r.Links, fi.links...) + fi.mu.Unlock() + return r +} + +// PackageInfo holds analysis information for the package view. +// Clients must not mutate it. +type PackageInfo struct { + CallGraph []*PCGNodeJSON + CallGraphIndex map[string]int + Types []*TypeInfoJSON +} + +type pkgInfo struct { + mu sync.Mutex + callGraph []*PCGNodeJSON + callGraphIndex map[string]int // keys are (*ssa.Function).RelString() + types []*TypeInfoJSON // type info for exported types +} + +func (pi *pkgInfo) setCallGraph(callGraph []*PCGNodeJSON, callGraphIndex map[string]int) { + pi.mu.Lock() + pi.callGraph = callGraph + pi.callGraphIndex = callGraphIndex + pi.mu.Unlock() +} + +func (pi *pkgInfo) addType(t *TypeInfoJSON) { + pi.mu.Lock() + pi.types = append(pi.types, t) + pi.mu.Unlock() +} + +// get returns the package info in external form. +// Callers must not mutate its fields. +func (pi *pkgInfo) get() PackageInfo { + var r PackageInfo + // Copy slices, to avoid races. + pi.mu.Lock() + r.CallGraph = append(r.CallGraph, pi.callGraph...) + r.CallGraphIndex = pi.callGraphIndex + r.Types = append(r.Types, pi.types...) + pi.mu.Unlock() + return r +} + +// -- Result ----------------------------------------------------------- + +// Result contains the results of analysis. +// The result contains a mapping from filenames to a set of HTML links +// and JavaScript data referenced by the links. +type Result struct { + mu sync.Mutex // guards maps (but not their contents) + status string // global analysis status + fileInfos map[string]*fileInfo // keys are godoc file URLs + pkgInfos map[string]*pkgInfo // keys are import paths +} + +// fileInfo returns the fileInfo for the specified godoc file URL, +// constructing it as needed. Thread-safe. +func (res *Result) fileInfo(url string) *fileInfo { + res.mu.Lock() + fi, ok := res.fileInfos[url] + if !ok { + if res.fileInfos == nil { + res.fileInfos = make(map[string]*fileInfo) + } + fi = new(fileInfo) + res.fileInfos[url] = fi + } + res.mu.Unlock() + return fi +} + +// Status returns a human-readable description of the current analysis status. +func (res *Result) Status() string { + res.mu.Lock() + defer res.mu.Unlock() + return res.status +} + +func (res *Result) setStatusf(format string, args ...interface{}) { + res.mu.Lock() + res.status = fmt.Sprintf(format, args...) + log.Printf(format, args...) + res.mu.Unlock() +} + +// FileInfo returns new slices containing opaque JSON values and the +// HTML link markup for the specified godoc file URL. Thread-safe. +// Callers must not mutate the elements. +// It returns "zero" if no data is available. +// +func (res *Result) FileInfo(url string) (fi FileInfo) { + return res.fileInfo(url).get() +} + +// pkgInfo returns the pkgInfo for the specified import path, +// constructing it as needed. Thread-safe. +func (res *Result) pkgInfo(importPath string) *pkgInfo { + res.mu.Lock() + pi, ok := res.pkgInfos[importPath] + if !ok { + if res.pkgInfos == nil { + res.pkgInfos = make(map[string]*pkgInfo) + } + pi = new(pkgInfo) + res.pkgInfos[importPath] = pi + } + res.mu.Unlock() + return pi +} + +// PackageInfo returns new slices of JSON values for the callgraph and +// type info for the specified package. Thread-safe. +// Callers must not mutate its fields. +// PackageInfo returns "zero" if no data is available. +// +func (res *Result) PackageInfo(importPath string) PackageInfo { + return res.pkgInfo(importPath).get() +} + +// -- analysis --------------------------------------------------------- + +type analysis struct { + result *Result + prog *ssa.Program + ops []chanOp // all channel ops in program + allNamed []*types.Named // all named types in the program + ptaConfig pointer.Config + path2url map[string]string // maps openable path to godoc file URL (/src/fmt/print.go) + pcgs map[*ssa.Package]*packageCallGraph +} + +// fileAndOffset returns the file and offset for a given pos. +func (a *analysis) fileAndOffset(pos token.Pos) (fi *fileInfo, offset int) { + return a.fileAndOffsetPosn(a.prog.Fset.Position(pos)) +} + +// fileAndOffsetPosn returns the file and offset for a given position. +func (a *analysis) fileAndOffsetPosn(posn token.Position) (fi *fileInfo, offset int) { + url := a.path2url[posn.Filename] + return a.result.fileInfo(url), posn.Offset +} + +// posURL returns the URL of the source extent [pos, pos+len). +func (a *analysis) posURL(pos token.Pos, len int) string { + if pos == token.NoPos { + return "" + } + posn := a.prog.Fset.Position(pos) + url := a.path2url[posn.Filename] + return fmt.Sprintf("%s?s=%d:%d#L%d", + url, posn.Offset, posn.Offset+len, posn.Line) +} + +// ---------------------------------------------------------------------- + +// Run runs program analysis and computes the resulting markup, +// populating *result in a thread-safe manner, first with type +// information then later with pointer analysis information if +// enabled by the pta flag. +// +func Run(pta bool, result *Result) { + conf := loader.Config{ + AllowErrors: true, + } + + // Silence the default error handler. + // Don't print all errors; we'll report just + // one per errant package later. + conf.TypeChecker.Error = func(e error) {} + + var roots, args []string // roots[i] ends with os.PathSeparator + + // Enumerate packages in $GOROOT. + root := filepath.Join(runtime.GOROOT(), "src") + string(os.PathSeparator) + roots = append(roots, root) + args = allPackages(root) + log.Printf("GOROOT=%s: %s\n", root, args) + + // Enumerate packages in $GOPATH. + for i, dir := range filepath.SplitList(build.Default.GOPATH) { + root := filepath.Join(dir, "src") + string(os.PathSeparator) + roots = append(roots, root) + pkgs := allPackages(root) + log.Printf("GOPATH[%d]=%s: %s\n", i, root, pkgs) + args = append(args, pkgs...) + } + + // Uncomment to make startup quicker during debugging. + //args = []string{"golang.org/x/tools/cmd/godoc"} + //args = []string{"fmt"} + + if _, err := conf.FromArgs(args, true); err != nil { + // TODO(adonovan): degrade gracefully, not fail totally. + // (The crippling case is a parse error in an external test file.) + result.setStatusf("Analysis failed: %s.", err) // import error + return + } + + result.setStatusf("Loading and type-checking packages...") + iprog, err := conf.Load() + if iprog != nil { + // Report only the first error of each package. + for _, info := range iprog.AllPackages { + for _, err := range info.Errors { + fmt.Fprintln(os.Stderr, err) + break + } + } + log.Printf("Loaded %d packages.", len(iprog.AllPackages)) + } + if err != nil { + result.setStatusf("Loading failed: %s.\n", err) + return + } + + // Create SSA-form program representation. + // Only the transitively error-free packages are used. + prog := ssautil.CreateProgram(iprog, ssa.GlobalDebug) + + // Compute the set of main packages, including testmain. + allPackages := prog.AllPackages() + var mainPkgs []*ssa.Package + if testmain := prog.CreateTestMainPackage(allPackages...); testmain != nil { + mainPkgs = append(mainPkgs, testmain) + if p := testmain.Const("packages"); p != nil { + log.Printf("Tested packages: %v", exact.StringVal(p.Value.Value)) + } + } + for _, pkg := range allPackages { + if pkg.Pkg.Name() == "main" && pkg.Func("main") != nil { + mainPkgs = append(mainPkgs, pkg) + } + } + log.Print("Transitively error-free main packages: ", mainPkgs) + + // Build SSA code for bodies of all functions in the whole program. + result.setStatusf("Constructing SSA form...") + prog.Build() + log.Print("SSA construction complete") + + a := analysis{ + result: result, + prog: prog, + pcgs: make(map[*ssa.Package]*packageCallGraph), + } + + // Build a mapping from openable filenames to godoc file URLs, + // i.e. "/src/" plus path relative to GOROOT/src or GOPATH[i]/src. + a.path2url = make(map[string]string) + for _, info := range iprog.AllPackages { + nextfile: + for _, f := range info.Files { + if f.Pos() == 0 { + continue // e.g. files generated by cgo + } + abs := iprog.Fset.File(f.Pos()).Name() + // Find the root to which this file belongs. + for _, root := range roots { + rel := strings.TrimPrefix(abs, root) + if len(rel) < len(abs) { + a.path2url[abs] = "/src/" + filepath.ToSlash(rel) + continue nextfile + } + } + + log.Printf("Can't locate file %s (package %q) beneath any root", + abs, info.Pkg.Path()) + } + } + + // Add links for scanner, parser, type-checker errors. + // TODO(adonovan): fix: these links can overlap with + // identifier markup, causing the renderer to emit some + // characters twice. + errors := make(map[token.Position][]string) + for _, info := range iprog.AllPackages { + for _, err := range info.Errors { + switch err := err.(type) { + case types.Error: + posn := a.prog.Fset.Position(err.Pos) + errors[posn] = append(errors[posn], err.Msg) + case scanner.ErrorList: + for _, e := range err { + errors[e.Pos] = append(errors[e.Pos], e.Msg) + } + default: + log.Printf("Package %q has error (%T) without position: %v\n", + info.Pkg.Path(), err, err) + } + } + } + for posn, errs := range errors { + fi, offset := a.fileAndOffsetPosn(posn) + fi.addLink(errorLink{ + start: offset, + msg: strings.Join(errs, "\n"), + }) + } + + // ---------- type-based analyses ---------- + + // Compute the all-pairs IMPLEMENTS relation. + // Collect all named types, even local types + // (which can have methods via promotion) + // and the built-in "error". + errorType := types.Universe.Lookup("error").Type().(*types.Named) + a.allNamed = append(a.allNamed, errorType) + for _, info := range iprog.AllPackages { + for _, obj := range info.Defs { + if obj, ok := obj.(*types.TypeName); ok { + a.allNamed = append(a.allNamed, obj.Type().(*types.Named)) + } + } + } + log.Print("Computing implements relation...") + facts := computeImplements(&a.prog.MethodSets, a.allNamed) + + // Add the type-based analysis results. + log.Print("Extracting type info...") + for _, info := range iprog.AllPackages { + a.doTypeInfo(info, facts) + } + + a.visitInstrs(pta) + + result.setStatusf("Type analysis complete.") + + if pta { + a.pointer(mainPkgs) + } +} + +// visitInstrs visits all SSA instructions in the program. +func (a *analysis) visitInstrs(pta bool) { + log.Print("Visit instructions...") + for fn := range ssautil.AllFunctions(a.prog) { + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + // CALLEES (static) + // (Dynamic calls require pointer analysis.) + // + // We use the SSA representation to find the static callee, + // since in many cases it does better than the + // types.Info.{Refs,Selection} information. For example: + // + // defer func(){}() // static call to anon function + // f := func(){}; f() // static call to anon function + // f := fmt.Println; f() // static call to named function + // + // The downside is that we get no static callee information + // for packages that (transitively) contain errors. + if site, ok := instr.(ssa.CallInstruction); ok { + if callee := site.Common().StaticCallee(); callee != nil { + // TODO(adonovan): callgraph: elide wrappers. + // (Do static calls ever go to wrappers?) + if site.Common().Pos() != token.NoPos { + a.addCallees(site, []*ssa.Function{callee}) + } + } + } + + if !pta { + continue + } + + // CHANNEL PEERS + // Collect send/receive/close instructions in the whole ssa.Program. + for _, op := range chanOps(instr) { + a.ops = append(a.ops, op) + a.ptaConfig.AddQuery(op.ch) // add channel ssa.Value to PTA query + } + } + } + } + log.Print("Visit instructions complete") +} + +// pointer runs the pointer analysis. +func (a *analysis) pointer(mainPkgs []*ssa.Package) { + // Run the pointer analysis and build the complete callgraph. + a.ptaConfig.Mains = mainPkgs + a.ptaConfig.BuildCallGraph = true + a.ptaConfig.Reflection = false // (for now) + + a.result.setStatusf("Pointer analysis running...") + + ptares, err := pointer.Analyze(&a.ptaConfig) + if err != nil { + // If this happens, it indicates a bug. + a.result.setStatusf("Pointer analysis failed: %s.", err) + return + } + log.Print("Pointer analysis complete.") + + // Add the results of pointer analysis. + + a.result.setStatusf("Computing channel peers...") + a.doChannelPeers(ptares.Queries) + a.result.setStatusf("Computing dynamic call graph edges...") + a.doCallgraph(ptares.CallGraph) + + a.result.setStatusf("Analysis complete.") +} + +type linksByStart []Link + +func (a linksByStart) Less(i, j int) bool { return a[i].Start() < a[j].Start() } +func (a linksByStart) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a linksByStart) Len() int { return len(a) } + +// allPackages returns a new sorted slice of all packages beneath the +// specified package root directory, e.g. $GOROOT/src or $GOPATH/src. +// Derived from from go/ssa/stdlib_test.go +// root must end with os.PathSeparator. +// +// TODO(adonovan): use buildutil.AllPackages when the tree thaws. +func allPackages(root string) []string { + var pkgs []string + filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + if info == nil { + return nil // non-existent root directory? + } + if !info.IsDir() { + return nil // not a directory + } + // Prune the search if we encounter any of these names: + base := filepath.Base(path) + if base == "testdata" || strings.HasPrefix(base, ".") { + return filepath.SkipDir + } + pkg := filepath.ToSlash(strings.TrimPrefix(path, root)) + switch pkg { + case "builtin": + return filepath.SkipDir + case "": + return nil // ignore root of tree + } + pkgs = append(pkgs, pkg) + return nil + }) + return pkgs +} diff --git a/vendor/golang.org/x/tools/godoc/analysis/callgraph.go b/vendor/golang.org/x/tools/godoc/analysis/callgraph.go new file mode 100644 index 0000000000..4e97061f90 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/analysis/callgraph.go @@ -0,0 +1,353 @@ +// 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 go1.5 + +package analysis + +// This file computes the CALLERS and CALLEES relations from the call +// graph. CALLERS/CALLEES information is displayed in the lower pane +// when a "func" token or ast.CallExpr.Lparen is clicked, respectively. + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" + "log" + "math/big" + "sort" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/ssa" +) + +// doCallgraph computes the CALLEES and CALLERS relations. +func (a *analysis) doCallgraph(cg *callgraph.Graph) { + log.Print("Deleting synthetic nodes...") + // TODO(adonovan): opt: DeleteSyntheticNodes is asymptotically + // inefficient and can be (unpredictably) slow. + cg.DeleteSyntheticNodes() + log.Print("Synthetic nodes deleted") + + // Populate nodes of package call graphs (PCGs). + for _, n := range cg.Nodes { + a.pcgAddNode(n.Func) + } + // Within each PCG, sort funcs by name. + for _, pcg := range a.pcgs { + pcg.sortNodes() + } + + calledFuncs := make(map[ssa.CallInstruction]map[*ssa.Function]bool) + callingSites := make(map[*ssa.Function]map[ssa.CallInstruction]bool) + for _, n := range cg.Nodes { + for _, e := range n.Out { + if e.Site == nil { + continue // a call from a synthetic node such as + } + + // Add (site pos, callee) to calledFuncs. + // (Dynamic calls only.) + callee := e.Callee.Func + + a.pcgAddEdge(n.Func, callee) + + if callee.Synthetic != "" { + continue // call of a package initializer + } + + if e.Site.Common().StaticCallee() == nil { + // dynamic call + // (CALLEES information for static calls + // is computed using SSA information.) + lparen := e.Site.Common().Pos() + if lparen != token.NoPos { + fns := calledFuncs[e.Site] + if fns == nil { + fns = make(map[*ssa.Function]bool) + calledFuncs[e.Site] = fns + } + fns[callee] = true + } + } + + // Add (callee, site) to callingSites. + fns := callingSites[callee] + if fns == nil { + fns = make(map[ssa.CallInstruction]bool) + callingSites[callee] = fns + } + fns[e.Site] = true + } + } + + // CALLEES. + log.Print("Callees...") + for site, fns := range calledFuncs { + var funcs funcsByPos + for fn := range fns { + funcs = append(funcs, fn) + } + sort.Sort(funcs) + + a.addCallees(site, funcs) + } + + // CALLERS + log.Print("Callers...") + for callee, sites := range callingSites { + pos := funcToken(callee) + if pos == token.NoPos { + log.Printf("CALLERS: skipping %s: no pos", callee) + continue + } + + var this *types.Package // for relativizing names + if callee.Pkg != nil { + this = callee.Pkg.Pkg + } + + // Compute sites grouped by parent, with text and URLs. + sitesByParent := make(map[*ssa.Function]sitesByPos) + for site := range sites { + fn := site.Parent() + sitesByParent[fn] = append(sitesByParent[fn], site) + } + var funcs funcsByPos + for fn := range sitesByParent { + funcs = append(funcs, fn) + } + sort.Sort(funcs) + + v := callersJSON{ + Callee: callee.String(), + Callers: []callerJSON{}, // (JS wants non-nil) + } + for _, fn := range funcs { + caller := callerJSON{ + Func: prettyFunc(this, fn), + Sites: []anchorJSON{}, // (JS wants non-nil) + } + sites := sitesByParent[fn] + sort.Sort(sites) + for _, site := range sites { + pos := site.Common().Pos() + if pos != token.NoPos { + caller.Sites = append(caller.Sites, anchorJSON{ + Text: fmt.Sprintf("%d", a.prog.Fset.Position(pos).Line), + Href: a.posURL(pos, len("(")), + }) + } + } + v.Callers = append(v.Callers, caller) + } + + fi, offset := a.fileAndOffset(pos) + fi.addLink(aLink{ + start: offset, + end: offset + len("func"), + title: fmt.Sprintf("%d callers", len(sites)), + onclick: fmt.Sprintf("onClickCallers(%d)", fi.addData(v)), + }) + } + + // PACKAGE CALLGRAPH + log.Print("Package call graph...") + for pkg, pcg := range a.pcgs { + // Maps (*ssa.Function).RelString() to index in JSON CALLGRAPH array. + index := make(map[string]int) + + // Treat exported functions (and exported methods of + // exported named types) as roots even if they aren't + // actually called from outside the package. + for i, n := range pcg.nodes { + if i == 0 || n.fn.Object() == nil || !n.fn.Object().Exported() { + continue + } + recv := n.fn.Signature.Recv() + if recv == nil || deref(recv.Type()).(*types.Named).Obj().Exported() { + roots := &pcg.nodes[0].edges + roots.SetBit(roots, i, 1) + } + index[n.fn.RelString(pkg.Pkg)] = i + } + + json := a.pcgJSON(pcg) + + // TODO(adonovan): pkg.Path() is not unique! + // It is possible to declare a non-test package called x_test. + a.result.pkgInfo(pkg.Pkg.Path()).setCallGraph(json, index) + } +} + +// addCallees adds client data and links for the facts that site calls fns. +func (a *analysis) addCallees(site ssa.CallInstruction, fns []*ssa.Function) { + v := calleesJSON{ + Descr: site.Common().Description(), + Callees: []anchorJSON{}, // (JS wants non-nil) + } + var this *types.Package // for relativizing names + if p := site.Parent().Package(); p != nil { + this = p.Pkg + } + + for _, fn := range fns { + v.Callees = append(v.Callees, anchorJSON{ + Text: prettyFunc(this, fn), + Href: a.posURL(funcToken(fn), len("func")), + }) + } + + fi, offset := a.fileAndOffset(site.Common().Pos()) + fi.addLink(aLink{ + start: offset, + end: offset + len("("), + title: fmt.Sprintf("%d callees", len(v.Callees)), + onclick: fmt.Sprintf("onClickCallees(%d)", fi.addData(v)), + }) +} + +// -- utilities -------------------------------------------------------- + +// stable order within packages but undefined across packages. +type funcsByPos []*ssa.Function + +func (a funcsByPos) Less(i, j int) bool { return a[i].Pos() < a[j].Pos() } +func (a funcsByPos) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a funcsByPos) Len() int { return len(a) } + +type sitesByPos []ssa.CallInstruction + +func (a sitesByPos) Less(i, j int) bool { return a[i].Common().Pos() < a[j].Common().Pos() } +func (a sitesByPos) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a sitesByPos) Len() int { return len(a) } + +func funcToken(fn *ssa.Function) token.Pos { + switch syntax := fn.Syntax().(type) { + case *ast.FuncLit: + return syntax.Type.Func + case *ast.FuncDecl: + return syntax.Type.Func + } + return token.NoPos +} + +// prettyFunc pretty-prints fn for the user interface. +// TODO(adonovan): return HTML so we have more markup freedom. +func prettyFunc(this *types.Package, fn *ssa.Function) string { + if fn.Parent() != nil { + return fmt.Sprintf("%s in %s", + types.TypeString(fn.Signature, types.RelativeTo(this)), + prettyFunc(this, fn.Parent())) + } + if fn.Synthetic != "" && fn.Name() == "init" { + // (This is the actual initializer, not a declared 'func init'). + if fn.Pkg.Pkg == this { + return "package initializer" + } + return fmt.Sprintf("%q package initializer", fn.Pkg.Pkg.Path()) + } + return fn.RelString(this) +} + +// -- intra-package callgraph ------------------------------------------ + +// pcgNode represents a node in the package call graph (PCG). +type pcgNode struct { + fn *ssa.Function + pretty string // cache of prettyFunc(fn) + edges big.Int // set of callee func indices +} + +// A packageCallGraph represents the intra-package edges of the global call graph. +// The zeroth node indicates "all external functions". +type packageCallGraph struct { + nodeIndex map[*ssa.Function]int // maps func to node index (a small int) + nodes []*pcgNode // maps node index to node +} + +// sortNodes populates pcg.nodes in name order and updates the nodeIndex. +func (pcg *packageCallGraph) sortNodes() { + nodes := make([]*pcgNode, 0, len(pcg.nodeIndex)) + nodes = append(nodes, &pcgNode{fn: nil, pretty: ""}) + for fn := range pcg.nodeIndex { + nodes = append(nodes, &pcgNode{ + fn: fn, + pretty: prettyFunc(fn.Pkg.Pkg, fn), + }) + } + sort.Sort(pcgNodesByPretty(nodes[1:])) + for i, n := range nodes { + pcg.nodeIndex[n.fn] = i + } + pcg.nodes = nodes +} + +func (pcg *packageCallGraph) addEdge(caller, callee *ssa.Function) { + var callerIndex int + if caller.Pkg == callee.Pkg { + // intra-package edge + callerIndex = pcg.nodeIndex[caller] + if callerIndex < 1 { + panic(caller) + } + } + edges := &pcg.nodes[callerIndex].edges + edges.SetBit(edges, pcg.nodeIndex[callee], 1) +} + +func (a *analysis) pcgAddNode(fn *ssa.Function) { + if fn.Pkg == nil { + return + } + pcg, ok := a.pcgs[fn.Pkg] + if !ok { + pcg = &packageCallGraph{nodeIndex: make(map[*ssa.Function]int)} + a.pcgs[fn.Pkg] = pcg + } + pcg.nodeIndex[fn] = -1 +} + +func (a *analysis) pcgAddEdge(caller, callee *ssa.Function) { + if callee.Pkg != nil { + a.pcgs[callee.Pkg].addEdge(caller, callee) + } +} + +// pcgJSON returns a new slice of callgraph JSON values. +func (a *analysis) pcgJSON(pcg *packageCallGraph) []*PCGNodeJSON { + var nodes []*PCGNodeJSON + for _, n := range pcg.nodes { + + // TODO(adonovan): why is there no good way to iterate + // over the set bits of a big.Int? + var callees []int + nbits := n.edges.BitLen() + for j := 0; j < nbits; j++ { + if n.edges.Bit(j) == 1 { + callees = append(callees, j) + } + } + + var pos token.Pos + if n.fn != nil { + pos = funcToken(n.fn) + } + nodes = append(nodes, &PCGNodeJSON{ + Func: anchorJSON{ + Text: n.pretty, + Href: a.posURL(pos, len("func")), + }, + Callees: callees, + }) + } + return nodes +} + +type pcgNodesByPretty []*pcgNode + +func (a pcgNodesByPretty) Less(i, j int) bool { return a[i].pretty < a[j].pretty } +func (a pcgNodesByPretty) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a pcgNodesByPretty) Len() int { return len(a) } diff --git a/vendor/golang.org/x/tools/godoc/analysis/callgraph14.go b/vendor/golang.org/x/tools/godoc/analysis/callgraph14.go new file mode 100644 index 0000000000..2692d7e7b9 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/analysis/callgraph14.go @@ -0,0 +1,353 @@ +// 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 !go1.5 + +package analysis + +// This file computes the CALLERS and CALLEES relations from the call +// graph. CALLERS/CALLEES information is displayed in the lower pane +// when a "func" token or ast.CallExpr.Lparen is clicked, respectively. + +import ( + "fmt" + "go/ast" + "go/token" + "log" + "math/big" + "sort" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types" +) + +// doCallgraph computes the CALLEES and CALLERS relations. +func (a *analysis) doCallgraph(cg *callgraph.Graph) { + log.Print("Deleting synthetic nodes...") + // TODO(adonovan): opt: DeleteSyntheticNodes is asymptotically + // inefficient and can be (unpredictably) slow. + cg.DeleteSyntheticNodes() + log.Print("Synthetic nodes deleted") + + // Populate nodes of package call graphs (PCGs). + for _, n := range cg.Nodes { + a.pcgAddNode(n.Func) + } + // Within each PCG, sort funcs by name. + for _, pcg := range a.pcgs { + pcg.sortNodes() + } + + calledFuncs := make(map[ssa.CallInstruction]map[*ssa.Function]bool) + callingSites := make(map[*ssa.Function]map[ssa.CallInstruction]bool) + for _, n := range cg.Nodes { + for _, e := range n.Out { + if e.Site == nil { + continue // a call from a synthetic node such as + } + + // Add (site pos, callee) to calledFuncs. + // (Dynamic calls only.) + callee := e.Callee.Func + + a.pcgAddEdge(n.Func, callee) + + if callee.Synthetic != "" { + continue // call of a package initializer + } + + if e.Site.Common().StaticCallee() == nil { + // dynamic call + // (CALLEES information for static calls + // is computed using SSA information.) + lparen := e.Site.Common().Pos() + if lparen != token.NoPos { + fns := calledFuncs[e.Site] + if fns == nil { + fns = make(map[*ssa.Function]bool) + calledFuncs[e.Site] = fns + } + fns[callee] = true + } + } + + // Add (callee, site) to callingSites. + fns := callingSites[callee] + if fns == nil { + fns = make(map[ssa.CallInstruction]bool) + callingSites[callee] = fns + } + fns[e.Site] = true + } + } + + // CALLEES. + log.Print("Callees...") + for site, fns := range calledFuncs { + var funcs funcsByPos + for fn := range fns { + funcs = append(funcs, fn) + } + sort.Sort(funcs) + + a.addCallees(site, funcs) + } + + // CALLERS + log.Print("Callers...") + for callee, sites := range callingSites { + pos := funcToken(callee) + if pos == token.NoPos { + log.Printf("CALLERS: skipping %s: no pos", callee) + continue + } + + var this *types.Package // for relativizing names + if callee.Pkg != nil { + this = callee.Pkg.Pkg + } + + // Compute sites grouped by parent, with text and URLs. + sitesByParent := make(map[*ssa.Function]sitesByPos) + for site := range sites { + fn := site.Parent() + sitesByParent[fn] = append(sitesByParent[fn], site) + } + var funcs funcsByPos + for fn := range sitesByParent { + funcs = append(funcs, fn) + } + sort.Sort(funcs) + + v := callersJSON{ + Callee: callee.String(), + Callers: []callerJSON{}, // (JS wants non-nil) + } + for _, fn := range funcs { + caller := callerJSON{ + Func: prettyFunc(this, fn), + Sites: []anchorJSON{}, // (JS wants non-nil) + } + sites := sitesByParent[fn] + sort.Sort(sites) + for _, site := range sites { + pos := site.Common().Pos() + if pos != token.NoPos { + caller.Sites = append(caller.Sites, anchorJSON{ + Text: fmt.Sprintf("%d", a.prog.Fset.Position(pos).Line), + Href: a.posURL(pos, len("(")), + }) + } + } + v.Callers = append(v.Callers, caller) + } + + fi, offset := a.fileAndOffset(pos) + fi.addLink(aLink{ + start: offset, + end: offset + len("func"), + title: fmt.Sprintf("%d callers", len(sites)), + onclick: fmt.Sprintf("onClickCallers(%d)", fi.addData(v)), + }) + } + + // PACKAGE CALLGRAPH + log.Print("Package call graph...") + for pkg, pcg := range a.pcgs { + // Maps (*ssa.Function).RelString() to index in JSON CALLGRAPH array. + index := make(map[string]int) + + // Treat exported functions (and exported methods of + // exported named types) as roots even if they aren't + // actually called from outside the package. + for i, n := range pcg.nodes { + if i == 0 || n.fn.Object() == nil || !n.fn.Object().Exported() { + continue + } + recv := n.fn.Signature.Recv() + if recv == nil || deref(recv.Type()).(*types.Named).Obj().Exported() { + roots := &pcg.nodes[0].edges + roots.SetBit(roots, i, 1) + } + index[n.fn.RelString(pkg.Pkg)] = i + } + + json := a.pcgJSON(pcg) + + // TODO(adonovan): pkg.Path() is not unique! + // It is possible to declare a non-test package called x_test. + a.result.pkgInfo(pkg.Pkg.Path()).setCallGraph(json, index) + } +} + +// addCallees adds client data and links for the facts that site calls fns. +func (a *analysis) addCallees(site ssa.CallInstruction, fns []*ssa.Function) { + v := calleesJSON{ + Descr: site.Common().Description(), + Callees: []anchorJSON{}, // (JS wants non-nil) + } + var this *types.Package // for relativizing names + if p := site.Parent().Package(); p != nil { + this = p.Pkg + } + + for _, fn := range fns { + v.Callees = append(v.Callees, anchorJSON{ + Text: prettyFunc(this, fn), + Href: a.posURL(funcToken(fn), len("func")), + }) + } + + fi, offset := a.fileAndOffset(site.Common().Pos()) + fi.addLink(aLink{ + start: offset, + end: offset + len("("), + title: fmt.Sprintf("%d callees", len(v.Callees)), + onclick: fmt.Sprintf("onClickCallees(%d)", fi.addData(v)), + }) +} + +// -- utilities -------------------------------------------------------- + +// stable order within packages but undefined across packages. +type funcsByPos []*ssa.Function + +func (a funcsByPos) Less(i, j int) bool { return a[i].Pos() < a[j].Pos() } +func (a funcsByPos) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a funcsByPos) Len() int { return len(a) } + +type sitesByPos []ssa.CallInstruction + +func (a sitesByPos) Less(i, j int) bool { return a[i].Common().Pos() < a[j].Common().Pos() } +func (a sitesByPos) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a sitesByPos) Len() int { return len(a) } + +func funcToken(fn *ssa.Function) token.Pos { + switch syntax := fn.Syntax().(type) { + case *ast.FuncLit: + return syntax.Type.Func + case *ast.FuncDecl: + return syntax.Type.Func + } + return token.NoPos +} + +// prettyFunc pretty-prints fn for the user interface. +// TODO(adonovan): return HTML so we have more markup freedom. +func prettyFunc(this *types.Package, fn *ssa.Function) string { + if fn.Parent() != nil { + return fmt.Sprintf("%s in %s", + types.TypeString(fn.Signature, types.RelativeTo(this)), + prettyFunc(this, fn.Parent())) + } + if fn.Synthetic != "" && fn.Name() == "init" { + // (This is the actual initializer, not a declared 'func init'). + if fn.Pkg.Pkg == this { + return "package initializer" + } + return fmt.Sprintf("%q package initializer", fn.Pkg.Pkg.Path()) + } + return fn.RelString(this) +} + +// -- intra-package callgraph ------------------------------------------ + +// pcgNode represents a node in the package call graph (PCG). +type pcgNode struct { + fn *ssa.Function + pretty string // cache of prettyFunc(fn) + edges big.Int // set of callee func indices +} + +// A packageCallGraph represents the intra-package edges of the global call graph. +// The zeroth node indicates "all external functions". +type packageCallGraph struct { + nodeIndex map[*ssa.Function]int // maps func to node index (a small int) + nodes []*pcgNode // maps node index to node +} + +// sortNodes populates pcg.nodes in name order and updates the nodeIndex. +func (pcg *packageCallGraph) sortNodes() { + nodes := make([]*pcgNode, 0, len(pcg.nodeIndex)) + nodes = append(nodes, &pcgNode{fn: nil, pretty: ""}) + for fn := range pcg.nodeIndex { + nodes = append(nodes, &pcgNode{ + fn: fn, + pretty: prettyFunc(fn.Pkg.Pkg, fn), + }) + } + sort.Sort(pcgNodesByPretty(nodes[1:])) + for i, n := range nodes { + pcg.nodeIndex[n.fn] = i + } + pcg.nodes = nodes +} + +func (pcg *packageCallGraph) addEdge(caller, callee *ssa.Function) { + var callerIndex int + if caller.Pkg == callee.Pkg { + // intra-package edge + callerIndex = pcg.nodeIndex[caller] + if callerIndex < 1 { + panic(caller) + } + } + edges := &pcg.nodes[callerIndex].edges + edges.SetBit(edges, pcg.nodeIndex[callee], 1) +} + +func (a *analysis) pcgAddNode(fn *ssa.Function) { + if fn.Pkg == nil { + return + } + pcg, ok := a.pcgs[fn.Pkg] + if !ok { + pcg = &packageCallGraph{nodeIndex: make(map[*ssa.Function]int)} + a.pcgs[fn.Pkg] = pcg + } + pcg.nodeIndex[fn] = -1 +} + +func (a *analysis) pcgAddEdge(caller, callee *ssa.Function) { + if callee.Pkg != nil { + a.pcgs[callee.Pkg].addEdge(caller, callee) + } +} + +// pcgJSON returns a new slice of callgraph JSON values. +func (a *analysis) pcgJSON(pcg *packageCallGraph) []*PCGNodeJSON { + var nodes []*PCGNodeJSON + for _, n := range pcg.nodes { + + // TODO(adonovan): why is there no good way to iterate + // over the set bits of a big.Int? + var callees []int + nbits := n.edges.BitLen() + for j := 0; j < nbits; j++ { + if n.edges.Bit(j) == 1 { + callees = append(callees, j) + } + } + + var pos token.Pos + if n.fn != nil { + pos = funcToken(n.fn) + } + nodes = append(nodes, &PCGNodeJSON{ + Func: anchorJSON{ + Text: n.pretty, + Href: a.posURL(pos, len("func")), + }, + Callees: callees, + }) + } + return nodes +} + +type pcgNodesByPretty []*pcgNode + +func (a pcgNodesByPretty) Less(i, j int) bool { return a[i].pretty < a[j].pretty } +func (a pcgNodesByPretty) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a pcgNodesByPretty) Len() int { return len(a) } diff --git a/vendor/golang.org/x/tools/godoc/analysis/implements.go b/vendor/golang.org/x/tools/godoc/analysis/implements.go new file mode 100644 index 0000000000..1c856c379e --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/analysis/implements.go @@ -0,0 +1,197 @@ +// 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 go1.5 + +package analysis + +// This file computes the "implements" relation over all pairs of +// named types in the program. (The mark-up is done by typeinfo.go.) + +// TODO(adonovan): do we want to report implements(C, I) where C and I +// belong to different packages and at least one is not exported? + +import ( + "go/types" + "sort" + + "golang.org/x/tools/go/types/typeutil" +) + +// computeImplements computes the "implements" relation over all pairs +// of named types in allNamed. +func computeImplements(cache *typeutil.MethodSetCache, allNamed []*types.Named) map[*types.Named]implementsFacts { + // Information about a single type's method set. + type msetInfo struct { + typ types.Type + mset *types.MethodSet + mask1, mask2 uint64 + } + + initMsetInfo := func(info *msetInfo, typ types.Type) { + info.typ = typ + info.mset = cache.MethodSet(typ) + for i := 0; i < info.mset.Len(); i++ { + name := info.mset.At(i).Obj().Name() + info.mask1 |= 1 << methodBit(name[0]) + info.mask2 |= 1 << methodBit(name[len(name)-1]) + } + } + + // satisfies(T, U) reports whether type T satisfies type U. + // U must be an interface. + // + // Since there are thousands of types (and thus millions of + // pairs of types) and types.Assignable(T, U) is relatively + // expensive, we compute assignability directly from the + // method sets. (At least one of T and U must be an + // interface.) + // + // We use a trick (thanks gri!) related to a Bloom filter to + // quickly reject most tests, which are false. For each + // method set, we precompute a mask, a set of bits, one per + // distinct initial byte of each method name. Thus the mask + // for io.ReadWriter would be {'R','W'}. AssignableTo(T, U) + // cannot be true unless mask(T)&mask(U)==mask(U). + // + // As with a Bloom filter, we can improve precision by testing + // additional hashes, e.g. using the last letter of each + // method name, so long as the subset mask property holds. + // + // When analyzing the standard library, there are about 1e6 + // calls to satisfies(), of which 0.6% return true. With a + // 1-hash filter, 95% of calls avoid the expensive check; with + // a 2-hash filter, this grows to 98.2%. + satisfies := func(T, U *msetInfo) bool { + return T.mask1&U.mask1 == U.mask1 && + T.mask2&U.mask2 == U.mask2 && + containsAllIdsOf(T.mset, U.mset) + } + + // Information about a named type N, and perhaps also *N. + type namedInfo struct { + isInterface bool + base msetInfo // N + ptr msetInfo // *N, iff N !isInterface + } + + var infos []namedInfo + + // Precompute the method sets and their masks. + for _, N := range allNamed { + var info namedInfo + initMsetInfo(&info.base, N) + _, info.isInterface = N.Underlying().(*types.Interface) + if !info.isInterface { + initMsetInfo(&info.ptr, types.NewPointer(N)) + } + + if info.base.mask1|info.ptr.mask1 == 0 { + continue // neither N nor *N has methods + } + + infos = append(infos, info) + } + + facts := make(map[*types.Named]implementsFacts) + + // Test all pairs of distinct named types (T, U). + // TODO(adonovan): opt: compute (U, T) at the same time. + for t := range infos { + T := &infos[t] + var to, from, fromPtr []types.Type + for u := range infos { + if t == u { + continue + } + U := &infos[u] + switch { + case T.isInterface && U.isInterface: + if satisfies(&U.base, &T.base) { + to = append(to, U.base.typ) + } + if satisfies(&T.base, &U.base) { + from = append(from, U.base.typ) + } + case T.isInterface: // U concrete + if satisfies(&U.base, &T.base) { + to = append(to, U.base.typ) + } else if satisfies(&U.ptr, &T.base) { + to = append(to, U.ptr.typ) + } + case U.isInterface: // T concrete + if satisfies(&T.base, &U.base) { + from = append(from, U.base.typ) + } else if satisfies(&T.ptr, &U.base) { + fromPtr = append(fromPtr, U.base.typ) + } + } + } + + // Sort types (arbitrarily) to avoid nondeterminism. + sort.Sort(typesByString(to)) + sort.Sort(typesByString(from)) + sort.Sort(typesByString(fromPtr)) + + facts[T.base.typ.(*types.Named)] = implementsFacts{to, from, fromPtr} + } + + return facts +} + +type implementsFacts struct { + to []types.Type // named or ptr-to-named types assignable to interface T + from []types.Type // named interfaces assignable from T + fromPtr []types.Type // named interfaces assignable only from *T +} + +type typesByString []types.Type + +func (p typesByString) Len() int { return len(p) } +func (p typesByString) Less(i, j int) bool { return p[i].String() < p[j].String() } +func (p typesByString) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +// methodBit returns the index of x in [a-zA-Z], or 52 if not found. +func methodBit(x byte) uint64 { + switch { + case 'a' <= x && x <= 'z': + return uint64(x - 'a') + case 'A' <= x && x <= 'Z': + return uint64(26 + x - 'A') + } + return 52 // all other bytes +} + +// containsAllIdsOf reports whether the method identifiers of T are a +// superset of those in U. If U belongs to an interface type, the +// result is equal to types.Assignable(T, U), but is cheaper to compute. +// +// TODO(gri): make this a method of *types.MethodSet. +// +func containsAllIdsOf(T, U *types.MethodSet) bool { + t, tlen := 0, T.Len() + u, ulen := 0, U.Len() + for t < tlen && u < ulen { + tMeth := T.At(t).Obj() + uMeth := U.At(u).Obj() + tId := tMeth.Id() + uId := uMeth.Id() + if tId > uId { + // U has a method T lacks: fail. + return false + } + if tId < uId { + // T has a method U lacks: ignore it. + t++ + continue + } + // U and T both have a method of this Id. Check types. + if !types.Identical(tMeth.Type(), uMeth.Type()) { + return false // type mismatch + } + u++ + t++ + } + return u == ulen +} diff --git a/vendor/golang.org/x/tools/godoc/analysis/implements14.go b/vendor/golang.org/x/tools/godoc/analysis/implements14.go new file mode 100644 index 0000000000..0ad10089fd --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/analysis/implements14.go @@ -0,0 +1,197 @@ +// 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 !go1.5 + +package analysis + +// This file computes the "implements" relation over all pairs of +// named types in the program. (The mark-up is done by typeinfo.go.) + +// TODO(adonovan): do we want to report implements(C, I) where C and I +// belong to different packages and at least one is not exported? + +import ( + "sort" + + "golang.org/x/tools/go/types" + "golang.org/x/tools/go/types/typeutil" +) + +// computeImplements computes the "implements" relation over all pairs +// of named types in allNamed. +func computeImplements(cache *typeutil.MethodSetCache, allNamed []*types.Named) map[*types.Named]implementsFacts { + // Information about a single type's method set. + type msetInfo struct { + typ types.Type + mset *types.MethodSet + mask1, mask2 uint64 + } + + initMsetInfo := func(info *msetInfo, typ types.Type) { + info.typ = typ + info.mset = cache.MethodSet(typ) + for i := 0; i < info.mset.Len(); i++ { + name := info.mset.At(i).Obj().Name() + info.mask1 |= 1 << methodBit(name[0]) + info.mask2 |= 1 << methodBit(name[len(name)-1]) + } + } + + // satisfies(T, U) reports whether type T satisfies type U. + // U must be an interface. + // + // Since there are thousands of types (and thus millions of + // pairs of types) and types.Assignable(T, U) is relatively + // expensive, we compute assignability directly from the + // method sets. (At least one of T and U must be an + // interface.) + // + // We use a trick (thanks gri!) related to a Bloom filter to + // quickly reject most tests, which are false. For each + // method set, we precompute a mask, a set of bits, one per + // distinct initial byte of each method name. Thus the mask + // for io.ReadWriter would be {'R','W'}. AssignableTo(T, U) + // cannot be true unless mask(T)&mask(U)==mask(U). + // + // As with a Bloom filter, we can improve precision by testing + // additional hashes, e.g. using the last letter of each + // method name, so long as the subset mask property holds. + // + // When analyzing the standard library, there are about 1e6 + // calls to satisfies(), of which 0.6% return true. With a + // 1-hash filter, 95% of calls avoid the expensive check; with + // a 2-hash filter, this grows to 98.2%. + satisfies := func(T, U *msetInfo) bool { + return T.mask1&U.mask1 == U.mask1 && + T.mask2&U.mask2 == U.mask2 && + containsAllIdsOf(T.mset, U.mset) + } + + // Information about a named type N, and perhaps also *N. + type namedInfo struct { + isInterface bool + base msetInfo // N + ptr msetInfo // *N, iff N !isInterface + } + + var infos []namedInfo + + // Precompute the method sets and their masks. + for _, N := range allNamed { + var info namedInfo + initMsetInfo(&info.base, N) + _, info.isInterface = N.Underlying().(*types.Interface) + if !info.isInterface { + initMsetInfo(&info.ptr, types.NewPointer(N)) + } + + if info.base.mask1|info.ptr.mask1 == 0 { + continue // neither N nor *N has methods + } + + infos = append(infos, info) + } + + facts := make(map[*types.Named]implementsFacts) + + // Test all pairs of distinct named types (T, U). + // TODO(adonovan): opt: compute (U, T) at the same time. + for t := range infos { + T := &infos[t] + var to, from, fromPtr []types.Type + for u := range infos { + if t == u { + continue + } + U := &infos[u] + switch { + case T.isInterface && U.isInterface: + if satisfies(&U.base, &T.base) { + to = append(to, U.base.typ) + } + if satisfies(&T.base, &U.base) { + from = append(from, U.base.typ) + } + case T.isInterface: // U concrete + if satisfies(&U.base, &T.base) { + to = append(to, U.base.typ) + } else if satisfies(&U.ptr, &T.base) { + to = append(to, U.ptr.typ) + } + case U.isInterface: // T concrete + if satisfies(&T.base, &U.base) { + from = append(from, U.base.typ) + } else if satisfies(&T.ptr, &U.base) { + fromPtr = append(fromPtr, U.base.typ) + } + } + } + + // Sort types (arbitrarily) to avoid nondeterminism. + sort.Sort(typesByString(to)) + sort.Sort(typesByString(from)) + sort.Sort(typesByString(fromPtr)) + + facts[T.base.typ.(*types.Named)] = implementsFacts{to, from, fromPtr} + } + + return facts +} + +type implementsFacts struct { + to []types.Type // named or ptr-to-named types assignable to interface T + from []types.Type // named interfaces assignable from T + fromPtr []types.Type // named interfaces assignable only from *T +} + +type typesByString []types.Type + +func (p typesByString) Len() int { return len(p) } +func (p typesByString) Less(i, j int) bool { return p[i].String() < p[j].String() } +func (p typesByString) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +// methodBit returns the index of x in [a-zA-Z], or 52 if not found. +func methodBit(x byte) uint64 { + switch { + case 'a' <= x && x <= 'z': + return uint64(x - 'a') + case 'A' <= x && x <= 'Z': + return uint64(26 + x - 'A') + } + return 52 // all other bytes +} + +// containsAllIdsOf reports whether the method identifiers of T are a +// superset of those in U. If U belongs to an interface type, the +// result is equal to types.Assignable(T, U), but is cheaper to compute. +// +// TODO(gri): make this a method of *types.MethodSet. +// +func containsAllIdsOf(T, U *types.MethodSet) bool { + t, tlen := 0, T.Len() + u, ulen := 0, U.Len() + for t < tlen && u < ulen { + tMeth := T.At(t).Obj() + uMeth := U.At(u).Obj() + tId := tMeth.Id() + uId := uMeth.Id() + if tId > uId { + // U has a method T lacks: fail. + return false + } + if tId < uId { + // T has a method U lacks: ignore it. + t++ + continue + } + // U and T both have a method of this Id. Check types. + if !types.Identical(tMeth.Type(), uMeth.Type()) { + return false // type mismatch + } + u++ + t++ + } + return u == ulen +} diff --git a/vendor/golang.org/x/tools/godoc/analysis/json.go b/vendor/golang.org/x/tools/godoc/analysis/json.go new file mode 100644 index 0000000000..f8976187c2 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/analysis/json.go @@ -0,0 +1,69 @@ +// 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 analysis + +// This file defines types used by client-side JavaScript. + +type anchorJSON struct { + Text string // HTML + Href string // URL +} + +type commOpJSON struct { + Op anchorJSON + Fn string +} + +// JavaScript's onClickComm() expects a commJSON. +type commJSON struct { + Ops []commOpJSON +} + +// Indicates one of these forms of fact about a type T: +// T "is implemented by type " (ByKind != "", e.g. "array") +// T "implements " (ByKind == "") +type implFactJSON struct { + ByKind string `json:",omitempty"` + Other anchorJSON +} + +// Implements facts are grouped by form, for ease of reading. +type implGroupJSON struct { + Descr string + Facts []implFactJSON +} + +// JavaScript's onClickIdent() expects a TypeInfoJSON. +type TypeInfoJSON struct { + Name string // type name + Size, Align int64 + Methods []anchorJSON + ImplGroups []implGroupJSON +} + +// JavaScript's onClickCallees() expects a calleesJSON. +type calleesJSON struct { + Descr string + Callees []anchorJSON // markup for called function +} + +type callerJSON struct { + Func string + Sites []anchorJSON +} + +// JavaScript's onClickCallers() expects a callersJSON. +type callersJSON struct { + Callee string + Callers []callerJSON +} + +// JavaScript's cgAddChild requires a global array of PCGNodeJSON +// called CALLGRAPH, representing the intra-package call graph. +// The first element is special and represents "all external callers". +type PCGNodeJSON struct { + Func anchorJSON + Callees []int // indices within CALLGRAPH of nodes called by this one +} diff --git a/vendor/golang.org/x/tools/godoc/analysis/peers.go b/vendor/golang.org/x/tools/godoc/analysis/peers.go new file mode 100644 index 0000000000..74a08a1fee --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/analysis/peers.go @@ -0,0 +1,156 @@ +// 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 go1.5 + +package analysis + +// This file computes the channel "peers" relation over all pairs of +// channel operations in the program. The peers are displayed in the +// lower pane when a channel operation (make, <-, close) is clicked. + +// TODO(adonovan): handle calls to reflect.{Select,Recv,Send,Close} too, +// then enable reflection in PTA. + +import ( + "fmt" + "go/token" + "go/types" + + "golang.org/x/tools/go/pointer" + "golang.org/x/tools/go/ssa" +) + +func (a *analysis) doChannelPeers(ptsets map[ssa.Value]pointer.Pointer) { + addSendRecv := func(j *commJSON, op chanOp) { + j.Ops = append(j.Ops, commOpJSON{ + Op: anchorJSON{ + Text: op.mode, + Href: a.posURL(op.pos, op.len), + }, + Fn: prettyFunc(nil, op.fn), + }) + } + + // Build an undirected bipartite multigraph (binary relation) + // of MakeChan ops and send/recv/close ops. + // + // TODO(adonovan): opt: use channel element types to partition + // the O(n^2) problem into subproblems. + aliasedOps := make(map[*ssa.MakeChan][]chanOp) + opToMakes := make(map[chanOp][]*ssa.MakeChan) + for _, op := range a.ops { + // Combine the PT sets from all contexts. + var makes []*ssa.MakeChan // aliased ops + ptr, ok := ptsets[op.ch] + if !ok { + continue // e.g. channel op in dead code + } + for _, label := range ptr.PointsTo().Labels() { + makechan, ok := label.Value().(*ssa.MakeChan) + if !ok { + continue // skip intrinsically-created channels for now + } + if makechan.Pos() == token.NoPos { + continue // not possible? + } + makes = append(makes, makechan) + aliasedOps[makechan] = append(aliasedOps[makechan], op) + } + opToMakes[op] = makes + } + + // Now that complete relation is built, build links for ops. + for _, op := range a.ops { + v := commJSON{ + Ops: []commOpJSON{}, // (JS wants non-nil) + } + ops := make(map[chanOp]bool) + for _, makechan := range opToMakes[op] { + v.Ops = append(v.Ops, commOpJSON{ + Op: anchorJSON{ + Text: "made", + Href: a.posURL(makechan.Pos()-token.Pos(len("make")), + len("make")), + }, + Fn: makechan.Parent().RelString(op.fn.Package().Pkg), + }) + for _, op := range aliasedOps[makechan] { + ops[op] = true + } + } + for op := range ops { + addSendRecv(&v, op) + } + + // Add links for each aliased op. + fi, offset := a.fileAndOffset(op.pos) + fi.addLink(aLink{ + start: offset, + end: offset + op.len, + title: "show channel ops", + onclick: fmt.Sprintf("onClickComm(%d)", fi.addData(v)), + }) + } + // Add links for makechan ops themselves. + for makechan, ops := range aliasedOps { + v := commJSON{ + Ops: []commOpJSON{}, // (JS wants non-nil) + } + for _, op := range ops { + addSendRecv(&v, op) + } + + fi, offset := a.fileAndOffset(makechan.Pos()) + fi.addLink(aLink{ + start: offset - len("make"), + end: offset, + title: "show channel ops", + onclick: fmt.Sprintf("onClickComm(%d)", fi.addData(v)), + }) + } +} + +// -- utilities -------------------------------------------------------- + +// chanOp abstracts an ssa.Send, ssa.Unop(ARROW), close(), or a SelectState. +// Derived from oracle/peers.go. +type chanOp struct { + ch ssa.Value + mode string // sent|received|closed + pos token.Pos + len int + fn *ssa.Function +} + +// chanOps returns a slice of all the channel operations in the instruction. +// Derived from oracle/peers.go. +func chanOps(instr ssa.Instruction) []chanOp { + fn := instr.Parent() + var ops []chanOp + switch instr := instr.(type) { + case *ssa.UnOp: + if instr.Op == token.ARROW { + // TODO(adonovan): don't assume <-ch; could be 'range ch'. + ops = append(ops, chanOp{instr.X, "received", instr.Pos(), len("<-"), fn}) + } + case *ssa.Send: + ops = append(ops, chanOp{instr.Chan, "sent", instr.Pos(), len("<-"), fn}) + case *ssa.Select: + for _, st := range instr.States { + mode := "received" + if st.Dir == types.SendOnly { + mode = "sent" + } + ops = append(ops, chanOp{st.Chan, mode, st.Pos, len("<-"), fn}) + } + case ssa.CallInstruction: + call := instr.Common() + if blt, ok := call.Value.(*ssa.Builtin); ok && blt.Name() == "close" { + pos := instr.Common().Pos() + ops = append(ops, chanOp{call.Args[0], "closed", pos - token.Pos(len("close")), len("close("), fn}) + } + } + return ops +} diff --git a/vendor/golang.org/x/tools/godoc/analysis/peers14.go b/vendor/golang.org/x/tools/godoc/analysis/peers14.go new file mode 100644 index 0000000000..ba5e8d6308 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/analysis/peers14.go @@ -0,0 +1,156 @@ +// 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 !go1.5 + +package analysis + +// This file computes the channel "peers" relation over all pairs of +// channel operations in the program. The peers are displayed in the +// lower pane when a channel operation (make, <-, close) is clicked. + +// TODO(adonovan): handle calls to reflect.{Select,Recv,Send,Close} too, +// then enable reflection in PTA. + +import ( + "fmt" + "go/token" + + "golang.org/x/tools/go/pointer" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types" +) + +func (a *analysis) doChannelPeers(ptsets map[ssa.Value]pointer.Pointer) { + addSendRecv := func(j *commJSON, op chanOp) { + j.Ops = append(j.Ops, commOpJSON{ + Op: anchorJSON{ + Text: op.mode, + Href: a.posURL(op.pos, op.len), + }, + Fn: prettyFunc(nil, op.fn), + }) + } + + // Build an undirected bipartite multigraph (binary relation) + // of MakeChan ops and send/recv/close ops. + // + // TODO(adonovan): opt: use channel element types to partition + // the O(n^2) problem into subproblems. + aliasedOps := make(map[*ssa.MakeChan][]chanOp) + opToMakes := make(map[chanOp][]*ssa.MakeChan) + for _, op := range a.ops { + // Combine the PT sets from all contexts. + var makes []*ssa.MakeChan // aliased ops + ptr, ok := ptsets[op.ch] + if !ok { + continue // e.g. channel op in dead code + } + for _, label := range ptr.PointsTo().Labels() { + makechan, ok := label.Value().(*ssa.MakeChan) + if !ok { + continue // skip intrinsically-created channels for now + } + if makechan.Pos() == token.NoPos { + continue // not possible? + } + makes = append(makes, makechan) + aliasedOps[makechan] = append(aliasedOps[makechan], op) + } + opToMakes[op] = makes + } + + // Now that complete relation is built, build links for ops. + for _, op := range a.ops { + v := commJSON{ + Ops: []commOpJSON{}, // (JS wants non-nil) + } + ops := make(map[chanOp]bool) + for _, makechan := range opToMakes[op] { + v.Ops = append(v.Ops, commOpJSON{ + Op: anchorJSON{ + Text: "made", + Href: a.posURL(makechan.Pos()-token.Pos(len("make")), + len("make")), + }, + Fn: makechan.Parent().RelString(op.fn.Package().Pkg), + }) + for _, op := range aliasedOps[makechan] { + ops[op] = true + } + } + for op := range ops { + addSendRecv(&v, op) + } + + // Add links for each aliased op. + fi, offset := a.fileAndOffset(op.pos) + fi.addLink(aLink{ + start: offset, + end: offset + op.len, + title: "show channel ops", + onclick: fmt.Sprintf("onClickComm(%d)", fi.addData(v)), + }) + } + // Add links for makechan ops themselves. + for makechan, ops := range aliasedOps { + v := commJSON{ + Ops: []commOpJSON{}, // (JS wants non-nil) + } + for _, op := range ops { + addSendRecv(&v, op) + } + + fi, offset := a.fileAndOffset(makechan.Pos()) + fi.addLink(aLink{ + start: offset - len("make"), + end: offset, + title: "show channel ops", + onclick: fmt.Sprintf("onClickComm(%d)", fi.addData(v)), + }) + } +} + +// -- utilities -------------------------------------------------------- + +// chanOp abstracts an ssa.Send, ssa.Unop(ARROW), close(), or a SelectState. +// Derived from oracle/peers.go. +type chanOp struct { + ch ssa.Value + mode string // sent|received|closed + pos token.Pos + len int + fn *ssa.Function +} + +// chanOps returns a slice of all the channel operations in the instruction. +// Derived from oracle/peers.go. +func chanOps(instr ssa.Instruction) []chanOp { + fn := instr.Parent() + var ops []chanOp + switch instr := instr.(type) { + case *ssa.UnOp: + if instr.Op == token.ARROW { + // TODO(adonovan): don't assume <-ch; could be 'range ch'. + ops = append(ops, chanOp{instr.X, "received", instr.Pos(), len("<-"), fn}) + } + case *ssa.Send: + ops = append(ops, chanOp{instr.Chan, "sent", instr.Pos(), len("<-"), fn}) + case *ssa.Select: + for _, st := range instr.States { + mode := "received" + if st.Dir == types.SendOnly { + mode = "sent" + } + ops = append(ops, chanOp{st.Chan, mode, st.Pos, len("<-"), fn}) + } + case ssa.CallInstruction: + call := instr.Common() + if blt, ok := call.Value.(*ssa.Builtin); ok && blt.Name() == "close" { + pos := instr.Common().Pos() + ops = append(ops, chanOp{call.Args[0], "closed", pos - token.Pos(len("close")), len("close("), fn}) + } + } + return ops +} diff --git a/vendor/golang.org/x/tools/godoc/analysis/typeinfo.go b/vendor/golang.org/x/tools/godoc/analysis/typeinfo.go new file mode 100644 index 0000000000..5796a8526d --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/analysis/typeinfo.go @@ -0,0 +1,234 @@ +// 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 go1.5 + +package analysis + +// This file computes the markup for information from go/types: +// IMPORTS, identifier RESOLUTION, METHOD SETS, size/alignment, and +// the IMPLEMENTS relation. +// +// IMPORTS links connect import specs to the documentation for the +// imported package. +// +// RESOLUTION links referring identifiers to their defining +// identifier, and adds tooltips for kind and type. +// +// METHOD SETS, size/alignment, and the IMPLEMENTS relation are +// displayed in the lower pane when a type's defining identifier is +// clicked. + +import ( + "fmt" + "go/types" + "reflect" + "strconv" + "strings" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/types/typeutil" +) + +// TODO(adonovan): audit to make sure it's safe on ill-typed packages. + +// TODO(adonovan): use same Sizes as loader.Config. +var sizes = types.StdSizes{WordSize: 8, MaxAlign: 8} + +func (a *analysis) doTypeInfo(info *loader.PackageInfo, implements map[*types.Named]implementsFacts) { + // We must not assume the corresponding SSA packages were + // created (i.e. were transitively error-free). + + // IMPORTS + for _, f := range info.Files { + // Package decl. + fi, offset := a.fileAndOffset(f.Name.Pos()) + fi.addLink(aLink{ + start: offset, + end: offset + len(f.Name.Name), + title: "Package docs for " + info.Pkg.Path(), + // TODO(adonovan): fix: we're putting the untrusted Path() + // into a trusted field. What's the appropriate sanitizer? + href: "/pkg/" + info.Pkg.Path(), + }) + + // Import specs. + for _, imp := range f.Imports { + // Remove quotes. + L := int(imp.End()-imp.Path.Pos()) - len(`""`) + path, _ := strconv.Unquote(imp.Path.Value) + fi, offset := a.fileAndOffset(imp.Path.Pos()) + fi.addLink(aLink{ + start: offset + 1, + end: offset + 1 + L, + title: "Package docs for " + path, + // TODO(adonovan): fix: we're putting the untrusted path + // into a trusted field. What's the appropriate sanitizer? + href: "/pkg/" + path, + }) + } + } + + // RESOLUTION + qualifier := types.RelativeTo(info.Pkg) + for id, obj := range info.Uses { + // Position of the object definition. + pos := obj.Pos() + Len := len(obj.Name()) + + // Correct the position for non-renaming import specs. + // import "sync/atomic" + // ^^^^^^^^^^^ + if obj, ok := obj.(*types.PkgName); ok && id.Name == obj.Imported().Name() { + // Assume this is a non-renaming import. + // NB: not true for degenerate renamings: `import foo "foo"`. + pos++ + Len = len(obj.Imported().Path()) + } + + if obj.Pkg() == nil { + continue // don't mark up built-ins. + } + + fi, offset := a.fileAndOffset(id.NamePos) + fi.addLink(aLink{ + start: offset, + end: offset + len(id.Name), + title: types.ObjectString(obj, qualifier), + href: a.posURL(pos, Len), + }) + } + + // IMPLEMENTS & METHOD SETS + for _, obj := range info.Defs { + if obj, ok := obj.(*types.TypeName); ok { + a.namedType(obj, implements) + } + } +} + +func (a *analysis) namedType(obj *types.TypeName, implements map[*types.Named]implementsFacts) { + qualifier := types.RelativeTo(obj.Pkg()) + T := obj.Type().(*types.Named) + v := &TypeInfoJSON{ + Name: obj.Name(), + Size: sizes.Sizeof(T), + Align: sizes.Alignof(T), + Methods: []anchorJSON{}, // (JS wants non-nil) + } + + // addFact adds the fact "is implemented by T" (by) or + // "implements T" (!by) to group. + addFact := func(group *implGroupJSON, T types.Type, by bool) { + Tobj := deref(T).(*types.Named).Obj() + var byKind string + if by { + // Show underlying kind of implementing type, + // e.g. "slice", "array", "struct". + s := reflect.TypeOf(T.Underlying()).String() + byKind = strings.ToLower(strings.TrimPrefix(s, "*types.")) + } + group.Facts = append(group.Facts, implFactJSON{ + ByKind: byKind, + Other: anchorJSON{ + Href: a.posURL(Tobj.Pos(), len(Tobj.Name())), + Text: types.TypeString(T, qualifier), + }, + }) + } + + // IMPLEMENTS + if r, ok := implements[T]; ok { + if isInterface(T) { + // "T is implemented by " ... + // "T is implemented by "... + // "T implements "... + group := implGroupJSON{ + Descr: types.TypeString(T, qualifier), + } + // Show concrete types first; use two passes. + for _, sub := range r.to { + if !isInterface(sub) { + addFact(&group, sub, true) + } + } + for _, sub := range r.to { + if isInterface(sub) { + addFact(&group, sub, true) + } + } + for _, super := range r.from { + addFact(&group, super, false) + } + v.ImplGroups = append(v.ImplGroups, group) + } else { + // T is concrete. + if r.from != nil { + // "T implements "... + group := implGroupJSON{ + Descr: types.TypeString(T, qualifier), + } + for _, super := range r.from { + addFact(&group, super, false) + } + v.ImplGroups = append(v.ImplGroups, group) + } + if r.fromPtr != nil { + // "*C implements "... + group := implGroupJSON{ + Descr: "*" + types.TypeString(T, qualifier), + } + for _, psuper := range r.fromPtr { + addFact(&group, psuper, false) + } + v.ImplGroups = append(v.ImplGroups, group) + } + } + } + + // METHOD SETS + for _, sel := range typeutil.IntuitiveMethodSet(T, &a.prog.MethodSets) { + meth := sel.Obj().(*types.Func) + pos := meth.Pos() // may be 0 for error.Error + v.Methods = append(v.Methods, anchorJSON{ + Href: a.posURL(pos, len(meth.Name())), + Text: types.SelectionString(sel, qualifier), + }) + } + + // Since there can be many specs per decl, we + // can't attach the link to the keyword 'type' + // (as we do with 'func'); we use the Ident. + fi, offset := a.fileAndOffset(obj.Pos()) + fi.addLink(aLink{ + start: offset, + end: offset + len(obj.Name()), + title: fmt.Sprintf("type info for %s", obj.Name()), + onclick: fmt.Sprintf("onClickTypeInfo(%d)", fi.addData(v)), + }) + + // Add info for exported package-level types to the package info. + if obj.Exported() && isPackageLevel(obj) { + // TODO(adonovan): Path is not unique! + // It is possible to declare a non-test package called x_test. + a.result.pkgInfo(obj.Pkg().Path()).addType(v) + } +} + +// -- utilities -------------------------------------------------------- + +func isInterface(T types.Type) bool { return types.IsInterface(T) } + +// deref returns a pointer's element type; otherwise it returns typ. +func deref(typ types.Type) types.Type { + if p, ok := typ.Underlying().(*types.Pointer); ok { + return p.Elem() + } + return typ +} + +// isPackageLevel reports whether obj is a package-level object. +func isPackageLevel(obj types.Object) bool { + return obj.Pkg().Scope().Lookup(obj.Name()) == obj +} diff --git a/vendor/golang.org/x/tools/godoc/analysis/typeinfo14.go b/vendor/golang.org/x/tools/godoc/analysis/typeinfo14.go new file mode 100644 index 0000000000..d10abcecd2 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/analysis/typeinfo14.go @@ -0,0 +1,234 @@ +// 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 !go1.5 + +package analysis + +// This file computes the markup for information from go/types: +// IMPORTS, identifier RESOLUTION, METHOD SETS, size/alignment, and +// the IMPLEMENTS relation. +// +// IMPORTS links connect import specs to the documentation for the +// imported package. +// +// RESOLUTION links referring identifiers to their defining +// identifier, and adds tooltips for kind and type. +// +// METHOD SETS, size/alignment, and the IMPLEMENTS relation are +// displayed in the lower pane when a type's defining identifier is +// clicked. + +import ( + "fmt" + "reflect" + "strconv" + "strings" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/types" + "golang.org/x/tools/go/types/typeutil" +) + +// TODO(adonovan): audit to make sure it's safe on ill-typed packages. + +// TODO(adonovan): use same Sizes as loader.Config. +var sizes = types.StdSizes{8, 8} + +func (a *analysis) doTypeInfo(info *loader.PackageInfo, implements map[*types.Named]implementsFacts) { + // We must not assume the corresponding SSA packages were + // created (i.e. were transitively error-free). + + // IMPORTS + for _, f := range info.Files { + // Package decl. + fi, offset := a.fileAndOffset(f.Name.Pos()) + fi.addLink(aLink{ + start: offset, + end: offset + len(f.Name.Name), + title: "Package docs for " + info.Pkg.Path(), + // TODO(adonovan): fix: we're putting the untrusted Path() + // into a trusted field. What's the appropriate sanitizer? + href: "/pkg/" + info.Pkg.Path(), + }) + + // Import specs. + for _, imp := range f.Imports { + // Remove quotes. + L := int(imp.End()-imp.Path.Pos()) - len(`""`) + path, _ := strconv.Unquote(imp.Path.Value) + fi, offset := a.fileAndOffset(imp.Path.Pos()) + fi.addLink(aLink{ + start: offset + 1, + end: offset + 1 + L, + title: "Package docs for " + path, + // TODO(adonovan): fix: we're putting the untrusted path + // into a trusted field. What's the appropriate sanitizer? + href: "/pkg/" + path, + }) + } + } + + // RESOLUTION + qualifier := types.RelativeTo(info.Pkg) + for id, obj := range info.Uses { + // Position of the object definition. + pos := obj.Pos() + Len := len(obj.Name()) + + // Correct the position for non-renaming import specs. + // import "sync/atomic" + // ^^^^^^^^^^^ + if obj, ok := obj.(*types.PkgName); ok && id.Name == obj.Imported().Name() { + // Assume this is a non-renaming import. + // NB: not true for degenerate renamings: `import foo "foo"`. + pos++ + Len = len(obj.Imported().Path()) + } + + if obj.Pkg() == nil { + continue // don't mark up built-ins. + } + + fi, offset := a.fileAndOffset(id.NamePos) + fi.addLink(aLink{ + start: offset, + end: offset + len(id.Name), + title: types.ObjectString(obj, qualifier), + href: a.posURL(pos, Len), + }) + } + + // IMPLEMENTS & METHOD SETS + for _, obj := range info.Defs { + if obj, ok := obj.(*types.TypeName); ok { + a.namedType(obj, implements) + } + } +} + +func (a *analysis) namedType(obj *types.TypeName, implements map[*types.Named]implementsFacts) { + qualifier := types.RelativeTo(obj.Pkg()) + T := obj.Type().(*types.Named) + v := &TypeInfoJSON{ + Name: obj.Name(), + Size: sizes.Sizeof(T), + Align: sizes.Alignof(T), + Methods: []anchorJSON{}, // (JS wants non-nil) + } + + // addFact adds the fact "is implemented by T" (by) or + // "implements T" (!by) to group. + addFact := func(group *implGroupJSON, T types.Type, by bool) { + Tobj := deref(T).(*types.Named).Obj() + var byKind string + if by { + // Show underlying kind of implementing type, + // e.g. "slice", "array", "struct". + s := reflect.TypeOf(T.Underlying()).String() + byKind = strings.ToLower(strings.TrimPrefix(s, "*types.")) + } + group.Facts = append(group.Facts, implFactJSON{ + ByKind: byKind, + Other: anchorJSON{ + Href: a.posURL(Tobj.Pos(), len(Tobj.Name())), + Text: types.TypeString(T, qualifier), + }, + }) + } + + // IMPLEMENTS + if r, ok := implements[T]; ok { + if isInterface(T) { + // "T is implemented by " ... + // "T is implemented by "... + // "T implements "... + group := implGroupJSON{ + Descr: types.TypeString(T, qualifier), + } + // Show concrete types first; use two passes. + for _, sub := range r.to { + if !isInterface(sub) { + addFact(&group, sub, true) + } + } + for _, sub := range r.to { + if isInterface(sub) { + addFact(&group, sub, true) + } + } + for _, super := range r.from { + addFact(&group, super, false) + } + v.ImplGroups = append(v.ImplGroups, group) + } else { + // T is concrete. + if r.from != nil { + // "T implements "... + group := implGroupJSON{ + Descr: types.TypeString(T, qualifier), + } + for _, super := range r.from { + addFact(&group, super, false) + } + v.ImplGroups = append(v.ImplGroups, group) + } + if r.fromPtr != nil { + // "*C implements "... + group := implGroupJSON{ + Descr: "*" + types.TypeString(T, qualifier), + } + for _, psuper := range r.fromPtr { + addFact(&group, psuper, false) + } + v.ImplGroups = append(v.ImplGroups, group) + } + } + } + + // METHOD SETS + for _, sel := range typeutil.IntuitiveMethodSet(T, &a.prog.MethodSets) { + meth := sel.Obj().(*types.Func) + pos := meth.Pos() // may be 0 for error.Error + v.Methods = append(v.Methods, anchorJSON{ + Href: a.posURL(pos, len(meth.Name())), + Text: types.SelectionString(sel, qualifier), + }) + } + + // Since there can be many specs per decl, we + // can't attach the link to the keyword 'type' + // (as we do with 'func'); we use the Ident. + fi, offset := a.fileAndOffset(obj.Pos()) + fi.addLink(aLink{ + start: offset, + end: offset + len(obj.Name()), + title: fmt.Sprintf("type info for %s", obj.Name()), + onclick: fmt.Sprintf("onClickTypeInfo(%d)", fi.addData(v)), + }) + + // Add info for exported package-level types to the package info. + if obj.Exported() && isPackageLevel(obj) { + // TODO(adonovan): Path is not unique! + // It is possible to declare a non-test package called x_test. + a.result.pkgInfo(obj.Pkg().Path()).addType(v) + } +} + +// -- utilities -------------------------------------------------------- + +func isInterface(T types.Type) bool { return types.IsInterface(T) } + +// deref returns a pointer's element type; otherwise it returns typ. +func deref(typ types.Type) types.Type { + if p, ok := typ.Underlying().(*types.Pointer); ok { + return p.Elem() + } + return typ +} + +// isPackageLevel reports whether obj is a package-level object. +func isPackageLevel(obj types.Object) bool { + return obj.Pkg().Scope().Lookup(obj.Name()) == obj +} diff --git a/vendor/golang.org/x/tools/godoc/appengine.go b/vendor/golang.org/x/tools/godoc/appengine.go new file mode 100644 index 0000000000..2a685585c7 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/appengine.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 appengine + +package godoc + +import "appengine" + +func init() { + onAppengine = !appengine.IsDevAppServer() +} diff --git a/vendor/golang.org/x/tools/godoc/cmdline.go b/vendor/golang.org/x/tools/godoc/cmdline.go new file mode 100644 index 0000000000..9502ebbe40 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/cmdline.go @@ -0,0 +1,207 @@ +// Copyright 2013 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 godoc + +import ( + "fmt" + "go/ast" + "go/build" + "io" + "log" + "os" + pathpkg "path" + "path/filepath" + "regexp" + "strings" + + "golang.org/x/tools/godoc/vfs" +) + +const ( + target = "/target" + cmdPrefix = "cmd/" + srcPrefix = "src/" + toolsPath = "golang.org/x/tools/cmd/" +) + +// CommandLine returns godoc results to w. +// Note that it may add a /target path to fs. +func CommandLine(w io.Writer, fs vfs.NameSpace, pres *Presentation, args []string) error { + path := args[0] + srcMode := pres.SrcMode + cmdMode := strings.HasPrefix(path, cmdPrefix) + if strings.HasPrefix(path, srcPrefix) { + path = strings.TrimPrefix(path, srcPrefix) + srcMode = true + } + var abspath, relpath string + if cmdMode { + path = strings.TrimPrefix(path, cmdPrefix) + } else { + abspath, relpath = paths(fs, pres, path) + } + + var mode PageInfoMode + if relpath == builtinPkgPath { + // the fake built-in package contains unexported identifiers + mode = NoFiltering | NoTypeAssoc + } + if srcMode { + // only filter exports if we don't have explicit command-line filter arguments + if len(args) > 1 { + mode |= NoFiltering + } + mode |= ShowSource + } + + // First, try as package unless forced as command. + var info *PageInfo + if !cmdMode { + info = pres.GetPkgPageInfo(abspath, relpath, mode) + } + + // Second, try as command (if the path is not absolute). + var cinfo *PageInfo + if !filepath.IsAbs(path) { + // First try go.tools/cmd. + abspath = pathpkg.Join(pres.PkgFSRoot(), toolsPath+path) + cinfo = pres.GetCmdPageInfo(abspath, relpath, mode) + if cinfo.IsEmpty() { + // Then try $GOROOT/cmd. + abspath = pathpkg.Join(pres.CmdFSRoot(), path) + cinfo = pres.GetCmdPageInfo(abspath, relpath, mode) + } + } + + // determine what to use + if info == nil || info.IsEmpty() { + if cinfo != nil && !cinfo.IsEmpty() { + // only cinfo exists - switch to cinfo + info = cinfo + } + } else if cinfo != nil && !cinfo.IsEmpty() { + // both info and cinfo exist - use cinfo if info + // contains only subdirectory information + if info.PAst == nil && info.PDoc == nil { + info = cinfo + } else if relpath != target { + // The above check handles the case where an operating system path + // is provided (see documentation for paths below). In that case, + // relpath is set to "/target" (in anticipation of accessing packages there), + // and is therefore not expected to match a command. + fmt.Fprintf(w, "use 'godoc %s%s' for documentation on the %s command \n\n", cmdPrefix, relpath, relpath) + } + } + + if info == nil { + return fmt.Errorf("%s: no such directory or package", args[0]) + } + if info.Err != nil { + return info.Err + } + + if info.PDoc != nil && info.PDoc.ImportPath == target { + // Replace virtual /target with actual argument from command line. + info.PDoc.ImportPath = args[0] + } + + // If we have more than one argument, use the remaining arguments for filtering. + if len(args) > 1 { + info.IsFiltered = true + filterInfo(args[1:], info) + } + + packageText := pres.PackageText + if pres.HTMLMode { + packageText = pres.PackageHTML + } + if err := packageText.Execute(w, info); err != nil { + return err + } + return nil +} + +// paths determines the paths to use. +// +// If we are passed an operating system path like . or ./foo or /foo/bar or c:\mysrc, +// we need to map that path somewhere in the fs name space so that routines +// like getPageInfo will see it. We use the arbitrarily-chosen virtual path "/target" +// for this. That is, if we get passed a directory like the above, we map that +// directory so that getPageInfo sees it as /target. +// Returns the absolute and relative paths. +func paths(fs vfs.NameSpace, pres *Presentation, path string) (string, string) { + if filepath.IsAbs(path) { + fs.Bind(target, vfs.OS(path), "/", vfs.BindReplace) + return target, target + } + if build.IsLocalImport(path) { + cwd, _ := os.Getwd() // ignore errors + path = filepath.Join(cwd, path) + fs.Bind(target, vfs.OS(path), "/", vfs.BindReplace) + return target, target + } + if bp, _ := build.Import(path, "", build.FindOnly); bp.Dir != "" && bp.ImportPath != "" { + fs.Bind(target, vfs.OS(bp.Dir), "/", vfs.BindReplace) + return target, bp.ImportPath + } + return pathpkg.Join(pres.PkgFSRoot(), path), path +} + +// filterInfo updates info to include only the nodes that match the given +// filter args. +func filterInfo(args []string, info *PageInfo) { + rx, err := makeRx(args) + if err != nil { + log.Fatalf("illegal regular expression from %v: %v", args, err) + } + + filter := func(s string) bool { return rx.MatchString(s) } + switch { + case info.PAst != nil: + newPAst := map[string]*ast.File{} + for name, a := range info.PAst { + cmap := ast.NewCommentMap(info.FSet, a, a.Comments) + a.Comments = []*ast.CommentGroup{} // remove all comments. + ast.FilterFile(a, filter) + if len(a.Decls) > 0 { + newPAst[name] = a + } + for _, d := range a.Decls { + // add back the comments associated with d only + comments := cmap.Filter(d).Comments() + a.Comments = append(a.Comments, comments...) + } + } + info.PAst = newPAst // add only matching files. + case info.PDoc != nil: + info.PDoc.Filter(filter) + } +} + +// Does s look like a regular expression? +func isRegexp(s string) bool { + return strings.IndexAny(s, ".(|)*+?^$[]") >= 0 +} + +// Make a regular expression of the form +// names[0]|names[1]|...names[len(names)-1]. +// Returns an error if the regular expression is illegal. +func makeRx(names []string) (*regexp.Regexp, error) { + if len(names) == 0 { + return nil, fmt.Errorf("no expression provided") + } + s := "" + for i, name := range names { + if i > 0 { + s += "|" + } + if isRegexp(name) { + s += name + } else { + s += "^" + name + "$" // must match exactly + } + } + return regexp.Compile(s) +} diff --git a/vendor/golang.org/x/tools/godoc/cmdline_test.go b/vendor/golang.org/x/tools/godoc/cmdline_test.go new file mode 100644 index 0000000000..602f2bbaba --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/cmdline_test.go @@ -0,0 +1,294 @@ +// Copyright 2013 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 godoc + +import ( + "bytes" + "go/build" + "io/ioutil" + "os" + "path/filepath" + "reflect" + "regexp" + "runtime" + "testing" + "text/template" + + "golang.org/x/tools/godoc/vfs" + "golang.org/x/tools/godoc/vfs/mapfs" +) + +// setupGoroot creates temporary directory to act as GOROOT when running tests +// that depend upon the build package. It updates build.Default to point to the +// new GOROOT. +// It returns a function that can be called to reset build.Default and remove +// the temporary directory. +func setupGoroot(t *testing.T) (cleanup func()) { + var stdLib = map[string]string{ + "src/fmt/fmt.go": `// Package fmt implements formatted I/O. +package fmt + +type Stringer interface { + String() string +} +`, + } + goroot, err := ioutil.TempDir("", "cmdline_test") + if err != nil { + t.Fatal(err) + } + origContext := build.Default + build.Default = build.Context{ + GOROOT: goroot, + Compiler: "gc", + } + for relname, contents := range stdLib { + name := filepath.Join(goroot, relname) + if err := os.MkdirAll(filepath.Dir(name), 0770); err != nil { + t.Fatal(err) + } + if err := ioutil.WriteFile(name, []byte(contents), 0770); err != nil { + t.Fatal(err) + } + } + + return func() { + if err := os.RemoveAll(goroot); err != nil { + t.Log(err) + } + build.Default = origContext + } +} + +func TestPaths(t *testing.T) { + cleanup := setupGoroot(t) + defer cleanup() + + pres := &Presentation{ + pkgHandler: handlerServer{ + fsRoot: "/fsroot", + }, + } + fs := make(vfs.NameSpace) + + absPath := "/foo/fmt" + if runtime.GOOS == "windows" { + absPath = `c:\foo\fmt` + } + + for _, tc := range []struct { + desc string + path string + expAbs string + expRel string + }{ + { + "Absolute path", + absPath, + "/target", + "/target", + }, + { + "Local import", + "../foo/fmt", + "/target", + "/target", + }, + { + "Import", + "fmt", + "/target", + "fmt", + }, + { + "Default", + "unknownpkg", + "/fsroot/unknownpkg", + "unknownpkg", + }, + } { + abs, rel := paths(fs, pres, tc.path) + if abs != tc.expAbs || rel != tc.expRel { + t.Errorf("%s: paths(%q) = %s,%s; want %s,%s", tc.desc, tc.path, abs, rel, tc.expAbs, tc.expRel) + } + } +} + +func TestMakeRx(t *testing.T) { + for _, tc := range []struct { + desc string + names []string + exp string + }{ + { + desc: "empty string", + names: []string{""}, + exp: `^$`, + }, + { + desc: "simple text", + names: []string{"a"}, + exp: `^a$`, + }, + { + desc: "two words", + names: []string{"foo", "bar"}, + exp: `^foo$|^bar$`, + }, + { + desc: "word & non-trivial", + names: []string{"foo", `ab?c`}, + exp: `^foo$|ab?c`, + }, + { + desc: "bad regexp", + names: []string{`(."`}, + exp: `(."`, + }, + } { + expRE, expErr := regexp.Compile(tc.exp) + if re, err := makeRx(tc.names); !reflect.DeepEqual(err, expErr) && !reflect.DeepEqual(re, expRE) { + t.Errorf("%s: makeRx(%v) = %q,%q; want %q,%q", tc.desc, tc.names, re, err, expRE, expErr) + } + } +} + +func TestCommandLine(t *testing.T) { + cleanup := setupGoroot(t) + defer cleanup() + mfs := mapfs.New(map[string]string{ + "src/bar/bar.go": `// Package bar is an example. +package bar +`, + "src/foo/foo.go": `// Package foo. +package foo + +// First function is first. +func First() { +} + +// Second function is second. +func Second() { +} +`, + "src/gen/gen.go": `// Package gen +package gen + +//line notgen.go:3 +// F doc //line 1 should appear +// line 2 should appear +func F() +//line foo.go:100`, // no newline on end to check corner cases! + "src/vet/vet.go": `// Package vet +package vet +`, + "src/cmd/go/doc.go": `// The go command +package main +`, + "src/cmd/gofmt/doc.go": `// The gofmt command +package main +`, + "src/cmd/vet/vet.go": `// The vet command +package main +`, + }) + fs := make(vfs.NameSpace) + fs.Bind("/", mfs, "/", vfs.BindReplace) + c := NewCorpus(fs) + p := &Presentation{Corpus: c} + p.cmdHandler = handlerServer{ + p: p, + c: c, + pattern: "/cmd/", + fsRoot: "/src/cmd", + } + p.pkgHandler = handlerServer{ + p: p, + c: c, + pattern: "/pkg/", + fsRoot: "/src", + exclude: []string{"/src/cmd"}, + } + p.initFuncMap() + p.PackageText = template.Must(template.New("PackageText").Funcs(p.FuncMap()).Parse(`{{$info := .}}{{$filtered := .IsFiltered}}{{if $filtered}}{{range .PAst}}{{range .Decls}}{{node $info .}}{{end}}{{end}}{{else}}{{with .PAst}}{{range $filename, $ast := .}}{{$filename}}: +{{node $ $ast}}{{end}}{{end}}{{end}}{{with .PDoc}}{{if $.IsMain}}COMMAND {{.Doc}}{{else}}PACKAGE {{.Doc}}{{end}}{{with .Funcs}} +{{range .}}{{node $ .Decl}} +{{comment_text .Doc " " "\t"}}{{end}}{{end}}{{end}}`)) + + for _, tc := range []struct { + desc string + args []string + exp string + err bool + }{ + { + desc: "standard package", + args: []string{"fmt"}, + exp: "PACKAGE Package fmt implements formatted I/O.\n", + }, + { + desc: "package", + args: []string{"bar"}, + exp: "PACKAGE Package bar is an example.\n", + }, + { + desc: "package w. filter", + args: []string{"foo", "First"}, + exp: "PACKAGE \nfunc First()\n First function is first.\n", + }, + { + desc: "package w. bad filter", + args: []string{"foo", "DNE"}, + exp: "PACKAGE ", + }, + { + desc: "source mode", + args: []string{"src/bar"}, + exp: "bar/bar.go:\n// Package bar is an example.\npackage bar\n", + }, + { + desc: "source mode w. filter", + args: []string{"src/foo", "Second"}, + exp: "// Second function is second.\nfunc Second() {\n}", + }, + { + desc: "package w. //line comments", + args: []string{"gen", "F"}, + exp: "PACKAGE \nfunc F()\n F doc //line 1 should appear line 2 should appear\n", + }, + { + desc: "command", + args: []string{"go"}, + exp: "COMMAND The go command\n", + }, + { + desc: "forced command", + args: []string{"cmd/gofmt"}, + exp: "COMMAND The gofmt command\n", + }, + { + desc: "bad arg", + args: []string{"doesnotexist"}, + err: true, + }, + { + desc: "both command and package", + args: []string{"vet"}, + exp: "use 'godoc cmd/vet' for documentation on the vet command \n\nPACKAGE Package vet\n", + }, + { + desc: "root directory", + args: []string{"/"}, + exp: "", + }, + } { + w := new(bytes.Buffer) + err := CommandLine(w, fs, p, tc.args) + if got, want := w.String(), tc.exp; got != want || tc.err == (err == nil) { + t.Errorf("%s: CommandLine(%v) = %q (%v); want %q (%v)", + tc.desc, tc.args, got, err, want, tc.err) + } + } +} diff --git a/vendor/golang.org/x/tools/godoc/corpus.go b/vendor/golang.org/x/tools/godoc/corpus.go new file mode 100644 index 0000000000..f2c7ebbf37 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/corpus.go @@ -0,0 +1,157 @@ +// Copyright 2013 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 godoc + +import ( + "errors" + pathpkg "path" + "time" + + "golang.org/x/tools/godoc/analysis" + "golang.org/x/tools/godoc/util" + "golang.org/x/tools/godoc/vfs" +) + +// A Corpus holds all the state related to serving and indexing a +// collection of Go code. +// +// Construct a new Corpus with NewCorpus, then modify options, +// then call its Init method. +type Corpus struct { + fs vfs.FileSystem + + // Verbose logging. + Verbose bool + + // IndexEnabled controls whether indexing is enabled. + IndexEnabled bool + + // IndexFiles specifies a glob pattern specifying index files. + // If not empty, the index is read from these files in sorted + // order. + IndexFiles string + + // IndexThrottle specifies the indexing throttle value + // between 0.0 and 1.0. At 0.0, the indexer always sleeps. + // At 1.0, the indexer never sleeps. Because 0.0 is useless + // and redundant with setting IndexEnabled to false, the + // zero value for IndexThrottle means 0.9. + IndexThrottle float64 + + // IndexInterval specifies the time to sleep between reindexing + // all the sources. + // If zero, a default is used. If negative, the index is only + // built once. + IndexInterval time.Duration + + // IndexDocs enables indexing of Go documentation. + // This will produce search results for exported types, functions, + // methods, variables, and constants, and will link to the godoc + // documentation for those identifiers. + IndexDocs bool + + // IndexGoCode enables indexing of Go source code. + // This will produce search results for internal and external identifiers + // and will link to both declarations and uses of those identifiers in + // source code. + IndexGoCode bool + + // IndexFullText enables full-text indexing. + // This will provide search results for any matching text in any file that + // is indexed, including non-Go files (see whitelisted in index.go). + // Regexp searching is supported via full-text indexing. + IndexFullText bool + + // MaxResults optionally specifies the maximum results for indexing. + MaxResults int + + // SummarizePackage optionally specifies a function to + // summarize a package. It exists as an optimization to + // avoid reading files to parse package comments. + // + // If SummarizePackage returns false for ok, the caller + // ignores all return values and parses the files in the package + // as if SummarizePackage were nil. + // + // If showList is false, the package is hidden from the + // package listing. + SummarizePackage func(pkg string) (summary string, showList, ok bool) + + // IndexDirectory optionally specifies a function to determine + // whether the provided directory should be indexed. The dir + // will be of the form "/src/cmd/6a", "/doc/play", + // "/src/io", etc. + // If nil, all directories are indexed if indexing is enabled. + IndexDirectory func(dir string) bool + + testDir string // TODO(bradfitz,adg): migrate old godoc flag? looks unused. + + // Send a value on this channel to trigger a metadata refresh. + // It is buffered so that if a signal is not lost if sent + // during a refresh. + refreshMetadataSignal chan bool + + // file system information + fsTree util.RWValue // *Directory tree of packages, updated with each sync (but sync code is removed now) + fsModified util.RWValue // timestamp of last call to invalidateIndex + docMetadata util.RWValue // mapping from paths to *Metadata + + // SearchIndex is the search index in use. + searchIndex util.RWValue + + // Analysis is the result of type and pointer analysis. + Analysis analysis.Result +} + +// NewCorpus returns a new Corpus from a filesystem. +// The returned corpus has all indexing enabled and MaxResults set to 1000. +// Change or set any options on Corpus before calling the Corpus.Init method. +func NewCorpus(fs vfs.FileSystem) *Corpus { + c := &Corpus{ + fs: fs, + refreshMetadataSignal: make(chan bool, 1), + + MaxResults: 1000, + IndexEnabled: true, + IndexDocs: true, + IndexGoCode: true, + IndexFullText: true, + } + return c +} + +func (c *Corpus) CurrentIndex() (*Index, time.Time) { + v, t := c.searchIndex.Get() + idx, _ := v.(*Index) + return idx, t +} + +func (c *Corpus) FSModifiedTime() time.Time { + _, ts := c.fsModified.Get() + return ts +} + +// Init initializes Corpus, once options on Corpus are set. +// It must be called before any subsequent method calls. +func (c *Corpus) Init() error { + // TODO(bradfitz): do this in a goroutine because newDirectory might block for a long time? + // It used to be sometimes done in a goroutine before, at least in HTTP server mode. + if err := c.initFSTree(); err != nil { + return err + } + c.updateMetadata() + go c.refreshMetadataLoop() + return nil +} + +func (c *Corpus) initFSTree() error { + dir := c.newDirectory(pathpkg.Join("/", c.testDir), -1) + if dir == nil { + return errors.New("godoc: corpus fstree is nil") + } + c.fsTree.Set(dir) + c.invalidateIndex() + return nil +} diff --git a/vendor/golang.org/x/tools/godoc/dirtrees.go b/vendor/golang.org/x/tools/godoc/dirtrees.go new file mode 100644 index 0000000000..a55b324f73 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/dirtrees.go @@ -0,0 +1,336 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains the code dealing with package directory trees. + +package godoc + +import ( + "bytes" + "go/doc" + "go/parser" + "go/token" + "log" + "os" + pathpkg "path" + "strings" +) + +// Conventional name for directories containing test data. +// Excluded from directory trees. +// +const testdataDirName = "testdata" + +type Directory struct { + Depth int + Path string // directory path; includes Name + Name string // directory name + HasPkg bool // true if the directory contains at least one package + Synopsis string // package documentation, if any + Dirs []*Directory // subdirectories +} + +func isGoFile(fi os.FileInfo) bool { + name := fi.Name() + return !fi.IsDir() && + len(name) > 0 && name[0] != '.' && // ignore .files + pathpkg.Ext(name) == ".go" +} + +func isPkgFile(fi os.FileInfo) bool { + return isGoFile(fi) && + !strings.HasSuffix(fi.Name(), "_test.go") // ignore test files +} + +func isPkgDir(fi os.FileInfo) bool { + name := fi.Name() + return fi.IsDir() && len(name) > 0 && + name[0] != '_' && name[0] != '.' // ignore _files and .files +} + +type treeBuilder struct { + c *Corpus + maxDepth int +} + +func (b *treeBuilder) newDirTree(fset *token.FileSet, path, name string, depth int) *Directory { + if name == testdataDirName { + return nil + } + + if depth >= b.maxDepth { + // return a dummy directory so that the parent directory + // doesn't get discarded just because we reached the max + // directory depth + return &Directory{ + Depth: depth, + Path: path, + Name: name, + } + } + + var synopses [3]string // prioritized package documentation (0 == highest priority) + + show := true // show in package listing + hasPkgFiles := false + haveSummary := false + + if hook := b.c.SummarizePackage; hook != nil { + if summary, show0, ok := hook(strings.TrimPrefix(path, "/src/")); ok { + hasPkgFiles = true + show = show0 + synopses[0] = summary + haveSummary = true + } + } + + list, _ := b.c.fs.ReadDir(path) + + // determine number of subdirectories and if there are package files + var dirchs []chan *Directory + + for _, d := range list { + switch { + case isPkgDir(d): + ch := make(chan *Directory, 1) + dirchs = append(dirchs, ch) + go func(d os.FileInfo) { + name := d.Name() + ch <- b.newDirTree(fset, pathpkg.Join(path, name), name, depth+1) + }(d) + case !haveSummary && isPkgFile(d): + // looks like a package file, but may just be a file ending in ".go"; + // don't just count it yet (otherwise we may end up with hasPkgFiles even + // though the directory doesn't contain any real package files - was bug) + // no "optimal" package synopsis yet; continue to collect synopses + file, err := b.c.parseFile(fset, pathpkg.Join(path, d.Name()), + parser.ParseComments|parser.PackageClauseOnly) + if err == nil { + hasPkgFiles = true + if file.Doc != nil { + // prioritize documentation + i := -1 + switch file.Name.Name { + case name: + i = 0 // normal case: directory name matches package name + case "main": + i = 1 // directory contains a main package + default: + i = 2 // none of the above + } + if 0 <= i && i < len(synopses) && synopses[i] == "" { + synopses[i] = doc.Synopsis(file.Doc.Text()) + } + } + haveSummary = synopses[0] != "" + } + } + } + + // create subdirectory tree + var dirs []*Directory + for _, ch := range dirchs { + if d := <-ch; d != nil { + dirs = append(dirs, d) + } + } + + // if there are no package files and no subdirectories + // containing package files, ignore the directory + if !hasPkgFiles && len(dirs) == 0 { + return nil + } + + // select the highest-priority synopsis for the directory entry, if any + synopsis := "" + for _, synopsis = range synopses { + if synopsis != "" { + break + } + } + + return &Directory{ + Depth: depth, + Path: path, + Name: name, + HasPkg: hasPkgFiles && show, // TODO(bradfitz): add proper Hide field? + Synopsis: synopsis, + Dirs: dirs, + } +} + +// newDirectory creates a new package directory tree with at most maxDepth +// levels, anchored at root. The result tree is pruned such that it only +// contains directories that contain package files or that contain +// subdirectories containing package files (transitively). If a non-nil +// pathFilter is provided, directory paths additionally must be accepted +// by the filter (i.e., pathFilter(path) must be true). If a value >= 0 is +// provided for maxDepth, nodes at larger depths are pruned as well; they +// are assumed to contain package files even if their contents are not known +// (i.e., in this case the tree may contain directories w/o any package files). +// +func (c *Corpus) newDirectory(root string, maxDepth int) *Directory { + // The root could be a symbolic link so use Stat not Lstat. + d, err := c.fs.Stat(root) + // If we fail here, report detailed error messages; otherwise + // is is hard to see why a directory tree was not built. + switch { + case err != nil: + log.Printf("newDirectory(%s): %s", root, err) + return nil + case root != "/" && !isPkgDir(d): + log.Printf("newDirectory(%s): not a package directory", root) + return nil + case root == "/" && !d.IsDir(): + log.Printf("newDirectory(%s): not a directory", root) + return nil + } + if maxDepth < 0 { + maxDepth = 1e6 // "infinity" + } + b := treeBuilder{c, maxDepth} + // the file set provided is only for local parsing, no position + // information escapes and thus we don't need to save the set + return b.newDirTree(token.NewFileSet(), root, d.Name(), 0) +} + +func (dir *Directory) writeLeafs(buf *bytes.Buffer) { + if dir != nil { + if len(dir.Dirs) == 0 { + buf.WriteString(dir.Path) + buf.WriteByte('\n') + return + } + + for _, d := range dir.Dirs { + d.writeLeafs(buf) + } + } +} + +func (dir *Directory) walk(c chan<- *Directory, skipRoot bool) { + if dir != nil { + if !skipRoot { + c <- dir + } + for _, d := range dir.Dirs { + d.walk(c, false) + } + } +} + +func (dir *Directory) iter(skipRoot bool) <-chan *Directory { + c := make(chan *Directory) + go func() { + dir.walk(c, skipRoot) + close(c) + }() + return c +} + +func (dir *Directory) lookupLocal(name string) *Directory { + for _, d := range dir.Dirs { + if d.Name == name { + return d + } + } + return nil +} + +func splitPath(p string) []string { + p = strings.TrimPrefix(p, "/") + if p == "" { + return nil + } + return strings.Split(p, "/") +} + +// lookup looks for the *Directory for a given path, relative to dir. +func (dir *Directory) lookup(path string) *Directory { + d := splitPath(dir.Path) + p := splitPath(path) + i := 0 + for i < len(d) { + if i >= len(p) || d[i] != p[i] { + return nil + } + i++ + } + for dir != nil && i < len(p) { + dir = dir.lookupLocal(p[i]) + i++ + } + return dir +} + +// DirEntry describes a directory entry. The Depth and Height values +// are useful for presenting an entry in an indented fashion. +// +type DirEntry struct { + Depth int // >= 0 + Height int // = DirList.MaxHeight - Depth, > 0 + Path string // directory path; includes Name, relative to DirList root + Name string // directory name + HasPkg bool // true if the directory contains at least one package + Synopsis string // package documentation, if any +} + +type DirList struct { + MaxHeight int // directory tree height, > 0 + List []DirEntry +} + +// listing creates a (linear) directory listing from a directory tree. +// If skipRoot is set, the root directory itself is excluded from the list. +// If filter is set, only the directory entries whose paths match the filter +// are included. +// +func (root *Directory) listing(skipRoot bool, filter func(string) bool) *DirList { + if root == nil { + return nil + } + + // determine number of entries n and maximum height + n := 0 + minDepth := 1 << 30 // infinity + maxDepth := 0 + for d := range root.iter(skipRoot) { + n++ + if minDepth > d.Depth { + minDepth = d.Depth + } + if maxDepth < d.Depth { + maxDepth = d.Depth + } + } + maxHeight := maxDepth - minDepth + 1 + + if n == 0 { + return nil + } + + // create list + list := make([]DirEntry, 0, n) + for d := range root.iter(skipRoot) { + if filter != nil && !filter(d.Path) { + continue + } + var p DirEntry + p.Depth = d.Depth - minDepth + p.Height = maxHeight - p.Depth + // the path is relative to root.Path - remove the root.Path + // prefix (the prefix should always be present but avoid + // crashes and check) + path := strings.TrimPrefix(d.Path, root.Path) + // remove leading separator if any - path must be relative + path = strings.TrimPrefix(path, "/") + p.Path = path + p.Name = d.Name + p.HasPkg = d.HasPkg + p.Synopsis = d.Synopsis + list = append(list, p) + } + + return &DirList{maxHeight, list} +} diff --git a/vendor/golang.org/x/tools/godoc/dl/dl.go b/vendor/golang.org/x/tools/godoc/dl/dl.go new file mode 100644 index 0000000000..ed6e590243 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/dl/dl.go @@ -0,0 +1,511 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// +build appengine + +// Package dl implements a simple downloads frontend server. +// +// It accepts HTTP POST requests to create a new download metadata entity, and +// lists entities with sorting and filtering. +// It is designed to run only on the instance of godoc that serves golang.org. +package dl + +import ( + "crypto/hmac" + "crypto/md5" + "encoding/json" + "fmt" + "html/template" + "io" + "net/http" + "regexp" + "sort" + "strconv" + "strings" + "sync" + "time" + + "golang.org/x/net/context" + + "google.golang.org/appengine" + "google.golang.org/appengine/datastore" + "google.golang.org/appengine/log" + "google.golang.org/appengine/memcache" + "google.golang.org/appengine/user" +) + +const ( + gcsBaseURL = "https://storage.googleapis.com/golang/" + cacheKey = "download_list_3" // increment if listTemplateData changes + cacheDuration = time.Hour +) + +func RegisterHandlers(mux *http.ServeMux) { + mux.Handle("/dl", http.RedirectHandler("/dl/", http.StatusFound)) + mux.HandleFunc("/dl/", getHandler) // also serves listHandler + mux.HandleFunc("/dl/upload", uploadHandler) + mux.HandleFunc("/dl/init", initHandler) +} + +type File struct { + Filename string + OS string + Arch string + Version string + Checksum string `datastore:",noindex"` // SHA1; deprecated + ChecksumSHA256 string `datastore:",noindex"` + Size int64 `datastore:",noindex"` + Kind string // "archive", "installer", "source" + Uploaded time.Time +} + +func (f File) ChecksumType() string { + if f.ChecksumSHA256 != "" { + return "SHA256" + } + return "SHA1" +} + +func (f File) PrettyChecksum() string { + if f.ChecksumSHA256 != "" { + return f.ChecksumSHA256 + } + return f.Checksum +} + +func (f File) PrettyOS() string { + if f.OS == "darwin" { + switch { + case strings.Contains(f.Filename, "osx10.8"): + return "OS X 10.8+" + case strings.Contains(f.Filename, "osx10.6"): + return "OS X 10.6+" + } + } + return pretty(f.OS) +} + +func (f File) PrettySize() string { + const mb = 1 << 20 + if f.Size == 0 { + return "" + } + if f.Size < mb { + // All Go releases are >1mb, but handle this case anyway. + return fmt.Sprintf("%v bytes", f.Size) + } + return fmt.Sprintf("%.0fMB", float64(f.Size)/mb) +} + +func (f File) Highlight() bool { + switch { + case f.Kind == "source": + return true + case f.Arch == "amd64" && f.OS == "linux": + return true + case f.Arch == "amd64" && f.Kind == "installer": + switch f.OS { + case "windows": + return true + case "darwin": + if !strings.Contains(f.Filename, "osx10.6") { + return true + } + } + } + return false +} + +func (f File) URL() string { + return gcsBaseURL + f.Filename +} + +type Release struct { + Version string + Stable bool + Files []File + Visible bool // show files on page load +} + +type Feature struct { + // The File field will be filled in by the first stable File + // whose name matches the given fileRE. + File + fileRE *regexp.Regexp + + Platform string // "Microsoft Windows", "Mac OS X", "Linux" + Requirements string // "Windows XP and above, 64-bit Intel Processor" +} + +// featuredFiles lists the platforms and files to be featured +// at the top of the downloads page. +var featuredFiles = []Feature{ + { + Platform: "Microsoft Windows", + Requirements: "Windows XP or later, Intel 64-bit processor", + fileRE: regexp.MustCompile(`\.windows-amd64\.msi$`), + }, + { + Platform: "Apple OS X", + Requirements: "OS X 10.8 or later, Intel 64-bit processor", + fileRE: regexp.MustCompile(`\.darwin-amd64(-osx10\.8)?\.pkg$`), + }, + { + Platform: "Linux", + Requirements: "Linux 2.6.23 or later, Intel 64-bit processor", + fileRE: regexp.MustCompile(`\.linux-amd64\.tar\.gz$`), + }, + { + Platform: "Source", + fileRE: regexp.MustCompile(`\.src\.tar\.gz$`), + }, +} + +// data to send to the template; increment cacheKey if you change this. +type listTemplateData struct { + Featured []Feature + Stable, Unstable []Release + LoginURL string +} + +var ( + listTemplate = template.Must(template.New("").Funcs(templateFuncs).Parse(templateHTML)) + templateFuncs = template.FuncMap{"pretty": pretty} +) + +func listHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != "GET" { + http.Error(w, "method not allowed", http.StatusMethodNotAllowed) + return + } + var ( + c = appengine.NewContext(r) + d listTemplateData + ) + if _, err := memcache.Gob.Get(c, cacheKey, &d); err != nil { + if err == memcache.ErrCacheMiss { + log.Debugf(c, "cache miss") + } else { + log.Errorf(c, "cache get error: %v", err) + } + + var fs []File + _, err := datastore.NewQuery("File").Ancestor(rootKey(c)).GetAll(c, &fs) + if err != nil { + log.Errorf(c, "error listing: %v", err) + return + } + d.Stable, d.Unstable = filesToReleases(fs) + if len(d.Stable) > 0 { + d.Featured = filesToFeatured(d.Stable[0].Files) + } + + d.LoginURL, _ = user.LoginURL(c, "/dl") + if user.Current(c) != nil { + d.LoginURL, _ = user.LogoutURL(c, "/dl") + } + + item := &memcache.Item{Key: cacheKey, Object: &d, Expiration: cacheDuration} + if err := memcache.Gob.Set(c, item); err != nil { + log.Errorf(c, "cache set error: %v", err) + } + } + if err := listTemplate.ExecuteTemplate(w, "root", d); err != nil { + log.Errorf(c, "error executing template: %v", err) + } +} + +func filesToFeatured(fs []File) (featured []Feature) { + for _, feature := range featuredFiles { + for _, file := range fs { + if feature.fileRE.MatchString(file.Filename) { + feature.File = file + featured = append(featured, feature) + break + } + } + } + return +} + +func filesToReleases(fs []File) (stable, unstable []Release) { + sort.Sort(fileOrder(fs)) + + var r *Release + var stableMaj, stableMin int + add := func() { + if r == nil { + return + } + if r.Stable { + if len(stable) == 0 { + // Display files for latest stable release. + stableMaj, stableMin, _ = parseVersion(r.Version) + r.Visible = len(stable) == 0 + } + stable = append(stable, *r) + return + } + if len(unstable) != 0 { + // Only show one (latest) unstable version. + return + } + maj, min, _ := parseVersion(r.Version) + if maj < stableMaj || maj == stableMaj && min <= stableMin { + // Display unstable version only if newer than the + // latest stable release. + return + } + r.Visible = true + unstable = append(unstable, *r) + } + for _, f := range fs { + if r == nil || f.Version != r.Version { + add() + r = &Release{ + Version: f.Version, + Stable: isStable(f.Version), + } + } + r.Files = append(r.Files, f) + } + add() + return +} + +// isStable reports whether the version string v is a stable version. +func isStable(v string) bool { + return !strings.Contains(v, "beta") && !strings.Contains(v, "rc") +} + +type fileOrder []File + +func (s fileOrder) Len() int { return len(s) } +func (s fileOrder) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s fileOrder) Less(i, j int) bool { + a, b := s[i], s[j] + if av, bv := a.Version, b.Version; av != bv { + return versionLess(av, bv) + } + if a.OS != b.OS { + return a.OS < b.OS + } + if a.Arch != b.Arch { + return a.Arch < b.Arch + } + if a.Kind != b.Kind { + return a.Kind < b.Kind + } + return a.Filename < b.Filename +} + +func versionLess(a, b string) bool { + // Put stable releases first. + if isStable(a) != isStable(b) { + return isStable(a) + } + maja, mina, ta := parseVersion(a) + majb, minb, tb := parseVersion(b) + if maja == majb { + if mina == minb { + return ta >= tb + } + return mina >= minb + } + return maja >= majb +} + +func parseVersion(v string) (maj, min int, tail string) { + if i := strings.Index(v, "beta"); i > 0 { + tail = v[i:] + v = v[:i] + } + if i := strings.Index(v, "rc"); i > 0 { + tail = v[i:] + v = v[:i] + } + p := strings.Split(strings.TrimPrefix(v, "go1."), ".") + maj, _ = strconv.Atoi(p[0]) + if len(p) < 2 { + return + } + min, _ = strconv.Atoi(p[1]) + return +} + +func uploadHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + http.Error(w, "method not allowed", http.StatusMethodNotAllowed) + return + } + c := appengine.NewContext(r) + + // Authenticate using a user token (same as gomote). + user := r.FormValue("user") + if !validUser(user) { + http.Error(w, "bad user", http.StatusForbidden) + return + } + if r.FormValue("key") != userKey(c, user) { + http.Error(w, "bad key", http.StatusForbidden) + return + } + + var f File + defer r.Body.Close() + if err := json.NewDecoder(r.Body).Decode(&f); err != nil { + log.Errorf(c, "error decoding upload JSON: %v", err) + http.Error(w, "Something broke", http.StatusInternalServerError) + return + } + if f.Filename == "" { + http.Error(w, "Must provide Filename", http.StatusBadRequest) + return + } + if f.Uploaded.IsZero() { + f.Uploaded = time.Now() + } + k := datastore.NewKey(c, "File", f.Filename, 0, rootKey(c)) + if _, err := datastore.Put(c, k, &f); err != nil { + log.Errorf(c, "putting File entity: %v", err) + http.Error(w, "could not put File entity", http.StatusInternalServerError) + return + } + if err := memcache.Delete(c, cacheKey); err != nil { + log.Errorf(c, "cache delete error: %v", err) + } + io.WriteString(w, "OK") +} + +func getHandler(w http.ResponseWriter, r *http.Request) { + name := strings.TrimPrefix(r.URL.Path, "/dl/") + if name == "" { + listHandler(w, r) + return + } + if !fileRe.MatchString(name) { + http.NotFound(w, r) + return + } + http.Redirect(w, r, gcsBaseURL+name, http.StatusFound) +} + +func validUser(user string) bool { + switch user { + case "adg", "bradfitz", "cbro": + return true + } + return false +} + +func userKey(c context.Context, user string) string { + h := hmac.New(md5.New, []byte(secret(c))) + h.Write([]byte("user-" + user)) + return fmt.Sprintf("%x", h.Sum(nil)) +} + +var fileRe = regexp.MustCompile(`^go[0-9a-z.]+\.[0-9a-z.-]+\.(tar\.gz|pkg|msi|zip)$`) + +func initHandler(w http.ResponseWriter, r *http.Request) { + var fileRoot struct { + Root string + } + c := appengine.NewContext(r) + k := rootKey(c) + err := datastore.RunInTransaction(c, func(c context.Context) error { + err := datastore.Get(c, k, &fileRoot) + if err != nil && err != datastore.ErrNoSuchEntity { + return err + } + _, err = datastore.Put(c, k, &fileRoot) + return err + }, nil) + if err != nil { + http.Error(w, err.Error(), 500) + return + } + io.WriteString(w, "OK") +} + +// rootKey is the ancestor of all File entities. +func rootKey(c context.Context) *datastore.Key { + return datastore.NewKey(c, "FileRoot", "root", 0, nil) +} + +// pretty returns a human-readable version of the given OS, Arch, or Kind. +func pretty(s string) string { + t, ok := prettyStrings[s] + if !ok { + return s + } + return t +} + +var prettyStrings = map[string]string{ + "darwin": "OS X", + "freebsd": "FreeBSD", + "linux": "Linux", + "windows": "Windows", + + "386": "32-bit", + "amd64": "64-bit", + + "armv6l": "ARMv6", + + "archive": "Archive", + "installer": "Installer", + "source": "Source", +} + +// Code below copied from x/build/app/key + +var theKey struct { + sync.RWMutex + builderKey +} + +type builderKey struct { + Secret string +} + +func (k *builderKey) Key(c context.Context) *datastore.Key { + return datastore.NewKey(c, "BuilderKey", "root", 0, nil) +} + +func secret(c context.Context) string { + // check with rlock + theKey.RLock() + k := theKey.Secret + theKey.RUnlock() + if k != "" { + return k + } + + // prepare to fill; check with lock and keep lock + theKey.Lock() + defer theKey.Unlock() + if theKey.Secret != "" { + return theKey.Secret + } + + // fill + if err := datastore.Get(c, theKey.Key(c), &theKey.builderKey); err != nil { + if err == datastore.ErrNoSuchEntity { + // If the key is not stored in datastore, write it. + // This only happens at the beginning of a new deployment. + // The code is left here for SDK use and in case a fresh + // deployment is ever needed. "gophers rule" is not the + // real key. + if !appengine.IsDevAppServer() { + panic("lost key from datastore") + } + theKey.Secret = "gophers rule" + datastore.Put(c, theKey.Key(c), &theKey.builderKey) + return theKey.Secret + } + panic("cannot load builder key: " + err.Error()) + } + + return theKey.Secret +} diff --git a/vendor/golang.org/x/tools/godoc/dl/dl_test.go b/vendor/golang.org/x/tools/godoc/dl/dl_test.go new file mode 100644 index 0000000000..9d6a057f37 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/dl/dl_test.go @@ -0,0 +1,72 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// +build appengine + +package dl + +import ( + "sort" + "strings" + "testing" +) + +func TestParseVersion(t *testing.T) { + for _, c := range []struct { + in string + maj, min int + tail string + }{ + {"go1.5", 5, 0, ""}, + {"go1.5beta1", 5, 0, "beta1"}, + {"go1.5.1", 5, 1, ""}, + {"go1.5.1rc1", 5, 1, "rc1"}, + } { + maj, min, tail := parseVersion(c.in) + if maj != c.maj || min != c.min || tail != c.tail { + t.Errorf("parseVersion(%q) = %v, %v, %q; want %v, %v, %q", + c.in, maj, min, tail, c.maj, c.min, c.tail) + } + } +} + +func TestFileOrder(t *testing.T) { + fs := []File{ + {Filename: "go1.3.src.tar.gz", Version: "go1.3", OS: "", Arch: "", Kind: "source"}, + {Filename: "go1.3.1.src.tar.gz", Version: "go1.3.1", OS: "", Arch: "", Kind: "source"}, + {Filename: "go1.3.linux-amd64.tar.gz", Version: "go1.3", OS: "linux", Arch: "amd64", Kind: "archive"}, + {Filename: "go1.3.1.linux-amd64.tar.gz", Version: "go1.3.1", OS: "linux", Arch: "amd64", Kind: "archive"}, + {Filename: "go1.3.darwin-amd64.tar.gz", Version: "go1.3", OS: "darwin", Arch: "amd64", Kind: "archive"}, + {Filename: "go1.3.darwin-amd64.pkg", Version: "go1.3", OS: "darwin", Arch: "amd64", Kind: "installer"}, + {Filename: "go1.3.darwin-386.tar.gz", Version: "go1.3", OS: "darwin", Arch: "386", Kind: "archive"}, + {Filename: "go1.3beta1.linux-amd64.tar.gz", Version: "go1.3beta1", OS: "linux", Arch: "amd64", Kind: "archive"}, + {Filename: "go1.3beta2.linux-amd64.tar.gz", Version: "go1.3beta2", OS: "linux", Arch: "amd64", Kind: "archive"}, + {Filename: "go1.3rc1.linux-amd64.tar.gz", Version: "go1.3rc1", OS: "linux", Arch: "amd64", Kind: "archive"}, + {Filename: "go1.2.linux-amd64.tar.gz", Version: "go1.2", OS: "linux", Arch: "amd64", Kind: "archive"}, + {Filename: "go1.2.2.linux-amd64.tar.gz", Version: "go1.2.2", OS: "linux", Arch: "amd64", Kind: "archive"}, + } + sort.Sort(fileOrder(fs)) + var s []string + for _, f := range fs { + s = append(s, f.Filename) + } + got := strings.Join(s, "\n") + want := strings.Join([]string{ + "go1.3.1.src.tar.gz", + "go1.3.1.linux-amd64.tar.gz", + "go1.3.src.tar.gz", + "go1.3.darwin-386.tar.gz", + "go1.3.darwin-amd64.tar.gz", + "go1.3.darwin-amd64.pkg", + "go1.3.linux-amd64.tar.gz", + "go1.2.2.linux-amd64.tar.gz", + "go1.2.linux-amd64.tar.gz", + "go1.3rc1.linux-amd64.tar.gz", + "go1.3beta2.linux-amd64.tar.gz", + "go1.3beta1.linux-amd64.tar.gz", + }, "\n") + if got != want { + t.Errorf("sort order is\n%s\nwant:\n%s", got, want) + } +} diff --git a/vendor/golang.org/x/tools/godoc/dl/tmpl.go b/vendor/golang.org/x/tools/godoc/dl/tmpl.go new file mode 100644 index 0000000000..54a2d54645 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/dl/tmpl.go @@ -0,0 +1,270 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// +build appengine + +package dl + +// TODO(adg): refactor this to use the tools/godoc/static template. + +const templateHTML = ` +{{define "root"}} + + + + + Downloads - The Go Programming Language + + + + + + + + +
    +
    + +

    Downloads

    + +

    +After downloading a binary release suitable for your system, +please follow the installation instructions. +

    + +

    +If you are building from source, +follow the source installation instructions. +

    + +

    +See the release history for more +information about Go releases. +

    + +{{with .Featured}} + +{{range .}} +{{template "download" .}} +{{end}} +{{end}} + +
    + +{{with .Stable}} +

    Stable versions

    +{{template "releases" .}} +{{end}} + +{{with .Unstable}} +

    Unstable version

    +{{template "releases" .}} +{{end}} + +

    Older versions

    + +

    +Older releases of Go are available at Google Code. +

    + + + + + + +
    +
    + + + + + + +{{end}} + +{{define "releases"}} +{{range .}} +
    + +
    +

    {{.Version}} ▾

    + {{if .Stable}}{{else}} +

    This is an unstable version of Go. Use with caution.

    + {{end}} + {{template "files" .Files}} +
    +
    +{{end}} +{{end}} + +{{define "files"}} + + + + + + + + + {{/* Use the checksum type of the first file for the column heading. */}} + + + +{{range .}} + + + + + + + + +{{else}} + + + +{{end}} +
    File nameKindOSArchSize{{(index . 0).ChecksumType}} Checksum
    {{.Filename}}{{pretty .Kind}}{{.PrettyOS}}{{pretty .Arch}}{{.PrettySize}}{{.PrettyChecksum}}
    No downloads available.
    +{{end}} + +{{define "download"}} + +
    {{.Platform}}
    +{{with .Requirements}}
    {{.}}
    {{end}} +
    + {{.Filename}} + {{if .Size}}({{.PrettySize}}){{end}} +
    +
    {{.ChecksumType}}: {{.PrettyChecksum}}
    +
    +{{end}} +` diff --git a/vendor/golang.org/x/tools/godoc/format.go b/vendor/golang.org/x/tools/godoc/format.go new file mode 100644 index 0000000000..6013238feb --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/format.go @@ -0,0 +1,371 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements FormatSelections and FormatText. +// FormatText is used to HTML-format Go and non-Go source +// text with line numbers and highlighted sections. It is +// built on top of FormatSelections, a generic formatter +// for "selected" text. + +package godoc + +import ( + "fmt" + "go/scanner" + "go/token" + "io" + "regexp" + "strconv" + "text/template" +) + +// ---------------------------------------------------------------------------- +// Implementation of FormatSelections + +// A Segment describes a text segment [start, end). +// The zero value of a Segment is a ready-to-use empty segment. +// +type Segment struct { + start, end int +} + +func (seg *Segment) isEmpty() bool { return seg.start >= seg.end } + +// A Selection is an "iterator" function returning a text segment. +// Repeated calls to a selection return consecutive, non-overlapping, +// non-empty segments, followed by an infinite sequence of empty +// segments. The first empty segment marks the end of the selection. +// +type Selection func() Segment + +// A LinkWriter writes some start or end "tag" to w for the text offset offs. +// It is called by FormatSelections at the start or end of each link segment. +// +type LinkWriter func(w io.Writer, offs int, start bool) + +// A SegmentWriter formats a text according to selections and writes it to w. +// The selections parameter is a bit set indicating which selections provided +// to FormatSelections overlap with the text segment: If the n'th bit is set +// in selections, the n'th selection provided to FormatSelections is overlapping +// with the text. +// +type SegmentWriter func(w io.Writer, text []byte, selections int) + +// FormatSelections takes a text and writes it to w using link and segment +// writers lw and sw as follows: lw is invoked for consecutive segment starts +// and ends as specified through the links selection, and sw is invoked for +// consecutive segments of text overlapped by the same selections as specified +// by selections. The link writer lw may be nil, in which case the links +// Selection is ignored. +// +func FormatSelections(w io.Writer, text []byte, lw LinkWriter, links Selection, sw SegmentWriter, selections ...Selection) { + // If we have a link writer, make the links + // selection the last entry in selections + if lw != nil { + selections = append(selections, links) + } + + // compute the sequence of consecutive segment changes + changes := newMerger(selections) + + // The i'th bit in bitset indicates that the text + // at the current offset is covered by selections[i]. + bitset := 0 + lastOffs := 0 + + // Text segments are written in a delayed fashion + // such that consecutive segments belonging to the + // same selection can be combined (peephole optimization). + // last describes the last segment which has not yet been written. + var last struct { + begin, end int // valid if begin < end + bitset int + } + + // flush writes the last delayed text segment + flush := func() { + if last.begin < last.end { + sw(w, text[last.begin:last.end], last.bitset) + } + last.begin = last.end // invalidate last + } + + // segment runs the segment [lastOffs, end) with the selection + // indicated by bitset through the segment peephole optimizer. + segment := func(end int) { + if lastOffs < end { // ignore empty segments + if last.end != lastOffs || last.bitset != bitset { + // the last segment is not adjacent to or + // differs from the new one + flush() + // start a new segment + last.begin = lastOffs + } + last.end = end + last.bitset = bitset + } + } + + for { + // get the next segment change + index, offs, start := changes.next() + if index < 0 || offs > len(text) { + // no more segment changes or the next change + // is past the end of the text - we're done + break + } + // determine the kind of segment change + if lw != nil && index == len(selections)-1 { + // we have a link segment change (see start of this function): + // format the previous selection segment, write the + // link tag and start a new selection segment + segment(offs) + flush() + lastOffs = offs + lw(w, offs, start) + } else { + // we have a selection change: + // format the previous selection segment, determine + // the new selection bitset and start a new segment + segment(offs) + lastOffs = offs + mask := 1 << uint(index) + if start { + bitset |= mask + } else { + bitset &^= mask + } + } + } + segment(len(text)) + flush() +} + +// A merger merges a slice of Selections and produces a sequence of +// consecutive segment change events through repeated next() calls. +// +type merger struct { + selections []Selection + segments []Segment // segments[i] is the next segment of selections[i] +} + +const infinity int = 2e9 + +func newMerger(selections []Selection) *merger { + segments := make([]Segment, len(selections)) + for i, sel := range selections { + segments[i] = Segment{infinity, infinity} + if sel != nil { + if seg := sel(); !seg.isEmpty() { + segments[i] = seg + } + } + } + return &merger{selections, segments} +} + +// next returns the next segment change: index specifies the Selection +// to which the segment belongs, offs is the segment start or end offset +// as determined by the start value. If there are no more segment changes, +// next returns an index value < 0. +// +func (m *merger) next() (index, offs int, start bool) { + // find the next smallest offset where a segment starts or ends + offs = infinity + index = -1 + for i, seg := range m.segments { + switch { + case seg.start < offs: + offs = seg.start + index = i + start = true + case seg.end < offs: + offs = seg.end + index = i + start = false + } + } + if index < 0 { + // no offset found => all selections merged + return + } + // offset found - it's either the start or end offset but + // either way it is ok to consume the start offset: set it + // to infinity so it won't be considered in the following + // next call + m.segments[index].start = infinity + if start { + return + } + // end offset found - consume it + m.segments[index].end = infinity + // advance to the next segment for that selection + seg := m.selections[index]() + if !seg.isEmpty() { + m.segments[index] = seg + } + return +} + +// ---------------------------------------------------------------------------- +// Implementation of FormatText + +// lineSelection returns the line segments for text as a Selection. +func lineSelection(text []byte) Selection { + i, j := 0, 0 + return func() (seg Segment) { + // find next newline, if any + for j < len(text) { + j++ + if text[j-1] == '\n' { + break + } + } + if i < j { + // text[i:j] constitutes a line + seg = Segment{i, j} + i = j + } + return + } +} + +// tokenSelection returns, as a selection, the sequence of +// consecutive occurrences of token sel in the Go src text. +// +func tokenSelection(src []byte, sel token.Token) Selection { + var s scanner.Scanner + fset := token.NewFileSet() + file := fset.AddFile("", fset.Base(), len(src)) + s.Init(file, src, nil, scanner.ScanComments) + return func() (seg Segment) { + for { + pos, tok, lit := s.Scan() + if tok == token.EOF { + break + } + offs := file.Offset(pos) + if tok == sel { + seg = Segment{offs, offs + len(lit)} + break + } + } + return + } +} + +// makeSelection is a helper function to make a Selection from a slice of pairs. +// Pairs describing empty segments are ignored. +// +func makeSelection(matches [][]int) Selection { + i := 0 + return func() Segment { + for i < len(matches) { + m := matches[i] + i++ + if m[0] < m[1] { + // non-empty segment + return Segment{m[0], m[1]} + } + } + return Segment{} + } +} + +// regexpSelection computes the Selection for the regular expression expr in text. +func regexpSelection(text []byte, expr string) Selection { + var matches [][]int + if rx, err := regexp.Compile(expr); err == nil { + matches = rx.FindAllIndex(text, -1) + } + return makeSelection(matches) +} + +var selRx = regexp.MustCompile(`^([0-9]+):([0-9]+)`) + +// RangeSelection computes the Selection for a text range described +// by the argument str; the range description must match the selRx +// regular expression. +func RangeSelection(str string) Selection { + m := selRx.FindStringSubmatch(str) + if len(m) >= 2 { + from, _ := strconv.Atoi(m[1]) + to, _ := strconv.Atoi(m[2]) + if from < to { + return makeSelection([][]int{{from, to}}) + } + } + return nil +} + +// Span tags for all the possible selection combinations that may +// be generated by FormatText. Selections are indicated by a bitset, +// and the value of the bitset specifies the tag to be used. +// +// bit 0: comments +// bit 1: highlights +// bit 2: selections +// +var startTags = [][]byte{ + /* 000 */ []byte(``), + /* 001 */ []byte(``), + /* 010 */ []byte(``), + /* 011 */ []byte(``), + /* 100 */ []byte(``), + /* 101 */ []byte(``), + /* 110 */ []byte(``), + /* 111 */ []byte(``), +} + +var endTag = []byte(``) + +func selectionTag(w io.Writer, text []byte, selections int) { + if selections < len(startTags) { + if tag := startTags[selections]; len(tag) > 0 { + w.Write(tag) + template.HTMLEscape(w, text) + w.Write(endTag) + return + } + } + template.HTMLEscape(w, text) +} + +// FormatText HTML-escapes text and writes it to w. +// Consecutive text segments are wrapped in HTML spans (with tags as +// defined by startTags and endTag) as follows: +// +// - if line >= 0, line number (ln) spans are inserted before each line, +// starting with the value of line +// - if the text is Go source, comments get the "comment" span class +// - each occurrence of the regular expression pattern gets the "highlight" +// span class +// - text segments covered by selection get the "selection" span class +// +// Comments, highlights, and selections may overlap arbitrarily; the respective +// HTML span classes are specified in the startTags variable. +// +func FormatText(w io.Writer, text []byte, line int, goSource bool, pattern string, selection Selection) { + var comments, highlights Selection + if goSource { + comments = tokenSelection(text, token.COMMENT) + } + if pattern != "" { + highlights = regexpSelection(text, pattern) + } + if line >= 0 || comments != nil || highlights != nil || selection != nil { + var lineTag LinkWriter + if line >= 0 { + lineTag = func(w io.Writer, _ int, start bool) { + if start { + fmt.Fprintf(w, "%6d\t", line, line) + line++ + } + } + } + FormatSelections(w, text, lineTag, lineSelection(text), selectionTag, comments, highlights, selection) + } else { + template.HTMLEscape(w, text) + } +} diff --git a/vendor/golang.org/x/tools/godoc/godoc.go b/vendor/golang.org/x/tools/godoc/godoc.go new file mode 100644 index 0000000000..dda1f49cb3 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/godoc.go @@ -0,0 +1,635 @@ +// Copyright 2013 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 godoc is a work-in-progress (2013-07-17) package to +// begin splitting up the godoc binary into multiple pieces. +// +// This package comment will evolve over time as this package splits +// into smaller pieces. +package godoc // import "golang.org/x/tools/godoc" + +import ( + "bytes" + "fmt" + "go/ast" + "go/doc" + "go/format" + "go/printer" + "go/token" + htmltemplate "html/template" + "io" + "log" + "os" + pathpkg "path" + "regexp" + "strconv" + "strings" + "text/template" + "time" + "unicode" + "unicode/utf8" +) + +// Fake relative package path for built-ins. Documentation for all globals +// (not just exported ones) will be shown for packages in this directory. +const builtinPkgPath = "builtin" + +// FuncMap defines template functions used in godoc templates. +// +// Convention: template function names ending in "_html" or "_url" produce +// HTML- or URL-escaped strings; all other function results may +// require explicit escaping in the template. +func (p *Presentation) FuncMap() template.FuncMap { + p.initFuncMapOnce.Do(p.initFuncMap) + return p.funcMap +} + +func (p *Presentation) TemplateFuncs() template.FuncMap { + p.initFuncMapOnce.Do(p.initFuncMap) + return p.templateFuncs +} + +func (p *Presentation) initFuncMap() { + if p.Corpus == nil { + panic("nil Presentation.Corpus") + } + p.templateFuncs = template.FuncMap{ + "code": p.code, + } + p.funcMap = template.FuncMap{ + // various helpers + "filename": filenameFunc, + "repeat": strings.Repeat, + + // access to FileInfos (directory listings) + "fileInfoName": fileInfoNameFunc, + "fileInfoTime": fileInfoTimeFunc, + + // access to search result information + "infoKind_html": infoKind_htmlFunc, + "infoLine": p.infoLineFunc, + "infoSnippet_html": p.infoSnippet_htmlFunc, + + // formatting of AST nodes + "node": p.nodeFunc, + "node_html": p.node_htmlFunc, + "comment_html": comment_htmlFunc, + "comment_text": comment_textFunc, + "sanitize": sanitizeFunc, + + // support for URL attributes + "pkgLink": pkgLinkFunc, + "srcLink": srcLinkFunc, + "posLink_url": newPosLink_urlFunc(srcPosLinkFunc), + "docLink": docLinkFunc, + "queryLink": queryLinkFunc, + + // formatting of Examples + "example_html": p.example_htmlFunc, + "example_text": p.example_textFunc, + "example_name": p.example_nameFunc, + "example_suffix": p.example_suffixFunc, + + // formatting of analysis information + "callgraph_html": p.callgraph_htmlFunc, + "implements_html": p.implements_htmlFunc, + "methodset_html": p.methodset_htmlFunc, + + // formatting of Notes + "noteTitle": noteTitle, + + // Number operation + "multiply": multiply, + } + if p.URLForSrc != nil { + p.funcMap["srcLink"] = p.URLForSrc + } + if p.URLForSrcPos != nil { + p.funcMap["posLink_url"] = newPosLink_urlFunc(p.URLForSrcPos) + } + if p.URLForSrcQuery != nil { + p.funcMap["queryLink"] = p.URLForSrcQuery + } +} + +func multiply(a, b int) int { return a * b } + +func filenameFunc(path string) string { + _, localname := pathpkg.Split(path) + return localname +} + +func fileInfoNameFunc(fi os.FileInfo) string { + name := fi.Name() + if fi.IsDir() { + name += "/" + } + return name +} + +func fileInfoTimeFunc(fi os.FileInfo) string { + if t := fi.ModTime(); t.Unix() != 0 { + return t.Local().String() + } + return "" // don't return epoch if time is obviously not set +} + +// The strings in infoKinds must be properly html-escaped. +var infoKinds = [nKinds]string{ + PackageClause: "package clause", + ImportDecl: "import decl", + ConstDecl: "const decl", + TypeDecl: "type decl", + VarDecl: "var decl", + FuncDecl: "func decl", + MethodDecl: "method decl", + Use: "use", +} + +func infoKind_htmlFunc(info SpotInfo) string { + return infoKinds[info.Kind()] // infoKind entries are html-escaped +} + +func (p *Presentation) infoLineFunc(info SpotInfo) int { + line := info.Lori() + if info.IsIndex() { + index, _ := p.Corpus.searchIndex.Get() + if index != nil { + line = index.(*Index).Snippet(line).Line + } else { + // no line information available because + // we don't have an index - this should + // never happen; be conservative and don't + // crash + line = 0 + } + } + return line +} + +func (p *Presentation) infoSnippet_htmlFunc(info SpotInfo) string { + if info.IsIndex() { + index, _ := p.Corpus.searchIndex.Get() + // Snippet.Text was HTML-escaped when it was generated + return index.(*Index).Snippet(info.Lori()).Text + } + return `no snippet text available` +} + +func (p *Presentation) nodeFunc(info *PageInfo, node interface{}) string { + var buf bytes.Buffer + p.writeNode(&buf, info.FSet, node) + return buf.String() +} + +func (p *Presentation) node_htmlFunc(info *PageInfo, node interface{}, linkify bool) string { + var buf1 bytes.Buffer + p.writeNode(&buf1, info.FSet, node) + + var buf2 bytes.Buffer + if n, _ := node.(ast.Node); n != nil && linkify && p.DeclLinks { + LinkifyText(&buf2, buf1.Bytes(), n) + } else { + FormatText(&buf2, buf1.Bytes(), -1, true, "", nil) + } + + return buf2.String() +} + +func comment_htmlFunc(comment string) string { + var buf bytes.Buffer + // TODO(gri) Provide list of words (e.g. function parameters) + // to be emphasized by ToHTML. + doc.ToHTML(&buf, comment, nil) // does html-escaping + return buf.String() +} + +// punchCardWidth is the number of columns of fixed-width +// characters to assume when wrapping text. Very few people +// use terminals or cards smaller than 80 characters, so 80 it is. +// We do not try to sniff the environment or the tty to adapt to +// the situation; instead, by using a constant we make sure that +// godoc always produces the same output regardless of context, +// a consistency that is lost otherwise. For example, if we sniffed +// the environment or tty, then http://golang.org/pkg/math/?m=text +// would depend on the width of the terminal where godoc started, +// which is clearly bogus. More generally, the Unix tools that behave +// differently when writing to a tty than when writing to a file have +// a history of causing confusion (compare `ls` and `ls | cat`), and we +// want to avoid that mistake here. +const punchCardWidth = 80 + +func containsOnlySpace(buf []byte) bool { + isNotSpace := func(r rune) bool { return !unicode.IsSpace(r) } + return bytes.IndexFunc(buf, isNotSpace) == -1 +} + +func comment_textFunc(comment, indent, preIndent string) string { + var buf bytes.Buffer + doc.ToText(&buf, comment, indent, preIndent, punchCardWidth-2*len(indent)) + if containsOnlySpace(buf.Bytes()) { + return "" + } + return buf.String() +} + +// sanitizeFunc sanitizes the argument src by replacing newlines with +// blanks, removing extra blanks, and by removing trailing whitespace +// and commas before closing parentheses. +func sanitizeFunc(src string) string { + buf := make([]byte, len(src)) + j := 0 // buf index + comma := -1 // comma index if >= 0 + for i := 0; i < len(src); i++ { + ch := src[i] + switch ch { + case '\t', '\n', ' ': + // ignore whitespace at the beginning, after a blank, or after opening parentheses + if j == 0 { + continue + } + if p := buf[j-1]; p == ' ' || p == '(' || p == '{' || p == '[' { + continue + } + // replace all whitespace with blanks + ch = ' ' + case ',': + comma = j + case ')', '}', ']': + // remove any trailing comma + if comma >= 0 { + j = comma + } + // remove any trailing whitespace + if j > 0 && buf[j-1] == ' ' { + j-- + } + default: + comma = -1 + } + buf[j] = ch + j++ + } + // remove trailing blank, if any + if j > 0 && buf[j-1] == ' ' { + j-- + } + return string(buf[:j]) +} + +type PageInfo struct { + Dirname string // directory containing the package + Err error // error or nil + Share bool // show share button on examples + + // package info + FSet *token.FileSet // nil if no package documentation + PDoc *doc.Package // nil if no package documentation + Examples []*doc.Example // nil if no example code + Notes map[string][]*doc.Note // nil if no package Notes + PAst map[string]*ast.File // nil if no AST with package exports + IsMain bool // true for package main + IsFiltered bool // true if results were filtered + + // analysis info + TypeInfoIndex map[string]int // index of JSON datum for type T (if -analysis=type) + AnalysisData htmltemplate.JS // array of TypeInfoJSON values + CallGraph htmltemplate.JS // array of PCGNodeJSON values (if -analysis=pointer) + CallGraphIndex map[string]int // maps func name to index in CallGraph + + // directory info + Dirs *DirList // nil if no directory information + DirTime time.Time // directory time stamp + DirFlat bool // if set, show directory in a flat (non-indented) manner +} + +func (info *PageInfo) IsEmpty() bool { + return info.Err != nil || info.PAst == nil && info.PDoc == nil && info.Dirs == nil +} + +func pkgLinkFunc(path string) string { + // because of the irregular mapping under goroot + // we need to correct certain relative paths + path = strings.TrimPrefix(path, "/") + path = strings.TrimPrefix(path, "src/") + path = strings.TrimPrefix(path, "pkg/") + return "pkg/" + path +} + +func newPosLink_urlFunc(srcPosLinkFunc func(s string, line, low, high int) string) func(info *PageInfo, n interface{}) string { + // n must be an ast.Node or a *doc.Note + return func(info *PageInfo, n interface{}) string { + var pos, end token.Pos + + switch n := n.(type) { + case ast.Node: + pos = n.Pos() + end = n.End() + case *doc.Note: + pos = n.Pos + end = n.End + default: + panic(fmt.Sprintf("wrong type for posLink_url template formatter: %T", n)) + } + + var relpath string + var line int + var low, high int // selection offset range + + if pos.IsValid() { + p := info.FSet.Position(pos) + relpath = p.Filename + line = p.Line + low = p.Offset + } + if end.IsValid() { + high = info.FSet.Position(end).Offset + } + + return srcPosLinkFunc(relpath, line, low, high) + } +} + +func srcPosLinkFunc(s string, line, low, high int) string { + s = srcLinkFunc(s) + var buf bytes.Buffer + template.HTMLEscape(&buf, []byte(s)) + // selection ranges are of form "s=low:high" + if low < high { + fmt.Fprintf(&buf, "?s=%d:%d", low, high) // no need for URL escaping + // if we have a selection, position the page + // such that the selection is a bit below the top + line -= 10 + if line < 1 { + line = 1 + } + } + // line id's in html-printed source are of the + // form "L%d" where %d stands for the line number + if line > 0 { + fmt.Fprintf(&buf, "#L%d", line) // no need for URL escaping + } + return buf.String() +} + +func srcLinkFunc(s string) string { + s = pathpkg.Clean("/" + s) + if !strings.HasPrefix(s, "/src/") { + s = "/src" + s + } + return s +} + +// queryLinkFunc returns a URL for a line in a source file with a highlighted +// query term. +// s is expected to be a path to a source file. +// query is expected to be a string that has already been appropriately escaped +// for use in a URL query. +func queryLinkFunc(s, query string, line int) string { + url := pathpkg.Clean("/"+s) + "?h=" + query + if line > 0 { + url += "#L" + strconv.Itoa(line) + } + return url +} + +func docLinkFunc(s string, ident string) string { + return pathpkg.Clean("/pkg/"+s) + "/#" + ident +} + +func (p *Presentation) example_textFunc(info *PageInfo, funcName, indent string) string { + if !p.ShowExamples { + return "" + } + + var buf bytes.Buffer + first := true + for _, eg := range info.Examples { + name := stripExampleSuffix(eg.Name) + if name != funcName { + continue + } + + if !first { + buf.WriteString("\n") + } + first = false + + // print code + cnode := &printer.CommentedNode{Node: eg.Code, Comments: eg.Comments} + var buf1 bytes.Buffer + p.writeNode(&buf1, info.FSet, cnode) + code := buf1.String() + // Additional formatting if this is a function body. + if n := len(code); n >= 2 && code[0] == '{' && code[n-1] == '}' { + // remove surrounding braces + code = code[1 : n-1] + // unindent + code = strings.Replace(code, "\n ", "\n", -1) + } + code = strings.Trim(code, "\n") + code = strings.Replace(code, "\n", "\n\t", -1) + + buf.WriteString(indent) + buf.WriteString("Example:\n\t") + buf.WriteString(code) + buf.WriteString("\n\n") + } + return buf.String() +} + +func (p *Presentation) example_htmlFunc(info *PageInfo, funcName string) string { + var buf bytes.Buffer + for _, eg := range info.Examples { + name := stripExampleSuffix(eg.Name) + + if name != funcName { + continue + } + + // print code + cnode := &printer.CommentedNode{Node: eg.Code, Comments: eg.Comments} + code := p.node_htmlFunc(info, cnode, true) + out := eg.Output + wholeFile := true + + // Additional formatting if this is a function body. + if n := len(code); n >= 2 && code[0] == '{' && code[n-1] == '}' { + wholeFile = false + // remove surrounding braces + code = code[1 : n-1] + // unindent + code = strings.Replace(code, "\n ", "\n", -1) + // remove output comment + if loc := exampleOutputRx.FindStringIndex(code); loc != nil { + code = strings.TrimSpace(code[:loc[0]]) + } + } + + // Write out the playground code in standard Go style + // (use tabs, no comment highlight, etc). + play := "" + if eg.Play != nil && p.ShowPlayground { + var buf bytes.Buffer + if err := format.Node(&buf, info.FSet, eg.Play); err != nil { + log.Print(err) + } else { + play = buf.String() + } + } + + // Drop output, as the output comment will appear in the code. + if wholeFile && play == "" { + out = "" + } + + if p.ExampleHTML == nil { + out = "" + return "" + } + + err := p.ExampleHTML.Execute(&buf, struct { + Name, Doc, Code, Play, Output string + Share bool + }{eg.Name, eg.Doc, code, play, out, info.Share}) + if err != nil { + log.Print(err) + } + } + return buf.String() +} + +// example_nameFunc takes an example function name and returns its display +// name. For example, "Foo_Bar_quux" becomes "Foo.Bar (Quux)". +func (p *Presentation) example_nameFunc(s string) string { + name, suffix := splitExampleName(s) + // replace _ with . for method names + name = strings.Replace(name, "_", ".", 1) + // use "Package" if no name provided + if name == "" { + name = "Package" + } + return name + suffix +} + +// example_suffixFunc takes an example function name and returns its suffix in +// parenthesized form. For example, "Foo_Bar_quux" becomes " (Quux)". +func (p *Presentation) example_suffixFunc(name string) string { + _, suffix := splitExampleName(name) + return suffix +} + +// implements_html returns the "> Implements" toggle for a package-level named type. +// Its contents are populated from JSON data by client-side JS at load time. +func (p *Presentation) implements_htmlFunc(info *PageInfo, typeName string) string { + if p.ImplementsHTML == nil { + return "" + } + index, ok := info.TypeInfoIndex[typeName] + if !ok { + return "" + } + var buf bytes.Buffer + err := p.ImplementsHTML.Execute(&buf, struct{ Index int }{index}) + if err != nil { + log.Print(err) + } + return buf.String() +} + +// methodset_html returns the "> Method set" toggle for a package-level named type. +// Its contents are populated from JSON data by client-side JS at load time. +func (p *Presentation) methodset_htmlFunc(info *PageInfo, typeName string) string { + if p.MethodSetHTML == nil { + return "" + } + index, ok := info.TypeInfoIndex[typeName] + if !ok { + return "" + } + var buf bytes.Buffer + err := p.MethodSetHTML.Execute(&buf, struct{ Index int }{index}) + if err != nil { + log.Print(err) + } + return buf.String() +} + +// callgraph_html returns the "> Call graph" toggle for a package-level func. +// Its contents are populated from JSON data by client-side JS at load time. +func (p *Presentation) callgraph_htmlFunc(info *PageInfo, recv, name string) string { + if p.CallGraphHTML == nil { + return "" + } + if recv != "" { + // Format must match (*ssa.Function).RelString(). + name = fmt.Sprintf("(%s).%s", recv, name) + } + index, ok := info.CallGraphIndex[name] + if !ok { + return "" + } + var buf bytes.Buffer + err := p.CallGraphHTML.Execute(&buf, struct{ Index int }{index}) + if err != nil { + log.Print(err) + } + return buf.String() +} + +func noteTitle(note string) string { + return strings.Title(strings.ToLower(note)) +} + +func startsWithUppercase(s string) bool { + r, _ := utf8.DecodeRuneInString(s) + return unicode.IsUpper(r) +} + +var exampleOutputRx = regexp.MustCompile(`(?i)//[[:space:]]*output:`) + +// stripExampleSuffix strips lowercase braz in Foo_braz or Foo_Bar_braz from name +// while keeping uppercase Braz in Foo_Braz. +func stripExampleSuffix(name string) string { + if i := strings.LastIndex(name, "_"); i != -1 { + if i < len(name)-1 && !startsWithUppercase(name[i+1:]) { + name = name[:i] + } + } + return name +} + +func splitExampleName(s string) (name, suffix string) { + i := strings.LastIndex(s, "_") + if 0 <= i && i < len(s)-1 && !startsWithUppercase(s[i+1:]) { + name = s[:i] + suffix = " (" + strings.Title(s[i+1:]) + ")" + return + } + name = s + return +} + +// Write an AST node to w. +func (p *Presentation) writeNode(w io.Writer, fset *token.FileSet, x interface{}) { + // convert trailing tabs into spaces using a tconv filter + // to ensure a good outcome in most browsers (there may still + // be tabs in comments and strings, but converting those into + // the right number of spaces is much harder) + // + // TODO(gri) rethink printer flags - perhaps tconv can be eliminated + // with an another printer mode (which is more efficiently + // implemented in the printer than here with another layer) + mode := printer.TabIndent | printer.UseSpaces + err := (&printer.Config{Mode: mode, Tabwidth: p.TabWidth}).Fprint(&tconv{p: p, output: w}, fset, x) + if err != nil { + log.Print(err) + } +} + +// WriteNode writes x to w. +// TODO(bgarcia) Is this method needed? It's just a wrapper for p.writeNode. +func (p *Presentation) WriteNode(w io.Writer, fset *token.FileSet, x interface{}) { + p.writeNode(w, fset, x) +} diff --git a/vendor/golang.org/x/tools/godoc/godoc_test.go b/vendor/golang.org/x/tools/godoc/godoc_test.go new file mode 100644 index 0000000000..a10a1ab7e2 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/godoc_test.go @@ -0,0 +1,118 @@ +// Copyright 2013 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 godoc + +import ( + "testing" +) + +func TestPkgLinkFunc(t *testing.T) { + for _, tc := range []struct { + path string + want string + }{ + {"/src/fmt", "pkg/fmt"}, + {"src/fmt", "pkg/fmt"}, + {"/fmt", "pkg/fmt"}, + {"fmt", "pkg/fmt"}, + } { + if got := pkgLinkFunc(tc.path); got != tc.want { + t.Errorf("pkgLinkFunc(%v) = %v; want %v", tc.path, got, tc.want) + } + } +} + +func TestSrcPosLinkFunc(t *testing.T) { + for _, tc := range []struct { + src string + line int + low int + high int + want string + }{ + {"/src/fmt/print.go", 42, 30, 50, "/src/fmt/print.go?s=30:50#L32"}, + {"/src/fmt/print.go", 2, 1, 5, "/src/fmt/print.go?s=1:5#L1"}, + {"/src/fmt/print.go", 2, 0, 0, "/src/fmt/print.go#L2"}, + {"/src/fmt/print.go", 0, 0, 0, "/src/fmt/print.go"}, + {"/src/fmt/print.go", 0, 1, 5, "/src/fmt/print.go?s=1:5#L1"}, + {"fmt/print.go", 0, 0, 0, "/src/fmt/print.go"}, + {"fmt/print.go", 0, 1, 5, "/src/fmt/print.go?s=1:5#L1"}, + } { + if got := srcPosLinkFunc(tc.src, tc.line, tc.low, tc.high); got != tc.want { + t.Errorf("srcLinkFunc(%v, %v, %v, %v) = %v; want %v", tc.src, tc.line, tc.low, tc.high, got, tc.want) + } + } +} + +func TestSrcLinkFunc(t *testing.T) { + for _, tc := range []struct { + src string + want string + }{ + {"/src/fmt/print.go", "/src/fmt/print.go"}, + {"src/fmt/print.go", "/src/fmt/print.go"}, + {"/fmt/print.go", "/src/fmt/print.go"}, + {"fmt/print.go", "/src/fmt/print.go"}, + } { + if got := srcLinkFunc(tc.src); got != tc.want { + t.Errorf("srcLinkFunc(%v) = %v; want %v", tc.src, got, tc.want) + } + } +} + +func TestQueryLinkFunc(t *testing.T) { + for _, tc := range []struct { + src string + query string + line int + want string + }{ + {"/src/fmt/print.go", "Sprintf", 33, "/src/fmt/print.go?h=Sprintf#L33"}, + {"/src/fmt/print.go", "Sprintf", 0, "/src/fmt/print.go?h=Sprintf"}, + {"src/fmt/print.go", "EOF", 33, "/src/fmt/print.go?h=EOF#L33"}, + {"src/fmt/print.go", "a%3f+%26b", 1, "/src/fmt/print.go?h=a%3f+%26b#L1"}, + } { + if got := queryLinkFunc(tc.src, tc.query, tc.line); got != tc.want { + t.Errorf("queryLinkFunc(%v, %v, %v) = %v; want %v", tc.src, tc.query, tc.line, got, tc.want) + } + } +} + +func TestDocLinkFunc(t *testing.T) { + for _, tc := range []struct { + src string + ident string + want string + }{ + {"fmt", "Sprintf", "/pkg/fmt/#Sprintf"}, + {"fmt", "EOF", "/pkg/fmt/#EOF"}, + } { + if got := docLinkFunc(tc.src, tc.ident); got != tc.want { + t.Errorf("docLinkFunc(%v, %v) = %v; want %v", tc.src, tc.ident, got, tc.want) + } + } +} + +func TestSanitizeFunc(t *testing.T) { + for _, tc := range []struct { + src string + want string + }{ + {}, + {"foo", "foo"}, + {"func f()", "func f()"}, + {"func f(a int,)", "func f(a int)"}, + {"func f(a int,\n)", "func f(a int)"}, + {"func f(\n\ta int,\n\tb int,\n\tc int,\n)", "func f(a int, b int, c int)"}, + {" ( a, b, c ) ", "(a, b, c)"}, + {"( a, b, c int, foo bar , )", "(a, b, c int, foo bar)"}, + {"{ a, b}", "{a, b}"}, + {"[ a, b]", "[a, b]"}, + } { + if got := sanitizeFunc(tc.src); got != tc.want { + t.Errorf("sanitizeFunc(%v) = %v; want %v", tc.src, got, tc.want) + } + } +} diff --git a/vendor/golang.org/x/tools/godoc/index.go b/vendor/golang.org/x/tools/godoc/index.go new file mode 100644 index 0000000000..725121a56b --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/index.go @@ -0,0 +1,1590 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains the infrastructure to create an +// identifier and full-text index for a set of Go files. +// +// Algorithm for identifier index: +// - traverse all .go files of the file tree specified by root +// - for each identifier (word) encountered, collect all occurrences (spots) +// into a list; this produces a list of spots for each word +// - reduce the lists: from a list of spots to a list of FileRuns, +// and from a list of FileRuns into a list of PakRuns +// - make a HitList from the PakRuns +// +// Details: +// - keep two lists per word: one containing package-level declarations +// that have snippets, and one containing all other spots +// - keep the snippets in a separate table indexed by snippet index +// and store the snippet index in place of the line number in a SpotInfo +// (the line number for spots with snippets is stored in the snippet) +// - at the end, create lists of alternative spellings for a given +// word +// +// Algorithm for full text index: +// - concatenate all source code in a byte buffer (in memory) +// - add the files to a file set in lockstep as they are added to the byte +// buffer such that a byte buffer offset corresponds to the Pos value for +// that file location +// - create a suffix array from the concatenated sources +// +// String lookup in full text index: +// - use the suffix array to lookup a string's offsets - the offsets +// correspond to the Pos values relative to the file set +// - translate the Pos values back into file and line information and +// sort the result + +package godoc + +import ( + "bufio" + "bytes" + "encoding/gob" + "errors" + "fmt" + "go/ast" + "go/doc" + "go/parser" + "go/token" + "index/suffixarray" + "io" + "log" + "os" + pathpkg "path" + "path/filepath" + "regexp" + "runtime" + "sort" + "strconv" + "strings" + "sync" + "time" + "unicode" + + "golang.org/x/tools/godoc/util" + "golang.org/x/tools/godoc/vfs" +) + +// ---------------------------------------------------------------------------- +// InterfaceSlice is a helper type for sorting interface +// slices according to some slice-specific sort criteria. + +type comparer func(x, y interface{}) bool + +type interfaceSlice struct { + slice []interface{} + less comparer +} + +// ---------------------------------------------------------------------------- +// RunList + +// A RunList is a list of entries that can be sorted according to some +// criteria. A RunList may be compressed by grouping "runs" of entries +// which are equal (according to the sort critera) into a new RunList of +// runs. For instance, a RunList containing pairs (x, y) may be compressed +// into a RunList containing pair runs (x, {y}) where each run consists of +// a list of y's with the same x. +type RunList []interface{} + +func (h RunList) sort(less comparer) { + sort.Sort(&interfaceSlice{h, less}) +} + +func (p *interfaceSlice) Len() int { return len(p.slice) } +func (p *interfaceSlice) Less(i, j int) bool { return p.less(p.slice[i], p.slice[j]) } +func (p *interfaceSlice) Swap(i, j int) { p.slice[i], p.slice[j] = p.slice[j], p.slice[i] } + +// Compress entries which are the same according to a sort criteria +// (specified by less) into "runs". +func (h RunList) reduce(less comparer, newRun func(h RunList) interface{}) RunList { + if len(h) == 0 { + return nil + } + // len(h) > 0 + + // create runs of entries with equal values + h.sort(less) + + // for each run, make a new run object and collect them in a new RunList + var hh RunList + i, x := 0, h[0] + for j, y := range h { + if less(x, y) { + hh = append(hh, newRun(h[i:j])) + i, x = j, h[j] // start a new run + } + } + // add final run, if any + if i < len(h) { + hh = append(hh, newRun(h[i:])) + } + + return hh +} + +// ---------------------------------------------------------------------------- +// KindRun + +// Debugging support. Disable to see multiple entries per line. +const removeDuplicates = true + +// A KindRun is a run of SpotInfos of the same kind in a given file. +// The kind (3 bits) is stored in each SpotInfo element; to find the +// kind of a KindRun, look at any of its elements. +type KindRun []SpotInfo + +// KindRuns are sorted by line number or index. Since the isIndex bit +// is always the same for all infos in one list we can compare lori's. +func (k KindRun) Len() int { return len(k) } +func (k KindRun) Less(i, j int) bool { return k[i].Lori() < k[j].Lori() } +func (k KindRun) Swap(i, j int) { k[i], k[j] = k[j], k[i] } + +// FileRun contents are sorted by Kind for the reduction into KindRuns. +func lessKind(x, y interface{}) bool { return x.(SpotInfo).Kind() < y.(SpotInfo).Kind() } + +// newKindRun allocates a new KindRun from the SpotInfo run h. +func newKindRun(h RunList) interface{} { + run := make(KindRun, len(h)) + for i, x := range h { + run[i] = x.(SpotInfo) + } + + // Spots were sorted by file and kind to create this run. + // Within this run, sort them by line number or index. + sort.Sort(run) + + if removeDuplicates { + // Since both the lori and kind field must be + // same for duplicates, and since the isIndex + // bit is always the same for all infos in one + // list we can simply compare the entire info. + k := 0 + prev := SpotInfo(1<<32 - 1) // an unlikely value + for _, x := range run { + if x != prev { + run[k] = x + k++ + prev = x + } + } + run = run[0:k] + } + + return run +} + +// ---------------------------------------------------------------------------- +// FileRun + +// A Pak describes a Go package. +type Pak struct { + Path string // path of directory containing the package + Name string // package name as declared by package clause +} + +// Paks are sorted by name (primary key) and by import path (secondary key). +func (p *Pak) less(q *Pak) bool { + return p.Name < q.Name || p.Name == q.Name && p.Path < q.Path +} + +// A File describes a Go file. +type File struct { + Name string // directory-local file name + Pak *Pak // the package to which the file belongs +} + +// Path returns the file path of f. +func (f *File) Path() string { + return pathpkg.Join(f.Pak.Path, f.Name) +} + +// A Spot describes a single occurrence of a word. +type Spot struct { + File *File + Info SpotInfo +} + +// A FileRun is a list of KindRuns belonging to the same file. +type FileRun struct { + File *File + Groups []KindRun +} + +// Spots are sorted by file path for the reduction into FileRuns. +func lessSpot(x, y interface{}) bool { + fx := x.(Spot).File + fy := y.(Spot).File + // same as "return fx.Path() < fy.Path()" but w/o computing the file path first + px := fx.Pak.Path + py := fy.Pak.Path + return px < py || px == py && fx.Name < fy.Name +} + +// newFileRun allocates a new FileRun from the Spot run h. +func newFileRun(h RunList) interface{} { + file := h[0].(Spot).File + + // reduce the list of Spots into a list of KindRuns + h1 := make(RunList, len(h)) + for i, x := range h { + h1[i] = x.(Spot).Info + } + h2 := h1.reduce(lessKind, newKindRun) + + // create the FileRun + groups := make([]KindRun, len(h2)) + for i, x := range h2 { + groups[i] = x.(KindRun) + } + return &FileRun{file, groups} +} + +// ---------------------------------------------------------------------------- +// PakRun + +// A PakRun describes a run of *FileRuns of a package. +type PakRun struct { + Pak *Pak + Files []*FileRun +} + +// Sorting support for files within a PakRun. +func (p *PakRun) Len() int { return len(p.Files) } +func (p *PakRun) Less(i, j int) bool { return p.Files[i].File.Name < p.Files[j].File.Name } +func (p *PakRun) Swap(i, j int) { p.Files[i], p.Files[j] = p.Files[j], p.Files[i] } + +// FileRuns are sorted by package for the reduction into PakRuns. +func lessFileRun(x, y interface{}) bool { + return x.(*FileRun).File.Pak.less(y.(*FileRun).File.Pak) +} + +// newPakRun allocates a new PakRun from the *FileRun run h. +func newPakRun(h RunList) interface{} { + pak := h[0].(*FileRun).File.Pak + files := make([]*FileRun, len(h)) + for i, x := range h { + files[i] = x.(*FileRun) + } + run := &PakRun{pak, files} + sort.Sort(run) // files were sorted by package; sort them by file now + return run +} + +// ---------------------------------------------------------------------------- +// HitList + +// A HitList describes a list of PakRuns. +type HitList []*PakRun + +// PakRuns are sorted by package. +func lessPakRun(x, y interface{}) bool { return x.(*PakRun).Pak.less(y.(*PakRun).Pak) } + +func reduce(h0 RunList) HitList { + // reduce a list of Spots into a list of FileRuns + h1 := h0.reduce(lessSpot, newFileRun) + // reduce a list of FileRuns into a list of PakRuns + h2 := h1.reduce(lessFileRun, newPakRun) + // sort the list of PakRuns by package + h2.sort(lessPakRun) + // create a HitList + h := make(HitList, len(h2)) + for i, p := range h2 { + h[i] = p.(*PakRun) + } + return h +} + +// filter returns a new HitList created by filtering +// all PakRuns from h that have a matching pakname. +func (h HitList) filter(pakname string) HitList { + var hh HitList + for _, p := range h { + if p.Pak.Name == pakname { + hh = append(hh, p) + } + } + return hh +} + +// ---------------------------------------------------------------------------- +// AltWords + +type wordPair struct { + canon string // canonical word spelling (all lowercase) + alt string // alternative spelling +} + +// An AltWords describes a list of alternative spellings for a +// canonical (all lowercase) spelling of a word. +type AltWords struct { + Canon string // canonical word spelling (all lowercase) + Alts []string // alternative spelling for the same word +} + +// wordPairs are sorted by their canonical spelling. +func lessWordPair(x, y interface{}) bool { return x.(*wordPair).canon < y.(*wordPair).canon } + +// newAltWords allocates a new AltWords from the *wordPair run h. +func newAltWords(h RunList) interface{} { + canon := h[0].(*wordPair).canon + alts := make([]string, len(h)) + for i, x := range h { + alts[i] = x.(*wordPair).alt + } + return &AltWords{canon, alts} +} + +func (a *AltWords) filter(s string) *AltWords { + var alts []string + for _, w := range a.Alts { + if w != s { + alts = append(alts, w) + } + } + if len(alts) > 0 { + return &AltWords{a.Canon, alts} + } + return nil +} + +// Ident stores information about external identifiers in order to create +// links to package documentation. +type Ident struct { + Path string // e.g. "net/http" + Package string // e.g. "http" + Name string // e.g. "NewRequest" + Doc string // e.g. "NewRequest returns a new Request..." +} + +// byImportCount sorts the given slice of Idents by the import +// counts of the packages to which they belong. +type byImportCount struct { + Idents []Ident + ImportCount map[string]int +} + +func (ic byImportCount) Len() int { + return len(ic.Idents) +} + +func (ic byImportCount) Less(i, j int) bool { + ri := ic.ImportCount[ic.Idents[i].Path] + rj := ic.ImportCount[ic.Idents[j].Path] + if ri == rj { + return ic.Idents[i].Path < ic.Idents[j].Path + } + return ri > rj +} + +func (ic byImportCount) Swap(i, j int) { + ic.Idents[i], ic.Idents[j] = ic.Idents[j], ic.Idents[i] +} + +func (ic byImportCount) String() string { + buf := bytes.NewBuffer([]byte("[")) + for _, v := range ic.Idents { + buf.WriteString(fmt.Sprintf("\n\t%s, %s (%d)", v.Path, v.Name, ic.ImportCount[v.Path])) + } + buf.WriteString("\n]") + return buf.String() +} + +// filter creates a new Ident list where the results match the given +// package name. +func (ic byImportCount) filter(pakname string) []Ident { + if ic.Idents == nil { + return nil + } + var res []Ident + for _, i := range ic.Idents { + if i.Package == pakname { + res = append(res, i) + } + } + return res +} + +// top returns the top n identifiers. +func (ic byImportCount) top(n int) []Ident { + if len(ic.Idents) > n { + return ic.Idents[:n] + } + return ic.Idents +} + +// ---------------------------------------------------------------------------- +// Indexer + +type IndexResult struct { + Decls RunList // package-level declarations (with snippets) + Others RunList // all other occurrences +} + +// Statistics provides statistics information for an index. +type Statistics struct { + Bytes int // total size of indexed source files + Files int // number of indexed source files + Lines int // number of lines (all files) + Words int // number of different identifiers + Spots int // number of identifier occurrences +} + +// An Indexer maintains the data structures and provides the machinery +// for indexing .go files under a file tree. It implements the path.Visitor +// interface for walking file trees, and the ast.Visitor interface for +// walking Go ASTs. +type Indexer struct { + c *Corpus + fset *token.FileSet // file set for all indexed files + fsOpenGate chan bool // send pre fs.Open; receive on close + + mu sync.Mutex // guards all the following + sources bytes.Buffer // concatenated sources + strings map[string]string // interned string + packages map[Pak]*Pak // interned *Paks + words map[string]*IndexResult // RunLists of Spots + snippets []*Snippet // indices are stored in SpotInfos + current *token.File // last file added to file set + file *File // AST for current file + decl ast.Decl // AST for current decl + stats Statistics + throttle *util.Throttle + importCount map[string]int // package path ("net/http") => count + packagePath map[string]map[string]bool // "template" => "text/template" => true + exports map[string]map[string]SpotKind // "net/http" => "ListenAndServe" => FuncDecl + curPkgExports map[string]SpotKind + idents map[SpotKind]map[string][]Ident // kind => name => list of Idents +} + +func (x *Indexer) intern(s string) string { + if s, ok := x.strings[s]; ok { + return s + } + x.strings[s] = s + return s +} + +func (x *Indexer) lookupPackage(path, name string) *Pak { + // In the source directory tree, more than one package may + // live in the same directory. For the packages map, construct + // a key that includes both the directory path and the package + // name. + key := Pak{Path: x.intern(path), Name: x.intern(name)} + pak := x.packages[key] + if pak == nil { + pak = &key + x.packages[key] = pak + } + return pak +} + +func (x *Indexer) addSnippet(s *Snippet) int { + index := len(x.snippets) + x.snippets = append(x.snippets, s) + return index +} + +func (x *Indexer) visitIdent(kind SpotKind, id *ast.Ident) { + if id == nil { + return + } + name := x.intern(id.Name) + + switch kind { + case TypeDecl, FuncDecl, ConstDecl, VarDecl: + x.curPkgExports[name] = kind + } + + lists, found := x.words[name] + if !found { + lists = new(IndexResult) + x.words[name] = lists + } + + if kind == Use || x.decl == nil { + if x.c.IndexGoCode { + // not a declaration or no snippet required + info := makeSpotInfo(kind, x.current.Line(id.Pos()), false) + lists.Others = append(lists.Others, Spot{x.file, info}) + } + } else { + // a declaration with snippet + index := x.addSnippet(NewSnippet(x.fset, x.decl, id)) + info := makeSpotInfo(kind, index, true) + lists.Decls = append(lists.Decls, Spot{x.file, info}) + } + + x.stats.Spots++ +} + +func (x *Indexer) visitFieldList(kind SpotKind, flist *ast.FieldList) { + for _, f := range flist.List { + x.decl = nil // no snippets for fields + for _, name := range f.Names { + x.visitIdent(kind, name) + } + ast.Walk(x, f.Type) + // ignore tag - not indexed at the moment + } +} + +func (x *Indexer) visitSpec(kind SpotKind, spec ast.Spec) { + switch n := spec.(type) { + case *ast.ImportSpec: + x.visitIdent(ImportDecl, n.Name) + if n.Path != nil { + if imp, err := strconv.Unquote(n.Path.Value); err == nil { + x.importCount[x.intern(imp)]++ + } + } + + case *ast.ValueSpec: + for _, n := range n.Names { + x.visitIdent(kind, n) + } + ast.Walk(x, n.Type) + for _, v := range n.Values { + ast.Walk(x, v) + } + + case *ast.TypeSpec: + x.visitIdent(TypeDecl, n.Name) + ast.Walk(x, n.Type) + } +} + +func (x *Indexer) visitGenDecl(decl *ast.GenDecl) { + kind := VarDecl + if decl.Tok == token.CONST { + kind = ConstDecl + } + x.decl = decl + for _, s := range decl.Specs { + x.visitSpec(kind, s) + } +} + +func (x *Indexer) Visit(node ast.Node) ast.Visitor { + switch n := node.(type) { + case nil: + // nothing to do + + case *ast.Ident: + x.visitIdent(Use, n) + + case *ast.FieldList: + x.visitFieldList(VarDecl, n) + + case *ast.InterfaceType: + x.visitFieldList(MethodDecl, n.Methods) + + case *ast.DeclStmt: + // local declarations should only be *ast.GenDecls; + // ignore incorrect ASTs + if decl, ok := n.Decl.(*ast.GenDecl); ok { + x.decl = nil // no snippets for local declarations + x.visitGenDecl(decl) + } + + case *ast.GenDecl: + x.decl = n + x.visitGenDecl(n) + + case *ast.FuncDecl: + kind := FuncDecl + if n.Recv != nil { + kind = MethodDecl + ast.Walk(x, n.Recv) + } + x.decl = n + x.visitIdent(kind, n.Name) + ast.Walk(x, n.Type) + if n.Body != nil { + ast.Walk(x, n.Body) + } + + case *ast.File: + x.decl = nil + x.visitIdent(PackageClause, n.Name) + for _, d := range n.Decls { + ast.Walk(x, d) + } + + default: + return x + } + + return nil +} + +// addFile adds a file to the index if possible and returns the file set file +// and the file's AST if it was successfully parsed as a Go file. If addFile +// failed (that is, if the file was not added), it returns file == nil. +func (x *Indexer) addFile(f vfs.ReadSeekCloser, filename string, goFile bool) (file *token.File, ast *ast.File) { + defer f.Close() + + // The file set's base offset and x.sources size must be in lock-step; + // this permits the direct mapping of suffix array lookup results to + // to corresponding Pos values. + // + // When a file is added to the file set, its offset base increases by + // the size of the file + 1; and the initial base offset is 1. Add an + // extra byte to the sources here. + x.sources.WriteByte(0) + + // If the sources length doesn't match the file set base at this point + // the file set implementation changed or we have another error. + base := x.fset.Base() + if x.sources.Len() != base { + panic("internal error: file base incorrect") + } + + // append file contents (src) to x.sources + if _, err := x.sources.ReadFrom(f); err == nil { + src := x.sources.Bytes()[base:] + + if goFile { + // parse the file and in the process add it to the file set + if ast, err = parser.ParseFile(x.fset, filename, src, parser.ParseComments); err == nil { + file = x.fset.File(ast.Pos()) // ast.Pos() is inside the file + return + } + // file has parse errors, and the AST may be incorrect - + // set lines information explicitly and index as ordinary + // text file (cannot fall through to the text case below + // because the file has already been added to the file set + // by the parser) + file = x.fset.File(token.Pos(base)) // token.Pos(base) is inside the file + file.SetLinesForContent(src) + ast = nil + return + } + + if util.IsText(src) { + // only add the file to the file set (for the full text index) + file = x.fset.AddFile(filename, x.fset.Base(), len(src)) + file.SetLinesForContent(src) + return + } + } + + // discard possibly added data + x.sources.Truncate(base - 1) // -1 to remove added byte 0 since no file was added + return +} + +// Design note: Using an explicit white list of permitted files for indexing +// makes sure that the important files are included and massively reduces the +// number of files to index. The advantage over a blacklist is that unexpected +// (non-blacklisted) files won't suddenly explode the index. + +// Files are whitelisted if they have a file name or extension +// present as key in whitelisted. +var whitelisted = map[string]bool{ + ".bash": true, + ".c": true, + ".cc": true, + ".cpp": true, + ".cxx": true, + ".css": true, + ".go": true, + ".goc": true, + ".h": true, + ".hh": true, + ".hpp": true, + ".hxx": true, + ".html": true, + ".js": true, + ".out": true, + ".py": true, + ".s": true, + ".sh": true, + ".txt": true, + ".xml": true, + "AUTHORS": true, + "CONTRIBUTORS": true, + "LICENSE": true, + "Makefile": true, + "PATENTS": true, + "README": true, +} + +// isWhitelisted returns true if a file is on the list +// of "permitted" files for indexing. The filename must +// be the directory-local name of the file. +func isWhitelisted(filename string) bool { + key := pathpkg.Ext(filename) + if key == "" { + // file has no extension - use entire filename + key = filename + } + return whitelisted[key] +} + +func (x *Indexer) indexDocs(dirname string, filename string, astFile *ast.File) { + pkgName := x.intern(astFile.Name.Name) + if pkgName == "main" { + return + } + pkgPath := x.intern(strings.TrimPrefix(strings.TrimPrefix(dirname, "/src/"), "pkg/")) + astPkg := ast.Package{ + Name: pkgName, + Files: map[string]*ast.File{ + filename: astFile, + }, + } + var m doc.Mode + docPkg := doc.New(&astPkg, dirname, m) + addIdent := func(sk SpotKind, name string, docstr string) { + if x.idents[sk] == nil { + x.idents[sk] = make(map[string][]Ident) + } + name = x.intern(name) + x.idents[sk][name] = append(x.idents[sk][name], Ident{ + Path: pkgPath, + Package: pkgName, + Name: name, + Doc: doc.Synopsis(docstr), + }) + } + + if x.idents[PackageClause] == nil { + x.idents[PackageClause] = make(map[string][]Ident) + } + // List of words under which the package identifier will be stored. + // This includes the package name and the components of the directory + // in which it resides. + words := strings.Split(pathpkg.Dir(pkgPath), "/") + if words[0] == "." { + words = []string{} + } + name := x.intern(docPkg.Name) + synopsis := doc.Synopsis(docPkg.Doc) + words = append(words, name) + pkgIdent := Ident{ + Path: pkgPath, + Package: pkgName, + Name: name, + Doc: synopsis, + } + for _, word := range words { + word = x.intern(word) + found := false + pkgs := x.idents[PackageClause][word] + for i, p := range pkgs { + if p.Path == pkgPath { + if docPkg.Doc != "" { + p.Doc = synopsis + pkgs[i] = p + } + found = true + break + } + } + if !found { + x.idents[PackageClause][word] = append(x.idents[PackageClause][word], pkgIdent) + } + } + + for _, c := range docPkg.Consts { + for _, name := range c.Names { + addIdent(ConstDecl, name, c.Doc) + } + } + for _, t := range docPkg.Types { + addIdent(TypeDecl, t.Name, t.Doc) + for _, c := range t.Consts { + for _, name := range c.Names { + addIdent(ConstDecl, name, c.Doc) + } + } + for _, v := range t.Vars { + for _, name := range v.Names { + addIdent(VarDecl, name, v.Doc) + } + } + for _, f := range t.Funcs { + addIdent(FuncDecl, f.Name, f.Doc) + } + for _, f := range t.Methods { + addIdent(MethodDecl, f.Name, f.Doc) + // Change the name of methods to be ".". + // They will still be indexed as . + idents := x.idents[MethodDecl][f.Name] + idents[len(idents)-1].Name = x.intern(t.Name + "." + f.Name) + } + } + for _, v := range docPkg.Vars { + for _, name := range v.Names { + addIdent(VarDecl, name, v.Doc) + } + } + for _, f := range docPkg.Funcs { + addIdent(FuncDecl, f.Name, f.Doc) + } +} + +func (x *Indexer) indexGoFile(dirname string, filename string, file *token.File, astFile *ast.File) { + pkgName := astFile.Name.Name + + if x.c.IndexGoCode { + x.current = file + pak := x.lookupPackage(dirname, pkgName) + x.file = &File{filename, pak} + ast.Walk(x, astFile) + } + + if x.c.IndexDocs { + // Test files are already filtered out in visitFile if IndexGoCode and + // IndexFullText are false. Otherwise, check here. + isTestFile := (x.c.IndexGoCode || x.c.IndexFullText) && + (strings.HasSuffix(filename, "_test.go") || strings.HasPrefix(dirname, "/test/")) + if !isTestFile { + x.indexDocs(dirname, filename, astFile) + } + } + + ppKey := x.intern(pkgName) + if _, ok := x.packagePath[ppKey]; !ok { + x.packagePath[ppKey] = make(map[string]bool) + } + pkgPath := x.intern(strings.TrimPrefix(strings.TrimPrefix(dirname, "/src/"), "pkg/")) + x.packagePath[ppKey][pkgPath] = true + + // Merge in exported symbols found walking this file into + // the map for that package. + if len(x.curPkgExports) > 0 { + dest, ok := x.exports[pkgPath] + if !ok { + dest = make(map[string]SpotKind) + x.exports[pkgPath] = dest + } + for k, v := range x.curPkgExports { + dest[k] = v + } + } +} + +func (x *Indexer) visitFile(dirname string, fi os.FileInfo) { + if fi.IsDir() || !x.c.IndexEnabled { + return + } + + filename := pathpkg.Join(dirname, fi.Name()) + goFile := isGoFile(fi) + + switch { + case x.c.IndexFullText: + if !isWhitelisted(fi.Name()) { + return + } + case x.c.IndexGoCode: + if !goFile { + return + } + case x.c.IndexDocs: + if !goFile || + strings.HasSuffix(fi.Name(), "_test.go") || + strings.HasPrefix(dirname, "/test/") { + return + } + default: + // No indexing turned on. + return + } + + x.fsOpenGate <- true + defer func() { <-x.fsOpenGate }() + + // open file + f, err := x.c.fs.Open(filename) + if err != nil { + return + } + + x.mu.Lock() + defer x.mu.Unlock() + + x.throttle.Throttle() + + x.curPkgExports = make(map[string]SpotKind) + file, fast := x.addFile(f, filename, goFile) + if file == nil { + return // addFile failed + } + + if fast != nil { + x.indexGoFile(dirname, fi.Name(), file, fast) + } + + // update statistics + x.stats.Bytes += file.Size() + x.stats.Files++ + x.stats.Lines += file.LineCount() +} + +// indexOptions contains information that affects the contents of an index. +type indexOptions struct { + // Docs provides documentation search results. + // It is only consulted if IndexEnabled is true. + // The default values is true. + Docs bool + + // GoCode provides Go source code search results. + // It is only consulted if IndexEnabled is true. + // The default values is true. + GoCode bool + + // FullText provides search results from all files. + // It is only consulted if IndexEnabled is true. + // The default values is true. + FullText bool + + // MaxResults optionally specifies the maximum results for indexing. + // The default is 1000. + MaxResults int +} + +// ---------------------------------------------------------------------------- +// Index + +type LookupResult struct { + Decls HitList // package-level declarations (with snippets) + Others HitList // all other occurrences +} + +type Index struct { + fset *token.FileSet // file set used during indexing; nil if no textindex + suffixes *suffixarray.Index // suffixes for concatenated sources; nil if no textindex + words map[string]*LookupResult // maps words to hit lists + alts map[string]*AltWords // maps canonical(words) to lists of alternative spellings + snippets []*Snippet // all snippets, indexed by snippet index + stats Statistics + importCount map[string]int // package path ("net/http") => count + packagePath map[string]map[string]bool // "template" => "text/template" => true + exports map[string]map[string]SpotKind // "net/http" => "ListenAndServe" => FuncDecl + idents map[SpotKind]map[string][]Ident + opts indexOptions +} + +func canonical(w string) string { return strings.ToLower(w) } + +// Somewhat arbitrary, but I figure low enough to not hurt disk-based filesystems +// consuming file descriptors, where some systems have low 256 or 512 limits. +// Go should have a built-in way to cap fd usage under the ulimit. +const ( + maxOpenFiles = 200 + maxOpenDirs = 50 +) + +func (c *Corpus) throttle() float64 { + if c.IndexThrottle <= 0 { + return 0.9 + } + if c.IndexThrottle > 1.0 { + return 1.0 + } + return c.IndexThrottle +} + +// NewIndex creates a new index for the .go files provided by the corpus. +func (c *Corpus) NewIndex() *Index { + // initialize Indexer + // (use some reasonably sized maps to start) + x := &Indexer{ + c: c, + fset: token.NewFileSet(), + fsOpenGate: make(chan bool, maxOpenFiles), + strings: make(map[string]string), + packages: make(map[Pak]*Pak, 256), + words: make(map[string]*IndexResult, 8192), + throttle: util.NewThrottle(c.throttle(), 100*time.Millisecond), // run at least 0.1s at a time + importCount: make(map[string]int), + packagePath: make(map[string]map[string]bool), + exports: make(map[string]map[string]SpotKind), + idents: make(map[SpotKind]map[string][]Ident, 4), + } + + // index all files in the directories given by dirnames + var wg sync.WaitGroup // outstanding ReadDir + visitFile + dirGate := make(chan bool, maxOpenDirs) + for dirname := range c.fsDirnames() { + if c.IndexDirectory != nil && !c.IndexDirectory(dirname) { + continue + } + dirGate <- true + wg.Add(1) + go func(dirname string) { + defer func() { <-dirGate }() + defer wg.Done() + + list, err := c.fs.ReadDir(dirname) + if err != nil { + log.Printf("ReadDir(%q): %v; skipping directory", dirname, err) + return // ignore this directory + } + for _, fi := range list { + wg.Add(1) + go func(fi os.FileInfo) { + defer wg.Done() + x.visitFile(dirname, fi) + }(fi) + } + }(dirname) + } + wg.Wait() + + if !c.IndexFullText { + // the file set, the current file, and the sources are + // not needed after indexing if no text index is built - + // help GC and clear them + x.fset = nil + x.sources.Reset() + x.current = nil // contains reference to fset! + } + + // for each word, reduce the RunLists into a LookupResult; + // also collect the word with its canonical spelling in a + // word list for later computation of alternative spellings + words := make(map[string]*LookupResult) + var wlist RunList + for w, h := range x.words { + decls := reduce(h.Decls) + others := reduce(h.Others) + words[w] = &LookupResult{ + Decls: decls, + Others: others, + } + wlist = append(wlist, &wordPair{canonical(w), w}) + x.throttle.Throttle() + } + x.stats.Words = len(words) + + // reduce the word list {canonical(w), w} into + // a list of AltWords runs {canonical(w), {w}} + alist := wlist.reduce(lessWordPair, newAltWords) + + // convert alist into a map of alternative spellings + alts := make(map[string]*AltWords) + for i := 0; i < len(alist); i++ { + a := alist[i].(*AltWords) + alts[a.Canon] = a + } + + // create text index + var suffixes *suffixarray.Index + if c.IndexFullText { + suffixes = suffixarray.New(x.sources.Bytes()) + } + + // sort idents by the number of imports of their respective packages + for _, idMap := range x.idents { + for _, ir := range idMap { + sort.Sort(byImportCount{ir, x.importCount}) + } + } + + return &Index{ + fset: x.fset, + suffixes: suffixes, + words: words, + alts: alts, + snippets: x.snippets, + stats: x.stats, + importCount: x.importCount, + packagePath: x.packagePath, + exports: x.exports, + idents: x.idents, + opts: indexOptions{ + Docs: x.c.IndexDocs, + GoCode: x.c.IndexGoCode, + FullText: x.c.IndexFullText, + MaxResults: x.c.MaxResults, + }, + } +} + +var ErrFileIndexVersion = errors.New("file index version out of date") + +const fileIndexVersion = 3 + +// fileIndex is the subset of Index that's gob-encoded for use by +// Index.Write and Index.Read. +type fileIndex struct { + Version int + Words map[string]*LookupResult + Alts map[string]*AltWords + Snippets []*Snippet + Fulltext bool + Stats Statistics + ImportCount map[string]int + PackagePath map[string]map[string]bool + Exports map[string]map[string]SpotKind + Idents map[SpotKind]map[string][]Ident + Opts indexOptions +} + +func (x *fileIndex) Write(w io.Writer) error { + return gob.NewEncoder(w).Encode(x) +} + +func (x *fileIndex) Read(r io.Reader) error { + return gob.NewDecoder(r).Decode(x) +} + +// WriteTo writes the index x to w. +func (x *Index) WriteTo(w io.Writer) (n int64, err error) { + w = countingWriter{&n, w} + fulltext := false + if x.suffixes != nil { + fulltext = true + } + fx := fileIndex{ + Version: fileIndexVersion, + Words: x.words, + Alts: x.alts, + Snippets: x.snippets, + Fulltext: fulltext, + Stats: x.stats, + ImportCount: x.importCount, + PackagePath: x.packagePath, + Exports: x.exports, + Idents: x.idents, + Opts: x.opts, + } + if err := fx.Write(w); err != nil { + return 0, err + } + if fulltext { + encode := func(x interface{}) error { + return gob.NewEncoder(w).Encode(x) + } + if err := x.fset.Write(encode); err != nil { + return 0, err + } + if err := x.suffixes.Write(w); err != nil { + return 0, err + } + } + return n, nil +} + +// ReadFrom reads the index from r into x; x must not be nil. +// If r does not also implement io.ByteReader, it will be wrapped in a bufio.Reader. +// If the index is from an old version, the error is ErrFileIndexVersion. +func (x *Index) ReadFrom(r io.Reader) (n int64, err error) { + // We use the ability to read bytes as a plausible surrogate for buffering. + if _, ok := r.(io.ByteReader); !ok { + r = bufio.NewReader(r) + } + r = countingReader{&n, r.(byteReader)} + var fx fileIndex + if err := fx.Read(r); err != nil { + return n, err + } + if fx.Version != fileIndexVersion { + return 0, ErrFileIndexVersion + } + x.words = fx.Words + x.alts = fx.Alts + x.snippets = fx.Snippets + x.stats = fx.Stats + x.importCount = fx.ImportCount + x.packagePath = fx.PackagePath + x.exports = fx.Exports + x.idents = fx.Idents + x.opts = fx.Opts + if fx.Fulltext { + x.fset = token.NewFileSet() + decode := func(x interface{}) error { + return gob.NewDecoder(r).Decode(x) + } + if err := x.fset.Read(decode); err != nil { + return n, err + } + x.suffixes = new(suffixarray.Index) + if err := x.suffixes.Read(r); err != nil { + return n, err + } + } + return n, nil +} + +// Stats returns index statistics. +func (x *Index) Stats() Statistics { + return x.stats +} + +// ImportCount returns a map from import paths to how many times they were seen. +func (x *Index) ImportCount() map[string]int { + return x.importCount +} + +// PackagePath returns a map from short package name to a set +// of full package path names that use that short package name. +func (x *Index) PackagePath() map[string]map[string]bool { + return x.packagePath +} + +// Exports returns a map from full package path to exported +// symbol name to its type. +func (x *Index) Exports() map[string]map[string]SpotKind { + return x.exports +} + +// Idents returns a map from identifier type to exported +// symbol name to the list of identifiers matching that name. +func (x *Index) Idents() map[SpotKind]map[string][]Ident { + return x.idents +} + +func (x *Index) lookupWord(w string) (match *LookupResult, alt *AltWords) { + match = x.words[w] + alt = x.alts[canonical(w)] + // remove current spelling from alternatives + // (if there is no match, the alternatives do + // not contain the current spelling) + if match != nil && alt != nil { + alt = alt.filter(w) + } + return +} + +// isIdentifier reports whether s is a Go identifier. +func isIdentifier(s string) bool { + for i, ch := range s { + if unicode.IsLetter(ch) || ch == '_' || i > 0 && unicode.IsDigit(ch) { + continue + } + return false + } + return len(s) > 0 +} + +// For a given query, which is either a single identifier or a qualified +// identifier, Lookup returns a SearchResult containing packages, a LookupResult, a +// list of alternative spellings, and identifiers, if any. Any and all results +// may be nil. If the query syntax is wrong, an error is reported. +func (x *Index) Lookup(query string) (*SearchResult, error) { + ss := strings.Split(query, ".") + + // check query syntax + for _, s := range ss { + if !isIdentifier(s) { + return nil, errors.New("all query parts must be identifiers") + } + } + rslt := &SearchResult{ + Query: query, + Idents: make(map[SpotKind][]Ident, 5), + } + // handle simple and qualified identifiers + switch len(ss) { + case 1: + ident := ss[0] + rslt.Hit, rslt.Alt = x.lookupWord(ident) + if rslt.Hit != nil { + // found a match - filter packages with same name + // for the list of packages called ident, if any + rslt.Pak = rslt.Hit.Others.filter(ident) + } + for k, v := range x.idents { + const rsltLimit = 50 + ids := byImportCount{v[ident], x.importCount} + rslt.Idents[k] = ids.top(rsltLimit) + } + + case 2: + pakname, ident := ss[0], ss[1] + rslt.Hit, rslt.Alt = x.lookupWord(ident) + if rslt.Hit != nil { + // found a match - filter by package name + // (no paks - package names are not qualified) + decls := rslt.Hit.Decls.filter(pakname) + others := rslt.Hit.Others.filter(pakname) + rslt.Hit = &LookupResult{decls, others} + } + for k, v := range x.idents { + ids := byImportCount{v[ident], x.importCount} + rslt.Idents[k] = ids.filter(pakname) + } + + default: + return nil, errors.New("query is not a (qualified) identifier") + } + + return rslt, nil +} + +func (x *Index) Snippet(i int) *Snippet { + // handle illegal snippet indices gracefully + if 0 <= i && i < len(x.snippets) { + return x.snippets[i] + } + return nil +} + +type positionList []struct { + filename string + line int +} + +func (list positionList) Len() int { return len(list) } +func (list positionList) Less(i, j int) bool { return list[i].filename < list[j].filename } +func (list positionList) Swap(i, j int) { list[i], list[j] = list[j], list[i] } + +// unique returns the list sorted and with duplicate entries removed +func unique(list []int) []int { + sort.Ints(list) + var last int + i := 0 + for _, x := range list { + if i == 0 || x != last { + last = x + list[i] = x + i++ + } + } + return list[0:i] +} + +// A FileLines value specifies a file and line numbers within that file. +type FileLines struct { + Filename string + Lines []int +} + +// LookupRegexp returns the number of matches and the matches where a regular +// expression r is found in the full text index. At most n matches are +// returned (thus found <= n). +// +func (x *Index) LookupRegexp(r *regexp.Regexp, n int) (found int, result []FileLines) { + if x.suffixes == nil || n <= 0 { + return + } + // n > 0 + + var list positionList + // FindAllIndex may returns matches that span across file boundaries. + // Such matches are unlikely, buf after eliminating them we may end up + // with fewer than n matches. If we don't have enough at the end, redo + // the search with an increased value n1, but only if FindAllIndex + // returned all the requested matches in the first place (if it + // returned fewer than that there cannot be more). + for n1 := n; found < n; n1 += n - found { + found = 0 + matches := x.suffixes.FindAllIndex(r, n1) + // compute files, exclude matches that span file boundaries, + // and map offsets to file-local offsets + list = make(positionList, len(matches)) + for _, m := range matches { + // by construction, an offset corresponds to the Pos value + // for the file set - use it to get the file and line + p := token.Pos(m[0]) + if file := x.fset.File(p); file != nil { + if base := file.Base(); base <= m[1] && m[1] <= base+file.Size() { + // match [m[0], m[1]) is within the file boundaries + list[found].filename = file.Name() + list[found].line = file.Line(p) + found++ + } + } + } + if found == n || len(matches) < n1 { + // found all matches or there's no chance to find more + break + } + } + list = list[0:found] + sort.Sort(list) // sort by filename + + // collect matches belonging to the same file + var last string + var lines []int + addLines := func() { + if len(lines) > 0 { + // remove duplicate lines + result = append(result, FileLines{last, unique(lines)}) + lines = nil + } + } + for _, m := range list { + if m.filename != last { + addLines() + last = m.filename + } + lines = append(lines, m.line) + } + addLines() + + return +} + +// InvalidateIndex should be called whenever any of the file systems +// under godoc's observation change so that the indexer is kicked on. +func (c *Corpus) invalidateIndex() { + c.fsModified.Set(nil) + c.refreshMetadata() +} + +// indexUpToDate() returns true if the search index is not older +// than any of the file systems under godoc's observation. +// +func (c *Corpus) indexUpToDate() bool { + _, fsTime := c.fsModified.Get() + _, siTime := c.searchIndex.Get() + return !fsTime.After(siTime) +} + +// feedDirnames feeds the directory names of all directories +// under the file system given by root to channel c. +// +func (c *Corpus) feedDirnames(ch chan<- string) { + if dir, _ := c.fsTree.Get(); dir != nil { + for d := range dir.(*Directory).iter(false) { + ch <- d.Path + } + } +} + +// fsDirnames() returns a channel sending all directory names +// of all the file systems under godoc's observation. +// +func (c *Corpus) fsDirnames() <-chan string { + ch := make(chan string, 256) // buffered for fewer context switches + go func() { + c.feedDirnames(ch) + close(ch) + }() + return ch +} + +// CompatibleWith reports whether the Index x is compatible with the corpus +// indexing options set in c. +func (x *Index) CompatibleWith(c *Corpus) bool { + return x.opts.Docs == c.IndexDocs && + x.opts.GoCode == c.IndexGoCode && + x.opts.FullText == c.IndexFullText && + x.opts.MaxResults == c.MaxResults +} + +func (c *Corpus) readIndex(filenames string) error { + matches, err := filepath.Glob(filenames) + if err != nil { + return err + } else if matches == nil { + return fmt.Errorf("no index files match %q", filenames) + } + sort.Strings(matches) // make sure files are in the right order + files := make([]io.Reader, 0, len(matches)) + for _, filename := range matches { + f, err := os.Open(filename) + if err != nil { + return err + } + defer f.Close() + files = append(files, f) + } + return c.ReadIndexFrom(io.MultiReader(files...)) +} + +// ReadIndexFrom sets the current index from the serialized version found in r. +func (c *Corpus) ReadIndexFrom(r io.Reader) error { + x := new(Index) + if _, err := x.ReadFrom(r); err != nil { + return err + } + if !x.CompatibleWith(c) { + return fmt.Errorf("index file options are incompatible: %v", x.opts) + } + c.searchIndex.Set(x) + return nil +} + +func (c *Corpus) UpdateIndex() { + if c.Verbose { + log.Printf("updating index...") + } + start := time.Now() + index := c.NewIndex() + stop := time.Now() + c.searchIndex.Set(index) + if c.Verbose { + secs := stop.Sub(start).Seconds() + stats := index.Stats() + log.Printf("index updated (%gs, %d bytes of source, %d files, %d lines, %d unique words, %d spots)", + secs, stats.Bytes, stats.Files, stats.Lines, stats.Words, stats.Spots) + } + memstats := new(runtime.MemStats) + runtime.ReadMemStats(memstats) + if c.Verbose { + log.Printf("before GC: bytes = %d footprint = %d", memstats.HeapAlloc, memstats.Sys) + } + runtime.GC() + runtime.ReadMemStats(memstats) + if c.Verbose { + log.Printf("after GC: bytes = %d footprint = %d", memstats.HeapAlloc, memstats.Sys) + } +} + +// RunIndexer runs forever, indexing. +func (c *Corpus) RunIndexer() { + // initialize the index from disk if possible + if c.IndexFiles != "" { + c.initFSTree() + if err := c.readIndex(c.IndexFiles); err != nil { + log.Printf("error reading index from file %s: %v", c.IndexFiles, err) + } + return + } + + // Repeatedly update the package directory tree and index. + // TODO(bgarcia): Use fsnotify to only update when notified of a filesystem change. + for { + c.initFSTree() + c.UpdateIndex() + if c.IndexInterval < 0 { + return + } + delay := 5 * time.Minute // by default, reindex every 5 minutes + if c.IndexInterval > 0 { + delay = c.IndexInterval + } + time.Sleep(delay) + } +} + +type countingWriter struct { + n *int64 + w io.Writer +} + +func (c countingWriter) Write(p []byte) (n int, err error) { + n, err = c.w.Write(p) + *c.n += int64(n) + return +} + +type byteReader interface { + io.Reader + io.ByteReader +} + +type countingReader struct { + n *int64 + r byteReader +} + +func (c countingReader) Read(p []byte) (n int, err error) { + n, err = c.r.Read(p) + *c.n += int64(n) + return +} + +func (c countingReader) ReadByte() (b byte, err error) { + b, err = c.r.ReadByte() + *c.n += 1 + return +} diff --git a/vendor/golang.org/x/tools/godoc/index_test.go b/vendor/golang.org/x/tools/godoc/index_test.go new file mode 100644 index 0000000000..a16bdcb68d --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/index_test.go @@ -0,0 +1,323 @@ +// Copyright 2013 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 godoc + +import ( + "bytes" + "reflect" + "sort" + "strings" + "testing" + + "golang.org/x/tools/godoc/vfs/mapfs" +) + +func newCorpus(t *testing.T) *Corpus { + c := NewCorpus(mapfs.New(map[string]string{ + "src/foo/foo.go": `// Package foo is an example. +package foo + +import "bar" + +const Pi = 3.1415 + +var Foos []Foo + +// Foo is stuff. +type Foo struct{} + +func New() *Foo { + return new(Foo) +} +`, + "src/bar/bar.go": `// Package bar is another example to test races. +package bar +`, + "src/other/bar/bar.go": `// Package bar is another bar package. +package bar +func X() {} +`, + "src/skip/skip.go": `// Package skip should be skipped. +package skip +func Skip() {} +`, + "src/bar/readme.txt": `Whitelisted text file. +`, + "src/bar/baz.zzz": `Text file not whitelisted. +`, + })) + c.IndexEnabled = true + c.IndexDirectory = func(dir string) bool { + return !strings.Contains(dir, "skip") + } + + if err := c.Init(); err != nil { + t.Fatal(err) + } + return c +} + +func TestIndex(t *testing.T) { + for _, docs := range []bool{true, false} { + for _, goCode := range []bool{true, false} { + for _, fullText := range []bool{true, false} { + c := newCorpus(t) + c.IndexDocs = docs + c.IndexGoCode = goCode + c.IndexFullText = fullText + c.UpdateIndex() + ix, _ := c.CurrentIndex() + if ix == nil { + t.Fatal("no index") + } + t.Logf("docs, goCode, fullText = %v,%v,%v", docs, goCode, fullText) + testIndex(t, c, ix) + } + } + } +} + +func TestIndexWriteRead(t *testing.T) { + type key struct { + docs, goCode, fullText bool + } + type val struct { + buf *bytes.Buffer + c *Corpus + } + m := map[key]val{} + + for _, docs := range []bool{true, false} { + for _, goCode := range []bool{true, false} { + for _, fullText := range []bool{true, false} { + k := key{docs, goCode, fullText} + c := newCorpus(t) + c.IndexDocs = docs + c.IndexGoCode = goCode + c.IndexFullText = fullText + c.UpdateIndex() + ix, _ := c.CurrentIndex() + if ix == nil { + t.Fatal("no index") + } + var buf bytes.Buffer + nw, err := ix.WriteTo(&buf) + if err != nil { + t.Fatalf("Index.WriteTo: %v", err) + } + m[k] = val{bytes.NewBuffer(buf.Bytes()), c} + ix2 := new(Index) + nr, err := ix2.ReadFrom(&buf) + if err != nil { + t.Fatalf("Index.ReadFrom: %v", err) + } + if nr != nw { + t.Errorf("Wrote %d bytes to index but read %d", nw, nr) + } + testIndex(t, c, ix) + } + } + } + // Test CompatibleWith + for k1, v1 := range m { + ix := new(Index) + if _, err := ix.ReadFrom(v1.buf); err != nil { + t.Fatalf("Index.ReadFrom: %v", err) + } + for k2, v2 := range m { + if got, want := ix.CompatibleWith(v2.c), k1 == k2; got != want { + t.Errorf("CompatibleWith = %v; want %v for %v, %v", got, want, k1, k2) + } + } + } +} + +func testIndex(t *testing.T, c *Corpus, ix *Index) { + if _, ok := ix.words["Skip"]; ok { + t.Errorf("the word Skip was found; expected it to be skipped") + } + checkStats(t, c, ix) + checkImportCount(t, c, ix) + checkPackagePath(t, c, ix) + checkExports(t, c, ix) + checkIdents(t, c, ix) +} + +// checkStats checks the Index's statistics. +// Some statistics are only set when we're indexing Go code. +func checkStats(t *testing.T, c *Corpus, ix *Index) { + want := Statistics{} + if c.IndexFullText { + want.Bytes = 314 + want.Files = 4 + want.Lines = 21 + } else if c.IndexDocs || c.IndexGoCode { + want.Bytes = 291 + want.Files = 3 + want.Lines = 20 + } + if c.IndexGoCode { + want.Words = 8 + want.Spots = 12 + } + if got := ix.Stats(); !reflect.DeepEqual(got, want) { + t.Errorf("Stats = %#v; want %#v", got, want) + } +} + +// checkImportCount checks the Index's import count map. +// It is only set when we're indexing Go code. +func checkImportCount(t *testing.T, c *Corpus, ix *Index) { + want := map[string]int{} + if c.IndexGoCode { + want = map[string]int{ + "bar": 1, + } + } + if got := ix.ImportCount(); !reflect.DeepEqual(got, want) { + t.Errorf("ImportCount = %v; want %v", got, want) + } +} + +// checkPackagePath checks the Index's package path map. +// It is set if at least one of the indexing options is enabled. +func checkPackagePath(t *testing.T, c *Corpus, ix *Index) { + want := map[string]map[string]bool{} + if c.IndexDocs || c.IndexGoCode || c.IndexFullText { + want = map[string]map[string]bool{ + "foo": map[string]bool{ + "foo": true, + }, + "bar": map[string]bool{ + "bar": true, + "other/bar": true, + }, + } + } + if got := ix.PackagePath(); !reflect.DeepEqual(got, want) { + t.Errorf("PackagePath = %v; want %v", got, want) + } +} + +// checkExports checks the Index's exports map. +// It is only set when we're indexing Go code. +func checkExports(t *testing.T, c *Corpus, ix *Index) { + want := map[string]map[string]SpotKind{} + if c.IndexGoCode { + want = map[string]map[string]SpotKind{ + "foo": map[string]SpotKind{ + "Pi": ConstDecl, + "Foos": VarDecl, + "Foo": TypeDecl, + "New": FuncDecl, + }, + "other/bar": map[string]SpotKind{ + "X": FuncDecl, + }, + } + } + if got := ix.Exports(); !reflect.DeepEqual(got, want) { + t.Errorf("Exports = %v; want %v", got, want) + } +} + +// checkIdents checks the Index's indents map. +// It is only set when we're indexing documentation. +func checkIdents(t *testing.T, c *Corpus, ix *Index) { + want := map[SpotKind]map[string][]Ident{} + if c.IndexDocs { + want = map[SpotKind]map[string][]Ident{ + PackageClause: map[string][]Ident{ + "bar": []Ident{ + {"bar", "bar", "bar", "Package bar is another example to test races."}, + {"other/bar", "bar", "bar", "Package bar is another bar package."}, + }, + "foo": []Ident{{"foo", "foo", "foo", "Package foo is an example."}}, + "other": []Ident{{"other/bar", "bar", "bar", "Package bar is another bar package."}}, + }, + ConstDecl: map[string][]Ident{ + "Pi": []Ident{{"foo", "foo", "Pi", ""}}, + }, + VarDecl: map[string][]Ident{ + "Foos": []Ident{{"foo", "foo", "Foos", ""}}, + }, + TypeDecl: map[string][]Ident{ + "Foo": []Ident{{"foo", "foo", "Foo", "Foo is stuff."}}, + }, + FuncDecl: map[string][]Ident{ + "New": []Ident{{"foo", "foo", "New", ""}}, + "X": []Ident{{"other/bar", "bar", "X", ""}}, + }, + } + } + if got := ix.Idents(); !reflect.DeepEqual(got, want) { + t.Errorf("Idents = %v; want %v", got, want) + } +} + +func TestIdentResultSort(t *testing.T) { + ic := map[string]int{ + "/a/b/pkg1": 10, + "/a/b/pkg2": 2, + "/b/d/pkg3": 20, + } + for _, tc := range []struct { + ir []Ident + exp []Ident + }{ + { + ir: []Ident{ + {"/a/b/pkg2", "pkg2", "MyFunc2", ""}, + {"/b/d/pkg3", "pkg3", "MyFunc3", ""}, + {"/a/b/pkg1", "pkg1", "MyFunc1", ""}, + }, + exp: []Ident{ + {"/b/d/pkg3", "pkg3", "MyFunc3", ""}, + {"/a/b/pkg1", "pkg1", "MyFunc1", ""}, + {"/a/b/pkg2", "pkg2", "MyFunc2", ""}, + }, + }, + { + ir: []Ident{ + {"/a/a/pkg1", "pkg1", "MyFunc1", ""}, + {"/a/b/pkg1", "pkg1", "MyFunc1", ""}, + }, + exp: []Ident{ + {"/a/b/pkg1", "pkg1", "MyFunc1", ""}, + {"/a/a/pkg1", "pkg1", "MyFunc1", ""}, + }, + }, + } { + if sort.Sort(byImportCount{tc.ir, ic}); !reflect.DeepEqual(tc.ir, tc.exp) { + t.Errorf("got: %v, want %v", tc.ir, tc.exp) + } + } +} + +func TestIdentFilter(t *testing.T) { + ic := map[string]int{} + for _, tc := range []struct { + ir []Ident + pak string + exp []Ident + }{ + { + ir: []Ident{ + {"/a/b/pkg2", "pkg2", "MyFunc2", ""}, + {"/b/d/pkg3", "pkg3", "MyFunc3", ""}, + {"/a/b/pkg1", "pkg1", "MyFunc1", ""}, + }, + pak: "pkg2", + exp: []Ident{ + {"/a/b/pkg2", "pkg2", "MyFunc2", ""}, + }, + }, + } { + res := byImportCount{tc.ir, ic}.filter(tc.pak) + if !reflect.DeepEqual(res, tc.exp) { + t.Errorf("got: %v, want %v", res, tc.exp) + } + } +} diff --git a/vendor/golang.org/x/tools/godoc/linkify.go b/vendor/golang.org/x/tools/godoc/linkify.go new file mode 100644 index 0000000000..0a8fb474ec --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/linkify.go @@ -0,0 +1,234 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file implements LinkifyText which introduces +// links for identifiers pointing to their declarations. +// The approach does not cover all cases because godoc +// doesn't have complete type information, but it's +// reasonably good for browsing. + +package godoc + +import ( + "fmt" + "go/ast" + "go/token" + "io" + "strconv" +) + +// LinkifyText HTML-escapes source text and writes it to w. +// Identifiers that are in a "use" position (i.e., that are +// not being declared), are wrapped with HTML links pointing +// to the respective declaration, if possible. Comments are +// formatted the same way as with FormatText. +// +func LinkifyText(w io.Writer, text []byte, n ast.Node) { + links := linksFor(n) + + i := 0 // links index + prev := "" // prev HTML tag + linkWriter := func(w io.Writer, _ int, start bool) { + // end tag + if !start { + if prev != "" { + fmt.Fprintf(w, ``, prev) + prev = "" + } + return + } + + // start tag + prev = "" + if i < len(links) { + switch info := links[i]; { + case info.path != "" && info.name == "": + // package path + fmt.Fprintf(w, ``, info.path) + prev = "a" + case info.path != "" && info.name != "": + // qualified identifier + fmt.Fprintf(w, ``, info.path, info.name) + prev = "a" + case info.path == "" && info.name != "": + // local identifier + if info.mode == identVal { + fmt.Fprintf(w, ``, info.name) + prev = "span" + } else if ast.IsExported(info.name) { + fmt.Fprintf(w, ``, info.name) + prev = "a" + } + } + i++ + } + } + + idents := tokenSelection(text, token.IDENT) + comments := tokenSelection(text, token.COMMENT) + FormatSelections(w, text, linkWriter, idents, selectionTag, comments) +} + +// A link describes the (HTML) link information for an identifier. +// The zero value of a link represents "no link". +// +type link struct { + mode identMode + path, name string // package path, identifier name +} + +// linksFor returns the list of links for the identifiers used +// by node in the same order as they appear in the source. +// +func linksFor(node ast.Node) (list []link) { + modes := identModesFor(node) + + // NOTE: We are expecting ast.Inspect to call the + // callback function in source text order. + ast.Inspect(node, func(node ast.Node) bool { + switch n := node.(type) { + case *ast.Ident: + m := modes[n] + info := link{mode: m} + switch m { + case identUse: + if n.Obj == nil && predeclared[n.Name] { + info.path = builtinPkgPath + } + info.name = n.Name + case identDef: + // any declaration expect const or var - empty link + case identVal: + // const or var declaration + info.name = n.Name + } + list = append(list, info) + return false + case *ast.SelectorExpr: + // Detect qualified identifiers of the form pkg.ident. + // If anything fails we return true and collect individual + // identifiers instead. + if x, _ := n.X.(*ast.Ident); x != nil { + // x must be a package for a qualified identifier + if obj := x.Obj; obj != nil && obj.Kind == ast.Pkg { + if spec, _ := obj.Decl.(*ast.ImportSpec); spec != nil { + // spec.Path.Value is the import path + if path, err := strconv.Unquote(spec.Path.Value); err == nil { + // Register two links, one for the package + // and one for the qualified identifier. + info := link{path: path} + list = append(list, info) + info.name = n.Sel.Name + list = append(list, info) + return false + } + } + } + } + } + return true + }) + + return +} + +// The identMode describes how an identifier is "used" at its source location. +type identMode int + +const ( + identUse identMode = iota // identifier is used (must be zero value for identMode) + identDef // identifier is defined + identVal // identifier is defined in a const or var declaration +) + +// identModesFor returns a map providing the identMode for each identifier used by node. +func identModesFor(node ast.Node) map[*ast.Ident]identMode { + m := make(map[*ast.Ident]identMode) + + ast.Inspect(node, func(node ast.Node) bool { + switch n := node.(type) { + case *ast.Field: + for _, n := range n.Names { + m[n] = identDef + } + case *ast.ImportSpec: + if name := n.Name; name != nil { + m[name] = identDef + } + case *ast.ValueSpec: + for _, n := range n.Names { + m[n] = identVal + } + case *ast.TypeSpec: + m[n.Name] = identDef + case *ast.FuncDecl: + m[n.Name] = identDef + case *ast.AssignStmt: + // Short variable declarations only show up if we apply + // this code to all source code (as opposed to exported + // declarations only). + if n.Tok == token.DEFINE { + // Some of the lhs variables may be re-declared, + // so technically they are not defs. We don't + // care for now. + for _, x := range n.Lhs { + // Each lhs expression should be an + // ident, but we are conservative and check. + if n, _ := x.(*ast.Ident); n != nil { + m[n] = identVal + } + } + } + } + return true + }) + + return m +} + +// The predeclared map represents the set of all predeclared identifiers. +// TODO(gri) This information is also encoded in similar maps in go/doc, +// but not exported. Consider exporting an accessor and using +// it instead. +var predeclared = map[string]bool{ + "bool": true, + "byte": true, + "complex64": true, + "complex128": true, + "error": true, + "float32": true, + "float64": true, + "int": true, + "int8": true, + "int16": true, + "int32": true, + "int64": true, + "rune": true, + "string": true, + "uint": true, + "uint8": true, + "uint16": true, + "uint32": true, + "uint64": true, + "uintptr": true, + "true": true, + "false": true, + "iota": true, + "nil": true, + "append": true, + "cap": true, + "close": true, + "complex": true, + "copy": true, + "delete": true, + "imag": true, + "len": true, + "make": true, + "new": true, + "panic": true, + "print": true, + "println": true, + "real": true, + "recover": true, +} diff --git a/vendor/golang.org/x/tools/godoc/meta.go b/vendor/golang.org/x/tools/godoc/meta.go new file mode 100644 index 0000000000..41ade3948f --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/meta.go @@ -0,0 +1,144 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package godoc + +import ( + "bytes" + "encoding/json" + "log" + pathpkg "path" + "strings" + "time" + + "golang.org/x/tools/godoc/vfs" +) + +var ( + doctype = []byte("") +) + +// ---------------------------------------------------------------------------- +// Documentation Metadata + +// TODO(adg): why are some exported and some aren't? -brad +type Metadata struct { + Title string + Subtitle string + Template bool // execute as template + Path string // canonical path for this page + filePath string // filesystem path relative to goroot +} + +func (m *Metadata) FilePath() string { return m.filePath } + +// extractMetadata extracts the Metadata from a byte slice. +// It returns the Metadata value and the remaining data. +// If no metadata is present the original byte slice is returned. +// +func extractMetadata(b []byte) (meta Metadata, tail []byte, err error) { + tail = b + if !bytes.HasPrefix(b, jsonStart) { + return + } + end := bytes.Index(b, jsonEnd) + if end < 0 { + return + } + b = b[len(jsonStart)-1 : end+1] // drop leading + + + + + +

    + When invoked with the -analysis flag, godoc performs + static analysis on the Go packages it indexes and displays the + results in the source and package views. This document provides a + brief tour of these features. +

    + +

    Type analysis features

    +

    + godoc -analysis=type performs static checking similar + to that done by a compiler: it detects ill-formed programs, resolves + each identifier to the entity it denotes, computes the type of each + expression and the method set of each type, and determines which + types are assignable to each interface type. + + Type analysis is relatively quick, requiring about 10 seconds for + the >200 packages of the standard library, for example. +

    + +

    Compiler errors

    +

    + If any source file contains a compilation error, the source view + will highlight the errant location in red. Hovering over it + displays the error message. +

    +
    + +

    Identifier resolution

    +

    + In the source view, every referring identifier is annotated with + information about the language entity it refers to: a package, + constant, variable, type, function or statement label. + + Hovering over the identifier reveals the entity's kind and type + (e.g. var x int or func f + func(int) string). +

    +
    +
    + +

    + Clicking the link takes you to the entity's definition. +

    +
    + +

    Type information: size/alignment, method set, interfaces

    +

    + Clicking on the identifier that defines a named type causes a panel + to appear, displaying information about the named type, including + its size and alignment in bytes, its + method set, and its + implements relation: the set of types T that are assignable to + or from this type U where at least one of T or U is an interface. + + This example shows information about net/rpc.methodType. +

    + +

    + The method set includes not only the declared methods of the type, + but also any methods "promoted" from anonymous fields of structs, + such as sync.Mutex in this example. + + In addition, the receiver type is displayed as *T or + T depending on whether it requires the address or just + a copy of the receiver value. +

    +

    + The method set and implements relation are also available + via the package view. +

    + + +

    Pointer analysis features

    +

    + godoc -analysis=pointer additionally performs a precise + whole-program pointer analysis. In other words, it + approximates the set of memory locations to which each + reference—not just vars of kind *T, but also + []T, func, map, + chan, and interface—may refer. This + information reveals the possible destinations of each dynamic call + (via a func variable or interface method), and the + relationship between send and receive operations on the same + channel. +

    +

    + Compared to type analysis, pointer analysis requires more time and + memory, and is impractical for code bases exceeding a million lines. +

    + +

    Call graph navigation

    +

    + When pointer analysis is complete, the source view annotates the + code with callers and callees information: callers + information is associated with the func keyword that + declares a function, and callees information is associated with the + open paren '(' of + a function call. +

    +

    + In this example, hovering over the declaration of the + rot13 function (defined in strings/strings_test.go) + reveals that it is called in exactly one place. +

    + +

    + Clicking the link navigates to the sole caller. (If there were + multiple callers, a list of choices would be displayed first.) +

    + +

    + Notice that hovering over this call reveals that there are 19 + possible callees at this site, of which our rot13 + function was just one: this is a dynamic call through a variable of + type func(rune) rune. + + Clicking on the call brings up the list of all 19 potential callees, + shown truncated. Many of them are anonymous functions. +

    + +

    + Pointer analysis gives a very precise approximation of the call + graph compared to type-based techniques. + + As a case in point, the next example shows the dynamic call inside + the testing package responsible for calling all + user-defined functions named ExampleXYZ. +

    + +

    + Recall that all such functions have type func(), + i.e. no arguments and no results. A type-based approximation could + only conclude that this call might dispatch to any function matching + that type—and these are very numerous in most + programs—but pointer analysis can track the flow of specific + func values through the testing package. + + As an indication of its precision, the result contains only + functions whose name starts with Example. +

    + +

    Intra-package call graph

    +

    + The same call graph information is presented in a very different way + in the package view. For each package, an interactive tree view + allows exploration of the call graph as it relates to just that + package; all functions from other packages are elided. + + The roots of the tree are the external entry points of the package: + not only its exported functions, but also any unexported or + anonymous functions that are called (dynamically) from outside the + package. +

    +

    + This example shows the entry points of the + path/filepath package, with the call graph for + Glob expanded several levels +

    + +

    + Notice that the nodes for Glob and Join appear multiple times: the + tree is a partial unrolling of a cyclic graph; the full unrolling + is in general infinite. +

    +

    + For each function documented in the package view, another + interactive tree view allows exploration of the same graph starting + at that function. + + This is a portion of the internal graph of + net/http.ListenAndServe. +

    + + +

    Channel peers (send ↔ receive)

    +

    + Because concurrent Go programs use channels to pass not just values + but also control between different goroutines, it is natural when + reading Go code to want to navigate from a channel send to the + corresponding receive so as to understand the sequence of events. +

    +

    + Godoc annotates every channel operation—make, send, range, + receive, close—with a link to a panel displaying information + about other operations that might alias the same channel. +

    +

    + This example, from the tests of net/http, shows a send + operation on a chan bool. +

    + +

    + Clicking on the <- send operator reveals that this + channel is made at a unique location (line 332) and that there are + three receive operations that might read this value. + + It hardly needs pointing out that some channel element types are + very widely used (e.g. struct{}, bool, int, interface{}) and that a + typical Go program might contain dozens of receive operations on a + value of type chan bool; yet the pointer analysis is + able to distinguish operations on channels at a much finer precision + than based on their type alone. +

    +

    + Notice also that the send occurs in a different (anonymous) function + from the outer one containing the make and the receive + operations. +

    +

    + Here's another example of send on a different chan + bool, also in package net/http: +

    + +

    + The analysis finds just one receive operation that might receive + from this channel, in the test for this feature. +

    + + +

    Known issues

    +

    + All analysis results pertain to exactly + one configuration (e.g. amd64 linux). Files that are conditionally + compiled based on different platforms or build tags are not visible + to the analysis. +

    +

    + Files that import "C" require + preprocessing by the cgo tool. The file offsets after preprocessing + do not align with the unpreprocessed file, so markup is misaligned. +

    +

    + Files are not periodically re-analyzed. + If the files change underneath the running server, the displayed + markup is misaligned. +

    +

    + Additional issues are listed at + tools/godoc/analysis/README. +

    diff --git a/vendor/golang.org/x/tools/godoc/static/analysis/ident-def.png b/vendor/golang.org/x/tools/godoc/static/analysis/ident-def.png new file mode 100644 index 0000000000..b0d9e55ad6 Binary files /dev/null and b/vendor/golang.org/x/tools/godoc/static/analysis/ident-def.png differ diff --git a/vendor/golang.org/x/tools/godoc/static/analysis/ident-field.png b/vendor/golang.org/x/tools/godoc/static/analysis/ident-field.png new file mode 100644 index 0000000000..76cbe5a334 Binary files /dev/null and b/vendor/golang.org/x/tools/godoc/static/analysis/ident-field.png differ diff --git a/vendor/golang.org/x/tools/godoc/static/analysis/ident-func.png b/vendor/golang.org/x/tools/godoc/static/analysis/ident-func.png new file mode 100644 index 0000000000..69670fa296 Binary files /dev/null and b/vendor/golang.org/x/tools/godoc/static/analysis/ident-func.png differ diff --git a/vendor/golang.org/x/tools/godoc/static/analysis/ipcg-func.png b/vendor/golang.org/x/tools/godoc/static/analysis/ipcg-func.png new file mode 100644 index 0000000000..523318d68b Binary files /dev/null and b/vendor/golang.org/x/tools/godoc/static/analysis/ipcg-func.png differ diff --git a/vendor/golang.org/x/tools/godoc/static/analysis/ipcg-pkg.png b/vendor/golang.org/x/tools/godoc/static/analysis/ipcg-pkg.png new file mode 100644 index 0000000000..e029068551 Binary files /dev/null and b/vendor/golang.org/x/tools/godoc/static/analysis/ipcg-pkg.png differ diff --git a/vendor/golang.org/x/tools/godoc/static/analysis/typeinfo-pkg.png b/vendor/golang.org/x/tools/godoc/static/analysis/typeinfo-pkg.png new file mode 100644 index 0000000000..91bd5f7458 Binary files /dev/null and b/vendor/golang.org/x/tools/godoc/static/analysis/typeinfo-pkg.png differ diff --git a/vendor/golang.org/x/tools/godoc/static/analysis/typeinfo-src.png b/vendor/golang.org/x/tools/godoc/static/analysis/typeinfo-src.png new file mode 100644 index 0000000000..6e5b147ebc Binary files /dev/null and b/vendor/golang.org/x/tools/godoc/static/analysis/typeinfo-src.png differ diff --git a/vendor/golang.org/x/tools/godoc/static/callgraph.html b/vendor/golang.org/x/tools/godoc/static/callgraph.html new file mode 100644 index 0000000000..c56b2ef1a7 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/callgraph.html @@ -0,0 +1,15 @@ + diff --git a/vendor/golang.org/x/tools/godoc/static/codewalk.html b/vendor/golang.org/x/tools/godoc/static/codewalk.html new file mode 100644 index 0000000000..0f3d22a20c --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/codewalk.html @@ -0,0 +1,56 @@ + + + + + +
    +
    +
    +
    +
    + + Pop Out Code + + +
    +
    + +
    +
    +
    + code on leftright + code width 70% + filepaths shownhidden +
    +
    +
    +
    + {{range .Step}} +
    + +
    {{html .Title}}
    +
    + {{with .Err}} + ERROR LOADING FILE: {{html .}}

    + {{end}} + {{.XML}} +
    +
    {{html .}}
    +
    + {{end}} +
    +
    + previous step + • + next step +
    +
    +
    diff --git a/vendor/golang.org/x/tools/godoc/static/codewalkdir.html b/vendor/golang.org/x/tools/godoc/static/codewalkdir.html new file mode 100644 index 0000000000..b7674c6ce9 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/codewalkdir.html @@ -0,0 +1,16 @@ + + + +{{range .}} + + {{$name_html := html .Name}} + + + + +{{end}} +
    {{$name_html}} {{html .Title}}
    diff --git a/vendor/golang.org/x/tools/godoc/static/dirlist.html b/vendor/golang.org/x/tools/godoc/static/dirlist.html new file mode 100644 index 0000000000..a3e1a2fa88 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/dirlist.html @@ -0,0 +1,31 @@ + + +

    + + + + + + + + + + + +{{range .}} + + {{$name_html := fileInfoName . | html}} + + + + + + +{{end}} + +
    File Bytes Modified
    ..
    {{$name_html}}{{html .Size}}{{fileInfoTime . | html}}
    +

    diff --git a/vendor/golang.org/x/tools/godoc/static/doc.go b/vendor/golang.org/x/tools/godoc/static/doc.go new file mode 100644 index 0000000000..b3d8bcf34b --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/doc.go @@ -0,0 +1,8 @@ +// Copyright 2013 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 static exports a map of static file content that supports the godoc +// user interface. The map should be used with the mapfs package, see +// golang.org/x/tools/godoc/vfs/mapfs. +package static // import "golang.org/x/tools/godoc/static" diff --git a/vendor/golang.org/x/tools/godoc/static/error.html b/vendor/golang.org/x/tools/godoc/static/error.html new file mode 100644 index 0000000000..7573aa2367 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/error.html @@ -0,0 +1,9 @@ + + +

    +{{html .}} +

    diff --git a/vendor/golang.org/x/tools/godoc/static/example.html b/vendor/golang.org/x/tools/godoc/static/example.html new file mode 100644 index 0000000000..3bc0eb9b6b --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/example.html @@ -0,0 +1,30 @@ +
    + +
    +

    Example{{example_suffix .Name}}

    + {{with .Doc}}

    {{html .}}

    {{end}} + {{$output := .Output}} + {{with .Play}} +
    +
    +
    {{html $output}}
    +
    + Run + Format + {{if $.Share}} + + {{end}} +
    +
    + {{else}} +

    Code:

    +
    {{.Code}}
    + {{with .Output}} +

    Output:

    +
    {{html .}}
    + {{end}} + {{end}} +
    +
    diff --git a/vendor/golang.org/x/tools/godoc/static/gen.go b/vendor/golang.org/x/tools/godoc/static/gen.go new file mode 100644 index 0000000000..42268211e4 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/gen.go @@ -0,0 +1,7 @@ +// 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 static + +//go:generate go run makestatic.go diff --git a/vendor/golang.org/x/tools/godoc/static/godoc.html b/vendor/golang.org/x/tools/godoc/static/godoc.html new file mode 100644 index 0000000000..e4ea6e1a68 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/godoc.html @@ -0,0 +1,107 @@ + + + + + + +{{with .Tabtitle}} + {{html .}} - The Go Programming Language +{{else}} + The Go Programming Language +{{end}} + +{{if .SearchBox}} + +{{end}} + + + + + +
    +... +
    + +
    + + + +
    + +
    + +
    + +{{if .Playground}} +
    +
    +
    +
    + Run + Format + {{if $.Share}} + + {{end}} +
    +
    +{{end}} + +
    +
    + +{{with .Title}} +

    {{html .}}

    +{{end}} +{{with .Subtitle}} +

    {{html .}}

    +{{end}} + +{{/* The Table of Contents is automatically inserted in this
    . + Do not delete this
    . */}} + + +{{/* Body is HTML-escaped elsewhere */}} +{{printf "%s" .Body}} + + + +
    +
    + + + + + + +{{if .Playground}} + +{{end}} + + + + + diff --git a/vendor/golang.org/x/tools/godoc/static/godocs.js b/vendor/golang.org/x/tools/godoc/static/godocs.js new file mode 100644 index 0000000000..ec9f37a9b3 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/godocs.js @@ -0,0 +1,571 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* A little code to ease navigation of these documents. + * + * On window load we: + * + Bind search box hint placeholder show/hide events (bindSearchEvents) + * + Generate a table of contents (generateTOC) + * + Bind foldable sections (bindToggles) + * + Bind links to foldable sections (bindToggleLinks) + */ + +(function() { +'use strict'; + +// Mobile-friendly topbar menu +$(function() { + var menu = $('#menu'); + var menuButton = $('#menu-button'); + var menuButtonArrow = $('#menu-button-arrow'); + menuButton.click(function(event) { + menu.toggleClass('menu-visible'); + menuButtonArrow.toggleClass('vertical-flip'); + event.preventDefault(); + return false; + }); +}); + +function bindSearchEvents() { + + var search = $('#search'); + if (search.length === 0) { + return; // no search box + } + + function clearInactive() { + if (search.is('.inactive')) { + search.val(''); + search.removeClass('inactive'); + } + } + + function restoreInactive() { + if (search.val() !== '') { + return; + } + search.val(search.attr('placeholder')); + search.addClass('inactive'); + } + + search.on('focus', clearInactive); + search.on('blur', restoreInactive); + + restoreInactive(); +} + +/* Generates a table of contents: looks for h2 and h3 elements and generates + * links. "Decorates" the element with id=="nav" with this table of contents. + */ +function generateTOC() { + if ($('#manual-nav').length > 0) { + return; + } + + var nav = $('#nav'); + if (nav.length === 0) { + return; + } + + var toc_items = []; + $(nav).nextAll('h2, h3').each(function() { + var node = this; + if (node.id == '') + node.id = 'tmp_' + toc_items.length; + var link = $('').attr('href', '#' + node.id).text($(node).text()); + var item; + if ($(node).is('h2')) { + item = $('
    '); + } else { // h3 + item = $('
    '); + } + item.append(link); + toc_items.push(item); + }); + if (toc_items.length <= 1) { + return; + } + + var dl1 = $('
    '); + var dl2 = $('
    '); + + var split_index = (toc_items.length / 2) + 1; + if (split_index < 8) { + split_index = toc_items.length; + } + for (var i = 0; i < split_index; i++) { + dl1.append(toc_items[i]); + } + for (/* keep using i */; i < toc_items.length; i++) { + dl2.append(toc_items[i]); + } + + var tocTable = $('').appendTo(nav); + var tocBody = $('').appendTo(tocTable); + var tocRow = $('').appendTo(tocBody); + + // 1st column + $(']","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*\s*$/g,bz={option:[1,""],legend:[1,"
    ","
    "],thead:[1,"
    ').appendTo(tocRow).append(dl1); + // 2nd column + $('').appendTo(tocRow).append(dl2); +} + +function bindToggle(el) { + $('.toggleButton', el).click(function() { + if ($(el).is('.toggle')) { + $(el).addClass('toggleVisible').removeClass('toggle'); + } else { + $(el).addClass('toggle').removeClass('toggleVisible'); + } + }); +} +function bindToggles(selector) { + $(selector).each(function(i, el) { + bindToggle(el); + }); +} + +function bindToggleLink(el, prefix) { + $(el).click(function() { + var href = $(el).attr('href'); + var i = href.indexOf('#'+prefix); + if (i < 0) { + return; + } + var id = '#' + prefix + href.slice(i+1+prefix.length); + if ($(id).is('.toggle')) { + $(id).find('.toggleButton').first().click(); + } + }); +} +function bindToggleLinks(selector, prefix) { + $(selector).each(function(i, el) { + bindToggleLink(el, prefix); + }); +} + +function setupDropdownPlayground() { + if (!$('#page').is('.wide')) { + return; // don't show on front page + } + var button = $('#playgroundButton'); + var div = $('#playground'); + var setup = false; + button.toggle(function() { + button.addClass('active'); + div.show(); + if (setup) { + return; + } + setup = true; + playground({ + 'codeEl': $('.code', div), + 'outputEl': $('.output', div), + 'runEl': $('.run', div), + 'fmtEl': $('.fmt', div), + 'shareEl': $('.share', div), + 'shareRedirect': '//play.golang.org/p/' + }); + }, + function() { + button.removeClass('active'); + div.hide(); + }); + button.show(); + $('#menu').css('min-width', '+=60'); +} + +function setupInlinePlayground() { + 'use strict'; + // Set up playground when each element is toggled. + $('div.play').each(function (i, el) { + // Set up playground for this example. + var setup = function() { + var code = $('.code', el); + playground({ + 'codeEl': code, + 'outputEl': $('.output', el), + 'runEl': $('.run', el), + 'fmtEl': $('.fmt', el), + 'shareEl': $('.share', el), + 'shareRedirect': '//play.golang.org/p/' + }); + + // Make the code textarea resize to fit content. + var resize = function() { + code.height(0); + var h = code[0].scrollHeight; + code.height(h+20); // minimize bouncing. + code.closest('.input').height(h); + }; + code.on('keydown', resize); + code.on('keyup', resize); + code.keyup(); // resize now. + }; + + // If example already visible, set up playground now. + if ($(el).is(':visible')) { + setup(); + return; + } + + // Otherwise, set up playground when example is expanded. + var built = false; + $(el).closest('.toggle').click(function() { + // Only set up once. + if (!built) { + setup(); + built = true; + } + }); + }); +} + +// fixFocus tries to put focus to div#page so that keyboard navigation works. +function fixFocus() { + var page = $('div#page'); + var topbar = $('div#topbar'); + page.css('outline', 0); // disable outline when focused + page.attr('tabindex', -1); // and set tabindex so that it is focusable + $(window).resize(function (evt) { + // only focus page when the topbar is at fixed position (that is, it's in + // front of page, and keyboard event will go to the former by default.) + // by focusing page, keyboard event will go to page so that up/down arrow, + // space, etc. will work as expected. + if (topbar.css('position') == "fixed") + page.focus(); + }).resize(); +} + +function toggleHash() { + var hash = $(window.location.hash); + if (hash.is('.toggle')) { + hash.find('.toggleButton').first().click(); + } +} + +function personalizeInstallInstructions() { + var prefix = '?download='; + var s = window.location.search; + if (s.indexOf(prefix) != 0) { + // No 'download' query string; bail. + return; + } + + var filename = s.substr(prefix.length); + var filenameRE = /^go1\.\d+(\.\d+)?([a-z0-9]+)?\.([a-z0-9]+)(-[a-z0-9]+)?(-osx10\.[68])?\.([a-z.]+)$/; + $('.downloadFilename').text(filename); + $('.hideFromDownload').hide(); + var m = filenameRE.exec(filename); + if (!m) { + // Can't interpret file name; bail. + return; + } + + var os = m[3]; + var ext = m[6]; + if (ext != 'tar.gz') { + $('#tarballInstructions').hide(); + } + if (os != 'darwin' || ext != 'pkg') { + $('#darwinPackageInstructions').hide(); + } + if (os != 'windows') { + $('#windowsInstructions').hide(); + $('.testUnix').show(); + $('.testWindows').hide(); + } else { + if (ext != 'msi') { + $('#windowsInstallerInstructions').hide(); + } + if (ext != 'zip') { + $('#windowsZipInstructions').hide(); + } + $('.testUnix').hide(); + $('.testWindows').show(); + } + + var download = "https://storage.googleapis.com/golang/" + filename; + + var message = $('

    '+ + 'Your download should begin shortly. '+ + 'If it does not, click this link.

    '); + message.find('a').attr('href', download); + message.insertAfter('#nav'); + + window.location = download; +} + +$(document).ready(function() { + bindSearchEvents(); + generateTOC(); + bindToggles(".toggle"); + bindToggles(".toggleVisible"); + bindToggleLinks(".exampleLink", "example_"); + bindToggleLinks(".overviewLink", ""); + bindToggleLinks(".examplesLink", ""); + bindToggleLinks(".indexLink", ""); + setupDropdownPlayground(); + setupInlinePlayground(); + fixFocus(); + setupTypeInfo(); + setupCallgraphs(); + toggleHash(); + personalizeInstallInstructions(); + + // godoc.html defines window.initFuncs in the tag, and root.html and + // codewalk.js push their on-page-ready functions to the list. + // We execute those functions here, to avoid loading jQuery until the page + // content is loaded. + for (var i = 0; i < window.initFuncs.length; i++) window.initFuncs[i](); +}); + +// -- analysis --------------------------------------------------------- + +// escapeHTML returns HTML for s, with metacharacters quoted. +// It is safe for use in both elements and attributes +// (unlike the "set innerText, read innerHTML" trick). +function escapeHTML(s) { + return s.replace(/&/g, '&'). + replace(/\"/g, '"'). + replace(/\'/g, '''). + replace(//g, '>'); +} + +// makeAnchor returns HTML for an element, given an anchorJSON object. +function makeAnchor(json) { + var html = escapeHTML(json.Text); + if (json.Href != "") { + html = "" + html + ""; + } + return html; +} + +function showLowFrame(html) { + var lowframe = document.getElementById('lowframe'); + lowframe.style.height = "200px"; + lowframe.innerHTML = "

    " + html + "

    \n" + + "
    " +}; + +document.hideLowFrame = function() { + var lowframe = document.getElementById('lowframe'); + lowframe.style.height = "0px"; +} + +// onClickCallers is the onclick action for the 'func' tokens of a +// function declaration. +document.onClickCallers = function(index) { + var data = document.ANALYSIS_DATA[index] + if (data.Callers.length == 1 && data.Callers[0].Sites.length == 1) { + document.location = data.Callers[0].Sites[0].Href; // jump to sole caller + return; + } + + var html = "Callers of " + escapeHTML(data.Callee) + ":
    \n"; + for (var i = 0; i < data.Callers.length; i++) { + var caller = data.Callers[i]; + html += "" + escapeHTML(caller.Func) + ""; + var sites = caller.Sites; + if (sites != null && sites.length > 0) { + html += " at line "; + for (var j = 0; j < sites.length; j++) { + if (j > 0) { + html += ", "; + } + html += "" + makeAnchor(sites[j]) + ""; + } + } + html += "
    \n"; + } + showLowFrame(html); +}; + +// onClickCallees is the onclick action for the '(' token of a function call. +document.onClickCallees = function(index) { + var data = document.ANALYSIS_DATA[index] + if (data.Callees.length == 1) { + document.location = data.Callees[0].Href; // jump to sole callee + return; + } + + var html = "Callees of this " + escapeHTML(data.Descr) + ":
    \n"; + for (var i = 0; i < data.Callees.length; i++) { + html += "" + makeAnchor(data.Callees[i]) + "
    \n"; + } + showLowFrame(html); +}; + +// onClickTypeInfo is the onclick action for identifiers declaring a named type. +document.onClickTypeInfo = function(index) { + var data = document.ANALYSIS_DATA[index]; + var html = "Type " + data.Name + ": " + + "      (size=" + data.Size + ", align=" + data.Align + ")
    \n"; + html += implementsHTML(data); + html += methodsetHTML(data); + showLowFrame(html); +}; + +// implementsHTML returns HTML for the implements relation of the +// specified TypeInfoJSON value. +function implementsHTML(info) { + var html = ""; + if (info.ImplGroups != null) { + for (var i = 0; i < info.ImplGroups.length; i++) { + var group = info.ImplGroups[i]; + var x = "" + escapeHTML(group.Descr) + " "; + for (var j = 0; j < group.Facts.length; j++) { + var fact = group.Facts[j]; + var y = "" + makeAnchor(fact.Other) + ""; + if (fact.ByKind != null) { + html += escapeHTML(fact.ByKind) + " type " + y + " implements " + x; + } else { + html += x + " implements " + y; + } + html += "
    \n"; + } + } + } + return html; +} + + +// methodsetHTML returns HTML for the methodset of the specified +// TypeInfoJSON value. +function methodsetHTML(info) { + var html = ""; + if (info.Methods != null) { + for (var i = 0; i < info.Methods.length; i++) { + html += "" + makeAnchor(info.Methods[i]) + "
    \n"; + } + } + return html; +} + +// onClickComm is the onclick action for channel "make" and "<-" +// send/receive tokens. +document.onClickComm = function(index) { + var ops = document.ANALYSIS_DATA[index].Ops + if (ops.length == 1) { + document.location = ops[0].Op.Href; // jump to sole element + return; + } + + var html = "Operations on this channel:
    \n"; + for (var i = 0; i < ops.length; i++) { + html += makeAnchor(ops[i].Op) + " by " + escapeHTML(ops[i].Fn) + "
    \n"; + } + if (ops.length == 0) { + html += "(none)
    \n"; + } + showLowFrame(html); +}; + +$(window).load(function() { + // Scroll window so that first selection is visible. + // (This means we don't need to emit id='L%d' spans for each line.) + // TODO(adonovan): ideally, scroll it so that it's under the pointer, + // but I don't know how to get the pointer y coordinate. + var elts = document.getElementsByClassName("selection"); + if (elts.length > 0) { + elts[0].scrollIntoView() + } +}); + +// setupTypeInfo populates the "Implements" and "Method set" toggle for +// each type in the package doc. +function setupTypeInfo() { + for (var i in document.ANALYSIS_DATA) { + var data = document.ANALYSIS_DATA[i]; + + var el = document.getElementById("implements-" + i); + if (el != null) { + // el != null => data is TypeInfoJSON. + if (data.ImplGroups != null) { + el.innerHTML = implementsHTML(data); + el.parentNode.parentNode.style.display = "block"; + } + } + + var el = document.getElementById("methodset-" + i); + if (el != null) { + // el != null => data is TypeInfoJSON. + if (data.Methods != null) { + el.innerHTML = methodsetHTML(data); + el.parentNode.parentNode.style.display = "block"; + } + } + } +} + +function setupCallgraphs() { + if (document.CALLGRAPH == null) { + return + } + document.getElementById("pkg-callgraph").style.display = "block"; + + var treeviews = document.getElementsByClassName("treeview"); + for (var i = 0; i < treeviews.length; i++) { + var tree = treeviews[i]; + if (tree.id == null || tree.id.indexOf("callgraph-") != 0) { + continue; + } + var id = tree.id.substring("callgraph-".length); + $(tree).treeview({collapsed: true, animated: "fast"}); + document.cgAddChildren(tree, tree, [id]); + tree.parentNode.parentNode.style.display = "block"; + } +} + +document.cgAddChildren = function(tree, ul, indices) { + if (indices != null) { + for (var i = 0; i < indices.length; i++) { + var li = cgAddChild(tree, ul, document.CALLGRAPH[indices[i]]); + if (i == indices.length - 1) { + $(li).addClass("last"); + } + } + } + $(tree).treeview({animated: "fast", add: ul}); +} + +// cgAddChild adds an
  • element for document.CALLGRAPH node cgn to +// the parent
      element ul. tree is the tree's root
        element. +function cgAddChild(tree, ul, cgn) { + var li = document.createElement("li"); + ul.appendChild(li); + li.className = "closed"; + + var code = document.createElement("code"); + + if (cgn.Callees != null) { + $(li).addClass("expandable"); + + // Event handlers and innerHTML updates don't play nicely together, + // hence all this explicit DOM manipulation. + var hitarea = document.createElement("div"); + hitarea.className = "hitarea expandable-hitarea"; + li.appendChild(hitarea); + + li.appendChild(code); + + var childUL = document.createElement("ul"); + li.appendChild(childUL); + childUL.setAttribute('style', "display: none;"); + + var onClick = function() { + document.cgAddChildren(tree, childUL, cgn.Callees); + hitarea.removeEventListener('click', onClick) + }; + hitarea.addEventListener('click', onClick); + + } else { + li.appendChild(code); + } + code.innerHTML += " " + makeAnchor(cgn.Func); + return li +} + +})(); diff --git a/vendor/golang.org/x/tools/godoc/static/images/minus.gif b/vendor/golang.org/x/tools/godoc/static/images/minus.gif new file mode 100644 index 0000000000..47fb7b767c Binary files /dev/null and b/vendor/golang.org/x/tools/godoc/static/images/minus.gif differ diff --git a/vendor/golang.org/x/tools/godoc/static/images/plus.gif b/vendor/golang.org/x/tools/godoc/static/images/plus.gif new file mode 100644 index 0000000000..6906621627 Binary files /dev/null and b/vendor/golang.org/x/tools/godoc/static/images/plus.gif differ diff --git a/vendor/golang.org/x/tools/godoc/static/images/treeview-black-line.gif b/vendor/golang.org/x/tools/godoc/static/images/treeview-black-line.gif new file mode 100644 index 0000000000..e5496877a0 Binary files /dev/null and b/vendor/golang.org/x/tools/godoc/static/images/treeview-black-line.gif differ diff --git a/vendor/golang.org/x/tools/godoc/static/images/treeview-black.gif b/vendor/golang.org/x/tools/godoc/static/images/treeview-black.gif new file mode 100644 index 0000000000..b718d17f30 Binary files /dev/null and b/vendor/golang.org/x/tools/godoc/static/images/treeview-black.gif differ diff --git a/vendor/golang.org/x/tools/godoc/static/images/treeview-default-line.gif b/vendor/golang.org/x/tools/godoc/static/images/treeview-default-line.gif new file mode 100644 index 0000000000..37114d3068 Binary files /dev/null and b/vendor/golang.org/x/tools/godoc/static/images/treeview-default-line.gif differ diff --git a/vendor/golang.org/x/tools/godoc/static/images/treeview-default.gif b/vendor/golang.org/x/tools/godoc/static/images/treeview-default.gif new file mode 100644 index 0000000000..76eee60dd0 Binary files /dev/null and b/vendor/golang.org/x/tools/godoc/static/images/treeview-default.gif differ diff --git a/vendor/golang.org/x/tools/godoc/static/images/treeview-gray-line.gif b/vendor/golang.org/x/tools/godoc/static/images/treeview-gray-line.gif new file mode 100644 index 0000000000..37600447dc Binary files /dev/null and b/vendor/golang.org/x/tools/godoc/static/images/treeview-gray-line.gif differ diff --git a/vendor/golang.org/x/tools/godoc/static/images/treeview-gray.gif b/vendor/golang.org/x/tools/godoc/static/images/treeview-gray.gif new file mode 100644 index 0000000000..cfdf1ab650 Binary files /dev/null and b/vendor/golang.org/x/tools/godoc/static/images/treeview-gray.gif differ diff --git a/vendor/golang.org/x/tools/godoc/static/implements.html b/vendor/golang.org/x/tools/godoc/static/implements.html new file mode 100644 index 0000000000..5f65b861a3 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/implements.html @@ -0,0 +1,9 @@ + diff --git a/vendor/golang.org/x/tools/godoc/static/jquery.js b/vendor/golang.org/x/tools/godoc/static/jquery.js new file mode 100644 index 0000000000..bc3fbc81b2 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v1.8.2 jquery.com | jquery.org/license */ +(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write(""),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.2",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return a!=null?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b
        a",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="
        t
        ",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="
        ",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||p.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e==="inprogress"&&(e=c.shift(),d--),e&&(b==="fx"&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c=0)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c=0)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,d+""),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j=0:p.find(m,this,null,[f]).length),h[m]&&j.push(l);j.length&&u.push({elem:f,matches:j})}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bc(a,b,c,d){c=c||[],b=b||r;var e,f,i,j,k=b.nodeType;if(!a||typeof a!="string")return c;if(k!==1&&k!==9)return[];i=g(b);if(!i&&!d)if(e=P.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)return c;if(f.id===j)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&h(b,f)&&f.id===j)return c.push(f),c}else{if(e[2])return w.apply(c,x.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&_&&b.getElementsByClassName)return w.apply(c,x.call(b.getElementsByClassName(j),0)),c}return bp(a.replace(L,"$1"),b,c,d,i)}function bd(a){return function(b){var c=b.nodeName.toLowerCase();return c==="input"&&b.type===a}}function be(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}}function bf(a){return z(function(b){return b=+b,z(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function bg(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}function bh(a,b){var c,d,f,g,h,i,j,k=C[o][a];if(k)return b?0:k.slice(0);h=a,i=[],j=e.preFilter;while(h){if(!c||(d=M.exec(h)))d&&(h=h.slice(d[0].length)),i.push(f=[]);c=!1;if(d=N.exec(h))f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=d[0].replace(L," ");for(g in e.filter)(d=W[g].exec(h))&&(!j[g]||(d=j[g](d,r,!0)))&&(f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=g,c.matches=d);if(!c)break}return b?h.length:h?bc.error(a):C(a,i).slice(0)}function bi(a,b,d){var e=b.dir,f=d&&b.dir==="parentNode",g=u++;return b.first?function(b,c,d){while(b=b[e])if(f||b.nodeType===1)return a(b,c,d)}:function(b,d,h){if(!h){var i,j=t+" "+g+" ",k=j+c;while(b=b[e])if(f||b.nodeType===1){if((i=b[o])===k)return b.sizset;if(typeof i=="string"&&i.indexOf(j)===0){if(b.sizset)return b}else{b[o]=k;if(a(b,d,h))return b.sizset=!0,b;b.sizset=!1}}}else while(b=b[e])if(f||b.nodeType===1)if(a(b,d,h))return b}}function bj(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function bk(a,b,c,d,e){var f,g=[],h=0,i=a.length,j=b!=null;for(;h-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==l)||((b=c).nodeType?j(a,c,d):k(a,c,d))}];for(;i1&&bj(m),i>1&&a.slice(0,i-1).join("").replace(L,"$1"),c,i0,f=a.length>0,g=function(h,i,j,k,m){var n,o,p,q=[],s=0,u="0",x=h&&[],y=m!=null,z=l,A=h||f&&e.find.TAG("*",m&&i.parentNode||i),B=t+=z==null?1:Math.E;y&&(l=i!==r&&i,c=g.el);for(;(n=A[u])!=null;u++){if(f&&n){for(o=0;p=a[o];o++)if(p(n,i,j)){k.push(n);break}y&&(t=B,c=++g.el)}d&&((n=!p&&n)&&s--,h&&x.push(n))}s+=u;if(d&&u!==s){for(o=0;p=b[o];o++)p(x,q,i,j);if(h){if(s>0)while(u--)!x[u]&&!q[u]&&(q[u]=v.call(k));q=bk(q)}w.apply(k,q),y&&!h&&q.length>0&&s+b.length>1&&bc.uniqueSort(k)}return y&&(t=B,l=z),x};return g.el=0,d?z(g):g}function bo(a,b,c,d){var e=0,f=b.length;for(;e2&&(j=h[0]).type==="ID"&&b.nodeType===9&&!f&&e.relative[h[1].type]){b=e.find.ID(j.matches[0].replace(V,""),b,f)[0];if(!b)return c;a=a.slice(h.shift().length)}for(g=W.POS.test(a)?-1:h.length-1;g>=0;g--){j=h[g];if(e.relative[k=j.type])break;if(l=e.find[k])if(d=l(j.matches[0].replace(V,""),R.test(h[0].type)&&b.parentNode||b,f)){h.splice(g,1),a=d.length&&h.join("");if(!a)return w.apply(c,x.call(d,0)),c;break}}}return i(a,m)(d,b,f,c,R.test(a)),c}function bq(){}var c,d,e,f,g,h,i,j,k,l,m=!0,n="undefined",o=("sizcache"+Math.random()).replace(".",""),q=String,r=a.document,s=r.documentElement,t=0,u=0,v=[].pop,w=[].push,x=[].slice,y=[].indexOf||function(a){var b=0,c=this.length;for(;be.cacheLength&&delete a[b.shift()],a[c]=d},a)},B=A(),C=A(),D=A(),E="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",G=F.replace("w","w#"),H="([*^$|!~]?=)",I="\\["+E+"*("+F+")"+E+"*(?:"+H+E+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+G+")|)|)"+E+"*\\]",J=":("+F+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+I+")|[^:]|\\\\.)*|.*))\\)|)",K=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)",L=new RegExp("^"+E+"+|((?:^|[^\\\\])(?:\\\\.)*)"+E+"+$","g"),M=new RegExp("^"+E+"*,"+E+"*"),N=new RegExp("^"+E+"*([\\x20\\t\\r\\n\\f>+~])"+E+"*"),O=new RegExp(J),P=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,Q=/^:not/,R=/[\x20\t\r\n\f]*[+~]/,S=/:not\($/,T=/h\d/i,U=/input|select|textarea|button/i,V=/\\(?!\\)/g,W={ID:new RegExp("^#("+F+")"),CLASS:new RegExp("^\\.("+F+")"),NAME:new RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:new RegExp("^("+F.replace("w","w*")+")"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+J),POS:new RegExp(K,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i"),needsContext:new RegExp("^"+E+"*[>+~]|"+K,"i")},X=function(a){var b=r.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}},Y=X(function(a){return a.appendChild(r.createComment("")),!a.getElementsByTagName("*").length}),Z=X(function(a){return a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!==n&&a.firstChild.getAttribute("href")==="#"}),$=X(function(a){a.innerHTML="";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),_=X(function(a){return a.innerHTML="",!a.getElementsByClassName||!a.getElementsByClassName("e").length?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length===2)}),ba=X(function(a){a.id=o+0,a.innerHTML="
        ",s.insertBefore(a,s.firstChild);var b=r.getElementsByName&&r.getElementsByName(o).length===2+r.getElementsByName(o+0).length;return d=!r.getElementById(o),s.removeChild(a),b});try{x.call(s.childNodes,0)[0].nodeType}catch(bb){x=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}bc.matches=function(a,b){return bc(a,null,null,b)},bc.matchesSelector=function(a,b){return bc(b,null,null,[a]).length>0},f=bc.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=f(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=f(b);return c},g=bc.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},h=bc.contains=s.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:s.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc.attr=function(a,b){var c,d=g(a);return d||(b=b.toLowerCase()),(c=e.attrHandle[b])?c(a):d||$?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},e=bc.selectors={cacheLength:50,createPseudo:z,match:W,attrHandle:Z?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},find:{ID:d?function(a,b,c){if(typeof b.getElementById!==n&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==n&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==n&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:Y?function(a,b){if(typeof b.getElementsByTagName!==n)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c},NAME:ba&&function(a,b){if(typeof b.getElementsByName!==n)return b.getElementsByName(name)},CLASS:_&&function(a,b,c){if(typeof b.getElementsByClassName!==n&&!c)return b.getElementsByClassName(a)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(V,""),a[3]=(a[4]||a[5]||"").replace(V,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||bc.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&bc.error(a[0]),a},PSEUDO:function(a){var b,c;if(W.CHILD.test(a[0]))return null;if(a[3])a[2]=a[3];else if(b=a[4])O.test(b)&&(c=bh(b,!0))&&(c=b.indexOf(")",b.length-c)-b.length)&&(b=b.slice(0,c),a[0]=a[0].slice(0,c)),a[2]=b;return a.slice(0,3)}},filter:{ID:d?function(a){return a=a.replace(V,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(V,""),function(b){var c=typeof b.getAttributeNode!==n&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(V,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=B[o][a];return b||(b=B(a,new RegExp("(^|"+E+")"+a+"("+E+"|$)"))),function(a){return b.test(a.className||typeof a.getAttribute!==n&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return function(d,e){var f=bc.attr(d,a);return f==null?b==="!=":b?(f+="",b==="="?f===c:b==="!="?f!==c:b==="^="?c&&f.indexOf(c)===0:b==="*="?c&&f.indexOf(c)>-1:b==="$="?c&&f.substr(f.length-c.length)===c:b==="~="?(" "+f+" ").indexOf(c)>-1:b==="|="?f===c||f.substr(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d){return a==="nth"?function(a){var b,e,f=a.parentNode;if(c===1&&d===0)return!0;if(f){e=0;for(b=f.firstChild;b;b=b.nextSibling)if(b.nodeType===1){e++;if(a===b)break}}return e-=d,e===c||e%c===0&&e/c>=0}:function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b){var c,d=e.pseudos[a]||e.setFilters[a.toLowerCase()]||bc.error("unsupported pseudo: "+a);return d[o]?d(b):d.length>1?(c=[a,a,"",b],e.setFilters.hasOwnProperty(a.toLowerCase())?z(function(a,c){var e,f=d(a,b),g=f.length;while(g--)e=y.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:z(function(a){var b=[],c=[],d=i(a.replace(L,"$1"));return d[o]?z(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)if(f=g[h])a[h]=!(b[h]=f)}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:z(function(a){return function(b){return bc(a,b).length>0}}),contains:z(function(a){return function(b){return(b.textContent||b.innerText||f(b)).indexOf(a)>-1}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!e.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},header:function(a){return T.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:bd("radio"),checkbox:bd("checkbox"),file:bd("file"),password:bd("password"),image:bd("image"),submit:be("submit"),reset:be("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return U.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement},first:bf(function(a,b,c){return[0]}),last:bf(function(a,b,c){return[b-1]}),eq:bf(function(a,b,c){return[c<0?c+b:c]}),even:bf(function(a,b,c){for(var d=0;d=0;)a.push(d);return a}),gt:bf(function(a,b,c){for(var d=c<0?c+b:c;++d",a.querySelectorAll("[selected]").length||e.push("\\["+E+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),X(function(a){a.innerHTML="

        ",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+E+"*(?:\"\"|'')"),a.innerHTML="",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=new RegExp(e.join("|")),bp=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a))){var i,j,k=!0,l=o,m=d,n=d.nodeType===9&&a;if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){i=bh(a),(k=d.getAttribute("id"))?l=k.replace(c,"\\$&"):d.setAttribute("id",l),l="[id='"+l+"'] ",j=i.length;while(j--)i[j]=l+i[j].join("");m=R.test(a)&&d.parentNode||d,n=i.join(",")}if(n)try{return w.apply(f,x.call(m.querySelectorAll(n),0)),f}catch(p){}finally{k||d.removeAttribute("id")}}return b(a,d,f,g,h)},h&&(X(function(b){a=h.call(b,"div");try{h.call(b,"[test!='']:sizzle"),f.push("!=",J)}catch(c){}}),f=new RegExp(f.join("|")),bc.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!g(b)&&!f.test(c)&&(!e||!e.test(c)))try{var i=h.call(b,c);if(i||a||b.document&&b.document.nodeType!==11)return i}catch(j){}return bc(c,null,null,[b]).length>0})}(),e.pseudos.nth=e.pseudos.eq,e.filters=bq.prototype=e.pseudos,e.setFilters=new bq,bc.attr=p.attr,p.find=bc,p.expr=bc.selectors,p.expr[":"]=p.expr.pseudos,p.unique=bc.uniqueSort,p.text=bc.getText,p.isXMLDoc=bc.isXML,p.contains=bc.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b0)for(e=d;e=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/
  • ","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X
    ","
    "]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1>");try{for(;d1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(f=0;(h=a[f])!=null;f++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement("div"),s.appendChild(l),h=h.replace(bo,"<$1>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]===""&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],"tbody")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new RegExp("^("+q+")(.*)$","i"),bQ=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bR=new RegExp("^([-+])=("+q+")","i"),bS={},bT={position:"absolute",visibility:"hidden",display:"block"},bU={letterSpacing:0,fontWeight:400},bV=["Top","Right","Bottom","Left"],bW=["Webkit","O","Moz","ms"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return b$(this,!0)},hide:function(){return b$(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(b,c){var d,e,f,g,h=a.getComputedStyle(b,null),i=b.style;return h&&(d=h[c],d===""&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth===0&&bN.test(bH(a,"display"))?p.swap(a,bT,function(){return cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bQ.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var cd=/%20/g,ce=/\[\]$/,cf=/\r?\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,"\r\n")}}):{name:b.name,value:c.replace(cf,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ci(d,a[d],c,f);return e.join("&").replace(cd,"+")};var cj,ck,cl=/#.*$/,cm=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\/\//,cq=/\?/,cr=/)<[^<]*)*<\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=["*/"]+["*"];try{ck=f.href}catch(cy){ck=e.createElement("a"),ck.href="",ck=ck.href}cj=ct.exec(ck.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&cu)return cu.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("
    ").append(a.replace(cr,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:ck,isLocal:cn.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cx},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=(c||y)+"",k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(cl,"").replace(cp,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase())||!1,l.crossDomain=i&&i.join(":")+(i[3]?"":i[1]==="http:"?80:443)!==cj.join(":")+(cj[3]?"":cj[1]==="http:"?80:443)),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cs,"$1_="+z);l.url=A+(A===l.url?(cq.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cx+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cE=[],cF=/\?/,cG=/(=)\?(?=&|$)|\?\?/,cH=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cE.pop()||p.expando+"_"+cH++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cG.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,"$1"+f):m?c.data=i.replace(cG,"$1"+f):k&&(c.url+=(cF.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cI,cJ=a.ActiveXObject?function(){for(var a in cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cJ&&delete cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cR=/queueHooks$/,cS=[cY],cT={"*":[function(a,b){var c,d,e=this.createTween(a,b),f=cQ.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){c=+f[2],d=f[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&h){h=p.css(e.elem,a,!0)||c||1;do i=i||".5",h=h/i,p.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&i!==1&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return e}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c_.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=da(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window); \ No newline at end of file diff --git a/vendor/golang.org/x/tools/godoc/static/jquery.treeview.css b/vendor/golang.org/x/tools/godoc/static/jquery.treeview.css new file mode 100644 index 0000000000..ac33361a62 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/jquery.treeview.css @@ -0,0 +1,76 @@ +/* https://github.com/jzaefferer/jquery-treeview/blob/master/jquery.treeview.css */ +/* License: MIT. */ +.treeview, .treeview ul { + padding: 0; + margin: 0; + list-style: none; +} + +.treeview ul { + background-color: white; + margin-top: 4px; +} + +.treeview .hitarea { + background: url(images/treeview-default.gif) -64px -25px no-repeat; + height: 16px; + width: 16px; + margin-left: -16px; + float: left; + cursor: pointer; +} +/* fix for IE6 */ +* html .hitarea { + display: inline; + float:none; +} + +.treeview li { + margin: 0; + padding: 3px 0pt 3px 16px; +} + +.treeview a.selected { + background-color: #eee; +} + +#treecontrol { margin: 1em 0; display: none; } + +.treeview .hover { color: red; cursor: pointer; } + +.treeview li { background: url(images/treeview-default-line.gif) 0 0 no-repeat; } +.treeview li.collapsable, .treeview li.expandable { background-position: 0 -176px; } + +.treeview .expandable-hitarea { background-position: -80px -3px; } + +.treeview li.last { background-position: 0 -1766px } +.treeview li.lastCollapsable, .treeview li.lastExpandable { background-image: url(images/treeview-default.gif); } +.treeview li.lastCollapsable { background-position: 0 -111px } +.treeview li.lastExpandable { background-position: -32px -67px } + +.treeview div.lastCollapsable-hitarea, .treeview div.lastExpandable-hitarea { background-position: 0; } + +.treeview-red li { background-image: url(images/treeview-red-line.gif); } +.treeview-red .hitarea, .treeview-red li.lastCollapsable, .treeview-red li.lastExpandable { background-image: url(images/treeview-red.gif); } + +.treeview-black li { background-image: url(images/treeview-black-line.gif); } +.treeview-black .hitarea, .treeview-black li.lastCollapsable, .treeview-black li.lastExpandable { background-image: url(images/treeview-black.gif); } + +.treeview-gray li { background-image: url(images/treeview-gray-line.gif); } +.treeview-gray .hitarea, .treeview-gray li.lastCollapsable, .treeview-gray li.lastExpandable { background-image: url(images/treeview-gray.gif); } + +.treeview-famfamfam li { background-image: url(images/treeview-famfamfam-line.gif); } +.treeview-famfamfam .hitarea, .treeview-famfamfam li.lastCollapsable, .treeview-famfamfam li.lastExpandable { background-image: url(images/treeview-famfamfam.gif); } + +.treeview .placeholder { + background: url(images/ajax-loader.gif) 0 0 no-repeat; + height: 16px; + width: 16px; + display: block; +} + +.filetree li { padding: 3px 0 2px 16px; } +.filetree span.folder, .filetree span.file { padding: 1px 0 1px 16px; display: block; } +.filetree span.folder { background: url(images/folder.gif) 0 0 no-repeat; } +.filetree li.expandable span.folder { background: url(images/folder-closed.gif) 0 0 no-repeat; } +.filetree span.file { background: url(images/file.gif) 0 0 no-repeat; } diff --git a/vendor/golang.org/x/tools/godoc/static/jquery.treeview.edit.js b/vendor/golang.org/x/tools/godoc/static/jquery.treeview.edit.js new file mode 100644 index 0000000000..9895b02631 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/jquery.treeview.edit.js @@ -0,0 +1,39 @@ +/* https://github.com/jzaefferer/jquery-treeview/blob/master/jquery.treeview.edit.js */ +/* License: MIT. */ +(function($) { + var CLASSES = $.treeview.classes; + var proxied = $.fn.treeview; + $.fn.treeview = function(settings) { + settings = $.extend({}, settings); + if (settings.add) { + return this.trigger("add", [settings.add]); + } + if (settings.remove) { + return this.trigger("remove", [settings.remove]); + } + return proxied.apply(this, arguments).bind("add", function(event, branches) { + $(branches).prev() + .removeClass(CLASSES.last) + .removeClass(CLASSES.lastCollapsable) + .removeClass(CLASSES.lastExpandable) + .find(">.hitarea") + .removeClass(CLASSES.lastCollapsableHitarea) + .removeClass(CLASSES.lastExpandableHitarea); + $(branches).find("li").andSelf().prepareBranches(settings).applyClasses(settings, $(this).data("toggler")); + }).bind("remove", function(event, branches) { + var prev = $(branches).prev(); + var parent = $(branches).parent(); + $(branches).remove(); + prev.filter(":last-child").addClass(CLASSES.last) + .filter("." + CLASSES.expandable).replaceClass(CLASSES.last, CLASSES.lastExpandable).end() + .find(">.hitarea").replaceClass(CLASSES.expandableHitarea, CLASSES.lastExpandableHitarea).end() + .filter("." + CLASSES.collapsable).replaceClass(CLASSES.last, CLASSES.lastCollapsable).end() + .find(">.hitarea").replaceClass(CLASSES.collapsableHitarea, CLASSES.lastCollapsableHitarea); + if (parent.is(":not(:has(>))") && parent[0] != this) { + parent.parent().removeClass(CLASSES.collapsable).removeClass(CLASSES.expandable) + parent.siblings(".hitarea").andSelf().remove(); + } + }); + }; + +})(jQuery); diff --git a/vendor/golang.org/x/tools/godoc/static/jquery.treeview.js b/vendor/golang.org/x/tools/godoc/static/jquery.treeview.js new file mode 100644 index 0000000000..356af2380f --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/jquery.treeview.js @@ -0,0 +1,256 @@ +/* + * Treeview 1.4.1 - jQuery plugin to hide and show branches of a tree + * + * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/ + * http://docs.jquery.com/Plugins/Treeview + * + * Copyright (c) 2007 Jörn Zaefferer + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id: jquery.treeview.js 5759 2008-07-01 07:50:28Z joern.zaefferer $ + * + */ + +;(function($) { + + // TODO rewrite as a widget, removing all the extra plugins + $.extend($.fn, { + swapClass: function(c1, c2) { + var c1Elements = this.filter('.' + c1); + this.filter('.' + c2).removeClass(c2).addClass(c1); + c1Elements.removeClass(c1).addClass(c2); + return this; + }, + replaceClass: function(c1, c2) { + return this.filter('.' + c1).removeClass(c1).addClass(c2).end(); + }, + hoverClass: function(className) { + className = className || "hover"; + return this.hover(function() { + $(this).addClass(className); + }, function() { + $(this).removeClass(className); + }); + }, + heightToggle: function(animated, callback) { + animated ? + this.animate({ height: "toggle" }, animated, callback) : + this.each(function(){ + jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ](); + if(callback) + callback.apply(this, arguments); + }); + }, + heightHide: function(animated, callback) { + if (animated) { + this.animate({ height: "hide" }, animated, callback); + } else { + this.hide(); + if (callback) + this.each(callback); + } + }, + prepareBranches: function(settings) { + if (!settings.prerendered) { + // mark last tree items + this.filter(":last-child:not(ul)").addClass(CLASSES.last); + // collapse whole tree, or only those marked as closed, anyway except those marked as open + this.filter((settings.collapsed ? "" : "." + CLASSES.closed) + ":not(." + CLASSES.open + ")").find(">ul").hide(); + } + // return all items with sublists + return this.filter(":has(>ul)"); + }, + applyClasses: function(settings, toggler) { + // TODO use event delegation + this.filter(":has(>ul):not(:has(>a))").find(">span").unbind("click.treeview").bind("click.treeview", function(event) { + // don't handle click events on children, eg. checkboxes + if ( this == event.target ) + toggler.apply($(this).next()); + }).add( $("a", this) ).hoverClass(); + + if (!settings.prerendered) { + // handle closed ones first + this.filter(":has(>ul:hidden)") + .addClass(CLASSES.expandable) + .replaceClass(CLASSES.last, CLASSES.lastExpandable); + + // handle open ones + this.not(":has(>ul:hidden)") + .addClass(CLASSES.collapsable) + .replaceClass(CLASSES.last, CLASSES.lastCollapsable); + + // create hitarea if not present + var hitarea = this.find("div." + CLASSES.hitarea); + if (!hitarea.length) + hitarea = this.prepend("
    ").find("div." + CLASSES.hitarea); + hitarea.removeClass().addClass(CLASSES.hitarea).each(function() { + var classes = ""; + $.each($(this).parent().attr("class").split(" "), function() { + classes += this + "-hitarea "; + }); + $(this).addClass( classes ); + }) + } + + // apply event to hitarea + this.find("div." + CLASSES.hitarea).click( toggler ); + }, + treeview: function(settings) { + + settings = $.extend({ + cookieId: "treeview" + }, settings); + + if ( settings.toggle ) { + var callback = settings.toggle; + settings.toggle = function() { + return callback.apply($(this).parent()[0], arguments); + }; + } + + // factory for treecontroller + function treeController(tree, control) { + // factory for click handlers + function handler(filter) { + return function() { + // reuse toggle event handler, applying the elements to toggle + // start searching for all hitareas + toggler.apply( $("div." + CLASSES.hitarea, tree).filter(function() { + // for plain toggle, no filter is provided, otherwise we need to check the parent element + return filter ? $(this).parent("." + filter).length : true; + }) ); + return false; + }; + } + // click on first element to collapse tree + $("a:eq(0)", control).click( handler(CLASSES.collapsable) ); + // click on second to expand tree + $("a:eq(1)", control).click( handler(CLASSES.expandable) ); + // click on third to toggle tree + $("a:eq(2)", control).click( handler() ); + } + + // handle toggle event + function toggler() { + $(this) + .parent() + // swap classes for hitarea + .find(">.hitarea") + .swapClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea ) + .swapClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea ) + .end() + // swap classes for parent li + .swapClass( CLASSES.collapsable, CLASSES.expandable ) + .swapClass( CLASSES.lastCollapsable, CLASSES.lastExpandable ) + // find child lists + .find( ">ul" ) + // toggle them + .heightToggle( settings.animated, settings.toggle ); + if ( settings.unique ) { + $(this).parent() + .siblings() + // swap classes for hitarea + .find(">.hitarea") + .replaceClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea ) + .replaceClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea ) + .end() + .replaceClass( CLASSES.collapsable, CLASSES.expandable ) + .replaceClass( CLASSES.lastCollapsable, CLASSES.lastExpandable ) + .find( ">ul" ) + .heightHide( settings.animated, settings.toggle ); + } + } + this.data("toggler", toggler); + + function serialize() { + function binary(arg) { + return arg ? 1 : 0; + } + var data = []; + branches.each(function(i, e) { + data[i] = $(e).is(":has(>ul:visible)") ? 1 : 0; + }); + $.cookie(settings.cookieId, data.join(""), settings.cookieOptions ); + } + + function deserialize() { + var stored = $.cookie(settings.cookieId); + if ( stored ) { + var data = stored.split(""); + branches.each(function(i, e) { + $(e).find(">ul")[ parseInt(data[i]) ? "show" : "hide" ](); + }); + } + } + + // add treeview class to activate styles + this.addClass("treeview"); + + // prepare branches and find all tree items with child lists + var branches = this.find("li").prepareBranches(settings); + + switch(settings.persist) { + case "cookie": + var toggleCallback = settings.toggle; + settings.toggle = function() { + serialize(); + if (toggleCallback) { + toggleCallback.apply(this, arguments); + } + }; + deserialize(); + break; + case "location": + var current = this.find("a").filter(function() { + return this.href.toLowerCase() == location.href.toLowerCase(); + }); + if ( current.length ) { + // TODO update the open/closed classes + var items = current.addClass("selected").parents("ul, li").add( current.next() ).show(); + if (settings.prerendered) { + // if prerendered is on, replicate the basic class swapping + items.filter("li") + .swapClass( CLASSES.collapsable, CLASSES.expandable ) + .swapClass( CLASSES.lastCollapsable, CLASSES.lastExpandable ) + .find(">.hitarea") + .swapClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea ) + .swapClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea ); + } + } + break; + } + + branches.applyClasses(settings, toggler); + + // if control option is set, create the treecontroller and show it + if ( settings.control ) { + treeController(this, settings.control); + $(settings.control).show(); + } + + return this; + } + }); + + // classes used by the plugin + // need to be styled via external stylesheet, see first example + $.treeview = {}; + var CLASSES = ($.treeview.classes = { + open: "open", + closed: "closed", + expandable: "expandable", + expandableHitarea: "expandable-hitarea", + lastExpandableHitarea: "lastExpandable-hitarea", + collapsable: "collapsable", + collapsableHitarea: "collapsable-hitarea", + lastCollapsableHitarea: "lastCollapsable-hitarea", + lastCollapsable: "lastCollapsable", + lastExpandable: "lastExpandable", + last: "last", + hitarea: "hitarea" + }); + +})(jQuery); diff --git a/vendor/golang.org/x/tools/godoc/static/makestatic.go b/vendor/golang.org/x/tools/godoc/static/makestatic.go new file mode 100644 index 0000000000..f48313c2bf --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/makestatic.go @@ -0,0 +1,121 @@ +// Copyright 2013 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 + +// Command makestatic reads a set of files and writes a Go source file to "static.go" +// that declares a map of string constants containing contents of the input files. +// It is intended to be invoked via "go generate" (directive in "gen.go"). +package main + +import ( + "bufio" + "bytes" + "fmt" + "io/ioutil" + "os" + "unicode/utf8" +) + +var files = []string{ + "analysis/call3.png", + "analysis/call-eg.png", + "analysis/callers1.png", + "analysis/callers2.png", + "analysis/chan1.png", + "analysis/chan2a.png", + "analysis/chan2b.png", + "analysis/error1.png", + "analysis/help.html", + "analysis/ident-def.png", + "analysis/ident-field.png", + "analysis/ident-func.png", + "analysis/ipcg-func.png", + "analysis/ipcg-pkg.png", + "analysis/typeinfo-pkg.png", + "analysis/typeinfo-src.png", + "callgraph.html", + "codewalk.html", + "codewalkdir.html", + "dirlist.html", + "error.html", + "example.html", + "godoc.html", + "godocs.js", + "images/minus.gif", + "images/plus.gif", + "images/treeview-black-line.gif", + "images/treeview-black.gif", + "images/treeview-default-line.gif", + "images/treeview-default.gif", + "images/treeview-gray-line.gif", + "images/treeview-gray.gif", + "implements.html", + "jquery.js", + "jquery.treeview.css", + "jquery.treeview.edit.js", + "jquery.treeview.js", + "methodset.html", + "opensearch.xml", + "package.html", + "package.txt", + "play.js", + "playground.js", + "search.html", + "search.txt", + "searchcode.html", + "searchdoc.html", + "searchtxt.html", + "style.css", +} + +func main() { + if err := makestatic(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func makestatic() error { + f, err := os.Create("static.go") + if err != nil { + return err + } + defer f.Close() + w := bufio.NewWriter(f) + fmt.Fprintf(w, "%v\npackage static\n\n", warning) + fmt.Fprintf(w, "var Files = map[string]string{\n") + for _, fn := range files { + b, err := ioutil.ReadFile(fn) + if err != nil { + return err + } + fmt.Fprintf(w, "\t%q: ", fn) + if utf8.Valid(b) { + fmt.Fprintf(w, "`%s`", sanitize(b)) + } else { + fmt.Fprintf(w, "%q", b) + } + fmt.Fprintln(w, ",\n") + } + fmt.Fprintln(w, "}") + if err := w.Flush(); err != nil { + return err + } + return f.Close() +} + +// sanitize prepares a valid UTF-8 string as a raw string constant. +func sanitize(b []byte) []byte { + // Replace ` with `+"`"+` + b = bytes.Replace(b, []byte("`"), []byte("`+\"`\"+`"), -1) + + // Replace BOM with `+"\xEF\xBB\xBF"+` + // (A BOM is valid UTF-8 but not permitted in Go source files. + // I wouldn't bother handling this, but for some insane reason + // jquery.js has a BOM somewhere in the middle.) + return bytes.Replace(b, []byte("\xEF\xBB\xBF"), []byte("`+\"\\xEF\\xBB\\xBF\"+`"), -1) +} + +const warning = "// Code generated by \"makestatic\"; DO NOT EDIT\n" diff --git a/vendor/golang.org/x/tools/godoc/static/methodset.html b/vendor/golang.org/x/tools/godoc/static/methodset.html new file mode 100644 index 0000000000..1b339e3c3d --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/methodset.html @@ -0,0 +1,9 @@ + diff --git a/vendor/golang.org/x/tools/godoc/static/opensearch.xml b/vendor/golang.org/x/tools/godoc/static/opensearch.xml new file mode 100644 index 0000000000..1b652db376 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/opensearch.xml @@ -0,0 +1,11 @@ + + + godoc + The Go Programming Language + go golang + + + /favicon.ico + UTF-8 + UTF-8 + diff --git a/vendor/golang.org/x/tools/godoc/static/package.html b/vendor/golang.org/x/tools/godoc/static/package.html new file mode 100644 index 0000000000..964ed915eb --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/package.html @@ -0,0 +1,329 @@ + + +{{with .PDoc}} + + + {{if $.IsMain}} + {{/* command documentation */}} + {{comment_html .Doc}} + {{else}} + {{/* package documentation */}} +
    +
    +
    import "{{html .ImportPath}}"
    +
    +
    +
    Overview
    +
    Index
    + {{if $.Examples}} +
    Examples
    + {{end}} + {{if $.Dirs}} +
    Subdirectories
    + {{end}} +
    +
    + +
    + +
    +

    Overview ▾

    + {{comment_html .Doc}} +
    +
    + {{example_html $ ""}} + +
    + +
    +

    Index ▾

    + + +
    +
    + {{if .Consts}} +
    Constants
    + {{end}} + {{if .Vars}} +
    Variables
    + {{end}} + {{range .Funcs}} + {{$name_html := html .Name}} +
    {{node_html $ .Decl false | sanitize}}
    + {{end}} + {{range .Types}} + {{$tname_html := html .Name}} +
    type {{$tname_html}}
    + {{range .Funcs}} + {{$name_html := html .Name}} +
        {{node_html $ .Decl false | sanitize}}
    + {{end}} + {{range .Methods}} + {{$name_html := html .Name}} +
        {{node_html $ .Decl false | sanitize}}
    + {{end}} + {{end}} + {{if $.Notes}} + {{range $marker, $item := $.Notes}} +
    {{noteTitle $marker | html}}s
    + {{end}} + {{end}} +
    +
    + + {{if $.Examples}} +
    +

    Examples

    +
    + {{range $.Examples}} +
    {{example_name .Name}}
    + {{end}} +
    +
    + {{end}} + + {{with .Filenames}} +

    Package files

    +

    + + {{range .}} + {{.|filename|html}} + {{end}} + +

    + {{end}} +
    +
    + + + + {{with .Consts}} +

    Constants

    + {{range .}} +
    {{node_html $ .Decl true}}
    + {{comment_html .Doc}} + {{end}} + {{end}} + {{with .Vars}} +

    Variables

    + {{range .}} +
    {{node_html $ .Decl true}}
    + {{comment_html .Doc}} + {{end}} + {{end}} + {{range .Funcs}} + {{/* Name is a string - no need for FSet */}} + {{$name_html := html .Name}} +

    func {{$name_html}}

    +
    {{node_html $ .Decl true}}
    + {{comment_html .Doc}} + {{example_html $ .Name}} + {{callgraph_html $ "" .Name}} + + {{end}} + {{range .Types}} + {{$tname := .Name}} + {{$tname_html := html .Name}} +

    type {{$tname_html}}

    +
    {{node_html $ .Decl true}}
    + {{comment_html .Doc}} + + {{range .Consts}} +
    {{node_html $ .Decl true}}
    + {{comment_html .Doc}} + {{end}} + + {{range .Vars}} +
    {{node_html $ .Decl true}}
    + {{comment_html .Doc}} + {{end}} + + {{example_html $ $tname}} + {{implements_html $ $tname}} + {{methodset_html $ $tname}} + + {{range .Funcs}} + {{$name_html := html .Name}} +

    func {{$name_html}}

    +
    {{node_html $ .Decl true}}
    + {{comment_html .Doc}} + {{example_html $ .Name}} + {{callgraph_html $ "" .Name}} + {{end}} + + {{range .Methods}} + {{$name_html := html .Name}} +

    func ({{html .Recv}}) {{$name_html}}

    +
    {{node_html $ .Decl true}}
    + {{comment_html .Doc}} + {{$name := printf "%s_%s" $tname .Name}} + {{example_html $ $name}} + {{callgraph_html $ .Recv .Name}} + {{end}} + {{end}} + {{end}} + + {{with $.Notes}} + {{range $marker, $content := .}} +

    {{noteTitle $marker | html}}s

    +
      + {{range .}} +
    • {{html .Body}}
    • + {{end}} +
    + {{end}} + {{end}} +{{end}} + +{{with .PAst}} + {{range $filename, $ast := .}} + {{$filename|filename|html}}:
    {{node_html $ $ast false}}
    + {{end}} +{{end}} + +{{with .Dirs}} + {{/* DirList entries are numbers and strings - no need for FSet */}} + {{if $.PDoc}} +

    Subdirectories

    + {{end}} + {{if eq $.Dirname "/src"}} + +

    Standard library

    + + {{end}} + + +
    +
    + + + + + + {{if not (or (eq $.Dirname "/src") (eq $.Dirname "/src/cmd") $.DirFlat)}} + + + + {{end}} + + {{range .List}} + {{if $.DirFlat}} + {{if .HasPkg}} + + + + + {{end}} + {{else}} + + + + + {{end}} + {{end}} +
    NameSynopsis
    ..
    + {{html .Path}} + + {{html .Synopsis}} +
    + {{html .Name}} + + {{html .Synopsis}} +
    +
    + + + {{if eq $.Dirname "/src"}} +

    Other packages

    + +

    Sub-repositories

    +

    + These packages are part of the Go Project but outside the main Go tree. + They are developed under looser compatibility requirements than the Go core. + Install them with "go get". +

    +
      +
    • benchmarks — benchmarks to measure Go as it is developed.
    • +
    • blogblog.golang.org's implementation.
    • +
    • buildbuild.golang.org's implementation.
    • +
    • crypto — additional cryptography packages.
    • +
    • debug — an experimental debugger for Go.
    • +
    • image — additional imaging packages.
    • +
    • mobile — experimental support for Go on mobile platforms.
    • +
    • net — additional networking packages.
    • +
    • sys — packages for making system calls.
    • +
    • text — packages for working with text.
    • +
    • tools — godoc, goimports, gorename, and other tools.
    • +
    • tourtour.golang.org's implementation.
    • +
    • exp — experimental and deprecated packages (handle with care; may change without warning).
    • +
    + +

    Community

    +

    + These services can help you find Open Source packages provided by the community. +

    + + {{end}} +{{end}} diff --git a/vendor/golang.org/x/tools/godoc/static/package.txt b/vendor/golang.org/x/tools/godoc/static/package.txt new file mode 100644 index 0000000000..e53fa6ed38 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/package.txt @@ -0,0 +1,116 @@ +{{$info := .}}{{$filtered := .IsFiltered}}{{/* + +--------------------------------------- + +*/}}{{if $filtered}}{{range .PAst}}{{range .Decls}}{{node $info .}} + +{{end}}{{end}}{{else}}{{with .PAst}}{{range $filename, $ast := .}}{{$filename}}: +{{node $ $ast}}{{end}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if and $filtered (not (or .PDoc .PAst))}}No match found. +{{end}}{{with .PDoc}}{{if $.IsMain}}COMMAND DOCUMENTATION + +{{comment_text .Doc " " "\t"}} +{{else}}{{if not $filtered}}PACKAGE DOCUMENTATION + +package {{.Name}} + import "{{.ImportPath}}" + +{{comment_text .Doc " " "\t"}} +{{example_text $ "" " "}}{{end}}{{/* + +--------------------------------------- + +*/}}{{with .Consts}}{{if not $filtered}}CONSTANTS + +{{end}}{{range .}}{{node $ .Decl}} +{{comment_text .Doc " " "\t"}} +{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{with .Vars}}{{if not $filtered}}VARIABLES + +{{end}}{{range .}}{{node $ .Decl}} +{{comment_text .Doc " " "\t"}} +{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{with .Funcs}}{{if not $filtered}}FUNCTIONS + +{{end}}{{range .}}{{node $ .Decl}} +{{comment_text .Doc " " "\t"}} +{{example_text $ .Name " "}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{with .Types}}{{if not $filtered}}TYPES + +{{end}}{{range .}}{{$tname := .Name}}{{node $ .Decl}} +{{comment_text .Doc " " "\t"}} +{{/* + +--------------------------------------- + +*/}}{{if .Consts}}{{range .Consts}}{{node $ .Decl}} +{{comment_text .Doc " " "\t"}} +{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if .Vars}}{{range .Vars}}{{node $ .Decl}} +{{comment_text .Doc " " "\t"}} +{{range $name := .Names}}{{example_text $ $name " "}}{{end}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if .Funcs}}{{range .Funcs}}{{node $ .Decl}} +{{comment_text .Doc " " "\t"}} +{{example_text $ .Name " "}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if .Methods}}{{range .Methods}}{{node $ .Decl}} +{{comment_text .Doc " " "\t"}} +{{$name := printf "%s_%s" $tname .Name}}{{example_text $ $name " "}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if and $filtered (not (or .Consts (or .Vars (or .Funcs .Types))))}}No match found. +{{end}}{{/* + +--------------------------------------- + +*/}}{{end}}{{/* + +--------------------------------------- + +*/}}{{with $.Notes}} +{{range $marker, $content := .}} +{{$marker}}S + +{{range $content}}{{comment_text .Body " " "\t"}} +{{end}}{{end}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if not $filtered}}{{with .Dirs}}SUBDIRECTORIES +{{if $.DirFlat}}{{range .List}}{{if .HasPkg}} + {{.Path}}{{end}}{{end}} +{{else}}{{range .List}} + {{repeat `. ` .Depth}}{{.Name}}{{end}} +{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{end}}{{/* +Make sure there is no newline at the end of this file. +perl -i -pe 'chomp if eof' package.txt +*/}} diff --git a/vendor/golang.org/x/tools/godoc/static/play.js b/vendor/golang.org/x/tools/godoc/static/play.js new file mode 100644 index 0000000000..7e87460ba2 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/play.js @@ -0,0 +1,103 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +function initPlayground(transport) { + "use strict"; + + function text(node) { + var s = ""; + for (var i = 0; i < node.childNodes.length; i++) { + var n = node.childNodes[i]; + if (n.nodeType === 1) { + if (n.tagName === "BUTTON") continue + if (n.tagName === "SPAN" && n.className === "number") continue; + if (n.tagName === "DIV" || n.tagName == "BR") { + s += "\n"; + } + s += text(n); + continue; + } + if (n.nodeType === 3) { + s += n.nodeValue; + } + } + return s.replace("\xA0", " "); // replace non-breaking spaces + } + + function init(code) { + var output = document.createElement('div'); + var outpre = document.createElement('pre'); + var running; + + if ($ && $(output).resizable) { + $(output).resizable({ + handles: "n,w,nw", + minHeight: 27, + minWidth: 135, + maxHeight: 608, + maxWidth: 990 + }); + } + + function onKill() { + if (running) running.Kill(); + } + + function onRun(e) { + onKill(); + output.style.display = "block"; + outpre.innerHTML = ""; + run1.style.display = "none"; + var options = {Race: e.shiftKey}; + running = transport.Run(text(code), PlaygroundOutput(outpre), options); + } + + function onClose() { + onKill(); + output.style.display = "none"; + run1.style.display = "inline-block"; + } + + var run1 = document.createElement('button'); + run1.innerHTML = 'Run'; + run1.className = 'run'; + run1.addEventListener("click", onRun, false); + var run2 = document.createElement('button'); + run2.className = 'run'; + run2.innerHTML = 'Run'; + run2.addEventListener("click", onRun, false); + var kill = document.createElement('button'); + kill.className = 'kill'; + kill.innerHTML = 'Kill'; + kill.addEventListener("click", onKill, false); + var close = document.createElement('button'); + close.className = 'close'; + close.innerHTML = 'Close'; + close.addEventListener("click", onClose, false); + + var button = document.createElement('div'); + button.classList.add('buttons'); + button.appendChild(run1); + // Hack to simulate insertAfter + code.parentNode.insertBefore(button, code.nextSibling); + + var buttons = document.createElement('div'); + buttons.classList.add('buttons'); + buttons.appendChild(run2); + buttons.appendChild(kill); + buttons.appendChild(close); + + output.classList.add('output'); + output.appendChild(buttons); + output.appendChild(outpre); + output.style.display = "none"; + code.parentNode.insertBefore(output, button.nextSibling); + } + + var play = document.querySelectorAll('div.playground'); + for (var i = 0; i < play.length; i++) { + init(play[i]); + } +} + diff --git a/vendor/golang.org/x/tools/godoc/static/playground.js b/vendor/golang.org/x/tools/godoc/static/playground.js new file mode 100644 index 0000000000..93dea15c9d --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/playground.js @@ -0,0 +1,433 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +In the absence of any formal way to specify interfaces in JavaScript, +here's a skeleton implementation of a playground transport. + + function Transport() { + // Set up any transport state (eg, make a websocket connection). + return { + Run: function(body, output, options) { + // Compile and run the program 'body' with 'options'. + // Call the 'output' callback to display program output. + return { + Kill: function() { + // Kill the running program. + } + }; + } + }; + } + + // The output callback is called multiple times, and each time it is + // passed an object of this form. + var write = { + Kind: 'string', // 'start', 'stdout', 'stderr', 'end' + Body: 'string' // content of write or end status message + } + + // The first call must be of Kind 'start' with no body. + // Subsequent calls may be of Kind 'stdout' or 'stderr' + // and must have a non-null Body string. + // The final call should be of Kind 'end' with an optional + // Body string, signifying a failure ("killed", for example). + + // The output callback must be of this form. + // See PlaygroundOutput (below) for an implementation. + function outputCallback(write) { + } +*/ + +function HTTPTransport() { + 'use strict'; + + // TODO(adg): support stderr + + function playback(output, events) { + var timeout; + output({Kind: 'start'}); + function next() { + if (!events || events.length === 0) { + output({Kind: 'end'}); + return; + } + var e = events.shift(); + if (e.Delay === 0) { + output({Kind: 'stdout', Body: e.Message}); + next(); + return; + } + timeout = setTimeout(function() { + output({Kind: 'stdout', Body: e.Message}); + next(); + }, e.Delay / 1000000); + } + next(); + return { + Stop: function() { + clearTimeout(timeout); + } + } + } + + function error(output, msg) { + output({Kind: 'start'}); + output({Kind: 'stderr', Body: msg}); + output({Kind: 'end'}); + } + + var seq = 0; + return { + Run: function(body, output, options) { + seq++; + var cur = seq; + var playing; + $.ajax('/compile', { + type: 'POST', + data: {'version': 2, 'body': body}, + dataType: 'json', + success: function(data) { + if (seq != cur) return; + if (!data) return; + if (playing != null) playing.Stop(); + if (data.Errors) { + error(output, data.Errors); + return; + } + playing = playback(output, data.Events); + }, + error: function() { + error(output, 'Error communicating with remote server.'); + } + }); + return { + Kill: function() { + if (playing != null) playing.Stop(); + output({Kind: 'end', Body: 'killed'}); + } + }; + } + }; +} + +function SocketTransport() { + 'use strict'; + + var id = 0; + var outputs = {}; + var started = {}; + var websocket = new WebSocket('ws://' + window.location.host + '/socket'); + + websocket.onclose = function() { + console.log('websocket connection closed'); + } + + websocket.onmessage = function(e) { + var m = JSON.parse(e.data); + var output = outputs[m.Id]; + if (output === null) + return; + if (!started[m.Id]) { + output({Kind: 'start'}); + started[m.Id] = true; + } + output({Kind: m.Kind, Body: m.Body}); + } + + function send(m) { + websocket.send(JSON.stringify(m)); + } + + return { + Run: function(body, output, options) { + var thisID = id+''; + id++; + outputs[thisID] = output; + send({Id: thisID, Kind: 'run', Body: body, Options: options}); + return { + Kill: function() { + send({Id: thisID, Kind: 'kill'}); + } + }; + } + }; +} + +function PlaygroundOutput(el) { + 'use strict'; + + return function(write) { + if (write.Kind == 'start') { + el.innerHTML = ''; + return; + } + + var cl = 'system'; + if (write.Kind == 'stdout' || write.Kind == 'stderr') + cl = write.Kind; + + var m = write.Body; + if (write.Kind == 'end') + m = '\nProgram exited' + (m?(': '+m):'.'); + + if (m.indexOf('IMAGE:') === 0) { + // TODO(adg): buffer all writes before creating image + var url = 'data:image/png;base64,' + m.substr(6); + var img = document.createElement('img'); + img.src = url; + el.appendChild(img); + return; + } + + // ^L clears the screen. + var s = m.split('\x0c'); + if (s.length > 1) { + el.innerHTML = ''; + m = s.pop(); + } + + m = m.replace(/&/g, '&'); + m = m.replace(//g, '>'); + + var needScroll = (el.scrollTop + el.offsetHeight) == el.scrollHeight; + + var span = document.createElement('span'); + span.className = cl; + span.innerHTML = m; + el.appendChild(span); + + if (needScroll) + el.scrollTop = el.scrollHeight - el.offsetHeight; + } +} + +(function() { + function lineHighlight(error) { + var regex = /prog.go:([0-9]+)/g; + var r = regex.exec(error); + while (r) { + $(".lines div").eq(r[1]-1).addClass("lineerror"); + r = regex.exec(error); + } + } + function highlightOutput(wrappedOutput) { + return function(write) { + if (write.Body) lineHighlight(write.Body); + wrappedOutput(write); + } + } + function lineClear() { + $(".lineerror").removeClass("lineerror"); + } + + // opts is an object with these keys + // codeEl - code editor element + // outputEl - program output element + // runEl - run button element + // fmtEl - fmt button element (optional) + // fmtImportEl - fmt "imports" checkbox element (optional) + // shareEl - share button element (optional) + // shareURLEl - share URL text input element (optional) + // shareRedirect - base URL to redirect to on share (optional) + // toysEl - toys select element (optional) + // enableHistory - enable using HTML5 history API (optional) + // transport - playground transport to use (default is HTTPTransport) + function playground(opts) { + var code = $(opts.codeEl); + var transport = opts['transport'] || new HTTPTransport(); + var running; + + // autoindent helpers. + function insertTabs(n) { + // find the selection start and end + var start = code[0].selectionStart; + var end = code[0].selectionEnd; + // split the textarea content into two, and insert n tabs + var v = code[0].value; + var u = v.substr(0, start); + for (var i=0; i 0) { + curpos--; + if (el.value[curpos] == "\t") { + tabs++; + } else if (tabs > 0 || el.value[curpos] == "\n") { + break; + } + } + setTimeout(function() { + insertTabs(tabs); + }, 1); + } + + function keyHandler(e) { + if (e.keyCode == 9 && !e.ctrlKey) { // tab (but not ctrl-tab) + insertTabs(1); + e.preventDefault(); + return false; + } + if (e.keyCode == 13) { // enter + if (e.shiftKey) { // +shift + run(); + e.preventDefault(); + return false; + } if (e.ctrlKey) { // +control + fmt(); + e.preventDefault(); + } else { + autoindent(e.target); + } + } + return true; + } + code.unbind('keydown').bind('keydown', keyHandler); + var outdiv = $(opts.outputEl).empty(); + var output = $('
    ').appendTo(outdiv);
    +  
    +    function body() {
    +      return $(opts.codeEl).val();
    +    }
    +    function setBody(text) {
    +      $(opts.codeEl).val(text);
    +    }
    +    function origin(href) {
    +      return (""+href).split("/").slice(0, 3).join("/");
    +    }
    +  
    +    var pushedEmpty = (window.location.pathname == "/");
    +    function inputChanged() {
    +      if (pushedEmpty) {
    +        return;
    +      }
    +      pushedEmpty = true;
    +      $(opts.shareURLEl).hide();
    +      window.history.pushState(null, "", "/");
    +    }
    +    function popState(e) {
    +      if (e === null) {
    +        return;
    +      }
    +      if (e && e.state && e.state.code) {
    +        setBody(e.state.code);
    +      }
    +    }
    +    var rewriteHistory = false;
    +    if (window.history && window.history.pushState && window.addEventListener && opts.enableHistory) {
    +      rewriteHistory = true;
    +      code[0].addEventListener('input', inputChanged);
    +      window.addEventListener('popstate', popState);
    +    }
    +
    +    function setError(error) {
    +      if (running) running.Kill();
    +      lineClear();
    +      lineHighlight(error);
    +      output.empty().addClass("error").text(error);
    +    }
    +    function loading() {
    +      lineClear();
    +      if (running) running.Kill();
    +      output.removeClass("error").text('Waiting for remote server...');
    +    }
    +    function run() {
    +      loading();
    +      running = transport.Run(body(), highlightOutput(PlaygroundOutput(output[0])));
    +    }
    +
    +    function fmt() {
    +      loading();
    +      var data = {"body": body()}; 
    +      if ($(opts.fmtImportEl).is(":checked")) {
    +        data["imports"] = "true";
    +      }
    +      $.ajax("/fmt", {
    +        data: data,
    +        type: "POST",
    +        dataType: "json",
    +        success: function(data) {
    +          if (data.Error) {
    +            setError(data.Error);
    +          } else {
    +            setBody(data.Body);
    +            setError("");
    +          }
    +        }
    +      });
    +    }
    +
    +    $(opts.runEl).click(run);
    +    $(opts.fmtEl).click(fmt);
    +
    +    if (opts.shareEl !== null && (opts.shareURLEl !== null || opts.shareRedirect !== null)) {
    +      var shareURL;
    +      if (opts.shareURLEl) {
    +        shareURL = $(opts.shareURLEl).hide();
    +      }
    +      var sharing = false;
    +      $(opts.shareEl).click(function() {
    +        if (sharing) return;
    +        sharing = true;
    +        var sharingData = body();
    +        $.ajax("/share", {
    +          processData: false,
    +          data: sharingData,
    +          type: "POST",
    +          complete: function(xhr) {
    +            sharing = false;
    +            if (xhr.status != 200) {
    +              alert("Server error; try again.");
    +              return;
    +            }
    +            if (opts.shareRedirect) {
    +              window.location = opts.shareRedirect + xhr.responseText;
    +            }
    +            if (shareURL) {
    +              var path = "/p/" + xhr.responseText;
    +              var url = origin(window.location) + path;
    +              shareURL.show().val(url).focus().select();
    +  
    +              if (rewriteHistory) {
    +                var historyData = {"code": sharingData};
    +                window.history.pushState(historyData, "", path);
    +                pushedEmpty = false;
    +              }
    +            }
    +          }
    +        });
    +      });
    +    }
    +  
    +    if (opts.toysEl !== null) {
    +      $(opts.toysEl).bind('change', function() {
    +        var toy = $(this).val();
    +        $.ajax("/doc/play/"+toy, {
    +          processData: false,
    +          type: "GET",
    +          complete: function(xhr) {
    +            if (xhr.status != 200) {
    +              alert("Server error; try again.");
    +              return;
    +            }
    +            setBody(xhr.responseText);
    +          }
    +        });
    +      });
    +    }
    +  }
    +
    +  window.playground = playground;
    +})();
    diff --git a/vendor/golang.org/x/tools/godoc/static/search.html b/vendor/golang.org/x/tools/godoc/static/search.html
    new file mode 100644
    index 0000000000..e0d13b9b5e
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/godoc/static/search.html
    @@ -0,0 +1,18 @@
    +
    +{{with .Alert}}
    +	

    + {{html .}} +

    +{{end}} +{{with .Alt}} +

    + Did you mean: + {{range .Alts}} + {{html .}} + {{end}} +

    +{{end}} diff --git a/vendor/golang.org/x/tools/godoc/static/search.txt b/vendor/golang.org/x/tools/godoc/static/search.txt new file mode 100644 index 0000000000..0ae0c080db --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/search.txt @@ -0,0 +1,54 @@ +QUERY + {{.Query}} + +{{with .Alert}}{{.}} +{{end}}{{/* .Alert */}}{{/* + +--------------------------------------- + +*/}}{{with .Alt}}DID YOU MEAN + +{{range .Alts}} {{.}} +{{end}} +{{end}}{{/* .Alt */}}{{/* + +--------------------------------------- + +*/}}{{with .Pak}}PACKAGE {{$.Query}} + +{{range .}} {{pkgLink .Pak.Path}} +{{end}} +{{end}}{{/* .Pak */}}{{/* + +--------------------------------------- + +*/}}{{range $key, $val := .Idents}}{{if $val}}{{$key.Name}} +{{range $val}} {{.Path}}.{{.Name}} +{{end}} +{{end}}{{end}}{{/* .Idents */}}{{/* + +--------------------------------------- + +*/}}{{with .Hit}}{{with .Decls}}PACKAGE-LEVEL DECLARATIONS + +{{range .}}package {{.Pak.Name}} +{{range $file := .Files}}{{range .Groups}}{{range .}} {{srcLink $file.File.Path}}:{{infoLine .}}{{end}} +{{end}}{{end}}{{/* .Files */}} +{{end}}{{end}}{{/* .Decls */}}{{/* + +--------------------------------------- + +*/}}{{with .Others}}LOCAL DECLARATIONS AND USES + +{{range .}}package {{.Pak.Name}} +{{range $file := .Files}}{{range .Groups}}{{range .}} {{srcLink $file.File.Path}}:{{infoLine .}} +{{end}}{{end}}{{end}}{{/* .Files */}} +{{end}}{{end}}{{/* .Others */}}{{end}}{{/* .Hit */}}{{/* + +--------------------------------------- + +*/}}{{if .Textual}}{{if .Complete}}{{.Found}} TEXTUAL OCCURRENCES{{else}}MORE THAN {{.Found}} TEXTUAL OCCURRENCES{{end}} + +{{range .Textual}}{{len .Lines}} {{srcLink .Filename}} +{{end}}{{if not .Complete}}... ... +{{end}}{{end}} diff --git a/vendor/golang.org/x/tools/godoc/static/searchcode.html b/vendor/golang.org/x/tools/godoc/static/searchcode.html new file mode 100644 index 0000000000..a032e642c6 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/searchcode.html @@ -0,0 +1,64 @@ + +{{$query_url := urlquery .Query}} +{{if not .Idents}} + {{with .Pak}} +

    Package {{html $.Query}}

    +

    + + {{range .}} + {{$pkg_html := pkgLink .Pak.Path | html}} + + {{end}} +
    {{$pkg_html}}
    +

    + {{end}} +{{end}} +{{with .Hit}} + {{with .Decls}} +

    Package-level declarations

    + {{range .}} + {{$pkg_html := pkgLink .Pak.Path | html}} +

    package {{html .Pak.Name}}

    + {{range .Files}} + {{$file := .File.Path}} + {{range .Groups}} + {{range .}} + {{$line := infoLine .}} + {{$file}}:{{$line}} + {{infoSnippet_html .}} + {{end}} + {{end}} + {{end}} + {{end}} + {{end}} + {{with .Others}} +

    Local declarations and uses

    + {{range .}} + {{$pkg_html := pkgLink .Pak.Path | html}} +

    package {{html .Pak.Name}}

    + {{range .Files}} + {{$file := .File.Path}} + {{$file}} + + {{range .Groups}} + + + + + + + {{end}} +
    {{index . 0 | infoKind_html}} + {{range .}} + {{$line := infoLine .}} + {{$line}} + {{end}} +
    + {{end}} + {{end}} + {{end}} +{{end}} diff --git a/vendor/golang.org/x/tools/godoc/static/searchdoc.html b/vendor/golang.org/x/tools/godoc/static/searchdoc.html new file mode 100644 index 0000000000..679c02cf3a --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/searchdoc.html @@ -0,0 +1,24 @@ + +{{range $key, $val := .Idents}} + {{if $val}} +

    {{$key.Name}}

    + {{range $val}} + {{$pkg_html := pkgLink .Path | html}} + {{if eq "Packages" $key.Name}} + {{html .Path}} + {{else}} + {{$doc_html := docLink .Path .Name| html}} + {{html .Package}}.{{.Name}} + {{end}} + {{if .Doc}} +

    {{comment_html .Doc}}

    + {{else}} +

    No documentation available

    + {{end}} + {{end}} + {{end}} +{{end}} diff --git a/vendor/golang.org/x/tools/godoc/static/searchtxt.html b/vendor/golang.org/x/tools/godoc/static/searchtxt.html new file mode 100644 index 0000000000..7e4a978c4d --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/searchtxt.html @@ -0,0 +1,42 @@ + +{{$query_url := urlquery .Query}} +{{with .Textual}} + {{if $.Complete}} +

    {{html $.Found}} textual occurrences

    + {{else}} +

    More than {{html $.Found}} textual occurrences

    +

    + Not all files or lines containing "{{html $.Query}}" are shown. +

    + {{end}} +

    + + {{range .}} + {{$file := .Filename}} + + + + + + + + {{end}} + {{if not $.Complete}} + + {{end}} +
    + {{$file}}: + {{len .Lines}} + {{range .Lines}} + {{html .}} + {{end}} + {{if not $.Complete}} + ... + {{end}} +
    ...
    +

    +{{end}} diff --git a/vendor/golang.org/x/tools/godoc/static/static.go b/vendor/golang.org/x/tools/godoc/static/static.go new file mode 100644 index 0000000000..985243d872 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/static.go @@ -0,0 +1,3549 @@ +// Code generated by "makestatic"; DO NOT EDIT + +package static + +var Files = map[string]string{ + "analysis/call3.png": "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x03N\x00\x00\x01\xea\b\x03\x00\x00\x00\x04l\xeeb\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x00\x01\x00\x04\x06\x03\x06\t\x05\x0e\x10\r\x16\x17\x15$\x18\x0f\x1e\x1d\x17!# #$\"$%#&(%)(\"()'-+\x1f*+),-+-/,41&J-\x1202/241S/\x0e564,7M796<:.:<9!?p=?\xb3Z2\xf5Sw\x99U\x89+\xdaI\xb3Y\x15`7N\xea\xd4U\xd5M\x1f\a\xaa\xe8A\xe9x5ۉ\xbb\xaa\xfbU\xa5N\xd3G։\xe2\x98\x1c\x16\x1d\xa0\x8d\xb4\x99U\x01v\xe3\xa4N\xa2t\x00\xeae\xfa\xd4\xcb'\"\xb5\xed\xaaR\xa7\xe9\"\xe3\xeb\xfc\xcd\x12\xd0i\fpT'\xca@w\x1dۅw\xc9'\"{\xeaU\xa5\x8e2\x98J$\x96J\xcf6d$el\xa0\xff\x9f\x98BȪ\xae\xdc\xe9I\xf3\x06\xf9\xca}I\x84L\xae\xd5\xeb&H\xd7\xc2TWڼ\xb07\x85\x9a\xb4*\xf6_w\xb2<7\x92\xcc\xd7\xe0\xe7ֿ(\xdd5m\xc1\tZZL\\UKg$=$\xd5\xec\xcdMM_\xba4uj\x1d\x9d\xae\x9d3u\xc6R\xedѴ\xf3\x89|\xf7\xe2\xa7\xf2\x874\xc5b\x13tr\x1egu\uab6a\xaa\xaaa\xfbáZ\xb6\xb7\x0e\xd4\xecR\x95:\xcb\xf1\xe6\xed\xa4\xac\xb9Y\xdai\v\\\xab\xeaW\xb9r\xe9\"\xd5\xd5N\x9b\x91\xf6\xb7H\x87\xf7\x88\xf1\x1fe\x9b\xfeA\xf8{\xcdѩb\xb2\xfa\xbb\x87\xc0f\x9c\xd4I?T\x99\xd2W}(r\x86\x1d\b㈧\xc5\xf8\x8f\xb2M\xee\u007f\f;٫\x9f\xb2N\xbf\x05\xb0\x05'u\xd2\x0fU\xa6\xd47vC'\xab\x84e\xadp0\x9b\xfe\xaf\xfb\xeft\xae\x9dV\xb9\xf0\x9d\x8dQ\xc4I\x9d\fB\x95\xc5S5\x03\xd0\xc9V\x98G\xff\xeb\xbf~\xffG?\xfcяn\f\xaa\xbe\x91ۯ\xc9\x15\x03\xb6\xe2\xa8N\xa2n\xa8r\u007fu\x97\x98@:\x19\xc42\x8b\x91\xf3\x95\xdf\xcdso\xf5z;6欼&\x8a\xd7ʽ\xee\xfc\xa7.\xd2\xe2\u007f\x16\xdc\xfb\xd6{s\x9e\xfa\x8djR\xbc\xe6\x11\x04A:٣\xa5\a6\x16y\x9ex\x9d=\xb9\xb6v\xb1\xf7_\xfee\xb1\xa7\x85\xda\xf4ÿ\xf9\x9f\u007f\xf9\x17\u007f\xf1\xd7\u007f9s\xe6\xd2߬^\xec\xf6>\xf5\xba<\xa3UIN}Wk\"\xe2\xacN\xba\xa1\xca\xf5\x8db\"\xe9d\x14\xcbl\x92\xafܑ-l,\x11\x16\xef\xcc\xdbG\xaf\x8b\x84\xf5\x1d-O\t\xe7D\xf1b\x8b[\xc8߹3\xdfs\x91\x9f\x14\xc5s\x9d\x9d\xf3w\xb2f\xacԻso\xf6j:=T\xe4\xdd\xf7\x83\xf9\x9e\x03O\xec\xa3:\xfd\x93\xfb?L\xce̜\x94\x949{\xd2_}}o\xc7Na\x9f<\x9fC\b8\x1aE\x9c\xd5I/T\xf9\f\xf3+\x81t\x12\rc\x99#\xe7+{\u05ca\x1d\xc2\x11\xf1\x99\xf5\xa2x\xbd\x85\x1e\xa2\x86\x960EĬBv\xb8\xca_\xae\x9e\xa4\xc8:\xd1\xd2\x1cz\xdcY\xeb\xa5S-\x025m\x1f{`\x83\xe4\xee\xfb\xd6\xf8\xfdg>\xf4\u07fb\xef?\xd2\x19\r\xb1.\x19\xddd|\xfdL\xd5\xf8\xc2a\x9dİP\xe5\xfe\xea37n\xdcx\xa96\x912w\x8cb\x99e\f\xf2\x95\xbd-\xe29ᚸu\xadȒ]\x9f(\xcc\x16\x96\xb0⬭\xecq\x1f\xfd\v?)r:=C\x1fvfч\xad9\xf4\xe1e\xaa\xa4\xac\xd3_L\x9a4I\\4i\xd2g\xfe7\x9fb֭\xc98\av\xe2\xa4N\xba\xa1\xca\x17\xaa\x02$ΐ\x93Q,\xb3\x82~\xbe\xb2\xb7C<\xe7\x16%\x9d\xcey\xf3\xb7\x1e\xe9,\x91u\x92\xac\xe9dg~ܤ\xc8\xe9\xc4\xfe\x97t\xda7\x97\x8a֡\x1c\x9d\xfeI\xf8?\u007f\xfd\x97T\xa7\xcf\xfd\xa7\xbf:şT\xb6!~o\x14qR'\xfdP\xe5^Ʃ\x9a^\xedOK\x8cc\x8cb\x99#\xc2tʒu*Z~\x9d\x16\x94\xcb:md\x8f\a\xa4\xa3ShR\xd4\xd3\xe95\xe1\x89\xd7.\x16-\x1f\x92t\xfa\xbe\xfb\xef\xbf\xff?\xa8NS\xfe\x9f\xfb\x1c?\x9b2\x97\xf5\x881\x10-\x8e\xea\xa4\x1b\xaa,\x91`\xd7N\xfa\xb1̑\xf3\x959\x9d\xf2\xcb\xe9\xf3\xa1Ge\x9d\xf2\xd8\x05S\xe1J\xf5\xa4\xa8\xa7\xd39!O\x10J\xd8\b\x9e*,\xde\xdbIm\x11\xbe\xder\xa0(\xe7e\x91\x9f\x1c\xea\xec\xec\x9c\xfflg\xe75\xf1\xb5N\xf7\xb3\x9dC\xbf|\xd6\xdd\xf9\x9axn~GG\xe7\xeb\xcc\x1d\xf9c\xdc\u007f\x90t\xea\xea\x98_t\xa0c\xa3 \xff&@\x05i7^\x060R\x9c\xd4\xc9 T\x99\x96\xb3K\xa7D9>\x19\xc42\x8b\x91\xf3\x95\x87聥%[\xf0\xb4\b\xc2jqh_Q\x96w\xed\x81\"\xf7Jv\x86\xf7L\xb6w\xedk\xacNh\xf2\x97\x82\xcc\x01\xf1;\xf4\xd1\xfd+\xf61\xd4w\xc4N7+s/\xbf(\xdfd\xf4\xf7\u007f\xf3\xdf$\x9d\x06_.\xf7f/\x97\xef\xf0kN\n\xfbM\x02`#\x8e\xea\x04\xac\x93\xb5SoR\x8f?x\x9e\xfdû\xef^\xfb\xe5\xea\x9ck\xf2-\xb0\u007f\xf7W\xb2N\xa1*\xdb]\x05\xdaϖ\x81\x9d@\xa78'z\x9d\x8e(?\xe89\xb4\xb8C\xd6\xe9G\xffE\xa3S_:n(\x1f]\xa0S\x9c\x13\xbdN\xe7\xd8\x109\xe5\xa2\xf0+\xe5\\0\xec\xe8\x04F\x19\xe8\x14\u05fc.\x8d4h'\xf5\x19z\xc6\xf3lKG˳\x9e\xf5C\xd0i\x8c\x80Nq\x8d4\xd2\xf0\x9avҀ\xa1#Ox\xdd\xde'\x8e\f\x05\xbe\x8d\xfb\xb7\xd0\xc9a\xa0S\"\x02\x9d\xc6\b蔈@\xa71\x02:%0u\xd0\xc9a\xa0S\xc22\xb8a!\xbb\x05v\xc5!\xf8\xe4\x18\xd0)a\x99\xa3|A㳻\xe0\x93S@\xa7De\x80}}\xf0C\xbf\xff\xde}\v\x13\xe5v\xc8\xf8\a:%*\x03\x84dfޗ\x969{\xd2\xc3\xd0\xc9)\xa0S\xa22\xb8\xe7s\x9f\x9dt\u007fJJJf;\xc2V\x9c\x02:%,3\xa6\x97U\x1f\xba\xd0\xd5\xf5\x12\xbe/\xe8\x18\x8e\xea\xa4\x1b\xaa?\xe9\xfe\xaf\xbd\xcdM<\xff\xe5\xcfMz\xf0\xbb\xd0\xc9\x00\xe8\x94\xc0\xf4\x9e\xd0~\x80\x1c\xae\xd3\xfd\x8aM\x9f\xfbޫ\xcfS\xb5\x1e|\xee\xd5_\u007f\xe5+\x01\x9d\xfe\xf5\xc1\u007f\xa5\a\xb0\xafq\x13\x0f~\xf3\u05ef\xfe\xec\xcb\xd0\xc9\x00\xe84\xa1\xe0u\x92O\xf6\x94S\xba/|\xf7\xed \xbf\xbe?\xa0\xd3\x17\u007f\xa6\x18\x17\x9c\xf8\xec\xcf\xe5:\xd0I\x17\xe84\xa1\xe0ubC\x11\xf7\u007fK\xd1iү\xe5\xff\u007fNO\xe6&M\n\xe8t\x9f|C\x117\xf1\xd5\xfb\xbe\xf2\xad\x9fC'#\xa0ӄ\x82\xd7I\xe2\xb9\xcf\xcb\xffߧ\xe8\xf4ů\xfe\xfc\xedW\x83:MR\x8eE\xa1\x89\xb7\u007f\xf6\xb5/\xdf\xf7M\xe8d\x00t\x9aP\x84\xe9\xf4\xe5\xaf)\x1a)'{\x9f}\x95^(\x05u\xfa\xc27\x95j\xc1\t\xc6\xf3\xf7A'\x03\xa0ӄ\x82\xd7\xe9K?{\xf5\xf9\xaf|\xe1UY\x91\xe7\xeeW\x86\"\xbe\xf9\xea\xcf>\x1f\xd4\xe9\xb9\xfb\xbe\xf5\xebW\x9f\xfb\x127\xf1\xa5\xef\xbd\xfa\xea7\x1f\x84N\x06@\xa7\t\x05\x13I\xb9\nz\xfb\xbb\x9f\xff\xcc\xfd_}5p\xc8\xf9\xee祁\xf2\x9f=8\xe9\xfeo\x06uz\xfb\xb9/~v\xd2\x17\x9f\xe3&\xbe\xf7\xc5I\xf7}\xf9y\xe8d\x00t\x9aPp\xa7y#\x03:\xe9\x02\x9d&\x14\xd0it\x81N\x13\n\xe84\xba@\xa7\t\x05t\x1a]\xa0ӄ\x02:\x8d.\xd0iB\xa1\x1f\xa3\x12\vfs\x9a\x988\xaa\x93n\xa82\xe5\xcc\xfe\x9a\xba\xf6\b\xed\x80Bİf\xdb9A\xf6\x9bU\x01j\x9c\xd4I?TY\x1cl\xacj\xbb\xd0^\xa5\x97\xb3\r\xd4D\fk\xb6\x1d\xc42[\xc6I\x9d\xf4C\x95\xc5\xc6\xean\xa6\x9a\xf6;v \x12\xbaa\xcd6\x83\x1cY\xcb8\xa9\x93~\xa8rw\x95\xf4\xad\xdcQ\xde5\x12\r\xdd\f\n\x9b\x81N\x96qT'Q/T\xb9\xad:\x91~\x8af\x141\vk\xbe\xe8\x16\x84\xad\xbfY[8\xff\x89w\xb9RӰf\xcao\xca\x17\xbb\xbdO\xbd.j@,\xb3e\x9c\xd5I/TyO\xfd\x99]U\xb5\x87\x12*\x04vt0\tk\xbe\xdeҒ_\x94\xedݸv.\x9fBa\x1a\xd6,\x8a\x1d\x9e\xaf\xef\xed\xd8)\xecS\x15\x1a\xc52\x83H8\xab\x93^\xa8r\x9d\x14\xaa\\[\x87cT\x14D\x0e\x1c\x13\x1f\x15J\xae\x89C\xea\xf8>Ӱ\xe6\xeb\xf9O\xb0\x9c\xb2\x16u3\xa3Xf\x10\t\x87u\x12\xc3C\x95\xeb\xa5\xf1\x88\xfe\xc4\nU\x1e-\xcct\xca\n\x8bG2\x0fk\xee\x10~\xa5m$\x1a\xc72\x83H8\xa9\x93~\xa8r\x93<\xf6۴Ǩ\x19\ba\xa6\xd3\xd7\xc3\xcbLÚ\xf7\t\xd7\xc3[I-q\xedd\x15'u\xd2\x0fUn\xaf\x91>\x8clęE\x14\x98\xe9T\xaeShF\x87:+=\x04F\xf6,\xe3\xa8N\xba\xa1\xca}\xd2@y\u007f5n\x8b\x88\x82\xd1\xd0\xe9\x9aw\xe5\x10\xfdo\xe3F\xed\x1f\xa0\x93e\x9c\xd4I?TYl\xafn\xef>U\xbb\vC\x11&\x98\x855\xbf\xfb\x8b\u03a2\x95\x9d\x9d\x16\xc3e)\x1d\xf3\x8b\x0etl\x14\x0eh\xcbuc\x99A$\x9c\xd4\xc9 TY\xec\xdaS\xb3\xab\x1d6\x99a\x16\xd6|Q\x90xʠy\x04^.\xf7f/?\x12V\xac\x1b\xcb\f\"\xe1\xa8N`|\xa1\x17\xcb\f\"\x01\x9d@\x04\xc2c\x99A$\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\t\x00ۀN\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80m@'\x00l\xc3Q\x9d\xf4B\x95\ak\xabdjM\x1a\x83\xf8\x80\vv\x06Z\x9c\xd4I7Ty\xa0\xaa\xbd\x9b\xd2^u¬9\x183\x9a\xb8\xafJs\xc1\xce@\x8b\x93:\xe9\x87*\x9fbv\r\xd4⋟q\xcc\xecEf5\x80\x84\x93:\xe9\x87*K\xd4\xe3\xbb\xed\xf1L\x06t\x8a\x0eGu\x12\xf5B\x95\x19R\x12\v\x18+\xba\x16\xa6\xba\xd2\xe6I_\x14ܐ\x91\x94\xb1\x81\xfe_L\\UKg$=\xc4\xde\xfa\x94p\xbe\f\x91\x0fv\xe6*\x14\xb3\xa2\v.2S\xea\xacv\xce\xd4\x19K'j@\x9f\xb3:\xe9\x85*3\xa4$K0F4Mͨh,#\x15t\xb2\xc0\xb5\xaa~\x95+\x97\xbe\xc1\xd5N!\xa9e\x15\xc9\vE\xb1\xffP\xf3\x8c\xcc\xe6\xe6f)\x99\"\x18\xec\xccU薊\xda\n\\\xac\xbc`rq\xfd\xbaԌ\t\x1a1\xe1\xacNz\xa1ʔ\vU\xf8\n\xf5\xd810m\xde\x00\xcbk\xa3W\xb3\xfb\xa5\x1fH\x93\x1f])\xf4E\xc9M\x95\xaa\xa8N\xf6\x02\xe1d\\\x05ɰ2\xa6S=\xa9\x11Y\xa4\xd8vqB\xe2\xb0Nbx\xa82\xa5\xb1.r\x130\x9aԓ@\xa4\x94X0K\xfaof\x01}p\xb1\aI\x11#\x9dB\x15B:-\x9a>\xc8H/\x10'$N\xea\xa4\x1f\xaaL\xa9Ad\xe5\x18\xb2\x8e\x04\u007f\xbdd\xce\x02\xe9\xbfy\xb3E^\x11#\x9dB\x15B\x93\x19ʅ\xd6\x04\r@rR'\xfdPe\x96\x03\xab\x8a\xa0\a\xce\xd2\xc8\x1d\x9d\xa6K\xffM\x97\x8eNZ\x9d\xaa_\x92+\x19鴊M\xe6No\x97\x98\xa0CK\x8e\xea\xa4\x1b\xaa\xcc.\x9dF\xf77^AD\xfa\xd33ٛ[\xf1Rv\xdeǮy\xb6K\x81ͼN\x99\x99\xf4\xb2\x97(\xa7\xe4::%\xad\x10\xc5\x1b\xb3\xd9\xe4~\xb9\xd6\xe3k\xc4\t\x89\x93:\x19\x84*S\xb7\xf0[icI\xd3\x0337\xd4\x17\x13vҐ;yE\xfd\x8aɹ\xd2h]A\x9b\xd8^\xe0\x92~\x93\xad\xccU\xb1'sj7\x1f쬪0'u͚9dJ\xcd\x19Q\\A\x16\xd5\xed) \x13\xf4\x961'u2\nU\xbe\x80\xbbVƖ\xaeE\xe9ɳ\xe5\x17aݬ\xa4Y\xf2\xe7N\x84\xb8NM\xa5\x8f\xc5\xf4\xd9@qJR&\x8bD\x0f\x05;\xab*te&%?\xf4\xb8\\w\u007ffjʜ\xfdF\xb3Jp\x1c\xd5\t\x80\xc4\x06:\x01`\x1b\xd0\t\x00ۀN\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\t\x00ۀN\x00\xd8\x06t\x1a7,\"\xa9\xb9g\xcc*\x811\x05:\x8d\x1b\xba\x9bjf\xa6NԈ\xa0q\x82\xa3:\xe9\x85*\xb3\xa4\x9c]ջ\x0ea?\x89\x82&\x82\xacܸ\xc6I\x9dtC\x95ž\xda]R)\xbe\x91kN\x1bi3\xab\x02\xc6\x12'u\xd2\x0fUn\xaec_\xad\x1e\xack6i\r\xa0S\xdc\xe3\xa4N\xfa\xa1ʍr8\xd8\x1e$W\x9a\x03\x9d\xe2\x1cGu\x12\xf5B\x95\xfbj\x9b\xfa\x06\xfb\x9aq\xb2\x17\x05'H\x93Y\x150\x968\xab\x93n\xa8\xf2@#-ݏ\xf4\x95(\x18L\x9d}\xa8{\x82\xe6\x15\x8f\v\x9c\xd5I/Ty\xb0\xb1\x8e\xe5\x1b5\xe2'4\xa2`?!d\x81Y%0f8\xac\x93\x18\x1e\xaa\xdc\\7 \x95\xe2\a\x9e\xcc\xe9O\x9d\xbe\xae\t\x19\x9f\xf1\x8b\x93:\xe9\x87*W\xcb\xf9`R6,\x88L\x1b\xc1\x80M\\\xe3\xa4N\xfa\xa1\xca\xd0)z0\xb2\x17\xe78\xaa\x93n\xa8r\x93t\xb27P\x871+s\xa0S\x9c\xe3\xa4N\xfa\xa1\xca\x03\xdb\xebNu\x9f\xaaێ\xa1=s\xa0S\x9c\xe3\xa4N\x06\xa1ʃm\xbbjv\xb5a`ό\xc1\xee\xf6E.\xfc\xae\\\\\xe3\xa8N`$,$d\xda\x1e\xb3J`L\x81N\xe3\x86\xee\xe384\xc5;\xd0\t\x00ۀN\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\t\x00ۀN@\xcd\xe0\xc0\xc0\xc0`\xf0?`\t\xe8\x04T\x1c\x9aL\bI\xea\xefO\xa2\xffMFX\x9bE\xa0\x13\x90\xd83\xa7W\xfa\xbf\x8eԷ\xb5\x9d\x12\xc5Smm\xf5\xa4Τ\xd1X\xd37'\xce\xee\tvT'\xfdPen\x12\x18\xf3\x1dAh1\xab\x13\x99\rd\xf2v\xa3\xbfU\x902y\xa2\x8e\x04o\xb4\xed\x96u*&\x93G[\xab\x98\u05edb\xf2\x1a\xb3*\x8e\xe2\xa4N\xfa\xa1\xca\xfc$0\xe6\xf5N\xf7N\xb3:\x91\xe9k\x9e]f\xf0\xa7u\x93k\x94\xa9p\x9d\xba\x9b]\xfa͚l{\xcd\f\u05ed\xe3\x9cnq\x88\xfa)\xebLj8\x8a\x93:\xe9\x87*s\x93 \"Y#\xd4I\x14\x17\x18\xe8t\xc1\xb5\"0\x19\xae\x93(\x1a\xe84{\x91nqL\x18\xac\xdb\xf2r\xddb\x8eUq\xf5\x8dJ'u\xd2\x0fU\xe6&ADFO\xa7\x82\xf4\xe0\x9b\x99\x05\x9d2F_\xa7GMu\xeaO/0\xab\xe2 \x8e\xea$\xea\x85*s\x93 \"Y\x1b\x9f\xf1\xe6<\xf5\x1bUYw2\x91I\xe6ޤ\a\xd3\\\x8f\xa7\xa77\x15\xa7d\xb2\x84\xd0E\xe9\xaei\v\xe4\x1f\xb2\xa1:\x15Ӻ\x0f\xb0Q\x87\xda9Sg,\x95-\x1aL\x0e\x1e\x9c\xf4u*~8=eA\x17}룍\x1f\x17\xcb\xe8c]\xbd2\xdf\f\xa9\x06\xd7Y8\xef湷z\xbd\x1d\x1bsV^\x13\xc5k\xe5^w\xfeS\x17i\xf1E\xb7 <5\xe4\x15\x84\x9c\xebܺ\x1d\x11\x04a\xab\xb8\x93>\xb6\xb0I\xc6\xd7Y'C?]\xee)\xdax\x9dMv>\x91\xef^\xfcT\xfe\x90\xdc\xfb\xaa\xa48J\x19qV'\xbdPe>_\x19D\"K\xf8zK\xcb\x12\xcfE\xbel\xb0f\x9dL\r\xff!QS2Y\x9aIRפU0\x05\x1en\xaa[0Y\xcal\xa1:u\xe7N^Ǧ\v&\x17\u05efK͐\x12\x9a۹\xe8s]\x9dH\xc6\xf6\xed\x19I\xa7\xc4\xfeCӊ{\xc5\u07b2\xe4\xe6\xfe\xfeC\xcd32\x9b\x9b\x9b\xa51$\xbe3\x1d:\xb2\x85\x8d%\xc2\xe2\x9dy\xfb\x98.\xeb;Z\x9e\x12\xe85\xd1\xd0/v\n\xbf\x10\u007f:\xf7\xa7\xbf\x12\xb9u\xbbޙ\xff\xec\x1f\xc4?\xfc \xbb\xf3ڵ\xce\u03a2\x95\x9d\x9d\x9d/\xb3>\x9e\x116v\xec\xf3>J\x1d\xfa\xe5\xdcgZ:\x0e,\x16ޕ;?\x14Oq4\xce\xea\xa4\x17\xaa\xccM\x82\x88d\x15\xd17\xe7\xebE\xcbU\x85\xbd\x17dzU\xa5\xe9\xb9T\xa3z\xb1\xe0a\x16\xb9\xc6\u07bff-d\xc5T\xa7\n\x97t\x1aPO\xd8\xd8C\x1b\xd9.?\t%\xcb\xea\xea4\x93\x1e\x00\x06f̡\x93e\xechT \x9f_\x05O\xf6T\x9d\xe9\xe1]+v\bG\xc4g\xd6\xd3\xe5o\xa1\x87\xa8\xa1%\xabY\xf1\xd03˯y\xe5\xb3\xa9^4}\x90!_x\xec1\xd3\xe9q\xf6\xb8\x81\xf4\xb1\xb2S\xe2@\xb2\x9cE\x1b\xd4Iՙ\x1e\xde\x16j\xc25q\xebZ:}\xed\xc0\x13\x85\xd9\xc2\x12\xa9\xfc\xfa\xa3yO\xc9Vp\xeb\xf6\xfa\xdc_\x89׳;\xa4\xe2\xa0Nk\v\x87ޥx\xa9e\xafy\v7\x1e\xf8Րb\x13]\"C\x8b\x9d\xc7I\x9d\xf4C\x95Փ\xc0\x18\xf9r\xbdSP\r\x1e7\xd7˨o`H\xdf/\xb6\xb9DI\xa7\xb6\xb4i+v5g\xca:\xa5%ϔ\x0eSb\x86\"\xa1\xf4\x8c\x8f\xef3\x1e\x8ah&l\xb4h\xdeRq\u007f\x8a|b\x19\xd4Iՙ\x1e\xde\x0e\xf1\x9c[\x94t:\xe7\xcd\xdfz\xa4\xb3D\xd6Il\x11:\xe5\t~ݞ\xf8\x17\xb1C9\xf6\x04uZ\xa2\\G=%2!ˋ\x84\xbc\xbd\x8aOm$\x8e\xf6\x1c'u\xd2\x0fU\xe6'A$\xb26\xb2G\xf5\xd1\xc9\x00N\xa7\x99s\xd8\xdb\xd8BY\xa7\xd4S\x17\x92+\xd8T\xee\xf4v\t\xe9\x1c\xb1\x9f\x1b\xba\xd3\xd5i){\xac&쬱>uP9דu\xaa~Iә\x1eL\xa7,Y\xa7\xa2\xe5l8\xa1\\\xd6\xe9u\xef\xd6|\xf9\x12\x88_\xb7#9Cʹ\x9e\xacӁ\xd7\xd8\xd1\xe9\x9c\x04\xfd\xfb\xb9\xadT\xa4k-\xf3\x0f\xc8U\xca\\q\xf4\x11\x8b\xa3:\xe9\x86*s\x93 \"Y^\xba'\x0e\x15\xad4\xab'\xaat\x9aƎ\x1972\x94\x93=Q\xdc\xefb\x87\xa2\xfd\xb2*\x8f\xcb7\x15,\x9a\x1e\x1cE\xd0\xd5)\x9d\x1a983\x93M\x0f\xa6֧(\xafU&-\xe8euԝ](;.j\xe0t\xcag\x82\f=*\xe94\xb4\xfc\a\xe2\xb3%\xd2Q\x86_\xb7\xa1\xc5Gr\xe4s=q%-\xf8\x03\xbb`\xea\x90o\x9b\xd8J\x0fb;\x05\xe9\x8f+\x9f\x95jܘ9O;\xb71\xc4I\x9d\xf4C\x95\xb9I\x10\x91,\xe1\x89_t,\xcfy٬\x1e}\x8bJ\xa9\xe8\xdf\xee:џ\x9b\xd9-\x96\x91E\x1b\xd6d\x90Ԋ\xb6\xfe\xe6\xd9\x05m\x83\xfd\xf3қ\xe8\x1b\xd8\n\xb2\xa8nO\x01\xa9\x95\xeawM\xae\b4\xd5\x1fٛ\xd7\xd64'E\xbe\xc0Z1]9ףDž\x8a=\x99SYuUg\v\xc8T\xcd/I^\xcc\xd9w\xbd\xc5}\xf1\xfaڒש\f\xe5\av>*,\xde\xdby\xbd\xf3;\xde\xd7\xc5\xdfdo켮Y\xb7\xad\x859ʰ\xddά}GJ<\xaf\xb1\xb2\xb9k[\x8e<ä\xda)x~p\x84N\xca\xc6U\x90x\xfa\xc0\xd2I\x9d\fB\x95\xb9I\x10\x89\xa2\x9d\xe5\xd9\u07b5\xaf\x99U\xa3\xef\xd8i\x84\xd4&\x93\xa9u\xecr\xe6F\xc5\fWꢚ\xe9\xae\xcc\r\xec&\xf1\xf6Z\xfa\xb8\x8aVڟ\x99\x9a2g\xbf\xd2b\xd5\x03\x81\v\x90:\xd2\x15\xf8\x82FW@\xa7\x99e\x8b\x92\xd3s\x15ͺ\xc8\xc3JՁ┤L\xf9\xaa\x8b\xef\xacz\xaaf\xe8z(O\x10Z\xb2\x05O\x8b \xac\x16\x87\xf6\x15ey\xd7\x1e(r\xaf젗B\x1bō\x820\xb7C\xb3n/\v땦\xd77\xe6\xcc_)_+v\x94,\xceY\xce\x14\xfa\xe9\xf2\x9d\xf9n\xefJ٦椥b\x1c\xe1\xa8N nY\xeaRԑ>\x9eU\xbe\xa0A\xf4>Z\xefw\x99\x9d\x97\xef!#\xbc\x9a\xb9\x96\xd5aVEa\xbb\xab \xae\xbe\x94\x05\x9d\x80DE\xba<\x900x\xa2-\xf0\x05\x8d\xb6\x13z\xbbj]\xaa\xc9\x0e\\\x93\xf2\xb082Z\x16\xbfkVE\xa6/=\xben(\x87N\xc0\neMb\xa6\xd1]\xe9\nݩKGt\x1d\xbc\xb3c\xa8\xe4\af\x95\xe2\x15\xe8\x04\xa2g\x80d\x14\xa7k\xc6\x19l\xe6\xba\xf0\xf5\u007f\xf6F\xf1Q@|\x02\x9d\x80\x05ʦf\x8e\xf6\x17=\u007f\xe0)y٬N\xdc\x02\x9d\x00\xb0\r\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\t\x00ۀN\x00\xd8\x06t\x02\x8e\x131\xb0y\\\xa79C'\xe04Jn\xb3\xfe\x1f\xc7w\x9a3t\x02#!\x90\xc5l\x85@n\xb3>\\\x9as\xdce&\x9b\xe2\xb4N\xa7\xaa\x94\xbb\x94\xbb\xf7\xd4\xec\xef\x0e\x9b\x04\xd1\x10s\x06\xb1\xedHY\xccV\x17\x87\xfbJ\x15G\x87\xf7H`2\xf8E\xabx\xcbL6\xc5a\x9d\xfa\xaa\x0f\xc9\xdf1\xeb\xaen\xeej\xae\xee\xd6L\x82\xa8\x88=\x83\xd8f\xe4,f\xabq\xcf\xfa:\x1d\xf1\x04\x9d\f\xea\x14o\x99ɦ8\xacS}c\xb7\xa4\xd3\r)i\xe5P\xed\r\xd5$\x88\x96\x983\x88m%\x98\xc5l-\x9fV_'q(8\x15\xd2)\xce2\x93MqV\xa7S5\x03\xb2Ng\xaa\xd9M\xfc\x03\xd5gT\x93 Zb\xce \xb6\x95`\x16\xb3-:\x85\xe0t\x8a\xaf\xccdS\x1cթ\xbf\xbaK\x94uj\x94\xbf\b]ߤ\x9a\x04\x11\xf8g\xc1}`c\x91\xe7\x89\xd7ٓ\xd83\x88et\xb3\x98\x19]\vS]i\xf3\xa4\xc2\r\x19I\x19\x1bD\xf6\x834Sօ\x87*\x8b|\x16\xb3^ܳ\n\xd52p:դ\xc9)q\xd7<\x02w\x01\xc6\xe9\x14_\x99ɦ8\xaaS}\xa3\xa8\xe8\xb4K\x8e&8\xb4G5\t\"p\xb1\xc5-xw\xee͖\xf2Sc\xcf \x96\xd1\xcfb\x16Ŧ\xa9\x19\x15\x8de\xa4\x82N\x16\xb8Vկr\xe5\xd2Ӈ\xda)dښ\xb2i\xeaPe\x91\xcfb\u058b{\xe6Q/\x03\xa7\xd3B\xa2\xe4\x10\x9d\xeb\xec\x9c\x1f<\xc4\xf1:\xc5Uf\xb2)\x9fy\x1c\x00`\x13#8:\x01\x00\xd4@'\x00l\x03:\x01`\x1b\xd0\t\x00ۀN\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\t\x00ۀN\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\t\x00ۀN\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\t\x00ۀN\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80m\x98\xeb4\xb0f\xf6TW\xfa\xc2C\xe1\u007f\xd9@\x1eV\x1eF\xc0\xbd\x8ai\xae\xf4\xc6\xe0Ӂ{\xf4\xa1\x96,\nU\xa8#\v\xc3\x1a\xf1\xac#\xc5\x11\xffn\x82a\xf7\x9a\x053AZn\xb3E5\xc1\x96\xed\t\xc6\x12S\x9dj\\ʏ\x12\xcf\xfbP\xfb'[^\xfe\n\xd6w{\xe0ن$6\x97\xb8\xd0I\xbd`&\xc8\xcbm\xb6\xa8&ز=\xc1Xb\xa6\xd3RB\x16\x9e\x10?\xe9]\xe5\"\x99\xf74\u007f\xb3\xe5\xe5\x9fE\x96~r/\xd0\xf3=B\xc2t\xea\xdeЬ\xd7.\xc8\bu2\xec^\xb5`&(\xcbm\xb6\xa8&ز=\xc1Xb\xa2S\x13!\xdb\xe5\xa9\xe3\x84\xd4h\xfeh\xcb˟N\xbaBO\xf4t2c\x84:\x19\xa2Z0\x13\x94\xe5\x1e!\xb6lO0\x96D\xd6\xe9^Zh_-&\xd35\u007f\xb5\xe5\xe5O#ݡ'\xf1\xa4\x93j\xc1L\x80N@\"\xb2Nm\x84\f\x04\xa6\xfb6tIE\x8b\xd2]I3W\x89~\xf5\xcb?\xb0t\xba+e\xe1q\xb9*\xff\xa4\xbfx\x9a+yN\x8dꬩ\x97\x96\xa5,d\xd7%s\xa4˲\x80\x0f+\xa4g\xddL'qi\xbakzY\xe8\x82D\xaf\x9bS\vR\xa7λ\xc0t\xaa%\xb3\xe4\xa2\n\xe9ɺ\x0fX\xebU\x1fHE\xdc\x02ג\r\x83\xc5i\x0fd4\xd2\xc9Y\xae\xb4\x9b\xacD(\x00\x00\x1e\xe5IDAT\xa5\xdc\xf5N\xff\n\xb6\xc8g\x82}\a\x16,\xb0wK\xd2jz\x0e\xb6\t,\xb7\xd2Wh\xf5\xb4-\x14\xf8\x99\xe9o\xcfYd\x85\x1f\x8c?\"봊\xccД\x14\x13\x92\x9e\x91F\x1f>P\xbd\xfcǧ\x12\u05ec鄬\xf1k\x9e\xf4&\x93\x94\xd93\by\x88\xeb\xa3\xdeE\xa6\xb2>\xe8\x1e\xb3&\xd7E\xe6\xe5\xd6)\u007fس\x88^\xa9\xe5\x0e0;\xd2HZ\n!\xb3\xee)\xfb\xbb^7U\x84\xa4\xcdrMɤ;\xfa\a.\xd2+\x95\xcd gh\xeb\xa5\xe9$\x99\xb6\x9e\xf9\x89f\x81kIq*Is\x11\xd2XL\x1e\xa0e\x99\xfe\x80N\x87\x92\xc8\xd4ٴ$x\xed\x13X0\x8dN|ϡ6\x81\xe5\x96\xfb\xe2VO\xd3B\x81\x9f\x99\xc1\xf6\x84N\xe3\x93\xc8:- \x05\xea\x826\x92\xc4\x0e:\xa7\xa6\x92\r\xfc\xcb?\x90LV\xd0\xfd\xe5T\ni\xd4Le\x95\x9a\xe5\v\xbbǙU\xb4u_\xb0\xb5j\x81\x95~{\t\xa9`e\xb3\xd9>.u_F\xe6I\xb52I\xe0@i\xa4S\xa8g\xbe\r\xaf\x93j\xf5T-\x14\xf8\x86\x06\xdb\x13\x8cS\"\xeb\xf4\x10Y\xaa)Q\x86\x8e+\xd8a+\xf4\xf2O#MR\xf1'\x93I\xbf\xfa\xc9Cd\xce\x19\xf5h\xf3\xbd$e\xc8\xec\xdeTzff\xa0\x93|)T͆$\xa4}4\xbc\x1b\u007f2;\xb6\xf8\x95=\xf1^\n\xeb\xf4^\x1a\xdbyk\xc9\xccPk\xd5\x02\xd7\xca箟\x10y\x9e\xb9\xa4Z\xe9~\xa6\xb2ȃ\x83\xa1\xfeuu\xe2z\xe6\xdbp:\xa9WO\xbd,2\xaa\x99\xe9oO0N\x89\xac\xd3\xc3$W[t\xef̮\xb2Eӈ\xea\xe5\xff\x90^\xe5̑p\x91v\xd5\x13\xff\x19z\xa5\x92\x9c\xbb\x87\xbb\x12\x1f D\xb9\x8e\x98\xc3\xce\xe5\xf4u\x92\x8fo{\xd8\xff\xd2\xfe\x1e\xde\xcd\a\x81n\xf6Ho\xfcKٱ\xaa\x9d\xcc\xe6Z+\x03\x03\xdc\x02\xd7\xca\xc7\x05:\x17v\xe5\xef/ UJ\xad\xc0\xa5\x17\x8f\xaeN\\\xcf|\x1bN'\xf5\xeai\x96EB=3\xbd\xed\t\xc6+\x91u\xaa\xe0\x87\"\x8e\xb3=\xa6:\x8d\rbe\xccQ\xbd\xfc\"\tѨzBϬ\n\x92\xe8Ĕ\xe2\xe0\xa5x7\x99\xa2L-`\x9fdE\x1a(\x0f\xe9\x14\xdeM?!\xf2D\xb3\xa4S\x17I\xbbG\xed\xaf\xe5Z\xcb\r\xf9\x05V\xfe\x12\xa6\x13=\\q\x87%\x05]\x9dB=\xab\xdap:\xa9WO\xbd,\x12\xea\x99\xe9nO0^\x89\xacS7\xf7\xd2\xf7\x93\xc9]\xecΛ\xe2\xfa\v\x1fjNN>T\xae\x10$TO\x18\xf7N\xad\x99EB;I\u007f4G\xa70\x9dº\xf9 \xf0Q\xcf~\xf9\xb2d\x069q/i\xca\a~\x8dN\xaa\x056\xd2ɯ]d\x86Z\xa75Z\x9dTm8\x9d\xfa5G\xa70\x9dT\r\xf5\xb7'\x18\xaf\x98\xdc\x151-t\xf1\xb4\x82^Z\xd3\xeb\x01\xf9Z}\xa9\xfa\xe5Oe\xc7!Ʃ\xfe{\xea'\x03\xf2\xa7+\xb5dJ\xf0F\xa2\a\xa2\xb8v\xd2\xea\x14ލ?E\xe9f\x8d\xacS\x05Y\xd1.\xef\xb3\xfc.\xac^`C\x9df(#\xe4M\x0fU\a\xbaW\x16\xacJ\xe9\xec\xe10\x9d\xf86\xfc\xb5\x93j\xf5\xf4t\xe2\x1a\x1amO0N1\xd1i\x17!\xf5\xf2\xd4!B6\xb0\xb3:\xe9\xbc\xff\xc3tvQ\x15z\xf9\x8b\xc9li7o#\xae\x0fTODe\xcf\xed#\x93\x83\x1e\x04\x86\xbev\x91\xe4O\xa2\xd4I\xaf\x9bb\xb9\x9b{\xd3e\x9d\x06ȴ\x15\xf25>\xbf\v\xab\x17\xd8P\xa7\x15\xca\u07be@\x1e\xf2\x93\x90\x17\xac^>\xdd\xfd0-L'\xbe\x8d\xdeȞ\xb4zz:q\r\x8d\xb6'\x18\xa7\x98\xdd\x02\xbb\x90^$\x9f\xf9\xf0^\xef\xe3\x84̹翗,\x8dNߘG؎\x1ez\xf9\xfb\\\xa4\x98\xeeO])\xec`\xa6z\xf2\x10y\x88\xee\xba\x1f.R\x06\x87\x19\x17\xa6\x90\n*ES\x12\x1bX\xd3\xdc\xcb\xe3\"\x8d\x9f\xdc\xd39:\xe9t\xd3\xef\"\x1b\xee\xf9?\xcc\r\xdcT\x91I\x92\x92\xa5\xd3,\xd5\xd1I\xb5\xc0\x86:\xf5'\xb1E\xba\xb7\x8eL\x15\x83\xfd\xcb\vF\xcf\xdd\xe8_\xfa3I\x98N\xaa6\xf2rK\xe5\xaa\xd5\xd3Ӊkh\xb4=\xf1\xb9\xd38\xc5L\xa7O\n\x02\xc3\n\v\xa4\x91\bB\xa6-\x98=9\xa5\x8c\res/\u007f\x93\x8b<0{:\x91\xef:\xe7\x9f\f\xa4\x10\xd7\xccYI$\xad?\xd4g\xfd\x14\x92<;\x9d\xc8\xe7\x91j\x9df\x13\xf6\xa5\b\x9d\x93=\x9dn\x1a]$mv\x12Y\xa8\xe8\xb4'\xe0\x95j\x17V-\xb0\xa1N\xecs֔\xd9t\x1e\xdc\x1d\xe1ʂ\x15\x13\x92\x9cN\x92*\xc2tR\xb5\x91\x97[.\xe7WOO'\xbe\xa1\xd1\xf6\xc4]\x11\xe3\x133\x9d\xfc\xfe3\xc53\x1ep\xa5/R>?m\xcbLu\xcd,\xfb\xe0C\x17\x19T\x9d\x9c\xf4/\x9d\xeeJ\x9a]-\x9f\x8a\xf1O\x06\x96\xcep=@[\xf0]v?\x9c\xeeJ\x97oj\xd3\xe8ԗ\xf9@\xf2~\xbd\xa1\b\xddnrӒ\xe6\xb45*\x16\xd1E\n\\`\xf1\xbb0\xbf\xc0\xc6:\xf9\xfb\x8aӧ\xa4\xe6\xf2\x8b\xa2,ؽ\xdaY\xae\x94ܾ\x13\xe1:\xf1m\xe4\xe5Vʹ\xd5\xd3Չoh\xb0=\xa1\xd3\xf8\xc4\\\xa7\xf1\xc2\x00\xbb\xc1\b\x80\xb1$qt\xaa\xe0\x86\x11\x00\x18\x13\x12D\xa7\xbe\xc1\xc6\a\\\xa1a\x04\x00Ƅ\x04\xd1)\x97\x10\x1c\x9c\xc0\x98\x93 :U'\xa5\xc1&0\xe6$\x88N\x00\xc4\x03\xd0\t\x00ۀN\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80m@'\x00l\x03:\x01`\x1bv\xebt\xb6\xe4\xb6Y\x95h\xb8Sr֬\n\x00q\x87\xa9N\x1fm\xc9\xf3\x94\xfb\xccj\x058(4D]7\x12\xbe\x83\xc2A\xb3:V\xb8\xec=oVń\x91\xf7\x10-\x97\xe6\n2^k\x9br3m\xe2yOS\xd8 \xb8\xd9\x1bӋ\x1e\xa1A\xaf\r\xb0\x17S\x9dJ\xbdG7y>6\xab\xa5\xd0*\xbc`V%Z^t\xb7\x9aU\xb1\xc0\xf9쨏vW~\xaf[l\xa1\a\x0e\x83\xce\"V\x18~Ž\xb9\x87\xb2[\xb0v\xa0\xbf\xd9\xd3sX\xf8\x9d\xa6\xf0N\xa5\xa7\x94\xfeWꩼ\xa3\xd7\x06؋\x99Nw\x84V\xbf\xef\xaeI\xa5\x00\xef\xbbw\x9bU\x89\x9e\xbdY7ͪX \xfa7\xfa\x95\xeb\xf5ˣ\xef\x81è\xb3\xc8\x15\xb2\xa4#\xc9\v\x82e\x03\xae\x86\xe9\xe4\xdf]N\xdf\f\xefx\xcam|e\x80!f:\xbd'X8\xc7\xd9\xec\x1d6\xab\x12=\xc3\xde\xcdfUF\x85\xc7\xcc\f\xb0\x82ig\xba\x15d\x9d\xde\xdba\xd9`=\x9d*KO\xfb_X]\t\x9d\x9c \xa2N\xbe\xc5\xf2I\xfc\x0e\xbf\u007f\xab@\xcf\xe3\xdew\vKؤ\xfb؎%\x9e\xd5\xf2\xc1\xe3\xbdo繽\xe5Ҵ/[~\xcd\xder\v\xc2\xde\xf7*\v=\xab?\xe5:\xe3J\x8d:\xf3\xbdP\x92\xbddG@ɽ\x1e\x8d\x9c\x96{P\xf8\xd8C\xd7\xe1$\x9bR/z\x88\x9eՅ\xee\xbc\xf2B\x9f\xff\xbcrٲ\\\xbd\x16\x06=ܩ\\\\\xb8c\xc7\xe2\xec\xd3\\\x0f\x1c\\g\xaa%ӛ\x9b\x8a\xac\xc0u\xce\x1f\xe92\x94\xfb\n\x05!\xc7翻>\xdf]X\xfe\x96\xdf\xffi\x9e\xfbDž\xf9W\xb6\xe5\x94\xdee\x8bӺ%?\xa7\\\xb9d\n\xea\x14\x9a\xdb\xee\xca\xc3O\xfbˏ2\x9d\x82=h\x9b\x01\xbb\x88|tz\xb3\xe7\xa4\xd0\xd0\xd3s\x8b\x9d\x98\xbb\x1b\xfc\xbe\xab\x9b\xb3\xe8k|\xd2-x\x1b\x0e\xe6<\xcdj\\\xc9^~\xf0r\x83 ]\xe7\xbc)\xf4H\xad\x86O\x9f,,\xca.\xdcQ9\xf7\xcf\\_\\\xa9Qg\x9b\x85m/\xb6z\x1fS\xf6\xc9W\x84\xdf\xfaUX\xee!\xc0՞\x9e\xf9\xd2\x1e\xaa\xaa\x1b⍹\x9b\xce^>\x96'|J\xaf[z\x8a\x9e\xa4\xd7-\xff\xaeY\v\xdd\x1e|\x8fz\x0f7\xcc\xf7\x1c[\xdd\xca\xf5\xc0\xc1u\xc6/\x99\xee\xdcTd\xed\x1d\x1e^\xbf\x83\xcd\xe1\xb7\rt#\xbc0\xf7\x857\x99\x9c[\xae\x9c.\x17\xae\xd2m\x9e#\xec(\x15\x16\x1f\xcck\x95\x16\xa7\xb0\xa1\xa1\xd0\xf3\x8e\xd40\xa8Shn\xbb+of\u007f4\xff\x16\xd3)ԃ\xa6\x19\xb0\x8b\xe8O\xf6\xa4\xb7̆,i2\x87\xbe9Wz\xe9\xd4p\xe1j\xfa\x92\xf9NKg\xf9/\n\u007f\n4{L\xa0o\x9da\xd7\\\xa1R\xdd\xce\xceK\x03\x19W\xe5\xc3\x005X\b\xbf\xf8\xb7\xd6\x03\x87Gy\xc3\x0f\xd5\xe58\xece\x1a\x1cΑ,\xe4N\xbfTk\x11\xde\xc3i\x81\xbe\xd3\x1f\x16\xde\xd1\xf6\xc0\x11\xec\x8c[2\xa3\xb9\x85\xc8b\x87\xacriҷ\xa9\xe4N\xa14\xc89|\x92.\x88o\x19\xf3\xd8[I\xb7\xf5y\xff\xa6-\xacn!-\xfe\xb8\xb0D\xaa\x1dЉ\x9b\xdb\xeeJ\xff\xb2-+\xfdL'\xae\au3`\x17\xb1\xe9\xb4)0yIx3T\xf7\xac\xf0~`\xf2\xb1,\xfe\xc0\x14^\xaa\xdb\xd9\xfaG|\x9fR\n7\xcbun\n\xa7G\xd8\x03GP\x86`]\x8e?\xe7\x17n;\xf6\xa6Ov\x81\u05c9_\x8b\xf0\x1ev\xe7Ї?Iҫz\xe0\bv\xc6-\x99\xd1\xdcBdm\xb9zu\x99\xac\x93\u007f\xf8\x1by\xca\xe7\x14w\x0e\xaf~$GXF\xa7\xbc'\xa9*\xc3\xcc\x14ZW:\xc1>,\x0f[\x04t\xe2\xe6F+\xb1\x0f\x1d\xa4k\xa7P\x0f\xeaf\xc0.b\xd3)8\xd9*p\xd7)܅\xf0c\xda\xcb\x01M\xa9ng˔K\t\xe5T\xec\xaa\xf0\xca\b{\xe0\b\xca\x10j\xc6\xf1\xf1\xd1\xf5K\x84\xbc\x83aG'~-\xc2{h\x9d{\x87\xbd\xa1\xbc\xa3\xed\x81#\xd8\x19\xbfd\x06s\v\xc1fq\xe9\xb2\xf2䬲\x19\xaez\vw\x9f\xed)\x95t\xba\xe4\xbf\xea\xf6+:I\x8b\xd5#H\x03\xee\x81W\x80\x9b\x1b\xadtg\xc7mI'\xae\au3`\x17\x16uګ\xd9\u007f/\xf3\xaf\xc7p\xf0\x12\xda\xffط\xfd:\x84Ju;\xab|\xe4\xf7\x12\xca;f\x83;|\x80\xdeZ\x0f\x1c\x11u\xba\xba\x9b\xee\xda\x1f\x9f\xf4\x1cfO\xa4\x1d\xfc\x98tXR\xadEx\x0f\u007f\x16\xca\xff\xfcVQ\x89O\xdb\x03G\xb03nɌ\xe6\x16Bَo\xb1ո\xe9\xdd[\xf8\x11{\xb6\xa4\x84\xbds};\xa0SV@\xa7m\xec\x8f\xc7\x04i[\x05t\xe2\xe6&U\xf2K:q=\xa8\x9b\x01\xbb\x88^'\x0f}A|+5\xfb\xef]o)ۛ\xb6I/\x8e\xff\xdbE\x81wg\xfd\x01\xe2P\xa9ng\x97\xe4k\x9e\xbd\xf2\xfd\x10\xbe%\xe5#\xec\x81'\xa2N\r\xc2%\xf6_\xe9\x16\xe9\xb1\xd4\xef\xbf-\xf7\xa3Z\x8b\xf0\x1e~/\xe4\tB\xe9Ͱ\x1e8\x82\x9dqKf47\xff\xfb\a\xdf\xe7fA\xada\xabX\xb2\u05ffE\xdaƅ\xccm\xdf7\xc2tʣF\f?R*\xb5\b\xe8\xc4͍Ӊ\xebA\xdd\f\xd8E4#{W%IJ\xbc\a\x1bJ\x04\xf7\v\u007f\xbc\xd5\xe3\xde|\xd5\xf7\xe6f7\x1b\xf1\xbb2\xffѣ\x97\xb6\tǤ\xea\xef\xc9w\x06}\xfa[i\xc0*x!%\xa3*\xd5\xefl\xf7\xdcʳg7+wV\xb4\x86\x9d\x88X\xed!\x80\xefw==\xf37\xf7\xf4\xdc\xf5\xab\xea\x86h\x10\xb2\u007fr\x9e6\xbb\"=\xc9j=[\x9a\xfdg\xd5\xdc\xf4{\xf8\xfd\xfc\xcb/\xf6\xdc\xf4\x85\xf5\xc0\xf7\xact\xc6/\x99\xee\xdc\x18O\xcb\xc3\x0f\x81\xbb\"zrv\f\xbf\xb2\xd5{\xd3\xff~ζW|\xb4\xd9\xfa\xc3\r\x8fѓī\u007f\xcci\x1d>\xe9~k\xb8\x92\xa9\x9c%,?y\xac(\xe7O\xf4`\xc9\xee\x8ah\xed\xe9Q\xcd\xed\xa3\xcaR\xb6\xaa\xb7J+?\xe2z\xe0\x9b\x01\x1b\x89\xfc\xb9S\x8et\x06\xee\x96\x06r\xdf+\xf5d\xaf\xfe\xb1 l\xddʊ\xfe-\x9b>n\xa5\xc5\u007fZ_\x98\x1d\xbc_u\xef|v\x9e\xff\x96|\xe2\xae9\xb8\xa8J\r:\xbbT\xba8\xe7I\xe9\xbd\xdb\xdf\xe3\xd9\xe1\xd7`\xb1\x87 o(W\x12G\xfd\xea\xbaA^x\xb2\xa1\xd0\xed-\x95]\xf0m\xcb\xf1?\x86\xfb\xa542\xa2\x19B\x8d\x82\x18\x9b\x013\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\t\x00ۀN\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6a\xb7N\xc8(\a\x13\x18S\x9d\x90Q.3\xf2\x1e\xa2\xe5\xa4t\a\xed⧣\xb9\th\xab\xa0\x93\xdad\xc0\xd1P]+\xb3\xb0Rw\xc2'\xa2\x9bꄌr\x19\v=pĒQ~\xf7\xbc\xf0㞞\x17\x96\xe5}\xa4S_\x83\x947\x18%\x1f\xf7\x94\x04\xea\x1a\xce\xc2\xca\xe2\xe8ԝ\xf0\x89\xe8f:!\xa3<@\xf4=pĔQ~K:\x8a\xdc\xf1D%\x8a\x95oZ\x94\a\xeb\x1a\xcd\xc2\xca\xe2\xe8՝\xe8\x89\xe8f:!\xa3|D\x98v\xa6WA\xde\u007f\xfd\xcb\xcc\xdaJ\x8cD\xa7\xf0YXY\x1c\xbd\xba\x13=\x11=rV\x042\xca\xc7\"\xa3\\\xde\u007foK)\xce\xc1fF[=k\x87\\\xca'\x97si\xe4\xaaׂ괍\xcen\xfe\x1dn\x16l\x19~\xcc\"%\x84\xd3\x06\xcbk\xa5\xeeDOD\x8f&\xc9\b\x19\xe5\xcef\x94\xdf\x12\x8e\r\xdf\xfdݲ%w\xf9fF[=KXr\xf2l\xdeӪ\xe4r.\x8d\\\xb5\x16T\xa7\x9b\x95B\xebU~\x16ï\x14n\xb9\xed\xbf\xfd\x93\x9c\x9e\xbb\x06\xcbk\xa5\xeeDOD\x8f\xfed\x8f\x8f]EF\xf9hf\x94ߒ\xde\xf7\x8bn\xaa\x9b\x19l\xf5,\xefG\xec,ۯJ.\xe7\xd3ȹ\xb5\xa0:\xb5f\x9d\xd7\xcc\xc2\xdf\xc0\x8e0\x9b6\xcbuu\x96\xd7J݉\x9e\x88\x1e\x9bN\x9b\x02\x93\xc8(\x1f\x85\x8c\xf2[\xc2O\xae^\xbd\xb4i\xf1\x1b\xea\x15\xd2\xdf\xeaY[\x02\xa5|r9\x97FέEy\xc3^\xe5\xe5\xe4f\xe1\xbf9\xf7\xdf\xfc\xbe\x1c9\xc3Yoy\xadԝ\xe8\x89\xe8\xb1\xe9\x14\x9cDF\xf9(d\x94+\xd7\xfe\xeb\x8b|\xaaf\xfa[=T\xca%\x97\xf3i\xe4\xdcZ\x94{s\x96<\xed\xd3̂\x16\xef\xf0_\xca\xd1\xd8\xcd\xcd\xd8J݉\x9e\x88nQ'd\x94s=\x8cVF\xb9\xb2\xff\x1e\xa3o\xe6\xfc\n\xe9ou\xb5NY\xb2N|\x1a9\xb7\x16\xe5\xdew\xde\xcfi\xd5̂\x9e\xac\xe5\xf9\x94\xf37\xdd\xe5\xb5Rw\xa2'\xa2G\xaf\x132ʵ=\x8cVF\xb9\xb2\xffn\xca\xf6\xa9VH\u007f\xab\xeb\xeaħ\x91sk\xc1\x06\xca/\xb9\xaf\xaag\xc1\x82\x02\xcf+\xe7o\xba\xcbk\xa5\xeeDOD\x8ffd\x0f\x19\xe5\x8ef\x94˷!\x9c\xad\x946f\xb0\x99\xfeV\xe7J\xf9\xe4\xf2P\x1a9\xb7\x16\x1f\xf7\x94l\xfe\x9d\xefn\xb9\xf7\xcam\xd5,\xe8L\x1e\xc9\xf9\xd4py\xadԝ\xf0\x89\xe8\x91?wBF\xf9\x18d\x94\xcb7ɹ\x97\x1d\xf3\xf1\xcd\xf4\xb7z\xa8t\v\x9f\\\x1eJ#\xe7\xd6\xe2(\x9bx\x83\xf5\xbeW=\v\xff\x9f\x84\xc0QUgy\xadԝ\xf0\x89\xe8f'{\xd6@F\xf9\xb8\xe4nV\xd8\xfb\x80!V\xea\x06\t]T'8\xf6ꄌr\xc73\xca\xed\xe0\xf4\xe2\xe8ߺ\xac\xd4\r\x02\x9d\x80\x19\xf1\x91Q>b\x1a\xae\xf8J\u007fbVI\xc1J]\x1e\xe8\x04̈\x87\x8c\xf2\x913,,\xdf\xea\x8d\xf2l\xd5J]\x8e\t\x94\x88\x0e\x9db'\x0e2\xcam\xa0!\xbbTsϠ1Vꆘ@\x89\xe8\xd0\t\x00ۀN\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\t\x00ۀN\x00\xd8\xc6\xc8ur.\xbc;:\xd6\x1f\x95\xff\xbf\xb2:\xcf]\xb8yb\xdc\xdb\x02\xe2\x04\v:\x8dyx\xb7!|\xdd7\x84\xdd\xd2\xffW\xe7\x96\x1c\xbb|\xb4(o\x02|g\r\xc4\r\x16t\x1a\xfb\xf0n#Bu}=\xf9\x8aNg\x05\x16ipS\xf9\xda=\x00N`A'Ӽm+\x98vfZ\x81#Tw\xbd\xb0\xde#\xeb\xe4\x93\x0eKz\xe1b\x00\x8c\x16&:\xc5Ux\xb7*o\xdbwt\xb9\xe7\x1b\x87}\x9a\xcen\xdf\xf2\xe7\xec\x0e\xd4\xf7ݹT\xf8\x8d\x98\x8e\x9d\x00\xc4Dd\x9d\xe2+\xbc[5\xe3MY{_ܛ\xb5\xd9\x1fV7\xa8ӛԱl\fE\x00\a\x89\xacS\x9c\x85ws3\xbe$\x85\xd5ɏ\xea\xbaA\x9d|W\xaf\xb4\x16z\xe1\x13p\x8e\xc8:\xc5Yx77\xe3\xcdr$㣛\xc3\xea\x86N\xf6(\x1f\xe7\xebd_\x020J\x98\\;\xc5Wx77\xe3\x12Y\x93\U00092c3a\x8aNw\xe496\xb8q\xf1\x04\x1c#\xb2Nq\x16\xde\xcd\xcdx\xf3#\xacw_ᦰ\xba\xb2N\xbe\x1c\xb9f\x83'\x86\x1c+\x00b#\xb2Nq\x16\xde\xcd\xcd\xf8E\xe9O'\x85\x17\xb5u\x03:屟@\xf2\u007f\\\x18\xfec\x1a\x00\x8c\x16f:\xc5Sx\xb7*\xa3\xbcR\xd8}~\xb7P\xa9\xe9\xecNOO\xf6z)T\xfd\x05\xa1\xfc\xe8\xe5\xd6\xc2<;\u007f\xaf\x1a\x80\xc8D\xd6)\xbe»U\x19\xe5\xbe\xd6e\x9ee\x87}\x9a\xba{\xa5\x1an\xf6+\xac\xbf}\xbap\xfe\x92m\xb6d\xd2\x02\x10\x1d\x16\ue288\x9a\xc4\t\xef\x06\xc0\x12\xa3\xa1S\xe2\x84w\x03`\x89\xd1\xd0)A»\x01\xb0\xcah\xe8\x94\x18\xe1\xdd\x00Xf4tJ\x90\xf0n\x00\xac2*:\x0101\x81N\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\t\x00۰[\xa7\xb3%\xb7ͪ\xa8\xb9S\x12K\x88,\x00\xf1\x88\xa9N\x1fm\xc9\xf3\x94G}\xb7\xd0A\xa1!\xea\xba2\xbe\x83\xc2A\xb3:V\x18yd\xfa\xc8{\x88\x96\xb3n\xe5\xae`\xb7\xf9[J\x83\\\xe9E\x8f\xd0`V\x15\x8c\x19\xa6:\x95z\x8fn\xf2D\xfb\xbd\xa5V)\xe5\xcb\"/\xba[ͪX\xc0Bd\xfa\x98\x87\xae\x1f\x14zz\x0e\v\xad==s\x8d\xdfQ\x02\xcd\xeeTzJ\xe9\u007f\xa5\x9eJ|#2~1\xd3\xe9\x8e\xd0\x1a\f\xd43\xe5}7\x1f\xca\x155{\xb3\xec\xfc\x06z\xf4G\xc71\x0f]ou\xb3\x84\xc1\xdf\xf9\xfd\x1e\xe37\x94`\xb3\xdd\xe5\xf4]펧<\xa6M\f\x9c\xc1L\xa7\xf7\x04\vg>\x9b\xbd1}5pػ٬ʨ`%\x06\xdd\x14\xd3\xcet*\xf8\xdeStz\xcf\xd8\xe0`\xb3ݕ\xa5\xa7\xfd/\xac\xae\x84NqLD\x9d|\x8b\xe5S\xfb\x1d,\x82\x9c\x9eǽ\xef\x16\x96h\xd2\xc8\xfd\xef};\xcf\xed-\x97\xa6}\xd9\xf2K\xcde\x89\x1b5\xe3\x82\xc9){=\x1a\r-\xf7\xa0`\x10\x99\xce\x11W\xa1\xeb\fI\xa7h\x9a\xed\xae<\xfc\xb4\xbf\xfc(\xd3\xe9\xee\xfa|wa\xf9[~i![\xb7\xe4甿\x17\xd6/\x18\v\"\x1f\x9d\xde\xec9)4\xf4\xf4\xdc\xf2\xfbo\xf6\xb8\x1b\xfc\xbe\xab\x9b\xb3\xd4i\xe4\xfe+\xd9\xcb\x0f^n\x10\xa4\x93\x957\x85\x1e\xa9\x15\x97%n\xd4,\x14L\xcexE\xf8\xadz\xbe\x96{\b\xa0\x1b\x99\xce\x11_\xa1댠Nf\xcdvW\xde\xcc\xfeh\xfe-\xa6\xd3ya˕\xd3\xe5\xc2Uy!\v\x1b\x1a\n=\xef\x84u\fƀ\xe8O\xf6B1z\\\x1a\xf9p!\x8b\xb3\xf3\x9d\x96.\x8f_\x14\x82_\xb4\r\x85\x98\xeb6\xe3\x82\xc9\x197\x85\xf0\x8b\u007fk=p\x84G\xa6s\xc4]\xe8zP'\xd3f\xbb+\xfd˶\xac\xf43\x9d\x86O\xd2%\xf5-\x93\xde*\xb2\n\xef\xb28\xc1\x12\xbd\xbe\x81\xd3ĦӦ\xc0\xe4%>\x0e\xe2\xac\x10\xcc\xd7\x0f\x85\x98\xeb6\xe3\x82\xc9\x197\x85\xd3~-\xd6z\xe0\b\x8fL爻\xd0\xf5\xa0N\xa6ͨN\xec3\x05\xe9\xda\xe9\xce\xe1Տ\xe4\bRL{\x96t\x82}X\xc0x_<\x10\x9bN\xc1\xc9V\x81\xbbz\t\x9e\xb7\xf0!\xe6\xba\xcd\xf8`r\xbf\xfe\x8f\x9aY\xeb\x81#<\x94\x96'\xdeB׃\x1bʹ\x19\xd5\xe9ΎےNW\xbd\x85\xbb\xcf\xf6\x94\xca:I\v\xdb#\x98\x8d\xd3\x03'\xb0\xa8\xd3^\xcd^}\x99\u007f\x19\x87\xb3\x1a\x02\x93\xa1\x10s\xddf\\09\xa3\xc1\x1d>\x14o\xad\a\x8e\x88:\xc5]\xe8zP'\xd3f\xbb\xe5\xc4[\xa6Ӓ\x12\xf6&\xf6mY\xa7m\xec\xf1\x98\x10\xed\x87\x19`4\x89^'\xf6#\x99\xbe\x95\x9a\xbd\xfa\xae\xb7\x94\xedcۤ\xd7\xd4\xff\xed\xa2\xc0{v\xe8\xadX\xb7\x19\x17LN\xf1-\xd1\xf9\xd5\x18K=\xf0D\xd4)\xeeB׃:\x996\xe3t*d\xf2\xfb\xbe!\xeb\x94GE\x1a~\xa4\xd4\x0f\xe2\x80hF\xf6\xaeJ\x92\x94x\x0f6\x94\b\xee\x17\xfeȧ\x91\xfb\xaf\xcc\u007f\xf4\xe8\xa5m\xca\x0f:\xbf'\xdf/\xa4\xca\x12\xd7o\x16\n&\xf7\xb33F홊\xd5\x1e\x02\xe8G\xa6s\xc4W\xe8:\xe5\xcd\xc3B\xab\x1c\x1dm\xd2\xec\xa3\xcaR\xb6&\xb7J+?\xa2\x15\xd6\x1fnx\x8c\x9e\x0eҖY\xc2\xf2\x93NJr\x90\xb6\x16\x17D\xfe\xdc)G:\x9dwKû\xef\x95z\xb2W\xffX\x10\xb6\xf2i\xe4\xf4\x02}}av\xf0.ֽ\xf3\xd9E\x90*KܠY0\x98\x9c\x9e\xf7{vhgl\xb1\x87 \xfa\x91\xe9\x1c\xf1\x15\xbaN\x0f+\xac\u007f\xcf\xdd(\x9a5\b\xc2&\xfat\x8b 4\xf8}\xadEY\xde\xf5NJ\xdc\xf4\x98\x94\xb5csN~\xa5\xea=\x03\x8c\x19f'{\xd6\xf0ms\x87\x8f\\\x9bpڽ9\xde\u007f\x82)\x9eC\xd7C\u05eb`\xec\xb1W'\xfa\xbeYhq\xc4\xf6\x8e7l\x90,\xee\x88\xe7\xd0u\xe8\x14OجSb\x12ϡ\xeb\xd0)\x9e\x80NQ\x10\xbf\xa1\xeb7\xa5\xf1\x12\xb3Z\xc0)\xa0S4\xc4m\xe8\xba4^\xf2\xbe\x1f\xc4\t\xd0\t\x00ۀN\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\t\x00۰['d\x94\x83\t\x8c\xa9N\xc8(\x1f=\x90Q\x9eh\x98ꄌ\xf2\xe8@F90\xd7\t\x19\xe5Q\x82\x8cr`\xae\x132ʣĴ3d\x94O\x00\"gE \xa3\x1c\x19\xe5\xc0\x02\xd1$\x19!\xa3\x1c\x19\xe5 *\xa2?\xd9CF92ʁ\t\xb1\xe9\xb4)0\x89\x8c\xf2`\x0f\x81\xceL\xc3\xc6\xd5 \xa3<\x91\x88M\xa7\xe0$2ʃ=\x04:3\r\x1bW\x83\x8c\xf2D¢N\xc8(GF90&z\x9d\x90Q\x8e\x8cr`B4#{\xc8(GF9\x88\x8aȟ;!\xa3\x1c\x19\xe5\xc0\x02f'{\xd6@F\xb9\xe3 \x056\x9e\xb0W'd\x94;\x0et\x8a'l\xd6)1AF9\x88\x0e\xe8\x14\x05\xc8(\a\xd1\x01\x9d\xa2\x01\x19\xe5 *\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\t\x00ۀN\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6a\xb7N\x963\xca\xf5Ar9\x18\x8f\x98\xea4\xda\x19\xe5\xfa \xb9\\@r\xf98\xc4T\xa7\xd1\xcf(\xd7\a\xc9\xe5H.\x1f\u007f\x98\xe9\xe4DF\xb9>H.Gr\xf9\xb8\xc3L''2\xca\xf5Ar9\x92\xcb\xc7\x1d\x91\xb3\"F\x9cQ\xceuf9w\x1c\xc9\xe5Q4Cry\\\x11M\x92\xd1\b2ʹ\xbe,\xe7\x8e#\xb9<\x8afH.\x8f+\xa2?ً1\xa3\x9c\xc7Z\xee8\x92ˣh\x86\xe4\xf2\xb8\"6\x9d6\x05&\xcd3\xcay\xac\xe5\x8e#\xb9<\x8afH.\x8f+b\xd3)8i\x9eQ\xcec-w\x1c\xc9\xe5Q4Cry\\aQ'\xeb\x19\xe5<\xd6rǑ\\\x1eE3$\x97\xc7\x15\xd1\xeb\x14cF9\x8f\xa5\xdcq$\x97\xfb\xa3h\x86\xe4\xf2\xb8\"\x9a\x91\xbd\x11e\x94\a\xb1\x9a;\x8e\xe4r\xbfy3$\x97\xc7\x17\x91?w\xb2!\xa3<\x88\xc5\xdcq$\x97#\xb9|\xfcav\xb2g\x8dX2\xca\xf5Ar\xf9\x88@6\xec\xd8`\xafN1d\x94\xeb\x83\xe4\xf2\x91\x01\x9d\xc6\x06\x9bu\x9aH \xb9\x1ch\x81N1\x83\xe4r\xa0\x05:\xc5\x0e\x92ˁ\x06\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\t\x00ۀN\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80mح\x132\xca\xc1\x04\xc6T'd\x94ˌ\xbc\x87hAF\xf9\xf8\xc5T'd\x94\xcbX\xe8\x81\x03\x19\xe5\x13\v3\x9d\x90Q\x1e \xfa\x1e8\x90Q>\xb10\xd3\t\x19\xe5#´3d\x94'\x14\x91\xb3\"\x90Q\x8e\x8cr`\x81h\x92\x8c\x90Q\x8e\x8cr\x10\x15џ\xec!\xa3\\\xdb\x032ʁ\x86\xd8t\xda\x14\x98DF92\xcaA\x88\xd8t\nN\"\xa3\x1c\x19\xe5 \x84E\x9d\x90Q\x8e\x8cr`L\xf4:!\xa3\\\xdb\x032ʁ\x86hF\xf6\x90Q\x8e\x8cr\x10\x15\x91?wBF92ʁ\x05\xccN\xf6\xac\x81\x8c\xf28\x01)\xb0c\x83\xbd:!\xa3\x1c\x19\xe5\x13\x1a\x9bu\x9aH \xa3\x1ch\x81N1\x83\x8cr\xa0\x05:\xc5\x0e2ʁ\x06\xe8\x04\x80m@'\x00l\x03:\x01`\x1b\xd0\t\x00ۀN\x00\xd8\x06t\x02\xc06\xa0\x13\x00\xb6\x01\x9d\x00\xb0\r\xe8\x04\x80mح\x132\xca\xc1\x04\xc6T'd\x94ˌ\xbc\x87h9)\xddA\xbb\xf8\xe9h\xee\x12\xda*\xe8\xa46\x19p4T\xd74ڼg\xaeP\xe2\xf3\x9f\x15\x84\xb9\x97\xd5\u007fxgu\xb6\xb7\xf2\x8a\xf7\xb6\x95\x19O LuBF\xb9\x8c\x85\x1e8b\xc9(\xbf{^\xf8qO\xcf\v\xcb\xf2>ҩ\xafA\xca\x1b\x8c\x92\x8f{J\x02uM\xa3͇/\v\x9e\x1e\xffݳ\xc2e\xf5\xf7L.e\xafv\x15\x19壙Q~K:d\x15\xddT73\xd8\xeaYޏ\xd8Y6\x9d\xf2V\xd2W\xe0\xbc\u007f\xd3\x16u\\9\xb7\x16T\xa7\xd6,\xe9\xf54\x8d6\xa7:ݙ\u007fG\xd2\xe9\x92\x14\xf0\xc7\x1e\xdf\xe7_\x91ЌU=\xe8m\x1d\xa3\x95O\xf1\x88M\xa7\xe0$2\xcaG!\xa3\\\x19\x8aX_\xe4S5\xd3\xdf\xea\xa1R\xef%\xffU\xb7\x9c\v\xcbǕskQ\xee\xcdY\xf2\xb44[\xd3hs\xa6\xd3\xd9oH:\x95\xc8\xc1\x86\xe5%\xc1k'\xdf%Ռ\xc3z\xd0n\x1d\xa3\x95O<,ꄌr\xae\x87\xd1\xca(Wt:F\x0f\x12\xfc\n\xe9ou\xb5NY\xb2N|\\9\xb7\x16\xe5\xdew\xdeϑ\x0e0\xa6\xd1\xe6L\xa7\xe1\xec\xcb\xd2\xd1\xe9\x11\xb6\x86\xbe\xc2MldOڲ'\x85\xdb\xfc\x8cU=\xe8m\x1d\xa3\x95O<\xa2\xd7\t\x19\xe5\xda\x1eF+\xa3\\\xd1iS\xb6O\xb5B\xfa[]W'>\xae\x9c[\v6P~\xc9\xcd2gM\xa3͙N\xfeM\x95L\xa7\x17\xa5e8)\xbc\x18\xf8\xdc\xc9WZ\xa8\x9a\xb1\xaa\a\xbd\xadc\xb4\xf2\x89G4#{\xc8(w4\xa3\\\xbe+\xe2l\xa5\xb41\x83\xcd\xf4\xb7:W\xfaǜ\xd6\xe1\x93\uedc6+\xe9.\x1c\x8a+\xe7\xd6\xe2㞒Ϳ\xf3\xdd-\xf7^\xb9m\x1am>|Y8{\xd7\xdf\xe3\x91F\xf6*\x85\xdd\xe7w\v\x92\x80\x97<%/\x9c]\xed~E\xb58\xa1\x1e\f\xb6\x8e\xd1\xca'\x1e\x91?wBF\xf9\x18d\x94\xcb\xf7칗\x1d\xf3\xf1\xcd\xf4\xb7z\xa8t\v=\x16\x9c\xcc\x16\xb2O\xb2K\x94P\\9\xb7\x16G\xd9\xc4\x1b\xac\xf7\xbd\xa6\xd1\xe6W\xe6\n\xc2i\xbf\xaf\xc4+\x9d\xe7\xb5.\xf3,;,\x8b\xf1\xcejO\xde\xd3\xff\xa6^\x9cP\x0f\x06[\xc7h\xe5\x13\x0f\xb3\x93=k \xa3||\x13\xba\xf8\x1d1\t\xb8u\xa2\xc0^\x9d\x90Q\x1e'\x19\xe51b\xa3N\x06['\xc1\xb1Y\xa7\x89D;C@4#Cx@B?AFHDFDKHZx\xb8vxu]{\xbb_}\xbez|y\x84|dX\x80\xbfL\x91K`\x81\xbbb\x80\xc0}\u007f|\u007f\x81~c\x83\xbdN\x95Ue\x85\xbf\u007f\x83\x92W\x95V\x82\x84\x81\x8d\x84fg\x88\xc2m\x87\xbci\x89\xc3j\x8a\xc4[\x9aZ\x87\x89\x86q\x8c\xc1\x8a\x8b\x88\\\x9dc\x96\x8cnt\x8e\xc4v\x90\xc6g\xa0g}\x91\u008f\x91\x8ey\x93ɒ\x94\x91\x80\x95\xc6z\x97Ƃ\x96\xc7s\xa4l\xa1\x96x\x95\x97\x94\x83\x98ɂ\x9aė\x99\x96\u007f\x9d\xcct\xa9v\x86\x9b́\x9eΚ\x9c\x99\x82\xa0Ϩ\x9d\u007f\x9c\x9e\x9b\x88\xa0\xca\u007f\xabz\x8a\xa2̟\xa1\x9e\x9e\xa3\xa5\xa1\xa3\xa0\x8d\xa6Ђ\xb1\x85\xa3\xa5\xa2\xb3\xa7\x83\x91\xa9ԧ\xa9\xa6\x8d\xb5\x8a\x94\xac֙\xacѪ\xac\xa9\xa4\xac\xc0\x9e\xad͍\xb8\x93\x9b\xafԻ\xae\x89\x9d\xb1֯\xb1\xae\x97\xbb\x97\x9f\xb3ء\xb5\xdaµ\x90\xb4\xb6\xb3\xa3\xbf\x9d\xac\xb7Ң\xc0\xa4\xa9\xb9ٷ\xb9\xb6\xac\xbcܺ\xbc\xb9\xa6Ũ\xb1\xbd\u05ef\xbe\u07fd\xbf\xbc̿\x9a\xb1\xc0\xe1\xb8\xc0ձȭ\xc0¿\xb7\xc2ݹ\xc5\xe0\xbd\xc5ڲͷ\xc2\xc6ֻ\xc7\xe2\xd6ǝ\xc6\xc8ż\xc8\xe3\xbf\xca\xe5\xbdм\xc6\xcb\xdb\xca\xcc\xc8\xc1\xcc\xe7\xc2\xcd\xe9\xbf\xcf\xe2\xc7\xce\xe4\xca\xcf\xdf\xce\xd0\xcd\xc8\xd3\xc1\xc8\xd0\xe6\xdfѥ\xca\xd1\xe7\xcb\xd3\xe9\xca\xd8\xcc\xd3\xd5\xd1\xce\xd6\xeb\xd3\xd7\xe0\xd6\xd8\xd4\xd0\xd8\xed\xe7ج\xd5\xdb\xd0\xcb\xdb\xee\xd5\xd9\xe9\xd9\xdb\xd8\xd7\xdb\xeb\xd8\xdc\xec\xd2\xde\xec\xd5\xdf\xda\xd9\xdd\xed\xdc\xdd\xe7\xdd\xdf\xdc\xd7\xe1\xdb\xdb\xdf\xef\xd5\xe1\xef\xf0\xe0\xb3\xdd\xe1\xf1\xe0\xe2\xdf\xde\xe3\xe6\xd9\xe5\xf4\xe0\xe4\xf4\xe3\xe5\xe2\xde\xe6\xef\xe8\xe5\xea\xe5\xe7\xe4\xe6\xe7\xf1\xe0\xe9\xf1\xe3\xe9\xeb\xe7\xe9\xe6\xe3\xec\xf4\xeb\xed\xea\xe6\xee\xf7\xec\xed\xf7\xe8\xf0\xf9\xef\xf0\xfb\xf0\xf3\xef\xf4\xf2\xf6\xef\xf4\xf7\xf4\xf7\xf3\xf2\xf7\xfa\xf5\xfa\xfd\xf8\xfa\xf7\xfd\xfb\xff\xf7\xfd\xff\xf9\xfe\xff\xfe\xff\xfcA\x10\x8d\xd1\x00\x00 \x00IDATx^\xed\x9d\x0ft\x14U\xbe\xe7\awqv+\xfd^\xcc&O\x98\xe51\xd3@vaȆ\x82\x89M\"\x98`^\xc0\x13a} \b\x0e\x88\x99l\x1c=A\x98\xe1\xafg2\xcf3YI\x8eA\xf2@$\x98\xacsL\x00\xb3J\x88\x12\x91\x80\xae\xe6\x80ᨼ#\x90LD\x87\x93\x991\x83о\xc9L\xc4RQD\x12\xfb\xd4\xd9{oUu\xdd[\xa9\xbe71\xe9\xaa\xea\xee\xdf\xe7p\x92ە[\xb7nU}\xba\xeaVu\u007f\xa9\xef\xa9#@\x01\xe2\x9c\xef\x89\x14\xe0!j\x1c\x88u@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\a\xc0\x01\xf4\x008\xb8\xa7G_kMeM\x9b\xfe\xa2\xad\xaejG\v\xaf6\xe0\n\xee\xe9QW\xd5z\xaa\xa5\xb2\x05\x17{\x1bʛO\xb5\x94\xb7\v\xe6\x00\x1c\xc75=Z+\xbb\xd0\xcf\xf6\xca\x1e\xf4\xb3\xa1\xb2CQ\xbaʍC\t\xe0\x19\\ӣ\xae\x81\xfc\xaanQ\x94\x8e\xf2V\\\xec\xe1U\a\\\xc15=j\x1a\xb5_u\x8a\xd2\\\xd9+\xa8\f\xb8\x84kz4Uc'\x82U\xbb\xb0\"m5\xe5\xd5MA\xd1,\x80㸦GOU]W\xb0\xa3\xa6|\x87\xa2\xec(\xafn\xedh\xab\xde\x01\xc7\x10\xcf\xe1\x9a\x1e\xca\xf9\xba\xf2\xf2\xf2\xe6\xba\x1a4\f!\xe3Ӟ\xaaf\xd1,\x80Ӹ\xa7\a:\xb3\x9c\xefS\xaa\x9b\x14\xa5\xb1\x86\xbc\xd4\u007f\x01\x1e\xc2==ȩ\xa4\xbd\x1c]ҶT\xf5\xe1rC\x1d\u007f\x06\xc0y\\ӣ\xad\xbc\v\x9dP\xaa\xf1\xf5\xcbyraۣ\xdd\"\x03\xbc\x84kz\xb4\x97\xb7t\xb4Vב˕\x96\xca\x1644\xad\x81\xa1\xa9\xe7pM\x0f\xa5uWU]\xab^n\xaf\xa9\xda\xd5\x02vx\x0f\xf7\xf4\x00b\x00\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\a\xc0\x01\xf4\x008\x80\x1e\x00\a\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x14e\xcd\x1a\xbb\"\xa0\xb8\xa9G8D\xd9[]\xaeQ-\x9a%:\xfc\x9b\u007f\xa3M\x11\xb3Ǐȼ\xfb\xc4\xe0yF\x8f\x12\xb4\x88\xa9gE\xb5\xdc\xc2==\xc2!\xca`yK\a\xa2\xa5\xbcUq\x85\x92)\xef\xdb\x141=\xbf\xf5?qd\xcf\"\xff\x8b\x83g\x1a5\xce\x1e9\xb2\xc7\u007fDT\xcb-\\Ӄ\nQ\xb6ᯌ\x05\xf1\x97\x92\xdd\xe0\xacy\xc48\xcb\x1e<\x14\xe5\x041cѭJTy\r\xf4\x18\x04\x15\xa2\xd4^\xefr\xe9\xdbb\x91\x0f\x1e\x86\x1eO\xfa\xa3\x9b\xd0\x02=\x06C\x85(1\xe4\x9b\xc9npv\xf2F\x9b\xa2\x8e\xa6G\xc9LE\xf9\x85\u07ff\x17U\xf0ߎ\x8b\x93\xf7l\xbcu\xea݃\x06\f{\x17M\xbdu#2\xe9\xc4d\xbf\u007f\xa52\xd3\xef\x9fޫ\xf4\xac\x9c9y\xe6J4z\xe9˜\xfc\xeb\x993_\xdc8}Q\x10\xb7\xf0䚙\xd3W\xea-\x98z\x18-x\x06\xd7\xf4\xa0B\x94\x98]\r\xdc\xda\xd1c\xcd\xe4\xb36E\x9d\x13\xfe\x17\x82g7\xfa\x9fP\x94\xf7\x8fL~\f\xedȒ)h\xfc\xbaw\xb2?\xf3\xb1'\xa7\xae\xb4T.\xf1o|\xe1\xc9\xcc\xdb\xfb\x94\xbe\xd7\x1e\xf3\xbf\xa6\xfcֿ\x17Y\xf1\x82\u007f͋{W\xa2\x97ʋ\xd3\xfd\x1b\xef\xf6g>\x91\xf9$ia\xe6\x13\x8f͜\xaa\rz\xc3z\x84[\xf0\f\xae\xe9A\x85(\x11\xa7p\xde\xc5\r\xceN^cS48\x81/]\xfc%\xa4<\x05\xe9\xa1<6\x85\x14\xa7#\x8fJ2ٺ/\xf8\u007f\xab\xe0]\xbd\x17\xbf(\xb9\xe3\x8f3\x9f\xc0\x85\xe0^|0\xb8\x1d\xab\x94Y\x82\xea\xfc_\xa5\x04/e\xca-h\xcc\xf5\xe7\x99w\x909\r=\x98\x16\xbc\x81kzP!JD\xc3.A\xedh\xf1\v\xf3\x88\xf1\x8bA\a\x0f\xa4Ǔ\xaf\xbd\xb0h\n\x99N\xebQ\x12.\x9a\xac\xbc\xa5\xb7\x0f1\x93\xc8\x14\xbc=S?\xb8\xfcq\xcfݷL\xc7\xe7$%s/\xda\xf5Ae\xe3\xcfp\v\xe44\xb6\xc7\xffg\xfc\xcbЃi\xc1\x1b\xb8\xa7\x87\x19\xa2DT\xb5\xf0\xabF\x8b\xf7\xa7\xac\xb1)\x86!c\x8f?\xfb\xf7\xe02\xad\x87Y4\xb9ݯ\xa1i\xb1W\xdf\xe5\xafe\xceܸ\xf7\xc8\xddD\x8f\x17\x95\xd7&+\xba\x1e\xb8\x05刟\x9c]\f=\xd8\x16<\x81{z\x98!J\xfc?\x03\x9d\xe2W\x8e\x16\x1b\xfdgm\x8aa\xb4\xa1\xe9t\xb2/Ez\x94\xdcr\x82\xf0G\xfc\xe2\xfd\xcc\xc7f\x92\xc2\xedw\xe0\x93\xcbJC\x8f)\n{\xf4 \xff卡\aӂ7pM\x0f*D\x89\x87\x1e\xe7\x05գ\xc3\xfbSJl\x8a&\x9a\x1e\x99\x1bO\xa0q\xc4T\xb4G\xfb\ue22cNjژ\xe11<\xe4\xe8\xbd\xe31e\xcd\xddx\x889\x13\x1f\n\xfan\x1f\xa4G&\xb2&x\xcb\"2\xa7\xa1\a\xdd\x02\x1a\n=\xe1\x81{\xa9\xae\xe9A\x87(\x91+\xee\\\xcd\t\x0e\x1e\xf8\xca\x05\xfd\xbc{e\tڽ\x8b2\x9fx\xe2\x0e\xff\xe4ߞ@\x171%\xaf)'J&\x1fa\xef\x92l\xf4\xffl\xef\xde\x12\xb4\x8b\x83G\xd6d\x9eU\xceN\xdfx\xa4Wy̿r\xcf\x13\xb7\xa3\v\x96\xd7NL\u007f2\xb8w\xf2\x89\xe0\xcf\xf0\x15\xf1\x14\xff\xed{\xf7܊G\xb8\xe4\xae\xe9\x93G\x8e\x9c\xa5[\xc0\xac\xf4\xc2I\xc65=\x98\x10\xe5)wF\xa6\xefO-\xb1)\x9a\xecE\x03\x01\xf4V>qk&\xb2\xe4\xec\xa2)S\xef\xfe\xb5\u07fff\r\x9a:\xf9\xc4T\xf4\xd32Xy\xf1\xee\xcc\xe9\x8b^\xc0G\x01\xbf\u007f#\xda\xd7~t\xec\xe9{\xf2\xd6)\x99+\xf7\xdc:yQ\xa6\u07ffw\xaa\u007f\xea^2\xb6\x98\xb2\xb1d\xfa\xcc\x12\xacW\t=\xe00Z\xc0\xec\xc9ܣ\xb8\x8e{zx\x80_\xfb\xffͦ\xe8\x04\xda\xd0\xd4\xfb$\xb4\x1e\xee}\x92\x0fz\x00\x1c@\x0f \"\xda\xe06\x16\x00=\\\x80\fn=p\xd9*\x06\xf4\x008\x80\x1e\x00\a\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\a\xc0\x01\xf4\x18\x16/\xad\xfaPQ\xceOK\x98\x87\x03\xb8\xa7\a\xf5$ʞ\xa6]\x95\xbb\x9a\xbc\xf7\xb0\xb0Wg\xc8\x1a\x81w\xb4\t\xb5r\xed\xa7\xe8\xd7\xe6\xa4u\xdc\xf9\xe2\a\xf7\xf40\x9fDy\xbe\xba\xa6\xad\xa3mW\xb5;\xdf\x18\xe3\xf0\xf1\xab\xf9\x0f\xbd\x8a8 \xbfB^?#\x1f\xd0\xfeP\x97\xf4\bg\xb68\xc25=\xa8\x10e#y\x0eT\xef\x0e\x97R\x94<\n\u007f\x85\u007f\xfeN\xd3\xe3wY\xbf\xe9\xeb\xeb\xeb\xc5\xdf\x11|\xc0\xe7R\xf0\xc2a\\Ӄ\nQ6h\xa7\xf2\x1a\xb7\x92P\x1c4=>}\xe6c\xf4\xb3\xfd\x1f\xfe\xd3?Κ4q\xe2\ndtϸ;\x05s\xc6\a\xae\xe9A\x85(\xcfW7v\xf5v5V;\x1f\xa3\xfc\xf4\xc0\xaa\xecſ\xc1\xfb^\xf9xӼ\xf9\xbf\xf9ͼ\xec\xe7\x99\n\x9a\x1e\x84^\xdf\u007f\xce\xc8\x18\x93\x9c\x91>\xe6\x81 :|$\xbb\xf3\xedX\x87qM\x0f:D\x19l(//opa{o\x92\u007f\xf3\xca3\xf9\xf7\xa0\xe1構\xf3\x9f\xa9\rd?\xf3\xd03L\x85\xc2M\x1f\u007f\xfc\xcc*R\f\xfe\x87u\xaa\xdavU\x1d\xb8a6\xf2\xb8IJ\x88'߹\xa6\a\x15\xa2\xecm\u0601\x86\xa6;\x1a\x1c\x8f\xe8\xbfD\x86\x9ao\xca\xe8\x88\xf1\xbc\xfc\x0e\x1ez\xbec\xa9Q\x88\xaf[\xf2I1\xf8\x0fcƌQ\xf2ƌ\xb9a\x1d\x1aCwH\xee|{\xdaa\\Ӄ\nQ6\xed\xc0\a\x0e\x17\x86\xa6\x9b\n?\xfd\x1bb\xfe&E\xd96W\xc1CЗ,5\n\x1fz\xf3\xcdM\x9a\x1e\xca\xff\xf9/\xff\x88\xf4\x18;g]{/\xd6c\x87\xb5\xb5x\xc4==\xcc\x10e\xa5\x96gh\xad\x14\xd4\x1fu\x96\xea\xb75\x1eB\a\x8e\x19h\x04\xf2\xca\xe0\xa3\a\x1a{\xbc\xa3\x9fo\xfe\xdf\xff\xf8_H\x8f\xa4\xd6.|\x94k\x96\x1c\x97\xd9\r\xdc\xd3\xc3\fQ\xba\xa6Ǧ\xc27\t\x1f\xe3\x03\xc7C\xbf{g\xf1\xaaO-5\xa8\xa1\xa9\xf2q\xe0\u007fb=\xdaI\xc7\xd7\xf9\xbcw\x17/\n\xb8\xa6\a\x15\xa2l '\x97\xe0\x0e\xc7/l_\x91\xc9uʶZ<\x00)\x90\xe5\xa2\x0f\xf5?\x9cZ\u05ee\x15h=\x94\xf5\xff-\xacG\xdf\xc4YJ\"\xe0\x9a\x1eT\x882\xb8\x83\fMw8\u007f\xe9\xb2mƦ\xe7_ڄ%y3\xf0\xca+\xaf~h\x1c\x94\xd2Qҥ\f\x9c\xb7\xc7nj*\x05\x87\x9bH\x1f̓\x8b\x0f\xe9\xa1<\xecc\xeb*\xbeTt\xe4X\x90\x06z\xf0\x115΅z\x12%\xf3PJGI\xf7\xe9\x0f\xb1\xcb\x1bߋ\xd1\xfe_\x86\bz\x18u\x15\xdf\x02}\xea\xf0\xf5\x18C\xfeq\xfe\xaex\n\xf7\xf4`\x9eDI\x15\x1d%=]/L\xd2G\x1cs\xc8T{=\x8c\xba\xe6T\xbc\xa7\x9f\xbaI\xdb\xdfڅ\xc7X\xaa`\xbb\xfbA\x8f\xa1A=\x89\x92~(\xa5\xb3\x84E\xc8\x1b\xdfB\xe8\nO\xad\xc4\xc7\n\"\xc2\x03>\xb6.\xab\xc7\xcdOQ\xfb\xfb'\xf7Z\v\x16@\x8f\xa1A\x85(\x99\x87R:Kx\x977h\xa3\x8e\xfbID!#CQ\xbaȄ\xe4Պҗ\xceՃ\xde\xdf/\xdfx\xceR\xb8\xf8\xf8Mcn\xfc%\x9a\xf0\xa3\xb17\xfc\xe8ݰ\x1e\x8f\xff\xfd\x98\xef\xff\xf3E\xaa\x80\xfe>\xe6\xa6\u007f\x01=\f\xa8\x10%\xf3PJ\a\xe9m&\xd7(ڈb\xb5\x94\xb7\xab\xe6N\xa9\x1a\x97\x1f\xf6m\xae\xc9H\xc6\a\xb3ii\xeb\xd6M\x93\x92\xaaڨ\xba\xe8zfA\xb3Ҳ \xa9\xb1êǏ\xef\xb5\x16\x1e\x1f\xfb\xf8\xb9\x97\u007f|\xf1\xe2\xdf=u\xeeݟ\xfc\xd8\xd0\xe3ٿ{\xf6\xdc\xcb?\xf8g\xaapӽ\xef\x9e{\xf6\x87\xa0G\x18*DI?\x94\xd2A\xf0\xbd\f\x84\x1e\xa6n\xc8HM\xcd\xd0n\xbd\x04\x97\xa5&g\x90\xff\xfd\xa7=#9e\xd6\xfd\x92\xb4\x84\xaa\xbb\x04\xfdNjKF?\x97X\xf4\xb09x\xe0#\x82\xc1\xbb7\x1az\xdc\xfc\x1cz\xf9\xc6\xf7\xa9\xc2\rohu@\x8f8¢Ǐ~n-\\\x1c\xf3\xae\xf6\xfb\x8d\x1f\x8eE\xe3UC\x8f\xb1\xda\xf0\x95*\xfc\xd3؟\xfc\xf2\r\xd0#\xbe`\xf5x\xce8f\x84\vh\xff\xebz\xdc\xfcOo\\<\x17\xd6c\xcc\x1b\x86=F\xe1\xe2s\xf7\xfe\xe8\x86{A\x8f\xb8\x82\xd5\xe3\a\xbf\xb4\x16\x90\x16\xfa\xc9\xe5\x06$̳a=n6\x8e.\xe1\x02\xe6\xe5\x1b@\x8f\xb8\x82\xd1\xe3\xd9\xef_\xb4\x14\x10Oݨ\rMo\xba\xf7\xdcs\xdf\x0f\xeb\xf1\xd4\xd8_\xbe{\xee\xa9\x1fP\x85\x1f<~\xee\xdc\xcfo\x02=\xe2\n,\x86>x@G\x02\xe3\x98q\xb3y\xf0\xb8x\xf1_\xfe\x9e\\\xd8>\x87\xaeo\u007f\x1e\xd6\xe3\xe2S7\xdf0\xe6槨\xc2\xe37\x8f\x19\xfb×A\x8f\xb8\"<(\x1d5@\x8f8\x02\xf4\xe0!j<\xee\x01=x\x88\x1a\x8f{@\x0f\x1e\xa2\xc6\xe3\x1eЃ\x87\xa8\xf1\xb8g\xcc\xe8#Z\xa4\xb3\x80\x1e\x00\x87\x98\xd0#OJ]\x00))7\x88\t=:\x1a\xab&\xa6z&\x05\x93H8\xafG\xa3q\x1c訩j\xe8\x18T\x8c@\xa3\xe4\xc2'\xfe\x80\xe3zt\x95\xb7h\x85\x8e\xca\xc6\xf6\xc6\xca\x0eK1\x12͉\xf1\xf4%\xaf\xe1\xb4\x1e\x1d;t=\xfa\xc87\x8f\x9b\xaa\xfb\x98bD@\x0fWpX\x8f\xc6\xf2F=j\xddVI\x1e\xc6P\xd9\xc6\x14#\x02z\xb8\x82\xc3z\x04\x83F\x94\xb6A\xfb\xde^]#S\x8cH\xab\xe4\xc67\x95\x13\x1e\x87\xf5P\xc2I\xeb\x1a-\xd5\xd2T\xc3\x14#қ:\xad\xa9#\x91\xfe\xe3\x15o\xe0\x9a\x1e\xfa\xaf\x96j\xa6\x18\x19\x9c\x8c\x9eͫ\x00D\x01\xd7\xf4\xd0c\xf9\x8d5L1\"=i\xe3\x1fi8\xa5\x00\xce\xe2\x9a\x1e\xfa\x80\x03?\x19\x9d*F\xa4Yr\xfcIs\x80\x8bz\xb4\x95\xe3۠=\xe5mL1\"p\xe5\xe2\n\xae\xe9\xd1GB\x93\x8d\xda}\x8fp1\"\xa0\x87+8\xacG\xb0\xa3\xa3\xaa\xb1\x83\xe4\x9c\xe1\xaei\f\xe0\xb0\x1e-\xe5\x04\xf2\xf1ZGCe\x8d\xf1\x99\x8bY\xb4\xa3\xb7\xa3%\xcf\xe7B~\x1fpX\x8f\xef\xc6\x1cI\x1a\xef\xc2\xff\r\x03Ć\x1e\x1d\xadp\xe8p\x87\x98\xd0\x03p\v\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\a\xc0\x01\xf4\x008\x80\x1e\x00\a\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x83\xf3z\u0605(\xa9\xa9\x80\x97p\\\x0f\xbb\x10%5\x15\xf0\x14N\xeba\x17\xa2\xa4\xa6\x02\xde\xc2a=lC\x94\xd4T\xc0[8\xac\x87m\x88\x92\x9a\nx\v\x87\xf5P\xecB\x94\xd4T\xc0[\xb8\xa6\x87%9\tzx\x12\xd7\xf4\xb0$'A\x0fO\xe2\x9a\x1e\x96\xe4$\xe8\xe1I\\\xd3Ò\x9c\x04=<\x89kzX\x92\x93\xa0\x87'qX\x0f\xfb\x10%5\x15\xf0\x14\x0e\xeba\x1f\xa2\xa4\xa7\x02^\xc2a=\x80\xd8\x02\xf4\x008\x80\x1e\x00\a\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\a\xc0\x01\xf4\x008\x80\x1e\x00\a\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\xc3\xf7\xee\a\x80\x88\x8c\xe8\xe8\x01\xc4;\xa0\a\xc0\x01\xf4\x008\x80\x1e\x00\a\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\a\xc0\x01\xf4\x008\x80\x1e\x00\a\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\a\xc0\x01\xf4\x008\x80\x1e\x00\a\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\a\xc0\x01\xf4\x008\x80\x1e\x00\a\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0eC\xd1#\xb8.=%)\xed\xb6\xa6\xc1\u007fyT\xbaS\xff1\x02\x066\x8f\xf7\x8dk\b\xbf\f\x0e\xa0\x1f\xd5\xd2mf\x85]Ҝ\xc1sQ<\"-\xe3\xfe]@\xc4\xe6-\x1d\x13@\xfa-ꪀQٞ\xa3\xc9\x10\xf4\xa8J\x924f]\xb5\xfeiTVg3n\xbb\xc5x\xf5h2^\x8a'\xf4`;&@뷨\xab\x02Fe{\x8e&b=VHҜV囮\a|Rƀ\xe5o\xa3\xb2:\x93\xa4\x15\xdf\f\x18-\x0fH\xd2 =:\x1em\xb4\x9b/\xcc\b\xf5\x88\xd8<\xd31\x01z\xbfE]\x150*\xdbs4\x11\xea\xd1(I;\xb4R\xab$UY\xfe8*\xab3Nj7_\xd8\xe9!b\x84zD\x84\xe9\x98\x00\xbd\xdf#dT\xb6\xe7h\"\xd2c \xcd\xdc\xf6ˤ\U00056fce\xca\xea\xa4I\x1d\xe6\v/\xe9\xc1tL@\x82\xea\xd1,IA\xa3|\xfeQ\xf2nj\xce\x1b\xe7K\x9e\xf8\x80\xa2\xb2\xab\x13\\1ޗ:\xa7U\xabJ\xbf\xe8Y2>)eZ\x15s\x94\xeeZ2.)u\x0e>\xafO#\xc3\x1ac\xff\xae&\xaf:\xb0\x1eʊq\xbe\xf1\x0f\x98't\xbbf\xdaf\xa7\xa6\xccj\xc7zTK\x13\xb5I\x9bɋG>'s\u007fN&Q\x1d\xae\x96\x1e\xed]\x92曄\x06\x9c\xd5\x13}i+\xa8\xf1B\xcfj\xdc\xe5\xb6p\xdbFnj\xbd\xf5\x88\xb4D\xb5\xb6\x1c\x9e\xc7\xe8\xb7ޖ\xb9z\xd69t\xe8\x85\xd9oω\xd2j\xd5}Dz< M\xb0LY&I\xe3&\xa5\xa1\x1f\x9f3\xabӚ,\xf9&\x8d\x97\xa4u\xaa\xe5EW\x8a\x94\x9a>\x01\rl\xa96꒤\x94t\xd4\x06\xda\x02\xeb\xf2|Ҭ\xbc]\xfa\x1fj\xf2$鶼 ڨh\x11i\xa9\x924q@\xdf\u007fv͔KR\xda$_R\x06ډ\x9f'I]d\xda\x04\xa9\rͽb\x9c\x94\x82\xe7\xfe\xc6\xd2\xe1jiY\xaa\x94擤\x86%\x92\x0fM\xcbP\r=\x9a\x92\xb5.\x85\xafό\x8eY\xf4\xa0[6\xe71\xfa\xad\xb5E\xad\x9ee\x0e\x1dza\x11\xb6gl\xe81[Z\xc0Nh\x96\x92\xf1A\xa1-Ez\x94^\x9d`\x8a\xb4\x1a\xad\u007f[\xaa\xd4`y1Gz\x00\xed\xe2S)\xe6\x86WO%I\xebд\x06\x9fT\xadF:\xb9H\xe3ѡ\xaa9I\xaa\xd1\xf7\x9f]3\x92\x84\xb4\xfa|\x169\xf8ܦ\x89y\n\x9f\x00\xd1\xdc\x13\xd0;\xb3ɇ\xff\xcet\x18\xfdeb\x97:\x90'\xf9|u\x03j\x83$\x9dқ\xefM\xc1\xed\x0fl\x96|\xe6\xbb\\\xeb\x98E\x0f\xaaez\x1e\xbdߤ-f\xf5\x989t\xe8\x19#lO\xb5\xae\xdc<\x90\xb9\x87H\x8fiV\x89WK\x0f뿗ѫ\xb3Z\x9aM&\xd7\xe1\xa3\r\xf3b\xbc\xb6\xf7+\xf3\x9a\xc3mܦo\xf1]R\xea@D=\xc8\xc1`\t^\n\xd9\xe66\xcd,\xd0\xfav\x95\f\x8f\x9a\xb4\x81\xd1\xfd\xd8\x124\xf7ym\xee%\x96\x0e\xeb\xedvI\xd2fw\xd8\xeb\xa1\x1d\u007fj\xf0o\xb2\xff\x067\xf3\xb9\xd1L\r\x19ٮ\xc0ǒ\x16)\x9d\x9a[\x1f(R\x1d\xae\xd6\u07b7h)x$\x88\x8e?\xe5z-\x9f>t\xa1\xb1Ճj\x99\x9e\x87҃]=K_\b\xec\xc2춧W\x10鱙\x1e\x9a\xb6\xe2-P\x99\x86\a铦1\xab\xa3H&\r\xcc\vt$_\x90\x8c\nI\xcb\xc2C\xb3\x0e)I/\xcd\xc6wRx\x17\xb6\xa6\x1e\x83\x9b\xe9\x91$\xad\xd0H\xf4h\x97\xd2\x06\x90\xcd\xd5\xd4\xdcڌt\x87\xf5\xbf\f\xd2\x03\x1dN\xa8Æ\x8e\xad\x1ef\xcb\xcc<\x94\x1e\xec\xea\xb1}!\xb0\v\xb3ݞ^A\xa4G\a\xb5*=RR;\xbeӼ\xa4\xee\xd4U\xf4\xdbr\xf48\x1f\x9e\x87y\x81\x19h[7I2W\xba'\xfc\xf6\x9a\x16\xf9\xe81H\x8fA\xcd|n\xdcj\xa8Ӯ\x8b'H\xad\x03\xc9I\x9f\xab\x16=\x98\x0eG\xd2C\x95\x84G\x8fuV=\x98y(=\xd8ճу\x99\xd1~{z\x05\x91\x1ehH\x18\xbe\xe7\xb4\x1a\r\xb5\xd0\xf9T\x1b\xbb\xad`W'M?\x9d\xaam=\x03신6\x02\xaf\x96\x92\x8c\xa1Ào\bc\x0f\xab\x1e\x83\x9bQS\xf5f\xd6i]\xdc,\xadn\xd1\xf6\x01\xbdK\xd8\x0eG\xd4c\x82>\\j\x98Ui4\xafw\xac\\?\xbd.\x19\xa4\a=\x0f\xa5\a\xbbzvzP3Fڞ\x1eA\xa8G\x8d$\xd5i\xa5&\t]{)\xba\xf9W\xc7\xe1\xadf\xae\xce\x12)\x9d\xec\xb6f|\xb1F\xbfP\xf4=\xd1E\xedWch_#\xa5|3D=\xec\x9a\xd1/\x06\x06t\x83\x83\xd2\xf8՚\x97\xf4.a;\x1cQ\x8f\xd5\xfaޛ\xad]\xd2\x10\xb4\x8e\xd5i\xa7Wt}dՃ\x9e\x87҃]=;=\xa8\x19#mO\x8f \xd4C\x9d\x83\x06MmW\a\xba\xee\x97\xf0Gr\xc8v|5\xd97K\xc2;\xce\\\x9d.\x9f\xb4\fm\x9f\xf6T|\xa5ü\x98%\xcdB\xbb\xe2j\x1euC\xebT\x92\xb4\x19\xed\xe4\xc6d|\xe1`\xb9w\x9d$5|3`s\xf4\xb0i\xa6\xc7'=:\x80'\xe9\a\xb8\f)9\x85\x1c\xd6-G\x0f\xaa\xc3\x11\xf5\xe8I\xc6]\x1axDJV\xc2\xedk\x1dC\xe7\n\xf4\x97\x9e\fi\x90\x1e\xcc'I[@wE\xef\xd8@\xf5$_j\xde\xf9\xd6\xc1z\xd0\xf3h\xfd֧S\xabg\xab\a=c\x84\xed\x19;z\xc4\n\xc1A\x9f(\x03#$\x9e\xf4\xd8L\r+\x81Q!n\xf48\xdf\xdb\xe0\xf3\x99\xc3J`T\x88\x1b=\xf0\x00\x1a\x0e\x1e\xa3M\xdc\xe8Q\x99\x9c\x06v\x8c:q\xa3\a\x10\r@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\a\xc0\x01\xf4\x008\x80\x1e\x00\a\xd0\x03\xe0\x00z\x00\x1c\xdcУ\xa2BT\x03\xf0\b#\xd5c\x9b,\x1f\xa3^\x9e\xce?\x19\xb1\xaa\xc1_\xe5ݢ*\xa3\xc1\xdb3d\x8d\xfc\x90\xa8*C\x05\x9a%\xfb\xb2\xa8V\x820R=\xaetf\xd5S/O\xe6\x1c\x8fX\u0560,p\x05\xff:\xf3'QE\x13a]\x9b\n\xfd\xefeUt\"v\xcb_\xd9\xcc\x10\x99+\x9d\x9d\a\xe5ߋj%\b#\xd5CU\x03\xb4\x1e\xaa\xf8\x9dzy\xc6N\xf2\xbb\xa8LP\x91BX\u05f6\x82ֳ\xa3\xf25\x9b\xbfq\xe9\x06=tF[\x0f1[\x03_\x92\xdf\xf7\x89v9\x85\xb0\xaem\x05\xadg\x97w\x8a\x95\xb5\x00z\x18\x88\xf4\xb8^V\x98U\xb8\xe1\x02*]Ȓ\xe5\xda\xcbe\v\xb3\xd7~\x8b^]\xdeR\x90\x95\xbf\x1e\x9f%\x02\xbbw.\xcd^\x8bKײe}$\xf2:*ԫ\xf5\xe8\xe7\xeb\xe8\x80r\xb48g\xe9\xce~\xbd\xc1ϲ\xb6\xa3\x9f'\xf5q\xc1*\xce\"\f\xe8\xbatc\x9dk\v\xb3\n\xd6/\f\xb1\x15(\xc2\xe2\xfe\x05\xb5\xbb!T(˹!si\xdf\x16d=]Xxf{n\xe9u4\x82\xca:XQ\x98\xbbA\x1fr\x84\xf5`\xbb\x9e\x80\x88\xf48)W\x9cy}\x83܍\xce\xe5\xaf\x1f[\xb88\xa7pgٌ/й>g\xd5\xfe\xd3\xf5\xf2\x01T# /=v\xbc`\v\xae\xdc\xdd٩\xed\x92\xeb\x9dsk\xbfR\xbf\xaa\xcd\xed\xbc\x8e\xc7z\xdb\xdf:\x98\u007f\x9f\xfe\x1e\xae\xc8\xc2&\xf5\xbf\u05f9\xf8A40\xf8k\xe4E\x84\xa1\xebR\x8d\xfda\xc6\xd6\xe3\xa7\x0f\x15\xc8߲\x15(\x02\xb5\xfd\xfde\xf8L\x16\xfa\xa0^\xfe@=:\xe3\xe8G\xf4\xd2\xce̕w\x96\xca\xf3\xf6\x15\x1cP\xffr,K^\xb8\xaf~a\xf6%2cX\x0f\xb6\xeb\t\x88H\x8f\xfech\a\x87\x96o /\xee\x93\xd1;-\x84&\xf4\x17\xaeE\x9b,\xf4:>\xab\a\xf2\xbfF\xdb1_\xaf\x9f\xad\xbfc+\xf0Ѿl\xab\x8a\xf7\xc7Q\x15oq\xed\x02糬mz\xcd\xf0\xf9\xc0~\x11\f\xe1\xbaTc\a\xf3\xf1!\xe6`n\x88\xa9@\x13\xc0\x87\x94\xf5\xa4\x18\xdaZt\xadp\x1f.QK\x9b_\xa6\xbe%\x9fT\xb7\xe2\xeb\xec\xc0B4\xf9Za\x11\xa9m\xe8\xc1v=\x11\x11\xe9\xa1^;\xb8\xf6\xae\xb9\xf2rR\xbe/\xa0\xbf\xabߖ?\nW\b\xe0\xad[\x1f\xd0_\x19z\x9c\xc9\xeeW\xfb\xb3;Q\xa9\xec\xaeз\x88B\xedfǶ\xac\xcf\xf4\x9a\xe6\x1e\xb5]\x04C\xb8.\xd5\xd8\x17\x85\v\xb7\x1f\xfa(\x14b+\xd0\x04*\xba\xbbu\xeb\xd4\xfe\x9f\x16\xacת\x9aK\x9b\u007f\f\xed\xfa~u7\x9e7@.\xb6\x0fj\xc3XC\x0f\xb6뉈H\x8f\xee\xfc\xc2\xdd\xc7;K\xf5}W\xa4O= \x9b\xe7cr:\x19\xa4Ƿ\x05\xc7\xd5\xe3\x05x\x87,\xd7G\x06d?]\tl5\xe6\v\xefQ\xfbE0\x84\xebҍ];T\xb6T.\xd8\xcf9z\xa0\xbe\xbc}Z\u007fq\\~\x8f\xfc\xa6\x966\xff\xb4ڝ\xa5\xeaz\x90~w\xca\xe4\x02\xd9Ѓ\xe9zB\"\xd2ci\x11\x16a\x8b\xbe\xef\xb6\xe8SO\xcb\xe6}\x06{=\xd4\xed\x1b\xd4-x\x10\x8aނ\u007f\"\x90\xf7\xe5N\xd98xh{\xf4\xf0\x17\x91\x16\xc1\x10\xaeK5ֽ\x1b\x89q\xedX\xf6A\xa6\x02\x8d>4\xbd\x80\x97|e~\xed¯\xf1+jiX\x8f\x80\xa1\a\xb9\xda>$\x93Ӛy\xf4\xa0\xba\x9e\x90\x88\xf4(Ļ+\xf4S}\xdf\x19\xef\xd1\xeb\xf3K\xf1\x9bv;ަ\x11\xf4\xf8 \xf0e\xe0\x03\\8\xad\x9d\xbak\xf1\x99\xffK\xf3ࡖ\x96\xa2\x9d\x86\xfff\xbf\b\x86p]\xaa\xb1z\x99\x1c\x18J+\x98\n\x88\xcf\xf6\xe9\n\xeaz\xccG\xe7\x8dPQ\xadZA\xfaL-\x8dѣ\x00\x0f\xa9\xee*%s\x18z\xd0]OLDz\xd4\xcbe\a\xf7݇\x8e\xe1\xdd\xdf~@\xae\x0f\xb4M\u007f&pϡ\xb7\xb7ˇ\xd5/;\xb3*\xbaC\x1fUdu~\xa9\x86~\x8f\xae\\*:;\xc9;0T\xb8\xb6P;\xd9\xef\x9eQv\xfcx\x05\x19\xe5\xed\x9caޭ\xae\x0f\x1c8^\x9a\xf3E\xc4E0\xbd0\xeaR\x8d\xd5\xcb9\xb5'Q\xf1\f[AU7h\xc3Q\xe3\xaei\xe7ܝ\xfd\xefm˿\xa2~6w\xfb{!ji\u007f\xc9=\xd0\u007f,\xebB\u007fY\xe9\x15<\x8c]u\xec\xf0\xe2\xdcOИ\x06\xdf5=\xd0\xd9\xc9.-A\x11\xe9\x11:\xb08\x90_vxqV\xe9\x05\xed<\xac]\t\xa8\x9f\x94\x15\xe6\x14\x1d'\x9f\xb9\xc8Y\xff\x9e\x83~nS\xff\xa0\x9f\xaa\x0f\x91\x1a\a\x02\a\xf46N\x97\xce\xcb-~[\xc57F\xa8cCh{n\xf6\x83ݜEP\x84\xebR\x8d\x1d}\xb0\xbe0k~\xe9\x19k\x05\xf5p>\xe9\xc0۲\xc1\x81\xd3\xe8\xc7Nu\xbb,\xcf8c.\xad\xb8@\x96\x8f\xe5\xc89\xc7\xc8\xd8\"\xb0\xb3bna\x19\xbea\xb7U\x9f\xab\x8cYZ\x82\"\xd2cTyZ\xb6ޚ\xf0\fý\xf7\x9b 8\xaa\xc7\xd6a\\!\xf6\u007f\xa6\xe1\xd0-K\xd0\xc3\x16G\xf5\x18\x0e\x0f\xea\xc7\xf8\aE\x15G\a\xd0\xc3\x16\xcf\xea\xf1\xc9I\x8dOD\x15G\x83+d\x80-\xaa\x95\x80xV\x0fG!\x03\xec\xc1\x17L\x00\xe8\x01p\x00=\x00\x0e\xa0\a\xc0\x01\xf4\x008\x80\x1e\x00\a\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01ppC\x0f\xc8\xd8\xc6\f#\xd5ct2\xb6C\x99m\xb8\x8cj\xc6\x16M\xc4\xdf^9 \xcbV\xb5\xa3\xd1u\xef0R=\xbe{ƖF4\x9b\xeb\x19\xdb/r\xf6\xe3/\x9c^۟c\xfd\"\xbd\xd9ua'c\x90\x91\xea\xf1\xdd3\xb6\f\x82\xd9\xdc\xcf\xd8.?L~\x1d^>\xa8r\xb8\xeb\xc2N\xc6 \xa3\xad\x87\x18#c;\x1c\xdc\xcf\xd8n\xa9%\xbfjm\xbfH\xaf!\xecd\f\"\xd2#J\x19[u\xa9>0(\xa6g\xb3D]u<\x91\xb1ݭ\xed\xfb\xb2\xdd\xccv0\xbbn\xdfI\xfb\xd0p\f!\xd2#J\x19[5@\xc6\x05E\xf2~z6K\xd4U\xc7\x13\x19\xdb\xc3Ejw\xe1\xef\xd5\xfb\x0e\xb1\xdb!\xdcu\xfbNڇ\x86c\b\x91\x1e\xd1\xca\xd8֣q\\\xa8B>h\x99\x8d\x89\xba\x9a\xb8\x9f\xb1\xed,Pwg\xedV\vp,\x94\r\x02\x87\x93=v\x9d\x8c\x14\x1a\x8e\x15DzD/c\xab\x86\xcaf\x84\x03$a=訫\x89\xfb\x19\xdb/\xe4\xfe\a\xb7\x16_\xd7B~L\x10x\xb0\x1e\xcc\x1aۇ\x86c\x05\x91\x1e\xd1\xcb\xd8\xf6\xaf\xcf2\xaff\xc3z\x90ߝ\xb2\xe5\x1a\xd1\xfd\x8cm(p)\xe7O9\x97\xb2\xb4\xa5\x15QK\x19\xac\a\xb3\xc6LݘC\xa4G\xd42\xb6\xd7\x1f\fP\xf1\xa2\xb0\x1et\xd4\xd5\xc4\x03\x19\xdb\xc5\xfb\v\xd5\xc2\x03\x8b\xc9t&\b\xcc\xeaa\xe9d\xa4\xd0p\xac \xd2#Z\x19\xdbkE\xe4\xccs\xb2\x94\x9d\x8d\x89\xba\x9ax c\xbb\xbex\x8b\xba\xa5x-\x99\xce\x1c\xab\xc2kl\xd7\xc9X\xbf\xdc\x15\xe9\x11\xa5\x8c\xed\xb5\xe5\xf2>|\xe9\xb2\x15\xed\x1ez63\xea\xca\xf6\xc2\xfd\x8c\xed\xce\x19\xfb\xd5\xfd3\xd0\xf1\x90\xde\x0e\xcc\x1a\xdbt2bh8V\x10\xe9\x11\xa5\x8c\xedGYz݅*3\x9b\x19ue\xf0@\xc6\xf6\xad\xec\v\xea%|\x03\x9d\xde\x0e\xcc\x1a\xdbt2bh8V\x10\xe91\xaa\x883\xb6ý\x05;j\xb8\xb6`o\xe3\xa8\x1e⌭\xb9\x97 c\xeb\x05\x1c\xd5C\x8c\xb9\x97 c\xeb\x05<\xa5\a\x1du\x85\x8c\xad\x17\xf0\x94\x1e\xaeE]][\xb0\xd7\xf1\x94\x1e\x80\xd7\x00=\x00\x0e\xa0\a\xc0\x01\xf4\x008\x80\x1e\x00\a\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01ppC\x0f\xc8\xd8\xc6\f#\xd5#A2\xb6\x87qC\x05k\xcd/`\xdb\xf2Y\x96\xbc\x94_#\xd6\x18\xa9\x1e\t\x92\xb1\xbd~T\xde\xd7y\xb8x\xc6\x19\xdbY\fB\xdd\x15\x015\xae\x18\xa9\x1e֏\xc2\xc5\xef\xd4\xd8\xcc\xd8^\xc2\xdfl\r\x15/\xb6\xabNQ\x0fzX\x18\xee7%b3cK\xf4P\x0fʂo'%\x9a\x1e\x90\xb1Ֆ\xa6\xe9QV\xc8N5\xb7\x0e:)\x95\x15\xe6n\xd1N.\x90\xb1M\xb4\x8c\xed%\xf9\xad\xfe\xbf\xee\x96\xf7\xb1S\xcd\xc6\xd4\xcbs\x97\x1e>\xbeV\x0e0\x15 c\x9b \x19\xdbK\xe4\xf8T\x16b\xa7R\x8d\x15/\xee\xc7ŀjYc\xc8ت\t\x90\xb1\xbd$\xef\xef>Y\x9c\xfd\x19;\xd5l\xec\x9a\x16f\xa8\rX*@\xc6\x16\xefٸ\xcfؒ\xb1\x87\xe6\x005\xd5l\xac[&\xd9}\xb2\x1d c\x9bp\x19[mh:\xb7\x96\x9dj6\xf6\xb5v\x9e\xdc\x1aP-k\f\x19[5\x012\xb6\x9a\x1e\xf9;/죧R\x8d\x15\x15\"\x1b>\t\x04\xd8نpM\xeeiDz@\xc6V[\xda\x05\x19\x1f\xebJ\xd7W,g\xfb`4\xa6^\xca.\xac\xaf͕\xb3\x8e\xfe\x052\xb6\t\x97\xb1E\x95\xf05\xf8\x85\xc5\x05'\xe9>\x98[\a]\xd9n\xc8]\xb8\xfbh\x96\xbc\x8d\xaa\x00\x19\xdb\xe1\x00\x19\xdbX\xc3Q= c\x1bk8\xaa>o5\x06\x00\x00\t\x1cIDAT\x87\x18\xc8\xd8z\vO\xe9\x01\x19[\xaf\xe1)=\\\x8b\xba\xba\xb6`\xaf\xe3)=\x00\xaf\x01z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\xa0\a\xc0\x01\xf4\x008\x80\x1e\x00\a\xd0\x03\xe0\x00z\x00\x1c\x04zX\"\xb4\x14_W\x14d\xeb_\xee\xf5|B6Q\x9fB;r\x04zX\"\xb4\x14\xa5\xf9\x87\xb6fk_(\xf7|B6Q\x9fB;r\x84'\x97\b\x9ft_\x93\x0f\x9a\xe9\r\xc1\x1b\xdc\xfd\x84l\x82>\x85v\xe4|W=.\xcbC?*\v\xbf\x8d\x1b\xf5\x84l\x82>\x85v\xe4\x88\xf5ؾU\v\x9f\xa2a\xc8Q\xfd\u007f\xb0\b\xcd\xd3\xc6\x05\xf8\x8b\xeafB\x16M?\xb4*\xfb\xa7\a\xd9\xfd鉄l\x82>\x85v\xe4\x88\xf5\x90W\xbd~ly\xf6%m\x18\xa2\xff\x0f\x16\x1fu\x1e\x93\xeb;;\xc9W\x86\xc3\tY\x9c\xf2\xa8}\xab6\xf0\xbf\x99\xf9=\x91\x90MЧЎ\x1c\xb1\x1eK\xd1\xfb\xa8\u007fq\x91\xca&Z\x98\x93\x8b\x9eR9M\xb2 \xa7e*\xdeDp?!\x9b\xa0O\xa1\x1d9b=\x9e\xc6?\x0f\xe1\x11\xa2H\x8f\nm\xe4w\x8f\xf5\xea\xd1\xfd\x84l\x82>\x85v\xe4\x88\xf5 ۏ\x84OEz\x14k\xef\xf5\xf5E*\x8b\xfb\t\xd9\x04}\n\xed\xc8\x11\xebA§\x87q\xf8\x94\xec\x84Z\xce\xd1\xe3.\xbc\xf9C\v\xc3)k\x1d\xf7\x13\xb2\t\xfa\x14ڑ#\xd6\x03G!C\xf7\xe0\xf0i6\t\xabF\xd6\xe3-r\xbe>&\xbfei\xc2\xfd\x84l\x82>\x85v\xe4\x88\xf5\x90\xd7~p\xba\x98\xa4^\x8b\xf3\xf7\xef+\")R\xedʅ|\xf5\x9fNȖɻO\xee\x96\amQ\xf7\x13\xb2\t\xfa\x14ڑ#\xd4\xe3\x9e\xfa\xb2\x1c=\xf5z\xb94;g\xedӲ\xbc-\x94K\xce\xceY\xf8:\x90NȆ\x0e.\xcf^n\xb9\xef\xa1z !\x9b\xa8O\xa1\x1d9B=b\x02ȸE\x89(\xe9\x01\t\xd9\xf8 Jz@B6>\x88\x92\x1e\x90\x90\x8d\x0f\xa2\xa4\x87\xa3@B6jă\x1e@\xd4\x00=\x00\x0e\xa0\a\xc0\x01\xf4\x008\x80\x1e\x00\a\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\x03\xe8\x01p\x00=\x00\x0e\x02=\xe2#c\xab\xaa\x17\xd6\x17\xcc}\xf0\xcc\xf2\xf7l\xe6\x18\t\xecҢ\xb1\x1d\\F\xa0G|dl\xd5?e\xad?~t\vy\xf0\xe1\xa8\xc2.M\xb4\x1db\x10\xe1\xc9%.2\xb6k\xf1\x17UC\x15\xa3\xae\x87\xca.mx\a\xbaX\xe0\xbb\xea\x11[\x19ۅ$c{A\x8e»\xdbfiq\x84X\x8fx\xc8ؖ\xcd\xc7\xf9\xca\xd0[\xe4p\x17~\x04\xaf\xf9\x14Z\xd4\xc2!\xfdi\xbcTqHq[ci\xcc\xd3xmZ\xa0\xd68\x86\x10\xeb\x11\x0f\x19\xdb\xcf\n\xe5\xb5\xf5\x1fh;\xc6|\x04\xaf\xd9\x18n!\xbf~\xff\xdc-LqHq\xdb\xf0Ҙ\xa7\xf1\x0en\x81Z\xe3\x18B\xacGy\xa2\xaeZ\xbb\x98y\x04/\xfd\x8c^[=\x86\x12\xb7\xe5\xeb\x11i\x8dc\x05\xb1\x1e\xf1\x90\xb1-\xc0\x0f\x99UCx\x0fS\x8fय़\xd1k\xab\xc7P\xe2\xb6|=\"\xadq\xac \xd6#\x1e2\xb6\x05\xf2\xfc\xfa\xd3\xc7K\xb3\xf1Z\x84\x1f\xc1K5F=\x8d\x97~0\xaf0nK-\xcd\xdc\x0e\xf6-\xb0k\x1c+\b\xf5\x88\x8b\x8cm\xd1\xe1ڥ9\xf9\x1b\xb4ԍ\xf1\b^\xea)\xb4\xd4\xd3x\xe9\a\xf3\n\xe3\xb6\xd4\xd2\xcc\xed`\xdf\x02\xbbƱ\x82P\x8f\x98\x00RrQ\"Jz\xc4s\xc6\xd6\xe1us\x95(\xe9\x11\xcf\x19[\x87\xd7\xcdU\xa2\xa4Gu4\x87\xeap\xc66\x91\x18\xba\x1ej}N\xa9\xf5s\x11o\x00\x19ۨ1\f=\x80\xc4\x03\xf4\x008\x80\x1e\x00\a\xd0\x03\xe0\x00z\x00\x1c@\x0f\x80\xc3\xff\a'\xa7c\x12\x8d\x96\rF\x00\x00\x00\x00IEND\xaeB`\x82", + + "analysis/callers1.png": "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x03\xa2\x00\x00\x01.\b\x03\x00\x00\x00\xa3\xcb_?\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x00\x01\x00\x04\a\x03\x06\f\x0f\n\r\t\x10\x12\x0f\x17\x17\x13\x1a\x1a\x14 \x1f\x19!# #$\"%$\x1d$%#&'%'(&+)\x1e()'++$*+)+-*/-!,-+-.,02/52'241574796<9-9;8:;C;=:=?#CxAB@CDBDFCKHe\xafac`*{!Ag\xb2ceb)|*dfcfgeghfLi\xafDl\xb0hjgqjR\\k\x88/\x82/jkiHo\xb3/\x858Jq\xb5mol;\x86:pqoUt\xb4>\x89=|t]tvs@\x8b?swzB\x8c@vxu@\x8dG\\{\xbbxzw]~\xb7K\x8fJ{}z\x85}d}\u007f|O\x93N\u007f\x81~c\x83\xbdN\x95Uu\x84\x96\x81\x83\x80W\x95V\x8e\x85gm\x87\xbcZ\x98Y\x87\x89\x86]\x9c\\\x89\x8b\x88\x95\x8bm\\\x9dcs\x8d\xc3d\x9dd\x8c\x8e\x8bf\x9fg{\x90\xc0\x8e\x90\x8d\x90\x92\x8f\u007f\x93\xc4j\xa3jz\x97Ɠ\x95\x92s\xa4l\xa1\x96xq\xa5s\x81\x9a×\x99\x96\x84\x9cƙ\x9b\x98u\xaaw\x9b\x9d\x99~\xaay\x9c\x9e\x9b\xa8\x9e\u007f\x88\xa0˞\xa0\x9d\x80\xad|\xa0\xa2\x9f\xa1\xa3\xa0\xa2\xa4\xa1\x92\xa5ʮ\xa4\x85\x82\xb1\x86\xa4\xa6\xa3\xa5\xa7\xa4\xb4\xa7\x82\xa6\xa8\xa5\x8b\xb3\x88\x95\xa9Ψ\xaa\xa7\x8d\xb5\x8a\x98\xabѩ\xab\xa8\x8e\xb6\x8c\x8d\xb8\x93\xab\xad\xaa\xb9\xad\x88\x9f\xaeέ\xaf\xac\x96\xba\x96\xaf\xb1\xae\xa3\xb2Ҙ\xbc\x98\xb1\xb3\xaf\xb2\xb4\xb1\x9b\xbe\x9bµ\x90\xb4\xb6\xb3\xb5\xb7\xb4\xa3\xbf\x9d\xac\xb7Ң\xc0\xa4\xb7\xb9\xb6\xb8\xba\xb7\xb9\xbb\xb8\xa5ħ\xb1\xbc\u05fb\xbd\xba\xbc\xbe\xbb\xbd\xbf\xbc\xafƫ\xa9ȫ\xb8\xc0տ\xc1\xbe\xce\xc1\x9b\xc1ÿ\xb2ʮ\xc2\xc4\xc1\xbc\xc4ٲ̷\xc4\xc6ú\u0379\xd7Ȝ\xc1\xc8\u07bb\xca\xde\xc7\xc9Ƽϻ\xc9\xcb\xc8\xc0\xcc\xda\xc7\xcb\xdb\xca\xccɿҾ\xcc\xce\xcb\xc4\xcf\xdd\xca\xce\xde\xce\xd0\xcc\xc8\xd3\xc1\xe0Ф\xcf\xd2\xce\xc8\xd6\xc9\xd1\xd3\xd0\xd1\xd2\xdc\xd2\xd4\xd1\xdeէ\xca\xd8\xcc\xd3\xd5\xd2\xcd\xd6\xde\xcc\xda\xce\xd5\xd7\xd4\xe7\u05eb\xd6\xd8\xd5\xd1\xd9\xe1\xd5\xdb\xd1\xd8\xda\xd6\xd8\xd9\xe3\xd3\xdc\xe4\xda\xdc\xd9\xe6ݯ\xd5\xdf\xda\xdc\xdf\xdb\xd7\xe1\xdc\xde\xe0\xdd\xf0\xe0\xb3\xdc\xe1\xe4\xdf\xe1\xde\xe1\xe3\xe0\xe3\xe5\xe1\xe1\xe6\xe8\xe4\xe6\xe3\xe8\xe5\xea\xe5\xe7\xe4\xe6\xe8\xe5\xe4\xe9\xec\xe7\xe9\xe6\xef\xf2\xee\xf7\xf9\xf6\xfe\xff\xfc\xbd\bi5\x00\x00 \x00IDATx^\xed\x9d\x0fp\x13\u05fd\xef\xe1%\xb7\xf7\xf8Y\xba\xbdvjW&\xbevs=n\xb1\xc7\xf6\x98\xa8@\x84\xc3s\x80\x90\xe0\x10\xee\x03'J\xe19\xaf\xb9\x81\xa4\x80\xfb\x9cb\x87ۄ\xbf\xc1m\xd0\x00Uq\xc1\xc4\u007f\b\x80\xb7D\x87\xdc\x01\x1f\x95\xe8\xf0\x1e\xf2_\x1b\xd8C:\xb8]\xae\xae}\x86\x12m\x8c\xb4\x9c\x8d\xeaFt\xd2%z\xa5$\xb1~\xd8\x04$\x9a\xe8!\xccI\"g\xa1\x92(\x90\x00|%\x1a\xd87\x82%\x89\x9e>F\x13\x8eu\x8a/B\x00\xb7\x18I\xf4\xc3\xd2g\x19\xa1\x8cR\xa2\xe7\x1e]P:\xf7\x9f\x17\xd0\xf4\x13\x8f\x94\u07fbU\xdc\xf4viI\xc9\xf3W\x9e\xba\xbb\xfc\xfb\xea\xcb\xf7է\xe6\xcf\xd9 wSCy\x85\xb9%\x14\xd2P\u007f^^RRz\x82l\xfdqI\xe9K[\xef-\u007f\xf4cU^u\t\x11Xu \xc8\x12U\x1eB\x01\xf3hd\x84\xbd\x17北m\x9d\x13\xd2;\x9aDpn\xe9O\x16\xcc\u007f\xf3\xd99k\x02\xe2\xdf\u007f\xc3\xfc\xd2\x05O\xbc-\x1d\xe2p\xe3\x82;\x9f\xb8\xa2\n\xf5\xce\xf8\xafO\xcd]\xb0u\xeb\xdc9'\x14\x05+\xce\xe2\xc7d\x1fiL\xae\xfeC]\xd90W\xac\xdaU\xfc\x8a\x94\xb5d\xa5\xea\x10\"GW\x96\xaf<\x1a}4@\x05_\x89zNbY\xa2m\xaf҄\xee6i\x83\xa1D\x1bK?f\x842\n\x89^,}\xea\xe5\xd7^\x9a[\x12\xa4\x19\x9f={x\xee\xca \x16N\x9cXp\xef\x9c\x05[\x9f*\xfd\x10\v\x1fJ\x88{\\\x99s\xefK\xaf|Z\xba;\xda\xde)m2\x90\xe8\xd5\xf2FF\x18F\xfar\t%G\xc5\xd7\xcf_\xdap\u007f\xc9\xdc_`\xd2\xceH\xd06c\xe5J\xcd^\x17K\xc8\xf7^\xfaZ\xa8\xf2\xb2%\x1a\xfe\x12F\xf2*KP\xa2S\x878\xa6\x8b\xb4G\x13\a\x93/\xe3\x97iK\xa9sBzG\v1\xff5\xfcV)\xa6\x12}k\xee\x82\xe7^>\xb7fe\xe4P\xe7J.\xaaB̪\xc3\xe1ҿ\x92\xc6.\xceV4\xb2[\x89bT̒\xe8#RE\x9fxH]\x02\xa0\x82\xa7D\x83~\u0090\xdb\xef\x0f\xe2a\x97ط\xc2\x01\x97\xfcȂ\x81D\x9f-\xbd\xc2\b\xc3H_.*\x98\x8b\xa4A\xf8\xfcD\xf9Q\xb1\xd7t\xf7E\xca_I\x16Ƅ\xe2_\xa9\xa41\x9d\xecQ\xe55\x90h$\xaf\xb2\x04\x05zu\x98\x98D\xf1\xb3O\xe0'\xe8\x04\x19\xfb\x84t\x8f\x16\x82H\xb4\\\x92\xe8\xfd\x0f\xd1\xc6V\x92(-\xf3%\xb1}U\x86\x98U\x87\x0fK\xbf\xff\xe1\xdb\xf7>\xa2\xb9U\x12%\xd1\xe7\xa3$\xfa\x9a\xa6\x15}\xe9CEv\xf1\x0fw7}\xbb\xbb\x11\xab\xcf\x18P\xc2S\xa2\x12>\xf9\xbeh\x97\xf8\xday@\xfeo\x8f-Q\x83F\x14\a\xee$\x89\x8dw\x8a_\xb1\xbdtx\x83\xd7W\x94k\xe0\xee5\xea\x10\xb3\xeap\xb1dnIɚ\xa8;]X%Q\xf1:\x11|(J\xa2\xc2\xfc5\xe4\x8a\xf0,\xbd\x00\xac\x11K\xbf\x1a\x1a%ˇ8+MSKcQ\x90\xa8\x0e\xbc%\x1a\xf4\r\xb9}~1\x18\xdb\xd3y\xa9Kz\xbaH\xf0\xf9ܝ\xbeq\xfd\x9d\xb6FZέ\x8cF\x94\xfc/?}\xf6i\xfa\xff\xbd\xb7d\xce\xf3g_n,yS\x8c\x9f+\xfd\xe1\xcb\xff\xda(&\aߢ\x13\x8a\xd1c\xd8\xf7\xca\x17\xec}\xfe\xce\xd2\xd2_\xbd\xa7\xc8+OT\xbeE\xae\x1d\xc2\xefΝ+o\xa4\x82D\x81\xa9 ~\x89^,\x95z\xb8\xef\x95*fh\x01^\x80D\xa7'\xd2\xfcLt\xc8&\xd8X\xdex\xe2\xcd\x13\x8d\xac\xc9t`\xca\x01\x89NO\xe8\xfċѡ\x1e\xaf<:\xbft\xfe\xf7\xa1\x9b\x9b\x14@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2)\x87\xe67a@Z\x03\x12M-|\xce<\xb4\xc4(\x13\x90N\x80DٴW\xfa\x8d\xb2ă\xbf\xb2\xdd(KB\x04\x8b\x8b]\xa7njr\x01\xe9\x04w\x892\f#\x02\xde\xd6}\xed\x031\x97L\xfer\xd7\xf2E\x9bn\xc4\xca1A\x965K\xef\x9dUy\x96\x02\xe7h(y\vj\xd2\xdb#1\xb6dl1ʒ\b\x03\xa8\xc3(\v\x90f\xf0\x96(\xc30\"\xe0n\x1f\x1a\xeds\xb7\xc5\xd2h\xfd\x83\xc7w.\xba\x16#\x83H0H\x16\xd7\x12\f\x87j\x9d\xfd\x91\xf8\r\xb4\x9e\xbe\xf7\xa2J\xf7IWQ\x9el2Ӝ\xe1f\xec8!<\x99\xcdFY\x12\xe0\r\xe45\xca\x02\xa4\x19\xbc%\xca0\x8c\xe8l%\xaa\xf2\xef\xeb\xd3\xdf\xeb\x9a\xe38\xbea\xa0\xd0w*\x8a\x8b\x17\xce..^\xab\xfb\xd3p\x99\x8a\x9ap\xe8͗%\xfa\x02:)\xbe\xfa\x90\x8b~\xbadY\xcf\xdaqb4X'\xb1cڋz\x8c\xb2\x00i\x06g\x89\xb2\f#\xdaZ\xe9\xa6N\x8f\xfen\x1f9^\xd7\xdf(!X\x90\xdd>3\xdb^1\xa3\xc1\xc0e\xa4lY(Z\x86\x1eȖ\xc5H\x97e\xe9C\xdd\xf4\x83s\x96\x91\xcc\x13 0\xcbi\x94%~@\xa2\xd3\x0f\xbe\x12e\x1aF\xf8\xa4V\xa6\xfb\x05\x9d\x9d\xae/wPvc\xbc\xcb\xe18\x83?\xadv\xac&a\xf5\xa9ݫ\x17m\xfa\x8c\xe6\xf9\xf4\x99\xe5\xffm\xf3W_\r\xff\xe7W\xffu\xcb=\xd2D\xcf@&B\r#\xab\n\xb2\xaa\x88d\x9b˲\xcbH\x8fӃ$\xcaH\x96q\x1f\xce\r\xb7\x97A\u007fGA\x19U\xb7\x90\xf3$\xa3\x84\x10\x8a\xd4:\x94тG-\xa8\x18\xe3:dq\xad-ʮ\x92Υ\xa52\xbb(ܚ7dE]3\x12.!B\x17Ht\xda\xc1W\xa2\xba\x86\x11\xa4\xe7\xab;\xcaz\u007f\xf0\x8c\xe3\xd0\xe0\xe0_0\xfel\xb0\xfa\x10\xbe\xf1\x87]\xd5\x18_>S\xedx\xf0\xd0\xff[\xfa\f\xc91\xb8xݡ\u007f\x981cF\xb0fƌ[\x9a\xa4o\xb6\xd0z\xa0\xa0('\u007f\xed\n$~\xe9\x9d\xd6\x06O\x83u\x95x\x91\xe8\xf6\x16ٽ^o\xc8\xcf4,\xd1\v\xa2n\xbfq\x89\x86\xfd\xa8K[B\x18E\xaa\xcfki¸\xc7i\x15{\x05\a2\x91\xadi{\xce}$\x8b3\xa3\xce\xd3l+\x93G\xc5\xddѲJ\xb8\x84\xd0~\xe3]\x15\xb9\x93ؾ\x03)\x01W\x89\xea\x1bF\x88_dw\x8c\xbb\x1c\x91\x8e\xae(Q\x8c\x0fU\xd3p\xa9\u0602n{P\x8c\xae\xd7n\xba\x1e\xf4\xfd\xef\u007f\x10%\xfa7K\xb6\xbc\x13n\xb4\xcaм\x005U\xe8\xa0\x13\xa1\x1d\x886ݑ\x8e.VH4\xd8۵=?\x8fjԃ.iJP\x11I\xb5\x92\x89\xdf&+I\xb4\xe6\x8aB^e\xa3\xfb\x93ɦ^tP\xca=\x86\xb4\xfd\x83\xc4J\x90Y\"^Eb\x8c\x06\x80\xf4\x84\xa7Dc\x18F\xe0\x1eW\xf8\x86\a\x03\xb6Dw\x86\xc2\xf3\x8e\xf7E\x8d\x05\\\xa2D3\xfb\xfd\x91neYh\xa6\xc6YLߊ騐-QB \xbf\x8a\xbc\xb5\xa1p]ʘs=\x91T\xa5\xc0\x9c\xa1\xf0\x81B\x81\x90/\x8fAǢ\x94\x96x\t2c\x1d\xaebhE\xa7\x1d<%\xaao\x18!t\x86\x96\xa5gÖh8<\xee\xb8N\x12Z\x89DG\x14\x03\xbf\xb2\n9\xa8\xbc\x87\xbe-\xac\xa4\xa9\f\x89ʺn\xca$\xef=\x91\x9ei\xb8\x04\x15\x91T\xa5\xc0\xc2a\x99<ޕ\x9f\x02\xea\x95'\xa1&^B\x04/\xea\x8dN\x02\xd2\x1c\x9e\x12\xd55\x8c\bxZ|1\xf7\x8c\x92\xe8\xfe(\x89\x9ew\xbcK\x12\xb4\x12\r\x89\xd1YH\xdf\n#\xad\xe8>\xb9\x15\x93$*\xe4J9\x9b\xe8\xccN\xc0\x1a~nA%\xe70\x91T\x9a\xb3!J`+\n\xfb)rϽɢm\xf9\x12+!\x02\xcc\xe8N?xJTBk\x18\xe1?xD\xfc\x12\xc7rd\x8fHt\xd1~\x8co\xd4GI\xf4ڃ\xf5\xa4\x19\xfd\x9f\xba\x12\xf5о\xe6Ai$g\xb7c<\x8e\xa4;=\xa1V4\xaf\x8a\xbc\x06\xf2\xa5f\xab\xe6\x8e\xd0<\x8d\x91D\xb3\x9f\x14+^\x11%\xb0\x0e\xa9\xf0\x8d\x9bi\x96`\xf1\u009b,A\x01Ht\xfa\xc1[\xa2\fÈ\xb1}\aG}>_w\xab\xde>Ҍ\xee\x1f\xe8\xf3\u007f\xf5\x0f\xfe\xf2\xd0:G\xf5\xa9\xcb\u007f\x19\xac\xde\xf5\x87\x1b\xef\xef\xaa&3\xbd\x83\x8bV\x1f?\xbf\xfb\x1fU\x12\x15z\xe8ܭ4\xac\\\x91\xb1\u07b3>c\x05\x8d\x9b\xac\xdb\xdb\xe6e\x93#\x8f{\xbdߨ\xf1\xf6\x88zlAU\xae\x93\xcd\xf9\xf2\xd3E\xefdlה\x10F\x95Zi۲\xb9\x12e\xba\x87}^\x8b\xb3\a\xf7;-^\xb1\x88\xf5\xe8\x81\xd6v'\x92\xa6\xc2v \xc5\xd3L\x13*AA\x1f\xa3\xd3\f\xa47\xbc%\xca0\x8c8&\x0fP\xf5&+\xaf/\xa5\xb7E\xab? \x1f>\xaa_\xb4x\xd3~\x87c\xd7.\x92\xf4\xfeb\xf1u\x97\x98\xfc\xc13\xb5\x8b\xd7\xfd\x1f\x95D\a2\xe8pNj\u0082ͳ\xb3g7Km\xa3P\x97\x9be\xa7C\xba\x06\x9a#sD\f{\x96\xe4[\x8b\x1f\vu,\x1b\xbe\xde\x1d]B\x18U\xea\x88=+\xa7j#Buub\x92e([|\xad\x13\x93;\xec\xb6\\\xbbt\xe7כ\xf5$\x8e\"\xc1\x12\x94\x8cg.\x1b\x187|\xc4\x11H'xKt*ьE'\xcec\x16\xdd6=1\x0eZ\x9c\x93R\xa1\x10mŌI$ \x9d\x01\x89\xb2ّ\x1fé-~\xfc\xb3&\xf5\x87.\x84\xf1\x81\xd8Sk@\x9a\x91\x02\x12u\xc4\xcb?N\xa2D\x01\xc0$\x80D\x01\xc0Ԥ\x80D\xe3f2;\xba\x00`\x12@\xa2\x00`j\xd2G\xa2B\xf32\xf2\x18\xfd\xfan\xd0(\x90N\xa4\x8dD\x83\x95\xa1\x1f\xa3\x1d\x01\x8d\x02iD\xdaHT\xb8u\xf3W_\xfd\xe7W_\xfd\u05edK\xe0\xc7 @\x1a\x916\x12\r d\xb7ߚg\xaf\x98᜔\xe55\x01\xc0\x1c\xa4\x8dD\x05o~n\xee\x1d\xb9\xb9\xb9\xf3ހ\x8e.\x90F\xa4\x8dD\xb1\xe0\xbbt\xe9\xd2\xe8\xa5Kc\xd0\xcf\x05҉\xf4\x91h\xdc\xeb\xe8\x02@*\x91F\x12Mab\xd8SL\xb6\xe5\x04\x90jp\x97(\xc30\xc2\xd7q`Ok\xf74\xee\x9fF\xec)\x18\xfe\x15\x93l9\x01\xa4\x1a\xbc%\xca0\x8c\x18wy\x86dž\x8f\x1c\x98|\x8dθ\x19\x8c\n\x9f<\"\xf6\x14L\xff\x8aɵ\x9c\x00R\r\xde\x12e\x18F\\rQg\x97\xd8\v\x8cM\x88\x19_L\x1c~\x12\x8d\xd8S\xe8\xf8WL\xaa\xe5\x04\x90jp\x96(\xcb0BZ\xa6\xd6\xef\x9a\xfc\x9fA\xa6\x86D\xc3\xf6\x14z\xfe\x15\x93j9\x01\xa4\x1a|%\xca4\x8c \bc\xad\x9eɟ\x8a\xbdI\x89֡\xcc\xe6\xef\xe5\xe7\xde3\xa2)\u061dG۷\xb1\x1cy1\xcd\x1ce3\x97\xa0\x1fDȞB\u05ff\x82a9\x01L#\xf8JT\xc70\xc2\xefr\xb9ܓ?\x14\xbd9\x89\x06\xa9\x85C\xc1概\xec\xa1肗\xa0*\xf2&\xb8\x9b%\xdcJ\t%\xe8\a\x11\xb2\xa7\xa0\xb0\xfc+\x18\x96\x13\xc04\x82\xabDu\r#\xfc\xbe\xa1֩\x98.2\x92!\xfd\xa7\xb3\x8d,\xebi-\b\x90\xa5;+\xa3\v\x1e\xdd,\xa9g|T\"z\x11\x95D\xfc \x14\xf6\x14l\xff\n\xb6\xe5\x040]\xe0)\xd1X\x86\x11b\xdbsRwljB\xf4\xf7\xe27\xf5\x85\x1aS\xa2d\xfcg\xddH\x8aiF:w-GQ\x88\xa8\x85<\x13\xf1\x83hS\xee\xcc\xf2\xaf`[N\x00\xd3\x05\x9e\x12\xd51\x8c\x90\x9f\a\x1apM\xfa`\x94\xe8\xef\xf6\x17'(Q\xb2Ξ\xb4,}\x97f%\xdc\x10^\x8fD\xb4\xa9[\"~\x10=\xca^,˿\x82m9\x01L\x17xJ\x94m\x18\x11l\x91\xa6\x8c.\xec\x9b\x12\x89\xaaT\xf8\xf3\xdbf~\xed_\xbe\xf8\xe2\xb7߹\xf5\x96\xef\xfc9,џ\xff\xfd̿\xfd_$\xe3\x0f\xbe6\x93l\x9by\xdbO\xc5\x0f\xa4\xe5\xb4>F\x8aq\xa1D\xfb\xe0\x89\xf8A(\xec)\xd8\xfe\x15l\xcb\t`\xba\xc0S\xa2\x12\x1aÈ\x03\xc4XP\xec螎\xb9\xdbD\x88\x96\xe8\xcf\xff\xe6\xe7\x9f\xfc\xf6\xbb_|\xf1w/~\xf2\xef\xff\xe3\xbb!\x89\xfe\xfa\xef~\xfd\xc9o\xbf%jt\xc6\xed\xbf\xff\xe2\x8b\xdb~\xf0\xe7\xff\xf8\xf5\xb7\xc5\x0fĬ\xc1\x9aG\x86\x94\x85\xf6\xe8\x82G\xb7(Ə\f\x12\xf2\x83\x88\xd8S\xe8\xf8W0-'\x80\xe9\x02o\x892\f#\xdeq\x9d\x1c\x1e\x1b\x9e\xba颈D\xbf\xf9\xd3H\x83\xfa\xef_\vI\xf4\xf6߈\x1f\u007f\xff\xb7bL\x82[~/m\x9fA\xae$VTֺ\xe7\x8e\\\x8d\x1e\xe5\x19]6\x89\xfaA\xc8\xf6\x14\xfa\xfe\x15Z\xcb\t`\x1a\xc1[\xa2\f\xc3\b\xec\xebl\xdd\xd7\xd63\x05\xb7\xfe\xa2%:\xf3\xcf\xd2\xfb\xef\xbf}\xeb\x8c\x193C\x12\xbdu\xa6\b\xfd\xf8\x1f\xe2\xb6\u007f\xba\xf5\xbb\xffBTJ\x1f]\xb0\xaeu\xe6\xccZ\xa5}\xa6\xc2msi\xd2\xc2$\xec\a!\xd9S\xe8\xfaW0,'\x80i\x04o\x89r%Z\xa2\xb7\xca\x12\xbd\xfd\x9f~\xff\xc5'3B\x12\x9d)\xb7\x9br\xc6\xdf\xfc\xe0;\xb7\xfc $Q\xc50q\n\x89iO1ٖ\x13@\x8a1\xad$z\xbb\xdcѽ\xe5\x93/\xbex1,\xd1o\xfeH%Q\x91\xdf\xde\xc2W\xa2\xb1\xec)\xa6\xc0r\x02H)\xa6\x95D_\xfc\x9a4]t\xdb\x0f>\xf9\xcd\u007f\x0fK\xf4\xc5[\xff\xe5ϟ\xbc\xf8-9\xe3\xb7\xfe\xef'\x9f\xfc\xe86\xce\x12\x05\x00]\xd2^\xa2\xf4\x87e!\x8d\xfe\xf4\xef\xe9M\x97\xdf\xdc6\xf3k?\nK\xf4\x8b\x17o\xbfe\xe6\xed/\xca\x12\xfd\xf9\xed3o\xfd\xf6o\xa9D\xa5\x19\x1e\x00H*i/щB\x1f\xa3G\xc8\x12\xf5\xdc\x10\x00p\x06$\xaa\x03\xbf\x1f\xa3\x01@,@\xa2:\x80D\x01s\x00\x12\xd5\x01$\n\x98\x03\x90\xa8\x0e Q\xc0\x1c\xa4\xb7Do\x06\xa3\xc2\x01\x80\vi-Q\x00H}@\xa2\x80̤\xff\x16\x10\x98\x14@\xa2\x00\xc1\xe7̓~a\x0e\x98\r\x90(\x80\xc9OR\x8b]\xa7a\xb5^S\xc2]\xa2\f\xc3\be*gN\xda\xc2\xc7\xf5\xd7\xe5eUMVg\xefU[_\x9c\xa9\xfey\xb9[\xb4\xe1d\x10\u007f\x1d0\x1e@\x1d\x8cT\xc0\f\xf0\x96(\xc30B\x99\xca\x1bOvxm\xbdyy.gVY\xb8%ï\t\xe3$\x10ky\xf0\xf8\xeb@\x9c*\xa2\x97_\x02\xcc\x02o\x892\f#\x14\xa9\xfc\t7\x9b~Ԍ\x83q\x88O\xd4r\xae\xf1Bh/0\x97\xd5d\xa5Vl\xc6\xd9^M\x18\x17AW\xee\xbc\x18\x9b\xe3\xaf\x03Y\xc0\f~/`V8K\x94i\x18\x11IM\"#(ޮ\xf6\xd8\x12T1`\x90\xa7\x13uƙ:\xdb=\x86F4a<\fT\xa0{b\r\x1f\xe3\xaf\x03H\xd4\xcc\xf0\x95(\xdb0\"\x92ʗ@\x16B\x19t\x91\x16\xc1&\xad\x9a\xb9V\xb5\xfdr\xb5ñ\xff\xa3m\x0f/\xda\xf4\xa5z\xc7c\xf9\x19\xd4\xed\x81m\x18A\xe8C}\xf4=\xb0l\x96%\xff\x9e\x90\xa0C\xa9J\xaa\x1a\x96\xcc\x1e\xc8D\x99ê0\x8cn\x1d\x02k3\xf2\xc9EŸ\x0e\xc5r\x06\xbb*UM\x17HԴ\xf0\x95(\xdb0\"\x92ʙ>\xafW\xfe\xd1\xf6\x05\xefA\xd4\xe4\xf5\xaa\x87v\xd7Ϝ\xa9]\xbd\xb8v\xf7\xb6\xbb>\x8d\xda1\xb0>3\uf21ea\x04\xc1g\x93\x8a\xf2\xa0\xefu\xb5ޓѫNU\xb29\xc7\xda'T\xd9ɢb\x8a0\x8c^\x1d\xda\xf22\xd7\xd3n\xb9q\x1d\xacN\xaf\xd7\xdbU\x89\xb6\xa8R\x15\b\xe3]\x15\xb9q\xf5\xf1\x81$\xc0U\xa2l\xc3\bE*\u007f\xb2B\xeb*\xb0;\xba\x8f;\xea\xaf\xe1\x1b״\x1b\x86\xca\xd0c\xfa\x86\x11a\x02\xad\xe4\xab?;\xc6\x1d\xc7-ȅ\x03\xd9ǢB%\xac:ԡ\xb2\x90ьa\x1d\x9a\xfa\xc5a\xab\x13雔.\x11\x9b\xd8x{\xf9\x00wxJ\x94m\x18\xa1L发D\xab\xa3\x1bP\x19wn\x96K\xdf0\"\x82\xbf\xb9\xaa0\a\xcd\xd6ی[Q\xeeZ\xbcc\x96\xa0\x0eU\xb0\xea\xe0\xb6\xe6ʶ\xc1q\xd4Al'\x97!7\xd6e\xac\xc3U\f\xad\xa8i\xe1)Q\xb6a\x842\x95?F\x12]\xc7H\x14\xdb\xd0J\xb4\x90(B\xcf0\"Lo^\xfe\x93m^\xbb\xaeDdz\xd7v~}\xb4\xb0I\x1d\xaaa\xd6\xe1R\x15\xaa\x94\xdaQ\xc3:\x88\n\xad\xb2\x1c\xd1\xdfJ\xf0\xa2\xde\xd8\x19\x80\xa4\xc1S\xa2:\x86\x11\x8aT\xfe\x18I\xf4\x19F\xa28\x12͏\xb3cX\\INs\x99\xaeD\xdbŶツ\x9c\x80:Tì\x03\x1d\x8d>\x19_\xd3\x17\xb0[5\xbd\xe7(`F\u05fc\U00014a04\xc60B\x91ʟ\tH\xb43?^m`\x9cO\x9c#\x82e\xba\x12mC#\xf8\x02Z\x81\x83\x05\x97\x14\xa1:\x8f\x8eDɜ\xee\xacx\xdc\xe4\xfc\x15\xf4n\xabGc{\xa1\x00$j^xK\x94a\x18\xa1L\xe5\x8a\xd0\xe3\xf5\x92\xe9\xce@hF\xb7Gݎ\u007f\xf9\xc7\xc1\xd5\xf5\x83\x83\xd1#\xc1ev\x8d%\xb0.MhY\xf3\xe62dۢ\xa3\x80\xf1욶\x82\"K\xddf\x8b_\x11*2\xe8\xd4AbȾ\f\x1b\x12(F[\xbc\"Nk\x8cL}\xe0\xbdfZxK\x94e\x18\xa1L\xe5\xc9\x1b\x92\xb3\x03ra!\x97\x06\xaa;\x92\x18_vP6\xe9\xec\x1e\x0f\xc1\x1dEV\xdb\x03\xee;,zM\xd8\xe9;lu\x81\x93E\xb9ͪ0\xc2\xcd\xd7\xe1B\xa6<\x9dT\x10#\xd3x沁\xf1d\f4\x00CxK\x140'm\xc5\b~\x8cfN@\xa2\x80\xc4\xf8@2f\xd4\x01C@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00`j@\xa2\x00\a\\\xd9\r\xe2kO.\xf7_3\xa5\x01 є\xa0\xbd\xd2\xcf\b͈\xbf\xb2]\x9b\x18\xc8^\x8b\xc60\xbeϦY\xf5\x85\x01\xb3\x84i\fw\x89j\r#\x047]\x16E\xb3\x82\x1d\x10f\vjb\x84\xf1\x93\x88w\xc4Ͳ%C\xebzџ)\xccj\xc7㖍Q\xe9\xa3+\xf2\xb3go\x96\u007f\x1f\xef\xb2\xe7\xe4o$?\x88c\x95\xa0\x0f\xcfsK\n\xbc%\xca0\x8c\b\xb8.\xf8DL\xdd6L\n\x9d\xfdF9th\xcep3\xc2\x04H\xc4;\x02\x1b\xac\xb6=\xf8n\xec\xedؓ\xa9Yl\xb0\xd7\x1a,h\x15\xaf.Q\xebI\x8c|c\xf6v\xcfƜ\xd9t\x8d\x9c\x85\x19u\xed\r\xa8U\xa7\x04)?+1\xa1sKExK\x94a\x18\x11pM\x13K\xae\x8a\x1a\xa3\x1cl.Y\xd63\xc2DH\xc4;b\b\xc5^Tb\x9d\xce:-\x11\x1a\xac\xd1\xff\xa1\xfe\xcc=h(X\x18mo\xb1\xa4\x80\xf4\x9c\x86\xb3I\xe3\xba\xc4\xdaM\xd6gi\xd6)\x81\xc0\xaeY\"疒p\x96(\xcb0b\xdaH\xb4,\x8eeLX8g\x05\x18a\"$\xe2\x1d\xd1c\xb0\x8c\x91\xdeRJ\x11\x02\xb3\x9c\xd1I\x8f\xa1\x85\xe2\xe1\xa2ǘ\xc5\xd2B\x10\xf7U\x90\xa3\xd2\xfe\xfb\x88\xb4\xf2\x03\xa3\x04\xacW\xb3D\xce-%\xe1+Q\xa6aD\xbaIt \x13\xa1\x86\x91U\x05YU\xe4*\xd4R\x99]D\xdc%<\xf2\xf2$ed\x9d\xea\x8c\x16\xf5\xfe\x8d\xeb\xf4CX\xa2\xdb\x1e\xbe\xfe\xa5H\xedN1\xae\xdeOR\x8e;\xa4KƘtIRS\xa8sᨣ\v\x18\x97Y\x89\x80Dz\xe5>\xbd\xa6\x04\x9d\x9a)1\xf2\xe6HUxJ\x94m\x18\x11\xc2ۦ\xb7_\xeaQV\x11\n\xe4K?\xbd\xb6\xebH4\x94W\x95\xaa@1\x04S\x84:V\x16\xb11\xf2\xaf \xb0F|\xd7N=\xb3ڱ\xfc\x97\xeaV\xf4qGd\x01\xd1\xeaC$e\xd0!ݐ\xe9e\xac\xca\xebEm\n\xc3\xe50\x81\x9aLz\x17\xa9\xa6\x98~\\V&%\xb3J0\x98Ȋ\xe7\xdcR\x12\x9e\x12e\x1bF\x84\xd4\xda\x19\xa7\aC*\x10\x16\xe3\x8a\xc2~\x8a?\x9cJo\x05S16X\xd5y\xf5$\x1a\xb061B\xe3\x89U\x06F\xfe\x15\x04\x86\x10\xde\xdd/\x8a\xf3ڙE\xc7\xc9\az\xe0S\x9f\x92V\xf4]\ni9\xabw\x93M\xa7\xe4V\xb4ɢ\x9dw\xae\xb1\t\xd8\x19\xa9\xbe\x8c\xaf,W\xeaN5\xe4\xd0q\xce\x12\xf9z\xc5*\xc1@\xa2\xf1\x9c[J\xc2S\xa2\x12\x1a\xc3\b\x0f\xb5\x04\xf2\xbb/\xc4\xdc-\xa5\bˮC\xba\x17\xbfq3y\xb5\x8b]\xbdq\x9a@\xfas\xc1\x8a8%\x8ak\xee\bj\xc3\tI\xd4ȿ\x82p)G3f<\xe48O\xde\xeaw\xd1\xd7z\x8c?#\x03\xd0\xf3t\x14\x8a\xf7\xffR|\xa9^NƢ\x0f\xd7\xd3\xec\xc1\xe2\x85\xd1%`\xbfe=\xeeGM\x19j\x8bŁYE\x97\x88\xbf)\xb9\xe7IN\xfe\x12}\x94\x97]\x02\xb3f\n\xe29\xb7\x94\x84\xb7D\x19\x86\x11c\xae\x8e\x91\xb1\xbe}\x9etY\f]\xe8\xa1s\xb7Ҩq=z\xa0\xb5݉\xe8e\xa9ɺ\xbdm^69\xe5J͕ۖ(\xd3=\xac\xc8\xeb\xf3Z\x9c=\xb8\xdfi\xf1F\xcfE\xbe\x93\xb1=*\x8ci#\x11\x03#\xff\n\x1d\x0e9\x16\x1fz\xfd\xf5\x9d\x8eA\xfa\xa1\xfa\xf8\xeb\xf5\x8bɡ\xf7ߵ팘J\xa7\x8b\x1c\xebΜZ\xbd\xf4\x03\x9a}\a\xd2>F\xb5\x1d\x8d\xe0\x03\x85A\xab\xea\xc0Dzfy\x88\x95E\xbe\x18o\xb44tl\xb7\x15\atK0b\x82\xe7f~xK\x94e\x181~\xf2\x80\xdb3\x94.\n\xc5\x03\x92\x0f\x85\xdc\x0et\xd8m\xb9v\xe9&\xb0P\x97\x9be\xa77\x05F\xecY9U\x1b\x11\xaaS\xe4\xad\x13\xdf-C\xd9\xe2k]t\x89\r_\xefV\x87\x13\xb5\x910\xf4\xaf`s\xaa\xfePm\xf5\x83\xf5T\xa1\xf8\xfa\ue94b\xea\xa51\xe7\xf9\xfa\xe5K\xebi\x03[\xbd{\xe7\xd2\xdam\u007f\xa1\xa9ެ\xf0}\xdc\bw\x88G\xf4Z<\xea\xf9\xd8\xd0\f4\xedݶ\xce\xce*j\b\xe8\x97`\xc4\x04\xcf\xcd\xfc\xf0\x96(0\x11\x1e\xb3\xb42B\x13!M\x17Q\x0eZ\x9c\xda\xdbg\xe3H\x1c\xcd\x04+\xd1\n\xcd\x16\x06\xcc\x12\xa6/ є`G\xfe8#4\x0f\x11\x89\xfag1\u007f\xa6Bo,\t\xef\xc4\xd3U\xd2)a\xda\x02\x12\x05&\x01E+\nL2 Q\xe0\xa6\xf9l\xb0z\xd7\x1fn\x18\xe5\x02&\x06H\x14\xb8iv9\x1c\x0e\xc6\xc3N\xc0\xa4\x00\x12\x05\x00S\x03\x12\x05\x00S\x03\x12\x05\x00S\x03\x12\x05\x00S\x03\x12\x05\x00S\x03\x12\x05\x00S\x03\x12\x05\x00S3\x9d%Z\x83l\xab\x86\x8d2\x01@r\x99\xce\x12\xf5u\xba\x8bm\x13Z\xf4\x12\x00\xb8\xc1]\xa2Z\xc3\b\x91\xe1c\xee\xd6>\xbd=\xa6\x92.4\x80\x01\xc0\xcc\xf0\x96(\xc30\x02\v']=\xa3\xfd\xaeX?\xa9\x9f*z\r\xd6u\x06\x80d\xc3[\xa2\f\xc3\b|z\x8fؚ\xfa]\xc9\x18\x16\x82D\x01\xb3\xc3Y\xa2,\xc3\b\x9f\x8b\xaeZ\x94\x94A!H\x140;|%\xca4\x8c\xe8\x11\xd5\x1a\xcfO}\xa7\x82\x81\xc8J\xef\x00`J\xf8J\x94i\x18\xd1\xee\x19ns\x1d\xe8N\xcaZ\x18\x82\xad\xb2{,Y\xd7\a\x00\x88\x03\xae\x12e\x1bF\xb4RÈ\x03\xadI\xd1\xe81\x84\xd0=F\x99\x00 y\U00014a0ea\x84g\x0f]\xf5\xda\xdd\x1b{\xef)!`+\xdcѩ\xe7\x12\x02\x00&\x80\xa7Du\f#\xba$\xa7\x88\xaeh\xf7I\x1e\xf4\xa2\x93FY\x00 \xa9\U00014a0eaD\xbf\x9b\x0e\x06O'\xc30\x02ft\x01\xb3\xc3S\xa2\x12\x1a\xc3\b?\xbd\xe9\x12\xd8\xd7\x17s\xb7\xa9\x01$\n\x98\x1d\xde\x12e\x18F\xe0\xbe=}cC-mɘ.2r\x8d\a\x80d\xc3[\xa2,\xc3\b|\xa9\xdd}\xa4\x8f\xbfB\x05_\u007f\x8d5m̜\x814\x85\xb7D\xcd\xc4\x12\x84\n\x921G\x05\x00\t0\x9d%\xea\xeb\x1f\xc3\x00`r\xa6\xb3D\x01 \x05\x00\x89\x02\x80\xa9\x01\x89\x02\x80\xa9\x01\x89\x02\x80\xa9\x01\x89\x02\x80\xa9\x01\x89\x02\x80\xa9\x01\x89\x02\x80\xa9\x01\x89\x02\x80\xa9\x01\x89\x02\x80\xa9\x01\x89\x022\xb0>\x8c9\x01\x89\x02\x04\x9f3\x0f-1\xca\x04$\x03\x90( \x12,.v\x9d\x86'\x96M\tw\x89j\f#\x84\x16y\xb5\x94\x031\xf7\x9b\x1aN\xda\xc2k=\xf8\xeb\xf2\xb2\xaa&\xab\xb3\xf7\xaa\xad/\x14n\xb7ng\xa4\x86\xf1\xcf\xcbݢ\r'\x83\xd0Ѿ\x87$\nU\xa9j\x06P\a#\x150\x03\xbc%\xaa5\x8c\x10\\\xfd>\x91>W2\xdcU<\xd9/\x84\xc2yy.gV<\xebm\xfb\xe2\xc8\xe4B\xaePXf\x99\xcdH\r\xf3d\xe1\x96\f\xbf&\x8c\x93@\xac_\xbb\x86\x8ef\xaf\xf0\x8a\x1c\x94\x17:d\xd5\x01\xe37\x90\x97\x91\n\x98\x01\xde\x12e\x18F\xd0\xe3\xf1\xd4\x00\x00\x0f\xb1IDAT\f\xd1U\x8cZ\xbac\xef8E\x84\x9bM?j\xc6\xc18\xc4'j9\xd7e\xd8ؾ\x80B\xd2\x0fd\xac\xc8\b\x15\x1bI\x8dP\xb1\x19g{5a\\\x04]\xb9\xf3bl\x0e\x1d\xad\x8a\x8e1\xabr\xc6T\xa9j`\x81\x18\xf3\xc2Y\xa2,\xc3\bʱ\x17\xf8\xaf\xba\xa0b\x04Ż\xbc\xd9\xd8\x12Ta\xd4\xe2w\xa2\xcep\xd4\x1f^\xf1>\x92\x1aa\xb6{\f\x8dh\xc2x\x18\xa8@\xf7\xc4\x1a>\x86\x8e6NZf7r\xabSՀD\xcd\v_\x892\r#\bîqݝ\xa6\x8c@\x16B\x19t\x04,ؤ\xe1\xdaZ\xd5\xf6\xcb\xd5\x0e\xc7\xfe\x8f\xb6=\xbchӗ\xea\x1d\x8f\xe5g\xac%-\xe3X\x8e<\xccˉ\x96J\x1fꓣ\xa6|\x9cߤI\x8dPհd\xf6@&\xca\x1cV\x85at\xeb\x10X\x9b\x91O.*\xf1ԁ\xe4\xaab\xa4F\xe8\x02\x89\x9a\x16\xbe\x12e\x1aF\x10ZO\xeb\xee3\x85\xf4y\xbdVI>\x17ıZ\x93\u05eb\x1e\xda]?s\xa6v\xf5\xe2\xda\xdd\xdb\xee\xfa4j\xc7\xc0\xfa̼#\xa2\xb2\xdd\xcd\x12\xee\xe8.\x80\xcf\x16*j^\r^fפF\u061cc\xed\x13\xaa\xec=AU\x18F\xaf\x0emy\x99\xebi\xff9\x9e:D\xba\xb9\xcc:\b\xe3]\x15\xb9q\xf5\xf1\x81$\xc0U\xa2l\xc3\bL\x16\xc1Nք\u007fV\xa8\x85cwt\x1fw\xd4_\xc37\xaei7\f\x95\xa1\xc7\xc4>䨄~\x17 \x98\xbd\x1d\xefȎ1v݂\\8\x90},*TªC\x1d*\x1b\x92C\xe3:(\xba\xb9L\x96\x88mp\xbc\xbd|\x80;<%\xaac\x18!r\xb25\xd6~S\x89\x91D\xab\xa3\x1bP\x19wn\x96\v\x8f\xa2\x10\xba\x9e\x13\x03\xa8[\xe8\x8ea\x05ފr\xd7\xe2\x1d\xb3\x04u\xa8\x82U\a\xb75W\x16]\x1cuPtsٛ;\\\xc5Њ\x9a\x16\x9e\x12\xd51\x8c\x10q\xf7\xc5\xd8mJ1\x92\xe8:F\xa2؆V\xa2\x85D\x11^\x8f\x84\xfe\xc3H\x14G\xa2\xf9\xf1v\fk\xcaz{{\xcbj\xf46\xb7\x8bm\xdf}\x059\x01u\xa8\x86Y\a:\x1a}2\xbe\xa6O\xea掮\x8d1g\x0e3\xba慧D%4\x86\x11\xa4y\x8d\xef\xbb6\x05L@\xa2\x9d\xf9\xf1jCd\x16\x99$^;Kos\x1b\x1a\xc1\x17\xd0\n\x1c,\xb8\xa4\b\xd5yt$J\xe6tg\xc5c\x1a%ws[Q\x8c\xe7\x1c@\xa2慷DY\x86\x11b\x93\x9a\x94\x9b\xa2B\x8f\xd7kuz\xbd\x81Ќn\x8fzZ\xe7\xcb?\x0e\xae\xae\x1f\x1c\x8c\x1e\t.\xb3\x0f\xe18\x11\x8e\xa1\x8d\x01\x1c؈\x8e\xe9\x9c\xe0xvM[A\x91\xa5n\xb3ů\b\x15\x19t\xea 1d_\xc6LWs\x0f:H\x1e/j\x88%\xd1>\x94\x9c'G\x00cxK\x94i\x181\xcaz\xe0e\xeay#C\x9agqa!\x97\x06\xaa;\x92\x18_vP6\xe9\xec\x1e\a'\xc5B[\xf1\x11\xf1U\xef\xa6\xd2\xe9;lu\x81\x93E\xb9ͪ0\xc2\xcd\xd7\x01\x17\xc9\xd3I\xb1f\x84\xc63\x97\r\x8c\x1b>3\x05$\x03\xde\x12\x05\xccI[1\x82\x1f\xa3\x99\x13\x90( 1>\x00\x0eT\xa6\x04$\n\x00\xa6\x06$\n\x00\xa6\x06$\n\x00\xa6\x06$\n\x00\xa6\x06$\n\x00\xa6\x06$\n\x00\xa6\x06$\n\x00\xa6\x06$\n\x00\xa6\x06$\n\x00\xa6\x06$\n\x00\xa6\x06$\np\xc0\x95\xdd \xbe\xf6\xe4&\xb6L0@\x00\x89\xa6\x04\xed\x95~FhF\xfc\x95\xed\xda\xc4@\xf6Z4\x86\xf1}\xb6x~t\xc8,a\x1a\xc3]\xa2\x1a\xc3\b\xf1?\xf0\xd5\x17\xf6\xbd\xf0jܿ\x92\x9e\x86lAM\x8c0~\xe2\xf7\xaf\xb8y\xb6dh]/\xfa3\x85Y\xedxܲ1*}tE~\xf6\xec\xcd\xf2\xff\xbc˞\x93\xbf\x91\xfc \x8eU\x82><\xcf-)\xf0\x96\xa8\xd60\x02\aZچdž\x8f\xb4\xa4\xbdF;\xfb\x8dr\xe8М\xe1f\x84\t\x10\xbf\u007f\x85\x88\xc1jۃ\xef\xc6ގ=\x99\x9a\xa5\x9az\xad\xc1\x82V\xf1\xea\x12\xb5\x9e\xc4\xc87fo\xf7l̙M\xd7\xc8Y\x98Q\xd7ހZuJ\x90\xf2\xb3\x12\x13:\xb7T\x84\xb7D\x19\x86\x11\xdeV\xd2\xfd\x11Z\x13\xf1JHI*t\x970\x8a\xcd%\xcbzF\x98\b\xf1\xfbW\x88\xdd\x1c\x14{Q\x89u:\xeb\xb4Dh\xb0F\xaff\xe6\xcf܃\x86\x82\x85\xd1\xf6\x16K\n\xc8\xff\xfcp6i\\\x97X\xbb\xc9\xfa,\xcd:%\x10\xd85K\xe4\xdcR\x12\xce\x12e\x19F\x9c\x96\x16\xealO\xcaj\xd7<)\x8bg\x19\x13\x06\xceY\x01F\x98\b\xf1\xfbW`\xdcc\xb0\x8c\x91\xdeRJ\x11\x02\xb3\x9c\xd1I\x8f\xa1\x85\xe2\xe1\xa2ǘ\xc5\x05\xf4\xed\xbe\nrT\xda\u007f\x1f\x91V~`\x94\x80\xf5j\x96ȹ\xa5$|%\xca4\x8c\xf0\xb7t\xf9\x05\xbf\xb7\xc5Գ \t0\x90\x89P\xc3Ȫ\x82\xac*r\x15j\xa9\xcc.\"\xee\x12\x1eyy\x922\xb2NuF\v\x1e\xb5\xa0bU\xde:dq\xad-ʮҴ\x1fBΓѡ\xae\x8d\x84\x0e\xf1\xfbW\xb0\x850\xb8\xa9\xb6z\xf9\xa6\xda\x1b\xf8ui\x9d\x16\a]7\xf4Ʃu\x8bWホ\xf1.G\xf5\xf1\x9d\xb5K7}$goȊ\x9e\x16\n\x0e\vx\x99f\xb2\xa8[\x92\x91\xb3P\xfc\x9bX\x02X\xb1Y[\x02֓h\"疒\xf0\x95(\xdb0B8\xe9r\xb9:\xe2\x99\xecK\t\x84\xd6\x03\x05E9\xf9kW\x90ILgF\x9d\xa7\xd9V\x16āno\x91\xdd\xeb\xf5\x8a\xdd\x06\x9f\xd7\"~\x93z\x9cVU\xde\xe1\x03\x99\xc8ִ=\xe7\xbe\xe8\xf2\"MC8Ա\x91\x10\xe4\x85\xe95\u007fʸ\xfd+\xfc\xa3\xa3GБ\xd1Q\xf5\xe5\xf2\xdf\xee\xday\xe6\xfc\xa9\xe5\x8e/\xf1\xb5A\xba\xda\xd9\xe0\a$y\xa7c\xf7\xf9\xe3\x0f>~\x03_>S\xed\xa8=t\xa8v\xd1e)\u007f7KK\xda\xc9\"\x19!o\x95\xd8è\xd8S\x9c\x91\xe7\f-\xa9\xaf-\x81]3\x9c\xc0\xb9\xa5*\\%\xca6\x8c\x10N\xb6\x0e\xfb\x86[O\xa6\x8dF\xc5/\x1c\x9a'\x9e)m;\xc9\xecN/:HS\xc3\x1d]\xea$\xd3dU\xe7\xc5\xd6\\Qӫlхy\"\xb3,\x8a\x90e#a\x97[j;\xd6\xc3\xc0\xbfBgi\xfb\xe3\x0f\x92\xc6\xfa\xf8\xd2\x1b\xe4C\xb8\xa3\xfb\xba\xe3\x94\xf8\xfa\xae\xe3\x8c\xf8Z\xfd\xb0X\x93k\xb5\xf2\xa2\xdcc\xac\x81\xa0f\xb2H&\xe8\xcc\x12/[\xf9\x19\xb6-\x1d\xcdy\xf9r?^SB\x1c\x8b\xee\x1bzs\xa4(<%\xaac\x18\x11\x9a.J\xa3e\"\xcbB\xd3\x1d\x0f\x14\n\x84|:\xb4ґhxj\xc4ꌤ*h\x8b|+\x15!\xcbFbD^\x98^\u007fN\xd6\xc0\xbf\"\xd8\xe9\xf14\xa1&\x8fG=\x90\xfb\xb4\xf6\xe1ݧ\u07bfq\x9d~\bKt\xdb\xc3\u05ff\x14\xa9\xdd)\xc6\xd5\xfbI\xcaq\x87t\xc9\x18\x93.Ij\nu.\x1cut\x01\xe32+\x11\xf0X\xb6ܧה\xa0S3%F\xde\x1c\xa9\nO\x89\xb2\r#\x82{.\xd0\xf0¾\xf4\xb9\x00\x96U\x84\x02\xf9\xd2O\x17\xd7ӑh(\xaf*U\x81b\b\xa6\bu\xac,\f0\xf0\xaf \xb0F|\xd7N=\xb3ڱ\xfc\x97\xeaV\xf4qGd\x01\xd1\xeaC$e\xd0!ݐ\xe9e\xac\xca\xebEm\n\xc3\xe50\x81\x9aLz\x17\xa9\xa6\x98~\\V&%\xb3J0\x9aȊ\xe3\xdcR\x12\x9e\x12e\x1bF\x04\xf7I\x12\xedO'\x89\x86ĸ\xa2\xb0\x9f\xe2\x0f\xa7\xd2[\xc1T\x8c\rVu^=\x89\x06\xacM\x8c\xd0xb\x95\x85\x81\u007f\x05\x81!\x84w\xf7\x8b\xe2\xbcvf\xd1q\xf2\x81\x1e\xf8ԧ\xa4\x15}\x97BZ\xce\xea\xddd\xd3)\xb9\x15m\xb2h\xe7\x9dkl\x02vF\xaa/\xe3+˕\xbaS\r9t\x9c\xb3D\xbe^\xb1J0\x92h\x1c疒\U00014a04\xc60\xa2S\xee\xe8\xa6\xcd,\xb9Bv\x1dҽ\xf8\x8d\x9bɫ]\xec\xea\x8d\xd3\x04ҟ\vV\xc4)Q\\sGP\x1bNL\xa2\x06\xfe\x15\x84K9\x9a1\xe3!\xc7y\xf2V\xbf\x8b\xbe\xd6c\xfc\x19\x19\x80\x9e\xa7\xa3P\xbc\xff\x97\xe2K\xf5r2\x16}\xb8\x9ef\x0f\x16/\x8c.\x01\xfb-\xebq?j\xcaP[,\x0e\xcc*\xbaD\xfcM\xc9=Or\xf2\x97裼\xec\x12\x985S\x12ǹ\xa5$\xbc%\xca0\x8c\x10\x0e\xb6\x0e\x8d\r\xb5\x1eL\x97\xe9\"\xa1\x87\xce\xddJ\xa3\xc6\xf5\xe8\x81\xd6v'\xa2\x97\xa5&\xeb\xf6\xb6y\xd9\xe4\x94+m[6W\xa2L\xf7\xb0\"\xaf\xcfkq\xf6\xe0~\xa7\xc5\x1b=\x17\xf9N\xc6\xf6\xa80\xa6\x8d\x84>\x86\xfe\x15:\x1cr,>\xf4\xfa\xeb;\x1d\x83\xf4C\xf5\xf1\xd7\xeb\x17\x93C\xef\xbfk\xdb\x191\x95N\x179֝9\xb5z\xe9\a4\xfb\x0e\xa4}\x8cj;\x1a\xc1\a\n\x83VU;x,k\x96\xc7\xeb\xf5:\xf3\xc5x\xa3\xa5\xa1c\xbb\xad8\xa0[\x82\x01\x13=7\xf3\xc3[\xa2,\xc3\b\xa1\xf7\x88\xbb\xad7m\xfe\xb2\x03\x92\x0f\x85\xdc\x0et\xd8m\xb9v\xe9&\xb0P\x97\x9be\xa7&\x81#\xf6\xac\x9c\xaa\x8d\b\xd5)\xf2։\uf5a1l\xf1\xb5.\xbaĆ\xafw\xab\xc3\t\xdaH\x9cDF\xfe\x15lN\xd5\x1f\xaa\xad~\xb0\x9e*\x14_\u07fdtQ\xbd4\xe6<_\xbf|i=m`\xabw\xef\\Z\xbb\xed/4՛\x15\xbe\x8f\x1b\xe1\x0e\xb1\a\xe1\xb5x\xd4\xf3\xb1\xa1\x19hڻm\x9d\x9dU\xd4\x10\xd0/\xc1\x80\x89\x9e\x9b\xf9\xe1-Q`\"]\xa1Z\\Y\x16w\x1d\\^[\x19y\x1e:b\xac_a^Ya\x8bac`\x9aZ\x1d*{!@f\xb1Ke\x9e(|*dfclfP+\u007f,fheMj\xaf.\x81.Fm\xb1ikh0\x8301\x841/\x859Jq\xb5mol\x89j_oqn;\x86:>\x88<\xb3h\"{s[Vu\xb5sur?\x8a>@\x8b?uwtB\x8c@@\x8dG\\z\xba\xadq?y{xJ\x8fI^~\xb8L\x90K\x94wq\x85}d~\x80}O\x93Nb\x83\xbdN\x95U\x81\x83\x80W\x95V\xa7|e\x8e\x85gm\x87\xbcZ\x98Y[\x9aZ\x87\x89\x86]\x9b\\^\x9d]\xba\x82Z\\\x9ddr\x8d\u008a\x8c\x89\x96\x8cnd\x9ddf\x9ff{\x90\xc0\x8f\x91\x8eh\xa1h\xe3\x83+ЇK\u007f\x93\xc4j\xa3jz\x97Ɠ\x95\x92s\xa4l\xa0\x96wq\xa5s\x81\x9aė\x99\x96\xe4\x8b@u\xa9w\x9a\x9c\x99\x86\x9eȜ\x9e\x9b\xef\x904~\xaby\xa8\x9e\u007f\x9e\xa0\x9d\x80\xad|\xa0\xa2\x9f\xf9\x94.\xa1\xa3\xa0\xa2\xa4\xa1\x81\xb1\x85\xff\x952\x92\xa6ˤ\xa6\xa3\xb3\xa6\x82\xa5\xa7\xa4\x8b\xb2\x88\xa7\xa9\xa6\x8d\xb5\x8a\x8e\xb6\x8c\xaa\xac\xa8\xb9\xac\x88\x8d\xb8\x93\x9e\xaeΕ\xb8\x95\xad\xaf\xac\x97\xba\x96\xaf\xb1\xae\x98\xbb\x98\xa3\xb2қ\xbe\x9a\xb3\xb5\xb2µ\x90\xb5\xb7\xb4\xa3\xbf\x9d\xac\xb7Ң\xc0\xa4\xb7\xb9\xb6\xb9\xbb\xb8\xa5ħ\xb1\xbc\u05fb\xbd\xba\xa7Ʃ˾\x98\xbd\xbf\xbc\xa9ȫ\xb8\xc0կǫ\xbf\xc1\xbe\xc1ÿ\xb2ʮ\xc2\xc4\xc1\xbd\xc5\xda\xc4\xc6òͷ\xb9̸\xd6ǝ\xc7\xc9ƻκ\xbcϻ\xc4\xca\xd9\xc9\xccȾѽ\xc0ӿ\xca\xce\xde\xcd\xcf\xcc\xc4\xd0\xde\xc8\xd3\xc1\xcf\xd1\xce\xdfѥ\xc7\xd6\xc9\xd1\xd4\xd0\xd2\xd3\xdd\xca\xd8\xcb\xd3\xd5\xd2\xce\xd6\xdf\xcc\xda\xce\xe7\u05eb\xd6\xd8\xd4\xd4\xdb\xd0\xd8\xd8\xe3\xd8\xda\xd6\xd3\xdb\xe4\xda\xdc\xd9\xe6ݯ\xd7\xde\xd3\xd5\xdf\xda\xdd\xdd\xe5\xdc\xdf\xdb\xd7\xe1\xdc\xde\xe0\xdd\xf0\xe0\xb3\xdc\xe1\xe4\xdf\xe1\xde\xe1\xe3\xe0\xe3\xe5\xe1\xe1\xe6\xe9\xe4\xe6\xe3\xe8\xe5\xea\xe5\xe7\xe4\xe6\xe8\xe5\xe4\xe9\xeb\xe7\xe9\xe6\xef\xf2\xee\xfe\xff\xfc(t:\\\x00\x00 \x00IDATx^\xed\xbd\x0fp\x14G\x9e\xe7\xbb\xcc{\xbe}ϯ\x84zf$\xf5\xae4b\xef8M\xb4BB\xc7\x19\x9e%`\xd7z\b\x8b\xf3\xc2C\x1b\x02\xc1\x03\x9d\xe1\x16\xc6\xd8\xf3\b\xb3+0\xecB\x888\x9be,\xeel\xe4\x85~\x92\xb5\x1e\x99\x91X\xd9 \xa2ό\xa4\xc0\x9a6 ,\x06#\xd9H0\xd8\xc6\v\xde\x18\xf5\x10\xb6\xc5ȱ\xf66a\"\xda1\xd1\xe4M\xbcʪ\xee\xaa\xcc\xea\xcc\xca\xeeVw\xb6\xd4\xf5\xfb\x04!\x15\xa9\xac\xac\xac\xac\xfev\xfd\xe9\xea\xfa\xfc\xc1\xef\x93\a\x01\x000{\xf9\x03Q\xc2m\x10\xb5\r\x00\xc0\f\x06\xc2\x0f\x00\x0e\x05\xc2\x0f\x00\x0e\x05\xc2\x0fd+aQ\x05\xa7\x03\xe1\a\xb2\x92@c\xa1\U00084a12Á\xf0\xf7.\x9e\x14U\x91I\xc2ݙZ\xdc+\xaa2\xa3\x90\xd3\xdfpI\x89w \xaa\xe5p\xe4\x86?\xd0w\xbc\xbd\xfbB\x10O\x06/\xbc\xd1\xfe\x86>I\x94\xf2\xf8\xd7#kk\xf7=\xb0\xab\x11C\xb3\x92\x8b_e\xbe<\xa5ٮZ\x8b\xfd\x9f\xd9\f\x14\xfaDU\f\xa6\xb6\x15歈\xfb\b4\x89\xee\xb4\xe4\x1c\x14U\x91\x8b`t\x92\xeeo\"\xa3~U\xe9\x13U\x01\xa4\x86\u007f\xd2\xeb\xbb\x11\xb8q\xf2\xb8\x9a\xf3`\xe7I<\xd9\x19\xa4J\xb9\xecn8\xfbR\xed}\x9b\n\xb1L\xd5\xe7-U\u007f-ͫ\x9f\xb2\xa9՚\xd3a\xf3W\x1e\xbe\xfc7DU\f\x96\x16z\x1b\xf3l\xdf\xd9\b\x92\xea\x8eon\xab\xa8Jz\x18\x1ce\x16\x8bFG\xd8\xdf$\xdb%\x19V\xfc\xa2*\x80\xd4\xf0\xdf\xf6\xe2\x03\xb1\xa0\xf7\x06B\xfe\xee\x90:\x19\xea\xf6S\xa5<\xeeW\x9fA\x0f\x12\xcb>BM+\xd4\xccM\xe5\xadh\xb2\xa9s\xdbe\xf7W>q\xef\xc9єҊ\xc2\xf1f?\xc9\xee\xecqe\xe6\x00wa=\xbb\\4:\xa2\xfe&\xdb.\xc1\xb02$\xaa\x02H\r?\xd2B0\x89\xc3>\xa0\x9f\xf8\xf5\x0eP\xa5<>\xab~\x97\xffG\x1eM\xf5K\xbbP\xe7\xf2z\xbb<5\x16ś\xcbd\xb9\xa9\xc4\u007f\xac\x9alw\x82E\x8d\xa2*i\xa1\xacNT\x83\x8d\xa8\xbfɶK\x00\xe1\x8f\x03\xb9\xe1W\t\x05\xba}\xea;\xf8T\xe7\xe0Th\xca\xdf9E\x952\xf9vm\xb5\xc61\x84\x8eTW\x9fC\x9f\xd5Voœ\xb5g\x8fm\xad\xdd\xf7[\xad\xceg/\xac\xadm\x88LGi\xaao\xadC+\xbc8\xfc\xc1\xba\"W\xf1ʫj\xe16en\xeb\x93\xc5\xee\x957\xb5*\xa1\x02\xed\x9d!T\x98\xdbT\\4\xb8\xdd]\x15\xe4\xd4%g\v\xe6)J\xceq\xa4U\xc8\xf5\ue61f\xb7\\{ۚZ\xef.ޱÝ\xdfMt!\xe4V4v\xe0\xba9\x9d\xea\x9e])\xb1̆n\u05f9s\vW\x04\x88\ue82bs\x15e\xcf\xcd\xf5\xf3\U000961f8\xb3u.Ο\xbf#\xfaV\xb1'/\x84(\x12n\x81\x81\u007fyq\xae{E1\xafԧ\xaf\x9aRF--\xbeщ\xe9o\x8a\xda5\x19\x84\xf0\x8b\x91\x1c\xfe)\xaf\xd7ۡ\xbd\xe0B\x03\xead_\xc8R\xca\xe4ӱs\xd5=cc_\"\xf4۱\xda\x1e\xf4`\xecH-B\xb7\xce\xd5V7\xf4\xf4\xac~\x01\xd7\x18\xab}\xb6\xe7J\x8fzn@\xd2T\x1fȟ\xfa^\x00\x87ߧ<9ؽ2g\x18\xa1\x1b\xc7\xe7*\xc5\a\x9b\x8b\xf3\xc6q\x95QeP\xab:X\xa0\xecX\xaa\xb8\x0f\x16\xb6p\xeaR\xb3]\xf6\xfb]\xdae9\\Z\xd8\xdcR\x80wT\xa1\x92\xa2\xd6fW^\xfb\xf2\x16\xb2\x0f\xef\xfb\xbb\x94f\xbf_}\x9d\x06\xfc\xb9\xea\xe5\xb6^\xb7h\xbd:\xedC\x8dOr뒳!\x94\x17\xb9&\xefr\xab/\xcb\xf5\x85\xeaT\x97\xa2\x1e,\xb4*\xe3Ȃyد\xbdt\x9b]\xf4l\xa1bu\xaf\xa6\xbeʵ# \xa3;\xea\xf2\x95\xa5A\xfd\x84\x889\x9bO\xc1\x17\x06\x87\x95.\xbdv@\x89\xbd\x14\x96X\v\xb1\xb4\x16\xe2m\xd3\xea\xa6\xdf\x1d\xa8R\xe2\xf0\xdc\\\x1a\x8actb\xfb\x9b\x9av#<\xa1\x1e8$p\xb2\xe5Xd\x87\x1f\xe1W\xfa\x80y\xc1\xef\x02Uʃ\x1d\xfe\x97\xa2\x93W\xaa?e̤\x86\xbfE9\xa8\x85\x1fM\xb5.\x9fW\x80\x8f$\xd5W\x8evhݪ\xe0\xb8\xf5\x1a\xe1\xefBCJ\x10\xcf«K\xceF\xbc\f\xf1ɫ\x96\xab&7\xc2I\x8f\xf9\f\x9b\x1d~c6\x9f\xf2\xbeY\xb7\x97\b\xbfqM\x8c9[\xfd\xbc\x10\xa68r\xee\x1c`d8\xb1\x16b\t\x14\xcd\xdb\xe6}?l9>\xa7Jɐ\x92\xd7\xf0\x84\xa3\x13\xdb\xdfԴ\x1b!\xd0\xe7-\x81=\xbf\x18\xa9\xe1\x0f\xe9{\x91\xab\xdep\xb8]\u007fͿ\xdf\x1e&J\xb93\xb2\xc3oL\x9e\xa9\xfe\x961\x93\x9a\xe4\xa9\x1d\x93Z\xf8\x87\v\x8b\x9bN\xfa\xab\xf4@k\xaf\xa0A\x05\u007f\x9c4\x14=\xfc,\xeaC\xc3.m\x16^]r6\xe2eh\xe4\xaa\x05\xbf-\xf4Ż\xe7'f#\xd2etG}їE\xa7\x98\xb3\x95EN\x8c#\xf7\xb0\r+ƛ\xa8Ab-0\bz\xebJ\x94B\xeax\xdaRJ\x86\xd4X\x1a\x8act\x18\xfdMI\xbb&~e8\xa6\f\xb0 3\xfc\xe1N\xfd\x94VM|4\xfc\xa3\xea\xa4Yʝ\xd3\x12\xfeW-\xe1\xbfR}\x8b1S\x93\xfe\x81\x11\x0e\u007f\xc9b\xbc\x1f\xa8\xd3\x03\xbd\x1d\xff\xf4*\xb8$芼\x9c\x88\xf0s꒳\xb1^\x86\x81\x9c\x15\x81\xab\xf3\x17Ǭ\x83%\xfc{,\x19\x1cP\x88ϴ\x8d\ue42f\u007f\xe6l\xeb\xe7\x8djD\xae\x976\xbbb\xf7s\x89\xb5\x10\xcbe|\xa8\x13\xecʣ?\x93\xa7J\xb5E\xb4\a\x8c\xc9(\xc2щ\xedoj\xda5\x81\xab\xfdq 3\xfc\xe8\xb8vוv\x80?\x189\xec\x1f\xa4Jy\x10\xe1\u007f\x15\xa1\a\xcfZ\xc2\u007f\xbfa7\xde\xf5\x1f;F\xcdD\x84\xbf\x18\xbf\x84\xc2\xfa^\xc4U\x88O\"\xe7U\xe9\u007f\x9c\xa7\xbfn\x88\xf0s\xeaR\xb31^\x86\xa3J\xa1\xa2T\xc5~\\i\x86?O\xedHx\xa1%\x83\xc1\xa2*<\x10۵\xb7\x16\xa3;䋞9[\x9f\xa2]\xdeޣ\xdf+\x17.Y\x81bH\xa8\x85\xdb\xcd1\xf7\xd54\xeb\xf7\xc8Um\xe3\x97V\xa9\xa31\xa9\xb7#\b)=:\x8c\xfe\xa6\xa4]\x02\b\u007f\x1cH\r\xffM\xef\x00\xbeʧ]\xf0\xeb\xea\x1e\x0f\x8cww\x85\xa8R6\x91\xab\xfd\xdaݽ\xbb\x1bzz\x9e\xad\xae={\xeb˱\xda#c\x0f>=R\x8b?\x05\x18\xab\xddz\xf6ʱ\xea\xb3\xe4\\S\xf5ڋ\"PU?\xa5\xbe\xb4\xeaZ\x0f\x96)\xee\x96!\xf5\x95\xa3\x94u\xb7\xcfw\xebg\xd77s\xb4\x03\xcd\x1b\xee\x96`W\xee\xd5 \x9e\x85Sל\f\r\xf9\xfd\xaeF\xbf?\x88\xaf\xe07\x0e\xa1\xd1\xc6\\\u007f\x00\x8d\xba\x06|\xfe\x80u\x17\xa4_\xed\x1fҊ\x17\x17\x1e<\xb8X\x99\xdbq\x83\x9c\r\r~\xaf\xc4\xebۮ\xb4\x93\xddQ\x97\x80/x\xeb]d\xcf֤\xd4w\xf76*\x9dZ\x95\x16\xc5\x1a\xddD[X\xa9\xe4[\x87\xbfY\xc9o\xf6\x9dl\x8c|\x00\xc1,mv\xb5\xf4.\xcd\x0fPK\x8bgtb\xfb\x9b\x9av\t.3N\x84\x00\vRÏ\x02\x83\xdd\xed'\x87\xb4\xb3\xdc\xd0\xf0Ɏ\x93\xc3!K)\x8boWk\x1f\xf3\xd7\xfe\x06\xff\xe7\xb3ݵ\xab\xf7\xbdZ]}\xe4\b.\xfa\xb4V\xfdyD-\xfe\xcd\v\r\xab\x9f\xa5o\x04jV\x14|]h\x9b\xa24\xa3p\xcb|Wa}\xc7<\x97\xbaKq\xedh,(Z\x1f\xddY\xec\xf9\x9e\xfa\"\t\xab\xbb\x8f\xe3\x05J~7>\x05\xe6\xd45'\x87s\xf4\xb3e/n[\xc9\x1d\xcfW\u007fnC\x17\\\xb8,\xb7\x8a:\xfd\x8c|\xce?W\xbby\xf1fU^\xc1\xf2&\xb5.9\x9bZ\\W\\\xb0\xf0$\xd9\x1dtU_\x82\xbe{\xe4\xcc\xd6W\xe5v/\xd6\xf6\x96ȟ\xb7\x03YH\xb0\x05Ԟ\x1fs\x8e\xdcY\xd5\\\x9c[TEg\x9f.\rmw\xe7U\r\xd3K\x8bct\x18\xfdMI\xbb$\x93s\xeb\xaeN2\xde\x14\x00\x02\xb9\xe1\x9f\t\x98\xe7\xd5\x1a\xdb]\xd6\xfbC\b\x88\xba\x96٬L\xe6o\x9b\f\x85\x82\xc3uӼ\xcal\xdb\x1d6]\xaeF\xee\x1bg\xdc\xf4*\xd3\xeb\xb7=\xd4褤\xbf:6\xa3\xde[bw1\x13\xc08>\xfc\xa8\xa5\x98\xff\x1d\xda\xf8\xc3\xdf\x1b\xf9<<\xec\x9e\xe6\a\xccv\xdda2U\x94\xe4\x97\xe4\b\xc2\x1d\xee'Eu\xa6\x039:\xa9\xe8o\x14\xdbQ\x9f\xbcʸ\x16\x00\x10@\xf8\xed\x88?\xfc\xa39\xfa\x91\xe7x\x0e\xf1\xb9\xfd\xac!\xe0ޑ\xaa\x9d1\x93t\x8dN\xba\xdau\bN\v\xbf~\xb5(>\x88\xba\xc2\xd9\u008dyOv\rv=\x99\x97\xd6=\xe8l%]\xa3\x93\xaev\x1d\x82\xd3¯]-\xba\x8d₨\x1b\xc7l\xbe\xe5E\xae\xa2\xe5\xd3<\xe8\xcfZ\xd25:\xe9j\xd7\x118-\xfc\x00\x00D\x80\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\xa3\x03\aX\x93\x00\x90\xed\xc8\r?[ץ2\xee\xcd\xd8MZ\xff\xecy\x991\xa9\xf1\x91G\xe7z\xccL1\x1c\xf0x\xfaEuf\x12\xa9\xe9\xef\xc5\xcawDU2@j\xd6M̝R\xcf\x1aQ\x1d\x9aSt\xcf2=|R\xc3\xcf\xd6u\xa9\x04\xdb/t\n\xe6M\x1b{\x17\xdceLj\x84?\x189\xe591\xf2\x81͗^.}\xa8\xff\xbe;R\xdaƯ\x958\xd1vSM\x92\xfd\xe5t\xe7|\x85\x94\x94%H\x82\xeb\x96<\xd7\xf6\x97\x8b\xaa\xd0\xdc\x1b\xd9H\xf6,\xd3\xc3'5\xfcl]\x97\x8ao \x90\xa9\xf0Ox~\u00984\xb8\xe6\xf9 \xa6\x8c\xe4\xff\xd9\x15\x9d*O\xe9\v\xcel7\xb5$\xd9_^wf\xe8\xe32\x12Z\xb7iЖ`\xf8\x11\xdaI\xf5,\xc3\xc3'5\xfc\x1c]\x17\x1a\xef\bf,\xfc\xfb\xcb\xef2&\rD\xe1ߐ\\\x98\x84lHS\xf8\x93\xeco\xba\xba\x93&\x12Z\xb7i0\xdd\xf0g\x18\xb9\xe1Wa躂\xed7Q\xa6\xc2\u007f\xa7\xf4\x10c\xd2$\x12\xfe\xe7=\xa5\xa7\u007f\xb2\xaa\xe2\xa9ϩ?\xbe\x13\xb9&\xb0\x01\xff\xa7\xfc\xb0Y\xe1\xe7\x9b+V\xfd\x84>Yh\xf3\xe0\xf3\xbd~\xf5\xe7Q\xf5\u007f\xa76T\xac;\xa5\xfe\xfe\xa8T\xfd\xff\xc4ޚ\x05O\xabc2\xf2TMi\xe535\x96vI&vU\x96.yF}\x8b\n\xeeZVZ\xb3\xf3#\xadИ\r1\x17L\x90H\u007f\xd9\xdd!\xfb{\xaf\xc2\x139\x85\xa5F\xe7뽕\x8f\x1d>\\i=\xa2et\x9d=\xa8D\v\xd4\xe8\x18cF\x8fd\x14\xaa\x94\xb5n̥\x85\x97\x94\xbe\xf2زK\x87\x16m\tZzv\xe2\xc0c\x8f\ue720&\x119Pw\xf7.[\xb4\x8b{\xd8\xcfiW\v\xff!\xb5\x8f\v\xbeNp\xf8҂\xe4\xf03u]>u\xf7\x9f\xa9\xf0\x1f(\xfd\x9c1i\x12\t\xff?\xf7\x97z*\xdbN!'Ɂ\x9aX\xb4\xea\xf4;Oy\xb8{~v\xbbZ\xf8\xef\xee\xf5\x9c\xd06\\\x02×\x1e$\x87\x9f\xa5뺁\xdf\r2\x14\xfe;\xa5\a\x18\x93\x04\xc6a\u007f\xf9\"\xf5\xadao\xa5\xf5\xef\xc4a\xf4\x92\xaf\xd5W\a\xaep\xde\xf3\x966'\xfd\xe6\xfd\x96~ex\xdd\xcf\x11\xba蹈\xf0\xcf\xf3Z\v\x9e\x1f\x05\xb5\x13\xa2S\x95\xda\xfemQ\x98n\xd7$T\xf3t\b\xe7\xef\x1e\xfe\x81\xdf6\xd7\xedD\xd4l\xec\x05S\xc4\xdf_^w\x8c\xfeb\x16D\x8eb\xcd\xd1\xe9\xf7|\x84\xafj\u007fB\xb5\xc5\xe9:{P\xa9\x16\x8c\xa5\x11cF\x8c$\x01Y\xca^7\xe6Җ\xedU뼃\xf6\x1f\xb0\xf4\xacF]潚\x8d\xd4$\xd1\xd8\xe6Uj\xdd\xf0:\xfea?\xa7]5\xfc'\xca\xcfG+\xc5;|iBv\xf8\x11\xb2꺂\xed7\xc2\xe1p\xa03\x9c\x89\xab\x1fϗ\xdeaL\x12\x98\xe1ߏX\xe7xD\x98\x0eD+\xecz<\xa4\xaeQ\xf8\xb1\xfdT͏<\xa1\xd0[\xf7\xc2\xe5\xea\xc6ݿN+Y\xa3U\xd8P\x1eY\xee\xe7\xcbj\x9e?\xfdQ\xc4X\xc5\n\xffy\xcfG\xc6\xf4ק\x9e~|\x91g\x1d=\x1b{\xc1\x14\xf1\xf7\x97\xd7\x1d\xa3\xbf\x18\xe3\xd5k\x8c\xceˋ\x10\xbet\xfa6\xa2`w\x9d=\xa8T\v\xc6҈1#F\x92\x80,e\xaf\x1bsi\xcb\xfa\xd5m\x1cD\x87\x9fCtϴ\x0f}Oy\ue453fc\xf7<\xa7q\xe1Q\x9b\xf0\xb3\xdb\xdd\xd9v\xd4c~\xbe\x17\xef\xf0\xa5\t\xa9\xe1g\xea\xban{\xa3\xc8\u007f\xde\xe2\xdd\xf2\x03\x8cI\x123\xfcx;نߨ\xb0.r\x8e\xbc\x93\xaa\x19*\xfd\xe4\x84z\x06\xebQӴY\xff\xcb\u038dZ\vƙ\xfd\xbdӻ\xd6x\x96\xbc\xaeM\xb3\xc2\u007f\xc2c\x9c\x96_[Rs\xf8\xed\x91-\xeb\xe8\xd9\xd8\v\xa6\x88\xbf\xbf\xbc\xee\x98\xfdEī\xd7h\xec\x84\xe7k\xbc\x83\xb6\xec\xba8]g\x0e*Ղ\xb14b̈\x91$ K\xd9\xeb\xc6\\ڲ\x8b\xe8Z\xa9\x1a\xba\xe7\x18=C#\x9e\x0f\xc9I\xb3\xb1\xeb\x9e\x11\xc4hL\xdc\xee\xce%\x8f\xac1\xc72\xde\xe1K\x132\xc3\xcf\xd1uMM\xaa\x8cwLf\xe01\xeb\x87<\x13\x8cI\x92\xb8\xc2\u007f\xfa\x0eUa\xef\xe3\x1fj|MW]ӿe\xf3\x9a\xb7\xf1\xc1\xe9\xfeǵ\x82\x9a\xfdF\v\x98\xebx\x0fs\xaf\u007f\xc1)\xba]\x93K\xe6\xees\xcdFmO\xbf\x8e\x9e\x8d\xb3`\x92\xf8\xfb\xcb\xeb\x0e\xf5\xb6\x14\xfb\xea\xbd\xe3y\xfa\xceG\xab6[\xb6%\xbb\xeb\xecA\xa5Z0\x96F\x8e\x999\x92$D){ݸ\xe1/\xd7CJ\xf5L\xbb\xf8{Z\xddw\x13\x93fc_{\xb4a\xb1\xf9\x9c\x9f\xd3\xee\xce\xcaO\xee,2\xce\xe7\xe3\x1d\xbe4!3\xfc\x1c]\x97FF\xce\xf9\xef\x96\xefgLR\x88¿e\x8b:\xaf~FiT\xb8\xa8\x9f=\x1f}\x8d\xae\xfa\xdc\xf3\xa5\x17=\a\xf0\x8b\xf9\xbcV\xa1?r\xce\x1f}y\xb7ig\xb5h\xcb\x01\xba]\x93в-x\xd0\x0e\xa9/\xc6\x1a\xdc_:b\xd9.m\xe5'\xde\xfeQ\xc5\xe7t\x85\x97=\xcf\xf5\xbf\xbd\xdfC_\x90B\xafU,\n\xafZ\xa0%l\xaf\xe7\xe5\xf3/{\xf6\xaaK\xb8\xa6]H\xd7v\xa9m\x9e\x8a\xb6\xf3\xeal\xef\x91\xedR\\Z\xb0\xe6\xd4\xf9C\xf8t\xb3ͳ\xeb\xd4k\x1b<\x95\xaf_\xa3f\xa3\x16\xbc\xd3Sq\x0fY\x89\xbf\xbf\xcc\xee\x90\xfd\r}02R\xbe\u007fd$H5\xf6Q\xf9\xa5\xf3#wc\xf6\\\xac\xaes\x06\xd5l\x81\\\x9a9f\xd4H\x12\x18\xa5\xecuc/\xed\x9f\x1e=\x11\xea/\xfd$\xf4ܖ\xcf\xc9AE\xe5\x9e\r\xfd\xa7W-\x9a@Ԥ9P\x9fT<\xd6v\xf4QO\xe9[\xff\x84[\x89\x1djv\xbb\xf7F6\xee\xff \x14ڹ\xec\xd2W\x89\r_z\x90\x1a~\x8e\xaeK-ǧ\xfc\xc7mfL\v_U\xeceL\x12\x98\xf7\xf6\x1fP\u007f\x96~\x82?\x99\xb5\\\x19\b\x1dzt\xc1\x96k\xc8R\xe1\xe2\x96\xcaE\x9b\x8dk\xba\x11\xae/:\x8a^\xaf\xd0\xde\xf4\xc3'\xd6U\xac;\x156\x96\xa0\x9d\xcf\xfe|s[M\xe9\xb2-\xefQ\xed\xd2L\xecz쑍ok\r\xac*\xaf\xdcuzU\xe9\x16z6r\xc1\xa7+<1\r$\xd0_fw\xc8\xfe^\x8f\x8c\xcei\xaa\xb1\x0fJqY\xe9f\xebY+\xa3\xeb\x9cA5[ \x97f\x8e\x195\x92\x04F){ݘK\v\xab\xfb\xd9\xfeG<\x15\xfdx)Ġ\xa2\xf2\x9f\xec_\xb4l\xaf\xf66AL\x12\x035\xb1\xf3њ\xc3o\x95\xea\x8d\xc5\f5\xa7\xddSxu\xae\xeb7#$6|iAn\xf8g\x16\xafx\xfe\x991\x99=\xbc\xed\x89\xdd\U000e76ef*\x0e|\x15\x0e\u07fb\xbe\xeb\xd1d\x97=\xfd\x16R\x01q\x8f`<\xb7\v\xa6j\xa8宼\x93ß\xdd\xdf\xe5\r\xbf\xb5(\x03+\xf5\xb6~_\x00\nWZ\x0f|\xe2e\xfa-\xa4\x82\x84\u009f\xba\xa1\x96\xbb\xf2N\x0e\u007fvs\xb7\x92\u007f\x9fo\xfa\xf80\xf2)\xd5'\x1e\xc6\xd5Ƹ\x98~\v\xa9 \xa1\xf0\xa7n\xa8\xe5\xae<\x84\x1fH%\xe1\xfd\x15\a\xfa\xdf\xeb?P\x91\xf4\xaep\xfa-L\x1f\xfd\x12\x9cuR\x02rW\x1e\xc2\x0f\xa4\x96w\x9eZV\xba\xec\xe9\xe9\x1c\xb5N\xbf\x85\xe9\xa2]\x82\xbbc\x9d\x94\x82̕\x87\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0\x03\x80C\x81\xf0g\xf9-\xfe\x00\xc0Cn\xf8\x99\xba\xaeP\x87\xf6\x10\xaf\x8e\x14\xdd\x1e\x9d(6\xba.\x93\x03\x122rJ\xa0\b\x11\x12\xb7\xe5+\xf8\x8e畑\x91\x9f\xaf\xab\xb4>\xf2K(\xe6\"+\x9c֟c9\xc3H\x8d\xae+-\xdb\x18%\xd6n\x9aG]j\xf8ٺ\xae`\x06\x9e\xdcib\xaf\xeb\xe2٭\xd2\xf4\xa8\x15\x91\x1fHH\xfc\x96/\xfd\xa1\\_WXc\"\x14s\x91\x15\xfaS\xb1\x8bM\x03\xe2/\xe2\xc5A\x9a\xb6qB\xed\xa6wԥ\x86\x9f\xad\xeb\xcal\xf8\xedu]Iڭ\x92e\xda\xe1\x8f_\xab\x15y\"\xdf:\xeb\f\xc2\x16\xc8\n\x97<\x97\xf8\x153\x88\x94\x8d%\x95\xb4\x8c\xba\xdc\xf0\xab\xc4\xea\xba2\x1a~;]\x17\xc7n%\xf6,\x91\x02\xad(\xcf{\xe3\b\xca\xca_\xc1?\xb5Ae\xb6Kl,\xbe\xe2,v\x1b\x9307\v9\x0eD\xf8\ts\x17\xb3]\xbe\xa3+\x89QO\x00\xa9\xe1g꺢\u007f\xf4\x9fdϔN\x84\xba.\x96\xdd\nc\xefY\"EW&d\xf8-\x93\xba\x17\xca\f?!\x99b\x8b\xb9xΫD¯\xed\xebv\xadB\xf1\xb5`\xfb2䬱YJ\t\xca\b\f\x1b\x17\xb9Bf\xa9P|\xc61\x8d\x99\x83\xcan\x97\xd8X|\xc5Y\xec6&`o\x16r\x92\b\xbfi\xeeb\xb7\xcbwt%3\xea\xf1#3\xfcl]\x17\x1a\xf0i\x93\x83>\xee\x8ciC\xa8\xebb٭0\xb6\x9e%Jte\xa2\xd5=\x1a\x13~\xd3\ve\x86\x9f\x90L\xb1\xc5\\<\xe7\x15\xcb\xf2\xc5&\x12\xfe\xd3\xf8uG\xf4\x8c\xdb\x02\xfd2\xb4T`\xaf1QJ\t\xca\b\x8c\xd74\xb9Bf\xa9P|ƩP\xae}f\x8b\a\x95\xdd.\xb1\xb1\xf8\x8a3\xdb\xf0\xb37\v9\x0e\xe6\xa0\x12\xf2\x1ev\xbb|GW\x12\xa3\x9e\x002\xc3\xcf\xd1u\xf9\xb4]\xfeT\xc7\xfb\xb6\xf3\xa6\x03\xb1\xae\x8be\xb7\xc2\xd8z\x96(ѕI\xc5a\xf5\xfdocL\xf8M/\x94\x19~\xc2\v\xc5\x16s\xf1\x9cW\xa4\xe5\xeb\xcek\x13\x88O\xa4\xd6\xdeG\xc2TϘ\x9e0\x8c\xf12dU`\xaf1QJ\t\xca\b\x8c8\x92+d\x96\n\xc5g\x9c\n\xe5\x8f\xe1s\xfe5[x\xed\x12\x1b\x8b\xd3\x02\x12\x84\x9f\xbdY\xc8q0\aU\x18~\xbe\xa3+\x89QO\x00\xa9\xe1g\xeb\xba\x02\u07be\x9b\x81\xcb\xed\xbe\xa4\xaf[$\x8dHׅ\xb7M\xac\xddJ\xe8Y\xa2DW&\x9b+_\u007fm#\x16\xd0\x1ea\x10\xb7V\x8b\xc4\xea\xf3\xd2\x1e\f\x1dg\xdd\xf8\xe0\x8b\xaebW\xfe\xde\xc8FF]n\v\xec5\xe6\xe8\xd0b+X 6K\x14b\x8d\x93[y\x94\xd8f\x89\xbfn*z\x96\x16\xa4\x86\x9f\xad\xebB\x03\xed\x01\xfc\xc6pC0wz\xb0\xd7u\xdd\xf3\x9c@\xc6\xe3Q\xa7\xfd\xb8\x11\xd3\xc9\x11\xbfV\x8b\x86V\xfa\xc4\u007f\xd4Teš\x01c\xe9Ш\xb5`\xcffl\x16\xf6\x1a#\xe6\xca\x13\xf0Ɨ\xb94a\xcf\xc8\x16\x8c1\x13\xf6\f\u007fl\xf1Σѣ~\xe1k'\x1dH\r?[ׅ.\xb7_\x0e\x8cw\x9e\x94\u007f\x00$\xd2u闕\xaf\xe1\x03\x13\x8e\xbf\x89r=\xd9\xfa\xb1\xa2w\xf8]\xd3V\x93e_B\x97\x16\xac9u\xfe\x90v:OحL\x97\x16\xe1\xf3\xfa\xa4ⱶ\xa3\x8fF\f[\x06\x84C\x8a\xa8+\xb2f\x11\x15\x88u#\xedV̕\xbf7\xb2q\xff\a\xa1\xd0\xcee\x97\xbe\xa2Z3UYB\r\x98YJ\x0e*\xb1\x16\xecو\xcd\xc2^c\xce\xca\x130Ǘ\xb9\xb48zf\xb4\xc0\xf6\x8fqz\xa6\xf2\xf2\xe3ƅH\xfb\xd7N\x9a\x90\x1a~\x8e\xae\v\xdd\xee\xed8yY~\xf6E\xba\xae\xd0\"턾t\x02\xf1\xfdM\xa4\xeb\xc9֏E\xdf\xdbϲ/\xe1\xcf\xf9\x1f{d\xa3fi'\xecV\xa6K\x8b\xf4yM\xec|\xb4\xe6\xf0[\xa5\\\x87\x14QWd\xcd\"*\x10\xebFڭ\x98+\u007fJ[\x19\xac\xfd:J\xb5f\xaa\xb2\x84\x1a0\xc4ԡ\x11k\xc1\x9c\x8d\xdc,\xec5\xe6\xac<\x01s|\x99K\x8b\xa3gF\vl\xff\x18\xa7gxFs\xf3ٿv҄\xdc\xf0\xcf,R\xa9\xeb\x02\x80\x84\t\x95'\xef\xd9K\x05N\x0e?|\x97\x17\xc8(\xfd\x95q\xde\x1d\x96&\x9c\x1c~\x00\xc8\x1cm\xef\xa1\x1f\xb5\x89*\xa5\x17\b?\x00d\x80\x90g\xc3\xf3\xcb$[y\xad@\xf8\x01 \x13\xb4Ul\x99\x10\xd5I3\x10~\x00p(\x10~\x00p(\x10~\x00p(\x10~\x00p(\x10~\x00p(\x10~\x00p(\x10~\x00p(\x10~\x00p(\x10\xfeYA\xef\xe2I\xea\xffS\x8bm\x9e{\x04\xdfY\x00\xe2Bn\xf8Y\xba\xaeP\xa7W\xe7\xb8`f\xe9lSr\xbaEu\xa6K\xa3\xa2(y7E\xb5Z\x94fkI\xceAfMd\xeb\x1fK\xce\x16\x15\x97K+V\xa0\x15\xd7l@\x06\x91\x1a~\xa6\xae+\xe4\x1d\r\xa8\\\xf6^\x15\xcd.\x9b\x80?ך9\x9d\xc1Qfq2\x04\xfc\xfeVeHP\xa95\xa7#\xa6\xcc7\xb7\x95Q\x13c\xe3\x1fK\xcc\x16%ti\x91\xc4\n\xb4\xe2\x9a\r\xc8 R\xc3\xcf\xd6u\x8dk\x0f\xef\xed\xbc \x989\x13\xb8\xd8\xe1_X\xcf,N\x92aQ\xf8o\xbb\x9a\x18\xa5{\\\x01F\xa9\xc8?F>PJ\x84ХE\xc0\x14h\x89g\x032\x89\xd4\xf0\xb3u]\x1a\xbe7\xe4?\xc9G\f'\xfceu\xcc\xe2$\x11\x86\xbf\xb1\x88\xa52\v\x1652JE\xfe\xb1D\xc2/ti\x110\x05Z\xe2ـL\"7\xfc*\xb1\xba.\xcc\r/}AK\x02\xa1\xc2ܦ\xe2\xa2\xc1\xed\xee*|\x16RW\xe4*^\x89O\xaf r(\x1f*+\\\xa9\xd7Я\xb4y\x95)\x1c\xb5q\xf5\x00\\?@1\xc2_?/\x84)V\xdf\x13\x02E\xf3\xb6y\xdfgH\xe3#\xdcV\xa2ܶ\xfc%\x1a~\xa21\xe4\xc2?\x9a]Zyot\x8e/\x1b6\x1d;\xfb\xe9\x83o#\xf3\x05\xb4\xb7\t\v\"\xff\x98\x11~\xd24f\n\xa9^^\x84p\x90\xb5'\b\xb3]Z&\x94\xfb\x8b\x1d~\xd3\xdc\x05\xcc@\xa4\x86\x9f\xad\xebR\xe9\x90/\xecP)\xeaC\xc3j\xbep\xf8\x87\v\x8b\x9bN\xfa\xab\xf4\xf0\xa37\x94\xc8G\x0f\xfa\x05?\xbf\x82?\xda[\xb1\x03\xf5\xb9\xf5l\x1b\xe1/\x8b\xe4\x19\x1f1\x04\xbdu%\n>\x85\xe0\xe0\xf7\xe9\xf8\xad\u007f\x88\x86\x9flL[p$\xfcC\xc6\xe1\xfd\xfd\xb3/l\xad^\xdb\xf3 :_\xec\a$B\xff\x98\x11~\xd24fj)Nx\xbe\xc6;\xf3\x98=?\xa1\xf20\xa0\xdc_6\x17\xfc4s\x170\x03\x91\x19~\x8e\xae\v_\t\xb0\xee\r\xa5@\x84\xbfd1>\xec\xaf\xd3\xc3\x1f(\xdaS\xac_\x88t\xed\xc0?\xdb\x15\xfcG\x9f;\xd4\x18\xb9\xbe\xae\x85\xbf\x1d\x1f\x98\xcf\x1b\xd5Pk_\xc6\a\t\xc1\xae<ާ\xef|\xa2\xe1'\x1a\xa3\xc2\x1f\x8c~\xe6p\xebU5\xf6\xf7\xcf՞\xd1\xff\xdb\xec\x8a\xfd\x10@\xe8\x1f3\xc2O\x9a\xc6\xccl\xdf\xf1<}\xe7\xa3U\x9b\xf57i\x96K\x8b\x80r\u007f\xb1\xc3o\x9a\xbb\x80\x19\x88\xcc\xf0st]\xf8\x94?#/\x0f\"\xfc\xc58\xce\xe12-\xfc\xa1\xc5{ГK\xb5\u05ff\xab\x18\x9f\xb4\x96Ti\xc5n\x9f;r\xe5\xadJ-\x98T\xd4S\x95>E;_\xd9sP\x8d\xa2\xa2\xad\\\xd56\xebR\xa2\xe7\xfc\\\xa2\xe1'\x1a\xa3¯\x9e\x0f\xe8a쩾\x82\u007f\xed>\xa2\xfd/\\\xb2\x02Y\x11\xfbnj\xf0\x93\xa613\xdb\x1fz\x96x<[\"\x17\xeeX.-\x02\xca\xfd\xc5\x0e\xbfi\xee\x02f R\xc3\xcf\xd1u\xa1\x1b\xdeL|\xc8\u007f\xc3\xdd\x12\xecʽ\x1a\xac\xaf\n\xa8ѭk=X\xa6\xb8[\x86B\x17\xb6\x15\x06\xd0\xed\x82\xed\x17\xf0G}\xca\xf2\xa1\xc1\xc5n=\xbdM\xf3\"G\xfdj*[z\x97\xe6\xe3k\x94MJ}wo\xa3҉ß\xdf\xec;\xd9\x18\xbd2o\xb2R\x89\r\xa9\x89v\x87_\x8b\xdfO5\x16\xf0\xe76\x0e\xa1\xd1\xc6\\\xad\x18\xdd\xcc\xd1O&z\xaak{\xde}\xf7\xa5\xea1\xed\u007f-J\xec}\x86\"\xff\x18i\x8b2Lc\xa4\x90\xea\xa3\xf2K\xe7G\xeeF.Z\xb2\\Z$\xa6\xf3\x8a\x10h\x91\x10\xe6.`\x06\"5\xfc\\]\x17\xe3\xb2u\xda\t\x17*\xca\xf1\x02%\xbf\x1b\x9fe\x87[\xe6\xbb\n\xeb;湪\xfaԳ\xee\x1dh\xbb\xfaS\x8dqIs]A\xd1\xfa\xc8'\x117\x95'#\xb3\x86\xb6\xbb\U000ea1b5ɾ*\xb7{1\xde\xe7wV5\x17\xe7\x16U\xc5d?\xfa9?\x87\xc6ȉ\xbev\xcf`\xb4\xb1mjA\xeex\xbe\xfaS?\x8e\xd8\xf3=\xed\xec\xfe\xec\xee\x9eM\xb5\r\xbb\xf5\xec\xfb\xf3v\xc44&\xf2\x8fѶ\xa8\xa8i\x8c\x14R}P\x8a\xff\\\xbaY;\xe9g\xb9\xb4H\f\xe7\x15)\xd0\"!\xcc]\xc0\fDn\xf8g5AWl\xb2%\xb1\xdde\xfd8\xa4\xcb\xd5\x18{\xb44m\xff\xd8W\x15\a\xbe\n\x87\xef]\xdf\xf5(\\\xa0w\x00\x10\xfe\xb8\xe9v\xc7\xc6M\x16-Ŗ\xaf\xf4\x16\xb1\xbe\xd47\xed\xef\xf2\xbe\x1d\xb1Ɔ+\xcf\vj\x02Y\x00\x84?>\x9a\a\xd1R\xf6\x8d\xfe\xd9ć\x91\x0f\xf9>\xc1\xf7\xfa\x00\xd9\x0e\x84?.\x82J\xd96\xe6\xd7k\xb2\x8b\xf0\xfe\x8a\x03\xfd\xef\xf5\x1f\xa8H\xea\xb8\x01\x98e@\xf8\xe3\xa39\xbfꆨN6\xf0\xceS\xcbJ\x97=\r\a\xfd\x8e\x00\xc2\x0f\x00\x0e\x05\xc2\x0f\x00\x0e\x05\xc2\x0f\x00\x0e\x05\xc2\x0f\x00\x0e\x05\xc2\x0f\x00\x0e\x05\xc2\x0f\x00\x0e\x05\xc2\x0f\x00\x0e\x05\xc2\x0f\x00\x0e\x05\u009f}L\xfb\x16\u007f\xc0\x19\xc8\r?K\xd7EMf\b\x19b.\x84.\x94\xe5/\x1f\x12U\x9a>6\xba.\x11\xd30l\xcd\b]םRϚ8K/V2\x9e>\x12%\x03]\xcf\x04R\xc3\xcf\xd4u\x91\x93\x99B\x86\x98\v\r\xb8ֿQ\xefJ\xff3\xcamt]\"\xa6a\xd8J@\xd7\x15Հ\xa5\x81k\xfb-\x8f\x1b▞\xaf\xb0\x89\xf74\xc6a6!5\xfcl]\x171\x999\xd2/\xe6\n\x15\xe2's2\xa2\xef۩v\t\x1ca\x1a\x93\x1c~\x96\xae\x8b6wɄ\x90b\xa5_\xcc\xe5\xd6u\x9bMn\xebl)E\xa0\xeb2\xc5\\\xc4㸗\xedUw\xcd\xef\xa0\xfd\xb8\xbai\xd8\"}^h\x83\xe7G\xc1\xc8Y\x9bAB\xba\xae6\xbc\xa7߫?M\xdc8\xec'\x16q\xaa\x12\x0f\xe7\xa9E\xf4\xa0\xb2\x9db\xa1\x9a\xa7q\xbb\xfd\xf7\xa8>l^\xa5\x16\x86וӳ\x11\xa5\x16\x16D\x0e\xec\x89!!p\x84iLv\xf8Q\xac\xae\x8b6wɄ\x90b\xa5_\xccU\xb2^\xfbU\x9f\xde=\xbf@\xd7e\x8a\xb9\xc8\xf0\xf7\xabA\t\xa2\xc3\xcf!ҰE\xfa\xbcІ\xf2ض\x12\xd2u}\xeeQ\xf7\xff\x8f\\Ҋ\x8d\xf0\x13\x8b\xf8|Y\xcd\xf3\xa7?\xb2\x0e*\xdb)v\xde|Șه{\x9e\xd3x\xeah95\x1bYj\xc1\b\xbf9$\x04\x8e0\x8dI\r?S\xd7e1wɄPc\xa4_\xcc\xf5\x84~\xe9 \"\x03M\x13\"]\x17a\xdf \xc2\u007f\x11]+E\xe8\xe5碥\x9aa\x8b\xf4y\xa1\r\x1bb\xdbJL\xd7\xf5\xf4atq\x91>\xa8F\xf8\xc9E\xdc;\xbdk\x8dg\xc9\xebt\x03<\xa7\x98\xf1\x1ea\xf6\xe1\xbag\x04E+\x98\xb3\x91\xa5\x16\x8c\xf0\xb3\x84$\xce0\x8d\xc9\f?[\xd7E\x9b\xbb\xa4B\x86?\xedb.\xafv pSI\xeb\xd5~\x91\xae\xcb\x1a\xfe\xa3\xd1\xf0\x97G\xc3o\x18\xb6H\x9f\x17\xf3\x02}b\xba\xaew*C\xfb#\x0e!C\x03F,\xe2:\xbe\x1b\xe9^\xff\x82ST\x03l\xa7\xd8%b\xcfo\xf4\xe1k\x8f6\xabviϜ\x8d,\xb5 \b\xbf\x13Lc2\xc3\xcf\xd1uQ\xe6.\xa9\x90\xe1O\xbb\x98+T\x88\xdfH\xea\n\xd3yiC\xa8\xeb\"^\xe9\x15\x87շ\xe3\x8d1\xe17\f[\xa4ϋ\x19\xfe\xc4t]\xa1\xcaw\x1eՏ\xfaM\r\x18\xb1\x886\xed\xe4\x1dm\xa1\x8fV\xd8N\xb1в-x\x10\x0f\x1d\xa2\xfa\xb0\xb1F=D\x9fXPN\xcfF\x94Z\x10\x84\xdf\t\xa61\xa9\xe1g\xeb\xba(s\x97D()V\xfa\xc5\\\xa8\xcfU\u007f\xb2\xde\xd5gWe\xba\bt]\x94wks\xe5\xeb\xafm\xf4\x94\xbe\xf5O\xff\xf4\xe8\x89P\u007f\xe9'\xa1\xe7\xb6|\x8eHÖ\xe1\xf3\n_\xd3.\xd0ǜ\xf5'\xa6\xebz\xf9\xf1\xe8ռ\xa8\x06\x8cX\x84\x1a\xfe\x8a\xb6\xf3\xea\xe4{t\vL\xa7\x18\xba\xb4`ͩ\xf3\x87\xb4\xd3y\xb3\x0f\x9fT<\xd6v\xf4Q\xbcBd\xbbd\xa9I胑\x91\xf2\xfd##A\xae\x8a\xcc\x11\xa61\xa9\xe1\xe7\xe8\xbaHs\x97D()V\xfa\xc5\\\b]X\x9aW\x96\xd6\xdb\x18E\xba.ʻ5\xb1e\xc1#O\xbd\xa2N.\xf1x\xfa\x1f\xf1T\xf4k\xa7֤a+\xea\xf3\xfa\x888\xf9'IL\xd75aȾ\xa2\x1a0d.\x02\xfd|s[M\xe9\xb2-\x96쳝b\xf8s\xfe\xc7\x1e\xd9\xf86\xfe\xbb\xd1\a\xb5p\xe7\xa35\x87\xdf*\xd5*\x18\xedR\xa5\x06\xd7#\x17\x05NsUd\x8e0\x8d\xc9\r\xff,!\x83b\xaei1m]W:\t\x95\xc7$\x1b\xc8,\x10~\x06\x99\x14sM\x87\x19\xfd]\xde\xfeJ\xe9\x17t\x01{ \xfcV\x9c!\xe6\x92L\xdb{\xe8GN\xb8[~v\x01\xe1\xb7\xe0\x101\x97\\B\x9e\r\xcf/\xcb\xea\xfbef%\x10~+N\x11sI\xa5\xadb˄\xa8\x0e \x1b\b?\x008\x14\b?\x008\x14\b?\x008\x14\b?\x008\x14\b?\x008\x14\b?\x008\x14\b?\x008\x14\b?\x008\x14\b\xff̾#\x1e\x00҆\xdc\xf0\xb3u]\u1afd\xed'3vW\x1d\xdfn\xf5vi䛟\xa5o\xcb\xf57\xf1\x97FH\xb1b\xfdXl\xf8\x8d\xd9\x1a\xab\xf8\x15\xe2.ݯ\x0e]ńM\x05\vlٖ\x90\xf4\xce\x16ז'\xb6\x85x5g\x0eR\xc3\xcf\xd6u\x85}\x1d\xa3\xb7/\xb7_\x16͝&\xf8v\xab\xd7=##\xa7<'FF<\xaf'\xefo\x12\xba\xa9\x18\x15\xf8K#\xa4X\xb1~,6\xfc\xc6l\x8dU\xfc\nf)\xd9uF\xdd\xcf\xf1\xf0}`S\xc1\n[\xb6%$-\xb3E\xd7-\xae-Ol\v\xd1j\n_\x0f\x12\x91\x1a~\xb6\xae\xeb\xfdv\xac\xeb\xb8ٞ\x99o\xd3\xd8حN\x94\xe2\xe7?\xab\xafފ\x13\xd1':&\x8e\xd0MŬ\xc0Y\x1a!\xc5b\xfa\xb1\xd8p\xbb.4\x8fM\xb2]\x17\"\\7*\xfcq\x90\x8e\x14\xf3\xb1\x9dmC\x02\xe1O`[\xc41f\xf2\x90\x1b~\x95X]\xd7I\xfd\xd1V\xbd>\xc1\x9ci\xc1\xcen\x851^\xbd\xe5\x87M\xab\x93)\x83\"\x89\x8a\xa3L\x13\x16\"\xdcT\xcf{JO\x1cxL3@\xb1+P\x18\xb6(\xa2.!Ţ\xfdX\"\xad\x16S=e\x1a\xab8\xaa,\xb6\xd2\xca,%\xbbN4\x16ܵ\xac\xb4fg\xf4\xf1\xba\xd1\xe1#*\xac\x89̷\x19\xffG\xa0\xd5\"\a\x95\xad\xd5b8\xba(\xff\x98\xd9\x1d\xaa\x05\xceҢP\x9bE\xb0\xe5\xc9ma\xae&\xb5-\x8c\xf1\xe5m\xee\f!9\xfc,]ׅN\xed\f\xa0\xe3\xa4\xfd\xac\xe9\xc1\xcen\x851\xc3\xefY\xd3\xff\xce\x12\xedm۔A\x91\x18\xe2(\u0084E\xb8\xa9\xb0\x17\xaa浶\x9a\x8aO8\x15(\f[\x14Q\x97\x94b\x91~,\xa1V\x8b\xad\x9e2\x8cUs\xf8\xcc\n\xf8\xc1\x99##\x1b=\xf8\x11\xfdB\xad\x961\xa8\x1c\xad\x16\xd3\xd1E\xfa\xc7\xcc\xee\x90-p\x96f@\xad\x9bh˓\xdb\xc2XMr[\x98\xe3\xcb\xdb\xdc\x19Br\xf8Y\xba\xae`\x87o2\x14\xe8\xf5v\x8b\xe6M\x03\x02\xbb\x15\x19\xfe%_\xab\x1b\x1f[\x9d(\x8f\x95\x01)\xaf\"\x9f\x06M\x1c>֨\xeb}\xaff#\xb7\x02\x01a\x8b\"\xeb\xb2\x0e\xfb\x85Z-\xbez*\xf2\xf4j\xb6*\x8b\xa8`QZEK\xe9\xaeGJC\xfd\xf8\xad|]\xe4i\x9f\xe4a\u007f\xa4B\x9b\xba\x1b\x0e\xef\xd7D{B\xad\x165\xa8,\xad\x16\xdb\xd1E\xf8\xc7\xc8\xee\x98-\xf0%^\x06\xc4v\x13ly\xcba\xbf9:\xd1mA\x8d\xaf\xa3\x0f\xfbQ\x8c\xae\vM\xf9ԃ\x80!_\xafh\xc64 \xb0[\x91\xe1\xc7o\rZ\x06)\x8f\x95\x01)\xaf\xe2\x84_\xfb\x1cQ3@\x89\xc3oڢD\xe1\x17j\xb5\xf8\xea\xa9\xc8딭\xca\"*X\x94V\xb6\xe1G_\x9fz\xfa\xf1E\x1e}4X\xe1W\t\xed\xd2R$\xd6jQ\x83\xca\xd0j\xb1\x1d]\x94\u007f\x8c\xe8\x8eт\x8d\xc4ˀ\xd8n\x82-\xcf\r\u007ft[P\xe3\xeb\xd8\xf03u]\xda\x1f\xa6¨S\xbe\xabOh\xb7\"\xc3od\x90\xf2X\x19\x90\xf2*N\xf8\xb5W\x85f\x80\x12\x87\x9f]\x97\x15~\xa1V\x8b\xaf\x9e\x8a\xbeN\x99\xaa,\xb2\x02-\xb6\xb0\r\xff\xb5%5\x87\xdf\x1e\xd9b\x17\xfe\xd03\xa5\xdac\xb7\xc5Z-ޠFa;\xbaH\xff\x18\xd9\x1d\xa3\x05\x1b\x89\x97\x81e\xbb\xd9lyn\xf8\x8dmA\x8e\xafS\xc3\xcf\xd6u\xa9/\x06%\xd4j\xc5\f\xaa%\xaflG\x17\xa9 \"\xbbc\xb4`#\xf12 \xb6\x9b`\xcbs\xc3\x1f\xdd\x16\xd4\xf827w\x86\x90\x19~\x8e\xae\xeb\x86wR=5:>(\x989\r\b\xedV\xcc\xf0S\x1e+\x03R^e\x9a\xb0\b7\x95z\xee\x88/p<\xbe\x85[\x81\x80\xb0E\x91uY\xe1\x17j\xb5\xf8\xea\xa9\xe8Y8S\x95ET\xe0\x85\x9f\xeaz\xa4\xb4\x06\xf7 \xbc\x8e\x1f\xfe{\x1b*\xf0~\xf7\x8a~aB\xbb\xad@\xa0\xd52\a\x95\xa7\xd5b8\xba¤\u007f\xcc\xec\x0e\xed*#\x97v\xba\xc2c\x1d\u007fs݄[\x9e\xdc\x16\xc4j\xea\x13ڶ\xa0Ɨ\xb9\xb93\x84\xdc\xf0\xcf,$ۭ\xca\xdb\x100#y;\xf6\x83\x10G\xe0\xe4\xf0K\xfe./\x84\u007ff\x12~k\x91\x84\xad?\x13qr\xf8%\x03៙ܭ\x8c\xbdU\xdb\x19@\xf8%\xa1_8\x02\x80\x99\x03\x84_\x12څ\xa3\x99\xf1\xf1.\x00h@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8e\xdf\xe2\x0f\x003\x04\xb9\xe1't]\xa4\xa3+\xd0\xdbї\x81\xe7\xf8\xe8\xf0u]\x16R&b\x8a\xcb\x00\x95\x02L!\x15\xd1\xf5$\x84_@\x96\"5\xfc\x84\xae\x8btt\x05\xda\xfd\xb7\xfd\xed\x99J?_ׅ\x84B\xaa\xe4\x88\xcb\x00\xc5$Aד!\xa4\"\xba\x9e\x84\xf0\v\xc8R\xa4\x86\x9f\xd0u\x11\x8e\xae\xf0q\xfc\xe8\xce\v\xc73\xb3\x0f\xb2\xd1u\xa1x\x84TI\x91\xec\x17\xfc\x12u=\x19O\xbd2\xba\x9e\x9c\xf0\v\xc8J\xa4\x86\x9f\xd0u\x11\x8e\xae\x1b\xed\xf8\x15\x18lό\xa7\xd7Fׅ\xd2\xf6\xac\xd5dßhwb\x9fO\x9b\x9c\xf0\v\xc8J\xe4\x86_%\xa2\xeb\"\x1c]\x03\xfa\xfb\x80/\x03O\xf0\xb4\xd7u1\x85T\x94\f\x8am\ue88dU&\x13\xbb*K\x97<\x83\xdf`L\x03\x94Y\x97\x14<\xecS\xbaE\xb5\x01`\xe6 7\xfc\x1c]\x17B\x83\x19x\x8cO\"lSr8\xc1\xeeV\x8c/#\a\xf4\xf0\xf3\xeb\x02\xc0LBj\xf89\xba.\xfc\x87a\xfb93M\xc0\x9f\xdb\xcc\xfeKl\xf8\xb9u\aG\x99\xc5\x00\x90\x19\xa4\x86\x9f\xad\xebR\xe3\xd2=\xd3Ï\x90+\xee\xf0s\xeb.\xacg\x16\x03@f\x90\x1a~\xb6\xae\v\rz\a\u06dd\x10\xfe\xb2:f1\x00d\x06\xb9\xe1G,]\x17\n\x05\xa3\xe2\x0e\xa9t+\x8aҌ\x9a՟\xdd(XW\xe4*^yU-\xbd:WQ\xf6\xdc\\?/o9\xfd\xc1\x9dk{c\x91{\xe5MF+\x8c\xf0G\xeb\xfa\xd4ƛ\xf4E\xe0IL\x99V\xa3sq\xfe\xfc\x1d\xb4f\x03\x00$#9\xfc,]\x17&\x13\xe1\x0f\xfa\v\xf6L\xa2\xc9=n\u007fPM铃\xdd+s\x86\U0007314f\x17\xcf/(ޱ\xde\f\xb5\x86K)\xeb\xea*\xcb\x1b\xb7\xb6\xc2\f\u007f\xb4n\xf0B\xf16u\x11\xcd\x05\xfe`\xf0\x82\u007f~\x95\xdf\xef\u05eel6\xe6l\xf7\xb5\x16\x96\xc9\u007f^1\x00\x98H\x0e?Kׅ\xc9D\xf8\xd5\f\xe2\x93\xf0\xfaF\xf5G\xb0\x1b\xbf#\x95=\xa1\x15\x97)Kc\xf4W\xc8U\x82\xef䙿\xd8\xda\x063\xfcf\xddf\xbc\xa7_ߨ\x15\x1b\x87\xfd>\xa5C\xfd9\xact!\x00\xc8\x1c\xb2Ïbu]\x98̄\u007f0/\x88\x82y\x9aId\xaau\xf9\xbc\x82\xc81y\x99\x8b\xf1(aW\x13\xfe\xe9U\xa6,\xe5\xcc\xf0\x9bu\x03\xca8\n\x15\fh\xc5F\xf8\xeb\xe7i\xf7\x03\x167\"\x00\xc8\x1cR\xc3\xcf\xd6ua2\x13\xfe\x90\xfb$\xeau\xe3\xce\f\x17\x167\x9d\xf4WE\xc2_ƨ\xab_\xc4\xf3+֏\xeb\xf8\x17\xfc\xf4\xba+v\xa0>\xb7~\xf9\xc0\b\u007fY\xe4\xfc\xff\t\x04\x00\x99Cf\xf89\xba.Lf\u008f\xb6?\x81\x9e؎'J\x16\xe3\xa3\xfc\xbaH\xf8YW\xe5];\xf0\xcfv\xc5z\x95\x8e\x19~\xa2\xae\xcf\x1dj\x8c\xec\xe1\xb5v\xb1\x9cd\xfd\xbcQ\r\xebQ\x04\x00\xc8Df\xf89\xba.L\x86\xc2?\xe4\n\xb8\x86\xf0D1\xcee\xb8\xcc.\xfc\xc5\xf8<\xbe\xa4\xcaZ\xce\f?Q7\xe4\xf6\xb9#kY\xa5\x16L\xe2:}z\xc5=\a\xad\x8d\x01\x80D\xa4\x86\x9f\xa3\xeb\n\x05\x02\x1d\x83\x81I\xd1\xdci \\\xb4\xbcH;\x05iV\xeaZ\x0f\x96)\ue5a1АvU\xfe\xb6\xb5\xaaKY>4\xb8\xd8\x1dSξ\xdaO\xd4m\x9a\x179\xeaGͮ\x96ޥ\xf9\xb8z\x93R\xdf\xddۨtZ\x1b\x03\x00\x89H\r?G\xd7u٫\x91\x89\x8f\xbd[\\-\xda\xefp\xcb|Wa}\xc7Q\x15\xc0\xd1H\r?[\xd7E\x94Jgi\xa1\xb71/\xce\x05\xfb\xf2g\x97Y`X\x81\x87\xa1\x03vH\r?[\xd7E\x94\xcafJiE\xe18\xb3?뮞\r+C\xa2*\x80\xa3\x91\x1a~\xb6\xae\x8b(\x95\xcdMev\x1d\xc9'\x04\x84\x1f\xb0Gn\xf8\x11K\xd7E\x94J%\xe4V4vh\xffk-\xcb+kU\u007f_\x9d\xab({n\xae\x9f\x97\xb7\x9cz\xa0h0OQr\x8e3Z1\xb9]\xe7\xce-\\\x11\xf3\x16\xd6Q\xe8ſ\x02\x05\xfaҔ\x02\xb2\x06\xb9\xb4`]\x91\xabx\xe5U\xb5t\x9b\x92\xeb\xdd1?o\xb9Vsj\xbd\xbbx\xc7\x0ew>~\xc4a\xe7\xe2\xfc\xf9;\xacG*c\xfb6ծݷ遥\x18\rB\xf8\x01[$\x87\x9f\xad\xeb2J\xe5\xf2\xbe\xbfKi\xf6\xfb\xb5\x885\xba\xf6\xf8\xf6\xb8\xd6\xe3g\v\x1f/\x9e_P\xbcc\xbdB\xc7\xf8\xb2\xdf\xefjf6\x13a0\xbf\xace\xa0Yi\xb1\x96?\xa1,ǿB\x1d\xad:\x1d\xe4\x9b\n\xb94\x9f\xf2\xe4`\xf7ʜa\x84n\x1c\x9f\xab\x146\xb7\x14\xd4\xe1\x1a%E\xadͮ\xbc\xf6\xe5jÍ9\xdb}\xad\x85e\xf4\xbb\xe4\xc7\u007f\xf6ҹ+g\xd7V\xff\x8e*\rM\x0e.t\xcb\x1fR`6!9\xfc\x1c]W\xb4T6\xc6a\u007f\x9fve\\\xff\x89ʔ\xa5\xc1\xc8\xc9\bE\x9e]\xf8C\xc5\xf8P!\xd4\x1d#\x1d\xbb}Pw\x11M\xde֙\xb4\xfc\xddXZ\xb0\x1b/\xb2L\xfbd\xde\xe5V\xdfz\xd6\x17\xaaS]\x8az,Ъ\x8c\xab\x93>\xa5\x03\xe1\xa3\xf9.j\xfe3\r8\xf6gV\xd3{\xfe'\xd4c\x8c,>\xa5\x01R\x81\xec\xf0#\x8e\xae+R*\x19#\xfc\x8d%گ\x92F\xfc\xb3\xccž\xfc`\x1b~\x9f\xf2\xbe\xcd_\xd5\xf7\x00%\x8a\xc5Kf.m\xaau\xf9\xbc\x02\xa5\fO\xbapG\x9a]\xea\x8f&7\xc2\xfd\xc4\xe3T?/\x84)n\xa4\xe6\xff\xb2aӱ\xb3\x9f>\xf8\x96*D\x81>o\t\xec\xf9\x01[\xa4\x86\x9f\xad\xeb\xa2K\xa5b\x84\u007f\xf1J\xed\u05ca\x85\xf8gY\x19\xbb\xb6m\xf8[\x14\x81t\xc4\xefӱ~\xfef,m\xb8\xb0\xb8餿J\x0f?^\x94\x16\xfe\x16e\n\x1f\x92\xe0=\u007fY\xe4\xdd\xc3r\xd7\xde\xfd\xb3/l\xad^\xdb\x13s\xce\xefW\x86\xadE\x00@ 3\xfcl]\x17U*\x19s\xcf?O\xfb5O\xdf\xf3ױkۆ\u007f@\x19\xb5\xf9\xab\r\xc6\xd2J\x16\xe3=u\x9d%\xfc\x81\x9c\x15\x81\xab\xf3\x17\xe3\xb1Y?oT\x83>\xb3\xb8\xf5\xaa\x1a\xfb\xfb\xe7j\xcf \vp\xb5\x1f\xb0Gf\xf89\xba.\xa2T6F\xf8}ډt\x97\xfe_q\xf8o7\xc7$=XT\x85\xdf϶o\xb7\xfe!z\xce\xcf\xc3XZ1\x9e\b\x97Y\xc2?\xaa\x14*J\x95vfЧhWH\xf6\x1c\xa4\xe6奄\x82\u007f\xed>\x82,@\xf8\x01{\xa4\x86\x9f\xad\xeb\"J\xe5\xa2_\xed\x1f\xd2\x0e8\xd6\xe74\xf9\x9ar\xf0\xd5\xfe!\xff\xfc*\xbf\xdf\x1aX\xb5\xd8\xefj\xf4\xfb\xf5N\xaeT\xf2cz;\xf8\xbd\x12\xafo\xbb\xd2n-_\xa9\xac\xb0\x16\x99\x90KkV\xeaZ\x0f\x96)\ue5a1\x80?\xb7q\b\x8d6\xe6\xfa\x03h\xd45\xe0\xf3\a\xf4\x83\xa2&\xa5\xbe\xbb\xb7Q餚詮\xedy\xf7ݗ\xaaǬm_V.X\x8b\x00\x80@j\xf8ٺ.\xb2T&\x91\xcf\xf9\xe7jw\x16\x86\xb5\xcf\xf9\xd5\xfe\\\xcd\xd1J\xad\x81\x1d\u058b\x15\xed3{Ԟ\xcf8\x9f\xbeYW\\\xb0\xf0dLq\xe4s~6\xe4\xd2\xc2-\xf3]\x85\xf5\x1d\xf3\\U\xdbԢ\xdc\xf1|\xf5\xe76t\xc1\x85+\xe4V\xe1\x93~\xd4W\xe5v/\xb6ܱ\u007fvwϦچ\xdd1\xd9G\x93s\xeb\xaeN\xca?\x95\x02f\rrß5\xf4*\x92\x8eS&\xf3\xb7M\x86B\xc1\xe1\xba$.\xdd\xf7\x96\xc4\\\x1c\x04\x00\x13\b\u007f\x12\x84;\xdcO\x8a꤈^\xb7\xbe\xef\x0e\xbb\x93\xf9\xd4~\xf2j\x06\xee\x99\x06f\v\x10\xfe$\b\xb8w\xc8:I\x19\xcdю\xf7\xd1x\x8e\xfdm\x04\x00\x900\x10\xfe\x99M\xb81\xefɮ\xc1\xae'\xf3d\x1dj\x00\xce\x01\xc2?\xd3\xf1-/r\x15-O\xe6\xa0\x1f\x00l\x81\xf0\x03\x80C\x81\xf0g%\xffh\"\xaa\n8\x16\b\u007fV\x02\xe1\a\xc4@\xf8\xb3\x12\b? \x06\u009f\x95@\xf8\x011\x10\xfe\xac\x04\xc2\x0f\x88\x81\xf0g%\x10~@\f\x84?+\x81\xf0\x03b \xfcYI$\xf8\xff\xf5?\xfd\x03\x15\xfe\xa9Ž\b\x00\"\xc8\r?[ץ2\xee\x85[\xd8\x12\xe4Jû\xfc?\xea\xd9\xff\x9b꿲\xec\xf9[r\xe8'\x81\x00NFj\xf8ٺ.\x95`\xfb\x05\xfa\t\x15\x80\x90wk\xcf\xf1\xff\xa8g\xbf\xf6\xbf\xc6\x1c\xf6\xfb液\xe7\x00\x9c\x87\xd4\xf0\xb3u]*\xbe\x81\x00\x84?Qb\x9e\xd8i\x12\xfeǟ\xfd\xe3?\xfe\u007f\xb5\u007f\xc58\xe7\xdf\xc3y41\xe0<\xa4\x86\x9f\xa3\xebB\xe3\x1dA\b\u007f\n\xb9Y\xf6\xc7\u007f\xfc\xef\xff8\xe7\xff\xf8?\u007f\x16\x1b\xfe`\x11\xfd\xe4o\xc0\xb9\xc8\r?b꺂\xed7Q\x16\x85\x9f#\xfcB\xf6\xe6\xae߭\xad}\xb5\xa1a\xec\xd8\xea\xdd\xf7\x11\xba\xffBC\xed\xa6}\xb7\xd4\xe2#յg^jX\xbd\xef3j\x12ݯ\xad\xae\xae\xd6\x0e\xfb\xd5ҳǶ\xd6\xee\xfb-\xfe\xcf\xfd\x17\xd76\xbc\xfa\xea\xda\u007f\xa3TU\xcdɫZ8\xe7\xcf\u007f\xa6\x85\xff\xb3\x17\xd6\xd66\xe85\xd4]\u007f\x9e\xacg\x11\x003\x1c\xc9\xe1g\xea\xba|\x03(\x9b\xc2\xcf\x13~\t\xcc]c\xab\xab\x8f\xed\xae^۳\xf6\x8cz>_\xfd\xd2ع}\xd5\x1f#t\xeb\\m\xf5\xa6\x9e\x9eM\xb5\xb7\xc8I\xb5|l\xac\xb6\aφK\x1bzzV\xbf\xa0N\u007f\xbb\xb5\xe1LOm\xed\x99\xff\xf5\xe0\xef\u007f\u007f\xe3\u007f\xfe\xfe\xf7\x0f\xfd\xfb\u007f\xc0\xe1\x1f\xab}\xb6\xe7JOu\xe4\xd9\xde\x17\u087e\x80\x8e\xe4\xf0\xb3t]7\xf0\xbbA\x16\x85\x1fq\x85_\xf6殆\x17ѕ\xeaw\xd1K/\xe1\xc7\xf0\xab\xbb\xff\a?ƁF\xb5\x9b\xf0\xa1\xc0\xa6g\xe9I\xfc\xbf\x9e\xc8\xef\xd5\xea>\xfd\xc5\x06u\xea\\\xb5\xfa\xbep\xa6\xfa\xe3\x929s\xe6\x84\xeb\xe7\xcc\xf9Ο\xe3\xf0\u007f\xbbi߷\xea\x1b\x03n\x12\x13P\xde@\x00\x80\xe4\x87\x1f\xc5躂\xed7\xc2\xe1\xf5殛\x00\x00\r\xefIDATp\xa03\x9cE\x0f\x9a\xe5\t\xbft8殆s\xe8\xe3\xea\xfb\xe8\xd5\x17\xd5\xe9\xfbg\xf6mZ]\xfdc\\\\\xfb*\xfeyF\xfd\v9\x89\x88\xf0\xab\xef\x16\xa8\xa7V\xfd\xf1\xeaj\xf5\xc7o\xaa\xdf\rl\xffc5\xfc\xff˿\xfb\xf3\xff\x86\x0f\xfb\xafT\u007fJ.&`q\xfd\x01\x8eEj\xf8\x99\xba\xae\xdb\xde(\xd9s\x19\x9a'\xfc\x8a\xc06w5\\A\x1f\xab\x11\xc6\xe1\xff\xb8aӫ\xef\x8e\xed\xd6ïe|\f\xefԉID\x84\x1f\xff\xd6\xc2\u007f\xe6\xcfԷ\x85+շ\xc2\xc1?W\xc3\xffo\xfe\xdf\u007f\xd0.\xf8\x9d\xa9\xa6<~\xc3\xf08\u007f@Gf\xf89\xba\xae\xa9I\x95\xf1\x8e\xc9,z\xc6<\xcf\xf9c\v\x11\xfe\xad\xcf\xe2\x9d\xfb\vz\xf8\x8f\xe1\x9fg\xb5=\xbf9\x89X\xe1\xff\xb2zߗ\xb7\xb6\xee~\x80\xd0\u007f\xc1\xe1\xff\xcf?\xd3>\xea\xbb\x12y\xb3\x88\xd0\xecJ\xfc!\xe0@V\"3\xfc\x1c]\x97F\x96\x9d\xf3\xb3\xc3oo\xee\"¿\t\x9f\xed?\xf8\xb1\x1e\xfe\xb5ډ\xfenz\x12\xb1\xc2\u007f\xabzmu\xf5n|U\x1f\x87\xff\x0f\xff\x93\x1e\xfe\xfb\r\xbb\xf1\xae\xff\x98\xf6\u0381\xc2%6\x02!\xc0QH\r?[ץ\x12\x0e\x8cw\x04b\xcc\xf6\xb3\x14\x8e\xf0\v\t\xcc]\xb7V\x9f\xb9\u007f\xae\xf6\xd6\xfd\x17\xd5\xf4\xf6T\xbfp\xa6\xe7\xc7\xd5k{\xc6\xd4lW?{\xee\xec\xd6տA\xe4\xe4\xb7ccc\xb5G\xc6\xc6\xee\xa3/\xf1\xef\a\x9f\x1e\xa9\x1d\xfb\x12ݪ\xbdre\xec\xb7\xf8\xe6\x1f\x1c\xfe\xff\xed?\xfc\x8d~\x93\xcfX\xedֳW\x8eU\x9f\xd5\x16Ӓ\xacP\x14\xc8:\xa4\x86\x9f\xa3\xebR\xcb\xf1)\xffq\xfe|\xb3\n\x8e\xf0\vٛ\xbb\x1e\xa8;\xeds\xab\xabk\xcfUW\xbf\x80\x1e\x9c\xd9Z\xdb\xf0\xe2٭\xb5\xbb\xf1\xb1\xfeK\xab\x1b^\xfc\x12\xd71'?\xae\xd69\x8b\x8e\xa8?k?\xc5\x1f\xfb\x1fQS\x8e\xcbjw\xdf\xd2\xc2\xff\xbf\xff\xe7\xff\xeb\xbf\xeb7\xf9\xfc慆\xd5\xcf\xea\xdf\x04\xf0\xe7\xed\xe0v\x01p\x18r\xc3\x0f$N\xf4螞d\xf1\xaf\xb5G\xfe\xf5w\xbf\xbb\xff\xf1\v\xab\xefk\xe1\xffo\u007f\x85o\ue9eat\xb9\x1a\xe1\x16\x1f \x02\x84\u007f\xa6\x13\u007f\xf8\xdf]\xad\xdf\xee\xff`\xed\x15=\xfc?\xfb\x9b\xff\xdb\xf2\x95\xde\"\xf8R\x1f`\x00\xe1\x9f\xe9\xc4\x1f\xfe[\x91\xcb\xfa\xb7\xaa?\xfd\xb7\xf8j\xff\u007f\xd0\xce\x02lg\x01\x9c\f\x84\u007ff\xf3[\xedz\x9eu\x92̓\x97j\x8f\x9c\x1b;w\xa4\xf6\xa5\a\x10~@\f\x84\u007ff\xa3]\xcf\xfb\xcc:\xc9\xe1\xc1\xbb\xfb\x1aj\x1b\xf6\xbd\xfb\x00E\x0e\xfb\xe11^\x80\r\x10\xfe\xac\x04\xc2\x0f\x88\x81\xf0g%\x10~@\f\x84?\v\t\xb5\xd6\xe1;\xfc\x9a.\xc0\xc7z\x80\r\x10\xfe\xec#\xbc8\xfa\x95ޓ\x90~\x80\x0f\x84?\xfb\b=t\xf0\xf7\xbf\xff\x9f\xea\x06z\xe8\t\xf8\x0e\x0f\xc0\a\u009f}\x04\x15\xa5\xaa\xea\xa1ª\x85s\x1a\xb3\xe5\xfb\x12@:\x80\xf0g\x1f!\u007f\xb1\xdb=\xdf\xedv/\x1d\x86=?\xc0\a\u009f\x85\x84\x02\xdaS\u0086\xea\n\x95'Du\x01\xe7\x02\xe1\xcfF\xc2\xe1\x90\xfao\xfe|\xef@\xf6<\x1d\tH9r\xc3\xcf\xd4u\x85:\xb4\x87xudӕ\xe9\x81BC?6\xb5\xad0o\x05\xf5\x90\xa2#\x91\xa7nO\x8f\xe8\"\x1a\x15EɻɨpU\xe9c\x94\x02@\x14\xa9\xe1g뺂\xde\xf7\x03*\xf4\xa3lg9\xbe|\xe3\x11\xb9K\v\xbd\x8dyԹ\xf7o\xc7\x04\xdfЉ\x8b\xe8\"\x02~\u007f+\xf3i\xdc\xc3\n\xfd\x8c@\x00\xa0\x91\x1a~\xb6\xae+\x98EO\xee40v\xf5SJ+\n[\xaf\xbb\xa5\"\xfc\xe6\"Ԙ\x0f1\xfe\xce,\x9d\x932b\xdb\x06f\x19R\xc3\xcf\xd6uee\xf8\rn*\f\xffpJ\xc2o\x92H\xf8\xbfI\x11\x10\xfeُ\xdc\xf0#\x96\xae+\xeb\xc2\x1f\xccS\x94\x9c\xe3x*\xe4֟\xcfo}tV\xed\xb1\xa8w˄\x90x1}^h\x9b\x92\xeb\xdd1?o\xb9v\xf4d,\x02\xc3\x0e\xff \x84\x1f\xb0Er\xf8Y\xba\xae\xa0w\xe0\r\xefq\u007f\x16]\xef\xbb\xec\xf7\xbb\x9a\xb5\xa9\xf7\xfd]J\xb3\xdfo}w\xc3O\xe2<\xf7\xe3Z\xea\x91ڄċ\xed\xf3\xbaq|\xaeR\xd8\xdcR\xa0=\x19\xd8\\\x04b\x86?49\xb8\xd0\xcd\xf8\x94\x1f\xc2\x0f\x18H\x0e?K\xd7\x15\xf4v^\r\xdc\xe8\xeeʢ\xf4#\x94\x17M&\xfb\xb0\u007f+\x16hm}\x96*$$^l\x9f\x17r\xb9\xd5w\x91\xf5\x85\x91\xff\xe5م\xff\t\xf5\xb8\x81\xb1`\b?`\";\xfc(Fׅ\xc2\xe3\xfaA\xc0\x90`\xbeY\x85 \xfc\x9aw+j\xdf\xd0!$^\x1c\x9f\x17ra\xbbv\xb3+\xf2?\xdb\xf0\a\xfa\xbc%\xd3\xda\xf3\xcf\xd1\xfe\xd9\xfc=\xb6m`\x96!5\xfcL]W\x14\xffI\xf6L\xb3\x13A\xf8)\xefV\x04B\xe2\xc5\xf6y!\xed@?\xbe\xf0\xab\xf8\x95\xe1\xd8B\x1c\xe87\xffH\x8f\xf5\xbf\xfc\xe5\xc3s\xbe\xffS^\xb8!\xfcY\x8f\xcc\xf0\xb3u]h@O\xc7 \xeb(u\xd6\"\b?\xe5݊\x9b\xc4\xc2Ͻ\xda\xff\x837\xf5X\xff\xc5\x0f~\xf9\xc5/\xff\xe4\x17\x9cpC\xf8\xb3\x1e\x99\xe1\xe7\xe8\xba|\xda.\u007f\xaa\xe3}\xdbyg\x19\x82\xf07h\xe7\xfc\xbbc\xffbK\x8a\xc2\x1f\x8d\xf5\x1f\xfeJ\xfd\xf1\xab\xff\x18I\xf3O\xbf?\xe7\xe1\xbf\xfb\xe6\x9b_\xfe\xf0\xa1\xef\xfc\xf0\xd7F\xf8\u007f\xfa\xdd9\x0f\xff\xe57Ą\xfa\xf79\xdf\xff{\b\u007f6 5\xfcl]W\xc0\xdbw3p\xb9ݗ5\x9e\xceА\xdf\xefj\xf4\xfb\x83ѫ\xfdC\xd6U\xab\xad\xde76\xf6\xac\xa6\xe0\x8a\x9f\x80?\xb7q\b\x8d6\xe6\xfa\x03\xe4\"\xb4;\xfcZb?Q@\x97Y:\xde\xd8\xf0?\x1c\xc9\xfe\x1f\xfe\xf4\x8b_\xaao\x04\xdf\u007f\xf3\x8b_\xff\xe9\x9fF\xc3\xff?\xbe\xff?ԃ\x83\xbf$&\xbe\xff\u05ff\xfe\x97_\xfc\x10\u009f\rH\r?G\xd759p\xbc\xc37\x9e5\xd9Gú\xafK\xf1F?\xe7\x9f{\xc3Rck\xcf\vQ\x05W\xfclS[\xca\x1d\xcfW\u007fn#\x16\xa1\xddۏ\xa9\xb7֟\x9c[w5\xc6|L\x86_?\xec\x8f\x1c\xdc\xff\xd1\xdf\u007fc\xf0뇣\xe1\xff\xc1/\"\xef\x0f\xc6\xc4w~\xa5ׁ\xf0\xcf~\xe4\x86\x1f\x90Io\x89\x12\xf3\x95^2\xfc\xf8\x82\xdf\xc3\u007f\x17\t\xff\x9c_\xeb\xbf\u007f\xa5\x1e\xd6ϙ\x13\r\xffC\xfa\xad\xbc\xc4\xc4_<\xf4\xa7\u007f\xf7+\b\u007fV\x00\xe1\xcff&\xafZO\x06\xc8\xf0k\xbc\xf9]\xfd\xf7C\x91\xf0\xff\xe0/~\xf5\xcd\x17F\xf8\xe7D\xf6\xf3\xe6\xc47\xbf\xf8\xeb\x1f>\xf4\xd7\x10\xfel\x00\xc2\xef,b\xc2\xffÿ\x8c\x84>r\xd8\xff\x9d/\xd4\x13|#\xfc\u007f\xf4\xb7\x91j\xc6\x04\xe6\x97߁\xf0g\x03\x10~gA\x86\xffO~\xf1/\xbf\xfc\xd3?\xfa\x17=\xd0o>\x1c\xb9\xe0\xf7\xd7_\xfc\xe2\xbbF\xf8\xdf|\xe8\xef~\xfdś\u007fBL\xfc\xc9O\xbf\xf8\xe2o\xbf\x0f\xe1\xcf\x06 \xfc\xce\x02\xc7>r\xf6\xfe\xcd\xdf\u007f\xf7\x0f\x1e\xfe\x8b/\xa2\xbb\xf3\xbf\xff\xae\xf6Q\xdf/\xbe?\xe7\xe1\xbf5\xc2\xff͛?\xf8Μ\x1f\xbcIL\xfc\xf4\as\x1e\xfa\xe1/!\xfc\xd9\x00\x84\xdfY\x10\a\xfc\xd3\x03\xc2?\xfb\x81\xf0;\v\b?`\x00\xe1w\x16\x10~\xc0\x00\xc2\xef, \xfc\x80\x01\x84\xdfY@\xf8\x01\x03\b\xbf\xb3`?\x8c3\x19DK\x02f<\x10~\xc0\x96\xec\xf9\xca\x05`\x05\xc2\x0f\xf0\t4\x82\xf0+\x8b\x81\xf0\x03\\\xc2%% \xfc\xcab䆟\xa9\xebR\xb9\xd1\xd7\xd1}\xd9f> \x82\xad\x06,\xe5\x80\xf0+\xbb\x91\x1a~\xb6\xae\v\x85\x06\xbcC\xb7G\xbd\xf4\xc3*\x01\x16\xb6\x1a\xb0\x94\x03¯\xecFj\xf8ٺ.4\xd0\x1e\xc0o\f\xd6'^\x00\f\xec5`)\x86\xfdx0 [\x90\x1a~\xb6\xae+\xe0}\xdf\xf8\x1b\x10/\xccg\x03\xa6\x18\b\u007fv#7\xfc\x88\xa5\xeb\x1aj\x0f\xc1\aJ\xf1 Ҁݪ\xad\xae~\xf5\xb3\x177\xd5\xee\xfb\x1dQ*Ԁ\xa9|\xf6\xc2\xdaچ}\xbfE\x16\x98\xc2/ k\x90\x1c~\x96\xae\xab\xd7w\xe3\xa4\xf7\xf8\x85\xac\x12\xf6\xa4\a\x81\x06\xec\xdbs\xe76m]\xddp\xec\xc5?#\x9f\x0e(Ԁ!4V\xfblϕ\x9e\xea3T!O\xf8\x05d\r\x92\xc3\xcf\xd2uuk\xba\xae\xe3ݐ\xfe8\xb0\u007f$8\xfaq\xf5\xee\xfb\xe8\x01\xad\x03\x10j\xc0\xbeݴ\x0f?I\xfc\x1c=\x1bO\xf8\x05d\r\xb2Ïbu]>\xed\xaa_\xb0\x83\xe1\x97\x01\xac\x88\xc2_\x1b\xf3H`\xb1\x06\xecJ\xf5\xa7֙\x10_\xf8\x05d\rR\xc3\xcf\xd6u\r\ua7ae\xc1^\xfe\x8c@\x14Q\xf8i\xf7\xa7\x86P\x03v\xa6\xfa\xdbع\xb49Y\xc2/ k\x90\x19~\x8e\xaek\xb4C{/\x18\x80c\xcc8\x10\x85\xff\x05F\xa1\x88+\xb43\xd0\x04\xae\xf6g72\xc3\xcf\xd1uMi\x1f\xf5\x05\xdb\xe1\x16\xbf8HG\xf8\xef7\xecƻ\xfecǬ\u007f\x80\xf0g7R\xc3\xcf\xd6u\xa1\xcb\xed\x97\x03\xe3\x9d'႟\x00\x91\x06\xecwcc[w\x8f\x8d}ƙ\x9d\xcfX\xedֳW\x8eU\x9f\xb5\x963\x85_@\xd6 5\xfc\x1c]\x17\xba\xdd\xdbq\xf22d_\x84H\x03v\xabZc\x1fgv\x1b~\xf3B\xc3\xeagߍ)f\n\xbf\x80\xacAn\xf8\x81\xd9\x05K\xf8\x05d\r\x10~\xc0\x8eX\xe1\x17\x905@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1\xc8\r?K\xd7\x15\xea\xf4\xea\x1c\xb7\x9f\x17\x98!\x10\xca0`V#5\xfcL]W\xc8;\x1aP\xb9\xec\xbd*\x9a\x1d\xc8\x18\x83\xa3\xe64\xa1\f\x03f5R\xc3\xcf\xd6u\x8dk\x0f\xef턇\xc6\xcc`\x16\xd6\x13\xff\x81\xc7{d\tR\xc3\xcf\xd6ui\xf8ހ'\xf9\xcc`\xca\xeaD5\x80ه\xdc\xf0#\x96\xae\v\xa3=\xcf\x13\xc8\x14\xb7\xebܹ\x85+\xb4\xc7v\xb4\x96啵\xaa\xbf\xb7)\xb9\xde\x1d\xf3\xf3\x96\xe37\xea\xc8\xc3\xfe\xcb\x10\xa9\f#*lSr:\xd1m\x97R\xa25ֹ8\u007f\xfe\x0ex\xe0\xff,@r\xf8Y\xba.\x8c\xe6\xf1\x002\xc4`~Y\xcb@\xb3ҢN6\xba\xf6\xf8\xf6\xb8֫o\xc7\xc7\xe7*\x85\xcd-\x05\xea.?x\xc1?\xbf\xca\xef\xf7kO\f4\x94aD\x85\x80?W-\x1ajt\xe1\xf2Ɯ\xed\xbe\xd6\xc2287\x98\xf9H\x0e?Kׅ\xa2\x17\x03\x80\xcc\x10*^\x1e\xc2OT\x9fB\xa8O\xc1\xa7c\xfaO\x97[\xdd(\xeb\v\xb5*\xd4a\u007f\xf4\xf1\xe1D\x05\xed\xfd\xa0\x19\x87ߧt \xfc\xd0\xef.\x04\xcctd\x87\x1f\xc5\xea\xbaT\x06\xba\xedg\x01҉Oy?:٨\x1f\xb9\x974\xaa?\\\xf8\x87\x16h^\xf8\xcd\nf\xf8\xeb\xe7\x850ō\b\x98\xe9H\r?[ץ\xd2\x01\u008e\fҢ\x18\x17[\x17\xaf\xd4~\xadX\x88\xc8@\xf3\xc2oV0'\xcb\"\x17\b\u087f3\x1f\x99\xe1\xe7\xe8\xba\xf0\x95\x00J\x1c\t\xc8e@1>\xc5o\x9c\xa7\xfd\x9a\xa7\xed\xf9\xad\xe1o\x8f\x9c\x9b\xf1¿\aO\xae\x9f7\xaa1\x85\x80\x99\x8e\xcc\xf0st]\xf8\x94\x1f.\x0eg\x90`Q\x15~+\u07be\x1d\x9f\x01\xe0s\xf5.M\x05F\x86\xbf\xaa\n\xa1I%rr\xc6\b\u007f^\x93\xfa\u07be\x10O\xf6\xe9\xb5\xf6\x1cD\xc0LGj\xf89\xba.\xf5\x9d\x00>\xe4\xcf$\x83\xdf+\xf1\xfa\xb6+\xed\xea\xe4\xfa\x9c&_S\xcez\xed\n~\xe3\x10\x1am\xcc\xf5\xe3\xfd}\xb3\xab\xa5wi~\x80T\x86Q\x15\x16\x17\x1e<\xb8X\x99\xdbq\x03\xa1&\xa5\xbe\xbb\xb7Q\xe9\x14-\x14\xc88R\xc3\xcf\xd5u\xc1\xfd\xa2\x99\xe5f]q\xc1B\xedSװ\xf69\u007f\x18\u007fv\xaf(\xb9\xe3\xf9\xea\xcfmjqh\xbb;\xaf\n\xfb\xbaMe\x18U\xe1fU^\xc1\xf2&\xbdn_\x95۽\xb8\xcfvy\xc0\x8c@n\xf8\x01\x00\x981@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8\x01\xc0\xa1@\xf8g\x0f\xf5\x8a{\xfd\rQ%\x00\x88\x17\b\xff\xec!0\xd8Q\xe2\x86'\x1f\x00\xa9Bn\xf8Y\xba.\xfct\xd87\xda߸\x00\xaf\xea8\x18T\xc0k\x04\xa4\n\xa9\xe1g\xea\xbaP\xb0\xf3$.\xed\x84\xf4\x8b\x19V\x86DU\x00 N\xa4\x86\x9f\xad\xeb\xf2wk\x8f\xf0\xef\xf6\v\xe6\x06 \xfc@*\x91\x1a~\xb6\xaek@\u007f|w/x;\xc4@\xf8\x81\xd4!7\xfc\x88\xa5\xeb\x9a\xea\x1c\x9c\nM\xf9;\xe1y\xafb\xae*\x83\xa2*\x00\x10'\x92\xc3\xcf\xd4u\x85\x06\xd4\xd2>x\x86g\x1c\x84\xdc\v/\x04\xc0\x84\x05\xa4\x04\xc9\xe1g\xe9\xbaB\x03\xdd\xf8\x99\xbe\x03\x90\xfe8\xe8S\x14e\xa5\xa8\x12\x00ă\xec\xf0\xa3X]W\xf4\x82\xdf\x05ь\x00\n\x16\xcek\x19\x04\xc3\t\x90\x12\xa4\x86\x9f\xa9\xeb\n\xb7\xeb\xa68\xcd\xe3\x03\xd83\xac\xc0eQ U\xc8\f?[\xd7\x15\r\xff(\x84_\f\\\xed\aR\x87\xcc\xf0st]\x83\x91\xc3~\xb8\x8e-\x06\xc2\x0f\xa4\x0e\xa9\xe1g\xeb\xbaB]\xdd\xe3\x81\xf1\xee.\xb8\xe0'f\b\xc2\x0f\xa4\f\xa9\xe1\xe7\xe8\xbaB\xc3';N\x0eC\xf6E\x84\x02\xa3\xf5\xae\x80\xa8\x16\x00ĉ\xdc\xf0\x03\xd3\xe1\tE)\xee\x15U\x02\x80x\x81\xf0\xcf\x1e\x02\xa3\xb0\xdb\aR\b\x84\x1f\x00\x1c\n\x84\x1f\x00\x1c\n\x84\x1f\x00\x1c\n\x84\x1f\x00\x1c\n\x84\x1f\x00\x1c\xca\xff\x0fL\f\x1em+\xfdz{\x00\x00\x00\x00IEND\xaeB`\x82", + + "analysis/chan1.png": "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x04\xc0\x00\x00\x02n\b\x03\x00\x00\x00aR\x8e\x00\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x00\x01\x00\a\n\a\x0f\x11\x0e\x1a\x1a\x14\x1f\x1f\x18!# #$\"\x15%D$%#%'%'(&+)\x1e()'*+)/,!+-*,-+-/,02/63(241564796<9.9;8#?r@=2<>;>@=C@4DA5AB@DFCFHELH:IKHKLJNOMUP?PRORTQTVSVWU]XGWYV_ZI,`\xaeZ[Y7]\xad[]Z\\^[9a\xab;b\xace\xafac`hcQcdbAg\xb2efdCi\xb4fheDl\xb0Mj\xafqjRikhGn\xb2Ip\xb4lmkKr\xb7npmUt\xb4{s\\rtqWv\xb6tvsuwt[y\xb9\\{\xbbxzw]~\xb8e|\xb8\x84|dX\x80\xbf{}za\u007f\xbf|~{~\x80}b\x82\xbc\u007f\x81~d\x84\xbf\x81\x83\x80|\x83\x97\x83\x85\x82l\x86\xbch\x88Ð\x86hn\x88\xbej\x8ać\x88\x86q\x8b\xc1\x89\x8a\x87t\x8e×\x8doz\x8e\xbf\x8c\x8e\x8b|\x90\xc1\x8e\x90\x8dx\x92Ȑ\x92\x8f~\x93ĝ\x93ux\x96Œ\x94\x90\x81\x95Ɠ\x95\x92{\x98Ȕ\x96\x94\xa2\x97y\x96\x98\x95\x81\x9aė\x99\x96\x84\x9cƇ\x9b̙\x9b\x98\x80\x9eͦ\x9c}\x87\x9fɜ\x9e\x9b\x89\xa1˞\xa0\x9d\xa0\xa2\x9f\xa1\xa3\xa0\xa2\xa4\xa1\x91\xa5ʏ\xa7Ѥ\xa6\xa3\x94\xa7̥\xa7\xa4\xb3\xa7\x83\x92\xaaԧ\xa9\xa6\x97\xaaϩ\xab\xa8\x9d\xac̫\xad\xaa\x9b\xaeӟ\xafλ\xae\x89\xad\xaf\xac\x9e\xb1ע\xb1ѯ\xb1\xae\xb1\xb3\xaf\xa5\xb4Ԣ\xb5۳\xb5\xb2ö\x91\xab\xb7ѵ\xb7\xb4\xa8\xb8ح\xb9ӷ\xb9\xb6\xb9\xbb\xb8\xb0\xbc\u05ed\xbdݻ\xbd\xba\xb3\xbeٽ\xbf\xbc\xb7\xbf\xd4\xcd\xc0\x9a\xbf\xc1\xbe\xb6\xc1ܹ\xc1\xd6\xc1ÿ\xbb\xc3\xd8\xc2\xc4\xc1\xbd\xc4ں\xc5\xe0\xc4\xc6\xc3\xc6\xc8\xc5\xc0\xc8\xdd\xd7ȝ\xbb\xca\u07bd\xc9\xe4\xc5\xc9\xd9\xc0\xcb\xe6\xca\xcc\xc8\xc7\xcb\xdb\xc2\xceܿ\xcf\xe2\xc9\xcd\xdd\xcd\xcf\xcc\xc9\xd0\xe6\xcc\xd0\xe0\xc6\xd2\xe0\xdfѤ\xcf\xd2\xce\xd1\xd3\xd0\xd2\xd3\xdd\xd3\xd5\xd2\xcd\xd5\xea\xce\xd7\xdf\xd5\xd7\xd4\xe6ת\xd6\xd8\xd5\xd1\xda\xe2\xd8\xda\xd6\xd9\xd9\xe4\xd3\xdc\xe4\xd5\xdb\xea\xda\xdc\xd9\xd8\xdd\xe0\xdc\xdd\xe7\xdc\xdf\xdb\xda\xdf\xe2\xe0\xde\xe2\xde\xe0\xdd\xf0\xe0\xb3\xd6\xe2\xf0\xdc\xe2\xe4\xe0\xe2\xdf\xde\xe3\xe6\xde\xe2\xf2\xe2\xe4\xe1\xe1\xe6\xe9\xe4\xe6\xe3\xde\xe7\xef\xe8\xe5\xea\xe5\xe7\xe4\xe6\xe8\xe5\xe4\xe9\xeb\xe7\xe9\xe6\xe8\xe8\xf3\xe8\xea\xe7\xe2\xeb\xf3\xe9\xeb\xe8\xec\xee\xeb\xe6\xef\xf7\xe8\xf1\xf9\xef\xf1\xee\xf0\xf0\xfb\xf1\xf3\xf0\xf1\xf6\xf9\xf4\xf6\xf3\xf7\xfa\xf6\xf5\xfa\xfd\xf9\xfb\xf8\xfa\xfc\xf9\xfd\xfb\xff\xf9\xfe\xff\xfc\xfe\xfb\xfe\xff\xfc\xc5\xe5[\xa2\x00\x00 \x00IDATx^\xec\xbdqLS[\xda\xef\xef93\x8b\xab}\x87Ax+\xc3}\xf5^8#\xbe\x1c\xbc^gk\xa9\x17\u007f\xe2A.U\xe1u^\x05މ9\xf6\xe8}\xc9\x18\xc5\x174z\x8fg\t\xddk\xaf\xfd\xac\xb5\xf7j\xd9߮\xf5\xec\xd5\xf5l\xf8\xdb{\x80\x01\x00\x00V\x8e\xbfmH&R\x89HV;\x00\x00\xc02\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\xac\v\x02\xc9\f\x80\x94\x04\x04\fX\xfbx*\xb6\xa0\xfdɌ\x80T\x04\x04\fxO\xda\v\xbc\xc9L\xd4\xc1[Ю| \x90\x97\xc7\xf7\xb8\x95\x8f\x01\xa9\x8d\xda\x02\xe6\xe9j6Y\x06|\xb2\xe4|\x13/М\xa0\xe0_\xaf\x95\xe9k\x83\t\fbiۈ\x046\xb6%3]\x94\xed\x12\xa9C\x9b\xe8\rf\xcd@u\xca\x06w\xd9\x05d\xeds)\x1f\xc6\xd8L\x0eבz\x102\xc53\x890\x9aƪK{ \xecNnByds\x84de(\x9c\xc0\xb1'#\xbb\xb47{:\xf6H2\x1aйd&K`\xec\xd0p2\x13F\xbf\x8e\x13\xd0\xf5\x93KIkP4\x1aG]\x8a\xf9@ꣲ\x80M\xf3V\xa7\xdb\xd9\xd6\xec\x93&g\xf8Q\x0f\xe1\x01?\x9e\xa0\xe4\xe9C\x9d\x17\xf5o\x13\x18\xc4Ҁl\xb6\xaf\xd1e\x9b\r)\xff_SzG\x17n\xbbDB\xa7\xf0\x96f\xec\"\x9b]\xe9\xa5qz,\xbe\x81MGl\xbd\xbfٖ\xeeT>\x8e}f\xd4\xe0\xc5\xde\x06d\xf6ű\x88\x9c\r\xcf\x0f\xb2\x06\r\xfa\xc5\xfd\xc1#\x1a\xf2\xea\xa6\xcd\x1c\x8c)Օ\xb1\x83oَP\xbc3\xc7\xe77if!\x11>q<\x1e=Y\x84\xc1pq\u007f|C\tw8\xbb\xbd\x93\xeb\xb0\xdbw\xdf!{֍W\x95\x8c\x86\x90M)\x1bX\x03\xa8,`.\x9e\xf6\xe4}\xbcS\x96t\xd0\xfb\xd1\xd74\x90\xa0\xe0\x0f\\'\x0e\xce&0Pಆ\xfe\uf4bb5\xfdr\\\x9b\x1d\xa5\v\xb7]\"\xa1S\xe0S{3|؛\xbe\xf7T\\S\r\xed\x9b\xf9r\xf6\xc4;\xee`]\x89^\xe4\x88g 9\x1b\x16\x1b\x14\xa6N\xa3\x94\xcb\xf0f\xee':\xe7۶x\x01\x9bԄZ#=\xb1\x04oaH\xaek.(\x1aD\x90\x19,\xb0\xb3ݡ\xc3\xf817\x81\xb1\xbe\x83\xee\x9e\xd1(\x8d\x14\x15Z\f\xac\x11T\x160̺\x0e^\xde#OR\xeeޚW.\xc2x\xc1-lH!\xc5\xef\x12\xffw]~\x1c\x8f\xfc\x83\v\xb7]\"\xa1S\xe0S\xa5\xbbZp\xd3/J\x93\b\x18>\x97\x1e\xef\x91\xd9\x02\x04,|6\xbc\b\x01;\x95\xceƎ\x97P\xdc\xd1k<*\xb2C\x9dA\xe9\x89%8\xc2\x17[\x95L\xc0\x92\x1a(0\xf7B\x14\xb0\x17stח]\xa1`\x04\x02\xb6vQ[\xc0\b3n\x8b5\x10\x93t\xf2\xf1\xfd/se\x82\x9f\xe3&\xc6\xd78\xae\x0f\xbf\xd0q\xbf\xa4Iݽ\x9b\x95\xfa\xda\xef\x99͋\ve\xbaCbZB\xe4\u007f\xb7\xa9 #\xb7\x9a\xddm\xb6=9\x9b\xb4{\xb7\x92\x11\x87\xe8\xf7ʗَoD茫|k\xfa\x9ey\xec;\x98\xad\xc9\xd9G\x87\xb6\xc7\xd0&\xbe:7c\x8f[V\xc31\xb4\xf1jEN\xc8mu=?c\xfbuy\r\xd2S\x9c*\xbd~\x00\xef\xbdN\x05,R\xaf\x93\xd8\xee\xc39\be\xf9C\x02ְ\xd1/\xb9^\xe9\xe5\xc8\x04,t\xb6\xa4\r\xc2\xd8S\x9e\x9du\x80\r!\xb1\xe2[\xb2M\xb8\xed\xbd\x97\xfc\x92z%-Vn<\xc1\x9f\xf99\xdbF\x9d8\xc4\xd5\\\xab\x139\xad\xb9\xd7\xf1\xb0說\xa1\xd9\xc1\xfb5ŕ7Y\u007f\xda^{XWV{8(3x\xab\xe7\xe8nj\xa3>\xe3W\x17\xcb\f7o\x96\x15\xf7\xc9O\"\b\x98ș\xf4\x19\x1cC/\bؚEu\x01\xf3\xf2\xae\xd5n\xff\v\xc6\xdf\xdbu\xad88\xf1e\x11\xc6S}:\xeeP띒\xf3\xd4\xe2Qq͝\xb1V\xae#\xbad\xf8n\xadH;n\xbd\xaa\xcd\x0fЬ#\xb7\xbay-\"\xf24`\xcb-\xb4\xd9lN\x99팥yknfNu9r\x93\x1b\xb3\xa2ײ/m\x88\bM\xf3F\xa4\xad\xbb\x94y\x00Kk\xa0\xb9[\xeb\xea\xb6fPI9\xa29c=\xa3)\x97\xd5 =ũRw\x86\xf7'\x1e*`\x91z\x03\x83ui\x83،\x9a\x1ebQ\xc0\x02\xf9ۥ\xd7+\xbd\x1c\a\xb2\xce\xcc\xcc\xdcE\xb2\xb3%m\x10ve\xe6\x9a\xdb\u007f\x814\xf1\xde\x12\u007f\x9ad\xdc\x1c\xaeW\xd2b\xe5\xc6\x13FQ/+\x14u\xe2\x10\x9er\x94\x87>A\xa5n<;a\xaf4\xda\xed\xf6\xe74\xfb\nwc\xa4\xf3P\x15\x19%>\xdd}\xb1\u007f\xec^\x19\xf7Nn\xf0\xd8n\u05f7҄\xf43\x9e;a\xe8l\xd5\xeb\xef\xd5F\u007f\xc8R\x01\x1b\x88Ѫ\xf9\xe9\xde\x1dY\xf1}\x86@j\xa3\xba\x80a\xaf\xc7ai\xf6E'\xdd|\xe2\xc7ܑ!d\x11\xfd\xcfn-b\xc9\x12\xf2\xcd|\xf1\x10I\xcd\x1d\xae%C\x88\xb9\xbe\x1f\xa2˅\xeeV+2\xb3\xbd\x16\xd2\xc3\xd0\xd2{\xef\xeb,\xd6\xf5S\x1eq\xe5\xa3]>6\xc6\xf5Y\xe8\xe5}\xc2\xe6\x10i\xb2\xc8%\x96k\xb1\xbc\x06\xcdVj\x96S\x80q\x17\xeb\x1eu\xa1\xbb\xb2\x1adCH\xfcɱ\x1d\x98\xf5\xc0$\xf5\xe2#\x05\xde\x1c\xe1с\xe6_g|\xe3\aP\x8f\xecz%\x959Ď\x8eCv\xb6\xa4\r\xfat\x1b)\x1bخ\x91\xe7FN\xe1F\x91\xf9\a\xd2VDZ\x1c\xa7\xf1\xa4\x8e\xc9PA\xe5!d\xd7&\xb4鮐\f\x8f\x10\x87\xb9\xfb\x98\xca\x0e\xe9Iu\x1ezG\x92\x9d%A\x99\x01E\x100\xe9g\xdc\xc7=#\xa6\xdc\x14\x8eF*`nt+\xea\xe8~\xf2~Y1\xb0FQ_\xc0\b~Kwt\xb2\xdb\x12ך\xa1,`\x17C\xc9\x11\xee\xa9r\xb9\xd0\xddZ\xba\xcd?O\xc8!c%w\xf6\xd6\u007f\xe6\x1f\x06\x04_W\x1c\x01\v\xfb\x82\xbd\xd7\xf7l\xcbD\xb4K\x845G\xc8\xcb9\r\x96נ\xf9\x82\xbe~\x8d\xbc\xb8\xe2\x13V\"\uf23c\x06\x99\x805\xa0\x06&`\xd2z\xf1\xcc\xf6-\xfb\x04\v\rU'-U\x13\xc9\xf5J*s\xa0KCCC\x97\xa9\x80IΖ\xacA>\xc4\xd3\xcd\x19\x8d,Wr\n\xff\xc6H\x0fLڊH\x8b\xe34\x1e\xb7'\x160o\xb5&\aekN2?~X\x9f\xea\x8fν#\x18\xae`\xfc\xd2p\xf4ƽ\xa7A濊#`\xe1ϸ\xb1\x84\xbc<\xe7\xbe\xc5\xd1\xc8\x05\xac%\uaa3b\x8bσ\x1eؚEe\x01\xf3\v\x1e\xafq> M\x12\xcc\x0f\xe2\x96a(\vX8\xd9\xc1\xcd)\x97\vݭ\xdbž\v\xed\xf3\xf8\xf8\x83yh\x8b\xd0\xe7\x89#`;BY[r>o\xb3\xed\x14\x04\xec\x1c\x0ey\xc2%5\bn\xab^4\x8a?\x15Tho\x81\xac\x06\xb9\x80yɽL\x05LZ/Ʒ\x90\xf8\x00VS14$\xb8Ӥ\xd7\x1b\xa9L\xe2\x03\x93\x9e-I\x83\x1e\b\xb3\b\x04%R|KD\x1f\x98\xbfK^\xaf\xa4\xc5ʍǃ\x91\x11\x9b\x92\x805hy'r\xfeF\xcbޣ\xb0>\x9d\x10\xdd]gI\xfa\xed\xbd\v\x95\\ٝ\x04=\xb0\xc8g\xbc\xfb\x15\xfd\xa6J\xdc\x03\x1b\n\xbd\x95Rlh(6\x13X\x13\xa8+`\x81&\xc1e\xf2\xd0\x14\x90$1u\x87%\x99(\x1d%`\xdfD\t\xd8\x18\x1d^(\x11\xba[˷\x8d2H_\xe0\x01\xed\x01\xf9Zҙ\x03\x9c\xddv&\xb7̖\xe4\x1e\x10\x13y\x05\xf4\xbb\xfb\x80 `\xf46d\xf7\xb0\xb4\x06M5=\xc6#\x1f\xae\xd8Ɗl=\"\xabAr\x8aS\xc2D\x03*`\xd2z\xb1'\xfb\x8b\xad\xc2\\\x03Mx\x8a\xab\xe4z%\x95I\x04Lr\xb6d\r\xf2\"v$ډ/9\x85\xf8\x14\xd2B\xfb\x91\x92VDZ\x1c\xa7\xf1\xd8DŽ\x8d!=q\x18?{\n)\xf4֘>\xdd{I{`O\x18D\x8f\x1e7\x12\xe9zۧ\xef\x94\x19Pb\x05\xec%W\xfb\xf2Y\xa51v~\x85T\xc0\xea4\n\x9d-x\n\xb9vQW\xc0p3\x9b\x12\xed\xa7\x1e{I\x12\xe3I>I'?\"`\xfaF\x8c\x83\xff\x12%`\xb3\x06#\xed\x82ݸ\x11].\xf4\xbfۅ\xd8\x18\xf5\x8b::#\x9e\x9d\xb9\xf0\x18{-\xc4xZ8&\x15\xb0Po\"\x87JG`{\x94\x80Ik\xd0l\xa1\xee\xa9m\x85\xd4\x1fDG/-\x82\xc3E\xd2\x1f\t\x9fB\"`\xd2z\xfd\x05g\xf0\xb1]\x81\xf0)\x18\x92\xeb\x95T&\x110\xc9ْ6\xa8 \x87\x88\x94\xeb'\x1a,˕\x9c\u009by\x80\x88L\xa0p\xab\xbc\x15\x8a\x02&;\x1b\x19\x87\n\x1di\xf9\x89%\xb8\xb3B\x9af4b\xfc\x9a:\xbeƄ'\x8c\x8d\xb7ɇǍ\xb0C\xd7d\x06\x94X\x01{\u0095q\xdc\xe9\xd0sfwCx\xf0*\x11\xb0@\xde^\x1c\v\b\xd8\xdaEe\x01s\xf1\xddN\xb7\x93y\xee%I:\x89\"\xe1\xf4+\xe1)\xe4\x04\xfb\xf25\x1e\xbas\xbb\x86\xd3ݟ\xfa\x8b]\xf7\xe5D\xf0\xe9\x97:\xfat\xf2\x91\xfeD\xe7\xc8\r\xee^T\xc1ѯ\xd1\xe5\a,u\n\x95Z\xda+P\x13\xbd\x037\x9f\xb3\xb6U\b\xcf\xcf\xcei.\xb5\xef\xcapKm\xe7\a\xd9\x135v\u007fԡ\x83\xd7\xeb\xf2\x91\xb6a\xd0c\xdbtd\x10\x8f\x1e\xd9d\xf3\xc8jР|\x8b)7\x8bZ\x97\xa7\x9d\xb2\x9eJ+\x97\xd7\x109\x85\xb7t\xa7\x87\xeczv\x96z%\xf5\xce\f\x1cӺ\xf1df\xf5\x80\x9f\xce\xc4\x0f?\xc6\v_\xaf\xa42\xd9L\xfc\xf0\xd9\xe24H2\x13ߑ\x91Sw&+m\xa3\xd9)\xccĿl\xb3\xb9eo\t\xee\xca(0\xb7\xffb〴\x15\x92\x16\xc7k<\xf9\x14\xd3.ay3\xe3\xd2Z\xd4\xd1\u007f\xba\x98v\xb0\x1aw\xd7\xf7\u007f{\x85JU+W\xdc:\xdc\u007f\x85{$3\x98\x9b\xb0\xdb\xf5_\xda\xedo\xb1\xf43~\xa6\x1f\x1b\xb1\u007f\x1f\xea\x80\xedC!\xa9z\xda\xc9u<\x16ӗ\x91\xd2\xef\x01\x1e(\x8d+\x815\x81\xca\x02\x86==\x16S\x9b\xf0\xf3\x16I\x12\xbbo%*4W\"\xfc܍=b\u007fa\xd4\x17\xd7~\xc3q\u05eeѬ\xff(&\xaf\xf4\xfb\xfb\xf9\x05CqM\xf4\xcfO|\x9b\x11B\xe9B\xe7\xaek\xa76\xebS\xfa@\xac\xa9\xb0.gSv\xa1p\x03\xfa\x8fg\xa5\x17\x0e\xc9lDž\x1f\x11\xb2\xfb#p9W\xa3-5o\xd3\x14\x1e#Y\x9b\x1c\x19\xe4\xf5\x98\xac\x06MuEfv\xb9\x87\x19\xfff{\xc6\xf6\xaf\x03\xf2\x1a\"\xa7\xa8C\x88\xba\x9a\x8e\xd1\xdf3F\xea\xed\"\x86\xd5\xf88y\xed\xa5\xbf\x85\xcc\v_{\xe8z%\x95E~\v\xc9K\xce\x16\xa7A\x0f%\xbf\x85t\xed\xcb\xdazҼ\x91\\\xfa\x11\xd1\xf1U*=\x05\xc1\xf1\x8b\x8c-\xfb\x1c\xb2VHZ\x1c\xaf\xf1\x843?\x19\x9073.s7>\xd3\x1b\x05\xa5\x19;]Vb\xa4}\xaf\xfb\xc6ۇu\x06\xe3#\xb9\xc1S\xd1Iv\x0fK?\xe3\t\xf6\xb3G\x9dQp\x82\x99\xb5\xbcP\xed,=*\xfe\xc8̖~2\xfa\xac\x94\xe9\x8d\aǧ\x03\x18X\x83\xa8-`k\x8eȨo\x9dR\xad\x89\x196.\v\xaf\x8b\xaf\xbd~\xf7\xee\xed\xd3\xf3\x9f\xc5\xfdEl\x8b\xa6B\xf9\xd7\x1c\xedy\b\x96\xd3Y\x9b\x80\x80\xbd'\xeb^\xc0\xf0\xe5\x9c%\xaca\xb1x\xfa\x85\xc9b8X6\x12\xc7\u009b\x1d\xff\x87\xf8\xd3㞸ǀ\x14\x06\x04\xec=\x01\x01S\x89'\xe2\x04\x8a\xa9xS\xfe\x80\xf5\b\b\xd8{!x\xb7\x01\x15\b^\xd1_\xeb{\xd4wM\xff\xd5\x02\x17\xaa\x00\xd6\x03 `\xef\x05\xf3nOb@\x05\x82õ\x06\x9d\xa1v\x18\xf4\v\x88\x00\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x96\"\f\u05fc\x96\xed{\v\"\xeb\xd8\x03\xc0zEm\x01\xf3t5\x9b,\x03\xbe\xa8\xa4o\xe0\x96\xe9\xd6\xc0\xca,\\>\xb9I\xb2\x86M\b\xef\xb1-\xe9{\x17\xbf\x00\xcb_\xaf\x95\xe9k\x170S\xbc_'.\x18\xa3[X\xfci\x1a\x81\xba5\xaaކ\xb4\x0f\x1eC\x1c\x00R\r\x95\x05l\x9a\xb7:\xdd\xce6\xba\x8a\xa1$\xe9kj\xa3ɦ\x95Q\xb0\xc1\xd0Z\xcb\x12vm\xb9~$}\xf1\x97s\xfaP\xe7Eai\xaaGO\x12\xd9\xdd\xe1\xec\xf6N\xae\xc3n\xdf}'\xae\x8d\xac\x86N\x16\xc8G\x9ek\xddx\x15\x03\xc0\xfaFe\x01s\xb1\xb5\xef}\xbcS\x96\xb4Y\xe82N\xf3\x16[\x92\xd2\xcbD(du\x04/\xba\x8a\x03\x8b\u05ef\x1f\xb8N\x1cd\xf1Zq\x8d4@E\f\x1d:q!d}L \xcb0\xd2\x1a^\xe8\x1a\x15r\xcfh\x12\xac\u007f\n\x00\xeb\x01\x95\x05L\x88\x94\xe8\xe5=\xb2d\x8f\xe0\xceiO\x14\xdbv\x19\x89\x150\xd7\xd2\"\tF\x16\xee\x97G؉a\xee\x85(`/\xe2\x04S\xc2\xf2\x1a\xae\x18f\x15r}\xd9\x15\x18\x00\xd65j\v\x18a\xc6m\xb1\x06dIoS\xaf\xd7\xef\xb55y\x13\x17\\\x06<\xe5\xd9Y\a\xc4!dSAFn5QU\xbfVXu\xb9Z\x96;\xbe\x11\xa13\xae\xf2\xad\xe9{d\x8b~\xbe\xbd`\xd0\x1d>KC\"͕\tn\xad\x9b4r\xab@\r\xb5\bޯ)\xae\xbcI\x04虎\xe3\xbeyq\U00068f96\x06s\x8d\x84\xa2\b\x1b`l\xaf=\xac+\xab=\x1c\x94׀犅\x0e\x98<\x97t\xc1\xd2g0\x00\xacgT\x170/\xcf\xf3f_Tr\xa6\x9b$\xbbԿ\x1b]\x99\xb9\xe6\xf6_ \rMW\xa4\x1d\xb7^\xd5\xe6\x13=}hkAu6\x9bG\x96;ciޚ\x9b\x99S]\x8ed\xe3\xb6a\xee\xabG}g9\xb6\x92;\x8b\x1a\xddL\x83i813\xa6\x01\xb8X`\xe7\xf0\x10R\x96\x9b\x8fv\xf9đo\x98\xd9>\xd2u\n\x9e8\xcfv\x94\x86\x90\xc3\xcc\xfd\xfeX\x88\x16Vŝ~\x8b\x83\u009a\xee!\x01\x93\x18t\x1e\xa2}\xb3Β\xe80\xaf#\\H\xb2\xe4CS7\xba\x85\x01`=\xa3\xbe\x80a\x1a\f\xb2[\x96\xb4Y\xfc,\xa9v\xf0+\x1fb\x91m\xceh0\rp\xe8\x9f'\xe40\xb7RX\xc0d\xb9\xf9JN\xf3W\x9d\xb5GK\xb8\x13,\xad$`\xf5G\xe7\xde\x11\fWXn\xd1\xcbp\xc1\x90\x80I\f^\x1a\x8e\u07b8\xf748'\xaf\x01\xe3~\xeeE(\x19%`-\x18\x00\xd63*\v\x98_p~\x8d\xf3\x01I2`zȒB\x90n\x15y\x80\xd8s\xcfs\x1a\xf2\xb2]\x8c7Ƃׄ\x05L\x96\x9b\xbf#\xb6\x8aLJ\x0e7\xf6\xdbO\xc7\x17\xb0\x13\xa2\xdf\xea,\xcb\ry\xafpD\xc0\xa4\x06o\xef]\xa8\xe4\xca\xeeD\xf7\xc0&\"\x91[e\x026\x04\xf1\x0e\x81u\x8e\xba\x02\x16h\x12\xc2\t\x12\xa9\x92&E\x01\x1bU[\xc0\xbc\xe8:\xdd0'~\xf9\xb6Q\x06{\x90\x10\x160Yn\xfe\x81\xd8**k\xa8\xf7\xfd\x82\xb2\x80\xdd{I;XO\x18\xaf¹\"\x91\x1eX\xd8\xe0q#\x91\xae\xb7}\xfaNY\rd\x9c\xca\xc2S\xcb\xeb\xa5\xd4i\x16?\xd5\x03\x00\xd6\x12\xea\n\x18nfa\xe9\xfd\x96\x1eY\xb2G\x1cB\xaa>\x8d\xa2 \x87(\x93\xeb'\x1a\x92\xecB,\xbc\xe1\x17,\xc8PX\xc0d\xb9\xf9\ack8L\x05%X\x15#`F#Ư\xa9_kL\xf0~5ަ\xafJ\x02&1h\xe5X\xc40\xe35Y\r\x84\v\x95\xa1i\xf8\xd2\xdc@^(85\x00\xacST\x160\x17\xdf\xedt;\x99\xe7^\x92\x9ci\xb18\xdc\x0eK\x8b\xea\x8f!\x1d\x199ug\xb2\xd26\x9a\x9d\x18\x9fB\xa5\x96\xf6\n\xd4\x14z\n9Ⱥ\x83\xe1\xdc\xf9A[n\xa1\xcd\x16\x1d\xc0\xa3\x95\xbb\xd0y\xbb\x8a\f\xfb&ħ\x90\x13\x82Դ\x16u\xf4\x9f.\xa6=\xa5\xc6\xdd\xf5\xfd\xdf^!\x9a\xf3\xeeO\xec\x19\xa2\xe8\xcez\xda\xc9u\ba\xaa\xc3\x06\xa4\xb2\xe2\xd6\xe1\xfe+\xdc#y\r\x18?\xe7B3\xf6\xa5\xb9\x97\xd1(\x06\x80u\x8d\xca\x02\x86==\x16S۠?*\xe9\x1fj3\xb7\r\xf9\x13\x17]\x0e\\\xfb\xb2\xb6\x9e4oD\xc7H\xbak\xa76\xebӻ\xe4b\xb2\x98\xdbk\xa3\x93Y\x84r\xc7\xd3Xnt\x9f'\xd8QYt\xa8\xfe~\xa5\xce8W\"\xfc\xbaQx`8w\xe33\xbdQ\x10\xa8\xb1\xd3e%Fҵz&\xf8\xbajY\xe6l1I\n\xbf:\n\x1b\xe0\xfb\xc6ۇu\x06\xe3\xa3\xe8\x1a\x88n\xe9E/\x98$ז~\x12\x03\xc0\xfaFm\x01\x03\x96D\xf0\x86\xae/*\xabES\xa1\xfa\xb4\x13\x00Xe\x80\x80\xa5\x06\xc1\x0e\xc3+Y\x867\x1b\x16\xa3\x00\x00\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x10\xb0UG{\x81\xfaљ\"x\vړ\x99\x00\xc0\xaaAm\x01\xf3t5\x9b,\x03\xbe\xa8d`\xbc\xdd\xd4\xe6L\\r\x859\x86\xd2,\xc9l\x16L'\xc7E/.\x11\xa6\x01\x9d\x93\xed\u007f\xd0\x13S\xba\xb5\t\x83^6\xa4\xc1\xafā\x94Ae\x01\x9b\xe6\xadN\xb7\xb3\x8d\xaeb(I\x06\xac\xe6Q\xf7\x03Ӄd\xa5W\x12\x8fmS]2\x9b\x05\xf3\xd6^ӊ\x95\xf9M\x9aY\x9e\xb1\xf4\x13\xf7*\xafwh\u0378\xa5\x98\x1f>\xbe\xf1j\xc2\xe3\x00\xb0zPY\xc0\\<\r\xec\xe3㝲\xe4C\x13\x1d4\xb9L\xab{\x85w\xcd\x12uD\x91\xb3q\x04lRs*&o\xa9'\xdeQ\xaa\x9c\x9f,\xf2\xc0\x19\xa5\xe8K\x00\xb0\x1aQY\xc0\x84\xa8\x8a^\xde#KZ\xd9\xf2\xf8\xb8\xe9A\x9cB\xab\x83\xa5\xea\x88\"\xf1\x04\xac\";Vŗzb\xa55\xfc\x17\x82/\xbb\"\x99\t\x00\xac\x0e\xd4\x160\u008c\xdbb\rȒm,\xba\x19n\xbf\x9b\xa0\xd4r0\xbe\x11\xa13\xae\xf2\xad\xe9{\xe8ڦM\x05\x19\xb9\xd5L>l{r6i\xf7ne6\xae\x03\xdaM[\xf6zHJs\xb2:7cOl\xe7ļ\x85E\x97tg\x8a!\xd82%&\xef\xcat\x8d\x06ã\x1b%\xc6Y2p\xbc`\xd0\x1d>\xfb\x8c\x1d \x02v\x83.*\xfd\n\xe3\xe0\xfd\x9a\xe2ʛ\xb3,۟\xf9y\xa8\xa8҉}\a\xb359\xfb\xc61\xf5\x8cm\xe2\x95.'|\xe9V\xf1j\xf2\xe5\xcd\xf4\xa5#\x94\u058c\xa3k\xf0\x96ksN\x9e\xd4n\x16\xbcmg\xd2U\x8fN\x00\x00KBu\x01\xf3\xf2\xa6A\xd6\xd8cI+\x12\xc3\x1e)\x9f\xd8g\xa1o\xdc',̮&\x8b\xc8Qy\xd4\xe5H.]6\x84\f7\x93\x92.\x0eI#5\xb4 ҫ\xfb\x1a9Dk7\xba\x85\x01 \x15P_\xc00\xbd/\xbb\xe5I\xaf\x95t\xc6\x06\xad+0\x03)?\xe4\xb0.\xdd\xe6\x9f'\xe4T\x90\xfb7{\xeb?\xf3\x0f\x03\xb4#u\x17=\f\x9bj\xa8g\x88E\xf1Vd\x12\x85\x90\r\xeb\f}D\x9cfqc=I\xbf\xea\xac=Z±\x18\x92g[[\xc5 \x92\xf5G\xe7\xde\x11\fW\xe8N{H\xc0\xe2\x9c\xd8{}϶L\xb4\x9d\xe5\x1e\xc1\xb1\x97#\xb9t\xb9\x80I\xfd\xf2a\x01\v\xd7p*\v\xd3`\x98\xa1\xf7\xdfMe\x1c\x00R\x00\x95\x05\xcc/8\xbf\xc6\xf9\x804I\x98\xf1\x06p\xd3@\xfc\x82\xcbE\xfe\x0e1\xb1]T\x1fڻ\xf1\xf1\a\xf3\xd0\x16:\x1d\xea2\x8ax\x834t~V\x9d&\xb6\x0e\x11\x9bU\xc0&\xcb5\x8c\xe0\xc7:\xcc\x04\xec\xf1\xa1Í\xfd\xf6ӂ\x80\x1d*\xa9<\xcfF\x8d'\x84hk\xdcY\xba3\x18\x1a\xbc)\x9fxhK\xce\xe7m\xb6\x9d\xdb\xe5\xb9R\"\x97.\x17\xb0\x1d8BX\xc0\xc25\\F^\x1a\xc47\xd4\x03\x1bB+\xf0I\x00\xc0\x12PW\xc0\x02M\x82\x8b\xe7\xa1) Ib\xcc\u20f9سI\x95\xc9\x0f9\x91ʷ\x8d2ȝ\xfc\x80\xced\xf0\xb5\xa4_ǸG\x12;\x96\xb9\x8e\x12\b\x982\x861\xfc\xb8H\x10\xb0\xca\x1aꩿ \n\xd8ԋ\x92\x0e\x9a\xaa?\xfa\x84\xc1\x82\x0e\xf94\xe2,V\xe5\x13\xe7\x15\xd0Q\xe0\x81\xed\xf2\\\t\x92K\x17\x05\xccĺ^\xf9R_YX\xc0\xc25\xb8\xd3\xf6\xba\xc7s\vB\xf3+\xea4\xab{B\v\x00\x84PW\xc0p3\x9b0\xe1\xb7\xf4ȒN\x9eȆ\xaf9\xe4\xbfV\x93p/\xa5\v1\x0f\xdc\x17䦮C\xec\xd2\n\x8f\xd1\x19\x05\x85t8v\xbc\x1a\xc7\x170wCt\xb8n)\x12\x01;|\x81\xec\a\xab\xc4!$\xc6#:\xea\xc3\x1f\x13\xbc_\x8d\xb7\x99y\xe96AE\x94O\x9cCu(\xb0=\xbe\x80I.\x9d\xbc\x16b<-4K6\xa3\"V\xc0F\xd1\x16\x84vz\xc4ぼ\xe8\xf0\xbd\x00\xb0JQY\xc0\\|\xb7\xd3\xedd\x9e{Yr\xc8\xfd\xb0ɪ\xfa\xd7\xfe\xfc {R'\xe8\xcf)Tji\xaf@MT\x056\x9f\xb3\xb6U\xb0\a\x82\xbd?ɻ~\xf782\xd1\t\xf1G\x06\xf1\xe8\x91M6OT-\xfbb\xc2uK\x98\xfa\xacc\xb6O75[\u007f\xfa{\xdc\xca]\xe8\xbc]ŕݙxk\xaf\xf9rbn\xb6\xd6\xf0\xe85\x91\xae\xdd\xf5\xfd\xdf^\x11\u007f[\xe4J\xbb$\x14T\xde\xc9\xf6\xac=n&`\x81f\xba\x88\xdf@\xb3\xfaK\x1a\xc6aG\xa9\x98p\xd0%\x9a\x03\x9f\xe6&\xb4~O\xe2\x05\xe9\x9eԜ\x8a\xc9[L\x90\xee\x05\xd8\x0eE\x02@\x9eѬ\x9e\xef\x0f\x00X(*\v\x98\x10\x9a\xd0+\x84\xefp\x98}\x1e&`N\x13\r\xc1\xe339\xe3\x97S\x97\xf0\x12\xf2L\xc0\xf0o\xd0r\xaev\x1dO\xc0*\xb2cϺ\x00Q\n\xb3\x00[\x89\x80\xf9\xb2a)\n \xf5P[\xc0\b3n\x8b\x95\xf6\xb5|&\x17\x16\x04\xac\xe7.;pw\x19Gjq\xf0\x96ksN\x9e\xd4n\xa6\xee\xa2\xeb\xf9\x19\xdbi4\x1f\xab\x18`-\x1f\x87\x04\xac<\x87\x197\x15d\xe4V3Q\xf1}\x9e\xb7\xb9p0\xe7ntu\xe6-luiw\xa6XE\xa6\xa4W\xf3\xaeL\xd7h0<\xbaQb\x9c%\x03\xc7\v\x06\xdd\xe1\xb3\xcf\xd8\x01\"`78\x8eӿ\xc28x\xbf\xa6\xb8\xf2\xe6,\xcb\xf6g~\x1e*\xea:\xa0ݴe\xaf\x87\xa44'\xabs3\xf6\xb0^\xec\xc1lMξqL\xbd]\x9b\xf8P\xae\x14\xcd\xf1\x8a\xec\xac}\x82\x93+\xd46yR*`\xf8Lz$\x90\x1b\x00\xa4\b\xaa\v\x98\x97\xe7y3S\x01k7\x16\x05\xacMX\x06~@\xf5Ga\xfe\xbc\xec\xaf\xcfi\xd2M\xbf\xb8\x8c\xf1\x11\xcd\x19\xeb\x19M9\x91\x86\x01\x16\x03\xc3F\xfb\x83\x0ed\xf59?G\xac/S\x91v\xdczU\x9bO\xb4\u05f7M{\xe9\xee1\x84B:\x10f?\xdaê5_\x150\xfb%\a\x1f\x95p7Ose\xb7\xcb:h8\xee\xaf\x1e\xf5\x9d\xe5hT\"*`\xdf\xd7s\x1d4}\x85\xbb1\xd2y\xa8\x8aŋ\x1c\r{\xdez7\xe77t\x9fC\xe4\x1a\xb1\x06\xe55\xb7o\xa1\xb1\x89\xac\xa8\xa2ײ/m\x88\xf4_\x9b7\"mݥLi\xe44\xccl\xf3[Z\xb6gе\n\xc3m\x93%\xe5\x026 I\x03@\x8a\xa0\xba\x80a\xaf\xc7\xc1B\x119\xa9\x8c\t\x02\xd64Ď\f5%,\xb8\f\xb4 ҅\xf9\x9a\x05t\xedb}\xad.\xc4zU\x92!$\x85\xdd\xeeVD]\xeaC4huy\x96\x87$\xabc\x05l\xb2N\x88p4=) _\x1b\xdap\x11\x8fp\xc3\xf8\xe2W\x18\xcf\xf6\x91nV\xf0\xc4y\x9aM\x04\xac\xa3\x88E\xe9\x1e\xe6\xee\x93\xd7\xc7\xc2cIk(H\xf7L\xce\x1e?\x8d?GgTh\xb6\x90\xd7\n-I\xf9,\xf4[\xe0\x13\x1a\x87\x17k\xb2H\xef\xab\\\x8b\xe5h\xf2H\x97j&\xb7@\xd66Y3e\x02\xe6F\xb70\x00\xa4\x18\xea\v\x18\xa67c7\xf5x\x05\x02\x01wS\x80\xf4hڄ`ֽmI\xca}pNe\x91\x17\x17\xa2=\xbf\x8aOXN\xde\x11\xfa*\x11\xb0K\x83ւt*%\xa5\xdb\xfc\xf3\x84\x9c\n\x1c\xc8`\xb3\x1b\x9c\xb1\x02&2\x89BȆu\x86>\"N\xb3,D$~\xd5Y{\xb4\x84\x13CD\xb6rL\xbfp\xfdѹw\x04\xc3\x15\xba\xd3\x1e\x12\xb0\xbb(\xb2г\x86:\xaa\xceih\xd2{}϶L$\x84\x88<\x12Ε\xa0\xf9\x82\xbe^G^i\xdbd͌\x12\xb0\x16\f\x00)\x86\xca\x02\xe6\x17\x1e4\x8e\xf3\x81I>\x84\a\xf7\b\xb3\xc1\xda{\x12\x15]\x0e.\x93\xbb\x9btGh\x0f\xec\xd3},go\x01}\x95;\xf1}iԳ\xb5]Ԥ\xfd\xe4VgJ\xeb\x8b+`\xd8f\x15\xb0\xc9r\r#\xf8\xb1N\x88q\xfb\xf8\xd0\xe1\xc6~\xfbi1HwI\xe5y6j<\xc1\t\x9c\xa5;\x83!q\xb9\x8c\"\xce)\x16\xb8\x9bŢ\x1dڒ\xf3y\x9bm\xe7vy\xae\x14\xc1\x89oC\xa3Ҷɚ)\x13\xb0!4\x80\x01 \xc5PW\xc0\x02M\x82_\xe7\xa1)\x10\xf0R\x1cf\xaf7\x80\x9d<\x1d\x0e\x85&W\xa8\x88;m\xaf{<\xb7\x80\xaaj\xc56\x96\xb35\xd2\x03\xa3\xf3\xd2\x04'~&\x15\x88\xf2m\xa3\f/\x0e\b\xa1\xad\x1d\xf1\x05L\x19I\x90\xee\xca\x1aꩿ \n\xd8ԋ\x92\x0e\x9a\xaa?\xfa\x84\xf1\x8a\xee\xf84\xe2,\xd6\x1eI\x9c\xd9H0\xed\xbc\x02\xfa\x9e\x1d\x88\x1f\xa4\x1bkhTolB>i\xdbd͔\tX\x9df9\x1f\xb5\x02\xc0\xb2\xa0\xae\x80\xe1f\xaa\ad\b\x19\xeaky\xc4y`T\xd7z՟\a6\x8a\xb6 \xb4\xd3C\x93V6\x82jA\xac3XX\x88\xf14\xb2\x84\x04lK\xf5x\x1d騱\x99\xed_\x10\xb1(\xd5R\u007fTy\xac\x80\xb9\x1b&\xa3\xb3$H\x04\xec\xf0\x05\xb2\x1f\xac\x12\x87\x90\x18\x8f\xe8\xa8\x0f\u007fL\xf0~5\xdef\xe6\xa5ۄ\xf7×]H\x9f\x05\x1c\xa7z\x14\x91\xaa\x1c\xea\xb3\x0flO$`9\xd4u\x96W(k\x9b\xac\x99R\x01\v\xe4%\x88/\x0e\x00\xab\x14\x95\x05\xcc\xc5w;\xddN\x8b8\x13?\xe0q\x98=T\vܦ\xde\xc9\xde\x15\x98\x89?\xaa\xe9\xb1\xda<\x82N\x94\xa7\x9d\xb2\x9eJ\x13\x1eϝ\xd3\\jߕA\xaeg\x9cy\xbbw\xee=\xf2\tƧP\xa9\xa5\xbd\x02\x11\xc9\xf5d\xe7\\oۯ\x89\x15\xb0}(\x81\nL}\xd61ۧ\x9b\x9a\xad?\xfd=n\xe5.tޮ\xe2\xca\xeeL\xbc\xb5\xd7|917[kx\xf4\x9aH\xd7\xee\xfa\xfeo\xaf\x88\xbf-r\xa5]\x12\n\xf6\xfe$\xef\xfa\xdd\xe3\xc8Dg\xd7\x1f\x19ģG6\xd9<\xb8\x0e\x1d\xbc^\x97\x8f\xb4\r\x83\xd2\\)\x1a\xb4g\xb0\xa7 \x8bJ\xaa\xa4m\x91$\x9b\x89\u007f\xd9f\x13\xde\xf6\xcbh9\u007f0\x05\x00˃\xca\x02\x86==\x16S۠8\xbb\xc0C]`\xcd,\xd5ej\xf7$(\xb6L\fh\xa8WkS!u\x82\x05~\xb3=c\xfbׂ\x98\xf9\x8fg\xa5\x17\x0eal!G\x1b\x88\x8c\xe5ji\x8f\xa5k\xa76\xebS\xf6\xf8\xce[\x91\x93\xbe\xebA\xac\x80\x99\xb5|tV\x98`\x19\xc7\xf5\x15s\xc5}\x1cw\x1e\a;*\x8b\x0e\xd5߯\xd4\x19;\xa9\xd3\xeb)\xc9\xe4\xe8|ֱ\xd3e%\xc6\x11\xb1ę\x9f\x88^)\xd7\xc1\x9ĉ6:\xe3\x8b\\\xac#\x83\xbc\x1eÁ˹\x1am\xa9y\x9b\xa6P\x9a+%\xaf\xee`fv\xb9\x87&%m\x8b$\x8f\x88N=\xf6\xab\x03[\xfaI\f\x00)\x87\xda\x02\xb6\xaa\xf0n>束\xf7\r\x1d\xc8Z\x8a\xfb'\x81\x13\xff\x03Q\xad\xb1$3\xf9@\xb4h*\xe6\x93\xd9\x00\xc0\xeac]\vX{\x96\xd0\xe1\nhc\xe6\xd4/\x80\xe5\x170|9G>\x93l\xb9\xf0f\xc3b\x14@J\xb2\xae\x05l4\xcd\xc1\xb6\x8e\xb4\xc8L\xab\x85\xa3\x82\x80\x01\x00\x90q~\xef\xa6\x00\x00 \x00IDAT\x90u-`\x81\x8a\xf4c-\xbd-\xc7җ\xf2;fW\x17\xaa\x1eT\xfd\xb9)\x00\x00\x12ֵ\x80alݓ\xad\xc9\xdecMf\xa6ħ\b\xa1\x8d\xaedV\x00\x00,#\xeb\\\xc0\x00\x00He@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00P$\x15f9\x82\x80\x01\x00\x10\x8b\xa7b\vڟ\xcch\xe5\x01\x01\x03B\f\u05fcNf\xb2\xec\xb4\x17x\x93\x99(\xb1\xc4b\x80\xb7 N$\x9d@^\x1eߣ\xfe\x02W\x8bFm\x01\xf3t5\x9b,\x03\xa1\xc5\x1f\x1c|x\x12|\xaf\xea˱~\b\xaeq\xe2\xe2]\xcbǣݜ1\x88\xfb9n\xf7\xa3x&S\xb5\x9f\x95\x18\x1f\x9d\x98\x88w|a\xdc\xe1Z\x83\xf8>\xc7q\xb7\xf1m\xf2z/\x81\xe9\v\x1d\xf7K\xb2\xf9\x92F\x83{\x11\xdf̾[\\#[\xff,\xbe\x91\x8c\x06$.C\xfb\xd7ke\xfa\xda`b\xe3\b\xe1b\xb1\xd0\x06q\x9f\xd5>\x8dw|\xa9|\xc5qt\x15\xdd\x0e\x8e\xfb*\xea\xc8ءa\xa5\x02\x1f\x8a\x0fܠ\x864\xe5\xdf\U0004fce5\xd3@S\xf8\xc0P\xfcR\xcbH\xef\xfb-\xe3\xf7\xbd]'\tK\xfb\xe8\x89RR\x82rnb\x83\xb91Nodz\xfd\xdc\u061cB\x01\xca\x13\xdd\xd9\xfe\xbe\xf3\xef+\xa5\x9d,$\xd2\xdb\xfb\xdc\xed\xd7\xf8\xf5\x1d\xee\xfe\xdb\x04\xb6\xc1\x89/\x8b0m\xbd\xbd\x93K \x9bs\x13\x87j\xed\x84\xfb\xdc\b^\x10\xbfI3\x8b\xa9Ӈ:/\xea\x13]\x82\x94H\xb1Xh\x83\x1eݯ\x89\xaf\xfeK\xe4e\xf1\x9d\x1f\xc8\xe6\x87;\xc5/\xa3\x8e\f\x17\xf7\x8b\xa9\xa4\x1f\xf7R\xf8 \r\x92\\\x99u\xe3U%\x8b!$\x0f\xe8\xb0ZQY\xc0\\<\v\xca*\xae~o\xedq\x8b\x02汬\x90\x80\xed(Mf\x91\x84\"\x89\x80\xd5\\PJJP\xceMb0\xcb]\xfc\x92tz\xb8\xd9\xd8C\x02\xb5\xa7IW%\xf8\xe5\xfb\t\xd8\v]#\xdbNqc\xe4\xf5\x117\x95ؼ\xb5H\xd8>N$`\x18\x1f\xbdF_\x9f/P\xc0&5\xa7\xc4\xd4\x0f\\'\x0e\xc6mp\x14\x91bJ\xb0\x06\x05\x8d\x95\tL\x96\xc4\t\xa1\x8bz\xefD̑p\xc71\xe9ǽ(\xbc\x85\xc20\xf9C4Hzeg4J#š\x14\t\x13\xaa\xb2\x80a\xd6\xf5\xf2\xf2\x1e\xbaq\x98}\u009a\xf8\xb8\x97\xef5\xad\x8c\x80\x85\xe3\x0f-\x15\xa9\x80U]PJJP\xceMb0\xcb=*\x9eM$`G\x99\xf4Lq\xa1/\xfe%q\xc5 Կ\x1c\x026\u05f9\xb0\xbeTEvȷ\xf0\x82[\xc40,RL\t\xa1A\x9d\xf1\u07fe%r\xfe\x1b\xb6i<\x1f\xdf$\xe9ǽ(\x1cHX\xfc\xe9C4Hze\xbel\xa5\xc5X@\xc0\xe22\xe3\xb6X\xe9\x03Z\x9f\xc9%\x06\xf5\xc03\xbePp[U\xb1\x8a\x8b*\xe7\xd3\x1d۞\x9cMڽ[c\x8c\xcc[\xd82\xd1\xeeL\xd18S\xfe}U\xd4x\xb3R_\xfb=\x8dJ+P#K^\xe3t\x9d_\x19>;\xfbB\x96K\xbeA\xef\xd7\x14W\xded\xff\x83\xf6\xdaú\xb2\xda\xc3A\xb9A\x84Y\xeeEU\xbf(`\xe1b\xad\x1c\x1d2\n+Q\xd7\x1b\xa8\xda\x04Gd\x06\xcft\x1c\xf7͋\x8bG\xf5\xb5凞\xe0\xd7\xeaS6 \xe5抅\x0e\x98T\xc0\xde^0\xe8\x0e\x9f\xa5\xee+Ҋ{b3\xc9\xc0\xb1\xdePr\xe1\xcbh\x01S\xaeW\x100,:\v\x05י\xac2\xfc\xe2B\x99\ue410\xf6g~β\xe6ʄ\xf7\xe1\xe6⊝#\x1fN3n&\xafg\xb0\x04\xa1A\xf5\x06\x9aVz\xd7%\x9f\x101\xe8\xac\xd1Wu\x06\xa3\xce\x16\xb6\x95\xd6\xc0\xc2{b|\xa1Q\xd6\xe2\xb7zN\x1c\xcb+\u007f\xdc\xf2w]\x81\xf1\x8d\xe4\xfa]\xe5[\xd3\xf7ȖȽ\x9aku\"\xa75\xf7z\xdc\x06\xcd6\xfe\xb2\xd88a\x18\x91\xbeg\v\xfb?;\x93\x1e\x89\xdb\x17\xa6\x17\x04L\x19/\xcf\xf3f\xf6\x8di\xed\x0eE%\xa2\xac\x84\x80\xf9\x06l\xb9\x856\x9b\x8d\x0eh\x87Б[ݼ\x16Ŭ\xac\xbc\x1f\xed\xa1\x1b\xbf\xf9\xaa\x80\xd9/;\\\xc4U\xf6\r\x97\x91\xaf\xe1\xd9\t{\xa5\xd1n\xb7?\x97%\xa7\xfat\xdc\xe1۷\x0f매\xb9\xa4\xc3\xc3\xdd\x18\xe9\xae\xd5n\xff\xcb\xe2\x8ayK\vl>\xf2\x99~Z*[Ɩ4h\xf6y#w[v\x91\x92w]\xf2\ta|\xb1蛑o\x8a.\xca\xcf\x16\xb1\x95\xd6p\xaf\x06O\x18&p\xd5=y\x8b\x1f\xdb\xedz\xd6)W\xfe\xb8\xe5\xef\xba\x023\x96歹\x999\xd5\xe5\xf2\xa0Ȟr\x94\x87>A\xa5\xeex\rz{\xf4\xb3\x8e\x11\xa2]\x9d\xd2\xf7la\xffg\x031Z5?ݻcIˬ\xab\x8f\xea\x02\x86\xbd\x1e\a\x8bJ\xe4\xa42\xb6\xb2\x02\x86%C\xc8\xebZ*]_g\xc5Lޛ\xac\x13B\xa5MO\nD-\xf2\\t\xe8\xaf\xe4\xdf\xe4\x10K+\x0e!\x8b\x8e\x92\xf1\xd3\xdb\xc35\xb2\xdca\xe61\u007fL\xbf\xab;\x0f\xd1\x1b\xa3\xb3$\x18UC\x18\"`\xaf\xf4\xaf\x98\x80I\x8a\xddg_\xb0\xf8\x04\xcd\xf8\xe1\xf6\xbf踒>y\xbd\xa42\xee\xf4[\x1c\xa4\xa3\xb7+\xf5\xe4\xa5\xfeJ|\x03<\u0089\xff\xceS\xe2\xd73\xb9\x9dg\xfb\xc8)\x83'\x98b\x14\x95\x90\xbe\xc8E\xdaLc%ˍ\x12\xb08\xf5\x1e\xa5U\xb1\xbe\x820\xd6\x16F\x9e\x91\xca\xe6\x0e\xd7\x12\xe1\x9d\xeb\xa3\xfep\xd2!\x0e\a\xa5\x8b\f!\x17Q̜\xc76\x9f\x84\xff\xa7\x18B\x83.ҷ7λ\x1e\xf9\x84FX\xe7f\x8c\xb9\xec\"g\x93\xd8Jj\xb0\x97\xe1F]#\xfe\x8c\t\xbf\xe4\x9d\xc4X\x1f\xf2*(}\xdcQ\xb6J\xe4\xa3]>\xd1\xd9\"\xa1k\x13\xda\xc4V>Wn\xd0Ez\xb9\xf8\x06\x110\xe9{\xb6\xa0\xff37\xba\x85\xe5\xec'\xdd\xd8%-\x92\xa7>\xea\v\x18\xa6q!\xbb\xc9\x00\xd2\x19\b\x04\xdcM\x01Q1VZ\xc0\xdc\xd9[\xff\x99\u007f\x18\x90w\xaf$L\xa2\x10QCH\xfa\x14]\xf4\b)\v\x18\x1b\x9bur?Hs\xeb\x8fν#\x18\x88\xa6\xbc4\x1c\xbdq\xefip.\xba\x860D\xc0pm\a\x130I\xb1g\xdc\xdc\xec\xfd\xb7\xef\x8a\xc4\t\nsc\xb5\xf4\xb6\x93\x18\x90ʊB\xdf\xf2\x8f\xf4\xa4\xb7\xa6\u007f\x84\xe3\x1a\xe0~N\x9c\x0e1\xc5\xddy\xfc\xf8q\a\xf3\x81\xbd\xea\xac=Z\xc21/5핰f\xbe\x15\xe6W|\x13%`q\xea=z\xf6\xf1㋱\x02\x16\xaa\x8c(\x86d:@{2\x01KRl<\xcd\xef3\xfb\xe65\xe3X\nm\xd0p\r\x9b\xed\x11\xe7]\x8f|BW\x04\x8f\xfc\x89/\xb1\xf4l\x12[i\rܬ\xf1\xa2q\x96cM\x95\xbc\x93J\x02\x16\xef]W&_\xc1\xab\xee\xad\xd6\xe4\xa0l\xcdIo\x9c\x06\x05\x85\x93NE\t\u0602\xfe\xcf\xdc,V\xa8\x14w\x17\x9f\a=0%\xfc\x82\\\x8d\xf3\x81I>\x84\x87e\xad\xb4\x80a\x1f\u007f0\x0fm\x89\x1f\xdc\xc2f\x15\x88z\xba,\xb9\xc1\xe2\b\x18\xfbϲsO\xa4\xb9'\xc4~\xceY\x92~{\xefB%Wv'Q\x0f\f\xf7W1\x01\x93\x14\x9b\xd3Mup\xad\xcf9\xf2\x0f\xf9\x989j\x82Ƴ\xf2zqUؙ\xf6\xee\xb3~\xdc_\x16\xc4q\r\xf0Dh((\xf1\x81=>t\xb8\xb1\xdf~Z\x10\xb0P3\x1f\vc\xcdh'~\x9cz\xa9\x0flJx\\'U\xa2p\xb2\x83\x93\xcc\r\x19\x8c\fe\x94\x05,I1\xff\xc6\xf1\xcb\xe8_\x9di\xf2/!\xd6 Av\xe3\xbc\xeb\x91O\xc8\xc8.\x1f\xd7\xd6`ى#\xb6\x92\x1a\x82ES\xc5ϊ\xa7t\xc2\xe7&\xf5[\xc6\nX\xbcw]\x99\xfc\x1d\xb1y\rZމ\x9c\xbf\xd1\xd6\xc5i\xd0\xf7\xc2#\x9c\xd9(\x01[\xd0\xff\xd9\x10\x1a\x88>\x1d\xf9wG+sC.\x16u\x05,\xd0$\xb8+\x1e\x9a\x02\x01/\xc5a\xf6z\x05M[I\x01\xa3!u\x1f\xd0G\xf1\xbe\x96\xf4\xc5\x06\xea\x88\x11\xb0{/\xe5ɢ\x1bt\xff\x1e\xf7V\x9a[\u007f\xf4\t\xe3\x15\x91\x80F\xea\xc1\xe8\xd3wF\xd5\x10\x86\n\xd8l\xf1\x98\xd0\x03\v\x17Õ}\xa7\x8d\x95\xfdt i`g\xc0\x8d\x95r\x03\xe9\u007f\xe9\x8d\xf3\xf8<\xb3\x8ag0\x1bz\x9a*\x11\xb0\xca\x1a\xeav\xbb \x17\xb0\xbf\xb2[\x04_\x8c\xe9\x81)\xd6\x1bv\xe2\x8b5|\x13\xa5Dc\x9cd\x8a\xabO\x13\x9e\x8e\x1a%`\v,\x96\u05fc\xf3Ӽ\xf6<,ChP\t-\x1b\xe7]\x8f|BW\x8e2G\xfdQ\xda\xf9\x8a\x9cMb+\xfb\x00\xee\x18\xb0\xa1\xa3\x92\x9dD&\br\x01\x8b\xfa\xb8\x95\xbf\xa4d\xe4\x1fP\xc8\xf4\xb3\xa7\x90T\x9b\x15\x1b\x14\xd43\x9f\xd8\u007fD\x04\xec\x9b\"\x1c\xb7\xc5\xf2\xff\xb3:\x8dBg\v\x9eB*\xd2̦\xf7\xfa-=\xe2\xfe\x8a\xfb\xc0\n\v1\x9eF\x16\xf2)\n3\x8f\v\xe5\xc1a\t\xee\x86I\x9c\x00\xa9\x80\x19\x8d\x18\xbf\x16\x1c\x1d\x91dQ\x19\x91\x81٣FY\xee\x98`\xd5x\x9b>Od\x93\xa4\x8cעj\b\x9f\x98\n\x18\xbeXO\x05LR\f\xd7\xdfЍp\xd7\xe8?b\x99\x81\x0eO\x83\xf4\x9fRj \xbdS\xfe\xa4\xff\x8b\xfeO4\x11\xcf\x00_\xa8d_\xcdR\x01;|\x81U+\x170\\s\x98\x9c\xed\xb9>J\xc0\xe2\xd4+\x110=\x19\xa8\x05\xff%J\x89f\rFڗ\xba!Hp鶀h\x1c\x11\xb0\xc5\x14+\xfdgM\x17:\x165\xb3OhС\x1bS\xb7\xe3\xbd\xeb\x91Oh\x84\x19\xf4\t>\xb0\xf0\xd9$\xb6\xd2f\xd6\u0590o\x05c-;\x89\xb2\x80)}\xdcr\xdb\xc9:\x85\x89\xd4q\xa6\xf6\xb8\xb3\x84\x91\xa5r\x83.\x94\x11\x91\n^d\x02\x16y\xcf\x16\xf2\u007f\x16\xc8\xdb\x1bs.\x10\xb08\xb8\xf8n\xa7\xdbi\x11g\xe2\a<\x0e\xb3\x87\xceΛ\xf1x̽\x1eub \xca9\xa7\xb9Ծ+\xc3M\x05l\xf39k[E\xe8AX\x84}H\xe9\xf3\x15\xf9\x8b]\xf7\xe5D\xf0\xe9\x97:\xfaȌ\xfc\xbbw\xf4\x9f\x16ffG\x92E\\M\u07fdʒ\xe7\xf2\xdc\xc6\xdd\xf5\xfd\xdf^\xa1\xffB\xad\\q\xebp\xff\x15\xee\x91\xdc |\xe2\xb91\xae\u007f\x16?ҳ\xa7\x90\x91b\xf8\xb6\xbe$Xɾw\xcb8C\xebH\xffi\xfds\xa9\xc1\xbb?\xb1GM\xa2g+h\xa85\b\x02\x15\xc7\x00?\xe7\xeeЍt&~+w\xa1\xf3v\x15\x19uLH\x9b9\xa57\xdc\xfe\xe63Nw\u007f\n\xbf\xa43\xf1;\xec\xf6\x97q\xea\xa53\xf1'f\xc5\x13\x18\x0fݹ]C\x8b\xc9\u07b3G\xfa\x13\x9d#7\xc4\xdf-\xb9\xd2.\xb1\xad\xf0\x14r\"\xb8\xc8b\xb8!#3\x90\x9b^\x87eL\xb1\x1b\xf7t\xed\x97'\xe2\xbd\xeb\x92O\xa8\x9ek\x1cn\xe4\xea\xe5\x1f\xac\xd4V\xf2\x01\xdc\xd8}\a\xdf\xd9M4T\xfaN\xceM\xd8\xed\xfa/\xedv\xe6\xa3W\xf8\xb8\xa3\xde\xf5}hsT\xefg~\x90=\x19O\xf0\xa5\xa9ܠ\xbf\x18\x0ew\xf6\x9f\xd73\x01\v\xbfg\v\xfa?\xbb\x8c\x94~\x8d\xf2@i\\\xb9\nQY\xc0\xb0\xa7\xc7bj\x1b\x14\xbd\x14\x1e\xea\x02k&\x89\a\x827l\x05܆\xfe\xe3Y酴\xf3\xd7TX\x97\xb3)\xbb0F\xbf\xb0Y\xcb\xc7\x16\vq\x8d\xe38\xdd\u007f\x14\x93W\xfa\xc56w\xe33\xbd\xf11;\x10I\x16ݼRb\xb8\xf8\x97\xa8\\\xa1`\xe7\t\"\x8dA\xf9\a+\xfb\x84\"\x1f\xc0\x88\xfe\x19\x9e*\x1e\x96\xbf\x93Oŷ\x84I\xab\xc2\xc7\x1d\xf5\xae\x9b6G\xbb\x9a\xc6\xd3ؓ\xa2\xf8_\x9aq\x1a\x84_]9\xac?\xfd\x98\tX\xf8=\xc3qZ,\xbd2[\xfaI\xa5\xd3Lo<8>\x1d\xc0\xab\x1e\xb5\x05l\xfd!\x9d\xaa\xbf\x9a\t\xde\xd0\xf5ᕦZcIf\xa2\xc4\x12\x8b\x89\xac\xe4'Ԏ>跶\xe0\xc4_\f-\x9a\x8a\x98\xa9\x8f\x8c\xf6<\x04\xcb\xe9\x00+{{,\x8a`\x87\xe1U2\x9be\xe7rΒ\x1c\tK,&\xb0r\x9fP\xc0\x9c\x15\xe3s}/\x16-`\xde\xec\xf8\xcfݧ\xc7=q\x8f\xad\x1a@\xc0\x96\x9b\x95\xbb=\x80\x85\xb1r\x9f\x90G[\x1dw\xe2\xe1\x92X\xb4\x80\xa5< `\xcb\xcb\xf7\xcc\x19\x9c\xcc\nX9\xd6\xd2'\xf4b\x84\xbb\xf9\xa75Җ\x05\x02\x02\xb6\xbc0gp\x825\xff\x80\x95f-}B\xc65Ԗ\x05\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x96j\x04\x02\xf3\x01\xfa\x97\xcc\x0e\x00\xd6\x01 `)\x86kG^\xde\xdeO\xf2\xf2\xaa?\xe8o\xe8\x00 5\x01\x01K-\xe65hg\xe1G\x19;wl\xf8W\x85P2\x00\xb0\xceP[\xc0<]\xcd&\xcb@\xa8\xf7\xe0\xe0\x85\xd0\x01>\x9b\xc5\xd4>\xae\xfc\xab\xf8\xb5\xc8\xd2\xc3\xc3\xfb>\xae\xfb\xdbߜ\xff\xdf\xdf\xfe\xef\xc7\xfb\xbc\xc9l\x01`ͣ\xb2\x80M\xf3V\xa7\xdb\xd9&.h\xe83\r\xb0\x15Y}\xe6v\x87\xfb\x81\xb9}\xcd+X(\xa2\xfbR\xc2ÿe\vV\xcd|\xb2aÆ@\xe9\x86\r\x1f\xd5IƐ\xbdJK\xd2\x01\xc0\xdaGe\x01s\xf1tY\\\x1f\xefd{\xd6\x1e7\x13\xb0\x1e\vuI{M\x0f\xe2\x17\\\x1b\x84#\xba/:<|\xf0^\xc9i\xba\rx\xaa\xf3\x89\x80\xfdh\u007f\x83K\xb2\x8e\xc1\x8e\xa8e\x94\x01`\x9d\xa0\xb2\x80\t\xd1\xee\xbcB$\"\x87\xd9'\xac\x89\xdf&,Gכ\"\xa1\xe8\x96N\x95L\xc0\x16\x11\x1e~\xaa\x86;+\x84\xa4\x0e\xf8x\"`\x1bG\xbd\xd2uX⬢\x0e\x00k\x1d\xb5\x05\x8c0\xe3\xb6Xi\x8f\xcbgr\x89A=\xc25\xaejJL\xd2\xf5\x9e\xb8\xff\x1c%`X6\x84\x8cĥ\xd7\xd0\xf0L\xf8_\x89\x05,\x1c\x97>\"`\xa5\xdb\xfc\xf3\x84\x9c\n\f\x00k\v\x95\x05\xcc/\xc8\xd58\x1f\x98\xe4Cxh\xce|\xaf\xf8drMб\xfb\x15\xed{ю\x934Z}\x94\x13?axx\t/j\xb9\x9a\xa9\xc8n\xb4\x0f\f\xcb\x05,\x1c\x97>\"`\xdbE/Y\n\x04\x99\x01\x80E\xa1\xae\x80\x05\x9a\x84\xb8\x8b\x0fM\x81\x80\x97\xe20{\xbd̡om\xf2$,\x99Z\xbc\xe4j_>\xab4\xd2~\x934Z}$\xa2{\xf2\xf0\xf0R$^0\x1c_\xc0L\xac\xeb\x15\x89K\xcf\x04쌆\xbc\x94o\x1be\xac\x99!:\x00\x88\xa8+`\xb8\xb9\x8b\xbe\xfa-=\xe2\xbe\xe8\x03\xf3\xb6\xb4\xf9\x88\xbc\xad\x99\x1f\xc7<\xe1\xca8\xee4\x9b\xf7 \x8dV\x1f\x89\xe8\x9e<<\xbc\x1c\xfa\x1crLL+\bXa!\xc6ӈMF\x89t\xc62>'o\xe9\x0e\rIu\t\x87\xbe\x88\x8aY\r\x00)\x8f\xca\x02\xe6⻝n\xa7E\x9c\x89\x1f\xf08\xcc\x1e\xd2-p\x9bZ\xdc\x1e\x8fg\xe0}\xa2\x93\xae*\x9e\xe9\xc7F\xec\xdf\v\x8e\xabp\xb4z,\x89\xe8\x9e<<|4S\xc6\xd0\xf0SA\xc0\xcei.\xb5\xef\xcap\xcb\xe3\xd2\u007f\xaam\xa8+@\x1b\xcddh~\n\x95Z\xda+\x90\xe4\x89\t\x00\xac\tT\x160\xec鱘\xda\x06\xc5I\x98\x1e\xea\x02k\xc6\xf8\xae\xe8\r[3\x13Y'tԫ\xa53R\xcfU8Z=\x8eDt_@x\xf8\xf8(\b\x98\xffxVz\xe1PT\\zWaz\xe6\x9e/\x10\xa2\xa1S\xbbvj\xb3>\xbd\xabT\x1b\x00\xa42j\vغ\xe0u\xf1\xb5\xd7\xef\u07bd}z\xfe\xb3\xb7\xc9L\x15H\x16\x9cTA\xc0\x00`\x9d\x02\x02\xb6\f\xf4\x97\b\x1d\xae`Y\xf4\x9c\xfa\x85\x00\x02\x06\x00\v\x05\x04l\x19x\xc2\t\xb3\x1e\xa6\xb8%,\x98\x13-`\\\x14\xff\xf9?\xd1\xd5(>\x1f\xf8\xb01\xe9\x01 %\x01\x01[\x06\x82W\xf4\xd7\xfa\x1e\xf5]\xd3\u007f\xb5\x840\xef\xd1\xe1\xe1\xa3\xf4\xeb?\x85\x96\xd3i\x03\x05\x03\x00\x10\xb0\xe5 8\\k\xd0\x19j\x87\x97\xa0_I\xc2\xc3\xcf\xd0\x05\r\xff\u07ff\xfd\xed\xff~\xbc\x1f~\x9b\r\x00 `\xa9\x85\x0f\xa1\x9d;?\u07b2sdž\n\x98\x96\n\x00 `\xa9ż-'++7++k\xd7К\x99\xf6\v\x00K\x06\x04,\xc5\xf0{&]\x93\x93.\x97\x1bF\x90\x00\x00\x02\x96r@\\H\x00\b\x03\x02\x06\x00@\xca\x02\x02\x06\x00@\xca\x02\x02\x96\xfalXq\x92]!\x00,\x13 `\xa9φ7+\f\b\x18\xb0R\x80\x80\xa5> `\xc0\xbaEm\x01\xf3t5\x9b,\x03\xa1)\x00\x0eq\x05\x1dy.\xb08@\xc0\x80u\x8b\xca\x026\xcd[\x9dng\x9b\xb8\xa0\xa1\xcf4\xd0\x14\x9b\v(\xf2\xf6/\U0004e000\x01\xeb\x16\x95\x05\xcc\xc5B\x0f\xf9\xc4\x00\x1e\xd6\x1ewSl.\xa0@\xf0^\xc9\xe9x\xc7$\x02\xb6`-[\xb0\xe1\x9b\x05\u0602\x80\x01+\x85\xca\x02\xc6\x02\x16b\xaf\x10\x89\xc8a\xf6\x89k\xe2Ks\x01\x05\xa6j\xb8\xb3\xdf\xc7;\b\x02\x06\xac[\xd4\x160\u008c\xdbbe\x91\x88L.I`\xdbP\xee\x1a`~˦/r\xb2{\x8fg\x15Ra\xb6\xed\xc9٤ݻ\x95\x1e\xf0\x96ksN\x9e\xd4n\x8e^\xfb\u07fc\x85\xa7\x1bw\xa6\x18\xfe,3*B&\r\xe91,\xcfz\xa6\xe3\xb8o^\\<\xaa\xaf}\a\x02\x06\xac_T\x170/\xcf\xf3f\xd6\xe3\xb2vG\"sGr\xd7\x02\xbd\x99\xa8z\x17\xd26l\xb9L\xe3a\x1f\xb9\xd5\xcdk\xd1<\xc6\xfe\xbc\xec\xaf\xcfi\xd2M\xbf\xb8\x1ce\xbf\x1f\xed\xa1\x1b\xbf\xf9\xaa\x80Y\xb6ԗ$\xa8\xda\xdc\v\x819<\xd7\xd7w\xb8\xb2\xd8p\xb3~\xf7K*`\u007f\xf8\xf9\xc7\x1f\xfd\xf4\u007f\x13)\xf9\xdf?\xfd\xe8\xe3\u007f\xfc3\x11\x95_\xffxÏ\u007fM\x0e|L\xd2\xffH\xfe>\xfe\xa3 6\xbf\xfd\xe9G?\xfa7\x89!)\xf9\xf1\xcf\xff,ɈT\xf1ۿ\xfb\xe8\xc7\xff\xf4&\"`b\x95o6\xd0\x04\xa9#rV\f\x00+\x83\xea\x02\x86\xbd\x1e\a\x8bJ䤂\x15\ue045r\xd7\x06\xd9\xe5؊\xac\xf8H\x05\xc6\u05f5t\xf1篳H\xef\xb2\x05\x8d\x93\x14rĘO\xd6\tq\x84\xa6'\x05\xa6eG\xafqU\xa1\xb0\xb6FqUC#ݩ\xe2N\xbf\xc5\xc1\xb7l\b\xf9\xd3_\xfd\xf9\xbb\u007f\xff9\x91\x92\xbf\xfb\xddw\u007f\xfcG\"X\xff\xe7G\xbf\xfb\xf3\xef~\xf4\xdb7o~\xfc\xfb7\u007f\xd8\xf0\xc77\xff\xfecQ\xbf>\xfe\xedw\u007f\xf8G\x89!\xd9\xfe\xf9\u007f\xfc7IF8\xf1\xef\u007f\xf7\xef\xdf\xfd\xe1\xbf\xfcSX\xc0\xc2Un\xf8\xd1\xef\xbec\x89\xf0Y1\x00\xac\f\xea\v\x18\xa6q!\xbb\xc9\x00\xd2\x19\b\x04\xdcM\x81\x804w\x8d\x90݂\a\x91\x0f\u007f^Jƅ\xd9[\xff\x99\u007f\x18\xa0}\xaaSY\xe4Ņ\xda㕚D!dC\xc8\xfbE\x9f\xdd\x17WF|>,\xf0\x9c\xeeT\x15\xbd\x14r\x89\xc0|$\xf6\xaf6\xfc\x9e\xbc\xfc\x99\xf4\xba\xfe\xfe\xffP\xc9\xf9\xfb7o\xfeǯ\xde\xfcjÿ\xbd\xf9\xa7\xffG0`\xf9RCʟ\u007f$\xc9\b'\xfe\x81&\xfe\xf8㰀\x85\xab\xdc\xf0[\x9a\xf8\x99\xe4\xac\x18\x00V\x06\x95\x05\xcc/\xc8\xd58\x1f\x98\xe4Cx$\xb9\x89ʦ\x10\xd9]xHC\x14\x8b\b\x18\xf6\xf1\a\xf3Ж\x06\x92\xba\x8c\xbc4\xc8ll\x0f,\x84\xcd*`\x93g\xbf\xa8\xe5j\xa6p\fU5b\x82\b\xcc\xff\xfc\xf8\xbf\xff\x1bU\x13Ak\xc8\xeb\xc7\u007f\x16e\xe8\xb7\xff\xf5\xcd\xcf\xfe\xdb\xcf\xdf\xfc\xfdo\x05\xad\xf9\xe8\xcfoB&\xc2\xeb\x1f\u007f\xfe\xf1\x86\r\x1fI2\"U|\xf4\x11\xfd\x99PX\xc0\xc2Un\b%\xc2g\x8d\xbd8\x00P\x05u\x05,\xd0\xd4˶\x0fM\x81\x80\x97\xe20{\xbd\x01In\xa2\xc2)\x84D\xc0\x1e\x9c\"\xfb\xbe\x96\xf4\xeb\xa43\x96\xb6\xd7=\x9e[\xb0\xf8FJ\xbc`\x12\xaaB\x91n\xa9\xc0\xfc\xfeW?\xff\xf8WJ\x02\xf6\xdd\xc7\u007f\xfc\xe8\x8f\xe4\xef;\x89\nI\x05\xecg\xff\xf3\x8fo\xbe\x93\xeaV8\x11\xea_\xc5\x17\xb0\xf0Y\xa3/\r\x00TB]\x01\xc3\xcd]\xf4\xd5o\xe9\x11\xf7\x05\x1fXtn\xca#\x11\xb0:\xc4\x1aWx\f\xe3Q\xb4\x05\xa1\x9d\x9eXsw\xc3dl\xa6\f\xfa\x1cr,*O&`o\x04\u007f}X}X\x8f\x8b\x8e\xf7\xde\xfc\xc3\u007f\xff\a\xf6'\xf0\xb3\xd0\x102\xf4J\x95\xed\xdf\x15\x05\xec\xef\u007f\xfdFj\x1b\xa92<\x84\xa4\xb0\xb3F_.\x00\xa8\x84\xca\x02\xe6⻝ng\xc8]\x1f\xf08\xcc\x1eotn\xea\xe3̺\xeck\xd94\xee+\xdd\xe9&\x02\xb6\xf9\x9c\xb5\xad\x02\x91N樦\xc7j\xf3(t\xc0\xf6\x89\xb1\xb4\x131e\xbc\x80%\xbc\xfb\x93\xbd\xd2h\xb7\xb3\xe0\x1fD`\xfe\xcb\xef\xbe\xfb\xee\xd7?\x95\xa8\xcf\xff\t9\xda\xdf\xfcjï؟\x00\xc9\x13\x9c\xf8!ß\xfe\xea\xbb\xdf\xffXQ\xc0~\xf7\xf1\xbf\xfd\xf9\xbb\xdf\xfdװ\x80\x85\xab\f;\xf1\xc3gU\xbed\x00XvT\x160\xec鱘\xda\x06\xc5i\x02\x1e\xea\x02k\x8e\xceMy\x02\xa4\xa3՜\x892,\b\xed\xc7M\x85u9\x9b\xb2\v\xe9 y@C\x1d\xf4\x9b\nc\x9c`f-\xafPMB\x9e\t\x8f#ki\x9a\b\xcco\u007f\xf6\xd1\xc7?\xff\x83D}\xde\xfc\xfa\xc7\x1f\xb19\x0fo~\xbf\xe1\x0fo\xfe\xc0<\xf3\x82\f\xfd\xddGt\nD\xd8\xf0\xf7?\xfd\xe8G\xbfV\x14\xb07\xbf\xfb\xd9G\x1f\xfd\xecwa\x01\vW\xb9\x81&\xe84\x8a\xf0Y\x93]-\x00,\x13j\v\xd8:ƻ\xf9\x98w~\xde7t \xeb\x03\xf74C\x02\xa3\x161\xe7\x03\x01\x03V\n\x100\xd5h\xcf\x12F\x8f\x01\xed\xdd$\x96\x8b\x04\x04\fX\xb7\x80\x80\xa9\xc6h\x9a0vt\xa4=Lb\xb9H@\xc0\x80u\v\b\x98j\x04*ҏ\xb5\xf4\xb6\x1cK\xafHf\xb9H\xd4\x16\xb0\x18@\xc0\x80\x95\x02\x04LE\xac{\xb25\xd9{\xac\xc9\xcc\x16\v\b\x18\xb0n\x01\x01K}\x92\x85\xdcX~\x92]!\x00,\x13 `\x00\x00\xa4, `\x00\x00\xa4, `\x00\x00\xa4, `\x00\x00\xa4, `\x00\x00\xa4, `@\"\xfc333\xf3\x18ϓ\xcdZ\xf9\xa9*\xb0\x96\x00\x01\x03\x120\x90\x86\x10J\xf7\xf9\xd2\xc9&-j\x9dE\x00Xy@\xc0\x00\x05\x86k^\xb3\xad\x05Y\x87\x86\x1c\x18;\x86\x86\xac(:\x98\xd2Bi/\xf0&3!x\v\xda\x15\x92\x00\x90\x10\xb5\x05\xcc\xd3\xd5l\xb2\f\x84\x96cp\xf0\xe1i\xe9\x92$\xf0\x01\xf8\x8a\xe3:Ȧ\x83㾊:2v(*D[,w\xb8Va\x15~Kdy~\xb7 `\xc7P\xda\"\x85\xac\x01\x9dKf\xc2hHkPH\x02@\"T\x16\xb0i\xde\xeat;\xdbĥ\v}\xa6\x81PT\"I\x12\xf8\x10\xbc,\xbe\xf3\x03\xd9\xfcp\xa7\xf8eԑ\xe1\xe2~1\xf5\xe8\tV\xa4\x93\xbb/\xa6b\x05\xccc\xdbT\xa7X\xa8wT1\x1b\xff&ͬ| \x06\xebƫ\nI\x00H\x80\xca\x02\xe6\xe2\xe9\r\xe1\xe3\x9dl\xcf\xda\xe3\x0e\xa9\x96$\t|\x10N\xdcc\x9b{'b\x8e\x04C\x89\x1a\xd9\"\xafa^\xe8\x1aC\xc9X\x01\xc3X\xa3,`;J\x15\xb3'5\xa7\x14\xf3\x958\xa3q+$\x01 >*\v\x18f]//\xef\xa1\x1b\x87\xd9\x17\x8a\v)I\x02\x1f\x86\xf3߰M\xe3\xf9\xf8&U\xca\x02v\xc5\x10\x0e \xb2\b\x01\xcb?\xa8\x98]\x91\xbd\xf0\xe5\x1b}\xd9\x15\nI\x00\x88\x8f\xda\x02F\x98q[\xacti?\x9f\xc9\x15\nl+I\xae\x17\x9a\n2r\xabɽ=\xbe\x11\xa13\xae\xf2\xad\xe9{\xe6%\xc9(c\xf3\x16\xb6\xe6\xb4;S\x8c\x1b\x99)ힴr\x1cׇ\xfb\xc8k\xab\xb4Lc=\xdb\\h\xc4\xcft\x1c\xf7͋\x8bG\xf5\xb5\xef\xf0[=\xb3&\f\x8bArYp\xb6\xe0\xfd\x9a\xe2ʛb\xf8\xef\xe2p\aLY\xc0\x8eWdg\xeds\x91^3\xb9\x92/p\x1dy\xb5X\xc5\v\xcbg\x16\xa1\xb6\x11\xfc\x99\x9f\xd3ͻ2]\xa3\xc1\xf0\xe8F\x89\x91\x9e\xc3^{XWV{\x98\xf6\x04_],3ܼYV\xcc.\t\x9fI\x9f\t\x9dN\x92\x04\x80\xb8\xa8.`^\x9e\xe7\xcd\xec\x9f\xdb\xda\x1d\x8e\xcc-I\xae\x13*Ҏ[\xafj\xf3\x03x\xc6Ҽ573\xa7\xba\x1c\xb9%\xc9(\xeb\xfdh\x0f\xdd\xf8\xcdW\x05\xcc\xd29Y\xaf\xebk\xec\xb3xv\xc2X\xffJZ\xe6^\r\x9e0L\xe0\xaa{x\xae\xaf\xefpe\xb1\xe1f\xfd\xee\x97\x18?\xb6\xdb\xf5L\xe8f'XX\x10;\v\x92{\x85\xbb1\xd2y\xa8\x8a\r.\x9fr\xf6p%\x8a\x02\x86\xf2[Z\xb6g8\xb0o \xe7\xd84\xf6\x9e˴\xf9|\x03\xb6\xdcB\x9b\xcd\xc6\\\x03\xe1\xb6a\x1a\x89I\b\x99\xf7\xa8\x84\xbby\x9a+\xbb]\xd6AN\xb0\xfbb\xffؽ2\xee\x1d\x11\xcb\x13\x86\xceV\xbd\xfe^m\a\xb3\x1a@\x83\xa1\xd3I\x92\x00\x10\x17\xd5\x05\f{=\x0e\x16\u007f\xc8IeLP-Ir\x9d`EԳ=\x84Z\xe8N>\xda\xe5\x13\aג\xa4\x94\xc9:!\xee\xda\xf4\xa4\xc0\xb4\xec\xe8\xfd_\xb2͉\x90\xe7]\xc0^\x86\x1bu\x8d\xf83\xa6FU\xdc\xe9\xb78\xf8V8\xa2\x0f\xf5\xd4\xc2C\xc8a\xe6\xb5\u007f,t\xcdF\xb8\xe7\xe1J\x14\x05,\x8f\xf4\x8dfr\vH\xb2\x8e\xf6\xb8\x8e\b\x83\xbd\xf0\x10R\xd66+\x12#\xc6\x19.\x92\x8a\x87\xf1ů0\xee\x8d8\x8b\xd50\x86\x1f\x17\t\x02\xf6\xb8\x91H\xd7\xdb>}'\xed&־|Vi\fM\xec\xa8ӄGϒ$\x00\xc4E]\x01\xc3\xcd]\xf4\xd5o\xe9\x11\xf7%\x8e\xaf\xb5\xeb\x03\x9b\xac\x8b\x99\xe3\xd9%\xa8\xc1\x17\xac3#\x99\x80\x10g.\x82\xbbaR1_\xa4\xfe\x86n\x84\xbbv!ʶ\xb6\xe6<>od\xa1o\xe3\b\x98ш\xf1k\xea\xf8\x1a\x13\xbc_\x8d\xb7Y\xf6\x85\xca\xf0L1E\x01\xcb!].\u007f^!M\xfb\xb5\xd6,\xf1\xb3,$\x19\xd3\xd4F\xd662\xa0\x14\xbe\x95$\x02\xd6ʍ\xd0\x1c\xe35\x8c\x9fpe\x1cw\xfa{\xf1\x14\x81\xbcp\x84rI\x12\x00⣲\x80\xb9\xf8n\xa7\xdbi\x11g\xe2\a<\x0e\xb3\xc7\x1b\x9d\\s\xecC\x9bcz\x13\xa7P\xa9\xa5\xbd\x025\xe1\xf9A\xf6\xfc\x8e\x8a\x8e$\x19SC\xc2\xdb\xf9\xb6\xbe$X\xa9\xbf\x1de{c\xf7\x1d|g\xf7\r\x8c\xdf\xfd\x89=od\x9e\xad\xb9\t\xbb]\xff\xa5\xdd\xce\xfc\xf9\xadE\x1d\xfd\xa7\xd9L\xfd\xc6\xdd\xf5\xfd\xdf^\x11d\f?\xe7\xee\x84jV~\n\xb9g\xb0\xa7 K\xb8\xccS۲\xc49\x1f\xe74\x97\xdaweP\xf3p\xdb(\xae\xb4Kt3\xf5Y\xc7l\x9fnj\xb6\x9e\xa8U+W\xdc:\xdc\u007f\x85{\x84\xf13\xfd؈\xfd\xfb\x90^^Fa\xa5\x97$\x01 >*\v\x18\xf6\xf4XLm\x83\xe2,\x00\x0f\xf5{5G'\xd7\x1c\xa6\xcdh(&\xb3k\xa76\xebӻ\x18\x8f\xa71\x87\x11\x15\x1dI2\n\xb3\x96\x8f͌\xf0\xb8\xa4\x15\xdf)~\x1ce;\xa2\u007f\x86\xa7\x8a\x87\xa9\x93\x9f\xc1\xfabOEo\x17\x9b\xa6?w\xe33\xbdQ(6v\xba\xac\xc48\"\xd6ת\x0fy\xc1,\xc8\x15ZN\xc7\x15\x12\xb0\xbc\xba\x83\x99\xd9\xe5\x1eaDžB\x13N\xfddz\xd2\v\x85v\x86\xda\xc68\xf3\x93\x01\x8c\x83\xa4\xa3\xd5W\xcc\x15\xf7q\xdcy|\xdfx\xfb\xb0\xce`$\xfa\x85't\xf4btF\xe6\x04\xb3\xa5\x9f\x14\xcbH\x93\x00\x90\x00\xb5\x05l]ҎR˟\x13\xbc\xa1\x13\xfabl\xaejh9\x1d\xa4\x14Pܧ\xe9UȕQ\xad\xb1\xc4;\xf4\xba\xf8\xda\xebw\xef\xde>=\xff\x19\xe9\x11\xb6h*B\x13x%I\x00H\x04\b\xd8r0#\xce\xd7b\x93\xc9\x03\xe6\xacc\xc9\n\xac2\x82\x1d\x06aR\xec\xfc\xf8Ph9\x9d\xa1q%M\xb1h\x93+\xcd\xe5\x1c\xf9\xbc\xb5\b\xfd%\xc2\xe81X6\x82\xbd\xd9\xe1\x15($I\x00H\b\b\xd8rP(\xce$`\x8en\x8f\xb6z\x8d.fZ\u05cbw-l\xa9\x9c\x89'\xb4\x8b\x00\x00 \x00IDAT8<\x11'PLqO\x93X\x02\x80\" `ˁK\x9c\xaf\xe5Jf\x98\xd2\xf8P\xfe\xb1E\xfcT[\x81\xe0\x15\xfd\xb5\xbeG}\xd7\xf4_\x051\x00,\x01\x100`ɜۼә\xcc&1\xc1\xe1Z\x83\xceP;\f\xfa\x05,\r\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x100\x00\x00R\x16\x10\xb0uɺY\xb7\bX\u3000\xad?<\x15[\x84\xd5\x06\x01 \xd5\x01\x01[w\x04\xf2\xf2\xf8\x9eD+W\x03@ʠ\xb6\x80y\xba\x9aM\x96\x81\xd0\xefO\x1c\xbc\x95nf\xcclAi\xf3Z\xfa\xc9`\xb7\xd6\x1aJz\x8fmI\xdf\xfb^\x836k\x96\x15/\x94Љ\x8f \x842\x94~\xcb4\x8e\xba\x14r\x01 \x15QY\xc0\xa6y\xab\xd3\xedl\x13\x174\xf4\x99\x06تw>\xfe\xa1\x87\xb0\xa6\xd63\xb4f\xdc\n%wm\xb9~$\xfd\xbd~3\xf89\xfa<\x99I\x98Љ\xdd6\xdb\u05ca\xa1Ɇ\x90|I}\x00H]T\x160\x17O\xc7.>^\xf8\t\x9d\xb5\xc7-\n\xd8\x1a\x1cф\xbb\\^t\x15\a\xdeK\xbf\xf0\x19t&\x99I\x84H_o(\x8e\x80A\xc4E`\xad\xa0\xb2\x80\t!\x0f\xbdB\xf8!\x87\xd9\xe7Y\xbb\x02\x16ƅ\x16>\xfe\x8bC\x1d\xaaKf\xa2\x04\b\x18\xb0\xd6Q[\xc0\b3n\x8b\x95\xf6\x12|&\x17^\xa3\x02FW0Mc\vd\xfb\xb5\xc2\xca`\xd5Q\x16\xc1\xfb5ŕ7g1~\xa6\xe3\xb8o^\\<\xaa\xaf}'IFY7 \xb6\u009f;S\\g,S\xfa~\x1dC\x9b\xf8\xea܌=\xaco\x1b>1EY\xaazA\xc0\x805\x83\xea\x02\xe6\xa5\xdez\xd6\x0f\xb3v㰀u\xdf\xe2\x9bm3\x89K\xa6\x12\x0fl6!|\"~hkAu6\x9b'\xca\xe0\nwc\xa4\xf3PU\x10\xcf\xf5\xf5\x1d\xae,6ܬ\xdf\xfdR\x92\x8c\xb2\xbe\x8a.Ӎ\xdf|U@\xf6\xb8\xc3ټ\x11i\xeb.e\xb2\x88l\x91\x13cE\x01\x9b\x9f\xeeݑ\xf5~\xe3Y\x00X=\xa8.`\xd8\xebq\xb0\xa8DN*c!\x01k\x1aw;--k\xe9)$N\x0f\xe9\x88\xd2\x10r\x98\xbbO^\x1f\va\x80\xaa\xb8\xd3oq\xf0mTR\n\x8f\x84@\x1d\xd3\xe2R\xd5QK4k\xb2h8F\xad\xb8\x97\x9eH\xc0\xf6\x93\xfe\xdb{\x8fh\x01`\xb5\xa0\xbe\x80a\x1a\x17\xb2\x9b\f \x9d\x81@\xc0\xdd\x14 \xa3ɀ\x83v\xbef\xcckjh\x93P\xc0\xea\x8fν#\x18\xaeН\xaa\xa2p\x8fK\x92\x94bFf\xba\x99D!\xe4Cn\xcd\x11LÚ\x89{\t\x05\xcc\xdd\xc5\xe7A\x0f\fX3\xa8,`~\xe1\x11\xd98\x1f\x98\xe4CxB\amm\xf1\x8a\xa5\"\t\x05\xec\x84\x18\xdd\xec,ݩ\xaa\t\xe7K\x92R\x06\xb2\x04%\xb2\x89KUG̓`ѯ\xeb4\xe2^B\x01#\xd8\x14\x82\xbc\x01@j\xa2\xae\x80\x05\x9a\x84 \\\x0fM\x81\x80\x97\xe20{\xbd\x01\xdc#\xdc\xe1\xbdkjl\x93\xa4\a\xf6\x84\xc1b\xffH\xc2f\xcb\"h/\x18\xe6\xf5Z\xb0\x80\xc1SH`\xed\xa0\xae\x80\xe1f6\t\xdco\x11\xc3ы>0+\xebzy\xcd\x0f\xe3\x94JI\x12\nؘ\xe0\xfdjdѴ\x17 `\x89\xe7\xf1\x83\x80\x01\xeb\x15\x95\x05\xcc\xc5w;\xddN\x8b8\x13?\xe0q\x98\xe9\xfc{7\xdf\xe5r?0Y\xdf\xeb\xe76\xab\t\xff\xa0ͦ9b\xb3\xf9BO!\a\xa3\x9bָ\xbb\xbe\xff\xdb+D\xc6\xde\xfd\xc9^i\xb4\xdb_\x90\xb5\xfeY2S\x8c\xbf\xa4v\xe1\x15\xc7\xfez\xadL_\x1b\x14w\xeep\xad4\xe9Ԛ\xb1I\xeb¸\x02\xa1Kd\xff\x12B\x15Q\x95tk\x17\xbdv\xee\xe8F\u007fv;\x9e\xde\xf4ET~\xf8lK\xa6!\xad!\x99\t\xb0vQY\xc0\xa6y\xab\xd3\xedl\x13\x174\xf4\x99\x06؊\xac\xd8\xdf\xcd\x0fN\x8e\xf2\xef\xf3\u007f\xbcNx\xf4$&kn\xe2P\xad\x9dp\x9f\x1bIj\x8b\xbf\xb7\xdb;\xb9\x89\xd0\xde\xe9C\x9d\x17\xf5b\f\xa4N\x16(\t\xe3\x1eT\x8d\xabQ\x0f\xc6\xee\xcd\rt\xbc\xe7mȌ^\x13њqKL\xf5\x8e\xe2\x851\xa4\tl\xb5\xe0\x064\x19\x95\x1f>\xdbұn\xbc\x9a\xcc\x04X\xb3\xa8,`.\x16\xc2\xd6\xc7\v\xeb\xfbY{܂\x80\xf5\x98<4bd̪\u007f@45JkN\x1f\xbdF_\x9fG\v\x98\xa2-\r\xe6\x16\x12\xb0\x1f\xb8N\x1c\x9c\x15\xd2/t\x8dB\xe2\x01:\x87\xcf!*L\x9f\x98X\x86i{L\x15\xe1\xe5\x10w\xc4,\x97\x18\a\xefF\x13r\x04\xb6\xee\x8aΏ\x9cm\xe9\x9cѬ\xb1\xb8\xc8\xc0\xc2QY\xc00\xebzy\x85HD\x0e\xb3OX\x13\xdf\xc3?\f\x1f\x03\x12\xa2\xb8h\xbe `s\x9dQ\xf1$\xe3,\xb0\x1f\x11\xb0\x17\xdcp8\xf7\x8aAT2\x17\xba\x8c\xaf\"\xda\x19>p\x86e|q\x00\xc7%\xff`\xfccr\x8e\xa3\xbd\xb8\x17\xc5\xf8\xab\"g[:\xbe\xec\xe81.\xb0nP[\xc0\b3n\v[\xfd\xdegr\x89A=\x06M\xf3I\xc2V\x00\x94a\xd1\xd9\x15\x1d{M\x100\xca\xdb\v\x06\xdd\xe1\xb3Ϣl#\xb9\x14Q\xc0\xe6\xca\x04\x83\x9b,s\xaeX\xec\x80a/j\xc2\x16D\a\x8f_\bݫ\xd2/\xf0\xf8F\x84θʷ\xa6\xef\x99Ǿt\x84\xd2\xe8:\xe0\xd8*.Z\x9d\xcf̚\n2r\xab\xc5\xef \xf3\x16\x1eG\x11p\xce\xe3\x83Z\xba\x96\xb8\x85\x14\xa9\xc3u\xe4\xd5\"=[\x1c\x82\xf7k\x8a+o\x12q}\xa6\xe3\xb8o^\\<\xaa\xaf}'I2\x9b3\xe9k(\xa8;\xb0(T\x170/\xcf\xf3f\xf6\u007fn\xed\x0eE%j\xb7:\xdb\xf8\xe6\x01\xf8/L\xc2\xec\x04\x8b\xfaa\u007f\x1e\x95\u007f\xf4\xca\xdc\\\x87\x91\xa6\x86\xb9\xaf\x1e\xf5\x9d\xe5\x1e\xcbm#\xb9\x94P\x0f쩽\x8fk\xb5\xdb\xff\"\xecpv\xb1\xb2@\xce \x1eʡ\xdf'\xa6\x1dx\x90\xec\xe4\xf3x\xc6Ҽ573\xa7\xba\x9c>I|`\xb3\xb10H\xd87`\xcb-\xb4\xd9ll\xe4_\x91v\xdczU\x9b/|\x0f\xedG{p,\xa2\v\xdfg\xcb<\xe3\xc5\xde\u007f͢\xa1G\"g\x8b\xc3\x15\xee\xc6H硪 \x9e\xeb\xeb;\\Yl\xb8Y\xbf\xfb\xa5$\xc9l\x06 \xceҺEu\x01\xc3^\x8f\x83E%rR\x19\x13\x04\xcc\xc27\x8d\xbb\x9d\xcd\x16\u007f\xb2\xb2\x80\xf2\x10\x92\xf6\xa4\f45\xdbG\xfa*\xc1\x13\xe7嶲\\\xe5!\xe4\b\x17\xad\x8a\x18۴\xf8s\xcdI\xace\xb1<\xf3\xd1._x\x94\x1f\x8e\xdc\x16\x1eBZY\xec\xf0!\xd4\xc2\xf6&뢝\xf5\x94\xb0\v\xbf\x82v\xedJ\x174\xee\x1bf\x8f\x16\x1e\vQ誸\xd3oq\xf0mT\x12c7\xba\x15\xaf<\xb0\xc6Q_\xc00\x8d\v\xd9M\x06\x90\xce@ \xe0n\n\x90o_\xab\x89\xde\x18>3D\x8cN\x8a\xb2\x80\x9d}\xfc\xf8\"\x130\xfc\xaa\xb3\xf6h\tw\"\xcaV\x9a\xab,`\xfd\\l477\xf2\x15\x1e\xf9ԇ\x98\x8b<_\xea)\x8f\x15\xb0\xd2m\xfeyBN\"UڶSL\xf4\xa6\xfb\xb0/\xa37\x81i\x98\xfa\xa3s\xef\b\x86+t\xa7\xaa\xe8e(_\x92\xa4\x17\xda\x12[\x12X\x17\xa8,`~a\xb00\xce\a&\xf9\x10\x1e\xdc\xcb\x02\xdb\xe2^\x98\x92\x98\x94\xb8N\xfc\xa9{4\xf5\xf8\xd0\xe1\xc6~\xfb\xe9(\x01\x93\xe5*\v\xd8DdnE\x98\x80Ʊyt\xb3c\x13\xfb\xcc\xf2wH\x8e\xc4\n\xd8v\xd1\x1f\x96 ڑ\r\xb5\x89\xcf/\xe7\xb5m\xb8]\xbb \xaf\xe7\tѕw\x96\xeeTE\x9c\u007fUR?\xe0\x10D\xba\\\xb7\xa8+`\x81&\xe1k\xf7\xa1)\x10\xf0R\x1cf\xaf7\x80G\xcd쟹g\xd1\xd3#\xd7\x1fL\x94\xeeIz\x1f\x94\x88\x13\xbf\xb2\x86>K\xbc \x110j+\xcbU\x16\xb0٢V\x1cCnC6ι\xb4\x8d\xa5\xf3\xa5\xcf\"\xe5\x02f\"}\xb3\xf2m\xa3\x8c\x04\xee\xf8R\xad\x1fW\b\u07b3\xe3\xfb\xf1\xfe\xe3\xf1-%\xd4\x1f}\xc2xEw\xe2\x850\xaf\xd3\xc0\x03\xec\xf5\x8a\xba\x02\x86\x9b\xbb\xe8\xab\xdf\x12\x9a\xb9(\xf8\xc0\xbcl\x1a\x85\xcf\xf4 N) \x8cш\xf1k\xc1#\x84\xdd\r\xa2O)\"`\x87\xe9}\x1d\xac:!\xb7\x95\xe5ƙFq\xa12\x88\xa3\xd9[\xb0\x1f\x1f(\x10\xfc\xf1\xb2\t\x13a\x01+,\xc4x\x9a>M\xec\xa2/\x18\u007f!\x1c\b_\x99\x04\xaf\xe6s<\x8aΥM\x93\xf4\xa0ƣQ\xf0\xbbO\xd6\xc5L\b\x1b\x13\xda\xdax\x9b\xbe\xc6\x11\xb0@\xde^\f\xacST\x160\x17\xdf\xedt;-\xe2L\xfc\x80\xc7a\xf6\xd0\xef\xec\a\xa6\anGSۇ\xfe\x9d\xdc\x1a\xa4\xb5\xa8\xa3\xfft\xb1\xd0\x03ۇ؍Kg\xe2O\x88\x93\xb8Z\xb9\v\x9d\xb7\xab\xb8\xb2;\x13R[I\xeeK:\x13\xbf\xc3n\u007f\x19z\n9!\xea\xd6s\xeeN\xccɪQ\x03n@\xa4\xab4?Ȟ72U\xf2\x0f\xdal\x9a#6\x1b\xfb\b\xcfi.\xb5\xefʠޱS\xa8\xd4\xd2^\x81\x84\x89\xc9\xe2\x95ɸ\x84\\\xb8yk\x80\tW {O\xb6\xc2\br\x1f\xda\x1cӕj\xdc]\xdf\xff\xed\x15\"c\xef\xfe\xc4\x1e\xabRW\x9d$I\xb9\xfc\x9e\x13a\x81\x14Fe\x01Þ\x1e\x8b\xa9mP|\xdc\xe8\xa1.06\xa5\xc8\xd5nn{\x00\xfa\x95\x9c\xb9\x1b\x9f\xe9\x8d\xe2|\b\xb3\x96Ͷb\xbf\x85\x14\xfad8\xd8QYt\xa8\xfe~\xa5\xce(\xb5\x95\xe4^\x14}J\x17\xf0\\\tK\xe8BO\x1f[\xf51^0k\xc68vd\xb4c<\x9e\xc6\x1c\\L\x95\x86\x844b\xe7\xf6\x1f\xcfJ/\x14\x9e\xbdt\xed\xd4f}zW((^\x99\x8cm\xa4\xb3f\xd3X\x85G\x02\x975\x97c\f\xc8Xt3\x8a}\x8e3v\xba\xac\xc48\x82\xf13\xe1\xc2k\xb1,I\xb0\xa5\x9f\x8c)\x04\xac\x17\xd4\x160`\xb5\x12\xbc\xa1\xebKf\xf3\x1eL3\x17~\x01J\xf8ۣv\xb4xgV\x8b\xa6\x02\xbe\xf9\xd6/ `\x80H\xb0\xc3\xf0*\x99\xcd{\xc0z^~W\x82g\x8f\x01sֱ\xf8G\xe3\xe0͆\xc5(\xd63 `\xc0j\xc1\xa3\xad\x86\xa9\xcc\xc0\xe2\x00\x01\x03\x00 e\x01\x01\x03\x00 e\x01\x01\x03\x00 e\x01\x01\x03\x00 e\x01\x01\x03\x00 e\x01\x01\x03\x00 e\x01\x01\x03\x00 e\x01\x01\x03\x00 e\x01\x01\x03\x00 e\x01\x01[\x0eJ\x91\xb6\x1cb\xc4\x01\xc0\xb2\x03\x02\xb6\x1cxz\xcdy\xda\xc5\xff.\x19\x00\x80š\xb6\x80y\xba\x9aM\x96\x81н\xed\xe0\xe9\"\xac\xf3M\xe2\xe2\xd2͉J\xa6\x18\xbdh<\x99\t\x00\x00\xef\x89\xca\x026\xcd[\x9dng\x9b\xb8\xa0\xa1\xcf4@\x17\xc0\x9b\xe1G=\x84\a\xfcZ\xba\xe5\x87 \xd4\x17\x00,;*\v\x98\x8b\xa7\xab\xaa\xf8x\xc1Ad\xedq\xb3\x15<\x1d,(QӚ\x8a\xcc\x00\x02\x06\x00ˏ\xca\x02&\x04\x16\xf4\xf2\x1e\xbaq\x98}\u009a\xf8\x8c\xbb\xb7\xd6Ժt `\x00\xb0\xfc\xa8-`\x84\x19\xb7\xc5J\x97\xb5\xf3\x99\\8\"`N~:A\x99\xd4c\x1c-(\xee!\x00\x00\xef\x81\xea\x02\xe6\xe5y\xde\xcc\xfaa\xd6n,\x11\xb0p\xa0\xa25\x82_[0\xe0^P\xe8C\x00\x00\x96\x8a\xea\x02\x86\xbd\x1e\a\x8bJ\xe4\xa42\x16\x1607/\t\xfc\xbc&\xb8\x8b\x10ڗ\xcc\b\x00\x80\xf7A}\x01\xc34.d7\x19@:\x03\x81\x80\xbb) \xf4R\xba-Iʤ\x1a>\xed\xd6\xcb=kM\x94\x01`\x95\xa1\xb2\x80\xf9\x05\xb9\x1a\xe7\x03\x93|\b\x0f\xcd1?HP*\x15\x19B\xdd\xc9L\x00\x00xO\xd4\x15\xb0@\x93\xe0\xd9~h\n\x04\xbc\x14\x87\xd9륚\xe6]s#Hx\n\t\x00ˏ\xba\x02\x86\x9b\xbb\xe8\xab?\xec\xb1\x0f\xf9\xc0&\xf9\xb5\xf6\xc3\x1b\x100\x00X~T\x160\x17\xdf\xedt;-\xe2L\xfc\x80\xc7a\xf6xi\xcaɯ\xb5\x80Z\x83 `\x00\xb0\xec\xa8,`\xd8\xd3c1\xb5\r\x8aj\xe5\t\xff\x00\xd2}+A\x99\xd4\xc3\xef\x19-\xd5x\x92Y\x01\x00\xf0\x9e\xa8-`\xeb\x83\xfd\bmmOf\x04\x00\xc0\xfb\x02\x02\xb6\x1cxF\xd7\xda3\t\x00X\x95\x80\x80\x01\x00\x90\xb2\x80\x80\x01\x00\x90\xb2\x80\x80\x01\x00\x90\xb2\x80\x80\x01\x00\x90\xb2\x80\x80\x01\x00\x90\xb2\x80\x80\x01\x00\x90\xb2\x80\x80\x01\x00\x90\xb2\x80\x80\x01\x00\x90\xb2\x80\x80\x01\x00\x90\xb2\x80\x80\x01\x00\x90\xb2\xaco\x01+E\xdarg2#\x00\x00V+\xeb[\xc0<\xbd\xe6<\xad\xb0\xb4\x8f\xb7 \xfc\xebkI\x12\x00\x80Ռ\xda\x02\xe6\xe9j6Y\x06B\xab\x17:x+\xdb\xfa\x06n\x99n\r\xacȚ\x86\xbdH\x8c\aސ\xd6\x10ʓ$\x01\x00XŨ,`Ӽ\xd5\xe9v\xb6\x89\v\x1a\xfaL\x03lEV_S\x1b\xcdmZ\t\x05\x8b\xac\x9cj\xddx\x15\xc7&\x01\x00X\xbd\xa8,`.\xb6\xf6\xbd\x8f\x17\x1cO\xd6\x1e7\x130\x9b\x85\x06垷\xd8\x12\x94\\.$K?\x9fѸ\x15\x92\x00\x00\xacZT\x160\xcc:Y^!\x12\x91\xc3\xec\x13\xd6\xc4\xef\x11|N\xed+\x11\xdbV\"`\xbe\xec\n\x85$\x00\x00\xab\x16\xb5\x05\x8c0\xe3\xb6Xi$\"\x9f\xc9%\x06\xf5\xf06\xf5z\xfd^[\x937I\xc9\xe5`\x1c\xf5\x86\xd3g\xd2g\x14\x92\x00\x00\xacVT\x170/\xcf\xf3f\xd6\x0f\xb3v\x87\xa3\x12\xcdt\x93ܮ\x15\x91\f\xbf\xb6`\xc0-D\xab\xc4\x03\x91\xde\xd8\x00\xc4\xe4\x00\x80Տ\xea\x02\x86\xbd\x1e\a\x8bJ\xe4\xa42&\b\x98\xbf\xdb\xe2\xf48-\xdd\xf3\xc9\xca.\aw\x11B\xfb\x84\xa4\x1b\xdd\n\xe5J\x92\x00\x00\xacV\xd4\x170L\xe3Bv\x93\x01\xa43\x10\b\xb8\x9b\x02\x01\xea\xc4\xf7\xb3܁d\x05\x97\x01\x9fv\xeb\xe5\x1e\xd1c\xefF-\xa1lI\x12\x00\x80Պ\xca\x02\xe6\x17\x06k\xe3|`\x92\x0f\xe1\t\x98\x1e\xb2܇\xa6@\xa2\xb2\xcb\xc3\x10ꖤ\a\x14\x92\x00\x00\xacV\xd4\x15\xb0@\x93\xe01'R\x15\xf0R\x1cf\xaf7\x10\x12\xb0ѕ\x11\xb0\x88\xb3\xabN\xe3SH\x02\x00\xb0ZQW\xc0ps\x17}\xf5[B\x13&\xc4i\x14\xe2\x10r\x85\xa7Q\x04\xf2\xf6*$\x01\x00X\xb5\xa8,`.\xbe\xdb\xe9vZę\xf8\x01\x8f\xc3\xec\xf1b<\xd3bq\xb8\x1d\x96\x96\x95x\f9\x18\x11\xb0\xcbhT!\t\x00\xc0\xaaEe\x01Þ\x1e\x8b\xa9m\xd0/\xeeP\x17X3I\xf8\x87\xda\xccmC\xfe\x84%\x97\x03\xbfg\xb4T\xe3\x11wl\xe9'ql\x12\x00\x80Ջ\xda\x02\xb6\xba؏\xd0\xd6\xd0\xca\x13-\x9a\x8a\xf9\xd8$\x00\x00\xab\x98\xf5-`\x9e\xd1\xf0O\x1e\xbd\xd9\r\nI\x00\x00V3\xeb[\xc0\x00\x00Hi@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0\x00\x00HY@\xc0V3\xc35\xaf1\xf6\x16\xb4c\x00\x00\x94P[\xc0<]\xcd&\xcb@h\xb5S\aoe\xdb\xc0x\xbb\xa9\xcd\x19\xbf\xd4r2\xb9\t\xe5\xc5dz\x8fmI\xdf\xfb\x81և\x9d\xaa-6\xd4?2\xbc\xc6_r\x1c\xa7\u007f\x91\xcc\\\xc2\x1d\xae5H6\ri\xf0\xe3r\x00PDe\x01\x9b\xe6\xadN\xb7\xb3M\\\xd0\xd0g\x1a`+\xb2\x06\xac\xe6Q\xf7\x03ӃD%\x97\x8f\xc1#\x9a\x98\xbc][\xae\x1fI_آҏ\x9e$>>V\xfc/\xf7\xfaNp\xdc\u007f\xe0\xef\xed\xf6Nn\"\xb1\xb5\x94N\uef90\xb0n\xbc\x9a\xd8\x12\x00\xd6)*\v\x98\x8b\xa7\xeb\xd7\xf8x\xa1\xb7e\xedq3\x01{h\xa2!m]\xa6\x85)\xc6\a\xa7N\x13\x9d\xe3EWq`\x81WSs!\xe1\xe1\x1fJ\xce\xcea<[I\x04\x8c\xf0x\x11\x02\xf6B\xd7\x18J\x9eф\x97\xfd\x01\x00 \x82\xca\x02\x86\x99*xy\x0f\xdd8\xcc>aM|+[)\x1f7=\x88Sh\x99\x89\x150\x17\xb2*\xd8)S\x95X\xc0\x1a\xf5\u007f\xa1\x9b\x0e\xee9\xdd,F\xc0\xae\x18fCI_vE\"K\x00X\xaf\xa8-`\x84\x19\xb7\xc5J\xddK>\x93K\f\xea\xd1fc\a\xda\xef&*\xb6,xʳ\xb3\x0e\x88CȦ\x82\x8c\xdcj\x1f\x8dՍ\x18ղ\xdc\xf1\x8d\b\x9dq\x95oM\xdf#]\xacu\x98\x13\xa8\xa1;\xf6\xdaú\xb2\xda\xc3A\xd9\x19*\xaf\xb0ͫ\x8e9\xba\t\vX\xb0\xb3F_\xd5\x19\x8c*\x16\xbc_S\\ySЭ\xb9\xe2p\a\x8ct\xc1\xd2W\"^\x00\x00\xacvT\x170/\xcf\xf3f\xd6\x0f\xb3v\x87\xa2\x12\r4\xb1\xa8D涄%\x97\x01Wf\xae\xb9\xfd\x17HC\xd3\x15iǭW\xb5\xf9DZ\x1f\xdaZP\x9d\xcd\xe6\x91\xe5\xceX\x9a\xb7\xe6f\xe6T\x97#\xe9hnv\xc2^i\xb4\xdb\xed\xb4{\xf5t\xf7\xc5\xfe\xb1{e\xdc;\xe9\x19\xe6\xb8\x0e\xe9nX\xc0.\x16}3\xf2M\xd1ŨbW\xb8\x1b#\x9d\x87\xaa\x98\xae=\xe5\xec\x91r\x03\x92\xe0o\x00\x00\x84P]\xc0\xb0\xd7\xe3`Q\x89\x9cT\xc6\x04\x01\xf3\x99\xad\xde\x19O;oIV\xf6C\xf3\xe96r\r\x81\xed\x1a\x92\xb4\"3\xa6A\xd6X@\xee\xf0\x10R\x96\x9b\x8fv\xf9\xc4A\xb0\x84\xf0\x10\xb2\xf3\x10\u0560\xce\x12Y\x0f\xec\x05\xf7\xadt7$`#\xdc\x18y\x1d\xe3Fdņ\x99\xd7\xfe1\xd7'\x98<\x8f\x94s\xa3[\x18\x00\x80h\xd4\x170L#@v\x93\x01\xa43\x10\b\xb8\x9b\x02t4鵒~٠U\xed\xf9N>\xc4\xd3\xcd\x19\ry)\xdd\xe6\x9f'\xe40gSX\xc0d\xb9\xf9\x8a\xae\xf4\xb0\x80\xbd4\x1c\xbdq\xefipNvtN\xa7\xd8\x03\xbbr\x82mN|)+V\u007ft\xee\x1d\xc1\xc0F\x9d\xfd\x9cdƅ[\x90P\x00\x00d\xa8,`~an\xd58\x1f\x98\xe4CxhΌ7\x80\x9b\x06\x12\x15]\x06\x1e \xe6|;\xa7!/\xdb\x05\xc7\x17\xdaOs\xc2\x02&\xcb\xcdߡTIĉ\xff\xf6ޅJ\xae쎢\x0fln\x8cmB\x02f<\xcb6\xb55\xb2b'D\x8f\x1a;8!\xf5\xf7\x0f!\xb5\xdf\x1b\x00H\x05\xd4\x15\xb0@S/\xdb>4\x05\x02^\x8a\xc3\xec%ʅ\x99_\xdc%H\x99\x8ax\xd1u\xbaaN\xfc\xf2m\xa3\f:\xa1#\"`\xb2\xdc\xfc\x03J\x950\x01\xbb\xf7\x92\x88S#Ѡ\xb7}\xfaN\xd9\xe1F\xfd+\xba\xe9\xe3^\xd3M\xb8\av\x94\xf9\xec\x8f^\x94\x15\xab?\xfa\x84\xc1J\xcc\x16\xb5Fj\xa9\xd3,pR\a\x00\xac+\xd4\x150\xdc\xcc&L\xf8-=\xe2\xbe\xe0\x03s\xf2D |ͽq\x8b-\x17\x059\xe4Į\x9fhH\xb2\v1\x0f\xdc\x17u\xf45,`\xb2\xdc\xfc\x83Ju\x18\x8d\x18\xbf\xa6n\xabV\xea\xd1\"\xfb\xd7X\xb6\xbba\x92m\u007f(9OF\x87A\xe3Q\xb6\x17\xf1\x81Q?W\x1f-!)6&x\xbf\x1ao3\x9b\v\x95\xe1\xbe\\ o/\x06\x00 \x06\x95\x05\xcc\xc5w;\xddN\x8b8\x13?\xe0q\x98=TB\xf8!\xf7\xc3&\xab\xfa\x9d\fGFNݙ\xac\xb4\x8df'ƧP\xa9\xa5\xbd\x025\x85\x9eB\x0e\xb2\xd1n8w~Ж[h\xb3M\xc6\xd4\xd1Z\xd4\xd1\u007f\xba\xf8%U\xa2\xe2\xd6\xe1\xfe+\xdc#\x96\xbd\x0f\x89\x9a3\xa27\xde\x1f\xae\xd5\x11\xe1zIg\xe2w\xd8\xed\xc4\x16\xd7s\x8dÍ\\=\x96\x17k\xdc]\xdf\xff\xed\x15A\xc6\xf0s\xeeN\xe8\x1c\x97\xd1(\x06\x00 \x06\x95\x05\f{z,\xa6\xb6A\xbf\xb8C]`\xcd$1j1[G?\xd0O\x0f\x17\x85k_\xd6֓\xe6\x8d\xe8\x18Iw\xed\xd4f}z\x97\xf4\x0f\xb3\x98\xdbk\xa3\xf0k\x81P\xeex\x1aˍ\xed\t\xcd\xdd\xf8Lo|L\x12\xf7\x8d\xb7\x0f\xeb\fFA\xbf\xb0Yˋ\x06S\xb5\xfa\xb2\xb3t\x1e\xfeE\xd1\xc5Eǜ\xc1\xce\x13\xfa\x13l\x1e\x98\xac\xd8\xd8\xe9\xb2\x12\xe3\x88X\xb0U/z\xc1l\xe9'1\x00\x00\xb1\xa8-`\xc0\xc2\t\xdeб\xbeX\x8b\xa6B:y\x16\x00\x80\x10 `\xab\x98`\x87\xe1\x15\xc6\xdelX\x8c\x02\x00\x94\x01\x01\x03\x00 e\x01\x01\x03\x00 e\x01\x01\x03\x00 e\x01\x01\x03\x00 e\x01\x01\x03\x00 e\x01\x01\x03\x00 e\x01\x01\x03\x00 e\x01\x01\x03\x00 e\x01\x01\x03\x00 e\x01\x01\x03\x00 e\x01\x01\x03\x00 e\x01\x01\x03\x00 eQ[\xc0<]\xcd&\xcb\x00]\xf9k\xc6\xcc\x16\x946\xb3\xa5u<\xed\xe6.O\xe2\x92+¨\xb0\x88N\xda\x03awr\x13\xca#\x9b#$+\xc3\x15k\xedؓ\x91]ڛ=\x1d{\xe4C\xe1.\xcf\xc9\xf8\xa4N\xfd\x85\xd3\x00`u\xa2\xb2\x80M\xf3V\xa7\xdb\xd9F\x174\xf4\xf1\x0f=\x04\xb6X\xb3\xdbds\xd9L\xab0\xfa\xf4\xfc\xa0\xedkt\xd9\x16Z\xc0\f\x0f\xb2\xe5\xa7\xdd6\x92\x1b\x1b\xe7\xac+c\a߲\x1d!g̑\x0f\x85k\xf3'\x97\xac_d~\x02\n\x06\x00\f\x95\x05\xcc\xc5S\x95\xf2\xf1N\xfa\x12\x16\xac@3\rY1м\x12K\x1a&eH&U\xa1(\xdeC\xb1\x02\xe6\xcd\xdcOtηm\x19\x05l\xffV\x1a\xdf֙\xf1E2C\x00X\x1f\xa8,`BTE/\r\xdf!\x110\xa7\x89ޗ>\xd3\xf2\xdd\xf9\xef\xc1\x82\x05\xecT:\x1b;^B\n\x83\xcb\x0fD\xdeV\xb69\xa0\x18\x1e\t\x00\xd6\x1fj\v\x18a\xc6m\xb1\x06d\x02\xd6s\x97m\xee\xaa\x1c\xd5c~˦/r\xb2{\x8fg\x15\xd2\x11\xed\xc1lMξq\x92\xed܈\xd0>\x9c\x83P\x16\x1b8\x86\xa5\xcaS\x9e\x9du\x80\r!\xa5\xb9\xb8\xa9 #\xf7\xffo\xef\xfcc\xe28\xee\xfe\xff\xfdg\x10\xac\x8c\x0eN\x1cB:\xa4\x039\b\x13Y\xc9`|',\x1cS\x041\x17\xd1`\x93\xafj\xe3\x1f(\xa9\x12\xfb,\x13\x9b\xa8NS94D\xc6`\xf2\x03\xc5%ND\x83c\x14\x1axL\x1d\x91\x1fv\xb8\xa8\x8ay\xda\xe2|\x85\x1e\x92HϵV{\xcf#5\x8e\xb1]\xe1m\x1cR\x82}\x86Z\xa3\xef\xce쯙\xe5\x8e=(\x06\xce\xf9\xbc\x12\xf9\xf6n?\xf3\x99\x99ݝ73\xb3\xb3\xfb\xa9\xa1\xba\x9c͂Gʡ\x034\xd9\xe1\xfb\x1c\xabiȣ*\x94\xd2X\xe3q\x14\x8e\b\x9b\xb2\xdcS\x98\x95\x92\xb1\xce-[iv\xb17Q\x8f\xa4k\xf1\xdc҅qu\xaf\x1a\fes\xf6\xact\x00\xf0\x83d\xc9\x05,D'\xeei{\x0f7v\xbd\xd2\xd8\xdaC\xfb^\xedj\xd0\xc3ޥ\x0el\u06dd\x8ej֢\x8czW\x03\x8d\xc1\xed\xefn\xf3%\xf5+\x03ھ@R\x9f܌Z>dF\xbaT\r\xa5{\x9a\x8f?\x88$Y\xf8U\xf6'Uw\x1cʸo\\\x1eKj0=o\x96\xea:\xea\xa4rE\r[\x93QF\xe0@z\x89\xb0\xa9$\xdf\xfcJWc\x06\x9a\xf5\xaa\xe8\r\xa8\x90~\x8c5\x1fRi\xd6g\xdf8.\xb9\xcag\xff\b\x00?D\x96\\\xc0\xe4\xd0\xe8`\x9b:\x89\xdfrv$\xd8vLi\xa1-\xfdlO\u007f\x8bM\xd2E'\xb3\\\x11\xae\x0ey\xb3\xd2w\n\xb7QU\xcde\x11l\xe5\xcd\xf9\xa1,\xfd=κT\xad\xc9V\f\xc6WK\xe2\xaf\x1d\xa8\x99};&\x8f S\u007f;Q'\xfb\x97\xf6,%\xa7҉*ϐ\x85\xcd\xc3\x19T\xba~\xe1\x9c5\xeb7\x1cP\xe3\x1e}9\xac\x12\xe5\x8e\xe6\xf8\xe6\xd4\x159\xd6\x06\x80\xa5g\xe9\x05L\xa6q!\xbb\x94v8H;_\x97\x9a\x15!hg\x01\xb2\xe5\xee\xf6\xb9\x93->\x99\xc7\xe4>\x14\x96kK\x95\xed\xd0\xe1\xc2\xect\xb4\x9a\xfd~i\xb5˧\xdbhR\x15FllW'\t\xbfʥ\xd9cW\x15\xb2\xfc\xf2X\xb2\xd9\x03\xf3粏\x9c\xcd\xca?\x12\xfd\x87\x05\xff\xe66G2ݏ6~8\x1e\xa5{\xa52\x8ctfߚ}T\x0fZ\t\x00?x\x96X\xc0\xc6\xd4.\xc7\xd9F\xa3\xebѣ\xa8\xd6I\xb5E\x1e\xd7\xc3\xdd.\x19\x99\x9dr\xbf$\xcb;\x14\x01\xebweն\xf7ܯ\n\x98\xfc\n\xea\xd5m4\xa9:\x83\x98ʪJd\n\xd8jMg6\x18s`cJ\xe7k\x8d*\u007f\xeb\xf2\x95\u007f\xa4=\xb2>\xf7\xcfm\x86\x1b\x1f\xcaA\xae\xd8\xd1:z:Tz\xac;¥\xc9\xcd\xd1\x12\x00\xc0\x0f\x91\xa5\x15\xb0\xf1\x16u\x9e\xfeæq]\xb5\xba;hdnuRl\xc9GF\x9c\x80\xe5\xe4\xd32\x94\xa8\x026\x9a\xb9\xcb\x1d\xd2l4\xa9\n!:'/['\xf1˳\a\x18!\xe3.d\x1b\n\xc9~u\x96\xdd\xcdz`4\xaa\xb7&`\xc6\xe6\x99\x1d\xca?\xe1c\xa9\x87\xe5y2z\x9fs\x96\xa6\x01\xc0\x0f\x96\xa5\x150\xb9\x95\xce\r)CH\xa5\xaf\xd5\xc1\x06\x8c\xa1\xe6\x0f\xe9:0\xaak\xddK\xbf\x0e\x8c\x13\xb0,:\xb7>\xbe\x9a\t\xd8X~\x9d\\\xb5V+\x8d.U\xf9Y4\x86\xf8*I\xfc\xb5\x13\xb5я]\x01\xba\x0e\xacD\x19\x12\x8e\x17\xb8\xe9\xcc\xd81\xe5\xc7cl\xac\x17U\xc0\x02l\x92L.\xa8\x92-\x8c\xd4ώ\xfd\xcdq6\xd33\xa4\x94\xef.\xae\xf5\a\x80Db\x89\x05l\xa8\xb1+8\x12d\x93\xf8#\x8d\x9dC#g\x9a\xe8\x8a\ny\xa4\xa9{\xb8{\xe9W\xe2\a\x9d\r\xe1c)gå\xf7\x8f(\x92\xf2\xd0\xe1\xc0}(\xa3\xbe\xefRoUƈ<\x9c^\xd3;Ư\xc4\x1ftd\x05\xea\x9cI\xc9\xcdAu%~CO\x0f-\xf0\x0eT\xdav\u070f\xe8\xfd\x87NG~\xf3\xf1\a\x93\xe9\xe0\xb3w\xeeM\xfc\xfa\xb9s\x0f\xfc\xca.\xcd|\xf9\xe8?\xcd\xed~\xf5\xdd\xfc\xff\xf3+\xfc\xf6\xb9\xf7\xf6\xe3\x97\xd4_\u007f[<\x87j\xfe\xe9\\\xd1K\xe6\xb6R\xc8O,\x06_\xbf\x8b?\xba\"_y\xe4\xb1?\xcaq\xb1\xa5h\v\xfb\x14\x9d\xcdY\x86\xb8X\xeb:\xbc9U\xfcc\xce\xde\x1d9+\x86\xb0\x1d\u007f\xd9\xefݭ|\xec\xf6\xee\xffK\f\x8b\xbf\u007f\xc2N\xd6'Wԯ\xd7?\xf9\xd9z9\xc6\xd1Q\xa4\xb9\xf8\xff\xbe\xf5\xce\x16\x8c\xff߬=s\xf0\xf5'E?;\xf7ћ\x8fx?\x8ba\xf0\xd5\xdb\xf8տ\xca\u007fUNd\xec?\x1b\xfc\x99_\bw\xbf\x9a\x94(Q\x9e\x97\x8c%\x16\xb0!\x16͖\xbd\xfd\x9e\vl\xabt\xccږI\xc0\xf2J\xed,l\xc8\v\xc8\x0e&)\xaf\x17\xc9\xf2\xa7\xf4\xb2\xf0\xben\x97f\xbe<\xb6\xcf\xdc\xd6/\x96\x0f\xb0\xd20\xae?\x87\xb5?\xf0ף$3Y\xff\x92\xb9\xad\x16R\xe4\v\xfc\xb5,\xbfT\xf6\xdf\xd6ߣ\xf35\xdeO\xed\x19\xbc\xb3\xb9\xcb`O\b\x1d\x92\xc7g\x0fF\x16\xd2<\x8e<\xa1t&\xff\xc7\xfbđ9l\xc4\xe3\xf0\xd2\xfah\xbf2\xfeg㓊\x00|\xfd\xc8|[6;\xea_W<\x11k\xffg\xf8\x03\xe5ߏp,\x85\x93\xc53\xbf@\xeez5\x17v\x86\x16\x8b%\x160\x99]\x9f\xa1\xc6QQ\xc0\xba\x1b\xbb\x9b\x96G\xc0\xee{\xc8\xce\u0086\xdc\xe6\x11Ć8W\xbe\xd0.\x8b/\xaeإ\x99/[c\t\x98|e\xe3sѓ\x88\xc4#`\x1f\x14}d\xfd9\x06\x1f\xe1?b\xdd6\x8a\xb3\x053\x14=^\xdcB\x9aǑ\xfd\xbbߑ\xdf~b\xff\xa2\b\xd8\x11\xef\x9f\xe9\xc7\xeb8\xe6h0:\xeaQ\u007f\xc9\x1bK\xd8\xe3\x10\xb0\xadK(`\v\xad\xe6\xc2\xce\xd0b\xb1\xd4\x02\xa6pi\xa4\x8d\xbe\b\x9f\x17\xb0Ka=\xb8\xed\x92ҡ\xbd\xa1\xf9>Y>\x9b\x8cP\xddP\xb9;\xb5\xd0\x1a,\xbb\xd9\xc5^\xf2<\x92\xae\x19\xa7\x8b3\xe8\xeb\xea6\xe4*\x89\x93\xd9\x14\x9evY\xfc\xb1\b\xe3\xa3_<]\xe9}\xe2\xef\xf2W\xfb*\x8a\x1e~\x92\x8e͞\xc3Eo\xfd\xf2\x11\xef\x13\u007f\xa2&\xe7\x9ex\xb8\xa8쉇\xaf\xd3_\xdf|\xb6bӓlJ\xe2\xfa\x9b\x8fy\xb7\xbey]\xf0\xf0[m\x1a\xe315\xbfnA\xc0\xe4\xe7ʔ\xb1\x88\x17\x1b\xb3\\\x86_.c\xa5)=\xff\x8c\x9e\x05w\xed^\u007f\xfb\xb1\xe2G~I\xfbR\x8a\x80}\xb1\xf1U\xeb\xaf\xe6\xa6PH\xf9\xa5\n\xb9BWDݙY\x86w\x8c\xa9\x9dw\x04gf\xc9d\xe3\xa0r\x8ce\xa8\x87\xb7F\xd9\x0e?\x94)e\xf9\xf4y\x15\xa3y\xf4\x14f\xa5d\xacs\xb3\xed\x96|\x87\xa7&\xf6\xd4\xf1\x91\xfdo\ue55fx\x93\n\x98y\x1c>S\x0e\xea\x93\xd7+0\xde\xc8\xfe\xc4\x18\xc7\xe1O\xfb+6\xee\xfb\x99\xb5e\x9bE\u007f\xe4\x19\xf6\xc3_^\xbf\u009d!\xeelF?\xb1\xba\x80\xfd\xaa\xe8\n猿4x\x013\xfcr\x1e\xaa6\xf9\v\x00\x00 \x00IDAT,g~\xd61\xfb{Yё\x8a\x8a\x8f\x9e߸\xf3\xeb\xe5\xac&\x9d\x97\x9d\xfdn\xf4\xa5b\xc9\x05,D'\xee\xd5(j]\xaf4\xb6\xf6\\\xd2~_\x0e\x01\v\xf7\xf6x\nzzz\x14\xf1\xb9\xd4\xd6\xea\xf6\xa4gՔϊ$\xbb\x01\x15ҏ\xb1\xe6C*\xcdb4\xda@\xbat\xe6꺂>6\xf7\xac]\x16W\xdey\xe7\xe1G\x8a+~\xb9\xff\x81\xffV\xae\xc2g?z\xe7I:\x8b\xfa\xd9;E\xf8G/\xfdj\xe3^\xc5\xe2\xf7\x0f<\xfd\xee\ao\x95ῳ_\x1f~\xf5Շ\xd9T\xc9\xd3돾wt\xfdӂ\x87\xaf?9\xf7\xc8\xces\xe7\xceѿ\x8bW\xbf\xec\xces\xaa\xcdV\x13\xb0\xb7\xe8`\xee\xd3s缪\xa2\x98~\xb9\x8c\x95\xa6\x84\x1f{\xe7\x9d-\xdal\x8cq\xed>\x83\x9f\u007f\xef\xcd\x1fm\xbdN\x05\xec\xaf[\x8a\xafX\u007f57\x85Bʻ\xf7\xc9\xfbv\xabƦ3\xa3\f_\x9f\xdb\xf8\xd2_忾\xb4\xf1\xdc\u05fc3\xaed\xb2qPy>\xec9\x86\x02==\xa32\xfd\xc3\xe2\xefn\xf3%iW\x84.`\xfdh\xf3+]\x8d\x19\x88\xfe\x85\xf1'Uw\x1cʸ/悸#\xfb\xffT\xfc\xbf\xde?S\x013\x8f\xc3\xf5\u07fd\x84\u007f'\xbf\xfd\xc0ۿg6zѿ\xd8\xf8\xc8ۿ}\x02[[\xb6Q\xf4+\x98\x9b\x130\xce\x10w6\xa3\x9fXM\xc0\xae?\xb6Ep\xc6]\x1a\x9f\xe1\xf7\xae\\\xb9\xf2\x1e\x16\xce<\xe7\x81?\xf3r\xb4c\xf6\xd1F\xfc\xcbݸ\xecղח\xb3\x9a\xf4\x8fO~\xef\xc82-N\\r\x01\x93C\xa3\x83m\xea$~\xcbّ`\xdb1M\x0f\x96C\xc0da\by\x1fZ\x1b\xd6Ƹ<\xc3\x015\xd0ٗ\xc3*\x96\x90f\xf5\xa8Q\x0e;Ԡ\x1e\\\xc7|+\xde\xfd\x95|\xfd+\xa5=\xbf\xa3\xb4\xe3\xeb[\xe8Y\x97\xd7oT\xfez=\xfd#e\xeb\xcd\x1f\xd1S\xff\xe6F\xf6\x87\xbaR1\xfb\xeaa\xe5\xef\xec{\xecO\xf2\a\xf8=\xc1\x037\x90ؠtQ\xb4a\x96&`\xefi\x1d~M\xc08\xbfB\xc6?V\xd4\xe9\xca#\xea\x9fr\xbd\x90\xbf\xc5o\xb3o\xefP\x01\xdb\xffȏ\u07b4\xfe\xcamr\x85\x94\xaf\x17\xbf.\xbf^\xac\x8d\x8b\xf8\xa1\x88V\x06\xf9\x99\xfd\xca?\xfb\x9f\x11\x9d\xf156\x0f\xaa\x801\x84\f\xb7ѳ\x90\xab\xadv\xd3\x05\xecp\x06\x95\xae_8ǩ\xc25\xb3\x1d\xc7f;Q9\xb2_\xde\xf2\xdcc2\x150\xfe8\\\u007f\xfa\xb1\xbfT\xe87&\xf5\xa2\xef|\x84\x19XZ\xb6Y\xf4/\xf0\u007f\x18~\xf93d\x9e\xcdX'\xf6\xa5+_\xffq/M\xc1\x1fI\xf3\xc4~\xa6\xf5\xb0>\x13\xfc\n\a\x8a\x1fBF9f\x15O+)\u007f+?\xfd\xecrVS\xe1\x84r]\x1a\xa1엖\xa5\x170\x99ƅ\xec\x92\xe5\xf1A\xda\xf9\xbaԬ\x8d\x0fV\x80\x80Is-\xaf\x1aF:\x82U\x1br\xd6\xc8\r\x99ڸ\x93\x13\xb0\xf5\xfa\x8c\xf8_\xde|\xa2r#f\xb7\xed\xd8_X6\v\xf1\xdf\x15\x95Ͽ\xf5\xfb\xeb\xacӳ\x9eMԼ\x89\xffG~F\xbd\xb9\xb7\xe5g\xa2\a\xf32\x1e\xe9l\xcc\x11{`o+\xc9(\x9ax\xf0~\xf9\x8c\x8f\xd2\u007f\xdfTm\xf5B\uebfc\xf2w\x85\x8ag\xa8\x80y?{\xab\xec+˯\xdc&WH\xf9\x8f\xf8\x93+\x9f`\xed\x86e4\x01\xfb\xc8\xfb\xb5\xfc\xb5\xf7#\xd1\x19_\xb2\x18\x98s`\xa1Å\xd9\xe9H\x8b\x92\xae\v\xd8H\xa6\xfb\xd1\xc6\x0f\xc7\xe9\x1f\xbc\xd2챫\nY\xfe\xa8~d&`\xbf¿b\x02\xc6\x1f\a\xf9\xcaֲ'\xf5))\xad\xe8_\xa9\xab\x18\x8eZZ\xb6Y\xf4+Efׄ?C\xe6ٌub\xd9:\x8a\xff\x90\xc5#i\x9e\xd8\xcf\xf0\xaf>\xfd\xf4\xd3\xd7\xe9\x89\xe4\xfc\n\a\xcaf\x0e\xac\xe2\x1d\xa5\xbc_\xd3\xda.c5\x95?8\x19\xee\x86\xe5Z\x9b\xb8\xc4\x026\xa6v4\xcf6\x1a\x1dΞv\xf5s\x05\b\xd8\xdc\xc1\xcaz:T\x84\xc0\xd8_:j\xbaW\rg\a\xb4\xaf\x9c\x80=\xa6\xff\xf4\xa3\x87\x8f\xbc{n\xb7\xaa#\xb4\x85\xab\xd7\xc2Wo\xed{\x04\x97\xfdʜ*9\x87\xffS\xde\xf9$K\xf2\xc4c\x82\a\xf12\xeeA\xea\x81\xd2\x04\xec\xc8F\xf5g]\xfbC9\xc8EWݭ\xd6\xfe\x96\xc4|\"Ai\xd2\u007f9\xf2W&`\xfcq\x90\xe5w\xcd\xf2jE\xff\x14\x9f\xa3\x1f\xd6\xd9m\xae\xe8\xda\xe4\xd0\x15\xa5W\u009f!\xeel\xc68\xb1\xcf~\xfa\xe9\x17\xd7-θ\x13\xcb́\xf1~\xf9\x03e'`\xefɟ\x16\xb1\xda.c5\xe9\x19꒗\x8b\xa5\x15\xb0\xf1\x16u\xb6\xefæq\xf9\xa4z\xb5vk\x17\xedr\n\x98\x1aR\xf7\xbe\x12\x1b\xdb(\x1cG\xc3r\x89;]\x1fwr\x02\xa6_y\x8f\n\x15\x1fȟ\xaeWk\xbb|\xd5\xfcA݅l\xed\xa4\xff\x8e\xb5\x9d\x94\xe5\x0e\xd6\xf5\n5\u007f\xa8\xeeY&\x01+(P\xbaQ\xa8\x8dn\xc6XQ1R\x1fe\xbaF\xa7\x1d\r\xc9\x1f\xa2Ry\xdc͌\xa2\b\xd8\xc3t\xe3\xfaV\x8b\x80\xbd\xa4\xces\xed\xa4\x8b ֗)\x97\xdeו;\xe9\xd4\x03\x9d$yG\x9b\x033\x05l\xa7\xb2\xef\xaf\xda}FQ\xc0\x8e\xe8C9M<8\xbfB\xc6\x15t\x0el\xcbNf\xa3\x17\xf2\x03\xd5\xe3\x91W5\x01\xbb\xbe\xf3g\xe2\xaf\xdc&WH\xb9\xe2\x97\xca?\xbf\xac\x90\x05g\x14C\xc0~\xe7\xfd\xb3\xf7w\x96,\xf8\x1a\xc78\xa8\x86\x80e\xd1?%\xe3\xab-\x02\x16P\x9fA(\xa8\x92\xe5N\xf5\x8c\xedR{\xbeÁY\xab\x919\x01\xe3\x8fÕ\xc7^\x92\x9f\xdbm\x99\xbe{\xecae\\\xfc_^K\xcb\xe6\x8a\xfe?\x1b\xf7\xd2\x1bs;+\xc53\x14\xb5e\v'\xd6\x100\xfeHF\x150ίp\xa0\xf83\x1f\xe5\x98q\x02\xb6|\xd5\xfcA\t\xd8PcWp$\xc8&\xf1G\x1a;\x87F\xce4\xd1\x15\x15\xf2\xa5\xd1\xd1\xe6\xeeQ\xcb\xf4\xf8\x92\xb0G:p|\xadcD\xbe\xda\xc7nHFiV>\xb4n\xf6\x8f:_:J\xdb\xdd\x1e\xa9:\x90B;\x03\xbf\u007f\x13\xbfN\xef\xfa\xfd\xfdw\xec\xf6\x11[t\xf0\x12\xde\xf7\xe6\xab[\x95\xde\xf6'\u007f>W\xf4\xb3O\xae\xff\xfegE\xe7\xfe\xac\xfcZ\xfc\xd2o\xdf}\x86-\xa7\xa2\xb7\b\xdfzd#\x9d\x8cߏ\x8f\xfc\xf6\b\xde/z\xa0\xd7\xcc\xeb\xef\xee.V\xff\x0e\x9fA\xbd\xf4C]\x89\xff4[\x89\u007f\xe5\x93s\xe7\xbc?;w\xee+\x99\xf7kfL\xb3x\xe2w\x1f=F\xb3\xf8o\xedq\x01\xea\xec\xc8\x03\xfb\xdf\xfd\x8fg\x94kU]\x89/\xbf\xfb\xc0{W\xb8_\x85M\xa3\x90W\xde\xc3G\xbe\x96\xbf>\x82\x15[\xce\x19W\x06\xa5\x11Tu%~CO\xcf\b\xfd5mOG\xbb\x9fݲ߁Jێ\xfbQ\x8b\xe6,\xcdr\xeb\xe5\u007f\xf7\xef\xa6k\x9a\xfe\xbc{\xff\xffr\xc7\xe1\xca'\xcf\xfd\xe8O\xf2\x17\x1b\x9f\xff䊾D\xfdwJ\x85?\xf3V\xbczt\x13.z\xfb\xb3\xe8G\x87\xf6Mw\xbe\xfd\xdb'\x8ah\x937\xce\x10w6\xa3\x9fX\xba\x12\xff\xbf\xf4\x02\x19θ\x13+\xac\xc47\xfc\x8a\a\x8a?\xf3\xb3\x8f\xd9g\x9b^\xff\xfa\x9d\xa2Ͼ\u07bf\xfbO\xcbVMJ\xdf\x0fG\xc0\xe4ѓmM\xed}\xec\xce\xe3\x97]\xad\xcd\x1d\x83\xf4\x82\x95ϰ\xc7\"\x1b\x97\xe1\x91бjgj\x81\xd2\xf9;\x9b\xc4&U\xa2hUs\x86u\xc9\x12\xcf\xc9쌪p\x97ǩ\x8ck䯋\xb1\xfa8\xa1\xf6\x04\xda\x13\xd4\xe0\xfa돬\xff\xd1\xfe\xb7\x1f)\xda\xf9\x9c\xf2S\xd1\xff\xa36\xcf\xc9o\xef|\xf5ᢊ\x9d\xec\xfc\xaf\xff\xe53\x1b+\x9ef\x8b\b\xaf\xbf\xb9Ż\x85\xad\x03\xe3<(\xea\xf0\xfc&\xefN\xedq\xb6/\x93\x1f:\xfb\xe5\xb8\xfa,$\xaed\x13\xb3\xbf\xd7\xe61\x94/\x9c_3cY\xde\xf2\xea\xbeb5\x8b\xa75[\xd6\v\xf8`w\xd9Ɲ\xef\xd1?\xb8\xeci\xb9\x9d\xf8\x81O\xb8_\x85M\xa3\x90\x1f<@\x17x\xbd\x8b\xf1\x03\x1f\xf0θ2(\xbc\xbe^\x9f\x106<\xf05\x8evPǜ\xec\x04\xb0\xf5t\xe3\r\x1e)\xa3\xb49[*`\xcfBRJ\x95>zA +%\xb3@\x9d\x84\xe8\xbc?ùF\xbb\xf7۔\x86,\xdd\xf7\x970\xa6\x13:\xcf\xd1\x15i\xe6q\xf8@)\xdf\xf3\xf2\xf3J\xd1?2\xcaK\x8f\xea\x17On\xaa<\xf2v\x91rZ\xa2\x1e\x1d\x99>$\xe8-{\x92-P7\xce\x10w6\xa3\x9fXzP\xb7\x18%ҝq'V}\x16\xf2%\xf5\xa0\x19~\xc5\x03ş\xf9Y\xc7\xecz\x99r*\x8aq\xf1;\x18\xef]\xb6j\xcac\xa3\x03\xa5Ҩ\xbc\\,\xb5\x80\x01\xb3\x10\x96\xc9\xdbsE\xf49\xb0h\xceµ\xd9J9\x83\xcc\x17\x97\x80/\xab\x98\x8b%K\xae\x9e\xaa\x80\xe5\xa2Z\x02\x00\xc0rb'`{\xd0}\xe6\x97q\x84\xfai\xc3.M\x93\n\v\x92P\x15\xfdm\xc0\x81\xa4\xd5n\x84\x02\x84\nضU\b9\"\xa4\x1a\xa1\xcc\xd5.\xe5\x9f\tr\xbc\x14\xa1\x92\xd21MY:RP\xda}\xca\x0e\xda\xf4[QM&Jw\"\x94\xa3\b͗\xe9ș\xe7A\xe8A.\xef\x98\xc6*\xba\xe7V\x94\xebB.eWnD\x13\xb0h\xcezSQZ\x9e⬇\x88\t\xf8\xb2\x8a\xb9\x88Y\xf2\xf5\x04\x01\x03\x80\x95\x81\x9d\x80\xad\x13F\x8dY\xa8\x996l\xe4Q:Y#Nt\\闤\xa3\xda[\x84\f:Q\x17\x15\xb0$Ow\xff+\xa4\x1f\xa5~\xa8X\x0f\xa6\xa1\xc3\xc6@\x8f)\xcbH\x12\n(j\xd0)\xa1\x16Տ\xd2!\xea\x91P;!\x1bPݴ\xb2?\x1d\xf5\x1a\x99\xc56\xd60\x86\x90({H\xe9H\xa5\xd0\xf2\xb0l\xa28\xbb\x9a\x86\xea\"d\xe6\x00Z5!&\x10\xca*\xe4\"|\x11\xea\xa9\nXG\xe3 \x01\x00`9\xb1\x13\xb0<\xb4\xc7\xfa\xad\x95\x8e\xdb\x14N 7\x1d\xc7\xf9\x88\xfa\xc5C\x05\f\x85\xe8\x97\x1dZ\xa2\x1dT\xfdx\x01+\xd1&\x8f\xdaPF\x84\xfaa\xd6U\xb4+\xe7V}6\x95\xf7\x19\x99\xc56\xd60\x05L\xdbU\xade\x13\xc5\xd9\x1e\xb4\x8e}\x16\xa061\x81PV!\x17\xe1\x8bPO\x98\x03\x03\x80\x95\x81\x9d\x80\xadF\xf5ܷ|\xb4\x8b6\xec5\xecKDR\x1ax\x16\xeaV\xbf$\xa1\xb0\"`n\xd5.\xa2\x8e\xf3\xeaiC\xe7\x04,\x92\x8a\x86\xd4\xfdi(\xa8\xf8\xc9a_\x9aP)!\x85(?8Mx\xe60\xd6-t\x01\xcb\xd5v=\xa4\t\xd8lg$\a\x9dd\x9fcW-\t\x84\xb2\n\xb9\b_\x84z\x82\x80\x01\xc0\xca\xc0N\xc06\b\x13=٨\x816\xec]\xea\xb7\\\xd47\x85Pn>#\x05\xf5+\x02\xb6N3\x8c\x04\xdb\x03\xa5n\x846\v\x02\x16FH\x9b\xc1Z\xa3\x8c\xdeZ\xb5N\rӜ\xa0\x84Pz\xe9qn\x99\xc6\x1c\xc6z&\xba\x80\xa9\xbb\x8e\xd3\xcf\x18Έ\xa4\xf6\xa6\x18B\x02\xa1\xacB.\xfc\x17\xb1\x9e `\x00\xb02\xb0\x13\xb0:\x94o~\x99DtV\xa9U\xef\x94\xe5\xa3\x13\xe3ȤK\x110\xad{\xd4\xe4\xa2?\xac^c\x11\xb0Q\x94\xacy\xf2\xa1f\xa2\xaffP5)\xb4١$I\xae\xbe\xa5g6\x97\xb1\x8ae\x19\x85)`\xb3\x9d\xddBh\xccH'$\x10\xca*\xe4\xc2\u007f\x11\xeb\t\x02\x06\x00+\x03;\x01\x1bBIf\xcb?\x8eR&iîS\xbf\xe6\xa03\x8a\xa4\x85Mc]\xc0\x0e \xf4h\xc7\xf0\x14i\x88\xd9\x03\xcbg\x9d*Q\x93\"\x83\x81\\dJ\xc3\xdc\xc6,AL\x01\x9b\xe5\x8c \xa1\a\xc6%\x10\xca\x1aS\xc0\xc4z\x82\x80\x01\xc0\xca\xc0N\xc0\x88\xc7l\xacS\xd9l\xbbU\x1b(\xdeJQz5\x19\xf4\xae\x1ce0<\xad\v\xd8t\x1ajc\xbfm\xb3\b\xd8\xf4*qZ\x8bS\x8bp\x90m\xb7\xa0d}\xf2j\x0ec\x8d\x98\x026ۙR\r\xf5\x11\xa3\x93\x85MB\x02\xb1\xac1\x05L\xac'\b\x18\x00\xac\fl\x05l\x10\xa1\x03\xea\xd6-\x1fJ\xbdDh\xc3Na\x9d\xb2ct\x89X\x15ʛ\xa1_\xfa\x904\xa1\v\x98\xacuw\xa62\xe9\xf7hw!\xdbQzD\x10\b%\x89L\xb7C(\xc9X\xe7\x15\xd3X'\x96\x80EsV\x8bJاO\xa9\r\x9f@,kl\x01\x13\xea\t\x02\x06\x00+\x03[\x01\xa3c\xac\a\xfb'\xc9\xf8\xf1l\x94\xd4M\u007fhE\xe8>E\xc1\xfaR\xe9\xaa\u0590\x84\xaa\xa7\x94\x91\xa6\x13m3\x86\x90\xd3\xe9l\xe6\u007f\xbc\x10\xb1I\xa6\x14\xd4ukZ\x95\x81\x91dT\xafhJw*j\xb2\bă\xa8P\x11\x9d\xa9R\xe36\xc0\\\xc6:\xaa\xe7\xd9=\xb0(\xce©\xa8~\x9a\xcc\x1cB\x8eq\xb1\a&\x945\xb6\x80\t\xf5\x84u`\x00\xb02\xb0\x170ҡ\xbfN'\x93=G\xa34\xec\xecU\xc9\xf7ek=\xb3n\t\xad\xcaS\xbe\xdc\x1f1\xe7\xc0\x9a\x10r\xfb\xf2\x92\x9c\x01\xb6^!OI:\xa0)OG2J\xcf\xcbDT\x05D\x81\xb8\xe4DR\xce\xeaT\xe4⦚b\x1a먞g\vX4g=\x12r\xe69QJ\x8f\xa5\xcb&\x945\xb6\x80\t\xf5\x84\x95\xf8\x00\xb02\x88C\xc0\x88| ?=)c]\x9bvOOiأ\xbe4\xa7\xef\xac\xfa5\\\xe3\x96R\xf3\x9a\xe8`\u0378\v\xd9\u007f\u007f\x86\x94\xb3\xe7\xdb)\x89\xde\xfb\v\x15\xacJ?\xa1+Ϩ?S\xca,\x19\xd0\xfc0cu\xcf\xd86\x8f\xb4JI\xc3g\x1c\xd3XC\xf5\x1ce\x12?\x9a\xb3PUfrF\xf9(\xb1\b\x98P\xd69\x04\x8c\xaf'\b\x18\x00\xac\f\xe2\x110\vz\xc3\x06\x00\x00X^@\xc0\x00\x00HX@\xc0\x00\x00HX@\xc0\x00\x00HX@\xc0\x00\x00HX\x16 `\x00\x00\x00+\x03\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x96E\x13\xb07\xf0\x8b\xd1w\xc0MK\x00\x00\xee\x12 `\x00\x00$, `\x00\x00$, `\x00\x00$, `\x00\x00$,v\x02v\x1a\xff\xfa\xbb\xe7ʼ[?&wNoY_\xf1\xe2M\xf6\xeb\x1f\x0eV\x14y\xb7\xbc\xfcO\xf6\xe5\U000fd6ca\x9f\xba\xa8\t؍\x17+\x8b6\xed\xbd\xc0yP\x04,\\\xeet\xe4w\x10\xfa\x96z5\"#9`\x04\xfc\xeeI\xd6^\x97\x98\xdcM옏\xed\x029\x84Rh8\xef>\a:\x14ݠ\x9f\x15 \xe3!\xee]\x89\"\x1d\xca\xeeC\x8a\x1fD\xe3~\xdb1\x92\xc4\xdc%\x8d\xa8_\xc7R\xd8\x01\xaaV~rD\xc9 \xe4K\xcb\xf4\x0ff\n\xaf9\x03\x80\x1f2\xf6\x02\xf6\xe2&\\\xb6\x1e㏟\xc5\xde2\x8cw\xd3\x1f_ĸbk\x85\xf2\x0f\x95\xb3S\xf4KQ\xd1n&`\x17\x8a\xb1wk%Ư\x99\x1eZQ\xae\x13\xe5z\x10*'d\"E\v\x0e\xe4AAmw#\n\x06\xdbPK0\x88\x1aI,Ύ\xc4o\xbb@\xf4,&\xfc\x0e\xfa\x96C\x9f\xc3?\x11\xdd0\x12L\xa9\x0e\x0e\x1e\xf38\xcc(G\"S\x1d\xe8\xf0\x04\x99hB\x1dS1,\xcc\xdc\xc8\xf4\x10\xabА\x1e|d\xa8ZR\xfe\x1d\xa7\xd5\x1c\x9a\x95j m\xcd\xf1\xce\x12\x00\xfc\xb0\xb1\x170\xbc\xe52\xb9}\x10{\xbd\xa7\uf40f1\xbe\xa8\xa8\x14\xf6~\xae\xec\xfa\xbc\x18\x9f\"\xe4\"~@\xd9\xf1\xfdS\x98\n؍b|\xf4\xb6\xb2g\x13\xfe\xd8\xf0ЊP\xb6\xd2\xd8\a\x1c4\xfcO\t\n\xd0\xdfF\xf4\x10\xdeJ\xa7Li\xb1ô\xb5\xa6\xb6\xcc\xce]c\x8d?~\xdb\x05\xa2gA\x02%\x8e)2\xe9(\t\xc44\x95\x1a\x94\u007f\xa6\xdcܛaEB\x88\xbeC\xf6,\x8a\xa5p\x84ˍh\x152h\x90\xa2\xfdʘL/\x8d\x10r\xcb\x03\x02\x06\x00:q\b\xd8e\xe5\xe32\xc6oЯ;\xf1iB\x8e>\xf02\xdbw\x14\xbf@\xc8A|\x94n\xdf,\xa3\x02v\x14\xefe{\xde\xc7?6<\xb4jq\u007f\x8e\xa1le\x10\xa8*\xd7.d\xe8C$\xac\xb5ְ\x11Ah\x16\xf9\x9b\xe3\xb7] z\x16$\xe0\xf7u\x91\x13>\xbf\x8d\x80\x91\x86ԙ\x18\xfb\xe3\x100#72\x0f\x01\v\xa4\xb2\xb1c3\b\x18\x00\xe8\xd8\vX%\xfd\xb8\x8d\xf1\xdf\xe8\xe7A\xda\xe9\"\xb7o\xb3}o\xe0gɝ\x8d\xb4OF\xa8v)\x02\xf6\xb0\xd6\xf3R̯\xe9\x1eZ\xd1Z\xf69\x95\xa4\xb4\xbc\x88\x936\xcc\x19\x97\xd8\b\xcd\xd6z\xa2 -\xe7q\xf6\xee\xfd\xa0ϝ\xe2*Q4\xafW\x9b\xf7\xca\x17lG\x93\x11\xaa\x0fWe;6L\x93\xa9\xcdY\x92\xbb\x94\xbe\xed\xbe\x16\xa5\xb4\xd7\xe58|ょZ\x94\xdcZ\xe3\xce(U\xf3l\xcbw䵉\x1e\xf8,\x02\xfe\xb6rR\xf2\n\x150\xd3oH\xb1-%n\x84\x9c\x11]\xc0\x1a\x93#\\y\xf9\xe2\b\x02\xa6\xe7f[!B\xe4\xaa,gy\xf5,\x013\x0e\x89\xa7\x86}\x9fh\x8ep~\xb9\x1aG\xaf<\x00\xdc\xcb\xd8\v\xd8S\xf4\xe3_\x18\u007fO?\x9fe\x02Fn\u007f~\xfa\xb5\x83\x95X\x11\xb0\xef1\xbe\xad\x19\xbeHn*\xe3\xcd\xed\x8c\"l\xcc\xe3\x1b\x81\xbc\xb3i\x18\xb6mh\x872\x9cDyB&Fk\xadI\xda\xd1\xd7\xeaʟ\xa1\x83\xccG\xbb\a\xda]h\x9a\xdc\n\x06s\x1e\f\x06\x83a\xc16r\xb23;'\xdd]W\x85\xae\x92>T3x\xb24iX\x11\x9a\xced\xe4jhN/'\xbc\a\xfak\xf6\xe1\x9fg\xb3i\xabj\xa9\xbe\xaf^\xaa\x12<\xf0Y\x04\xfc\xe3i\x93\xabd*`\xa6ߙ\xa1\x86\xa4!ҁNP5S\x05,?\x8f//_\x9c\x10\xea\x8bD\"\xfdH\xc8ͶB$\xec\xcc\xe9\xe8\xf5!\xab\x80\x99Y$q\xe3f\xc3/W\xe3\xe8\x95\a\x80{\x19{\x01\xdbG?\x14\x01c\xb7\x1c\x99\x80\xdd9U\x861~`\xebNE\xc0\xaea\xac\x1a\x9eW\x04\xec;lbL\x82\xb5\xa2zuc5\xea&d\b\xb9f\x88\x1f\x89sXzk\xedC\x1d\xec[\xa7\xd2\xc3pѶ\xd7\xe6d\xbfG\x1fq\xe5#ߔ\xd2MR\xa4\xa8\x8bN\x97籈H\x92S\xe9\x80T\xb9\x88\xe8A\xcaV,&\xdd\x05\x84\x9caݣ\x01\xaa\xa5\x9c\aa\bI\xf2\xb6\xad!T\xc0x\xbf\xa4\xba`\xc2}\x98mI\xf5\x91[\xa3\xe5\xe8C\xa1\xbc\x9c\xb3\x90\xd6\xc3\n\t\xb9\xd9Vh\xadG\xe9f\xcd\xe4Y\x04\xcc\xccb\f\xf5\x1ai\xf8Z\x985\x8eQy\x00\xb8wY\x88\x80\xbd\x81\x1fx\xe1\xf4śl\b\xa9t\xbaԕ\x15\xef\xab=0c\xe4hЊ\x1eW7ܴ\xcd\x13\x0f:\x1bq$\x8b+\x01\xf4\xd6\xea\xf7LS\xdcՄ\x8cgyj\x8f\x8f\x12\xb5\a\x11C\xc0\xa4\xab\xda\xd6D\xdb\x06\x8fS\xed\xd5Ity\x06\x9bH\xe2=HlF\xab\rM\x92\x9a\xd5,\xc5\xeajу `M\xa8\x91\t\x18\xef\x97D\xf22\x1fR-$\xaaN.\xaa&\\y9g!\xd4<<<\xdcB\x05\x8c\xcbͮB\x93ꪋz\x8b\x80\x99YL'\x9b\xaa\xcf\xd7¬q\x8c\xca\x03\xc0\xbd\xcb\x02\x04\xecv1\x9d\xc9't5ų\xe4\xce&\xfc9\xfb\xf2\x1a\x9d\x03+\xd3;^\x9f\xff\xe3_\xba\x87V-\x92\xe3$Btv\xa6\x01\xd5\xf6\xf3\xb1\x1d)zk\xcd\xd3\xfa.\xb4\xcf3پ9\x17e\xaa\xcb%b\bX\xbe\xfeS\xa6{OOp\x9d*`t|\xa76g\u0383:\xea\x1bD#d\xad\xaaB%\x05\x82\aQ\xc0&\xf6L0\x01\xe3\xfd\x12ҭ\xaf\xfc\x90j\x86\x87\xd5\xe1\x1f_^\xd3\x197\a\xc6\xe7fS\xa1\x11սu\x12\x9f\xcbB\x9b\x03\x9b\x1e\x10\xfdr5\x8e^y\x00\xb8wY\x80\x80\xfdS\xbd1InV\xe0\x83\x84\xbc\xa0\xa8\x98\xc2\xedJ*`\xcf\xe1\xedw\xe8\xb7?`\xef\xf7\xba\x87V\xb4\x8aM+\xff\x02\xb1n\xc3\x18rע\x93b&zk\xad\xf2\x8c0&\x94\xf6L{@S\x9d\x0e6\x01\xce\xda{\xc7U\xc1V\xf9\xb5\\\xdb\xc8-\xa0\xd3\xda\xe5\x16\x01\xe3=Hl\x1a\xae\x1dM\x91j\x0fK\xe2\xa9\x16\x97E\xc0\xc1\xfa\xad]hB\xa8ET\x01\x13r\x03\x80{\x96\x05\bؿ6⣊Lѥ_{\t\xb9\xb6\x1e\xff\xfa\x0e\xb9y\x90\xad\x03\xbb\xec\xc5/(#ʋ\x9b\xb8\xe7\x8aZ\x11\xcaS\x14줤\xcd\xe1\u070f\x1c\xe9\x96U\x10zk\x1d@]\xf4\xa3\xfe0\xed\xa8\x9d\xa1\x9b\x85\xdbؿ\x85\x84|\xab\xee\xe3\x05L\xefƸ\xa9t\xcc\xe4Y\x04\x8c\xf7 eN\xd1\x15T\x85tN\x89NXu\xa2>\xc1\x03\x97\x05'`\xbc\xdf\xe9\x82z\xb2\xcd7cd\xc1\xe0\xca\xcb9\xe3\x04\x8c\xcbͶB\x05nE\x1fë,\x02\xc6e1\x99^\xae\f\tg\n=b-\xa2\n\x98\x90\x1b\x00ܳ,@\xc0\xc8\xdb\x18W>\xf5\x13\xbc\xf1e\xbcU\xf9\xe9\xe3\"\\\xf6\x13/\xde\xc74\xeb\xfcz\xec\xdd^\x89\xf1\xeeۆ\x87V\xe4KM\xb9ύ\xf4\xb9\xfc\xe3\xc8x\x8cHc\xa4\r\xb5\x8c\xb0\xad\x00\xf2\x9f\xec\xadF'h\vL?\xd0\xd7S\x8d\x06\xe9\xcf\rRs\x8f/m\x9c\xb7\x9d\x1eb\xb7\xf2\xc6\xd8n\xb4\xb9\xedp>r5\r\xc9\xc1\x94\xea!2R\x9d\x12\x94\x05\x0f\x12\xca\xef:\x9e\xe3\xa4\x03\xbf\xaa\xa4@_ \xa9J\xf4`f1\xe9_\xf7\x8d\xf2\xf5\x9bu\xfeI\xceo$X\xeb\x1a'\x97\x9c\xbb\x82\x11\xba\x12\xdfX\x03b\x94\x97s&\xac\xc47r\x8bQ!n%~\xc8\xe1>T\x9f\x91\x94\xdc\x11RW\xe2\xb7\x04\x83W\x85CB\xce8\xee\xef\xe8\xf5%\a\xf9Zp5\x8eUy\x00\xb8wY\x88\x80\x91\v\xbb˼[^\xfe\xfef\xd1\x037\x94o\u007f;X\xe6\xdd~\xe1c\xb5\xd3u\xed\x85\xca\"\xef\xf6S\xa6~)\x02\x16\x18\xf5\xa59\xd6\xf6kߧ$\xe31\"\x95[\xe9\b\xa1T\xf5\xb9\x9b\x81u\x19Nfy\xa2\xf0\x90;%\xb3Pm\x80\x91\x1d\x19\x8e\a\x87\x05\xdbQ\xf5!\xc2\x12\xfa\xe3LK\x8e\xe4\xf2wx\xa4\xc2Z委P\x9a\xf2o\xad\xe0Az\xbcڙU%3g\xc7\xf2\xb4u`\x9c\a3\x8b\x06\x84\xe8T\xd36\xfa<\xa3\xe9w@1\xac#;\x94\u007f\xcf\xd2g!W\x1be\xd7\xcb\xcb9S\x9f\x85T\xfc\xb0Yy=\xb7\x18\x15\x1a垅\f\x97fd\xef\xe9HV\x8a^\xadM|\xf9\xf9,\b}\x16ґY\x1a\x12j\xc1\xd58V\xe5\x01\xe0\xde\xc5N\xc0\x16\x9fK\xe6cDK\x869\xea\x03\x00\xe0\x1eb\xe9\x05\xac\x1e\x1d\xb03Yt@\xc0\x00\xe0\x9ed\x89\x05,4ֵJ\x92\xed\xac\x16\x1d\x100\x00\xb8'Yb\x01+G\b-\xb9\x98\xa8\xb3\xdb\x00\x00\xdcs,\xb1\x805\xa5\xba\x96~\x00\xc9f\xb7\xc7\xec\xac\x00\x00H8\x96X\xc0\x00\x00\x00\x16\x0f\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x96\xc5\x12\xb0\x1b\xc2\xc3C\x0f\xc56\x04\x00\x00X,\x16G\xc0\xee\x9c\xf2\xde4\xbf\x81\x80\x01\x00\xb0$,\x8e\x80\xdd\xd6\xdf\xcb\xca\x00\x01\x03\x00`I\x00\x01\x03\x00 aI\f\x01\xeb-\x88\x11';~\xb6\xd5\xd8Y\x00VV\xca1\x9b\xbcߌgr\x17X)\xd5\x04\x16\x80\xad\x80]{\xe1ᢍ;\u007f\xa3\xce\xd1\xdfx\xb1\xb2h\xd3^\x161\xed4~\xe3\xfb\x17+\x8a*_\xfe\x9eƄ\xa4\\֓(\x02\x16.w:\xf2i<\x9d\x16\x94\xab\xfex@x\x8d\xe1\xe4\xb6LGI\xacȰ\xb3h\xfc\xf7\x9f\x9f\f\xa3\x00\xa9EI]vvQ\xa0/\xf8B\xae\r#vv\xf3\xa5\x06\xa1fB\x03\xd5\"k\x03\x1ap\xdd\xd5\x06\x1b/+\xe7\x985%\x1d\x8e\xfa\xfb\xa2\x1c\xa8\u007f\xa3\x9a\v\xa4'Y{\xe1[r\xb7\x9d\xe9\xbcl\x17\xc8!\x94B\x0fc\x9f\x03\x1d\x8an\xd0\xcf\n\x90\xf1P̈\xca\xea;\xf0\x0e!\xf5\x1dx6\x8cp\xef\xc0S\x18Ka\x12A߁爒Aȗ\x96\xe9\x1f\xcc\x14\xa3\x00q\xd8\t\xd8\xe5b\xbci\xfb\x8f1\xfe)}\xd7\xfd\x85b\xec\xddZ\x89\xf1k\x84Ł\xac\xc0ś0\xder\x9b\x9c>\x88\xf1\xbe\x837\xf44\xad(\u05c9r=\b\x95\x132\x91\xa2E\xa8\xf6\b\xaf1\xf4e\xbeR\x9d:I\xe2\xe3XR\x87\x9d\xc9lΊ\x8d\xa7jշ\xf4\xa1nN\b9\x83\xb3s64\xfa\x8a\xd5\xc1\x8e\x82E\u007f\xbb\xe9xz\x13=\x02\x93M\xe9\xe3\x96=}i\xdd\xda\xd6\xdc%[lV\xd81\xe3\xb2\xe8Kn\x8dfa\x1e\xa8\xf9\xb0x\xd5\\\xa0A#\xd2^\xb9\x8bbG]ѓ\xc5c\xbb@\xf4,&\xfc\x0e\x9f\xf2\xe1s\xf8c\x8cs\xe8[\x88\x83\x83\xc7<\x8eP\xf4\xfd\xe2[\x88c`\x1c\a\xee-Č!\x16\a\x82\xbd\x85x\xf6+\x17\x06\xd2\xd6\x1c\xef\xccC\xb1\xa3\xd1\xdb\t\xd8>\xfc\xb2\xd2\xf9\xba\xb8\x11\x9fW\xfa_\xc5\xf8\xa8\xf2\xe5\xf3M4\xf6\xd0i\x8c\u007f\xfc9!\xe7\x8bh\x88\"\xeb\x10\x12e+U\x1dp\xd08\x15%\x88Ɨ #\xc2k\f'Q\xab\x16\x8f1\x0e.\xa9A\xd1\xe6\xc9\x1a?\xff-\xacF\xd7\xe5_\xab\xc3\x19\x88\xb6\xb3P_r\xbf6gN\xa3\x05\x90\xa7\xea\xf2q1ʯ\x80M\xc9\xe6\xc9D\xe1\xdc#\xf1\x15v\xcc\xf8,\xea%\xab\xca/\x9cE\xac\xe6\xc2\fZ$-\xe8A\xaa\x18\x1f\x95GO\x16\x8f\xed\x021J\x16(qL\x91IGI\xecvƎΔ\xdb\x12M\xccD\x88F\x1f\x1d\xfe8\f\vRe\x8d\xc4\xc51\x99^\x1a\xa1\xd1,\x16.`\x95\xea\xc8\xf0\xed\x83\u007f\xa0#Ž\xec\xb7\xf7\U0004f640\xb1=\xcf\xe1\xe7\xa2\b\x18\xab\xc81\x94\xadt\x81U\xe5څ\xf8\xa3\x13F\xf3\xe8\xfaWgݲ3\x89\x02\x1f\xb9\x8c\x06\xfba/!\xe3\xafR\xce@\xb4\x9d\x85zv\x8e\xa1\x85\x14c.\xca\xd5(\x01\xf5fl\xa4Yؔl\x9e|9\xd7\x05FV\xdc1㳸\x95e\t\xa4\xf0o\xb0\x88\xd5\\\x98A$\xac\xb5ְ%\xba\r\x87\x9e,\x1e\xdb\x05\u0085\x12\xf4u\x91\x13>\xbf\x8d\x80\x91\x86\xd4X\xb3>q\bX\xf4؈\x949\x04,\x90\xcaƎ\xcd\v\x17\xb0\x9f❟\xeb!\x1e\x1f֢>ަ\xf1kO\xe3-\xec\xcb)\xfa\xd2|\xab\x80\xade\x9fSIJ\xbe\x11'-\u058c\xcb,\xc2t\x86:\xa8\xaf\xa3/\xbaI:A\xc6$:\b\xaeE)\xedu9\x0e\x9f\xfa\x876\\\xeeJ\xc9\xdc\xc0\xae\xac\xe9\xf4=\xec\xa7\x03J\x92N҉\x8c\xe8 \f1ى\x82\xb4\x9cǕ6ӫ\xcd\x1b\xe4kVcɻا\xb4G\xb3\xe5\f\xb8\xcdZ\x94\xdcZ\xe3\xce(\xb5\x1c-\xf5\xecT\xb9\x85,\b\t\xfa\xdc)\xae\x92lk\xb2\xb6|\xfdm\xf5\\\xc9\f[ރ\x19\x00i4Y\xa9U\xb8*۱a\x9aL\xa6\"\x94\xc4b}\x8b\xb5Г\xf1\xb6Q\x89aК\xd3\x17Fᾜ\xb6\xe5\x8b\x80\u007fd\x1503\x8b$n\xdc\x1c\xade\x85:\xed\x04\x8c\\>\xe8\xc5\x18\x17\xbdx\x9b|\x87M>\xd6\xc3\x15E\x170\xad\x8f\xb4\x1au+\x17)r\xcd\x10?\x12F\xf0\xe6\x10\x92\x8fj\xe8T.\xa5*\x97\xb2\x15qoP\x14w\xfa$\x9b\xe5\xef\xd3\xfbn\x1d\xea_\xeb\xd5'\x88\x80\x99\xac\x0f\xd1I\xa5a\x163Q\xe8\xb1^M\xa9\xd5l3\x15\x975.b107\xa5\xec)\xa5\x99\xb9\v\bO\x88\xfd\xf1\xa0g\x84Ϣ\xcdE\xe5\xa8\xcd)&;\xc3\xfe\x14\rP\xe5\xe6J\xc6\xd9r\x1e\x82.\xb2G\xdaC\\L\xa0\xf3\x91oʘ\x17t\xe8\xe3\x19\xa3db\xddx\xdbhD78\x93\x82R\xfa\xd9\xd6r\x1d\xb3*'\xedTױ\x18\xbe晏qP\xc5\xc1\xd78\xbd\x96f\xa1\x1f(\xb3Brk\xb4\x1c}\x18\xebB\fi=\xac\x90\x90\x9bm\x85\xd6zn\xd1ȫ\x16\x013\xb3\x18㦚\xa2\xb7,\xdb!\xa4\xc2\xed\xcf_ۊ\xf1\xb3\xb4\av\xcd\xfcuN\x01{\\\xddp\xd3\x1a\x13\x0f:\x1bq$\v\xf7A\xa3\vX\xb5\xbeُFM\xdb\x1e\xa4\xbdLu4)r\xabcrZ\xe2\xf6\x89\xc9\xfc\x9ei\x8a[\x8d\xba\xcd\x1d\xafZ\xfd}\xacR\r1\x86\xdcѯR6\rІ\x84\x1b\xa4!\xd4<\xd4W\xe0\xa0>\xb8,Ƴ<\xb5\xc7Gɴ\x98\xacF\r\xb9\xb6\x9a\xc5\xcc6J\xc6\xd9r\x1e\xae\xa2[\x0f>\xbavJ\xed(\xe5K\\\u007fi\xb6\x80\x89u\x93\x84\xbe\xd5l\xa2\x19L\xd6In\x94%\xed\xa1U[\xaec\xe68\xa0\xee\x13\x05,\xc6A\xb5\nX\xb4u\x0e\x86\x80\x19\x15\xe2\xb9\xfbՌ~\x86b\xd7\xc2Do\xad\xf1$\xe3\x04\xcc8\xb1\x13m\x1b?M2[\xc0ĺ͞R\x11\x89f\xd0\xe8j\x0f\xa1\xd01\x17\xfd\x93\xbaL\xc7l\x1c\xf5\xd0}S\x16\x01\x8bqPŦ?l\x89&\xaab\b\x18WH\x93\xbb_\xcd\x18g(f-L\xf4\xd6\x1aO2N\xc0\xf4\x13;\x9c\xe9\xde\xd3\x13\\g\x89Fo\u007fM\xf2\x97\x06/`\x13{&\x98\x80\xf1~\t\xe9\xd6\x0f\xbaT3<\xac\x0e\x84\xc4#\xa9;\xe3\xe6\xc0\xf8\xdcl*4\xa2\xba\xb7N\xe2sYhs`\xd3\x03$V˲\x11\xb0\xef\xf1\x03\xff\xa4\x9f\x971\xbeM\x9e\xc3\xdb\xe9j0\xf2\a\xec\xfd~n\x01[\xc5\xe6\x15~\xa1F\x80\x1dC\xeeZtRpk\x11\xb0z\x8b\x80}\xc8_%\xb7\x8c\xfbC\xb9\x9d\xeb\xd6\xe6\xf6\xe4\x12\x113Y\x95g\x841A\u007ffǫ\x83\xfd\x81\xa8K\xba4\xcbV007%6{\u05ce\x84їzv\x9c\xb4\xf7\xc0e1B\xff^Mu:ڄd\xd5\x1e\x96\xc4S-\xe4\xc6\xd9\xf2\x85\xcci\xca\"\xeef5E>?\x81#\n\x18-\x99X\xb79\xee[\x92\x98\x06t\xaa5\xa4\xfdu^\x9ec6\x93\xfasu\x9f!`\xf5\x962\xf0\a\x95ύ\x90CR\xb4!s\xbc\x02v\xb7\xaa\x19\xfd\fŮ\x85\x89\xdeZ\xe3I\xc6\t\x98~bs\v\xe8\xdf\xf1r\x8b\x80\xd9_\x93\xfc\xa5ada\xdeM\x12\xfc\x129\xb3>[\xedp\x1am0ƅ\xc8\t\x18\x97\x9b]\x85&م@\xac\x93\xf8\\\x16\x01\a\x1b\xb9u\xa1\x89\x18-\xcbN\xc0\xc8O\xf1O\x15\x05\xbby\x10?\xa5\xa8\x98\x17\xbf\xa0\xe8\xd4\xc5M4\b\xb7 `\xa4\b\u007f|[\xbfYI\x97Q\xe4)\nvR\xd2d\xea~\xe4H\x17\xbbM\xa6\x809\xf6(\x83\xe05\x16\x01\x9b\xca,\xa4\xedl\x17;\x05d\xb3G\xbby믕ΠZ?\x111\x93\r\xa8\xa3\x8cz6l/,$\xe4[\xf6\xc37\x92q\a\x9e\xbfJM\x03nSʜ\xa2\xcbN\n\x99\xc5\xd8a\xf5\xeaV\xcfNf\xdd\xe8/\xf8,\x1a\xd0\x19\x96v\x9b\x90\xac\x8fM\x0et\xa2>!7Ζ/䆂rR~\xbf\x8fe\"\xfc\xa16\x04\xcc(\x99P7\xdev\xac\xc1\xd2%\xb0\x1ap\x8c;\xd5\t\xebe;f\x9b]\xf4\xba\xafb\u05edy\xe6c\x1cT>72\x93\xab\x85P\x17\x89W\xc0\x16\xbb\x9a&\xd1\xceP\xccZ\xe8G\x87\x98\xad5\x9ed\x9c\x80\xe9'\xd6M\xa5c&\xcf\"`\xf6\xd7$\u007fi\x18Yp\x02\xc6\xfb\x9d.\xa8'\xdb|3F\x16\x8c\xe8\x17\"'`\\n\xb6\x15*p+\xfa\x18^e\x110.\x8b\xc9\xf4rE\tf\n=\xb1Z\x96\xad\x80\xdd\u0604\x8b\xb6l\xf5\xe22:\xfdu~=\xf6n\xaf\xc4x\xf7m\xab\x80m\xc7\x18_\xd0Ӵ\"_j\xca}nc\xbd\xc3q$\v\xa5)\xff\xd2\xdbB\xe1\xcd\xee\xf4\x82\x1e-A\xfd*5\xf9\x882\"iL\x1f&\v\xa9\xf8a}\x0e=\xb7\x18\x15\x1a垅\f\x97fd\xef\xe9HV\x8a^\xad\x9eL\xe4\xe7\xb3P\b\xf9\x1c\x99\xa5!\xa1\x16\\\x8d\xedׁ-\x06\x97\x84Lj\x16\xc0.)\xda\x1d\xa88\t\xc4^\xc5;\x1b\xb3\xab-\x89\xc9]\x17\xb0\xd0X\xd7*iV\xc7{\xa5\xb2\xc0\xb3\xbe\xc0d\x8b\x80\xec\xaa[\xeev4\xef\xca\xcf[\xc0V\x04f5\x1f\xd4F;\xd6\xf9\xfc\x95żOKbr\xd7\x05\xac\\9Ӊr(\xd5\xd9\xc1y\xb3\xc0d\xf7\x06\xf3\xaf|\xf8\f\xaa\x9b_\x8a\x15\x00_\xcdp\xaf\xca<ƟK\xce\xfcOK\x82r\xd7\x05\xac)\xd5\xf5\xef\x0e \x97\f6;\x18\xfb\xee],\x16\x98\xec\xde`\xfe\x95_\x8b\xf4;8\t\xc4\xfc\xab\xb9\xbc$Zy\x17\xcc]\x170\x00\x00\x80\xbb\x05\b\x18\x00\x00\t\v\b\x18\x00\x00\t\v\b\x18\x00\x00\t\v\b\x18\x00\x00\t\xcb\xe2\n\x98\xfe|\xd1ܼA\x1f\x06\xd7X\xfc\x18\x92\x00\x00\xfc`\x00\x01\x03\x00 aY\\\x01\xbb\xfc\xeb\xf3v&\x04\x04\f\x00\x80Ebq\x05,>@\xc0\x00\x00X\x14\xee\x15\x01\xdb6\x9f\xe7r\x01\x00\xb87\xb0\x13\xb0\xdf\xe0S\x17*\xbd?\xb9\xa6\xbe\x18l\xd3^\xed\xad\x85\u05ceT\xaeߴO}_>\xb7\x83\u0381\xbd\xa1σ=\x8b_&\x96d\x9f\xef\xddT\xfc\xd4E\x8b\x80\x85˝\x8e\xfc\x0eB_Z\xa7\xbd.\xfa\x80\xf8\x02\xc48\b\xa3\x00\r5\xf8o\xbcug\xbe\xf4$k\x8f\xf4&wۙ\xce\xcbv\x81\x1cB)\xf4%\xb7}\x0et(\xbaA?+@\xc6C1\x9f\xe1Q\xdf\xe9t\b!\xed=\x92s2½\xd3Ia,\x85\x9d:\xfaN'G\x94\fB\xbe\xb4L\xff`\xe6\xc2\xdf(\x02\x001\xb0\x17\xb0\x17\xbd\x18\x17\xdf&\x17\x8a\xb1wk%Ư\xd1_\xcf{q\xf1\xf62\x8c\xe9\x8c\x17\xbf\x83\n\xd8?p\x11{\xfb\xe1\xedb\x1a\xba[Hv\n㊭EE\xbb\x05\x01\xcbu\xa2\\\x0fB\xe5\x84L\xa4h\x91}=Q\x038\b\x9c\x15_\xd0Y\xb5\xea[-\xd4`\x14\x03\x8b\xedl\x16bЈ\xb4WH\xa2\xc6(\tT\xf4d\xf1\xd8.\x10=\x8b\t\xbf\x83\xbe\x9a\xda\xe7\xf0OD7\xa4o\xd5\f\x0e\x1e\xf3X\xe27\x9a\boՌ\x81q\x1c\xb8\xb7j2\xd4\x00\x8f쭚\xb3\x1f!\x1eH[s\xbc3\x0f\xcd\xe7\xe5[\x00\x10\x1f\xf6\x02\x86+\xcf_8Mn\x14㣷\x95.\xd4&\x1a\x99\xe8\xbbb\xfc\xf2mr\xe7\r\x1a\xdcC\xd8\xc1\xeeB\xeeħi\xca\xf3x+\x11\xf7^\xc4\x0f\x9c\xbeC\xbe\u007f\n\v\x02\x86\xb2\x95&5\u082fX)A4\n\x00\x19\x89\xe3\x05\x88k\xfc\xfc\xb7\xb0\x1aJ\x97\u007f\x83\bg \xdaFa!\x06-\x92\xf6\x12\xefT3\xf2\x93\x15=Y<\xb6\v\xc4(Y\xa0\xc41E&\x1d%\x81\x98\xa6\xec\xe8L\xb9\xc5\xf8P\x1cq\x84\x87\xe7\x8fC\xdc\xe1\xe1'\xd3K#\xf4\xed\xec `\xc0\xe2\x13\x87\x80]\xa6\x9fG\xb5@\xdc\xef\xe3\x1f\x13\xf22\r\xf1\xa1\xb0[\x91*a\a\x13\xb0\xd3\xeaރ\xf8\x94%\xd9A|\x94n\xdf,\x13\x05\x8c5\x98c(\x9b\xbe\\\x94)\xd7.\x14\xbb\x15\xea\x88a+\xaa\xd57\x8e\xf1\x02\x1654V\f\x16b\x10\tk\xad5\x1c\xfb}\\z\xb2xl\x17\b\x17\x1a\xcb\xd7EN\xf8\xfc6\x02F\x1aRgb\xec\x8fC\xc0\xa2\xc7\xfa\xa2\xcc!`\x81T6vl\x06\x01\x03\x16\x1f{\x01\xabd\x9f\x0fk1!o\xd3\xe8\xb6[\xb4/7n\xdc\x11w0\x01\xbbY\x84\xff\xa9\xfc\xeb\xa5\xff\xf2{\xefl\xc4\x17ٗ\xa3\x82\x80\xade\x9fSI\xca\xf5\x1dq\xd2\xcb\u007f\xc6e^\xea\xb5(\xa5\xbd.\xc7\xe1c\xc1\rȉ\x82\xb4\x9c\xc7o\x11ҫM)\xe5kVcɻا\xb4G\xb3\xe5\f\xb8\xcdZ\x94\xdcZ\xe3\xce(\x15\x1b\x92\xe8Lς\x90\xa0ϝ\xe2*ɞ\x9d\x9b\x89\xd9Z\xed\x93i\xb6\xa3\xc9\bՇ\xab\xb2\x1d\x1b\xa6\xc9\xd4\xe6,\xc9]:J,\xd54<\x88\xe5m\xcb\xd7\xdeknz\xe0\xb3\b\xf8\xdb\xcaI\xc9+T\xc0L\xbf\xa1d\x1a]ύ\x903\xa2\vXcr\x84+/_\x1cA\xc0\xf4\xdcl+D\x88\\\x95\xe5,\xb7\x86\xc6\xe2\x0e\x89\x16\xdbo\xa29\xc2\xf9\xe5j\x1c\xbd\xf2\x00\x10\x0f\xf6\x02ƺS71\u07b2\x9dQ\x84/\x90\xf5\xf8o\xfa~q\x87\xba\x90u\x1f\x1dC\xbeO\x13\n{\xbf\xa7\xb1%)\xa7\x05\x01\xabS7\xb2i\x18\x9bm4Dπ\x16\x17\x98\x12\xeaLF\xae\x86\xe6t\x16\u007f\xae&iG_\xab+\u007f\x86\xdc\n\xb2x(A]\x89j$U\xe0$\x94\xdbٛ\xa9\xd8r\x06\xdc&u\x96}\xf8\xe7\xd9\xe24\x90\xe0\xcc\xc8B\x19\xc7>\xda=\xd0\xeeBӳr31Zk\x1c\xc94\xdb\xc8\xc9\xce\xec\x9ctw]\x15\xbaJ\xfaP\xcd\xe0\xc9Ҥa\xb1\x9a\xa6\a\xa1\xbc\xd5R}_\xbdT%x\xe0\xb3\b\xf8\xc7\xd3&W\xc9T\xc0L\xbf3C\rIC\xa4\x03\x9d\xa0j\xa6\nX~\x1e_^\xbe8!\xd4\x17\x89D\xfa\x91\x90\x9bm\x85Hؙ\xd3\xd1\xebCV\x013\xb3H\xe2\xc6͆_\xae\xc6\xd1+\x0f\x00\xf1`/`\a\xe9\xc7w\xd8\xe4c\xa5;uC\xdf/\xec\xd0\x04\xec<\xdeM\xc8S\xf8}\xcb\xdek\x18\xabi\xce\v\x02\xa6\xc5^[\x8d\xbai\x14n\xd7\f\xf1#~\xa6H\xa2\xb1\f\xab\\\x84\xb6Kz\xabr\x98\x85\x87\x13\x063WS\xb4`4R\xe6\xa4\xd2r\\\xc4b`nJ\xd9S\x84L\xba\v\x88\x88a\xc0e\xd1梍\xa8\xcdi\xf1 \xa0\xb7\xd6x\x92q\xb1\xfd\x90O)\x85\xf2\u007f\xa4\x8bN\x97\xe7\xb1\x18\xc7f5y\x0ffyϰ\xee\xd1\x00\vVfz\x10\x86\x90$o\xdb\x1a\x16ۏ\xf7K\xaa\v&\xdc\xea\x1b\xe5\xa5\xfaȭ\xd1r\xf4\xa1\xf5H\xea\xceBZ\x0f+$\xe4f[\xa1\xb5\x9e[4\x92\xa0E\xc0\xcc,ƌ\x18\xa0b-\xcc\x1aǨ<\x00\xd8\x13\xa7\x80ݤ\x03D\x9d;ڼج\x1d\x9a\x80\xddވ\xbf\xff'\xf6\u07b4콩\x87\xef~_\x10\xb0\xc7\xd5\r7mYă\xceF\x1c\xc9\xfc\xfdv\x16z\x94Ͱ\xf8=\xd3\x14\xb7\x1a`\x98kJ\xb5\xfa\xab'Y\x9c\xf89\xc3ó\x19\xa26d\x89\xa4h\x18pY\x8cgyj\x8f\x8f\xaa\x81\xac\xed\x04,\x9ed\x9c\x80Iz\x98扶\r\x1e\xa7\xda\xdf4\xab\xc9{0\xcb[\xa3\x86\xb5Z]-z\x10\x04\xac\t52\x01\xe3\xfd\x92H^\xa6\xb6\xd2N\xa2\xea\xe4\xa2j\"\x1eI\xddY\b5\x0f\x0f\x0f\xb7P\x01\xe3r\xb3\xabФ\xba\xea\xa2\xde\"`f\x16\xd3\xc9\xe6\xdf#\xbe\x16f\x8dcT\x1e\x00\xec\x89S\xc0H\x996\x99E>\xffǿH%V\x9f\x18\xfa\xf8\xa7\xa7\xc4\x1dڳ\x90/\xe2ӧ\xf1\xb3\xd6dw6au\xe1\xd8k\x82\x80\xa9w\xc5&\x11\xa2\xc3\xc0\x06T\xdbo\x04\xffd\x98Ax\xf3\xb4\x1e\x02\xebYpMI\x96\xf4E\xac|t\xe5\xe8\x02\xc6FQ\x83\xd6 \xa9\x86\x01\x9f\xc5d\xfb\xe6\\\x94\xd9h\xf1 \xa0\xb7\xd6x\x92q\x02\xa6O\xa6\rg\xba\xf7\xf4\x04\xd7Y\xa2+\xf3\x1e\xcc\xf2\xaeUU\xa8\xa4@\xf0 \n\xd8Ğ\t&`\xbc_B\xba\xf55)R\xcd\xf0\xb0:\xfc\x13\x8f\xa4\ue31b\x03\xe3s\xb3\xa9Ј\xea\xde:\x89\xcfe\xa1́M\x0f\x88~\xb9\x1aG\xaf<\x00\xd8\x13\xaf\x80=\x87\xb7ߡ\x9f\u007f\xa0K'\x8ejkU\xf7\xe27\xc4\x1d\x9a\x80]\xc4O=\xa5\x06\xea\x16\xf6\xbe\xa0\x8a\xda\xedJA\xc0V\xb1\xf9\xab_\xa8\x913ǐ\xbb\x16\x9d$\x1c\xe6\xc5]\xe5\x19a\xb0\x85N\xac)u\xb0\xbeC]\x92\x1e\xaf}\x96\x80\xa9\x06\xe6\xa6\xc4&\xdcڭ\x91\x14\r\x03.\x8b\x11ڕ\x99\xeat\xb4Y\x9c\xf1\xe8\xad5\x9ed\x9c\x80\x95k\x1b\xb9\x05tZ\xbb\xdc\"`\xbc\a\xb3\xbc\xd5\x1e\x96\xc4S-x\xe0\xb2\xe0\xc2\xc3\xf3~\x89\x9cY\x9f\xadv8\xcd{\xb4\xe2\x91ԝq\x02\xc6\xe5fW\xa1I5Đu\x12\x9f\xcb\"\xe0`=\xea.4!\xd4\"\xaa\x80\t\xb9\x01\x80-\xf1\n\xd8e/~A\x19\x00^\xdcD\xc5\xe7\x86\x17\xbf\xc1ց\x15\u007f'\xee\xd0\xdfFQYTTqgV\xb2k\xeb\xf1\xaf\uf41b\a-\xeb\xc0\xf2\x14\x05;)i3%\xf7#G\xba\xb0\xd6\xc0\xbc\xb8\a\x10[h_\xcfft\n\v\t\xf9\x96\xfd\xf0\x8dd,\xdb\xe7\x05\xcc4\xe06\xa5\xcc)\xba\"\xc9\x1a\x0f\xcb0\xe0\xb2h@gخm\x16gd찮\x97Fk\x8d'\x19'`z7\xc6M\xa5c&\xcf\"`\xbc\a\xb3\xbc}lª\x13\xf5\t\x1e\xb8,8\x01\xe3\xfdN\x17ԓm\xbe\x19#\v\x86p$\rg\x9c\x80q\xb9\xd9V\xa8\xc0\xad\xe8cx\x95E\xc0\xb8,&\xd3˕!\xe1L\xa1G\xacET\x01\x13r\x03\x00[\xe2\x150r~=\xf6n\xaf\xc4x7\xbd\x93x\xbe\boܾ\t\x17\x9d\xb7\xec\xd0\x05\xec\r\xcc\x1e#\xb2&\xfb\xb8\b\x97\xfdċ\xf7\t\x02\xe6KM\xb9ύ\xf4\xb9\xfc\xe3Hx\x8cH\x8d\x0e5R\x9d\x12\x94i e\xff\xc9\xdejt\x82\xeeh\x90\x9a{|i\xb4\xf3\xf6\xb8\xbe\xe8B\xb0\xe5\f\xb8M\t\xe5w\x1d\xcfqZ\xef'\x9a\x06f\x16\r(\xfd@_O5\x1a\x14\r\b)5\x86\xb8#m\xa8E\x1d\x8c\xda'\xd3m\xa7\x87ح<6i׀6\xb7\x1d\xceG\xae\xa6!\xbe\xe8\xbc\a\xae\xbcUI\x81\xbe@R\x95\xe8\xc1\xccbҿ\xee\x1b\xe5\xeb7\xeb\xfc\x93\x9c\xdfH\xb0\xd65N.9w\x05#t%\xbeQo\xa3\xbc\x9c3a%\xbe\x91[\x8c\nq+\xf1C\x0e\xf7\xa1\xfa\x8c\xa4䎐\xba\x12\xbf%\x18\xbc*\x1c\x12r\xc6q\u007fG\xaf/9\xc8ׂ\xabq\xac\xca\x03\x80=q\v\x18\xb9\xf6Be\x91w\xfb)u%\xc4\xe5g+\x8a\xca\x0e^\xb6\xee\xd0\x05\xec\x869\xcd/$\xfb\xdb\xc12\xef\xf6\v\x1f\v\x02\x16\x18\xf5\xa59\xd6\xf6kߧ$\xe11\"\x16\x1d*\x94\xa6\xfcKo4\x0e\xac\xcbpj\x96\x91\x1d\x19\x8e\a\x87\x95\x8doS\xab\xa2\xda\x1a\x06\xfc\xa6\xf4x\xb53\xabJ&\x168[#\x8b\x13\x85\x87\xdc)\x99\x85\x83V\x03\xd2\xe1jW7n\xa5+Y\xa5Nŕ̰\x1dU\x1f\",\xa1?δ\xe4H.\u007f\x87G*\xe4\x8b\xce{\xe0\xcb{,O[\a\xc6y0\xb3h@\x88N5m\xa3\xcf3\x9a~\a\x14\xc3:\xb2C\xf9\xf7,}\x16R\x9dB\xe7\xcb\xcb9S\x9f\x85T\xfc\xb0Yy=\xb7\x18\x15\x1a垅\f\x97fd\xef\xe9HV\x8a^\xadM|\xf9\xf9,\b}\x16ґY\x1a\x12j\xc1\xd58V\xe5\x01\xc0\x1e;\x01[j.\xc5\xf1\x18\x91@`>\v\xbc\x13-Zq\xa2\x95\x17\x00\x96\x98\x95&`\xf5h\x9eapkjH\xfc\x98\x82\x10\x19SY\xf4g{\x16\x15\x100\x00\x98\x93\x15%`\xa1\xb1\xaeUҬ\x01\xde\"b\n\u0083\xdah\xc7:\x9f\xbf\xb2\x00\x01\x03\x809YQ\x02V\xae(\xca]l\xb2\xeal\xb1J\xb8We\x1e\xe3\xcf%\x87//\x00\x00QXQ\x02֔\xea\x9a\xe7\x00r^\xb0\xd9\xe21;\xab\x95C\xa2\x95\x17\x00\x96\x9c\x15%`\x00\x00\x00\xf3\x01\x04\f\x00\x80\x84\x05\x04\f\x00\x80\x84\x05\x04\f\x00\x80\x84\x05\x04\f\x00\x80\x84eq\x05L\u007f\x94hn\xeeF\\H\x00\x00~\x80\x80\x80\x01\x00\x90\xb0,\xae\x80]\xfe\xf5y;\x13\x02\x02\x06\x00\xc0\"\xb1\xb8\x02\x16\x1f `\x00\x00,\n\xf7\x8a\x80m\x9b\xcf3\xdd\x00\x00\xdc\x1b\xd8\t\xd8o\xf0\xa9\v\x95ޟ\\#\xe4Ƌ\x95E\x9b\xf6^P\u007f\xbev\xa4r\xfd\xa6}\xea+\xee\xb9\x1dt\x0e\xec\r}\x1e\xecY\xf6RC!\xd9\xe7{7\x15?u\xd1\"`\xe1r\xa7#\x9fưiA\xb9\xea\x8f\a\x84\x97\x1a\xc6C\x18\x05H-J겳[\a:\x14ݠ\x9f\x15 㡘\x0f\u007f\xaa\xef\x03;\x84\xd4\xf7\x81\xd90½\x0fLa,\x85\x9d:\xfa>0G\x94\fB\xbe\xb4L\xff`&\x1f\xab\x05\x00\x16\x05{\x01{ыq\xf1mr\xa1\x18{\xb7Vb\xfc\x1a\xfd\xf5\xbc\x17\x17o/\xc3,\xb6\a\xbf\x83\n\xd8?p\x11\v>t\xbb\x98\xbe\xd4PHv\n㊭EE\xbb\x05\x01\xcbu\xa2\\\x0fB\xe5\x84L\xa4hQ\xa1=\xc2K\r\xa3rV\x8c\xcbQ\xb5\xea[\xfa\xec3\xf7$8g`\xb1\x9d\xcdB\f\x1a\x91\xf6\xfaQ\x14;\x02\x85\x9e,\x1e\xdb\x05\xa2g1\xe1w\xf8\x94\x0f\x9f\xc3?\x11ݐ\xbe\x9158x\xcc#\x06\xc5\xe4\x10\xde\xc8\x1a\x03\xe38pode\f\xb1w\xe2\xb37\xb2\xce~\xfc| m\xcd\xf1\xce<4\x9f\x17\xb7\x01@|\xd8\v\x18\xae<\u007f\xe14\xb9Q\x8c\x8f\xdeV\xbaP\x9bh\x98\xa1\xef\x8a\xf1\xcb\xec\x9d\xf8\xde\xef\xc5\x1d\xec.\xe4N\x1aזF\u007f\xdcJĽ\x17\xf1\x03\xa7\xef\x90\uf7f2\xbc\x13?[iR\x03\x0e\x1a\x1b\xa2\x04ј\x0ed$\x8e\x97\x1a\xae\xf1\xf3\xdf\xc2jx\\\xfe\xed3\x9c\x81h\x1b\x85\x85\x18\xb4H\xda\v\xe0S\xf9(\x96\"z\xb2xl\x17\x88Q\xb2@\x89c\x8aL:J\x021M\xd9љr\v1\x9fx\x84\xc8\xdc\xd1\xe1\x8fð U֨D\x1c\x93\xe9\xa5\x11\xfaf\u007f\x100`\xf1\x89C\xc0\xd8ˡ\x8f\xe2\xbd\xec\xfb\xfb\xf8DŽ\xbc\xac\x86\xeb&\xbb\x15\xa9\x12v0\x01;\xad\xee=\x88OY\x92\x1d\xc4G\xe9\xf6\xcd2Q\xc0X\x839\x86\xb2\x95\xa1\x96\xaa\\\xbbP\xecV\xa8#\x06:\xabV\xdf\"\xc6\vX\u0530j1X\x88A$\xac\xb5\xd6p\xecw\"\xea\xc9\xe2\xb1] \\X5_\x179\xe1\xf3\xdb\b\x18iH\x9d\x89\xb1?\x0e\x01\x8b\x1e'\x8e2\x87\x80\x05R\xd9ر\x19\x04\fX|\xec\x05\xac\x92}>\xac\x05x\xbcMC\xd5nѾܸqG\xdc\xc1\x04\xecf\x11\xfe\xa7\xf2\xaf\x97\xfe\xcbウ\x11_d_\x8e\n\x02\xb6\x96}N%)\xd7w\xc4I/\xff\x19\x97y\xa9ע\x94\xf6\xba\x1c\x87O\x8d\xa7q\xa2 -\xe7\xf1[\x84\xf4jSJ\xf9\x9a\xd5X\xf2.\xf6)\xed\xd1l9\x03n\xb3\x16%\xb7ָ3Jņ$:ӳ $\xe8s\xa7\xb8J\xb2g\xe7fb\xb6V\xfbd\x9a\xedh2B\xf5\xe1\xaaldži2\xb59Kr\x97\x8e\x12K5\r\x0fby\xdb\xf2\xb5w\xe2\x9b\x1e\xf8,\x02\xfe\xb6rR\xf2\n\x150\xd3o(\x99Fft#\xe4\x8c\xe8\x02֘\x1c\xe1\xca\xcb\x17G\x100=7\xdb\n\x11\"We9˭aոC\xa2Ņ\x9ch\x8ep~\xb9\x1aG\xaf<\x00ă\xbd\x80\xb1\xee\xd4M\x8c\xb7lg\x14\xe1\vd=\xfe\x9b\xbe_ܡ.d\xddGǐ\xefӄ\xc2\xde\xef1VC{\x9c\x16\x04\xacN\xddȦ\xf1淡\x1d4\"W\x9e\xb1;ԙ\x8c\\\r\xcd\xe9,vaMҎ\xbeVW\xfe\f\xb9\x15d\xb1t\x82\xba\x12\xd5H\xaa\xc0I(\xb7\xb37S\xb1\xe5\f\xb8M\xea,\xfb\xf0ϳ\xc5i \xc1\x99\x91\x852\x8e}\xb4{\xa0݅\xa6g\xe5fb\xb4\xd68\x92i\xb6\x91\x93\x9d\xd99\xe9\xee\xba*t\x95\xf4\xa1\x9a\xc1\x93\xa5I\xc3b5M\x0fBy\xab\xa5\xfa\xbez\xa9J\xf0\xc0g\x11\xf0\x8f\xa7M\xae\x92\xa9\x80\x99~g\x86\x1a\x92\x86H\a:A\xd5L\x15\xb0\xfc<\xbe\xbc|qB\xa8/\x12\x89\xf4#!7\xdb\n\x91\xb03\xa7\xa3ׇ\xac\x02ff\x91č\x9b\r\xbf\\\x8d\xa3W\x1e\x00\xe2\xc1^\xc0XT\xa2\xef\xb0\xc9\xc7Jwꆾ_ء\t\xd8y\xbc\x9b\x90\xa7\xf0\xfb\x96\xbd\xd70VӜ\x17\x04L\x8b\xa7\xb6\x1au\x132\x84\\3ď\xf8\x99\"ɩ\x88S\x95\x8b\xd0vIoU\x0e\xb3Ђ\xc2`\xe6jJ\xadf\x9b9\xa9\xb4\x1c\x17\xb1\x18p\x91\xb9\xb3\xa7\b\x99t\x17\x10\x11Àˢ\xcdE\x1bQ\x9b\xd3\xe2A@o\xad\xf1$\xe3\xe2B\"\x9fR\n\xe5\xffH\x17\x9d.\xcfc\xf1\xb1\xcdj\xf2\x1e\xcc\xf2\x9eaݣ\x01\xd4/x\x10\x86\x90$o\xdb\x1a\x16\x17\x92\xf7K\xaa\v&\xdc,\xfe#\x91\xea#\xb7F\xcbч\xd6#\xa9;\vi=\xac\x90\x90\x9bm\x85\xd6zn\xd1(\x94\x16\x013\xb3\x18\xd3\"~R\xf8Z\x985\x8eQy\x00\xb0'N\x01\xbbI\a\x88:w̠i\xe2\x0eM\xc0no\xc4\xdf\xff\x13{oZ\xf6*_\xd8\xedI\xa5s\xc6\v\xd8\xe3ꆛ\xb6,\xe2Ag#\x8ed\xfe~;\v[\xcbfX\xfc\x9ei\x8a[\rN\xcd5\xa5Z\xfd\xb5\xa5R\r1fc\xa2\v\x18\x9b!jC\x93D\xc00\xe0\xb2\x18\xcf\xf2\xd4\x1e\x1f%\xd3\x16\x0f\x02zk\x8d'\x19'`\x92\x1e\xe2{\xa2m\x83ǩ\xf67\xcdj\xf2\x1e\xcc\xf2֨!\xd1VW\x8b\x1e\x04\x01kB\x8dL\xc0x\xbf$\x92\x97\xa9\xad\xb4\x93\xa8:\xb9\xa8\x9a\x88GRw\x16B\xcd\xc3\xc3\xc3-T\xc0\xb8\xdc\xec*4\xa9\xae\xba\xa8\xb7\b\x98\x99\xc5t\xb2\xf9\xf7\x88\xaf\x85Y\xe3\x18\x95\a\x00{\xe2\x140R\xa6Mf\x91\xcf\xff\xf1/R\x89\xd5'\x86>\xfe\xe9)q\x87\xf6,\xe4\x8b\xf8\xf4i\xfc\xac5ٝMX]8\xf6\x9a `\xea]\xb1I\x84\xe80\xb0\x01\xd5\xf6\x1b\x81c\x19f\xd4\xe6<\xad\x87\xc0z\x16\\S\x92%}\x11+\x1f\x99;\xba\x80\xb1Q\xd4 \xb2\xac\x8a0\f\xf8,&\xdb7\xe7\xa2\xccF\x8b\a\x01\xbd\xb5Ɠ\x8c\x130}2m8ӽ\xa7'\xb8\xce\x12\x99\x9b\xf7`\x96w\xad\xaaB%\x05\x82\aQ\xc0&\xf6L0\x01\xe3\xfd\x12ҭ\xafI\x91j\x86\x87\xd5\xe1\x9fx$ug\xdc\x1c\x18\x9f\x9bM\x85FT\xf7\xd6I|.\vm\x0elz@\xf4\x1b52\xb7\x90\x1b\x00\xd8\x12\xaf\x80=\x87\xb7ߡ\x9f\u007f\xa0K'\x8ejkU\xf7\xe27\xc4\x1d\x9a\x80]\xc4O=\x85/\xccJ\xf6\x82*j\xb7+\x05\x01[\xc5\xe6\xaf~\xa1F]\x1dC\xeeZt\x92p\x98\x17w\x95g\x84\xc1\x16:\xb1\xa6\xd4\xc1\xfa\x0euI\x97f\xd9\n\x06\xe6\xa6\xc4&\xdcڑe\xa5\x93a\xc0e1B\xbb2S\x9d\x8e6\x8b3\x1e\xbd\xb5Ɠ\x8c\x13\xb0rm#\xb7\x80Nk\x97[\x04\x8c\xf7`\x96\xb7\xdaÒx\xaa\x05\x0f\\\x16\x01u\x85\x03\x150\xde/\x913\xeb\xb3\xd5\x0e\xa7y\x8fV<\x92\xba3N\xc0\xb8\xdc\xec*4\x89\xd8\x1e\xeb$>\x97E\xc0\xc1z\xd4]hB\xa8ET\x01\x13r\x03\x00[\xe2\x15\xb0\xcb^\xfc\x822\x00\xbc\xb8\x89\x8a\xcf\r/~\x83\xad\x03+\xfeNܡ\xbf\x8d\xa2\xb2\xa8\xa8\xe2άd\xd7\xd6\xe3_\xdf!7\x0fZց\xe5)\nvR\xd2fJ\xeeG\x8eta\xad\x81yq\x0f \xb6о\x9e\xcd\xe8\x14\x16\x12\xf2-\xfb\xe1\x1b\xc9X\xb6\xcf\v\x98i\xc0mJ\x99StE\x925\x96\x9aa\xc0eрΰ]\xdb,\xce\xc8\xd8a]/\x8d\xd6\x1aO2N\xc0\xf4n\x8c\x9bJ\xc7L\x9eE\xc0x\x0ffy\xfb\u0604U'\xea\x13\x16\x04,0\xeaKs\xac\xed\u05feOI\xc2cD,\xb2X(M\xf9\x97\xdeh\x1cX\x97\xe1\xd4,#;2\x1c\x0f\x0e+\x1bߦVE\xb55\f\xf8M\xe9\xf1jgV\x95L,p\xb6F\x16'\n\x0f\xb9S2\v\a\xad\x06\xa4\xc3ծn\xdcJW\xb2J\x9d\x8a+\x99a;\xaa>DXB\u007f\x9ciɑ\\\xfe\x0e\x8fT\xc8\x17\x9d\xf7\xc0\x97\xf7X\x9e\xb6\x0e\x8c\xf3`fр\x10\x9dj\xdaF\x9fg4\xfd\x0e(\x86ud\x87\xf2\xefY\xfa,\xa4:\x85Η\x97s\xa6>\v\xa9\xf8a\xb3\xf2zn1*4\xca=\v\x19.\xcd\xc8\xdeӑ\xac\x14\xbdZ\x9b\xf8\xf2\xf3Y\x10\xfa,\xa4#\xb34$Ԃ\xabq\xac\xca\x03\x80=v\x02\xb6\xd4\\\x8a\xe31\"\x81\xc0|\x16x'Z\xa4\xebD+/\x00,1+M\xc0\xea\xd1\u007fe\x01\x02\x06\x00s\xb2\xa2\x04\xac\\Q\x94\xbb\xd8d\xd5\xd9b\x95p\xaf\xca<ƟK\x0e_^\x00\x00\xa2\xb0\xa2\x04\xac)\xd55\xcf\x01\xe4\xbc`\xb3\xc5cvV+\x87D+/\x00,9+J\xc0\x00\x00\x00\xe6\x03\b\x18\x00\x00\t\v\b\x18\x00\x00\t\v\b\x18\x00\x00\t\v\b\x18\x00\x00\t\xcb\xe2\n\x98\xfe(\xd1\xdc܍\xb8\x90\x00\x00\xfc\x00\x01\x01\x03\x00 aY\\\x01\xbb\xfc\xeb\xf3v&\x04\x04\f\x00\x80Ebq\x05,>@\xc0\x00\x00X\x14\xee\x15\x01\xdb6\x9fg\xba\x01\x00\xb87\xb0\x13\xb0\xdf\xe0S\x17*\xbd?\xb9Fȍ\x17+\x8b6\xed\xbd\xa0\xfe|\xedH\xe5\xfaM\xfb\xd4W\xdcs;\xe8\x1c\xd8\x1b\xfa<س쥆B\xb2\xcf\xf7n*~\xea\xa2E\xc0\xc2\xe5NG>\x8daӂr\xd5\x1f\x0f\b/5\x8c\x870\n\x90Z\x94\xd4eg\xb7x\xf4$k\x8f\x83'wۙ\xce\xcbv\x81\x1cB)\xf4\x95\xb6}\x0et(\xbaA?+@\xc6C1\x1f\xfeT\xdf\av\b\xa9\xef\x03\xb3a\x84{\x1f\x98\xc2X\n;u\xf4}`\x8e(\x19\x84|i\x99\xfe\xc1L>V\v\x00,\n\xf6\x02\xf6\xa2\x17\xe3\xe2\xdb\xe4B1\xf6n\xad\xc4\xf85\xfa\xeby/.\xde^\x86Yl\x0f~\a\x15\xb0\u007f\xe0\"\x16|\xe8v1}\xa9\xa1\x90\xec\x14\xc6\x15[\x8b\x8av\v\x02\x96\xebD\xb9\x1e\x84\xca\t\x99HѢB{\x84\x97\x1aF\xe5\xac\x18\x97\xa3jշ\xf4\xd9g\xeeIp\xce\xc0b;\x9b\x85\x184\"\xed\xf5\xa3(v\x04\n=Y<\xb6\vD\xcfb\xc2\xef\xf0)\x1f>\x88\x9f\x8f(\x00\x00\ttIDAT\x87\u007f\"\xba!}#kp\xf0\x98G\f\x8a\xc9!\xbc\x915\x06\xc6q\xe0\xde\xc8\xca\x18b\xef\xc4god\x9d\xfd\xf8\xf9@ښ\xe3\x9dyh>/n\x03\x80\xf8\xb0\x170\\y\xfe\xc2ir\xa3\x18\x1f\xbd\xadt\xa16\xd10C\xdf\x15\xe3\x97\xd9;\xf1\xbdߋ;\xd8]ȝ4\xae-\x8d\xfe\xb8\x95\x88{/\xe2\aN\xdf!\xdf?ey'~\xb6Ҥ\x06\x1c46D\t\xa21\x1d\xc8H\x1c/5\\\xe3翅\xd5\xf0\xb8\xfc\xdbg8\x03\xd16\n\v1h\x91\xb4\x17\xc0\xa7\xf2Q,E\xf4d\xf1\xd8.\x10\xa3d\x81\x12\xc7\x14\x99t\x94\x04b\x9a\xb2\xa33\xe5\x16b>\xf1\b\x91\xb9\xa3\xc3\x1f\x87aA\xaa\xacQ\x898&\xd3K#\xf4\xcd\xfe `\xc0\xe2\x13\x87\x80\xb1\x97C\x1f\xc5{\xd9\xf7\xf7\xf1\x8f\tyY\r\xd7Mv+R%\xec`\x02vZ\xdd{\x10\x9f\xb2$;\x88\x8f\xd2\xed\x9be\xa2\x80\xb1\x06s\fe+C-U\xb9v\xa1حPG\ftV\xad\xbeE\x8c\x17\xb0\xa8a\xd5b\xb0\x10\x83HXk\xad\xe1\xd8\xefDԓ\xc5c\xbb@\xb8\xb0j\xbe.r\xc2\xe7\xb7\x110Ґ:\x13c\u007f\x1c\x02\x16=N\x1ce\x0e\x01\v\xa4\xb2\xb1c3\b\x18\xb0\xf8\xd8\vX%\xfb|X\v\xf0x\x9b\x86\xaaݢ}\xb9q㎸\x83\t\xd8\xcd\"\xfcO\xe5_/\xfd\x97\xdf{g#\xbeȾ\x1c\x15\x04l-\xfb\x9cJR\xae\uf213^\xfe3.\xf3R\xafE)\xedu9\x0e\x9f\x1aO\xe3DAZ\xce\xe3\xb7\b\xe9զ\x94\xf25\xab\xb1\xe4]\xecSڣ\xd9r\x06\xdcf-Jn\xadqg\x94\x8a\rIt\xa6gAH\xd0\xe7Nq\x95d\xcf\xce\xcd\xc4l\xad\xf6\xc94\xdb\xd1d\x84\xea\xc3Uَ\r\xd3djs\x96\xe4.\x1d%\x96j\x1a\x1e\xc4\xf2\xb6\xe5k\xef\xc47=\xf0Y\x04\xfcm\xe5\xa4\xe4\x15*`\xa6\xdfP2\x8d\xcc\xe8F\xc8\x19\xd1\x05\xac19\u0095\x97/\x8e `zn\xb6\x15\"D\xae\xcar\x96[êq\x87D\x8b\v9\xd1\x1c\xe1\xfcr5\x8e^y\x00\x88\a{\x01cݩ\x9b\x18o\xd9\xce(\xc2\x17\xc8z\xfc7}\xbf\xb8C]Ⱥ\x8f\x8e!ߧ\t\x85\xbd\xdfc\xac\x86\xf68-\bX\x9d\xba\x91M\xe3\xcdoC;hD\xae\xa5\x14\xca\xff\x91.:]\x9e\xc7\xe2c\x9b\xd5\xe4=\x98\xe5=úG\x03\xa8_\xf0 \f!I\u07b65,.$\xef\x97T\x17L\xb8Y\xfcG\"\xd5Gn\x8d\x96\xa3\x0f\xadGRw\x16\xd2zX!!7\xdb\n\xad\xf5ܢQ(-\x02ff1\xa6E\xfc\xa4\xf0\xb50k\x1c\xa3\xf2\x00`O\x9c\x02v\x93\x0e\x10u\xee\x98A\xd3\xc4\x1d\x9a\x80\xddވ\xbf\xff'\xf6\u07b4\xecU\xbe\xb0ۓJ\xe7\x8c\x17\xb0\xc7\xd5\r7mYă\xceF\x1c\xc9\xfc\xfdv\x16\xb6\x96Ͱ\xf8=\xd3\x14\xb7\x1a\x9c\x9akJ\xb5\xfakK\xa5\x1ab\xcc\xc6D\x1706CԆ&\x89\x80a\xc0e1\x9e\xe5\xa9=>J\xa6-\x1e\x04\xf4\xd6\x1aO2N\xc0$=\xc4\xf7D\xdb\x06\x8fS\xedo\x9a\xd5\xe4=\x98\xe5\xadQC\xa2\xad\xae\x16=\b\x02ք\x1a\x99\x80\xf1~I$/S[i'QurQ5\x11\x8f\xa4\xee,\x84\x9a\x87\x87\x87[\xa8\x80q\xb9\xd9UhR]uQo\x1103\x8b\xe9d\xf3\xef\x11_\v\xb3\xc61*\x0f\x00\xf6\xc4)`\xa4L\x9b\xcc\"\x9f\xff\xe3_\xa4\x12\xabO\f}\xfc\xd3S\xe2\x0e\xedY\xc8\x17\xf1\xe9\xd3\xf8Yk\xb2;\x9b\xb0\xbap\xec5A\xc0Իb\x93\b\xd1a`\x03\xaa\xed7\x02\xc72̨\xcdyZ\x0f\x81\xf5,\xb8\xa6$K\xfa\"V>2wt\x01c\xa3\xa8AdY\x15a\x18\xf0YL\xb6o\xceE\x99\x8d\x16\x0f\x02zk\x8d'\x19'`\xfad\xdap\xa6{OOp\x9d%27\xef\xc1,\xefZU\x85J\n\x04\x0f\xa2\x80M\xec\x99`\x02\xc6\xfb%\xa4[_\x93\"\xd5\f\x0f\xab\xc3?\xf1H\xeaθ90>7\x9b\n\x8d\xa8\ueb53\xf8\\\x16\xda\x1c\xd8\xf4\x80\xe87jdn!7\x00\xb0%^\x01{\x0eo\xbfC?\xff@\x97N\x1c\xd5֪\xee\xc5o\x88;4\x01\xbb\x88\x9fz\n_\x98\x95\xec\x05U\xd4nW\n\x02\xb6\x8a\xcd_\xfdB\x8d\xba:\x86ܵ\xe8$\xe10/\xee*\xcf\b\x83-tbM\xa9\x83\xf5\x1d\xea\x92.Ͳ\x15\f\xccM\x89M\xb8\xb5#\xcbJ'À\xcbb\x84ve\xa6:\x1dm\x16g7\xd2\xe7\xf2\x8f#\xe11\"5\xb2\xd8HuJP\xa6A\xb8\xfd'{\xab\xd1\t\xba\xa3Aj\xee\xf1\xa5\xd1\xce\xdb\xe3\xfa\xa2\v\xc1\x963\xe06%\x94\xdfu<\xc7i\xbd\x9fh\x1a\x98Y4\xa0\xf4\x03}=\xd5hP4 \xa4\xd4\x18⎴\xa1\x16u0j\x9fL\xb7\x9d\x1eb\xb7\xf2ؤ]\x03\xda\xdcv8\x1f\xb9\x9a\x86\xf8\xa2\xf3\x1e\xb8\xf2V%\x05\xfa\x02IU\xa2\a3\x8bI\xff\xbao\x94\xaf߬\xf3Or~#\xc1Z\xd78\xb9\xe4\xdc\x15\x8cЕ\xf8F\xbd\x8d\xf2r΄\x95\xf8Fn1*ĭ\xc4\x0f9܇\xea3\x92\x92;B\xeaJ\xfc\x96`\xf0\xaapH\xc8\x19\xc7\xfd\x1d\xbd\xbe\xe4 _\v\xaeƱ*\x0f\x00\xf6\xc4-`\xe4\xda\v\x95E\xde\xed\xa7ԕ\x10\x97\x9f\xad(*;xٺC\x17\xb0\x1b\xe64\xbf\x90\xeco\a˼\xdb/|,\bX`ԗ\xe6Xۯ}\x9f\x92\x84LjXd\xb1P\x9a\xf2/\xbd\xd18\xb0.éYFvd8\x1e\x1cV6\xbeM\xad\x8ajk\x18\xf0\x9b\xd2\xe3\xd5ά*\x99X\xe0l\x8d,N\x14\x1er\xa7d\x16\x0eZ\rH\x87\xab]ݸ\x95\xaed\x95:\x15W2\xc3vT}\x88\xb0\x84\xfe8Ӓ#\xb9\xfc\x1d\x1e\xa9\x90/:\xef\x81/\xef\xb1\xcfh\xfa\x1dP\f\xeb\xc8\x0e\xe5߳\xf4YHu\n\x9d//\xe7L}\x16R\xf1\xc3f\xe5\xf5\xdcbTh\x94{\x162\\\x9a\x91\xbd\xa7#Y)z\xb56\xf1\xe5\xe7\xb3 \xf4YHGfiH\xa8\x05W\xe3X\x95\a\x00{\xec\x04l\xa9\xb9\x14\xc7cD\x02\x81\xf9,\xf0N\xb4H\u05c9V^\x00XbV\x9a\x80գy\x86\xb6\xad\xa9!\xf1c\nBdLeџ\xedYT@\xc0\x00`NV\x94\x80\x85ƺVI\xb3\x06x\x8b\x88)\b\x0fj\xa3\x1d\xeb|\xfe\xca\x02\x04\f\x00\xe6dE\tX\xb9\xa2(w\xb1ɪ\xb3\xc5*\xe1^\x95y\x8c?\x97\x1c\xbe\xbc\x00\x00DaE\tXS\xaak\x9e\x03\xc8y\xc1f\x8b\xc7\xec\xacV\x0e\x89V^\x00XrV\x94\x80\x01\x00\x00\xcc\a\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x16\x100\x00\x00\x12\x96\xff\x0f}\xc6-\xc8\xe3>\xf6\xcf\x00\x00\x00\x00IEND\xaeB`\x82", + + "analysis/chan2a.png": "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x04\x89\x00\x00\x01\x95\b\x03\x00\x00\x00M@Q-\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x00\x01\x00\n\x03\x01\x04\x06\x02\a\n\x06\x0e\x10\r\r\x12\x14\x0e\x12\x1d\x11\x13\x10\x16\x18\x15\x1b\x1a\x13\x13\x1e7\x1f\x1f\x18!# #$\"%$\x1d%%\x1e$%#%'%'(&+)\x1e()'*+)/,!+-*,-+-/,02/63(241564796<9.9;8<=;=>FA?3>@=#CxDA5AB@DFCFHEKHe\xafac`hcQbdaAg\xb2efdCi\xb3ghfMj\xafEm\xb1qjRikhIp\xb4lmkLr\xb7npm{s\\rtqWv\xb6tvsuwt\\z\xbaxzw]~\xb8e|\xb8\x84|dX\x80\xbf{}za\u007f\xbf|~{~\x80}b\x82\xbc\u007f\x81~d\x85\xbf\x82\x83\x80\x83\x85\x82m\x87\xbdh\x88Ð\x86hj\x8ać\x88\x86r\x8c\xc1\x89\x8b\x88t\x8eė\x8do\x8c\x8e\x8bz\x8f\xc0\x8e\x90\x8dx\x92Ȑ\x92\x8f~\x93\xc3x\x95Ē\x93\x90\x81\x95\xc6{\x98Ȕ\x96\x93\xa0\x96w\x96\x98\x95\x82\x9aė\x99\x96\x83\x9cņ\x9b̀\x9d̚\x9b\x98\xa5\x9b|\x87\x9fɃ\xa0Ϝ\x9e\x9b\x89\xa1̞\xa0\x9d\xaa\xa0\x81\xa0\xa2\x9f\xa1\xa3\xa0\xa2\xa4\xa1\x91\xa5ʮ\xa4\x85\x8f\xa7Ѥ\xa6\xa3\x94\xa7̥\xa7\xa4\xb4\xa7\x83\x92\xaaԧ\xa9\xa6\x97\xabЩ\xab\xa8\x9d\xad̫\xad\xaa\xa5\xad\xc1\x9f\xaeλ\xae\x89\xad\xaf\xac\x9e\xb1ע\xb1ѯ\xb1\xae\xa5\xb4Ԣ\xb5۳\xb5\xb2ö\x91\xb5\xb7\xb4\xac\xb7ҩ\xb8ط\xb9\xb6\xb9\xbb\xb8\xad\xbcܱ\xbc\u05fb\xbd\xba\xb3\xbeٽ\xbf\xbc\xb7\xbfԱ\xc0\xe1\xbf\xc1\xbe\xb6\xc1ܹ\xc1\xd6\xce\xc1\x9b\xc1ÿ\xbb\xc3\xd8\xc2\xc4\xc1\xbd\xc4ں\xc5\xe0\xc4\xc6\xc3\xc6\xc8\xc5\xc0\xc8ݽ\xc9\xe4\xd8ɞ\xc6\xca\xda\xc0\xcb\xe6\xca\xcc\xc9\xc3\xceܿ\xcf\xe2\xc8\xcd\xdc\xcd\xcf\xcc\xc8\xd0\xe6\xcc\xd0\xe0\xcf\xd1\xce\xc6\xd2\xe0\xdbҥ\xe1ѥ\xd1\xd3\xd0\xd2\xd3\xdd\xd3\xd5\xd2\xcd\xd5\xeb\xce\xd7\xdf\xe6\u05eb\xd6\xd8\xd4\xd1\xda\xe2\xd8\xda\xd6\xd8\xd9\xe3\xd6\xda\xea\xd3\xdc\xe4\xda\xdc\xd9\xd8\xdd\xe0\xd2\xde\xec\xdc\xde\xdb\xdc\xdd\xe7\xe0\xde\xe2\xdb\xe0\xe2\xde\xe0\xdd\xf0\xe0\xb3\xd5\xe2\xf0\xe0\xe2\xdf\xde\xe3\xe5\xde\xe2\xf2\xe2\xe4\xe1\xe1\xe6\xe9\xe4\xe6\xe3\xde\xe7\xef\xe8\xe5\xea\xe5\xe7\xe4\xe4\xe9\xec\xe7\xe9\xe6\xe8\xe9\xf3\xe2\xeb\xf3\xe9\xeb\xe8\xec\xee\xea\xe6\xef\xf7\xe8\xf1\xf9\xef\xf1\xee\xf0\xf0\xfb\xf2\xf4\xf1\xf1\xf6\xf9\xf4\xf6\xf3\xf7\xf9\xf6\xf5\xfa\xfd\xf9\xfb\xf8\xfa\xfc\xf9\xfd\xfb\xff\xf9\xfe\xff\xfc\xfe\xfb\xfe\xff\xfc\xfa<^\xc5\x00\x00 \x00IDATx^\xed\xbd\x0fX\x15\u05fd\xef}^\xdb\xf7\xcd\xed\xdb\xc5y`\x1f\xe9\x16\nD\xde\xcb{\xc0s\x94\x83xߛ\x8cA\xbc\xafy\xfd\xcbE\xe5`Qo\x8f1\xb4\xc46\x86T\xebc8\xf14\x98\xee\xa6H\x11o\x12RJ\xbc\x1e\"\t\xdd\x16\"\xd1Rk$\xec\xf3\xbc\xb3\xe6\xefZ\xb3g\xefa#\xcc\xf0\xe7\xfbɓ\xbdמ\xf9\xad5k\x96{\xbe\xac\xb5f\xf6\xfa\xfe\x854vD\x00\x00\x18\x17\xfe\xc2In\xa2\xe0T6\x00\x00\x8c\x0e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11и\xec\x14\x00\xc0\xc4\x01%\x02\x94\xbe\xa2T\xb2\xdc)\b\x80\tc\xda+Q}N\x9fSH\x8c\xf4\xe7\xd4;\x85LB\x94v\x88\\\xf5\xac\xac@\xd3\xe9\b\xfb\x00\x98x\\W\xa2\xe6\x10}\xbdT]\xa9R\xa3n\xed\f4D\xcb$\xfe\xcfG\xd7\xe4o\xbb\x125Ğ\x1dd\xbbSH\xcc\xec\x88\xdb\xe1\x14\xe2D\xe7b\u007f\xda\xea\xe6\xb4>q\x1d!\xc4ߥonJ\x89\xde\f\f\xf5Y\xb3\xe7\xd5.\x18u\xb8\xd6\x0e\x91\xaa~\x8a4\xdan\a\xc0%\xdcV\xa2\xbe\xca6\xfav\xbe\xb2\xbdW\xe6X\xe5)e\xeb\x99@Ku\xb4\\\xe2W\v\x0e\xef\xce\xff j\x88-\x15qUN!c\xa0!\xbe\xc2)Ġ\xb9\xddfc\xa3?;\xb0\u007f>!!\xb1'\x18\xdcCZ\xf5\xed\r\xfe\xa7l\xa2M\xcc\xc2*Ha\xfd\x16BF[\x0f\xa3\x1d\"T\xbd\x8d\x04\xed6\x03\xe0\x16.+Qo\xad\xaaDb\xe7\x80\xfc2PݢnnhꉪD\x1f\b\x87\xc4+\x17\xa2E\xd8\xd3\xed\xbb?z@\u007fn\u007f\xf4\x00{\xca|=N!:\xd9+÷\xf5'\xdd;(\x9f}\x06Q\xfa\x87m\xa6\x129a\x14\xd6E\xca\xe4\xd7M\xa3U\"\xa6\x1d\xec\xab\x1eC\x1d\x00\x98\b\xdcU\xa2\xe6\xca\xe6@\x9b\xf9\xf1\xe0S\x97\x94\xf7Ϊ\x81ިJ\xf4\xaep4\xda\xee\x88\x14\xa5\rD\x0f\xe8$\x9d\xd1\x03\xec\x19H+r\n\xd1Y`\xa3D\xf7'*sW\x15D\x19\x96Š\x02Fa\x85)\xb2\x94\x89!\xb2'Z\xb4\t\xd3\x0e\xf6U\x8f\xa1\x0e\x00L\x04\xee*\xd1\xf9\x01\xb1\xba\xcd\xf8\x14\xaaT'\x93\xcf\x06\xba\xc4(Jtq\x8d\xa0\xb0W\x14\x1f\x15\x84#\xe2\xbby\xc2\x06\x9a\xcc;\xbcwC\xfe\xb6\xdf(1\xef>\xb4&\xaf@K\x9b\f&mՓ]+S\x12R\xef\xe9\xe5vWd6\x84H\xa8!s\x0f_\u0095Û\xf37\x1e\xba\xc2\x1d\x82?\x9aܳH<\xcf\x15%\x16\x93\x84\xc0\xa6L\xff\xe2\x1e\xe5Ӟ\x05\xfe\xf9\xb4\xd4\x06\xa2\xb2@\xd9Z\x9d\xe3\xcf\xdcD%!C\x15\x83\xfe\n*'\x86\n\x9cI$$N\x9b73b\x99r\xd9\u0092\xd5\x13\xab8\xcd\x1e\x8d\xaf\x83q4\xae\x1dl\xaaNi\x86\x12\x01oqW\x89d\x18%\xaamR\xdf\x1b\xe4\xf7h}\xa27:\x8e\b\a::\xde\x17\xc5\xdft\xe4\x1d\x10\xaf\xbc\xfa\xc8\x12Q|\xebH\x9ePp\xe0\a+\x1e\xa2\x11//\xdb\xfc\x83\x13\a\x84g-\x19\xdbI\xb3\x96j\x9e\xb3`G\xd3v\xcb`\xa6\xb7\x90d\x91yde\x0f_\xc2\xee%\xfb\x8e\xef[\xb2\x9b;\x04w4\x99\x16\xeb\x95\x1b\xaa\x89')\xdb+\x92\x94;\xe1\xeb|e\re\xbeB\xb9\x03\xd2\x12\xcc\\\x18\f\x06\x95QXQ\\ICEʂ\xcb\xe2`\x1cW\x0f\xa3?r,\x18\xf4i\xf3\xebF,S.S\xd8\x19\xc2L\u007f\x19G\xe3\xea`\x94 \xb2\xed \xdaT]\xbc\xd4ל\x9d\xec\xd0y\x04`b\xf1P\x89\xba+{\x94\xf7P\xd5@t%bGgK\x0e\xc8/\a\x96(\xc9\x15r\x0feg\x81\x9c\xba\xb8v\xdbE\xf9\xf5\x88uJ\xbb\x81t\xab\x89\xf3s\x17\xcbݏ\xc1Z\xeb\xa4Pc\x02I8(\xf2%\x1c\x17N\xc8\x1bN\b\xc7E\xf6\x10lR\xa6\x87\x84M-\xfb\x92{訉\x96\xaa܈j$J\xc9ƀ\xaaAQ\x8f6\xb2_\xec&ܽtvd\x94\xb8\xdd\x12˖k\x16֩\xde\xea:\u007f~\x90?\x9a\x19˖`\xb6\x03%\xbc\xea\xf7\xca\x1d\xadQ߄\x03`B\xf0P\x89\x9aj\x95\xb7\x81@\xe8\xf2\xe5˧\xab\xa3=\xe2k\xafD\xbb\xf5\xe4q\xe1\r\xdbl\xf5\xfa\x15x\x90\x9c\xb4\xd9ݿ\xc97\x97\xa4\xf9\xb6\xf4s%\xecޠ\xbcmxDd\x0f\xc1&Ez9\xef\xb7\x14&\xfa\xd6\xc9/\xdb}\xf2K\xd1\x91h(\x91\x19˖k\x16vVљղ\x824qG3c\xd9\x12\xccv\xa0\x84W\xfdtce\x16\xfaD\xc0[c\xa8\xde;{\x95vU\xc4҂\xa7\x9f\xde,\xe4=\xff\xd6\xfb\x1dy\x8f\xbcz\xe5\x8dG\xf2\xe8=\xb5\x97\xf37\x1c>\xfe\x98pؚ\xb3K\xbfK\xd5<;\xeb[\aKH\xc0\x1a`\xc0\x94\xb0Sx\xe2\xa5'\x84\x9d\xa2\xc8\x1c\x82;\x1a\x1d\xedY\xfbX\xbd\xc1\x84u\xadb\xfb\xba\x84\xa0<\xc6,\x8c\xbb\xbf\xe1\xfe\xb8Be\xc7v_E\xfd\"\u007f\x8f\x9c\xba\x9f\xac\xae\xad/\"Tr\x1b\xfd9U\xf5w\xc5\xcb\xc3$\xe5\x19\xeb\x8a`P\xee\xe7\f\xb6\x06\x83\xbeu\xc1\xe0Y6\x96+\x97)\xac\x82\x145\x14\xa9\xcfX\x1bG\xe3b\x99\xa31\xed`Wu\xca1\xbb!\x1b\x00\xee\xe1\xae\x12\x1dS\xe6\x83\x02\xca𠛹\x85\xd3\xcb\xfc\x04-\x8c\x8b+\x94lj\xf2ަ\x1f\xde-\xcd_\xb6m\x9f <\xfa(\xdd\xf4\xcbe\xf2\xeb\xa3\xf2\xe6\xb7\x1f^\xbbl\xb3\xdeob(\x9b\xad]a]+\xe7&\xe5ԅ\a\x18\x98%\\9\xb4Q\u007f\x9e\xc88\x04\u007f\xb4`\xe2\x16k\xf6bBHB\xa7_~-\x96?U\xccW\x9f\xf0\x91\x19,IN\\ئ$\x1bsS\x92\x17*7\xd4\xc4λ\xfc\xa9K\xe9C\x95\xeb\xb4\xf9\x1cy\xd8\xd5\x16\xa7&+\xd9X\xbe\\\xa6\xb0\xfa\xacĜ\x83s\x95\xd2\xf4\xa3\xf1\xb1\xccјv\xb0\xa9:\xa5/~\xe5\xa9>,\v\x02\xbc\xc3]%r\x9fM\xbeZ\xa7\x90\x98\xd9\xef+\xba\xe4\x143\xd9\xd0\xda!b\xd5보\xd9m\x00Sy\x92\xa6\xa7\xca/\xc1\xff\xf0\xeaƍ\x1d\xbf\x8e\x12\xf0A\xc7\xe6\x03\xec\xe7C\xc2\xf3j\"\x16\x13k\x00f\x16.+\x91\x9d\x1b\xf5\x99\xca\xd3ѲL>\xbeZ\xea\x10\xb0\x8dU\xa2w\xf3\x9eГ1\x98X\x030\xb3pW\x89lݨ\xa7\xb9\x12\xed.\xb8\xa0'c0\xb1\x06`f\xe1\xae\x12ٺQ{\xa8D\xe1&\xd6\u007fX\x93\xb7om\xc1ˏ\xad(\xbd\xc0z_s0Jd8Ws\x85\xc9J\xf4\x98 \b\xf9\xbf\x93\xd3\x17\x971\xeb\xfc\xdb:A\x03\x00\\V\"\xd1\u038d\xfaLe\xd3S\x955A\x0f\xaeQ;\x13\xeb\x97W\b{K\x855O\xafy\x96\xf5\xbe\xe6`\x94\xc8p\xae\xe6\n\x93\x95\xe87;\x85g_\xa3\x9b\xdf\x10:̜\xe1N\xd0\x00\x00\x8a\x87J\xa4\xbbQ\x9f\xad\xac>\xd5\x13\xaa\xdd\xef\xfa\xbd3{\x13낝\xe2qᨸ\xdb\xe2w\xc6`*\x11\xe3\\\xcd\x16&+ѳK^\xd2C\xde6sژX\x03\x00DO\x95Hs\xa3\x16\xc5N\xda\x1d:_\xe5zw\xc1\xdeĺ\xe0\x88\xf8\x9apA|b\xa7\xe8\xacD\x8cs5[ض\x03\a\f\x83\xb6\xa3»fN\x1b\x13k\x00\x80\xe8\xa9\x12in\xd4:\xc1h\x1e@\x13\x82\xbd\x89u\xc1q\xf1\xb5\xf1\xado=\x15\xa7l\r\xefz\x8c\xc5\xcfZ\xe6\xf8\xe6e\x9b\xe5\x0e\x0f}\xe0H\xc8\xfb\xe52\x81\x06\xec\xd6\\\xae\x1f\x16\xe1r\rf\x1c\xee*\x11\x18G\xe0r\r\xa6\x11P\xa2\xa9\v\\\xae\xc1\xf4\x01J\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11\x98VL\x9cM\x1d\x98P\xa0D`\xfa\xd0W\x94J\x96;\x05\x81I\t\x94\bL\x1f\xb2\xb2\x02M\xe1k\xfc\x82\xa9\x80\xebJ\x14\xe6Fm1\xa6v\x97\xa6\x14c\xa5ȱXP;\x19H3\xbc|\xb7Pz\x85ZP\xdf\xfdr\xe4\xa0\x13\x05\xfa2\xd5\xe2\xff|tM\xfe6c-\xb4\xe84$\x8f~\xbdK\xfd\x8c\xd7\x11B\xfcᶻ\xfd\x8b\x92w\x84'9F}4\xbeu\x98ss\xe2\xe8\x86\xfc\x8dG6\xbe\xe4\x14\x16\xc6)\xd2\xe8\x14\x02&+n+Q\xb8\x1b5gL\xed6\r~c\x95\xa4\xb1XP;\x19H3\\\x18\x9d\xa0\x0f\xe4\v\xf1\x8a54\x12e\xa4\xcc)Ď6\x1b%\xca.\x17\xfd\xc1\xb0$G,Gc[ǡ\x83g\xb4\xc3\xdbw\xef\x93_\xf7\x8eI\x89`\xfb6eqW\x89lݨ\xadIo\x18\xab\x05u\fJ\xf4\xf2\xb2\v6J\xb4\x91U\"\x83w\x85Q\x8feD\xb1\x9c\x94;\x85\xd8aw\xe1Ϋ\xea!]aI\x8eX\x8e6\xea\xd6a\xdaaw\x01\xed5\xfe\x12J4\xb3pW\x89lݨ-I\xf78\x93HH\x9c2;\xc5[P3\x84\x9bM[\xb7\xda\x19Hwl[\x9b\xb7f\xdbZş\xe3\xf9\xcd\xcb6\xec\xa5\xeasAxw\xe3\x11M\x89\x8cأڊ\xb1\x9b\xe5\x8d\x1f\xe4\v\x82\xb2\x92\xbexq\x8d\xbau\xaf<\xa6\x91\xdf\xf6\x89Ok{\xec\xab#\xee ʄNO\x92抔\xd4\xc3\xec,&\t\x81M\x99\xfe\xc5t\x9by\xc6\x14\xbb\v\xf7\x9e\xb2{睊W\x16\xcfe\x92\x1c\xda\xd1\xc4XZ\xc7<7\xa6I\x18+n\xb6\x1dV=\xa1\x84\x1d\xa2\xeby\x1b\r\xc5\xd9v\x9b\x8d\xca\xd3\f%\x9a\xba\xb8\xabD\xa2\x9d\x1b\xb5%\xe9\"ǂA\xdfv%\xc5ZP3ؙM[\xb6\xda\x18H\xbfq\xf7\xee#'\x0e\xaf\x11\xfe@\xb7\n\x8f\x1d?T\xb0\xf1\x8a\xa2D\x87\xb6iJd\xc4^x\xb5cCiGG\x87\xe2\xe7\xfaZGG\xbe\xbaD\xf5\x1b\x1dG\x84\x03\x1d\x1d\xefӀ\xb5\x8f\xfe^\xfc\xfd\x81\x15\x1d\x17\"U\x87\xae\xa8_A\xdf\x06\xab*T\xaaX;\xddPM\xbd6\xaf\xa0T\xfd}ى\xd25+J\x8f+\xbf;\x93/\x9d+\x9b\v\xaep\xb1\xf2E\xfaت\xfc\xd2\xd7\xe4\xc4\x1bZa\x87ŋ+\x94D\xde\xdb\xda\xe1\x04}n\x96\xad\x0e\xc3\xc1\x94\xf0;\\\x06\xc5\xf2\x89%t\xfa\xe5\xd7b挕ߝQVr\xc1M\x19)\xc5\x03M\x99\xc9{\xb8$\x8fy\xb4ѷ\x8eyn\xa2\xd9$\xac\x157\xd3\x0e\xca\xef\xce6\x1f_K;BFC\xf1\xb1z\t\x16\xfa\xe2W\x9e\xea\x8b\xf1\xa7\x83`\x92\xe0\xae\x12\x81\xb1paI\x94\x1f\xcd\x02\x86\xfa,B\xeeu\n\x02\x93\x12(\xd1\xe4\xe7Ț?8\x85\x00\x8d\xbeS\x1e<\xac\x0f\xc6\x01(\xd1$\xe7闯|\xf5\x80\b\xc04\aJ4\xb9\xb9 l~\xb4`\x94\x8b\x83\x000u\x81\x12Mr\x0e,+}\xdb)\x06\x80)\x0f\x94\b\x00\xe0=P\"\x00\x80\xf7@\x89\x00\x00\xde\x03%\x02\x00x\x0f\x94\b\x00\xe0=P\"\x00\x80\xf7@\x89\x00\x00\xde\x03%\x02\x00x\x0f\x94\b\x00\xe0=\xae+Q\x98\x1b\xb5(\x0e\xb4<\x15x\xaae\xc0!\xe34b\x92\x98X\x030yp[\x89\xc2ݨ\xc53\xd5u\xa1\x9eP]\xb5g\xeb6\xba\xce$1\xb1\xa6|\xf0~\xe4}\xcd\xed\x91\xf7\x010\xbe\xb8\xacDvn\xd4\xc1Z\xea\x1fq\xa9vFy\x9a\x8f\xda\x1cu\x02M\xac\xa9\xb1\xe1\x8aR-y\xf9\xd2\xe5\xcb\xf2\xff\xec\xdel~\x155\x00&\x10w\x95\xc8֍\xba\xa9^\xf9P\xef\x89\xf9\xa2WĠD\x13fb-\xbe\xb5YмZ\xbb\xb2\xb3\xb2\ue657\x95\xb5\x89\x1d#/\x80\x12\x01\xd7pW\x89lݨ\xfb\xab\x9b\xfb\a\xfb\x83\xd5\xfd\x91rM=Fo\xd3졉\xf5\x85\xbd\xc2ڗ\xd4\xe4%\x1f\xc9͝\xe5\xcf͞\xf5\xc0ymo\x83\xb6\xba\xec\x02Q<\x15OHYWaz\xe2\xe2K\xc5$\xaeZ\xec\xf6\x91,%\xa6:ǟ\xb9i\x06\xcd\xef\x81\t\xc4]%\x12mݨ\xcf7UVV6\xea\x97\xc04 \x16\x9bf\xafL\xac\xaf\x1c-\xc8{B\xedh]|\xf7\xed\xff\xbd\\\x92B\xc3\xd2\xc8g\x97\xea\u007f\x0f\x06Z\x82\x99\v\x83\xc1`H\xfe\xf7\xa9\xadI\xcfL\x9a\xbb\xa9\x90\x9c\xee\r&l\x17\xc5\xd6u\x8aQHQ\\ICE\xca\x02,\x1c\r\xc6\x01\x0f\x95H\xb7\xa0\x1el\xaa\r\xf5\x86j\x9b\xc2\xddF\xa7(\xb1\xd84{fb\xfd\xa8\xb0\xf1--Y*\xfc?\xff\xe7\xacY\xb3ĕ\xb3f}\xa6\x9c\xb9o\xc0\x8c\xce\x16\x90EgE\x91:!\x98\x96E\r\x8a\x17l\x1b\xd9/\x02p\xdbx\xa8D\xba\x05u\xb0\x96z\f\r\xd6N\x1b\x87\x98Xl\x9a=3\xb1~~ɪ絉\uedcf\x1e\xfd\x1f\xff\xef\xff%+\xd1\u007f\xb8wG\x17\xe3\xf7\xc4*\x91Ow#2\x95hu\xc6\xe0%\x99\xb9E\"\x00\xb7\x8d\x87J\xa4[P\aN*o'\x03v\xe1S\x91Xl\x9a\xbd3\xb1~w\x9b\xb0Y\xef\x15\x89\x97\xcf\x06d%\x8ao\xefg\x8d\xe7X%\xca\xd6S\xa6\x12\xcd\xd7f\x92`\xa6\x01\xc6\x01\xef\x94Ȱ\xa0֔\xa8}\xda(Q,6\xcd\x1e\x9aXә\xa2\xbd\xc6-\xb9Z\xaaD]\xdc\bYQ\xa2\xc0i#\xa9\xa0(Q\x19U\xa2\u008cv\x85it\xa7\x01x\x87wJdXP7k\xa3\xb3\xe6\b9\xa6\x1c\xb1\xd84{jb}a\xafPpBK\xdb(Qn\xae(\xf6\x91Z\x9a4\x95ȿU\xeeAeS%jTw\x95\x95\x8b\x00\xdc6\xee*\x91\xad\x1b\xf5\xf9\xfd\xb5\x9d=\x9d\xb5\xfb\xa7\xcfͳ\x18l\x9a\xbd4\xb1\x96y\xabT\x1f\xe4\xd9(\xd1v_E\xfd\"\u007f\x8fx\xa9U\xb9\x8d\xa6\n\xea\u0094\x1d\xe59$\xbe*$\x8a\xf7\x93յ\xf5E\xa4\xdaZ(\x00\xb1\xe3\xae\x12ٻQ\x0f\xb6\xd5Uյ\xb13\x14S\x9d\xd1\xdb4{ib\xcda\xa3D\x83%ɉ\v\xdbD\xf1\x94\xeaa\xad\njWnb\xd2\xe2\xafPkk\xb9W\x94\x9b\x92\xbc0\x8a\x116\x00\xa3\xc6]%\x02.\x12\x9b\x89\xb5\x8d\x12\x01\xe0\x1eP\xa2iKl&\xd6P\"\xe0)P\xa2鉓\x89\xb5`\xe5\xff\x96\x95\xe8\xff\x80\x12\x01\xaf\x80\x12MK\x1cM\xac\xa1D`r\x01%\x9a\x9e\xc4lb\x8d\xd1\x19\xf0\x14(\x11P\x80\x12\x01O\x81\x12\x01\x05(\x11\xf0\x14(\x11\x90\x19ܳ\x92\xfe\x02vk\xcbtz\xaa\vL%\xa0D@&G_\x15\xa4\x0eR\x04<\x01J\x04D\xf1\xfc\x1d\xe5\x924$I#w,\x9f9\xbe\x06`R\x01%\x02\xa28@Hn\xee\x1d\xa9\xb9ٳ\x8a\xf0\xcbz\xe0\tP\" \x8a\x97\x82s\x93\x933\x93\x93\x93\x17\xb5M\x9f\xdf!\x83)\xc5LV\xa2\x95$\xa50\xe4\x1443\x18\xec\xeb\xee\xea\xee\xee\xea:\x8d\xf5\xf1\x817\xccd%\xeam\xae\xcaJ\xc1\xa5\xa7B\xbd\xce,~g\x00\xb8\x87\xebJd\xe3F}\xf9T}\xa0Λ\xceI39\xe5\x14\x02\x00\x98x\xdcV\"\x1b7j\xb1\xa1\xaa\xbd\xfbX\xe0X\xf4\x8c\x13C\x1biu\n\x01\x00L<.+\x91\x9d\x1b\xf5\xc9\x00\xbd_\xd3\x15\xf0b\x9c\x04%\x8a\xc8,\xcfq\xaa!\x98N\xb8\xabD\xb6n\xd4\r\x8dʇj/:EP\xa2\x88\xcc:\xe71P\xa2\x19\x85\xbbJd\xebF]\x17T>\xd5{\xb1\f\xe9)2m\xd6\xf1\x1fo\xa0D\xc0M\xdcU\"\xd1\u038d\xba\xa5Z\xf1\xf6\xa8\xaa\xb3\xcf0\xa1\f\xa6\xe4\xb4\xf4\xe0\x86\x91\x1dP\"\xe0&\x1e*\x91\xeeF=P\xd5\xd0w\xbe\xb7\xbe\xb2\xd6>\xc3\xc4r\x90\x10\xb2\xd4)hF\x02%\x02n\xe2\xa1\x12\xe9n\xd4b\u007fCee\xa0\xb5\xa1\xde6~b\x19Hɨh\xeev\x8a\x9a\x910J4jQ\x1au\xe0\xb9Q\xc4B\x89f\x14\x1e*Q\x959E}\xbe\xff\xb2\xa8\xdcGs\x9b6\xd2\xe4\x142S\x81\x12\x017\xf1N\x89\f7jQY\x9e\xabK\x9d\xbev\x19\xdc;\x8b\b\x94\b\xb8\x89wJd\xb8Q+\xb7\xd0\xce\xd6xr\x13\vJ\x14\x11Y)~\xfa\xb7w\xcc\xfa\xc2?ɚ\xf0\x8d/̺\xe3\xef~%\xab\xc3\xd7?\xff\xbf}\xfe\xeb\xf2\x8e;\xe4\xf4\xdf\xc9\xff\xdf\xf13U5\xbe\xf3\x85Y\x9f\xfb\x06\x13(\xe7\xfc\xec\xdf\xfe\x8a\xd9`\x16\U0005dfda\xf5\xf9\xbf?g*\x91V\xe4\xb9Y4!\x97a\x1eթ\x86`:\xe1\xae\x12ٺQwU\xb6\xf5\x9c\xacn\xf0\xe2\xc1F\xb1\x15J\x14\tY)\xbe\xf0\xe5_\xbd\xf7\xcf\u007f#k\xc2_>\xf3\xde\xcf\xfeNV\x9e\xef|\xee\x99\u007fy\xe6s\xdf9w\xee/\u007fx\ue9f3~v\xee\x9f\xffRU\x93\xef\xfd\x87\xef\xbd\xf7ӿc\x02\xff\xea\x99\xf7\xfe\xe5\xbf\xfc'f\x83\x91\xf8\xe7\xbf\xfa\xe7\xf7~\xfa\x1f\xff\xdeP\"\xa3\xc8Y\x9f{\xe6\xbdg>\xf7ߙ\xa3:\xd5\x10L'\xdcU\"{7\xea\xf6ڪ\x86\xf6ș&\x8c\xc1\xde\xf6\x95\xbe^\xa7\xa8\x99\x8a\xac\x14\x9f\xd1z<\xb3~(\xbf\xfc\x8b\xdc\x0f\xfa\xe2w\xa8v|\xf1ܹ\xff\xf2\xe5s_\x9e\xf5\x8ds\u007f\xff\xff\xa9\x01_\xfc'K \xe5_>\xc7l0\x12w\xd2\xc4\xcf>o(\x91Q\xe4,%q'sT\xa7\x1a\x82鄻J4\xb9\xb8\x97\x90t/n\xd8M\rd\xa5\xf8\xafw\xfc\xe7oPYPEC~\xfd,\x1d^\xfd\xea\xb3r'\xe8\xaf\xcf\xdd\xf9\x9f\xfe\xe6\xdc\x17\xbf\xa7\x89Ư\xce\xe9!\xea\xeb\xcf\xfe\xe6\x8eY\xb3f1\x1b\x8c\xc4\x1d\xea/9\f%2\x8aT\xca\xf8\xd5\x1d\xccQ\x9dj\b\xa6\x133Y\x89\xfa\xda{\x9cBf0T)~\xf8\xe5\xbf\xfd\xec\x97\xed\x94\xe8\xbd;~\xf6\x99\x9f\xdd\xf1\xb3Y\xef\xa9rr\x87U\x89\xee\xfc\xaf?;\xf7\x9e\xad\x12\xcd\xd2z<\x91\x95\xc88\xaaS\r\xc1tb&+\x11\x88\x86\xa6\x14?\xfd,##\xc6P\xeaܝ\xff\xf9?\xca\xffߩ\xa9ʝ\xfa\xe8L\u007f\xfd\x8c,Q\xcf\xd8*\xd1\x17\xbf~\x8e\x8d\xb5\x19\x9dQ\x94\xa3:\xd5\x10L'\xa0D\xc0\x1eY)\xfe\xfa\xbf\xbf\xf7\xde\u05ff\xc0\xc8\xc8w\x94Ye*\x19_\x9e\xf5e\xe5\u007f\x95g>\xa7\xcdX\xeb\x81_\xf8\xf2{?\xfcK[%z\xe6\x8eo\xfc\xea\xbdg\xfe\xdaP\"\xa3Hu\xc6\xfa{\xccQ\x9dj\b\xa6\x13P\"`\x8f\xac\x14\u07fbs\xd6\x1d\u007f\xf3SFF\xce}\xfd\xf3\xb3\x94[\xee\xe7~8\xeb\xa7\xe7~\xaaLC+\xfc\xd3_\xa9w\xf1\xf5\xc0\x1f~a\xd6\xe7\xben\xabD瞹\xf33\xb3\xee|\xc6P\"\xa3\xc8Y4A\xef\xe2\x1bGu\xaa!\x98N@\x89\x80=\xbaR\xb8E\xd8\xf1\xa0D3\n(\x11\xb0\aJ\x04\xdc\x04J\x04\xec\x81\x12\x017\x81\x12\x01{\xdcV\xa20\xa0D3\n(\x11\xb0\aJ\x04\xdc\x04J\x04쉺ؽ+8\xd5\x10L'\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1eו\xa8Y\xb3\x9d\x1ehy*\xf0T\x8b\xba(Q_}U\xa3\x17+6:\xf1\x88 \b\xf9\xef\xea\x9fN\x14\x1c\x8d\x16\xccrtC\xfe\xc6#\x1b_r\n\x03\x00h\xb8\xadD\x9a\x1b\xb5x\xa6\xba.\xd4\x13\xaa\xab\xa6\xeb6\xf6\x04\x82]\xc1@O\xb4l\xde\U0001b38eC«\xfa\xa7\x97\x96\x1d\x89\x16,\xbe\xfc\v=uH\xd8yt\xaf \x1c\x8a\x16=z\x9a\xbdX\xbb\t\x00wqY\x89\f7\xea`-]\xbd\xfaRmP\x14/\xd7е\xf4[j&\xa5\xed\xd8k\xa6\x12\x89W\xa2\xc4\xc9l~XK\xbc}\xf7>\xf9u\xefx)Q\xf6J\xa7\b\x00\xa6<\xee*\x91\xe9Fݤ.QV\xdf$\x8a\xa1\xc0y95\x10\bE\xce\xe7\x1d\xac\x129\xb0QW\xa2\xdd\x05\x17\xe5\xd7_\x8e\x97\x12-\x80\x12\x81鏻Jd\xbaQ\xf7W7\xf7\x0f\xf6\a\xab\xfbeQRm\xa8\x0fz\xb0\xa4\xfe\xbb\x0f\xad\xc9+\xd8\xf6\x9b([u%\xfa _\x10\x04mtv\xe5\xf9\xcd\xcb6\xec\xbd \x8a\x8f\ny\x87\xf7nȧ\xa1G\x05\x95\xcd\xf2\xfeUO(a\x87~Mc\x0fo\xce\xdfx\xe8\n\x17˔\xc0ГDT\x92z\x98\xad\r\xda\xc6\x05\xa2x*\x9e\x90\xb2\xae\xc2\xf4\xc4ŗ\x8aI\\\xb5\xd8\xed#YJLu\x8e?s\x93'ˀ\x030^\xb8\xabD\xa2\xe9\xedq\xbe\xa9\xb2\xb2\xb2\x91\xf6\x86\xeaT\xa3\xb3\x16\xf7\x17r}y\xd9\xe6\x1f\x9c8 <\x1be\xab\xd1'z\xad\xa3#\xff\x80\x9a\xdc-\xd1/\x14~'\xda(\xd1\xe1_\x8b\xe2\xee5Tˎ\xd2{g\xbb\xd7ӹ\xa0+\xebws\xb1l\t\xce(J\x148m$\x15\x14%*\xa3JT\x98Ѯ\xd0\x1f!;\x00S\x01\xaf\x94\xa8Y\x1b\x9d5\xd3\xe7\x89ho\xa8\xd9\xfd\xe7\x89.\x14\x94R\xc9xl\xaf\xf2\xa9{G\xb7\xcdV\x1b%:\xa1\xce\xef\xec{Z䕨\xb4T\x14\u007fO\xf7\xbd}\xb7\xbc\xf5J)U\xa2\xe3J\xec\x11u\x9eȈeKp&7W\x14\xfbH-M\x9aJ\xe4\xdf*7\\6U\xa2FuWY\xb9mf\x00\xa6\x06\xee*\x91\xe9F}~\u007fmgOg\xed~z\xf3\xac'\xd0\xdc\xdd\xec\xc53\xd6/\xe7o8|\xfc1\xe1\xb0\xf2a)\xb9Ǻ\xf5\xd7\xf4\x19\xebg;:\xe4~\xce\xc5W;:\xf2\x1f\xe9\xe8\xa0\xf3\xd8Oܽ\xf3\xc8\xd1ݲ\x9a\xbcߑ\xf7ȫW\xdex$\xaf\xe3}\x91\x8a̳G\xbf\xba\x8c\u07ba\u007fV\xd8\xfd\xd2n\xf5\x19\xeb\x9d\xc2\x13/=!\xec\x14\xf9X\xa3\x84Ѱ\xddWQ\xbf\xc8\xdf#^jUn\xa3\xa9z\xb90eGy\x0e\x89\xaf\x92;\x92\xf7\x93յ\xf5E\xc4\xf5\t\u007f\x00\xc6\x11w\x95\x88q\xa3\x1el\xab\xab\xaakSoX\xf76\x06\xea=q\x85~\xfb\xe1\xb5\xcb6k\xbf&\xabJ\xa9\xb4nݭ\xcd\xe7\xc8î7\xb4\xa4\xa2Z'J\u05ec(=N\x9f\x11\x12\x84\xbc_.\x93_\x1f\x95\xb7^|lU~\xe9kJ\tG7\xe4o>\xbe\x96v\x84\xae\x1cڨ?O\xc4\xc6\xea%\x8c\x86\xc1\x92\xe4ąm\xa2x*N\x99\x0fR\xf5\xb2+71i\xf1W\b)\x96Ӎ\xb9)\xc9\v\x0fF-\x03\x80I\x8e\xbbJ\x04\x00\x00v@\x89\x00\x00\xde\x03%\x02\x00x\x0f\x94\b\x00\xe0=P\"\x00\x80\xf7@\x89\x00\x00\xde\x03%\x02\x00x\x0f\x94\b\x00\xe0=P\"\x00\x80\xf7@\x89\x00\x00\xde\x03%\x02\x00x\x0f\x94\b\x00\xe0=SA\x89V\x92\x94B\xd7\x17/\x02\x00\xb8\xc8TP\xa2\xde檬\x14xW\x000\x8dq]\x89\xecܨͭ\x91h&\xa7\xa2\a\x00\x00\xa62n+\x91\x9d\x1b\xb5\xb95\"m\xa45z\x00\x00`*\xe3\xb2\x12ٹQ3[#\x02%\x02`Z\xe3\xae\x12ٺQ3[#\x02%\x02`Z\xe3\xae\x12ٺQ3[#r\x8a\xb8\xeeA\x04\x00p\x0fw\x95H\xb4s\xa3f\xb7Fb0%\xa7\xa5\xc7u\xf3\x0f\x00\x80Kx\xa5D\x8c\x1b5\xb352\a\t!K\x1db\x00\x00S\x15\xaf\x94\x88q\xa3f\xb6Fd %\xa3\xa2\xd9\xe2\xd2\f\x00\x986x\xa5D\x8c\x1b5\xb35\"m\xa4)z\x00\x00`*\xe3\xb1\x12\xb5\x8fZ\x89p\xef\f\x80i\x8cWJĸQ3[#\x02%\x02`Z\xe3\xae\x12ٻQ\x9b[#\xd2\n%\x02`:\xe3\xae\x12ٻQ3[m\x19\xecm_\xe9\xf3ĭ\x1a\x00\xe0\x0e\xee*\xd1ظ\x97\x90\xf4z\xa7 \x00\xc0\x14f*(Q_{\x8fS\b\x00`J3\x15\x94\b\x000݁\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11\x00\xc0{\\W\"\x1b7\xea\x81`m\xa0\xfeԥh\xb9\x00\x00\xd3\x1a\xb7\x95\xc8ƍ\xfalU}g\xf7\xb1\xaazH\x11\x003\x16\x97\x95\xc8\u038d\xba\xb9\x96\x1a\x99\xf5\a\x8eE\xcb\b\x00\x98θ\xabD\xb6n\xd4u\xb5꾆\b\x99\x00\x00\xd3\x1ew\x95\xc8֍\xba\xb7G\xd9\xd2\xf2T\xe4|\x00\x80鍻J$Fr\xa3\x16\xc5\xcb5A\xfb\f\x00\x80\xe9\x8fWJdq\xa3\x96\xbbDU\xfd\x91\xb2\x00\x00\xa6;^)\x91ōZl\xad\x84\xd74\x003\x17\xaf\x94\x88w\xa3\xbe\xd4\x1c\bE\xca\x00\x00\x98\xfex\xacD\xaa\x1b\xf5@C5\xec\xcc\x00\x98\xc9x\xa5D\xac\x1bu\xff\xfe:\xea\xbah\xce^\x03\x00f\x18\xee*\x91\xad\x1b\xf5\xe9\xc0\xfe\xee\xde\xdeޖZ\xa7\xdc\x00\x80銻Jd\xebF}\xb0R\x05O6\x020cqW\x89\x00\x00\xc0\x0e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11\x00\xc0{\xfe\xe2+\x00\x00\xe05\xb7\xd3'\x02\x00\x80\xf1\x01J\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbcg\x14J$\xee\xc8IIH\xbd\xe7\xa9\x11\xa7\xc0\b\fҌ\xb5d\xb9S\\\xec(%א\x95\xe6\x96\xd1\x1c\x86\xcb0\x16\xf6\x90\"\xa7\x10\x00@L8+QU\"QI\xefq\n\xb5eO\xe2\x904:\x89\x88\x15\xb5d(\x11\x00S\x1fG%\xdaNHn\xcbՑ\xb3Us\x89\xaf\xcd)؆\x11B\xa8^\xf4\xee\t:EƊV2',\xa39\f\x94\b\x80I\x87\x93\x12\x05\t٣\xa6\x86rI\xf2\x9f\xa2\aۡ\xe9\xc5\x04`\xa7D\xa3!\xe6\fV\xa0D\x00\x8c7NJ\x94A6\xe9ɡTR\x12-\xd4\x1e(\x11\x00\xc0\x11\a%:F\xe2.\x19\x1f\xaaɜ\x11z!\u007f\xb3\u007ferR\xceAu\xe3\xe0\x96t_\xf2\xbd\xed4YE\x02\xed\x19\x89\xd9\x03\x92Ժ:\xcd\xe7\xcf*\x13%i\xab2\xc5ԫO\xe0\xf4\x15\xcfMH\xbeW\x19\xe5Ր\x8a?m\x99\xebK/\xbbJ?\x9d\xfdRzB\xd2\xc2*nVOdW\xd8٭\x19\xbe\xe4\xe5!\xa5,&\x03[W\xfe(\x96C2\xe7\xa9*\xd1<\xb2U\x02\x00\x8c\x0f\x0eJ\xb4\x9d,0?\x88\x84\xb4)\x17\xf2\x1c\xdf\xe2\xdc8RL\xb7\xb5\xfb\x89o~\x06!\xe5\x12U\xa2-\xb3\t\xf1\x8fH%\x84\xa4\xcdO\x95_\xaeJ\xf5\xab\tY\xb9zP\x93\x88\x86\x042g\x81\xbc\x83^\xc35dS\x1aIJ&$KV\x8c\xbe$\x92\x9c\x9dI\xc8]̱#\x06\xab\xe8%אy\xa9$U\xde5oDS\"\xbb\xc2Z\x12ɜl\xb9\xb0\xa0\xc4g`\xeb\xca\x1f\x85?${\x9eP\"\x00\xc6\x1b\a%\xba\x87\x1b\x90\xcd%U\xf4\n%\x99\x03\x92ԝL\xea\xe5\x9eB\x12\xd9zM\x92:\x93I\x13U\xa2\xb8\xcc涧\xa46\x92xR\x8e\xee\x9cC\xbee\x8c\xa1\x14\x898\x1dG\xca\xe5˺\xd1G\xaa\xd5r\xe4.J\xd0G\xea$i9)\xbb!\xefO\"-\xc6\xc1\"\ak\x18\xa33\x92\xd1%wm\x12h}\x94\xc3\xd8\x14vi\x0e)\x1b\x91n~\x93̾\xcag\xe0\xea\xca\x1d\x85\xfb\xc0\x9d\xa7\xaaD\r\x81N\t\x000>8(Q6\xd9n\xfd$_\xa1}\xf4\xc3A\x92A\x87HK%\xf5C&U\"u\xcf\xfdZ\xa6\xfb\xa9\x8c\xb1J\xb4R\x9b`\xa9%)#\xb4\x9c~\xfa\xa1\x98v\xae\xd2\xe5a\x96L\xa0\xb0\xd58X\xe4`\rS\x89\xb4]%\xdaal\n\xdbN\xeeQ\xde\x17\x92Z>\x03WW\xee(\xdc\a\xee<1O\x04\xc0x\xe3\xa0D\xf3\xc9\x0e\xe6S\x0e)\xa3W\xe8B\xe5ÈO\xbeR\xe7\x92f\xf5C\x1c\x19\x90\x95(C\x8d\x1bQ\x87P;\xe8\x15\xcb(\xd1H\"\xe9R\xf7\xcf!!\xb9\x9c,\xe5C\x80N /&9\xa1\x1b\x12K\x94`=BW\xa2y\xe6.E\x89\xc2\v\x93\xb2\xb4z\x0e^\xb2d\xe0\xea\xca\x1d\x85\xfb\xc0\x9d'\x94\b\x80\xf1\xc6A\x89\x96s\x93!\x19\xa4\x82^\xa1_Q?\xcd#\xadÄ\xcc\xcbQH m\xb2\x12ݣ\x05\x8e\x84\xea\xcaW\xa7\x13\xb2\x8eS\xa2\x01B\xb4Y\x9e\x85\xf2\xc0\xa8F\xebf(\xe2\x11\xf2\x11\x92\xb4\xbaޜ\x8f\x8e\x16\xac\x1fDW\"uW=}\x8fP\x98\xe4S\xfb7\n\\\x06\xae\xae\xdcQ\xd8\x0f\xfcyB\x89\x00\x18o\x1c\x94\xa8\x8c\xe4\x98\x1f\x86\b\x9dy\xa9ѻI9\xe4\xa0HL\x9ad%Z\xad\xee\t\xa4\xd2\r\xf3\x17Z\x94\xa8\x8f\xc4k%-%U\x92~3]\x15\x97\xbeu~9K|\xc95\xfd`тU,w\xf1M%\n/\xec\x1a!\x83F>.\x03WW\xee(\xec\a\xfe<\xa1D\x00\x8c7\x0eJ\xd4E\xe2\xccK\xb8\x9e$\f\xd1+\xb4L\xfd\x98E\x8e\xc9\xdat\xc6\f֕蛄|\xa9\xa1{X\xaa\x88\xd8'\xcaQ\xba9\xbc\xb8\x8ct\x96\xcf#\xe65\x1e=X\xc9\x10Q\x89\xc2\n\x93\b\xd7'b2pu\x8d\xa8D\xfcyB\x89\x00\x18o\x9c\x9el\xcc4\xaf\xba\xe1\f%]\xa3\x8d\xc1\xae%\xc8\xfd\x8c\x14z/\x89\xd29pCW\xa2\x1bsH\xad\xb2m\x8bE\x89n\xcc\xe6\xa7~\x98\xcb~ \xa4\xa4\xabI\xbc>\xc1\x13%X#\xa2\x12\x85\x17&\x9f\x86\xfa+\x90\xe6\xc5\x01.\x03_\u05c8Jğ'\x94\b\x80\xf1\xc6I\x89:\t\x9d\x1b\xa2\\[J\x12\xcfK\xf4\nMP\xbaI\xfb\xe9\xa3F\xc5$\xfb&\xfd\xd0J|Wu%\x12\xb5[h\xc3i\xf4\xb3ݽ\xb3:\x924b\x1d\xfd\xd0'\v\xa5~\x12g\x99\xf8\xb2\xe6'\x92\xd4\x01\xe6\xc0\x91\x82uԒÕȮ\xb0\xa0\x8f$g'\x93\x84\xa0\xa5\x13\xc5\xd55\xb2\x12q\xe7\x89g\xac\x01\x18o\x9c\x95H\x12+r\x92\xe2R\xee\xa9\xd5\xeeD\xc9Wh\xef\xd29\xc9KO\xa9\x1f\xcfnJ\xf7%f\a\xe88ȸw֖\x9b\xe2\xcb\xda\xfe\xa7a\x1f\xbdc՟;;\xe9\xa0.!}Ei\xbe\xb4\x95\xedZ9J\xb0\xbagpK\xa6ov\xd6v\xf6\xce{\xe4`\r\xb5d\x9b\x19k\xbb\xc2\xfa\x8b\xd3\xe2S\n{%\x8b\x12qu\x8d\xa2D\xecyB\x89\x00\x18oF\xa1D\x16\xf4+\x14\x00\x00\xc6\v(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x9eؕ\b\x00\x00\xc6\x1b(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x9e\xf1R\xa2\xe7\x84o\xdb\xef\xc0\xad6\x00\x80#P\"\x00\x80\xf7@\x89\x00\x00\xde\x03%\x02\x00x\xcf$Q\xa2\x96\\n\t\x8f\x98\x18\xcamq\n\x01\x00Ln\x1c\x94\xe8E\xe1\xb9?\u007f{M\xfe\xc6W\xa4[/n\\R\xf0\xddO\x95\xad?ߵ6/\u007fÓ\xff\xa6|x\xe7\xa1U\xcb\x1e\xfc\xad\xa6D\x1f\u007fw}ު\x87\xdedJ\x90\x95h\xa00ٟ\xd3 ѕ\xa5U\xa71\xa9\x82\xb3\x96\xa5\xeb\x95UHc'\x10\xf7\xad\xa8\xfbK\b!\xfe\x81\xa8!:\x9d\x84\xe4JR\xb3\x9c\xe1T\xe4\xa0\xf6TC\xfa\x86\xb6\xa4\xf9\x97ߌ\x1c\n\x00\x18\x15\x8eJ\xf4\xedU\u009a%\x82\xf0\xca\xe3B\xfe\x1aA(\xa5\x1b\xbf-\b\x05\x1b\v\x04a-ե\x17臼\xbc\xaf*J\xf4\xe62!\u007f\xe3zA\xf8\xbeYB\r\x99\x97L\xe6e\x12R(IW\x13\xd4U\xa3\xa5L\x12b\x8f\xb2?\xaeA\xba\x1dZ\xe3k\xa2\xed\xbe\x1c\n\xd5j\xcb\xf3;1r\x92\xf8C\xd2p399\"q\x9c\xea1ӭs\x9a\xf5\xe4Ҵ\xa7J\x12\x87$\x00\xc0\xed\xe1\xa8D\u0086\x0f\xa5뻄\xfc\xfc\x1fߒ^\x11\x84\u007f\x95\xe5Fȧ\x9d\x9ew\x96\t/H\xd2o\x85\xbb_\xbc%}\xf2\xa0@\x95\xe8\xe3e¾\xeb\xf2\x9eU\xc2+F\tԅ\xbe_\xeeG\xf8\xa9\x89\xc6JRN\xb7\x9d&\xe9\xecA\xce\xfb\xca\xf5\xe4\xd5\xc5c\x1a\xa5\xed\xf0]\x8e\x1e\xd0=J%\x92\x86I\xb1\xdc]\x1b$Ö\xed\vm\x17\xd1\x1f\"\xb2\x04ZC\x01\x001\xe3\xacD\x1f\xcao\x1f\n\xc2s\xf4c\xa9\xf0\xa2$\xed\xbb\xfbIe\xdf>\xe1qI\xda%\xec\xa3\xe9O\xd7P%\xda'<\xa4\xec\xf9\x89\xb0\xc1(\xa1Fs\xcf\xd8O\xad\xaa\x83\xaa\x04\x95\x11Cz(%s\x19\xbf\xc5>i\f\\\x9bˏ\xf6\u0088A\x89N%\x8d\xd8(Q\xce:\xbb\xe8\x01\x82)*\x00\xc6\x03G%ZO߮\v\xc2\xff\xa2\xef\xbbh7H\xba~]\xd9\xf7\x03\xe1\x1f\xa5[+h/I\xa2\"$+\xd1Z\xad/$\x87\u007f\xa4\x97PC\x16)\xef\xc3\xd4Q~$\x99*\xc2\xcdT\xd6\xc7P\xba\x91\xb4]\v\xcdj=Cζf)\x0ed\x03\x85\xa9\ti\xcb\x15\xbb\xa0\xda\x1c\u007f6ݶ\x95$ԕe\xf9\x97^\xe6\x92\n;\x12-\xa3)\xbe\x04F\x89\xf4\xc2$)\xb44=!uy\x86\x92>\x98;'\xeb\x01\xaa\x87\xc3d0\xa7YW\"=\xb6E\xf3\x14\xa0~\xb8C\x89\x84\xc45ҽ7Rԭe\xd4|\x88\xc8\xe2Z\xa18\xc4\x02\x00b\xc7Q\x89\x1e\xa4o\xff.\b\x9f\xd0\xf7݊\x12I\xd7\xdfy\xf1\xfb\xbb\xd6\v\xc2n\xe9\x13APe\xe9Dz\x12}*\b\x1b\xefS\xc8\x13\x8cIk\xc326\x83\xba\x12m!\xf7\xcb#5\x92\xcd\x1e\xa3\x87hv=b1\x99/\xff\xb7\x8e\x8aGgRN\xa0\xbd\x82T\xcb\xc9\x12ߎ\xd6\x1d\xbebI\xeao\x8c'\xa9\x15UI\x85\\R!\x14\xde\xe7aJ`\x94\xc8(L\xde\xf4\xa5\xe6\xf6\xbaTB\xdd\x197\xc5\xdd\xdfZ\x93\x9asSQ\xa2\x9a\xe5\x9a\x12\x19\xb1\xd7B\xa1\xac\xbbB\xa1\xd0YZ\xc2\xe9Pȧί\xf7\x86\x1aIE($Ҁ\xf4-\u007f\x92\xaeV$\x870T\x03`,8*\xd1\xc3\xf4MV\"\xe5F\x99\xa2D\xb7^X#\b\xc2\xdd\x1bKe%\xfaH\x10\xd4\xc0\xd7e%\xfa\xb3`bL\x14Ր\x1djb>i\xa6\xee֩7\xa5\"M\x1e4Z\xe5ΒƱ\x04\x92\xd0F\x13#\xe9\xf7ʝ\x9c\x1bMC\xf26B\xdd=ک\x8eI\xbed\xb9\x13T\x9c*\xf1I\x99\xcbĘD\xd6`J\x90L%b\n\xabM\xa5\x1aT\x9b,\xd1\x1a4(1\x8d\x8a\x12]\x9d}UQ\"\xf6\xc0\xfc\xe8̯\xdf\xe93Gg\x15\xb4\xbf\xf4%\x871\"\x00 \x02cP\xa2焻\x1f\xff\xf1o?\x95\xdfw\xd3n\x90zc\xff'j\x9f\xc8\x18\x94\x19Ԑ\a\xd4D\x069)ѻf\xa7F\xfc\xf1ܴt\x90\f\xaa\x89\xa12_:\x99\xeb\xdb.\x8bG\x1b\xe9\xd5wo\x9a\xaf\xbcͧW\xb9\x8f\xbeT\xf8$>)Q%\xb2\x0e\x8b\x98\x12$S\x89\x98\xc2Ĺ\x99[\xeb{%*GE\x997(\xe9%\x8a\x12I˫\x15%b\x0f\xec\xa8D\x97I\xbf4\x92tR\x02\x00\x8c\x85ؕ\xe8\xfa2:m-\xf3]Y\x89n\xad\x12\xdeQ>|\x9f\xce\x13\xadѻB\xef\xfc\xf1\xdf\xf5\x12j4\x87\xb2!\xd5#\xba\x82lmc=\xcb$\xdaO\xd2FN\x81Ժ~ҿ?u\x0f}\xf2Ș\xf7Y\xa4>\x19\xb9r\xa1\xfc\xa2\f\x8b4%2\x93\x12U\x1a\xee\xb1\x00\x89+A2\x95\x88-l\xa8n\xdd<\x92\x16\x90T\vG\xcajU\x89\x9a\xb3\x15%bc\x1d\x95HZ\xfe\x80t,\xf9\x86\x04\x00\x18\v\xb1+ѿ\xa9\xb7ӤO\xd7\n\xbb$\xe9q\xe1\x1f\xe9\x87\xeb\xeb\xa9\x12}[\xb8\xef\x16\xfd\xf4s!\xff\x13\xbd\x84\x1a2[\x994\xdeC\x94.\xc6 I\xdfj\x19I]\xf3\xe9\x17\xf6\r\xe5\xde\x19\xbd\x9cO\x12\xe3\xf9\x9d\x92L\xe5-S\xe9\x13ER\xa2\n\x9fu\x82\x86)A2\x95\x88)\xec4\xbd\u007f7\xdc试\ay\x99=\nWU%\xba6\xa7\x9d*\x11{`U\x89\x1a.\xa9\xa5\xd9)QKꍒM\x12\x00`LĮD\xff\xbeB\xd8'\xeb\xcd\x1f\x1f\x14\xe8=\xfb\x8f\x96\b\xcfݒ>ݥ\u05faL\xe3)e1Y\xbd\xd75\x9c\xb6\x98\n\xd2W\x94\xfbR\xf4NU#i\x95\"+\xd1\xcdy\xc6OJ\x06\xbfu\xdeZ\x82d*\x11SX\x059F\xb7,\xdeB炔\xb1ݎ=\xaa\x12I%ET\x89\xd8\x03K\x8b\x17Kҟ\xf4!\xa0\x9d\x12\xddHmI\x89\xf2\\6\x00 \x1a\xb1+\x91\xf4#AX\xff\xe0?\b+\x9e\x146ʛ^\xc9\x13\xd6\xfcC\xbe\xf0\xb0\xf2\x8c\xf5\xebK\x84\xfc\xfb\xd6\v\xc2\u05ee\x1b%Ԑ\xa5\x89\t\v҉>q]O,\xbf\xf4\x90\xa4\xb3qU\x92\x95S\xb3\xe7?\xd5v?\xa9\x97\x93\xc5q\xe5\xad\xe5qŲL\x85\x12J\xba\xa4\x9e\x92\x84\x90\xc8$it\xb5\xd9\x01Z\xad\x8f\xfd\xcc\x12D\xfa\x8cuu(t\x89-LV\xa2\xa4\x8a\xd6`\x89r㮜\x145\xb7\x94\x90\x83\xf4\x19\xeb\xe6a\xa93Q\xb9wf\xc6Rͫ\n.\x9d#\x1f\xecFW(\xe4+\tћd\xea\xbd3\xfd\xa6]y&\x06g\x00\x8c\x951(\x91\xf4\xe6\xd7\xd6\xe4ox\xf2\x93O\xf3\xee\xfeX\xfe\xf4\xaf\xbb\xd6\xe4\xdf\xf7\xe6+\xea\xef\xce>z|}^\xfe}/\x98B$+Qy\xdf\xd29\xfeEm\xda\xe7a_ؔ\x8e\xb4cv\xd8&i`]z\xd2\u00a0\x92ܟ\xad?ODHB\xff\x1c\xf9u+\x93\x94w\x84\xfcۍ|\r\xa9u\xd6\x12J\xb4i\xa0\"\xb60\xe9\xe0\xe2\x8a\xf4\x84\xb4\xc5\xea\x13\x04\xed\xf7\xa4$\xd3*v*\x8f\x04\xdd\xccM\xbb\xc9\xc5J\xd2\xc8\xfd)\xfe\xbb\xba\xe5Dw\x9cZX\x1d}8\x8a\x12\u007fV;\x1c\xc1\xe0\f\x80\xb1\xe2\xa0D\xe3\xcfy\xfe\x97\x1e*e\xbe\xdby\"\xb0\xc9W2\tz#þN\xa7\x10\x00@\x04\\W\xa2\x1d\xe4\x9b6[\xab\xd3\xc7\xf4{3\x85\xa1\xb9\xd1\u007f\x8a\xef\x12M)\x93@\x0e\x01\x98\xa2\xb8\xabD\xfd\x83M\xb3}\xa2S\xd4\x14\xa4\xa2SZZ!\x01\x00ƈ\xbbJTH\xc8m\xadD4Y\x19!9[Ӱ8\b\x00c\xc6]%\n$\xa6NG!\x92\xfbDI\xf7\x9cu\x8a\x01\x00D\xc4]%\x02\x00\x00;\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11\x00\xc0{\xc6I\x89>\xe6~\xdf1\x1a\x873\x00\x000\x18\x17%\xba\xf5B\xfe\xa7\xe6'(\x11\x00 F\xc6E\x89\xae\xeb+7*@\x89\x00\x001\x02%\x02\x00x\x8fgJԒ;\xb6\u07fcnqg퍡\\8\x99\x01\xe0\x1eNJ\xf4\xd1\xe3k\xf3V\x94\xfeH\x9d\x90f\\\xef_\x14\x9e\xfb\xe4\xbbk\xf3\xd6?\xf9\t\xf5:\xa3|\xa8g\x91\x95h\xa00ٟC\xfd2\xaa\xc9\\&\xac\xbao\x83 |\x8d\xaeOͺ\u07bf(|\xb7@X\xb6J\x106\\\x97~\xbcK\x10\x1e\xde\xf5\xb1\x9e\xa7\x86\xccK&\xf32\t)\x94\xa4\xab\t\x9a\xa9k&\xbf>\xda\xfe\xb8\x06it\xb0\x86\xf42ų\xffD\xd7ndd\x8c\t\xb0\xc4\xde\x1e\xad\xf15N!\x06\xb6\an\x9f\xb3\xb0\xbe1\x9b\x903\xd2e\xbah\xa4\xbe\xb6\xa3\xd4:\xc7\xea\x88\xc4c\x16\xb6\x9f\x14\xb7l'd\xf4\xf5\x00`\xaa\xe2\xa0D\x0f\vO\xcaݡ߮\x10^\xb7\xb8\u07bf(k\xd0;\x92\xf4z\x1e5\xfa\xb0\x8e\xceHF\xbf|!\xfaI\xad$\xadT\x8d\xa7O\xf3룝\xf7\x19v\xd4W\x17G\x1f\xa5\xf1\x86\xf4\x03\xaa\x8f\xa3\x8fQ\"&\xc0\u07bc~\xac\xec\xf0]\x96F\x89݁\x87\x92V\x8fHҵL\xd5\xefv\xd4v\xd8La\x03ʊ\xbbeP\"0\x03pP\xa2\xf5\xea\xa0\xebG\xbb~nq\xbd\u007fQ\x1b\x8e}\x9b\xae\x1a\x1b\xa6DJ?h?ɠff\x8a\x04\x95\x11Cz(%s\xaf\xe9\xc9>\xad\xd3\x14\tސ\xbeD]݈U\"&\xc0\u07bc~\xac\\\x9bk]p;\"v\a.OT$\xb6\x8a(?ҏA\x89\x8c\u008aS\xa9\xf5\xc0\x19R\x1b-\x1a\x80i\x81\x83\x12}M(}G\xb7.\xe3\\\xef_\xa4r$\xf3\x02]\xe8ڪD\x8b\x94\xf7\xe182@\x17{\x96/\xc1\x9b\xa9j\xcf@\xe3F\x92\xb6\xeetMV\xeb\x19r\xb65\xab\xd6bt\xaf\xdbԳ\x86\xf4\x94\xc1\xf8\xaf(\xef\xbe\xedZ,\x13\xc0$\xb7\x92\xf8\x9aM\xe9)+\a$\v\x03\x85\xa9\ti\xcb\x151\xd3=\xef\x99\x03\xf3u\x90;E\x89\x16\x13\x12>@/\x81\xaf\xa4^u)S\x9dZ\xbfZ\xa5\x14\xa2+\xd1P\"!q\x8dZyz,S.[X\x8a\xdaJ\xfb/\xb1G\xb3o(\x00\xa68\x0eJ\xf4N\x9e \xac\xd8\xf5c\xaa3\xbc\xeb\xfd\x8bZ\a\xe9E;%R\x9d}\xa4\fj伅\xdcOm|\xb2\xd9R{\x88\xb6\xe4\xb3XL\xe6\xcb\xff\xad\x13y\xa3{æ\x9e3\xa4\xa7;\xb4\x01\x93\x8f\xccklI+\xe4\x1c\xeb\x99$-,cOE\x86\xdf\xd2\xdd\xeaL\xca\t\xb4W(^؆\xe7=s`\xae\x0e2!k?\x86\v0J\xe0*iT}$\x8e\xb3\xdc6\xfaD\xa7C!\xbdGg\xc42\xe52\x85\r\x11f.ͮ\xbeL\t\x00Lq\x9c\xee\x9d}\xb8+_\x10\x84\xbco_\xb7\xb8\xdek\xa6\x1f\xaa\"Y\x95H3\x14\x9aO-\x16\xbbH\xeaM\xa9\x88p\x97e\xab\xdcY\xd28\x96@\x12T\xdb\x0f\xd3螱\xa9\xe7\a>\x97\x12\xb6\xaa\t\x1f] qS\xaad\t0\x93\xbe\x8ca\xf9RNϕXF\xd2\xef\x95\xfb'7\x9a\x86x\xcf{\xf3\xc0lR\xa2\x0e\xd3aS\xcbf\x00[\x82y`\xb3ꃄ\xbbCƎ\xce4\xbb4\xf64\xd9\x03\xeb\x85\xf5+G\x90FFF\"\u0557k(\x00\xa62NJ$\xcb\xcc;\xdf\xdf(\b\xffhq\xbd\x8f\xaaD\x0f\xa8\x89\fB}\xe23ɩ\x11\u007f<7-\x1d\xa4\xf6\x86\x94\xa12_:\x99\xeb\xdbN\x17^5\x8d\xee\x19\x9bz^\x89\xb6&h\xf9|\x9b$\xc3v\xd1^\x89\x94i\xa9Z\u00ad\xe8\xdaFz\xf5$\xebyo\x1e\x98MJT\x89\xc2\x1e\x160\x03\xd8\x12\xcc\x03\x9bU\xbf\x11o\xdf'\x92\f%bO\x93=\xb0^ذ\xa23E\xf2P\xedd\x84\xfar\r\x05\xc0T&\xba\x12\xdd\xfa\xa3\xeaz\xff#!\xef\xdfy\xd7\xfb\xa8J\xa4z\x1f\x0e\x11Bgd*\xc8\xd66\xdd\rQ\xa3K\xbf,\x03\xa9u\xfd\xa4\u007f\u007f\xea\x1e\x895uel\xea9\xa1\x11}\xfaS\x8d\xac\x01\xac\xbd\x12)\x17{'\xe7H-U\x13cއ\xf5\xbc\x8fhq\xdd\x1d\xee\xccf\x06\xb0%\x98\af\xaa\xae\xcd\x13\xddh\xd7\xca\nS\"\xf64mOH\x99'\x12\x9bI\xf9H\x84\xfar\r\x05\xc0T&\xba\x12}\"ܭ8.~(\b\xd7y\xd7\xfb\xa8J4[\x99\x13\xdeC\x94?\xe4\x83$}\xabe\x98s\u0378\xf7uC\xb9w\xa6\xd8\xf3\x98\x17\x18cS\xcf\x19җŝײ\x85]\xb8j\x80\x99\xf4)SUu\x8a\x95\xab\xc1IS\x98X\xcf\xfb\x88JT\xe1\xe3\xb2\xf3\x01l\t恙\xaa\x97\xfb\x95\xfa7\x11\xe5\xcdF\x89\xd8Ӵ=\xa1\xe24\xaa\x9cAz\x17\u07fe\xbe\\C\x010\x95q\xbcw\xf65Y\x8a>\xdd%A\x10\xde\xd4\xf3Ԑ\xa5\x89\t\v҉>q]O,\xbf\xf4\x90\xa4\xb3qU\x96-\x9cѽaS/I\xa6!\xbd\xf4\x80>\xcf\xcd\xc52\x01L\xd2Gr\x9a곒\xd5\f\xab\xf5\xc1\xe1\xa9\xd9\xf3\x9fj\xbb\x9f\xd4K\x8c\xe7=S\x18_\xae<\x983\xbaPZ\t\\\x80Q\x02w`\xa6\xea\xc7\xfc\xb9\r-K\xe3C4_\xa8\x96T\x87Br?\xe7FW(\xe4+\t\x85\x86\xd9\xd8H'TM6\xb5\x96\xa8\xcfX\xdb\u0557o(\x00\xa62N3\xd6\xf4\xa7f\xf9\x1b\x9eT\a_\x8c\xeb=\xafD\x1f\x96\xe6\xaf\xf8\x89\x9e\xa5\x86\x94\xf7-\x9d\xe3_Ԧ}\x1e\xf6\x85Ϸ\xec\x98m\xd9\xc4\x1b\xdd\xeb6\xf5\x12cH\u007f5\xb1\xd86\xd6\b`\x93\xbe\aJ\x92\xe7\x16k\xbd\xad\x86\xd4:-\xe7\xc0\xba\xf4\xa4\x85A%\xa9{\xde3\x85\xf1\xe5\x86\xfc\xdaCOf\t|\x80^\x02w`\xb6\xea}K\xfdi\xab\xfb\xe5D\x896\x9fS$\xf7\x8d\xe2\xd4d\x1d\x1b\x1b\xf1\x84\x82\xf3\x12s\xdb\xd2\xdb\"ԗ?\x1a\x00S\x19'%\x1a\a\xce\xf3\xbf\xf4P)\xf3\xc5\xfa#\xd6r\xee\xe1H\a؇\xb0\xc7F\x93\xaf\x04\xee\xd2\x00\xb8\x85\vJ\xb4\x83|\xd3fkuz\x8c\xf3\xac\x9bbY\x0e䶕hh\xeem\xff\x14\x1f\x000j&Z\x89\xfa\a\x9bf\xfbD\xa7\xa8q綕\b\x00\xe0&\x13\xadD\x85\x84\x8cq%\xa2\xdb@\x9d\xd5\x05\x00L\x19&Z\x89\x02\x89\xa9\xae\v\x91:\xab;\xe8\x14\x05\x00\x984L\xb4\x12\x01\x00\x803P\"\x00\x80\xf7@\x89\x00\x00\xde\x03%\x02\x00x\x0f\x94\b\x00\xe0=\xe3\xaaD\xfaB\x8e\xd1y\x8e.}\xad1:o4\x00\xc04\aJ\x04\x00\xf0\x9eqU\xa2\x0f\x9f{\xdd)D\x82\x12\x01\x00\xc2\x18W%\x1a\x1dP\"\x00\x80\x85i\xa7D-\xb91\xfe\xb26*[b\xf9\xd9-\x88\xc2diɡ\xdcQ{\x81\x8f\x85\xc9r\x9aS\x0f\a%\xfa\x91\xf0\u009b\xeb\xf3\xff\xe1#u\xa1\xa2U\x0fiˡ}\xb4o\xfd\x92U\x0f\xabk\\3;\xe8<\xd1\x0f\xb4\x85\x8b\xa4Dž'%K\xb6w\x1eZ\xb5\xec\xc1\xdfZ\x94h\xa00ٟ\xd3 \xd1u\xc1\xe6\xa9\x1b+\xb8\x95Ն\xb6\xa4\xf9\x97\x8f\xdaG'0\xae\xbfr;Cʥ\xad$.\xd6\x05L(\rt\x15\xa2\xd4{{\xa4qf\x13!t\x95\xb9*B\xac\xdf\xf9\xf6\xd4\t\xbd\xc6n\x8f\xc9Ӓ\x818\xfbU\x16ƥ\xf9n\xe34\xc7H0^[\xfc*>\xbaǹF\xdf\xd29iE\x9di\u007fR\xd6\xcc\xf2\x0f8\x85+t\x12\x92+I\xcdr\x86S\x91\x83\x98\xe6c\xae\xd8\x18\x1a\xd5Q\x89\xbe\x9b/\bˮKo.\x13\xf27\xae\x17\x84\xefӭ\xaf\xe7\v\xcb\xee[#P\x8bjn\aU\xa2?\nyʲjחQ\x93X.\xdb\v\x82P\xb01/\ufadc\x12\xcdK&\xf32\t)\x94\xa4\xab\t\x9a\x1dl&\xb7\xb2\xdaҴ\xa7J\x129\x8f\x8e(\xec\x8fkp\n\x89\x8a\xc5\xe0\xbex\xf6\x9f\xe8\xcfi\x19qc\x02NE\xbd6\x86\x1bȷ:\x1brug\xb7qCL\n\xd0\xc6\x18\n$YW8h\x9d\xa3\u007f\x17\xa3\xd7\xcc\x1d&YK2\x87h\x8d\xb7\xb5\xf76\x9b/\x16\xc6\xef4\xc7\x18\x10 ڂ\xa0$`\x93A\xc5\xcc\xd6>ga}c6!g\xa4\xcb4\xdb\xe8~&>r\x92\xf8C\xd2p39iY\x04\x9a\xad\x0e\xd3|\xcc\x15\x1bC\xa3:*\x91\xb0\xfe\xf57_\x94>^&\xec\xbb.wjVQ\u007f\x8f?/\x13\x9e\xbc.\xddz\x8e\xae\xac\xcf\xedP\ue755\n?\xa69_\x176J\xfc\xde\xdf\nw\xbfxK\xfa\xe4A\x81S\"\x92\xd1/7\x90\x9fZ.\xafT-\xabOs+\xab\r\xd1\xc5S\xc3V\xb6\x8f\xc0y\x1fgz\x1d;\xbc\xc1\xfd\x80\xea!\xc9.1\xc2\x04\xf0\xb1a\xf4)\x16e\x8b\xb2\xa2\x06\x8d\x81lUk\xeb9/K\x1e\x87\x9a\x8d\vW\x17G\x1f\x05O\xb2\x96d\x0f\xb1\xc3wY\x1a/\xc6\xf14\xc7\x16P\xed\xd3\x16IO\xe4\\\xad8\x8clCI\xabG\xe8\xfa\xeeꢃ\xa3vH\x1f&\xc5%\xd4\x1a\xc3z\x19\xda\xd77\xa6+\xd6\xc4Y\x89>\xa4\xef\xfb\xb4\xfb\xf3?\xa1&\xd4O\xd2\xf5\xf5%\xaa9/\xf2;\x14%zQݻKx\xc1\x92m\x97\xb0\x8f\xa6?]\xc3+\x91\xd2\x0f\xdaO2\xa8\x8b\x85\"Ae\x84\x95\x93\x012\xea\xfe\x9d$\x95̽\xe6\x14\x12\x1d\xde\xe0\xbeD]Y\x89\xfdb\xd9z\x1a٢^?\xfb\xc9m\xd6(\x8cBuy\xf0\x1d\xbaS\xad\r\x0e5\x1b\x17\xfa\x88\xc5`\xd7\xc2$kI\xf6\x10\xd7\xe6Z\xd7U\x1f;\xe3x\x9ac\v\x18\x19\xd0$e\xc0\xd2aa0\xb2\x95'*\u007f>\xaa\x88\xe2W\x1c\x83\x12\x9dJ\x1a\xb1Q\"\xfb\xfa\xc6tŚ8*\xd1z\xe5}\xad\xe6uv\x9d\xda/n\xd0>|\xfc\xf1-~\x87\xa2D\x9f\xe6\t\xd4\x0e$\x9f\xbe\xb2{o\xad\x10\xfeU\xf9\xb0\x8fS\xa2E\xca\xfbp\x1c\x19\x90F\x92i\xd3\xdcL5\x97\x89\xbd\x91\xa2\x8e\x81\xcb\xe8J\x1fq\a\xa5A\x1f\x9dK\xe2\xad\xe1\x19\xaf\xfb\x1bI\xea\xd2ӽ\xf2\xd8y\xc7@q\x86\xff\xde\x1b\x15r\xeeF\xa9\x91\x18\xeb\xfb+؛\xcb\xf3\x06\xf7\xf2\x1f\x81\xf8\xaf(\xef\xbe\xed\xe1\xa6\xf5Lr+\x89\xafٔ\x9e\xb2r@\xe2P\xaf\x9f\xe2t\xee\x10\x92\x14Z\x9a\x9e\x90\xba<Ú\xcd\xd6\xf6ވeK(W\xff\x10\x15\x95\xb3\xa7)\r%\x12\x12\xa7x\xc1\xf2g\xa1gccm\xe1\x03\xcc\xfa\x0eo\x9f\x97tW\x97\xba\x96\xb6AMV\xeb\x19r\xb65\xab\xd6˖4j\xc6|5$ۦ\xb6VgG\xa2\xf5\xaa5\x9b\x8f?!\x1d\x17N\xd3\xfe\xdf-\xcaY\x98\x98\x92\xe2\x90M\xf3\xe0\xbbZ5\xc2gӿ}\x11\xber\xc3d0\xa7YW\"=\x96-\xd7l>\xe6\x8ae\xb62\x85E\xfc\":*\x91\xd2\xc1\xf9T\x106ާ\x90'\xbc)-\x11\xfe\x97\xbe\x9fߡ>\xd9\xf8\xb0\xdcU\x92{A\x0fZ\xf6~B=\xd3(?攨LMdP\xa3\xe5-\xe4~j\x9dÌ;zC\x8d\xa4\"Dm,\xd4\xd1wW\x89\xcfb\r\xcfxՄ8\xd0\x00\x00\t)IDAT\xddK=\xda\\\xc2HScFVRFY1\xb9t\xb5(74,\r\x87\x16\x15\xb1\x83\t{sy\xce\xe0\x9e\xee\xd0z\xf1\xf2w\xbc\xb1%\x8d7\xadg\x92\xb4\xb0\x8c=\x15\x19~\xbe\x93\xd0GZG\xcen'{\xb8C\xc8\xff\xfa_jn\xafK%7\xf8l\xb6\xb6\xf7f,[B\xfdB\xa9+\xa3KʩgOS\x1eӆB\xea\x9fb\xee,\x8cl\\\xac\x1d\\\x80y\xb4\xa1\xcc\xd4@\xdbVBj\xb9`\xb1\x98̗\xff['zؒf͘\xaf\x86}S[\xab\x13\n\xef\f\x18\xcdǝ\x90\x81\v\xa7i\xff\xef\x16\xe5,L\fIq\xc86\x12g\xefKl|\xfb\"|\xe5d%\xaaY\xae)\x91\x11\xcbU\xc7h>\xe6\x8ae\xb7\x8e\xe2\x8b\xe8\xa8D\xbb\xe8۟\x05\x93W\xe4\x0e\xce\xc7\xfa~n\x87\xa6D\xaf\v\xa5\x92\xf4\xa0\xf0\x13\xcbޏ\x04A\xcd\xf3:\xa7DZWe>5g\xec\"\xa97\xa5\"\xc25\x97\xd9\xd7c}\xc9\fkx\xc6랺\x82\r\xe8\xd9r\xc8\xd2ae\xb4ڠ\xfe\xa5\x9coq\xe2\x89`.\xcf\xf67/%l\xd5b\xd3\xe4\xd27\xf1\xa6\xf5\\җ!\x1fh(=Wb\xe9S\xfe6(~$\xcc!jS\xe9?rm2\x9f\xcd\xde\xf6\x9e\x89eJ\b\xa5J\xdb}ۥTEt\x8dӤ\xf8\xf5A\x81Q3\xfe\xdc\xd8X;\x8c\x00&[\xb1bGWfQ\"\xb9\xc6\t$A\xed'yՒl\xcdX\x1b:ۦ\xe6\a\x12\x97\x89\xdd<\xaa\xde|\xe6\t\xb1L\xfci\xda\xff\xbbE>\v\x13]R\x9c\xb2\r\xf2\xe3&=\x1b\xf3\xed\xb3\xff\xca\xc9Jtu\xf6UE\x89\xd8o*_\x1d\xe3\xdbǍδ\xad\xa3\xf8\"\x8eN\x89>\xa5c/\x9d[\xda\xdcQ\xd8\x0eM\x89\xae\xaf\x10\xfe\xf8oB\xfe\xa7\x96\xbd\x9f\xeaF\xb1?\xe1\x94\xe8\x015\x91ANJ\xf4\xae٩\x11\u007f<\xdb{\x89\xa0D%z\x92\xf1\xba\xa7\x13M\xc6B\x8d9>Mr{\xe3F\xae5\f\xdd\xf01a|\t\x9c\xb9<۶[\xf5e\x1f\x15\x13\xec\xa8\xde\xd7\xca\xc4V-\xe1\xee\xf0\xf5\x91\xaa\xae\xd6\\?-\x839\x8487sk}\xaf\xe6zkd\xb3\xb7\xbdgb\x99\x12.\x91kw}iѰ\xfa'\xc58MJ\xb8\x12\xf1\xe7\xe6\x8b\xd0\x1d\xd21\x02\x98lj\x99\xfd\x16%\x1a*\U000e54f9\xbe\xed\xf4\x84\xbdjI\xb6f\xe6W#BS[\x95\xc8\xee6\xbb\xa1D\xc6\t\xb1L\xfci\xda\xff\xbbE>\v\x13]R\x9c\xb2݈\xb7\xed\x131\xdf>\xfb\xaf\x9c\xacD\xd2\xf2jE\x89\xd8oj\fJ4\x8a/\xe2\xe8\x94HZ\xa3M\xf8H\xef\xfc\xf1ߥ\xf5\x82\xfa\xa3\x8eW\xbe\xf6\x02\xbfC\xfb\xdd\xd9w\x85\x17_\x14\xfeњ\xed\xd6*A}\x00\xe9\xfb\x9c\x12\xa9\xa6\x88C\x84пp\x15dk\x9bn\x93\xa8a\xafDF\x92\xf1\xba\xa7}*\xa3ם\xa3\x8f\xa6G\xe2\xfb\xaaȎ\xb3q\x96\x99\x01\xb3\x04\xce\\\x9ei[ѧ?\xb0\x13f\x15-Y\x92j\x17\xb4\xd3tj\xa4(\xb3\x1bCq\xd4،=\xc4Pݺy$-\xc0g\xb3\xb7\xbdgb\xd9\x12|}I=I}\t\xca\x03\x1b9\xec\xa4A\xb8\x12\xf1\xe7\x16>\xc1\xc0c\x04\x98\xd9.\x13\xc5\x1dnآD\x81Ժ~ҿ?\x95\xb7\xafu\xb5%\xb9\x9a\xd9ׁij\xfe\xa2\xe9\x0e7\xe0\x93\x18%b*i2\xf1\xa7\x19\xe1\xdf-\xe2Y\x98\xe8\x92\xe2\x98M\x9b'\xba\xd1\xceec\xbf}\xb6_9\xaaD\xcdي\x12\xb1\xb11(\xd1(\xbe\x88\xa3T\xa2o\v\xf7ݢ\xef?\xa7w\xee\xf7i\x0f/>$<\xc7\xefД\xe8\xb7\u0083\x0f\xaa\x96\xb0\xdc\xde\xc7Uu\xba\xbe\x9eS\xa2\xd9ʈr\x0fQ\xb4v\x90\xa4o\xb5\xf4\x9c-J\xb4âD'\xd9\u007f\xcdk\xe6M\x8b\x1cc\x9c?\xaf\xf1\x9eE\xf3\x82\xf3$\x1e\xb3\x04\xce\\^i\xdb\x06E\xb2\xcb\xe2·\xc5r\x01fҧLv\xd5\xf1\xf7\x16\xd4y\xd6d\x9a\x979\xc4i\xfa\xd7p\xb8\xd1_\xcbe\xb3\xb7\xbdgb\xd9Jf\x05\xe6J\xe9Uj\x0e\xf34%\xab\x12њ\xf1\xe7\x16\xe5n\x9b\xc4\x05\x98\xd9n&*eZ\xfbD\xf2\x1fMz\xefL\xed\xd9yӒ\\\xcd̯F\x84\xa6f\x8fFk`7F\x1d\xad\x12M\xd4i\xda\xff\xbbE>\v\x13]R\x1c\xb3\x95\xfb\x95J7\x91\xabl6\xe6\xdbg\xff\x95\xa3JtmN;\xad.\xfbM\xe5\xab\x13U\x89F\xf1E\x1c\xa5\x12}\x98/<.\x8f\xad~\xbbJ\xf8\xae$}\x9c/\xfc@y\x9ehٟ\xf9\x1d\xfao\xf1\xd7\xe7\xe5\x15\xdc\n\xcb\xf6\xd1\x12\xe1\xb9[ҧ\xbb,\xcf\x13e_\xa66\x87Z\xeds\x89?\x89x\xe7E=Yo.\xb4(\x11\xe3u/\xb3.\xf3\xa6\x16l\xcau\xd1V\xdf1\xb2\xd5\xfa\xe4\x83Y\x02g.ox\xd2\xcb\u007f\xe1J\xc2c\xd9\x00&\xe9K\x1b\xa6Oi,V\"\x06\xbf\xa5~!\xd5\xeb'\xad\xaco\x0f{\x88\nrLɻ\x85\xcbfo{\xcfIJ\x95\\\x9e[(\x15\xe6.U\x0eb\xffWɨ\x19wnl\xec`\x85\xe5\xcf1\x17\xc0d[\x97J\xbf<\xc5a\xf3D\x92\xa8L\xd3H\u07b5$[3\xf3\xab\x11\xa1\xa9٣I7\xe7\xa9\u007f\xd8-\x8cV\x89\xc6\xfb4M\xec\xfe\xdd\"\x9e\x85\xde:\x92))\x8eن\x92\n\xe5\xab\xe5\xe6\xe2L.\x1b\xf3\xed\xb3\xff\xcaQ%\x92J\x8a\xc80\xffM\xe5\xaa\x13]\x89\"~\x11MF\xa9D\xd2\xebK\x84\xfc\xfb\xd6\v\xc2\xd7\xe8\xfd\xaf\xd7\xf3\x84\x15\xf7\xad\x12\xf2^\xb7\xecЕ\xe89A\xf9\xa5\x875\xdb+y\u009a\u007f\xc8\x17\x1e\xe6\x94hib\u0082t\xe3\x1e{=\xe1~\xe9\xa1\xcd\xc4k\x9d\xc8\xd4\xca=\xb9$\xbe\xa1\x9f\xb3\x86g\xbc\xee%\xe9l\x1c\xfd%\x045\x9f\xa7\xd3\xfa\xea\xa8\xfd[\xfe\xe4\x9bY\xfe=l\xa9\x91\xcd\xe5MO\xfa\a\xf4\xd9\xefH\xa6\xf5L\xd2Gr\x9a곒\xd5\f\xab\xb5\xe1e\x9f2\xabw\xcf\xf2\x92\x05\xec!*HREk\xb0D\xb9\xc9\xc7d\xb3\xb5\xbdgc\x99J\x96\x91\x80\x14\xa0w\x19\xd9Ӕ\xd3!_I(4\xcc\xd7\xcc\xc8\xc65\t}\x884iH\xe2\xe0\x02̣\x89i\xe9\xb5ͫ}\xe1J\xa4\xe1]K\xb253\xbe\x1a\x91\x9a\x9a=\x9a<\xa2\x0f\x93a\xb3\xf9\xf8J\xeaL\xe4i\x9a\xd8\xfc\xbbE>\x8b\xd5\xc64FO-\xa9>\xad\xa4\x1c\xb3\x1d\xf3\xe76\xb4,\x8d\x0f\xd1Z\xaa\x8ff\xd3\x1e\x8d\xf1\xed\xb3\xffʍ\x9c$\xcd\xc3Rg\xa2҅3c\x99r\x99o\x1fsŲ\xdf\xc9H_D\x93\xd1*\x91\xf4\xd1\xe3\xeb\xf3\xf2\xef{A\xbd\x11\xff\xe1\xe3\x05ykv}hݡ+\xd1\xc7\xe6\x9c6\x97\xed_w\xadɿ\xef\xcdW8%*\xef[:\xc7oX\xbb\x0f\xfb\xb8!\xfcH\xb22\xba\x8cW\xee\x14\x0e,\xf6'--\x0f\xf3\xafg\xbc\xeeeѝM\xb3\xf7\xaa\xe6\xf3\xea_\xbe\xd3\xc9ߔ\x02I\xdd\x12KDsyÓ\xfejb\xb1m,cZo&}\x0f\x94$\xcf-־\xb9\r\xa9tBC\xee\x01\x13\xfa\xfc}_Vj+{\x88\x83\x8b+\xd2\x13\xd2\x16wZ\xb3\xd9\xd9\u07b3\xb1L%[\xfd\xbdRߜ\x16\xfe4\xbb\xd54\xa9\xe3kfd\xe3\x9aD\xaed\x12\xe1[\xc4\x12`\x1e\xedjI\xba\u007f\xe9\xe9\x88J\xe4]K\xb253\xbe\x1aR\x84\xa6f\x8f\x16\xf2o\x97\xac\x98\xcd\xc7WRg\"O\xd3\xc4\xe6\xdf-\xe2Y\xe8\xad#\xf7\xad\x92\xe4C%\x0e\x8f.[\xdfR\u007f\xdajY\xb0\x95ߝQ\x94\xc1\x82\xfe\xed\xb3\xff\xcau\xcaaM\xd2\xcdܴ\x9b\\,S\xae\xd9|\xec\x15\xcb}'#|\x11M\x1c\x94\xc8m\xces\xbf\xf4\x18\x03e\xbe&\xa7\x90QQn>^\xe9\x8c9=\x15\x13c\xcc6.\x04\xc3\x1e\x98\x8d\x86u\xc6:\x16&\xb6%c\xafY\x93\xaf\xe4\x86S\xcc\x18\x98\xd8Ӝ\x01L2%\xdaA\xbe\xe9\x14\xe2@u\xfaU\xa7\x90Ѱi\x934z\xc6\xf8\xc5\x1ac\xb6\xf1\xa0!y\x8bS\bK\xec\u05fb\xc9Ķd\xcc5\x1b\x9ak\xffS\xfc\xdbe\x8c\xa792\xa8\x12\xf9\xa7\x1a3\x85ɤD\xfd\x83M\xb3}a]\xd6)@\xcc\u05cf\xca\x18\xb3\x8d\x03bjYL_\xfd\x98\xaf\xf7\xb1\x12s\x93\xb8V\xb3q\xc5<ͻ\xb4A\x92u\xf2z\xe61\x99\x94\xa8P\xfe\x17\x89\xf5\x9b8\tPg(cf\x8cټ`\xe0\x18)s\xa3\xaa\xb17\x89[5\x1bW\xd8\xd3\x1chQ\x19\x88\x96aF0\x99\x94(\x90\x98:\x05\x85H\x9d\xa1\f\xbf\x17\xe0\xc4\x18\xb3y\xc1\":\a9\xe0\x14u\xfb\xc4\xde$n\xd5l\\\x89\xfd4g\x02\x93I\x89\x00\x003\x15(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\aJ\x04\x00\xf0\x1e(\x11\x00\xc0{\xa0D\x00\x00\xef\x81\x12\x01\x00\xbc\xe7\xff\a\xfd\xa4@\x82&\x8eJ\xdf\x00\x00\x00\x00IEND\xaeB`\x82", + + "analysis/chan2b.png": "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x04Q\x00\x00\x011\b\x03\x00\x00\x00\x83\v\xcdh\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x00\x01\x00\x03\x06\x02\b\n\x06\x0e\x10\r\x19\x1a\x18!# #$\"$%#%'$&(%'(&()'*+)+-*,-+-.,01/2313425747968:7:;9<>;>@=AB@CEBEGDFHEIKHKLJMOMPROSURUVTVXV,`\xae7]\xad[\\Z8^\xae8`\xaa]^\\:b\xab;b\xacIH=\x88k\x89Z\xcfsS\xdb\xe7\xf4L\xf7\xe9\x99\xd3Ӄ6\r\xcc\xfc>\u007f̜9\xfd;\xa7\xcf\xe9\x9e\xfe\xce\xe9\xd3=\xfd\x1d\xf3\xeb+\x80\x00\x00\x00h\xc6h\xa9\x867\xb4*\a\x00 \xc0\x00E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14\x05\x00\x00\xfd\x00E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14\x05xE\xfa\xb5\x02\x80@\x02\x14\x05x\x15Z\xe2\xa7poi\x05\x01\x01\x04(\xca\b\xe6PD\xabV\x881\xb4E\x1cb/\xe8\x9f=\xdb^\xde\xc4^\x06\x04$\x06)ʱzW\xaa\xfe\xf0\xee\xfc\xf38\xd1Q\x95o?t\xa9\xc7-\xa9\xc6\xdfv,\x89I\xee\xf3\x16\xe1A\xe1XNd\xec\x01\xadPL\xdd\xfc\xd0)\x8b\x8fM\xb9\x87\xe2\x85\"\xa1\u05f5\xc2\tG9.\xa2\x1f\x1d\x10\n|\xa3\x1eT>\xb9ȕl]1%dA\xbf{\xae\x1a\x9b\xb9\x8dZ!/AM\xdc\x19\xad\x10\xc2i\x13/b:!4%\xe8\vf\xd0%\xee03\x1f\bX\x8cQ\x94{\xd9߉\x89\x9er\xfb\xa9\xa6\x8b\xd97\x10j\xcf=T\xd7t~wa\x8f\"\xa9\xca'q_\xa7\x9b\x9fx\t\xf0d3WU\x95\xc9m\xad\xaa\xe26\xab\xc6\x1c\xbd\xe8J\x1d\t\x8d\xb0\xef\x9f\xc3q\xf5\xe8\x16.vJ\xb5\bMW9\x17R\x85:\x0ep\xe5]\xca\x05r\xbd\b\x95\x84J\x8a\xf6\xe6\x94\xcc\xf8\x906\xf7\\\x152\x83v\x8b\t\xba2&\xb5\xd7\x06\x11p\xd6|B=\x90\xe2 \xefp\x94\xf2\xc5\x0eǼ\x83§\x92\xb1\xdbYA\xdfq\xc7Y\xd9@\xe0b\x88\xa2\xb4\xe4\xbb\x14\xa5\xdc\xde\"\xfcRg\v#\x96o\xf2\xf1ou\x9b\xfd\xbc\"\xa9\xc6c\xbe\x14\xf5u\xaa/g\xb1u*\n\xea\xe0\x96\xc6#\xd4\xc4u\xb8\xe5K\xf5b\xa4\xa9\xcb6n;\xeaw\x85jMh\xde\x18\xbf֙RT&\xd3\x1a\xe9:'Z\x9d\xca\f\x90Q\x04\xf88\xd2+6!\xd4\xc0_E\xc8\\\x8c?\xae\x0f\xbe\xc5\b\xf2yC\x01\x81\x82\x11\x8ar,\xfb\x98]T\x94\x96\xec\xef\xf1\x1b\xfe\x95.\xcc'9G\x8b\x14I5\xee\xf2\xbe\r\xd5i\xban8\xbf\xf17\xdc\x06\x10\x14\xe1\xef8\x13kC\xee\xe1\xb7-\u070f\xf8\xcd\xe7\x03\xa5\x83\xfbf\xc2S\x86\xa2H\xf5*\xb8\xcei\x9e\xe9\xc8\xc4OuUʮ\f\xd5qu\xce\xd4J-E\xd1\f`\xd0}ש(w\xbb\xf1ǎ\xa9\xf1\x8c \x9f7\x14\x10(\x18\xa1(]OQ\x9e\xa8(\xa7\xec=\xae\xdf\xe6\x96;\xe4\xed\xe4\x01E\x92Io\xacxB\xbf\v\xa1\x9d|T%\xbao\xe2\x97㤩lW\x82y\xc3\x03\x12s75\xd6\x14\x97\xfc\xc0\xbd\xa8\xfc\x8dϋ\b\x9d\xb5\x8a\x1c\xa3\xc7\xe7O\x1f\x17\xb6`\x06BE\xcey\x96p!s\xa6x\xbc\xb4n\xe9R\x16\xcb\f\x0f\x9d\x93\x89\x14\xc5\xe8\xca:\xb8\xa6\xf0|\x97\xa2\xb8b\xe9z\xdbB8.h/^\xda\x13&\xe6\xaeR\xe4R\x95]\x1a\xcbq\xeb\xaf/\x9d\x112\x1f\x9f\xfe\xf5L\xfc\x98,\xa5+\xa3\xd8>\xab\xa8\x9e\xab/\x99\x95\x89\xce8\xa7;V\xe3쁊Ds®\xe78yy\x83\xcd\x14\x9bl\x1bP\x04<1\xf3x\v\"\xb7\xcd\xf78=֖\x93\x13k\xaeV\xaeDT\x14'\xebC\x18\xc2|\f\x14\x05Pb\x84\xa2\b8\x15\xe5PQ}\xa1}\xefI\xf9\xabٿ\xb7\x8a\x91t禣\x92/p8~F\xe8\x81\xc3T\x80\x06\xaen\x8bF\xa8\xb9\xd2\xc4\xc7\x15\xfc\xd9\xf2\x19\x8e\xa85\xaf\xfe\xaa\xa6\x80/v/)IC|\xd0\a%\xdb'\x87\xf7\xe3S\xff\xf8\x03\xe5\xf60\xae\au\x9c\xac\x9a5\xb7\xaa\xaaJ8\xd1\xe9\nR\x9c\x19\xc9łח\xac\x0f\xfe=\xa2\x8bѕ\t\x8a\xb2}\x81SQ\xa4X\xaa^\x84\xceWU\x05o\"u}_\xb5\x9f\xdbTUբ̕+\xeb\xca\xdf;c\xd6\xc4髖r\xf8\xe2\xc9E\xee\x18Y\xac\xa8L\xa6e)\xf7\x06\xf7[n\xf1\x1d\xd4yő\x90\xe4p8n\xe3쌨\xacs\xa5q+\x85\x13\x9b\x9f楟\xa8)\x8b\xe5_(\x03\x1a\x1c\x8e\x98\x02\x9c\xa07_\xefrk\xe9\xbe\x18s\xd9\x06\xf7\xedG+\xcaI\x0f\xf1\xe8\xb9w\xecw\x93\xdcGg@\x80c\xac\xa2\xe4\xdb\xf3.ݪߛ/\xcd\xc1\x9e\xccmc$=\x91\xcfz\xa2\xf1\xf1P\x10M\x92\x16\xe1\a6=NHuے\x85\xa1yo\xf5c\xf7r.i(\xe2rɧ\xfd\xc2Hb2^{\xe6$2Vr\x9dP4q\x87X\xc5\x0esG\x84\xd7#\xf8\x82\x06U\x8c\xaaLP\x94{\xaf\xdf#\x8aBź\x9d\xa8\x848\xb5Cy\xd6\xe3̥*\x13\x8aqo\xb6\x89'\x85\xa8\x84\xbb\xe1\x8ad\x9f\xf5\x1c\x1eǍs^h\x91Nj\xce\xf2\x15\b\xeb\x800\n)\x8d{!$K-}\x8a\x00\x8c\xa8(\xf4\xe6\xab\xe6\x1b\x85P\xbe\x19\xb9C+\xca-\xce}\f\xf9\x960t\x1a\xc4i\x1c\x10\x10\x18\xab(E\xf6v\xe1\xb5#\xf7[g\xf6\xa9l\xe9^\x06*ɀ\xad(\xe9\xae\xe4\x05\xfe&\xbb\x9cK\x1a\x16\xcf\xec\xc1L\x13\xcem\xeeL\x9d\xb1\xc2\xfe}\xbf(j\xae\x83\xb5g,s\x8c\x12\xff[\xf2\xf6\x86\xb2\x18U\x99\xa0(h\xc1V\xa2(T\xec`\x14\x85\xaaL(\x16,m\x84BNJ\xb2\x14\xa5m\xd5\xf8i\xdc\xd4\xe0\x8f\xc8\xe4\xac$\x18i\xef\xf6\xbe\x10\xb0e \xf4к,\xab\xecf_/R\x04`$E\x916_\x8eEx\xb9͟F\xee(\x15e\xbf\xdbҦ\xc3ٳ\xc3`\x8c\x02(0VQ\x8e\x15\x8ao\x87\xc8[\xcfQ\xbbk,O%\x99\xb0\x15EJ\x16\xf3\xdd\xecr.i\x98㜍\xc0\xb7w\xb6e\xbf3\x9b\x9b\"^Q\x96\x0eV\xe7F\xf9\x96;\xe9\xb1\x1cUq\xdf\"\x00\xa00VQ.\xee&\xe7\x1a\xe5\xe4\xc0zZ\x94\xd7\xe2\\L%ٸ)\xca\x1e7E\xa9\xe1U\xee\xc8pI\xc3ҙ\x17\t\xc2O\xfay|Q\xb6m\u007f\b\x99o%\a\xab\xbdI\xba֓ϵ\xd2\xc5\xe2g\x92\xb7\x19\xf1\x8abTeXQ:B\xcb\xc9\x18E\x8e\xa5\xea\xc5xU\x14\xaa2\xa1\xd8\xdb\xd2\xe2\x8e`\xe9\xf66Ee.zȵ\x1eq\xa4E\x04\xa3\xe2!\x1e\xa3\\#\b\x02ѐ#hɓʘRE\x00\xc6SQ\x1eF%?lLH\xf4\xbc\xacL+ʧ\xe3\xdb=\x96õ\x1e\xc0\x1dc\x15\xa5\x8d\\=n'w\x9e\xb4\xee? |E\xfb\xbb\x94I\x15dE1\xe7 \xd4\xf7\a7E\xe9\xb4&\xe1\xe1}V\x96{9\xd77\xfe\bG\xaeP\xffQ\xf8I\xdf$\xcetD\xae \xaf\x91\b\xdd\xc3\xcb\xda&\xbe-\x1c\x9d\xfd\x913\x14\xc5J\xc8H\u007f?W\xa2(FU\x86\x15\x05\xc5/ƊB\xc5R\xf5b\xbc*\nU\x99r4\xb2x\xa6\xeb\x8e\x15Ee2w&\xddq\xa6\x92\x92\x10z\xc4Wce%Wkr\x0e\nۅ\xbf@\x16\xedP\x04`<\x15\xe5\x1a\xbf\x84\xe7\u05f9.\x945}!\xcd\xe0P\x8a\xd2?{\x01\xf2\x04\x14\x05p\xc3\bE\xe9ji\xc9=\xdaB\xc6\x00\xe7\xed\xe7o\xd5\xe5\xe1\xbbc\x9b\xec\xfb\x9bZZZN\xe6+\x92l\xc4k=W\xc9ohb\xdc\xc1\x82D\xdeT\xd1\xfc\xb3ô\xed\xea\xc0\xcdm&|\r\xa86f\xf9\xd7\x17\xb2\xf82\xb7\x82\x173\xb9\xad\xe2}sk\xb9\xc5\xf9\x87\xe2\xb9<,\r\x136\x96\x14Ƌ\x97R6\x06o)|3\x14\x1f\x99\x87C#r\x0f\xcd\x1f+\x8c\xec\xef8o\xb5Ń\x82\xa5Ak\x8b\xd6\x06-E\xcabRe]\xe5܁\x0et4\x84\\\xeb\x91c\xa9z{NUU\x05\xc7W\x1dos]\xeb9\x85u\x82ʕ+\x132\xf1U\x1d\xd7X\xe4Ǡ-Δ\xdcH\x15\n\xa2\x8bO\u007fb\xc6C\x90\x9cyi'Ng\xe0\x99\xd9\x02\u07bc\ufb10\xacU\x04\xf4^u8b\xb69.?C\xf4\xe6\xbb\x16Ss\xce\xf1\xc05DYȹ\xb4\xe3f)_\xdc\xe0Lo\xe5Xw\xee\x9eg\x9d\n\x01\x81\x8c\x11\x8ar>\x1bC&eэC\xb9\a\xce\xe3\xb1\xfa\xe1l\x91\"E\x92I\xb7E\xfc\u007f\t\xb9\xfcy7)Ʋa\x0f\xcf\xef܉\xb3\xfeb\x16^w\nٷSm\x96D\xf7\xa9Ŏ\t\x1c\xc79\xefz?\x12\x196i.\x1ef\xe4\xcd\xfdt\xfa\xb8)\x91\xe2\xb5ٮ\x0f\xc2B\xe6\x8aS\x01\xf8\u007f=\v\xf1=c\xf1Ι\r|\xa7j\u007f\xe6\x9c\xd09\x99\xfd\xee\xc5\\\x95\x1d\x13\xc2\xf2Q\u007fĔ~E,U\xefwAbe٨k\x12I\x8c\xadW\xe4R\x95]\x123\xa5\xa1\xc0\xfaםG+\xd5H6\xddY\x8bb\x92\xc4C\xbff]\xace\r\x1e\x9dT\xac)\xb0\x99\xacI\xb5ʀ\x9f\xa2ĉ\x962Do\xbe+\xe4/<\xa65\xe2DJ\xee\xe4l\xb1\xda\xe7x\xa9\xf9\x19I\x1f\x0f\xf9\xc8}\xad\x98{c߹tO\xeb\xee_ \x900BQ\x80\x97c\xd5x\xd5Q\x9b\xae<2\xefx\xf4\xe2œ\x9f>[\xa4\xfaǩ\xfd\xe3\xe3{\x10\x8b\xc2\xd9\x1c<\xcd\x00\xa0\x00E\x19\xc1l\x9dvO+D\x0fN\x8b7\xad\xa0\xbe\xd8\v*\x11mS\xd9\u007f=\xc6ܻ\xe4}R\x1d\b,@Q\x80kQ\xe2\xe9Ns\x94\xca]=\x00\xe03\xa0(@_\x86yGum\xf5\x0esƀV(\x00h\x00\x8a\x02\xa0\x813\x1b\xac&k\xf2Y\x10\x14\xe0\x95\x01E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14\x05\x00\x00\xfd\x00E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14\x05\x00\x00\xfd\x00E\x19\x1d\x9cI|\xa4\xf8\xac\xea\x1b\n\x00ÊA\x8a\xe2ݥ\xb4\xe5\xc8^{\xfeI\xc6#\xc2\f\xa0i\x1c7\xdb#\x93r\x13\x1d\f\xbeZ\xa9*\f@}\xe2 _\xe0vC\xab\x9ao(\x00\f+\xc6(\x8aw\x97\xd2{\xd9%\xf5w\xea\x0f\xec}꽒!\xe2T|\xb0G\x1e\xe5&:\x18d+UᄀJ\x03P6\x8a\x1aJ\xa3*\xb0\xcez(\xdfP!\x97\xff\xe4\x19\x1a\x10\x1f\x05\xedR\x14\x1f\x8cE\xcf\xf1\u007f\xf5\xa8\x17\xe3\xe9\x1b\n\x00Í\xb1\x8a\xe2ť\x14\xf5\xe4\x97{\x96\x1bR\xda8;~[\x8f\x15Ea\x16*)\x8a\x9a\x85\xa8\xcc\xe3\xd2\xe4w-\xfc\x87$\xcdR\x14\xca7Tȍ~(\x15t)\x8a\x0fƢ\xa7\xf9\xfb\xae\xa4\x9b\xa2\xb8\xfb\x86\x02\xc0pc\xac\xa2\xb0]J\xbb\xc4\t\x94Kv\x83'R\xces\xe4\x94k#V\x14\x85Y\xa8\xa4(j\x16\xa2\x12\rq\xb6\x9cӎu\xea\x8aB\xfb\x86\xa2\x95\xae\x19\x10$+\x8a\x0fƢWe\x1f.\x85\xa20}C\x01`X1VQ\x98.\xa5\xfdyG\xc9\xc2\xef\x8dV\x94V\x8e8\x95\x92\x99Y\x85Y\xa8\xa4(j\x16\xa2\x12\t\x89xJ5\x95\xad(n\xbe\xa1J=\x90\xc7(\x9aƢϣ\v<\xea\xc50}C\x01`X1VQ\xd8.\xa5{\x89}\xb9\xf1g=(bz\x9b \x1f\xafcEQ\x98\x85J\x8a\xa2j!\xea\u0086\x8f\xf0\xbe\x95\x1e\x8a\xc2\xf2\re+\x8a/Ƣ\xa9\xef\xb9nĥsپ\xa1\x000\xac\x18\xa1(Z.\xa5?f\x97\xd7ߩ\xcf7\xfe\x9eٺ\xd0韮\x0f\v\x1a\x9b[OۘRn\xa2\xaa\x16\xa2.\n\xf8\xd4҂\x95|\xecWW\x15V\xaa,\xdf\xd0\x17?\x90+5\xf7ł\xb2\x01\xa8\x96\xb1\xa8\xc0\xed\xa8?\xbb\xd6G\xe5\xb2}C\x01`X1BQ\xb4\\JQ\xcb7\xf9\xf6\xc2S\xc3ps\xc5\xf5\x85a3>\xca\x1d˭@\xb2Y(\xed&\xaan!꤯8!:.\xad\xe2=S\x92\xc2J\x95\xe5\x1b\xda(\x1a\x84&\x93L\xda\x00T\xc3X\x14\xb3/\xe6\nr\xcfU\xf1\r\x05\x80a\xc5\bE\x01^\x95\x81,S\xb5[\x96\xaao(\x00\f'\xa0(\xa3\x82\x81b\xdb/\x8a\fo\xbe\xa1\x000|\x80\xa2\x00\x00\xa0\x1f\xa0(\x00\x00\xe8\a(\n\x00\x00\xfa\x01\x8a\x02\x00\x80~\x80\xa2\x00\x00\xa0\x1f\xa0(\x00\x00\xe8\a(\n\x00\x00\xfa\x01\x8a\x02\x00\x80~\x80\xa2\x00\x00\xa0\x1f\xa0(\x00\x00\xe8\a(\n\x00\x00\xfa\x01\x8a2\x829\x14Ѫ\x15b\f\xe0\x89\n\xf8\x8aA\x8a\xe2ݥT\xa0\xce\xfeR\x169CK.~\x80A\xd8\xfc\xa1|\f\xc9\xd7|T\xa5ڲ\xcd\xdcF\xc5\xe7\x15\\P\xbeJ\xa8\aڱ\xf1B\xdfB\xaf{\x8fA\xefd\x8a\xef\xe0\x89\n\xf8\x881\x8a\xe2ݥ\x14ao\xc1\x93y^\xca\x1b\xccQ\xa7\x86\xb4\xe5r_\x1c͍\xe0\x8ey\x0f\u007f\x15\x9e\\N,@l2\x83v+3Z\xaa\xc6mb\x87z\xa2\x1d{\xab\xaa*S˞\xe3;n\xad3\x05\x9e\xa8\x80o\x18\xa2(\x1a.\xa5\x02E\xe5wF\x90\xa2\xfcn\xb13Q\xc7\x1dA\xa8\u007f\xee,\xafѯH\x8a\x8a\xa2\xdc\x18\xbf\x16\xb9\x13쳢\xf8\x14\xfb\xad\x86\xa2\x1c\x9f&)\nx\xa2\x02\xbea\x84\xa2h\xba\x94\xa2\xba\xddO[F\x90\xa2HO\x94%\x8a\x822\xb9\xc1{ \xfb\x8e\x9a\xa2\xc4O\xf5\\\xab\x0f*!\xe1C\xac\x86\xa2\xbc\xc3-\x0e\x95\x14\x05\x8bS\nG\xd3\x12N\xac\vuM\x9f߅\xbdG\xf0\xa9b\xf0\x94VA\x14&\v\xa9\xa7\xf9x\xb4\xf4[bM\x16I\f\xc6Z\xb6\tkǷS\xa6\u007f\\X\x159G\x99K#\xce\xccVq\x17\xe9\xbe)\xba98E\x01OT\xc0\x17\x8cU\x14\xb6Ki+\xa6.\xb7\xb5\xd5\xe8AJSЂ\xa6K\xb3\"\xf0j\xe3g\x92\x9c\x19\xf2\x18\xc5\xde䚙\x9d\x88\x8fXٰ\xb4?\xe4S\x1cT\xa7\xae(l\xac5\xa8!ZT\x14\xda\xdc4%\xae\xf9\xbe\xa5\x18\xa7\x14\x8e\xa6\x1d\xc1\xce\xdb\xdb\xca)\xa3/\xa2\x12D;fG`\xbf\xb4\xb7\xe7(si\x82W\xe1W;\x1e\xa3\xcc$\x19\xb8o\x8an\x0eNQ\xc0\x13\x15\xf0\x05c\x15\x85\xedRJ\x18\x8ey\x94\x8b\xdc\x14\x8e\x8b$\xb2VB\xc6\xf4\xfb\xb9\x12\xfc!2\x12\xa1{ؠTT\x94)\xab.}J\x1b\x96.\x0e\xc37\xc7/ẹ|q\xc3=\x8b\x82R\x14\xda\xdc\x14_=\xbe`\xc2\x13\xb3\nGS\xe14K\x14؎)\x91x\xda\xe9\x03,\x10\xb2vL\xc7\x13\xb1\xfds\xbc)\xca4<\xfd2;R\xd17E7iEi\xdaļ3XV\x14\xf0D\x05|\xc2\bE\xd1r)\x15\xe8o\xa9\xcbmi\xf3Z\xcb\x10p1\xb8\xbc\xa4\xaaEO[\xf7\x8027}r9q\xdb\xd5\xde\xcedk\xed#ڰT\xe0Ǡ-b\xc1\xa3\xaf\xbf\x91Y\xf2\x01g\xc7\xf7\xc1ƟB\x17\xe3\xc7U\xb5\xa0M\xdc;\x99\x9f\x87sa\x9bOѹ4\xc1\xdc\xfcS\xdfDL\xc2\x1aG\xf5MN\xde\xc1\xf7\xccnu\x19\xaf.\xe4&xl\xfe{UU\x13\x16;\xedZ\xc1\x13\x15\xf0\r#\x14Eӥ\x14\xdf\xfa&\xb0\xd7[%C\xc1\xc9\xf1xfd\xdc\\<\x91ҟ9'tN\xa6x\xf4t}\x10\x162\xf7[\x84\U0008595b\x05]\x99\x15\x86\u007f\xd3]\x86\xa5\xc2\xf0*~zț\xe7=\x15%wr\xb6{\x96D\xdf\x12\x9e\xaf\xb4\xf0\xe6jD\x19\x96bֿ\ue738\xb8\xfeδ\x89\x11\x85\xf8\xce\x13\xa1\xb1u\xa1\xc2\xeb\nԿuV\xf0\xe4Ź3\xc7Gҹ4\xb3?}g\xe2ԥ\xe2y\xa5\xdc79\x19\xef\x9c\x18\x12\xef\x0f\xb6O\xe0\\\xd3\xe5\x12\xeb\xc9\xf2\xb1\xe4\x96\x16\xf0D\x05|\xc3\bE\x19\xa9\xb4NX\xd1\xda\xd3\xd3\xf6\xdd\xdba/3:\xea\x18\xec<ʠY5\xde\xe7?\x06\xbe:\x85\x9c\xb7\x8d\x00\x9e\xa8\x80\x8f\x04\xb2\xa2\x14N\x12\x87$\xfda%\x1a\x91,\x86^Q\xd0\xd6i\xca;Z\x86\x8e\xfe\xdcI\xca\x11\x8e\x12\xf0D\x05|%\x90\x15\xe5bP\x1dy\xaf\v\x92\xef\xf8\xf0\x1d\x03\x14\xc58Z\xc2V\xc1=\xf6\x80\x1e\x04\xb2\xa2\xf4LJ\xac\xd8\u007fl\xff\x8a\x90\x97\xf9\x0f\xdc\xf5\xc3ܪSF_\xee\x06\x80\x91N +\nBE\U000e739f:\xff\xa5\x9e\xf54W\x9a\xb4\x04\x00@\"\xb0\x15\x05\x00\x00}\x01E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14\x05\x00\x00\xfd\x00E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14e\xd4\x01ޥ\xc0\b\xc6 E\xf1\xeaRڵ\x9b<\xd7 w$\xfe\xbb\xb5n~\xe8\x94\xc5Ǧ\xdc\xf3\xcd\xd4S/\xc0\xbb\x14\x18\xad\x18\xa3(\xde]J۲\xbfo\x11\x18!\xbf\xbc\n\x8e\x84F\xd8\xf7\xcf\xe1\xb8z\x9fL=u\x03\xbcK\x81ъ!\x8a\xa2\xe1Rږ\xadxf\xfc\b\xa2m\xe2[]\xc2hj&G\x86Xڏe\xd5\x0f\xf0.\x05F'F(\x8a\x96K\xe9\xc8U\x94\xb5!\xe4\x01%[\xb8\x1f\xf1\x9b֡\xa6'\xe0]\n\x8cN\x8cP\x14-\x97\xd2\xe1S\x94\xe3\xf3\xa7\x8f\v[0\x03Ѯ\x9f\x1b9\x8eۋ\xf6\n\xaf\xeb\xd1L\xf1xi\xddB\x1e\x1e\"\x1fj\xb2է\\\x03mc\xaa\x00\xbcK\x81\x00\xc2\bEA\x1a.\xa5m\xd9\xe5\a\xb2\xf7\x1e7\xfe\xab\xf9\x1d\x17\u007f\xa0\xdc\x1e\xc6\xf5Ю\x9f\xad\x8b#\x8e\xb7\xa3\xf6\x93s\x17\xdf\xeb\n\xdaJ\x87K\x87\x9al\xf5I\xd5@٘*\x01\xefR \x800VQ\xd8.\xa5m\xd987\u007f\xbfᒒ9\x197$\x13?\x1c\x92r\xfd\xdc=\x9b,\xfcm\x1ej\"v\x83\x12\xaeC\x8d\xb2\xfa\xa4j\xa0lL\x95\x80w)\x10@\x18\xab(L\x97R\xd4_\x87\xb5\xa4k\xb7\xd6\x17Yw\xeeL\x9d\xb1\xc2\xfe}?\xd17\xd9\xf5\xf3RPW\xc7\ued9e\xe0K\xa8g,s\x8cBY}R5\xc86\xa6l\xc0\xbb\x14\b\x04\x8cU\x14\xa6K\xa9\x8b\xe3\x85\xc8hڲߙ\xcdMٌ\x14\xae\x9f]c/m\xe5\xfe\xa9>H\x909\xe7\xe1Li\xeey\xfdХ\x9bT{U\x9ch\xbf㎳\xb2\rR\x14\r\x97R*\xd7h~\xb7X+B\x83hJQV\xa7\xb2\x92\x14\xec\\\x8d\x80N>}\x9b0,\xe0;=\x17\x89lX7 \x1c\xe4\xdb^MQ\xee\x9ar\xc8{3_#\xbc\xd6\xf2\xcd^\xa3QA\xb4\xf8\xde\xe0MQ\x10Z\xb6\x03\xbf\xde\xf6QQd\a\xd6\xc7|)\xeaS\xed\xb0\x1b,\xe3V&\xa4o}k\x12\xb4\xe2\x06\xcb\xfb\x15\xe4\xad\xecC\x8f%\xd2(Ks\xcf\xeb@k\xa4x\xea\xa7G7\xe9\xf6\xb2\x9dhU\x9fFl\x84\xa2h\xb9\x94R\xb9F\x13\xfe\x8eV\x84\x06\xb4\xa2\xacLe%)ع\x1a\x01\x9d|\xad\xf9\xb97EYF\xb4\xa0\x91?\xad\x16\xe0\v\x19VѴp(\x14\xa5\xb7\xd4ۀGFv`\xbd\xcb\x0f\xe2t\x81e\xdc\xcaD\xec[)\xff\\+p\x90|\xb6\x87\xbc\xe5|\xa6\x1e\xa2\xb9\xe7u\xa0\x8e\xab#\xefzt\x93n/ۉvX\x15E˥\x94\xca5\x94\"\xe7\x13\x10\xc3\xf1\a\xdan\x94ƛǨ@tή\x04\xf3\x86\a\b\x9dq\xce\x19\xacV$w\xf2\xa6\xd2\f뢔\xbb\x8a\\\x85\xf3\xe8\xe5\r6Sl\xb2m@\x19 \xd3\xc9\xdf_y©(R\xb1}B\\%\x12\x1f\x1b\x99fŇ\xff\xc09E@\xa3\x89\xe7\xf7\xdcM_\x16\x93\xfc\xa2\x9aw͍T\xb3\x03\x84r\xbd\x16q\x88B+\x8al\x9a*\xf4\xa2\xcc\xd9M\xe1\\'\xcdjI\xdd\xe6\xae(\xeczEE!5DU:\xa7_\x14\x95\xa1\xbb\xa9\xb1\xa6\xb8d\x92v9\xb0\xf6Ɗ\xdba\xd7\xe0\x8a]\x1a\xcbq\xeb\xaf/\x9d\x112\xbf\x876\x9a\xa5\x10\xfb\x96f\xc5i\xd6\x0e\xa0v\x96\x10\xf0\xf5j\xf3\xca\xd2\x01\xb7\x15K\xb1t\r\xc4k\t\xa1\xd4\x1cE矘y\xdcz\xa4\xb6\xe7\x95;\x80\x01\xd5!D[\xe0v|<{\xc2\xdcSӔ\xd3\x18\xdbg\x15\xd5s\xf5%\xb32U\xbbٙ\xb3ܜt\xd5v\x81ި\xbe}\x11\x99N\xb4džSQ\x90\x86K\xa9G\xaeAt\x9c\xac\x9a5\xb7\xaa\xaa\n\x9fm\xd1v\xa3\n\xbcz\x8c\n\x8a\xc2'T\x9eY\"\xfc:u^q$$9\x1c\x8eۊds\xa5\x89\xb7\x15\x14\xd8\xcc\xcdt.\xed<\xfaӼ\xf4\x135e\xb1\xfc\ve\x80\x8c\xa0(\xa5\xc9NE\x91\x8a=JK\xbc\xdc)\x94X\x93\xf6\vzh\x8bJ.\xf8\xa1\x17)\xea\xed\xae\xae\xb4%Xl\xbb\xd2\xe6=\xec\xbcl\xd9\xf7\b=\xdag\x11J0\x03\x84r7y\x87\xb8\xb6f\xfe\\ww\xf7\x05\xac(\xb2i*\xeeE\\\xc1\x9f-\xf8G\xf8\xae%\xa1\xe2\xcc\x06\xde]Q\xd8\xf5.\xcb\xe8\xee.ND\xce\t'q\xfa\x85\xae\f՚W\u007fUS@f6e\a֛\x8eJ\xbe\xc0\xe1\xf8ypź\xf2\xf7Θ5q\xfa\xaa\xa5\\\x13e4\x8b(\x84\xbe=\xbf\x9d\xc3\x17(\xdaK\xed\x00jg!\x94\x1e\xbd\xe7ܞ\xe8t\xe5\x8a\xe5X\xba\x86\xb2\xd5\xe8\xaa\xed*ZY\xa6\xec|\x83\xc3\x11C\xd6\xc5\xde\xf3\xca\x1d\xc0\x80\xea\x10m\x81\xdb63ls\xc9\n\x8e\xcbD4-K\xb97\xb8\xdfr\x8b\xef\xa8u\xf3ɻ\x8b\x8a/\xec\xe4\xf9\xaf\xe9\x8d\xea\xdb\x17\xd1Ӊ\xb6\xe7ޱ\xdfMR\x19\x19\x1a\xab(l\x97R\x8f\\\xe3\x90\xcez(\xbbQ%\xde=FQt\xdc߄\xdd\x12G\xd2̳\x9e\xe8e\u0090\xff\x89-Q\x91K9\x8f\x96\xc6\xe1\xafg\xa9\xa5ϭ\x06\tAQ~\x89\xf9\x85(\nU\xac\x82\xfc\u0088\xa7\xf0\x8f\v\xfe`\xe2-\xd5\xc8\xcd\xd1t%\xff\xc934\x80O82\xf0\x8fhZ\x86z\x00:\xc7\xffU\\[\xb3\xf3\xf7\xa9Yi\x9a\x1am\x11~\xa2\xd3q7\u05fc'\xfc\xa0\xf5}\xe8\xa6(*\xf5.\xc3U\x91\x1fK\xf1\xf4P}\x11\x99N\xb4U\x9e\xbe+\"\xc6*\nۥT\x91k,DQ\xecM\n\xbb\xd1A\xe1\xa1(\x15\x0f\x95\xc9\xe8,\xfc\xb9\x8c\u007fF\xe7RΣ\r9\xc2.|R\x19S\xeaV\x83\x04V\x94\xe7\xe6\x1aq\x8c\"\x1b\x96&T\xae[\x93p\x1a\x9f\xfbX\xc9\x1aP\xce{n\x8e\xa6Է\"+\x05}F\xa2\xd4\x02\x9e\xbb\xaeYQ\x8aB\x9b\xa6J\xdd\xfc\x1bO\x1a\x9a\xee\xa6(*\xf5J3\xb3\xce\x1a\xf6\xb8IC\rOݧ!9\xb0z(\x8a\xaf\xc5\xc2\xdfv\xa5d\xa3Y\n\xb1o\x16\xfcc\xad\xb2\x03䝕\xf1.\x99}]\xee\x03\xcf]\x00\x00 \x00IDAT\x86\x87'\xf2\x8a\xa9Xž\xf8ʊ\xac\xc5\uf455(\x8eE\xa5\xa2\xb8\xedy\xf6\x0f\x88\x02\xa9C\xb2\x05n\u007fȧ8\xa3\xce\xfd\xac\xa7\x87\\\xeb\xc1clf7\xfb̤)\u007f\x91\x15\x85lT\x9f\xbe\x88L'\xdaa\xbdփ4\\J\xe9\\\x83\x89\x8cD\xe8\x1e\xb6\x17\xa5\xecF\x95x\xf7\x18U(JR\x12B\x8f\xc4\xdbB\xe4d\xf4\x12A\n:\xdfMR\xe4RΣ\x05\xe2\xcd\x1aI;\xdcj\x90V\x8c\x15\x05\xa5\xa7aE\xa1\rKӲL\x17\xf8\x9dx\xc7\xc7Z\xf1׳\x0f\u007f\t\x14\x8e\xa6\xd4\xf7\xf5\x87\x98\x9fc~\xc0\t\xb5\x00\x94\xfa\x9ex\xef\x04\xa5(\xb4i\xaa\xdc\xcdD\x9b\xb0\xb6\xdb1n\x8a\xa2R/\xa5(fᄢ\xef\x0fn\xd2\xd0iM£\xec,Q\x13]\x0e\xac\xb4\xa2\f\xaa\x98<┍f)ľ\xc5e5\x16\xa8\xed\x00yg\x9d#3\x1d\x95\xf8T\x92Z1\x15K\xf789\xf13\xf4Y\xe2\x06\xb2\x12\xb6\xa2\xb0\xf6\xbc2\x96i\b+u\x88\xb2\xc0]\x1c\x86o;Y\xea1\x8f\x82\xeeL\x12/C\xb2\xbb\x99\x1a+췁t\xa2(\xf2F\xf5\xe5\x8b\xc8v\xa2\x1dVE\xd1r)\xa5r\x8dfc\xf0\x96\xc27C\xef(\xedF\x15x\xf5\x18\xfd\xd9a\xdavu\xe0\xe66\x13\xbe0!|\xe9\x8aO\u007fb&\xc2.'\xa3\xf9\xd5\xd5e\t\x96\xbf*se\xe7\xd1\x02\u07bc\ufb10\xacU\x06H+\xee\xae\xe1Ot\xa2Z3\xb9\xd6C\x19\x96\x1e4[\xfa\x12\xc876\x96\xb7\xee\xbb \x14\xbbM\a\xbc\xf8\x81\xcc\xd7\xdf\x17\xdb\xd9g\xdd`\x15\x15C%\x00ݎ\xfa3~\xa3\uf655MS\xe9n6\x9bm\x05{\x16E\x99*\x9a\xd1C|\xcfl\xb1á\xe8\x10Uo\xf7ո\xe4+\xae\xdbh\x12\xe3\x0e\x16$\xf2B1\xc56\xab\x8dY\xfe\xf5\x85,\xe7-\xff.\aV\xf1Z\xcfվ\xc1\x15\xeb9E\xae\xdc5\x91<\xcahV\xa6\x91\x1c3뒷\xbd\xaf\xb6\x03\xa8\x9d\x95\x16\x95s6'*M\xb9\x8f\xe9Xj_d\xcd;\x88\xbe\x9a'\xe8\x1b\xbdQ{\xaf:\x1c1\xdb\x1c\x97\xc9\xc4+cϻ\xed\x00OCXE\x87d\vܖ)\xd33\x0f\xbc\x15\xec\xa9(.\xd8\xdd\xfc\xd9j+=\x91\x12C\x14Eڨ>}\x11\xd9N\xb4\xe7Y\xa7B\x18#\x14EӥT\xce5\x9a\xae\x0f\xc2B\xe6\xe2\x13B\x85\xdd(\x8d7\x8fQ\xb4S8\x055\xfd\xc5,\xbc\xee\x14>ug-\x8aIj \v\xe4d\xf4\xae\f\x8b5\xfdg\xb7\\\xd9y\xb4bM\x81\xcddM\xaau\x0fp\xad\xb8v\x1e\xbe\x8f\xa4/QT\x04ٰ\xb4A\x18\xd6\x1e4\xe3\xd8?\x94\xe5,7ǥ\xdcV\xd4\xdb\x18EΏ\x93źPqt\xb13\xa5\x12\x80\xf6\xc5\xe0\xff\x05\xd1\xff\xeb\x91MS\x15ݼ\x9b\xb2hYN\x85IH\xa6;O\xc2SU\xea%\xff\xeb\xa9t\xd6\u007f7)Ʋa\x8fP\x83r\x9b\xddN\xb5Y\x12]\xf7\xe6\x89\x0e\xac\xdd\x16R\x83\xe9\xf6\xe0\x8a]\n\"3\r\xa2\xfe\xd3F\xb3.\xf0}9_\t\rL\x88=\x8bTv\x00\xb5\xb3\xfaJ?4\u007fXڧ\xdcNJ\x9d%\xef\x8bs\xe6FAi\xcf(7\xeaObZ\x94=ƞw\xdb\x01\x9e\x86\xb0\x8a\x0eQ\x16\xb8\xad\xf1\xd3C\xde<\xaf\xaa(*\xddD\x8f3l1\x9f4\x10E\x916*R\xd9\x0et{U\x9ch\xef\x8d}\xe7ҽ~\xe4\x89\x11\x8a\x12\xd0\xd07Վd\x06\xb2L\xd5Z1C\xceK:\xb0\xbed1O\x86sgy7\x84u\xa7C}\x8c\xe2\rqfv0\xa8:\xd1\x16\xce\xe6\xe0i\x06\xc3\xc1p~I\a\xc5@\xb1\xed\x17\xad\x98!\xe7%\x1dX_\xb2\x98\a÷\xb34\fa=0JQ\xbc9\xd1\u07bb\xd4\xc2\xc8\x05E\x19b\x86\xefK\n\f\x9a\xe1\xdbY\x835\x845JQ\x06\x0f(ʐ\xf2\x80L\xebiE\x01#\x82Q\xb4\xb3\xae\x1f\xe6V\x9db\xcdbx\xe7\xee\x05~\xd7\x0f}hH\x01E\x19Rȴ\xde}\xad(`D0\x8av\xd6\\\x8e\xe3\xc6^\u05ca\xf2`\r\xee\xe1]\xad\xa8W\x03\x14\x05\x00\x00\xfd\x00E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14\x05\x00\x00\xfd\x00E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14\x05\x00\x00\xfd0HQ\xbc\xb9\x94\xf6\xe49\x1fl\xb0W\xbd\xbc\u007f\xa1\xb3\x91$\x00\x8c\x1c\x8cQ\x14\xaf.\xa5]\xd9\x17[\x04\xceg+\x9f3쇸\xbc\x1f_\xc6H\xf2\xd9\xcf\xea\xcb^\xd1k\x15\x00\xf4\xc3\x10E\xd1p)\xad{*\xa4\x9e\xe6\xa9<\x13ʏ\x90\xbc\x1f\am$\xd9WfY\xa7\xbe\xf4\x95\xbdV\x01@/\x8cP\x14-\x97RBɁ\xe1x\x86\x9b\xb1\xacT(\xca \x8c$\x1bW\xf3)\x0f\xd4\x17\xbf\xb2\xd7*\x00\xe8\x85\x11\x8a\xa2\xe5R\x8a\xa9\xcf\xd6\xe7\x999#\x83\xc7鱶\x9c\x9cXs5\xe5vI{?j\x19I*\xe9\xdc\x15e;\x8bԠ\xbcV)_\xcb\x15\\P\x1ej\x1aω\x8f\x83\x97-.\x01`h1BQ\x90\x86K)&\xbf\x9cUl\x94һ\xdcZ\xba/\xc6\\\xb6\xa1\x98r\xbb\xa4\xbd\x1f\xb5\x8c$i\x06N[M9\xe2\xf3\x9f\xbb\xef\x8bPn5\n\xafU\xcaײ\xa5j\xdc&A\xc1\xe3\x83q\x88lq\t\x00C\x8c\xb1\x8a\xc2v)\x15h\xcaV\x1a\x94\x8fn\xaa\xf9F|N\x83}\xf9h\xb7K\xfa\xac\a\xe3\xcdHRf'\xbf\xb2ٙLr\x0es\xd6 %\xd4Y\x8f\xe4k\x89\x82\x05EA\x9b\xb0\xa2P\x16\x97\x000\xc4\x18\xab(l\x97R\x81r\x9d\x1e=<2ȱ\b/\xb7\x89\x8b\x1b\xedvI+\x8a\x96\x91\xa4LE\xf4\xa2\n\xe7\x83\xc5n\x9f\x11q\xf3ZW(\x8a\xcbגR\x14\xd9\xe2\x12\x00\x86\x1ac\x15\x85\xedR*\xb0{\x18ܿ\x86\x8e\xe2y\x8f\xf1\xe8\x04\x0f-h\xb7K\xb7\x99Y\xafF\x92\x14w7\xf0\x89\xcd\xc8\x1b\xb4\xa2\x84\xbbR\xb2\xa2\xc8\x16\x97\x000\xd4\x18\xab(l\x97R|=\xd9\xf5\xcb\xea\x17<\x8cJ~ؘ\x90\x88\x1f\xe8I\xbb]\xcaޏ\xdaF\x924\xd4L\n\x1b\xc9k\x956\xea$\x8a\xb2\x1e+\x8alq\t\x00C\x8d\xb1\x8a\xc2v)\xc5\xd3(\x83\xf1*\x19\xf1\\\xe3\x97\xf0\xfc:r\xb9\x97v\xbb\x94\xbd\x1f\xb5\x8d$\x95t\ue2b2\xd6x\xe4JH^\xab\xf4p%\xf4ca\xebF`E\xa1,.\x01`\x881BQ4]JQ}\xf6\xa0\xac\x05F:\xd7bj\xce9\x1e\x88\xcf\x1c\x97\xdc.\x11\xe5\xfd\xa8m$\xe9N\xf3\x1a\xdaO\xd7\r\x97ת\xc2\xd7r\xee\xe4/>\x8f\xe0\xc6\xe6\xd6\xd3\x16\x97\x000\xc4\x18\xa1(\xda.\xa5M\a\xbcV0ڸb\xc23#\xa65x\xf6Cr\xbbD\xb2\xf7\xa3\x0fF\x92\x83\xc2嵪\xf0\xb5\xbc\x1e\x192q\xfe\x1f9\x0e\x1bK\xc9\x16\x97\x000\xb4\x18\xa1(\x81\xc6#\xf3\x8eG/^<\xf9\xe9\xb3EO\xb4B\x19\x18`\xd2\x04\x00C\x06(\x8a\xfe\x9c\xb6\x88C\x92\xbeX\xf7\xbb_}\x01\x14\x05\x18̀\xa2\xe8ϵ(\xf1bos\xd4\xcb<\xaf\x00\x14\x05\x18̀\xa2\xe8O_\x86yGum\xf5\x0es\xc6KX^\x1aa$\t\x00C\x06(\xca\x100pf\x83\xd5dM>\xfb\x12\x82b\x88\x91$\x00\f\x19\xa0(\x00\x00\xe8\a(\n\x00\x00\xfa\x01\x8a\x02\x00\x80~\x80\xa2\x00\x00\xa0\x1f\xa0(\x00\x00\xe8\a(\n\x00\x00\xfa\x01\x8a\x02\x00\x80~\x80\xa2\x00\x00\xa0\x1f\xa0(\xa3\x99C\x11#\xef)Jm\x11\x87\xb4B\x8c\xe7L\xe2\xa3\x11\xda2\xbf\xc3 E\xf1\xe6R\x8a\x1f\xe7~\xc0~\xe0$\xb8?\f\x96\xcd\xdcF\xf2\u07bc\xc1lM\xab\xb5>B\xdbx\x9e7\xfbv\xc3m\xed<>\xb1\x0f\x9d\xe0yoΆ5qg\\ɿ\xedX\x12\x93\xdc\xe7\x9e\xcbbs\xd0\x17\xacl\x83\x1b\xa9\xe0 _\x80\xef_Vi\x19\xa0'\xc6(\x8aW\x97RԖWX\u007f\xab\xfe@\x9e_=\xc7\xcd\x002\x83v\x93\xf7\x1a\xf3\x1f\xca*?\xe4\xf9\xff\x8b\x1e8\x1c\xa5\xfcU\x8db\"\xdd5|\x8c\x03u\x9e\xe0k\x14^\x1d\xb2\x95*\xe6\xac\xf9\x84+\xf9I\xdc\xd7\xe9\xe6'\xee\xb9LJ\xc6n\xf7\xcc4\xba\x914\xa5Q\x15b\x82\xd92@W\fQ\x14\r\x97\xd2*\xe2\xb6ѓ\u007f\xdc[\x1d\x80;7Ư%\xef\x8f-)\xc2\xf1\xd6\xf9\x9ep\xb0\"\xec\xd3\xe1\xdb\xc1\x8a:\xf9\xf4m\b\xdd\xe7\xdd\x1f`\xbb\x9a~X\x9c\xf4{\xff\x98/E}\xaeP\xad?2\xae\x0f\xbe\xe5\x9ee|#e\xee\x9ar\\IF\xcb\x00}1BQ\xb4\\J\xcb\xc5'\xe4\x1f\xf2'\x130\x03\x88\x9f*\x9e'昉\xc9z1OL7\x06q\xb0֚\x9f3\x0e֕\xcc\xc7O\xde彞\xe9(\xe9\x98\xeaa\xe41\x9c\x8d̰Jn\xb0\x8c\x96\x01\xfab\x84\xa2h\xb9\x94\xb6\xe5\x1dk\xedi\xad\xca\x1by\xb3\x8c/͍\xb7\xc3\xc6MY\xd0▤ɝb\xc7o\xb7&:\xad/&\xd2\x16h\x8d&\x9e\xdfs7}YL\xf2\x8b}<\xcfW\xa2J\xe1u\x9f\xb2\x82\x9e\x89\x1f\x8b\x89\xf72\xc8\xdb\xe3brf \x1d\xac\x92=*B\x977\xd8L\xb1\xc96\xf2T~\xc9\x13\xb5\x93\xbf\xbf\xf2\x84\xf3`eZ\xa9>1\xf3|\x14~\xee6\xea\x8d\x15sw)r\xa9ʨ\xf6\x92\x05\xebCܟ\x1blh#\xcf\no{P\x81\xf0\x8a\x9f\n\xdek\x91\x86(\xac\x96\x01\xfab\x84\xa2 -\x97Ү\xf2\xec\xec\xec#~\xb4\xab\x8fM\b\xdf\\\xbe\x91۪L*x\x8b\x9b\x8f\xdfzvo\x17ɥ\x8d仫+m\t\x16ۮ\xb4y\x0f\x1f\xa5%^\xeeD\x9dW֤\xfd\xa2\xac\xe0\"wL\x8c\x8d*\xa6\xb3\xa5\x83U\xb2GE?\xcdK?QS\x16\xcb\xe3\xa3]\xf6D\x15\x0e\xd6\xd2d\xe7\xc1ʴRE\r\x0eG\f1\xfc@7\x1d\x95|\x81\xc3\xf1\xb32W\xae\x8cj/Yp\x92;\x85\x14\x18\xdb\xc8\xe7Wl;\x1e\xa1G\xfb,\x97q\xb9\x9b\xbcC^\xb3G\xcb\x00\x9d1VQ\xd8.\xa5=\xe5\xf9\xf5-\xf5\xf9\xe5\xf415\xaa\xe9\x9a>\xbf\vO\f\xb5)\x92J\x9a>\xbfA\xde\xef5\x89\xb8\x1bɯ\xe4?y\x86\x06\x9e!T\xb1\x9c|~\xbf\xc2-\xa0\x84\x13+\xb8/\x1a\x87\xb9p\x1d\xac\x94=ji\x1c>LK\xf1\xb3*)OT\xe1`\xfd%\xe6\x17r\xb0\xb2\xadT1.\xedP\x9eP8s\xa9ʨ\xf6bnqn\x8f\"7\xba\x91\x05x\xfc\x92.\x8e\x8b\xce\xf1\u007f\x95c=Z\x06茱\x8a\xc2v)=\x9e\x8f\x87'=\xf9'U\n\x8f:J\xb8\xef\x19I&M\x9c\v7\x0f\xb4\x95\xd1\xe2\xcf=j\x8c\xea~^\xf1\xe4Et\xa3[\xc9Bg\x89^\x13\xf3矲G}h]\x96Uv\xb3\xaf\x17ў\xa8\xf8`E\xc9\xc5\xe4`e[\xa9b\xbc*\nU\x19\xd5^\xcc-w\x8fe\xa3\x1b\xf9`\xde_P\xb7\xa5\x86\xa4O\vuHx\xb4\f\xd0\x19c\x15\x85\xe9R\xdao\x17\x0f\xba\xef\xed\xfd\xac\xa2\xa3\x90\xad\\\x17#ɦ\xaaH\xa4\xca-\u007f\xe5jg\xa2\xdb\xd4X\xcc\xef\xbb\x1d\xe5v\xfd\x14\x9dr\x8dߝS\x14\xbd5\xe4\xcdu\xb0\xd2\xf6\xa8O\xcaR\x13\xf8%\a\ahOTr\xb0\x9eXI\x0eV\xb6\x95*ƫ\xa2P\x95Q\xed\xc5|˹\xff:\x18\xdd\xc8\xe4\x1ct\xc1\xd2K\x92W\xe9i`ϖ\x01\xfab\xac\xa20]J]\x8ar\xd1o\x14\xa5\x9c\xbb\xc8H\x0e\x0e\xf9\x98I\xa8\\\xb7&\xe1\xf4r\xf7\x80\x8e`\xf1\xf66\x94\x13CfX\xaa\xf9G\xf8M\xfa\xf9\x97\xedQ\x1br\x84\xe4\x93ʘR\xda\x13\x95\x1c\xac\xcf\xcd5\xe4\xe7\x9fi\xa5\x8a\xd1\x18\xa3H\x95\xb9\x1d㟎oGJ\x8cn\xe4\x99E\xbdΓ\x1e\xf4<ڵ\x1c\xb1Z\x06英\x8a\xc2v)\xfd\x86\x9c\xf5t\xe5\u007f㭆\xd1DǔH<'\xf4\xc1*ERI\xd3\x177<\vR\xc8GhZ\x96\xe9\x02\xbf\xd3\xf9\x91*\xb6x\xa6\xa8\xc0\x8f-\x9f\t?\xc6}I\xcb\xc8'\xd7\xc1J٣\x16\x88s\x0fI;\x10퉊\x0fV\x94\x9e\x86\x0fV\xb6\x95*ƫ\xa2P\x95)\x15\xa5\u007f\xf6\x02W\xd2\xd5^\xa3\x1b\xd9\x1b{f\x91\xeb>\xdb\xd4\xf7\xa4;V\xa8\x96\x01C\x83\x11\x8a\xa2\xe5Rڵ?\xbf\xeeN]\xfe~\xff\xb9\xd8s\xf4\xf572K>\xe0\xecʤ\x82\x85\x9c\x97\xef\xf6\x8b\x1f\xc8Ռ\xfb\xe4\xc3A\xb3\xa5/\xc1u\xd4P\xc5~\f\xda\"&.\x98\x13+\xcel0]A\xe8!\xbe\x1d\xb5\xd8\xe1\xc0?\u07b2=j\x01o\xdew\xf6t\x06\x8f\x8f0\xc9\x13\xb5\xbb\x86?щj\xcd\xe42\n\xd3J\xb5\xf7\xaa\xc3\x11\xb3\xcdq\xf9\x99\xeb2\xcaU|`R\xb9re\x8a\xf6\xe2S=i`&\xb5\xd7\xd0F\xe2:\u07b5\xbcp\xb6\xe1vԟ]\xcd\xd9\xfa\xb2CF\xc0W\x8cP\x14M\x97Ҟo\x0f\xe4\x16~\xeb7\x97z\x04\xae\xbf3mbD\xa1{\x92&wr\xb6G\x9eDc\x14\x99HH&\x1f\x1a,\xfb\x04Ui\xf0,\xb6\xfeu\xe7\x9c@\xf3\x06\U000d253f\b\x89t\xe7\f\x04\x1e/\xc8\xf6\xa8\x15k\nl&k\x92\xf8\x93\xed\xf2D\xad\x9d\x87\xef\xd6\xe8K\xb4\xf6)be+U\xf4\x93\xd8\b\xbe\fu[H\xc2t[\x91KU\xa6h/:\x1e\xf2\x91\xd4F\xb9\xbdF6R\xe06\x9f!5b_\xcc\x151A\xb7\f\x18\x1a\x8cP\x14`\x88X5>_+d\x18\xd8?>~\x04\xfc8tF\xcb\u007f.\x1c\xc82\x91\x13\xa4\x91\xd12?\a\x14e4\xb3u\x9a\xfbm,\xc3O\xdb\xd4\x11\xf1\a\xdf\xea\xd8\x17\xf2\x87\x81b\xdb/#\xa6e~\x0e(\n\xe0\u007f\x14\xd4\x0e|\xe2\xf6\xa7\x05\xc0 @Q\x00\xbf\xe39\xbfz\xa7\xd5\xf3\xa1\x06\x80\x11\x80\xa2\x00\xfe\xc7>\xf3\xba\xdbZ1\xc0\xd0\x00\x8a\x02\x00\x80~\x80\xa2\xe8ϗL\xb4J\x01\x80?\x00\x8a\xa2?\xa0(@\xe0\x02\x8a\xa2?\xa0(@\xe0\x02\x8a\xa2?\xa0(@\xe0\x02\x8a\xa2?\xa0(@\xe0\x02\x8a\xa2?\xa0(@\xe0\x02\x8a\xa2?\xa0(@\xe0\x02\x8a\xa2?\xa0(@\xe0b\x90\xa2xw)\xed\xbfTh/\x94\"F=\xa0(@\xe0b\x8c\xa2xw)\xed/ʽ\xd8t\x9e<\xd8\xcd/piȟ\xfe\x0f(\n\x10h\x18\xa2(\x1a.\xa5\xdf۱\xf7\u05cfv\u007f\xb1RwJ\xc8?\xff\xe7\xff\x06\x8a\x02\x04\x1aF(\x8a\x96Ki\xc9\x11\x92\xcc\xf3\x97A\n\x11\x90\u007f\xfd\xaf\xfc\u007f\x871\n\x10p\x18\xa1(Z.\xa5\x85\xa2\xb3ġ\x12f\xe9ч \x1f\u007f\xfa\x1f\xa6\xff\xf2/_*\x10\x16\xdcM\x8d5\xc5%?@\xca$\x00\xf8\x11F(\n\xd2p)=\x99\x87\xe7g\xbbr\xfd\xc5\xed\xed\xcb/\xff忘\xfe矈\x8e\xfc\xe9\xff\x88\xfcIP\x94Z\xf3\xea\xafj\nx\xec\x85E%\x01\xc0\x9f0VQ\xd8.\xa5\x1d\xbb\x8bZ\xbbZ\x0ee\x8fć\xa6\xbe\f_\xfe\x0f\xfe\xbf\xfe\xabsd\xf2\x8f\xce\xc74\xff㗨ۖ܍Po\xf5cD'\x01\xc0\xaf0VQ\xd8.\xa5\xa8\xad(;\xdb~\xaa\xe8\x10\xbb\xec\xa8\xe3\xcb\u007f6\xfd\xe7\u007fv*\xca\xff\xfe\x17\x91\xff\xfd%\xba\xc0\xdftEPI\x00\xf0+\x8cU\x14\xa6K)\xa6\xab\xad\x1f\xe5\xf9\x8b\u007f\xa4\xa0#\xffM\x1e\xa5H\xf3(żd4J%\x01\xc0\xaf0VQ\x98.\xa5\x82\xb4\xe0\x97\xeb\xd9-̢\xa3\x0f\xac\x1f\xf2L\x8a\xa4(5\xfc5W\x04\x95\x04\x00\xbf\xc2XEa\xbb\x94\xd6g\xb7\n\x8b\xf6\x1e\xf3Z\xc3(\x82\b\b\xbe\xda\xf3\xbf\x14\x8a\xd2iM\xc2\xd6\xdeYY\x88N\x02\x80_a\x84\xa2h\xb9\x94\xfe\x98\xfdݝ\xef\xf3\x8a\x9ej\xd53ZpJȿ\xfe\xe3\u007fW(\n\xaa\x8dY\xfe\xf5\x85,\xe2\xc6G%\x01\xc0\x9f0BQ4]J/\xe6\xe7\x16]\xec\xf7^\xc9(\xe2K&\u0082۩6K\xe2i\x12C%\x01\xc0\x8f0BQ\x02\rUE\x01\x00\xbf\a\x14E\u007f@Q\x80\xc0\x05\x14E\u007f@Q\x80\xc0\x05\x14E\u007f@Q\x80\xc0\x05\x14E\u007f@Q\x80\xc0\x05\x14E\u007f@Q\x80\xc0\x05\x14E\u007f@Q\x80\xc0\x05\x14\x05\x00\x00\xfd\x00E\x01\x00@?@Q\x00\x00\xd0\x0fP\x14\x00\x00\xf4\x03\x14\x05\x00\x00\xfd\x00E\x01\x00#h\xf5\x9f\xbf\xc2z\x05\x14\x05\x00\f\xa0gҍ\xa7\x01\xa1)\x06)\nå\xb4\xe5\xc8^{\xfeI\xf2\x88\x03\xd4r(\xf7\x88\xbf<\xc1\xcd7\x9a7\x98\xadi\xb5\xd6Gh\x1b\xcf\xf3\xe6\xbbZ\xe1\xc0h\xe7\xe9\x98\t\xdfw\x04\x82\xa4\x18\xa3(\f\x97\xd2{\xd9%\xf5w\xea\x0f\xec\xc5\xcfY\xbac\xaf\xbaQe\xbf\xe3\xb5\n\xff\xa2\xc6\xfc\x87\xb2\xca\x0fy\xfe\xff\xa2\a\x0eG)\u007fU+^\x8dg?\xab/;zQ}\x19`4\xedc\xc6L\xbc\xe47\x0f\x15\xf3\x82!\x8a\xc2r)\xbd\x91\x8d\x15\xe4)N\xf6\xef\xc5Ϭ>\xb97\x10\x14\\\xe4\xb1%\xa5\x1b\xa1\xce\xf7\x04E\x11hxYE\xe9+\xb3\xacS_\xfa\xbb\xc5\xea\xcb\x00\xa3i\x1f\x13\xff\x9b\xb0\xfa\x00\x90\x14#\x14\x85\xe9R\x8a\xc8\xc6mŏ\xab\xae\xb7cK\xb0\xa7҃\xf1\xfd\x9f\x1c3\x19[\x14\xf3\xb7\xf1\xdb\xcb*J\xe3j>ŋ+a\xf8;\xea\xcb\x00\xa3i\x1fSx\xfe7S\xebe\xf3;\u007f\xc5\bEa\xba\x94\x92\x05\xb7\U0008b10f\xe5\x87ɧ\x92\xa3\xac£\x92\xcb\x1bl\xa6\xd8dۀpZ\x92j5\xd9R\x1a\x85\xbc}<\xcfW\xa2J\xe1u\x1fz/\x83\x84=.&&\x1b\x92\xa2\f|\xbdڼ\xb2t@Y\x03\x1a\xa8H4'\xecz\uef8e\xce]Q\xb6\xb3\xee\x99\x12E\x9cH8B\x97\xc6r\xdc\xfa\xebKg\x84\xcc\xefY\xc1\x05塦\xf1\xdcl\x12\x93\x17\x11:k\x95\xbf\xd8\u05cft\xda\xc7\x1c\xf8\xf5\xe4k3\u007f\xf4{I1BQ\x10ۥ\xb45;;;\x17\xcf\xcc\x16\x8aF='\v\xd5J\x8f6~\x9a\x97~\xa2\xa6,\x96\u007f\x81\xd0Y>\xa3\xb6:%\xaa\x01\xa1Gi\x89\x97;Q\xe7\x955i\xbftG)\xecI%EI\x8f\xdesnOt\xba\xb2\x06\x94\x11\x95u\xae4ne\x9fb\x15\x03\xa7\xad\xa6\x9cN\x92\xec\xbe/\xa2\xb0\x00\xea8Y5knUU\x950\xee\xeb\xca\xdf;c\xd6\xc4髖rM-U\xe36\t\xba\x1e\x1f\x8cC\xe2\x83>(\xd9>9lɃ\x1e\x97&\xbfk\xe1?\x14R\x8dQ\xdd\xcf+\x9e\xbc\x88nD\xbd&\xe6\x18%\xe3}\xf2\xb6|\x9b\xa2\x86\xb4w{_\b\xd82\x14\xab\xa8\x88^T1 &o\x9f\x11\xb9\x8d\x94Њ\x12\xdc\xe4LɊ\xb2xf\x0ffZ<\x02\f\xa0}L\x9e\xa0(\xbf\xe6\xbd6\xb7\xa9\a\xf93\xc6*\n\xe5R\xda%\x8e\xb6/\xd9\xfb\x9d\x16\x83\xe8\xd07̢\xa3\x91'e\xa9\t\xfc\x92\x83\xc2!\xdf\x10g\xcb9\xedX\x87\x15\xa5\xdb\xd4X\xcc\xef\xbb\x1d%\x9c\x9d8\xe7QzkțKQ\x12S\xc8[r\xa2\xa2\x86\x0f\x9dC\x90\x14\xe5*\xeen\xe0\x13\x9b\x917hE\tw\xa5dE\x99\xe3\x9ciy\x8bQ\x14Н\xf61\xbb\xff\x03KJ\xe6\x98\xf9\xfe-)\xc6*\x8a\xecRڟ'\xce\xc3~/(J}6\x1e\xb9\xb4e\xfb͵\x9e\x86\x1cA\t\x9eTƔ\"\x94\x90\x88\xa7TS\xb1\xa2\xa0\x84\xcauk\x12N\xe3s\x9f\x9c\x98_pF5\xff\x88\x84\xbb\xc6(\uf489\xd8e\xe9\x8a\x1a\xd2\u07bdFx\xec\xb6\x12j&\x85\rQ\x14;\x19\x9c\x84\xbf\xed\xca$\x8a\xb2\x1e+\xcaҙ\x17\t\xad*\xc5\x01]i\x1f\x93K\x14\xe5\xd7/Ƽu˟%\xc5XE\xa1\\J\xf7\x1e\xc1\x19䬧\x9f\x18\x94\x1e\xf5\x9f\xfbQ\n\xf0T\bBI;\x10\xb2\xa5\n\x89\xbe\x95DQҲL\x17\xf8\x9d8\xe3\xb1\xe53ᄦ/i\x19\tw)\xca92WRɟS\xd4P\xc3W\xe3d\xceA\x8f\xd5t\ue2b2\xd6x\xe4JDF\"t\x8f\xcb\xc7Iy\xb8\x12\xfa\xb1\xb0\xbd#\xb0\xa2\x1c\x11\x17\xfd\xf1svi@_\xda\xc7\xd8\xff]\x94\x94\xf5c\x96\xde\xf1cI1BQ\x98.\xa5?f\x97\xd7ߩ\xcf'\xf7\xcc\u07b2\x1f\xbdq\xcc~K\xa3\x9a\xd1C\x01o\xdew\xf6t\x06_\x8b\x93\xa9\xa5\x05+\xf9د\x04\xd18h\xb6\xf4%\xc4\x14\xe0\x88\v\xe6Ċ3\x1bLW\x10z\x88\xef\x99-v8\x1e\n\xb9iQ9gs\xa2Ҕ5\xa0\x9cyi'\x84\xa4rfV\xa4yM*#\xd7\xc9\xc6\xe0-\x85o\x86\xdeA=\xa7\xc8e\x1fq&e\xee\xe4/>\x8f\xe0\xc6\xe6\n\xe3\xc1\xb5\xdc\xe2\xfcC\xf1\x9c\xdḟ\x8fl\xda\xc7d;\x15\xe5\xd7U\xaf\xadh\xf1_I1BQ\x98.\xa5\xa8\xe5\x9b|{\xe1)q\xe2\xbb\xe5\xb0\xfd\x90\x1f\xfd\xaf\xa7bM\x81\xcddM\xc2r\xd0W\x9c\x10\x1d\x97V\xf1\x9e)I\x18\x8bX\xf6\t\xaa\xd2@B\x9a7\x98\x97\xa4\xfcEH\xa4;\xa7I\xc8X\xa6\xf4C\xf3\x87\xa5}\xca\x1a\x84QʺX˚\vj+S\xa5냰\x90\xb9\xdf\"t)\x88̗, \x99\xd7#C&\xce\xff#ǭ\x10\xd2G\"\xc3&\xcd=\xec\xbd\x12@'\xda\xc7d\xfeۿ\xff\x87x\xdcĿ\xb6\xca\u007f%\xc5\bE\x01\x80\x80GP\x94\xff\xe7\x1a\xa4\xfc\xfa\xf6kk\xef\xf9\xab\xa4\x80\xa2\x00\x80\x01\xb4\x8f\xd9ޏ\a)\u007f?y\xfc\xf8\xf1c\xaf\xbf\xb6\xb1\xd5O%\x05\x14\x05\x00\f\xa0}\xcc\xd6\x1e2H\x996\x86\xf0\x9b\xedm~s%B\x01(\n\x00\x18@\xfb\x98-]\xe8\xdf\xec\xff\xfek\xf9\x98\x05\xff\xb4y\xf3\x16\xfb7~\xfaP7P\x14\x000\x80\xf61\x9b;z6\xbe\xb6\xf9ᅫ\x9ft\xb8\xbe\xa9\xa9\xa9\xd5O\xef\xc6\aE\x01\x00\x03\x10\x14\xa5m\u0558\xff\xf4\x0f\xff\xfe\xeb\xde\xd72[z\xfa\xfb\xfds\x84\x02\x8a\x02\x00\x86 (J\xfc\x987>~-\xf3\xef\u007f\xff\x87Yu~:>\xc1\x80\xa2\x00\x80\x01\xb4\x8f\t\x1d3g\xf7\xa9\xd9\xdc\u007f\xfc\xba\xf97\xf9~:\x87\x82\x01E\x01\x00\x03h\x1f\xf3ZD^]k\xf9k\xb9\u007f\xff\x8f\u07fc\xe5\xc7\u007f\x16\x04E\x01\x00\x03h\u007fma~}G\u007f\xdbl\xee\xdf\xda~\x13Y\x0f\x8a\xc2D\xabr\x00\x00D\x9e\xfe\xd3qAPP\xcf\xe1\xdf\xfc\xa7\xdf\xfcç?\x82\xa20Ѫ\x1c\x00\x00\x91\x9e\xb6V\xf2H\xa0\xf6\xa2\x88\xf9[N\xc2<\n\x1b\xad\xcaG:\x8b\xb9\xb0\xdf\xfb\xcdCY\x80\x91\x8d\xf3rq\u007fۍ\xba\xeb\xfez\a>&\xa0\x15\xa5\xe5h\xee\xec0\xf1a\xf0m\x11\x87\\\xb9T\x12\x00\xf4\xa6\xbf\xa7\xa7\xc7\u007fG(\x86)\x8a\x86K)\x1d`,ǸKbbs\xd0\x17\xae<*\t\x00\xc0\xa00FQ4\\J\xa9\x00\xa3\xf9\x96;\xe5L\x95\x8cݎ<\x93\x00\x00\f\x06C\x14Eå\x94\x0e0\x1aYQ\xd0\xfa\xe0[\x8c$\x00\x00\x83\xc0\bE\xd1r)\xa5\x02\f\x87R\x94\x8e\xa9\xf1\x8c$\x00\x00\x83\xc0\bE\xd1r)\xa5\x02\f\xe7\x12wLJ\xaf\x0f\xe9b$\x01\x00\xf0\x1d#\x14\x05i\xb8\x94R\x01\x86\xd3\x13\x16q\xf2\x8eS\xe4N\xca\xe3\x15*\t\x00\x80\xef\x18\xab(l\x97R*\xc0x\x0es\x1c\xb7PL\xde\xe2\x0e\xb8r\xa9$\x00\x00\xbec\xac\xa2\xb0]J\xa9\x00\xc3\xe9\x98\x1d\xdf\xceH\x02\x00\xe0;\xc6*\nۥ\x94\n0\x1cJQ\xfag/`$\x01\x00\x18\x04F(\x8a\xa6K)\x15`4\xa7dE\xd9\xca]d$\x01\x00\x18\x04F(\x8a\xa6K)\x1d`$=-\x17\x17\a\xbb\xdcQ\x8f\x87|\x84<\x93\x00\x00\f\x06#\x14e\xc4\xf2\x16\xc7\xcd8\xe4L\xef\x1f\x1f\xdf\xe3\x99\x04\x00`P\x04\xb4\xa2\xb4\\\xbc\xe3J\xb6M\xfd\x82\x91\x04\x00`p\x04\xb4\xa2\x00\x00\xa03\xa0(\x00\x00\xe8\a(\n\x00\x00\xfa\x01\x8a\x02\x00\x80~\x80\xa2\x00\x00\xa0\x1f\xa0(\x00\x00\xe8\a(\n\x00\x00\xfa\x01\x8a\x02\x00\x80~\x80\xa2\x00\x00\xa0\x1f\xa0(\x00\x00\xe8\a(\n\x00\x00\xfa\x01\x8a\x12(\x9cI|\xa4\x15\x12\x10\x90\xed0\xb4N\xb4\xee\xab\x18ڵ\x8d0\fR\x14\xef.\xa5\x1dU\xf9\xf6C\x97\xe0\xff\xbe\xbeS\xcc\v\xccK(\x1b\x10?\xd6ĝq\x8f\xd8&\x04\x98\xefʟ\x0f\xf2\x058\xb8>,\x17\xd9î\xbbG3\x19L,\x8b\xc6(\xa1\r\x19\xd2GF#u\xa18\xe6\xcfR\xfa\xbe\x89_\ue664qn\a\xb6\x13mc\xf2\"˚\xda\xf7\xaf0\x16\xb9\xf0\xa1\x17\x9e\xab\b$\xdf[c\x14ŻKi{\ue87a\xa6\xf3\xbb\vAR\xd8\xd4^\xf3\xc8z|\x90\xafp\x9cK\xe3\xf7\x89\x1fϚO\xb8G\xb8\x94\"Կ\xb7\x8aYt(96!|s\xf9F\xe1\xa7\x18\xa1\xf8\xe0\xf5%\xeb\x83\u007f\x8fP\xfdޱ\xdc\xe4M[&\xbe\xadH\xaa\x11\x1f\xf4A\xc9\xf6\xc9\xe1\xfd\xa8+\u007f\xef\x8cY\x13\xa7\xafZ\xca5QI\xb7跸\xf9\xf8\xadg\xf7v\x91\\Zr\x9a+M|\\\xc1\x9f-\x9f\xe1\x0f\x19QY\xe7J\xe3V\xf6\xa1\xce+\x8e\x84$\x87\xc3q[Y\x93SQ\xcaxa\xc0\xdf\xe0p\xc4\x14\x90ܳ|FmuJT\x83\x18#+\xcaM\xde\xe1L\xf5O;\x85\xbe\x9b&\xc8x\xc7ɪYs\xab\xaa\xaaȔ\xb9\xb4\x1dp\x8fg|\xfe\xe9\x8c\xd0::\x96\rݲ\x9f楟\xa8)\x8b\xe5ݎvj\x8c\"7R\x8eU\xf4M\xea1{;tWW\xda\x12,\xb6]i\xf3\xe4\x99\x19ºT\x94\xba\x0e'\xeeZ\x12*\xcel\xe0\xa3\x15Ie1y; \x96\x13\xedC[Tr\xc1\x0f\xbdH\xd17E\rR/\xe8F\xf6.\xb7\x96\xee\x8b1\x97m(\xf6\xb2\x8a\x80\xf1\xbd5VQ\xd4]J\x85M\x9e\xdb\xc6.;ttM\x9f߅\x1d>ڰY)v\xfb8\xc2\x1d\x16^\x83'\t\x83\x92\xa5\x93\x912ɤ\x88\xcbEآ\x838\x10\x86so\xb69O\xe9\xa8$M\xd3\xe7\xe29Ľ&\x11\xb7\xc7\xffG[\x84\x9f\xbc\xf48\x84\xa5\x01\xcf\xee5\xf0\xe4\xf7P\xfd\xac\a]pN\xa48\x0f\xd6\xe7Ղ\xc0\f\xbc\x9f\"\xc6Ȋr\x8e\xff\xabG\r\xd4Y\x0f\xb5\x1dP\xf0\f\xdc\xf0\xe9\x11\x8cxO\xa4\x96\x95\xc6a-)\xb5\xb8M2(\xcfz\x9c\x8dT\xc4J5\xd0=V\xdb\x0e\xfc'\xcf\xd0\xc03\xa4\xa0\xcf\\\x8c\x8a\u0378\xae5\xef\tC\x99\xbe\x0f\xa3\x95IE1\xc5v`8\xd1>.\xf8\x83\x89\xb7T\x8b\xc5䭮X\xb1\xb3\x17T#\xabyaTX*\xee\x10\xd5U\x04\x8cﭱ\x8a\xa2\xeeR\x8aNe\xbb\xff\xa0\x0f=%\xdc\xf7\xaed\xfco\xc9\xdb\x1b\xf8l7\x18\xbfl\fF\xca$\x93\xc53{0\xd3\xc8Irx\xb0\xd4\x05*ɠ\x89s\xa1\x8c\x8aNGγ\xff\xb4w{_\b\xd8ȵW/\x8aR\xc1?&\x1f]_\xf3ǥ\xc9\xefZ\xf8\x0f\xc5\x0f\xb2\xa2\x9c\xe6\xef#O$E\xa1\xb6\x03\n\xfe#~\xcd\xe4|\x92w\xa9e\x0f\xad˲\xcan\xf6\xf5\xba-g*\x8a\"V\xaa\x81\xee\xb1\xdav\x88v\x1b\x9e`\x1a\xf9+\xddW\xf0!\xfd\x84/ß\xf7D+\x92\xcab\x8a\xed\xc0v\xa2\xed\xaeI\xe6\xcf\xe1\x04\xad(\xf4\x8a%E\x91\x1a\x99c\x11^n\x8b\xb3/\xaa\xab\b\x18\xdf[c\x15Eե\xb4\xe7\xa8]\xbac\xc58\xb6rҹ\xed\\\xd1M}\x01\xfem\x0e\xde(\xbcl\x12\x15EN2\x99\xe3T\x86\xb7\xf0\x87\xf0p)\x9fJ\xb2\xa8*\x12q;ϋ\xc6_V\xf2%\xfd\xd0y\x1eOF\x1b^\x14\x85|\x99\x91\xf45o\x88\xb3\xe5\x9cv\xac\xf3P\x94\xab\xd4ud\x19IQ\xa8퀂7\xe1\xd7c\xbe\x19\x16\xc9-{R\x96\x9a\xc0/9\xa8:\x8f\x82q\x1d\x8bt\xacT\x03\xddc\xb5\xed\xe06\x97D(%\xcbKqo\xc9\xe9\x06.F%\x95\xc5\x14\xdb\xc1Ӊ\xb6\x81̊\xf4%\xbaouŊ%E\x91\x1aY<\xef1\x1e-\x8ac\x14\xb5U\x04\x8cﭱ\x8a\xa2\xe6R\xfa\xb4(\xcfe\x9bc$\xe5\xf2q\x13?\x93\xbc\xcd c\x14|P9\x15EN2Y:\xf3\"\x81L_\x86\xcb\xf3-\xe1^\xa6^ԑ\xbf\xa4i\xef^#\x90\x11\b\xf9nW(\u007f\x9fEE\xe9\x8ds~\xed\x9d_\xf3\x84D|\x9d!\xd5CQ\x9eG\x17 O\x88\xa2؛\x14\xdb\x01\x05\xaf¯\xf6A\x8cQp\xcb\x1ar\x04}xR\x19S\xaa\\.*J\xe7>\xc5@J\x11+\xd5@\xf7\xd8\xdbvp'uuCC\x03\xbe\xd2\xfb7\x9eT\x98\x1e\xadH*\x8b)\xb6\x83\xa7\x13\xad5\x8b\xbc弇_\xa9\xad\xaeX\xb1\xa7\xa2<\x8cJ~ؘ\x90(\x9e\xf1\xa9\xad\"`|o\x8dU\x14\x15\x97\xd2\xd6\xfd\a\x84\xcd\xddo\xf8dxǔHf\b$f\x00\x00\x03\xb5IDAT<\xa3\xf3\xc1*<\xf0ǃ\xd2\xfd\\\tRW\x94\xa6M\x1e?\xdcG8r\xe5\xfb\x8f\x9f\xe3W\xeaj\xacʅ٦/\xbc]\x8b\xa5\xbe\xa45\xe2=\x119\a\xf1k\x92p\\>\x123\xa4\x1aDE\xc9\u1777a9\xbf\xe66\xfc\xd5\xef[\xe9\xa1((\xf5=\xc6m\x14\x91\x91\b\xdd\xc3\x1d\xa0\xb6\x03\n\x9e\xd2!ďt\x0fft\x9ejY\x01\u007f\x81|\xde!ƺ\xba)*\xcaM\xfe2\xf9\xe4l\xa4\"V\xaa\x81\xee\xb1\xcav\xa0\x0fli\x15\xd6]\xc2\xcb.\xab\xf0\x92h\x13t\xe7vL\xb42\xa9,Fm\aʉ\xd6UY\xac\x15+W\x9fX\x80\xda\xea\x1a\x8ar\x8d_\xc2\xf3\xeb\x1e8\x97\xb3W\x118\xbe\xb7F(\x8a\x96Ki\x93}\u007fSKK\xcb\xc9|\xad\x8at\xe7\xe8\xebod\x96|\xc0\xe1K\xbaK\x83\xd6\x16\xad\rZ\x8aPKո\xf8S\xe8b\xfc\xb8\xaa\x16*\x89\xa3\x17r\x13<~\xb9\xd7r\x8b\xf3\x0f\xc5sy\xa8\xe7\x14\xb9v\"\xfc\xe2\xd3I7\x16r^\xbeW?;Lۮ\x0e\xdc\xdcfr\xfc,\x1cC\xf3\xd2N\x9c\xce\x10g$\v\xa2\x8bO\u007fb~H\xd7@\ue67d\x90N\xee\x99\xed\xbd\xeap\xc4ls\\~\x86\x0f\xd6\xd4҂\x95|\xecWW\xd1C|\xcfl\xb1\xc3y\xcf\xea\xed(\xf9Nu\x89\x8d\xc1[\n\xdf\f\xc5\x17\xb0\xa9\xed\x10̅\xe7\xdbgM\xf2P>V\xe7\xe5\x96\x15\xf0\xe6}g\x85\xf6\xd6:cI#_\xfc\xb0\xf2}\x87\xc0\xd7\xc2I\x88\xa2\x91T\xac\xdc7\xa9\xc7\xec\xed\xf0\xe2\ar\xf5\xe5\xbe\xd4\x1c\xb2\x8a\xee\v|N'\xea\xcc\xe1/t\xa3f\xb3\xad`Ϣ(SE3\x95t+Fm\aʉֵ[by\xeb\xbe\vBsn\xd3-\xa3k\x90{A7\xf2ZL\xcd9\xc7\x03\x97\x8e\xb0W\x118\xbe\xb7F(\x8a\x96K\xe9\xe1l\x91a\xb8\xc3\xed\xfa;\xd3&F\x90ɝ\xfe\xcc9\xa1s2\xfb\xf1M(\x1c7\xae.Tx]A%q\x88}\x02'M)K\x1c\x89\f\x9b4\xf70B\x97\x82Ȅ\n\xfejRI7r'g{f\xba\xd8\xc9\xf3\xbc\xe9/f\xe1\x15߶V\xb3.ֲ\x86\xfc\x98\xa3\xee\xacE1I\r\x8a\x1a\xc8\xffz\xf8ed\x02\xf2\xa7(q\xaeA\xf8\xd0W\x9c\x10\x1d\x97V\xf1\x9e)\t\xa5;g \x9c?\xaf\xfbb<\xff\xac\xd2\xf5AX\xc8\\\xb1G\xf2v\b^\x15?q\xeaR\xcfsPf祖U\xac)\xb0\x99\xacI\xce;͜\x8dlt6\x8c\x17\x0eQ\xaa\x91\x8aX\xaao\xae\x1e\xb3\xb7\x83\xb3\xb2d\xa4XE\xcd<|\xcf\xfc\t\x9e\x9fW\x83\xd0ݔE\xcbr*L\xb8\x98\x94t+&o\aډֵ[\xfeP\x96\xb3\xdc\x1c\x97\"^>s\xb5\x8c\xaeA\xee\x05\xdd\xc8+&\x9cgZӬ\xbe\x8a\x00\xf2\xbd5BQ\xfc\x86B\xdff\x17F\"\x03Y\xa6j\xad\x18\x8283\xcb`\x14w\x9eµ\x1dtt\xa2}d\xde\xf1\xe8ŋ'?}\xb6\xe8\t\xf9\xccX\x85\x8ek\x1b\xf1\x80\xa2\xf8L\u007f\xee\xa4\x15Z1#\x97\x81b\xdb/Z1\x18\x15E\x19ݝ\xa7\x10\xb7\x83\x9eN\xb4\xa7\x9dw\xe1\xf4ŊCJ\xcfU蹶\x11\x0f(\x8aϴ\x84\xad2|\xee\xd8xT\x14%0:\xffR\\\x8b\x12Ow\x9a\xa3njD\x06\x04\xa0(\x00\x858\x17\r\f\x86\xbe\f\xf3\x8e\xea\xda\xea\x1d\xe6\f\xb7\xbbq\x02\x13P\x14\x80\x82\xccE3.R\x01^\x188\xb3\xc1j\xb2&\x9f\x05A\xc1\x80\xa2\x00\x00\xa0\x1f\xa0(\x00\x00\xe8\a(\n\x00\x00\xfa\x01\x8a\x02\x00\x80~\x80\xa2\x00\x00\xa0\x1f\xff\x1f\xec\x88D\xdc\xfa\xfa\x88\xfa\x00\x00\x00\x00IEND\xaeB`\x82", + + "analysis/error1.png": "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x04\xc1\x00\x00\x00\xbd\b\x03\x00\x00\x00\x8d\xa5\x9a\x96\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x00\x01\x00\x02\x05\x01\n\x03\x01\x05\a\x03\x1e\x01\x00\v\r\n\x10\x12\x0f\x16\x17\x13y\x00\x01\x19\x1b\x18\x1b\x1b\x14\x83\x01\x00\x8c\x00\x00\x8c\x00\x04 \x1f\x19!# #$\"%%\x1e$%#&'%'(&+)\x1e()'++$*,)/,!-/,02/63(241\x98\x1b\x1b786;8,\x82%#:;9><0>?=C@4@B@\xa0*,CEB\x9c.-KH\tn\aPRP\xa9:e\xaf*{!bda)}*Bh\xb2egdLj\xafpiR.\x81.Em\xb1ikh\xb3XX0\x8301\x841/\x858Jq\xb5mol;\x86:Vu\xb4>\x89={t\\tvs@\x8b?B\x8c@@\x8dG\\z\xbay{xJ\x8eI^~\xb8\x84|d\xbbkkL\x90K~\u007f}O\x93Mb\x83\xbdN\x95UW\x95V\x82\x84\x81\x8f\x85hm\x87\xbdZ\x98Y[\x9aZ\x87\x89\x86\xc0{|]\x9c\\\\\x9dcr\x8d\u0096\x8cnd\x9dd\x8c\x8e\x8b{\x8f\xc0f\x9fg\x90\x92\x8f~\x93\xc4j\xa3jy\x96Ŕ\x96\x93s\xa4l\xa1\x96xq\xa5s\x81\x99×\x99\x96\x83\x9bť\x9b}u\xaaw\x9a\x9c\x98Ǒ\x92\x9c\x9e\x9b~\xaby\x88\xa0ʞ\xa0\x9d\x81\xad|\xab\xa0\x82\x8e\xa2ǡ\xa3\xa0\xa2\xa4\xa1\x81\xb1\x85\x92\xa5ʋ\xb2\x88\xb4\xa7\x83\xa6\xa8\xa5\x8d\xb5\x8a\x97\xabЩ\xab\xa8\x8e\xb6\x8c\x8d\xb8\x93\xab\xad\xaa\xb9\xad\x88\x9f\xaeή\xb0\xad\x96\xba\x96\x98\xbb\x98\xa3\xb2Ұ\xb2\xaf٨\xa6\x9b\xbe\x9aµ\x90\xb4\xb6\xb3\xa3\xbf\x9d\xac\xb7Ҷ\xb8\xb5\xa2\xc0\xa4\xb7\xb9\xb6۰\xb3\xa5ħ\xba\xbc\xb9\xb1\xbdקƩ\xbd\xbf\xbc\xa8ǫ̿\x99\xafƫ\xb8\xc0տ\xc1\xbe\xb2ɮ\xd0Þ\xc2\xc4\xc1\xbc\xc4\xd9⽾\xc4\xc6òͷ\xbb\u0379\xc0\xc8ݻ\xca\xde\xc7\xc9\xc5\xd8ɝ\xbdϻ\xc6\xca\xda\xc0\xcc\xda\xca\xccɿҾ\xd7ϡ\xcd\xcf\xcc\xc4\xd0\xde\xcb\xcf\xdf\xc8\xd3\xc1\xe0ѥ\xd0\xd2\xce\xc8\xd6\xc9\xea\xcc\xcb\xd1\xd3\xd0\xd2\xd3\xdd\xca\xd8\xcb\xd3\xd5\xd2\xdf֨\xcd\xd6\xde\xcc\xda\xce\xe6֪\xd6\xd8\xd5\xd4\xdb\xd0\xeb\xd4\xd2\xd2\xda\xe3\xd8\xd9\xe3\xeaۯ\xda\xdc\xd9\xd7\xde\xd3\xe1\xdb\xda\xd5\xdf\xda\xdc\xdd\xe7\xdc\xdf\xdb\xd7\xe1\xdc\xde\xe0\xdd\xdc\xe1\xe3\xf0\xe0\xb3\xe0\xe2\xdf\xe2\xe4\xe1\xee\xe1\xe2\xdf\xe5\xe7\xe4\xe6\xe3\xe8\xe5\xea\xe5\xe7\xe4\xf2\xe4\xe5\xe6\xe8\xe5\xe3\xe9\xeb\xe7\xe9\xe6\xe8\xea\xe7\xeb\xed\xea\xf6\xf0\xef\xf2\xf4\xf1\xfe\xf8\xf7\xf9\xfb\xf8\xfe\xff\xfc!l\x99S\x00\x00 \x00IDATx^\xed\x9d\x0fXTם\xf7\xf7\xd9\xd9\xd8w\xd3$C\x03\x9b\x12-K^\xd6fm\xfb\xdc\xe1\x19\xa9\xbe+\f\x8d\x1d\x14\xd7?1+\xbeVQ\x8aV1\x1b1\x18\xe7a\x13\xa3\x82ƄL\n\x19%) B\xe6\x89E\x1eY3*\xbe\">\x19Me\xc1\x96hqm\x12\xe8S\xa6ѱ\xb6\xda\xe4\xf2(\xac\xe4y\xaf\xe7\xed\xa6\xe5y\xcf9\xf7߹ý3(\x03\x97\xd1\xdf\xe7\xd1;\x87;\xbf\xf3\xbb眹\xf7;\xe7\xfc\xee\x99{\xfejh\x14 \x00\x00\x00\xf3\x18\x1a\xfa\xabH*\x15\x8eH\xee\x01\x00\x00\xc6\x10P0\x00\x00b\x17P0\x00\x00b\x17P0\x00\x00b\x17P0\x00\x00b\x17P0\x00\x00b\x173\x15,p\xa0\xaa\xa2\xfa\x18O\x92\u0099\xba\x8a\xba\xceH\x19\x00\x00\x004\x98\xa8`A\xb7\xb7\xb3\xbb\xb3\xae\nK\x98\xe0\xf5\x9c\xee>Yq2R\x16\x00\x00\x00\x16\x13\x15\xac\xcbݍ\xb7\xbc\x1bw\xbd\xceT\\#;*\xf8Hy\x00\x00\x00\x18LT0D\xf5*\xe8\x0e \xe4=@wTB'\f\x00\x80;\xc1L\x05\xc3\xf4wW{\x05\x84\xea|\xf4/\xef\xfe\b\xe6\x00\x00\x00,\xa6*X\xd0\xedv{HO\xecX\xe5\x00\xde\x0ex\xea\"\xe5\x00\x00\x00`0U\xc1P0\xd0^M\"\xf9\xbc\xc7\x1b\xec\x0fx\xddՑ2\x00\x00\x000\x98\xab`\x98\x81\xea&\xbc\xbd\xe6\xc5ݱ\x16\xaf7\x925\x00\x00\x00\x83\x89\n6 З3n\xfa\xda\u007fM@\x95\xc7\xc2f\x00\x00\x00\xd0b\x9e\x82\t\x95b\xf8\xfeL\x05V\xb0A\x92\xea\"\xb7%\x01\x00\x00F\x8cy\n\x86\xaa\xe8\x14\n:\x8a\xect\a\x11\xe2\xab|\x91\xb2\x00\x00\x00\xb0\x98\xa8`]\xee\xa6\xce\xeeN\x1a\xc9\xefr\x9f\xec>S\xe9\x85\t\xad\x00\x00\xdc\x11&*\x18\n4UWԵ\x90y\x14\xe8t\xb5\xc7{Z\x88\x94\x01\x00\x00@\x83\x99\n\x06\x00\x000:@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]bK\xc1\\.\xbd$\x00\x00\xf7+&+X\xbb[z4~\xc0\xeb9\x10\xf1\t\xad\x1fs;u\x92\x84z\x8e\xe3\xcaQ9\xde\xd6\x0fϦ\xd0k\xe3\x16\xe1\x17\x176K\xeb\tc\xa7\xe5\xb8\xe3p\x98w\xef\xd0\xd9\xe8\xc0\a\xab\xc1/5\x1c\xc7\xea\xf7\x8b\x1cר\xfcq\xeeG\x8eY+[\x97|0,\xafH-k\x1b\x81\x17Gd{w\x8d\xfaً\x0e\xfb\x8f\xa2\xf28%\xed\x81\xc3\u007fX\xe3\xc3D(\xc3\xfd\x83\xb9\n\xc6W\x1c\xab\xa4\x89\xee\n_\x97\xaf\xa2;\x82y\x91\xfd\x8aN\x92\xc0\xbf\xcb\xed\xbe\x8e\xae\xbfŽ\x1b\xf6)\x89\x1d.;\xde^\xf2\xfbk9\xa3K|8\xcdi\xe1\xae\xe3;t\xa6\xd2z6\x92\xc5p.\xa5\xbdՇ_\xfaޚq\x89\xd9{\xc5o+\x97\xd3gm\x05\x87\x1a\x9f3\x96\x9e>\xff\xf2r\xa4\x87NqX\xbfa\xb8\xabF\xcdsԺ\xd2\xfa\"Y\x8d\x04\xed\x81\xc3\u007fXw\xd7\xea#\x81\xf5\x1b\xa9\f@41W\xc1\xbcM\xddT\xc1\x84*\xb2\xc6DZ\xaa\xf0_\xca=\\\x89NR\xe4\x02w\x1co[\xb9\v(,\xe5v\xf1\xb5\xe3\x0e.6\x14\xa9\xabpG\xce\x14~P\x18\xc9B\x87%b\x17\xb3~\x89v\xb7]Q\x9a\xd5yd\xeb\n\xd3y*\xd0W%\xdd\xe2\xd8G\xa2`wӨ}\xb8/)\xf4G\xb2\x1a)\xec\x81#|Xw\xd5\xea#@\xe37\xd2\t\x03D\x11S\x15\xac\xdd\xc3\a\xa8\x82uV\x90\xb3\x99\xaf\xe8\fk\xeeR\xfb].m\x17ll\x15,\x12w\xe7l\xd9\xdd\\K\x85e\xf4\xa5,$\xaf\xaa4s\xa9\xc19\xee\x102\xc2@\xc1t\x8b3f\n\xd6\xc3Es\xa0u\a\a\xbe\xabV\x1f\x01c\xe5\x17\x88\x84\x99\n\xc6Wt!Q\xc1\x9a\xf6\xd3\x1d\xfb\xc3.\xf5\xd1k۪\x93\x94`\x14\x8c/̴e\x15\x9c\xc3\u007f\xbe\xc4\xd9\xeaK\x16\xa4\xad\xa6C\xae+E\x99酮a\x17[\xe3ʴ\x05%X?\xcf\xd98\xae\xac\xa7h\xae}\x8d\xe6\x1b\xb4/\x8d\x13\x87d\x82\xc3\xf6jVf\xeb\xd6Yy<\xf1[\xe3\xcaJ/\xe81p\xc6\xda2\x87`\x8as\x98\x13YF\xde\xf7\xafβ9~\x94\x854\xa8\xb5`\xd9)^(\x85;Y\xbfXi\xb6\xba2\xc5\xe2\x14fR\ro\xa6\xbbk\x97\xa5-\xa9\x153\xf6\x14:\xf01\x88\xecc\x05ۊ\x8fl\xff\x8c\xf1\xa0)\x0e\x83\xbdDn\xbeh6\xea\xa0C<\x9a؍\x96\vi\xf0\x01\xe8\xb7\x03[!\xf5\xc0ʇE\x88\xd4\xea\x06\xce\xe4\xe20\xd945fZ]\xc9\xc6\xfaՔA\xc7\x19\x10e\xccT0o\x13\x92\x14\xacN\\(\xf2X]8s\x97\xed\x92NR\xe2\x02\xd7<00\xd0L\x14\xac\x99s\xb56\x16p\x1d\b}\xdch\xe3\x1c\xe553\xc8e\xdf3kA\xfd\xe1\xd5\\\xe8\xc5\xe6\xe2\xb66\xd78\x96\th\xa0\xb11k\xc1\x8c\xac\x92\"\xaeW\xe3\xf8\xac\xdf/\xf6DZgq%y\x9cc\xb7\xa3\x86\xfa\xcd\xda]\x9e\x95v\xc1\xc0\x19c\xcb\xece\x8a\xc3\u007f\xe0_\x90\xe7\xf7\xfb\x89\xe8\x9c\xe5\x8a\x1a\x8f\xd7;8\xed\xd8C\xad\x05K\xfd\x0fPG\xd6\ahY=\xeb\x17+\r\xb7\xac\xb1q\t)No\x16\xb7\xa6\xbccP,\x8e\xbd\xac\xb9\xcc^D\x92\xadi\xcb\xde:^No\x03`\x05\xbbR\xc4\xd5t\xb0\x1e\xd8\xe2\xb0عE\x8d\x87\x1d\xa4\xf9\xa2ڨ\xe7\xfc\x8d\\\xb9\xdfO\x15C)\xa4\x81\xad~;\xb0\x15b\x0e\xac|X\x91[\xdd\xc0\x99R\x1c&\x1b[c\xb6Օl\x1a\xbfl\x19t\x9c\x01Q\xc6D\x05\xeb\xf4\xf0\xb2\x82U\x9e\xa4{NV\x861ﵽ\xa8\x93\x94\xb9 }\r⋸\xbf\x91|C.y\x8e춧c\xa9+r\xe0\xd4\xca\x05x\xaf\xb0$\xe4bk\xe6ޥ\u007f\xd1/\xcde\x1c\xe93\r\xbf\x15 \x9d\x90\x99E\xd8\xfc\xb08\x8d\xc3>\x17\x9b\xf5e-7r\xc6ز\x87P\x8bÌ;j\x1d\xe4r\xa8\x9d\xa5U0\xb6\x16*~\a\xdai+A\x0e\u007f\x88\xdfE\x03X\x02\x16,\xc7ɾ\xdd\xcbm\\:\xd9y\x9cvK\x8fs\xcd\xf8\xad\xac5\xd8`\xb0\x91\x84α\x82\xd5؛\x893m\xe5uG\x91\x0e\xdcSs\x91\xf2F\xb9Q\x95Q$SH}[\xfdv`+\xa4\x1dEJ\x1fV\xc4Vg`\x9c\xb1\xc5a\xb2\xa9IƯ\xa6\f\x1a\xbfR\x19\f\x9c\x01Q\xc5<\x05\xe3+:\x05A\xe8\xae\x14\xf0\x95['\x0e\x1f}\xe1\xfa`/\xd9zu\x922\x17p\xaf\xa2\xa3\xa3\x86\xc6\xc1>\xab]3w\x16G\x83\xddv\"7$N\xd3'N\xb3(\v\xb9\xd8\n\xe7\x0e\xe2B\bYtr\xc22\xfb0\xb7\x14Y\xc1\x1aq6\x1e\xed|\x9e\xec\xa2øZ\x8e\x9e\xbd:\xce\x18[\xf6\x10Jq\x10s\xce_ʜ\xfbR\xfd9a\x10iaj\xa1\xd2\xcb\xf5\xe7\x15\xad\xec'\xdd\x14\x8d\xdfWɛRq\xd0@\xeb\x1arո\x16ѿ\x16Q\x15U\x87a\x05\xe5e\x92|h+\xaf\xab`jy\xa3ۨ\x8a\x821\x854\xb0\xd5m\a\xb6B\xba\n\x16\xb1\xd5\x19\x18glq\x98lj\x92\xf1\xab)\x83\x9e\x82\x198\x03\xa2\x8ay\nv\xd1-\x13@M\xe2\xac02\xac4\xe2\n=\aB\x93\nL\x1c\xacÑ\xb5\xf3\x90?O\xbc\xd8ȹDN\x9c\xb3\x9c\x1f\xa1\xe1A\xe7%R\u05cd~\xc5/\x1b\x16\x1f\x11\x91\x15\xec8\xea\xb0!I\xc1\xe8.?G\xef\xa1\xeb8cl\xd9C(\xc5A\xec9\xdfW_\xb8\b\x0f9\x91\x06\xb6\x16*\x82\xfdBڹ\xb4\v6A\xc7/-N\a\x1d\x9a\t+\vp\a\xa9\x80f)XN&\x90\r(.\n\x1c3\x16\x89\x87\xd6V\xde0\x92O\xcb\x1b\xe5FU\x14\x8c)\xa4\xbe\xad~;\xb0\x15\xd2U\xb0ȭ\xae\xc28c\x8b\xc3dS\x93\x8c_M\x19\xf4\x14\xcc\xc0\x19\x10U\xccS0!Hh\xf7\x04\x83\x02\xeat\x93\xa1\x03\xef\x0es/r+ף\x93T`\x14l\xd1r2\xee(\xd4^l\x9fq\xb5\xe4\xefРs\xd1ܳ\x14\x12\xd66\xbc\x9f\xc4(\x98]V0z'\xa1\x9e\xa3#\x1e\x1dg\x8c-{\x88a\xd7R}/\xd6\x01ҟ\xebk\xb4\xd7j\x0e\xcaւa\xc1[\x99(\xabf\x01\n\xf1K\x83\xe2\xa48\x99/Q\xb32l\xe1\x9aK\x93s]\xa4]\x98>\x98\xe3B\xef,\x1a?\x1a^yR\x1c\x16\xb5\xbcQnT\xb5\x0f\xa6\x16R\xdfV\xbf\x1dZ#\xf5\xc1\"\xb6:\x03\xe3\x8c-\x8e\xae\x821~[\x87\xf5\xc1d\xbfr\x1fL\xdf\x19\x10U\xccS0\x91\x804\x1f\x8c\f#}a\xe6\x83E肱\n\x96EN&a\x89\xf6bC˳\xf0\x10\xab\xc7\x1er\xb1\x1d\x17\x835e\xb4\x03t'\n\xe6\xc0\xd7\x15?\x97N\xbe\xd2s\xc6ز\x87`\xcf\xe3<\x9c\xf9\ny\xaf\x9c\x16\x1d\xe5ic{l-\x18֬|\x0e\x15\xae\\\x8dB\xfcf\x91\x88\xcc\"\xec\xd1A\xaa\x89\x04R\x95fj\xd0H\x06\x94\xfd\x99y\x838\xbd\x95\xe8.\x99M\xd1l\xeb\b\xf1\xa0\x16\x87E-o\x94\x1bUQ0\xa6\x90\xfa\xb6\xfa\xed\xc0VHW\xc1\"\xb6\xba\xbe3\xb68\xba\n\xc6\xf8ՔA\xe3W*\x83\x813\x84zw\x8f\xfc\xc7\v@\x04\xccU0!\xd0\xee\t\\CtN\xfeŰs\xf2K\xd4~W\x89N\x17\x8c\x9d\x93_\xce\x15\xd6\xee^\xc69\xde\xea\xb8ⷹ:\xd0Y\x97\xcd\u007f\x05]H\xcb*/K\xe7l\xef^\x10gq\xd7\xf8\xfd\xbd8\xe3N\xee\xf9\xc6Cd\x02\xa8\xd0A\xef'\xf5\x868\x1e\xfc\xc0ﷻ\xfc~\x1e]H\xaf\xe9o\xb4\x9d\xeb\u007f>\xef\x12\xa27\xff\xea\x17\xa4\xf7 }g\x1a[e/[\x1cr:\xd7\x1c\xcaK\xbbD\x14,\xad\xac\x19\x1b\xb4j\x0e\xac\xd6B\xb3{+\xb7\x1b\xbd\xc5ыF\xf1K\x8a\xb3\xa6\xa3u%)\x8e\x83\xcb,;\x8e\xfd\x92&*\xe2v6\xef\xe4\xc4{\x91\xf6E\xb5\xcd[\xb9z2'\xdf\xf5\xc1`\u007fAf\xebu\x8d\a\xb58*ly\xa3ڨ\xe2\xbd\xc8\x0e\xfa}\xa5\x14\xd2\xc0֠\x1d\x94\n\xb1\aV?\xacȭ\xae\xefL-\x0e\x93M\xe3\x81i3&\x9b\xea\x97-\x83\x9e3b\\\xc0\xfd\b\x01Q\xc2\\\x05\v\x900X\x15M\x1d\xa8\xf0\x86\xf9]\xe4\xf5\xb4\"\x9d\xa4\n\xfb\xbbH\xa1f\x81\xddQX\xbf\xc0\x96\xf7\"\xfe\xdbv\x81L\xd0\xc1\xfd\x9b\x9e\x82\xf4\xb9%\xef\xdap\xd2%\xc52\xe87\xfe\xf1\x00\x83vP*\xc4\x1eX\xf9\xb0\x88A\x84V\xd7w\xa6\x16\x87ɦ\xf5\xc0\xb4\x99\x9aM\xf5˖A\xcf\x191\xaew\x84\xfb\xf5.pG\x98\xab`#\xe6U\xeec\x9d\xa4yH\xe3\x04\x00\x00\xcc%F\x14l\xa2=V\a\x14\f\x00&\x041\xa2`\x13\rP0\x00\x98\x10\x80\x82\xdd\x05b`V\xe6\xcdo=\xc4\xf2\xad7\xc3\xe4\x04\x00 \xaa\x80\x82\xdd\x0540\xdb+\xa6\xff\xa8\xd5/\xaaa\u007f\f\x9b\x1b\x00\x80\xa8\x01\n6J\x86\v\x18\x96\xb0H\x99\x00\x00\x88\x0e\xa0`\xa3\xe3M\x1d\x01{\xe8!\x18H\x02\xc0\xf8\x00\n6:\xf4\xba`\xd0\t\x03\x80\xf1\x02\x14lt\xe8\n\xd8C\x0fE\xca\x06\x00@T\x00\x05\x1b\x1d\xa0`\x00`&\xa0`\xa3\x03\x14\f\x00\xcc\x04\x14lt\x80\x82\x01\x80\x99\x80\x82\x8d\x0eP0\x000\x13P\xb0\xd1qo)\x98wf0\x92ɸsm\xa67\x92\tp\x1fc\xb2\x82\xb5\xbb\x95\xd3\xd3\x17~\xb1\xc8\x11\xe3\xb1Z\xadŨ\x18o+\xc2X]\x8c\xb7N\xc3/\xb9\xd8,\xb1+\x8c]$\"+X\xbe5\xae\xda0{\b\xbb\xacqU\x91ldƠ\x9e۰\xc3\xc848\x9dG\xc2\x1a\x1ct:\x9d{\xd1^\xbc=\x18\xc6\xea\xd3l\xe7*\xfc\xf2\n6\x9b\xffi\x18;\xb4-n[\xb8\xb7\x81\xfb\x1bs\x15\x8c\xaf8&/O\x14t\x9f\fk:bx\x8fu[\x10\x05\xb7Y=\xc3W\x1dbh\xc9M\xc0\xdbn\x9fo\x97\xb5%\x9c]\x04\"+X\xc0\x17?\x12]\xa0\xf0G\xa7\xeb\xdb\xfaN\x0f\xdb\x15\xfdz\xee\x8a\xf3D\xb0\xa0\xdch[\xbfW\xf7\x8d\xb6\xf3\x92\xc1A\xe7\xde\xcf\xd1\xe7\xef8\x0f\xdeе\x13\xb9\xfd\xf3W\xb2\xf1\xcb\xef\xdb\xda\x1a\x9c?\x0fc\x87{\x86\x8f\x96\x86}\x1f\xb8\x9f1W\xc1\xbcMݒ\x82\x05\xaa\xa3\xa5`\xa8\xddz\x00o}\xd6\xf6\xf0f\xc5\t\xe2kK\xc4+;\x1c\x91\x15\f\xa1\x84\x11+\x18B\xf3\xf4m\xa7/\x1e\xbe/\xda\xf5\xbc\x18\xbf!\xbc\x81\xc2f}\x05[\xbfEJ|\xe4<\x85\xb7mΏt\xcd\x14\xf6f\x8b\xaf\xe7#(\x18ڔ\x10\xe6\xe9\xbd\xc0\xfd\x8d\xa9\n\xd6\xee\xe1\xc5\xe7\xe4#\x9f\xdbW\x11\xc3\n\xf6\xbf\u007f\xf7_\xff\xf5\xeb\u007f\xfc_x\xfb\xbb\xa7\xc6D\xc1R\xc7A\xc1r\x93\xc3v\xe6\x18\f\x14l\xed\x16)\x11m\x05\xe3\x93s\xc3\x1b\x00\xf7/f*\x18_\xd1%\xad\xf4\x81\xfayy\xd5[]\xaa\x95\x98O5\xe2\x17'ǧ\xcc;\x83\xf7\x9ey\xd4j\xddԵtj\xe2\x9cA֘\xb9\xb2U\xdb|k\xbc{ݴ\xc4\xd9\xf4\xcb<\xb04y\xca\xc2\xdcaWv\xe5\xcc\xc4i\xebx#\xbfݓ\xad\"\x93\xd9\x0e\x81\xa8`o\x92\xb6x\xea_\xc9\xf6_e\x05\x93\xbda\x05\xcb\xcfM\x9e2\x8fF\xa1\x8e\xceN\x89O\x9a\x93B\xb3\xeeJML\xdd%z\xe9Z\x98\x14\x9f<\x87>\xc6cAƃW:p*\xd2\x10\xe5z\x0eL\x96\xbb`m\x9bWd?\xb3y\xc5m\x9c\xbcݰ~\xfeچ\xdbt\xf7\xa7[\x9e\xc9\xce\xd9\xfc{D\x15\xecu\xa7ә\x8d\a\x89\xb7\x0f\xae\x9f\xbf\xea\x8d[\b\x9dp\x8a\xacG\x1a\x05\xbb\xb1%'{\xc5f\"e\xaf8\xb3\x0f\xbe\xb1j>u\x80~\xbf=\xe7\xe9-\xaf\x84*\x98\xe2\xec\xa3l\xa7sϧ\xdbWdo\xfe\x82\xbe\xb1)\xb1\x1f\x01\x80\x1ef*\x18Y\x1e2\xa0,\xd3\x1dN\xc1\xf8\xa3\x937\x05QpӔ\xa3<\xbe\x9es}\xd5\xf3\xe2\xf0\xe5\xd8_]\x95\xf2\xe4\xe4\x94uK\xad\x9aAF\xbb\xd5\xdb\xdf\u07ff\x9f\\٪mgգ֤\xe2\xd2\xc9\v\xb1A\xd7\xe4i\x1e\xeflk蕝\x1b\x97\xef-MJ\x15\f\xfc\x0exJE<\xecR\x85\xa2\x82=\xfc\xe6\xd0\u007f\xfc\xe3C\x0f\u007f\xeb\xd7C\xff\xf6\xb0\xa4`\x8a7\xac`\xd6Ԫ\xaa\xd4D\\\x9e\x93֥\xd5M\xee$+Q\x8c܄M\xdeM\tK\x89\x13_b궦b+\x89\xf6`\x05\v,\x8d+ma\xcb\xc3\x1f\xf3=\x99\xe1\xf3\x85\xde\xea\x88r=O[}\xe2\xfb\xbf\xfc\xfe\xf6#\xa7\x0e>\xe3$\xe2\xb1#{ϩ=\xd9\xdb\xc9\xee\xb6\xf9\xeb\xdf9\xb5\xd7ـ\xa8\x82\xfd~\xbb\xb3\x81\x84\xbdv8_?Ր\xb3\xf66\xba\xd1ֶjc[[\xdbo\x10U\xb0[\xb7n\x9d\"\nv¹\xa3\xed\xc8f'6\xfd\xe8H\xb63g\xef;\xf3\xb7`\x83O\xe7\xaf:xb\xb33T\xc1\x14g\xb7\x8e\x1cY\xb1j~\xce\x1bۿ\u007f\x95\xbeq,R\xff\x11\xb8o1Q\xc1:I\bzd\n\x86/;2\x8cZL\x06\x13|5\xe9ؤ.\xa4\xbbS\xad\xb3\xf9\xd0u\xeaۥ.K\xbb\xd66a\n\xbeN\x97&\xe1T\xc6T\xbcWH\r\xb9\xb2\xbdV\x0f\xfd\xab\xca\xc8o\xf0\xa2\x88f\u0081\x14\xf7zj\xe8\xd7\x0f}\xeb[\x0f\xfdߡ\u007f\x94\xe2`\xac\xb7\x84i\xb8\a\xd1?u&\xeev%\x11\xed\xda5\x05\xeb\xda\x01ڃ:`ݏ\xdfJ\x99\x83Eq\xa0\x9a,ڄ\x15l[\x82wxytG\x91Q\xad\xa7\xd7zQ4l\xc8!\xda\xd5\xf04\xeey\x9d\xa2\x9d)\xba\xbd\xb5b3\xee\x1c\xdd>B\x82\xf3X\xc1\x1a\xb2O\x10\xdb\x13\xf4v\xe3y\xf1\xe6$3\x8a\x14\xc1\nv\x8bd\xb8-\xbe\x93\xfd4\xee\u007fm\xcf\xc1\xa9\x8d\xab\x88\xaf\xb5!\n\xa6u\xe6\xdcx\x03ݖn\x05t[G|;\x17\xb8\xcf0O\xc1\xf8\x8aNA\x10\xba+\x05i\x91\xc8\xf0\n\xe6K\xe4\x11\x9fH{\t\xc1]s\xa6N\x96\x86T\xa9:1\xdevkiKKK)\x8d\x0f1\xb6\tD\xfeHP\x88\xb7\xba\xc9ߛB\xae\xec\xc5S\a\x061)\xb9\x06~/Ze\x86\x8f\"\x1f\xfa\xfb\xa1??\xf5硧\x86\xfe\xfc\xb0\xa4`\xac\xb7\x04:\xc3<\x05\xbb\xe8\x96\x11WY\v\xaf`\x83Iu\xa8.\x89\x88]Krʆ:_\x86\xa4`Ӈ\x9b2\xf1!֖\xc6\xd3ɕ}R\x1c.\x85F\xb8S%}Zh\xe4\xd7\xe7\x15\xf1\xb1;%\x05{过\xfech\xe8\xd7C\xbf\x93\xfe\xd4x\x13#\xf9>\xebi\xb2,\xf9\xe2i\xd6$2\xbfi\xe6<\x9a\u007f\x0e>P\xa9U\x8d\xf2\xccK\x9e \xc6Z6\xd1\t\xe0z~u\x91\x15\xec͡\xa1?\xffyh\xe8\xdfd\x05c\xbd%\xa4\x900״\f|xZ4\x94\x91O\xc2Nd`TE\x86\x8c|r\x06\x19W\xe6\x13\xa1#\xb3)\xf6Ǔ\x12iʓ\x813\a\xa5`P\xf76q\xb8\x17\xedz.\x9e*~\x95\xec\xa5\xfa\x836ҡ#\x89I\x1d!;n\xe4l$j\xf6\xfa\x1bH\x9cMq*\x9b(\x9ah\x80\xf6\xd0\xe9\x15\x1b7\"\xf49\xd9\xc1(؊-\x88D\xbc\xb4\n\x86֯\xc0*\xf5\x9b\xec\x10\x05\xd38c\x15L\x986\a\x01\x80.\xe6*\x98\x10h\xf7\x04H\x00\xbb?\x10\xf0\xf8\x02\xe1~\x94'$\xcfN\xa6WX\xb1u\xf1\xaem\xa9x(\xd62\xd8B\xef\xd1]\xd4\x1a\xb2s\xd5Uۀ/>\xb7\x05\x9d\u038d\xf7\x05P{bJ\xf1\xa6)q\x8fz:Ź\xea\xa5>\x1f\xe9\xddl\xb0.\xae\xf6\xe6Z+\x91\xbe_}d\x05\xfbס\xa1\xff\xf3\xefCCO\xc9\n\xa6z#\xf7\"\xe7\xb44͜r\x91\x94=\xb1\xd8[\x97K\x87wK\xe36x7ĉ\xf7\"\x1f\x9b\xe6ޟo\xad s\xf2s[\x06\xf89ɾ\xa0\xc6\x03V\xa4Һىb\x1fl\x9e\x95^\xcfQ\xafgW\x9c8\xf5}\xafs\xfe\xde\x13'vБ\xdev\xe7\x9e\x13{\x9c\xe2\xbd\xc8\xecU\r\xa7^w\x1e$s\xf2_\xf9\xf9\xed\x1b\x9bs\xda>\xc7r\xf3\xfd\xedG\xb0-\x95\x9e\xbd\xd9\r'6ο\xaa\x99\x93\xbf\u05f9\xa5a\xefZ<&\xfd\xf9նl\x9c헯d\xb7]E\x1f\xcd\xcfٻ\xe7ig\xf6\xc1\x8f\xd0U2'\xbf\xa1\xad\x8dD\xbd\x14g_\xfc\x82\xdeؔ\u007flT\xcatR\x01@\x83\xb9\n\x16 a0\xd2\x179)F\xc4\u008d\x15J\x13\xc4\vL(}2!i\xb1gj|ƙ8\x1a\xd0\t\xf9~V\u007f/\xe8fl\xc9$\xab\xf8\xf6D\xbc\xc5\xfd\x9f\xaeyS\xa6\xae\xf3<\x8a\x93\xb9RP\x88vE\x0ed$M\xc9؏\x90\xbe_}d\x05\xfb\xfb\xff\xfa吏\xfa\xef\xdf=\xac(\x98\xe2\r\x8f\xf1\x8a\x17ON^J\xa2}\x95\x19\xc5)\xf1\xc9\x194>%\xd0\xf9`b\xb7\xa7kq\xca\xe4\xe9u\xe4w\x91Vk\xdc\xc9*\xbcݤ\xf1\x80\x06\xf2\xa7$fHq*O\x12\x8d\xd0G\xbf\x9e\x9b\x1e\xa3Ѧ\x83\x1b\xf7\xae\xc8\xce\xd9HCU\xb7\x1b\xd6*\xf3\xc1~\xb3%g\xfe\xfa\x13\xf4w\x91N\xe7/\x8f\xe0\xcdO\xf0\xdeS\x1b\x9fyz#\xed\xb4\xa1[\xaf?\x9d\xbd\xf1\xbc\xf6w\x91\xb7\x1bVe\xe7l?\xb8*{#\xf9\x01d\xf6\xaf\xe6\xe3-\xee\xdc}\xba\xf9\xe9\x15{\x0ef\xe3\xe4\x0e)\xf8\xb5\x051\xce>b\x02b\b\x1dM\\\x87\x00@\x1fs\x15,\xf6yH\x9fH\xd9&&\xeb\xe2'⤅\xaa\xf8\\͌e\x00`\x00\x05\x1b\x1d\xf7\x94\x82\xa1Ҕ\t\xf8t\x9ddx4\x05`\f(\xd8\xe8\x10\x05\x8bi\x91\x98V0\x00\x885@\xc1F\a(\x18\x00\x98\t(\xd8\xe8\x18>\x80\xfc\xeaà`\x000^\x80\x82\x8d\x8ea+\xde>\xfc7\xff\xe3aX\xf1\x16\x00\xc6\tP\xb0\xd1\xf1o\x0f\x85\xf0\xb0\x05K؛\x91\xb2\x01\x00\x10\x15@\xc1FIh'\xec\xab\x16\xcb\xdf\xfcO\xf8\r\f\x00\x8c\x0f\xa0`\xa3\xe4\x8f!\x12\xf6UK\xee_O\xe9\x04\t\x03\x80q\x01\x14lԼ\xa9Ѱ\xafZ\xeaNZ\x92;ᙢ\x000\x1e\x80\x82E\x19\xdeR=t\xcc2\xb5\v$\f\x00\xc6\x01P\xb0(C\x14l\xe8\x80e\xdaE\xf6Y\xd4\x00\x00\x8c\r\xa0`Q\x86\xb7T\xfdeh\xa8\xce2\x1d$\f\x00\xc6\x1eP\xb0(\xc3[*\xb1\x82\rUZ2\xbaA\xc2\x00`\xac1Y\xc1\xda\xdd\xe2C\xe1y_u\x85\xf7̽\xf0\b\x02\xde\xe2\xf9\x92H\xd8.\xcbl\x900\x00\x18k\xccU0\xbe\xe2\x18}\x80\x1f\xef\xf1\xb6w\x9f\xf4\xd4\xdd\x03\x12&+\xd8\xd06\xcbB\x900\x00\x18c\xccU0oS7U\xb0\xa6j\xf2\xa4\xbfkQ[\xb6\xdbDxKŗ\xa2\x84m\xb2,\x05\t\x03\x80\xb1\xc5T\x05k\xf7\xf0\xe2s\xf2\xeb\xc4'\xeb\xf9\xbca\xcdc\x02\xde\xe2\xfe\x93\xa8`C\xeb,\xf9\x01\x900\x00\x18K\xccT0\xbe\xa2KZ\xe9# >\x01\xfe\xd8D|D\xe8\x1d\xc2[v\xfd\xe9\xcb/\xc5\xd6ɵ\xac\x03\t\x03\x80\xb1\xc4L\x05\xf36\xb1k\x15!$Ti\x96b\x8cM\xb0\x82\xfd?\xb9\x136\xb4в!x\x0f\xc4\xf6\x00`\xc2b\xa2\x82uzx\xad\x82\x1d\xf3\\3\xb6\x8e\x15xK\xa9@:a\u007f9v\xf4\xe8Q\xdfc\x96b\x900\x00\x18;\xccS0\xbe\xa2S\x10\x84\xeeJA\x90v\xb4\xb8\xb5+\xba\xc6&X\xc1\x06i',\xc5\"R\xca\v\b\x00\x80\xb1\xc1<\x05\xbb\xe8\x96!됡A\x9f\xbb3R\x96X\x00+X?\xfaSŗCM\x969\x9b\xb6m+u7\x05A\xc1\x00`\xac0O\xc1\x84 \xa1\xdd\x13\xa4W8\xef\xad\fD\xca\x11\x13\xf0\x96m\xfc`\xb1e\xdb_\x86\xe2\xa7\xec\xef\xbcx\xb1;8`\xb9\xe7\x88\xd4\b\x000^\x98\xa7`\"R\x1c\xecZU\x1d\x8fE\xed\x1ex\xa0\x03Q\xb0u\x96I\u007f\xfb\xe5P\x95eW`\x00\x0f\x94\x91\xe5\xe6=\x06(\x180a0W\xc1\x84@\xbb'p\r\xa1\ue2aa\xee@ po̦ؖk\x99\xb6\xc1\xb2\xeb/\u007f\xf9\xdb'\xdb\xe9\\\nP0\x00\x18+\xccU\xb0\x00\t\x83U!\xb4_\x8a\x88\xdd\x133Z\x13-\xa9\x9e\x96i\xd6/\x87\xb6Y\xaa\xe9\b\x19\x14\f\x00\xc6\ns\x15\xec\x1e\x84\xb7X\xa6W\xb6_k\xb2x\xfe\xf2\xa5e\xe1E2\x95\x02\x14\f\x00\xc6\nP\xb0(\xc3[\xe6Uw\xf2\x02?\xcd\xfa'ޒ\xd1I\x86\x91a\x14L\xef\xad\b\x82\x17E=\x8c\xecJ\xdf\x02\x14\f\x980\x80\x82E\x19~\xd3Q,`h\xe0\xc0\x03\x93,_)\xee\xba\xd7\x14\x8c\xee\x00\x05\x03&\f\xa0`Qf\xe0Z\xb0_\x9c\x1e2}v\xe9\xb1k\x11\xe2`\xa0`\x000*@\xc1\xa2\x8d\xf4\x1b\x03\x81\xbf\xd8\xdeu\x8d\xfe\xa2\xc8\"+\x01I\xbc\xf6\xb8e\xd2w?\xc1\u007f\xbc\xfc\xc8_?\xf2\x02\xd9\xff\xe3\xaf[\x1e\xf9\xe1\x1fH\xe2q˃/S\xab\xf7\xbf3\xe9\x81\xef`#˳\x0fZ\x18\x03%\xcbMƑb\xfb\xc2#\x96\xaf\xff\xf4\xe5G,O\xfc\x8cu*\xf1\xb3Ix\xf3]\xfc\u007f҇\xea\x9b8\xcb_?\x82\x8fH|X\x1e\u007f\r'Ȏ\x17nj\xcar\xf3\xa7_yA\xc9Bg\x83\x81\x82\x01\x13\aP\xb0\xb1B\x18\x18\x18\x10\xc5L\xa3`_\xdbw\xf9\xc3\xefb)y\xfb\xc1}\x97\xf7\x11}\xfa\xe9\xdf\xfd\xf4\xf2\xfb\xdf\xfc!\xde\xf3\x95\xb7/\xbf\xffO\xd4\xea\xef\xf6]\xfe\xed?\u007f\x0f'\x9f\xf8\x905\x90\xb3P_\xb2#\xd5\xf6\xfd\xcb\xff\xf2\x00\xd9|\x93ɣ\xf4\xa2\xbe\xf6\xde͟Y>\xbc\xf9\xdeט7-\xd4\xe1\xdb7o>\xfe\xec'\u007f\xf8鷱N=\xb8\xef\xb7\xfb\x1e\xfc\xb1\xa6,x\x1f\x9b\x85\x1e;B\xd5\x01`\xdc\x00\x05\x1b{4\n\xf6\x1e~\xfdO\xdc!z\xe2Ǥ\xa7\x83\xf7\xfc\x03\xd9\xf3\xe1#7o~㵛\xb2\x15\xe1\xb7\x0fJ֊\x81\x92\x85ZɎ\x14\xdb\xf7o\xde\xfc\x84n\x1e`\xf2(\n\xf6\xcf\xcf\xde|\xd6\xf2\xf2\xcd\x1f\xfe3\xf3\xa6\x85:|\xe2\xe6\xcd\a>\x14\x8d\xbeAw|\x83-\xcb\v_\u007f\x9f-\x03(\x180\xb1\x00\x05\x1b{4\n&'&\x91\x91\xe4'$!\xfeP\a\xef\xfcDV\x8d\x9b\x1f~{\x92\xb8\x8b\x8c\x03\x15\x03%\x8bd\x15b\xab\xece\x9d*\xbc\xfd͛O|\xef\xdb7\xbf\xf1v\xe8\x11?\xc1*\xf8/\x93\xbe\xf72\x11\xb1I\xf2\x0e\xa5,?\xfc\xc6oo\xb2e\x00\x05\x03&\x16\xa0`cOx\x05\xb3H\xfd\x1fq\x8f\xf8\xe6\x13\xff\xf2\xe1\x1f\xfe\xa0\xe8\x85\xc6`\x98\x82im\xe5\xc3\xc8y\x14.O\xfa\xf0\x81\x0f'}h\xb9̼\xa9(\xd8\xcd\xf7\x9e\xfdΤg\x19\x05Sʲo\xd2\xdb\xf4U\xc9B7\x91j\f\x00\xe3\x05(\xd8\xd8C\xf4\xea?\x89L\xb0\n\xa6\f\t\xbf\xf1\x82$\x0eO\xbc\xa6\x88\xc4\x03Xg\xf6\xc9֪\x81f\x14\xa9k+o\x94<*\xff\xf0\xbd\u007f\xa0\xff\x997\x95Q$\xe1g\x0f0\xa3H\xb5,\xef}\xe55M\x16\xba\x89Tc\x00\x18/@\xc1\xc6\x1e|\xd5\u007f\xf7\xbb\x1f^\xde\xf75V\xc1\x94\xb0\xfc\xbeI/\u007fry\xdf7q\xe2A%z\xfe\xf8\xb3\x97\xdfS\xac\x15\x03m$_\xdejl卒G\xb2\xc3!M\x93\xe8U^\xc3gE\x8e\xac\x92\x12\a\x1d\xe6\xc9\x1f\x80\x913ր\xb5\r\xaf`\xecy\xa6{F\xddW\x98\xa9`\xde&u\xcd\xee\xa0\xdb\xed\xf6\x84\x0f\x83\xb9l\x97t\x922\xf6\xb2\x81\x81B\xd2\x03\xfb\xb8\xd1\xc69\xcakf\xe0/\xba~\xff\xac\xb2\xeb\xe8z\xd9,?>\xcd\xce\xfa\xfd\xa2\xca\r46f-\x98\x91UR\xc4\xf5\x92\xce\\Ys\x99\xbdH\x93\x8d\x81\xec\xcd\xda]\x9e\x95v\xc1 \x9b\xfe!PϬ\x05\xf5\x87WsT\xc1\\\xdc\xd6\xe6\x1a\xc72,)g\xb9\xa2\xc6\xe3\xf5\x0eN+\xd4͜\xab\xb5\xb1\x80\xeb0*\x03\xe3a\xf4uk\x9dŕ\xe4q\x8eݎ\x1a\x03\xbf\xfc\a\xfe\x05y~\xbf_\x1bJ\xbe\xfe\xfcJ?\x8f\xdf[\xf9\xfcu\xdc\xd4ܢ\xc6ÎB\xa3\x92\xb1\xa8u\xd3`\xe7\x9656.\xc1\x8d\xca\x14\x9d\xf5\xa0fc*\xd4\xffA\u058bW\xe4\x1a뢶\xaf\x18\xaf\x92\x02\x91\xadi\xcb\xde:^\xce\xd5 M\xd1U\x98B\xea~B\x9a&ѫ<\xcb\xe0\xa2\xcc\xda2{Z\xfd\xea\x1a\xe6\x030r\xc6\x18hl#\xf4\xc1\xd4\xf3L\xff\x8c\xba\xaf0Q\xc1:\x89b)}\xb0`\xa0\xbd:l$\xbf\xd7\xf6\xa2NR\xc1N\xbe\xd8\n\xc4d:ַ\"\aI\xbaȩ\xf6\xbc<\xf1B\xe9\xa7-\xe3H\x1f\x04\xff;\xce\x1dGd۬\xcd\xc6\xfa\x9d\x8b\xcd\xfa\xb2\x96\x1bf\xd3=\xc4\xca\x05\xf8*\x13\x96\x90\v\xa8\x99{\x17\x91s\x12\u007fi\xd6:h\xcfh\x96\xf6|\xebo$W\xe4\x92]M\xa7\x00\x00\x00\x11\xe6IDAT\xe7hv\xbd20\x1eF_\xb7\xcc\"\xec\xef0\x9d\x8cb\xe0Ww\x94\xf3\xae؛YDm\x1d\x9f\xe1\xa3\x13[#\x0f\nl\xdd\x18\xec\x8b\x06\xb08-X.\xfd%\x15]\xf5\xa0ɦT\b\x95\x93\x8eK\x91\xf14\x1a\xb6}\xa9S:\x8c\x1f\xc8Z\x83\x8f6\xd8؇آ30G\xd3\xff\x844\xa3H\xddʫ4r\xb83W\xcb\x11qf?\x00\x16\xc5\x19c\xa0\xb5\x8d<\x8a\x94\xdą\xbc\xf7\x11\xe6)\x18_\xd1)\bBw\xa5\xa0\xb4\xfe@uS\x18\xfb\x97l\xbd:I\x05\xbb\xab\xa3c\x89\xa4`\xe4\x1c\x17cP\xad\xf6~ԟ\xe6\x97m\x94\xab\xdc.9pI\x17\xa6K\x9b\x8d\xc1Ngm\xd4r}F\xd9\xf4\x0e\xd1\xc7Փ\x972\xe2\xacp\xee \xae\xa7\x90\x85m/e\xce}\xa9\xfe\x9c\x10:\xe1\xe3\xb3\xda5sgqKhv\xbd20\x1eF_\xb7\xccF|}\xf0h\xe7\xf3\x86~u\x15\xec\x1c7\xd0\xffn\x9f`?\xa7\xb15\xf2\xa0\xc2ԍ\xc1\xfe*ي\x8d\xca(\x98\xea\x81ͦT\b]\xc2\xc200\xa3\x15\x19\xc1\xb6\xaf\xaa`͜:\x8a\x8dTH\x83O\x88U0\xddʫ\xecLG\xe4F\xd3!\xa4\xfd\x00X\x14g\x8c\x81\xd6v\xc4\nfT\xde\xfb\b\xf3\x14\xec\xa2[&\x80\xa4G\x01\x9eq\x1b\u007f\x97\\\xb1\xbbt\x92*\xe4#mnU\x92\xd2i*8\x0e\xa1C\x0e٫z\x95\xcbQ\x9e\x95\xa2\xe6\x15,\xd7fc\x10\xf3\xf8\xb9\xb3F\xd9\xf4\x0eq\x96\xa3\xc2B\x9d-\x91\x02\x1f\xe4+\xbe\xaf\xbep\x11\x1e\xc2!\r\x1d\x8e\xac\x9d\x87\xfcyK\x94\xec\xa1e`=\x8c\xban\x99\xc7Q\x87\rQ\x053\xf0\xab\xab`\x03\xb6s5\\Y\x0f7\xa0\xb15\xf2\xa0\xc0֍\x81mTF\xc1\x14\x0f\x9alJ\x85\x10ZS\x82\x8e\xa7\x87\xb9\\\x99\xf6U\x9d\xd5\xd0B\x8bD,\xa4\xee'4,\x92?\xac\xf2*5\xe4n\xf8q\xda\ac?\x00\x16\xc5\x19c\xa0\xb5\x1d\xb1\x82\x19\x95\xf7>\xc2<\x05\x13\x82\x84vO0(\b\x95>\xba\xebL\x85\xb1\x82m\xe5zt\x92*\xd2Gz\xee3\xedi\xba\xf59\xf4\x9c\x12\xf5W\xafr\xe5[p.}\x99\xebB\x06g7\xb2\xd3\xdc\xf5\x1co\x94M\xef\x10\x9fq\xb5Ԍ8+\x9a{\x96\x82\vv\x96\xf4\xe7\xfa\x1a\xed\xb5\x88e\xd1r2\x88)4V0\xc6\xc3\xe8\xebF\x14\xcc.*\x98\x91_\ua87e\x17iXԘ\xb7r\xd1!\xdaSPm\x8d<\xa8\xb9\x98\xba1\xd8\xe9-c\xb1Q\xf5\x14L\x93\x8d\x11\xd4Î\xc1p\xbf\xc5`ۗ:\xa3\x9d\xe0V\xb6\x0f\x16\xa1\x90\xfa\x9f\x10\xdb$\xfa\x95W\xe9\xe5\xd6\xf4\x9e[\xb0\x92\x9cȚ\xb3\x84Aq\xc6\x18hmG\xac`F彏0O\xc1D\xc48X\xd5\x01\xb2\r7\x8a\x8c\xd4\x05\x93?\xd2̝\xdaӴ\xc3~Ůđ\x87_\xe5\xcd4\x8a\xd1(Ɗ\xf4\x15́Oo~n\x9ea6\xddC,\xcf\xea\xc3c\t;qv\\\f\x94\x94\xe1\xef\xc9r\xee8I\xe6i\xa3xYī\xb0\xc4X\xc1\x18\x0f\xa3\xaf\x1b\xa3`F~\xf3pe\xaf\x84\xde\xf0{\xfe%\xdbq\xeeE\xea[\xb55\xf2\xa0\xc0֍\xc1\x9eE\"S\x8b\U000a4fc6)\x98&\x1b\xa3`\x83\x8e\xc3\xe9\xf2 \xb2\xb7|\xd8-N\xb6}\xd3\xf0\x89 ,'\xce\xfa3\xf3\x06\xf1\xcbV\"\xf6\x91\n\xa9\xff\t\xb1M\xa2_y\x95\xb3\x9c\x83\xe3\xf2\xe8\\\x1f\xcdY\xa2\xe7\x8c1\xd0\xda2\n\xa6SM\x82\xd4fF彏0W\xc1\x84@\xbb'p\x8d\xcchm\xea\xec\xee\f\x17\xc9/Q\xfb]%:]0yN\xbe\u007fV\xc9\x15\xbf\xcdՁκl~r\x1a\t\x99\xab3i\xc7n\xf0\x03\xbfߎmx$tлA\xbd4c\x11\xb7\xb3y'WDg[3\xd9T\xc8m\xb3\xfa\x05\xe9=\x06\xd9\xf4\x0f\x81.\xa4e\x95\x97\xa5s\xb6w\xf1hb'\xf7|\xe3!\x179C˹\xb4\xb2f\x9c\xd4Frʹ\xc2\xda\xdd\xcb8\xc7[\x1dFeP<\x8c\xben\x17\xd2k\xfa\x1bm\xe7\xfa\x9fϻd\xe8\xb7\xdc^s(/-\xe4n\xef\xee\xb4Y\xc2\x02\xfb\ue4062\xf0\xa0\xa0\xd6M\xe3\xccέ\xe9h]\x89\x1b\x95):\xebAͦ\xa9\x10>\xde\xdct\xb9\x9b^\xc0\xa5\xf5!-l\xfb\xaet\xec\u07bd\\\xfc\x00Z\xed\x8bj\x9b\xb7r\xf5#(\xa4\xfe'\xa46\x89~\xe5Y\xce\xd9[\x9b\xfdW\xc4B\xb2g\x89\x8e3\x8d\x81\x9a\xa4s\xf2k\xe4:\xebT\x939ό\xca{\x1fa\xae\x82\x05H\x18\xac\x8a$\x9a\xaa+\xeaZ\xd4xE(\xd7ӊt\x92*\xca\xef\"\xb9\x9a\x17\xf1\xc6v\x81L\x99\xa1_L5\xf6\x1ajqVz\xbf\x1e\x9d\x13\x13b\xe0A\xa8Y\x92\xb6\xa4V\xa0\xbfxc\xb3)\xd8K\\\xb32\x8b\xae \x83l\xfa\x87\xc0\xfd\xaf\x82\xf4\xb9%\xefڨ\xb3\xe3y\x8e\xf4\x95\xe4˵qey\x96-3/\xe4t\x13j\x16\xd8\x1d\x85\xf5\vlyFeP<\x8c\xben\xb8\x83\xd08\x83Kk\x14\xc37\xfa~\a\xb6\xa6\xdb\xf3B'@\x9c\x9dU\x86U\xac#\xd4֠d2j\xdd4\xce\x16\x95\x17Π\x8d\xca\x14\x9d\xf5\xa0f\xd3T\x88\x84ȕ\xfew}ڰI\x1al\xfb\xf6\xe4\xd9g\xac~U,NOa\u058c\xe5\x87FRH\xfdOHm\x12\xfdʳ|`#嵭<\x87BΒ\xe1\xce4\x06j\xd2%5\x89\xd8\xf5ԩ&s\x9e\x19\x95\xf7>\xc2\\\x05\x1b1\xafr\x1f\xeb$\xc7\x03et\x06L\x00\xfa\xed\xea\xc5z\x88\v\xed\x9cL\x00\xae\xa7\xbdx]\x10\xfa\xce\x16\xa6G\xabp\x13\xb2\x9a\x13\x88\x18Q0\xf3\x1e\xab\x03\n6\x91hT\xee\xbd\n\xef\xce\x1a\xdf\x13ad\x1c\x92F\xb9\x82#4\xfauwL\xd0jN bD\xc1\xcc\x03\x14l\xc2Pފ\xf2\xca\xe4?\xae8J\x8c\x83\x0e\xe6qV\xba\xf1y\x8e\xd3\r\xc0\xdf1\x13\xb4\x9a\x13\bP\xb0\xb0\x88\x91[`\"\xd0\xcf-{)s\xa2\x8f\xa8\x04W\x9a\xab\xb1\xb5\x11o#Y\x02\xd1\x01\x14,,4r\xdb\x1b\xc9\n\x18\x17\xca\xd2\xf2\"<\xf8o\"pxu\xa6-sMtƐ@d@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]@\xc1\x00\x00\x88]bK\xc1\xcc\xfby$\x00\x00\x13\x11\x93\x15\xac\xdd\xed\xd5I\x1a\xf11\xb7S')3ҕ\xd8k\x8d\x97\xebR\xd6\xe7\x02\x00 &0W\xc1\xf8\x8ac\x95Ó\x86\x14\xa9\xeb\xdc\x16\r[\xf2v\xc4+\xb1\xf7\xf9\x97\x1b\xfeZ[Z\x9f\v\x00\x80\xd8\xc0\\\x05\xf36uW\x0eO\x1a\xd1Õ\xe8$U\x86=JΈ\x02\xe3\xe7M\f{\xca4\x00\x00\x13\x18S\x15\xac\xdd\xc3\xcb\xebE2IC\\j\xbf\xcb5\xbc\vv\a\x80\x82\x01\xc0=\x82\x99\n\xc6Wt\xc9+\xde2ICzm[u\x92\x12\xba\xab\xd77\xe2}\xe5\xca:\xf5\xea\xb2\xeeX\xc1\xb6\xe2\x9dv\xb2ʌ\xbar\xfc\x95\xa2\xcc\xf4B\x18E\x02@,a\xa6\x82y\x9b\x945\xbb\x99\xa4!.\xdb%\x9d\xa4\x8c\xde\xea\xf5\xfd\xfeYe\xd7\xe5u\xea\x99eݱ\x82])\xe2jȃ\xbfԕ\xe3{f-\xa8?\xbc\x9a\x03\x05\x03\x80\x18\xc2D\x05\xeb\xf4\xf0\xb2l1ICzm/\xea$Y\x94U\xbb\x94\xd5둋,\x97\xf0<\x99x\xc1.\xeb\x8e\x15\xac\xc6N\x9f\xe0Ĭ\x1c\xbfrA?Ys\v\x14\f\x00b\b\xf3\x14\x8c\xaf\xe8\x14\x04\xa1\xbbR\x10ؤ1/\xa9O\x1ad\x92,\x8a\x82\x11\xc5\x12\x03Z\xad\xf6~ԟF\x16\xd0f\x97u/(/\xe3ę\x17\xea\xca\xf1}t\x89!q\x8dT\x00\x00b\x04\xf3\x14\xec\xa2[&\xc0$\r\xcd#.y\xab\xb7r*\x12\x1c\x87\xd0!\xba:\x04\xbb\xac{\x81c\xc6\"q-+u\xe5\xf8\xb3\x1c\xd19\x88\xe4\x03@La\x9e\x82\tAB\xbb'\x18\x14\x98\xa4\xa1\xf9Vu\x9dۭ:K\xde\x12t\x14\fm}\x0e=G\xa3\xfe\xec\xb2\xee\x05\x8e\v\xbd\xb3\xe8R\x8b\xea\xca\xf1\x9fq\xb5\xd4\f\x14\f\x00b\b\xf3\x14L\x84\t~\x85\x8d\x83\x8d\xa0\v\xa6\xab`\x1d\xf6+v\xbaT\a\xbb\xac;\x99M\xd1l#\xbb\x99\x95\xe3\x97g\xf5!\xd4c\x97\x14\xacww\f<\x92\x1d\x00\xee{\xccU0!\xd0\xee\t\\\vM\xeaQ\xa2\xf6\xbbJ\xf4\xba`\xfa\xab\xd7c\xb7\x99\xab3C\x96\x80\xef\xf3/w}0\xd8_\x90\xd9z\x9d]9\xfeBZVyY\xba\xb8N=Y\xec\xfdG\xc3\x0f\x02\x00\xc0\x04\xc3\\\x05\v\x90\xd8WUhR\x87\xebiE:I\x06\xfd\xd5\xeb15\xf6\x1a\xd1BYֽ\x96\u061d%s\xc5\xc8\xe2\x83\xea\xca\xf1=\x05\xe9sK\u07b5\x89\xd9\xea\x1d\xf5:G\x01\x00`ba\xae\x82\x8d\x98W\xb9\x8fu\x92\x00\x00\xdc\xe7Ĉ\x82\xc1cu\x00\x00\xd0!F\x14\f\x00\x00@\aP0\x00\x00b\x17P0\x00\x00b\x17P0\x00\x00b\x17P0\x00\x00b\x17P0\x00\x00b\x17P0\x00\x00b\x17P0\x00\x00b\x17P0\x00\x00b\x17P0\xf3\x18\xe8\xef\xef\x1fDh\x10\xbf\fD\xb2\x05\x00@\x0fP0\xd38\x16g\xb5Z\x13y>\x11\xbf\xc4\x1d\x8dd\r\x00\x80\x0e\xa0`c\x88wf\x10\xa1k3\r\xd6\"\xaf\xb6z[Z\xda\x11joi\xf1Z\xab\xf5m\x00\x00\b\x8b\xc9\n\xd6\ue997w\xbf\x87>c\xda\x13\x8d\xc1\xd4~\xabDR\x18oMI\x06\xb2\x12\x9ek\xf9I\x89sF\xbc\xb0\xee6k1}\x89ۦ\xfbv\xb5\xb5[Nv߁\x82\xdde\xd1Gʩ\xef;Ern\x871\xca9a\xfc&\x00\x8c#\xe6*\x18_q\x8c>\x98\x95w\x9f\t`\x82\x91\xecG\x02\u007f,>ׇ\xd9`\r\xe3Λ8r\xc9`\x98\x9d\xec\xceM\xe4#YI\xec\x8a\xf3\x88\t\uf8e5z\xefGR0\xdf\xe9\xe1\xfb\xd0]\x17}\xa4\xdcj\xcb~\xa5\r\xb3\xc7\xf9\xb9\xb1щ\xf9G\x8c\xdf\x04\x80q\xc4\\\x05\xf36uK\n\xa6\\\xccQ \x81v}*\xc3)\x18\x1aqG\x8a嚵\x14\t#\x15\xb0\x8b\xf1\x1b\xe4\xe4\xa6\x04\xbd\xeaER\xb0鋇\xef#\xdcU\xd1\xef\x80\xec\xbdd{\xd0y#\x8cM\x98\xfe\x19\x00\x8c'\xa6*X\xbb\x87\x0f\x8c\x99\x82u\xad\x8bdw\xc7tY\xef`\x00\x97\x9b\xach\x1d\x9f\x9c\xabc\x10I\xc1R\r\x14l\xac\x11\x15\xec7o\x80J\x011\x80\x99\n\xc6Wt\xa1\x91)X\xb5\xd5j-F\xc5x[\x8d\xf8\xc5\xc9\xf1)\xf3\xce\xe0\xbdg\x1e\xb5Z7u-\x9d\x9a8gPc-*\x18&\xdf\x1a\xef^7-qvw\x88\x87D\xab5\x8e>\xd0Z\xebaWjb\xea.m6\x86\x81$1\xbc\xb6\x8e\x18\xc4U\xe2>\x96uZ\xa8m\xd7¤\xf8\xe49tɸ\x81\xc9J\x17\fw\xc2\x12\xfb\xd10\xf4\x14\xec\xe8\xec\x94\xf8\xa49)\xb8w*\x05\xf3R\xb5\x85T\x8b\xae9ppiRʺuI\x9a\xf1e\xf7d\xc9\xc5dm=n7\xac\x9f\xbf\xb6\x81\xcaS\xdb\xe6\x15\xd9\xcfl^\x11\"U\xa2\x82a^qf\x1f|c\xd5\xfcͿG\xe8\x88\xd3\xe9܋\xf6\xe2\xed\x11tc>}\xc1|\x94\xedt\xee\xf9t\xfb\x8a\xec\xcd_0~\x99l\x000֘\xa9`\xde&\xa4(XS\xb5\xbb\xea\xa8\xcee.\xc2\x1f\x9d\xbc)\x88\x82\x9b\xa6\x1c\xe5\xf1\xb5\x9d뫞\x17ׂP\u007fuUʓ\x93S\xd6-\xb5j\xafфM\xfd\xfd\x8bI\x0f\xac\xb3\xeaQkRq\xe9\xe4\x85Z\x0f\xe8\xa4\xcf'\xaa\x9c\xc6Cn\xc2&濾\xa5\x9al,g|U\xd6b\x9f\x0f\xebS\xc0\x17\x8f\xb3\xb7\xe4&\x84\xd8\xfa\x12S\xb75\x15[i\xd4\xeb\xb4էf=fmA\xc3\xd0Q\xb0\x93֥\xd5M\xee$+\x96\xaac\xbe'3|>_gH!\x95\xa2\xb3\a\x1e\x98\x96\xbc\xab8!\xb1b6\x1bo\x1b\U00014284\xdc\x1fّ\xbd\xe7Ԟ\xec\xed8\xf5\xcb\xefo?r\xea\xe03\xce/4\xef\xa3\xec\x9fܺ\xb5\xe5\r\x9c\xf8\xe8H\xb63g\xef;\xf3\xb7 t\xa3m\xfeO>G\x9f\xef}\xba\r\x8f-Ϸ\xb5\x89*w\xebȑ\x15\xab\xe6缱\xfd\xfbW\x19\xbfL6\x00\x18kLT\xb0N\x0f\xaf*X\xe5\x99\xee\xce\xea*㻇\xb9dH\xb5\x98\f\xc6\xf8j2:K\x15\xe5%\xd5:\x1b\xff\x15\x12\x9aJ =\x8fybr\n\xbe\xea\x97&i=\x10\x12\xe5~\x9a\xe2\xe1\x80\xf5\x00\"\xdb\xfd\xdal,\xea(\x92\xaaHq\x02\xd2\xd8\xf6\xa7\xcc\xc1\x15\x18\xa8\xa6+.y\xad\x17Ռ\xba\xa3D\x1d\x05ەD\xfb\x82Sh\xa8\x8b\x19Ej\xaa)\x17]=p\x95\x15wIwYۑ\x86\xe0E\x11m8\xf0\x94\xf3\x94\xbcm\xc8!\xda\xd5\xf0th\x1f\x8c܉\xdc,&\x9f\xc6\x1d\xa9\xed9$\xb9\x83h\xde\xf6\x1d\xb2\x8d\xdcO[\xeb\xdcx\x03ݾ\xa1\xf1\xcbf\x03\x80\xb1\xc5<\x05\xe3+:\x05A\xe8\xae\x14\xf0\xe5*\xb4\x93\xeeW\xbfG\xa7\xa7\"\xe1K\xe4\xf1\x10\x8avk\x82\xbb\xe6L\x9dL\x86W\x98T\xbd\x18yBnKK\xaa\xa4`D\xb1D\xa5a< V\xc1d\x0f\xb9\xd3\xe8˴\\m6\x16}\x05Sl\xf7\x13!\x91\xa9\xd3*\x98\xce*L:\n֝<5\xdf}F\x10\x85\x9cU0\xb6\x9a\x8a\x82)\a\xde0\x05\r\x0f\xd2]\x94g\x95h{\xa8;\xd6җU\xaf t5g\xc5\xeb\a\u007fu;4ޕ\xbd\xe3\xfc\xf9\xb5\x92\x82\x11\xc5ڛM\x92mٷЭ\xf9m\xb2\x8d\xa2`\xd9W\xc5\x04\xe3\x97\xcd\x06\x00c\x8by\nv\xd1-\x13\x90w\x1d\xad3\xb4\x1eL\xaaCuI\xa4oҒ\x9c\xb2\xa1Η!)\xd8t\x1d[\"/\xfb\x9b\x94\xa4\xa44\xaa\a\x82\xaa`\xb2\x87\x99\xa2\xe6͙\xae\xcdƢ\xaf`J\xb2\xd4\xca\f\x83[\u0601c\x8b\xf5\x18\x1a\x86^\x1c\x8cw/\x9efM\x12珱\n\xc6VSQ0\xe6\xc0A\xd2{\f\xe9\x83\xf9\xbc\"\xcch\x16\xb3QԦ\xcd\xeb\xf1\xe6\xc6\xc1-\xab\x9cϼ\xa3\x13\a;զ$%)\xfa\xe2\xe9\x13\xe8\xc43\xb2\xa9\xaa`\xeb\xa5\x04\xeb\x97\xc9\x06\x00c\x8by\n&\x04\t\xed\x9e`P@M\xa22\xf8\xc2\xdc\xea\xcb_\x88\x16\xe6\x93Ĵ\x99d4\xb5PR\xb0\x90X\x15E\x8a\xe4\x9f\tj\xa5H\xf1@P\x15L\xf6\x90;\x95\xbeL\xcdE#U\xb0M!\n\xd6defp\xf1\xca\xfd\x04\xf2v\xbc\xce\x1c\f\xbd8\x18\x89\xfe\xf3U\x89\xe4~\x82\xa8`\x15\xd4FS\xcd\xe1\n\xd6\x1d7\xa7\xfb\xccԙ#\x9af\xb1\x83\x06\xeeo\xaf\xc0ݤ\xf3{p\xf2Ƒ\xec\x06\xad\x85\xa4N\x1f\xdd\xd0J\xd1\xeb[Ж\xd7Cl\xb0\x82m\x91\x12\x8c_P0`\xfc0O\xc1D\xc48\x98\x97v\xbe\xaey\x98QX(-\t\x81\x04ګI!W\xb3\x90*)\x98ތ\x03I;\x927h\xa5H\xf1@P\x15L\xf6\xe0\xa5#\xbd**R\x11\x15,\x11\xfb\x16\xa6\x87(\x18\x9f\x9cA\xc6\u007f\xf9\xe24\x8e\xc5S\x15E\x11\xa6\xcdA\xc3\xd1Q\xb0b\x1a\x8bC\x19Th32\xf0\x88Y|CS\xcd\xe1\nvښd\xb5f(]ٰ\x9c\xa2\xb7\x11\x8f\x90x\xd5^\x1a\xb4B\x1b_\xa1oto\x93\x86\xbd\x92:\xe5\xec\xd1J\xd1/\xb2\xaff\xffB\xf62\\\xc1\x18\xbf\xa0`\xc0\xf8a\xae\x82\t\x81vO\xe0\x1a\xbez\xdc\a\xba\xbaOVx\xc3\xf4\"\x84\xe4\xd9\xc9\xf4\xedb\xeb\xe2]\xdbR\xf1P\xabe\xb0\x85ޯc\xe2M\x04yN\xbeo\xf2\xba\x80/>\xb7\x05\x9d\u038d'7\x10U\x0f\x03->_B\xae\xef(\x8f4\x1e\x96\xc6m\xf0n\x88[Jo52\xd9\x14\xc4{\x91-\xd4\xc5̤m\xdbfZ\x1f\xf5tjl}\x8fMs\xefϷVP\xf3\xae8\xe5\xce`\xa9Uoz\xbd\xae\x82%\x16{\xebr\xc5ۘ\xc5\t\xa5u\xb3\x13\xbb5\x85T\x8b\xce\x1e\xf8tB\x93\xd7\x17\x18Q\x17\f\xa1\xed\xce='\xf68I\\~\xafs\xfe\xde\x13'v8\xc5\x11\xe3<+\x95YyN~\xdb\xfc7\xae\xe2\xe4\xcfo\xff\xf2\x95\xec6\x12뺝\xb3Y\xfc\xa1\xd1ퟷQ\x9b\x1b\xe8\x8b_\xb4\xad\xda\xd8\xd6\xf6\xa9֯6\x1b\x00\x8c)\xe6*X\x80\x84\xc1H\xd7'\xd8T\xe5\U000761fd\x06K\x13DE\x10J\x9fLHZ\xec\x99\x1a\x9fq&\x8e\x06\xaaC\xfa7\xca\xef\"\xad\xa5\xf9x\x13\xdfN\x9e\xfd\x90\xcfz8)泺\x91ƃ@\xe7\x83\td\xaa\x95&\x9b\xc4\xc0\x14j\xfbh'\xf9\xa3+#q\xf2\xec\r\xd8@k۵8e\xf2t9\x98\xb7\xe91)\xf8u4Qwrm\xb5\xb5K~\xbaN\x97\xa4`\x95\x19\xc5)\xf1\xc9\x19b\xe4j \u007fJb\x06\xee4\xb2\x85T\x8b\xce\x1e\xf8X<\xd9\x17\x9f\x11\x12\b\xd3\xe7v\xc3Zi>\xd8\xc1\x8d{Wd\xe7l\x94\xa2\xf3\x9e$7y9\xe5\x94ix\x05o\xb2\u007fEf\u007f\xd1^Z\x834\xdc\xfc\xa5\xf4\xfeA\xf4\x91\x98ج\xf5\x1b\x92\r\x00\xc6\x12s\x15\xec\xdef]<ե\xaa\xf8\\\xed\x8c[\t:iUz\xba\x0e\x9d\xc3q\xb7\x04\x13\U000c30c3\xfcɅSF\xfa\x8b'\x00\xb8W\x00\x05\x1bCJS\xc8\xd3u\x92\xf5\x1fM\x81\x06ϴ\xc8O\xd7i9\xa3\xabq#\xa4N\x9c?\x86\x84\xa4\xd1\xe8 \x00\xc4\"\xa0`\xb1\xcf\xe98q\xf8\xd8\x1e\x17\xe6N\b\x00ܓ\x80\x82\xc5>Bnb~\x95\xaf*?Q\xef\xf7\xe3\x00pO\x03\nv/\xe0\x9d\x9d\x1c\x9f<\xe7\x0e\x1e\x9c\x01\x00\xf7\b\xa0`\x00\x00\xc4.\xa0`\x00\x00\xc4.CC\xff\x1f\xf8\xaa\xf0z\xf7Oɏ\x00\x00\x00\x00IEND\xaeB`\x82", + + "analysis/help.html": ` + + + + + +

    + When invoked with the -analysis flag, godoc performs + static analysis on the Go packages it indexes and displays the + results in the source and package views. This document provides a + brief tour of these features. +

    + +

    Type analysis features

    +

    + godoc -analysis=type performs static checking similar + to that done by a compiler: it detects ill-formed programs, resolves + each identifier to the entity it denotes, computes the type of each + expression and the method set of each type, and determines which + types are assignable to each interface type. + + Type analysis is relatively quick, requiring about 10 seconds for + the >200 packages of the standard library, for example. +

    + +

    Compiler errors

    +

    + If any source file contains a compilation error, the source view + will highlight the errant location in red. Hovering over it + displays the error message. +

    +
    + +

    Identifier resolution

    +

    + In the source view, every referring identifier is annotated with + information about the language entity it refers to: a package, + constant, variable, type, function or statement label. + + Hovering over the identifier reveals the entity's kind and type + (e.g. var x int or func f + func(int) string). +

    +
    +
    + +

    + Clicking the link takes you to the entity's definition. +

    +
    + +

    Type information: size/alignment, method set, interfaces

    +

    + Clicking on the identifier that defines a named type causes a panel + to appear, displaying information about the named type, including + its size and alignment in bytes, its + method set, and its + implements relation: the set of types T that are assignable to + or from this type U where at least one of T or U is an interface. + + This example shows information about net/rpc.methodType. +

    + +

    + The method set includes not only the declared methods of the type, + but also any methods "promoted" from anonymous fields of structs, + such as sync.Mutex in this example. + + In addition, the receiver type is displayed as *T or + T depending on whether it requires the address or just + a copy of the receiver value. +

    +

    + The method set and implements relation are also available + via the package view. +

    + + +

    Pointer analysis features

    +

    + godoc -analysis=pointer additionally performs a precise + whole-program pointer analysis. In other words, it + approximates the set of memory locations to which each + reference—not just vars of kind *T, but also + []T, func, map, + chan, and interface—may refer. This + information reveals the possible destinations of each dynamic call + (via a func variable or interface method), and the + relationship between send and receive operations on the same + channel. +

    +

    + Compared to type analysis, pointer analysis requires more time and + memory, and is impractical for code bases exceeding a million lines. +

    + +

    Call graph navigation

    +

    + When pointer analysis is complete, the source view annotates the + code with callers and callees information: callers + information is associated with the func keyword that + declares a function, and callees information is associated with the + open paren '(' of + a function call. +

    +

    + In this example, hovering over the declaration of the + rot13 function (defined in strings/strings_test.go) + reveals that it is called in exactly one place. +

    + +

    + Clicking the link navigates to the sole caller. (If there were + multiple callers, a list of choices would be displayed first.) +

    + +

    + Notice that hovering over this call reveals that there are 19 + possible callees at this site, of which our rot13 + function was just one: this is a dynamic call through a variable of + type func(rune) rune. + + Clicking on the call brings up the list of all 19 potential callees, + shown truncated. Many of them are anonymous functions. +

    + +

    + Pointer analysis gives a very precise approximation of the call + graph compared to type-based techniques. + + As a case in point, the next example shows the dynamic call inside + the testing package responsible for calling all + user-defined functions named ExampleXYZ. +

    + +

    + Recall that all such functions have type func(), + i.e. no arguments and no results. A type-based approximation could + only conclude that this call might dispatch to any function matching + that type—and these are very numerous in most + programs—but pointer analysis can track the flow of specific + func values through the testing package. + + As an indication of its precision, the result contains only + functions whose name starts with Example. +

    + +

    Intra-package call graph

    +

    + The same call graph information is presented in a very different way + in the package view. For each package, an interactive tree view + allows exploration of the call graph as it relates to just that + package; all functions from other packages are elided. + + The roots of the tree are the external entry points of the package: + not only its exported functions, but also any unexported or + anonymous functions that are called (dynamically) from outside the + package. +

    +

    + This example shows the entry points of the + path/filepath package, with the call graph for + Glob expanded several levels +

    + +

    + Notice that the nodes for Glob and Join appear multiple times: the + tree is a partial unrolling of a cyclic graph; the full unrolling + is in general infinite. +

    +

    + For each function documented in the package view, another + interactive tree view allows exploration of the same graph starting + at that function. + + This is a portion of the internal graph of + net/http.ListenAndServe. +

    + + +

    Channel peers (send ↔ receive)

    +

    + Because concurrent Go programs use channels to pass not just values + but also control between different goroutines, it is natural when + reading Go code to want to navigate from a channel send to the + corresponding receive so as to understand the sequence of events. +

    +

    + Godoc annotates every channel operation—make, send, range, + receive, close—with a link to a panel displaying information + about other operations that might alias the same channel. +

    +

    + This example, from the tests of net/http, shows a send + operation on a chan bool. +

    + +

    + Clicking on the <- send operator reveals that this + channel is made at a unique location (line 332) and that there are + three receive operations that might read this value. + + It hardly needs pointing out that some channel element types are + very widely used (e.g. struct{}, bool, int, interface{}) and that a + typical Go program might contain dozens of receive operations on a + value of type chan bool; yet the pointer analysis is + able to distinguish operations on channels at a much finer precision + than based on their type alone. +

    +

    + Notice also that the send occurs in a different (anonymous) function + from the outer one containing the make and the receive + operations. +

    +

    + Here's another example of send on a different chan + bool, also in package net/http: +

    + +

    + The analysis finds just one receive operation that might receive + from this channel, in the test for this feature. +

    + + +

    Known issues

    +

    + All analysis results pertain to exactly + one configuration (e.g. amd64 linux). Files that are conditionally + compiled based on different platforms or build tags are not visible + to the analysis. +

    +

    + Files that import "C" require + preprocessing by the cgo tool. The file offsets after preprocessing + do not align with the unpreprocessed file, so markup is misaligned. +

    +

    + Files are not periodically re-analyzed. + If the files change underneath the running server, the displayed + markup is misaligned. +

    +

    + Additional issues are listed at + tools/godoc/analysis/README. +

    +`, + + "analysis/ident-def.png": "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x03\xd2\x00\x00\x00\xf5\b\x03\x00\x00\x00\x8b\f=\xff\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE!# #$\"$%#($#&'%'(&-'\")+(4,\",.+01/>/\"241A2%685G6$8:7;<:Q9$>@=W>#AB@CEB\\B'cC$GIF\x00f\x00\x00g\x00\x00h\x00gF'\x00i\x01KLJ\x00j\x02\x02k\x03\x04l\x05mJ&\x06m\x06sJ(OQN\vo\b\x0ep\nwN&\nq\x16TUS\x10q\f\fr\x17\x0fs\x18~R%WYV\x12u\x1a,`\xae7]\xad\x15v\x1c\x86T)\x16w\x1d[]Z9a\xab\x19y\x1e^_];b\xace\xaf)z ac`+{\"(|*\x92]%cebAh\xb2egd+\u007f,\x9a_)Li\xafDl\xb0.\x81.ikh0\x830Ho\xb31\x841/\x858Jq\xb6mol\xa3f);\x86:Us\xb3\xabg->\x88B\x8c@\xb3m,vxu@\x8dGC\x8dA\\z\xbbxzwI\x8dH]}\xb7K\x8fJ\xb9r*_\x80\xbaM\x91L}\u007f|\xc1s-O\x93MP\x94Oc\x84\xbeN\x95U\x81\x83\x80\xc7x+W\x95VX\x97Xm\x87\xbcY\x98Y\xd1z(Z\x99Z[\x9aZ\x87\x89\x86\\\x9b[r\x8c\xc2\xd6~-^\x9d]\\\x9dc\x8a\x8c\x89d\x9ddz\x8f\xbff\x9ff\x8f\x91\x8eh\xa1hޅ+~\x93\xc4j\xa3j\x92\x94\x91k\xa4ky\x97\xc6s\xa4lq\xa5s\x95\x97\x94\xec\x8a,\x83\x9bŘ\x9a\x96\x9a\x9b\x98u\xaaw\x86\x9e\xc8\xf1\x8e/\x9b\x9d\x9a~\xaay\x88\xa0˞\xa0\x9d\x80\xad|\xf7\x93-\xa0\xa2\x9f\xfd\x92/\x81\xb0\x85\xa2\xa4\xa1\x92\xa5\xca\xff\x952\x82\xb2\x86\xa4\xa6\xa3\x83\xb3\x87\x8b\xb2\x88\xa6\xa8\xa5\x96\xa9\u038d\xb5\x8a\xa9\xab\xa8\x8e\xb6\x8c\x9e\xad͍\xb8\x93\xac\xae\xab\x95\xb8\x95\xa1\xb1ї\xba\x96\xaf\xb1\xae\x98\xbb\x98\xa4\xb3Բ\xb4\xb0\xa5\xb5՛\xbe\x9a\xb5\xb7\xb4\xac\xb7ѣ\xbf\x9d\xa2\xc0\xa4\xb7\xb9\xb6\xa4¦\xb9\xbb\xb8\xa5Ĩ\xb1\xbd\u05fb\xbd\xba\xa8Ǫ\xb7\xbfԯƫ\xbe\xc0\xbd\xb9\xc1\xd6\xc0¾\xb2ɮ\xc1\xc3\xc0\xbb\xc3ؼ\xc4ٱ̶\xc4\xc6ó\u0378\xb9̸\xc1\xc8\u07bb\xca\xde\xc7\xc9ƻκ\xbdϻ\xca\xcc\xc8\xc7\xcbۿҾ\xc4\xcf\xdd\xcd\xcf\xcc\xcb\xcf\xdf\xc8\xd3\xc1\xc6\xd4\xc7\xcd\xd1\xe1\xd0\xd2\xcf\xc8\xd6\xca\xd2\xd2\xdd\xd2\xd4\xd1\xca\xd8\xcc\xd3\xd5\xd2\xce\xd6\xdf\xcc\xda\xcd\xd5\xd7\xd4\xd6\xd8\xd5\xcd\xdc\xcf\xd4\xdb\xd0\xd8\xd9\xe3\xd2\xdb\xe3\xd5\xdc\xd1\xd9\xdb\xd8\xd7\xde\xd3\xd5\xdf\xda\xdc\xde\xdb\xda\xdf\xe2\xd7\xe1\xdc\xe0\xde\xe2\xde\xe0\xdd\xd8\xe2\xdd\xdd\xe2\xe5\xe0\xe2\xdf\xe2\xe4\xe1\xdf\xe5\xe7\xe4\xe6\xe3\xe8\xe5\xea\xe2\xe7\xea\xe5\xe7\xe4\xe6\xe8\xe5\xe4\xe9\xec\xe7\xe9\xe6\xfe\xff\xfc\x93\x8dkM\x00\x00 \x00IDATx^\xed\x9d\u007ft\x14\xd5\xdd\xff\a%\x064*\x15\xe1y<\xb3=lbJ0@\x94\x86F\xac(\x98o崆\xf4\x89i\xfa\x8d\xf6\xa4R\u007f`A\x10\x1a͓ñ\"\x02\x15\x1e\x8c\xf5l\xea\x81ش\x91`h\xf6(\xb89r\xb2\x12\xe4Ⱥ(<\x12\xda''\x94\xd2\xf6!\xc5\b\xc8S(ȓv\xd7Գ\xde\xef\xf9\xde{\xe7\u05fd\xb3wfv\x03a\xc8\xec\xe7\xf5\xc7\xee\xec\xe43\xf7\xde\xf9̼\xf7\xde;;\x99\xb7\xf4\xff.\x00\x04\x00\xc0e\x86\xe4$[;\x9c\n\a\x00\xe0R\x03\x92\x06\x00O\x01\x92\x06\x00O\x01\x92\x06\x00O\x01\x92\x06\x00O1\x92$]_/Z\x04\x00\x80\xc1=I\xf7w4\aZv\x9dS?u\a\x82\xb6ј?\xc9\xeb\x04\x8b\x84_˄9\xed\xc9\xdbX\xf0\xb1O.u\x8a\xb1'\xc5\x12\x9e\x95\xe5\x90S\xccP\xe9$;]\x82\x17z\x17\x14\x16TE\xca\xf6!\x94h\x983\xcd7\xed\x9eF\x84\xa2\xb2\\\x95@!\x1c\x11q*\xc7\x0e\xf1n\xa6\xb8\xf3\xa8\x0eW\x9f\xd7\xe7\x14\xa5s\xb6\xbe(wA\xc2)*\x89\xc8\xf4\x9dN!\x19\x85k\x92>\x11\b\xf6\x1c\xeb\xd9\xd2<@?\x9d\v\xecjr\xd8\x00\xd5\xe6\x9e\x16,\x12ο*\xb7G\xbb\x96\xca\r\xc9\x1bYp\xa0\xce\xef\x14\xe2\x80}\t\x91^\xe5\xfdT\xd4\xd7h\x13\x96\x1aZa&\x06\xf6E\v\x16\x1dƊ\xf6=ڹ}\x11\xfd\xee\x88\xc8\vں\xda\x17\xcaQ\x14\x8fȹQ\x14\vɑ\xb8p\xe3T\x11\xeff\x8a\xe9;\x1e\x8d\xb6\xc9\xfb\x9c\xa2t\xaa\x8b\xda\xea\xf2\xce;E%ѕ\xa7}kZ$*\xc3pM҇\x02\xc7\xf0\xeb@\xa0\x87~\nv\x1cs\x92t\x9f\xbcZ\xb0\xa8\x10\x91\U0006937b\xc4?\xa3TiL霴ö\x84\u007f[\xa2-\xf9/\\\xd2Faf\n\xd7◚j\xb2XG$\xbd\xba\x80\b8>\x05\xa7'&\xd7\xd6\xe1\xfeT\x8eYm\x9b\"\xe2\xddL9}\aS\x97\xf4y\xb9\x15%\x86\xd2\\\xbdc\xb7NT&ᚤ\x11\xed\x9eO\x06\xfa\xc9[w\xd3@\xbf\x93\xa4\xeb\xfc\xa7\x04\x8b\n\x8a\xa4\xe3\x05+Q\xaa\xa4|NZb[B\xf9Ŕt\xb9\xbd\xa4K\xe8\xe0\xa4W\xee\xc4\xfd\\\x05]]QC$\x1dɏ\x8d(I\xf7\xc9\x17:\x80\xb6NT&ឤ1\xb1\xa3-A\xf2\x15{.p\b9I\xfac\xdf*\xc1\xa2\x8a\"i\xb4\xb2\x90\xbcn\xafʻg\xb5r&\xf7-*\xf4\x15-\xa0\xfao+\xcf+k\xa3+O\xd5Θ\xb2H\x1d92\xb1\x1a\xbd>Yn\xe8\xab-ɭI\xb0\x01\x03Kf\xf8J\x16\xf6\x9aK\x88֔\xf8\n\x17\x94p%\xec\x94\x15\xca\xc9\a\xff\xda\xd5\xf7\xe4\xd5\x1c\xa7\u007f\x10ԶR\xf6\xb5'\a\x1c\xc6mX\x88f\xcarA\x9c+\xcc\f\x95\xf4\xd2\"\xba\xf3]x\xbb\xaaEt\xf5\xa2*\"\xe9\x8f\xcbC\x02IkU\xf0\x15\xa7\x91(v\xad\x06\x99\xb37\xa2F\x99\x8c\xfe\xd9D\xe9\x92^)\xcbۍ)\xb8 \x0f\x83\x85\xcan\xae6\x1f\x00\xb59\x89\"ߋ3gDV\x15T\x0fp\u06ddϓ\xd5\xcb\x15\\\xa2D\x87%SpQ\xd2'\x03\x18zy,\u0601\x1c%]\xef;.XTQ%\xdd.\xe3\xe3]/\xaf\xeaj\x9d^NN\x87H~\xf9\xab\x91F<\x9e#\x1d{CW\x83\xff)\xbc\xd4WpO\xfb\xce\x1a\x99\x9e\x93L\xacN<\x14*\x99\x93?su\xad|\x9c\r\xe8\x92\xeb#\xa1\x85\xf2A\xbe\x84\xdf\xcaO\x85\"\xed\x852W\x02\x9e\xe4Ω\x8eF\xa3t\x1a\xe0\x97KC;\x8b\x16Y\xd5\xf6\xa7\x90O\x9e\xde\xf8\xeb|> q\xa0Q>\x80ޔ\xb7\xf7\U00085661\x92>^\"\xd74\x1e\x18$\x9f˖\xd1\xd5\xcbʨ\xa4[\x17(\x92\x8e\u007f\xac\x10g\xab\xe0*N#Q\xecZ\x9dX\xb4\xa0\xe1o\xe8o\r\x05\xd1\x18\x9b(\xa4KZ\xb9\xa6\xa0N\xc1Ey@\xbdѐ\xdc\x18\x8d\x9e6\x1d\x00\xbd9\x91\x02yu\xb5\\\xb8\xb1\xa8\x95\xdb\fo\x17U\x06Bl\xa2\x84\x87%SpQ\xd2\xe8d\u007fwK3\xd6tO`\xc0Q\xd2\xc7}\xcf\n\x165TIw\xe1\xc9t\x97\xfc&\"g\x12\xfe掗\xd4\xe0\xb3x0t\x1e\xa1w\xe9\x85߈܅{\xb29\xf8,O\x94\xf9i\xbc\x1e\xcbQ.\x93\xbe`\x80\v\x88\x85H\xb7R\xb6\x10q%\xb4M\xa7=I\x81\xf9\xdca\x06\xdeEg\xf1I<\x1dY\xd6柂\xcf\xdcڤ\x80\xba\x8a\xb337\x9a\v3C%\x8d\xceo\xac\xf0\xc9S\xc8V\xa5\xb5tum)\x95\xf4\xe9\xdc\xd3T\xd2\xd5j\xffU\xc5WaT\x9cN\xa2\x98\xb5,\xf5K\xf1\xcb2\xf2\xd3\"\x93(\xc4\f\xbc\xa9\xee\x1a\xed\xb2\xce\f\xbc\xf5\x03\xc04\xa7\xa8\x16o\xb9\x13\xd5%\xff|\x99\xab\xcdm\xf4DY\x1d\x96\x8c\xc0MIc\xe2-\x1d\xe4\x12Y\"\x918ڔ\xb0;\x00+}\x1f\v\x165\xf4^\xfaM\a\x89\xe6E\x03E\xd2\xebș\x19Q\xe6h\rx\x1e\x1a+\xaa&C\xafU\xab\xc8В\xac\r\x91\xc1iE\t\x9e2\xf6\xe5*\xa7\xb2\x1eˡ\u007f\xdb3\x01%\xe4,K\x94\x913\x95)\xa1Q~\x97\x04T\x9b\a\x0e\xd5ո\xa5ʌ\x95\x11\x8e\xb06q\xc0`E\x03\xaa\xafN\x98\n3h#\xbd\xe5Y\xf9u\xbcX8\x93ܞ\x91 2X\x9dO\u007f\x97ΫW$\x8dꖙ$\xcdVaT\x9cN\xa2\x98\xb5\x1c\a\xfc\xa7\xfc\a\xc8\x02\x93(\xc4H:\x0f\u007f\xfb$*\xec\xb2\xceJZ;\x00LsR\x90\xb4\x9e(\xabÒ\x11\xb8&\xe9C\x81\x8e\x9ec=-\xea\xddc\x89\xfe\xee@\xff\x19\xcb\xe0\xb5FϼV\xd0I+w\x8f=\xa5\xdc=\xb6N^\x16\uab17\xb7#2\xc1+m\xebZEg\u007f\xb5\xf2\xba\xaeu2\xb9zt8ofc\xc34\xd9\xf7\xe6a.V'q\x80^9U\xe6\xebF@\xa3\xbc\xa4mc\xb9\\\xf8\xea\x01\xb6\x84F9\xbf\xa1\v\a\x98\xef\xbal\xf4\xff\xba\xb3:\xefSr\xa5\xb7\xee\x00\xea\xad\xf3EO\x89k\x13\a\xc4\xf7=;\xfd8\xea+X\xbd/\xce\x14\xc6\x12\x91\x17\x84ެ($+\v墆wq@\x1fY[\xd3\x19\xed\xac\x91;\xc9\xddc\xa1\x18\x8a\xe6\x99\u007f\xc4ҫ\xe0*N#Q\xecZ\x96Č\x9a\x19\xf4\x1b\x88Iԧ\xe4\xee\xb1\xd6h\x94\f0\xaa\xa6\xbf\xba\xb1\xc2:\xeb\xea\x15\xef\x03\t\xd3\x01ЛsxZk,\xe4\xeb\x8d-\xab\xe6\x86+\x83\xfb\xa2Q\u007f]4JO#=QV\x87%#pMҨ\u007fGK`\xebnu\x12\xd7O\xa6\xd2\xcdV\xa1\xa7\xf3j\x05\x8b\x06\xca=\xde%\xea=ޑ\xea\xc2)U]t\xb1o\xc9\xcc\xfc\x8aN\xb2\x94x\xbd,\xaf\xac\x8d\x9es}\v\xa7\x95\xac}\xd3'?\xcb\xc7j\xf4*3\xbdGM\x85%Z\xe7\xf8\xa7/m\x9f\xe3\xabfK\xd8^\xd5X\xe2+\xaaN:u⫦\xe5V\x1f\xa4\xf7x˾\xc3\xe4\xb7S\x8b\xda\xc4\x01\x11\x99\xfcB\xbbJV\xee\xd0\xd6\n\xe3\xe8,\xcf+x\x94ʪ\xa2\xbd\xa14o\xfaB\xf2M\x97h\x98S \x17\xcciL\xd0\x12B\xb8[,2Of\xb4*\xf8\x8a\xd3H\x14\xbb\x96\xa5\xd5\xdfJߙDթ\xb3f\xd2\xe7\xf6U\xe7\xe6\u05fch\x99\x87x\x01\x8d\xf4\xfd\xd9t\x00\xb4\xe6$\x8a\xf0\xfe\xe4\xcby!\xd3\x1c\xfc\xb7j\x15\xf4\xd8뉲:,\x19\x81{\x92N\x83\x17\xe5?\t\x16\x01\x00HfDH\x1a\xfe\xab\x12\x00ReDH\x1a\x00\x80T\x01I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x18I\x92\x86[\xbd\x01\xc0\x11\xf7$m\x18\xe8Ě\x94\xe7\x149\xf8BX\x1b\xe8\x10\x86\xcdF%U\xb7\x98\xa1\xe3\xd8t\xc7\x00\x95\xa1\xda\xf5\xa4it#&\xd5FR\xd2O\xeaP\xf7-\xf3pMҌ\x81ι\xc0\xfe~\xccI\x87-\xac\rt\b\x86\x8d\x8a#i\xfa\xac\xa4f\x95s\x018:\xc08\xedۅ\xda\xf5\xa4it#F\xd8H\xcb\xec\b\x92j\x9fɡ\xee[\xe6ᚤ\x19\x03\x9ds\x81\xa3N\xd1\xc8\xde@\x87\x90\xfa\x03^\xd3\xf5YI\xd1*g\xe88:\xc08\xec\xdbE\xb0\xebI\xc3\x15\xc3\nQ#\xad\xb3\x93\x9cT\xa7L\x0ey\xdf2\f\xd7$\xcd\x18\xe8\xa4&i;\x03\x9d\xf4H\xd7g%E\xab\x9c\x8b\xc0\x10\v\xbb\bv=\x17A\xd2\"\xacw(9\xa9N;?\xe4}\xcb0ܓ4\xd2\rtR\x92\xb4\xad\x81\x8ea\xa3\xc2\xf8\xc2\xe0\xc5\xd6\xfa\x99\xd3\xc8\x13|\x18\xff\x16\vC\x1a\xc3\xf6\x85s\x96\x11\xb9\xc50\xf6,|a\x9a\xf5\x8c\x85\x05\x8f\xd8\xd5\xc5\xc2\x01F\x14\xc0{\xdeh\xa4c\xd7s\xe1F7LR\x11c\xb6#l$\xbfC\xf6\x16<\xe2Lr\xf8W\xd5Ϡ\x15w\xe1\xb8\x17ս0`\xf7-\xa3qQҺ\x81ι@ǖ@s\xd8\xf4\xe0;\x13\xb6\x06:\x86\x8d\n\xe3\vC\x16K66\x96\xe4\x1df\xfd[,\fi\f\xdb\x17\xd6YF\xe8\x16\xc3سp\x85\xe9^/\x16\x16<\x16\xae.B\a\x18a\x00\xe7y\xa3\x93\x8e]υ\x1b\xdd0Ie\xcdv\x84\x8d\xe4Z\xe6`\xc1#\xce$\x87_.\x0f\x85\xcapű}%\xf5\xa7ս0`\xf7-\xa3qQҺ\x81ι@S\xf7ў\x96f\xbb+\xde\xf6\x06:\x04\xedѯ\x86/\f\xf2\x97\xe0\xd1\xfd\xf9\x12b\xe7h<\xe1V<\xc2cm_\x8c\x12\xc4n1\x9c=\x8b^\x18\xe3\xf5\"\xb6\xe0\xb1vu\x11<[^\x1c\xc0\xec\x1bK\x1av=\x17ntc$\x95\xdbcq#\x99\xa7\xf7:Y\xf0Xd\xd2\xc0_\x8aO\x90\xf8\x1cr4\x1bIg\xfe\x94\xf9\x87Lc\xdf2\x1a7%\x8d\xd4\xe7x'\xba\xc9\xc9\x15k\xdam\x13ho\xa0C\xd0\xcf(\xf2\x9coE\xbc\xfe\xff \xafm\xf2ygI\xb3\xb6/z\t\x16n1\x9c=\x8b^\x18\xe3\xf5\x82\x84\x16<֮.\xa9K\xda\xd87\x964\xecz.\xdc\xe8\xc6H*\xb7\xc7\xe2F\xea-s\xb6\xe0\xb1Ȥ\x81\xffE\xf2J\x8f\xe6q\xf90\x8a\xe7\x9b\x1f\x00\xca\xec[&㚤\r\x03\x1dmMx\xabe\xb0\x93\x81\x0eA?\xa3\f\xf1*C\xc1(yb\xbf\x93\xa4Y\xdb\x17=\xd6\xca-\x86\xb5g\xd1\vc\xbc^\x90Ђ\xc7\xda\xd5%uI3{\xc1\x90\x86]υ\x1b\xdd\x18I\xe5\xf6X\xdcH\xbde\xce\x16<\x16\x994`\x8e&\xfa\xd1Z\xf4\xee\x14\U000d78f1o\x19\x8d[\x92f\ftPG\x90.\xee\bZ\x87;\x18\xe8\x10D\x92\xa6\x97ѨE\xad\xe1\xdf\xc2\xf8\xac0\xb0\xb6/z\t\x16n1\x9c=\x8b^\x18\xe3\xf5\x82\x84\x16<֮.\xc9\x0e0\x16\x01v\x92Nͮ\xe7\u008dn\x8c\xa4r{l#iҲ\x14,xę4\xf0\xd3_.\xe9\xd1D;\v\a\x05\x16\x96\xfa\xbee4nI\x9a5\xd0\tn!\x8bg\x02\xfb-\x83\x9d\ft\b\"I\x17\xe1\xb3v\xe0\x8ej\xc4\xfa\xb7\x88\riX\xdb\x17\xa3\x04\xb1[\fgϢ\x17\xc6x\xbd0=\x0e\xe3\x16c\xed\xea\x92\xec\x00c\x11`!\xe94\xecz.\xdc\xe8\xc6H*\xb7\xc7\xe2F\xea-K\xc1\x82G\x9cI\x03\xffL\xe2\x98[J\x8e&\x1a,\xdc9-\xf9\xc1\xfb\xfa\xbea>\xdex\xa1\xb7ÍT\\\x934c\xa0s4\xb0\xed\xd0ѽ\x81\xa0\xf5\x90\xc9\xc1@\x87\xb1Q\xe1|a\xc85\xd2\xf69S\xc8\x06\x8c\u007f\v\x12\x19\xd2\x18\xb6/l\tb\xb7\x18Ξ\xc5(L\xf7z\xb1\xb4\xe0\x11\xb9\xba\x88\x1d`\x84\x01ܾ\xb1\xa4l׃.\xdc\xe8\x86M\xaaa\xb6c\xd5Hc\x87\x9c-x\x04\x994U\\s R5E9\xfc\xeb\ue612|\xba\xe8\xfb\x86Y(/H\xfa{f\xe0\x9a\xa4Y\x03\x9d\x13\x1d́`\xb7\xb5\xa2\x9d\ft\x18\x1b\x15\xce\x17ƿ\xba\xbe`F-=\xffY\xff\x16\x91!\x8da\xfb\u0095 t\x8b\xe1\xecY\x8c\xc2t\xeb\x19\v\v\x1e\xb1\xab\x8b\xd8\x01F\x18\xc0{\xde0\xa4l\xd7C\xb80\xa3\x1b.\xa9\x86َU#\x99\x1dr\xb4\xe0\x11d\x92\xa3\xb4qI\xbeZ1\xb9\x81PtEE\xdb7L\xfb\xf4vA@&\xe0\x9e\xa4\xd3`\xa8\x06:p\xbf\xd10py$5\xe6\xcfLë\x14\x18\x11\x92\x1e\xea\u007fU^\x1eg\x9fǸ<\x92\x1a\x82+\xdbV\x8c\bI\x0f\x95\xcb\xe3\xec\xf3\x18\x97AR\x1b#\xa8\xba\xc1)(c\U00070915\v5\xc0E\xe5rHjL._Yt\xde)*c\xf1\xb0\xa4\xe9\x85\x1a\xe1\x8df\xc0\x90\xb9,\x92ڐ_m\xbe\x11\x1e\xd0\xf1\xb0\xa4\x01 \x13\x01I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x00I\x03\x80\xa7\x18I\x92\x1e\xea\xad\xde\x00\x90A\xb8'i\xc3@\aӳ\xad\xa9e\xaf}\xbc\x83\x81\x0e\x00\x00\x04\xd7$\xcd\x18\xe8\xa0xG`\xf7\x91\xbd\x81C\xf6[\xd8\x1b\xe8\x00\x00@pMҌ\x81\x0e\xea \x9e\x1b'\xe9\xa25N\x06:\x00\x00 \x17%\xcd\x18\xe8\xf4+O\x1d;g\x1f\u007f\xf1\ft\x00\xc0ø'i\xa4\x1b\xe8\xec\x0e\f:\x19\xb99\x18\xe8\x00\x00\xa0⢤u\x03\x9d`\xb0gk\xa0yׅ\x18\xe8\x00\x00\xa0ࢤu\x03\x9d\x16j\xa0\xd3\xdcra\x06:\x00\x00 w%\x8d\xb4\xe7xӾz \xb0\xc7&\xd0\xd9@\a\x00\x00䢤\x19\x03\x1d\xd59'l㶑\x82\x81\x0e\x00\x00\xc8=I\xb3\x06:{\x9b\xa8\xbc;.\xcc@\a\x00\x00䞤Y\x03\x1d\xc5:\xe7\\\xc0\xfa\xf6\xb1T\ft\x00\x00@.J\x9a1\xd0A{\x03{\x8fv7m\x15ش\xaa8\x19\xe8\x00\x00\xa0⚤Y\x03\x1dt(\x18ز\xd7Zю\x06:\x00\x00\xa8\xb8'\xe94\x18\xaa\x81\x0e\x00d\x1e#B\xd2\xf0_\x95\x00\x90*#B\xd2\x00\x00\xa4\nH\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\xc5H\x924\xdc\xea\r\x00\x8e\xb8'i\xdd@g\xb0)\xa0\xd0l\xbf\x81\x9d\x81N\xef\x82\u0082\xaaH\xd9>\xf36\xb6<+\xcb!\xa7\x18\xf2\x88a\xb9\xd4)\xe6\xa2\x11\x99\xbe\xd3)D\xe7l}Q\xee\x02LJ%#T%\x93\xfd\f\xe1\xd7*\xa7P\v,\x12U\x87\x8b\xcc\x13\xfd\xf7z\xaa-\xa3\xa4\x91_-;\x96\x15'\x93\xda1\xf6\x14\xaeI\xda0Љ\x05\xf6\xf6c\xf6*\x0f\xe8\xb7\xc6\xc6@\xa7\xd7\xf7h\xe7\xf6E\xa9\x1e\xbdH\xaf\xf2~*\xeak\xb4\x8f\xa4\x1c\xa8\xf3;\x85\xa4\x88V\xb1\xf5ڮ\xbc\xd4v\x81P]\xd4V\x97w\xde)\n\xa1\xbe\xd5r$\x86bQyuj*H\xc6\"Qǣ\xd16Y\xf4-\x9aj\xcb\x14\x04\xf9\x15'Jώe\xc5ɤr\x8c-j\x1b\xa9\xb8&i\xc6@\xa7\x9b<\xd9d\xa0i\x97\xfd\x06v\x06:5\xd5\xe4\xb5.EI\xff\xdb\x12m\xc9\xefx\xb8\t\x8d\x17K\xd2FŖkS\xed\xdb\x10:/\xb7\xa2\x84\xfd\xb3\xcfUZe\xf2\xa0\x89\x04\x8e\x1f2V\x89:(RV\xea-SHί8Qlv\x84\x15\vq>\xc6V\xb5\x8dP\\\x934c\xa0Cٶ\xc5\xfa\xa9&\x14;\x03\x9d\x92\x06\xf2\xda+w\xa2T(wK\xd2\xe5\xc2sG\xbc֑>9\xd51\xfa\xa5\x96t\xea-SHίsJ.\xa6\xa4\x9dk\x1bQ\xb8'i\xa4\x1b\xe8\x10z\x02'\xeccm\rt\x96\x16\x1d&o]\xb4k\xd8^\x95w\xcfj\xa5\x93`\x165v\xca\n\xe5\xe4\x83\u007f\xed\xea{\xf2j\x8e[\xc5\xe2q[\xed\x8c)\x8bԁa[y^Y\x9b\xb2\xbaoQ\xa1\xafh\xc1)\xb4R\x96\xb7+\x93\xc1D\x91\xefř3\"\xab\n\xaa\a\xd8\xc2Vʾv\xb5\n\xb6\xe2\x81%3|%\v{M\xcd9\x9f'\x1bs\a\xad6\xa6\x04\x86\xc1Be\xb3\xd5\\l\xafO\x96\x1b\xfajKrk\xb8\xceސ\xb4Q\x18\xd7^\xa39\\\tњ\x12_\xe1\x82\x12R\x84\x91(#\x96\x90\xac\xac\xb4Z\xc6\xe5W˙8Q|v\x8c\x8a\x99F\x1a\xb0\x8d\xf4\xaf\xaa\x9f1m\xa12\xe70\x92\xaa\x1d7\xfe|\xf0\x04.JZ7\xd0!\xb4t\xd8\xc6:\x18\xe8\x1c/\x91k\x1a\x0f(\xdd|\xbd\xbc\xaa\xabuzy\x82_\xd4\x19\xd8\x17\x9dS\x1d\x8dF\xffL>\xf8\xe5\xd2\xd0\u03a2E\xa6\xcd\f\xfa\n\xeei\xdfY#\xd3S\xae\xce\xdf\xd0\xd5\xe0\u007f\x8a,F\xf2\xcb_\x8d4b\x89(35:\x19\x8c\x14ȫ\xab\xe5\u008dE\xadla\u007f\n\xf9\xe4鍿\xce_\xc4W\xdc%\xd7GB\v僦\xe6\xf4F\xa3Z\x9f\xa2\xd7Ɣ\xc0\xd2\x1b\rɍ\xd1\xe8i.6\x1e\n\x95\xccɟ\xb9\xbaV\xe6\x12dH\x9a)\x8cm\xaf\xd1\x1c\xb6\x84\xdf\xcaO\x85\"\xed\x852I\x89\x91(#\x96 \xe8,\xd3i\x19\x9b_=g\xe2Dq\xd91*f\x1bi\xc0n\xe6\x97\xcbC\xa1\xb2<\xf2\x9d\xaf7\x879n\xdc\x01\xf0\x04.JZ7\xd0\xc1\x1c\xa13k\x1b\x1c\ft\xceo\xac\xf0\xc9S\xc8wx\x97\xfc&\"G<\xc4-r0\x03\uf8b3\xf8\\\x9a\x8e\xacb\xab\xe6\xe0^#QFN\xb9w\xe5\b~\x8d\xc8]\xf8\xfc,\xa9\xc1\x1a\x19\f\x91\v@\xf4$\xa3#ǢZ\\\xc8NTW\xcf\x17柂O\xe2\xda\xe9|ű\x10\x19\x0e\x94-\xe4\xd7\x12r\x95\x93\x96\xa9\x8d+\x81A\x1f\u07b2\xb1\xa8\\\xa6\xdd.\x17\xc9\x0e\xbc\x8d\u0098\xf6\xf2\xcd\xd1Jh\x9bNt\xd2V@%\xad'\x8a\x8bu\x18x;\xb6\x8c\xc9/w\x00ĉҳ\x83\x8c\x8a\xd9F\x1a\xb0\x9b\xf9K\xf1\xde\xc7\xe7T\x98\x92\xaa\x1f7\x18x\xb38\x15\xeeL\\\xed\x9d;Z\xec\xe3R0ЉG~D\x0e\xd6\xd2;\x06\x13\x98\x99\xf5\xdc\"\a#i\xf2'z`\x85\xb1\xe7\xe5v\xf2\xd6@\x02\xea\xcb\xe8\xaa\xd2:r\xf6\x19\x97H\x19I\x87\xf0y6\x80\xd6.\xe3\v\xa3\x8f\x1dO:wζ\xd5\xdcQ \x97\x99\xd6\"\xfd\xa4ej\xe3J`Ѕ\xc3Ƣr\u007f\xb2\x05 'i\xbd0\xa6\xbd|s\xb4\x12>\x9dQ\xb2\xb2\xbd7A\xc7>F\xa2\xb8X\aI;\xb5\x8c\xcd/w\x00ĉ\x12I\x9am$\x03\xb3\x99\xffE\xf2\xda&\x9f\xe7\x93\n\x92\x16\xe2T\xb8\x1d\x8c\x81\x0e\xa6\xc9\xfa\xb1\xfc\x14\a\x03\x9d\x83\xf4rY\xa2\n\u007f-\x97\xa9s#~\x91\xc3ty\x8c\x1eXal\xaf\x1cEZ@գtգ\x15\x9aD\xcc%\x14\xbd\x8b\x0e\xfa\x10Z\xb7\x8c/Lx\xee\x1c,*Y\xdb\x19\xad\xb6\x964S\x1bW\x02\x83.\x1c6\x16\x95\v\xe6\x84m\xf2\xdf\xf1kL&\xb3Ha{\xf9\xe6\xe8%\x9co_R*\x17\xbd\x8a\xb8\u0378X\aI;\xb5\x8c\xcd/w\x00ĉ\x12I\x9am\xa4\x01\xbb\x992X\x8f\xe2\xafa\xab\xa4\x82\xa4\r\x9c\n\xb7\x815\xd0!~\x1bG\xec\xc3\x1d\ft\x8aVҷ\x869xPyG/\xe5,\xb7\xc8A\x0fa;\xe93\x8c\x03+\x8c=KU\x80\xe8\xe5\x9b\xfa;誒:2t3\xf5Ҵ\x9b)\x8a\xa0\x83~E\"laI\xe7\x0e\xa9\xb8\xb4\x82\f\f\x17\x95\xf1k\tZ/m\xd4\xe6(i6\x16\x95\x9b\xe6܄(m\xaf\xa2\x1fF\xd2F{\xf9\xe6h%\xf4\x92\xdby\xfe\x1e\xca\xe5\xbf\t\xb8X\xa7^ڡel~\xb9\x03 N\x94H\xd2l#\r\xd8\xcd\xfc\xf4B];\x1e\x90$%\xb5\xc1tX\xbc\x81[\x92f\rt\xc8TZ\xbbL&\xc6\xc9@\xa7p&\x99\xd7&\xc8Y\x13Qfc\r\x1b\xb9E\x8e\xeaj\\\x8c2\xd1\xd5\xcfTqlE\t.\xb7/\x97\x04tр\x10\x19\xdbNJ\xaa\xc9@o\x15\xb9\ue7b7\x16\xd7[a\x92\b[\x18+H\xbd\xe2\x12rz'\xca\xcaL\xcdA\xfaI\xcb\xd4\xe6(i6V\xd8\xe3\fL#\xe3\x9a\xfai\x03\xc8B\xd2\\s\xf4\x12\x1a\xe5w\xc9[u=\xb7\x19\x17\xeb iǖ1\xf9\xe5\x0e\x808Q\"I\xb3\x8d4`7\xf3\xcf$\x17>J\xab\xf9\xe6\x18\xc7\xcdt\x00F>\xaeI\x9a5\xd0A=\x01;oig\x03\x9dB\xb9\xa8\xe1\xdd\xcejz\x93\xe0:yY\xa8\xb3^\xde\xce/\xb24\xfa\u007f\x8dc?%\xd7=\xeb\x0e\xa0\xde:_\xf4\x94E\xecἙ\x8d\r\xd3dߛ\x87q7\"\xaf\xebZ'גՑ\xdcҶ\xaeUt\"X5\xfdՍ\x15$\xe0\xf0\xb4\xd6X\xc8\xd7\x1b[V}\x9c)\x8c\xabB\xaf\x18\x9f\x88K\xda6\x96˅\xaf\x1e`\xd7\x0e\xee\x8bF\xfdu\xd1(I\x89^\x1b_\x82\x8er]\xf9\x00\x9d\xb5豉\x03\xf4\xeamҥ\x86\x90\xfclW=9g\x99\xc2\xd8\xf6\x1a\xcdaKh\x94\xf3\x1b\xba\xf0^D\xb860M\xff\x94\xdc\xc4\xd5\x1a\x8d\xf2\xfd[:-c\xf3\xcb\x1e\x00Q\xa2\x98\xec0\x15\x1b\x8dda\xf3\xeb\x97k\x0eD\xaa\xa6\xf4!\xee\x10\xeaǍ\xad\xcd\x1b\xb8&i\xce@\xe7\xc8\x16\xdbPG\x03\x9d\x8a\xf6\x86Ҽ\xe9ꏏ\x91\xea\xc2)U]\xe6E\x86\xf8\xaai\xb9\xd5\a\xe9\xfd\xbf\xb2\xef0\xf9\xb9\xf3Y\xabؾ\x85\xd3J־\xe9#\x01\x89\xd7\xcb\xf2\xcaڔ+\x00}Kf\xe6Wtҥ\xea\xdc\xfc\x9a\x17e\xb9\xbeH\x96C\xf9r^H\x99\rj\x85\xf1Uh\x15\xa3D\xeb\x1c\xff\xf4\xa5\xeds|\xd5\xec\xdaߪ\xd3I\xf2U\xa1\xd7Ɨ\xa0\x11/\xa0\x91>\xfaӋ\x1e۫l\xff(2\xd3U\x9eWNv\xcd(\x8ck\xaf\xd1\x1c\xb6\x84\xedU\x8d%\xbe\xa2\xea\b\xdf\x06\xa6\xe9uj{\xb9\xee7\xbd\x961\xf9e\x0f\x80(QLv\x98\x8a\x8dF\xb2\xb0\xf9-m\\\x92?\xa3V\xb9\xd8b\x1cB\xed\xb8q\x87\xc5\x1b\xb8'\xe94\x00\x03\x1d\x00H\x95\x11!i\xf8\xafJ\x00H\x95\x11!i\x00\x00R\x05$\r\x00\x9e\x02$\r\x00\x9e\x02$\r\x00\x9e\x02$\r\x00\x9e\x02$\r\x00\x9e\x02$\r\x00\x9e\x02$\r\x00\x9e\x02$\r\x00\x9e\x02$\r\x00\x9e\x02$\r\x00\x9eb$I\x1an\xf5\x06\x00Gܓ\xb4n\xa0\x83\xd0\xc0\xae-\x81-\xbb\x06\x1c6\xb03\xd0ѹ\xf4\x86)\xe9x\xde0\x88Mf:\xc9\xff\f\x92'\xd8\x1a\x8e@\x89\x869\xd3|\xd3\xeei$O'\x91\xab\x12\xd4\t\xc7\xf4\xbf\x84Cm\x83\x90\xce\xd2ܲPy\xd2\u007f\xa4ړ\x86\xa5\r0̸&i\xc3@\a\x9dk\xda\xdas\xb4gK\x93\xfd\x93M\xec\ft\xd26Ź\x88\xa4\xe3y\xc3 6\x99\x19\xd8\x17-Xt\x98s\x04\x8a\xc8\vں\xda\x17\xcaQ\x14\x8fȹQ\x14\v\xc9\x11\xf3\x03#\x84m\x18\x9a/\xcc\xebrm\xe7Z9\xdd\xc7\xf8\xa7ai\x03\f3\xaeI\x9a1\xd0\t\xb7\x90\xe7\xfe\f\xb6\x84m7\xb03\xd0I\xdf\x14\xe7\"\x92\xba\xe7\r\x83\xb5\xc9L\xe1Z\xc49\x02\xad. \x02\x8eOYM\x9e\bX[\x87\xd0\xc7r\xf2v\xa26\f\xc9\x17\xa6On\xc0\xaf\xabӕ4J\xc7\xff\x02\x18V\\\x934c\xa0ӱ\x95\xae\b\xda?\x9d\xdf\xce@'驟\x97=\xd6&3TҌ#P5}\xbe&\xaa\xa8!\x92\x8e\xe4DŽ\x92\x161\xa4\a_>5\x9d|\x81\xfcI\xe6\x1fϗ\n \xe9\xcb\x04\xf7$\x8dt\x03\x9d3M\xe13\xf13\xe1\xa63v\xb1v\x06:\xe9\x99\xe2\xe8\xf67HhSC檍\xa8QV&\xe5Z\t\x16\xce2ix\xde0\x01\xbcɌ\t*i\xc6\x11\xa8Jy\xb2\xe6\xa2*\"\xe9\x8f\xcbCI\x926\xda`a\xd7\xc3y\xff\xe8\xf0N8\x1a\xd3\xd6ҷ\u05cf[l\xc6fG\xe8\xa5\xc3x\xd3 \xab\x03\x00\f'.J\xda0Љu\xe0\xa5\x0e\xfb#og\xa0\x93\x96)\x8ea\u007f#\xb6\xa9\x89E\v\x1a\xfe\x86\xfe\xd6P\x10\x8d1%X9ˤ\xe1y\xc3X\xf0\xb0&3f\xa8\xa4\x19G\xa0\xb2et\xf5\xb22*\xe9\xd6\x05ɽ\xb4\xde\x06\v\xbb\x1e\xd6\xfbǀw\xc2QQ\x1f\x96\xaf ڌ͎\xd0K\x87\xf1\xa6\xb1:\x00\xc0\xb0⢤u\x03\x9dxGKO\u007fOK\x87\x9du\xa5\x83\x81N\x1a\xa68\x8c\xfd\x8d\x85MM\xfdR\xfc\xb2\xac\xde\\\x82\xd0Y\x06\xa5\xeey\xc3\xd9\xc98\f\xbc\x19G\xa0R\xe5\xf9\x89\xb5\xa5TҧsO\x8b\x06\xde\xda\xd3p\x85v=\\\xc5:&o\x1a\x85\xc3\xca\xc5\xf4x$\xa51\\\x17K:y\x8f/\x0e iKܓ4\xd2\rt\xb6*c\xa8\xa0\xd5\xec\xe8\x8b\xef\x14S^FhCq\xf1;\xea\x8cuC\xf1\xac\xb7^~`\xf6\xd3\xffCc>y\xe6;\xb3\xeeS\x97\r\xe2c\xb5ޫ\u007f\xfe\xb8\xab\xbf\xa5\x0e\xbc\x9b&gOxD\xd1\xc0\xa1o匾\xee\xf6~n\xa3\xf5\x13\x82=ROp\xc2K\x9a\xa4ц\xef\xe0\x97/\xdf\xfe\xf1\xdd\x0f\xbc\xfc\x99\xd61\x82\x00\x00\x0f\xfaIDAT9\r1j\xfb\xf2\xad\xc7f?\xfc\x06\x9dl\xff\xcf\xf3\u07fd\xf7\x19e\xe0\xad\xc7\xfeqVq\xf1\xa6O\x9e\xbf\u007f\xf6\xd3\xff\xa4\x1b.\xcf6=`M\x95\xf4\xe6[ǐ\xd7\ao\xbc\xea\xfao\xfc\x92*\xf5g7\x8f\xb9r\xccW\u007fN\x16\xbfw\xc3U7|\x8f\xae\xfc\xf9\u05ee\x19s\xb3:\xf0\xd6b\x91\xb1\x9b-xZ\xbe\x02\xad\xc0\xaf-l\x1d\xe7\xb2%iT3Y\xfa\x814:\xf0Ȅ\xec\xdbq\xcf\x19\x94\x14&\xd1\x10-%\xfb\xaf\x90\xa4\xe5\x87\xe6\x8fϾ}0\x9e\xa3\x04\xfe\xbd17\xfc\n\u007f\xfe\xc9U7|\xfb\x89\xbb$\xa2\xe4[\xae\xbc\xeb\U0007bbbc\x85\xc8\xfc\xaa\xeb\x1f|\xfc_%*i=\x16\x19\xbb9\x10\x1e\xbb\xfc$:\xb9\xfc\xea0\xdfi\xef\r\x87\xb3\xe8ճ\x9e\xe6+\xa4\x9c\x15k\xc6~\x8bxz\x87'L\r\x87\xc3\xf4\xaa\xa4\x9e\x92XK\xf3W&\x8c\x1d\xf7\xc8|\xe9(\xda\x1fn\x96V\x84\xc3D\xbbA\xa92\xdc2w\xd4\x1e\x12\xcb\xe4\xcc\xc8\xe4\xe0\x89\xf0\xe4\xab\xf5J\xe39\x93w\x1dS\x87\xfaI{,\xae\x8d\xad\x18Uf-\x0f.Ϛ\x8f\xb8\xe60\xf0\xb5\x01<.JZ7\xd0\x19h\n\x9e\x8c\xf5\a\x03-֡\xc6\xc0\xfbNr\xadJ\x19\xde\xdey/\xee'\x9f\xbf\x0f/}~\xffӸK\xfc\xe2\x1d\xf3\xf5\xb3\xa0tDY\x98:\x9e\\\x86\x9b\x94E\xd7\x05\x10\x19\xb8\xe1n+6\xee\xf68yڰ\xd9_o\xdbhi4\x1d2\xa8\x92~\x1fO\xa6\xdf+~\x1b/\xfd\x1e\x0f\x12\xd8\xda\xde/\xfe\x80\x86\xbd\x8fЏ\xbfOV>LZ\xc6\xc4\"\xf4p\xf1\x93\xff@_\xaa\xd7\x01\x8eJ\xa6\xef-M\xd2O\xe0\xc9\xf4\xe3҃x\xe9ߥ\x1f\xe2\x81\xf85\xff\x8a\x85\xfd\xcb\x1f\xbeB\xfe\xf2\xc4f\xf5\xf5\xc6k\xb1\xee\u007fu\x03\x91\xb4\x11\x8b\x98\xddD\x95d,=O0\xd6\xcdV/\x88g]\x8d\xc51?\x87.\xeb\x03o&%x\xadt\x1b>&\xf4\x9a\x98>\xf0\x1eh!\x02\xba\x89\xfc\x0e\xcc\xe4\x8c\xd9l.\xeeΙA\xfa6\xfc\xf1\x9b\xcab\xd2\x1e[֦/n\x93\xc8L\xacC\xb9\xa6\xcd\x04\xe8\x98j\x038ܔ4R\x9f\xe3\x8d\xce\x04q\u007f\xbd;hs\x94Ē~A[|\xbf\xf8\x0f\xc2Ͷ\xaa\xe7\xfa9z\x16\xa1\xe5D\xd2\xf3\xc6\xc7\a1\xe3*ɹ\xb3_\xb0љGF\x8f\x93\xc6e->\xa3K\xfa\xed\xe2\xcf\xd0\xf3\xf7\u007f\xf1O\xccw_\xe0j{A\xf9\xcd\xea\x81\r\xe8\xb3\xe2\xb7\xc8\xd2&\xd2\x1c&\x16K\xfaο\x1ae\x1fUNd\x03M\xd2\x0fJ\xafl\xbe\xf9\xda_\xfe\ns\xcd-\x9b\xb5\xb5\xb4;V~\xb3\xba\xfe\x96ͯ\xd0N{\xf3]D\xd2F,2v\x13w\xa1\xd9\x03h [\xf0@t]\xd2D\xee\xea5\x05]\xd2LJ\xf0Zゖ1\x97>\xf9\xd2\xed\xe3\xc7J7!.g\xccfG\xb7\xe9?Fc\x06rƯߡ6)i\x8f-k\xd3\x17+o\xa2o\x13\xcd\x01:|m\x00\x8fk\x926\ft\xc8[\xecL\x025\xd9xb\x89%\xad/\xbeQ\xfc\xb9p\xb3\xdd\xea\xa8O\x1d\x99\xd2Sy\x92:\x89\xc4]\xcezI\xf4\xe8\xf059\x01<\x97^\x9f\xf3\x9c.\xe9_\xdcM:[\x85\xa7\xb9\xda~\xfc4}{\xfa1\xdc'\u007fD\x96hs\x98X\xfc\xe11\xa6\xec=\x92i'5\xf1~\xe3\xaa͛oP[\xf6Uu\x1c\xaep\xe3W\xe9\xdbWo\xdc\xfcS\xe9'\xba\xa4\x8dXd\xec&\x1e\x92\xe6lE[s\x12(\t]\xd2\xe4\xdd,i&%\xf8\xc3$}#]\xd2{\xae\x1b\xb7xk\xf86\"5&g\xdcfxv\xbbG\xfb\xc3\x1eɰ\nO\xdac\xcb\xda\xf4ũJ\a\xff\xcdɦ\x00\x16\xa66\x80\xc7-I3\x06:\xf8D$K\x87\x02\xfcU*\x0e\x93\xa47\x99$\xfdA\xf1\uf15b\r(SHtF\"\x17[\x10\xbd<6\u007f\xfc^\xcaI2\xb6\xfbP\xb4U\x9c^\xf1&\xf3{E\xd2_\xdc\xf7\f\xe9y\u007fO\xf9\x8c\xab\xed\x85\xfbɕ\xb1/\xef\u007f\x01\xfd\xaf2\x91\u007fA\xe9\xa5\xf5X,\xe9g\x98\xa2W\x8c6\xfdʫ]\xf1\x1es\xf3\xe6\xcd_\xbb\xf6\xa7\x94\x9f\xf3\xbd\xf4\xb5\xf4\xedZ\xbd\x97\xa6\x97njXd\xec&桹h\xeeC(\x19KI\a\x8er)\xc1k\xbf\xa5o\xa4Kz\xe2d\xd2'~\x8bH\x9a\xc9\x19\xb7\x99\xc5\x15\xef\xe4=\xb6\xacM_\xac\x1cO\xdf\xc6W\x9a\x02X\xe0\x8a\xb7%nI\x9a5\xd0\xe9\t\xe0\xa3{\xae\xd9\xee\xde\x01Cҳ\u007f\x815\xf6\x98I\xd2\xff\xb8\xefIr\xd9\xea\xe5\x97\xcd\xdb\xcd\x1b\xaf\xf4X\x93\xc7\xe1a\xf4\xa1,r*w(\x97\x83\x97?G~a\x99J\x84\xfbP\x92\x06\x8e]}\x8c\xbe+\x92\xdeD$\xfc\x8123\xde\xf4\x1b\xae\xb6\xf7\xe9\xdaw\xc8\\\xfa\xb1\xfb\xb1\x82\xff2[\xf9\x86\xd1cyI'&~\x13\xf1\xa8⽋\xbc>Af\xd1x\xf9ۛ7\xbf2\xe6_H7}\xeb7Ȭ\x99\xac\xfd\xa1\xf48\uec2fy\x85\\##\x926bI)\xdan\xe2\x0e;\xab?Kt\xb2\x8b$=u*B'H6\x98\x94p?m\xe9\x92\x1eGt\x95\x98D$\xcd\xe4\x8c\xdb\xccB\xd2\xc9{lY\x1b3\xb5'c\xf5f\xa5r\x8b_\xda@Җ\xb8&i\xc6@\xe7P`ϱ\xfdMA\xebɑr\xc5\xfbw\xf4~\xd0\x1f\xdf\xf7\x9b\xd7\x1e+\x9e\xf5\xf6\u007f\xff\xf5\xa3Y\x1b~\xf7\xe5\x1f6\xcc\"W\xc2\xffs\xf6\x03o\xbd\xff\xb22\x9de94J\xb9\x9aݝ=n\xc5\xf2\x9cQW\x90;[\x16K\xf3Z\x82\x95\x12\xb9\xddjG\xd6ė\xb6=\xa4L\xb4\x05pw\x8fm\xfa\xfa\xf3\xef\xbc\xf7\x02\x15+S\xdb\xf3ś\xde\xdbTL\xaex\xffq\xf6w_\xdbt/i\x19\x13\xfb\xcf\xff\xfa\xe8\xfbO~\xf4\xd1'j\x81k$\xf3o\xef\xf4\xee\xb1'nQ\xee\x1e\xbbK\xfa\xda\x0f\x1f\xbf\x85^\xf8\xfa\xc9U\xd7\u007f\xef\x89[%r\xa3\xe8פ\xbb\x1e\xc7\u007f\xc1K?\xbd\xea\x9ao\xdf5F\xba\xf2\xc1\x9f1\xb1\xa4\x14m7\xb1\x84\xc6\xdd>\xce<\xee\x8e\xef\x0e\x87\xb3*\xc3\xe1s\xa8?<\xbar7\xda[9\x9a^\xc7^\x91\xb5f\xebm\xd9\xe4\xcbKO\xc9\xe0nz\x1d\x9c\u0383\x95+\u07bbIi+\xa4y/=7I\xcaY\xb3\x9b\xcb\x19\x93I2\xb9\xd1G\xd8\xc6D@\xb0\xc7\xe2\xda؊\xd1\xfcQ\x8b\x83\x8bG\xcd7\xad\xe5؛4\x9e\aT\\\x934k\xa0\xf3aK \xf8\xa1`\x02\xa8\xf2\xf9\xbdtf:\xeb/\xe4\xc3'Oξ\xfb\xe9M\xc5\xc5\x1b6\x90U\u007f\xb8\x1b\xbf\x92\x1bA\xfe\xf2\xccw\xef~\xec\xbd\xe4m\x97g)\x87\xfe\xd0ܜ\xf1\x8b\x03WH?\xc0\xcb\x1d\xb7\xe5\\=U\xf9\x11\xfcмqc'oM\xdeL\x81\xde\xe3]|\xbf\xfaE\xf1\xc1\x93߹\xf7\xc7\xef\xd3E\xa3\xb6/\xdexx\xf6\xc3o\xd0/\x9bO\x9e\xbe\xf7\xfe_\xbc=\x8b6G\x8b\xfd#3\xa9&\x17\xaf\x92n\xf2R\xee\xf1\xbeV\xf9\xd9y\xf3\x13\xff2f̍O\xd0ş\xdd|\xcdU7>N\x96~E\u007f\x97\xfe\x15]\xf9\xd51\xd7~\xe3\xc1+\xa5[\x99XZ\x8c\xb6\x9bx\xae\x9b\xc5\xff$\x87\xd93J\x99\xbc\x06\xd0\x0f\xf0\xeb\xe8\xeel\xfcJ\xf2\x10\u007f('{\xaa2%\xd5R\xb2_\t%=k\xfcj\xbax\x05\xf9\x95+\xb1fBVμ\xc0\xf8Ѹ_gs\xc6d\x12\x9d\xb8b\xde\xfe\x13\xf8 \xc6\xfb\xf7\xce\xcb\xd2\xe6P\x82=\x16\xd7\xc6,\xe2\xea\xd6ߔ}\xd3K\t\xd3Z\x0e\xad6 \t\xf7$}\x89xht\x8bSȥ\xa2yt\xa5\xf9\x8e\x89\x8b\xf6\x9fX\x97\xc1nn\x9dH/y͕\xa4\xafh\x17\xcaE{|\x91Pk\x03\x92\xf0\xbc\xa4њq'\x9cB.\rg\xae{.y\xa5\x93`\x9dQ\v\xba\x1cv\xf3\xc4~\xdc;\xf7\u007fxL\xfb,\xdc\xe3\x8b\x06\xad\rH\xc2\xfb\x92\xbe\xbcq\x12\xac3N5\x00\x19\x06H\xda]\x9c\x04\xeb\x8cS\r@\x86\x01\x92v\x17'\xc1:\xe3T\x03\x90a\x80\xa4\xdd\xc5I\xb0\xce8\xd5\x00d\x18 iwq\x12\xac3N5\x00\x19\x06H\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\x05H\x1a\x00<\x05H\xda+\xc0\r\xcf\x00\x05$\xed\t\xc0N\x06\xd0\x00I{\x01\xb0\x93\x01t\\\x95tw@\xfd\x97\x9d\xfe`\xa0Ý{\xf0\x19g\x19\v\xb7\x18{S\x9c!\x13\xbc:\xf5\a\xe2i\x8d\xac\x94$)\xfb\x90 \x00\xecd\x00\x1d7%}.\xb0K\xf9\xef\xf9c\x81\xf0\xa1p@\xff\a\x9eK\t\xe3,c\xe1\x16\xe3`\x8a3T\x16KN\x06\x19\x06Z#\x8f\x86\xc3/\t\x9f\xe6\x01v2\x80\x8e\x9b\x92\x0ev\x1c\xa3\x92N4\x93\xff\xdf\xdf\xd5\xec\xca\x05\x1e\xbdRk\xb7\x18{\a\x8d!\xb2\\Z\xee\x14b`dF\xfc\x80\x1exl\x0f\xa0㢤\xbb\x9b\x06\xfa\xa9\xa4{\x02䡓\xd4\x1e\xcbE\xac\xddb\x86E\xd2+\xec\xad&\xad\x00I\x03\x0e\xb8'\xe9s\x81CH\x91t\x872\x11\xdc&x\xfc\xf4\xf0b8˰n1,\"S\x1cda\xd7#r\xcd1\x1b\xe8\x18\xacQ<>\x8e\x8eU*\x96Ʋ\xf3\x0e\xc6\xe8\x86i$A,^\xb0\x93\x01tܓ41\xb7S$\xbdUyn\xd6.\xcbg\x80\r\x1b\xba\xb3\f\xeb\x16\xc3 4ű\xb2\xeb\x11\xb9\xe6\x98\rt\f\xd6KԦ5\u07b4^!\x10g\xfe\xc8\x18ݰ\x8dDBI\x83\x9d\f\xc0⚤{\x88\xf7\xac\"\xe9&\xe5\x91v{\xec-\x92\x87\t\xedi\xb8\u0081\xb7\xd8\x14Gl\xd7c\xe5\x9a\xc3\x19\xe8\x18\x04\xd4璞8\xa2`z\xcc\x10kt\xc34R$\xe9\xb9\x12\xd8\xc9\x00\x06nI\x1aϜ\x13\x89\xc4ѦDBw\xae\f_\xfa^\x1a\xd9K\xda\xc2\x14Gl\xd7c\xe5\x9a\xc3\x19\xe8\x184)\xcf\xca=\"i\xf0O\xb6e\x8dn\x1c$\rv2\x00\x8b[\x92>\x12\xd0\xe8G\x1d\x8a\x96\x82\x97|.M\xb0\x93\xb4\x85)\x8eخ\xc7\xca5\x873\xd01\xd8u\xb5\xa2\xcdpP\xc1\xf4+\x14\xfb\b}\aI#\xb0\x93\x01\x18ܒt\xe2$\xa1;p\xf2d\x02\x8f\xc1ɯ\xc1\xe7ܹ\xe2m'i\vS\x1c\xb1]\x8f\x95k\x0eg\xa0\x932\xe9I\x1a\xaex\x03:nIZ\xa1_\xfd]\x9atQ;\xdc\xf9]\xdav.-6\xc5\xe1\xedz\x8e<\xa7\f\x99\xad\\s\xac$m\xbf\xb7 i`\x88\xb8)\xe9D\u007fw\xa0\x9fx;\x1f\r\xec8\x12&~k\x97\x18\xc3Y\x86u\x8ba\x10\x9a\xe2\x98\xecz\xe6J\xb7+\xc1\"\xd7\x1c\x93\x81\x0eCp\xac\xcd%-\xd6\xe8\x86i\xe41r\xf7\xd8\xfap8)S`'\x03\xe8\xb8)\xe9~2\x95\xa6\xbf\xb8\xf6o\v\x04]\xb8\xc7\xdbp\x96a\xddbXD\xa68\x88\xb7\xeb\t\xe4h\x96Z\x02\xd7\x1c\xde@\x87e[\x8e\xcdm٬э\xd1Hz\x8f7!\xc9\xf9\r\xecd\x00\x1d7%\r\\4\xc0N\x06\xd0\x00I{\x04\xb0\x93\x01\x14@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)\\\x95\xb4n\xa0\x83PؕG\x9a\x8c\x14\x86\xc9\xc4\a\xf0\"nJZ7\xd0A\xe8D \x13\x1e\x9e\xb5c\xafS\x84\x05\xc3d\xe2\x03x\x117%\xad\x19\xe8 \xd4ߒ\x11\x92\x9e\x9c\xf4삔\x19\x16\xc7\x0f\xc0\x8b\xb8(i\xdd@\a\x85\x03ጐ\xf4$\x9040\xec\xb8'i\xc3@\a\xc5\x06\xb4\xc7\xf3{\x82\xfdWH\xd2\xf2C\xf3\xc7g\xdf>\x88?5MΞ\xf0\xc8\x00\x1e\x93\xa8O\x19\x9aD\x9eC4\xaa\t\x1d\x19-M\xe4bY\xd7\x1c\x96\xe13\xf1\x01\xbc\x88{\x926\ft\b^\x92t\xac\xa5\xf9+\x13Ǝ{d\xbe\x84\xd5Y9\xea\xa1\xe0\xfa\x9cI\t4\xb0+\xc0\x88\xc4-I+xw.\xad\xf5\xc7\x1dR\vy[\xfe\x1cy\x9d:\x15\xa1\x13tE\xf6b\xfc\xad69\x8b\x8f\x15JzXM|\x00\x0f⦤u\x03\x9dX\u007f\u007f`G\xbf\xc9ay\xe42\xb8\x9b^\xdbVT\xb6X\x9a\xd7\x12\xacT\x9cgWd\xad\xd9z[\xf61\xbc45\xe7\xb9\xe7&KW\x04z\x98X\xd65\x87a\x18M|\x00/⦤u\x03\x9d\xbdʬ\xfa\x9c\xd3\x06#\x84\xfd\x8a\xe5\xcd7\x95O\x1d\xb7\xe5\\=U1ˉ?\x94\x93=\x95\x0eG\x0eM\xcd\x1e{\xfbbI\xfa\x01\x13˺\xe6\xb0\f\x9f\x89\x0f\xe0Eܔ4\x00\x00\x17\x1d\x904\x00x\n\x904\x00x\n\x904\x00x\n\x904\x00x\n\x904\x00x\n\x904\x00x\n\x904\x00x\n\x904\x00x\n\x904\x00x\n\x904\x00x\n\x904\x00x\x8a\x8c\x96\xf4<)g>X\x02\x00\xde\"\xa3%ݿ#01g\xc0)\n\x00F\x12\xaeJZ3\xd0\x19\b\xb7\x04\x82\xfb\a\x1d\xa2\x87\x85\xb0\xb4\xdf)\x04\x00F\x12nJZ3\xd09\x17\bv\x1f\xd9۴\xd5\rM\xef\x91v;\x85\x00\xc0H\xc2MIk\x06:;Z\xc8\xf3\xc7\xce\x04\x86\xea\x18u!\x80\xa4\x01\x8fᢤu\x03\x9d\xad-\xf4\xf3\x0e\xdd\xc6\xf2\x12\x02\x92\x06<\x86{\x926\ft\xfa\x8f\xd1\x15\xbb\xb6\xd8\xc6\x0f\x0f\xddR\xd8)\x04\x00F\x12\xeeI\x9a7\xd0A(\xd1솸\xe29\x93w\x1dK8E\x01\xc0\x88\xc15I\x9b\ftp'\x1d8c\x1d=|l3\x1e\xfc\a\x00\x1e\xc0-I\x9b\rt\xd0\xee\xc0\x11\xdb\r\x86\x89\x81\x9c\xf1\xebw\xb8R3\x00\f\vnI\xdad\xa03\xb8#\xe0\xcem\\{\xa4\x0e\xa7\x10\x00\x18I\xb8%i\xde@g \xd8\xc4=\x8e\xfe\xd2\x01W\xbc\x01\x8fᖤ\x15Թ\xf4\x99\xe6-\xe7\xb0\xcac\x0e\xd1\xc3\x01H\x1a\xf0\x18nJZ3\xd09\x1ah>\xd2\xdf\u07ff\xab\xc5i\x83a`7H\x1a\xf0\x16nJZ3\xd0٦Ϊ/\xf9\xad&\xf1\xfe\xbd\xf3\xb2\\\x1a\xf1\x03\xc0\xf0ত]g\xae$}\xe5\x92\u007f\x8f\x00\xc0\xb0\x92ђ\xee\xff\xf0\x98S\b\x00\x8c02Z\xd2\x00\xe0=@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)@\xd2\x00\xe0)\xfe??\xe8B\x81\x97E\xcd\x14\x00\x00\x00\x00IEND\xaeB`\x82", + + "analysis/ident-field.png": "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x03\xd2\x00\x00\x00\xde\b\x03\x00\x00\x00\xe6g\xc8\n\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x00\x01\x00\x02\x05\x01\n\x03\x01\x05\b\x03\f\x0e\v\f\x10\x1c\x0e\x11\x14\x10\x12\x0f\r\x15$\x16\x17\x14\x1c\x1b\x15\x1b\x1d\x1a\x1f\x1f\x19\x13#A!# $$\x1d#$\"$%#&'%\x19(G((!'(&+)\x1e\x14+N()'++$*,)/-\"*.0-.,02/63(241685<9-5:=:;9=?=CA5AB@CEBKH|u]tvsB\x8c@@\x8dG\\z\xbby{x]~\xb7e|\xb8K\x90J\x85}e_\x80\xba}\u007f|O\x93Nb\x83\xbdN\x95Ud\x85\xbf\x81\x83\x80W\x95Vl\x87\xbc\x90\x86hZ\x98Yo\x89\xbf\x87\x89\x86]\x9c\\\\\x9dds\x8dÕ\x8cn\x8b\x8d\x8az\x8e\xbfe\x9ef\x8d\x8f\x8c|\x90\xc1\x9b\x91s\x90\x92\x8fi\xa2i~\x93\xc4x\x95Ā\x94œ\x94\x91\x9f\x95w{\x98\xc7s\xa4lq\xa5s\x95\x97\x94\x82\x9aė\x99\x96\x83\x9cƙ\x9b\x98u\xaaw\xa6\x9b}\x87\x9f\xc9~\xaay\x9c\x9e\x9b\x89\xa1ˀ\xad|\x9f\xa1\x9e\x8f\xa2ǫ\xa1\x82\xa1\xa3\xa0\xa2\xa4\xa1\x92\xa5ʂ\xb1\x85\xa5\xa7\xa4\x8a\xb2\x87\xb4\xa7\x83\x8b\xb3\x89\x96\xa9Χ\xa9\xa6\x98\xabю\xb6\x8c\xaa\xac\xa9\x9e\xad͍\xb8\x93\xba\xad\x88\xad\xaf\xac\x95\xb9\x95\xa1\xb0Я\xb1\xae\xa3\xb2Ә\xbc\x98\xa5\xb5ճ\xb5\xb2\x9b\xbf\x9bµ\x90\xab\xb7ѵ\xb7\xb4\xa3\xbf\x9d\xa2\xc0\xa4\xad\xb9ӷ\xb9\xb6\xb9\xbb\xb8\xb0\xbc֦Ũ\xbb\xbd\xba\xb3\xbeٽ\xbf\xbc\xa8ǫ\xb7\xbfԯƫ\xbf\xc1\xbd\xce\xc0\x9b\xb9\xc1ֲɮ\xc1ÿ\xbb\xc3\xd8\xc2\xc4\xc1\xbd\xc4ڲ̷\xc4\xc6\xc3\xc0\xc8ݻ\xca\xde\xc7\xc9ƻκ\xd9ɝ\xc6\xca\xd9\xc0\xcc\xda\xc7\xcb\xdb\xca\xccɿҾ\xc9\xcd\xdd\xd7ϡ\xcd\xcf\xcc\xc4\xd0\xde\xc8\xd3\xc1\xcc\xd0\xe0\xcf\xd1\xce\xe1ѥ\xd2\xd2\xdd\xc9\xd7\xcb\xd2\xd4\xd1\xcd\xd6\xde\xcc\xda\xce\xe6֪\xcf\xd8\xe0\xd5\xd8\xd4\xd2\xda\xe2\xd8\xda\xd6\xd8\xd9\xe3\xd5\xdc\xd1\xd3\xdc\xe4\xda\xdc\xd9\xe6ݯ\xd8\xdd\xe0\xd5\xdf\xda\xdc\xde\xdb\xdc\xdd\xe7\xda\xdf\xe2\xd7\xe1\xdc\xe0\xde\xe2\xde\xe0\xdd\xf0\xe0\xb3\xdf\xe1\xde\xdc\xe2\xe4\xde\xe3\xe6\xe1\xe3\xdf\xe3\xe5\xe2\xe1\xe6\xe9\xe8\xe5\xea\xe5\xe7\xe4\xe4\xe9\xeb\xe7\xe9\xe6\xf1\xf3\xf0\xfa\xfc\xf9\xfe\xff\xfcŃ\x89%\x00\x00 \x00IDATx^\xed\x9d\x0fX\x14\u05fd\xf7/\u05fc\xf5m\xea\x9d(o\xb9o/)\x04S\xac\xb6Y\xd9摖p\xcd$\x8c^I\x1f.\xe8\x96\xd2W\n\x9a\x91\x17I\xf7\xcc\xe5)O#\xb4\x85\xe7\xabŹ\xe9\x16\xdeV\xf1tFҪ\x8b4\xe6\xfcڹ\xb6\x94܋\xaa=]\x11Rw\xd1<'*t\xe2\f\xe5\x9a\xcd\xe6Ɏ&\xae\xc91\xf9)\x9cn\\\x95f\x9b\x9b\x9bF\xa6\xeb}\u007f\xcaN\xcax\x1a7\x9d\xf7m<\xbf\xe3|~Z\xe2\xaao\xab\xf1\xf1KQ)O\x8e\xaf\x19\x8026\xd1<\xbf(\xc7}u_EvRV\x05\x9d\xfa_\xccKM^+\f\xbc\xa5ݐ\xaa\xbc+\xc2]H\x89\xa0\xacy\xd1\xf4E\xf1\xb4\xf0\xc9K\x88H\xae̙\x18\x1a}w\x03\xdd\xe8\x9c71rN\xba,iu,\xea\\6%\"\xeep\xf4>\x94ɍ/\x96\xa7\xbfr@͌\xe8Ш\x19x7\a'\x10\x83T\x9268\xb0\x1c\xd00\x81\xe3V4ϛ\x14>\x83|\xa9\xeeZWn\x95\x90k\x9d\xa9>\xfcm\x96oJM\xce=OC\xb4\xbeMA\xd2y\xa9$\xcd\xd4dWᢤ\x9c3\xa9ul\xd3P\x04H_\xec\x11\xa1\x15\xf1\xd9b\x86\x9e\xb5\xae\xf9\x81\x94\x9f⩘\xf0\x18\xd2\\t>\x1b\"u7Z%]\xe6h\xdae/>Dk\xd5Q\x89\xbcI\x1a}\xd0X͗66\xe2^\xf0b\xa3\xadT\x9c\x9b\xb6V\xdb\xf8\x94\xd2?$璈\x93I\xd9{O\x94\xe2ѹ\x92\xe3\xd2\f\xb3*\"\xe6\xb1\xca5\xdc\x06\xc5\xdb\xcey\xdc\x14\xee6n\x0e\x1e\x81\xbdsg\xfe+'*\xe6\xf2\xdf\xe2͛\xf8mu\xe5)Y}\xa8\xa7\xba:-\xe3\x9eԧ\xf3\xee\xfc\xb4\xab1\xf9\xb9/ї\xcf%7vi\a\xf4\xb0\aϷ\xed\xa8\xdba\xcbǩ\xf3\xc9\x19\xfb\x8f\xac⩤\xa5\xdd\xd4\xe5=\xe4\xd1\nNs\x0eW\xd32\x8e.ᤏ\xcftl\x8e\x8a\xe9%\xdaK\xaf*\xb9{|-\xde\xd8\x1c1\xb9\xa8l:\x17\xa6\x1b{yR\xd4c\x8eL\x8e{\n9kB\xd7H\xd3_9\xa0\x96\x9b\xb7\xab\xd2\x1e\xc5u\xa3\xceC5\x93\xe3jjj\x9a\xc4\xcc\\\xae}T\xd2F\a\x96\x03\\%\xc5ѓ#\xa2\x97\xcc\xe3\xc8R\xaf\xbb֕[%\xe4Zg\xaa\x8f|\x9bi\xa5\xa5iI\xadH\xe7\xdbl\xe5\xeb\xba>*Ŀ\xab\x88\xad\xc9ki\xc9\xe5uX\xcd\x15l\xd3`\x03\xe4/\xb6\xebLcFNcc\xa3{\x14\xe5Y\xeb\x9a\x1fH\xf1)\xd2\xc3V8V\x84\xcd\xd3\xfdl\xddΪ\xdb#\xafg\xb84$\x98$\xe9\x12{qC{Sq\t\xd6tSQ\xa7wI\xb3\x03o\x1b\xf9N\x85\x81\xac-\x19\xff\x8e\xe7\xa7\xe0TO\xda*\xdc7\xf6T\u007f\xa5\xda\xcd\xc1\xb5\b\tW\xf4\f\x17\xf9\x1e\xd4S\xb8}\xa1\\(]\xa0\xacH!b.Oƍ\xe0U~?N\x9e#\xdd1\x1e\xaa\xf1\x0f]C}d]nS\x1e~\xc8#]\xb1f\xc0'\xccԠ\x8ev('\xf8:\x84r2\xf0O@_\x96M\xb9\x9b\xaa\xbc\xed\xdc.\xa4\xe44\xed6瑤\x83#KM\xb5\xdc\xf3\xa4\xfc\xa4\xb5\xdcFNz\xc6M\xc2\xc9ޘ0\xdd\xd8y\x91dD\xb2\x84#]J\x18Y~\xa6ce&\xe0\xa9(ҿl\x8e\xa4\xc7c\x06\xde\x02\xa7}80\x13\x80s\xe0\xa6_\x11\xe7QR\xad+\xb62H\xb5\xce֯-\xed\x1aQh\xb6\u07b7\xd9J\xbb\xd8|\xf2\x83\xc8\xd4d>i\x03h\x1b\x964\xdb4\x98\x00\xe6\x8bU\x0e\xbc5j]\xef\x03I\xc9}t\f#TH\xda\xf0\xc0L\x00\xf3\xa3\xc0Ժb\xab\x8c\\\xebl\xfd\xdah\xddV\xf0\xd7t\xbeMay,\x99|\xe7rM\x8a\xbd\xf4\a\xb2\xa4w\xa8\xaa\x9a\xf9bţ\xed\x17\xc7\x05\x9e\xb5\xae\xf7\x81\xa4d\xfa$\xfa4)]\x15\xc02zW\xbc;\xe8I\xac+\x05\xee\xcb\xc7|\x9dK'\xe1\xf1Y߯T\x92\xeeJ\xc9!?\xec۶\xa9\xf7\x9b3Y\x18\xcewN\x8c#M(s\x89:\xa0=R8;YJ&\xbex껑\xe8\x8dN\x92\v\xf7\x92GF\xd2o%~\x96\xf8\x16Ih\a\b\xe7\xa5\xfbr\xd2ȸ\x9a\x04T\x93,\xb3\xd3\xf0\x8c\xf0\xa3D\x9br7ey{\xa7\xcc@*\x04eM\\Ұ\x06\xcf\xdcJȖ\x15\xb8S\x8b&\x8d\xa87\x86\x8c\xfe\xa6E\xe3v\xd7\xfc\x830\xdd\xd89Q\xa4aΣ\n\f\xc7\xea\xed\xbd\x9d\xc42\x01k\x84\x19a\\&}\x8c\xc3\xdf\x00y\x8f\x91\xb4ၙ\x00e\x03w\u05fan\xb3w\u05faB\xd2s\xbbpŤ\xe5\xa8k\xa7e\x9d0\x8c\x17$\x9d\xb2\xad\xb5\x94\xadɵs\xb1l\xfb\xf2\xa9\xa4\xe5\xa6\xc1\x040_,~Ĺ\u007f)\xbc\xa7U\xebz\x1fHJ:\xe8X\xfdya\xba\f\x92Vs\xac\xe0X\xfb\xe9\xe2]\xdd\xf4E/\xe9\xa5u/?\x10V\xbc\xcfбӃ){K\xb3y\xdb\xfe\xd6\xcf\x1am\x1b\xcf\xf4\xbd\xb3\xd1FV\xc2O&.\xaa\xa8\x13\x16I\x144\x8f\x17\u05f8\xab~0\xe5)G\xa6\xfee\x8e\xa5|R\xe9\xabG6\xf1d\xae\\xg\xde+8Y\x8d\xbe}\x8b\xae\x91~\"\x84\xf4\xa5\xaeJ\x15.I\xd5\x0e\xa8Kzp\xff\x91U\xb638\x99\xc7\x17\xbeZȓ\xf5\xb4֤\xd4\xd2\x1dɤ\xbc\xccn\xaa\xf2n\xf0\x1cB\bW\x15N\x9fA&o˸{K\xcaҹb\xa2\xc29O\xad\x8b\xc1\x83\xe5\xc3\xe8tx\xf4\x9a\x15\x91\xe3'\x145\xe9\xc4:'F?\xb5kV\x18\x95\xf4\xb4\xa8u\xeb\xa6q$V\x91Y\xc4\x1aǮtauzM؆\xb2\xe9\xe1\xedʫnj\x0e,\at\x1f\xa6k\xe6\xee)\xb4X몭\x9e(\xaa\xcf\xc6gWWd$\x93\xf5hE\xed\xcc\xe2\x04\xe9\xb5Rm\xe6\xe4n\xccbk\U000b3534\x8aWr\x13i\xac\xd44\xd8\x00\xf6\x8bſ\xff\xe5G\x1eJ\x12zi\x8dZ\xd7\xfc@\x8aO1o\xfc2Dz\xf1\xf3\xbc}\xb6c\x1e\xe3y\xbfc\x96\xa4QsYѮc\x82\xa2\x91\x93L\xa5\xf5\xfa\xe9\x9ed:1\xb2ѳ\x0f\xe7s\x12\xefY\xb5\x83\xe7\xb7l!\x9b>H\u008f[\xf0\xe6\x8f֦ޓ-\xaf9K\xac\xf8\x81X\xc1\xcds\xa2#\xa6\xa9\x978e\xfe\x94S\x9afK\xc9\x11.7<\x91379\a7\xa0\xf7\x9993\xa6\\Z\x01\xd3\x0eh]\x9547\x97\xae\xec\xf4\x95g%e\x95S\xfd\x9f\xcfMN+\xdco\xa3\x85t\xef\x86\x14\xe5\xad\t\xf7\x18;\x94\xe0\t\x1d\x9e\xe46L\x8e\"\xfd\xc1\xbe\xe9Q\x91qD\xb6\xbd\x1b&\x87E\xdd[49\x14\xf7\xa9\xcdwGNZR4\x81\xcbԉE\x1d\xe9\xd1\xe1ӏQI7DžG\xccX\xc6q\x99l@qܚ\xe8Љq\xe2\xf9\xa6\xcc\xc8\xf0\xb8Z\xf6\x1ao\xbbၙ\x80\x86\xf1t\x0e*u{B\xad\xab\xb7z\xa0\xa8>\xdbӛ\x92S\xf3\xe9\xe5:\x8ao\xb3(\x8a.ȑ\v\x03p\xa7ۚ1\xf7U\xc4\xd6\xe4\x17\x9b\xd2\x12\x1f:G%-5\r6@\xf1\xc5\xf6lKN\xcc9G\x93\x1a\xb5\x8e4?\x90\xf2Sl\xbe-\xfc\xb6\xcd\x1e[Y\x9c\x13\xe648\xcd\xfd\xefJ\xd3$\xed\x1f\x96\x84\x96\x18\x85\x98\xcb\xf3\xa1\xe9\xddF1\x83\xa6S\x98\xfa\xfa\x9dAԺ\xb0<68\xba<\xc7g\x06\fc\xad\x97M\xe1\xe0\x9f+\x87\x95\r\xd1^\x96\xdḑc\xe2:\xa3\x90\xeb\xc0,I\x0f\xa2\xd6\xfd*\xe9\xe1\xadug\xc3@?\xfc\xd0\x12\xec\x92\x1e\u0558&\xe9\x81\xe3WI\a7 \xe9\xe0\xa5y\x1f\xb7\xc4\xf4\xf5W\x9f\xb8H\x17;\x8d\xa2t8_\xc7?\xfd\xd6`w\x0eB@\xd2\xc1K\x1c\xc7q\x13\x9a\x8d\xa2F\x02t\xb1\xf3\x13\xa3(\x1dr\xc8\xce獢F\x0f i\x00\b*@\xd2\x00\x10T\x80\xa4\x01 \xa8\x00I\x03@P\x01\x92\x06\x80\xa0\x02$\r\x00A\x05H\x1a\x00\x82\n\x904\x00\x04\x15 i\xb38\x92\xfd\xe5\xf0Z\xb9\x00\xa3\x13\xf3$\xed6\xd0q\x15\xd1\xdb\x14\x15i\xddK(\x88\xd9˗\x92\x8b\x18\x87\xcf\xca\x05\x18\xa5\x98%i\xd9@\xe7\xb2\xfdMr\xab\"s\xff{\xc5\x1f0\xfe-\xe4\xfec\u007f\x12\x12\xc3f\xe5\x02\x8cR̒\xb4l\xa0s\xd9n\xaeџ\xdf`\xfd[\xce\vw\xc4$\f\x97\x95\v0J1IҌ\x81Ψ\x914{\x83\xcaM)]\xee\xe4pY\xb9\x00\xa3\x14\x93$\xcd\x18\xe8\x98(i\r\xa7\x16\xd6\x14GөŇX-7\x1e\xa5\u007fK\xcf=R'\xadm\xe5\x02\x00\x83\xc5$I3\x06:\x97\xed\x958YcB\xb3\xd6rja\\]\xb4\x9dZ\x8cc5\xddx\x94\xfe-\xef\b7\xf8\x16аr\x01\x80Ac\x92\xa4\x19\x03\x9d+4Y\xf2\xbc\xdf5\xad\xe7\xbb#\xb9\xba\xe88\xb5\x18\xc5\xea\xba\xf1\xc8\x03\xef:\xd6\xe0\xd2\xd3\xca\x05\x00\x06\x8fI\x92\x96\rt\x10:M\xc4\xec*\xf2{W\xa5\xe7\xbb#\xb9\xba\xe88\xb5\x18\xc4\xea\xbb\xf1Ȓ>\xc23\xff\xef\xefi\xe5\x02\x00\x83\xc7$I\xcb\x06:nj\xfc\xdeU\xe9\xf9\xeeH\xae.:N-\x06\xb1\xfan<\xb2\xa4\xcf\xf0g\xe4<<\xad\\\x00`\xf0\x98$i\xc6@\xa7\x92\x9a\x17\xa0*\x87\xd7\x1d\x86\x01=\xdf\x1dIz:N-\x06\xb1\xde\xddx\x04\xff\x96.\xf6\xeey\x9eV.\x000xL\x924c\xa0\xe3\xa0\xddsG\x91\x96\xb9䰢\xed\xd4\xc2\xc8Tǩ\xc5(Vύ\x87\xf5oY\x9b!\xdd\xffN\xc3\xca\x05\x00\x06\x8fI\x92f\ft\xda\xed\xfb\x9a?\xb1\xf1\x8b\x8cb\x10\xb9\xaf\x12\xe6Ό\n\x9f\xafH\xd5\xc9Wt\xee\xe9\x98\x1e\xf9\x98ƻ\x03`\x88\xbd\u007f\x1c\x91\xbe\xff˼\xfb{K\xe78.\xbcY#\xa0\x81ۧ\xb1ut`\x96\xa4e\x03\x1d6\xe9o\x1c\xe1\xd2\x1dϦO|*=\xfc\xb2\xb7\xe0\xe1\xa2\xef\xccF\x9bQ\f櫽\xfc\xfeƺ<\xfe9\xa3@7\xda\xf9\xba\x9d{\x96Lzl\xfcu\x9a\x16\r\xad\xf7\xcf2n\x99Q\x88\x84\xfb{k\xaf\xa9٬y\xcb\xe4Z\xaeFc\xeb\xe8\xc0,I\xcb\x06:l\xd2<:8\xdc<;\x8d\xa2\x86\x89R_$\x8dN\xf0\xadX\xa7[\xd8\xfb\x05\x1b\xa0\x91\xaf\xe4\xdcs\xfb:\x14~\xbd\xcd~H\xbd\u007fVp+\x8cB\xb4\xa8Ց\xb4\xdfo8;b0IҌ\x81\x0e\x934\x91f\xce\xf7aߐ3\x00I\xa3\x9e\xe4-F\x81\x12\x1a\xf9J\xce=\xb7\x15\xb5s\xd7;0\x1aR\xef\x9f5\xdc\x1a\xa3\x10-@\xd2jL\x924c\xa0\xc3$\xfd\xcb\xe5p\x8e\x1b_LR\xae(\x8e\xe2qˠ\xe2iᓗྻa\x02ǭh\x9e7)|F7\x93T\x05\x8b\xb7/j\x8f\x102\xe3\"T]\x98\x86]\x0fB\x17\xf3R\x93\xd7\n\x03dƂG3V\x904\xda2W7\xb6\xaf\";)K\x98l\xeb\xe4+;\xf7\xccX1\xeb6\xfcY&4i\x1f\xcd7#!\xd9\xfbG\xfc\xf0\n\xa4ݘ\xcc\x14\xf9*x\x8c\xa3s{\xed\xea\xcb\xe4B\xedK&\x87\xcf \xdb\xe4\uf360-\xde*\x90\xf4`0\xca\xda\x1b\x8c\x81\x0e\x93\xf43\xc7jj\u0084\x9e\xe1͚\xe7\xb9555\xea\xb9e\xfa\xf8L\xc7樘^\xe4*)\x8e\x9e\x1c\x11\xbdd\x1e\xf7!\x93TE\x8b7\x19t\x15m\x16P9fk\xd9\xf5\xa0\xf3\xc9\x19\xfb\x8f\xac\xe2\xa9\xf4d\v\x1e\xedXQ\xd2\x15|\x97^l\xbemG\xdd\x0e[\xbe~\xbe\x8csϚ\x88\xb0c\xdd3\xe2\x0e\xeb\x1c\xcd7#!\xd9\xfbG\xfc\xf0\n\xa4ݘ\xcc\x14\xf9*\xd8\xccљ\xb9v\xf55\x15O\xe0\xa2\xd6l\x88\xa0\xe7\xa5\xe4\xef\riJ\xba\xdbYu{\xa4Y\x93(\xf31IҌ\x81\x0e\x93\xf4?\xe1\ue9a15\xf0vpE\x88\xb4\x19j\x86\x11\xc3M\xbf\"N\x0f\x98$\x8b\xfbV\xc0\xce\x16\x01\xe5\x0f\x84\xb6]ON\x06\xd6g_\x16\x91\x1ec\xb6\xa3\x1d+J\x9a\x98\xefh\xc7\xd6\xf1'hX\x9d^\xbe\xacs\xcf:Ύ\xae\x84\x93\x0f}\x1dFB\xb2\xf7\x8f|\x1fd\t\xa5{\x90;3E\x92\xc5\xce\t\xfd\xbcv\xf5\xa1\xb0H\xdcCϋ\x12_\x85{\x93\xf4,\xdcǛ8\x8d2\x1b\x93$\xcd\x18\xe8\xb0^:~ǫ\xa4\xef\x9d\xe4\xea\xc6D\xd3\tcL\x98\xd4+3I\rZ87\x8aF\xaei\xd7sM\xd0\xc6\x0e\"=\xc6lG\xdb\xdaG\x94\xf4~\xfe+\x9d\xd8M\xc29\xabE\x1b\xf5\xf2e\x9c{J\xb8\xc8%h\xc3D2y\xb8\x0e#!\xaf\xde?J\xf7 \x9b\xd4+3I\x96\"\xfa\x03\xaaW}(\x8c|\vk\xc2\xc4W^%\xfd\xe1>\xfb\x14\xe8\xa5\a\x83Q\xd6\xde`\ft<\xbdt\xfc\x88WILjm\x8b\x8e\xf6bn\x97\xb7\xcbI-j\x1c\x02\xca\xf5dM\xbb\x9es\xc28\x98.c1f;\xda\xd6>\xa2\xa4\v\x93\xf5b\x1f\x14n?\x9c\x9b\xad\x97\xaf\xec\xdc\xe3\f_R\xf5\x83\x96I\xf4\xd3_\x87\x91\x90W\xef\x1f\xa5{\x90;3E\x92\xe5P\xa4\xa0M\xed\xeaCt\xa8훤15\x9c)=Ĉ\xc0$I3\x06:L\xd2\xffx\x95\xf4\xbcI\xc7)\x1d\xe4E\xcc\x1ci;\x93\xf4\x1dM\xbb\x9eo\x04m\xe4\v\xbd\xa9d\xb6\xa3m\xed#\xaex\xa7\xacՋ\xdd$XZ\xa7\xe5\xeb\xe5+;\xf7\x94\xe1>p֤\x88\xcbB\xbe\x836\x12\xf2\xea\xfd\xe3\xe9\x1e$\xc0$\a\xc0\xc0$\r+ރ\xc2(ko0\x06:L\xd2\xffx\x95\xf4>\xae\x84<\xad\xa0\x17I\x19KZc:ɠmד\x9d\x86g\xb0\x1f%\x12\xe91f;ڱ\x82\xa4\v\x89\x00\xb5c\xeb\xe8\xd6j2\x97\xd6\xce\x17I\xce=\xbb\xb8f\xf4&w/\xea\x8dn\xb9\x0e#!\xc6\xfb\xa7e\x8d\xc7\x191ŁA\xd2~\xc3$I3\x06:lү\xb8\x0e\xd7Ԅ\xa5\xd7\xd4\\q\xafx{\xb4\x82eܽ%e\xe9\\1\xea>\\39\xae\xa6\x864v&\xa9BkїAˮ\a\xb5&\xa5\x96\xeeH\xe6m\xfb[\x15f;Z\xb1\xc2\xd5c\xf9<\xed'\xb5c\xf3\xf8\xc2W\v\xf9<\xfd|%\xe7\x1eg\xf8\x9c]ѓC3ׅ:\xaf\xc3H\x88\xf1\xfe\x99\xc5\xc5!5\xd2nLf\x8a|\x158\"\xbc\x8cӜ5\xa1\xe9\x87\xd1\xf1\xf4\xd0\x1a'\xfb\xbdѫ\xc76\xd7\xd4x\xacm\x1c\x1b\xc5n\xa0fI\x9a1\xd0a\x93\xfe\xa4v\xbc0U\xb6#W$ML\xf0\xb8\x80m\xdf\xf4\xa8ȸ}\b5\b\xa1\xa4\xb13I\x15Z\xa7fY4\xecz\x10:\x9f\x9b\x9cV\xb8\xdfƓ\xebG\x18\xb3\x1d\x8dXz\x8d7\x9f&\x0ey5c\xfbʳ\x92\xb2\xca\xfb\xbc\xe4+9\xf7TN\x8e\xca쬜\x1c\xf9\x94\xce\xd1|1\x12b\xbd\u007f6\x87E!\x0fܻ1\x99)\xf3e\xd9\x17\xe5\xe5\xb2\xecL\\塧\xc3\xf1c&\xf3\xbd\xd1k\xbc\t\x1e\xc3&\xe7\x849\rNS\xae\xd87\x1f\xd3$\r\x98\x83۹\xe7z\x10\x96ǔ\xde?\xb3\xa6\xebE\x9bB\xd9\x14\x0e\xfe\xb9r\xc0\x18e\r\x8cH\x04\xe7\x9e\xeb\x82JZ\xe9\xfd\xb3nĝ\tv6\xa8\xaf\x1c\x1a%\x80\xa4\x81\x01\xe3i$\xd4\x1e\xb5Y3\x12\xf0? i`\xa0\x80\x91Ј\x06$\r\f\x140\x12\x1aр\xa4\x01 \xa8\x00I\x03@P\x01\x92\x06\x80\xa0\x02$\r\x00A\x05H\x1a\x00\x82\n\x904\x00\x04\x15 i\x00\b*@\xd2\x00\x10T\x80\xa4\x01 \xa80OҢkNw\xb1]\xa0\x18\x01\x00pݘ%i\xc95\xc7e?\xee\xc4\x1c\xb37\x18\xed\x12\xe8T\x1dG\x000\xec\x98%i\xd95\xe74\xb9ۯ\xab8\xf8\xefBq\xfb`nY\x06\x00\x03\xc4$I\xab]s\x1c\xfe\xbfO\x91\xdf\x19\xd4]\b\x01`\x80\x98$i\x95kN\x93=x\xfe]]\xe9\xb0\xe3\xb6\xe0q\x88\xb7ԉ!7\xdd\x19_\x8cZB\xb9)\x8aX\xd6\"\x86e`.4\x00`\x92\xa4U\xae9%\x95^\xa3\x03\n\x85Îd\xc1\xd3y\x88ޅ\xb0\xa6\x89\xde\x1ao\r\xfeQK\x0fS\xc4*,b\x18\x06\xe6B\x03\x00&IZ\xe9\x9a\xd3b\x1fBS\xd3\x11\x80䰣\xb4\xe0\x91\x06\xde\xec\rle7\x1e\xa5E\x8c\xc8\x00]h\x00\xc0$I+]s*K\xbcG\a\x1a\x92Î҂G[Ғ\x1b\x8f\xd2\"Fd\x80.4\x00`\x92\xa4\x95\xae9E\xa6ܖ\u007f\xf8\x90\x1cvb\xc4\x19\xb4`\xc1\xa3-iɍGy\xf3y\x91\x01\xba\xd0\x00\x80I\x92V\xb8\xe6tؽ\xd9T\x04 \x92x=-x\nH\x9fLŻ\"L\x19\xab-\xe9\xa1u\xa1\x01F\x01&IZ\xe1\x9a\xd3b\xbfl\x10\x1e`H2UX\xf0\xc4\xc5!\xe4\xa4\x1b\u0097!\xd4{\xbbO\x92\x1eZ\x17\x1a`\x14`\x92\xa4\x15\xae9Mv\xf7\xcaw0\xa0pؑ,x\x10Q놲\xe9\xe1d!pZԺuӸ\tEML,k\x11\xc320\x17\x1a\x000KҬkN\x8b\xdbw<(P:\xec\xb8-x0\xae\xcc\xc8\xf08\xba\x1e\xd8\x1c\x17\x1e1c\x19\xc7e2\xb1\xacE\x8c\x82\x01\xb9\xd0\x00\x80i\x92\x06\x00`8\x00I\x03@P\x01\x92\x06\x80\xa0\x02$\r\x00A\x05H\x1a\x00\x82\n\x904\x00\x04\x15 i\x00\b*@\xd2\x00\x10T\x80\xa4\x01 \xa8\x00I\x03@P\x01\x92\x06\x80\xa0\x02$\r\x00A\xc5(\x96\xf4\x1c.j^\x93Q\x10\x00\x04\x18\xa3X\xd2Ϊ\xa2)Q\x9dFQ\x00\x10X\x98'i\xd1@\a\xa1\xceC\xbb\nv\x1d2E[U\\\xd0{|\x00\xa3\r\xb3$-\x19\xe8\xa0\xcbŻ\x9aڛv\x15\x9bqg\x93Z\xee\xb0Q\b\x00\x04\x16fIZ6Щ)!7B\xe8.\xa91\xdae\x18\x00I\x03A\x87I\x92f\ft*\x85\xbb\x84\x96\x99qw~\x904\x10t\x98$i\xc6@\xa7\xa3\xb8\xaa\xc3\xd5QS\xdc\xe1-~\x98hઌB\x00 \xb00IҬ\x81\x0e\x9eV\xdb\xed\xfbL\xb9\xa3\xa0+jڡ\xf6^\xa3(\x00\b L\x924c\xa0\xe3\xaa,ir6\x95T\x9ab]\xb9\x8f㸻\x8d\x82\x00 \x800IҌ\x81N\r5\xc6r\x95\x98a0\xdd\x195isU\x90\xf9\x02\x00\xa3\x1c\x93$\xcd\x18\xe8\x14Ѕ2\xf4f\x81\xb7\xf8a\xa2\x963cQ\x0e\x00\x86\x11\x93$\xcd\x18舒>n\x8e\xa4a\xc5\x1b\b2L\x924c\xa0S%\x0e\xbc\xcdX{\x06I\x03A\x87I\x92f\ft\\ϗ\x9cn?]\xf2\xbc\x19KއA\xd2@\xb0a\x96\xa4\x19\x03\x1dW\xed\xae\xa2]\xb5\xfeW\xb4\xcby|N\x98Ҁ\n\x00\x02\x1e\xd3$m>\xb38.\xba\xcc(\b\x00\x02\x8cQ,i\xe7\xf1v\xa3\x10\x00\b8F\xb1\xa4\x01 \x18\x01I\x03@P\x01\x92\x06\x80\xa0\x02$\r\x00A\x05H\x1a\x00\x82\n\x904\x00\x04\x15 i\x00\b*@\xd2\x00\x10T\x80\xa4\x01 \xa8\x00I\x03@P\x01\x92\x06\x80\xa0\x02$\r\x00A\x85y\x92\x96\ftz\x1b\xca\nv\x8d\x1c\xbf\xb9\xd6\xdc\xe4䜓Yg\x8c\xe2\x04N\xa4\x1c\xd1\u007f\xb3\x94\xb7\x91w\xeb\x92\xf8R\xed\x80-<_\xad\xfd\x0e\xfa\xc4\xc6/\xd2ykh\t\x88B\x02\xbec\x96\xa4e\x03\x1d\xe4(:\xder\xac\xe0\x98\xd1\x1e~\xe2][\xee+չ\xfa\xadXūI\xaf\xe8\xbf\xf9E^\xd2C\xf8\xe9\xa1ļ/\x94o\x9c|Wx\xbe\xd8h\xd3\xd1\x11\xea;\xb3Ѧ\xf3\xd6\xd0\x12\x10\x85\x04|\xc7,I\xcb\x06:o\x16\x90\x9b\xf27\x17\x98\xe2s\xe7ɪ\x9c>\xdcT7\xfa*i\xd4\xe7\xed\xcd\xc2ܤk\xe8\xab\xc4\xdcB\xd5\xf6\xec\xb5\ue52eZp\xf7\xe9'\xb5\x04D!\x01\x9f1IҌ\x81\x8ec\x1f\xddR27\x97$\xf3m;\xeav\xd8\xf2q\xea|r\xc6\xfe#\xabx\xa5Z\\E\x9b\x05\x8a\x94\xb7ic\x0e,\xa1\xf8lrq\xae\xa5%\x97\xd7m\xe1\xf9\nE\x06CYH\xc0|L\x924c\xa0\xd3Y\xe4p\xba\x9ce\xf6\x12\xa3}\x86\x9e,\xfe\xa1k\xa8\xef\x9ar\xe3W\xa5\xbf\xb2\xf1ɤ\xef}\x95ߏ\x1f\xcf\t\xfd\xb0\x1c\xbb)\x0f?\xe4m\x12\xc3EI\xf7\xa4\xad\xea!R\xfaJ\xb1[a\x1e\xcaژ\x8d\x88Z\x94\x99\xc9cڔop\x8e)8Uǟ\xc0\x8f'x܅\xe6d\xe0\x9f\x8b\xbe,\x95Z\x9c-\x02\xca; 2\aV \x95\x979p~2\xe9i\xb7yHz\b\v\t\x98\x8eI\x92f\ftP\x87\xc3n\xb7\x1fv\x98pg\xbf,\x9b\xa2\x83\x96\xe89\xb1\x8a4ڼ\xb4\x9eo1\xa9\x9b\x94\xb1'\x13\xbbPW\xd2I\xf1\x95(\xe9:\xfe\x03\xf7\xde\xccnX-{\xf9\xbdT-\xca\xccd\xb5\x90\xd7tB\xbaI8\x1d\xb4h#\xba&hn\x87R--\x9c\x1b\x85\xe3\x0fs`\x05Ry\xe5\x03\xf7%Ѳ\xb6zJz\xc8\n\t\x98\x8fI\x92f\ft0\xae\x8e^Tl\x82'VV\xb6\xe7\xb6s\u0094\xf1\xc1\\\xd2\xd1\t\xe4*c\xbfM>\x82\x8e\xccu\xaft\x8b\x92.\xe7{\xdc\xef3\xbba\xb5|Q\xf8%U\x8b23\xe5\xca\x13U˃\xf4\x1d\x94\x9b\x8d{\xc9F\x84\xa9\x859\xb0\x02\xa9\xbc\xf2\x81\xc5^\xfa\x03OIӸ\x81\x16\x92\xe6\xe2[!\x01?b\x92\xa4\x19\x03\x9d&\"\xe6+\xc5f\xf8簒nY'\x8cg禒Yi\x1fy\xeb\x840\xa7,ܫ\x8a}+\xf1\xb3ķ\xdc/DIw\xa5\xe4\x90\xder\xdb6\xc5n\x8cZ\x14\x99\xe5\xe4 \xf4%\xdd \xab\xa5\x8e\xbe\xae&#\xfe\xec\xff\xfaј1?\xfa\xb9Oja\x0e\x8c\xe4O\xc1\x94\x979\xf0ڹX\xab}\xf9\xa2\xa4ݱ\x83-d\x1a\xae\xa8\x8f\x12}*$\xe0GL\x924c\xa0\xd3l\xafm\u007f\xb3\xd8\xe1w\xb7\x8doߢk\xba\x9f\x88/gq3\xe8\xf3\\>\xa5\xb4\xee\xc8CId\xa9\xb7\xf0μW\x8el\u00adX\x19ۗ\xba*\x95\x8e\xbb{\xce46&nll$\x8bf'\x13\x17U\xd4\t+O\xd2n\xdf\xe4\xe5|\x86_\u007f\x96\x93\xf7\r\xb3\x15\x11y\x94\xe3C|\x8a>k\xb4m<\xd3\xf7\xceF[#\x8e\xcb\xe3\v_-䉾\xde\xff?\xdf).\x18\xf3\u007f\xff\xb3\xa2\x15\x19\xc3\x1cX\xfa\x14\x8a\xf2\xca\a\xfe,%\xad\xe2\x95\xdcDe\xec`\vٚ\x94Z\xba#\x99\xb7\xed\xf7\xa5\x90\x80\xff0KҌ\x81\xce\xf1\x92\"\xc7q\xa3\xf0\xa1\xe7}fڈ)\x8a\xb2\xd3\xe7_U\x14.JJɥ'oЉ\x9c\xb9\xc99u\x1e\xb1\xe56\xe1\x94\xd1;\xe2ԓJ䣵\xa9\xf7d\x1fQ\xecV\xca\xf3dai#O/\x9fvo\xc5\xf4lKN\xcc9G/\x9f\xe6m\x1f\x90\xb3\xdb[\xf0/EyVRV9\xf9\xadp\xfdpV\u007f\u007f\xe4\x8f~N\xb6\x1a\xc3\x1c\xd8\xfd)\x94\xe5\x95\x0f\xfcŦ\xb4ćΉ\x92\x16c\a[Ht>79\xadp\xbfͷB\x02~\xc34I\x03\xfatF\xce\xc1\x92\xbe\xadyxF.\xea\xe51 \xb8\x00I\x8f@\xa8\xa4#nk\x02I\x03\x03\a$\xad\x84\x1f\t\xfc\xe7\xffƒ\xfe\xe1\xff\xfa\xb7\u007f\xfb\xf9p\x88\x1a$\x1d܀\xa4\x95\x18\xa9\xcd/PIG|\xe7\x87\xdf\xfdN\xc3.\xc7\xe5n4\xa4\x9c\xaf\xe3\x9f~\xcb\xeb\xff\x8f\x01\x01\rHz\x04B\a\xde\x13;\xfa\xbbC0\xa1\x87\xdb;\x87R\xd59\xf87\xc3v\xde(\n\bX@\xd2#\x8f\xde+D\xd2w\xe3*\xfe\xde,W\xf3ؐ\x90\xef\xd9;{\x8dv\x02\x00\x01\x90\xf4\x88\xa3%.f,\x96\xf4f\\\xc5ӛ\xfa\xfbӗ\x1c\x8a\v\x99\xde\x01\x9a\x06|\x03$=\xd2pE|\xef\xf6\x1b\xb0\xa4kq\x15/\xfb\a\x96\xb6\xb3\xbf\u007fF\xf80\x9d\xd0\x02\x82\x0f\x90\xf4H\xa3!\xe4p\u007f8\x964\xc2U|\f\xff\x1d\xc6\u007fs\xc2\x1aF\xc8}\x9c\x80\x11\x0fHz\x84ѻ!\xe4\x1f\xfdd.M\xf8\xa7\xf8\a\x92\x06|\x06$=\xc2\xe8\xce\xfc^\u007f\xff\xc49\xfd\xbd\xae\u007f\xf6w\xe3?\x17\xfe\x03I\x03\xbe\x03\x92\x1ea\xb8\xe6\x85\xf5\xf7\xc7d\xfe\xf3\x1f\xfd\xc7\xff\xf1\xcf\xfe\x86\xde\xfe\xfe&\x9040\x00@\xd2#\f\u05ecHZ\xbb\x9b\x1fs\xf6oXw\xa5\u007f\xdd:\x04\x92\x06\x06\x00Hz\x84\xe1\x9a\x1e\xfdO\x0f@ҀϘ#\xe9\xeeb\xbb@1y\xe5,+\xdag\xc2=MF&\xaei\x93\xff\xe1\xc1,\x904\xe0+\xe6H\x94>:\xac\x00\x00\f\bIDAT\xdae?\xee\xc4\x1c\xb37\xe0\x17\xed\x055\xcd5\x05\xaa\x9bS\x8fZ\\\xd3&zn\x8c\x8e\x02I\x03>b\x8e\xa4\xd1iz\xefnz\v\xc1^\xfax\xa8\x18.\x8f\xa2\xb8\x96\x8d\xa9\xb9\xa2bWȽ\xa7AҀo\x98$i\x8a\x83ܧ\b5\x15Py\x17\x8c\x1c\xefJS\xe9m\n\r\xb9Ổ\xb1\x84\x1b0!?(iq\xa1\x90\x00\xc5\xe8\x13\x03C\x8b\x89\x92n\x12n\nZ)xb9̸\x9f\xe0H\xc4uzŬ\xe9230\x99\x8e\x86˽(\xe4j@\x02\x92\xf63&J\xba\xa4\x92>\xed\x12n\xe0}Ȅ[\xf3\x8fL\\Ζ&\x05\xcd-N\xf2\x9fX i\xc0\x17̓t\x8b]X\x11+\xae\xa5O\xb5\xc5ނG\x17\xdd.%\xddt\x9d\x01$\r\xf8\x82y\x92\xae\x14M\xb0D\xe7\xca*\u007f\xdb\xdc\x05\x1c i\xc0\x17̓t\x91h(M\x1d7\x10*\x83\xb9\xb4\x01D\xd2O\x8eŏ\xac\xb6C<\x12\xde\xf0)HB/Z7\x17\xcd7@\xd2~\xc64Iw\xd8E_\x88&;q\xbc\xbbb\x87\x15o\x03\x88`\xc6\xfd\xf9\xaawI\u007f~\xdfMcn\xf8\xe9\xee\xab\xdahi.\xe4\x16\xe1\xf9\x16\x8fl}\x94t\x88F\x8a}\xdb\xe8s\x01C\x8bi\x92n\xb1_\x16\x12\xbd\xd4;\xa7\n\xceK\x1b\x11\xa2%\x1a\xb5\xa4\u007f\xf1\xb3\xd7?\u007f\xfb\xc9[\xd5a^\b\xb9\x89\xfe\x00\xec\xbe\xe9\xfa%\xad\tH\xdaϘ&\xe9&\xbb\xfb>\x1d\xed\x05U-Up\xf5\x98!d\xc8-\x80\x85\xf2\xcc\u007f\x8c\x19w\x9f\xa8\xa7G\xc7\xfd\xeb\xb8߈\xc2\x1a\xf37\xb7\x94\xa4\x88\an\f\x19{\x01'.\x8c}\x9b\xeey\xf3\x98\x1b\x1fe\xdf\u007f\xfc\xc7$\xfcǏ3\xd9\nG\ty\xfc\xe61c\u007fA2\xfc\r9\xc2Uա^\xff\xe9\xd817?\xee\x8e\xc5G!\x85a\xf6\xb9Q\b\x05I\xfb\x19\xd3$\xdd\"/\x879\xf7\x15\x94\xc15ކH\xbd4~x\xf1\xdf_\xbc\xf0\xfa\x8f\xef\xa3\xe9\xdf߸\xfb\xc2\xee\x1bE\x9d\x8d{QT\xb4\x1cq\xeb\xdbW\u007f\xf28\xde\xf2\xf8Oh\xf4w\x9f\xb9\xf0\xfa/\x149܄G\xf3\u007f\xfe\xbe:[\xda\u007f_x\xfbg?\xc3B\xbfq\xf7\xe7\xbbo|Fu\xa8\x9b\x1f\xf8\xdb\xe7/\xfe\xc4\x1d\x8b\x8fB%\xcd\xec#\x84\x82\xa4\xfd\x8ci\x92\x06\x06\n+\xe9[ɜ\xfa\xedqB\x1ak\xed\xea3\xa2Ξ\x19\xfb\xd3\a\xa8\xaa\xe5\b\x9c\xa0#\xf1[\x9f$ѷ<)\x0429<\x8e\x15\xf8\xb3'\xd5\xd9\n{^\xfd\u007fc\xf1>\xf4\b\xb7\xa8\x0eu\xc3\xdb³\x1c\x1b\xc2\xec#\x85\x82\xa4\xfd\fH:``%=\xd6=\x02'i2\xcc\xfd\x9b\xa8\xb3\xab\u007f{\xf4\xae\x9bIW-G|~\xf5\xea\xe7c\u07fe\xfa\xf6\xd8\xcfI\xb4{d\xce\xe6\xf0\xfd\xd7_\xff\xbeG\xb6\xe2\x03y\xbc\x81\x1e\xe1\x06ա\xfe{\xec]\x8f\xbe-\x95\xe9sQ\xd2\xca}@\xd2\xfe\a$\x1d0\xb0\x92\x1e#\xf6\x90\n\xf1H<\xfe}e\xc4իw\xddw\xf5\xbe\xbb\xe4\x1f\x80\xab\xca\xf7\x9f\xbc\xeb\xae'=\xb2Ւ\xb4\xf2P\u007f~\xe0\xa77<\xc0Ƃ\xa4G\x02 送\x95\xf4-\xbf\x91\xb5\xa7\x18\rS\x88\xfa\xd8\b\xfa\xb7\v\xbb\u007fLӊ5\xab[\x9f|\xfb\xf3\xd7\u007f\xf6\ve\x04\xe6\xa6\an\x12\xf7\xbc\xf1\xf7tyL\xf5\xbe*\xdbq\xbfw\x1f\x8c<\nK]\xea\xe5\xb1\x1f\xff\xfe\u0085\xdf\xdc\xccƲ\x92~f\x1c\x0e\x1d\a\x92\xf6? 送\x95\xf4\xd5ݷ\x8e\x19s\xebn!\xfd\xe8\x8d\xf2\x99\xa5\xdd?\xbda̸\xff\xbe\xa0\x8a\xb8z\xf5\xbe\u007fu\x9f\xf2z\xe6?\x84\x93X\xca\xf7U\xd9>3.$D\x96\xe7\xd5ߌ\v\x11Ob1\x87\xfa\xfd\xadc\xc6\xfe\xe4u6\x96\x954=\x89\xf5\xc0\x18\x90\xb4\xdf\x01I\a\f\x92\xf6\x02\a<\xde\aI\xfb\x1b\x90t\xc0\x10`\x92\xfeş/\xbc\xf8\xef\x0f\x80\xa4\xfd\x0eH:`\b0I?\xfa\xfd17aE\x83\xa4\xfd\rH:`\b0I\xbb\x01I\xfb\x19\x90t\xc0\x00\x92\x06|\x01$\x1d0\x84\x04(F\x9f\v\x18Z@\xd2\x00\x10T\x80\xa4W\xaf\xd6J\x02@\x80b\x8e\xa4\x95\x06:\bU\x99wK\x93\xbfZ\x9e\xd0H\xbayقI\xc0\x89\xf7~\x19\x1f\xbb\xf0\xe8\xfc7pr\xeb\xcc;\xa6\xde1s;B\xf5\x16\xcbB\x84\x0e\xe0\x88\xa3\xea\xfd\x86\x89\xa3\xf1\u007f\x91\xd2mS-\xb3\xbd\x84z\xe7a\x8b\xe5\x80Q̀\x18\xba\x8aZ\x8dìmFQ\x80.\xe6HZa\xa0\x83\x90\xd3^k\xb0\xc3\xf0\xb1\xd2zI#\xe9\xc6\xf5F}\xec\xf2\xf7\x10:;u遗\x96S\x1d\x1c\xb5\xfcr\xcf\xc1\x17\x96Z\xea\x91\xeb\xa8Ŋ\x1f\x0fX\x8e\xba\xd0\x10s\xf4\xac\xe6\xe6\x83VF\x88\xa7V[5\x83|\xe1R\xfd\xd4\xedF1\x03b\xe8*\xea\xe3\xfa\xfa\xff\xb1\xbca\x14\x05\xe8b\x8e\xa4Y\x03\x1d\xac\xe8\x12\xf3$\xddfY\xaf\x91d\x89']\xf7\xe2\xc5$\xb9\x9a\xb4\xd4\xf5\xb1\xb4\xec\xb18\xd8eY\xb9\x9a\xec\xe7CC\x1d \xf3\x97\x1bE`\xb6\x0f^\xd2\bY\x87V\xd2h(+\xea\x14H\xfa:0I\xd2\x14\xc1@\aU٫\nL\x93\xf4j\xb9g^\xed\xd9I\x13hKM\xd8J\x92\uf456\xbax\x01ݼ`1i\xa9Gq\xb3\xf5\xb9\xa5\x0e\x80\x80\x95\xf4\x90T\x14H\xfaz0QҢ\x81\x0er\xb9ܷ\xe7\xf7?mS\xd7k$\x15Ж\xba<\xfe=\x92>\x88\xdb\xe4BAm\xcb\x17\x92\x96\xda6\xff\x80\xba\xa5\x9e\x9dj\xb1lm[\x99`\xbd\x9f\xdc \xf1\xa5\x85֙\xeb\xe9\xfb\xae'f\xc7.|#\xe1 z\xc4byI\x9e\t\xcb\x01\xf5\x8b\x13\xa6\xc6\xff\x12\xcfG\xffb\x11\x98\x8f\x14|m\xb5\x90=)\x97V\xc6\xc7.\xf7\x1cx\xb7-\x8f\xc7Y\xe0_\xa6N\x9cHXJF\xef\x8fX\xa6\xeeY?Ӻ\xf8cU\xa8u\xfd\xea\xf8;\x96\xb6Ѵ\\\x06\x19\xcd\x1c\x0e\xe2\x12\xfc\x16m\xb7h\xce\xc4\aZQdn\xbd]\xccL>\x1aA\x94\xb4^E!\xf4B\xfc\x1e\x04\xe8`\xa2\xa4E\x03\x1d\x82i\x92^=\xf5c\x8d\xa4\x02\xdaR?N\xb0ܿ\xfd\x14\x1dT\xcc\xff5\xdd\xfc\xeb\xf9\xb4\xa5\xee\xfc\xa5\xba\xa5\xba\x0e\xbc\x94036a\xfdJ\xcb\xc7d\x04\xba\xfe\xe0\xce\xf8\xf9X\xdc_'\xc4\xef<\xf8\xb0ŲG\x9cNJ3a9\xe0\xace偣{\xe2-\xbdd^:sa}}}\x9b\xaa$g\xeb\xebž\xb5-v\xe6\v\u007fYlQK\xfa\xb5\xd8\xf9\xbf;\xbaݲ\x93ho\xf5k\a\x96ZN!\xf4ח\xa6Z\xe2\xb7\xef\x8cUw\xfbV\xcb\xfc\x97^\x9ao%\x02\x94\xcb\xc0\xa0\x99\x83덄\x87/\xa1K[c\xeb5\xfa\xdb\x01WT}\xecVwf\xf2\xd1\b\xa2\xa4u*\n\xb3\xdcr?\x02t0O\xd2n\x03\x1d\x82Y\x92\xfex\xea\xc3\x1aI%\xb4\xa5\xa2\xaf\x9f]0\xd5\x12K\xfa\xa6\xd9+\xe9敳iK\xbdd\xbd\xe49\x9e\x9coY܉\xfb9\xa2\x8b?\"\xd2Bqߺ2\x96\f\xeb\xd7[H\xf7B\x85I\x87\xcdL\xc0\x9ex\xd2\\\xff'V\xc8Ag\xe0-Jz\xe1L|\xc8\xde\xf9*I\xbb\x12\xeeǛ\xbb\x0f|M~WH\x99\x84\\\xac\xb1\xf8\xb7ee\xbc:\xa7\xd98\xc25s\x81\xa2\flf\xda9l'C\x87\x95\x9a'\xfb\x06^Q\xabI\xee\xbf&\x99\xb1Gc\x06ޚ\x15\x85i{\xb6\r\x01:\x98'i\xb7\x81\x0e\xc1,I?2\xb5M#\xa9$\xde}f\xcbu\xf4~\xcbA\xa9\xf3Y.t>\xe8\x97;5$m\x15;\xfc\xe5\tݽ\x98\x04\xdcj\xadt\x92\xf9W\x95\xa4\x99\x80\x8f\xe3\x13\x1e\xd9s\x16u\v9x\x95\xf4\xd74\x17\xb4U%\xe9\x83\x16y\x9d\xfc\xef{\xeeO\x88\x15\x86\xeeV\xa2\x19\x8fy\xb7\xf5\xb7\xe4q\x8f\xe5k\xb6\f,\xda9|ly\x0f\xb9b5\xcfE\r\xbc\xa2^\xb3\xba\x90\xcbZO\x92\xcc\xd14%\xadSH\xc0\x13\xf3$\xed6\xd0!\x98$\xe9K\xd6\xd5\x1aI\x15\xb4\xa5\x9e\x12V\xce\x16.\x15\xfe0K\x85)\":0_C\xd2\xeeY\xf0|qV\xbc\x1cK\x81\xce>]*I\xcb\x01X\xa8{\x96϶\xc4\xffN\xd8ѫ\xa4\xcfZ\xa8\f\xd42\xdd)\x17\xe4T|\xc2\x13\a\xea\x17ϗ\xf6\xf1\x944ͩ\x1e\xff\n\xb0e\x90\xd1\xcb\xe1\xfe'\xd0\xd1\xd8n\xa4\xc1\xc0+\xaa7\xfe\x00z\x99\x0eNأiJZ\xbb\x90\x80\x06\xa6IZ2\xd0!\x98$\xe9\xf5\xb8\xa5y&%z\xe9&\xdaR\xe3\x1f\xa1[\xb6\xceDHlw\xf3\x17\v-\xd5e=\xea)iw\xc3[\x99p\x96\xf2w\xd4+H\xe8=YҴ\x8f\x95\x03\xd0Yr\x9c\xaf_\xb2\xee\x91rx\xc1sr/\xe4\xf2w\xa1\x97V/\x8f\x1d\x95{\xe9\xd9\vH\x99\x96{\x934]\f|\xc1\xd2ɖ\x81A/\x87\xbf\xc4w{\\d7\xe8\x8aZ\xbf\x1c-\xa7\xe5`\x8f\xa6\x96\xb4\xba\xa2\x00\xef\x98&i\xc9@\x87`\x8e\xa4\x8d:\xe9=\xa43\xfc;YmB\xf1\t_\x93-Di\xe2\xe9V\xb2\x03i\xa9h\xf5\xaf\xf5%}T蛷>K\x96\x82Ik\\)H\x1a7\xfe\xde\x05Ve\xc0v\xe1Ҫ\x85tJ\xbf\x10wm\x974\x96\x95Ź\xf4\x02R\x9c6\xabJ\xa6\xae\xf8\x85\xa4\xfb\\\x8fE\x92@J\xd0;ߛ\xa4\x13ȼ{\xf6BE\x19\x18\xf4r\xe8\x8e\xff\xcb\x1d\xeaq\xf7\xa0+\xea\x94\xf5\x92\x95.\x89\xb1Gc%\xadUQ\x98\xb6\xedm\b\xd0\xc14I\xcb\x06:.\xa7\xb3\xa8\xcai\x82\xdd\xc6\x13r\xcf\xfc\x84F'M.\u007f:\xf0\xc7\x05\U00064bcc\xb7\xc4o=z`1\xb9P\xf1\xa8\xe5\xfe\x97\xeb_^ly\x99\\\x14u\xc0\x85\xea\xadʖ\xda{\x8a\xaeW\v\xf9=a\xf9\xf5\x81\x97W\x93E\x9dK\xf1\t{\x0e,\xb7RI/\x8c\xffݳ\v,S\xff\xf8\x1e\x1b\xb0\xdd\x12\xbb\xf5\xe0\x81Ֆ\xd7\xc8~ۭ;_^lU\xf6\xd2\xddo\xd4\xd7[W\xd7\xd7w\xe2\xceޚ\xb0}\xeb\x1dB\x0e\fG\xad\xb3\xf7\x1c\\oy\x81d\xb6|ϳ\xf3\xf10\xfeԥ\xfa\xa9\xabO\xa1\xb3\xab\xa7\xd6+Ϻ[-\xf7\x9f:\xba0\xb6\r\xb1e`\xd0\xcdቄX\xb5}\xd9\xe0*\x8a\x10\xbfXX\xb6\x93\x8f&\\=\xb6\xb3\xbe\x9e\xe4\xa6YQ\x98\xa5\xe4\x02S@\x1b\xd3$-\x1b\xe8\x1c\x13.\xf7\xbe\xe2-z8\xb8d]\xa9\x91d90\xdf\x1a\xbb\x94\xaaf\xc1\v[g[\xe3\x85Ӹ[g\xc6Zbɥ˯\xd1S\xaa\xbd\v\xe2\x15M\xfc\xac0\xe9\x13&\x92\xe8\xe8\xe2\xf8\u0605\aI\xea\xef\xab\x13\xac\x8b\xcfRI\xb7-\xb4\xc6.\xfe\xad\xc5\xf20\x1b\xf0\xd2\xc2\xed\tS\xe3\x17\xbeFws\xad\xbfú\xf0\x14R f,\xe4\xb0\xf4\x8e\x84'\xfe8բZ\xa5o[\x9e\x10\xbb\x80tg\xbd;gZ㗿0s\xea\u0087\xf1\x1eS\xdf#\xa7\xb4\x95\xb1\xb3\xb7/\x8f\x8d_)\xc8\\.\xa4\x8cn\x0em\x16\xcf\x01͠*\x8a\xb0Ӻ\x93>\xcbG\xa3\xd7x\xbbg͚\x15EwS/\xe0\x03\x12\xa6I\xda|~k\xf9\xabFrx\x11\x96\xc7\x02\x1a\x97\xf55\xa3\x90\xe1g\xe9b\xa3\x88\xd1\xcb(\x96\xb4\x19\xffU\x19\x04\x92>\xe0\xd9\xd7\xfa\x9dg-\xaa1\x05 3\x8a%m\x06\x81.\xe9\xed\xaf\xa1\xc5[\x8d\x82\x86\x9d\x8f\xe3w\x1a\x85\x8cb@\xd2\xfe\xa4\xed\xa8e\xbdj\x86\x1cP\xb8,\xf3\x1f\x89\xff\xda(\n0\x15\x90\xb4?YHV\x9aڌ\xa2F0[c\x17\xb7\x19\xc5\x00\xe6\x02\x92\x06\x80\xa0\x02$\r\x00A\x05H\x1a\x00\x82\n\x904\x00\x04\x15 i\x00\b*\xfe?\xb6^u\v\xa5[\x1f\x81\x00\x00\x00\x00IEND\xaeB`\x82", + + "analysis/ident-func.png": "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x03\xd2\x00\x00\x00\xda\b\x03\x00\x00\x00}\xf6\x8a\x1c\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x00\x01\x00\x01\x04\x00\x02\x05\x01\n\x03\x01\x05\b\x03\t\f\b\t\x0f\x11\x0e\x10\f\x10\x12\x0f\x13\x15\x12\x15\x16\x14\x0f\x17&\x19\x18\x11\x1a\x1a\x13\x1a\x1c\x19\x1c\x1c\x16\x13\x1e7 \x1f\x19!# $$\x1d#$\"$%#'(&)(\"+)\x1e\x14+N++$*,)/-\"-.,.2402/63(241:7+685;9-:;9?<0=?=C@4AB@CEBGE8KH|u]tvsB\x8c@@\x8dG\\z\xbby{x]~\xb7e|\xb8\x84|dK\x90J_\x80\xba}\u007f|O\x93Nb\x83\xbd\x8b\x81cN\x95Ud\x85\xbf\x81\x83\x80W\x95Vl\x87\xbc\x8f\x86hZ\x98Yo\x89\xbe\\\x9a[\x87\x89\x86\x93\x89k^\x9d]\\\x9dds\x8dË\x8d\x8a\x96\x8doz\x8e\xbfe\x9ef\x8d\x8f\x8c|\x90\xc1\x9b\x91s\x90\x92\x8fi\xa2i~\x93\xc4x\x95Ā\x94œ\x94\x91{\x98\xc7s\xa4l\xa0\x96xq\xa5s\x97\x99\x96\x83\x9bţ\x99{\x99\x9b\x98u\xaaw\xa7\x9d~\x87\x9fɜ\x9e\x9b\u007f\xabz\x89\xa1˫\xa0\x82\x9f\xa1\x9e\x8f\xa2ǡ\xa3\xa0\xa2\xa4\xa1\x92\xa5ʂ\xb1\x85\xa5\xa7\xa4\x94\xa8ͳ\xa7\x82\x8b\xb3\x89\xa7\xa9\xa6\x96\xaa϶\xa9\x84\x8e\xb6\x8c\x9d\xac̪\xac\xa9\x8d\xb8\x93\xba\xad\x88\x9f\xafέ\xaf\xac\xa1\xb1ѯ\xb1\xae\x97\xbb\x97\xc0\xb3\x8e\xa5\xb4Ԛ\xbe\x9a\xb3\xb5\xb2\xab\xb7ѵ\xb7\xb4\xa3\xbf\x9d\xa2\xc0\xa4Ÿ\x93\xb7\xb9\xb6\xae\xbaԹ\xbb\xb8\xb0\xbc֦Ũ\xbb\xbd\xba\xb2\xbdض\xbeӽ\xbf\xbc\xa8ǫ\xafƫ\xcd\xc0\x9a\xb9\xc0տ\xc1\xbe\xba\xc2ײɮ\xc2\xc4\xc1\xbc\xc4ٲ̷\xd2Š\xc4\xc6\xc3\xd5ƚ\xc0\xc8ݻ\xca\xde\xc7\xc9ƻκ\xd8ɝ\xc0\xcc\xda\xc7\xcb\xdb\xca\xccɿҾ\xc9\xcd\xdd\xd7ϡ\xcd\xcf\xcc\xc4\xd0\xde\xdfϣ\xc8\xd3\xc1\xcc\xd0\xe0\xcf\xd1\xce\xe1Ҧ\xc9\xd7\xcb\xd2\xd4\xd1\xd2\xd3\xdd\xdf֨\xcd\xd6\xde\xcc\xda\xce\xe6֪\xd6\xd8\xd5\xd0\xd9\xe1\xd8\xd9\xe3\xd5\xdc\xd1\xd3\xdc\xe4\xda\xdc\xd9\xe6ݯ\xecܰ\xd5\xdf\xda\xdc\xdc\xe7\xdc\xde\xdb\xda\xdf\xe2\xd7\xe1\xdc\xe0\xde\xe2\xde\xe0\xdd\xf0\xe0\xb3\xdf\xe1\xde\xdd\xe3\xe5\xe1\xe3\xdf\xe3\xe5\xe2\xe1\xe6\xe9\xe8\xe5\xea\xe5\xe7\xe4\xe4\xe9\xeb\xe7\xe9\xe6\xf1\xf3\xf0\xfa\xfc\xf9\xfe\xff\xfcd\x82\x05\xe8\x00\x00 \x00IDATx^\xed\x9d\x0fT\x14\xd7\xdd\xf7\x1fZ\xf3\xc6\xe6M\xda\xd7Q\xf6\xe9S\xe2K\xa9%F\xdbd\x95x\xdeJ\xa0fN\\@\x13\x90*\x82Ę*M\xa2\xb4Q⟜h0\xc4\x1c\xff\xb4.\xc1@\f\th\"I\xa4\xc1\x83A\xa4V\xadx\fA\x03\x96'\xc1D\x92\x87\xa4\xa6nj$QL#\t\x1c\x16\x02\xb7\xf5\xbc\xf7ޙ\x9d\xb93;\xb3\xb3\xc0\xee\x0e\f\xbf\xcf\xd1ݻw\u007f\xf7\xcfܹ\u07fd\u007ff\x98\xdf\u007f\\\x1b<\b\x00\x80\xe1\xc6\u007f\x18\xe9\xd6\aFy\x03\x00\x10r@\xd2\x00`)@\xd2\x00`)@\xd2\x00`)@\xd2\x00\x10`\xfa\x8c\f\x82\nH\x1a\x00\x02\x89+c\x127\xc7\xc8(\x98X^\xd2e3یL̤}f\x99\x91\xc9Hd\x14\xb7\xfaԩ\xce\xcaO\x8c\x8c\x82\x89\x89\x92n\xdeWTrB\f79\xcb}\xda~\xb3y^bN\xbfO\x13m\x9e\xe4\xd6\x19\x99\x04\x8as9I\xa9\xb9\xa7R\xbfR\xc7\u007f\xee\xe0\xefӲ\x17xr\xc2\x06\xaf\xb8\"\x0e\x135\xfb\xa4\x869Ck87\xd5_[?!\x99\xadC\xeb\xf0k\x81\x0f+\xa1`_\x04\xbeիxLr\xce\xfbFv~\xa2\xd5ꁡ\x81\xdbgd\x12dL\x93\xb4\xbb\xd2y\xb4\xf5\xa4\xb3\x85~h/8\\\xec\xd3\xfa\x91Ԋ\xbc\xa4\x0e\x9f&\x9al\x9dPdd\x12(\xea\x93~Sqp)\xcf\u007f\xa4\xfe\xa2\xff\x9d\xcd\x0e\xad\x04\"\xe5\xe1[\xd5QW\x8b\xb8\r\xd5E3\xb9j-{\x99\xa3\x196\xbfm}S-\xfe\"\x90\xcc\xdaPۓ\\\xd1U_\xe6\xb4`\x1f\x04\xa1ջ\xab\xf8\x97NUe\xddu\xca\xc8\xd0\x17\xa7\xceJA\x8dV\x0f\f\xb5\\\x8d\x91I\x901Mҕ\x05.\x84ڜ\xcd\xf4Cy\xa5˧\xa4;\xf8\n\xd4\xdf\xed\xcbB\x9bV\xdbr\xdf\x06mq\x81\x9a v$\xaf\xe9\xc5=/\xd3[\xd2\b\x95\xfa\x924Zis\xa9\xa3\x9a\xe8O\xfd\xcc)\x1a\xd6,\xebl\xfe\xdb\xfadF\x8a\x18\x102\xab\xe6\x9a|Y\x8b\x05\xeb\x12\x94V?\xc7\xd7\xe3_\xc7\xecL#;_d\xad\x97\xc3\x1a\xad\x1e\x10j\xb9\xa3F&A\xc6,I\xbb\x9c\r\xe4M\x18\f\x9a\x8aܾ%}\x81?\xee\xebk]2&u\xfa6h2\xea\xbc~S\x98t\x99\xbc\xed\xe5?\xf5\xfeη\xa4;'e\xa8\xa3\x04em\xe5\fj\xcfH\xda\xd0\xd6'\xd3\x03*頴:\x954\xaa\xe0\a\xf1\xc3.\xb1\x94\x91\xb4F\xab\a\x84\xd1+\xe9\xa3\x05=R\xf8jA\v\xf2!\xe9\xdey<%\x1f\xa1m<\u007fP\\\x9bn\xe3\x1d\x15\xf9\x99I9_P\x9b\v\xeb\xe79RŰ\x8c{\xa24\\\xb4\xa4D\x85O\x9a\xad\xfca\xde:\xa5\xbc\x99k.\x9f\xe2\xc4\xe1ƜtǼ\x9ct\xb2\\\xef\xaf\xcaJ\xca\xcc\xc7]\xe7C\a\xcf0\x97\x9e\x98\xf3\xedA\\~)*\xe5I\xf9\x9a\x06(s\vͳc/\x1e\xab\xfb+\xb2\x92\x96VХ\xff\x17\xb9i\xc9녉\xb7\x94\f\xa9\xea\xbb2\u008d\x94\bʚ\x1fM?\x14ό\x98\xb2\x8c\x88\xe4j\xca$[\xf4\x1c\xfaS\x88\\\xf3'E\xa6dȒVۢ\xce\xe5S'\xc6\x1d\x8dއ\x96p\x13\x8a\xf1\xc0).\u007fe\x83\x9aY\xd1\xe1Q\xb3q\xb2rN`:RIڠ`٠!\x9c\xe3V\xb6̟\x1c1\x9b\x9cTO\xab+c%\xe4Vg\x9a\x8f\x9c\xcd-i\xc9k.P\x13\xad\xb3)H:7\x8d\x84\x99\x96\xec.\xbc/)\xfb\x9d\xb4z\xb6k(\f\xa4\x13{\\\xe8E|\x96\x98\xa1w\xabk\x1e\x90\xf2(\x9c\xd3#\xa6\x93\xee\xa2sl\x88\xb4\xddh\x95tYy\xf3ng\xf1aڪ\xe5\x95ȗ\xa4\xd1G\x8d\a\xf9\xd2\xc6F<\n~\xd1\xe8(\x15צ\xe7\x0e:\xf8\xd4\xd2W\x92\xe9\x0f賓\xacW\xeaK\xf9\xbd\xaa\x84'\xa5\x15f\xf5\xc4\xe9OV\xae\xe36)\xbev\xcd\xe7\xa6r\xb7s)X\xe8\xefߕw\xa4\xbeb\x1e\xff-\x8e\xde\xc2\xe7\xd7W\xa4.\xedG\xbd\a\x0f\xa6gޓ\x96\x9f{\xd7\xe7ݍ\xc9/|\x85\xbez!\xb9\xb1[۠\x97-<ϱ\xb3~\xa7#\x0f\x87.$gV\x1d\xcfᩤ\xa5d\xea\xfa\x1e\xf6\xea\x05M\\\xb9\xbby9G\xb7p2&,)\xdf\x1a5\xbd\x8fh/\xa3\xbad΄Z\x1c\xd92qJQ\xd9,Φk\xdb>9\xea\xc9\xf2%\x1c\xe7D\xae\x9a\xf0u\xd2\xf2W6\xa8\xe5\xe6\xef\xaetFq=\xa8\xf3p͔\xb8\x9a\x9a\x9af13\xb7{\x1f\x95\xb4Q\xc1\xb2\x81\xbb\xa48z\xca\xc4\xe8e\xf39\xb2\xd5\xebiue\xac\x84\xdc\xeaL\U000d1cd9^Z\x9a\x9et\x0e\xe9\x9cM,\xe9\xeeO\v\xf1\xef*b[\xb2#=yo=Vs\x05\xdb5X\x03\xf9\xc4v76ff766zfQޭ\xaey@\x8a\xa3Ȱ\xad,_i\x9b\xaf{l=m\xd53\"\x872]\n\x04fI\xba\xc4Y\xdc\xe0j..\xc1\x9an.\xea\xf4-iv\xe2\xed \xe7T\x98\xc8:\x92\xf1\xefx^*\x0e\xf5\xa6\xe7\u0c71\xf7\xa0z\xff\xac\x9ck\x15\x02\xee\xe8\xd9nr\x1e\xdaU\x06\xfb¹p\xbaAY\x91J\xc4\\\x91\x8c;\xc1q\xbe\n\aϒ\xe1\x18O\xd5\xf8G\xba\x85U\xfc\x96\\\xfc\x92K\x86bM\x83\xcf\xf9\xbfH\xb9\xd6\xd3\x01\x85\xbefg\xe2\xb4\xfdK\x1d\xcad\xaa\xfa\xba\xb8\xddHI\x13\x1d6\xe7\x93`9G\xb6\x9aj\xb9\x17I\xfdIo\xb9\x9d\\\xf4\x9c9\x19\a\xfb\xa6\xdbtm\xe7G\x92\x19\xc92\x8e\f)6\xb2\xfdL\xe7ʌ\x813\x8a\x8c/[#iy\xcc\xc4[\xa0ɏ\x82\x19\x03\x9c\x037몸\x8e\x92Z]\x11\xcb \xb5:۾\x8e\xf4n\xa2\xd0,\xbd\xb3y\x8e\x0e\xb1y\xe4\a\x91i\xc9<\xd2\aP>\x964\xdb5\x18\x03\xe6\xc4*'\xde\x1a\xad\xaew@Rp\x1f\x9d\xc3\b\xaf\x9a\xc76\a7\x9d\xefK7!\xc0,I\x97\x17\x90\xc6\xe8,\xaaE\x9d\x05\xcd}}}\x9f\x14\xfb\xba\xe5F[\xd2y\x9e`\xbd֞\x14\xa6\xccӹʹ\x06\x8d\xafۗ٢\xb9I\xb6eX\xe8\x97\xd3\xd2\xf3+>\xea\xc7]\t\xe5\xa6\xf7~\x8bI\xa3\x13饎\xcfE\xe3S\x89ݨ;锞A\xafC\x1eT\xb6\b\u05ec\xee\xdbL\xb7\xf50;\x1d\xcad\xaa\xfa\xba\x84N\xc4\xd0\xc4m:Z>3\x82\xd4>e\xb2\xbb\a\x13MV~m\xceٓ'r\xb7\xe3\x9aS\xa9\xa2\x956]\xdb\bz\x15\xa9Y%i\xc6\xc05i\xf2\x12g\x03\x12&\x9f\x8c\xa47\xd5\xd6\xd6n\"\x926,\x985@\xd3m\xd2pU\xc6HZ\x8e\x95`Z\x9dm_G!y\xad\xe0;t\xce\xe69\xfe\x95\xb3dz\x12\x89\xb9ܒ\xfdI\xa5\xc2wJI3M͜X/I\xab[]\uf024`\xc6\xed\xf4m\xaa\xda@\xe2\x93}Ω\xa3v\x94\xae\x16~\"\xab\xcbP\xabӃ\xfe\x16\xa4\xb6\xa4\xa5\xe0^\xbeW3\xd9Q\xcf\xdcj+\xe7\xbdnB\xe8\xc9('^\xd5m\x8d\"s֎\x8a\xf5\x99\xfc\xbc\x97\xfa\xc9\xc0!\xb0\x86\x98,\xf5\xac\xbcз\xc9GБy\xe4\xc7^\xdb@\\K\xf7\xe2\xa1\xf9a\xfa\r\xca\xc9\xc2\x03E#\t\xd1J2\xc9T\xf5\xad\xe5\x0e#%tI\xdb>\x81\xc8g\xba8n\xe2!\xb2vR\xf4\xf2\xdd5q\xb8_\x9d\x10\xae\x94\xc8\xdbcj[q\b\xba\xaa\x924\x93\x19jw\xa6L增\xa4\xe5im\x8f\x19\x16\xccf\x86\xa6ϐ*\u007fT\x9e\xd12\xb1\x12l\xab3\xedK\xcf&j\xe4\xcf\xea\x9cM\xba\x96\x16~\"\xe5\x96\xfc\x82?B\xbe\xebVI\x9a=C\xf2\x89UIڻ\xd5\xf5\x0eH\nΜM\xdff\xcfP\x19\xb0\xd4p\xb5\x9a\xf1\xa1\xc3,I\x9f,\xa2\xa3r%\x9e\xa6\xb4\x11\x9a\x8a\xda|\\\xd8PIz\xa7Jҧ\xf8\x0f5\x93u\xda\xc4;\x1e*9\xcd[1\xdct\uf568\xfdl!Y\x98\x1dL\xac ?\xf1g)t\xde\xc7t\x82\xfc5h}>\th\x1b\x14&\xd2\xcf\a\xf9\xaf\xd0\x16a\x97-=\x0f}#\x8c\xd2y\x0ee2U}\xd7\xd9\xd4SSAY\x13I\xed\xe7O>I\xc1\xad3u&\xa9j\x8aa\x94n\x92%M\aV&\xb3\x13d\x0f\xeb\xea\x8b\x114#*\xe9\x82O\x14\x926,\x981`~\x14\x98VW\xc4\xcaȭζ\xaf\x83\xb6-\xd9\xd1\xd6>\x9b\xc2\xf6X29\xe7rK\x8a\xa3\xf4G\xb2\xa4w\xaa\x9a\x9a9\xb1biU\xe2\xbc\xc0\xbb\xd5\xf5\x0eH\nfL\xa6o\x933T\x06,\xa3wǻ\x9d^ĺZ\xe0\xb9}\xccߵt\x12\x9e\x9f\xf5\xffF%\xe9\xee\xd4l\xf2Þ\x9f\xafN\x972E\x98\xcewN\x8a#]h\xc92\xb5\x81+R\x98\x1a\x94\xd2\x0e\x83\xb27\x93Y1]$\x17\xbeD^\x19I\xbf\x9bx9\xf1]\x12\xd06\xe8H^O\xf6\xba\xb3\xd3=\x06\aI\x96Y\xe9\xb8[}\x9a\xe8P&Sַo\xeal\xa4BP֤e\r\xeb\xf0ʭ\x84ĬăZ4\xe9D}\xd3\xc9\xecoF4\x9e\xb7\xb6\xd8l\xba\xb6)Q\xa4cΧ\n\x8c\xc0\xea\xed\x9bAl\x19\x83u\u008a0n\t}\x8dÿ\xac\xe4;F҆\x053\x06\xca\x0e\xeeiu\xddn\xefiu\x85\xa4\xe7\xe1\xb5twz\xb6\xbauZ7\b\xd3xAҩ\xf9\xe7Jٖ\\?\x0f\xb7o\u007f\x1e\x95\xb4\xdc5\x18\x03\xe6\xc4\xe2W\x9c\xfbW\xc2wZ\xad\xaew@R\xb0\x9c\xce\xd5_\x14\x96\xcb i5'\nN\xb8\x9a\x8aw\xf7\xd0\x0f}\xae\xa6\"\x97z\xefJB\xd8\xf1~\x87Ν\x1eN}\xa94\x8bwT\x9d\xbb\xdc\xe8\xd8\xfcN\xff\xfb\x9b\x1dd'\xfcT\xe2}\x15\xf5\xc2&\x89\x82\x96\t\xe2\x1ew\xb5m\xaa\xb3|\x89\xfem\x8e\xa5|R\xe9\xf1#[x\xb2V.\xbc+\xf7\xc8_\xb6\xe03\xff\xed\xbbt\x8fT\xfcU\xefO\xcbI\xa3U\xd01\xa8Oz\xb8\xeax\x8e\x83̴s\xf9\xc2\xe3\x85<\xd9O;\x97\x94V\xba3\x99ԗI\xa6\xaa\xef&\xef)\x84pWa\xdcl\xb2x[Υ\x94\x94ep\xc5D\x85)\xce\r\xd3\xf1d\xf9(j\x8a\x88^\xb72rBxQ\xb3\x8e\xadkR\xb4s\xf7\x1c\x1b\x95\xf4̨\r\x1bfr\xc4V\x91\xd9\xc4u\xe5\xbb3\x84\xdd\xe9u\xb6Me\xb3\"\\ʻnj\n\x96\rz\x8e\xd2=s\xcf\x12ZluU\xac7\x8a\xe6s\xf0Y\a+2\x93\xc9~\xb4\xa2u\xe6p\x82\xf4\x04Ig\xe7l^ʶ\xe4\xe5\xd4\xf4\x8a#k\x12\xa9\xad\xd45X\x03\xf6\xc4\xe2\xdf\xff\xbdG\x1e\x11\xee\x1f\xd0ju\xcd\x03R\x1c\xc5\xfc\t\xcb˗O\x98\xef\xeb\xd8Nx\xcd\xe7C\x8di\x92F-eE\xbbO\b\x8aF.\xb2\x94\xd6\x1b\xa7{\x93\xe9\xc2\xc8A\xaf>\\\xc8N\xbc'g'\xcfo\xdbF\xa2>J¯\xdbp\xf4\xa7\xeb\xd3\xee\xc9:\xe2\x9dv\xa5Ml\xe0\x96\x94\xe8\x893\xd4[\x9c2U٥\xe9\x8e\xd4l\xe1v\xc3\xfa\xecy\xc9ٸ\x03}(\xac\xc8rD\x9b\xbd\xd2\x0e\x98\xb6\xc1\xb9\x9c\xa4yk\xe8\xceN\u007f\xc5R\xcfu\xe9\vk\x92\xd3\v\xab\x1c\xb4\x92\x9edHQߚ\b\xaf\xb9C\t^\xd0\xe1EnÔ(2\x1e싋\x8a\x9cId۷i\x8a-*\xa5h\x8a-\x0e\x1fϜ\xc8\xc9ˊ¹%:\xb6\xa8-#:b\xd6\t*閸\x88\x89\xb3\x96s\xdc\x12֠8n]t\xf8\xa48\xf1zӒȈ\xb8Z\xf6\x1eo\xa7a\xc1\x8cA\xc3\x04\xba\x06\x95\x86=\xa1\xd5ձ^(\x9aϑ\xbf%9-O\x90\x1b{6\x8b\xa2\xe8T\x9f\xdc\x18\xf0\nn\xe3\xccyd\xbe&\xb7dǖ\xf4\xc4G\xceRIK]\x835P\x9c\xd8\xde\xfc\xe4\xc4l\xe1\xa6P\x8dVG\x9a\a\xa4<\x8a\xad\xb7Gܾ\xd5+\x96\xa5-<\xa5\xa1\xcdԿ\xae4Oҡa\x99\xad\xc4\xc8\xc4\\^\xb4e\xf4\x18\xd9\f\x9aNa\xe9\x1br\x06\xd1\xea\xc2\xf6\xd8\xe0\xe8\xf6\x9e\x9f\x19\x10\xc4V/\x9b\xca\xc1\x1fW\x06\x95M\xd1\x03\xbf\x9f8\x84\xb4O\n֟\x04\x11̒\xf4 Z=\xa4\x92\x0en\xab\xb75\x04\xe7\xf6q?\xb1\xbc\xa4G5\xa6Iz\xe0\x84TҖ\x06$maZ\xf6q\xcb\xcc\xde\u007f\xf5\x8f/\xe8f\xa7\x91\x95\x0e\x17\xea\xf9\xfcw\a\x9b\xd8z\x80\xa4-\xccL\x8e\xe3\xc2[\x8c\xac\x86\x03t\xb3\xf3s48\xb2I\xe2\vFV\xa3\x06\x904\x00X\n\x904\x00X\n\x904\x00X\n\x904\x00X\n\x904\x00X\n\x904\x00X\n\x904\x00X\n\x904\x00X\n\x90\xb4i\x1c\xcf\xfa*\xb8\xae\\\x80Q\x89\x89\x92\xf68\xd0q\x17\xd1\xc7\x14\x15i=K\xc8¼ė\x92\x9b\x18\x83\xe7\xca\x05\x18\x9d\x98&iفN\xbb\xb3\xc1\x85\x19\xe8\x9f\xee\x8c<\x18\xff-\xe4\x91#\x03k\x02\x92\x06,\x89+c\x127\xc7\xc8Ȓ\x80\xa4G\x1f\xd4s\xcf\xd0\x19\u07be\u007f\xa6NuV\x9a\xf6\xe4YS1Q\xd2\x1e\a:\xca`h\xa9\x8c\x92\xfeL\xbb}IT\xc4lS\xe6j\x9f;\xf8\xfb\x8cl\x10y\xae\x12\xe6\xae\xcc\n\xbf\xefH\xd5\xc9W\xf4\xdc\xd3>+\xf2I\x8do\a@\x80}\xff\x94G\xfa\xff'\xf3\x9e\xf3\x96\xc1q\\D\x8b\x86A\x03\xb7O#vT`\x9a\xa4e\a:l0ԔGHO<\x9b5ə\x11\xd1\xee\xcb8X\xf4\xbf\xb3\xd9ad\x83\xe9x\x89\xafj\xac\xcf\xe5_02\xf4\xa0\x9d\xaf\xc7sϲ\xc9ON\x18\xa2Ӣ\xc0\xfa\xfeY\xce-72\x91\xf0\x9c7WM\xcdV\xcdG&\xd7r5\x1a\xb1\xa3\x02\xd3$-;\xd0a\x83\xe6\xd1\xce\xe1\xee\xd9id\x15$J\xfd\x914\xaa\xe7\xcfa\x9dnc\x9f\x17l\x80F\xbe\x92\xe7\x9e\x19\x1bP\xc4P\xbb}@}\xff\xac\xe4V\x1a\x99hQ\xab#\xe9\x90?pv\xb8`\x96\xa4\x19\a:L\xd0DZ8\xff\xa7}\x01g\x00\x92F\xbd\xc9ی\f%4\xf2\x95<\xf7\xdc^\xe4\xe2\x86:1\n\xa8\xef\x9fu\xdc:#\x13-@\xd2*̒4\xe3@\x87\t\x86\x96\xf6\b\x8e\x9bPLB\xee(\x8e\xe2\xf5Ƞ\xe2\x99\x11S\x96ᱻ!\x9c\xe3V\xb6̟\x1c1\xbb\x87\t\xaa\x8c\xc5\xc7\x17\xb9&\n\x99q\x13UC\x98\x86\xbb\x1e\x84\xbe\xc8MK^/L\x90\x19\x17<\x9a\xb6\x82\xa4Ѷy\xba\xb6\xfd\x15YIK\x85ŶN\xbe\xb2\xe7\x9e\xd9+\xe7\u070e\x8f%\xbcY\xbb4\xff\x1c\tɾ\u007făW %c2S\xe4\xab\xe0I\x8e\xae\xed\xb5\x9bo\t\x17\xee\\6%b\x16\x89\x93\xcf\x1bA[\xbc\xd5 \xe9\xc1`\x94\xb7/\x18\a:L0Ĝ\xa8\xa9\xb1\t#CC͋ܺ\x9a\x1a\xf542c\u0092\xf2\xadQ\xd3\xfb\x90\xbb\xa48z\xca\xc4\xe8e\xf3\xb9O\x98\xa0\xcaZ|Ƞ\xbbh\xab\x80\xcac\xb6\x96\xbb\x1et!9\xb3\xeax\x0eO\xa5'\xbb\xe0Ѷ\x15%]\xc1w\xeb\xd9\xe69v\xd6\xeft\xe4\xe9\xe7\xcbx\xeeY7\xd1v\xa2gv\xdcQ\x9d\xd2\xfcs$$\xfb\xfe\x11\x0f^\x81\x94\x8c\xc9L\x91\xaf\x82\xad\x1c]\x99k7_sq8\x17\xb5n\xd3Dz]J>oHS\xd2=m\xd53\"\xcdZD\x99\x8eY\x92f\x1c\xe80\xc1\xd0\x13\xe1\xe9\x1aZ\x13\xefr\xae\b\x91>C\x9daL\xe7f]\x15\x97\aL\x90\xc5\xf3(\xe0\xb6V\x01\xe5擶\xbb\x9e\xecL\xac\xcf\xfe\xa5Dz\x8c\xb3\x1dm[Q\xd2\xc4\xf9\x8e\xb6m=}\xda0}\xd5Η\xf5ܳ\x81s\xa2\xab\x11䠇\xe0HH\xf6\xfd#?\aYB\xe9=ȓ\x99\"\xc8\xe2\xe4\x84q^\xbb\xf9\x90-\x12\xff\xe0Ώ\x12?E\xf8\x92\xf4\x1c<ƛ\xb8\x8c2\x19\xb3$\xcd8\xd0a}\xe9\x84\x1c\x9f\x92N\x99\xec\xee\xc1D\xd3\x05\xe3t\x9b4*3A\rZ9\x0f\x8aN\xae鮧C\xd0\xc6N\"=\xc6َ\xb6k\x1fQ\xd2U|\x87\x8e\xed\x16\xe1\x9a\xd5}\x9b\xf5\xf2e<\xf7\x94p\x91\xcbЦI=hH\x8e\x84|\xfa\xfeQz\x0frH\xa32\x13d)\xa2?\xa0z͇l\xe4,\xac\xb3\x89\x9f|J\xfa\x93}Ω0J\x0f\x06\xa3\xbc}\xc18\xd0\xf1\xf6\xa5\x13B|Jz\xbaط\xe8lo\xfa\f9^\x0ejQS.\xa0\xdcO\xd6t\xd7sV\x98\a\xd3m,\xc6َ\xb6k\x1fQ҅\xc9z\xb6\x0fS?=('K/_\xd9sO[IJj[\xebdz\xf4Cp$\xe4\xd3\xf7\x8f\xd2{\x90'3E\x90\xe5p\xa4\xa0M\xed\xe6Ct\xaaퟤ15\x9c)#\xc4p\xc0,I3\x0et\x98`\xe8\xf1)\xe9\xf9\x93OR\xe8\x14pz\x8a\x14\xcf\x04\xfdG\xd3]\xcf7\x826\xf2\x84\xd1Tr\xb6\xa3\xed\xdaG\xdc\xf1N]\xafg\xbbEpi\x9d\x9e\xa7\x97\xaf칧\f\x8f\x81s&O\xa4\xd7\xe1\x87\xe0Hȧ\xef\x1fo\xefA\x02Lp\x00\fLҰ\xe3=(\x8c\xf2\xf6\x05\xe3@\x87\t\x86\x1e\x9f\x92\xdeǕ\x90\xb7\x95\xf4&)cIk,'\x19\xb4\xdd\xf5d\xa5\xe3\x0e\xffi\"\x91\x1e\xe3lG\xdbV\x90t!\x11\xa0\xb6\xad\x10{\x90\xac\xa5\xb5\xf3E\x92\xe7\x9e\xdd\\\vj\xe0RP_t\xeb\x10\x1c\t1\xbe\u007fZ\xd7y]\x11S\x14\f\x92\x0e\x15fI\x9aq\xa0\xc3\x06C\x8a\xfbhM\x8d-\xa3\xa6\xe6\xaag\xc7۫\x17,\xe7RJ\xca2\xb8b\xd4s\xb4fJ\\M\r\xe9\xecLP\x85֦/\x83\x96\xbb\x1et.)\xadtg2\xef\xa8:\xa7p\xb6\xa3e+\xdc=\x96\xc7\xd3qR\xdb6\x97/<^\xc8\xe7\xea\xe7+y\xeei\x8bH\xd9\x1d=ŶdCx\xdb\x10\x1c\t1\xbe\u007f\xe6p3\x91\x1a)\x19\x93\x99\"_\x05\xe5\x13}\xcc\xd3\\5\xe1\x19G\xd1Ɍ\xf0\x1a\x17{\xde\xe8\xddc[kj\xbc\xf66N\x8c^o\xa0\xa6I\x9aq\xa0\xc3\x06CI\xed\x04a\xa9\xecD\xeeH\x1a\b\xf7\xba\x81m_\\T\xe4\xcc}X\xf2\x82)\xe9\xecLP\x85֥Y\x16\rw=\b]X\x93\x9c^X\xe5\xe0\xc9\xfd#\x8c\xb3\x1d\r[z\x8f7\x9f.Ny5m\xfb+\x96z\xaeK\xeb\xe4+y\uea5c\x12\xb5\xa4\xb3rJ\xa4S\xa74\u007f\x1c\t\xb1\xbe\u007f\xb6ڢ\x90\x17\x9edLf\xca|Y\xf6E\xf9\xb8-{\t9=M\x11\xf8u\ts\xde\xe8=\xde\x04\xafiS[xJC\x9b)w웎y\x92\x06\x82B_\xfbU\xdfW\x03=\x9e{\x86\x82\xb0=\xa6\xf4\xfd3'N\xcf\xda\x14ʦr\xf0Ǖ\x03\xc6(o \xf4\xb8&\x8d\x193\xc5\xe5SԂ\xe7\x9e!A%\xad\xf4\xfd\xb3a\xd8]\tnk\b\xe0\r\xe8#\b\x90\xf4\x88\x81\xf7\x83_\xfe\xd7\xff*.\x18\xf3_\xbf\xd4\xfe֨\x04\xbf\xf1v$\xe4\x8aڪi\t\x84\x1c\x90\xf4\x88A[\xa6J~\xf9\xbf\xe7\\\xbb\xf6\u007f\xff\xcf\xff\xd3\xfe֨\x04\u007f\x01GB\xc3\x19\x90\xb4\xa5\xe8\x8cL\xb9v-\xf2\xf6\x96\xe0\xde\\\v\x8e\x84\x863 iKA%=\xf1\xf6\xe6\xe0J\x1a\x18\u0380\xa4-\x85 i[ܬ&\x10\xf5h\x05$m)\x04I\x8f\x8d\xfc\xfe\r\r\xbb\xcb\xdbC\u007f\xa9\x1f0\x1f\x90\xb4\xa5\xa0\x92\x9e\xd4~\xad\xe7;aaa\xb6\xa3\xaeNP\xf5\xa8\x03$m%\xfa\xae\x12I\xcf\xc6\xe7\xe6\xfbs\xdc-c\xc3¾\xef\xec\x1c\x9d\xb7P\x8db@\xd2\x16\xa2u\xe6\xf4뱤\xb7\xe2s3\xab\xf9ڵ\x8ce\x87g\x86ŵ\x83\xa6G\x17 i\xeb\xe0\x9e\xf8\xfd\x19\xd7aI\xd7\xe2s\xb3\xfc_X\xdamxĎ\b\xf2\x05-`\xb8\x01\x92\xb6\x0e\raG\xafE`I#|nN\xe0\xffG\xf1\xff\x14[è}\xbc\xc7(\x05$m\x19\xfa6\x85\xfd\xeb\x1aYK\x13\xfe-\xfe\aI\x8f:L\x94\xb4\xe85\xa7\xa7\xd8)P\x8c\x80\xa1г\xe4\xfb\u05eeMJ\xb9\xd6\xe7\xfe\xf7\xb5\x1e\xfcߍ\xff\x13I\x87\x01\xc3\x17\xa3\x93:\bL\x93\xb4\xe45\xc7\xed<\xe9\u009c\x10\x1e\xd0oe\xaaO\xa2`\xe2\x9eo\xbbvm\xfa\x92\u007f\xff\xeb\xda\xc9\u007f\xfd\xfbZCߵk͂\xa4\xbb\x80እ$-{͡7:\xb9\x8b\xad\xff\x14\x8a\x19\x83yd\x99\xff\xb8\xe7D\xd2Ӳ\xf5I\u05f5M\x1b\xae^۰\x01\x81\xa4\x879V\x92\xb4\xdakNy\xe8\x9fS\x14r\x06\xf5\x14B\xffqϊ\xfe\xb7\x17 \xe9a\x8d\x95$\xad\xf2\x9a\xd3\xec\x1c\xa2\x13\xc5a\x84\xd2Î\xc7\x05O\xb9\xf8H\x9d\xe9\xe4\xa1;\x13\x8aQ\xab\x8d\x9b\xaa\xb0e]İ\xf8\xed\x85\xc6=sʿ\xbc\x98\x03\x92\x1e\xceXI\xd2*\xaf9%\x95>\xadG\x14\n\x0f;\x92\v\x9e\xce\xc3\xf4)\x845\xcd\xf4\xd1x\xeb\xf0\x8fZ\x86Ma\xabp\x11\xc3\xe0\xb7\x17\x1a\xf7\xccIȋ\xe8(\"\xe9gn4\xd4\xf5\xfd\xb7\x1aYx\x13F\xff\xe9\u007f\x190\xbc\xf2\xba\xf5~-3\xdf(2Q\x1d\xaeAe\x8d\xda\xef\x89\x1f|\x87\xbe\x87\xdd\xf8\x18y\xf3\xbfvV\x92\xb4\xd2kN\xab\xd3Zϔ\x91<\xec(]\xf0H\x13o\xf6\x01\xb6\xb27\x1e\xa5\x8b\x18\x11\xff\xbdи\x97\x8f\xa9\xb9\xaabwXJ\x13\xee\x8d\xe3^7\xea[\x17ǾE\xbb\x98\x91\x9d\x02}I\xbf>\xde8\xab\xb0\xb0\xb017\xdd\xf6\x94\x91\x19\xc1+\xaf\xb7\xc6^\x14\xbf\x19\\&\xe2\xe1j~\xa7Qq\xa3\xf6\xbb\xe1\xf9/\xe9\xfb\x97\xcf\xdfHޤ\xda\x19b%I+\xbd\xe6T\x96\xf8\xb6\x1eiH\x1ev\x94.x\xb4%-y\xe3Q\xba\x88\x11\xf1\xdf\vM_\xb3-\xec\xfa\x1bn\xb8\xe1{\xdf\xfb\xdeرc\xaf\xc7\\w]\x98\xad\xa4\xd5\xe7X\xea\u125fuu\xdd\xf1\xdb+aW~{\x87\x91\xa9\x8c~\xb6\xbf\xfa\x95\xeeW\x128\xf5\x95\xbf\xfe\xe1Ƿ^12\xd4*\xe8֧\xa4o\x06\x93\t9\\=4\x8eʨ\xfd¾\x14\x03_\n\x96\xb7\xfa\xf5\x1b\xd3e-I+\xbd\xe6\x14\x99\xf2X\xfe\xe0!y\xd8Q\xba\xe0і\xb4\xe4\x8dG\xf9\xf0y\x91\x01x\xa1q7\xad\x9c3+n\x96\xcc\xec\xd9K\xca\x1b\xda\xc3\xc8P\x16&vK\xa2\xef\xa7n\x1e3\xf6\x17\x1f\xe3\x0f\xcf\xde<\xe6\xa6DŽ\xbeu\xdb\x13X\x1b\x8f\xde\x12vˣX\x1c\xcf\xfeh̸\xfb\xbfԲ|t\xdcw\xc7\xd1\x14\x8f\xe1\xc0\xa3a\xaa\xfc\x1e\xfd\x81\x10\x89\x87\xb5?\x93o\u07bam옛\x9fb\x92ɦ]\x1e\x9d|y\v\x99\xa5zJ\xd4/H\xaeԃd\x16\xfc\xc4\x1dC\xca\x04\x1f\xee\xc7t(\xbd8\xf6c1\x1bO\xdd\xe8\xe5beq4\xe6\xadۮ\xbf\xee6\xb6-\xa4\xe2X\xc9\v!O픕\x16j.\xb5\x05\x8d\xf2:\x89C\xc7,I+\xbc\xe6\xb4;}\xb9\xa9\x18\x81H\xe2\xf5v\xc1S@\xc6d*ޕ6\xa5\xad\xb6\xa4\a\xe2\x85\xc6\xdd\xd6ڬ\xa0\xa5\xd5\xd5\xd9'\x8eҲ\xa4ǿ|\xf1\xbd;p\xa7{\xfe\x86g/\xbe\xf5\v\xa1\xef\x8d{K\x96\xf4\xeb?|\xfd\xe2[d=\xe8e\xf9̍/\xff\xe3\xe5\x1b\x9f\xc5\x11?x\xf5\xe2\xab7\x85)\xf3{\xd6\x13\xd9\xf5\xc6x\xfa\xcd\xcd\x0f\xfe\xfd\xca\xeb?g\x92I\xa6\x8c\x0e^\xff\xcf.\xb9D\xfd\x82\xe4J\xfd\xf4\xbfq\xaa\xb7\xc6\r)\x13r\xb8?#?6O\xfd̫Yh\x96\xca\xe2H\xd4\x0f_\xbe\xf8\x8f\xbb\xef\x96s\x97,\xf0\uf0b0\x92&|\x87N\xb9=\xb5S\xe5B^䶠Q\xde'qȘ%i\x85לVg\xbb\x81\xf9\bC\x92\xa9\xc2\x05O\\\x1cBm4\"b9\x9e'\xcf\xf0K\xd2\x03\xf3B\xd3\xe3V҃\u007f8\xbd$\xfd\x06~\xff\x9f\xb1]]?\xfe\x83\xd4\x13\xbb\xc6\\\x94'\u07b7\x10\x83\xf7\xc6iX\xfe\xf8\x19\xfc\xf2̏\xbb\xba~\xf2,\t\x84)\xf3\xa3\x91ϒrȼ\x1b\xbf_\xf7\x9e*\x99d*V\x85pqL\x97\\\xa2~Ar\xa5\xfe\xecI5\x84L\xc8\xe1\xfe\xe1\x16\xfc\xe1\x96?x\xb2\x91\xeaF\xb3T\x16\xe7\x19\x85\xffq\xa3\x9c\xbbd\xd1u\xe5\xb1\xf1]\x1e\xc6?F\x96\x00\x9eکr!/r[\xd0(\xad\x938D̒\xb4\xc2kN\xb3\xd3J\u007f-\xa4\xf0\xb0#\xb9\xe0AD\xad\x9b\xcafE\x90\x8d\xc0\x99Q\x1b6\xcc\xe4\u008b\x9a\x19[\xd6E\f\xcb\xc0\xbc\xd0h\xe0%iO`\xcc\xc7RO\xa4}\xdcc46L\x9c|zY^\xffw\xfc\xf2\xf7\xeb=\x810e~R$\x99w\x93\x88_\x8d\xbd\xfb\x89\xf7\xd8d\x92)\xf3F\xba\xbfT\xa2~Ar\xa5\xaexR\r!\x13r\xb8Wƾ\xd7\xf5\xde\xd8+\x9el\x94\xed\xa3,\x8eD\xfd\xf7\xcf\xc7*r\x97,\xf0T]\xfem\xfc\x03\x8d\xf1\xd4N\x95\xcb\x15\xb6RB\x94\xd1\xc9\x1b\x04\xa6I\x9a\xf5\x9a\xd3\xea\xf1;n\t\x94\x1ev<.x0\xee%\x91\x11qt?\xb0%.b\xe2\xac\xe5\x1c\xb7\x84\xb1e]\xc4(\x18\x90\x17\x1a\r\xc2\xf4$}=#\xe9q\xcc\x0e\xf0\x18qp\xf5\xb6\xf4S\xd2\u007f\x1e'&\xfe\xf3\x83\xb7]\xff\xa0\x81\xa4ɜY*Q\xbf U\xa54&\xde\x03Ʉ\x1e\xee\xdd\xf7w\xdd\u007f\xb7\x94\x8d\xb2}\x94ő\x97\x9f\xfc\xea\xbd//2m!Yt]\xf9-3J\xff\x96(\xd5S;\xef\\Tma-I\x03!B\xec\xa5c\xff\a\xbf\xbc\xc1\xf6ݟ0\x13o\xb2=\xe6\xe1Ǐ\x8a\x01/K퉷d\xe5\x99x\xd3\xfdnQl\u007f\xbd\x8e\x9dl2يo_\x92\xa5\xa6T\xa2~A\xaaJ\xa9\xb6\xc7\x06\x9a\t=\xdc\xd7\xc7w\x8d\u007f]\xcaF\xaa\xdbwȖ\x97\xb28\xf2r\x1d\x1e\xd8_e\xdb\xc2c\xa1\xb1\x96\xf6\xd4\xce;\x17U[\x80\xa4\x81A v\xd7;\xeex\xef\xe2\xcb\xe3پ\xfb\xea\x8d\xcfK\xdbc\xecU\x9d\x97\xaf\u007f\xe2\xe3\x8b/ߪa\xf9\xccMd\x9fI\xbd=\xe6\xb1zv\x1c\x8e\x1c\x87\x03\xe3\xdf\x10\"n}\xfe\xe2\xc5Gof\x92ɒ\x16\xd2]yO\xb8\xfe$\x95\xa8_\x90\xaaR\xf42\xd1\xe03\x11\x0ew\xfc\x83\x9e\xe1\x95=\x8cq\xcf{\xb5\x01y\xb9\xf9\xc1\x8bo\x8cg\xdaB\xb2\xe8\xf2\xa4\x95C\x9e\x8bX\u07b9\xa8\xda\x02$\r\f\x02\xb1\xbb~\xfc\x8b\xb1c~\xf4\x14\xdbw\xbb\x9e\xf9ј\x1f\x88\x17\xb1\x14\xf7^\xbc\xfa\xd3\xeb\xc6\xfc\xf4e-\xcbG\xc7}G\xbc,\xf4\x03\xf9\"\x96d\xf5\xe8M\xdf\x1d\xf7\xe0\x18a\xdeM\"\x9e\xffɘ\xb1?\xff+\x93L)ir\x97\xc8ϞR\x94\xa8_\x90\xb2R\xc2\xcd\x1c\x83\xcfD8\xdc\xfb\xbf\xeb\xb9͋=\x8cgƑկ\xa28\xf2\xf2\xc6\xcdcn\xfa-\xdb\x16Rq]\xea\xeb\xd2\xf2\xad&^\xb9\xa8\xda\x02$\r\f\x82\xb0.\u007f\x18\xcc\r\xa1Z\xe0\xd9,\x9dw\u007f9\xc6\xc8r(\xf8\u007f˥\x0e\x81:\\\x81\x9b\xa4\xbb\xc7n\"o\xfe\xd7\x0e$\r\f\x02\xff$\x1d\b~\xf1狯\xff\xf0Aa\x81\xfa\xfa\xcdF\xd6\x16≛\xc4{\xbcox\xcc\xc0R\x05H\x1a\x18\x04\xa1\x93\xf4\x13\xff9f\xfc\x83B0l\xfc\xab\xbem\x01\x02H\x1a\x18\x04\xa1\x9340P@\xd2\xc0 \x00I\x0f_@\xd2\xc0 \b\x03\x86/F'o\x10\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x8cfI\xa7pQ\U000db34c\x00`d1\x9a%\xed\xaa.\x9a\x1a\x05\xeee\x00ka\xa2\xa4E\a:\bu\x1e\xde]\xb0\xfb\xb0)ڪ\xe6,\xef\xe3\x03\x18e\x98&iɁ\x0ej/\xde\xdd\xecj\xde]lƓMj\xb9\xa3F&\x000\xa20MҲ\x03\x9d\x9a\x12\xf2 \x84\x9e\x92\x1a\xa3$A\x00$\rX\r\xb3$\xcd8Щ\x14\x9e\x12Zf\xc6\xd3\xf9AҀ\xd50KҌ\x03\x9d\xf6\xe2\xeavw{\x8d)\x13\xef\x06\xae\xda\xc8\x04\x00F\x14fI\x9au\xa0\x83\x97\xd5N\xe7>S\x9e(莚q\xd8\xd5gd\x05\x00#\a\xb3$\xcd8\xd0qW\x964\xbb\x9aK*Mq]\xb9O~\xf0\x1f\x00X\x01\xb3$\xcd8Щ\xa1\x8e\xb1\xdc%f8\x98\ue31a\xbc\xb5\xdab~\x01\x80эY\x92f\x1c\xe8\x14\b\x97\x86\x1b\n|\xd9\a\x89ZΌM9\x00\b\x1efI\x9aq\xa0#J\xfa\xa49\x92\x86\x1do\xc0Z\x98%iƁN\xb58\xf16c\xef\x19$\rX\r\xb3$\xcd8\xd0q\xbfX\xd2\xe4j*yь-\xef\xa3 i\xc0b\x98&iƁ\x8e\xbbvw\xd1\xee\xda\xd0+\xda\xed:\x99b\xb3\x96\xafz\x000O\xd2\xe63\x87\xe3\xa2ˌ\x8c\x00`d1\x9a%\xed:\tC4`9F\xb3\xa4\x01\xc0\x82\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x98(iɁN_CY\xc1\xee\xe1\xe3o\xee\\Nrr\xf6\xa9\xa5\x8dFv\x02\xf5\xa9\xc7\xf5\xbf,\xe5\x1d\xe4\xdb\xfa$\xbeT\xdb`\x1b\xcf\x1f\xd4\xfe\x06}\xee\xe0\xef\xd3\xf9*\xb0\x8c\x88J\x02~c\x9a\xa4e\a:\xa8\xbc\xe8d뉂\x13F)B\xc4Yǚ#\a\xd7\xeb\xf7b\x15Ǔ\x8e\xe8\u007fّ\x9b\xf4\b~{$1\xb7C\xf9ũ\xb3\xc2\xfb\x17\x8d\x0e\x1d\x1d\xa1\xfew6;t\xbe\n,#\xa2\x92\x80ߘ&iفNC\x01y(\u007fK\x81)~\xee\xbc\xc9\xc9\xee\xc7]u\xb3\xbf\x92F\xfd\xbe\xbe,\xccI\xea@\x1d\x899\x85\xaa\xf8\xac\xf5\x9e\x90\xaeZ\xf0\xf0\x19\"\xb5\x8c\x88J\x02\xfeb\x96\xa4\x19\a:\xe5\xfbhL\xf10\x19\xa6\xd3i\xcf>\xc7\xfb\x18|\"\x05\xd7\xcf\x00\x00\r\xafIDAT\xfd\xa70\xf7\x91\x83\xa8*'W\xad\x96\xa5\xc3I-#\xa2\x92\x80\xbf\x98%iƁ\xcen\xc1\xbf]Y\xb9\xaeqp\xf8\xd0\xc1\xf3;/\xe4\xa5'\xe6|\xcbF禞ï\xfd\xf5\xdd\xe4\xb5*+)3\xbf[a{\x90\xe7\U00062cd4'S\xf3\x8e$^\x9e\xa1_X?ϑ\x9a\xf3\x05\x9b\f\xab\xa5b=ʩ\xa0j\x91b\x8f\xf3\x02Y$\x95\xa30?3\x89\xa6B\xfd\x15YIK+\xe8\xa8\xffEnZ\xf2z՜\xd65\x91\x13\x98\xa8zr\x83\\\xb0\x84\xe2\xd8\xe4\xea\xa0\xee\xc2\xfb\x92\xb2\xdfI\xabW\xa4\x0fd%\x01\xd31KҌ\x03\x9d\xc3\xc5\xf4\t\xa1E\xbb\x8d\xd2\x04\x98ރ\a\xd33\xefI\xcbϽ\xebs6\xfa\xf3t>\xa7\xf4\xdd^\x1a\xde\xc2\xe7\xd7W\xa4.\xedgm\xbb\x1b\x93_\xf8\n}\xf5Br#\xee\xf8g\x1b\x1b\x13\xc5\x11\xecTR\xd6+\xf5\xa5\xfc^6\x19V\xcb\x17I\xdf$^\xa6j\x91b\xbb\x1b\x1b3\xb3\x1b\x1b\x1b?%\xc9\x1c|\xe6\xc1\xe3\xf3\xe8x\x98\xe7\xd8Y\xbfӑ\x87C\x17\x923\xab\x8e\xe7\xf0J\xb5\xb8\x8b\xb6\n\x14)\x1f\xd3\xc6\x14,\xa186\xb9:\x1d\xe9\xc9{\xeb\xb7\xf1|\x85\"\x83@V\x120\x1d\xb3$\xcd8\xd0\xe9,*os\xbbʜ%Fi\x02\xcfR\xfe\x91n\xd4߭\x8c\xec(\xfd\x8d\x83O&c\xefq\xbe\n\xbf\x9e\x15\xc6a\xd9vK.~\xc9\xdd\"\x9a\x8b\x92\xeeM\xcf\xe9%R\xeaP$+\xccEK7g!\xa2\x16ef\xf2\x9c6\xf5\x1b\x9cc*\x0e\xd5\xf3\xf5\x9e\xd7\xecL\\N\xffR\x95Z\xdaZ\x05\xda\x14\xb1L\xc1\n\xa4\xfa2\x05\xe7%\x93\x916\xdfK\xd2\x01\xac$`6fI\x9aq\xa0\x83\xda˝N\xe7\xd1r\x13\x9e\xec\xb7ԡ\x18\xa0%zO\xe5\x90N\x9b\x9b\xde\xfb-&m\x8b\xd2\xf6Tb7\xeaN:%~\x12%]\xcf\u007f\xe4I\xcd$\xc3jy\x85\u007f\x89\xaaE\x99\x99\xac\x16\xf2\x99.H\xb7\b\x97\x83\xeeی:\x04\xcd\xedT\xaa\xa5\x95\xf3\xa0\xf0\xf8\xc3\x14\xac@\xaa\xaf\\p\u007f\x12\xad\xeb9oI\a\xac\x92\x80\xe9\x98%iƁ\x0e\xc6\xddއ\x8aM\xf0\x89\xb54\xcb;\ueb30d|x\r\x19\xe8\x04\xd6(m\xbfM>\x82\x8e\xcc\xf3\xect\x8b\x92\xde\xcb\xf7z\xbeg\x92a\xb5t\x14~Eբ\xccL\xb9\xf3D\xd5\xf20\xfd\x06\xe5d\xe1Q\x92^\x14W\xef<Ք\v\xd4(b\x99\x82\x15H\xf5\x95\v\xfeB\xd8\xf3\xeb\xf6\x96t\xe0*\t\x98\x8dY\x92f\x1c\xe8 \xbaQ\xd6\xe24\xe1q\x9dr\xa7\x95Iͧo\x85\x99d\xcc:K\xe9P\xd9\xe6\xafA\xeb\xf3=\x1fDI\x9f\xe2?\xf4\xc40\xc9\ns\x85\x98B\xad̪\xc80*\xabeK:\xf9\x95\xe8O\xcfC\xdf\b\x9a\xcb\xf3K-L\xc1\n\xa4\xfa\xca\x05\x8b\xa3\xf4Gޒ\xa6vA\xac$\x10:̒4\xe3@\xa7ى\x17\x87W\x8b\xcd\xf0\x9f\xc3J\xbau\x830\x9f\x9d\x97F\xfas?\xf9\xaa^XS\x16\xbe\xa4\xb2}7\xf1r⻞\x0f\xa2\xa4\xbbS\xb3\xc9h\x99\x9f\xafHƨE\x91Yv6B_\xd1\bY-\x82\xc1A2\xe3\xcfJ\xc7u\xf84\xd1/\xb50\x05#\xf9(\x98\xfa2\x05\xaf\x9f\x87\xf3\xed\xcf\x13%\xed\xb1\rA%\x81\xd0a\x96\xa4\x19\a:-\xceZWCqyȽm|\xfb.\xdd\xd3\xf5\xac\x90\xe7\x88~\xa6\xe7\xf1\xa9\xa5\xf5G\x1eI\"[\xbd\x85w\xe5\x1e\xf9\xcb\x16܋\x95\xb6\xfdi9it\xde\xdd\xfbNcc\xe2\xe6F\xb2\xf7\x8dW\xd8\xf7U\xd4\v;OR\xb2or\xb3/\xe3ϗ\xb3s\xbfab\x11\x91\xc7^\\\xc4et\xb9ѱ\xf9\x9d\xfe\xf77;\x1a\xb1]._x\xbc\x90'\xfa:\x97\x94V\xba3\x99wT\x9dC\xc60\x05KG\xa1\xa8\xaf\\\xf0\xe5\xd4\xf4\x8a#k\x12\x95\xb6!\xa9$\x102L\x934\xe3@\xe7dIQ\xf9I#\xf3\xc0\xf3\xa1\xb0l\xcc\x11?\x16E9\xe9\xfbo*\n\xefKJ]C/ޠ\xfa\xecy\xc9\xd9\xf5^\xb6{\x1d\xc2%\xa3\xf7ť'\x95ȧ\xeb\xd3\xee\xc9:\xa2HV\xca\xf3dci3Oo\x9f\xf6\xc4bz\xf3\x93\x13\xb3\xcf\xd2ۧy\xc7G\xe4\xea\xf66r\xc9w\xa9\xe7\x92\xef\x855\xc9\xe9\x85U\x0e\x12k\fS\xb0\xe7(\x94\xf5\x95\v\xeeؒ\x9e\xf8\xc8YQҢmh*\t\x84\n\xf3$\r\x98\x85z{\f\xb0\x14 \xe9\xd1\aH\xdaҀ\xa4G\x1f iK\x03\x92\x1eu\\\xa8\xe7\xf3\xdf\xf5\xf9\xf7c\xc0H\x06$=\xea\xc8&\xbb]\x17\x8c\xac\x80\x91\nH\x1a\x00,\x05H\x1a\x00,\x05H\x1a\x00,\x05H\x1a\x00,\x05H\x1a\x00,\x05H\x1a\x00,\x05H\x1a\x00,\x05H\x1a\x00,\x05H\x1a\x00,\x85I\x92\xee)v\n\x14\x93O\xae\xb2\xa2}&<\xd3\x04\x00,\x88I\x92v;O\xba0'\xe8\xb3M\\\x055-5\x05\xa0i\x00\b\x00&I\x1a5\xd1gw\xd3G\b\xf6\xd1\xd7\xc3\xc5}\x06I\x00\x000\xc6,IS\xca\xc9s\x8aPs\x01\x95w\xc1\xf0\xf1]\t\x00#\x173%M\x9f#\x88P\xa5\xe0\x13\xab܌\xe7\t\x02\x80\xd50S\xd2%\x95\xf4m\xb7\xf0\x00\xef\xc3&<\x9a\x1f\x00,\x87\x89\x92n\x15\x9f\xdc]\\K\xdfj\x8b}\x19\x03\x00\xe0\x17&J\xbaRt\x82%z\xae\xac\x0e\xb5\x9b;\x00\xb0\"&J\xbaHt(])x\xa1-\x83\xb54\x00\f\x1d\xf3$\xdd\xee\x14\xfdB4;\x89ǻ\xabN\xd8\xf1\x06\x80\xa1c\x9e\xa4[\x9d\xedB\xa0\x8f\xfaΩ\x86\xeb\xd2\x00\x10\x00̓t\xb3\xd3\xe32\xc7UP\xddZ\rw\x8f\x01@ 0Oҭ\xf2v\x98k_A\x19(\x1a\x00\x02\x81y\x92\x06\x00 \b\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\x01\xc0R\x80\xa4\xd1ڵZA\x00\x18\x99\x98$i\xa5\x03\x1d\x84\xaa\xcd{\xa4\xc9\xdf\xecOk\x04=\x1c\xb0c\x12p\xe0\x83_\xc7\xc7.:\xb6\xe0m\x1c\xdc>\xf7\xceiw\xce݁P\x9dݾ\b\xa1\xfd\xd8\xe2\x98:]\x908\x16\xff')|~\x9a\xfd^\x1f\xa6\xbeYk\xb7\xef7\xb2\x19\x10\x81k\xa8\xd5\xd8,漑\x15\xa0\x87I\x92V8\xd0A\xa8\xcdYk\x90 x\xac\x8a\xb9\xa4\x11\xf4\xe0~\xbb.v\xc5\a\b\x9d\x99\xf6Ё\xfd+\xa8\x0e\x8e\xd9\u007f\xbd\xe7\xd0k\x0f\xd9\xeb\x90\xfb\x98=\x06\xbf\xee\xb7\x1fs\xa3\x00s\xec\x8cf\xf4\xa1\x18F\x88\xa7W\xc7h\x1a\xf9å\xbai;\x8cl\x06D\xe0\x1a곺\xba=\xf6\xb7\x8d\xac\x00=L\x924\xeb@\a!W\x89y\x92>oߨ\x11d\x89'C\xf7\xe2\xc5$\xb8\x9a\xf4ԍ\xb1\xb4\xee\xb1\xd8\xd8m_\xb5\x9a\xa4\xf3\xa3\xa3\x0e\x90\x05+\x8c,0;\x06/i\x84b\x02+i\x14Ȇ:\r\x92\x1e$\xacY\xe5:\xc8h\xe6p\b\xd7\xe0\xf7h\x87]s%>І\"k\xeb\x1dbfri\x04Q\xd2z\r\x85\xd0k\xf1{\x10\xa0\x8d\x99\x92\x16\x1d\xe8\x10L\x93\xf4\xdai\x9fi\x04\x15О\xfaY\x82\xfd\x81\x1d\xa7\xe9\xa4b\xc1\xefh\xf4\xef\x16О\xba\xeb\xd7\xea\x9e\xea\u07bf?anl\xc2\xc6U\xf6\xcf\xc8\ft\xe3\xa1]\xf1\v\xb0\xb8\xbfN\x88\xdfuh\xadݾG\\NJ+a\xd9\xe0\x8c}\xd5\xfec{\xe2\xed}d]:wQ]]\x9dz\x8f\xe8L]\x9d8\xb6\x9e\x8f\x9d\xfbڟ\x16\xdbՒ~3v\xc1s\xc7v\xd8w\x11\xed\xad}s\xffC\xf6\xd3\b\xfdm\xff4{\xfc\x8e]\xb1\xeaa?ƾ`\xff\xfe\x051D\x80r\x1d\x184sp\xbf\x9d\xb0\xf6\x12\xba\xb4=\xb6Nc\xbc\x1dpC\xd5\xc5n\xf7d&\x97F\x10%\xad\xd3P\x98\x15\xf6\a\x10\xa0\x8d\x89\x92\xf68\xd0!\x98%\xe9Ϧ\xad\xd5\b*\xa1=\x15}\xfd\xdc\xc2i\xf6X26ݻ\x8aF\xaf\xba\x97\xf6\xd4K1\x97\xbc\xe7\x93\v\xec\x8b;\xf18Gt\xf1GDz(N\xb7*\x96L\xeb7\xda\xc9\xf0B\x85I\xa7͌\xc1\x9ex\xd2]\xf7\xc4\n9\xe8L\xbcEI/\x9a\x8b\x8b\xec[\xa0\x92\xb4;\xe1\x01\x1cݳ\xffk\xf2\xbbB\xea$\xe4\x12\x13\x8b\u007f[Vūs\xba\x17[\xb8\xe7.Tԁ\xcdL;\x87\x1dd\xea@\x16\xc6\xde\f\xbc\xa1V\x93\xdc\u007fGڝ-\x8d\x99xk6\x14\xe6\xfcs\xb0%\xae\x87\x89\x92\xf68\xd0!\x98%\xe9ǧ\x9d\xd7\b*\x89\xf7\\\xd9r\x1f{\xc0~H\x1a|V\b\x83\x0f\xfa\xf5.\rILj\x03\xfe\x8a\x84\x9e>L\x02\x96@\f]d\xfeM%i\xc6\xe0\xb3\xf8\x84\xc7\xf7\x9cA=B\x0e>%\xfd5\xcd\x05mWI\xfa\x90]\xde'\xff\xe7\x9e\a\x12b\x85\xa9{\f\x11\xa0\u05fa;\xe6\xf7\xe4u\x8f\xfdk\xb6\x0e,\xda9|f\xff\x00\xb9c5\xafE\r\xbc\xa1ތq#wL\x1d\t2\xa5iJZ\xa7\x92\x80\x17&J\xda\xe3@\x87`\x92\xa4/Ŭ\xd5\b\xaa\xa0=\xf5\xb4\xb0s\xb6\xe8!\xe1?\xe6!a\x89\x88\xf6/А\xb4g\x15\xbc@\\\x15\xaf\xc0R8@\"\xdc*I\xcb\x06X\xa8{V\xdck\x8f\u007fNH\xe8S\xd2g\xecT\x06j\x99\xee\x92+r:>\xe1\xe9\x03u\x8b\x17Hi\xbc%Ms\xaaÿ\x02l\x1dd\xf4rx\xe0it,\xb6\ai0\xf0\x86\xea\x8b?\x80\x0e\xd0\xc9\t[\x9a\xa6\xa4\xb5+\txc\x9e\xa4%\a:\x04\x93$\xbd\xd1~^#(\xd1G\xa3hO\x8d\u007f\x9c\xc6l\x9f\x8b\x90\xd8\xef\x16,\x16z\xaa;昷\xa4=\x1doU\xc2\x19\xca?Q\x9f \xa1\x0fdI\xd31V6@gH9_\xef\x8f\xd9#\xe5\xf0\x9a\xf7\xe2^\xc8\xe5\x9f\xc2(\xad\xde\x1e;&\x8f\xd2\xf7.$uZ\xe1K\xd2\x1b\xc9\xebk\xf6N\xb6\x0e\fz9\xfc)\xbeg\xb5z\xa8\x1ctCm\\\x81Vl$\x01\xb64\xb5\xa4\xd5\r\x05\xf8\xc47nD(\x81Ԡo\x81/I'\x90u\xf7\xbd\x8b\x14u`\xd0ˡ'\xfeOw\xaa\xe7݃n\xa8\xd31\x97b\xe8\x96\x18[\x1a+i\xad\x86\u009c\xdf\x01ki=̓\xb4\xec@\xc7\xedr\x15U\xbb\xda|Z\a\x85\xa7\xe5\x91\xf9i\x8dA\x9a\xdc\xfe\xb4\xff\x8f\v\xe3\xc9X\x19o\x8f\xdf~\xec\xc0br\xa3\xe21\xfb\x03\a\xea\x0e,\xc6\x13i7\xeegnT\x17\xa3\xec\xa9}\xa7\xe9~\xf5y1\xdf\xdf\xed?@o\xbc\xb8\x14\x9f\xb0\xe7\xc0\x8a\x18*\xe9E\xf1\xcf=\xb7\xd0>\xed\x8f\x1f\xb0\x06;\xec\xb1\xdb\x0f\xe1\xe0\x9b$ݎ\x98]\xb84\xe5(\xdd\xf3v]]\xcc꺺N<\xd8\xc7$\xec\xd8~\xa7\x90\x03ñ\x98{\xf7\x1c\xdah\u007f\x8dd\xb6b\xcfs\v\xf04\xfe\xf4\xa5\xbai\xabO\xa33\xab\xa7\xd5)\xaf\xba\xc7\xd8\x1f8}lQ,\xa9\xa6\\\a\x06\xdd\x1c\x9eN\x88U\xbb/\x1b\\C\x11\xe2\x17\v\xdbvri\xc2\xddc\xbb\xea\xeaHn\x9a\r\x85y\x88\xdc`\nhb\x9e\xa4e\a:'\x84۽\xaf\xfa\xb2\x0e\x06\x97bVi\x04Y\x0e,\x88\x89}\x88\xaaf\xe1k\xdb\uf349\x17.\xe3n\x9f\x1bk\x8f%\xb7.\xbfI/\xa9\xf6-\x8cWt\xf13¢OXH\xa2c\x8b\xe3c\x17\x1d\"\xa1\u007f\xaeN\x88Y|\x86J\xfa\xfc\xa2\x98\xd8ſ\xb7\xdbײ\x06\xfb\x17\xedH\x98\x16\xbf\x88*\x1a\xb97\xde\x19\xb3\xe84R f,\xe4\xf0Н\tO\xffq\x1á\xe1\xfc\x8a\x84\u0605d\xd1\u07b7knL\xfc\x8a\xd7\xe6N[\xb4\x16\xa7\x98\xf6\x01\xb9\xa4\xad\xb4\xbdwNJ\xd8\xf8U\x82\xcc\xe5J\xca\xe8\xe6p^](\x1adC\x11v\xc5\xec\xa2\xefri\xf4\x1eoϪY\xb3\xa1h2\xf5\x06>\xe0\xc1QSPVXU,`\xae7]\xadZ\\Z8^\xae8a\xaa:b\xab;b\xac^`]%\xf6p\xc8\xe7Vu\x82\xb0\xaa\x9f\x16\x13\x85eV\xab!\xfdEªna\xbfnj\x15\u007f\\\xbf+~_\x89\x10\xab광#G\xfeѬt\x06IR\xd5\xd6AR\xb7\x97\xad\n\x05aU\xe7\xf3U|\x13ʧ\xe4\xf1\x05-\xc1\xe9\x03b;\t\xab\xfa2\xfb=\x16\xc7\xef'QbU\x8dKҪ\xbe\x1c\x1a\x19'Y\x15\nª\x0ef?\xffן\xd8\xc2\xe7\v\xf9\xcas-VC\xfa\x8b\x84U\xfd\r\xfb5\x8e\x8d\xdfO\xa2\xf4\xa5\xaa\x13\xf9.\xf2\xc1\u007f\x8fU%'\xa4\xea\x01\xee\xe7\x9fdSIz\xfe\x1c\x91>!AU\xcbC\x03\x16\x19\xd9֖\xcd~\xc8#\xf3!l\x89\xbfw\x17\xb0wж\xd6ec\x06\xf9\x8a\x17|\x1aZ\xe3\xf3U~vT]\xf4ě\xc6\xed\xf50W\xdd3\u007fL\x8e\xa6\r\x9e\xb0H\x8837\xbc\xc5M\xfcсg\x8b\xb3\xbc\x85\xe5\xe19\xad\xd9\x06\xdbv\xf1\xd9\xf4G|\x90\\\x10n2\xab\xdbU5ԛ3\xe5U\x83\xaa\xafȧ^\xad\xaa\xaa\x9a/\x17\x8d\x1b\xfc\\8\xbcl\xa8\x967\x83\xff\x97(\x93\xad{\xf8\x06w\xc5V#}B\xdaT\xdd5R\x16\x14\xca\xc9\xecG#\xc3k<\xf5\xa5\xba\xbd\xf8\xaan\xca\n\xaf\x91\xc7\xe7\x8b\x06Uׇ\x9f\xf3K\xe1L6\xd8ֶ\x80=\x18#\xd6+<\x1dj2\xa9{\xd9+\x1fV\x86T=ͧ\xa8ު\xa8\xb3bQ\x1b\x14\xaa\xf2\xfeɣ|\xce\xee\x95{\xb1\x88-N4\xa9F\xfa\x84t\xa9\xaa\r\rW\x88\xb3Y{\x06\x13\x9dy\xea\xf6⪺K($O3\xe4\xb7\x1aUݔ\xa1w6AX\x18\xbbA\xe6\\!\xe1\xee\xbdϛ^\r\xf5\x1d[\xb7E\xef*\x93ȹ\xeas\xf2a^\xc5\xca\xc8\x11c\xf4\x06\xb9\xaa\x83DۊӼ?yN\x8b\xff\rԛT#}B\x82\xaa~\xb8\x85\x9fV-\u07b2\xe5\x9d8\xaa\x12R\xb0\xe2\x9dz\xbe\x90\xc9G\x16n\xa4\xb7zS\xfd\x04\xf6\xd3\U000e1cbd\xb8\xaaV\xb3\x1fU\xbbN\xb7n\xe2\x9d.c[\xdc4\x9e-<\xb1iӁ\xb6Os\xd9Ҙ\x86?\xfe\x8a\x1f\xe1\u05f6\x99nP\x9e\xa2\xc8< \x05\xfaq\xa8\xef\x98:!\x9a6\xff\x9d-O\b\xb3xg\xadcI\x98⥲\xab\x98\r~.\x9e\xce\x1c3\xccs@\x8c\xa5\x13x\x15\xff\xa3\x18\xd4jR\x8d\xf4\t\t\xaa\xaa\x1eV\x99\xab\x9aÏe\xc49xf\xf3\x87\xfc'\u007fW\xffr\f1\x9e\x93\x8f\xab*\u007f?\x16\xf3\xdaM?\x9e\xbf^\x1c\x17\xe9\x87U˸E\xfcd\xe9\x1f\xd9\xf05\xbc\xcdl\x83\x8c\n\"\x8f\xfd\xb9J\xda\x01\xd9wL\x1d\xf7\x99\xac\xe7OU\x91\xb0X\x9f\xf25C\x14l1ݠP\xd5\xc7\xd6\xdf\xce楙\xa1\x037>\xeeW\x99\xee\x1e\xd2\x17\xa4M\xd5gE\v\x1fX\xd8o{1\xe1\xd3FΖ\xe7^1\x9c\x89\x8d\xab*\xf7\xc5W\xf1\xf2\x81\xc8\x13\xba\xaa\xfc\xc8~\x85h\xe2\xe2\xf3\x89l\xcc\x06\x99p>\xb6\xf4\x1b\xb6\xb0\x87k\xb5Dv\x11S\xf7\xac\xbec\x875\xa2\x8f\x81\xef?\x95\x13vU{\xd3l\x83Bէd\xb1\xf8\xa3Z\xcc\xfe\n\a\x87\xfe;\xc4\xee\x1e\xd2\x17\xa4MUy\u07bd\x88\x88\xc9%\x9f\xdaVEoJ\x10W\xd5M!W\x86=\xb5\xa9U>\xa1\xab\xca=*\x9b\xcb\x19\x1e\xdaP\xcc\x06\xdb\xda\xfe\x0f[\xf0\x89\xf7o\xfe\x86>Bv\x11S\xf7c\xa2\x0f\xf2\xfcC\xaa\xda\xf0N\x9c~gѣ>\xb1\xfd\xa1\xa7M6(T\r\u007f\xb2\xc0\xf7\xb4\xb8\xad\xedU\x12:\xb3\x15\xbb{H_\xd0+U\xf9$-\xac\xaa\xb0.3٠PU\u007fk\xe7\x1f\xc5\xceoe\xb5\xde?\x99\xef\x1e\xd2\x17\xa4\xa0*\x9f\xf6\x89\xdf\xff\x97\xfc$\x8d\xa9\xaa|\xc4yB4\xb4~d8\xad\xda\xf3\xe5*\a^~B\fl\xc4\xcb\xe7\x00\xfa\x04\xc0\x17\xa9\b\x11\xabj\xb5Q\x98\xd0\\ \xa6\x8e\xf7\x19\x9as\x8e&B\xd5\x12u\x87\xf8\xd8\xfb\xac\xc9\x06\x85\xaa\xfag`\xfc\xb3\x86\x91\xaf\xe8\xeb\xc5\xee\x1e\xd2\x17\xa4\xa0\xea\xe0\x90\x1dr$3U\x95\x1fV\x15\x88S\x8c\xbf&\xdeb\xf5c\xf5\xf8\xaa\xb6n\x97\x9fK\xf1uŨ͵\x12\xc3+\u007fo\x97\xc7I[B\xba\xc4l\xf0\xcb|\x12\xc5\n\xd3:~\x12u\xa4h\xd8Ç\xf0Z\xe9\xb8\x16:\x9d\xb6\x8b\x1fj-3٠QնG\x89\xfc\x04W\n\x1a\xbb{H_\x90\x82\xaa|\xe8\x11\xf6\x89\x93<\xa6\xaa\n\x89\u007f\xc5\x1e\u007f\xce\x1b\u0087Μx\xaa\xee\xe2}D\xa6\x15\x1f\x86\xba\x17\xb3\x88\x85la0\x1f%\xdf!${\xec\x01\xb3\r\x8a\x832\xfd\x13'~\xf2\xf4\xe16\xb3:qҊ[|\xba\x8c/Նv\xb5@|\xb2\xfa\xfe\b\"7\x1d\xb3A\xa1j\xe4\xe4D躘Їb\xb1\xbb\x87\xf4\x05)\xa8\xca\x15\xf2,|\u007f\x8b_\xfc\xbeLUm\x9bƟ\xf2\xd7.*\x0e\xfd\xf2u\xb8\xaa\x85\xe5:[\xf4Q\xb5X\x18s\xb8\xf5C~r>\x8fK\xc0\xaf>͙\xff\xd4\u007f\xca)d\xf1\xab\xbb^\xe1\xdb\x11g\xdfc6\xc8ŋ\x9c\xd2\xe4\xf2\x90\xed\xa6;Ƈ@\xf2D\xc3o\xe4y\xffڶ\xf0\aq\xf9c'ɹ\a?5\x1b\xb3\xc1(U?\xcf\x15\xa5\xa1Kwcw\x0f\xe9\vRP\xf5U\x12\"\x93\x8fB檪\x1f\xac\x1a\xaeʟB\f\xd4ꪾ\xefS\x9a\xf9Ǖm\xb5z\xc9\xca\xc83Y\xc2\xfb\xe8\r\x8a\x93\xa4\x91\x8b\xbeŅ+\x95\xa6;\xf6\xa1\xbe\x99a\xb2\xef\xb6\xc3\xfa\xd5\n\x9c\"!d\xf4\x06\xa3Tm\x9b\xc7\x1f\xeb\x17p\xc5\xec\x1e\xd2\x17\xa4\xa0j\xf8\xe3\xf9\xac\xfaY$\x9e\xaam\x1f\x8d\b\xff\xf6\xaa\f\x1f\x8b\xc7U\xb5\xedͼp\xa3W\x9e\xac:,\xcf\xcbs\xd3\xeb\u0082\xe5ɋ\xb0\xa37\xc8?0\"\xcaG\r\xfc\x9cTN\xab鎽\x19\xba\xfezn\x1d\t\xff\x83\x952\xa23)\xd4I\xd4\x06\xa3U\x15\xb3\x86\xc8e\xb1ѻ\x87\xf4\x05\xa9\xa8\xda\xf6ʣ\xb9\xdea\xf3\xf6\xb4\xf5\xa0j\xdb\xe7+\xa7\f\xd6|ß\n\x9f\x8d\f\x11_ն\xd6\x15S\xf2\xbcZ\xee\x98g\xc3\xce}T>X\x1b\x92]\x92OH\x93Y\x91\xa1\xb2\x81\x90\xfc\x12\x8dTHU\xe5F\f\xab0;\xb35\xff\xa3\x1eR\x19\xe4\x0f\x1e\xce#\xf9l\xf3\xc5\x1d\x14q6\xbdQ\xf5\xcc?\xe8\xaa\x1e\xd4\x1bê\x92Ql\bl\xd2\xc8\x06}\x02ОMj\xeePڒK\x1a\xb9E\x9e\xe1M\xcd\x1b\x8c\x85\xcd\xc4LJ\xdc@6Yi\x14\xf0\xebl\xb2\xa0\x83\x06k\x89\xf7\x92I\x91Zy\xd4C\xea\x83\xf4\xf2\f\"U\x95\x1b1\xac¶8\xfc$\xa5\ar\xc9F\xf1`\xd8>J?\xd0\xc8f\x8a8\x9bި\x1a\x19V#\x83jDտ\xf0GU\xa4JW\xb5\x86\x94\x89\x8a7\xc8(n\x119F\xa3\vk2\x16\x89\x8a\x1a2\xc7(\xe0\"\xe2\x0fu\xbeޤH\xad\x9cEj\xf8\x8f\x8eaRU\xb9\x11\xc3*l\x8bG\xf9\x837H\x91x\xd0\xca\x1f\x88\xcd#\x8e\xa6W\xaa\xea\xc3jdP\xd5U-\x16\x8fV\xf1Ö\x90\xaa\x85\xe4m\xd1\xd6\xe1!\xa7\x98EE\u2061\x90ޓo\xc3\xcbȓF\x01\x8bC\xab\xb6\xb7\aM\x8a\x94ʮl)'k\x13\xaaʍ\x18Vi \x13d\x9b\x97\x1c\xd77_\x8f\x87W\x8e\xa7W\xaa\xd2\u007f\x8f\x19TuU\xe5\b\xba\x9e\xcc\b\xabz\x8bM\b\xc7\v4\xd2\xccܐ㤡\x90\x95\xeeް\xb8b(!\xb3\x8d\xaajr\xec\v\x11]\xa4T\xb6\x93̠Xh\x96\xaa\xfacWi\x90\xe3.\xf7\u007f;{ +6ꕈS靪_\xfcC\xf4\xa0\xaa\xab*G\xa9\xf5\xdcD\xa9\xeay%\x05\xb8\x91YT!\n\f\x85\xc1U\xecȉd\x94L\x88R\xf5\x0e!\xed\xfa\x06b\x8b\x94\xcaC$K.|\"U\xad\x88]\xa5\x81,\x95%\xe3\xc8\x1b\xfa\xe6QU\xe7\xd3;U\xe5\xb0\xfa#\xb5%\xae\xaa\xd7\t9\x11)3U\xb5\x96dTn\xde\u007f\x8b\xd6E\xa9\x1a$\xec\xbd:Ll\x91Ry\x82d\x18FՊ\xd8U\x1a\xc8\x02Y;\x9a\r\xee\xa8*\x1cz\xa9\xaa\x18V\xd5A5\xbe\xaat\b?\xf2紜\xec2U\xf5A6;j\xe2TGO\x00\x86\x8b\xb3T\x94\xbe=m\x95I\x91R\xf9\xc0\x1b\x9a\xab\xaeTT5\xae\x12~Ͽ\xa3\xb1\xa1\x1aU\x85C/U\xe5êaP5S\xf5\x1e!\u007f\xa3\xfc(\xbbD\x8cx\xdb\xf9)'3U/\x84\x06\xcf[\x05\xfcIU\xd5\x1a9\x93\xa5e\xa4֤H\xad\xac\x90cfW\xb1\xa2\xaaq\x95\x06\xa2\xb5\xcb-\x97PT\x15\x10\xbdU\x95\r\xab\x86A\xd5LUvT\xd4x\xa7\x8b\x1e\xf7\x9297\xd9,2\x97T\x9bO\x00\xba\x06\x91\x1a&\xf3Y?\xe1k\xa9\x02\x9e\xf6\x91e\x0fh\xb0\x8ed\x9d7)R+\x0fgx\xd6\a\xe9\xcd'\x89\xa2\xaaq\x95\x06BJ\x98\xab\xdb}\xec\xfd\x1fU\x05DoU\xa5\xffn\x1cTMU-a\a5\xcd\xe2<\xbf\xb7d8\x93\xa8#\xce\\\xb5\x9e\x90\xa1\xfe\xb1\x9e\x9cE\xe4\xe1\xe8O\xab4\x92S\x92K\xb4&\xb3\"Ce=\xff\xb4\xcaG\xc6q\xf7\xc2\x1b1\xac\xd2@\x86y3K\x86\x11RKQUH\xf4Z\xd5/\x8c\x83\xaa\xa9\xaa\xc7'zs\xde`?O\xfc\xacH\xf3\x95\xac\xe2\xd7Y\x9b\xaaJ\x9b'\r\xf1\x8e^t首\xd1n\x14\x90\x1e\xaf,\xc8\x1cR\xc1/$\x88-2V6\xfb\ay'47\xf0)Cx#\x86U\xd8\x16\x8f\x94e疵\xa8\x9bGU\x9dO\xafUu(+ȼ8\xcf\xe0\xc5T@\x19h\xaa\x96\x95\x04\xc4ωd]\x9c\nT\x15(\x03M\xd5\xf9☩c1ɽ\x1c\xa7\x02U\x05\xca@S\xf5B\x11\xc9\x1cU\xec#Y\xcd\xf1*PU\xa0\f4U\xe9͕%\xb9\xbe\x115'\xe3\x16\xa0\xaa@\x19p\xaa\"\x03\x15T\x15\x01\x02\xaa\x8a\x00\x01UE\x80\x80\xaa\"@@U\x11 \xa0\xaa\b\x10PU\x04\b\xa8*\x02\x04T\x15\x01\x02\xaa\x8a\x00\x01UE\x80\x80\xaa\"@@U\x11 \xa0\xaa\b\x10PU\x04\b\xa8*\x02\x04T\x15\x01\x02\xaa\x8a\x00\x01UE\x80\x80\xaa\"@@U\x11 ؤ\xea\xc5o/^\xb9ml\xba}\xe5\xe2\xb5k\xdd\xe6\xe5\b\x12\x83M\xaaF\xf8x\xed\x15\x8a\x82\"\xc9c\xaf\xaa\xf7)]\xfd\xd8_\xf9\x0f\x04I\x12{U\xa5\xfc}\x1f\xc7T$\x15\xecT\xf5\xfe\xfd\xce\xfb\xf7\x0fn\xbb\xc6~t\xa3\xafH\x92ة\xaa`u\xe99\xab\x12\x041\xc1vU\xbb\xafXU \x88\x19v\xa9\xca\xde\xf0\xbf\xd8\xf6۵kּ\xbe\x8d}[\xfb\xd6{\xdfY\xad\x81 \x06\xecR\x95\x1d\xf4\xaf}\xbct\xfa\xe4ɓ\x1fa\xff\x9f\xfe8\x9b\x06\xe0y\x00$\x19lT\xf5\x85\xc9\x1f\u007f\xf6\xe7\xcf\xfe\xcc\xf8\xec\xb3_N>\x83\xaa\"Ia\xa3\xaa/\x96\xde\xd5\x1f\xae)=C;)ڊ$\x8e\x9d\xaaN\xffB\u007f\xf4\xc2\xf43=U#H\fv\xaa:UW\x95.GU\x91$\xb1Q\xd5\xe5\x8f\xdd\xd8\xf6\xa3\x1f\xfd\x1b\xfb_\xe9\xfd\xdfN\xbf\xb8wm\xe7\xc15\xca\xf5\x00G<\x84\x90\xb9\xfa\n;\xf2\x9aL;\xb2\xa0\xde\xfbk\xb3\xe6v\x8d\x14\xf3\x9fGg\xe4\xe7Lk)\xd9mV\x838\x1b\x1bU}~&\xfd\xe5\xf7\xfe\xee\xfb\u007f\xf7\xfd\xef\xfd\xf7\xcemSo\xbf\xfe\xd8\xed?\x94*\aW]\x9f\x8c-\t\x9c\xd7W\xf8 \xfb\xed\xd8^Z\x0eŶ\x19)\xd1J̚\x83\xfb\xaa4\xf6\xe3\x90V\xde\xf4F\x05\tGh#\x90\xb0Q\xd5\x17J\xbf=\xb7m\xdb{\xec\u007f\x1fӗ\xa6\x9e\xbb\xf2Y\xf7\x95/:\xd5\x1a\xbf!<2Hc\x99\xf0\xa4I\xa3\xca\x1dO\xa5\xe7\x96\xe93u\\\xd52?\xeb5X\x85\xaaB\xc4FU\x95\xb9j\xb7\xe9\\\xd5o\x99s:~\xb6EA\v9DZL\x9f\x11\xaa\x0e\xe7\xf9\xaf\xf4(Iin\x81\xf4/v\xaaZzN\xceLٷ\xff\x98z\x86ލ>Y\x15Q\xf5\xba\x8f\x10\xcfV\xb9\xbc\xb3\xacH˟1,H\x9b\x88d\x1co\r\xbe\xf6hv\xf1\xc2\x0eJ\x9f!\xda\xc6\x05\xc5YegEq\xddPZ\xc8\x13\xa9\r\xad\xdfT\x16\xe6\xce\x12\x13\x80'\v\x8e\xf1u\xb7\xdfR{8\x92I\xc8\xd2S\x95\xc3}e]\x8d\xac\xfb:ZG\xc4\x14A/@\x1c\x81\xad\xaa\xde\xd0\x1f\xae)5\xf9\b@\x19U\x0f\x05\x02\xde:\xb1t \xa3\xf2\xed\x1d\x1b\xf3I\x17\xbd\xb3;0zZ \x108\xc1\x9b\xe7yj\xb67\xe4\x8d\x0fҿl\xcd$yu\xbfΑ\x19\xd5\xfeYt6\xefEm=\x95S\xbc\xb9\xa9\x8cpUۋ[\x94FZ\xa7\x8cb#c\xb0\x84\xabJ\xaf\xae\x98\xa0\x91\xdcƨ\x1e\xe8x\xe2\xbfI\x837\xd9\xd2<>\x1b\xae\xfcYt\x01\xd2\xffب\xea[?}\xact\xaa\xa4\xf4\xa7?\xbf\x98\xa0\xaa\xe7\v\x87\xd7l<\x1c\x94#\xa1\xae\xea\x93#\x1et1\x86\xf2\x93[\xda\x1c\x1a\x9a\x8a\xd2#dw\xc7nr\x84\xaa\xad\xd7\xc9F\xfex\xa9\x16Z\xf5ގ2\xb2\xdd\xd8\x03\x1d\xaf}\x1dz\xb6\xc5\xd7A;\xb2Z\xa26\x818\x00\xbbTe\xdc8w\xe6\x8b0\xe7\xbe5\xb9\xb6\xdaTUz}\xc3\xecb\x92\xbf\xca8\xaa\x96\x84\xe6\xad\xfc\r^\xe3\x85R\xd5\x06\xd1\xd8@\xd5\xd6CDĮ\x8b\x82\xfd\xdf\xf0\xc5\xe0\xa4rc\x0ft\xfc\xb8\xf0V\xbb\xf2\x9bhS~0j\x13\x88\x03\xb0QUK\xa4\xaa\xb7\x96]\x15\x8fB\xaa\x1eZ̼\xb9\xbeշ\x8e?\x10\xaanf#`\xe5\x88C\x02\x9e\xa4\xae\xa8:k\xdc\xfe\xfd\xfb\xc7͢j\xeb߈Xu\x0e/(\xa8\x11}.\x19e쁎\x9f\x15\xde\aZSA+D\x95\xa1\x00\xe9\u007f\xecT\xb5\xbb\xfb~\x98n\xb3\vU\xa4\xaa\x87\xc9N\xf1(\xa4j\x1d\x11q\xe9\xfe\xeap\xc5%~t\xde,O\x8d.YI\r\xaa\x16.d\xdf\x16\x14RC\xeb\xc4\"\xe6\xfeI/_\xcc/\xe4\u007f\x06An\xa6ڃz\x12l\x8f\xf7\x82w\x0f_0\x14 \xfd\x8f\x9d\xaa\xf6Lמ\xb1%\xec\xf8>\xb0\x81\xbda?\xf8$\x10\xf0V\x05v\xde\xe4\xaaf\xd7~\xd04W\x9e-\xad\xd3\xea\x9b\xfc\xd9\xfc#\xad\xc5\x19O\xbf\xcdZߠ\x17\x02Zվ\xe0\xe1*-p\xa1\xa3\x99,\xb9C\xef\xfc\x8a4\xdfSZ鱬\xa2\xba\xa5\x83=\x99\xbf;N\xf3IAms\x93\xdfwR\xed\xa1k\x8f8\xb3\xd0.w#XXV(\x0f\xfa\xf5\x02\xc4\x118Gգ\x9e\xd0\xe4\xd0w\x82\x1e\b-o\xa0\xf4\xb5iuEZ\x81_\x9e\u05ffW3\xd87m\xbfXl\xf6\x0fɝ\xd2\xccϠ\x12\xa2\xb5f\xb3\xef\xcf\xec\xc8\xe0\xe7C\x9b\b\xc9ء\xb4Rz\xaa|\xf0\xf0\xe7~\x97\xc9\x16'l^R\x9c\x9dWq\xd2\xd0\xc3\x11\xb9\xb1\xf2\xd0~\xd4k\xf5\xa1\xa5p\x01\xe2\b\x9c\xa3*\x82\xf4\b\xaa\x8a\x00\x01UE\x80\x80\xaa\"@@U\x11 \xa0\xaa\b\x10PU\x04\b\xa8*\x02\x04T\x15\x01\x02\xaa\x8a\x00\x01UE\x80\x80\xaa\"@@U\x11 \xf4\xb3\xaa\x18\x12\x84$J?\xab\x1a\x01C\x82\x90\x9eq\x86\xaa\x18\x12\x84X\xe2\fU)\x86\x04!V8AU\f\tB\x12\xc0\t\xaa\n0$\b\xe9\x19Ǩ\x8a!AH\xcf\xf4\xb7\xaa\x18\x12\x84$H\u007f\xab\x8a!AH\x828@U\f\tB\x12\xc1\x01\xaabH\x10\x92\bNP5\xa1\x90\xa0\xa6G/\xc5y&U\xaeN\u009bWC\xc2\t\xaa&\x12\x12\xb4\x8a\xd4Eݓ\xb7\xd7a)\xc1U\x9e\xd8\xfbQa\u038bcq\x80\xaa\x16!A\x82\x06\xcfkQ+\xa6#,e{fCt\x13\xe6\xbc8\x16\a\xa8j\x11\x12\xc4i\xd3\x16\x87\x17/\xfb\xe5]$\xd3\x12\x96\xb2L;\x1bӆ9/\x0e\xc5\x01\xaaZ\x86\x04Q:\xb7@O\x8f8F\x8e\x89\x9fi\tK\xb9S\x10{Oj\xccyq(\x0eP\xd52$\x88>\x18\xb4H.4\x8c~\xf7\x049\xb1}\xf4\xfaT\xc3R\x94\x02\xd1\xe12_L\x82\n\xe6\xbc8\x14'\xa8j\x15\x12D\x0f\xcb{\xa4\xf3_7y\x98\x94\x90Y\xe7S\rKQ\nĚ\xbb\xc9\x1e\x1a\x05\xe6\xbc8\x14G\xa8j\x11\x12D\xb7\x93\x93\xe1\xc5f\x8dh\U000969e9\x86\xa5D\n\x18gI\xcca\x13\xe6\xbc8\x14'\xa8j\x15\x12\xc4\xdetC\xb7\x94\xbe\xba@+$\x85\xde\xe7\xfe&\x1f\xa6\x14\x96\x12)\xa0\\\xd5F\x1a\x05\xe6\xbc8\x14\a\xa8j\x19\x12D\xf7\x91O\xe4ª\xfc\r\xc7\xc9_\x1a\xf2W\xf6\",%R@\xf9p\x15sr\x13s^\x1cJ\u007f\xabJ\x13\b\t\xa2\x1dZH\x18\xfa\x80\x1e#\xc7\xe9\x83`/\xc2R\x94\x02\xaeN\xccI%\xccyq(\x0eP5\x01f\x8d\xd2\x0f+\xce\xe7\xca\x13\xf4)\x87\xa5\xa8\xa7\x9a\x82\xc5\xe1\x04\x00ھ\xb2M.`\u038bCq\x82\xaaV!A\x94\x9e\xf0\xc4|P\x99ZX\x8a\xb1\x80\xd6\x13\xfd\x83\xa7\n2\x83\xff\xc0\x9c\x17\xc7\xe2\x04U\x13`\x997zN\x99ZX\x8a\xb1`\xa7\xef9\xbd\xbf\xcdy\x1b\xf8\x0f\xccyq,@T\r\xce\xd7\x1a\xadj\x92\xa6Q\x9b\xdbeU\x838\x06 \xaa\xd2`\xfd\xd0t\x1fY\\-X\x89'\xd6\x01\x01EU\xc4\xf5\xa0\xaa\b\x10PU\x04\b\xa8*\x02\x04T\x15\x01\x02\xaa\x8a\x00\x01UE\x80\x80\xaa\"@@U\x11 \xa0\xaa\b\x10PU\x04\b\x0eU\x15\x93W\x90h\x1c\xaaj\x04L^A$\xceV\x15\x93W\x10\x1dg\xabJ1y\x05\t\xe3dU1y\x05Qp\xb2\xaa\x02L^A$\x8eW\x15\x93W\x10\x89SU\xc5\xe4\x15$\n\xa7\xaa\x8a\xc9+H\x14\x0eV\x15\x93W\x10\x15\a\xab\x8a\xc9+\x88\x8a\x93UM(y\x05q\vNV5\x91\xe4\x15\f\tr\r\x0eV5\x91\xe4\x15\xdbB\x82\xd2\xd0/\xd2;\x1c\xacj\x02\xc9+\xf6\x85\x04\xa5\xa5_\xa478X\xd5\x04\x92Wl\f\tJK\xbfH/p\xb0\xaa\xd6\xc9+v\x86\x04\xa5\xa5_\xa4\x178YU\xcb\xe4\x15;C\x82R\xeb\x17I\x1f\x8eV\xd5*y\xc5ΐ\xa0\xd4\xfaE҇\x93U\xb5L^\xb15$(\xd5~\x914\xe1`U\xad\x93Wl\r\t\xa2)\xf6\x8b\xa4\t\xa7\xaaJ\x13I^\xb13$(\xe5~\x914\xe1`U\xad\xb13$(\xe5~\x914\xe1dU\xad\x93Wl\f\tJ\xb9_$M8YUk\xec\v\tJ\xb1_$}\xc0Vվ\x90\xa0\x14\xfbE\xd2\apU1$\xc8=\x00W\x15C\x82\xdc\x03tU\x11׀\xaa\"@@U\x11 \xa0\xaa\b\x10PU\x04\b\xa8*\x02\x04T\x15\x01\x02\xaa\x8a\x00\x01UE\x80\x80\xaa\"@@U\x11 \xa0\xaa\b\x10`\xaaڍ!A\xee\x03\xa6\xaa\xf7)}i&\x86\x04\xb9\v\x98\xaa2:\xa3\xc2\x02\x91\x81\x0eLU\xd9;\xff\xde\u05ef\xe1\x04\xc0U\xc0T\x15'\x00.\x04\xa6\xaa\x14'\x00\xee\x03\xa6\xaa8\x01p!0U\xc5\t\x80\v\x81\xa9*\xc5\t\x80\xfb\x80\xa9\xaa\x9c\x00tw\xd2\xee\xfb\xfc\v\x87W7\x00S\xd5\xd0\x04\x00q\x130Uet\xde\xe8y(Ő\xa0\x81\x06LU\xf95\x00o\xdd\xdf\xfbR\xe7\xde\xd5\xec\xeb\xee\xc1\xb51\x15\xb6\x85\x04U\x11B\xb2NŶ\xab\xfc\xad:\xdf7\x03o\x83\xd1K`\xaa\xca\xefi\xfd\x93\xef^\x9fy[|\xdd\xd8\xf6\x93\xe8\x02\xfbB\x82\xce\x06\x02\xeb·y\x8d\x87\xbf`\xc3\x1c\xdf\xf5\x9ek\x10+`\xaaʸ\xfb\x1d\xbd\xf6\xd7\xd0\u05cdsQO\xda\x18\x12D\xf9}\x83{V\xf5*i\xa0\xc1\xe8\xfb\xb5\"\xc9\x02SUq\x06\xe0J\xfc\xe7m\f\t\xa2֪\x9e\xea\xddF\x11\tLU\xc5\x19\x80\xaf\xba\xef\xc69YegH\x10UT\r\xae\x1f\x975v\x9d\x98\x94^\xae\x1c2t\xe1\xc2!ٍ\x0f\x86ț\xad/\x88]\x0fI\n\x98\xaaҞ?\x02\xb03$\x88*\xaa\xceіn_\xaaU\xb1\xa5\a\x0f\x17\xac\xab\xf5\xfa6\x97\xd5\xd3Á\xad\xa4.\x10\xb8\x10\xbb\x1e\x92\x140U\xb5\xb8\x06\xc0\u0590\xa0\x88\xaaͤ9\xfc\xbd\x91\x1c\xa1t\x1d9.\xdaq\x02\x90\x16`\xaajq\r\x80\xcd!AaU畈\x1f\x0f\xb3auq.[8\x19R\x14UM\v0U\xa5=O\x00\xec\f\t\xa2\x11U'\xc9\x1b\xad\x97O\xa4\xb4>\xe32\x1f_\xe5\x11\x1d\xaa\x9a\x16`\xaaj1\x01\xb03$\x88FT\x9d;\x82{\x1e\x1c>\x87ү=e_\x1f\x19=I\x9e\xf6GU\xd3\x02LU\xad.\x02\xb41$\x88FT\xdd.&\xb7[\xf9\x1c\xe3\x10\xc9'\xc4\xff\x8d|\x1eUM\v0U\xa5\x16\x17\x01\xda\x18\x12t\x9e\u007fZU\x1f\b\xf0\tm\xa5g\xf1\xbb\x8b=\x95l\xe9\x90w\xc7\xf6\xc07\xa23y\x06`\x1f~\xae\xda[`\xaaj\xf9\xaf\x00\xec\v\t\x9a\x13\x9a\xd7\xf2\xd3\a\xc1\x86\x92\xac\x12q^u\xb7\xc6۴i\xc7\xe8\xbd\\\xf1t\xe6\t\x8a\xf4\x0e\x98\xaaZM\x00\xfa;$\xe8Rv\xf5\xa5\xae\xae\xeb\a*\x06\xe3'\xffi\x03\xa6\xaa\xd4\xf2_\x01\xf4oHPS\xae\xac\f\xe6c\xccZڀ\xa9\xaa\xe5\x04\xa0\x9f9䑧\xa9\x8ey\x0e[T\"\t\x03SU\xcb\t@?\x13\x9c\xeb\xabnli\xac\xf6U':\x0e#\x96\xc0T\x95ZN\x00\xfa\x99`SY\xa1VX\xf6.\x9a\x9a>`\xaa\xea\xf4\t\x00\xd2\a\xc0T\xd5\xe9\x13\x00\xa4\x0f\x80\xa9*u\xfa\x04\x00I?0U\xc5\t\x80\v\x81\xa9*N\x00\\\bLU)N\x00\xdc\a\xaa\x8a\x00\x01\xa6\xaa8Wu!0UŹ\xaa\v\x81\xa9*\xc5\t\x80\xfb\x00\xa6\xea\xb6\xce+w;\xef\xdfg_{_\xbf\xc2\u007fܧ\xf7\xef\xde\xed\xbck\xb5\x1e\x02\x1f`\xaa\ue95d\xfc\a{\xe7\xff\x8f\xd238\x01p\x15\xc0T\xedԗ\xae\x9c\x89,#n\x00\x98\xaa\xfc\xa0\xff\xe0\x1fV\xbf\xb0|\xf9\xf3\xbf\\\xbe|\xf9\v\xbf\u007f\xeb6\x9e\ap\t\xd0Te\xef\xf9k\x1e/e̔ߧ\x9e\xc3i\x80K\x00\xa8\xea\v\x93\xf7~u\xe6\xab\xef\xe8\xc53_}\xf5\xfcd\x9c\xb1\xba\x05\x80\xaa\xbeX\xfa\x1d[x\xef\x17\xfc\xe1\x9a\xd23\xddw1\xb6\xc2\x15@Tu\xfa\x17l\xe1_\x1e\xda\xcb\x1e-\x9f~\xc6j\rd\x80\x00RU\xae\xe7\xffx\x88\v\x1b_U\x8c\xad\x18h\x00Tu\xf9\xcc\xdb\u007f\xf8\xd7\x1f\xfe\xb7\xef\xfd\xf3\xbf\xfe\xcf\xfb\xafO\xbd\xf2\xf1\x8b\x9d\a_\x8a\xa9\xb3-\xb6\"\x01\x8e\x97e\x17T\xb6\x14\xa4\xfbO\xc7m\x00T\xf5\xf9\x99ݿ\xfc\xc1\xf7\xbf\xf7\xd0\x0f~\xf0\x8f\x9doM\xbd\U00047677\xfb3\xb6\u009a\xe6\xec\t\x1b\xb7\x96\x10\x82\xf7W\xe9\x1d\x00U}\xb1\xf4ܕ\x83\a\u007f\xf8\xfd\xb5\a\xffLWO\xff\xea\xc6W\xf4\xf6\xb7QU\xf6\xc6V\xf4\xcc՜\x8a{\x94\xde\x19\x85\xaa\xf6\x12\x88\xaaN\xfd\x8c-\xfc\xf0!6K\xed^^j:W\xb57\xb6\xa2g\x16\xfb\xfe\x1f\xffQ\x8f\xaa\xf6\x12\x88\xaa\x96^d\v\xa5\xffą]=\xdd\xecd\x95\x8d\xb1\x15\xcf\x10m\xe3\x82⬲\xb3T\xed\xb7\x96u\xb3\x95neߗ\xd1Q?\x13\x85\x97\xeb\xef)\xb9\x16\xcaj\x86\x1e\x90\xf8\x80T\xf5\x9a\xfe\xf0%ӋVl\x8c\xad\xf8\xcb\xd6L\x92W\xf7\xeb\x9c\nC\xbf\x97\x9e~\x94usk\xf7\x94\xca\xcb\xf7<\xe1\xbb\vR%\xd7BY\xcd\xd0\x03\x12\x1f\x88\xaa>\xfe\x8b\xe5\xcf?\xbf\xe6\xf7\xec\xdb\xf2\xc7\x1f1\xbb\xc0\xda\xd6\xd8\n-\xf7,[-ϸ\xdak\xc5\u2e52\xd7h\xbb2\xe5Pr-\x94\xd5\xd4E$>\x00U\xdd\xf6\U000d93d5J\x1e\xfb\xf9/\xae\x98\xa8jkl\x856\x87\xf2\x1b\xaf\x1bW;\xe2\xb9\xd7\xf1\xda\xf5.\xed\b}\x90\x19\x19U\x95\\\ve5u\x11\x89\x0f4U\x19w\xaf\\\xbc\xf8\xed\xb7\xd7\xee\xb2o\xdf^\x89\xcc\x05\x14l\x8d\xad\x10\xb9\x03B4e\xb5{\x99G\xebɲ\x13\x1e6?\r\xcdU\x1f4\x1br-\x94\xd5\xd4E$>\x00U\xa5\xe2R\xc05?\xbd\xe2\x8c؊\x88h\xeaj\xc5[\xfdS\x8a\x9b\xf84`\xb1Ot\xd3H.\xa9\xb9\x16\xa8j\xd2\x00T\xb5\xbb\xb3\xf3Fg\xe7O'\xef\xed\xbcq\xbf\xd3\xfcB\x15;c+\"\xa2\xa9\xab=]\xa35\x93g\xf8\xec\xf7jN\x05;\x98\v\xfa\x87\x1br-Pդ\x01\xa8\xaa\xe4\xf6\x95\x1e.\xa9\xb6/\xb6\xe2B@\xab\xda\x17<\\\xa5\xf1dJ}5JWf\xe5\x04G\xfbV\xf0\x92\xe6\xacI\xbfk*\xcb\xe43\a=\xd7BY\xcd\xd0\x03\x12\x1f\x98\xaavR\xba\xf6\u007f\x9f\xa1\xf1\xffɊm\xb1\x15\xcf\xf0t\x8a\xd6l\xf6\xfd\x19e5J\x0f\xe5\xd6\xd2U\xd9\xfbE\xe9\xf1\xb2\xac\xfc\x8aV\xbe\xa4\xe7Z(\xab\x19{@\xe2\x02Sջ\x94\xb2\t\x00\x8d\xff\x0fU\xfb9\xb6\x02\xe9\x03`\xaaJ-&\x00\xfd\x1d[\x81\xf4\x010U\xc5\x1b\x01\xb9\x10\x98\xaa⍀\\\bLU)\xde\b\xc8}\xc0T\x15'\x00.\x04\xa6\xaa8\x01p!0U\xa58\x01p\x1f0U\xc5\t\x80\v\x81\xa9*N\x00\\\bLU)N\x00\xdc\a\xaa\x8a\x00\x01\xa6\xaa8Wu!0UŹ\xaa\v\x81\xa9*\xc5\t\x80\xfb\x00\xa6*\xc6V\xb8\x17`\xaabl\x85{\x01\xa6*\xc6V\xb8\x17`\xaabl\x85{\x81\xa6*\xc6V\xb8\x16\x80\xaabl\x85;\x01\xa8*\xc6V\xb8\x13\x88\xaabl\x85+\x01\xa9j_\xc7V`@\x85\x13\x01\xa8j\x8a\xb1\x15I\x90r@\x05҇\x00T5\xb5؊\xe4H-\xa0\x02\xe9K\x00\xaa\x9aZlE\x92\xa4\x12P\x81\xf4)\x10UM)\xb6\"IR\t\xa8@\xfa\x14\x88\xaa\xa6\x14[A\xe9\xe9Y\xf9Z\xc1\x8cohb\xe9\x111\x01\x15\x94\xee,+\xd2\xf2g\f\x13\xf7HM8\xf8\x02I\x17 UM%\xb6\x82\xb6d\x8f[\xb5\xa3\x8e\xf0{\xfd%\x92\x1e\x11\x13PA\x0fdT\xbe\xbdcc>\xe1\xb7XK<\xf8\x02I\x17\x10UM)\xb6\xa2\xa3\xa8\xec\x1e\x1bo\x1b\xaf&\x98\x1e\x11\x1bP\xb1.\x8fK\xba.7\x98l\xf0\x05\x92\x16\x00\xaa\x9aZlE39\x1c~:\xa1\xf4\x88\u0600\x8a\xf3\x85\xc3k6\x1e\x0e\xf2<\xa1\xe4\x82/\x90\xb4\x00MU\x9ajlE=\xd1'\x8e\t\xa5G\x98\x04T\\\xdf0\xbb\x98\xe4\xaf\n&\x1b|\x81\xa4\x05\x80\xaaҔb+vD\ue35ePzDl@š\xc5l\xb5\xeb[}\xeb\x92\r\xbe@\xd2\x02@US\x8b\xad\xb8U\xe0\xe7o\xdd5\xf3\x13K\x8f0\t\xa8\xa8\x13\x93[\xea\xafN6\xf8\x02I\v\x00U\x95$\x1b[A[\xbc\x0foh\xae!\x9biB\xe9\x11\xb1\x01\x15L\xd5\xec\xda\x0f\x9a\xe6\x12>\x17M<\xf8\x02I\x170UM!\xb6\x82ғ\xb3\x87\x0e\x9a(\xaeC\xb1N\x8f0\t\xa8\xa0\xafM\xab+\xd2\n\xfc-\xe2A\xc2\xc1\x17H\xba\x80\xa9j_\xc7V`@\x85\x03\x81\xa9*\xed\xdb\xd8\n\f\xa8p\"0U\xc5\x1b\x01\xb9\x10\x98\xaa⍀\\\bLU)\xde\b\xc8}\xc0T\x15'\x00.\x04\xa6\xaa8\x01p!0U\xa58\x01p\x1f0U\xc5\t\x80\v\x81\xa9*N\x00\\\bLU)N\x00\xdc\aXU\x11\xb7\x01SU6I\xfdxm\xfc\xebU\x91\x81\bLUq\xae\xeaB`\xaaJq\xae\xea>`\xaa\x8a'\xab\\\bLUq\x02\xe0B`\xaaJq\x02\xe0>`\xaa\x8a\x13\x00\x17\x02SU\x9c\x00\xb8\x10\x98\xaaR\x9c\x00\xb8\x0f\x98\xaa\xca\t@w'\xed\xbeϿpxu\x030U\rM\x00\x107\x01SUF獞\x87R\x8c\xad\x18h\xc0T\x95_\x03\xf0\xd6\xfd\xbd/u\xee];\xee\x1e\\\x1bS\xd1/\xb1\x15Gg\xe4\xe7Lk)\x89\xbd[\x06\x92\x06`\xaa\xca\xef\xb2\xfa\x93\xef^\x9fy[|\xdd\xe8\xdf؊\x96\xf0-\x83\x0ei\xe5MoT\x10y\xbb*\xbdռ\x16I\x1a\x98\xaa2\xee~G\xaf\xfd5\xf4u\xe3\\ԓ\xb6\xc6VLx2\xb4P\xe6g\x03\xe6\xac֍\x00\x00\aLIDATy\xb0J\xaa\xaa\xb7\x9a\xd7\"I\x03SUq\x06\xe0J\xfc\xe7m\x8d\xad\xd0\xef\x048|\t\xff~\x944\x19Z\xcdk\x91\xa4\x81\xa9\xaa8\x03\xf0U\xf7\xdd8'\xabl\x8c\xadh\n\xdd\xf3\x97\xdf\x0e\xf8\xc9\x02\xfeW\x11\xdc~\xcb\xd0zsv\xa1VT~\x84\x1ak1\xd7\"i`\xaaJ{\xfe\b\xc0\xc6؊;\xbb\xc5M+\x03'Xc{\x91\xa7\xacn\x0f\xbf\x8b\xab\xda\xfa.\xa9ni,\xf7\xec7\xb6b\xaeE\xd2\xc0T\xd5\xe2\x1a\x00\x9bc+\xf47\xf5\xab+&h$\xb7\x91\x1aZ;\x1ao\xb11\xb4\xa4\xc2؊\xb9\x16I\x03SU\x8bk\x00l\x8e\xadP\xe7\x9f\xf7v\x94\x89\xbba+\xad\x97ו\x8d\xc8!r\x9bz+\xe6Z$\rLUi\xcf\x13\x00\x9bc+\xc2\xfa\xed\xe7\xf3`\x1a\x94\xddGZ\v\x8a\x165\x05\xfcQ\xaab\xaeE\xd2\xc0T\xd5b\x02`sl\x05\xd7o\xf3ה\x16\x88\xc4\n\xbad\x94\xa1\xb5x\"\xff\x1b\x99\xa5\xa8\xca[1\xd7\"i`\xaaju\x11\xa0\xad\xb1\x15~?\xa5\x97xC~\xe1U\xbe\xa6L\\\xd1[\x8b\xf8\xc3\xe0X\xa9\xaaފ\xb9\x16I\x03SUjq\x11\xa0}\xb1\x15\xbc]\xabo\xf2g\xb3?\x88|RP\xdb\xdc\xe4\xf7\x9d4\xb4֑\xd9\xebV\x8cg\x13\x87}j+\xe6Z$\rLU-\xff\x15\x80m\xb1\x15\x8c{5\x83}\xd3\xf6\xb3\x85\t\x9b\x97\x14g\xe7U\x9c4\xb6\x06\xebGkyOn\x1e\xa5\xf9\xd5V̵H\x1a\x98\xaaZM\x000\xb6b\x00\x02SUj\xf9\xaf\x000\xb6b\xc0\x01SU\xcb\t\x002\xf0\x80\xa9\xaa\xe5\x04\x00\x19x\xc0T\x95ZN\x00\x90\x01\aLUq\x02\xe0B`\xaa\x8a\x13\x00\x17\x02SU\x8a\x13\x00\xf7\x01SU\x9c\x00\xb8\x10\x98\xaa\xe2\x04\xc0\x85\xc0T\x95\xe2\x04\xc0}\xa0\xaa\b\x10`\xaa\x8asU\x17\x02SU\x9c\xab\xba\x10\x98\xaaR\x9c\x00\xb8\x0f\x98\xaa\xe2\x04\xc0\x85\xc0T\x15'\x00.\x04\xa6\xaa\x14'\x00\xee\x03\xa6\xaa8\x01p!0U\xc5\t\x80\v\x81\xa9*\xc5\t\x80\xfb\x80\xa9*\xc6V\xb8\x10\x98\xaabl\x85\v\x81\xa9*\xed\xdb\xd8\n\x10\xb8.[\x03\xac\xaa\a\xdf\xeb>\xf8\xdbN\xf9\xf5_\xbf\x8fy:\xb1؊\xe6\f\xe2\xd9G?\xf1\x10\xdfu\xabRA\xbdW\u07b5\xa5\x8a\x10\x92u*ܺ#\xaf\ai\x8exXm\xe4~\u007f=\xd6&E\xdcl\x8d\xf0N\x0e4`\xaa\xca\x06\xd4_L\xbe\xb1\x96}=¾\xae\xbd\xfe\xf3\xe8\x02=\xb6\xa2眈\x8e\xb7Ɏ\a\xb4cԄ\x04\xd3$J4y멳\x81\xc0\xba\xf0\xdd\x06)\xfd ;\xfaV\xac\n]\x9f\x8c-\t\x9c\xd7\x1f\x9a֦\x18f\x11'[#\xbc\x93ɑ\xe2>\xd8\bLU\xad\x88\xc4VX\xe4D\xb4\x93[\x94\xd6\x0e\x89\xa8\xd4#w<\x95\x9e\xf0\xfd\x01\xf7GT\xa5=\x8f\xdf\xfc\x96j\x11\xccjS\r\xb30\xcd\xd6Pw2\tR\xdd\a\xfb\x18\x98\xaaFb+,r\"\xb8\xaa͙-=\xd6Dh!\x87H\xb8VU\xb5g\x8c\xaa\x9a\x91j\x98\x85i\xb6\x86\xba\x93I\x90\xea>\xd8ǀT5\x1c[aȉ\xd0c+\x9e!\x99\rՅ\x83\xcb\xf9\\\x93\xa9ڞ\xbbB\xae\xa5\x04I\xe8\x8bj-\xa5uCiamh\x1baU\xaf\xfb\b\xf1\x88ۤ7\xb2-\xd5\xd1:\"\x82\xab\x94\xce\"\xaaFj\x95\f\f\xf30\vC\x8a\x86\xdez$\x93\x90\xa5\xa7*\x87\xfb\xca\xe4-\xb5L\xb25ԝ\x8c\x04u\xa8\x99\x1d&\xaf\xcd\xf8\x1fʡ\fHUñ\x15\x86\x9c\b=\xb6\x82\aT\f[\xb1bX\xd61\xaeꥒA\xf7\xe4ZJ\x90\x84\xbe\xa8\xd62\xe9f\xd1\xd9a\xef\xf4Q\xf5P \xe0\x15w\x1e\xbe\xb53g\xd9%z\xa96w\xe7-Cgʨ\xaa\xd7*\x19\x18\xe6a\x16\x86\x14\r\xbd\xb5\xa3q\xeb\xb0у\x8a\x16Tf|-z\x89\xcd\xd6PwR\t\xeaP\x16\xcd^\x9ba\x1f\x9cʀTU\x89\xad\x88\xa4GDb+\xa86\xfc&\x1b\xe2\x8a&rU\x9f\x1eU\xb0N\x14(A\x12j\xa6D\xa4\x96\x06\xb3\xebi}vh\xb2\xa9N\x00|\xa1\x9bd\xcf\xe3\xf3\xbdʟ\x19;\x8b\x9a\x00\x84j\x95\f\x8c8a\x16\x91\x14\rcH\x06\xf1ߤ\xc1\x9b\xb2>6[C\xd9I\xe5\x15+\x8bq^\x1bN\x00\xfa\a=\xb6B\xf9\r(\xb1\x15T\x1et\xad#W\x99\xaa\xbe㛇\x88_\xbc\x12$\xa1fJDj\xe9\x11\xb2\xbbc79\"\xfb0S\xb5\x85\xbd\x1fwd\xb5\x18;3WU\xc9\xc0\x88\x13f\x11I\xd10\x86dh_G:\x8b\xcd\xd6PvRy\xc5\xcab\x9c׆\xaa\xf6\x0f\xfb\"\x1a\xe9\xbf\x01%\xb6B\xdeJ\x9d\x06\xc8!\xa6\xeaV\xdaU,R\xfc\x94 \t5S\"RK\x1bDc\xe8\x04\x91\x99\xaa]\xf9M\xb4)?h\xec\xcc\\U%\x03#N\x98E\xe4~\xefƐ\fu>i\x92\xad\x11\xd9I\xe5\x15+\x8bq^\x1b\xaa\xda?Db+\"9\x11Jl\x05\xd5\xe6\xf3\xef\x1b\xc9My\xb2\xaa\xd9\xcbOV)A\x12j\xa6D\xa4\x96\xce\x1a\xb7\u007f\xff\xfeq\xb3d\x1ff\xaaҚ\nZ!\xb2+\xd4\x1e\xa4\xaa\xb7\x96]Uk\x95\f\x8c8a\x16\x11U\x8d!\x19\xb3h\x84\xd8l\re'\x95W\xac,\xc6ym\x91}p,\x03RU%\xb6BωPb+\xa8\x96\xcf~\xc3wF\xf8C\xe7U\x83\x93x\x82\x95\x12$\xa1fJDji\xe1B\xf6mA\xa1\xec\xd8T\xd5=\xde\v^q\xa0\xa3\xf6 U=Lv\xaa\xb5J\x06F\x9c0\x8b\x88\xaa\x86\x88\vu\xf43\xc9\xd6PvRy\xc5\xcab\x9c\xd7\x16\xd9\a\xc720U\x8d\xc4VDr\"\x94\xd8\n\x8d\x8ck\xdc<:\xf7$\xedh\xe2\x9fVѷ3\xb6\xdf3\x04I(\x8b\x91\xdaf\xb2\xe4\x0e\xbd\xf3+\xd2|\x8f\x9e\xe7\x9fV\xd5\a\x02l\x10z\xf0\t;\xaa\xaf\n\xec\x14\xf3\xdd`aY\xa1\xfc#\xd1{\xe8\xda3\xb6\x84\x1d[\a6\x90\x80Z\xabf`\x98\x85Y\x18R4\x94\xceđzx&\x1e\x9b\xad\xa1\xee\xa4\xfa\x8a\x95E\xb3\xd7f\xd8\a\xa720U\x8d\xc4V(9\x11\x91\xd8\nm\xe1ܜ\xc2\xca\v|\x88\xe1\xd7\x00\xd0i$\x83\x0f\x91J\x90DdQ\xafݑ\xc1O\x986\x11\x92\xb1\x83\xce\tM\xf8\xd8\x11\xff\x01\x8f\\\x94\xd1\x16\xf5Z}h\x0f\xc2=\x1c\r=O|'\xd4ZC\x06\x86I\x98\x851E#\xdczDv\x10\x1aKM\xb25ԝT_\xb1\xbah\xf2ڌ\xfb\xe0P\x06\xa8\xaa=\xc7VD\xa6\xb2\xd6$Sk/\xbd\xcf\xd6p\xeek3c\x80\xaa\xdaslE2\xbf\xa2djm%\r\xd9\x1a\x8e}m\xa6\fTU{$\x99_Q2\xb5Ѐ\xf5\xda\\\xa8\xea7\xe2\x88ŪJ\x92L-4\xa0\xbd6\x17\xaa*\x8eX\xdaiB$S\v\rh\xafͅ\xaa\"0AU\x11 \xa0\xaa\b\x10PU\x04\b\xa8*\x02\x04T\x15\x01\x02\xaa\x8a\x00\x01UE\x80\x80\xaa\"@@U\x11 \xa0\xaa\b\x10PU\x04\b\xa8*\x02\x04T\x15\x01\x02\xaa\x8a\x00\x01UE\x80\x80\xaa\"@@U\x11 \xa0\xaa\b\x10PU\x04\b\xa8*\x02\x04T\x15\x01\xc2\xff\amu\xa3\x1c\xa2\xebff\x00\x00\x00\x00IEND\xaeB`\x82", + + "analysis/ipcg-pkg.png": "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x02\xf0\x00\x00\x03\xc6\b\x03\x00\x00\x00\xb2,^L\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x02\x04\x00\t\v\a\r\x0f\f\x10\x12\x0f\x13\x15\x12\x1b\x1d\x1a !\x1f!#!$%#&(&+-*/1.2416859:8<=;>@=AB@DFCFHEJKIOQNQSPTVSWYV,`\xae7]\xad8^\xae[]Z8a\xaa:b\xab;b\xac_`^\xc75\xf1\x17\u007f4\x1f\xc7j\xfb\xd7\x17\xdd\x05Zn\xc9/\xfe\xa7#\xf1\x1a\xb1k\x1e\xae-\x19\x9f_\xfej\xc73\xfa3\x9e\xa8_%f3\x9a\x10\x85\x1dG\x97M\xd4\xd7\xf8}x\xc3\xff\xfd7\xcfC\xae\xdc\xc9O\xbfo\xd9\xec\x83\"\x02\xedp\a\x18i\xa4/\xfc\xe1\u007f5\xff\xef.>\x1c%\xfc+\xae\xc0\x03\xb7\xa1\xb4a\xd9*\xf9\xb8\xf8\xab\xc4lF\n\xff?\xf9撪\xbf\x067\xbc\xad\xcc\\2\xe9\x84e\xbb\"\x82E\x1d`đ\xb6\xf0Zq\xf0\xffow\xa4\xf0\xaf\x8e\r\x99\xf0\xa8\xbe\x1f5,\xcb3\x96=\x1f\xbbbGG\x95\b\xf3\x9frA\xb4\xb6\x87\xf3\xc3\x13j\x13\xae\x11\xbd\xe6\x1f\xb5\xe0\xb4\t\"$|\xe8W\x89ٌ>;//\xb8dAp\xc3\xc1W\xaf\x98g\xd9\xf2\xcf,\xebb\a?\"I[x}w\xe8\xf9\xe3\x169\x18\xf7玷^\x9d\xaa\x0f~\xf1\xea\xab':\xfe,\xfd|h\xdb\x1f\u007f#\xdd\xd1%3,\xd3'=T\x92s\"vŎ\xff\x95\xf7\xab\xff\xf8\xa7\x8dr\xb5_ɟ\x11\xad\xedt\xfd\xf1\xf8e\xafnyT\xbf\xcfy+\xd1\x1a\xd1k> \xd7\\\xf5\xc7\xff2\xd5\xf6D\xfe*\xb1\x9b1^\x1e\xf9O\xbf\xea1^\x91\xc1\r\x8a\xe2\x8d\u007f\xfa\xddD\xb9%K\xa8\x89\xd8\xc5\xff\xa2\x03\x8c<\xd2\x17>O\xee\xd8\xfe(\xff\x1f\x97ﰆ\x0eZ\xeb\xf5\xc1\x032\x10\xfcQߕN\xec\bX\x96\xab\xcf\xd9k\xb7\xe2\x9f~55\xcfH\x14\x1ea\x04\x8d\x18m\xdf\n\xda\xf7\xb7\x87\xf4\xc1\xb2DkD\xad\xf9?rM#\x8d\xd7ȑ'\xf2W\x89\u074c\x16\xfc\xddNH\xe3݁\r\xe6\x1d\r\xfe\x12\xd67\x92-\xbbx\xec\xe0G$\xe9\v\xff\xefƒ\xbc\x80d!\xe1˅\x11\x18t\xa4\xa0o\x05,\xfbU`\x03\xb1+\xea\xc8\xe0\xd3\xf1\xbc\xfe\xb8L\x0e\xa2\xb4\x95Ǜ\x0f\x19\xa3\xffz\xea\xf7A\xb7\xec\u05c8Zs\xb5\xfep\xb21\xfa\xf3x\x11\x16>\xf8\xab\xc4lF\n\xff\x94\xb1|\xa3>r\x9d17h\xa4\xa8\x8e\t\x91\x9b\xee\xf8\xbd\b\x81\x04?\"I_\xf8\xff0\x96H'\xe4\x91jHx)re\xadD\xe6\x80\xdf\x05,\xfb]`\x03\xb1+\xea\xbc\xff\xdf\xf5s\xfeI\xcez(\xf8\x84ŭ\xaa\x90t\x16\xec\u05c8Z\xb32\xbc\xa6<>\xf5D\xfd*1\x9b\x91\u009b'l\x0e\xcbe\x87\xcd\r\x9a\xbf\xed\xc4\xf0ok2Y\x04\x18\x87\x1d\xfc\x88$}\xe1M\xb5\xfeUD\n\xff7\x11A}\xc0\xb2\xc0\x99?\x9b\x15;~W\x1e:\xb6|X>\x8e\xd2V\xfe\xc5X\xd5\x11A\xbc5l\xd6\f\xbc5\xe0\x16aჿJ\xccf\xe4#\xd3^\xe3\u007fğ\xac/\xca\aD\x94\xf0\xbf\x0f\xae\xfa\x8b\x0e0\x12I_x\xf3ݖ\xa0\tA\xe1\xff*\"x:\xb0\xe4\xad\xc0\x06bV\xf8\u007f\xe4\x13Q\xda\xce\x13\xc1\xbd\xe8\xfbo\x19\xa7\xe1\xe3\xafa\x13i\x02\x81]\x1ecz\"\u007f\x95\xd8\xcdH\xe1\x8d\xf3\x93\x11\x91&\x9e\xf0\xbf\x17\x06\v:\xc0\x88d8\x847\x8e\xf8\xe4\xa1j\xbd\xf1\xd4\u007f\x9bj%\x16^\xaah\xc4\xe4\xff\xd0\a\x8fʁ\xcdAk\xa1qt\xf9[1\xfe\x81\xdaDkD\xad\xb9J\u007fXl\xacyX\x9e{\x8f\x12>v3Rx\xf3\x05\xf2\xa2>\xca\xefH,\xbc\xb9\x8b\xc7\x0e~\xa42T\xe1\xe7\x89@\xf2\x90\xe7F\xfeI\xbe\xc5\xfaG!\\\x0f\x1f\rXv4\xb0\x81\x98\x15\xf3\x83&UF\xeb\x1b\xe0-\xb9\xfao\xf4\xc1_'\x9bB\xc6_#jM\xe3\xcc\xe73\xfa\xe0}\x19\x8bB\xc2\a~\x95\xd8\xcdH\xe15\x99\xf0\xff,7TՑD\xf8W\xe4\xc6~\xd1\x01F&C\x15\xfeW\xfa}ު_\xfdw\xc7Q9g\xf2\u007f\x1e\xfe}a@\xa4\xc4\xc2˻\u007f}\xab\xe3\xf0/\xe4,\xbb\xb34\xc6\x1bO\xc2\xedyZ\xce\x14\xff\x9bh\x8d\xe85\x8d\x8f\xbc\xcc\xd9Xo~4!J\xf8\xd8\xcd\x18\x87\xb0\xe3\x97m\xab\x97\xdb1\x8em\x13\n\u007f\xe6\x01\xf3\x8d00\"\x19\xaa\xf0\x1e\x11\xb4j\xa3\b\xe1\x92>$\x16\xfe\x19c\xe2xs~\xb1|\"Z[\xebG\v\x96u$Z#z\xcd?\x05&\x89q\x05\"F\xf8\xd8\xcdH\xe1s\x83?\xe9W\xc1\r\xc7\x15^\xa6\xf8_t\x80\x11\xcaP\x85?a~\nE\x1a\xe9\tZS`\x9c\x01L,\xfc_\xa7\x9bssV\xffk`Z\xb4\xb6\x1doM\nlO\xd4\x1a\x9f͉\xbbF̚\xaf\x98\xbf\x89\xf6[\xb9\xca\xf3\x91\xbfJ\xecf\xa4\U0002f598K\x17\x19\xc7lj\x85?\xf3\x00v\xf0#\x97\xa1\n\xdf\xf1VU\xbe\xf6O\xe5\xc6\xf0\xf0\x8a\x9f\xe5\x8f\xcb{\xe8i\xf3\U000ff245\xef8\xe3yȥ\x15\xff\xea-\xe3\x03hu\x1d6\xdav\xfcu\xe3\xf4\u007f\xd2r'\xfe*\xf0\xde~\xdc5b\xd7|\xebW\xc5\xda?\xcd\xfb_#\x16\xfd\u007fQ\xbfJ\xccf\x8cӒ\u007f\xfe\xf7\x12-\u007fz\xc0\xed\xc4\xc2w\xfc\xce\xfay20\xb2HM\xf8\x11\xc5\xdf\xfe\x16\x1a\xcawZ\xff3\xc1T\x83\xf0y\xf8\x149s\xb4\x03\x8cTF\xa1\xf0\u007f\xcc)x\xa8r\x9b\x1c\xfdY此\x1f\x01H[x0\x82\x19\x85\u009f\xc8\x11\xf2\xbd\xa5?\xfd\xe9?\xe4{\x03\x0f$\x9b\x0e\u1ccaQ(\xbc\xf1\xde@\x88\xdf'\x9b\r\u1cca\xd1(\xfc\x9f\xcbC\xba\x8f\xfbM\xb2\xc9\x10>\xbb\x18\x8d\xc2wt\xbc\xfa\x8b\a\xf24-\xff\xa1e\xa9\x88\f\u1cc9\xd1)<\x00q\x80\xf0 \xab\x80\xf0 \xab\x80\xf0 \xab\x80\xf0 \xabH$<\x00\xa3\x0e\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n\b\x0f\xb2\n5\xc2_\xbe\xfcygw\xe4\xa2\xee\xce\xcb_}9`?\x1d\x80L\xa1F\xf80\a\xb7w\x124\a\x8e\xa1T\xf8>\xa2Ms?\x96w\x008\x83R\xe1I&\x19\xec߁\x83(\x14\xbe\xaf\xcf\xd7\xd7w|ϗ\xfa\xdd\x00\xac\aΠPx\x83\x97\x1e\xbb\x98l\n\x00\x99C\xb5\xf0\x03\x9d\xc9f\x00\x90A\x14\t\xafG\x98\xd3{\xfe\xb0}\xeb\xe67\x9b\xb7oݺ\xbdy\xdf\xcddk\x00\x90\t\x14\t\xdfG\xb4}\xfe\xac\x99\xd3fL\x93̜_q\x11\xe7j\x80\x13\xa8\x13~ô\x83\xa7\xdf;\xfd\x9e\xce\xe9\xd3k\xa6\x9d\x83\xf0\xc0\t\x14\n?\xbb7\xf4pk\xc59\xf2\x11\x9c\a\xcaQ(\xfc̳\xa1G\x1bf\x9eK4\x1b\x80L\xa1P\xf8\x19!\xe1i}X~\x00T\xa2N\xf8\xf5s\xbb\xf7\xfc\xf8\xc7?\xd1\xff\xab\xe8{}\xe6\xe7G\xb6\xfb\x8eoU\U0007969f\x8e\x193\xe6\xee\xe3\xc9f\x81,A\x9d\xf0\xeb\xaai\xcd\u05fe\xf6w\xfa\u007f\xdf\xf25\xcf\xe8~cn\xf7\xeeY6\x87\xae\x9d\t\xc2\xce\xee\xb7\xe3?\x17\x97\x0f\x9b\x9bW\x8e\xd9c\f\xcf\xe1M\x80\xacG\x9d\xf0\x1bf_\xbeؼgߞ}\xcd\ai\U000cc2dd\xa7\a:?\xf4E\xcf\x1bX\xfb\xcd\xfb\xec\xd67\xf9\xc1\x8f\xe3?\x97\x88}\x01\xe1\xef\xfb\xe6\xda\xcc\xffE\x01\xacQ'\xfc\v3N\a\x1f\r\xc4\xcb\xf0\a\u007f0\xe6\xfe\x0fm\x9f1\xb8\xe7_\xe2?\x97\x88\xa0\xf0g\xef\x1f\U000c30c9\xa7\x82Q\x8e:\xe17̺h&v\xfdfӌs\xd4\x1bsZ\xb2sƝ\xdf\xddn\x0e\xd7\xfd\xf0\xee\u007f\x98\xd1Mt\xe4\xce1c\xee\xa7\xef\x8d\x19\xf3\xcdޭcL\ue258pP\x9f0\xf7\xf8O\xbew\xf7}\xbeG\xc6ܹv\xda?\xdc}\x9f|\xc5t\xfe\xcbw\xee\xfa\xee\xfd\a\x03\x1b\x0e\nO\xb4\xfd\xbbwNC\xae\xc9f\x14\n?;\xfc\x9d\xa7\xcd\x156\xe9}\xf3w\xee\x9c\xfd\x959\xfc\xf9\x9d\x8fl_\xf9\xed{\xfa\xa8o\xcf\xc2;\xf7к;\xd7\x1d\xa4\xaf\x9a\x9b\xff\xe1G\xcd\xcd\xcd\xc7#&\xdcܰ\xfe{\xff\xf0\xcd\xefM\xfbɝ\xa7\x8f\xac\xbfs̷\x17>\xf9\xcd\u007f֟\xdf>\xe6\xe7\xbb7\xdc\u007f\xe7>ssa\xe1\xe9\xab\xd9w~{S\xf4O\x06كB\xe1\xab\xd7m~a\x93\xce\v\x9b6\xff\xf2\x91د\x81<2枃\x81\xe1\xf61ϒ\xd4\xf49\xf9\xe0\xa7?\xbc\xf8\xbd\xc7\xcd\xe5\xa1H\x131\xe1\x9e1\xf7\xe9;m\xb9\u07fe\xeb\x9b\xfa\xde\xfd'\xdf\xd6G\xdd\x1b\xbe\x94\xcf\xfc\xb39\xdd\"\xbc\xfe7\xe1\x9e1\xd3\bd+\xea\x84o~\xfc\xb1\x8a\x19&\x15\x8f?\xf9y\x8c\xf0\xcf\xde\xf5\xadu\x81\u13ff\xef\x93|\xf7\xa7\xf2\xc1\xcd{\xbe}\u007f`yH\xf8\x88\t\xf7\xdc\x15<8\xb8K>\x9e\u007f\x97\x1c^\\s\xdf\xf7\xbf\x19\x88?\x91¯\xfb\xd6\xddk\td+\x8a\x84\xd7\xe9\xbex6\xc4\xc5\xcb6gK\x8e\xdf7\xe6\x87\a\x8d\xd1=\x81\xb8n\xee\xa07\x8di\x0e\xcc\b\t\x1f1\xe1\x9e\x1f\x04\xb7p\xd7|\xfdf\xa1\x14~߷\xbf;\xeb\xa5\xe6{c\x85?\xf2\xc31\xf7\x87\x0e\x9eA\xf6\xa1N\xf8\x14x\xe9;wΒQ\xe4'\xdf\u007f\xdb\xc0\xf8\xae\xc8\xd9\xef\xcc\xfd\xdee\xf3yC\xf8gOGM\b\x9f\xbb\xb9k!\x05\x84\xff\xbf?\x94\a\f\xff\x12-\xbc\x9e\xe0\x83\x87\xc5 ;Q(\xfc\xc0@_\x90\x818\x1f\x1b\xeb\x9cq\xe7w^'z}\xcc\x06\xf9h\xae\x8c\xee\xbe\x1fV\xd3\xcf\xef3\xe7\xdf{/\xd1\xc7\xf29\xeb\x04[\xe1\xbf+\x97\xf5\xdd\x13%\xfc\x9b\u07fds\xd6W\x04\xb2\x19\x85§\xc4\xc1\x1fIUg\xdf\xf9\xe3\x176\xfft\xccz\xba\xd9\xfcȷ?\xa4\xf7\xbe9\xadY~\xd4r\xfe]On\xbe\xef\xee\xb3\xd6\t\xbe=ƹ\x9b\xf7\xf4eg\x9b\xef\xfc\xe9\x1ez\xfb\xa7w6\x9f\xa5\x85c\xfee\xcd\xe3\xf7\x8c\xf9ֿ\xed\xd1\x177\xaf\x1c\xf3\xeb\xe6f\xfd\x0fÿ\xfc\xe8`\xc2\x1f\x0eF?܄\x0f\xf0\xfa\xbd\xdf\xfa\xe6\x8f\xfe w\xe5c\xc6L\xa3Gƌ\xb9s\xb7\xbe\xb4\xf7\x91o\xdd\xfd\xa3}\x11\x13\xe4y\xf81\xf2\\\xbd<ͣO;r\xb7~\xfb\b\xf5\xfd\xfa\x1f\xee\xfa\xf6\x8f\x9f\xfd\xfe]\xf7\x1a\x9f\xa5\x91\f\xf2]Z0\xba`*<\x00\x99\x01\u0083\xac\x02\u0083\xac\x02\u0083\xac\x02\u0083\xac\x02\u0083\xac\x02\u0083\xac\x02\u0083\xac\x02\u0083\xac\x02\u0083\xac\x02\u0083\xac\x02\u0083\xac\x02\u0083\xac\x82\x8b\xf0\xbe\xa8VK\x002\x02\v\xe1\a\x88\x8e\xbc\xf1\xa5\x82\xcb\ue06c\x87\x85\xf0}D\x9b\xabQg\t\x14\xc0BxB\xa4\x01\x8apV\xf8=\xbe\xce^\x9fQgy\xf0\xcdNy\xd7G}\xbd\xbd\xbeps\x02\x00Ë\xb3\xc2\x1f!\xe3r\xaa\xb2\xa1{6Jp\x80\x02\x9c\x15>|\xf5\xe0\xces1W\x12\x06`\xf8qVxyb\xe6\xf8\xeeM\x1b\x9e[\xff\xec\xda\xf5ϭ\xdf\xf0zs7\xceՀL\xe2\xb0\xf0z\x8aٺp\xf6c\xb3fUϟ=k\xd6c\xd53Pg\t2\x8a\xf3\xc2o\x98v\xe4\xfc\xd9\xf37\xe9\xf2\xd9\xf3\xe7\x9fE\x9d%\xc8,\f\x84\xaf\x90\xad\xdc\xfbVʇ[+\xce\r\xc4^7\x1e\x80a\xc3y\xe1_\x98)\x1b\f~t\xc7A\xfd\xd1s\xa8\xb3\x04\x99\xc5y\xe1\xcd\xfe\xd6\xfb\uf437\xa8\xb3\x04\x19\xc6y\xe1\xd7\xcf\xed\xde}\u07fdw\u007f\xed\a\xf7\xfd\xbc\xef\x8d\x19\x9d\a7\xf8\x8eo\x8e\x9a\xb5e\xfco\xe5\xddr\x91\xd3d\xb3\r\x00R\xc7y\xe1\xd7U\x0f\xac\xfd\xc6\xd7\xff\xee\x8eo|\xe3;\xb2\xcerwu\xf7\x9e_F\xcd*\xd3\xca\xe4\xdd\x05\xaf\xe6\xb1\xd9\x06\x00\xa9\xe3\xbc\xf0\x1b*.v\x1e?~\xef\u05f7\x1f\u007f\x8f^\x9ay\xbe\xfbY\xa9\x99)\xfc\x95\xf1\xcf\x13\xddX\\\xac\x95T\x19] \xd6R3\xff\xaer\xd7\x03\xab{b6\x0e@\f\f\x84ORjvI\xec\xec\xb9\xf1N\xd9\xcfn\x10\xb5\x8ae\a\x9a\xaar\xda)\xb2Ԭ6g\xc5\xdem\x05SQ\x06\x02\x92\xc3@\xf8$\xa5f\x97\x8c\xd34\xa5\x17\xf4aOS\x97\xbe?/\x9bG\x11\xa5f\xadb\x97>l7\x93\x0f\x00\tq^\xf8d\xa5f\x97D}{{\xdb\x13\x13\x8e\xea\xe3\xab\r\x95\x93\xf2\x84졷\x94\x9a-\x99\xd4\u007f[\xa7\xb86v\xf3\x00D\xe1\xb0\xf0\x94\xbc\xd4,pк\xa4\xd4O\xed\x85%O\xb7x\xddRxK\xa9Y\x990\x99\x17\xbb.\x00Q8/<%)5\v\b\xff\x9a\xb8J\x93\xcb\xe5\x91\xe9\")\xbc\xa5Ԭf\xd21\x83\xab\xb6\xab\x03`\xc5yᓕ\x9a\x05\x84_\x9a\xe7\xa7\x12Y\xe5\xe7\u007fX\no)5k\x13MrX\xbf1v]\x00\xa2p^x\x93\xb8\r \xe6;\xad-5\xe2Ei\xf9\xe2\x86秊\xa2\x17ߍ(5\xab\x1b[Ӣ\x0fw\xd9o\x00\x00\v,\x84OTjf~\x96F+۩G\x18\xff\x96R\xad`\xc9k\xa5\x9a;\xb2Ԭ\xcd=!\u007fz\x9b\xdd\xda\x00D\xc2Bx\x94\x9a\x01U\xb0\x10\x9ePj\x06\x14\xc1Bx\\j\x0f\xa8\x82\x85\xf0\xb8\xd4\x1eP\x05\v\xe1\t\x97\xda\x03\x8a`!<\"\rP\x05\v\xe1\x11i\x80*X\bO\x884@\x11,\x84G\xa4\x01\xaa`!<\"\rP\x05\v\xe1\t\x91\x06(\x02\u0083\xac\x82\x85\xf0\xc8\xf0@\x15,\x84G\x86\a\xaa`!a\xdc]\xddrKޅ\x84\x0f7\x99\x85\xabΖ\vm\xe7\xaa\a\\\x95\x17\b\x00{\x18\b\x9f\xb8\xd4\xecV\xce\x16\xebÐ\xf0\xe1&\xb3p\xd5\xd9_\x1alj\x02\xcfo\xf3\x16\x10\x00\xf60\x10>q\xa9\xd9'\xa2\xc5\xfa0(\xbc\xa5\xc9\xccRuFZ\xbe\xbew\xaf) \x00\xecq^\xf8$\xa5f\xfd\xe3l\xf7\xf0\xd6&\xb3p\xd5\x19iK\xf5\x1b\x8fF\x00\xd8\xe3\xb0\xf0\x94\xbc\xd4,\x90\xe1\xfb\xcd\u0083\xa0\xf0\x96&3kՙ&\v\xea!<\x88\x8b\xf3\xc2S\x92R\xb3\xba\\\xa3\xad\xacI\\\x91wA\xe1-Mf\x96\xaa3\b\x0f\x92\xe0\xbc\xf0\xc9Jͮ\xe5-\xe8\xd73\xba{\xa2\xf1((\xbc\xa5\xc9\xccRu\x06\xe1A\x12\x9c\x17\xde$A\x03H\x9b\xab|WK\xe5\xb8CD\x9f\xc9wZ\xb7x\xbd\x9f\x92\xb5\xc9,\\uvɫվ\xeb?Q\xaby/\xc5\xdb\x18\xc8rX\b\x9f\xa8Ԍ\x8c\xcf\xd2\x14\xcd{_\x1f,\r\x04\xf7%ri\xa8\xc9,\\u\xb6\\֟\xbd\xef\xd2o\x97\xc7\xd9\x14\xc8vX\b\x8fR3\xa0\n\x16\xc2\x13J̀\"X\b\x8fK\xed\x01U\xb0\x10\x1e\x97\xda\x03\xaa`!<\xe1R{@\x11,\x84G\xa4\x01\xaa`!<\"\rP\x05\v\xe1\t\x91\x06(\x82\x85\xf0\x884@\x15,\x84G\xa4\x01\xaa`!\xdc_\xd0j\xbb!\x00R\xc2yᓔ\x9a]\xdb(^\xf3\xee]\"\xea͇\xad\xae\x88\xcb\xc5\x03\x90\x1e\xce\v\x9f\xacԬM\x9c\"\xf2/7;\xcd\xf4\x91\xddf\x00H\x11\xe7\x85OVjf\bO=y\xb8\\$\x18\x06\x9c\x17>Y\xa9\x99)<-/\"\xba\x9e+DN\xa3|tr\x9c\x10\xf5gj&\xe6Vގ\xdd(\x00qa |\xe2R\xb3\xa0\xf0;D\x17Q\xbb\xd7;^^\x01\x9ez\x9a\x1aKJ\xf3JVՌ\xfd\x94\x00H\x1d\x06\xc2'.5\v\n\xdf\x16\b\xf1\xb9\x9e\xc0\xf2\xa9\xc2}\x83\xfc7\b\x804p^\xf8$\xa5fA\xe1_\x13\u05cc\x87a\xe15\xec\xdcA\xda8,<%/5\v\b\xffT\x9e\xf90,\xfc\x94ع\x00$\xc1y\xe1)I\xa9\x99)|\u007f\xc1\x12\xf3aX\xf8E\xb6\xd3\x01H\x84\xf3\xc2'+53\x85\xaf\x13\xc7̇a\xe1\x17\xc7\xce\x05 \t\xce\vo\x12\xb7\x01\xc4x\xa7\xb5m\xa9\x90\x9e\xf7\xbf\xe3\xf5\x8e\xaf\xf5zo\xd0\xed\xc3\xde\xd2\xe9^\xef'\xf6\xeb\x00\x10\x0f\x16\xc2'*53>K#&\xee\x90\xe3\xa39f\xa9\xd9\x0e:i\x8e\xaa\xec\xd6\x00 >,\x84G\xa9\x19P\x05\v\xe1\t\xa5f@\x11,\x84ǥ\xf6\x80*X\b\x8fK\xed\x01U\xb0\x10\x9ep\xa9=\xa0\b\x16\xc2#\xd2\x00U\xb0\x10\x1e\x91\x06\xa8\x82\x85\xf0\x84H\x03\x14\xc1BxD\x1a\xa0\n\x16\xc2#\xd2\x00U\xb0\x10\x9e\x10i\x80\" <\xc8*X\b\x8f\f\x0fT\xc1Bxdx\xa0\n\x16\xc2\x13\"\rP\x84\xb3£\xd4\f(\xc6Y\xe1Qj\x06\x14\xe3\xac\xf0(5\x03\x8aqVx\x94\x9a\x01\xc58,\x9a\\ޣ\xdf.\x8a\x12\xbe\xd0x\x8e\xeaK\xe5m\xeb\x84~#Ѥ)|\xc1\xa9O\xf2\xb6\x18\x13\xebtկ7\xe66\x10\x18=8/|\xb2R\xb3\xa0\xf0\x85u\xfa\xcd\xe1\xf1\x97\xc6\x1f\x96\x8fJd\x87\x9f\xff\xe1(ዊe\x99\xab\xdf,\xf8\xeb/j\xcd7\xfe0\xa4'\xbc\xfc{\xa2Ƀa\x8fh\x93\v\xdc\xcb\b\x8c\x1e\x9c\x17\xde$n\x03H\xf0\x9dVo\x9e\xf9\x0f\xbbz\x901X\b\x1f\x884\x00d\x1c\x16\u0093\x8c4ح\x03\x05\xb0\x10^\x8f4\aw\xf7\x1d\xd9\xec;\xf2\x92\xfe\xaf\xf7\xf8v\xcbs\xc9K\xcd\x00H\x1d\x16\xc2\xcb⛅7߬\xee6\xff\xa5Vjv\xe0\x18\x01\x90.,\x84\xd7\xe9\xbdI_~\x1c\xf8\xd7}1\xe2\xa98\xa5f\x8f.!\x00҅\x85\xf0\xc6\x1bO\x9d\xf1\x9e\x8dSj6u\xb1\xddd\x00\x12\xc2Bx\xe3,\xcd\xf9\x81^\xfbӒ\xa1R\xb3Sㄨ\xf2\x97\b\x91\u007f\xab5\x10\xec\xa7\xc4n\f\x80\x04\xb0\x10\x9e\x12\xbe\xf1\x14*5\xf3\x1f\xf6\xe4\x1c\xa6]cw\x9d\xa0\xaeC\xde\xd2\xe9z\xb2ǵ\x96@z\xb0\x10>\xf1gi,\xa5f\xfe\xa5\xe5WK6\x9a\x8b\x11i\xc0 `!|\xe2\xcf\xd2XJͨ\xe7ᢪ@\x96\x87\xf0`\x10\xb0\x10\x9e\x12G\x9ap\xa9\x19Q\x8b8\x14\x18Ax0\bX\b\x9f$\xd2XJ\xcd.\x14֗|a.6\x84\xdf\xf9\xa9\xfd:\x00\xd8\xc3B\xf8$\x91&\\j\xd6_^O\xcb\xdcf\xa6q\xbb\x89\xae\x88&\xfbu\x00\xb0\x87\x85\xf0\x94 \xd2XJ\xcdz\x0e-/\xb8@\x1dy+\x0e\xdd\"Y\xba\xb7\xa5\xc5\xed\xfa,\xcej\x00\xd8\xc2B\xf8D\x91\xc6Rj&\x87\xabh\x85\x10cewӭ\x15\xf9\xb9\xd3\xdb\xedV\x01 .,\x84\xc77\x9e\x80*X\bO\xf8\xc6\x13P\x04\v\xe1\xf1%n\xa0\n\x16\xc2#\xd2\x00U\xb0\x10\x9e\x10i\x80\"X\b\x8fH\x03T\xc1BxD\x1a\xa0\n\x16\xc2\x13\"\rP\x04\v\xe1\x11i\x80*X\b\x8fH\x03T\xc1BxB\xa4\x01\x8a\xe0\"<\x00J`!)ɩ\xf4\x1c\x0eVv\a\x85o\x15\xcb\x0e4U\xe5\xc8+\r\x1f\x1d\xbb\xb4e\xff\xce\"\xa1\xbfbH\x13\x93\x1b[\x8a\x16\xc4\xf9\xa9`t\xc2B\xf8ğ\xa5\x99(\xcf\xd1\x14\x9a\xe3\xa9\xc2}\x83\xfc7\xe4U\xb4e\xa47n\vkh\xafh\xa5\xa5\xf2\x0f\xc1\xb5\xe7\x1f\xd5D~\xe0\xf4KP\xf8\x9e&}\x8f\xef/\x9b\xa7\x0f\x1b\n\xa4\xea\r\xf9\xc6\x1e\xbe\xf0\v\xa2ڂ\xd8\x1f\bF1,\x84O\xfcY\x9a\x89U\xed\xedK\x83\xc2k\x9f\x9a\x83\xda2\xe3\xeeA}\x17_\xd8H\xef\x8a.z\xba\xc6|\xe6\xd6\xfeJ\xb1\xd7\x18\x852\xfcՆ\xcaIyB\xae\xf1Y\xf1\xc4\x15;O\xf8\x8d\xbf\x01\x9a|\x85x4\x02\xd9\x04\v\xe1)q\xa4\xd1\xc5<\xb5\xd3\x1cO\r6\x11\x97\x9b\xb5~Uz\xd4)l\xa3v]\xdb:]\xf8v#\x91\xfb\x03O\x06\x85o/,y\xba\xc5\xeb6^\"\xd7w,\x9e,\x8a6\x1a{xy\xd0\n\xe1\xb3\f\x16\xc2'\x894\xcb\xc2㩋\x02\x83\xdaI\xd2Y\xffĥ\x11\xc2\x17\xae0\x9e\xac/5\xee\x82\xc2O.\xef\xd1o\x17I\xe1\xdb\xeb\xf4ծ7\xe66\x10\x84\xcfNX\b\x9f$\xd2X\x85_\x1c\x18\xec\x15\x8d\xfam\xa3\f/\x16ዊ\xaf\xe9K\xfd\x81\x97EP\xf8\x12\xf9\xd0\xff\xb0\x14\xdec\x9e\xcdw\xcbMB\xf8l\x84\x85\xf0\x94 \xd2\xdcz\xa7p\xce!\xf34\xe3\xed\xc3F\xdf\xfc'ƃ\x9a\x9c\xbaֺ\x1c]\xf2S\xf9/\xf74j'{j\xdc\x17\xa8H\x14z\xdaZܹ\x1f\xe9i]\xbeӺ\xc5\xeb\xfdTZ\xbe\xb8\xe1\xf9\xa9\xa2\xe8\xc5w\xf5\xa1\xab\xbe\xb5\xa5V\x1c\xa0K^\xad\xf6]\xff\x89Z\xcd{)\xceO\x06\xa3\x11\x16\xc2'\x8a4\xc6giv\x19Ó9\xc2\xd2B\xbf\xad\xccU\xd6\xe0'\u007f\x91\x10\x8dy\xc2\xd5$\xc4\x80\xae\xf9\xa6\xd9\xe7\x10i@\xe6a!\xbcN\xe79_\xb2)\x00\f\x1d\x87\x85\xd7\xe3\xcb\xf1\xed\xeb֮]\xa3\xb3v\xcdڭ\xafw#рL\xe2\xb0\xf0\xf2\xfc\xcc¹\xd5sM\xaa\xab\xa7\x9dG\xb0\x01\x99\xc4y\xe17\xcc8\xfe\xe5\xe7_\xea\xe87\xebf Ƀ\x8c\xc2@\xf8\x8a\xf0\x19\xc9ͳ\xce\xc9k\b#\u0383L\xe1\xbc\xf0/\xcc\xf80\xf4h\xfd\xac\xb3\x89f\x030T\x9c\x17~\xc3̰\xe4\xcfʹ\x13\xbe\xe5\xc1\xf1e-S[\xe3\xf46\xa1\xac\t\xa4\x81\xf3¯\xaf\xee\xfd\xc3?\xfe\xe3=\xfa\u007f\xff\xec\xdb=\xa3\xf3\xed\xb5\xbdo\xaf\x8d\x98\xb3MԴ<%Ķ8\xbdM(k\x02i\xe0\xbc\xf0\xeb\xaa\xfb\xd6\xfd\xfd\xdf\xff\x1f\xfd\xbf\xef\xfb\x9agt7/\xbc\xd9\\m\x9d\xf2\xd1\xd8z\xfdv\x95\x14\x9e\xeckl 1\xeeB\xc2\a;\x9et\xb4\x15O\x14\xe7W%\xe8d\x05 \x88\xf3\xc2o\x98\x19\xee\xef{if\xcci\xc9\xeb\xe25\xeb\n!\xe1C\x1dO\xb2\xaciJSc\x99\xeb\x14\x01\x90\f\x06\xc2W|\x1ez\xf8Ҭ\x987\x9e\xde7\xae\xe8\xee\xef\xe9\xb9e<\f\no\xe9x\"mr\x0fQOi9\x01\x90\f\xe7\x85ߴ\xf0\xc95+W\xfe\xfa\xd7+W\xae\\S\xfdH\xcc\xd7@\xcc=|\x8d\x10b\xbf|\x18\x14\xde\xd2\xf1D\xda3r\xb8C\\#\x00\x92\xe0\xb0\xf0\x03D\xfbV\xfer~u\xf5\xc2ǫ\xab\xab\xe7\xaf\\\xdb\x19\xf3\xe1\xb1\t2\xc3_j\x11u\xc6.>(\xbc\xa5\xe3)p\xd0\xea\x15\xc7\b\x80$8,\xbcN_o\xb7\x8eo@\xde\xf6\xf6\xc6>_[$Mo\x89:-i\xe9x\"m\x95\\\xb2S\xa4P\xd5\r\xb2\x1d\xe7\x85'c?\xff\xc2\xc2\xcf\xe3|0\xd88\x0f\xefwG\to\xe9x\"\xadX\u007fI\xf4?\xe8\xb6]\x1d\x00+\xce\v?\xd0\xd7\xd7\xed\xf3\xfd۴#\xben_\x9f\xddG%\xb7\x88'Zk\x8dwZ-\xbdM\xe1\x8e'y\x96\xa6\xf2\xf0\xfe\xf2\xfc\x8fl\xd6\x05 \x12\xe7\x857\xe9M\xf0%\xee\x96ɹ\xe5m%m\x11\xbdM\xa1\x8e'\x9d\a=\x8b\xf3\x8ak\xd0M\x06R\x80\x85\xf0>\xa2M\x8f\x9f%|*\x18d\x1c\x16\xc2뇪z\xa4!\x9b#V\x00\x86\x17\x16\xc2S\xe2H\x03\xc0\xb0\xc1Bx\\j\x0f\xa8\x82\x85\xf0\xb8\xd4\x1eP\x05\v\xe1\t\x97\xda\x03\x8a`!<\"\rP\x05\v\xe1\x11i\x80*X\bO\x884@\x11,\x84G\xa4\x01\xaa`!<\"\rP\x05\v\xe1\t\x91\x06(\x82\x85\xf0\x884@\x15,\x84O\x10i\xb0\xe7\a\xc3\n\v\xe1)\x8e\xd8\xd8\xf3\x83ᆅ\xf0\xf1\xc4\xc6\xc1,\x18nX\b\x8fH\x03T\xc1Bx\x8a/\xf6\x91\xdd\x11\xd7\xdd\x03`h\xb0\x10>&\xd2\xec\xf1u\xf6\xfa\xfa\xfaz\xfb\xfa6T\x9c\x95w}\xd4\xd7\xdb\xeb\xc37D\xc0Pa!|L\xa49\x12\xfa\xba\x1f\xda\xfd\xc0\xb0\xc2Bx\x8a\x8e4\x90\x1cd\b\x16\xc2Ǟ\xa5\x91u\x96\xbb7mxn\xfd\xb3k\xd7?\xb7~\xc3\xebͨ\xb3\x04\xc3\x02\v\xe1c\xcf\xd2\xe8í\vg?6kV\xf5\xfcٳf=V=\xe3\"NN\x82စ\xf0\x14s\x96F^Uxڑ\xf3g\xcfߤ\xcbgϟ\u007fv\x1a\xea,\xc1\xb0\xc0B\xf8\xd8Hc\\F\xfb&\xc9K\xadʇ[+\xe4u\xe3\xe1<\x182,\x84\xb7\x8d4/̔u\x96?\xba\xe3\xa0\xfe蹙\xe7\xe2\xad\v@:\xb0\x10\x9el#\x8dQay\xff\x1d\xf2v=\xea,\xc1\xf0\xc0Bx\xdbH\xb3~n\xf7\xee\xfb\xee\xbd\xfbk?\xb8\xef\xe7}o\xcc\xe8<\xb8\xc1w|s\xc4Z\xa8\xb3\x04\xe9\xc3Bx\xdbH\xb3\xaez`\xed7\xbe\xfeww|\xe3\x1bߑu\x96\xbb\xab\xbb\xf7\xfcҺ\x12\xea,\xc1 `!<\xd9F\x9a\x8a\x8b\x9dǏ\xdf\xfb\xf5\xed\xc7ߣ\x97f\x9e\xef>Oݗ\xadSPg\t\x06\x01\v\xe1m#\x8dYgy\xaf\xcc\xf0\x03\xa8\xb3\x04\xc3\x04\v\xe1m#͆Yr\x87>\xeb{R\xfbM3cNK\xa2\xce\x12\f\x06\x16\u0093}\xa4\xf9R\x1f\x98\x9d\xad\x9b+Pg\t\x86\x05\x16\xc2ۿ\xf14\u007f\xcd\xfag\xd7m\u007f\xe3\xb9g\u05ed\x9f\x8f:K0<\xb0\x10\xde6\xd2\xecy\xb2z\xee\xec\xd9\x15\x15\x15\xb3g\xcf}reg\xcc۬\xa8\xb3\x04\x83\x80\x85\xf0d\xf7\x8d\xa7\xde\xce\xcb\x17/_n^\u007fZ\xbf\xeb\xb4\xf9\xda\x13\xea,\xc1 `!|\x82/q\xaf\x9du>\xceGhPg\t\x06\x01\v\xe1c#\r\xc9\xc3U_\xaf\xcf\xf7\xd2\xfc\xb3\xbe\xde>\x9f\x9d\xf3\xa8\xb3\x04\xe9\xc3Bx\x8a\u007f]\x9a\x83\u007f\x88-\xa3\x0f\x82:K\x906,\x84\x8f\x17i|Dkf\x1e\xc7\x17\xfe\xc0\xf0\xc1Bx\xdbH\x13X>\x1f\x17b\x02\xc3\b\v\xe1ip\x91\x06\x80\xb4a!<.\xb5\aT\xc1B\xf8\x04b\xe3R{`Xa!<\xe1\xea\xc1@\x11,\x84G\xa4\x01\xaa`!<\"\rP\x05\v\xe1\t\x91\x06(\x82\x85\xf0\x884@\x15,\x84G\xa4\x01\xaa`!<\xc5\x17\x1b\u0083a\x85\x85\xf0\xf1\"\r2<\x18nX\b\x9f\xe8\xb34\xc8\xf0`8a!AtA\xa9\x19\x18VX\b\x1f\x13]Pj\x062\x04\v\xe1):\xba\xa0\xd4\fd\b\x16\xc2\xc7D\x1aH\x0e2\x04\v\xe1c\xcf\xc6\f\xa0\xd4\fd\x04\x16\u0093ݥ\xf6Pj\x062\x00\v\xe1\xed/\xb5\x87R30\xfc\xb0\x10>6\xd2\xf4\xa1\xd4\fd\x04\x16\u0093]\xa4A\xa9\x19\xc8\x00,\x84\xb7\x8f4\xc9J\xcdNΙ\x907\xfd@١\x88\x85\x91\xfdf\xfb\vZcV\x03Y\r\v\xe1m#M\xb2R\xb3cZUˮ\x05BDV\xf5E\xf6\x9b\xb5\xbaZ\x02\xa3\x03\xb8\x840\x90\xb0\x10\x9e\xec\"M\xb2R\xb3J\xb7\x9f\xc8_+b\xba)\xaduO\xfe\xe0\xe0\xd1%\xd1\xd3@V\xc2Bx\xfbH\x93\xa4\xd4lb\xbd\xbc=)\x82\xfb\xf0\x10v\xfdf4uq\xec2\x90\x85\xb0\x10\xde6\xd2$+5[R(˛\xfc{\xbbh\xb9\x18\xb7mY\xb8\xbe,(\xfc\xf5\\!r\xe4ų\xa95p\xb1\xd5)1\x1b\x01\xd9\x06\v\xe1ɶ\xe3)q\xa9\x19}R\x92S\xe99ܯ\x8f\xfe\xd28N\x94<\xef)\tԗ\x85\xf6\xf0\xed^\xefx\xa3\x04\xa4됷t\xba\xd7\xeb\xfd\x80@\xb6\xc3B\xf88\x91&a\xa9\x19ѵ\xe7\x1f\xd5D\xbe\x11ᵉ7\xf4=z\x89Y_f\x8d4\xb9\xc1\xaaVD\x1a`\xc0Bx\xfb7\x9e\x12\x97\x9a\x19\xdc\xda_iv}\xd4\xc9G\rf}\x19\x84\a\xf1a!<\xd9E\x9ad\xa5f\xed\x17\xe4\xad\xdfh1\x8b\xa8/\x83\xf0 >,\x84\xb7\xfd\xc6S\xb2R\xb3\xc2\x15\xc6]})E\u0557\xc5\x17~\xe7\xa7\x04\xb2\x1c\x16\xc2\xc7F\x9a\xd0\xf2\xf8\xa5fE\xc52\xc0\xf8\xa7.\xd2o\xb5\xa2.\xfd\xd0t\x92Y_f+\xbc[\u007f\xeeJ\xec9{\x90m\xb0\x10\x9e쾬\x9d\xacԬH\x14z\xdaZܹ\xb2\xb3L\x96\xcc\xef,\x95\xf5e\x96~\xb3\xfew\xbc\xde\xf1\xb5^\xaf\xb1\xdb\xf7h[Zܮ\xcfb7\x03\xb2\v\x16\xc2'\xb8.M\xfc\x06\x90Gw\xd6\xff\xccU0\xcf\xe8\xe8\xd3V\xd7\x06\xea\xcb,\xfdfGs\xcc\xe1\x0e9\xe3֊\xfc\xdc\xe9\xed\xb6\x1b\x02\xd9\x04\v\xe1\xe3E\x9a\x94K\xcd4\x0f\x01\x90\n,\x84\xa78ן\xe9K\xb5\xd4\f\u0083\x14a!\xfc\xa0\"\x8d\x15\b\x0fR\x84\x85\xf0\t\xceҤr\xa9\xbd\v^\xad\xf6]?\x01\x90\x1c\x16\xc2\xd3\xd0.\xb5\xb7\\?2\xd5>I6\v\x00b\"|\x82H\x83\xab\a\x83a\x85\x85\xf0C\x8c4\x00\xa4\f\v\xe1ih\x91\x06\x80\x94a!<\"\rP\x05\v\xe1\x11i\x80*X\bO\x884@\x11,\x84O\x10] <\x18VX\b\x1f/\xba Ãᆅ\xf0\x94\xe0\xb34\xc8\xf0`8a!<\"\rP\x05\v\xe1\x13\xec\xc9Qj\x06\x86\x15\x16\xc2S\xf4\x9e\xbcW\xdfۛ\xdfx\xdaP\xf1\xa1\xef\xa6,5#Dy0\f\xb0\x10>A\xa4A\xa9\x19\x18VX\b\x8f\x83S\xa0\n\x16\xc2S\xcc\xc1\xa9\xbe\xb3?\xbe}\xddڵkt֮Y\xbb\xf5u\x94\x9a\x81a\x81\x85\xf0\xb6\x97\xdaۼpn\xf5\\\x93\xea\xeai\xf1.\xd6\x01@Z\xb0\x10>6\xd2\xe8\xc3\r3\x8e\u007f\xf9\xf9\x97:\xfaͺ\x19(5\x03\xc3\x02\v\xe1\xc9\xf6\xea\xc1\x15\xe1E\x9bgɫ\a\x0f\xe0\xf8\x15\f\x15\x16\xc2\xdbF\x9a\x17f|\x18zdw}x\x00\x06\x01\v\xe1\xed#\x8d\xa5\xc8\xec9\xbbR\xb30\x91Mf\x01\x96\x8b\x1c\\Y\x0fD\xc3Bx\xb2\x8b4\xeb\xab{\xff\xf0\x8f\xffx\x8f\xfe\xdf?\xfbv\xcf\xe8|{m\xef\xdbk\xe3\xac\x1c\xd9d\x16Z\x88\x8bw\x80\x18X\bo\x1bi\xd6U\xf7\xad\xfb\xfb\xbf\xff?\xfa\u007fߗ\xa5f\xcd\vo6W\xc7߄]\xb1\x13\x84\a1\xb0\x10\xde>\xd2\xcc:\u007f\xf3\xec\xc7\xe7?>\u007f\xf62m\x9a\xf9\xb1\xaf\x93|\t>V\x03\xe1AJ\xb0\x10\x9el\x9b\xb8\x8dR3\xf3\x91\xedA\xeb՚\tūWOp\x19I=$\xbc\xff\x95)\xae\x87\x1b\x8c\xcb2i+\x9e\bW\x9d\x01 a!\xbcm\xa4\xd90\xb33\xf4𥙱\xa7%\xfb\x1f,l\xf0\x8c\xcf\xddY\xf9\xb2|\x14\x12~\xa9V\xbf\xb7^\xab\x95Cy\x11\xedƲ@\xd5\x19\x00\x12\x16\xc2\xdbG\x9a\x8a\xcf\xf5\xc1\x80\xb1\xf0\xa5Y\xb1o<5\x89\x93\xb2\xd6)\xa0sP\xf86\xd1\x16\xba\xd5&\xf7\x10\xf5\x94\x96\x13\x00AX\bOv\x91f\xd3\xc2'\u05ec\\\xf9\xeb_\xaf\\\xb9rM\xb5M\xa9Y]\xbe~\xf3Q\xb0\x978(|m\x99q\xf7\xa0\xdc\xc5k\xcf\xc8\xe1\x0e\xb3\xea\f\x00\t\v\xe1c#\x8d>ܷ\xf2\x97\xf3\xab\xab\x17>^]]=\u007f\xe5\xda\xd8k\b\xbf<\xf6\xaaܕG\xedፎ3\xa2*\xb9[\x8f\xa8:\x03@\xc2Bxۏ\a\xf7\xf5v\u007f\xd5ݽgù\xee/\xbb{{cW\xfa4\xa7\xf2ӓ\xa5偫\x06\x87\xf6\xf0\x93\xe4\x02\xffĥ\x14Uu\x06\x80\x84\x85\xf0\x14\xffK\xdckf\xc6\xfb\x9c\xfc1Q$\x84\xfbB\xe0QP\xf8\xbdB\x96\xcd7\x9a\xed\xadŷ䱭\xdbvu\x90\x9d\xb0\x10\xde\xf6\x1bO\x03}}\xbd>\xdf\xf6\xc7\xcf\xfaz}}6\xce\x1f\x1b\xbf\u007f\xaf\xf7\x82\xb1\x83\xb74\x99QMN]k]N\x8d\\\xac\x89\xca\xc3\xfb\xcb\xf3?\x8a]\x17d-,\x84\x8f\xf7\x8d'\xfd\x15p\xf0\xf5xץ9\xa4\xc9\xc62m\xfa\xa9\x88&3\xf2o+s\x95\x99\xe7\xe1\x1f\xf4,\x0eT\x9d\x01\x10\x80\x85\xf0\x14'\xd2\xf8\x88~=#N\xa9\xd9\x15ײ+\xb7o_?\xba \xff\xba\xdd\xd3\x00\xd8\xc2B\xf8x_\xe2\xd6w\xf9\xdb\x1f\x8f\xf3]\xa7\x96|\xf3p\xd5_\xd4f\xf74\x00\xb6\xb0\x10~0\x91\xe6X\x8eyB\xf2T\xce\t\xbb\xa7\x01\xb0\x85\x85\xf04\x88K\xed\xf9ks\x975\x1dhZ\x96\xbb\fuf uX\b?\xa8K\xed\xf9[+\x8b\xb5\xe2\xcaV\xf8\x0eҀ\x85\xf0\t\"\r\xae\x1e\f\x86\x15\x16\xc2\xd3 \"\r\x00\x83\x81\x85\xf0\x83\x8a4\x00\f\x02\x16\xc2#\xd2\x00U\xb0\x10\x9e\x10i\x80\"X\b\x8fH\x03T\xc1BxD\x1a\xa0\n\x16\xc2\x13\"\rP\x04\v\xe1\a\x11i\x10u\xc0\xa0`!|\xba\x91\x06Q\a\f\x16\x16\xc2S\x9a\x91\x06Q\a\f\x16\x16\xc2#\xd2\x00U\xb0\x10>\xe5H\x13h\xf7\xd39\xf8\xc6\xe7>\x1f\xda\xfd@\xba\xb0\x10\x9eҏ4\x9bf\xa3\x13\x04\f\x02\x16\xc2\x0f\"Ҡ\xce\x12\f\n\x16§\x1ci\xe4\x10\xed~`\b\xb0\x10\x9eR\x8e4}h\xf7\x03C\x82\x85\xf0\xa9G\x9a>\xb4\xfb\x81!\xc1B\xf8\xd4#M\x1f\xda\xfd\xc0\x90`!<\xa5\x13i\xd0\xee\a\x86\x00\v\xe1Ӌ4\xc9\xdb\xfdZ\xe4e\xc8&F\u007f\xbb{\u007fA\xab\xddd\x90U\xb0\x10>\xadH\x93B\xbb_\xd7!oޢ\x98\xe2\x8fVWK\xf4\"\x90u\xb0\x10\x9e҉4\xa9\xb5\xfb\x15\xad\x8e]\x86\vz\x00\x1e§\x17iRj\xf7\xb3\x13\x1e\x00\x1e§\x15i\x92\xb6\xfb\x19\x98\u0087+\xfd\xae\xe7\n\x91#/\x1dO˅\xb6s\xd5\x03\xae\xca\xe0\x95\xe5AV\xc1BxJ'\xd2$k\xf731\x85\xb7T\xfa\xb5{\xbd\xe3\x8d\n\x9c\xbf4\x8e\x13\x05\x9e\xdf\xe6-\x88]\t\x8c~X\b\x9f^\xa41\xda\xfdL\xec\xda\xfdL\f᭕~:\xb9\x81\xa2b-_\u07fb\xd7\x14خ\aF9,\x84O+\xd2$k\xf731\x84\xb7V\xfa\x91ExY\x00\xe5\xd1l\xd7\x03\xa3\x1c\x16\xc2Sʑf y\xbb\x9f\x89!\xbc\xb5ҏ,\xc2\xcb{\b\x9f\x9d\xb0\x10>\xf5H\xa3\xd3\xd7ۭ\xe3\x1b\x90\xb7v\xed~\xb7?\x90\a\xa9\x13\x8c=\xbc\xa5ҏ < &§\x1eiB\xcb_X\xf8y\x9c}\xfb+\xc2KtUl\xa3\xc8J?\x82\xf0\x80\x98\bO)G\x1a2\xda\xfd\xba}\xbe\u007f\x9bv\xc4\xd7m\xdb\xeew@\xcci\xd9U>\xe139\x0eW\xfa\xf5\xbf\xe3\xf5\x8e\xaf\xf5zo\xd0%\xafV\xfb\xae\xffD\xad\xe6E\xddY\x16\xc2B\xf8\xb4\"\x8dIo\xfc/q\xb7Lu\xe5W\xbdo\fÕ~Gs̢\xbf\x1d\xb4\\v\xff\xbd\xef\xd2o\x97\xc7\xdd\x04\x18\xb5\xb0\x10>\xddH\xe3#\xda\xf4\xf8Y\xfbv?\x00\x12\xc1BxJ'Ґ\xbcx\x01鑆l\x8eX\x01H\f\v\xe1\x877\xd2\x00\x10\x1f\x16§\x1bi\x12\xbc@\x00H\b\v\xe1)\xcdH\x13o9\x00\xc9`!\xfc \"\r.\xb5\a\x06\x05\v\xe1\x11i\x80*X\bO\x884@\x11,\x84G\xa4\x01\xaa`!<\"\rP\x05\v\xe1\t\x91\x06(\x82\x85\xf0\x884@\x15,\x84G\xa4\x01\xaa`!<\r5\xd2\\\xbe\xfcyg\xd4\x06\xba;/\u007f\xf5%^\x12 \n\x16\xc2\x0fc\xa49\xb8=ޗ\xfe\x00 &\xc2\x0fW\xa4\xd17\xb0i.\x0efA\x02X\bOC\x8d4a\xba;\xb1\u007f\a\t`!\xfc\xf0D\x9a\xbe>__\xdf\xf1=_\xeaw\x03\xb0\x1e\xd8\xc3B\xf8\xe1\x8a4:/=v\xd1f)\x00\x01X\bO\xc3\x17i\x06\xc2\xd7\xe1\x03 \x16\x16\xc2\x0f=\xd2諞\xde\xf3\x87\xed[7\xbfټ}\xeb\xd6\xed\xcd\xfbnگ\x06\xb2\x1d\x16\xc2\x0f=\xd2\xe8\xabn\x9f?k\xe6\xb4\x19\xd3$3\xe7W\\Ĺ\x1a`\a\v\xe1iȑF\x1fn\x98v\xf0\xf4{\xa7\xdf\xd39}z\xcd4\xb4\xfb\x01[X\b?\xf4H#\x85\x9f\x1d\xbe\x8a\xc1֊s\xf2\"\x1ep\x1eD\xc3B\xf8a\x894\x96\xb2\xb3\xbe\r3\xcfE\xaf\x03\x80\x84\x85\xf04,\x91fFHxZo\xdf\xee\a\x00\v\xe1\x87%Ҭ\x9f۽\xe7\xc7?\xfe\x89\xfe_E\xdf\xeb3??\xb2\xddw|k\xe4\xe7jNU\xba\nk\x0e\x14^\xa1Z!\x84\xeb\f\x81,\x84\x85\xf0\xc3\x12i\xd6UӚ\xaf}\xed\xef\xf4\xff\xbe%\xdb\xfdޘ۽;\xb2\x1f\xa4\xcd\xf5\xe8\xce\xc62!>\xa0\v^o\x83x'z\xab \x1b`!<\rK\xa4\x99}\xf9b\xf3\x9e}{\xf65\x1f\xa4\xcd3.v\x9e\x1e\xe8\xfc\xd0z\xf5\xc9ky\xf3n\x11u\x95\xea\xc2\xeb\xb4C\xf8섅\xf0\xc3\x12i,\xed~\x03v\x19\xbe.\u05f8<\xf6\x16ad\x19\b\x9f\xa5\xb0\x10~X\"͆Y\x17\xcd%\xfaͦ\x19\xe7\xe4\xa5V#6X\xfa\x84qwu\xcb-y\x17\x12\u07bf\xab\xdc\xf5\xc0\xea\x1e}tcq\xb1VRu\x92\xd0l9\x9aa!<\rO\xa4\tobsE\xcc\x1bO\xb7r\xb6X\x1f\x86\x84\xaf\xcdY\xb1w[\xc1T?Q\xabXv\xa0\xa9*\xa7\x1d͖\xa3\x19\x16\xc2\x0fK\xa4\xd9P\xbdn\xf3\v\x9bt^ش\xf9\x97\xb1\xed~\x9f\x88\x16\xebà\xf0\xadb\x97\U00068468\xa7\xa9K\xdf\xe1\x97͓\x8b\xd1l9Za!\xfc\xb0D\x9a\xe6\xc7\x1f\xab\x98aR\xf1\xf8\x93\x9fGo\xad\u007f\x9c\xed\x1e~ɤ\xfe\xdb:Ų\xd9\xf2jC\xe5\xa4X\x1a\b\xeeK\xe4\xd26\xf7\x84\xfc\xe92\xd8\xfb\xb7\x94j\x05K^+\xd5\xdch\xb6\x1c\xbd\xb0\x10~x\"\r\x00\xc9a!<)\x894\x000\x11^Q\xa4\x01\x80\x87\xf0\x884@\x15,\x84'D\x1a\xa0\b\x16\xc2#\xd2\x00U\xb0\x10\x1e\x91\x06\xa8\x82\x85\xf0\x84H\x03\x14\xc1BxD\x1a\xa0\n\x16\xc2#\xd2\x00U\xb0\x10\x9e\x10i\x80\"X\b\x8fH\x03T\xc1BxD\x1a\xa0\n\x16\xc2\x13\"\rP\x04\v\xe13\x1di\xf4\r\xbf\x8d:K a!|\xa6#\r\xfe\"\x80 ,\x84\xa7\xccG\x9a\xb4\xfe\"\x80\xd1\v\v\xe1\x15D\x9a\xb4\xfe\"\x80\xd1\v\v\xe1\x11i\x80*X\bO\x884@\x11,\x84G\xa4\x01\xaa`!<\"\rP\x05\v\xe1\t\x91\x06(\x82\x85\xf0*\"͛_\r\xf8h\xa0O\xfeK\xeb\x95\x02F\x17,\x84W\x14i\x00\xe0!<\xa9\x884\x89g\xb7\x94_I\xf8\xfc\x90\xb8V\x1eqmz\xe0 ,\x84W\x10i\x0e\xee\xee;\xb2\xd9w\xe4%\xfd_\xef\xf1\xed136\n\x8f?bA\x1a͖\xcbEN\x93\xfd3_,+ʝ\xa3o\xd7\xffb\xceF\xfb\x19\x83\xe4\x13MLN6\a\xd8\xc2Bx\x05\x91慅7߬\xee6\xff\xed\xf9e\xf4\x84m9\xbb\xa2\x96\xa4\xd1ly\xc1k\\k\xd8\x06wᎥ\xb9\xd7\xe5h\xef\xb8m\xf6S\x06\x87\xff\xddZ\\\xd9xp\xb0\x10\x9e2\x1fizoҗ\x1f\a\xfeu_\x8cz\xb2C\xab\v\x0e\xaf\xba\xaf\x06\x87\xa9\x17\xfd\xc5\x11\xfe\x9a\xd8F\xfe.s\\\xaf\roC\x1a.\xe5=HX\b\xaf \xd2\x1cy\xa33\xfe\xf3\xb5\x85=\xc1\xe1)q*8\x1c\xb2\xf0gDkh\xdcUXk;g\xb0@\xf8A\xc2Bx\x05\x91fs\xf5\xf9\x81\xde8\xa7%\xfb\xf3\x9e6\a\xdbJ[?\x10\x1f\xec-}\xc5x\x14\x14>\\gI\x93\x03\xd7ٞN\xad\xfa\xed3\xe4\xd1o\xf5\xfc\xae\xadx\xa28\xbf\xea\x8c\x11\xe7w\x05\x02v\xff\x04s\xea\xaa\xc0\x0f\xa9\xcf\r\xbd\xa8\x02Xk2\xc7m[\x16\xdcBhh\xa9Ԍ\xe8ѼPS\x9c\xbf\b\x91f\x90\xb0\x10\x9e2\x1fi\x12\xfdE8!\xbc\xe6\xe0B\x8dxP\x94\x89E\x9f\x19\x8f\xc2E\u007f\xc1:K\xd2j\xbd:\xe5b#\xf5\x1c*Yv\x85\xae\xd4\xe7y\xf5̢\x89)M\x8de\xaeSf\x9c\x0f\x04\xec\x13\xdeF\xe1\xf1\x86*\x15\x0e\x89\xc3Q?6\xb2&\xb3\xe4yO\x89\xbe\x05\xcb\xd0R\xa9i\xed\xd1<\x93\xf7\xc0k-\x95\x02\xc2\x0f\x0e\x16\xc2+\x894\xf1\xff\"\xec\x15\x1f\x05\x87m\x9a\xd0\xda\x02\xe3\xa0\xf0\x96:K\xcf1}T+\x8c\x03P\xcf\x14\xfdf\xa9\x11T\xb4\xc9\xfa^\xb8\xa7\xb4\x9c\"\xbbr\xac\x91\x86.\x88\xe8S\x93\x115\x99\x13o\x10]/)\x8f\x18Z*5-=\x9a\xd3K{\xe4j\x10~p\xb0\x10^I\xa4\x89\xff\x17\xa1E|b\x0e\xae\xadҊE\xf1\xf8\xa7\xbe0\x1e\x852\xbc\xa5\xceR\x8f*\x8bǚgt.\x8c}\x9fn\xe5\xed\x97C\xed\x19y\xbbC\\K(|̹KkM\xa6q\xd4\xdc`l!4\xb4Vj\x86z4\xaf\x8b\x9d\xf2\xf9z\b?8X\bO\xceF\x9aw\x83fo\x9c\xb0\xe3\x94\xf8˶\"\xf3\xa4yPxk\x9d%\xf5\xccт{\xea\xca\xd5Ԗ\xdf/G\xe6A\xabW\x1cK |\xbb8D\x91\xc4\xd4dZ\xb6`\f-\x95\x9a\xe1\xed\xb6\x9b\xf9\v\a\xad\x83\x84\x85\xf0\x0eG\x9a\x9e\xd0Y\x96~\xe3,M\xbf\xf9\x1eTPxk\x9de\xd7\xf4\xf1\xc1\xc4C\xad\x13\xfa\xcdDC\x9aqd\xbaS\xdc\b\x88Yo#\xbcG\xeb\xa2H\"j2-[\b\r-\x95\x9aa\xe1\xbf\x10\r\xf2\xf9\xa5\x10~p\xb0\x10\xde\xe1HC\x8bJCo\xb3~\x96\xffYp\x18\x14\xdeRgym\x8aK\xee_[\xddry\u007fQk\xbe\x91hH+\xbe\xa5?|P.u=\xad\xcf}4Vx\xff\xe4\xaa\xe0\xf0\x93\x8d\x1d\xd1\xdb%\xadH\u007f9tMrG\f-\x95\x9a\x96\xbf\x1c\xe5%z\xee\xf9h<\x84\x1f\x1c,\x84'g#\r\x9d\xc9\xf9m\xf4\"K\xb3e\xb8\xce\xf2z\x99\xd8(O\xd3\xc3Zj\x06\xd4\xc1Bx\xe7#M\xfa\fg\xa9\x19P\a\v\xe1Gb\xa4\x01#\x13\x16\xc2\xd3ȋ4`\x84\xc2B\xf8\x91\x18i\xc0Ȅ\x85\xf0\x884@\x15,\x84'D\x1a\xa0\b\x16\xc2#\xd2\x00U\xb0\x10>ӑ\x06\x80 ,\x84\xa7\fG\x9a\x01\x94\x9a\x81\x00,\x84\xcft\xa4I\xf7\x05\x02F/,\x84W\x10i\xd2z\x81\x80\xd1\v\v\xe1)\xf3\x91&\xdd\x17\b\x18\xa5\xb0\x10\x1e\x91\x06\xa8\x82\x85\xf0\x884@\x15,\x84'D\x1a\xa0\b\x16\xc2#\xd2\x00U\xb0\x10\x1e\x91\x06\xa8\x82\x85\xf0\xa4 Ҡ\xd4\fHX\b\xaf(\xd2\x00\xc0Cx%\x91&\xf1n\x1d\xa5fY\x02\v\xe1)\xf3\x91\x86g\xa9YRⴞ\x81A\xc3Bx\x05\x91\x86g\xa9Y\x98\x03\xc7Ȏ8\xadg`а\x10^A\xa4aZj\x16\xe2\xd1%\xf6\xcbq\x01\xa7a\x86\x85\xf0\x94\xf9Hý\xd4l\xea\xe2\x84O\x83ႅ\xf0\n\"\r\xc3R3\xf2V\x96hEsJ\xfc\xc6\xc6$S\x88N\x8e\x13\xa2\xfeL\xcd\xc4\xdc\xca\xdb\xf1ZϮ\xd6L(^\xbdz\x82k\x10W\xc3\x04<\x84W\x10i\x12\xbd@\x1c*5;:vi\xcb\xfe\x9dE\xe26u\x1d\xf2\x96N\xd77\xfc\x81,\x94j,)\xcd+YU3\xf6\xd38\xadg\xfd\x0f\x166x\xc6\xe7\xee\xac|\x99@\xfa\xb0\x10\x9eTD\x9a\xf8/\x10\x87J\xcd\x1a\n\xe4\xb5X\x1b\xf2\x8d\x98n\x894S\x85\xfb\x06\xf9o\x98\x0fb[Ϛ\x84\xfeǦ!\x9c\xbc@Z\xb0\x10^I\xa4\x89\xff\x02q\xa8\xd4\xec\xb3\xe2\x89+v\x9e\xf0\x1b-Q\x11\xc2k\x9f\x86'Ŵ\x9eQ]>\xc9K\xd3\xe3\xec\xcd\xe0`!\xbcÑƩR\xb3\xeb;\x16O\x16E\x1bc\xf6\xf0S,sb;q^\x1e{U6$`\x0f?8X\bO\xceF\x1a\x87J\xcd\xda\xeb\xf4\x9fs\xbd1\xb7A>0\x84\xdfi\xecڧ.\xb2L\x8a\x15\xfeӜ\xcaOO\x96\x96\xe3|\xe5\xe0`!\xbcÑơR3\x8f0^;n\xa37ǭ\xaf|\xc5L=\x11g(c\x85?&\x8a\x84p'>\xab\x0f\xe2\xc2Bx\x87#\x8dC\xa5f\x1e\xe1\xaaom\xa9\x15Fo\x8eG\xdb\xd2\xe2v}F\xb7\x0f\x1b'l>\x91\xcb\xec[ώ\x8d\u07ff\xd7{\x01;\xf8A\xc2Bxr6\xd28Tj\xb6k\xba\xa7D+t\x9b=Q\xb7V\xe4\xe7No':i6\x9d\x19\u007f\x0e\xec[\xcf\x0eir\x996\x1d!~P\xb0\x10\xde\xe9H3\x92Jͮ\xb8\x96]\xb9}\xfb\xfa\xd1\x05\xf9\xe8\x1f\x19\f,\x84w:Ҍ\xa4R\xb3\x16\xf3\xbc=\xf9\x8bBG\xcf \rX\bONG\x9aA\xe0T\xa9ٱ\x1c3˜\xca9\x91d&\xb0\x83\x85\xf0\x8eG\x9a\xf4q\xac\xd4\xcc_\x9b\xbb\xac\xe9@Ӳ\xdce\xc3\xf6G#\xab`!\xbc\xf3\x91&}\x1c+5\xf3\xb7V\x16kŕ\xad\xf0}P\xb0\x10\x9eF`\xa4\x01#\x13\x16\u008f\xc0H\x03F(,\x84\x1f\x89\x91\x06\x8cLX\bO\x884@\x11,\x84G\xa4\x01\xaa`!<\"\rP\x05\v\xe1)Ñ\x06\x80 ,\x84\xcft\xa4\x19@\xa9\x19\b\xc0B\xf8LG\x1a\xfcE\x00AX\bO\x99\x8f4i\xfdE\x00\xa3\x17\x16\xc2+\x884i\xfdE\x00\xa3\x17\x16\xc2#\xd2\x00U\xb0\x10\x9e\x10i\x80\"X\b\x8fH\x03T\xc1BxD\x1a\xa0\n\x16\xc2\x13\"\rP\x04\v\xe1UD\x1a\x94\x9a\x01\t\v\xe1\x15E\x1a\x00x\bO*\"M:\xb3\xc1\xa8\x85\x85\xf0\n\"M\xdcR3\xef\xd8\xc0ŕƟ\x8c\xbb~\x98\x93s&\xe4M?Pv(y\xebY\xfc\xaa3\xe0$,\x84W\x10i▚\xdd:T8G^>o\x97H\xe1:/Ǵ\xaa\x96]\v\x8c֏d\xadg\xf1\xab\u0380\x93\xb0\x10\x9e2\x1fi\x12\x94\x9aM4.\x98\xf7Q*\xc2W\xba\xfdF#\x82\xb9\xefNR\x02\x05\xe19\xc2Bx\x05\x91&A\xa9\x99)|\xff\xb6\x1b\xf1&\x84\x99h\\z\xe9d\xa0\x8d\x00\u008f@X\b\xaf \xd2$(5\x9b\x18\xb8$jD\xa1\x18\xf9_\x99\xe2z\xb8\xc1O\xb7\x8b\xb4\xdf\x14\x17\x1fX\x91\xef\xee\"ZR(/\xfb\xe5\xdfk^\xeaݦ\xf5,\\T\xa6\v\xffT\xa8\x87\f\xb0\x81\x85\xf0\x94\xf9H\x93\xe0/\xc2\xc4ڞ\x9e\x97e?SD\xa1\xd8R\xad~o\xbdVKt O\xacr\x8b\t\x1b\x8b^&\xfa\xa4$\xa7\xd2s\xb8?\xb0\xa2M\xebY\xb8\xa8L^D{rcKт8?\x158\x03\v\xe1\x95D\x9a\xb8\u007f\x11&\xcas4\x85\xe68T(\xd6fDz㶰\x86\xf6\x8aVZ*\xff\x10\\{\xfeQM\xe4\aN\xbfش\x9eY\x8bʴ\xc2/\x88j\vb\u007f p\x10\x16\xc2+\x894q\xff\"L\xacjo_\x1a\x14>X(VkV:=\xa8\xef\xe2\v\x1b\xe9]\xd1EOט\xcf\xdc\xda_)\xf6\x1a#\x9b\xd63kQ\x99&_!\x81\xba'\xc0\x05\x16\u0093\xb3\x91F\x17\xf3\xd4Ns\x1c*\x14+7\x1bj\xaa\xf4\xa8S\xd8F\xed\xba\xb6u\xba\xf0\xedF\"\xf7\a\x9e\xb4k=\xb3\x14\x95Y\xfb\xcd\x00\x17X\b\xefp\xa4Y\x16\x1e\x87\n\xc5j'Ig\xfd\x13\x97F\b_\xb8\xc2x\xb2\xbeԸ\xb3i=\xb3\x16\x95Ax\x8e\xb0\x10\xde\xe1Hc\x15~q`\xb0W\xc8\xce\xf7F\x19^,\xc2\x17\x15_ӗ\xfa\x03/\v\x9b\xd63kQ\x19\x84\xe7\b\v\xe1\xc9\xc1Hs\xeb\x9d\xc29\x87\xccӌ\xd6B1\xaaɩk\xad\xcb\xd1%?\x95\xffrO\xa3v\xb2\xa7\xc6}\x81\x8aD\xa1\xa7\xadŝ\xfbQ\x9c\xd63KQ\x99\xb5\x87\f\xf0\x81\x85\xf0NF\x1a\xe3\xb34f\xb7\xb6\xb5P\x8c\xfc\xdb\xca\\e\r~\xf2\x17\tј'\\MḄGw\xd6\xff\xccU0O\xd6\xf5ٶ\x9eY\x8aʬ=d\x80\x0f,\x84w6Ҁl\x82\x85\xf0\xe4`\xa4\x01\xd9\x05\vᝌ4 \xbb`!<\"\rP\x05\v\xe1\t\x91\x06(\x82\x85\xf0\x884@\x15,\x84G\xa4\x01\xaa`!ӑF\xe7\xf8\xbe\x81\xe3\u007f\xf0\x05\xfe\xbd\x9elv\xf2\xce2\vޱ\xa2\xdcO-B\x8cݟl\xaay\xad\xa7\xdad\xb3@\xe6`!Ҭ\x99ֽ=\xf0\xef\xab7\x9eL\xb6B\xf2\xce2\v=\xfbE\xae\x97\xbaZ\xc4\xfe\x9edS\xe9\xf6;\x0f\x97y?K6\vd\x0e\x16\xc2+\x88\xc7O\xf3\xe3\x00\x00\x0e\xfdIDAT4\x83 I\x85S\x98.Q\xa3\xef\xb4?\x11]\xc9&J\xdc\xeed3@&a!\xbc\x82H3\b\xd2\x10~\xbf\xab\a\u008f\fX\bO\x19\x8e4\x89h\xd2C\xb5\x87<\xc2(_\r6\x99\x19\x04\x84_.rv\xd1'\x9a\x98\x1c\xd9oF\xfe]\xe5\xae\aV\xcb\x14\xd3%>\x99\xdab\n\x1f\xea7\x8b7\xd7*|h\xe9r\xa1\xedD\x01\x9a\x1aX\b\xefd\xa4\xe9\xf2\xe6\xd5_\xa1+\xf5\xf9\xde.K\x93\x99$ \xbc\xd10\xec\u007f\xb7V\x8b\xec7\xa3ڜ\x15{\xb7\x15L\xf5\x1b\xc2o\x9bc\n\x1f\xee7\x8b3\xd7*|h\xe9_\x1alj\x02\xcfo\xf3P\x80\x96yX\b\xefl\xa4\xa9]\xa2\xdf\xd4\xdcof?\xd7\"\xbcu\xa9\xb6\x94\xd0\x16\xa2\x04\x16\xc2;\x19i\xf4\xb8=\xa1\x85Z\x8adܰ4\x99\x91\xbd\xf0\xe1\xf6\x9b\xb2@!\xc2\xfcp\x99Wg\x87.|x)\n\xd0\xd4\xc1Bx\x87#\rmѶ\x98\x83`\x93YDg\x19\x9dq\xe7\xe6U>#\xc42k\xbf\x99\xbe\xdfvOȟަ\x1f\xf4\x8e\x95\xe7\xf0\xfd\xe5\x85~K\xbf\xd9t\xfb\xb9\x81\xde4!r?\xb0,E\x01\x9a:X\bO\xceF\x1a\x90E\xb0\x10\xde\xe1H\x03\xb2\b\x16\xc2;\x1di@\xf6\xc0BxB\xa4\x01\x8a`!<\"\rP\x05\v\xe1\x11i\x80*X\bO\x884@\x11,\x84G\xa4\x01\xaa`!<\"\rP\x05\v\xe1\t\x91\x06(\x82\x85\xf0\x884@\x15,\x84G\xa4\x01\xaa`!\xe5H\x13\x8e1_\x9e\x8e\x9e\f@\n\xb0\x10\x9eR\x8d4\x92\x8bG\xf6\xed۷砼\xddw\xf08\x92\xed\xf1\xb5\x03\xdbg\\>\xbd\xa7\xef\xf4\x1e\xcb\xca\x1e\xa1\xb5\xe8w{]\xc2\x13\xb3\xbdh\x96\x8b\x9c\xa6ds\xc0肅\xf0iE\x9auմ\xe6\x8e;\xbe\xa6\xffw\xb7\xafyF\xf7\xeb\x15\xddoL;\x1b~Q\\\xadq\xc9\xda0wn\xcd\xd5\xc8-\x1d8F\xd1\x18%\xdb \xab`!|Z\x91\xe6\xb9\xc7>?\xfe\xec\xda\xff\xfb\xf5\xeag7\x0fl\x9fy\xf1\xdc\xc1\xbes\aoZV\xaa\x9b\xe3\xbaN\xd7r\xe7\xd4Em\xec\xd1%\x14\v\x84\xcf6X\bO\xe9D\x9a\x17f\xc87Y\uf2db\xe1\xebj\xdcM\xb4\xab\xb2&Z\xf8\xa9\x8bc\xa6B\xf8샅\xf0iE\x9a\r3?\xd6\a\xff\xfc\x8d\x83d\x9e\xa5\x89~\xaf\xb5\xae\xa6a\x01\xcd\xd9!\x85\xbf\xb1\xb8X+\xa9:\xa9/l\r\x94\xe7M1\xa6\x9cYT\xa4\x15ι\xa0\x8f\xb4\xa7V=઼@ [`!|Z\x91f\xc3\xec^}\xe03>K\x138\x0f\x1fA]\xcd\x05\xd7\x17\xe3/I\xe1[Ų\x03MU9\xedD]\x87\xbc\xa5ӽ^\xaf,\x8b\xa4\x03\xae)/\xee\xf7\bYU\xa9\x89ɍ-E\v\bd\v,\x84\xa7t\"͆Ƕ7\xefn>rz\xdf\xee\xe6\xe6'm\xdei\xad\xab\xa1\xb2e\x8f\x92\x14\xbe\xa7\xa9\x8b\xc8_6\xcfX\x1e\x8a4=%\x95\xb7\x88\xfa\x9b\xae\xe9c\xad\xf0\v\xa2\xda\x02\x02\xd9\x02\v\xe1ӊ4o̝9\xed\x11\x93i\xd5\vc?K\xa3\v\xff\xa2\xd8h\bOW\x1b*'\xe5\x892cyH\xf86q\"4Y[F\xa8|\xcf*X\b\x9fz\xa4ѹ|\xfc\xa0\xce\xdbo\xcb\xdb\xe36\xdf{҅\xbf\xfa\xd4\x15C\xf8\xf6\u0092\xa7[\xbc\xee(᷈\x9e\xd0d\xe3\xa0\x15\xc2g\x11,\x84\xa7\x94#M\n\xe8\xc2K\xa4\xf0\x93˥ڋ,\xc2\xef\xfc\x94h\xbf\b\x9f\x91\x87\xf0\xd9\x06\v\xe1S\x8f4)`\x11\xbed\x91>\xf0?l\n\xefv\x13]\x11M\xfa\x01l\xa1\xbb_\u007f\xbcb\x15A\xf8샅\xf0iE\x9a$|Q㾤\xdf]r\xd7|A\x1e\xb1\xb8\xe1\xf9\xa9\xa2\xe8\xc5wIj\xbd\xa5\xc5\xed\xfaL\x1f\x1d\x18\xff\xe0\x8e\xb6\x15b']\xf2j\xb5\xef\xfaO\xd4j\xdeKI\xb6\nF\v,\x84\xa7a\x8c4\x1e!\x9e\xd0\xef\x96\t\xe1!\xff\x96R\xad`\xc9k\xa5\x9a\xfc\xb0\xc1\xad\x15\xf9\xb9\xd3ۍ9\x1f-.\xce+o\x91\x9f\xa5\x11B{ߥ\xdf.O\xb8M0z`!\xfc\xb0F\x1a\x00\x12\xc0B\xf8\x94#\r\xec\aC\x84\x85\xf0\x94j\xa4\xe9L/\xcf\x03\x10\r\v\xe1S\x8e4i\x1e\xc0\x02\x10\r\v\xe1S\x8e4\x10\x1e\f\x11\x16\xc2S\xaa\x91\x06\u0083!\xc2B\xf8\x94#M7\x84\aC\x83\x85\xf0)G\x1a\x00\x86\b\v\xe1)\xd5H\x03\xc0\x10a!|ʑ\x06\x80!\xc2BxD\x1a\xa0\n\x16\xc2\x13\"\rP\x04\v\xe1\x11i\x80*X\b\x8fH\x03T\xc1BxB\xa4\x01\x8a`!<\"\rP\x05\v\xe1\x11i\x80*X\bO\x884@\x11,\x84G\xa4\x01\xaa`!<\"\rP\x05\v\xe1\t\x91\x06(\x82\x85\xf0\x884@\x15,\x84G\xa4\x01\xaa`!\xa2\xb7\x18d\a,\x84\x1fd\xa4\t\to) n\xaf\xd3U\xbfޘ\xdb\x10Q\xd8Z3阁qF>\xd4P\x1c\xd1[\f\xb2\x03\x16\xc2\xd3\xe0\"MHxK\x01\xb1G\xb4\xc9\xe7\xdc\xcb\"\x84o\x13ƻ\xb2\xf5\x1b\x8d\xe7\x82\r\xc5\x11\xbd\xc5 ;`!\xfc`\"\x8d\xb5T\xd8R@\xec\x11\xae\xfa֖Zq \xa2\xa1\x98\xea\xc6ִ\xe8K\xe5\xa1k\xb8\xa18\xa2\xb7\x18d\a,\x84\x1fL\xa4\xb1\x96\n[\n\x88wM\xf7\x94h\x85\xee\x03\x91\r\xc5\xfa>\xde=!\u007f\xba\xb1\xf3\x0f7\x14G\xf4\x16\x83쀅\xf04\xa8H\x03@\xfa\xb0\x10~0\x91\x06\x80\xc1\xc0B\xf8\xc1D\x1a\x00\x06\x03\v\xe1\t\x91\x06(\x82\x85\xf0\x884@\x15,\x84G\xa4\x01\xaa`!\x10i\x00\xc88,\x84'4n\x03E\xb0\x10^\x8f4\aw\xf7\x1d\xd9\xec;\xf2\x92\xfe\xaf\xf7\xf8v\xeb\x93\xc7r\x8c\xf2\x8e\xd8\xee\xb1-\xe3\u007f+\xef\x92Vr\x03\x10\x86\x85\xf0\xfa\xce\xfd\x85\x857߬\xee6\xff\xed\xf9\xa5\xf5\xc9\xdb\xefx\x1b\xc4\x16\xef;\xfd\xd1k\x95iF\x95A\xd2Jn\x00°\x10^\xa7\xf7&}\xf9q\xe0_\xf7Ũ'\xdb\xc5;\xb1kt\xe5\xd4\xe4t\x19#\b\x0fR\x86\x85\xf0\xc6\x1bO\x9d\xf1\x9f\xb7\x15\xde+\x8e\x89\x03\xc6\b\u0083\x94a!\xbcq\x96\xe6\xfc@o\xbcӒ!\xe1\xc35\xdbD\x9eb*6M\xd7V֊o\x11\xf5?莜\x00\x80\r,\x84\xa7D\x91&\xf0N\xeb\xe1~\xb2\xd4l\xf7\xb4\x89\xfa.\xea\xfa\x8dh\xbb%\xcf\xd2T\x1e\xde_\x9e\xff\x91u\x02\x00\xb6\xb0\x10>a\xa49\x11\xfe,M\xb8f{\xffX!\x9a\xa8E\x88\xb1\xfb\x89\x1e\xf4,\xce+\xae\x91=\xf3\xe1\t\x00\xd8\xc2B\xf8d\x91\x06\x80ႅ\xf0\x84o<\x01E\xb0\x10>\xd9Y\x1a\x00\x86\v\x16\xc2#\xd2\x00U\xb0\x10\x9e\x10i\x80\"X\b\x8fH\x03T\xc1BxD\x1a\xa0\n\x16\xc2\x13\"\rP\x04\v\xe1\x11i\x80*X\b\x8fH\x03T\xc1BxB\xa4\x01\x8a\x80\xf0 \xab`!<2y\xa7g\x99M\xb3\xcf!Ҁ\xcc\xe3\xac\xf0\xbeШ\xf3\\x\f@\xc6pVxyb\xe6\xf8\xeeM\x1b\x9e[\xff\xec\xda\xf5ϭ\xdf\xf0zs7\xceՀL\xe2\xb0\xf0z\x8aٺp\xf6c\xb3fUϟ=k\xd6c\xd53.\"\u0600L\xe2\xbc\xf0\x1b\xa6\x1d9\u007f\xf6\xfcM\xba|\xf6\xfc\xf9g\xa7!Ƀ\x8c\xc2@\xf8\x8a\x9b\xfa`\xdfJ\xf9pkŹ\x81^\x94\x9a\x81\xcc\xe1\xbc\xf0/\xcc\xfcP\x1f\xfc莃\xfa\xa3\xe7f\x9eK\xb6\x06\x00C\xc1y\xe17\xcc<\xab\x0f\xee\xbfCޮ7\xc6\x00d\f\xe7\x85_?\xb7{\xf7}\xf7\xde\xfd\xb5\x1f\xdc\xf7\xf3\xbe7ft\x1e\xdc\xe0;\xbe9jV\x8b\xbc\x12\xd3\xc4\xe8+\xa4\xee/h%\x00\xd2\xc3y\xe1\xd7U\x0f\xac\xfd\xc6\xd7\xff\xee\x8eo|\xe3;\xbe\xe6\x19ݻ\xa3K\xcdt\xba\x0ey\xf3\x16\x9d\x8a^\xb7\xd5\xd5\x12\xbd\b\x80$8/\xfc\x86\x8a\x8b\x9dǏ\xdf\xfb\xf5\xed\xc7ߣ\x97f\x9e\xef>Oݗc'\x16\xad\x8e]\x86\x8bb\x83\xb4q^\xf8\x17f\x9c\xd6\a\xf7\xca\f?\xb0~V\xbc\fo'<\x00i\xe3\xbc\xf0\x1bf\xc9\x1d\xfa\xac\xefI\xed7͌wZ\xd2\x14\xde\xff\xca\x14\xd7\xc3\rr\xcf~=W\x88\x9cF\xb9l\xb9\xd0v\xaez\xc0Uy!v%\x00\xa2a |ŗ\xa1\x87\x9b+\xe2\xbd\xf1d\n\xbfT\xab\xdf[\xaf\xd5\xcaa\xbb\xd7;\xdeh\xfe\xf8K\xe38Q\xe0\xf9m\xde\x02\xdb\xf5\x00\x88\x80\x81\xf0\xf3\u05ec\u007fv\xdd\xd6ן{v\xdd\xfa\xf9\x8f\xc4\xfb\x1a\x88!|\x9b\xd1w`\xde\xea\xe4\x06\xfaY\xb5|}\xef^S`\xbb\x1e\x00\x118/\xfc\x9e'\xab\xe7Ξ]QQ1{\xf6\xdc'Wv&\x12\xbe\xd6蚧\ak\xcde!\xe1\x97\xea7\x1e\xcdv=\x00\"pXx\x9d\xde\xce\xcb:_\xf5~\xae\xdfv~\x15o\x96!|y\x951\xae*7\x97\x85\x84\x97\xf7\x10\x1e\xa4\x82\xf3\u0093\xf1!\xe1͏w\xc6\xf9`\xf0\xed\x0f\xe4A\xea\x04c\x0f?\xc9hh\x9d\xb8\xd4|\x06\u0083\xb4q^\xf8\x01\x9f\xaf\xdb\xe7{|\xda\x11_w\x9f\xcf&ϼ\"\xbcDW\x8d\x82ʽB\x9e\x97i\x14{\xcdg \xea\u007f\xc7\xeb\x1d_\xeb\xf5ޠK^\xad\xf6]\xff\x89Z\xcd{)\xce\x16\x00\b\xc1Bx\x1f\xd1\xf6'\xcfR\x9c/\xf9\xb5Lu\xe5W\xbdo\f\xfd\xdb\xca\\e\xc6y\xf8\xa3fՙ\xd8A\xcb\xf5[\xed}\x97~\xbb\xdc~}\x00°\x10\xbe\x97H\x8f4\x84\x8b\x15\x80\x8c\xc3BxJ\x14i\x00\x18FX\b\x8fK\xed\x01U\xb0\x10\x1e\x97\xda\x03\xaa`!<\xe1R{@\x11,\x84G\xa4\x01\xaa`!<\"\rP\x05\v\xe1\t\x91\x06(\x82\x85\xf0\x884@\x15,\x84G\xa4\x01\xaa`!@=BDAGHF\x00f\x00JLI\x00j\x02\x03l\x04OQN\rp\nSUR\fr\x17VXU,`\xae7]\xad8^\xae\x16w\x1d[]Z8a\xaa:b\xab;b\xact(\x14\n\xa2և\xa1\x8c\xed<\x86\xe1\xa9y\x06\xa4)jU\bJ\xad\x04\x19\x89ЂR\xadB\x88$s~\xf7ܿ\xe7\xde=w\xef\x9eݻٽ\xbb\xef\x97#\xb9{\xf7s\xce\xf9\x9c\xb3{\xde{\xef\xb9w\xf7\xadP\x00\x00H\x18\xc5/\x00\x00\x00l \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t|$\xe3\x18\x00\x00p@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12\xc8H\xc6\a\xbf\xf7\xa8D\x8a\xdf6\xce\xf8?ђ\x8a;\x9ey\xdf/\x12\x00\x90u$.\x19\x9f\xb4\\\xb5Գ\x9a\x84\xd9\u007f\a1\x19\xd7\xe2\x17\f\x00\xc86\x12\x96\x8c\xdf\xcf$$u\xc9\xf8`\x06\xe1X\xe1\x17\x0e\x00\xc82\x12\x96\x8cz\x12\x84d,aJQRS?\xb7\x82mD\xff\xe0\x17\x0f\x00\xc8.\xfaY2&\xab\xb5,\xf8@\xdd8\xfc8ӌF\xbfx\x00@vѿ\x92\xb1\x9f\xe9\xc4\a\xfa\xf6lusF\xfcp\x00@\xb6\x91\xa0d4\x9a\xcb\x0f\xcf/P\xff\xb9Y\xdf\xf9[u\xb3X\x15\x80(!\x15\xc7\xf67M+.\x9b\xfb\xbcY`\u007fӍ\xe3\x8a+\xeb\xff\xcbٚ&\x19F\xcc\U000cd34dKD\xc1\x875-Yqm\xb4\xa2\x9e\xe9T\x9d\xbe\xf7\xad\xd1\xea\xf6[q\xa3?9\x06\x00H3Ғ\xc1tb\xf4~kg\xfd1]2~;Y\u007f\xbe\xfe\xb0\xf6ԆqF|\xeda\xbe\xb5O\xd8\x12Fq\xa3\xebb\xad+X\x13\x81\xc7\xd8\xe3\x9a\xff\"\xba(\xa9,e\x8f\xe3G\x1f\x03\x00\xa4\x1bi\xc98VE\xccK\x1d\x15D?dP%c\xc2D3\xe0^\xf6\xcc\xf3\xa3͇\xa4\xc6\xf1ٿT\xdfY1\xff\xb9\xb7\xac}\xee`&\x02\x13\xb4}\xab>\xb9V\xfdW\xbf\x16{\x83\xba\xb5&~\xf41\x00@\xbaIP2\xfe\xf0\xfc\xadꤼ\xf7\xf9\xe7\xf7k\xb3^;3\xf9ou\xe3*\xf6I\x1fe\x13\xb6l\xe9\xf3͕lC=a\xf8\xa0L\xfd\xfb\x9du\xbf}z\x82\xfa\xb7\x99o\xee\xf0\xcdք\xbf\xf1\x19\xfd\xf0!&\xf8\xb0\xf6t\xd1w\xa6\x16\uedcf-~ϔ\xe1\xb0O4\x00 \xdd$(\x19\xdc\xf2'[T\x18͎\x11\x9a\x88qɃI\xc6D\xb6g?ӌ\xdac\xc7V0E`b\xf2[5v\x9a\xa3\xbd\x0f\xe6[\x9aA*\xb4刘`M\x04Jԓ\x97\x9dj\x8dEFc\xec0\xe7\xff\xf9E\x03\x00ҍ\xbcd\x1c\xab!\xfa\x99\t;i\xd0V%\xa2\xd6S-\xeaV\xe9'Z\x84~\x9a\xf0\x1du\xeb\x0f\x8e\x06\x8f\xfd\xfe_\xad\x93\x98\xe8o\x8d\xea\x1c\xc1\x9a\b\xfc\xab\x11]\xabn?\xad\xee\x9bl4\x16?\x1a\x00\x90f\x92\x90\x8c_\xa8[\xb3\xf5S\x85\x1b\xb4\x1dL2\xfe[\xdbz\x8b\xcd߷\x8e1M\xa8kdLS\xb7~\xe1n\xf3\x93\xff^ZS\xa2iƵ\x9f\x1c\x8b\r\xd6D\xc0,\xf4<\xd1.\xc5\x1a\u007f\xfc\xa2\x01\x00i&\t\xc98\xd1\x00\x804\x93\x84d\x1c\xfbWm\xb2N3V\x19t\xc9\xf8\x83\xb6\xa5\xcdߝ\xaey\xcd\xdd\x00\xf6\x8b\xa5\x8d\xf5\xe6\xad\x1b\xfbK\xb4jb\x83\xb5=\u007f0\x8b\xb0[̗\x1c.1.\xb6\xfaE\x03\x00\xd2K2\x92\xc1.\x95\xdc\xfc\ab\xdd\t\xc1$C\x17\x02\xe3Ą\x89\x81\xeb&.\x1dv\xc7g\xbd\xf9\x80]6m:\x16\x1b|X\xafĀ\xad\xb6\xde\xf0\xbcU\xce'\x1a\x00\x90^\x92\x91\fv\x80Aء\x86\xf1\xedu&\x19\xffO\xdbb˟e\xfa\xca\xe4O\xb5\x1d\xff\xe5\x9c\xcc\xecd\xc6\xfc.\xda[\xac\xd8\nA\xb0K\x04\u0602\xe7͖P\xf8E\x03\x00\xd2J\u00921_?&\xd00n\xc8*1\xee\xecds?ʖ\x13>\x98\xaa\x1f\r\xb0\xaf\x9cMf\xe7\x11\xea\xf1H\xe9\xcd\xdc\xfd\x12\xecЄThG$\xbfg\a\x19d\xa7 X\x13\x01\xbb\xd0/\xf4\xc6*\xf5[\xc2\xfc\xa2\x01\x00i%a\xc9`G\x15\x13\x97\xfc+\xbb,z\xec\xadBm\x16\xcf7\x9e\xd2n\xe5*nZ\xb7\x82\xdd\x18J~k,S\xccx\xfe\xad\xe7\xd9ڥ\xe3>\xeez\xad`\xf9\xcds\xa7j\x1bs\x8f\t\x82]\"p\xb8L\v}\\\u007f\xe4\x17\r\x00H+\tKF\xb36q\x8d{9\xe7j\xdb\xe6\x9a\x02\x93\f\xfd\xa2)1\xceP\x9e#\x16\xe3\xfe\xc07\xf7\xfe\r\x84\xa3j\xbf(\xd8-\x02?d\x8fG\x9b\xe7\x1e~\xd1\x00\x80t\x92\xb0d\xbc\xaf߀\xa5\x9f\x9bh'\v\xe5\xe6\xb7G\xb4\xe5\xcf*}\x1a/\xd0OV\x9aM\t\xf9?\xbfu\xb6\xb7\xbfΞ\xf2s\r\x19p\x05\xbbE@;\x9b\x99k=\xf4\x89\x06\x00\xa4\x93\x84%\xe3\xd8\x1f\xea'G'\x1b\xdfng\x17=\xc9\x0f\xcdg\xb4\x8b\xac\x1f4M\x8dr_~\u007fkɌ\xb2\xa2\t7/\xfd\xe0\x98\x9b\xdf7~gr\xb4\xb8\xe2;?\xb4\xc5\xc4\x19\x1c#\x02\xec\xeb-\xeb\xec\x87>\xd1\x00\x804\x92\xb8d\xf0\xecd\xf3\xd4\xfa\n\xbb}_\x06\x00 \xc7IJ2>ak\x19\xf6\xd7\xcd \x19\x00\xe4\r\xf2\x92\xf1\x8b_<\xc7n\x95\xe0\xee\x03\x87d\x00\x907\xc8KF\xad\xbe\xf8Xa\xff\xdc\x16$\x03\x80\xbcA^2\xfeUS\x8cq\xdc7\xc1 \x19\x00\xe4\r\xf2\x92\xd129Z<\xad\x81\xbfE\x1b\x92\x01@\xde /\x19\x00\x80<\x06\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\xc0G2\x00\x00\x80\a\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90 e\xc9\xf8\xfcD\x17\x00 oHQ2\xbe\xf4\xab\x1f\x00\x90S\xa4&\x19P\f\x00\xf2\x8c\xd4$ïv\x00@\x8e\x91\x92d|\xeeW;\x00 \xc7HI2\xb0\xf2\t@\xbe\x91\x92d\xf8U\x0e\x00\xc85 \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\t\xd0\xe9\x17\x00@\xde\x00\xc9\xf0c\xef\x94A\xcax\xbf \x00\xf2\x05H\x86\x1fC\x87>\xbcr\xb7_\x10\x00\xf9BVH\xc6\xf6\xb1\x03\a\x8cZ}\xf1Z\xbf\xb8L\xb0]Y\xe9\x17\x02@\x1e\x11\xb0d\xac\xde\x14\xbbϗM\x91+\x9e\\<^Q\x9e\xf0\v\x94F&\x1d\x8f\xd8MJV*\x19\x00\x19\"`\xc9\x189)v\x9f/c/g\xffNI\x83dȤ\xe3\x11\v\xc9\x00\x80'`\xc9\x18.1G-\x86\xdc\xc6\xfeݮ<\xe9\x17(\x8dL:\x1e\xb1\x90\f\x00x\x82\x94\x8c\xe5\x8a\xcep}\xf3\xb6\xaey\xea\xbfOLWο\xff\xba\xc1\x03\xafxU\x8bytd\xc1\xd0Y\x1d\xcer\x93.ڮ\x15\xef\xe0\x03^:_\xad\xe1\xd5+\x87\x14\x8c\xed|B\xadf\x9e^\x998\xc0Q\xdbڱ\x83#\x03\xc7\x0ev\xa4\xc3\xc5NW\xce[\xdc\xf5ZD\x19\xaa\x05\xbf6~`d\xd0\xd8\xdd|\xac\x8bՐ\f\x008\x82\x94\x8c\x8e\xb5\xab\x87\x8eZ\xbdz\xf5\xabls\xf0u{\xbb\xf6\xde5`m\xc7\xf6\xc5\xe7+\x83\xe7\xcd\x1b\\\xc0ta\xcayӗ\xdf?p\xb8s\x92\xef\x1e|\xde\xd8yk\xf5}V\xc0_\x9eX\xb0\xa7La\x9b\x91!\xea\xac\xeb\x18<\x92}\xf0?\xda\xc5f\xf5bg\xa9\x8ey##\xca\x00v\b\xe1\b\x18\xae\\\xce\n\xb2zX\xb5WN\xf1\x0e\xb0yp Ӟ\xfb\ah\x0f\xb8\x93\r;\x96IF\xd7]L2\xfe2\x98\x1d\xa1t>\xd1ኵ\x18\xaf\x1ex,\x8f\xdd\r@\xfe\x926\xc9حl\xef\xea\xbcP\xbb@\x19\xd1\xd6*\xeeW:\xba&\r\xe9d\f\x9e\x12S\xb0s\xe5X69\x1d\x01\xc3#\xe6\xf1\xc3ꂎ\xae?\x17\xac\xee\xf2\f\xb0\xd9}ѐ\xe9\x0f\xbfdܰ\xc9K\x86\x15kK\xc6r\xe5%\xbb\xa0H2v\xaf|p\xe8@\x1ce\x00`\x936\xc9\xe8\x1a;\xabk\xe5\x00m\xe6js\xb4k\xb5\xb2I\xfd\xa8\xd7q\xdeM\xb9I\x9f\xcc#\xaf\xe8r\x06\f\xb7V\x16:\a>ٵ\\;|\xf0\b\xe0\xe8xp\xd2Pe\xd0=\xda6/\x19V\xac-\x19\xf7+\u007f\xb1\xcby,\u007f\xb2\xb4\x01\x00&鐌\x875\tP\xa7\xb8~^\xd2\x15\x99\xc5\xfe}X=ʸr\xc8&\x8dw\x1d\x85.\x9a\xae\xfd\xb9mH\x973`\xb8\xad,\xd3\xc7w\x8dע\xbc\x02,6\xcdQ\xff\xe9X\\\xf0\xa0\x16`\xa7c\xc7j\x92q\x1b\x93\x8c\x951G\x19\x0f\xc7\x1c\xb6\xe0\x8a\t\x00<\x01KƨQ]]{\xf5\x1b,:\a.\x1f\xb8Z\xdb\x19\x19\xc4V\x11\x86\x8cbsT{\xea\xb6y\x8eB\x03\a\xeb\x8b\t\xe3]\x01\xdc\xe7\xfe\xda\xc8\xee\x886u\xbd\x02,\xee\xd2\xef\xd6\x1cu\x9d\xf6\xaf\x9d\x8e\x1d[\xa0\x8aJ\xe7H&\x19\x1d\x17\x8dbG.\xd3g\xb9by \x19\x00\xf0\x04,\x19wE\xeeY~y\x81\xfeQ=g\x88~^\xd2\x15Q\x86?\xf1\xf0\x90\x01\xaf\xb1}ʤ'\x96Oq-\u007f\x0eT.\xbak哗\x17\xbc\xca\at\xea\xd70^3b.\x1a{\x91\xbe\xe1\x15`r\x97Rp\xd7\xf2'\xa7(\x9aZ\x99\xe98bG\r\x9c7o\xa4r\xfe\xa3\xdbճ\x8e\v.~p\xf9t\xe5a>\xd6\x05$\x03\x00\x9e\x80%\xa3s\xfa\xc0\x82Q\xc6\xc9\xff\xab\xcau\xfaFd֔\x01\x17]\xa9Oƕ\x97\x0f\x1c0\xca\xf5\xad\x8d\x91\x0f\xdf6\xb4\xc0\xbcq\xc3\fx\xe9Lx\x0e\x93\x1f\x92\xe1\xd1y\x0eH\x06\x88!\xa3\x92\xf1\xfa\x88\xbb\x05\x9b\xf6\xd3\u07fdl\xc4e\xffWS\x92\xa7\xae\xbe\xe4\xea\xa7Կ\xff2l\xc4Sw\u007f\xe3\x92o\xfd\xb1\xab\xeb?\x87\xe9\\\xad\xee\xee\xf8\xee\x98\x11c\xbe\xad\x1d\x93\xbfw\x89\xbaO;\xc8\xe6b\xbb\xba\xb6|k\x8cZ\xd7\x18G\xfd\x9d\x97\xe95\xdc\xed(\xc60\xa6\n\xdfDW׳\xd7_\xf2\x8d\xef\xa9\x1fʿ\x1b1l\xd8\x0f^\xbf}̈our{\xbb\xba\xfet\xfb\x98K\xbf\x1b{\xf0n\xa6\xee,f\xf2/\xacU}\x99\xc0\x91\xafU\xef\xff\xa8ž\xdd5fذK;Հ\u007f\xbbs̥\xdf~ݫ^q\xbe\xe2\xcc<;o\x17\xe3$\x83\xabA4\x92 \x8fȨd\xdc9⏂M\x93_]r\xf5\x8f\u007f\xf9Ȱ\x9fh\xcf\xfe\xe0\xe7?\x18q{W\xd7\xff>;b\xd8e\x8f\xfc\xe4\x12\xf5\xb3\xf4\xcf[\xb6|\xe3\xfa-[\xb6\xbc\xae>\xff\xf3aw\xfe\xea\xd9o\x0f\xfb\r+\xf6\xbb-[F<\xc26\xb8خ\xdf\r\xbb\xfd\xd9_>u\xd90\xe7\x8fx\xfen˳\xc3\x1eٲ\xe5O\x8eb\fc\xaa\xf0Mt\xdd9\xec\xee\x9f\xff\xdbeWwvu>\xfb\xec\x98o\\2\xe6\xeeۇ\xfd\x91\xdb\xdb\xf5\xfa\xa5\xdfx\xea?\xbf5\xcc-\x19V\xea\x8eb\x16\u007f\xd2ZՖ\t\xf8|\xb9\xd6~\xf3\x88گ\u007f\x1f\xf6\xecﴀ1?~d\xcc%\xff\xe3Q\xaf8_\x8f\xcc<:o\x17\xeb\xb2%\x83\xabA<\x92 \u007fȤd\xfcq\xc4?\v6M:ǰ\x8f\xe3\xceg\xdf\xeb\xea\xfa\xe5\xb0_v\xb1\u007f\u007f\xae\xfe;\xe2Ru\xc6\xdd~\x99\x16b\x1d\x85\xff\xe5ٿ\xf0\x0fͷ\xbf\x1d\xfb\xd4e\xec-\xfeԥ].\x1c\xc7\xe61\x92\xd1\xc5\xd5\xf9\xf3a\xff\xae=\xa1}\x18_=\xec[\xba[#\xb7\xf7\xfao\xa89t^횘|\xeav1\x1e\xadU\xfd\x98\xdf\xce\xd7\xd1ڝ\xdf|ȍ\xf5\xd81j\xe1\xf7\xc6|ӻ^Q\xbe\xe2\xccĝw4l\x8d\x03W\x83\xd7H\x82|!\x93\x92\xf1/#^\x17l\x9a\xfc|\x98\xb5\xf8\u007f\xa7~u\xef\x9f؍\x1b#\xd8?\xc6Y\xb5}\xe2\xfe\xdeS\xdf\x1as\xa9q@\xceI\x86\x15\xfb\xc71c\xfe\xe5\xa9\xdfu\xc5|4&.\x19\xdf\x1d\xa39;\x8e\xd1n\x1e\xb9\xda<&\xb2\xf7\xbe7\x8c\x9d%t\xfd\xc051\xf9\xd4\xedb<\xbcdX\xf9:Z\xeb\xbc\xfa\xb2o\x1b\xb1\xdau视\xbd\xe7Y\xaf _\x8f\xccĝw4l\x8e\x03_\x83\xd7H\x82|!\x83\x92\xf1\xa7\x11w\n6-~b\x1f\xfb^\xafϘo\xab\x9f\xae\xfc\f\xb3\xe7\xc7o.\x1b\xf3\xbd\xff\xd8r}\x8cdر\xef=\xf5\xdd\u007f\x1avُ\xbb\\$.\x19W\x1b\xeb\x04\xda㫯\x8e\xd9\xfb;\xbd\x88{\x89\x90O\xdd.\xc6\xc3K\x86\xb5\xe9h\xad\xebY3\x1d=\xc3-\xaa\x98z\xd5+\xc8\xd7#3q\xe7\x9d\r\x1b\xe3\xe0\xa8\xc1c$A\xbe\x90Aɸ{\xd8\xeb\x82M\x8b_qG\x19\xfab\x9b\xf6\xd1\x17#\x19O\xa9\x9f\xb0\xff\xf4Mvb\xf2]o\xc9\xf8\x1d\xfbx~\xef\xd9\x11Ou9IL2X\x13\xb7\x8f\xf9\x9d\xc6{\xd6^\x86\xbd\xd7\xf8$v/\u007f\xf2\xa9\x8b/gh\xad\xfe\xc0%\x19\x8e\xd6\xfet\xd9\x0f\xc6\xe8wO\xe8k\xc4O\r\xeb\xf0\xacW\x90\xafGf\xe2\xce;\x1av\x1de\xdc\x19o$A\xbe\x909\xc9\xf09\xc8\xe8\xfa\xcbe׳Ì\xbb\xeff\xe7(\xec\xd4\xfaY}-\x83\x93\x8c\xeb\xafW˲\xe7ư\x89\xd2y\xb5\xb7d<\xa2\x9d\xfaw]\xef^1\xf1\x95\f\xab\x89_\xea\xa7\xf7?\xd0>^\xad9\xca\xed\xfd&\x9b֯\x8fpML>u\xb1d\\\xa2\xce\xc1\xceo\xba$\x83o\xad\xf3\x9b?\xe8\xbaS\xbf\xcc2\xe22U\x1a\xff<\xe6z\xefzE\xf9\x8a3\x13w\xde\xd1Mk\x1c\xb8\x1a\xbcF\x12\xe4\v\x99\x93\x8c\xef\xd9G\x16\xdc&ǯF\xfc\xd3S?\xbf[\xfb\x80\xbb}\xd8\xf7~\xfe\xbda\xb7k\x17\x18\xee\xfcM\xd7\xef\xee\x1c\xa1\xad\xf4?2\xe2'\xff\xf1\xadK\xfe\xc8\xde\xc7\xdf}\xea\xc7W\xab\x87˿\xe9\xeaܲE\x8dٲ\xa5\xc3\x11\xfbȰK\x1e\xf9\xf9\u007f\xdc9\xecW\x8e\x16\xf4\x8b\x06\xdau\x16\xbb\x98~\xd7\xe3O\xb6l\xd1\xd6\a\xac&\xd4$\xff\xbfg\xd5\x1a\x9e\xed\xea\xfc\x8dv]\xe2u\xad\nko\xd7\xff\\2\xe6\x91\x1f\\:lĿ\xff\x8f\xa3\r+uG1\x8e\xeb/\xfb\xf1\x8f\xbfɊ9\xfaf\xb7\xb6\xe5\x9f/\xfbc\xd7\xeb\x97\u07bdE\x15\x8d\x11î~\xf6\xa9o\\\xfa\xbaw\xbd\x82|=2\x13w\x9e+ƍ\x03W\x83x$A\xfe\x901\xc9\xf8\xd3%\xb7\v6\x1d\xbc\xfe\xdd1\x97|\xf3?\xb4\xcd\u007f3nB\xf8g\xf54{\xc4\xff\xb0\xdb\bا\\\xe7ݗ\x8e\xb8\x9e\xbd\xe9;\u007f\xf2\x8d\x11\x97}\xf7\xa9o\x8c\xb8^=\xef\xd6y\xca\x11\xfb\xec\xf5\x8f\x8c\x19q\xd9\xf5\xce\xf7y\xe7\xa5Z\xa4\xb6\xf2j\x17Ӿ[a\x9d\xce[M\xa8\x1f\xc0\xd7_v\xe9\xf5?\xb7B\x8d\x15Is\xaf\x9a\xee\xb7/\x1d\xf3\xbd\u007f\x1f1\xcc\xf5\xf9k\xa6\xee,f\xf3\xfa\xf5#.\xf9\xd6\x0f\xd4$\x9d}3\xeb\xfd\xe50v\xef\xc4\xdd꿿b˟w^:\xe6\xf6?ũW\x90\xaf83\x8f\xces\xc5\xf8q\xb0k\x10\x8e$\xc8#2&\x19?\x18\xf6\xbf\x82M\x10\x17\xfb\xd4\t\x80\f\x911\xc9\xc0\xb7ޓ\x00\x92\x012N\xc6$\x03$\x01$\x03d\x1cHFx\xd0\xd7G\x01\xc8(\x90\x8c\xf0\xf0\xcf\xe6r%\x00\x99\x03\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90 Pɘ\xa4\f\x9c\xb2]\xd4\n\x00 G\bT2v\xaf~t\xe8\xc0\x0eQ3\x00\x80\xdc P\xc9PY\xad\xbc$\xd8\v\x00\xc8\x11\x82\x96\x8cM\xcaZ\xc1^\x00@\x8e\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x10\xb4dlWV\v\xf6\x02\x00r\x84\xa0%\xa3s\xe0ȵ\xbb\xe1\x8b\x03@\xae\x12\xb4dt\xadT\x14\xe5\n\xd1\x13\x00\x80\x1c h\xc9\xe8\x188\xe4\xfeկ\t\x9e\x00\x00\xe4\x02AK\xc6&e\xa5`/\x00 G\b^2p\xc5\x04\x80\x1c\x06\x92\x01\x00\x90 h\xc9X\v\xc9\x00 \x97\tT2:wo\x9a\x14\xd9-j\x06\x00\x90\x1b\x04*\x19\xe3\x15e\xf0rQ+\x00\x80\x1c!P\xc9\xd8\xfb\x12\x0e1\x00\xc8m\x02\x95\f\x00@\xae\x03\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x90\x92d\x9c\xf0\xab\x1d\x00\x90c\xa4$\x19\x9f\xfb\xd5\x0e\x00\xc81R\x92\f\x9c\x99\x00\x90o\xa4&\x19_\xfaU\x0f\x00\xc8-R\x93\fh\x06\x00yF\x8a\x92A\xe9\xe7X\x03\x05 \x8fHY2\x00\x00\xf9\x04$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 Aʒ\xb1\xf6\xca\xc1\x91\x01\x17߶\xd7/.\xe3t\x9e\xf5\x8b\xf0\xa0S1\xb8`Ȕ\xddlG\x87\xf182\xf8\xcaMVм\xe1\x05\x91\x8bƯu\x95\r\xcd\xe8\x00\x90 )J\xc6\xd9\xf1\xc6\xf49\xff~\xbf\xd0\f\xf3`\xc1\xe7~!\x1e\xa8\x92Q0@\xe5B\xd6\xcf\xd5Ԗ\f\xc6<=\xe6ш\xf1x,\xdfJxF\a\x80DIQ2\xe6(\x05\x0f\xbe\xfby\xe7K\xea\xdcX\xe9\x17\x9bQ\xce*J\n\x92ѡm|\xbd}\xa8\u0084G\x95\x8c\xbd\x9f\xabt\xbd:VQ^e\xcf\xccR\x94\xf1/u}\xb9\xf7\xae\x882\xeak\xbbdhF\a\x80\x84IM2>\x8f(ơ\xf8\x14eH\xfc\xd0\f\x13\x84d\xa8b\x11Q\x9e\xd0$\xa3S\u007f|v\x882E\xfd\xb3ZQ\x16\xeb;^R\x94G\xad\x82\xe1\x19\x1d\x00\x12&5\xc9xM\x89\x18\x1f\xaa{\xadi\x94\x9d\x04#\x19t\xa4r\x1b/\x19\xf4\x1ee\xb0Z\xf7 e\xba\x190\x9d\x13\x87\xf0\x8c\x0e\x00\t\x93\x9ad\xec\xb5g\xd3\xea\xed_\xb2?\x9d\xb3\x86D\x06\x8e\u007f\x89m>\xaa<\xfcҐ\x82\x91s\x94\xf1z\xc4u\xca]\xc2\x00\xb3\x06\xfb!\x17\xb3X\xb9\xe7\xdd\xf1\x03.\x1c\xb9\xdc3\x82vL\x1f\x1c\x190\xeaQ}u\xd3Q\xf4\xfe\x13\xb3\x06G\x86\xdcv\x82\x9d\"0v\xbb\x82\r\xd6N\xba(R0\xf4\xb6.W\x19\x13^2\x86+s\x1c\x92\xf1\x84r\xa1Z^Q\xfeb\x06t\xdc\xff\xaaU0\xd0\xd1\x01 ;HM2\xe8\x10e\xe8Z\xee䝾T\xa0D\x86\x0f\xd1W\x05\x1fU\xe6\\\xa0(\x05\xef*\x11\xed\xf3\xfd\xec\x85\xca^a\x809}\xad\x87|\xccbeRAd\xec\xa8\xf3\x94\xeb\xbc\"\xf6^\xa8\f\x18>TQƺ\xdb_\xac̺H\xb9p\xa0\xa2\f=K\x97OR\x94\xf1Wv:\x83\r\xa6+\xcaE\xc3\a\xa9\xff\x9cp\x961\xe1$c\xb7\xa2,wH\xc6]\xcaPJoc\xff\x88\brt\x00\xc8\x0eR\x94\x8c\xed\x11E\x190\xfe\xd1\xdd\xc6\xc3\xce\v\x959\xea\xc7\xe9\xf6\x01l\xb9\xefQ\xe5\xbc!\xab7=\xa9\x1e\xcck\x87\b\xab\x95\xe1\x1e\x01\x06\xe6CG\xccbE\x19\xf2g\xf5\x18\u007f\x00\xabD\x181^\xb9M\x9d\x96\xbb\a\xb0u\x03wѡ\xdb\xd5c\x80\x88\xf2\xa4ub\xc2\a\x1blR\nا\xfa\xf6\x02\xe5AW\x19\xb3S\x86d\x9c\xed\\>H\x19r\x96\x97\x8c\x13\x83\x94Y\x94^\xa1-h\b\brt\x00\xc8\x0eR\x94\f\xda1V;\xe4\x1f4\x87\x1d֫\xc7\xffWh{W\xb2\xcf\xddG\x15E\xbb\x1f\xe1\t\xfd3\xfdJ\xe5a\x8f\x00\x03\xf3\xa1#f\xb1\xb1s%[#\x10F\fV\xb4)\xf9\xf0\x95kc\x8bjS}:[i0$\x83\x0f6\x98\xa3\x9d\x11\xb0\xbf\xd3]e\f\xac\xfb2T\x86\xb0gU\xc9\xd8}B\xa5c\xe5\xc5J\xe4]\xb6\xc01\x87\x8a\tpt\x00\xc8\x0eR\x95\fuF=q\xa5z \xaf\\\xc8\xeej\x1a\xacݷ\xa0N\xd0\xf3ԙ\xf7\xa8\xb1\x12x\"r\xde\tv\xf9\xe0\xbc.\x8f\x00\x03\xf3\xa1#f\xb12J\u007f\x10Q\xde\x15G\x8cUFn7\x8f\xfe]E/\xd6\x1e<\xacL\xb2$\x83\x0f69\xab\x1f\xfb\xdfÎ\x15\x1ce\f,\xc98\u007f\xd2r-\x94\xbb/\xe3\xbc\xe5Z\xa5^\x92\x11\xe0\xe8\x00\x90\x1d\xa4.\x19\x8c\xbd\xf3\x06(\x05\x9d\xf4sE\xb9x\xa4FD٤\xbe\xe7\x8d\x15\x83I\xec\x12\xe4r\xf6\xc8#@\xc7x\xe8\x8cY\xcc.Q0.V\xcf%\x84\x11\xaf\xb2\xa3\xff+\x97\x9f\x10\x14\xd5?\xb3\x9f`+\x8c\x86dp\xc16g\xb7?9o\xd2`E\x97\f\xae\x8c\x81*\x19\xef~\xfd\xf5\x97\x9b\x86*c\xf5r\xa6d\\x\xf1,\xed8`\x8ar%\x8dG \xa3\x03@v\x90\xa2d|m~dw^\xa4̣]\xf6ǯz6\xfe\xa89\x93ֲ#\x85\xb1\xec\xfc\xdc#@\xc7x\xe8\x8cYl\xde_9\xd2.\xe0\x8c\xa0{\xa7\x14\xa8\x1b\xe7O\xff2\xa6\xa8~\xa4\xc0K\x06\x17l\xf1\xf0 \x16?|\x94.\x19\\\x19\x03s-\xe3\xc4`e\xb8V\xac\xc3u\xc9\xf4\x1e~\xf9\xf3%\xeeZn\x90\xa3\x03@v\x90\x9ad\x8c4\x8e\xa4U橓\xecs\xeer$\xb5\xdf\xf3g\a(\x9d'\xce+\xf8\x92z\x058\x1e:c\xac\xa3\x8c\xa1\xda\a\xaf \x82\xb2Äy\x17+\xcau1E\x05\x92a\a\x9bܣ(ӗ\xbf\xf6\xa5yb\xe2-\x19t\xbb\xa2\xafp\xb8%c7\xf7\xb8C9Ϻ\xca\x1a\xe8\xe8\x00\x90\x1d\xa4&\x19\xe3\xedk\x05\xf3\xd8\xe6@\xf3\xc6\xe8\xed\x1d_s\xef\xf9Y\xca\xe2'\xf4H\x8f\x00\r\xf3\xa1#f\xb1qx\xfeeD\x9d\x96\u0088?o7J\x9f\xff\xb5\xbbh\xacd\xf0\xc1:_\x17\xb0\x1b:)[{\xf4\x93\fvw\a\xbb\xb8\xe2\x96\f:\x98]71C\x06Z\x97E\x03\x1d\x1d\x00\xb2\x83\xd4$c\xb5\xf5\xe5\x89\xceA\xecb\xe1te\xb86\x15\xd7*\x91\x13\xdc{\xfeUe\xecXm\xb2y\x05h\x98\x0f\x1d1\x8b\x95\x886=\x17\xb3\x8b\x90\xa2\b\xf5h^\xbb\x1c\xf1\xaer\xdeYwQ\xa7d\x9c\xd0\x0e\xfd\xed`\x9d.\xe3\xc2\xc4\xe7\x17\xb1\xca\xe3K\xc6\xe7\ue2ec\x06O*\xfa\x95R\xed\xae\xae\a\xad݁\x8e\x0e\x00\xd9Aj\x92\xa1\x9e\x83+\xe3Wwt\xed~p\x90r\xb1:\x99ލ(\xd3\xd5\x0f\xf3W\a\xb2k\b\xdc{~H$2H\x9b\f^\x01\f\xf3\xa1#f\xb1\xa2\fW\xe7\xe7\xda\x02\xf5\xbcD\x1c1V\x19\xab\xca\xc0\xe7\x93\xd8ራ(?\xfd#\xca\xca/\xbfv\x04\xeb|=@\xbb\xdeѩ\xf6\xe4\n?ɠ+\x15\xe5\x1e\x81d\xa8\xc7\x13ʔ\xed\x9f\u007f\xbd\xf76\xc5\xf1\xb5\xb4`Fg\xf9\xc3\xdb)\x00\xd9B\x8a\x92\xf1\xb9\xf9\xf5nmb\xab\x1f\xac\x11傑C\x14\xe5\xf2\xb3\x8eIq\x8fb.Ix\x040\xac\x87|\xccbe\xc8\x05\xe7\xb3\x1b\"\xef\xf1\x8a\xf8\xcb@%r\xf1\xf0\x02ePGLQ~\xfa\x8fTs\xdc\xe4\f\xd6yXQ\x06_1\xf2\xbc\x01w\xb1\xeb\xab>\x92\xa1\x8a@\xa4C \x19g\xa7\x98\xc3p\x05\xffM\x96`Fgx\x9ck\xb8\x00\xf47)J\x06\xa5/\xcd\x1a: r\xd1\x15ˍ\x0f\u05ceYC\"\x05#\x1ff\x87\xfdܤ\xe8P\x14\xf3\x16Hq\x00u<\xe4b\xd49\xbc\xfb\x8a\x82\x81Wl\xf7\x8c\xa0\x9ds\x86D.\x18z\xd7\tAQm\x97>\xfd\xdf\x1du\xc1\x80\x95\xae`\x9dM\x97\x0f\x8c\xa8{>g\xab%~\x92\xd1\x11Q\x8fOb%\x83\xd2\xedӇ^\x10\xb9h\x92\xfb'v\x82\x18\x1dH\x06\xc8&R\x96\x8c4c\xcea\x00@V\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x90\xed\x92\x01\x00\xc8* \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t \x19\x00\x00\t\x82\x97\x8c\x1a\xf2S\xbf\x10\xc6*\xf2}\xbf\x10\x1f\x8e\xf7\xfaE\x00\x00\x82&\xb4\x92\xd1\xf7\\\xc9i\xbf\x18\x00@ЄV2z\b\x81d\x00\xd0\xef@2\x00\x00\x12@2\x00\x00\x12\xa4$\x19\xbb_\xb3\xd8m\xed\xd4%c\x1dY\xf5\xd7\xc6\xf2\xe2\x99\xdbhߺ\x19ъ\xa6\xd3ھ\x15\x87\xea'\x96\xde\xfa\xeb>jI\xc6\xf1\xa6\xaahY\xdd.\xeaQ\xc4\x15\xd0|\xaa\xa9\"Z\xb5\xe4\x14\xa5\x8b\b\xe3 \xa5G\x1a*\xa3\x13k\xd6`)\x14\x80~!%ɸM\xb1\x98n\xed4%\xa3q2)\x8f\x12\xb2\xad\x81\x14\x97\x13R\xa3\xed\xab/\x8d\xd6\xd6\x14\x92\x86>S2v\x8d#\xc53\xab\bY\xe6Q\xc4\x15\xd0TAJ\xcb\b\xa9\ue85b\xe7\x13R?\xff8\xfd\xb0\x94\x94\xddTM\xc8\x1d}\x82\xfc\x00\x00A\x93\x92dtEL\xc58\xaf\xc3\xdaiJ\x06\xa9\xfe\x90\xf6\xce'\xc5\xc5/\xf4\xd1W\bٯ\xed\x9b\xf61\xa5\xfb\xcb\xc8FC2\x8e\x97\x92Eݔ\xee)#\xdb\xc4Eb\x02ޤ\xb45J6X'&\xf5d\x89z\x80q`\x02i\xf5J\x12\x00\x10 )I\x86}\x98q\x9d\xbdϒ\x8cC\xea\x9f\x0f\tif;oa\xb3|\x9dv&A\xe9ˤʐ\x8cE\xa4\x8e\xea{\xaa\xc5E\xdc\x01\x1f\xb1\a\x8d\xa4ђ\x8ck\xf5*\xd7ܻ\x93\x02\x00\xd2Oj\x92a\x1efp\a\x19\x96dLc\x0f\xba\t\xf9\x80\xfd\x9dOZ\xd8>\xed\\\x83\xf6\x16\xabڠIF%yE\xdb\xd3SH\x8e\n\x8b\xb8\x02n\xd4\x1e\xb4\x90zK2\xee 5o\x9e\xa3\x00\x80~\"5ɠsb\x0e2,ɨe\x0f\xce\x11r\x92\xfd\xbdO\x97\x8cEz\xc8\f\xb2S\x93\fU\x1dfܪ\x11%m\xa2\"\xee\x00\xfd\x90c\x03'\x19oF\t\x990\u007f\xf3\xdf)\x00\xa0?HQ2\xf4\xc3\f\xfe Ò\x8cz\xf6@\x9d\xff\x9f\xb1\xbf\x86d\xfdf\x9d7g\xed\xe2A#\xbf\xa6gW\xae\x1c2t\xc0\x90ۮS:\xbf\xdc>\xe0\x9e\x13\xf4\xc4=\x03\xb6\u007f)\x0e0\xeb4$C;\xcf\xf9ZQ\xba\xd8\xdf)\xbadܦG\\\xac\x9eF0\xc9\xf8\\Q.\x1e\xa9\x11Q6\x89\x8a\xb8\x03\xae\xb0\x1b0$\xe3Ո\xa2\f\xb8r\xf9\t\xabG\xf4\xa3\xadE\xa4\xa2\xf9g\x13\xefe\x0f~X\xb8h纊[\xfbh\xf7\x9b\xed\xd5w\xb4\xb7\xb7\x1f1\xa2\x9a\xa2\xda̦Q2ck\xeb5j,\x17\xc0m\xb2ʦ\xaej\x9e:\xeeC\xcas\x88\xec\xec\xe9\xe9ic\x92\xb1\x834\xed\xd9V_\xb8\xcf\xd9\xf0щ7\xbe\xd0ZG\xa2z\xb8%\x19V:=۶N\xad\x9eP\xf5X\xc3\xe8\xbfR\x90ׄM2(\xdd\x14Q\"\x9b\xb4\xad\xcf\xef\x1f\x15Q\x06\xb2C\x88\xb5l\xb1\x81\xbe\xa6/k\x8cT\xaeP\xe7&\x9b\x9e\xb3\u0602\xe5u\xb3\xbc\x03t\fɘĶ]\x921O\x8f\x18\xa9\x16d\x92ѥج\x14\x15\x11\x068$\x83\xee\x9dR\xa0>y\xfe\xf4/\xad\xf6i\xb4L\x95\x83\x86\n\xca\xe6\xf3\x8b\x94\xcdحl7\u007f\xb2q<\xbaЈ\xad\xf8\x87:\x93+\xa8+\xc0ތN;C\xe9\xe9\xaa\x1a\xcas\xc88\x0eQ%\xa3g[\xb7z\xf4p\xd3|-\xd6jxn\xb5z(\xd17;\xaa\x87\x9b\x92\xe1L\x87Ԟ\xa1}\xf1\xd6OA>\x106\xc9\xf8\xfc\xb6\xc8`ep\xe4.\xe3S\xfa\xecK\xe3\xd9:┡_3\x06Og\xfbFF\xcc\xe3\x87\xed\x05_ҳ\x05\xec\"\xacG\x80N\x1c\xc90\x8e2\x86\xaa\x87\f\xc6QF\x87]NPD\x18\xe0\x94\fuk\xfb\xbc\x8b\x15\xed*\x8cA\xf4!j\xac#\xc9Pg\xdd@\xfd\xf0b\xd0`\xed@\x9f\t\xc0&\xfd\xb3}ރ\xe6\x0e\x83W#]\x91WنW\x80F\x1c\xc9P\x86\xab\x9a\xb1\xb6@=/\xd1%\xe3݈2]m\xf5Ձ\xca\x1cq\x11Q\x80\xf1Uو\xb2\xf2˯\xe9Xe\xac\x1a\xfd\xf9$\xfe^.[\x06ڈvs\xe7O\x9fc\xff\xd6\xd6RzJ\xdb\xf1Y\xf1C\xb1\xb1|\x00\xb7\x19\xbd\xa6\x9b\xd2\xee\x1bj\xb5\x88\xe3\xcf\xe9R\xc3IF\x15\x9b\xf9}7;%\x83\xd6T\xa9'2\x1f\x17\xeb\xf5Z\x92\xe1H\xc7\xe7:.\xc8\x13B(\x19&\x83\x94\x8b\xeeٴ\xfa\x8a\x02\xb6x0O\x99\xb2z-\xbb\xab\xeb\xebW\xb7\x0f\x1d\xbb}\xbb\xb9X1\xf8\x8a\xc1\xfa\x86W\x00#\x8ed\f\xb9\xe0|v+'\xbb\xefB\xbf\xfbsuD\xb9`\xa4\xba\xe7\xf2\xb3\xe2\"\xa2\x00C2\xd8\xc9\xd1&\xfa\x97\x81J\xe4\xe2\xe1\x05\xca k\xcd\xe3\xb3\xf6h\xe3;}\xef7F\xdb?\xa3t\xd9\xe8\xef\xbf\xd2\xdaH^fO4G״֖~\xaan=>\xfa\xa8 \x96\v\xe06\xa3\xe4\x96m\x9b\xab\xcb>\xd6\xe2\xe7\x93z\xf6\x87\xbf\xfb\xb3\x99ܷ~խ\xa4\xbc\xe5\x1d\xbe\xb2\x0f\xc7U5?3\xb9\xb0\xe8\xc5C\xf4Sv\xf7\xe7\xba\xf6vv\xc8b\xa5s\xee-\xed\xa2\xccq\n\xf2\x9d\x10Kƨ\xe5\xf3..\x184I\x9fz\x9b\xc6\x0e\x1cx\xb9z,\xb0\xfb\xd3U2\x8e\x93\x89\xfa\x92d=9bH\xc6\xf1\xa6\xaahY\xdd.uk\x11a\x1cd\x92\xf1YSE\xb4\xeaq}\xc6\u007f\xd8X\xa9\x06\xb4\xe9u쩛\\Z\xbb\xcf!\x19G\x1a*\xa3\x13k\xd6\xe8\xf5\xc6\xd6\x06\x00\xe8\x1fR\x92\x8c\xdb\x14\x8b\xe9\xe6>U2\xe8̈́Mg\xda]|\xd39]2v\x8d#\xc53\xab\bYF\xe9\xe6\xf9\x84\xd4\xcf?\xaeJ\xc6\xcc\nR^F\xc8\f\xb6\xf0\xf1b\x94\x94\xdeTN\xc8BV\xae\x85\x90\x8a\x99Ѣ\x1aN2>,%e7U\x13rG\x9f\xb86\x00@\xff\x90\x92dtEL\xc58\xaf\xc3\xdc\xc7$\xe39\xd2\xc46\xb7\x91U\xbad\x1c/%\x8b\xbaՃ\x872\xb2\x8d;1!SߡtG\x94l\xa6\xf4@!y\xba\x87\xf6m-&k\xd4\ad\xf4\xfa>z\xaa\x96p\x92QO\x96\xa8\a\x18\a&\xb0U\x12Qm\x00\x80\xfe!%ɰ\x0f3\xae\xb3v1\xc98J*\xd8\xd1\xc0|rT\x97\x8cE\xa4N{\xeeeR\xcdK\xc6a\xb6\xaf\x91\tC=y@\vXO&\xf7\xd2{\xc9\"\xb6}\xfa*N2\xae\xd5O>\xd6ܻS\\\x1b\x00\xa0\u007fHM2\xcc\xc3\f\xfb C\x93\f:\x93\xa8\a\x10\xdd%3\xa9.\x19\x95\xe4\x15\xed\xb9\x9eBrԖ\x8c\x19ھ5\xa4\x9e\xf6\x96\xb0x\x95\xdeR\xf2f\xdf\x04\xb2_{\xb0\x88\x93\x8c;H͛\xe7\x8cmQm\x00\x80\xfe!5ɠs\xdc\a\x19\xbad4\x93\xc7)m%ͺdt\x132\xe3V\x8d(i\xb3%\xa3V\x8bߨ\xfe\xfd\x98\x10\xe3N\x8e\x1a\xb2\xf1\x14!\xdd\xc63\xb6d\xbc\x19%d\xc2\xfc\xcd\u007fW7\x85\xb5\x01\x00\xfa\x87\x14%C?\xcc\xe0\x0e2t\xc98L\xa6R\xba\x80\x1c\xd1%\xe3Sb\xb3\xcd}\x91\x95I\xc6ARd\x94\xae%k\x8e\x10\xa2o\xb7\xf2WL>\\P\xa2\x96.j\xec\x16\xd7\x06\x00\xe8\x1fR\x94\f\xfd0\x83;\xc8\xd0%\x83V\x93\x83=\xeay\x89.\x19\xa7\x89*\x1e\x16\x02\xc9\xf8\x84?\xca\xf8\xbby\x94\xf1\xb2\xf3\xbe\x8c\xde\xf6\xa7g\x12\xd2 \xae\r\x00\xd0?\xa4*\x19\xec0\x83?\xc80$\xe3i\xb2b\x87z^b\xace\\Ům0\xf6||N$\x19\xbd\xc5\xf6ZF{_\x19yK{\xb0̖\x8c\xbe\x8f\xdf\xd0\xfe\xae!E焵\x01\x00\xfa\x87T%\x83\x1dfL\xe1\x1f\xeb\x92q\x80\xccld\a\x03\xbad4\x92\x9b\xd8\x15\x14\xba\x93\x14\x9f\xa2\xbd\x84\xfc\x83:%\x83\xd6\x1b\xf7\x8bn$\x13zh\x83\xfe\xa0\xa7ʖ\x8c\x93d\xf4g\xec\xef!R\xd8+\xac\r\x00\xd0?\xa4,\x19\x9d\x11\x85?\xc80$\x83V\x91q슈.\x19\x87\x8a\xc9Cg(}\xbbL\xbb_#J\xb6u\x9fsJ\xc6\xfe\"\xb2\xa2\x97\xd2\xd6\x12\xd2B\xe9\x91(Y\xd5G\xcf\xcc'\x8e+&w\xa8\x9aqz>\v\x16\xd5\x06\x00\xe8\x1fR\x96\f:\xc7q\x90aJ\xc6ㄝ\x97\x18\x92A[\xa3\xa4x\xf64B\xe6\xb2%\x8bل\x906\xa7d\xd0\xcdEd\xe2\xcd\x15\x844\xb1\xe3\x87mQR~s\t\xa9\xe7$\xe3X\x19\x89\xde8\xb3\x84\x94\x1f\x15\xd7\x06\x00\xe8\x1fR\x97\x8cN\xc7A\x86)\x19\xef\xe8ZaH\x06=\xf2\xa3\xaah\xc9\xec\x16\xed+\"\x87j\x8a'\xbe\xec\x92\fz\xb0\xa1\"zM}\x9b^\xc7\xfb\xf3\xcbKnm\xdb\xc6/\u007f\x1eo\x9a\x16-\xae^\xfaw*\xae\r\x00\xd0?\xa4.\x19\x00\x80<\x02\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92\x01\x00\x90\x00\x92A[kN\xf9\x85H\xf2\xd5\xdcV\xbf\x90\x14\b>\xdf~ \xbdC\x02\xfa\x91\\\x93\x8c\x85\xa4p\x9b\xc7Sǣd\x86`w\vi\xees\xee9X_>\xf1\x8e=7\xbd)\bN\x8c\xbe\x96\xc2\xe7\x84O\xac)\xfe\x99p\xbf\fz\xbe\x8d\x84\x90qG\xcd}\xbb*v\xc4+\x928\a\v\xd5z\x1b\xad\x87\x81\xd5\xeb=$ l\xe4\x8ad\xec9\xa0\xff=\xd9\x1em\xf6\b\xe9{\xa71\x1a\xbbw]\xe1\xaf]{\x0eD\xeb[_\xbe\x97\x10/\xe9I\x84\x9dE\xebD\xbbgGo\x12\xed\xf6\xc1웆\x91\xef\xdf\xda\xdbד\xb7͝;J_\x89)口^\x9dso\xdf|S\xfb\xa7\xd6Ca\xbd\x82b\x89\xe01$ l\xe4\x8ad\xd4<`nyJ\x06\xa5\xcdј]Ǣ\xcb\xcc\xcd/j\xbf\xd0\xfe\xd6ժ\x9f\xe2}\x8d)I\x06]\x11\xfd[\xec\xce\xee\u0086\xc2\xee\xd8\xdd~\xd8}s\xe4\xbbϖ\f\xea:NJ\f\xbe^\x8b\xdaZ\xfe\x91\xa8^a\xb1\x04\x10\x0e\t\b\x1d\xb9\"\x19\xb7\xdegn\xc9IFcE\x8f\xb9\xf9!\xf9P\xfb;\xed\xa7\xec߃$\xa5\x93\xef\xee\n\xfb\xf0ޢ\x9d\x1c {bw\xfba\xf7͑//\x19I\xc1\xd7k\xe1\x94\f\x11\xc2b\t \x1c\x12\x10:\xc2%\x19箉>}m\xe5\x9eEe\xb5\xecú\xef\xd75\xa57>\xaeN\xa1\x1dD\xe7\x16\x16\x13]\xfa؍\xe3\xea\xb4\x0f\xb4\xbe\r\xb7\x8c\xbby\xbd\xf6Iy\xb2\xa1\xb2lA\xec\x89I\uf125\xfaƺ\xea\x1dGȑ\x9d\xd5\x1b(}\xa0\x82IG\xdfNG\x13\a\x8b\by\xe6hô\x92\xbas\xdbԖ\x9ai3\xd1N]D\x01Z\x85+J\xac\xb9m\xd1|-\xad4\x04\xed\x93\x05\xe5ъ\xfa\x93\xceM\xab\xb2\x85\xa4h]S\xe5\xe4\xfa\xa3\xae\xbe\xd9\xf9R[2N\x97\x10R\xb8U\xdf\xf7F]U\xb4\xbc~\xaa\xe3\xe0`!\x89n\xb4\x87D8f\x1c\xb6d\b\xebu\x14\xe3\xf2\x155\x91Ȑ\x80\xd0\x11.ɠ{&\x92\xc7j\xc9U\xcf]\xb3F}\xf0\xc3\xc2E;\xd7U\xdc\xdaG\xbb\xdfl\xaf\xbe\xa3\xbd\xbd\xfd\b\v\x89\x92\x19[[\xaf\xb9\x97m>\x14}f\xe73Q\xf6\xd9vt\xe2\x8d/\xb4֑\xa8\xbb\xbe\xf7I\xbb\xbeq\xb2\x81\xccT\xff[\xa0\x9e\xc7\x1f\xaf*\xack~\xabW\xdbm5ѳm\xeb\xd4\xea\tU\x8f5\x8c\xfek\xf7\x1b\x13W\x9c\xa2\xa7V\x94\xbd\xd1-\x0e\xd0J\xbeI\xder7Fk\x17\xd0\xfb\xf4\x19\xb9\xa7\xf4\x96\x96]\xcdd\x8dsӪ죭Ed\xea\xaa\xe6\xa9\xe3>t\xf6\xcdΗrG\x19\a\xdaۋu%\xda?\xba\xe1\x95]\x1b\xcb\xc99\xbeUVYE\xf3\xcf&jC\"\x1e3\x0e\xee(CT\xaf\xa3\x98#\xdf\xd8&\x12\x19\x12\x10:B&\x19\xb4\xa2\x81\xee$;\xe8CM\xecs\xf2E\xca&\x8e\xf6Aȝ\x98T\xfcC}\xdbV\xa8[m\xa4\xcd\xfcwn\xb5\xfa\x01\xd77;\xea\xaen'\xf9\xd8\xdcl\x8b\x92h\x9b\xb6\xf5ժ\x9a()cK\x19\xce&H\xed\x19\xdawF\xdd\xfa!;\x9bo\xf8\x91w\x80\xca\xdfH\xcc\xcaa_\xe9\x1a\xba\xa6\x94\x1d\x01\xf4Tթ\x92Ի\xed+\xc7&_Yt\x9aZ\xcf\xe9\xaa\x1a\xad^\xfbL\x80\xcb\xd7qbR\xa2O\xed\xf5\x15L,֗\xb9\x96 \xa2e\xea\xc7\u007f\x03\x1b\x12\x8f1\xe3p\x9e\x98\x88굊9\xf2\xf5h\xc2gH@\xf8\b\x9ddl\xa5\xef\x90n\xba\xf4\xfb\xea\t\xc4\r\xbd\xe7T\xae\xd5ΐ9\xc9P\xd5D_\xb5\xf8\xe1Lm\xc7\xccFz\x9ald[\xcfD\xddյ\x92\xe3\xfa\xc6W\x8fE+Ie\xf1\xd2\u007f\xe8\x0f{wՑ\x9d\xee&\xa2\u007f5J\xedQ\x8f\xb0{Ʊ\xcf{\x8f\x00\xca\xe6G\xcc\xf2\xe9A\xf2fϛ\xe4 e2\xf6\x81\xb9\x93\xdb\xe4+\xd3W9\xd7\x13UI\xf8\xa9m\xe5K\x85\x92\xf1i\xe5\xb4E\x1b?\xe8\xeb\xa5N\xa2\x0fQcH<ƌC(\x19\x8ez\xadb\x8e|=\x9a\xf0\x19\x12\x10>B'\x19mt_\x94\xd2e\xaad\xcc6N\xab\xe7\xb3\xfd\xae\xe5O\xed\xcd;\xb7^\xdbQ_C\x0f\xe8\xc7\xf3\xb1˟\xef\x98Ӯ\xa5|\xc3!\xf2Ѻ\xf2\xe7ԩ\xa8\xad0\xf4\xb1\xd2\xce&j\xccR\xe7\xca[ik9\xfb\xc8\xf5\b\xa0lB\xc7\xdcױN\v]\xa7m\xf5\xd8;\xadM\xbe2}\x11\xb7\x9d\xb0\v\x9a\xdc\xd4~\x87\x93\t\x81d\xd0\xd3\x1b\xee\x9bA\xaeiq\x1feXC\xe21f\x1cB\xc9p\xd4k\x15\x8b\xc9WЄϐ\x80\xf0\x11b\xc9h\xb8ဆviT{\x1fof\x1fi\xf6\x9b\xb7\xf1\x06\xf6\x16\xef\x9b\xf6\x10\xfd\aYς\x1e\x8a\xba\xab뱮\xaf\xf4\xd2\x0f\xc9!ګ\x96\xa8X\xa4\xed\xf8i\xb5\xbb\x89\x05V\xb1E\xf3\xe9\xbdZ\x94W\x00\xcb \xe6r\xea\x82[\xf6\xed\xdbw\v\v\xdaE\xac{\x1b\xb8M\xbe\xb2\xe8\x12\xb6g#a\xc7\xf4v߸|\x85\x92q`\x99\x9a\xff\xe9\xad%\xeb\xa9\x03{H<ƌC\x97\x8c\xee\x15_i\x8fD\xf5Z\xc5\x1c\xf9z4\xe13$ |\x84X2\xda\xf4\xe3ܟjw\x15\xb2w\xfa)m\x87\xfd\xe6ݩ\x9dOoeg\x185U\xea\x14\xf8\xb88\x1aS߂j\xeb\x13\xf9\xd32\xfd\x1e\xa6\xf2J6]\xfaػ\xdd\xd1\x04\xf7\xa1\xfcV\xf1g\xc5\xdaR\x9eW\x00\xed\x9bQO\xddT>\xae\xfe\xf3X%e\xd7\x1bk\xd9A\xfe\xa2%\x8eM\xbe\xb2\xe85\xea\xf4\xea\xbeA\x9b\xbfv\xdf\x1c\xf9\n$\xa3Y[\xbd\xa1\xb5Mԁ=$\x1ecF\xe9\xf1\xe7\x8e鱺d\xbcO\xde\xd0\x1e\x89굊9\xf2\x157\xe17$ |\x84L2\x0eM^ӳ5z\xb0\xa7\xa1\xf6o\xaan\x8c\xfe\xfe+\xad\x8d\xe4e\xf6DstMkm\xe9\xa7\xf4\xb3\xf6h\xe3;}\xef7F\xdb?S?\xf0\n\x97\xedXVؠ>\xfdḪ\xe6g&\x17\x16\xbdx\xc8U\xe1\x91\u0098[\xb8\xcbIEs[km\t[h\xb4\x9a8\xf7\x96v\xa5\xc0XI諬\xabԧ\xaeG\x00]c\x1f<\x18\xf4\xb4\x91\x9fv\xd3\xee\xa7I\x9b*\x11{\x8agnh[D6S\xc7&ס(\xb9e\xdb\xe6\xea2m\xb1\xd3\xec\x1b\xc3\xcc\xf7Sv\xf7\xe7\xba\xf6v\xf5þ\xf7\xed\xf6\xf6\xe2\xc6\xf67ΰ\xa9]\xbab\x87Z\x83\xe3\xe6\x0fǐ\x88ƌ1\x9fh\xf3\xf9\xdc[7\xdfԮ\xb2A=\x93\xf3\xaa\xd7.fU&n\xc2wH@\x18\t\x97d\xf4]C\xc8\xd6\t\xa4t\x9b~\xaa\xdcV{U\xd9\xdc6\xed\x99\xdeE\x93K\xee\xd8\xc7\xee\x10 $z\xb8T\xfdw\xa1\x1a\xben\xf6\xb8\xd9\xfa}\x19G\xeb'O[\xfab\x11\xdb\xebdE\xb1\xfb\x04\xbbf\xf3Og\x94V\xcc\xd7/M\x98Mh_\xbe \xc4\xfc\x9c\\\x17]cl\x89\x03\xde(\xb1\xef\x9f0\xd85\x9a\xdd\xc8\xd1J\xc8\xe8]꣏\xef\xbbvB\x8d~\xb3\x18\xb7iw(\xfax\xe3\xc4ʆϴ\xbdf\xdf4\x8c|\x1f2V\f\x1e\xa0t\xbf\xde2\xd9@\xe9\xaf\xefh\xae\x8aV\xd4:o\x17s\f\x89h\xcc\x18/Tl`\u007f\x8c^\x10Rrij^\xae\x98Y\x99\xb8\t\xdf!\x01a$\\\x92\x91\x06\xfa\x96D\xb7\xf9\xc5H\xb3-\xda\xe8\xb85B\x1e\xefoʤ#\xdf~ \xf5!\x01\xd9A\xdeK\x06\xed[s\xed\xdf\xfdb$\xf9\xaa\u2e64\xbe\xf4\xc1\xe1}\xdb{\x1a\xf2\xed\a\x02\x18\x12\x90\x1d@2\xb2\x938ߔ\x01 \x93@2\xb2\x91\x93\xdar\xa2_\x14\x00\x19\x00\x92\x91\x8dhˉ\xf6}\x9e\x00d\x0f\x90\f\x00\x80\x04\x90\f\x00\x80\x04\x90\f\x00\x80\x04\x90\f\x00\x80\x04\x90\f\x00\x80\x04\x90\f\x00\x80\x04\x90\f\x00\x80\x04\x90\f\x00\x80\x04\x90\f\x00\x80\x04\x90\x8c4x\x9cf\x8f\x01i\xf0}\x031d\xcf\xcb\xdd/\xe4\x9add\xaf'\xeb\vĴ?\xd9,(bb$\xe9\xb4\\5\xe0jh-2~ע\xa8\x95\xdbl\x1b\xcd\xfeN\xae?b\x96\x88훈\x98bn\xe2\f\xaa\x1fɺ\xbaƼX\xbe9d\xae\x17y\xe67\x9b+\x92\x91\xfd\x9e\xacg^$ϝ\xa2\xa7ZȋgD%\f\x8c$\x9d\x96\xab\x06\\\r-\xc4\xf8U\xae\xd1-\xdcfϛ\xd1\xc6\xf6=\xeb\xaaK>\xd2\v\xc4\xf6M\x88\xbb\x98E\x02\x83j\xe1\xe1Ԛ\x9c[\xac\xe0\xc5\xf2\xcd!\x93\xbd\xc8+\xbf\xd9\\\x91\x8c\x10x\xb2\x1e\xd2~@s\x0fq\xff\x96\xa0\v3I\x81\u007f\xa2]ú\xa8\x11P\xb2\x8e\xdb4:\xdf]Y\xa7\x85s}\xf3\xc1Q\xcc&\xa1A5\xf0rjM\xe0(GL̋\xe5\x9bC\x06{\x91O~\xb3\xb9\"\x19!\xf0d\rR2z?1\x02>\xe9\xe56\xcd\xce7\x97hoq\xaeo>8\x8a\xd9$4\xa8\x06\xc9:\xb5z\x92\xa4dd\xa6\x17\xf9\xe47\x1b.\xc9\b\xb5'+'\x19g\ueaccV\xd53\x13$\x87\x9b\xa9#IK2\xac&\\\xa2\xc3i\x8a\xb5\xa9O\x8a\x96\"\xf6\xa3\xe5f߸\xcc8\xafWʛ\xc1\xda\xc5\xec̼\x06\x95C\xe4\xd4ʏ\x83\xed\xea\xea\xe8\xe6\x17\rW]\xfb\xf8\xe3W\x95z\x1e\xc6q\xe3`w\x9eF\x17\xfdHO}!)|\xd9Z\xec\xe0*\xcbd/\xf2\xc8o6\\\x92\x11jO\xd6CdgOOO\x1b\x9b\xf0;HӞm\xf5\x85\xfb\x9c\x86\xa9\xce$-\x19\xb0\x9a\xe0k\xa0q$\xa3\xef\x96\xd9l\xdb\xec\x1b\x97\x19\xe7\xf5\xea0\x83\xb5\x8bٙy\r\xaa\x8dЩ\xd51\x0e\x96\xab+\xdf\xcdޙ\x15뛋K6י\xbf\xb8\xec\x86\x1f\a\xbb\xf3ڏ\xaeo\x9d\xad\xa6\xae-J\x18\x8b\x1d|e\x99\xecE\x1e\xf9͆L2\xc2\xec\xc9z\xc8\xf8\x10;\xc4ޑ\xaa\xda\xf4ݤ\x19\x8a\xd9n\xa6\xce$M\x19\xe0\x9a\xe0j\xa0\x1e\x92\xb1\xa2\xa7\xe7ང\xfd\x869\xdf7;3\xdb\xeb\x953\x83\xe5\x8a\xf1\x99\t\a\x95C\xec\xd4\xea\x1a\a\xd3o\xcd\xee\xe66\xe61\xb9>\xce\xf9\x197\x0e\x0e\xdb\xd7\x19\xea\xee\x9ej\xe6\xbff\xbb\xa6\xf0\x95e\xb2\x17y\xe47\x1b:\xc9\b\xaf'\xeb!\xf2\xb3}\xfb\xf6\xad\xd1\xdee_\xac\xaf\xbba\"\xd1\x0e\x06,7SW\x92\xa6\fpM\xf05xH\x06S\x94r}\x15\x86\xf3o\xb53\xb3\xbd^93X\xbe\x18\x97\x99pP9\xc4N\xad\xaeq\xb0&\x9beں\xacL\xfd\xe7c\xef\xa5\"~\x1c\x1c\xb6\xafO\xb3\xdd\x1b\x98M\xad-\x19|e\x99\xecE\x1e\xf9͆N2\xc2\xeb\xc9ʭD쫨Z\xda\xda^\xabK\x86\x99\xaf+IS\x06\xb8&\x12X\xcbhڷ\xef\x13c\xf9\x8f\xf3o\xb53\xd3\xcf\xf7\x99\xd7+g\x06\xcb\x15\xe33\x13\x0e*\x8fЩ\xd55\x0e\xd6d\xb3jX3\xfa\vv\xec\xf7!\xf5\x80\x1f\a\x0f\x9bZqe\x99\xecE\x1e\xf9͆X2\xc2\xe6\xc9\xcaM\xf8\x195l\xba.pJ\x86+IS\x06\xb8&\x12\x90\f\xb3;\xd4\xe1\xdfjgf{\xbdrf\xb0\\1>3\xe1\xa0r\x88\x9dZ]\xe3\x10;\xd9\xfeZX\xf7׃\xd5s=\xaf[\xf2\xe3\x10kS\xbb\x99\xd9\xd4j\x95=\xe3\xae,\x93\xbd\xc8#\xbf\xd9\x10KF\xd8@\xca\x1b\xbd\u007f\xf8\x13d;\x90\x8c4\xf8\x96f¤3\xf8^\x04Mߌ\x19\x1bw\x1dW\x95\xa3\xfd\x85\x19W\xe9?\"\x98\x89\x81\x02)\x92k\x92\x91ݞ\xac\xa4\xbc\xee}A\xbcM\xb2\x16\xa6\t\xba\xafz\x93d\xc3\xffh\xba\xa6\xa4>\xc1\x86\x0f\xea?\u007f\xc5\xd8\xc3~\x9e\x9bz\f\x14\xc8nrE2\x120\xde\xcc\x02O\xd6\xf6\x17jF\xef\x11ś\b\xcd?=\x8cBy\x12t_\xf5&Ɇk+6g1\x97\xb7\xa7a\x98!6\n\xf5jM\xe4\xbe\xca[\xae\xda\xf9\xba\x92\xe4\x88u\x1dM\xa0a\xebĄ3A\xe5\x1a\xe6\x8a\xcdW\xbbΝİ\x9f\x037~\x8c=v\xa0\xbcZ\xb36\xb9\x17ֻC M\x84N2B\xed\xc9\xfaΎ\x9a\x92\xe3\xceb.oOc抍B\xbdZ\x13\xb9\xaf\xf2\x96\xabv\xbe\xae$9b]G\x13h\xd8^˰MP\xb9\x86\xb9b\u007fm\xdb0c\xb2\xb5P\xda]1m\xdd.#\xe7\u0601\xf2j\xcdڴ_X\xea\xdd!\x90&B'\x19!\xf7d=]\xb8\xc1Y\xcc\xe5\xedi\xce\\\xa1Q\xa8Wk\"\xf7U~\x99\xd5\xceו$G\xac\x1fX\x02\r[\x92\xc1\x99\xa0r\r;\x8a\xd1v۰d\x9f\xeeMol\xbb\aʫ5k\xd3~a\xa9w\x87@\x9a\b\xb1d\x84ӓu\xe2\ng1\x97\xb7\xa71s\xc5F\xa1^\xad\x89\xdcWy\xcbU;_W\x92\x1c\x9e\x92\x11\xafaK28\x13T\xaeaG1\x8f+&\x82\x81\xf2j\xcdڴ_X\xea\xdd!\x90&B,\x19\xe1\xf4d\xadXrp\x15_\xcc\xe9\xedi\xce\\\xb1Q\xa8gk\x02\xf7U\xder\xd5\xce\xd7Y\x8cG$\x19\xbe\r[\x92\xc1\x99\xa0r\r;\x8ayH\x86`\xa0\xbcZ\xb36\xb9\x17ֻC M\x84L2B\xec\xc9j\xdc0][\xdfx\x13\x9f:\xe7\xedi\x9b\u007f\x8a\x8dB\xbd[\x13\xb9\xafZ\x96\xab\xd4\xce\xd7U\xccD\xec:\xea۰~\xc5D39\xe0MP\xb9\x86\xf9WH\x15G\xeb\f\xe4\x1d\xfbz\xab\xc8\xcdTԚ#u\xeb\x85\xf5\xe8\x10H#ᒌ0{\xb2\xb2\xdb#ZԸ\xea\xf2\x1d\\1\xde\xdb\xd36\xff\x14\x1b\x85z\xb6&t_\xb5,W\x19F\xbe\xeeb\x06b\xd7Q\xbf\x86{˴\xcd\"v\x15\xd6a\x82\xca5̽B\xf4\xefE\xf7\x1d\xfc\x8c]V\xfe\xec\xfd\x05Q\xd3IY\xecf*h͑\xba\xf5\xc2zt\b\xa4\x91pIF\x1aȰ'k@\xa6\xa2i\xe9Eд\xceԔ~>!S\xcd\vD\x89\x0f\x14\xc8\x16\xf2^22\xec\xc9\x1a\x94\xa9h\x1az\x91\x06N\x1dT\x8f.>;\xf0\xa9\xf9Xb\xa0@\xb6\x00\xc9\xc8,y\xec\xed\t\xc2\t$#\xb3䱷'\b'\x90\x8c\f\x93\xbfޞ \x9c@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00H\x04\xd8\xc9\x1a@2\x00\xf0\x05v\xb26\x90\x8c4\xb8\x99f\xbb\xd5h\xf0=\xceq`'ˑk\x92\x91\u007f\x9e\xac\xed\xa3\xc9\xdc>\xfa\n!\xa3\xed\xdfӌO\xaa\xfe\xad\xbe$ы\x14H\xb25\xd8\xc9&I\xaeHF\xfez\xb2\xf6\xec\"%\xed\xb4\xfb\x15\xb2+\xc6BHL\xca\xfe\xad6\x1e\x99\t{\x916\x92\x183\x06\xecd\x93$W$#\x8f=Y\xbbIC\xa3z\fE\x12\xf4F\r\xc0\xbf\xd5\xc2+\xb3\x04?\xbc\x03\"\x891\x83\x9dl\xf2\xe4\x8ad\xe4\xb1'k7\xd9\xf7\xbad\xee\x00\x00 \x00IDATUړ\xb8d\x04\xe9ߚ\xbd?\xd5\xeb\x9b\x19\xecd\x93%\\\x92\x01OVAk\xdd\xe4\xf8\xad\xaf\xe8\x92aY\xa3z\f\x14\xb5{̹\xaf&R\xccF\x94\x19\x9f\x8e\xd0\xe0\x95\xef\xa6\x10\xd8Ɇ\x86pI\x06z\xb2\x8a\xf15b\xf5cGi\x1c\x13\x803/\x92\xe7\xda_\xa8\x19\xbd\xc7;\x84\x9aC\xfdii\v\xfb\xfd\xbf\xafZ&|\xeaz\xdenb\x8f\xe8'\xb7\xec\x1e\xff\xad\xbd}\xbd\xf9\xab\xc7R\xc0\xca5m\xe4\x8ad\xe4\xa7'\xab\x80D\x8cX}\x88{\x8cr\x88\xf9\x8f\xf4ͭ\x8e\x17C\x8d\xa1\xbeI\xff)\xbeͳc\x9e\xb6\x9a\xb0_7\x1bg\x8f\xf7%%\x19\xb0rM\x1b\xb9\"\x19\xf9\xe9\xc9* \x11#\xd6T\xd0$\xc3û\x80C\x1b\xea{\x9fѶ\u007fz\xafw\x1c\xff\x13\xcb&\xce\x1e')\x19\xb0rM\x17\xe1\x92\fx\xb2\x1a\x1dZH\xa2\x1b\x8dnr\x9b|\x87\x84F\xac\x9e\xc5,N\x97\x10R\xb8U\xdf\xe6\x86\xcfF\x97\x8c\x86J-\xc0J\xf2\xcc}\x95Ѫ\xfa\x83Z\x84=\xd4\xcb\xf4C\x88\a\x969F\xc7n\xc2\xf1\xba\x89{\xccI\x06\x97\xce\x1buU\xd1\xf2\xfa\xa9}T<\x92Z8\xac\\\xd3D\xb8$\x03\x9e\xacF\x87>\xdaZD*\x9a\u007f6\xf1^\xc7&\xf53b\xf5,fs\xa0\xbd\xbd\xb8\xd9\xd5\x1a\xcf!\xb2\xb3\xe7\xc8R\xb2\x8am\xdb6\xaa;HӞm\xf5\x85\xfb\xa8c\xa87\xd7\xd0w\xaaަ\xb7nt\x8e\x8eՄ\xe3u\x13\xf7\x98\x93\f;\x9d\xfd\xa3\x1b^ٵ\xb1\x9c\x9c\xa3R/\x00\b\x84\x90I\x06\xc9\x17\x00\x04A\xe8$\x03\x9e\xac\xacCj7\x1f\xa2\xe6\xe2\f\xb7\xe9c\xc4\xeaÝ1\x9f\xf9b6\x87\xc8\xcf\xde\xd9QS\xc2Z\xe1{\xf1\xc5\xfa\xba\x1b&\x92\xd9\xd41\xd4\u007f%=w4\xcc\xed\xd6Sr\x8cN\xacd\x88{Lm\xc9\xe0\xd2\xf9\xb4rڢ\x8d\x1f\xf4\xf5R\xf9\x17\x00\xa4L\xe8$\x03\x9e\xac\xacC|7\xf9M\x1f#V\xcfb\x0e\x8c\xf9\xcc\x17\xb3\xd1\xd62N\x17n\xa0\x8e$\xf7UT-mm\xafU%\x83\x1f\xea\xbe臥\aJ?\x8cj\xeb\x0f\x8eщ\x95\fq\x8f\xa9-\x19|:\xa77\xdc7\x83\\\xd3\xd2'\xf7\x02\x80@\b\xb1d\xe4\xb3'\xab\xe7\u070fo\xc4*%\x19|1\x1b}\xf9s\xe2\n\xeaHrF\r\x13\xa8\x05\xaad8\x86\xba\xba\xa5\x92V\xae\xd1/\xc8:F\xc7)\x19\xecu\x13\xf7\x98ڒ\xc1\xa5s`\x99\xbayzk\xc9z\xb9\x17\x00\x04B\x88%#\xaf=Y=\xe7~|#V\x19\xc9\xe0\x8bQz\xfc\xb9c\xda_]2*\x96\x1c\\\xc5'Y\xc5&k\xdfͪd8\x86\xba\xae\xe6^z\xef\xdc:\xad\xa0\xe3r\xaa%\x19\xd6\xeb&\xee1\xb5%\x83K\xa7Y__\xa9m\x92{\x01@ \x84L2\xe0ɪw\x88릣\xc7>F\xac\xde\xc5Lz\xdfno/nl\u007f\xe3\f_\x8c1\xdf0J<\xa8M\xd7\xda\xfaƛ\xf8$\x9b\xc9}\xebW\xddJ\xca[\xdeq\f\xf5\x92\xd1-\xb4e\xb4z\xdc\xc4w\x93o\xc2z\xdd\x95\xe3E\xba}\x825\x92\\\x00\xb7\xb9\x90\x14\xadk\xaa\x9c\\\u007f\x94:\x10\x9b\xb6\xda6\xaa\x8eb\"\xb7X\xb1\xe5j\x92\x06\xaf\xee\x97%\x06G\x00\x97o\xf7\xd2\x19\xa5w\xbc}m\x9b#\xd8~\x97dp$\xad\xcc\x16\x92\u0097\xad\x15:\xd1P\xbb\xd3\tƦ6\\\x92\x91\x87\x9e\xac\x9a\tjOO\x9b\x9fd\xf4ݢ\x1d\xb1\x9b\x1d:\xf5\xfd\x1a\xb5\x9a\xee7\xe76\xf0?\xea\xe70b\x15\x0f\x9fJ\x93q\x00k\x8d$\x17\xc0m\xb2ʦ\xaej\x9e:\xce\xf9\xb1+6m\xb5mT\x1d\xc5Dn\xb1b\xcb\xd5$\r^\xdd/K\f\x8e\x00\xbb\xb5\xd37\x94\xafi[h\xfc\xa6\xb1\x85\xfd.\xc9\xdcHڙik$\xe6\n\x9dh\xa8\xdd\xe9\x04cS\x1b2\xc9\xc8?OV\xc3\x04\x95ē\x8c\x15==\a\xef%\xbbضա_\xebW\x87f\xba\xd6Bm#V\x8f\xe1cW\x96\x8c\xdf\x1c\xb7G\xd2\xe3p::M\xcd\xfat\x95\xdbN\x8d\xe16m\xe5lT\xb9bb\xb7X\xb1\xe5jr\x06\xaf\xeeX\x11V\x00W\xac\xb1\x8cy\xdb-qI\x06\xff.\xc9\xd4H\xf2\x99\xd9V4\x1eC\xed<\xf7\tƦ6t\x92\x91o\x9e\xac\xcc\x04u\u07fe}k\xe2I\x06{g\x95\xebK$V\x87\x0e\x16\xf6\xf6\xfc\xfa\xf4\xb9\xe8A\xea\xc06b\xf5\x18>\xf509jTa\x8f\xa4\xd7\x1b][i]O\xbe\xa2\x1cb\xd3V\xceF\x95+&v\x8b\x15[\xae&g\xf0\xea\x8e\x15a\x05\xd8\xc5\xfa\xc6iu~\xe4\x92\f\xfe]\x92\xa1\x91tdfK\x86\xc7P\xbb%C\xf4\x9e\x94%t\x92іo\x9e\xac\t\xace4\xed\xdb\xf7\x89q\xd9\xc0\xeaPo\xd1\xc15dő\xc2^\xea\xc0\x1e\x1d\x8f\xe1\xa3'\xa3?\x8a\x89\xf5z\xa3k\xef\xdev\xa7ɐش\x95\xb3Q\xe5\x8ay\xb8\xc5\n-W\x934xuŊ\xb0\x02\xecb\u007f\xd3\x17\xa9\xbb]\x92\xc1\xbdK25\x92\x8e\xcc\xc49pC플`ljC,\x19y\xe2ɚ\x80d\x98}\xa0|\x87fl\xad\x9d;\xa3\xd5}\xf3\x9a=:\x1e\xc3G\x97\x14\x1e\x8b\x89u\x04pC\xbd\x84=\xdeH\x1c\a\xfdb\xd3V\xceF\x95+&v\x8b\xf5\xb0\\M\xce\xe0\xd5\x15+\xc2\n\xb0\x8b\xf5\xe9u\x1ev\x9f\x98\xd8\xef\x92L\x8d\xa4#3\xad\xdeg\xa2\xd4s\xa8\xf9\xd6D\xef\xc9d\b\xb1d\xe4\x89'\xab\x9cd\xd8\x1d\xfa\xfe\xa2h\x1bY\xf8\x00ub\x8f\x8e\xc7\xf0}Vl\xd96\xf3ot;\x80\x1f\xeakԷ`\xf7\r\xb5ZD|\xd3V\xceF\x95+&v\x8b\xf5\xb0\\M\xce\xe0\xd5\x19{\xbcYp\xf7\x94\x15\xc0\x15[P\xaeN\xbe\xbe\x86\x98\xb5\f\xeb]\x92\xb1\x91\xe43\x1b\xb7Tݬa\xf5z\f5\xdfZP6\xb5!\x93\x8c\xfc\xf3d\xe5\xee\xfeTw\xbf\xbf\x9e\xac3*67\xd9ݟ\xd6\xcd\xe2\\\x87\x9e\x1b7\xb1\xaf\xbad\x15\xe5q\x8c\x8eh\xf8(}|\xf4QA,\x17\xc0mF\xc9-\xdb6W\x97\xe9\v\xae~\xa6\xad\xb6\x8d*WL\xe4\x16+\xb6\\M\xd2\xe0\xd5\xf5\xb2ԓ\xd2\xd3ԁ#\xc0n\xed\xb3\x8a\xaa\xf5\xad\xf3\x8bc%\xc3 s#\xc9g6\xb7\xa2eU\r\xd1\xde\xd5\xe2\xa1\xe6[\vʦ6\\\x92\x91\x87\x9e\xac\xf6wL6\xaa\xf2\xc0:V\xa2M\x0fk\xb3M\xfd;\x93k\xc6\xecЁ\xb2\x15\xb4\xa5t\x1f\xe5q\x1a\xb1\n\x86\x8f\xfe\xbd\xa4A\x18\xcby\xa7ڛ\xd1\xc7\x1b'V6\x186\xd0\xf1M[y\x1bU\xae\x98\xc8-Vl\xb9\x9a\xa4\xc1\xabk|7\x97\x12爸\x02\xec־h\xac*\xa9=\xe0)\x19\x99\x1bI>\xb3\xa3\xb5%\x13\xea\x9ev\xe5\xe0\x18>\xae\xb5\xa0lj\xc3%\x19i -\x16\xa6\x99\xb4\x04M\xadCO\x13\xee\x88\xc5\x0f\xc7\x19Q\xe2$Y,\x10Z\x89\xeb(#.\xee\xe5O\x19\xd2;\x92\xf2\x99\x05\xf6\x9e\xcc{\xc9H\x87\x85if-AS\xeaЏ\x9a\xfc\"8\xa4\xdf\xe8:I\x16\v\x80\xbe\x17\xcbd\xfa\x97\xc4ĴI\xefHJg\x16\xdc{\x12\x92\x01\x92F\xfa\x8d\xae\x93d\xb1\x008Y\xbe\xc4u\xd19>\xd2\x133Y\xa4\x87\xa4\xdf2\x8b\x05\x92\x01\x92䤶\xaa\xe7\x17\x15C\x92\xc52\xc1\xd16\xf2\xd8[\xfd\x90\xaa\xfc\x90\xf4Wf\" \x19 I\xb4U\xbd\xe3T\x96$\x8be\x82\xb9j\xaaE\xae\uf2a5\x03\xf9!\xe9\xaf\xccD@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x00\x00\x12@2\x82\xb00u\x11\x9c\xffez\b\xbe\xc7\xfdK\xb6\x8fon\x93k\x92\x91\x93\x9e\xac\xc19sj\xf8\x99\xb6z\fT,Iu\xc8ɡ\xbaҊ\x86=\x151\x12\x167\x87\xe0\xfcE\x81<\xb9\"\x199\xed\xc9\x1a\xa43g\x02\xa6\xad⁊%\xb9\x0e9h+\xadٸu6\x89\xfdi\t\x9f\x1c\x82\xf2\x17\x05\xf2\xe4\x8ad\xe4\xb8'k\x80Μ\x89\x98\xb6\n\x06J@\x92\x1d\xe2\xf8j\xe2\xfc^J\xbb\xabE\xbfF\x13?\x87\x80\xfcE\x81<\xb9\"\x19\xee\xdfw\x17\"x\x17\x86œ58g\xceDL[\x13\x93\x8c$;ı\xacD\xfb\xed\xba5\xf2\x92\x11\x90\xbf(\x90'\\\x92\x91\xbf\x9e\xac\x819sZ=\xa6\xf4\x93\x05\xe5ъz\xe6\xae\"\x1e(\xae2.\xd6&\xb9\x0e\xf1\x03U\xad\x1b}|\xb1\xa6W:\a\x81\xbf\xa8\xa8\t\xa7\xe5\xaaل\xafS+\xf0&\\\x92\x91\xaf\x9e\xac\x01:sZ=\xa6{Joi\xd9\xd5L\xd8H\x8a\aʮ\x8c\x8f\xb5I\xaeC\\@o!\xb7\"!\x99\x83\xc0_TԄ\xe3e\xb1\x9a\xf0uj\x05ބL2\xf2֓50gN\xab\xc7=Uu\xeal\xef\xdd\xf6\x95\xd7@q\x95q\xb1<\xc9u\xc8\x0e8Ν\xd3\xc8\xe6\x10;\xbe^\xaf\x85\xb5\xc9;\xc0\xfa;\xb5\x02\x0fB'\x19\xf9\xe8\xc9\x1a\xa43\xa7\xd5\xe36\xf2\x81\xb9O$%\x19\xe9\xe8q\xff\xd2o\xe3\v\x04@2\xc2Lr\x92\x01@\n@2BL&\x9d9A\xbe\x02\xc9\b1\x99t\xe6\x04\xf9\n$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$#\r\x0e\xa5Y\xe9\x19\x1a|7\x93$+G\a$L\xaeIF6{\xb2R\xfa\x8f\xa6kJ\xea\x13\xf8RH\x06\x8cX\xe3\x11l:pT\r7\xb9\"\x19!\xf0dU\xa9\xad\xd8\xf0P\xc9i\xd13N2`\xc4\x1a\x8f\xa0Ӂ\xa3j\x98\xc9\x15\xc9\b\x81'\xabzHN\xd6\xd1>\xf7\xaf\xdc\nɄ\x11\xab\x00sH\x82N\a\x8e\xaa!&W$#\x04\x9e\xac\x94\x1e%;bw\nɄ\x11\xab\x00sH\x82N\a\x8e\xaa!&\\\x92\x11fO\xd6ޫ\xf4$\x1fs\xc5r\xae\xa3i7b\xf5jت\x97\x87\x1b\x92\x80\xd3\x11:\xaa\x82\x90\x10.\xc9\b\xb5'\xeb\a\xed[Is;\xfb\xe5sG,\xe7:\x9av#V\x8f\x86\xedzy\xb8!\t8\x1d\xa1\xa3*\b\t!\x93\x8cP{\xb2\xf2'&V,WC?\x18\xb1\x8a\x1b\xe6\xeb屆$\xe0tģ\x03\xc2A\xe8$#̞\xac\xbcd\x98\xb1\\\r\xfd`\xc4*l\xd8Q\xaf\r7$\x01\xa7\xe3\xe5X\v\xc2@\xe8$#\xbc\x9e\xacN\xc90c\xb9\x1a\xfa\xc1\x88Uذ\xa3^\x1bnH\x02NG<: \x1c\x84X2\xc2\xe6\xc9\xea\x94\f3\x96\xab\xa1\x1f\x8cX\x85\r;\xea將$\xe0tģ\x03\xc2A\x88%#l\x9e\xacN\xc90c\xb9\x1a\xfa\xc1\x88U\xdc0_\xaf\x03sH\x82NG8: \x1c\x84L2\xc2\xecɪ_1y\xa7\xcfe\t\xca\xf5\"\xedF\xac\x1e\r\xf3\xf5\n\t:\x1d\x91\xa3*\b\tᒌ0{\xb2\xf6\x96i\x01EGܱ\\/\xd2m\xc4\xea\xd50W\xaf\x88\xa0\xd3\x11;\xaa\x82p\x10.\xc9H\x03iq(M\xabghR\x16i\tt3\xa9z\x93)\x96\xd6\xd1\x01\xe9&\xef%#\x1d\x0e\xa5\xe9\xf5\f\x95\x9f\xa3\f\xffn&W\xaf|\xb1\xf4\x8e\x0eH7\x90\x8c\xd0!=G\x13$\xc9z\x93,\x06\xc2\n$#l\xa4ˈ5\xc9z\x93,\x06B\v$#l\xa4ˈ5\xc9z\x93,\x06B\v$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$\x03\x00 \x01$#\rf\xa5\xd9\xee:\x1a|\x8f\x03%ۇ/\xcf\xc95ɀ'\xab?\xa9سr\xa4-I\x98\xb6f5\xb9\"\x19\xf0dM\x98\x94\xecY9Ҙ$L[\xb3\x98\\\x91\fx\xb2&J\x92\xf6\xac\x1cA:\xb5z\x00\xd3\xd6\xec%W$\x03\x9e\xac\x89\x92\xa4=+G\x90N\xad\x1e\xc0\xb45{\t\x97d\xe4\xbb'\xab\xe5q\xba\x90\x14\xadk\xaa\x9c\\\xaf}\xeb\xdc\xea\xe6B\x12\xddhuފu\xd4\xe0k\xcf*n\xc2\xc6ߩ5\x80$aښńK2\xf2ܓ\xd5\xf68\xfdhk\x11\x99\xba\xaay\xea8\xa6nV7\xd9ފ\xe6\x9fMd\x9d\xb7c\x1dM\xf8ٳz4a\xe3\xeb\xd4\x1aD\x920m\xcdbB&\x19\xf9\xed\xc9\xca{\x9cF\xa7\xa9\x85OW\xd58\xbaI\xa3e\xea\x87w\x03\xeb<\x17\xebH\xd2ǞU܄\x03\x1f\xa7\xd6 \x92\x84ik\x16\x13:\xc9\xc8cOV\x87ǩ\xbe\x88\xb9\x9e|\xc5uS\xdd\xfb\x105:\xcf\xc5:\x92\x8co\xcf\xea\xd1\x04\x87\x9fSk I´5\x8b\t\x9dd\xe4\xb1'\xab\xc3\xe3T_\xe5m'\a\xb8n\xf2\x9d\xe7b\x1dIƷg\xf5h\x82\xc3ϩ5\x90$aښńX2\xf2Γ\xd5\xe1q\x1a]\xc2Jo$g\xb8n\xf2\x9d\xe7b\x1dIƷg\xf5h\x82\xc7ǩ5\x90$aښńX2\xf2ϓ\x95\xf78\x8d^\xa3Ω\xee\x1bj\x1d\xdd\xe4:\xcf\xc5:\x92\xf4\xb1g\x157\xe1$\xbeSk I´5{\t\x99d\xe4\xb7'+\xefq\x1a%\xb7l\xdb\\]ƒ\xb4\xba\xc9w\x9e\x8f\xe5\a\xcaǞգ\t!iL\x12\xa6\xad\xd9K\xb8$#\xcf=Yy\x8f\xd3\xe8\xe3\x8d\x13+\x1b>c\x9bV7\xf9\xce;\xfcP\xb9&|\xecY=\x9a\x10\x91\xc6$aښńK2\xd2@\x02f\xa5\xf2\xf4\x83\xebh\x9c\x9b\\}H\xb8\xc7\xc97a\x92d\r\xfd0| i\xf2^2\x120+\x95\xa6?\\G\x93\x9c\x8d\x8cD{\x9cB\x13\x06\xc9\xd5\xd0\x1f\xc3\a\x92\x06\x92\x11R\x92\x9b\x8dR\xa4\xdeD\xea5\x80\xac\x03\x92\x11JNjk\x88~Q)\x91z\x13\xa9\xd7\x00\xb2\x10HF(\xd1\xd6\x10\x8f\xd3t\x92z\x13\xa9\xd7\x00\xb2\x10H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02H\x06\x00@\x02HF\x1a\x1cJ\xb3\xc7TT\xeb[\xf6\xa4\x03r\x80\\\x93\x8c\xec\xf6d\x8dK\x1a\xe6\xaa\xc97\fr\x9a\x10KF\xd8,\xfc\xc0'RD\xc6fn\xc6\x1a\x06Y\n$\xa3\xbf\xe8k,iڶg[SIS\x12\x1f\xf9G\xdb\xc8co%Q.e2\xd60\xc8V \x19\xfdFߎ\xba\xcaheݎd&\xe0\\BH\xd1Q\xbf\xa84\x90\xb1\x86A\xb6\x02\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\x00\x00H\x00\xc9\xc8iOV\x0eس\x82@\xc85ɀ'\xab\a\xb0g\x05\xc1\x90+\x92\x01O\xd6\xf8\xf4\xa7=+\xc8irE2\xe0\xc9\x1a\x97~\xb5g\x059M\xaeH\x06z\xb2\xf2Χ\xd1\xc7\x1b'V6|\xc66\xad\xbe\xf1=v\xb8\xa4rM\xa4j\xcf\x1aL\x0e '\b\x97d\xa4\x81\x90x\xb2\xeaĹ\xb3Շ \xecYu\x92\xcf\x01\xe4\x04y/\x19!\xf1d\xd5Ia\xba\x06`Ϫ\x93B\x0e \x17\x80d\xf4\x17\xa9y\xb2\xead\xc3t͆\x1c@\x06\x81d\xf4\x17)y\xb2j\x9c\xd4\x16\x19\xfd\xa2\xd2K6\xe4\x002\n$\xa3\xdfHœUC[d\xe4n\xe3\xcc\x04ِ\x03\xc8(\x90\f\x00\x80\x04\x90\f\x00\x80\x04\x90\f\x00\x80\x04\x90\f\x00\x80\x04\x90\f\x00\x80\x04\x90\f\x00\x80\x04\x90\f\x00\x80\x04\x90\f\x00\x80\x04\x90\f\x00\x80\x04\x90\x8c\xbc\xf2d\r1\xf1\x065\xec}\v\x15\xb9&\x19!\xf6d\xd5ГL\x835jl7\x9dx\x8cN,)\x8f\x0e\xa5\x87\xeaJ+\x1a\xf6T\xc4L\xf3\xb89\xc4\x19T\xbf\xbe\t\xd9U\xb1\xc3/$U\xfa\xa1\x89\xd4\xf0\x9d-\xadE\xc6Ϸ\x16\xd9z\x9d+\x92\x11bOV\az\x92\x81X\xa3\xee\xe1\u007f}+\xb6\x9b.ģ\x13K\x00\xa3\xd3VZ\xb3q\xeblB\x8e\xb8\x9f\xf0\xc9\xc1kP}\xfb&dGi\xac7C\xc0\xa4\xdcĞx?\xa0\x96\x02\tϖ\x16\xd2\u07be\x9e\xacko\x1f\xddb=\x93+\x92\x11bOV\x17Z\x92AX\xa3\xdaC\xe2\xe8\xa6'\x82\xd1\x11\x90\xfa\xe8|5q~/\xa5\xddձ\x92ᗃxP\x13\xe9\x9b\b\x89\x03\x13\xf3\xad!\x8bD\x13B\xf8\x97P\x06\xbf|\x13\x9e-\xeb\xa2\xec\x17\xe9ߦ\xb4\xc4V\xeb\\\x91\x8c\x10{\xb2\xba\xb0%#EkT\xfe\u05cb\xb9nz\x92\x98d\xa4>:\xcbJ\xb4_\x01\\#/\x19\xe2AM\xa4o)b\xbe5\xfa\x1b\xfe%\x94\xc1/߄gK\xef'\x86d|\xd2k\xed\x0f\x97d\x84ٓ\xd5\x11`\x9b\x95\x9e\xb9\xaf2ZU\u007fP\v\xb1\x93\xf4\xb0F\xed^:\xa3\U0010edefmc'\xa1/[\xa7\xfe\"\xefTǐ\U0001eb1f,(\x8fVԳ\xdf9\x17\x8f\x0eo\xa3j\xc7ڤ>:\xd5?\xd2*\xfabM\xaft\x0e\x02\xa3[\xaeo\"3X\x8f\xccN\x97\x10Rh\x9a\xb8qC\"\xf2\x90\xe5\xde\x1a\xe9j\u0082\u007f\x83s/!\xdb|Z\xaf\xd7i\x8a\x1b7߀f\xcb>\xdd\x04\xc7\xca!\\\x92\x11fOVG\x80mV\xba\x834\xed\xd9V_\xb8\x8f:\x92\x14[\xa3\x9e\xbe\xa1|M\xdbBB6\xe8'\xa1橿\xc8;\xd51$\x9c'\xeb\x9e\xd2[Zv5\x136|\xe2\xd1\xe1lT\xb9X\x9b\x94G\xa7\xb7\x90[\x91\x90\xcc!\xd6N\x96\xeb\x9b\xd0\f\xd6+\xb3\x03\xed\xed\xc5\xc6\a,ׄ\xd0C\x96{k\xa4\xab\t\x1b\xee\rν\x84=oV5\xb1z'\xbe\xd1\xed0\xc5\xf5\xc97\x98\xd9bH\x86\x95C\xc8$#̞\xac\\\x00W\xacg\x9b\xfa\xee껉\xfd`:\x97\xa4\xd8\x1a\xb5\xb1\x8c}N-Q%\x837\x0e\xf1\xf0N\xe5\x8fj\xadn\xf6Tթ\xb3\xbdw\xdbW^\xa3\xc3gf\xc7\xf2\xa4::ǹs\x1a\xd9\x1cD\x83j\xf5\xcd\xcb\fV\x94\x19\xa3D\x9f\xcf\\\x13^\x1e\xb2\xd6[#}MXpop\xfe%lf\xc7\x04\r\xday\x99m\x8a\xeb\x9bo \xb3e\x9fi\xb5g\xe4\x10:\xc9\b\xaf'+\x17\xc0\x17\xfbb}\xdd\r\x13\xc9l\xeaHRh\x8d\xda7N{\a~\xe4\x92\f\x0f\xefT^2\xacn\xb6\x11\xeb\x87Gţ\xc3U\xc6źHitz\x8b\xec\xc3\x16\xd9\x1cD\x83j\xf5\xcd\xcb\fV\x94\x19Ø\xcf\\\x13b\x0fY\ueb51\xae&8\xb878\xff\x12\xfem\xf4a\xda;q\x17۴Mq}\xf3\rd\xb6X\x92a\xe4\x10:\xc9\b\xaf'+\x17\xc0\x15\xdbWQ\xb5\xb4\xb5\xbdv6u$)\xb4F\xfd\x9b\xfe\xf9\xdc\xed\x92\f\x0f\xefT^2\xacnr\v\xaa\xe2\xd1\xe1*\x13/\xbe\xa6>:\xc6ZFo\x9b|\x0e\xa2A\xb5\xfdf=\xcc`E\x991\x8c\xf9\xcc5!\xf6\x90\xe5\xde\x1a\xe9j\x82\x83{\x83;^º\xc7i[\x99\ue8edU\xcaLq}\xf3\rd\xb6X\x92a\xe4\x10b\xc9\b\x9b'+\x17\xc0\x15\x9bQ\xc3\xdeN\vT\xc9\xe0\x93\x14Z\xa3\xf6\xe9\xef\xc0ödh\x1f\x04\x1eީܐ\xd8\xdd\xdce[\xa5\x89G\x87\xabl\x97\xd0V-\xf5\xd1YV\xa2\x99@l#\xa7\xa4s\x10\r\xaa\xd57/3XQf\fc>sMxx\xc8\xdao\x8d\xb45a\x13+\x19\xfaK\xb8\xa3\xbc\xf7\xa1\x1fj\x11\xb6)\xaeo\xbe\x81\xcc\x16[2\xf4\x1cB,\x19a\xf3d\xe5\x02\xb8bU\xec\xdd\xd6w\xb3*\x19|\x92bk\xd4\x05\xe5\xea\v\xdeנIƸ\x85CSm\x00\x00\x11\xbeIDAT\xa5\xeafM\xd4Y\x19\xef\x9d\xca\r\x89\xdd\xcd\xee\x8aZ\xf6I\xb5h\x89\xd7\xe8p\x95q\xb1\x1c\xa9\x8f\xceW\x13\xefe\xd7Jj\xa7I\xe7 \xb6\x935\xfb\xe6e\x06+ʌa\xccg\xae\tO\x0fY\xf3\xad\x11t\x13ǛcT\xd9!\x19\xdcK\xd8[\xbec\xb2v^\u0099\xe2\xfa\xe6\x1b\xc8l\xb1%C\xcf!d\x92\x11bOVG\x00owz\xdf\xfaU\xb7\x92\xf2\x96w\xf8$\xc5֨\x9fUT\xado\x9d_\xacI\xc6܊\x96U5D\xeb\x90\xd8;\xd5\xf6z\xa5\\7\xf7\x14\xcf\xdcж\x88l\xa6^\xa3\xc3\r*\x17k\x13\xc0贍\x9b\xfbbk]ћ\xd29\x88\xedd;\t\xcd`=2\xeb}\xbb\xbd\xbd\xb8\xb1\xfd\x8d3\xce&\xfc\fYC\xf0\xc5Ɔ\x80C \xe8\xe0\x93M\x0e\x02\x81\x18\x88\xcd\x06\a\x13\xb3X\x84\xb0\x868Ƒ\x8dM\x1c!\xa2\xa1v\xfac\xba\xde\xeayk\xaa\xab\xa7{F\xd5\xf3{ \xc90\xe9\xa9z\xab\xde\xd6o4\x1f\xea'\x1a1\xac\xc1\xaf\xc8(\x81\xa19Y\v#z\xfbӑR\x969\\\x8c\x9b\xea\xf1\xdan\x89̂ޝZ\xfc\x17G#\xd4Յ5\x8c}d\f\xcd\xc9Z\x18\xb9\"\xa3\x8ce\x0e\x97>\x9b\xea\xeb\xda\xda_M\xaf؎IX\x9b\x89\x03s\x84\x91\x11ր\xc8\xf0\x8e|\x91\x01\xf6\x1fOg\xcf\xefَ\x89hn\xb6\x1b\x17\xe3ۣ\x8a\x8cn\r\x88\f\xdfx\xb4.>\xb9[\xe2/1`\xff\xb1+\xde=W\x8f^\u008cL\x8a\x9bԀ\xc8\xf0\x8d\xd3B\x88\x83\x8flG\x81Jќj\xfc\x1c\xdd\x1a\x9d\x14\xb7[\x03\"\x03\x00\xe0\x00\"\x03\x00\xe0\x00\"\x03\x00\xe0\x00\"\x03\x00\xe0\x00\"\x03\x00\xe0\x00\"\x03\x00\xe0\x00\"\x03\x00\xe0\x00\"\x03\x00\xe0\x00\"\x03\x00\xe0\x00\"\xa3\x04\xa1\xe7\xbet\xb2\x0eN\xf1\x1b5\\`u-\x84\xaaE\x86\xd52\xd9C坬\xc1`\x91\\C\xbfX\x8e\x8e\xdd\xc9j3\x9f\xdaG\x88\x19x\u007fau\x1d%U\x89\x8c̖\xc94\xd5w\xb2\x06\x83=\x93\xcf.\x89\xaf\xfe\xe8s\xb4\xd5\xc9j5\x9fZG\x88)`\u007fau\xcdJ\tVתDFf\xcbd\x8aqp\xb2F\x17\x12\xdd\x14\xe9\x8b\x18\xa6`v\x87\x90\xc5|\xda\u007f\x84.\x83\xef/\xac\xae\x99)\xc1\xeaZ\x95\xc8\xc8l\x99L1\x0eN\xd6B\"#\x8b\xf94[d\f\xbe\xbf\xb0\xbaf\xa6\x04\xab\xab_\x91Q\x90eR1\x16NV\x1a\x19\xb6\x89M\v\x82\xd5u\x00\xe5j\xb5\xac\xae~EFA\x96I\xc5X8Y\x83\xc1vw\xd7\xc3ȰMlZ\x10\xac\xae\x03(W\xabeu\xf5,2\x8a\xb1L*\xc6\xc2ɺ\x15?\xd9le\x98ش X]\aR\xaeV\xc9\xea\xea]d\x14a\x99T\x8c\x85\x93\xb53ؽ{\xf7.\a\x91a\x9dش X]C\xf2)W\xabeu\xf5.2\x8a\xb0L*\xc6\xc2\xc9J\xde˰NlZ\x10\xac\xae!\xf9\x94\xabղ\xbaz\x1c\x19\xf9-\x93\x8a\xb1p\xb2\x92ȰNlZ\x10\xac\xae\x11\xf9\x94\xab\x95\xb2\xbaz\x1c\x19\xf9-\x93\x84qp\xb2\x92ȰNl\\\x10\xac\xae!N\xcaUB\x85\xac\xae\x9eEF!\x96I\xca\x188Y\xb5o\u007f\xda&6.\bV\xd7\x10'\xe5*C\xd1S\x8c\xc0\xea\xeaWd\x14b\x99ԩ\xbe\x93U\xfd\x8d\xc9u\xeb\xc4ҸbX]#\\\x94\xab\fEO1\x02\xab\xab_\x91Q\x02\xa5\b=\xf7\x9f\x93upJ٨\xe1\x02\xabktc0\xdf\xda\xd8GF\x19B\xcf\xfd\xe8d\x1d\x9c\x126j\xb8\xc0\xea\x1a\a&\"c\xcc\x18Ud\x80\xfd\xc7(\xac\xae\x88\f߀\x93\x15\xb8S\xa0\xd5\x15\x91\xe1\x1bp\xb2\x82\x1c\x14guEd\x00\x00\x1c@d\x00\x00\x1c@d\x00\x00\x1c@d\x00\x00\x1c@d\x00\x00\x1c@d\x00\x00\x1c@d\x00\x00\x1c@d\x80!\xd2nG\xff\x00\u007fAd\x80a\xb1\xbd\\\x17\xefK\xf9\x91\x98]N_\x83\x00\xf8\x03\"\xa3\x04\x1d\xe7(\x9c\xaců\xa2h\xda'O^\xdfx\xdcI\x8e֍\x933\xa6k\xea\x03\x96Q\x9cQ&\xaa\x16\x19\x9e;Ys;8sIE\t9'~\xb9rtr!\xe3\xc4\xd1e\x83B6Ń>\a\x96H\xcee\xf6\xa55!N\xb7\xe5M!&6l\x87R\xfa\x9c\xa91\xcbB\x88\xc3џ\x06\xe4?\xa3\x8a\xa7*\x91Q\x11'+\xeb\xe0\xcc\xe0\xd5\xcc'\x15%䜸Q\xbfvv2\xe3\x05\x1b~\x10\xdfuo\xdeK.\xd0[\x16\x86\xd2\av\x9c2\xecn\x88ɖܹ)6\x9c~u\xeas\xa6\xc6tS|ߝ\xf0\x81ؔFH\rj\\C\xe75\xb8=\xa3+f\x97I\x1b\xc0\xa2\xe9o9\xa3j'2\x1e\xff\xedf\x14\x19N\xf5\xd6>\xfeG\xa2FUg*\xb9\xa9g+\xa3\x93\xe5ڢ\x9fg\xdd\xc1\f\x9dσ_\x91QA'\xebީ\xfa\xd5\xe6\xa1\xc9/\xe7/S\a'/W\xb5\tS\xb5{\x13\x8b'\xa97]d\x97d\xe2\xc0\xd7Yo~q\xa4\xb3}\xf6\x89\xff\xdb\xfaF4[\xc1\xa5\xdc%\x11\xbc\xf2\xfa\xd0?\x9fo\xceM'\xa7\xfc\xde\xccܝ\xdfL\xaf\x11H\rd\\\xbe\xf3\x14vϴ\x15s\xcb\xd4\x1a\xc0A\xf5\xb7\xacQ5\x88\x8c+\vQd\xb8\xd4\x1b^\xe8\xfb\x9b\xbf\x86jTu\xa6қzd0:Y\xae-ڊ\x93\xc1L\x9dρg\x91Q='\xebZ\xf0\xe1\xc1U\xd1\xfd\xa2B\xec\xad\xe0\xe5\xaaVa*\xb9\x97\xbaH\xa9\xe6S+\x92\x10O,kӝ\xa7ޥzt\xacm\xe2\xe4\x85\t\x11\xbc\xf2\xfa\xd03\x9d'}\xf2\"f]\x90k\x97\xf7\xa0j \xe3\x9a:\x9f\xc0\xefYjŽ\xcbL5\x80A\x99qx\xa3j'2\x9e\x1fz\x1eF\x86K\xbd\xb2v\xb2sR\ue798\xd3\xceTrS\xea\x91\xd1{F\x99ڒ\xdc\xd4\x063u\xde\x15\xef\"\xa3jN\xd6\xd5i\x19\\.\xbe\xfb\xc6I|J\xf3rU\xab0\x95\xdcK]\xa4T\xf3\xa9\x15IH~\x96\xce\xca\xe4M\x1f\xeb\xc4꽌D\xf0jЇ\xfe\xba~\xed\xe4kɋ\xfd\x9d\xfa\x9bW6\xcc\x17\x86\"5\xa8qM\x9dO\xe0\xf7,\xb5\xe2\xdee\xa6\x1a\xc0\xa0\"\x837\xaav\"C.\\\x89\xde\xcbp\xa8W\xd6>\v\xfe}M\xfcN\xceTzS\xa6##}F\x99ڒ\xdc\xd4\x063u\xde\x15\xef\"\xa3\xd7\x11\x199-}u\xb2^\x9ex\x11\xfc\x98=\x8c\xffO\xf7\x94f\xe5\xaaVa*\xb9\x97\xbaH\xa9\xe6S+\x92\x90\xfc,%ۗa\xe2$2\x94\xe0լ\x0fm)\xe3\xc6=\xd1\xf7+\f\xaa\x062\xae\xa9\xf3\nv\xcfR+\xee]f\xaa\x01\fdKX\xa3j\x10\x197\xdf\t#é^\xa5FUg*\xbd)\xf5\xc8\xe8=\xa3LmInj\x83\x99:\xef\x8aǑQ\r'\xeb\xaf\a\xe6\u007f}p\xe2t\xf7en|J\xf3rU\xab0\x95ܫ\xb9H\x89\xe6S+\x92`\x8c\x8c~\x13'\x91\xa1\x04\xaff}h\xf6OLT\rd\\S\xe7\x13\xf8=K\xad\xb8w\x99\xa9\x060(\xfd-oT\r\"cwj#\x88\f\x97zc5\xea\x97\xe2\x0fr\xa6қRߨ\xde3\xcaԖ\xe4\xa66\x98\xa9\xf3\xaex\x1c\x19\xd5p\xb2\xde\x17G\x85h<\xed\x1e\x12\x9fҼ\\\xd5*L%\xf7j.R\xa2\xf94}\xfa\xc8E\x86u\xe2$2\x88\xe0ը\x0f\xe5#\x83\x91\x8a\x92\x1aȸ\xa6\xce'\xf0{\x96Zq\xef2\xf5\x06p\xe5(\xfd-oT\r\"C\x9e]\n\"å^Y{#x\xd3\xe7TC;S\xc9M\xa9m\x14sF\x99ڒ\xdc\xd4\x06+\xeasg\xcf\"\xa3zN\xd6\xfb\x876\xbem=\r\a#\x0eNV\xaej\x15\xa6j\xf7R\x17i\xb7\xde\xd4ú\xa8\x89\xb5\xed\xb3M\x1c}b\x12^ߞ\b^\x8d\xfa\xd0\xfb\xea\x17\xeb\xef\xd5筽RQZ\x83\x1a\xd7\xd8\xf9\x04v\xcfh\xbd\xfc2I\x03\xd8r\xa8\xfe\x965\xaa\xeen\x88\x9b;\xb25\x19D\x86K\xbd\xb2&\xe6\xefn̅jTu\xa6\x92\x9b\xbf\x05\xdf\xfe\xbc\xd2jEoAp:Y\xae-Z\x8f\x93\xc1\f\x9dσ_\x91QA'\xeb\x9dZpo\xed\xbd\x87\x9a\x83\x93\x95\xab\x1ag\xeb\xaeB\xbf\x97\xfaP\xe3z\xd3\x0f\x8bQ\x13k\xdbg\x99xo:\xbcy0\xf8\x14\x96\n^M\xfa\xd0\xe7\a?|\xb0\xddi\xc6\xde\xf6\x8f\x1fԶ\xbbs\xf7HE\xb5\x1a\x92qO\x1b;\x9f\xc0\xee\x19]1\xbfL\xd2\x00ɕC\xf5\xb7\xacQus\"\xf8\x86N{\xaeޖN\xf5\xcaS\xcd\x0f\xff\x12\xabQə\xaan\x9e\x8d\xca\x15\x1f\x05w\xf3:Y\xa6-Z\x8f\x93\xc1\f\x9dσ_\x91Q\x02\xa5\xe88\xb3;Y\x9fM\xad<\xfb\xf3\xcfW?\xbc\xffZƿ\xd4\xe0)e\x15Es\xebT\xf8\xf3sF\x88\xe3\xe4\xf3\t\a\xa9h\x19\xa4\x1b0\xe2rLd?\xa3Jg\xec#\xa3\f\x1d\xa7\x83\x93\xf5V\xf45\x02ٞ]\xef\u007f\xa0\x85\x12VQ\x02\xcf\x1et\x9eS\xb7\xef\xff\xa6\xeeq\x92\x8a\x96\x81ހ\x91\x97c\xc0\xe1\x8c*\x1dD\xc6h\xb9\u007f \xfa\x85\xf8\xe1\x01\xf55\x8aq\"\xbbT\xb4$\xf4\x06\x8c\xbc\x1c\x0f@d\x8c\x96\xf6\xf2\xe4\xca\xda\xe6\xda\xca\xe4ʾy\x16\x19/\xd0\x00W\x10\x19#\xa6}{\xfe\xf5\xda\xeb\xf3\xb7q\u008e\b4\xc0\x11D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x02u\xe9\"2\x00\x00\xfdH\xb9t\x11\x19%\xd8L\xf7\x93A\x93\xa3\xf8\x15\x83\xea\x92v\xe9V-2\x94\xacإ\x1c\x17\x9b)\xd9Iݒ\xfaY\xb4g\xda\b\xc4ߪX]\xbc\xfa\xbe\\\xb8։\f\xe2C\xd5z\x9cԻ\xd5\xd9\xf5\x85\xf61!\xa6\rW\xc61\x99pw>=9\xf5\xde\u007f\xdeX\xd7\x0e&\xa5\x1b\x1a\x90řp\x97\xa7\x83'\xd3\xf3\xa9\xc8 \xa5\xf3\r\xa0\x0fS\x95\x19:d\u007f}\xc0UF\x1a+ɋ\x02\xb2}:\xc3w\xe9z\x17\x19\xfe:Yy\xa1\xa7\xb2\x83\xd2\"\xb7\xc4\x17\xdfߞ\x9b|\xac\x1fK\xad\xa3ћ\x98Wu\xa1'Q\x8d\x1afS+v)' \xab͔\xec$\xad\xf7\xc9\xc4Or\xefȆ>\x02\x15\xc7*:\x91qI\\\xea\x13\x19ڂv\xdf9\xda\xff\xe3BƄ\xdb>\x1c=7\xa7\"\x83\x94\xce6@{\x98\xaa\xccС\f\x91\xc18zIc%\x89\f\xb2}:\xc3w\xe9z\x17\x19\xeb\xbc\xe9\xd2\a'++\xf4T\xf5\xd2\"×ү\x0e\\\x93\xfa\xb1\xc4:\xca\n=\xad\xfaP\xeaou(' \xab͔\xec\xa4fI\x9d\xbf ףw\x1c\xd4\b\xfcۋ\x9d\xe6\xbe\xf8\xf4Y\x9f\xc8\xd0\x1d\xa77\x19\xfb-\x851\xe1>\x89rn'\x15\x19\xa4t\xb6\x01\xda\xc3Te\x86\x0ee\x88\f\xc6\xd1K\x1a+\xe9[\x8fj\xfbt\x86\xef\xd2\xf582|s\xb2\xf2BOU/-2z\xf7\xed\xc8E\xa9\x1dK\xad\xa3\x91\xd0\xf3\xba.\xf4\xa4\xde@~6\xb5b\x97r\x022\xdbL\xd5Nj\x96\xd4۳{g\xff\x9e\x1aa\x831\x80E\xcd\xed\xa0\"\xe3_\xb5\xf0\x0e^\x11\xfb\xb4\xfe\xcf\xe3/\x99Q\x12\x18\x13n;Z\xccO\xe9\x17&\xaat\xb6\x01\xda\xc3Te\x86\x0eQ/,\x0f\xe7\xe8%\x8d\x9542\xd4\xf6\xe9\fߥ\xebqd\xf8\xe6d兞\xa4^Rdt\xc6\xd6\xcf?\xf8\x9c\x1eK\xad\xa3\xb5\xa3\x9dH\xday\xab\xa1\x8b7\xd5`\x86\xd9Ԋ]\xca\t\xb0\xd9L\tݝ\xd4,\xa9{\xb3\xb7_\xdbH\x8d\xa0\x89c\xe5\xe3\u007f\xff\x12\xfe\x97F\x86\xf2\xa1\x1a\x14\xb1{s\x17\xe5J#n\"gTeM\xb8\x1f\xccv~\x1c\xdaK=\xefe$\xa5\xf3\r\xa0\x0fS\x95\x19:D\xbd\xb0\xd9+#\x8d\x95\xf4\xc7Um\x9f\xce\xf0]\xba\x9eE\x86\xc7NV^\xe8I\xeb%EF_\xd2m,,\xbfM\x97IG\xa8\x89w\u05fe<\xa1\v=u\x9b)3[@w\xc5.\xe5d\xb1\x992h\x96T\xb9\xfa\xd6t\xf0ޠ\xd6!*\x8e\x95g\"\xff\xdf˥F\xf0f\xfevc\xe9%\xf5\xa1\xaa\x1eS\x1f\xea\x9ds\xf5'\xf2\x97#\xe7\uf13f\xb3\xf7\x1aU\r&\xdc\xed\xfa\xb1\xab\xb7\xce\x1cꍌ.|\x03\xe8\xc3He|\x87H\xbd\x0e\x95\x91\xc6\xeaN\xd6x\xfb(\xa3q\xe9\xfa\x15\x19>;Yy\xa1\xa7VoRd\xf0ՏK\x9d1O\xcc\xde&\xc7j#\xd4.,\x1fI\v=\xe9`\xecl!\xf1\x8a\x1d\xca\xc9d3eЦ\x90\xff\x13\xe1s\xaf\xae}\xa5\xe2\xd8\x1b\xf5k\xc1\u007f\x9aB\x04\x1fF\xad\x04\xdf~!>TV\x11\x1b\xbc\x83\u007f^~,D\xf4\xd5\xee^\xa3\xaa\xc1\x84+_,\x1f\x9bl\xdc7F\x86\xa1\x01\xf4a\xb42\xb6C\xb4^\x87\xcaTc5'kw\xfb(\xa3q\xe9\xfa\x15\x19%P\x8a\xcdt\b\x06\xcd\xe4M\x18g\x8aZ\xb1\xabNv\xa76\xd0_ld\xc2ͨ\x9a~\xfb3#\xb9\x1e\x96\xb92Sc\x87\xb1}<)\x97\xee\xd8GF\x196\xd3a\x184\xf3GFQ+v\xd5ɮ͔\x1d\xa3\xaeF\xd5\\?\xfb\xb9\x1e\xe6P\x99\xa9\xb1\xe5o\x9f\x19ͥ\x8b\xc8\xf0\x94\x01\"\xa3 \x9ct\xb2\xcd\xcdv\xe3\xa2\xed\xa0Aq5\xaa\xe6\xf8\xd9\x0f\xc8\xf10\x87\xca\xd8\xc6\x0ee\xfb2\x82\xc8\xf0\x92\xa7\xe1\xdb]\xb6\xa3\xca\xc5\xc5f\xba+\xde=W\xcf\xf8\x9b\xf9\xd0x\xb4.>\xb9k\xaf=M·e\x83o\xec\xbe\xda>D\x86\x97\x84ow=\x96\xa3\xc5\xc5fڜj\x18\xff\xdabT\x9c\x0e\xde\x04\xb4\\\u0086!\xe7òah\xec~\xda>D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x01D\x06\x00\xc0\x81\xff\x03&\xf2B\xcdI\x1b+\x96\x00\x00\x00\x00IEND\xaeB`\x82", + + "analysis/typeinfo-src.png": "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x02\xc1\x00\x00\x01\xb3\b\x03\x00\x00\x00\xf9m:\x11\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x02\xfdPLTE\x00\x01\x00\n\x03\x01\x05\a\x03\x02\r\x14\n\f\b\x10\x12\x0e\x0f\x13\x1e\x1b\x1a\x14 \x1f\x19\x1c \"\x17!;!# #$\"$%#&'%'(&+)\x1e()'\x18-T*,)/,!-/,12053'35386*6758:7<:.<>;>@=CA5&CxAB@EFDIJH\x00g\x00KLJ\x00j\x026NzNOM0R\x95\x06m\x06UP?PRO>V\x82\x0fq\vTVS\rr\x17\\WEVXU,`\xae7]\xad\x15w\x1c[]Z8`\xaa\x19y\x1e;b\xac_a^=d\xae?f\xb0*{!bdaSe\x84)}+Bh\xb3efdDi\xb4ghfLj\xafpiQEm\xb1ikh0\x820Ol\xb2Ip\xb4lnkTp\xa3Kr\xb7npm6\x869Nt\xb9zs[Wu\xb5>\x89=strZx\xb9vwt]{\xbbG\x8eHy{xX\x80\xbf^\u007f\xb9\x85}ea\u007f\xbf}\u007f|O\x93N\u007f\x81~c\x84\xbeW\x95V\x82\x84\x81m\x87\xbch\x88Ð\x86h[\x99Zj\x8ać\x88\x85q\x8b\xc1\x8a\x8c\x89`\x9dd\x96\x8cnt\x8e\xc4z\x8f\xbf\x8f\x91\x8eg\xa1hy\x93\xc9~\x93\xc4x\x95Ē\x94\x91\x81\x95Ɵ\x95w{\x98ǃ\x98ɂ\x9aė\x99\x96u\xa8v\x86\x9b̀\x9d̙\x9b\x98\xa5\x9b|\x85\x9eȂ\xa0ϙ\x9e\xa0\x9c\x9e\x9b\x89\xa1˞\xa0\x9d\xab\xa1\x82\xa0\xa2\x9f\xa1\xa3\xa0\x81\xb0\x83\x91\xa5ʕ\xa5Ď\xa6ѣ\xa5\xa2\x91\xa9Դ\xa7\x83\x95\xa9Χ\xa9\xa6\x8c\xb4\x8a\x94\xac֪\xac\xa9\x99\xadҟ\xaeλ\xae\x89\xad\xaf\xac\x9d\xb1֯\xb1\xae\x98\xbb\x97\xa3\xb3ӡ\xb5ڧ\xb6ֱ\xb5Ĵ\xb6\xb3\xa3\xbf\x9d\xac\xb7\xd2ķ\x92\xaa\xb9ڢ\xc1\xa4\xb7\xb9\xb6\xb3\xbcĭ\xbcܺ\xbc\xb9\xa6Ũ\xb1\xbd\u05fd\xbf\xbb\xb1\xc0\xe1\xb8\xc0կǫ\xcd\xc0\x9a\xc0¾\xb7\xc2ݻ\xc3ؽ\xc4ڲ̷\xc4\xc6ú\xc6\xe1\xc0\xc8\xdd\xc7\xc9żκ\xd8ɝ\xc6\xca\xda\xc0\xcb\xe6\xc9\xcc\xc8\xc2\xcd\xe8\xbf\xcf\xe2\xcd\xcf\xcc\xc4\xd0\xde\xcb\xcf\xdf\xc8\xd3\xc1\xc8\xd0\xe5\xe1ѥ\xd0\xd2\xce\xc8\xd7\xca\xcb\xd3\xe9\xd2\xd4\xd1\xd2\xd3\xdd\xce\xd6\xdf\xdfש\xce\xd6\xec\xcc\xda\xce\xe6֪\xd6\xd8\xd5\xcb\xdb\xee\xd5\xdc\xd1\xd3\xdb\xe4\xd6\xda\xea\xd9\xda\xe4\xda\xdc\xd9\xd2\xde\xec\xd9\xdd\xed\xdc\xdd\xe7\xd7\xe1\xdc\xe0\xde\xe2\xdd\xe0\xdc\xdb\xe0\xe2\xf0\xe0\xb3\xd6\xe2\xf0\xdd\xe1\xf1\xe0\xe2\xdf\xde\xe3\xe6\xe0\xe4\xf4\xe3\xe5\xe2\xe1\xe6\xe9\xde\xe7\xef\xe8\xe5\xea\xe5\xe7\xe4\xe6\xe7\xf2\xe4\xe9\xeb\xe7\xe9\xe6\xe2\xea\xf3\xeb\xee\xea\xec\xed\xf7\xe6\xef\xf7\xe8\xf0\xf9\xf0\xf0\xfb\xf0\xf2\xef\xf4\xf2\xf6\xef\xf4\xf7\xf4\xf6\xf3\xf2\xf8\xfa\xf8\xfb\xf7\xf6\xfb\xfe\xfd\xfb\xff\xf9\xff\xff\xfe\xff\xfc\x11\n֍\x00\x00 \x00IDATx^\xed\x9d\r\\T\xe7\xbd\xe7\xef\xb2\xcd&\xbb\x0f\xcc4w.s?e\x8a\xbd\xbc\xe8z-[\xb2z>\x8c#\xd6-h\x16#,6\xd7\x17\xbc\x94+\x95h\xae\xa2\xb7Jbȍ\x8e\x91\xd8\x05\nac\x12r'\x161vg\xbd)+\x91\x98b,\ti41\xb9\x96H,-\x9b\x17\x92\xb6c\x1a-&\xd4\x13\x93[\xaf\n\xfd\x9c\xcf>/g\xe6\xbf\xc1\xc3\xedͽ\xfd\xbd\xcd\xed\xc3\xe1\x16\x03\x00\x1d\x12c\xb0\xaf\xaewdd\xa4\xafq\x04Ow4_\x14aO\x0e\x18/\x891\xf8\x8c\xdbO\xbfX\xd7M_\xe8\xae\v\xb7\x18\x00\xe8\x90\x18\x83\xc5ABO\xfd\xe0\xa0\b\x06\x03\x13\"A\x06S\xe4\xa3i\xb4\x8a\xb8\xd8\fGӀ\xf1`\xa8\xc1\xbe\xfe\xfezo\xff {2\xd2\xdfS\xdf?\x84g67\xf7\xf4\xf547\xc3\xc1\b`<\x18jp\x17\xab}\x99\xab\xfdd\xb2\tO\fw\xee\xafo\xed\x84C\x11\xc0\xb80\xd4`\x00\x88;`0`n\xc0`\xc0܀\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\f\x06\xcc\r\x18\f\x98\x1b0\x1807`0`n\xc0`\xc0܀\xc1\xa6`$R\x83\x99\v\x18<\x0eF\x86GF\xf0\xff#5\x8b\x17\xfd%ihI\xa4F3\x1608fzggf\xe6eef\x96\x1bu=hf\xa6\xbb\xbd/R\xa3\x19\x8b\xd1\x06k\xa4N\x8dt\xb7ֵ*\xb3\x8d\xe2!A8\xa2\xf3\xd2y\xa7\xb0J\x14\x8f9\x05\x86S\xd5n\u0602rs\x93l\xb9s\x936\x1a\xa3p\x0fj\x8b\xd4d&c\xb0\xc1\x1a\xa9S\xa2\xa7\xbe\xbb\xaf+\x90\x84\xa2\x857܋\xb1\xf2\xe2\xab\xec\xdf\xf7O:[t\x9a\\y\xf9\x01\x97(>)\x9c5\xf8\x99wE\xde\xe0\x9d\xa5\xa4\x94\xbdR\xbaS\xfc\xad@\x0f\x9d\xed\f1\xf8\xd8\xd2\xcb;\xd9X\xebڭ\x8c\xc1\\\xbf\x01\xba*ER\xf7\xda\xdc\xe4\t\xb7銠\xd4\xe0\x8d\xc4\xe0\xf6\x901\xb8.\xe4\xec\x1b\x1c\x8b\bK\x82\f\xa6\xb0:\xb8\u05cd\xcd\xf35yu\x16 \xe4\xe6b\xe7Y\x99;l\xf7\xd8Y>\x955\x8dT\x95\xb3\xf0Km\xec\xa5\r\xdbT\vq\x06\x1fg\x95j\x03=3QU%\x8a\xbf\xa63\x14\x83Y\x83#\xa4\x0e\xae(\xc6>\xbe\xed\n1\xf8\xf2\x9dǖ\xd2\"Bt\xad\xf0\xd7\xc1\xaa~\x03T\xb3sh\xb9k裲\xe9\x8a\xc16\xec\xf8\xc8\\Z\a\xa7\xe5\x92\x0fpYYP[\x1e08,\x86\x1a\xac\x99:u\xda\xdd\xd5\xd7\xdd\xe8\tW\xebU[kZ\xe7\xdb\xd8\xe0T9\x8b\x15\x11\xa2\x15\xcdn\xae˰\x9f!\xf3в\xfd\xad%\xa8\x91_\xe6ͥ\a.\x1dq\xbeyiG\xd5\xfbX\xe3\x05;\x8e\x1c\xdb\xc9|kq\x1d8V\x95\xff\xae\xf8\xeeI\xe7\x03/_y\xe3\x01\xe7I<\x1e\xef\x10\xf6\x1d\xdb'\x90c\x11o\xe6\x17\xb74,\x15\x9cϼ\x89\x9f\xbcq@8 \x9f\xc2\x13\xf7\x95\x16|J'\\\xc2\u007f!\x06\xff\xdfau\xbf\x01\xaa\x91\xadڃ7\x87~&\xfd\x9b>\xdcI\x0f5\x9c\xa1-r\xec۶堔\xfa^\\\"ܞ\xe9\xf6\x94\xa1:\xbem\x10pN.,\x86\x1a\xac\x9d:ս\xbf\xde\xc3}\x97jp\xb1\xccn˕\a\xa2\xd3h%\x9b\xb0\x96\x97\xa4:\x96\xb3ڣ-\xd7n\xcfU]=pe\x85 \x1cY,\xe4\x1f\x11\x04r\xb8\xecx՝\x05U\xc7\xe9+\x97w/uU\xbdJ\xaf\x8b\x10\x9co\xe4\xe3LJ\xc8\xf1\xe0\xb5\xf9k\xd9\xf1\xe0\U000db596\xee{\xc6I\xe6^\"\xaf\xe6\xcb5\xc2\xdb\u0083lµ\x9b\x1e\x0f>=\xac\xee7@cn\xb5Ò\x96˾T\xfc\x9bޝLK\xf5<:\xf3t\xae-5o\x03Bd\xe4=]\xe8H\xcdiU\xb5\rb0\xa5\xb0{а\v\xe1L\x87\xa1\x06\xc7\x03\x9fU\xae7؞\x9cq\\r\xb1\"BޓK9\x1d\xc5\x19\xb9\xf8К\x19\xbc\x97\n(\x98\xce\xe0f\xb9\x880\xdc\xe0#w\xb2\"\xc2x\x83\xf10\xdc\x1df?w\x86c.\x83\xab\xbd\xe2|\xbf\xb8\x11\f\x16&\x91\xbf\"u\xf0_\xf3s\xc2n\n0\x99\x98\xca`\x1f\x9a]\x96\xc6.\b\xeb\xf7ZJ\xc2\xee\xa2\xeb\xd97q\x9c\u007f\xf5\xe7\xd8\xe0\u007f\xff\xe7\u007f\xedT\xe6\x85\xdb\x12`R1\x95\xc1b\xb5-W\xben\xa0\f\xef\x16Y΄o\x1dGZ\xf2\xab\xdefS\x0f\t\xff\xc9\u007fu\xe5~\x03\xeb\b@\x0fs\x19<\x15\xa0W\xb8_\x95\xa4\xd1[\x96Dq}00ـ\xc1\xb1\xe2C(7\xf7\x96\xb4ܹI+\xc1\xe0)\x00\x18\x1c+\xc3^\x87\xdd>\xcbn\xb7\xcf\xef\x82+n\xa6\x00`p\xcc\\\xec?s\xfa̙ӧ\xfb@\xe0\xa9\x00\x18<\x0eHV\x84\x81y\x11@8\xc0`\xc0܀\xc1\x80\xb9\x01\x83\x01s\x03\x06'\x8c͛\xb5&\x81\x181\xda`\xf9^\\_=\xbdβ\x9e\x9e\xd5\xeao\xado3͕+-\x82\xf3\x18\xfe\xe7x\xbe\xa0\x9f6\x11\x15\xff\x92}\x9f\xc6$\x10+\x06\x1b\xecO\x9d\x1arw\xf7c\xe8\xc5\xee}u\xde3\xdeЛk\xa6(\x17v\xe4W\xe1\u007f\xaa\\;\xd4\xf7\x16\x05Ҭ\xa2\xe5\x9e9\xefhLF\xcbs\xafL\xb4A,ĵ\xb38c\xac\xc1\x81ԩ!w\xc0ؑ&r\vBG\x93Y\x0eN\xed۔\u007fA\xbc\xe0ڴ/h\xbe\x92f\x15\x15o)\xe3\xee[\xe3\x18\x82\xef\xfa\xeeD\x1b\xc4B\\;\x8b3\x86\x1a\xac\xa4Nq\x06\xf7\xd2\xc44_\x9d\xf1\xe9\x95\xe3cߎ\xaa#\xe2\x8f6\xed\b6x]l\x06oV\xc6\xddͱ\x0f\xc1\x91\x9d\x8a\xd8 \x16\xe2\xdaY\x9c1\xd4`%u\x8a3\xb8\x9d\xdd\x1d\xe4\tw\xab\xe7\xe4prS\xb1\xf3\xceM\xc5W\x82B\xa5\x9e\tdQ\x89\xe7\xb7\xde\xe9,\x92\xa7\xfd\xec\xdbq`\xab\xb8\xe9\x006\x98\xe6\xb7\xcaI\xad\xf2U\x964\xcd*\x90E\xf5\xa6S\x106])\x16\x84\x02u\xf2\x9a\x18~\b\xfe\x87\xec\xecG7/\xfc\xc6w\xdf\x12\xc5W\xb2\xb3\xb3\xf7\xbcu\xcf\xc29\xab\xc9W\xd4Swͻ\xeb)\xfc\xef\xff\xc9f\xdcE\x9b\x1fZ=\xef\x9b\xf7\xb1\xf3\x83o}\xf7\x8e\xec;\xfe\xf6\x1du\x83\x17V/\xc43\x17\x8aA\xf8\xdbr\xfd\xe2\x15\x1f\u009b\x93\xfd-:\xf9\xd4}ߜ\xb7\xfa\x97zkSm\x99\xce*\f\xc1P\x83EQ1\xb8}\xbf\xbb\xa9\x83\xfc\xdc[\xd9}\x8c\x1da\x12O&\x877\x16\xec8r\xfc\x99;\x85O\x83C\xa5\x8aZ\x9e,\xa0YT/\xe6WP!\xd2*B\xb9_\x9f\xab\"\xf8,\xaa+;+.\x14\xaboƧ\xfc2{\xb3\xc6d\x809\v\xf1g\xfb7\v\xbfM\xa6\xef\xca^\xcdª\x9e\xcb~N$\x8f?\xa6s\xfd\xdf\xeb?\xc6\xc3&\xb6\x8e<^\\\xb8zX\x14\x87\x0f\xfdF\xd5\xe0\xa9;\xe8\xf0=O\xbd\x06\xae-\xdf\xef\x1cl\xb0\xb8g\x0ei1\xe7\x1b\xf8Cs\xcf\x1d\xa2\xaa3nmܖi\xaf\xc2 \x12d\xb0\xd8C\x8b\xdf\xfa\xce@v\xa5\xd7\xf01\xf8ݢ\xd2\xddϼq\x85~\xc1\xf3\xa1R\xc4c9E\"t\xec\xa4\x06?)<\x19\xc6`U\x16\xd5\xe5u+6\xa9\x83\x01)\xff\x90\xfd\x96\xc6d\x809\xb4\xaex*\x9b\xb8x\xd7\x1cy\x88\xde\xfc-\xfaϷ\xa8\xf0\x01\xa7\xbe\xbb\x90\xfcQ\x8f\x91\x85\x9b\x89^\xdc!\x83@\x83_ޱ\xf0\x1f\x9ezE\f\xba\x1a\x9fk\xcb\xf7\xcb\x1b\xbc90\xa9\xb96n˴Wa\x10\x892\x98AJ\x87v\x16l\xd7ڮ\xd5|R\xb9\xf0\xcc\xf6U\u008a'\xa9`|\xa8\x94([y@\b)_Ej\xf0\x85}\xbf\x0ec\xb0:\x8b\xeaH 3\x85\xe3\x9d9\x9b5&\x15\xa8H\xe2\vԲ\xbb\xee\x92g\xaef\x1a\xfd-\x1b\x99\xfdN\xdd%W\xa9\xf8\xf9\xa3\xd9\x17\x95.\x94\x9d\xaf\xdf<\xf5\xddoe\xdf\U00068a02k\xcb\xf7\xcb\x1b\xacLj\xae\x8d\xdb2\xedU\x18D\x82\f\x96\xb5\xf5zHf\x0f\x1d\x8e݆\x1f\x8bxu\x1fv\xf7\xc2\x11\x17-s\xb9P\xa9\x80\x95/\nZ\x87xI\b\x10F1\xb8\x813\x98\xa4Y\xa9\xb2\xa8\xde/j(\xfemH\x1f\xf7)\xe3\xee}\x1aCp`\f&?\x99\x80=\x9bٞ\xd2Be\f~\x8a|\xcf/|\x85Bˁ\xe01\x984x\x85\xf4\xf5\x9bCs\x9e\x12y\xb8\xb6|\xbf\xe1\f\x0eZ\x1b\xb7eګ0\x88\x04\x19\xec\xa1i\xc1C\xf5\xdd\xe4x0)#\xbc\xc6\x1f\x0fn\xa1\x91\xabb\xd5\x03\xe4\x91\v\x95\n\x18|\xa9\xa8\x8a\f»w\xd3\xf9}\xdb\xd8my\xbc\xc1\xf9\xf8\xe1J\x0538\x90f\xc5gQ]\xaeh\x11\x1f\xa8\n.#\"\r\xc1\xe2\x9c;H\x81\xb9p5\x99\x0e\xaaA\x0f\xb1:x5~\xed\x1d2\xe39V\x93\xee\xc1\xbe\xf9\xee \xb5\xadx\xdf}\xaa\x06{h\x99+\xaeV\xaf\x87k\xcb\xf7;\x0f?\x1f\xf9v\x88\xc1Zk\xe3\xb6L{\x15\x06a\xa8\xc1J\xeaT\x9f\xbb\xedt_W\x1d\x1d\x89\x13uN\xaeE\xc8o9vl\xa7\xc0ĕC\xa5TYT/\xbaV\x1d8\xbe\x9b届\x8bX\xe0\xceowT\x91\xd4\xc0w\xabv\u0875\xa2\xe8ɖ\n9\xa1ʟf\xc5eQ]~\xf9\xa1\xa2\xf7\xc5\xf3\x05\xbb_V\x97#\x91\x86`qN\xf6]\x87\x9e\xfa\xe67\xde\x12G~J\x8f\x03\xb06\xf7d\xdf\xf7\xe3\xfb\xb2\xef\xa1\xd3{\xe6\x91/\xab\x04\x83\xa3\a\f&\xb4\xbcx\xa5j\x82\x17K\xc6\x1508z\xc0`\xcc%\xa1\xe2\xa1\"\xf5\x99\xb7D\xc2\xf6\xa2\x80\xe8\x00\x83\tJ\xa8\xd4T\x80\xeeEi\x1d\xa2\x004\x00\x83\x01s\x03\x06\x03\xe6\x06\f\x8e+I\xe6\"\xd2\xdb1\x03`p\\I\xfa\xc8L\x80\xc1@0`\xb0\xe1\x80\xc1q\x05\f6\x1c08\xae\x80\xc1\x86\x03\x06Ǖ\xa8\f\xe6\x1b=rk\xd0\"!3\"\xa1\xd7<\x8an\xc0` \x98\xa4h\xcc\xe1[\xdc\xf6à\x17Cf\x84!)\xf0\xa0\xf9b\xe0\x90\x83N\v0x\xfa\xc9W\xf04\xf9r\xff9\xb6\xeb\x16~\x97*P,\xcb\x13\xb7\xf8[\xc9\xf3\x94\x19I\xbf\xf8H\x99\x1bx\bt\xa6̥\xb3\x03+\xa3\x13\x81\xf9\xfa\x1b\x93t\x80ރ\xfa\xfe\x8e\xa2\x82\xadPEDIh\xea\x147\xd7P\xbc\xa9\xa8|>\xb2oK\xab\xc1OJ\x92\xcb<\xb5\xf6\xd9#\xa2\xafÛ\x91\xeb\xf5\xb2]K+\xcaljM[B&K\xac\x1b=\x1b\xad\xcb\xf1\xd4\xe9Ԍ\xfa\xd6<\x14\xde\xe0\u007f\xfc\xcaG\u007f\xf3\x8f\x9c4Ir5\xe0\xb7*Z\x83\xb9E\x94\x87@gQ\x1a\xac\xbb1I.r\xdf\xf5\xf9\x82U\xcf\x1c\xdb$\x80\xc1\xd1\x11\x9a:\xc5\xcd5\x96\xb4\xe5x\xc4\xf5\x88%+\xc9\xc8[\x8fgt\"z쁫\"\xc8\x1fq.\xb1\xe3\xa96\xd4\xe6\u007f̝\x85?w#Y\xe1\r\xfe\xe8\xd6\x1f\x92\xaa \xe9\x11\xfc\xf0\b\x1e\xff\xfeR\xdeQ\xf3[\xa528L\x15\xc1-\xa2<\x04:S\x1b\xacWE\xe8oL\xd2q\x128P\xb5\xea\x12ޕ[\v\x06GGh\xea\x14?\xd7PҚ\xb1\xb3>\xb1r\x99(.\x9b5Lp\x94\x90\xf9\x9c\xc1XnV\U00056c03g\x99%\xe2\x10\xa2\xb5\xc4F]\x83o\xfb\x01\x91\xe3\xef\xd8ξ\u007f\xe7\xe9\x89[\xbe\xf7\xf3_=\xf1\xb5\x80x*\x83\x1f\xa1\xad\x1e\t\xbc\xa8\xcc\xd068\xd0\x19]U\xa0\xab\xc0RA{r\xfa\x1b\x93$\xaez@\xbc\xc0\xd2\x04\x1a\xc0\xe0\xe8\bM\x9d\n\x9dk\x10imb\xa7E\xa4\x06g\xc9\xd5/-\x18\x82\xf6\xe4\xa8\xc19\x8b茼\x1c\xb1\vќ7\xfd=\xb9Gn#%\xe6/\xbeD\xbe\xaa\xc9A0v\x00뉯~)\xe9\xabO\x04tT\x19\xfc\x11i\xa5\x1aW\xfd3\xb4\r\x0etFW\xa5\x98\x1a\xe8\xe6{\xb7rG\xd3>\xd2ߘ$qS\x85\xf8\xaap\x92l9\xec\xc9EIh\xea\x147\xd7X\x88\xc1Vf\xf0\xf2Y]\x14z|\x9a\x1aL\x13X\x14\x83Kf\xd1E\xd2\x03c\xb0\xfe\x9e\x1c㑯\a\xfcIo\xc6e\xb3\x98\xe3\xc0\xc5\xf1\xe9\xdb\xc3\x1b\xfc\xb3/\xffL[\x9aD\xa0\xbb1IGH\x1d\\Q|A\x14\xdfv\x81\xc1Q\xa0\x9d:\xa5\xcc5\x94^{\x8d\xaf\xd9\xd2\xe3[\x96\x8b\x87\xdbJ\xb4l\u007fk\t\xa2\x19\xc6\xd5֚\xd6\xf9\xb6>rN\xae\xa4S\xec*\xb1x\xfb\xf1(\x9d\\\xe9\xa9L&\xc7\"zl\x8e\xea\x8d\xf6\xe4\x94z\xad3\xe1\xb2%I_\xfa\xc1G\xda\xd2$\x00\xfd\x8dI\x12ȱ\x887\xf3\x8b[\x1a\x96\xca\xd9Y\xe6\xc3P\x83\xb5S\xa7\xb8\xb9\x062\x92\x86PS*\xb25\xb3\xea\xb7-\xd7n\xcfe\u007f\x0f\xe1b\x99ݖ\xdbI\xae\x8b@\xc8\xd2cÏexnm\x96-\xab\x96\xbe~z\x91=\xbd\xbc>\x85\xce\rfJ(\x1b5\xf2\xf1\xe0\U000db596\xee{\xc6I\xb3\xb3̇\xa1\x06O\u007fLfp\xa4\xb7c\x06\xc0ฒd.\"\xbd\x1d3\x00\x06\x03\xe6\x06\f\x06\xcc\r\x18\f\x98\x1b0\x1807`0`n\xc0`\xc0܀\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\f\x06\xcc\r\x18\f\x98\x1b0\x1807F\x1b\xac\x91:\xe5\xf36\u05f5v\x0f\x87_nr\xa8\xb1\xd6\xe8\xbfؚ\"\xdf{\x94\xb2_\xbfQ\\\xf9\xed\x03+\\\x9b\xae\xd0?\x18*䟏\xd4:\x98cN\x81\xe1<\x12\xa9\xe9t\xc2`\x835R\xa7|\xf5\xad=}]\xf5\xad\x89P8˒\xa5\xffb\r\xf2zkQ\xad\u05cb\xc2h\x1eW\xaa\x8a\x0e\xec̿ \x8a\xef\x9f\xb8\xb3邡\x06\x8bz\xa9S\xa28Ҥ?\x18N\x1a\xf3\v\xc5\xc2\\\xfc\xaf\xaf\xb9)=#\xd5Q\xbe\x1c\xf5\x89Ùi\xb5\xd5V[]\x1e-~e\x83}\x1d\x8e5\x83\xe2`uj\x87\xaf\xb7)\x05\xa5o\xabN\xb7\x91\x9b\xfc\x02aU\xb1p\xf9ȑ\xe2U\x8b\x8bw\xefX\xf0\xae(\xee\x14v\x1f?P\xb4\x0eᄑq\xf2\x88\xd0r\xf2们Q\xc0`\xa5\x81\xf8b~œ\xc7[p\xa9q\xe9哫\xaaN\x9e<\x19\xfawH\xe5\xc5.\xbd\\\xfc\xc0\xaf\xc5_\xb7\x14\x9c\xbc\xf4\xe6\x11\xa7P\xdc\xd2R\x9c\xff\xa6\xba\xb3iC\x82\f\x0eJ\x9d\xc2Cp\xfd\x90\xde\"\x93ƈ\xadF\xac\xb11\xfdf\xa3\xf9\xf8\xe3\xe4#w\xd4w\xe3\x12\x18\xb1\x9bP\xfd\x06\xe3\xe1\x9aD\x01\x96\xd0L\x1fk:n6\xe4\xc8\t\n\xab\x8a\x85uB\xd5\x05\xf1\xca\x052X>#\x12\xef\xe8\xd1\x03\xad*\x82kp\xb9x\xd3e\xe2?\xfd\x03\xd0\x1aU\x04\xbf\x98\xd8B\xc6\xe7\x1d;ɤ\xab\x14/q\xa1\xb8\"hmӅ\x04\x19\x1c\x94:%v\xf2y\xc2Fэ:|\x1d\x88EV̶\xca\x1bPIb\xd2N#9L(`p\x1fv\xfabj;\x99\xb4n \x8f\xb5hH\x1dV\x15\v\xeb\\\xf2P\xbb\xa3\xf4\xf2\xa7\x98b\xaa\x9a\x96\xc1\\\x83\xe3\xc2\x1b\\\x0f\x11\f~\u007f\xc1\x1b\xe2\xe5\x82\x17ɤ\xab\x81<\x1e\x10.\xa8\xd76]H\x94\xc1\f9uj\xd8\xebNğ!\xa8\xa5G{ف\x86\xd9s\xe5\x995h\x90$\xa0\x04\x8f\xc1b^\xb9\xd8f\xa7G\xfcX\xaa\xb0\x17u\xa9êba\x9d\xbf\x82]+W\xb4\x9b\xc8\x13-\x83\xb9\x06\a\x04n\x0f-\x92\xc1\xe2\xa6}\xe2\xf1\x02\xba\x80\xab\x85<\x9e\x14^U\xafm\xba\x90 \x83U\xa9S>Oc\xbf\xee\x02\x93H\xe1\xec\xce\xceN9%-\x10\x96֗\x9c\xd7ם\x91#?S\f\xf6؇Y\x11!ZiP\x84\x1b\xf9\xd4aU\xb1\xb0n\xab<\xb1\xa3\xf4U\n\xad\f\xb4\xc7\xe0@\x83\x17\x05\xee\x1805\xf8\x99w\xc5 \x14\x83\x8f-\xbd\xbc\x93\x8d\xb5.\xbas\xf8\f\x1d\x83\xb9\xb5M\x17\x12d0\x9f:5Լ\x9f\x96\x14\xfa\vM\x12\x8er\xfcP\xee\xa0\xd3\x01\x83\xbbP\x1aB\xb9\xfeO\x94b\xf0\xb0\xddc\xa7E\x84hM#\x15\xf3\xacܠ\xb0\xaaX\b\x8c\xa0\xc7YM\xda@\xcfAh\x19\xcc5\xb8TTE\xc6\xd4\xddTȪ*Q\xfc\xb5\\\xd0\xf6m;\x13\xbc\x189\xb6ql)-\"D\u05caKx\xe1Ҫ\xa0\xb5M\x17\f5X3u\xaa\xaf\xae\xb9\xaf\xbf\xbf\xbf#\xe6ݡ\t\xe2\xf3\xa0\r>ѷ\x01\xb5]\x1c\ue931\xd7ԃnk\xbb\xc7\xeb\x17\xb8\xab\x16\xd5v\xc9ӕ\xb3X\x11!Z\xd1\xec\xe6\xba\f;i͇UEͧ\xaf\xd3#\t\xe7\xe9\x93}\vv\x1c9\xb6\x93\x98ŎE\xbcL\x8e\x13\xbc+\x9f\\{W\xd5@|ѵ\xea\xc0\xf1\xdd,,\xb5\xc5u\xe0XU>\x1b\x83\x17\xa1<\xb9\xeb7\xf0b\xfe\x81z_i\xc1\xa7t\xc2%T\x1cyfU\xc1\xdb\xeaΦ\r\x86\x1a\xac\x99:\xd5\xc6f\xba\x8d>\xa3\xd1N\x8e\xee\x8a\xfb\xf1c{w2-g\xa9\a\x1d\x162i\xc9%\xdb\xe6#\x91S6\xf9\xcb\xe14Z\xc9&\xac\xe5%\xa9\x8e\xe5Lr.\xac*j\xdeT\x15\xa3ǫ\xee,\xa8:\x8e\xc7\xcc\x02:\xd7ID\xdb)\u05eb\xdb\xf9\x06\x98\xb7\xb7\x17/\xae`\xe3\xf4\xe5\xddK]U\xb2\xac\xf5v\xf6\xe7\x11\xc4K\xf9x\xa1|\xb9Fx[x\x90M\xb8v\xef,(\xda\xf1\xaejm\xd3\bC\r6\x01\x83\xb65\x83\xc3\xc3C]K\xec\xc1U\x8d\xcf*\x1f\xb1\x0e\xf3\xf7a\xa6\x12\x97\\\xac\x88\x90\xf7\xe4\xa6-`\xb0\x9aV\xbb>J\t\x95\x12\xb5S\xa7\xe2\x90E\x05\xa9S\xf1#A\x06\a\xa7N\x89\xc3\xcd\xed\xda\vL\x1e=\xa8\xa6ӓc#W\xab\xf3\xf1QJ\xa8\x94\xa8\x9d:\x15\x87,*H\x9d\x8a\x1f\x892\x98AR\xa7\xe4\x1d\xa2n\xb7F\xebI\x85\xd6\xc1C\xc9d\xbd||\x94\x12*%j\xa7N\xc5!\x8b\nR\xa7\xe2G\x82\f\xe6R\xa7\x1a\xd9\x01\xd9\xee:\xbdE&\v\xb6'\x97J\xcc\xe3㣔P)Q;u*\x0eYT\x90:\x15?\x12d0\x97:\xd5D\x03C\x12RE\x905\xa7\x95\xf7lS\xc5G)\xa1R\xa2v\xeaT\x1c\xb2\xa8 u*~\x18j\xb0f\xea\xd4iw{o_oB\xf6\xe4\xe8\x19\x8d\xbc\x92,U|\x94\x12*\xd5'\x9f}c\a\xfe\x02\xa9S\x13͢\x82ԩ\xb8b\xa8\xc1\x9a\xa9Sb\u007f{s]kg\xdc\xcf\x0fD\xa2\x19\x97\xaa5\xd8\xe3\f\x9am\xa2\xc4G)\xa1R%rA\xcbB\x01\x03\xa9S\x13͢\x82ԩ\xb8b\xa8\xc1\xa6@/\xd0$\x90:\xa5=w\xca\xe5\xa0@\xeaTD\"umR\xf4T\f\xa4Niϝr\x06C\xeaTD\"umR4U\xe4S\xa7\xb4\xe7N-\x83!u*\x1a\"umJ\xb4C\xa5\xb8\xd4)\xed\xb9S,\x8b\nR\xa7\xa2\"RצD'TJI\x9dҞ;ղ\xa8 u*\x1a\"u\r\x00\x06\x00\x06\x03\xe6\x06\f\x06\xcc\r\x18\f\x98\x1b0\x1807`0`n\xc0`\xc0܀\xc1\x80\xb9\x01\x83\x01sc\xb4\xc1\x1a\xa9S\x98\x1e\xc3\xff\xa2gt\xf4\xe4\xd9Җy\xd3Tw[pYT\x9a\xb1T\xb1\xd2\x1e\xf2\x97\xeb\x80X0\xd8`\x8d\xd4)\xf2\xac\xae#\xb6?Ml\x10m\xb6\xb9\xee\xe6,\x84T'\x94\xb9,*\xcdX\xaaX\xf1\xd84\x02ؼ]\xa1\xf3\x00M\x8c5X+u\n\xe3i\uf6ca\x06\x0f\xa5.\xb9H\xee\x1cB\xc1\x97DpI>\xa1\xa1>qana\xa4\x16\x80\x8c\xa1\x06k\xa7N\x89=\xf5\xbe\xfe\xa9hp\xa5\x8d~GԠ\xe0Ba\xf2\r\x9e\r\x06G\x8b\xa1\x06k\xa7N\xf9\xeaN\x8b\t0\xb8\fY\xdc\xe5\x19\xb6\xbc>2\x99\xdc(\x9e\xb1\xa0Lq8Ͳ\xc1\xe1\xf0\x96\xa5\xe6\xfaDq\x16\xbb\x81h\xb0\xe6\xa2\xe8+tX\x1c\x8b\xfc\u007f\xa8V\xcb\xe0\x8e<\x87Ş\x97\x1e\xbc\x16\r\x94\xb5ៃ\r\xa1\xe4&67\xb09\x1e\xf9\xee\xa6\xd9\x11:\x02\b\x86\x1a,j\xa6Ny\xda\xc5D\x18L\x82\xa2\xec\xd55\xa9K\xe8ս\xd5X\xc6\x12+\xfe\x9aHE\xe5\xf3\x91}[Z\x8dx1YI\xa7\xf4\xa0\x95\xde\xe6Eɲ\xad\x1a\x06w\xa1\x92\xfd\xedn;Һ\x8f#\bnmx9\xaf\x97]\x1b\xcfm\x8e\xafÛ\x91\xeb\xf5z\rO\xf34%\t2\x98K\x9d\xea%\x91i\t0X\x14\xadv<\xe0-\xa7\u007f̞ZTM\x9cJ[\x8eu\xf5\x88%+\xc5>\xd4\x1ah\xeak&\x1f\xb6\xac%왆\xc1nz\xb7Qm\xaa\x18\r\xca\xda\b6\xf9\xee\x0ens\xa0\x8a\x88\x9e\x04\x19\xac\xa4N\xf9\xeazGFF\xfa\x1a\xf5r\xf2&\x11+\xc9*a\"q\x067c+}b\xe52q8\x85˸\x1et\xe7\xcdJEY쉆\xc1}\x8e\xf42w\xb7\x18\xc5\x10,\xea\x1a\xacl\x0e\x18\x1c=\x892\x98\xd1\xd1*\x9eq\xfb1<@\x98\x13\x893\xb8M초\xc4`\u007f\x1d<܆EMsT\xb6zs\xf5\r\xc6uQa&J\x8b.\xd7]\xc7`n.\x18\x1c5\t2\x98K\x9d\x1a$\xf4\xd4\x0f\x86\ti\x9a$\x82\r\xde\xe87\xd8\xca\f\x96\x8fE4\xa3A13\x87|g\x14\xea\x1b\xdcU2\x10U\xbe\x00\x00\x1e\xa0IDAT)\x92Z\xc3\x16U\xfa\x9b\xb26\x82\xae\xc1u\xaa\x8ce@\x9b\x04\x19̥NQ\x12S\a+\xcaذ\x80#s\x83\f\x1eJ]\x82\xab\x82\x91\xdctQt\x10\xa3F\xb2\xf4\r\xae\xa6\x01@b\xee\x1a1\n\x94\xb5\xd1g\x1a\x06\xe7\xe6\xe2\x8fv\xb8\xfcV\xc0\x8f\xa1\x06k\xa6NaF\xfa{\xea\xfbCn\x05\x9ed\xd8\xed\xc5]%\x16/._r\xec۶堔\xfa\xde^{\x8d\xaf\xd9\xd2\xe3[\x96\xdbG\xce\xc9\xe5Է\xe6\xa5t\x10A\v\xdd\xdbf#{M'\x9fE\xc5MV#[\xb5\xa7\xb5$\xccߕ\xe1\b\xacM\x1c\xee\xf4z\xad%\xde\x0e\x9fzs\xb0\xc85\xad\xf3m0\x06G\x81\xa1\x06k\xa7Na\x99\xc8ܦpKN\x02\xf4\xf6\xe2\x1e\x92 U&\x8a\xa7sm\xa9y\x1b\x10Z\x93\x86PS*\xb25\xb3\xf0Tr]\xc4\"\xb2\x95#5\x19V\xfb\xb2\xfaY\x96\\>\x8b\x8a\x9bḽvX\xd2r\xa3\x128\xb0\xb62\xb1+\x99\xf5\xe0Vo\x8ex\xb1\xccn˝\x94s%\xd3\x0eC\r\x06\x80\xb8\x03\x06\x03\xe6\x06\f\x06\xcc\r\x18\f\x98\x1b0\x1807`0`n\xc0`\xc0܀\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\f\x06\xcc\r\x18\f\x98\x1b\x13\x18\\\x88\xec\xcb\xe1\x961@\a\x13\x18\xdc\xef\xadϴ\x1b\xfe\x17?\x01\x93`\xb4\xc1\xa1\xa9SA\x01T\xdaK\xa1n\x11\x00\xb40\xd8`\x8d\xd4)u\x00\x956\x93\x94+\x02L\x03\x8c5X+uJ\x1d@\xa5\r\x18\f\xe8a\xa8\xc1\x9a\xa9S`00\x11\f5X3u*\x1a\x83{\xa2\xbb\xff\f\x98\x81\x18j\xb0\xa8\x95:\xc5\aP\xe91l\xcf\xe9\xe8K@&\n0\xf5I\x90\xc1\\\xea\x147\xa9O\x1bBhQ\xb8\x06\xc0L%A\x06+\xa9S\xaaI=|\xf6\xf4\xda\xf6\xc8\xc5\x060\x03I\x94\xc1\x8c\x8eV\xad\xc9P:Q{\x98W\x81\x99L\x82\f\xe6R\xa7\xb8I]\xe0X\x04\xa0G\x82\f\xe6R\xa7\x82\x03\xa8\xb4\x00\x83\x01=\f5X3uJ\x1d@\xa5\r\x18\f\xe8a\xa8\xc1کS\xaa\x00*\r\x86\xfb\xbb\n\xad\x86G\xb3\x02&\xc1P\x83\xc7\xc7\x12\x84\xd2\xc3\xed\xe6\x013\x1a\x13\x18\xdc\xdf\r\xc7\xd1\x00]L`0\x00\x84\x01\f\x06\xcc\r\x18\f\x98\x1b0\x1807`0`n\xc0`\xc0܀\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\f\x06\xcc\r\x18\f\x98\x1b0\x1807F\x1b\x1c\x9a:\x85\xe9m\xabo\xee\n\xb3\x10\x00\xe8b\xb0\xc1\x1a\xa9S\xe2p\xbb\xbb\xf3L\x97\xfbL\xb8\xe5\x00@\ac\r\xd6J\x9d\x12\xdb\xeb\xfa\x89\xda\x10\xb0\n\x8c\aC\r\xd6L\x9d\xeaw\xd3;\xe4 ^\x15\x18\x17\x86\x1a\xac\x99:\xd5Y\x17.w\x15\x00\xc2c\xa8\xc1\xa2V\xeaT\xab\xa7\xb75R\xea\x14\x00\xe8\x91 \x83\xb9\xa8\xa9f:\xd9\xd4\f#10\x1e\x12d0\x175婋\x9c:\x05\x00z$\xca`\x06\x89\x9a\xf2\xb2\xfb\x90\xbdp;20\x1e\x12d0\x175\xd5U?\xc2\xcd\x01\x80\xd8H\x90\xc1\\\xd4\xd4\x10=\x9a\xe6\x93\x0f\xb3\x01@l\x18j\xb0f\xea\x94\xd8U\xd7\xd5\xd7\xd3\xd8\n{r\xc0x0\xd4`\xed\xd4)\xf1Lk\xfd\xfe.\x10\x18\x18\x17\x86\x1a\f\x00q\a\f\x06\xcc\r\x18\f\x98\x1b0\x1807`0`n\xc0`\xc0܀\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\f\x06\xcc\r\x18\f\x98\x1b0x*0\x12\xa9\x01\xa0\v\x18\x9cp\xfaK\xd2ВH\x8d\x00=\xc0\xe0\x84\x93\x99\xe9n\x87\xbf76n\x8c68$uj\xb8\x91]r\xe9n\x8a\xb0\xe4$s\xbc\xe8X\xa4&\x93C\x0fj\x8b\xd4\x04\b\x83\xc1\x06\x87\xa6N\xf9\xdc]d\xaa\xcb\x1d\xe6/\x83{\xbb\xf4_\x8b\x17\xc7\xf2\x8fDj\xa2A,[\xa6Ӷ\vuh\xce\a\xa2\xc3X\x83\xb5R\xa7\xd8]ˍ\xe1~\x8ds\vü\x18/\xaeDj\xa0E,[\xa6\xd3\x16\xfe\xea\xf9\xc40\xd4`\xcd\xd4)\x8ag\u007f\xb8{4f\xc7\xe0\x89\xb1IJe:m\xc1\xe0\x89\xf1g\x1b\x00\xc0\xccL`\f\x06\x80)\x00\x18\f\x98\x1b0\x1807`0`n\xc0`\xc0܀\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\f\x06\xcc\r\x18\f\x98\x1b0\x1807`0`n\xc0`\xc0܀\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\f\x06\xcc\r\x18\f\x98\x1b0\x1807`0`n\xc0`\xc0܀\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\f\x06\xcc\r\x18\f\x98\x1b0\x1807`0`n\xc0`\xc0܀\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\f\x06\xccMX\x83\xeb\x11O\u007f\xb8\xa6\x00\x90\x18\xc0`\xc0܄5x\xf4\x1aa.\xaa\xa6\xff\x8e\x86k\n\x00\x89!\x8a:8\a\xd5DjbjJJ\xf8gː\xa8\xd7P\xcdU\xbb\x9b\xfd[\x9e~{\xa6\x9b}\xbc\xdbsli\x85C\xfa\xcb,B\xa3Ѯ\xe0Z\xa5\xc3⨼\x86\xa7jr\"\xb5\x9dр\xc1]\xd6a\xfei\x94\x82I\xa3\xf3\x115\xf8j:*\xac\x9e\x8b\n\xc9\xf46\x94Q]\x92\x92\xea\xd3](z\x83G\xb3Pn\xf5|\x94uC\x92n\xa4\xd5Gj=\x93\x89\xc5\xe0F\x94\xc9&jP\x99Ԅj\x86\nSSs\x18\xf4\a^\x92zC\xbbg F\x83;\x88\xba\xe4\xbbm\x1b5\x98\x1e^k#\xf3*\xd1\"\x89=\xc9\xd0\xee\x83#j\x83G}\xb2\xc1\xbeh\a\xaeq0\xc8\x1cو\xe6W\x97\xa7\xa2.j\xb0XO\u0600\xec\xa2t-\x13\x97\xa3˓ӱ\xc2e\x852\xa4j\xe8\x1e\x95\x14\x83\xaf\xf5W\xa3\x9cQ\xe9**'uղ\xe02\xf8\xcc\xed\xb65\xd5\xcbRH\x9d\xe17ؗ\x86\x96T\xceJ\xb5\x13\x83mi\x8bZ\xdd\xf6\xe4~\xf5\x1a\xae\xa6\xa7\xb6\x0ez\xec\x0eZ?xP\x87\x04\xe8\x10\x93\xc1\xa3\xa9D\xa8\xd14\xf2\xc5ۄr\xd9<+~\xe6@\xacT\xbd\x91\x8c\xe4\xdf\xdfh\x9ae[\xba\xa3g\x83=\x8f\xecNK\x9e\\[\xe6\xc6\x1b\xe43\xc0\xa0\xbb\xd7\xd6ꍙ\xb6E#\xb4\xfd\xfe\x1c\xdb\xdc\xfdtJ\\\xe3\xb0/'U\x04\x81\x1aLjKR\xa0\xd4\xe2\xc7\xf6J\x94\xd2T\x9en/d\xeb\xf1\xf7;n\x9a\xa9\x1c7R\xf2$b\xf3\"eO\xeeFV\n\xfe\x1e/\xa7\xef]\xb3\xb4U\f\xaeDȁ\u007f\"\xfdhIj\xfa\xf2,d\x0fR8\x0f\x91\xba\xc9K\n\x02\xbf\xc1\x85\xa8\r\xaf!\x97\xfc\x18\ni\xa1\xd0\x15R\x03\r\xcf\xc2\xef\xd6\xc1\xba\x1aD\x1b$@\x87\x98\fƿ\xd0J\xf2\xd3&ߖM\xfe\x9fj\x16꼆PV\x0e\xc5B\x861JO*ژ\x87\xecn\xba#]\x96\\\xd9ٔ\x86ǩ\x1b\xbd\xbd\x99y\xbd\xbd\xbd\xf47cEYm\x1di\xcb\xc9d\x99u[\xe76+\xf9]\xfaR3=\x1d\x8b\x90\xda\xe0\x1b\xbd\xe9\xe5W\xa5\xab5\xa9\xbd7\x86\xdaR\xd0,w\xed,\xdb \xdf\xef\xb8)\xa3\x1f\xb9\x1bɳ\x88\xb7d\xb0\xf7\x1b\xbc\x8c\xecD\x8d\xdeN\xbft\xa4\x9c\x94\xd0O\x89bpWG\x8d\xcd\xd6+\x9dFh\xd9(\xd9\xcd]\xa2n\xd8Iwv\xaf\x92ٲ\xc1ג\xe9'\xb8\x8f\x19L\xde\xe15\x94\xa7^h(ͺѳ\xd1\xca\x14\x1eMΕ\x00\x1db3\xf8\fJ\x1b\x95V\xd2\x1d\xe4&\xff^[\x0ej\x13\x91B\xa0\x10v\xac\xc1cW\x87TVN\xc60\x0f]\xb8\x8d\xb6W\xaa\b\a\xf9rN\x93ȇ\xa2\xcb\xff8?\x03\xcb2:Wm0.+\xc8L\x8c.6\v\x0f\xeb\xd7\xd2s\x83\xfa\x1d\x1fK\x10\xa9q\xb1Ȗ\xf9n\xba\x9b*\x1b\\C\xf7P\xfbQF\ra6:#\x95-\x91ieK\xaa\xea\xe0^\\>\x9dA\x16\xd2\xd7\xe8\xac\xe4k\xeauHW{=\xd59d\x80\x97\r\ue875\xb4$Y\xa8\xc1d}\xa3h\xbe\xa4ZC.):p\xb7\xecXpj\xe4\xe2l\xc6\x12\x9b\xc1R\x06\xea\x19\xb5\xa5\x90_T\x93\xfc[\x902Q\x17\x1e\x83Cw\xe8\x1dm\xf8wzC\xaa^)I+3F\t\xe9T@\xce`r\xc0\xa8\x86\xb8ZFw襬2<\x18QA\xb6\x05\x1b<\x82\x06q\x11C\x8f\xd6Y\xe9G\xa7\x19]S\xf7;>r\xd9с\xd1\xc6,\xfc\xe9\xcb\xea\xf3\x1b܁\xe6\x92\xf9\xbd\x81\x0ff\x97zON\n2X\x9a\x8b\x86\x87䃍\xcb\xe5#6~\x86\x97\x93z\xa0\x843\xb8]^4\x9d\x1aL\xb5'\x06sk\xb8*\xab\xbb\bу\xd5\x0e\xbb\x04\xe8\x10\xa3\xc15\xa8\xb2\x8b}K6\xc9\xdf{7,\xf8\x87\x1c8\x06ѣ\xecu9\xba\xa43\x16\x89\x1a\x9b4\x9f\x9e\x10\x90\ns\xf17k/]O\xb0\xc1Ғj\xa9\xcbN;g;\x80=\xb8\xbaT\xf5;>\x98@\x04ѳ\x04\xd9o0\x83\amvjN\x1fZ\xa9\xbb$3\xf8\x86\x87\xed\x01,A\xfd\xa3\xc9l\xa4\\\x8eT\x85\xf0h&\xaa\xec\xc5%\x10gp\x97\xfc\xfd\x95\xaa6\x98cH\xae\xbc\xcb\xf1\xe0\x8f\xb19$@\x87\x18\r\xbe\x88\xd2+\x99\xadM\xc8r\x91\xfcیf\x93/a:d\xe1\xafu\xab_\bj\xb0\x95\x19\xbc&\xa3\x8fB_\xa3\x06{\x88 TEjp\x19\xfb\xddg\x94\xe1_4ݟ+\v1\xb8#m\x94\x15\x11\x92\x95\x0e\x82\xadx\fV\xf5;>\xca\xe9\x80髦\xe5{!\xfeT\x10\x83\xaf\xa6\xa7\xb0Cs7,\xe9\xf4}5\xd6\x06\x17\x06\x01\x83-T\xaeQ\x87\xe5\x1a\xfeA\xd1\x02$#UU\x97\x9fa\xe7\xebz\xc9'^6Xd\xbe\xfa\x90\xae\xc1\xd7\x10\xfbV\x9a\x8fF\xe8\xabP\a\xeb\x12\xa3\xc1\xf8[\xd7\xc6\x0eN6!4\x1bk\xd8i#\xc5\xeb\x90\x15\x95\xe1\xdf\xf1i;=\x93\xc4\xe0\f\xeeb\xd2o\xa3ߝyyd\xb7\x86\xccP\f\ue925l\x1b\xea\xc4+H\xc7\x1d\xf9n\x0f1x4\xad\xc3\xceN\xf9Y\xd3ȩ\u058c\x17?\xc9\r\f?C\xf6\xfa\x1bm\x96\xfe\x1b+\xf3F\xe8/\xb8\xbd\xa3\x8c\xedq\xd5X\xeb;\x16\xd9DrN\xae\xec\xb4\xd4Wf\xe9\xc5#ך\xe4\xea\xce\xead\xb2\xf34hK\xaf\xddfON\xf1\x90ʺ\xaf\x195ʧ\xf0\xa4\xea\fVDHV\x94\xd3ޚI\x8fYq\xfd\x8e\xf3\x9c\xdcEvHe#\x9a\xb5ac\x16)q\xb1`5\xc8QS\xbd\x11\xd3A\xaez\xc8ٸ\xd2z\xbb\xffs\xc4!\x1b<\xec@y\x1bsP&\xf1p\x19ʪ^\x82f]%\x9f\xbc\x1c\u007f\xbb\xd1\xd9h\x91\xbbڑ\x99\x96\xc5\x1d\x0fNEK*3\xec\xc4O\x1d\x83\x87\xd3\xd0\"\xdc\x17;2\xd7\bǃ\xf5\x89\xd5\xe0kVV\xa8\x92\xb3\xca\xfd\x8bl\xf6E\xf2\xc8\xe7+O\xb7\xd8\xe6\xd6\x05\x04\x1eMC\xa8-\x15\xd9\xdaY\x95ڕg\xb7\xcfg\a\xdaF+\xed\xb6\xbc3\xf4(*\xb2\f\xda\xf0#Q\xafy\xaemn3\xeb\xa9\xd0>\xabړB\xe6\xdeHů\xda\xe4\xd1\xcc\xe7\x1f߭\x1b\xcbR\x1dk\xd81/\xa5\xdfq\x1a,e\xd1\xe1ut\xff\xdcT\xdb\\v\x85\x83X\xe6ߣ\xc2=^ݘnq,W\xef\x9a1\xfc{rbY\x9a%\xbd\x9an\xe4h}\xa6\xd5QN\x8c\xe4\f&\a\xb8\xad\x99\xb57\x96\xe1\x82 pNn\xa80նd\x88\f\xcb:\x06Kb\xb9ÒV\xc6.:Z\xa2\xaeK\x00\x9e(\fV\xe1c\xa7\xe5\xa8\xc1\xe1[ƛ\x1bV\xf9\xc3\x12\xe6T\xde8\xf0\xb0}\xa5x\xd3\x1dt|W\r\xdb\xdf\x15Qt\aQĔm\x91\x9a\xcc`b5\xb8\xc6? \x1bnp\xbb\\D\xc4\xd9\xe0\t\x1d\x8bӧ,\xec\x15\xa9v\xba\x83\xb81\xca\x03ٵ\xb6\t\xec\xaaN{b2xh\xb8\xfdv\xab|\xa5\x9f\xb1\x06\xd7\xf6H\x8b\xfcN\xc4\xd7`ɛ\xa2\u007f=︹X\x18\xf6Tw5\xca\xd8X\x9d\x1b|\x1eN\x87k\xf6h\xae͛\xb1\xc4d094\xef\xf7\xc8P\x83o\xa0\x9cJ\a\xab\x87\xd9\x0e`\x86\x1b|\xe8\x14\x84\xa7?\xd9uw\xfe\xd6?I@Ԅ7X\\\x83\xb2\xf0\u007f%b\x82b\xd0d\x83ie\x8a=\xa3\xb7\x87\x94\x90:\x9aOm\xa3\x06\xab\xa3\xdb4\x16\tn\xb0HY\x81lp\xaf\x05\xa1\xd4e\xad|\xd1\xf4\xc1\x82\x87O\x9d}~\x85\xf0'il\xa0\xf4\xfb\u007f\x94\xfex\xb0`\xe0\xe6\xefO8\x85\xa2\x83\x87\v\xee'-\xce-\xae8|\xf6\xa0𬤂3\xf8a\xd7ӯ?\xed\xda\x1b\xd4\x16\x1b\xfc\xf9.\xe1\xd9\x0f\xf1\xe4^\xa1\xe1\xf5\xa3E\xebǤ\xb1\x97N\x94\xae*(}lׂp54\x10D\xa4*\xa2˂,\xf4^\xe0\x84Ġ\xc9\x06\xd3k\xe9\x83\fVRۨ\xc1\xea\xe86\x8dE4\x1b\xa8\f\x96\x06Kȝ\xd3)eʗ\xc0\xd1\"2\x1c\x1e]J\x86Ѓ\x15\xf8\xe1a\xaa\xa2k)\x1eGw\x15ᩱҭ\xf8\xb5\xb1\x97\xaeK*\x14\x83\xcf\ng\xfd\x8f|[l\xf0\xb3\xae\xd7H\x83\xd7\xe8a\x89\x0f\xd9\xc1\x89\xf5\u0096\x9b\xd2\xd8M\t\x88\x9e\xf0\x06_\xdbhIG\x0ek\xf5\xd5\x04Š\x851XIm\xf3\x8f\xc1\\t\x9b\xc6\"\x9a\r\xd4\x06㩞mY\x88;\xba\xfcE\xf1\xdd\r\xcf\xffn\x8c\xd6\x00\x9f/\xf8\x9d4V@|\x94\\\x0f㇃.\x89\xa8\xf9;I\x03\xc5\xe0\xbd\xeb\xe8?\xeb\xf6\xaa\xdbn?\xf8\xb4p\x8aN=x\xf7؟0\xa5\xf4\xa3\xb1\xde\x05\xc3o\xac\x847\u061d\xb6\u007f\b\r5\xa7\xb9\x13\x14\x83\x16\xc6`.\xb5\x8d\xd6\xc1\xaa\xe86\xadE\xb4\x1a\xa8\f\xf6\xb1 \x8cF\x94\xa2\x941\u05cf>\xb8VXq\x98*\xbc\xf51\xe9,\x1d\x8d%\x17\xd9\x0f\xa3\x06?+\x8cI\x1a(\x06\u07fb\x9d\xfe\xb3\xbdJ\xddv{Q\xc1\xda\xfb\xe9\xd3\xf5\x02\x83\xd6$\xeb\xab$ F\"T\x11\xa3\xf4X\x04\xf9\x8d&$\x06-\x8c\xc1\\j\x1b5X\x15ݦ\xb5\x88V\x83\x80\xc1WIz\x03k<\x84\x92\x03\x06\u007f\xf88\xb6\xec\xfa\x89\xfc\xa3\xe4ɩ\x15c\xac\x88\xe0\f>+|(i\xc0\f\xbe\xf9\xf4ui\xef\xdd\xc4ӱ\xbb\x1fV\xb7\xdd^\xf4\xf1g\x05\xb4x\xdeu\xf7\x87\x14Z\x87\xac\xbf_\xa33 ,\x91\xea`I\xb4\xb3\xdb\xeb\r\x8eAc\x841\x98Km\xa3\x06\xab\xa2۴\x16\xd1j _\xfcfA\xed7F\xa5<\x94\x87[_[Ɲ\xd28H\xabXi\xcb\xf7\xc9\xe3؊SK\xe9S\xce\xe0\x9b\xc5[\x88\xa1\r\x8f\xd1\xf9\x9f\x1d\xfe\x8c-\xc7\f\xfe@\x18\x90^\xa7\x05\xee\t\xe1uu[r4\xed\xac\x93\x18}Vx\x89\xb4}\xf20y\\\xff\xa0\x04\xc4HD\x83e\x8c\x8eAc\x841\x98Kmc\xe7\xe4\xf8\xe86\xadE\xb4\x1a\xc8\x06\x93\xf2\xa5K\xf2ّ%3ˆҔ\xfc\x88\x83\xc2⃯\x9d\xda+\x9c\xa3\xcf\x1e\xbf{)ٱ\xfb\xd7\x01\xe7\xde\xf7\xc6>\xd8\xeb\x1c\xf8WI:\xe7Zw\xf4l\x83\xf0\x96K[!\xff\x13r\x04@\xd4Dip\xfc\x99X\f\x9a\xb1i\x1527]\xe7\"5\x01\f'a\x06O,\x06-!\x06\xbft'\x9c,\x9bz$\xc6\xe0\tǠ\x19o\xf0\xc1sc[\xe0b\x86)HB\f\x9ex\f\x9a\xe1\x06\x8f\t\x15\r\xc5Agހ\xa9@B\f\x9ex\f\x9a\xe1\x06K\a\x17o\xf9$R\x1b \x01$\xc6`\x00\x88\x17`0`n\xc0`\xc0܀\xc1\x80\xb9\x01\x83\x01s\x03\x06\x03\xe6\x06\f\x06\xcc\r\x18\f\x98\x1b0\x1807\x86\x1b|\xaaꏑ\x9aL\"\xd7\xef=\x15\xa9IT\xd0w\x11\xaf\u0380\x8901\x83\x1b\x04v\x87\x81\x06\x9f9\x85\xb5\x1a\xb3\x0f\v\a5\xef,\xd3%\xe2*N9\xe5\xabq\x9dQ\xf84vX8\x1c23\xf6\x9c3\xf6.4;\x03\ff|\x06\x9f\x93\xef\xf8\xfa|\xc0\xa9w\xbd\xd6\xd8{{]\xa1s\x8fF\x1dy\x17\xf5*\x0e\v\xe4n\x88g\a\x06\x16D\xa5\xd3\xebΣ\xc1\xb3b\xce9\v\xbc\v\x8d\xce\x00\x83\x19\x9f\xc1U\x81\xfb\xb9\\\xfaW\x1c\x1e\f5\xf83\xe7\xe3\xfe\xc9\xeb[\xc2_\xe9\x15\xf5*\x9eu\x92Q\xf4=I\xca\x0f\x8a\x1d\xd1\xe1iWP\xc0\x8e\x14kJ\x14\xf7.\xb4:\x03\fe|\x06\xaf\x8fV\xaf \xf6\x16\aJ\x88\x8f\x85\x8fC^\xe6\x89z\x15c\x9f\xc9\x06\u007f\x16]yr\xb38\xb4`\x88\xcd`\xee]hu\x06\x18J8\x83\xff\xb4\xc2\xf9O\xa5\xc5\xe7\x1a\x96n!)2\x81|\xafSr\xddI2l$\xd7c\x81\b1.!\xec\xf3]\xc5K\xef\x0f\xad\"\xc6\n\xe4\xc1\xeb\xe8\xaa\xd7>\x11>y}\xd5\xd18\xad\x82\x1a,\x05\x85\x9b\x1d\xdd[\xbct;\xbd\"2\xd0/\xe5\xe9\xfc\x10\xd5c\xc99S\xde\x05A\xa33\xc0P\u008e\xc1\xe7\n\x84Ƕ\bw\x1e^A\xbe\x9f\x03\xf9^7\a\xe8=\xb5\x03T\x0e\x97\xb0\xf6ĩ\x154\xe6@I\b\xfb\xa4`\xed\xf3\xa7\xb6\n!\x06\x93\xdb\xcf)\x9f\xef\x12\xd6\xe1\xff\xee\xff\"N\xab\x90\r\x0e\n7+=x\xb04\xffc\xbe_ʀ\xf0\xff\xa4 b\xc99S\xde\x05A\xa33\xc0P\xc2W\x11Ż\xa4ׅS4-L\x9d\xef\xa5|\xc5\x17\xfd\x1b6\x84D\x88q\ta\xf7\xae\"{\xea\xebC\f~]\xf8\x83\u007f\xf2\xacSp\xd2\xf0\x85\xb8\xacB6X\x1dnv7\x1e֯\x97V\x05\xf5\x8b?>B\xc8A\x8b\x18r\xceT\xefB\xb33\xc0P\"\x18|BzO\xb8)=\xfe`p\xbe\x97\xa2\x17yN+^%!\xec:\x8bOx:\xc4\xe0S\x82\x1c\x86p\xfd1g\xb1P\xecz\xec\xdfⴊ\x80\xc1|\xb8\x19\xfd\xae?*\\W\xf7K\xa4\v9<\x17C\xce\x19\xf7.\b\x1a\x9d\x01\x86\x12\xc1\xe0\xb3҇xW\x9f\xe8\xa5\xce\xf7R\xeffQ\xbd\x94\x84\xb0\x0f\xd9\xd7l\xe8\x9e\xdc{~\xd1\x0e\xaf8\xfa{\xe1\xf7GW\x1c\x8e\xd3*\x02\x06\a\x87\x9b\xe1o\xf9\x0f\xd5\xfdJ\xfeeyb\xc89\xe3\xde\x05A\xa33\xc0P\"\x1b\xecbz\xa9\xf3\xbd\x88^ϓC\xa8\x8a^JBؿ\t\xf4(\xe9á{r\x81\xc3\nc\xf4X\x04\t\x85\x8c\xcb*\x14\x83\xb9p3\x9a\x04\xf5<\x1e\xdfU\xfd⮜7\xa5 b\xc89\xe3߅\xa4\xd9\x19`(Q\x1b\xac\xca\xf7\"\xbf\xf1?\xd2\x19\x8a^\\BXU)\x96\xe5\x0f\xae\x10\x83\xa5\xfbW\x05\x86\xb5/\x96~\x11\xbfU(\x06s\xe1f+\xb0[7\xef\xde\x12ԯ4\xb664\x15'\x86\x9c3I\xf5.\xb4:\x03\f%\xac\xc1\xbf_\xfa\xec\xd8\t\xe7\xc7c\xbb\xb6|\xce\xe5{IħgOmY\xfc\x85:BLI\b\xfb8\xbf\xf4\xe0\xd3K\x05\xe7\x89\xdf\au\xf8I\xc8iظ\xac⃣\xf2a\x02)\x10nF\x0eaT\xbc\xf4\xfc\xaa\xa5d\xaf\x8b\xef\x17\x17\a\xca\xd0ʈ-\xe7L\xf5.B;\x03\f&\x9c\xc1c+\x04\xe1D\x81\xb0\xf8%VB\xfa\xf3\xbd\xc8+\rK\xf3\xef\xfd0(B\x8cK\b\xfbd\xfbһ\x1f;\xe1\xa4\xc1b*\x9ev\xa9\xcbƸ\xacb\x8c\xbc\x9a/\u007f\x9b\xff\xc1\u007f\x85\x83뱽\x05Ż\xfe\x95Ns\xfd\x0e\xe4?&\x05\x11c\xce\x19\xf7.4:\x03\ff|\xe7\xe4\xc6\xcdX\x83s\x92\xf7\xdd\x03\xe1fڧ\xf2^r\xee\x9dxt\x94\xff]ĥ3`b\x18l\xb04\xf6l\xe9\xf5Hm&D \xdcL\xd3\xe0\xebŇ\x95\x03\fㇽ\x8b8u\x06L\b\xa3\r\x9e\\\xf8p\xb30\x97S\x00ӈie0\x17n\xf69\xdd\x01\x8c\xd0\x1e\x98\x06L+\x83\xb9p3\xba\x03\bq\xe83\x80\xe9e00\xf3\x00\x83\x01s\x03\x06\x03\xe6\x06\f\x06\xcc\r\x18\f\x98\x1b0\x1807`0`n\xc0`\xc0܀\xc1\x80\xb91\xdc\xe0鑛\x16\v\x113\xd6\xe2\xf4#I\xc4{\x9b\x02L\xcc\xe0\x88\xa1f!L\xc5ܴs\v\x84{\xc7HFł\xb3\x1a\x8b0>\u07ba\xb8x\u05f9b\x95j{\xe5K\x8aՓ\xc1D\xccX\x8b\xfeGr\xb6(\xdc[\x9c\xa11n\xe338\xeaP\xb3`\xa6dn\xda\xd8Y!\u007f@\xbayJ8\xabk\xd2\xd9\xc5UϟX/\b*I?'+~/x2\x88\x88\x19k\xd1\xffH\xa4\xd7\x16k\x18\xec\xffAI34\xc6m|\x06G\x1dj\x16\xc4\x14\xcdM\xbb)\xecڋ7Nнi\xf3z\x01\xb9Q\xf9\xe6*!x\x98Un\xd0\xe3'9\"f\xacq\r\"\xa3\xf5\tS~P33\xc6m|\x06G\x1dj\x16\xc4\x14\xcdM\xbb)\x9c]<\x16\xce\xe0\xc7\xf3\xe9\xddJ\xcf\xc6npČ5\xae\xc1\xf8X\xcf\x19<\x13c\xdc 7M\"\x06\u007f\xb6\xfe\x145\xb8\x81$\x05\xd3\xfaZ\xb5e\xab\x1e\xa6\xed\xae?;&\xdd|\xb0\xd8Y\xba\xdd\xffͭe\xf0\xc0\xd6R\xe7\x8a\xed\xa5t%\x113\xd6\xfc\r\xf0\xf6>\x1fx\x9b\x01\x94\xcd\xc1+\xcf\x17\xe4\x18c\xae\xad\xea\a%\xcd\xc8\x187\xc8M\x93\xa8\xc1G\xb7S\x83i\xd5\xcd\xeakn\xcb\xc6\x04\xa5@yM\xd8{\xee\xa5\xed\xfe[\x945\f\xfe`\xc1ç\xce>\xbfB\xa07;E\xccX\xf37 \xdb[t\xf0p\xc1\xfd\xaaW\xb9\xcd\xc1+\x18\x18`_G\\[\xd5\x0fJ\x9a\x911n\x90\x9b&Q\x83\xaf\xbb\xae\xb3*BI\xa7P\xb6\xec3n\x89\xb1\x97n\x92\x15\a\xf2\u007fB\f>ZD\xdc=ʂ\x83\"f\xac)\r\\K\U00058eab(\xe8ues\b\xf9\aC\xdb\xf2U\xc4L\x8cq\x83\xdc4\x89\x1a,m\u007f6\xc4\xe0\xc0\x96\x8d9\xb9\x9d\xc4\xebG\xb7\xde] \xacgO4\f\xfe\xa2\xf8\xee\x86\xe7\u007f7\xc6\x06\xfc\x88\x19kJ\x03\xd7Òƾ\x83\x8e\xc1\\\xdb \x83CW1͉\x9c\xd9\xe3\x9ch\xa8\x99\xc2T\xcdM#\x06\x9f\xfaN\x88\xc1ʖ\xc9u\xf0\x18\xfeh|XT\xfa\xf8\xa9\x81-\xeb\xfd}\x85\xd6\xc1\u05cf>\xb8VX\xc1nc\x8e\x98\xb1\xa64P\xbb\xeaG\xc7`n\xae\xca\xe0\x19\x18\xe3\x16\xd9`\xd7DC\xcd\x14\xa6jn\x1a1xl\xf1Y\xc5\xe0\xa7\xfd\x06\xcb[\xf6x>]\xf6%\xe1\x8f\xd2\xda*\xb2\r\xf7\xafgKj\x18\xfc\xe1\xe3\xb8\xc1\xf5\x13\xf9t\x03#f\xac)\r\xc2\x18\x1c\xf86\xd35\xf8y\xf9π\xcc\xc0\x18\xb7\xa8\r\x1e\u007f\xa8\x19\xc7\x14\xcdM#\x06K\x0f\xef\xa2\x06\xe7\xe3\xe2c\xac*\xc8`v\xd30X\xf9A\xe9\xadbz\x03\xb9i\xf4\x9cܩ\x9bҹ|j\xf0\xbdE\x87\x0fV\x91~U[v6\xff\xde\x13\xa7\xb6:\a\x88\xa0\x0f\x1e=\xb8\x1eW\t\xefI_\xc8'\x03\xf1G\x91\x9b<(,>\xf8\x1a^\x1b\x8b\x0e\x8a\x98\xb1&7P\xbdM\x8e\xc0\xe6Hc\xef\r\f\xb8\xf6\x0e\f\xdc\fj\xeb\xffA\x11fb\x8c\x1b\xe4\xa6\xd1\xeb\"\xf0\x186VE\xcf-|\xb2%\xbf`\xeb?\t\xc2^\xf5\x96}\xbc5\u007f\xc5\xfd$\x11{\xec\xd9U\xae\xa2\a\x9f_\xe5\xdc\"=,\xd7\xd7x\x90\xe6&O\xdc{\xb0\xd4Y\xbcEξ\x8a\x9c\xb1\xc6\x1a\xa8\xde&\x87\u007fs\x1a\xa4\x0f\xe4U\x1c\rj\xeb\xffAI34\xc6m|\xe7\xe4\xc6\xcd\xf4\xc8M\x8b\x85\x88\x19k\xf1\xfb\x91\x18\xfeަ\x04\x06\x1b\x83\xa3\x0e5\vb\x8a\xe6\xa6\xc5\xc5\xe0\x88\ti\xc0\xa4\x00\xb9i\x12opP|Y\xc0`n\xc5\xd2g\xf7\xafp\x16m'-\xb0\xc1\xe4*N\x17\xf96\x89\x98\x90\x06L\x0e\x90\x9b&\xf1\x06\aŗ\x05\fVV,\x9d[\\q\xf8\xecA\x9a\xa4\x86\r\xc6\xef\x84\xdd&\x1d1!\r\x98\x1c 7MRW\x11\xaa\xf82\u007f\xbf܊\xc7J\xb7\x925\xbfD\xc6]l\xf0\xb3\xae\xd7Xӈ\ti\xc0\xe4\x00\xb9iR\x90\xc1\x0fK\xa1iVʊ\xb1ƿ\v,\xb7\xfd\xe0\xd3\x01U#&\xa4\x01\x93C\xe4\xcc\x1e\xe7DC\xcd\x14\xa6jn\x1aќ$\xf7\x1c\x95\xf8\xb5IJ\xbfʊ\xa5g\x05\xa5\xc4\xdd^T\xb0\xf6~\xf9iĄ4`r\x88l\xb0k\xa2\xa1f\nS57m\x80FݰJV\xd3`e\xc5x\f\xfe0\xb0\xdc\xf6\xa2\x8f?+\x90\x8f\xe1ELH\x03&\x87\xa8\r\x1e\u007f\xa8\x19\xc7T\xcdM[J\xa4\u07fb\x94h\xa7i0\xb7\xe2\x9b\xc5[\xc8{h \x9f\x0fr4\xed\xacS6:bB\x1a0)@n\x1a\xe1\x84\xd0p\xf6\xfb\xe4u~m\\\x16\x1a\xb7b\xe9\x9ck\xddѳ\r\xb8\x0e\xbf>P\x85\xdb\xde\xdc^|\x8e^\xe9\x111!\r\x98\x14 7\x8d5\xa8Z\\E^\xe7\xd7\xc6e\xa1\xf1+\x96\xfe\xf0`iA\xd5)z]\x84 |p\x02?
    +`, + + "codewalk.html": ` + + + + +
    +
    +
    +
    +
    + + Pop Out Code + + +
    +
    + +
    +
    +
    + code on leftright + code width 70% + filepaths shownhidden +
    +
    +
    +
    + {{range .Step}} +
    + +
    {{html .Title}}
    +
    + {{with .Err}} + ERROR LOADING FILE: {{html .}}

    + {{end}} + {{.XML}} +
    +
    {{html .}}
    +
    + {{end}} +
    +
    + previous step + • + next step +
    +
    +
    +`, + + "codewalkdir.html": ` + + +{{range .}} + + {{$name_html := html .Name}} + + + + +{{end}} +
    {{$name_html}} {{html .Title}}
    +`, + + "dirlist.html": ` + +

    + + + + + + + + + + + +{{range .}} + + {{$name_html := fileInfoName . | html}} + + + + + + +{{end}} + +
    File Bytes Modified
    ..
    {{$name_html}}{{html .Size}}{{fileInfoTime . | html}}
    +

    +`, + + "error.html": ` + +

    +{{html .}} +

    +`, + + "example.html": `
    + +
    +

    Example{{example_suffix .Name}}

    + {{with .Doc}}

    {{html .}}

    {{end}} + {{$output := .Output}} + {{with .Play}} +
    +
    +
    {{html $output}}
    +
    + Run + Format + {{if $.Share}} + + {{end}} +
    +
    + {{else}} +

    Code:

    +
    {{.Code}}
    + {{with .Output}} +

    Output:

    +
    {{html .}}
    + {{end}} + {{end}} +
    +
    +`, + + "godoc.html": ` + + + + + +{{with .Tabtitle}} + {{html .}} - The Go Programming Language +{{else}} + The Go Programming Language +{{end}} + +{{if .SearchBox}} + +{{end}} + + + + + +
    +... +
    + +
    + + + +
    + +
    + +
    + +{{if .Playground}} +
    +
    +
    +
    + Run + Format + {{if $.Share}} + + {{end}} +
    +
    +{{end}} + +
    +
    + +{{with .Title}} +

    {{html .}}

    +{{end}} +{{with .Subtitle}} +

    {{html .}}

    +{{end}} + +{{/* The Table of Contents is automatically inserted in this
    . + Do not delete this
    . */}} + + +{{/* Body is HTML-escaped elsewhere */}} +{{printf "%s" .Body}} + + + +
    +
    + + + + + + +{{if .Playground}} + +{{end}} + + + + + +`, + + "godocs.js": `// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* A little code to ease navigation of these documents. + * + * On window load we: + * + Bind search box hint placeholder show/hide events (bindSearchEvents) + * + Generate a table of contents (generateTOC) + * + Bind foldable sections (bindToggles) + * + Bind links to foldable sections (bindToggleLinks) + */ + +(function() { +'use strict'; + +// Mobile-friendly topbar menu +$(function() { + var menu = $('#menu'); + var menuButton = $('#menu-button'); + var menuButtonArrow = $('#menu-button-arrow'); + menuButton.click(function(event) { + menu.toggleClass('menu-visible'); + menuButtonArrow.toggleClass('vertical-flip'); + event.preventDefault(); + return false; + }); +}); + +function bindSearchEvents() { + + var search = $('#search'); + if (search.length === 0) { + return; // no search box + } + + function clearInactive() { + if (search.is('.inactive')) { + search.val(''); + search.removeClass('inactive'); + } + } + + function restoreInactive() { + if (search.val() !== '') { + return; + } + search.val(search.attr('placeholder')); + search.addClass('inactive'); + } + + search.on('focus', clearInactive); + search.on('blur', restoreInactive); + + restoreInactive(); +} + +/* Generates a table of contents: looks for h2 and h3 elements and generates + * links. "Decorates" the element with id=="nav" with this table of contents. + */ +function generateTOC() { + if ($('#manual-nav').length > 0) { + return; + } + + var nav = $('#nav'); + if (nav.length === 0) { + return; + } + + var toc_items = []; + $(nav).nextAll('h2, h3').each(function() { + var node = this; + if (node.id == '') + node.id = 'tmp_' + toc_items.length; + var link = $('').attr('href', '#' + node.id).text($(node).text()); + var item; + if ($(node).is('h2')) { + item = $('
    '); + } else { // h3 + item = $('
    '); + } + item.append(link); + toc_items.push(item); + }); + if (toc_items.length <= 1) { + return; + } + + var dl1 = $('
    '); + var dl2 = $('
    '); + + var split_index = (toc_items.length / 2) + 1; + if (split_index < 8) { + split_index = toc_items.length; + } + for (var i = 0; i < split_index; i++) { + dl1.append(toc_items[i]); + } + for (/* keep using i */; i < toc_items.length; i++) { + dl2.append(toc_items[i]); + } + + var tocTable = $('').appendTo(nav); + var tocBody = $('').appendTo(tocTable); + var tocRow = $('').appendTo(tocBody); + + // 1st column + $(']","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*\s*$/g,bz={option:[1,""],legend:[1,"
    ","
    "],thead:[1,"
    ').appendTo(tocRow).append(dl1); + // 2nd column + $('').appendTo(tocRow).append(dl2); +} + +function bindToggle(el) { + $('.toggleButton', el).click(function() { + if ($(el).is('.toggle')) { + $(el).addClass('toggleVisible').removeClass('toggle'); + } else { + $(el).addClass('toggle').removeClass('toggleVisible'); + } + }); +} +function bindToggles(selector) { + $(selector).each(function(i, el) { + bindToggle(el); + }); +} + +function bindToggleLink(el, prefix) { + $(el).click(function() { + var href = $(el).attr('href'); + var i = href.indexOf('#'+prefix); + if (i < 0) { + return; + } + var id = '#' + prefix + href.slice(i+1+prefix.length); + if ($(id).is('.toggle')) { + $(id).find('.toggleButton').first().click(); + } + }); +} +function bindToggleLinks(selector, prefix) { + $(selector).each(function(i, el) { + bindToggleLink(el, prefix); + }); +} + +function setupDropdownPlayground() { + if (!$('#page').is('.wide')) { + return; // don't show on front page + } + var button = $('#playgroundButton'); + var div = $('#playground'); + var setup = false; + button.toggle(function() { + button.addClass('active'); + div.show(); + if (setup) { + return; + } + setup = true; + playground({ + 'codeEl': $('.code', div), + 'outputEl': $('.output', div), + 'runEl': $('.run', div), + 'fmtEl': $('.fmt', div), + 'shareEl': $('.share', div), + 'shareRedirect': '//play.golang.org/p/' + }); + }, + function() { + button.removeClass('active'); + div.hide(); + }); + button.show(); + $('#menu').css('min-width', '+=60'); +} + +function setupInlinePlayground() { + 'use strict'; + // Set up playground when each element is toggled. + $('div.play').each(function (i, el) { + // Set up playground for this example. + var setup = function() { + var code = $('.code', el); + playground({ + 'codeEl': code, + 'outputEl': $('.output', el), + 'runEl': $('.run', el), + 'fmtEl': $('.fmt', el), + 'shareEl': $('.share', el), + 'shareRedirect': '//play.golang.org/p/' + }); + + // Make the code textarea resize to fit content. + var resize = function() { + code.height(0); + var h = code[0].scrollHeight; + code.height(h+20); // minimize bouncing. + code.closest('.input').height(h); + }; + code.on('keydown', resize); + code.on('keyup', resize); + code.keyup(); // resize now. + }; + + // If example already visible, set up playground now. + if ($(el).is(':visible')) { + setup(); + return; + } + + // Otherwise, set up playground when example is expanded. + var built = false; + $(el).closest('.toggle').click(function() { + // Only set up once. + if (!built) { + setup(); + built = true; + } + }); + }); +} + +// fixFocus tries to put focus to div#page so that keyboard navigation works. +function fixFocus() { + var page = $('div#page'); + var topbar = $('div#topbar'); + page.css('outline', 0); // disable outline when focused + page.attr('tabindex', -1); // and set tabindex so that it is focusable + $(window).resize(function (evt) { + // only focus page when the topbar is at fixed position (that is, it's in + // front of page, and keyboard event will go to the former by default.) + // by focusing page, keyboard event will go to page so that up/down arrow, + // space, etc. will work as expected. + if (topbar.css('position') == "fixed") + page.focus(); + }).resize(); +} + +function toggleHash() { + var hash = $(window.location.hash); + if (hash.is('.toggle')) { + hash.find('.toggleButton').first().click(); + } +} + +function personalizeInstallInstructions() { + var prefix = '?download='; + var s = window.location.search; + if (s.indexOf(prefix) != 0) { + // No 'download' query string; bail. + return; + } + + var filename = s.substr(prefix.length); + var filenameRE = /^go1\.\d+(\.\d+)?([a-z0-9]+)?\.([a-z0-9]+)(-[a-z0-9]+)?(-osx10\.[68])?\.([a-z.]+)$/; + $('.downloadFilename').text(filename); + $('.hideFromDownload').hide(); + var m = filenameRE.exec(filename); + if (!m) { + // Can't interpret file name; bail. + return; + } + + var os = m[3]; + var ext = m[6]; + if (ext != 'tar.gz') { + $('#tarballInstructions').hide(); + } + if (os != 'darwin' || ext != 'pkg') { + $('#darwinPackageInstructions').hide(); + } + if (os != 'windows') { + $('#windowsInstructions').hide(); + $('.testUnix').show(); + $('.testWindows').hide(); + } else { + if (ext != 'msi') { + $('#windowsInstallerInstructions').hide(); + } + if (ext != 'zip') { + $('#windowsZipInstructions').hide(); + } + $('.testUnix').hide(); + $('.testWindows').show(); + } + + var download = "https://storage.googleapis.com/golang/" + filename; + + var message = $('

    '+ + 'Your download should begin shortly. '+ + 'If it does not, click this link.

    '); + message.find('a').attr('href', download); + message.insertAfter('#nav'); + + window.location = download; +} + +$(document).ready(function() { + bindSearchEvents(); + generateTOC(); + bindToggles(".toggle"); + bindToggles(".toggleVisible"); + bindToggleLinks(".exampleLink", "example_"); + bindToggleLinks(".overviewLink", ""); + bindToggleLinks(".examplesLink", ""); + bindToggleLinks(".indexLink", ""); + setupDropdownPlayground(); + setupInlinePlayground(); + fixFocus(); + setupTypeInfo(); + setupCallgraphs(); + toggleHash(); + personalizeInstallInstructions(); + + // godoc.html defines window.initFuncs in the tag, and root.html and + // codewalk.js push their on-page-ready functions to the list. + // We execute those functions here, to avoid loading jQuery until the page + // content is loaded. + for (var i = 0; i < window.initFuncs.length; i++) window.initFuncs[i](); +}); + +// -- analysis --------------------------------------------------------- + +// escapeHTML returns HTML for s, with metacharacters quoted. +// It is safe for use in both elements and attributes +// (unlike the "set innerText, read innerHTML" trick). +function escapeHTML(s) { + return s.replace(/&/g, '&'). + replace(/\"/g, '"'). + replace(/\'/g, '''). + replace(//g, '>'); +} + +// makeAnchor returns HTML for an element, given an anchorJSON object. +function makeAnchor(json) { + var html = escapeHTML(json.Text); + if (json.Href != "") { + html = "" + html + ""; + } + return html; +} + +function showLowFrame(html) { + var lowframe = document.getElementById('lowframe'); + lowframe.style.height = "200px"; + lowframe.innerHTML = "

    " + html + "

    \n" + + "
    " +}; + +document.hideLowFrame = function() { + var lowframe = document.getElementById('lowframe'); + lowframe.style.height = "0px"; +} + +// onClickCallers is the onclick action for the 'func' tokens of a +// function declaration. +document.onClickCallers = function(index) { + var data = document.ANALYSIS_DATA[index] + if (data.Callers.length == 1 && data.Callers[0].Sites.length == 1) { + document.location = data.Callers[0].Sites[0].Href; // jump to sole caller + return; + } + + var html = "Callers of " + escapeHTML(data.Callee) + ":
    \n"; + for (var i = 0; i < data.Callers.length; i++) { + var caller = data.Callers[i]; + html += "" + escapeHTML(caller.Func) + ""; + var sites = caller.Sites; + if (sites != null && sites.length > 0) { + html += " at line "; + for (var j = 0; j < sites.length; j++) { + if (j > 0) { + html += ", "; + } + html += "" + makeAnchor(sites[j]) + ""; + } + } + html += "
    \n"; + } + showLowFrame(html); +}; + +// onClickCallees is the onclick action for the '(' token of a function call. +document.onClickCallees = function(index) { + var data = document.ANALYSIS_DATA[index] + if (data.Callees.length == 1) { + document.location = data.Callees[0].Href; // jump to sole callee + return; + } + + var html = "Callees of this " + escapeHTML(data.Descr) + ":
    \n"; + for (var i = 0; i < data.Callees.length; i++) { + html += "" + makeAnchor(data.Callees[i]) + "
    \n"; + } + showLowFrame(html); +}; + +// onClickTypeInfo is the onclick action for identifiers declaring a named type. +document.onClickTypeInfo = function(index) { + var data = document.ANALYSIS_DATA[index]; + var html = "Type " + data.Name + ": " + + "      (size=" + data.Size + ", align=" + data.Align + ")
    \n"; + html += implementsHTML(data); + html += methodsetHTML(data); + showLowFrame(html); +}; + +// implementsHTML returns HTML for the implements relation of the +// specified TypeInfoJSON value. +function implementsHTML(info) { + var html = ""; + if (info.ImplGroups != null) { + for (var i = 0; i < info.ImplGroups.length; i++) { + var group = info.ImplGroups[i]; + var x = "" + escapeHTML(group.Descr) + " "; + for (var j = 0; j < group.Facts.length; j++) { + var fact = group.Facts[j]; + var y = "" + makeAnchor(fact.Other) + ""; + if (fact.ByKind != null) { + html += escapeHTML(fact.ByKind) + " type " + y + " implements " + x; + } else { + html += x + " implements " + y; + } + html += "
    \n"; + } + } + } + return html; +} + + +// methodsetHTML returns HTML for the methodset of the specified +// TypeInfoJSON value. +function methodsetHTML(info) { + var html = ""; + if (info.Methods != null) { + for (var i = 0; i < info.Methods.length; i++) { + html += "" + makeAnchor(info.Methods[i]) + "
    \n"; + } + } + return html; +} + +// onClickComm is the onclick action for channel "make" and "<-" +// send/receive tokens. +document.onClickComm = function(index) { + var ops = document.ANALYSIS_DATA[index].Ops + if (ops.length == 1) { + document.location = ops[0].Op.Href; // jump to sole element + return; + } + + var html = "Operations on this channel:
    \n"; + for (var i = 0; i < ops.length; i++) { + html += makeAnchor(ops[i].Op) + " by " + escapeHTML(ops[i].Fn) + "
    \n"; + } + if (ops.length == 0) { + html += "(none)
    \n"; + } + showLowFrame(html); +}; + +$(window).load(function() { + // Scroll window so that first selection is visible. + // (This means we don't need to emit id='L%d' spans for each line.) + // TODO(adonovan): ideally, scroll it so that it's under the pointer, + // but I don't know how to get the pointer y coordinate. + var elts = document.getElementsByClassName("selection"); + if (elts.length > 0) { + elts[0].scrollIntoView() + } +}); + +// setupTypeInfo populates the "Implements" and "Method set" toggle for +// each type in the package doc. +function setupTypeInfo() { + for (var i in document.ANALYSIS_DATA) { + var data = document.ANALYSIS_DATA[i]; + + var el = document.getElementById("implements-" + i); + if (el != null) { + // el != null => data is TypeInfoJSON. + if (data.ImplGroups != null) { + el.innerHTML = implementsHTML(data); + el.parentNode.parentNode.style.display = "block"; + } + } + + var el = document.getElementById("methodset-" + i); + if (el != null) { + // el != null => data is TypeInfoJSON. + if (data.Methods != null) { + el.innerHTML = methodsetHTML(data); + el.parentNode.parentNode.style.display = "block"; + } + } + } +} + +function setupCallgraphs() { + if (document.CALLGRAPH == null) { + return + } + document.getElementById("pkg-callgraph").style.display = "block"; + + var treeviews = document.getElementsByClassName("treeview"); + for (var i = 0; i < treeviews.length; i++) { + var tree = treeviews[i]; + if (tree.id == null || tree.id.indexOf("callgraph-") != 0) { + continue; + } + var id = tree.id.substring("callgraph-".length); + $(tree).treeview({collapsed: true, animated: "fast"}); + document.cgAddChildren(tree, tree, [id]); + tree.parentNode.parentNode.style.display = "block"; + } +} + +document.cgAddChildren = function(tree, ul, indices) { + if (indices != null) { + for (var i = 0; i < indices.length; i++) { + var li = cgAddChild(tree, ul, document.CALLGRAPH[indices[i]]); + if (i == indices.length - 1) { + $(li).addClass("last"); + } + } + } + $(tree).treeview({animated: "fast", add: ul}); +} + +// cgAddChild adds an
  • element for document.CALLGRAPH node cgn to +// the parent
      element ul. tree is the tree's root
        element. +function cgAddChild(tree, ul, cgn) { + var li = document.createElement("li"); + ul.appendChild(li); + li.className = "closed"; + + var code = document.createElement("code"); + + if (cgn.Callees != null) { + $(li).addClass("expandable"); + + // Event handlers and innerHTML updates don't play nicely together, + // hence all this explicit DOM manipulation. + var hitarea = document.createElement("div"); + hitarea.className = "hitarea expandable-hitarea"; + li.appendChild(hitarea); + + li.appendChild(code); + + var childUL = document.createElement("ul"); + li.appendChild(childUL); + childUL.setAttribute('style', "display: none;"); + + var onClick = function() { + document.cgAddChildren(tree, childUL, cgn.Callees); + hitarea.removeEventListener('click', onClick) + }; + hitarea.addEventListener('click', onClick); + + } else { + li.appendChild(code); + } + code.innerHTML += " " + makeAnchor(cgn.Func); + return li +} + +})(); +`, + + "images/minus.gif": "GIF89a\t\x00\t\x00\xf7\x00\x00\x00\x00\x00\x80\x80\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\xf9\x04\x01\x00\x00\xff\x00,\x00\x00\x00\x00\t\x00\t\x00\x00\b\"\x00\x03\b\x1cH\xf0\x9f\xc1\x83\xff\x04\"<\xa8pa\xc2\x00\xff\x00H\x94\xf8\xd0aE\x87\r\x17\x12\xdc\x18 \x00;", + + "images/plus.gif": "GIF89a\t\x00\t\x00\xf7\x00\x00\x00\x00\x00\x80\x80\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\xf9\x04\x01\x00\x00\xff\x00,\x00\x00\x00\x00\t\x00\t\x00\x00\b&\x00\x03\b\x1cH\xf0\x9f\xc1\x83\xff\x04\x1e\x04pP\xa1A\x86\x06\x15\x02\x9881a\x80\x85\r/>̈0#A\x82\x01\x01\x00;", + + "images/treeview-black-line.gif": "GIF89a\x10\x00\xf0\x06\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\xf9\x04\x01\x00\x00\xff\x00,\x00\x00\x00\x00\x10\x00\xf0\x06\x00\b\xff\x00\xff\t\x1c\xf8\x0f\x00\xc1\x83\b\r\"\\X\x90\xe1B\x85\x0e\tB\x8c(p\"E\x8b\x111:\xd4\xc8\x10\x80Ǐ\x1f\x1fR\x948r G\x91%\x1b\xa6<\x990\xa5ʒ,\x0f\xc6$\xb9\xd2\xe5L\x936s\xd6\xdc\tSgO\x9e#oV\xf4\x19\x94\xe8E\xa3\x19\x91nTڑ)ʟP\x8b\x02=:5iեW\x9bf}*5*U\xafV\xc1b\x15\xab\x95,\u05ef]Ӣ]\x1bVm[\xb6c\xddƅ[Vn]\xbag\xdfꝻ\xf7n\u07fc|\x03\xfb\x15\fx\xb0\xe1\u0088[nUl\x96\xb1\xdd\xc42\x9d:\xc6;\xf9oe\u0097\x0fg\x86L\xb3q\xe4ş=w~\xbc\xb9thҧ)\xa7\xb6\xbc\x1askͯ9\xe3\x04=Zumַ]熽[\xf6PڳE\aG\xdd\xdbt\xf1\xd8Ƈ\xdbV\x8e\x9b\xb9n缡\xfb~Iܥ\xf5\xebسk\xdfν{\xf4\xdf\xc2\xc1W\xff\x17\xbf\x9c|s\xf3\xcf\xd1\u007f\xa7^\x9e\xfdy\xf7\xe9\xe1\xaf\x17*\u007f:\xfd\xfb\x92\x91\xeb?\xce_zr\xf5\xf6\xe5\xd7\x1f\x80\xff\xd5W ~\xc0\x11\xb8\x9f\u007f\v*8\xa0\x81\rB\xf8 \x82\xe1I\xc8\xe0\x84\x02^\xa8\xa1\x83\x1bZ\xc8\xe1\x87\x1e\x86H\xe1x\"f\b\xe2\x88\xed\xa1\xf8\x9e\x8a\xf1\xb18\x9f\x89%&\x18c\x85.\x06(c\x8d\a\u0088c\x84;bx\xa3\x8e@\xfe($\x8dA\x129$\x89=v\x98\xe4\x89E\"\xd9d\x8aO\xae\x18e\x8bS\xbex$\x94WJ\x99%\x95[Zi\xe4\x97Nvi#\x98X\x92\xa9\xa5\x99\\\xa2\xe9e\x98j\x8e\xc9\xe6\x9be\xc2y\xa6\x9ciҹf\x9cxΙg\x9d{ީ\xe7\x9f|\x02\xeag\xa0\x84\x0ej\xa8\x9b}\"*\xa8\xa2\x852zh\x8ebBڦ\xa4v:j)\xa5\x89b\xba\xa8\xa6\x8dr\xfa(\x8fU^\nj\xa4\xa3NZj\xa5\x9e\x8a꣩\xab\xa2zj\xa6\xafn\xff\x1ak\xa7\xb3~\xda*\xac\xb7ʚ+\xad\xbbڪd\xa8\xa9\x06[\xab\xaa\xbf\x92\xda+\xb1L\x1a[,\xab˺z\xac\xb0\xcf\x0e\vm\xb3\xb8R\xab\xab\xb5\xbcb\xebk\xb2\xccr묶\xc8\xce\xf8\xad\xb7Ւ{\xad\xb9٢\xbb\xad\xb8\xe5\xb2{\xae\xbb\xe9»\xee\x92\xf2\x86K\xef\xbd\xc0J\xabo\xb4\xfc\x82;\xad\xba\xf6\xe6\xdb/\xc0\xff\xd6[0\xbe\xca\x12\xbc\xaf\xbf\v+<\xb0\xc1\rC\xfc0\xc2\xddJ\xcc\xf0\xc4\x02_\xac\xb1\xc3\x1b[\xcc\xf1\xc7\x1e\x87L\xf1\xb8\"g\f\xf2\xc8\xed\xa2\xfc\xae\xca\xf1\xb2<\xaf\xc9%'\x1cs\xc5.\a,s\xcd\aÌs\xc4;c|\xb3\xce@\xff,4\xcdA\x13=4\xc9=w\x9c\xf4\xc9E#\xddt\xcaO\xaf\x1cu\xcbS\xbf|4\xd4WK\x9d5\xd5[[m\xf4\xd7Nwm3\xd8X\x93\xad\xb5\xd9\\\xa3\xedu\xd8j\x8f\xcd\xf6\xdbe\xc3}\xb6\xdciӽv\xdcxϝw\xdd{\xdf\xff\xad\xf7\xdf|\x03\xeew\xe0\x84\x0fn\xb8\xdb}#.\xb8\xe2\x853~x\xcebC\u07b6\xe4v;n9\xe5\x89c\xbe\xb8\xe6\x8ds\xfe8\xcfU_\x0ez\xe4\xa3O^z型\xee\xb3髣~z\xe6\xafo\x1e{\xe7\xb3\u007f\xde:\xec\xb7˞;\xed\xbbۮt\xe8\xa9\a_\xbb꿓\xde;\xf1L\x1b_<\xeb˻~\xbc\xf0\xcf\x0f\x0f}\xf3\xb8S\xaf\xbb\xf5\xbcc\xef{\xf2\xccs\xef\xbc\xf6\xc8\xcf\xfc\xbd\xf7Փ\u007f\xbd\xf9٣\xbf\xbd\xf8\xe5\xb3\u007f\xbe\xfb\xe9ÿ\xfe\xd2\xf2\x87O\xff\xfd\xc0K\xaf\u007f\xf4\xfc\x83?\xbd\xfa\xf6\xcb_\xff\x00\xf8\xbf\xfa\x15\x10\u007f\xca#\xe0\xfe\xfc\xb7@\x05\x0eЀ\r\x84\xe0\x03\x11\xd8=\t2p\x82\x02\xbc\xa0\x06\x1d\xb8A\vr\xf0\x83\x1e\f!\x05\xc7'\xc2\f\x82p\x84\xedC\xe1\xfbT\x18?\x16\xceτ%L`\f+\xe8\xc2\x00ʰ\x86\a\x84!\x0e#\xb8C\f\xdeP\x87@\xfc\xa1\x102i\x18D\"\x0e\x91\x84=\xec`\x12OXD$61\x85O\\a\x14[8\xc5\x17\x1e\x11\x8aW\x94b\x16\xa9\xb8E+\x1a\xf1\x8bN\xec\xa2\ri\b\x12\x90\x04\x04\x00;", + + "images/treeview-black.gif": "GIF89a`\x00\x85\x00\xa1\x01\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff!\xf9\x04\x01\x00\x00\x02\x00,\x00\x00\x00\x00`\x00\x85\x00\x00\x02\xfe\x94\x8f\xa9\xcb\xed\x0fE\x98\xc1ш\xb3ި\xf2\x0f\x86\x9a'\x96\xa6I\x9e\xeaʶ\xee\nIJ\xfc\xd6&\xb0\xe0\xf6\xfe\xe9\x82\xef\xe3\t#\xc0Cp\x88d\xe0f\xcbY\xf2\x89(\x1a\x8eP\xa8\xf4W\xcdNs\xda,\xd3\xd9\xedR\xc3^\xb2yl~\xa2\xd3\xc85[\xe8~\xabRF9\x8f\xbe\xb5o.\x96\tW?R\x12\a\x98\x80Gx\x88\x98\b\xf8E\xa3\xa826\xe8\x88\x01)yBY)\xf8\xe3Ą\xd9\xf3\xd7\tr\t\xea\xa9\x109\x9a\xc3hzڠ\xba\xfa\xd0\xea\xca\x1a{3\x9bY\x1b\x02\xebj\x98\xbb\xba\x1b\xcb\xd7\x00\x1c\xf5k\xdb{{\x8c\x9c\xac\x8cʸ\xac\xf4\xe9<\x9c\x87\x15\x9dp\xc5{\xdaD\xc3Y}]m]7\xfdM\r>>\x95j\x9e\xae\xbe\xceގd\xb8\x0e\xff+\xac@\u007f뛎o\xae?\xce\xef\x8e\x1d+\x15@P\xa2\xc6yKwМ\xb6\x18\x9a\x1aEKh0\x1c\xb9\x88\xa5\xd4\tt\x871\xa3\xc6d\x8d\x06\xe4\xe5\xdb豗\x9f>!O\x95\xfcv\xb2ZJ\x8e,\r\xa2C\b\xed[A\x991\xbb5d\xc8\xedaM\x9d\x15a\xf6T\xf8\xb2\xa5СDG\xadtvtY\xd2J\xf6:\x8cT\xb8q`-\xa9\xb3\xa8\x06\xfc\x17\x94b9\xa8?\xb5J\x83\xca)\xa7\xb3\x996\xbb\xd24\xdb-kѵlۺ}\v7.\x82\x02\x00;", + + "images/treeview-default-line.gif": "GIF89a\x10\x00\xf0\x06\xf7\x00\x00\x00\x00\x00\x80\x80\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\xf9\x04\x01\x00\x00\xff\x00,\x00\x00\x00\x00\x10\x00\xf0\x06\x00\b\xff\x00\xff\t\x1cH\xb0\xa0A\x81\x01\x0e*\\x0!Ç\v\x1dB\x9cHP\"E\x8a\t3\xfe\xd3x\xb1aNj\x16?2\f)R!ɒ\x06O\xa2\xac\xb8rdˈ/M\xc6\xf48\xb3\xa0ʗ7[\xe6\\\xb9\x13eϒ?E\x06\xfd8\xb4cQ\x905m&e\xb9\x14aS\xa7O\x8fb|\xba\x91\xaaԉW!f}\xb8\xd5eT\xab`\xbf\x8am\xda\x15\xe6إee\x9eM\x9a\x96&ٰo\xd7\xd6l\x9b\x12.Z\xbbl\xf1\xce\xd5;\x93\xaeR\xb9}\xf9\xc6\xf4\xcb4\xaeỀ\a\vƹXgc\x9e\x8f}F\x06:Yhe\xa2\x97\xa9j\xde̹3\xd7\xccH\x133\x16\xed\x984dӒQSVm\x995f\xd7FAO\x85\x1d\xfap^ڳm\xefōUvo\xdeZ}\a\a\xfe\x99\xb8W݁\x8d\x9bE\xaeX\xb9Z棡\x97\x96~\x9azj뫱\xb7\xd6\xfe\x9a{l\xe7n\x11{\xff\xaf-\xbe\xfc\xed\xf1\xb9\xcd\xefF\xff\x9b\xfdp\xf7\xc5\xe1\x1fW\x9f\\\xfer\xfa\xcd\xed?\xc7\x1f\x9d\xfft\xff\xd5\x01x\x9d\x80\xd9\x11\xb8\x9d\x81\xdd!\xf8\x9d~ᝧ y\x0eF\xb8ރ\xe9IX\x1f\x85\xeda\xf8\x9e\x86\xf1q8\x9f\x85\xf9yx\x1f\x88\xfd\x91\xf8\x9f\x89\x01\xa28\xa0\x8a\x05\xb2x\xa0\x8b\t¸\xa0\x88\xfb\xc9\b\xe1\x846V\x88\xe3\x8e\x17昡\x8f\x1b\x02١\x90\x1f\xf2\x18\"\x91#\x1aY\xa2\x92'2\x99\xa2\x93+B٢\x94/R\x19\xa3\x953\"Y#\x967\xf6ȥ\x8e^\x86y\xe4\x97?\x92\x19\xa4\x99C\xa2Y\xa4\x98K\xb2٤\x9bO\xc2\x19\xa5\x9cS\xd2Y\xa5\x9dW♥\x9aI\xea\xd9\xe5\x98~\x82\t\xe8\xa0m\x12\xfa\xa6\xa1q\":\xa7\xa2u2z\xa7\xa3yB\xbag\xa0eRz\xa6\xa5ib\xba\xa6\xa4\u007f\x16\xea顟&\x1aꢣ6Z꣧F\x9aꤜ\n\xbaj\xa7\xa0\xc6\xff*\xaa\xac\xa4\xd2j\xaa\xad\xa8⪪\xae\xac\xbe\xea*\xaf\xb0\xce*l\xad\xc3\xdeZl\xae\xc7\xee\x9al\xaf\xc0\xfe\xbal\xb0\xc4Fk\xac\xb4\xc8R\xab\xac\xb5\xcc>\xeb,\xb6\xd0N\xebm\xb5\xdf^\x1bn\xb6\xdcn;n\xb7\xe0\xa6+\xae\xba\xe4\x9ek.\xbb\xe8\xae+o\xbb\xf0\xbe;o\xbc\xf4\xdeko\xbe\xfc\xe2\xeb\xef\xbe\xffVڪ\xc0\xbe\x12ܬ\xc1\xda\"\\\xae\xc2\xee2\\\xaf\xc3\xfaB\xdc/\xc0\x14K\x1c\xf0\xa5\x03c\\\xb0\xc6\as\x9c\xb0\xc7\v\x83ܰ\xc8\x0f\x93\x1c\xb1\xc9\x13[\\1\xca\x17g\x9a\xb1\xcb\x1b\xc3ܱ\xcc\x1f\xd3\x1c\xb2\xcd#\xe3\\\xb2\xce'\xf3\x9c2\xcb+\xfb\xdc\xf2\xa61\x13=\xb3\xd15#}\xb3\xd293\xbd\xb3\xd3=C\xfd\xb3\xd0AK=t\x9f/[]5\xd6Es}\xb4\xd7I\x83\xbd\xb4\xd8M\x93\xfd\xb4\xd9Q\xa3=\xb5\xd6*\xb7\r\xb4\xdbT\xc3\xcd\xf6\xdbt\xc7]\xf7\xdcv\xe7\x8d\xf7\xdej_\xff\xbd\xa5\xa6}o\xfdwց\xcb]\xf8݇\xeb\x9d8߃w\xdd\xf8\u05cf\x87\x1d\xf9ؓ\x97]\xf9ٗ\xa7\x9d\xf9ڋw\xbe\xb9\xdf\r\xf2\xf9\xb9\xe0\xa1\x03>\xba\xe1\xa7#\x9e\xba\xe2\xab3^:\xe1\xad{\xfe\xba\xe3\xb3C^\xbb\xe4\xb7S\x9e\xbb\xe5\xbbc\u07bb\xe6\xbfs\x1e\xfb\xf0\xc1\x83^\x17x\xc73\x98<\x8dœ\xbe\xbc\x96ͣ\x1e\xbd\xeaӳ^\xbd\xebϋ~\xbd\xecٛ\xbe=\xf1\xdd\xc3\xfe\xfd\xf8\xe1\xd3^\xbe\xed\xe7㞾\xee\xeb\xf3\u07be\xef\xef\x03\x1f\xbf\xf0\xe4\xff\xa5\xbc\xfd\xcc\xcfo<\xfe\xd0\xeb\xef<\xff\xda\xf3\x9f\xf4\x04H=\x02Zπ\xd8\x03\xa0\xf7\x10\xc8=\x05\x8a\x8f\x81\xe0s\xa0\xf9$\x88>\n\xaaς\xecà\xfb4\b?\x0e\xcaσ\xf4\x83`\xfd\n\x93?\x10\ue3c4\xfd3\xe1\xffP\x18@\x15\x0eЅ\x05\x84\xe1\x01e\x98@\x16.\x90\x86\r\xb4\xe1\x03q\x18A\x1dNЇ\x15\x04\xe2\x05\xa6\x85\x98A\"nЈ\x1dD\xe2\a\x95\x18B\x1e\x8ep \x84\x81\xa2pf\xc8\xc4\x13J\x11yN\x14\xa1\x16\xb3\xc8\xc5*\xae\xf0\x8a\xf7\xf3\xe2\v\xc5\x18C2R\x11\x8c%4c\rјB5損-tc\x0f\xe1xC9>\x11*a\xa4\xe3\x0e\xed\xb8E>vQ\x8f?\x04d\x10\x059DB\x16ѐGDd\x12\x15\xb9DF6я\x90t\xa4\x15\xf1\x98FI~\x91\x92m\xb4\xe4\x185YFN\x9e\x11\x93q\xf4\xe4\x1aAYGQ\xbe\x91\x94{4\xe5\x1cQ\x19HV\x0eҕ\x85\x84\xe5!e\x99HZ.\xd2)\x1a\xc9H@\x00\x00;", + + "images/treeview-default.gif": "GIF89a`\x00\x85\x00\xa1\x03\x00\x00\x00\x00\x80\x80\x80\xbc\xbc\xbc\xff\xff\xff!\xf9\x04\x01\x00\x00\x03\x00,\x00\x00\x00\x00`\x00\x85\x00\x00\x02\xfe\x9c\x8f\xa9\xcb\xed\x0f\a\x98\xc0ш\xb3ި\xf2\x0f\x86\x9a'\x96\xa6I\x9e\xeaʶ\xee\x1aIJ\xfc\xd6f\xb0\xe0\xf6\xfe\xe9\xd2\xe1\xe3\t#>Rp\x88d\xe0(\x93\x01\ue64c\"\x8a@\xa9uz0^\xb7GCw;\x9c\x89\xc1\xe4\xb2\xd9yN\xab\xa5ߵ\xfb}j\xc3M\x82y\xb2\xae\x90\xdb\x13\x82\xfe\xa3\x8f\xb7\xf7\x11\b\xa2'h@x\xa8\xb8\xc8\xc8&F\xd3(\xf2e\x18\xf90Y\x19r\x89\xd9#\xc1\x84\x06\xb5\x89\xa1\x19\xaa1J*\x9asZ\xfa\x18\xa3\xeajE\xf9*\xeb\x12;k\x1bwې\x98\xfb\x97J\n\xf8\xe7w\xbb\xbbQkG̛\xac\xbc\xfc\xc6\xda\xca\xec\xe5\vM\x15\r\x8df\xa0e\xbd\xe4\te\xbcI}=\x9dU\xa5-\xcd\xec\xecm\xad\xbe\xce\xde\ueb81\xac\x1e\xff\v\xac+l;\x0fM\x9c\xfe\xfb~\xb0\xef/ :u\xa6\x96\x81\xe3\x17\xea \xc1N\x17\xba\x19\x1cWM\x1c6r\x12\x13 \xfc\xe6,\xa0\xc6b\x8d\x1c\xf5i\xcc\xc7\f$\xa6z\xf6DV2\x99\f%/\x95\x1d[\xde\x1aX.\xcfB\x991-.dR\xc1\xa1\xb2\x82;\xcd=\xa49-\xa3ˡD\x8b\x1eb9\xec\xe3\xca{\vH\x1a\x9du\xf1i\xa5\xa8R\x0f\xc1\xac\x88\xa5fV\xac\x14\xcf1l\xa23\x19O\xb1>{\x02='\xb4\xaaڵlۺ}˫\x00\x00;", + + "images/treeview-gray-line.gif": "GIF89a\x10\x00\xf0\x06\xf7\x00\x00\x00\x00\x00\x80\x80\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\xf9\x04\x01\x00\x00\xff\x00,\x00\x00\x00\x00\x10\x00\xf0\x06\x00\b\xff\x00\xff\t\x1c\xf8/\x00\xc1\x83\b\r\"\\X\x90\xe1B\x85\x0e\tB\x8c(p\"E\x8b\x111:\xd4\xc80\x80Ǐ\x1f\x1fR\x948r G\x91%\x1b\xa6<\x990\xa5ʒ,\x0f\xc6$\xb9\xd2\xe5L\x936s\xd6\xdc\tSgO\x9e#oV\xf4\x19\x94\xe8E\xa3\x19\x91nTڑ)ʟP\x8b\x02=:5iեW\x9bf}*5*U\xafV\xc1b\x15\xab\x95,\u05ef]Ӣ]\x1bVm[\xb6c\xddƅ[Vn]\xbag\xdfꝻ\xf7n\u07fc|\x03\xfb\x15\fx\xb0\xe1\u0088[nUl\x96\xb1\xdd\xc42\x9d:\xc6;\xf9oe\u0097\x0fg\x86L\xb3q\xe4ş=w~\xbc\xb9thҧ)\xa7\xb6\xbc\x1askͯ9\xe3\x04=Zumַ]熽[\xf6PڳE\aG\xdd\xdbt\xf1\xd8Ƈ\xdbV\x8e\x9b\xb9n缡\xfb~Iܥ\xf5\xebسk\xdfν{\xf4\xdf\xc2\xc1W\xff\x17\xbf\x9c|s\xf3\xcf\xd1\u007f\xa7^\x9e\xfdy\xf7\xe9\xe1\xaf\x17*\u007f:\xfd\xfb\x92\x91\xeb?\xce_zr\xf5\xf6\xe5\xd7\x1f\x80\xff\xd5W ~\xc0\x11\xb8\x9f\u007f\v*8\xa0\x81\rB\xf8 \x82\xe1I\xc8\xe0\x84\x02^\xa8\xa1\x83\x1bZ\xc8\xe1\x87\x1e\x86H\xe1x\"f\b\xe2\x88\xed\xa1\xf8\x9e\x8a\xf1\xb18\x9f\x89%&\x18c\x85.\x06(c\x8d\a\u0088c\x84;bx\xa3\x8e@\xfe($\x8dA\x129$\x89=v\x98\xe4\x89E\"\xd9d\x8aO\xae\x18e\x8bS\xbex$\x94WJ\x99%\x95[Zi\xe4\x97Nvi#\x98X\x92\xa9\xa5\x99\\\xa2\xe9e\x98j\x8e\xc9\xe6\x9be\xc2y\xa6\x9ciҹf\x9cxΙg\x9d{ީ\xe7\x9f|\x02\xeag\xa0\x84\x0ej\xa8\x9b}\"*\xa8\xa2\x852zh\x8ebBڦ\xa4v:j)\xa5\x89b\xba\xa8\xa6\x8dr\xfa(\x8fU^\nj\xa4\xa3NZj\xa5\x9e\x8a꣩\xab\xa2zj\xa6\xafn\xff\x1ak\xa7\xb3~\xda*\xac\xb7ʚ+\xad\xbbڪd\xa8\xa9\x06[\xab\xaa\xbf\x92\xda+\xb1L\x1a[,\xab˺z\xac\xb0\xcf\x0e\vm\xb3\xb8R\xab\xab\xb5\xbcb\xebk\xb2\xccr묶\xc8\xce\xf8\xad\xb7Ւ{\xad\xb9٢\xbb\xad\xb8\xe5\xb2{\xae\xbb\xe9»\xee\x92\xf2\x86K\xef\xbd\xc0J\xabo\xb4\xfc\x82;\xad\xba\xf6\xe6\xdb/\xc0\xff\xd6[0\xbe\xca\x12\xbc\xaf\xbf\v+<\xb0\xc1\rC\xfc0\xc2\xddJ\xcc\xf0\xc4\x02_\xac\xb1\xc3\x1b[\xcc\xf1\xc7\x1e\x87L\xf1\xb8\"g\f\xf2\xc8\xed\xa2\xfc\xae\xca\xf1\xb2<\xaf\xc9%'\x1cs\xc5.\a,s\xcd\aÌs\xc4;c|\xb3\xce@\xff,4\xcdA\x13=4\xc9=w\x9c\xf4\xc9E#\xddt\xcaO\xaf\x1cu\xcbS\xbf|4\xd4WK\x9d5\xd5[[m\xf4\xd7Nwm3\xd8X\x93\xad\xb5\xd9\\\xa3\xedu\xd8j\x8f\xcd\xf6\xdbe\xc3}\xb6\xdciӽv\xdcxϝw\xdd{\xdf\xff\xad\xf7\xdf|\x03\xeew\xe0\x84\x0fn\xb8\xdb}#.\xb8\xe2\x853~x\xcebC\u07b6\xe4v;n9\xe5\x89c\xbe\xb8\xe6\x8ds\xfe8\xcfU_\x0ez\xe4\xa3O^z型\xee\xb3髣~z\xe6\xafo\x1e{\xe7\xb3\u007f\xde:\xec\xb7˞;\xed\xbbۮt\xe8\xa9\a_\xbb꿓\xde;\xf1L\x1b_<\xeb˻~\xbc\xf0\xcf\x0f\x0f}\xf3\xb8S\xaf\xbb\xf5\xbcc\xef{\xf2\xccs\xef\xbc\xf6\xc8\xcf\xfc\xbd\xf7Փ\u007f\xbd\xf9٣\xbf\xbd\xf8\xe5\xb3\u007f\xbe\xfb\xe9ÿ\xfe\xd2\xf2\x87O\xff\xfd\xc0K\xaf\u007f\xf4\xfc\x83?\xbd\xfa\xf6\xcb_\xff\x00\xf8\xbf\xfa\x15\x10\u007f\xca#\xe0\xfe\xfc\xb7@\x05\x0eЀ\r\x84\xe0\x03\x11\xd8=\t2p\x82\x02\xbc\xa0\x06\x1d\xb8A\vr\xf0\x83\x1e\f!\x05\xc7'\xc2\f\x82p\x84\xedC\xe1\xfbT\x18?\x16\xceτ%L`\f+\xe8\xc2\x00ʰ\x86\a\x84!\x0e#\xb8C\f\xdeP\x87@\xfc\xa1\x102i\x18D\"\x0e\x91\x84=\xec`\x12OXD$61\x85O\\a\x14[8\xc5\x17\x1e\x11\x8aW\x94b\x16\xa9\xb8E+\x1a\xf1\x8bN\xec\xa2\ri\b\x12\x90\x04\x04\x00;", + + "images/treeview-gray.gif": "GIF89a`\x00\x85\x00\xa1\x03\x00\x00\x00\x00\x80\x80\x80\xbc\xbc\xbc\xff\xff\xff!\xf9\x04\x01\x00\x00\x03\x00,\x00\x00\x00\x00`\x00\x85\x00\x00\x02\xfe\x9c\x8f\xa9\xcb\xed\x0f\x87\x98\xc2ш\xb3ި\xf2\x0f\x86\x9a'\x96\xa6I\x9e\xeaʶ\xee\x1aIJ\xfc\xd6f\xb0\xe0\xf6\xfe\xe9\x03p\xf0\xf1\x86\x11\x1f\xd0 $*\x198\x80\xd39\x98%\x97Kc\x90\x8aUX\x91\xd9.W\xeb\xedJg\xe1\xf2\xb4,F\xab\xcfj*\xbb\xad|Ç\xf2\xb9*u\xb5\xef\xf0_\xfdh\xf2p\x01\xe67RRG\x98\xc0\x87\xb8\xc8\xd8H8F\xe3\xa8rv(\x89Aiy\x82\x99i\xf8\xf3\x04$\xc5ٓ#*\xb2Y::\x88\xca\x01\x19\xb3\xda\xf9\xaa\x19+;\v[\x1bRyې{\xab\xc8[\xeb;+\xd80\x8c\xf0K\xa8\xa8q여\xeb\xfc\f\rݺ\xfcz\x1a\xadz\x14u\xcdt\x90M\xbd\xda\xf4\x19E\xb6\xdd\xe7]\x8e\x9d\x87\xaen\xbcn\xdc\xea\x1e/?O_\xef\xd5,\x8f\xffJ\x81_\xec\x1c\x9c\x8fT@U\xee\x00\xdac7oZB\x81\xf1\xb6h\x93\xe7\xf0\x1b\xaapO\xc6E*\x17q\xa1\x81ms\x10\x19\xbaSx0\xa4ȑ$%\x90\xd4W\xf0\x9a?\x05+{\x9d|Y2fL\x90\r=\xae\xb3v\xd3&:\x8aPB\xedԉ\x11\xe86\x9c;\xe1\xc9<\x8a4\xe9*\x94똢sZ\xaa\xe5\x01\xa9\xd7$\xea\xb2z\vk-\xad\xb3\xb8\x96\xa2\xf9QhU\xb1ш\x06\xfd\x04\x8a\\P\x829\xd9\xfet\x8bѨҹt\xebڽ\x8b7\xaf\x82\x02\x00;", + + "implements.html": ` +`, + + "jquery.js": `/*! jQuery v1.8.2 jquery.com | jquery.org/license */ +(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write(""),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.2",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return a!=null?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b
        a",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="
        t
        ",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="
        ",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||p.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e==="inprogress"&&(e=c.shift(),d--),e&&(b==="fx"&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c=0)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c=0)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,d+""),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j=0:p.find(m,this,null,[f]).length),h[m]&&j.push(l);j.length&&u.push({elem:f,matches:j})}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bc(a,b,c,d){c=c||[],b=b||r;var e,f,i,j,k=b.nodeType;if(!a||typeof a!="string")return c;if(k!==1&&k!==9)return[];i=g(b);if(!i&&!d)if(e=P.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)return c;if(f.id===j)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&h(b,f)&&f.id===j)return c.push(f),c}else{if(e[2])return w.apply(c,x.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&_&&b.getElementsByClassName)return w.apply(c,x.call(b.getElementsByClassName(j),0)),c}return bp(a.replace(L,"$1"),b,c,d,i)}function bd(a){return function(b){var c=b.nodeName.toLowerCase();return c==="input"&&b.type===a}}function be(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}}function bf(a){return z(function(b){return b=+b,z(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function bg(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}function bh(a,b){var c,d,f,g,h,i,j,k=C[o][a];if(k)return b?0:k.slice(0);h=a,i=[],j=e.preFilter;while(h){if(!c||(d=M.exec(h)))d&&(h=h.slice(d[0].length)),i.push(f=[]);c=!1;if(d=N.exec(h))f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=d[0].replace(L," ");for(g in e.filter)(d=W[g].exec(h))&&(!j[g]||(d=j[g](d,r,!0)))&&(f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=g,c.matches=d);if(!c)break}return b?h.length:h?bc.error(a):C(a,i).slice(0)}function bi(a,b,d){var e=b.dir,f=d&&b.dir==="parentNode",g=u++;return b.first?function(b,c,d){while(b=b[e])if(f||b.nodeType===1)return a(b,c,d)}:function(b,d,h){if(!h){var i,j=t+" "+g+" ",k=j+c;while(b=b[e])if(f||b.nodeType===1){if((i=b[o])===k)return b.sizset;if(typeof i=="string"&&i.indexOf(j)===0){if(b.sizset)return b}else{b[o]=k;if(a(b,d,h))return b.sizset=!0,b;b.sizset=!1}}}else while(b=b[e])if(f||b.nodeType===1)if(a(b,d,h))return b}}function bj(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function bk(a,b,c,d,e){var f,g=[],h=0,i=a.length,j=b!=null;for(;h-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==l)||((b=c).nodeType?j(a,c,d):k(a,c,d))}];for(;i1&&bj(m),i>1&&a.slice(0,i-1).join("").replace(L,"$1"),c,i0,f=a.length>0,g=function(h,i,j,k,m){var n,o,p,q=[],s=0,u="0",x=h&&[],y=m!=null,z=l,A=h||f&&e.find.TAG("*",m&&i.parentNode||i),B=t+=z==null?1:Math.E;y&&(l=i!==r&&i,c=g.el);for(;(n=A[u])!=null;u++){if(f&&n){for(o=0;p=a[o];o++)if(p(n,i,j)){k.push(n);break}y&&(t=B,c=++g.el)}d&&((n=!p&&n)&&s--,h&&x.push(n))}s+=u;if(d&&u!==s){for(o=0;p=b[o];o++)p(x,q,i,j);if(h){if(s>0)while(u--)!x[u]&&!q[u]&&(q[u]=v.call(k));q=bk(q)}w.apply(k,q),y&&!h&&q.length>0&&s+b.length>1&&bc.uniqueSort(k)}return y&&(t=B,l=z),x};return g.el=0,d?z(g):g}function bo(a,b,c,d){var e=0,f=b.length;for(;e2&&(j=h[0]).type==="ID"&&b.nodeType===9&&!f&&e.relative[h[1].type]){b=e.find.ID(j.matches[0].replace(V,""),b,f)[0];if(!b)return c;a=a.slice(h.shift().length)}for(g=W.POS.test(a)?-1:h.length-1;g>=0;g--){j=h[g];if(e.relative[k=j.type])break;if(l=e.find[k])if(d=l(j.matches[0].replace(V,""),R.test(h[0].type)&&b.parentNode||b,f)){h.splice(g,1),a=d.length&&h.join("");if(!a)return w.apply(c,x.call(d,0)),c;break}}}return i(a,m)(d,b,f,c,R.test(a)),c}function bq(){}var c,d,e,f,g,h,i,j,k,l,m=!0,n="undefined",o=("sizcache"+Math.random()).replace(".",""),q=String,r=a.document,s=r.documentElement,t=0,u=0,v=[].pop,w=[].push,x=[].slice,y=[].indexOf||function(a){var b=0,c=this.length;for(;be.cacheLength&&delete a[b.shift()],a[c]=d},a)},B=A(),C=A(),D=A(),E="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",G=F.replace("w","w#"),H="([*^$|!~]?=)",I="\\["+E+"*("+F+")"+E+"*(?:"+H+E+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+G+")|)|)"+E+"*\\]",J=":("+F+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+I+")|[^:]|\\\\.)*|.*))\\)|)",K=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)",L=new RegExp("^"+E+"+|((?:^|[^\\\\])(?:\\\\.)*)"+E+"+$","g"),M=new RegExp("^"+E+"*,"+E+"*"),N=new RegExp("^"+E+"*([\\x20\\t\\r\\n\\f>+~])"+E+"*"),O=new RegExp(J),P=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,Q=/^:not/,R=/[\x20\t\r\n\f]*[+~]/,S=/:not\($/,T=/h\d/i,U=/input|select|textarea|button/i,V=/\\(?!\\)/g,W={ID:new RegExp("^#("+F+")"),CLASS:new RegExp("^\\.("+F+")"),NAME:new RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:new RegExp("^("+F.replace("w","w*")+")"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+J),POS:new RegExp(K,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i"),needsContext:new RegExp("^"+E+"*[>+~]|"+K,"i")},X=function(a){var b=r.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}},Y=X(function(a){return a.appendChild(r.createComment("")),!a.getElementsByTagName("*").length}),Z=X(function(a){return a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!==n&&a.firstChild.getAttribute("href")==="#"}),$=X(function(a){a.innerHTML="";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),_=X(function(a){return a.innerHTML="",!a.getElementsByClassName||!a.getElementsByClassName("e").length?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length===2)}),ba=X(function(a){a.id=o+0,a.innerHTML="
        ",s.insertBefore(a,s.firstChild);var b=r.getElementsByName&&r.getElementsByName(o).length===2+r.getElementsByName(o+0).length;return d=!r.getElementById(o),s.removeChild(a),b});try{x.call(s.childNodes,0)[0].nodeType}catch(bb){x=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}bc.matches=function(a,b){return bc(a,null,null,b)},bc.matchesSelector=function(a,b){return bc(b,null,null,[a]).length>0},f=bc.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=f(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=f(b);return c},g=bc.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},h=bc.contains=s.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:s.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc.attr=function(a,b){var c,d=g(a);return d||(b=b.toLowerCase()),(c=e.attrHandle[b])?c(a):d||$?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},e=bc.selectors={cacheLength:50,createPseudo:z,match:W,attrHandle:Z?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},find:{ID:d?function(a,b,c){if(typeof b.getElementById!==n&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==n&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==n&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:Y?function(a,b){if(typeof b.getElementsByTagName!==n)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c},NAME:ba&&function(a,b){if(typeof b.getElementsByName!==n)return b.getElementsByName(name)},CLASS:_&&function(a,b,c){if(typeof b.getElementsByClassName!==n&&!c)return b.getElementsByClassName(a)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(V,""),a[3]=(a[4]||a[5]||"").replace(V,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||bc.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&bc.error(a[0]),a},PSEUDO:function(a){var b,c;if(W.CHILD.test(a[0]))return null;if(a[3])a[2]=a[3];else if(b=a[4])O.test(b)&&(c=bh(b,!0))&&(c=b.indexOf(")",b.length-c)-b.length)&&(b=b.slice(0,c),a[0]=a[0].slice(0,c)),a[2]=b;return a.slice(0,3)}},filter:{ID:d?function(a){return a=a.replace(V,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(V,""),function(b){var c=typeof b.getAttributeNode!==n&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(V,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=B[o][a];return b||(b=B(a,new RegExp("(^|"+E+")"+a+"("+E+"|$)"))),function(a){return b.test(a.className||typeof a.getAttribute!==n&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return function(d,e){var f=bc.attr(d,a);return f==null?b==="!=":b?(f+="",b==="="?f===c:b==="!="?f!==c:b==="^="?c&&f.indexOf(c)===0:b==="*="?c&&f.indexOf(c)>-1:b==="$="?c&&f.substr(f.length-c.length)===c:b==="~="?(" "+f+" ").indexOf(c)>-1:b==="|="?f===c||f.substr(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d){return a==="nth"?function(a){var b,e,f=a.parentNode;if(c===1&&d===0)return!0;if(f){e=0;for(b=f.firstChild;b;b=b.nextSibling)if(b.nodeType===1){e++;if(a===b)break}}return e-=d,e===c||e%c===0&&e/c>=0}:function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b){var c,d=e.pseudos[a]||e.setFilters[a.toLowerCase()]||bc.error("unsupported pseudo: "+a);return d[o]?d(b):d.length>1?(c=[a,a,"",b],e.setFilters.hasOwnProperty(a.toLowerCase())?z(function(a,c){var e,f=d(a,b),g=f.length;while(g--)e=y.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:z(function(a){var b=[],c=[],d=i(a.replace(L,"$1"));return d[o]?z(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)if(f=g[h])a[h]=!(b[h]=f)}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:z(function(a){return function(b){return bc(a,b).length>0}}),contains:z(function(a){return function(b){return(b.textContent||b.innerText||f(b)).indexOf(a)>-1}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!e.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},header:function(a){return T.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:bd("radio"),checkbox:bd("checkbox"),file:bd("file"),password:bd("password"),image:bd("image"),submit:be("submit"),reset:be("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return U.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement},first:bf(function(a,b,c){return[0]}),last:bf(function(a,b,c){return[b-1]}),eq:bf(function(a,b,c){return[c<0?c+b:c]}),even:bf(function(a,b,c){for(var d=0;d=0;)a.push(d);return a}),gt:bf(function(a,b,c){for(var d=c<0?c+b:c;++d",a.querySelectorAll("[selected]").length||e.push("\\["+E+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),X(function(a){a.innerHTML="

        ",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+E+"*(?:\"\"|'')"),a.innerHTML="",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=new RegExp(e.join("|")),bp=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a))){var i,j,k=!0,l=o,m=d,n=d.nodeType===9&&a;if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){i=bh(a),(k=d.getAttribute("id"))?l=k.replace(c,"\\$&"):d.setAttribute("id",l),l="[id='"+l+"'] ",j=i.length;while(j--)i[j]=l+i[j].join("");m=R.test(a)&&d.parentNode||d,n=i.join(",")}if(n)try{return w.apply(f,x.call(m.querySelectorAll(n),0)),f}catch(p){}finally{k||d.removeAttribute("id")}}return b(a,d,f,g,h)},h&&(X(function(b){a=h.call(b,"div");try{h.call(b,"[test!='']:sizzle"),f.push("!=",J)}catch(c){}}),f=new RegExp(f.join("|")),bc.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!g(b)&&!f.test(c)&&(!e||!e.test(c)))try{var i=h.call(b,c);if(i||a||b.document&&b.document.nodeType!==11)return i}catch(j){}return bc(c,null,null,[b]).length>0})}(),e.pseudos.nth=e.pseudos.eq,e.filters=bq.prototype=e.pseudos,e.setFilters=new bq,bc.attr=p.attr,p.find=bc,p.expr=bc.selectors,p.expr[":"]=p.expr.pseudos,p.unique=bc.uniqueSort,p.text=bc.getText,p.isXMLDoc=bc.isXML,p.contains=bc.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b0)for(e=d;e=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/
  • ","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X
    ","
    "]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1>");try{for(;d1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(f=0;(h=a[f])!=null;f++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement("div"),s.appendChild(l),h=h.replace(bo,"<$1>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]===""&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],"tbody")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new RegExp("^("+q+")(.*)$","i"),bQ=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bR=new RegExp("^([-+])=("+q+")","i"),bS={},bT={position:"absolute",visibility:"hidden",display:"block"},bU={letterSpacing:0,fontWeight:400},bV=["Top","Right","Bottom","Left"],bW=["Webkit","O","Moz","ms"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return b$(this,!0)},hide:function(){return b$(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(b,c){var d,e,f,g,h=a.getComputedStyle(b,null),i=b.style;return h&&(d=h[c],d===""&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth===0&&bN.test(bH(a,"display"))?p.swap(a,bT,function(){return cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bQ.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var cd=/%20/g,ce=/\[\]$/,cf=/\r?\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,"\r\n")}}):{name:b.name,value:c.replace(cf,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ci(d,a[d],c,f);return e.join("&").replace(cd,"+")};var cj,ck,cl=/#.*$/,cm=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\/\//,cq=/\?/,cr=/)<[^<]*)*<\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=["*/"]+["*"];try{ck=f.href}catch(cy){ck=e.createElement("a"),ck.href="",ck=ck.href}cj=ct.exec(ck.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&cu)return cu.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("
    ").append(a.replace(cr,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:ck,isLocal:cn.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cx},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=(c||y)+"",k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(cl,"").replace(cp,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase())||!1,l.crossDomain=i&&i.join(":")+(i[3]?"":i[1]==="http:"?80:443)!==cj.join(":")+(cj[3]?"":cj[1]==="http:"?80:443)),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cs,"$1_="+z);l.url=A+(A===l.url?(cq.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cx+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cE=[],cF=/\?/,cG=/(=)\?(?=&|$)|\?\?/,cH=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cE.pop()||p.expando+"_"+cH++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cG.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,"$1"+f):m?c.data=i.replace(cG,"$1"+f):k&&(c.url+=(cF.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cI,cJ=a.ActiveXObject?function(){for(var a in cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cJ&&delete cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cR=/queueHooks$/,cS=[cY],cT={"*":[function(a,b){var c,d,e=this.createTween(a,b),f=cQ.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){c=+f[2],d=f[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&h){h=p.css(e.elem,a,!0)||c||1;do i=i||".5",h=h/i,p.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&i!==1&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return e}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c_.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=da(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window);`, + + "jquery.treeview.css": `/* https://github.com/jzaefferer/jquery-treeview/blob/master/jquery.treeview.css */ +/* License: MIT. */ +.treeview, .treeview ul { + padding: 0; + margin: 0; + list-style: none; +} + +.treeview ul { + background-color: white; + margin-top: 4px; +} + +.treeview .hitarea { + background: url(images/treeview-default.gif) -64px -25px no-repeat; + height: 16px; + width: 16px; + margin-left: -16px; + float: left; + cursor: pointer; +} +/* fix for IE6 */ +* html .hitarea { + display: inline; + float:none; +} + +.treeview li { + margin: 0; + padding: 3px 0pt 3px 16px; +} + +.treeview a.selected { + background-color: #eee; +} + +#treecontrol { margin: 1em 0; display: none; } + +.treeview .hover { color: red; cursor: pointer; } + +.treeview li { background: url(images/treeview-default-line.gif) 0 0 no-repeat; } +.treeview li.collapsable, .treeview li.expandable { background-position: 0 -176px; } + +.treeview .expandable-hitarea { background-position: -80px -3px; } + +.treeview li.last { background-position: 0 -1766px } +.treeview li.lastCollapsable, .treeview li.lastExpandable { background-image: url(images/treeview-default.gif); } +.treeview li.lastCollapsable { background-position: 0 -111px } +.treeview li.lastExpandable { background-position: -32px -67px } + +.treeview div.lastCollapsable-hitarea, .treeview div.lastExpandable-hitarea { background-position: 0; } + +.treeview-red li { background-image: url(images/treeview-red-line.gif); } +.treeview-red .hitarea, .treeview-red li.lastCollapsable, .treeview-red li.lastExpandable { background-image: url(images/treeview-red.gif); } + +.treeview-black li { background-image: url(images/treeview-black-line.gif); } +.treeview-black .hitarea, .treeview-black li.lastCollapsable, .treeview-black li.lastExpandable { background-image: url(images/treeview-black.gif); } + +.treeview-gray li { background-image: url(images/treeview-gray-line.gif); } +.treeview-gray .hitarea, .treeview-gray li.lastCollapsable, .treeview-gray li.lastExpandable { background-image: url(images/treeview-gray.gif); } + +.treeview-famfamfam li { background-image: url(images/treeview-famfamfam-line.gif); } +.treeview-famfamfam .hitarea, .treeview-famfamfam li.lastCollapsable, .treeview-famfamfam li.lastExpandable { background-image: url(images/treeview-famfamfam.gif); } + +.treeview .placeholder { + background: url(images/ajax-loader.gif) 0 0 no-repeat; + height: 16px; + width: 16px; + display: block; +} + +.filetree li { padding: 3px 0 2px 16px; } +.filetree span.folder, .filetree span.file { padding: 1px 0 1px 16px; display: block; } +.filetree span.folder { background: url(images/folder.gif) 0 0 no-repeat; } +.filetree li.expandable span.folder { background: url(images/folder-closed.gif) 0 0 no-repeat; } +.filetree span.file { background: url(images/file.gif) 0 0 no-repeat; } +`, + + "jquery.treeview.edit.js": `/* https://github.com/jzaefferer/jquery-treeview/blob/master/jquery.treeview.edit.js */ +/* License: MIT. */ +(function($) { + var CLASSES = $.treeview.classes; + var proxied = $.fn.treeview; + $.fn.treeview = function(settings) { + settings = $.extend({}, settings); + if (settings.add) { + return this.trigger("add", [settings.add]); + } + if (settings.remove) { + return this.trigger("remove", [settings.remove]); + } + return proxied.apply(this, arguments).bind("add", function(event, branches) { + $(branches).prev() + .removeClass(CLASSES.last) + .removeClass(CLASSES.lastCollapsable) + .removeClass(CLASSES.lastExpandable) + .find(">.hitarea") + .removeClass(CLASSES.lastCollapsableHitarea) + .removeClass(CLASSES.lastExpandableHitarea); + $(branches).find("li").andSelf().prepareBranches(settings).applyClasses(settings, $(this).data("toggler")); + }).bind("remove", function(event, branches) { + var prev = $(branches).prev(); + var parent = $(branches).parent(); + $(branches).remove(); + prev.filter(":last-child").addClass(CLASSES.last) + .filter("." + CLASSES.expandable).replaceClass(CLASSES.last, CLASSES.lastExpandable).end() + .find(">.hitarea").replaceClass(CLASSES.expandableHitarea, CLASSES.lastExpandableHitarea).end() + .filter("." + CLASSES.collapsable).replaceClass(CLASSES.last, CLASSES.lastCollapsable).end() + .find(">.hitarea").replaceClass(CLASSES.collapsableHitarea, CLASSES.lastCollapsableHitarea); + if (parent.is(":not(:has(>))") && parent[0] != this) { + parent.parent().removeClass(CLASSES.collapsable).removeClass(CLASSES.expandable) + parent.siblings(".hitarea").andSelf().remove(); + } + }); + }; + +})(jQuery); +`, + + "jquery.treeview.js": `/* + * Treeview 1.4.1 - jQuery plugin to hide and show branches of a tree + * + * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/ + * http://docs.jquery.com/Plugins/Treeview + * + * Copyright (c) 2007 Jörn Zaefferer + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * Revision: $Id: jquery.treeview.js 5759 2008-07-01 07:50:28Z joern.zaefferer $ + * + */ + +;(function($) { + + // TODO rewrite as a widget, removing all the extra plugins + $.extend($.fn, { + swapClass: function(c1, c2) { + var c1Elements = this.filter('.' + c1); + this.filter('.' + c2).removeClass(c2).addClass(c1); + c1Elements.removeClass(c1).addClass(c2); + return this; + }, + replaceClass: function(c1, c2) { + return this.filter('.' + c1).removeClass(c1).addClass(c2).end(); + }, + hoverClass: function(className) { + className = className || "hover"; + return this.hover(function() { + $(this).addClass(className); + }, function() { + $(this).removeClass(className); + }); + }, + heightToggle: function(animated, callback) { + animated ? + this.animate({ height: "toggle" }, animated, callback) : + this.each(function(){ + jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ](); + if(callback) + callback.apply(this, arguments); + }); + }, + heightHide: function(animated, callback) { + if (animated) { + this.animate({ height: "hide" }, animated, callback); + } else { + this.hide(); + if (callback) + this.each(callback); + } + }, + prepareBranches: function(settings) { + if (!settings.prerendered) { + // mark last tree items + this.filter(":last-child:not(ul)").addClass(CLASSES.last); + // collapse whole tree, or only those marked as closed, anyway except those marked as open + this.filter((settings.collapsed ? "" : "." + CLASSES.closed) + ":not(." + CLASSES.open + ")").find(">ul").hide(); + } + // return all items with sublists + return this.filter(":has(>ul)"); + }, + applyClasses: function(settings, toggler) { + // TODO use event delegation + this.filter(":has(>ul):not(:has(>a))").find(">span").unbind("click.treeview").bind("click.treeview", function(event) { + // don't handle click events on children, eg. checkboxes + if ( this == event.target ) + toggler.apply($(this).next()); + }).add( $("a", this) ).hoverClass(); + + if (!settings.prerendered) { + // handle closed ones first + this.filter(":has(>ul:hidden)") + .addClass(CLASSES.expandable) + .replaceClass(CLASSES.last, CLASSES.lastExpandable); + + // handle open ones + this.not(":has(>ul:hidden)") + .addClass(CLASSES.collapsable) + .replaceClass(CLASSES.last, CLASSES.lastCollapsable); + + // create hitarea if not present + var hitarea = this.find("div." + CLASSES.hitarea); + if (!hitarea.length) + hitarea = this.prepend("
    ").find("div." + CLASSES.hitarea); + hitarea.removeClass().addClass(CLASSES.hitarea).each(function() { + var classes = ""; + $.each($(this).parent().attr("class").split(" "), function() { + classes += this + "-hitarea "; + }); + $(this).addClass( classes ); + }) + } + + // apply event to hitarea + this.find("div." + CLASSES.hitarea).click( toggler ); + }, + treeview: function(settings) { + + settings = $.extend({ + cookieId: "treeview" + }, settings); + + if ( settings.toggle ) { + var callback = settings.toggle; + settings.toggle = function() { + return callback.apply($(this).parent()[0], arguments); + }; + } + + // factory for treecontroller + function treeController(tree, control) { + // factory for click handlers + function handler(filter) { + return function() { + // reuse toggle event handler, applying the elements to toggle + // start searching for all hitareas + toggler.apply( $("div." + CLASSES.hitarea, tree).filter(function() { + // for plain toggle, no filter is provided, otherwise we need to check the parent element + return filter ? $(this).parent("." + filter).length : true; + }) ); + return false; + }; + } + // click on first element to collapse tree + $("a:eq(0)", control).click( handler(CLASSES.collapsable) ); + // click on second to expand tree + $("a:eq(1)", control).click( handler(CLASSES.expandable) ); + // click on third to toggle tree + $("a:eq(2)", control).click( handler() ); + } + + // handle toggle event + function toggler() { + $(this) + .parent() + // swap classes for hitarea + .find(">.hitarea") + .swapClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea ) + .swapClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea ) + .end() + // swap classes for parent li + .swapClass( CLASSES.collapsable, CLASSES.expandable ) + .swapClass( CLASSES.lastCollapsable, CLASSES.lastExpandable ) + // find child lists + .find( ">ul" ) + // toggle them + .heightToggle( settings.animated, settings.toggle ); + if ( settings.unique ) { + $(this).parent() + .siblings() + // swap classes for hitarea + .find(">.hitarea") + .replaceClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea ) + .replaceClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea ) + .end() + .replaceClass( CLASSES.collapsable, CLASSES.expandable ) + .replaceClass( CLASSES.lastCollapsable, CLASSES.lastExpandable ) + .find( ">ul" ) + .heightHide( settings.animated, settings.toggle ); + } + } + this.data("toggler", toggler); + + function serialize() { + function binary(arg) { + return arg ? 1 : 0; + } + var data = []; + branches.each(function(i, e) { + data[i] = $(e).is(":has(>ul:visible)") ? 1 : 0; + }); + $.cookie(settings.cookieId, data.join(""), settings.cookieOptions ); + } + + function deserialize() { + var stored = $.cookie(settings.cookieId); + if ( stored ) { + var data = stored.split(""); + branches.each(function(i, e) { + $(e).find(">ul")[ parseInt(data[i]) ? "show" : "hide" ](); + }); + } + } + + // add treeview class to activate styles + this.addClass("treeview"); + + // prepare branches and find all tree items with child lists + var branches = this.find("li").prepareBranches(settings); + + switch(settings.persist) { + case "cookie": + var toggleCallback = settings.toggle; + settings.toggle = function() { + serialize(); + if (toggleCallback) { + toggleCallback.apply(this, arguments); + } + }; + deserialize(); + break; + case "location": + var current = this.find("a").filter(function() { + return this.href.toLowerCase() == location.href.toLowerCase(); + }); + if ( current.length ) { + // TODO update the open/closed classes + var items = current.addClass("selected").parents("ul, li").add( current.next() ).show(); + if (settings.prerendered) { + // if prerendered is on, replicate the basic class swapping + items.filter("li") + .swapClass( CLASSES.collapsable, CLASSES.expandable ) + .swapClass( CLASSES.lastCollapsable, CLASSES.lastExpandable ) + .find(">.hitarea") + .swapClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea ) + .swapClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea ); + } + } + break; + } + + branches.applyClasses(settings, toggler); + + // if control option is set, create the treecontroller and show it + if ( settings.control ) { + treeController(this, settings.control); + $(settings.control).show(); + } + + return this; + } + }); + + // classes used by the plugin + // need to be styled via external stylesheet, see first example + $.treeview = {}; + var CLASSES = ($.treeview.classes = { + open: "open", + closed: "closed", + expandable: "expandable", + expandableHitarea: "expandable-hitarea", + lastExpandableHitarea: "lastExpandable-hitarea", + collapsable: "collapsable", + collapsableHitarea: "collapsable-hitarea", + lastCollapsableHitarea: "lastCollapsable-hitarea", + lastCollapsable: "lastCollapsable", + lastExpandable: "lastExpandable", + last: "last", + hitarea: "hitarea" + }); + +})(jQuery); +`, + + "methodset.html": ` +`, + + "opensearch.xml": ` + + godoc + The Go Programming Language + go golang + + + /favicon.ico + UTF-8 + UTF-8 + +`, + + "package.html": ` + +{{with .PDoc}} + + + {{if $.IsMain}} + {{/* command documentation */}} + {{comment_html .Doc}} + {{else}} + {{/* package documentation */}} +
    +
    +
    import "{{html .ImportPath}}"
    +
    +
    +
    Overview
    +
    Index
    + {{if $.Examples}} +
    Examples
    + {{end}} + {{if $.Dirs}} +
    Subdirectories
    + {{end}} +
    +
    + +
    + +
    +

    Overview ▾

    + {{comment_html .Doc}} +
    +
    + {{example_html $ ""}} + +
    + +
    +

    Index ▾

    + + +
    +
    + {{if .Consts}} +
    Constants
    + {{end}} + {{if .Vars}} +
    Variables
    + {{end}} + {{range .Funcs}} + {{$name_html := html .Name}} +
    {{node_html $ .Decl false | sanitize}}
    + {{end}} + {{range .Types}} + {{$tname_html := html .Name}} +
    type {{$tname_html}}
    + {{range .Funcs}} + {{$name_html := html .Name}} +
        {{node_html $ .Decl false | sanitize}}
    + {{end}} + {{range .Methods}} + {{$name_html := html .Name}} +
        {{node_html $ .Decl false | sanitize}}
    + {{end}} + {{end}} + {{if $.Notes}} + {{range $marker, $item := $.Notes}} +
    {{noteTitle $marker | html}}s
    + {{end}} + {{end}} +
    +
    + + {{if $.Examples}} +
    +

    Examples

    +
    + {{range $.Examples}} +
    {{example_name .Name}}
    + {{end}} +
    +
    + {{end}} + + {{with .Filenames}} +

    Package files

    +

    + + {{range .}} + {{.|filename|html}} + {{end}} + +

    + {{end}} +
    +
    + + + + {{with .Consts}} +

    Constants

    + {{range .}} +
    {{node_html $ .Decl true}}
    + {{comment_html .Doc}} + {{end}} + {{end}} + {{with .Vars}} +

    Variables

    + {{range .}} +
    {{node_html $ .Decl true}}
    + {{comment_html .Doc}} + {{end}} + {{end}} + {{range .Funcs}} + {{/* Name is a string - no need for FSet */}} + {{$name_html := html .Name}} +

    func {{$name_html}}

    +
    {{node_html $ .Decl true}}
    + {{comment_html .Doc}} + {{example_html $ .Name}} + {{callgraph_html $ "" .Name}} + + {{end}} + {{range .Types}} + {{$tname := .Name}} + {{$tname_html := html .Name}} +

    type {{$tname_html}}

    +
    {{node_html $ .Decl true}}
    + {{comment_html .Doc}} + + {{range .Consts}} +
    {{node_html $ .Decl true}}
    + {{comment_html .Doc}} + {{end}} + + {{range .Vars}} +
    {{node_html $ .Decl true}}
    + {{comment_html .Doc}} + {{end}} + + {{example_html $ $tname}} + {{implements_html $ $tname}} + {{methodset_html $ $tname}} + + {{range .Funcs}} + {{$name_html := html .Name}} +

    func {{$name_html}}

    +
    {{node_html $ .Decl true}}
    + {{comment_html .Doc}} + {{example_html $ .Name}} + {{callgraph_html $ "" .Name}} + {{end}} + + {{range .Methods}} + {{$name_html := html .Name}} +

    func ({{html .Recv}}) {{$name_html}}

    +
    {{node_html $ .Decl true}}
    + {{comment_html .Doc}} + {{$name := printf "%s_%s" $tname .Name}} + {{example_html $ $name}} + {{callgraph_html $ .Recv .Name}} + {{end}} + {{end}} + {{end}} + + {{with $.Notes}} + {{range $marker, $content := .}} +

    {{noteTitle $marker | html}}s

    +
      + {{range .}} +
    • {{html .Body}}
    • + {{end}} +
    + {{end}} + {{end}} +{{end}} + +{{with .PAst}} + {{range $filename, $ast := .}} + {{$filename|filename|html}}:
    {{node_html $ $ast false}}
    + {{end}} +{{end}} + +{{with .Dirs}} + {{/* DirList entries are numbers and strings - no need for FSet */}} + {{if $.PDoc}} +

    Subdirectories

    + {{end}} + {{if eq $.Dirname "/src"}} + +

    Standard library

    + + {{end}} + + +
    +
    + + + + + + {{if not (or (eq $.Dirname "/src") (eq $.Dirname "/src/cmd") $.DirFlat)}} + + + + {{end}} + + {{range .List}} + {{if $.DirFlat}} + {{if .HasPkg}} + + + + + {{end}} + {{else}} + + + + + {{end}} + {{end}} +
    NameSynopsis
    ..
    + {{html .Path}} + + {{html .Synopsis}} +
    + {{html .Name}} + + {{html .Synopsis}} +
    +
    + + + {{if eq $.Dirname "/src"}} +

    Other packages

    + +

    Sub-repositories

    +

    + These packages are part of the Go Project but outside the main Go tree. + They are developed under looser compatibility requirements than the Go core. + Install them with "go get". +

    +
      +
    • benchmarks — benchmarks to measure Go as it is developed.
    • +
    • blogblog.golang.org's implementation.
    • +
    • buildbuild.golang.org's implementation.
    • +
    • crypto — additional cryptography packages.
    • +
    • debug — an experimental debugger for Go.
    • +
    • image — additional imaging packages.
    • +
    • mobile — experimental support for Go on mobile platforms.
    • +
    • net — additional networking packages.
    • +
    • sys — packages for making system calls.
    • +
    • text — packages for working with text.
    • +
    • tools — godoc, goimports, gorename, and other tools.
    • +
    • tourtour.golang.org's implementation.
    • +
    • exp — experimental and deprecated packages (handle with care; may change without warning).
    • +
    + +

    Community

    +

    + These services can help you find Open Source packages provided by the community. +

    + + {{end}} +{{end}} +`, + + "package.txt": `{{$info := .}}{{$filtered := .IsFiltered}}{{/* + +--------------------------------------- + +*/}}{{if $filtered}}{{range .PAst}}{{range .Decls}}{{node $info .}} + +{{end}}{{end}}{{else}}{{with .PAst}}{{range $filename, $ast := .}}{{$filename}}: +{{node $ $ast}}{{end}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if and $filtered (not (or .PDoc .PAst))}}No match found. +{{end}}{{with .PDoc}}{{if $.IsMain}}COMMAND DOCUMENTATION + +{{comment_text .Doc " " "\t"}} +{{else}}{{if not $filtered}}PACKAGE DOCUMENTATION + +package {{.Name}} + import "{{.ImportPath}}" + +{{comment_text .Doc " " "\t"}} +{{example_text $ "" " "}}{{end}}{{/* + +--------------------------------------- + +*/}}{{with .Consts}}{{if not $filtered}}CONSTANTS + +{{end}}{{range .}}{{node $ .Decl}} +{{comment_text .Doc " " "\t"}} +{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{with .Vars}}{{if not $filtered}}VARIABLES + +{{end}}{{range .}}{{node $ .Decl}} +{{comment_text .Doc " " "\t"}} +{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{with .Funcs}}{{if not $filtered}}FUNCTIONS + +{{end}}{{range .}}{{node $ .Decl}} +{{comment_text .Doc " " "\t"}} +{{example_text $ .Name " "}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{with .Types}}{{if not $filtered}}TYPES + +{{end}}{{range .}}{{$tname := .Name}}{{node $ .Decl}} +{{comment_text .Doc " " "\t"}} +{{/* + +--------------------------------------- + +*/}}{{if .Consts}}{{range .Consts}}{{node $ .Decl}} +{{comment_text .Doc " " "\t"}} +{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if .Vars}}{{range .Vars}}{{node $ .Decl}} +{{comment_text .Doc " " "\t"}} +{{range $name := .Names}}{{example_text $ $name " "}}{{end}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if .Funcs}}{{range .Funcs}}{{node $ .Decl}} +{{comment_text .Doc " " "\t"}} +{{example_text $ .Name " "}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if .Methods}}{{range .Methods}}{{node $ .Decl}} +{{comment_text .Doc " " "\t"}} +{{$name := printf "%s_%s" $tname .Name}}{{example_text $ $name " "}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if and $filtered (not (or .Consts (or .Vars (or .Funcs .Types))))}}No match found. +{{end}}{{/* + +--------------------------------------- + +*/}}{{end}}{{/* + +--------------------------------------- + +*/}}{{with $.Notes}} +{{range $marker, $content := .}} +{{$marker}}S + +{{range $content}}{{comment_text .Body " " "\t"}} +{{end}}{{end}}{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{if not $filtered}}{{with .Dirs}}SUBDIRECTORIES +{{if $.DirFlat}}{{range .List}}{{if .HasPkg}} + {{.Path}}{{end}}{{end}} +{{else}}{{range .List}} + {{repeat ` + "`" + `. ` + "`" + ` .Depth}}{{.Name}}{{end}} +{{end}}{{end}}{{/* + +--------------------------------------- + +*/}}{{end}}{{/* +Make sure there is no newline at the end of this file. +perl -i -pe 'chomp if eof' package.txt +*/}} +`, + + "play.js": `// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +function initPlayground(transport) { + "use strict"; + + function text(node) { + var s = ""; + for (var i = 0; i < node.childNodes.length; i++) { + var n = node.childNodes[i]; + if (n.nodeType === 1) { + if (n.tagName === "BUTTON") continue + if (n.tagName === "SPAN" && n.className === "number") continue; + if (n.tagName === "DIV" || n.tagName == "BR") { + s += "\n"; + } + s += text(n); + continue; + } + if (n.nodeType === 3) { + s += n.nodeValue; + } + } + return s.replace("\xA0", " "); // replace non-breaking spaces + } + + function init(code) { + var output = document.createElement('div'); + var outpre = document.createElement('pre'); + var running; + + if ($ && $(output).resizable) { + $(output).resizable({ + handles: "n,w,nw", + minHeight: 27, + minWidth: 135, + maxHeight: 608, + maxWidth: 990 + }); + } + + function onKill() { + if (running) running.Kill(); + } + + function onRun(e) { + onKill(); + output.style.display = "block"; + outpre.innerHTML = ""; + run1.style.display = "none"; + var options = {Race: e.shiftKey}; + running = transport.Run(text(code), PlaygroundOutput(outpre), options); + } + + function onClose() { + onKill(); + output.style.display = "none"; + run1.style.display = "inline-block"; + } + + var run1 = document.createElement('button'); + run1.innerHTML = 'Run'; + run1.className = 'run'; + run1.addEventListener("click", onRun, false); + var run2 = document.createElement('button'); + run2.className = 'run'; + run2.innerHTML = 'Run'; + run2.addEventListener("click", onRun, false); + var kill = document.createElement('button'); + kill.className = 'kill'; + kill.innerHTML = 'Kill'; + kill.addEventListener("click", onKill, false); + var close = document.createElement('button'); + close.className = 'close'; + close.innerHTML = 'Close'; + close.addEventListener("click", onClose, false); + + var button = document.createElement('div'); + button.classList.add('buttons'); + button.appendChild(run1); + // Hack to simulate insertAfter + code.parentNode.insertBefore(button, code.nextSibling); + + var buttons = document.createElement('div'); + buttons.classList.add('buttons'); + buttons.appendChild(run2); + buttons.appendChild(kill); + buttons.appendChild(close); + + output.classList.add('output'); + output.appendChild(buttons); + output.appendChild(outpre); + output.style.display = "none"; + code.parentNode.insertBefore(output, button.nextSibling); + } + + var play = document.querySelectorAll('div.playground'); + for (var i = 0; i < play.length; i++) { + init(play[i]); + } +} + +`, + + "playground.js": `// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +In the absence of any formal way to specify interfaces in JavaScript, +here's a skeleton implementation of a playground transport. + + function Transport() { + // Set up any transport state (eg, make a websocket connection). + return { + Run: function(body, output, options) { + // Compile and run the program 'body' with 'options'. + // Call the 'output' callback to display program output. + return { + Kill: function() { + // Kill the running program. + } + }; + } + }; + } + + // The output callback is called multiple times, and each time it is + // passed an object of this form. + var write = { + Kind: 'string', // 'start', 'stdout', 'stderr', 'end' + Body: 'string' // content of write or end status message + } + + // The first call must be of Kind 'start' with no body. + // Subsequent calls may be of Kind 'stdout' or 'stderr' + // and must have a non-null Body string. + // The final call should be of Kind 'end' with an optional + // Body string, signifying a failure ("killed", for example). + + // The output callback must be of this form. + // See PlaygroundOutput (below) for an implementation. + function outputCallback(write) { + } +*/ + +function HTTPTransport() { + 'use strict'; + + // TODO(adg): support stderr + + function playback(output, events) { + var timeout; + output({Kind: 'start'}); + function next() { + if (!events || events.length === 0) { + output({Kind: 'end'}); + return; + } + var e = events.shift(); + if (e.Delay === 0) { + output({Kind: 'stdout', Body: e.Message}); + next(); + return; + } + timeout = setTimeout(function() { + output({Kind: 'stdout', Body: e.Message}); + next(); + }, e.Delay / 1000000); + } + next(); + return { + Stop: function() { + clearTimeout(timeout); + } + } + } + + function error(output, msg) { + output({Kind: 'start'}); + output({Kind: 'stderr', Body: msg}); + output({Kind: 'end'}); + } + + var seq = 0; + return { + Run: function(body, output, options) { + seq++; + var cur = seq; + var playing; + $.ajax('/compile', { + type: 'POST', + data: {'version': 2, 'body': body}, + dataType: 'json', + success: function(data) { + if (seq != cur) return; + if (!data) return; + if (playing != null) playing.Stop(); + if (data.Errors) { + error(output, data.Errors); + return; + } + playing = playback(output, data.Events); + }, + error: function() { + error(output, 'Error communicating with remote server.'); + } + }); + return { + Kill: function() { + if (playing != null) playing.Stop(); + output({Kind: 'end', Body: 'killed'}); + } + }; + } + }; +} + +function SocketTransport() { + 'use strict'; + + var id = 0; + var outputs = {}; + var started = {}; + var websocket = new WebSocket('ws://' + window.location.host + '/socket'); + + websocket.onclose = function() { + console.log('websocket connection closed'); + } + + websocket.onmessage = function(e) { + var m = JSON.parse(e.data); + var output = outputs[m.Id]; + if (output === null) + return; + if (!started[m.Id]) { + output({Kind: 'start'}); + started[m.Id] = true; + } + output({Kind: m.Kind, Body: m.Body}); + } + + function send(m) { + websocket.send(JSON.stringify(m)); + } + + return { + Run: function(body, output, options) { + var thisID = id+''; + id++; + outputs[thisID] = output; + send({Id: thisID, Kind: 'run', Body: body, Options: options}); + return { + Kill: function() { + send({Id: thisID, Kind: 'kill'}); + } + }; + } + }; +} + +function PlaygroundOutput(el) { + 'use strict'; + + return function(write) { + if (write.Kind == 'start') { + el.innerHTML = ''; + return; + } + + var cl = 'system'; + if (write.Kind == 'stdout' || write.Kind == 'stderr') + cl = write.Kind; + + var m = write.Body; + if (write.Kind == 'end') + m = '\nProgram exited' + (m?(': '+m):'.'); + + if (m.indexOf('IMAGE:') === 0) { + // TODO(adg): buffer all writes before creating image + var url = 'data:image/png;base64,' + m.substr(6); + var img = document.createElement('img'); + img.src = url; + el.appendChild(img); + return; + } + + // ^L clears the screen. + var s = m.split('\x0c'); + if (s.length > 1) { + el.innerHTML = ''; + m = s.pop(); + } + + m = m.replace(/&/g, '&'); + m = m.replace(//g, '>'); + + var needScroll = (el.scrollTop + el.offsetHeight) == el.scrollHeight; + + var span = document.createElement('span'); + span.className = cl; + span.innerHTML = m; + el.appendChild(span); + + if (needScroll) + el.scrollTop = el.scrollHeight - el.offsetHeight; + } +} + +(function() { + function lineHighlight(error) { + var regex = /prog.go:([0-9]+)/g; + var r = regex.exec(error); + while (r) { + $(".lines div").eq(r[1]-1).addClass("lineerror"); + r = regex.exec(error); + } + } + function highlightOutput(wrappedOutput) { + return function(write) { + if (write.Body) lineHighlight(write.Body); + wrappedOutput(write); + } + } + function lineClear() { + $(".lineerror").removeClass("lineerror"); + } + + // opts is an object with these keys + // codeEl - code editor element + // outputEl - program output element + // runEl - run button element + // fmtEl - fmt button element (optional) + // fmtImportEl - fmt "imports" checkbox element (optional) + // shareEl - share button element (optional) + // shareURLEl - share URL text input element (optional) + // shareRedirect - base URL to redirect to on share (optional) + // toysEl - toys select element (optional) + // enableHistory - enable using HTML5 history API (optional) + // transport - playground transport to use (default is HTTPTransport) + function playground(opts) { + var code = $(opts.codeEl); + var transport = opts['transport'] || new HTTPTransport(); + var running; + + // autoindent helpers. + function insertTabs(n) { + // find the selection start and end + var start = code[0].selectionStart; + var end = code[0].selectionEnd; + // split the textarea content into two, and insert n tabs + var v = code[0].value; + var u = v.substr(0, start); + for (var i=0; i 0) { + curpos--; + if (el.value[curpos] == "\t") { + tabs++; + } else if (tabs > 0 || el.value[curpos] == "\n") { + break; + } + } + setTimeout(function() { + insertTabs(tabs); + }, 1); + } + + function keyHandler(e) { + if (e.keyCode == 9 && !e.ctrlKey) { // tab (but not ctrl-tab) + insertTabs(1); + e.preventDefault(); + return false; + } + if (e.keyCode == 13) { // enter + if (e.shiftKey) { // +shift + run(); + e.preventDefault(); + return false; + } if (e.ctrlKey) { // +control + fmt(); + e.preventDefault(); + } else { + autoindent(e.target); + } + } + return true; + } + code.unbind('keydown').bind('keydown', keyHandler); + var outdiv = $(opts.outputEl).empty(); + var output = $('
    ').appendTo(outdiv);
    +  
    +    function body() {
    +      return $(opts.codeEl).val();
    +    }
    +    function setBody(text) {
    +      $(opts.codeEl).val(text);
    +    }
    +    function origin(href) {
    +      return (""+href).split("/").slice(0, 3).join("/");
    +    }
    +  
    +    var pushedEmpty = (window.location.pathname == "/");
    +    function inputChanged() {
    +      if (pushedEmpty) {
    +        return;
    +      }
    +      pushedEmpty = true;
    +      $(opts.shareURLEl).hide();
    +      window.history.pushState(null, "", "/");
    +    }
    +    function popState(e) {
    +      if (e === null) {
    +        return;
    +      }
    +      if (e && e.state && e.state.code) {
    +        setBody(e.state.code);
    +      }
    +    }
    +    var rewriteHistory = false;
    +    if (window.history && window.history.pushState && window.addEventListener && opts.enableHistory) {
    +      rewriteHistory = true;
    +      code[0].addEventListener('input', inputChanged);
    +      window.addEventListener('popstate', popState);
    +    }
    +
    +    function setError(error) {
    +      if (running) running.Kill();
    +      lineClear();
    +      lineHighlight(error);
    +      output.empty().addClass("error").text(error);
    +    }
    +    function loading() {
    +      lineClear();
    +      if (running) running.Kill();
    +      output.removeClass("error").text('Waiting for remote server...');
    +    }
    +    function run() {
    +      loading();
    +      running = transport.Run(body(), highlightOutput(PlaygroundOutput(output[0])));
    +    }
    +
    +    function fmt() {
    +      loading();
    +      var data = {"body": body()}; 
    +      if ($(opts.fmtImportEl).is(":checked")) {
    +        data["imports"] = "true";
    +      }
    +      $.ajax("/fmt", {
    +        data: data,
    +        type: "POST",
    +        dataType: "json",
    +        success: function(data) {
    +          if (data.Error) {
    +            setError(data.Error);
    +          } else {
    +            setBody(data.Body);
    +            setError("");
    +          }
    +        }
    +      });
    +    }
    +
    +    $(opts.runEl).click(run);
    +    $(opts.fmtEl).click(fmt);
    +
    +    if (opts.shareEl !== null && (opts.shareURLEl !== null || opts.shareRedirect !== null)) {
    +      var shareURL;
    +      if (opts.shareURLEl) {
    +        shareURL = $(opts.shareURLEl).hide();
    +      }
    +      var sharing = false;
    +      $(opts.shareEl).click(function() {
    +        if (sharing) return;
    +        sharing = true;
    +        var sharingData = body();
    +        $.ajax("/share", {
    +          processData: false,
    +          data: sharingData,
    +          type: "POST",
    +          complete: function(xhr) {
    +            sharing = false;
    +            if (xhr.status != 200) {
    +              alert("Server error; try again.");
    +              return;
    +            }
    +            if (opts.shareRedirect) {
    +              window.location = opts.shareRedirect + xhr.responseText;
    +            }
    +            if (shareURL) {
    +              var path = "/p/" + xhr.responseText;
    +              var url = origin(window.location) + path;
    +              shareURL.show().val(url).focus().select();
    +  
    +              if (rewriteHistory) {
    +                var historyData = {"code": sharingData};
    +                window.history.pushState(historyData, "", path);
    +                pushedEmpty = false;
    +              }
    +            }
    +          }
    +        });
    +      });
    +    }
    +  
    +    if (opts.toysEl !== null) {
    +      $(opts.toysEl).bind('change', function() {
    +        var toy = $(this).val();
    +        $.ajax("/doc/play/"+toy, {
    +          processData: false,
    +          type: "GET",
    +          complete: function(xhr) {
    +            if (xhr.status != 200) {
    +              alert("Server error; try again.");
    +              return;
    +            }
    +            setBody(xhr.responseText);
    +          }
    +        });
    +      });
    +    }
    +  }
    +
    +  window.playground = playground;
    +})();
    +`,
    +
    +	"search.html": `
    +{{with .Alert}}
    +	

    + {{html .}} +

    +{{end}} +{{with .Alt}} +

    + Did you mean: + {{range .Alts}} + {{html .}} + {{end}} +

    +{{end}} +`, + + "search.txt": `QUERY + {{.Query}} + +{{with .Alert}}{{.}} +{{end}}{{/* .Alert */}}{{/* + +--------------------------------------- + +*/}}{{with .Alt}}DID YOU MEAN + +{{range .Alts}} {{.}} +{{end}} +{{end}}{{/* .Alt */}}{{/* + +--------------------------------------- + +*/}}{{with .Pak}}PACKAGE {{$.Query}} + +{{range .}} {{pkgLink .Pak.Path}} +{{end}} +{{end}}{{/* .Pak */}}{{/* + +--------------------------------------- + +*/}}{{range $key, $val := .Idents}}{{if $val}}{{$key.Name}} +{{range $val}} {{.Path}}.{{.Name}} +{{end}} +{{end}}{{end}}{{/* .Idents */}}{{/* + +--------------------------------------- + +*/}}{{with .Hit}}{{with .Decls}}PACKAGE-LEVEL DECLARATIONS + +{{range .}}package {{.Pak.Name}} +{{range $file := .Files}}{{range .Groups}}{{range .}} {{srcLink $file.File.Path}}:{{infoLine .}}{{end}} +{{end}}{{end}}{{/* .Files */}} +{{end}}{{end}}{{/* .Decls */}}{{/* + +--------------------------------------- + +*/}}{{with .Others}}LOCAL DECLARATIONS AND USES + +{{range .}}package {{.Pak.Name}} +{{range $file := .Files}}{{range .Groups}}{{range .}} {{srcLink $file.File.Path}}:{{infoLine .}} +{{end}}{{end}}{{end}}{{/* .Files */}} +{{end}}{{end}}{{/* .Others */}}{{end}}{{/* .Hit */}}{{/* + +--------------------------------------- + +*/}}{{if .Textual}}{{if .Complete}}{{.Found}} TEXTUAL OCCURRENCES{{else}}MORE THAN {{.Found}} TEXTUAL OCCURRENCES{{end}} + +{{range .Textual}}{{len .Lines}} {{srcLink .Filename}} +{{end}}{{if not .Complete}}... ... +{{end}}{{end}} +`, + + "searchcode.html": ` +{{$query_url := urlquery .Query}} +{{if not .Idents}} + {{with .Pak}} +

    Package {{html $.Query}}

    +

    + + {{range .}} + {{$pkg_html := pkgLink .Pak.Path | html}} + + {{end}} +
    {{$pkg_html}}
    +

    + {{end}} +{{end}} +{{with .Hit}} + {{with .Decls}} +

    Package-level declarations

    + {{range .}} + {{$pkg_html := pkgLink .Pak.Path | html}} +

    package {{html .Pak.Name}}

    + {{range .Files}} + {{$file := .File.Path}} + {{range .Groups}} + {{range .}} + {{$line := infoLine .}} + {{$file}}:{{$line}} + {{infoSnippet_html .}} + {{end}} + {{end}} + {{end}} + {{end}} + {{end}} + {{with .Others}} +

    Local declarations and uses

    + {{range .}} + {{$pkg_html := pkgLink .Pak.Path | html}} +

    package {{html .Pak.Name}}

    + {{range .Files}} + {{$file := .File.Path}} + {{$file}} + + {{range .Groups}} + + + + + + + {{end}} +
    {{index . 0 | infoKind_html}} + {{range .}} + {{$line := infoLine .}} + {{$line}} + {{end}} +
    + {{end}} + {{end}} + {{end}} +{{end}} +`, + + "searchdoc.html": ` +{{range $key, $val := .Idents}} + {{if $val}} +

    {{$key.Name}}

    + {{range $val}} + {{$pkg_html := pkgLink .Path | html}} + {{if eq "Packages" $key.Name}} + {{html .Path}} + {{else}} + {{$doc_html := docLink .Path .Name| html}} + {{html .Package}}.{{.Name}} + {{end}} + {{if .Doc}} +

    {{comment_html .Doc}}

    + {{else}} +

    No documentation available

    + {{end}} + {{end}} + {{end}} +{{end}} +`, + + "searchtxt.html": ` +{{$query_url := urlquery .Query}} +{{with .Textual}} + {{if $.Complete}} +

    {{html $.Found}} textual occurrences

    + {{else}} +

    More than {{html $.Found}} textual occurrences

    +

    + Not all files or lines containing "{{html $.Query}}" are shown. +

    + {{end}} +

    + + {{range .}} + {{$file := .Filename}} + + + + + + + + {{end}} + {{if not $.Complete}} + + {{end}} +
    + {{$file}}: + {{len .Lines}} + {{range .Lines}} + {{html .}} + {{end}} + {{if not $.Complete}} + ... + {{end}} +
    ...
    +

    +{{end}} +`, + + "style.css": `body { + margin: 0; + font-family: Arial, sans-serif; + font-size: 16px; + background-color: #fff; + line-height: 1.3em; +} +pre, +code { + font-family: Menlo, monospace; + font-size: 14px; +} +pre { + line-height: 1.4em; + overflow-x: auto; +} +pre .comment { + color: #006600; +} +pre .highlight, +pre .highlight-comment, +pre .selection-highlight, +pre .selection-highlight-comment { + background: #FFFF00; +} +pre .selection, +pre .selection-comment { + background: #FF9632; +} +pre .ln { + color: #999; +} +body { + color: #222; +} +a, +.exampleHeading .text { + color: #375EAB; + text-decoration: none; +} +a:hover, +.exampleHeading .text:hover { + text-decoration: underline; +} +p, li { + max-width: 800px; + word-wrap: break-word; +} +p, +pre, +ul, +ol { + margin: 20px; +} +pre { + background: #EFEFEF; + padding: 10px; + + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +h1, +h2, +h3, +h4, +.rootHeading { + margin: 20px 0 20px; + padding: 0; + color: #375EAB; + font-weight: bold; +} +h1 { + font-size: 28px; + line-height: 1; +} +h2 { + font-size: 20px; + background: #E0EBF5; + padding: 8px; + line-height: 1.25; + font-weight: normal; +} +h2 a { + font-weight: bold; +} +h3 { + font-size: 20px; +} +h3, +h4 { + margin: 20px 5px; +} +h4 { + font-size: 16px; +} +.rootHeading { + font-size: 20px; + margin: 0; +} + +dl { + margin: 20px; +} +dd { + margin: 0 0 0 20px; +} +dl, +dd { + font-size: 14px; +} +div#nav table td { + vertical-align: top; +} + + +.pkg-dir { + padding: 0 10px; +} +.pkg-dir table { + border-collapse: collapse; + border-spacing: 0; +} +.pkg-name { + padding-right: 10px; +} +.alert { + color: #AA0000; +} + +.top-heading { + float: left; + padding: 21px 0; + font-size: 20px; + font-weight: normal; +} +.top-heading a { + color: #222; + text-decoration: none; +} + +div#topbar { + background: #E0EBF5; + height: 64px; + overflow: hidden; +} + +body { + text-align: center; +} +div#page { + width: 100%; +} +div#page > .container, +div#topbar > .container { + text-align: left; + margin-left: auto; + margin-right: auto; + padding: 0 20px; +} +div#topbar > .container, +div#page > .container { + max-width: 950px; +} +div#page.wide > .container, +div#topbar.wide > .container { + max-width: none; +} +div#plusone { + float: right; + clear: right; + margin-top: 5px; +} + +div#footer { + text-align: center; + color: #666; + font-size: 14px; + margin: 40px 0; +} + +div#menu > a, +div#menu > input, +div#learn .buttons a, +div.play .buttons a, +div#blog .read a, +#menu-button { + padding: 10px; + + text-decoration: none; + font-size: 16px; + + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +div#playground .buttons a, +div#menu > a, +div#menu > input, +#menu-button { + border: 1px solid #375EAB; +} +div#playground .buttons a, +div#menu > a, +#menu-button { + color: white; + background: #375EAB; +} +#playgroundButton.active { + background: white; + color: #375EAB; +} +a#start, +div#learn .buttons a, +div.play .buttons a, +div#blog .read a { + color: #222; + border: 1px solid #375EAB; + background: #E0EBF5; +} +.download { + width: 150px; +} + +div#menu { + text-align: right; + padding: 10px; + white-space: nowrap; + max-height: 0; + -moz-transition: max-height .25s linear; + transition: max-height .25s linear; + width: 100%; +} +div#menu.menu-visible { + max-height: 500px; +} +div#menu > a, +#menu-button { + margin: 10px 2px; + padding: 10px; +} +div#menu > input { + position: relative; + top: 1px; + width: 140px; + background: white; + color: #222; + box-sizing: border-box; +} +div#menu > input.inactive { + color: #999; +} + +#menu-button { + display: none; + position: absolute; + right: 5px; + top: 0; + margin-right: 5px; +} +#menu-button-arrow { + display: inline-block; +} +.vertical-flip { + transform: rotate(-180deg); +} + +div.left { + float: left; + clear: left; + margin-right: 2.5%; +} +div.right { + float: right; + clear: right; + margin-left: 2.5%; +} +div.left, +div.right { + width: 45%; +} + +div#learn, +div#about { + padding-top: 20px; +} +div#learn h2, +div#about { + margin: 0; +} +div#about { + font-size: 20px; + margin: 0 auto 30px; +} +div#gopher { + background: url(/doc/gopher/frontpage.png) no-repeat; + background-position: center top; + height: 155px; +} +a#start { + display: block; + padding: 10px; + + text-align: center; + text-decoration: none; + + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +a#start .big { + display: block; + font-weight: bold; + font-size: 20px; +} +a#start .desc { + display: block; + font-size: 14px; + font-weight: normal; + margin-top: 5px; +} + +div#learn .popout { + float: right; + display: block; + cursor: pointer; + font-size: 12px; + background: url(/doc/share.png) no-repeat; + background-position: right top; + padding: 5px 27px; +} +div#learn pre, +div#learn textarea { + padding: 0; + margin: 0; + font-family: Menlo, monospace; + font-size: 14px; +} +div#learn .input { + padding: 10px; + margin-top: 10px; + height: 150px; + + -webkit-border-top-left-radius: 5px; + -webkit-border-top-right-radius: 5px; + -moz-border-radius-topleft: 5px; + -moz-border-radius-topright: 5px; + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} +div#learn .input textarea { + width: 100%; + height: 100%; + border: none; + outline: none; + resize: none; +} +div#learn .output { + border-top: none !important; + + padding: 10px; + height: 59px; + overflow: auto; + + -webkit-border-bottom-right-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + -moz-border-radius-bottomright: 5px; + -moz-border-radius-bottomleft: 5px; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; +} +div#learn .output pre { + padding: 0; + + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +div#learn .input, +div#learn .input textarea, +div#learn .output, +div#learn .output pre { + background: #FFFFD8; +} +div#learn .input, +div#learn .output { + border: 1px solid #375EAB; +} +div#learn .buttons { + float: right; + padding: 20px 0 10px 0; + text-align: right; +} +div#learn .buttons a { + height: 16px; + margin-left: 5px; + padding: 10px; +} +div#learn .toys { + margin-top: 8px; +} +div#learn .toys select { + border: 1px solid #375EAB; + margin: 0; +} +div#learn .output .exit { + display: none; +} + +div#video { + max-width: 100%; +} +div#blog, +div#video { + margin-top: 40px; +} +div#blog > a, +div#blog > div, +div#blog > h2, +div#video > a, +div#video > div, +div#video > h2 { + margin-bottom: 10px; +} +div#blog .title, +div#video .title { + display: block; + font-size: 20px; +} +div#blog .when { + color: #666; + font-size: 14px; +} +div#blog .read { + text-align: right; +} + +.toggleButton { cursor: pointer; } +.toggle .collapsed { display: block; } +.toggle .expanded { display: none; } +.toggleVisible .collapsed { display: none; } +.toggleVisible .expanded { display: block; } + +table.codetable { margin-left: auto; margin-right: auto; border-style: none; } +table.codetable td { padding-right: 10px; } +hr { border-style: none; border-top: 1px solid black; } + +img.gopher { + float: right; + margin-left: 10px; + margin-bottom: 10px; + z-index: -1; +} +h2 { clear: right; } + +/* example and drop-down playground */ +div.play { + padding: 0 20px 40px 20px; +} +div.play pre, +div.play textarea, +div.play .lines { + padding: 0; + margin: 0; + font-family: Menlo, monospace; + font-size: 14px; +} +div.play .input { + padding: 10px; + margin-top: 10px; + + -webkit-border-top-left-radius: 5px; + -webkit-border-top-right-radius: 5px; + -moz-border-radius-topleft: 5px; + -moz-border-radius-topright: 5px; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + + overflow: hidden; +} +div.play .input textarea { + width: 100%; + height: 100%; + border: none; + outline: none; + resize: none; + + overflow: hidden; +} +div#playground .input textarea { + overflow: auto; + resize: auto; +} +div.play .output { + border-top: none !important; + + padding: 10px; + max-height: 200px; + overflow: auto; + + -webkit-border-bottom-right-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + -moz-border-radius-bottomright: 5px; + -moz-border-radius-bottomleft: 5px; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; +} +div.play .output pre { + padding: 0; + + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +div.play .input, +div.play .input textarea, +div.play .output, +div.play .output pre { + background: #FFFFD8; +} +div.play .input, +div.play .output { + border: 1px solid #375EAB; +} +div.play .buttons { + float: right; + padding: 20px 0 10px 0; + text-align: right; +} +div.play .buttons a { + height: 16px; + margin-left: 5px; + padding: 10px; + cursor: pointer; +} +.output .stderr { + color: #933; +} +.output .system { + color: #999; +} + +/* drop-down playground */ +#playgroundButton, +div#playground { + /* start hidden; revealed by javascript */ + display: none; +} +div#playground { + position: absolute; + top: 63px; + right: 20px; + padding: 0 10px 10px 10px; + z-index: 1; + text-align: left; + background: #E0EBF5; + + border: 1px solid #B0BBC5; + border-top: none; + + -webkit-border-bottom-left-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + -moz-border-radius-bottomleft: 5px; + -moz-border-radius-bottomright: 5px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; +} +div#playground .code { + width: 520px; + height: 200px; +} +div#playground .output { + height: 100px; +} + +/* Inline runnable snippets (play.js/initPlayground) */ +#content .code pre, #content .playground pre, #content .output pre { + margin: 0; + padding: 0; + background: none; + border: none; + outline: 0px solid transparent; + overflow: auto; +} +#content .playground .number, #content .code .number { + color: #999; +} +#content .code, #content .playground, #content .output { + width: auto; + margin: 20px; + padding: 10px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +#content .code, #content .playground { + background: #e9e9e9; +} +#content .output { + background: #202020; +} +#content .output .stdout, #content .output pre { + color: #e6e6e6; +} +#content .output .stderr, #content .output .error { + color: rgb(244, 74, 63); +} +#content .output .system, #content .output .exit { + color: rgb(255, 209, 77) +} +#content .buttons { + position: relative; + float: right; + top: -50px; + right: 30px; +} +#content .output .buttons { + top: -60px; + right: 0; + height: 0; +} +#content .buttons .kill { + display: none; + visibility: hidden; +} +a.error { + font-weight: bold; + color: white; + background-color: darkred; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + padding: 2px 4px 2px 4px; /* TRBL */ +} + + +#heading-narrow { + display: none; +} + +.downloading { + background: #F9F9BE; + padding: 10px; + text-align: center; + border-radius: 5px; +} + +@media (max-width: 930px) { + #heading-wide { + display: none; + } + #heading-narrow { + display: block; + } +} + + +@media (max-width: 760px) { + .container .left, + .container .right { + width: auto; + float: none; + } + + div#about { + max-width: 500px; + text-align: center; + } +} + +@media (min-width: 700px) and (max-width: 1000px) { + div#menu > a { + margin: 5px 0; + font-size: 14px; + } + + div#menu > input { + font-size: 14px; + } +} + +@media (max-width: 700px) { + body { + font-size: 15px; + } + + pre, + code { + font-size: 13px; + } + + div#page > .container { + padding: 0 10px; + } + + div#topbar { + height: auto; + padding: 10px; + } + + div#topbar > .container { + padding: 0; + } + + #heading-wide { + display: block; + } + #heading-narrow { + display: none; + } + + .top-heading { + float: none; + display: inline-block; + padding: 12px; + } + + div#menu { + padding: 0; + min-width: 0; + text-align: left; + float: left; + } + + div#menu > a, + div#menu > input { + display: block; + margin-left: 0; + margin-right: 0; + } + + div#menu > input { + width: 100%; + } + + #menu-button { + display: inline-block; + } + + p, + pre, + ul, + ol { + margin: 10px; + } + + .pkg-synopsis { + display: none; + } + + img.gopher { + display: none; + } +} + +@media (max-width: 480px) { + #heading-wide { + display: none; + } + #heading-narrow { + display: block; + } +} + +@media print { + pre { + background: #FFF; + border: 1px solid #BBB; + white-space: pre-wrap; + } +} +`, +} diff --git a/vendor/golang.org/x/tools/godoc/static/style.css b/vendor/golang.org/x/tools/godoc/static/style.css new file mode 100644 index 0000000000..8ea08525f3 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/static/style.css @@ -0,0 +1,773 @@ +body { + margin: 0; + font-family: Arial, sans-serif; + font-size: 16px; + background-color: #fff; + line-height: 1.3em; +} +pre, +code { + font-family: Menlo, monospace; + font-size: 14px; +} +pre { + line-height: 1.4em; + overflow-x: auto; +} +pre .comment { + color: #006600; +} +pre .highlight, +pre .highlight-comment, +pre .selection-highlight, +pre .selection-highlight-comment { + background: #FFFF00; +} +pre .selection, +pre .selection-comment { + background: #FF9632; +} +pre .ln { + color: #999; +} +body { + color: #222; +} +a, +.exampleHeading .text { + color: #375EAB; + text-decoration: none; +} +a:hover, +.exampleHeading .text:hover { + text-decoration: underline; +} +p, li { + max-width: 800px; + word-wrap: break-word; +} +p, +pre, +ul, +ol { + margin: 20px; +} +pre { + background: #EFEFEF; + padding: 10px; + + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +h1, +h2, +h3, +h4, +.rootHeading { + margin: 20px 0 20px; + padding: 0; + color: #375EAB; + font-weight: bold; +} +h1 { + font-size: 28px; + line-height: 1; +} +h2 { + font-size: 20px; + background: #E0EBF5; + padding: 8px; + line-height: 1.25; + font-weight: normal; +} +h2 a { + font-weight: bold; +} +h3 { + font-size: 20px; +} +h3, +h4 { + margin: 20px 5px; +} +h4 { + font-size: 16px; +} +.rootHeading { + font-size: 20px; + margin: 0; +} + +dl { + margin: 20px; +} +dd { + margin: 0 0 0 20px; +} +dl, +dd { + font-size: 14px; +} +div#nav table td { + vertical-align: top; +} + + +.pkg-dir { + padding: 0 10px; +} +.pkg-dir table { + border-collapse: collapse; + border-spacing: 0; +} +.pkg-name { + padding-right: 10px; +} +.alert { + color: #AA0000; +} + +.top-heading { + float: left; + padding: 21px 0; + font-size: 20px; + font-weight: normal; +} +.top-heading a { + color: #222; + text-decoration: none; +} + +div#topbar { + background: #E0EBF5; + height: 64px; + overflow: hidden; +} + +body { + text-align: center; +} +div#page { + width: 100%; +} +div#page > .container, +div#topbar > .container { + text-align: left; + margin-left: auto; + margin-right: auto; + padding: 0 20px; +} +div#topbar > .container, +div#page > .container { + max-width: 950px; +} +div#page.wide > .container, +div#topbar.wide > .container { + max-width: none; +} +div#plusone { + float: right; + clear: right; + margin-top: 5px; +} + +div#footer { + text-align: center; + color: #666; + font-size: 14px; + margin: 40px 0; +} + +div#menu > a, +div#menu > input, +div#learn .buttons a, +div.play .buttons a, +div#blog .read a, +#menu-button { + padding: 10px; + + text-decoration: none; + font-size: 16px; + + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +div#playground .buttons a, +div#menu > a, +div#menu > input, +#menu-button { + border: 1px solid #375EAB; +} +div#playground .buttons a, +div#menu > a, +#menu-button { + color: white; + background: #375EAB; +} +#playgroundButton.active { + background: white; + color: #375EAB; +} +a#start, +div#learn .buttons a, +div.play .buttons a, +div#blog .read a { + color: #222; + border: 1px solid #375EAB; + background: #E0EBF5; +} +.download { + width: 150px; +} + +div#menu { + text-align: right; + padding: 10px; + white-space: nowrap; + max-height: 0; + -moz-transition: max-height .25s linear; + transition: max-height .25s linear; + width: 100%; +} +div#menu.menu-visible { + max-height: 500px; +} +div#menu > a, +#menu-button { + margin: 10px 2px; + padding: 10px; +} +div#menu > input { + position: relative; + top: 1px; + width: 140px; + background: white; + color: #222; + box-sizing: border-box; +} +div#menu > input.inactive { + color: #999; +} + +#menu-button { + display: none; + position: absolute; + right: 5px; + top: 0; + margin-right: 5px; +} +#menu-button-arrow { + display: inline-block; +} +.vertical-flip { + transform: rotate(-180deg); +} + +div.left { + float: left; + clear: left; + margin-right: 2.5%; +} +div.right { + float: right; + clear: right; + margin-left: 2.5%; +} +div.left, +div.right { + width: 45%; +} + +div#learn, +div#about { + padding-top: 20px; +} +div#learn h2, +div#about { + margin: 0; +} +div#about { + font-size: 20px; + margin: 0 auto 30px; +} +div#gopher { + background: url(/doc/gopher/frontpage.png) no-repeat; + background-position: center top; + height: 155px; +} +a#start { + display: block; + padding: 10px; + + text-align: center; + text-decoration: none; + + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +a#start .big { + display: block; + font-weight: bold; + font-size: 20px; +} +a#start .desc { + display: block; + font-size: 14px; + font-weight: normal; + margin-top: 5px; +} + +div#learn .popout { + float: right; + display: block; + cursor: pointer; + font-size: 12px; + background: url(/doc/share.png) no-repeat; + background-position: right top; + padding: 5px 27px; +} +div#learn pre, +div#learn textarea { + padding: 0; + margin: 0; + font-family: Menlo, monospace; + font-size: 14px; +} +div#learn .input { + padding: 10px; + margin-top: 10px; + height: 150px; + + -webkit-border-top-left-radius: 5px; + -webkit-border-top-right-radius: 5px; + -moz-border-radius-topleft: 5px; + -moz-border-radius-topright: 5px; + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} +div#learn .input textarea { + width: 100%; + height: 100%; + border: none; + outline: none; + resize: none; +} +div#learn .output { + border-top: none !important; + + padding: 10px; + height: 59px; + overflow: auto; + + -webkit-border-bottom-right-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + -moz-border-radius-bottomright: 5px; + -moz-border-radius-bottomleft: 5px; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; +} +div#learn .output pre { + padding: 0; + + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +div#learn .input, +div#learn .input textarea, +div#learn .output, +div#learn .output pre { + background: #FFFFD8; +} +div#learn .input, +div#learn .output { + border: 1px solid #375EAB; +} +div#learn .buttons { + float: right; + padding: 20px 0 10px 0; + text-align: right; +} +div#learn .buttons a { + height: 16px; + margin-left: 5px; + padding: 10px; +} +div#learn .toys { + margin-top: 8px; +} +div#learn .toys select { + border: 1px solid #375EAB; + margin: 0; +} +div#learn .output .exit { + display: none; +} + +div#video { + max-width: 100%; +} +div#blog, +div#video { + margin-top: 40px; +} +div#blog > a, +div#blog > div, +div#blog > h2, +div#video > a, +div#video > div, +div#video > h2 { + margin-bottom: 10px; +} +div#blog .title, +div#video .title { + display: block; + font-size: 20px; +} +div#blog .when { + color: #666; + font-size: 14px; +} +div#blog .read { + text-align: right; +} + +.toggleButton { cursor: pointer; } +.toggle .collapsed { display: block; } +.toggle .expanded { display: none; } +.toggleVisible .collapsed { display: none; } +.toggleVisible .expanded { display: block; } + +table.codetable { margin-left: auto; margin-right: auto; border-style: none; } +table.codetable td { padding-right: 10px; } +hr { border-style: none; border-top: 1px solid black; } + +img.gopher { + float: right; + margin-left: 10px; + margin-bottom: 10px; + z-index: -1; +} +h2 { clear: right; } + +/* example and drop-down playground */ +div.play { + padding: 0 20px 40px 20px; +} +div.play pre, +div.play textarea, +div.play .lines { + padding: 0; + margin: 0; + font-family: Menlo, monospace; + font-size: 14px; +} +div.play .input { + padding: 10px; + margin-top: 10px; + + -webkit-border-top-left-radius: 5px; + -webkit-border-top-right-radius: 5px; + -moz-border-radius-topleft: 5px; + -moz-border-radius-topright: 5px; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + + overflow: hidden; +} +div.play .input textarea { + width: 100%; + height: 100%; + border: none; + outline: none; + resize: none; + + overflow: hidden; +} +div#playground .input textarea { + overflow: auto; + resize: auto; +} +div.play .output { + border-top: none !important; + + padding: 10px; + max-height: 200px; + overflow: auto; + + -webkit-border-bottom-right-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + -moz-border-radius-bottomright: 5px; + -moz-border-radius-bottomleft: 5px; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; +} +div.play .output pre { + padding: 0; + + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +div.play .input, +div.play .input textarea, +div.play .output, +div.play .output pre { + background: #FFFFD8; +} +div.play .input, +div.play .output { + border: 1px solid #375EAB; +} +div.play .buttons { + float: right; + padding: 20px 0 10px 0; + text-align: right; +} +div.play .buttons a { + height: 16px; + margin-left: 5px; + padding: 10px; + cursor: pointer; +} +.output .stderr { + color: #933; +} +.output .system { + color: #999; +} + +/* drop-down playground */ +#playgroundButton, +div#playground { + /* start hidden; revealed by javascript */ + display: none; +} +div#playground { + position: absolute; + top: 63px; + right: 20px; + padding: 0 10px 10px 10px; + z-index: 1; + text-align: left; + background: #E0EBF5; + + border: 1px solid #B0BBC5; + border-top: none; + + -webkit-border-bottom-left-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + -moz-border-radius-bottomleft: 5px; + -moz-border-radius-bottomright: 5px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; +} +div#playground .code { + width: 520px; + height: 200px; +} +div#playground .output { + height: 100px; +} + +/* Inline runnable snippets (play.js/initPlayground) */ +#content .code pre, #content .playground pre, #content .output pre { + margin: 0; + padding: 0; + background: none; + border: none; + outline: 0px solid transparent; + overflow: auto; +} +#content .playground .number, #content .code .number { + color: #999; +} +#content .code, #content .playground, #content .output { + width: auto; + margin: 20px; + padding: 10px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +#content .code, #content .playground { + background: #e9e9e9; +} +#content .output { + background: #202020; +} +#content .output .stdout, #content .output pre { + color: #e6e6e6; +} +#content .output .stderr, #content .output .error { + color: rgb(244, 74, 63); +} +#content .output .system, #content .output .exit { + color: rgb(255, 209, 77) +} +#content .buttons { + position: relative; + float: right; + top: -50px; + right: 30px; +} +#content .output .buttons { + top: -60px; + right: 0; + height: 0; +} +#content .buttons .kill { + display: none; + visibility: hidden; +} +a.error { + font-weight: bold; + color: white; + background-color: darkred; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + padding: 2px 4px 2px 4px; /* TRBL */ +} + + +#heading-narrow { + display: none; +} + +.downloading { + background: #F9F9BE; + padding: 10px; + text-align: center; + border-radius: 5px; +} + +@media (max-width: 930px) { + #heading-wide { + display: none; + } + #heading-narrow { + display: block; + } +} + + +@media (max-width: 760px) { + .container .left, + .container .right { + width: auto; + float: none; + } + + div#about { + max-width: 500px; + text-align: center; + } +} + +@media (min-width: 700px) and (max-width: 1000px) { + div#menu > a { + margin: 5px 0; + font-size: 14px; + } + + div#menu > input { + font-size: 14px; + } +} + +@media (max-width: 700px) { + body { + font-size: 15px; + } + + pre, + code { + font-size: 13px; + } + + div#page > .container { + padding: 0 10px; + } + + div#topbar { + height: auto; + padding: 10px; + } + + div#topbar > .container { + padding: 0; + } + + #heading-wide { + display: block; + } + #heading-narrow { + display: none; + } + + .top-heading { + float: none; + display: inline-block; + padding: 12px; + } + + div#menu { + padding: 0; + min-width: 0; + text-align: left; + float: left; + } + + div#menu > a, + div#menu > input { + display: block; + margin-left: 0; + margin-right: 0; + } + + div#menu > input { + width: 100%; + } + + #menu-button { + display: inline-block; + } + + p, + pre, + ul, + ol { + margin: 10px; + } + + .pkg-synopsis { + display: none; + } + + img.gopher { + display: none; + } +} + +@media (max-width: 480px) { + #heading-wide { + display: none; + } + #heading-narrow { + display: block; + } +} + +@media print { + pre { + background: #FFF; + border: 1px solid #BBB; + white-space: pre-wrap; + } +} diff --git a/vendor/golang.org/x/tools/godoc/tab.go b/vendor/golang.org/x/tools/godoc/tab.go new file mode 100644 index 0000000000..d314ac7224 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/tab.go @@ -0,0 +1,82 @@ +// Copyright 2013 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(bradfitz,adg): move to util + +package godoc + +import "io" + +var spaces = []byte(" ") // 32 spaces seems like a good number + +const ( + indenting = iota + collecting +) + +// A tconv is an io.Writer filter for converting leading tabs into spaces. +type tconv struct { + output io.Writer + state int // indenting or collecting + indent int // valid if state == indenting + p *Presentation +} + +func (p *tconv) writeIndent() (err error) { + i := p.indent + for i >= len(spaces) { + i -= len(spaces) + if _, err = p.output.Write(spaces); err != nil { + return + } + } + // i < len(spaces) + if i > 0 { + _, err = p.output.Write(spaces[0:i]) + } + return +} + +func (p *tconv) Write(data []byte) (n int, err error) { + if len(data) == 0 { + return + } + pos := 0 // valid if p.state == collecting + var b byte + for n, b = range data { + switch p.state { + case indenting: + switch b { + case '\t': + p.indent += p.p.TabWidth + case '\n': + p.indent = 0 + if _, err = p.output.Write(data[n : n+1]); err != nil { + return + } + case ' ': + p.indent++ + default: + p.state = collecting + pos = n + if err = p.writeIndent(); err != nil { + return + } + } + case collecting: + if b == '\n' { + p.state = indenting + p.indent = 0 + if _, err = p.output.Write(data[pos : n+1]); err != nil { + return + } + } + } + } + n = len(data) + if pos < n && p.state == collecting { + _, err = p.output.Write(data[pos:]) + } + return +} diff --git a/vendor/golang.org/x/tools/godoc/template.go b/vendor/golang.org/x/tools/godoc/template.go new file mode 100644 index 0000000000..eda5874d0f --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/template.go @@ -0,0 +1,179 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Template support for writing HTML documents. +// Documents that include Template: true in their +// metadata are executed as input to text/template. +// +// This file defines functions for those templates to invoke. + +// The template uses the function "code" to inject program +// source into the output by extracting code from files and +// injecting them as HTML-escaped
     blocks.
    +//
    +// The syntax is simple: 1, 2, or 3 space-separated arguments:
    +//
    +// Whole file:
    +//	{{code "foo.go"}}
    +// One line (here the signature of main):
    +//	{{code "foo.go" `/^func.main/`}}
    +// Block of text, determined by start and end (here the body of main):
    +//	{{code "foo.go" `/^func.main/` `/^}/`
    +//
    +// Patterns can be `/regular expression/`, a decimal number, or "$"
    +// to signify the end of the file. In multi-line matches,
    +// lines that end with the four characters
    +//	OMIT
    +// are omitted from the output, making it easy to provide marker
    +// lines in the input that will not appear in the output but are easy
    +// to identify by pattern.
    +
    +package godoc
    +
    +import (
    +	"bytes"
    +	"fmt"
    +	"log"
    +	"regexp"
    +	"strings"
    +
    +	"golang.org/x/tools/godoc/vfs"
    +)
    +
    +// Functions in this file panic on error, but the panic is recovered
    +// to an error by 'code'.
    +
    +// contents reads and returns the content of the named file
    +// (from the virtual file system, so for example /doc refers to $GOROOT/doc).
    +func (c *Corpus) contents(name string) string {
    +	file, err := vfs.ReadFile(c.fs, name)
    +	if err != nil {
    +		log.Panic(err)
    +	}
    +	return string(file)
    +}
    +
    +// stringFor returns a textual representation of the arg, formatted according to its nature.
    +func stringFor(arg interface{}) string {
    +	switch arg := arg.(type) {
    +	case int:
    +		return fmt.Sprintf("%d", arg)
    +	case string:
    +		if len(arg) > 2 && arg[0] == '/' && arg[len(arg)-1] == '/' {
    +			return fmt.Sprintf("%#q", arg)
    +		}
    +		return fmt.Sprintf("%q", arg)
    +	default:
    +		log.Panicf("unrecognized argument: %v type %T", arg, arg)
    +	}
    +	return ""
    +}
    +
    +func (p *Presentation) code(file string, arg ...interface{}) (s string, err error) {
    +	defer func() {
    +		if r := recover(); r != nil {
    +			err = fmt.Errorf("%v", r)
    +		}
    +	}()
    +
    +	text := p.Corpus.contents(file)
    +	var command string
    +	switch len(arg) {
    +	case 0:
    +		// text is already whole file.
    +		command = fmt.Sprintf("code %q", file)
    +	case 1:
    +		command = fmt.Sprintf("code %q %s", file, stringFor(arg[0]))
    +		text = p.Corpus.oneLine(file, text, arg[0])
    +	case 2:
    +		command = fmt.Sprintf("code %q %s %s", file, stringFor(arg[0]), stringFor(arg[1]))
    +		text = p.Corpus.multipleLines(file, text, arg[0], arg[1])
    +	default:
    +		return "", fmt.Errorf("incorrect code invocation: code %q %q", file, arg)
    +	}
    +	// Trim spaces from output.
    +	text = strings.Trim(text, "\n")
    +	// Replace tabs by spaces, which work better in HTML.
    +	text = strings.Replace(text, "\t", "    ", -1)
    +	var buf bytes.Buffer
    +	// HTML-escape text and syntax-color comments like elsewhere.
    +	FormatText(&buf, []byte(text), -1, true, "", nil)
    +	// Include the command as a comment.
    +	text = fmt.Sprintf("
    %s
    ", command, buf.Bytes()) + return text, nil +} + +// parseArg returns the integer or string value of the argument and tells which it is. +func parseArg(arg interface{}, file string, max int) (ival int, sval string, isInt bool) { + switch n := arg.(type) { + case int: + if n <= 0 || n > max { + log.Panicf("%q:%d is out of range", file, n) + } + return n, "", true + case string: + return 0, n, false + } + log.Panicf("unrecognized argument %v type %T", arg, arg) + return +} + +// oneLine returns the single line generated by a two-argument code invocation. +func (c *Corpus) oneLine(file, text string, arg interface{}) string { + lines := strings.SplitAfter(c.contents(file), "\n") + line, pattern, isInt := parseArg(arg, file, len(lines)) + if isInt { + return lines[line-1] + } + return lines[match(file, 0, lines, pattern)-1] +} + +// multipleLines returns the text generated by a three-argument code invocation. +func (c *Corpus) multipleLines(file, text string, arg1, arg2 interface{}) string { + lines := strings.SplitAfter(c.contents(file), "\n") + line1, pattern1, isInt1 := parseArg(arg1, file, len(lines)) + line2, pattern2, isInt2 := parseArg(arg2, file, len(lines)) + if !isInt1 { + line1 = match(file, 0, lines, pattern1) + } + if !isInt2 { + line2 = match(file, line1, lines, pattern2) + } else if line2 < line1 { + log.Panicf("lines out of order for %q: %d %d", text, line1, line2) + } + for k := line1 - 1; k < line2; k++ { + if strings.HasSuffix(lines[k], "OMIT\n") { + lines[k] = "" + } + } + return strings.Join(lines[line1-1:line2], "") +} + +// match identifies the input line that matches the pattern in a code invocation. +// If start>0, match lines starting there rather than at the beginning. +// The return value is 1-indexed. +func match(file string, start int, lines []string, pattern string) int { + // $ matches the end of the file. + if pattern == "$" { + if len(lines) == 0 { + log.Panicf("%q: empty file", file) + } + return len(lines) + } + // /regexp/ matches the line that matches the regexp. + if len(pattern) > 2 && pattern[0] == '/' && pattern[len(pattern)-1] == '/' { + re, err := regexp.Compile(pattern[1 : len(pattern)-1]) + if err != nil { + log.Panic(err) + } + for i := start; i < len(lines); i++ { + if re.MatchString(lines[i]) { + return i + 1 + } + } + log.Panicf("%s: no match for %#q", file, pattern) + } + log.Panicf("unrecognized pattern: %q", pattern) + return 0 +} diff --git a/vendor/golang.org/x/tools/godoc/util/throttle.go b/vendor/golang.org/x/tools/godoc/util/throttle.go new file mode 100644 index 0000000000..53d9ba621e --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/util/throttle.go @@ -0,0 +1,88 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package util + +import "time" + +// A Throttle permits throttling of a goroutine by +// calling the Throttle method repeatedly. +// +type Throttle struct { + f float64 // f = (1-r)/r for 0 < r < 1 + dt time.Duration // minimum run time slice; >= 0 + tr time.Duration // accumulated time running + ts time.Duration // accumulated time stopped + tt time.Time // earliest throttle time (= time Throttle returned + tm) +} + +// NewThrottle creates a new Throttle with a throttle value r and +// a minimum allocated run time slice of dt: +// +// r == 0: "empty" throttle; the goroutine is always sleeping +// r == 1: full throttle; the goroutine is never sleeping +// +// A value of r == 0.6 throttles a goroutine such that it runs +// approx. 60% of the time, and sleeps approx. 40% of the time. +// Values of r < 0 or r > 1 are clamped down to values between 0 and 1. +// Values of dt < 0 are set to 0. +// +func NewThrottle(r float64, dt time.Duration) *Throttle { + var f float64 + switch { + case r <= 0: + f = -1 // indicates always sleep + case r >= 1: + f = 0 // assume r == 1 (never sleep) + default: + // 0 < r < 1 + f = (1 - r) / r + } + if dt < 0 { + dt = 0 + } + return &Throttle{f: f, dt: dt, tt: time.Now().Add(dt)} +} + +// Throttle calls time.Sleep such that over time the ratio tr/ts between +// accumulated run (tr) and sleep times (ts) approximates the value 1/(1-r) +// where r is the throttle value. Throttle returns immediately (w/o sleeping) +// if less than tm ns have passed since the last call to Throttle. +// +func (p *Throttle) Throttle() { + if p.f < 0 { + select {} // always sleep + } + + t0 := time.Now() + if t0.Before(p.tt) { + return // keep running (minimum time slice not exhausted yet) + } + + // accumulate running time + p.tr += t0.Sub(p.tt) + p.dt + + // compute sleep time + // Over time we want: + // + // tr/ts = r/(1-r) + // + // Thus: + // + // ts = tr*f with f = (1-r)/r + // + // After some incremental run time δr added to the total run time + // tr, the incremental sleep-time δs to get to the same ratio again + // after waking up from time.Sleep is: + if δs := time.Duration(float64(p.tr)*p.f) - p.ts; δs > 0 { + time.Sleep(δs) + } + + // accumulate (actual) sleep time + t1 := time.Now() + p.ts += t1.Sub(t0) + + // set earliest next throttle time + p.tt = t1.Add(p.dt) +} diff --git a/vendor/golang.org/x/tools/godoc/util/util.go b/vendor/golang.org/x/tools/godoc/util/util.go new file mode 100644 index 0000000000..feedb7688a --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/util/util.go @@ -0,0 +1,89 @@ +// Copyright 2013 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 util contains utility types and functions for godoc. +package util // import "golang.org/x/tools/godoc/util" + +import ( + pathpkg "path" + "sync" + "time" + "unicode/utf8" + + "golang.org/x/tools/godoc/vfs" +) + +// An RWValue wraps a value and permits mutually exclusive +// access to it and records the time the value was last set. +type RWValue struct { + mutex sync.RWMutex + value interface{} + timestamp time.Time // time of last set() +} + +func (v *RWValue) Set(value interface{}) { + v.mutex.Lock() + v.value = value + v.timestamp = time.Now() + v.mutex.Unlock() +} + +func (v *RWValue) Get() (interface{}, time.Time) { + v.mutex.RLock() + defer v.mutex.RUnlock() + return v.value, v.timestamp +} + +// IsText reports whether a significant prefix of s looks like correct UTF-8; +// that is, if it is likely that s is human-readable text. +func IsText(s []byte) bool { + const max = 1024 // at least utf8.UTFMax + if len(s) > max { + s = s[0:max] + } + for i, c := range string(s) { + if i+utf8.UTFMax > len(s) { + // last char may be incomplete - ignore + break + } + if c == 0xFFFD || c < ' ' && c != '\n' && c != '\t' && c != '\f' { + // decoding error or control character - not a text file + return false + } + } + return true +} + +// textExt[x] is true if the extension x indicates a text file, and false otherwise. +var textExt = map[string]bool{ + ".css": false, // must be served raw + ".js": false, // must be served raw +} + +// IsTextFile reports whether the file has a known extension indicating +// a text file, or if a significant chunk of the specified file looks like +// correct UTF-8; that is, if it is likely that the file contains human- +// readable text. +func IsTextFile(fs vfs.Opener, filename string) bool { + // if the extension is known, use it for decision making + if isText, found := textExt[pathpkg.Ext(filename)]; found { + return isText + } + + // the extension is not known; read an initial chunk + // of the file and check if it looks like text + f, err := fs.Open(filename) + if err != nil { + return false + } + defer f.Close() + + var buf [1024]byte + n, err := f.Read(buf[0:]) + if err != nil { + return false + } + + return IsText(buf[0:n]) +} diff --git a/vendor/golang.org/x/tools/godoc/vfs/emptyvfs.go b/vendor/golang.org/x/tools/godoc/vfs/emptyvfs.go new file mode 100644 index 0000000000..01b6942f0a --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/vfs/emptyvfs.go @@ -0,0 +1,85 @@ +// Copyright 2016 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 vfs + +import ( + "fmt" + "os" + "time" +) + +// NewNameSpace returns a NameSpace pre-initialized with an empty +// emulated directory mounted on the root mount point "/". This +// allows directory traversal routines to work properly even if +// a folder is not explicitly mounted at root by the user. +func NewNameSpace() NameSpace { + ns := NameSpace{} + ns.Bind("/", &emptyVFS{}, "/", BindReplace) + return ns +} + +// type emptyVFS emulates a FileSystem consisting of an empty directory +type emptyVFS struct{} + +// Open implements Opener. Since emptyVFS is an empty directory, all +// attempts to open a file should returns errors. +func (e *emptyVFS) Open(path string) (ReadSeekCloser, error) { + if path == "/" { + return nil, fmt.Errorf("open: / is a directory") + } + return nil, os.ErrNotExist +} + +// Stat returns os.FileInfo for an empty directory if the path is +// is root "/" or error. os.FileInfo is implemented by emptyVFS +func (e *emptyVFS) Stat(path string) (os.FileInfo, error) { + if path == "/" { + return e, nil + } + return nil, os.ErrNotExist +} + +func (e *emptyVFS) Lstat(path string) (os.FileInfo, error) { + return e.Stat(path) +} + +// ReadDir returns an empty os.FileInfo slice for "/", else error. +func (e *emptyVFS) ReadDir(path string) ([]os.FileInfo, error) { + if path == "/" { + return []os.FileInfo{}, nil + } + return nil, os.ErrNotExist +} + +func (e *emptyVFS) String() string { + return "emptyVFS(/)" +} + +// These functions below implement os.FileInfo for the single +// empty emulated directory. + +func (e *emptyVFS) Name() string { + return "/" +} + +func (e *emptyVFS) Size() int64 { + return 0 +} + +func (e *emptyVFS) Mode() os.FileMode { + return os.ModeDir | os.ModePerm +} + +func (e *emptyVFS) ModTime() time.Time { + return time.Time{} +} + +func (e *emptyVFS) IsDir() bool { + return true +} + +func (e *emptyVFS) Sys() interface{} { + return nil +} diff --git a/vendor/golang.org/x/tools/godoc/vfs/emptyvfs_test.go b/vendor/golang.org/x/tools/godoc/vfs/emptyvfs_test.go new file mode 100644 index 0000000000..2d8d72e6ba --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/vfs/emptyvfs_test.go @@ -0,0 +1,57 @@ +// Copyright 2016 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 vfs_test + +import ( + "golang.org/x/tools/godoc/vfs" + "golang.org/x/tools/godoc/vfs/mapfs" + "testing" + "time" +) + +func TestNewNameSpace(t *testing.T) { + + // We will mount this filesystem under /fs1 + mount := mapfs.New(map[string]string{"fs1file": "abcdefgh"}) + + // Existing process. This should give error on Stat("/") + t1 := vfs.NameSpace{} + t1.Bind("/fs1", mount, "/", vfs.BindReplace) + + // using NewNameSpace. This should work fine. + t2 := vfs.NewNameSpace() + t2.Bind("/fs1", mount, "/", vfs.BindReplace) + + testcases := map[string][]bool{ + "/": []bool{false, true}, + "/fs1": []bool{true, true}, + "/fs1/fs1file": []bool{true, true}, + } + + fss := []vfs.FileSystem{t1, t2} + + for j, fs := range fss { + for k, v := range testcases { + _, err := fs.Stat(k) + result := err == nil + if result != v[j] { + t.Errorf("fs: %d, testcase: %s, want: %v, got: %v, err: %s", j, k, v[j], result, err) + } + } + } + + fi, err := t2.Stat("/") + if err != nil { + t.Fatal(err) + } + + if fi.Name() != "/" { + t.Errorf("t2.Name() : want:%s got:%s", "/", fi.Name()) + } + + if !fi.ModTime().IsZero() { + t.Errorf("t2.Modime() : want:%v got:%v", time.Time{}, fi.ModTime()) + } +} diff --git a/vendor/golang.org/x/tools/godoc/vfs/gatefs/gatefs.go b/vendor/golang.org/x/tools/godoc/vfs/gatefs/gatefs.go new file mode 100644 index 0000000000..7045a5cadd --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/vfs/gatefs/gatefs.go @@ -0,0 +1,89 @@ +// Copyright 2013 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 gatefs provides an implementation of the FileSystem +// interface that wraps another FileSystem and limits its concurrency. +package gatefs // import "golang.org/x/tools/godoc/vfs/gatefs" + +import ( + "fmt" + "os" + + "golang.org/x/tools/godoc/vfs" +) + +// New returns a new FileSystem that delegates to fs. +// If gateCh is non-nil and buffered, it's used as a gate +// to limit concurrency on calls to fs. +func New(fs vfs.FileSystem, gateCh chan bool) vfs.FileSystem { + if cap(gateCh) == 0 { + return fs + } + return gatefs{fs, gate(gateCh)} +} + +type gate chan bool + +func (g gate) enter() { g <- true } +func (g gate) leave() { <-g } + +type gatefs struct { + fs vfs.FileSystem + gate +} + +func (fs gatefs) String() string { + return fmt.Sprintf("gated(%s, %d)", fs.fs.String(), cap(fs.gate)) +} + +func (fs gatefs) Open(p string) (vfs.ReadSeekCloser, error) { + fs.enter() + defer fs.leave() + rsc, err := fs.fs.Open(p) + if err != nil { + return nil, err + } + return gatef{rsc, fs.gate}, nil +} + +func (fs gatefs) Lstat(p string) (os.FileInfo, error) { + fs.enter() + defer fs.leave() + return fs.fs.Lstat(p) +} + +func (fs gatefs) Stat(p string) (os.FileInfo, error) { + fs.enter() + defer fs.leave() + return fs.fs.Stat(p) +} + +func (fs gatefs) ReadDir(p string) ([]os.FileInfo, error) { + fs.enter() + defer fs.leave() + return fs.fs.ReadDir(p) +} + +type gatef struct { + rsc vfs.ReadSeekCloser + gate +} + +func (f gatef) Read(p []byte) (n int, err error) { + f.enter() + defer f.leave() + return f.rsc.Read(p) +} + +func (f gatef) Seek(offset int64, whence int) (ret int64, err error) { + f.enter() + defer f.leave() + return f.rsc.Seek(offset, whence) +} + +func (f gatef) Close() error { + f.enter() + defer f.leave() + return f.rsc.Close() +} diff --git a/vendor/golang.org/x/tools/godoc/vfs/httpfs/httpfs.go b/vendor/golang.org/x/tools/godoc/vfs/httpfs/httpfs.go new file mode 100644 index 0000000000..f232f03ffd --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/vfs/httpfs/httpfs.go @@ -0,0 +1,94 @@ +// Copyright 2013 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 httpfs implements http.FileSystem using a godoc vfs.FileSystem. +package httpfs // import "golang.org/x/tools/godoc/vfs/httpfs" + +import ( + "fmt" + "io" + "net/http" + "os" + + "golang.org/x/tools/godoc/vfs" +) + +func New(fs vfs.FileSystem) http.FileSystem { + return &httpFS{fs} +} + +type httpFS struct { + fs vfs.FileSystem +} + +func (h *httpFS) Open(name string) (http.File, error) { + fi, err := h.fs.Stat(name) + if err != nil { + return nil, err + } + if fi.IsDir() { + return &httpDir{h.fs, name, nil}, nil + } + f, err := h.fs.Open(name) + if err != nil { + return nil, err + } + return &httpFile{h.fs, f, name}, nil +} + +// httpDir implements http.File for a directory in a FileSystem. +type httpDir struct { + fs vfs.FileSystem + name string + pending []os.FileInfo +} + +func (h *httpDir) Close() error { return nil } +func (h *httpDir) Stat() (os.FileInfo, error) { return h.fs.Stat(h.name) } +func (h *httpDir) Read([]byte) (int, error) { + return 0, fmt.Errorf("cannot Read from directory %s", h.name) +} + +func (h *httpDir) Seek(offset int64, whence int) (int64, error) { + if offset == 0 && whence == 0 { + h.pending = nil + return 0, nil + } + return 0, fmt.Errorf("unsupported Seek in directory %s", h.name) +} + +func (h *httpDir) Readdir(count int) ([]os.FileInfo, error) { + if h.pending == nil { + d, err := h.fs.ReadDir(h.name) + if err != nil { + return nil, err + } + if d == nil { + d = []os.FileInfo{} // not nil + } + h.pending = d + } + + if len(h.pending) == 0 && count > 0 { + return nil, io.EOF + } + if count <= 0 || count > len(h.pending) { + count = len(h.pending) + } + d := h.pending[:count] + h.pending = h.pending[count:] + return d, nil +} + +// httpFile implements http.File for a file (not directory) in a FileSystem. +type httpFile struct { + fs vfs.FileSystem + vfs.ReadSeekCloser + name string +} + +func (h *httpFile) Stat() (os.FileInfo, error) { return h.fs.Stat(h.name) } +func (h *httpFile) Readdir(int) ([]os.FileInfo, error) { + return nil, fmt.Errorf("cannot Readdir from file %s", h.name) +} diff --git a/vendor/golang.org/x/tools/godoc/vfs/mapfs/mapfs.go b/vendor/golang.org/x/tools/godoc/vfs/mapfs/mapfs.go new file mode 100644 index 0000000000..660b1ca787 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/vfs/mapfs/mapfs.go @@ -0,0 +1,152 @@ +// Copyright 2013 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 mapfs file provides an implementation of the FileSystem +// interface based on the contents of a map[string]string. +package mapfs // import "golang.org/x/tools/godoc/vfs/mapfs" + +import ( + "io" + "os" + pathpkg "path" + "sort" + "strings" + "time" + + "golang.org/x/tools/godoc/vfs" +) + +// New returns a new FileSystem from the provided map. +// Map keys should be forward slash-separated pathnames +// and not contain a leading slash. +func New(m map[string]string) vfs.FileSystem { + return mapFS(m) +} + +// mapFS is the map based implementation of FileSystem +type mapFS map[string]string + +func (fs mapFS) String() string { return "mapfs" } + +func (fs mapFS) Close() error { return nil } + +func filename(p string) string { + return strings.TrimPrefix(p, "/") +} + +func (fs mapFS) Open(p string) (vfs.ReadSeekCloser, error) { + b, ok := fs[filename(p)] + if !ok { + return nil, os.ErrNotExist + } + return nopCloser{strings.NewReader(b)}, nil +} + +func fileInfo(name, contents string) os.FileInfo { + return mapFI{name: pathpkg.Base(name), size: len(contents)} +} + +func dirInfo(name string) os.FileInfo { + return mapFI{name: pathpkg.Base(name), dir: true} +} + +func (fs mapFS) Lstat(p string) (os.FileInfo, error) { + b, ok := fs[filename(p)] + if ok { + return fileInfo(p, b), nil + } + ents, _ := fs.ReadDir(p) + if len(ents) > 0 { + return dirInfo(p), nil + } + return nil, os.ErrNotExist +} + +func (fs mapFS) Stat(p string) (os.FileInfo, error) { + return fs.Lstat(p) +} + +// slashdir returns path.Dir(p), but special-cases paths not beginning +// with a slash to be in the root. +func slashdir(p string) string { + d := pathpkg.Dir(p) + if d == "." { + return "/" + } + if strings.HasPrefix(p, "/") { + return d + } + return "/" + d +} + +func (fs mapFS) ReadDir(p string) ([]os.FileInfo, error) { + p = pathpkg.Clean(p) + var ents []string + fim := make(map[string]os.FileInfo) // base -> fi + for fn, b := range fs { + dir := slashdir(fn) + isFile := true + var lastBase string + for { + if dir == p { + base := lastBase + if isFile { + base = pathpkg.Base(fn) + } + if fim[base] == nil { + var fi os.FileInfo + if isFile { + fi = fileInfo(fn, b) + } else { + fi = dirInfo(base) + } + ents = append(ents, base) + fim[base] = fi + } + } + if dir == "/" { + break + } else { + isFile = false + lastBase = pathpkg.Base(dir) + dir = pathpkg.Dir(dir) + } + } + } + if len(ents) == 0 { + return nil, os.ErrNotExist + } + + sort.Strings(ents) + var list []os.FileInfo + for _, dir := range ents { + list = append(list, fim[dir]) + } + return list, nil +} + +// mapFI is the map-based implementation of FileInfo. +type mapFI struct { + name string + size int + dir bool +} + +func (fi mapFI) IsDir() bool { return fi.dir } +func (fi mapFI) ModTime() time.Time { return time.Time{} } +func (fi mapFI) Mode() os.FileMode { + if fi.IsDir() { + return 0755 | os.ModeDir + } + return 0444 +} +func (fi mapFI) Name() string { return pathpkg.Base(fi.name) } +func (fi mapFI) Size() int64 { return int64(fi.size) } +func (fi mapFI) Sys() interface{} { return nil } + +type nopCloser struct { + io.ReadSeeker +} + +func (nc nopCloser) Close() error { return nil } diff --git a/vendor/golang.org/x/tools/godoc/vfs/mapfs/mapfs_test.go b/vendor/golang.org/x/tools/godoc/vfs/mapfs/mapfs_test.go new file mode 100644 index 0000000000..6b7db290ee --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/vfs/mapfs/mapfs_test.go @@ -0,0 +1,111 @@ +// Copyright 2013 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 mapfs + +import ( + "io/ioutil" + "os" + "reflect" + "testing" +) + +func TestOpenRoot(t *testing.T) { + fs := New(map[string]string{ + "foo/bar/three.txt": "a", + "foo/bar.txt": "b", + "top.txt": "c", + "other-top.txt": "d", + }) + tests := []struct { + path string + want string + }{ + {"/foo/bar/three.txt", "a"}, + {"foo/bar/three.txt", "a"}, + {"foo/bar.txt", "b"}, + {"top.txt", "c"}, + {"/top.txt", "c"}, + {"other-top.txt", "d"}, + {"/other-top.txt", "d"}, + } + for _, tt := range tests { + rsc, err := fs.Open(tt.path) + if err != nil { + t.Errorf("Open(%q) = %v", tt.path, err) + continue + } + slurp, err := ioutil.ReadAll(rsc) + if err != nil { + t.Error(err) + } + if string(slurp) != tt.want { + t.Errorf("Read(%q) = %q; want %q", tt.path, tt.want, slurp) + } + rsc.Close() + } + + _, err := fs.Open("/xxxx") + if !os.IsNotExist(err) { + t.Errorf("ReadDir /xxxx = %v; want os.IsNotExist error", err) + } +} + +func TestReaddir(t *testing.T) { + fs := New(map[string]string{ + "foo/bar/three.txt": "333", + "foo/bar.txt": "22", + "top.txt": "top.txt file", + "other-top.txt": "other-top.txt file", + }) + tests := []struct { + dir string + want []os.FileInfo + }{ + { + dir: "/", + want: []os.FileInfo{ + mapFI{name: "foo", dir: true}, + mapFI{name: "other-top.txt", size: len("other-top.txt file")}, + mapFI{name: "top.txt", size: len("top.txt file")}, + }, + }, + { + dir: "/foo", + want: []os.FileInfo{ + mapFI{name: "bar", dir: true}, + mapFI{name: "bar.txt", size: 2}, + }, + }, + { + dir: "/foo/", + want: []os.FileInfo{ + mapFI{name: "bar", dir: true}, + mapFI{name: "bar.txt", size: 2}, + }, + }, + { + dir: "/foo/bar", + want: []os.FileInfo{ + mapFI{name: "three.txt", size: 3}, + }, + }, + } + for _, tt := range tests { + fis, err := fs.ReadDir(tt.dir) + if err != nil { + t.Errorf("ReadDir(%q) = %v", tt.dir, err) + continue + } + if !reflect.DeepEqual(fis, tt.want) { + t.Errorf("ReadDir(%q) = %#v; want %#v", tt.dir, fis, tt.want) + continue + } + } + + _, err := fs.ReadDir("/xxxx") + if !os.IsNotExist(err) { + t.Errorf("ReadDir /xxxx = %v; want os.IsNotExist error", err) + } +} diff --git a/vendor/golang.org/x/tools/godoc/vfs/namespace.go b/vendor/golang.org/x/tools/godoc/vfs/namespace.go new file mode 100644 index 0000000000..5a31fe61ea --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/vfs/namespace.go @@ -0,0 +1,386 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package vfs + +import ( + "fmt" + "io" + "os" + pathpkg "path" + "sort" + "strings" + "time" +) + +// Setting debugNS = true will enable debugging prints about +// name space translations. +const debugNS = false + +// A NameSpace is a file system made up of other file systems +// mounted at specific locations in the name space. +// +// The representation is a map from mount point locations +// to the list of file systems mounted at that location. A traditional +// Unix mount table would use a single file system per mount point, +// but we want to be able to mount multiple file systems on a single +// mount point and have the system behave as if the union of those +// file systems were present at the mount point. +// For example, if the OS file system has a Go installation in +// c:\Go and additional Go path trees in d:\Work1 and d:\Work2, then +// this name space creates the view we want for the godoc server: +// +// NameSpace{ +// "/": { +// {old: "/", fs: OS(`c:\Go`), new: "/"}, +// }, +// "/src/pkg": { +// {old: "/src/pkg", fs: OS(`c:\Go`), new: "/src/pkg"}, +// {old: "/src/pkg", fs: OS(`d:\Work1`), new: "/src"}, +// {old: "/src/pkg", fs: OS(`d:\Work2`), new: "/src"}, +// }, +// } +// +// This is created by executing: +// +// ns := NameSpace{} +// ns.Bind("/", OS(`c:\Go`), "/", BindReplace) +// ns.Bind("/src/pkg", OS(`d:\Work1`), "/src", BindAfter) +// ns.Bind("/src/pkg", OS(`d:\Work2`), "/src", BindAfter) +// +// A particular mount point entry is a triple (old, fs, new), meaning that to +// operate on a path beginning with old, replace that prefix (old) with new +// and then pass that path to the FileSystem implementation fs. +// +// If you do not explicitly mount a FileSystem at the root mountpoint "/" of the +// NameSpace like above, Stat("/") will return a "not found" error which could +// break typical directory traversal routines. In such cases, use NewNameSpace() +// to get a NameSpace pre-initialized with an emulated empty directory at root. +// +// Given this name space, a ReadDir of /src/pkg/code will check each prefix +// of the path for a mount point (first /src/pkg/code, then /src/pkg, then /src, +// then /), stopping when it finds one. For the above example, /src/pkg/code +// will find the mount point at /src/pkg: +// +// {old: "/src/pkg", fs: OS(`c:\Go`), new: "/src/pkg"}, +// {old: "/src/pkg", fs: OS(`d:\Work1`), new: "/src"}, +// {old: "/src/pkg", fs: OS(`d:\Work2`), new: "/src"}, +// +// ReadDir will when execute these three calls and merge the results: +// +// OS(`c:\Go`).ReadDir("/src/pkg/code") +// OS(`d:\Work1').ReadDir("/src/code") +// OS(`d:\Work2').ReadDir("/src/code") +// +// Note that the "/src/pkg" in "/src/pkg/code" has been replaced by +// just "/src" in the final two calls. +// +// OS is itself an implementation of a file system: it implements +// OS(`c:\Go`).ReadDir("/src/pkg/code") as ioutil.ReadDir(`c:\Go\src\pkg\code`). +// +// Because the new path is evaluated by fs (here OS(root)), another way +// to read the mount table is to mentally combine fs+new, so that this table: +// +// {old: "/src/pkg", fs: OS(`c:\Go`), new: "/src/pkg"}, +// {old: "/src/pkg", fs: OS(`d:\Work1`), new: "/src"}, +// {old: "/src/pkg", fs: OS(`d:\Work2`), new: "/src"}, +// +// reads as: +// +// "/src/pkg" -> c:\Go\src\pkg +// "/src/pkg" -> d:\Work1\src +// "/src/pkg" -> d:\Work2\src +// +// An invariant (a redundancy) of the name space representation is that +// ns[mtpt][i].old is always equal to mtpt (in the example, ns["/src/pkg"]'s +// mount table entries always have old == "/src/pkg"). The 'old' field is +// useful to callers, because they receive just a []mountedFS and not any +// other indication of which mount point was found. +// +type NameSpace map[string][]mountedFS + +// A mountedFS handles requests for path by replacing +// a prefix 'old' with 'new' and then calling the fs methods. +type mountedFS struct { + old string + fs FileSystem + new string +} + +// hasPathPrefix returns true if x == y or x == y + "/" + more +func hasPathPrefix(x, y string) bool { + return x == y || strings.HasPrefix(x, y) && (strings.HasSuffix(y, "/") || strings.HasPrefix(x[len(y):], "/")) +} + +// translate translates path for use in m, replacing old with new. +// +// mountedFS{"/src/pkg", fs, "/src"}.translate("/src/pkg/code") == "/src/code". +func (m mountedFS) translate(path string) string { + path = pathpkg.Clean("/" + path) + if !hasPathPrefix(path, m.old) { + panic("translate " + path + " but old=" + m.old) + } + return pathpkg.Join(m.new, path[len(m.old):]) +} + +func (NameSpace) String() string { + return "ns" +} + +// Fprint writes a text representation of the name space to w. +func (ns NameSpace) Fprint(w io.Writer) { + fmt.Fprint(w, "name space {\n") + var all []string + for mtpt := range ns { + all = append(all, mtpt) + } + sort.Strings(all) + for _, mtpt := range all { + fmt.Fprintf(w, "\t%s:\n", mtpt) + for _, m := range ns[mtpt] { + fmt.Fprintf(w, "\t\t%s %s\n", m.fs, m.new) + } + } + fmt.Fprint(w, "}\n") +} + +// clean returns a cleaned, rooted path for evaluation. +// It canonicalizes the path so that we can use string operations +// to analyze it. +func (NameSpace) clean(path string) string { + return pathpkg.Clean("/" + path) +} + +type BindMode int + +const ( + BindReplace BindMode = iota + BindBefore + BindAfter +) + +// Bind causes references to old to redirect to the path new in newfs. +// If mode is BindReplace, old redirections are discarded. +// If mode is BindBefore, this redirection takes priority over existing ones, +// but earlier ones are still consulted for paths that do not exist in newfs. +// If mode is BindAfter, this redirection happens only after existing ones +// have been tried and failed. +func (ns NameSpace) Bind(old string, newfs FileSystem, new string, mode BindMode) { + old = ns.clean(old) + new = ns.clean(new) + m := mountedFS{old, newfs, new} + var mtpt []mountedFS + switch mode { + case BindReplace: + mtpt = append(mtpt, m) + case BindAfter: + mtpt = append(mtpt, ns.resolve(old)...) + mtpt = append(mtpt, m) + case BindBefore: + mtpt = append(mtpt, m) + mtpt = append(mtpt, ns.resolve(old)...) + } + + // Extend m.old, m.new in inherited mount point entries. + for i := range mtpt { + m := &mtpt[i] + if m.old != old { + if !hasPathPrefix(old, m.old) { + // This should not happen. If it does, panic so + // that we can see the call trace that led to it. + panic(fmt.Sprintf("invalid Bind: old=%q m={%q, %s, %q}", old, m.old, m.fs.String(), m.new)) + } + suffix := old[len(m.old):] + m.old = pathpkg.Join(m.old, suffix) + m.new = pathpkg.Join(m.new, suffix) + } + } + + ns[old] = mtpt +} + +// resolve resolves a path to the list of mountedFS to use for path. +func (ns NameSpace) resolve(path string) []mountedFS { + path = ns.clean(path) + for { + if m := ns[path]; m != nil { + if debugNS { + fmt.Printf("resolve %s: %v\n", path, m) + } + return m + } + if path == "/" { + break + } + path = pathpkg.Dir(path) + } + return nil +} + +// Open implements the FileSystem Open method. +func (ns NameSpace) Open(path string) (ReadSeekCloser, error) { + var err error + for _, m := range ns.resolve(path) { + if debugNS { + fmt.Printf("tx %s: %v\n", path, m.translate(path)) + } + r, err1 := m.fs.Open(m.translate(path)) + if err1 == nil { + return r, nil + } + if err == nil { + err = err1 + } + } + if err == nil { + err = &os.PathError{Op: "open", Path: path, Err: os.ErrNotExist} + } + return nil, err +} + +// stat implements the FileSystem Stat and Lstat methods. +func (ns NameSpace) stat(path string, f func(FileSystem, string) (os.FileInfo, error)) (os.FileInfo, error) { + var err error + for _, m := range ns.resolve(path) { + fi, err1 := f(m.fs, m.translate(path)) + if err1 == nil { + return fi, nil + } + if err == nil { + err = err1 + } + } + if err == nil { + err = &os.PathError{Op: "stat", Path: path, Err: os.ErrNotExist} + } + return nil, err +} + +func (ns NameSpace) Stat(path string) (os.FileInfo, error) { + return ns.stat(path, FileSystem.Stat) +} + +func (ns NameSpace) Lstat(path string) (os.FileInfo, error) { + return ns.stat(path, FileSystem.Lstat) +} + +// dirInfo is a trivial implementation of os.FileInfo for a directory. +type dirInfo string + +func (d dirInfo) Name() string { return string(d) } +func (d dirInfo) Size() int64 { return 0 } +func (d dirInfo) Mode() os.FileMode { return os.ModeDir | 0555 } +func (d dirInfo) ModTime() time.Time { return startTime } +func (d dirInfo) IsDir() bool { return true } +func (d dirInfo) Sys() interface{} { return nil } + +var startTime = time.Now() + +// ReadDir implements the FileSystem ReadDir method. It's where most of the magic is. +// (The rest is in resolve.) +// +// Logically, ReadDir must return the union of all the directories that are named +// by path. In order to avoid misinterpreting Go packages, of all the directories +// that contain Go source code, we only include the files from the first, +// but we include subdirectories from all. +// +// ReadDir must also return directory entries needed to reach mount points. +// If the name space looks like the example in the type NameSpace comment, +// but c:\Go does not have a src/pkg subdirectory, we still want to be able +// to find that subdirectory, because we've mounted d:\Work1 and d:\Work2 +// there. So if we don't see "src" in the directory listing for c:\Go, we add an +// entry for it before returning. +// +func (ns NameSpace) ReadDir(path string) ([]os.FileInfo, error) { + path = ns.clean(path) + + var ( + haveGo = false + haveName = map[string]bool{} + all []os.FileInfo + err error + first []os.FileInfo + ) + + for _, m := range ns.resolve(path) { + dir, err1 := m.fs.ReadDir(m.translate(path)) + if err1 != nil { + if err == nil { + err = err1 + } + continue + } + + if dir == nil { + dir = []os.FileInfo{} + } + + if first == nil { + first = dir + } + + // If we don't yet have Go files in 'all' and this directory + // has some, add all the files from this directory. + // Otherwise, only add subdirectories. + useFiles := false + if !haveGo { + for _, d := range dir { + if strings.HasSuffix(d.Name(), ".go") { + useFiles = true + haveGo = true + break + } + } + } + + for _, d := range dir { + name := d.Name() + if (d.IsDir() || useFiles) && !haveName[name] { + haveName[name] = true + all = append(all, d) + } + } + } + + // We didn't find any directories containing Go files. + // If some directory returned successfully, use that. + if !haveGo { + for _, d := range first { + if !haveName[d.Name()] { + haveName[d.Name()] = true + all = append(all, d) + } + } + } + + // Built union. Add any missing directories needed to reach mount points. + for old := range ns { + if hasPathPrefix(old, path) && old != path { + // Find next element after path in old. + elem := old[len(path):] + elem = strings.TrimPrefix(elem, "/") + if i := strings.Index(elem, "/"); i >= 0 { + elem = elem[:i] + } + if !haveName[elem] { + haveName[elem] = true + all = append(all, dirInfo(elem)) + } + } + } + + if len(all) == 0 { + return nil, err + } + + sort.Sort(byName(all)) + return all, nil +} + +// byName implements sort.Interface. +type byName []os.FileInfo + +func (f byName) Len() int { return len(f) } +func (f byName) Less(i, j int) bool { return f[i].Name() < f[j].Name() } +func (f byName) Swap(i, j int) { f[i], f[j] = f[j], f[i] } diff --git a/vendor/golang.org/x/tools/godoc/vfs/os.go b/vendor/golang.org/x/tools/godoc/vfs/os.go new file mode 100644 index 0000000000..fa98142484 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/vfs/os.go @@ -0,0 +1,65 @@ +// Copyright 2013 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 vfs + +import ( + "fmt" + "io/ioutil" + "os" + pathpkg "path" + "path/filepath" +) + +// OS returns an implementation of FileSystem reading from the +// tree rooted at root. Recording a root is convenient everywhere +// but necessary on Windows, because the slash-separated path +// passed to Open has no way to specify a drive letter. Using a root +// lets code refer to OS(`c:\`), OS(`d:\`) and so on. +func OS(root string) FileSystem { + return osFS(root) +} + +type osFS string + +func (root osFS) String() string { return "os(" + string(root) + ")" } + +func (root osFS) resolve(path string) string { + // Clean the path so that it cannot possibly begin with ../. + // If it did, the result of filepath.Join would be outside the + // tree rooted at root. We probably won't ever see a path + // with .. in it, but be safe anyway. + path = pathpkg.Clean("/" + path) + + return filepath.Join(string(root), path) +} + +func (root osFS) Open(path string) (ReadSeekCloser, error) { + f, err := os.Open(root.resolve(path)) + if err != nil { + return nil, err + } + fi, err := f.Stat() + if err != nil { + f.Close() + return nil, err + } + if fi.IsDir() { + f.Close() + return nil, fmt.Errorf("Open: %s is a directory", path) + } + return f, nil +} + +func (root osFS) Lstat(path string) (os.FileInfo, error) { + return os.Lstat(root.resolve(path)) +} + +func (root osFS) Stat(path string) (os.FileInfo, error) { + return os.Stat(root.resolve(path)) +} + +func (root osFS) ReadDir(path string) ([]os.FileInfo, error) { + return ioutil.ReadDir(root.resolve(path)) // is sorted +} diff --git a/vendor/golang.org/x/tools/godoc/vfs/vfs.go b/vendor/golang.org/x/tools/godoc/vfs/vfs.go new file mode 100644 index 0000000000..ad06b1a1d5 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/vfs/vfs.go @@ -0,0 +1,45 @@ +// Copyright 2013 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 vfs defines types for abstract file system access and provides an +// implementation accessing the file system of the underlying OS. +package vfs // import "golang.org/x/tools/godoc/vfs" + +import ( + "io" + "io/ioutil" + "os" +) + +// The FileSystem interface specifies the methods godoc is using +// to access the file system for which it serves documentation. +type FileSystem interface { + Opener + Lstat(path string) (os.FileInfo, error) + Stat(path string) (os.FileInfo, error) + ReadDir(path string) ([]os.FileInfo, error) + String() string +} + +// Opener is a minimal virtual filesystem that can only open regular files. +type Opener interface { + Open(name string) (ReadSeekCloser, error) +} + +// A ReadSeekCloser can Read, Seek, and Close. +type ReadSeekCloser interface { + io.Reader + io.Seeker + io.Closer +} + +// ReadFile reads the file named by path from fs and returns the contents. +func ReadFile(fs Opener, path string) ([]byte, error) { + rc, err := fs.Open(path) + if err != nil { + return nil, err + } + defer rc.Close() + return ioutil.ReadAll(rc) +} diff --git a/vendor/golang.org/x/tools/godoc/vfs/zipfs/zipfs.go b/vendor/golang.org/x/tools/godoc/vfs/zipfs/zipfs.go new file mode 100644 index 0000000000..e554446e46 --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/vfs/zipfs/zipfs.go @@ -0,0 +1,264 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package zipfs file provides an implementation of the FileSystem +// interface based on the contents of a .zip file. +// +// Assumptions: +// +// - The file paths stored in the zip file must use a slash ('/') as path +// separator; and they must be relative (i.e., they must not start with +// a '/' - this is usually the case if the file was created w/o special +// options). +// - The zip file system treats the file paths found in the zip internally +// like absolute paths w/o a leading '/'; i.e., the paths are considered +// relative to the root of the file system. +// - All path arguments to file system methods must be absolute paths. +package zipfs // import "golang.org/x/tools/godoc/vfs/zipfs" + +import ( + "archive/zip" + "fmt" + "io" + "os" + "path" + "sort" + "strings" + "time" + + "golang.org/x/tools/godoc/vfs" +) + +// zipFI is the zip-file based implementation of FileInfo +type zipFI struct { + name string // directory-local name + file *zip.File // nil for a directory +} + +func (fi zipFI) Name() string { + return fi.name +} + +func (fi zipFI) Size() int64 { + if f := fi.file; f != nil { + return int64(f.UncompressedSize) + } + return 0 // directory +} + +func (fi zipFI) ModTime() time.Time { + if f := fi.file; f != nil { + return f.ModTime() + } + return time.Time{} // directory has no modified time entry +} + +func (fi zipFI) Mode() os.FileMode { + if fi.file == nil { + // Unix directories typically are executable, hence 555. + return os.ModeDir | 0555 + } + return 0444 +} + +func (fi zipFI) IsDir() bool { + return fi.file == nil +} + +func (fi zipFI) Sys() interface{} { + return nil +} + +// zipFS is the zip-file based implementation of FileSystem +type zipFS struct { + *zip.ReadCloser + list zipList + name string +} + +func (fs *zipFS) String() string { + return "zip(" + fs.name + ")" +} + +func (fs *zipFS) Close() error { + fs.list = nil + return fs.ReadCloser.Close() +} + +func zipPath(name string) (string, error) { + name = path.Clean(name) + if !path.IsAbs(name) { + return "", fmt.Errorf("stat: not an absolute path: %s", name) + } + return name[1:], nil // strip leading '/' +} + +func isRoot(abspath string) bool { + return path.Clean(abspath) == "/" +} + +func (fs *zipFS) stat(abspath string) (int, zipFI, error) { + if isRoot(abspath) { + return 0, zipFI{ + name: "", + file: nil, + }, nil + } + zippath, err := zipPath(abspath) + if err != nil { + return 0, zipFI{}, err + } + i, exact := fs.list.lookup(zippath) + if i < 0 { + // zippath has leading '/' stripped - print it explicitly + return -1, zipFI{}, &os.PathError{Path: "/" + zippath, Err: os.ErrNotExist} + } + _, name := path.Split(zippath) + var file *zip.File + if exact { + file = fs.list[i] // exact match found - must be a file + } + return i, zipFI{name, file}, nil +} + +func (fs *zipFS) Open(abspath string) (vfs.ReadSeekCloser, error) { + _, fi, err := fs.stat(abspath) + if err != nil { + return nil, err + } + if fi.IsDir() { + return nil, fmt.Errorf("Open: %s is a directory", abspath) + } + r, err := fi.file.Open() + if err != nil { + return nil, err + } + return &zipSeek{fi.file, r}, nil +} + +type zipSeek struct { + file *zip.File + io.ReadCloser +} + +func (f *zipSeek) Seek(offset int64, whence int) (int64, error) { + if whence == 0 && offset == 0 { + r, err := f.file.Open() + if err != nil { + return 0, err + } + f.Close() + f.ReadCloser = r + return 0, nil + } + return 0, fmt.Errorf("unsupported Seek in %s", f.file.Name) +} + +func (fs *zipFS) Lstat(abspath string) (os.FileInfo, error) { + _, fi, err := fs.stat(abspath) + return fi, err +} + +func (fs *zipFS) Stat(abspath string) (os.FileInfo, error) { + _, fi, err := fs.stat(abspath) + return fi, err +} + +func (fs *zipFS) ReadDir(abspath string) ([]os.FileInfo, error) { + i, fi, err := fs.stat(abspath) + if err != nil { + return nil, err + } + if !fi.IsDir() { + return nil, fmt.Errorf("ReadDir: %s is not a directory", abspath) + } + + var list []os.FileInfo + + // make dirname the prefix that file names must start with to be considered + // in this directory. we must special case the root directory because, per + // the spec of this package, zip file entries MUST NOT start with /, so we + // should not append /, as we would in every other case. + var dirname string + if isRoot(abspath) { + dirname = "" + } else { + zippath, err := zipPath(abspath) + if err != nil { + return nil, err + } + dirname = zippath + "/" + } + prevname := "" + for _, e := range fs.list[i:] { + if !strings.HasPrefix(e.Name, dirname) { + break // not in the same directory anymore + } + name := e.Name[len(dirname):] // local name + file := e + if i := strings.IndexRune(name, '/'); i >= 0 { + // We infer directories from files in subdirectories. + // If we have x/y, return a directory entry for x. + name = name[0:i] // keep local directory name only + file = nil + } + // If we have x/y and x/z, don't return two directory entries for x. + // TODO(gri): It should be possible to do this more efficiently + // by determining the (fs.list) range of local directory entries + // (via two binary searches). + if name != prevname { + list = append(list, zipFI{name, file}) + prevname = name + } + } + + return list, nil +} + +func New(rc *zip.ReadCloser, name string) vfs.FileSystem { + list := make(zipList, len(rc.File)) + copy(list, rc.File) // sort a copy of rc.File + sort.Sort(list) + return &zipFS{rc, list, name} +} + +type zipList []*zip.File + +// zipList implements sort.Interface +func (z zipList) Len() int { return len(z) } +func (z zipList) Less(i, j int) bool { return z[i].Name < z[j].Name } +func (z zipList) Swap(i, j int) { z[i], z[j] = z[j], z[i] } + +// lookup returns the smallest index of an entry with an exact match +// for name, or an inexact match starting with name/. If there is no +// such entry, the result is -1, false. +func (z zipList) lookup(name string) (index int, exact bool) { + // look for exact match first (name comes before name/ in z) + i := sort.Search(len(z), func(i int) bool { + return name <= z[i].Name + }) + if i >= len(z) { + return -1, false + } + // 0 <= i < len(z) + if z[i].Name == name { + return i, true + } + + // look for inexact match (must be in z[i:], if present) + z = z[i:] + name += "/" + j := sort.Search(len(z), func(i int) bool { + return name <= z[i].Name + }) + if j >= len(z) { + return -1, false + } + // 0 <= j < len(z) + if strings.HasPrefix(z[j].Name, name) { + return i + j, false + } + + return -1, false +} diff --git a/vendor/golang.org/x/tools/godoc/vfs/zipfs/zipfs_test.go b/vendor/golang.org/x/tools/godoc/vfs/zipfs/zipfs_test.go new file mode 100644 index 0000000000..19407e489c --- /dev/null +++ b/vendor/golang.org/x/tools/godoc/vfs/zipfs/zipfs_test.go @@ -0,0 +1,189 @@ +// 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 zipfs +package zipfs + +import ( + "archive/zip" + "bytes" + "fmt" + "io" + "io/ioutil" + "os" + "reflect" + "testing" + + "golang.org/x/tools/godoc/vfs" +) + +var ( + + // files to use to build zip used by zipfs in testing; maps path : contents + files = map[string]string{"foo": "foo", "bar/baz": "baz", "a/b/c": "c"} + + // expected info for each entry in a file system described by files + tests = []struct { + Path string + IsDir bool + IsRegular bool + Name string + Contents string + Files map[string]bool + }{ + {"/", true, false, "", "", map[string]bool{"foo": true, "bar": true, "a": true}}, + {"//", true, false, "", "", map[string]bool{"foo": true, "bar": true, "a": true}}, + {"/foo", false, true, "foo", "foo", nil}, + {"/foo/", false, true, "foo", "foo", nil}, + {"/foo//", false, true, "foo", "foo", nil}, + {"/bar", true, false, "bar", "", map[string]bool{"baz": true}}, + {"/bar/", true, false, "bar", "", map[string]bool{"baz": true}}, + {"/bar/baz", false, true, "baz", "baz", nil}, + {"//bar//baz", false, true, "baz", "baz", nil}, + {"/a/b", true, false, "b", "", map[string]bool{"c": true}}, + } + + // to be initialized in setup() + fs vfs.FileSystem + statFuncs []statFunc +) + +type statFunc struct { + Name string + Func func(string) (os.FileInfo, error) +} + +func TestMain(t *testing.M) { + if err := setup(); err != nil { + fmt.Fprintf(os.Stderr, "Error setting up zipfs testing state: %v.\n", err) + os.Exit(1) + } + os.Exit(t.Run()) +} + +// setups state each of the tests uses +func setup() error { + // create zipfs + b := new(bytes.Buffer) + zw := zip.NewWriter(b) + for file, contents := range files { + w, err := zw.Create(file) + if err != nil { + return err + } + _, err = io.WriteString(w, contents) + if err != nil { + return err + } + } + zw.Close() + zr, err := zip.NewReader(bytes.NewReader(b.Bytes()), int64(b.Len())) + if err != nil { + return err + } + rc := &zip.ReadCloser{ + Reader: *zr, + } + fs = New(rc, "foo") + + // pull out different stat functions + statFuncs = []statFunc{ + {"Stat", fs.Stat}, + {"Lstat", fs.Lstat}, + } + + return nil +} + +func TestZipFSReadDir(t *testing.T) { + for _, test := range tests { + if test.IsDir { + infos, err := fs.ReadDir(test.Path) + if err != nil { + t.Errorf("Failed to read directory %v\n", test.Path) + continue + } + got := make(map[string]bool) + for _, info := range infos { + got[info.Name()] = true + } + if want := test.Files; !reflect.DeepEqual(got, want) { + t.Errorf("ReadDir %v got %v\nwanted %v\n", test.Path, got, want) + } + } + } +} + +func TestZipFSStatFuncs(t *testing.T) { + for _, test := range tests { + for _, statFunc := range statFuncs { + + // test can stat + info, err := statFunc.Func(test.Path) + if err != nil { + t.Errorf("Unexpected error using %v for %v: %v\n", statFunc.Name, test.Path, err) + continue + } + + // test info.Name() + if got, want := info.Name(), test.Name; got != want { + t.Errorf("Using %v for %v info.Name() got %v wanted %v\n", statFunc.Name, test.Path, got, want) + } + // test info.IsDir() + if got, want := info.IsDir(), test.IsDir; got != want { + t.Errorf("Using %v for %v info.IsDir() got %v wanted %v\n", statFunc.Name, test.Path, got, want) + } + // test info.Mode().IsDir() + if got, want := info.Mode().IsDir(), test.IsDir; got != want { + t.Errorf("Using %v for %v info.Mode().IsDir() got %v wanted %v\n", statFunc.Name, test.Path, got, want) + } + // test info.Mode().IsRegular() + if got, want := info.Mode().IsRegular(), test.IsRegular; got != want { + t.Errorf("Using %v for %v info.Mode().IsRegular() got %v wanted %v\n", statFunc.Name, test.Path, got, want) + } + // test info.Size() + if test.IsRegular { + if got, want := info.Size(), int64(len(test.Contents)); got != want { + t.Errorf("Using %v for %v inf.Size() got %v wanted %v", statFunc.Name, test.Path, got, want) + } + } + } + } +} + +func TestZipFSNotExist(t *testing.T) { + _, err := fs.Open("/does-not-exist") + if err == nil { + t.Fatalf("Expected an error.\n") + } + if !os.IsNotExist(err) { + t.Errorf("Expected an error satisfying os.IsNotExist: %v\n", err) + } +} + +func TestZipFSOpenSeek(t *testing.T) { + for _, test := range tests { + if test.IsRegular { + + // test Open() + f, err := fs.Open(test.Path) + if err != nil { + t.Error(err) + return + } + defer f.Close() + + // test Seek() multiple times + for i := 0; i < 3; i++ { + all, err := ioutil.ReadAll(f) + if err != nil { + t.Error(err) + return + } + if got, want := string(all), test.Contents; got != want { + t.Errorf("File contents for %v got %v wanted %v\n", test.Path, got, want) + } + f.Seek(0, 0) + } + } + } +} diff --git a/vendor/golang.org/x/tools/imports/fix.go b/vendor/golang.org/x/tools/imports/fix.go new file mode 100644 index 0000000000..1b0213743c --- /dev/null +++ b/vendor/golang.org/x/tools/imports/fix.go @@ -0,0 +1,419 @@ +// Copyright 2013 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 imports + +import ( + "fmt" + "go/ast" + "go/build" + "go/parser" + "go/token" + "os" + "path" + "path/filepath" + "strings" + "sync" + + "golang.org/x/tools/go/ast/astutil" +) + +// importToGroup is a list of functions which map from an import path to +// a group number. +var importToGroup = []func(importPath string) (num int, ok bool){ + func(importPath string) (num int, ok bool) { + if strings.HasPrefix(importPath, "appengine") { + return 2, true + } + return + }, + func(importPath string) (num int, ok bool) { + if strings.Contains(importPath, ".") { + return 1, true + } + return + }, +} + +func importGroup(importPath string) int { + for _, fn := range importToGroup { + if n, ok := fn(importPath); ok { + return n + } + } + return 0 +} + +func fixImports(fset *token.FileSet, f *ast.File, filename string) (added []string, err error) { + // refs are a set of possible package references currently unsatisfied by imports. + // first key: either base package (e.g. "fmt") or renamed package + // second key: referenced package symbol (e.g. "Println") + refs := make(map[string]map[string]bool) + + // decls are the current package imports. key is base package or renamed package. + decls := make(map[string]*ast.ImportSpec) + + // collect potential uses of packages. + var visitor visitFn + visitor = visitFn(func(node ast.Node) ast.Visitor { + if node == nil { + return visitor + } + switch v := node.(type) { + case *ast.ImportSpec: + if v.Name != nil { + decls[v.Name.Name] = v + } else { + local := importPathToName(strings.Trim(v.Path.Value, `\"`)) + decls[local] = v + } + case *ast.SelectorExpr: + xident, ok := v.X.(*ast.Ident) + if !ok { + break + } + if xident.Obj != nil { + // if the parser can resolve it, it's not a package ref + break + } + pkgName := xident.Name + if refs[pkgName] == nil { + refs[pkgName] = make(map[string]bool) + } + if decls[pkgName] == nil { + refs[pkgName][v.Sel.Name] = true + } + } + return visitor + }) + ast.Walk(visitor, f) + + // Nil out any unused ImportSpecs, to be removed in following passes + unusedImport := map[string]string{} + for pkg, is := range decls { + if refs[pkg] == nil && pkg != "_" && pkg != "." { + name := "" + if is.Name != nil { + name = is.Name.Name + } + unusedImport[strings.Trim(is.Path.Value, `"`)] = name + } + } + for ipath, name := range unusedImport { + if ipath == "C" { + // Don't remove cgo stuff. + continue + } + astutil.DeleteNamedImport(fset, f, name, ipath) + } + + // Search for imports matching potential package references. + searches := 0 + type result struct { + ipath string + name string + err error + } + results := make(chan result) + for pkgName, symbols := range refs { + if len(symbols) == 0 { + continue // skip over packages already imported + } + go func(pkgName string, symbols map[string]bool) { + ipath, rename, err := findImport(pkgName, symbols, filename) + r := result{ipath: ipath, err: err} + if rename { + r.name = pkgName + } + results <- r + }(pkgName, symbols) + searches++ + } + for i := 0; i < searches; i++ { + result := <-results + if result.err != nil { + return nil, result.err + } + if result.ipath != "" { + if result.name != "" { + astutil.AddNamedImport(fset, f, result.name, result.ipath) + } else { + astutil.AddImport(fset, f, result.ipath) + } + added = append(added, result.ipath) + } + } + + return added, nil +} + +// importPathToName returns the package name for the given import path. +var importPathToName = importPathToNameGoPath + +// importPathToNameBasic assumes the package name is the base of import path. +func importPathToNameBasic(importPath string) (packageName string) { + return path.Base(importPath) +} + +// importPathToNameGoPath finds out the actual package name, as declared in its .go files. +// If there's a problem, it falls back to using importPathToNameBasic. +func importPathToNameGoPath(importPath string) (packageName string) { + if buildPkg, err := build.Import(importPath, "", 0); err == nil { + return buildPkg.Name + } else { + return importPathToNameBasic(importPath) + } +} + +type pkg struct { + importpath string // full pkg import path, e.g. "net/http" + dir string // absolute file path to pkg directory e.g. "/usr/lib/go/src/fmt" +} + +var pkgIndexOnce = &sync.Once{} + +var pkgIndex struct { + sync.Mutex + m map[string][]pkg // shortname => []pkg, e.g "http" => "net/http" +} + +// gate is a semaphore for limiting concurrency. +type gate chan struct{} + +func (g gate) enter() { g <- struct{}{} } +func (g gate) leave() { <-g } + +// fsgate protects the OS & filesystem from too much concurrency. +// Too much disk I/O -> too many threads -> swapping and bad scheduling. +var fsgate = make(gate, 8) + +func loadPkgIndex() { + pkgIndex.Lock() + pkgIndex.m = make(map[string][]pkg) + pkgIndex.Unlock() + + var wg sync.WaitGroup + for _, path := range build.Default.SrcDirs() { + fsgate.enter() + f, err := os.Open(path) + if err != nil { + fsgate.leave() + fmt.Fprint(os.Stderr, err) + continue + } + children, err := f.Readdir(-1) + f.Close() + fsgate.leave() + if err != nil { + fmt.Fprint(os.Stderr, err) + continue + } + for _, child := range children { + if child.IsDir() { + wg.Add(1) + go func(path, name string) { + defer wg.Done() + loadPkg(&wg, path, name) + }(path, child.Name()) + } + } + } + wg.Wait() +} + +func loadPkg(wg *sync.WaitGroup, root, pkgrelpath string) { + importpath := filepath.ToSlash(pkgrelpath) + dir := filepath.Join(root, importpath) + + fsgate.enter() + defer fsgate.leave() + pkgDir, err := os.Open(dir) + if err != nil { + return + } + children, err := pkgDir.Readdir(-1) + pkgDir.Close() + if err != nil { + return + } + // hasGo tracks whether a directory actually appears to be a + // Go source code directory. If $GOPATH == $HOME, and + // $HOME/src has lots of other large non-Go projects in it, + // then the calls to importPathToName below can be expensive. + hasGo := false + for _, child := range children { + // Avoid .foo, _foo, and testdata directory trees. + name := child.Name() + if name == "" || name[0] == '.' || name[0] == '_' || name == "testdata" { + continue + } + if strings.HasSuffix(name, ".go") { + hasGo = true + } + if child.IsDir() { + wg.Add(1) + go func(root, name string) { + defer wg.Done() + loadPkg(wg, root, name) + }(root, filepath.Join(importpath, name)) + } + } + if hasGo { + shortName := importPathToName(importpath) + pkgIndex.Lock() + pkgIndex.m[shortName] = append(pkgIndex.m[shortName], pkg{ + importpath: importpath, + dir: dir, + }) + pkgIndex.Unlock() + } + +} + +// loadExports returns a list exports for a package. +var loadExports = loadExportsGoPath + +func loadExportsGoPath(dir string) map[string]bool { + exports := make(map[string]bool) + buildPkg, err := build.ImportDir(dir, 0) + if err != nil { + if strings.Contains(err.Error(), "no buildable Go source files in") { + return nil + } + fmt.Fprintf(os.Stderr, "could not import %q: %v\n", dir, err) + return nil + } + fset := token.NewFileSet() + for _, files := range [...][]string{buildPkg.GoFiles, buildPkg.CgoFiles} { + for _, file := range files { + f, err := parser.ParseFile(fset, filepath.Join(dir, file), nil, 0) + if err != nil { + fmt.Fprintf(os.Stderr, "could not parse %q: %v\n", file, err) + continue + } + for name := range f.Scope.Objects { + if ast.IsExported(name) { + exports[name] = true + } + } + } + } + return exports +} + +// findImport searches for a package with the given symbols. +// If no package is found, findImport returns "". +// Declared as a variable rather than a function so goimports can be easily +// extended by adding a file with an init function. +var findImport = findImportGoPath + +func findImportGoPath(pkgName string, symbols map[string]bool, filename string) (string, bool, error) { + // Fast path for the standard library. + // In the common case we hopefully never have to scan the GOPATH, which can + // be slow with moving disks. + if pkg, rename, ok := findImportStdlib(pkgName, symbols); ok { + return pkg, rename, nil + } + + // TODO(sameer): look at the import lines for other Go files in the + // local directory, since the user is likely to import the same packages + // in the current Go file. Return rename=true when the other Go files + // use a renamed package that's also used in the current file. + + pkgIndexOnce.Do(loadPkgIndex) + + // Collect exports for packages with matching names. + var ( + wg sync.WaitGroup + mu sync.Mutex + shortest string + ) + pkgIndex.Lock() + for _, pkg := range pkgIndex.m[pkgName] { + if !canUse(filename, pkg.dir) { + continue + } + wg.Add(1) + go func(importpath, dir string) { + defer wg.Done() + exports := loadExports(dir) + if exports == nil { + return + } + // If it doesn't have the right symbols, stop. + for symbol := range symbols { + if !exports[symbol] { + return + } + } + + // Devendorize for use in import statement. + if i := strings.LastIndex(importpath, "/vendor/"); i >= 0 { + importpath = importpath[i+len("/vendor/"):] + } else if strings.HasPrefix(importpath, "vendor/") { + importpath = importpath[len("vendor/"):] + } + + // Save as the answer. + // If there are multiple candidates, the shortest wins, + // to prefer "bytes" over "github.com/foo/bytes". + mu.Lock() + if shortest == "" || len(importpath) < len(shortest) || len(importpath) == len(shortest) && importpath < shortest { + shortest = importpath + } + mu.Unlock() + }(pkg.importpath, pkg.dir) + } + pkgIndex.Unlock() + wg.Wait() + + return shortest, false, nil +} + +func canUse(filename, dir string) bool { + dirSlash := filepath.ToSlash(dir) + if !strings.Contains(dirSlash, "/vendor/") && !strings.Contains(dirSlash, "/internal/") && !strings.HasSuffix(dirSlash, "/internal") { + return true + } + // Vendor or internal directory only visible from children of parent. + // That means the path from the current directory to the target directory + // can contain ../vendor or ../internal but not ../foo/vendor or ../foo/internal + // or bar/vendor or bar/internal. + // After stripping all the leading ../, the only okay place to see vendor or internal + // is at the very beginning of the path. + abs, err := filepath.Abs(filename) + if err != nil { + return false + } + rel, err := filepath.Rel(abs, dir) + if err != nil { + return false + } + relSlash := filepath.ToSlash(rel) + if i := strings.LastIndex(relSlash, "../"); i >= 0 { + relSlash = relSlash[i+len("../"):] + } + return !strings.Contains(relSlash, "/vendor/") && !strings.Contains(relSlash, "/internal/") && !strings.HasSuffix(relSlash, "/internal") +} + +type visitFn func(node ast.Node) ast.Visitor + +func (fn visitFn) Visit(node ast.Node) ast.Visitor { + return fn(node) +} + +func findImportStdlib(shortPkg string, symbols map[string]bool) (importPath string, rename, ok bool) { + for symbol := range symbols { + path := stdlib[shortPkg+"."+symbol] + if path == "" { + return "", false, false + } + if importPath != "" && importPath != path { + // Ambiguous. Symbols pointed to different things. + return "", false, false + } + importPath = path + } + return importPath, false, importPath != "" +} diff --git a/vendor/golang.org/x/tools/imports/fix_test.go b/vendor/golang.org/x/tools/imports/fix_test.go new file mode 100644 index 0000000000..9e5ea8cb03 --- /dev/null +++ b/vendor/golang.org/x/tools/imports/fix_test.go @@ -0,0 +1,985 @@ +// Copyright 2013 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 imports + +import ( + "bytes" + "flag" + "go/build" + "io/ioutil" + "os" + "path/filepath" + "runtime" + "sync" + "testing" +) + +var only = flag.String("only", "", "If non-empty, the fix test to run") + +var tests = []struct { + name string + in, out string +}{ + // Adding an import to an existing parenthesized import + { + name: "factored_imports_add", + in: `package foo +import ( + "fmt" +) +func bar() { +var b bytes.Buffer +fmt.Println(b.String()) +} +`, + out: `package foo + +import ( + "bytes" + "fmt" +) + +func bar() { + var b bytes.Buffer + fmt.Println(b.String()) +} +`, + }, + + // Adding an import to an existing parenthesized import, + // verifying it goes into the first section. + { + name: "factored_imports_add_first_sec", + in: `package foo +import ( + "fmt" + + "appengine" +) +func bar() { +var b bytes.Buffer +_ = appengine.IsDevServer +fmt.Println(b.String()) +} +`, + out: `package foo + +import ( + "bytes" + "fmt" + + "appengine" +) + +func bar() { + var b bytes.Buffer + _ = appengine.IsDevServer + fmt.Println(b.String()) +} +`, + }, + + // Adding an import to an existing parenthesized import, + // verifying it goes into the first section. (test 2) + { + name: "factored_imports_add_first_sec_2", + in: `package foo +import ( + "fmt" + + "appengine" +) +func bar() { +_ = math.NaN +_ = fmt.Sprintf +_ = appengine.IsDevServer +} +`, + out: `package foo + +import ( + "fmt" + "math" + + "appengine" +) + +func bar() { + _ = math.NaN + _ = fmt.Sprintf + _ = appengine.IsDevServer +} +`, + }, + + // Adding a new import line, without parens + { + name: "add_import_section", + in: `package foo +func bar() { +var b bytes.Buffer +} +`, + out: `package foo + +import "bytes" + +func bar() { + var b bytes.Buffer +} +`, + }, + + // Adding two new imports, which should make a parenthesized import decl. + { + name: "add_import_paren_section", + in: `package foo +func bar() { +_, _ := bytes.Buffer, zip.NewReader +} +`, + out: `package foo + +import ( + "archive/zip" + "bytes" +) + +func bar() { + _, _ := bytes.Buffer, zip.NewReader +} +`, + }, + + // Make sure we don't add things twice + { + name: "no_double_add", + in: `package foo +func bar() { +_, _ := bytes.Buffer, bytes.NewReader +} +`, + out: `package foo + +import "bytes" + +func bar() { + _, _ := bytes.Buffer, bytes.NewReader +} +`, + }, + + // Remove unused imports, 1 of a factored block + { + name: "remove_unused_1_of_2", + in: `package foo +import ( +"bytes" +"fmt" +) + +func bar() { +_, _ := bytes.Buffer, bytes.NewReader +} +`, + out: `package foo + +import "bytes" + +func bar() { + _, _ := bytes.Buffer, bytes.NewReader +} +`, + }, + + // Remove unused imports, 2 of 2 + { + name: "remove_unused_2_of_2", + in: `package foo +import ( +"bytes" +"fmt" +) + +func bar() { +} +`, + out: `package foo + +func bar() { +} +`, + }, + + // Remove unused imports, 1 of 1 + { + name: "remove_unused_1_of_1", + in: `package foo + +import "fmt" + +func bar() { +} +`, + out: `package foo + +func bar() { +} +`, + }, + + // Don't remove empty imports. + { + name: "dont_remove_empty_imports", + in: `package foo +import ( +_ "image/png" +_ "image/jpeg" +) +`, + out: `package foo + +import ( + _ "image/jpeg" + _ "image/png" +) +`, + }, + + // Don't remove dot imports. + { + name: "dont_remove_dot_imports", + in: `package foo +import ( +. "foo" +. "bar" +) +`, + out: `package foo + +import ( + . "bar" + . "foo" +) +`, + }, + + // Skip refs the parser can resolve. + { + name: "skip_resolved_refs", + in: `package foo + +func f() { + type t struct{ Println func(string) } + fmt := t{Println: func(string) {}} + fmt.Println("foo") +} +`, + out: `package foo + +func f() { + type t struct{ Println func(string) } + fmt := t{Println: func(string) {}} + fmt.Println("foo") +} +`, + }, + + // Do not add a package we already have a resolution for. + { + name: "skip_template", + in: `package foo + +import "html/template" + +func f() { t = template.New("sometemplate") } +`, + out: `package foo + +import "html/template" + +func f() { t = template.New("sometemplate") } +`, + }, + + // Don't touch cgo + { + name: "cgo", + in: `package foo + +/* +#include +*/ +import "C" +`, + out: `package foo + +/* +#include +*/ +import "C" +`, + }, + + // Put some things in their own section + { + name: "make_sections", + in: `package foo + +import ( +"os" +) + +func foo () { +_, _ = os.Args, fmt.Println +_, _ = appengine.FooSomething, user.Current +} +`, + out: `package foo + +import ( + "fmt" + "os" + + "appengine" + "appengine/user" +) + +func foo() { + _, _ = os.Args, fmt.Println + _, _ = appengine.FooSomething, user.Current +} +`, + }, + + // Delete existing empty import block + { + name: "delete_empty_import_block", + in: `package foo + +import () +`, + out: `package foo +`, + }, + + // Use existing empty import block + { + name: "use_empty_import_block", + in: `package foo + +import () + +func f() { + _ = fmt.Println +} +`, + out: `package foo + +import "fmt" + +func f() { + _ = fmt.Println +} +`, + }, + + // Blank line before adding new section. + { + name: "blank_line_before_new_group", + in: `package foo + +import ( + "fmt" + "net" +) + +func f() { + _ = net.Dial + _ = fmt.Printf + _ = snappy.Foo +} +`, + out: `package foo + +import ( + "fmt" + "net" + + "code.google.com/p/snappy-go/snappy" +) + +func f() { + _ = net.Dial + _ = fmt.Printf + _ = snappy.Foo +} +`, + }, + + // Blank line between standard library and third-party stuff. + { + name: "blank_line_separating_std_and_third_party", + in: `package foo + +import ( + "code.google.com/p/snappy-go/snappy" + "fmt" + "net" +) + +func f() { + _ = net.Dial + _ = fmt.Printf + _ = snappy.Foo +} +`, + out: `package foo + +import ( + "fmt" + "net" + + "code.google.com/p/snappy-go/snappy" +) + +func f() { + _ = net.Dial + _ = fmt.Printf + _ = snappy.Foo +} +`, + }, + + // golang.org/issue/6884 + { + name: "issue 6884", + in: `package main + +// A comment +func main() { + fmt.Println("Hello, world") +} +`, + out: `package main + +import "fmt" + +// A comment +func main() { + fmt.Println("Hello, world") +} +`, + }, + + // golang.org/issue/7132 + { + name: "issue 7132", + in: `package main + +import ( +"fmt" + +"gu" +"github.com/foo/bar" +) + +var ( +a = bar.a +b = gu.a +c = fmt.Printf +) +`, + out: `package main + +import ( + "fmt" + + "gu" + + "github.com/foo/bar" +) + +var ( + a = bar.a + b = gu.a + c = fmt.Printf +) +`, + }, + + { + name: "renamed package", + in: `package main + +var _ = str.HasPrefix +`, + out: `package main + +import str "strings" + +var _ = str.HasPrefix +`, + }, + + { + name: "fragment with main", + in: `func main(){fmt.Println("Hello, world")}`, + out: `package main + +import "fmt" + +func main() { fmt.Println("Hello, world") } +`, + }, + + { + name: "fragment without main", + in: `func notmain(){fmt.Println("Hello, world")}`, + out: `import "fmt" + +func notmain() { fmt.Println("Hello, world") }`, + }, + + // Remove first import within in a 2nd/3rd/4th/etc. section. + // golang.org/issue/7679 + { + name: "issue 7679", + in: `package main + +import ( + "fmt" + + "github.com/foo/bar" + "github.com/foo/qux" +) + +func main() { + var _ = fmt.Println + //var _ = bar.A + var _ = qux.B +} +`, + out: `package main + +import ( + "fmt" + + "github.com/foo/qux" +) + +func main() { + var _ = fmt.Println + //var _ = bar.A + var _ = qux.B +} +`, + }, + + // Blank line can be added before all types of import declarations. + // golang.org/issue/7866 + { + name: "issue 7866", + in: `package main + +import ( + "fmt" + renamed_bar "github.com/foo/bar" + + . "github.com/foo/baz" + "io" + + _ "github.com/foo/qux" + "strings" +) + +func main() { + _, _, _, _, _ = fmt.Errorf, io.Copy, strings.Contains, renamed_bar.A, B +} +`, + out: `package main + +import ( + "fmt" + + renamed_bar "github.com/foo/bar" + + "io" + + . "github.com/foo/baz" + + "strings" + + _ "github.com/foo/qux" +) + +func main() { + _, _, _, _, _ = fmt.Errorf, io.Copy, strings.Contains, renamed_bar.A, B +} +`, + }, + + // Non-idempotent comment formatting + // golang.org/issue/8035 + { + name: "issue 8035", + in: `package main + +import ( + "fmt" // A + "go/ast" // B + _ "launchpad.net/gocheck" // C +) + +func main() { _, _ = fmt.Print, ast.Walk } +`, + out: `package main + +import ( + "fmt" // A + "go/ast" // B + + _ "launchpad.net/gocheck" // C +) + +func main() { _, _ = fmt.Print, ast.Walk } +`, + }, + + // Failure to delete all duplicate imports + // golang.org/issue/8459 + { + name: "issue 8459", + in: `package main + +import ( + "fmt" + "log" + "log" + "math" +) + +func main() { fmt.Println("pi:", math.Pi) } +`, + out: `package main + +import ( + "fmt" + "math" +) + +func main() { fmt.Println("pi:", math.Pi) } +`, + }, + + // Too aggressive prefix matching + // golang.org/issue/9961 + { + name: "issue 9961", + in: `package p + +import ( + "zip" + + "rsc.io/p" +) + +var ( + _ = fmt.Print + _ = zip.Store + _ p.P + _ = regexp.Compile +) +`, + out: `package p + +import ( + "fmt" + "regexp" + "zip" + + "rsc.io/p" +) + +var ( + _ = fmt.Print + _ = zip.Store + _ p.P + _ = regexp.Compile +) +`, + }, + + // Unused named import is mistaken for unnamed import + // golang.org/issue/8149 + { + name: "issue 8149", + in: `package main + +import foo "fmt" + +func main() { fmt.Println() } +`, + out: `package main + +import "fmt" + +func main() { fmt.Println() } +`, + }, + + // Unused named import is mistaken for unnamed import + // golang.org/issue/8149 + { + name: "issue 8149", + in: `package main + +import ( + "fmt" + x "fmt" +) + +func main() { fmt.Println() } +`, + out: `package main + +import "fmt" + +func main() { fmt.Println() } +`, + }, +} + +func TestFixImports(t *testing.T) { + simplePkgs := map[string]string{ + "appengine": "appengine", + "bytes": "bytes", + "fmt": "fmt", + "math": "math", + "os": "os", + "p": "rsc.io/p", + "regexp": "regexp", + "snappy": "code.google.com/p/snappy-go/snappy", + "str": "strings", + "user": "appengine/user", + "zip": "archive/zip", + } + old := findImport + defer func() { + findImport = old + }() + findImport = func(pkgName string, symbols map[string]bool, filename string) (string, bool, error) { + return simplePkgs[pkgName], pkgName == "str", nil + } + + options := &Options{ + TabWidth: 8, + TabIndent: true, + Comments: true, + Fragment: true, + } + + for _, tt := range tests { + if *only != "" && tt.name != *only { + continue + } + buf, err := Process(tt.name+".go", []byte(tt.in), options) + if err != nil { + t.Errorf("error on %q: %v", tt.name, err) + continue + } + if got := string(buf); got != tt.out { + t.Errorf("results diff on %q\nGOT:\n%s\nWANT:\n%s\n", tt.name, got, tt.out) + } + } +} + +func TestFindImportGoPath(t *testing.T) { + goroot, err := ioutil.TempDir("", "goimports-") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(goroot) + + pkgIndexOnce = &sync.Once{} + + origStdlib := stdlib + defer func() { + stdlib = origStdlib + }() + stdlib = nil + + // Test against imaginary bits/bytes package in std lib + bytesDir := filepath.Join(goroot, "src", "pkg", "bits", "bytes") + for _, tag := range build.Default.ReleaseTags { + // Go 1.4 rearranged the GOROOT tree to remove the "pkg" path component. + if tag == "go1.4" { + bytesDir = filepath.Join(goroot, "src", "bits", "bytes") + } + } + if err := os.MkdirAll(bytesDir, 0755); err != nil { + t.Fatal(err) + } + bytesSrcPath := filepath.Join(bytesDir, "bytes.go") + bytesPkgPath := "bits/bytes" + bytesSrc := []byte(`package bytes + +type Buffer2 struct {} +`) + if err := ioutil.WriteFile(bytesSrcPath, bytesSrc, 0775); err != nil { + t.Fatal(err) + } + oldGOROOT := build.Default.GOROOT + oldGOPATH := build.Default.GOPATH + build.Default.GOROOT = goroot + build.Default.GOPATH = "" + defer func() { + build.Default.GOROOT = oldGOROOT + build.Default.GOPATH = oldGOPATH + }() + + got, rename, err := findImportGoPath("bytes", map[string]bool{"Buffer2": true}, "x.go") + if err != nil { + t.Fatal(err) + } + if got != bytesPkgPath || rename { + t.Errorf(`findImportGoPath("bytes", Buffer2 ...)=%q, %t, want "%s", false`, got, rename, bytesPkgPath) + } + + got, rename, err = findImportGoPath("bytes", map[string]bool{"Missing": true}, "x.go") + if err != nil { + t.Fatal(err) + } + if got != "" || rename { + t.Errorf(`findImportGoPath("bytes", Missing ...)=%q, %t, want "", false`, got, rename) + } +} + +func TestFindImportInternal(t *testing.T) { + pkgIndexOnce = &sync.Once{} + oldGOPATH := build.Default.GOPATH + build.Default.GOPATH = "" + defer func() { + build.Default.GOPATH = oldGOPATH + }() + + // Check for src/internal/race, not just src/internal, + // so that we can run this test also against go1.5 + // (which doesn't contain that file). + _, err := os.Stat(filepath.Join(runtime.GOROOT(), "src/internal/race")) + if err != nil { + t.Skip(err) + } + + got, rename, err := findImportGoPath("race", map[string]bool{"Acquire": true}, filepath.Join(runtime.GOROOT(), "src/math/x.go")) + if err != nil { + t.Fatal(err) + } + if got != "internal/race" || rename { + t.Errorf(`findImportGoPath("race", Acquire ...)=%q, %t, want "internal/race", false`, got, rename) + } + + // should not be able to use internal from outside that tree + got, rename, err = findImportGoPath("race", map[string]bool{"Acquire": true}, filepath.Join(runtime.GOROOT(), "x.go")) + if err != nil { + t.Fatal(err) + } + if got != "" || rename { + t.Errorf(`findImportGoPath("race", Acquire ...)=%q, %t, want "", false`, got, rename) + } +} + +func TestFindImportVendor(t *testing.T) { + pkgIndexOnce = &sync.Once{} + oldGOPATH := build.Default.GOPATH + build.Default.GOPATH = "" + defer func() { + build.Default.GOPATH = oldGOPATH + }() + + _, err := os.Stat(filepath.Join(runtime.GOROOT(), "src/vendor")) + if err != nil { + t.Skip(err) + } + + got, rename, err := findImportGoPath("hpack", map[string]bool{"HuffmanDecode": true}, filepath.Join(runtime.GOROOT(), "src/math/x.go")) + if err != nil { + t.Fatal(err) + } + want := "golang.org/x/net/http2/hpack" + // Pre-1.7, we temporarily had this package under "internal" - adjust want accordingly. + _, err = os.Stat(filepath.Join(runtime.GOROOT(), "src/vendor", want)) + if err != nil { + want = filepath.Join("internal", want) + } + if got != want || rename { + t.Errorf(`findImportGoPath("hpack", HuffmanDecode ...)=%q, %t, want %q, false`, got, rename, want) + } + + // should not be able to use vendor from outside that tree + got, rename, err = findImportGoPath("hpack", map[string]bool{"HuffmanDecode": true}, filepath.Join(runtime.GOROOT(), "x.go")) + if err != nil { + t.Fatal(err) + } + if got != "" || rename { + t.Errorf(`findImportGoPath("hpack", HuffmanDecode ...)=%q, %t, want "", false`, got, rename) + } +} + +func TestProcessVendor(t *testing.T) { + pkgIndexOnce = &sync.Once{} + oldGOPATH := build.Default.GOPATH + build.Default.GOPATH = "" + defer func() { + build.Default.GOPATH = oldGOPATH + }() + + _, err := os.Stat(filepath.Join(runtime.GOROOT(), "src/vendor")) + if err != nil { + t.Skip(err) + } + + target := filepath.Join(runtime.GOROOT(), "src/math/x.go") + out, err := Process(target, []byte("package http\nimport \"bytes\"\nfunc f() { strings.NewReader(); hpack.HuffmanDecode() }\n"), nil) + + if err != nil { + t.Fatal(err) + } + want := "golang.org/x/net/http2/hpack" + if !bytes.Contains(out, []byte(want)) { + t.Fatalf("Process(%q) did not add expected hpack import:\n%s", target, out) + } +} + +func TestFindImportStdlib(t *testing.T) { + tests := []struct { + pkg string + symbols []string + want string + }{ + {"http", []string{"Get"}, "net/http"}, + {"http", []string{"Get", "Post"}, "net/http"}, + {"http", []string{"Get", "Foo"}, ""}, + {"bytes", []string{"Buffer"}, "bytes"}, + {"ioutil", []string{"Discard"}, "io/ioutil"}, + } + for _, tt := range tests { + got, rename, ok := findImportStdlib(tt.pkg, strSet(tt.symbols)) + if (got != "") != ok { + t.Error("findImportStdlib return value inconsistent") + } + if got != tt.want || rename { + t.Errorf("findImportStdlib(%q, %q) = %q, %t; want %q, false", tt.pkg, tt.symbols, got, rename, tt.want) + } + } +} + +func strSet(ss []string) map[string]bool { + m := make(map[string]bool) + for _, s := range ss { + m[s] = true + } + return m +} diff --git a/vendor/golang.org/x/tools/imports/imports.go b/vendor/golang.org/x/tools/imports/imports.go new file mode 100644 index 0000000000..c0d6860163 --- /dev/null +++ b/vendor/golang.org/x/tools/imports/imports.go @@ -0,0 +1,283 @@ +// Copyright 2013 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 imports implements a Go pretty-printer (like package "go/format") +// that also adds or removes import statements as necessary. +package imports // import "golang.org/x/tools/imports" + +import ( + "bufio" + "bytes" + "fmt" + "go/ast" + "go/format" + "go/parser" + "go/printer" + "go/token" + "io" + "regexp" + "strconv" + "strings" + + "golang.org/x/tools/go/ast/astutil" +) + +// Options specifies options for processing files. +type Options struct { + Fragment bool // Accept fragment of a source file (no package statement) + AllErrors bool // Report all errors (not just the first 10 on different lines) + + Comments bool // Print comments (true if nil *Options provided) + TabIndent bool // Use tabs for indent (true if nil *Options provided) + TabWidth int // Tab width (8 if nil *Options provided) +} + +// Process formats and adjusts imports for the provided file. +// If opt is nil the defaults are used. +// +// Note that filename's directory influences which imports can be chosen, +// so it is important that filename be accurate. +// To process data ``as if'' it were in filename, pass the data as a non-nil src. +func Process(filename string, src []byte, opt *Options) ([]byte, error) { + if opt == nil { + opt = &Options{Comments: true, TabIndent: true, TabWidth: 8} + } + + fileSet := token.NewFileSet() + file, adjust, err := parse(fileSet, filename, src, opt) + if err != nil { + return nil, err + } + + _, err = fixImports(fileSet, file, filename) + if err != nil { + return nil, err + } + + sortImports(fileSet, file) + imps := astutil.Imports(fileSet, file) + + var spacesBefore []string // import paths we need spaces before + for _, impSection := range imps { + // Within each block of contiguous imports, see if any + // import lines are in different group numbers. If so, + // we'll need to put a space between them so it's + // compatible with gofmt. + lastGroup := -1 + for _, importSpec := range impSection { + importPath, _ := strconv.Unquote(importSpec.Path.Value) + groupNum := importGroup(importPath) + if groupNum != lastGroup && lastGroup != -1 { + spacesBefore = append(spacesBefore, importPath) + } + lastGroup = groupNum + } + + } + + printerMode := printer.UseSpaces + if opt.TabIndent { + printerMode |= printer.TabIndent + } + printConfig := &printer.Config{Mode: printerMode, Tabwidth: opt.TabWidth} + + var buf bytes.Buffer + err = printConfig.Fprint(&buf, fileSet, file) + if err != nil { + return nil, err + } + out := buf.Bytes() + if adjust != nil { + out = adjust(src, out) + } + if len(spacesBefore) > 0 { + out = addImportSpaces(bytes.NewReader(out), spacesBefore) + } + + out, err = format.Source(out) + if err != nil { + return nil, err + } + return out, nil +} + +// parse parses src, which was read from filename, +// as a Go source file or statement list. +func parse(fset *token.FileSet, filename string, src []byte, opt *Options) (*ast.File, func(orig, src []byte) []byte, error) { + parserMode := parser.Mode(0) + if opt.Comments { + parserMode |= parser.ParseComments + } + if opt.AllErrors { + parserMode |= parser.AllErrors + } + + // Try as whole source file. + file, err := parser.ParseFile(fset, filename, src, parserMode) + if err == nil { + return file, nil, nil + } + // If the error is that the source file didn't begin with a + // package line and we accept fragmented input, fall through to + // try as a source fragment. Stop and return on any other error. + if !opt.Fragment || !strings.Contains(err.Error(), "expected 'package'") { + return nil, nil, err + } + + // If this is a declaration list, make it a source file + // by inserting a package clause. + // Insert using a ;, not a newline, so that the line numbers + // in psrc match the ones in src. + psrc := append([]byte("package main;"), src...) + file, err = parser.ParseFile(fset, filename, psrc, parserMode) + if err == nil { + // If a main function exists, we will assume this is a main + // package and leave the file. + if containsMainFunc(file) { + return file, nil, nil + } + + adjust := func(orig, src []byte) []byte { + // Remove the package clause. + // Gofmt has turned the ; into a \n. + src = src[len("package main\n"):] + return matchSpace(orig, src) + } + return file, adjust, nil + } + // If the error is that the source file didn't begin with a + // declaration, fall through to try as a statement list. + // Stop and return on any other error. + if !strings.Contains(err.Error(), "expected declaration") { + return nil, nil, err + } + + // If this is a statement list, make it a source file + // by inserting a package clause and turning the list + // into a function body. This handles expressions too. + // Insert using a ;, not a newline, so that the line numbers + // in fsrc match the ones in src. + fsrc := append(append([]byte("package p; func _() {"), src...), '}') + file, err = parser.ParseFile(fset, filename, fsrc, parserMode) + if err == nil { + adjust := func(orig, src []byte) []byte { + // Remove the wrapping. + // Gofmt has turned the ; into a \n\n. + src = src[len("package p\n\nfunc _() {"):] + src = src[:len(src)-len("}\n")] + // Gofmt has also indented the function body one level. + // Remove that indent. + src = bytes.Replace(src, []byte("\n\t"), []byte("\n"), -1) + return matchSpace(orig, src) + } + return file, adjust, nil + } + + // Failed, and out of options. + return nil, nil, err +} + +// containsMainFunc checks if a file contains a function declaration with the +// function signature 'func main()' +func containsMainFunc(file *ast.File) bool { + for _, decl := range file.Decls { + if f, ok := decl.(*ast.FuncDecl); ok { + if f.Name.Name != "main" { + continue + } + + if len(f.Type.Params.List) != 0 { + continue + } + + if f.Type.Results != nil && len(f.Type.Results.List) != 0 { + continue + } + + return true + } + } + + return false +} + +func cutSpace(b []byte) (before, middle, after []byte) { + i := 0 + for i < len(b) && (b[i] == ' ' || b[i] == '\t' || b[i] == '\n') { + i++ + } + j := len(b) + for j > 0 && (b[j-1] == ' ' || b[j-1] == '\t' || b[j-1] == '\n') { + j-- + } + if i <= j { + return b[:i], b[i:j], b[j:] + } + return nil, nil, b[j:] +} + +// matchSpace reformats src to use the same space context as orig. +// 1) If orig begins with blank lines, matchSpace inserts them at the beginning of src. +// 2) matchSpace copies the indentation of the first non-blank line in orig +// to every non-blank line in src. +// 3) matchSpace copies the trailing space from orig and uses it in place +// of src's trailing space. +func matchSpace(orig []byte, src []byte) []byte { + before, _, after := cutSpace(orig) + i := bytes.LastIndex(before, []byte{'\n'}) + before, indent := before[:i+1], before[i+1:] + + _, src, _ = cutSpace(src) + + var b bytes.Buffer + b.Write(before) + for len(src) > 0 { + line := src + if i := bytes.IndexByte(line, '\n'); i >= 0 { + line, src = line[:i+1], line[i+1:] + } else { + src = nil + } + if len(line) > 0 && line[0] != '\n' { // not blank + b.Write(indent) + } + b.Write(line) + } + b.Write(after) + return b.Bytes() +} + +var impLine = regexp.MustCompile(`^\s+(?:[\w\.]+\s+)?"(.+)"`) + +func addImportSpaces(r io.Reader, breaks []string) []byte { + var out bytes.Buffer + sc := bufio.NewScanner(r) + inImports := false + done := false + for sc.Scan() { + s := sc.Text() + + if !inImports && !done && strings.HasPrefix(s, "import") { + inImports = true + } + if inImports && (strings.HasPrefix(s, "var") || + strings.HasPrefix(s, "func") || + strings.HasPrefix(s, "const") || + strings.HasPrefix(s, "type")) { + done = true + inImports = false + } + if inImports && len(breaks) > 0 { + if m := impLine.FindStringSubmatch(s); m != nil { + if m[1] == string(breaks[0]) { + out.WriteByte('\n') + breaks = breaks[1:] + } + } + } + + fmt.Fprintln(&out, s) + } + return out.Bytes() +} diff --git a/vendor/golang.org/x/tools/imports/mkindex.go b/vendor/golang.org/x/tools/imports/mkindex.go new file mode 100644 index 0000000000..755e2394f2 --- /dev/null +++ b/vendor/golang.org/x/tools/imports/mkindex.go @@ -0,0 +1,173 @@ +// +build ignore + +// Copyright 2013 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. + +// Command mkindex creates the file "pkgindex.go" containing an index of the Go +// standard library. The file is intended to be built as part of the imports +// package, so that the package may be used in environments where a GOROOT is +// not available (such as App Engine). +package main + +import ( + "bytes" + "fmt" + "go/ast" + "go/build" + "go/format" + "go/parser" + "go/token" + "io/ioutil" + "log" + "os" + "path" + "path/filepath" + "strings" +) + +var ( + pkgIndex = make(map[string][]pkg) + exports = make(map[string]map[string]bool) +) + +func main() { + // Don't use GOPATH. + ctx := build.Default + ctx.GOPATH = "" + + // Populate pkgIndex global from GOROOT. + for _, path := range ctx.SrcDirs() { + f, err := os.Open(path) + if err != nil { + log.Print(err) + continue + } + children, err := f.Readdir(-1) + f.Close() + if err != nil { + log.Print(err) + continue + } + for _, child := range children { + if child.IsDir() { + loadPkg(path, child.Name()) + } + } + } + // Populate exports global. + for _, ps := range pkgIndex { + for _, p := range ps { + e := loadExports(p.dir) + if e != nil { + exports[p.dir] = e + } + } + } + + // Construct source file. + var buf bytes.Buffer + fmt.Fprint(&buf, pkgIndexHead) + fmt.Fprintf(&buf, "var pkgIndexMaster = %#v\n", pkgIndex) + fmt.Fprintf(&buf, "var exportsMaster = %#v\n", exports) + src := buf.Bytes() + + // Replace main.pkg type name with pkg. + src = bytes.Replace(src, []byte("main.pkg"), []byte("pkg"), -1) + // Replace actual GOROOT with "/go". + src = bytes.Replace(src, []byte(ctx.GOROOT), []byte("/go"), -1) + // Add some line wrapping. + src = bytes.Replace(src, []byte("}, "), []byte("},\n"), -1) + src = bytes.Replace(src, []byte("true, "), []byte("true,\n"), -1) + + var err error + src, err = format.Source(src) + if err != nil { + log.Fatal(err) + } + + // Write out source file. + err = ioutil.WriteFile("pkgindex.go", src, 0644) + if err != nil { + log.Fatal(err) + } +} + +const pkgIndexHead = `package imports + +func init() { + pkgIndexOnce.Do(func() { + pkgIndex.m = pkgIndexMaster + }) + loadExports = func(dir string) map[string]bool { + return exportsMaster[dir] + } +} +` + +type pkg struct { + importpath string // full pkg import path, e.g. "net/http" + dir string // absolute file path to pkg directory e.g. "/usr/lib/go/src/fmt" +} + +var fset = token.NewFileSet() + +func loadPkg(root, importpath string) { + shortName := path.Base(importpath) + if shortName == "testdata" { + return + } + + dir := filepath.Join(root, importpath) + pkgIndex[shortName] = append(pkgIndex[shortName], pkg{ + importpath: importpath, + dir: dir, + }) + + pkgDir, err := os.Open(dir) + if err != nil { + return + } + children, err := pkgDir.Readdir(-1) + pkgDir.Close() + if err != nil { + return + } + for _, child := range children { + name := child.Name() + if name == "" { + continue + } + if c := name[0]; c == '.' || ('0' <= c && c <= '9') { + continue + } + if child.IsDir() { + loadPkg(root, filepath.Join(importpath, name)) + } + } +} + +func loadExports(dir string) map[string]bool { + exports := make(map[string]bool) + buildPkg, err := build.ImportDir(dir, 0) + if err != nil { + if strings.Contains(err.Error(), "no buildable Go source files in") { + return nil + } + log.Printf("could not import %q: %v", dir, err) + return nil + } + for _, file := range buildPkg.GoFiles { + f, err := parser.ParseFile(fset, filepath.Join(dir, file), nil, 0) + if err != nil { + log.Printf("could not parse %q: %v", file, err) + continue + } + for name := range f.Scope.Objects { + if ast.IsExported(name) { + exports[name] = true + } + } + } + return exports +} diff --git a/vendor/golang.org/x/tools/imports/mkstdlib.go b/vendor/golang.org/x/tools/imports/mkstdlib.go new file mode 100644 index 0000000000..e2dca76006 --- /dev/null +++ b/vendor/golang.org/x/tools/imports/mkstdlib.go @@ -0,0 +1,93 @@ +// +build ignore + +// mkstdlib generates the zstdlib.go file, containing the Go standard +// library API symbols. It's baked into the binary to avoid scanning +// GOPATH in the common case. +package main + +import ( + "bufio" + "bytes" + "fmt" + "go/format" + "io" + "log" + "os" + "path" + "path/filepath" + "regexp" + "sort" + "strings" +) + +func mustOpen(name string) io.Reader { + f, err := os.Open(name) + if err != nil { + log.Fatal(err) + } + return f +} + +func api(base string) string { + return filepath.Join(os.Getenv("GOROOT"), "api", base) +} + +var sym = regexp.MustCompile(`^pkg (\S+).*?, (?:var|func|type|const) ([A-Z]\w*)`) + +func main() { + var buf bytes.Buffer + outf := func(format string, args ...interface{}) { + fmt.Fprintf(&buf, format, args...) + } + outf("// AUTO-GENERATED BY mkstdlib.go\n\n") + outf("package imports\n") + outf("var stdlib = map[string]string{\n") + f := io.MultiReader( + mustOpen(api("go1.txt")), + mustOpen(api("go1.1.txt")), + mustOpen(api("go1.2.txt")), + mustOpen(api("go1.3.txt")), + mustOpen(api("go1.4.txt")), + mustOpen(api("go1.5.txt")), + ) + sc := bufio.NewScanner(f) + fullImport := map[string]string{} // "zip.NewReader" => "archive/zip" + ambiguous := map[string]bool{} + var keys []string + for sc.Scan() { + l := sc.Text() + has := func(v string) bool { return strings.Contains(l, v) } + if has("struct, ") || has("interface, ") || has(", method (") { + continue + } + if m := sym.FindStringSubmatch(l); m != nil { + full := m[1] + key := path.Base(full) + "." + m[2] + if exist, ok := fullImport[key]; ok { + if exist != full { + ambiguous[key] = true + } + } else { + fullImport[key] = full + keys = append(keys, key) + } + } + } + if err := sc.Err(); err != nil { + log.Fatal(err) + } + sort.Strings(keys) + for _, key := range keys { + if ambiguous[key] { + outf("\t// %q is ambiguous\n", key) + } else { + outf("\t%q: %q,\n", key, fullImport[key]) + } + } + outf("}\n") + fmtbuf, err := format.Source(buf.Bytes()) + if err != nil { + log.Fatal(err) + } + os.Stdout.Write(fmtbuf) +} diff --git a/vendor/golang.org/x/tools/imports/sortimports.go b/vendor/golang.org/x/tools/imports/sortimports.go new file mode 100644 index 0000000000..653afc5177 --- /dev/null +++ b/vendor/golang.org/x/tools/imports/sortimports.go @@ -0,0 +1,212 @@ +// Copyright 2013 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. + +// Hacked up copy of go/ast/import.go + +package imports + +import ( + "go/ast" + "go/token" + "sort" + "strconv" +) + +// sortImports sorts runs of consecutive import lines in import blocks in f. +// It also removes duplicate imports when it is possible to do so without data loss. +func sortImports(fset *token.FileSet, f *ast.File) { + for i, d := range f.Decls { + d, ok := d.(*ast.GenDecl) + if !ok || d.Tok != token.IMPORT { + // Not an import declaration, so we're done. + // Imports are always first. + break + } + + if len(d.Specs) == 0 { + // Empty import block, remove it. + f.Decls = append(f.Decls[:i], f.Decls[i+1:]...) + } + + if !d.Lparen.IsValid() { + // Not a block: sorted by default. + continue + } + + // Identify and sort runs of specs on successive lines. + i := 0 + specs := d.Specs[:0] + for j, s := range d.Specs { + if j > i && fset.Position(s.Pos()).Line > 1+fset.Position(d.Specs[j-1].End()).Line { + // j begins a new run. End this one. + specs = append(specs, sortSpecs(fset, f, d.Specs[i:j])...) + i = j + } + } + specs = append(specs, sortSpecs(fset, f, d.Specs[i:])...) + d.Specs = specs + + // Deduping can leave a blank line before the rparen; clean that up. + if len(d.Specs) > 0 { + lastSpec := d.Specs[len(d.Specs)-1] + lastLine := fset.Position(lastSpec.Pos()).Line + if rParenLine := fset.Position(d.Rparen).Line; rParenLine > lastLine+1 { + fset.File(d.Rparen).MergeLine(rParenLine - 1) + } + } + } +} + +func importPath(s ast.Spec) string { + t, err := strconv.Unquote(s.(*ast.ImportSpec).Path.Value) + if err == nil { + return t + } + return "" +} + +func importName(s ast.Spec) string { + n := s.(*ast.ImportSpec).Name + if n == nil { + return "" + } + return n.Name +} + +func importComment(s ast.Spec) string { + c := s.(*ast.ImportSpec).Comment + if c == nil { + return "" + } + return c.Text() +} + +// collapse indicates whether prev may be removed, leaving only next. +func collapse(prev, next ast.Spec) bool { + if importPath(next) != importPath(prev) || importName(next) != importName(prev) { + return false + } + return prev.(*ast.ImportSpec).Comment == nil +} + +type posSpan struct { + Start token.Pos + End token.Pos +} + +func sortSpecs(fset *token.FileSet, f *ast.File, specs []ast.Spec) []ast.Spec { + // Can't short-circuit here even if specs are already sorted, + // since they might yet need deduplication. + // A lone import, however, may be safely ignored. + if len(specs) <= 1 { + return specs + } + + // Record positions for specs. + pos := make([]posSpan, len(specs)) + for i, s := range specs { + pos[i] = posSpan{s.Pos(), s.End()} + } + + // Identify comments in this range. + // Any comment from pos[0].Start to the final line counts. + lastLine := fset.Position(pos[len(pos)-1].End).Line + cstart := len(f.Comments) + cend := len(f.Comments) + for i, g := range f.Comments { + if g.Pos() < pos[0].Start { + continue + } + if i < cstart { + cstart = i + } + if fset.Position(g.End()).Line > lastLine { + cend = i + break + } + } + comments := f.Comments[cstart:cend] + + // Assign each comment to the import spec preceding it. + importComment := map[*ast.ImportSpec][]*ast.CommentGroup{} + specIndex := 0 + for _, g := range comments { + for specIndex+1 < len(specs) && pos[specIndex+1].Start <= g.Pos() { + specIndex++ + } + s := specs[specIndex].(*ast.ImportSpec) + importComment[s] = append(importComment[s], g) + } + + // Sort the import specs by import path. + // Remove duplicates, when possible without data loss. + // Reassign the import paths to have the same position sequence. + // Reassign each comment to abut the end of its spec. + // Sort the comments by new position. + sort.Sort(byImportSpec(specs)) + + // Dedup. Thanks to our sorting, we can just consider + // adjacent pairs of imports. + deduped := specs[:0] + for i, s := range specs { + if i == len(specs)-1 || !collapse(s, specs[i+1]) { + deduped = append(deduped, s) + } else { + p := s.Pos() + fset.File(p).MergeLine(fset.Position(p).Line) + } + } + specs = deduped + + // Fix up comment positions + for i, s := range specs { + s := s.(*ast.ImportSpec) + if s.Name != nil { + s.Name.NamePos = pos[i].Start + } + s.Path.ValuePos = pos[i].Start + s.EndPos = pos[i].End + for _, g := range importComment[s] { + for _, c := range g.List { + c.Slash = pos[i].End + } + } + } + + sort.Sort(byCommentPos(comments)) + + return specs +} + +type byImportSpec []ast.Spec // slice of *ast.ImportSpec + +func (x byImportSpec) Len() int { return len(x) } +func (x byImportSpec) Swap(i, j int) { x[i], x[j] = x[j], x[i] } +func (x byImportSpec) Less(i, j int) bool { + ipath := importPath(x[i]) + jpath := importPath(x[j]) + + igroup := importGroup(ipath) + jgroup := importGroup(jpath) + if igroup != jgroup { + return igroup < jgroup + } + + if ipath != jpath { + return ipath < jpath + } + iname := importName(x[i]) + jname := importName(x[j]) + + if iname != jname { + return iname < jname + } + return importComment(x[i]) < importComment(x[j]) +} + +type byCommentPos []*ast.CommentGroup + +func (x byCommentPos) Len() int { return len(x) } +func (x byCommentPos) Swap(i, j int) { x[i], x[j] = x[j], x[i] } +func (x byCommentPos) Less(i, j int) bool { return x[i].Pos() < x[j].Pos() } diff --git a/vendor/golang.org/x/tools/imports/zstdlib.go b/vendor/golang.org/x/tools/imports/zstdlib.go new file mode 100644 index 0000000000..39eb3c74b1 --- /dev/null +++ b/vendor/golang.org/x/tools/imports/zstdlib.go @@ -0,0 +1,9038 @@ +// AUTO-GENERATED BY mkstdlib.go + +package imports + +var stdlib = map[string]string{ + "adler32.Checksum": "hash/adler32", + "adler32.New": "hash/adler32", + "adler32.Size": "hash/adler32", + "aes.BlockSize": "crypto/aes", + "aes.KeySizeError": "crypto/aes", + "aes.NewCipher": "crypto/aes", + "ascii85.CorruptInputError": "encoding/ascii85", + "ascii85.Decode": "encoding/ascii85", + "ascii85.Encode": "encoding/ascii85", + "ascii85.MaxEncodedLen": "encoding/ascii85", + "ascii85.NewDecoder": "encoding/ascii85", + "ascii85.NewEncoder": "encoding/ascii85", + "asn1.BitString": "encoding/asn1", + "asn1.Enumerated": "encoding/asn1", + "asn1.Flag": "encoding/asn1", + "asn1.Marshal": "encoding/asn1", + "asn1.ObjectIdentifier": "encoding/asn1", + "asn1.RawContent": "encoding/asn1", + "asn1.RawValue": "encoding/asn1", + "asn1.StructuralError": "encoding/asn1", + "asn1.SyntaxError": "encoding/asn1", + "asn1.Unmarshal": "encoding/asn1", + "asn1.UnmarshalWithParams": "encoding/asn1", + "ast.ArrayType": "go/ast", + "ast.AssignStmt": "go/ast", + "ast.Bad": "go/ast", + "ast.BadDecl": "go/ast", + "ast.BadExpr": "go/ast", + "ast.BadStmt": "go/ast", + "ast.BasicLit": "go/ast", + "ast.BinaryExpr": "go/ast", + "ast.BlockStmt": "go/ast", + "ast.BranchStmt": "go/ast", + "ast.CallExpr": "go/ast", + "ast.CaseClause": "go/ast", + "ast.ChanDir": "go/ast", + "ast.ChanType": "go/ast", + "ast.CommClause": "go/ast", + "ast.Comment": "go/ast", + "ast.CommentGroup": "go/ast", + "ast.CommentMap": "go/ast", + "ast.CompositeLit": "go/ast", + "ast.Con": "go/ast", + "ast.DeclStmt": "go/ast", + "ast.DeferStmt": "go/ast", + "ast.Ellipsis": "go/ast", + "ast.EmptyStmt": "go/ast", + "ast.ExprStmt": "go/ast", + "ast.Field": "go/ast", + "ast.FieldFilter": "go/ast", + "ast.FieldList": "go/ast", + "ast.File": "go/ast", + "ast.FileExports": "go/ast", + "ast.Filter": "go/ast", + "ast.FilterDecl": "go/ast", + "ast.FilterFile": "go/ast", + "ast.FilterFuncDuplicates": "go/ast", + "ast.FilterImportDuplicates": "go/ast", + "ast.FilterPackage": "go/ast", + "ast.FilterUnassociatedComments": "go/ast", + "ast.ForStmt": "go/ast", + "ast.Fprint": "go/ast", + "ast.Fun": "go/ast", + "ast.FuncDecl": "go/ast", + "ast.FuncLit": "go/ast", + "ast.FuncType": "go/ast", + "ast.GenDecl": "go/ast", + "ast.GoStmt": "go/ast", + "ast.Ident": "go/ast", + "ast.IfStmt": "go/ast", + "ast.ImportSpec": "go/ast", + "ast.Importer": "go/ast", + "ast.IncDecStmt": "go/ast", + "ast.IndexExpr": "go/ast", + "ast.Inspect": "go/ast", + "ast.InterfaceType": "go/ast", + "ast.IsExported": "go/ast", + "ast.KeyValueExpr": "go/ast", + "ast.LabeledStmt": "go/ast", + "ast.Lbl": "go/ast", + "ast.MapType": "go/ast", + "ast.MergeMode": "go/ast", + "ast.MergePackageFiles": "go/ast", + "ast.NewCommentMap": "go/ast", + "ast.NewIdent": "go/ast", + "ast.NewObj": "go/ast", + "ast.NewPackage": "go/ast", + "ast.NewScope": "go/ast", + "ast.Node": "go/ast", + "ast.NotNilFilter": "go/ast", + "ast.ObjKind": "go/ast", + "ast.Object": "go/ast", + "ast.Package": "go/ast", + "ast.PackageExports": "go/ast", + "ast.ParenExpr": "go/ast", + "ast.Pkg": "go/ast", + "ast.Print": "go/ast", + "ast.RECV": "go/ast", + "ast.RangeStmt": "go/ast", + "ast.ReturnStmt": "go/ast", + "ast.SEND": "go/ast", + "ast.Scope": "go/ast", + "ast.SelectStmt": "go/ast", + "ast.SelectorExpr": "go/ast", + "ast.SendStmt": "go/ast", + "ast.SliceExpr": "go/ast", + "ast.SortImports": "go/ast", + "ast.StarExpr": "go/ast", + "ast.StructType": "go/ast", + "ast.SwitchStmt": "go/ast", + "ast.Typ": "go/ast", + "ast.TypeAssertExpr": "go/ast", + "ast.TypeSpec": "go/ast", + "ast.TypeSwitchStmt": "go/ast", + "ast.UnaryExpr": "go/ast", + "ast.ValueSpec": "go/ast", + "ast.Var": "go/ast", + "ast.Visitor": "go/ast", + "ast.Walk": "go/ast", + "atomic.AddInt32": "sync/atomic", + "atomic.AddInt64": "sync/atomic", + "atomic.AddUint32": "sync/atomic", + "atomic.AddUint64": "sync/atomic", + "atomic.AddUintptr": "sync/atomic", + "atomic.CompareAndSwapInt32": "sync/atomic", + "atomic.CompareAndSwapInt64": "sync/atomic", + "atomic.CompareAndSwapPointer": "sync/atomic", + "atomic.CompareAndSwapUint32": "sync/atomic", + "atomic.CompareAndSwapUint64": "sync/atomic", + "atomic.CompareAndSwapUintptr": "sync/atomic", + "atomic.LoadInt32": "sync/atomic", + "atomic.LoadInt64": "sync/atomic", + "atomic.LoadPointer": "sync/atomic", + "atomic.LoadUint32": "sync/atomic", + "atomic.LoadUint64": "sync/atomic", + "atomic.LoadUintptr": "sync/atomic", + "atomic.StoreInt32": "sync/atomic", + "atomic.StoreInt64": "sync/atomic", + "atomic.StorePointer": "sync/atomic", + "atomic.StoreUint32": "sync/atomic", + "atomic.StoreUint64": "sync/atomic", + "atomic.StoreUintptr": "sync/atomic", + "atomic.SwapInt32": "sync/atomic", + "atomic.SwapInt64": "sync/atomic", + "atomic.SwapPointer": "sync/atomic", + "atomic.SwapUint32": "sync/atomic", + "atomic.SwapUint64": "sync/atomic", + "atomic.SwapUintptr": "sync/atomic", + "atomic.Value": "sync/atomic", + "base32.CorruptInputError": "encoding/base32", + "base32.Encoding": "encoding/base32", + "base32.HexEncoding": "encoding/base32", + "base32.NewDecoder": "encoding/base32", + "base32.NewEncoder": "encoding/base32", + "base32.NewEncoding": "encoding/base32", + "base32.StdEncoding": "encoding/base32", + "base64.CorruptInputError": "encoding/base64", + "base64.Encoding": "encoding/base64", + "base64.NewDecoder": "encoding/base64", + "base64.NewEncoder": "encoding/base64", + "base64.NewEncoding": "encoding/base64", + "base64.NoPadding": "encoding/base64", + "base64.RawStdEncoding": "encoding/base64", + "base64.RawURLEncoding": "encoding/base64", + "base64.StdEncoding": "encoding/base64", + "base64.StdPadding": "encoding/base64", + "base64.URLEncoding": "encoding/base64", + "big.Above": "math/big", + "big.Accuracy": "math/big", + "big.AwayFromZero": "math/big", + "big.Below": "math/big", + "big.ErrNaN": "math/big", + "big.Exact": "math/big", + "big.Float": "math/big", + "big.Int": "math/big", + "big.Jacobi": "math/big", + "big.MaxBase": "math/big", + "big.MaxExp": "math/big", + "big.MaxPrec": "math/big", + "big.MinExp": "math/big", + "big.NewFloat": "math/big", + "big.NewInt": "math/big", + "big.NewRat": "math/big", + "big.ParseFloat": "math/big", + "big.Rat": "math/big", + "big.RoundingMode": "math/big", + "big.ToNearestAway": "math/big", + "big.ToNearestEven": "math/big", + "big.ToNegativeInf": "math/big", + "big.ToPositiveInf": "math/big", + "big.ToZero": "math/big", + "big.Word": "math/big", + "binary.BigEndian": "encoding/binary", + "binary.ByteOrder": "encoding/binary", + "binary.LittleEndian": "encoding/binary", + "binary.MaxVarintLen16": "encoding/binary", + "binary.MaxVarintLen32": "encoding/binary", + "binary.MaxVarintLen64": "encoding/binary", + "binary.PutUvarint": "encoding/binary", + "binary.PutVarint": "encoding/binary", + "binary.Read": "encoding/binary", + "binary.ReadUvarint": "encoding/binary", + "binary.ReadVarint": "encoding/binary", + "binary.Size": "encoding/binary", + "binary.Uvarint": "encoding/binary", + "binary.Varint": "encoding/binary", + "binary.Write": "encoding/binary", + "bufio.ErrAdvanceTooFar": "bufio", + "bufio.ErrBufferFull": "bufio", + "bufio.ErrInvalidUnreadByte": "bufio", + "bufio.ErrInvalidUnreadRune": "bufio", + "bufio.ErrNegativeAdvance": "bufio", + "bufio.ErrNegativeCount": "bufio", + "bufio.ErrTooLong": "bufio", + "bufio.MaxScanTokenSize": "bufio", + "bufio.NewReadWriter": "bufio", + "bufio.NewReader": "bufio", + "bufio.NewReaderSize": "bufio", + "bufio.NewScanner": "bufio", + "bufio.NewWriter": "bufio", + "bufio.NewWriterSize": "bufio", + "bufio.ReadWriter": "bufio", + "bufio.Reader": "bufio", + "bufio.ScanBytes": "bufio", + "bufio.ScanLines": "bufio", + "bufio.ScanRunes": "bufio", + "bufio.ScanWords": "bufio", + "bufio.Scanner": "bufio", + "bufio.SplitFunc": "bufio", + "bufio.Writer": "bufio", + "build.AllowBinary": "go/build", + "build.ArchChar": "go/build", + "build.Context": "go/build", + "build.Default": "go/build", + "build.FindOnly": "go/build", + "build.Import": "go/build", + "build.ImportComment": "go/build", + "build.ImportDir": "go/build", + "build.ImportMode": "go/build", + "build.IsLocalImport": "go/build", + "build.MultiplePackageError": "go/build", + "build.NoGoError": "go/build", + "build.Package": "go/build", + "build.ToolDir": "go/build", + "bytes.Buffer": "bytes", + "bytes.Compare": "bytes", + "bytes.Contains": "bytes", + "bytes.Count": "bytes", + "bytes.Equal": "bytes", + "bytes.EqualFold": "bytes", + "bytes.ErrTooLarge": "bytes", + "bytes.Fields": "bytes", + "bytes.FieldsFunc": "bytes", + "bytes.HasPrefix": "bytes", + "bytes.HasSuffix": "bytes", + "bytes.Index": "bytes", + "bytes.IndexAny": "bytes", + "bytes.IndexByte": "bytes", + "bytes.IndexFunc": "bytes", + "bytes.IndexRune": "bytes", + "bytes.Join": "bytes", + "bytes.LastIndex": "bytes", + "bytes.LastIndexAny": "bytes", + "bytes.LastIndexByte": "bytes", + "bytes.LastIndexFunc": "bytes", + "bytes.Map": "bytes", + "bytes.MinRead": "bytes", + "bytes.NewBuffer": "bytes", + "bytes.NewBufferString": "bytes", + "bytes.NewReader": "bytes", + "bytes.Reader": "bytes", + "bytes.Repeat": "bytes", + "bytes.Replace": "bytes", + "bytes.Runes": "bytes", + "bytes.Split": "bytes", + "bytes.SplitAfter": "bytes", + "bytes.SplitAfterN": "bytes", + "bytes.SplitN": "bytes", + "bytes.Title": "bytes", + "bytes.ToLower": "bytes", + "bytes.ToLowerSpecial": "bytes", + "bytes.ToTitle": "bytes", + "bytes.ToTitleSpecial": "bytes", + "bytes.ToUpper": "bytes", + "bytes.ToUpperSpecial": "bytes", + "bytes.Trim": "bytes", + "bytes.TrimFunc": "bytes", + "bytes.TrimLeft": "bytes", + "bytes.TrimLeftFunc": "bytes", + "bytes.TrimPrefix": "bytes", + "bytes.TrimRight": "bytes", + "bytes.TrimRightFunc": "bytes", + "bytes.TrimSpace": "bytes", + "bytes.TrimSuffix": "bytes", + "bzip2.NewReader": "compress/bzip2", + "bzip2.StructuralError": "compress/bzip2", + "cgi.Handler": "net/http/cgi", + "cgi.Request": "net/http/cgi", + "cgi.RequestFromMap": "net/http/cgi", + "cgi.Serve": "net/http/cgi", + "cipher.AEAD": "crypto/cipher", + "cipher.Block": "crypto/cipher", + "cipher.BlockMode": "crypto/cipher", + "cipher.NewCBCDecrypter": "crypto/cipher", + "cipher.NewCBCEncrypter": "crypto/cipher", + "cipher.NewCFBDecrypter": "crypto/cipher", + "cipher.NewCFBEncrypter": "crypto/cipher", + "cipher.NewCTR": "crypto/cipher", + "cipher.NewGCM": "crypto/cipher", + "cipher.NewGCMWithNonceSize": "crypto/cipher", + "cipher.NewOFB": "crypto/cipher", + "cipher.Stream": "crypto/cipher", + "cipher.StreamReader": "crypto/cipher", + "cipher.StreamWriter": "crypto/cipher", + "cmplx.Abs": "math/cmplx", + "cmplx.Acos": "math/cmplx", + "cmplx.Acosh": "math/cmplx", + "cmplx.Asin": "math/cmplx", + "cmplx.Asinh": "math/cmplx", + "cmplx.Atan": "math/cmplx", + "cmplx.Atanh": "math/cmplx", + "cmplx.Conj": "math/cmplx", + "cmplx.Cos": "math/cmplx", + "cmplx.Cosh": "math/cmplx", + "cmplx.Cot": "math/cmplx", + "cmplx.Exp": "math/cmplx", + "cmplx.Inf": "math/cmplx", + "cmplx.IsInf": "math/cmplx", + "cmplx.IsNaN": "math/cmplx", + "cmplx.Log": "math/cmplx", + "cmplx.Log10": "math/cmplx", + "cmplx.NaN": "math/cmplx", + "cmplx.Phase": "math/cmplx", + "cmplx.Polar": "math/cmplx", + "cmplx.Pow": "math/cmplx", + "cmplx.Rect": "math/cmplx", + "cmplx.Sin": "math/cmplx", + "cmplx.Sinh": "math/cmplx", + "cmplx.Sqrt": "math/cmplx", + "cmplx.Tan": "math/cmplx", + "cmplx.Tanh": "math/cmplx", + "color.Alpha": "image/color", + "color.Alpha16": "image/color", + "color.Alpha16Model": "image/color", + "color.AlphaModel": "image/color", + "color.Black": "image/color", + "color.CMYK": "image/color", + "color.CMYKModel": "image/color", + "color.CMYKToRGB": "image/color", + "color.Color": "image/color", + "color.Gray": "image/color", + "color.Gray16": "image/color", + "color.Gray16Model": "image/color", + "color.GrayModel": "image/color", + "color.Model": "image/color", + "color.ModelFunc": "image/color", + "color.NRGBA": "image/color", + "color.NRGBA64": "image/color", + "color.NRGBA64Model": "image/color", + "color.NRGBAModel": "image/color", + "color.Opaque": "image/color", + "color.Palette": "image/color", + "color.RGBA": "image/color", + "color.RGBA64": "image/color", + "color.RGBA64Model": "image/color", + "color.RGBAModel": "image/color", + "color.RGBToCMYK": "image/color", + "color.RGBToYCbCr": "image/color", + "color.Transparent": "image/color", + "color.White": "image/color", + "color.YCbCr": "image/color", + "color.YCbCrModel": "image/color", + "color.YCbCrToRGB": "image/color", + "constant.BinaryOp": "go/constant", + "constant.BitLen": "go/constant", + "constant.Bool": "go/constant", + "constant.BoolVal": "go/constant", + "constant.Bytes": "go/constant", + "constant.Compare": "go/constant", + "constant.Complex": "go/constant", + "constant.Denom": "go/constant", + "constant.Float": "go/constant", + "constant.Float32Val": "go/constant", + "constant.Float64Val": "go/constant", + "constant.Imag": "go/constant", + "constant.Int": "go/constant", + "constant.Int64Val": "go/constant", + "constant.Kind": "go/constant", + "constant.MakeBool": "go/constant", + "constant.MakeFloat64": "go/constant", + "constant.MakeFromBytes": "go/constant", + "constant.MakeFromLiteral": "go/constant", + "constant.MakeImag": "go/constant", + "constant.MakeInt64": "go/constant", + "constant.MakeString": "go/constant", + "constant.MakeUint64": "go/constant", + "constant.MakeUnknown": "go/constant", + "constant.Num": "go/constant", + "constant.Real": "go/constant", + "constant.Shift": "go/constant", + "constant.Sign": "go/constant", + "constant.String": "go/constant", + "constant.StringVal": "go/constant", + "constant.Uint64Val": "go/constant", + "constant.UnaryOp": "go/constant", + "constant.Unknown": "go/constant", + "cookiejar.Jar": "net/http/cookiejar", + "cookiejar.New": "net/http/cookiejar", + "cookiejar.Options": "net/http/cookiejar", + "cookiejar.PublicSuffixList": "net/http/cookiejar", + "crc32.Castagnoli": "hash/crc32", + "crc32.Checksum": "hash/crc32", + "crc32.ChecksumIEEE": "hash/crc32", + "crc32.IEEE": "hash/crc32", + "crc32.IEEETable": "hash/crc32", + "crc32.Koopman": "hash/crc32", + "crc32.MakeTable": "hash/crc32", + "crc32.New": "hash/crc32", + "crc32.NewIEEE": "hash/crc32", + "crc32.Size": "hash/crc32", + "crc32.Table": "hash/crc32", + "crc32.Update": "hash/crc32", + "crc64.Checksum": "hash/crc64", + "crc64.ECMA": "hash/crc64", + "crc64.ISO": "hash/crc64", + "crc64.MakeTable": "hash/crc64", + "crc64.New": "hash/crc64", + "crc64.Size": "hash/crc64", + "crc64.Table": "hash/crc64", + "crc64.Update": "hash/crc64", + "crypto.Decrypter": "crypto", + "crypto.DecrypterOpts": "crypto", + "crypto.Hash": "crypto", + "crypto.MD4": "crypto", + "crypto.MD5": "crypto", + "crypto.MD5SHA1": "crypto", + "crypto.PrivateKey": "crypto", + "crypto.PublicKey": "crypto", + "crypto.RIPEMD160": "crypto", + "crypto.RegisterHash": "crypto", + "crypto.SHA1": "crypto", + "crypto.SHA224": "crypto", + "crypto.SHA256": "crypto", + "crypto.SHA384": "crypto", + "crypto.SHA3_224": "crypto", + "crypto.SHA3_256": "crypto", + "crypto.SHA3_384": "crypto", + "crypto.SHA3_512": "crypto", + "crypto.SHA512": "crypto", + "crypto.SHA512_224": "crypto", + "crypto.SHA512_256": "crypto", + "crypto.Signer": "crypto", + "crypto.SignerOpts": "crypto", + "csv.ErrBareQuote": "encoding/csv", + "csv.ErrFieldCount": "encoding/csv", + "csv.ErrQuote": "encoding/csv", + "csv.ErrTrailingComma": "encoding/csv", + "csv.NewReader": "encoding/csv", + "csv.NewWriter": "encoding/csv", + "csv.ParseError": "encoding/csv", + "csv.Reader": "encoding/csv", + "csv.Writer": "encoding/csv", + "debug.FreeOSMemory": "runtime/debug", + "debug.GCStats": "runtime/debug", + "debug.PrintStack": "runtime/debug", + "debug.ReadGCStats": "runtime/debug", + "debug.SetGCPercent": "runtime/debug", + "debug.SetMaxStack": "runtime/debug", + "debug.SetMaxThreads": "runtime/debug", + "debug.SetPanicOnFault": "runtime/debug", + "debug.Stack": "runtime/debug", + "debug.WriteHeapDump": "runtime/debug", + "des.BlockSize": "crypto/des", + "des.KeySizeError": "crypto/des", + "des.NewCipher": "crypto/des", + "des.NewTripleDESCipher": "crypto/des", + "doc.AllDecls": "go/doc", + "doc.AllMethods": "go/doc", + "doc.Example": "go/doc", + "doc.Examples": "go/doc", + "doc.Filter": "go/doc", + "doc.Func": "go/doc", + "doc.IllegalPrefixes": "go/doc", + "doc.Mode": "go/doc", + "doc.New": "go/doc", + "doc.Note": "go/doc", + "doc.Package": "go/doc", + "doc.Synopsis": "go/doc", + "doc.ToHTML": "go/doc", + "doc.ToText": "go/doc", + "doc.Type": "go/doc", + "doc.Value": "go/doc", + "draw.Draw": "image/draw", + "draw.DrawMask": "image/draw", + "draw.Drawer": "image/draw", + "draw.FloydSteinberg": "image/draw", + "draw.Image": "image/draw", + "draw.Op": "image/draw", + "draw.Over": "image/draw", + "draw.Quantizer": "image/draw", + "draw.Src": "image/draw", + "driver.Bool": "database/sql/driver", + "driver.ColumnConverter": "database/sql/driver", + "driver.Conn": "database/sql/driver", + "driver.DefaultParameterConverter": "database/sql/driver", + "driver.Driver": "database/sql/driver", + "driver.ErrBadConn": "database/sql/driver", + "driver.ErrSkip": "database/sql/driver", + "driver.Execer": "database/sql/driver", + "driver.Int32": "database/sql/driver", + "driver.IsScanValue": "database/sql/driver", + "driver.IsValue": "database/sql/driver", + "driver.NotNull": "database/sql/driver", + "driver.Null": "database/sql/driver", + "driver.Queryer": "database/sql/driver", + "driver.Result": "database/sql/driver", + "driver.ResultNoRows": "database/sql/driver", + "driver.Rows": "database/sql/driver", + "driver.RowsAffected": "database/sql/driver", + "driver.Stmt": "database/sql/driver", + "driver.String": "database/sql/driver", + "driver.Tx": "database/sql/driver", + "driver.Value": "database/sql/driver", + "driver.ValueConverter": "database/sql/driver", + "driver.Valuer": "database/sql/driver", + "dsa.ErrInvalidPublicKey": "crypto/dsa", + "dsa.GenerateKey": "crypto/dsa", + "dsa.GenerateParameters": "crypto/dsa", + "dsa.L1024N160": "crypto/dsa", + "dsa.L2048N224": "crypto/dsa", + "dsa.L2048N256": "crypto/dsa", + "dsa.L3072N256": "crypto/dsa", + "dsa.ParameterSizes": "crypto/dsa", + "dsa.Parameters": "crypto/dsa", + "dsa.PrivateKey": "crypto/dsa", + "dsa.PublicKey": "crypto/dsa", + "dsa.Sign": "crypto/dsa", + "dsa.Verify": "crypto/dsa", + "dwarf.AddrType": "debug/dwarf", + "dwarf.ArrayType": "debug/dwarf", + "dwarf.Attr": "debug/dwarf", + "dwarf.AttrAbstractOrigin": "debug/dwarf", + "dwarf.AttrAccessibility": "debug/dwarf", + "dwarf.AttrAddrClass": "debug/dwarf", + "dwarf.AttrAllocated": "debug/dwarf", + "dwarf.AttrArtificial": "debug/dwarf", + "dwarf.AttrAssociated": "debug/dwarf", + "dwarf.AttrBaseTypes": "debug/dwarf", + "dwarf.AttrBitOffset": "debug/dwarf", + "dwarf.AttrBitSize": "debug/dwarf", + "dwarf.AttrByteSize": "debug/dwarf", + "dwarf.AttrCallColumn": "debug/dwarf", + "dwarf.AttrCallFile": "debug/dwarf", + "dwarf.AttrCallLine": "debug/dwarf", + "dwarf.AttrCalling": "debug/dwarf", + "dwarf.AttrCommonRef": "debug/dwarf", + "dwarf.AttrCompDir": "debug/dwarf", + "dwarf.AttrConstValue": "debug/dwarf", + "dwarf.AttrContainingType": "debug/dwarf", + "dwarf.AttrCount": "debug/dwarf", + "dwarf.AttrDataLocation": "debug/dwarf", + "dwarf.AttrDataMemberLoc": "debug/dwarf", + "dwarf.AttrDeclColumn": "debug/dwarf", + "dwarf.AttrDeclFile": "debug/dwarf", + "dwarf.AttrDeclLine": "debug/dwarf", + "dwarf.AttrDeclaration": "debug/dwarf", + "dwarf.AttrDefaultValue": "debug/dwarf", + "dwarf.AttrDescription": "debug/dwarf", + "dwarf.AttrDiscr": "debug/dwarf", + "dwarf.AttrDiscrList": "debug/dwarf", + "dwarf.AttrDiscrValue": "debug/dwarf", + "dwarf.AttrEncoding": "debug/dwarf", + "dwarf.AttrEntrypc": "debug/dwarf", + "dwarf.AttrExtension": "debug/dwarf", + "dwarf.AttrExternal": "debug/dwarf", + "dwarf.AttrFrameBase": "debug/dwarf", + "dwarf.AttrFriend": "debug/dwarf", + "dwarf.AttrHighpc": "debug/dwarf", + "dwarf.AttrIdentifierCase": "debug/dwarf", + "dwarf.AttrImport": "debug/dwarf", + "dwarf.AttrInline": "debug/dwarf", + "dwarf.AttrIsOptional": "debug/dwarf", + "dwarf.AttrLanguage": "debug/dwarf", + "dwarf.AttrLocation": "debug/dwarf", + "dwarf.AttrLowerBound": "debug/dwarf", + "dwarf.AttrLowpc": "debug/dwarf", + "dwarf.AttrMacroInfo": "debug/dwarf", + "dwarf.AttrName": "debug/dwarf", + "dwarf.AttrNamelistItem": "debug/dwarf", + "dwarf.AttrOrdering": "debug/dwarf", + "dwarf.AttrPriority": "debug/dwarf", + "dwarf.AttrProducer": "debug/dwarf", + "dwarf.AttrPrototyped": "debug/dwarf", + "dwarf.AttrRanges": "debug/dwarf", + "dwarf.AttrReturnAddr": "debug/dwarf", + "dwarf.AttrSegment": "debug/dwarf", + "dwarf.AttrSibling": "debug/dwarf", + "dwarf.AttrSpecification": "debug/dwarf", + "dwarf.AttrStartScope": "debug/dwarf", + "dwarf.AttrStaticLink": "debug/dwarf", + "dwarf.AttrStmtList": "debug/dwarf", + "dwarf.AttrStride": "debug/dwarf", + "dwarf.AttrStrideSize": "debug/dwarf", + "dwarf.AttrStringLength": "debug/dwarf", + "dwarf.AttrTrampoline": "debug/dwarf", + "dwarf.AttrType": "debug/dwarf", + "dwarf.AttrUpperBound": "debug/dwarf", + "dwarf.AttrUseLocation": "debug/dwarf", + "dwarf.AttrUseUTF8": "debug/dwarf", + "dwarf.AttrVarParam": "debug/dwarf", + "dwarf.AttrVirtuality": "debug/dwarf", + "dwarf.AttrVisibility": "debug/dwarf", + "dwarf.AttrVtableElemLoc": "debug/dwarf", + "dwarf.BasicType": "debug/dwarf", + "dwarf.BoolType": "debug/dwarf", + "dwarf.CharType": "debug/dwarf", + "dwarf.Class": "debug/dwarf", + "dwarf.ClassAddress": "debug/dwarf", + "dwarf.ClassBlock": "debug/dwarf", + "dwarf.ClassConstant": "debug/dwarf", + "dwarf.ClassExprLoc": "debug/dwarf", + "dwarf.ClassFlag": "debug/dwarf", + "dwarf.ClassLinePtr": "debug/dwarf", + "dwarf.ClassLocListPtr": "debug/dwarf", + "dwarf.ClassMacPtr": "debug/dwarf", + "dwarf.ClassRangeListPtr": "debug/dwarf", + "dwarf.ClassReference": "debug/dwarf", + "dwarf.ClassReferenceAlt": "debug/dwarf", + "dwarf.ClassReferenceSig": "debug/dwarf", + "dwarf.ClassString": "debug/dwarf", + "dwarf.ClassStringAlt": "debug/dwarf", + "dwarf.CommonType": "debug/dwarf", + "dwarf.ComplexType": "debug/dwarf", + "dwarf.Data": "debug/dwarf", + "dwarf.DecodeError": "debug/dwarf", + "dwarf.DotDotDotType": "debug/dwarf", + "dwarf.Entry": "debug/dwarf", + "dwarf.EnumType": "debug/dwarf", + "dwarf.EnumValue": "debug/dwarf", + "dwarf.ErrUnknownPC": "debug/dwarf", + "dwarf.Field": "debug/dwarf", + "dwarf.FloatType": "debug/dwarf", + "dwarf.FuncType": "debug/dwarf", + "dwarf.IntType": "debug/dwarf", + "dwarf.LineEntry": "debug/dwarf", + "dwarf.LineFile": "debug/dwarf", + "dwarf.LineReader": "debug/dwarf", + "dwarf.LineReaderPos": "debug/dwarf", + "dwarf.New": "debug/dwarf", + "dwarf.Offset": "debug/dwarf", + "dwarf.PtrType": "debug/dwarf", + "dwarf.QualType": "debug/dwarf", + "dwarf.Reader": "debug/dwarf", + "dwarf.StructField": "debug/dwarf", + "dwarf.StructType": "debug/dwarf", + "dwarf.Tag": "debug/dwarf", + "dwarf.TagAccessDeclaration": "debug/dwarf", + "dwarf.TagArrayType": "debug/dwarf", + "dwarf.TagBaseType": "debug/dwarf", + "dwarf.TagCatchDwarfBlock": "debug/dwarf", + "dwarf.TagClassType": "debug/dwarf", + "dwarf.TagCommonDwarfBlock": "debug/dwarf", + "dwarf.TagCommonInclusion": "debug/dwarf", + "dwarf.TagCompileUnit": "debug/dwarf", + "dwarf.TagCondition": "debug/dwarf", + "dwarf.TagConstType": "debug/dwarf", + "dwarf.TagConstant": "debug/dwarf", + "dwarf.TagDwarfProcedure": "debug/dwarf", + "dwarf.TagEntryPoint": "debug/dwarf", + "dwarf.TagEnumerationType": "debug/dwarf", + "dwarf.TagEnumerator": "debug/dwarf", + "dwarf.TagFileType": "debug/dwarf", + "dwarf.TagFormalParameter": "debug/dwarf", + "dwarf.TagFriend": "debug/dwarf", + "dwarf.TagImportedDeclaration": "debug/dwarf", + "dwarf.TagImportedModule": "debug/dwarf", + "dwarf.TagImportedUnit": "debug/dwarf", + "dwarf.TagInheritance": "debug/dwarf", + "dwarf.TagInlinedSubroutine": "debug/dwarf", + "dwarf.TagInterfaceType": "debug/dwarf", + "dwarf.TagLabel": "debug/dwarf", + "dwarf.TagLexDwarfBlock": "debug/dwarf", + "dwarf.TagMember": "debug/dwarf", + "dwarf.TagModule": "debug/dwarf", + "dwarf.TagMutableType": "debug/dwarf", + "dwarf.TagNamelist": "debug/dwarf", + "dwarf.TagNamelistItem": "debug/dwarf", + "dwarf.TagNamespace": "debug/dwarf", + "dwarf.TagPackedType": "debug/dwarf", + "dwarf.TagPartialUnit": "debug/dwarf", + "dwarf.TagPointerType": "debug/dwarf", + "dwarf.TagPtrToMemberType": "debug/dwarf", + "dwarf.TagReferenceType": "debug/dwarf", + "dwarf.TagRestrictType": "debug/dwarf", + "dwarf.TagRvalueReferenceType": "debug/dwarf", + "dwarf.TagSetType": "debug/dwarf", + "dwarf.TagSharedType": "debug/dwarf", + "dwarf.TagStringType": "debug/dwarf", + "dwarf.TagStructType": "debug/dwarf", + "dwarf.TagSubprogram": "debug/dwarf", + "dwarf.TagSubrangeType": "debug/dwarf", + "dwarf.TagSubroutineType": "debug/dwarf", + "dwarf.TagTemplateAlias": "debug/dwarf", + "dwarf.TagTemplateTypeParameter": "debug/dwarf", + "dwarf.TagTemplateValueParameter": "debug/dwarf", + "dwarf.TagThrownType": "debug/dwarf", + "dwarf.TagTryDwarfBlock": "debug/dwarf", + "dwarf.TagTypeUnit": "debug/dwarf", + "dwarf.TagTypedef": "debug/dwarf", + "dwarf.TagUnionType": "debug/dwarf", + "dwarf.TagUnspecifiedParameters": "debug/dwarf", + "dwarf.TagUnspecifiedType": "debug/dwarf", + "dwarf.TagVariable": "debug/dwarf", + "dwarf.TagVariant": "debug/dwarf", + "dwarf.TagVariantPart": "debug/dwarf", + "dwarf.TagVolatileType": "debug/dwarf", + "dwarf.TagWithStmt": "debug/dwarf", + "dwarf.Type": "debug/dwarf", + "dwarf.TypedefType": "debug/dwarf", + "dwarf.UcharType": "debug/dwarf", + "dwarf.UintType": "debug/dwarf", + "dwarf.UnspecifiedType": "debug/dwarf", + "dwarf.VoidType": "debug/dwarf", + "ecdsa.GenerateKey": "crypto/ecdsa", + "ecdsa.PrivateKey": "crypto/ecdsa", + "ecdsa.PublicKey": "crypto/ecdsa", + "ecdsa.Sign": "crypto/ecdsa", + "ecdsa.Verify": "crypto/ecdsa", + "elf.ARM_MAGIC_TRAMP_NUMBER": "debug/elf", + "elf.Class": "debug/elf", + "elf.DF_BIND_NOW": "debug/elf", + "elf.DF_ORIGIN": "debug/elf", + "elf.DF_STATIC_TLS": "debug/elf", + "elf.DF_SYMBOLIC": "debug/elf", + "elf.DF_TEXTREL": "debug/elf", + "elf.DT_BIND_NOW": "debug/elf", + "elf.DT_DEBUG": "debug/elf", + "elf.DT_ENCODING": "debug/elf", + "elf.DT_FINI": "debug/elf", + "elf.DT_FINI_ARRAY": "debug/elf", + "elf.DT_FINI_ARRAYSZ": "debug/elf", + "elf.DT_FLAGS": "debug/elf", + "elf.DT_HASH": "debug/elf", + "elf.DT_HIOS": "debug/elf", + "elf.DT_HIPROC": "debug/elf", + "elf.DT_INIT": "debug/elf", + "elf.DT_INIT_ARRAY": "debug/elf", + "elf.DT_INIT_ARRAYSZ": "debug/elf", + "elf.DT_JMPREL": "debug/elf", + "elf.DT_LOOS": "debug/elf", + "elf.DT_LOPROC": "debug/elf", + "elf.DT_NEEDED": "debug/elf", + "elf.DT_NULL": "debug/elf", + "elf.DT_PLTGOT": "debug/elf", + "elf.DT_PLTREL": "debug/elf", + "elf.DT_PLTRELSZ": "debug/elf", + "elf.DT_PREINIT_ARRAY": "debug/elf", + "elf.DT_PREINIT_ARRAYSZ": "debug/elf", + "elf.DT_REL": "debug/elf", + "elf.DT_RELA": "debug/elf", + "elf.DT_RELAENT": "debug/elf", + "elf.DT_RELASZ": "debug/elf", + "elf.DT_RELENT": "debug/elf", + "elf.DT_RELSZ": "debug/elf", + "elf.DT_RPATH": "debug/elf", + "elf.DT_RUNPATH": "debug/elf", + "elf.DT_SONAME": "debug/elf", + "elf.DT_STRSZ": "debug/elf", + "elf.DT_STRTAB": "debug/elf", + "elf.DT_SYMBOLIC": "debug/elf", + "elf.DT_SYMENT": "debug/elf", + "elf.DT_SYMTAB": "debug/elf", + "elf.DT_TEXTREL": "debug/elf", + "elf.DT_VERNEED": "debug/elf", + "elf.DT_VERNEEDNUM": "debug/elf", + "elf.DT_VERSYM": "debug/elf", + "elf.Data": "debug/elf", + "elf.Dyn32": "debug/elf", + "elf.Dyn64": "debug/elf", + "elf.DynFlag": "debug/elf", + "elf.DynTag": "debug/elf", + "elf.EI_ABIVERSION": "debug/elf", + "elf.EI_CLASS": "debug/elf", + "elf.EI_DATA": "debug/elf", + "elf.EI_NIDENT": "debug/elf", + "elf.EI_OSABI": "debug/elf", + "elf.EI_PAD": "debug/elf", + "elf.EI_VERSION": "debug/elf", + "elf.ELFCLASS32": "debug/elf", + "elf.ELFCLASS64": "debug/elf", + "elf.ELFCLASSNONE": "debug/elf", + "elf.ELFDATA2LSB": "debug/elf", + "elf.ELFDATA2MSB": "debug/elf", + "elf.ELFDATANONE": "debug/elf", + "elf.ELFMAG": "debug/elf", + "elf.ELFOSABI_86OPEN": "debug/elf", + "elf.ELFOSABI_AIX": "debug/elf", + "elf.ELFOSABI_ARM": "debug/elf", + "elf.ELFOSABI_FREEBSD": "debug/elf", + "elf.ELFOSABI_HPUX": "debug/elf", + "elf.ELFOSABI_HURD": "debug/elf", + "elf.ELFOSABI_IRIX": "debug/elf", + "elf.ELFOSABI_LINUX": "debug/elf", + "elf.ELFOSABI_MODESTO": "debug/elf", + "elf.ELFOSABI_NETBSD": "debug/elf", + "elf.ELFOSABI_NONE": "debug/elf", + "elf.ELFOSABI_NSK": "debug/elf", + "elf.ELFOSABI_OPENBSD": "debug/elf", + "elf.ELFOSABI_OPENVMS": "debug/elf", + "elf.ELFOSABI_SOLARIS": "debug/elf", + "elf.ELFOSABI_STANDALONE": "debug/elf", + "elf.ELFOSABI_TRU64": "debug/elf", + "elf.EM_386": "debug/elf", + "elf.EM_486": "debug/elf", + "elf.EM_68HC12": "debug/elf", + "elf.EM_68K": "debug/elf", + "elf.EM_860": "debug/elf", + "elf.EM_88K": "debug/elf", + "elf.EM_960": "debug/elf", + "elf.EM_AARCH64": "debug/elf", + "elf.EM_ALPHA": "debug/elf", + "elf.EM_ALPHA_STD": "debug/elf", + "elf.EM_ARC": "debug/elf", + "elf.EM_ARM": "debug/elf", + "elf.EM_COLDFIRE": "debug/elf", + "elf.EM_FR20": "debug/elf", + "elf.EM_H8S": "debug/elf", + "elf.EM_H8_300": "debug/elf", + "elf.EM_H8_300H": "debug/elf", + "elf.EM_H8_500": "debug/elf", + "elf.EM_IA_64": "debug/elf", + "elf.EM_M32": "debug/elf", + "elf.EM_ME16": "debug/elf", + "elf.EM_MIPS": "debug/elf", + "elf.EM_MIPS_RS3_LE": "debug/elf", + "elf.EM_MIPS_RS4_BE": "debug/elf", + "elf.EM_MIPS_X": "debug/elf", + "elf.EM_MMA": "debug/elf", + "elf.EM_NCPU": "debug/elf", + "elf.EM_NDR1": "debug/elf", + "elf.EM_NONE": "debug/elf", + "elf.EM_PARISC": "debug/elf", + "elf.EM_PCP": "debug/elf", + "elf.EM_PPC": "debug/elf", + "elf.EM_PPC64": "debug/elf", + "elf.EM_RCE": "debug/elf", + "elf.EM_RH32": "debug/elf", + "elf.EM_S370": "debug/elf", + "elf.EM_S390": "debug/elf", + "elf.EM_SH": "debug/elf", + "elf.EM_SPARC": "debug/elf", + "elf.EM_SPARC32PLUS": "debug/elf", + "elf.EM_SPARCV9": "debug/elf", + "elf.EM_ST100": "debug/elf", + "elf.EM_STARCORE": "debug/elf", + "elf.EM_TINYJ": "debug/elf", + "elf.EM_TRICORE": "debug/elf", + "elf.EM_V800": "debug/elf", + "elf.EM_VPP500": "debug/elf", + "elf.EM_X86_64": "debug/elf", + "elf.ET_CORE": "debug/elf", + "elf.ET_DYN": "debug/elf", + "elf.ET_EXEC": "debug/elf", + "elf.ET_HIOS": "debug/elf", + "elf.ET_HIPROC": "debug/elf", + "elf.ET_LOOS": "debug/elf", + "elf.ET_LOPROC": "debug/elf", + "elf.ET_NONE": "debug/elf", + "elf.ET_REL": "debug/elf", + "elf.EV_CURRENT": "debug/elf", + "elf.EV_NONE": "debug/elf", + "elf.ErrNoSymbols": "debug/elf", + "elf.File": "debug/elf", + "elf.FileHeader": "debug/elf", + "elf.FormatError": "debug/elf", + "elf.Header32": "debug/elf", + "elf.Header64": "debug/elf", + "elf.ImportedSymbol": "debug/elf", + "elf.Machine": "debug/elf", + "elf.NT_FPREGSET": "debug/elf", + "elf.NT_PRPSINFO": "debug/elf", + "elf.NT_PRSTATUS": "debug/elf", + "elf.NType": "debug/elf", + "elf.NewFile": "debug/elf", + "elf.OSABI": "debug/elf", + "elf.Open": "debug/elf", + "elf.PF_MASKOS": "debug/elf", + "elf.PF_MASKPROC": "debug/elf", + "elf.PF_R": "debug/elf", + "elf.PF_W": "debug/elf", + "elf.PF_X": "debug/elf", + "elf.PT_DYNAMIC": "debug/elf", + "elf.PT_HIOS": "debug/elf", + "elf.PT_HIPROC": "debug/elf", + "elf.PT_INTERP": "debug/elf", + "elf.PT_LOAD": "debug/elf", + "elf.PT_LOOS": "debug/elf", + "elf.PT_LOPROC": "debug/elf", + "elf.PT_NOTE": "debug/elf", + "elf.PT_NULL": "debug/elf", + "elf.PT_PHDR": "debug/elf", + "elf.PT_SHLIB": "debug/elf", + "elf.PT_TLS": "debug/elf", + "elf.Prog": "debug/elf", + "elf.Prog32": "debug/elf", + "elf.Prog64": "debug/elf", + "elf.ProgFlag": "debug/elf", + "elf.ProgHeader": "debug/elf", + "elf.ProgType": "debug/elf", + "elf.R_386": "debug/elf", + "elf.R_386_32": "debug/elf", + "elf.R_386_COPY": "debug/elf", + "elf.R_386_GLOB_DAT": "debug/elf", + "elf.R_386_GOT32": "debug/elf", + "elf.R_386_GOTOFF": "debug/elf", + "elf.R_386_GOTPC": "debug/elf", + "elf.R_386_JMP_SLOT": "debug/elf", + "elf.R_386_NONE": "debug/elf", + "elf.R_386_PC32": "debug/elf", + "elf.R_386_PLT32": "debug/elf", + "elf.R_386_RELATIVE": "debug/elf", + "elf.R_386_TLS_DTPMOD32": "debug/elf", + "elf.R_386_TLS_DTPOFF32": "debug/elf", + "elf.R_386_TLS_GD": "debug/elf", + "elf.R_386_TLS_GD_32": "debug/elf", + "elf.R_386_TLS_GD_CALL": "debug/elf", + "elf.R_386_TLS_GD_POP": "debug/elf", + "elf.R_386_TLS_GD_PUSH": "debug/elf", + "elf.R_386_TLS_GOTIE": "debug/elf", + "elf.R_386_TLS_IE": "debug/elf", + "elf.R_386_TLS_IE_32": "debug/elf", + "elf.R_386_TLS_LDM": "debug/elf", + "elf.R_386_TLS_LDM_32": "debug/elf", + "elf.R_386_TLS_LDM_CALL": "debug/elf", + "elf.R_386_TLS_LDM_POP": "debug/elf", + "elf.R_386_TLS_LDM_PUSH": "debug/elf", + "elf.R_386_TLS_LDO_32": "debug/elf", + "elf.R_386_TLS_LE": "debug/elf", + "elf.R_386_TLS_LE_32": "debug/elf", + "elf.R_386_TLS_TPOFF": "debug/elf", + "elf.R_386_TLS_TPOFF32": "debug/elf", + "elf.R_AARCH64": "debug/elf", + "elf.R_AARCH64_ABS16": "debug/elf", + "elf.R_AARCH64_ABS32": "debug/elf", + "elf.R_AARCH64_ABS64": "debug/elf", + "elf.R_AARCH64_ADD_ABS_LO12_NC": "debug/elf", + "elf.R_AARCH64_ADR_GOT_PAGE": "debug/elf", + "elf.R_AARCH64_ADR_PREL_LO21": "debug/elf", + "elf.R_AARCH64_ADR_PREL_PG_HI21": "debug/elf", + "elf.R_AARCH64_ADR_PREL_PG_HI21_NC": "debug/elf", + "elf.R_AARCH64_CALL26": "debug/elf", + "elf.R_AARCH64_CONDBR19": "debug/elf", + "elf.R_AARCH64_COPY": "debug/elf", + "elf.R_AARCH64_GLOB_DAT": "debug/elf", + "elf.R_AARCH64_GOT_LD_PREL19": "debug/elf", + "elf.R_AARCH64_IRELATIVE": "debug/elf", + "elf.R_AARCH64_JUMP26": "debug/elf", + "elf.R_AARCH64_JUMP_SLOT": "debug/elf", + "elf.R_AARCH64_LD64_GOT_LO12_NC": "debug/elf", + "elf.R_AARCH64_LDST128_ABS_LO12_NC": "debug/elf", + "elf.R_AARCH64_LDST16_ABS_LO12_NC": "debug/elf", + "elf.R_AARCH64_LDST32_ABS_LO12_NC": "debug/elf", + "elf.R_AARCH64_LDST64_ABS_LO12_NC": "debug/elf", + "elf.R_AARCH64_LDST8_ABS_LO12_NC": "debug/elf", + "elf.R_AARCH64_LD_PREL_LO19": "debug/elf", + "elf.R_AARCH64_MOVW_SABS_G0": "debug/elf", + "elf.R_AARCH64_MOVW_SABS_G1": "debug/elf", + "elf.R_AARCH64_MOVW_SABS_G2": "debug/elf", + "elf.R_AARCH64_MOVW_UABS_G0": "debug/elf", + "elf.R_AARCH64_MOVW_UABS_G0_NC": "debug/elf", + "elf.R_AARCH64_MOVW_UABS_G1": "debug/elf", + "elf.R_AARCH64_MOVW_UABS_G1_NC": "debug/elf", + "elf.R_AARCH64_MOVW_UABS_G2": "debug/elf", + "elf.R_AARCH64_MOVW_UABS_G2_NC": "debug/elf", + "elf.R_AARCH64_MOVW_UABS_G3": "debug/elf", + "elf.R_AARCH64_NONE": "debug/elf", + "elf.R_AARCH64_NULL": "debug/elf", + "elf.R_AARCH64_P32_ABS16": "debug/elf", + "elf.R_AARCH64_P32_ABS32": "debug/elf", + "elf.R_AARCH64_P32_ADD_ABS_LO12_NC": "debug/elf", + "elf.R_AARCH64_P32_ADR_GOT_PAGE": "debug/elf", + "elf.R_AARCH64_P32_ADR_PREL_LO21": "debug/elf", + "elf.R_AARCH64_P32_ADR_PREL_PG_HI21": "debug/elf", + "elf.R_AARCH64_P32_CALL26": "debug/elf", + "elf.R_AARCH64_P32_CONDBR19": "debug/elf", + "elf.R_AARCH64_P32_COPY": "debug/elf", + "elf.R_AARCH64_P32_GLOB_DAT": "debug/elf", + "elf.R_AARCH64_P32_GOT_LD_PREL19": "debug/elf", + "elf.R_AARCH64_P32_IRELATIVE": "debug/elf", + "elf.R_AARCH64_P32_JUMP26": "debug/elf", + "elf.R_AARCH64_P32_JUMP_SLOT": "debug/elf", + "elf.R_AARCH64_P32_LD32_GOT_LO12_NC": "debug/elf", + "elf.R_AARCH64_P32_LDST128_ABS_LO12_NC": "debug/elf", + "elf.R_AARCH64_P32_LDST16_ABS_LO12_NC": "debug/elf", + "elf.R_AARCH64_P32_LDST32_ABS_LO12_NC": "debug/elf", + "elf.R_AARCH64_P32_LDST64_ABS_LO12_NC": "debug/elf", + "elf.R_AARCH64_P32_LDST8_ABS_LO12_NC": "debug/elf", + "elf.R_AARCH64_P32_LD_PREL_LO19": "debug/elf", + "elf.R_AARCH64_P32_MOVW_SABS_G0": "debug/elf", + "elf.R_AARCH64_P32_MOVW_UABS_G0": "debug/elf", + "elf.R_AARCH64_P32_MOVW_UABS_G0_NC": "debug/elf", + "elf.R_AARCH64_P32_MOVW_UABS_G1": "debug/elf", + "elf.R_AARCH64_P32_PREL16": "debug/elf", + "elf.R_AARCH64_P32_PREL32": "debug/elf", + "elf.R_AARCH64_P32_RELATIVE": "debug/elf", + "elf.R_AARCH64_P32_TLSDESC": "debug/elf", + "elf.R_AARCH64_P32_TLSDESC_ADD_LO12_NC": "debug/elf", + "elf.R_AARCH64_P32_TLSDESC_ADR_PAGE21": "debug/elf", + "elf.R_AARCH64_P32_TLSDESC_ADR_PREL21": "debug/elf", + "elf.R_AARCH64_P32_TLSDESC_CALL": "debug/elf", + "elf.R_AARCH64_P32_TLSDESC_LD32_LO12_NC": "debug/elf", + "elf.R_AARCH64_P32_TLSDESC_LD_PREL19": "debug/elf", + "elf.R_AARCH64_P32_TLSGD_ADD_LO12_NC": "debug/elf", + "elf.R_AARCH64_P32_TLSGD_ADR_PAGE21": "debug/elf", + "elf.R_AARCH64_P32_TLSIE_ADR_GOTTPREL_PAGE21": "debug/elf", + "elf.R_AARCH64_P32_TLSIE_LD32_GOTTPREL_LO12_NC": "debug/elf", + "elf.R_AARCH64_P32_TLSIE_LD_GOTTPREL_PREL19": "debug/elf", + "elf.R_AARCH64_P32_TLSLE_ADD_TPREL_HI12": "debug/elf", + "elf.R_AARCH64_P32_TLSLE_ADD_TPREL_LO12": "debug/elf", + "elf.R_AARCH64_P32_TLSLE_ADD_TPREL_LO12_NC": "debug/elf", + "elf.R_AARCH64_P32_TLSLE_MOVW_TPREL_G0": "debug/elf", + "elf.R_AARCH64_P32_TLSLE_MOVW_TPREL_G0_NC": "debug/elf", + "elf.R_AARCH64_P32_TLSLE_MOVW_TPREL_G1": "debug/elf", + "elf.R_AARCH64_P32_TLS_DTPMOD": "debug/elf", + "elf.R_AARCH64_P32_TLS_DTPREL": "debug/elf", + "elf.R_AARCH64_P32_TLS_TPREL": "debug/elf", + "elf.R_AARCH64_P32_TSTBR14": "debug/elf", + "elf.R_AARCH64_PREL16": "debug/elf", + "elf.R_AARCH64_PREL32": "debug/elf", + "elf.R_AARCH64_PREL64": "debug/elf", + "elf.R_AARCH64_RELATIVE": "debug/elf", + "elf.R_AARCH64_TLSDESC": "debug/elf", + "elf.R_AARCH64_TLSDESC_ADD": "debug/elf", + "elf.R_AARCH64_TLSDESC_ADD_LO12_NC": "debug/elf", + "elf.R_AARCH64_TLSDESC_ADR_PAGE21": "debug/elf", + "elf.R_AARCH64_TLSDESC_ADR_PREL21": "debug/elf", + "elf.R_AARCH64_TLSDESC_CALL": "debug/elf", + "elf.R_AARCH64_TLSDESC_LD64_LO12_NC": "debug/elf", + "elf.R_AARCH64_TLSDESC_LDR": "debug/elf", + "elf.R_AARCH64_TLSDESC_LD_PREL19": "debug/elf", + "elf.R_AARCH64_TLSDESC_OFF_G0_NC": "debug/elf", + "elf.R_AARCH64_TLSDESC_OFF_G1": "debug/elf", + "elf.R_AARCH64_TLSGD_ADD_LO12_NC": "debug/elf", + "elf.R_AARCH64_TLSGD_ADR_PAGE21": "debug/elf", + "elf.R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21": "debug/elf", + "elf.R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC": "debug/elf", + "elf.R_AARCH64_TLSIE_LD_GOTTPREL_PREL19": "debug/elf", + "elf.R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC": "debug/elf", + "elf.R_AARCH64_TLSIE_MOVW_GOTTPREL_G1": "debug/elf", + "elf.R_AARCH64_TLSLE_ADD_TPREL_HI12": "debug/elf", + "elf.R_AARCH64_TLSLE_ADD_TPREL_LO12": "debug/elf", + "elf.R_AARCH64_TLSLE_ADD_TPREL_LO12_NC": "debug/elf", + "elf.R_AARCH64_TLSLE_MOVW_TPREL_G0": "debug/elf", + "elf.R_AARCH64_TLSLE_MOVW_TPREL_G0_NC": "debug/elf", + "elf.R_AARCH64_TLSLE_MOVW_TPREL_G1": "debug/elf", + "elf.R_AARCH64_TLSLE_MOVW_TPREL_G1_NC": "debug/elf", + "elf.R_AARCH64_TLSLE_MOVW_TPREL_G2": "debug/elf", + "elf.R_AARCH64_TLS_DTPMOD64": "debug/elf", + "elf.R_AARCH64_TLS_DTPREL64": "debug/elf", + "elf.R_AARCH64_TLS_TPREL64": "debug/elf", + "elf.R_AARCH64_TSTBR14": "debug/elf", + "elf.R_ALPHA": "debug/elf", + "elf.R_ALPHA_BRADDR": "debug/elf", + "elf.R_ALPHA_COPY": "debug/elf", + "elf.R_ALPHA_GLOB_DAT": "debug/elf", + "elf.R_ALPHA_GPDISP": "debug/elf", + "elf.R_ALPHA_GPREL32": "debug/elf", + "elf.R_ALPHA_GPRELHIGH": "debug/elf", + "elf.R_ALPHA_GPRELLOW": "debug/elf", + "elf.R_ALPHA_GPVALUE": "debug/elf", + "elf.R_ALPHA_HINT": "debug/elf", + "elf.R_ALPHA_IMMED_BR_HI32": "debug/elf", + "elf.R_ALPHA_IMMED_GP_16": "debug/elf", + "elf.R_ALPHA_IMMED_GP_HI32": "debug/elf", + "elf.R_ALPHA_IMMED_LO32": "debug/elf", + "elf.R_ALPHA_IMMED_SCN_HI32": "debug/elf", + "elf.R_ALPHA_JMP_SLOT": "debug/elf", + "elf.R_ALPHA_LITERAL": "debug/elf", + "elf.R_ALPHA_LITUSE": "debug/elf", + "elf.R_ALPHA_NONE": "debug/elf", + "elf.R_ALPHA_OP_PRSHIFT": "debug/elf", + "elf.R_ALPHA_OP_PSUB": "debug/elf", + "elf.R_ALPHA_OP_PUSH": "debug/elf", + "elf.R_ALPHA_OP_STORE": "debug/elf", + "elf.R_ALPHA_REFLONG": "debug/elf", + "elf.R_ALPHA_REFQUAD": "debug/elf", + "elf.R_ALPHA_RELATIVE": "debug/elf", + "elf.R_ALPHA_SREL16": "debug/elf", + "elf.R_ALPHA_SREL32": "debug/elf", + "elf.R_ALPHA_SREL64": "debug/elf", + "elf.R_ARM": "debug/elf", + "elf.R_ARM_ABS12": "debug/elf", + "elf.R_ARM_ABS16": "debug/elf", + "elf.R_ARM_ABS32": "debug/elf", + "elf.R_ARM_ABS8": "debug/elf", + "elf.R_ARM_AMP_VCALL9": "debug/elf", + "elf.R_ARM_COPY": "debug/elf", + "elf.R_ARM_GLOB_DAT": "debug/elf", + "elf.R_ARM_GNU_VTENTRY": "debug/elf", + "elf.R_ARM_GNU_VTINHERIT": "debug/elf", + "elf.R_ARM_GOT32": "debug/elf", + "elf.R_ARM_GOTOFF": "debug/elf", + "elf.R_ARM_GOTPC": "debug/elf", + "elf.R_ARM_JUMP_SLOT": "debug/elf", + "elf.R_ARM_NONE": "debug/elf", + "elf.R_ARM_PC13": "debug/elf", + "elf.R_ARM_PC24": "debug/elf", + "elf.R_ARM_PLT32": "debug/elf", + "elf.R_ARM_RABS32": "debug/elf", + "elf.R_ARM_RBASE": "debug/elf", + "elf.R_ARM_REL32": "debug/elf", + "elf.R_ARM_RELATIVE": "debug/elf", + "elf.R_ARM_RPC24": "debug/elf", + "elf.R_ARM_RREL32": "debug/elf", + "elf.R_ARM_RSBREL32": "debug/elf", + "elf.R_ARM_SBREL32": "debug/elf", + "elf.R_ARM_SWI24": "debug/elf", + "elf.R_ARM_THM_ABS5": "debug/elf", + "elf.R_ARM_THM_PC22": "debug/elf", + "elf.R_ARM_THM_PC8": "debug/elf", + "elf.R_ARM_THM_RPC22": "debug/elf", + "elf.R_ARM_THM_SWI8": "debug/elf", + "elf.R_ARM_THM_XPC22": "debug/elf", + "elf.R_ARM_XPC25": "debug/elf", + "elf.R_INFO": "debug/elf", + "elf.R_INFO32": "debug/elf", + "elf.R_PPC": "debug/elf", + "elf.R_PPC64": "debug/elf", + "elf.R_PPC64_ADDR14": "debug/elf", + "elf.R_PPC64_ADDR14_BRNTAKEN": "debug/elf", + "elf.R_PPC64_ADDR14_BRTAKEN": "debug/elf", + "elf.R_PPC64_ADDR16": "debug/elf", + "elf.R_PPC64_ADDR16_DS": "debug/elf", + "elf.R_PPC64_ADDR16_HA": "debug/elf", + "elf.R_PPC64_ADDR16_HI": "debug/elf", + "elf.R_PPC64_ADDR16_HIGHER": "debug/elf", + "elf.R_PPC64_ADDR16_HIGHERA": "debug/elf", + "elf.R_PPC64_ADDR16_HIGHEST": "debug/elf", + "elf.R_PPC64_ADDR16_HIGHESTA": "debug/elf", + "elf.R_PPC64_ADDR16_LO": "debug/elf", + "elf.R_PPC64_ADDR16_LO_DS": "debug/elf", + "elf.R_PPC64_ADDR24": "debug/elf", + "elf.R_PPC64_ADDR32": "debug/elf", + "elf.R_PPC64_ADDR64": "debug/elf", + "elf.R_PPC64_DTPMOD64": "debug/elf", + "elf.R_PPC64_DTPREL16": "debug/elf", + "elf.R_PPC64_DTPREL16_DS": "debug/elf", + "elf.R_PPC64_DTPREL16_HA": "debug/elf", + "elf.R_PPC64_DTPREL16_HI": "debug/elf", + "elf.R_PPC64_DTPREL16_HIGHER": "debug/elf", + "elf.R_PPC64_DTPREL16_HIGHERA": "debug/elf", + "elf.R_PPC64_DTPREL16_HIGHEST": "debug/elf", + "elf.R_PPC64_DTPREL16_HIGHESTA": "debug/elf", + "elf.R_PPC64_DTPREL16_LO": "debug/elf", + "elf.R_PPC64_DTPREL16_LO_DS": "debug/elf", + "elf.R_PPC64_DTPREL64": "debug/elf", + "elf.R_PPC64_GOT16": "debug/elf", + "elf.R_PPC64_GOT16_DS": "debug/elf", + "elf.R_PPC64_GOT16_HA": "debug/elf", + "elf.R_PPC64_GOT16_HI": "debug/elf", + "elf.R_PPC64_GOT16_LO": "debug/elf", + "elf.R_PPC64_GOT16_LO_DS": "debug/elf", + "elf.R_PPC64_GOT_DTPREL16_DS": "debug/elf", + "elf.R_PPC64_GOT_DTPREL16_HA": "debug/elf", + "elf.R_PPC64_GOT_DTPREL16_HI": "debug/elf", + "elf.R_PPC64_GOT_DTPREL16_LO_DS": "debug/elf", + "elf.R_PPC64_GOT_TLSGD16": "debug/elf", + "elf.R_PPC64_GOT_TLSGD16_HA": "debug/elf", + "elf.R_PPC64_GOT_TLSGD16_HI": "debug/elf", + "elf.R_PPC64_GOT_TLSGD16_LO": "debug/elf", + "elf.R_PPC64_GOT_TLSLD16": "debug/elf", + "elf.R_PPC64_GOT_TLSLD16_HA": "debug/elf", + "elf.R_PPC64_GOT_TLSLD16_HI": "debug/elf", + "elf.R_PPC64_GOT_TLSLD16_LO": "debug/elf", + "elf.R_PPC64_GOT_TPREL16_DS": "debug/elf", + "elf.R_PPC64_GOT_TPREL16_HA": "debug/elf", + "elf.R_PPC64_GOT_TPREL16_HI": "debug/elf", + "elf.R_PPC64_GOT_TPREL16_LO_DS": "debug/elf", + "elf.R_PPC64_JMP_SLOT": "debug/elf", + "elf.R_PPC64_NONE": "debug/elf", + "elf.R_PPC64_REL14": "debug/elf", + "elf.R_PPC64_REL14_BRNTAKEN": "debug/elf", + "elf.R_PPC64_REL14_BRTAKEN": "debug/elf", + "elf.R_PPC64_REL16": "debug/elf", + "elf.R_PPC64_REL16_HA": "debug/elf", + "elf.R_PPC64_REL16_HI": "debug/elf", + "elf.R_PPC64_REL16_LO": "debug/elf", + "elf.R_PPC64_REL24": "debug/elf", + "elf.R_PPC64_REL32": "debug/elf", + "elf.R_PPC64_REL64": "debug/elf", + "elf.R_PPC64_TLS": "debug/elf", + "elf.R_PPC64_TLSGD": "debug/elf", + "elf.R_PPC64_TLSLD": "debug/elf", + "elf.R_PPC64_TOC": "debug/elf", + "elf.R_PPC64_TOC16": "debug/elf", + "elf.R_PPC64_TOC16_DS": "debug/elf", + "elf.R_PPC64_TOC16_HA": "debug/elf", + "elf.R_PPC64_TOC16_HI": "debug/elf", + "elf.R_PPC64_TOC16_LO": "debug/elf", + "elf.R_PPC64_TOC16_LO_DS": "debug/elf", + "elf.R_PPC64_TPREL16": "debug/elf", + "elf.R_PPC64_TPREL16_DS": "debug/elf", + "elf.R_PPC64_TPREL16_HA": "debug/elf", + "elf.R_PPC64_TPREL16_HI": "debug/elf", + "elf.R_PPC64_TPREL16_HIGHER": "debug/elf", + "elf.R_PPC64_TPREL16_HIGHERA": "debug/elf", + "elf.R_PPC64_TPREL16_HIGHEST": "debug/elf", + "elf.R_PPC64_TPREL16_HIGHESTA": "debug/elf", + "elf.R_PPC64_TPREL16_LO": "debug/elf", + "elf.R_PPC64_TPREL16_LO_DS": "debug/elf", + "elf.R_PPC64_TPREL64": "debug/elf", + "elf.R_PPC_ADDR14": "debug/elf", + "elf.R_PPC_ADDR14_BRNTAKEN": "debug/elf", + "elf.R_PPC_ADDR14_BRTAKEN": "debug/elf", + "elf.R_PPC_ADDR16": "debug/elf", + "elf.R_PPC_ADDR16_HA": "debug/elf", + "elf.R_PPC_ADDR16_HI": "debug/elf", + "elf.R_PPC_ADDR16_LO": "debug/elf", + "elf.R_PPC_ADDR24": "debug/elf", + "elf.R_PPC_ADDR32": "debug/elf", + "elf.R_PPC_COPY": "debug/elf", + "elf.R_PPC_DTPMOD32": "debug/elf", + "elf.R_PPC_DTPREL16": "debug/elf", + "elf.R_PPC_DTPREL16_HA": "debug/elf", + "elf.R_PPC_DTPREL16_HI": "debug/elf", + "elf.R_PPC_DTPREL16_LO": "debug/elf", + "elf.R_PPC_DTPREL32": "debug/elf", + "elf.R_PPC_EMB_BIT_FLD": "debug/elf", + "elf.R_PPC_EMB_MRKREF": "debug/elf", + "elf.R_PPC_EMB_NADDR16": "debug/elf", + "elf.R_PPC_EMB_NADDR16_HA": "debug/elf", + "elf.R_PPC_EMB_NADDR16_HI": "debug/elf", + "elf.R_PPC_EMB_NADDR16_LO": "debug/elf", + "elf.R_PPC_EMB_NADDR32": "debug/elf", + "elf.R_PPC_EMB_RELSDA": "debug/elf", + "elf.R_PPC_EMB_RELSEC16": "debug/elf", + "elf.R_PPC_EMB_RELST_HA": "debug/elf", + "elf.R_PPC_EMB_RELST_HI": "debug/elf", + "elf.R_PPC_EMB_RELST_LO": "debug/elf", + "elf.R_PPC_EMB_SDA21": "debug/elf", + "elf.R_PPC_EMB_SDA2I16": "debug/elf", + "elf.R_PPC_EMB_SDA2REL": "debug/elf", + "elf.R_PPC_EMB_SDAI16": "debug/elf", + "elf.R_PPC_GLOB_DAT": "debug/elf", + "elf.R_PPC_GOT16": "debug/elf", + "elf.R_PPC_GOT16_HA": "debug/elf", + "elf.R_PPC_GOT16_HI": "debug/elf", + "elf.R_PPC_GOT16_LO": "debug/elf", + "elf.R_PPC_GOT_TLSGD16": "debug/elf", + "elf.R_PPC_GOT_TLSGD16_HA": "debug/elf", + "elf.R_PPC_GOT_TLSGD16_HI": "debug/elf", + "elf.R_PPC_GOT_TLSGD16_LO": "debug/elf", + "elf.R_PPC_GOT_TLSLD16": "debug/elf", + "elf.R_PPC_GOT_TLSLD16_HA": "debug/elf", + "elf.R_PPC_GOT_TLSLD16_HI": "debug/elf", + "elf.R_PPC_GOT_TLSLD16_LO": "debug/elf", + "elf.R_PPC_GOT_TPREL16": "debug/elf", + "elf.R_PPC_GOT_TPREL16_HA": "debug/elf", + "elf.R_PPC_GOT_TPREL16_HI": "debug/elf", + "elf.R_PPC_GOT_TPREL16_LO": "debug/elf", + "elf.R_PPC_JMP_SLOT": "debug/elf", + "elf.R_PPC_LOCAL24PC": "debug/elf", + "elf.R_PPC_NONE": "debug/elf", + "elf.R_PPC_PLT16_HA": "debug/elf", + "elf.R_PPC_PLT16_HI": "debug/elf", + "elf.R_PPC_PLT16_LO": "debug/elf", + "elf.R_PPC_PLT32": "debug/elf", + "elf.R_PPC_PLTREL24": "debug/elf", + "elf.R_PPC_PLTREL32": "debug/elf", + "elf.R_PPC_REL14": "debug/elf", + "elf.R_PPC_REL14_BRNTAKEN": "debug/elf", + "elf.R_PPC_REL14_BRTAKEN": "debug/elf", + "elf.R_PPC_REL24": "debug/elf", + "elf.R_PPC_REL32": "debug/elf", + "elf.R_PPC_RELATIVE": "debug/elf", + "elf.R_PPC_SDAREL16": "debug/elf", + "elf.R_PPC_SECTOFF": "debug/elf", + "elf.R_PPC_SECTOFF_HA": "debug/elf", + "elf.R_PPC_SECTOFF_HI": "debug/elf", + "elf.R_PPC_SECTOFF_LO": "debug/elf", + "elf.R_PPC_TLS": "debug/elf", + "elf.R_PPC_TPREL16": "debug/elf", + "elf.R_PPC_TPREL16_HA": "debug/elf", + "elf.R_PPC_TPREL16_HI": "debug/elf", + "elf.R_PPC_TPREL16_LO": "debug/elf", + "elf.R_PPC_TPREL32": "debug/elf", + "elf.R_PPC_UADDR16": "debug/elf", + "elf.R_PPC_UADDR32": "debug/elf", + "elf.R_SPARC": "debug/elf", + "elf.R_SPARC_10": "debug/elf", + "elf.R_SPARC_11": "debug/elf", + "elf.R_SPARC_13": "debug/elf", + "elf.R_SPARC_16": "debug/elf", + "elf.R_SPARC_22": "debug/elf", + "elf.R_SPARC_32": "debug/elf", + "elf.R_SPARC_5": "debug/elf", + "elf.R_SPARC_6": "debug/elf", + "elf.R_SPARC_64": "debug/elf", + "elf.R_SPARC_7": "debug/elf", + "elf.R_SPARC_8": "debug/elf", + "elf.R_SPARC_COPY": "debug/elf", + "elf.R_SPARC_DISP16": "debug/elf", + "elf.R_SPARC_DISP32": "debug/elf", + "elf.R_SPARC_DISP64": "debug/elf", + "elf.R_SPARC_DISP8": "debug/elf", + "elf.R_SPARC_GLOB_DAT": "debug/elf", + "elf.R_SPARC_GLOB_JMP": "debug/elf", + "elf.R_SPARC_GOT10": "debug/elf", + "elf.R_SPARC_GOT13": "debug/elf", + "elf.R_SPARC_GOT22": "debug/elf", + "elf.R_SPARC_H44": "debug/elf", + "elf.R_SPARC_HH22": "debug/elf", + "elf.R_SPARC_HI22": "debug/elf", + "elf.R_SPARC_HIPLT22": "debug/elf", + "elf.R_SPARC_HIX22": "debug/elf", + "elf.R_SPARC_HM10": "debug/elf", + "elf.R_SPARC_JMP_SLOT": "debug/elf", + "elf.R_SPARC_L44": "debug/elf", + "elf.R_SPARC_LM22": "debug/elf", + "elf.R_SPARC_LO10": "debug/elf", + "elf.R_SPARC_LOPLT10": "debug/elf", + "elf.R_SPARC_LOX10": "debug/elf", + "elf.R_SPARC_M44": "debug/elf", + "elf.R_SPARC_NONE": "debug/elf", + "elf.R_SPARC_OLO10": "debug/elf", + "elf.R_SPARC_PC10": "debug/elf", + "elf.R_SPARC_PC22": "debug/elf", + "elf.R_SPARC_PCPLT10": "debug/elf", + "elf.R_SPARC_PCPLT22": "debug/elf", + "elf.R_SPARC_PCPLT32": "debug/elf", + "elf.R_SPARC_PC_HH22": "debug/elf", + "elf.R_SPARC_PC_HM10": "debug/elf", + "elf.R_SPARC_PC_LM22": "debug/elf", + "elf.R_SPARC_PLT32": "debug/elf", + "elf.R_SPARC_PLT64": "debug/elf", + "elf.R_SPARC_REGISTER": "debug/elf", + "elf.R_SPARC_RELATIVE": "debug/elf", + "elf.R_SPARC_UA16": "debug/elf", + "elf.R_SPARC_UA32": "debug/elf", + "elf.R_SPARC_UA64": "debug/elf", + "elf.R_SPARC_WDISP16": "debug/elf", + "elf.R_SPARC_WDISP19": "debug/elf", + "elf.R_SPARC_WDISP22": "debug/elf", + "elf.R_SPARC_WDISP30": "debug/elf", + "elf.R_SPARC_WPLT30": "debug/elf", + "elf.R_SYM32": "debug/elf", + "elf.R_SYM64": "debug/elf", + "elf.R_TYPE32": "debug/elf", + "elf.R_TYPE64": "debug/elf", + "elf.R_X86_64": "debug/elf", + "elf.R_X86_64_16": "debug/elf", + "elf.R_X86_64_32": "debug/elf", + "elf.R_X86_64_32S": "debug/elf", + "elf.R_X86_64_64": "debug/elf", + "elf.R_X86_64_8": "debug/elf", + "elf.R_X86_64_COPY": "debug/elf", + "elf.R_X86_64_DTPMOD64": "debug/elf", + "elf.R_X86_64_DTPOFF32": "debug/elf", + "elf.R_X86_64_DTPOFF64": "debug/elf", + "elf.R_X86_64_GLOB_DAT": "debug/elf", + "elf.R_X86_64_GOT32": "debug/elf", + "elf.R_X86_64_GOTPCREL": "debug/elf", + "elf.R_X86_64_GOTTPOFF": "debug/elf", + "elf.R_X86_64_JMP_SLOT": "debug/elf", + "elf.R_X86_64_NONE": "debug/elf", + "elf.R_X86_64_PC16": "debug/elf", + "elf.R_X86_64_PC32": "debug/elf", + "elf.R_X86_64_PC8": "debug/elf", + "elf.R_X86_64_PLT32": "debug/elf", + "elf.R_X86_64_RELATIVE": "debug/elf", + "elf.R_X86_64_TLSGD": "debug/elf", + "elf.R_X86_64_TLSLD": "debug/elf", + "elf.R_X86_64_TPOFF32": "debug/elf", + "elf.R_X86_64_TPOFF64": "debug/elf", + "elf.Rel32": "debug/elf", + "elf.Rel64": "debug/elf", + "elf.Rela32": "debug/elf", + "elf.Rela64": "debug/elf", + "elf.SHF_ALLOC": "debug/elf", + "elf.SHF_EXECINSTR": "debug/elf", + "elf.SHF_GROUP": "debug/elf", + "elf.SHF_INFO_LINK": "debug/elf", + "elf.SHF_LINK_ORDER": "debug/elf", + "elf.SHF_MASKOS": "debug/elf", + "elf.SHF_MASKPROC": "debug/elf", + "elf.SHF_MERGE": "debug/elf", + "elf.SHF_OS_NONCONFORMING": "debug/elf", + "elf.SHF_STRINGS": "debug/elf", + "elf.SHF_TLS": "debug/elf", + "elf.SHF_WRITE": "debug/elf", + "elf.SHN_ABS": "debug/elf", + "elf.SHN_COMMON": "debug/elf", + "elf.SHN_HIOS": "debug/elf", + "elf.SHN_HIPROC": "debug/elf", + "elf.SHN_HIRESERVE": "debug/elf", + "elf.SHN_LOOS": "debug/elf", + "elf.SHN_LOPROC": "debug/elf", + "elf.SHN_LORESERVE": "debug/elf", + "elf.SHN_UNDEF": "debug/elf", + "elf.SHN_XINDEX": "debug/elf", + "elf.SHT_DYNAMIC": "debug/elf", + "elf.SHT_DYNSYM": "debug/elf", + "elf.SHT_FINI_ARRAY": "debug/elf", + "elf.SHT_GNU_ATTRIBUTES": "debug/elf", + "elf.SHT_GNU_HASH": "debug/elf", + "elf.SHT_GNU_LIBLIST": "debug/elf", + "elf.SHT_GNU_VERDEF": "debug/elf", + "elf.SHT_GNU_VERNEED": "debug/elf", + "elf.SHT_GNU_VERSYM": "debug/elf", + "elf.SHT_GROUP": "debug/elf", + "elf.SHT_HASH": "debug/elf", + "elf.SHT_HIOS": "debug/elf", + "elf.SHT_HIPROC": "debug/elf", + "elf.SHT_HIUSER": "debug/elf", + "elf.SHT_INIT_ARRAY": "debug/elf", + "elf.SHT_LOOS": "debug/elf", + "elf.SHT_LOPROC": "debug/elf", + "elf.SHT_LOUSER": "debug/elf", + "elf.SHT_NOBITS": "debug/elf", + "elf.SHT_NOTE": "debug/elf", + "elf.SHT_NULL": "debug/elf", + "elf.SHT_PREINIT_ARRAY": "debug/elf", + "elf.SHT_PROGBITS": "debug/elf", + "elf.SHT_REL": "debug/elf", + "elf.SHT_RELA": "debug/elf", + "elf.SHT_SHLIB": "debug/elf", + "elf.SHT_STRTAB": "debug/elf", + "elf.SHT_SYMTAB": "debug/elf", + "elf.SHT_SYMTAB_SHNDX": "debug/elf", + "elf.STB_GLOBAL": "debug/elf", + "elf.STB_HIOS": "debug/elf", + "elf.STB_HIPROC": "debug/elf", + "elf.STB_LOCAL": "debug/elf", + "elf.STB_LOOS": "debug/elf", + "elf.STB_LOPROC": "debug/elf", + "elf.STB_WEAK": "debug/elf", + "elf.STT_COMMON": "debug/elf", + "elf.STT_FILE": "debug/elf", + "elf.STT_FUNC": "debug/elf", + "elf.STT_HIOS": "debug/elf", + "elf.STT_HIPROC": "debug/elf", + "elf.STT_LOOS": "debug/elf", + "elf.STT_LOPROC": "debug/elf", + "elf.STT_NOTYPE": "debug/elf", + "elf.STT_OBJECT": "debug/elf", + "elf.STT_SECTION": "debug/elf", + "elf.STT_TLS": "debug/elf", + "elf.STV_DEFAULT": "debug/elf", + "elf.STV_HIDDEN": "debug/elf", + "elf.STV_INTERNAL": "debug/elf", + "elf.STV_PROTECTED": "debug/elf", + "elf.ST_BIND": "debug/elf", + "elf.ST_INFO": "debug/elf", + "elf.ST_TYPE": "debug/elf", + "elf.ST_VISIBILITY": "debug/elf", + "elf.Section": "debug/elf", + "elf.Section32": "debug/elf", + "elf.Section64": "debug/elf", + "elf.SectionFlag": "debug/elf", + "elf.SectionHeader": "debug/elf", + "elf.SectionIndex": "debug/elf", + "elf.SectionType": "debug/elf", + "elf.Sym32": "debug/elf", + "elf.Sym32Size": "debug/elf", + "elf.Sym64": "debug/elf", + "elf.Sym64Size": "debug/elf", + "elf.SymBind": "debug/elf", + "elf.SymType": "debug/elf", + "elf.SymVis": "debug/elf", + "elf.Symbol": "debug/elf", + "elf.Type": "debug/elf", + "elf.Version": "debug/elf", + "elliptic.Curve": "crypto/elliptic", + "elliptic.CurveParams": "crypto/elliptic", + "elliptic.GenerateKey": "crypto/elliptic", + "elliptic.Marshal": "crypto/elliptic", + "elliptic.P224": "crypto/elliptic", + "elliptic.P256": "crypto/elliptic", + "elliptic.P384": "crypto/elliptic", + "elliptic.P521": "crypto/elliptic", + "elliptic.Unmarshal": "crypto/elliptic", + "encoding.BinaryMarshaler": "encoding", + "encoding.BinaryUnmarshaler": "encoding", + "encoding.TextMarshaler": "encoding", + "encoding.TextUnmarshaler": "encoding", + "errors.New": "errors", + "exec.Cmd": "os/exec", + "exec.Command": "os/exec", + "exec.ErrNotFound": "os/exec", + "exec.Error": "os/exec", + "exec.ExitError": "os/exec", + "exec.LookPath": "os/exec", + "expvar.Do": "expvar", + "expvar.Float": "expvar", + "expvar.Func": "expvar", + "expvar.Get": "expvar", + "expvar.Int": "expvar", + "expvar.KeyValue": "expvar", + "expvar.Map": "expvar", + "expvar.NewFloat": "expvar", + "expvar.NewInt": "expvar", + "expvar.NewMap": "expvar", + "expvar.NewString": "expvar", + "expvar.Publish": "expvar", + "expvar.String": "expvar", + "expvar.Var": "expvar", + "fcgi.ErrConnClosed": "net/http/fcgi", + "fcgi.ErrRequestAborted": "net/http/fcgi", + "fcgi.Serve": "net/http/fcgi", + "filepath.Abs": "path/filepath", + "filepath.Base": "path/filepath", + "filepath.Clean": "path/filepath", + "filepath.Dir": "path/filepath", + "filepath.ErrBadPattern": "path/filepath", + "filepath.EvalSymlinks": "path/filepath", + "filepath.Ext": "path/filepath", + "filepath.FromSlash": "path/filepath", + "filepath.Glob": "path/filepath", + "filepath.HasPrefix": "path/filepath", + "filepath.IsAbs": "path/filepath", + "filepath.Join": "path/filepath", + "filepath.ListSeparator": "path/filepath", + "filepath.Match": "path/filepath", + "filepath.Rel": "path/filepath", + "filepath.Separator": "path/filepath", + "filepath.SkipDir": "path/filepath", + "filepath.Split": "path/filepath", + "filepath.SplitList": "path/filepath", + "filepath.ToSlash": "path/filepath", + "filepath.VolumeName": "path/filepath", + "filepath.Walk": "path/filepath", + "filepath.WalkFunc": "path/filepath", + "flag.Arg": "flag", + "flag.Args": "flag", + "flag.Bool": "flag", + "flag.BoolVar": "flag", + "flag.CommandLine": "flag", + "flag.ContinueOnError": "flag", + "flag.Duration": "flag", + "flag.DurationVar": "flag", + "flag.ErrHelp": "flag", + "flag.ErrorHandling": "flag", + "flag.ExitOnError": "flag", + "flag.Flag": "flag", + "flag.FlagSet": "flag", + "flag.Float64": "flag", + "flag.Float64Var": "flag", + "flag.Getter": "flag", + "flag.Int": "flag", + "flag.Int64": "flag", + "flag.Int64Var": "flag", + "flag.IntVar": "flag", + "flag.Lookup": "flag", + "flag.NArg": "flag", + "flag.NFlag": "flag", + "flag.NewFlagSet": "flag", + "flag.PanicOnError": "flag", + "flag.Parse": "flag", + "flag.Parsed": "flag", + "flag.PrintDefaults": "flag", + "flag.Set": "flag", + "flag.String": "flag", + "flag.StringVar": "flag", + "flag.Uint": "flag", + "flag.Uint64": "flag", + "flag.Uint64Var": "flag", + "flag.UintVar": "flag", + "flag.UnquoteUsage": "flag", + "flag.Usage": "flag", + "flag.Value": "flag", + "flag.Var": "flag", + "flag.Visit": "flag", + "flag.VisitAll": "flag", + "flate.BestCompression": "compress/flate", + "flate.BestSpeed": "compress/flate", + "flate.CorruptInputError": "compress/flate", + "flate.DefaultCompression": "compress/flate", + "flate.InternalError": "compress/flate", + "flate.NewReader": "compress/flate", + "flate.NewReaderDict": "compress/flate", + "flate.NewWriter": "compress/flate", + "flate.NewWriterDict": "compress/flate", + "flate.NoCompression": "compress/flate", + "flate.ReadError": "compress/flate", + "flate.Reader": "compress/flate", + "flate.Resetter": "compress/flate", + "flate.WriteError": "compress/flate", + "flate.Writer": "compress/flate", + "fmt.Errorf": "fmt", + "fmt.Formatter": "fmt", + "fmt.Fprint": "fmt", + "fmt.Fprintf": "fmt", + "fmt.Fprintln": "fmt", + "fmt.Fscan": "fmt", + "fmt.Fscanf": "fmt", + "fmt.Fscanln": "fmt", + "fmt.GoStringer": "fmt", + "fmt.Print": "fmt", + "fmt.Printf": "fmt", + "fmt.Println": "fmt", + "fmt.Scan": "fmt", + "fmt.ScanState": "fmt", + "fmt.Scanf": "fmt", + "fmt.Scanln": "fmt", + "fmt.Scanner": "fmt", + "fmt.Sprint": "fmt", + "fmt.Sprintf": "fmt", + "fmt.Sprintln": "fmt", + "fmt.Sscan": "fmt", + "fmt.Sscanf": "fmt", + "fmt.Sscanln": "fmt", + "fmt.State": "fmt", + "fmt.Stringer": "fmt", + "fnv.New32": "hash/fnv", + "fnv.New32a": "hash/fnv", + "fnv.New64": "hash/fnv", + "fnv.New64a": "hash/fnv", + "format.Node": "go/format", + "format.Source": "go/format", + "gif.Decode": "image/gif", + "gif.DecodeAll": "image/gif", + "gif.DecodeConfig": "image/gif", + "gif.DisposalBackground": "image/gif", + "gif.DisposalNone": "image/gif", + "gif.DisposalPrevious": "image/gif", + "gif.Encode": "image/gif", + "gif.EncodeAll": "image/gif", + "gif.GIF": "image/gif", + "gif.Options": "image/gif", + "gob.CommonType": "encoding/gob", + "gob.Decoder": "encoding/gob", + "gob.Encoder": "encoding/gob", + "gob.GobDecoder": "encoding/gob", + "gob.GobEncoder": "encoding/gob", + "gob.NewDecoder": "encoding/gob", + "gob.NewEncoder": "encoding/gob", + "gob.Register": "encoding/gob", + "gob.RegisterName": "encoding/gob", + "gosym.DecodingError": "debug/gosym", + "gosym.Func": "debug/gosym", + "gosym.LineTable": "debug/gosym", + "gosym.NewLineTable": "debug/gosym", + "gosym.NewTable": "debug/gosym", + "gosym.Obj": "debug/gosym", + "gosym.Sym": "debug/gosym", + "gosym.Table": "debug/gosym", + "gosym.UnknownFileError": "debug/gosym", + "gosym.UnknownLineError": "debug/gosym", + "gzip.BestCompression": "compress/gzip", + "gzip.BestSpeed": "compress/gzip", + "gzip.DefaultCompression": "compress/gzip", + "gzip.ErrChecksum": "compress/gzip", + "gzip.ErrHeader": "compress/gzip", + "gzip.Header": "compress/gzip", + "gzip.NewReader": "compress/gzip", + "gzip.NewWriter": "compress/gzip", + "gzip.NewWriterLevel": "compress/gzip", + "gzip.NoCompression": "compress/gzip", + "gzip.Reader": "compress/gzip", + "gzip.Writer": "compress/gzip", + "hash.Hash": "hash", + "hash.Hash32": "hash", + "hash.Hash64": "hash", + "heap.Fix": "container/heap", + "heap.Init": "container/heap", + "heap.Interface": "container/heap", + "heap.Pop": "container/heap", + "heap.Push": "container/heap", + "heap.Remove": "container/heap", + "hex.Decode": "encoding/hex", + "hex.DecodeString": "encoding/hex", + "hex.DecodedLen": "encoding/hex", + "hex.Dump": "encoding/hex", + "hex.Dumper": "encoding/hex", + "hex.Encode": "encoding/hex", + "hex.EncodeToString": "encoding/hex", + "hex.EncodedLen": "encoding/hex", + "hex.ErrLength": "encoding/hex", + "hex.InvalidByteError": "encoding/hex", + "hmac.Equal": "crypto/hmac", + "hmac.New": "crypto/hmac", + "html.EscapeString": "html", + "html.UnescapeString": "html", + "http.CanonicalHeaderKey": "net/http", + "http.Client": "net/http", + "http.CloseNotifier": "net/http", + "http.ConnState": "net/http", + "http.Cookie": "net/http", + "http.CookieJar": "net/http", + "http.DefaultClient": "net/http", + "http.DefaultMaxHeaderBytes": "net/http", + "http.DefaultMaxIdleConnsPerHost": "net/http", + "http.DefaultServeMux": "net/http", + "http.DefaultTransport": "net/http", + "http.DetectContentType": "net/http", + "http.Dir": "net/http", + "http.ErrBodyNotAllowed": "net/http", + "http.ErrBodyReadAfterClose": "net/http", + "http.ErrContentLength": "net/http", + "http.ErrHandlerTimeout": "net/http", + "http.ErrHeaderTooLong": "net/http", + "http.ErrHijacked": "net/http", + "http.ErrLineTooLong": "net/http", + "http.ErrMissingBoundary": "net/http", + "http.ErrMissingContentLength": "net/http", + "http.ErrMissingFile": "net/http", + "http.ErrNoCookie": "net/http", + "http.ErrNoLocation": "net/http", + "http.ErrNotMultipart": "net/http", + "http.ErrNotSupported": "net/http", + "http.ErrShortBody": "net/http", + "http.ErrUnexpectedTrailer": "net/http", + "http.ErrWriteAfterFlush": "net/http", + "http.Error": "net/http", + "http.File": "net/http", + "http.FileServer": "net/http", + "http.FileSystem": "net/http", + "http.Flusher": "net/http", + "http.Get": "net/http", + "http.Handle": "net/http", + "http.HandleFunc": "net/http", + "http.Handler": "net/http", + "http.HandlerFunc": "net/http", + "http.Head": "net/http", + "http.Header": "net/http", + "http.Hijacker": "net/http", + "http.ListenAndServe": "net/http", + "http.ListenAndServeTLS": "net/http", + "http.MaxBytesReader": "net/http", + "http.NewFileTransport": "net/http", + "http.NewRequest": "net/http", + "http.NewServeMux": "net/http", + "http.NotFound": "net/http", + "http.NotFoundHandler": "net/http", + "http.ParseHTTPVersion": "net/http", + "http.ParseTime": "net/http", + "http.Post": "net/http", + "http.PostForm": "net/http", + "http.ProtocolError": "net/http", + "http.ProxyFromEnvironment": "net/http", + "http.ProxyURL": "net/http", + "http.ReadRequest": "net/http", + "http.ReadResponse": "net/http", + "http.Redirect": "net/http", + "http.RedirectHandler": "net/http", + "http.Request": "net/http", + "http.Response": "net/http", + "http.ResponseWriter": "net/http", + "http.RoundTripper": "net/http", + "http.Serve": "net/http", + "http.ServeContent": "net/http", + "http.ServeFile": "net/http", + "http.ServeMux": "net/http", + "http.Server": "net/http", + "http.SetCookie": "net/http", + "http.StateActive": "net/http", + "http.StateClosed": "net/http", + "http.StateHijacked": "net/http", + "http.StateIdle": "net/http", + "http.StateNew": "net/http", + "http.StatusAccepted": "net/http", + "http.StatusBadGateway": "net/http", + "http.StatusBadRequest": "net/http", + "http.StatusConflict": "net/http", + "http.StatusContinue": "net/http", + "http.StatusCreated": "net/http", + "http.StatusExpectationFailed": "net/http", + "http.StatusForbidden": "net/http", + "http.StatusFound": "net/http", + "http.StatusGatewayTimeout": "net/http", + "http.StatusGone": "net/http", + "http.StatusHTTPVersionNotSupported": "net/http", + "http.StatusInternalServerError": "net/http", + "http.StatusLengthRequired": "net/http", + "http.StatusMethodNotAllowed": "net/http", + "http.StatusMovedPermanently": "net/http", + "http.StatusMultipleChoices": "net/http", + "http.StatusNoContent": "net/http", + "http.StatusNonAuthoritativeInfo": "net/http", + "http.StatusNotAcceptable": "net/http", + "http.StatusNotFound": "net/http", + "http.StatusNotImplemented": "net/http", + "http.StatusNotModified": "net/http", + "http.StatusOK": "net/http", + "http.StatusPartialContent": "net/http", + "http.StatusPaymentRequired": "net/http", + "http.StatusPreconditionFailed": "net/http", + "http.StatusProxyAuthRequired": "net/http", + "http.StatusRequestEntityTooLarge": "net/http", + "http.StatusRequestTimeout": "net/http", + "http.StatusRequestURITooLong": "net/http", + "http.StatusRequestedRangeNotSatisfiable": "net/http", + "http.StatusResetContent": "net/http", + "http.StatusSeeOther": "net/http", + "http.StatusServiceUnavailable": "net/http", + "http.StatusSwitchingProtocols": "net/http", + "http.StatusTeapot": "net/http", + "http.StatusTemporaryRedirect": "net/http", + "http.StatusText": "net/http", + "http.StatusUnauthorized": "net/http", + "http.StatusUnsupportedMediaType": "net/http", + "http.StatusUseProxy": "net/http", + "http.StripPrefix": "net/http", + "http.TimeFormat": "net/http", + "http.TimeoutHandler": "net/http", + "http.Transport": "net/http", + "httptest.DefaultRemoteAddr": "net/http/httptest", + "httptest.NewRecorder": "net/http/httptest", + "httptest.NewServer": "net/http/httptest", + "httptest.NewTLSServer": "net/http/httptest", + "httptest.NewUnstartedServer": "net/http/httptest", + "httptest.ResponseRecorder": "net/http/httptest", + "httptest.Server": "net/http/httptest", + "httputil.ClientConn": "net/http/httputil", + "httputil.DumpRequest": "net/http/httputil", + "httputil.DumpRequestOut": "net/http/httputil", + "httputil.DumpResponse": "net/http/httputil", + "httputil.ErrClosed": "net/http/httputil", + "httputil.ErrLineTooLong": "net/http/httputil", + "httputil.ErrPersistEOF": "net/http/httputil", + "httputil.ErrPipeline": "net/http/httputil", + "httputil.NewChunkedReader": "net/http/httputil", + "httputil.NewChunkedWriter": "net/http/httputil", + "httputil.NewClientConn": "net/http/httputil", + "httputil.NewProxyClientConn": "net/http/httputil", + "httputil.NewServerConn": "net/http/httputil", + "httputil.NewSingleHostReverseProxy": "net/http/httputil", + "httputil.ReverseProxy": "net/http/httputil", + "httputil.ServerConn": "net/http/httputil", + "image.Alpha": "image", + "image.Alpha16": "image", + "image.Black": "image", + "image.CMYK": "image", + "image.Config": "image", + "image.Decode": "image", + "image.DecodeConfig": "image", + "image.ErrFormat": "image", + "image.Gray": "image", + "image.Gray16": "image", + "image.Image": "image", + "image.NRGBA": "image", + "image.NRGBA64": "image", + "image.NewAlpha": "image", + "image.NewAlpha16": "image", + "image.NewCMYK": "image", + "image.NewGray": "image", + "image.NewGray16": "image", + "image.NewNRGBA": "image", + "image.NewNRGBA64": "image", + "image.NewPaletted": "image", + "image.NewRGBA": "image", + "image.NewRGBA64": "image", + "image.NewUniform": "image", + "image.NewYCbCr": "image", + "image.Opaque": "image", + "image.Paletted": "image", + "image.PalettedImage": "image", + "image.Point": "image", + "image.Pt": "image", + "image.RGBA": "image", + "image.RGBA64": "image", + "image.Rect": "image", + "image.Rectangle": "image", + "image.RegisterFormat": "image", + "image.Transparent": "image", + "image.Uniform": "image", + "image.White": "image", + "image.YCbCr": "image", + "image.YCbCrSubsampleRatio": "image", + "image.YCbCrSubsampleRatio410": "image", + "image.YCbCrSubsampleRatio411": "image", + "image.YCbCrSubsampleRatio420": "image", + "image.YCbCrSubsampleRatio422": "image", + "image.YCbCrSubsampleRatio440": "image", + "image.YCbCrSubsampleRatio444": "image", + "image.ZP": "image", + "image.ZR": "image", + "importer.Default": "go/importer", + "importer.For": "go/importer", + "importer.Lookup": "go/importer", + "io.ByteReader": "io", + "io.ByteScanner": "io", + "io.ByteWriter": "io", + "io.Closer": "io", + "io.Copy": "io", + "io.CopyBuffer": "io", + "io.CopyN": "io", + "io.EOF": "io", + "io.ErrClosedPipe": "io", + "io.ErrNoProgress": "io", + "io.ErrShortBuffer": "io", + "io.ErrShortWrite": "io", + "io.ErrUnexpectedEOF": "io", + "io.LimitReader": "io", + "io.LimitedReader": "io", + "io.MultiReader": "io", + "io.MultiWriter": "io", + "io.NewSectionReader": "io", + "io.Pipe": "io", + "io.PipeReader": "io", + "io.PipeWriter": "io", + "io.ReadAtLeast": "io", + "io.ReadCloser": "io", + "io.ReadFull": "io", + "io.ReadSeeker": "io", + "io.ReadWriteCloser": "io", + "io.ReadWriteSeeker": "io", + "io.ReadWriter": "io", + "io.Reader": "io", + "io.ReaderAt": "io", + "io.ReaderFrom": "io", + "io.RuneReader": "io", + "io.RuneScanner": "io", + "io.SectionReader": "io", + "io.Seeker": "io", + "io.TeeReader": "io", + "io.WriteCloser": "io", + "io.WriteSeeker": "io", + "io.WriteString": "io", + "io.Writer": "io", + "io.WriterAt": "io", + "io.WriterTo": "io", + "iotest.DataErrReader": "testing/iotest", + "iotest.ErrTimeout": "testing/iotest", + "iotest.HalfReader": "testing/iotest", + "iotest.NewReadLogger": "testing/iotest", + "iotest.NewWriteLogger": "testing/iotest", + "iotest.OneByteReader": "testing/iotest", + "iotest.TimeoutReader": "testing/iotest", + "iotest.TruncateWriter": "testing/iotest", + "ioutil.Discard": "io/ioutil", + "ioutil.NopCloser": "io/ioutil", + "ioutil.ReadAll": "io/ioutil", + "ioutil.ReadDir": "io/ioutil", + "ioutil.ReadFile": "io/ioutil", + "ioutil.TempDir": "io/ioutil", + "ioutil.TempFile": "io/ioutil", + "ioutil.WriteFile": "io/ioutil", + "jpeg.Decode": "image/jpeg", + "jpeg.DecodeConfig": "image/jpeg", + "jpeg.DefaultQuality": "image/jpeg", + "jpeg.Encode": "image/jpeg", + "jpeg.FormatError": "image/jpeg", + "jpeg.Options": "image/jpeg", + "jpeg.Reader": "image/jpeg", + "jpeg.UnsupportedError": "image/jpeg", + "json.Compact": "encoding/json", + "json.Decoder": "encoding/json", + "json.Delim": "encoding/json", + "json.Encoder": "encoding/json", + "json.HTMLEscape": "encoding/json", + "json.Indent": "encoding/json", + "json.InvalidUTF8Error": "encoding/json", + "json.InvalidUnmarshalError": "encoding/json", + "json.Marshal": "encoding/json", + "json.MarshalIndent": "encoding/json", + "json.Marshaler": "encoding/json", + "json.MarshalerError": "encoding/json", + "json.NewDecoder": "encoding/json", + "json.NewEncoder": "encoding/json", + "json.Number": "encoding/json", + "json.RawMessage": "encoding/json", + "json.SyntaxError": "encoding/json", + "json.Token": "encoding/json", + "json.Unmarshal": "encoding/json", + "json.UnmarshalFieldError": "encoding/json", + "json.UnmarshalTypeError": "encoding/json", + "json.Unmarshaler": "encoding/json", + "json.UnsupportedTypeError": "encoding/json", + "json.UnsupportedValueError": "encoding/json", + "jsonrpc.Dial": "net/rpc/jsonrpc", + "jsonrpc.NewClient": "net/rpc/jsonrpc", + "jsonrpc.NewClientCodec": "net/rpc/jsonrpc", + "jsonrpc.NewServerCodec": "net/rpc/jsonrpc", + "jsonrpc.ServeConn": "net/rpc/jsonrpc", + "list.Element": "container/list", + "list.List": "container/list", + "list.New": "container/list", + "log.Fatal": "log", + "log.Fatalf": "log", + "log.Fatalln": "log", + "log.Flags": "log", + "log.LUTC": "log", + "log.Ldate": "log", + "log.Llongfile": "log", + "log.Lmicroseconds": "log", + "log.Logger": "log", + "log.Lshortfile": "log", + "log.LstdFlags": "log", + "log.Ltime": "log", + "log.New": "log", + "log.Output": "log", + "log.Panic": "log", + "log.Panicf": "log", + "log.Panicln": "log", + "log.Prefix": "log", + "log.Print": "log", + "log.Printf": "log", + "log.Println": "log", + "log.SetFlags": "log", + "log.SetOutput": "log", + "log.SetPrefix": "log", + "lzw.LSB": "compress/lzw", + "lzw.MSB": "compress/lzw", + "lzw.NewReader": "compress/lzw", + "lzw.NewWriter": "compress/lzw", + "lzw.Order": "compress/lzw", + "macho.Cpu": "debug/macho", + "macho.Cpu386": "debug/macho", + "macho.CpuAmd64": "debug/macho", + "macho.CpuArm": "debug/macho", + "macho.CpuPpc": "debug/macho", + "macho.CpuPpc64": "debug/macho", + "macho.Dylib": "debug/macho", + "macho.DylibCmd": "debug/macho", + "macho.Dysymtab": "debug/macho", + "macho.DysymtabCmd": "debug/macho", + "macho.ErrNotFat": "debug/macho", + "macho.FatArch": "debug/macho", + "macho.FatArchHeader": "debug/macho", + "macho.FatFile": "debug/macho", + "macho.File": "debug/macho", + "macho.FileHeader": "debug/macho", + "macho.FormatError": "debug/macho", + "macho.Load": "debug/macho", + "macho.LoadBytes": "debug/macho", + "macho.LoadCmd": "debug/macho", + "macho.LoadCmdDylib": "debug/macho", + "macho.LoadCmdDylinker": "debug/macho", + "macho.LoadCmdDysymtab": "debug/macho", + "macho.LoadCmdSegment": "debug/macho", + "macho.LoadCmdSegment64": "debug/macho", + "macho.LoadCmdSymtab": "debug/macho", + "macho.LoadCmdThread": "debug/macho", + "macho.LoadCmdUnixThread": "debug/macho", + "macho.Magic32": "debug/macho", + "macho.Magic64": "debug/macho", + "macho.MagicFat": "debug/macho", + "macho.NewFatFile": "debug/macho", + "macho.NewFile": "debug/macho", + "macho.Nlist32": "debug/macho", + "macho.Nlist64": "debug/macho", + "macho.Open": "debug/macho", + "macho.OpenFat": "debug/macho", + "macho.Regs386": "debug/macho", + "macho.RegsAMD64": "debug/macho", + "macho.Section": "debug/macho", + "macho.Section32": "debug/macho", + "macho.Section64": "debug/macho", + "macho.SectionHeader": "debug/macho", + "macho.Segment": "debug/macho", + "macho.Segment32": "debug/macho", + "macho.Segment64": "debug/macho", + "macho.SegmentHeader": "debug/macho", + "macho.Symbol": "debug/macho", + "macho.Symtab": "debug/macho", + "macho.SymtabCmd": "debug/macho", + "macho.Thread": "debug/macho", + "macho.Type": "debug/macho", + "macho.TypeBundle": "debug/macho", + "macho.TypeDylib": "debug/macho", + "macho.TypeExec": "debug/macho", + "macho.TypeObj": "debug/macho", + "mail.Address": "net/mail", + "mail.AddressParser": "net/mail", + "mail.ErrHeaderNotPresent": "net/mail", + "mail.Header": "net/mail", + "mail.Message": "net/mail", + "mail.ParseAddress": "net/mail", + "mail.ParseAddressList": "net/mail", + "mail.ReadMessage": "net/mail", + "math.Abs": "math", + "math.Acos": "math", + "math.Acosh": "math", + "math.Asin": "math", + "math.Asinh": "math", + "math.Atan": "math", + "math.Atan2": "math", + "math.Atanh": "math", + "math.Cbrt": "math", + "math.Ceil": "math", + "math.Copysign": "math", + "math.Cos": "math", + "math.Cosh": "math", + "math.Dim": "math", + "math.E": "math", + "math.Erf": "math", + "math.Erfc": "math", + "math.Exp": "math", + "math.Exp2": "math", + "math.Expm1": "math", + "math.Float32bits": "math", + "math.Float32frombits": "math", + "math.Float64bits": "math", + "math.Float64frombits": "math", + "math.Floor": "math", + "math.Frexp": "math", + "math.Gamma": "math", + "math.Hypot": "math", + "math.Ilogb": "math", + "math.Inf": "math", + "math.IsInf": "math", + "math.IsNaN": "math", + "math.J0": "math", + "math.J1": "math", + "math.Jn": "math", + "math.Ldexp": "math", + "math.Lgamma": "math", + "math.Ln10": "math", + "math.Ln2": "math", + "math.Log": "math", + "math.Log10": "math", + "math.Log10E": "math", + "math.Log1p": "math", + "math.Log2": "math", + "math.Log2E": "math", + "math.Logb": "math", + "math.Max": "math", + "math.MaxFloat32": "math", + "math.MaxFloat64": "math", + "math.MaxInt16": "math", + "math.MaxInt32": "math", + "math.MaxInt64": "math", + "math.MaxInt8": "math", + "math.MaxUint16": "math", + "math.MaxUint32": "math", + "math.MaxUint64": "math", + "math.MaxUint8": "math", + "math.Min": "math", + "math.MinInt16": "math", + "math.MinInt32": "math", + "math.MinInt64": "math", + "math.MinInt8": "math", + "math.Mod": "math", + "math.Modf": "math", + "math.NaN": "math", + "math.Nextafter": "math", + "math.Nextafter32": "math", + "math.Phi": "math", + "math.Pi": "math", + "math.Pow": "math", + "math.Pow10": "math", + "math.Remainder": "math", + "math.Signbit": "math", + "math.Sin": "math", + "math.Sincos": "math", + "math.Sinh": "math", + "math.SmallestNonzeroFloat32": "math", + "math.SmallestNonzeroFloat64": "math", + "math.Sqrt": "math", + "math.Sqrt2": "math", + "math.SqrtE": "math", + "math.SqrtPhi": "math", + "math.SqrtPi": "math", + "math.Tan": "math", + "math.Tanh": "math", + "math.Trunc": "math", + "math.Y0": "math", + "math.Y1": "math", + "math.Yn": "math", + "md5.BlockSize": "crypto/md5", + "md5.New": "crypto/md5", + "md5.Size": "crypto/md5", + "md5.Sum": "crypto/md5", + "mime.AddExtensionType": "mime", + "mime.BEncoding": "mime", + "mime.ExtensionsByType": "mime", + "mime.FormatMediaType": "mime", + "mime.ParseMediaType": "mime", + "mime.QEncoding": "mime", + "mime.TypeByExtension": "mime", + "mime.WordDecoder": "mime", + "mime.WordEncoder": "mime", + "multipart.File": "mime/multipart", + "multipart.FileHeader": "mime/multipart", + "multipart.Form": "mime/multipart", + "multipart.NewReader": "mime/multipart", + "multipart.NewWriter": "mime/multipart", + "multipart.Part": "mime/multipart", + "multipart.Reader": "mime/multipart", + "multipart.Writer": "mime/multipart", + "net.Addr": "net", + "net.AddrError": "net", + "net.CIDRMask": "net", + "net.Conn": "net", + "net.DNSConfigError": "net", + "net.DNSError": "net", + "net.Dial": "net", + "net.DialIP": "net", + "net.DialTCP": "net", + "net.DialTimeout": "net", + "net.DialUDP": "net", + "net.DialUnix": "net", + "net.Dialer": "net", + "net.ErrWriteToConnected": "net", + "net.Error": "net", + "net.FileConn": "net", + "net.FileListener": "net", + "net.FilePacketConn": "net", + "net.FlagBroadcast": "net", + "net.FlagLoopback": "net", + "net.FlagMulticast": "net", + "net.FlagPointToPoint": "net", + "net.FlagUp": "net", + "net.Flags": "net", + "net.HardwareAddr": "net", + "net.IP": "net", + "net.IPAddr": "net", + "net.IPConn": "net", + "net.IPMask": "net", + "net.IPNet": "net", + "net.IPv4": "net", + "net.IPv4Mask": "net", + "net.IPv4allrouter": "net", + "net.IPv4allsys": "net", + "net.IPv4bcast": "net", + "net.IPv4len": "net", + "net.IPv4zero": "net", + "net.IPv6interfacelocalallnodes": "net", + "net.IPv6len": "net", + "net.IPv6linklocalallnodes": "net", + "net.IPv6linklocalallrouters": "net", + "net.IPv6loopback": "net", + "net.IPv6unspecified": "net", + "net.IPv6zero": "net", + "net.Interface": "net", + "net.InterfaceAddrs": "net", + "net.InterfaceByIndex": "net", + "net.InterfaceByName": "net", + "net.Interfaces": "net", + "net.InvalidAddrError": "net", + "net.JoinHostPort": "net", + "net.Listen": "net", + "net.ListenIP": "net", + "net.ListenMulticastUDP": "net", + "net.ListenPacket": "net", + "net.ListenTCP": "net", + "net.ListenUDP": "net", + "net.ListenUnix": "net", + "net.ListenUnixgram": "net", + "net.Listener": "net", + "net.LookupAddr": "net", + "net.LookupCNAME": "net", + "net.LookupHost": "net", + "net.LookupIP": "net", + "net.LookupMX": "net", + "net.LookupNS": "net", + "net.LookupPort": "net", + "net.LookupSRV": "net", + "net.LookupTXT": "net", + "net.MX": "net", + "net.NS": "net", + "net.OpError": "net", + "net.PacketConn": "net", + "net.ParseCIDR": "net", + "net.ParseError": "net", + "net.ParseIP": "net", + "net.ParseMAC": "net", + "net.Pipe": "net", + "net.ResolveIPAddr": "net", + "net.ResolveTCPAddr": "net", + "net.ResolveUDPAddr": "net", + "net.ResolveUnixAddr": "net", + "net.SRV": "net", + "net.SplitHostPort": "net", + "net.TCPAddr": "net", + "net.TCPConn": "net", + "net.TCPListener": "net", + "net.UDPAddr": "net", + "net.UDPConn": "net", + "net.UnixAddr": "net", + "net.UnixConn": "net", + "net.UnixListener": "net", + "net.UnknownNetworkError": "net", + "os.Args": "os", + "os.Chdir": "os", + "os.Chmod": "os", + "os.Chown": "os", + "os.Chtimes": "os", + "os.Clearenv": "os", + "os.Create": "os", + "os.DevNull": "os", + "os.Environ": "os", + "os.ErrExist": "os", + "os.ErrInvalid": "os", + "os.ErrNotExist": "os", + "os.ErrPermission": "os", + "os.Exit": "os", + "os.Expand": "os", + "os.ExpandEnv": "os", + "os.File": "os", + "os.FileInfo": "os", + "os.FileMode": "os", + "os.FindProcess": "os", + "os.Getegid": "os", + "os.Getenv": "os", + "os.Geteuid": "os", + "os.Getgid": "os", + "os.Getgroups": "os", + "os.Getpagesize": "os", + "os.Getpid": "os", + "os.Getppid": "os", + "os.Getuid": "os", + "os.Getwd": "os", + "os.Hostname": "os", + "os.Interrupt": "os", + "os.IsExist": "os", + "os.IsNotExist": "os", + "os.IsPathSeparator": "os", + "os.IsPermission": "os", + "os.Kill": "os", + "os.Lchown": "os", + "os.Link": "os", + "os.LinkError": "os", + "os.LookupEnv": "os", + "os.Lstat": "os", + "os.Mkdir": "os", + "os.MkdirAll": "os", + "os.ModeAppend": "os", + "os.ModeCharDevice": "os", + "os.ModeDevice": "os", + "os.ModeDir": "os", + "os.ModeExclusive": "os", + "os.ModeNamedPipe": "os", + "os.ModePerm": "os", + "os.ModeSetgid": "os", + "os.ModeSetuid": "os", + "os.ModeSocket": "os", + "os.ModeSticky": "os", + "os.ModeSymlink": "os", + "os.ModeTemporary": "os", + "os.ModeType": "os", + "os.NewFile": "os", + "os.NewSyscallError": "os", + "os.O_APPEND": "os", + "os.O_CREATE": "os", + "os.O_EXCL": "os", + "os.O_RDONLY": "os", + "os.O_RDWR": "os", + "os.O_SYNC": "os", + "os.O_TRUNC": "os", + "os.O_WRONLY": "os", + "os.Open": "os", + "os.OpenFile": "os", + "os.PathError": "os", + "os.PathListSeparator": "os", + "os.PathSeparator": "os", + "os.Pipe": "os", + "os.ProcAttr": "os", + "os.Process": "os", + "os.ProcessState": "os", + "os.Readlink": "os", + "os.Remove": "os", + "os.RemoveAll": "os", + "os.Rename": "os", + "os.SEEK_CUR": "os", + "os.SEEK_END": "os", + "os.SEEK_SET": "os", + "os.SameFile": "os", + "os.Setenv": "os", + "os.Signal": "os", + "os.StartProcess": "os", + "os.Stat": "os", + "os.Stderr": "os", + "os.Stdin": "os", + "os.Stdout": "os", + "os.Symlink": "os", + "os.SyscallError": "os", + "os.TempDir": "os", + "os.Truncate": "os", + "os.Unsetenv": "os", + "palette.Plan9": "image/color/palette", + "palette.WebSafe": "image/color/palette", + "parse.ActionNode": "text/template/parse", + "parse.BoolNode": "text/template/parse", + "parse.BranchNode": "text/template/parse", + "parse.ChainNode": "text/template/parse", + "parse.CommandNode": "text/template/parse", + "parse.DotNode": "text/template/parse", + "parse.FieldNode": "text/template/parse", + "parse.IdentifierNode": "text/template/parse", + "parse.IfNode": "text/template/parse", + "parse.IsEmptyTree": "text/template/parse", + "parse.ListNode": "text/template/parse", + "parse.New": "text/template/parse", + "parse.NewIdentifier": "text/template/parse", + "parse.NilNode": "text/template/parse", + "parse.Node": "text/template/parse", + "parse.NodeAction": "text/template/parse", + "parse.NodeBool": "text/template/parse", + "parse.NodeChain": "text/template/parse", + "parse.NodeCommand": "text/template/parse", + "parse.NodeDot": "text/template/parse", + "parse.NodeField": "text/template/parse", + "parse.NodeIdentifier": "text/template/parse", + "parse.NodeIf": "text/template/parse", + "parse.NodeList": "text/template/parse", + "parse.NodeNil": "text/template/parse", + "parse.NodeNumber": "text/template/parse", + "parse.NodePipe": "text/template/parse", + "parse.NodeRange": "text/template/parse", + "parse.NodeString": "text/template/parse", + "parse.NodeTemplate": "text/template/parse", + "parse.NodeText": "text/template/parse", + "parse.NodeType": "text/template/parse", + "parse.NodeVariable": "text/template/parse", + "parse.NodeWith": "text/template/parse", + "parse.NumberNode": "text/template/parse", + "parse.Parse": "text/template/parse", + "parse.PipeNode": "text/template/parse", + "parse.Pos": "text/template/parse", + "parse.RangeNode": "text/template/parse", + "parse.StringNode": "text/template/parse", + "parse.TemplateNode": "text/template/parse", + "parse.TextNode": "text/template/parse", + "parse.Tree": "text/template/parse", + "parse.VariableNode": "text/template/parse", + "parse.WithNode": "text/template/parse", + "parser.AllErrors": "go/parser", + "parser.DeclarationErrors": "go/parser", + "parser.ImportsOnly": "go/parser", + "parser.Mode": "go/parser", + "parser.PackageClauseOnly": "go/parser", + "parser.ParseComments": "go/parser", + "parser.ParseDir": "go/parser", + "parser.ParseExpr": "go/parser", + "parser.ParseExprFrom": "go/parser", + "parser.ParseFile": "go/parser", + "parser.SpuriousErrors": "go/parser", + "parser.Trace": "go/parser", + "path.Base": "path", + "path.Clean": "path", + "path.Dir": "path", + "path.ErrBadPattern": "path", + "path.Ext": "path", + "path.IsAbs": "path", + "path.Join": "path", + "path.Match": "path", + "path.Split": "path", + "pe.COFFSymbol": "debug/pe", + "pe.COFFSymbolSize": "debug/pe", + "pe.DataDirectory": "debug/pe", + "pe.File": "debug/pe", + "pe.FileHeader": "debug/pe", + "pe.FormatError": "debug/pe", + "pe.IMAGE_FILE_MACHINE_AM33": "debug/pe", + "pe.IMAGE_FILE_MACHINE_AMD64": "debug/pe", + "pe.IMAGE_FILE_MACHINE_ARM": "debug/pe", + "pe.IMAGE_FILE_MACHINE_EBC": "debug/pe", + "pe.IMAGE_FILE_MACHINE_I386": "debug/pe", + "pe.IMAGE_FILE_MACHINE_IA64": "debug/pe", + "pe.IMAGE_FILE_MACHINE_M32R": "debug/pe", + "pe.IMAGE_FILE_MACHINE_MIPS16": "debug/pe", + "pe.IMAGE_FILE_MACHINE_MIPSFPU": "debug/pe", + "pe.IMAGE_FILE_MACHINE_MIPSFPU16": "debug/pe", + "pe.IMAGE_FILE_MACHINE_POWERPC": "debug/pe", + "pe.IMAGE_FILE_MACHINE_POWERPCFP": "debug/pe", + "pe.IMAGE_FILE_MACHINE_R4000": "debug/pe", + "pe.IMAGE_FILE_MACHINE_SH3": "debug/pe", + "pe.IMAGE_FILE_MACHINE_SH3DSP": "debug/pe", + "pe.IMAGE_FILE_MACHINE_SH4": "debug/pe", + "pe.IMAGE_FILE_MACHINE_SH5": "debug/pe", + "pe.IMAGE_FILE_MACHINE_THUMB": "debug/pe", + "pe.IMAGE_FILE_MACHINE_UNKNOWN": "debug/pe", + "pe.IMAGE_FILE_MACHINE_WCEMIPSV2": "debug/pe", + "pe.ImportDirectory": "debug/pe", + "pe.NewFile": "debug/pe", + "pe.Open": "debug/pe", + "pe.OptionalHeader32": "debug/pe", + "pe.OptionalHeader64": "debug/pe", + "pe.Section": "debug/pe", + "pe.SectionHeader": "debug/pe", + "pe.SectionHeader32": "debug/pe", + "pe.Symbol": "debug/pe", + "pem.Block": "encoding/pem", + "pem.Decode": "encoding/pem", + "pem.Encode": "encoding/pem", + "pem.EncodeToMemory": "encoding/pem", + "pkix.AlgorithmIdentifier": "crypto/x509/pkix", + "pkix.AttributeTypeAndValue": "crypto/x509/pkix", + "pkix.AttributeTypeAndValueSET": "crypto/x509/pkix", + "pkix.CertificateList": "crypto/x509/pkix", + "pkix.Extension": "crypto/x509/pkix", + "pkix.Name": "crypto/x509/pkix", + "pkix.RDNSequence": "crypto/x509/pkix", + "pkix.RelativeDistinguishedNameSET": "crypto/x509/pkix", + "pkix.RevokedCertificate": "crypto/x509/pkix", + "pkix.TBSCertificateList": "crypto/x509/pkix", + "plan9obj.File": "debug/plan9obj", + "plan9obj.FileHeader": "debug/plan9obj", + "plan9obj.Magic386": "debug/plan9obj", + "plan9obj.Magic64": "debug/plan9obj", + "plan9obj.MagicAMD64": "debug/plan9obj", + "plan9obj.MagicARM": "debug/plan9obj", + "plan9obj.NewFile": "debug/plan9obj", + "plan9obj.Open": "debug/plan9obj", + "plan9obj.Section": "debug/plan9obj", + "plan9obj.SectionHeader": "debug/plan9obj", + "plan9obj.Sym": "debug/plan9obj", + "png.BestCompression": "image/png", + "png.BestSpeed": "image/png", + "png.CompressionLevel": "image/png", + "png.Decode": "image/png", + "png.DecodeConfig": "image/png", + "png.DefaultCompression": "image/png", + "png.Encode": "image/png", + "png.Encoder": "image/png", + "png.FormatError": "image/png", + "png.NoCompression": "image/png", + "png.UnsupportedError": "image/png", + "pprof.Cmdline": "net/http/pprof", + "pprof.Handler": "net/http/pprof", + "pprof.Index": "net/http/pprof", + "pprof.Lookup": "runtime/pprof", + "pprof.NewProfile": "runtime/pprof", + // "pprof.Profile" is ambiguous + "pprof.Profiles": "runtime/pprof", + "pprof.StartCPUProfile": "runtime/pprof", + "pprof.StopCPUProfile": "runtime/pprof", + "pprof.Symbol": "net/http/pprof", + "pprof.Trace": "net/http/pprof", + "pprof.WriteHeapProfile": "runtime/pprof", + "printer.CommentedNode": "go/printer", + "printer.Config": "go/printer", + "printer.Fprint": "go/printer", + "printer.Mode": "go/printer", + "printer.RawFormat": "go/printer", + "printer.SourcePos": "go/printer", + "printer.TabIndent": "go/printer", + "printer.UseSpaces": "go/printer", + "quick.Check": "testing/quick", + "quick.CheckEqual": "testing/quick", + "quick.CheckEqualError": "testing/quick", + "quick.CheckError": "testing/quick", + "quick.Config": "testing/quick", + "quick.Generator": "testing/quick", + "quick.SetupError": "testing/quick", + "quick.Value": "testing/quick", + "quotedprintable.NewReader": "mime/quotedprintable", + "quotedprintable.NewWriter": "mime/quotedprintable", + "quotedprintable.Reader": "mime/quotedprintable", + "quotedprintable.Writer": "mime/quotedprintable", + "rand.ExpFloat64": "math/rand", + "rand.Float32": "math/rand", + "rand.Float64": "math/rand", + // "rand.Int" is ambiguous + "rand.Int31": "math/rand", + "rand.Int31n": "math/rand", + "rand.Int63": "math/rand", + "rand.Int63n": "math/rand", + "rand.Intn": "math/rand", + "rand.New": "math/rand", + "rand.NewSource": "math/rand", + "rand.NewZipf": "math/rand", + "rand.NormFloat64": "math/rand", + "rand.Perm": "math/rand", + "rand.Prime": "crypto/rand", + "rand.Rand": "math/rand", + "rand.Read": "crypto/rand", + "rand.Reader": "crypto/rand", + "rand.Seed": "math/rand", + "rand.Source": "math/rand", + "rand.Uint32": "math/rand", + "rand.Zipf": "math/rand", + "rc4.Cipher": "crypto/rc4", + "rc4.KeySizeError": "crypto/rc4", + "rc4.NewCipher": "crypto/rc4", + "reflect.Append": "reflect", + "reflect.AppendSlice": "reflect", + "reflect.Array": "reflect", + "reflect.ArrayOf": "reflect", + "reflect.Bool": "reflect", + "reflect.BothDir": "reflect", + "reflect.Chan": "reflect", + "reflect.ChanDir": "reflect", + "reflect.ChanOf": "reflect", + "reflect.Complex128": "reflect", + "reflect.Complex64": "reflect", + "reflect.Copy": "reflect", + "reflect.DeepEqual": "reflect", + "reflect.Float32": "reflect", + "reflect.Float64": "reflect", + "reflect.Func": "reflect", + "reflect.FuncOf": "reflect", + "reflect.Indirect": "reflect", + "reflect.Int": "reflect", + "reflect.Int16": "reflect", + "reflect.Int32": "reflect", + "reflect.Int64": "reflect", + "reflect.Int8": "reflect", + "reflect.Interface": "reflect", + "reflect.Invalid": "reflect", + "reflect.Kind": "reflect", + "reflect.MakeChan": "reflect", + "reflect.MakeFunc": "reflect", + "reflect.MakeMap": "reflect", + "reflect.MakeSlice": "reflect", + "reflect.Map": "reflect", + "reflect.MapOf": "reflect", + "reflect.Method": "reflect", + "reflect.New": "reflect", + "reflect.NewAt": "reflect", + "reflect.Ptr": "reflect", + "reflect.PtrTo": "reflect", + "reflect.RecvDir": "reflect", + "reflect.Select": "reflect", + "reflect.SelectCase": "reflect", + "reflect.SelectDefault": "reflect", + "reflect.SelectDir": "reflect", + "reflect.SelectRecv": "reflect", + "reflect.SelectSend": "reflect", + "reflect.SendDir": "reflect", + "reflect.Slice": "reflect", + "reflect.SliceHeader": "reflect", + "reflect.SliceOf": "reflect", + "reflect.String": "reflect", + "reflect.StringHeader": "reflect", + "reflect.Struct": "reflect", + "reflect.StructField": "reflect", + "reflect.StructTag": "reflect", + "reflect.TypeOf": "reflect", + "reflect.Uint": "reflect", + "reflect.Uint16": "reflect", + "reflect.Uint32": "reflect", + "reflect.Uint64": "reflect", + "reflect.Uint8": "reflect", + "reflect.Uintptr": "reflect", + "reflect.UnsafePointer": "reflect", + "reflect.Value": "reflect", + "reflect.ValueError": "reflect", + "reflect.ValueOf": "reflect", + "reflect.Zero": "reflect", + "regexp.Compile": "regexp", + "regexp.CompilePOSIX": "regexp", + "regexp.Match": "regexp", + "regexp.MatchReader": "regexp", + "regexp.MatchString": "regexp", + "regexp.MustCompile": "regexp", + "regexp.MustCompilePOSIX": "regexp", + "regexp.QuoteMeta": "regexp", + "regexp.Regexp": "regexp", + "ring.New": "container/ring", + "ring.Ring": "container/ring", + "rpc.Accept": "net/rpc", + "rpc.Call": "net/rpc", + "rpc.Client": "net/rpc", + "rpc.ClientCodec": "net/rpc", + "rpc.DefaultDebugPath": "net/rpc", + "rpc.DefaultRPCPath": "net/rpc", + "rpc.DefaultServer": "net/rpc", + "rpc.Dial": "net/rpc", + "rpc.DialHTTP": "net/rpc", + "rpc.DialHTTPPath": "net/rpc", + "rpc.ErrShutdown": "net/rpc", + "rpc.HandleHTTP": "net/rpc", + "rpc.NewClient": "net/rpc", + "rpc.NewClientWithCodec": "net/rpc", + "rpc.NewServer": "net/rpc", + "rpc.Register": "net/rpc", + "rpc.RegisterName": "net/rpc", + "rpc.Request": "net/rpc", + "rpc.Response": "net/rpc", + "rpc.ServeCodec": "net/rpc", + "rpc.ServeConn": "net/rpc", + "rpc.ServeRequest": "net/rpc", + "rpc.Server": "net/rpc", + "rpc.ServerCodec": "net/rpc", + "rpc.ServerError": "net/rpc", + "rsa.CRTValue": "crypto/rsa", + "rsa.DecryptOAEP": "crypto/rsa", + "rsa.DecryptPKCS1v15": "crypto/rsa", + "rsa.DecryptPKCS1v15SessionKey": "crypto/rsa", + "rsa.EncryptOAEP": "crypto/rsa", + "rsa.EncryptPKCS1v15": "crypto/rsa", + "rsa.ErrDecryption": "crypto/rsa", + "rsa.ErrMessageTooLong": "crypto/rsa", + "rsa.ErrVerification": "crypto/rsa", + "rsa.GenerateKey": "crypto/rsa", + "rsa.GenerateMultiPrimeKey": "crypto/rsa", + "rsa.OAEPOptions": "crypto/rsa", + "rsa.PKCS1v15DecryptOptions": "crypto/rsa", + "rsa.PSSOptions": "crypto/rsa", + "rsa.PSSSaltLengthAuto": "crypto/rsa", + "rsa.PSSSaltLengthEqualsHash": "crypto/rsa", + "rsa.PrecomputedValues": "crypto/rsa", + "rsa.PrivateKey": "crypto/rsa", + "rsa.PublicKey": "crypto/rsa", + "rsa.SignPKCS1v15": "crypto/rsa", + "rsa.SignPSS": "crypto/rsa", + "rsa.VerifyPKCS1v15": "crypto/rsa", + "rsa.VerifyPSS": "crypto/rsa", + "runtime.BlockProfile": "runtime", + "runtime.BlockProfileRecord": "runtime", + "runtime.Breakpoint": "runtime", + "runtime.CPUProfile": "runtime", + "runtime.Caller": "runtime", + "runtime.Callers": "runtime", + "runtime.Compiler": "runtime", + "runtime.Error": "runtime", + "runtime.Func": "runtime", + "runtime.FuncForPC": "runtime", + "runtime.GC": "runtime", + "runtime.GOARCH": "runtime", + "runtime.GOMAXPROCS": "runtime", + "runtime.GOOS": "runtime", + "runtime.GOROOT": "runtime", + "runtime.Goexit": "runtime", + "runtime.GoroutineProfile": "runtime", + "runtime.Gosched": "runtime", + "runtime.LockOSThread": "runtime", + "runtime.MemProfile": "runtime", + "runtime.MemProfileRate": "runtime", + "runtime.MemProfileRecord": "runtime", + "runtime.MemStats": "runtime", + "runtime.NumCPU": "runtime", + "runtime.NumCgoCall": "runtime", + "runtime.NumGoroutine": "runtime", + "runtime.ReadMemStats": "runtime", + "runtime.ReadTrace": "runtime", + "runtime.SetBlockProfileRate": "runtime", + "runtime.SetCPUProfileRate": "runtime", + "runtime.SetFinalizer": "runtime", + "runtime.Stack": "runtime", + "runtime.StackRecord": "runtime", + "runtime.StartTrace": "runtime", + "runtime.StopTrace": "runtime", + "runtime.ThreadCreateProfile": "runtime", + "runtime.TypeAssertionError": "runtime", + "runtime.UnlockOSThread": "runtime", + "runtime.Version": "runtime", + "scanner.Char": "text/scanner", + "scanner.Comment": "text/scanner", + "scanner.EOF": "text/scanner", + "scanner.Error": "go/scanner", + "scanner.ErrorHandler": "go/scanner", + "scanner.ErrorList": "go/scanner", + "scanner.Float": "text/scanner", + "scanner.GoTokens": "text/scanner", + "scanner.GoWhitespace": "text/scanner", + "scanner.Ident": "text/scanner", + "scanner.Int": "text/scanner", + "scanner.Mode": "go/scanner", + "scanner.Position": "text/scanner", + "scanner.PrintError": "go/scanner", + "scanner.RawString": "text/scanner", + "scanner.ScanChars": "text/scanner", + // "scanner.ScanComments" is ambiguous + "scanner.ScanFloats": "text/scanner", + "scanner.ScanIdents": "text/scanner", + "scanner.ScanInts": "text/scanner", + "scanner.ScanRawStrings": "text/scanner", + "scanner.ScanStrings": "text/scanner", + // "scanner.Scanner" is ambiguous + "scanner.SkipComments": "text/scanner", + "scanner.String": "text/scanner", + "scanner.TokenString": "text/scanner", + "sha1.BlockSize": "crypto/sha1", + "sha1.New": "crypto/sha1", + "sha1.Size": "crypto/sha1", + "sha1.Sum": "crypto/sha1", + "sha256.BlockSize": "crypto/sha256", + "sha256.New": "crypto/sha256", + "sha256.New224": "crypto/sha256", + "sha256.Size": "crypto/sha256", + "sha256.Size224": "crypto/sha256", + "sha256.Sum224": "crypto/sha256", + "sha256.Sum256": "crypto/sha256", + "sha512.BlockSize": "crypto/sha512", + "sha512.New": "crypto/sha512", + "sha512.New384": "crypto/sha512", + "sha512.New512_224": "crypto/sha512", + "sha512.New512_256": "crypto/sha512", + "sha512.Size": "crypto/sha512", + "sha512.Size224": "crypto/sha512", + "sha512.Size256": "crypto/sha512", + "sha512.Size384": "crypto/sha512", + "sha512.Sum384": "crypto/sha512", + "sha512.Sum512": "crypto/sha512", + "sha512.Sum512_224": "crypto/sha512", + "sha512.Sum512_256": "crypto/sha512", + "signal.Ignore": "os/signal", + "signal.Notify": "os/signal", + "signal.Reset": "os/signal", + "signal.Stop": "os/signal", + "smtp.Auth": "net/smtp", + "smtp.CRAMMD5Auth": "net/smtp", + "smtp.Client": "net/smtp", + "smtp.Dial": "net/smtp", + "smtp.NewClient": "net/smtp", + "smtp.PlainAuth": "net/smtp", + "smtp.SendMail": "net/smtp", + "smtp.ServerInfo": "net/smtp", + "sort.Float64Slice": "sort", + "sort.Float64s": "sort", + "sort.Float64sAreSorted": "sort", + "sort.IntSlice": "sort", + "sort.Interface": "sort", + "sort.Ints": "sort", + "sort.IntsAreSorted": "sort", + "sort.IsSorted": "sort", + "sort.Reverse": "sort", + "sort.Search": "sort", + "sort.SearchFloat64s": "sort", + "sort.SearchInts": "sort", + "sort.SearchStrings": "sort", + "sort.Sort": "sort", + "sort.Stable": "sort", + "sort.StringSlice": "sort", + "sort.Strings": "sort", + "sort.StringsAreSorted": "sort", + "sql.DB": "database/sql", + "sql.DBStats": "database/sql", + "sql.Drivers": "database/sql", + "sql.ErrNoRows": "database/sql", + "sql.ErrTxDone": "database/sql", + "sql.NullBool": "database/sql", + "sql.NullFloat64": "database/sql", + "sql.NullInt64": "database/sql", + "sql.NullString": "database/sql", + "sql.Open": "database/sql", + "sql.RawBytes": "database/sql", + "sql.Register": "database/sql", + "sql.Result": "database/sql", + "sql.Row": "database/sql", + "sql.Rows": "database/sql", + "sql.Scanner": "database/sql", + "sql.Stmt": "database/sql", + "sql.Tx": "database/sql", + "strconv.AppendBool": "strconv", + "strconv.AppendFloat": "strconv", + "strconv.AppendInt": "strconv", + "strconv.AppendQuote": "strconv", + "strconv.AppendQuoteRune": "strconv", + "strconv.AppendQuoteRuneToASCII": "strconv", + "strconv.AppendQuoteToASCII": "strconv", + "strconv.AppendUint": "strconv", + "strconv.Atoi": "strconv", + "strconv.CanBackquote": "strconv", + "strconv.ErrRange": "strconv", + "strconv.ErrSyntax": "strconv", + "strconv.FormatBool": "strconv", + "strconv.FormatFloat": "strconv", + "strconv.FormatInt": "strconv", + "strconv.FormatUint": "strconv", + "strconv.IntSize": "strconv", + "strconv.IsPrint": "strconv", + "strconv.Itoa": "strconv", + "strconv.NumError": "strconv", + "strconv.ParseBool": "strconv", + "strconv.ParseFloat": "strconv", + "strconv.ParseInt": "strconv", + "strconv.ParseUint": "strconv", + "strconv.Quote": "strconv", + "strconv.QuoteRune": "strconv", + "strconv.QuoteRuneToASCII": "strconv", + "strconv.QuoteToASCII": "strconv", + "strconv.Unquote": "strconv", + "strconv.UnquoteChar": "strconv", + "strings.Compare": "strings", + "strings.Contains": "strings", + "strings.ContainsAny": "strings", + "strings.ContainsRune": "strings", + "strings.Count": "strings", + "strings.EqualFold": "strings", + "strings.Fields": "strings", + "strings.FieldsFunc": "strings", + "strings.HasPrefix": "strings", + "strings.HasSuffix": "strings", + "strings.Index": "strings", + "strings.IndexAny": "strings", + "strings.IndexByte": "strings", + "strings.IndexFunc": "strings", + "strings.IndexRune": "strings", + "strings.Join": "strings", + "strings.LastIndex": "strings", + "strings.LastIndexAny": "strings", + "strings.LastIndexByte": "strings", + "strings.LastIndexFunc": "strings", + "strings.Map": "strings", + "strings.NewReader": "strings", + "strings.NewReplacer": "strings", + "strings.Reader": "strings", + "strings.Repeat": "strings", + "strings.Replace": "strings", + "strings.Replacer": "strings", + "strings.Split": "strings", + "strings.SplitAfter": "strings", + "strings.SplitAfterN": "strings", + "strings.SplitN": "strings", + "strings.Title": "strings", + "strings.ToLower": "strings", + "strings.ToLowerSpecial": "strings", + "strings.ToTitle": "strings", + "strings.ToTitleSpecial": "strings", + "strings.ToUpper": "strings", + "strings.ToUpperSpecial": "strings", + "strings.Trim": "strings", + "strings.TrimFunc": "strings", + "strings.TrimLeft": "strings", + "strings.TrimLeftFunc": "strings", + "strings.TrimPrefix": "strings", + "strings.TrimRight": "strings", + "strings.TrimRightFunc": "strings", + "strings.TrimSpace": "strings", + "strings.TrimSuffix": "strings", + "subtle.ConstantTimeByteEq": "crypto/subtle", + "subtle.ConstantTimeCompare": "crypto/subtle", + "subtle.ConstantTimeCopy": "crypto/subtle", + "subtle.ConstantTimeEq": "crypto/subtle", + "subtle.ConstantTimeLessOrEq": "crypto/subtle", + "subtle.ConstantTimeSelect": "crypto/subtle", + "suffixarray.Index": "index/suffixarray", + "suffixarray.New": "index/suffixarray", + "sync.Cond": "sync", + "sync.Locker": "sync", + "sync.Mutex": "sync", + "sync.NewCond": "sync", + "sync.Once": "sync", + "sync.Pool": "sync", + "sync.RWMutex": "sync", + "sync.WaitGroup": "sync", + "syntax.ClassNL": "regexp/syntax", + "syntax.Compile": "regexp/syntax", + "syntax.DotNL": "regexp/syntax", + "syntax.EmptyBeginLine": "regexp/syntax", + "syntax.EmptyBeginText": "regexp/syntax", + "syntax.EmptyEndLine": "regexp/syntax", + "syntax.EmptyEndText": "regexp/syntax", + "syntax.EmptyNoWordBoundary": "regexp/syntax", + "syntax.EmptyOp": "regexp/syntax", + "syntax.EmptyOpContext": "regexp/syntax", + "syntax.EmptyWordBoundary": "regexp/syntax", + "syntax.ErrInternalError": "regexp/syntax", + "syntax.ErrInvalidCharClass": "regexp/syntax", + "syntax.ErrInvalidCharRange": "regexp/syntax", + "syntax.ErrInvalidEscape": "regexp/syntax", + "syntax.ErrInvalidNamedCapture": "regexp/syntax", + "syntax.ErrInvalidPerlOp": "regexp/syntax", + "syntax.ErrInvalidRepeatOp": "regexp/syntax", + "syntax.ErrInvalidRepeatSize": "regexp/syntax", + "syntax.ErrInvalidUTF8": "regexp/syntax", + "syntax.ErrMissingBracket": "regexp/syntax", + "syntax.ErrMissingParen": "regexp/syntax", + "syntax.ErrMissingRepeatArgument": "regexp/syntax", + "syntax.ErrTrailingBackslash": "regexp/syntax", + "syntax.ErrUnexpectedParen": "regexp/syntax", + "syntax.Error": "regexp/syntax", + "syntax.ErrorCode": "regexp/syntax", + "syntax.Flags": "regexp/syntax", + "syntax.FoldCase": "regexp/syntax", + "syntax.Inst": "regexp/syntax", + "syntax.InstAlt": "regexp/syntax", + "syntax.InstAltMatch": "regexp/syntax", + "syntax.InstCapture": "regexp/syntax", + "syntax.InstEmptyWidth": "regexp/syntax", + "syntax.InstFail": "regexp/syntax", + "syntax.InstMatch": "regexp/syntax", + "syntax.InstNop": "regexp/syntax", + "syntax.InstOp": "regexp/syntax", + "syntax.InstRune": "regexp/syntax", + "syntax.InstRune1": "regexp/syntax", + "syntax.InstRuneAny": "regexp/syntax", + "syntax.InstRuneAnyNotNL": "regexp/syntax", + "syntax.IsWordChar": "regexp/syntax", + "syntax.Literal": "regexp/syntax", + "syntax.MatchNL": "regexp/syntax", + "syntax.NonGreedy": "regexp/syntax", + "syntax.OneLine": "regexp/syntax", + "syntax.Op": "regexp/syntax", + "syntax.OpAlternate": "regexp/syntax", + "syntax.OpAnyChar": "regexp/syntax", + "syntax.OpAnyCharNotNL": "regexp/syntax", + "syntax.OpBeginLine": "regexp/syntax", + "syntax.OpBeginText": "regexp/syntax", + "syntax.OpCapture": "regexp/syntax", + "syntax.OpCharClass": "regexp/syntax", + "syntax.OpConcat": "regexp/syntax", + "syntax.OpEmptyMatch": "regexp/syntax", + "syntax.OpEndLine": "regexp/syntax", + "syntax.OpEndText": "regexp/syntax", + "syntax.OpLiteral": "regexp/syntax", + "syntax.OpNoMatch": "regexp/syntax", + "syntax.OpNoWordBoundary": "regexp/syntax", + "syntax.OpPlus": "regexp/syntax", + "syntax.OpQuest": "regexp/syntax", + "syntax.OpRepeat": "regexp/syntax", + "syntax.OpStar": "regexp/syntax", + "syntax.OpWordBoundary": "regexp/syntax", + "syntax.POSIX": "regexp/syntax", + "syntax.Parse": "regexp/syntax", + "syntax.Perl": "regexp/syntax", + "syntax.PerlX": "regexp/syntax", + "syntax.Prog": "regexp/syntax", + "syntax.Regexp": "regexp/syntax", + "syntax.Simple": "regexp/syntax", + "syntax.UnicodeGroups": "regexp/syntax", + "syntax.WasDollar": "regexp/syntax", + "syscall.AF_ALG": "syscall", + "syscall.AF_APPLETALK": "syscall", + "syscall.AF_ARP": "syscall", + "syscall.AF_ASH": "syscall", + "syscall.AF_ATM": "syscall", + "syscall.AF_ATMPVC": "syscall", + "syscall.AF_ATMSVC": "syscall", + "syscall.AF_AX25": "syscall", + "syscall.AF_BLUETOOTH": "syscall", + "syscall.AF_BRIDGE": "syscall", + "syscall.AF_CAIF": "syscall", + "syscall.AF_CAN": "syscall", + "syscall.AF_CCITT": "syscall", + "syscall.AF_CHAOS": "syscall", + "syscall.AF_CNT": "syscall", + "syscall.AF_COIP": "syscall", + "syscall.AF_DATAKIT": "syscall", + "syscall.AF_DECnet": "syscall", + "syscall.AF_DLI": "syscall", + "syscall.AF_E164": "syscall", + "syscall.AF_ECMA": "syscall", + "syscall.AF_ECONET": "syscall", + "syscall.AF_ENCAP": "syscall", + "syscall.AF_FILE": "syscall", + "syscall.AF_HYLINK": "syscall", + "syscall.AF_IEEE80211": "syscall", + "syscall.AF_IEEE802154": "syscall", + "syscall.AF_IMPLINK": "syscall", + "syscall.AF_INET": "syscall", + "syscall.AF_INET6": "syscall", + "syscall.AF_INET6_SDP": "syscall", + "syscall.AF_INET_SDP": "syscall", + "syscall.AF_IPX": "syscall", + "syscall.AF_IRDA": "syscall", + "syscall.AF_ISDN": "syscall", + "syscall.AF_ISO": "syscall", + "syscall.AF_IUCV": "syscall", + "syscall.AF_KEY": "syscall", + "syscall.AF_LAT": "syscall", + "syscall.AF_LINK": "syscall", + "syscall.AF_LLC": "syscall", + "syscall.AF_LOCAL": "syscall", + "syscall.AF_MAX": "syscall", + "syscall.AF_MPLS": "syscall", + "syscall.AF_NATM": "syscall", + "syscall.AF_NDRV": "syscall", + "syscall.AF_NETBEUI": "syscall", + "syscall.AF_NETBIOS": "syscall", + "syscall.AF_NETGRAPH": "syscall", + "syscall.AF_NETLINK": "syscall", + "syscall.AF_NETROM": "syscall", + "syscall.AF_NS": "syscall", + "syscall.AF_OROUTE": "syscall", + "syscall.AF_OSI": "syscall", + "syscall.AF_PACKET": "syscall", + "syscall.AF_PHONET": "syscall", + "syscall.AF_PPP": "syscall", + "syscall.AF_PPPOX": "syscall", + "syscall.AF_PUP": "syscall", + "syscall.AF_RDS": "syscall", + "syscall.AF_RESERVED_36": "syscall", + "syscall.AF_ROSE": "syscall", + "syscall.AF_ROUTE": "syscall", + "syscall.AF_RXRPC": "syscall", + "syscall.AF_SCLUSTER": "syscall", + "syscall.AF_SECURITY": "syscall", + "syscall.AF_SIP": "syscall", + "syscall.AF_SLOW": "syscall", + "syscall.AF_SNA": "syscall", + "syscall.AF_SYSTEM": "syscall", + "syscall.AF_TIPC": "syscall", + "syscall.AF_UNIX": "syscall", + "syscall.AF_UNSPEC": "syscall", + "syscall.AF_VENDOR00": "syscall", + "syscall.AF_VENDOR01": "syscall", + "syscall.AF_VENDOR02": "syscall", + "syscall.AF_VENDOR03": "syscall", + "syscall.AF_VENDOR04": "syscall", + "syscall.AF_VENDOR05": "syscall", + "syscall.AF_VENDOR06": "syscall", + "syscall.AF_VENDOR07": "syscall", + "syscall.AF_VENDOR08": "syscall", + "syscall.AF_VENDOR09": "syscall", + "syscall.AF_VENDOR10": "syscall", + "syscall.AF_VENDOR11": "syscall", + "syscall.AF_VENDOR12": "syscall", + "syscall.AF_VENDOR13": "syscall", + "syscall.AF_VENDOR14": "syscall", + "syscall.AF_VENDOR15": "syscall", + "syscall.AF_VENDOR16": "syscall", + "syscall.AF_VENDOR17": "syscall", + "syscall.AF_VENDOR18": "syscall", + "syscall.AF_VENDOR19": "syscall", + "syscall.AF_VENDOR20": "syscall", + "syscall.AF_VENDOR21": "syscall", + "syscall.AF_VENDOR22": "syscall", + "syscall.AF_VENDOR23": "syscall", + "syscall.AF_VENDOR24": "syscall", + "syscall.AF_VENDOR25": "syscall", + "syscall.AF_VENDOR26": "syscall", + "syscall.AF_VENDOR27": "syscall", + "syscall.AF_VENDOR28": "syscall", + "syscall.AF_VENDOR29": "syscall", + "syscall.AF_VENDOR30": "syscall", + "syscall.AF_VENDOR31": "syscall", + "syscall.AF_VENDOR32": "syscall", + "syscall.AF_VENDOR33": "syscall", + "syscall.AF_VENDOR34": "syscall", + "syscall.AF_VENDOR35": "syscall", + "syscall.AF_VENDOR36": "syscall", + "syscall.AF_VENDOR37": "syscall", + "syscall.AF_VENDOR38": "syscall", + "syscall.AF_VENDOR39": "syscall", + "syscall.AF_VENDOR40": "syscall", + "syscall.AF_VENDOR41": "syscall", + "syscall.AF_VENDOR42": "syscall", + "syscall.AF_VENDOR43": "syscall", + "syscall.AF_VENDOR44": "syscall", + "syscall.AF_VENDOR45": "syscall", + "syscall.AF_VENDOR46": "syscall", + "syscall.AF_VENDOR47": "syscall", + "syscall.AF_WANPIPE": "syscall", + "syscall.AF_X25": "syscall", + "syscall.AI_CANONNAME": "syscall", + "syscall.AI_NUMERICHOST": "syscall", + "syscall.AI_PASSIVE": "syscall", + "syscall.APPLICATION_ERROR": "syscall", + "syscall.ARPHRD_ADAPT": "syscall", + "syscall.ARPHRD_APPLETLK": "syscall", + "syscall.ARPHRD_ARCNET": "syscall", + "syscall.ARPHRD_ASH": "syscall", + "syscall.ARPHRD_ATM": "syscall", + "syscall.ARPHRD_AX25": "syscall", + "syscall.ARPHRD_BIF": "syscall", + "syscall.ARPHRD_CHAOS": "syscall", + "syscall.ARPHRD_CISCO": "syscall", + "syscall.ARPHRD_CSLIP": "syscall", + "syscall.ARPHRD_CSLIP6": "syscall", + "syscall.ARPHRD_DDCMP": "syscall", + "syscall.ARPHRD_DLCI": "syscall", + "syscall.ARPHRD_ECONET": "syscall", + "syscall.ARPHRD_EETHER": "syscall", + "syscall.ARPHRD_ETHER": "syscall", + "syscall.ARPHRD_EUI64": "syscall", + "syscall.ARPHRD_FCAL": "syscall", + "syscall.ARPHRD_FCFABRIC": "syscall", + "syscall.ARPHRD_FCPL": "syscall", + "syscall.ARPHRD_FCPP": "syscall", + "syscall.ARPHRD_FDDI": "syscall", + "syscall.ARPHRD_FRAD": "syscall", + "syscall.ARPHRD_FRELAY": "syscall", + "syscall.ARPHRD_HDLC": "syscall", + "syscall.ARPHRD_HIPPI": "syscall", + "syscall.ARPHRD_HWX25": "syscall", + "syscall.ARPHRD_IEEE1394": "syscall", + "syscall.ARPHRD_IEEE802": "syscall", + "syscall.ARPHRD_IEEE80211": "syscall", + "syscall.ARPHRD_IEEE80211_PRISM": "syscall", + "syscall.ARPHRD_IEEE80211_RADIOTAP": "syscall", + "syscall.ARPHRD_IEEE802154": "syscall", + "syscall.ARPHRD_IEEE802154_PHY": "syscall", + "syscall.ARPHRD_IEEE802_TR": "syscall", + "syscall.ARPHRD_INFINIBAND": "syscall", + "syscall.ARPHRD_IPDDP": "syscall", + "syscall.ARPHRD_IPGRE": "syscall", + "syscall.ARPHRD_IRDA": "syscall", + "syscall.ARPHRD_LAPB": "syscall", + "syscall.ARPHRD_LOCALTLK": "syscall", + "syscall.ARPHRD_LOOPBACK": "syscall", + "syscall.ARPHRD_METRICOM": "syscall", + "syscall.ARPHRD_NETROM": "syscall", + "syscall.ARPHRD_NONE": "syscall", + "syscall.ARPHRD_PIMREG": "syscall", + "syscall.ARPHRD_PPP": "syscall", + "syscall.ARPHRD_PRONET": "syscall", + "syscall.ARPHRD_RAWHDLC": "syscall", + "syscall.ARPHRD_ROSE": "syscall", + "syscall.ARPHRD_RSRVD": "syscall", + "syscall.ARPHRD_SIT": "syscall", + "syscall.ARPHRD_SKIP": "syscall", + "syscall.ARPHRD_SLIP": "syscall", + "syscall.ARPHRD_SLIP6": "syscall", + "syscall.ARPHRD_STRIP": "syscall", + "syscall.ARPHRD_TUNNEL": "syscall", + "syscall.ARPHRD_TUNNEL6": "syscall", + "syscall.ARPHRD_VOID": "syscall", + "syscall.ARPHRD_X25": "syscall", + "syscall.AUTHTYPE_CLIENT": "syscall", + "syscall.AUTHTYPE_SERVER": "syscall", + "syscall.Accept": "syscall", + "syscall.Accept4": "syscall", + "syscall.AcceptEx": "syscall", + "syscall.Access": "syscall", + "syscall.Acct": "syscall", + "syscall.AddrinfoW": "syscall", + "syscall.Adjtime": "syscall", + "syscall.Adjtimex": "syscall", + "syscall.AttachLsf": "syscall", + "syscall.B0": "syscall", + "syscall.B1000000": "syscall", + "syscall.B110": "syscall", + "syscall.B115200": "syscall", + "syscall.B1152000": "syscall", + "syscall.B1200": "syscall", + "syscall.B134": "syscall", + "syscall.B14400": "syscall", + "syscall.B150": "syscall", + "syscall.B1500000": "syscall", + "syscall.B1800": "syscall", + "syscall.B19200": "syscall", + "syscall.B200": "syscall", + "syscall.B2000000": "syscall", + "syscall.B230400": "syscall", + "syscall.B2400": "syscall", + "syscall.B2500000": "syscall", + "syscall.B28800": "syscall", + "syscall.B300": "syscall", + "syscall.B3000000": "syscall", + "syscall.B3500000": "syscall", + "syscall.B38400": "syscall", + "syscall.B4000000": "syscall", + "syscall.B460800": "syscall", + "syscall.B4800": "syscall", + "syscall.B50": "syscall", + "syscall.B500000": "syscall", + "syscall.B57600": "syscall", + "syscall.B576000": "syscall", + "syscall.B600": "syscall", + "syscall.B7200": "syscall", + "syscall.B75": "syscall", + "syscall.B76800": "syscall", + "syscall.B921600": "syscall", + "syscall.B9600": "syscall", + "syscall.BASE_PROTOCOL": "syscall", + "syscall.BIOCFEEDBACK": "syscall", + "syscall.BIOCFLUSH": "syscall", + "syscall.BIOCGBLEN": "syscall", + "syscall.BIOCGDIRECTION": "syscall", + "syscall.BIOCGDIRFILT": "syscall", + "syscall.BIOCGDLT": "syscall", + "syscall.BIOCGDLTLIST": "syscall", + "syscall.BIOCGETBUFMODE": "syscall", + "syscall.BIOCGETIF": "syscall", + "syscall.BIOCGETZMAX": "syscall", + "syscall.BIOCGFEEDBACK": "syscall", + "syscall.BIOCGFILDROP": "syscall", + "syscall.BIOCGHDRCMPLT": "syscall", + "syscall.BIOCGRSIG": "syscall", + "syscall.BIOCGRTIMEOUT": "syscall", + "syscall.BIOCGSEESENT": "syscall", + "syscall.BIOCGSTATS": "syscall", + "syscall.BIOCGSTATSOLD": "syscall", + "syscall.BIOCGTSTAMP": "syscall", + "syscall.BIOCIMMEDIATE": "syscall", + "syscall.BIOCLOCK": "syscall", + "syscall.BIOCPROMISC": "syscall", + "syscall.BIOCROTZBUF": "syscall", + "syscall.BIOCSBLEN": "syscall", + "syscall.BIOCSDIRECTION": "syscall", + "syscall.BIOCSDIRFILT": "syscall", + "syscall.BIOCSDLT": "syscall", + "syscall.BIOCSETBUFMODE": "syscall", + "syscall.BIOCSETF": "syscall", + "syscall.BIOCSETFNR": "syscall", + "syscall.BIOCSETIF": "syscall", + "syscall.BIOCSETWF": "syscall", + "syscall.BIOCSETZBUF": "syscall", + "syscall.BIOCSFEEDBACK": "syscall", + "syscall.BIOCSFILDROP": "syscall", + "syscall.BIOCSHDRCMPLT": "syscall", + "syscall.BIOCSRSIG": "syscall", + "syscall.BIOCSRTIMEOUT": "syscall", + "syscall.BIOCSSEESENT": "syscall", + "syscall.BIOCSTCPF": "syscall", + "syscall.BIOCSTSTAMP": "syscall", + "syscall.BIOCSUDPF": "syscall", + "syscall.BIOCVERSION": "syscall", + "syscall.BPF_A": "syscall", + "syscall.BPF_ABS": "syscall", + "syscall.BPF_ADD": "syscall", + "syscall.BPF_ALIGNMENT": "syscall", + "syscall.BPF_ALIGNMENT32": "syscall", + "syscall.BPF_ALU": "syscall", + "syscall.BPF_AND": "syscall", + "syscall.BPF_B": "syscall", + "syscall.BPF_BUFMODE_BUFFER": "syscall", + "syscall.BPF_BUFMODE_ZBUF": "syscall", + "syscall.BPF_DFLTBUFSIZE": "syscall", + "syscall.BPF_DIRECTION_IN": "syscall", + "syscall.BPF_DIRECTION_OUT": "syscall", + "syscall.BPF_DIV": "syscall", + "syscall.BPF_H": "syscall", + "syscall.BPF_IMM": "syscall", + "syscall.BPF_IND": "syscall", + "syscall.BPF_JA": "syscall", + "syscall.BPF_JEQ": "syscall", + "syscall.BPF_JGE": "syscall", + "syscall.BPF_JGT": "syscall", + "syscall.BPF_JMP": "syscall", + "syscall.BPF_JSET": "syscall", + "syscall.BPF_K": "syscall", + "syscall.BPF_LD": "syscall", + "syscall.BPF_LDX": "syscall", + "syscall.BPF_LEN": "syscall", + "syscall.BPF_LSH": "syscall", + "syscall.BPF_MAJOR_VERSION": "syscall", + "syscall.BPF_MAXBUFSIZE": "syscall", + "syscall.BPF_MAXINSNS": "syscall", + "syscall.BPF_MEM": "syscall", + "syscall.BPF_MEMWORDS": "syscall", + "syscall.BPF_MINBUFSIZE": "syscall", + "syscall.BPF_MINOR_VERSION": "syscall", + "syscall.BPF_MISC": "syscall", + "syscall.BPF_MSH": "syscall", + "syscall.BPF_MUL": "syscall", + "syscall.BPF_NEG": "syscall", + "syscall.BPF_OR": "syscall", + "syscall.BPF_RELEASE": "syscall", + "syscall.BPF_RET": "syscall", + "syscall.BPF_RSH": "syscall", + "syscall.BPF_ST": "syscall", + "syscall.BPF_STX": "syscall", + "syscall.BPF_SUB": "syscall", + "syscall.BPF_TAX": "syscall", + "syscall.BPF_TXA": "syscall", + "syscall.BPF_T_BINTIME": "syscall", + "syscall.BPF_T_BINTIME_FAST": "syscall", + "syscall.BPF_T_BINTIME_MONOTONIC": "syscall", + "syscall.BPF_T_BINTIME_MONOTONIC_FAST": "syscall", + "syscall.BPF_T_FAST": "syscall", + "syscall.BPF_T_FLAG_MASK": "syscall", + "syscall.BPF_T_FORMAT_MASK": "syscall", + "syscall.BPF_T_MICROTIME": "syscall", + "syscall.BPF_T_MICROTIME_FAST": "syscall", + "syscall.BPF_T_MICROTIME_MONOTONIC": "syscall", + "syscall.BPF_T_MICROTIME_MONOTONIC_FAST": "syscall", + "syscall.BPF_T_MONOTONIC": "syscall", + "syscall.BPF_T_MONOTONIC_FAST": "syscall", + "syscall.BPF_T_NANOTIME": "syscall", + "syscall.BPF_T_NANOTIME_FAST": "syscall", + "syscall.BPF_T_NANOTIME_MONOTONIC": "syscall", + "syscall.BPF_T_NANOTIME_MONOTONIC_FAST": "syscall", + "syscall.BPF_T_NONE": "syscall", + "syscall.BPF_T_NORMAL": "syscall", + "syscall.BPF_W": "syscall", + "syscall.BPF_X": "syscall", + "syscall.BRKINT": "syscall", + "syscall.Bind": "syscall", + "syscall.BindToDevice": "syscall", + "syscall.BpfBuflen": "syscall", + "syscall.BpfDatalink": "syscall", + "syscall.BpfHdr": "syscall", + "syscall.BpfHeadercmpl": "syscall", + "syscall.BpfInsn": "syscall", + "syscall.BpfInterface": "syscall", + "syscall.BpfJump": "syscall", + "syscall.BpfProgram": "syscall", + "syscall.BpfStat": "syscall", + "syscall.BpfStats": "syscall", + "syscall.BpfStmt": "syscall", + "syscall.BpfTimeout": "syscall", + "syscall.BpfTimeval": "syscall", + "syscall.BpfVersion": "syscall", + "syscall.BpfZbuf": "syscall", + "syscall.BpfZbufHeader": "syscall", + "syscall.ByHandleFileInformation": "syscall", + "syscall.BytePtrFromString": "syscall", + "syscall.ByteSliceFromString": "syscall", + "syscall.CCR0_FLUSH": "syscall", + "syscall.CERT_CHAIN_POLICY_AUTHENTICODE": "syscall", + "syscall.CERT_CHAIN_POLICY_AUTHENTICODE_TS": "syscall", + "syscall.CERT_CHAIN_POLICY_BASE": "syscall", + "syscall.CERT_CHAIN_POLICY_BASIC_CONSTRAINTS": "syscall", + "syscall.CERT_CHAIN_POLICY_EV": "syscall", + "syscall.CERT_CHAIN_POLICY_MICROSOFT_ROOT": "syscall", + "syscall.CERT_CHAIN_POLICY_NT_AUTH": "syscall", + "syscall.CERT_CHAIN_POLICY_SSL": "syscall", + "syscall.CERT_E_CN_NO_MATCH": "syscall", + "syscall.CERT_E_EXPIRED": "syscall", + "syscall.CERT_E_PURPOSE": "syscall", + "syscall.CERT_E_ROLE": "syscall", + "syscall.CERT_E_UNTRUSTEDROOT": "syscall", + "syscall.CERT_STORE_ADD_ALWAYS": "syscall", + "syscall.CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG": "syscall", + "syscall.CERT_STORE_PROV_MEMORY": "syscall", + "syscall.CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT": "syscall", + "syscall.CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT": "syscall", + "syscall.CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT": "syscall", + "syscall.CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT": "syscall", + "syscall.CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT": "syscall", + "syscall.CERT_TRUST_INVALID_BASIC_CONSTRAINTS": "syscall", + "syscall.CERT_TRUST_INVALID_EXTENSION": "syscall", + "syscall.CERT_TRUST_INVALID_NAME_CONSTRAINTS": "syscall", + "syscall.CERT_TRUST_INVALID_POLICY_CONSTRAINTS": "syscall", + "syscall.CERT_TRUST_IS_CYCLIC": "syscall", + "syscall.CERT_TRUST_IS_EXPLICIT_DISTRUST": "syscall", + "syscall.CERT_TRUST_IS_NOT_SIGNATURE_VALID": "syscall", + "syscall.CERT_TRUST_IS_NOT_TIME_VALID": "syscall", + "syscall.CERT_TRUST_IS_NOT_VALID_FOR_USAGE": "syscall", + "syscall.CERT_TRUST_IS_OFFLINE_REVOCATION": "syscall", + "syscall.CERT_TRUST_IS_REVOKED": "syscall", + "syscall.CERT_TRUST_IS_UNTRUSTED_ROOT": "syscall", + "syscall.CERT_TRUST_NO_ERROR": "syscall", + "syscall.CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY": "syscall", + "syscall.CERT_TRUST_REVOCATION_STATUS_UNKNOWN": "syscall", + "syscall.CFLUSH": "syscall", + "syscall.CLOCAL": "syscall", + "syscall.CLONE_CHILD_CLEARTID": "syscall", + "syscall.CLONE_CHILD_SETTID": "syscall", + "syscall.CLONE_CSIGNAL": "syscall", + "syscall.CLONE_DETACHED": "syscall", + "syscall.CLONE_FILES": "syscall", + "syscall.CLONE_FS": "syscall", + "syscall.CLONE_IO": "syscall", + "syscall.CLONE_NEWIPC": "syscall", + "syscall.CLONE_NEWNET": "syscall", + "syscall.CLONE_NEWNS": "syscall", + "syscall.CLONE_NEWPID": "syscall", + "syscall.CLONE_NEWUSER": "syscall", + "syscall.CLONE_NEWUTS": "syscall", + "syscall.CLONE_PARENT": "syscall", + "syscall.CLONE_PARENT_SETTID": "syscall", + "syscall.CLONE_PID": "syscall", + "syscall.CLONE_PTRACE": "syscall", + "syscall.CLONE_SETTLS": "syscall", + "syscall.CLONE_SIGHAND": "syscall", + "syscall.CLONE_SYSVSEM": "syscall", + "syscall.CLONE_THREAD": "syscall", + "syscall.CLONE_UNTRACED": "syscall", + "syscall.CLONE_VFORK": "syscall", + "syscall.CLONE_VM": "syscall", + "syscall.CPUID_CFLUSH": "syscall", + "syscall.CREAD": "syscall", + "syscall.CREATE_ALWAYS": "syscall", + "syscall.CREATE_NEW": "syscall", + "syscall.CREATE_NEW_PROCESS_GROUP": "syscall", + "syscall.CREATE_UNICODE_ENVIRONMENT": "syscall", + "syscall.CRYPT_DEFAULT_CONTAINER_OPTIONAL": "syscall", + "syscall.CRYPT_DELETEKEYSET": "syscall", + "syscall.CRYPT_MACHINE_KEYSET": "syscall", + "syscall.CRYPT_NEWKEYSET": "syscall", + "syscall.CRYPT_SILENT": "syscall", + "syscall.CRYPT_VERIFYCONTEXT": "syscall", + "syscall.CS5": "syscall", + "syscall.CS6": "syscall", + "syscall.CS7": "syscall", + "syscall.CS8": "syscall", + "syscall.CSIZE": "syscall", + "syscall.CSTART": "syscall", + "syscall.CSTATUS": "syscall", + "syscall.CSTOP": "syscall", + "syscall.CSTOPB": "syscall", + "syscall.CSUSP": "syscall", + "syscall.CTL_MAXNAME": "syscall", + "syscall.CTL_NET": "syscall", + "syscall.CTL_QUERY": "syscall", + "syscall.CTRL_BREAK_EVENT": "syscall", + "syscall.CTRL_C_EVENT": "syscall", + "syscall.CancelIo": "syscall", + "syscall.CancelIoEx": "syscall", + "syscall.CertAddCertificateContextToStore": "syscall", + "syscall.CertChainContext": "syscall", + "syscall.CertChainElement": "syscall", + "syscall.CertChainPara": "syscall", + "syscall.CertChainPolicyPara": "syscall", + "syscall.CertChainPolicyStatus": "syscall", + "syscall.CertCloseStore": "syscall", + "syscall.CertContext": "syscall", + "syscall.CertCreateCertificateContext": "syscall", + "syscall.CertEnhKeyUsage": "syscall", + "syscall.CertEnumCertificatesInStore": "syscall", + "syscall.CertFreeCertificateChain": "syscall", + "syscall.CertFreeCertificateContext": "syscall", + "syscall.CertGetCertificateChain": "syscall", + "syscall.CertOpenStore": "syscall", + "syscall.CertOpenSystemStore": "syscall", + "syscall.CertRevocationInfo": "syscall", + "syscall.CertSimpleChain": "syscall", + "syscall.CertTrustStatus": "syscall", + "syscall.CertUsageMatch": "syscall", + "syscall.CertVerifyCertificateChainPolicy": "syscall", + "syscall.Chdir": "syscall", + "syscall.CheckBpfVersion": "syscall", + "syscall.Chflags": "syscall", + "syscall.Chmod": "syscall", + "syscall.Chown": "syscall", + "syscall.Chroot": "syscall", + "syscall.Clearenv": "syscall", + "syscall.Close": "syscall", + "syscall.CloseHandle": "syscall", + "syscall.CloseOnExec": "syscall", + "syscall.Closesocket": "syscall", + "syscall.CmsgLen": "syscall", + "syscall.CmsgSpace": "syscall", + "syscall.Cmsghdr": "syscall", + "syscall.CommandLineToArgv": "syscall", + "syscall.ComputerName": "syscall", + "syscall.Connect": "syscall", + "syscall.ConnectEx": "syscall", + "syscall.ConvertSidToStringSid": "syscall", + "syscall.ConvertStringSidToSid": "syscall", + "syscall.CopySid": "syscall", + "syscall.Creat": "syscall", + "syscall.CreateDirectory": "syscall", + "syscall.CreateFile": "syscall", + "syscall.CreateFileMapping": "syscall", + "syscall.CreateHardLink": "syscall", + "syscall.CreateIoCompletionPort": "syscall", + "syscall.CreatePipe": "syscall", + "syscall.CreateProcess": "syscall", + "syscall.CreateSymbolicLink": "syscall", + "syscall.CreateToolhelp32Snapshot": "syscall", + "syscall.Credential": "syscall", + "syscall.CryptAcquireContext": "syscall", + "syscall.CryptGenRandom": "syscall", + "syscall.CryptReleaseContext": "syscall", + "syscall.DIOCBSFLUSH": "syscall", + "syscall.DIOCOSFPFLUSH": "syscall", + "syscall.DLL": "syscall", + "syscall.DLLError": "syscall", + "syscall.DLT_A429": "syscall", + "syscall.DLT_A653_ICM": "syscall", + "syscall.DLT_AIRONET_HEADER": "syscall", + "syscall.DLT_AOS": "syscall", + "syscall.DLT_APPLE_IP_OVER_IEEE1394": "syscall", + "syscall.DLT_ARCNET": "syscall", + "syscall.DLT_ARCNET_LINUX": "syscall", + "syscall.DLT_ATM_CLIP": "syscall", + "syscall.DLT_ATM_RFC1483": "syscall", + "syscall.DLT_AURORA": "syscall", + "syscall.DLT_AX25": "syscall", + "syscall.DLT_AX25_KISS": "syscall", + "syscall.DLT_BACNET_MS_TP": "syscall", + "syscall.DLT_BLUETOOTH_HCI_H4": "syscall", + "syscall.DLT_BLUETOOTH_HCI_H4_WITH_PHDR": "syscall", + "syscall.DLT_CAN20B": "syscall", + "syscall.DLT_CAN_SOCKETCAN": "syscall", + "syscall.DLT_CHAOS": "syscall", + "syscall.DLT_CHDLC": "syscall", + "syscall.DLT_CISCO_IOS": "syscall", + "syscall.DLT_C_HDLC": "syscall", + "syscall.DLT_C_HDLC_WITH_DIR": "syscall", + "syscall.DLT_DBUS": "syscall", + "syscall.DLT_DECT": "syscall", + "syscall.DLT_DOCSIS": "syscall", + "syscall.DLT_DVB_CI": "syscall", + "syscall.DLT_ECONET": "syscall", + "syscall.DLT_EN10MB": "syscall", + "syscall.DLT_EN3MB": "syscall", + "syscall.DLT_ENC": "syscall", + "syscall.DLT_ERF": "syscall", + "syscall.DLT_ERF_ETH": "syscall", + "syscall.DLT_ERF_POS": "syscall", + "syscall.DLT_FC_2": "syscall", + "syscall.DLT_FC_2_WITH_FRAME_DELIMS": "syscall", + "syscall.DLT_FDDI": "syscall", + "syscall.DLT_FLEXRAY": "syscall", + "syscall.DLT_FRELAY": "syscall", + "syscall.DLT_FRELAY_WITH_DIR": "syscall", + "syscall.DLT_GCOM_SERIAL": "syscall", + "syscall.DLT_GCOM_T1E1": "syscall", + "syscall.DLT_GPF_F": "syscall", + "syscall.DLT_GPF_T": "syscall", + "syscall.DLT_GPRS_LLC": "syscall", + "syscall.DLT_GSMTAP_ABIS": "syscall", + "syscall.DLT_GSMTAP_UM": "syscall", + "syscall.DLT_HDLC": "syscall", + "syscall.DLT_HHDLC": "syscall", + "syscall.DLT_HIPPI": "syscall", + "syscall.DLT_IBM_SN": "syscall", + "syscall.DLT_IBM_SP": "syscall", + "syscall.DLT_IEEE802": "syscall", + "syscall.DLT_IEEE802_11": "syscall", + "syscall.DLT_IEEE802_11_RADIO": "syscall", + "syscall.DLT_IEEE802_11_RADIO_AVS": "syscall", + "syscall.DLT_IEEE802_15_4": "syscall", + "syscall.DLT_IEEE802_15_4_LINUX": "syscall", + "syscall.DLT_IEEE802_15_4_NOFCS": "syscall", + "syscall.DLT_IEEE802_15_4_NONASK_PHY": "syscall", + "syscall.DLT_IEEE802_16_MAC_CPS": "syscall", + "syscall.DLT_IEEE802_16_MAC_CPS_RADIO": "syscall", + "syscall.DLT_IPFILTER": "syscall", + "syscall.DLT_IPMB": "syscall", + "syscall.DLT_IPMB_LINUX": "syscall", + "syscall.DLT_IPNET": "syscall", + "syscall.DLT_IPOIB": "syscall", + "syscall.DLT_IPV4": "syscall", + "syscall.DLT_IPV6": "syscall", + "syscall.DLT_IP_OVER_FC": "syscall", + "syscall.DLT_JUNIPER_ATM1": "syscall", + "syscall.DLT_JUNIPER_ATM2": "syscall", + "syscall.DLT_JUNIPER_ATM_CEMIC": "syscall", + "syscall.DLT_JUNIPER_CHDLC": "syscall", + "syscall.DLT_JUNIPER_ES": "syscall", + "syscall.DLT_JUNIPER_ETHER": "syscall", + "syscall.DLT_JUNIPER_FIBRECHANNEL": "syscall", + "syscall.DLT_JUNIPER_FRELAY": "syscall", + "syscall.DLT_JUNIPER_GGSN": "syscall", + "syscall.DLT_JUNIPER_ISM": "syscall", + "syscall.DLT_JUNIPER_MFR": "syscall", + "syscall.DLT_JUNIPER_MLFR": "syscall", + "syscall.DLT_JUNIPER_MLPPP": "syscall", + "syscall.DLT_JUNIPER_MONITOR": "syscall", + "syscall.DLT_JUNIPER_PIC_PEER": "syscall", + "syscall.DLT_JUNIPER_PPP": "syscall", + "syscall.DLT_JUNIPER_PPPOE": "syscall", + "syscall.DLT_JUNIPER_PPPOE_ATM": "syscall", + "syscall.DLT_JUNIPER_SERVICES": "syscall", + "syscall.DLT_JUNIPER_SRX_E2E": "syscall", + "syscall.DLT_JUNIPER_ST": "syscall", + "syscall.DLT_JUNIPER_VP": "syscall", + "syscall.DLT_JUNIPER_VS": "syscall", + "syscall.DLT_LAPB_WITH_DIR": "syscall", + "syscall.DLT_LAPD": "syscall", + "syscall.DLT_LIN": "syscall", + "syscall.DLT_LINUX_EVDEV": "syscall", + "syscall.DLT_LINUX_IRDA": "syscall", + "syscall.DLT_LINUX_LAPD": "syscall", + "syscall.DLT_LINUX_PPP_WITHDIRECTION": "syscall", + "syscall.DLT_LINUX_SLL": "syscall", + "syscall.DLT_LOOP": "syscall", + "syscall.DLT_LTALK": "syscall", + "syscall.DLT_MATCHING_MAX": "syscall", + "syscall.DLT_MATCHING_MIN": "syscall", + "syscall.DLT_MFR": "syscall", + "syscall.DLT_MOST": "syscall", + "syscall.DLT_MPEG_2_TS": "syscall", + "syscall.DLT_MPLS": "syscall", + "syscall.DLT_MTP2": "syscall", + "syscall.DLT_MTP2_WITH_PHDR": "syscall", + "syscall.DLT_MTP3": "syscall", + "syscall.DLT_MUX27010": "syscall", + "syscall.DLT_NETANALYZER": "syscall", + "syscall.DLT_NETANALYZER_TRANSPARENT": "syscall", + "syscall.DLT_NFC_LLCP": "syscall", + "syscall.DLT_NFLOG": "syscall", + "syscall.DLT_NG40": "syscall", + "syscall.DLT_NULL": "syscall", + "syscall.DLT_PCI_EXP": "syscall", + "syscall.DLT_PFLOG": "syscall", + "syscall.DLT_PFSYNC": "syscall", + "syscall.DLT_PPI": "syscall", + "syscall.DLT_PPP": "syscall", + "syscall.DLT_PPP_BSDOS": "syscall", + "syscall.DLT_PPP_ETHER": "syscall", + "syscall.DLT_PPP_PPPD": "syscall", + "syscall.DLT_PPP_SERIAL": "syscall", + "syscall.DLT_PPP_WITH_DIR": "syscall", + "syscall.DLT_PPP_WITH_DIRECTION": "syscall", + "syscall.DLT_PRISM_HEADER": "syscall", + "syscall.DLT_PRONET": "syscall", + "syscall.DLT_RAIF1": "syscall", + "syscall.DLT_RAW": "syscall", + "syscall.DLT_RAWAF_MASK": "syscall", + "syscall.DLT_RIO": "syscall", + "syscall.DLT_SCCP": "syscall", + "syscall.DLT_SITA": "syscall", + "syscall.DLT_SLIP": "syscall", + "syscall.DLT_SLIP_BSDOS": "syscall", + "syscall.DLT_STANAG_5066_D_PDU": "syscall", + "syscall.DLT_SUNATM": "syscall", + "syscall.DLT_SYMANTEC_FIREWALL": "syscall", + "syscall.DLT_TZSP": "syscall", + "syscall.DLT_USB": "syscall", + "syscall.DLT_USB_LINUX": "syscall", + "syscall.DLT_USB_LINUX_MMAPPED": "syscall", + "syscall.DLT_USER0": "syscall", + "syscall.DLT_USER1": "syscall", + "syscall.DLT_USER10": "syscall", + "syscall.DLT_USER11": "syscall", + "syscall.DLT_USER12": "syscall", + "syscall.DLT_USER13": "syscall", + "syscall.DLT_USER14": "syscall", + "syscall.DLT_USER15": "syscall", + "syscall.DLT_USER2": "syscall", + "syscall.DLT_USER3": "syscall", + "syscall.DLT_USER4": "syscall", + "syscall.DLT_USER5": "syscall", + "syscall.DLT_USER6": "syscall", + "syscall.DLT_USER7": "syscall", + "syscall.DLT_USER8": "syscall", + "syscall.DLT_USER9": "syscall", + "syscall.DLT_WIHART": "syscall", + "syscall.DLT_X2E_SERIAL": "syscall", + "syscall.DLT_X2E_XORAYA": "syscall", + "syscall.DNSMXData": "syscall", + "syscall.DNSPTRData": "syscall", + "syscall.DNSRecord": "syscall", + "syscall.DNSSRVData": "syscall", + "syscall.DNSTXTData": "syscall", + "syscall.DNS_INFO_NO_RECORDS": "syscall", + "syscall.DNS_TYPE_A": "syscall", + "syscall.DNS_TYPE_A6": "syscall", + "syscall.DNS_TYPE_AAAA": "syscall", + "syscall.DNS_TYPE_ADDRS": "syscall", + "syscall.DNS_TYPE_AFSDB": "syscall", + "syscall.DNS_TYPE_ALL": "syscall", + "syscall.DNS_TYPE_ANY": "syscall", + "syscall.DNS_TYPE_ATMA": "syscall", + "syscall.DNS_TYPE_AXFR": "syscall", + "syscall.DNS_TYPE_CERT": "syscall", + "syscall.DNS_TYPE_CNAME": "syscall", + "syscall.DNS_TYPE_DHCID": "syscall", + "syscall.DNS_TYPE_DNAME": "syscall", + "syscall.DNS_TYPE_DNSKEY": "syscall", + "syscall.DNS_TYPE_DS": "syscall", + "syscall.DNS_TYPE_EID": "syscall", + "syscall.DNS_TYPE_GID": "syscall", + "syscall.DNS_TYPE_GPOS": "syscall", + "syscall.DNS_TYPE_HINFO": "syscall", + "syscall.DNS_TYPE_ISDN": "syscall", + "syscall.DNS_TYPE_IXFR": "syscall", + "syscall.DNS_TYPE_KEY": "syscall", + "syscall.DNS_TYPE_KX": "syscall", + "syscall.DNS_TYPE_LOC": "syscall", + "syscall.DNS_TYPE_MAILA": "syscall", + "syscall.DNS_TYPE_MAILB": "syscall", + "syscall.DNS_TYPE_MB": "syscall", + "syscall.DNS_TYPE_MD": "syscall", + "syscall.DNS_TYPE_MF": "syscall", + "syscall.DNS_TYPE_MG": "syscall", + "syscall.DNS_TYPE_MINFO": "syscall", + "syscall.DNS_TYPE_MR": "syscall", + "syscall.DNS_TYPE_MX": "syscall", + "syscall.DNS_TYPE_NAPTR": "syscall", + "syscall.DNS_TYPE_NBSTAT": "syscall", + "syscall.DNS_TYPE_NIMLOC": "syscall", + "syscall.DNS_TYPE_NS": "syscall", + "syscall.DNS_TYPE_NSAP": "syscall", + "syscall.DNS_TYPE_NSAPPTR": "syscall", + "syscall.DNS_TYPE_NSEC": "syscall", + "syscall.DNS_TYPE_NULL": "syscall", + "syscall.DNS_TYPE_NXT": "syscall", + "syscall.DNS_TYPE_OPT": "syscall", + "syscall.DNS_TYPE_PTR": "syscall", + "syscall.DNS_TYPE_PX": "syscall", + "syscall.DNS_TYPE_RP": "syscall", + "syscall.DNS_TYPE_RRSIG": "syscall", + "syscall.DNS_TYPE_RT": "syscall", + "syscall.DNS_TYPE_SIG": "syscall", + "syscall.DNS_TYPE_SINK": "syscall", + "syscall.DNS_TYPE_SOA": "syscall", + "syscall.DNS_TYPE_SRV": "syscall", + "syscall.DNS_TYPE_TEXT": "syscall", + "syscall.DNS_TYPE_TKEY": "syscall", + "syscall.DNS_TYPE_TSIG": "syscall", + "syscall.DNS_TYPE_UID": "syscall", + "syscall.DNS_TYPE_UINFO": "syscall", + "syscall.DNS_TYPE_UNSPEC": "syscall", + "syscall.DNS_TYPE_WINS": "syscall", + "syscall.DNS_TYPE_WINSR": "syscall", + "syscall.DNS_TYPE_WKS": "syscall", + "syscall.DNS_TYPE_X25": "syscall", + "syscall.DT_BLK": "syscall", + "syscall.DT_CHR": "syscall", + "syscall.DT_DIR": "syscall", + "syscall.DT_FIFO": "syscall", + "syscall.DT_LNK": "syscall", + "syscall.DT_REG": "syscall", + "syscall.DT_SOCK": "syscall", + "syscall.DT_UNKNOWN": "syscall", + "syscall.DT_WHT": "syscall", + "syscall.DUPLICATE_CLOSE_SOURCE": "syscall", + "syscall.DUPLICATE_SAME_ACCESS": "syscall", + "syscall.DeleteFile": "syscall", + "syscall.DetachLsf": "syscall", + "syscall.DeviceIoControl": "syscall", + "syscall.Dirent": "syscall", + "syscall.DnsNameCompare": "syscall", + "syscall.DnsQuery": "syscall", + "syscall.DnsRecordListFree": "syscall", + "syscall.DnsSectionAdditional": "syscall", + "syscall.DnsSectionAnswer": "syscall", + "syscall.DnsSectionAuthority": "syscall", + "syscall.DnsSectionQuestion": "syscall", + "syscall.Dup": "syscall", + "syscall.Dup2": "syscall", + "syscall.Dup3": "syscall", + "syscall.DuplicateHandle": "syscall", + "syscall.E2BIG": "syscall", + "syscall.EACCES": "syscall", + "syscall.EADDRINUSE": "syscall", + "syscall.EADDRNOTAVAIL": "syscall", + "syscall.EADV": "syscall", + "syscall.EAFNOSUPPORT": "syscall", + "syscall.EAGAIN": "syscall", + "syscall.EALREADY": "syscall", + "syscall.EAUTH": "syscall", + "syscall.EBADARCH": "syscall", + "syscall.EBADE": "syscall", + "syscall.EBADEXEC": "syscall", + "syscall.EBADF": "syscall", + "syscall.EBADFD": "syscall", + "syscall.EBADMACHO": "syscall", + "syscall.EBADMSG": "syscall", + "syscall.EBADR": "syscall", + "syscall.EBADRPC": "syscall", + "syscall.EBADRQC": "syscall", + "syscall.EBADSLT": "syscall", + "syscall.EBFONT": "syscall", + "syscall.EBUSY": "syscall", + "syscall.ECANCELED": "syscall", + "syscall.ECAPMODE": "syscall", + "syscall.ECHILD": "syscall", + "syscall.ECHO": "syscall", + "syscall.ECHOCTL": "syscall", + "syscall.ECHOE": "syscall", + "syscall.ECHOK": "syscall", + "syscall.ECHOKE": "syscall", + "syscall.ECHONL": "syscall", + "syscall.ECHOPRT": "syscall", + "syscall.ECHRNG": "syscall", + "syscall.ECOMM": "syscall", + "syscall.ECONNABORTED": "syscall", + "syscall.ECONNREFUSED": "syscall", + "syscall.ECONNRESET": "syscall", + "syscall.EDEADLK": "syscall", + "syscall.EDEADLOCK": "syscall", + "syscall.EDESTADDRREQ": "syscall", + "syscall.EDEVERR": "syscall", + "syscall.EDOM": "syscall", + "syscall.EDOOFUS": "syscall", + "syscall.EDOTDOT": "syscall", + "syscall.EDQUOT": "syscall", + "syscall.EEXIST": "syscall", + "syscall.EFAULT": "syscall", + "syscall.EFBIG": "syscall", + "syscall.EFER_LMA": "syscall", + "syscall.EFER_LME": "syscall", + "syscall.EFER_NXE": "syscall", + "syscall.EFER_SCE": "syscall", + "syscall.EFTYPE": "syscall", + "syscall.EHOSTDOWN": "syscall", + "syscall.EHOSTUNREACH": "syscall", + "syscall.EHWPOISON": "syscall", + "syscall.EIDRM": "syscall", + "syscall.EILSEQ": "syscall", + "syscall.EINPROGRESS": "syscall", + "syscall.EINTR": "syscall", + "syscall.EINVAL": "syscall", + "syscall.EIO": "syscall", + "syscall.EIPSEC": "syscall", + "syscall.EISCONN": "syscall", + "syscall.EISDIR": "syscall", + "syscall.EISNAM": "syscall", + "syscall.EKEYEXPIRED": "syscall", + "syscall.EKEYREJECTED": "syscall", + "syscall.EKEYREVOKED": "syscall", + "syscall.EL2HLT": "syscall", + "syscall.EL2NSYNC": "syscall", + "syscall.EL3HLT": "syscall", + "syscall.EL3RST": "syscall", + "syscall.ELAST": "syscall", + "syscall.ELF_NGREG": "syscall", + "syscall.ELF_PRARGSZ": "syscall", + "syscall.ELIBACC": "syscall", + "syscall.ELIBBAD": "syscall", + "syscall.ELIBEXEC": "syscall", + "syscall.ELIBMAX": "syscall", + "syscall.ELIBSCN": "syscall", + "syscall.ELNRNG": "syscall", + "syscall.ELOOP": "syscall", + "syscall.EMEDIUMTYPE": "syscall", + "syscall.EMFILE": "syscall", + "syscall.EMLINK": "syscall", + "syscall.EMSGSIZE": "syscall", + "syscall.EMT_TAGOVF": "syscall", + "syscall.EMULTIHOP": "syscall", + "syscall.EMUL_ENABLED": "syscall", + "syscall.EMUL_LINUX": "syscall", + "syscall.EMUL_LINUX32": "syscall", + "syscall.EMUL_MAXID": "syscall", + "syscall.EMUL_NATIVE": "syscall", + "syscall.ENAMETOOLONG": "syscall", + "syscall.ENAVAIL": "syscall", + "syscall.ENDRUNDISC": "syscall", + "syscall.ENEEDAUTH": "syscall", + "syscall.ENETDOWN": "syscall", + "syscall.ENETRESET": "syscall", + "syscall.ENETUNREACH": "syscall", + "syscall.ENFILE": "syscall", + "syscall.ENOANO": "syscall", + "syscall.ENOATTR": "syscall", + "syscall.ENOBUFS": "syscall", + "syscall.ENOCSI": "syscall", + "syscall.ENODATA": "syscall", + "syscall.ENODEV": "syscall", + "syscall.ENOENT": "syscall", + "syscall.ENOEXEC": "syscall", + "syscall.ENOKEY": "syscall", + "syscall.ENOLCK": "syscall", + "syscall.ENOLINK": "syscall", + "syscall.ENOMEDIUM": "syscall", + "syscall.ENOMEM": "syscall", + "syscall.ENOMSG": "syscall", + "syscall.ENONET": "syscall", + "syscall.ENOPKG": "syscall", + "syscall.ENOPOLICY": "syscall", + "syscall.ENOPROTOOPT": "syscall", + "syscall.ENOSPC": "syscall", + "syscall.ENOSR": "syscall", + "syscall.ENOSTR": "syscall", + "syscall.ENOSYS": "syscall", + "syscall.ENOTBLK": "syscall", + "syscall.ENOTCAPABLE": "syscall", + "syscall.ENOTCONN": "syscall", + "syscall.ENOTDIR": "syscall", + "syscall.ENOTEMPTY": "syscall", + "syscall.ENOTNAM": "syscall", + "syscall.ENOTRECOVERABLE": "syscall", + "syscall.ENOTSOCK": "syscall", + "syscall.ENOTSUP": "syscall", + "syscall.ENOTTY": "syscall", + "syscall.ENOTUNIQ": "syscall", + "syscall.ENXIO": "syscall", + "syscall.EN_SW_CTL_INF": "syscall", + "syscall.EN_SW_CTL_PREC": "syscall", + "syscall.EN_SW_CTL_ROUND": "syscall", + "syscall.EN_SW_DATACHAIN": "syscall", + "syscall.EN_SW_DENORM": "syscall", + "syscall.EN_SW_INVOP": "syscall", + "syscall.EN_SW_OVERFLOW": "syscall", + "syscall.EN_SW_PRECLOSS": "syscall", + "syscall.EN_SW_UNDERFLOW": "syscall", + "syscall.EN_SW_ZERODIV": "syscall", + "syscall.EOPNOTSUPP": "syscall", + "syscall.EOVERFLOW": "syscall", + "syscall.EOWNERDEAD": "syscall", + "syscall.EPERM": "syscall", + "syscall.EPFNOSUPPORT": "syscall", + "syscall.EPIPE": "syscall", + "syscall.EPOLLERR": "syscall", + "syscall.EPOLLET": "syscall", + "syscall.EPOLLHUP": "syscall", + "syscall.EPOLLIN": "syscall", + "syscall.EPOLLMSG": "syscall", + "syscall.EPOLLONESHOT": "syscall", + "syscall.EPOLLOUT": "syscall", + "syscall.EPOLLPRI": "syscall", + "syscall.EPOLLRDBAND": "syscall", + "syscall.EPOLLRDHUP": "syscall", + "syscall.EPOLLRDNORM": "syscall", + "syscall.EPOLLWRBAND": "syscall", + "syscall.EPOLLWRNORM": "syscall", + "syscall.EPOLL_CLOEXEC": "syscall", + "syscall.EPOLL_CTL_ADD": "syscall", + "syscall.EPOLL_CTL_DEL": "syscall", + "syscall.EPOLL_CTL_MOD": "syscall", + "syscall.EPOLL_NONBLOCK": "syscall", + "syscall.EPROCLIM": "syscall", + "syscall.EPROCUNAVAIL": "syscall", + "syscall.EPROGMISMATCH": "syscall", + "syscall.EPROGUNAVAIL": "syscall", + "syscall.EPROTO": "syscall", + "syscall.EPROTONOSUPPORT": "syscall", + "syscall.EPROTOTYPE": "syscall", + "syscall.EPWROFF": "syscall", + "syscall.ERANGE": "syscall", + "syscall.EREMCHG": "syscall", + "syscall.EREMOTE": "syscall", + "syscall.EREMOTEIO": "syscall", + "syscall.ERESTART": "syscall", + "syscall.ERFKILL": "syscall", + "syscall.EROFS": "syscall", + "syscall.ERPCMISMATCH": "syscall", + "syscall.ERROR_ACCESS_DENIED": "syscall", + "syscall.ERROR_ALREADY_EXISTS": "syscall", + "syscall.ERROR_BROKEN_PIPE": "syscall", + "syscall.ERROR_BUFFER_OVERFLOW": "syscall", + "syscall.ERROR_ENVVAR_NOT_FOUND": "syscall", + "syscall.ERROR_FILE_EXISTS": "syscall", + "syscall.ERROR_FILE_NOT_FOUND": "syscall", + "syscall.ERROR_HANDLE_EOF": "syscall", + "syscall.ERROR_INSUFFICIENT_BUFFER": "syscall", + "syscall.ERROR_IO_PENDING": "syscall", + "syscall.ERROR_MOD_NOT_FOUND": "syscall", + "syscall.ERROR_MORE_DATA": "syscall", + "syscall.ERROR_NETNAME_DELETED": "syscall", + "syscall.ERROR_NOT_FOUND": "syscall", + "syscall.ERROR_NO_MORE_FILES": "syscall", + "syscall.ERROR_OPERATION_ABORTED": "syscall", + "syscall.ERROR_PATH_NOT_FOUND": "syscall", + "syscall.ERROR_PRIVILEGE_NOT_HELD": "syscall", + "syscall.ERROR_PROC_NOT_FOUND": "syscall", + "syscall.ESHLIBVERS": "syscall", + "syscall.ESHUTDOWN": "syscall", + "syscall.ESOCKTNOSUPPORT": "syscall", + "syscall.ESPIPE": "syscall", + "syscall.ESRCH": "syscall", + "syscall.ESRMNT": "syscall", + "syscall.ESTALE": "syscall", + "syscall.ESTRPIPE": "syscall", + "syscall.ETHERCAP_JUMBO_MTU": "syscall", + "syscall.ETHERCAP_VLAN_HWTAGGING": "syscall", + "syscall.ETHERCAP_VLAN_MTU": "syscall", + "syscall.ETHERMIN": "syscall", + "syscall.ETHERMTU": "syscall", + "syscall.ETHERMTU_JUMBO": "syscall", + "syscall.ETHERTYPE_8023": "syscall", + "syscall.ETHERTYPE_AARP": "syscall", + "syscall.ETHERTYPE_ACCTON": "syscall", + "syscall.ETHERTYPE_AEONIC": "syscall", + "syscall.ETHERTYPE_ALPHA": "syscall", + "syscall.ETHERTYPE_AMBER": "syscall", + "syscall.ETHERTYPE_AMOEBA": "syscall", + "syscall.ETHERTYPE_AOE": "syscall", + "syscall.ETHERTYPE_APOLLO": "syscall", + "syscall.ETHERTYPE_APOLLODOMAIN": "syscall", + "syscall.ETHERTYPE_APPLETALK": "syscall", + "syscall.ETHERTYPE_APPLITEK": "syscall", + "syscall.ETHERTYPE_ARGONAUT": "syscall", + "syscall.ETHERTYPE_ARP": "syscall", + "syscall.ETHERTYPE_AT": "syscall", + "syscall.ETHERTYPE_ATALK": "syscall", + "syscall.ETHERTYPE_ATOMIC": "syscall", + "syscall.ETHERTYPE_ATT": "syscall", + "syscall.ETHERTYPE_ATTSTANFORD": "syscall", + "syscall.ETHERTYPE_AUTOPHON": "syscall", + "syscall.ETHERTYPE_AXIS": "syscall", + "syscall.ETHERTYPE_BCLOOP": "syscall", + "syscall.ETHERTYPE_BOFL": "syscall", + "syscall.ETHERTYPE_CABLETRON": "syscall", + "syscall.ETHERTYPE_CHAOS": "syscall", + "syscall.ETHERTYPE_COMDESIGN": "syscall", + "syscall.ETHERTYPE_COMPUGRAPHIC": "syscall", + "syscall.ETHERTYPE_COUNTERPOINT": "syscall", + "syscall.ETHERTYPE_CRONUS": "syscall", + "syscall.ETHERTYPE_CRONUSVLN": "syscall", + "syscall.ETHERTYPE_DCA": "syscall", + "syscall.ETHERTYPE_DDE": "syscall", + "syscall.ETHERTYPE_DEBNI": "syscall", + "syscall.ETHERTYPE_DECAM": "syscall", + "syscall.ETHERTYPE_DECCUST": "syscall", + "syscall.ETHERTYPE_DECDIAG": "syscall", + "syscall.ETHERTYPE_DECDNS": "syscall", + "syscall.ETHERTYPE_DECDTS": "syscall", + "syscall.ETHERTYPE_DECEXPER": "syscall", + "syscall.ETHERTYPE_DECLAST": "syscall", + "syscall.ETHERTYPE_DECLTM": "syscall", + "syscall.ETHERTYPE_DECMUMPS": "syscall", + "syscall.ETHERTYPE_DECNETBIOS": "syscall", + "syscall.ETHERTYPE_DELTACON": "syscall", + "syscall.ETHERTYPE_DIDDLE": "syscall", + "syscall.ETHERTYPE_DLOG1": "syscall", + "syscall.ETHERTYPE_DLOG2": "syscall", + "syscall.ETHERTYPE_DN": "syscall", + "syscall.ETHERTYPE_DOGFIGHT": "syscall", + "syscall.ETHERTYPE_DSMD": "syscall", + "syscall.ETHERTYPE_ECMA": "syscall", + "syscall.ETHERTYPE_ENCRYPT": "syscall", + "syscall.ETHERTYPE_ES": "syscall", + "syscall.ETHERTYPE_EXCELAN": "syscall", + "syscall.ETHERTYPE_EXPERDATA": "syscall", + "syscall.ETHERTYPE_FLIP": "syscall", + "syscall.ETHERTYPE_FLOWCONTROL": "syscall", + "syscall.ETHERTYPE_FRARP": "syscall", + "syscall.ETHERTYPE_GENDYN": "syscall", + "syscall.ETHERTYPE_HAYES": "syscall", + "syscall.ETHERTYPE_HIPPI_FP": "syscall", + "syscall.ETHERTYPE_HITACHI": "syscall", + "syscall.ETHERTYPE_HP": "syscall", + "syscall.ETHERTYPE_IEEEPUP": "syscall", + "syscall.ETHERTYPE_IEEEPUPAT": "syscall", + "syscall.ETHERTYPE_IMLBL": "syscall", + "syscall.ETHERTYPE_IMLBLDIAG": "syscall", + "syscall.ETHERTYPE_IP": "syscall", + "syscall.ETHERTYPE_IPAS": "syscall", + "syscall.ETHERTYPE_IPV6": "syscall", + "syscall.ETHERTYPE_IPX": "syscall", + "syscall.ETHERTYPE_IPXNEW": "syscall", + "syscall.ETHERTYPE_KALPANA": "syscall", + "syscall.ETHERTYPE_LANBRIDGE": "syscall", + "syscall.ETHERTYPE_LANPROBE": "syscall", + "syscall.ETHERTYPE_LAT": "syscall", + "syscall.ETHERTYPE_LBACK": "syscall", + "syscall.ETHERTYPE_LITTLE": "syscall", + "syscall.ETHERTYPE_LLDP": "syscall", + "syscall.ETHERTYPE_LOGICRAFT": "syscall", + "syscall.ETHERTYPE_LOOPBACK": "syscall", + "syscall.ETHERTYPE_MATRA": "syscall", + "syscall.ETHERTYPE_MAX": "syscall", + "syscall.ETHERTYPE_MERIT": "syscall", + "syscall.ETHERTYPE_MICP": "syscall", + "syscall.ETHERTYPE_MOPDL": "syscall", + "syscall.ETHERTYPE_MOPRC": "syscall", + "syscall.ETHERTYPE_MOTOROLA": "syscall", + "syscall.ETHERTYPE_MPLS": "syscall", + "syscall.ETHERTYPE_MPLS_MCAST": "syscall", + "syscall.ETHERTYPE_MUMPS": "syscall", + "syscall.ETHERTYPE_NBPCC": "syscall", + "syscall.ETHERTYPE_NBPCLAIM": "syscall", + "syscall.ETHERTYPE_NBPCLREQ": "syscall", + "syscall.ETHERTYPE_NBPCLRSP": "syscall", + "syscall.ETHERTYPE_NBPCREQ": "syscall", + "syscall.ETHERTYPE_NBPCRSP": "syscall", + "syscall.ETHERTYPE_NBPDG": "syscall", + "syscall.ETHERTYPE_NBPDGB": "syscall", + "syscall.ETHERTYPE_NBPDLTE": "syscall", + "syscall.ETHERTYPE_NBPRAR": "syscall", + "syscall.ETHERTYPE_NBPRAS": "syscall", + "syscall.ETHERTYPE_NBPRST": "syscall", + "syscall.ETHERTYPE_NBPSCD": "syscall", + "syscall.ETHERTYPE_NBPVCD": "syscall", + "syscall.ETHERTYPE_NBS": "syscall", + "syscall.ETHERTYPE_NCD": "syscall", + "syscall.ETHERTYPE_NESTAR": "syscall", + "syscall.ETHERTYPE_NETBEUI": "syscall", + "syscall.ETHERTYPE_NOVELL": "syscall", + "syscall.ETHERTYPE_NS": "syscall", + "syscall.ETHERTYPE_NSAT": "syscall", + "syscall.ETHERTYPE_NSCOMPAT": "syscall", + "syscall.ETHERTYPE_NTRAILER": "syscall", + "syscall.ETHERTYPE_OS9": "syscall", + "syscall.ETHERTYPE_OS9NET": "syscall", + "syscall.ETHERTYPE_PACER": "syscall", + "syscall.ETHERTYPE_PAE": "syscall", + "syscall.ETHERTYPE_PCS": "syscall", + "syscall.ETHERTYPE_PLANNING": "syscall", + "syscall.ETHERTYPE_PPP": "syscall", + "syscall.ETHERTYPE_PPPOE": "syscall", + "syscall.ETHERTYPE_PPPOEDISC": "syscall", + "syscall.ETHERTYPE_PRIMENTS": "syscall", + "syscall.ETHERTYPE_PUP": "syscall", + "syscall.ETHERTYPE_PUPAT": "syscall", + "syscall.ETHERTYPE_QINQ": "syscall", + "syscall.ETHERTYPE_RACAL": "syscall", + "syscall.ETHERTYPE_RATIONAL": "syscall", + "syscall.ETHERTYPE_RAWFR": "syscall", + "syscall.ETHERTYPE_RCL": "syscall", + "syscall.ETHERTYPE_RDP": "syscall", + "syscall.ETHERTYPE_RETIX": "syscall", + "syscall.ETHERTYPE_REVARP": "syscall", + "syscall.ETHERTYPE_SCA": "syscall", + "syscall.ETHERTYPE_SECTRA": "syscall", + "syscall.ETHERTYPE_SECUREDATA": "syscall", + "syscall.ETHERTYPE_SGITW": "syscall", + "syscall.ETHERTYPE_SG_BOUNCE": "syscall", + "syscall.ETHERTYPE_SG_DIAG": "syscall", + "syscall.ETHERTYPE_SG_NETGAMES": "syscall", + "syscall.ETHERTYPE_SG_RESV": "syscall", + "syscall.ETHERTYPE_SIMNET": "syscall", + "syscall.ETHERTYPE_SLOW": "syscall", + "syscall.ETHERTYPE_SLOWPROTOCOLS": "syscall", + "syscall.ETHERTYPE_SNA": "syscall", + "syscall.ETHERTYPE_SNMP": "syscall", + "syscall.ETHERTYPE_SONIX": "syscall", + "syscall.ETHERTYPE_SPIDER": "syscall", + "syscall.ETHERTYPE_SPRITE": "syscall", + "syscall.ETHERTYPE_STP": "syscall", + "syscall.ETHERTYPE_TALARIS": "syscall", + "syscall.ETHERTYPE_TALARISMC": "syscall", + "syscall.ETHERTYPE_TCPCOMP": "syscall", + "syscall.ETHERTYPE_TCPSM": "syscall", + "syscall.ETHERTYPE_TEC": "syscall", + "syscall.ETHERTYPE_TIGAN": "syscall", + "syscall.ETHERTYPE_TRAIL": "syscall", + "syscall.ETHERTYPE_TRANSETHER": "syscall", + "syscall.ETHERTYPE_TYMSHARE": "syscall", + "syscall.ETHERTYPE_UBBST": "syscall", + "syscall.ETHERTYPE_UBDEBUG": "syscall", + "syscall.ETHERTYPE_UBDIAGLOOP": "syscall", + "syscall.ETHERTYPE_UBDL": "syscall", + "syscall.ETHERTYPE_UBNIU": "syscall", + "syscall.ETHERTYPE_UBNMC": "syscall", + "syscall.ETHERTYPE_VALID": "syscall", + "syscall.ETHERTYPE_VARIAN": "syscall", + "syscall.ETHERTYPE_VAXELN": "syscall", + "syscall.ETHERTYPE_VEECO": "syscall", + "syscall.ETHERTYPE_VEXP": "syscall", + "syscall.ETHERTYPE_VGLAB": "syscall", + "syscall.ETHERTYPE_VINES": "syscall", + "syscall.ETHERTYPE_VINESECHO": "syscall", + "syscall.ETHERTYPE_VINESLOOP": "syscall", + "syscall.ETHERTYPE_VITAL": "syscall", + "syscall.ETHERTYPE_VLAN": "syscall", + "syscall.ETHERTYPE_VLTLMAN": "syscall", + "syscall.ETHERTYPE_VPROD": "syscall", + "syscall.ETHERTYPE_VURESERVED": "syscall", + "syscall.ETHERTYPE_WATERLOO": "syscall", + "syscall.ETHERTYPE_WELLFLEET": "syscall", + "syscall.ETHERTYPE_X25": "syscall", + "syscall.ETHERTYPE_X75": "syscall", + "syscall.ETHERTYPE_XNSSM": "syscall", + "syscall.ETHERTYPE_XTP": "syscall", + "syscall.ETHER_ADDR_LEN": "syscall", + "syscall.ETHER_ALIGN": "syscall", + "syscall.ETHER_CRC_LEN": "syscall", + "syscall.ETHER_CRC_POLY_BE": "syscall", + "syscall.ETHER_CRC_POLY_LE": "syscall", + "syscall.ETHER_HDR_LEN": "syscall", + "syscall.ETHER_MAX_DIX_LEN": "syscall", + "syscall.ETHER_MAX_LEN": "syscall", + "syscall.ETHER_MAX_LEN_JUMBO": "syscall", + "syscall.ETHER_MIN_LEN": "syscall", + "syscall.ETHER_PPPOE_ENCAP_LEN": "syscall", + "syscall.ETHER_TYPE_LEN": "syscall", + "syscall.ETHER_VLAN_ENCAP_LEN": "syscall", + "syscall.ETH_P_1588": "syscall", + "syscall.ETH_P_8021Q": "syscall", + "syscall.ETH_P_802_2": "syscall", + "syscall.ETH_P_802_3": "syscall", + "syscall.ETH_P_AARP": "syscall", + "syscall.ETH_P_ALL": "syscall", + "syscall.ETH_P_AOE": "syscall", + "syscall.ETH_P_ARCNET": "syscall", + "syscall.ETH_P_ARP": "syscall", + "syscall.ETH_P_ATALK": "syscall", + "syscall.ETH_P_ATMFATE": "syscall", + "syscall.ETH_P_ATMMPOA": "syscall", + "syscall.ETH_P_AX25": "syscall", + "syscall.ETH_P_BPQ": "syscall", + "syscall.ETH_P_CAIF": "syscall", + "syscall.ETH_P_CAN": "syscall", + "syscall.ETH_P_CONTROL": "syscall", + "syscall.ETH_P_CUST": "syscall", + "syscall.ETH_P_DDCMP": "syscall", + "syscall.ETH_P_DEC": "syscall", + "syscall.ETH_P_DIAG": "syscall", + "syscall.ETH_P_DNA_DL": "syscall", + "syscall.ETH_P_DNA_RC": "syscall", + "syscall.ETH_P_DNA_RT": "syscall", + "syscall.ETH_P_DSA": "syscall", + "syscall.ETH_P_ECONET": "syscall", + "syscall.ETH_P_EDSA": "syscall", + "syscall.ETH_P_FCOE": "syscall", + "syscall.ETH_P_FIP": "syscall", + "syscall.ETH_P_HDLC": "syscall", + "syscall.ETH_P_IEEE802154": "syscall", + "syscall.ETH_P_IEEEPUP": "syscall", + "syscall.ETH_P_IEEEPUPAT": "syscall", + "syscall.ETH_P_IP": "syscall", + "syscall.ETH_P_IPV6": "syscall", + "syscall.ETH_P_IPX": "syscall", + "syscall.ETH_P_IRDA": "syscall", + "syscall.ETH_P_LAT": "syscall", + "syscall.ETH_P_LINK_CTL": "syscall", + "syscall.ETH_P_LOCALTALK": "syscall", + "syscall.ETH_P_LOOP": "syscall", + "syscall.ETH_P_MOBITEX": "syscall", + "syscall.ETH_P_MPLS_MC": "syscall", + "syscall.ETH_P_MPLS_UC": "syscall", + "syscall.ETH_P_PAE": "syscall", + "syscall.ETH_P_PAUSE": "syscall", + "syscall.ETH_P_PHONET": "syscall", + "syscall.ETH_P_PPPTALK": "syscall", + "syscall.ETH_P_PPP_DISC": "syscall", + "syscall.ETH_P_PPP_MP": "syscall", + "syscall.ETH_P_PPP_SES": "syscall", + "syscall.ETH_P_PUP": "syscall", + "syscall.ETH_P_PUPAT": "syscall", + "syscall.ETH_P_RARP": "syscall", + "syscall.ETH_P_SCA": "syscall", + "syscall.ETH_P_SLOW": "syscall", + "syscall.ETH_P_SNAP": "syscall", + "syscall.ETH_P_TEB": "syscall", + "syscall.ETH_P_TIPC": "syscall", + "syscall.ETH_P_TRAILER": "syscall", + "syscall.ETH_P_TR_802_2": "syscall", + "syscall.ETH_P_WAN_PPP": "syscall", + "syscall.ETH_P_WCCP": "syscall", + "syscall.ETH_P_X25": "syscall", + "syscall.ETIME": "syscall", + "syscall.ETIMEDOUT": "syscall", + "syscall.ETOOMANYREFS": "syscall", + "syscall.ETXTBSY": "syscall", + "syscall.EUCLEAN": "syscall", + "syscall.EUNATCH": "syscall", + "syscall.EUSERS": "syscall", + "syscall.EVFILT_AIO": "syscall", + "syscall.EVFILT_FS": "syscall", + "syscall.EVFILT_LIO": "syscall", + "syscall.EVFILT_MACHPORT": "syscall", + "syscall.EVFILT_PROC": "syscall", + "syscall.EVFILT_READ": "syscall", + "syscall.EVFILT_SIGNAL": "syscall", + "syscall.EVFILT_SYSCOUNT": "syscall", + "syscall.EVFILT_THREADMARKER": "syscall", + "syscall.EVFILT_TIMER": "syscall", + "syscall.EVFILT_USER": "syscall", + "syscall.EVFILT_VM": "syscall", + "syscall.EVFILT_VNODE": "syscall", + "syscall.EVFILT_WRITE": "syscall", + "syscall.EV_ADD": "syscall", + "syscall.EV_CLEAR": "syscall", + "syscall.EV_DELETE": "syscall", + "syscall.EV_DISABLE": "syscall", + "syscall.EV_DISPATCH": "syscall", + "syscall.EV_DROP": "syscall", + "syscall.EV_ENABLE": "syscall", + "syscall.EV_EOF": "syscall", + "syscall.EV_ERROR": "syscall", + "syscall.EV_FLAG0": "syscall", + "syscall.EV_FLAG1": "syscall", + "syscall.EV_ONESHOT": "syscall", + "syscall.EV_OOBAND": "syscall", + "syscall.EV_POLL": "syscall", + "syscall.EV_RECEIPT": "syscall", + "syscall.EV_SYSFLAGS": "syscall", + "syscall.EWINDOWS": "syscall", + "syscall.EWOULDBLOCK": "syscall", + "syscall.EXDEV": "syscall", + "syscall.EXFULL": "syscall", + "syscall.EXTA": "syscall", + "syscall.EXTB": "syscall", + "syscall.EXTPROC": "syscall", + "syscall.Environ": "syscall", + "syscall.EpollCreate": "syscall", + "syscall.EpollCreate1": "syscall", + "syscall.EpollCtl": "syscall", + "syscall.EpollEvent": "syscall", + "syscall.EpollWait": "syscall", + "syscall.Errno": "syscall", + "syscall.EscapeArg": "syscall", + "syscall.Exchangedata": "syscall", + "syscall.Exec": "syscall", + "syscall.Exit": "syscall", + "syscall.ExitProcess": "syscall", + "syscall.FD_CLOEXEC": "syscall", + "syscall.FD_SETSIZE": "syscall", + "syscall.FILE_ACTION_ADDED": "syscall", + "syscall.FILE_ACTION_MODIFIED": "syscall", + "syscall.FILE_ACTION_REMOVED": "syscall", + "syscall.FILE_ACTION_RENAMED_NEW_NAME": "syscall", + "syscall.FILE_ACTION_RENAMED_OLD_NAME": "syscall", + "syscall.FILE_APPEND_DATA": "syscall", + "syscall.FILE_ATTRIBUTE_ARCHIVE": "syscall", + "syscall.FILE_ATTRIBUTE_DIRECTORY": "syscall", + "syscall.FILE_ATTRIBUTE_HIDDEN": "syscall", + "syscall.FILE_ATTRIBUTE_NORMAL": "syscall", + "syscall.FILE_ATTRIBUTE_READONLY": "syscall", + "syscall.FILE_ATTRIBUTE_REPARSE_POINT": "syscall", + "syscall.FILE_ATTRIBUTE_SYSTEM": "syscall", + "syscall.FILE_BEGIN": "syscall", + "syscall.FILE_CURRENT": "syscall", + "syscall.FILE_END": "syscall", + "syscall.FILE_FLAG_BACKUP_SEMANTICS": "syscall", + "syscall.FILE_FLAG_OPEN_REPARSE_POINT": "syscall", + "syscall.FILE_FLAG_OVERLAPPED": "syscall", + "syscall.FILE_LIST_DIRECTORY": "syscall", + "syscall.FILE_MAP_COPY": "syscall", + "syscall.FILE_MAP_EXECUTE": "syscall", + "syscall.FILE_MAP_READ": "syscall", + "syscall.FILE_MAP_WRITE": "syscall", + "syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES": "syscall", + "syscall.FILE_NOTIFY_CHANGE_CREATION": "syscall", + "syscall.FILE_NOTIFY_CHANGE_DIR_NAME": "syscall", + "syscall.FILE_NOTIFY_CHANGE_FILE_NAME": "syscall", + "syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS": "syscall", + "syscall.FILE_NOTIFY_CHANGE_LAST_WRITE": "syscall", + "syscall.FILE_NOTIFY_CHANGE_SIZE": "syscall", + "syscall.FILE_SHARE_DELETE": "syscall", + "syscall.FILE_SHARE_READ": "syscall", + "syscall.FILE_SHARE_WRITE": "syscall", + "syscall.FILE_SKIP_COMPLETION_PORT_ON_SUCCESS": "syscall", + "syscall.FILE_SKIP_SET_EVENT_ON_HANDLE": "syscall", + "syscall.FILE_TYPE_CHAR": "syscall", + "syscall.FILE_TYPE_DISK": "syscall", + "syscall.FILE_TYPE_PIPE": "syscall", + "syscall.FILE_TYPE_REMOTE": "syscall", + "syscall.FILE_TYPE_UNKNOWN": "syscall", + "syscall.FILE_WRITE_ATTRIBUTES": "syscall", + "syscall.FLUSHO": "syscall", + "syscall.FORMAT_MESSAGE_ALLOCATE_BUFFER": "syscall", + "syscall.FORMAT_MESSAGE_ARGUMENT_ARRAY": "syscall", + "syscall.FORMAT_MESSAGE_FROM_HMODULE": "syscall", + "syscall.FORMAT_MESSAGE_FROM_STRING": "syscall", + "syscall.FORMAT_MESSAGE_FROM_SYSTEM": "syscall", + "syscall.FORMAT_MESSAGE_IGNORE_INSERTS": "syscall", + "syscall.FORMAT_MESSAGE_MAX_WIDTH_MASK": "syscall", + "syscall.FSCTL_GET_REPARSE_POINT": "syscall", + "syscall.F_ADDFILESIGS": "syscall", + "syscall.F_ADDSIGS": "syscall", + "syscall.F_ALLOCATEALL": "syscall", + "syscall.F_ALLOCATECONTIG": "syscall", + "syscall.F_CANCEL": "syscall", + "syscall.F_CHKCLEAN": "syscall", + "syscall.F_CLOSEM": "syscall", + "syscall.F_DUP2FD": "syscall", + "syscall.F_DUP2FD_CLOEXEC": "syscall", + "syscall.F_DUPFD": "syscall", + "syscall.F_DUPFD_CLOEXEC": "syscall", + "syscall.F_EXLCK": "syscall", + "syscall.F_FLUSH_DATA": "syscall", + "syscall.F_FREEZE_FS": "syscall", + "syscall.F_FSCTL": "syscall", + "syscall.F_FSDIRMASK": "syscall", + "syscall.F_FSIN": "syscall", + "syscall.F_FSINOUT": "syscall", + "syscall.F_FSOUT": "syscall", + "syscall.F_FSPRIV": "syscall", + "syscall.F_FSVOID": "syscall", + "syscall.F_FULLFSYNC": "syscall", + "syscall.F_GETFD": "syscall", + "syscall.F_GETFL": "syscall", + "syscall.F_GETLEASE": "syscall", + "syscall.F_GETLK": "syscall", + "syscall.F_GETLK64": "syscall", + "syscall.F_GETLKPID": "syscall", + "syscall.F_GETNOSIGPIPE": "syscall", + "syscall.F_GETOWN": "syscall", + "syscall.F_GETOWN_EX": "syscall", + "syscall.F_GETPATH": "syscall", + "syscall.F_GETPATH_MTMINFO": "syscall", + "syscall.F_GETPIPE_SZ": "syscall", + "syscall.F_GETPROTECTIONCLASS": "syscall", + "syscall.F_GETSIG": "syscall", + "syscall.F_GLOBAL_NOCACHE": "syscall", + "syscall.F_LOCK": "syscall", + "syscall.F_LOG2PHYS": "syscall", + "syscall.F_LOG2PHYS_EXT": "syscall", + "syscall.F_MARKDEPENDENCY": "syscall", + "syscall.F_MAXFD": "syscall", + "syscall.F_NOCACHE": "syscall", + "syscall.F_NODIRECT": "syscall", + "syscall.F_NOTIFY": "syscall", + "syscall.F_OGETLK": "syscall", + "syscall.F_OK": "syscall", + "syscall.F_OSETLK": "syscall", + "syscall.F_OSETLKW": "syscall", + "syscall.F_PARAM_MASK": "syscall", + "syscall.F_PARAM_MAX": "syscall", + "syscall.F_PATHPKG_CHECK": "syscall", + "syscall.F_PEOFPOSMODE": "syscall", + "syscall.F_PREALLOCATE": "syscall", + "syscall.F_RDADVISE": "syscall", + "syscall.F_RDAHEAD": "syscall", + "syscall.F_RDLCK": "syscall", + "syscall.F_READAHEAD": "syscall", + "syscall.F_READBOOTSTRAP": "syscall", + "syscall.F_SETBACKINGSTORE": "syscall", + "syscall.F_SETFD": "syscall", + "syscall.F_SETFL": "syscall", + "syscall.F_SETLEASE": "syscall", + "syscall.F_SETLK": "syscall", + "syscall.F_SETLK64": "syscall", + "syscall.F_SETLKW": "syscall", + "syscall.F_SETLKW64": "syscall", + "syscall.F_SETLK_REMOTE": "syscall", + "syscall.F_SETNOSIGPIPE": "syscall", + "syscall.F_SETOWN": "syscall", + "syscall.F_SETOWN_EX": "syscall", + "syscall.F_SETPIPE_SZ": "syscall", + "syscall.F_SETPROTECTIONCLASS": "syscall", + "syscall.F_SETSIG": "syscall", + "syscall.F_SETSIZE": "syscall", + "syscall.F_SHLCK": "syscall", + "syscall.F_TEST": "syscall", + "syscall.F_THAW_FS": "syscall", + "syscall.F_TLOCK": "syscall", + "syscall.F_ULOCK": "syscall", + "syscall.F_UNLCK": "syscall", + "syscall.F_UNLCKSYS": "syscall", + "syscall.F_VOLPOSMODE": "syscall", + "syscall.F_WRITEBOOTSTRAP": "syscall", + "syscall.F_WRLCK": "syscall", + "syscall.Faccessat": "syscall", + "syscall.Fallocate": "syscall", + "syscall.Fbootstraptransfer_t": "syscall", + "syscall.Fchdir": "syscall", + "syscall.Fchflags": "syscall", + "syscall.Fchmod": "syscall", + "syscall.Fchmodat": "syscall", + "syscall.Fchown": "syscall", + "syscall.Fchownat": "syscall", + "syscall.FcntlFlock": "syscall", + "syscall.FdSet": "syscall", + "syscall.Fdatasync": "syscall", + "syscall.FileNotifyInformation": "syscall", + "syscall.Filetime": "syscall", + "syscall.FindClose": "syscall", + "syscall.FindFirstFile": "syscall", + "syscall.FindNextFile": "syscall", + "syscall.Flock": "syscall", + "syscall.Flock_t": "syscall", + "syscall.FlushBpf": "syscall", + "syscall.FlushFileBuffers": "syscall", + "syscall.FlushViewOfFile": "syscall", + "syscall.ForkExec": "syscall", + "syscall.ForkLock": "syscall", + "syscall.FormatMessage": "syscall", + "syscall.Fpathconf": "syscall", + "syscall.FreeAddrInfoW": "syscall", + "syscall.FreeEnvironmentStrings": "syscall", + "syscall.FreeLibrary": "syscall", + "syscall.Fsid": "syscall", + "syscall.Fstat": "syscall", + "syscall.Fstatfs": "syscall", + "syscall.Fstore_t": "syscall", + "syscall.Fsync": "syscall", + "syscall.Ftruncate": "syscall", + "syscall.FullPath": "syscall", + "syscall.Futimes": "syscall", + "syscall.Futimesat": "syscall", + "syscall.GENERIC_ALL": "syscall", + "syscall.GENERIC_EXECUTE": "syscall", + "syscall.GENERIC_READ": "syscall", + "syscall.GENERIC_WRITE": "syscall", + "syscall.GUID": "syscall", + "syscall.GetAcceptExSockaddrs": "syscall", + "syscall.GetAdaptersInfo": "syscall", + "syscall.GetAddrInfoW": "syscall", + "syscall.GetCommandLine": "syscall", + "syscall.GetComputerName": "syscall", + "syscall.GetConsoleMode": "syscall", + "syscall.GetCurrentDirectory": "syscall", + "syscall.GetCurrentProcess": "syscall", + "syscall.GetEnvironmentStrings": "syscall", + "syscall.GetEnvironmentVariable": "syscall", + "syscall.GetExitCodeProcess": "syscall", + "syscall.GetFileAttributes": "syscall", + "syscall.GetFileAttributesEx": "syscall", + "syscall.GetFileExInfoStandard": "syscall", + "syscall.GetFileExMaxInfoLevel": "syscall", + "syscall.GetFileInformationByHandle": "syscall", + "syscall.GetFileType": "syscall", + "syscall.GetFullPathName": "syscall", + "syscall.GetHostByName": "syscall", + "syscall.GetIfEntry": "syscall", + "syscall.GetLastError": "syscall", + "syscall.GetLengthSid": "syscall", + "syscall.GetLongPathName": "syscall", + "syscall.GetProcAddress": "syscall", + "syscall.GetProcessTimes": "syscall", + "syscall.GetProtoByName": "syscall", + "syscall.GetQueuedCompletionStatus": "syscall", + "syscall.GetServByName": "syscall", + "syscall.GetShortPathName": "syscall", + "syscall.GetStartupInfo": "syscall", + "syscall.GetStdHandle": "syscall", + "syscall.GetSystemTimeAsFileTime": "syscall", + "syscall.GetTempPath": "syscall", + "syscall.GetTimeZoneInformation": "syscall", + "syscall.GetTokenInformation": "syscall", + "syscall.GetUserNameEx": "syscall", + "syscall.GetUserProfileDirectory": "syscall", + "syscall.GetVersion": "syscall", + "syscall.Getcwd": "syscall", + "syscall.Getdents": "syscall", + "syscall.Getdirentries": "syscall", + "syscall.Getdtablesize": "syscall", + "syscall.Getegid": "syscall", + "syscall.Getenv": "syscall", + "syscall.Geteuid": "syscall", + "syscall.Getfsstat": "syscall", + "syscall.Getgid": "syscall", + "syscall.Getgroups": "syscall", + "syscall.Getpagesize": "syscall", + "syscall.Getpeername": "syscall", + "syscall.Getpgid": "syscall", + "syscall.Getpgrp": "syscall", + "syscall.Getpid": "syscall", + "syscall.Getppid": "syscall", + "syscall.Getpriority": "syscall", + "syscall.Getrlimit": "syscall", + "syscall.Getrusage": "syscall", + "syscall.Getsid": "syscall", + "syscall.Getsockname": "syscall", + "syscall.Getsockopt": "syscall", + "syscall.GetsockoptByte": "syscall", + "syscall.GetsockoptICMPv6Filter": "syscall", + "syscall.GetsockoptIPMreq": "syscall", + "syscall.GetsockoptIPMreqn": "syscall", + "syscall.GetsockoptIPv6MTUInfo": "syscall", + "syscall.GetsockoptIPv6Mreq": "syscall", + "syscall.GetsockoptInet4Addr": "syscall", + "syscall.GetsockoptInt": "syscall", + "syscall.GetsockoptUcred": "syscall", + "syscall.Gettid": "syscall", + "syscall.Gettimeofday": "syscall", + "syscall.Getuid": "syscall", + "syscall.Getwd": "syscall", + "syscall.Getxattr": "syscall", + "syscall.HANDLE_FLAG_INHERIT": "syscall", + "syscall.HKEY_CLASSES_ROOT": "syscall", + "syscall.HKEY_CURRENT_CONFIG": "syscall", + "syscall.HKEY_CURRENT_USER": "syscall", + "syscall.HKEY_DYN_DATA": "syscall", + "syscall.HKEY_LOCAL_MACHINE": "syscall", + "syscall.HKEY_PERFORMANCE_DATA": "syscall", + "syscall.HKEY_USERS": "syscall", + "syscall.HUPCL": "syscall", + "syscall.Handle": "syscall", + "syscall.Hostent": "syscall", + "syscall.ICANON": "syscall", + "syscall.ICMP6_FILTER": "syscall", + "syscall.ICMPV6_FILTER": "syscall", + "syscall.ICMPv6Filter": "syscall", + "syscall.ICRNL": "syscall", + "syscall.IEXTEN": "syscall", + "syscall.IFAN_ARRIVAL": "syscall", + "syscall.IFAN_DEPARTURE": "syscall", + "syscall.IFA_ADDRESS": "syscall", + "syscall.IFA_ANYCAST": "syscall", + "syscall.IFA_BROADCAST": "syscall", + "syscall.IFA_CACHEINFO": "syscall", + "syscall.IFA_F_DADFAILED": "syscall", + "syscall.IFA_F_DEPRECATED": "syscall", + "syscall.IFA_F_HOMEADDRESS": "syscall", + "syscall.IFA_F_NODAD": "syscall", + "syscall.IFA_F_OPTIMISTIC": "syscall", + "syscall.IFA_F_PERMANENT": "syscall", + "syscall.IFA_F_SECONDARY": "syscall", + "syscall.IFA_F_TEMPORARY": "syscall", + "syscall.IFA_F_TENTATIVE": "syscall", + "syscall.IFA_LABEL": "syscall", + "syscall.IFA_LOCAL": "syscall", + "syscall.IFA_MAX": "syscall", + "syscall.IFA_MULTICAST": "syscall", + "syscall.IFA_ROUTE": "syscall", + "syscall.IFA_UNSPEC": "syscall", + "syscall.IFF_ALLMULTI": "syscall", + "syscall.IFF_ALTPHYS": "syscall", + "syscall.IFF_AUTOMEDIA": "syscall", + "syscall.IFF_BROADCAST": "syscall", + "syscall.IFF_CANTCHANGE": "syscall", + "syscall.IFF_CANTCONFIG": "syscall", + "syscall.IFF_DEBUG": "syscall", + "syscall.IFF_DRV_OACTIVE": "syscall", + "syscall.IFF_DRV_RUNNING": "syscall", + "syscall.IFF_DYING": "syscall", + "syscall.IFF_DYNAMIC": "syscall", + "syscall.IFF_LINK0": "syscall", + "syscall.IFF_LINK1": "syscall", + "syscall.IFF_LINK2": "syscall", + "syscall.IFF_LOOPBACK": "syscall", + "syscall.IFF_MASTER": "syscall", + "syscall.IFF_MONITOR": "syscall", + "syscall.IFF_MULTICAST": "syscall", + "syscall.IFF_NOARP": "syscall", + "syscall.IFF_NOTRAILERS": "syscall", + "syscall.IFF_NO_PI": "syscall", + "syscall.IFF_OACTIVE": "syscall", + "syscall.IFF_ONE_QUEUE": "syscall", + "syscall.IFF_POINTOPOINT": "syscall", + "syscall.IFF_POINTTOPOINT": "syscall", + "syscall.IFF_PORTSEL": "syscall", + "syscall.IFF_PPROMISC": "syscall", + "syscall.IFF_PROMISC": "syscall", + "syscall.IFF_RENAMING": "syscall", + "syscall.IFF_RUNNING": "syscall", + "syscall.IFF_SIMPLEX": "syscall", + "syscall.IFF_SLAVE": "syscall", + "syscall.IFF_SMART": "syscall", + "syscall.IFF_STATICARP": "syscall", + "syscall.IFF_TAP": "syscall", + "syscall.IFF_TUN": "syscall", + "syscall.IFF_TUN_EXCL": "syscall", + "syscall.IFF_UP": "syscall", + "syscall.IFF_VNET_HDR": "syscall", + "syscall.IFLA_ADDRESS": "syscall", + "syscall.IFLA_BROADCAST": "syscall", + "syscall.IFLA_COST": "syscall", + "syscall.IFLA_IFALIAS": "syscall", + "syscall.IFLA_IFNAME": "syscall", + "syscall.IFLA_LINK": "syscall", + "syscall.IFLA_LINKINFO": "syscall", + "syscall.IFLA_LINKMODE": "syscall", + "syscall.IFLA_MAP": "syscall", + "syscall.IFLA_MASTER": "syscall", + "syscall.IFLA_MAX": "syscall", + "syscall.IFLA_MTU": "syscall", + "syscall.IFLA_NET_NS_PID": "syscall", + "syscall.IFLA_OPERSTATE": "syscall", + "syscall.IFLA_PRIORITY": "syscall", + "syscall.IFLA_PROTINFO": "syscall", + "syscall.IFLA_QDISC": "syscall", + "syscall.IFLA_STATS": "syscall", + "syscall.IFLA_TXQLEN": "syscall", + "syscall.IFLA_UNSPEC": "syscall", + "syscall.IFLA_WEIGHT": "syscall", + "syscall.IFLA_WIRELESS": "syscall", + "syscall.IFNAMSIZ": "syscall", + "syscall.IFT_1822": "syscall", + "syscall.IFT_A12MPPSWITCH": "syscall", + "syscall.IFT_AAL2": "syscall", + "syscall.IFT_AAL5": "syscall", + "syscall.IFT_ADSL": "syscall", + "syscall.IFT_AFLANE8023": "syscall", + "syscall.IFT_AFLANE8025": "syscall", + "syscall.IFT_ARAP": "syscall", + "syscall.IFT_ARCNET": "syscall", + "syscall.IFT_ARCNETPLUS": "syscall", + "syscall.IFT_ASYNC": "syscall", + "syscall.IFT_ATM": "syscall", + "syscall.IFT_ATMDXI": "syscall", + "syscall.IFT_ATMFUNI": "syscall", + "syscall.IFT_ATMIMA": "syscall", + "syscall.IFT_ATMLOGICAL": "syscall", + "syscall.IFT_ATMRADIO": "syscall", + "syscall.IFT_ATMSUBINTERFACE": "syscall", + "syscall.IFT_ATMVCIENDPT": "syscall", + "syscall.IFT_ATMVIRTUAL": "syscall", + "syscall.IFT_BGPPOLICYACCOUNTING": "syscall", + "syscall.IFT_BLUETOOTH": "syscall", + "syscall.IFT_BRIDGE": "syscall", + "syscall.IFT_BSC": "syscall", + "syscall.IFT_CARP": "syscall", + "syscall.IFT_CCTEMUL": "syscall", + "syscall.IFT_CELLULAR": "syscall", + "syscall.IFT_CEPT": "syscall", + "syscall.IFT_CES": "syscall", + "syscall.IFT_CHANNEL": "syscall", + "syscall.IFT_CNR": "syscall", + "syscall.IFT_COFFEE": "syscall", + "syscall.IFT_COMPOSITELINK": "syscall", + "syscall.IFT_DCN": "syscall", + "syscall.IFT_DIGITALPOWERLINE": "syscall", + "syscall.IFT_DIGITALWRAPPEROVERHEADCHANNEL": "syscall", + "syscall.IFT_DLSW": "syscall", + "syscall.IFT_DOCSCABLEDOWNSTREAM": "syscall", + "syscall.IFT_DOCSCABLEMACLAYER": "syscall", + "syscall.IFT_DOCSCABLEUPSTREAM": "syscall", + "syscall.IFT_DOCSCABLEUPSTREAMCHANNEL": "syscall", + "syscall.IFT_DS0": "syscall", + "syscall.IFT_DS0BUNDLE": "syscall", + "syscall.IFT_DS1FDL": "syscall", + "syscall.IFT_DS3": "syscall", + "syscall.IFT_DTM": "syscall", + "syscall.IFT_DUMMY": "syscall", + "syscall.IFT_DVBASILN": "syscall", + "syscall.IFT_DVBASIOUT": "syscall", + "syscall.IFT_DVBRCCDOWNSTREAM": "syscall", + "syscall.IFT_DVBRCCMACLAYER": "syscall", + "syscall.IFT_DVBRCCUPSTREAM": "syscall", + "syscall.IFT_ECONET": "syscall", + "syscall.IFT_ENC": "syscall", + "syscall.IFT_EON": "syscall", + "syscall.IFT_EPLRS": "syscall", + "syscall.IFT_ESCON": "syscall", + "syscall.IFT_ETHER": "syscall", + "syscall.IFT_FAITH": "syscall", + "syscall.IFT_FAST": "syscall", + "syscall.IFT_FASTETHER": "syscall", + "syscall.IFT_FASTETHERFX": "syscall", + "syscall.IFT_FDDI": "syscall", + "syscall.IFT_FIBRECHANNEL": "syscall", + "syscall.IFT_FRAMERELAYINTERCONNECT": "syscall", + "syscall.IFT_FRAMERELAYMPI": "syscall", + "syscall.IFT_FRDLCIENDPT": "syscall", + "syscall.IFT_FRELAY": "syscall", + "syscall.IFT_FRELAYDCE": "syscall", + "syscall.IFT_FRF16MFRBUNDLE": "syscall", + "syscall.IFT_FRFORWARD": "syscall", + "syscall.IFT_G703AT2MB": "syscall", + "syscall.IFT_G703AT64K": "syscall", + "syscall.IFT_GIF": "syscall", + "syscall.IFT_GIGABITETHERNET": "syscall", + "syscall.IFT_GR303IDT": "syscall", + "syscall.IFT_GR303RDT": "syscall", + "syscall.IFT_H323GATEKEEPER": "syscall", + "syscall.IFT_H323PROXY": "syscall", + "syscall.IFT_HDH1822": "syscall", + "syscall.IFT_HDLC": "syscall", + "syscall.IFT_HDSL2": "syscall", + "syscall.IFT_HIPERLAN2": "syscall", + "syscall.IFT_HIPPI": "syscall", + "syscall.IFT_HIPPIINTERFACE": "syscall", + "syscall.IFT_HOSTPAD": "syscall", + "syscall.IFT_HSSI": "syscall", + "syscall.IFT_HY": "syscall", + "syscall.IFT_IBM370PARCHAN": "syscall", + "syscall.IFT_IDSL": "syscall", + "syscall.IFT_IEEE1394": "syscall", + "syscall.IFT_IEEE80211": "syscall", + "syscall.IFT_IEEE80212": "syscall", + "syscall.IFT_IEEE8023ADLAG": "syscall", + "syscall.IFT_IFGSN": "syscall", + "syscall.IFT_IMT": "syscall", + "syscall.IFT_INFINIBAND": "syscall", + "syscall.IFT_INTERLEAVE": "syscall", + "syscall.IFT_IP": "syscall", + "syscall.IFT_IPFORWARD": "syscall", + "syscall.IFT_IPOVERATM": "syscall", + "syscall.IFT_IPOVERCDLC": "syscall", + "syscall.IFT_IPOVERCLAW": "syscall", + "syscall.IFT_IPSWITCH": "syscall", + "syscall.IFT_IPXIP": "syscall", + "syscall.IFT_ISDN": "syscall", + "syscall.IFT_ISDNBASIC": "syscall", + "syscall.IFT_ISDNPRIMARY": "syscall", + "syscall.IFT_ISDNS": "syscall", + "syscall.IFT_ISDNU": "syscall", + "syscall.IFT_ISO88022LLC": "syscall", + "syscall.IFT_ISO88023": "syscall", + "syscall.IFT_ISO88024": "syscall", + "syscall.IFT_ISO88025": "syscall", + "syscall.IFT_ISO88025CRFPINT": "syscall", + "syscall.IFT_ISO88025DTR": "syscall", + "syscall.IFT_ISO88025FIBER": "syscall", + "syscall.IFT_ISO88026": "syscall", + "syscall.IFT_ISUP": "syscall", + "syscall.IFT_L2VLAN": "syscall", + "syscall.IFT_L3IPVLAN": "syscall", + "syscall.IFT_L3IPXVLAN": "syscall", + "syscall.IFT_LAPB": "syscall", + "syscall.IFT_LAPD": "syscall", + "syscall.IFT_LAPF": "syscall", + "syscall.IFT_LINEGROUP": "syscall", + "syscall.IFT_LOCALTALK": "syscall", + "syscall.IFT_LOOP": "syscall", + "syscall.IFT_MEDIAMAILOVERIP": "syscall", + "syscall.IFT_MFSIGLINK": "syscall", + "syscall.IFT_MIOX25": "syscall", + "syscall.IFT_MODEM": "syscall", + "syscall.IFT_MPC": "syscall", + "syscall.IFT_MPLS": "syscall", + "syscall.IFT_MPLSTUNNEL": "syscall", + "syscall.IFT_MSDSL": "syscall", + "syscall.IFT_MVL": "syscall", + "syscall.IFT_MYRINET": "syscall", + "syscall.IFT_NFAS": "syscall", + "syscall.IFT_NSIP": "syscall", + "syscall.IFT_OPTICALCHANNEL": "syscall", + "syscall.IFT_OPTICALTRANSPORT": "syscall", + "syscall.IFT_OTHER": "syscall", + "syscall.IFT_P10": "syscall", + "syscall.IFT_P80": "syscall", + "syscall.IFT_PARA": "syscall", + "syscall.IFT_PDP": "syscall", + "syscall.IFT_PFLOG": "syscall", + "syscall.IFT_PFLOW": "syscall", + "syscall.IFT_PFSYNC": "syscall", + "syscall.IFT_PLC": "syscall", + "syscall.IFT_PON155": "syscall", + "syscall.IFT_PON622": "syscall", + "syscall.IFT_POS": "syscall", + "syscall.IFT_PPP": "syscall", + "syscall.IFT_PPPMULTILINKBUNDLE": "syscall", + "syscall.IFT_PROPATM": "syscall", + "syscall.IFT_PROPBWAP2MP": "syscall", + "syscall.IFT_PROPCNLS": "syscall", + "syscall.IFT_PROPDOCSWIRELESSDOWNSTREAM": "syscall", + "syscall.IFT_PROPDOCSWIRELESSMACLAYER": "syscall", + "syscall.IFT_PROPDOCSWIRELESSUPSTREAM": "syscall", + "syscall.IFT_PROPMUX": "syscall", + "syscall.IFT_PROPVIRTUAL": "syscall", + "syscall.IFT_PROPWIRELESSP2P": "syscall", + "syscall.IFT_PTPSERIAL": "syscall", + "syscall.IFT_PVC": "syscall", + "syscall.IFT_Q2931": "syscall", + "syscall.IFT_QLLC": "syscall", + "syscall.IFT_RADIOMAC": "syscall", + "syscall.IFT_RADSL": "syscall", + "syscall.IFT_REACHDSL": "syscall", + "syscall.IFT_RFC1483": "syscall", + "syscall.IFT_RS232": "syscall", + "syscall.IFT_RSRB": "syscall", + "syscall.IFT_SDLC": "syscall", + "syscall.IFT_SDSL": "syscall", + "syscall.IFT_SHDSL": "syscall", + "syscall.IFT_SIP": "syscall", + "syscall.IFT_SIPSIG": "syscall", + "syscall.IFT_SIPTG": "syscall", + "syscall.IFT_SLIP": "syscall", + "syscall.IFT_SMDSDXI": "syscall", + "syscall.IFT_SMDSICIP": "syscall", + "syscall.IFT_SONET": "syscall", + "syscall.IFT_SONETOVERHEADCHANNEL": "syscall", + "syscall.IFT_SONETPATH": "syscall", + "syscall.IFT_SONETVT": "syscall", + "syscall.IFT_SRP": "syscall", + "syscall.IFT_SS7SIGLINK": "syscall", + "syscall.IFT_STACKTOSTACK": "syscall", + "syscall.IFT_STARLAN": "syscall", + "syscall.IFT_STF": "syscall", + "syscall.IFT_T1": "syscall", + "syscall.IFT_TDLC": "syscall", + "syscall.IFT_TELINK": "syscall", + "syscall.IFT_TERMPAD": "syscall", + "syscall.IFT_TR008": "syscall", + "syscall.IFT_TRANSPHDLC": "syscall", + "syscall.IFT_TUNNEL": "syscall", + "syscall.IFT_ULTRA": "syscall", + "syscall.IFT_USB": "syscall", + "syscall.IFT_V11": "syscall", + "syscall.IFT_V35": "syscall", + "syscall.IFT_V36": "syscall", + "syscall.IFT_V37": "syscall", + "syscall.IFT_VDSL": "syscall", + "syscall.IFT_VIRTUALIPADDRESS": "syscall", + "syscall.IFT_VIRTUALTG": "syscall", + "syscall.IFT_VOICEDID": "syscall", + "syscall.IFT_VOICEEM": "syscall", + "syscall.IFT_VOICEEMFGD": "syscall", + "syscall.IFT_VOICEENCAP": "syscall", + "syscall.IFT_VOICEFGDEANA": "syscall", + "syscall.IFT_VOICEFXO": "syscall", + "syscall.IFT_VOICEFXS": "syscall", + "syscall.IFT_VOICEOVERATM": "syscall", + "syscall.IFT_VOICEOVERCABLE": "syscall", + "syscall.IFT_VOICEOVERFRAMERELAY": "syscall", + "syscall.IFT_VOICEOVERIP": "syscall", + "syscall.IFT_X213": "syscall", + "syscall.IFT_X25": "syscall", + "syscall.IFT_X25DDN": "syscall", + "syscall.IFT_X25HUNTGROUP": "syscall", + "syscall.IFT_X25MLP": "syscall", + "syscall.IFT_X25PLE": "syscall", + "syscall.IFT_XETHER": "syscall", + "syscall.IGNBRK": "syscall", + "syscall.IGNCR": "syscall", + "syscall.IGNORE": "syscall", + "syscall.IGNPAR": "syscall", + "syscall.IMAXBEL": "syscall", + "syscall.INFINITE": "syscall", + "syscall.INLCR": "syscall", + "syscall.INPCK": "syscall", + "syscall.INVALID_FILE_ATTRIBUTES": "syscall", + "syscall.IN_ACCESS": "syscall", + "syscall.IN_ALL_EVENTS": "syscall", + "syscall.IN_ATTRIB": "syscall", + "syscall.IN_CLASSA_HOST": "syscall", + "syscall.IN_CLASSA_MAX": "syscall", + "syscall.IN_CLASSA_NET": "syscall", + "syscall.IN_CLASSA_NSHIFT": "syscall", + "syscall.IN_CLASSB_HOST": "syscall", + "syscall.IN_CLASSB_MAX": "syscall", + "syscall.IN_CLASSB_NET": "syscall", + "syscall.IN_CLASSB_NSHIFT": "syscall", + "syscall.IN_CLASSC_HOST": "syscall", + "syscall.IN_CLASSC_NET": "syscall", + "syscall.IN_CLASSC_NSHIFT": "syscall", + "syscall.IN_CLASSD_HOST": "syscall", + "syscall.IN_CLASSD_NET": "syscall", + "syscall.IN_CLASSD_NSHIFT": "syscall", + "syscall.IN_CLOEXEC": "syscall", + "syscall.IN_CLOSE": "syscall", + "syscall.IN_CLOSE_NOWRITE": "syscall", + "syscall.IN_CLOSE_WRITE": "syscall", + "syscall.IN_CREATE": "syscall", + "syscall.IN_DELETE": "syscall", + "syscall.IN_DELETE_SELF": "syscall", + "syscall.IN_DONT_FOLLOW": "syscall", + "syscall.IN_EXCL_UNLINK": "syscall", + "syscall.IN_IGNORED": "syscall", + "syscall.IN_ISDIR": "syscall", + "syscall.IN_LINKLOCALNETNUM": "syscall", + "syscall.IN_LOOPBACKNET": "syscall", + "syscall.IN_MASK_ADD": "syscall", + "syscall.IN_MODIFY": "syscall", + "syscall.IN_MOVE": "syscall", + "syscall.IN_MOVED_FROM": "syscall", + "syscall.IN_MOVED_TO": "syscall", + "syscall.IN_MOVE_SELF": "syscall", + "syscall.IN_NONBLOCK": "syscall", + "syscall.IN_ONESHOT": "syscall", + "syscall.IN_ONLYDIR": "syscall", + "syscall.IN_OPEN": "syscall", + "syscall.IN_Q_OVERFLOW": "syscall", + "syscall.IN_RFC3021_HOST": "syscall", + "syscall.IN_RFC3021_MASK": "syscall", + "syscall.IN_RFC3021_NET": "syscall", + "syscall.IN_RFC3021_NSHIFT": "syscall", + "syscall.IN_UNMOUNT": "syscall", + "syscall.IOC_IN": "syscall", + "syscall.IOC_INOUT": "syscall", + "syscall.IOC_OUT": "syscall", + "syscall.IOC_VENDOR": "syscall", + "syscall.IOC_WS2": "syscall", + "syscall.IO_REPARSE_TAG_SYMLINK": "syscall", + "syscall.IPMreq": "syscall", + "syscall.IPMreqn": "syscall", + "syscall.IPPROTO_3PC": "syscall", + "syscall.IPPROTO_ADFS": "syscall", + "syscall.IPPROTO_AH": "syscall", + "syscall.IPPROTO_AHIP": "syscall", + "syscall.IPPROTO_APES": "syscall", + "syscall.IPPROTO_ARGUS": "syscall", + "syscall.IPPROTO_AX25": "syscall", + "syscall.IPPROTO_BHA": "syscall", + "syscall.IPPROTO_BLT": "syscall", + "syscall.IPPROTO_BRSATMON": "syscall", + "syscall.IPPROTO_CARP": "syscall", + "syscall.IPPROTO_CFTP": "syscall", + "syscall.IPPROTO_CHAOS": "syscall", + "syscall.IPPROTO_CMTP": "syscall", + "syscall.IPPROTO_COMP": "syscall", + "syscall.IPPROTO_CPHB": "syscall", + "syscall.IPPROTO_CPNX": "syscall", + "syscall.IPPROTO_DCCP": "syscall", + "syscall.IPPROTO_DDP": "syscall", + "syscall.IPPROTO_DGP": "syscall", + "syscall.IPPROTO_DIVERT": "syscall", + "syscall.IPPROTO_DIVERT_INIT": "syscall", + "syscall.IPPROTO_DIVERT_RESP": "syscall", + "syscall.IPPROTO_DONE": "syscall", + "syscall.IPPROTO_DSTOPTS": "syscall", + "syscall.IPPROTO_EGP": "syscall", + "syscall.IPPROTO_EMCON": "syscall", + "syscall.IPPROTO_ENCAP": "syscall", + "syscall.IPPROTO_EON": "syscall", + "syscall.IPPROTO_ESP": "syscall", + "syscall.IPPROTO_ETHERIP": "syscall", + "syscall.IPPROTO_FRAGMENT": "syscall", + "syscall.IPPROTO_GGP": "syscall", + "syscall.IPPROTO_GMTP": "syscall", + "syscall.IPPROTO_GRE": "syscall", + "syscall.IPPROTO_HELLO": "syscall", + "syscall.IPPROTO_HMP": "syscall", + "syscall.IPPROTO_HOPOPTS": "syscall", + "syscall.IPPROTO_ICMP": "syscall", + "syscall.IPPROTO_ICMPV6": "syscall", + "syscall.IPPROTO_IDP": "syscall", + "syscall.IPPROTO_IDPR": "syscall", + "syscall.IPPROTO_IDRP": "syscall", + "syscall.IPPROTO_IGMP": "syscall", + "syscall.IPPROTO_IGP": "syscall", + "syscall.IPPROTO_IGRP": "syscall", + "syscall.IPPROTO_IL": "syscall", + "syscall.IPPROTO_INLSP": "syscall", + "syscall.IPPROTO_INP": "syscall", + "syscall.IPPROTO_IP": "syscall", + "syscall.IPPROTO_IPCOMP": "syscall", + "syscall.IPPROTO_IPCV": "syscall", + "syscall.IPPROTO_IPEIP": "syscall", + "syscall.IPPROTO_IPIP": "syscall", + "syscall.IPPROTO_IPPC": "syscall", + "syscall.IPPROTO_IPV4": "syscall", + "syscall.IPPROTO_IPV6": "syscall", + "syscall.IPPROTO_IPV6_ICMP": "syscall", + "syscall.IPPROTO_IRTP": "syscall", + "syscall.IPPROTO_KRYPTOLAN": "syscall", + "syscall.IPPROTO_LARP": "syscall", + "syscall.IPPROTO_LEAF1": "syscall", + "syscall.IPPROTO_LEAF2": "syscall", + "syscall.IPPROTO_MAX": "syscall", + "syscall.IPPROTO_MAXID": "syscall", + "syscall.IPPROTO_MEAS": "syscall", + "syscall.IPPROTO_MH": "syscall", + "syscall.IPPROTO_MHRP": "syscall", + "syscall.IPPROTO_MICP": "syscall", + "syscall.IPPROTO_MOBILE": "syscall", + "syscall.IPPROTO_MPLS": "syscall", + "syscall.IPPROTO_MTP": "syscall", + "syscall.IPPROTO_MUX": "syscall", + "syscall.IPPROTO_ND": "syscall", + "syscall.IPPROTO_NHRP": "syscall", + "syscall.IPPROTO_NONE": "syscall", + "syscall.IPPROTO_NSP": "syscall", + "syscall.IPPROTO_NVPII": "syscall", + "syscall.IPPROTO_OLD_DIVERT": "syscall", + "syscall.IPPROTO_OSPFIGP": "syscall", + "syscall.IPPROTO_PFSYNC": "syscall", + "syscall.IPPROTO_PGM": "syscall", + "syscall.IPPROTO_PIGP": "syscall", + "syscall.IPPROTO_PIM": "syscall", + "syscall.IPPROTO_PRM": "syscall", + "syscall.IPPROTO_PUP": "syscall", + "syscall.IPPROTO_PVP": "syscall", + "syscall.IPPROTO_RAW": "syscall", + "syscall.IPPROTO_RCCMON": "syscall", + "syscall.IPPROTO_RDP": "syscall", + "syscall.IPPROTO_ROUTING": "syscall", + "syscall.IPPROTO_RSVP": "syscall", + "syscall.IPPROTO_RVD": "syscall", + "syscall.IPPROTO_SATEXPAK": "syscall", + "syscall.IPPROTO_SATMON": "syscall", + "syscall.IPPROTO_SCCSP": "syscall", + "syscall.IPPROTO_SCTP": "syscall", + "syscall.IPPROTO_SDRP": "syscall", + "syscall.IPPROTO_SEND": "syscall", + "syscall.IPPROTO_SEP": "syscall", + "syscall.IPPROTO_SKIP": "syscall", + "syscall.IPPROTO_SPACER": "syscall", + "syscall.IPPROTO_SRPC": "syscall", + "syscall.IPPROTO_ST": "syscall", + "syscall.IPPROTO_SVMTP": "syscall", + "syscall.IPPROTO_SWIPE": "syscall", + "syscall.IPPROTO_TCF": "syscall", + "syscall.IPPROTO_TCP": "syscall", + "syscall.IPPROTO_TLSP": "syscall", + "syscall.IPPROTO_TP": "syscall", + "syscall.IPPROTO_TPXX": "syscall", + "syscall.IPPROTO_TRUNK1": "syscall", + "syscall.IPPROTO_TRUNK2": "syscall", + "syscall.IPPROTO_TTP": "syscall", + "syscall.IPPROTO_UDP": "syscall", + "syscall.IPPROTO_UDPLITE": "syscall", + "syscall.IPPROTO_VINES": "syscall", + "syscall.IPPROTO_VISA": "syscall", + "syscall.IPPROTO_VMTP": "syscall", + "syscall.IPPROTO_VRRP": "syscall", + "syscall.IPPROTO_WBEXPAK": "syscall", + "syscall.IPPROTO_WBMON": "syscall", + "syscall.IPPROTO_WSN": "syscall", + "syscall.IPPROTO_XNET": "syscall", + "syscall.IPPROTO_XTP": "syscall", + "syscall.IPV6_2292DSTOPTS": "syscall", + "syscall.IPV6_2292HOPLIMIT": "syscall", + "syscall.IPV6_2292HOPOPTS": "syscall", + "syscall.IPV6_2292NEXTHOP": "syscall", + "syscall.IPV6_2292PKTINFO": "syscall", + "syscall.IPV6_2292PKTOPTIONS": "syscall", + "syscall.IPV6_2292RTHDR": "syscall", + "syscall.IPV6_ADDRFORM": "syscall", + "syscall.IPV6_ADD_MEMBERSHIP": "syscall", + "syscall.IPV6_AUTHHDR": "syscall", + "syscall.IPV6_AUTH_LEVEL": "syscall", + "syscall.IPV6_AUTOFLOWLABEL": "syscall", + "syscall.IPV6_BINDANY": "syscall", + "syscall.IPV6_BINDV6ONLY": "syscall", + "syscall.IPV6_BOUND_IF": "syscall", + "syscall.IPV6_CHECKSUM": "syscall", + "syscall.IPV6_DEFAULT_MULTICAST_HOPS": "syscall", + "syscall.IPV6_DEFAULT_MULTICAST_LOOP": "syscall", + "syscall.IPV6_DEFHLIM": "syscall", + "syscall.IPV6_DONTFRAG": "syscall", + "syscall.IPV6_DROP_MEMBERSHIP": "syscall", + "syscall.IPV6_DSTOPTS": "syscall", + "syscall.IPV6_ESP_NETWORK_LEVEL": "syscall", + "syscall.IPV6_ESP_TRANS_LEVEL": "syscall", + "syscall.IPV6_FAITH": "syscall", + "syscall.IPV6_FLOWINFO_MASK": "syscall", + "syscall.IPV6_FLOWLABEL_MASK": "syscall", + "syscall.IPV6_FRAGTTL": "syscall", + "syscall.IPV6_FW_ADD": "syscall", + "syscall.IPV6_FW_DEL": "syscall", + "syscall.IPV6_FW_FLUSH": "syscall", + "syscall.IPV6_FW_GET": "syscall", + "syscall.IPV6_FW_ZERO": "syscall", + "syscall.IPV6_HLIMDEC": "syscall", + "syscall.IPV6_HOPLIMIT": "syscall", + "syscall.IPV6_HOPOPTS": "syscall", + "syscall.IPV6_IPCOMP_LEVEL": "syscall", + "syscall.IPV6_IPSEC_POLICY": "syscall", + "syscall.IPV6_JOIN_ANYCAST": "syscall", + "syscall.IPV6_JOIN_GROUP": "syscall", + "syscall.IPV6_LEAVE_ANYCAST": "syscall", + "syscall.IPV6_LEAVE_GROUP": "syscall", + "syscall.IPV6_MAXHLIM": "syscall", + "syscall.IPV6_MAXOPTHDR": "syscall", + "syscall.IPV6_MAXPACKET": "syscall", + "syscall.IPV6_MAX_GROUP_SRC_FILTER": "syscall", + "syscall.IPV6_MAX_MEMBERSHIPS": "syscall", + "syscall.IPV6_MAX_SOCK_SRC_FILTER": "syscall", + "syscall.IPV6_MIN_MEMBERSHIPS": "syscall", + "syscall.IPV6_MMTU": "syscall", + "syscall.IPV6_MSFILTER": "syscall", + "syscall.IPV6_MTU": "syscall", + "syscall.IPV6_MTU_DISCOVER": "syscall", + "syscall.IPV6_MULTICAST_HOPS": "syscall", + "syscall.IPV6_MULTICAST_IF": "syscall", + "syscall.IPV6_MULTICAST_LOOP": "syscall", + "syscall.IPV6_NEXTHOP": "syscall", + "syscall.IPV6_OPTIONS": "syscall", + "syscall.IPV6_PATHMTU": "syscall", + "syscall.IPV6_PIPEX": "syscall", + "syscall.IPV6_PKTINFO": "syscall", + "syscall.IPV6_PMTUDISC_DO": "syscall", + "syscall.IPV6_PMTUDISC_DONT": "syscall", + "syscall.IPV6_PMTUDISC_PROBE": "syscall", + "syscall.IPV6_PMTUDISC_WANT": "syscall", + "syscall.IPV6_PORTRANGE": "syscall", + "syscall.IPV6_PORTRANGE_DEFAULT": "syscall", + "syscall.IPV6_PORTRANGE_HIGH": "syscall", + "syscall.IPV6_PORTRANGE_LOW": "syscall", + "syscall.IPV6_PREFER_TEMPADDR": "syscall", + "syscall.IPV6_RECVDSTOPTS": "syscall", + "syscall.IPV6_RECVDSTPORT": "syscall", + "syscall.IPV6_RECVERR": "syscall", + "syscall.IPV6_RECVHOPLIMIT": "syscall", + "syscall.IPV6_RECVHOPOPTS": "syscall", + "syscall.IPV6_RECVPATHMTU": "syscall", + "syscall.IPV6_RECVPKTINFO": "syscall", + "syscall.IPV6_RECVRTHDR": "syscall", + "syscall.IPV6_RECVTCLASS": "syscall", + "syscall.IPV6_ROUTER_ALERT": "syscall", + "syscall.IPV6_RTABLE": "syscall", + "syscall.IPV6_RTHDR": "syscall", + "syscall.IPV6_RTHDRDSTOPTS": "syscall", + "syscall.IPV6_RTHDR_LOOSE": "syscall", + "syscall.IPV6_RTHDR_STRICT": "syscall", + "syscall.IPV6_RTHDR_TYPE_0": "syscall", + "syscall.IPV6_RXDSTOPTS": "syscall", + "syscall.IPV6_RXHOPOPTS": "syscall", + "syscall.IPV6_SOCKOPT_RESERVED1": "syscall", + "syscall.IPV6_TCLASS": "syscall", + "syscall.IPV6_UNICAST_HOPS": "syscall", + "syscall.IPV6_USE_MIN_MTU": "syscall", + "syscall.IPV6_V6ONLY": "syscall", + "syscall.IPV6_VERSION": "syscall", + "syscall.IPV6_VERSION_MASK": "syscall", + "syscall.IPV6_XFRM_POLICY": "syscall", + "syscall.IP_ADD_MEMBERSHIP": "syscall", + "syscall.IP_ADD_SOURCE_MEMBERSHIP": "syscall", + "syscall.IP_AUTH_LEVEL": "syscall", + "syscall.IP_BINDANY": "syscall", + "syscall.IP_BLOCK_SOURCE": "syscall", + "syscall.IP_BOUND_IF": "syscall", + "syscall.IP_DEFAULT_MULTICAST_LOOP": "syscall", + "syscall.IP_DEFAULT_MULTICAST_TTL": "syscall", + "syscall.IP_DF": "syscall", + "syscall.IP_DIVERTFL": "syscall", + "syscall.IP_DONTFRAG": "syscall", + "syscall.IP_DROP_MEMBERSHIP": "syscall", + "syscall.IP_DROP_SOURCE_MEMBERSHIP": "syscall", + "syscall.IP_DUMMYNET3": "syscall", + "syscall.IP_DUMMYNET_CONFIGURE": "syscall", + "syscall.IP_DUMMYNET_DEL": "syscall", + "syscall.IP_DUMMYNET_FLUSH": "syscall", + "syscall.IP_DUMMYNET_GET": "syscall", + "syscall.IP_EF": "syscall", + "syscall.IP_ERRORMTU": "syscall", + "syscall.IP_ESP_NETWORK_LEVEL": "syscall", + "syscall.IP_ESP_TRANS_LEVEL": "syscall", + "syscall.IP_FAITH": "syscall", + "syscall.IP_FREEBIND": "syscall", + "syscall.IP_FW3": "syscall", + "syscall.IP_FW_ADD": "syscall", + "syscall.IP_FW_DEL": "syscall", + "syscall.IP_FW_FLUSH": "syscall", + "syscall.IP_FW_GET": "syscall", + "syscall.IP_FW_NAT_CFG": "syscall", + "syscall.IP_FW_NAT_DEL": "syscall", + "syscall.IP_FW_NAT_GET_CONFIG": "syscall", + "syscall.IP_FW_NAT_GET_LOG": "syscall", + "syscall.IP_FW_RESETLOG": "syscall", + "syscall.IP_FW_TABLE_ADD": "syscall", + "syscall.IP_FW_TABLE_DEL": "syscall", + "syscall.IP_FW_TABLE_FLUSH": "syscall", + "syscall.IP_FW_TABLE_GETSIZE": "syscall", + "syscall.IP_FW_TABLE_LIST": "syscall", + "syscall.IP_FW_ZERO": "syscall", + "syscall.IP_HDRINCL": "syscall", + "syscall.IP_IPCOMP_LEVEL": "syscall", + "syscall.IP_IPSECFLOWINFO": "syscall", + "syscall.IP_IPSEC_LOCAL_AUTH": "syscall", + "syscall.IP_IPSEC_LOCAL_CRED": "syscall", + "syscall.IP_IPSEC_LOCAL_ID": "syscall", + "syscall.IP_IPSEC_POLICY": "syscall", + "syscall.IP_IPSEC_REMOTE_AUTH": "syscall", + "syscall.IP_IPSEC_REMOTE_CRED": "syscall", + "syscall.IP_IPSEC_REMOTE_ID": "syscall", + "syscall.IP_MAXPACKET": "syscall", + "syscall.IP_MAX_GROUP_SRC_FILTER": "syscall", + "syscall.IP_MAX_MEMBERSHIPS": "syscall", + "syscall.IP_MAX_SOCK_MUTE_FILTER": "syscall", + "syscall.IP_MAX_SOCK_SRC_FILTER": "syscall", + "syscall.IP_MAX_SOURCE_FILTER": "syscall", + "syscall.IP_MF": "syscall", + "syscall.IP_MINFRAGSIZE": "syscall", + "syscall.IP_MINTTL": "syscall", + "syscall.IP_MIN_MEMBERSHIPS": "syscall", + "syscall.IP_MSFILTER": "syscall", + "syscall.IP_MSS": "syscall", + "syscall.IP_MTU": "syscall", + "syscall.IP_MTU_DISCOVER": "syscall", + "syscall.IP_MULTICAST_IF": "syscall", + "syscall.IP_MULTICAST_IFINDEX": "syscall", + "syscall.IP_MULTICAST_LOOP": "syscall", + "syscall.IP_MULTICAST_TTL": "syscall", + "syscall.IP_MULTICAST_VIF": "syscall", + "syscall.IP_NAT__XXX": "syscall", + "syscall.IP_OFFMASK": "syscall", + "syscall.IP_OLD_FW_ADD": "syscall", + "syscall.IP_OLD_FW_DEL": "syscall", + "syscall.IP_OLD_FW_FLUSH": "syscall", + "syscall.IP_OLD_FW_GET": "syscall", + "syscall.IP_OLD_FW_RESETLOG": "syscall", + "syscall.IP_OLD_FW_ZERO": "syscall", + "syscall.IP_ONESBCAST": "syscall", + "syscall.IP_OPTIONS": "syscall", + "syscall.IP_ORIGDSTADDR": "syscall", + "syscall.IP_PASSSEC": "syscall", + "syscall.IP_PIPEX": "syscall", + "syscall.IP_PKTINFO": "syscall", + "syscall.IP_PKTOPTIONS": "syscall", + "syscall.IP_PMTUDISC": "syscall", + "syscall.IP_PMTUDISC_DO": "syscall", + "syscall.IP_PMTUDISC_DONT": "syscall", + "syscall.IP_PMTUDISC_PROBE": "syscall", + "syscall.IP_PMTUDISC_WANT": "syscall", + "syscall.IP_PORTRANGE": "syscall", + "syscall.IP_PORTRANGE_DEFAULT": "syscall", + "syscall.IP_PORTRANGE_HIGH": "syscall", + "syscall.IP_PORTRANGE_LOW": "syscall", + "syscall.IP_RECVDSTADDR": "syscall", + "syscall.IP_RECVDSTPORT": "syscall", + "syscall.IP_RECVERR": "syscall", + "syscall.IP_RECVIF": "syscall", + "syscall.IP_RECVOPTS": "syscall", + "syscall.IP_RECVORIGDSTADDR": "syscall", + "syscall.IP_RECVPKTINFO": "syscall", + "syscall.IP_RECVRETOPTS": "syscall", + "syscall.IP_RECVRTABLE": "syscall", + "syscall.IP_RECVTOS": "syscall", + "syscall.IP_RECVTTL": "syscall", + "syscall.IP_RETOPTS": "syscall", + "syscall.IP_RF": "syscall", + "syscall.IP_ROUTER_ALERT": "syscall", + "syscall.IP_RSVP_OFF": "syscall", + "syscall.IP_RSVP_ON": "syscall", + "syscall.IP_RSVP_VIF_OFF": "syscall", + "syscall.IP_RSVP_VIF_ON": "syscall", + "syscall.IP_RTABLE": "syscall", + "syscall.IP_SENDSRCADDR": "syscall", + "syscall.IP_STRIPHDR": "syscall", + "syscall.IP_TOS": "syscall", + "syscall.IP_TRAFFIC_MGT_BACKGROUND": "syscall", + "syscall.IP_TRANSPARENT": "syscall", + "syscall.IP_TTL": "syscall", + "syscall.IP_UNBLOCK_SOURCE": "syscall", + "syscall.IP_XFRM_POLICY": "syscall", + "syscall.IPv6MTUInfo": "syscall", + "syscall.IPv6Mreq": "syscall", + "syscall.ISIG": "syscall", + "syscall.ISTRIP": "syscall", + "syscall.IUCLC": "syscall", + "syscall.IUTF8": "syscall", + "syscall.IXANY": "syscall", + "syscall.IXOFF": "syscall", + "syscall.IXON": "syscall", + "syscall.IfAddrmsg": "syscall", + "syscall.IfAnnounceMsghdr": "syscall", + "syscall.IfData": "syscall", + "syscall.IfInfomsg": "syscall", + "syscall.IfMsghdr": "syscall", + "syscall.IfaMsghdr": "syscall", + "syscall.IfmaMsghdr": "syscall", + "syscall.IfmaMsghdr2": "syscall", + "syscall.ImplementsGetwd": "syscall", + "syscall.Inet4Pktinfo": "syscall", + "syscall.Inet6Pktinfo": "syscall", + "syscall.InotifyAddWatch": "syscall", + "syscall.InotifyEvent": "syscall", + "syscall.InotifyInit": "syscall", + "syscall.InotifyInit1": "syscall", + "syscall.InotifyRmWatch": "syscall", + "syscall.InterfaceAddrMessage": "syscall", + "syscall.InterfaceAnnounceMessage": "syscall", + "syscall.InterfaceInfo": "syscall", + "syscall.InterfaceMessage": "syscall", + "syscall.InterfaceMulticastAddrMessage": "syscall", + "syscall.InvalidHandle": "syscall", + "syscall.Ioperm": "syscall", + "syscall.Iopl": "syscall", + "syscall.Iovec": "syscall", + "syscall.IpAdapterInfo": "syscall", + "syscall.IpAddrString": "syscall", + "syscall.IpAddressString": "syscall", + "syscall.IpMaskString": "syscall", + "syscall.Issetugid": "syscall", + "syscall.KEY_ALL_ACCESS": "syscall", + "syscall.KEY_CREATE_LINK": "syscall", + "syscall.KEY_CREATE_SUB_KEY": "syscall", + "syscall.KEY_ENUMERATE_SUB_KEYS": "syscall", + "syscall.KEY_EXECUTE": "syscall", + "syscall.KEY_NOTIFY": "syscall", + "syscall.KEY_QUERY_VALUE": "syscall", + "syscall.KEY_READ": "syscall", + "syscall.KEY_SET_VALUE": "syscall", + "syscall.KEY_WOW64_32KEY": "syscall", + "syscall.KEY_WOW64_64KEY": "syscall", + "syscall.KEY_WRITE": "syscall", + "syscall.Kevent": "syscall", + "syscall.Kevent_t": "syscall", + "syscall.Kill": "syscall", + "syscall.Klogctl": "syscall", + "syscall.Kqueue": "syscall", + "syscall.LANG_ENGLISH": "syscall", + "syscall.LAYERED_PROTOCOL": "syscall", + "syscall.LCNT_OVERLOAD_FLUSH": "syscall", + "syscall.LINUX_REBOOT_CMD_CAD_OFF": "syscall", + "syscall.LINUX_REBOOT_CMD_CAD_ON": "syscall", + "syscall.LINUX_REBOOT_CMD_HALT": "syscall", + "syscall.LINUX_REBOOT_CMD_KEXEC": "syscall", + "syscall.LINUX_REBOOT_CMD_POWER_OFF": "syscall", + "syscall.LINUX_REBOOT_CMD_RESTART": "syscall", + "syscall.LINUX_REBOOT_CMD_RESTART2": "syscall", + "syscall.LINUX_REBOOT_CMD_SW_SUSPEND": "syscall", + "syscall.LINUX_REBOOT_MAGIC1": "syscall", + "syscall.LINUX_REBOOT_MAGIC2": "syscall", + "syscall.LOCK_EX": "syscall", + "syscall.LOCK_NB": "syscall", + "syscall.LOCK_SH": "syscall", + "syscall.LOCK_UN": "syscall", + "syscall.LazyDLL": "syscall", + "syscall.LazyProc": "syscall", + "syscall.Lchown": "syscall", + "syscall.Linger": "syscall", + "syscall.Link": "syscall", + "syscall.Listen": "syscall", + "syscall.Listxattr": "syscall", + "syscall.LoadCancelIoEx": "syscall", + "syscall.LoadConnectEx": "syscall", + "syscall.LoadCreateSymbolicLink": "syscall", + "syscall.LoadDLL": "syscall", + "syscall.LoadGetAddrInfo": "syscall", + "syscall.LoadLibrary": "syscall", + "syscall.LoadSetFileCompletionNotificationModes": "syscall", + "syscall.LocalFree": "syscall", + "syscall.Log2phys_t": "syscall", + "syscall.LookupAccountName": "syscall", + "syscall.LookupAccountSid": "syscall", + "syscall.LookupSID": "syscall", + "syscall.LsfJump": "syscall", + "syscall.LsfSocket": "syscall", + "syscall.LsfStmt": "syscall", + "syscall.Lstat": "syscall", + "syscall.MADV_AUTOSYNC": "syscall", + "syscall.MADV_CAN_REUSE": "syscall", + "syscall.MADV_CORE": "syscall", + "syscall.MADV_DOFORK": "syscall", + "syscall.MADV_DONTFORK": "syscall", + "syscall.MADV_DONTNEED": "syscall", + "syscall.MADV_FREE": "syscall", + "syscall.MADV_FREE_REUSABLE": "syscall", + "syscall.MADV_FREE_REUSE": "syscall", + "syscall.MADV_HUGEPAGE": "syscall", + "syscall.MADV_HWPOISON": "syscall", + "syscall.MADV_MERGEABLE": "syscall", + "syscall.MADV_NOCORE": "syscall", + "syscall.MADV_NOHUGEPAGE": "syscall", + "syscall.MADV_NORMAL": "syscall", + "syscall.MADV_NOSYNC": "syscall", + "syscall.MADV_PROTECT": "syscall", + "syscall.MADV_RANDOM": "syscall", + "syscall.MADV_REMOVE": "syscall", + "syscall.MADV_SEQUENTIAL": "syscall", + "syscall.MADV_SPACEAVAIL": "syscall", + "syscall.MADV_UNMERGEABLE": "syscall", + "syscall.MADV_WILLNEED": "syscall", + "syscall.MADV_ZERO_WIRED_PAGES": "syscall", + "syscall.MAP_32BIT": "syscall", + "syscall.MAP_ALIGNED_SUPER": "syscall", + "syscall.MAP_ALIGNMENT_16MB": "syscall", + "syscall.MAP_ALIGNMENT_1TB": "syscall", + "syscall.MAP_ALIGNMENT_256TB": "syscall", + "syscall.MAP_ALIGNMENT_4GB": "syscall", + "syscall.MAP_ALIGNMENT_64KB": "syscall", + "syscall.MAP_ALIGNMENT_64PB": "syscall", + "syscall.MAP_ALIGNMENT_MASK": "syscall", + "syscall.MAP_ALIGNMENT_SHIFT": "syscall", + "syscall.MAP_ANON": "syscall", + "syscall.MAP_ANONYMOUS": "syscall", + "syscall.MAP_COPY": "syscall", + "syscall.MAP_DENYWRITE": "syscall", + "syscall.MAP_EXECUTABLE": "syscall", + "syscall.MAP_FILE": "syscall", + "syscall.MAP_FIXED": "syscall", + "syscall.MAP_FLAGMASK": "syscall", + "syscall.MAP_GROWSDOWN": "syscall", + "syscall.MAP_HASSEMAPHORE": "syscall", + "syscall.MAP_HUGETLB": "syscall", + "syscall.MAP_INHERIT": "syscall", + "syscall.MAP_INHERIT_COPY": "syscall", + "syscall.MAP_INHERIT_DEFAULT": "syscall", + "syscall.MAP_INHERIT_DONATE_COPY": "syscall", + "syscall.MAP_INHERIT_NONE": "syscall", + "syscall.MAP_INHERIT_SHARE": "syscall", + "syscall.MAP_JIT": "syscall", + "syscall.MAP_LOCKED": "syscall", + "syscall.MAP_NOCACHE": "syscall", + "syscall.MAP_NOCORE": "syscall", + "syscall.MAP_NOEXTEND": "syscall", + "syscall.MAP_NONBLOCK": "syscall", + "syscall.MAP_NORESERVE": "syscall", + "syscall.MAP_NOSYNC": "syscall", + "syscall.MAP_POPULATE": "syscall", + "syscall.MAP_PREFAULT_READ": "syscall", + "syscall.MAP_PRIVATE": "syscall", + "syscall.MAP_RENAME": "syscall", + "syscall.MAP_RESERVED0080": "syscall", + "syscall.MAP_RESERVED0100": "syscall", + "syscall.MAP_SHARED": "syscall", + "syscall.MAP_STACK": "syscall", + "syscall.MAP_TRYFIXED": "syscall", + "syscall.MAP_TYPE": "syscall", + "syscall.MAP_WIRED": "syscall", + "syscall.MAXIMUM_REPARSE_DATA_BUFFER_SIZE": "syscall", + "syscall.MAXLEN_IFDESCR": "syscall", + "syscall.MAXLEN_PHYSADDR": "syscall", + "syscall.MAX_ADAPTER_ADDRESS_LENGTH": "syscall", + "syscall.MAX_ADAPTER_DESCRIPTION_LENGTH": "syscall", + "syscall.MAX_ADAPTER_NAME_LENGTH": "syscall", + "syscall.MAX_COMPUTERNAME_LENGTH": "syscall", + "syscall.MAX_INTERFACE_NAME_LEN": "syscall", + "syscall.MAX_LONG_PATH": "syscall", + "syscall.MAX_PATH": "syscall", + "syscall.MAX_PROTOCOL_CHAIN": "syscall", + "syscall.MCL_CURRENT": "syscall", + "syscall.MCL_FUTURE": "syscall", + "syscall.MNT_DETACH": "syscall", + "syscall.MNT_EXPIRE": "syscall", + "syscall.MNT_FORCE": "syscall", + "syscall.MSG_BCAST": "syscall", + "syscall.MSG_CMSG_CLOEXEC": "syscall", + "syscall.MSG_COMPAT": "syscall", + "syscall.MSG_CONFIRM": "syscall", + "syscall.MSG_CONTROLMBUF": "syscall", + "syscall.MSG_CTRUNC": "syscall", + "syscall.MSG_DONTROUTE": "syscall", + "syscall.MSG_DONTWAIT": "syscall", + "syscall.MSG_EOF": "syscall", + "syscall.MSG_EOR": "syscall", + "syscall.MSG_ERRQUEUE": "syscall", + "syscall.MSG_FASTOPEN": "syscall", + "syscall.MSG_FIN": "syscall", + "syscall.MSG_FLUSH": "syscall", + "syscall.MSG_HAVEMORE": "syscall", + "syscall.MSG_HOLD": "syscall", + "syscall.MSG_IOVUSRSPACE": "syscall", + "syscall.MSG_LENUSRSPACE": "syscall", + "syscall.MSG_MCAST": "syscall", + "syscall.MSG_MORE": "syscall", + "syscall.MSG_NAMEMBUF": "syscall", + "syscall.MSG_NBIO": "syscall", + "syscall.MSG_NEEDSA": "syscall", + "syscall.MSG_NOSIGNAL": "syscall", + "syscall.MSG_NOTIFICATION": "syscall", + "syscall.MSG_OOB": "syscall", + "syscall.MSG_PEEK": "syscall", + "syscall.MSG_PROXY": "syscall", + "syscall.MSG_RCVMORE": "syscall", + "syscall.MSG_RST": "syscall", + "syscall.MSG_SEND": "syscall", + "syscall.MSG_SYN": "syscall", + "syscall.MSG_TRUNC": "syscall", + "syscall.MSG_TRYHARD": "syscall", + "syscall.MSG_USERFLAGS": "syscall", + "syscall.MSG_WAITALL": "syscall", + "syscall.MSG_WAITFORONE": "syscall", + "syscall.MSG_WAITSTREAM": "syscall", + "syscall.MS_ACTIVE": "syscall", + "syscall.MS_ASYNC": "syscall", + "syscall.MS_BIND": "syscall", + "syscall.MS_DEACTIVATE": "syscall", + "syscall.MS_DIRSYNC": "syscall", + "syscall.MS_INVALIDATE": "syscall", + "syscall.MS_I_VERSION": "syscall", + "syscall.MS_KERNMOUNT": "syscall", + "syscall.MS_KILLPAGES": "syscall", + "syscall.MS_MANDLOCK": "syscall", + "syscall.MS_MGC_MSK": "syscall", + "syscall.MS_MGC_VAL": "syscall", + "syscall.MS_MOVE": "syscall", + "syscall.MS_NOATIME": "syscall", + "syscall.MS_NODEV": "syscall", + "syscall.MS_NODIRATIME": "syscall", + "syscall.MS_NOEXEC": "syscall", + "syscall.MS_NOSUID": "syscall", + "syscall.MS_NOUSER": "syscall", + "syscall.MS_POSIXACL": "syscall", + "syscall.MS_PRIVATE": "syscall", + "syscall.MS_RDONLY": "syscall", + "syscall.MS_REC": "syscall", + "syscall.MS_RELATIME": "syscall", + "syscall.MS_REMOUNT": "syscall", + "syscall.MS_RMT_MASK": "syscall", + "syscall.MS_SHARED": "syscall", + "syscall.MS_SILENT": "syscall", + "syscall.MS_SLAVE": "syscall", + "syscall.MS_STRICTATIME": "syscall", + "syscall.MS_SYNC": "syscall", + "syscall.MS_SYNCHRONOUS": "syscall", + "syscall.MS_UNBINDABLE": "syscall", + "syscall.Madvise": "syscall", + "syscall.MapViewOfFile": "syscall", + "syscall.MaxTokenInfoClass": "syscall", + "syscall.Mclpool": "syscall", + "syscall.MibIfRow": "syscall", + "syscall.Mkdir": "syscall", + "syscall.Mkdirat": "syscall", + "syscall.Mkfifo": "syscall", + "syscall.Mknod": "syscall", + "syscall.Mknodat": "syscall", + "syscall.Mlock": "syscall", + "syscall.Mlockall": "syscall", + "syscall.Mmap": "syscall", + "syscall.Mount": "syscall", + "syscall.MoveFile": "syscall", + "syscall.Mprotect": "syscall", + "syscall.Msghdr": "syscall", + "syscall.Munlock": "syscall", + "syscall.Munlockall": "syscall", + "syscall.Munmap": "syscall", + "syscall.MustLoadDLL": "syscall", + "syscall.NAME_MAX": "syscall", + "syscall.NETLINK_ADD_MEMBERSHIP": "syscall", + "syscall.NETLINK_AUDIT": "syscall", + "syscall.NETLINK_BROADCAST_ERROR": "syscall", + "syscall.NETLINK_CONNECTOR": "syscall", + "syscall.NETLINK_DNRTMSG": "syscall", + "syscall.NETLINK_DROP_MEMBERSHIP": "syscall", + "syscall.NETLINK_ECRYPTFS": "syscall", + "syscall.NETLINK_FIB_LOOKUP": "syscall", + "syscall.NETLINK_FIREWALL": "syscall", + "syscall.NETLINK_GENERIC": "syscall", + "syscall.NETLINK_INET_DIAG": "syscall", + "syscall.NETLINK_IP6_FW": "syscall", + "syscall.NETLINK_ISCSI": "syscall", + "syscall.NETLINK_KOBJECT_UEVENT": "syscall", + "syscall.NETLINK_NETFILTER": "syscall", + "syscall.NETLINK_NFLOG": "syscall", + "syscall.NETLINK_NO_ENOBUFS": "syscall", + "syscall.NETLINK_PKTINFO": "syscall", + "syscall.NETLINK_RDMA": "syscall", + "syscall.NETLINK_ROUTE": "syscall", + "syscall.NETLINK_SCSITRANSPORT": "syscall", + "syscall.NETLINK_SELINUX": "syscall", + "syscall.NETLINK_UNUSED": "syscall", + "syscall.NETLINK_USERSOCK": "syscall", + "syscall.NETLINK_XFRM": "syscall", + "syscall.NET_RT_DUMP": "syscall", + "syscall.NET_RT_DUMP2": "syscall", + "syscall.NET_RT_FLAGS": "syscall", + "syscall.NET_RT_IFLIST": "syscall", + "syscall.NET_RT_IFLIST2": "syscall", + "syscall.NET_RT_IFLISTL": "syscall", + "syscall.NET_RT_IFMALIST": "syscall", + "syscall.NET_RT_MAXID": "syscall", + "syscall.NET_RT_OIFLIST": "syscall", + "syscall.NET_RT_OOIFLIST": "syscall", + "syscall.NET_RT_STAT": "syscall", + "syscall.NET_RT_STATS": "syscall", + "syscall.NET_RT_TABLE": "syscall", + "syscall.NET_RT_TRASH": "syscall", + "syscall.NLA_ALIGNTO": "syscall", + "syscall.NLA_F_NESTED": "syscall", + "syscall.NLA_F_NET_BYTEORDER": "syscall", + "syscall.NLA_HDRLEN": "syscall", + "syscall.NLMSG_ALIGNTO": "syscall", + "syscall.NLMSG_DONE": "syscall", + "syscall.NLMSG_ERROR": "syscall", + "syscall.NLMSG_HDRLEN": "syscall", + "syscall.NLMSG_MIN_TYPE": "syscall", + "syscall.NLMSG_NOOP": "syscall", + "syscall.NLMSG_OVERRUN": "syscall", + "syscall.NLM_F_ACK": "syscall", + "syscall.NLM_F_APPEND": "syscall", + "syscall.NLM_F_ATOMIC": "syscall", + "syscall.NLM_F_CREATE": "syscall", + "syscall.NLM_F_DUMP": "syscall", + "syscall.NLM_F_ECHO": "syscall", + "syscall.NLM_F_EXCL": "syscall", + "syscall.NLM_F_MATCH": "syscall", + "syscall.NLM_F_MULTI": "syscall", + "syscall.NLM_F_REPLACE": "syscall", + "syscall.NLM_F_REQUEST": "syscall", + "syscall.NLM_F_ROOT": "syscall", + "syscall.NOFLSH": "syscall", + "syscall.NOTE_ABSOLUTE": "syscall", + "syscall.NOTE_ATTRIB": "syscall", + "syscall.NOTE_CHILD": "syscall", + "syscall.NOTE_DELETE": "syscall", + "syscall.NOTE_EOF": "syscall", + "syscall.NOTE_EXEC": "syscall", + "syscall.NOTE_EXIT": "syscall", + "syscall.NOTE_EXITSTATUS": "syscall", + "syscall.NOTE_EXTEND": "syscall", + "syscall.NOTE_FFAND": "syscall", + "syscall.NOTE_FFCOPY": "syscall", + "syscall.NOTE_FFCTRLMASK": "syscall", + "syscall.NOTE_FFLAGSMASK": "syscall", + "syscall.NOTE_FFNOP": "syscall", + "syscall.NOTE_FFOR": "syscall", + "syscall.NOTE_FORK": "syscall", + "syscall.NOTE_LINK": "syscall", + "syscall.NOTE_LOWAT": "syscall", + "syscall.NOTE_NONE": "syscall", + "syscall.NOTE_NSECONDS": "syscall", + "syscall.NOTE_PCTRLMASK": "syscall", + "syscall.NOTE_PDATAMASK": "syscall", + "syscall.NOTE_REAP": "syscall", + "syscall.NOTE_RENAME": "syscall", + "syscall.NOTE_RESOURCEEND": "syscall", + "syscall.NOTE_REVOKE": "syscall", + "syscall.NOTE_SECONDS": "syscall", + "syscall.NOTE_SIGNAL": "syscall", + "syscall.NOTE_TRACK": "syscall", + "syscall.NOTE_TRACKERR": "syscall", + "syscall.NOTE_TRIGGER": "syscall", + "syscall.NOTE_TRUNCATE": "syscall", + "syscall.NOTE_USECONDS": "syscall", + "syscall.NOTE_VM_ERROR": "syscall", + "syscall.NOTE_VM_PRESSURE": "syscall", + "syscall.NOTE_VM_PRESSURE_SUDDEN_TERMINATE": "syscall", + "syscall.NOTE_VM_PRESSURE_TERMINATE": "syscall", + "syscall.NOTE_WRITE": "syscall", + "syscall.NameCanonical": "syscall", + "syscall.NameCanonicalEx": "syscall", + "syscall.NameDisplay": "syscall", + "syscall.NameDnsDomain": "syscall", + "syscall.NameFullyQualifiedDN": "syscall", + "syscall.NameSamCompatible": "syscall", + "syscall.NameServicePrincipal": "syscall", + "syscall.NameUniqueId": "syscall", + "syscall.NameUnknown": "syscall", + "syscall.NameUserPrincipal": "syscall", + "syscall.Nanosleep": "syscall", + "syscall.NetApiBufferFree": "syscall", + "syscall.NetGetJoinInformation": "syscall", + "syscall.NetSetupDomainName": "syscall", + "syscall.NetSetupUnjoined": "syscall", + "syscall.NetSetupUnknownStatus": "syscall", + "syscall.NetSetupWorkgroupName": "syscall", + "syscall.NetUserGetInfo": "syscall", + "syscall.NetlinkMessage": "syscall", + "syscall.NetlinkRIB": "syscall", + "syscall.NetlinkRouteAttr": "syscall", + "syscall.NetlinkRouteRequest": "syscall", + "syscall.NewCallback": "syscall", + "syscall.NewCallbackCDecl": "syscall", + "syscall.NewLazyDLL": "syscall", + "syscall.NlAttr": "syscall", + "syscall.NlMsgerr": "syscall", + "syscall.NlMsghdr": "syscall", + "syscall.NsecToFiletime": "syscall", + "syscall.NsecToTimespec": "syscall", + "syscall.NsecToTimeval": "syscall", + "syscall.Ntohs": "syscall", + "syscall.OCRNL": "syscall", + "syscall.OFDEL": "syscall", + "syscall.OFILL": "syscall", + "syscall.OFIOGETBMAP": "syscall", + "syscall.OID_PKIX_KP_SERVER_AUTH": "syscall", + "syscall.OID_SERVER_GATED_CRYPTO": "syscall", + "syscall.OID_SGC_NETSCAPE": "syscall", + "syscall.OLCUC": "syscall", + "syscall.ONLCR": "syscall", + "syscall.ONLRET": "syscall", + "syscall.ONOCR": "syscall", + "syscall.ONOEOT": "syscall", + "syscall.OPEN_ALWAYS": "syscall", + "syscall.OPEN_EXISTING": "syscall", + "syscall.OPOST": "syscall", + "syscall.O_ACCMODE": "syscall", + "syscall.O_ALERT": "syscall", + "syscall.O_ALT_IO": "syscall", + "syscall.O_APPEND": "syscall", + "syscall.O_ASYNC": "syscall", + "syscall.O_CLOEXEC": "syscall", + "syscall.O_CREAT": "syscall", + "syscall.O_DIRECT": "syscall", + "syscall.O_DIRECTORY": "syscall", + "syscall.O_DSYNC": "syscall", + "syscall.O_EVTONLY": "syscall", + "syscall.O_EXCL": "syscall", + "syscall.O_EXEC": "syscall", + "syscall.O_EXLOCK": "syscall", + "syscall.O_FSYNC": "syscall", + "syscall.O_LARGEFILE": "syscall", + "syscall.O_NDELAY": "syscall", + "syscall.O_NOATIME": "syscall", + "syscall.O_NOCTTY": "syscall", + "syscall.O_NOFOLLOW": "syscall", + "syscall.O_NONBLOCK": "syscall", + "syscall.O_NOSIGPIPE": "syscall", + "syscall.O_POPUP": "syscall", + "syscall.O_RDONLY": "syscall", + "syscall.O_RDWR": "syscall", + "syscall.O_RSYNC": "syscall", + "syscall.O_SHLOCK": "syscall", + "syscall.O_SYMLINK": "syscall", + "syscall.O_SYNC": "syscall", + "syscall.O_TRUNC": "syscall", + "syscall.O_TTY_INIT": "syscall", + "syscall.O_WRONLY": "syscall", + "syscall.Open": "syscall", + "syscall.OpenCurrentProcessToken": "syscall", + "syscall.OpenProcess": "syscall", + "syscall.OpenProcessToken": "syscall", + "syscall.Openat": "syscall", + "syscall.Overlapped": "syscall", + "syscall.PACKET_ADD_MEMBERSHIP": "syscall", + "syscall.PACKET_BROADCAST": "syscall", + "syscall.PACKET_DROP_MEMBERSHIP": "syscall", + "syscall.PACKET_FASTROUTE": "syscall", + "syscall.PACKET_HOST": "syscall", + "syscall.PACKET_LOOPBACK": "syscall", + "syscall.PACKET_MR_ALLMULTI": "syscall", + "syscall.PACKET_MR_MULTICAST": "syscall", + "syscall.PACKET_MR_PROMISC": "syscall", + "syscall.PACKET_MULTICAST": "syscall", + "syscall.PACKET_OTHERHOST": "syscall", + "syscall.PACKET_OUTGOING": "syscall", + "syscall.PACKET_RECV_OUTPUT": "syscall", + "syscall.PACKET_RX_RING": "syscall", + "syscall.PACKET_STATISTICS": "syscall", + "syscall.PAGE_EXECUTE_READ": "syscall", + "syscall.PAGE_EXECUTE_READWRITE": "syscall", + "syscall.PAGE_EXECUTE_WRITECOPY": "syscall", + "syscall.PAGE_READONLY": "syscall", + "syscall.PAGE_READWRITE": "syscall", + "syscall.PAGE_WRITECOPY": "syscall", + "syscall.PARENB": "syscall", + "syscall.PARMRK": "syscall", + "syscall.PARODD": "syscall", + "syscall.PENDIN": "syscall", + "syscall.PFL_HIDDEN": "syscall", + "syscall.PFL_MATCHES_PROTOCOL_ZERO": "syscall", + "syscall.PFL_MULTIPLE_PROTO_ENTRIES": "syscall", + "syscall.PFL_NETWORKDIRECT_PROVIDER": "syscall", + "syscall.PFL_RECOMMENDED_PROTO_ENTRY": "syscall", + "syscall.PF_FLUSH": "syscall", + "syscall.PKCS_7_ASN_ENCODING": "syscall", + "syscall.PMC5_PIPELINE_FLUSH": "syscall", + "syscall.PRIO_PGRP": "syscall", + "syscall.PRIO_PROCESS": "syscall", + "syscall.PRIO_USER": "syscall", + "syscall.PRI_IOFLUSH": "syscall", + "syscall.PROCESS_QUERY_INFORMATION": "syscall", + "syscall.PROCESS_TERMINATE": "syscall", + "syscall.PROT_EXEC": "syscall", + "syscall.PROT_GROWSDOWN": "syscall", + "syscall.PROT_GROWSUP": "syscall", + "syscall.PROT_NONE": "syscall", + "syscall.PROT_READ": "syscall", + "syscall.PROT_WRITE": "syscall", + "syscall.PROV_DH_SCHANNEL": "syscall", + "syscall.PROV_DSS": "syscall", + "syscall.PROV_DSS_DH": "syscall", + "syscall.PROV_EC_ECDSA_FULL": "syscall", + "syscall.PROV_EC_ECDSA_SIG": "syscall", + "syscall.PROV_EC_ECNRA_FULL": "syscall", + "syscall.PROV_EC_ECNRA_SIG": "syscall", + "syscall.PROV_FORTEZZA": "syscall", + "syscall.PROV_INTEL_SEC": "syscall", + "syscall.PROV_MS_EXCHANGE": "syscall", + "syscall.PROV_REPLACE_OWF": "syscall", + "syscall.PROV_RNG": "syscall", + "syscall.PROV_RSA_AES": "syscall", + "syscall.PROV_RSA_FULL": "syscall", + "syscall.PROV_RSA_SCHANNEL": "syscall", + "syscall.PROV_RSA_SIG": "syscall", + "syscall.PROV_SPYRUS_LYNKS": "syscall", + "syscall.PROV_SSL": "syscall", + "syscall.PR_CAPBSET_DROP": "syscall", + "syscall.PR_CAPBSET_READ": "syscall", + "syscall.PR_CLEAR_SECCOMP_FILTER": "syscall", + "syscall.PR_ENDIAN_BIG": "syscall", + "syscall.PR_ENDIAN_LITTLE": "syscall", + "syscall.PR_ENDIAN_PPC_LITTLE": "syscall", + "syscall.PR_FPEMU_NOPRINT": "syscall", + "syscall.PR_FPEMU_SIGFPE": "syscall", + "syscall.PR_FP_EXC_ASYNC": "syscall", + "syscall.PR_FP_EXC_DISABLED": "syscall", + "syscall.PR_FP_EXC_DIV": "syscall", + "syscall.PR_FP_EXC_INV": "syscall", + "syscall.PR_FP_EXC_NONRECOV": "syscall", + "syscall.PR_FP_EXC_OVF": "syscall", + "syscall.PR_FP_EXC_PRECISE": "syscall", + "syscall.PR_FP_EXC_RES": "syscall", + "syscall.PR_FP_EXC_SW_ENABLE": "syscall", + "syscall.PR_FP_EXC_UND": "syscall", + "syscall.PR_GET_DUMPABLE": "syscall", + "syscall.PR_GET_ENDIAN": "syscall", + "syscall.PR_GET_FPEMU": "syscall", + "syscall.PR_GET_FPEXC": "syscall", + "syscall.PR_GET_KEEPCAPS": "syscall", + "syscall.PR_GET_NAME": "syscall", + "syscall.PR_GET_PDEATHSIG": "syscall", + "syscall.PR_GET_SECCOMP": "syscall", + "syscall.PR_GET_SECCOMP_FILTER": "syscall", + "syscall.PR_GET_SECUREBITS": "syscall", + "syscall.PR_GET_TIMERSLACK": "syscall", + "syscall.PR_GET_TIMING": "syscall", + "syscall.PR_GET_TSC": "syscall", + "syscall.PR_GET_UNALIGN": "syscall", + "syscall.PR_MCE_KILL": "syscall", + "syscall.PR_MCE_KILL_CLEAR": "syscall", + "syscall.PR_MCE_KILL_DEFAULT": "syscall", + "syscall.PR_MCE_KILL_EARLY": "syscall", + "syscall.PR_MCE_KILL_GET": "syscall", + "syscall.PR_MCE_KILL_LATE": "syscall", + "syscall.PR_MCE_KILL_SET": "syscall", + "syscall.PR_SECCOMP_FILTER_EVENT": "syscall", + "syscall.PR_SECCOMP_FILTER_SYSCALL": "syscall", + "syscall.PR_SET_DUMPABLE": "syscall", + "syscall.PR_SET_ENDIAN": "syscall", + "syscall.PR_SET_FPEMU": "syscall", + "syscall.PR_SET_FPEXC": "syscall", + "syscall.PR_SET_KEEPCAPS": "syscall", + "syscall.PR_SET_NAME": "syscall", + "syscall.PR_SET_PDEATHSIG": "syscall", + "syscall.PR_SET_PTRACER": "syscall", + "syscall.PR_SET_SECCOMP": "syscall", + "syscall.PR_SET_SECCOMP_FILTER": "syscall", + "syscall.PR_SET_SECUREBITS": "syscall", + "syscall.PR_SET_TIMERSLACK": "syscall", + "syscall.PR_SET_TIMING": "syscall", + "syscall.PR_SET_TSC": "syscall", + "syscall.PR_SET_UNALIGN": "syscall", + "syscall.PR_TASK_PERF_EVENTS_DISABLE": "syscall", + "syscall.PR_TASK_PERF_EVENTS_ENABLE": "syscall", + "syscall.PR_TIMING_STATISTICAL": "syscall", + "syscall.PR_TIMING_TIMESTAMP": "syscall", + "syscall.PR_TSC_ENABLE": "syscall", + "syscall.PR_TSC_SIGSEGV": "syscall", + "syscall.PR_UNALIGN_NOPRINT": "syscall", + "syscall.PR_UNALIGN_SIGBUS": "syscall", + "syscall.PTRACE_ARCH_PRCTL": "syscall", + "syscall.PTRACE_ATTACH": "syscall", + "syscall.PTRACE_CONT": "syscall", + "syscall.PTRACE_DETACH": "syscall", + "syscall.PTRACE_EVENT_CLONE": "syscall", + "syscall.PTRACE_EVENT_EXEC": "syscall", + "syscall.PTRACE_EVENT_EXIT": "syscall", + "syscall.PTRACE_EVENT_FORK": "syscall", + "syscall.PTRACE_EVENT_VFORK": "syscall", + "syscall.PTRACE_EVENT_VFORK_DONE": "syscall", + "syscall.PTRACE_GETCRUNCHREGS": "syscall", + "syscall.PTRACE_GETEVENTMSG": "syscall", + "syscall.PTRACE_GETFPREGS": "syscall", + "syscall.PTRACE_GETFPXREGS": "syscall", + "syscall.PTRACE_GETHBPREGS": "syscall", + "syscall.PTRACE_GETREGS": "syscall", + "syscall.PTRACE_GETREGSET": "syscall", + "syscall.PTRACE_GETSIGINFO": "syscall", + "syscall.PTRACE_GETVFPREGS": "syscall", + "syscall.PTRACE_GETWMMXREGS": "syscall", + "syscall.PTRACE_GET_THREAD_AREA": "syscall", + "syscall.PTRACE_KILL": "syscall", + "syscall.PTRACE_OLDSETOPTIONS": "syscall", + "syscall.PTRACE_O_MASK": "syscall", + "syscall.PTRACE_O_TRACECLONE": "syscall", + "syscall.PTRACE_O_TRACEEXEC": "syscall", + "syscall.PTRACE_O_TRACEEXIT": "syscall", + "syscall.PTRACE_O_TRACEFORK": "syscall", + "syscall.PTRACE_O_TRACESYSGOOD": "syscall", + "syscall.PTRACE_O_TRACEVFORK": "syscall", + "syscall.PTRACE_O_TRACEVFORKDONE": "syscall", + "syscall.PTRACE_PEEKDATA": "syscall", + "syscall.PTRACE_PEEKTEXT": "syscall", + "syscall.PTRACE_PEEKUSR": "syscall", + "syscall.PTRACE_POKEDATA": "syscall", + "syscall.PTRACE_POKETEXT": "syscall", + "syscall.PTRACE_POKEUSR": "syscall", + "syscall.PTRACE_SETCRUNCHREGS": "syscall", + "syscall.PTRACE_SETFPREGS": "syscall", + "syscall.PTRACE_SETFPXREGS": "syscall", + "syscall.PTRACE_SETHBPREGS": "syscall", + "syscall.PTRACE_SETOPTIONS": "syscall", + "syscall.PTRACE_SETREGS": "syscall", + "syscall.PTRACE_SETREGSET": "syscall", + "syscall.PTRACE_SETSIGINFO": "syscall", + "syscall.PTRACE_SETVFPREGS": "syscall", + "syscall.PTRACE_SETWMMXREGS": "syscall", + "syscall.PTRACE_SET_SYSCALL": "syscall", + "syscall.PTRACE_SET_THREAD_AREA": "syscall", + "syscall.PTRACE_SINGLEBLOCK": "syscall", + "syscall.PTRACE_SINGLESTEP": "syscall", + "syscall.PTRACE_SYSCALL": "syscall", + "syscall.PTRACE_SYSEMU": "syscall", + "syscall.PTRACE_SYSEMU_SINGLESTEP": "syscall", + "syscall.PTRACE_TRACEME": "syscall", + "syscall.PT_ATTACH": "syscall", + "syscall.PT_ATTACHEXC": "syscall", + "syscall.PT_CONTINUE": "syscall", + "syscall.PT_DATA_ADDR": "syscall", + "syscall.PT_DENY_ATTACH": "syscall", + "syscall.PT_DETACH": "syscall", + "syscall.PT_FIRSTMACH": "syscall", + "syscall.PT_FORCEQUOTA": "syscall", + "syscall.PT_KILL": "syscall", + "syscall.PT_MASK": "syscall", + "syscall.PT_READ_D": "syscall", + "syscall.PT_READ_I": "syscall", + "syscall.PT_READ_U": "syscall", + "syscall.PT_SIGEXC": "syscall", + "syscall.PT_STEP": "syscall", + "syscall.PT_TEXT_ADDR": "syscall", + "syscall.PT_TEXT_END_ADDR": "syscall", + "syscall.PT_THUPDATE": "syscall", + "syscall.PT_TRACE_ME": "syscall", + "syscall.PT_WRITE_D": "syscall", + "syscall.PT_WRITE_I": "syscall", + "syscall.PT_WRITE_U": "syscall", + "syscall.ParseDirent": "syscall", + "syscall.ParseNetlinkMessage": "syscall", + "syscall.ParseNetlinkRouteAttr": "syscall", + "syscall.ParseRoutingMessage": "syscall", + "syscall.ParseRoutingSockaddr": "syscall", + "syscall.ParseSocketControlMessage": "syscall", + "syscall.ParseUnixCredentials": "syscall", + "syscall.ParseUnixRights": "syscall", + "syscall.PathMax": "syscall", + "syscall.Pathconf": "syscall", + "syscall.Pause": "syscall", + "syscall.Pipe": "syscall", + "syscall.Pipe2": "syscall", + "syscall.PivotRoot": "syscall", + "syscall.PostQueuedCompletionStatus": "syscall", + "syscall.Pread": "syscall", + "syscall.Proc": "syscall", + "syscall.ProcAttr": "syscall", + "syscall.Process32First": "syscall", + "syscall.Process32Next": "syscall", + "syscall.ProcessEntry32": "syscall", + "syscall.ProcessInformation": "syscall", + "syscall.Protoent": "syscall", + "syscall.PtraceAttach": "syscall", + "syscall.PtraceCont": "syscall", + "syscall.PtraceDetach": "syscall", + "syscall.PtraceGetEventMsg": "syscall", + "syscall.PtraceGetRegs": "syscall", + "syscall.PtracePeekData": "syscall", + "syscall.PtracePeekText": "syscall", + "syscall.PtracePokeData": "syscall", + "syscall.PtracePokeText": "syscall", + "syscall.PtraceRegs": "syscall", + "syscall.PtraceSetOptions": "syscall", + "syscall.PtraceSetRegs": "syscall", + "syscall.PtraceSingleStep": "syscall", + "syscall.PtraceSyscall": "syscall", + "syscall.Pwrite": "syscall", + "syscall.REG_BINARY": "syscall", + "syscall.REG_DWORD": "syscall", + "syscall.REG_DWORD_BIG_ENDIAN": "syscall", + "syscall.REG_DWORD_LITTLE_ENDIAN": "syscall", + "syscall.REG_EXPAND_SZ": "syscall", + "syscall.REG_FULL_RESOURCE_DESCRIPTOR": "syscall", + "syscall.REG_LINK": "syscall", + "syscall.REG_MULTI_SZ": "syscall", + "syscall.REG_NONE": "syscall", + "syscall.REG_QWORD": "syscall", + "syscall.REG_QWORD_LITTLE_ENDIAN": "syscall", + "syscall.REG_RESOURCE_LIST": "syscall", + "syscall.REG_RESOURCE_REQUIREMENTS_LIST": "syscall", + "syscall.REG_SZ": "syscall", + "syscall.RLIMIT_AS": "syscall", + "syscall.RLIMIT_CORE": "syscall", + "syscall.RLIMIT_CPU": "syscall", + "syscall.RLIMIT_DATA": "syscall", + "syscall.RLIMIT_FSIZE": "syscall", + "syscall.RLIMIT_NOFILE": "syscall", + "syscall.RLIMIT_STACK": "syscall", + "syscall.RLIM_INFINITY": "syscall", + "syscall.RTAX_ADVMSS": "syscall", + "syscall.RTAX_AUTHOR": "syscall", + "syscall.RTAX_BRD": "syscall", + "syscall.RTAX_CWND": "syscall", + "syscall.RTAX_DST": "syscall", + "syscall.RTAX_FEATURES": "syscall", + "syscall.RTAX_FEATURE_ALLFRAG": "syscall", + "syscall.RTAX_FEATURE_ECN": "syscall", + "syscall.RTAX_FEATURE_SACK": "syscall", + "syscall.RTAX_FEATURE_TIMESTAMP": "syscall", + "syscall.RTAX_GATEWAY": "syscall", + "syscall.RTAX_GENMASK": "syscall", + "syscall.RTAX_HOPLIMIT": "syscall", + "syscall.RTAX_IFA": "syscall", + "syscall.RTAX_IFP": "syscall", + "syscall.RTAX_INITCWND": "syscall", + "syscall.RTAX_INITRWND": "syscall", + "syscall.RTAX_LABEL": "syscall", + "syscall.RTAX_LOCK": "syscall", + "syscall.RTAX_MAX": "syscall", + "syscall.RTAX_MTU": "syscall", + "syscall.RTAX_NETMASK": "syscall", + "syscall.RTAX_REORDERING": "syscall", + "syscall.RTAX_RTO_MIN": "syscall", + "syscall.RTAX_RTT": "syscall", + "syscall.RTAX_RTTVAR": "syscall", + "syscall.RTAX_SRC": "syscall", + "syscall.RTAX_SRCMASK": "syscall", + "syscall.RTAX_SSTHRESH": "syscall", + "syscall.RTAX_TAG": "syscall", + "syscall.RTAX_UNSPEC": "syscall", + "syscall.RTAX_WINDOW": "syscall", + "syscall.RTA_ALIGNTO": "syscall", + "syscall.RTA_AUTHOR": "syscall", + "syscall.RTA_BRD": "syscall", + "syscall.RTA_CACHEINFO": "syscall", + "syscall.RTA_DST": "syscall", + "syscall.RTA_FLOW": "syscall", + "syscall.RTA_GATEWAY": "syscall", + "syscall.RTA_GENMASK": "syscall", + "syscall.RTA_IFA": "syscall", + "syscall.RTA_IFP": "syscall", + "syscall.RTA_IIF": "syscall", + "syscall.RTA_LABEL": "syscall", + "syscall.RTA_MAX": "syscall", + "syscall.RTA_METRICS": "syscall", + "syscall.RTA_MULTIPATH": "syscall", + "syscall.RTA_NETMASK": "syscall", + "syscall.RTA_OIF": "syscall", + "syscall.RTA_PREFSRC": "syscall", + "syscall.RTA_PRIORITY": "syscall", + "syscall.RTA_SRC": "syscall", + "syscall.RTA_SRCMASK": "syscall", + "syscall.RTA_TABLE": "syscall", + "syscall.RTA_TAG": "syscall", + "syscall.RTA_UNSPEC": "syscall", + "syscall.RTCF_DIRECTSRC": "syscall", + "syscall.RTCF_DOREDIRECT": "syscall", + "syscall.RTCF_LOG": "syscall", + "syscall.RTCF_MASQ": "syscall", + "syscall.RTCF_NAT": "syscall", + "syscall.RTCF_VALVE": "syscall", + "syscall.RTF_ADDRCLASSMASK": "syscall", + "syscall.RTF_ADDRCONF": "syscall", + "syscall.RTF_ALLONLINK": "syscall", + "syscall.RTF_ANNOUNCE": "syscall", + "syscall.RTF_BLACKHOLE": "syscall", + "syscall.RTF_BROADCAST": "syscall", + "syscall.RTF_CACHE": "syscall", + "syscall.RTF_CLONED": "syscall", + "syscall.RTF_CLONING": "syscall", + "syscall.RTF_CONDEMNED": "syscall", + "syscall.RTF_DEFAULT": "syscall", + "syscall.RTF_DELCLONE": "syscall", + "syscall.RTF_DONE": "syscall", + "syscall.RTF_DYNAMIC": "syscall", + "syscall.RTF_FLOW": "syscall", + "syscall.RTF_FMASK": "syscall", + "syscall.RTF_GATEWAY": "syscall", + "syscall.RTF_GWFLAG_COMPAT": "syscall", + "syscall.RTF_HOST": "syscall", + "syscall.RTF_IFREF": "syscall", + "syscall.RTF_IFSCOPE": "syscall", + "syscall.RTF_INTERFACE": "syscall", + "syscall.RTF_IRTT": "syscall", + "syscall.RTF_LINKRT": "syscall", + "syscall.RTF_LLDATA": "syscall", + "syscall.RTF_LLINFO": "syscall", + "syscall.RTF_LOCAL": "syscall", + "syscall.RTF_MASK": "syscall", + "syscall.RTF_MODIFIED": "syscall", + "syscall.RTF_MPATH": "syscall", + "syscall.RTF_MPLS": "syscall", + "syscall.RTF_MSS": "syscall", + "syscall.RTF_MTU": "syscall", + "syscall.RTF_MULTICAST": "syscall", + "syscall.RTF_NAT": "syscall", + "syscall.RTF_NOFORWARD": "syscall", + "syscall.RTF_NONEXTHOP": "syscall", + "syscall.RTF_NOPMTUDISC": "syscall", + "syscall.RTF_PERMANENT_ARP": "syscall", + "syscall.RTF_PINNED": "syscall", + "syscall.RTF_POLICY": "syscall", + "syscall.RTF_PRCLONING": "syscall", + "syscall.RTF_PROTO1": "syscall", + "syscall.RTF_PROTO2": "syscall", + "syscall.RTF_PROTO3": "syscall", + "syscall.RTF_REINSTATE": "syscall", + "syscall.RTF_REJECT": "syscall", + "syscall.RTF_RNH_LOCKED": "syscall", + "syscall.RTF_SOURCE": "syscall", + "syscall.RTF_SRC": "syscall", + "syscall.RTF_STATIC": "syscall", + "syscall.RTF_STICKY": "syscall", + "syscall.RTF_THROW": "syscall", + "syscall.RTF_TUNNEL": "syscall", + "syscall.RTF_UP": "syscall", + "syscall.RTF_USETRAILERS": "syscall", + "syscall.RTF_WASCLONED": "syscall", + "syscall.RTF_WINDOW": "syscall", + "syscall.RTF_XRESOLVE": "syscall", + "syscall.RTM_ADD": "syscall", + "syscall.RTM_BASE": "syscall", + "syscall.RTM_CHANGE": "syscall", + "syscall.RTM_CHGADDR": "syscall", + "syscall.RTM_DELACTION": "syscall", + "syscall.RTM_DELADDR": "syscall", + "syscall.RTM_DELADDRLABEL": "syscall", + "syscall.RTM_DELETE": "syscall", + "syscall.RTM_DELLINK": "syscall", + "syscall.RTM_DELMADDR": "syscall", + "syscall.RTM_DELNEIGH": "syscall", + "syscall.RTM_DELQDISC": "syscall", + "syscall.RTM_DELROUTE": "syscall", + "syscall.RTM_DELRULE": "syscall", + "syscall.RTM_DELTCLASS": "syscall", + "syscall.RTM_DELTFILTER": "syscall", + "syscall.RTM_DESYNC": "syscall", + "syscall.RTM_F_CLONED": "syscall", + "syscall.RTM_F_EQUALIZE": "syscall", + "syscall.RTM_F_NOTIFY": "syscall", + "syscall.RTM_F_PREFIX": "syscall", + "syscall.RTM_GET": "syscall", + "syscall.RTM_GET2": "syscall", + "syscall.RTM_GETACTION": "syscall", + "syscall.RTM_GETADDR": "syscall", + "syscall.RTM_GETADDRLABEL": "syscall", + "syscall.RTM_GETANYCAST": "syscall", + "syscall.RTM_GETDCB": "syscall", + "syscall.RTM_GETLINK": "syscall", + "syscall.RTM_GETMULTICAST": "syscall", + "syscall.RTM_GETNEIGH": "syscall", + "syscall.RTM_GETNEIGHTBL": "syscall", + "syscall.RTM_GETQDISC": "syscall", + "syscall.RTM_GETROUTE": "syscall", + "syscall.RTM_GETRULE": "syscall", + "syscall.RTM_GETTCLASS": "syscall", + "syscall.RTM_GETTFILTER": "syscall", + "syscall.RTM_IEEE80211": "syscall", + "syscall.RTM_IFANNOUNCE": "syscall", + "syscall.RTM_IFINFO": "syscall", + "syscall.RTM_IFINFO2": "syscall", + "syscall.RTM_LLINFO_UPD": "syscall", + "syscall.RTM_LOCK": "syscall", + "syscall.RTM_LOSING": "syscall", + "syscall.RTM_MAX": "syscall", + "syscall.RTM_MAXSIZE": "syscall", + "syscall.RTM_MISS": "syscall", + "syscall.RTM_NEWACTION": "syscall", + "syscall.RTM_NEWADDR": "syscall", + "syscall.RTM_NEWADDRLABEL": "syscall", + "syscall.RTM_NEWLINK": "syscall", + "syscall.RTM_NEWMADDR": "syscall", + "syscall.RTM_NEWMADDR2": "syscall", + "syscall.RTM_NEWNDUSEROPT": "syscall", + "syscall.RTM_NEWNEIGH": "syscall", + "syscall.RTM_NEWNEIGHTBL": "syscall", + "syscall.RTM_NEWPREFIX": "syscall", + "syscall.RTM_NEWQDISC": "syscall", + "syscall.RTM_NEWROUTE": "syscall", + "syscall.RTM_NEWRULE": "syscall", + "syscall.RTM_NEWTCLASS": "syscall", + "syscall.RTM_NEWTFILTER": "syscall", + "syscall.RTM_NR_FAMILIES": "syscall", + "syscall.RTM_NR_MSGTYPES": "syscall", + "syscall.RTM_OIFINFO": "syscall", + "syscall.RTM_OLDADD": "syscall", + "syscall.RTM_OLDDEL": "syscall", + "syscall.RTM_OOIFINFO": "syscall", + "syscall.RTM_REDIRECT": "syscall", + "syscall.RTM_RESOLVE": "syscall", + "syscall.RTM_RTTUNIT": "syscall", + "syscall.RTM_SETDCB": "syscall", + "syscall.RTM_SETGATE": "syscall", + "syscall.RTM_SETLINK": "syscall", + "syscall.RTM_SETNEIGHTBL": "syscall", + "syscall.RTM_VERSION": "syscall", + "syscall.RTNH_ALIGNTO": "syscall", + "syscall.RTNH_F_DEAD": "syscall", + "syscall.RTNH_F_ONLINK": "syscall", + "syscall.RTNH_F_PERVASIVE": "syscall", + "syscall.RTNLGRP_IPV4_IFADDR": "syscall", + "syscall.RTNLGRP_IPV4_MROUTE": "syscall", + "syscall.RTNLGRP_IPV4_ROUTE": "syscall", + "syscall.RTNLGRP_IPV4_RULE": "syscall", + "syscall.RTNLGRP_IPV6_IFADDR": "syscall", + "syscall.RTNLGRP_IPV6_IFINFO": "syscall", + "syscall.RTNLGRP_IPV6_MROUTE": "syscall", + "syscall.RTNLGRP_IPV6_PREFIX": "syscall", + "syscall.RTNLGRP_IPV6_ROUTE": "syscall", + "syscall.RTNLGRP_IPV6_RULE": "syscall", + "syscall.RTNLGRP_LINK": "syscall", + "syscall.RTNLGRP_ND_USEROPT": "syscall", + "syscall.RTNLGRP_NEIGH": "syscall", + "syscall.RTNLGRP_NONE": "syscall", + "syscall.RTNLGRP_NOTIFY": "syscall", + "syscall.RTNLGRP_TC": "syscall", + "syscall.RTN_ANYCAST": "syscall", + "syscall.RTN_BLACKHOLE": "syscall", + "syscall.RTN_BROADCAST": "syscall", + "syscall.RTN_LOCAL": "syscall", + "syscall.RTN_MAX": "syscall", + "syscall.RTN_MULTICAST": "syscall", + "syscall.RTN_NAT": "syscall", + "syscall.RTN_PROHIBIT": "syscall", + "syscall.RTN_THROW": "syscall", + "syscall.RTN_UNICAST": "syscall", + "syscall.RTN_UNREACHABLE": "syscall", + "syscall.RTN_UNSPEC": "syscall", + "syscall.RTN_XRESOLVE": "syscall", + "syscall.RTPROT_BIRD": "syscall", + "syscall.RTPROT_BOOT": "syscall", + "syscall.RTPROT_DHCP": "syscall", + "syscall.RTPROT_DNROUTED": "syscall", + "syscall.RTPROT_GATED": "syscall", + "syscall.RTPROT_KERNEL": "syscall", + "syscall.RTPROT_MRT": "syscall", + "syscall.RTPROT_NTK": "syscall", + "syscall.RTPROT_RA": "syscall", + "syscall.RTPROT_REDIRECT": "syscall", + "syscall.RTPROT_STATIC": "syscall", + "syscall.RTPROT_UNSPEC": "syscall", + "syscall.RTPROT_XORP": "syscall", + "syscall.RTPROT_ZEBRA": "syscall", + "syscall.RTV_EXPIRE": "syscall", + "syscall.RTV_HOPCOUNT": "syscall", + "syscall.RTV_MTU": "syscall", + "syscall.RTV_RPIPE": "syscall", + "syscall.RTV_RTT": "syscall", + "syscall.RTV_RTTVAR": "syscall", + "syscall.RTV_SPIPE": "syscall", + "syscall.RTV_SSTHRESH": "syscall", + "syscall.RTV_WEIGHT": "syscall", + "syscall.RT_CACHING_CONTEXT": "syscall", + "syscall.RT_CLASS_DEFAULT": "syscall", + "syscall.RT_CLASS_LOCAL": "syscall", + "syscall.RT_CLASS_MAIN": "syscall", + "syscall.RT_CLASS_MAX": "syscall", + "syscall.RT_CLASS_UNSPEC": "syscall", + "syscall.RT_DEFAULT_FIB": "syscall", + "syscall.RT_NORTREF": "syscall", + "syscall.RT_SCOPE_HOST": "syscall", + "syscall.RT_SCOPE_LINK": "syscall", + "syscall.RT_SCOPE_NOWHERE": "syscall", + "syscall.RT_SCOPE_SITE": "syscall", + "syscall.RT_SCOPE_UNIVERSE": "syscall", + "syscall.RT_TABLEID_MAX": "syscall", + "syscall.RT_TABLE_COMPAT": "syscall", + "syscall.RT_TABLE_DEFAULT": "syscall", + "syscall.RT_TABLE_LOCAL": "syscall", + "syscall.RT_TABLE_MAIN": "syscall", + "syscall.RT_TABLE_MAX": "syscall", + "syscall.RT_TABLE_UNSPEC": "syscall", + "syscall.RUSAGE_CHILDREN": "syscall", + "syscall.RUSAGE_SELF": "syscall", + "syscall.RUSAGE_THREAD": "syscall", + "syscall.Radvisory_t": "syscall", + "syscall.RawSockaddr": "syscall", + "syscall.RawSockaddrAny": "syscall", + "syscall.RawSockaddrDatalink": "syscall", + "syscall.RawSockaddrInet4": "syscall", + "syscall.RawSockaddrInet6": "syscall", + "syscall.RawSockaddrLinklayer": "syscall", + "syscall.RawSockaddrNetlink": "syscall", + "syscall.RawSockaddrUnix": "syscall", + "syscall.RawSyscall": "syscall", + "syscall.RawSyscall6": "syscall", + "syscall.Read": "syscall", + "syscall.ReadConsole": "syscall", + "syscall.ReadDirectoryChanges": "syscall", + "syscall.ReadDirent": "syscall", + "syscall.ReadFile": "syscall", + "syscall.Readlink": "syscall", + "syscall.Reboot": "syscall", + "syscall.Recvfrom": "syscall", + "syscall.Recvmsg": "syscall", + "syscall.RegCloseKey": "syscall", + "syscall.RegEnumKeyEx": "syscall", + "syscall.RegOpenKeyEx": "syscall", + "syscall.RegQueryInfoKey": "syscall", + "syscall.RegQueryValueEx": "syscall", + "syscall.RemoveDirectory": "syscall", + "syscall.Removexattr": "syscall", + "syscall.Rename": "syscall", + "syscall.Renameat": "syscall", + "syscall.Revoke": "syscall", + "syscall.Rlimit": "syscall", + "syscall.Rmdir": "syscall", + "syscall.RouteMessage": "syscall", + "syscall.RouteRIB": "syscall", + "syscall.RtAttr": "syscall", + "syscall.RtGenmsg": "syscall", + "syscall.RtMetrics": "syscall", + "syscall.RtMsg": "syscall", + "syscall.RtMsghdr": "syscall", + "syscall.RtNexthop": "syscall", + "syscall.Rusage": "syscall", + "syscall.SCM_BINTIME": "syscall", + "syscall.SCM_CREDENTIALS": "syscall", + "syscall.SCM_CREDS": "syscall", + "syscall.SCM_RIGHTS": "syscall", + "syscall.SCM_TIMESTAMP": "syscall", + "syscall.SCM_TIMESTAMPING": "syscall", + "syscall.SCM_TIMESTAMPNS": "syscall", + "syscall.SCM_TIMESTAMP_MONOTONIC": "syscall", + "syscall.SHUT_RD": "syscall", + "syscall.SHUT_RDWR": "syscall", + "syscall.SHUT_WR": "syscall", + "syscall.SID": "syscall", + "syscall.SIDAndAttributes": "syscall", + "syscall.SIGABRT": "syscall", + "syscall.SIGALRM": "syscall", + "syscall.SIGBUS": "syscall", + "syscall.SIGCHLD": "syscall", + "syscall.SIGCLD": "syscall", + "syscall.SIGCONT": "syscall", + "syscall.SIGEMT": "syscall", + "syscall.SIGFPE": "syscall", + "syscall.SIGHUP": "syscall", + "syscall.SIGILL": "syscall", + "syscall.SIGINFO": "syscall", + "syscall.SIGINT": "syscall", + "syscall.SIGIO": "syscall", + "syscall.SIGIOT": "syscall", + "syscall.SIGKILL": "syscall", + "syscall.SIGLIBRT": "syscall", + "syscall.SIGLWP": "syscall", + "syscall.SIGPIPE": "syscall", + "syscall.SIGPOLL": "syscall", + "syscall.SIGPROF": "syscall", + "syscall.SIGPWR": "syscall", + "syscall.SIGQUIT": "syscall", + "syscall.SIGSEGV": "syscall", + "syscall.SIGSTKFLT": "syscall", + "syscall.SIGSTOP": "syscall", + "syscall.SIGSYS": "syscall", + "syscall.SIGTERM": "syscall", + "syscall.SIGTHR": "syscall", + "syscall.SIGTRAP": "syscall", + "syscall.SIGTSTP": "syscall", + "syscall.SIGTTIN": "syscall", + "syscall.SIGTTOU": "syscall", + "syscall.SIGUNUSED": "syscall", + "syscall.SIGURG": "syscall", + "syscall.SIGUSR1": "syscall", + "syscall.SIGUSR2": "syscall", + "syscall.SIGVTALRM": "syscall", + "syscall.SIGWINCH": "syscall", + "syscall.SIGXCPU": "syscall", + "syscall.SIGXFSZ": "syscall", + "syscall.SIOCADDDLCI": "syscall", + "syscall.SIOCADDMULTI": "syscall", + "syscall.SIOCADDRT": "syscall", + "syscall.SIOCAIFADDR": "syscall", + "syscall.SIOCAIFGROUP": "syscall", + "syscall.SIOCALIFADDR": "syscall", + "syscall.SIOCARPIPLL": "syscall", + "syscall.SIOCATMARK": "syscall", + "syscall.SIOCAUTOADDR": "syscall", + "syscall.SIOCAUTONETMASK": "syscall", + "syscall.SIOCBRDGADD": "syscall", + "syscall.SIOCBRDGADDS": "syscall", + "syscall.SIOCBRDGARL": "syscall", + "syscall.SIOCBRDGDADDR": "syscall", + "syscall.SIOCBRDGDEL": "syscall", + "syscall.SIOCBRDGDELS": "syscall", + "syscall.SIOCBRDGFLUSH": "syscall", + "syscall.SIOCBRDGFRL": "syscall", + "syscall.SIOCBRDGGCACHE": "syscall", + "syscall.SIOCBRDGGFD": "syscall", + "syscall.SIOCBRDGGHT": "syscall", + "syscall.SIOCBRDGGIFFLGS": "syscall", + "syscall.SIOCBRDGGMA": "syscall", + "syscall.SIOCBRDGGPARAM": "syscall", + "syscall.SIOCBRDGGPRI": "syscall", + "syscall.SIOCBRDGGRL": "syscall", + "syscall.SIOCBRDGGSIFS": "syscall", + "syscall.SIOCBRDGGTO": "syscall", + "syscall.SIOCBRDGIFS": "syscall", + "syscall.SIOCBRDGRTS": "syscall", + "syscall.SIOCBRDGSADDR": "syscall", + "syscall.SIOCBRDGSCACHE": "syscall", + "syscall.SIOCBRDGSFD": "syscall", + "syscall.SIOCBRDGSHT": "syscall", + "syscall.SIOCBRDGSIFCOST": "syscall", + "syscall.SIOCBRDGSIFFLGS": "syscall", + "syscall.SIOCBRDGSIFPRIO": "syscall", + "syscall.SIOCBRDGSMA": "syscall", + "syscall.SIOCBRDGSPRI": "syscall", + "syscall.SIOCBRDGSPROTO": "syscall", + "syscall.SIOCBRDGSTO": "syscall", + "syscall.SIOCBRDGSTXHC": "syscall", + "syscall.SIOCDARP": "syscall", + "syscall.SIOCDELDLCI": "syscall", + "syscall.SIOCDELMULTI": "syscall", + "syscall.SIOCDELRT": "syscall", + "syscall.SIOCDEVPRIVATE": "syscall", + "syscall.SIOCDIFADDR": "syscall", + "syscall.SIOCDIFGROUP": "syscall", + "syscall.SIOCDIFPHYADDR": "syscall", + "syscall.SIOCDLIFADDR": "syscall", + "syscall.SIOCDRARP": "syscall", + "syscall.SIOCGARP": "syscall", + "syscall.SIOCGDRVSPEC": "syscall", + "syscall.SIOCGETKALIVE": "syscall", + "syscall.SIOCGETLABEL": "syscall", + "syscall.SIOCGETPFLOW": "syscall", + "syscall.SIOCGETPFSYNC": "syscall", + "syscall.SIOCGETSGCNT": "syscall", + "syscall.SIOCGETVIFCNT": "syscall", + "syscall.SIOCGETVLAN": "syscall", + "syscall.SIOCGHIWAT": "syscall", + "syscall.SIOCGIFADDR": "syscall", + "syscall.SIOCGIFADDRPREF": "syscall", + "syscall.SIOCGIFALIAS": "syscall", + "syscall.SIOCGIFALTMTU": "syscall", + "syscall.SIOCGIFASYNCMAP": "syscall", + "syscall.SIOCGIFBOND": "syscall", + "syscall.SIOCGIFBR": "syscall", + "syscall.SIOCGIFBRDADDR": "syscall", + "syscall.SIOCGIFCAP": "syscall", + "syscall.SIOCGIFCONF": "syscall", + "syscall.SIOCGIFCOUNT": "syscall", + "syscall.SIOCGIFDATA": "syscall", + "syscall.SIOCGIFDESCR": "syscall", + "syscall.SIOCGIFDEVMTU": "syscall", + "syscall.SIOCGIFDLT": "syscall", + "syscall.SIOCGIFDSTADDR": "syscall", + "syscall.SIOCGIFENCAP": "syscall", + "syscall.SIOCGIFFIB": "syscall", + "syscall.SIOCGIFFLAGS": "syscall", + "syscall.SIOCGIFGATTR": "syscall", + "syscall.SIOCGIFGENERIC": "syscall", + "syscall.SIOCGIFGMEMB": "syscall", + "syscall.SIOCGIFGROUP": "syscall", + "syscall.SIOCGIFHARDMTU": "syscall", + "syscall.SIOCGIFHWADDR": "syscall", + "syscall.SIOCGIFINDEX": "syscall", + "syscall.SIOCGIFKPI": "syscall", + "syscall.SIOCGIFMAC": "syscall", + "syscall.SIOCGIFMAP": "syscall", + "syscall.SIOCGIFMEDIA": "syscall", + "syscall.SIOCGIFMEM": "syscall", + "syscall.SIOCGIFMETRIC": "syscall", + "syscall.SIOCGIFMTU": "syscall", + "syscall.SIOCGIFNAME": "syscall", + "syscall.SIOCGIFNETMASK": "syscall", + "syscall.SIOCGIFPDSTADDR": "syscall", + "syscall.SIOCGIFPFLAGS": "syscall", + "syscall.SIOCGIFPHYS": "syscall", + "syscall.SIOCGIFPRIORITY": "syscall", + "syscall.SIOCGIFPSRCADDR": "syscall", + "syscall.SIOCGIFRDOMAIN": "syscall", + "syscall.SIOCGIFRTLABEL": "syscall", + "syscall.SIOCGIFSLAVE": "syscall", + "syscall.SIOCGIFSTATUS": "syscall", + "syscall.SIOCGIFTIMESLOT": "syscall", + "syscall.SIOCGIFTXQLEN": "syscall", + "syscall.SIOCGIFVLAN": "syscall", + "syscall.SIOCGIFWAKEFLAGS": "syscall", + "syscall.SIOCGIFXFLAGS": "syscall", + "syscall.SIOCGLIFADDR": "syscall", + "syscall.SIOCGLIFPHYADDR": "syscall", + "syscall.SIOCGLIFPHYRTABLE": "syscall", + "syscall.SIOCGLIFPHYTTL": "syscall", + "syscall.SIOCGLINKSTR": "syscall", + "syscall.SIOCGLOWAT": "syscall", + "syscall.SIOCGPGRP": "syscall", + "syscall.SIOCGPRIVATE_0": "syscall", + "syscall.SIOCGPRIVATE_1": "syscall", + "syscall.SIOCGRARP": "syscall", + "syscall.SIOCGSPPPPARAMS": "syscall", + "syscall.SIOCGSTAMP": "syscall", + "syscall.SIOCGSTAMPNS": "syscall", + "syscall.SIOCGVH": "syscall", + "syscall.SIOCGVNETID": "syscall", + "syscall.SIOCIFCREATE": "syscall", + "syscall.SIOCIFCREATE2": "syscall", + "syscall.SIOCIFDESTROY": "syscall", + "syscall.SIOCIFGCLONERS": "syscall", + "syscall.SIOCINITIFADDR": "syscall", + "syscall.SIOCPROTOPRIVATE": "syscall", + "syscall.SIOCRSLVMULTI": "syscall", + "syscall.SIOCRTMSG": "syscall", + "syscall.SIOCSARP": "syscall", + "syscall.SIOCSDRVSPEC": "syscall", + "syscall.SIOCSETKALIVE": "syscall", + "syscall.SIOCSETLABEL": "syscall", + "syscall.SIOCSETPFLOW": "syscall", + "syscall.SIOCSETPFSYNC": "syscall", + "syscall.SIOCSETVLAN": "syscall", + "syscall.SIOCSHIWAT": "syscall", + "syscall.SIOCSIFADDR": "syscall", + "syscall.SIOCSIFADDRPREF": "syscall", + "syscall.SIOCSIFALTMTU": "syscall", + "syscall.SIOCSIFASYNCMAP": "syscall", + "syscall.SIOCSIFBOND": "syscall", + "syscall.SIOCSIFBR": "syscall", + "syscall.SIOCSIFBRDADDR": "syscall", + "syscall.SIOCSIFCAP": "syscall", + "syscall.SIOCSIFDESCR": "syscall", + "syscall.SIOCSIFDSTADDR": "syscall", + "syscall.SIOCSIFENCAP": "syscall", + "syscall.SIOCSIFFIB": "syscall", + "syscall.SIOCSIFFLAGS": "syscall", + "syscall.SIOCSIFGATTR": "syscall", + "syscall.SIOCSIFGENERIC": "syscall", + "syscall.SIOCSIFHWADDR": "syscall", + "syscall.SIOCSIFHWBROADCAST": "syscall", + "syscall.SIOCSIFKPI": "syscall", + "syscall.SIOCSIFLINK": "syscall", + "syscall.SIOCSIFLLADDR": "syscall", + "syscall.SIOCSIFMAC": "syscall", + "syscall.SIOCSIFMAP": "syscall", + "syscall.SIOCSIFMEDIA": "syscall", + "syscall.SIOCSIFMEM": "syscall", + "syscall.SIOCSIFMETRIC": "syscall", + "syscall.SIOCSIFMTU": "syscall", + "syscall.SIOCSIFNAME": "syscall", + "syscall.SIOCSIFNETMASK": "syscall", + "syscall.SIOCSIFPFLAGS": "syscall", + "syscall.SIOCSIFPHYADDR": "syscall", + "syscall.SIOCSIFPHYS": "syscall", + "syscall.SIOCSIFPRIORITY": "syscall", + "syscall.SIOCSIFRDOMAIN": "syscall", + "syscall.SIOCSIFRTLABEL": "syscall", + "syscall.SIOCSIFRVNET": "syscall", + "syscall.SIOCSIFSLAVE": "syscall", + "syscall.SIOCSIFTIMESLOT": "syscall", + "syscall.SIOCSIFTXQLEN": "syscall", + "syscall.SIOCSIFVLAN": "syscall", + "syscall.SIOCSIFVNET": "syscall", + "syscall.SIOCSIFXFLAGS": "syscall", + "syscall.SIOCSLIFPHYADDR": "syscall", + "syscall.SIOCSLIFPHYRTABLE": "syscall", + "syscall.SIOCSLIFPHYTTL": "syscall", + "syscall.SIOCSLINKSTR": "syscall", + "syscall.SIOCSLOWAT": "syscall", + "syscall.SIOCSPGRP": "syscall", + "syscall.SIOCSRARP": "syscall", + "syscall.SIOCSSPPPPARAMS": "syscall", + "syscall.SIOCSVH": "syscall", + "syscall.SIOCSVNETID": "syscall", + "syscall.SIOCZIFDATA": "syscall", + "syscall.SIO_GET_EXTENSION_FUNCTION_POINTER": "syscall", + "syscall.SIO_GET_INTERFACE_LIST": "syscall", + "syscall.SIO_KEEPALIVE_VALS": "syscall", + "syscall.SIO_UDP_CONNRESET": "syscall", + "syscall.SOCK_CLOEXEC": "syscall", + "syscall.SOCK_DCCP": "syscall", + "syscall.SOCK_DGRAM": "syscall", + "syscall.SOCK_FLAGS_MASK": "syscall", + "syscall.SOCK_MAXADDRLEN": "syscall", + "syscall.SOCK_NONBLOCK": "syscall", + "syscall.SOCK_NOSIGPIPE": "syscall", + "syscall.SOCK_PACKET": "syscall", + "syscall.SOCK_RAW": "syscall", + "syscall.SOCK_RDM": "syscall", + "syscall.SOCK_SEQPACKET": "syscall", + "syscall.SOCK_STREAM": "syscall", + "syscall.SOL_AAL": "syscall", + "syscall.SOL_ATM": "syscall", + "syscall.SOL_DECNET": "syscall", + "syscall.SOL_ICMPV6": "syscall", + "syscall.SOL_IP": "syscall", + "syscall.SOL_IPV6": "syscall", + "syscall.SOL_IRDA": "syscall", + "syscall.SOL_PACKET": "syscall", + "syscall.SOL_RAW": "syscall", + "syscall.SOL_SOCKET": "syscall", + "syscall.SOL_TCP": "syscall", + "syscall.SOL_X25": "syscall", + "syscall.SOMAXCONN": "syscall", + "syscall.SO_ACCEPTCONN": "syscall", + "syscall.SO_ACCEPTFILTER": "syscall", + "syscall.SO_ATTACH_FILTER": "syscall", + "syscall.SO_BINDANY": "syscall", + "syscall.SO_BINDTODEVICE": "syscall", + "syscall.SO_BINTIME": "syscall", + "syscall.SO_BROADCAST": "syscall", + "syscall.SO_BSDCOMPAT": "syscall", + "syscall.SO_DEBUG": "syscall", + "syscall.SO_DETACH_FILTER": "syscall", + "syscall.SO_DOMAIN": "syscall", + "syscall.SO_DONTROUTE": "syscall", + "syscall.SO_DONTTRUNC": "syscall", + "syscall.SO_ERROR": "syscall", + "syscall.SO_KEEPALIVE": "syscall", + "syscall.SO_LABEL": "syscall", + "syscall.SO_LINGER": "syscall", + "syscall.SO_LINGER_SEC": "syscall", + "syscall.SO_LISTENINCQLEN": "syscall", + "syscall.SO_LISTENQLEN": "syscall", + "syscall.SO_LISTENQLIMIT": "syscall", + "syscall.SO_MARK": "syscall", + "syscall.SO_NETPROC": "syscall", + "syscall.SO_NKE": "syscall", + "syscall.SO_NOADDRERR": "syscall", + "syscall.SO_NOHEADER": "syscall", + "syscall.SO_NOSIGPIPE": "syscall", + "syscall.SO_NOTIFYCONFLICT": "syscall", + "syscall.SO_NO_CHECK": "syscall", + "syscall.SO_NO_DDP": "syscall", + "syscall.SO_NO_OFFLOAD": "syscall", + "syscall.SO_NP_EXTENSIONS": "syscall", + "syscall.SO_NREAD": "syscall", + "syscall.SO_NWRITE": "syscall", + "syscall.SO_OOBINLINE": "syscall", + "syscall.SO_OVERFLOWED": "syscall", + "syscall.SO_PASSCRED": "syscall", + "syscall.SO_PASSSEC": "syscall", + "syscall.SO_PEERCRED": "syscall", + "syscall.SO_PEERLABEL": "syscall", + "syscall.SO_PEERNAME": "syscall", + "syscall.SO_PEERSEC": "syscall", + "syscall.SO_PRIORITY": "syscall", + "syscall.SO_PROTOCOL": "syscall", + "syscall.SO_PROTOTYPE": "syscall", + "syscall.SO_RANDOMPORT": "syscall", + "syscall.SO_RCVBUF": "syscall", + "syscall.SO_RCVBUFFORCE": "syscall", + "syscall.SO_RCVLOWAT": "syscall", + "syscall.SO_RCVTIMEO": "syscall", + "syscall.SO_RESTRICTIONS": "syscall", + "syscall.SO_RESTRICT_DENYIN": "syscall", + "syscall.SO_RESTRICT_DENYOUT": "syscall", + "syscall.SO_RESTRICT_DENYSET": "syscall", + "syscall.SO_REUSEADDR": "syscall", + "syscall.SO_REUSEPORT": "syscall", + "syscall.SO_REUSESHAREUID": "syscall", + "syscall.SO_RTABLE": "syscall", + "syscall.SO_RXQ_OVFL": "syscall", + "syscall.SO_SECURITY_AUTHENTICATION": "syscall", + "syscall.SO_SECURITY_ENCRYPTION_NETWORK": "syscall", + "syscall.SO_SECURITY_ENCRYPTION_TRANSPORT": "syscall", + "syscall.SO_SETFIB": "syscall", + "syscall.SO_SNDBUF": "syscall", + "syscall.SO_SNDBUFFORCE": "syscall", + "syscall.SO_SNDLOWAT": "syscall", + "syscall.SO_SNDTIMEO": "syscall", + "syscall.SO_SPLICE": "syscall", + "syscall.SO_TIMESTAMP": "syscall", + "syscall.SO_TIMESTAMPING": "syscall", + "syscall.SO_TIMESTAMPNS": "syscall", + "syscall.SO_TIMESTAMP_MONOTONIC": "syscall", + "syscall.SO_TYPE": "syscall", + "syscall.SO_UPCALLCLOSEWAIT": "syscall", + "syscall.SO_UPDATE_ACCEPT_CONTEXT": "syscall", + "syscall.SO_UPDATE_CONNECT_CONTEXT": "syscall", + "syscall.SO_USELOOPBACK": "syscall", + "syscall.SO_USER_COOKIE": "syscall", + "syscall.SO_VENDOR": "syscall", + "syscall.SO_WANTMORE": "syscall", + "syscall.SO_WANTOOBFLAG": "syscall", + "syscall.SSLExtraCertChainPolicyPara": "syscall", + "syscall.STANDARD_RIGHTS_ALL": "syscall", + "syscall.STANDARD_RIGHTS_EXECUTE": "syscall", + "syscall.STANDARD_RIGHTS_READ": "syscall", + "syscall.STANDARD_RIGHTS_REQUIRED": "syscall", + "syscall.STANDARD_RIGHTS_WRITE": "syscall", + "syscall.STARTF_USESHOWWINDOW": "syscall", + "syscall.STARTF_USESTDHANDLES": "syscall", + "syscall.STD_ERROR_HANDLE": "syscall", + "syscall.STD_INPUT_HANDLE": "syscall", + "syscall.STD_OUTPUT_HANDLE": "syscall", + "syscall.SUBLANG_ENGLISH_US": "syscall", + "syscall.SW_FORCEMINIMIZE": "syscall", + "syscall.SW_HIDE": "syscall", + "syscall.SW_MAXIMIZE": "syscall", + "syscall.SW_MINIMIZE": "syscall", + "syscall.SW_NORMAL": "syscall", + "syscall.SW_RESTORE": "syscall", + "syscall.SW_SHOW": "syscall", + "syscall.SW_SHOWDEFAULT": "syscall", + "syscall.SW_SHOWMAXIMIZED": "syscall", + "syscall.SW_SHOWMINIMIZED": "syscall", + "syscall.SW_SHOWMINNOACTIVE": "syscall", + "syscall.SW_SHOWNA": "syscall", + "syscall.SW_SHOWNOACTIVATE": "syscall", + "syscall.SW_SHOWNORMAL": "syscall", + "syscall.SYMBOLIC_LINK_FLAG_DIRECTORY": "syscall", + "syscall.SYNCHRONIZE": "syscall", + "syscall.SYSCTL_VERSION": "syscall", + "syscall.SYSCTL_VERS_0": "syscall", + "syscall.SYSCTL_VERS_1": "syscall", + "syscall.SYSCTL_VERS_MASK": "syscall", + "syscall.SYS_ABORT2": "syscall", + "syscall.SYS_ACCEPT": "syscall", + "syscall.SYS_ACCEPT4": "syscall", + "syscall.SYS_ACCEPT_NOCANCEL": "syscall", + "syscall.SYS_ACCESS": "syscall", + "syscall.SYS_ACCESS_EXTENDED": "syscall", + "syscall.SYS_ACCT": "syscall", + "syscall.SYS_ADD_KEY": "syscall", + "syscall.SYS_ADD_PROFIL": "syscall", + "syscall.SYS_ADJFREQ": "syscall", + "syscall.SYS_ADJTIME": "syscall", + "syscall.SYS_ADJTIMEX": "syscall", + "syscall.SYS_AFS_SYSCALL": "syscall", + "syscall.SYS_AIO_CANCEL": "syscall", + "syscall.SYS_AIO_ERROR": "syscall", + "syscall.SYS_AIO_FSYNC": "syscall", + "syscall.SYS_AIO_READ": "syscall", + "syscall.SYS_AIO_RETURN": "syscall", + "syscall.SYS_AIO_SUSPEND": "syscall", + "syscall.SYS_AIO_SUSPEND_NOCANCEL": "syscall", + "syscall.SYS_AIO_WRITE": "syscall", + "syscall.SYS_ALARM": "syscall", + "syscall.SYS_ARCH_PRCTL": "syscall", + "syscall.SYS_ARM_FADVISE64_64": "syscall", + "syscall.SYS_ARM_SYNC_FILE_RANGE": "syscall", + "syscall.SYS_ATGETMSG": "syscall", + "syscall.SYS_ATPGETREQ": "syscall", + "syscall.SYS_ATPGETRSP": "syscall", + "syscall.SYS_ATPSNDREQ": "syscall", + "syscall.SYS_ATPSNDRSP": "syscall", + "syscall.SYS_ATPUTMSG": "syscall", + "syscall.SYS_ATSOCKET": "syscall", + "syscall.SYS_AUDIT": "syscall", + "syscall.SYS_AUDITCTL": "syscall", + "syscall.SYS_AUDITON": "syscall", + "syscall.SYS_AUDIT_SESSION_JOIN": "syscall", + "syscall.SYS_AUDIT_SESSION_PORT": "syscall", + "syscall.SYS_AUDIT_SESSION_SELF": "syscall", + "syscall.SYS_BDFLUSH": "syscall", + "syscall.SYS_BIND": "syscall", + "syscall.SYS_BINDAT": "syscall", + "syscall.SYS_BREAK": "syscall", + "syscall.SYS_BRK": "syscall", + "syscall.SYS_BSDTHREAD_CREATE": "syscall", + "syscall.SYS_BSDTHREAD_REGISTER": "syscall", + "syscall.SYS_BSDTHREAD_TERMINATE": "syscall", + "syscall.SYS_CAPGET": "syscall", + "syscall.SYS_CAPSET": "syscall", + "syscall.SYS_CAP_ENTER": "syscall", + "syscall.SYS_CAP_FCNTLS_GET": "syscall", + "syscall.SYS_CAP_FCNTLS_LIMIT": "syscall", + "syscall.SYS_CAP_GETMODE": "syscall", + "syscall.SYS_CAP_GETRIGHTS": "syscall", + "syscall.SYS_CAP_IOCTLS_GET": "syscall", + "syscall.SYS_CAP_IOCTLS_LIMIT": "syscall", + "syscall.SYS_CAP_NEW": "syscall", + "syscall.SYS_CAP_RIGHTS_GET": "syscall", + "syscall.SYS_CAP_RIGHTS_LIMIT": "syscall", + "syscall.SYS_CHDIR": "syscall", + "syscall.SYS_CHFLAGS": "syscall", + "syscall.SYS_CHFLAGSAT": "syscall", + "syscall.SYS_CHMOD": "syscall", + "syscall.SYS_CHMOD_EXTENDED": "syscall", + "syscall.SYS_CHOWN": "syscall", + "syscall.SYS_CHOWN32": "syscall", + "syscall.SYS_CHROOT": "syscall", + "syscall.SYS_CHUD": "syscall", + "syscall.SYS_CLOCK_ADJTIME": "syscall", + "syscall.SYS_CLOCK_GETCPUCLOCKID2": "syscall", + "syscall.SYS_CLOCK_GETRES": "syscall", + "syscall.SYS_CLOCK_GETTIME": "syscall", + "syscall.SYS_CLOCK_NANOSLEEP": "syscall", + "syscall.SYS_CLOCK_SETTIME": "syscall", + "syscall.SYS_CLONE": "syscall", + "syscall.SYS_CLOSE": "syscall", + "syscall.SYS_CLOSEFROM": "syscall", + "syscall.SYS_CLOSE_NOCANCEL": "syscall", + "syscall.SYS_CONNECT": "syscall", + "syscall.SYS_CONNECTAT": "syscall", + "syscall.SYS_CONNECT_NOCANCEL": "syscall", + "syscall.SYS_COPYFILE": "syscall", + "syscall.SYS_CPUSET": "syscall", + "syscall.SYS_CPUSET_GETAFFINITY": "syscall", + "syscall.SYS_CPUSET_GETID": "syscall", + "syscall.SYS_CPUSET_SETAFFINITY": "syscall", + "syscall.SYS_CPUSET_SETID": "syscall", + "syscall.SYS_CREAT": "syscall", + "syscall.SYS_CREATE_MODULE": "syscall", + "syscall.SYS_CSOPS": "syscall", + "syscall.SYS_DELETE": "syscall", + "syscall.SYS_DELETE_MODULE": "syscall", + "syscall.SYS_DUP": "syscall", + "syscall.SYS_DUP2": "syscall", + "syscall.SYS_DUP3": "syscall", + "syscall.SYS_EACCESS": "syscall", + "syscall.SYS_EPOLL_CREATE": "syscall", + "syscall.SYS_EPOLL_CREATE1": "syscall", + "syscall.SYS_EPOLL_CTL": "syscall", + "syscall.SYS_EPOLL_CTL_OLD": "syscall", + "syscall.SYS_EPOLL_PWAIT": "syscall", + "syscall.SYS_EPOLL_WAIT": "syscall", + "syscall.SYS_EPOLL_WAIT_OLD": "syscall", + "syscall.SYS_EVENTFD": "syscall", + "syscall.SYS_EVENTFD2": "syscall", + "syscall.SYS_EXCHANGEDATA": "syscall", + "syscall.SYS_EXECVE": "syscall", + "syscall.SYS_EXIT": "syscall", + "syscall.SYS_EXIT_GROUP": "syscall", + "syscall.SYS_EXTATTRCTL": "syscall", + "syscall.SYS_EXTATTR_DELETE_FD": "syscall", + "syscall.SYS_EXTATTR_DELETE_FILE": "syscall", + "syscall.SYS_EXTATTR_DELETE_LINK": "syscall", + "syscall.SYS_EXTATTR_GET_FD": "syscall", + "syscall.SYS_EXTATTR_GET_FILE": "syscall", + "syscall.SYS_EXTATTR_GET_LINK": "syscall", + "syscall.SYS_EXTATTR_LIST_FD": "syscall", + "syscall.SYS_EXTATTR_LIST_FILE": "syscall", + "syscall.SYS_EXTATTR_LIST_LINK": "syscall", + "syscall.SYS_EXTATTR_SET_FD": "syscall", + "syscall.SYS_EXTATTR_SET_FILE": "syscall", + "syscall.SYS_EXTATTR_SET_LINK": "syscall", + "syscall.SYS_FACCESSAT": "syscall", + "syscall.SYS_FADVISE64": "syscall", + "syscall.SYS_FADVISE64_64": "syscall", + "syscall.SYS_FALLOCATE": "syscall", + "syscall.SYS_FANOTIFY_INIT": "syscall", + "syscall.SYS_FANOTIFY_MARK": "syscall", + "syscall.SYS_FCHDIR": "syscall", + "syscall.SYS_FCHFLAGS": "syscall", + "syscall.SYS_FCHMOD": "syscall", + "syscall.SYS_FCHMODAT": "syscall", + "syscall.SYS_FCHMOD_EXTENDED": "syscall", + "syscall.SYS_FCHOWN": "syscall", + "syscall.SYS_FCHOWN32": "syscall", + "syscall.SYS_FCHOWNAT": "syscall", + "syscall.SYS_FCHROOT": "syscall", + "syscall.SYS_FCNTL": "syscall", + "syscall.SYS_FCNTL64": "syscall", + "syscall.SYS_FCNTL_NOCANCEL": "syscall", + "syscall.SYS_FDATASYNC": "syscall", + "syscall.SYS_FEXECVE": "syscall", + "syscall.SYS_FFCLOCK_GETCOUNTER": "syscall", + "syscall.SYS_FFCLOCK_GETESTIMATE": "syscall", + "syscall.SYS_FFCLOCK_SETESTIMATE": "syscall", + "syscall.SYS_FFSCTL": "syscall", + "syscall.SYS_FGETATTRLIST": "syscall", + "syscall.SYS_FGETXATTR": "syscall", + "syscall.SYS_FHOPEN": "syscall", + "syscall.SYS_FHSTAT": "syscall", + "syscall.SYS_FHSTATFS": "syscall", + "syscall.SYS_FILEPORT_MAKEFD": "syscall", + "syscall.SYS_FILEPORT_MAKEPORT": "syscall", + "syscall.SYS_FKTRACE": "syscall", + "syscall.SYS_FLISTXATTR": "syscall", + "syscall.SYS_FLOCK": "syscall", + "syscall.SYS_FORK": "syscall", + "syscall.SYS_FPATHCONF": "syscall", + "syscall.SYS_FREEBSD6_FTRUNCATE": "syscall", + "syscall.SYS_FREEBSD6_LSEEK": "syscall", + "syscall.SYS_FREEBSD6_MMAP": "syscall", + "syscall.SYS_FREEBSD6_PREAD": "syscall", + "syscall.SYS_FREEBSD6_PWRITE": "syscall", + "syscall.SYS_FREEBSD6_TRUNCATE": "syscall", + "syscall.SYS_FREMOVEXATTR": "syscall", + "syscall.SYS_FSCTL": "syscall", + "syscall.SYS_FSETATTRLIST": "syscall", + "syscall.SYS_FSETXATTR": "syscall", + "syscall.SYS_FSGETPATH": "syscall", + "syscall.SYS_FSTAT": "syscall", + "syscall.SYS_FSTAT64": "syscall", + "syscall.SYS_FSTAT64_EXTENDED": "syscall", + "syscall.SYS_FSTATAT": "syscall", + "syscall.SYS_FSTATAT64": "syscall", + "syscall.SYS_FSTATFS": "syscall", + "syscall.SYS_FSTATFS64": "syscall", + "syscall.SYS_FSTATV": "syscall", + "syscall.SYS_FSTATVFS1": "syscall", + "syscall.SYS_FSTAT_EXTENDED": "syscall", + "syscall.SYS_FSYNC": "syscall", + "syscall.SYS_FSYNC_NOCANCEL": "syscall", + "syscall.SYS_FSYNC_RANGE": "syscall", + "syscall.SYS_FTIME": "syscall", + "syscall.SYS_FTRUNCATE": "syscall", + "syscall.SYS_FTRUNCATE64": "syscall", + "syscall.SYS_FUTEX": "syscall", + "syscall.SYS_FUTIMENS": "syscall", + "syscall.SYS_FUTIMES": "syscall", + "syscall.SYS_FUTIMESAT": "syscall", + "syscall.SYS_GETATTRLIST": "syscall", + "syscall.SYS_GETAUDIT": "syscall", + "syscall.SYS_GETAUDIT_ADDR": "syscall", + "syscall.SYS_GETAUID": "syscall", + "syscall.SYS_GETCONTEXT": "syscall", + "syscall.SYS_GETCPU": "syscall", + "syscall.SYS_GETCWD": "syscall", + "syscall.SYS_GETDENTS": "syscall", + "syscall.SYS_GETDENTS64": "syscall", + "syscall.SYS_GETDIRENTRIES": "syscall", + "syscall.SYS_GETDIRENTRIES64": "syscall", + "syscall.SYS_GETDIRENTRIESATTR": "syscall", + "syscall.SYS_GETDTABLECOUNT": "syscall", + "syscall.SYS_GETDTABLESIZE": "syscall", + "syscall.SYS_GETEGID": "syscall", + "syscall.SYS_GETEGID32": "syscall", + "syscall.SYS_GETEUID": "syscall", + "syscall.SYS_GETEUID32": "syscall", + "syscall.SYS_GETFH": "syscall", + "syscall.SYS_GETFSSTAT": "syscall", + "syscall.SYS_GETFSSTAT64": "syscall", + "syscall.SYS_GETGID": "syscall", + "syscall.SYS_GETGID32": "syscall", + "syscall.SYS_GETGROUPS": "syscall", + "syscall.SYS_GETGROUPS32": "syscall", + "syscall.SYS_GETHOSTUUID": "syscall", + "syscall.SYS_GETITIMER": "syscall", + "syscall.SYS_GETLCID": "syscall", + "syscall.SYS_GETLOGIN": "syscall", + "syscall.SYS_GETLOGINCLASS": "syscall", + "syscall.SYS_GETPEERNAME": "syscall", + "syscall.SYS_GETPGID": "syscall", + "syscall.SYS_GETPGRP": "syscall", + "syscall.SYS_GETPID": "syscall", + "syscall.SYS_GETPMSG": "syscall", + "syscall.SYS_GETPPID": "syscall", + "syscall.SYS_GETPRIORITY": "syscall", + "syscall.SYS_GETRESGID": "syscall", + "syscall.SYS_GETRESGID32": "syscall", + "syscall.SYS_GETRESUID": "syscall", + "syscall.SYS_GETRESUID32": "syscall", + "syscall.SYS_GETRLIMIT": "syscall", + "syscall.SYS_GETRTABLE": "syscall", + "syscall.SYS_GETRUSAGE": "syscall", + "syscall.SYS_GETSGROUPS": "syscall", + "syscall.SYS_GETSID": "syscall", + "syscall.SYS_GETSOCKNAME": "syscall", + "syscall.SYS_GETSOCKOPT": "syscall", + "syscall.SYS_GETTHRID": "syscall", + "syscall.SYS_GETTID": "syscall", + "syscall.SYS_GETTIMEOFDAY": "syscall", + "syscall.SYS_GETUID": "syscall", + "syscall.SYS_GETUID32": "syscall", + "syscall.SYS_GETVFSSTAT": "syscall", + "syscall.SYS_GETWGROUPS": "syscall", + "syscall.SYS_GETXATTR": "syscall", + "syscall.SYS_GET_KERNEL_SYMS": "syscall", + "syscall.SYS_GET_MEMPOLICY": "syscall", + "syscall.SYS_GET_ROBUST_LIST": "syscall", + "syscall.SYS_GET_THREAD_AREA": "syscall", + "syscall.SYS_GTTY": "syscall", + "syscall.SYS_IDENTITYSVC": "syscall", + "syscall.SYS_IDLE": "syscall", + "syscall.SYS_INITGROUPS": "syscall", + "syscall.SYS_INIT_MODULE": "syscall", + "syscall.SYS_INOTIFY_ADD_WATCH": "syscall", + "syscall.SYS_INOTIFY_INIT": "syscall", + "syscall.SYS_INOTIFY_INIT1": "syscall", + "syscall.SYS_INOTIFY_RM_WATCH": "syscall", + "syscall.SYS_IOCTL": "syscall", + "syscall.SYS_IOPERM": "syscall", + "syscall.SYS_IOPL": "syscall", + "syscall.SYS_IOPOLICYSYS": "syscall", + "syscall.SYS_IOPRIO_GET": "syscall", + "syscall.SYS_IOPRIO_SET": "syscall", + "syscall.SYS_IO_CANCEL": "syscall", + "syscall.SYS_IO_DESTROY": "syscall", + "syscall.SYS_IO_GETEVENTS": "syscall", + "syscall.SYS_IO_SETUP": "syscall", + "syscall.SYS_IO_SUBMIT": "syscall", + "syscall.SYS_IPC": "syscall", + "syscall.SYS_ISSETUGID": "syscall", + "syscall.SYS_JAIL": "syscall", + "syscall.SYS_JAIL_ATTACH": "syscall", + "syscall.SYS_JAIL_GET": "syscall", + "syscall.SYS_JAIL_REMOVE": "syscall", + "syscall.SYS_JAIL_SET": "syscall", + "syscall.SYS_KDEBUG_TRACE": "syscall", + "syscall.SYS_KENV": "syscall", + "syscall.SYS_KEVENT": "syscall", + "syscall.SYS_KEVENT64": "syscall", + "syscall.SYS_KEXEC_LOAD": "syscall", + "syscall.SYS_KEYCTL": "syscall", + "syscall.SYS_KILL": "syscall", + "syscall.SYS_KLDFIND": "syscall", + "syscall.SYS_KLDFIRSTMOD": "syscall", + "syscall.SYS_KLDLOAD": "syscall", + "syscall.SYS_KLDNEXT": "syscall", + "syscall.SYS_KLDSTAT": "syscall", + "syscall.SYS_KLDSYM": "syscall", + "syscall.SYS_KLDUNLOAD": "syscall", + "syscall.SYS_KLDUNLOADF": "syscall", + "syscall.SYS_KQUEUE": "syscall", + "syscall.SYS_KQUEUE1": "syscall", + "syscall.SYS_KTIMER_CREATE": "syscall", + "syscall.SYS_KTIMER_DELETE": "syscall", + "syscall.SYS_KTIMER_GETOVERRUN": "syscall", + "syscall.SYS_KTIMER_GETTIME": "syscall", + "syscall.SYS_KTIMER_SETTIME": "syscall", + "syscall.SYS_KTRACE": "syscall", + "syscall.SYS_LCHFLAGS": "syscall", + "syscall.SYS_LCHMOD": "syscall", + "syscall.SYS_LCHOWN": "syscall", + "syscall.SYS_LCHOWN32": "syscall", + "syscall.SYS_LGETFH": "syscall", + "syscall.SYS_LGETXATTR": "syscall", + "syscall.SYS_LINK": "syscall", + "syscall.SYS_LINKAT": "syscall", + "syscall.SYS_LIO_LISTIO": "syscall", + "syscall.SYS_LISTEN": "syscall", + "syscall.SYS_LISTXATTR": "syscall", + "syscall.SYS_LLISTXATTR": "syscall", + "syscall.SYS_LOCK": "syscall", + "syscall.SYS_LOOKUP_DCOOKIE": "syscall", + "syscall.SYS_LPATHCONF": "syscall", + "syscall.SYS_LREMOVEXATTR": "syscall", + "syscall.SYS_LSEEK": "syscall", + "syscall.SYS_LSETXATTR": "syscall", + "syscall.SYS_LSTAT": "syscall", + "syscall.SYS_LSTAT64": "syscall", + "syscall.SYS_LSTAT64_EXTENDED": "syscall", + "syscall.SYS_LSTATV": "syscall", + "syscall.SYS_LSTAT_EXTENDED": "syscall", + "syscall.SYS_LUTIMES": "syscall", + "syscall.SYS_MAC_SYSCALL": "syscall", + "syscall.SYS_MADVISE": "syscall", + "syscall.SYS_MADVISE1": "syscall", + "syscall.SYS_MAXSYSCALL": "syscall", + "syscall.SYS_MBIND": "syscall", + "syscall.SYS_MIGRATE_PAGES": "syscall", + "syscall.SYS_MINCORE": "syscall", + "syscall.SYS_MINHERIT": "syscall", + "syscall.SYS_MKCOMPLEX": "syscall", + "syscall.SYS_MKDIR": "syscall", + "syscall.SYS_MKDIRAT": "syscall", + "syscall.SYS_MKDIR_EXTENDED": "syscall", + "syscall.SYS_MKFIFO": "syscall", + "syscall.SYS_MKFIFOAT": "syscall", + "syscall.SYS_MKFIFO_EXTENDED": "syscall", + "syscall.SYS_MKNOD": "syscall", + "syscall.SYS_MKNODAT": "syscall", + "syscall.SYS_MLOCK": "syscall", + "syscall.SYS_MLOCKALL": "syscall", + "syscall.SYS_MMAP": "syscall", + "syscall.SYS_MMAP2": "syscall", + "syscall.SYS_MODCTL": "syscall", + "syscall.SYS_MODFIND": "syscall", + "syscall.SYS_MODFNEXT": "syscall", + "syscall.SYS_MODIFY_LDT": "syscall", + "syscall.SYS_MODNEXT": "syscall", + "syscall.SYS_MODSTAT": "syscall", + "syscall.SYS_MODWATCH": "syscall", + "syscall.SYS_MOUNT": "syscall", + "syscall.SYS_MOVE_PAGES": "syscall", + "syscall.SYS_MPROTECT": "syscall", + "syscall.SYS_MPX": "syscall", + "syscall.SYS_MQUERY": "syscall", + "syscall.SYS_MQ_GETSETATTR": "syscall", + "syscall.SYS_MQ_NOTIFY": "syscall", + "syscall.SYS_MQ_OPEN": "syscall", + "syscall.SYS_MQ_TIMEDRECEIVE": "syscall", + "syscall.SYS_MQ_TIMEDSEND": "syscall", + "syscall.SYS_MQ_UNLINK": "syscall", + "syscall.SYS_MREMAP": "syscall", + "syscall.SYS_MSGCTL": "syscall", + "syscall.SYS_MSGGET": "syscall", + "syscall.SYS_MSGRCV": "syscall", + "syscall.SYS_MSGRCV_NOCANCEL": "syscall", + "syscall.SYS_MSGSND": "syscall", + "syscall.SYS_MSGSND_NOCANCEL": "syscall", + "syscall.SYS_MSGSYS": "syscall", + "syscall.SYS_MSYNC": "syscall", + "syscall.SYS_MSYNC_NOCANCEL": "syscall", + "syscall.SYS_MUNLOCK": "syscall", + "syscall.SYS_MUNLOCKALL": "syscall", + "syscall.SYS_MUNMAP": "syscall", + "syscall.SYS_NAME_TO_HANDLE_AT": "syscall", + "syscall.SYS_NANOSLEEP": "syscall", + "syscall.SYS_NEWFSTATAT": "syscall", + "syscall.SYS_NFSCLNT": "syscall", + "syscall.SYS_NFSSERVCTL": "syscall", + "syscall.SYS_NFSSVC": "syscall", + "syscall.SYS_NFSTAT": "syscall", + "syscall.SYS_NICE": "syscall", + "syscall.SYS_NLSTAT": "syscall", + "syscall.SYS_NMOUNT": "syscall", + "syscall.SYS_NSTAT": "syscall", + "syscall.SYS_NTP_ADJTIME": "syscall", + "syscall.SYS_NTP_GETTIME": "syscall", + "syscall.SYS_OABI_SYSCALL_BASE": "syscall", + "syscall.SYS_OBREAK": "syscall", + "syscall.SYS_OLDFSTAT": "syscall", + "syscall.SYS_OLDLSTAT": "syscall", + "syscall.SYS_OLDOLDUNAME": "syscall", + "syscall.SYS_OLDSTAT": "syscall", + "syscall.SYS_OLDUNAME": "syscall", + "syscall.SYS_OPEN": "syscall", + "syscall.SYS_OPENAT": "syscall", + "syscall.SYS_OPENBSD_POLL": "syscall", + "syscall.SYS_OPEN_BY_HANDLE_AT": "syscall", + "syscall.SYS_OPEN_EXTENDED": "syscall", + "syscall.SYS_OPEN_NOCANCEL": "syscall", + "syscall.SYS_OVADVISE": "syscall", + "syscall.SYS_PACCEPT": "syscall", + "syscall.SYS_PATHCONF": "syscall", + "syscall.SYS_PAUSE": "syscall", + "syscall.SYS_PCICONFIG_IOBASE": "syscall", + "syscall.SYS_PCICONFIG_READ": "syscall", + "syscall.SYS_PCICONFIG_WRITE": "syscall", + "syscall.SYS_PDFORK": "syscall", + "syscall.SYS_PDGETPID": "syscall", + "syscall.SYS_PDKILL": "syscall", + "syscall.SYS_PERF_EVENT_OPEN": "syscall", + "syscall.SYS_PERSONALITY": "syscall", + "syscall.SYS_PID_HIBERNATE": "syscall", + "syscall.SYS_PID_RESUME": "syscall", + "syscall.SYS_PID_SHUTDOWN_SOCKETS": "syscall", + "syscall.SYS_PID_SUSPEND": "syscall", + "syscall.SYS_PIPE": "syscall", + "syscall.SYS_PIPE2": "syscall", + "syscall.SYS_PIVOT_ROOT": "syscall", + "syscall.SYS_PMC_CONTROL": "syscall", + "syscall.SYS_PMC_GET_INFO": "syscall", + "syscall.SYS_POLL": "syscall", + "syscall.SYS_POLLTS": "syscall", + "syscall.SYS_POLL_NOCANCEL": "syscall", + "syscall.SYS_POSIX_FADVISE": "syscall", + "syscall.SYS_POSIX_FALLOCATE": "syscall", + "syscall.SYS_POSIX_OPENPT": "syscall", + "syscall.SYS_POSIX_SPAWN": "syscall", + "syscall.SYS_PPOLL": "syscall", + "syscall.SYS_PRCTL": "syscall", + "syscall.SYS_PREAD": "syscall", + "syscall.SYS_PREAD64": "syscall", + "syscall.SYS_PREADV": "syscall", + "syscall.SYS_PREAD_NOCANCEL": "syscall", + "syscall.SYS_PRLIMIT64": "syscall", + "syscall.SYS_PROCCTL": "syscall", + "syscall.SYS_PROCESS_POLICY": "syscall", + "syscall.SYS_PROCESS_VM_READV": "syscall", + "syscall.SYS_PROCESS_VM_WRITEV": "syscall", + "syscall.SYS_PROC_INFO": "syscall", + "syscall.SYS_PROF": "syscall", + "syscall.SYS_PROFIL": "syscall", + "syscall.SYS_PSELECT": "syscall", + "syscall.SYS_PSELECT6": "syscall", + "syscall.SYS_PSET_ASSIGN": "syscall", + "syscall.SYS_PSET_CREATE": "syscall", + "syscall.SYS_PSET_DESTROY": "syscall", + "syscall.SYS_PSYNCH_CVBROAD": "syscall", + "syscall.SYS_PSYNCH_CVCLRPREPOST": "syscall", + "syscall.SYS_PSYNCH_CVSIGNAL": "syscall", + "syscall.SYS_PSYNCH_CVWAIT": "syscall", + "syscall.SYS_PSYNCH_MUTEXDROP": "syscall", + "syscall.SYS_PSYNCH_MUTEXWAIT": "syscall", + "syscall.SYS_PSYNCH_RW_DOWNGRADE": "syscall", + "syscall.SYS_PSYNCH_RW_LONGRDLOCK": "syscall", + "syscall.SYS_PSYNCH_RW_RDLOCK": "syscall", + "syscall.SYS_PSYNCH_RW_UNLOCK": "syscall", + "syscall.SYS_PSYNCH_RW_UNLOCK2": "syscall", + "syscall.SYS_PSYNCH_RW_UPGRADE": "syscall", + "syscall.SYS_PSYNCH_RW_WRLOCK": "syscall", + "syscall.SYS_PSYNCH_RW_YIELDWRLOCK": "syscall", + "syscall.SYS_PTRACE": "syscall", + "syscall.SYS_PUTPMSG": "syscall", + "syscall.SYS_PWRITE": "syscall", + "syscall.SYS_PWRITE64": "syscall", + "syscall.SYS_PWRITEV": "syscall", + "syscall.SYS_PWRITE_NOCANCEL": "syscall", + "syscall.SYS_QUERY_MODULE": "syscall", + "syscall.SYS_QUOTACTL": "syscall", + "syscall.SYS_RASCTL": "syscall", + "syscall.SYS_RCTL_ADD_RULE": "syscall", + "syscall.SYS_RCTL_GET_LIMITS": "syscall", + "syscall.SYS_RCTL_GET_RACCT": "syscall", + "syscall.SYS_RCTL_GET_RULES": "syscall", + "syscall.SYS_RCTL_REMOVE_RULE": "syscall", + "syscall.SYS_READ": "syscall", + "syscall.SYS_READAHEAD": "syscall", + "syscall.SYS_READDIR": "syscall", + "syscall.SYS_READLINK": "syscall", + "syscall.SYS_READLINKAT": "syscall", + "syscall.SYS_READV": "syscall", + "syscall.SYS_READV_NOCANCEL": "syscall", + "syscall.SYS_READ_NOCANCEL": "syscall", + "syscall.SYS_REBOOT": "syscall", + "syscall.SYS_RECV": "syscall", + "syscall.SYS_RECVFROM": "syscall", + "syscall.SYS_RECVFROM_NOCANCEL": "syscall", + "syscall.SYS_RECVMMSG": "syscall", + "syscall.SYS_RECVMSG": "syscall", + "syscall.SYS_RECVMSG_NOCANCEL": "syscall", + "syscall.SYS_REMAP_FILE_PAGES": "syscall", + "syscall.SYS_REMOVEXATTR": "syscall", + "syscall.SYS_RENAME": "syscall", + "syscall.SYS_RENAMEAT": "syscall", + "syscall.SYS_REQUEST_KEY": "syscall", + "syscall.SYS_RESTART_SYSCALL": "syscall", + "syscall.SYS_REVOKE": "syscall", + "syscall.SYS_RFORK": "syscall", + "syscall.SYS_RMDIR": "syscall", + "syscall.SYS_RTPRIO": "syscall", + "syscall.SYS_RTPRIO_THREAD": "syscall", + "syscall.SYS_RT_SIGACTION": "syscall", + "syscall.SYS_RT_SIGPENDING": "syscall", + "syscall.SYS_RT_SIGPROCMASK": "syscall", + "syscall.SYS_RT_SIGQUEUEINFO": "syscall", + "syscall.SYS_RT_SIGRETURN": "syscall", + "syscall.SYS_RT_SIGSUSPEND": "syscall", + "syscall.SYS_RT_SIGTIMEDWAIT": "syscall", + "syscall.SYS_RT_TGSIGQUEUEINFO": "syscall", + "syscall.SYS_SBRK": "syscall", + "syscall.SYS_SCHED_GETAFFINITY": "syscall", + "syscall.SYS_SCHED_GETPARAM": "syscall", + "syscall.SYS_SCHED_GETSCHEDULER": "syscall", + "syscall.SYS_SCHED_GET_PRIORITY_MAX": "syscall", + "syscall.SYS_SCHED_GET_PRIORITY_MIN": "syscall", + "syscall.SYS_SCHED_RR_GET_INTERVAL": "syscall", + "syscall.SYS_SCHED_SETAFFINITY": "syscall", + "syscall.SYS_SCHED_SETPARAM": "syscall", + "syscall.SYS_SCHED_SETSCHEDULER": "syscall", + "syscall.SYS_SCHED_YIELD": "syscall", + "syscall.SYS_SCTP_GENERIC_RECVMSG": "syscall", + "syscall.SYS_SCTP_GENERIC_SENDMSG": "syscall", + "syscall.SYS_SCTP_GENERIC_SENDMSG_IOV": "syscall", + "syscall.SYS_SCTP_PEELOFF": "syscall", + "syscall.SYS_SEARCHFS": "syscall", + "syscall.SYS_SECURITY": "syscall", + "syscall.SYS_SELECT": "syscall", + "syscall.SYS_SELECT_NOCANCEL": "syscall", + "syscall.SYS_SEMCONFIG": "syscall", + "syscall.SYS_SEMCTL": "syscall", + "syscall.SYS_SEMGET": "syscall", + "syscall.SYS_SEMOP": "syscall", + "syscall.SYS_SEMSYS": "syscall", + "syscall.SYS_SEMTIMEDOP": "syscall", + "syscall.SYS_SEM_CLOSE": "syscall", + "syscall.SYS_SEM_DESTROY": "syscall", + "syscall.SYS_SEM_GETVALUE": "syscall", + "syscall.SYS_SEM_INIT": "syscall", + "syscall.SYS_SEM_OPEN": "syscall", + "syscall.SYS_SEM_POST": "syscall", + "syscall.SYS_SEM_TRYWAIT": "syscall", + "syscall.SYS_SEM_UNLINK": "syscall", + "syscall.SYS_SEM_WAIT": "syscall", + "syscall.SYS_SEM_WAIT_NOCANCEL": "syscall", + "syscall.SYS_SEND": "syscall", + "syscall.SYS_SENDFILE": "syscall", + "syscall.SYS_SENDFILE64": "syscall", + "syscall.SYS_SENDMMSG": "syscall", + "syscall.SYS_SENDMSG": "syscall", + "syscall.SYS_SENDMSG_NOCANCEL": "syscall", + "syscall.SYS_SENDTO": "syscall", + "syscall.SYS_SENDTO_NOCANCEL": "syscall", + "syscall.SYS_SETATTRLIST": "syscall", + "syscall.SYS_SETAUDIT": "syscall", + "syscall.SYS_SETAUDIT_ADDR": "syscall", + "syscall.SYS_SETAUID": "syscall", + "syscall.SYS_SETCONTEXT": "syscall", + "syscall.SYS_SETDOMAINNAME": "syscall", + "syscall.SYS_SETEGID": "syscall", + "syscall.SYS_SETEUID": "syscall", + "syscall.SYS_SETFIB": "syscall", + "syscall.SYS_SETFSGID": "syscall", + "syscall.SYS_SETFSGID32": "syscall", + "syscall.SYS_SETFSUID": "syscall", + "syscall.SYS_SETFSUID32": "syscall", + "syscall.SYS_SETGID": "syscall", + "syscall.SYS_SETGID32": "syscall", + "syscall.SYS_SETGROUPS": "syscall", + "syscall.SYS_SETGROUPS32": "syscall", + "syscall.SYS_SETHOSTNAME": "syscall", + "syscall.SYS_SETITIMER": "syscall", + "syscall.SYS_SETLCID": "syscall", + "syscall.SYS_SETLOGIN": "syscall", + "syscall.SYS_SETLOGINCLASS": "syscall", + "syscall.SYS_SETNS": "syscall", + "syscall.SYS_SETPGID": "syscall", + "syscall.SYS_SETPRIORITY": "syscall", + "syscall.SYS_SETPRIVEXEC": "syscall", + "syscall.SYS_SETREGID": "syscall", + "syscall.SYS_SETREGID32": "syscall", + "syscall.SYS_SETRESGID": "syscall", + "syscall.SYS_SETRESGID32": "syscall", + "syscall.SYS_SETRESUID": "syscall", + "syscall.SYS_SETRESUID32": "syscall", + "syscall.SYS_SETREUID": "syscall", + "syscall.SYS_SETREUID32": "syscall", + "syscall.SYS_SETRLIMIT": "syscall", + "syscall.SYS_SETRTABLE": "syscall", + "syscall.SYS_SETSGROUPS": "syscall", + "syscall.SYS_SETSID": "syscall", + "syscall.SYS_SETSOCKOPT": "syscall", + "syscall.SYS_SETTID": "syscall", + "syscall.SYS_SETTID_WITH_PID": "syscall", + "syscall.SYS_SETTIMEOFDAY": "syscall", + "syscall.SYS_SETUID": "syscall", + "syscall.SYS_SETUID32": "syscall", + "syscall.SYS_SETWGROUPS": "syscall", + "syscall.SYS_SETXATTR": "syscall", + "syscall.SYS_SET_MEMPOLICY": "syscall", + "syscall.SYS_SET_ROBUST_LIST": "syscall", + "syscall.SYS_SET_THREAD_AREA": "syscall", + "syscall.SYS_SET_TID_ADDRESS": "syscall", + "syscall.SYS_SGETMASK": "syscall", + "syscall.SYS_SHARED_REGION_CHECK_NP": "syscall", + "syscall.SYS_SHARED_REGION_MAP_AND_SLIDE_NP": "syscall", + "syscall.SYS_SHMAT": "syscall", + "syscall.SYS_SHMCTL": "syscall", + "syscall.SYS_SHMDT": "syscall", + "syscall.SYS_SHMGET": "syscall", + "syscall.SYS_SHMSYS": "syscall", + "syscall.SYS_SHM_OPEN": "syscall", + "syscall.SYS_SHM_UNLINK": "syscall", + "syscall.SYS_SHUTDOWN": "syscall", + "syscall.SYS_SIGACTION": "syscall", + "syscall.SYS_SIGALTSTACK": "syscall", + "syscall.SYS_SIGNAL": "syscall", + "syscall.SYS_SIGNALFD": "syscall", + "syscall.SYS_SIGNALFD4": "syscall", + "syscall.SYS_SIGPENDING": "syscall", + "syscall.SYS_SIGPROCMASK": "syscall", + "syscall.SYS_SIGQUEUE": "syscall", + "syscall.SYS_SIGQUEUEINFO": "syscall", + "syscall.SYS_SIGRETURN": "syscall", + "syscall.SYS_SIGSUSPEND": "syscall", + "syscall.SYS_SIGSUSPEND_NOCANCEL": "syscall", + "syscall.SYS_SIGTIMEDWAIT": "syscall", + "syscall.SYS_SIGWAIT": "syscall", + "syscall.SYS_SIGWAITINFO": "syscall", + "syscall.SYS_SOCKET": "syscall", + "syscall.SYS_SOCKETCALL": "syscall", + "syscall.SYS_SOCKETPAIR": "syscall", + "syscall.SYS_SPLICE": "syscall", + "syscall.SYS_SSETMASK": "syscall", + "syscall.SYS_SSTK": "syscall", + "syscall.SYS_STACK_SNAPSHOT": "syscall", + "syscall.SYS_STAT": "syscall", + "syscall.SYS_STAT64": "syscall", + "syscall.SYS_STAT64_EXTENDED": "syscall", + "syscall.SYS_STATFS": "syscall", + "syscall.SYS_STATFS64": "syscall", + "syscall.SYS_STATV": "syscall", + "syscall.SYS_STATVFS1": "syscall", + "syscall.SYS_STAT_EXTENDED": "syscall", + "syscall.SYS_STIME": "syscall", + "syscall.SYS_STTY": "syscall", + "syscall.SYS_SWAPCONTEXT": "syscall", + "syscall.SYS_SWAPCTL": "syscall", + "syscall.SYS_SWAPOFF": "syscall", + "syscall.SYS_SWAPON": "syscall", + "syscall.SYS_SYMLINK": "syscall", + "syscall.SYS_SYMLINKAT": "syscall", + "syscall.SYS_SYNC": "syscall", + "syscall.SYS_SYNCFS": "syscall", + "syscall.SYS_SYNC_FILE_RANGE": "syscall", + "syscall.SYS_SYSARCH": "syscall", + "syscall.SYS_SYSCALL": "syscall", + "syscall.SYS_SYSCALL_BASE": "syscall", + "syscall.SYS_SYSFS": "syscall", + "syscall.SYS_SYSINFO": "syscall", + "syscall.SYS_SYSLOG": "syscall", + "syscall.SYS_TEE": "syscall", + "syscall.SYS_TGKILL": "syscall", + "syscall.SYS_THREAD_SELFID": "syscall", + "syscall.SYS_THR_CREATE": "syscall", + "syscall.SYS_THR_EXIT": "syscall", + "syscall.SYS_THR_KILL": "syscall", + "syscall.SYS_THR_KILL2": "syscall", + "syscall.SYS_THR_NEW": "syscall", + "syscall.SYS_THR_SELF": "syscall", + "syscall.SYS_THR_SET_NAME": "syscall", + "syscall.SYS_THR_SUSPEND": "syscall", + "syscall.SYS_THR_WAKE": "syscall", + "syscall.SYS_TIME": "syscall", + "syscall.SYS_TIMERFD_CREATE": "syscall", + "syscall.SYS_TIMERFD_GETTIME": "syscall", + "syscall.SYS_TIMERFD_SETTIME": "syscall", + "syscall.SYS_TIMER_CREATE": "syscall", + "syscall.SYS_TIMER_DELETE": "syscall", + "syscall.SYS_TIMER_GETOVERRUN": "syscall", + "syscall.SYS_TIMER_GETTIME": "syscall", + "syscall.SYS_TIMER_SETTIME": "syscall", + "syscall.SYS_TIMES": "syscall", + "syscall.SYS_TKILL": "syscall", + "syscall.SYS_TRUNCATE": "syscall", + "syscall.SYS_TRUNCATE64": "syscall", + "syscall.SYS_TUXCALL": "syscall", + "syscall.SYS_UGETRLIMIT": "syscall", + "syscall.SYS_ULIMIT": "syscall", + "syscall.SYS_UMASK": "syscall", + "syscall.SYS_UMASK_EXTENDED": "syscall", + "syscall.SYS_UMOUNT": "syscall", + "syscall.SYS_UMOUNT2": "syscall", + "syscall.SYS_UNAME": "syscall", + "syscall.SYS_UNDELETE": "syscall", + "syscall.SYS_UNLINK": "syscall", + "syscall.SYS_UNLINKAT": "syscall", + "syscall.SYS_UNMOUNT": "syscall", + "syscall.SYS_UNSHARE": "syscall", + "syscall.SYS_USELIB": "syscall", + "syscall.SYS_USTAT": "syscall", + "syscall.SYS_UTIME": "syscall", + "syscall.SYS_UTIMENSAT": "syscall", + "syscall.SYS_UTIMES": "syscall", + "syscall.SYS_UTRACE": "syscall", + "syscall.SYS_UUIDGEN": "syscall", + "syscall.SYS_VADVISE": "syscall", + "syscall.SYS_VFORK": "syscall", + "syscall.SYS_VHANGUP": "syscall", + "syscall.SYS_VM86": "syscall", + "syscall.SYS_VM86OLD": "syscall", + "syscall.SYS_VMSPLICE": "syscall", + "syscall.SYS_VM_PRESSURE_MONITOR": "syscall", + "syscall.SYS_VSERVER": "syscall", + "syscall.SYS_WAIT4": "syscall", + "syscall.SYS_WAIT4_NOCANCEL": "syscall", + "syscall.SYS_WAIT6": "syscall", + "syscall.SYS_WAITEVENT": "syscall", + "syscall.SYS_WAITID": "syscall", + "syscall.SYS_WAITID_NOCANCEL": "syscall", + "syscall.SYS_WAITPID": "syscall", + "syscall.SYS_WATCHEVENT": "syscall", + "syscall.SYS_WORKQ_KERNRETURN": "syscall", + "syscall.SYS_WORKQ_OPEN": "syscall", + "syscall.SYS_WRITE": "syscall", + "syscall.SYS_WRITEV": "syscall", + "syscall.SYS_WRITEV_NOCANCEL": "syscall", + "syscall.SYS_WRITE_NOCANCEL": "syscall", + "syscall.SYS_YIELD": "syscall", + "syscall.SYS__LLSEEK": "syscall", + "syscall.SYS__LWP_CONTINUE": "syscall", + "syscall.SYS__LWP_CREATE": "syscall", + "syscall.SYS__LWP_CTL": "syscall", + "syscall.SYS__LWP_DETACH": "syscall", + "syscall.SYS__LWP_EXIT": "syscall", + "syscall.SYS__LWP_GETNAME": "syscall", + "syscall.SYS__LWP_GETPRIVATE": "syscall", + "syscall.SYS__LWP_KILL": "syscall", + "syscall.SYS__LWP_PARK": "syscall", + "syscall.SYS__LWP_SELF": "syscall", + "syscall.SYS__LWP_SETNAME": "syscall", + "syscall.SYS__LWP_SETPRIVATE": "syscall", + "syscall.SYS__LWP_SUSPEND": "syscall", + "syscall.SYS__LWP_UNPARK": "syscall", + "syscall.SYS__LWP_UNPARK_ALL": "syscall", + "syscall.SYS__LWP_WAIT": "syscall", + "syscall.SYS__LWP_WAKEUP": "syscall", + "syscall.SYS__NEWSELECT": "syscall", + "syscall.SYS__PSET_BIND": "syscall", + "syscall.SYS__SCHED_GETAFFINITY": "syscall", + "syscall.SYS__SCHED_GETPARAM": "syscall", + "syscall.SYS__SCHED_SETAFFINITY": "syscall", + "syscall.SYS__SCHED_SETPARAM": "syscall", + "syscall.SYS__SYSCTL": "syscall", + "syscall.SYS__UMTX_LOCK": "syscall", + "syscall.SYS__UMTX_OP": "syscall", + "syscall.SYS__UMTX_UNLOCK": "syscall", + "syscall.SYS___ACL_ACLCHECK_FD": "syscall", + "syscall.SYS___ACL_ACLCHECK_FILE": "syscall", + "syscall.SYS___ACL_ACLCHECK_LINK": "syscall", + "syscall.SYS___ACL_DELETE_FD": "syscall", + "syscall.SYS___ACL_DELETE_FILE": "syscall", + "syscall.SYS___ACL_DELETE_LINK": "syscall", + "syscall.SYS___ACL_GET_FD": "syscall", + "syscall.SYS___ACL_GET_FILE": "syscall", + "syscall.SYS___ACL_GET_LINK": "syscall", + "syscall.SYS___ACL_SET_FD": "syscall", + "syscall.SYS___ACL_SET_FILE": "syscall", + "syscall.SYS___ACL_SET_LINK": "syscall", + "syscall.SYS___CLONE": "syscall", + "syscall.SYS___DISABLE_THREADSIGNAL": "syscall", + "syscall.SYS___GETCWD": "syscall", + "syscall.SYS___GETLOGIN": "syscall", + "syscall.SYS___GET_TCB": "syscall", + "syscall.SYS___MAC_EXECVE": "syscall", + "syscall.SYS___MAC_GETFSSTAT": "syscall", + "syscall.SYS___MAC_GET_FD": "syscall", + "syscall.SYS___MAC_GET_FILE": "syscall", + "syscall.SYS___MAC_GET_LCID": "syscall", + "syscall.SYS___MAC_GET_LCTX": "syscall", + "syscall.SYS___MAC_GET_LINK": "syscall", + "syscall.SYS___MAC_GET_MOUNT": "syscall", + "syscall.SYS___MAC_GET_PID": "syscall", + "syscall.SYS___MAC_GET_PROC": "syscall", + "syscall.SYS___MAC_MOUNT": "syscall", + "syscall.SYS___MAC_SET_FD": "syscall", + "syscall.SYS___MAC_SET_FILE": "syscall", + "syscall.SYS___MAC_SET_LCTX": "syscall", + "syscall.SYS___MAC_SET_LINK": "syscall", + "syscall.SYS___MAC_SET_PROC": "syscall", + "syscall.SYS___MAC_SYSCALL": "syscall", + "syscall.SYS___OLD_SEMWAIT_SIGNAL": "syscall", + "syscall.SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL": "syscall", + "syscall.SYS___POSIX_CHOWN": "syscall", + "syscall.SYS___POSIX_FCHOWN": "syscall", + "syscall.SYS___POSIX_LCHOWN": "syscall", + "syscall.SYS___POSIX_RENAME": "syscall", + "syscall.SYS___PTHREAD_CANCELED": "syscall", + "syscall.SYS___PTHREAD_CHDIR": "syscall", + "syscall.SYS___PTHREAD_FCHDIR": "syscall", + "syscall.SYS___PTHREAD_KILL": "syscall", + "syscall.SYS___PTHREAD_MARKCANCEL": "syscall", + "syscall.SYS___PTHREAD_SIGMASK": "syscall", + "syscall.SYS___QUOTACTL": "syscall", + "syscall.SYS___SEMCTL": "syscall", + "syscall.SYS___SEMWAIT_SIGNAL": "syscall", + "syscall.SYS___SEMWAIT_SIGNAL_NOCANCEL": "syscall", + "syscall.SYS___SETLOGIN": "syscall", + "syscall.SYS___SETUGID": "syscall", + "syscall.SYS___SET_TCB": "syscall", + "syscall.SYS___SIGACTION_SIGTRAMP": "syscall", + "syscall.SYS___SIGTIMEDWAIT": "syscall", + "syscall.SYS___SIGWAIT": "syscall", + "syscall.SYS___SIGWAIT_NOCANCEL": "syscall", + "syscall.SYS___SYSCTL": "syscall", + "syscall.SYS___TFORK": "syscall", + "syscall.SYS___THREXIT": "syscall", + "syscall.SYS___THRSIGDIVERT": "syscall", + "syscall.SYS___THRSLEEP": "syscall", + "syscall.SYS___THRWAKEUP": "syscall", + "syscall.S_ARCH1": "syscall", + "syscall.S_ARCH2": "syscall", + "syscall.S_BLKSIZE": "syscall", + "syscall.S_IEXEC": "syscall", + "syscall.S_IFBLK": "syscall", + "syscall.S_IFCHR": "syscall", + "syscall.S_IFDIR": "syscall", + "syscall.S_IFIFO": "syscall", + "syscall.S_IFLNK": "syscall", + "syscall.S_IFMT": "syscall", + "syscall.S_IFREG": "syscall", + "syscall.S_IFSOCK": "syscall", + "syscall.S_IFWHT": "syscall", + "syscall.S_IREAD": "syscall", + "syscall.S_IRGRP": "syscall", + "syscall.S_IROTH": "syscall", + "syscall.S_IRUSR": "syscall", + "syscall.S_IRWXG": "syscall", + "syscall.S_IRWXO": "syscall", + "syscall.S_IRWXU": "syscall", + "syscall.S_ISGID": "syscall", + "syscall.S_ISTXT": "syscall", + "syscall.S_ISUID": "syscall", + "syscall.S_ISVTX": "syscall", + "syscall.S_IWGRP": "syscall", + "syscall.S_IWOTH": "syscall", + "syscall.S_IWRITE": "syscall", + "syscall.S_IWUSR": "syscall", + "syscall.S_IXGRP": "syscall", + "syscall.S_IXOTH": "syscall", + "syscall.S_IXUSR": "syscall", + "syscall.S_LOGIN_SET": "syscall", + "syscall.SecurityAttributes": "syscall", + "syscall.Seek": "syscall", + "syscall.Select": "syscall", + "syscall.Sendfile": "syscall", + "syscall.Sendmsg": "syscall", + "syscall.SendmsgN": "syscall", + "syscall.Sendto": "syscall", + "syscall.Servent": "syscall", + "syscall.SetBpf": "syscall", + "syscall.SetBpfBuflen": "syscall", + "syscall.SetBpfDatalink": "syscall", + "syscall.SetBpfHeadercmpl": "syscall", + "syscall.SetBpfImmediate": "syscall", + "syscall.SetBpfInterface": "syscall", + "syscall.SetBpfPromisc": "syscall", + "syscall.SetBpfTimeout": "syscall", + "syscall.SetCurrentDirectory": "syscall", + "syscall.SetEndOfFile": "syscall", + "syscall.SetEnvironmentVariable": "syscall", + "syscall.SetFileAttributes": "syscall", + "syscall.SetFileCompletionNotificationModes": "syscall", + "syscall.SetFilePointer": "syscall", + "syscall.SetFileTime": "syscall", + "syscall.SetHandleInformation": "syscall", + "syscall.SetKevent": "syscall", + "syscall.SetLsfPromisc": "syscall", + "syscall.SetNonblock": "syscall", + "syscall.Setdomainname": "syscall", + "syscall.Setegid": "syscall", + "syscall.Setenv": "syscall", + "syscall.Seteuid": "syscall", + "syscall.Setfsgid": "syscall", + "syscall.Setfsuid": "syscall", + "syscall.Setgid": "syscall", + "syscall.Setgroups": "syscall", + "syscall.Sethostname": "syscall", + "syscall.Setlogin": "syscall", + "syscall.Setpgid": "syscall", + "syscall.Setpriority": "syscall", + "syscall.Setprivexec": "syscall", + "syscall.Setregid": "syscall", + "syscall.Setresgid": "syscall", + "syscall.Setresuid": "syscall", + "syscall.Setreuid": "syscall", + "syscall.Setrlimit": "syscall", + "syscall.Setsid": "syscall", + "syscall.Setsockopt": "syscall", + "syscall.SetsockoptByte": "syscall", + "syscall.SetsockoptICMPv6Filter": "syscall", + "syscall.SetsockoptIPMreq": "syscall", + "syscall.SetsockoptIPMreqn": "syscall", + "syscall.SetsockoptIPv6Mreq": "syscall", + "syscall.SetsockoptInet4Addr": "syscall", + "syscall.SetsockoptInt": "syscall", + "syscall.SetsockoptLinger": "syscall", + "syscall.SetsockoptString": "syscall", + "syscall.SetsockoptTimeval": "syscall", + "syscall.Settimeofday": "syscall", + "syscall.Setuid": "syscall", + "syscall.Setxattr": "syscall", + "syscall.Shutdown": "syscall", + "syscall.SidTypeAlias": "syscall", + "syscall.SidTypeComputer": "syscall", + "syscall.SidTypeDeletedAccount": "syscall", + "syscall.SidTypeDomain": "syscall", + "syscall.SidTypeGroup": "syscall", + "syscall.SidTypeInvalid": "syscall", + "syscall.SidTypeLabel": "syscall", + "syscall.SidTypeUnknown": "syscall", + "syscall.SidTypeUser": "syscall", + "syscall.SidTypeWellKnownGroup": "syscall", + "syscall.Signal": "syscall", + "syscall.SizeofBpfHdr": "syscall", + "syscall.SizeofBpfInsn": "syscall", + "syscall.SizeofBpfProgram": "syscall", + "syscall.SizeofBpfStat": "syscall", + "syscall.SizeofBpfVersion": "syscall", + "syscall.SizeofBpfZbuf": "syscall", + "syscall.SizeofBpfZbufHeader": "syscall", + "syscall.SizeofCmsghdr": "syscall", + "syscall.SizeofICMPv6Filter": "syscall", + "syscall.SizeofIPMreq": "syscall", + "syscall.SizeofIPMreqn": "syscall", + "syscall.SizeofIPv6MTUInfo": "syscall", + "syscall.SizeofIPv6Mreq": "syscall", + "syscall.SizeofIfAddrmsg": "syscall", + "syscall.SizeofIfAnnounceMsghdr": "syscall", + "syscall.SizeofIfData": "syscall", + "syscall.SizeofIfInfomsg": "syscall", + "syscall.SizeofIfMsghdr": "syscall", + "syscall.SizeofIfaMsghdr": "syscall", + "syscall.SizeofIfmaMsghdr": "syscall", + "syscall.SizeofIfmaMsghdr2": "syscall", + "syscall.SizeofInet4Pktinfo": "syscall", + "syscall.SizeofInet6Pktinfo": "syscall", + "syscall.SizeofInotifyEvent": "syscall", + "syscall.SizeofLinger": "syscall", + "syscall.SizeofMsghdr": "syscall", + "syscall.SizeofNlAttr": "syscall", + "syscall.SizeofNlMsgerr": "syscall", + "syscall.SizeofNlMsghdr": "syscall", + "syscall.SizeofRtAttr": "syscall", + "syscall.SizeofRtGenmsg": "syscall", + "syscall.SizeofRtMetrics": "syscall", + "syscall.SizeofRtMsg": "syscall", + "syscall.SizeofRtMsghdr": "syscall", + "syscall.SizeofRtNexthop": "syscall", + "syscall.SizeofSockFilter": "syscall", + "syscall.SizeofSockFprog": "syscall", + "syscall.SizeofSockaddrAny": "syscall", + "syscall.SizeofSockaddrDatalink": "syscall", + "syscall.SizeofSockaddrInet4": "syscall", + "syscall.SizeofSockaddrInet6": "syscall", + "syscall.SizeofSockaddrLinklayer": "syscall", + "syscall.SizeofSockaddrNetlink": "syscall", + "syscall.SizeofSockaddrUnix": "syscall", + "syscall.SizeofTCPInfo": "syscall", + "syscall.SizeofUcred": "syscall", + "syscall.SlicePtrFromStrings": "syscall", + "syscall.SockFilter": "syscall", + "syscall.SockFprog": "syscall", + "syscall.SockaddrDatalink": "syscall", + "syscall.SockaddrGen": "syscall", + "syscall.SockaddrInet4": "syscall", + "syscall.SockaddrInet6": "syscall", + "syscall.SockaddrLinklayer": "syscall", + "syscall.SockaddrNetlink": "syscall", + "syscall.SockaddrUnix": "syscall", + "syscall.Socket": "syscall", + "syscall.SocketControlMessage": "syscall", + "syscall.SocketDisableIPv6": "syscall", + "syscall.Socketpair": "syscall", + "syscall.Splice": "syscall", + "syscall.StartProcess": "syscall", + "syscall.StartupInfo": "syscall", + "syscall.Stat": "syscall", + "syscall.Stat_t": "syscall", + "syscall.Statfs": "syscall", + "syscall.Statfs_t": "syscall", + "syscall.Stderr": "syscall", + "syscall.Stdin": "syscall", + "syscall.Stdout": "syscall", + "syscall.StringBytePtr": "syscall", + "syscall.StringByteSlice": "syscall", + "syscall.StringSlicePtr": "syscall", + "syscall.StringToSid": "syscall", + "syscall.StringToUTF16": "syscall", + "syscall.StringToUTF16Ptr": "syscall", + "syscall.Symlink": "syscall", + "syscall.Sync": "syscall", + "syscall.SyncFileRange": "syscall", + "syscall.SysProcAttr": "syscall", + "syscall.SysProcIDMap": "syscall", + "syscall.Syscall": "syscall", + "syscall.Syscall12": "syscall", + "syscall.Syscall15": "syscall", + "syscall.Syscall6": "syscall", + "syscall.Syscall9": "syscall", + "syscall.Sysctl": "syscall", + "syscall.SysctlUint32": "syscall", + "syscall.Sysctlnode": "syscall", + "syscall.Sysinfo": "syscall", + "syscall.Sysinfo_t": "syscall", + "syscall.Systemtime": "syscall", + "syscall.TCGETS": "syscall", + "syscall.TCIFLUSH": "syscall", + "syscall.TCIOFLUSH": "syscall", + "syscall.TCOFLUSH": "syscall", + "syscall.TCPInfo": "syscall", + "syscall.TCPKeepalive": "syscall", + "syscall.TCP_CA_NAME_MAX": "syscall", + "syscall.TCP_CONGCTL": "syscall", + "syscall.TCP_CONGESTION": "syscall", + "syscall.TCP_CONNECTIONTIMEOUT": "syscall", + "syscall.TCP_CORK": "syscall", + "syscall.TCP_DEFER_ACCEPT": "syscall", + "syscall.TCP_INFO": "syscall", + "syscall.TCP_KEEPALIVE": "syscall", + "syscall.TCP_KEEPCNT": "syscall", + "syscall.TCP_KEEPIDLE": "syscall", + "syscall.TCP_KEEPINIT": "syscall", + "syscall.TCP_KEEPINTVL": "syscall", + "syscall.TCP_LINGER2": "syscall", + "syscall.TCP_MAXBURST": "syscall", + "syscall.TCP_MAXHLEN": "syscall", + "syscall.TCP_MAXOLEN": "syscall", + "syscall.TCP_MAXSEG": "syscall", + "syscall.TCP_MAXWIN": "syscall", + "syscall.TCP_MAX_SACK": "syscall", + "syscall.TCP_MAX_WINSHIFT": "syscall", + "syscall.TCP_MD5SIG": "syscall", + "syscall.TCP_MD5SIG_MAXKEYLEN": "syscall", + "syscall.TCP_MINMSS": "syscall", + "syscall.TCP_MINMSSOVERLOAD": "syscall", + "syscall.TCP_MSS": "syscall", + "syscall.TCP_NODELAY": "syscall", + "syscall.TCP_NOOPT": "syscall", + "syscall.TCP_NOPUSH": "syscall", + "syscall.TCP_NSTATES": "syscall", + "syscall.TCP_QUICKACK": "syscall", + "syscall.TCP_RXT_CONNDROPTIME": "syscall", + "syscall.TCP_RXT_FINDROP": "syscall", + "syscall.TCP_SACK_ENABLE": "syscall", + "syscall.TCP_SYNCNT": "syscall", + "syscall.TCP_VENDOR": "syscall", + "syscall.TCP_WINDOW_CLAMP": "syscall", + "syscall.TCSAFLUSH": "syscall", + "syscall.TCSETS": "syscall", + "syscall.TF_DISCONNECT": "syscall", + "syscall.TF_REUSE_SOCKET": "syscall", + "syscall.TF_USE_DEFAULT_WORKER": "syscall", + "syscall.TF_USE_KERNEL_APC": "syscall", + "syscall.TF_USE_SYSTEM_THREAD": "syscall", + "syscall.TF_WRITE_BEHIND": "syscall", + "syscall.TH32CS_INHERIT": "syscall", + "syscall.TH32CS_SNAPALL": "syscall", + "syscall.TH32CS_SNAPHEAPLIST": "syscall", + "syscall.TH32CS_SNAPMODULE": "syscall", + "syscall.TH32CS_SNAPMODULE32": "syscall", + "syscall.TH32CS_SNAPPROCESS": "syscall", + "syscall.TH32CS_SNAPTHREAD": "syscall", + "syscall.TIME_ZONE_ID_DAYLIGHT": "syscall", + "syscall.TIME_ZONE_ID_STANDARD": "syscall", + "syscall.TIME_ZONE_ID_UNKNOWN": "syscall", + "syscall.TIOCCBRK": "syscall", + "syscall.TIOCCDTR": "syscall", + "syscall.TIOCCONS": "syscall", + "syscall.TIOCDCDTIMESTAMP": "syscall", + "syscall.TIOCDRAIN": "syscall", + "syscall.TIOCDSIMICROCODE": "syscall", + "syscall.TIOCEXCL": "syscall", + "syscall.TIOCEXT": "syscall", + "syscall.TIOCFLAG_CDTRCTS": "syscall", + "syscall.TIOCFLAG_CLOCAL": "syscall", + "syscall.TIOCFLAG_CRTSCTS": "syscall", + "syscall.TIOCFLAG_MDMBUF": "syscall", + "syscall.TIOCFLAG_PPS": "syscall", + "syscall.TIOCFLAG_SOFTCAR": "syscall", + "syscall.TIOCFLUSH": "syscall", + "syscall.TIOCGDEV": "syscall", + "syscall.TIOCGDRAINWAIT": "syscall", + "syscall.TIOCGETA": "syscall", + "syscall.TIOCGETD": "syscall", + "syscall.TIOCGFLAGS": "syscall", + "syscall.TIOCGICOUNT": "syscall", + "syscall.TIOCGLCKTRMIOS": "syscall", + "syscall.TIOCGLINED": "syscall", + "syscall.TIOCGPGRP": "syscall", + "syscall.TIOCGPTN": "syscall", + "syscall.TIOCGQSIZE": "syscall", + "syscall.TIOCGRANTPT": "syscall", + "syscall.TIOCGRS485": "syscall", + "syscall.TIOCGSERIAL": "syscall", + "syscall.TIOCGSID": "syscall", + "syscall.TIOCGSIZE": "syscall", + "syscall.TIOCGSOFTCAR": "syscall", + "syscall.TIOCGTSTAMP": "syscall", + "syscall.TIOCGWINSZ": "syscall", + "syscall.TIOCINQ": "syscall", + "syscall.TIOCIXOFF": "syscall", + "syscall.TIOCIXON": "syscall", + "syscall.TIOCLINUX": "syscall", + "syscall.TIOCMBIC": "syscall", + "syscall.TIOCMBIS": "syscall", + "syscall.TIOCMGDTRWAIT": "syscall", + "syscall.TIOCMGET": "syscall", + "syscall.TIOCMIWAIT": "syscall", + "syscall.TIOCMODG": "syscall", + "syscall.TIOCMODS": "syscall", + "syscall.TIOCMSDTRWAIT": "syscall", + "syscall.TIOCMSET": "syscall", + "syscall.TIOCM_CAR": "syscall", + "syscall.TIOCM_CD": "syscall", + "syscall.TIOCM_CTS": "syscall", + "syscall.TIOCM_DCD": "syscall", + "syscall.TIOCM_DSR": "syscall", + "syscall.TIOCM_DTR": "syscall", + "syscall.TIOCM_LE": "syscall", + "syscall.TIOCM_RI": "syscall", + "syscall.TIOCM_RNG": "syscall", + "syscall.TIOCM_RTS": "syscall", + "syscall.TIOCM_SR": "syscall", + "syscall.TIOCM_ST": "syscall", + "syscall.TIOCNOTTY": "syscall", + "syscall.TIOCNXCL": "syscall", + "syscall.TIOCOUTQ": "syscall", + "syscall.TIOCPKT": "syscall", + "syscall.TIOCPKT_DATA": "syscall", + "syscall.TIOCPKT_DOSTOP": "syscall", + "syscall.TIOCPKT_FLUSHREAD": "syscall", + "syscall.TIOCPKT_FLUSHWRITE": "syscall", + "syscall.TIOCPKT_IOCTL": "syscall", + "syscall.TIOCPKT_NOSTOP": "syscall", + "syscall.TIOCPKT_START": "syscall", + "syscall.TIOCPKT_STOP": "syscall", + "syscall.TIOCPTMASTER": "syscall", + "syscall.TIOCPTMGET": "syscall", + "syscall.TIOCPTSNAME": "syscall", + "syscall.TIOCPTYGNAME": "syscall", + "syscall.TIOCPTYGRANT": "syscall", + "syscall.TIOCPTYUNLK": "syscall", + "syscall.TIOCRCVFRAME": "syscall", + "syscall.TIOCREMOTE": "syscall", + "syscall.TIOCSBRK": "syscall", + "syscall.TIOCSCONS": "syscall", + "syscall.TIOCSCTTY": "syscall", + "syscall.TIOCSDRAINWAIT": "syscall", + "syscall.TIOCSDTR": "syscall", + "syscall.TIOCSERCONFIG": "syscall", + "syscall.TIOCSERGETLSR": "syscall", + "syscall.TIOCSERGETMULTI": "syscall", + "syscall.TIOCSERGSTRUCT": "syscall", + "syscall.TIOCSERGWILD": "syscall", + "syscall.TIOCSERSETMULTI": "syscall", + "syscall.TIOCSERSWILD": "syscall", + "syscall.TIOCSER_TEMT": "syscall", + "syscall.TIOCSETA": "syscall", + "syscall.TIOCSETAF": "syscall", + "syscall.TIOCSETAW": "syscall", + "syscall.TIOCSETD": "syscall", + "syscall.TIOCSFLAGS": "syscall", + "syscall.TIOCSIG": "syscall", + "syscall.TIOCSLCKTRMIOS": "syscall", + "syscall.TIOCSLINED": "syscall", + "syscall.TIOCSPGRP": "syscall", + "syscall.TIOCSPTLCK": "syscall", + "syscall.TIOCSQSIZE": "syscall", + "syscall.TIOCSRS485": "syscall", + "syscall.TIOCSSERIAL": "syscall", + "syscall.TIOCSSIZE": "syscall", + "syscall.TIOCSSOFTCAR": "syscall", + "syscall.TIOCSTART": "syscall", + "syscall.TIOCSTAT": "syscall", + "syscall.TIOCSTI": "syscall", + "syscall.TIOCSTOP": "syscall", + "syscall.TIOCSTSTAMP": "syscall", + "syscall.TIOCSWINSZ": "syscall", + "syscall.TIOCTIMESTAMP": "syscall", + "syscall.TIOCUCNTL": "syscall", + "syscall.TIOCVHANGUP": "syscall", + "syscall.TIOCXMTFRAME": "syscall", + "syscall.TOKEN_ADJUST_DEFAULT": "syscall", + "syscall.TOKEN_ADJUST_GROUPS": "syscall", + "syscall.TOKEN_ADJUST_PRIVILEGES": "syscall", + "syscall.TOKEN_ALL_ACCESS": "syscall", + "syscall.TOKEN_ASSIGN_PRIMARY": "syscall", + "syscall.TOKEN_DUPLICATE": "syscall", + "syscall.TOKEN_EXECUTE": "syscall", + "syscall.TOKEN_IMPERSONATE": "syscall", + "syscall.TOKEN_QUERY": "syscall", + "syscall.TOKEN_QUERY_SOURCE": "syscall", + "syscall.TOKEN_READ": "syscall", + "syscall.TOKEN_WRITE": "syscall", + "syscall.TOSTOP": "syscall", + "syscall.TRUNCATE_EXISTING": "syscall", + "syscall.TUNATTACHFILTER": "syscall", + "syscall.TUNDETACHFILTER": "syscall", + "syscall.TUNGETFEATURES": "syscall", + "syscall.TUNGETIFF": "syscall", + "syscall.TUNGETSNDBUF": "syscall", + "syscall.TUNGETVNETHDRSZ": "syscall", + "syscall.TUNSETDEBUG": "syscall", + "syscall.TUNSETGROUP": "syscall", + "syscall.TUNSETIFF": "syscall", + "syscall.TUNSETLINK": "syscall", + "syscall.TUNSETNOCSUM": "syscall", + "syscall.TUNSETOFFLOAD": "syscall", + "syscall.TUNSETOWNER": "syscall", + "syscall.TUNSETPERSIST": "syscall", + "syscall.TUNSETSNDBUF": "syscall", + "syscall.TUNSETTXFILTER": "syscall", + "syscall.TUNSETVNETHDRSZ": "syscall", + "syscall.Tee": "syscall", + "syscall.TerminateProcess": "syscall", + "syscall.Termios": "syscall", + "syscall.Tgkill": "syscall", + "syscall.Time": "syscall", + "syscall.Time_t": "syscall", + "syscall.Times": "syscall", + "syscall.Timespec": "syscall", + "syscall.TimespecToNsec": "syscall", + "syscall.Timeval": "syscall", + "syscall.Timeval32": "syscall", + "syscall.TimevalToNsec": "syscall", + "syscall.Timex": "syscall", + "syscall.Timezoneinformation": "syscall", + "syscall.Tms": "syscall", + "syscall.Token": "syscall", + "syscall.TokenAccessInformation": "syscall", + "syscall.TokenAuditPolicy": "syscall", + "syscall.TokenDefaultDacl": "syscall", + "syscall.TokenElevation": "syscall", + "syscall.TokenElevationType": "syscall", + "syscall.TokenGroups": "syscall", + "syscall.TokenGroupsAndPrivileges": "syscall", + "syscall.TokenHasRestrictions": "syscall", + "syscall.TokenImpersonationLevel": "syscall", + "syscall.TokenIntegrityLevel": "syscall", + "syscall.TokenLinkedToken": "syscall", + "syscall.TokenLogonSid": "syscall", + "syscall.TokenMandatoryPolicy": "syscall", + "syscall.TokenOrigin": "syscall", + "syscall.TokenOwner": "syscall", + "syscall.TokenPrimaryGroup": "syscall", + "syscall.TokenPrivileges": "syscall", + "syscall.TokenRestrictedSids": "syscall", + "syscall.TokenSandBoxInert": "syscall", + "syscall.TokenSessionId": "syscall", + "syscall.TokenSessionReference": "syscall", + "syscall.TokenSource": "syscall", + "syscall.TokenStatistics": "syscall", + "syscall.TokenType": "syscall", + "syscall.TokenUIAccess": "syscall", + "syscall.TokenUser": "syscall", + "syscall.TokenVirtualizationAllowed": "syscall", + "syscall.TokenVirtualizationEnabled": "syscall", + "syscall.Tokenprimarygroup": "syscall", + "syscall.Tokenuser": "syscall", + "syscall.TranslateAccountName": "syscall", + "syscall.TranslateName": "syscall", + "syscall.TransmitFile": "syscall", + "syscall.TransmitFileBuffers": "syscall", + "syscall.Truncate": "syscall", + "syscall.USAGE_MATCH_TYPE_AND": "syscall", + "syscall.USAGE_MATCH_TYPE_OR": "syscall", + "syscall.UTF16FromString": "syscall", + "syscall.UTF16PtrFromString": "syscall", + "syscall.UTF16ToString": "syscall", + "syscall.Ucred": "syscall", + "syscall.Umask": "syscall", + "syscall.Uname": "syscall", + "syscall.Undelete": "syscall", + "syscall.UnixCredentials": "syscall", + "syscall.UnixRights": "syscall", + "syscall.Unlink": "syscall", + "syscall.Unlinkat": "syscall", + "syscall.UnmapViewOfFile": "syscall", + "syscall.Unmount": "syscall", + "syscall.Unsetenv": "syscall", + "syscall.Unshare": "syscall", + "syscall.UserInfo10": "syscall", + "syscall.Ustat": "syscall", + "syscall.Ustat_t": "syscall", + "syscall.Utimbuf": "syscall", + "syscall.Utime": "syscall", + "syscall.Utimes": "syscall", + "syscall.UtimesNano": "syscall", + "syscall.Utsname": "syscall", + "syscall.VDISCARD": "syscall", + "syscall.VDSUSP": "syscall", + "syscall.VEOF": "syscall", + "syscall.VEOL": "syscall", + "syscall.VEOL2": "syscall", + "syscall.VERASE": "syscall", + "syscall.VERASE2": "syscall", + "syscall.VINTR": "syscall", + "syscall.VKILL": "syscall", + "syscall.VLNEXT": "syscall", + "syscall.VMIN": "syscall", + "syscall.VQUIT": "syscall", + "syscall.VREPRINT": "syscall", + "syscall.VSTART": "syscall", + "syscall.VSTATUS": "syscall", + "syscall.VSTOP": "syscall", + "syscall.VSUSP": "syscall", + "syscall.VSWTC": "syscall", + "syscall.VT0": "syscall", + "syscall.VT1": "syscall", + "syscall.VTDLY": "syscall", + "syscall.VTIME": "syscall", + "syscall.VWERASE": "syscall", + "syscall.VirtualLock": "syscall", + "syscall.VirtualUnlock": "syscall", + "syscall.WAIT_ABANDONED": "syscall", + "syscall.WAIT_FAILED": "syscall", + "syscall.WAIT_OBJECT_0": "syscall", + "syscall.WAIT_TIMEOUT": "syscall", + "syscall.WALL": "syscall", + "syscall.WALLSIG": "syscall", + "syscall.WALTSIG": "syscall", + "syscall.WCLONE": "syscall", + "syscall.WCONTINUED": "syscall", + "syscall.WCOREFLAG": "syscall", + "syscall.WEXITED": "syscall", + "syscall.WLINUXCLONE": "syscall", + "syscall.WNOHANG": "syscall", + "syscall.WNOTHREAD": "syscall", + "syscall.WNOWAIT": "syscall", + "syscall.WNOZOMBIE": "syscall", + "syscall.WOPTSCHECKED": "syscall", + "syscall.WORDSIZE": "syscall", + "syscall.WSABuf": "syscall", + "syscall.WSACleanup": "syscall", + "syscall.WSADESCRIPTION_LEN": "syscall", + "syscall.WSAData": "syscall", + "syscall.WSAEACCES": "syscall", + "syscall.WSAECONNRESET": "syscall", + "syscall.WSAEnumProtocols": "syscall", + "syscall.WSAID_CONNECTEX": "syscall", + "syscall.WSAIoctl": "syscall", + "syscall.WSAPROTOCOL_LEN": "syscall", + "syscall.WSAProtocolChain": "syscall", + "syscall.WSAProtocolInfo": "syscall", + "syscall.WSARecv": "syscall", + "syscall.WSARecvFrom": "syscall", + "syscall.WSASYS_STATUS_LEN": "syscall", + "syscall.WSASend": "syscall", + "syscall.WSASendTo": "syscall", + "syscall.WSASendto": "syscall", + "syscall.WSAStartup": "syscall", + "syscall.WSTOPPED": "syscall", + "syscall.WTRAPPED": "syscall", + "syscall.WUNTRACED": "syscall", + "syscall.Wait4": "syscall", + "syscall.WaitForSingleObject": "syscall", + "syscall.WaitStatus": "syscall", + "syscall.Win32FileAttributeData": "syscall", + "syscall.Win32finddata": "syscall", + "syscall.Write": "syscall", + "syscall.WriteConsole": "syscall", + "syscall.WriteFile": "syscall", + "syscall.X509_ASN_ENCODING": "syscall", + "syscall.XCASE": "syscall", + "syscall.XP1_CONNECTIONLESS": "syscall", + "syscall.XP1_CONNECT_DATA": "syscall", + "syscall.XP1_DISCONNECT_DATA": "syscall", + "syscall.XP1_EXPEDITED_DATA": "syscall", + "syscall.XP1_GRACEFUL_CLOSE": "syscall", + "syscall.XP1_GUARANTEED_DELIVERY": "syscall", + "syscall.XP1_GUARANTEED_ORDER": "syscall", + "syscall.XP1_IFS_HANDLES": "syscall", + "syscall.XP1_MESSAGE_ORIENTED": "syscall", + "syscall.XP1_MULTIPOINT_CONTROL_PLANE": "syscall", + "syscall.XP1_MULTIPOINT_DATA_PLANE": "syscall", + "syscall.XP1_PARTIAL_MESSAGE": "syscall", + "syscall.XP1_PSEUDO_STREAM": "syscall", + "syscall.XP1_QOS_SUPPORTED": "syscall", + "syscall.XP1_SAN_SUPPORT_SDP": "syscall", + "syscall.XP1_SUPPORT_BROADCAST": "syscall", + "syscall.XP1_SUPPORT_MULTIPOINT": "syscall", + "syscall.XP1_UNI_RECV": "syscall", + "syscall.XP1_UNI_SEND": "syscall", + "syslog.Dial": "log/syslog", + "syslog.LOG_ALERT": "log/syslog", + "syslog.LOG_AUTH": "log/syslog", + "syslog.LOG_AUTHPRIV": "log/syslog", + "syslog.LOG_CRIT": "log/syslog", + "syslog.LOG_CRON": "log/syslog", + "syslog.LOG_DAEMON": "log/syslog", + "syslog.LOG_DEBUG": "log/syslog", + "syslog.LOG_EMERG": "log/syslog", + "syslog.LOG_ERR": "log/syslog", + "syslog.LOG_FTP": "log/syslog", + "syslog.LOG_INFO": "log/syslog", + "syslog.LOG_KERN": "log/syslog", + "syslog.LOG_LOCAL0": "log/syslog", + "syslog.LOG_LOCAL1": "log/syslog", + "syslog.LOG_LOCAL2": "log/syslog", + "syslog.LOG_LOCAL3": "log/syslog", + "syslog.LOG_LOCAL4": "log/syslog", + "syslog.LOG_LOCAL5": "log/syslog", + "syslog.LOG_LOCAL6": "log/syslog", + "syslog.LOG_LOCAL7": "log/syslog", + "syslog.LOG_LPR": "log/syslog", + "syslog.LOG_MAIL": "log/syslog", + "syslog.LOG_NEWS": "log/syslog", + "syslog.LOG_NOTICE": "log/syslog", + "syslog.LOG_SYSLOG": "log/syslog", + "syslog.LOG_USER": "log/syslog", + "syslog.LOG_UUCP": "log/syslog", + "syslog.LOG_WARNING": "log/syslog", + "syslog.New": "log/syslog", + "syslog.NewLogger": "log/syslog", + "syslog.Priority": "log/syslog", + "syslog.Writer": "log/syslog", + "tabwriter.AlignRight": "text/tabwriter", + "tabwriter.Debug": "text/tabwriter", + "tabwriter.DiscardEmptyColumns": "text/tabwriter", + "tabwriter.Escape": "text/tabwriter", + "tabwriter.FilterHTML": "text/tabwriter", + "tabwriter.NewWriter": "text/tabwriter", + "tabwriter.StripEscape": "text/tabwriter", + "tabwriter.TabIndent": "text/tabwriter", + "tabwriter.Writer": "text/tabwriter", + "tar.ErrFieldTooLong": "archive/tar", + "tar.ErrHeader": "archive/tar", + "tar.ErrWriteAfterClose": "archive/tar", + "tar.ErrWriteTooLong": "archive/tar", + "tar.FileInfoHeader": "archive/tar", + "tar.Header": "archive/tar", + "tar.NewReader": "archive/tar", + "tar.NewWriter": "archive/tar", + "tar.Reader": "archive/tar", + "tar.TypeBlock": "archive/tar", + "tar.TypeChar": "archive/tar", + "tar.TypeCont": "archive/tar", + "tar.TypeDir": "archive/tar", + "tar.TypeFifo": "archive/tar", + "tar.TypeGNULongLink": "archive/tar", + "tar.TypeGNULongName": "archive/tar", + "tar.TypeGNUSparse": "archive/tar", + "tar.TypeLink": "archive/tar", + "tar.TypeReg": "archive/tar", + "tar.TypeRegA": "archive/tar", + "tar.TypeSymlink": "archive/tar", + "tar.TypeXGlobalHeader": "archive/tar", + "tar.TypeXHeader": "archive/tar", + "tar.Writer": "archive/tar", + "template.CSS": "html/template", + "template.ErrAmbigContext": "html/template", + "template.ErrBadHTML": "html/template", + "template.ErrBranchEnd": "html/template", + "template.ErrEndContext": "html/template", + "template.ErrNoSuchTemplate": "html/template", + "template.ErrOutputContext": "html/template", + "template.ErrPartialCharset": "html/template", + "template.ErrPartialEscape": "html/template", + "template.ErrRangeLoopReentry": "html/template", + "template.ErrSlashAmbig": "html/template", + "template.Error": "html/template", + "template.ErrorCode": "html/template", + // "template.FuncMap" is ambiguous + "template.HTML": "html/template", + "template.HTMLAttr": "html/template", + // "template.HTMLEscape" is ambiguous + // "template.HTMLEscapeString" is ambiguous + // "template.HTMLEscaper" is ambiguous + "template.JS": "html/template", + // "template.JSEscape" is ambiguous + // "template.JSEscapeString" is ambiguous + // "template.JSEscaper" is ambiguous + "template.JSStr": "html/template", + // "template.Must" is ambiguous + // "template.New" is ambiguous + "template.OK": "html/template", + // "template.ParseFiles" is ambiguous + // "template.ParseGlob" is ambiguous + // "template.Template" is ambiguous + "template.URL": "html/template", + // "template.URLQueryEscaper" is ambiguous + "testing.AllocsPerRun": "testing", + "testing.B": "testing", + "testing.Benchmark": "testing", + "testing.BenchmarkResult": "testing", + "testing.Cover": "testing", + "testing.CoverBlock": "testing", + "testing.Coverage": "testing", + "testing.InternalBenchmark": "testing", + "testing.InternalExample": "testing", + "testing.InternalTest": "testing", + "testing.M": "testing", + "testing.Main": "testing", + "testing.MainStart": "testing", + "testing.PB": "testing", + "testing.RegisterCover": "testing", + "testing.RunBenchmarks": "testing", + "testing.RunExamples": "testing", + "testing.RunTests": "testing", + "testing.Short": "testing", + "testing.T": "testing", + "testing.Verbose": "testing", + "textproto.CanonicalMIMEHeaderKey": "net/textproto", + "textproto.Conn": "net/textproto", + "textproto.Dial": "net/textproto", + "textproto.Error": "net/textproto", + "textproto.MIMEHeader": "net/textproto", + "textproto.NewConn": "net/textproto", + "textproto.NewReader": "net/textproto", + "textproto.NewWriter": "net/textproto", + "textproto.Pipeline": "net/textproto", + "textproto.ProtocolError": "net/textproto", + "textproto.Reader": "net/textproto", + "textproto.TrimBytes": "net/textproto", + "textproto.TrimString": "net/textproto", + "textproto.Writer": "net/textproto", + "time.ANSIC": "time", + "time.After": "time", + "time.AfterFunc": "time", + "time.April": "time", + "time.August": "time", + "time.Date": "time", + "time.December": "time", + "time.Duration": "time", + "time.February": "time", + "time.FixedZone": "time", + "time.Friday": "time", + "time.Hour": "time", + "time.January": "time", + "time.July": "time", + "time.June": "time", + "time.Kitchen": "time", + "time.LoadLocation": "time", + "time.Local": "time", + "time.Location": "time", + "time.March": "time", + "time.May": "time", + "time.Microsecond": "time", + "time.Millisecond": "time", + "time.Minute": "time", + "time.Monday": "time", + "time.Month": "time", + "time.Nanosecond": "time", + "time.NewTicker": "time", + "time.NewTimer": "time", + "time.November": "time", + "time.Now": "time", + "time.October": "time", + "time.Parse": "time", + "time.ParseDuration": "time", + "time.ParseError": "time", + "time.ParseInLocation": "time", + "time.RFC1123": "time", + "time.RFC1123Z": "time", + "time.RFC3339": "time", + "time.RFC3339Nano": "time", + "time.RFC822": "time", + "time.RFC822Z": "time", + "time.RFC850": "time", + "time.RubyDate": "time", + "time.Saturday": "time", + "time.Second": "time", + "time.September": "time", + "time.Since": "time", + "time.Sleep": "time", + "time.Stamp": "time", + "time.StampMicro": "time", + "time.StampMilli": "time", + "time.StampNano": "time", + "time.Sunday": "time", + "time.Thursday": "time", + "time.Tick": "time", + "time.Ticker": "time", + "time.Time": "time", + "time.Timer": "time", + "time.Tuesday": "time", + "time.UTC": "time", + "time.Unix": "time", + "time.UnixDate": "time", + "time.Wednesday": "time", + "time.Weekday": "time", + "tls.Certificate": "crypto/tls", + "tls.Client": "crypto/tls", + "tls.ClientAuthType": "crypto/tls", + "tls.ClientHelloInfo": "crypto/tls", + "tls.ClientSessionCache": "crypto/tls", + "tls.ClientSessionState": "crypto/tls", + "tls.Config": "crypto/tls", + "tls.Conn": "crypto/tls", + "tls.ConnectionState": "crypto/tls", + "tls.CurveID": "crypto/tls", + "tls.CurveP256": "crypto/tls", + "tls.CurveP384": "crypto/tls", + "tls.CurveP521": "crypto/tls", + "tls.Dial": "crypto/tls", + "tls.DialWithDialer": "crypto/tls", + "tls.Listen": "crypto/tls", + "tls.LoadX509KeyPair": "crypto/tls", + "tls.NewLRUClientSessionCache": "crypto/tls", + "tls.NewListener": "crypto/tls", + "tls.NoClientCert": "crypto/tls", + "tls.RequestClientCert": "crypto/tls", + "tls.RequireAndVerifyClientCert": "crypto/tls", + "tls.RequireAnyClientCert": "crypto/tls", + "tls.Server": "crypto/tls", + "tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA": "crypto/tls", + "tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256": "crypto/tls", + "tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA": "crypto/tls", + "tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384": "crypto/tls", + "tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA": "crypto/tls", + "tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA": "crypto/tls", + "tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA": "crypto/tls", + "tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256": "crypto/tls", + "tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA": "crypto/tls", + "tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384": "crypto/tls", + "tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA": "crypto/tls", + "tls.TLS_FALLBACK_SCSV": "crypto/tls", + "tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA": "crypto/tls", + "tls.TLS_RSA_WITH_AES_128_CBC_SHA": "crypto/tls", + "tls.TLS_RSA_WITH_AES_256_CBC_SHA": "crypto/tls", + "tls.TLS_RSA_WITH_RC4_128_SHA": "crypto/tls", + "tls.VerifyClientCertIfGiven": "crypto/tls", + "tls.VersionSSL30": "crypto/tls", + "tls.VersionTLS10": "crypto/tls", + "tls.VersionTLS11": "crypto/tls", + "tls.VersionTLS12": "crypto/tls", + "tls.X509KeyPair": "crypto/tls", + "token.ADD": "go/token", + "token.ADD_ASSIGN": "go/token", + "token.AND": "go/token", + "token.AND_ASSIGN": "go/token", + "token.AND_NOT": "go/token", + "token.AND_NOT_ASSIGN": "go/token", + "token.ARROW": "go/token", + "token.ASSIGN": "go/token", + "token.BREAK": "go/token", + "token.CASE": "go/token", + "token.CHAN": "go/token", + "token.CHAR": "go/token", + "token.COLON": "go/token", + "token.COMMA": "go/token", + "token.COMMENT": "go/token", + "token.CONST": "go/token", + "token.CONTINUE": "go/token", + "token.DEC": "go/token", + "token.DEFAULT": "go/token", + "token.DEFER": "go/token", + "token.DEFINE": "go/token", + "token.ELLIPSIS": "go/token", + "token.ELSE": "go/token", + "token.EOF": "go/token", + "token.EQL": "go/token", + "token.FALLTHROUGH": "go/token", + "token.FLOAT": "go/token", + "token.FOR": "go/token", + "token.FUNC": "go/token", + "token.File": "go/token", + "token.FileSet": "go/token", + "token.GEQ": "go/token", + "token.GO": "go/token", + "token.GOTO": "go/token", + "token.GTR": "go/token", + "token.HighestPrec": "go/token", + "token.IDENT": "go/token", + "token.IF": "go/token", + "token.ILLEGAL": "go/token", + "token.IMAG": "go/token", + "token.IMPORT": "go/token", + "token.INC": "go/token", + "token.INT": "go/token", + "token.INTERFACE": "go/token", + "token.LAND": "go/token", + "token.LBRACE": "go/token", + "token.LBRACK": "go/token", + "token.LEQ": "go/token", + "token.LOR": "go/token", + "token.LPAREN": "go/token", + "token.LSS": "go/token", + "token.Lookup": "go/token", + "token.LowestPrec": "go/token", + "token.MAP": "go/token", + "token.MUL": "go/token", + "token.MUL_ASSIGN": "go/token", + "token.NEQ": "go/token", + "token.NOT": "go/token", + "token.NewFileSet": "go/token", + "token.NoPos": "go/token", + "token.OR": "go/token", + "token.OR_ASSIGN": "go/token", + "token.PACKAGE": "go/token", + "token.PERIOD": "go/token", + "token.Pos": "go/token", + "token.Position": "go/token", + "token.QUO": "go/token", + "token.QUO_ASSIGN": "go/token", + "token.RANGE": "go/token", + "token.RBRACE": "go/token", + "token.RBRACK": "go/token", + "token.REM": "go/token", + "token.REM_ASSIGN": "go/token", + "token.RETURN": "go/token", + "token.RPAREN": "go/token", + "token.SELECT": "go/token", + "token.SEMICOLON": "go/token", + "token.SHL": "go/token", + "token.SHL_ASSIGN": "go/token", + "token.SHR": "go/token", + "token.SHR_ASSIGN": "go/token", + "token.STRING": "go/token", + "token.STRUCT": "go/token", + "token.SUB": "go/token", + "token.SUB_ASSIGN": "go/token", + "token.SWITCH": "go/token", + "token.TYPE": "go/token", + "token.Token": "go/token", + "token.UnaryPrec": "go/token", + "token.VAR": "go/token", + "token.XOR": "go/token", + "token.XOR_ASSIGN": "go/token", + "trace.Start": "runtime/trace", + "trace.Stop": "runtime/trace", + "types.Array": "go/types", + "types.AssertableTo": "go/types", + "types.AssignableTo": "go/types", + "types.Basic": "go/types", + "types.BasicInfo": "go/types", + "types.BasicKind": "go/types", + "types.Bool": "go/types", + "types.Builtin": "go/types", + "types.Byte": "go/types", + "types.Chan": "go/types", + "types.ChanDir": "go/types", + "types.Checker": "go/types", + "types.Comparable": "go/types", + "types.Complex128": "go/types", + "types.Complex64": "go/types", + "types.Config": "go/types", + "types.Const": "go/types", + "types.ConvertibleTo": "go/types", + "types.DefPredeclaredTestFuncs": "go/types", + "types.Error": "go/types", + "types.Eval": "go/types", + "types.ExprString": "go/types", + "types.FieldVal": "go/types", + "types.Float32": "go/types", + "types.Float64": "go/types", + "types.Func": "go/types", + "types.Id": "go/types", + "types.Identical": "go/types", + "types.Implements": "go/types", + "types.Importer": "go/types", + "types.Info": "go/types", + "types.Initializer": "go/types", + "types.Int": "go/types", + "types.Int16": "go/types", + "types.Int32": "go/types", + "types.Int64": "go/types", + "types.Int8": "go/types", + "types.Interface": "go/types", + "types.Invalid": "go/types", + "types.IsBoolean": "go/types", + "types.IsComplex": "go/types", + "types.IsConstType": "go/types", + "types.IsFloat": "go/types", + "types.IsInteger": "go/types", + "types.IsInterface": "go/types", + "types.IsNumeric": "go/types", + "types.IsOrdered": "go/types", + "types.IsString": "go/types", + "types.IsUnsigned": "go/types", + "types.IsUntyped": "go/types", + "types.Label": "go/types", + "types.LookupFieldOrMethod": "go/types", + "types.Map": "go/types", + "types.MethodExpr": "go/types", + "types.MethodSet": "go/types", + "types.MethodVal": "go/types", + "types.MissingMethod": "go/types", + "types.Named": "go/types", + "types.NewArray": "go/types", + "types.NewChan": "go/types", + "types.NewChecker": "go/types", + "types.NewConst": "go/types", + "types.NewField": "go/types", + "types.NewFunc": "go/types", + "types.NewInterface": "go/types", + "types.NewLabel": "go/types", + "types.NewMap": "go/types", + "types.NewMethodSet": "go/types", + "types.NewNamed": "go/types", + "types.NewPackage": "go/types", + "types.NewParam": "go/types", + "types.NewPkgName": "go/types", + "types.NewPointer": "go/types", + "types.NewScope": "go/types", + "types.NewSignature": "go/types", + "types.NewSlice": "go/types", + "types.NewStruct": "go/types", + "types.NewTuple": "go/types", + "types.NewTypeName": "go/types", + "types.NewVar": "go/types", + "types.Nil": "go/types", + "types.ObjectString": "go/types", + "types.Package": "go/types", + "types.PkgName": "go/types", + "types.Pointer": "go/types", + "types.Qualifier": "go/types", + "types.RecvOnly": "go/types", + "types.RelativeTo": "go/types", + "types.Rune": "go/types", + "types.Scope": "go/types", + "types.Selection": "go/types", + "types.SelectionKind": "go/types", + "types.SelectionString": "go/types", + "types.SendOnly": "go/types", + "types.SendRecv": "go/types", + "types.Signature": "go/types", + "types.Sizes": "go/types", + "types.Slice": "go/types", + "types.StdSizes": "go/types", + "types.String": "go/types", + "types.Struct": "go/types", + "types.Tuple": "go/types", + "types.Typ": "go/types", + "types.Type": "go/types", + "types.TypeAndValue": "go/types", + "types.TypeName": "go/types", + "types.TypeString": "go/types", + "types.Uint": "go/types", + "types.Uint16": "go/types", + "types.Uint32": "go/types", + "types.Uint64": "go/types", + "types.Uint8": "go/types", + "types.Uintptr": "go/types", + "types.Universe": "go/types", + "types.Unsafe": "go/types", + "types.UnsafePointer": "go/types", + "types.UntypedBool": "go/types", + "types.UntypedComplex": "go/types", + "types.UntypedFloat": "go/types", + "types.UntypedInt": "go/types", + "types.UntypedNil": "go/types", + "types.UntypedRune": "go/types", + "types.UntypedString": "go/types", + "types.Var": "go/types", + "types.WriteExpr": "go/types", + "types.WriteSignature": "go/types", + "types.WriteType": "go/types", + "unicode.ASCII_Hex_Digit": "unicode", + "unicode.Ahom": "unicode", + "unicode.Anatolian_Hieroglyphs": "unicode", + "unicode.Arabic": "unicode", + "unicode.Armenian": "unicode", + "unicode.Avestan": "unicode", + "unicode.AzeriCase": "unicode", + "unicode.Balinese": "unicode", + "unicode.Bamum": "unicode", + "unicode.Bassa_Vah": "unicode", + "unicode.Batak": "unicode", + "unicode.Bengali": "unicode", + "unicode.Bidi_Control": "unicode", + "unicode.Bopomofo": "unicode", + "unicode.Brahmi": "unicode", + "unicode.Braille": "unicode", + "unicode.Buginese": "unicode", + "unicode.Buhid": "unicode", + "unicode.C": "unicode", + "unicode.Canadian_Aboriginal": "unicode", + "unicode.Carian": "unicode", + "unicode.CaseRange": "unicode", + "unicode.CaseRanges": "unicode", + "unicode.Categories": "unicode", + "unicode.Caucasian_Albanian": "unicode", + "unicode.Cc": "unicode", + "unicode.Cf": "unicode", + "unicode.Chakma": "unicode", + "unicode.Cham": "unicode", + "unicode.Cherokee": "unicode", + "unicode.Co": "unicode", + "unicode.Common": "unicode", + "unicode.Coptic": "unicode", + "unicode.Cs": "unicode", + "unicode.Cuneiform": "unicode", + "unicode.Cypriot": "unicode", + "unicode.Cyrillic": "unicode", + "unicode.Dash": "unicode", + "unicode.Deprecated": "unicode", + "unicode.Deseret": "unicode", + "unicode.Devanagari": "unicode", + "unicode.Diacritic": "unicode", + "unicode.Digit": "unicode", + "unicode.Duployan": "unicode", + "unicode.Egyptian_Hieroglyphs": "unicode", + "unicode.Elbasan": "unicode", + "unicode.Ethiopic": "unicode", + "unicode.Extender": "unicode", + "unicode.FoldCategory": "unicode", + "unicode.FoldScript": "unicode", + "unicode.Georgian": "unicode", + "unicode.Glagolitic": "unicode", + "unicode.Gothic": "unicode", + "unicode.Grantha": "unicode", + "unicode.GraphicRanges": "unicode", + "unicode.Greek": "unicode", + "unicode.Gujarati": "unicode", + "unicode.Gurmukhi": "unicode", + "unicode.Han": "unicode", + "unicode.Hangul": "unicode", + "unicode.Hanunoo": "unicode", + "unicode.Hatran": "unicode", + "unicode.Hebrew": "unicode", + "unicode.Hex_Digit": "unicode", + "unicode.Hiragana": "unicode", + "unicode.Hyphen": "unicode", + "unicode.IDS_Binary_Operator": "unicode", + "unicode.IDS_Trinary_Operator": "unicode", + "unicode.Ideographic": "unicode", + "unicode.Imperial_Aramaic": "unicode", + "unicode.In": "unicode", + "unicode.Inherited": "unicode", + "unicode.Inscriptional_Pahlavi": "unicode", + "unicode.Inscriptional_Parthian": "unicode", + "unicode.Is": "unicode", + "unicode.IsControl": "unicode", + "unicode.IsDigit": "unicode", + "unicode.IsGraphic": "unicode", + "unicode.IsLetter": "unicode", + "unicode.IsLower": "unicode", + "unicode.IsMark": "unicode", + "unicode.IsNumber": "unicode", + "unicode.IsOneOf": "unicode", + "unicode.IsPrint": "unicode", + "unicode.IsPunct": "unicode", + "unicode.IsSpace": "unicode", + "unicode.IsSymbol": "unicode", + "unicode.IsTitle": "unicode", + "unicode.IsUpper": "unicode", + "unicode.Javanese": "unicode", + "unicode.Join_Control": "unicode", + "unicode.Kaithi": "unicode", + "unicode.Kannada": "unicode", + "unicode.Katakana": "unicode", + "unicode.Kayah_Li": "unicode", + "unicode.Kharoshthi": "unicode", + "unicode.Khmer": "unicode", + "unicode.Khojki": "unicode", + "unicode.Khudawadi": "unicode", + "unicode.L": "unicode", + "unicode.Lao": "unicode", + "unicode.Latin": "unicode", + "unicode.Lepcha": "unicode", + "unicode.Letter": "unicode", + "unicode.Limbu": "unicode", + "unicode.Linear_A": "unicode", + "unicode.Linear_B": "unicode", + "unicode.Lisu": "unicode", + "unicode.Ll": "unicode", + "unicode.Lm": "unicode", + "unicode.Lo": "unicode", + "unicode.Logical_Order_Exception": "unicode", + "unicode.Lower": "unicode", + "unicode.LowerCase": "unicode", + "unicode.Lt": "unicode", + "unicode.Lu": "unicode", + "unicode.Lycian": "unicode", + "unicode.Lydian": "unicode", + "unicode.M": "unicode", + "unicode.Mahajani": "unicode", + "unicode.Malayalam": "unicode", + "unicode.Mandaic": "unicode", + "unicode.Manichaean": "unicode", + "unicode.Mark": "unicode", + "unicode.MaxASCII": "unicode", + "unicode.MaxCase": "unicode", + "unicode.MaxLatin1": "unicode", + "unicode.MaxRune": "unicode", + "unicode.Mc": "unicode", + "unicode.Me": "unicode", + "unicode.Meetei_Mayek": "unicode", + "unicode.Mende_Kikakui": "unicode", + "unicode.Meroitic_Cursive": "unicode", + "unicode.Meroitic_Hieroglyphs": "unicode", + "unicode.Miao": "unicode", + "unicode.Mn": "unicode", + "unicode.Modi": "unicode", + "unicode.Mongolian": "unicode", + "unicode.Mro": "unicode", + "unicode.Multani": "unicode", + "unicode.Myanmar": "unicode", + "unicode.N": "unicode", + "unicode.Nabataean": "unicode", + "unicode.Nd": "unicode", + "unicode.New_Tai_Lue": "unicode", + "unicode.Nko": "unicode", + "unicode.Nl": "unicode", + "unicode.No": "unicode", + "unicode.Noncharacter_Code_Point": "unicode", + "unicode.Number": "unicode", + "unicode.Ogham": "unicode", + "unicode.Ol_Chiki": "unicode", + "unicode.Old_Hungarian": "unicode", + "unicode.Old_Italic": "unicode", + "unicode.Old_North_Arabian": "unicode", + "unicode.Old_Permic": "unicode", + "unicode.Old_Persian": "unicode", + "unicode.Old_South_Arabian": "unicode", + "unicode.Old_Turkic": "unicode", + "unicode.Oriya": "unicode", + "unicode.Osmanya": "unicode", + "unicode.Other": "unicode", + "unicode.Other_Alphabetic": "unicode", + "unicode.Other_Default_Ignorable_Code_Point": "unicode", + "unicode.Other_Grapheme_Extend": "unicode", + "unicode.Other_ID_Continue": "unicode", + "unicode.Other_ID_Start": "unicode", + "unicode.Other_Lowercase": "unicode", + "unicode.Other_Math": "unicode", + "unicode.Other_Uppercase": "unicode", + "unicode.P": "unicode", + "unicode.Pahawh_Hmong": "unicode", + "unicode.Palmyrene": "unicode", + "unicode.Pattern_Syntax": "unicode", + "unicode.Pattern_White_Space": "unicode", + "unicode.Pau_Cin_Hau": "unicode", + "unicode.Pc": "unicode", + "unicode.Pd": "unicode", + "unicode.Pe": "unicode", + "unicode.Pf": "unicode", + "unicode.Phags_Pa": "unicode", + "unicode.Phoenician": "unicode", + "unicode.Pi": "unicode", + "unicode.Po": "unicode", + "unicode.PrintRanges": "unicode", + "unicode.Properties": "unicode", + "unicode.Ps": "unicode", + "unicode.Psalter_Pahlavi": "unicode", + "unicode.Punct": "unicode", + "unicode.Quotation_Mark": "unicode", + "unicode.Radical": "unicode", + "unicode.Range16": "unicode", + "unicode.Range32": "unicode", + "unicode.RangeTable": "unicode", + "unicode.Rejang": "unicode", + "unicode.ReplacementChar": "unicode", + "unicode.Runic": "unicode", + "unicode.S": "unicode", + "unicode.STerm": "unicode", + "unicode.Samaritan": "unicode", + "unicode.Saurashtra": "unicode", + "unicode.Sc": "unicode", + "unicode.Scripts": "unicode", + "unicode.Sharada": "unicode", + "unicode.Shavian": "unicode", + "unicode.Siddham": "unicode", + "unicode.SignWriting": "unicode", + "unicode.SimpleFold": "unicode", + "unicode.Sinhala": "unicode", + "unicode.Sk": "unicode", + "unicode.Sm": "unicode", + "unicode.So": "unicode", + "unicode.Soft_Dotted": "unicode", + "unicode.Sora_Sompeng": "unicode", + "unicode.Space": "unicode", + "unicode.SpecialCase": "unicode", + "unicode.Sundanese": "unicode", + "unicode.Syloti_Nagri": "unicode", + "unicode.Symbol": "unicode", + "unicode.Syriac": "unicode", + "unicode.Tagalog": "unicode", + "unicode.Tagbanwa": "unicode", + "unicode.Tai_Le": "unicode", + "unicode.Tai_Tham": "unicode", + "unicode.Tai_Viet": "unicode", + "unicode.Takri": "unicode", + "unicode.Tamil": "unicode", + "unicode.Telugu": "unicode", + "unicode.Terminal_Punctuation": "unicode", + "unicode.Thaana": "unicode", + "unicode.Thai": "unicode", + "unicode.Tibetan": "unicode", + "unicode.Tifinagh": "unicode", + "unicode.Tirhuta": "unicode", + "unicode.Title": "unicode", + "unicode.TitleCase": "unicode", + "unicode.To": "unicode", + "unicode.ToLower": "unicode", + "unicode.ToTitle": "unicode", + "unicode.ToUpper": "unicode", + "unicode.TurkishCase": "unicode", + "unicode.Ugaritic": "unicode", + "unicode.Unified_Ideograph": "unicode", + "unicode.Upper": "unicode", + "unicode.UpperCase": "unicode", + "unicode.UpperLower": "unicode", + "unicode.Vai": "unicode", + "unicode.Variation_Selector": "unicode", + "unicode.Version": "unicode", + "unicode.Warang_Citi": "unicode", + "unicode.White_Space": "unicode", + "unicode.Yi": "unicode", + "unicode.Z": "unicode", + "unicode.Zl": "unicode", + "unicode.Zp": "unicode", + "unicode.Zs": "unicode", + "url.Error": "net/url", + "url.EscapeError": "net/url", + "url.Parse": "net/url", + "url.ParseQuery": "net/url", + "url.ParseRequestURI": "net/url", + "url.QueryEscape": "net/url", + "url.QueryUnescape": "net/url", + "url.URL": "net/url", + "url.User": "net/url", + "url.UserPassword": "net/url", + "url.Userinfo": "net/url", + "url.Values": "net/url", + "user.Current": "os/user", + "user.Lookup": "os/user", + "user.LookupId": "os/user", + "user.UnknownUserError": "os/user", + "user.UnknownUserIdError": "os/user", + "user.User": "os/user", + "utf16.Decode": "unicode/utf16", + "utf16.DecodeRune": "unicode/utf16", + "utf16.Encode": "unicode/utf16", + "utf16.EncodeRune": "unicode/utf16", + "utf16.IsSurrogate": "unicode/utf16", + "utf8.DecodeLastRune": "unicode/utf8", + "utf8.DecodeLastRuneInString": "unicode/utf8", + "utf8.DecodeRune": "unicode/utf8", + "utf8.DecodeRuneInString": "unicode/utf8", + "utf8.EncodeRune": "unicode/utf8", + "utf8.FullRune": "unicode/utf8", + "utf8.FullRuneInString": "unicode/utf8", + "utf8.MaxRune": "unicode/utf8", + "utf8.RuneCount": "unicode/utf8", + "utf8.RuneCountInString": "unicode/utf8", + "utf8.RuneError": "unicode/utf8", + "utf8.RuneLen": "unicode/utf8", + "utf8.RuneSelf": "unicode/utf8", + "utf8.RuneStart": "unicode/utf8", + "utf8.UTFMax": "unicode/utf8", + "utf8.Valid": "unicode/utf8", + "utf8.ValidRune": "unicode/utf8", + "utf8.ValidString": "unicode/utf8", + "x509.CANotAuthorizedForThisName": "crypto/x509", + "x509.CertPool": "crypto/x509", + "x509.Certificate": "crypto/x509", + "x509.CertificateInvalidError": "crypto/x509", + "x509.CertificateRequest": "crypto/x509", + "x509.ConstraintViolationError": "crypto/x509", + "x509.CreateCertificate": "crypto/x509", + "x509.CreateCertificateRequest": "crypto/x509", + "x509.DSA": "crypto/x509", + "x509.DSAWithSHA1": "crypto/x509", + "x509.DSAWithSHA256": "crypto/x509", + "x509.DecryptPEMBlock": "crypto/x509", + "x509.ECDSA": "crypto/x509", + "x509.ECDSAWithSHA1": "crypto/x509", + "x509.ECDSAWithSHA256": "crypto/x509", + "x509.ECDSAWithSHA384": "crypto/x509", + "x509.ECDSAWithSHA512": "crypto/x509", + "x509.EncryptPEMBlock": "crypto/x509", + "x509.ErrUnsupportedAlgorithm": "crypto/x509", + "x509.Expired": "crypto/x509", + "x509.ExtKeyUsage": "crypto/x509", + "x509.ExtKeyUsageAny": "crypto/x509", + "x509.ExtKeyUsageClientAuth": "crypto/x509", + "x509.ExtKeyUsageCodeSigning": "crypto/x509", + "x509.ExtKeyUsageEmailProtection": "crypto/x509", + "x509.ExtKeyUsageIPSECEndSystem": "crypto/x509", + "x509.ExtKeyUsageIPSECTunnel": "crypto/x509", + "x509.ExtKeyUsageIPSECUser": "crypto/x509", + "x509.ExtKeyUsageMicrosoftServerGatedCrypto": "crypto/x509", + "x509.ExtKeyUsageNetscapeServerGatedCrypto": "crypto/x509", + "x509.ExtKeyUsageOCSPSigning": "crypto/x509", + "x509.ExtKeyUsageServerAuth": "crypto/x509", + "x509.ExtKeyUsageTimeStamping": "crypto/x509", + "x509.HostnameError": "crypto/x509", + "x509.IncompatibleUsage": "crypto/x509", + "x509.IncorrectPasswordError": "crypto/x509", + "x509.InvalidReason": "crypto/x509", + "x509.IsEncryptedPEMBlock": "crypto/x509", + "x509.KeyUsage": "crypto/x509", + "x509.KeyUsageCRLSign": "crypto/x509", + "x509.KeyUsageCertSign": "crypto/x509", + "x509.KeyUsageContentCommitment": "crypto/x509", + "x509.KeyUsageDataEncipherment": "crypto/x509", + "x509.KeyUsageDecipherOnly": "crypto/x509", + "x509.KeyUsageDigitalSignature": "crypto/x509", + "x509.KeyUsageEncipherOnly": "crypto/x509", + "x509.KeyUsageKeyAgreement": "crypto/x509", + "x509.KeyUsageKeyEncipherment": "crypto/x509", + "x509.MD2WithRSA": "crypto/x509", + "x509.MD5WithRSA": "crypto/x509", + "x509.MarshalECPrivateKey": "crypto/x509", + "x509.MarshalPKCS1PrivateKey": "crypto/x509", + "x509.MarshalPKIXPublicKey": "crypto/x509", + "x509.NewCertPool": "crypto/x509", + "x509.NotAuthorizedToSign": "crypto/x509", + "x509.PEMCipher": "crypto/x509", + "x509.PEMCipher3DES": "crypto/x509", + "x509.PEMCipherAES128": "crypto/x509", + "x509.PEMCipherAES192": "crypto/x509", + "x509.PEMCipherAES256": "crypto/x509", + "x509.PEMCipherDES": "crypto/x509", + "x509.ParseCRL": "crypto/x509", + "x509.ParseCertificate": "crypto/x509", + "x509.ParseCertificateRequest": "crypto/x509", + "x509.ParseCertificates": "crypto/x509", + "x509.ParseDERCRL": "crypto/x509", + "x509.ParseECPrivateKey": "crypto/x509", + "x509.ParsePKCS1PrivateKey": "crypto/x509", + "x509.ParsePKCS8PrivateKey": "crypto/x509", + "x509.ParsePKIXPublicKey": "crypto/x509", + "x509.PublicKeyAlgorithm": "crypto/x509", + "x509.RSA": "crypto/x509", + "x509.SHA1WithRSA": "crypto/x509", + "x509.SHA256WithRSA": "crypto/x509", + "x509.SHA384WithRSA": "crypto/x509", + "x509.SHA512WithRSA": "crypto/x509", + "x509.SignatureAlgorithm": "crypto/x509", + "x509.SystemRootsError": "crypto/x509", + "x509.TooManyIntermediates": "crypto/x509", + "x509.UnhandledCriticalExtension": "crypto/x509", + "x509.UnknownAuthorityError": "crypto/x509", + "x509.UnknownPublicKeyAlgorithm": "crypto/x509", + "x509.UnknownSignatureAlgorithm": "crypto/x509", + "x509.VerifyOptions": "crypto/x509", + "xml.Attr": "encoding/xml", + "xml.CharData": "encoding/xml", + "xml.Comment": "encoding/xml", + "xml.CopyToken": "encoding/xml", + "xml.Decoder": "encoding/xml", + "xml.Directive": "encoding/xml", + "xml.Encoder": "encoding/xml", + "xml.EndElement": "encoding/xml", + "xml.Escape": "encoding/xml", + "xml.EscapeText": "encoding/xml", + "xml.HTMLAutoClose": "encoding/xml", + "xml.HTMLEntity": "encoding/xml", + "xml.Header": "encoding/xml", + "xml.Marshal": "encoding/xml", + "xml.MarshalIndent": "encoding/xml", + "xml.Marshaler": "encoding/xml", + "xml.MarshalerAttr": "encoding/xml", + "xml.Name": "encoding/xml", + "xml.NewDecoder": "encoding/xml", + "xml.NewEncoder": "encoding/xml", + "xml.ProcInst": "encoding/xml", + "xml.StartElement": "encoding/xml", + "xml.SyntaxError": "encoding/xml", + "xml.TagPathError": "encoding/xml", + "xml.Token": "encoding/xml", + "xml.Unmarshal": "encoding/xml", + "xml.UnmarshalError": "encoding/xml", + "xml.Unmarshaler": "encoding/xml", + "xml.UnmarshalerAttr": "encoding/xml", + "xml.UnsupportedTypeError": "encoding/xml", + "zip.Compressor": "archive/zip", + "zip.Decompressor": "archive/zip", + "zip.Deflate": "archive/zip", + "zip.ErrAlgorithm": "archive/zip", + "zip.ErrChecksum": "archive/zip", + "zip.ErrFormat": "archive/zip", + "zip.File": "archive/zip", + "zip.FileHeader": "archive/zip", + "zip.FileInfoHeader": "archive/zip", + "zip.NewReader": "archive/zip", + "zip.NewWriter": "archive/zip", + "zip.OpenReader": "archive/zip", + "zip.ReadCloser": "archive/zip", + "zip.Reader": "archive/zip", + "zip.RegisterCompressor": "archive/zip", + "zip.RegisterDecompressor": "archive/zip", + "zip.Store": "archive/zip", + "zip.Writer": "archive/zip", + "zlib.BestCompression": "compress/zlib", + "zlib.BestSpeed": "compress/zlib", + "zlib.DefaultCompression": "compress/zlib", + "zlib.ErrChecksum": "compress/zlib", + "zlib.ErrDictionary": "compress/zlib", + "zlib.ErrHeader": "compress/zlib", + "zlib.NewReader": "compress/zlib", + "zlib.NewReaderDict": "compress/zlib", + "zlib.NewWriter": "compress/zlib", + "zlib.NewWriterLevel": "compress/zlib", + "zlib.NewWriterLevelDict": "compress/zlib", + "zlib.NoCompression": "compress/zlib", + "zlib.Resetter": "compress/zlib", + "zlib.Writer": "compress/zlib", +} diff --git a/vendor/golang.org/x/tools/oracle/TODO b/vendor/golang.org/x/tools/oracle/TODO new file mode 100644 index 0000000000..8fbf5e867f --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/TODO @@ -0,0 +1,83 @@ + + +ORACLE TODO +=========== + +General +======= + +Save unsaved editor buffers into an archive and provide that to the +tools, which should act as if they were saved. + +Include complete pos/end information Serial output. + But beware that sometimes a single token (e.g. +) is more helpful + than the pos/end of the containing expression (e.g. x \n + \n y). + +Specific queries +================ + +callers, callees + + Use a type-based (e.g. RTA) callgraph when a callers/callees query is + outside the analysis scope. + +implements + + Make it require that the selection is a type, and show only the + implements relation as it applies to that type. + +definition, referrers + + definition: Make it work with qualified identifiers (SelectorExpr) too. + + references: Make it work on things that are implicit idents, like + import specs, perhaps? + +what + + Report def/ref info if available. + Editors could use it to highlight all idents of the same local var. + + More tests. + +pointsto + + When invoked on a function Ident, we get an error. + + When invoked on a named return parameter, we get an error. + +describe + + When invoked on a var, we want to see the type and its methods. + + Split "show type" and "describe syntax" into separate commands? + +peers + + Permit querying from a makechan, for...range, or reflective op. + + Report aliasing reflect.{Send,Recv,Close} and close() operations. + +New queries + +"updaters": show all statements that may update the selected lvalue + (local, global, field, etc). + +"creators": show all places where an object of type T is created + (&T{}, var t T, new(T), new(struct{array [3]T}), etc. + (Useful for datatypes whose zero value is not safe) + + +Editor-specific +=============== + +Add support for "what" to .el; clean up. + +Emacs: use JSON to get the raw information from the oracle. Don't + open an editor buffer for simpler queries, just jump to the result + and/or display it in the modeline. + +Emacs: go-root-and-paths depends on the current buffer, so be sure to + call it from within the source file, not the *go-oracle* buffer: + the user may have switched workspaces and the oracle should run in + the new one. diff --git a/vendor/golang.org/x/tools/oracle/callees.go b/vendor/golang.org/x/tools/oracle/callees.go new file mode 100644 index 0000000000..06c2c15efa --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/callees.go @@ -0,0 +1,260 @@ +// Copyright 2013 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.5 + +package oracle + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" + "sort" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/pointer" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/oracle/serial" +) + +// Callees reports the possible callees of the function call site +// identified by the specified source location. +func callees(q *Query) error { + lconf := loader.Config{Build: q.Build} + + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, true) // needs exact pos + if err != nil { + return err + } + + // Determine the enclosing call for the specified position. + var e *ast.CallExpr + for _, n := range qpos.path { + if e, _ = n.(*ast.CallExpr); e != nil { + break + } + } + if e == nil { + return fmt.Errorf("there is no function call here") + } + // TODO(adonovan): issue an error if the call is "too far + // away" from the current selection, as this most likely is + // not what the user intended. + + // Reject type conversions. + if qpos.info.Types[e.Fun].IsType() { + return fmt.Errorf("this is a type conversion, not a function call") + } + + // Deal with obviously static calls before constructing SSA form. + // Some static calls may yet require SSA construction, + // e.g. f := func(){}; f(). + switch funexpr := unparen(e.Fun).(type) { + case *ast.Ident: + switch obj := qpos.info.Uses[funexpr].(type) { + case *types.Builtin: + // Reject calls to built-ins. + return fmt.Errorf("this is a call to the built-in '%s' operator", obj.Name()) + case *types.Func: + // This is a static function call + q.result = &calleesTypesResult{ + site: e, + callee: obj, + } + return nil + } + case *ast.SelectorExpr: + sel := qpos.info.Selections[funexpr] + if sel == nil { + // qualified identifier. + // May refer to top level function variable + // or to top level function. + callee := qpos.info.Uses[funexpr.Sel] + if obj, ok := callee.(*types.Func); ok { + q.result = &calleesTypesResult{ + site: e, + callee: obj, + } + return nil + } + } else if sel.Kind() == types.MethodVal { + // Inspect the receiver type of the selected method. + // If it is concrete, the call is statically dispatched. + // (Due to implicit field selections, it is not enough to look + // at sel.Recv(), the type of the actual receiver expression.) + method := sel.Obj().(*types.Func) + recvtype := method.Type().(*types.Signature).Recv().Type() + if !types.IsInterface(recvtype) { + // static method call + q.result = &calleesTypesResult{ + site: e, + callee: method, + } + return nil + } + } + } + + prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug) + + ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection) + if err != nil { + return err + } + + pkg := prog.Package(qpos.info.Pkg) + if pkg == nil { + return fmt.Errorf("no SSA package") + } + + // Defer SSA construction till after errors are reported. + prog.Build() + + // Ascertain calling function and call site. + callerFn := ssa.EnclosingFunction(pkg, qpos.path) + if callerFn == nil { + return fmt.Errorf("no SSA function built for this location (dead code?)") + } + + // Find the call site. + site, err := findCallSite(callerFn, e) + if err != nil { + return err + } + + funcs, err := findCallees(ptaConfig, site) + if err != nil { + return err + } + + q.result = &calleesSSAResult{ + site: site, + funcs: funcs, + } + return nil +} + +func findCallSite(fn *ssa.Function, call *ast.CallExpr) (ssa.CallInstruction, error) { + instr, _ := fn.ValueForExpr(call) + callInstr, _ := instr.(ssa.CallInstruction) + if instr == nil { + return nil, fmt.Errorf("this call site is unreachable in this analysis") + } + return callInstr, nil +} + +func findCallees(conf *pointer.Config, site ssa.CallInstruction) ([]*ssa.Function, error) { + // Avoid running the pointer analysis for static calls. + if callee := site.Common().StaticCallee(); callee != nil { + switch callee.String() { + case "runtime.SetFinalizer", "(reflect.Value).Call": + // The PTA treats calls to these intrinsics as dynamic. + // TODO(adonovan): avoid reliance on PTA internals. + + default: + return []*ssa.Function{callee}, nil // singleton + } + } + + // Dynamic call: use pointer analysis. + conf.BuildCallGraph = true + cg := ptrAnalysis(conf).CallGraph + cg.DeleteSyntheticNodes() + + // Find all call edges from the site. + n := cg.Nodes[site.Parent()] + if n == nil { + return nil, fmt.Errorf("this call site is unreachable in this analysis") + } + calleesMap := make(map[*ssa.Function]bool) + for _, edge := range n.Out { + if edge.Site == site { + calleesMap[edge.Callee.Func] = true + } + } + + // De-duplicate and sort. + funcs := make([]*ssa.Function, 0, len(calleesMap)) + for f := range calleesMap { + funcs = append(funcs, f) + } + sort.Sort(byFuncPos(funcs)) + return funcs, nil +} + +type calleesSSAResult struct { + site ssa.CallInstruction + funcs []*ssa.Function +} + +type calleesTypesResult struct { + site *ast.CallExpr + callee *types.Func +} + +func (r *calleesSSAResult) display(printf printfFunc) { + if len(r.funcs) == 0 { + // dynamic call on a provably nil func/interface + printf(r.site, "%s on nil value", r.site.Common().Description()) + } else { + printf(r.site, "this %s dispatches to:", r.site.Common().Description()) + for _, callee := range r.funcs { + printf(callee, "\t%s", callee) + } + } +} + +func (r *calleesSSAResult) toSerial(res *serial.Result, fset *token.FileSet) { + j := &serial.Callees{ + Pos: fset.Position(r.site.Pos()).String(), + Desc: r.site.Common().Description(), + } + for _, callee := range r.funcs { + j.Callees = append(j.Callees, &serial.CalleesItem{ + Name: callee.String(), + Pos: fset.Position(callee.Pos()).String(), + }) + } + res.Callees = j +} + +func (r *calleesTypesResult) display(printf printfFunc) { + printf(r.site, "this static function call dispatches to:") + printf(r.callee, "\t%s", r.callee.FullName()) +} + +func (r *calleesTypesResult) toSerial(res *serial.Result, fset *token.FileSet) { + j := &serial.Callees{ + Pos: fset.Position(r.site.Pos()).String(), + Desc: "static function call", + } + j.Callees = []*serial.CalleesItem{ + &serial.CalleesItem{ + Name: r.callee.FullName(), + Pos: fset.Position(r.callee.Pos()).String(), + }, + } + res.Callees = j +} + +// NB: byFuncPos is not deterministic across packages since it depends on load order. +// Use lessPos if the tests need it. +type byFuncPos []*ssa.Function + +func (a byFuncPos) Len() int { return len(a) } +func (a byFuncPos) Less(i, j int) bool { return a[i].Pos() < a[j].Pos() } +func (a byFuncPos) Swap(i, j int) { a[i], a[j] = a[j], a[i] } diff --git a/vendor/golang.org/x/tools/oracle/callees14.go b/vendor/golang.org/x/tools/oracle/callees14.go new file mode 100644 index 0000000000..b6d0ffeb85 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/callees14.go @@ -0,0 +1,260 @@ +// Copyright 2013 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.5 + +package oracle + +import ( + "fmt" + "go/ast" + "go/token" + "sort" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/pointer" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/go/types" + "golang.org/x/tools/oracle/serial" +) + +// Callees reports the possible callees of the function call site +// identified by the specified source location. +func callees(q *Query) error { + lconf := loader.Config{Build: q.Build} + + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, true) // needs exact pos + if err != nil { + return err + } + + // Determine the enclosing call for the specified position. + var e *ast.CallExpr + for _, n := range qpos.path { + if e, _ = n.(*ast.CallExpr); e != nil { + break + } + } + if e == nil { + return fmt.Errorf("there is no function call here") + } + // TODO(adonovan): issue an error if the call is "too far + // away" from the current selection, as this most likely is + // not what the user intended. + + // Reject type conversions. + if qpos.info.Types[e.Fun].IsType() { + return fmt.Errorf("this is a type conversion, not a function call") + } + + // Deal with obviously static calls before constructing SSA form. + // Some static calls may yet require SSA construction, + // e.g. f := func(){}; f(). + switch funexpr := unparen(e.Fun).(type) { + case *ast.Ident: + switch obj := qpos.info.Uses[funexpr].(type) { + case *types.Builtin: + // Reject calls to built-ins. + return fmt.Errorf("this is a call to the built-in '%s' operator", obj.Name()) + case *types.Func: + // This is a static function call + q.result = &calleesTypesResult{ + site: e, + callee: obj, + } + return nil + } + case *ast.SelectorExpr: + sel := qpos.info.Selections[funexpr] + if sel == nil { + // qualified identifier. + // May refer to top level function variable + // or to top level function. + callee := qpos.info.Uses[funexpr.Sel] + if obj, ok := callee.(*types.Func); ok { + q.result = &calleesTypesResult{ + site: e, + callee: obj, + } + return nil + } + } else if sel.Kind() == types.MethodVal { + // Inspect the receiver type of the selected method. + // If it is concrete, the call is statically dispatched. + // (Due to implicit field selections, it is not enough to look + // at sel.Recv(), the type of the actual receiver expression.) + method := sel.Obj().(*types.Func) + recvtype := method.Type().(*types.Signature).Recv().Type() + if !types.IsInterface(recvtype) { + // static method call + q.result = &calleesTypesResult{ + site: e, + callee: method, + } + return nil + } + } + } + + prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug) + + ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection) + if err != nil { + return err + } + + pkg := prog.Package(qpos.info.Pkg) + if pkg == nil { + return fmt.Errorf("no SSA package") + } + + // Defer SSA construction till after errors are reported. + prog.Build() + + // Ascertain calling function and call site. + callerFn := ssa.EnclosingFunction(pkg, qpos.path) + if callerFn == nil { + return fmt.Errorf("no SSA function built for this location (dead code?)") + } + + // Find the call site. + site, err := findCallSite(callerFn, e) + if err != nil { + return err + } + + funcs, err := findCallees(ptaConfig, site) + if err != nil { + return err + } + + q.result = &calleesSSAResult{ + site: site, + funcs: funcs, + } + return nil +} + +func findCallSite(fn *ssa.Function, call *ast.CallExpr) (ssa.CallInstruction, error) { + instr, _ := fn.ValueForExpr(call) + callInstr, _ := instr.(ssa.CallInstruction) + if instr == nil { + return nil, fmt.Errorf("this call site is unreachable in this analysis") + } + return callInstr, nil +} + +func findCallees(conf *pointer.Config, site ssa.CallInstruction) ([]*ssa.Function, error) { + // Avoid running the pointer analysis for static calls. + if callee := site.Common().StaticCallee(); callee != nil { + switch callee.String() { + case "runtime.SetFinalizer", "(reflect.Value).Call": + // The PTA treats calls to these intrinsics as dynamic. + // TODO(adonovan): avoid reliance on PTA internals. + + default: + return []*ssa.Function{callee}, nil // singleton + } + } + + // Dynamic call: use pointer analysis. + conf.BuildCallGraph = true + cg := ptrAnalysis(conf).CallGraph + cg.DeleteSyntheticNodes() + + // Find all call edges from the site. + n := cg.Nodes[site.Parent()] + if n == nil { + return nil, fmt.Errorf("this call site is unreachable in this analysis") + } + calleesMap := make(map[*ssa.Function]bool) + for _, edge := range n.Out { + if edge.Site == site { + calleesMap[edge.Callee.Func] = true + } + } + + // De-duplicate and sort. + funcs := make([]*ssa.Function, 0, len(calleesMap)) + for f := range calleesMap { + funcs = append(funcs, f) + } + sort.Sort(byFuncPos(funcs)) + return funcs, nil +} + +type calleesSSAResult struct { + site ssa.CallInstruction + funcs []*ssa.Function +} + +type calleesTypesResult struct { + site *ast.CallExpr + callee *types.Func +} + +func (r *calleesSSAResult) display(printf printfFunc) { + if len(r.funcs) == 0 { + // dynamic call on a provably nil func/interface + printf(r.site, "%s on nil value", r.site.Common().Description()) + } else { + printf(r.site, "this %s dispatches to:", r.site.Common().Description()) + for _, callee := range r.funcs { + printf(callee, "\t%s", callee) + } + } +} + +func (r *calleesSSAResult) toSerial(res *serial.Result, fset *token.FileSet) { + j := &serial.Callees{ + Pos: fset.Position(r.site.Pos()).String(), + Desc: r.site.Common().Description(), + } + for _, callee := range r.funcs { + j.Callees = append(j.Callees, &serial.CalleesItem{ + Name: callee.String(), + Pos: fset.Position(callee.Pos()).String(), + }) + } + res.Callees = j +} + +func (r *calleesTypesResult) display(printf printfFunc) { + printf(r.site, "this static function call dispatches to:") + printf(r.callee, "\t%s", r.callee.FullName()) +} + +func (r *calleesTypesResult) toSerial(res *serial.Result, fset *token.FileSet) { + j := &serial.Callees{ + Pos: fset.Position(r.site.Pos()).String(), + Desc: "static function call", + } + j.Callees = []*serial.CalleesItem{ + &serial.CalleesItem{ + Name: r.callee.FullName(), + Pos: fset.Position(r.callee.Pos()).String(), + }, + } + res.Callees = j +} + +// NB: byFuncPos is not deterministic across packages since it depends on load order. +// Use lessPos if the tests need it. +type byFuncPos []*ssa.Function + +func (a byFuncPos) Len() int { return len(a) } +func (a byFuncPos) Less(i, j int) bool { return a[i].Pos() < a[j].Pos() } +func (a byFuncPos) Swap(i, j int) { a[i], a[j] = a[j], a[i] } diff --git a/vendor/golang.org/x/tools/oracle/callers.go b/vendor/golang.org/x/tools/oracle/callers.go new file mode 100644 index 0000000000..e7f3c8f700 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/callers.go @@ -0,0 +1,115 @@ +// Copyright 2013 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 oracle + +import ( + "fmt" + "go/token" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/oracle/serial" +) + +// Callers reports the possible callers of the function +// immediately enclosing the specified source location. +// +func callers(q *Query) error { + lconf := loader.Config{Build: q.Build} + + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + prog := ssautil.CreateProgram(lprog, 0) + + ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection) + if err != nil { + return err + } + + pkg := prog.Package(qpos.info.Pkg) + if pkg == nil { + return fmt.Errorf("no SSA package") + } + if !ssa.HasEnclosingFunction(pkg, qpos.path) { + return fmt.Errorf("this position is not inside a function") + } + + // Defer SSA construction till after errors are reported. + prog.Build() + + target := ssa.EnclosingFunction(pkg, qpos.path) + if target == nil { + return fmt.Errorf("no SSA function built for this location (dead code?)") + } + + // TODO(adonovan): opt: if function is never address-taken, skip + // the pointer analysis. Just look for direct calls. This can + // be done in a single pass over the SSA. + + // Run the pointer analysis, recording each + // call found to originate from target. + ptaConfig.BuildCallGraph = true + cg := ptrAnalysis(ptaConfig).CallGraph + cg.DeleteSyntheticNodes() + edges := cg.CreateNode(target).In + // TODO(adonovan): sort + dedup calls to ensure test determinism. + + q.result = &callersResult{ + target: target, + callgraph: cg, + edges: edges, + } + return nil +} + +type callersResult struct { + target *ssa.Function + callgraph *callgraph.Graph + edges []*callgraph.Edge +} + +func (r *callersResult) display(printf printfFunc) { + root := r.callgraph.Root + if r.edges == nil { + printf(r.target, "%s is not reachable in this program.", r.target) + } else { + printf(r.target, "%s is called from these %d sites:", r.target, len(r.edges)) + for _, edge := range r.edges { + if edge.Caller == root { + printf(r.target, "the root of the call graph") + } else { + printf(edge, "\t%s from %s", edge.Description(), edge.Caller.Func) + } + } + } +} + +func (r *callersResult) toSerial(res *serial.Result, fset *token.FileSet) { + var callers []serial.Caller + for _, edge := range r.edges { + callers = append(callers, serial.Caller{ + Caller: edge.Caller.Func.String(), + Pos: fset.Position(edge.Pos()).String(), + Desc: edge.Description(), + }) + } + res.Callers = callers +} diff --git a/vendor/golang.org/x/tools/oracle/callstack.go b/vendor/golang.org/x/tools/oracle/callstack.go new file mode 100644 index 0000000000..ba88e9942a --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/callstack.go @@ -0,0 +1,126 @@ +// Copyright 2013 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 oracle + +import ( + "fmt" + "go/token" + + "golang.org/x/tools/go/callgraph" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/oracle/serial" +) + +// Callstack displays an arbitrary path from a root of the callgraph +// to the function at the current position. +// +// The information may be misleading in a context-insensitive +// analysis. e.g. the call path X->Y->Z might be infeasible if Y never +// calls Z when it is called from X. TODO(adonovan): think about UI. +// +// TODO(adonovan): permit user to specify a starting point other than +// the analysis root. +// +func callstack(q *Query) error { + fset := token.NewFileSet() + lconf := loader.Config{Fset: fset, Build: q.Build} + + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + + qpos, err := parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + prog := ssautil.CreateProgram(lprog, 0) + + ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection) + if err != nil { + return err + } + + pkg := prog.Package(qpos.info.Pkg) + if pkg == nil { + return fmt.Errorf("no SSA package") + } + + if !ssa.HasEnclosingFunction(pkg, qpos.path) { + return fmt.Errorf("this position is not inside a function") + } + + // Defer SSA construction till after errors are reported. + prog.Build() + + target := ssa.EnclosingFunction(pkg, qpos.path) + if target == nil { + return fmt.Errorf("no SSA function built for this location (dead code?)") + } + + // Run the pointer analysis and build the complete call graph. + ptaConfig.BuildCallGraph = true + cg := ptrAnalysis(ptaConfig).CallGraph + cg.DeleteSyntheticNodes() + + // Search for an arbitrary path from a root to the target function. + isEnd := func(n *callgraph.Node) bool { return n.Func == target } + callpath := callgraph.PathSearch(cg.Root, isEnd) + if callpath != nil { + callpath = callpath[1:] // remove synthetic edge from + } + + q.Fset = fset + q.result = &callstackResult{ + qpos: qpos, + target: target, + callpath: callpath, + } + return nil +} + +type callstackResult struct { + qpos *queryPos + target *ssa.Function + callpath []*callgraph.Edge +} + +func (r *callstackResult) display(printf printfFunc) { + if r.callpath != nil { + printf(r.qpos, "Found a call path from root to %s", r.target) + printf(r.target, "%s", r.target) + for i := len(r.callpath) - 1; i >= 0; i-- { + edge := r.callpath[i] + printf(edge, "%s from %s", edge.Description(), edge.Caller.Func) + } + } else { + printf(r.target, "%s is unreachable in this analysis scope", r.target) + } +} + +func (r *callstackResult) toSerial(res *serial.Result, fset *token.FileSet) { + var callers []serial.Caller + for i := len(r.callpath) - 1; i >= 0; i-- { // (innermost first) + edge := r.callpath[i] + callers = append(callers, serial.Caller{ + Pos: fset.Position(edge.Pos()).String(), + Caller: edge.Caller.Func.String(), + Desc: edge.Description(), + }) + } + res.Callstack = &serial.CallStack{ + Pos: fset.Position(r.target.Pos()).String(), + Target: r.target.String(), + Callers: callers, + } +} diff --git a/vendor/golang.org/x/tools/oracle/definition.go b/vendor/golang.org/x/tools/oracle/definition.go new file mode 100644 index 0000000000..67f65f9798 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/definition.go @@ -0,0 +1,78 @@ +// Copyright 2013 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.5 + +package oracle + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/oracle/serial" +) + +// definition reports the location of the definition of an identifier. +// +// TODO(adonovan): opt: for intra-file references, the parser's +// resolution might be enough; we should start with that. +// +func definition(q *Query) error { + lconf := loader.Config{Build: q.Build} + allowErrors(&lconf) + + if _, err := importQueryPackage(q.Pos, &lconf); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + id, _ := qpos.path[0].(*ast.Ident) + if id == nil { + return fmt.Errorf("no identifier here") + } + + obj := qpos.info.ObjectOf(id) + if obj == nil { + // Happens for y in "switch y := x.(type)", + // and the package declaration, + // but I think that's all. + return fmt.Errorf("no object for identifier") + } + + q.result = &definitionResult{qpos, obj} + return nil +} + +type definitionResult struct { + qpos *queryPos + obj types.Object // object it denotes +} + +func (r *definitionResult) display(printf printfFunc) { + printf(r.obj, "defined here as %s", r.qpos.objectString(r.obj)) +} + +func (r *definitionResult) toSerial(res *serial.Result, fset *token.FileSet) { + definition := &serial.Definition{ + Desc: r.obj.String(), + } + if pos := r.obj.Pos(); pos != token.NoPos { // Package objects have no Pos() + definition.ObjPos = fset.Position(pos).String() + } + res.Definition = definition +} diff --git a/vendor/golang.org/x/tools/oracle/definition14.go b/vendor/golang.org/x/tools/oracle/definition14.go new file mode 100644 index 0000000000..c22b1fd09b --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/definition14.go @@ -0,0 +1,78 @@ +// Copyright 2013 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.5 + +package oracle + +import ( + "fmt" + "go/ast" + "go/token" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/types" + "golang.org/x/tools/oracle/serial" +) + +// definition reports the location of the definition of an identifier. +// +// TODO(adonovan): opt: for intra-file references, the parser's +// resolution might be enough; we should start with that. +// +func definition(q *Query) error { + lconf := loader.Config{Build: q.Build} + allowErrors(&lconf) + + if _, err := importQueryPackage(q.Pos, &lconf); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + id, _ := qpos.path[0].(*ast.Ident) + if id == nil { + return fmt.Errorf("no identifier here") + } + + obj := qpos.info.ObjectOf(id) + if obj == nil { + // Happens for y in "switch y := x.(type)", + // and the package declaration, + // but I think that's all. + return fmt.Errorf("no object for identifier") + } + + q.result = &definitionResult{qpos, obj} + return nil +} + +type definitionResult struct { + qpos *queryPos + obj types.Object // object it denotes +} + +func (r *definitionResult) display(printf printfFunc) { + printf(r.obj, "defined here as %s", r.qpos.objectString(r.obj)) +} + +func (r *definitionResult) toSerial(res *serial.Result, fset *token.FileSet) { + definition := &serial.Definition{ + Desc: r.obj.String(), + } + if pos := r.obj.Pos(); pos != token.NoPos { // Package objects have no Pos() + definition.ObjPos = fset.Position(pos).String() + } + res.Definition = definition +} diff --git a/vendor/golang.org/x/tools/oracle/describe.go b/vendor/golang.org/x/tools/oracle/describe.go new file mode 100644 index 0000000000..3be32df47e --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/describe.go @@ -0,0 +1,775 @@ +// Copyright 2013 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 oracle + +import ( + "bytes" + "fmt" + "go/ast" + exact "go/constant" + "go/token" + "go/types" + "log" + "os" + "strings" + + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/types/typeutil" + "golang.org/x/tools/oracle/serial" +) + +// describe describes the syntax node denoted by the query position, +// including: +// - its syntactic category +// - the definition of its referent (for identifiers) [now redundant] +// - its type and method set (for an expression or type expression) +// +func describe(q *Query) error { + lconf := loader.Config{Build: q.Build} + allowErrors(&lconf) + + if _, err := importQueryPackage(q.Pos, &lconf); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, true) // (need exact pos) + if err != nil { + return err + } + + if false { // debugging + fprintf(os.Stderr, lprog.Fset, qpos.path[0], "you selected: %s %s", + astutil.NodeDescription(qpos.path[0]), pathToString(qpos.path)) + } + + path, action := findInterestingNode(qpos.info, qpos.path) + switch action { + case actionExpr: + q.result, err = describeValue(qpos, path) + + case actionType: + q.result, err = describeType(qpos, path) + + case actionPackage: + q.result, err = describePackage(qpos, path) + + case actionStmt: + q.result, err = describeStmt(qpos, path) + + case actionUnknown: + q.result = &describeUnknownResult{path[0]} + + default: + panic(action) // unreachable + } + return err +} + +type describeUnknownResult struct { + node ast.Node +} + +func (r *describeUnknownResult) display(printf printfFunc) { + // Nothing much to say about misc syntax. + printf(r.node, "%s", astutil.NodeDescription(r.node)) +} + +func (r *describeUnknownResult) toSerial(res *serial.Result, fset *token.FileSet) { + res.Describe = &serial.Describe{ + Desc: astutil.NodeDescription(r.node), + Pos: fset.Position(r.node.Pos()).String(), + } +} + +type action int + +const ( + actionUnknown action = iota // None of the below + actionExpr // FuncDecl, true Expr or Ident(types.{Const,Var}) + actionType // type Expr or Ident(types.TypeName). + actionStmt // Stmt or Ident(types.Label) + actionPackage // Ident(types.Package) or ImportSpec +) + +// findInterestingNode classifies the syntax node denoted by path as one of: +// - an expression, part of an expression or a reference to a constant +// or variable; +// - a type, part of a type, or a reference to a named type; +// - a statement, part of a statement, or a label referring to a statement; +// - part of a package declaration or import spec. +// - none of the above. +// and returns the most "interesting" associated node, which may be +// the same node, an ancestor or a descendent. +// +func findInterestingNode(pkginfo *loader.PackageInfo, path []ast.Node) ([]ast.Node, action) { + // TODO(adonovan): integrate with go/types/stdlib_test.go and + // apply this to every AST node we can find to make sure it + // doesn't crash. + + // TODO(adonovan): audit for ParenExpr safety, esp. since we + // traverse up and down. + + // TODO(adonovan): if the users selects the "." in + // "fmt.Fprintf()", they'll get an ambiguous selection error; + // we won't even reach here. Can we do better? + + // TODO(adonovan): describing a field within 'type T struct {...}' + // describes the (anonymous) struct type and concludes "no methods". + // We should ascend to the enclosing type decl, if any. + + for len(path) > 0 { + switch n := path[0].(type) { + case *ast.GenDecl: + if len(n.Specs) == 1 { + // Descend to sole {Import,Type,Value}Spec child. + path = append([]ast.Node{n.Specs[0]}, path...) + continue + } + return path, actionUnknown // uninteresting + + case *ast.FuncDecl: + // Descend to function name. + path = append([]ast.Node{n.Name}, path...) + continue + + case *ast.ImportSpec: + return path, actionPackage + + case *ast.ValueSpec: + if len(n.Names) == 1 { + // Descend to sole Ident child. + path = append([]ast.Node{n.Names[0]}, path...) + continue + } + return path, actionUnknown // uninteresting + + case *ast.TypeSpec: + // Descend to type name. + path = append([]ast.Node{n.Name}, path...) + continue + + case ast.Stmt: + return path, actionStmt + + case *ast.ArrayType, + *ast.StructType, + *ast.FuncType, + *ast.InterfaceType, + *ast.MapType, + *ast.ChanType: + return path, actionType + + case *ast.Comment, *ast.CommentGroup, *ast.File, *ast.KeyValueExpr, *ast.CommClause: + return path, actionUnknown // uninteresting + + case *ast.Ellipsis: + // Continue to enclosing node. + // e.g. [...]T in ArrayType + // f(x...) in CallExpr + // f(x...T) in FuncType + + case *ast.Field: + // TODO(adonovan): this needs more thought, + // since fields can be so many things. + if len(n.Names) == 1 { + // Descend to sole Ident child. + path = append([]ast.Node{n.Names[0]}, path...) + continue + } + // Zero names (e.g. anon field in struct) + // or multiple field or param names: + // continue to enclosing field list. + + case *ast.FieldList: + // Continue to enclosing node: + // {Struct,Func,Interface}Type or FuncDecl. + + case *ast.BasicLit: + if _, ok := path[1].(*ast.ImportSpec); ok { + return path[1:], actionPackage + } + return path, actionExpr + + case *ast.SelectorExpr: + // TODO(adonovan): use Selections info directly. + if pkginfo.Uses[n.Sel] == nil { + // TODO(adonovan): is this reachable? + return path, actionUnknown + } + // Descend to .Sel child. + path = append([]ast.Node{n.Sel}, path...) + continue + + case *ast.Ident: + switch pkginfo.ObjectOf(n).(type) { + case *types.PkgName: + return path, actionPackage + + case *types.Const: + return path, actionExpr + + case *types.Label: + return path, actionStmt + + case *types.TypeName: + return path, actionType + + case *types.Var: + // For x in 'struct {x T}', return struct type, for now. + if _, ok := path[1].(*ast.Field); ok { + _ = path[2].(*ast.FieldList) // assertion + if _, ok := path[3].(*ast.StructType); ok { + return path[3:], actionType + } + } + return path, actionExpr + + case *types.Func: + return path, actionExpr + + case *types.Builtin: + // For reference to built-in function, return enclosing call. + path = path[1:] // ascend to enclosing function call + continue + + case *types.Nil: + return path, actionExpr + } + + // No object. + switch path[1].(type) { + case *ast.SelectorExpr: + // Return enclosing selector expression. + return path[1:], actionExpr + + case *ast.Field: + // TODO(adonovan): test this. + // e.g. all f in: + // struct { f, g int } + // interface { f() } + // func (f T) method(f, g int) (f, g bool) + // + // switch path[3].(type) { + // case *ast.FuncDecl: + // case *ast.StructType: + // case *ast.InterfaceType: + // } + // + // return path[1:], actionExpr + // + // Unclear what to do with these. + // Struct.Fields -- field + // Interface.Methods -- field + // FuncType.{Params.Results} -- actionExpr + // FuncDecl.Recv -- actionExpr + + case *ast.File: + // 'package foo' + return path, actionPackage + + case *ast.ImportSpec: + // TODO(adonovan): fix: why no package object? go/types bug? + return path[1:], actionPackage + + default: + // e.g. blank identifier + // or y in "switch y := x.(type)" + // or code in a _test.go file that's not part of the package. + log.Printf("unknown reference %s in %T\n", n, path[1]) + return path, actionUnknown + } + + case *ast.StarExpr: + if pkginfo.Types[n].IsType() { + return path, actionType + } + return path, actionExpr + + case ast.Expr: + // All Expr but {BasicLit,Ident,StarExpr} are + // "true" expressions that evaluate to a value. + return path, actionExpr + } + + // Ascend to parent. + path = path[1:] + } + + return nil, actionUnknown // unreachable +} + +func describeValue(qpos *queryPos, path []ast.Node) (*describeValueResult, error) { + var expr ast.Expr + var obj types.Object + switch n := path[0].(type) { + case *ast.ValueSpec: + // ambiguous ValueSpec containing multiple names + return nil, fmt.Errorf("multiple value specification") + case *ast.Ident: + obj = qpos.info.ObjectOf(n) + expr = n + case ast.Expr: + expr = n + default: + // TODO(adonovan): is this reachable? + return nil, fmt.Errorf("unexpected AST for expr: %T", n) + } + + typ := qpos.info.TypeOf(expr) + constVal := qpos.info.Types[expr].Value + + return &describeValueResult{ + qpos: qpos, + expr: expr, + typ: typ, + constVal: constVal, + obj: obj, + }, nil +} + +type describeValueResult struct { + qpos *queryPos + expr ast.Expr // query node + typ types.Type // type of expression + constVal exact.Value // value of expression, if constant + obj types.Object // var/func/const object, if expr was Ident +} + +func (r *describeValueResult) display(printf printfFunc) { + var prefix, suffix string + if r.constVal != nil { + suffix = fmt.Sprintf(" of constant value %s", r.constVal) + } + switch obj := r.obj.(type) { + case *types.Func: + if recv := obj.Type().(*types.Signature).Recv(); recv != nil { + if _, ok := recv.Type().Underlying().(*types.Interface); ok { + prefix = "interface method " + } else { + prefix = "method " + } + } + } + + // Describe the expression. + if r.obj != nil { + if r.obj.Pos() == r.expr.Pos() { + // defining ident + printf(r.expr, "definition of %s%s%s", prefix, r.qpos.objectString(r.obj), suffix) + } else { + // referring ident + printf(r.expr, "reference to %s%s%s", prefix, r.qpos.objectString(r.obj), suffix) + if def := r.obj.Pos(); def != token.NoPos { + printf(def, "defined here") + } + } + } else { + desc := astutil.NodeDescription(r.expr) + if suffix != "" { + // constant expression + printf(r.expr, "%s%s", desc, suffix) + } else { + // non-constant expression + printf(r.expr, "%s of type %s", desc, r.qpos.typeString(r.typ)) + } + } +} + +func (r *describeValueResult) toSerial(res *serial.Result, fset *token.FileSet) { + var value, objpos string + if r.constVal != nil { + value = r.constVal.String() + } + if r.obj != nil { + objpos = fset.Position(r.obj.Pos()).String() + } + + res.Describe = &serial.Describe{ + Desc: astutil.NodeDescription(r.expr), + Pos: fset.Position(r.expr.Pos()).String(), + Detail: "value", + Value: &serial.DescribeValue{ + Type: r.qpos.typeString(r.typ), + Value: value, + ObjPos: objpos, + }, + } +} + +// ---- TYPE ------------------------------------------------------------ + +func describeType(qpos *queryPos, path []ast.Node) (*describeTypeResult, error) { + var description string + var t types.Type + switch n := path[0].(type) { + case *ast.Ident: + t = qpos.info.TypeOf(n) + switch t := t.(type) { + case *types.Basic: + description = "reference to built-in " + + case *types.Named: + isDef := t.Obj().Pos() == n.Pos() // see caveats at isDef above + if isDef { + description = "definition of " + } else { + description = "reference to " + } + } + + case ast.Expr: + t = qpos.info.TypeOf(n) + + default: + // Unreachable? + return nil, fmt.Errorf("unexpected AST for type: %T", n) + } + + description = description + "type " + qpos.typeString(t) + + // Show sizes for structs and named types (it's fairly obvious for others). + switch t.(type) { + case *types.Named, *types.Struct: + szs := types.StdSizes{WordSize: 8, MaxAlign: 8} // assume amd64 + description = fmt.Sprintf("%s (size %d, align %d)", description, + szs.Sizeof(t), szs.Alignof(t)) + } + + return &describeTypeResult{ + qpos: qpos, + node: path[0], + description: description, + typ: t, + methods: accessibleMethods(t, qpos.info.Pkg), + }, nil +} + +type describeTypeResult struct { + qpos *queryPos + node ast.Node + description string + typ types.Type + methods []*types.Selection +} + +func (r *describeTypeResult) display(printf printfFunc) { + printf(r.node, "%s", r.description) + + // Show the underlying type for a reference to a named type. + if nt, ok := r.typ.(*types.Named); ok && r.node.Pos() != nt.Obj().Pos() { + printf(nt.Obj(), "defined as %s", r.qpos.typeString(nt.Underlying())) + } + + // Print the method set, if the type kind is capable of bearing methods. + switch r.typ.(type) { + case *types.Interface, *types.Struct, *types.Named: + if len(r.methods) > 0 { + printf(r.node, "Method set:") + for _, meth := range r.methods { + // TODO(adonovan): print these relative + // to the owning package, not the + // query package. + printf(meth.Obj(), "\t%s", r.qpos.selectionString(meth)) + } + } else { + printf(r.node, "No methods.") + } + } +} + +func (r *describeTypeResult) toSerial(res *serial.Result, fset *token.FileSet) { + var namePos, nameDef string + if nt, ok := r.typ.(*types.Named); ok { + namePos = fset.Position(nt.Obj().Pos()).String() + nameDef = nt.Underlying().String() + } + res.Describe = &serial.Describe{ + Desc: r.description, + Pos: fset.Position(r.node.Pos()).String(), + Detail: "type", + Type: &serial.DescribeType{ + Type: r.qpos.typeString(r.typ), + NamePos: namePos, + NameDef: nameDef, + Methods: methodsToSerial(r.qpos.info.Pkg, r.methods, fset), + }, + } +} + +// ---- PACKAGE ------------------------------------------------------------ + +func describePackage(qpos *queryPos, path []ast.Node) (*describePackageResult, error) { + var description string + var pkg *types.Package + switch n := path[0].(type) { + case *ast.ImportSpec: + var obj types.Object + if n.Name != nil { + obj = qpos.info.Defs[n.Name] + } else { + obj = qpos.info.Implicits[n] + } + pkgname, _ := obj.(*types.PkgName) + if pkgname == nil { + return nil, fmt.Errorf("can't import package %s", n.Path.Value) + } + pkg = pkgname.Imported() + description = fmt.Sprintf("import of package %q", pkg.Path()) + + case *ast.Ident: + if _, isDef := path[1].(*ast.File); isDef { + // e.g. package id + pkg = qpos.info.Pkg + description = fmt.Sprintf("definition of package %q", pkg.Path()) + } else { + // e.g. import id "..." + // or id.F() + pkg = qpos.info.ObjectOf(n).(*types.PkgName).Imported() + description = fmt.Sprintf("reference to package %q", pkg.Path()) + } + + default: + // Unreachable? + return nil, fmt.Errorf("unexpected AST for package: %T", n) + } + + var members []*describeMember + // NB: "unsafe" has no types.Package + if pkg != nil { + // Enumerate the accessible package members + // in lexicographic order. + for _, name := range pkg.Scope().Names() { + if pkg == qpos.info.Pkg || ast.IsExported(name) { + mem := pkg.Scope().Lookup(name) + var methods []*types.Selection + if mem, ok := mem.(*types.TypeName); ok { + methods = accessibleMethods(mem.Type(), qpos.info.Pkg) + } + members = append(members, &describeMember{ + mem, + methods, + }) + + } + } + } + + return &describePackageResult{qpos.fset, path[0], description, pkg, members}, nil +} + +type describePackageResult struct { + fset *token.FileSet + node ast.Node + description string + pkg *types.Package + members []*describeMember // in lexicographic name order +} + +type describeMember struct { + obj types.Object + methods []*types.Selection // in types.MethodSet order +} + +func (r *describePackageResult) display(printf printfFunc) { + printf(r.node, "%s", r.description) + + // Compute max width of name "column". + maxname := 0 + for _, mem := range r.members { + if l := len(mem.obj.Name()); l > maxname { + maxname = l + } + } + + for _, mem := range r.members { + printf(mem.obj, "\t%s", formatMember(mem.obj, maxname)) + for _, meth := range mem.methods { + printf(meth.Obj(), "\t\t%s", types.SelectionString(meth, types.RelativeTo(r.pkg))) + } + } +} + +func formatMember(obj types.Object, maxname int) string { + qualifier := types.RelativeTo(obj.Pkg()) + var buf bytes.Buffer + fmt.Fprintf(&buf, "%-5s %-*s", tokenOf(obj), maxname, obj.Name()) + switch obj := obj.(type) { + case *types.Const: + fmt.Fprintf(&buf, " %s = %s", types.TypeString(obj.Type(), qualifier), obj.Val().String()) + + case *types.Func: + fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type(), qualifier)) + + case *types.TypeName: + // Abbreviate long aggregate type names. + var abbrev string + switch t := obj.Type().Underlying().(type) { + case *types.Interface: + if t.NumMethods() > 1 { + abbrev = "interface{...}" + } + case *types.Struct: + if t.NumFields() > 1 { + abbrev = "struct{...}" + } + } + if abbrev == "" { + fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type().Underlying(), qualifier)) + } else { + fmt.Fprintf(&buf, " %s", abbrev) + } + + case *types.Var: + fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type(), qualifier)) + } + return buf.String() +} + +func (r *describePackageResult) toSerial(res *serial.Result, fset *token.FileSet) { + var members []*serial.DescribeMember + for _, mem := range r.members { + typ := mem.obj.Type() + var val string + switch mem := mem.obj.(type) { + case *types.Const: + val = mem.Val().String() + case *types.TypeName: + typ = typ.Underlying() + } + members = append(members, &serial.DescribeMember{ + Name: mem.obj.Name(), + Type: typ.String(), + Value: val, + Pos: fset.Position(mem.obj.Pos()).String(), + Kind: tokenOf(mem.obj), + Methods: methodsToSerial(r.pkg, mem.methods, fset), + }) + } + res.Describe = &serial.Describe{ + Desc: r.description, + Pos: fset.Position(r.node.Pos()).String(), + Detail: "package", + Package: &serial.DescribePackage{ + Path: r.pkg.Path(), + Members: members, + }, + } +} + +func tokenOf(o types.Object) string { + switch o.(type) { + case *types.Func: + return "func" + case *types.Var: + return "var" + case *types.TypeName: + return "type" + case *types.Const: + return "const" + case *types.PkgName: + return "package" + case *types.Builtin: + return "builtin" // e.g. when describing package "unsafe" + case *types.Nil: + return "nil" + case *types.Label: + return "label" + } + panic(o) +} + +// ---- STATEMENT ------------------------------------------------------------ + +func describeStmt(qpos *queryPos, path []ast.Node) (*describeStmtResult, error) { + var description string + switch n := path[0].(type) { + case *ast.Ident: + if qpos.info.Defs[n] != nil { + description = "labelled statement" + } else { + description = "reference to labelled statement" + } + + default: + // Nothing much to say about statements. + description = astutil.NodeDescription(n) + } + return &describeStmtResult{qpos.fset, path[0], description}, nil +} + +type describeStmtResult struct { + fset *token.FileSet + node ast.Node + description string +} + +func (r *describeStmtResult) display(printf printfFunc) { + printf(r.node, "%s", r.description) +} + +func (r *describeStmtResult) toSerial(res *serial.Result, fset *token.FileSet) { + res.Describe = &serial.Describe{ + Desc: r.description, + Pos: fset.Position(r.node.Pos()).String(), + Detail: "unknown", + } +} + +// ------------------- Utilities ------------------- + +// pathToString returns a string containing the concrete types of the +// nodes in path. +func pathToString(path []ast.Node) string { + var buf bytes.Buffer + fmt.Fprint(&buf, "[") + for i, n := range path { + if i > 0 { + fmt.Fprint(&buf, " ") + } + fmt.Fprint(&buf, strings.TrimPrefix(fmt.Sprintf("%T", n), "*ast.")) + } + fmt.Fprint(&buf, "]") + return buf.String() +} + +func accessibleMethods(t types.Type, from *types.Package) []*types.Selection { + var methods []*types.Selection + for _, meth := range typeutil.IntuitiveMethodSet(t, nil) { + if isAccessibleFrom(meth.Obj(), from) { + methods = append(methods, meth) + } + } + return methods +} + +func isAccessibleFrom(obj types.Object, pkg *types.Package) bool { + return ast.IsExported(obj.Name()) || obj.Pkg() == pkg +} + +func methodsToSerial(this *types.Package, methods []*types.Selection, fset *token.FileSet) []serial.DescribeMethod { + qualifier := types.RelativeTo(this) + var jmethods []serial.DescribeMethod + for _, meth := range methods { + var ser serial.DescribeMethod + if meth != nil { // may contain nils when called by implements (on a method) + ser = serial.DescribeMethod{ + Name: types.SelectionString(meth, qualifier), + Pos: fset.Position(meth.Obj().Pos()).String(), + } + } + jmethods = append(jmethods, ser) + } + return jmethods +} diff --git a/vendor/golang.org/x/tools/oracle/describe14.go b/vendor/golang.org/x/tools/oracle/describe14.go new file mode 100644 index 0000000000..c8ccc2d844 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/describe14.go @@ -0,0 +1,786 @@ +// Copyright 2013 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.5 + +package oracle + +import ( + "bytes" + "fmt" + "go/ast" + "go/token" + "log" + "os" + "strings" + + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/exact" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/types" + "golang.org/x/tools/go/types/typeutil" + "golang.org/x/tools/oracle/serial" +) + +// describe describes the syntax node denoted by the query position, +// including: +// - its syntactic category +// - the definition of its referent (for identifiers) [now redundant] +// - its type and method set (for an expression or type expression) +// +func describe(q *Query) error { + lconf := loader.Config{Build: q.Build} + allowErrors(&lconf) + + if _, err := importQueryPackage(q.Pos, &lconf); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, true) // (need exact pos) + if err != nil { + return err + } + + if false { // debugging + fprintf(os.Stderr, lprog.Fset, qpos.path[0], "you selected: %s %s", + astutil.NodeDescription(qpos.path[0]), pathToString(qpos.path)) + } + + path, action := findInterestingNode(qpos.info, qpos.path) + switch action { + case actionExpr: + q.result, err = describeValue(qpos, path) + + case actionType: + q.result, err = describeType(qpos, path) + + case actionPackage: + q.result, err = describePackage(qpos, path) + + case actionStmt: + q.result, err = describeStmt(qpos, path) + + case actionUnknown: + q.result = &describeUnknownResult{path[0]} + + default: + panic(action) // unreachable + } + return err +} + +type describeUnknownResult struct { + node ast.Node +} + +func (r *describeUnknownResult) display(printf printfFunc) { + // Nothing much to say about misc syntax. + printf(r.node, "%s", astutil.NodeDescription(r.node)) +} + +func (r *describeUnknownResult) toSerial(res *serial.Result, fset *token.FileSet) { + res.Describe = &serial.Describe{ + Desc: astutil.NodeDescription(r.node), + Pos: fset.Position(r.node.Pos()).String(), + } +} + +type action int + +const ( + actionUnknown action = iota // None of the below + actionExpr // FuncDecl, true Expr or Ident(types.{Const,Var}) + actionType // type Expr or Ident(types.TypeName). + actionStmt // Stmt or Ident(types.Label) + actionPackage // Ident(types.Package) or ImportSpec +) + +// findInterestingNode classifies the syntax node denoted by path as one of: +// - an expression, part of an expression or a reference to a constant +// or variable; +// - a type, part of a type, or a reference to a named type; +// - a statement, part of a statement, or a label referring to a statement; +// - part of a package declaration or import spec. +// - none of the above. +// and returns the most "interesting" associated node, which may be +// the same node, an ancestor or a descendent. +// +func findInterestingNode(pkginfo *loader.PackageInfo, path []ast.Node) ([]ast.Node, action) { + // TODO(adonovan): integrate with go/types/stdlib_test.go and + // apply this to every AST node we can find to make sure it + // doesn't crash. + + // TODO(adonovan): audit for ParenExpr safety, esp. since we + // traverse up and down. + + // TODO(adonovan): if the users selects the "." in + // "fmt.Fprintf()", they'll get an ambiguous selection error; + // we won't even reach here. Can we do better? + + // TODO(adonovan): describing a field within 'type T struct {...}' + // describes the (anonymous) struct type and concludes "no methods". + // We should ascend to the enclosing type decl, if any. + + for len(path) > 0 { + switch n := path[0].(type) { + case *ast.GenDecl: + if len(n.Specs) == 1 { + // Descend to sole {Import,Type,Value}Spec child. + path = append([]ast.Node{n.Specs[0]}, path...) + continue + } + return path, actionUnknown // uninteresting + + case *ast.FuncDecl: + // Descend to function name. + path = append([]ast.Node{n.Name}, path...) + continue + + case *ast.ImportSpec: + return path, actionPackage + + case *ast.ValueSpec: + if len(n.Names) == 1 { + // Descend to sole Ident child. + path = append([]ast.Node{n.Names[0]}, path...) + continue + } + return path, actionUnknown // uninteresting + + case *ast.TypeSpec: + // Descend to type name. + path = append([]ast.Node{n.Name}, path...) + continue + + case ast.Stmt: + return path, actionStmt + + case *ast.ArrayType, + *ast.StructType, + *ast.FuncType, + *ast.InterfaceType, + *ast.MapType, + *ast.ChanType: + return path, actionType + + case *ast.Comment, *ast.CommentGroup, *ast.File, *ast.KeyValueExpr, *ast.CommClause: + return path, actionUnknown // uninteresting + + case *ast.Ellipsis: + // Continue to enclosing node. + // e.g. [...]T in ArrayType + // f(x...) in CallExpr + // f(x...T) in FuncType + + case *ast.Field: + // TODO(adonovan): this needs more thought, + // since fields can be so many things. + if len(n.Names) == 1 { + // Descend to sole Ident child. + path = append([]ast.Node{n.Names[0]}, path...) + continue + } + // Zero names (e.g. anon field in struct) + // or multiple field or param names: + // continue to enclosing field list. + + case *ast.FieldList: + // Continue to enclosing node: + // {Struct,Func,Interface}Type or FuncDecl. + + case *ast.BasicLit: + if _, ok := path[1].(*ast.ImportSpec); ok { + return path[1:], actionPackage + } + return path, actionExpr + + case *ast.SelectorExpr: + // TODO(adonovan): use Selections info directly. + if pkginfo.Uses[n.Sel] == nil { + // TODO(adonovan): is this reachable? + return path, actionUnknown + } + // Descend to .Sel child. + path = append([]ast.Node{n.Sel}, path...) + continue + + case *ast.Ident: + switch pkginfo.ObjectOf(n).(type) { + case *types.PkgName: + return path, actionPackage + + case *types.Const: + return path, actionExpr + + case *types.Label: + return path, actionStmt + + case *types.TypeName: + return path, actionType + + case *types.Var: + // For x in 'struct {x T}', return struct type, for now. + if _, ok := path[1].(*ast.Field); ok { + _ = path[2].(*ast.FieldList) // assertion + if _, ok := path[3].(*ast.StructType); ok { + return path[3:], actionType + } + } + return path, actionExpr + + case *types.Func: + return path, actionExpr + + case *types.Builtin: + // For reference to built-in function, return enclosing call. + path = path[1:] // ascend to enclosing function call + continue + + case *types.Nil: + return path, actionExpr + } + + // No object. + switch path[1].(type) { + case *ast.SelectorExpr: + // Return enclosing selector expression. + return path[1:], actionExpr + + case *ast.Field: + // TODO(adonovan): test this. + // e.g. all f in: + // struct { f, g int } + // interface { f() } + // func (f T) method(f, g int) (f, g bool) + // + // switch path[3].(type) { + // case *ast.FuncDecl: + // case *ast.StructType: + // case *ast.InterfaceType: + // } + // + // return path[1:], actionExpr + // + // Unclear what to do with these. + // Struct.Fields -- field + // Interface.Methods -- field + // FuncType.{Params.Results} -- actionExpr + // FuncDecl.Recv -- actionExpr + + case *ast.File: + // 'package foo' + return path, actionPackage + + case *ast.ImportSpec: + // TODO(adonovan): fix: why no package object? go/types bug? + return path[1:], actionPackage + + default: + // e.g. blank identifier + // or y in "switch y := x.(type)" + // or code in a _test.go file that's not part of the package. + log.Printf("unknown reference %s in %T\n", n, path[1]) + return path, actionUnknown + } + + case *ast.StarExpr: + if pkginfo.Types[n].IsType() { + return path, actionType + } + return path, actionExpr + + case ast.Expr: + // All Expr but {BasicLit,Ident,StarExpr} are + // "true" expressions that evaluate to a value. + return path, actionExpr + } + + // Ascend to parent. + path = path[1:] + } + + return nil, actionUnknown // unreachable +} + +func describeValue(qpos *queryPos, path []ast.Node) (*describeValueResult, error) { + var expr ast.Expr + var obj types.Object + switch n := path[0].(type) { + case *ast.ValueSpec: + // ambiguous ValueSpec containing multiple names + return nil, fmt.Errorf("multiple value specification") + case *ast.Ident: + obj = qpos.info.ObjectOf(n) + expr = n + case ast.Expr: + expr = n + default: + // TODO(adonovan): is this reachable? + return nil, fmt.Errorf("unexpected AST for expr: %T", n) + } + + typ := qpos.info.TypeOf(expr) + constVal := qpos.info.Types[expr].Value + + return &describeValueResult{ + qpos: qpos, + expr: expr, + typ: typ, + constVal: constVal, + obj: obj, + }, nil +} + +type describeValueResult struct { + qpos *queryPos + expr ast.Expr // query node + typ types.Type // type of expression + constVal exact.Value // value of expression, if constant + obj types.Object // var/func/const object, if expr was Ident +} + +func (r *describeValueResult) display(printf printfFunc) { + var prefix, suffix string + if r.constVal != nil { + suffix = fmt.Sprintf(" of constant value %s", constValString(r.constVal)) + } + switch obj := r.obj.(type) { + case *types.Func: + if recv := obj.Type().(*types.Signature).Recv(); recv != nil { + if _, ok := recv.Type().Underlying().(*types.Interface); ok { + prefix = "interface method " + } else { + prefix = "method " + } + } + } + + // Describe the expression. + if r.obj != nil { + if r.obj.Pos() == r.expr.Pos() { + // defining ident + printf(r.expr, "definition of %s%s%s", prefix, r.qpos.objectString(r.obj), suffix) + } else { + // referring ident + printf(r.expr, "reference to %s%s%s", prefix, r.qpos.objectString(r.obj), suffix) + if def := r.obj.Pos(); def != token.NoPos { + printf(def, "defined here") + } + } + } else { + desc := astutil.NodeDescription(r.expr) + if suffix != "" { + // constant expression + printf(r.expr, "%s%s", desc, suffix) + } else { + // non-constant expression + printf(r.expr, "%s of type %s", desc, r.qpos.typeString(r.typ)) + } + } +} + +func (r *describeValueResult) toSerial(res *serial.Result, fset *token.FileSet) { + var value, objpos string + if r.constVal != nil { + value = r.constVal.String() + } + if r.obj != nil { + objpos = fset.Position(r.obj.Pos()).String() + } + + res.Describe = &serial.Describe{ + Desc: astutil.NodeDescription(r.expr), + Pos: fset.Position(r.expr.Pos()).String(), + Detail: "value", + Value: &serial.DescribeValue{ + Type: r.qpos.typeString(r.typ), + Value: value, + ObjPos: objpos, + }, + } +} + +// ---- TYPE ------------------------------------------------------------ + +func describeType(qpos *queryPos, path []ast.Node) (*describeTypeResult, error) { + var description string + var t types.Type + switch n := path[0].(type) { + case *ast.Ident: + t = qpos.info.TypeOf(n) + switch t := t.(type) { + case *types.Basic: + description = "reference to built-in " + + case *types.Named: + isDef := t.Obj().Pos() == n.Pos() // see caveats at isDef above + if isDef { + description = "definition of " + } else { + description = "reference to " + } + } + + case ast.Expr: + t = qpos.info.TypeOf(n) + + default: + // Unreachable? + return nil, fmt.Errorf("unexpected AST for type: %T", n) + } + + description = description + "type " + qpos.typeString(t) + + // Show sizes for structs and named types (it's fairly obvious for others). + switch t.(type) { + case *types.Named, *types.Struct: + szs := types.StdSizes{8, 8} // assume amd64 + description = fmt.Sprintf("%s (size %d, align %d)", description, + szs.Sizeof(t), szs.Alignof(t)) + } + + return &describeTypeResult{ + qpos: qpos, + node: path[0], + description: description, + typ: t, + methods: accessibleMethods(t, qpos.info.Pkg), + }, nil +} + +type describeTypeResult struct { + qpos *queryPos + node ast.Node + description string + typ types.Type + methods []*types.Selection +} + +func (r *describeTypeResult) display(printf printfFunc) { + printf(r.node, "%s", r.description) + + // Show the underlying type for a reference to a named type. + if nt, ok := r.typ.(*types.Named); ok && r.node.Pos() != nt.Obj().Pos() { + printf(nt.Obj(), "defined as %s", r.qpos.typeString(nt.Underlying())) + } + + // Print the method set, if the type kind is capable of bearing methods. + switch r.typ.(type) { + case *types.Interface, *types.Struct, *types.Named: + if len(r.methods) > 0 { + printf(r.node, "Method set:") + for _, meth := range r.methods { + // TODO(adonovan): print these relative + // to the owning package, not the + // query package. + printf(meth.Obj(), "\t%s", r.qpos.selectionString(meth)) + } + } else { + printf(r.node, "No methods.") + } + } +} + +func (r *describeTypeResult) toSerial(res *serial.Result, fset *token.FileSet) { + var namePos, nameDef string + if nt, ok := r.typ.(*types.Named); ok { + namePos = fset.Position(nt.Obj().Pos()).String() + nameDef = nt.Underlying().String() + } + res.Describe = &serial.Describe{ + Desc: r.description, + Pos: fset.Position(r.node.Pos()).String(), + Detail: "type", + Type: &serial.DescribeType{ + Type: r.qpos.typeString(r.typ), + NamePos: namePos, + NameDef: nameDef, + Methods: methodsToSerial(r.qpos.info.Pkg, r.methods, fset), + }, + } +} + +// ---- PACKAGE ------------------------------------------------------------ + +func describePackage(qpos *queryPos, path []ast.Node) (*describePackageResult, error) { + var description string + var pkg *types.Package + switch n := path[0].(type) { + case *ast.ImportSpec: + var obj types.Object + if n.Name != nil { + obj = qpos.info.Defs[n.Name] + } else { + obj = qpos.info.Implicits[n] + } + pkgname, _ := obj.(*types.PkgName) + if pkgname == nil { + return nil, fmt.Errorf("can't import package %s", n.Path.Value) + } + pkg = pkgname.Imported() + description = fmt.Sprintf("import of package %q", pkg.Path()) + + case *ast.Ident: + if _, isDef := path[1].(*ast.File); isDef { + // e.g. package id + pkg = qpos.info.Pkg + description = fmt.Sprintf("definition of package %q", pkg.Path()) + } else { + // e.g. import id "..." + // or id.F() + pkg = qpos.info.ObjectOf(n).(*types.PkgName).Imported() + description = fmt.Sprintf("reference to package %q", pkg.Path()) + } + + default: + // Unreachable? + return nil, fmt.Errorf("unexpected AST for package: %T", n) + } + + var members []*describeMember + // NB: "unsafe" has no types.Package + if pkg != nil { + // Enumerate the accessible package members + // in lexicographic order. + for _, name := range pkg.Scope().Names() { + if pkg == qpos.info.Pkg || ast.IsExported(name) { + mem := pkg.Scope().Lookup(name) + var methods []*types.Selection + if mem, ok := mem.(*types.TypeName); ok { + methods = accessibleMethods(mem.Type(), qpos.info.Pkg) + } + members = append(members, &describeMember{ + mem, + methods, + }) + + } + } + } + + return &describePackageResult{qpos.fset, path[0], description, pkg, members}, nil +} + +type describePackageResult struct { + fset *token.FileSet + node ast.Node + description string + pkg *types.Package + members []*describeMember // in lexicographic name order +} + +type describeMember struct { + obj types.Object + methods []*types.Selection // in types.MethodSet order +} + +func (r *describePackageResult) display(printf printfFunc) { + printf(r.node, "%s", r.description) + + // Compute max width of name "column". + maxname := 0 + for _, mem := range r.members { + if l := len(mem.obj.Name()); l > maxname { + maxname = l + } + } + + for _, mem := range r.members { + printf(mem.obj, "\t%s", formatMember(mem.obj, maxname)) + for _, meth := range mem.methods { + printf(meth.Obj(), "\t\t%s", types.SelectionString(meth, types.RelativeTo(r.pkg))) + } + } +} + +func formatMember(obj types.Object, maxname int) string { + qualifier := types.RelativeTo(obj.Pkg()) + var buf bytes.Buffer + fmt.Fprintf(&buf, "%-5s %-*s", tokenOf(obj), maxname, obj.Name()) + switch obj := obj.(type) { + case *types.Const: + fmt.Fprintf(&buf, " %s = %s", types.TypeString(obj.Type(), qualifier), constValString(obj.Val())) + + case *types.Func: + fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type(), qualifier)) + + case *types.TypeName: + // Abbreviate long aggregate type names. + var abbrev string + switch t := obj.Type().Underlying().(type) { + case *types.Interface: + if t.NumMethods() > 1 { + abbrev = "interface{...}" + } + case *types.Struct: + if t.NumFields() > 1 { + abbrev = "struct{...}" + } + } + if abbrev == "" { + fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type().Underlying(), qualifier)) + } else { + fmt.Fprintf(&buf, " %s", abbrev) + } + + case *types.Var: + fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type(), qualifier)) + } + return buf.String() +} + +func (r *describePackageResult) toSerial(res *serial.Result, fset *token.FileSet) { + var members []*serial.DescribeMember + for _, mem := range r.members { + typ := mem.obj.Type() + var val string + switch mem := mem.obj.(type) { + case *types.Const: + val = constValString(mem.Val()) + case *types.TypeName: + typ = typ.Underlying() + } + members = append(members, &serial.DescribeMember{ + Name: mem.obj.Name(), + Type: typ.String(), + Value: val, + Pos: fset.Position(mem.obj.Pos()).String(), + Kind: tokenOf(mem.obj), + Methods: methodsToSerial(r.pkg, mem.methods, fset), + }) + } + res.Describe = &serial.Describe{ + Desc: r.description, + Pos: fset.Position(r.node.Pos()).String(), + Detail: "package", + Package: &serial.DescribePackage{ + Path: r.pkg.Path(), + Members: members, + }, + } +} + +func tokenOf(o types.Object) string { + switch o.(type) { + case *types.Func: + return "func" + case *types.Var: + return "var" + case *types.TypeName: + return "type" + case *types.Const: + return "const" + case *types.PkgName: + return "package" + case *types.Builtin: + return "builtin" // e.g. when describing package "unsafe" + case *types.Nil: + return "nil" + case *types.Label: + return "label" + } + panic(o) +} + +// ---- STATEMENT ------------------------------------------------------------ + +func describeStmt(qpos *queryPos, path []ast.Node) (*describeStmtResult, error) { + var description string + switch n := path[0].(type) { + case *ast.Ident: + if qpos.info.Defs[n] != nil { + description = "labelled statement" + } else { + description = "reference to labelled statement" + } + + default: + // Nothing much to say about statements. + description = astutil.NodeDescription(n) + } + return &describeStmtResult{qpos.fset, path[0], description}, nil +} + +type describeStmtResult struct { + fset *token.FileSet + node ast.Node + description string +} + +func (r *describeStmtResult) display(printf printfFunc) { + printf(r.node, "%s", r.description) +} + +func (r *describeStmtResult) toSerial(res *serial.Result, fset *token.FileSet) { + res.Describe = &serial.Describe{ + Desc: r.description, + Pos: fset.Position(r.node.Pos()).String(), + Detail: "unknown", + } +} + +// ------------------- Utilities ------------------- + +// pathToString returns a string containing the concrete types of the +// nodes in path. +func pathToString(path []ast.Node) string { + var buf bytes.Buffer + fmt.Fprint(&buf, "[") + for i, n := range path { + if i > 0 { + fmt.Fprint(&buf, " ") + } + fmt.Fprint(&buf, strings.TrimPrefix(fmt.Sprintf("%T", n), "*ast.")) + } + fmt.Fprint(&buf, "]") + return buf.String() +} + +func accessibleMethods(t types.Type, from *types.Package) []*types.Selection { + var methods []*types.Selection + for _, meth := range typeutil.IntuitiveMethodSet(t, nil) { + if isAccessibleFrom(meth.Obj(), from) { + methods = append(methods, meth) + } + } + return methods +} + +func isAccessibleFrom(obj types.Object, pkg *types.Package) bool { + return ast.IsExported(obj.Name()) || obj.Pkg() == pkg +} + +func methodsToSerial(this *types.Package, methods []*types.Selection, fset *token.FileSet) []serial.DescribeMethod { + qualifier := types.RelativeTo(this) + var jmethods []serial.DescribeMethod + for _, meth := range methods { + var ser serial.DescribeMethod + if meth != nil { // may contain nils when called by implements (on a method) + ser = serial.DescribeMethod{ + Name: types.SelectionString(meth, qualifier), + Pos: fset.Position(meth.Obj().Pos()).String(), + } + } + jmethods = append(jmethods, ser) + } + return jmethods +} + +// constValString emulates Go 1.6's go/constant.ExactString well enough +// to make the tests pass. This is just a stopgap until we throw away +// all the *14.go files. +func constValString(v exact.Value) string { + if v.Kind() == exact.Float { + f, _ := exact.Float64Val(v) + return fmt.Sprintf("%g", f) + } + return v.String() +} diff --git a/vendor/golang.org/x/tools/oracle/describe15.go b/vendor/golang.org/x/tools/oracle/describe15.go new file mode 100644 index 0000000000..1276f9a140 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/describe15.go @@ -0,0 +1,786 @@ +// Copyright 2013 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.5,!go1.6 + +package oracle + +import ( + "bytes" + "fmt" + "go/ast" + exact "go/constant" + "go/token" + "go/types" + "log" + "os" + "strings" + + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/types/typeutil" + "golang.org/x/tools/oracle/serial" +) + +// describe describes the syntax node denoted by the query position, +// including: +// - its syntactic category +// - the definition of its referent (for identifiers) [now redundant] +// - its type and method set (for an expression or type expression) +// +func describe(q *Query) error { + lconf := loader.Config{Build: q.Build} + allowErrors(&lconf) + + if _, err := importQueryPackage(q.Pos, &lconf); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, true) // (need exact pos) + if err != nil { + return err + } + + if false { // debugging + fprintf(os.Stderr, lprog.Fset, qpos.path[0], "you selected: %s %s", + astutil.NodeDescription(qpos.path[0]), pathToString(qpos.path)) + } + + path, action := findInterestingNode(qpos.info, qpos.path) + switch action { + case actionExpr: + q.result, err = describeValue(qpos, path) + + case actionType: + q.result, err = describeType(qpos, path) + + case actionPackage: + q.result, err = describePackage(qpos, path) + + case actionStmt: + q.result, err = describeStmt(qpos, path) + + case actionUnknown: + q.result = &describeUnknownResult{path[0]} + + default: + panic(action) // unreachable + } + return err +} + +type describeUnknownResult struct { + node ast.Node +} + +func (r *describeUnknownResult) display(printf printfFunc) { + // Nothing much to say about misc syntax. + printf(r.node, "%s", astutil.NodeDescription(r.node)) +} + +func (r *describeUnknownResult) toSerial(res *serial.Result, fset *token.FileSet) { + res.Describe = &serial.Describe{ + Desc: astutil.NodeDescription(r.node), + Pos: fset.Position(r.node.Pos()).String(), + } +} + +type action int + +const ( + actionUnknown action = iota // None of the below + actionExpr // FuncDecl, true Expr or Ident(types.{Const,Var}) + actionType // type Expr or Ident(types.TypeName). + actionStmt // Stmt or Ident(types.Label) + actionPackage // Ident(types.Package) or ImportSpec +) + +// findInterestingNode classifies the syntax node denoted by path as one of: +// - an expression, part of an expression or a reference to a constant +// or variable; +// - a type, part of a type, or a reference to a named type; +// - a statement, part of a statement, or a label referring to a statement; +// - part of a package declaration or import spec. +// - none of the above. +// and returns the most "interesting" associated node, which may be +// the same node, an ancestor or a descendent. +// +func findInterestingNode(pkginfo *loader.PackageInfo, path []ast.Node) ([]ast.Node, action) { + // TODO(adonovan): integrate with go/types/stdlib_test.go and + // apply this to every AST node we can find to make sure it + // doesn't crash. + + // TODO(adonovan): audit for ParenExpr safety, esp. since we + // traverse up and down. + + // TODO(adonovan): if the users selects the "." in + // "fmt.Fprintf()", they'll get an ambiguous selection error; + // we won't even reach here. Can we do better? + + // TODO(adonovan): describing a field within 'type T struct {...}' + // describes the (anonymous) struct type and concludes "no methods". + // We should ascend to the enclosing type decl, if any. + + for len(path) > 0 { + switch n := path[0].(type) { + case *ast.GenDecl: + if len(n.Specs) == 1 { + // Descend to sole {Import,Type,Value}Spec child. + path = append([]ast.Node{n.Specs[0]}, path...) + continue + } + return path, actionUnknown // uninteresting + + case *ast.FuncDecl: + // Descend to function name. + path = append([]ast.Node{n.Name}, path...) + continue + + case *ast.ImportSpec: + return path, actionPackage + + case *ast.ValueSpec: + if len(n.Names) == 1 { + // Descend to sole Ident child. + path = append([]ast.Node{n.Names[0]}, path...) + continue + } + return path, actionUnknown // uninteresting + + case *ast.TypeSpec: + // Descend to type name. + path = append([]ast.Node{n.Name}, path...) + continue + + case ast.Stmt: + return path, actionStmt + + case *ast.ArrayType, + *ast.StructType, + *ast.FuncType, + *ast.InterfaceType, + *ast.MapType, + *ast.ChanType: + return path, actionType + + case *ast.Comment, *ast.CommentGroup, *ast.File, *ast.KeyValueExpr, *ast.CommClause: + return path, actionUnknown // uninteresting + + case *ast.Ellipsis: + // Continue to enclosing node. + // e.g. [...]T in ArrayType + // f(x...) in CallExpr + // f(x...T) in FuncType + + case *ast.Field: + // TODO(adonovan): this needs more thought, + // since fields can be so many things. + if len(n.Names) == 1 { + // Descend to sole Ident child. + path = append([]ast.Node{n.Names[0]}, path...) + continue + } + // Zero names (e.g. anon field in struct) + // or multiple field or param names: + // continue to enclosing field list. + + case *ast.FieldList: + // Continue to enclosing node: + // {Struct,Func,Interface}Type or FuncDecl. + + case *ast.BasicLit: + if _, ok := path[1].(*ast.ImportSpec); ok { + return path[1:], actionPackage + } + return path, actionExpr + + case *ast.SelectorExpr: + // TODO(adonovan): use Selections info directly. + if pkginfo.Uses[n.Sel] == nil { + // TODO(adonovan): is this reachable? + return path, actionUnknown + } + // Descend to .Sel child. + path = append([]ast.Node{n.Sel}, path...) + continue + + case *ast.Ident: + switch pkginfo.ObjectOf(n).(type) { + case *types.PkgName: + return path, actionPackage + + case *types.Const: + return path, actionExpr + + case *types.Label: + return path, actionStmt + + case *types.TypeName: + return path, actionType + + case *types.Var: + // For x in 'struct {x T}', return struct type, for now. + if _, ok := path[1].(*ast.Field); ok { + _ = path[2].(*ast.FieldList) // assertion + if _, ok := path[3].(*ast.StructType); ok { + return path[3:], actionType + } + } + return path, actionExpr + + case *types.Func: + return path, actionExpr + + case *types.Builtin: + // For reference to built-in function, return enclosing call. + path = path[1:] // ascend to enclosing function call + continue + + case *types.Nil: + return path, actionExpr + } + + // No object. + switch path[1].(type) { + case *ast.SelectorExpr: + // Return enclosing selector expression. + return path[1:], actionExpr + + case *ast.Field: + // TODO(adonovan): test this. + // e.g. all f in: + // struct { f, g int } + // interface { f() } + // func (f T) method(f, g int) (f, g bool) + // + // switch path[3].(type) { + // case *ast.FuncDecl: + // case *ast.StructType: + // case *ast.InterfaceType: + // } + // + // return path[1:], actionExpr + // + // Unclear what to do with these. + // Struct.Fields -- field + // Interface.Methods -- field + // FuncType.{Params.Results} -- actionExpr + // FuncDecl.Recv -- actionExpr + + case *ast.File: + // 'package foo' + return path, actionPackage + + case *ast.ImportSpec: + // TODO(adonovan): fix: why no package object? go/types bug? + return path[1:], actionPackage + + default: + // e.g. blank identifier + // or y in "switch y := x.(type)" + // or code in a _test.go file that's not part of the package. + log.Printf("unknown reference %s in %T\n", n, path[1]) + return path, actionUnknown + } + + case *ast.StarExpr: + if pkginfo.Types[n].IsType() { + return path, actionType + } + return path, actionExpr + + case ast.Expr: + // All Expr but {BasicLit,Ident,StarExpr} are + // "true" expressions that evaluate to a value. + return path, actionExpr + } + + // Ascend to parent. + path = path[1:] + } + + return nil, actionUnknown // unreachable +} + +func describeValue(qpos *queryPos, path []ast.Node) (*describeValueResult, error) { + var expr ast.Expr + var obj types.Object + switch n := path[0].(type) { + case *ast.ValueSpec: + // ambiguous ValueSpec containing multiple names + return nil, fmt.Errorf("multiple value specification") + case *ast.Ident: + obj = qpos.info.ObjectOf(n) + expr = n + case ast.Expr: + expr = n + default: + // TODO(adonovan): is this reachable? + return nil, fmt.Errorf("unexpected AST for expr: %T", n) + } + + typ := qpos.info.TypeOf(expr) + constVal := qpos.info.Types[expr].Value + + return &describeValueResult{ + qpos: qpos, + expr: expr, + typ: typ, + constVal: constVal, + obj: obj, + }, nil +} + +type describeValueResult struct { + qpos *queryPos + expr ast.Expr // query node + typ types.Type // type of expression + constVal exact.Value // value of expression, if constant + obj types.Object // var/func/const object, if expr was Ident +} + +func (r *describeValueResult) display(printf printfFunc) { + var prefix, suffix string + if r.constVal != nil { + suffix = fmt.Sprintf(" of constant value %s", constValString(r.constVal)) + } + switch obj := r.obj.(type) { + case *types.Func: + if recv := obj.Type().(*types.Signature).Recv(); recv != nil { + if _, ok := recv.Type().Underlying().(*types.Interface); ok { + prefix = "interface method " + } else { + prefix = "method " + } + } + } + + // Describe the expression. + if r.obj != nil { + if r.obj.Pos() == r.expr.Pos() { + // defining ident + printf(r.expr, "definition of %s%s%s", prefix, r.qpos.objectString(r.obj), suffix) + } else { + // referring ident + printf(r.expr, "reference to %s%s%s", prefix, r.qpos.objectString(r.obj), suffix) + if def := r.obj.Pos(); def != token.NoPos { + printf(def, "defined here") + } + } + } else { + desc := astutil.NodeDescription(r.expr) + if suffix != "" { + // constant expression + printf(r.expr, "%s%s", desc, suffix) + } else { + // non-constant expression + printf(r.expr, "%s of type %s", desc, r.qpos.typeString(r.typ)) + } + } +} + +func (r *describeValueResult) toSerial(res *serial.Result, fset *token.FileSet) { + var value, objpos string + if r.constVal != nil { + value = r.constVal.String() + } + if r.obj != nil { + objpos = fset.Position(r.obj.Pos()).String() + } + + res.Describe = &serial.Describe{ + Desc: astutil.NodeDescription(r.expr), + Pos: fset.Position(r.expr.Pos()).String(), + Detail: "value", + Value: &serial.DescribeValue{ + Type: r.qpos.typeString(r.typ), + Value: value, + ObjPos: objpos, + }, + } +} + +// ---- TYPE ------------------------------------------------------------ + +func describeType(qpos *queryPos, path []ast.Node) (*describeTypeResult, error) { + var description string + var t types.Type + switch n := path[0].(type) { + case *ast.Ident: + t = qpos.info.TypeOf(n) + switch t := t.(type) { + case *types.Basic: + description = "reference to built-in " + + case *types.Named: + isDef := t.Obj().Pos() == n.Pos() // see caveats at isDef above + if isDef { + description = "definition of " + } else { + description = "reference to " + } + } + + case ast.Expr: + t = qpos.info.TypeOf(n) + + default: + // Unreachable? + return nil, fmt.Errorf("unexpected AST for type: %T", n) + } + + description = description + "type " + qpos.typeString(t) + + // Show sizes for structs and named types (it's fairly obvious for others). + switch t.(type) { + case *types.Named, *types.Struct: + szs := types.StdSizes{8, 8} // assume amd64 + description = fmt.Sprintf("%s (size %d, align %d)", description, + szs.Sizeof(t), szs.Alignof(t)) + } + + return &describeTypeResult{ + qpos: qpos, + node: path[0], + description: description, + typ: t, + methods: accessibleMethods(t, qpos.info.Pkg), + }, nil +} + +type describeTypeResult struct { + qpos *queryPos + node ast.Node + description string + typ types.Type + methods []*types.Selection +} + +func (r *describeTypeResult) display(printf printfFunc) { + printf(r.node, "%s", r.description) + + // Show the underlying type for a reference to a named type. + if nt, ok := r.typ.(*types.Named); ok && r.node.Pos() != nt.Obj().Pos() { + printf(nt.Obj(), "defined as %s", r.qpos.typeString(nt.Underlying())) + } + + // Print the method set, if the type kind is capable of bearing methods. + switch r.typ.(type) { + case *types.Interface, *types.Struct, *types.Named: + if len(r.methods) > 0 { + printf(r.node, "Method set:") + for _, meth := range r.methods { + // TODO(adonovan): print these relative + // to the owning package, not the + // query package. + printf(meth.Obj(), "\t%s", r.qpos.selectionString(meth)) + } + } else { + printf(r.node, "No methods.") + } + } +} + +func (r *describeTypeResult) toSerial(res *serial.Result, fset *token.FileSet) { + var namePos, nameDef string + if nt, ok := r.typ.(*types.Named); ok { + namePos = fset.Position(nt.Obj().Pos()).String() + nameDef = nt.Underlying().String() + } + res.Describe = &serial.Describe{ + Desc: r.description, + Pos: fset.Position(r.node.Pos()).String(), + Detail: "type", + Type: &serial.DescribeType{ + Type: r.qpos.typeString(r.typ), + NamePos: namePos, + NameDef: nameDef, + Methods: methodsToSerial(r.qpos.info.Pkg, r.methods, fset), + }, + } +} + +// ---- PACKAGE ------------------------------------------------------------ + +func describePackage(qpos *queryPos, path []ast.Node) (*describePackageResult, error) { + var description string + var pkg *types.Package + switch n := path[0].(type) { + case *ast.ImportSpec: + var obj types.Object + if n.Name != nil { + obj = qpos.info.Defs[n.Name] + } else { + obj = qpos.info.Implicits[n] + } + pkgname, _ := obj.(*types.PkgName) + if pkgname == nil { + return nil, fmt.Errorf("can't import package %s", n.Path.Value) + } + pkg = pkgname.Imported() + description = fmt.Sprintf("import of package %q", pkg.Path()) + + case *ast.Ident: + if _, isDef := path[1].(*ast.File); isDef { + // e.g. package id + pkg = qpos.info.Pkg + description = fmt.Sprintf("definition of package %q", pkg.Path()) + } else { + // e.g. import id "..." + // or id.F() + pkg = qpos.info.ObjectOf(n).(*types.PkgName).Imported() + description = fmt.Sprintf("reference to package %q", pkg.Path()) + } + + default: + // Unreachable? + return nil, fmt.Errorf("unexpected AST for package: %T", n) + } + + var members []*describeMember + // NB: "unsafe" has no types.Package + if pkg != nil { + // Enumerate the accessible package members + // in lexicographic order. + for _, name := range pkg.Scope().Names() { + if pkg == qpos.info.Pkg || ast.IsExported(name) { + mem := pkg.Scope().Lookup(name) + var methods []*types.Selection + if mem, ok := mem.(*types.TypeName); ok { + methods = accessibleMethods(mem.Type(), qpos.info.Pkg) + } + members = append(members, &describeMember{ + mem, + methods, + }) + + } + } + } + + return &describePackageResult{qpos.fset, path[0], description, pkg, members}, nil +} + +type describePackageResult struct { + fset *token.FileSet + node ast.Node + description string + pkg *types.Package + members []*describeMember // in lexicographic name order +} + +type describeMember struct { + obj types.Object + methods []*types.Selection // in types.MethodSet order +} + +func (r *describePackageResult) display(printf printfFunc) { + printf(r.node, "%s", r.description) + + // Compute max width of name "column". + maxname := 0 + for _, mem := range r.members { + if l := len(mem.obj.Name()); l > maxname { + maxname = l + } + } + + for _, mem := range r.members { + printf(mem.obj, "\t%s", formatMember(mem.obj, maxname)) + for _, meth := range mem.methods { + printf(meth.Obj(), "\t\t%s", types.SelectionString(meth, types.RelativeTo(r.pkg))) + } + } +} + +func formatMember(obj types.Object, maxname int) string { + qualifier := types.RelativeTo(obj.Pkg()) + var buf bytes.Buffer + fmt.Fprintf(&buf, "%-5s %-*s", tokenOf(obj), maxname, obj.Name()) + switch obj := obj.(type) { + case *types.Const: + fmt.Fprintf(&buf, " %s = %s", types.TypeString(obj.Type(), qualifier), constValString(obj.Val())) + + case *types.Func: + fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type(), qualifier)) + + case *types.TypeName: + // Abbreviate long aggregate type names. + var abbrev string + switch t := obj.Type().Underlying().(type) { + case *types.Interface: + if t.NumMethods() > 1 { + abbrev = "interface{...}" + } + case *types.Struct: + if t.NumFields() > 1 { + abbrev = "struct{...}" + } + } + if abbrev == "" { + fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type().Underlying(), qualifier)) + } else { + fmt.Fprintf(&buf, " %s", abbrev) + } + + case *types.Var: + fmt.Fprintf(&buf, " %s", types.TypeString(obj.Type(), qualifier)) + } + return buf.String() +} + +func (r *describePackageResult) toSerial(res *serial.Result, fset *token.FileSet) { + var members []*serial.DescribeMember + for _, mem := range r.members { + typ := mem.obj.Type() + var val string + switch mem := mem.obj.(type) { + case *types.Const: + val = constValString(mem.Val()) + case *types.TypeName: + typ = typ.Underlying() + } + members = append(members, &serial.DescribeMember{ + Name: mem.obj.Name(), + Type: typ.String(), + Value: val, + Pos: fset.Position(mem.obj.Pos()).String(), + Kind: tokenOf(mem.obj), + Methods: methodsToSerial(r.pkg, mem.methods, fset), + }) + } + res.Describe = &serial.Describe{ + Desc: r.description, + Pos: fset.Position(r.node.Pos()).String(), + Detail: "package", + Package: &serial.DescribePackage{ + Path: r.pkg.Path(), + Members: members, + }, + } +} + +func tokenOf(o types.Object) string { + switch o.(type) { + case *types.Func: + return "func" + case *types.Var: + return "var" + case *types.TypeName: + return "type" + case *types.Const: + return "const" + case *types.PkgName: + return "package" + case *types.Builtin: + return "builtin" // e.g. when describing package "unsafe" + case *types.Nil: + return "nil" + case *types.Label: + return "label" + } + panic(o) +} + +// ---- STATEMENT ------------------------------------------------------------ + +func describeStmt(qpos *queryPos, path []ast.Node) (*describeStmtResult, error) { + var description string + switch n := path[0].(type) { + case *ast.Ident: + if qpos.info.Defs[n] != nil { + description = "labelled statement" + } else { + description = "reference to labelled statement" + } + + default: + // Nothing much to say about statements. + description = astutil.NodeDescription(n) + } + return &describeStmtResult{qpos.fset, path[0], description}, nil +} + +type describeStmtResult struct { + fset *token.FileSet + node ast.Node + description string +} + +func (r *describeStmtResult) display(printf printfFunc) { + printf(r.node, "%s", r.description) +} + +func (r *describeStmtResult) toSerial(res *serial.Result, fset *token.FileSet) { + res.Describe = &serial.Describe{ + Desc: r.description, + Pos: fset.Position(r.node.Pos()).String(), + Detail: "unknown", + } +} + +// ------------------- Utilities ------------------- + +// pathToString returns a string containing the concrete types of the +// nodes in path. +func pathToString(path []ast.Node) string { + var buf bytes.Buffer + fmt.Fprint(&buf, "[") + for i, n := range path { + if i > 0 { + fmt.Fprint(&buf, " ") + } + fmt.Fprint(&buf, strings.TrimPrefix(fmt.Sprintf("%T", n), "*ast.")) + } + fmt.Fprint(&buf, "]") + return buf.String() +} + +func accessibleMethods(t types.Type, from *types.Package) []*types.Selection { + var methods []*types.Selection + for _, meth := range typeutil.IntuitiveMethodSet(t, nil) { + if isAccessibleFrom(meth.Obj(), from) { + methods = append(methods, meth) + } + } + return methods +} + +func isAccessibleFrom(obj types.Object, pkg *types.Package) bool { + return ast.IsExported(obj.Name()) || obj.Pkg() == pkg +} + +func methodsToSerial(this *types.Package, methods []*types.Selection, fset *token.FileSet) []serial.DescribeMethod { + qualifier := types.RelativeTo(this) + var jmethods []serial.DescribeMethod + for _, meth := range methods { + var ser serial.DescribeMethod + if meth != nil { // may contain nils when called by implements (on a method) + ser = serial.DescribeMethod{ + Name: types.SelectionString(meth, qualifier), + Pos: fset.Position(meth.Obj().Pos()).String(), + } + } + jmethods = append(jmethods, ser) + } + return jmethods +} + +// constValString emulates Go 1.6's go/constant.ExactString well enough +// to make the tests pass. This is just a stopgap until we throw away +// all the *15.go files. +func constValString(v exact.Value) string { + if v.Kind() == exact.Float { + f, _ := exact.Float64Val(v) + return fmt.Sprintf("%g", f) + } + return v.String() +} diff --git a/vendor/golang.org/x/tools/oracle/freevars.go b/vendor/golang.org/x/tools/oracle/freevars.go new file mode 100644 index 0000000000..6b89cb393b --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/freevars.go @@ -0,0 +1,224 @@ +// Copyright 2013 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.5 + +package oracle + +import ( + "bytes" + "go/ast" + "go/printer" + "go/token" + "go/types" + "sort" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/oracle/serial" +) + +// freevars displays the lexical (not package-level) free variables of +// the selection. +// +// It treats A.B.C as a separate variable from A to reveal the parts +// of an aggregate type that are actually needed. +// This aids refactoring. +// +// TODO(adonovan): optionally display the free references to +// file/package scope objects, and to objects from other packages. +// Depending on where the resulting function abstraction will go, +// these might be interesting. Perhaps group the results into three +// bands. +// +func freevars(q *Query) error { + lconf := loader.Config{Build: q.Build} + allowErrors(&lconf) + + if _, err := importQueryPackage(q.Pos, &lconf); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + file := qpos.path[len(qpos.path)-1] // the enclosing file + fileScope := qpos.info.Scopes[file] + pkgScope := fileScope.Parent() + + // The id and sel functions return non-nil if they denote an + // object o or selection o.x.y that is referenced by the + // selection but defined neither within the selection nor at + // file scope, i.e. it is in the lexical environment. + var id func(n *ast.Ident) types.Object + var sel func(n *ast.SelectorExpr) types.Object + + sel = func(n *ast.SelectorExpr) types.Object { + switch x := unparen(n.X).(type) { + case *ast.SelectorExpr: + return sel(x) + case *ast.Ident: + return id(x) + } + return nil + } + + id = func(n *ast.Ident) types.Object { + obj := qpos.info.Uses[n] + if obj == nil { + return nil // not a reference + } + if _, ok := obj.(*types.PkgName); ok { + return nil // imported package + } + if !(file.Pos() <= obj.Pos() && obj.Pos() <= file.End()) { + return nil // not defined in this file + } + scope := obj.Parent() + if scope == nil { + return nil // e.g. interface method, struct field + } + if scope == fileScope || scope == pkgScope { + return nil // defined at file or package scope + } + if qpos.start <= obj.Pos() && obj.Pos() <= qpos.end { + return nil // defined within selection => not free + } + return obj + } + + // Maps each reference that is free in the selection + // to the object it refers to. + // The map de-duplicates repeated references. + refsMap := make(map[string]freevarsRef) + + // Visit all the identifiers in the selected ASTs. + ast.Inspect(qpos.path[0], func(n ast.Node) bool { + if n == nil { + return true // popping DFS stack + } + + // Is this node contained within the selection? + // (freevars permits inexact selections, + // like two stmts in a block.) + if qpos.start <= n.Pos() && n.End() <= qpos.end { + var obj types.Object + var prune bool + switch n := n.(type) { + case *ast.Ident: + obj = id(n) + + case *ast.SelectorExpr: + obj = sel(n) + prune = true + } + + if obj != nil { + var kind string + switch obj.(type) { + case *types.Var: + kind = "var" + case *types.Func: + kind = "func" + case *types.TypeName: + kind = "type" + case *types.Const: + kind = "const" + case *types.Label: + kind = "label" + default: + panic(obj) + } + + typ := qpos.info.TypeOf(n.(ast.Expr)) + ref := freevarsRef{kind, printNode(lprog.Fset, n), typ, obj} + refsMap[ref.ref] = ref + + if prune { + return false // don't descend + } + } + } + + return true // descend + }) + + refs := make([]freevarsRef, 0, len(refsMap)) + for _, ref := range refsMap { + refs = append(refs, ref) + } + sort.Sort(byRef(refs)) + + q.result = &freevarsResult{ + qpos: qpos, + refs: refs, + } + return nil +} + +type freevarsResult struct { + qpos *queryPos + refs []freevarsRef +} + +type freevarsRef struct { + kind string + ref string + typ types.Type + obj types.Object +} + +func (r *freevarsResult) display(printf printfFunc) { + if len(r.refs) == 0 { + printf(r.qpos, "No free identifiers.") + } else { + printf(r.qpos, "Free identifiers:") + qualifier := types.RelativeTo(r.qpos.info.Pkg) + for _, ref := range r.refs { + // Avoid printing "type T T". + var typstr string + if ref.kind != "type" { + typstr = " " + types.TypeString(ref.typ, qualifier) + } + printf(ref.obj, "%s %s%s", ref.kind, ref.ref, typstr) + } + } +} + +func (r *freevarsResult) toSerial(res *serial.Result, fset *token.FileSet) { + var refs []*serial.FreeVar + for _, ref := range r.refs { + refs = append(refs, + &serial.FreeVar{ + Pos: fset.Position(ref.obj.Pos()).String(), + Kind: ref.kind, + Ref: ref.ref, + Type: ref.typ.String(), + }) + } + res.Freevars = refs +} + +// -------- utils -------- + +type byRef []freevarsRef + +func (p byRef) Len() int { return len(p) } +func (p byRef) Less(i, j int) bool { return p[i].ref < p[j].ref } +func (p byRef) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +// printNode returns the pretty-printed syntax of n. +func printNode(fset *token.FileSet, n ast.Node) string { + var buf bytes.Buffer + printer.Fprint(&buf, fset, n) + return buf.String() +} diff --git a/vendor/golang.org/x/tools/oracle/freevars14.go b/vendor/golang.org/x/tools/oracle/freevars14.go new file mode 100644 index 0000000000..760a9e6cfb --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/freevars14.go @@ -0,0 +1,224 @@ +// Copyright 2013 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.5 + +package oracle + +import ( + "bytes" + "go/ast" + "go/printer" + "go/token" + "sort" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/types" + "golang.org/x/tools/oracle/serial" +) + +// freevars displays the lexical (not package-level) free variables of +// the selection. +// +// It treats A.B.C as a separate variable from A to reveal the parts +// of an aggregate type that are actually needed. +// This aids refactoring. +// +// TODO(adonovan): optionally display the free references to +// file/package scope objects, and to objects from other packages. +// Depending on where the resulting function abstraction will go, +// these might be interesting. Perhaps group the results into three +// bands. +// +func freevars(q *Query) error { + lconf := loader.Config{Build: q.Build} + allowErrors(&lconf) + + if _, err := importQueryPackage(q.Pos, &lconf); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + file := qpos.path[len(qpos.path)-1] // the enclosing file + fileScope := qpos.info.Scopes[file] + pkgScope := fileScope.Parent() + + // The id and sel functions return non-nil if they denote an + // object o or selection o.x.y that is referenced by the + // selection but defined neither within the selection nor at + // file scope, i.e. it is in the lexical environment. + var id func(n *ast.Ident) types.Object + var sel func(n *ast.SelectorExpr) types.Object + + sel = func(n *ast.SelectorExpr) types.Object { + switch x := unparen(n.X).(type) { + case *ast.SelectorExpr: + return sel(x) + case *ast.Ident: + return id(x) + } + return nil + } + + id = func(n *ast.Ident) types.Object { + obj := qpos.info.Uses[n] + if obj == nil { + return nil // not a reference + } + if _, ok := obj.(*types.PkgName); ok { + return nil // imported package + } + if !(file.Pos() <= obj.Pos() && obj.Pos() <= file.End()) { + return nil // not defined in this file + } + scope := obj.Parent() + if scope == nil { + return nil // e.g. interface method, struct field + } + if scope == fileScope || scope == pkgScope { + return nil // defined at file or package scope + } + if qpos.start <= obj.Pos() && obj.Pos() <= qpos.end { + return nil // defined within selection => not free + } + return obj + } + + // Maps each reference that is free in the selection + // to the object it refers to. + // The map de-duplicates repeated references. + refsMap := make(map[string]freevarsRef) + + // Visit all the identifiers in the selected ASTs. + ast.Inspect(qpos.path[0], func(n ast.Node) bool { + if n == nil { + return true // popping DFS stack + } + + // Is this node contained within the selection? + // (freevars permits inexact selections, + // like two stmts in a block.) + if qpos.start <= n.Pos() && n.End() <= qpos.end { + var obj types.Object + var prune bool + switch n := n.(type) { + case *ast.Ident: + obj = id(n) + + case *ast.SelectorExpr: + obj = sel(n) + prune = true + } + + if obj != nil { + var kind string + switch obj.(type) { + case *types.Var: + kind = "var" + case *types.Func: + kind = "func" + case *types.TypeName: + kind = "type" + case *types.Const: + kind = "const" + case *types.Label: + kind = "label" + default: + panic(obj) + } + + typ := qpos.info.TypeOf(n.(ast.Expr)) + ref := freevarsRef{kind, printNode(lprog.Fset, n), typ, obj} + refsMap[ref.ref] = ref + + if prune { + return false // don't descend + } + } + } + + return true // descend + }) + + refs := make([]freevarsRef, 0, len(refsMap)) + for _, ref := range refsMap { + refs = append(refs, ref) + } + sort.Sort(byRef(refs)) + + q.result = &freevarsResult{ + qpos: qpos, + refs: refs, + } + return nil +} + +type freevarsResult struct { + qpos *queryPos + refs []freevarsRef +} + +type freevarsRef struct { + kind string + ref string + typ types.Type + obj types.Object +} + +func (r *freevarsResult) display(printf printfFunc) { + if len(r.refs) == 0 { + printf(r.qpos, "No free identifiers.") + } else { + printf(r.qpos, "Free identifiers:") + qualifier := types.RelativeTo(r.qpos.info.Pkg) + for _, ref := range r.refs { + // Avoid printing "type T T". + var typstr string + if ref.kind != "type" { + typstr = " " + types.TypeString(ref.typ, qualifier) + } + printf(ref.obj, "%s %s%s", ref.kind, ref.ref, typstr) + } + } +} + +func (r *freevarsResult) toSerial(res *serial.Result, fset *token.FileSet) { + var refs []*serial.FreeVar + for _, ref := range r.refs { + refs = append(refs, + &serial.FreeVar{ + Pos: fset.Position(ref.obj.Pos()).String(), + Kind: ref.kind, + Ref: ref.ref, + Type: ref.typ.String(), + }) + } + res.Freevars = refs +} + +// -------- utils -------- + +type byRef []freevarsRef + +func (p byRef) Len() int { return len(p) } +func (p byRef) Less(i, j int) bool { return p[i].ref < p[j].ref } +func (p byRef) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +// printNode returns the pretty-printed syntax of n. +func printNode(fset *token.FileSet, n ast.Node) string { + var buf bytes.Buffer + printer.Fprint(&buf, fset, n) + return buf.String() +} diff --git a/vendor/golang.org/x/tools/oracle/implements.go b/vendor/golang.org/x/tools/oracle/implements.go new file mode 100644 index 0000000000..7c9da1dc46 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/implements.go @@ -0,0 +1,354 @@ +// Copyright 2013 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.5 + +package oracle + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" + "reflect" + "sort" + "strings" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/types/typeutil" + "golang.org/x/tools/oracle/serial" + "golang.org/x/tools/refactor/importgraph" +) + +// Implements displays the "implements" relation as it pertains to the +// selected type. +// If the selection is a method, 'implements' displays +// the corresponding methods of the types that would have been reported +// by an implements query on the receiver type. +// +func implements(q *Query) error { + lconf := loader.Config{Build: q.Build} + allowErrors(&lconf) + + qpkg, err := importQueryPackage(q.Pos, &lconf) + if err != nil { + return err + } + + // Set the packages to search. + if len(q.Scope) > 0 { + // Inspect all packages in the analysis scope, if specified. + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + } else { + // Otherwise inspect the forward and reverse + // transitive closure of the selected package. + // (In theory even this is incomplete.) + _, rev, _ := importgraph.Build(q.Build) + for path := range rev.Search(qpkg) { + lconf.ImportWithTests(path) + } + + // TODO(adonovan): for completeness, we should also + // type-check and inspect function bodies in all + // imported packages. This would be expensive, but we + // could optimize by skipping functions that do not + // contain type declarations. This would require + // changing the loader's TypeCheckFuncBodies hook to + // provide the []*ast.File. + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + // Find the selected type. + path, action := findInterestingNode(qpos.info, qpos.path) + + var method *types.Func + var T types.Type // selected type (receiver if method != nil) + + switch action { + case actionExpr: + // method? + if id, ok := path[0].(*ast.Ident); ok { + if obj, ok := qpos.info.ObjectOf(id).(*types.Func); ok { + recv := obj.Type().(*types.Signature).Recv() + if recv == nil { + return fmt.Errorf("this function is not a method") + } + method = obj + T = recv.Type() + } + } + case actionType: + T = qpos.info.TypeOf(path[0].(ast.Expr)) + } + if T == nil { + return fmt.Errorf("no type or method here") + } + + // Find all named types, even local types (which can have + // methods via promotion) and the built-in "error". + var allNamed []types.Type + for _, info := range lprog.AllPackages { + for _, obj := range info.Defs { + if obj, ok := obj.(*types.TypeName); ok { + allNamed = append(allNamed, obj.Type()) + } + } + } + allNamed = append(allNamed, types.Universe.Lookup("error").Type()) + + var msets typeutil.MethodSetCache + + // Test each named type. + var to, from, fromPtr []types.Type + for _, U := range allNamed { + if isInterface(T) { + if msets.MethodSet(T).Len() == 0 { + continue // empty interface + } + if isInterface(U) { + if msets.MethodSet(U).Len() == 0 { + continue // empty interface + } + + // T interface, U interface + if !types.Identical(T, U) { + if types.AssignableTo(U, T) { + to = append(to, U) + } + if types.AssignableTo(T, U) { + from = append(from, U) + } + } + } else { + // T interface, U concrete + if types.AssignableTo(U, T) { + to = append(to, U) + } else if pU := types.NewPointer(U); types.AssignableTo(pU, T) { + to = append(to, pU) + } + } + } else if isInterface(U) { + if msets.MethodSet(U).Len() == 0 { + continue // empty interface + } + + // T concrete, U interface + if types.AssignableTo(T, U) { + from = append(from, U) + } else if pT := types.NewPointer(T); types.AssignableTo(pT, U) { + fromPtr = append(fromPtr, U) + } + } + } + + var pos interface{} = qpos + if nt, ok := deref(T).(*types.Named); ok { + pos = nt.Obj() + } + + // Sort types (arbitrarily) to ensure test determinism. + sort.Sort(typesByString(to)) + sort.Sort(typesByString(from)) + sort.Sort(typesByString(fromPtr)) + + var toMethod, fromMethod, fromPtrMethod []*types.Selection // contain nils + if method != nil { + for _, t := range to { + toMethod = append(toMethod, + types.NewMethodSet(t).Lookup(method.Pkg(), method.Name())) + } + for _, t := range from { + fromMethod = append(fromMethod, + types.NewMethodSet(t).Lookup(method.Pkg(), method.Name())) + } + for _, t := range fromPtr { + fromPtrMethod = append(fromPtrMethod, + types.NewMethodSet(t).Lookup(method.Pkg(), method.Name())) + } + } + + q.result = &implementsResult{ + qpos, T, pos, to, from, fromPtr, method, toMethod, fromMethod, fromPtrMethod, + } + return nil +} + +type implementsResult struct { + qpos *queryPos + + t types.Type // queried type (not necessarily named) + pos interface{} // pos of t (*types.Name or *QueryPos) + to []types.Type // named or ptr-to-named types assignable to interface T + from []types.Type // named interfaces assignable from T + fromPtr []types.Type // named interfaces assignable only from *T + + // if a method was queried: + method *types.Func // queried method + toMethod []*types.Selection // method of type to[i], if any + fromMethod []*types.Selection // method of type from[i], if any + fromPtrMethod []*types.Selection // method of type fromPtrMethod[i], if any +} + +func (r *implementsResult) display(printf printfFunc) { + relation := "is implemented by" + + meth := func(sel *types.Selection) { + if sel != nil { + printf(sel.Obj(), "\t%s method (%s).%s", + relation, r.qpos.typeString(sel.Recv()), sel.Obj().Name()) + } + } + + if isInterface(r.t) { + if types.NewMethodSet(r.t).Len() == 0 { // TODO(adonovan): cache mset + printf(r.pos, "empty interface type %s", r.qpos.typeString(r.t)) + return + } + + if r.method == nil { + printf(r.pos, "interface type %s", r.qpos.typeString(r.t)) + } else { + printf(r.method, "abstract method %s", r.qpos.objectString(r.method)) + } + + // Show concrete types (or methods) first; use two passes. + for i, sub := range r.to { + if !isInterface(sub) { + if r.method == nil { + printf(deref(sub).(*types.Named).Obj(), "\t%s %s type %s", + relation, typeKind(sub), r.qpos.typeString(sub)) + } else { + meth(r.toMethod[i]) + } + } + } + for i, sub := range r.to { + if isInterface(sub) { + if r.method == nil { + printf(sub.(*types.Named).Obj(), "\t%s %s type %s", + relation, typeKind(sub), r.qpos.typeString(sub)) + } else { + meth(r.toMethod[i]) + } + } + } + + relation = "implements" + for i, super := range r.from { + if r.method == nil { + printf(super.(*types.Named).Obj(), "\t%s %s", + relation, r.qpos.typeString(super)) + } else { + meth(r.fromMethod[i]) + } + } + } else { + relation = "implements" + + if r.from != nil { + if r.method == nil { + printf(r.pos, "%s type %s", + typeKind(r.t), r.qpos.typeString(r.t)) + } else { + printf(r.method, "concrete method %s", + r.qpos.objectString(r.method)) + } + for i, super := range r.from { + if r.method == nil { + printf(super.(*types.Named).Obj(), "\t%s %s", + relation, r.qpos.typeString(super)) + } else { + meth(r.fromMethod[i]) + } + } + } + if r.fromPtr != nil { + if r.method == nil { + printf(r.pos, "pointer type *%s", r.qpos.typeString(r.t)) + } else { + // TODO(adonovan): de-dup (C).f and (*C).f implementing (I).f. + printf(r.method, "concrete method %s", + r.qpos.objectString(r.method)) + } + + for i, psuper := range r.fromPtr { + if r.method == nil { + printf(psuper.(*types.Named).Obj(), "\t%s %s", + relation, r.qpos.typeString(psuper)) + } else { + meth(r.fromPtrMethod[i]) + } + } + } else if r.from == nil { + printf(r.pos, "%s type %s implements only interface{}", + typeKind(r.t), r.qpos.typeString(r.t)) + } + } +} + +func (r *implementsResult) toSerial(res *serial.Result, fset *token.FileSet) { + res.Implements = &serial.Implements{ + T: makeImplementsType(r.t, fset), + AssignableTo: makeImplementsTypes(r.to, fset), + AssignableFrom: makeImplementsTypes(r.from, fset), + AssignableFromPtr: makeImplementsTypes(r.fromPtr, fset), + AssignableToMethod: methodsToSerial(r.qpos.info.Pkg, r.toMethod, fset), + AssignableFromMethod: methodsToSerial(r.qpos.info.Pkg, r.fromMethod, fset), + AssignableFromPtrMethod: methodsToSerial(r.qpos.info.Pkg, r.fromPtrMethod, fset), + } + if r.method != nil { + res.Implements.Method = &serial.DescribeMethod{ + Name: r.qpos.objectString(r.method), + Pos: fset.Position(r.method.Pos()).String(), + } + } +} + +func makeImplementsTypes(tt []types.Type, fset *token.FileSet) []serial.ImplementsType { + var r []serial.ImplementsType + for _, t := range tt { + r = append(r, makeImplementsType(t, fset)) + } + return r +} + +func makeImplementsType(T types.Type, fset *token.FileSet) serial.ImplementsType { + var pos token.Pos + if nt, ok := deref(T).(*types.Named); ok { // implementsResult.t may be non-named + pos = nt.Obj().Pos() + } + return serial.ImplementsType{ + Name: T.String(), + Pos: fset.Position(pos).String(), + Kind: typeKind(T), + } +} + +// typeKind returns a string describing the underlying kind of type, +// e.g. "slice", "array", "struct". +func typeKind(T types.Type) string { + s := reflect.TypeOf(T.Underlying()).String() + return strings.ToLower(strings.TrimPrefix(s, "*types.")) +} + +func isInterface(T types.Type) bool { return types.IsInterface(T) } + +type typesByString []types.Type + +func (p typesByString) Len() int { return len(p) } +func (p typesByString) Less(i, j int) bool { return p[i].String() < p[j].String() } +func (p typesByString) Swap(i, j int) { p[i], p[j] = p[j], p[i] } diff --git a/vendor/golang.org/x/tools/oracle/implements14.go b/vendor/golang.org/x/tools/oracle/implements14.go new file mode 100644 index 0000000000..9f4c370210 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/implements14.go @@ -0,0 +1,354 @@ +// Copyright 2013 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.5 + +package oracle + +import ( + "fmt" + "go/ast" + "go/token" + "reflect" + "sort" + "strings" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/types" + "golang.org/x/tools/go/types/typeutil" + "golang.org/x/tools/oracle/serial" + "golang.org/x/tools/refactor/importgraph" +) + +// Implements displays the "implements" relation as it pertains to the +// selected type. +// If the selection is a method, 'implements' displays +// the corresponding methods of the types that would have been reported +// by an implements query on the receiver type. +// +func implements(q *Query) error { + lconf := loader.Config{Build: q.Build} + allowErrors(&lconf) + + qpkg, err := importQueryPackage(q.Pos, &lconf) + if err != nil { + return err + } + + // Set the packages to search. + if len(q.Scope) > 0 { + // Inspect all packages in the analysis scope, if specified. + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + } else { + // Otherwise inspect the forward and reverse + // transitive closure of the selected package. + // (In theory even this is incomplete.) + _, rev, _ := importgraph.Build(q.Build) + for path := range rev.Search(qpkg) { + lconf.ImportWithTests(path) + } + + // TODO(adonovan): for completeness, we should also + // type-check and inspect function bodies in all + // imported packages. This would be expensive, but we + // could optimize by skipping functions that do not + // contain type declarations. This would require + // changing the loader's TypeCheckFuncBodies hook to + // provide the []*ast.File. + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + // Find the selected type. + path, action := findInterestingNode(qpos.info, qpos.path) + + var method *types.Func + var T types.Type // selected type (receiver if method != nil) + + switch action { + case actionExpr: + // method? + if id, ok := path[0].(*ast.Ident); ok { + if obj, ok := qpos.info.ObjectOf(id).(*types.Func); ok { + recv := obj.Type().(*types.Signature).Recv() + if recv == nil { + return fmt.Errorf("this function is not a method") + } + method = obj + T = recv.Type() + } + } + case actionType: + T = qpos.info.TypeOf(path[0].(ast.Expr)) + } + if T == nil { + return fmt.Errorf("no type or method here") + } + + // Find all named types, even local types (which can have + // methods via promotion) and the built-in "error". + var allNamed []types.Type + for _, info := range lprog.AllPackages { + for _, obj := range info.Defs { + if obj, ok := obj.(*types.TypeName); ok { + allNamed = append(allNamed, obj.Type()) + } + } + } + allNamed = append(allNamed, types.Universe.Lookup("error").Type()) + + var msets typeutil.MethodSetCache + + // Test each named type. + var to, from, fromPtr []types.Type + for _, U := range allNamed { + if isInterface(T) { + if msets.MethodSet(T).Len() == 0 { + continue // empty interface + } + if isInterface(U) { + if msets.MethodSet(U).Len() == 0 { + continue // empty interface + } + + // T interface, U interface + if !types.Identical(T, U) { + if types.AssignableTo(U, T) { + to = append(to, U) + } + if types.AssignableTo(T, U) { + from = append(from, U) + } + } + } else { + // T interface, U concrete + if types.AssignableTo(U, T) { + to = append(to, U) + } else if pU := types.NewPointer(U); types.AssignableTo(pU, T) { + to = append(to, pU) + } + } + } else if isInterface(U) { + if msets.MethodSet(U).Len() == 0 { + continue // empty interface + } + + // T concrete, U interface + if types.AssignableTo(T, U) { + from = append(from, U) + } else if pT := types.NewPointer(T); types.AssignableTo(pT, U) { + fromPtr = append(fromPtr, U) + } + } + } + + var pos interface{} = qpos + if nt, ok := deref(T).(*types.Named); ok { + pos = nt.Obj() + } + + // Sort types (arbitrarily) to ensure test determinism. + sort.Sort(typesByString(to)) + sort.Sort(typesByString(from)) + sort.Sort(typesByString(fromPtr)) + + var toMethod, fromMethod, fromPtrMethod []*types.Selection // contain nils + if method != nil { + for _, t := range to { + toMethod = append(toMethod, + types.NewMethodSet(t).Lookup(method.Pkg(), method.Name())) + } + for _, t := range from { + fromMethod = append(fromMethod, + types.NewMethodSet(t).Lookup(method.Pkg(), method.Name())) + } + for _, t := range fromPtr { + fromPtrMethod = append(fromPtrMethod, + types.NewMethodSet(t).Lookup(method.Pkg(), method.Name())) + } + } + + q.result = &implementsResult{ + qpos, T, pos, to, from, fromPtr, method, toMethod, fromMethod, fromPtrMethod, + } + return nil +} + +type implementsResult struct { + qpos *queryPos + + t types.Type // queried type (not necessarily named) + pos interface{} // pos of t (*types.Name or *QueryPos) + to []types.Type // named or ptr-to-named types assignable to interface T + from []types.Type // named interfaces assignable from T + fromPtr []types.Type // named interfaces assignable only from *T + + // if a method was queried: + method *types.Func // queried method + toMethod []*types.Selection // method of type to[i], if any + fromMethod []*types.Selection // method of type from[i], if any + fromPtrMethod []*types.Selection // method of type fromPtrMethod[i], if any +} + +func (r *implementsResult) display(printf printfFunc) { + relation := "is implemented by" + + meth := func(sel *types.Selection) { + if sel != nil { + printf(sel.Obj(), "\t%s method (%s).%s", + relation, r.qpos.typeString(sel.Recv()), sel.Obj().Name()) + } + } + + if isInterface(r.t) { + if types.NewMethodSet(r.t).Len() == 0 { // TODO(adonovan): cache mset + printf(r.pos, "empty interface type %s", r.qpos.typeString(r.t)) + return + } + + if r.method == nil { + printf(r.pos, "interface type %s", r.qpos.typeString(r.t)) + } else { + printf(r.method, "abstract method %s", r.qpos.objectString(r.method)) + } + + // Show concrete types (or methods) first; use two passes. + for i, sub := range r.to { + if !isInterface(sub) { + if r.method == nil { + printf(deref(sub).(*types.Named).Obj(), "\t%s %s type %s", + relation, typeKind(sub), r.qpos.typeString(sub)) + } else { + meth(r.toMethod[i]) + } + } + } + for i, sub := range r.to { + if isInterface(sub) { + if r.method == nil { + printf(sub.(*types.Named).Obj(), "\t%s %s type %s", + relation, typeKind(sub), r.qpos.typeString(sub)) + } else { + meth(r.toMethod[i]) + } + } + } + + relation = "implements" + for i, super := range r.from { + if r.method == nil { + printf(super.(*types.Named).Obj(), "\t%s %s", + relation, r.qpos.typeString(super)) + } else { + meth(r.fromMethod[i]) + } + } + } else { + relation = "implements" + + if r.from != nil { + if r.method == nil { + printf(r.pos, "%s type %s", + typeKind(r.t), r.qpos.typeString(r.t)) + } else { + printf(r.method, "concrete method %s", + r.qpos.objectString(r.method)) + } + for i, super := range r.from { + if r.method == nil { + printf(super.(*types.Named).Obj(), "\t%s %s", + relation, r.qpos.typeString(super)) + } else { + meth(r.fromMethod[i]) + } + } + } + if r.fromPtr != nil { + if r.method == nil { + printf(r.pos, "pointer type *%s", r.qpos.typeString(r.t)) + } else { + // TODO(adonovan): de-dup (C).f and (*C).f implementing (I).f. + printf(r.method, "concrete method %s", + r.qpos.objectString(r.method)) + } + + for i, psuper := range r.fromPtr { + if r.method == nil { + printf(psuper.(*types.Named).Obj(), "\t%s %s", + relation, r.qpos.typeString(psuper)) + } else { + meth(r.fromPtrMethod[i]) + } + } + } else if r.from == nil { + printf(r.pos, "%s type %s implements only interface{}", + typeKind(r.t), r.qpos.typeString(r.t)) + } + } +} + +func (r *implementsResult) toSerial(res *serial.Result, fset *token.FileSet) { + res.Implements = &serial.Implements{ + T: makeImplementsType(r.t, fset), + AssignableTo: makeImplementsTypes(r.to, fset), + AssignableFrom: makeImplementsTypes(r.from, fset), + AssignableFromPtr: makeImplementsTypes(r.fromPtr, fset), + AssignableToMethod: methodsToSerial(r.qpos.info.Pkg, r.toMethod, fset), + AssignableFromMethod: methodsToSerial(r.qpos.info.Pkg, r.fromMethod, fset), + AssignableFromPtrMethod: methodsToSerial(r.qpos.info.Pkg, r.fromPtrMethod, fset), + } + if r.method != nil { + res.Implements.Method = &serial.DescribeMethod{ + Name: r.qpos.objectString(r.method), + Pos: fset.Position(r.method.Pos()).String(), + } + } +} + +func makeImplementsTypes(tt []types.Type, fset *token.FileSet) []serial.ImplementsType { + var r []serial.ImplementsType + for _, t := range tt { + r = append(r, makeImplementsType(t, fset)) + } + return r +} + +func makeImplementsType(T types.Type, fset *token.FileSet) serial.ImplementsType { + var pos token.Pos + if nt, ok := deref(T).(*types.Named); ok { // implementsResult.t may be non-named + pos = nt.Obj().Pos() + } + return serial.ImplementsType{ + Name: T.String(), + Pos: fset.Position(pos).String(), + Kind: typeKind(T), + } +} + +// typeKind returns a string describing the underlying kind of type, +// e.g. "slice", "array", "struct". +func typeKind(T types.Type) string { + s := reflect.TypeOf(T.Underlying()).String() + return strings.ToLower(strings.TrimPrefix(s, "*types.")) +} + +func isInterface(T types.Type) bool { return types.IsInterface(T) } + +type typesByString []types.Type + +func (p typesByString) Len() int { return len(p) } +func (p typesByString) Less(i, j int) bool { return p[i].String() < p[j].String() } +func (p typesByString) Swap(i, j int) { p[i], p[j] = p[j], p[i] } diff --git a/vendor/golang.org/x/tools/oracle/oracle.go b/vendor/golang.org/x/tools/oracle/oracle.go new file mode 100644 index 0000000000..794cbe9073 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/oracle.go @@ -0,0 +1,367 @@ +// 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 go1.5 + +// Package oracle contains the implementation of the oracle tool whose +// command-line is provided by golang.org/x/tools/cmd/oracle. +// +// http://golang.org/s/oracle-design +// http://golang.org/s/oracle-user-manual +// +package oracle // import "golang.org/x/tools/oracle" + +// This file defines oracle.Query, the entry point for the oracle tool. +// The actual executable is defined in cmd/oracle. + +// TODO(adonovan): new queries +// - show all statements that may update the selected lvalue +// (local, global, field, etc). +// - show all places where an object of type T is created +// (&T{}, var t T, new(T), new(struct{array [3]T}), etc. + +import ( + "fmt" + "go/ast" + "go/build" + "go/parser" + "go/token" + "go/types" + "io" + "path/filepath" + + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/pointer" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/oracle/serial" +) + +type printfFunc func(pos interface{}, format string, args ...interface{}) + +// queryResult is the interface of each query-specific result type. +type queryResult interface { + toSerial(res *serial.Result, fset *token.FileSet) + display(printf printfFunc) +} + +// A QueryPos represents the position provided as input to a query: +// a textual extent in the program's source code, the AST node it +// corresponds to, and the package to which it belongs. +// Instances are created by parseQueryPos. +type queryPos struct { + fset *token.FileSet + start, end token.Pos // source extent of query + path []ast.Node // AST path from query node to root of ast.File + exact bool // 2nd result of PathEnclosingInterval + info *loader.PackageInfo // type info for the queried package (nil for fastQueryPos) +} + +// TypeString prints type T relative to the query position. +func (qpos *queryPos) typeString(T types.Type) string { + return types.TypeString(T, types.RelativeTo(qpos.info.Pkg)) +} + +// ObjectString prints object obj relative to the query position. +func (qpos *queryPos) objectString(obj types.Object) string { + return types.ObjectString(obj, types.RelativeTo(qpos.info.Pkg)) +} + +// SelectionString prints selection sel relative to the query position. +func (qpos *queryPos) selectionString(sel *types.Selection) string { + return types.SelectionString(sel, types.RelativeTo(qpos.info.Pkg)) +} + +// A Query specifies a single oracle query. +type Query struct { + Mode string // query mode ("callers", etc) + Pos string // query position + Build *build.Context // package loading configuration + + // pointer analysis options + Scope []string // main packages in (*loader.Config).FromArgs syntax + PTALog io.Writer // (optional) pointer-analysis log file + Reflection bool // model reflection soundly (currently slow). + + // Populated during Run() + Fset *token.FileSet + result queryResult +} + +// Serial returns an instance of serial.Result, which implements the +// {xml,json}.Marshaler interfaces so that query results can be +// serialized as JSON or XML. +// +func (q *Query) Serial() *serial.Result { + resj := &serial.Result{Mode: q.Mode} + q.result.toSerial(resj, q.Fset) + return resj +} + +// WriteTo writes the oracle query result res to out in a compiler diagnostic format. +func (q *Query) WriteTo(out io.Writer) { + printf := func(pos interface{}, format string, args ...interface{}) { + fprintf(out, q.Fset, pos, format, args...) + } + q.result.display(printf) +} + +// Run runs an oracle query and populates its Fset and Result. +func Run(q *Query) error { + switch q.Mode { + case "callees": + return callees(q) + case "callers": + return callers(q) + case "callstack": + return callstack(q) + case "peers": + return peers(q) + case "pointsto": + return pointsto(q) + case "whicherrs": + return whicherrs(q) + case "definition": + return definition(q) + case "describe": + return describe(q) + case "freevars": + return freevars(q) + case "implements": + return implements(q) + case "referrers": + return referrers(q) + case "what": + return what(q) + default: + return fmt.Errorf("invalid mode: %q", q.Mode) + } +} + +func setPTAScope(lconf *loader.Config, scope []string) error { + if len(scope) == 0 { + return fmt.Errorf("no packages specified for pointer analysis scope") + } + + // Determine initial packages for PTA. + args, err := lconf.FromArgs(scope, true) + if err != nil { + return err + } + if len(args) > 0 { + return fmt.Errorf("surplus arguments: %q", args) + } + return nil +} + +// Create a pointer.Config whose scope is the initial packages of lprog +// and their dependencies. +func setupPTA(prog *ssa.Program, lprog *loader.Program, ptaLog io.Writer, reflection bool) (*pointer.Config, error) { + // TODO(adonovan): the body of this function is essentially + // duplicated in all go/pointer clients. Refactor. + + // For each initial package (specified on the command line), + // if it has a main function, analyze that, + // otherwise analyze its tests, if any. + var testPkgs, mains []*ssa.Package + for _, info := range lprog.InitialPackages() { + initialPkg := prog.Package(info.Pkg) + + // Add package to the pointer analysis scope. + if initialPkg.Func("main") != nil { + mains = append(mains, initialPkg) + } else { + testPkgs = append(testPkgs, initialPkg) + } + } + if testPkgs != nil { + if p := prog.CreateTestMainPackage(testPkgs...); p != nil { + mains = append(mains, p) + } + } + if mains == nil { + return nil, fmt.Errorf("analysis scope has no main and no tests") + } + return &pointer.Config{ + Log: ptaLog, + Reflection: reflection, + Mains: mains, + }, nil +} + +// importQueryPackage finds the package P containing the +// query position and tells conf to import it. +// It returns the package's path. +func importQueryPackage(pos string, conf *loader.Config) (string, error) { + fqpos, err := fastQueryPos(pos) + if err != nil { + return "", err // bad query + } + filename := fqpos.fset.File(fqpos.start).Name() + + // This will not work for ad-hoc packages + // such as $GOROOT/src/net/http/triv.go. + // TODO(adonovan): ensure we report a clear error. + _, importPath, err := guessImportPath(filename, conf.Build) + if err != nil { + return "", err // can't find GOPATH dir + } + if importPath == "" { + return "", fmt.Errorf("can't guess import path from %s", filename) + } + + // Check that it's possible to load the queried package. + // (e.g. oracle tests contain different 'package' decls in same dir.) + // Keep consistent with logic in loader/util.go! + cfg2 := *conf.Build + cfg2.CgoEnabled = false + bp, err := cfg2.Import(importPath, "", 0) + if err != nil { + return "", err // no files for package + } + + switch pkgContainsFile(bp, filename) { + case 'T': + conf.ImportWithTests(importPath) + case 'X': + conf.ImportWithTests(importPath) + importPath += "_test" // for TypeCheckFuncBodies + case 'G': + conf.Import(importPath) + default: + return "", fmt.Errorf("package %q doesn't contain file %s", + importPath, filename) + } + + conf.TypeCheckFuncBodies = func(p string) bool { return p == importPath } + + return importPath, nil +} + +// pkgContainsFile reports whether file was among the packages Go +// files, Test files, eXternal test files, or not found. +func pkgContainsFile(bp *build.Package, filename string) byte { + for i, files := range [][]string{bp.GoFiles, bp.TestGoFiles, bp.XTestGoFiles} { + for _, file := range files { + if sameFile(filepath.Join(bp.Dir, file), filename) { + return "GTX"[i] + } + } + } + return 0 // not found +} + +// ParseQueryPos parses the source query position pos and returns the +// AST node of the loaded program lprog that it identifies. +// If needExact, it must identify a single AST subtree; +// this is appropriate for queries that allow fairly arbitrary syntax, +// e.g. "describe". +// +func parseQueryPos(lprog *loader.Program, posFlag string, needExact bool) (*queryPos, error) { + filename, startOffset, endOffset, err := parsePosFlag(posFlag) + if err != nil { + return nil, err + } + start, end, err := findQueryPos(lprog.Fset, filename, startOffset, endOffset) + if err != nil { + return nil, err + } + info, path, exact := lprog.PathEnclosingInterval(start, end) + if path == nil { + return nil, fmt.Errorf("no syntax here") + } + if needExact && !exact { + return nil, fmt.Errorf("ambiguous selection within %s", astutil.NodeDescription(path[0])) + } + return &queryPos{lprog.Fset, start, end, path, exact, info}, nil +} + +// ---------- Utilities ---------- + +// allowErrors causes type errors to be silently ignored. +// (Not suitable if SSA construction follows.) +func allowErrors(lconf *loader.Config) { + ctxt := *lconf.Build // copy + ctxt.CgoEnabled = false + lconf.Build = &ctxt + lconf.AllowErrors = true + // AllErrors makes the parser always return an AST instead of + // bailing out after 10 errors and returning an empty ast.File. + lconf.ParserMode = parser.AllErrors + lconf.TypeChecker.Error = func(err error) {} +} + +// ptrAnalysis runs the pointer analysis and returns its result. +func ptrAnalysis(conf *pointer.Config) *pointer.Result { + result, err := pointer.Analyze(conf) + if err != nil { + panic(err) // pointer analysis internal error + } + return result +} + +func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) } + +// deref returns a pointer's element type; otherwise it returns typ. +func deref(typ types.Type) types.Type { + if p, ok := typ.Underlying().(*types.Pointer); ok { + return p.Elem() + } + return typ +} + +// fprintf prints to w a message of the form "location: message\n" +// where location is derived from pos. +// +// pos must be one of: +// - a token.Pos, denoting a position +// - an ast.Node, denoting an interval +// - anything with a Pos() method: +// ssa.Member, ssa.Value, ssa.Instruction, types.Object, pointer.Label, etc. +// - a QueryPos, denoting the extent of the user's query. +// - nil, meaning no position at all. +// +// The output format is is compatible with the 'gnu' +// compilation-error-regexp in Emacs' compilation mode. +// TODO(adonovan): support other editors. +// +func fprintf(w io.Writer, fset *token.FileSet, pos interface{}, format string, args ...interface{}) { + var start, end token.Pos + switch pos := pos.(type) { + case ast.Node: + start = pos.Pos() + end = pos.End() + case token.Pos: + start = pos + end = start + case interface { + Pos() token.Pos + }: + start = pos.Pos() + end = start + case *queryPos: + start = pos.start + end = pos.end + case nil: + // no-op + default: + panic(fmt.Sprintf("invalid pos: %T", pos)) + } + + if sp := fset.Position(start); start == end { + // (prints "-: " for token.NoPos) + fmt.Fprintf(w, "%s: ", sp) + } else { + ep := fset.Position(end) + // The -1 below is a concession to Emacs's broken use of + // inclusive (not half-open) intervals. + // Other editors may not want it. + // TODO(adonovan): add an -editor=vim|emacs|acme|auto + // flag; auto uses EMACS=t / VIM=... / etc env vars. + fmt.Fprintf(w, "%s:%d.%d-%d.%d: ", + sp.Filename, sp.Line, sp.Column, ep.Line, ep.Column-1) + } + fmt.Fprintf(w, format, args...) + io.WriteString(w, "\n") +} diff --git a/vendor/golang.org/x/tools/oracle/oracle14.go b/vendor/golang.org/x/tools/oracle/oracle14.go new file mode 100644 index 0000000000..ed8a166d0b --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/oracle14.go @@ -0,0 +1,367 @@ +// 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 !go1.5 + +// Package oracle contains the implementation of the oracle tool whose +// command-line is provided by golang.org/x/tools/cmd/oracle. +// +// http://golang.org/s/oracle-design +// http://golang.org/s/oracle-user-manual +// +package oracle // import "golang.org/x/tools/oracle" + +// This file defines oracle.Query, the entry point for the oracle tool. +// The actual executable is defined in cmd/oracle. + +// TODO(adonovan): new queries +// - show all statements that may update the selected lvalue +// (local, global, field, etc). +// - show all places where an object of type T is created +// (&T{}, var t T, new(T), new(struct{array [3]T}), etc. + +import ( + "fmt" + "go/ast" + "go/build" + "go/parser" + "go/token" + "io" + "path/filepath" + + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/pointer" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/types" + "golang.org/x/tools/oracle/serial" +) + +type printfFunc func(pos interface{}, format string, args ...interface{}) + +// queryResult is the interface of each query-specific result type. +type queryResult interface { + toSerial(res *serial.Result, fset *token.FileSet) + display(printf printfFunc) +} + +// A QueryPos represents the position provided as input to a query: +// a textual extent in the program's source code, the AST node it +// corresponds to, and the package to which it belongs. +// Instances are created by parseQueryPos. +type queryPos struct { + fset *token.FileSet + start, end token.Pos // source extent of query + path []ast.Node // AST path from query node to root of ast.File + exact bool // 2nd result of PathEnclosingInterval + info *loader.PackageInfo // type info for the queried package (nil for fastQueryPos) +} + +// TypeString prints type T relative to the query position. +func (qpos *queryPos) typeString(T types.Type) string { + return types.TypeString(T, types.RelativeTo(qpos.info.Pkg)) +} + +// ObjectString prints object obj relative to the query position. +func (qpos *queryPos) objectString(obj types.Object) string { + return types.ObjectString(obj, types.RelativeTo(qpos.info.Pkg)) +} + +// SelectionString prints selection sel relative to the query position. +func (qpos *queryPos) selectionString(sel *types.Selection) string { + return types.SelectionString(sel, types.RelativeTo(qpos.info.Pkg)) +} + +// A Query specifies a single oracle query. +type Query struct { + Mode string // query mode ("callers", etc) + Pos string // query position + Build *build.Context // package loading configuration + + // pointer analysis options + Scope []string // main packages in (*loader.Config).FromArgs syntax + PTALog io.Writer // (optional) pointer-analysis log file + Reflection bool // model reflection soundly (currently slow). + + // Populated during Run() + Fset *token.FileSet + result queryResult +} + +// Serial returns an instance of serial.Result, which implements the +// {xml,json}.Marshaler interfaces so that query results can be +// serialized as JSON or XML. +// +func (q *Query) Serial() *serial.Result { + resj := &serial.Result{Mode: q.Mode} + q.result.toSerial(resj, q.Fset) + return resj +} + +// WriteTo writes the oracle query result res to out in a compiler diagnostic format. +func (q *Query) WriteTo(out io.Writer) { + printf := func(pos interface{}, format string, args ...interface{}) { + fprintf(out, q.Fset, pos, format, args...) + } + q.result.display(printf) +} + +// Run runs an oracle query and populates its Fset and Result. +func Run(q *Query) error { + switch q.Mode { + case "callees": + return callees(q) + case "callers": + return callers(q) + case "callstack": + return callstack(q) + case "peers": + return peers(q) + case "pointsto": + return pointsto(q) + case "whicherrs": + return whicherrs(q) + case "definition": + return definition(q) + case "describe": + return describe(q) + case "freevars": + return freevars(q) + case "implements": + return implements(q) + case "referrers": + return referrers(q) + case "what": + return what(q) + default: + return fmt.Errorf("invalid mode: %q", q.Mode) + } +} + +func setPTAScope(lconf *loader.Config, scope []string) error { + if len(scope) == 0 { + return fmt.Errorf("no packages specified for pointer analysis scope") + } + + // Determine initial packages for PTA. + args, err := lconf.FromArgs(scope, true) + if err != nil { + return err + } + if len(args) > 0 { + return fmt.Errorf("surplus arguments: %q", args) + } + return nil +} + +// Create a pointer.Config whose scope is the initial packages of lprog +// and their dependencies. +func setupPTA(prog *ssa.Program, lprog *loader.Program, ptaLog io.Writer, reflection bool) (*pointer.Config, error) { + // TODO(adonovan): the body of this function is essentially + // duplicated in all go/pointer clients. Refactor. + + // For each initial package (specified on the command line), + // if it has a main function, analyze that, + // otherwise analyze its tests, if any. + var testPkgs, mains []*ssa.Package + for _, info := range lprog.InitialPackages() { + initialPkg := prog.Package(info.Pkg) + + // Add package to the pointer analysis scope. + if initialPkg.Func("main") != nil { + mains = append(mains, initialPkg) + } else { + testPkgs = append(testPkgs, initialPkg) + } + } + if testPkgs != nil { + if p := prog.CreateTestMainPackage(testPkgs...); p != nil { + mains = append(mains, p) + } + } + if mains == nil { + return nil, fmt.Errorf("analysis scope has no main and no tests") + } + return &pointer.Config{ + Log: ptaLog, + Reflection: reflection, + Mains: mains, + }, nil +} + +// importQueryPackage finds the package P containing the +// query position and tells conf to import it. +// It returns the package's path. +func importQueryPackage(pos string, conf *loader.Config) (string, error) { + fqpos, err := fastQueryPos(pos) + if err != nil { + return "", err // bad query + } + filename := fqpos.fset.File(fqpos.start).Name() + + // This will not work for ad-hoc packages + // such as $GOROOT/src/net/http/triv.go. + // TODO(adonovan): ensure we report a clear error. + _, importPath, err := guessImportPath(filename, conf.Build) + if err != nil { + return "", err // can't find GOPATH dir + } + if importPath == "" { + return "", fmt.Errorf("can't guess import path from %s", filename) + } + + // Check that it's possible to load the queried package. + // (e.g. oracle tests contain different 'package' decls in same dir.) + // Keep consistent with logic in loader/util.go! + cfg2 := *conf.Build + cfg2.CgoEnabled = false + bp, err := cfg2.Import(importPath, "", 0) + if err != nil { + return "", err // no files for package + } + + switch pkgContainsFile(bp, filename) { + case 'T': + conf.ImportWithTests(importPath) + case 'X': + conf.ImportWithTests(importPath) + importPath += "_test" // for TypeCheckFuncBodies + case 'G': + conf.Import(importPath) + default: + return "", fmt.Errorf("package %q doesn't contain file %s", + importPath, filename) + } + + conf.TypeCheckFuncBodies = func(p string) bool { return p == importPath } + + return importPath, nil +} + +// pkgContainsFile reports whether file was among the packages Go +// files, Test files, eXternal test files, or not found. +func pkgContainsFile(bp *build.Package, filename string) byte { + for i, files := range [][]string{bp.GoFiles, bp.TestGoFiles, bp.XTestGoFiles} { + for _, file := range files { + if sameFile(filepath.Join(bp.Dir, file), filename) { + return "GTX"[i] + } + } + } + return 0 // not found +} + +// ParseQueryPos parses the source query position pos and returns the +// AST node of the loaded program lprog that it identifies. +// If needExact, it must identify a single AST subtree; +// this is appropriate for queries that allow fairly arbitrary syntax, +// e.g. "describe". +// +func parseQueryPos(lprog *loader.Program, posFlag string, needExact bool) (*queryPos, error) { + filename, startOffset, endOffset, err := parsePosFlag(posFlag) + if err != nil { + return nil, err + } + start, end, err := findQueryPos(lprog.Fset, filename, startOffset, endOffset) + if err != nil { + return nil, err + } + info, path, exact := lprog.PathEnclosingInterval(start, end) + if path == nil { + return nil, fmt.Errorf("no syntax here") + } + if needExact && !exact { + return nil, fmt.Errorf("ambiguous selection within %s", astutil.NodeDescription(path[0])) + } + return &queryPos{lprog.Fset, start, end, path, exact, info}, nil +} + +// ---------- Utilities ---------- + +// allowErrors causes type errors to be silently ignored. +// (Not suitable if SSA construction follows.) +func allowErrors(lconf *loader.Config) { + ctxt := *lconf.Build // copy + ctxt.CgoEnabled = false + lconf.Build = &ctxt + lconf.AllowErrors = true + // AllErrors makes the parser always return an AST instead of + // bailing out after 10 errors and returning an empty ast.File. + lconf.ParserMode = parser.AllErrors + lconf.TypeChecker.Error = func(err error) {} +} + +// ptrAnalysis runs the pointer analysis and returns its result. +func ptrAnalysis(conf *pointer.Config) *pointer.Result { + result, err := pointer.Analyze(conf) + if err != nil { + panic(err) // pointer analysis internal error + } + return result +} + +func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) } + +// deref returns a pointer's element type; otherwise it returns typ. +func deref(typ types.Type) types.Type { + if p, ok := typ.Underlying().(*types.Pointer); ok { + return p.Elem() + } + return typ +} + +// fprintf prints to w a message of the form "location: message\n" +// where location is derived from pos. +// +// pos must be one of: +// - a token.Pos, denoting a position +// - an ast.Node, denoting an interval +// - anything with a Pos() method: +// ssa.Member, ssa.Value, ssa.Instruction, types.Object, pointer.Label, etc. +// - a QueryPos, denoting the extent of the user's query. +// - nil, meaning no position at all. +// +// The output format is is compatible with the 'gnu' +// compilation-error-regexp in Emacs' compilation mode. +// TODO(adonovan): support other editors. +// +func fprintf(w io.Writer, fset *token.FileSet, pos interface{}, format string, args ...interface{}) { + var start, end token.Pos + switch pos := pos.(type) { + case ast.Node: + start = pos.Pos() + end = pos.End() + case token.Pos: + start = pos + end = start + case interface { + Pos() token.Pos + }: + start = pos.Pos() + end = start + case *queryPos: + start = pos.start + end = pos.end + case nil: + // no-op + default: + panic(fmt.Sprintf("invalid pos: %T", pos)) + } + + if sp := fset.Position(start); start == end { + // (prints "-: " for token.NoPos) + fmt.Fprintf(w, "%s: ", sp) + } else { + ep := fset.Position(end) + // The -1 below is a concession to Emacs's broken use of + // inclusive (not half-open) intervals. + // Other editors may not want it. + // TODO(adonovan): add an -editor=vim|emacs|acme|auto + // flag; auto uses EMACS=t / VIM=... / etc env vars. + fmt.Fprintf(w, "%s:%d.%d-%d.%d: ", + sp.Filename, sp.Line, sp.Column, ep.Line, ep.Column-1) + } + fmt.Fprintf(w, format, args...) + io.WriteString(w, "\n") +} diff --git a/vendor/golang.org/x/tools/oracle/oracle_test.go b/vendor/golang.org/x/tools/oracle/oracle_test.go new file mode 100644 index 0000000000..0dd1cdcdbe --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/oracle_test.go @@ -0,0 +1,272 @@ +// Copyright 2013 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 oracle_test + +// This file defines a test framework for oracle queries. +// +// The files beneath testdata/src/main contain Go programs containing +// query annotations of the form: +// +// @verb id "select" +// +// where verb is the query mode (e.g. "callers"), id is a unique name +// for this query, and "select" is a regular expression matching the +// substring of the current line that is the query's input selection. +// +// The expected output for each query is provided in the accompanying +// .golden file. +// +// (Location information is not included because it's too fragile to +// display as text. TODO(adonovan): think about how we can test its +// correctness, since it is critical information.) +// +// Run this test with: +// % go test golang.org/x/tools/oracle -update +// to update the golden files. + +import ( + "bytes" + "encoding/json" + "flag" + "fmt" + "go/build" + "go/parser" + "go/token" + "io" + "io/ioutil" + "os" + "os/exec" + "regexp" + "runtime" + "strconv" + "strings" + "testing" + + "golang.org/x/tools/oracle" +) + +var updateFlag = flag.Bool("update", false, "Update the golden files.") + +type query struct { + id string // unique id + verb string // query mode, e.g. "callees" + posn token.Position // position of of query + filename string + queryPos string // value of -pos flag +} + +func parseRegexp(text string) (*regexp.Regexp, error) { + pattern, err := strconv.Unquote(text) + if err != nil { + return nil, fmt.Errorf("can't unquote %s", text) + } + return regexp.Compile(pattern) +} + +// parseQueries parses and returns the queries in the named file. +func parseQueries(t *testing.T, filename string) []*query { + filedata, err := ioutil.ReadFile(filename) + if err != nil { + t.Fatal(err) + } + + // Parse the file once to discover the test queries. + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, filename, filedata, parser.ParseComments) + if err != nil { + t.Fatal(err) + } + + lines := bytes.Split(filedata, []byte("\n")) + + var queries []*query + queriesById := make(map[string]*query) + + // Find all annotations of these forms: + expectRe := regexp.MustCompile(`@([a-z]+)\s+(\S+)\s+(\".*)$`) // @verb id "regexp" + for _, c := range f.Comments { + text := strings.TrimSpace(c.Text()) + if text == "" || text[0] != '@' { + continue + } + posn := fset.Position(c.Pos()) + + // @verb id "regexp" + match := expectRe.FindStringSubmatch(text) + if match == nil { + t.Errorf("%s: ill-formed query: %s", posn, text) + continue + } + + id := match[2] + if prev, ok := queriesById[id]; ok { + t.Errorf("%s: duplicate id %s", posn, id) + t.Errorf("%s: previously used here", prev.posn) + continue + } + + q := &query{ + id: id, + verb: match[1], + filename: filename, + posn: posn, + } + + if match[3] != `"nopos"` { + selectRe, err := parseRegexp(match[3]) + if err != nil { + t.Errorf("%s: %s", posn, err) + continue + } + + // Find text of the current line, sans query. + // (Queries must be // not /**/ comments.) + line := lines[posn.Line-1][:posn.Column-1] + + // Apply regexp to current line to find input selection. + loc := selectRe.FindIndex(line) + if loc == nil { + t.Errorf("%s: selection pattern %s doesn't match line %q", + posn, match[3], string(line)) + continue + } + + // Assumes ASCII. TODO(adonovan): test on UTF-8. + linestart := posn.Offset - (posn.Column - 1) + + // Compute the file offsets. + q.queryPos = fmt.Sprintf("%s:#%d,#%d", + filename, linestart+loc[0], linestart+loc[1]) + } + + queries = append(queries, q) + queriesById[id] = q + } + + // Return the slice, not map, for deterministic iteration. + return queries +} + +// WriteResult writes res (-format=plain) to w, stripping file locations. +func WriteResult(w io.Writer, q *oracle.Query) { + capture := new(bytes.Buffer) // capture standard output + q.WriteTo(capture) + for _, line := range strings.Split(capture.String(), "\n") { + // Remove a "file:line: " prefix. + if i := strings.Index(line, ": "); i >= 0 { + line = line[i+2:] + } + fmt.Fprintf(w, "%s\n", line) + } +} + +// doQuery poses query q to the oracle and writes its response and +// error (if any) to out. +func doQuery(out io.Writer, q *query, useJson bool) { + fmt.Fprintf(out, "-------- @%s %s --------\n", q.verb, q.id) + + var buildContext = build.Default + buildContext.GOPATH = "testdata" + query := oracle.Query{ + Mode: q.verb, + Pos: q.queryPos, + Build: &buildContext, + Scope: []string{q.filename}, + Reflection: true, + } + if err := oracle.Run(&query); err != nil { + fmt.Fprintf(out, "\nError: %s\n", err) + return + } + + if useJson { + // JSON output + b, err := json.MarshalIndent(query.Serial(), "", "\t") + if err != nil { + fmt.Fprintf(out, "JSON error: %s\n", err.Error()) + return + } + out.Write(b) + fmt.Fprintln(out) + } else { + // "plain" (compiler diagnostic format) output + WriteResult(out, &query) + } +} + +func TestOracle(t *testing.T) { + switch runtime.GOOS { + case "android": + t.Skipf("skipping test on %q (no testdata dir)", runtime.GOOS) + case "windows": + t.Skipf("skipping test on %q (no /usr/bin/diff)", runtime.GOOS) + } + + for _, filename := range []string{ + "testdata/src/calls/main.go", + "testdata/src/describe/main.go", + "testdata/src/freevars/main.go", + "testdata/src/implements/main.go", + "testdata/src/implements-methods/main.go", + "testdata/src/imports/main.go", + "testdata/src/peers/main.go", + "testdata/src/pointsto/main.go", + "testdata/src/referrers/main.go", + "testdata/src/reflection/main.go", + "testdata/src/what/main.go", + "testdata/src/whicherrs/main.go", + // JSON: + // TODO(adonovan): most of these are very similar; combine them. + "testdata/src/calls-json/main.go", + "testdata/src/peers-json/main.go", + "testdata/src/describe-json/main.go", + "testdata/src/implements-json/main.go", + "testdata/src/implements-methods-json/main.go", + "testdata/src/pointsto-json/main.go", + "testdata/src/referrers-json/main.go", + "testdata/src/what-json/main.go", + } { + useJson := strings.Contains(filename, "-json/") + queries := parseQueries(t, filename) + golden := filename + "lden" + got := filename + "t" + gotfh, err := os.Create(got) + if err != nil { + t.Errorf("Create(%s) failed: %s", got, err) + continue + } + defer gotfh.Close() + defer os.Remove(got) + + // Run the oracle on each query, redirecting its output + // and error (if any) to the foo.got file. + for _, q := range queries { + doQuery(gotfh, q, useJson) + } + + // Compare foo.got with foo.golden. + var cmd *exec.Cmd + switch runtime.GOOS { + case "plan9": + cmd = exec.Command("/bin/diff", "-c", golden, got) + default: + cmd = exec.Command("/usr/bin/diff", "-u", golden, got) + } + buf := new(bytes.Buffer) + cmd.Stdout = buf + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + t.Errorf("Oracle tests for %s failed: %s.\n%s\n", + filename, err, buf) + + if *updateFlag { + t.Logf("Updating %s...", golden) + if err := exec.Command("/bin/cp", got, golden).Run(); err != nil { + t.Errorf("Update failed: %s", err) + } + } + } + } +} diff --git a/vendor/golang.org/x/tools/oracle/peers.go b/vendor/golang.org/x/tools/oracle/peers.go new file mode 100644 index 0000000000..0564516da1 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/peers.go @@ -0,0 +1,254 @@ +// Copyright 2013 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.5 + +package oracle + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" + "sort" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/oracle/serial" +) + +// peers enumerates, for a given channel send (or receive) operation, +// the set of possible receives (or sends) that correspond to it. +// +// TODO(adonovan): support reflect.{Select,Recv,Send,Close}. +// TODO(adonovan): permit the user to query based on a MakeChan (not send/recv), +// or the implicit receive in "for v := range ch". +func peers(q *Query) error { + lconf := loader.Config{Build: q.Build} + + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug) + + ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection) + if err != nil { + return err + } + + opPos := findOp(qpos) + if opPos == token.NoPos { + return fmt.Errorf("there is no channel operation here") + } + + // Defer SSA construction till after errors are reported. + prog.Build() + + var queryOp chanOp // the originating send or receive operation + var ops []chanOp // all sends/receives of opposite direction + + // Look at all channel operations in the whole ssa.Program. + // Build a list of those of same type as the query. + allFuncs := ssautil.AllFunctions(prog) + for fn := range allFuncs { + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + for _, op := range chanOps(instr) { + ops = append(ops, op) + if op.pos == opPos { + queryOp = op // we found the query op + } + } + } + } + } + if queryOp.ch == nil { + return fmt.Errorf("ssa.Instruction for send/receive not found") + } + + // Discard operations of wrong channel element type. + // Build set of channel ssa.Values as query to pointer analysis. + // We compare channels by element types, not channel types, to + // ignore both directionality and type names. + queryType := queryOp.ch.Type() + queryElemType := queryType.Underlying().(*types.Chan).Elem() + ptaConfig.AddQuery(queryOp.ch) + i := 0 + for _, op := range ops { + if types.Identical(op.ch.Type().Underlying().(*types.Chan).Elem(), queryElemType) { + ptaConfig.AddQuery(op.ch) + ops[i] = op + i++ + } + } + ops = ops[:i] + + // Run the pointer analysis. + ptares := ptrAnalysis(ptaConfig) + + // Find the points-to set. + queryChanPtr := ptares.Queries[queryOp.ch] + + // Ascertain which make(chan) labels the query's channel can alias. + var makes []token.Pos + for _, label := range queryChanPtr.PointsTo().Labels() { + makes = append(makes, label.Pos()) + } + sort.Sort(byPos(makes)) + + // Ascertain which channel operations can alias the same make(chan) labels. + var sends, receives, closes []token.Pos + for _, op := range ops { + if ptr, ok := ptares.Queries[op.ch]; ok && ptr.MayAlias(queryChanPtr) { + switch op.dir { + case types.SendOnly: + sends = append(sends, op.pos) + case types.RecvOnly: + receives = append(receives, op.pos) + case types.SendRecv: + closes = append(closes, op.pos) + } + } + } + sort.Sort(byPos(sends)) + sort.Sort(byPos(receives)) + sort.Sort(byPos(closes)) + + q.result = &peersResult{ + queryPos: opPos, + queryType: queryType, + makes: makes, + sends: sends, + receives: receives, + closes: closes, + } + return nil +} + +// findOp returns the position of the enclosing send/receive/close op. +// For send and receive operations, this is the position of the <- token; +// for close operations, it's the Lparen of the function call. +// +// TODO(adonovan): handle implicit receive operations from 'for...range chan' statements. +func findOp(qpos *queryPos) token.Pos { + for _, n := range qpos.path { + switch n := n.(type) { + case *ast.UnaryExpr: + if n.Op == token.ARROW { + return n.OpPos + } + case *ast.SendStmt: + return n.Arrow + case *ast.CallExpr: + // close function call can only exist as a direct identifier + if close, ok := unparen(n.Fun).(*ast.Ident); ok { + if b, ok := qpos.info.Info.Uses[close].(*types.Builtin); ok && b.Name() == "close" { + return n.Lparen + } + } + } + } + return token.NoPos +} + +// chanOp abstracts an ssa.Send, ssa.Unop(ARROW), or a SelectState. +type chanOp struct { + ch ssa.Value + dir types.ChanDir // SendOnly=send, RecvOnly=recv, SendRecv=close + pos token.Pos +} + +// chanOps returns a slice of all the channel operations in the instruction. +func chanOps(instr ssa.Instruction) []chanOp { + // TODO(adonovan): handle calls to reflect.{Select,Recv,Send,Close} too. + var ops []chanOp + switch instr := instr.(type) { + case *ssa.UnOp: + if instr.Op == token.ARROW { + ops = append(ops, chanOp{instr.X, types.RecvOnly, instr.Pos()}) + } + case *ssa.Send: + ops = append(ops, chanOp{instr.Chan, types.SendOnly, instr.Pos()}) + case *ssa.Select: + for _, st := range instr.States { + ops = append(ops, chanOp{st.Chan, st.Dir, st.Pos}) + } + case ssa.CallInstruction: + cc := instr.Common() + if b, ok := cc.Value.(*ssa.Builtin); ok && b.Name() == "close" { + ops = append(ops, chanOp{cc.Args[0], types.SendRecv, cc.Pos()}) + } + } + return ops +} + +type peersResult struct { + queryPos token.Pos // of queried channel op + queryType types.Type // type of queried channel + makes, sends, receives, closes []token.Pos // positions of aliased makechan/send/receive/close instrs +} + +func (r *peersResult) display(printf printfFunc) { + if len(r.makes) == 0 { + printf(r.queryPos, "This channel can't point to anything.") + return + } + printf(r.queryPos, "This channel of type %s may be:", r.queryType) + for _, alloc := range r.makes { + printf(alloc, "\tallocated here") + } + for _, send := range r.sends { + printf(send, "\tsent to, here") + } + for _, receive := range r.receives { + printf(receive, "\treceived from, here") + } + for _, clos := range r.closes { + printf(clos, "\tclosed, here") + } +} + +func (r *peersResult) toSerial(res *serial.Result, fset *token.FileSet) { + peers := &serial.Peers{ + Pos: fset.Position(r.queryPos).String(), + Type: r.queryType.String(), + } + for _, alloc := range r.makes { + peers.Allocs = append(peers.Allocs, fset.Position(alloc).String()) + } + for _, send := range r.sends { + peers.Sends = append(peers.Sends, fset.Position(send).String()) + } + for _, receive := range r.receives { + peers.Receives = append(peers.Receives, fset.Position(receive).String()) + } + for _, clos := range r.closes { + peers.Closes = append(peers.Closes, fset.Position(clos).String()) + } + res.Peers = peers +} + +// -------- utils -------- + +// NB: byPos is not deterministic across packages since it depends on load order. +// Use lessPos if the tests need it. +type byPos []token.Pos + +func (p byPos) Len() int { return len(p) } +func (p byPos) Less(i, j int) bool { return p[i] < p[j] } +func (p byPos) Swap(i, j int) { p[i], p[j] = p[j], p[i] } diff --git a/vendor/golang.org/x/tools/oracle/peers14.go b/vendor/golang.org/x/tools/oracle/peers14.go new file mode 100644 index 0000000000..9b97cbf2d7 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/peers14.go @@ -0,0 +1,254 @@ +// Copyright 2013 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.5 + +package oracle + +import ( + "fmt" + "go/ast" + "go/token" + "sort" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/go/types" + "golang.org/x/tools/oracle/serial" +) + +// peers enumerates, for a given channel send (or receive) operation, +// the set of possible receives (or sends) that correspond to it. +// +// TODO(adonovan): support reflect.{Select,Recv,Send,Close}. +// TODO(adonovan): permit the user to query based on a MakeChan (not send/recv), +// or the implicit receive in "for v := range ch". +func peers(q *Query) error { + lconf := loader.Config{Build: q.Build} + + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug) + + ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection) + if err != nil { + return err + } + + opPos := findOp(qpos) + if opPos == token.NoPos { + return fmt.Errorf("there is no channel operation here") + } + + // Defer SSA construction till after errors are reported. + prog.Build() + + var queryOp chanOp // the originating send or receive operation + var ops []chanOp // all sends/receives of opposite direction + + // Look at all channel operations in the whole ssa.Program. + // Build a list of those of same type as the query. + allFuncs := ssautil.AllFunctions(prog) + for fn := range allFuncs { + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + for _, op := range chanOps(instr) { + ops = append(ops, op) + if op.pos == opPos { + queryOp = op // we found the query op + } + } + } + } + } + if queryOp.ch == nil { + return fmt.Errorf("ssa.Instruction for send/receive not found") + } + + // Discard operations of wrong channel element type. + // Build set of channel ssa.Values as query to pointer analysis. + // We compare channels by element types, not channel types, to + // ignore both directionality and type names. + queryType := queryOp.ch.Type() + queryElemType := queryType.Underlying().(*types.Chan).Elem() + ptaConfig.AddQuery(queryOp.ch) + i := 0 + for _, op := range ops { + if types.Identical(op.ch.Type().Underlying().(*types.Chan).Elem(), queryElemType) { + ptaConfig.AddQuery(op.ch) + ops[i] = op + i++ + } + } + ops = ops[:i] + + // Run the pointer analysis. + ptares := ptrAnalysis(ptaConfig) + + // Find the points-to set. + queryChanPtr := ptares.Queries[queryOp.ch] + + // Ascertain which make(chan) labels the query's channel can alias. + var makes []token.Pos + for _, label := range queryChanPtr.PointsTo().Labels() { + makes = append(makes, label.Pos()) + } + sort.Sort(byPos(makes)) + + // Ascertain which channel operations can alias the same make(chan) labels. + var sends, receives, closes []token.Pos + for _, op := range ops { + if ptr, ok := ptares.Queries[op.ch]; ok && ptr.MayAlias(queryChanPtr) { + switch op.dir { + case types.SendOnly: + sends = append(sends, op.pos) + case types.RecvOnly: + receives = append(receives, op.pos) + case types.SendRecv: + closes = append(closes, op.pos) + } + } + } + sort.Sort(byPos(sends)) + sort.Sort(byPos(receives)) + sort.Sort(byPos(closes)) + + q.result = &peersResult{ + queryPos: opPos, + queryType: queryType, + makes: makes, + sends: sends, + receives: receives, + closes: closes, + } + return nil +} + +// findOp returns the position of the enclosing send/receive/close op. +// For send and receive operations, this is the position of the <- token; +// for close operations, it's the Lparen of the function call. +// +// TODO(adonovan): handle implicit receive operations from 'for...range chan' statements. +func findOp(qpos *queryPos) token.Pos { + for _, n := range qpos.path { + switch n := n.(type) { + case *ast.UnaryExpr: + if n.Op == token.ARROW { + return n.OpPos + } + case *ast.SendStmt: + return n.Arrow + case *ast.CallExpr: + // close function call can only exist as a direct identifier + if close, ok := unparen(n.Fun).(*ast.Ident); ok { + if b, ok := qpos.info.Info.Uses[close].(*types.Builtin); ok && b.Name() == "close" { + return n.Lparen + } + } + } + } + return token.NoPos +} + +// chanOp abstracts an ssa.Send, ssa.Unop(ARROW), or a SelectState. +type chanOp struct { + ch ssa.Value + dir types.ChanDir // SendOnly=send, RecvOnly=recv, SendRecv=close + pos token.Pos +} + +// chanOps returns a slice of all the channel operations in the instruction. +func chanOps(instr ssa.Instruction) []chanOp { + // TODO(adonovan): handle calls to reflect.{Select,Recv,Send,Close} too. + var ops []chanOp + switch instr := instr.(type) { + case *ssa.UnOp: + if instr.Op == token.ARROW { + ops = append(ops, chanOp{instr.X, types.RecvOnly, instr.Pos()}) + } + case *ssa.Send: + ops = append(ops, chanOp{instr.Chan, types.SendOnly, instr.Pos()}) + case *ssa.Select: + for _, st := range instr.States { + ops = append(ops, chanOp{st.Chan, st.Dir, st.Pos}) + } + case ssa.CallInstruction: + cc := instr.Common() + if b, ok := cc.Value.(*ssa.Builtin); ok && b.Name() == "close" { + ops = append(ops, chanOp{cc.Args[0], types.SendRecv, cc.Pos()}) + } + } + return ops +} + +type peersResult struct { + queryPos token.Pos // of queried channel op + queryType types.Type // type of queried channel + makes, sends, receives, closes []token.Pos // positions of aliased makechan/send/receive/close instrs +} + +func (r *peersResult) display(printf printfFunc) { + if len(r.makes) == 0 { + printf(r.queryPos, "This channel can't point to anything.") + return + } + printf(r.queryPos, "This channel of type %s may be:", r.queryType) + for _, alloc := range r.makes { + printf(alloc, "\tallocated here") + } + for _, send := range r.sends { + printf(send, "\tsent to, here") + } + for _, receive := range r.receives { + printf(receive, "\treceived from, here") + } + for _, clos := range r.closes { + printf(clos, "\tclosed, here") + } +} + +func (r *peersResult) toSerial(res *serial.Result, fset *token.FileSet) { + peers := &serial.Peers{ + Pos: fset.Position(r.queryPos).String(), + Type: r.queryType.String(), + } + for _, alloc := range r.makes { + peers.Allocs = append(peers.Allocs, fset.Position(alloc).String()) + } + for _, send := range r.sends { + peers.Sends = append(peers.Sends, fset.Position(send).String()) + } + for _, receive := range r.receives { + peers.Receives = append(peers.Receives, fset.Position(receive).String()) + } + for _, clos := range r.closes { + peers.Closes = append(peers.Closes, fset.Position(clos).String()) + } + res.Peers = peers +} + +// -------- utils -------- + +// NB: byPos is not deterministic across packages since it depends on load order. +// Use lessPos if the tests need it. +type byPos []token.Pos + +func (p byPos) Len() int { return len(p) } +func (p byPos) Less(i, j int) bool { return p[i] < p[j] } +func (p byPos) Swap(i, j int) { p[i], p[j] = p[j], p[i] } diff --git a/vendor/golang.org/x/tools/oracle/pointsto.go b/vendor/golang.org/x/tools/oracle/pointsto.go new file mode 100644 index 0000000000..9b862f5e5f --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/pointsto.go @@ -0,0 +1,293 @@ +// Copyright 2013 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.5 + +package oracle + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" + "sort" + + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/pointer" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/oracle/serial" +) + +// pointsto runs the pointer analysis on the selected expression, +// and reports its points-to set (for a pointer-like expression) +// or its dynamic types (for an interface, reflect.Value, or +// reflect.Type expression) and their points-to sets. +// +// All printed sets are sorted to ensure determinism. +// +func pointsto(q *Query) error { + lconf := loader.Config{Build: q.Build} + + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, true) // needs exact pos + if err != nil { + return err + } + + prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug) + + ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection) + if err != nil { + return err + } + + path, action := findInterestingNode(qpos.info, qpos.path) + if action != actionExpr { + return fmt.Errorf("pointer analysis wants an expression; got %s", + astutil.NodeDescription(qpos.path[0])) + } + + var expr ast.Expr + var obj types.Object + switch n := path[0].(type) { + case *ast.ValueSpec: + // ambiguous ValueSpec containing multiple names + return fmt.Errorf("multiple value specification") + case *ast.Ident: + obj = qpos.info.ObjectOf(n) + expr = n + case ast.Expr: + expr = n + default: + // TODO(adonovan): is this reachable? + return fmt.Errorf("unexpected AST for expr: %T", n) + } + + // Reject non-pointerlike types (includes all constants---except nil). + // TODO(adonovan): reject nil too. + typ := qpos.info.TypeOf(expr) + if !pointer.CanPoint(typ) { + return fmt.Errorf("pointer analysis wants an expression of reference type; got %s", typ) + } + + // Determine the ssa.Value for the expression. + var value ssa.Value + var isAddr bool + if obj != nil { + // def/ref of func/var object + value, isAddr, err = ssaValueForIdent(prog, qpos.info, obj, path) + } else { + value, isAddr, err = ssaValueForExpr(prog, qpos.info, path) + } + if err != nil { + return err // e.g. trivially dead code + } + + // Defer SSA construction till after errors are reported. + prog.Build() + + // Run the pointer analysis. + ptrs, err := runPTA(ptaConfig, value, isAddr) + if err != nil { + return err // e.g. analytically unreachable + } + + q.result = &pointstoResult{ + qpos: qpos, + typ: typ, + ptrs: ptrs, + } + return nil +} + +// ssaValueForIdent returns the ssa.Value for the ast.Ident whose path +// to the root of the AST is path. isAddr reports whether the +// ssa.Value is the address denoted by the ast.Ident, not its value. +// +func ssaValueForIdent(prog *ssa.Program, qinfo *loader.PackageInfo, obj types.Object, path []ast.Node) (value ssa.Value, isAddr bool, err error) { + switch obj := obj.(type) { + case *types.Var: + pkg := prog.Package(qinfo.Pkg) + pkg.Build() + if v, addr := prog.VarValue(obj, pkg, path); v != nil { + return v, addr, nil + } + return nil, false, fmt.Errorf("can't locate SSA Value for var %s", obj.Name()) + + case *types.Func: + fn := prog.FuncValue(obj) + if fn == nil { + return nil, false, fmt.Errorf("%s is an interface method", obj) + } + // TODO(adonovan): there's no point running PTA on a *Func ident. + // Eliminate this feature. + return fn, false, nil + } + panic(obj) +} + +// ssaValueForExpr returns the ssa.Value of the non-ast.Ident +// expression whose path to the root of the AST is path. +// +func ssaValueForExpr(prog *ssa.Program, qinfo *loader.PackageInfo, path []ast.Node) (value ssa.Value, isAddr bool, err error) { + pkg := prog.Package(qinfo.Pkg) + pkg.SetDebugMode(true) + pkg.Build() + + fn := ssa.EnclosingFunction(pkg, path) + if fn == nil { + return nil, false, fmt.Errorf("no SSA function built for this location (dead code?)") + } + + if v, addr := fn.ValueForExpr(path[0].(ast.Expr)); v != nil { + return v, addr, nil + } + + return nil, false, fmt.Errorf("can't locate SSA Value for expression in %s", fn) +} + +// runPTA runs the pointer analysis of the selected SSA value or address. +func runPTA(conf *pointer.Config, v ssa.Value, isAddr bool) (ptrs []pointerResult, err error) { + T := v.Type() + if isAddr { + conf.AddIndirectQuery(v) + T = deref(T) + } else { + conf.AddQuery(v) + } + ptares := ptrAnalysis(conf) + + var ptr pointer.Pointer + if isAddr { + ptr = ptares.IndirectQueries[v] + } else { + ptr = ptares.Queries[v] + } + if ptr == (pointer.Pointer{}) { + return nil, fmt.Errorf("pointer analysis did not find expression (dead code?)") + } + pts := ptr.PointsTo() + + if pointer.CanHaveDynamicTypes(T) { + // Show concrete types for interface/reflect.Value expression. + if concs := pts.DynamicTypes(); concs.Len() > 0 { + concs.Iterate(func(conc types.Type, pta interface{}) { + labels := pta.(pointer.PointsToSet).Labels() + sort.Sort(byPosAndString(labels)) // to ensure determinism + ptrs = append(ptrs, pointerResult{conc, labels}) + }) + } + } else { + // Show labels for other expressions. + labels := pts.Labels() + sort.Sort(byPosAndString(labels)) // to ensure determinism + ptrs = append(ptrs, pointerResult{T, labels}) + } + sort.Sort(byTypeString(ptrs)) // to ensure determinism + return ptrs, nil +} + +type pointerResult struct { + typ types.Type // type of the pointer (always concrete) + labels []*pointer.Label // set of labels +} + +type pointstoResult struct { + qpos *queryPos + typ types.Type // type of expression + ptrs []pointerResult // pointer info (typ is concrete => len==1) +} + +func (r *pointstoResult) display(printf printfFunc) { + if pointer.CanHaveDynamicTypes(r.typ) { + // Show concrete types for interface, reflect.Type or + // reflect.Value expression. + + if len(r.ptrs) > 0 { + printf(r.qpos, "this %s may contain these dynamic types:", r.qpos.typeString(r.typ)) + for _, ptr := range r.ptrs { + var obj types.Object + if nt, ok := deref(ptr.typ).(*types.Named); ok { + obj = nt.Obj() + } + if len(ptr.labels) > 0 { + printf(obj, "\t%s, may point to:", r.qpos.typeString(ptr.typ)) + printLabels(printf, ptr.labels, "\t\t") + } else { + printf(obj, "\t%s", r.qpos.typeString(ptr.typ)) + } + } + } else { + printf(r.qpos, "this %s cannot contain any dynamic types.", r.typ) + } + } else { + // Show labels for other expressions. + if ptr := r.ptrs[0]; len(ptr.labels) > 0 { + printf(r.qpos, "this %s may point to these objects:", + r.qpos.typeString(r.typ)) + printLabels(printf, ptr.labels, "\t") + } else { + printf(r.qpos, "this %s may not point to anything.", + r.qpos.typeString(r.typ)) + } + } +} + +func (r *pointstoResult) toSerial(res *serial.Result, fset *token.FileSet) { + var pts []serial.PointsTo + for _, ptr := range r.ptrs { + var namePos string + if nt, ok := deref(ptr.typ).(*types.Named); ok { + namePos = fset.Position(nt.Obj().Pos()).String() + } + var labels []serial.PointsToLabel + for _, l := range ptr.labels { + labels = append(labels, serial.PointsToLabel{ + Pos: fset.Position(l.Pos()).String(), + Desc: l.String(), + }) + } + pts = append(pts, serial.PointsTo{ + Type: r.qpos.typeString(ptr.typ), + NamePos: namePos, + Labels: labels, + }) + } + res.PointsTo = pts +} + +type byTypeString []pointerResult + +func (a byTypeString) Len() int { return len(a) } +func (a byTypeString) Less(i, j int) bool { return a[i].typ.String() < a[j].typ.String() } +func (a byTypeString) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type byPosAndString []*pointer.Label + +func (a byPosAndString) Len() int { return len(a) } +func (a byPosAndString) Less(i, j int) bool { + cmp := a[i].Pos() - a[j].Pos() + return cmp < 0 || (cmp == 0 && a[i].String() < a[j].String()) +} +func (a byPosAndString) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +func printLabels(printf printfFunc, labels []*pointer.Label, prefix string) { + // TODO(adonovan): due to context-sensitivity, many of these + // labels may differ only by context, which isn't apparent. + for _, label := range labels { + printf(label, "%s%s", prefix, label) + } +} diff --git a/vendor/golang.org/x/tools/oracle/pointsto14.go b/vendor/golang.org/x/tools/oracle/pointsto14.go new file mode 100644 index 0000000000..1e406199e8 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/pointsto14.go @@ -0,0 +1,293 @@ +// Copyright 2013 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.5 + +package oracle + +import ( + "fmt" + "go/ast" + "go/token" + "sort" + + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/pointer" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/go/types" + "golang.org/x/tools/oracle/serial" +) + +// pointsto runs the pointer analysis on the selected expression, +// and reports its points-to set (for a pointer-like expression) +// or its dynamic types (for an interface, reflect.Value, or +// reflect.Type expression) and their points-to sets. +// +// All printed sets are sorted to ensure determinism. +// +func pointsto(q *Query) error { + lconf := loader.Config{Build: q.Build} + + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, true) // needs exact pos + if err != nil { + return err + } + + prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug) + + ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection) + if err != nil { + return err + } + + path, action := findInterestingNode(qpos.info, qpos.path) + if action != actionExpr { + return fmt.Errorf("pointer analysis wants an expression; got %s", + astutil.NodeDescription(qpos.path[0])) + } + + var expr ast.Expr + var obj types.Object + switch n := path[0].(type) { + case *ast.ValueSpec: + // ambiguous ValueSpec containing multiple names + return fmt.Errorf("multiple value specification") + case *ast.Ident: + obj = qpos.info.ObjectOf(n) + expr = n + case ast.Expr: + expr = n + default: + // TODO(adonovan): is this reachable? + return fmt.Errorf("unexpected AST for expr: %T", n) + } + + // Reject non-pointerlike types (includes all constants---except nil). + // TODO(adonovan): reject nil too. + typ := qpos.info.TypeOf(expr) + if !pointer.CanPoint(typ) { + return fmt.Errorf("pointer analysis wants an expression of reference type; got %s", typ) + } + + // Determine the ssa.Value for the expression. + var value ssa.Value + var isAddr bool + if obj != nil { + // def/ref of func/var object + value, isAddr, err = ssaValueForIdent(prog, qpos.info, obj, path) + } else { + value, isAddr, err = ssaValueForExpr(prog, qpos.info, path) + } + if err != nil { + return err // e.g. trivially dead code + } + + // Defer SSA construction till after errors are reported. + prog.Build() + + // Run the pointer analysis. + ptrs, err := runPTA(ptaConfig, value, isAddr) + if err != nil { + return err // e.g. analytically unreachable + } + + q.result = &pointstoResult{ + qpos: qpos, + typ: typ, + ptrs: ptrs, + } + return nil +} + +// ssaValueForIdent returns the ssa.Value for the ast.Ident whose path +// to the root of the AST is path. isAddr reports whether the +// ssa.Value is the address denoted by the ast.Ident, not its value. +// +func ssaValueForIdent(prog *ssa.Program, qinfo *loader.PackageInfo, obj types.Object, path []ast.Node) (value ssa.Value, isAddr bool, err error) { + switch obj := obj.(type) { + case *types.Var: + pkg := prog.Package(qinfo.Pkg) + pkg.Build() + if v, addr := prog.VarValue(obj, pkg, path); v != nil { + return v, addr, nil + } + return nil, false, fmt.Errorf("can't locate SSA Value for var %s", obj.Name()) + + case *types.Func: + fn := prog.FuncValue(obj) + if fn == nil { + return nil, false, fmt.Errorf("%s is an interface method", obj) + } + // TODO(adonovan): there's no point running PTA on a *Func ident. + // Eliminate this feature. + return fn, false, nil + } + panic(obj) +} + +// ssaValueForExpr returns the ssa.Value of the non-ast.Ident +// expression whose path to the root of the AST is path. +// +func ssaValueForExpr(prog *ssa.Program, qinfo *loader.PackageInfo, path []ast.Node) (value ssa.Value, isAddr bool, err error) { + pkg := prog.Package(qinfo.Pkg) + pkg.SetDebugMode(true) + pkg.Build() + + fn := ssa.EnclosingFunction(pkg, path) + if fn == nil { + return nil, false, fmt.Errorf("no SSA function built for this location (dead code?)") + } + + if v, addr := fn.ValueForExpr(path[0].(ast.Expr)); v != nil { + return v, addr, nil + } + + return nil, false, fmt.Errorf("can't locate SSA Value for expression in %s", fn) +} + +// runPTA runs the pointer analysis of the selected SSA value or address. +func runPTA(conf *pointer.Config, v ssa.Value, isAddr bool) (ptrs []pointerResult, err error) { + T := v.Type() + if isAddr { + conf.AddIndirectQuery(v) + T = deref(T) + } else { + conf.AddQuery(v) + } + ptares := ptrAnalysis(conf) + + var ptr pointer.Pointer + if isAddr { + ptr = ptares.IndirectQueries[v] + } else { + ptr = ptares.Queries[v] + } + if ptr == (pointer.Pointer{}) { + return nil, fmt.Errorf("pointer analysis did not find expression (dead code?)") + } + pts := ptr.PointsTo() + + if pointer.CanHaveDynamicTypes(T) { + // Show concrete types for interface/reflect.Value expression. + if concs := pts.DynamicTypes(); concs.Len() > 0 { + concs.Iterate(func(conc types.Type, pta interface{}) { + labels := pta.(pointer.PointsToSet).Labels() + sort.Sort(byPosAndString(labels)) // to ensure determinism + ptrs = append(ptrs, pointerResult{conc, labels}) + }) + } + } else { + // Show labels for other expressions. + labels := pts.Labels() + sort.Sort(byPosAndString(labels)) // to ensure determinism + ptrs = append(ptrs, pointerResult{T, labels}) + } + sort.Sort(byTypeString(ptrs)) // to ensure determinism + return ptrs, nil +} + +type pointerResult struct { + typ types.Type // type of the pointer (always concrete) + labels []*pointer.Label // set of labels +} + +type pointstoResult struct { + qpos *queryPos + typ types.Type // type of expression + ptrs []pointerResult // pointer info (typ is concrete => len==1) +} + +func (r *pointstoResult) display(printf printfFunc) { + if pointer.CanHaveDynamicTypes(r.typ) { + // Show concrete types for interface, reflect.Type or + // reflect.Value expression. + + if len(r.ptrs) > 0 { + printf(r.qpos, "this %s may contain these dynamic types:", r.qpos.typeString(r.typ)) + for _, ptr := range r.ptrs { + var obj types.Object + if nt, ok := deref(ptr.typ).(*types.Named); ok { + obj = nt.Obj() + } + if len(ptr.labels) > 0 { + printf(obj, "\t%s, may point to:", r.qpos.typeString(ptr.typ)) + printLabels(printf, ptr.labels, "\t\t") + } else { + printf(obj, "\t%s", r.qpos.typeString(ptr.typ)) + } + } + } else { + printf(r.qpos, "this %s cannot contain any dynamic types.", r.typ) + } + } else { + // Show labels for other expressions. + if ptr := r.ptrs[0]; len(ptr.labels) > 0 { + printf(r.qpos, "this %s may point to these objects:", + r.qpos.typeString(r.typ)) + printLabels(printf, ptr.labels, "\t") + } else { + printf(r.qpos, "this %s may not point to anything.", + r.qpos.typeString(r.typ)) + } + } +} + +func (r *pointstoResult) toSerial(res *serial.Result, fset *token.FileSet) { + var pts []serial.PointsTo + for _, ptr := range r.ptrs { + var namePos string + if nt, ok := deref(ptr.typ).(*types.Named); ok { + namePos = fset.Position(nt.Obj().Pos()).String() + } + var labels []serial.PointsToLabel + for _, l := range ptr.labels { + labels = append(labels, serial.PointsToLabel{ + Pos: fset.Position(l.Pos()).String(), + Desc: l.String(), + }) + } + pts = append(pts, serial.PointsTo{ + Type: r.qpos.typeString(ptr.typ), + NamePos: namePos, + Labels: labels, + }) + } + res.PointsTo = pts +} + +type byTypeString []pointerResult + +func (a byTypeString) Len() int { return len(a) } +func (a byTypeString) Less(i, j int) bool { return a[i].typ.String() < a[j].typ.String() } +func (a byTypeString) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type byPosAndString []*pointer.Label + +func (a byPosAndString) Len() int { return len(a) } +func (a byPosAndString) Less(i, j int) bool { + cmp := a[i].Pos() - a[j].Pos() + return cmp < 0 || (cmp == 0 && a[i].String() < a[j].String()) +} +func (a byPosAndString) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +func printLabels(printf printfFunc, labels []*pointer.Label, prefix string) { + // TODO(adonovan): due to context-sensitivity, many of these + // labels may differ only by context, which isn't apparent. + for _, label := range labels { + printf(label, "%s%s", prefix, label) + } +} diff --git a/vendor/golang.org/x/tools/oracle/pos.go b/vendor/golang.org/x/tools/oracle/pos.go new file mode 100644 index 0000000000..3c706f35a7 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/pos.go @@ -0,0 +1,143 @@ +package oracle + +// This file defines utilities for working with file positions. + +import ( + "fmt" + "go/parser" + "go/token" + "os" + "path/filepath" + "strconv" + "strings" + + "golang.org/x/tools/go/ast/astutil" +) + +// parseOctothorpDecimal returns the numeric value if s matches "#%d", +// otherwise -1. +func parseOctothorpDecimal(s string) int { + if s != "" && s[0] == '#' { + if s, err := strconv.ParseInt(s[1:], 10, 32); err == nil { + return int(s) + } + } + return -1 +} + +// parsePosFlag parses a string of the form "file:pos" or +// file:start,end" where pos, start, end match #%d and represent byte +// offsets, and returns its components. +// +// (Numbers without a '#' prefix are reserved for future use, +// e.g. to indicate line/column positions.) +// +func parsePosFlag(posFlag string) (filename string, startOffset, endOffset int, err error) { + if posFlag == "" { + err = fmt.Errorf("no source position specified (-pos flag)") + return + } + + colon := strings.LastIndex(posFlag, ":") + if colon < 0 { + err = fmt.Errorf("invalid source position -pos=%q", posFlag) + return + } + filename, offset := posFlag[:colon], posFlag[colon+1:] + startOffset = -1 + endOffset = -1 + if hyphen := strings.Index(offset, ","); hyphen < 0 { + // e.g. "foo.go:#123" + startOffset = parseOctothorpDecimal(offset) + endOffset = startOffset + } else { + // e.g. "foo.go:#123,#456" + startOffset = parseOctothorpDecimal(offset[:hyphen]) + endOffset = parseOctothorpDecimal(offset[hyphen+1:]) + } + if startOffset < 0 || endOffset < 0 { + err = fmt.Errorf("invalid -pos offset %q", offset) + return + } + return +} + +// findQueryPos searches fset for filename and translates the +// specified file-relative byte offsets into token.Pos form. It +// returns an error if the file was not found or the offsets were out +// of bounds. +// +func findQueryPos(fset *token.FileSet, filename string, startOffset, endOffset int) (start, end token.Pos, err error) { + var file *token.File + fset.Iterate(func(f *token.File) bool { + if sameFile(filename, f.Name()) { + // (f.Name() is absolute) + file = f + return false // done + } + return true // continue + }) + if file == nil { + err = fmt.Errorf("couldn't find file containing position") + return + } + + // Range check [start..end], inclusive of both end-points. + + if 0 <= startOffset && startOffset <= file.Size() { + start = file.Pos(int(startOffset)) + } else { + err = fmt.Errorf("start position is beyond end of file") + return + } + + if 0 <= endOffset && endOffset <= file.Size() { + end = file.Pos(int(endOffset)) + } else { + err = fmt.Errorf("end position is beyond end of file") + return + } + + return +} + +// sameFile returns true if x and y have the same basename and denote +// the same file. +// +func sameFile(x, y string) bool { + if filepath.Base(x) == filepath.Base(y) { // (optimisation) + if xi, err := os.Stat(x); err == nil { + if yi, err := os.Stat(y); err == nil { + return os.SameFile(xi, yi) + } + } + } + return false +} + +// fastQueryPos parses the -pos flag and returns a QueryPos. +// It parses only a single file, and does not run the type checker. +func fastQueryPos(posFlag string) (*queryPos, error) { + filename, startOffset, endOffset, err := parsePosFlag(posFlag) + if err != nil { + return nil, err + } + + fset := token.NewFileSet() + f, err := parser.ParseFile(fset, filename, nil, 0) + if err != nil { + return nil, err + } + + start, end, err := findQueryPos(fset, filename, startOffset, endOffset) + if err != nil { + return nil, err + } + + path, exact := astutil.PathEnclosingInterval(f, start, end) + if path == nil { + return nil, fmt.Errorf("no syntax here") + } + + return &queryPos{fset, start, end, path, exact, nil}, nil +} diff --git a/vendor/golang.org/x/tools/oracle/referrers.go b/vendor/golang.org/x/tools/oracle/referrers.go new file mode 100644 index 0000000000..354540651c --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/referrers.go @@ -0,0 +1,243 @@ +// Copyright 2013 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.5 + +package oracle + +import ( + "bytes" + "fmt" + "go/ast" + "go/token" + "go/types" + "io/ioutil" + "sort" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/oracle/serial" + "golang.org/x/tools/refactor/importgraph" +) + +// Referrers reports all identifiers that resolve to the same object +// as the queried identifier, within any package in the analysis scope. +func referrers(q *Query) error { + lconf := loader.Config{Build: q.Build} + allowErrors(&lconf) + + if _, err := importQueryPackage(q.Pos, &lconf); err != nil { + return err + } + + var id *ast.Ident + var obj types.Object + var lprog *loader.Program + var pass2 bool + var qpos *queryPos + for { + // Load/parse/type-check the program. + var err error + lprog, err = lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err = parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + id, _ = qpos.path[0].(*ast.Ident) + if id == nil { + return fmt.Errorf("no identifier here") + } + + obj = qpos.info.ObjectOf(id) + if obj == nil { + // Happens for y in "switch y := x.(type)", + // the package declaration, + // and unresolved identifiers. + if _, ok := qpos.path[1].(*ast.File); ok { // package decl? + pkg := qpos.info.Pkg + obj = types.NewPkgName(id.Pos(), pkg, pkg.Name(), pkg) + } else { + return fmt.Errorf("no object for identifier: %T", qpos.path[1]) + } + } + + if pass2 { + break + } + + // If the identifier is exported, we must load all packages that + // depend transitively upon the package that defines it. + // Treat PkgNames as exported, even though they're lowercase. + if _, isPkg := obj.(*types.PkgName); !(isPkg || obj.Exported()) { + break // not exported + } + + // Scan the workspace and build the import graph. + // Ignore broken packages. + _, rev, _ := importgraph.Build(q.Build) + + // Re-load the larger program. + // Create a new file set so that ... + // External test packages are never imported, + // so they will never appear in the graph. + // (We must reset the Config here, not just reset the Fset field.) + lconf = loader.Config{ + Fset: token.NewFileSet(), + Build: q.Build, + } + allowErrors(&lconf) + for path := range rev.Search(obj.Pkg().Path()) { + lconf.ImportWithTests(path) + } + pass2 = true + } + + // Iterate over all go/types' Uses facts for the entire program. + var refs []*ast.Ident + for _, info := range lprog.AllPackages { + for id2, obj2 := range info.Uses { + if sameObj(obj, obj2) { + refs = append(refs, id2) + } + } + } + sort.Sort(byNamePos{q.Fset, refs}) + + q.result = &referrersResult{ + qpos: qpos, + query: id, + obj: obj, + refs: refs, + } + return nil +} + +// same reports whether x and y are identical, or both are PkgNames +// that import the same Package. +// +func sameObj(x, y types.Object) bool { + if x == y { + return true + } + if x, ok := x.(*types.PkgName); ok { + if y, ok := y.(*types.PkgName); ok { + return x.Imported() == y.Imported() + } + } + return false +} + +// -------- utils -------- + +// An deterministic ordering for token.Pos that doesn't +// depend on the order in which packages were loaded. +func lessPos(fset *token.FileSet, x, y token.Pos) bool { + fx := fset.File(x) + fy := fset.File(y) + if fx != fy { + return fx.Name() < fy.Name() + } + return x < y +} + +type byNamePos struct { + fset *token.FileSet + ids []*ast.Ident +} + +func (p byNamePos) Len() int { return len(p.ids) } +func (p byNamePos) Swap(i, j int) { p.ids[i], p.ids[j] = p.ids[j], p.ids[i] } +func (p byNamePos) Less(i, j int) bool { + return lessPos(p.fset, p.ids[i].NamePos, p.ids[j].NamePos) +} + +type referrersResult struct { + qpos *queryPos + query *ast.Ident // identifier of query + obj types.Object // object it denotes + refs []*ast.Ident // set of all other references to it +} + +func (r *referrersResult) display(printf printfFunc) { + printf(r.obj, "%d references to %s", len(r.refs), r.qpos.objectString(r.obj)) + + // Show referring lines, like grep. + type fileinfo struct { + refs []*ast.Ident + linenums []int // line number of refs[i] + data chan interface{} // file contents or error + } + var fileinfos []*fileinfo + fileinfosByName := make(map[string]*fileinfo) + + // First pass: start the file reads concurrently. + sema := make(chan struct{}, 20) // counting semaphore to limit I/O concurrency + for _, ref := range r.refs { + posn := r.qpos.fset.Position(ref.Pos()) + fi := fileinfosByName[posn.Filename] + if fi == nil { + fi = &fileinfo{data: make(chan interface{})} + fileinfosByName[posn.Filename] = fi + fileinfos = append(fileinfos, fi) + + // First request for this file: + // start asynchronous read. + go func() { + sema <- struct{}{} // acquire token + content, err := ioutil.ReadFile(posn.Filename) + <-sema // release token + if err != nil { + fi.data <- err + } else { + fi.data <- content + } + }() + } + fi.refs = append(fi.refs, ref) + fi.linenums = append(fi.linenums, posn.Line) + } + + // Second pass: print refs in original order. + // One line may have several refs at different columns. + for _, fi := range fileinfos { + v := <-fi.data // wait for I/O completion + + // Print one item for all refs in a file that could not + // be loaded (perhaps due to //line directives). + if err, ok := v.(error); ok { + var suffix string + if more := len(fi.refs) - 1; more > 0 { + suffix = fmt.Sprintf(" (+ %d more refs in this file)", more) + } + printf(fi.refs[0], "%v%s", err, suffix) + continue + } + + lines := bytes.Split(v.([]byte), []byte("\n")) + for i, ref := range fi.refs { + printf(ref, "%s", lines[fi.linenums[i]-1]) + } + } +} + +// TODO(adonovan): encode extent, not just Pos info, in Serial form. + +func (r *referrersResult) toSerial(res *serial.Result, fset *token.FileSet) { + referrers := &serial.Referrers{ + Pos: fset.Position(r.query.Pos()).String(), + Desc: r.obj.String(), + } + if pos := r.obj.Pos(); pos != token.NoPos { // Package objects have no Pos() + referrers.ObjPos = fset.Position(pos).String() + } + for _, ref := range r.refs { + referrers.Refs = append(referrers.Refs, fset.Position(ref.NamePos).String()) + } + res.Referrers = referrers +} diff --git a/vendor/golang.org/x/tools/oracle/referrers14.go b/vendor/golang.org/x/tools/oracle/referrers14.go new file mode 100644 index 0000000000..17adf023d5 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/referrers14.go @@ -0,0 +1,243 @@ +// Copyright 2013 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.5 + +package oracle + +import ( + "bytes" + "fmt" + "go/ast" + "go/token" + "io/ioutil" + "sort" + + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/types" + "golang.org/x/tools/oracle/serial" + "golang.org/x/tools/refactor/importgraph" +) + +// Referrers reports all identifiers that resolve to the same object +// as the queried identifier, within any package in the analysis scope. +func referrers(q *Query) error { + lconf := loader.Config{Build: q.Build} + allowErrors(&lconf) + + if _, err := importQueryPackage(q.Pos, &lconf); err != nil { + return err + } + + var id *ast.Ident + var obj types.Object + var lprog *loader.Program + var pass2 bool + var qpos *queryPos + for { + // Load/parse/type-check the program. + var err error + lprog, err = lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err = parseQueryPos(lprog, q.Pos, false) + if err != nil { + return err + } + + id, _ = qpos.path[0].(*ast.Ident) + if id == nil { + return fmt.Errorf("no identifier here") + } + + obj = qpos.info.ObjectOf(id) + if obj == nil { + // Happens for y in "switch y := x.(type)", + // the package declaration, + // and unresolved identifiers. + if _, ok := qpos.path[1].(*ast.File); ok { // package decl? + pkg := qpos.info.Pkg + obj = types.NewPkgName(id.Pos(), pkg, pkg.Name(), pkg) + } else { + return fmt.Errorf("no object for identifier: %T", qpos.path[1]) + } + } + + if pass2 { + break + } + + // If the identifier is exported, we must load all packages that + // depend transitively upon the package that defines it. + // Treat PkgNames as exported, even though they're lowercase. + if _, isPkg := obj.(*types.PkgName); !(isPkg || obj.Exported()) { + break // not exported + } + + // Scan the workspace and build the import graph. + // Ignore broken packages. + _, rev, _ := importgraph.Build(q.Build) + + // Re-load the larger program. + // Create a new file set so that ... + // External test packages are never imported, + // so they will never appear in the graph. + // (We must reset the Config here, not just reset the Fset field.) + lconf = loader.Config{ + Fset: token.NewFileSet(), + Build: q.Build, + } + allowErrors(&lconf) + for path := range rev.Search(obj.Pkg().Path()) { + lconf.ImportWithTests(path) + } + pass2 = true + } + + // Iterate over all go/types' Uses facts for the entire program. + var refs []*ast.Ident + for _, info := range lprog.AllPackages { + for id2, obj2 := range info.Uses { + if sameObj(obj, obj2) { + refs = append(refs, id2) + } + } + } + sort.Sort(byNamePos{q.Fset, refs}) + + q.result = &referrersResult{ + qpos: qpos, + query: id, + obj: obj, + refs: refs, + } + return nil +} + +// same reports whether x and y are identical, or both are PkgNames +// that import the same Package. +// +func sameObj(x, y types.Object) bool { + if x == y { + return true + } + if x, ok := x.(*types.PkgName); ok { + if y, ok := y.(*types.PkgName); ok { + return x.Imported() == y.Imported() + } + } + return false +} + +// -------- utils -------- + +// An deterministic ordering for token.Pos that doesn't +// depend on the order in which packages were loaded. +func lessPos(fset *token.FileSet, x, y token.Pos) bool { + fx := fset.File(x) + fy := fset.File(y) + if fx != fy { + return fx.Name() < fy.Name() + } + return x < y +} + +type byNamePos struct { + fset *token.FileSet + ids []*ast.Ident +} + +func (p byNamePos) Len() int { return len(p.ids) } +func (p byNamePos) Swap(i, j int) { p.ids[i], p.ids[j] = p.ids[j], p.ids[i] } +func (p byNamePos) Less(i, j int) bool { + return lessPos(p.fset, p.ids[i].NamePos, p.ids[j].NamePos) +} + +type referrersResult struct { + qpos *queryPos + query *ast.Ident // identifier of query + obj types.Object // object it denotes + refs []*ast.Ident // set of all other references to it +} + +func (r *referrersResult) display(printf printfFunc) { + printf(r.obj, "%d references to %s", len(r.refs), r.qpos.objectString(r.obj)) + + // Show referring lines, like grep. + type fileinfo struct { + refs []*ast.Ident + linenums []int // line number of refs[i] + data chan interface{} // file contents or error + } + var fileinfos []*fileinfo + fileinfosByName := make(map[string]*fileinfo) + + // First pass: start the file reads concurrently. + sema := make(chan struct{}, 20) // counting semaphore to limit I/O concurrency + for _, ref := range r.refs { + posn := r.qpos.fset.Position(ref.Pos()) + fi := fileinfosByName[posn.Filename] + if fi == nil { + fi = &fileinfo{data: make(chan interface{})} + fileinfosByName[posn.Filename] = fi + fileinfos = append(fileinfos, fi) + + // First request for this file: + // start asynchronous read. + go func() { + sema <- struct{}{} // acquire token + content, err := ioutil.ReadFile(posn.Filename) + <-sema // release token + if err != nil { + fi.data <- err + } else { + fi.data <- content + } + }() + } + fi.refs = append(fi.refs, ref) + fi.linenums = append(fi.linenums, posn.Line) + } + + // Second pass: print refs in original order. + // One line may have several refs at different columns. + for _, fi := range fileinfos { + v := <-fi.data // wait for I/O completion + + // Print one item for all refs in a file that could not + // be loaded (perhaps due to //line directives). + if err, ok := v.(error); ok { + var suffix string + if more := len(fi.refs) - 1; more > 0 { + suffix = fmt.Sprintf(" (+ %d more refs in this file)", more) + } + printf(fi.refs[0], "%v%s", err, suffix) + continue + } + + lines := bytes.Split(v.([]byte), []byte("\n")) + for i, ref := range fi.refs { + printf(ref, "%s", lines[fi.linenums[i]-1]) + } + } +} + +// TODO(adonovan): encode extent, not just Pos info, in Serial form. + +func (r *referrersResult) toSerial(res *serial.Result, fset *token.FileSet) { + referrers := &serial.Referrers{ + Pos: fset.Position(r.query.Pos()).String(), + Desc: r.obj.String(), + } + if pos := r.obj.Pos(); pos != token.NoPos { // Package objects have no Pos() + referrers.ObjPos = fset.Position(pos).String() + } + for _, ref := range r.refs { + referrers.Refs = append(referrers.Refs, fset.Position(ref.NamePos).String()) + } + res.Referrers = referrers +} diff --git a/vendor/golang.org/x/tools/oracle/serial/serial.go b/vendor/golang.org/x/tools/oracle/serial/serial.go new file mode 100644 index 0000000000..65f0822a46 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/serial/serial.go @@ -0,0 +1,258 @@ +// Copyright 2013 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 serial defines the oracle's schema for structured data +// serialization using JSON, XML, etc. +package serial + +// All 'pos' strings are of the form "file:line:col". +// TODO(adonovan): improve performance by sharing filename strings. +// TODO(adonovan): improve precision by providing the start/end +// interval when available. +// +// TODO(adonovan): consider richer encodings of types, functions, +// methods, etc. + +// A Peers is the result of a 'peers' query. +// If Allocs is empty, the selected channel can't point to anything. +type Peers struct { + Pos string `json:"pos"` // location of the selected channel op (<-) + Type string `json:"type"` // type of the selected channel + Allocs []string `json:"allocs,omitempty"` // locations of aliased make(chan) ops + Sends []string `json:"sends,omitempty"` // locations of aliased ch<-x ops + Receives []string `json:"receives,omitempty"` // locations of aliased <-ch ops + Closes []string `json:"closes,omitempty"` // locations of aliased close(ch) ops +} + +// A Referrers is the result of a 'referrers' query. +type Referrers struct { + Pos string `json:"pos"` // location of the query reference + ObjPos string `json:"objpos,omitempty"` // location of the definition + Desc string `json:"desc"` // description of the denoted object + Refs []string `json:"refs,omitempty"` // locations of all references +} + +// A Definition is the result of a 'definition' query. +type Definition struct { + ObjPos string `json:"objpos,omitempty"` // location of the definition + Desc string `json:"desc"` // description of the denoted object +} + +type CalleesItem struct { + Name string `json:"name"` // full name of called function + Pos string `json:"pos"` // location of called function +} + +// A Callees is the result of a 'callees' query. +// +// Callees is nonempty unless the call was a dynamic call on a +// provably nil func or interface value. +type Callees struct { + Pos string `json:"pos"` // location of selected call site + Desc string `json:"desc"` // description of call site + Callees []*CalleesItem `json:"callees,omitempty"` // set of possible call targets +} + +// A Caller is one element of the slice returned by a 'callers' query. +// (Callstack also contains a similar slice.) +// +// The root of the callgraph has an unspecified "Caller" string. +type Caller struct { + Pos string `json:"pos,omitempty"` // location of the calling function + Desc string `json:"desc"` // description of call site + Caller string `json:"caller"` // full name of calling function +} + +// A CallStack is the result of a 'callstack' query. +// It indicates an arbitrary path from the root of the callgraph to +// the query function. +// +// If the Callers slice is empty, the function was unreachable in this +// analysis scope. +type CallStack struct { + Pos string `json:"pos"` // location of the selected function + Target string `json:"target"` // the selected function + Callers []Caller `json:"callers"` // enclosing calls, innermost first. +} + +// A FreeVar is one element of the slice returned by a 'freevars' +// query. Each one identifies an expression referencing a local +// identifier defined outside the selected region. +type FreeVar struct { + Pos string `json:"pos"` // location of the identifier's definition + Kind string `json:"kind"` // one of {var,func,type,const,label} + Ref string `json:"ref"` // referring expression (e.g. "x" or "x.y.z") + Type string `json:"type"` // type of the expression +} + +// An Implements contains the result of an 'implements' query. +// It describes the queried type, the set of named non-empty interface +// types to which it is assignable, and the set of named/*named types +// (concrete or non-empty interface) which may be assigned to it. +// +type Implements struct { + T ImplementsType `json:"type,omitempty"` // the queried type + AssignableTo []ImplementsType `json:"to,omitempty"` // types assignable to T + AssignableFrom []ImplementsType `json:"from,omitempty"` // interface types assignable from T + AssignableFromPtr []ImplementsType `json:"fromptr,omitempty"` // interface types assignable only from *T + + // The following fields are set only if the query was a method. + // Assignable{To,From,FromPtr}Method[i] is the corresponding + // method of type Assignable{To,From,FromPtr}[i], or blank + // {"",""} if that type lacks the method. + Method *DescribeMethod `json:"method,omitempty"` // the queried method + AssignableToMethod []DescribeMethod `json:"to_method,omitempty"` + AssignableFromMethod []DescribeMethod `json:"from_method,omitempty"` + AssignableFromPtrMethod []DescribeMethod `json:"fromptr_method,omitempty"` +} + +// An ImplementsType describes a single type as part of an 'implements' query. +type ImplementsType struct { + Name string `json:"name"` // full name of the type + Pos string `json:"pos"` // location of its definition + Kind string `json:"kind"` // "basic", "array", etc +} + +// A SyntaxNode is one element of a stack of enclosing syntax nodes in +// a "what" query. +type SyntaxNode struct { + Description string `json:"desc"` // description of syntax tree + Start int `json:"start"` // start byte offset, 0-based + End int `json:"end"` // end byte offset +} + +// A What is the result of the "what" query, which quickly identifies +// the selection, parsing only a single file. It is intended for use +// in low-latency GUIs. +type What struct { + Enclosing []SyntaxNode `json:"enclosing"` // enclosing nodes of syntax tree + Modes []string `json:"modes"` // query modes enabled for this selection. + SrcDir string `json:"srcdir,omitempty"` // $GOROOT src directory containing queried package + ImportPath string `json:"importpath,omitempty"` // import path of queried package +} + +// A PointsToLabel describes a pointer analysis label. +// +// A "label" is an object that may be pointed to by a pointer, map, +// channel, 'func', slice or interface. Labels include: +// - functions +// - globals +// - arrays created by literals (e.g. []byte("foo")) and conversions ([]byte(s)) +// - stack- and heap-allocated variables (including composite literals) +// - arrays allocated by append() +// - channels, maps and arrays created by make() +// - and their subelements, e.g. "alloc.y[*].z" +// +type PointsToLabel struct { + Pos string `json:"pos"` // location of syntax that allocated the object + Desc string `json:"desc"` // description of the label +} + +// A PointsTo is one element of the result of a 'pointsto' query on an +// expression. It describes a single pointer: its type and the set of +// "labels" it points to. +// +// If the pointer is of interface type, it will have one PTS entry +// describing each concrete type that it may contain. For each +// concrete type that is a pointer, the PTS entry describes the labels +// it may point to. The same is true for reflect.Values, except the +// dynamic types needn't be concrete. +// +type PointsTo struct { + Type string `json:"type"` // (concrete) type of the pointer + NamePos string `json:"namepos,omitempty"` // location of type defn, if Named + Labels []PointsToLabel `json:"labels,omitempty"` // pointed-to objects +} + +// A DescribeValue is the additional result of a 'describe' query +// if the selection indicates a value or expression. +type DescribeValue struct { + Type string `json:"type"` // type of the expression + Value string `json:"value,omitempty"` // value of the expression, if constant + ObjPos string `json:"objpos,omitempty"` // location of the definition, if an Ident +} + +type DescribeMethod struct { + Name string `json:"name"` // method name, as defined by types.Selection.String() + Pos string `json:"pos"` // location of the method's definition +} + +// A DescribeType is the additional result of a 'describe' query +// if the selection indicates a type. +type DescribeType struct { + Type string `json:"type"` // the string form of the type + NamePos string `json:"namepos,omitempty"` // location of definition of type, if named + NameDef string `json:"namedef,omitempty"` // underlying definition of type, if named + Methods []DescribeMethod `json:"methods,omitempty"` // methods of the type +} + +type DescribeMember struct { + Name string `json:"name"` // name of member + Type string `json:"type,omitempty"` // type of member (underlying, if 'type') + Value string `json:"value,omitempty"` // value of member (if 'const') + Pos string `json:"pos"` // location of definition of member + Kind string `json:"kind"` // one of {var,const,func,type} + Methods []DescribeMethod `json:"methods,omitempty"` // methods (if member is a type) +} + +// A DescribePackage is the additional result of a 'describe' if +// the selection indicates a package. +type DescribePackage struct { + Path string `json:"path"` // import path of the package + Members []*DescribeMember `json:"members,omitempty"` // accessible members of the package +} + +// A Describe is the result of a 'describe' query. +// It may contain an element describing the selected semantic entity +// in detail. +type Describe struct { + Desc string `json:"desc"` // description of the selected syntax node + Pos string `json:"pos"` // location of the selected syntax node + Detail string `json:"detail,omitempty"` // one of {package, type, value}, or "". + + // At most one of the following fields is populated: + // the one specified by 'detail'. + Package *DescribePackage `json:"package,omitempty"` + Type *DescribeType `json:"type,omitempty"` + Value *DescribeValue `json:"value,omitempty"` +} + +// A WhichErrs is the result of a 'whicherrs' query. +// It contains the position of the queried error and the possible globals, +// constants, and types it may point to. +type WhichErrs struct { + ErrPos string `json:"errpos,omitempty"` // location of queried error + Globals []string `json:"globals,omitempty"` // locations of globals + Constants []string `json:"constants,omitempty"` // locations of constants + Types []WhichErrsType `json:"types,omitempty"` // Types +} + +type WhichErrsType struct { + Type string `json:"type,omitempty"` + Position string `json:"position,omitempty"` +} + +// A Result is the common result of any oracle query. +// It contains a query-specific result element. +// +// TODO(adonovan): perhaps include other info such as: analysis scope, +// raw query position, stack of ast nodes, query package, etc. +type Result struct { + Mode string `json:"mode"` // mode of the query + + // Exactly one of the following fields is populated: + // the one specified by 'mode'. + Callees *Callees `json:"callees,omitempty"` + Callers []Caller `json:"callers,omitempty"` + Callstack *CallStack `json:"callstack,omitempty"` + Definition *Definition `json:"definition,omitempty"` + Describe *Describe `json:"describe,omitempty"` + Freevars []*FreeVar `json:"freevars,omitempty"` + Implements *Implements `json:"implements,omitempty"` + Peers *Peers `json:"peers,omitempty"` + PointsTo []PointsTo `json:"pointsto,omitempty"` + Referrers *Referrers `json:"referrers,omitempty"` + What *What `json:"what,omitempty"` + WhichErrs *WhichErrs `json:"whicherrs,omitempty"` +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/calls-json/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/calls-json/main.go new file mode 100644 index 0000000000..1c7a6c998a --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/calls-json/main.go @@ -0,0 +1,16 @@ +package main + +// Tests of call-graph queries, -format=json. +// See go.tools/oracle/oracle_test.go for explanation. +// See calls-json.golden for expected query results. + +func call(f func()) { + f() // @callees @callees-f "f" +} + +func main() { + call(func() { + // @callers callers-main.anon "^" + // @callstack callstack-main.anon "^" + }) +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/calls-json/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/calls-json/main.golden new file mode 100644 index 0000000000..f5eced6be2 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/calls-json/main.golden @@ -0,0 +1,34 @@ +-------- @callees @callees-f -------- +{ + "mode": "callees", + "callees": { + "pos": "testdata/src/calls-json/main.go:8:3", + "desc": "dynamic function call", + "callees": [ + { + "name": "main.main$1", + "pos": "testdata/src/calls-json/main.go:12:7" + } + ] + } +} +-------- @callstack callstack-main.anon -------- +{ + "mode": "callstack", + "callstack": { + "pos": "testdata/src/calls-json/main.go:12:7", + "target": "main.main$1", + "callers": [ + { + "pos": "testdata/src/calls-json/main.go:8:3", + "desc": "dynamic function call", + "caller": "main.call" + }, + { + "pos": "testdata/src/calls-json/main.go:12:6", + "desc": "static function call", + "caller": "main.main" + } + ] + } +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/calls/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/calls/main.go new file mode 100644 index 0000000000..849fb6edc5 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/calls/main.go @@ -0,0 +1,129 @@ +package main + +import ( + "fmt" +) + +// Tests of call-graph queries. +// See go.tools/oracle/oracle_test.go for explanation. +// See calls.golden for expected query results. + +func A(x *int) { // @pointsto pointsto-A-x "x" + // @callers callers-A "^" + // @callstack callstack-A "^" +} + +func B(x *int) { // @pointsto pointsto-B-x "x" + // @callers callers-B "^" +} + +func foo() { +} + +// apply is not (yet) treated context-sensitively. +func apply(f func(x *int), x *int) { + f(x) // @callees callees-apply "f" + // @callers callers-apply "^" +} + +// store *is* treated context-sensitively, +// so the points-to sets for pc, pd are precise. +func store(ptr **int, value *int) { + *ptr = value + // @callers callers-store "^" +} + +func call(f func() *int) { + // Result points to anon function. + f() // @pointsto pointsto-result-f "f" + + // Target of call is anon function. + f() // @callees callees-main.call-f "f" + + // @callers callers-main.call "^" +} + +func main() { + var a, b int + go apply(A, &a) // @callees callees-main-apply1 "app" + defer apply(B, &b) + + var c, d int + var pc, pd *int // @pointsto pointsto-pc "pc" + store(&pc, &c) + store(&pd, &d) + _ = pd // @pointsto pointsto-pd "pd" + + call(func() *int { + // We are called twice from main.call + // @callers callers-main.anon "^" + return &a + }) + + // Errors + _ = "no function call here" // @callees callees-err-no-call "no" + print("builtin") // @callees callees-err-builtin "builtin" + _ = string("type conversion") // @callees callees-err-conversion "str" + call(nil) // @callees callees-err-bad-selection "call\\(nil" + if false { + main() // @callees callees-err-deadcode1 "main" + } + var nilFunc func() + nilFunc() // @callees callees-err-nil-func "nilFunc" + var i interface { + f() + } + i.f() // @callees callees-err-nil-interface "i.f" + + i = new(myint) + i.f() // @callees callees-not-a-wrapper "f" + + // statically dispatched calls. Handled specially by callees, so test that they work. + foo() // @callees callees-static-call "foo" + fmt.Println() // @callees callees-qualified-call "Println" + m := new(method) + m.f() // @callees callees-static-method-call "f" + g := new(embeddedIface) + g.iface = m + g.f() // @callees callees-implicit-selection-method-call "f" +} + +type myint int + +func (myint) f() { + // @callers callers-not-a-wrapper "^" +} + +type method int + +func (method) f() { +} + +type embeddedIface struct { + iface +} + +type iface interface { + f() +} + +var dynamic = func() {} + +func deadcode() { + main() // @callees callees-err-deadcode2 "main" + // @callers callers-err-deadcode "^" + // @callstack callstack-err-deadcode "^" + + // Within dead code, dynamic calls have no callees. + dynamic() // @callees callees-err-deadcode3 "dynamic" +} + +// This code belongs to init. +var global = 123 // @callers callers-global "global" + +// The package initializer may be called by other packages' inits, or +// in this case, the root of the callgraph. The source-level init functions +// are in turn called by it. +func init() { + // @callstack callstack-init "^" +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/calls/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/calls/main.golden new file mode 100644 index 0000000000..9159cd60ec --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/calls/main.golden @@ -0,0 +1,125 @@ +-------- @pointsto pointsto-A-x -------- +this *int may point to these objects: + a + b + +-------- @callstack callstack-A -------- +Found a call path from root to main.A +main.A +dynamic function call from main.apply +concurrent static function call from main.main + +-------- @pointsto pointsto-B-x -------- +this *int may point to these objects: + a + b + +-------- @callers callers-B -------- +main.B is called from these 1 sites: + dynamic function call from main.apply + +-------- @callees callees-apply -------- +this dynamic function call dispatches to: + main.A + main.B + +-------- @callers callers-apply -------- +main.apply is called from these 2 sites: + concurrent static function call from main.main + deferred static function call from main.main + +-------- @callers callers-store -------- +main.store is called from these 2 sites: + static function call from main.main + static function call from main.main + +-------- @pointsto pointsto-result-f -------- +this func() *int may point to these objects: + main.main$1 + +-------- @callees callees-main.call-f -------- +this dynamic function call dispatches to: + main.main$1 + +-------- @callers callers-main.call -------- +main.call is called from these 2 sites: + static function call from main.main + static function call from main.main + +-------- @callees callees-main-apply1 -------- +this static function call dispatches to: + main.apply + +-------- @pointsto pointsto-pc -------- +this *int may point to these objects: + c + +-------- @pointsto pointsto-pd -------- +this *int may point to these objects: + d + +-------- @callees callees-err-no-call -------- + +Error: there is no function call here +-------- @callees callees-err-builtin -------- + +Error: this is a call to the built-in 'print' operator +-------- @callees callees-err-conversion -------- + +Error: this is a type conversion, not a function call +-------- @callees callees-err-bad-selection -------- + +Error: ambiguous selection within function call (or conversion) +-------- @callees callees-err-deadcode1 -------- +this static function call dispatches to: + main.main + +-------- @callees callees-err-nil-func -------- +dynamic function call on nil value + +-------- @callees callees-err-nil-interface -------- +dynamic method call on nil value + +-------- @callees callees-not-a-wrapper -------- +this dynamic method call dispatches to: + (main.myint).f + +-------- @callees callees-static-call -------- +this static function call dispatches to: + main.foo + +-------- @callees callees-qualified-call -------- +this static function call dispatches to: + fmt.Println + +-------- @callees callees-static-method-call -------- +this static function call dispatches to: + (main.method).f + +-------- @callees callees-implicit-selection-method-call -------- +this dynamic method call dispatches to: + (main.method).f + +-------- @callers callers-not-a-wrapper -------- +(main.myint).f is called from these 1 sites: + dynamic method call from main.main + +-------- @callees callees-err-deadcode2 -------- +this static function call dispatches to: + main.main + +-------- @callstack callstack-err-deadcode -------- +main.deadcode is unreachable in this analysis scope + +-------- @callees callees-err-deadcode3 -------- + +Error: this call site is unreachable in this analysis +-------- @callers callers-global -------- +main.init is called from these 1 sites: +the root of the call graph + +-------- @callstack callstack-init -------- +Found a call path from root to main.init#1 +main.init#1 +static function call from main.init + diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/describe-json/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/describe-json/main.go new file mode 100644 index 0000000000..359c7310f3 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/describe-json/main.go @@ -0,0 +1,29 @@ +package describe // @describe pkgdecl "describe" + +// Tests of 'describe' query, -format=json. +// See go.tools/oracle/oracle_test.go for explanation. +// See describe-json.golden for expected query results. + +func main() { + var s struct{ x [3]int } + p := &s.x[0] // @describe desc-val-p "p" + _ = p + + var i I = C(0) + if i == nil { + i = new(D) + } + print(i) // @describe desc-val-i "\\bi\\b" + + go main() // @describe desc-stmt "go" +} + +type I interface { + f() +} + +type C int // @describe desc-type-C "C" +type D struct{} + +func (c C) f() {} +func (d *D) f() {} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/describe-json/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/describe-json/main.golden new file mode 100644 index 0000000000..9d03661a4d --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/describe-json/main.golden @@ -0,0 +1,111 @@ +-------- @describe pkgdecl -------- +{ + "mode": "describe", + "describe": { + "desc": "definition of package \"describe-json\"", + "pos": "testdata/src/describe-json/main.go:1:9", + "detail": "package", + "package": { + "path": "describe-json", + "members": [ + { + "name": "C", + "type": "int", + "pos": "testdata/src/describe-json/main.go:25:6", + "kind": "type", + "methods": [ + { + "name": "method (C) f()", + "pos": "testdata/src/describe-json/main.go:28:12" + } + ] + }, + { + "name": "D", + "type": "struct{}", + "pos": "testdata/src/describe-json/main.go:26:6", + "kind": "type", + "methods": [ + { + "name": "method (*D) f()", + "pos": "testdata/src/describe-json/main.go:29:13" + } + ] + }, + { + "name": "I", + "type": "interface{f()}", + "pos": "testdata/src/describe-json/main.go:21:6", + "kind": "type", + "methods": [ + { + "name": "method (I) f()", + "pos": "testdata/src/describe-json/main.go:22:2" + } + ] + }, + { + "name": "main", + "type": "func()", + "pos": "testdata/src/describe-json/main.go:7:6", + "kind": "func" + } + ] + } + } +} +-------- @describe desc-val-p -------- +{ + "mode": "describe", + "describe": { + "desc": "identifier", + "pos": "testdata/src/describe-json/main.go:9:2", + "detail": "value", + "value": { + "type": "*int", + "objpos": "testdata/src/describe-json/main.go:9:2" + } + } +} +-------- @describe desc-val-i -------- +{ + "mode": "describe", + "describe": { + "desc": "identifier", + "pos": "testdata/src/describe-json/main.go:16:8", + "detail": "value", + "value": { + "type": "I", + "objpos": "testdata/src/describe-json/main.go:12:6" + } + } +} +-------- @describe desc-stmt -------- +{ + "mode": "describe", + "describe": { + "desc": "go statement", + "pos": "testdata/src/describe-json/main.go:18:2", + "detail": "unknown" + } +} +-------- @describe desc-type-C -------- +{ + "mode": "describe", + "describe": { + "desc": "definition of type C (size 8, align 8)", + "pos": "testdata/src/describe-json/main.go:25:6", + "detail": "type", + "type": { + "type": "C", + "namepos": "testdata/src/describe-json/main.go:25:6", + "namedef": "int", + "methods": [ + { + "name": "method (C) f()", + "pos": "testdata/src/describe-json/main.go:28:12" + } + ] + } + } +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/describe/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/describe/main.go new file mode 100644 index 0000000000..f48d6d0dc1 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/describe/main.go @@ -0,0 +1,96 @@ +package describe // @describe pkgdecl "describe" + +// Tests of 'describe' query. +// See go.tools/oracle/oracle_test.go for explanation. +// See describe.golden for expected query results. + +// TODO(adonovan): more coverage of the (extensive) logic. + +import ( + "nosuchpkg" // @describe badimport1 "nosuchpkg" + nosuchpkg2 "nosuchpkg" // @describe badimport2 "nosuchpkg2" + _ "unsafe" // @describe unsafe "unsafe" +) + +var _ nosuchpkg.T +var _ nosuchpkg2.T + +type cake float64 // @describe type-ref-builtin "float64" + +const c = iota // @describe const-ref-iota "iota" + +const pi = 3.141 // @describe const-def-pi "pi" +const pie = cake(pi) // @describe const-def-pie "pie" +const _ = pi // @describe const-ref-pi "pi" + +var global = new(string) // NB: ssa.Global is indirect, i.e. **string + +func main() { // @describe func-def-main "main" + // func objects + _ = main // @describe func-ref-main "main" + _ = (*C).f // @describe func-ref-*C.f "..C..f" + _ = D.f // @describe func-ref-D.f "D.f" + _ = I.f // @describe func-ref-I.f "I.f" + var d D // @describe type-D "D" + var i I // @describe type-I "I" + _ = d.f // @describe func-ref-d.f "d.f" + _ = i.f // @describe func-ref-i.f "i.f" + + // var objects + anon := func() { + _ = d // @describe ref-lexical-d "d" + } + _ = anon // @describe ref-anon "anon" + _ = global // @describe ref-global "global" + + // SSA affords some local flow sensitivity. + var a, b int + var x = &a // @describe var-def-x-1 "x" + _ = x // @describe var-ref-x-1 "x" + x = &b // @describe var-def-x-2 "x" + _ = x // @describe var-ref-x-2 "x" + + i = new(C) // @describe var-ref-i-C "i" + if i != nil { + i = D{} // @describe var-ref-i-D "i" + } + print(i) // @describe var-ref-i "\\bi\\b" + + // const objects + const localpi = 3.141 // @describe const-local-pi "localpi" + const localpie = cake(pi) // @describe const-local-pie "localpie" + const _ = localpi // @describe const-ref-localpi "localpi" + + // type objects + type T int // @describe type-def-T "T" + var three T = 3 // @describe type-ref-T "T" + _ = three + + print(1 + 2*3) // @describe const-expr " 2.3" + print(real(1+2i) - 3) // @describe const-expr2 "real.*3" + + m := map[string]*int{"a": &a} + mapval, _ := m["a"] // @describe map-lookup,ok "m..a.." + _ = mapval // @describe mapval "mapval" + _ = m // @describe m "m" + + defer main() // @describe defer-stmt "defer" + go main() // @describe go-stmt "go" + + panic(3) // @describe builtin-ref-panic "panic" + + var a2 int // @describe var-decl-stmt "var a2 int" + _ = a2 + var _ int // @describe var-decl-stmt2 "var _ int" + var _ int // @describe var-def-blank "_" +} + +type I interface { // @describe def-iface-I "I" + f() // @describe def-imethod-I.f "f" +} + +type C int +type D struct{} + +func (c *C) f() {} +func (d D) f() {} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/describe/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/describe/main.golden new file mode 100644 index 0000000000..bc6d9f7038 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/describe/main.golden @@ -0,0 +1,184 @@ +-------- @describe pkgdecl -------- +definition of package "describe" + type C int + method (*C) f() + type D struct{} + method (D) f() + type I interface{f()} + method (I) f() + const c untyped int = 0 + type cake float64 + var global *string + func main func() + const pi untyped float = 3.141 + const pie cake = 3.141 + +-------- @describe badimport1 -------- + +Error: can't import package "nosuchpkg" +-------- @describe badimport2 -------- + +Error: can't import package "nosuchpkg" +-------- @describe unsafe -------- +import of package "unsafe" + builtin Alignof + builtin Offsetof + type Pointer unsafe.Pointer + builtin Sizeof + +-------- @describe type-ref-builtin -------- +reference to built-in type float64 + +-------- @describe const-ref-iota -------- +reference to const iota untyped int of constant value 0 + +-------- @describe const-def-pi -------- +definition of const pi untyped float + +-------- @describe const-def-pie -------- +definition of const pie cake + +-------- @describe const-ref-pi -------- +reference to const pi untyped float of constant value 3.141 +defined here + +-------- @describe func-def-main -------- +definition of func main() + +-------- @describe func-ref-main -------- +reference to func main() +defined here + +-------- @describe func-ref-*C.f -------- +reference to method func (*C).f() +defined here + +-------- @describe func-ref-D.f -------- +reference to method func (D).f() +defined here + +-------- @describe func-ref-I.f -------- +reference to interface method func (I).f() +defined here + +-------- @describe type-D -------- +reference to type D (size 0, align 1) +defined as struct{} +Method set: + method (D) f() + +-------- @describe type-I -------- +reference to type I (size 16, align 8) +defined as interface{f()} +Method set: + method (I) f() + +-------- @describe func-ref-d.f -------- +reference to method func (D).f() +defined here + +-------- @describe func-ref-i.f -------- +reference to interface method func (I).f() +defined here + +-------- @describe ref-lexical-d -------- +reference to var d D +defined here + +-------- @describe ref-anon -------- +reference to var anon func() +defined here + +-------- @describe ref-global -------- +reference to var global *string +defined here + +-------- @describe var-def-x-1 -------- +definition of var x *int + +-------- @describe var-ref-x-1 -------- +reference to var x *int +defined here + +-------- @describe var-def-x-2 -------- +reference to var x *int +defined here + +-------- @describe var-ref-x-2 -------- +reference to var x *int +defined here + +-------- @describe var-ref-i-C -------- +reference to var i I +defined here + +-------- @describe var-ref-i-D -------- +reference to var i I +defined here + +-------- @describe var-ref-i -------- +reference to var i I +defined here + +-------- @describe const-local-pi -------- +definition of const localpi untyped float + +-------- @describe const-local-pie -------- +definition of const localpie cake + +-------- @describe const-ref-localpi -------- +reference to const localpi untyped float of constant value 3.141 +defined here + +-------- @describe type-def-T -------- +definition of type T (size 8, align 8) +No methods. + +-------- @describe type-ref-T -------- +reference to type T (size 8, align 8) +defined as int +No methods. + +-------- @describe const-expr -------- +binary * operation of constant value 6 + +-------- @describe const-expr2 -------- +binary - operation of constant value -2 + +-------- @describe map-lookup,ok -------- +index expression of type (*int, bool) + +-------- @describe mapval -------- +reference to var mapval *int +defined here + +-------- @describe m -------- +reference to var m map[string]*int +defined here + +-------- @describe defer-stmt -------- +defer statement + +-------- @describe go-stmt -------- +go statement + +-------- @describe builtin-ref-panic -------- +function call (or conversion) of type () + +-------- @describe var-decl-stmt -------- +definition of var a2 int + +-------- @describe var-decl-stmt2 -------- +definition of var _ int + +-------- @describe var-def-blank -------- +definition of var _ int + +-------- @describe def-iface-I -------- +definition of type I (size 16, align 8) +Method set: + method (I) f() + +-------- @describe def-imethod-I.f -------- +definition of interface method func (I).f() + diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/freevars/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/freevars/main.go new file mode 100644 index 0000000000..1ce0ae6b36 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/freevars/main.go @@ -0,0 +1,41 @@ +package main + +// Tests of 'freevars' query. +// See go.tools/oracle/oracle_test.go for explanation. +// See freevars.golden for expected query results. + +// TODO(adonovan): it's hard to test this query in a single line of gofmt'd code. + +type T struct { + a, b int +} + +type S struct { + x int + t T +} + +func f(int) {} + +func main() { + type C int + x := 1 + const exp = 6 + if y := 2; x+y+int(C(3)) != exp { // @freevars fv1 "if.*{" + panic("expected 6") + } + + var s S + + for x, y := range "foo" { + println(s.x + s.t.a + s.t.b + x + int(y)) // @freevars fv2 "print.*y." + } + + f(x) // @freevars fv3 "f.x." + + // TODO(adonovan): enable when go/types supports labels. +loop: // #@freevars fv-def-label "loop:" + for { + break loop // #@freevars fv-ref-label "break loop" + } +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/freevars/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/freevars/main.golden new file mode 100644 index 0000000000..b9eeab21f5 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/freevars/main.golden @@ -0,0 +1,18 @@ +-------- @freevars fv1 -------- +Free identifiers: +type C +const exp int +var x int + +-------- @freevars fv2 -------- +Free identifiers: +var s.t.a int +var s.t.b int +var s.x int +var x int +var y rune + +-------- @freevars fv3 -------- +Free identifiers: +var x int + diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/implements-json/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/implements-json/main.go new file mode 100644 index 0000000000..d5f8102b85 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/implements-json/main.go @@ -0,0 +1,27 @@ +package main + +// Tests of 'implements' query, -output=json. +// See go.tools/oracle/oracle_test.go for explanation. +// See implements.golden for expected query results. + +func main() { +} + +type E interface{} // @implements E "E" + +type F interface { // @implements F "F" + f() +} + +type FG interface { // @implements FG "FG" + f() + g() []int // @implements slice "..int" +} + +type C int // @implements C "C" +type D struct{} + +func (c *C) f() {} // @implements starC ".C" +func (d D) f() {} // @implements D "D" + +func (d *D) g() []int { return nil } // @implements starD ".D" diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/implements-json/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/implements-json/main.golden new file mode 100644 index 0000000000..7e37f9e0f4 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/implements-json/main.golden @@ -0,0 +1,159 @@ +-------- @implements E -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-json.E", + "pos": "testdata/src/implements-json/main.go:10:6", + "kind": "interface" + } + } +} +-------- @implements F -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-json.F", + "pos": "testdata/src/implements-json/main.go:12:6", + "kind": "interface" + }, + "to": [ + { + "name": "*implements-json.C", + "pos": "testdata/src/implements-json/main.go:21:6", + "kind": "pointer" + }, + { + "name": "implements-json.D", + "pos": "testdata/src/implements-json/main.go:22:6", + "kind": "struct" + }, + { + "name": "implements-json.FG", + "pos": "testdata/src/implements-json/main.go:16:6", + "kind": "interface" + } + ] + } +} +-------- @implements FG -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-json.FG", + "pos": "testdata/src/implements-json/main.go:16:6", + "kind": "interface" + }, + "to": [ + { + "name": "*implements-json.D", + "pos": "testdata/src/implements-json/main.go:22:6", + "kind": "pointer" + } + ], + "from": [ + { + "name": "implements-json.F", + "pos": "testdata/src/implements-json/main.go:12:6", + "kind": "interface" + } + ] + } +} +-------- @implements slice -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "[]int", + "pos": "-", + "kind": "slice" + } + } +} +-------- @implements C -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-json.C", + "pos": "testdata/src/implements-json/main.go:21:6", + "kind": "basic" + }, + "fromptr": [ + { + "name": "implements-json.F", + "pos": "testdata/src/implements-json/main.go:12:6", + "kind": "interface" + } + ] + } +} +-------- @implements starC -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "*implements-json.C", + "pos": "testdata/src/implements-json/main.go:21:6", + "kind": "pointer" + }, + "from": [ + { + "name": "implements-json.F", + "pos": "testdata/src/implements-json/main.go:12:6", + "kind": "interface" + } + ] + } +} +-------- @implements D -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-json.D", + "pos": "testdata/src/implements-json/main.go:22:6", + "kind": "struct" + }, + "from": [ + { + "name": "implements-json.F", + "pos": "testdata/src/implements-json/main.go:12:6", + "kind": "interface" + } + ], + "fromptr": [ + { + "name": "implements-json.FG", + "pos": "testdata/src/implements-json/main.go:16:6", + "kind": "interface" + } + ] + } +} +-------- @implements starD -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "*implements-json.D", + "pos": "testdata/src/implements-json/main.go:22:6", + "kind": "pointer" + }, + "from": [ + { + "name": "implements-json.F", + "pos": "testdata/src/implements-json/main.go:12:6", + "kind": "interface" + }, + { + "name": "implements-json.FG", + "pos": "testdata/src/implements-json/main.go:16:6", + "kind": "interface" + } + ] + } +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/implements-methods-json/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/implements-methods-json/main.go new file mode 100644 index 0000000000..6c5bbf454d --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/implements-methods-json/main.go @@ -0,0 +1,37 @@ +package main + +// Tests of 'implements' query applied to methods, -output=json. +// See go.tools/oracle/oracle_test.go for explanation. +// See implements-methods.golden for expected query results. + +import _ "lib" + +func main() { +} + +type F interface { + f() // @implements F.f "f" +} + +type FG interface { + f() // @implements FG.f "f" + g() []int // @implements FG.g "g" +} + +type C int +type D struct{} + +func (c *C) f() {} // @implements *C.f "f" +func (d D) f() {} // @implements D.f "f" + +func (d *D) g() []int { return nil } // @implements *D.g "g" + +type sorter []int + +func (sorter) Len() int { return 0 } // @implements Len "Len" +func (sorter) Less(i, j int) bool { return false } +func (sorter) Swap(i, j int) {} + +type I interface { + Method(*int) *int // @implements I.Method "Method" +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/implements-methods-json/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/implements-methods-json/main.golden new file mode 100644 index 0000000000..831900a588 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/implements-methods-json/main.golden @@ -0,0 +1,312 @@ +-------- @implements F.f -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-methods-json.F", + "pos": "testdata/src/implements-methods-json/main.go:12:6", + "kind": "interface" + }, + "to": [ + { + "name": "*implements-methods-json.C", + "pos": "testdata/src/implements-methods-json/main.go:21:6", + "kind": "pointer" + }, + { + "name": "implements-methods-json.D", + "pos": "testdata/src/implements-methods-json/main.go:22:6", + "kind": "struct" + }, + { + "name": "implements-methods-json.FG", + "pos": "testdata/src/implements-methods-json/main.go:16:6", + "kind": "interface" + } + ], + "method": { + "name": "func (F).f()", + "pos": "testdata/src/implements-methods-json/main.go:13:2" + }, + "to_method": [ + { + "name": "method (*C) f()", + "pos": "testdata/src/implements-methods-json/main.go:24:13" + }, + { + "name": "method (D) f()", + "pos": "testdata/src/implements-methods-json/main.go:25:12" + }, + { + "name": "method (FG) f()", + "pos": "testdata/src/implements-methods-json/main.go:17:2" + } + ] + } +} +-------- @implements FG.f -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-methods-json.FG", + "pos": "testdata/src/implements-methods-json/main.go:16:6", + "kind": "interface" + }, + "to": [ + { + "name": "*implements-methods-json.D", + "pos": "testdata/src/implements-methods-json/main.go:22:6", + "kind": "pointer" + } + ], + "from": [ + { + "name": "implements-methods-json.F", + "pos": "testdata/src/implements-methods-json/main.go:12:6", + "kind": "interface" + } + ], + "method": { + "name": "func (FG).f()", + "pos": "testdata/src/implements-methods-json/main.go:17:2" + }, + "to_method": [ + { + "name": "method (*D) f()", + "pos": "testdata/src/implements-methods-json/main.go:25:12" + } + ], + "from_method": [ + { + "name": "method (F) f()", + "pos": "testdata/src/implements-methods-json/main.go:13:2" + } + ] + } +} +-------- @implements FG.g -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-methods-json.FG", + "pos": "testdata/src/implements-methods-json/main.go:16:6", + "kind": "interface" + }, + "to": [ + { + "name": "*implements-methods-json.D", + "pos": "testdata/src/implements-methods-json/main.go:22:6", + "kind": "pointer" + } + ], + "from": [ + { + "name": "implements-methods-json.F", + "pos": "testdata/src/implements-methods-json/main.go:12:6", + "kind": "interface" + } + ], + "method": { + "name": "func (FG).g() []int", + "pos": "testdata/src/implements-methods-json/main.go:18:2" + }, + "to_method": [ + { + "name": "method (*D) g() []int", + "pos": "testdata/src/implements-methods-json/main.go:27:13" + } + ], + "from_method": [ + { + "name": "", + "pos": "" + } + ] + } +} +-------- @implements *C.f -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "*implements-methods-json.C", + "pos": "testdata/src/implements-methods-json/main.go:21:6", + "kind": "pointer" + }, + "from": [ + { + "name": "implements-methods-json.F", + "pos": "testdata/src/implements-methods-json/main.go:12:6", + "kind": "interface" + } + ], + "method": { + "name": "func (*C).f()", + "pos": "testdata/src/implements-methods-json/main.go:24:13" + }, + "from_method": [ + { + "name": "method (F) f()", + "pos": "testdata/src/implements-methods-json/main.go:13:2" + } + ] + } +} +-------- @implements D.f -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-methods-json.D", + "pos": "testdata/src/implements-methods-json/main.go:22:6", + "kind": "struct" + }, + "from": [ + { + "name": "implements-methods-json.F", + "pos": "testdata/src/implements-methods-json/main.go:12:6", + "kind": "interface" + } + ], + "fromptr": [ + { + "name": "implements-methods-json.FG", + "pos": "testdata/src/implements-methods-json/main.go:16:6", + "kind": "interface" + } + ], + "method": { + "name": "func (D).f()", + "pos": "testdata/src/implements-methods-json/main.go:25:12" + }, + "from_method": [ + { + "name": "method (F) f()", + "pos": "testdata/src/implements-methods-json/main.go:13:2" + } + ], + "fromptr_method": [ + { + "name": "method (FG) f()", + "pos": "testdata/src/implements-methods-json/main.go:17:2" + } + ] + } +} +-------- @implements *D.g -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "*implements-methods-json.D", + "pos": "testdata/src/implements-methods-json/main.go:22:6", + "kind": "pointer" + }, + "from": [ + { + "name": "implements-methods-json.F", + "pos": "testdata/src/implements-methods-json/main.go:12:6", + "kind": "interface" + }, + { + "name": "implements-methods-json.FG", + "pos": "testdata/src/implements-methods-json/main.go:16:6", + "kind": "interface" + } + ], + "method": { + "name": "func (*D).g() []int", + "pos": "testdata/src/implements-methods-json/main.go:27:13" + }, + "from_method": [ + { + "name": "", + "pos": "" + }, + { + "name": "method (FG) g() []int", + "pos": "testdata/src/implements-methods-json/main.go:18:2" + } + ] + } +} +-------- @implements Len -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-methods-json.sorter", + "pos": "testdata/src/implements-methods-json/main.go:29:6", + "kind": "slice" + }, + "from": [ + { + "name": "lib.Sorter", + "pos": "testdata/src/lib/lib.go:16:6", + "kind": "interface" + } + ], + "method": { + "name": "func (sorter).Len() int", + "pos": "testdata/src/implements-methods-json/main.go:31:15" + }, + "from_method": [ + { + "name": "method (lib.Sorter) Len() int", + "pos": "testdata/src/lib/lib.go:17:2" + } + ] + } +} +-------- @implements I.Method -------- +{ + "mode": "implements", + "implements": { + "type": { + "name": "implements-methods-json.I", + "pos": "testdata/src/implements-methods-json/main.go:35:6", + "kind": "interface" + }, + "to": [ + { + "name": "lib.Type", + "pos": "testdata/src/lib/lib.go:3:6", + "kind": "basic" + }, + { + "name": "main.I", + "pos": "testdata/src/implements-methods-json/main.go:35:6", + "kind": "interface" + } + ], + "from": [ + { + "name": "main.I", + "pos": "testdata/src/implements-methods-json/main.go:35:6", + "kind": "interface" + } + ], + "method": { + "name": "func (I).Method(*int) *int", + "pos": "testdata/src/implements-methods-json/main.go:36:2" + }, + "to_method": [ + { + "name": "method (lib.Type) Method(x *int) *int", + "pos": "testdata/src/lib/lib.go:5:13" + }, + { + "name": "method (main.I) Method(*int) *int", + "pos": "testdata/src/implements-methods-json/main.go:36:2" + } + ], + "from_method": [ + { + "name": "method (main.I) Method(*int) *int", + "pos": "testdata/src/implements-methods-json/main.go:36:2" + } + ] + } +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/implements-methods/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/implements-methods/main.go new file mode 100644 index 0000000000..a24854a64e --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/implements-methods/main.go @@ -0,0 +1,37 @@ +package main + +// Tests of 'implements' query applied to methods. +// See go.tools/oracle/oracle_test.go for explanation. +// See implements-methods.golden for expected query results. + +import _ "lib" + +func main() { +} + +type F interface { + f() // @implements F.f "f" +} + +type FG interface { + f() // @implements FG.f "f" + g() []int // @implements FG.g "g" +} + +type C int +type D struct{} + +func (c *C) f() {} // @implements *C.f "f" +func (d D) f() {} // @implements D.f "f" + +func (d *D) g() []int { return nil } // @implements *D.g "g" + +type sorter []int + +func (sorter) Len() int { return 0 } // @implements Len "Len" +func (sorter) Less(i, j int) bool { return false } +func (sorter) Swap(i, j int) {} + +type I interface { + Method(*int) *int // @implements I.Method "Method" +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/implements-methods/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/implements-methods/main.golden new file mode 100644 index 0000000000..227d305cbd --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/implements-methods/main.golden @@ -0,0 +1,39 @@ +-------- @implements F.f -------- +abstract method func (F).f() + is implemented by method (*C).f + is implemented by method (D).f + is implemented by method (FG).f + +-------- @implements FG.f -------- +abstract method func (FG).f() + is implemented by method (*D).f + implements method (F).f + +-------- @implements FG.g -------- +abstract method func (FG).g() []int + is implemented by method (*D).g + +-------- @implements *C.f -------- +concrete method func (*C).f() + implements method (F).f + +-------- @implements D.f -------- +concrete method func (D).f() + implements method (F).f +concrete method func (D).f() + implements method (FG).f + +-------- @implements *D.g -------- +concrete method func (*D).g() []int + implements method (FG).g + +-------- @implements Len -------- +concrete method func (sorter).Len() int + implements method (lib.Sorter).Len + +-------- @implements I.Method -------- +abstract method func (I).Method(*int) *int + is implemented by method (lib.Type).Method + is implemented by method (main.I).Method + implements method (main.I).Method + diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/implements/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/implements/main.go new file mode 100644 index 0000000000..14a2f16f0b --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/implements/main.go @@ -0,0 +1,39 @@ +package main + +// Tests of 'implements' query. +// See go.tools/oracle/oracle_test.go for explanation. +// See implements.golden for expected query results. + +import _ "lib" + +func main() { +} + +type E interface{} // @implements E "E" + +type F interface { // @implements F "F" + f() +} + +type FG interface { // @implements FG "FG" + f() + g() []int // @implements slice "..int" +} + +type C int // @implements C "C" +type D struct{} + +func (c *C) f() {} // @implements starC ".C" +func (d D) f() {} // @implements D "D" + +func (d *D) g() []int { return nil } // @implements starD ".D" + +type sorter []int // @implements sorter "sorter" + +func (sorter) Len() int { return 0 } +func (sorter) Less(i, j int) bool { return false } +func (sorter) Swap(i, j int) {} + +type I interface { // @implements I "I" + Method(*int) *int +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/implements/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/implements/main.golden new file mode 100644 index 0000000000..cb2f2ac57f --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/implements/main.golden @@ -0,0 +1,46 @@ +-------- @implements E -------- +empty interface type E + +-------- @implements F -------- +interface type F + is implemented by pointer type *C + is implemented by struct type D + is implemented by interface type FG + +-------- @implements FG -------- +interface type FG + is implemented by pointer type *D + implements F + +-------- @implements slice -------- +slice type []int implements only interface{} + +-------- @implements C -------- +pointer type *C + implements F + +-------- @implements starC -------- +pointer type *C + implements F + +-------- @implements D -------- +struct type D + implements F +pointer type *D + implements FG + +-------- @implements starD -------- +pointer type *D + implements F + implements FG + +-------- @implements sorter -------- +slice type sorter + implements lib.Sorter + +-------- @implements I -------- +interface type I + is implemented by basic type lib.Type + is implemented by interface type main.I + implements main.I + diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/imports/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/imports/main.go new file mode 100644 index 0000000000..0f616abe71 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/imports/main.go @@ -0,0 +1,29 @@ +package main + +import ( + "hash/fnv" // @describe ref-pkg-import2 "fnv" + "lib" // @describe ref-pkg-import "lib" +) + +// Tests that import another package. (To make the tests run quickly, +// we avoid using imports in all the other tests. Remember, each +// query causes parsing and typechecking of the whole program.) +// +// See go.tools/oracle/oracle_test.go for explanation. +// See imports.golden for expected query results. + +var a int + +func main() { + const c = lib.Const // @describe ref-const "Const" + lib.Func() // @describe ref-func "Func" + lib.Var++ // @describe ref-var "Var" + var t lib.Type // @describe ref-type "Type" + p := t.Method(&a) // @describe ref-method "Method" + + print(*p + 1) // @pointsto p "p " + + var _ lib.Type // @describe ref-pkg "lib" + + fnv.New32() +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/imports/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/imports/main.golden new file mode 100644 index 0000000000..9144210654 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/imports/main.golden @@ -0,0 +1,57 @@ +-------- @describe ref-pkg-import2 -------- +import of package "hash/fnv" + func New32 func() hash.Hash32 + func New32a func() hash.Hash32 + func New64 func() hash.Hash64 + func New64a func() hash.Hash64 + +-------- @describe ref-pkg-import -------- +import of package "lib" + const Const untyped int = 3 + func Func func() + type Sorter interface{...} + method (Sorter) Len() int + method (Sorter) Less(i int, j int) bool + method (Sorter) Swap(i int, j int) + type Type int + method (Type) Method(x *int) *int + var Var int + +-------- @describe ref-const -------- +reference to const lib.Const untyped int +defined here + +-------- @describe ref-func -------- +reference to func lib.Func() +defined here + +-------- @describe ref-var -------- +reference to var lib.Var int +defined here + +-------- @describe ref-type -------- +reference to type lib.Type (size 8, align 8) +defined as int +Method set: + method (lib.Type) Method(x *int) *int + +-------- @describe ref-method -------- +reference to method func (lib.Type).Method(x *int) *int +defined here + +-------- @pointsto p -------- +this *int may point to these objects: + main.a + +-------- @describe ref-pkg -------- +reference to package "lib" + const Const untyped int = 3 + func Func func() + type Sorter interface{...} + method (Sorter) Len() int + method (Sorter) Less(i int, j int) bool + method (Sorter) Swap(i int, j int) + type Type int + method (Type) Method(x *int) *int + var Var int + diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/lib/lib.go b/vendor/golang.org/x/tools/oracle/testdata/src/lib/lib.go new file mode 100644 index 0000000000..9131c27474 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/lib/lib.go @@ -0,0 +1,20 @@ +package lib + +type Type int + +func (Type) Method(x *int) *int { + return x +} + +func Func() { +} + +const Const = 3 + +var Var = 0 + +type Sorter interface { + Len() int + Less(i, j int) bool + Swap(i, j int) +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/main/multi.go b/vendor/golang.org/x/tools/oracle/testdata/src/main/multi.go new file mode 100644 index 0000000000..8c650cd289 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/main/multi.go @@ -0,0 +1,13 @@ +package main + +func g(x int) { +} + +func f() { + x := 1 + g(x) // "g(x)" is the selection for multiple queries +} + +func main() { + f() +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/peers-json/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/peers-json/main.go new file mode 100644 index 0000000000..1df550be47 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/peers-json/main.go @@ -0,0 +1,13 @@ +package main + +// Tests of channel 'peers' query, -format=json. +// See go.tools/oracle/oracle_test.go for explanation. +// See peers-json.golden for expected query results. + +func main() { + chA := make(chan *int) + <-chA + select { + case <-chA: // @peers peer-recv-chA "<-" + } +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/peers-json/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/peers-json/main.golden new file mode 100644 index 0000000000..8c2d06c72b --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/peers-json/main.golden @@ -0,0 +1,15 @@ +-------- @peers peer-recv-chA -------- +{ + "mode": "peers", + "peers": { + "pos": "testdata/src/peers-json/main.go:11:7", + "type": "chan *int", + "allocs": [ + "testdata/src/peers-json/main.go:8:13" + ], + "receives": [ + "testdata/src/peers-json/main.go:9:2", + "testdata/src/peers-json/main.go:11:7" + ] + } +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/peers/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/peers/main.go new file mode 100644 index 0000000000..a4cf91b888 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/peers/main.go @@ -0,0 +1,52 @@ +package main + +// Tests of channel 'peers' query. +// See go.tools/oracle/oracle_test.go for explanation. +// See peers.golden for expected query results. + +var a2 int + +func main() { + chA := make(chan *int) + a1 := 1 + chA <- &a1 + + chA2 := make(chan *int, 2) + if a2 == 0 { + chA = chA2 + } + + chB := make(chan *int) + b := 3 + chB <- &b + + <-chA // @pointsto pointsto-chA "chA" + <-chA2 // @pointsto pointsto-chA2 "chA2" + <-chB // @pointsto pointsto-chB "chB" + + select { + case rA := <-chA: // @peers peer-recv-chA "<-" + _ = rA // @pointsto pointsto-rA "rA" + case rB := <-chB: // @peers peer-recv-chB "<-" + _ = rB // @pointsto pointsto-rB "rB" + + case <-chA: // @peers peer-recv-chA' "<-" + + case chA2 <- &a2: // @peers peer-send-chA' "<-" + } + + for _ = range chA { + } + + close(chA) // @peers peer-close-chA "chA" + + chC := make(chan *int) + (close)(chC) // @peers peer-close-chC "chC" + + close := func(ch chan *int) chan *int { + return ch + } + + close(chC) <- &b // @peers peer-send-chC "chC" + <-close(chC) // @peers peer-recv-chC "chC" +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/peers/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/peers/main.golden new file mode 100644 index 0000000000..597a3c6c86 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/peers/main.golden @@ -0,0 +1,100 @@ +-------- @pointsto pointsto-chA -------- +this chan *int may point to these objects: + makechan + makechan + +-------- @pointsto pointsto-chA2 -------- +this chan *int may point to these objects: + makechan + +-------- @pointsto pointsto-chB -------- +this chan *int may point to these objects: + makechan + +-------- @peers peer-recv-chA -------- +This channel of type chan *int may be: + allocated here + allocated here + sent to, here + sent to, here + received from, here + received from, here + received from, here + received from, here + received from, here + closed, here + +-------- @pointsto pointsto-rA -------- +this *int may point to these objects: + main.a2 + a1 + +-------- @peers peer-recv-chB -------- +This channel of type chan *int may be: + allocated here + sent to, here + received from, here + received from, here + +-------- @pointsto pointsto-rB -------- +this *int may point to these objects: + b + +-------- @peers peer-recv-chA' -------- +This channel of type chan *int may be: + allocated here + allocated here + sent to, here + sent to, here + received from, here + received from, here + received from, here + received from, here + received from, here + closed, here + +-------- @peers peer-send-chA' -------- +This channel of type chan *int may be: + allocated here + sent to, here + received from, here + received from, here + received from, here + received from, here + received from, here + closed, here + +-------- @peers peer-close-chA -------- +This channel of type chan *int may be: + allocated here + allocated here + sent to, here + sent to, here + received from, here + received from, here + received from, here + received from, here + received from, here + closed, here + +-------- @peers peer-close-chC -------- +This channel of type chan *int may be: + allocated here + sent to, here + received from, here + closed, here + +-------- @peers peer-send-chC -------- +This channel of type chan *int may be: + allocated here + sent to, here + received from, here + closed, here + +-------- @peers peer-recv-chC -------- +This channel of type chan *int may be: + allocated here + sent to, here + received from, here + closed, here + diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/pointsto-json/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/pointsto-json/main.go new file mode 100644 index 0000000000..38f1148f05 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/pointsto-json/main.go @@ -0,0 +1,27 @@ +package main + +// Tests of 'pointsto' queries, -format=json. +// See go.tools/oracle/oracle_test.go for explanation. +// See pointsto-json.golden for expected query results. + +func main() { // + var s struct{ x [3]int } + p := &s.x[0] // @pointsto val-p "p" + _ = p + + var i I = C(0) + if i == nil { + i = new(D) + } + print(i) // @pointsto val-i "\\bi\\b" +} + +type I interface { + f() +} + +type C int +type D struct{} + +func (c C) f() {} +func (d *D) f() {} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/pointsto-json/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/pointsto-json/main.golden new file mode 100644 index 0000000000..13ac1df9af --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/pointsto-json/main.golden @@ -0,0 +1,35 @@ +-------- @pointsto val-p -------- +{ + "mode": "pointsto", + "pointsto": [ + { + "type": "*int", + "labels": [ + { + "pos": "testdata/src/pointsto-json/main.go:8:6", + "desc": "s.x[*]" + } + ] + } + ] +} +-------- @pointsto val-i -------- +{ + "mode": "pointsto", + "pointsto": [ + { + "type": "*D", + "namepos": "testdata/src/pointsto-json/main.go:24:6", + "labels": [ + { + "pos": "testdata/src/pointsto-json/main.go:14:10", + "desc": "new" + } + ] + }, + { + "type": "C", + "namepos": "testdata/src/pointsto-json/main.go:23:6" + } + ] +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/pointsto/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/pointsto/main.go new file mode 100644 index 0000000000..9064e469a8 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/pointsto/main.go @@ -0,0 +1,75 @@ +package main + +// Tests of 'pointsto' query. +// See go.tools/oracle/oracle_test.go for explanation. +// See pointsto.golden for expected query results. + +const pi = 3.141 // @pointsto const "pi" + +var global = new(string) // NB: ssa.Global is indirect, i.e. **string + +func main() { + livecode() + + // func objects + _ = main // @pointsto func-ref-main "main" + _ = (*C).f // @pointsto func-ref-*C.f "..C..f" + _ = D.f // @pointsto func-ref-D.f "D.f" + _ = I.f // @pointsto func-ref-I.f "I.f" + var d D + var i I + _ = d.f // @pointsto func-ref-d.f "d.f" + _ = i.f // @pointsto func-ref-i.f "i.f" + + // var objects + anon := func() { + _ = d.f // @pointsto ref-lexical-d.f "d.f" + } + _ = anon // @pointsto ref-anon "anon" + _ = global // @pointsto ref-global "global" + + // SSA affords some local flow sensitivity. + var a, b int + var x = &a // @pointsto var-def-x-1 "x" + _ = x // @pointsto var-ref-x-1 "x" + x = &b // @pointsto var-def-x-2 "x" + _ = x // @pointsto var-ref-x-2 "x" + + i = new(C) // @pointsto var-ref-i-C "i" + if i != nil { + i = D{} // @pointsto var-ref-i-D "i" + } + print(i) // @pointsto var-ref-i "\\bi\\b" + + m := map[string]*int{"a": &a} + mapval, _ := m["a"] // @pointsto map-lookup,ok "m..a.." + _ = mapval // @pointsto mapval "mapval" + _ = m // @pointsto m "m" + + if false { + panic(3) // @pointsto builtin-panic "panic" + } + + // NB: s.f is addressable per (*ssa.Program).VarValue, + // but our query concerns the object, not its address. + s := struct{ f interface{} }{f: make(chan bool)} + print(s.f) // @pointsto var-ref-s-f "s.f" +} + +func livecode() {} // @pointsto func-live "livecode" + +func deadcode() { // @pointsto func-dead "deadcode" + // Pointer analysis can't run on dead code. + var b = new(int) // @pointsto b "b" + _ = b +} + +type I interface { + f() +} + +type C int +type D struct{} + +func (c *C) f() {} +func (d D) f() {} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/pointsto/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/pointsto/main.golden new file mode 100644 index 0000000000..fd68bda6dd --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/pointsto/main.golden @@ -0,0 +1,96 @@ +-------- @pointsto const -------- + +Error: pointer analysis wants an expression of reference type; got untyped float +-------- @pointsto func-ref-main -------- +this func() may point to these objects: + main.main + +-------- @pointsto func-ref-*C.f -------- +this func() may point to these objects: + (*main.C).f + +-------- @pointsto func-ref-D.f -------- +this func() may point to these objects: + (main.D).f + +-------- @pointsto func-ref-I.f -------- + +Error: func (main.I).f() is an interface method +-------- @pointsto func-ref-d.f -------- +this func() may point to these objects: + (main.D).f + +-------- @pointsto func-ref-i.f -------- + +Error: func (main.I).f() is an interface method +-------- @pointsto ref-lexical-d.f -------- +this func() may point to these objects: + (main.D).f + +-------- @pointsto ref-anon -------- +this func() may point to these objects: + main.main$1 + +-------- @pointsto ref-global -------- +this *string may point to these objects: + new + +-------- @pointsto var-def-x-1 -------- +this *int may point to these objects: + a + +-------- @pointsto var-ref-x-1 -------- +this *int may point to these objects: + a + +-------- @pointsto var-def-x-2 -------- +this *int may point to these objects: + b + +-------- @pointsto var-ref-x-2 -------- +this *int may point to these objects: + b + +-------- @pointsto var-ref-i-C -------- +this I may contain these dynamic types: + *C, may point to: + new + +-------- @pointsto var-ref-i-D -------- +this I may contain these dynamic types: + D + +-------- @pointsto var-ref-i -------- +this I may contain these dynamic types: + *C, may point to: + new + D + +-------- @pointsto map-lookup,ok -------- + +Error: pointer analysis wants an expression of reference type; got (*int, bool) +-------- @pointsto mapval -------- +this *int may point to these objects: + a + +-------- @pointsto m -------- +this map[string]*int may point to these objects: + makemap + +-------- @pointsto builtin-panic -------- + +Error: pointer analysis wants an expression of reference type; got () +-------- @pointsto var-ref-s-f -------- +this interface{} may contain these dynamic types: + chan bool, may point to: + makechan + +-------- @pointsto func-live -------- + +Error: pointer analysis did not find expression (dead code?) +-------- @pointsto func-dead -------- + +Error: pointer analysis did not find expression (dead code?) +-------- @pointsto b -------- + +Error: pointer analysis did not find expression (dead code?) diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/referrers-json/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/referrers-json/main.go new file mode 100644 index 0000000000..f551ee017c --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/referrers-json/main.go @@ -0,0 +1,24 @@ +package main + +// Tests of 'referrers' query. +// See go.tools/oracle/oracle_test.go for explanation. +// See referrers.golden for expected query results. + +import "lib" + +type s struct { + f int +} + +func main() { + var v lib.Type = lib.Const // @referrers ref-package "lib" + _ = v.Method // @referrers ref-method "Method" + _ = v.Method + v++ //@referrers ref-local "v" + v++ + + _ = s{}.f // @referrers ref-field "f" + + var s2 s + s2.f = 1 +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/referrers-json/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/referrers-json/main.golden new file mode 100644 index 0000000000..47a2d01b91 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/referrers-json/main.golden @@ -0,0 +1,59 @@ +-------- @referrers ref-package -------- +{ + "mode": "referrers", + "referrers": { + "pos": "testdata/src/referrers-json/main.go:14:8", + "objpos": "testdata/src/referrers-json/main.go:7:8", + "desc": "package lib", + "refs": [ + "testdata/src/referrers-json/main.go:14:8", + "testdata/src/referrers-json/main.go:14:19" + ] + } +} +-------- @referrers ref-method -------- +{ + "mode": "referrers", + "referrers": { + "pos": "testdata/src/referrers-json/main.go:15:8", + "objpos": "testdata/src/lib/lib.go:5:13", + "desc": "func (lib.Type).Method(x *int) *int", + "refs": [ + "testdata/src/imports/main.go:22:9", + "testdata/src/referrers-json/main.go:15:8", + "testdata/src/referrers-json/main.go:16:8", + "testdata/src/referrers/ext_test.go:10:17", + "testdata/src/referrers/int_test.go:7:17", + "testdata/src/referrers/main.go:17:8", + "testdata/src/referrers/main.go:18:8" + ] + } +} +-------- @referrers ref-local -------- +{ + "mode": "referrers", + "referrers": { + "pos": "testdata/src/referrers-json/main.go:17:2", + "objpos": "testdata/src/referrers-json/main.go:14:6", + "desc": "var v lib.Type", + "refs": [ + "testdata/src/referrers-json/main.go:15:6", + "testdata/src/referrers-json/main.go:16:6", + "testdata/src/referrers-json/main.go:17:2", + "testdata/src/referrers-json/main.go:18:2" + ] + } +} +-------- @referrers ref-field -------- +{ + "mode": "referrers", + "referrers": { + "pos": "testdata/src/referrers-json/main.go:20:10", + "objpos": "testdata/src/referrers-json/main.go:10:2", + "desc": "field f int", + "refs": [ + "testdata/src/referrers-json/main.go:20:10", + "testdata/src/referrers-json/main.go:23:5" + ] + } +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/referrers/ext_test.go b/vendor/golang.org/x/tools/oracle/testdata/src/referrers/ext_test.go new file mode 100644 index 0000000000..35e3199ac2 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/referrers/ext_test.go @@ -0,0 +1,12 @@ +package main_test + +import ( + "lib" + renamed "referrers" // package has name "main", path "referrers", local name "renamed" +) + +func _() { + // This reference should be found by the ref-method query. + _ = (lib.Type).Method // ref from external test package + var _ renamed.T +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/referrers/int_test.go b/vendor/golang.org/x/tools/oracle/testdata/src/referrers/int_test.go new file mode 100644 index 0000000000..9102cd6f8b --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/referrers/int_test.go @@ -0,0 +1,8 @@ +package main + +import "lib" + +func _() { + // This reference should be found by the ref-method query. + _ = (lib.Type).Method // ref from internal test package +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/referrers/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/referrers/main.go new file mode 100644 index 0000000000..fef571aec3 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/referrers/main.go @@ -0,0 +1,34 @@ +package main // @referrers package-decl "main" + +// Tests of 'referrers' query. +// See go.tools/oracle/oracle_test.go for explanation. +// See referrers.golden for expected query results. + +import "lib" + +type s struct { // @referrers type " s " + f int +} + +type T int + +func main() { + var v lib.Type = lib.Const // @referrers ref-package "lib" + _ = v.Method // @referrers ref-method "Method" + _ = v.Method + v++ //@referrers ref-local "v" + v++ + + _ = s{}.f // @referrers ref-field "f" + + var s2 s + s2.f = 1 +} + +// Test //line directives: + +type U int // @referrers ref-type-U "U" + +//line nosuchfile.y:123 +var u1 U +var u2 U diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/referrers/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/referrers/main.golden new file mode 100644 index 0000000000..d98d5109ee --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/referrers/main.golden @@ -0,0 +1,42 @@ +-------- @referrers package-decl -------- +1 references to package main ("referrers") + var _ renamed.T + +-------- @referrers type -------- +2 references to type s struct{f int} + _ = s{}.f // @referrers ref-field "f" + var s2 s + +-------- @referrers ref-package -------- +4 references to package lib + _ = (lib.Type).Method // ref from external test package + _ = (lib.Type).Method // ref from internal test package + var v lib.Type = lib.Const // @referrers ref-package "lib" + var v lib.Type = lib.Const // @referrers ref-package "lib" + +-------- @referrers ref-method -------- +7 references to func (lib.Type).Method(x *int) *int + p := t.Method(&a) // @describe ref-method "Method" + _ = v.Method // @referrers ref-method "Method" + _ = v.Method + _ = (lib.Type).Method // ref from external test package + _ = (lib.Type).Method // ref from internal test package + _ = v.Method // @referrers ref-method "Method" + _ = v.Method + +-------- @referrers ref-local -------- +4 references to var v lib.Type + _ = v.Method // @referrers ref-method "Method" + _ = v.Method + v++ //@referrers ref-local "v" + v++ + +-------- @referrers ref-field -------- +2 references to field f int + _ = s{}.f // @referrers ref-field "f" + s2.f = 1 + +-------- @referrers ref-type-U -------- +2 references to type U int +open testdata/src/referrers/nosuchfile.y: no such file or directory (+ 1 more refs in this file) + diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/reflection/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/reflection/main.go new file mode 100644 index 0000000000..392643baa8 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/reflection/main.go @@ -0,0 +1,30 @@ +package main + +// This is a test of 'pointsto', but we split it into a separate file +// so that pointsto.go doesn't have to import "reflect" each time. + +import "reflect" + +var a int +var b bool + +func main() { + m := make(map[*int]*bool) + m[&a] = &b + + mrv := reflect.ValueOf(m) + if a > 0 { + mrv = reflect.ValueOf(&b) + } + if a > 0 { + mrv = reflect.ValueOf(&a) + } + + _ = mrv // @pointsto mrv "mrv" + p1 := mrv.Interface() // @pointsto p1 "p1" + p2 := mrv.MapKeys() // @pointsto p2 "p2" + p3 := p2[0] // @pointsto p3 "p3" + p4 := reflect.TypeOf(p1) // @pointsto p4 "p4" + + _, _, _, _ = p1, p2, p3, p4 +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/reflection/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/reflection/main.golden new file mode 100644 index 0000000000..6190c0655a --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/reflection/main.golden @@ -0,0 +1,34 @@ +-------- @pointsto mrv -------- +this reflect.Value may contain these dynamic types: + *bool, may point to: + main.b + *int, may point to: + main.a + map[*int]*bool, may point to: + makemap + +-------- @pointsto p1 -------- +this interface{} may contain these dynamic types: + *bool, may point to: + main.b + *int, may point to: + main.a + map[*int]*bool, may point to: + makemap + +-------- @pointsto p2 -------- +this []reflect.Value may point to these objects: + + +-------- @pointsto p3 -------- +this reflect.Value may contain these dynamic types: + *int, may point to: + main.a + +-------- @pointsto p4 -------- +this reflect.Type may contain these dynamic types: + *reflect.rtype, may point to: + *bool + *int + map[*int]*bool + diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/what-json/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/what-json/main.go new file mode 100644 index 0000000000..8d578c733a --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/what-json/main.go @@ -0,0 +1,9 @@ +package main + +// Tests of 'what' queries, -format=json. +// See go.tools/oracle/oracle_test.go for explanation. +// See what-json.golden for expected query results. + +func main() { + f() // @what call "f" +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/what-json/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/what-json/main.golden new file mode 100644 index 0000000000..9a31190193 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/what-json/main.golden @@ -0,0 +1,51 @@ +-------- @what call -------- +{ + "mode": "what", + "what": { + "enclosing": [ + { + "desc": "identifier", + "start": 179, + "end": 180 + }, + { + "desc": "function call (or conversion)", + "start": 179, + "end": 182 + }, + { + "desc": "expression statement", + "start": 179, + "end": 182 + }, + { + "desc": "block", + "start": 176, + "end": 202 + }, + { + "desc": "function declaration", + "start": 164, + "end": 202 + }, + { + "desc": "source file", + "start": 0, + "end": 202 + } + ], + "modes": [ + "callees", + "callers", + "callstack", + "definition", + "describe", + "freevars", + "implements", + "pointsto", + "referrers" + ], + "srcdir": "testdata/src", + "importpath": "what-json" + } +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/what/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/what/main.go new file mode 100644 index 0000000000..38e9dc7b05 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/what/main.go @@ -0,0 +1,11 @@ +package main // @what pkgdecl "main" + +// Tests of 'what' queries. +// See go.tools/oracle/oracle_test.go for explanation. +// See what.golden for expected query results. + +func main() { + f() // @what call "f" + var ch chan int // @what var "var" + <-ch // @what recv "ch" +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/what/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/what/main.golden new file mode 100644 index 0000000000..56b97dde51 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/what/main.golden @@ -0,0 +1,39 @@ +-------- @what pkgdecl -------- +identifier +source file +modes: [definition describe freevars implements pointsto referrers] +srcdir: testdata/src +import path: what + +-------- @what call -------- +identifier +function call (or conversion) +expression statement +block +function declaration +source file +modes: [callees callers callstack definition describe freevars implements pointsto referrers] +srcdir: testdata/src +import path: what + +-------- @what var -------- +variable declaration +variable declaration statement +block +function declaration +source file +modes: [callers callstack describe freevars pointsto] +srcdir: testdata/src +import path: what + +-------- @what recv -------- +identifier +unary <- operation +expression statement +block +function declaration +source file +modes: [callers callstack definition describe freevars implements peers pointsto referrers] +srcdir: testdata/src +import path: what + diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/whicherrs/main.go b/vendor/golang.org/x/tools/oracle/testdata/src/whicherrs/main.go new file mode 100644 index 0000000000..27fe6b5614 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/whicherrs/main.go @@ -0,0 +1,27 @@ +package main + +type errType string + +const constErr errType = "blah" + +func (et errType) Error() string { + return string(et) +} + +var errVar error = errType("foo") + +func genErr(i int) error { + switch i { + case 0: + return constErr + case 1: + return errVar + default: + return nil + } +} + +func main() { + err := genErr(0) // @whicherrs localerrs "err" + _ = err +} diff --git a/vendor/golang.org/x/tools/oracle/testdata/src/whicherrs/main.golden b/vendor/golang.org/x/tools/oracle/testdata/src/whicherrs/main.golden new file mode 100644 index 0000000000..1118e0a870 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/testdata/src/whicherrs/main.golden @@ -0,0 +1,8 @@ +-------- @whicherrs localerrs -------- +this error may point to these globals: + errVar +this error may contain these constants: + constErr +this error may contain these dynamic types: + errType + diff --git a/vendor/golang.org/x/tools/oracle/what.go b/vendor/golang.org/x/tools/oracle/what.go new file mode 100644 index 0000000000..5a5c0cfa5d --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/what.go @@ -0,0 +1,210 @@ +// Copyright 2013 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 oracle + +import ( + "fmt" + "go/ast" + "go/build" + "go/token" + "os" + "path/filepath" + "sort" + "strings" + + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/oracle/serial" +) + +// what reports all the information about the query selection that can be +// obtained from parsing only its containing source file. +// It is intended to be a very low-latency query callable from GUI +// tools, e.g. to populate a menu of options of slower queries about +// the selected location. +// +func what(q *Query) error { + qpos, err := fastQueryPos(q.Pos) + if err != nil { + return err + } + q.Fset = qpos.fset + + // (ignore errors) + srcdir, importPath, _ := guessImportPath(q.Fset.File(qpos.start).Name(), q.Build) + + // Determine which query modes are applicable to the selection. + enable := map[string]bool{ + "describe": true, // any syntax; always enabled + } + + if qpos.end > qpos.start { + enable["freevars"] = true // nonempty selection? + } + + for _, n := range qpos.path { + switch n := n.(type) { + case *ast.Ident: + enable["definition"] = true + enable["referrers"] = true + enable["implements"] = true + case *ast.CallExpr: + enable["callees"] = true + case *ast.FuncDecl: + enable["callers"] = true + enable["callstack"] = true + case *ast.SendStmt: + enable["peers"] = true + case *ast.UnaryExpr: + if n.Op == token.ARROW { + enable["peers"] = true + } + } + + // For implements, we approximate findInterestingNode. + if _, ok := enable["implements"]; !ok { + switch n.(type) { + case *ast.ArrayType, + *ast.StructType, + *ast.FuncType, + *ast.InterfaceType, + *ast.MapType, + *ast.ChanType: + enable["implements"] = true + } + } + + // For pointsto, we approximate findInterestingNode. + if _, ok := enable["pointsto"]; !ok { + switch n.(type) { + case ast.Stmt, + *ast.ArrayType, + *ast.StructType, + *ast.FuncType, + *ast.InterfaceType, + *ast.MapType, + *ast.ChanType: + enable["pointsto"] = false // not an expr + + case ast.Expr, ast.Decl, *ast.ValueSpec: + enable["pointsto"] = true // an expr, maybe + + default: + // Comment, Field, KeyValueExpr, etc: ascend. + } + } + } + + // If we don't have an exact selection, disable modes that need one. + if !qpos.exact { + enable["callees"] = false + enable["pointsto"] = false + enable["whicherrs"] = false + enable["describe"] = false + } + + var modes []string + for mode := range enable { + modes = append(modes, mode) + } + sort.Strings(modes) + + q.result = &whatResult{ + path: qpos.path, + srcdir: srcdir, + importPath: importPath, + modes: modes, + } + return nil +} + +// guessImportPath finds the package containing filename, and returns +// its source directory (an element of $GOPATH) and its import path +// relative to it. +// +// TODO(adonovan): what about _test.go files that are not part of the +// package? +// +func guessImportPath(filename string, buildContext *build.Context) (srcdir, importPath string, err error) { + absFile, err := filepath.Abs(filename) + if err != nil { + err = fmt.Errorf("can't form absolute path of %s", filename) + return + } + absFileDir := segments(filepath.Dir(absFile)) + + // Find the innermost directory in $GOPATH that encloses filename. + minD := 1024 + for _, gopathDir := range buildContext.SrcDirs() { + absDir, err := filepath.Abs(gopathDir) + if err != nil { + continue // e.g. non-existent dir on $GOPATH + } + d := prefixLen(segments(absDir), absFileDir) + // If there are multiple matches, + // prefer the innermost enclosing directory + // (smallest d). + if d >= 0 && d < minD { + minD = d + srcdir = gopathDir + importPath = strings.Join(absFileDir[len(absFileDir)-minD:], string(os.PathSeparator)) + } + } + if srcdir == "" { + err = fmt.Errorf("directory %s is not beneath any of these GOROOT/GOPATH directories: %s", + filepath.Dir(absFile), strings.Join(buildContext.SrcDirs(), ", ")) + } + return +} + +func segments(path string) []string { + return strings.Split(path, string(os.PathSeparator)) +} + +// prefixLen returns the length of the remainder of y if x is a prefix +// of y, a negative number otherwise. +func prefixLen(x, y []string) int { + d := len(y) - len(x) + if d >= 0 { + for i := range x { + if y[i] != x[i] { + return -1 // not a prefix + } + } + } + return d +} + +type whatResult struct { + path []ast.Node + modes []string + srcdir string + importPath string +} + +func (r *whatResult) display(printf printfFunc) { + for _, n := range r.path { + printf(n, "%s", astutil.NodeDescription(n)) + } + printf(nil, "modes: %s", r.modes) + printf(nil, "srcdir: %s", r.srcdir) + printf(nil, "import path: %s", r.importPath) +} + +func (r *whatResult) toSerial(res *serial.Result, fset *token.FileSet) { + var enclosing []serial.SyntaxNode + for _, n := range r.path { + enclosing = append(enclosing, serial.SyntaxNode{ + Description: astutil.NodeDescription(n), + Start: fset.Position(n.Pos()).Offset, + End: fset.Position(n.End()).Offset, + }) + } + res.What = &serial.What{ + Modes: r.modes, + SrcDir: r.srcdir, + ImportPath: r.importPath, + Enclosing: enclosing, + } +} diff --git a/vendor/golang.org/x/tools/oracle/whicherrs.go b/vendor/golang.org/x/tools/oracle/whicherrs.go new file mode 100644 index 0000000000..be43c3909c --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/whicherrs.go @@ -0,0 +1,328 @@ +// 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 go1.5 + +package oracle + +import ( + "fmt" + "go/ast" + "go/token" + "go/types" + "sort" + + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/oracle/serial" +) + +var builtinErrorType = types.Universe.Lookup("error").Type() + +// whicherrs takes an position to an error and tries to find all types, constants +// and global value which a given error can point to and which can be checked from the +// scope where the error lives. +// In short, it returns a list of things that can be checked against in order to handle +// an error properly. +// +// TODO(dmorsing): figure out if fields in errors like *os.PathError.Err +// can be queried recursively somehow. +func whicherrs(q *Query) error { + lconf := loader.Config{Build: q.Build} + + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, true) // needs exact pos + if err != nil { + return err + } + + prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug) + + ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection) + if err != nil { + return err + } + + path, action := findInterestingNode(qpos.info, qpos.path) + if action != actionExpr { + return fmt.Errorf("whicherrs wants an expression; got %s", + astutil.NodeDescription(qpos.path[0])) + } + var expr ast.Expr + var obj types.Object + switch n := path[0].(type) { + case *ast.ValueSpec: + // ambiguous ValueSpec containing multiple names + return fmt.Errorf("multiple value specification") + case *ast.Ident: + obj = qpos.info.ObjectOf(n) + expr = n + case ast.Expr: + expr = n + default: + return fmt.Errorf("unexpected AST for expr: %T", n) + } + + typ := qpos.info.TypeOf(expr) + if !types.Identical(typ, builtinErrorType) { + return fmt.Errorf("selection is not an expression of type 'error'") + } + // Determine the ssa.Value for the expression. + var value ssa.Value + if obj != nil { + // def/ref of func/var object + value, _, err = ssaValueForIdent(prog, qpos.info, obj, path) + } else { + value, _, err = ssaValueForExpr(prog, qpos.info, path) + } + if err != nil { + return err // e.g. trivially dead code + } + + // Defer SSA construction till after errors are reported. + prog.Build() + + globals := findVisibleErrs(prog, qpos) + constants := findVisibleConsts(prog, qpos) + + res := &whicherrsResult{ + qpos: qpos, + errpos: expr.Pos(), + } + + // TODO(adonovan): the following code is heavily duplicated + // w.r.t. "pointsto". Refactor? + + // Find the instruction which initialized the + // global error. If more than one instruction has stored to the global + // remove the global from the set of values that we want to query. + allFuncs := ssautil.AllFunctions(prog) + for fn := range allFuncs { + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + store, ok := instr.(*ssa.Store) + if !ok { + continue + } + gval, ok := store.Addr.(*ssa.Global) + if !ok { + continue + } + gbl, ok := globals[gval] + if !ok { + continue + } + // we already found a store to this global + // The normal error define is just one store in the init + // so we just remove this global from the set we want to query + if gbl != nil { + delete(globals, gval) + } + globals[gval] = store.Val + } + } + } + + ptaConfig.AddQuery(value) + for _, v := range globals { + ptaConfig.AddQuery(v) + } + + ptares := ptrAnalysis(ptaConfig) + valueptr := ptares.Queries[value] + for g, v := range globals { + ptr, ok := ptares.Queries[v] + if !ok { + continue + } + if !ptr.MayAlias(valueptr) { + continue + } + res.globals = append(res.globals, g) + } + pts := valueptr.PointsTo() + dedup := make(map[*ssa.NamedConst]bool) + for _, label := range pts.Labels() { + // These values are either MakeInterfaces or reflect + // generated interfaces. For the purposes of this + // analysis, we don't care about reflect generated ones + makeiface, ok := label.Value().(*ssa.MakeInterface) + if !ok { + continue + } + constval, ok := makeiface.X.(*ssa.Const) + if !ok { + continue + } + c := constants[*constval] + if c != nil && !dedup[c] { + dedup[c] = true + res.consts = append(res.consts, c) + } + } + concs := pts.DynamicTypes() + concs.Iterate(func(conc types.Type, _ interface{}) { + // go/types is a bit annoying here. + // We want to find all the types that we can + // typeswitch or assert to. This means finding out + // if the type pointed to can be seen by us. + // + // For the purposes of this analysis, the type is always + // either a Named type or a pointer to one. + // There are cases where error can be implemented + // by unnamed types, but in that case, we can't assert to + // it, so we don't care about it for this analysis. + var name *types.TypeName + switch t := conc.(type) { + case *types.Pointer: + named, ok := t.Elem().(*types.Named) + if !ok { + return + } + name = named.Obj() + case *types.Named: + name = t.Obj() + default: + return + } + if !isAccessibleFrom(name, qpos.info.Pkg) { + return + } + res.types = append(res.types, &errorType{conc, name}) + }) + sort.Sort(membersByPosAndString(res.globals)) + sort.Sort(membersByPosAndString(res.consts)) + sort.Sort(sorterrorType(res.types)) + + q.result = res + return nil +} + +// findVisibleErrs returns a mapping from each package-level variable of type "error" to nil. +func findVisibleErrs(prog *ssa.Program, qpos *queryPos) map[*ssa.Global]ssa.Value { + globals := make(map[*ssa.Global]ssa.Value) + for _, pkg := range prog.AllPackages() { + for _, mem := range pkg.Members { + gbl, ok := mem.(*ssa.Global) + if !ok { + continue + } + gbltype := gbl.Type() + // globals are always pointers + if !types.Identical(deref(gbltype), builtinErrorType) { + continue + } + if !isAccessibleFrom(gbl.Object(), qpos.info.Pkg) { + continue + } + globals[gbl] = nil + } + } + return globals +} + +// findVisibleConsts returns a mapping from each package-level constant assignable to type "error", to nil. +func findVisibleConsts(prog *ssa.Program, qpos *queryPos) map[ssa.Const]*ssa.NamedConst { + constants := make(map[ssa.Const]*ssa.NamedConst) + for _, pkg := range prog.AllPackages() { + for _, mem := range pkg.Members { + obj, ok := mem.(*ssa.NamedConst) + if !ok { + continue + } + consttype := obj.Type() + if !types.AssignableTo(consttype, builtinErrorType) { + continue + } + if !isAccessibleFrom(obj.Object(), qpos.info.Pkg) { + continue + } + constants[*obj.Value] = obj + } + } + + return constants +} + +type membersByPosAndString []ssa.Member + +func (a membersByPosAndString) Len() int { return len(a) } +func (a membersByPosAndString) Less(i, j int) bool { + cmp := a[i].Pos() - a[j].Pos() + return cmp < 0 || cmp == 0 && a[i].String() < a[j].String() +} +func (a membersByPosAndString) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type sorterrorType []*errorType + +func (a sorterrorType) Len() int { return len(a) } +func (a sorterrorType) Less(i, j int) bool { + cmp := a[i].obj.Pos() - a[j].obj.Pos() + return cmp < 0 || cmp == 0 && a[i].typ.String() < a[j].typ.String() +} +func (a sorterrorType) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type errorType struct { + typ types.Type // concrete type N or *N that implements error + obj *types.TypeName // the named type N +} + +type whicherrsResult struct { + qpos *queryPos + errpos token.Pos + globals []ssa.Member + consts []ssa.Member + types []*errorType +} + +func (r *whicherrsResult) display(printf printfFunc) { + if len(r.globals) > 0 { + printf(r.qpos, "this error may point to these globals:") + for _, g := range r.globals { + printf(g.Pos(), "\t%s", g.RelString(r.qpos.info.Pkg)) + } + } + if len(r.consts) > 0 { + printf(r.qpos, "this error may contain these constants:") + for _, c := range r.consts { + printf(c.Pos(), "\t%s", c.RelString(r.qpos.info.Pkg)) + } + } + if len(r.types) > 0 { + printf(r.qpos, "this error may contain these dynamic types:") + for _, t := range r.types { + printf(t.obj.Pos(), "\t%s", r.qpos.typeString(t.typ)) + } + } +} + +func (r *whicherrsResult) toSerial(res *serial.Result, fset *token.FileSet) { + we := &serial.WhichErrs{} + we.ErrPos = fset.Position(r.errpos).String() + for _, g := range r.globals { + we.Globals = append(we.Globals, fset.Position(g.Pos()).String()) + } + for _, c := range r.consts { + we.Constants = append(we.Constants, fset.Position(c.Pos()).String()) + } + for _, t := range r.types { + var et serial.WhichErrsType + et.Type = r.qpos.typeString(t.typ) + et.Position = fset.Position(t.obj.Pos()).String() + we.Types = append(we.Types, et) + } + res.WhichErrs = we +} diff --git a/vendor/golang.org/x/tools/oracle/whicherrs14.go b/vendor/golang.org/x/tools/oracle/whicherrs14.go new file mode 100644 index 0000000000..25449f3183 --- /dev/null +++ b/vendor/golang.org/x/tools/oracle/whicherrs14.go @@ -0,0 +1,328 @@ +// 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 !go1.5 + +package oracle + +import ( + "fmt" + "go/ast" + "go/token" + "sort" + + "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/ssa" + "golang.org/x/tools/go/ssa/ssautil" + "golang.org/x/tools/go/types" + "golang.org/x/tools/oracle/serial" +) + +var builtinErrorType = types.Universe.Lookup("error").Type() + +// whicherrs takes an position to an error and tries to find all types, constants +// and global value which a given error can point to and which can be checked from the +// scope where the error lives. +// In short, it returns a list of things that can be checked against in order to handle +// an error properly. +// +// TODO(dmorsing): figure out if fields in errors like *os.PathError.Err +// can be queried recursively somehow. +func whicherrs(q *Query) error { + lconf := loader.Config{Build: q.Build} + + if err := setPTAScope(&lconf, q.Scope); err != nil { + return err + } + + // Load/parse/type-check the program. + lprog, err := lconf.Load() + if err != nil { + return err + } + q.Fset = lprog.Fset + + qpos, err := parseQueryPos(lprog, q.Pos, true) // needs exact pos + if err != nil { + return err + } + + prog := ssautil.CreateProgram(lprog, ssa.GlobalDebug) + + ptaConfig, err := setupPTA(prog, lprog, q.PTALog, q.Reflection) + if err != nil { + return err + } + + path, action := findInterestingNode(qpos.info, qpos.path) + if action != actionExpr { + return fmt.Errorf("whicherrs wants an expression; got %s", + astutil.NodeDescription(qpos.path[0])) + } + var expr ast.Expr + var obj types.Object + switch n := path[0].(type) { + case *ast.ValueSpec: + // ambiguous ValueSpec containing multiple names + return fmt.Errorf("multiple value specification") + case *ast.Ident: + obj = qpos.info.ObjectOf(n) + expr = n + case ast.Expr: + expr = n + default: + return fmt.Errorf("unexpected AST for expr: %T", n) + } + + typ := qpos.info.TypeOf(expr) + if !types.Identical(typ, builtinErrorType) { + return fmt.Errorf("selection is not an expression of type 'error'") + } + // Determine the ssa.Value for the expression. + var value ssa.Value + if obj != nil { + // def/ref of func/var object + value, _, err = ssaValueForIdent(prog, qpos.info, obj, path) + } else { + value, _, err = ssaValueForExpr(prog, qpos.info, path) + } + if err != nil { + return err // e.g. trivially dead code + } + + // Defer SSA construction till after errors are reported. + prog.Build() + + globals := findVisibleErrs(prog, qpos) + constants := findVisibleConsts(prog, qpos) + + res := &whicherrsResult{ + qpos: qpos, + errpos: expr.Pos(), + } + + // TODO(adonovan): the following code is heavily duplicated + // w.r.t. "pointsto". Refactor? + + // Find the instruction which initialized the + // global error. If more than one instruction has stored to the global + // remove the global from the set of values that we want to query. + allFuncs := ssautil.AllFunctions(prog) + for fn := range allFuncs { + for _, b := range fn.Blocks { + for _, instr := range b.Instrs { + store, ok := instr.(*ssa.Store) + if !ok { + continue + } + gval, ok := store.Addr.(*ssa.Global) + if !ok { + continue + } + gbl, ok := globals[gval] + if !ok { + continue + } + // we already found a store to this global + // The normal error define is just one store in the init + // so we just remove this global from the set we want to query + if gbl != nil { + delete(globals, gval) + } + globals[gval] = store.Val + } + } + } + + ptaConfig.AddQuery(value) + for _, v := range globals { + ptaConfig.AddQuery(v) + } + + ptares := ptrAnalysis(ptaConfig) + valueptr := ptares.Queries[value] + for g, v := range globals { + ptr, ok := ptares.Queries[v] + if !ok { + continue + } + if !ptr.MayAlias(valueptr) { + continue + } + res.globals = append(res.globals, g) + } + pts := valueptr.PointsTo() + dedup := make(map[*ssa.NamedConst]bool) + for _, label := range pts.Labels() { + // These values are either MakeInterfaces or reflect + // generated interfaces. For the purposes of this + // analysis, we don't care about reflect generated ones + makeiface, ok := label.Value().(*ssa.MakeInterface) + if !ok { + continue + } + constval, ok := makeiface.X.(*ssa.Const) + if !ok { + continue + } + c := constants[*constval] + if c != nil && !dedup[c] { + dedup[c] = true + res.consts = append(res.consts, c) + } + } + concs := pts.DynamicTypes() + concs.Iterate(func(conc types.Type, _ interface{}) { + // go/types is a bit annoying here. + // We want to find all the types that we can + // typeswitch or assert to. This means finding out + // if the type pointed to can be seen by us. + // + // For the purposes of this analysis, the type is always + // either a Named type or a pointer to one. + // There are cases where error can be implemented + // by unnamed types, but in that case, we can't assert to + // it, so we don't care about it for this analysis. + var name *types.TypeName + switch t := conc.(type) { + case *types.Pointer: + named, ok := t.Elem().(*types.Named) + if !ok { + return + } + name = named.Obj() + case *types.Named: + name = t.Obj() + default: + return + } + if !isAccessibleFrom(name, qpos.info.Pkg) { + return + } + res.types = append(res.types, &errorType{conc, name}) + }) + sort.Sort(membersByPosAndString(res.globals)) + sort.Sort(membersByPosAndString(res.consts)) + sort.Sort(sorterrorType(res.types)) + + q.result = res + return nil +} + +// findVisibleErrs returns a mapping from each package-level variable of type "error" to nil. +func findVisibleErrs(prog *ssa.Program, qpos *queryPos) map[*ssa.Global]ssa.Value { + globals := make(map[*ssa.Global]ssa.Value) + for _, pkg := range prog.AllPackages() { + for _, mem := range pkg.Members { + gbl, ok := mem.(*ssa.Global) + if !ok { + continue + } + gbltype := gbl.Type() + // globals are always pointers + if !types.Identical(deref(gbltype), builtinErrorType) { + continue + } + if !isAccessibleFrom(gbl.Object(), qpos.info.Pkg) { + continue + } + globals[gbl] = nil + } + } + return globals +} + +// findVisibleConsts returns a mapping from each package-level constant assignable to type "error", to nil. +func findVisibleConsts(prog *ssa.Program, qpos *queryPos) map[ssa.Const]*ssa.NamedConst { + constants := make(map[ssa.Const]*ssa.NamedConst) + for _, pkg := range prog.AllPackages() { + for _, mem := range pkg.Members { + obj, ok := mem.(*ssa.NamedConst) + if !ok { + continue + } + consttype := obj.Type() + if !types.AssignableTo(consttype, builtinErrorType) { + continue + } + if !isAccessibleFrom(obj.Object(), qpos.info.Pkg) { + continue + } + constants[*obj.Value] = obj + } + } + + return constants +} + +type membersByPosAndString []ssa.Member + +func (a membersByPosAndString) Len() int { return len(a) } +func (a membersByPosAndString) Less(i, j int) bool { + cmp := a[i].Pos() - a[j].Pos() + return cmp < 0 || cmp == 0 && a[i].String() < a[j].String() +} +func (a membersByPosAndString) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type sorterrorType []*errorType + +func (a sorterrorType) Len() int { return len(a) } +func (a sorterrorType) Less(i, j int) bool { + cmp := a[i].obj.Pos() - a[j].obj.Pos() + return cmp < 0 || cmp == 0 && a[i].typ.String() < a[j].typ.String() +} +func (a sorterrorType) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type errorType struct { + typ types.Type // concrete type N or *N that implements error + obj *types.TypeName // the named type N +} + +type whicherrsResult struct { + qpos *queryPos + errpos token.Pos + globals []ssa.Member + consts []ssa.Member + types []*errorType +} + +func (r *whicherrsResult) display(printf printfFunc) { + if len(r.globals) > 0 { + printf(r.qpos, "this error may point to these globals:") + for _, g := range r.globals { + printf(g.Pos(), "\t%s", g.RelString(r.qpos.info.Pkg)) + } + } + if len(r.consts) > 0 { + printf(r.qpos, "this error may contain these constants:") + for _, c := range r.consts { + printf(c.Pos(), "\t%s", c.RelString(r.qpos.info.Pkg)) + } + } + if len(r.types) > 0 { + printf(r.qpos, "this error may contain these dynamic types:") + for _, t := range r.types { + printf(t.obj.Pos(), "\t%s", r.qpos.typeString(t.typ)) + } + } +} + +func (r *whicherrsResult) toSerial(res *serial.Result, fset *token.FileSet) { + we := &serial.WhichErrs{} + we.ErrPos = fset.Position(r.errpos).String() + for _, g := range r.globals { + we.Globals = append(we.Globals, fset.Position(g.Pos()).String()) + } + for _, c := range r.consts { + we.Constants = append(we.Constants, fset.Position(c.Pos()).String()) + } + for _, t := range r.types { + var et serial.WhichErrsType + et.Type = r.qpos.typeString(t.typ) + et.Position = fset.Position(t.obj.Pos()).String() + we.Types = append(we.Types, et) + } + res.WhichErrs = we +} diff --git a/vendor/golang.org/x/tools/playground/appengine.go b/vendor/golang.org/x/tools/playground/appengine.go new file mode 100644 index 0000000000..94c5d52325 --- /dev/null +++ b/vendor/golang.org/x/tools/playground/appengine.go @@ -0,0 +1,26 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build appengine + +package playground + +import ( + "net/http" + + "appengine" + "appengine/urlfetch" +) + +func init() { + onAppengine = !appengine.IsDevAppServer() +} + +func client(r *http.Request) *http.Client { + return urlfetch.Client(appengine.NewContext(r)) +} + +func report(r *http.Request, err error) { + appengine.NewContext(r).Errorf("%v", err) +} diff --git a/vendor/golang.org/x/tools/playground/appenginevm.go b/vendor/golang.org/x/tools/playground/appenginevm.go new file mode 100644 index 0000000000..aa3a21268e --- /dev/null +++ b/vendor/golang.org/x/tools/playground/appenginevm.go @@ -0,0 +1,11 @@ +// 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 appenginevm + +package playground + +func init() { + onAppengine = true +} diff --git a/vendor/golang.org/x/tools/playground/common.go b/vendor/golang.org/x/tools/playground/common.go new file mode 100644 index 0000000000..d8c28052d7 --- /dev/null +++ b/vendor/golang.org/x/tools/playground/common.go @@ -0,0 +1,63 @@ +// Copyright 2013 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 playground registers HTTP handlers at "/compile" and "/share" that +// proxy requests to the golang.org playground service. +// This package may be used unaltered on App Engine. +package playground // import "golang.org/x/tools/playground" + +import ( + "bytes" + "errors" + "fmt" + "io" + "net/http" +) + +const baseURL = "http://play.golang.org" + +func init() { + http.HandleFunc("/compile", bounce) + http.HandleFunc("/share", bounce) +} + +func bounce(w http.ResponseWriter, r *http.Request) { + b := new(bytes.Buffer) + if err := passThru(b, r); err != nil { + http.Error(w, "Server error.", http.StatusInternalServerError) + report(r, err) + return + } + io.Copy(w, b) +} + +func passThru(w io.Writer, req *http.Request) error { + if req.URL.Path == "/share" && !allowShare(req) { + return errors.New("Forbidden") + } + defer req.Body.Close() + url := baseURL + req.URL.Path + r, err := client(req).Post(url, req.Header.Get("Content-type"), req.Body) + if err != nil { + return fmt.Errorf("making POST request: %v", err) + } + defer r.Body.Close() + if _, err := io.Copy(w, r.Body); err != nil { + return fmt.Errorf("copying response Body: %v", err) + } + return nil +} + +var onAppengine = false // will be overriden by appengine.go and appenginevm.go + +func allowShare(r *http.Request) bool { + if !onAppengine { + return true + } + switch r.Header.Get("X-AppEngine-Country") { + case "", "ZZ", "CN": + return false + } + return true +} diff --git a/vendor/golang.org/x/tools/playground/local.go b/vendor/golang.org/x/tools/playground/local.go new file mode 100644 index 0000000000..b114b87785 --- /dev/null +++ b/vendor/golang.org/x/tools/playground/local.go @@ -0,0 +1,20 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !appengine + +package playground + +import ( + "log" + "net/http" +) + +func client(r *http.Request) *http.Client { + return http.DefaultClient +} + +func report(r *http.Request, err error) { + log.Println(err) +} diff --git a/vendor/golang.org/x/tools/playground/socket/socket.go b/vendor/golang.org/x/tools/playground/socket/socket.go new file mode 100644 index 0000000000..527c075539 --- /dev/null +++ b/vendor/golang.org/x/tools/playground/socket/socket.go @@ -0,0 +1,523 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !appengine + +// Package socket implements an WebSocket-based playground backend. +// Clients connect to a websocket handler and send run/kill commands, and +// the server sends the output and exit status of the running processes. +// Multiple clients running multiple processes may be served concurrently. +// The wire format is JSON and is described by the Message type. +// +// This will not run on App Engine as WebSockets are not supported there. +package socket // import "golang.org/x/tools/playground/socket" + +import ( + "bytes" + "encoding/json" + "errors" + "go/parser" + "go/token" + "io" + "io/ioutil" + "log" + "net" + "net/http" + "net/url" + "os" + "os/exec" + "path/filepath" + "runtime" + "strconv" + "strings" + "time" + "unicode/utf8" + + "golang.org/x/net/websocket" +) + +// RunScripts specifies whether the socket handler should execute shell scripts +// (snippets that start with a shebang). +var RunScripts = true + +// Environ provides an environment when a binary, such as the go tool, is +// invoked. +var Environ func() []string = os.Environ + +const ( + // The maximum number of messages to send per session (avoid flooding). + msgLimit = 1000 + + // Batch messages sent in this interval and send as a single message. + msgDelay = 10 * time.Millisecond +) + +// Message is the wire format for the websocket connection to the browser. +// It is used for both sending output messages and receiving commands, as +// distinguished by the Kind field. +type Message struct { + Id string // client-provided unique id for the process + Kind string // in: "run", "kill" out: "stdout", "stderr", "end" + Body string + Options *Options `json:",omitempty"` +} + +// Options specify additional message options. +type Options struct { + Race bool // use -race flag when building code (for "run" only) +} + +// NewHandler returns a websocket server which checks the origin of requests. +func NewHandler(origin *url.URL) websocket.Server { + return websocket.Server{ + Config: websocket.Config{Origin: origin}, + Handshake: handshake, + Handler: websocket.Handler(socketHandler), + } +} + +// handshake checks the origin of a request during the websocket handshake. +func handshake(c *websocket.Config, req *http.Request) error { + o, err := websocket.Origin(c, req) + if err != nil { + log.Println("bad websocket origin:", err) + return websocket.ErrBadWebSocketOrigin + } + _, port, err := net.SplitHostPort(c.Origin.Host) + if err != nil { + log.Println("bad websocket origin:", err) + return websocket.ErrBadWebSocketOrigin + } + ok := c.Origin.Scheme == o.Scheme && (c.Origin.Host == o.Host || c.Origin.Host == net.JoinHostPort(o.Host, port)) + if !ok { + log.Println("bad websocket origin:", o) + return websocket.ErrBadWebSocketOrigin + } + log.Println("accepting connection from:", req.RemoteAddr) + return nil +} + +// socketHandler handles the websocket connection for a given present session. +// It handles transcoding Messages to and from JSON format, and starting +// and killing processes. +func socketHandler(c *websocket.Conn) { + in, out := make(chan *Message), make(chan *Message) + errc := make(chan error, 1) + + // Decode messages from client and send to the in channel. + go func() { + dec := json.NewDecoder(c) + for { + var m Message + if err := dec.Decode(&m); err != nil { + errc <- err + return + } + in <- &m + } + }() + + // Receive messages from the out channel and encode to the client. + go func() { + enc := json.NewEncoder(c) + for m := range out { + if err := enc.Encode(m); err != nil { + errc <- err + return + } + } + }() + defer close(out) + + // Start and kill processes and handle errors. + proc := make(map[string]*process) + for { + select { + case m := <-in: + switch m.Kind { + case "run": + log.Println("running snippet from:", c.Request().RemoteAddr) + proc[m.Id].Kill() + proc[m.Id] = startProcess(m.Id, m.Body, out, m.Options) + case "kill": + proc[m.Id].Kill() + } + case err := <-errc: + if err != io.EOF { + // A encode or decode has failed; bail. + log.Println(err) + } + // Shut down any running processes. + for _, p := range proc { + p.Kill() + } + return + } + } +} + +// process represents a running process. +type process struct { + out chan<- *Message + done chan struct{} // closed when wait completes + run *exec.Cmd + bin string +} + +// startProcess builds and runs the given program, sending its output +// and end event as Messages on the provided channel. +func startProcess(id, body string, dest chan<- *Message, opt *Options) *process { + var ( + done = make(chan struct{}) + out = make(chan *Message) + p = &process{out: out, done: done} + ) + go func() { + defer close(done) + for m := range buffer(limiter(out, p)) { + m.Id = id + dest <- m + } + }() + var err error + if path, args := shebang(body); path != "" { + if RunScripts { + err = p.startProcess(path, args, body) + } else { + err = errors.New("script execution is not allowed") + } + } else { + err = p.start(body, opt) + } + if err != nil { + p.end(err) + return nil + } + go func() { + p.end(p.run.Wait()) + }() + return p +} + +// end sends an "end" message to the client, containing the process id and the +// given error value. It also removes the binary, if present. +func (p *process) end(err error) { + if p.bin != "" { + defer os.Remove(p.bin) + } + m := &Message{Kind: "end"} + if err != nil { + m.Body = err.Error() + } + p.out <- m + close(p.out) +} + +// A killer provides a mechanism to terminate a process. +// The Kill method returns only once the process has exited. +type killer interface { + Kill() +} + +// limiter returns a channel that wraps the given channel. +// It receives Messages from the given channel and sends them to the returned +// channel until it passes msgLimit messages, at which point it will kill the +// process and pass only the "end" message. +// When the given channel is closed, or when the "end" message is received, +// it closes the returned channel. +func limiter(in <-chan *Message, p killer) <-chan *Message { + out := make(chan *Message) + go func() { + defer close(out) + n := 0 + for m := range in { + switch { + case n < msgLimit || m.Kind == "end": + out <- m + if m.Kind == "end" { + return + } + case n == msgLimit: + // Kill in a goroutine as Kill will not return + // until the process' output has been + // processed, and we're doing that in this loop. + go p.Kill() + default: + continue // don't increment + } + n++ + } + }() + return out +} + +// buffer returns a channel that wraps the given channel. It receives messages +// from the given channel and sends them to the returned channel. +// Message bodies are gathered over the period msgDelay and coalesced into a +// single Message before they are passed on. Messages of the same kind are +// coalesced; when a message of a different kind is received, any buffered +// messages are flushed. When the given channel is closed, buffer flushes the +// remaining buffered messages and closes the returned channel. +func buffer(in <-chan *Message) <-chan *Message { + out := make(chan *Message) + go func() { + defer close(out) + var ( + tc <-chan time.Time + buf []byte + kind string + flush = func() { + if len(buf) == 0 { + return + } + out <- &Message{Kind: kind, Body: safeString(buf)} + buf = buf[:0] // recycle buffer + kind = "" + } + ) + for { + select { + case m, ok := <-in: + if !ok { + flush() + return + } + if m.Kind == "end" { + flush() + out <- m + return + } + if kind != m.Kind { + flush() + kind = m.Kind + if tc == nil { + tc = time.After(msgDelay) + } + } + buf = append(buf, m.Body...) + case <-tc: + flush() + tc = nil + } + } + }() + return out +} + +// Kill stops the process if it is running and waits for it to exit. +func (p *process) Kill() { + if p == nil || p.run == nil { + return + } + p.run.Process.Kill() + <-p.done // block until process exits +} + +// shebang looks for a shebang ('#!') at the beginning of the passed string. +// If found, it returns the path and args after the shebang. +// args includes the command as args[0]. +func shebang(body string) (path string, args []string) { + body = strings.TrimSpace(body) + if !strings.HasPrefix(body, "#!") { + return "", nil + } + if i := strings.Index(body, "\n"); i >= 0 { + body = body[:i] + } + fs := strings.Fields(body[2:]) + return fs[0], fs +} + +// startProcess starts a given program given its path and passing the given body +// to the command standard input. +func (p *process) startProcess(path string, args []string, body string) error { + cmd := &exec.Cmd{ + Path: path, + Args: args, + Stdin: strings.NewReader(body), + Stdout: &messageWriter{kind: "stdout", out: p.out}, + Stderr: &messageWriter{kind: "stderr", out: p.out}, + } + if err := cmd.Start(); err != nil { + return err + } + p.run = cmd + return nil +} + +// start builds and starts the given program, sending its output to p.out, +// and stores the running *exec.Cmd in the run field. +func (p *process) start(body string, opt *Options) error { + // We "go build" and then exec the binary so that the + // resultant *exec.Cmd is a handle to the user's program + // (rather than the go tool process). + // This makes Kill work. + + bin := filepath.Join(tmpdir, "compile"+strconv.Itoa(<-uniq)) + src := bin + ".go" + if runtime.GOOS == "windows" { + bin += ".exe" + } + + // write body to x.go + defer os.Remove(src) + err := ioutil.WriteFile(src, []byte(body), 0666) + if err != nil { + return err + } + + // build x.go, creating x + p.bin = bin // to be removed by p.end + dir, file := filepath.Split(src) + args := []string{"go", "build", "-tags", "OMIT"} + if opt != nil && opt.Race { + p.out <- &Message{ + Kind: "stderr", + Body: "Running with race detector.\n", + } + args = append(args, "-race") + } + args = append(args, "-o", bin, file) + cmd := p.cmd(dir, args...) + cmd.Stdout = cmd.Stderr // send compiler output to stderr + if err := cmd.Run(); err != nil { + return err + } + + // run x + if isNacl() { + cmd, err = p.naclCmd(bin) + if err != nil { + return err + } + } else { + cmd = p.cmd("", bin) + } + if opt != nil && opt.Race { + cmd.Env = append(cmd.Env, "GOMAXPROCS=2") + } + if err := cmd.Start(); err != nil { + // If we failed to exec, that might be because they built + // a non-main package instead of an executable. + // Check and report that. + if name, err := packageName(body); err == nil && name != "main" { + return errors.New(`executable programs must use "package main"`) + } + return err + } + p.run = cmd + return nil +} + +// cmd builds an *exec.Cmd that writes its standard output and error to the +// process' output channel. +func (p *process) cmd(dir string, args ...string) *exec.Cmd { + cmd := exec.Command(args[0], args[1:]...) + cmd.Dir = dir + cmd.Env = Environ() + cmd.Stdout = &messageWriter{kind: "stdout", out: p.out} + cmd.Stderr = &messageWriter{kind: "stderr", out: p.out} + return cmd +} + +func isNacl() bool { + for _, v := range append(Environ(), os.Environ()...) { + if v == "GOOS=nacl" { + return true + } + } + return false +} + +// naclCmd returns an *exec.Cmd that executes bin under native client. +func (p *process) naclCmd(bin string) (*exec.Cmd, error) { + pwd, err := os.Getwd() + if err != nil { + return nil, err + } + var args []string + env := []string{ + "NACLENV_GOOS=" + runtime.GOOS, + "NACLENV_GOROOT=/go", + "NACLENV_NACLPWD=" + strings.Replace(pwd, runtime.GOROOT(), "/go", 1), + } + switch runtime.GOARCH { + case "amd64": + env = append(env, "NACLENV_GOARCH=amd64p32") + args = []string{"sel_ldr_x86_64"} + case "386": + env = append(env, "NACLENV_GOARCH=386") + args = []string{"sel_ldr_x86_32"} + case "arm": + env = append(env, "NACLENV_GOARCH=arm") + selLdr, err := exec.LookPath("sel_ldr_arm") + if err != nil { + return nil, err + } + args = []string{"nacl_helper_bootstrap_arm", selLdr, "--reserved_at_zero=0xXXXXXXXXXXXXXXXX"} + default: + return nil, errors.New("native client does not support GOARCH=" + runtime.GOARCH) + } + + cmd := p.cmd("", append(args, "-l", "/dev/null", "-S", "-e", bin)...) + cmd.Env = append(cmd.Env, env...) + + return cmd, nil +} + +func packageName(body string) (string, error) { + f, err := parser.ParseFile(token.NewFileSet(), "prog.go", + strings.NewReader(body), parser.PackageClauseOnly) + if err != nil { + return "", err + } + return f.Name.String(), nil +} + +// messageWriter is an io.Writer that converts all writes to Message sends on +// the out channel with the specified id and kind. +type messageWriter struct { + kind string + out chan<- *Message +} + +func (w *messageWriter) Write(b []byte) (n int, err error) { + w.out <- &Message{Kind: w.kind, Body: safeString(b)} + return len(b), nil +} + +// safeString returns b as a valid UTF-8 string. +func safeString(b []byte) string { + if utf8.Valid(b) { + return string(b) + } + var buf bytes.Buffer + for len(b) > 0 { + r, size := utf8.DecodeRune(b) + b = b[size:] + buf.WriteRune(r) + } + return buf.String() +} + +var tmpdir string + +func init() { + // find real path to temporary directory + var err error + tmpdir, err = filepath.EvalSymlinks(os.TempDir()) + if err != nil { + log.Fatal(err) + } +} + +var uniq = make(chan int) // a source of numbers for naming temporary files + +func init() { + go func() { + for i := 0; ; i++ { + uniq <- i + } + }() +} diff --git a/vendor/golang.org/x/tools/playground/socket/socket_test.go b/vendor/golang.org/x/tools/playground/socket/socket_test.go new file mode 100644 index 0000000000..5dd2815ee4 --- /dev/null +++ b/vendor/golang.org/x/tools/playground/socket/socket_test.go @@ -0,0 +1,73 @@ +// 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 socket + +import ( + "testing" + "time" +) + +func TestBuffer(t *testing.T) { + ch := make(chan *Message) + go func() { + ch <- &Message{Kind: "err", Body: "a"} + ch <- &Message{Kind: "err", Body: "b"} + ch <- &Message{Kind: "out", Body: "1"} + ch <- &Message{Kind: "out", Body: "2"} + time.Sleep(msgDelay * 2) + ch <- &Message{Kind: "out", Body: "3"} + ch <- &Message{Kind: "out", Body: "4"} + close(ch) + }() + + var ms []*Message + for m := range buffer(ch) { + ms = append(ms, m) + } + if len(ms) != 3 { + t.Fatalf("got %v messages, want 2", len(ms)) + } + if g, w := ms[0].Body, "ab"; g != w { + t.Errorf("message 0 body = %q, want %q", g, w) + } + if g, w := ms[1].Body, "12"; g != w { + t.Errorf("message 1 body = %q, want %q", g, w) + } + if g, w := ms[2].Body, "34"; g != w { + t.Errorf("message 2 body = %q, want %q", g, w) + } +} + +type killRecorder chan struct{} + +func (k killRecorder) Kill() { close(k) } + +func TestLimiter(t *testing.T) { + ch := make(chan *Message) + go func() { + var m Message + for i := 0; i < msgLimit+10; i++ { + ch <- &m + } + ch <- &Message{Kind: "end"} + }() + + kr := make(killRecorder) + n := 0 + for m := range limiter(ch, kr) { + n++ + if n > msgLimit && m.Kind != "end" { + t.Errorf("received non-end message after limit") + } + } + if n != msgLimit+1 { + t.Errorf("received %v messages, want %v", n, msgLimit+1) + } + select { + case <-kr: + case <-time.After(100 * time.Millisecond): + t.Errorf("process wasn't killed after reaching limit") + } +} diff --git a/vendor/golang.org/x/tools/present/args.go b/vendor/golang.org/x/tools/present/args.go new file mode 100644 index 0000000000..49ee1a98a7 --- /dev/null +++ b/vendor/golang.org/x/tools/present/args.go @@ -0,0 +1,229 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package present + +import ( + "errors" + "regexp" + "strconv" + "unicode/utf8" +) + +// This file is stolen from go/src/cmd/godoc/codewalk.go. +// It's an evaluator for the file address syntax implemented by acme and sam, +// but using Go-native regular expressions. +// To keep things reasonably close, this version uses (?m:re) for all user-provided +// regular expressions. That is the only change to the code from codewalk.go. +// See http://plan9.bell-labs.com/sys/doc/sam/sam.html Table II +// for details on the syntax. + +// addrToByte evaluates the given address starting at offset start in data. +// It returns the lo and hi byte offset of the matched region within data. +func addrToByteRange(addr string, start int, data []byte) (lo, hi int, err error) { + if addr == "" { + lo, hi = start, len(data) + return + } + var ( + dir byte + prevc byte + charOffset bool + ) + lo = start + hi = start + for addr != "" && err == nil { + c := addr[0] + switch c { + default: + err = errors.New("invalid address syntax near " + string(c)) + case ',': + if len(addr) == 1 { + hi = len(data) + } else { + _, hi, err = addrToByteRange(addr[1:], hi, data) + } + return + + case '+', '-': + if prevc == '+' || prevc == '-' { + lo, hi, err = addrNumber(data, lo, hi, prevc, 1, charOffset) + } + dir = c + + case '$': + lo = len(data) + hi = len(data) + if len(addr) > 1 { + dir = '+' + } + + case '#': + charOffset = true + + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + var i int + for i = 1; i < len(addr); i++ { + if addr[i] < '0' || addr[i] > '9' { + break + } + } + var n int + n, err = strconv.Atoi(addr[0:i]) + if err != nil { + break + } + lo, hi, err = addrNumber(data, lo, hi, dir, n, charOffset) + dir = 0 + charOffset = false + prevc = c + addr = addr[i:] + continue + + case '/': + var i, j int + Regexp: + for i = 1; i < len(addr); i++ { + switch addr[i] { + case '\\': + i++ + case '/': + j = i + 1 + break Regexp + } + } + if j == 0 { + j = i + } + pattern := addr[1:i] + lo, hi, err = addrRegexp(data, lo, hi, dir, pattern) + prevc = c + addr = addr[j:] + continue + } + prevc = c + addr = addr[1:] + } + + if err == nil && dir != 0 { + lo, hi, err = addrNumber(data, lo, hi, dir, 1, charOffset) + } + if err != nil { + return 0, 0, err + } + return lo, hi, nil +} + +// addrNumber applies the given dir, n, and charOffset to the address lo, hi. +// dir is '+' or '-', n is the count, and charOffset is true if the syntax +// used was #n. Applying +n (or +#n) means to advance n lines +// (or characters) after hi. Applying -n (or -#n) means to back up n lines +// (or characters) before lo. +// The return value is the new lo, hi. +func addrNumber(data []byte, lo, hi int, dir byte, n int, charOffset bool) (int, int, error) { + switch dir { + case 0: + lo = 0 + hi = 0 + fallthrough + + case '+': + if charOffset { + pos := hi + for ; n > 0 && pos < len(data); n-- { + _, size := utf8.DecodeRune(data[pos:]) + pos += size + } + if n == 0 { + return pos, pos, nil + } + break + } + // find next beginning of line + if hi > 0 { + for hi < len(data) && data[hi-1] != '\n' { + hi++ + } + } + lo = hi + if n == 0 { + return lo, hi, nil + } + for ; hi < len(data); hi++ { + if data[hi] != '\n' { + continue + } + switch n--; n { + case 1: + lo = hi + 1 + case 0: + return lo, hi + 1, nil + } + } + + case '-': + if charOffset { + // Scan backward for bytes that are not UTF-8 continuation bytes. + pos := lo + for ; pos > 0 && n > 0; pos-- { + if data[pos]&0xc0 != 0x80 { + n-- + } + } + if n == 0 { + return pos, pos, nil + } + break + } + // find earlier beginning of line + for lo > 0 && data[lo-1] != '\n' { + lo-- + } + hi = lo + if n == 0 { + return lo, hi, nil + } + for ; lo >= 0; lo-- { + if lo > 0 && data[lo-1] != '\n' { + continue + } + switch n--; n { + case 1: + hi = lo + case 0: + return lo, hi, nil + } + } + } + + return 0, 0, errors.New("address out of range") +} + +// addrRegexp searches for pattern in the given direction starting at lo, hi. +// The direction dir is '+' (search forward from hi) or '-' (search backward from lo). +// Backward searches are unimplemented. +func addrRegexp(data []byte, lo, hi int, dir byte, pattern string) (int, int, error) { + // We want ^ and $ to work as in sam/acme, so use ?m. + re, err := regexp.Compile("(?m:" + pattern + ")") + if err != nil { + return 0, 0, err + } + if dir == '-' { + // Could implement reverse search using binary search + // through file, but that seems like overkill. + return 0, 0, errors.New("reverse search not implemented") + } + m := re.FindIndex(data[hi:]) + if len(m) > 0 { + m[0] += hi + m[1] += hi + } else if hi > 0 { + // No match. Wrap to beginning of data. + m = re.FindIndex(data) + } + if len(m) == 0 { + return 0, 0, errors.New("no match for " + pattern) + } + return m[0], m[1], nil +} diff --git a/vendor/golang.org/x/tools/present/background.go b/vendor/golang.org/x/tools/present/background.go new file mode 100644 index 0000000000..0a6216ab00 --- /dev/null +++ b/vendor/golang.org/x/tools/present/background.go @@ -0,0 +1,25 @@ +// Copyright 2016 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 present + +import ( + "strings" +) + +func init() { + Register("background", parseBackground) +} + +type Background struct { + URL string +} + +func (i Background) TemplateName() string { return "background" } + +func parseBackground(ctx *Context, fileName string, lineno int, text string) (Elem, error) { + args := strings.Fields(text) + background := Background{URL: args[1]} + return background, nil +} diff --git a/vendor/golang.org/x/tools/present/caption.go b/vendor/golang.org/x/tools/present/caption.go new file mode 100644 index 0000000000..00e0b5d058 --- /dev/null +++ b/vendor/golang.org/x/tools/present/caption.go @@ -0,0 +1,22 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package present + +import "strings" + +func init() { + Register("caption", parseCaption) +} + +type Caption struct { + Text string +} + +func (c Caption) TemplateName() string { return "caption" } + +func parseCaption(_ *Context, _ string, _ int, text string) (Elem, error) { + text = strings.TrimSpace(strings.TrimPrefix(text, ".caption")) + return Caption{text}, nil +} diff --git a/vendor/golang.org/x/tools/present/code.go b/vendor/golang.org/x/tools/present/code.go new file mode 100644 index 0000000000..5a29951413 --- /dev/null +++ b/vendor/golang.org/x/tools/present/code.go @@ -0,0 +1,293 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package present + +import ( + "bufio" + "bytes" + "fmt" + "html/template" + "path/filepath" + "regexp" + "strconv" + "strings" +) + +// Is the playground available? +var PlayEnabled = false + +// TOOD(adg): replace the PlayEnabled flag with something less spaghetti-like. +// Instead this will probably be determined by a template execution Context +// value that contains various global metadata required when rendering +// templates. + +func init() { + Register("code", parseCode) + Register("play", parseCode) +} + +type Code struct { + Text template.HTML + Play bool // runnable code + FileName string // file name + Ext string // file extension + Raw []byte // content of the file +} + +func (c Code) TemplateName() string { return "code" } + +// The input line is a .code or .play entry with a file name and an optional HLfoo marker on the end. +// Anything between the file and HL (if any) is an address expression, which we treat as a string here. +// We pick off the HL first, for easy parsing. +var ( + highlightRE = regexp.MustCompile(`\s+HL([a-zA-Z0-9_]+)?$`) + hlCommentRE = regexp.MustCompile(`(.+) // HL(.*)$`) + codeRE = regexp.MustCompile(`\.(code|play)\s+((?:(?:-edit|-numbers)\s+)*)([^\s]+)(?:\s+(.*))?$`) +) + +// parseCode parses a code present directive. Its syntax: +// .code [-numbers] [-edit] [address] [highlight] +// The directive may also be ".play" if the snippet is executable. +func parseCode(ctx *Context, sourceFile string, sourceLine int, cmd string) (Elem, error) { + cmd = strings.TrimSpace(cmd) + + // Pull off the HL, if any, from the end of the input line. + highlight := "" + if hl := highlightRE.FindStringSubmatchIndex(cmd); len(hl) == 4 { + highlight = cmd[hl[2]:hl[3]] + cmd = cmd[:hl[2]-2] + } + + // Parse the remaining command line. + // Arguments: + // args[0]: whole match + // args[1]: .code/.play + // args[2]: flags ("-edit -numbers") + // args[3]: file name + // args[4]: optional address + args := codeRE.FindStringSubmatch(cmd) + if len(args) != 5 { + return nil, fmt.Errorf("%s:%d: syntax error for .code/.play invocation", sourceFile, sourceLine) + } + command, flags, file, addr := args[1], args[2], args[3], strings.TrimSpace(args[4]) + play := command == "play" && PlayEnabled + + // Read in code file and (optionally) match address. + filename := filepath.Join(filepath.Dir(sourceFile), file) + textBytes, err := ctx.ReadFile(filename) + if err != nil { + return nil, fmt.Errorf("%s:%d: %v", sourceFile, sourceLine, err) + } + lo, hi, err := addrToByteRange(addr, 0, textBytes) + if err != nil { + return nil, fmt.Errorf("%s:%d: %v", sourceFile, sourceLine, err) + } + + // Acme pattern matches can stop mid-line, + // so run to end of line in both directions if not at line start/end. + for lo > 0 && textBytes[lo-1] != '\n' { + lo-- + } + if hi > 0 { + for hi < len(textBytes) && textBytes[hi-1] != '\n' { + hi++ + } + } + + lines := codeLines(textBytes, lo, hi) + + data := &codeTemplateData{ + Lines: formatLines(lines, highlight), + Edit: strings.Contains(flags, "-edit"), + Numbers: strings.Contains(flags, "-numbers"), + } + + // Include before and after in a hidden span for playground code. + if play { + data.Prefix = textBytes[:lo] + data.Suffix = textBytes[hi:] + } + + var buf bytes.Buffer + if err := codeTemplate.Execute(&buf, data); err != nil { + return nil, err + } + return Code{ + Text: template.HTML(buf.String()), + Play: play, + FileName: filepath.Base(filename), + Ext: filepath.Ext(filename), + Raw: rawCode(lines), + }, nil +} + +// formatLines returns a new slice of codeLine with the given lines +// replacing tabs with spaces and adding highlighting where needed. +func formatLines(lines []codeLine, highlight string) []codeLine { + formatted := make([]codeLine, len(lines)) + for i, line := range lines { + // Replace tabs with spaces, which work better in HTML. + line.L = strings.Replace(line.L, "\t", " ", -1) + + // Highlight lines that end with "// HL[highlight]" + // and strip the magic comment. + if m := hlCommentRE.FindStringSubmatch(line.L); m != nil { + line.L = m[1] + line.HL = m[2] == highlight + } + + formatted[i] = line + } + return formatted +} + +// rawCode returns the code represented by the given codeLines without any kind +// of formatting. +func rawCode(lines []codeLine) []byte { + b := new(bytes.Buffer) + for _, line := range lines { + b.WriteString(line.L) + b.WriteByte('\n') + } + return b.Bytes() +} + +type codeTemplateData struct { + Lines []codeLine + Prefix, Suffix []byte + Edit, Numbers bool +} + +var leadingSpaceRE = regexp.MustCompile(`^[ \t]*`) + +var codeTemplate = template.Must(template.New("code").Funcs(template.FuncMap{ + "trimSpace": strings.TrimSpace, + "leadingSpace": leadingSpaceRE.FindString, +}).Parse(codeTemplateHTML)) + +const codeTemplateHTML = ` +{{with .Prefix}}
    {{printf "%s" .}}
    {{end}} + +{{/* + */}}{{range .Lines}}{{/* + */}}{{if .HL}}{{leadingSpace .L}}{{trimSpace .L}}{{/* + */}}{{else}}{{.L}}{{end}}{{/* +*/}} +{{end}}
    + +{{with .Suffix}}
    {{printf "%s" .}}
    {{end}} +` + +// codeLine represents a line of code extracted from a source file. +type codeLine struct { + L string // The line of code. + N int // The line number from the source file. + HL bool // Whether the line should be highlighted. +} + +// codeLines takes a source file and returns the lines that +// span the byte range specified by start and end. +// It discards lines that end in "OMIT". +func codeLines(src []byte, start, end int) (lines []codeLine) { + startLine := 1 + for i, b := range src { + if i == start { + break + } + if b == '\n' { + startLine++ + } + } + s := bufio.NewScanner(bytes.NewReader(src[start:end])) + for n := startLine; s.Scan(); n++ { + l := s.Text() + if strings.HasSuffix(l, "OMIT") { + continue + } + lines = append(lines, codeLine{L: l, N: n}) + } + // Trim leading and trailing blank lines. + for len(lines) > 0 && len(lines[0].L) == 0 { + lines = lines[1:] + } + for len(lines) > 0 && len(lines[len(lines)-1].L) == 0 { + lines = lines[:len(lines)-1] + } + return +} + +func parseArgs(name string, line int, args []string) (res []interface{}, err error) { + res = make([]interface{}, len(args)) + for i, v := range args { + if len(v) == 0 { + return nil, fmt.Errorf("%s:%d bad code argument %q", name, line, v) + } + switch v[0] { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + n, err := strconv.Atoi(v) + if err != nil { + return nil, fmt.Errorf("%s:%d bad code argument %q", name, line, v) + } + res[i] = n + case '/': + if len(v) < 2 || v[len(v)-1] != '/' { + return nil, fmt.Errorf("%s:%d bad code argument %q", name, line, v) + } + res[i] = v + case '$': + res[i] = "$" + case '_': + if len(v) == 1 { + // Do nothing; "_" indicates an intentionally empty parameter. + break + } + fallthrough + default: + return nil, fmt.Errorf("%s:%d bad code argument %q", name, line, v) + } + } + return +} + +// parseArg returns the integer or string value of the argument and tells which it is. +func parseArg(arg interface{}, max int) (ival int, sval string, isInt bool, err error) { + switch n := arg.(type) { + case int: + if n <= 0 || n > max { + return 0, "", false, fmt.Errorf("%d is out of range", n) + } + return n, "", true, nil + case string: + return 0, n, false, nil + } + return 0, "", false, fmt.Errorf("unrecognized argument %v type %T", arg, arg) +} + +// match identifies the input line that matches the pattern in a code invocation. +// If start>0, match lines starting there rather than at the beginning. +// The return value is 1-indexed. +func match(file string, start int, lines []string, pattern string) (int, error) { + // $ matches the end of the file. + if pattern == "$" { + if len(lines) == 0 { + return 0, fmt.Errorf("%q: empty file", file) + } + return len(lines), nil + } + // /regexp/ matches the line that matches the regexp. + if len(pattern) > 2 && pattern[0] == '/' && pattern[len(pattern)-1] == '/' { + re, err := regexp.Compile(pattern[1 : len(pattern)-1]) + if err != nil { + return 0, err + } + for i := start; i < len(lines); i++ { + if re.MatchString(lines[i]) { + return i + 1, nil + } + } + return 0, fmt.Errorf("%s: no match for %#q", file, pattern) + } + return 0, fmt.Errorf("unrecognized pattern: %q", pattern) +} diff --git a/vendor/golang.org/x/tools/present/doc.go b/vendor/golang.org/x/tools/present/doc.go new file mode 100644 index 0000000000..351c5812c5 --- /dev/null +++ b/vendor/golang.org/x/tools/present/doc.go @@ -0,0 +1,228 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +The present file format + +Present files have the following format. The first non-blank non-comment +line is the title, so the header looks like + + Title of document + Subtitle of document + 15:04 2 Jan 2006 + Tags: foo, bar, baz + + Author Name + Job title, Company + joe@example.com + http://url/ + @twitter_name + +The subtitle, date, and tags lines are optional. + +The date line may be written without a time: + 2 Jan 2006 +In this case, the time will be interpreted as 10am UTC on that date. + +The tags line is a comma-separated list of tags that may be used to categorize +the document. + +The author section may contain a mixture of text, twitter names, and links. +For slide presentations, only the plain text lines will be displayed on the +first slide. + +Multiple presenters may be specified, separated by a blank line. + +After that come slides/sections, each after a blank line: + + * Title of slide or section (must have asterisk) + + Some Text + + ** Subsection + + - bullets + - more bullets + - a bullet with + + *** Sub-subsection + + Some More text + + Preformatted text + is indented (however you like) + + Further Text, including invocations like: + + .code x.go /^func main/,/^}/ + .play y.go + .image image.jpg + .background image.jpg + .iframe http://foo + .link http://foo label + .html file.html + .caption _Gopher_ by [[http://www.reneefrench.com][Renée French]] + + Again, more text + +Blank lines are OK (not mandatory) after the title and after the +text. Text, bullets, and .code etc. are all optional; title is +not. + +Lines starting with # in column 1 are commentary. + +Fonts: + +Within the input for plain text or lists, text bracketed by font +markers will be presented in italic, bold, or program font. +Marker characters are _ (italic), * (bold) and ` (program font). +Unmatched markers appear as plain text. +Within marked text, a single marker character becomes a space +and a doubled single marker quotes the marker character. + + _italic_ + *bold* + `program` + _this_is_all_italic_ + _Why_use_scoped__ptr_? Use plain ***ptr* instead. + +Inline links: + +Links can be included in any text with the form [[url][label]], or +[[url]] to use the URL itself as the label. + +Functions: + +A number of template functions are available through invocations +in the input text. Each such invocation contains a period as the +first character on the line, followed immediately by the name of +the function, followed by any arguments. A typical invocation might +be + .play demo.go /^func show/,/^}/ +(except that the ".play" must be at the beginning of the line and +not be indented like this.) + +Here follows a description of the functions: + +code: + +Injects program source into the output by extracting code from files +and injecting them as HTML-escaped
     blocks.  The argument is
    +a file name followed by an optional address that specifies what
    +section of the file to display. The address syntax is similar in
    +its simplest form to that of ed, but comes from sam and is more
    +general. See
    +	http://plan9.bell-labs.com/sys/doc/sam/sam.html Table II
    +for full details. The displayed block is always rounded out to a
    +full line at both ends.
    +
    +If no pattern is present, the entire file is displayed.
    +
    +Any line in the program that ends with the four characters
    +	OMIT
    +is deleted from the source before inclusion, making it easy
    +to write things like
    +	.code test.go /START OMIT/,/END OMIT/
    +to find snippets like this
    +	tedious_code = boring_function()
    +	// START OMIT
    +	interesting_code = fascinating_function()
    +	// END OMIT
    +and see only this:
    +	interesting_code = fascinating_function()
    +
    +Also, inside the displayed text a line that ends
    +	// HL
    +will be highlighted in the display; the 'h' key in the browser will
    +toggle extra emphasis of any highlighted lines. A highlighting mark
    +may have a suffix word, such as
    +	// HLxxx
    +Such highlights are enabled only if the code invocation ends with
    +"HL" followed by the word:
    +	.code test.go /^type Foo/,/^}/ HLxxx
    +
    +The .code function may take one or more flags immediately preceding
    +the filename. This command shows test.go in an editable text area:
    +	.code -edit test.go
    +This command shows test.go with line numbers:
    +	.code -numbers test.go
    +
    +play:
    +
    +The function "play" is the same as "code" but puts a button
    +on the displayed source so the program can be run from the browser.
    +Although only the selected text is shown, all the source is included
    +in the HTML output so it can be presented to the compiler.
    +
    +link:
    +
    +Create a hyperlink. The syntax is 1 or 2 space-separated arguments.
    +The first argument is always the HTTP URL.  If there is a second
    +argument, it is the text label to display for this link.
    +
    +	.link http://golang.org golang.org
    +
    +image:
    +
    +The template uses the function "image" to inject picture files.
    +
    +The syntax is simple: 1 or 3 space-separated arguments.
    +The first argument is always the file name.
    +If there are more arguments, they are the height and width;
    +both must be present, or substituted with an underscore.
    +Replacing a dimension argument with the underscore parameter
    +preserves the aspect ratio of the image when scaling.
    +
    +	.image images/betsy.jpg 100 200
    +
    +	.image images/janet.jpg _ 300
    +
    +video:
    +
    +The template uses the function "video" to inject video files.
    +
    +The syntax is simple: 2 or 4 space-separated arguments.
    +The first argument is always the file name.
    +The second argument is always the file content-type.
    +If there are more arguments, they are the height and width;
    +both must be present, or substituted with an underscore.
    +Replacing a dimension argument with the underscore parameter
    +preserves the aspect ratio of the video when scaling.
    +
    +	.video videos/evangeline.mp4 video/mp4 400 600
    +
    +	.video videos/mabel.ogg video/ogg 500 _
    +
    +background:
    +
    +The template uses the function "background" to set the background image for
    +a slide.  The only argument is the file name of the image.
    +
    +	.background images/susan.jpg
    +
    +caption:
    +
    +The template uses the function "caption" to inject figure captions.
    +
    +The text after ".caption" is embedded in a figcaption element after
    +processing styling and links as in standard text lines.
    +
    +	.caption _Gopher_ by [[http://www.reneefrench.com][Renée French]]
    +
    +iframe:
    +
    +The function "iframe" injects iframes (pages inside pages).
    +Its syntax is the same as that of image.
    +
    +html:
    +
    +The function html includes the contents of the specified file as
    +unescaped HTML. This is useful for including custom HTML elements
    +that cannot be created using only the slide format.
    +It is your responsibilty to make sure the included HTML is valid and safe.
    +
    +	.html file.html
    +
    +*/
    +package present // import "golang.org/x/tools/present"
    diff --git a/vendor/golang.org/x/tools/present/html.go b/vendor/golang.org/x/tools/present/html.go
    new file mode 100644
    index 0000000000..cca90ef4af
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/present/html.go
    @@ -0,0 +1,31 @@
    +package present
    +
    +import (
    +	"errors"
    +	"html/template"
    +	"path/filepath"
    +	"strings"
    +)
    +
    +func init() {
    +	Register("html", parseHTML)
    +}
    +
    +func parseHTML(ctx *Context, fileName string, lineno int, text string) (Elem, error) {
    +	p := strings.Fields(text)
    +	if len(p) != 2 {
    +		return nil, errors.New("invalid .html args")
    +	}
    +	name := filepath.Join(filepath.Dir(fileName), p[1])
    +	b, err := ctx.ReadFile(name)
    +	if err != nil {
    +		return nil, err
    +	}
    +	return HTML{template.HTML(b)}, nil
    +}
    +
    +type HTML struct {
    +	template.HTML
    +}
    +
    +func (s HTML) TemplateName() string { return "html" }
    diff --git a/vendor/golang.org/x/tools/present/iframe.go b/vendor/golang.org/x/tools/present/iframe.go
    new file mode 100644
    index 0000000000..2f3c5e55a8
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/present/iframe.go
    @@ -0,0 +1,45 @@
    +// Copyright 2013 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 present
    +
    +import (
    +	"fmt"
    +	"strings"
    +)
    +
    +func init() {
    +	Register("iframe", parseIframe)
    +}
    +
    +type Iframe struct {
    +	URL    string
    +	Width  int
    +	Height int
    +}
    +
    +func (i Iframe) TemplateName() string { return "iframe" }
    +
    +func parseIframe(ctx *Context, fileName string, lineno int, text string) (Elem, error) {
    +	args := strings.Fields(text)
    +	i := Iframe{URL: args[1]}
    +	a, err := parseArgs(fileName, lineno, args[2:])
    +	if err != nil {
    +		return nil, err
    +	}
    +	switch len(a) {
    +	case 0:
    +		// no size parameters
    +	case 2:
    +		if v, ok := a[0].(int); ok {
    +			i.Height = v
    +		}
    +		if v, ok := a[1].(int); ok {
    +			i.Width = v
    +		}
    +	default:
    +		return nil, fmt.Errorf("incorrect image invocation: %q", text)
    +	}
    +	return i, nil
    +}
    diff --git a/vendor/golang.org/x/tools/present/image.go b/vendor/golang.org/x/tools/present/image.go
    new file mode 100644
    index 0000000000..cfa2af9ba2
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/present/image.go
    @@ -0,0 +1,50 @@
    +// Copyright 2012 The Go Authors. All rights reserved.
    +// Use of this source code is governed by a BSD-style
    +// license that can be found in the LICENSE file.
    +
    +package present
    +
    +import (
    +	"fmt"
    +	"strings"
    +)
    +
    +func init() {
    +	Register("image", parseImage)
    +}
    +
    +type Image struct {
    +	URL    string
    +	Width  int
    +	Height int
    +}
    +
    +func (i Image) TemplateName() string { return "image" }
    +
    +func parseImage(ctx *Context, fileName string, lineno int, text string) (Elem, error) {
    +	args := strings.Fields(text)
    +	img := Image{URL: args[1]}
    +	a, err := parseArgs(fileName, lineno, args[2:])
    +	if err != nil {
    +		return nil, err
    +	}
    +	switch len(a) {
    +	case 0:
    +		// no size parameters
    +	case 2:
    +		// If a parameter is empty (underscore) or invalid
    +		// leave the field set to zero. The "image" action
    +		// template will then omit that img tag attribute and
    +		// the browser will calculate the value to preserve
    +		// the aspect ratio.
    +		if v, ok := a[0].(int); ok {
    +			img.Height = v
    +		}
    +		if v, ok := a[1].(int); ok {
    +			img.Width = v
    +		}
    +	default:
    +		return nil, fmt.Errorf("incorrect image invocation: %q", text)
    +	}
    +	return img, nil
    +}
    diff --git a/vendor/golang.org/x/tools/present/link.go b/vendor/golang.org/x/tools/present/link.go
    new file mode 100644
    index 0000000000..6b0968fb74
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/present/link.go
    @@ -0,0 +1,97 @@
    +// Copyright 2012 The Go Authors. All rights reserved.
    +// Use of this source code is governed by a BSD-style
    +// license that can be found in the LICENSE file.
    +
    +package present
    +
    +import (
    +	"fmt"
    +	"log"
    +	"net/url"
    +	"strings"
    +)
    +
    +func init() {
    +	Register("link", parseLink)
    +}
    +
    +type Link struct {
    +	URL   *url.URL
    +	Label string
    +}
    +
    +func (l Link) TemplateName() string { return "link" }
    +
    +func parseLink(ctx *Context, fileName string, lineno int, text string) (Elem, error) {
    +	args := strings.Fields(text)
    +	url, err := url.Parse(args[1])
    +	if err != nil {
    +		return nil, err
    +	}
    +	label := ""
    +	if len(args) > 2 {
    +		label = strings.Join(args[2:], " ")
    +	} else {
    +		scheme := url.Scheme + "://"
    +		if url.Scheme == "mailto" {
    +			scheme = "mailto:"
    +		}
    +		label = strings.Replace(url.String(), scheme, "", 1)
    +	}
    +	return Link{url, label}, nil
    +}
    +
    +func renderLink(href, text string) string {
    +	text = font(text)
    +	if text == "" {
    +		text = href
    +	}
    +	// Open links in new window only when their url is absolute.
    +	target := "_blank"
    +	if u, err := url.Parse(href); err != nil {
    +		log.Println("rendernLink parsing url:", err)
    +	} else if !u.IsAbs() || u.Scheme == "javascript" {
    +		target = "_self"
    +	}
    +
    +	return fmt.Sprintf(`%s`, href, target, text)
    +}
    +
    +// parseInlineLink parses an inline link at the start of s, and returns
    +// a rendered HTML link and the total length of the raw inline link.
    +// If no inline link is present, it returns all zeroes.
    +func parseInlineLink(s string) (link string, length int) {
    +	if !strings.HasPrefix(s, "[[") {
    +		return
    +	}
    +	end := strings.Index(s, "]]")
    +	if end == -1 {
    +		return
    +	}
    +	urlEnd := strings.Index(s, "]")
    +	rawURL := s[2:urlEnd]
    +	const badURLChars = `<>"{}|\^[] ` + "`" // per RFC2396 section 2.4.3
    +	if strings.ContainsAny(rawURL, badURLChars) {
    +		return
    +	}
    +	if urlEnd == end {
    +		simpleUrl := ""
    +		url, err := url.Parse(rawURL)
    +		if err == nil {
    +			// If the URL is http://foo.com, drop the http://
    +			// In other words, render [[http://golang.org]] as:
    +			//   golang.org
    +			if strings.HasPrefix(rawURL, url.Scheme+"://") {
    +				simpleUrl = strings.TrimPrefix(rawURL, url.Scheme+"://")
    +			} else if strings.HasPrefix(rawURL, url.Scheme+":") {
    +				simpleUrl = strings.TrimPrefix(rawURL, url.Scheme+":")
    +			}
    +		}
    +		return renderLink(rawURL, simpleUrl), end + 2
    +	}
    +	if s[urlEnd:urlEnd+2] != "][" {
    +		return
    +	}
    +	text := s[urlEnd+2 : end]
    +	return renderLink(rawURL, text), end + 2
    +}
    diff --git a/vendor/golang.org/x/tools/present/link_test.go b/vendor/golang.org/x/tools/present/link_test.go
    new file mode 100644
    index 0000000000..334e72bdcc
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/present/link_test.go
    @@ -0,0 +1,40 @@
    +// Copyright 2012 The Go Authors. All rights reserved.
    +// Use of this source code is governed by a BSD-style
    +// license that can be found in the LICENSE file.
    +
    +package present
    +
    +import "testing"
    +
    +func TestInlineParsing(t *testing.T) {
    +	var tests = []struct {
    +		in     string
    +		link   string
    +		text   string
    +		length int
    +	}{
    +		{"[[http://golang.org]]", "http://golang.org", "golang.org", 21},
    +		{"[[http://golang.org][]]", "http://golang.org", "http://golang.org", 23},
    +		{"[[http://golang.org]] this is ignored", "http://golang.org", "golang.org", 21},
    +		{"[[http://golang.org][link]]", "http://golang.org", "link", 27},
    +		{"[[http://golang.org][two words]]", "http://golang.org", "two words", 32},
    +		{"[[http://golang.org][*link*]]", "http://golang.org", "link", 29},
    +		{"[[http://bad[url]]", "", "", 0},
    +		{"[[http://golang.org][a [[link]] ]]", "http://golang.org", "a [[link", 31},
    +		{"[[http:// *spaces* .com]]", "", "", 0},
    +		{"[[http://bad`char.com]]", "", "", 0},
    +		{" [[http://google.com]]", "", "", 0},
    +		{"[[mailto:gopher@golang.org][Gopher]]", "mailto:gopher@golang.org", "Gopher", 36},
    +		{"[[mailto:gopher@golang.org]]", "mailto:gopher@golang.org", "gopher@golang.org", 28},
    +	}
    +
    +	for i, test := range tests {
    +		link, length := parseInlineLink(test.in)
    +		if length == 0 && test.length == 0 {
    +			continue
    +		}
    +		if a := renderLink(test.link, test.text); length != test.length || link != a {
    +			t.Errorf("#%d: parseInlineLink(%q):\ngot\t%q, %d\nwant\t%q, %d", i, test.in, link, length, a, test.length)
    +		}
    +	}
    +}
    diff --git a/vendor/golang.org/x/tools/present/parse.go b/vendor/golang.org/x/tools/present/parse.go
    new file mode 100644
    index 0000000000..034a83cb30
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/present/parse.go
    @@ -0,0 +1,506 @@
    +// Copyright 2011 The Go Authors. All rights reserved.
    +// Use of this source code is governed by a BSD-style
    +// license that can be found in the LICENSE file.
    +
    +package present
    +
    +import (
    +	"bufio"
    +	"bytes"
    +	"errors"
    +	"fmt"
    +	"html/template"
    +	"io"
    +	"io/ioutil"
    +	"log"
    +	"net/url"
    +	"regexp"
    +	"strings"
    +	"time"
    +	"unicode"
    +	"unicode/utf8"
    +)
    +
    +var (
    +	parsers = make(map[string]ParseFunc)
    +	funcs   = template.FuncMap{}
    +)
    +
    +// Template returns an empty template with the action functions in its FuncMap.
    +func Template() *template.Template {
    +	return template.New("").Funcs(funcs)
    +}
    +
    +// Render renders the doc to the given writer using the provided template.
    +func (d *Doc) Render(w io.Writer, t *template.Template) error {
    +	data := struct {
    +		*Doc
    +		Template    *template.Template
    +		PlayEnabled bool
    +	}{d, t, PlayEnabled}
    +	return t.ExecuteTemplate(w, "root", data)
    +}
    +
    +// Render renders the section to the given writer using the provided template.
    +func (s *Section) Render(w io.Writer, t *template.Template) error {
    +	data := struct {
    +		*Section
    +		Template    *template.Template
    +		PlayEnabled bool
    +	}{s, t, PlayEnabled}
    +	return t.ExecuteTemplate(w, "section", data)
    +}
    +
    +type ParseFunc func(ctx *Context, fileName string, lineNumber int, inputLine string) (Elem, error)
    +
    +// Register binds the named action, which does not begin with a period, to the
    +// specified parser to be invoked when the name, with a period, appears in the
    +// present input text.
    +func Register(name string, parser ParseFunc) {
    +	if len(name) == 0 || name[0] == ';' {
    +		panic("bad name in Register: " + name)
    +	}
    +	parsers["."+name] = parser
    +}
    +
    +// Doc represents an entire document.
    +type Doc struct {
    +	Title    string
    +	Subtitle string
    +	Time     time.Time
    +	Authors  []Author
    +	Sections []Section
    +	Tags     []string
    +}
    +
    +// Author represents the person who wrote and/or is presenting the document.
    +type Author struct {
    +	Elem []Elem
    +}
    +
    +// TextElem returns the first text elements of the author details.
    +// This is used to display the author' name, job title, and company
    +// without the contact details.
    +func (p *Author) TextElem() (elems []Elem) {
    +	for _, el := range p.Elem {
    +		if _, ok := el.(Text); !ok {
    +			break
    +		}
    +		elems = append(elems, el)
    +	}
    +	return
    +}
    +
    +// Section represents a section of a document (such as a presentation slide)
    +// comprising a title and a list of elements.
    +type Section struct {
    +	Number []int
    +	Title  string
    +	Elem   []Elem
    +}
    +
    +func (s Section) Sections() (sections []Section) {
    +	for _, e := range s.Elem {
    +		if section, ok := e.(Section); ok {
    +			sections = append(sections, section)
    +		}
    +	}
    +	return
    +}
    +
    +// Level returns the level of the given section.
    +// The document title is level 1, main section 2, etc.
    +func (s Section) Level() int {
    +	return len(s.Number) + 1
    +}
    +
    +// FormattedNumber returns a string containing the concatenation of the
    +// numbers identifying a Section.
    +func (s Section) FormattedNumber() string {
    +	b := &bytes.Buffer{}
    +	for _, n := range s.Number {
    +		fmt.Fprintf(b, "%v.", n)
    +	}
    +	return b.String()
    +}
    +
    +func (s Section) TemplateName() string { return "section" }
    +
    +// Elem defines the interface for a present element. That is, something that
    +// can provide the name of the template used to render the element.
    +type Elem interface {
    +	TemplateName() string
    +}
    +
    +// renderElem implements the elem template function, used to render
    +// sub-templates.
    +func renderElem(t *template.Template, e Elem) (template.HTML, error) {
    +	var data interface{} = e
    +	if s, ok := e.(Section); ok {
    +		data = struct {
    +			Section
    +			Template *template.Template
    +		}{s, t}
    +	}
    +	return execTemplate(t, e.TemplateName(), data)
    +}
    +
    +func init() {
    +	funcs["elem"] = renderElem
    +}
    +
    +// execTemplate is a helper to execute a template and return the output as a
    +// template.HTML value.
    +func execTemplate(t *template.Template, name string, data interface{}) (template.HTML, error) {
    +	b := new(bytes.Buffer)
    +	err := t.ExecuteTemplate(b, name, data)
    +	if err != nil {
    +		return "", err
    +	}
    +	return template.HTML(b.String()), nil
    +}
    +
    +// Text represents an optionally preformatted paragraph.
    +type Text struct {
    +	Lines []string
    +	Pre   bool
    +}
    +
    +func (t Text) TemplateName() string { return "text" }
    +
    +// List represents a bulleted list.
    +type List struct {
    +	Bullet []string
    +}
    +
    +func (l List) TemplateName() string { return "list" }
    +
    +// Lines is a helper for parsing line-based input.
    +type Lines struct {
    +	line int // 0 indexed, so has 1-indexed number of last line returned
    +	text []string
    +}
    +
    +func readLines(r io.Reader) (*Lines, error) {
    +	var lines []string
    +	s := bufio.NewScanner(r)
    +	for s.Scan() {
    +		lines = append(lines, s.Text())
    +	}
    +	if err := s.Err(); err != nil {
    +		return nil, err
    +	}
    +	return &Lines{0, lines}, nil
    +}
    +
    +func (l *Lines) next() (text string, ok bool) {
    +	for {
    +		current := l.line
    +		l.line++
    +		if current >= len(l.text) {
    +			return "", false
    +		}
    +		text = l.text[current]
    +		// Lines starting with # are comments.
    +		if len(text) == 0 || text[0] != '#' {
    +			ok = true
    +			break
    +		}
    +	}
    +	return
    +}
    +
    +func (l *Lines) back() {
    +	l.line--
    +}
    +
    +func (l *Lines) nextNonEmpty() (text string, ok bool) {
    +	for {
    +		text, ok = l.next()
    +		if !ok {
    +			return
    +		}
    +		if len(text) > 0 {
    +			break
    +		}
    +	}
    +	return
    +}
    +
    +// A Context specifies the supporting context for parsing a presentation.
    +type Context struct {
    +	// ReadFile reads the file named by filename and returns the contents.
    +	ReadFile func(filename string) ([]byte, error)
    +}
    +
    +// ParseMode represents flags for the Parse function.
    +type ParseMode int
    +
    +const (
    +	// If set, parse only the title and subtitle.
    +	TitlesOnly ParseMode = 1
    +)
    +
    +// Parse parses a document from r.
    +func (ctx *Context) Parse(r io.Reader, name string, mode ParseMode) (*Doc, error) {
    +	doc := new(Doc)
    +	lines, err := readLines(r)
    +	if err != nil {
    +		return nil, err
    +	}
    +	err = parseHeader(doc, lines)
    +	if err != nil {
    +		return nil, err
    +	}
    +	if mode&TitlesOnly != 0 {
    +		return doc, nil
    +	}
    +	// Authors
    +	if doc.Authors, err = parseAuthors(lines); err != nil {
    +		return nil, err
    +	}
    +	// Sections
    +	if doc.Sections, err = parseSections(ctx, name, lines, []int{}, doc); err != nil {
    +		return nil, err
    +	}
    +	return doc, nil
    +}
    +
    +// Parse parses a document from r. Parse reads assets used by the presentation
    +// from the file system using ioutil.ReadFile.
    +func Parse(r io.Reader, name string, mode ParseMode) (*Doc, error) {
    +	ctx := Context{ReadFile: ioutil.ReadFile}
    +	return ctx.Parse(r, name, mode)
    +}
    +
    +// isHeading matches any section heading.
    +var isHeading = regexp.MustCompile(`^\*+ `)
    +
    +// lesserHeading returns true if text is a heading of a lesser or equal level
    +// than that denoted by prefix.
    +func lesserHeading(text, prefix string) bool {
    +	return isHeading.MatchString(text) && !strings.HasPrefix(text, prefix+"*")
    +}
    +
    +// parseSections parses Sections from lines for the section level indicated by
    +// number (a nil number indicates the top level).
    +func parseSections(ctx *Context, name string, lines *Lines, number []int, doc *Doc) ([]Section, error) {
    +	var sections []Section
    +	for i := 1; ; i++ {
    +		// Next non-empty line is title.
    +		text, ok := lines.nextNonEmpty()
    +		for ok && text == "" {
    +			text, ok = lines.next()
    +		}
    +		if !ok {
    +			break
    +		}
    +		prefix := strings.Repeat("*", len(number)+1)
    +		if !strings.HasPrefix(text, prefix+" ") {
    +			lines.back()
    +			break
    +		}
    +		section := Section{
    +			Number: append(append([]int{}, number...), i),
    +			Title:  text[len(prefix)+1:],
    +		}
    +		text, ok = lines.nextNonEmpty()
    +		for ok && !lesserHeading(text, prefix) {
    +			var e Elem
    +			r, _ := utf8.DecodeRuneInString(text)
    +			switch {
    +			case unicode.IsSpace(r):
    +				i := strings.IndexFunc(text, func(r rune) bool {
    +					return !unicode.IsSpace(r)
    +				})
    +				if i < 0 {
    +					break
    +				}
    +				indent := text[:i]
    +				var s []string
    +				for ok && (strings.HasPrefix(text, indent) || text == "") {
    +					if text != "" {
    +						text = text[i:]
    +					}
    +					s = append(s, text)
    +					text, ok = lines.next()
    +				}
    +				lines.back()
    +				pre := strings.Join(s, "\n")
    +				pre = strings.Replace(pre, "\t", "    ", -1) // browsers treat tabs badly
    +				pre = strings.TrimRightFunc(pre, unicode.IsSpace)
    +				e = Text{Lines: []string{pre}, Pre: true}
    +			case strings.HasPrefix(text, "- "):
    +				var b []string
    +				for ok && strings.HasPrefix(text, "- ") {
    +					b = append(b, text[2:])
    +					text, ok = lines.next()
    +				}
    +				lines.back()
    +				e = List{Bullet: b}
    +			case strings.HasPrefix(text, prefix+"* "):
    +				lines.back()
    +				subsecs, err := parseSections(ctx, name, lines, section.Number, doc)
    +				if err != nil {
    +					return nil, err
    +				}
    +				for _, ss := range subsecs {
    +					section.Elem = append(section.Elem, ss)
    +				}
    +			case strings.HasPrefix(text, "."):
    +				args := strings.Fields(text)
    +				parser := parsers[args[0]]
    +				if parser == nil {
    +					return nil, fmt.Errorf("%s:%d: unknown command %q\n", name, lines.line, text)
    +				}
    +				t, err := parser(ctx, name, lines.line, text)
    +				if err != nil {
    +					return nil, err
    +				}
    +				e = t
    +			default:
    +				var l []string
    +				for ok && strings.TrimSpace(text) != "" {
    +					if text[0] == '.' { // Command breaks text block.
    +						lines.back()
    +						break
    +					}
    +					if strings.HasPrefix(text, `\.`) { // Backslash escapes initial period.
    +						text = text[1:]
    +					}
    +					l = append(l, text)
    +					text, ok = lines.next()
    +				}
    +				if len(l) > 0 {
    +					e = Text{Lines: l}
    +				}
    +			}
    +			if e != nil {
    +				section.Elem = append(section.Elem, e)
    +			}
    +			text, ok = lines.nextNonEmpty()
    +		}
    +		if isHeading.MatchString(text) {
    +			lines.back()
    +		}
    +		sections = append(sections, section)
    +	}
    +	return sections, nil
    +}
    +
    +func parseHeader(doc *Doc, lines *Lines) error {
    +	var ok bool
    +	// First non-empty line starts header.
    +	doc.Title, ok = lines.nextNonEmpty()
    +	if !ok {
    +		return errors.New("unexpected EOF; expected title")
    +	}
    +	for {
    +		text, ok := lines.next()
    +		if !ok {
    +			return errors.New("unexpected EOF")
    +		}
    +		if text == "" {
    +			break
    +		}
    +		const tagPrefix = "Tags:"
    +		if strings.HasPrefix(text, tagPrefix) {
    +			tags := strings.Split(text[len(tagPrefix):], ",")
    +			for i := range tags {
    +				tags[i] = strings.TrimSpace(tags[i])
    +			}
    +			doc.Tags = append(doc.Tags, tags...)
    +		} else if t, ok := parseTime(text); ok {
    +			doc.Time = t
    +		} else if doc.Subtitle == "" {
    +			doc.Subtitle = text
    +		} else {
    +			return fmt.Errorf("unexpected header line: %q", text)
    +		}
    +	}
    +	return nil
    +}
    +
    +func parseAuthors(lines *Lines) (authors []Author, err error) {
    +	// This grammar demarcates authors with blanks.
    +
    +	// Skip blank lines.
    +	if _, ok := lines.nextNonEmpty(); !ok {
    +		return nil, errors.New("unexpected EOF")
    +	}
    +	lines.back()
    +
    +	var a *Author
    +	for {
    +		text, ok := lines.next()
    +		if !ok {
    +			return nil, errors.New("unexpected EOF")
    +		}
    +
    +		// If we find a section heading, we're done.
    +		if strings.HasPrefix(text, "* ") {
    +			lines.back()
    +			break
    +		}
    +
    +		// If we encounter a blank we're done with this author.
    +		if a != nil && len(text) == 0 {
    +			authors = append(authors, *a)
    +			a = nil
    +			continue
    +		}
    +		if a == nil {
    +			a = new(Author)
    +		}
    +
    +		// Parse the line. Those that
    +		// - begin with @ are twitter names,
    +		// - contain slashes are links, or
    +		// - contain an @ symbol are an email address.
    +		// The rest is just text.
    +		var el Elem
    +		switch {
    +		case strings.HasPrefix(text, "@"):
    +			el = parseURL("http://twitter.com/" + text[1:])
    +		case strings.Contains(text, ":"):
    +			el = parseURL(text)
    +		case strings.Contains(text, "@"):
    +			el = parseURL("mailto:" + text)
    +		}
    +		if l, ok := el.(Link); ok {
    +			l.Label = text
    +			el = l
    +		}
    +		if el == nil {
    +			el = Text{Lines: []string{text}}
    +		}
    +		a.Elem = append(a.Elem, el)
    +	}
    +	if a != nil {
    +		authors = append(authors, *a)
    +	}
    +	return authors, nil
    +}
    +
    +func parseURL(text string) Elem {
    +	u, err := url.Parse(text)
    +	if err != nil {
    +		log.Printf("Parse(%q): %v", text, err)
    +		return nil
    +	}
    +	return Link{URL: u}
    +}
    +
    +func parseTime(text string) (t time.Time, ok bool) {
    +	t, err := time.Parse("15:04 2 Jan 2006", text)
    +	if err == nil {
    +		return t, true
    +	}
    +	t, err = time.Parse("2 Jan 2006", text)
    +	if err == nil {
    +		// at 11am UTC it is the same date everywhere
    +		t = t.Add(time.Hour * 11)
    +		return t, true
    +	}
    +	return time.Time{}, false
    +}
    diff --git a/vendor/golang.org/x/tools/present/style.go b/vendor/golang.org/x/tools/present/style.go
    new file mode 100644
    index 0000000000..1cd240de72
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/present/style.go
    @@ -0,0 +1,166 @@
    +// Copyright 2012 The Go Authors. All rights reserved.
    +// Use of this source code is governed by a BSD-style
    +// license that can be found in the LICENSE file.
    +
    +package present
    +
    +import (
    +	"bytes"
    +	"html"
    +	"html/template"
    +	"strings"
    +	"unicode"
    +	"unicode/utf8"
    +)
    +
    +/*
    +	Fonts are demarcated by an initial and final char bracketing a
    +	space-delimited word, plus possibly some terminal punctuation.
    +	The chars are
    +		_ for italic
    +		* for bold
    +		` (back quote) for fixed width.
    +	Inner appearances of the char become spaces. For instance,
    +		_this_is_italic_!
    +	becomes
    +		this is italic!
    +*/
    +
    +func init() {
    +	funcs["style"] = Style
    +}
    +
    +// Style returns s with HTML entities escaped and font indicators turned into
    +// HTML font tags.
    +func Style(s string) template.HTML {
    +	return template.HTML(font(html.EscapeString(s)))
    +}
    +
    +// font returns s with font indicators turned into HTML font tags.
    +func font(s string) string {
    +	if strings.IndexAny(s, "[`_*") == -1 {
    +		return s
    +	}
    +	words := split(s)
    +	var b bytes.Buffer
    +Word:
    +	for w, word := range words {
    +		if len(word) < 2 {
    +			continue Word
    +		}
    +		if link, _ := parseInlineLink(word); link != "" {
    +			words[w] = link
    +			continue Word
    +		}
    +		const punctuation = `.,;:()!?—–'"`
    +		const marker = "_*`"
    +		// Initial punctuation is OK but must be peeled off.
    +		first := strings.IndexAny(word, marker)
    +		if first == -1 {
    +			continue Word
    +		}
    +		// Is the marker prefixed only by punctuation?
    +		for _, r := range word[:first] {
    +			if !strings.ContainsRune(punctuation, r) {
    +				continue Word
    +			}
    +		}
    +		open, word := word[:first], word[first:]
    +		char := word[0] // ASCII is OK.
    +		close := ""
    +		switch char {
    +		default:
    +			continue Word
    +		case '_':
    +			open += ""
    +			close = ""
    +		case '*':
    +			open += ""
    +			close = ""
    +		case '`':
    +			open += ""
    +			close = ""
    +		}
    +		// Terminal punctuation is OK but must be peeled off.
    +		last := strings.LastIndex(word, word[:1])
    +		if last == 0 {
    +			continue Word
    +		}
    +		head, tail := word[:last+1], word[last+1:]
    +		for _, r := range tail {
    +			if !strings.ContainsRune(punctuation, r) {
    +				continue Word
    +			}
    +		}
    +		b.Reset()
    +		b.WriteString(open)
    +		var wid int
    +		for i := 1; i < len(head)-1; i += wid {
    +			var r rune
    +			r, wid = utf8.DecodeRuneInString(head[i:])
    +			if r != rune(char) {
    +				// Ordinary character.
    +				b.WriteRune(r)
    +				continue
    +			}
    +			if head[i+1] != char {
    +				// Inner char becomes space.
    +				b.WriteRune(' ')
    +				continue
    +			}
    +			// Doubled char becomes real char.
    +			// Not worth worrying about "_x__".
    +			b.WriteByte(char)
    +			wid++ // Consumed two chars, both ASCII.
    +		}
    +		b.WriteString(close) // Write closing tag.
    +		b.WriteString(tail)  // Restore trailing punctuation.
    +		words[w] = b.String()
    +	}
    +	return strings.Join(words, "")
    +}
    +
    +// split is like strings.Fields but also returns the runs of spaces
    +// and treats inline links as distinct words.
    +func split(s string) []string {
    +	var (
    +		words = make([]string, 0, 10)
    +		start = 0
    +	)
    +
    +	// appendWord appends the string s[start:end] to the words slice.
    +	// If the word contains the beginning of a link, the non-link portion
    +	// of the word and the entire link are appended as separate words,
    +	// and the start index is advanced to the end of the link.
    +	appendWord := func(end int) {
    +		if j := strings.Index(s[start:end], "[["); j > -1 {
    +			if _, l := parseInlineLink(s[start+j:]); l > 0 {
    +				// Append portion before link, if any.
    +				if j > 0 {
    +					words = append(words, s[start:start+j])
    +				}
    +				// Append link itself.
    +				words = append(words, s[start+j:start+j+l])
    +				// Advance start index to end of link.
    +				start = start + j + l
    +				return
    +			}
    +		}
    +		// No link; just add the word.
    +		words = append(words, s[start:end])
    +		start = end
    +	}
    +
    +	wasSpace := false
    +	for i, r := range s {
    +		isSpace := unicode.IsSpace(r)
    +		if i > start && isSpace != wasSpace {
    +			appendWord(i)
    +		}
    +		wasSpace = isSpace
    +	}
    +	for start < len(s) {
    +		appendWord(len(s))
    +	}
    +	return words
    +}
    diff --git a/vendor/golang.org/x/tools/present/style_test.go b/vendor/golang.org/x/tools/present/style_test.go
    new file mode 100644
    index 0000000000..d04db72d25
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/present/style_test.go
    @@ -0,0 +1,116 @@
    +// Copyright 2012 The Go Authors. All rights reserved.
    +// Use of this source code is governed by a BSD-style
    +// license that can be found in the LICENSE file.
    +
    +package present
    +
    +import (
    +	"fmt"
    +	"reflect"
    +	"testing"
    +)
    +
    +func TestSplit(t *testing.T) {
    +	var tests = []struct {
    +		in  string
    +		out []string
    +	}{
    +		{"", []string{}},
    +		{" ", []string{" "}},
    +		{"abc", []string{"abc"}},
    +		{"abc def", []string{"abc", " ", "def"}},
    +		{"abc def ", []string{"abc", " ", "def", " "}},
    +		{"hey [[http://golang.org][Gophers]] around",
    +			[]string{"hey", " ", "[[http://golang.org][Gophers]]", " ", "around"}},
    +		{"A [[http://golang.org/doc][two words]] link",
    +			[]string{"A", " ", "[[http://golang.org/doc][two words]]", " ", "link"}},
    +		{"Visit [[http://golang.org/doc]] now",
    +			[]string{"Visit", " ", "[[http://golang.org/doc]]", " ", "now"}},
    +		{"not [[http://golang.org/doc][a [[link]] ]] around",
    +			[]string{"not", " ", "[[http://golang.org/doc][a [[link]]", " ", "]]", " ", "around"}},
    +		{"[[http://golang.org][foo bar]]",
    +			[]string{"[[http://golang.org][foo bar]]"}},
    +		{"ends with [[http://golang.org][link]]",
    +			[]string{"ends", " ", "with", " ", "[[http://golang.org][link]]"}},
    +		{"my talk ([[http://talks.golang.org/][slides here]])",
    +			[]string{"my", " ", "talk", " ", "(", "[[http://talks.golang.org/][slides here]]", ")"}},
    +	}
    +	for _, test := range tests {
    +		out := split(test.in)
    +		if !reflect.DeepEqual(out, test.out) {
    +			t.Errorf("split(%q):\ngot\t%q\nwant\t%q", test.in, out, test.out)
    +		}
    +	}
    +}
    +
    +func TestFont(t *testing.T) {
    +	var tests = []struct {
    +		in  string
    +		out string
    +	}{
    +		{"", ""},
    +		{" ", " "},
    +		{"\tx", "\tx"},
    +		{"_a_", "a"},
    +		{"*a*", "a"},
    +		{"`a`", "a"},
    +		{"_a_b_", "a b"},
    +		{"_a__b_", "a_b"},
    +		{"_a___b_", "a_ b"},
    +		{"*a**b*?", "a*b?"},
    +		{"_a_<>_b_.", "a <> b."},
    +		{"(_a_)", "(a)"},
    +		{"((_a_), _b_, _c_).", "((a), b, c)."},
    +		{"(_a)", "(_a)"},
    +		{"(_a)", "(_a)"},
    +		{"_Why_use_scoped__ptr_? Use plain ***ptr* instead.", "Why use scoped_ptr? Use plain *ptr instead."},
    +		{"_hey_ [[http://golang.org][*Gophers*]] *around*",
    +			`hey Gophers around`},
    +		{"_hey_ [[http://golang.org][so _many_ *Gophers*]] *around*",
    +			`hey so many Gophers around`},
    +		{"Visit [[http://golang.org]] now",
    +			`Visit golang.org now`},
    +		{"my talk ([[http://talks.golang.org/][slides here]])",
    +			`my talk (slides here)`},
    +	}
    +	for _, test := range tests {
    +		out := font(test.in)
    +		if out != test.out {
    +			t.Errorf("font(%q):\ngot\t%q\nwant\t%q", test.in, out, test.out)
    +		}
    +	}
    +}
    +
    +func TestStyle(t *testing.T) {
    +	var tests = []struct {
    +		in  string
    +		out string
    +	}{
    +		{"", ""},
    +		{" ", " "},
    +		{"\tx", "\tx"},
    +		{"_a_", "a"},
    +		{"*a*", "a"},
    +		{"`a`", "a"},
    +		{"_a_b_", "a b"},
    +		{"_a__b_", "a_b"},
    +		{"_a___b_", "a_ b"},
    +		{"*a**b*?", "a*b?"},
    +		{"_a_<>_b_.", "a <> b."},
    +		{"(_a_<>_b_)", "(a <> b)"},
    +		{"((_a_), _b_, _c_).", "((a), b, c)."},
    +		{"(_a)", "(_a)"},
    +	}
    +	for _, test := range tests {
    +		out := string(Style(test.in))
    +		if out != test.out {
    +			t.Errorf("style(%q):\ngot\t%q\nwant\t%q", test.in, out, test.out)
    +		}
    +	}
    +}
    +
    +func ExampleStyle() {
    +	const s = "*Gophers* are _clearly_ > *cats*!"
    +	fmt.Println(Style(s))
    +	// Output: Gophers are clearly > cats!
    +}
    diff --git a/vendor/golang.org/x/tools/present/video.go b/vendor/golang.org/x/tools/present/video.go
    new file mode 100644
    index 0000000000..913822e66b
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/present/video.go
    @@ -0,0 +1,51 @@
    +// Copyright 2016 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 present
    +
    +import (
    +	"fmt"
    +	"strings"
    +)
    +
    +func init() {
    +	Register("video", parseVideo)
    +}
    +
    +type Video struct {
    +	URL        string
    +	SourceType string
    +	Width      int
    +	Height     int
    +}
    +
    +func (v Video) TemplateName() string { return "video" }
    +
    +func parseVideo(ctx *Context, fileName string, lineno int, text string) (Elem, error) {
    +	args := strings.Fields(text)
    +	vid := Video{URL: args[1], SourceType: args[2]}
    +	a, err := parseArgs(fileName, lineno, args[3:])
    +	if err != nil {
    +		return nil, err
    +	}
    +	switch len(a) {
    +	case 0:
    +		// no size parameters
    +	case 2:
    +		// If a parameter is empty (underscore) or invalid
    +		// leave the field set to zero. The "video" action
    +		// template will then omit that vid tag attribute and
    +		// the browser will calculate the value to preserve
    +		// the aspect ratio.
    +		if v, ok := a[0].(int); ok {
    +			vid.Height = v
    +		}
    +		if v, ok := a[1].(int); ok {
    +			vid.Width = v
    +		}
    +	default:
    +		return nil, fmt.Errorf("incorrect video invocation: %q", text)
    +	}
    +	return vid, nil
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/README b/vendor/golang.org/x/tools/refactor/README
    new file mode 100644
    index 0000000000..a3157845cf
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/README
    @@ -0,0 +1 @@
    +golang.org/x/tools/refactor: libraries for refactoring tools.
    diff --git a/vendor/golang.org/x/tools/refactor/eg/eg.go b/vendor/golang.org/x/tools/refactor/eg/eg.go
    new file mode 100644
    index 0000000000..4d56824bab
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/eg.go
    @@ -0,0 +1,346 @@
    +// 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 go1.5
    +
    +// Package eg implements the example-based refactoring tool whose
    +// command-line is defined in golang.org/x/tools/cmd/eg.
    +package eg // import "golang.org/x/tools/refactor/eg"
    +
    +import (
    +	"bytes"
    +	"fmt"
    +	"go/ast"
    +	"go/format"
    +	"go/printer"
    +	"go/token"
    +	"go/types"
    +	"os"
    +)
    +
    +const Help = `
    +This tool implements example-based refactoring of expressions.
    +
    +The transformation is specified as a Go file defining two functions,
    +'before' and 'after', of identical types.  Each function body consists
    +of a single statement: either a return statement with a single
    +(possibly multi-valued) expression, or an expression statement.  The
    +'before' expression specifies a pattern and the 'after' expression its
    +replacement.
    +
    +	package P
    + 	import ( "errors"; "fmt" )
    + 	func before(s string) error { return fmt.Errorf("%s", s) }
    + 	func after(s string)  error { return errors.New(s) }
    +
    +The expression statement form is useful when the expression has no
    +result, for example:
    +
    + 	func before(msg string) { log.Fatalf("%s", msg) }
    + 	func after(msg string)  { log.Fatal(msg) }
    +
    +The parameters of both functions are wildcards that may match any
    +expression assignable to that type.  If the pattern contains multiple
    +occurrences of the same parameter, each must match the same expression
    +in the input for the pattern to match.  If the replacement contains
    +multiple occurrences of the same parameter, the expression will be
    +duplicated, possibly changing the side-effects.
    +
    +The tool analyses all Go code in the packages specified by the
    +arguments, replacing all occurrences of the pattern with the
    +substitution.
    +
    +So, the transform above would change this input:
    +	err := fmt.Errorf("%s", "error: " + msg)
    +to this output:
    +	err := errors.New("error: " + msg)
    +
    +Identifiers, including qualified identifiers (p.X) are considered to
    +match only if they denote the same object.  This allows correct
    +matching even in the presence of dot imports, named imports and
    +locally shadowed package names in the input program.
    +
    +Matching of type syntax is semantic, not syntactic: type syntax in the
    +pattern matches type syntax in the input if the types are identical.
    +Thus, func(x int) matches func(y int).
    +
    +This tool was inspired by other example-based refactoring tools,
    +'gofmt -r' for Go and Refaster for Java.
    +
    +
    +LIMITATIONS
    +===========
    +
    +EXPRESSIVENESS
    +
    +Only refactorings that replace one expression with another, regardless
    +of the expression's context, may be expressed.  Refactoring arbitrary
    +statements (or sequences of statements) is a less well-defined problem
    +and is less amenable to this approach.
    +
    +A pattern that contains a function literal (and hence statements)
    +never matches.
    +
    +There is no way to generalize over related types, e.g. to express that
    +a wildcard may have any integer type, for example.
    +
    +It is not possible to replace an expression by one of a different
    +type, even in contexts where this is legal, such as x in fmt.Print(x).
    +
    +The struct literals T{x} and T{K: x} cannot both be matched by a single
    +template.
    +
    +
    +SAFETY
    +
    +Verifying that a transformation does not introduce type errors is very
    +complex in the general case.  An innocuous-looking replacement of one
    +constant by another (e.g. 1 to 2) may cause type errors relating to
    +array types and indices, for example.  The tool performs only very
    +superficial checks of type preservation.
    +
    +
    +IMPORTS
    +
    +Although the matching algorithm is fully aware of scoping rules, the
    +replacement algorithm is not, so the replacement code may contain
    +incorrect identifier syntax for imported objects if there are dot
    +imports, named imports or locally shadowed package names in the input
    +program.
    +
    +Imports are added as needed, but they are not removed as needed.
    +Run 'goimports' on the modified file for now.
    +
    +Dot imports are forbidden in the template.
    +
    +
    +TIPS
    +====
    +
    +Sometimes a little creativity is required to implement the desired
    +migration.  This section lists a few tips and tricks.
    +
    +To remove the final parameter from a function, temporarily change the
    +function signature so that the final parameter is variadic, as this
    +allows legal calls both with and without the argument.  Then use eg to
    +remove the final argument from all callers, and remove the variadic
    +parameter by hand.  The reverse process can be used to add a final
    +parameter.
    +
    +To add or remove parameters other than the final one, you must do it in
    +stages: (1) declare a variant function f' with a different name and the
    +desired parameters; (2) use eg to transform calls to f into calls to f',
    +changing the arguments as needed; (3) change the declaration of f to
    +match f'; (4) use eg to rename f' to f in all calls; (5) delete f'.
    +`
    +
    +// TODO(adonovan): expand upon the above documentation as an HTML page.
    +
    +// A Transformer represents a single example-based transformation.
    +type Transformer struct {
    +	fset           *token.FileSet
    +	verbose        bool
    +	info           *types.Info // combined type info for template/input/output ASTs
    +	seenInfos      map[*types.Info]bool
    +	wildcards      map[*types.Var]bool                // set of parameters in func before()
    +	env            map[string]ast.Expr                // maps parameter name to wildcard binding
    +	importedObjs   map[types.Object]*ast.SelectorExpr // objects imported by after().
    +	before, after  ast.Expr
    +	allowWildcards bool
    +
    +	// Working state of Transform():
    +	nsubsts    int            // number of substitutions made
    +	currentPkg *types.Package // package of current call
    +}
    +
    +// NewTransformer returns a transformer based on the specified template,
    +// a single-file package containing "before" and "after" functions as
    +// described in the package documentation.
    +// tmplInfo is the type information for tmplFile.
    +//
    +func NewTransformer(fset *token.FileSet, tmplPkg *types.Package, tmplFile *ast.File, tmplInfo *types.Info, verbose bool) (*Transformer, error) {
    +	// Check the template.
    +	beforeSig := funcSig(tmplPkg, "before")
    +	if beforeSig == nil {
    +		return nil, fmt.Errorf("no 'before' func found in template")
    +	}
    +	afterSig := funcSig(tmplPkg, "after")
    +	if afterSig == nil {
    +		return nil, fmt.Errorf("no 'after' func found in template")
    +	}
    +
    +	// TODO(adonovan): should we also check the names of the params match?
    +	if !types.Identical(afterSig, beforeSig) {
    +		return nil, fmt.Errorf("before %s and after %s functions have different signatures",
    +			beforeSig, afterSig)
    +	}
    +
    +	for _, imp := range tmplFile.Imports {
    +		if imp.Name != nil && imp.Name.Name == "." {
    +			// Dot imports are currently forbidden.  We
    +			// make the simplifying assumption that all
    +			// imports are regular, without local renames.
    +			// TODO(adonovan): document
    +			return nil, fmt.Errorf("dot-import (of %s) in template", imp.Path.Value)
    +		}
    +	}
    +	var beforeDecl, afterDecl *ast.FuncDecl
    +	for _, decl := range tmplFile.Decls {
    +		if decl, ok := decl.(*ast.FuncDecl); ok {
    +			switch decl.Name.Name {
    +			case "before":
    +				beforeDecl = decl
    +			case "after":
    +				afterDecl = decl
    +			}
    +		}
    +	}
    +
    +	before, err := soleExpr(beforeDecl)
    +	if err != nil {
    +		return nil, fmt.Errorf("before: %s", err)
    +	}
    +	after, err := soleExpr(afterDecl)
    +	if err != nil {
    +		return nil, fmt.Errorf("after: %s", err)
    +	}
    +
    +	wildcards := make(map[*types.Var]bool)
    +	for i := 0; i < beforeSig.Params().Len(); i++ {
    +		wildcards[beforeSig.Params().At(i)] = true
    +	}
    +
    +	// checkExprTypes returns an error if Tb (type of before()) is not
    +	// safe to replace with Ta (type of after()).
    +	//
    +	// Only superficial checks are performed, and they may result in both
    +	// false positives and negatives.
    +	//
    +	// Ideally, we would only require that the replacement be assignable
    +	// to the context of a specific pattern occurrence, but the type
    +	// checker doesn't record that information and it's complex to deduce.
    +	// A Go type cannot capture all the constraints of a given expression
    +	// context, which may include the size, constness, signedness,
    +	// namedness or constructor of its type, and even the specific value
    +	// of the replacement.  (Consider the rule that array literal keys
    +	// must be unique.)  So we cannot hope to prove the safety of a
    +	// transformation in general.
    +	Tb := tmplInfo.TypeOf(before)
    +	Ta := tmplInfo.TypeOf(after)
    +	if types.AssignableTo(Tb, Ta) {
    +		// safe: replacement is assignable to pattern.
    +	} else if tuple, ok := Tb.(*types.Tuple); ok && tuple.Len() == 0 {
    +		// safe: pattern has void type (must appear in an ExprStmt).
    +	} else {
    +		return nil, fmt.Errorf("%s is not a safe replacement for %s", Ta, Tb)
    +	}
    +
    +	tr := &Transformer{
    +		fset:           fset,
    +		verbose:        verbose,
    +		wildcards:      wildcards,
    +		allowWildcards: true,
    +		seenInfos:      make(map[*types.Info]bool),
    +		importedObjs:   make(map[types.Object]*ast.SelectorExpr),
    +		before:         before,
    +		after:          after,
    +	}
    +
    +	// Combine type info from the template and input packages, and
    +	// type info for the synthesized ASTs too.  This saves us
    +	// having to book-keep where each ast.Node originated as we
    +	// construct the resulting hybrid AST.
    +	tr.info = &types.Info{
    +		Types:      make(map[ast.Expr]types.TypeAndValue),
    +		Defs:       make(map[*ast.Ident]types.Object),
    +		Uses:       make(map[*ast.Ident]types.Object),
    +		Selections: make(map[*ast.SelectorExpr]*types.Selection),
    +	}
    +	mergeTypeInfo(tr.info, tmplInfo)
    +
    +	// Compute set of imported objects required by after().
    +	// TODO(adonovan): reject dot-imports in pattern
    +	ast.Inspect(after, func(n ast.Node) bool {
    +		if n, ok := n.(*ast.SelectorExpr); ok {
    +			if _, ok := tr.info.Selections[n]; !ok {
    +				// qualified ident
    +				obj := tr.info.Uses[n.Sel]
    +				tr.importedObjs[obj] = n
    +				return false // prune
    +			}
    +		}
    +		return true // recur
    +	})
    +
    +	return tr, nil
    +}
    +
    +// WriteAST is a convenience function that writes AST f to the specified file.
    +func WriteAST(fset *token.FileSet, filename string, f *ast.File) (err error) {
    +	fh, err := os.Create(filename)
    +	if err != nil {
    +		return err
    +	}
    +	defer func() {
    +		if err2 := fh.Close(); err != nil {
    +			err = err2 // prefer earlier error
    +		}
    +	}()
    +	return format.Node(fh, fset, f)
    +}
    +
    +// -- utilities --------------------------------------------------------
    +
    +// funcSig returns the signature of the specified package-level function.
    +func funcSig(pkg *types.Package, name string) *types.Signature {
    +	if f, ok := pkg.Scope().Lookup(name).(*types.Func); ok {
    +		return f.Type().(*types.Signature)
    +	}
    +	return nil
    +}
    +
    +// soleExpr returns the sole expression in the before/after template function.
    +func soleExpr(fn *ast.FuncDecl) (ast.Expr, error) {
    +	if fn.Body == nil {
    +		return nil, fmt.Errorf("no body")
    +	}
    +	if len(fn.Body.List) != 1 {
    +		return nil, fmt.Errorf("must contain a single statement")
    +	}
    +	switch stmt := fn.Body.List[0].(type) {
    +	case *ast.ReturnStmt:
    +		if len(stmt.Results) != 1 {
    +			return nil, fmt.Errorf("return statement must have a single operand")
    +		}
    +		return stmt.Results[0], nil
    +
    +	case *ast.ExprStmt:
    +		return stmt.X, nil
    +	}
    +
    +	return nil, fmt.Errorf("must contain a single return or expression statement")
    +}
    +
    +// mergeTypeInfo adds type info from src to dst.
    +func mergeTypeInfo(dst, src *types.Info) {
    +	for k, v := range src.Types {
    +		dst.Types[k] = v
    +	}
    +	for k, v := range src.Defs {
    +		dst.Defs[k] = v
    +	}
    +	for k, v := range src.Uses {
    +		dst.Uses[k] = v
    +	}
    +	for k, v := range src.Selections {
    +		dst.Selections[k] = v
    +	}
    +}
    +
    +// (debugging only)
    +func astString(fset *token.FileSet, n ast.Node) string {
    +	var buf bytes.Buffer
    +	printer.Fprint(&buf, fset, n)
    +	return buf.String()
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/eg14.go b/vendor/golang.org/x/tools/refactor/eg/eg14.go
    new file mode 100644
    index 0000000000..d6790fe441
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/eg14.go
    @@ -0,0 +1,347 @@
    +// 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 !go1.5
    +
    +// Package eg implements the example-based refactoring tool whose
    +// command-line is defined in golang.org/x/tools/cmd/eg.
    +package eg // import "golang.org/x/tools/refactor/eg"
    +
    +import (
    +	"bytes"
    +	"fmt"
    +	"go/ast"
    +	"go/format"
    +	"go/printer"
    +	"go/token"
    +	"os"
    +
    +	"golang.org/x/tools/go/types"
    +)
    +
    +const Help = `
    +This tool implements example-based refactoring of expressions.
    +
    +The transformation is specified as a Go file defining two functions,
    +'before' and 'after', of identical types.  Each function body consists
    +of a single statement: either a return statement with a single
    +(possibly multi-valued) expression, or an expression statement.  The
    +'before' expression specifies a pattern and the 'after' expression its
    +replacement.
    +
    +	package P
    + 	import ( "errors"; "fmt" )
    + 	func before(s string) error { return fmt.Errorf("%s", s) }
    + 	func after(s string)  error { return errors.New(s) }
    +
    +The expression statement form is useful when the expression has no
    +result, for example:
    +
    + 	func before(msg string) { log.Fatalf("%s", msg) }
    + 	func after(msg string)  { log.Fatal(msg) }
    +
    +The parameters of both functions are wildcards that may match any
    +expression assignable to that type.  If the pattern contains multiple
    +occurrences of the same parameter, each must match the same expression
    +in the input for the pattern to match.  If the replacement contains
    +multiple occurrences of the same parameter, the expression will be
    +duplicated, possibly changing the side-effects.
    +
    +The tool analyses all Go code in the packages specified by the
    +arguments, replacing all occurrences of the pattern with the
    +substitution.
    +
    +So, the transform above would change this input:
    +	err := fmt.Errorf("%s", "error: " + msg)
    +to this output:
    +	err := errors.New("error: " + msg)
    +
    +Identifiers, including qualified identifiers (p.X) are considered to
    +match only if they denote the same object.  This allows correct
    +matching even in the presence of dot imports, named imports and
    +locally shadowed package names in the input program.
    +
    +Matching of type syntax is semantic, not syntactic: type syntax in the
    +pattern matches type syntax in the input if the types are identical.
    +Thus, func(x int) matches func(y int).
    +
    +This tool was inspired by other example-based refactoring tools,
    +'gofmt -r' for Go and Refaster for Java.
    +
    +
    +LIMITATIONS
    +===========
    +
    +EXPRESSIVENESS
    +
    +Only refactorings that replace one expression with another, regardless
    +of the expression's context, may be expressed.  Refactoring arbitrary
    +statements (or sequences of statements) is a less well-defined problem
    +and is less amenable to this approach.
    +
    +A pattern that contains a function literal (and hence statements)
    +never matches.
    +
    +There is no way to generalize over related types, e.g. to express that
    +a wildcard may have any integer type, for example.
    +
    +It is not possible to replace an expression by one of a different
    +type, even in contexts where this is legal, such as x in fmt.Print(x).
    +
    +The struct literals T{x} and T{K: x} cannot both be matched by a single
    +template.
    +
    +
    +SAFETY
    +
    +Verifying that a transformation does not introduce type errors is very
    +complex in the general case.  An innocuous-looking replacement of one
    +constant by another (e.g. 1 to 2) may cause type errors relating to
    +array types and indices, for example.  The tool performs only very
    +superficial checks of type preservation.
    +
    +
    +IMPORTS
    +
    +Although the matching algorithm is fully aware of scoping rules, the
    +replacement algorithm is not, so the replacement code may contain
    +incorrect identifier syntax for imported objects if there are dot
    +imports, named imports or locally shadowed package names in the input
    +program.
    +
    +Imports are added as needed, but they are not removed as needed.
    +Run 'goimports' on the modified file for now.
    +
    +Dot imports are forbidden in the template.
    +
    +
    +TIPS
    +====
    +
    +Sometimes a little creativity is required to implement the desired
    +migration.  This section lists a few tips and tricks.
    +
    +To remove the final parameter from a function, temporarily change the
    +function signature so that the final parameter is variadic, as this
    +allows legal calls both with and without the argument.  Then use eg to
    +remove the final argument from all callers, and remove the variadic
    +parameter by hand.  The reverse process can be used to add a final
    +parameter.
    +
    +To add or remove parameters other than the final one, you must do it in
    +stages: (1) declare a variant function f' with a different name and the
    +desired parameters; (2) use eg to transform calls to f into calls to f',
    +changing the arguments as needed; (3) change the declaration of f to
    +match f'; (4) use eg to rename f' to f in all calls; (5) delete f'.
    +`
    +
    +// TODO(adonovan): expand upon the above documentation as an HTML page.
    +
    +// A Transformer represents a single example-based transformation.
    +type Transformer struct {
    +	fset           *token.FileSet
    +	verbose        bool
    +	info           *types.Info // combined type info for template/input/output ASTs
    +	seenInfos      map[*types.Info]bool
    +	wildcards      map[*types.Var]bool                // set of parameters in func before()
    +	env            map[string]ast.Expr                // maps parameter name to wildcard binding
    +	importedObjs   map[types.Object]*ast.SelectorExpr // objects imported by after().
    +	before, after  ast.Expr
    +	allowWildcards bool
    +
    +	// Working state of Transform():
    +	nsubsts    int            // number of substitutions made
    +	currentPkg *types.Package // package of current call
    +}
    +
    +// NewTransformer returns a transformer based on the specified template,
    +// a single-file package containing "before" and "after" functions as
    +// described in the package documentation.
    +// tmplInfo is the type information for tmplFile.
    +//
    +func NewTransformer(fset *token.FileSet, tmplPkg *types.Package, tmplFile *ast.File, tmplInfo *types.Info, verbose bool) (*Transformer, error) {
    +	// Check the template.
    +	beforeSig := funcSig(tmplPkg, "before")
    +	if beforeSig == nil {
    +		return nil, fmt.Errorf("no 'before' func found in template")
    +	}
    +	afterSig := funcSig(tmplPkg, "after")
    +	if afterSig == nil {
    +		return nil, fmt.Errorf("no 'after' func found in template")
    +	}
    +
    +	// TODO(adonovan): should we also check the names of the params match?
    +	if !types.Identical(afterSig, beforeSig) {
    +		return nil, fmt.Errorf("before %s and after %s functions have different signatures",
    +			beforeSig, afterSig)
    +	}
    +
    +	for _, imp := range tmplFile.Imports {
    +		if imp.Name != nil && imp.Name.Name == "." {
    +			// Dot imports are currently forbidden.  We
    +			// make the simplifying assumption that all
    +			// imports are regular, without local renames.
    +			// TODO(adonovan): document
    +			return nil, fmt.Errorf("dot-import (of %s) in template", imp.Path.Value)
    +		}
    +	}
    +	var beforeDecl, afterDecl *ast.FuncDecl
    +	for _, decl := range tmplFile.Decls {
    +		if decl, ok := decl.(*ast.FuncDecl); ok {
    +			switch decl.Name.Name {
    +			case "before":
    +				beforeDecl = decl
    +			case "after":
    +				afterDecl = decl
    +			}
    +		}
    +	}
    +
    +	before, err := soleExpr(beforeDecl)
    +	if err != nil {
    +		return nil, fmt.Errorf("before: %s", err)
    +	}
    +	after, err := soleExpr(afterDecl)
    +	if err != nil {
    +		return nil, fmt.Errorf("after: %s", err)
    +	}
    +
    +	wildcards := make(map[*types.Var]bool)
    +	for i := 0; i < beforeSig.Params().Len(); i++ {
    +		wildcards[beforeSig.Params().At(i)] = true
    +	}
    +
    +	// checkExprTypes returns an error if Tb (type of before()) is not
    +	// safe to replace with Ta (type of after()).
    +	//
    +	// Only superficial checks are performed, and they may result in both
    +	// false positives and negatives.
    +	//
    +	// Ideally, we would only require that the replacement be assignable
    +	// to the context of a specific pattern occurrence, but the type
    +	// checker doesn't record that information and it's complex to deduce.
    +	// A Go type cannot capture all the constraints of a given expression
    +	// context, which may include the size, constness, signedness,
    +	// namedness or constructor of its type, and even the specific value
    +	// of the replacement.  (Consider the rule that array literal keys
    +	// must be unique.)  So we cannot hope to prove the safety of a
    +	// transformation in general.
    +	Tb := tmplInfo.TypeOf(before)
    +	Ta := tmplInfo.TypeOf(after)
    +	if types.AssignableTo(Tb, Ta) {
    +		// safe: replacement is assignable to pattern.
    +	} else if tuple, ok := Tb.(*types.Tuple); ok && tuple.Len() == 0 {
    +		// safe: pattern has void type (must appear in an ExprStmt).
    +	} else {
    +		return nil, fmt.Errorf("%s is not a safe replacement for %s", Ta, Tb)
    +	}
    +
    +	tr := &Transformer{
    +		fset:           fset,
    +		verbose:        verbose,
    +		wildcards:      wildcards,
    +		allowWildcards: true,
    +		seenInfos:      make(map[*types.Info]bool),
    +		importedObjs:   make(map[types.Object]*ast.SelectorExpr),
    +		before:         before,
    +		after:          after,
    +	}
    +
    +	// Combine type info from the template and input packages, and
    +	// type info for the synthesized ASTs too.  This saves us
    +	// having to book-keep where each ast.Node originated as we
    +	// construct the resulting hybrid AST.
    +	tr.info = &types.Info{
    +		Types:      make(map[ast.Expr]types.TypeAndValue),
    +		Defs:       make(map[*ast.Ident]types.Object),
    +		Uses:       make(map[*ast.Ident]types.Object),
    +		Selections: make(map[*ast.SelectorExpr]*types.Selection),
    +	}
    +	mergeTypeInfo(tr.info, tmplInfo)
    +
    +	// Compute set of imported objects required by after().
    +	// TODO(adonovan): reject dot-imports in pattern
    +	ast.Inspect(after, func(n ast.Node) bool {
    +		if n, ok := n.(*ast.SelectorExpr); ok {
    +			if _, ok := tr.info.Selections[n]; !ok {
    +				// qualified ident
    +				obj := tr.info.Uses[n.Sel]
    +				tr.importedObjs[obj] = n
    +				return false // prune
    +			}
    +		}
    +		return true // recur
    +	})
    +
    +	return tr, nil
    +}
    +
    +// WriteAST is a convenience function that writes AST f to the specified file.
    +func WriteAST(fset *token.FileSet, filename string, f *ast.File) (err error) {
    +	fh, err := os.Create(filename)
    +	if err != nil {
    +		return err
    +	}
    +	defer func() {
    +		if err2 := fh.Close(); err != nil {
    +			err = err2 // prefer earlier error
    +		}
    +	}()
    +	return format.Node(fh, fset, f)
    +}
    +
    +// -- utilities --------------------------------------------------------
    +
    +// funcSig returns the signature of the specified package-level function.
    +func funcSig(pkg *types.Package, name string) *types.Signature {
    +	if f, ok := pkg.Scope().Lookup(name).(*types.Func); ok {
    +		return f.Type().(*types.Signature)
    +	}
    +	return nil
    +}
    +
    +// soleExpr returns the sole expression in the before/after template function.
    +func soleExpr(fn *ast.FuncDecl) (ast.Expr, error) {
    +	if fn.Body == nil {
    +		return nil, fmt.Errorf("no body")
    +	}
    +	if len(fn.Body.List) != 1 {
    +		return nil, fmt.Errorf("must contain a single statement")
    +	}
    +	switch stmt := fn.Body.List[0].(type) {
    +	case *ast.ReturnStmt:
    +		if len(stmt.Results) != 1 {
    +			return nil, fmt.Errorf("return statement must have a single operand")
    +		}
    +		return stmt.Results[0], nil
    +
    +	case *ast.ExprStmt:
    +		return stmt.X, nil
    +	}
    +
    +	return nil, fmt.Errorf("must contain a single return or expression statement")
    +}
    +
    +// mergeTypeInfo adds type info from src to dst.
    +func mergeTypeInfo(dst, src *types.Info) {
    +	for k, v := range src.Types {
    +		dst.Types[k] = v
    +	}
    +	for k, v := range src.Defs {
    +		dst.Defs[k] = v
    +	}
    +	for k, v := range src.Uses {
    +		dst.Uses[k] = v
    +	}
    +	for k, v := range src.Selections {
    +		dst.Selections[k] = v
    +	}
    +}
    +
    +// (debugging only)
    +func astString(fset *token.FileSet, n ast.Node) string {
    +	var buf bytes.Buffer
    +	printer.Fprint(&buf, fset, n)
    +	return buf.String()
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/eg14_test.go b/vendor/golang.org/x/tools/refactor/eg/eg14_test.go
    new file mode 100644
    index 0000000000..814383ef3f
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/eg14_test.go
    @@ -0,0 +1,162 @@
    +// 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 !go1.5
    +
    +// No testdata on Android.
    +
    +// +build !android
    +
    +package eg_test
    +
    +import (
    +	"bytes"
    +	"flag"
    +	"go/parser"
    +	"go/token"
    +	"os"
    +	"os/exec"
    +	"path/filepath"
    +	"runtime"
    +	"strings"
    +	"testing"
    +
    +	"golang.org/x/tools/go/exact"
    +	"golang.org/x/tools/go/loader"
    +	"golang.org/x/tools/go/types"
    +	"golang.org/x/tools/refactor/eg"
    +)
    +
    +// TODO(adonovan): more tests:
    +// - of command-line tool
    +// - of all parts of syntax
    +// - of applying a template to a package it imports:
    +//   the replacement syntax should use unqualified names for its objects.
    +
    +var (
    +	updateFlag  = flag.Bool("update", false, "update the golden files")
    +	verboseFlag = flag.Bool("verbose", false, "show matcher information")
    +)
    +
    +func Test(t *testing.T) {
    +	switch runtime.GOOS {
    +	case "windows":
    +		t.Skipf("skipping test on %q (no /usr/bin/diff)", runtime.GOOS)
    +	}
    +
    +	conf := loader.Config{
    +		Fset:       token.NewFileSet(),
    +		ParserMode: parser.ParseComments,
    +	}
    +
    +	// Each entry is a single-file package.
    +	// (Multi-file packages aren't interesting for this test.)
    +	// Order matters: each non-template package is processed using
    +	// the preceding template package.
    +	for _, filename := range []string{
    +		"testdata/A.template",
    +		"testdata/A1.go",
    +		"testdata/A2.go",
    +
    +		"testdata/B.template",
    +		"testdata/B1.go",
    +
    +		"testdata/C.template",
    +		"testdata/C1.go",
    +
    +		"testdata/D.template",
    +		"testdata/D1.go",
    +
    +		"testdata/E.template",
    +		"testdata/E1.go",
    +
    +		"testdata/F.template",
    +		"testdata/F1.go",
    +
    +		"testdata/G.template",
    +		"testdata/G1.go",
    +
    +		"testdata/H.template",
    +		"testdata/H1.go",
    +
    +		"testdata/bad_type.template",
    +		"testdata/no_before.template",
    +		"testdata/no_after_return.template",
    +		"testdata/type_mismatch.template",
    +		"testdata/expr_type_mismatch.template",
    +	} {
    +		pkgname := strings.TrimSuffix(filepath.Base(filename), ".go")
    +		conf.CreateFromFilenames(pkgname, filename)
    +	}
    +	iprog, err := conf.Load()
    +	if err != nil {
    +		t.Fatal(err)
    +	}
    +
    +	var xform *eg.Transformer
    +	for _, info := range iprog.Created {
    +		file := info.Files[0]
    +		filename := iprog.Fset.File(file.Pos()).Name() // foo.go
    +
    +		if strings.HasSuffix(filename, "template") {
    +			// a new template
    +			shouldFail, _ := info.Pkg.Scope().Lookup("shouldFail").(*types.Const)
    +			xform, err = eg.NewTransformer(iprog.Fset, info.Pkg, file, &info.Info, *verboseFlag)
    +			if err != nil {
    +				if shouldFail == nil {
    +					t.Errorf("NewTransformer(%s): %s", filename, err)
    +				} else if want := exact.StringVal(shouldFail.Val()); !strings.Contains(err.Error(), want) {
    +					t.Errorf("NewTransformer(%s): got error %q, want error %q", filename, err, want)
    +				}
    +			} else if shouldFail != nil {
    +				t.Errorf("NewTransformer(%s) succeeded unexpectedly; want error %q",
    +					filename, shouldFail.Val())
    +			}
    +			continue
    +		}
    +
    +		if xform == nil {
    +			t.Errorf("%s: no previous template", filename)
    +			continue
    +		}
    +
    +		// apply previous template to this package
    +		n := xform.Transform(&info.Info, info.Pkg, file)
    +		if n == 0 {
    +			t.Errorf("%s: no matches", filename)
    +			continue
    +		}
    +
    +		got := filename + "t"       // foo.got
    +		golden := filename + "lden" // foo.golden
    +
    +		// Write actual output to foo.got.
    +		if err := eg.WriteAST(iprog.Fset, got, file); err != nil {
    +			t.Error(err)
    +		}
    +		defer os.Remove(got)
    +
    +		// Compare foo.got with foo.golden.
    +		var cmd *exec.Cmd
    +		switch runtime.GOOS {
    +		case "plan9":
    +			cmd = exec.Command("/bin/diff", "-c", golden, got)
    +		default:
    +			cmd = exec.Command("/usr/bin/diff", "-u", golden, got)
    +		}
    +		buf := new(bytes.Buffer)
    +		cmd.Stdout = buf
    +		cmd.Stderr = os.Stderr
    +		if err := cmd.Run(); err != nil {
    +			t.Errorf("eg tests for %s failed: %s.\n%s\n", filename, err, buf)
    +
    +			if *updateFlag {
    +				t.Logf("Updating %s...", golden)
    +				if err := exec.Command("/bin/cp", got, golden).Run(); err != nil {
    +					t.Errorf("Update failed: %s", err)
    +				}
    +			}
    +		}
    +	}
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/eg_test.go b/vendor/golang.org/x/tools/refactor/eg/eg_test.go
    new file mode 100644
    index 0000000000..c2599203ca
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/eg_test.go
    @@ -0,0 +1,162 @@
    +// 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 go1.5
    +
    +// No testdata on Android.
    +
    +// +build !android
    +
    +package eg_test
    +
    +import (
    +	"bytes"
    +	"flag"
    +	exact "go/constant"
    +	"go/parser"
    +	"go/token"
    +	"go/types"
    +	"os"
    +	"os/exec"
    +	"path/filepath"
    +	"runtime"
    +	"strings"
    +	"testing"
    +
    +	"golang.org/x/tools/go/loader"
    +	"golang.org/x/tools/refactor/eg"
    +)
    +
    +// TODO(adonovan): more tests:
    +// - of command-line tool
    +// - of all parts of syntax
    +// - of applying a template to a package it imports:
    +//   the replacement syntax should use unqualified names for its objects.
    +
    +var (
    +	updateFlag  = flag.Bool("update", false, "update the golden files")
    +	verboseFlag = flag.Bool("verbose", false, "show matcher information")
    +)
    +
    +func Test(t *testing.T) {
    +	switch runtime.GOOS {
    +	case "windows":
    +		t.Skipf("skipping test on %q (no /usr/bin/diff)", runtime.GOOS)
    +	}
    +
    +	conf := loader.Config{
    +		Fset:       token.NewFileSet(),
    +		ParserMode: parser.ParseComments,
    +	}
    +
    +	// Each entry is a single-file package.
    +	// (Multi-file packages aren't interesting for this test.)
    +	// Order matters: each non-template package is processed using
    +	// the preceding template package.
    +	for _, filename := range []string{
    +		"testdata/A.template",
    +		"testdata/A1.go",
    +		"testdata/A2.go",
    +
    +		"testdata/B.template",
    +		"testdata/B1.go",
    +
    +		"testdata/C.template",
    +		"testdata/C1.go",
    +
    +		"testdata/D.template",
    +		"testdata/D1.go",
    +
    +		"testdata/E.template",
    +		"testdata/E1.go",
    +
    +		"testdata/F.template",
    +		"testdata/F1.go",
    +
    +		"testdata/G.template",
    +		"testdata/G1.go",
    +
    +		"testdata/H.template",
    +		"testdata/H1.go",
    +
    +		"testdata/bad_type.template",
    +		"testdata/no_before.template",
    +		"testdata/no_after_return.template",
    +		"testdata/type_mismatch.template",
    +		"testdata/expr_type_mismatch.template",
    +	} {
    +		pkgname := strings.TrimSuffix(filepath.Base(filename), ".go")
    +		conf.CreateFromFilenames(pkgname, filename)
    +	}
    +	iprog, err := conf.Load()
    +	if err != nil {
    +		t.Fatal(err)
    +	}
    +
    +	var xform *eg.Transformer
    +	for _, info := range iprog.Created {
    +		file := info.Files[0]
    +		filename := iprog.Fset.File(file.Pos()).Name() // foo.go
    +
    +		if strings.HasSuffix(filename, "template") {
    +			// a new template
    +			shouldFail, _ := info.Pkg.Scope().Lookup("shouldFail").(*types.Const)
    +			xform, err = eg.NewTransformer(iprog.Fset, info.Pkg, file, &info.Info, *verboseFlag)
    +			if err != nil {
    +				if shouldFail == nil {
    +					t.Errorf("NewTransformer(%s): %s", filename, err)
    +				} else if want := exact.StringVal(shouldFail.Val()); !strings.Contains(err.Error(), want) {
    +					t.Errorf("NewTransformer(%s): got error %q, want error %q", filename, err, want)
    +				}
    +			} else if shouldFail != nil {
    +				t.Errorf("NewTransformer(%s) succeeded unexpectedly; want error %q",
    +					filename, shouldFail.Val())
    +			}
    +			continue
    +		}
    +
    +		if xform == nil {
    +			t.Errorf("%s: no previous template", filename)
    +			continue
    +		}
    +
    +		// apply previous template to this package
    +		n := xform.Transform(&info.Info, info.Pkg, file)
    +		if n == 0 {
    +			t.Errorf("%s: no matches", filename)
    +			continue
    +		}
    +
    +		got := filename + "t"       // foo.got
    +		golden := filename + "lden" // foo.golden
    +
    +		// Write actual output to foo.got.
    +		if err := eg.WriteAST(iprog.Fset, got, file); err != nil {
    +			t.Error(err)
    +		}
    +		defer os.Remove(got)
    +
    +		// Compare foo.got with foo.golden.
    +		var cmd *exec.Cmd
    +		switch runtime.GOOS {
    +		case "plan9":
    +			cmd = exec.Command("/bin/diff", "-c", golden, got)
    +		default:
    +			cmd = exec.Command("/usr/bin/diff", "-u", golden, got)
    +		}
    +		buf := new(bytes.Buffer)
    +		cmd.Stdout = buf
    +		cmd.Stderr = os.Stderr
    +		if err := cmd.Run(); err != nil {
    +			t.Errorf("eg tests for %s failed: %s.\n%s\n", filename, err, buf)
    +
    +			if *updateFlag {
    +				t.Logf("Updating %s...", golden)
    +				if err := exec.Command("/bin/cp", got, golden).Run(); err != nil {
    +					t.Errorf("Update failed: %s", err)
    +				}
    +			}
    +		}
    +	}
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/match.go b/vendor/golang.org/x/tools/refactor/eg/match.go
    new file mode 100644
    index 0000000000..8d989bcaa7
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/match.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.
    +
    +// +build go1.5
    +
    +package eg
    +
    +import (
    +	"fmt"
    +	"go/ast"
    +	"go/token"
    +	"go/types"
    +	"log"
    +	"os"
    +	"reflect"
    +
    +	"golang.org/x/tools/go/ast/astutil"
    +	"golang.org/x/tools/go/exact"
    +)
    +
    +// matchExpr reports whether pattern x matches y.
    +//
    +// If tr.allowWildcards, Idents in x that refer to parameters are
    +// treated as wildcards, and match any y that is assignable to the
    +// parameter type; matchExpr records this correspondence in tr.env.
    +// Otherwise, matchExpr simply reports whether the two trees are
    +// equivalent.
    +//
    +// A wildcard appearing more than once in the pattern must
    +// consistently match the same tree.
    +//
    +func (tr *Transformer) matchExpr(x, y ast.Expr) bool {
    +	if x == nil && y == nil {
    +		return true
    +	}
    +	if x == nil || y == nil {
    +		return false
    +	}
    +	x = unparen(x)
    +	y = unparen(y)
    +
    +	// Is x a wildcard?  (a reference to a 'before' parameter)
    +	if xobj, ok := tr.wildcardObj(x); ok {
    +		return tr.matchWildcard(xobj, y)
    +	}
    +
    +	// Object identifiers (including pkg-qualified ones)
    +	// are handled semantically, not syntactically.
    +	xobj := isRef(x, tr.info)
    +	yobj := isRef(y, tr.info)
    +	if xobj != nil {
    +		return xobj == yobj
    +	}
    +	if yobj != nil {
    +		return false
    +	}
    +
    +	// TODO(adonovan): audit: we cannot assume these ast.Exprs
    +	// contain non-nil pointers.  e.g. ImportSpec.Name may be a
    +	// nil *ast.Ident.
    +
    +	if reflect.TypeOf(x) != reflect.TypeOf(y) {
    +		return false
    +	}
    +	switch x := x.(type) {
    +	case *ast.Ident:
    +		log.Fatalf("unexpected Ident: %s", astString(tr.fset, x))
    +
    +	case *ast.BasicLit:
    +		y := y.(*ast.BasicLit)
    +		xval := exact.MakeFromLiteral(x.Value, x.Kind)
    +		yval := exact.MakeFromLiteral(y.Value, y.Kind)
    +		return exact.Compare(xval, token.EQL, yval)
    +
    +	case *ast.FuncLit:
    +		// func literals (and thus statement syntax) never match.
    +		return false
    +
    +	case *ast.CompositeLit:
    +		y := y.(*ast.CompositeLit)
    +		return (x.Type == nil) == (y.Type == nil) &&
    +			(x.Type == nil || tr.matchType(x.Type, y.Type)) &&
    +			tr.matchExprs(x.Elts, y.Elts)
    +
    +	case *ast.SelectorExpr:
    +		y := y.(*ast.SelectorExpr)
    +		return tr.matchSelectorExpr(x, y) &&
    +			tr.info.Selections[x].Obj() == tr.info.Selections[y].Obj()
    +
    +	case *ast.IndexExpr:
    +		y := y.(*ast.IndexExpr)
    +		return tr.matchExpr(x.X, y.X) &&
    +			tr.matchExpr(x.Index, y.Index)
    +
    +	case *ast.SliceExpr:
    +		y := y.(*ast.SliceExpr)
    +		return tr.matchExpr(x.X, y.X) &&
    +			tr.matchExpr(x.Low, y.Low) &&
    +			tr.matchExpr(x.High, y.High) &&
    +			tr.matchExpr(x.Max, y.Max) &&
    +			x.Slice3 == y.Slice3
    +
    +	case *ast.TypeAssertExpr:
    +		y := y.(*ast.TypeAssertExpr)
    +		return tr.matchExpr(x.X, y.X) &&
    +			tr.matchType(x.Type, y.Type)
    +
    +	case *ast.CallExpr:
    +		y := y.(*ast.CallExpr)
    +		match := tr.matchExpr // function call
    +		if tr.info.Types[x.Fun].IsType() {
    +			match = tr.matchType // type conversion
    +		}
    +		return x.Ellipsis.IsValid() == y.Ellipsis.IsValid() &&
    +			match(x.Fun, y.Fun) &&
    +			tr.matchExprs(x.Args, y.Args)
    +
    +	case *ast.StarExpr:
    +		y := y.(*ast.StarExpr)
    +		return tr.matchExpr(x.X, y.X)
    +
    +	case *ast.UnaryExpr:
    +		y := y.(*ast.UnaryExpr)
    +		return x.Op == y.Op &&
    +			tr.matchExpr(x.X, y.X)
    +
    +	case *ast.BinaryExpr:
    +		y := y.(*ast.BinaryExpr)
    +		return x.Op == y.Op &&
    +			tr.matchExpr(x.X, y.X) &&
    +			tr.matchExpr(x.Y, y.Y)
    +
    +	case *ast.KeyValueExpr:
    +		y := y.(*ast.KeyValueExpr)
    +		return tr.matchExpr(x.Key, y.Key) &&
    +			tr.matchExpr(x.Value, y.Value)
    +	}
    +
    +	panic(fmt.Sprintf("unhandled AST node type: %T", x))
    +}
    +
    +func (tr *Transformer) matchExprs(xx, yy []ast.Expr) bool {
    +	if len(xx) != len(yy) {
    +		return false
    +	}
    +	for i := range xx {
    +		if !tr.matchExpr(xx[i], yy[i]) {
    +			return false
    +		}
    +	}
    +	return true
    +}
    +
    +// matchType reports whether the two type ASTs denote identical types.
    +func (tr *Transformer) matchType(x, y ast.Expr) bool {
    +	tx := tr.info.Types[x].Type
    +	ty := tr.info.Types[y].Type
    +	return types.Identical(tx, ty)
    +}
    +
    +func (tr *Transformer) wildcardObj(x ast.Expr) (*types.Var, bool) {
    +	if x, ok := x.(*ast.Ident); ok && x != nil && tr.allowWildcards {
    +		if xobj, ok := tr.info.Uses[x].(*types.Var); ok && tr.wildcards[xobj] {
    +			return xobj, true
    +		}
    +	}
    +	return nil, false
    +}
    +
    +func (tr *Transformer) matchSelectorExpr(x, y *ast.SelectorExpr) bool {
    +	if xobj, ok := tr.wildcardObj(x.X); ok {
    +		field := x.Sel.Name
    +		yt := tr.info.TypeOf(y.X)
    +		o, _, _ := types.LookupFieldOrMethod(yt, true, tr.currentPkg, field)
    +		if o != nil {
    +			tr.env[xobj.Name()] = y.X // record binding
    +			return true
    +		}
    +	}
    +	return tr.matchExpr(x.X, y.X)
    +}
    +
    +func (tr *Transformer) matchWildcard(xobj *types.Var, y ast.Expr) bool {
    +	name := xobj.Name()
    +
    +	if tr.verbose {
    +		fmt.Fprintf(os.Stderr, "%s: wildcard %s -> %s?: ",
    +			tr.fset.Position(y.Pos()), name, astString(tr.fset, y))
    +	}
    +
    +	// Check that y is assignable to the declared type of the param.
    +	yt := tr.info.TypeOf(y)
    +	if yt == nil {
    +		// y has no type.
    +		// Perhaps it is an *ast.Ellipsis in [...]T{}, or
    +		// an *ast.KeyValueExpr in T{k: v}.
    +		// Clearly these pseudo-expressions cannot match a
    +		// wildcard, but it would nice if we had a way to ignore
    +		// the difference between T{v} and T{k:v} for structs.
    +		return false
    +	}
    +	if !types.AssignableTo(yt, xobj.Type()) {
    +		if tr.verbose {
    +			fmt.Fprintf(os.Stderr, "%s not assignable to %s\n", yt, xobj.Type())
    +		}
    +		return false
    +	}
    +
    +	// A wildcard matches any expression.
    +	// If it appears multiple times in the pattern, it must match
    +	// the same expression each time.
    +	if old, ok := tr.env[name]; ok {
    +		// found existing binding
    +		tr.allowWildcards = false
    +		r := tr.matchExpr(old, y)
    +		if tr.verbose {
    +			fmt.Fprintf(os.Stderr, "%t secondary match, primary was %s\n",
    +				r, astString(tr.fset, old))
    +		}
    +		tr.allowWildcards = true
    +		return r
    +	}
    +
    +	if tr.verbose {
    +		fmt.Fprintf(os.Stderr, "primary match\n")
    +	}
    +
    +	tr.env[name] = y // record binding
    +	return true
    +}
    +
    +// -- utilities --------------------------------------------------------
    +
    +func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) }
    +
    +// isRef returns the object referred to by this (possibly qualified)
    +// identifier, or nil if the node is not a referring identifier.
    +func isRef(n ast.Node, info *types.Info) types.Object {
    +	switch n := n.(type) {
    +	case *ast.Ident:
    +		return info.Uses[n]
    +
    +	case *ast.SelectorExpr:
    +		if _, ok := info.Selections[n]; !ok {
    +			// qualified ident
    +			return info.Uses[n.Sel]
    +		}
    +	}
    +	return nil
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/match14.go b/vendor/golang.org/x/tools/refactor/eg/match14.go
    new file mode 100644
    index 0000000000..10b84ab112
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/match14.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.
    +
    +// +build !go1.5
    +
    +package eg
    +
    +import (
    +	"fmt"
    +	"go/ast"
    +	"go/token"
    +	"log"
    +	"os"
    +	"reflect"
    +
    +	"golang.org/x/tools/go/ast/astutil"
    +	"golang.org/x/tools/go/exact"
    +	"golang.org/x/tools/go/types"
    +)
    +
    +// matchExpr reports whether pattern x matches y.
    +//
    +// If tr.allowWildcards, Idents in x that refer to parameters are
    +// treated as wildcards, and match any y that is assignable to the
    +// parameter type; matchExpr records this correspondence in tr.env.
    +// Otherwise, matchExpr simply reports whether the two trees are
    +// equivalent.
    +//
    +// A wildcard appearing more than once in the pattern must
    +// consistently match the same tree.
    +//
    +func (tr *Transformer) matchExpr(x, y ast.Expr) bool {
    +	if x == nil && y == nil {
    +		return true
    +	}
    +	if x == nil || y == nil {
    +		return false
    +	}
    +	x = unparen(x)
    +	y = unparen(y)
    +
    +	// Is x a wildcard?  (a reference to a 'before' parameter)
    +	if xobj, ok := tr.wildcardObj(x); ok {
    +		return tr.matchWildcard(xobj, y)
    +	}
    +
    +	// Object identifiers (including pkg-qualified ones)
    +	// are handled semantically, not syntactically.
    +	xobj := isRef(x, tr.info)
    +	yobj := isRef(y, tr.info)
    +	if xobj != nil {
    +		return xobj == yobj
    +	}
    +	if yobj != nil {
    +		return false
    +	}
    +
    +	// TODO(adonovan): audit: we cannot assume these ast.Exprs
    +	// contain non-nil pointers.  e.g. ImportSpec.Name may be a
    +	// nil *ast.Ident.
    +
    +	if reflect.TypeOf(x) != reflect.TypeOf(y) {
    +		return false
    +	}
    +	switch x := x.(type) {
    +	case *ast.Ident:
    +		log.Fatalf("unexpected Ident: %s", astString(tr.fset, x))
    +
    +	case *ast.BasicLit:
    +		y := y.(*ast.BasicLit)
    +		xval := exact.MakeFromLiteral(x.Value, x.Kind)
    +		yval := exact.MakeFromLiteral(y.Value, y.Kind)
    +		return exact.Compare(xval, token.EQL, yval)
    +
    +	case *ast.FuncLit:
    +		// func literals (and thus statement syntax) never match.
    +		return false
    +
    +	case *ast.CompositeLit:
    +		y := y.(*ast.CompositeLit)
    +		return (x.Type == nil) == (y.Type == nil) &&
    +			(x.Type == nil || tr.matchType(x.Type, y.Type)) &&
    +			tr.matchExprs(x.Elts, y.Elts)
    +
    +	case *ast.SelectorExpr:
    +		y := y.(*ast.SelectorExpr)
    +		return tr.matchSelectorExpr(x, y) &&
    +			tr.info.Selections[x].Obj() == tr.info.Selections[y].Obj()
    +
    +	case *ast.IndexExpr:
    +		y := y.(*ast.IndexExpr)
    +		return tr.matchExpr(x.X, y.X) &&
    +			tr.matchExpr(x.Index, y.Index)
    +
    +	case *ast.SliceExpr:
    +		y := y.(*ast.SliceExpr)
    +		return tr.matchExpr(x.X, y.X) &&
    +			tr.matchExpr(x.Low, y.Low) &&
    +			tr.matchExpr(x.High, y.High) &&
    +			tr.matchExpr(x.Max, y.Max) &&
    +			x.Slice3 == y.Slice3
    +
    +	case *ast.TypeAssertExpr:
    +		y := y.(*ast.TypeAssertExpr)
    +		return tr.matchExpr(x.X, y.X) &&
    +			tr.matchType(x.Type, y.Type)
    +
    +	case *ast.CallExpr:
    +		y := y.(*ast.CallExpr)
    +		match := tr.matchExpr // function call
    +		if tr.info.Types[x.Fun].IsType() {
    +			match = tr.matchType // type conversion
    +		}
    +		return x.Ellipsis.IsValid() == y.Ellipsis.IsValid() &&
    +			match(x.Fun, y.Fun) &&
    +			tr.matchExprs(x.Args, y.Args)
    +
    +	case *ast.StarExpr:
    +		y := y.(*ast.StarExpr)
    +		return tr.matchExpr(x.X, y.X)
    +
    +	case *ast.UnaryExpr:
    +		y := y.(*ast.UnaryExpr)
    +		return x.Op == y.Op &&
    +			tr.matchExpr(x.X, y.X)
    +
    +	case *ast.BinaryExpr:
    +		y := y.(*ast.BinaryExpr)
    +		return x.Op == y.Op &&
    +			tr.matchExpr(x.X, y.X) &&
    +			tr.matchExpr(x.Y, y.Y)
    +
    +	case *ast.KeyValueExpr:
    +		y := y.(*ast.KeyValueExpr)
    +		return tr.matchExpr(x.Key, y.Key) &&
    +			tr.matchExpr(x.Value, y.Value)
    +	}
    +
    +	panic(fmt.Sprintf("unhandled AST node type: %T", x))
    +}
    +
    +func (tr *Transformer) matchExprs(xx, yy []ast.Expr) bool {
    +	if len(xx) != len(yy) {
    +		return false
    +	}
    +	for i := range xx {
    +		if !tr.matchExpr(xx[i], yy[i]) {
    +			return false
    +		}
    +	}
    +	return true
    +}
    +
    +// matchType reports whether the two type ASTs denote identical types.
    +func (tr *Transformer) matchType(x, y ast.Expr) bool {
    +	tx := tr.info.Types[x].Type
    +	ty := tr.info.Types[y].Type
    +	return types.Identical(tx, ty)
    +}
    +
    +func (tr *Transformer) wildcardObj(x ast.Expr) (*types.Var, bool) {
    +	if x, ok := x.(*ast.Ident); ok && x != nil && tr.allowWildcards {
    +		if xobj, ok := tr.info.Uses[x].(*types.Var); ok && tr.wildcards[xobj] {
    +			return xobj, true
    +		}
    +	}
    +	return nil, false
    +}
    +
    +func (tr *Transformer) matchSelectorExpr(x, y *ast.SelectorExpr) bool {
    +	if xobj, ok := tr.wildcardObj(x.X); ok {
    +		field := x.Sel.Name
    +		yt := tr.info.TypeOf(y.X)
    +		o, _, _ := types.LookupFieldOrMethod(yt, true, tr.currentPkg, field)
    +		if o != nil {
    +			tr.env[xobj.Name()] = y.X // record binding
    +			return true
    +		}
    +	}
    +	return tr.matchExpr(x.X, y.X)
    +}
    +
    +func (tr *Transformer) matchWildcard(xobj *types.Var, y ast.Expr) bool {
    +	name := xobj.Name()
    +
    +	if tr.verbose {
    +		fmt.Fprintf(os.Stderr, "%s: wildcard %s -> %s?: ",
    +			tr.fset.Position(y.Pos()), name, astString(tr.fset, y))
    +	}
    +
    +	// Check that y is assignable to the declared type of the param.
    +	yt := tr.info.TypeOf(y)
    +	if yt == nil {
    +		// y has no type.
    +		// Perhaps it is an *ast.Ellipsis in [...]T{}, or
    +		// an *ast.KeyValueExpr in T{k: v}.
    +		// Clearly these pseudo-expressions cannot match a
    +		// wildcard, but it would nice if we had a way to ignore
    +		// the difference between T{v} and T{k:v} for structs.
    +		return false
    +	}
    +	if !types.AssignableTo(yt, xobj.Type()) {
    +		if tr.verbose {
    +			fmt.Fprintf(os.Stderr, "%s not assignable to %s\n", yt, xobj.Type())
    +		}
    +		return false
    +	}
    +
    +	// A wildcard matches any expression.
    +	// If it appears multiple times in the pattern, it must match
    +	// the same expression each time.
    +	if old, ok := tr.env[name]; ok {
    +		// found existing binding
    +		tr.allowWildcards = false
    +		r := tr.matchExpr(old, y)
    +		if tr.verbose {
    +			fmt.Fprintf(os.Stderr, "%t secondary match, primary was %s\n",
    +				r, astString(tr.fset, old))
    +		}
    +		tr.allowWildcards = true
    +		return r
    +	}
    +
    +	if tr.verbose {
    +		fmt.Fprintf(os.Stderr, "primary match\n")
    +	}
    +
    +	tr.env[name] = y // record binding
    +	return true
    +}
    +
    +// -- utilities --------------------------------------------------------
    +
    +func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) }
    +
    +// isRef returns the object referred to by this (possibly qualified)
    +// identifier, or nil if the node is not a referring identifier.
    +func isRef(n ast.Node, info *types.Info) types.Object {
    +	switch n := n.(type) {
    +	case *ast.Ident:
    +		return info.Uses[n]
    +
    +	case *ast.SelectorExpr:
    +		if _, ok := info.Selections[n]; !ok {
    +			// qualified ident
    +			return info.Uses[n.Sel]
    +		}
    +	}
    +	return nil
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/rewrite.go b/vendor/golang.org/x/tools/refactor/eg/rewrite.go
    new file mode 100644
    index 0000000000..d91a99ccc2
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/rewrite.go
    @@ -0,0 +1,346 @@
    +// 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 go1.5
    +
    +package eg
    +
    +// This file defines the AST rewriting pass.
    +// Most of it was plundered directly from
    +// $GOROOT/src/cmd/gofmt/rewrite.go (after convergent evolution).
    +
    +import (
    +	"fmt"
    +	"go/ast"
    +	"go/token"
    +	"go/types"
    +	"os"
    +	"reflect"
    +	"sort"
    +	"strconv"
    +	"strings"
    +
    +	"golang.org/x/tools/go/ast/astutil"
    +)
    +
    +// Transform applies the transformation to the specified parsed file,
    +// whose type information is supplied in info, and returns the number
    +// of replacements that were made.
    +//
    +// It mutates the AST in place (the identity of the root node is
    +// unchanged), and may add nodes for which no type information is
    +// available in info.
    +//
    +// Derived from rewriteFile in $GOROOT/src/cmd/gofmt/rewrite.go.
    +//
    +func (tr *Transformer) Transform(info *types.Info, pkg *types.Package, file *ast.File) int {
    +	if !tr.seenInfos[info] {
    +		tr.seenInfos[info] = true
    +		mergeTypeInfo(tr.info, info)
    +	}
    +	tr.currentPkg = pkg
    +	tr.nsubsts = 0
    +
    +	if tr.verbose {
    +		fmt.Fprintf(os.Stderr, "before: %s\n", astString(tr.fset, tr.before))
    +		fmt.Fprintf(os.Stderr, "after: %s\n", astString(tr.fset, tr.after))
    +	}
    +
    +	var f func(rv reflect.Value) reflect.Value
    +	f = func(rv reflect.Value) reflect.Value {
    +		// don't bother if val is invalid to start with
    +		if !rv.IsValid() {
    +			return reflect.Value{}
    +		}
    +
    +		rv = apply(f, rv)
    +
    +		e := rvToExpr(rv)
    +		if e != nil {
    +			savedEnv := tr.env
    +			tr.env = make(map[string]ast.Expr) // inefficient!  Use a slice of k/v pairs
    +
    +			if tr.matchExpr(tr.before, e) {
    +				if tr.verbose {
    +					fmt.Fprintf(os.Stderr, "%s matches %s",
    +						astString(tr.fset, tr.before), astString(tr.fset, e))
    +					if len(tr.env) > 0 {
    +						fmt.Fprintf(os.Stderr, " with:")
    +						for name, ast := range tr.env {
    +							fmt.Fprintf(os.Stderr, " %s->%s",
    +								name, astString(tr.fset, ast))
    +						}
    +					}
    +					fmt.Fprintf(os.Stderr, "\n")
    +				}
    +				tr.nsubsts++
    +
    +				// Clone the replacement tree, performing parameter substitution.
    +				// We update all positions to n.Pos() to aid comment placement.
    +				rv = tr.subst(tr.env, reflect.ValueOf(tr.after),
    +					reflect.ValueOf(e.Pos()))
    +			}
    +			tr.env = savedEnv
    +		}
    +
    +		return rv
    +	}
    +	file2 := apply(f, reflect.ValueOf(file)).Interface().(*ast.File)
    +
    +	// By construction, the root node is unchanged.
    +	if file != file2 {
    +		panic("BUG")
    +	}
    +
    +	// Add any necessary imports.
    +	// TODO(adonovan): remove no-longer needed imports too.
    +	if tr.nsubsts > 0 {
    +		pkgs := make(map[string]*types.Package)
    +		for obj := range tr.importedObjs {
    +			pkgs[obj.Pkg().Path()] = obj.Pkg()
    +		}
    +
    +		for _, imp := range file.Imports {
    +			path, _ := strconv.Unquote(imp.Path.Value)
    +			delete(pkgs, path)
    +		}
    +		delete(pkgs, pkg.Path()) // don't import self
    +
    +		// NB: AddImport may completely replace the AST!
    +		// It thus renders info and tr.info no longer relevant to file.
    +		var paths []string
    +		for path := range pkgs {
    +			paths = append(paths, path)
    +		}
    +		sort.Strings(paths)
    +		for _, path := range paths {
    +			astutil.AddImport(tr.fset, file, path)
    +		}
    +	}
    +
    +	tr.currentPkg = nil
    +
    +	return tr.nsubsts
    +}
    +
    +// setValue is a wrapper for x.SetValue(y); it protects
    +// the caller from panics if x cannot be changed to y.
    +func setValue(x, y reflect.Value) {
    +	// don't bother if y is invalid to start with
    +	if !y.IsValid() {
    +		return
    +	}
    +	defer func() {
    +		if x := recover(); x != nil {
    +			if s, ok := x.(string); ok &&
    +				(strings.Contains(s, "type mismatch") || strings.Contains(s, "not assignable")) {
    +				// x cannot be set to y - ignore this rewrite
    +				return
    +			}
    +			panic(x)
    +		}
    +	}()
    +	x.Set(y)
    +}
    +
    +// Values/types for special cases.
    +var (
    +	objectPtrNil = reflect.ValueOf((*ast.Object)(nil))
    +	scopePtrNil  = reflect.ValueOf((*ast.Scope)(nil))
    +
    +	identType        = reflect.TypeOf((*ast.Ident)(nil))
    +	selectorExprType = reflect.TypeOf((*ast.SelectorExpr)(nil))
    +	objectPtrType    = reflect.TypeOf((*ast.Object)(nil))
    +	positionType     = reflect.TypeOf(token.NoPos)
    +	callExprType     = reflect.TypeOf((*ast.CallExpr)(nil))
    +	scopePtrType     = reflect.TypeOf((*ast.Scope)(nil))
    +)
    +
    +// apply replaces each AST field x in val with f(x), returning val.
    +// To avoid extra conversions, f operates on the reflect.Value form.
    +func apply(f func(reflect.Value) reflect.Value, val reflect.Value) reflect.Value {
    +	if !val.IsValid() {
    +		return reflect.Value{}
    +	}
    +
    +	// *ast.Objects introduce cycles and are likely incorrect after
    +	// rewrite; don't follow them but replace with nil instead
    +	if val.Type() == objectPtrType {
    +		return objectPtrNil
    +	}
    +
    +	// similarly for scopes: they are likely incorrect after a rewrite;
    +	// replace them with nil
    +	if val.Type() == scopePtrType {
    +		return scopePtrNil
    +	}
    +
    +	switch v := reflect.Indirect(val); v.Kind() {
    +	case reflect.Slice:
    +		for i := 0; i < v.Len(); i++ {
    +			e := v.Index(i)
    +			setValue(e, f(e))
    +		}
    +	case reflect.Struct:
    +		for i := 0; i < v.NumField(); i++ {
    +			e := v.Field(i)
    +			setValue(e, f(e))
    +		}
    +	case reflect.Interface:
    +		e := v.Elem()
    +		setValue(v, f(e))
    +	}
    +	return val
    +}
    +
    +// subst returns a copy of (replacement) pattern with values from env
    +// substituted in place of wildcards and pos used as the position of
    +// tokens from the pattern.  if env == nil, subst returns a copy of
    +// pattern and doesn't change the line number information.
    +func (tr *Transformer) subst(env map[string]ast.Expr, pattern, pos reflect.Value) reflect.Value {
    +	if !pattern.IsValid() {
    +		return reflect.Value{}
    +	}
    +
    +	// *ast.Objects introduce cycles and are likely incorrect after
    +	// rewrite; don't follow them but replace with nil instead
    +	if pattern.Type() == objectPtrType {
    +		return objectPtrNil
    +	}
    +
    +	// similarly for scopes: they are likely incorrect after a rewrite;
    +	// replace them with nil
    +	if pattern.Type() == scopePtrType {
    +		return scopePtrNil
    +	}
    +
    +	// Wildcard gets replaced with map value.
    +	if env != nil && pattern.Type() == identType {
    +		id := pattern.Interface().(*ast.Ident)
    +		if old, ok := env[id.Name]; ok {
    +			return tr.subst(nil, reflect.ValueOf(old), reflect.Value{})
    +		}
    +	}
    +
    +	// Emit qualified identifiers in the pattern by appropriate
    +	// (possibly qualified) identifier in the input.
    +	//
    +	// The template cannot contain dot imports, so all identifiers
    +	// for imported objects are explicitly qualified.
    +	//
    +	// We assume (unsoundly) that there are no dot or named
    +	// imports in the input code, nor are any imported package
    +	// names shadowed, so the usual normal qualified identifier
    +	// syntax may be used.
    +	// TODO(adonovan): fix: avoid this assumption.
    +	//
    +	// A refactoring may be applied to a package referenced by the
    +	// template.  Objects belonging to the current package are
    +	// denoted by unqualified identifiers.
    +	//
    +	if tr.importedObjs != nil && pattern.Type() == selectorExprType {
    +		obj := isRef(pattern.Interface().(*ast.SelectorExpr), tr.info)
    +		if obj != nil {
    +			if sel, ok := tr.importedObjs[obj]; ok {
    +				var id ast.Expr
    +				if obj.Pkg() == tr.currentPkg {
    +					id = sel.Sel // unqualified
    +				} else {
    +					id = sel // pkg-qualified
    +				}
    +
    +				// Return a clone of id.
    +				saved := tr.importedObjs
    +				tr.importedObjs = nil // break cycle
    +				r := tr.subst(nil, reflect.ValueOf(id), pos)
    +				tr.importedObjs = saved
    +				return r
    +			}
    +		}
    +	}
    +
    +	if pos.IsValid() && pattern.Type() == positionType {
    +		// use new position only if old position was valid in the first place
    +		if old := pattern.Interface().(token.Pos); !old.IsValid() {
    +			return pattern
    +		}
    +		return pos
    +	}
    +
    +	// Otherwise copy.
    +	switch p := pattern; p.Kind() {
    +	case reflect.Slice:
    +		v := reflect.MakeSlice(p.Type(), p.Len(), p.Len())
    +		for i := 0; i < p.Len(); i++ {
    +			v.Index(i).Set(tr.subst(env, p.Index(i), pos))
    +		}
    +		return v
    +
    +	case reflect.Struct:
    +		v := reflect.New(p.Type()).Elem()
    +		for i := 0; i < p.NumField(); i++ {
    +			v.Field(i).Set(tr.subst(env, p.Field(i), pos))
    +		}
    +		return v
    +
    +	case reflect.Ptr:
    +		v := reflect.New(p.Type()).Elem()
    +		if elem := p.Elem(); elem.IsValid() {
    +			v.Set(tr.subst(env, elem, pos).Addr())
    +		}
    +
    +		// Duplicate type information for duplicated ast.Expr.
    +		// All ast.Node implementations are *structs,
    +		// so this case catches them all.
    +		if e := rvToExpr(v); e != nil {
    +			updateTypeInfo(tr.info, e, p.Interface().(ast.Expr))
    +		}
    +		return v
    +
    +	case reflect.Interface:
    +		v := reflect.New(p.Type()).Elem()
    +		if elem := p.Elem(); elem.IsValid() {
    +			v.Set(tr.subst(env, elem, pos))
    +		}
    +		return v
    +	}
    +
    +	return pattern
    +}
    +
    +// -- utilities -------------------------------------------------------
    +
    +func rvToExpr(rv reflect.Value) ast.Expr {
    +	if rv.CanInterface() {
    +		if e, ok := rv.Interface().(ast.Expr); ok {
    +			return e
    +		}
    +	}
    +	return nil
    +}
    +
    +// updateTypeInfo duplicates type information for the existing AST old
    +// so that it also applies to duplicated AST new.
    +func updateTypeInfo(info *types.Info, new, old ast.Expr) {
    +	switch new := new.(type) {
    +	case *ast.Ident:
    +		orig := old.(*ast.Ident)
    +		if obj, ok := info.Defs[orig]; ok {
    +			info.Defs[new] = obj
    +		}
    +		if obj, ok := info.Uses[orig]; ok {
    +			info.Uses[new] = obj
    +		}
    +
    +	case *ast.SelectorExpr:
    +		orig := old.(*ast.SelectorExpr)
    +		if sel, ok := info.Selections[orig]; ok {
    +			info.Selections[new] = sel
    +		}
    +	}
    +
    +	if tv, ok := info.Types[old]; ok {
    +		info.Types[new] = tv
    +	}
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/rewrite14.go b/vendor/golang.org/x/tools/refactor/eg/rewrite14.go
    new file mode 100644
    index 0000000000..01b4fe2dc4
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/rewrite14.go
    @@ -0,0 +1,346 @@
    +// 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 !go1.5
    +
    +package eg
    +
    +// This file defines the AST rewriting pass.
    +// Most of it was plundered directly from
    +// $GOROOT/src/cmd/gofmt/rewrite.go (after convergent evolution).
    +
    +import (
    +	"fmt"
    +	"go/ast"
    +	"go/token"
    +	"os"
    +	"reflect"
    +	"sort"
    +	"strconv"
    +	"strings"
    +
    +	"golang.org/x/tools/go/ast/astutil"
    +	"golang.org/x/tools/go/types"
    +)
    +
    +// Transform applies the transformation to the specified parsed file,
    +// whose type information is supplied in info, and returns the number
    +// of replacements that were made.
    +//
    +// It mutates the AST in place (the identity of the root node is
    +// unchanged), and may add nodes for which no type information is
    +// available in info.
    +//
    +// Derived from rewriteFile in $GOROOT/src/cmd/gofmt/rewrite.go.
    +//
    +func (tr *Transformer) Transform(info *types.Info, pkg *types.Package, file *ast.File) int {
    +	if !tr.seenInfos[info] {
    +		tr.seenInfos[info] = true
    +		mergeTypeInfo(tr.info, info)
    +	}
    +	tr.currentPkg = pkg
    +	tr.nsubsts = 0
    +
    +	if tr.verbose {
    +		fmt.Fprintf(os.Stderr, "before: %s\n", astString(tr.fset, tr.before))
    +		fmt.Fprintf(os.Stderr, "after: %s\n", astString(tr.fset, tr.after))
    +	}
    +
    +	var f func(rv reflect.Value) reflect.Value
    +	f = func(rv reflect.Value) reflect.Value {
    +		// don't bother if val is invalid to start with
    +		if !rv.IsValid() {
    +			return reflect.Value{}
    +		}
    +
    +		rv = apply(f, rv)
    +
    +		e := rvToExpr(rv)
    +		if e != nil {
    +			savedEnv := tr.env
    +			tr.env = make(map[string]ast.Expr) // inefficient!  Use a slice of k/v pairs
    +
    +			if tr.matchExpr(tr.before, e) {
    +				if tr.verbose {
    +					fmt.Fprintf(os.Stderr, "%s matches %s",
    +						astString(tr.fset, tr.before), astString(tr.fset, e))
    +					if len(tr.env) > 0 {
    +						fmt.Fprintf(os.Stderr, " with:")
    +						for name, ast := range tr.env {
    +							fmt.Fprintf(os.Stderr, " %s->%s",
    +								name, astString(tr.fset, ast))
    +						}
    +					}
    +					fmt.Fprintf(os.Stderr, "\n")
    +				}
    +				tr.nsubsts++
    +
    +				// Clone the replacement tree, performing parameter substitution.
    +				// We update all positions to n.Pos() to aid comment placement.
    +				rv = tr.subst(tr.env, reflect.ValueOf(tr.after),
    +					reflect.ValueOf(e.Pos()))
    +			}
    +			tr.env = savedEnv
    +		}
    +
    +		return rv
    +	}
    +	file2 := apply(f, reflect.ValueOf(file)).Interface().(*ast.File)
    +
    +	// By construction, the root node is unchanged.
    +	if file != file2 {
    +		panic("BUG")
    +	}
    +
    +	// Add any necessary imports.
    +	// TODO(adonovan): remove no-longer needed imports too.
    +	if tr.nsubsts > 0 {
    +		pkgs := make(map[string]*types.Package)
    +		for obj := range tr.importedObjs {
    +			pkgs[obj.Pkg().Path()] = obj.Pkg()
    +		}
    +
    +		for _, imp := range file.Imports {
    +			path, _ := strconv.Unquote(imp.Path.Value)
    +			delete(pkgs, path)
    +		}
    +		delete(pkgs, pkg.Path()) // don't import self
    +
    +		// NB: AddImport may completely replace the AST!
    +		// It thus renders info and tr.info no longer relevant to file.
    +		var paths []string
    +		for path := range pkgs {
    +			paths = append(paths, path)
    +		}
    +		sort.Strings(paths)
    +		for _, path := range paths {
    +			astutil.AddImport(tr.fset, file, path)
    +		}
    +	}
    +
    +	tr.currentPkg = nil
    +
    +	return tr.nsubsts
    +}
    +
    +// setValue is a wrapper for x.SetValue(y); it protects
    +// the caller from panics if x cannot be changed to y.
    +func setValue(x, y reflect.Value) {
    +	// don't bother if y is invalid to start with
    +	if !y.IsValid() {
    +		return
    +	}
    +	defer func() {
    +		if x := recover(); x != nil {
    +			if s, ok := x.(string); ok &&
    +				(strings.Contains(s, "type mismatch") || strings.Contains(s, "not assignable")) {
    +				// x cannot be set to y - ignore this rewrite
    +				return
    +			}
    +			panic(x)
    +		}
    +	}()
    +	x.Set(y)
    +}
    +
    +// Values/types for special cases.
    +var (
    +	objectPtrNil = reflect.ValueOf((*ast.Object)(nil))
    +	scopePtrNil  = reflect.ValueOf((*ast.Scope)(nil))
    +
    +	identType        = reflect.TypeOf((*ast.Ident)(nil))
    +	selectorExprType = reflect.TypeOf((*ast.SelectorExpr)(nil))
    +	objectPtrType    = reflect.TypeOf((*ast.Object)(nil))
    +	positionType     = reflect.TypeOf(token.NoPos)
    +	callExprType     = reflect.TypeOf((*ast.CallExpr)(nil))
    +	scopePtrType     = reflect.TypeOf((*ast.Scope)(nil))
    +)
    +
    +// apply replaces each AST field x in val with f(x), returning val.
    +// To avoid extra conversions, f operates on the reflect.Value form.
    +func apply(f func(reflect.Value) reflect.Value, val reflect.Value) reflect.Value {
    +	if !val.IsValid() {
    +		return reflect.Value{}
    +	}
    +
    +	// *ast.Objects introduce cycles and are likely incorrect after
    +	// rewrite; don't follow them but replace with nil instead
    +	if val.Type() == objectPtrType {
    +		return objectPtrNil
    +	}
    +
    +	// similarly for scopes: they are likely incorrect after a rewrite;
    +	// replace them with nil
    +	if val.Type() == scopePtrType {
    +		return scopePtrNil
    +	}
    +
    +	switch v := reflect.Indirect(val); v.Kind() {
    +	case reflect.Slice:
    +		for i := 0; i < v.Len(); i++ {
    +			e := v.Index(i)
    +			setValue(e, f(e))
    +		}
    +	case reflect.Struct:
    +		for i := 0; i < v.NumField(); i++ {
    +			e := v.Field(i)
    +			setValue(e, f(e))
    +		}
    +	case reflect.Interface:
    +		e := v.Elem()
    +		setValue(v, f(e))
    +	}
    +	return val
    +}
    +
    +// subst returns a copy of (replacement) pattern with values from env
    +// substituted in place of wildcards and pos used as the position of
    +// tokens from the pattern.  if env == nil, subst returns a copy of
    +// pattern and doesn't change the line number information.
    +func (tr *Transformer) subst(env map[string]ast.Expr, pattern, pos reflect.Value) reflect.Value {
    +	if !pattern.IsValid() {
    +		return reflect.Value{}
    +	}
    +
    +	// *ast.Objects introduce cycles and are likely incorrect after
    +	// rewrite; don't follow them but replace with nil instead
    +	if pattern.Type() == objectPtrType {
    +		return objectPtrNil
    +	}
    +
    +	// similarly for scopes: they are likely incorrect after a rewrite;
    +	// replace them with nil
    +	if pattern.Type() == scopePtrType {
    +		return scopePtrNil
    +	}
    +
    +	// Wildcard gets replaced with map value.
    +	if env != nil && pattern.Type() == identType {
    +		id := pattern.Interface().(*ast.Ident)
    +		if old, ok := env[id.Name]; ok {
    +			return tr.subst(nil, reflect.ValueOf(old), reflect.Value{})
    +		}
    +	}
    +
    +	// Emit qualified identifiers in the pattern by appropriate
    +	// (possibly qualified) identifier in the input.
    +	//
    +	// The template cannot contain dot imports, so all identifiers
    +	// for imported objects are explicitly qualified.
    +	//
    +	// We assume (unsoundly) that there are no dot or named
    +	// imports in the input code, nor are any imported package
    +	// names shadowed, so the usual normal qualified identifier
    +	// syntax may be used.
    +	// TODO(adonovan): fix: avoid this assumption.
    +	//
    +	// A refactoring may be applied to a package referenced by the
    +	// template.  Objects belonging to the current package are
    +	// denoted by unqualified identifiers.
    +	//
    +	if tr.importedObjs != nil && pattern.Type() == selectorExprType {
    +		obj := isRef(pattern.Interface().(*ast.SelectorExpr), tr.info)
    +		if obj != nil {
    +			if sel, ok := tr.importedObjs[obj]; ok {
    +				var id ast.Expr
    +				if obj.Pkg() == tr.currentPkg {
    +					id = sel.Sel // unqualified
    +				} else {
    +					id = sel // pkg-qualified
    +				}
    +
    +				// Return a clone of id.
    +				saved := tr.importedObjs
    +				tr.importedObjs = nil // break cycle
    +				r := tr.subst(nil, reflect.ValueOf(id), pos)
    +				tr.importedObjs = saved
    +				return r
    +			}
    +		}
    +	}
    +
    +	if pos.IsValid() && pattern.Type() == positionType {
    +		// use new position only if old position was valid in the first place
    +		if old := pattern.Interface().(token.Pos); !old.IsValid() {
    +			return pattern
    +		}
    +		return pos
    +	}
    +
    +	// Otherwise copy.
    +	switch p := pattern; p.Kind() {
    +	case reflect.Slice:
    +		v := reflect.MakeSlice(p.Type(), p.Len(), p.Len())
    +		for i := 0; i < p.Len(); i++ {
    +			v.Index(i).Set(tr.subst(env, p.Index(i), pos))
    +		}
    +		return v
    +
    +	case reflect.Struct:
    +		v := reflect.New(p.Type()).Elem()
    +		for i := 0; i < p.NumField(); i++ {
    +			v.Field(i).Set(tr.subst(env, p.Field(i), pos))
    +		}
    +		return v
    +
    +	case reflect.Ptr:
    +		v := reflect.New(p.Type()).Elem()
    +		if elem := p.Elem(); elem.IsValid() {
    +			v.Set(tr.subst(env, elem, pos).Addr())
    +		}
    +
    +		// Duplicate type information for duplicated ast.Expr.
    +		// All ast.Node implementations are *structs,
    +		// so this case catches them all.
    +		if e := rvToExpr(v); e != nil {
    +			updateTypeInfo(tr.info, e, p.Interface().(ast.Expr))
    +		}
    +		return v
    +
    +	case reflect.Interface:
    +		v := reflect.New(p.Type()).Elem()
    +		if elem := p.Elem(); elem.IsValid() {
    +			v.Set(tr.subst(env, elem, pos))
    +		}
    +		return v
    +	}
    +
    +	return pattern
    +}
    +
    +// -- utilities -------------------------------------------------------
    +
    +func rvToExpr(rv reflect.Value) ast.Expr {
    +	if rv.CanInterface() {
    +		if e, ok := rv.Interface().(ast.Expr); ok {
    +			return e
    +		}
    +	}
    +	return nil
    +}
    +
    +// updateTypeInfo duplicates type information for the existing AST old
    +// so that it also applies to duplicated AST new.
    +func updateTypeInfo(info *types.Info, new, old ast.Expr) {
    +	switch new := new.(type) {
    +	case *ast.Ident:
    +		orig := old.(*ast.Ident)
    +		if obj, ok := info.Defs[orig]; ok {
    +			info.Defs[new] = obj
    +		}
    +		if obj, ok := info.Uses[orig]; ok {
    +			info.Uses[new] = obj
    +		}
    +
    +	case *ast.SelectorExpr:
    +		orig := old.(*ast.SelectorExpr)
    +		if sel, ok := info.Selections[orig]; ok {
    +			info.Selections[new] = sel
    +		}
    +	}
    +
    +	if tv, ok := info.Types[old]; ok {
    +		info.Types[new] = tv
    +	}
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/A.template b/vendor/golang.org/x/tools/refactor/eg/testdata/A.template
    new file mode 100644
    index 0000000000..f6119618b4
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/A.template
    @@ -0,0 +1,13 @@
    +// +build ignore
    +
    +package template
    +
    +// Basic test of type-aware expression refactoring.
    +
    +import (
    +	"errors"
    +	"fmt"
    +)
    +
    +func before(s string) error { return fmt.Errorf("%s", s) }
    +func after(s string) error  { return errors.New(s) }
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/A1.go b/vendor/golang.org/x/tools/refactor/eg/testdata/A1.go
    new file mode 100644
    index 0000000000..9e65eb36af
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/A1.go
    @@ -0,0 +1,51 @@
    +// +build ignore
    +
    +package A1
    +
    +import (
    +	. "fmt"
    +	myfmt "fmt"
    +	"os"
    +	"strings"
    +)
    +
    +func example(n int) {
    +	x := "foo" + strings.Repeat("\t", n)
    +	// Match, despite named import.
    +	myfmt.Errorf("%s", x)
    +
    +	// Match, despite dot import.
    +	Errorf("%s", x)
    +
    +	// Match: multiple matches in same function are possible.
    +	myfmt.Errorf("%s", x)
    +
    +	// No match: wildcarded operand has the wrong type.
    +	myfmt.Errorf("%s", 3)
    +
    +	// No match: function operand doesn't match.
    +	myfmt.Printf("%s", x)
    +
    +	// No match again, dot import.
    +	Printf("%s", x)
    +
    +	// Match.
    +	myfmt.Fprint(os.Stderr, myfmt.Errorf("%s", x+"foo"))
    +
    +	// No match: though this literally matches the template,
    +	// fmt doesn't resolve to a package here.
    +	var fmt struct{ Errorf func(string, string) }
    +	fmt.Errorf("%s", x)
    +
    +	// Recursive matching:
    +
    +	// Match: both matches are well-typed, so both succeed.
    +	myfmt.Errorf("%s", myfmt.Errorf("%s", x+"foo").Error())
    +
    +	// Outer match succeeds, inner doesn't: 3 has wrong type.
    +	myfmt.Errorf("%s", myfmt.Errorf("%s", 3).Error())
    +
    +	// Inner match succeeds, outer doesn't: the inner replacement
    +	// has the wrong type (error not string).
    +	myfmt.Errorf("%s", myfmt.Errorf("%s", x+"foo"))
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/A1.golden b/vendor/golang.org/x/tools/refactor/eg/testdata/A1.golden
    new file mode 100644
    index 0000000000..7eb2934f6f
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/A1.golden
    @@ -0,0 +1,52 @@
    +// +build ignore
    +
    +package A1
    +
    +import (
    +	"errors"
    +	. "fmt"
    +	myfmt "fmt"
    +	"os"
    +	"strings"
    +)
    +
    +func example(n int) {
    +	x := "foo" + strings.Repeat("\t", n)
    +	// Match, despite named import.
    +	errors.New(x)
    +
    +	// Match, despite dot import.
    +	errors.New(x)
    +
    +	// Match: multiple matches in same function are possible.
    +	errors.New(x)
    +
    +	// No match: wildcarded operand has the wrong type.
    +	myfmt.Errorf("%s", 3)
    +
    +	// No match: function operand doesn't match.
    +	myfmt.Printf("%s", x)
    +
    +	// No match again, dot import.
    +	Printf("%s", x)
    +
    +	// Match.
    +	myfmt.Fprint(os.Stderr, errors.New(x+"foo"))
    +
    +	// No match: though this literally matches the template,
    +	// fmt doesn't resolve to a package here.
    +	var fmt struct{ Errorf func(string, string) }
    +	fmt.Errorf("%s", x)
    +
    +	// Recursive matching:
    +
    +	// Match: both matches are well-typed, so both succeed.
    +	errors.New(errors.New(x + "foo").Error())
    +
    +	// Outer match succeeds, inner doesn't: 3 has wrong type.
    +	errors.New(myfmt.Errorf("%s", 3).Error())
    +
    +	// Inner match succeeds, outer doesn't: the inner replacement
    +	// has the wrong type (error not string).
    +	myfmt.Errorf("%s", errors.New(x+"foo"))
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/A2.go b/vendor/golang.org/x/tools/refactor/eg/testdata/A2.go
    new file mode 100644
    index 0000000000..3ae29ad771
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/A2.go
    @@ -0,0 +1,12 @@
    +// +build ignore
    +
    +package A2
    +
    +// This refactoring causes addition of "errors" import.
    +// TODO(adonovan): fix: it should also remove "fmt".
    +
    +import myfmt "fmt"
    +
    +func example(n int) {
    +	myfmt.Errorf("%s", "")
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/A2.golden b/vendor/golang.org/x/tools/refactor/eg/testdata/A2.golden
    new file mode 100644
    index 0000000000..b6e3a6d7ae
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/A2.golden
    @@ -0,0 +1,15 @@
    +// +build ignore
    +
    +package A2
    +
    +// This refactoring causes addition of "errors" import.
    +// TODO(adonovan): fix: it should also remove "fmt".
    +
    +import (
    +	"errors"
    +	myfmt "fmt"
    +)
    +
    +func example(n int) {
    +	errors.New("")
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/B.template b/vendor/golang.org/x/tools/refactor/eg/testdata/B.template
    new file mode 100644
    index 0000000000..c16627bd55
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/B.template
    @@ -0,0 +1,9 @@
    +package template
    +
    +// Basic test of expression refactoring.
    +// (Types are not important in this case; it could be done with gofmt -r.)
    +
    +import "time"
    +
    +func before(t time.Time) time.Duration { return time.Now().Sub(t) }
    +func after(t time.Time) time.Duration  { return time.Since(t) }
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/B1.go b/vendor/golang.org/x/tools/refactor/eg/testdata/B1.go
    new file mode 100644
    index 0000000000..8b52546346
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/B1.go
    @@ -0,0 +1,17 @@
    +// +build ignore
    +
    +package B1
    +
    +import "time"
    +
    +var startup = time.Now()
    +
    +func example() time.Duration {
    +	before := time.Now()
    +	time.Sleep(1)
    +	return time.Now().Sub(before)
    +}
    +
    +func msSinceStartup() int64 {
    +	return int64(time.Now().Sub(startup) / time.Millisecond)
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/B1.golden b/vendor/golang.org/x/tools/refactor/eg/testdata/B1.golden
    new file mode 100644
    index 0000000000..4d4da2185d
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/B1.golden
    @@ -0,0 +1,17 @@
    +// +build ignore
    +
    +package B1
    +
    +import "time"
    +
    +var startup = time.Now()
    +
    +func example() time.Duration {
    +	before := time.Now()
    +	time.Sleep(1)
    +	return time.Since(before)
    +}
    +
    +func msSinceStartup() int64 {
    +	return int64(time.Since(startup) / time.Millisecond)
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/C.template b/vendor/golang.org/x/tools/refactor/eg/testdata/C.template
    new file mode 100644
    index 0000000000..f6f94d4aa9
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/C.template
    @@ -0,0 +1,10 @@
    +package template
    +
    +// Test of repeated use of wildcard in pattern.
    +
    +// NB: multiple patterns would be required to handle variants such as
    +// s[:len(s)], s[x:len(s)], etc, since a wildcard can't match nothing at all.
    +// TODO(adonovan): support multiple templates in a single pass.
    +
    +func before(s string) string { return s[:len(s)] }
    +func after(s string) string  { return s }
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/C1.go b/vendor/golang.org/x/tools/refactor/eg/testdata/C1.go
    new file mode 100644
    index 0000000000..523b3885dd
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/C1.go
    @@ -0,0 +1,22 @@
    +// +build ignore
    +
    +package C1
    +
    +import "strings"
    +
    +func example() {
    +	x := "foo"
    +	println(x[:len(x)])
    +
    +	// Match, but the transformation is not sound w.r.t. possible side effects.
    +	println(strings.Repeat("*", 3)[:len(strings.Repeat("*", 3))])
    +
    +	// No match, since second use of wildcard doesn't match first.
    +	println(strings.Repeat("*", 3)[:len(strings.Repeat("*", 2))])
    +
    +	// Recursive match demonstrating bottom-up rewrite:
    +	// only after the inner replacement occurs does the outer syntax match.
    +	println((x[:len(x)])[:len(x[:len(x)])])
    +	// -> (x[:len(x)])
    +	// -> x
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/C1.golden b/vendor/golang.org/x/tools/refactor/eg/testdata/C1.golden
    new file mode 100644
    index 0000000000..ae7759d79c
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/C1.golden
    @@ -0,0 +1,22 @@
    +// +build ignore
    +
    +package C1
    +
    +import "strings"
    +
    +func example() {
    +	x := "foo"
    +	println(x)
    +
    +	// Match, but the transformation is not sound w.r.t. possible side effects.
    +	println(strings.Repeat("*", 3))
    +
    +	// No match, since second use of wildcard doesn't match first.
    +	println(strings.Repeat("*", 3)[:len(strings.Repeat("*", 2))])
    +
    +	// Recursive match demonstrating bottom-up rewrite:
    +	// only after the inner replacement occurs does the outer syntax match.
    +	println(x)
    +	// -> (x[:len(x)])
    +	// -> x
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/D.template b/vendor/golang.org/x/tools/refactor/eg/testdata/D.template
    new file mode 100644
    index 0000000000..6d3b6feb71
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/D.template
    @@ -0,0 +1,8 @@
    +package template
    +
    +import "fmt"
    +
    +// Test of semantic (not syntactic) matching of basic literals.
    +
    +func before() (int, error) { return fmt.Println(123, "a") }
    +func after() (int, error)  { return fmt.Println(456, "!") }
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/D1.go b/vendor/golang.org/x/tools/refactor/eg/testdata/D1.go
    new file mode 100644
    index 0000000000..ae0a806050
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/D1.go
    @@ -0,0 +1,12 @@
    +// +build ignore
    +
    +package D1
    +
    +import "fmt"
    +
    +func example() {
    +	fmt.Println(123, "a")         // match
    +	fmt.Println(0x7b, `a`)        // match
    +	fmt.Println(0173, "\x61")     // match
    +	fmt.Println(100+20+3, "a"+"") // no match: constant expressions, but not basic literals
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/D1.golden b/vendor/golang.org/x/tools/refactor/eg/testdata/D1.golden
    new file mode 100644
    index 0000000000..2932652873
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/D1.golden
    @@ -0,0 +1,12 @@
    +// +build ignore
    +
    +package D1
    +
    +import "fmt"
    +
    +func example() {
    +	fmt.Println(456, "!")         // match
    +	fmt.Println(456, "!")         // match
    +	fmt.Println(456, "!")         // match
    +	fmt.Println(100+20+3, "a"+"") // no match: constant expressions, but not basic literals
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/E.template b/vendor/golang.org/x/tools/refactor/eg/testdata/E.template
    new file mode 100644
    index 0000000000..4bbbd1139b
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/E.template
    @@ -0,0 +1,12 @@
    +package template
    +
    +import (
    +	"fmt"
    +	"log"
    +	"os"
    +)
    +
    +// Replace call to void function by call to non-void function.
    +
    +func before(x interface{}) { log.Fatal(x) }
    +func after(x interface{})  { fmt.Fprintf(os.Stderr, "warning: %v", x) }
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/E1.go b/vendor/golang.org/x/tools/refactor/eg/testdata/E1.go
    new file mode 100644
    index 0000000000..3ea1793f96
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/E1.go
    @@ -0,0 +1,9 @@
    +// +build ignore
    +
    +package E1
    +
    +import "log"
    +
    +func example() {
    +	log.Fatal("oops") // match
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/E1.golden b/vendor/golang.org/x/tools/refactor/eg/testdata/E1.golden
    new file mode 100644
    index 0000000000..796364f2d1
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/E1.golden
    @@ -0,0 +1,13 @@
    +// +build ignore
    +
    +package E1
    +
    +import (
    +	"fmt"
    +	"log"
    +	"os"
    +)
    +
    +func example() {
    +	fmt.Fprintf(os.Stderr, "warning: %v", "oops") // match
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/F.template b/vendor/golang.org/x/tools/refactor/eg/testdata/F.template
    new file mode 100644
    index 0000000000..21e1bd2a4f
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/F.template
    @@ -0,0 +1,8 @@
    +package templates
    +
    +// Test 
    +
    +import "sync"
    +
    +func before(s sync.RWMutex) { s.Lock() }
    +func after(s sync.RWMutex) { s.RLock() }
    \ No newline at end of file
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/F1.go b/vendor/golang.org/x/tools/refactor/eg/testdata/F1.go
    new file mode 100644
    index 0000000000..2258abda5f
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/F1.go
    @@ -0,0 +1,48 @@
    +// +build ignore
    +
    +package F1
    +
    +import "sync"
    +
    +func example(n int) {
    +	var x struct {
    +		mutex sync.RWMutex
    +	}
    +
    +	var y struct {
    +		sync.RWMutex
    +	}
    +
    +	type l struct {
    +		sync.RWMutex
    +	}
    +
    +	var z struct {
    +		l
    +	}
    +
    +	var a struct {
    +		*l
    +	}
    +
    +	var b struct{ Lock func() }
    +
    +	// Match
    +	x.mutex.Lock()
    +
    +	// Match
    +	y.Lock()
    +
    +	// Match indirect
    +	z.Lock()
    +
    +	// Should be no match however currently matches due to:
    +	// https://golang.org/issue/8584
    +	// Will start failing when this is fixed then just change golden to
    +	// No match pointer indirect
    +	// a.Lock()
    +	a.Lock()
    +
    +	// No match
    +	b.Lock()
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/F1.golden b/vendor/golang.org/x/tools/refactor/eg/testdata/F1.golden
    new file mode 100644
    index 0000000000..5ffda69855
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/F1.golden
    @@ -0,0 +1,48 @@
    +// +build ignore
    +
    +package F1
    +
    +import "sync"
    +
    +func example(n int) {
    +	var x struct {
    +		mutex sync.RWMutex
    +	}
    +
    +	var y struct {
    +		sync.RWMutex
    +	}
    +
    +	type l struct {
    +		sync.RWMutex
    +	}
    +
    +	var z struct {
    +		l
    +	}
    +
    +	var a struct {
    +		*l
    +	}
    +
    +	var b struct{ Lock func() }
    +
    +	// Match
    +	x.mutex.RLock()
    +
    +	// Match
    +	y.RLock()
    +
    +	// Match indirect
    +	z.RLock()
    +
    +	// Should be no match however currently matches due to:
    +	// https://golang.org/issue/8584
    +	// Will start failing when this is fixed then just change golden to
    +	// No match pointer indirect
    +	// a.Lock()
    +	a.RLock()
    +
    +	// No match
    +	b.Lock()
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/G.template b/vendor/golang.org/x/tools/refactor/eg/testdata/G.template
    new file mode 100644
    index 0000000000..69d84fe9f4
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/G.template
    @@ -0,0 +1,10 @@
    +package templates
    +
    +import (
    +	"go/ast" // defines many unencapsulated structs
    +	"go/token"
    +)
    +
    +func before(from, to token.Pos) ast.BadExpr { return ast.BadExpr{From: from, To: to} }
    +func after(from, to token.Pos) ast.BadExpr  { return ast.BadExpr{from, to} }
    +     
    \ No newline at end of file
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/G1.go b/vendor/golang.org/x/tools/refactor/eg/testdata/G1.go
    new file mode 100644
    index 0000000000..07aaff916c
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/G1.go
    @@ -0,0 +1,12 @@
    +// +build ignore
    +
    +package G1
    +
    +import "go/ast"
    +
    +func example() {
    +	_ = ast.BadExpr{From: 123, To: 456} // match
    +	_ = ast.BadExpr{123, 456}           // no match
    +	_ = ast.BadExpr{From: 123}          // no match
    +	_ = ast.BadExpr{To: 456}            // no match
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/G1.golden b/vendor/golang.org/x/tools/refactor/eg/testdata/G1.golden
    new file mode 100644
    index 0000000000..c93c53fc3b
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/G1.golden
    @@ -0,0 +1,12 @@
    +// +build ignore
    +
    +package G1
    +
    +import "go/ast"
    +
    +func example() {
    +	_ = ast.BadExpr{123, 456}  // match
    +	_ = ast.BadExpr{123, 456}  // no match
    +	_ = ast.BadExpr{From: 123} // no match
    +	_ = ast.BadExpr{To: 456}   // no match
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/H.template b/vendor/golang.org/x/tools/refactor/eg/testdata/H.template
    new file mode 100644
    index 0000000000..fa6f802c8a
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/H.template
    @@ -0,0 +1,9 @@
    +package templates
    +
    +import (
    +	"go/ast" // defines many unencapsulated structs
    +	"go/token"
    +)
    +
    +func before(from, to token.Pos) ast.BadExpr { return ast.BadExpr{from, to} }
    +func after(from, to token.Pos) ast.BadExpr  { return ast.BadExpr{From: from, To: to} }
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/H1.go b/vendor/golang.org/x/tools/refactor/eg/testdata/H1.go
    new file mode 100644
    index 0000000000..ef4291c18a
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/H1.go
    @@ -0,0 +1,12 @@
    +// +build ignore
    +
    +package H1
    +
    +import "go/ast"
    +
    +func example() {
    +	_ = ast.BadExpr{From: 123, To: 456} // no match
    +	_ = ast.BadExpr{123, 456}           // match
    +	_ = ast.BadExpr{From: 123}          // no match
    +	_ = ast.BadExpr{To: 456}            // no match
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/H1.golden b/vendor/golang.org/x/tools/refactor/eg/testdata/H1.golden
    new file mode 100644
    index 0000000000..a1e5961264
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/H1.golden
    @@ -0,0 +1,12 @@
    +// +build ignore
    +
    +package H1
    +
    +import "go/ast"
    +
    +func example() {
    +	_ = ast.BadExpr{From: 123, To: 456} // no match
    +	_ = ast.BadExpr{From: 123, To: 456} // match
    +	_ = ast.BadExpr{From: 123}          // no match
    +	_ = ast.BadExpr{To: 456}            // no match
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/bad_type.template b/vendor/golang.org/x/tools/refactor/eg/testdata/bad_type.template
    new file mode 100644
    index 0000000000..6d53d7e570
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/bad_type.template
    @@ -0,0 +1,8 @@
    +package template
    +
    +// Test in which replacement has a different type.
    +
    +const shouldFail = "int is not a safe replacement for string"
    +
    +func before() interface{} { return "three" }
    +func after() interface{}  { return 3 }
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/expr_type_mismatch.template b/vendor/golang.org/x/tools/refactor/eg/testdata/expr_type_mismatch.template
    new file mode 100644
    index 0000000000..2c5c3f0dc6
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/expr_type_mismatch.template
    @@ -0,0 +1,15 @@
    +package template
    +
    +import (
    +	"crypto/x509"
    +	"fmt"
    +)
    +
    +// This test demonstrates a false negative: according to the language
    +// rules this replacement should be ok, but types.Assignable doesn't work
    +// in the expected way (elementwise assignability) for tuples.
    +// Perhaps that's even a type-checker bug?
    +const shouldFail = "(n int, err error) is not a safe replacement for (key interface{}, err error)"
    +
    +func before() (interface{}, error) { return x509.ParsePKCS8PrivateKey(nil) }
    +func after() (interface{}, error)  { return fmt.Print() }
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/no_after_return.template b/vendor/golang.org/x/tools/refactor/eg/testdata/no_after_return.template
    new file mode 100644
    index 0000000000..536b01e678
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/no_after_return.template
    @@ -0,0 +1,6 @@
    +package template
    +
    +const shouldFail = "after: must contain a single statement"
    +
    +func before() int { return 0 }
    +func after() int  { println(); return 0 }
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/no_before.template b/vendor/golang.org/x/tools/refactor/eg/testdata/no_before.template
    new file mode 100644
    index 0000000000..9205e6677a
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/no_before.template
    @@ -0,0 +1,5 @@
    +package template
    +
    +const shouldFail = "no 'before' func found in template"
    +
    +func Before() {}
    diff --git a/vendor/golang.org/x/tools/refactor/eg/testdata/type_mismatch.template b/vendor/golang.org/x/tools/refactor/eg/testdata/type_mismatch.template
    new file mode 100644
    index 0000000000..787c9a7a8c
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/eg/testdata/type_mismatch.template
    @@ -0,0 +1,6 @@
    +package template
    +
    +const shouldFail = "different signatures"
    +
    +func before() int   { return 0 }
    +func after() string { return "" }
    diff --git a/vendor/golang.org/x/tools/refactor/importgraph/graph.go b/vendor/golang.org/x/tools/refactor/importgraph/graph.go
    new file mode 100644
    index 0000000000..d2d8f098b3
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/importgraph/graph.go
    @@ -0,0 +1,167 @@
    +// 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 importgraph computes the forward and reverse import
    +// dependency graphs for all packages in a Go workspace.
    +package importgraph // import "golang.org/x/tools/refactor/importgraph"
    +
    +import (
    +	"go/build"
    +	"sync"
    +
    +	"golang.org/x/tools/go/buildutil"
    +)
    +
    +// A Graph is an import dependency graph, either forward or reverse.
    +//
    +// The graph maps each node (a package import path) to the set of its
    +// successors in the graph.  For a forward graph, this is the set of
    +// imported packages (prerequisites); for a reverse graph, it is the set
    +// of importing packages (clients).
    +//
    +// Graph construction inspects all imports in each package's directory,
    +// including those in _test.go files, so the resulting graph may be cyclic.
    +type Graph map[string]map[string]bool
    +
    +func (g Graph) addEdge(from, to string) {
    +	edges := g[from]
    +	if edges == nil {
    +		edges = make(map[string]bool)
    +		g[from] = edges
    +	}
    +	edges[to] = true
    +}
    +
    +// Search returns all the nodes of the graph reachable from
    +// any of the specified roots, by following edges forwards.
    +// Relationally, this is the reflexive transitive closure.
    +func (g Graph) Search(roots ...string) map[string]bool {
    +	seen := make(map[string]bool)
    +	var visit func(x string)
    +	visit = func(x string) {
    +		if !seen[x] {
    +			seen[x] = true
    +			for y := range g[x] {
    +				visit(y)
    +			}
    +		}
    +	}
    +	for _, root := range roots {
    +		visit(root)
    +	}
    +	return seen
    +}
    +
    +// Build scans the specified Go workspace and builds the forward and
    +// reverse import dependency graphs for all its packages.
    +// It also returns a mapping from canonical import paths to errors for packages
    +// whose loading was not entirely successful.
    +// A package may appear in the graph and in the errors mapping.
    +// All package paths are canonical and may contain "/vendor/".
    +func Build(ctxt *build.Context) (forward, reverse Graph, errors map[string]error) {
    +	type importEdge struct {
    +		from, to string
    +	}
    +	type pathError struct {
    +		path string
    +		err  error
    +	}
    +
    +	ch := make(chan interface{})
    +
    +	go func() {
    +		sema := make(chan int, 20) // I/O concurrency limiting semaphore
    +		var wg sync.WaitGroup
    +		buildutil.ForEachPackage(ctxt, func(path string, err error) {
    +			if err != nil {
    +				ch <- pathError{path, err}
    +				return
    +			}
    +
    +			wg.Add(1)
    +			go func() {
    +				defer wg.Done()
    +
    +				sema <- 1
    +				bp, err := ctxt.Import(path, "", 0)
    +				<-sema
    +
    +				if err != nil {
    +					if _, ok := err.(*build.NoGoError); ok {
    +						// empty directory is not an error
    +					} else {
    +						ch <- pathError{path, err}
    +					}
    +					// Even in error cases, Import usually returns a package.
    +				}
    +
    +				// absolutize resolves an import path relative
    +				// to the current package bp.
    +				// The absolute form may contain "vendor".
    +				//
    +				// The vendoring feature slows down Build by 3×.
    +				// Here are timings from a 1400 package workspace:
    +				//    1100ms: current code (with vendor check)
    +				//     880ms: with a nonblocking cache around ctxt.IsDir
    +				//     840ms: nonblocking cache with duplicate suppression
    +				//     340ms: original code (no vendor check)
    +				// TODO(adonovan): optimize, somehow.
    +				memo := make(map[string]string)
    +				absolutize := func(path string) string {
    +					canon, ok := memo[path]
    +					if !ok {
    +						sema <- 1
    +						bp2, _ := ctxt.Import(path, bp.Dir, build.FindOnly)
    +						<-sema
    +
    +						if bp2 != nil {
    +							canon = bp2.ImportPath
    +						} else {
    +							canon = path
    +						}
    +						memo[path] = canon
    +					}
    +					return canon
    +				}
    +
    +				if bp != nil {
    +					for _, imp := range bp.Imports {
    +						ch <- importEdge{path, absolutize(imp)}
    +					}
    +					for _, imp := range bp.TestImports {
    +						ch <- importEdge{path, absolutize(imp)}
    +					}
    +					for _, imp := range bp.XTestImports {
    +						ch <- importEdge{path, absolutize(imp)}
    +					}
    +				}
    +
    +			}()
    +		})
    +		wg.Wait()
    +		close(ch)
    +	}()
    +
    +	forward = make(Graph)
    +	reverse = make(Graph)
    +
    +	for e := range ch {
    +		switch e := e.(type) {
    +		case pathError:
    +			if errors == nil {
    +				errors = make(map[string]error)
    +			}
    +			errors[e.path] = e.err
    +
    +		case importEdge:
    +			if e.to == "C" {
    +				continue // "C" is fake
    +			}
    +			forward.addEdge(e.from, e.to)
    +			reverse.addEdge(e.to, e.from)
    +		}
    +	}
    +
    +	return forward, reverse, errors
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/importgraph/graph_test.go b/vendor/golang.org/x/tools/refactor/importgraph/graph_test.go
    new file mode 100644
    index 0000000000..52dd769590
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/importgraph/graph_test.go
    @@ -0,0 +1,99 @@
    +// 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.
    +
    +// Incomplete std lib sources on Android.
    +
    +// +build !android
    +
    +package importgraph_test
    +
    +import (
    +	"go/build"
    +	"sort"
    +	"testing"
    +
    +	"golang.org/x/tools/refactor/importgraph"
    +
    +	_ "crypto/hmac" // just for test, below
    +)
    +
    +const this = "golang.org/x/tools/refactor/importgraph"
    +
    +func TestBuild(t *testing.T) {
    +	forward, reverse, errors := importgraph.Build(&build.Default)
    +
    +	// Test direct edges.
    +	// We throw in crypto/hmac to prove that external test files
    +	// (such as this one) are inspected.
    +	for _, p := range []string{"go/build", "testing", "crypto/hmac"} {
    +		if !forward[this][p] {
    +			t.Errorf("forward[importgraph][%s] not found", p)
    +		}
    +		if !reverse[p][this] {
    +			t.Errorf("reverse[%s][importgraph] not found", p)
    +		}
    +	}
    +
    +	// Test non-existent direct edges
    +	for _, p := range []string{"errors", "reflect"} {
    +		if forward[this][p] {
    +			t.Errorf("unexpected: forward[importgraph][%s] found", p)
    +		}
    +		if reverse[p][this] {
    +			t.Errorf("unexpected: reverse[%s][importgraph] found", p)
    +		}
    +	}
    +
    +	// Test Search is reflexive.
    +	if !forward.Search(this)[this] {
    +		t.Errorf("irreflexive: forward.Search(importgraph)[importgraph] not found")
    +	}
    +	if !reverse.Search(this)[this] {
    +		t.Errorf("irrefexive: reverse.Search(importgraph)[importgraph] not found")
    +	}
    +
    +	// Test Search is transitive.  (There is no direct edge to these packages.)
    +	for _, p := range []string{"errors", "reflect", "unsafe"} {
    +		if !forward.Search(this)[p] {
    +			t.Errorf("intransitive: forward.Search(importgraph)[%s] not found", p)
    +		}
    +		if !reverse.Search(p)[this] {
    +			t.Errorf("intransitive: reverse.Search(%s)[importgraph] not found", p)
    +		}
    +	}
    +
    +	// Test strongly-connected components.  Because A's external
    +	// test package can depend on B, and vice versa, most of the
    +	// standard libraries are mutually dependent when their external
    +	// tests are considered.
    +	//
    +	// For any nodes x, y in the same SCC, y appears in the results
    +	// of both forward and reverse searches starting from x
    +	if !forward.Search("fmt")["io"] ||
    +		!forward.Search("io")["fmt"] ||
    +		!reverse.Search("fmt")["io"] ||
    +		!reverse.Search("io")["fmt"] {
    +		t.Errorf("fmt and io are not mutually reachable despite being in the same SCC")
    +	}
    +
    +	// debugging
    +	if false {
    +		for path, err := range errors {
    +			t.Logf("%s: %s", path, err)
    +		}
    +		printSorted := func(direction string, g importgraph.Graph, start string) {
    +			t.Log(direction)
    +			var pkgs []string
    +			for pkg := range g.Search(start) {
    +				pkgs = append(pkgs, pkg)
    +			}
    +			sort.Strings(pkgs)
    +			for _, pkg := range pkgs {
    +				t.Logf("\t%s", pkg)
    +			}
    +		}
    +		printSorted("forward", forward, this)
    +		printSorted("reverse", reverse, this)
    +	}
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/rename/check.go b/vendor/golang.org/x/tools/refactor/rename/check.go
    new file mode 100644
    index 0000000000..cf1999e89c
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/rename/check.go
    @@ -0,0 +1,860 @@
    +// 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 go1.5
    +
    +package rename
    +
    +// This file defines the safety checks for each kind of renaming.
    +
    +import (
    +	"fmt"
    +	"go/ast"
    +	"go/token"
    +	"go/types"
    +
    +	"golang.org/x/tools/go/loader"
    +	"golang.org/x/tools/refactor/satisfy"
    +)
    +
    +// errorf reports an error (e.g. conflict) and prevents file modification.
    +func (r *renamer) errorf(pos token.Pos, format string, args ...interface{}) {
    +	r.hadConflicts = true
    +	reportError(r.iprog.Fset.Position(pos), fmt.Sprintf(format, args...))
    +}
    +
    +// check performs safety checks of the renaming of the 'from' object to r.to.
    +func (r *renamer) check(from types.Object) {
    +	if r.objsToUpdate[from] {
    +		return
    +	}
    +	r.objsToUpdate[from] = true
    +
    +	// NB: order of conditions is important.
    +	if from_, ok := from.(*types.PkgName); ok {
    +		r.checkInFileBlock(from_)
    +	} else if from_, ok := from.(*types.Label); ok {
    +		r.checkLabel(from_)
    +	} else if isPackageLevel(from) {
    +		r.checkInPackageBlock(from)
    +	} else if v, ok := from.(*types.Var); ok && v.IsField() {
    +		r.checkStructField(v)
    +	} else if f, ok := from.(*types.Func); ok && recv(f) != nil {
    +		r.checkMethod(f)
    +	} else if isLocal(from) {
    +		r.checkInLocalScope(from)
    +	} else {
    +		r.errorf(from.Pos(), "unexpected %s object %q (please report a bug)\n",
    +			objectKind(from), from)
    +	}
    +}
    +
    +// checkInFileBlock performs safety checks for renames of objects in the file block,
    +// i.e. imported package names.
    +func (r *renamer) checkInFileBlock(from *types.PkgName) {
    +	// Check import name is not "init".
    +	if r.to == "init" {
    +		r.errorf(from.Pos(), "%q is not a valid imported package name", r.to)
    +	}
    +
    +	// Check for conflicts between file and package block.
    +	if prev := from.Pkg().Scope().Lookup(r.to); prev != nil {
    +		r.errorf(from.Pos(), "renaming this %s %q to %q would conflict",
    +			objectKind(from), from.Name(), r.to)
    +		r.errorf(prev.Pos(), "\twith this package member %s",
    +			objectKind(prev))
    +		return // since checkInPackageBlock would report redundant errors
    +	}
    +
    +	// Check for conflicts in lexical scope.
    +	r.checkInLexicalScope(from, r.packages[from.Pkg()])
    +
    +	// Finally, modify ImportSpec syntax to add or remove the Name as needed.
    +	info, path, _ := r.iprog.PathEnclosingInterval(from.Pos(), from.Pos())
    +	if from.Imported().Name() == r.to {
    +		// ImportSpec.Name not needed
    +		path[1].(*ast.ImportSpec).Name = nil
    +	} else {
    +		// ImportSpec.Name needed
    +		if spec := path[1].(*ast.ImportSpec); spec.Name == nil {
    +			spec.Name = &ast.Ident{NamePos: spec.Path.Pos(), Name: r.to}
    +			info.Defs[spec.Name] = from
    +		}
    +	}
    +}
    +
    +// checkInPackageBlock performs safety checks for renames of
    +// func/var/const/type objects in the package block.
    +func (r *renamer) checkInPackageBlock(from types.Object) {
    +	// Check that there are no references to the name from another
    +	// package if the renaming would make it unexported.
    +	if ast.IsExported(from.Name()) && !ast.IsExported(r.to) {
    +		for pkg, info := range r.packages {
    +			if pkg == from.Pkg() {
    +				continue
    +			}
    +			if id := someUse(info, from); id != nil &&
    +				!r.checkExport(id, pkg, from) {
    +				break
    +			}
    +		}
    +	}
    +
    +	info := r.packages[from.Pkg()]
    +
    +	// Check that in the package block, "init" is a function, and never referenced.
    +	if r.to == "init" {
    +		kind := objectKind(from)
    +		if kind == "func" {
    +			// Reject if intra-package references to it exist.
    +			for id, obj := range info.Uses {
    +				if obj == from {
    +					r.errorf(from.Pos(),
    +						"renaming this func %q to %q would make it a package initializer",
    +						from.Name(), r.to)
    +					r.errorf(id.Pos(), "\tbut references to it exist")
    +					break
    +				}
    +			}
    +		} else {
    +			r.errorf(from.Pos(), "you cannot have a %s at package level named %q",
    +				kind, r.to)
    +		}
    +	}
    +
    +	// Check for conflicts between package block and all file blocks.
    +	for _, f := range info.Files {
    +		fileScope := info.Info.Scopes[f]
    +		b, prev := fileScope.LookupParent(r.to, token.NoPos)
    +		if b == fileScope {
    +			r.errorf(from.Pos(), "renaming this %s %q to %q would conflict",
    +				objectKind(from), from.Name(), r.to)
    +			r.errorf(prev.Pos(), "\twith this %s",
    +				objectKind(prev))
    +			return // since checkInPackageBlock would report redundant errors
    +		}
    +	}
    +
    +	// Check for conflicts in lexical scope.
    +	if from.Exported() {
    +		for _, info := range r.packages {
    +			r.checkInLexicalScope(from, info)
    +		}
    +	} else {
    +		r.checkInLexicalScope(from, info)
    +	}
    +}
    +
    +func (r *renamer) checkInLocalScope(from types.Object) {
    +	info := r.packages[from.Pkg()]
    +
    +	// Is this object an implicit local var for a type switch?
    +	// Each case has its own var, whose position is the decl of y,
    +	// but Ident in that decl does not appear in the Uses map.
    +	//
    +	//   switch y := x.(type) {	 // Defs[Ident(y)] is undefined
    +	//   case int:    print(y)       // Implicits[CaseClause(int)]    = Var(y_int)
    +	//   case string: print(y)       // Implicits[CaseClause(string)] = Var(y_string)
    +	//   }
    +	//
    +	var isCaseVar bool
    +	for syntax, obj := range info.Implicits {
    +		if _, ok := syntax.(*ast.CaseClause); ok && obj.Pos() == from.Pos() {
    +			isCaseVar = true
    +			r.check(obj)
    +		}
    +	}
    +
    +	r.checkInLexicalScope(from, info)
    +
    +	// Finally, if this was a type switch, change the variable y.
    +	if isCaseVar {
    +		_, path, _ := r.iprog.PathEnclosingInterval(from.Pos(), from.Pos())
    +		path[0].(*ast.Ident).Name = r.to // path is [Ident AssignStmt TypeSwitchStmt...]
    +	}
    +}
    +
    +// checkInLexicalScope performs safety checks that a renaming does not
    +// change the lexical reference structure of the specified package.
    +//
    +// For objects in lexical scope, there are three kinds of conflicts:
    +// same-, sub-, and super-block conflicts.  We will illustrate all three
    +// using this example:
    +//
    +//	var x int
    +//	var z int
    +//
    +//	func f(y int) {
    +//		print(x)
    +//		print(y)
    +//	}
    +//
    +// Renaming x to z encounters a SAME-BLOCK CONFLICT, because an object
    +// with the new name already exists, defined in the same lexical block
    +// as the old object.
    +//
    +// Renaming x to y encounters a SUB-BLOCK CONFLICT, because there exists
    +// a reference to x from within (what would become) a hole in its scope.
    +// The definition of y in an (inner) sub-block would cast a shadow in
    +// the scope of the renamed variable.
    +//
    +// Renaming y to x encounters a SUPER-BLOCK CONFLICT.  This is the
    +// converse situation: there is an existing definition of the new name
    +// (x) in an (enclosing) super-block, and the renaming would create a
    +// hole in its scope, within which there exist references to it.  The
    +// new name casts a shadow in scope of the existing definition of x in
    +// the super-block.
    +//
    +// Removing the old name (and all references to it) is always safe, and
    +// requires no checks.
    +//
    +func (r *renamer) checkInLexicalScope(from types.Object, info *loader.PackageInfo) {
    +	b := from.Parent() // the block defining the 'from' object
    +	if b != nil {
    +		toBlock, to := b.LookupParent(r.to, from.Parent().End())
    +		if toBlock == b {
    +			// same-block conflict
    +			r.errorf(from.Pos(), "renaming this %s %q to %q",
    +				objectKind(from), from.Name(), r.to)
    +			r.errorf(to.Pos(), "\tconflicts with %s in same block",
    +				objectKind(to))
    +			return
    +		} else if toBlock != nil {
    +			// Check for super-block conflict.
    +			// The name r.to is defined in a superblock.
    +			// Is that name referenced from within this block?
    +			forEachLexicalRef(info, to, func(id *ast.Ident, block *types.Scope) bool {
    +				_, obj := lexicalLookup(block, from.Name(), id.Pos())
    +				if obj == from {
    +					// super-block conflict
    +					r.errorf(from.Pos(), "renaming this %s %q to %q",
    +						objectKind(from), from.Name(), r.to)
    +					r.errorf(id.Pos(), "\twould shadow this reference")
    +					r.errorf(to.Pos(), "\tto the %s declared here",
    +						objectKind(to))
    +					return false // stop
    +				}
    +				return true
    +			})
    +		}
    +	}
    +
    +	// Check for sub-block conflict.
    +	// Is there an intervening definition of r.to between
    +	// the block defining 'from' and some reference to it?
    +	forEachLexicalRef(info, from, func(id *ast.Ident, block *types.Scope) bool {
    +		// Find the block that defines the found reference.
    +		// It may be an ancestor.
    +		fromBlock, _ := lexicalLookup(block, from.Name(), id.Pos())
    +
    +		// See what r.to would resolve to in the same scope.
    +		toBlock, to := lexicalLookup(block, r.to, id.Pos())
    +		if to != nil {
    +			// sub-block conflict
    +			if deeper(toBlock, fromBlock) {
    +				r.errorf(from.Pos(), "renaming this %s %q to %q",
    +					objectKind(from), from.Name(), r.to)
    +				r.errorf(id.Pos(), "\twould cause this reference to become shadowed")
    +				r.errorf(to.Pos(), "\tby this intervening %s definition",
    +					objectKind(to))
    +				return false // stop
    +			}
    +		}
    +		return true
    +	})
    +
    +	// Renaming a type that is used as an embedded field
    +	// requires renaming the field too. e.g.
    +	// 	type T int // if we rename this to U..
    +	// 	var s struct {T}
    +	// 	print(s.T) // ...this must change too
    +	if _, ok := from.(*types.TypeName); ok {
    +		for id, obj := range info.Uses {
    +			if obj == from {
    +				if field := info.Defs[id]; field != nil {
    +					r.check(field)
    +				}
    +			}
    +		}
    +	}
    +}
    +
    +// lexicalLookup is like (*types.Scope).LookupParent but respects the
    +// environment visible at pos.  It assumes the relative position
    +// information is correct with each file.
    +func lexicalLookup(block *types.Scope, name string, pos token.Pos) (*types.Scope, types.Object) {
    +	for b := block; b != nil; b = b.Parent() {
    +		obj := b.Lookup(name)
    +		// The scope of a package-level object is the entire package,
    +		// so ignore pos in that case.
    +		// No analogous clause is needed for file-level objects
    +		// since no reference can appear before an import decl.
    +		if obj != nil && (b == obj.Pkg().Scope() || obj.Pos() < pos) {
    +			return b, obj
    +		}
    +	}
    +	return nil, nil
    +}
    +
    +// deeper reports whether block x is lexically deeper than y.
    +func deeper(x, y *types.Scope) bool {
    +	if x == y || x == nil {
    +		return false
    +	} else if y == nil {
    +		return true
    +	} else {
    +		return deeper(x.Parent(), y.Parent())
    +	}
    +}
    +
    +// forEachLexicalRef calls fn(id, block) for each identifier id in package
    +// info that is a reference to obj in lexical scope.  block is the
    +// lexical block enclosing the reference.  If fn returns false the
    +// iteration is terminated and findLexicalRefs returns false.
    +func forEachLexicalRef(info *loader.PackageInfo, obj types.Object, fn func(id *ast.Ident, block *types.Scope) bool) bool {
    +	ok := true
    +	var stack []ast.Node
    +
    +	var visit func(n ast.Node) bool
    +	visit = func(n ast.Node) bool {
    +		if n == nil {
    +			stack = stack[:len(stack)-1] // pop
    +			return false
    +		}
    +		if !ok {
    +			return false // bail out
    +		}
    +
    +		stack = append(stack, n) // push
    +		switch n := n.(type) {
    +		case *ast.Ident:
    +			if info.Uses[n] == obj {
    +				block := enclosingBlock(&info.Info, stack)
    +				if !fn(n, block) {
    +					ok = false
    +				}
    +			}
    +			return visit(nil) // pop stack
    +
    +		case *ast.SelectorExpr:
    +			// don't visit n.Sel
    +			ast.Inspect(n.X, visit)
    +			return visit(nil) // pop stack, don't descend
    +
    +		case *ast.CompositeLit:
    +			// Handle recursion ourselves for struct literals
    +			// so we don't visit field identifiers.
    +			tv := info.Types[n]
    +			if _, ok := deref(tv.Type).Underlying().(*types.Struct); ok {
    +				if n.Type != nil {
    +					ast.Inspect(n.Type, visit)
    +				}
    +				for _, elt := range n.Elts {
    +					if kv, ok := elt.(*ast.KeyValueExpr); ok {
    +						ast.Inspect(kv.Value, visit)
    +					} else {
    +						ast.Inspect(elt, visit)
    +					}
    +				}
    +				return visit(nil) // pop stack, don't descend
    +			}
    +		}
    +		return true
    +	}
    +
    +	for _, f := range info.Files {
    +		ast.Inspect(f, visit)
    +		if len(stack) != 0 {
    +			panic(stack)
    +		}
    +		if !ok {
    +			break
    +		}
    +	}
    +	return ok
    +}
    +
    +// enclosingBlock returns the innermost block enclosing the specified
    +// AST node, specified in the form of a path from the root of the file,
    +// [file...n].
    +func enclosingBlock(info *types.Info, stack []ast.Node) *types.Scope {
    +	for i := range stack {
    +		n := stack[len(stack)-1-i]
    +		// For some reason, go/types always associates a
    +		// function's scope with its FuncType.
    +		// TODO(adonovan): feature or a bug?
    +		switch f := n.(type) {
    +		case *ast.FuncDecl:
    +			n = f.Type
    +		case *ast.FuncLit:
    +			n = f.Type
    +		}
    +		if b := info.Scopes[n]; b != nil {
    +			return b
    +		}
    +	}
    +	panic("no Scope for *ast.File")
    +}
    +
    +func (r *renamer) checkLabel(label *types.Label) {
    +	// Check there are no identical labels in the function's label block.
    +	// (Label blocks don't nest, so this is easy.)
    +	if prev := label.Parent().Lookup(r.to); prev != nil {
    +		r.errorf(label.Pos(), "renaming this label %q to %q", label.Name(), prev.Name())
    +		r.errorf(prev.Pos(), "\twould conflict with this one")
    +	}
    +}
    +
    +// checkStructField checks that the field renaming will not cause
    +// conflicts at its declaration, or ambiguity or changes to any selection.
    +func (r *renamer) checkStructField(from *types.Var) {
    +	// Check that the struct declaration is free of field conflicts,
    +	// and field/method conflicts.
    +
    +	// go/types offers no easy way to get from a field (or interface
    +	// method) to its declaring struct (or interface), so we must
    +	// ascend the AST.
    +	info, path, _ := r.iprog.PathEnclosingInterval(from.Pos(), from.Pos())
    +	// path matches this pattern:
    +	// [Ident SelectorExpr? StarExpr? Field FieldList StructType ParenExpr* ... File]
    +
    +	// Ascend to FieldList.
    +	var i int
    +	for {
    +		if _, ok := path[i].(*ast.FieldList); ok {
    +			break
    +		}
    +		i++
    +	}
    +	i++
    +	tStruct := path[i].(*ast.StructType)
    +	i++
    +	// Ascend past parens (unlikely).
    +	for {
    +		_, ok := path[i].(*ast.ParenExpr)
    +		if !ok {
    +			break
    +		}
    +		i++
    +	}
    +	if spec, ok := path[i].(*ast.TypeSpec); ok {
    +		// This struct is also a named type.
    +		// We must check for direct (non-promoted) field/field
    +		// and method/field conflicts.
    +		named := info.Defs[spec.Name].Type()
    +		prev, indices, _ := types.LookupFieldOrMethod(named, true, info.Pkg, r.to)
    +		if len(indices) == 1 {
    +			r.errorf(from.Pos(), "renaming this field %q to %q",
    +				from.Name(), r.to)
    +			r.errorf(prev.Pos(), "\twould conflict with this %s",
    +				objectKind(prev))
    +			return // skip checkSelections to avoid redundant errors
    +		}
    +	} else {
    +		// This struct is not a named type.
    +		// We need only check for direct (non-promoted) field/field conflicts.
    +		T := info.Types[tStruct].Type.Underlying().(*types.Struct)
    +		for i := 0; i < T.NumFields(); i++ {
    +			if prev := T.Field(i); prev.Name() == r.to {
    +				r.errorf(from.Pos(), "renaming this field %q to %q",
    +					from.Name(), r.to)
    +				r.errorf(prev.Pos(), "\twould conflict with this field")
    +				return // skip checkSelections to avoid redundant errors
    +			}
    +		}
    +	}
    +
    +	// Renaming an anonymous field requires renaming the type too. e.g.
    +	// 	print(s.T)       // if we rename T to U,
    +	// 	type T int       // this and
    +	// 	var s struct {T} // this must change too.
    +	if from.Anonymous() {
    +		if named, ok := from.Type().(*types.Named); ok {
    +			r.check(named.Obj())
    +		} else if named, ok := deref(from.Type()).(*types.Named); ok {
    +			r.check(named.Obj())
    +		}
    +	}
    +
    +	// Check integrity of existing (field and method) selections.
    +	r.checkSelections(from)
    +}
    +
    +// checkSelection checks that all uses and selections that resolve to
    +// the specified object would continue to do so after the renaming.
    +func (r *renamer) checkSelections(from types.Object) {
    +	for pkg, info := range r.packages {
    +		if id := someUse(info, from); id != nil {
    +			if !r.checkExport(id, pkg, from) {
    +				return
    +			}
    +		}
    +
    +		for syntax, sel := range info.Selections {
    +			// There may be extant selections of only the old
    +			// name or only the new name, so we must check both.
    +			// (If neither, the renaming is sound.)
    +			//
    +			// In both cases, we wish to compare the lengths
    +			// of the implicit field path (Selection.Index)
    +			// to see if the renaming would change it.
    +			//
    +			// If a selection that resolves to 'from', when renamed,
    +			// would yield a path of the same or shorter length,
    +			// this indicates ambiguity or a changed referent,
    +			// analogous to same- or sub-block lexical conflict.
    +			//
    +			// If a selection using the name 'to' would
    +			// yield a path of the same or shorter length,
    +			// this indicates ambiguity or shadowing,
    +			// analogous to same- or super-block lexical conflict.
    +
    +			// TODO(adonovan): fix: derive from Types[syntax.X].Mode
    +			// TODO(adonovan): test with pointer, value, addressable value.
    +			isAddressable := true
    +
    +			if sel.Obj() == from {
    +				if obj, indices, _ := types.LookupFieldOrMethod(sel.Recv(), isAddressable, from.Pkg(), r.to); obj != nil {
    +					// Renaming this existing selection of
    +					// 'from' may block access to an existing
    +					// type member named 'to'.
    +					delta := len(indices) - len(sel.Index())
    +					if delta > 0 {
    +						continue // no ambiguity
    +					}
    +					r.selectionConflict(from, delta, syntax, obj)
    +					return
    +				}
    +
    +			} else if sel.Obj().Name() == r.to {
    +				if obj, indices, _ := types.LookupFieldOrMethod(sel.Recv(), isAddressable, from.Pkg(), from.Name()); obj == from {
    +					// Renaming 'from' may cause this existing
    +					// selection of the name 'to' to change
    +					// its meaning.
    +					delta := len(indices) - len(sel.Index())
    +					if delta > 0 {
    +						continue //  no ambiguity
    +					}
    +					r.selectionConflict(from, -delta, syntax, sel.Obj())
    +					return
    +				}
    +			}
    +		}
    +	}
    +}
    +
    +func (r *renamer) selectionConflict(from types.Object, delta int, syntax *ast.SelectorExpr, obj types.Object) {
    +	r.errorf(from.Pos(), "renaming this %s %q to %q",
    +		objectKind(from), from.Name(), r.to)
    +
    +	switch {
    +	case delta < 0:
    +		// analogous to sub-block conflict
    +		r.errorf(syntax.Sel.Pos(),
    +			"\twould change the referent of this selection")
    +		r.errorf(obj.Pos(), "\tof this %s", objectKind(obj))
    +	case delta == 0:
    +		// analogous to same-block conflict
    +		r.errorf(syntax.Sel.Pos(),
    +			"\twould make this reference ambiguous")
    +		r.errorf(obj.Pos(), "\twith this %s", objectKind(obj))
    +	case delta > 0:
    +		// analogous to super-block conflict
    +		r.errorf(syntax.Sel.Pos(),
    +			"\twould shadow this selection")
    +		r.errorf(obj.Pos(), "\tof the %s declared here",
    +			objectKind(obj))
    +	}
    +}
    +
    +// checkMethod performs safety checks for renaming a method.
    +// There are three hazards:
    +// - declaration conflicts
    +// - selection ambiguity/changes
    +// - entailed renamings of assignable concrete/interface types.
    +//   We reject renamings initiated at concrete methods if it would
    +//   change the assignability relation.  For renamings of abstract
    +//   methods, we rename all methods transitively coupled to it via
    +//   assignability.
    +func (r *renamer) checkMethod(from *types.Func) {
    +	// e.g. error.Error
    +	if from.Pkg() == nil {
    +		r.errorf(from.Pos(), "you cannot rename built-in method %s", from)
    +		return
    +	}
    +
    +	// ASSIGNABILITY: We reject renamings of concrete methods that
    +	// would break a 'satisfy' constraint; but renamings of abstract
    +	// methods are allowed to proceed, and we rename affected
    +	// concrete and abstract methods as necessary.  It is the
    +	// initial method that determines the policy.
    +
    +	// Check for conflict at point of declaration.
    +	// Check to ensure preservation of assignability requirements.
    +	R := recv(from).Type()
    +	if isInterface(R) {
    +		// Abstract method
    +
    +		// declaration
    +		prev, _, _ := types.LookupFieldOrMethod(R, false, from.Pkg(), r.to)
    +		if prev != nil {
    +			r.errorf(from.Pos(), "renaming this interface method %q to %q",
    +				from.Name(), r.to)
    +			r.errorf(prev.Pos(), "\twould conflict with this method")
    +			return
    +		}
    +
    +		// Check all interfaces that embed this one for
    +		// declaration conflicts too.
    +		for _, info := range r.packages {
    +			// Start with named interface types (better errors)
    +			for _, obj := range info.Defs {
    +				if obj, ok := obj.(*types.TypeName); ok && isInterface(obj.Type()) {
    +					f, _, _ := types.LookupFieldOrMethod(
    +						obj.Type(), false, from.Pkg(), from.Name())
    +					if f == nil {
    +						continue
    +					}
    +					t, _, _ := types.LookupFieldOrMethod(
    +						obj.Type(), false, from.Pkg(), r.to)
    +					if t == nil {
    +						continue
    +					}
    +					r.errorf(from.Pos(), "renaming this interface method %q to %q",
    +						from.Name(), r.to)
    +					r.errorf(t.Pos(), "\twould conflict with this method")
    +					r.errorf(obj.Pos(), "\tin named interface type %q", obj.Name())
    +				}
    +			}
    +
    +			// Now look at all literal interface types (includes named ones again).
    +			for e, tv := range info.Types {
    +				if e, ok := e.(*ast.InterfaceType); ok {
    +					_ = e
    +					_ = tv.Type.(*types.Interface)
    +					// TODO(adonovan): implement same check as above.
    +				}
    +			}
    +		}
    +
    +		// assignability
    +		//
    +		// Find the set of concrete or abstract methods directly
    +		// coupled to abstract method 'from' by some
    +		// satisfy.Constraint, and rename them too.
    +		for key := range r.satisfy() {
    +			// key = (lhs, rhs) where lhs is always an interface.
    +
    +			lsel := r.msets.MethodSet(key.LHS).Lookup(from.Pkg(), from.Name())
    +			if lsel == nil {
    +				continue
    +			}
    +			rmethods := r.msets.MethodSet(key.RHS)
    +			rsel := rmethods.Lookup(from.Pkg(), from.Name())
    +			if rsel == nil {
    +				continue
    +			}
    +
    +			// If both sides have a method of this name,
    +			// and one of them is m, the other must be coupled.
    +			var coupled *types.Func
    +			switch from {
    +			case lsel.Obj():
    +				coupled = rsel.Obj().(*types.Func)
    +			case rsel.Obj():
    +				coupled = lsel.Obj().(*types.Func)
    +			default:
    +				continue
    +			}
    +
    +			// We must treat concrete-to-interface
    +			// constraints like an implicit selection C.f of
    +			// each interface method I.f, and check that the
    +			// renaming leaves the selection unchanged and
    +			// unambiguous.
    +			//
    +			// Fun fact: the implicit selection of C.f
    +			// 	type I interface{f()}
    +			// 	type C struct{I}
    +			// 	func (C) g()
    +			//      var _ I = C{} // here
    +			// yields abstract method I.f.  This can make error
    +			// messages less than obvious.
    +			//
    +			if !isInterface(key.RHS) {
    +				// The logic below was derived from checkSelections.
    +
    +				rtosel := rmethods.Lookup(from.Pkg(), r.to)
    +				if rtosel != nil {
    +					rto := rtosel.Obj().(*types.Func)
    +					delta := len(rsel.Index()) - len(rtosel.Index())
    +					if delta < 0 {
    +						continue // no ambiguity
    +					}
    +
    +					// TODO(adonovan): record the constraint's position.
    +					keyPos := token.NoPos
    +
    +					r.errorf(from.Pos(), "renaming this method %q to %q",
    +						from.Name(), r.to)
    +					if delta == 0 {
    +						// analogous to same-block conflict
    +						r.errorf(keyPos, "\twould make the %s method of %s invoked via interface %s ambiguous",
    +							r.to, key.RHS, key.LHS)
    +						r.errorf(rto.Pos(), "\twith (%s).%s",
    +							recv(rto).Type(), r.to)
    +					} else {
    +						// analogous to super-block conflict
    +						r.errorf(keyPos, "\twould change the %s method of %s invoked via interface %s",
    +							r.to, key.RHS, key.LHS)
    +						r.errorf(coupled.Pos(), "\tfrom (%s).%s",
    +							recv(coupled).Type(), r.to)
    +						r.errorf(rto.Pos(), "\tto (%s).%s",
    +							recv(rto).Type(), r.to)
    +					}
    +					return // one error is enough
    +				}
    +			}
    +
    +			if !r.changeMethods {
    +				// This should be unreachable.
    +				r.errorf(from.Pos(), "internal error: during renaming of abstract method %s", from)
    +				r.errorf(coupled.Pos(), "\tchangedMethods=false, coupled method=%s", coupled)
    +				r.errorf(from.Pos(), "\tPlease file a bug report")
    +				return
    +			}
    +
    +			// Rename the coupled method to preserve assignability.
    +			r.check(coupled)
    +		}
    +	} else {
    +		// Concrete method
    +
    +		// declaration
    +		prev, indices, _ := types.LookupFieldOrMethod(R, true, from.Pkg(), r.to)
    +		if prev != nil && len(indices) == 1 {
    +			r.errorf(from.Pos(), "renaming this method %q to %q",
    +				from.Name(), r.to)
    +			r.errorf(prev.Pos(), "\twould conflict with this %s",
    +				objectKind(prev))
    +			return
    +		}
    +
    +		// assignability
    +		//
    +		// Find the set of abstract methods coupled to concrete
    +		// method 'from' by some satisfy.Constraint, and rename
    +		// them too.
    +		//
    +		// Coupling may be indirect, e.g. I.f <-> C.f via type D.
    +		//
    +		// 	type I interface {f()}
    +		//	type C int
    +		//	type (C) f()
    +		//	type D struct{C}
    +		//	var _ I = D{}
    +		//
    +		for key := range r.satisfy() {
    +			// key = (lhs, rhs) where lhs is always an interface.
    +			if isInterface(key.RHS) {
    +				continue
    +			}
    +			rsel := r.msets.MethodSet(key.RHS).Lookup(from.Pkg(), from.Name())
    +			if rsel == nil || rsel.Obj() != from {
    +				continue // rhs does not have the method
    +			}
    +			lsel := r.msets.MethodSet(key.LHS).Lookup(from.Pkg(), from.Name())
    +			if lsel == nil {
    +				continue
    +			}
    +			imeth := lsel.Obj().(*types.Func)
    +
    +			// imeth is the abstract method (e.g. I.f)
    +			// and key.RHS is the concrete coupling type (e.g. D).
    +			if !r.changeMethods {
    +				r.errorf(from.Pos(), "renaming this method %q to %q",
    +					from.Name(), r.to)
    +				var pos token.Pos
    +				var iface string
    +
    +				I := recv(imeth).Type()
    +				if named, ok := I.(*types.Named); ok {
    +					pos = named.Obj().Pos()
    +					iface = "interface " + named.Obj().Name()
    +				} else {
    +					pos = from.Pos()
    +					iface = I.String()
    +				}
    +				r.errorf(pos, "\twould make %s no longer assignable to %s",
    +					key.RHS, iface)
    +				r.errorf(imeth.Pos(), "\t(rename %s.%s if you intend to change both types)",
    +					I, from.Name())
    +				return // one error is enough
    +			}
    +
    +			// Rename the coupled interface method to preserve assignability.
    +			r.check(imeth)
    +		}
    +	}
    +
    +	// Check integrity of existing (field and method) selections.
    +	// We skip this if there were errors above, to avoid redundant errors.
    +	r.checkSelections(from)
    +}
    +
    +func (r *renamer) checkExport(id *ast.Ident, pkg *types.Package, from types.Object) bool {
    +	// Reject cross-package references if r.to is unexported.
    +	// (Such references may be qualified identifiers or field/method
    +	// selections.)
    +	if !ast.IsExported(r.to) && pkg != from.Pkg() {
    +		r.errorf(from.Pos(),
    +			"renaming this %s %q to %q would make it unexported",
    +			objectKind(from), from.Name(), r.to)
    +		r.errorf(id.Pos(), "\tbreaking references from packages such as %q",
    +			pkg.Path())
    +		return false
    +	}
    +	return true
    +}
    +
    +// satisfy returns the set of interface satisfaction constraints.
    +func (r *renamer) satisfy() map[satisfy.Constraint]bool {
    +	if r.satisfyConstraints == nil {
    +		// Compute on demand: it's expensive.
    +		var f satisfy.Finder
    +		for _, info := range r.packages {
    +			f.Find(&info.Info, info.Files)
    +		}
    +		r.satisfyConstraints = f.Result
    +	}
    +	return r.satisfyConstraints
    +}
    +
    +// -- helpers ----------------------------------------------------------
    +
    +// recv returns the method's receiver.
    +func recv(meth *types.Func) *types.Var {
    +	return meth.Type().(*types.Signature).Recv()
    +}
    +
    +// someUse returns an arbitrary use of obj within info.
    +func someUse(info *loader.PackageInfo, obj types.Object) *ast.Ident {
    +	for id, o := range info.Uses {
    +		if o == obj {
    +			return id
    +		}
    +	}
    +	return nil
    +}
    +
    +// -- Plundered from golang.org/x/tools/go/ssa -----------------
    +
    +func isInterface(T types.Type) bool { return types.IsInterface(T) }
    +
    +func deref(typ types.Type) types.Type {
    +	if p, _ := typ.(*types.Pointer); p != nil {
    +		return p.Elem()
    +	}
    +	return typ
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/rename/check14.go b/vendor/golang.org/x/tools/refactor/rename/check14.go
    new file mode 100644
    index 0000000000..3f1f7abf22
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/rename/check14.go
    @@ -0,0 +1,860 @@
    +// 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 !go1.5
    +
    +package rename
    +
    +// This file defines the safety checks for each kind of renaming.
    +
    +import (
    +	"fmt"
    +	"go/ast"
    +	"go/token"
    +
    +	"golang.org/x/tools/go/loader"
    +	"golang.org/x/tools/go/types"
    +	"golang.org/x/tools/refactor/satisfy"
    +)
    +
    +// errorf reports an error (e.g. conflict) and prevents file modification.
    +func (r *renamer) errorf(pos token.Pos, format string, args ...interface{}) {
    +	r.hadConflicts = true
    +	reportError(r.iprog.Fset.Position(pos), fmt.Sprintf(format, args...))
    +}
    +
    +// check performs safety checks of the renaming of the 'from' object to r.to.
    +func (r *renamer) check(from types.Object) {
    +	if r.objsToUpdate[from] {
    +		return
    +	}
    +	r.objsToUpdate[from] = true
    +
    +	// NB: order of conditions is important.
    +	if from_, ok := from.(*types.PkgName); ok {
    +		r.checkInFileBlock(from_)
    +	} else if from_, ok := from.(*types.Label); ok {
    +		r.checkLabel(from_)
    +	} else if isPackageLevel(from) {
    +		r.checkInPackageBlock(from)
    +	} else if v, ok := from.(*types.Var); ok && v.IsField() {
    +		r.checkStructField(v)
    +	} else if f, ok := from.(*types.Func); ok && recv(f) != nil {
    +		r.checkMethod(f)
    +	} else if isLocal(from) {
    +		r.checkInLocalScope(from)
    +	} else {
    +		r.errorf(from.Pos(), "unexpected %s object %q (please report a bug)\n",
    +			objectKind(from), from)
    +	}
    +}
    +
    +// checkInFileBlock performs safety checks for renames of objects in the file block,
    +// i.e. imported package names.
    +func (r *renamer) checkInFileBlock(from *types.PkgName) {
    +	// Check import name is not "init".
    +	if r.to == "init" {
    +		r.errorf(from.Pos(), "%q is not a valid imported package name", r.to)
    +	}
    +
    +	// Check for conflicts between file and package block.
    +	if prev := from.Pkg().Scope().Lookup(r.to); prev != nil {
    +		r.errorf(from.Pos(), "renaming this %s %q to %q would conflict",
    +			objectKind(from), from.Name(), r.to)
    +		r.errorf(prev.Pos(), "\twith this package member %s",
    +			objectKind(prev))
    +		return // since checkInPackageBlock would report redundant errors
    +	}
    +
    +	// Check for conflicts in lexical scope.
    +	r.checkInLexicalScope(from, r.packages[from.Pkg()])
    +
    +	// Finally, modify ImportSpec syntax to add or remove the Name as needed.
    +	info, path, _ := r.iprog.PathEnclosingInterval(from.Pos(), from.Pos())
    +	if from.Imported().Name() == r.to {
    +		// ImportSpec.Name not needed
    +		path[1].(*ast.ImportSpec).Name = nil
    +	} else {
    +		// ImportSpec.Name needed
    +		if spec := path[1].(*ast.ImportSpec); spec.Name == nil {
    +			spec.Name = &ast.Ident{NamePos: spec.Path.Pos(), Name: r.to}
    +			info.Defs[spec.Name] = from
    +		}
    +	}
    +}
    +
    +// checkInPackageBlock performs safety checks for renames of
    +// func/var/const/type objects in the package block.
    +func (r *renamer) checkInPackageBlock(from types.Object) {
    +	// Check that there are no references to the name from another
    +	// package if the renaming would make it unexported.
    +	if ast.IsExported(from.Name()) && !ast.IsExported(r.to) {
    +		for pkg, info := range r.packages {
    +			if pkg == from.Pkg() {
    +				continue
    +			}
    +			if id := someUse(info, from); id != nil &&
    +				!r.checkExport(id, pkg, from) {
    +				break
    +			}
    +		}
    +	}
    +
    +	info := r.packages[from.Pkg()]
    +
    +	// Check that in the package block, "init" is a function, and never referenced.
    +	if r.to == "init" {
    +		kind := objectKind(from)
    +		if kind == "func" {
    +			// Reject if intra-package references to it exist.
    +			for id, obj := range info.Uses {
    +				if obj == from {
    +					r.errorf(from.Pos(),
    +						"renaming this func %q to %q would make it a package initializer",
    +						from.Name(), r.to)
    +					r.errorf(id.Pos(), "\tbut references to it exist")
    +					break
    +				}
    +			}
    +		} else {
    +			r.errorf(from.Pos(), "you cannot have a %s at package level named %q",
    +				kind, r.to)
    +		}
    +	}
    +
    +	// Check for conflicts between package block and all file blocks.
    +	for _, f := range info.Files {
    +		fileScope := info.Info.Scopes[f]
    +		b, prev := fileScope.LookupParent(r.to, token.NoPos)
    +		if b == fileScope {
    +			r.errorf(from.Pos(), "renaming this %s %q to %q would conflict",
    +				objectKind(from), from.Name(), r.to)
    +			r.errorf(prev.Pos(), "\twith this %s",
    +				objectKind(prev))
    +			return // since checkInPackageBlock would report redundant errors
    +		}
    +	}
    +
    +	// Check for conflicts in lexical scope.
    +	if from.Exported() {
    +		for _, info := range r.packages {
    +			r.checkInLexicalScope(from, info)
    +		}
    +	} else {
    +		r.checkInLexicalScope(from, info)
    +	}
    +}
    +
    +func (r *renamer) checkInLocalScope(from types.Object) {
    +	info := r.packages[from.Pkg()]
    +
    +	// Is this object an implicit local var for a type switch?
    +	// Each case has its own var, whose position is the decl of y,
    +	// but Ident in that decl does not appear in the Uses map.
    +	//
    +	//   switch y := x.(type) {	 // Defs[Ident(y)] is undefined
    +	//   case int:    print(y)       // Implicits[CaseClause(int)]    = Var(y_int)
    +	//   case string: print(y)       // Implicits[CaseClause(string)] = Var(y_string)
    +	//   }
    +	//
    +	var isCaseVar bool
    +	for syntax, obj := range info.Implicits {
    +		if _, ok := syntax.(*ast.CaseClause); ok && obj.Pos() == from.Pos() {
    +			isCaseVar = true
    +			r.check(obj)
    +		}
    +	}
    +
    +	r.checkInLexicalScope(from, info)
    +
    +	// Finally, if this was a type switch, change the variable y.
    +	if isCaseVar {
    +		_, path, _ := r.iprog.PathEnclosingInterval(from.Pos(), from.Pos())
    +		path[0].(*ast.Ident).Name = r.to // path is [Ident AssignStmt TypeSwitchStmt...]
    +	}
    +}
    +
    +// checkInLexicalScope performs safety checks that a renaming does not
    +// change the lexical reference structure of the specified package.
    +//
    +// For objects in lexical scope, there are three kinds of conflicts:
    +// same-, sub-, and super-block conflicts.  We will illustrate all three
    +// using this example:
    +//
    +//	var x int
    +//	var z int
    +//
    +//	func f(y int) {
    +//		print(x)
    +//		print(y)
    +//	}
    +//
    +// Renaming x to z encounters a SAME-BLOCK CONFLICT, because an object
    +// with the new name already exists, defined in the same lexical block
    +// as the old object.
    +//
    +// Renaming x to y encounters a SUB-BLOCK CONFLICT, because there exists
    +// a reference to x from within (what would become) a hole in its scope.
    +// The definition of y in an (inner) sub-block would cast a shadow in
    +// the scope of the renamed variable.
    +//
    +// Renaming y to x encounters a SUPER-BLOCK CONFLICT.  This is the
    +// converse situation: there is an existing definition of the new name
    +// (x) in an (enclosing) super-block, and the renaming would create a
    +// hole in its scope, within which there exist references to it.  The
    +// new name casts a shadow in scope of the existing definition of x in
    +// the super-block.
    +//
    +// Removing the old name (and all references to it) is always safe, and
    +// requires no checks.
    +//
    +func (r *renamer) checkInLexicalScope(from types.Object, info *loader.PackageInfo) {
    +	b := from.Parent() // the block defining the 'from' object
    +	if b != nil {
    +		toBlock, to := b.LookupParent(r.to, from.Parent().End())
    +		if toBlock == b {
    +			// same-block conflict
    +			r.errorf(from.Pos(), "renaming this %s %q to %q",
    +				objectKind(from), from.Name(), r.to)
    +			r.errorf(to.Pos(), "\tconflicts with %s in same block",
    +				objectKind(to))
    +			return
    +		} else if toBlock != nil {
    +			// Check for super-block conflict.
    +			// The name r.to is defined in a superblock.
    +			// Is that name referenced from within this block?
    +			forEachLexicalRef(info, to, func(id *ast.Ident, block *types.Scope) bool {
    +				_, obj := lexicalLookup(block, from.Name(), id.Pos())
    +				if obj == from {
    +					// super-block conflict
    +					r.errorf(from.Pos(), "renaming this %s %q to %q",
    +						objectKind(from), from.Name(), r.to)
    +					r.errorf(id.Pos(), "\twould shadow this reference")
    +					r.errorf(to.Pos(), "\tto the %s declared here",
    +						objectKind(to))
    +					return false // stop
    +				}
    +				return true
    +			})
    +		}
    +	}
    +
    +	// Check for sub-block conflict.
    +	// Is there an intervening definition of r.to between
    +	// the block defining 'from' and some reference to it?
    +	forEachLexicalRef(info, from, func(id *ast.Ident, block *types.Scope) bool {
    +		// Find the block that defines the found reference.
    +		// It may be an ancestor.
    +		fromBlock, _ := lexicalLookup(block, from.Name(), id.Pos())
    +
    +		// See what r.to would resolve to in the same scope.
    +		toBlock, to := lexicalLookup(block, r.to, id.Pos())
    +		if to != nil {
    +			// sub-block conflict
    +			if deeper(toBlock, fromBlock) {
    +				r.errorf(from.Pos(), "renaming this %s %q to %q",
    +					objectKind(from), from.Name(), r.to)
    +				r.errorf(id.Pos(), "\twould cause this reference to become shadowed")
    +				r.errorf(to.Pos(), "\tby this intervening %s definition",
    +					objectKind(to))
    +				return false // stop
    +			}
    +		}
    +		return true
    +	})
    +
    +	// Renaming a type that is used as an embedded field
    +	// requires renaming the field too. e.g.
    +	// 	type T int // if we rename this to U..
    +	// 	var s struct {T}
    +	// 	print(s.T) // ...this must change too
    +	if _, ok := from.(*types.TypeName); ok {
    +		for id, obj := range info.Uses {
    +			if obj == from {
    +				if field := info.Defs[id]; field != nil {
    +					r.check(field)
    +				}
    +			}
    +		}
    +	}
    +}
    +
    +// lexicalLookup is like (*types.Scope).LookupParent but respects the
    +// environment visible at pos.  It assumes the relative position
    +// information is correct with each file.
    +func lexicalLookup(block *types.Scope, name string, pos token.Pos) (*types.Scope, types.Object) {
    +	for b := block; b != nil; b = b.Parent() {
    +		obj := b.Lookup(name)
    +		// The scope of a package-level object is the entire package,
    +		// so ignore pos in that case.
    +		// No analogous clause is needed for file-level objects
    +		// since no reference can appear before an import decl.
    +		if obj != nil && (b == obj.Pkg().Scope() || obj.Pos() < pos) {
    +			return b, obj
    +		}
    +	}
    +	return nil, nil
    +}
    +
    +// deeper reports whether block x is lexically deeper than y.
    +func deeper(x, y *types.Scope) bool {
    +	if x == y || x == nil {
    +		return false
    +	} else if y == nil {
    +		return true
    +	} else {
    +		return deeper(x.Parent(), y.Parent())
    +	}
    +}
    +
    +// forEachLexicalRef calls fn(id, block) for each identifier id in package
    +// info that is a reference to obj in lexical scope.  block is the
    +// lexical block enclosing the reference.  If fn returns false the
    +// iteration is terminated and findLexicalRefs returns false.
    +func forEachLexicalRef(info *loader.PackageInfo, obj types.Object, fn func(id *ast.Ident, block *types.Scope) bool) bool {
    +	ok := true
    +	var stack []ast.Node
    +
    +	var visit func(n ast.Node) bool
    +	visit = func(n ast.Node) bool {
    +		if n == nil {
    +			stack = stack[:len(stack)-1] // pop
    +			return false
    +		}
    +		if !ok {
    +			return false // bail out
    +		}
    +
    +		stack = append(stack, n) // push
    +		switch n := n.(type) {
    +		case *ast.Ident:
    +			if info.Uses[n] == obj {
    +				block := enclosingBlock(&info.Info, stack)
    +				if !fn(n, block) {
    +					ok = false
    +				}
    +			}
    +			return visit(nil) // pop stack
    +
    +		case *ast.SelectorExpr:
    +			// don't visit n.Sel
    +			ast.Inspect(n.X, visit)
    +			return visit(nil) // pop stack, don't descend
    +
    +		case *ast.CompositeLit:
    +			// Handle recursion ourselves for struct literals
    +			// so we don't visit field identifiers.
    +			tv := info.Types[n]
    +			if _, ok := deref(tv.Type).Underlying().(*types.Struct); ok {
    +				if n.Type != nil {
    +					ast.Inspect(n.Type, visit)
    +				}
    +				for _, elt := range n.Elts {
    +					if kv, ok := elt.(*ast.KeyValueExpr); ok {
    +						ast.Inspect(kv.Value, visit)
    +					} else {
    +						ast.Inspect(elt, visit)
    +					}
    +				}
    +				return visit(nil) // pop stack, don't descend
    +			}
    +		}
    +		return true
    +	}
    +
    +	for _, f := range info.Files {
    +		ast.Inspect(f, visit)
    +		if len(stack) != 0 {
    +			panic(stack)
    +		}
    +		if !ok {
    +			break
    +		}
    +	}
    +	return ok
    +}
    +
    +// enclosingBlock returns the innermost block enclosing the specified
    +// AST node, specified in the form of a path from the root of the file,
    +// [file...n].
    +func enclosingBlock(info *types.Info, stack []ast.Node) *types.Scope {
    +	for i := range stack {
    +		n := stack[len(stack)-1-i]
    +		// For some reason, go/types always associates a
    +		// function's scope with its FuncType.
    +		// TODO(adonovan): feature or a bug?
    +		switch f := n.(type) {
    +		case *ast.FuncDecl:
    +			n = f.Type
    +		case *ast.FuncLit:
    +			n = f.Type
    +		}
    +		if b := info.Scopes[n]; b != nil {
    +			return b
    +		}
    +	}
    +	panic("no Scope for *ast.File")
    +}
    +
    +func (r *renamer) checkLabel(label *types.Label) {
    +	// Check there are no identical labels in the function's label block.
    +	// (Label blocks don't nest, so this is easy.)
    +	if prev := label.Parent().Lookup(r.to); prev != nil {
    +		r.errorf(label.Pos(), "renaming this label %q to %q", label.Name(), prev.Name())
    +		r.errorf(prev.Pos(), "\twould conflict with this one")
    +	}
    +}
    +
    +// checkStructField checks that the field renaming will not cause
    +// conflicts at its declaration, or ambiguity or changes to any selection.
    +func (r *renamer) checkStructField(from *types.Var) {
    +	// Check that the struct declaration is free of field conflicts,
    +	// and field/method conflicts.
    +
    +	// go/types offers no easy way to get from a field (or interface
    +	// method) to its declaring struct (or interface), so we must
    +	// ascend the AST.
    +	info, path, _ := r.iprog.PathEnclosingInterval(from.Pos(), from.Pos())
    +	// path matches this pattern:
    +	// [Ident SelectorExpr? StarExpr? Field FieldList StructType ParenExpr* ... File]
    +
    +	// Ascend to FieldList.
    +	var i int
    +	for {
    +		if _, ok := path[i].(*ast.FieldList); ok {
    +			break
    +		}
    +		i++
    +	}
    +	i++
    +	tStruct := path[i].(*ast.StructType)
    +	i++
    +	// Ascend past parens (unlikely).
    +	for {
    +		_, ok := path[i].(*ast.ParenExpr)
    +		if !ok {
    +			break
    +		}
    +		i++
    +	}
    +	if spec, ok := path[i].(*ast.TypeSpec); ok {
    +		// This struct is also a named type.
    +		// We must check for direct (non-promoted) field/field
    +		// and method/field conflicts.
    +		named := info.Defs[spec.Name].Type()
    +		prev, indices, _ := types.LookupFieldOrMethod(named, true, info.Pkg, r.to)
    +		if len(indices) == 1 {
    +			r.errorf(from.Pos(), "renaming this field %q to %q",
    +				from.Name(), r.to)
    +			r.errorf(prev.Pos(), "\twould conflict with this %s",
    +				objectKind(prev))
    +			return // skip checkSelections to avoid redundant errors
    +		}
    +	} else {
    +		// This struct is not a named type.
    +		// We need only check for direct (non-promoted) field/field conflicts.
    +		T := info.Types[tStruct].Type.Underlying().(*types.Struct)
    +		for i := 0; i < T.NumFields(); i++ {
    +			if prev := T.Field(i); prev.Name() == r.to {
    +				r.errorf(from.Pos(), "renaming this field %q to %q",
    +					from.Name(), r.to)
    +				r.errorf(prev.Pos(), "\twould conflict with this field")
    +				return // skip checkSelections to avoid redundant errors
    +			}
    +		}
    +	}
    +
    +	// Renaming an anonymous field requires renaming the type too. e.g.
    +	// 	print(s.T)       // if we rename T to U,
    +	// 	type T int       // this and
    +	// 	var s struct {T} // this must change too.
    +	if from.Anonymous() {
    +		if named, ok := from.Type().(*types.Named); ok {
    +			r.check(named.Obj())
    +		} else if named, ok := deref(from.Type()).(*types.Named); ok {
    +			r.check(named.Obj())
    +		}
    +	}
    +
    +	// Check integrity of existing (field and method) selections.
    +	r.checkSelections(from)
    +}
    +
    +// checkSelection checks that all uses and selections that resolve to
    +// the specified object would continue to do so after the renaming.
    +func (r *renamer) checkSelections(from types.Object) {
    +	for pkg, info := range r.packages {
    +		if id := someUse(info, from); id != nil {
    +			if !r.checkExport(id, pkg, from) {
    +				return
    +			}
    +		}
    +
    +		for syntax, sel := range info.Selections {
    +			// There may be extant selections of only the old
    +			// name or only the new name, so we must check both.
    +			// (If neither, the renaming is sound.)
    +			//
    +			// In both cases, we wish to compare the lengths
    +			// of the implicit field path (Selection.Index)
    +			// to see if the renaming would change it.
    +			//
    +			// If a selection that resolves to 'from', when renamed,
    +			// would yield a path of the same or shorter length,
    +			// this indicates ambiguity or a changed referent,
    +			// analogous to same- or sub-block lexical conflict.
    +			//
    +			// If a selection using the name 'to' would
    +			// yield a path of the same or shorter length,
    +			// this indicates ambiguity or shadowing,
    +			// analogous to same- or super-block lexical conflict.
    +
    +			// TODO(adonovan): fix: derive from Types[syntax.X].Mode
    +			// TODO(adonovan): test with pointer, value, addressable value.
    +			isAddressable := true
    +
    +			if sel.Obj() == from {
    +				if obj, indices, _ := types.LookupFieldOrMethod(sel.Recv(), isAddressable, from.Pkg(), r.to); obj != nil {
    +					// Renaming this existing selection of
    +					// 'from' may block access to an existing
    +					// type member named 'to'.
    +					delta := len(indices) - len(sel.Index())
    +					if delta > 0 {
    +						continue // no ambiguity
    +					}
    +					r.selectionConflict(from, delta, syntax, obj)
    +					return
    +				}
    +
    +			} else if sel.Obj().Name() == r.to {
    +				if obj, indices, _ := types.LookupFieldOrMethod(sel.Recv(), isAddressable, from.Pkg(), from.Name()); obj == from {
    +					// Renaming 'from' may cause this existing
    +					// selection of the name 'to' to change
    +					// its meaning.
    +					delta := len(indices) - len(sel.Index())
    +					if delta > 0 {
    +						continue //  no ambiguity
    +					}
    +					r.selectionConflict(from, -delta, syntax, sel.Obj())
    +					return
    +				}
    +			}
    +		}
    +	}
    +}
    +
    +func (r *renamer) selectionConflict(from types.Object, delta int, syntax *ast.SelectorExpr, obj types.Object) {
    +	r.errorf(from.Pos(), "renaming this %s %q to %q",
    +		objectKind(from), from.Name(), r.to)
    +
    +	switch {
    +	case delta < 0:
    +		// analogous to sub-block conflict
    +		r.errorf(syntax.Sel.Pos(),
    +			"\twould change the referent of this selection")
    +		r.errorf(obj.Pos(), "\tof this %s", objectKind(obj))
    +	case delta == 0:
    +		// analogous to same-block conflict
    +		r.errorf(syntax.Sel.Pos(),
    +			"\twould make this reference ambiguous")
    +		r.errorf(obj.Pos(), "\twith this %s", objectKind(obj))
    +	case delta > 0:
    +		// analogous to super-block conflict
    +		r.errorf(syntax.Sel.Pos(),
    +			"\twould shadow this selection")
    +		r.errorf(obj.Pos(), "\tof the %s declared here",
    +			objectKind(obj))
    +	}
    +}
    +
    +// checkMethod performs safety checks for renaming a method.
    +// There are three hazards:
    +// - declaration conflicts
    +// - selection ambiguity/changes
    +// - entailed renamings of assignable concrete/interface types.
    +//   We reject renamings initiated at concrete methods if it would
    +//   change the assignability relation.  For renamings of abstract
    +//   methods, we rename all methods transitively coupled to it via
    +//   assignability.
    +func (r *renamer) checkMethod(from *types.Func) {
    +	// e.g. error.Error
    +	if from.Pkg() == nil {
    +		r.errorf(from.Pos(), "you cannot rename built-in method %s", from)
    +		return
    +	}
    +
    +	// ASSIGNABILITY: We reject renamings of concrete methods that
    +	// would break a 'satisfy' constraint; but renamings of abstract
    +	// methods are allowed to proceed, and we rename affected
    +	// concrete and abstract methods as necessary.  It is the
    +	// initial method that determines the policy.
    +
    +	// Check for conflict at point of declaration.
    +	// Check to ensure preservation of assignability requirements.
    +	R := recv(from).Type()
    +	if isInterface(R) {
    +		// Abstract method
    +
    +		// declaration
    +		prev, _, _ := types.LookupFieldOrMethod(R, false, from.Pkg(), r.to)
    +		if prev != nil {
    +			r.errorf(from.Pos(), "renaming this interface method %q to %q",
    +				from.Name(), r.to)
    +			r.errorf(prev.Pos(), "\twould conflict with this method")
    +			return
    +		}
    +
    +		// Check all interfaces that embed this one for
    +		// declaration conflicts too.
    +		for _, info := range r.packages {
    +			// Start with named interface types (better errors)
    +			for _, obj := range info.Defs {
    +				if obj, ok := obj.(*types.TypeName); ok && isInterface(obj.Type()) {
    +					f, _, _ := types.LookupFieldOrMethod(
    +						obj.Type(), false, from.Pkg(), from.Name())
    +					if f == nil {
    +						continue
    +					}
    +					t, _, _ := types.LookupFieldOrMethod(
    +						obj.Type(), false, from.Pkg(), r.to)
    +					if t == nil {
    +						continue
    +					}
    +					r.errorf(from.Pos(), "renaming this interface method %q to %q",
    +						from.Name(), r.to)
    +					r.errorf(t.Pos(), "\twould conflict with this method")
    +					r.errorf(obj.Pos(), "\tin named interface type %q", obj.Name())
    +				}
    +			}
    +
    +			// Now look at all literal interface types (includes named ones again).
    +			for e, tv := range info.Types {
    +				if e, ok := e.(*ast.InterfaceType); ok {
    +					_ = e
    +					_ = tv.Type.(*types.Interface)
    +					// TODO(adonovan): implement same check as above.
    +				}
    +			}
    +		}
    +
    +		// assignability
    +		//
    +		// Find the set of concrete or abstract methods directly
    +		// coupled to abstract method 'from' by some
    +		// satisfy.Constraint, and rename them too.
    +		for key := range r.satisfy() {
    +			// key = (lhs, rhs) where lhs is always an interface.
    +
    +			lsel := r.msets.MethodSet(key.LHS).Lookup(from.Pkg(), from.Name())
    +			if lsel == nil {
    +				continue
    +			}
    +			rmethods := r.msets.MethodSet(key.RHS)
    +			rsel := rmethods.Lookup(from.Pkg(), from.Name())
    +			if rsel == nil {
    +				continue
    +			}
    +
    +			// If both sides have a method of this name,
    +			// and one of them is m, the other must be coupled.
    +			var coupled *types.Func
    +			switch from {
    +			case lsel.Obj():
    +				coupled = rsel.Obj().(*types.Func)
    +			case rsel.Obj():
    +				coupled = lsel.Obj().(*types.Func)
    +			default:
    +				continue
    +			}
    +
    +			// We must treat concrete-to-interface
    +			// constraints like an implicit selection C.f of
    +			// each interface method I.f, and check that the
    +			// renaming leaves the selection unchanged and
    +			// unambiguous.
    +			//
    +			// Fun fact: the implicit selection of C.f
    +			// 	type I interface{f()}
    +			// 	type C struct{I}
    +			// 	func (C) g()
    +			//      var _ I = C{} // here
    +			// yields abstract method I.f.  This can make error
    +			// messages less than obvious.
    +			//
    +			if !isInterface(key.RHS) {
    +				// The logic below was derived from checkSelections.
    +
    +				rtosel := rmethods.Lookup(from.Pkg(), r.to)
    +				if rtosel != nil {
    +					rto := rtosel.Obj().(*types.Func)
    +					delta := len(rsel.Index()) - len(rtosel.Index())
    +					if delta < 0 {
    +						continue // no ambiguity
    +					}
    +
    +					// TODO(adonovan): record the constraint's position.
    +					keyPos := token.NoPos
    +
    +					r.errorf(from.Pos(), "renaming this method %q to %q",
    +						from.Name(), r.to)
    +					if delta == 0 {
    +						// analogous to same-block conflict
    +						r.errorf(keyPos, "\twould make the %s method of %s invoked via interface %s ambiguous",
    +							r.to, key.RHS, key.LHS)
    +						r.errorf(rto.Pos(), "\twith (%s).%s",
    +							recv(rto).Type(), r.to)
    +					} else {
    +						// analogous to super-block conflict
    +						r.errorf(keyPos, "\twould change the %s method of %s invoked via interface %s",
    +							r.to, key.RHS, key.LHS)
    +						r.errorf(coupled.Pos(), "\tfrom (%s).%s",
    +							recv(coupled).Type(), r.to)
    +						r.errorf(rto.Pos(), "\tto (%s).%s",
    +							recv(rto).Type(), r.to)
    +					}
    +					return // one error is enough
    +				}
    +			}
    +
    +			if !r.changeMethods {
    +				// This should be unreachable.
    +				r.errorf(from.Pos(), "internal error: during renaming of abstract method %s", from)
    +				r.errorf(coupled.Pos(), "\tchangedMethods=false, coupled method=%s", coupled)
    +				r.errorf(from.Pos(), "\tPlease file a bug report")
    +				return
    +			}
    +
    +			// Rename the coupled method to preserve assignability.
    +			r.check(coupled)
    +		}
    +	} else {
    +		// Concrete method
    +
    +		// declaration
    +		prev, indices, _ := types.LookupFieldOrMethod(R, true, from.Pkg(), r.to)
    +		if prev != nil && len(indices) == 1 {
    +			r.errorf(from.Pos(), "renaming this method %q to %q",
    +				from.Name(), r.to)
    +			r.errorf(prev.Pos(), "\twould conflict with this %s",
    +				objectKind(prev))
    +			return
    +		}
    +
    +		// assignability
    +		//
    +		// Find the set of abstract methods coupled to concrete
    +		// method 'from' by some satisfy.Constraint, and rename
    +		// them too.
    +		//
    +		// Coupling may be indirect, e.g. I.f <-> C.f via type D.
    +		//
    +		// 	type I interface {f()}
    +		//	type C int
    +		//	type (C) f()
    +		//	type D struct{C}
    +		//	var _ I = D{}
    +		//
    +		for key := range r.satisfy() {
    +			// key = (lhs, rhs) where lhs is always an interface.
    +			if isInterface(key.RHS) {
    +				continue
    +			}
    +			rsel := r.msets.MethodSet(key.RHS).Lookup(from.Pkg(), from.Name())
    +			if rsel == nil || rsel.Obj() != from {
    +				continue // rhs does not have the method
    +			}
    +			lsel := r.msets.MethodSet(key.LHS).Lookup(from.Pkg(), from.Name())
    +			if lsel == nil {
    +				continue
    +			}
    +			imeth := lsel.Obj().(*types.Func)
    +
    +			// imeth is the abstract method (e.g. I.f)
    +			// and key.RHS is the concrete coupling type (e.g. D).
    +			if !r.changeMethods {
    +				r.errorf(from.Pos(), "renaming this method %q to %q",
    +					from.Name(), r.to)
    +				var pos token.Pos
    +				var iface string
    +
    +				I := recv(imeth).Type()
    +				if named, ok := I.(*types.Named); ok {
    +					pos = named.Obj().Pos()
    +					iface = "interface " + named.Obj().Name()
    +				} else {
    +					pos = from.Pos()
    +					iface = I.String()
    +				}
    +				r.errorf(pos, "\twould make %s no longer assignable to %s",
    +					key.RHS, iface)
    +				r.errorf(imeth.Pos(), "\t(rename %s.%s if you intend to change both types)",
    +					I, from.Name())
    +				return // one error is enough
    +			}
    +
    +			// Rename the coupled interface method to preserve assignability.
    +			r.check(imeth)
    +		}
    +	}
    +
    +	// Check integrity of existing (field and method) selections.
    +	// We skip this if there were errors above, to avoid redundant errors.
    +	r.checkSelections(from)
    +}
    +
    +func (r *renamer) checkExport(id *ast.Ident, pkg *types.Package, from types.Object) bool {
    +	// Reject cross-package references if r.to is unexported.
    +	// (Such references may be qualified identifiers or field/method
    +	// selections.)
    +	if !ast.IsExported(r.to) && pkg != from.Pkg() {
    +		r.errorf(from.Pos(),
    +			"renaming this %s %q to %q would make it unexported",
    +			objectKind(from), from.Name(), r.to)
    +		r.errorf(id.Pos(), "\tbreaking references from packages such as %q",
    +			pkg.Path())
    +		return false
    +	}
    +	return true
    +}
    +
    +// satisfy returns the set of interface satisfaction constraints.
    +func (r *renamer) satisfy() map[satisfy.Constraint]bool {
    +	if r.satisfyConstraints == nil {
    +		// Compute on demand: it's expensive.
    +		var f satisfy.Finder
    +		for _, info := range r.packages {
    +			f.Find(&info.Info, info.Files)
    +		}
    +		r.satisfyConstraints = f.Result
    +	}
    +	return r.satisfyConstraints
    +}
    +
    +// -- helpers ----------------------------------------------------------
    +
    +// recv returns the method's receiver.
    +func recv(meth *types.Func) *types.Var {
    +	return meth.Type().(*types.Signature).Recv()
    +}
    +
    +// someUse returns an arbitrary use of obj within info.
    +func someUse(info *loader.PackageInfo, obj types.Object) *ast.Ident {
    +	for id, o := range info.Uses {
    +		if o == obj {
    +			return id
    +		}
    +	}
    +	return nil
    +}
    +
    +// -- Plundered from golang.org/x/tools/go/ssa -----------------
    +
    +func isInterface(T types.Type) bool { return types.IsInterface(T) }
    +
    +func deref(typ types.Type) types.Type {
    +	if p, _ := typ.(*types.Pointer); p != nil {
    +		return p.Elem()
    +	}
    +	return typ
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/rename/go-rename.el b/vendor/golang.org/x/tools/refactor/rename/go-rename.el
    new file mode 100644
    index 0000000000..5181ce0acf
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/rename/go-rename.el
    @@ -0,0 +1,107 @@
    +;;; go-rename.el --- Integration of the 'gorename' tool into Emacs.
    +
    +;; 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.
    +
    +;; Version: 0.1
    +;; Package-Requires: ((go-mode "1.3.1"))
    +;; Keywords: tools
    +
    +;;; Commentary:
    +
    +;; To install:
    +
    +;; % go get golang.org/x/tools/cmd/gorename
    +;; % go build golang.org/x/tools/cmd/gorename
    +;; % mv gorename $HOME/bin/         # or elsewhere on $PATH
    +
    +;; The go-rename-command variable can be customized to specify an
    +;; alternative location for the installed command.
    +
    +;;; Code:
    +
    +(require 'compile)
    +(require 'go-mode)
    +(require 'thingatpt)
    +
    +(defgroup go-rename nil
    +  "Options specific to the Go rename."
    +  :group 'go)
    +
    +(defcustom go-rename-command "gorename"
    +  "The `gorename' command; by the default, $PATH is searched."
    +  :type 'string
    +  :group 'go-rename)
    +
    +;;;###autoload
    +(defun go-rename (new-name &optional force)
    +  "Rename the entity denoted by the identifier at point, using
    +the `gorename' tool. With FORCE, call `gorename' with the
    +`-force' flag."
    +  (interactive (list (read-string "New name: " (thing-at-point 'symbol))
    +                     current-prefix-arg))
    +  (if (not buffer-file-name)
    +      (error "Cannot use go-rename on a buffer without a file name"))
    +  ;; It's not sufficient to save the current buffer if modified,
    +  ;; since if gofmt-before-save is on the before-save-hook,
    +  ;; saving will disturb the selected region.
    +  (if (buffer-modified-p)
    +      (error "Please save the current buffer before invoking go-rename"))
    +  ;; Prompt-save all other modified Go buffers, since they might get written.
    +  (save-some-buffers nil #'(lambda ()
    +              (and (buffer-file-name)
    +                   (string= (file-name-extension (buffer-file-name)) ".go"))))
    +  (let* ((posflag (format "-offset=%s:#%d"
    +                          buffer-file-name
    +                          (1- (go--position-bytes (point)))))
    +         (env-vars (go-root-and-paths))
    +         (goroot-env (concat "GOROOT=" (car env-vars)))
    +         (gopath-env (concat "GOPATH=" (mapconcat #'identity (cdr env-vars) ":")))
    +         success)
    +    (with-current-buffer (get-buffer-create "*go-rename*")
    +      (setq buffer-read-only nil)
    +      (erase-buffer)
    +      (let ((args (append (list go-rename-command nil t nil posflag "-to" new-name) (if force '("-force")))))
    +        ;; Log the command to *Messages*, for debugging.
    +        (message "Command: %s:" args)
    +        (message "Running gorename...")
    +        ;; Use dynamic binding to modify/restore the environment
    +        (setq success (zerop (let ((process-environment (list* goroot-env gopath-env process-environment)))
    +          (apply #'call-process args))))
    +      (insert "\n")
    +      (compilation-mode)
    +      (setq compilation-error-screen-columns nil)
    +
    +      ;; On success, print the one-line result in the message bar,
    +      ;; and hide the *go-rename* buffer.
    +      (if success
    +          (progn
    +            (message "%s" (go--buffer-string-no-trailing-space))
    +            (gofmt--kill-error-buffer (current-buffer)))
    +        ;; failure
    +        (let ((w (display-buffer (current-buffer))))
    +          (message "gorename exited")
    +          (set-window-point w (point-min)))))))
    +
    +  ;; Reload the modified files, saving line/col.
    +  ;; (Don't restore the point since the text has changed.)
    +  ;;
    +  ;; TODO(adonovan): should we also do this for all other files
    +  ;; that were updated (the tool can print them)?
    +  (let ((line (line-number-at-pos))
    +        (col (current-column)))
    +    (revert-buffer t t t) ; safe, because we just saved it
    +    (goto-char (point-min))
    +    (forward-line (1- line))
    +    (forward-char col)))
    +
    +
    +(defun go--buffer-string-no-trailing-space ()
    +  (replace-regexp-in-string "[\t\n ]*\\'"
    +                            ""
    +                            (buffer-substring (point-min) (point-max))))
    +
    +(provide 'go-rename)
    +
    +;;; go-rename.el ends here
    diff --git a/vendor/golang.org/x/tools/refactor/rename/mvpkg.go b/vendor/golang.org/x/tools/refactor/rename/mvpkg.go
    new file mode 100644
    index 0000000000..927195c11c
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/rename/mvpkg.go
    @@ -0,0 +1,371 @@
    +// Copyright 2015 The Go Authors. All rights reserved.
    +// Use of this source code is governed by a BSD-style
    +// licence that can be found in the LICENSE file.
    +
    +// This file contains the implementation of the 'gomvpkg' command
    +// whose main function is in golang.org/x/tools/cmd/gomvpkg.
    +
    +package rename
    +
    +// TODO(matloob):
    +// - think about what happens if the package is moving across version control systems.
    +// - think about windows, which uses "\" as its directory separator.
    +// - dot imports are not supported. Make sure it's clearly documented.
    +
    +import (
    +	"bytes"
    +	"fmt"
    +	"go/ast"
    +	"go/build"
    +	"go/format"
    +	"go/token"
    +	"log"
    +	"os"
    +	"os/exec"
    +	"path"
    +	"path/filepath"
    +	"regexp"
    +	"runtime"
    +	"strconv"
    +	"strings"
    +	"text/template"
    +
    +	"golang.org/x/tools/go/buildutil"
    +	"golang.org/x/tools/go/loader"
    +	"golang.org/x/tools/refactor/importgraph"
    +)
    +
    +// Move, given a package path and a destination package path, will try
    +// to move the given package to the new path. The Move function will
    +// first check for any conflicts preventing the move, such as a
    +// package already existing at the destination package path. If the
    +// move can proceed, it builds an import graph to find all imports of
    +// the packages whose paths need to be renamed. This includes uses of
    +// the subpackages of the package to be moved as those packages will
    +// also need to be moved. It then renames all imports to point to the
    +// new paths, and then moves the packages to their new paths.
    +func Move(ctxt *build.Context, from, to, moveTmpl string) error {
    +	srcDir, err := srcDir(ctxt, from)
    +	if err != nil {
    +		return err
    +	}
    +
    +	// This should be the only place in the program that constructs
    +	// file paths.
    +	// TODO(matloob): test on Microsoft Windows.
    +	fromDir := buildutil.JoinPath(ctxt, srcDir, filepath.FromSlash(from))
    +	toDir := buildutil.JoinPath(ctxt, srcDir, filepath.FromSlash(to))
    +	toParent := filepath.Dir(toDir)
    +	if !buildutil.IsDir(ctxt, toParent) {
    +		return fmt.Errorf("parent directory does not exist for path %s", toDir)
    +	}
    +
    +	// Build the import graph and figure out which packages to update.
    +	fwd, rev, errors := importgraph.Build(ctxt)
    +	if len(errors) > 0 {
    +		// With a large GOPATH tree, errors are inevitable.
    +		// Report them but proceed.
    +		fmt.Fprintf(os.Stderr, "While scanning Go workspace:\n")
    +		for path, err := range errors {
    +			fmt.Fprintf(os.Stderr, "Package %q: %s.\n", path, err)
    +		}
    +	}
    +
    +	// Determine the affected packages---the set of packages whose import
    +	// statements need updating.
    +	affectedPackages := map[string]bool{from: true}
    +	destinations := map[string]string{} // maps old dir to new dir
    +	for pkg := range subpackages(ctxt, srcDir, from) {
    +		for r := range rev[pkg] {
    +			affectedPackages[r] = true
    +		}
    +		destinations[pkg] = strings.Replace(pkg,
    +			// Ensure directories have a trailing "/".
    +			filepath.Join(from, ""), filepath.Join(to, ""), 1)
    +	}
    +
    +	// Load all the affected packages.
    +	iprog, err := loadProgram(ctxt, affectedPackages)
    +	if err != nil {
    +		return err
    +	}
    +
    +	// Prepare the move command, if one was supplied.
    +	var cmd string
    +	if moveTmpl != "" {
    +		if cmd, err = moveCmd(moveTmpl, fromDir, toDir); err != nil {
    +			return err
    +		}
    +	}
    +
    +	m := mover{
    +		ctxt:             ctxt,
    +		fwd:              fwd,
    +		rev:              rev,
    +		iprog:            iprog,
    +		from:             from,
    +		to:               to,
    +		fromDir:          fromDir,
    +		toDir:            toDir,
    +		affectedPackages: affectedPackages,
    +		destinations:     destinations,
    +		cmd:              cmd,
    +	}
    +
    +	if err := m.checkValid(); err != nil {
    +		return err
    +	}
    +
    +	m.move()
    +
    +	return nil
    +}
    +
    +// srcDir returns the absolute path of the srcdir containing pkg.
    +func srcDir(ctxt *build.Context, pkg string) (string, error) {
    +	for _, srcDir := range ctxt.SrcDirs() {
    +		path := buildutil.JoinPath(ctxt, srcDir, pkg)
    +		if buildutil.IsDir(ctxt, path) {
    +			return srcDir, nil
    +		}
    +	}
    +	return "", fmt.Errorf("src dir not found for package: %s", pkg)
    +}
    +
    +// subpackages returns the set of packages in the given srcDir whose
    +// import paths start with dir.
    +func subpackages(ctxt *build.Context, srcDir string, dir string) map[string]bool {
    +	subs := map[string]bool{dir: true}
    +
    +	// Find all packages under srcDir whose import paths start with dir.
    +	buildutil.ForEachPackage(ctxt, func(pkg string, err error) {
    +		if err != nil {
    +			log.Fatalf("unexpected error in ForEachPackage: %v", err)
    +		}
    +
    +		if !strings.HasPrefix(pkg, path.Join(dir, "")) {
    +			return
    +		}
    +
    +		p, err := ctxt.Import(pkg, "", build.FindOnly)
    +		if err != nil {
    +			log.Fatalf("unexpected: package %s can not be located by build context: %s", pkg, err)
    +		}
    +		if p.SrcRoot == "" {
    +			log.Fatalf("unexpected: could not determine srcDir for package %s: %s", pkg, err)
    +		}
    +		if p.SrcRoot != srcDir {
    +			return
    +		}
    +
    +		subs[pkg] = true
    +	})
    +
    +	return subs
    +}
    +
    +type mover struct {
    +	// iprog contains all packages whose contents need to be updated
    +	// with new package names or import paths.
    +	iprog *loader.Program
    +	ctxt  *build.Context
    +	// fwd and rev are the forward and reverse import graphs
    +	fwd, rev importgraph.Graph
    +	// from and to are the source and destination import
    +	// paths. fromDir and toDir are the source and destination
    +	// absolute paths that package source files will be moved between.
    +	from, to, fromDir, toDir string
    +	// affectedPackages is the set of all packages whose contents need
    +	// to be updated to reflect new package names or import paths.
    +	affectedPackages map[string]bool
    +	// destinations maps each subpackage to be moved to its
    +	// destination path.
    +	destinations map[string]string
    +	// cmd, if not empty, will be executed to move fromDir to toDir.
    +	cmd string
    +}
    +
    +func (m *mover) checkValid() error {
    +	const prefix = "invalid move destination"
    +
    +	match, err := regexp.MatchString("^[_\\pL][_\\pL\\p{Nd}]*$", path.Base(m.to))
    +	if err != nil {
    +		panic("regexp.MatchString failed")
    +	}
    +	if !match {
    +		return fmt.Errorf("%s: %s; gomvpkg does not support move destinations "+
    +			"whose base names are not valid go identifiers", prefix, m.to)
    +	}
    +
    +	if buildutil.FileExists(m.ctxt, m.toDir) {
    +		return fmt.Errorf("%s: %s conflicts with file %s", prefix, m.to, m.toDir)
    +	}
    +	if buildutil.IsDir(m.ctxt, m.toDir) {
    +		return fmt.Errorf("%s: %s conflicts with directory %s", prefix, m.to, m.toDir)
    +	}
    +
    +	for _, toSubPkg := range m.destinations {
    +		if _, err := m.ctxt.Import(toSubPkg, "", build.FindOnly); err == nil {
    +			return fmt.Errorf("%s: %s; package or subpackage %s already exists",
    +				prefix, m.to, toSubPkg)
    +		}
    +	}
    +
    +	return nil
    +}
    +
    +// moveCmd produces the version control move command used to move fromDir to toDir by
    +// executing the given template.
    +func moveCmd(moveTmpl, fromDir, toDir string) (string, error) {
    +	tmpl, err := template.New("movecmd").Parse(moveTmpl)
    +	if err != nil {
    +		return "", err
    +	}
    +
    +	var buf bytes.Buffer
    +	err = tmpl.Execute(&buf, struct {
    +		Src string
    +		Dst string
    +	}{fromDir, toDir})
    +	return buf.String(), err
    +}
    +
    +func (m *mover) move() error {
    +	filesToUpdate := make(map[*ast.File]bool)
    +
    +	// Change the moved package's "package" declaration to its new base name.
    +	pkg, ok := m.iprog.Imported[m.from]
    +	if !ok {
    +		log.Fatalf("unexpected: package %s is not in import map", m.from)
    +	}
    +	newName := filepath.Base(m.to)
    +	for _, f := range pkg.Files {
    +		// Update all import comments.
    +		for _, cg := range f.Comments {
    +			c := cg.List[0]
    +			if c.Slash >= f.Name.End() &&
    +				sameLine(m.iprog.Fset, c.Slash, f.Name.End()) &&
    +				(f.Decls == nil || c.Slash < f.Decls[0].Pos()) {
    +				if strings.HasPrefix(c.Text, `// import "`) {
    +					c.Text = `// import "` + m.to + `"`
    +					break
    +				}
    +				if strings.HasPrefix(c.Text, `/* import "`) {
    +					c.Text = `/* import "` + m.to + `" */`
    +					break
    +				}
    +			}
    +		}
    +		f.Name.Name = newName // change package decl
    +		filesToUpdate[f] = true
    +	}
    +
    +	// Look through the external test packages (m.iprog.Created contains the external test packages).
    +	for _, info := range m.iprog.Created {
    +		// Change the "package" declaration of the external test package.
    +		if info.Pkg.Path() == m.from+"_test" {
    +			for _, f := range info.Files {
    +				f.Name.Name = newName + "_test" // change package decl
    +				filesToUpdate[f] = true
    +			}
    +		}
    +
    +		// Mark all the loaded external test packages, which import the "from" package,
    +		// as affected packages and update the imports.
    +		for _, imp := range info.Pkg.Imports() {
    +			if imp.Path() == m.from {
    +				m.affectedPackages[info.Pkg.Path()] = true
    +				m.iprog.Imported[info.Pkg.Path()] = info
    +				if err := importName(m.iprog, info, m.from, path.Base(m.from), newName); err != nil {
    +					return err
    +				}
    +			}
    +		}
    +	}
    +
    +	// Update imports of that package to use the new import name.
    +	// None of the subpackages will change their name---only the from package
    +	// itself will.
    +	for p := range m.rev[m.from] {
    +		if err := importName(m.iprog, m.iprog.Imported[p], m.from, path.Base(m.from), newName); err != nil {
    +			return err
    +		}
    +	}
    +
    +	// Update import paths for all imports by affected packages.
    +	for ap := range m.affectedPackages {
    +		info, ok := m.iprog.Imported[ap]
    +		if !ok {
    +			log.Fatalf("unexpected: package %s is not in import map", ap)
    +		}
    +		for _, f := range info.Files {
    +			for _, imp := range f.Imports {
    +				importPath, _ := strconv.Unquote(imp.Path.Value)
    +				if newPath, ok := m.destinations[importPath]; ok {
    +					imp.Path.Value = strconv.Quote(newPath)
    +
    +					oldName := path.Base(importPath)
    +					if imp.Name != nil {
    +						oldName = imp.Name.Name
    +					}
    +
    +					newName := path.Base(newPath)
    +					if imp.Name == nil && oldName != newName {
    +						imp.Name = ast.NewIdent(oldName)
    +					} else if imp.Name == nil || imp.Name.Name == newName {
    +						imp.Name = nil
    +					}
    +					filesToUpdate[f] = true
    +				}
    +			}
    +		}
    +	}
    +
    +	for f := range filesToUpdate {
    +		var buf bytes.Buffer
    +		if err := format.Node(&buf, m.iprog.Fset, f); err != nil {
    +			log.Printf("failed to pretty-print syntax tree: %v", err)
    +			continue
    +		}
    +		tokenFile := m.iprog.Fset.File(f.Pos())
    +		writeFile(tokenFile.Name(), buf.Bytes())
    +	}
    +
    +	// Move the directories.
    +	// If either the fromDir or toDir are contained under version control it is
    +	// the user's responsibility to provide a custom move command that updates
    +	// version control to reflect the move.
    +	// TODO(matloob): If the parent directory of toDir does not exist, create it.
    +	//      For now, it's required that it does exist.
    +
    +	if m.cmd != "" {
    +		// TODO(matloob): Verify that the windows and plan9 cases are correct.
    +		var cmd *exec.Cmd
    +		switch runtime.GOOS {
    +		case "windows":
    +			cmd = exec.Command("cmd", "/c", m.cmd)
    +		case "plan9":
    +			cmd = exec.Command("rc", "-c", m.cmd)
    +		default:
    +			cmd = exec.Command("sh", "-c", m.cmd)
    +		}
    +		cmd.Stderr = os.Stderr
    +		cmd.Stdout = os.Stdout
    +		if err := cmd.Run(); err != nil {
    +			return fmt.Errorf("version control system's move command failed: %v", err)
    +		}
    +
    +		return nil
    +	}
    +
    +	return moveDirectory(m.fromDir, m.toDir)
    +}
    +
    +// sameLine reports whether two positions in the same file are on the same line.
    +func sameLine(fset *token.FileSet, x, y token.Pos) bool {
    +	return fset.Position(x).Line == fset.Position(y).Line
    +}
    +
    +var moveDirectory = func(from, to string) error {
    +	return os.Rename(from, to)
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/rename/mvpkg_test.go b/vendor/golang.org/x/tools/refactor/rename/mvpkg_test.go
    new file mode 100644
    index 0000000000..e07b6b400a
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/rename/mvpkg_test.go
    @@ -0,0 +1,341 @@
    +// Copyright 2015 The Go Authors. All rights reserved.
    +// Use of this source code is governed by a BSD-style
    +// licence that can be found in the LICENSE file.
    +
    +package rename
    +
    +import (
    +	"fmt"
    +	"go/build"
    +	"io/ioutil"
    +	"path/filepath"
    +	"regexp"
    +	"strings"
    +	"testing"
    +
    +	"golang.org/x/tools/go/buildutil"
    +)
    +
    +func TestErrors(t *testing.T) {
    +	tests := []struct {
    +		ctxt     *build.Context
    +		from, to string
    +		want     string // regexp to match error, or "OK"
    +	}{
    +		// Simple example.
    +		{
    +			ctxt: fakeContext(map[string][]string{
    +				"foo": {`package foo; type T int`},
    +				"bar": {`package bar`},
    +				"main": {`package main
    +
    +import "foo"
    +
    +var _ foo.T
    +`},
    +			}),
    +			from: "foo", to: "bar",
    +			want: `invalid move destination: bar conflicts with directory .go.src.bar`,
    +		},
    +		// Subpackage already exists.
    +		{
    +			ctxt: fakeContext(map[string][]string{
    +				"foo":     {`package foo; type T int`},
    +				"foo/sub": {`package sub`},
    +				"bar/sub": {`package sub`},
    +				"main": {`package main
    +
    +import "foo"
    +
    +var _ foo.T
    +`},
    +			}),
    +			from: "foo", to: "bar",
    +			want: "invalid move destination: bar; package or subpackage bar/sub already exists",
    +		},
    +		// Invalid base name.
    +		{
    +			ctxt: fakeContext(map[string][]string{
    +				"foo": {`package foo; type T int`},
    +				"main": {`package main
    +
    +import "foo"
    +
    +var _ foo.T
    +`},
    +			}),
    +			from: "foo", to: "bar-v2.0",
    +			want: "invalid move destination: bar-v2.0; gomvpkg does not " +
    +				"support move destinations whose base names are not valid " +
    +				"go identifiers",
    +		},
    +	}
    +
    +	for _, test := range tests {
    +		ctxt := test.ctxt
    +
    +		got := make(map[string]string)
    +		writeFile = func(filename string, content []byte) error {
    +			got[filename] = string(content)
    +			return nil
    +		}
    +		moveDirectory = func(from, to string) error {
    +			for path, contents := range got {
    +				if strings.HasPrefix(path, from) {
    +					newPath := strings.Replace(path, from, to, 1)
    +					delete(got, path)
    +					got[newPath] = contents
    +				}
    +			}
    +			return nil
    +		}
    +
    +		err := Move(ctxt, test.from, test.to, "")
    +		prefix := fmt.Sprintf("-from %q -to %q", test.from, test.to)
    +		if err == nil {
    +			t.Errorf("%s: nil error. Expected error: %s", prefix, test.want)
    +			continue
    +		}
    +		matched, err2 := regexp.MatchString(test.want, err.Error())
    +		if err2 != nil {
    +			t.Errorf("regexp.MatchString failed %s", err2)
    +			continue
    +		}
    +		if !matched {
    +			t.Errorf("%s: conflict does not match expectation:\n"+
    +				"Error: %q\n"+
    +				"Pattern: %q",
    +				prefix, err.Error(), test.want)
    +		}
    +	}
    +}
    +
    +func TestMoves(t *testing.T) {
    +	tests := []struct {
    +		ctxt     *build.Context
    +		from, to string
    +		want     map[string]string
    +	}{
    +		// Simple example.
    +		{
    +			ctxt: fakeContext(map[string][]string{
    +				"foo": {`package foo; type T int`},
    +				"main": {`package main
    +
    +import "foo"
    +
    +var _ foo.T
    +`},
    +			}),
    +			from: "foo", to: "bar",
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +import "bar"
    +
    +var _ bar.T
    +`,
    +				"/go/src/bar/0.go": `package bar
    +
    +type T int
    +`,
    +			},
    +		},
    +
    +		// Example with subpackage.
    +		{
    +			ctxt: fakeContext(map[string][]string{
    +				"foo":     {`package foo; type T int`},
    +				"foo/sub": {`package sub; type T int`},
    +				"main": {`package main
    +
    +import "foo"
    +import "foo/sub"
    +
    +var _ foo.T
    +var _ sub.T
    +`},
    +			}),
    +			from: "foo", to: "bar",
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +import "bar"
    +import "bar/sub"
    +
    +var _ bar.T
    +var _ sub.T
    +`,
    +				"/go/src/bar/0.go": `package bar
    +
    +type T int
    +`,
    +				"/go/src/bar/sub/0.go": `package sub; type T int`,
    +			},
    +		},
    +
    +		// References into subpackages
    +		{
    +			ctxt: fakeContext(map[string][]string{
    +				"foo":   {`package foo; import "foo/a"; var _ a.T`},
    +				"foo/a": {`package a; type T int`},
    +				"foo/b": {`package b; import "foo/a"; var _ a.T`},
    +			}),
    +			from: "foo", to: "bar",
    +			want: map[string]string{
    +				"/go/src/bar/0.go": `package bar
    +
    +import "bar/a"
    +
    +var _ a.T
    +`,
    +				"/go/src/bar/a/0.go": `package a; type T int`,
    +				"/go/src/bar/b/0.go": `package b
    +
    +import "bar/a"
    +
    +var _ a.T
    +`,
    +			},
    +		},
    +
    +		// External test packages
    +		{
    +			ctxt: buildutil.FakeContext(map[string]map[string]string{
    +				"foo": {
    +					"0.go":      `package foo; type T int`,
    +					"0_test.go": `package foo_test; import "foo"; var _ foo.T`,
    +				},
    +				"baz": {
    +					"0_test.go": `package baz_test; import "foo"; var _ foo.T`,
    +				},
    +			}),
    +			from: "foo", to: "bar",
    +			want: map[string]string{
    +				"/go/src/bar/0.go": `package bar
    +
    +type T int
    +`,
    +				"/go/src/bar/0_test.go": `package bar_test
    +
    +import "bar"
    +
    +var _ bar.T
    +`,
    +				"/go/src/baz/0_test.go": `package baz_test
    +
    +import "bar"
    +
    +var _ bar.T
    +`,
    +			},
    +		},
    +		// package import comments
    +		{
    +			ctxt: fakeContext(map[string][]string{"foo": {`package foo // import "baz"`}}),
    +			from: "foo", to: "bar",
    +			want: map[string]string{"/go/src/bar/0.go": `package bar // import "bar"
    +`},
    +		},
    +		{
    +			ctxt: fakeContext(map[string][]string{"foo": {`package foo /* import "baz" */`}}),
    +			from: "foo", to: "bar",
    +			want: map[string]string{"/go/src/bar/0.go": `package bar /* import "bar" */
    +`},
    +		},
    +		{
    +			ctxt: fakeContext(map[string][]string{"foo": {`package foo       // import "baz"`}}),
    +			from: "foo", to: "bar",
    +			want: map[string]string{"/go/src/bar/0.go": `package bar // import "bar"
    +`},
    +		},
    +		{
    +			ctxt: fakeContext(map[string][]string{"foo": {`package foo
    +// import " this is not an import comment`}}),
    +			from: "foo", to: "bar",
    +			want: map[string]string{"/go/src/bar/0.go": `package bar
    +
    +// import " this is not an import comment
    +`},
    +		},
    +		{
    +			ctxt: fakeContext(map[string][]string{"foo": {`package foo
    +/* import " this is not an import comment */`}}),
    +			from: "foo", to: "bar",
    +			want: map[string]string{"/go/src/bar/0.go": `package bar
    +
    +/* import " this is not an import comment */
    +`},
    +		},
    +	}
    +
    +	for _, test := range tests {
    +		ctxt := test.ctxt
    +
    +		got := make(map[string]string)
    +		// Populate got with starting file set. rewriteFile and moveDirectory
    +		// will mutate got to produce resulting file set.
    +		buildutil.ForEachPackage(ctxt, func(importPath string, err error) {
    +			if err != nil {
    +				return
    +			}
    +			path := filepath.Join("/go/src", importPath, "0.go")
    +			if !buildutil.FileExists(ctxt, path) {
    +				return
    +			}
    +			f, err := ctxt.OpenFile(path)
    +			if err != nil {
    +				t.Errorf("unexpected error opening file: %s", err)
    +				return
    +			}
    +			bytes, err := ioutil.ReadAll(f)
    +			f.Close()
    +			if err != nil {
    +				t.Errorf("unexpected error reading file: %s", err)
    +				return
    +			}
    +			got[path] = string(bytes)
    +		})
    +		writeFile = func(filename string, content []byte) error {
    +			got[filename] = string(content)
    +			return nil
    +		}
    +		moveDirectory = func(from, to string) error {
    +			for path, contents := range got {
    +				if strings.HasPrefix(path, from) {
    +					newPath := strings.Replace(path, from, to, 1)
    +					delete(got, path)
    +					got[newPath] = contents
    +				}
    +			}
    +			return nil
    +		}
    +
    +		err := Move(ctxt, test.from, test.to, "")
    +		prefix := fmt.Sprintf("-from %q -to %q", test.from, test.to)
    +		if err != nil {
    +			t.Errorf("%s: unexpected error: %s", prefix, err)
    +			continue
    +		}
    +
    +		for file, wantContent := range test.want {
    +			k := filepath.FromSlash(file)
    +			gotContent, ok := got[k]
    +			delete(got, k)
    +			if !ok {
    +				// TODO(matloob): some testcases might have files that won't be
    +				// rewritten
    +				t.Errorf("%s: file %s not rewritten", prefix, file)
    +				continue
    +			}
    +			if gotContent != wantContent {
    +				t.Errorf("%s: rewritten file %s does not match expectation; got <<<%s>>>\n"+
    +					"want <<<%s>>>", prefix, file, gotContent, wantContent)
    +			}
    +		}
    +		// got should now be empty
    +		for file := range got {
    +			t.Errorf("%s: unexpected rewrite of file %s", prefix, file)
    +		}
    +	}
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/rename/rename.go b/vendor/golang.org/x/tools/refactor/rename/rename.go
    new file mode 100644
    index 0000000000..be47701331
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/rename/rename.go
    @@ -0,0 +1,510 @@
    +// 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 go1.5
    +
    +// Package rename contains the implementation of the 'gorename' command
    +// whose main function is in golang.org/x/tools/cmd/gorename.
    +// See the Usage constant for the command documentation.
    +package rename // import "golang.org/x/tools/refactor/rename"
    +
    +import (
    +	"bytes"
    +	"errors"
    +	"fmt"
    +	"go/ast"
    +	"go/build"
    +	"go/format"
    +	"go/parser"
    +	"go/token"
    +	"go/types"
    +	"io"
    +	"io/ioutil"
    +	"log"
    +	"os"
    +	"os/exec"
    +	"path"
    +	"sort"
    +	"strconv"
    +	"strings"
    +
    +	"golang.org/x/tools/go/loader"
    +	"golang.org/x/tools/go/types/typeutil"
    +	"golang.org/x/tools/refactor/importgraph"
    +	"golang.org/x/tools/refactor/satisfy"
    +)
    +
    +const Usage = `gorename: precise type-safe renaming of identifiers in Go source code.
    +
    +Usage:
    +
    + gorename (-from  | -offset :#) -to  [-force]
    +
    +You must specify the object (named entity) to rename using the -offset
    +or -from flag.  Exactly one must be specified.
    +
    +Flags:
    +
    +-offset    specifies the filename and byte offset of an identifier to rename.
    +           This form is intended for use by text editors.
    +
    +-from      specifies the object to rename using a query notation;
    +           This form is intended for interactive use at the command line.
    +           A legal -from query has one of the following forms:
    +
    +  "encoding/json".Decoder.Decode        method of package-level named type
    +  (*"encoding/json".Decoder).Decode     ditto, alternative syntax
    +  "encoding/json".Decoder.buf           field of package-level named struct type
    +  "encoding/json".HTMLEscape            package member (const, func, var, type)
    +  "encoding/json".Decoder.Decode::x     local object x within a method
    +  "encoding/json".HTMLEscape::x         local object x within a function
    +  "encoding/json"::x                    object x anywhere within a package
    +  json.go::x                            object x within file json.go
    +
    +           Double-quotes must be escaped when writing a shell command.
    +           Quotes may be omitted for single-segment import paths such as "fmt".
    +
    +           For methods, the parens and '*' on the receiver type are both
    +           optional.
    +
    +           It is an error if one of the ::x queries matches multiple
    +           objects.
    +
    +-to        the new name.
    +
    +-force     causes the renaming to proceed even if conflicts were reported.
    +           The resulting program may be ill-formed, or experience a change
    +           in behaviour.
    +
    +           WARNING: this flag may even cause the renaming tool to crash.
    +           (In due course this bug will be fixed by moving certain
    +           analyses into the type-checker.)
    +
    +-d         display diffs instead of rewriting files
    +
    +-v         enables verbose logging.
    +
    +gorename automatically computes the set of packages that might be
    +affected.  For a local renaming, this is just the package specified by
    +-from or -offset, but for a potentially exported name, gorename scans
    +the workspace ($GOROOT and $GOPATH).
    +
    +gorename rejects renamings of concrete methods that would change the
    +assignability relation between types and interfaces.  If the interface
    +change was intentional, initiate the renaming at the interface method.
    +
    +gorename rejects any renaming that would create a conflict at the point
    +of declaration, or a reference conflict (ambiguity or shadowing), or
    +anything else that could cause the resulting program not to compile.
    +
    +
    +Examples:
    +
    +$ gorename -offset file.go:#123 -to foo
    +
    +  Rename the object whose identifier is at byte offset 123 within file file.go.
    +
    +$ gorename -from '"bytes".Buffer.Len' -to Size
    +
    +  Rename the "Len" method of the *bytes.Buffer type to "Size".
    +
    +---- TODO ----
    +
    +Correctness:
    +- handle dot imports correctly
    +- document limitations (reflection, 'implements' algorithm).
    +- sketch a proof of exhaustiveness.
    +
    +Features:
    +- support running on packages specified as *.go files on the command line
    +- support running on programs containing errors (loader.Config.AllowErrors)
    +- allow users to specify a scope other than "global" (to avoid being
    +  stuck by neglected packages in $GOPATH that don't build).
    +- support renaming the package clause (no object)
    +- support renaming an import path (no ident or object)
    +  (requires filesystem + SCM updates).
    +- detect and reject edits to autogenerated files (cgo, protobufs)
    +  and optionally $GOROOT packages.
    +- report all conflicts, or at least all qualitatively distinct ones.
    +  Sometimes we stop to avoid redundancy, but
    +  it may give a disproportionate sense of safety in -force mode.
    +- support renaming all instances of a pattern, e.g.
    +  all receiver vars of a given type,
    +  all local variables of a given type,
    +  all PkgNames for a given package.
    +- emit JSON output for other editors and tools.
    +`
    +
    +var (
    +	// Force enables patching of the source files even if conflicts were reported.
    +	// The resulting program may be ill-formed.
    +	// It may even cause gorename to crash.  TODO(adonovan): fix that.
    +	Force bool
    +
    +	// Diff causes the tool to display diffs instead of rewriting files.
    +	Diff bool
    +
    +	// DiffCmd specifies the diff command used by the -d feature.
    +	// (The command must accept a -u flag and two filename arguments.)
    +	DiffCmd = "diff"
    +
    +	// ConflictError is returned by Main when it aborts the renaming due to conflicts.
    +	// (It is distinguished because the interesting errors are the conflicts themselves.)
    +	ConflictError = errors.New("renaming aborted due to conflicts")
    +
    +	// Verbose enables extra logging.
    +	Verbose bool
    +)
    +
    +var stdout io.Writer = os.Stdout
    +
    +type renamer struct {
    +	iprog              *loader.Program
    +	objsToUpdate       map[types.Object]bool
    +	hadConflicts       bool
    +	to                 string
    +	satisfyConstraints map[satisfy.Constraint]bool
    +	packages           map[*types.Package]*loader.PackageInfo // subset of iprog.AllPackages to inspect
    +	msets              typeutil.MethodSetCache
    +	changeMethods      bool
    +}
    +
    +var reportError = func(posn token.Position, message string) {
    +	fmt.Fprintf(os.Stderr, "%s: %s\n", posn, message)
    +}
    +
    +// importName renames imports of the package with the given path in
    +// the given package.  If fromName is not empty, only imports as
    +// fromName will be renamed.  If the renaming would lead to a conflict,
    +// the file is left unchanged.
    +func importName(iprog *loader.Program, info *loader.PackageInfo, fromPath, fromName, to string) error {
    +	for _, f := range info.Files {
    +		var from types.Object
    +		for _, imp := range f.Imports {
    +			importPath, _ := strconv.Unquote(imp.Path.Value)
    +			importName := path.Base(importPath)
    +			if imp.Name != nil {
    +				importName = imp.Name.Name
    +			}
    +			if importPath == fromPath && (fromName == "" || importName == fromName) {
    +				from = info.Implicits[imp]
    +				break
    +			}
    +		}
    +		if from == nil {
    +			continue
    +		}
    +		r := renamer{
    +			iprog:        iprog,
    +			objsToUpdate: make(map[types.Object]bool),
    +			to:           to,
    +			packages:     map[*types.Package]*loader.PackageInfo{info.Pkg: info},
    +		}
    +		r.check(from)
    +		if r.hadConflicts {
    +			continue // ignore errors; leave the existing name
    +		}
    +		if err := r.update(); err != nil {
    +			return err
    +		}
    +	}
    +	return nil
    +}
    +
    +func Main(ctxt *build.Context, offsetFlag, fromFlag, to string) error {
    +	// -- Parse the -from or -offset specifier ----------------------------
    +
    +	if (offsetFlag == "") == (fromFlag == "") {
    +		return fmt.Errorf("exactly one of the -from and -offset flags must be specified")
    +	}
    +
    +	if !isValidIdentifier(to) {
    +		return fmt.Errorf("-to %q: not a valid identifier", to)
    +	}
    +
    +	if Diff {
    +		defer func(saved func(string, []byte) error) { writeFile = saved }(writeFile)
    +		writeFile = diff
    +	}
    +
    +	var spec *spec
    +	var err error
    +	if fromFlag != "" {
    +		spec, err = parseFromFlag(ctxt, fromFlag)
    +	} else {
    +		spec, err = parseOffsetFlag(ctxt, offsetFlag)
    +	}
    +	if err != nil {
    +		return err
    +	}
    +
    +	if spec.fromName == to {
    +		return fmt.Errorf("the old and new names are the same: %s", to)
    +	}
    +
    +	// -- Load the program consisting of the initial package  -------------
    +
    +	iprog, err := loadProgram(ctxt, map[string]bool{spec.pkg: true})
    +	if err != nil {
    +		return err
    +	}
    +
    +	fromObjects, err := findFromObjects(iprog, spec)
    +	if err != nil {
    +		return err
    +	}
    +
    +	// -- Load a larger program, for global renamings ---------------------
    +
    +	if requiresGlobalRename(fromObjects, to) {
    +		// For a local refactoring, we needn't load more
    +		// packages, but if the renaming affects the package's
    +		// API, we we must load all packages that depend on the
    +		// package defining the object, plus their tests.
    +
    +		if Verbose {
    +			log.Print("Potentially global renaming; scanning workspace...")
    +		}
    +
    +		// Scan the workspace and build the import graph.
    +		_, rev, errors := importgraph.Build(ctxt)
    +		if len(errors) > 0 {
    +			// With a large GOPATH tree, errors are inevitable.
    +			// Report them but proceed.
    +			fmt.Fprintf(os.Stderr, "While scanning Go workspace:\n")
    +			for path, err := range errors {
    +				fmt.Fprintf(os.Stderr, "Package %q: %s.\n", path, err)
    +			}
    +		}
    +
    +		// Enumerate the set of potentially affected packages.
    +		affectedPackages := make(map[string]bool)
    +		for _, obj := range fromObjects {
    +			// External test packages are never imported,
    +			// so they will never appear in the graph.
    +			for path := range rev.Search(obj.Pkg().Path()) {
    +				affectedPackages[path] = true
    +			}
    +		}
    +
    +		// TODO(adonovan): allow the user to specify the scope,
    +		// or -ignore patterns?  Computing the scope when we
    +		// don't (yet) support inputs containing errors can make
    +		// the tool rather brittle.
    +
    +		// Re-load the larger program.
    +		iprog, err = loadProgram(ctxt, affectedPackages)
    +		if err != nil {
    +			return err
    +		}
    +
    +		fromObjects, err = findFromObjects(iprog, spec)
    +		if err != nil {
    +			return err
    +		}
    +	}
    +
    +	// -- Do the renaming -------------------------------------------------
    +
    +	r := renamer{
    +		iprog:        iprog,
    +		objsToUpdate: make(map[types.Object]bool),
    +		to:           to,
    +		packages:     make(map[*types.Package]*loader.PackageInfo),
    +	}
    +
    +	// A renaming initiated at an interface method indicates the
    +	// intention to rename abstract and concrete methods as needed
    +	// to preserve assignability.
    +	for _, obj := range fromObjects {
    +		if obj, ok := obj.(*types.Func); ok {
    +			recv := obj.Type().(*types.Signature).Recv()
    +			if recv != nil && isInterface(recv.Type().Underlying()) {
    +				r.changeMethods = true
    +				break
    +			}
    +		}
    +	}
    +
    +	// Only the initially imported packages (iprog.Imported) and
    +	// their external tests (iprog.Created) should be inspected or
    +	// modified, as only they have type-checked functions bodies.
    +	// The rest are just dependencies, needed only for package-level
    +	// type information.
    +	for _, info := range iprog.Imported {
    +		r.packages[info.Pkg] = info
    +	}
    +	for _, info := range iprog.Created { // (tests)
    +		r.packages[info.Pkg] = info
    +	}
    +
    +	for _, from := range fromObjects {
    +		r.check(from)
    +	}
    +	if r.hadConflicts && !Force {
    +		return ConflictError
    +	}
    +	return r.update()
    +}
    +
    +// loadProgram loads the specified set of packages (plus their tests)
    +// and all their dependencies, from source, through the specified build
    +// context.  Only packages in pkgs will have their functions bodies typechecked.
    +func loadProgram(ctxt *build.Context, pkgs map[string]bool) (*loader.Program, error) {
    +	conf := loader.Config{
    +		Build:      ctxt,
    +		ParserMode: parser.ParseComments,
    +
    +		// TODO(adonovan): enable this.  Requires making a lot of code more robust!
    +		AllowErrors: false,
    +	}
    +
    +	// Optimization: don't type-check the bodies of functions in our
    +	// dependencies, since we only need exported package members.
    +	conf.TypeCheckFuncBodies = func(p string) bool {
    +		return pkgs[p] || pkgs[strings.TrimSuffix(p, "_test")]
    +	}
    +
    +	if Verbose {
    +		var list []string
    +		for pkg := range pkgs {
    +			list = append(list, pkg)
    +		}
    +		sort.Strings(list)
    +		for _, pkg := range list {
    +			log.Printf("Loading package: %s", pkg)
    +		}
    +	}
    +
    +	for pkg := range pkgs {
    +		conf.ImportWithTests(pkg)
    +	}
    +	return conf.Load()
    +}
    +
    +// requiresGlobalRename reports whether this renaming could potentially
    +// affect other packages in the Go workspace.
    +func requiresGlobalRename(fromObjects []types.Object, to string) bool {
    +	var tfm bool
    +	for _, from := range fromObjects {
    +		if from.Exported() {
    +			return true
    +		}
    +		switch objectKind(from) {
    +		case "type", "field", "method":
    +			tfm = true
    +		}
    +	}
    +	if ast.IsExported(to) && tfm {
    +		// A global renaming may be necessary even if we're
    +		// exporting a previous unexported name, since if it's
    +		// the name of a type, field or method, this could
    +		// change selections in other packages.
    +		// (We include "type" in this list because a type
    +		// used as an embedded struct field entails a field
    +		// renaming.)
    +		return true
    +	}
    +	return false
    +}
    +
    +// update updates the input files.
    +func (r *renamer) update() error {
    +	// We use token.File, not filename, since a file may appear to
    +	// belong to multiple packages and be parsed more than once.
    +	// token.File captures this distinction; filename does not.
    +	var nidents int
    +	var filesToUpdate = make(map[*token.File]bool)
    +	for _, info := range r.packages {
    +		// Mutate the ASTs and note the filenames.
    +		for id, obj := range info.Defs {
    +			if r.objsToUpdate[obj] {
    +				nidents++
    +				id.Name = r.to
    +				filesToUpdate[r.iprog.Fset.File(id.Pos())] = true
    +			}
    +		}
    +		for id, obj := range info.Uses {
    +			if r.objsToUpdate[obj] {
    +				nidents++
    +				id.Name = r.to
    +				filesToUpdate[r.iprog.Fset.File(id.Pos())] = true
    +			}
    +		}
    +	}
    +
    +	// TODO(adonovan): don't rewrite cgo + generated files.
    +	var nerrs, npkgs int
    +	for _, info := range r.packages {
    +		first := true
    +		for _, f := range info.Files {
    +			tokenFile := r.iprog.Fset.File(f.Pos())
    +			if filesToUpdate[tokenFile] {
    +				if first {
    +					npkgs++
    +					first = false
    +					if Verbose {
    +						log.Printf("Updating package %s", info.Pkg.Path())
    +					}
    +				}
    +
    +				filename := tokenFile.Name()
    +				var buf bytes.Buffer
    +				if err := format.Node(&buf, r.iprog.Fset, f); err != nil {
    +					log.Printf("failed to pretty-print syntax tree: %v", err)
    +					nerrs++
    +					continue
    +				}
    +				if err := writeFile(filename, buf.Bytes()); err != nil {
    +					log.Print(err)
    +					nerrs++
    +				}
    +			}
    +		}
    +	}
    +	if !Diff {
    +		fmt.Printf("Renamed %d occurrence%s in %d file%s in %d package%s.\n",
    +			nidents, plural(nidents),
    +			len(filesToUpdate), plural(len(filesToUpdate)),
    +			npkgs, plural(npkgs))
    +	}
    +	if nerrs > 0 {
    +		return fmt.Errorf("failed to rewrite %d file%s", nerrs, plural(nerrs))
    +	}
    +	return nil
    +}
    +
    +func plural(n int) string {
    +	if n != 1 {
    +		return "s"
    +	}
    +	return ""
    +}
    +
    +// writeFile is a seam for testing and for the -d flag.
    +var writeFile = reallyWriteFile
    +
    +func reallyWriteFile(filename string, content []byte) error {
    +	return ioutil.WriteFile(filename, content, 0644)
    +}
    +
    +func diff(filename string, content []byte) error {
    +	renamed := fmt.Sprintf("%s.%d.renamed", filename, os.Getpid())
    +	if err := ioutil.WriteFile(renamed, content, 0644); err != nil {
    +		return err
    +	}
    +	defer os.Remove(renamed)
    +
    +	diff, err := exec.Command(DiffCmd, "-u", filename, renamed).CombinedOutput()
    +	if len(diff) > 0 {
    +		// diff exits with a non-zero status when the files don't match.
    +		// Ignore that failure as long as we get output.
    +		stdout.Write(diff)
    +		return nil
    +	}
    +	if err != nil {
    +		return fmt.Errorf("computing diff: %v", err)
    +	}
    +	return nil
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/rename/rename14.go b/vendor/golang.org/x/tools/refactor/rename/rename14.go
    new file mode 100644
    index 0000000000..e4ccc061ab
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/rename/rename14.go
    @@ -0,0 +1,510 @@
    +// 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 !go1.5
    +
    +// Package rename contains the implementation of the 'gorename' command
    +// whose main function is in golang.org/x/tools/cmd/gorename.
    +// See the Usage constant for the command documentation.
    +package rename // import "golang.org/x/tools/refactor/rename"
    +
    +import (
    +	"bytes"
    +	"errors"
    +	"fmt"
    +	"go/ast"
    +	"go/build"
    +	"go/format"
    +	"go/parser"
    +	"go/token"
    +	"io"
    +	"io/ioutil"
    +	"log"
    +	"os"
    +	"os/exec"
    +	"path"
    +	"sort"
    +	"strconv"
    +	"strings"
    +
    +	"golang.org/x/tools/go/loader"
    +	"golang.org/x/tools/go/types"
    +	"golang.org/x/tools/go/types/typeutil"
    +	"golang.org/x/tools/refactor/importgraph"
    +	"golang.org/x/tools/refactor/satisfy"
    +)
    +
    +const Usage = `gorename: precise type-safe renaming of identifiers in Go source code.
    +
    +Usage:
    +
    + gorename (-from  | -offset :#) -to  [-force]
    +
    +You must specify the object (named entity) to rename using the -offset
    +or -from flag.  Exactly one must be specified.
    +
    +Flags:
    +
    +-offset    specifies the filename and byte offset of an identifier to rename.
    +           This form is intended for use by text editors.
    +
    +-from      specifies the object to rename using a query notation;
    +           This form is intended for interactive use at the command line.
    +           A legal -from query has one of the following forms:
    +
    +  "encoding/json".Decoder.Decode        method of package-level named type
    +  (*"encoding/json".Decoder).Decode     ditto, alternative syntax
    +  "encoding/json".Decoder.buf           field of package-level named struct type
    +  "encoding/json".HTMLEscape            package member (const, func, var, type)
    +  "encoding/json".Decoder.Decode::x     local object x within a method
    +  "encoding/json".HTMLEscape::x         local object x within a function
    +  "encoding/json"::x                    object x anywhere within a package
    +  json.go::x                            object x within file json.go
    +
    +           Double-quotes must be escaped when writing a shell command.
    +           Quotes may be omitted for single-segment import paths such as "fmt".
    +
    +           For methods, the parens and '*' on the receiver type are both
    +           optional.
    +
    +           It is an error if one of the ::x queries matches multiple
    +           objects.
    +
    +-to        the new name.
    +
    +-force     causes the renaming to proceed even if conflicts were reported.
    +           The resulting program may be ill-formed, or experience a change
    +           in behaviour.
    +
    +           WARNING: this flag may even cause the renaming tool to crash.
    +           (In due course this bug will be fixed by moving certain
    +           analyses into the type-checker.)
    +
    +-d         display diffs instead of rewriting files
    +
    +-v         enables verbose logging.
    +
    +gorename automatically computes the set of packages that might be
    +affected.  For a local renaming, this is just the package specified by
    +-from or -offset, but for a potentially exported name, gorename scans
    +the workspace ($GOROOT and $GOPATH).
    +
    +gorename rejects renamings of concrete methods that would change the
    +assignability relation between types and interfaces.  If the interface
    +change was intentional, initiate the renaming at the interface method.
    +
    +gorename rejects any renaming that would create a conflict at the point
    +of declaration, or a reference conflict (ambiguity or shadowing), or
    +anything else that could cause the resulting program not to compile.
    +
    +
    +Examples:
    +
    +$ gorename -offset file.go:#123 -to foo
    +
    +  Rename the object whose identifier is at byte offset 123 within file file.go.
    +
    +$ gorename -from '"bytes".Buffer.Len' -to Size
    +
    +  Rename the "Len" method of the *bytes.Buffer type to "Size".
    +
    +---- TODO ----
    +
    +Correctness:
    +- handle dot imports correctly
    +- document limitations (reflection, 'implements' algorithm).
    +- sketch a proof of exhaustiveness.
    +
    +Features:
    +- support running on packages specified as *.go files on the command line
    +- support running on programs containing errors (loader.Config.AllowErrors)
    +- allow users to specify a scope other than "global" (to avoid being
    +  stuck by neglected packages in $GOPATH that don't build).
    +- support renaming the package clause (no object)
    +- support renaming an import path (no ident or object)
    +  (requires filesystem + SCM updates).
    +- detect and reject edits to autogenerated files (cgo, protobufs)
    +  and optionally $GOROOT packages.
    +- report all conflicts, or at least all qualitatively distinct ones.
    +  Sometimes we stop to avoid redundancy, but
    +  it may give a disproportionate sense of safety in -force mode.
    +- support renaming all instances of a pattern, e.g.
    +  all receiver vars of a given type,
    +  all local variables of a given type,
    +  all PkgNames for a given package.
    +- emit JSON output for other editors and tools.
    +`
    +
    +var (
    +	// Force enables patching of the source files even if conflicts were reported.
    +	// The resulting program may be ill-formed.
    +	// It may even cause gorename to crash.  TODO(adonovan): fix that.
    +	Force bool
    +
    +	// Diff causes the tool to display diffs instead of rewriting files.
    +	Diff bool
    +
    +	// DiffCmd specifies the diff command used by the -d feature.
    +	// (The command must accept a -u flag and two filename arguments.)
    +	DiffCmd = "diff"
    +
    +	// ConflictError is returned by Main when it aborts the renaming due to conflicts.
    +	// (It is distinguished because the interesting errors are the conflicts themselves.)
    +	ConflictError = errors.New("renaming aborted due to conflicts")
    +
    +	// Verbose enables extra logging.
    +	Verbose bool
    +)
    +
    +var stdout io.Writer = os.Stdout
    +
    +type renamer struct {
    +	iprog              *loader.Program
    +	objsToUpdate       map[types.Object]bool
    +	hadConflicts       bool
    +	to                 string
    +	satisfyConstraints map[satisfy.Constraint]bool
    +	packages           map[*types.Package]*loader.PackageInfo // subset of iprog.AllPackages to inspect
    +	msets              typeutil.MethodSetCache
    +	changeMethods      bool
    +}
    +
    +var reportError = func(posn token.Position, message string) {
    +	fmt.Fprintf(os.Stderr, "%s: %s\n", posn, message)
    +}
    +
    +// importName renames imports of the package with the given path in
    +// the given package.  If fromName is not empty, only imports as
    +// fromName will be renamed.  If the renaming would lead to a conflict,
    +// the file is left unchanged.
    +func importName(iprog *loader.Program, info *loader.PackageInfo, fromPath, fromName, to string) error {
    +	for _, f := range info.Files {
    +		var from types.Object
    +		for _, imp := range f.Imports {
    +			importPath, _ := strconv.Unquote(imp.Path.Value)
    +			importName := path.Base(importPath)
    +			if imp.Name != nil {
    +				importName = imp.Name.Name
    +			}
    +			if importPath == fromPath && (fromName == "" || importName == fromName) {
    +				from = info.Implicits[imp]
    +				break
    +			}
    +		}
    +		if from == nil {
    +			continue
    +		}
    +		r := renamer{
    +			iprog:        iprog,
    +			objsToUpdate: make(map[types.Object]bool),
    +			to:           to,
    +			packages:     map[*types.Package]*loader.PackageInfo{info.Pkg: info},
    +		}
    +		r.check(from)
    +		if r.hadConflicts {
    +			continue // ignore errors; leave the existing name
    +		}
    +		if err := r.update(); err != nil {
    +			return err
    +		}
    +	}
    +	return nil
    +}
    +
    +func Main(ctxt *build.Context, offsetFlag, fromFlag, to string) error {
    +	// -- Parse the -from or -offset specifier ----------------------------
    +
    +	if (offsetFlag == "") == (fromFlag == "") {
    +		return fmt.Errorf("exactly one of the -from and -offset flags must be specified")
    +	}
    +
    +	if !isValidIdentifier(to) {
    +		return fmt.Errorf("-to %q: not a valid identifier", to)
    +	}
    +
    +	if Diff {
    +		defer func(saved func(string, []byte) error) { writeFile = saved }(writeFile)
    +		writeFile = diff
    +	}
    +
    +	var spec *spec
    +	var err error
    +	if fromFlag != "" {
    +		spec, err = parseFromFlag(ctxt, fromFlag)
    +	} else {
    +		spec, err = parseOffsetFlag(ctxt, offsetFlag)
    +	}
    +	if err != nil {
    +		return err
    +	}
    +
    +	if spec.fromName == to {
    +		return fmt.Errorf("the old and new names are the same: %s", to)
    +	}
    +
    +	// -- Load the program consisting of the initial package  -------------
    +
    +	iprog, err := loadProgram(ctxt, map[string]bool{spec.pkg: true})
    +	if err != nil {
    +		return err
    +	}
    +
    +	fromObjects, err := findFromObjects(iprog, spec)
    +	if err != nil {
    +		return err
    +	}
    +
    +	// -- Load a larger program, for global renamings ---------------------
    +
    +	if requiresGlobalRename(fromObjects, to) {
    +		// For a local refactoring, we needn't load more
    +		// packages, but if the renaming affects the package's
    +		// API, we we must load all packages that depend on the
    +		// package defining the object, plus their tests.
    +
    +		if Verbose {
    +			log.Print("Potentially global renaming; scanning workspace...")
    +		}
    +
    +		// Scan the workspace and build the import graph.
    +		_, rev, errors := importgraph.Build(ctxt)
    +		if len(errors) > 0 {
    +			// With a large GOPATH tree, errors are inevitable.
    +			// Report them but proceed.
    +			fmt.Fprintf(os.Stderr, "While scanning Go workspace:\n")
    +			for path, err := range errors {
    +				fmt.Fprintf(os.Stderr, "Package %q: %s.\n", path, err)
    +			}
    +		}
    +
    +		// Enumerate the set of potentially affected packages.
    +		affectedPackages := make(map[string]bool)
    +		for _, obj := range fromObjects {
    +			// External test packages are never imported,
    +			// so they will never appear in the graph.
    +			for path := range rev.Search(obj.Pkg().Path()) {
    +				affectedPackages[path] = true
    +			}
    +		}
    +
    +		// TODO(adonovan): allow the user to specify the scope,
    +		// or -ignore patterns?  Computing the scope when we
    +		// don't (yet) support inputs containing errors can make
    +		// the tool rather brittle.
    +
    +		// Re-load the larger program.
    +		iprog, err = loadProgram(ctxt, affectedPackages)
    +		if err != nil {
    +			return err
    +		}
    +
    +		fromObjects, err = findFromObjects(iprog, spec)
    +		if err != nil {
    +			return err
    +		}
    +	}
    +
    +	// -- Do the renaming -------------------------------------------------
    +
    +	r := renamer{
    +		iprog:        iprog,
    +		objsToUpdate: make(map[types.Object]bool),
    +		to:           to,
    +		packages:     make(map[*types.Package]*loader.PackageInfo),
    +	}
    +
    +	// A renaming initiated at an interface method indicates the
    +	// intention to rename abstract and concrete methods as needed
    +	// to preserve assignability.
    +	for _, obj := range fromObjects {
    +		if obj, ok := obj.(*types.Func); ok {
    +			recv := obj.Type().(*types.Signature).Recv()
    +			if recv != nil && isInterface(recv.Type().Underlying()) {
    +				r.changeMethods = true
    +				break
    +			}
    +		}
    +	}
    +
    +	// Only the initially imported packages (iprog.Imported) and
    +	// their external tests (iprog.Created) should be inspected or
    +	// modified, as only they have type-checked functions bodies.
    +	// The rest are just dependencies, needed only for package-level
    +	// type information.
    +	for _, info := range iprog.Imported {
    +		r.packages[info.Pkg] = info
    +	}
    +	for _, info := range iprog.Created { // (tests)
    +		r.packages[info.Pkg] = info
    +	}
    +
    +	for _, from := range fromObjects {
    +		r.check(from)
    +	}
    +	if r.hadConflicts && !Force {
    +		return ConflictError
    +	}
    +	return r.update()
    +}
    +
    +// loadProgram loads the specified set of packages (plus their tests)
    +// and all their dependencies, from source, through the specified build
    +// context.  Only packages in pkgs will have their functions bodies typechecked.
    +func loadProgram(ctxt *build.Context, pkgs map[string]bool) (*loader.Program, error) {
    +	conf := loader.Config{
    +		Build:      ctxt,
    +		ParserMode: parser.ParseComments,
    +
    +		// TODO(adonovan): enable this.  Requires making a lot of code more robust!
    +		AllowErrors: false,
    +	}
    +
    +	// Optimization: don't type-check the bodies of functions in our
    +	// dependencies, since we only need exported package members.
    +	conf.TypeCheckFuncBodies = func(p string) bool {
    +		return pkgs[p] || pkgs[strings.TrimSuffix(p, "_test")]
    +	}
    +
    +	if Verbose {
    +		var list []string
    +		for pkg := range pkgs {
    +			list = append(list, pkg)
    +		}
    +		sort.Strings(list)
    +		for _, pkg := range list {
    +			log.Printf("Loading package: %s", pkg)
    +		}
    +	}
    +
    +	for pkg := range pkgs {
    +		conf.ImportWithTests(pkg)
    +	}
    +	return conf.Load()
    +}
    +
    +// requiresGlobalRename reports whether this renaming could potentially
    +// affect other packages in the Go workspace.
    +func requiresGlobalRename(fromObjects []types.Object, to string) bool {
    +	var tfm bool
    +	for _, from := range fromObjects {
    +		if from.Exported() {
    +			return true
    +		}
    +		switch objectKind(from) {
    +		case "type", "field", "method":
    +			tfm = true
    +		}
    +	}
    +	if ast.IsExported(to) && tfm {
    +		// A global renaming may be necessary even if we're
    +		// exporting a previous unexported name, since if it's
    +		// the name of a type, field or method, this could
    +		// change selections in other packages.
    +		// (We include "type" in this list because a type
    +		// used as an embedded struct field entails a field
    +		// renaming.)
    +		return true
    +	}
    +	return false
    +}
    +
    +// update updates the input files.
    +func (r *renamer) update() error {
    +	// We use token.File, not filename, since a file may appear to
    +	// belong to multiple packages and be parsed more than once.
    +	// token.File captures this distinction; filename does not.
    +	var nidents int
    +	var filesToUpdate = make(map[*token.File]bool)
    +	for _, info := range r.packages {
    +		// Mutate the ASTs and note the filenames.
    +		for id, obj := range info.Defs {
    +			if r.objsToUpdate[obj] {
    +				nidents++
    +				id.Name = r.to
    +				filesToUpdate[r.iprog.Fset.File(id.Pos())] = true
    +			}
    +		}
    +		for id, obj := range info.Uses {
    +			if r.objsToUpdate[obj] {
    +				nidents++
    +				id.Name = r.to
    +				filesToUpdate[r.iprog.Fset.File(id.Pos())] = true
    +			}
    +		}
    +	}
    +
    +	// TODO(adonovan): don't rewrite cgo + generated files.
    +	var nerrs, npkgs int
    +	for _, info := range r.packages {
    +		first := true
    +		for _, f := range info.Files {
    +			tokenFile := r.iprog.Fset.File(f.Pos())
    +			if filesToUpdate[tokenFile] {
    +				if first {
    +					npkgs++
    +					first = false
    +					if Verbose {
    +						log.Printf("Updating package %s", info.Pkg.Path())
    +					}
    +				}
    +
    +				filename := tokenFile.Name()
    +				var buf bytes.Buffer
    +				if err := format.Node(&buf, r.iprog.Fset, f); err != nil {
    +					log.Printf("failed to pretty-print syntax tree: %v", err)
    +					nerrs++
    +					continue
    +				}
    +				if err := writeFile(filename, buf.Bytes()); err != nil {
    +					log.Print(err)
    +					nerrs++
    +				}
    +			}
    +		}
    +	}
    +	if !Diff {
    +		fmt.Printf("Renamed %d occurrence%s in %d file%s in %d package%s.\n",
    +			nidents, plural(nidents),
    +			len(filesToUpdate), plural(len(filesToUpdate)),
    +			npkgs, plural(npkgs))
    +	}
    +	if nerrs > 0 {
    +		return fmt.Errorf("failed to rewrite %d file%s", nerrs, plural(nerrs))
    +	}
    +	return nil
    +}
    +
    +func plural(n int) string {
    +	if n != 1 {
    +		return "s"
    +	}
    +	return ""
    +}
    +
    +// writeFile is a seam for testing and for the -d flag.
    +var writeFile = reallyWriteFile
    +
    +func reallyWriteFile(filename string, content []byte) error {
    +	return ioutil.WriteFile(filename, content, 0644)
    +}
    +
    +func diff(filename string, content []byte) error {
    +	renamed := fmt.Sprintf("%s.%d.renamed", filename, os.Getpid())
    +	if err := ioutil.WriteFile(renamed, content, 0644); err != nil {
    +		return err
    +	}
    +	defer os.Remove(renamed)
    +
    +	diff, err := exec.Command(DiffCmd, "-u", filename, renamed).CombinedOutput()
    +	if len(diff) > 0 {
    +		// diff exits with a non-zero status when the files don't match.
    +		// Ignore that failure as long as we get output.
    +		stdout.Write(diff)
    +		return nil
    +	}
    +	if err != nil {
    +		return fmt.Errorf("computing diff: %v", err)
    +	}
    +	return nil
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/rename/rename_test.go b/vendor/golang.org/x/tools/refactor/rename/rename_test.go
    new file mode 100644
    index 0000000000..3670319736
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/rename/rename_test.go
    @@ -0,0 +1,1119 @@
    +// 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 rename
    +
    +import (
    +	"bytes"
    +	"fmt"
    +	"go/build"
    +	"go/token"
    +	"os"
    +	"path/filepath"
    +	"regexp"
    +	"runtime"
    +	"strings"
    +	"testing"
    +
    +	"golang.org/x/tools/go/buildutil"
    +)
    +
    +// TODO(adonovan): test reported source positions, somehow.
    +
    +func TestConflicts(t *testing.T) {
    +	defer func(savedWriteFile func(string, []byte) error, savedReportError func(token.Position, string)) {
    +		writeFile = savedWriteFile
    +		reportError = savedReportError
    +	}(writeFile, reportError)
    +	writeFile = func(string, []byte) error { return nil }
    +
    +	var ctxt *build.Context
    +	for _, test := range []struct {
    +		ctxt             *build.Context // nil => use previous
    +		offset, from, to string         // values of the -offset/-from and -to flags
    +		want             string         // regexp to match conflict errors, or "OK"
    +	}{
    +		// init() checks
    +		{
    +			ctxt: fakeContext(map[string][]string{
    +				"fmt": {`package fmt; type Stringer interface { String() }`},
    +				"main": {`
    +package main
    +
    +import foo "fmt"
    +
    +var v foo.Stringer
    +
    +func f() { v.String(); f() }
    +`,
    +					`package main; var w int`},
    +			}),
    +			from: "main.v", to: "init",
    +			want: `you cannot have a var at package level named "init"`,
    +		},
    +		{
    +			from: "main.f", to: "init",
    +			want: `renaming this func "f" to "init" would make it a package initializer.*` +
    +				`but references to it exist`,
    +		},
    +		{
    +			from: "/go/src/main/0.go::foo", to: "init",
    +			want: `"init" is not a valid imported package name`,
    +		},
    +
    +		// Export checks
    +		{
    +			from: "fmt.Stringer", to: "stringer",
    +			want: `renaming this type "Stringer" to "stringer" would make it unexported.*` +
    +				`breaking references from packages such as "main"`,
    +		},
    +		{
    +			from: "(fmt.Stringer).String", to: "string",
    +			want: `renaming this method "String" to "string" would make it unexported.*` +
    +				`breaking references from packages such as "main"`,
    +		},
    +
    +		// Lexical scope checks
    +		{
    +			// file/package conflict, same file
    +			from: "main.v", to: "foo",
    +			want: `renaming this var "v" to "foo" would conflict.*` +
    +				`with this imported package name`,
    +		},
    +		{
    +			// file/package conflict, same file
    +			from: "main::foo", to: "v",
    +			want: `renaming this imported package name "foo" to "v" would conflict.*` +
    +				`with this package member var`,
    +		},
    +		{
    +			// file/package conflict, different files
    +			from: "main.w", to: "foo",
    +			want: `renaming this var "w" to "foo" would conflict.*` +
    +				`with this imported package name`,
    +		},
    +		{
    +			// file/package conflict, different files
    +			from: "main::foo", to: "w",
    +			want: `renaming this imported package name "foo" to "w" would conflict.*` +
    +				`with this package member var`,
    +		},
    +		{
    +			ctxt: main(`
    +package main
    +
    +var x, z int
    +
    +func f(y int) {
    +	print(x)
    +	print(y)
    +}
    +
    +func g(w int) {
    +	print(x)
    +	x := 1
    +	print(x)
    +}`),
    +			from: "main.x", to: "y",
    +			want: `renaming this var "x" to "y".*` +
    +				`would cause this reference to become shadowed.*` +
    +				`by this intervening var definition`,
    +		},
    +		{
    +			from: "main.g::x", to: "w",
    +			want: `renaming this var "x" to "w".*` +
    +				`conflicts with var in same block`,
    +		},
    +		{
    +			from: "main.f::y", to: "x",
    +			want: `renaming this var "y" to "x".*` +
    +				`would shadow this reference.*` +
    +				`to the var declared here`,
    +		},
    +		{
    +			from: "main.g::w", to: "x",
    +			want: `renaming this var "w" to "x".*` +
    +				`conflicts with var in same block`,
    +		},
    +		{
    +			from: "main.z", to: "y", want: "OK",
    +		},
    +
    +		// Label checks
    +		{
    +			ctxt: main(`
    +package main
    +
    +func f() {
    +foo:
    +	goto foo
    +bar:
    +	goto bar
    +	func(x int) {
    +	wiz:
    +		goto wiz
    +	}(0)
    +}
    +`),
    +			from: "main.f::foo", to: "bar",
    +			want: `renaming this label "foo" to "bar".*` +
    +				`would conflict with this one`,
    +		},
    +		{
    +			from: "main.f::foo", to: "wiz", want: "OK",
    +		},
    +		{
    +			from: "main.f::wiz", to: "x", want: "OK",
    +		},
    +		{
    +			from: "main.f::x", to: "wiz", want: "OK",
    +		},
    +		{
    +			from: "main.f::wiz", to: "foo", want: "OK",
    +		},
    +
    +		// Struct fields
    +		{
    +			ctxt: main(`
    +package main
    +
    +type U struct { u int }
    +type V struct { v int }
    +
    +func (V) x() {}
    +
    +type W (struct {
    +	U
    +	V
    +	w int
    +})
    +
    +func f() {
    +	var w W
    +	print(w.u) // NB: there is no selection of w.v
    +	var _ struct { yy, zz int }
    +}
    +`),
    +			// field/field conflict in named struct declaration
    +			from: "(main.W).U", to: "w",
    +			want: `renaming this field "U" to "w".*` +
    +				`would conflict with this field`,
    +		},
    +		{
    +			// rename type used as embedded field
    +			// => rename field
    +			// => field/field conflict
    +			// This is an entailed renaming;
    +			// it would be nice if we checked source positions.
    +			from: "main.U", to: "w",
    +			want: `renaming this field "U" to "w".*` +
    +				`would conflict with this field`,
    +		},
    +		{
    +			// field/field conflict in unnamed struct declaration
    +			from: "main.f::zz", to: "yy",
    +			want: `renaming this field "zz" to "yy".*` +
    +				`would conflict with this field`,
    +		},
    +
    +		// Now we test both directions of (u,v) (u,w) (v,w) (u,x) (v,x).
    +		// Too bad we don't test position info...
    +		{
    +			// field/field ambiguity at same promotion level ('from' selection)
    +			from: "(main.U).u", to: "v",
    +			want: `renaming this field "u" to "v".*` +
    +				`would make this reference ambiguous.*` +
    +				`with this field`,
    +		},
    +		{
    +			// field/field ambiguity at same promotion level ('to' selection)
    +			from: "(main.V).v", to: "u",
    +			want: `renaming this field "v" to "u".*` +
    +				`would make this reference ambiguous.*` +
    +				`with this field`,
    +		},
    +		{
    +			// field/method conflict at different promotion level ('from' selection)
    +			from: "(main.U).u", to: "w",
    +			want: `renaming this field "u" to "w".*` +
    +				`would change the referent of this selection.*` +
    +				`of this field`,
    +		},
    +		{
    +			// field/field shadowing at different promotion levels ('to' selection)
    +			from: "(main.W).w", to: "u",
    +			want: `renaming this field "w" to "u".*` +
    +				`would shadow this selection.*` +
    +				`of the field declared here`,
    +		},
    +		{
    +			from: "(main.V).v", to: "w",
    +			want: "OK", // since no selections are made ambiguous
    +		},
    +		{
    +			from: "(main.W).w", to: "v",
    +			want: "OK", // since no selections are made ambiguous
    +		},
    +		{
    +			// field/method ambiguity at same promotion level ('from' selection)
    +			from: "(main.U).u", to: "x",
    +			want: `renaming this field "u" to "x".*` +
    +				`would make this reference ambiguous.*` +
    +				`with this method`,
    +		},
    +		{
    +			// field/field ambiguity at same promotion level ('to' selection)
    +			from: "(main.V).x", to: "u",
    +			want: `renaming this method "x" to "u".*` +
    +				`would make this reference ambiguous.*` +
    +				`with this field`,
    +		},
    +		{
    +			// field/method conflict at named struct declaration
    +			from: "(main.V).v", to: "x",
    +			want: `renaming this field "v" to "x".*` +
    +				`would conflict with this method`,
    +		},
    +		{
    +			// field/method conflict at named struct declaration
    +			from: "(main.V).x", to: "v",
    +			want: `renaming this method "x" to "v".*` +
    +				`would conflict with this field`,
    +		},
    +
    +		// Methods
    +		{
    +			ctxt: main(`
    +package main
    +type C int
    +func (C) f()
    +func (C) g()
    +type D int
    +func (*D) f()
    +func (*D) g()
    +type I interface { f(); g() }
    +type J interface { I; h() }
    +var _ I = new(D)
    +var _ interface {f()} = C(0)
    +`),
    +			from: "(main.I).f", to: "g",
    +			want: `renaming this interface method "f" to "g".*` +
    +				`would conflict with this method`,
    +		},
    +		{
    +			from: `("main".I).f`, to: "h", // NB: exercises quoted import paths too
    +			want: `renaming this interface method "f" to "h".*` +
    +				`would conflict with this method.*` +
    +				`in named interface type "J"`,
    +		},
    +		{
    +			// type J interface { h; h() } is not a conflict, amusingly.
    +			from: "main.I", to: "h",
    +			want: `OK`,
    +		},
    +		{
    +			from: "(main.J).h", to: "f",
    +			want: `renaming this interface method "h" to "f".*` +
    +				`would conflict with this method`,
    +		},
    +		{
    +			from: "(main.C).f", to: "e",
    +			want: `renaming this method "f" to "e".*` +
    +				`would make main.C no longer assignable to interface{f..}.*` +
    +				`(rename interface{f..}.f if you intend to change both types)`,
    +		},
    +		{
    +			from: "(main.D).g", to: "e",
    +			want: `renaming this method "g" to "e".*` +
    +				`would make \*main.D no longer assignable to interface I.*` +
    +				`(rename main.I.g if you intend to change both types)`,
    +		},
    +		{
    +			from: "(main.I).f", to: "e",
    +			want: `OK`,
    +		},
    +		// Indirect C/I method coupling via another concrete type D.
    +		{
    +			ctxt: main(`
    +package main
    +type I interface { f() }
    +type C int
    +func (C) f()
    +type D struct{C}
    +var _ I = D{}
    +`),
    +			from: "(main.C).f", to: "F",
    +			want: `renaming this method "f" to "F".*` +
    +				`would make main.D no longer assignable to interface I.*` +
    +				`(rename main.I.f if you intend to change both types)`,
    +		},
    +		// Renaming causes promoted method to become shadowed; C no longer satisfies I.
    +		{
    +			ctxt: main(`
    +package main
    +type I interface { f() }
    +type C struct { I }
    +func (C) g() int
    +var _ I = C{}
    +`),
    +			from: "main.I.f", to: "g",
    +			want: `renaming this method "f" to "g".*` +
    +				`would change the g method of main.C invoked via interface main.I.*` +
    +				`from \(main.I\).g.*` +
    +				`to \(main.C\).g`,
    +		},
    +		// Renaming causes promoted method to become ambiguous; C no longer satisfies I.
    +		{
    +			ctxt: main(`
    +package main
    +type I interface{f()}
    +type C int
    +func (C) f()
    +type D int
    +func (D) g()
    +type E struct{C;D}
    +var _ I = E{}
    +`),
    +			from: "main.I.f", to: "g",
    +			want: `renaming this method "f" to "g".*` +
    +				`would make the g method of main.E invoked via interface main.I ambiguous.*` +
    +				`with \(main.D\).g`,
    +		},
    +	} {
    +		var conflicts []string
    +		reportError = func(posn token.Position, message string) {
    +			conflicts = append(conflicts, message)
    +		}
    +		if test.ctxt != nil {
    +			ctxt = test.ctxt
    +		}
    +		err := Main(ctxt, test.offset, test.from, test.to)
    +		var prefix string
    +		if test.offset == "" {
    +			prefix = fmt.Sprintf("-from %q -to %q", test.from, test.to)
    +		} else {
    +			prefix = fmt.Sprintf("-offset %q -to %q", test.offset, test.to)
    +		}
    +		if err == ConflictError {
    +			got := strings.Join(conflicts, "\n")
    +			if false {
    +				t.Logf("%s: %s", prefix, got)
    +			}
    +			pattern := "(?s:" + test.want + ")" // enable multi-line matching
    +			if !regexp.MustCompile(pattern).MatchString(got) {
    +				t.Errorf("%s: conflict does not match pattern:\n"+
    +					"Conflict:\t%s\n"+
    +					"Pattern: %s",
    +					prefix, got, test.want)
    +			}
    +		} else if err != nil {
    +			t.Errorf("%s: unexpected error: %s", prefix, err)
    +		} else if test.want != "OK" {
    +			t.Errorf("%s: unexpected success, want conflicts matching:\n%s",
    +				prefix, test.want)
    +		}
    +	}
    +}
    +
    +func TestRewrites(t *testing.T) {
    +	defer func(savedWriteFile func(string, []byte) error) {
    +		writeFile = savedWriteFile
    +	}(writeFile)
    +
    +	var ctxt *build.Context
    +	for _, test := range []struct {
    +		ctxt             *build.Context    // nil => use previous
    +		offset, from, to string            // values of the -from/-offset and -to flags
    +		want             map[string]string // contents of updated files
    +	}{
    +		// Elimination of renaming import.
    +		{
    +			ctxt: fakeContext(map[string][]string{
    +				"foo": {`package foo; type T int`},
    +				"main": {`package main
    +
    +import foo2 "foo"
    +
    +var _ foo2.T
    +`},
    +			}),
    +			from: "main::foo2", to: "foo",
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +import "foo"
    +
    +var _ foo.T
    +`,
    +			},
    +		},
    +		// Introduction of renaming import.
    +		{
    +			ctxt: fakeContext(map[string][]string{
    +				"foo": {`package foo; type T int`},
    +				"main": {`package main
    +
    +import "foo"
    +
    +var _ foo.T
    +`},
    +			}),
    +			offset: "/go/src/main/0.go:#36", to: "foo2", // the "foo" in foo.T
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +import foo2 "foo"
    +
    +var _ foo2.T
    +`,
    +			},
    +		},
    +		// Renaming of package-level member.
    +		{
    +			from: "foo.T", to: "U",
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +import "foo"
    +
    +var _ foo.U
    +`,
    +				"/go/src/foo/0.go": `package foo
    +
    +type U int
    +`,
    +			},
    +		},
    +		// Label renamings.
    +		{
    +			ctxt: main(`package main
    +func f() {
    +loop:
    +	loop := 0
    +	go func() {
    +	loop:
    +		goto loop
    +	}()
    +	loop++
    +	goto loop
    +}
    +`),
    +			offset: "/go/src/main/0.go:#25", to: "loop2", // def of outer label "loop"
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +func f() {
    +loop2:
    +	loop := 0
    +	go func() {
    +	loop:
    +		goto loop
    +	}()
    +	loop++
    +	goto loop2
    +}
    +`,
    +			},
    +		},
    +		{
    +			offset: "/go/src/main/0.go:#70", to: "loop2", // ref to inner label "loop"
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +func f() {
    +loop:
    +	loop := 0
    +	go func() {
    +	loop2:
    +		goto loop2
    +	}()
    +	loop++
    +	goto loop
    +}
    +`,
    +			},
    +		},
    +		// Renaming of type used as embedded field.
    +		{
    +			ctxt: main(`package main
    +
    +type T int
    +type U struct { T }
    +
    +var _ = U{}.T
    +`),
    +			from: "main.T", to: "T2",
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +type T2 int
    +type U struct{ T2 }
    +
    +var _ = U{}.T2
    +`,
    +			},
    +		},
    +		// Renaming of embedded field.
    +		{
    +			ctxt: main(`package main
    +
    +type T int
    +type U struct { T }
    +
    +var _ = U{}.T
    +`),
    +			offset: "/go/src/main/0.go:#58", to: "T2", // T in "U{}.T"
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +type T2 int
    +type U struct{ T2 }
    +
    +var _ = U{}.T2
    +`,
    +			},
    +		},
    +		// Renaming of pointer embedded field.
    +		{
    +			ctxt: main(`package main
    +
    +type T int
    +type U struct { *T }
    +
    +var _ = U{}.T
    +`),
    +			offset: "/go/src/main/0.go:#59", to: "T2", // T in "U{}.T"
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +type T2 int
    +type U struct{ *T2 }
    +
    +var _ = U{}.T2
    +`,
    +			},
    +		},
    +
    +		// Lexical scope tests.
    +		{
    +			ctxt: main(`package main
    +
    +var y int
    +
    +func f() {
    +	print(y)
    +	y := ""
    +	print(y)
    +}
    +`),
    +			from: "main.y", to: "x",
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +var x int
    +
    +func f() {
    +	print(x)
    +	y := ""
    +	print(y)
    +}
    +`,
    +			},
    +		},
    +		{
    +			from: "main.f::y", to: "x",
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +var y int
    +
    +func f() {
    +	print(y)
    +	x := ""
    +	print(x)
    +}
    +`,
    +			},
    +		},
    +		// Renaming of typeswitch vars (a corner case).
    +		{
    +			ctxt: main(`package main
    +
    +func f(z interface{}) {
    +	switch y := z.(type) {
    +	case int:
    +		print(y)
    +	default:
    +		print(y)
    +	}
    +}
    +`),
    +			offset: "/go/src/main/0.go:#46", to: "x", // def of y
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +func f(z interface{}) {
    +	switch x := z.(type) {
    +	case int:
    +		print(x)
    +	default:
    +		print(x)
    +	}
    +}
    +`},
    +		},
    +		{
    +			offset: "/go/src/main/0.go:#81", to: "x", // ref of y in case int
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +func f(z interface{}) {
    +	switch x := z.(type) {
    +	case int:
    +		print(x)
    +	default:
    +		print(x)
    +	}
    +}
    +`},
    +		},
    +		{
    +			offset: "/go/src/main/0.go:#102", to: "x", // ref of y in default case
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +func f(z interface{}) {
    +	switch x := z.(type) {
    +	case int:
    +		print(x)
    +	default:
    +		print(x)
    +	}
    +}
    +`},
    +		},
    +
    +		// Renaming of embedded field that is a qualified reference.
    +		// (Regression test for bug 8924.)
    +		{
    +			ctxt: fakeContext(map[string][]string{
    +				"foo": {`package foo; type T int`},
    +				"main": {`package main
    +
    +import "foo"
    +
    +type _ struct{ *foo.T }
    +`},
    +			}),
    +			offset: "/go/src/main/0.go:#48", to: "U", // the "T" in *foo.T
    +			want: map[string]string{
    +				"/go/src/foo/0.go": `package foo
    +
    +type U int
    +`,
    +				"/go/src/main/0.go": `package main
    +
    +import "foo"
    +
    +type _ struct{ *foo.U }
    +`,
    +			},
    +		},
    +
    +		// Renaming of embedded field that is a qualified reference with the '-from' flag.
    +		// (Regression test for bug 12038.)
    +		{
    +			ctxt: fakeContext(map[string][]string{
    +				"foo": {`package foo; type T int`},
    +				"main": {`package main
    +
    +import "foo"
    +
    +type V struct{ *foo.T }
    +`},
    +			}),
    +			from: "(main.V).T", to: "U", // the "T" in *foo.T
    +			want: map[string]string{
    +				"/go/src/foo/0.go": `package foo
    +
    +type U int
    +`,
    +				"/go/src/main/0.go": `package main
    +
    +import "foo"
    +
    +type V struct{ *foo.U }
    +`,
    +			},
    +		},
    +		{
    +			ctxt: fakeContext(map[string][]string{
    +				"foo": {`package foo; type T int`},
    +				"main": {`package main
    +
    +import "foo"
    +
    +type V struct{ foo.T }
    +`},
    +			}),
    +			from: "(main.V).T", to: "U", // the "T" in *foo.T
    +			want: map[string]string{
    +				"/go/src/foo/0.go": `package foo
    +
    +type U int
    +`,
    +				"/go/src/main/0.go": `package main
    +
    +import "foo"
    +
    +type V struct{ foo.U }
    +`,
    +			},
    +		},
    +
    +		// Interface method renaming.
    +		{
    +			ctxt: fakeContext(map[string][]string{
    +				"main": {`
    +package main
    +type I interface { f() }
    +type J interface { f(); g() }
    +type A int
    +func (A) f()
    +type B int
    +func (B) f()
    +func (B) g()
    +type C int
    +func (C) f()
    +func (C) g()
    +var _, _ I = A(0), B(0)
    +var _, _ J = B(0), C(0)
    +`,
    +				},
    +			}),
    +			offset: "/go/src/main/0.go:#33", to: "F", // abstract method I.f
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +type I interface {
    +	F()
    +}
    +type J interface {
    +	F()
    +	g()
    +}
    +type A int
    +
    +func (A) F()
    +
    +type B int
    +
    +func (B) F()
    +func (B) g()
    +
    +type C int
    +
    +func (C) F()
    +func (C) g()
    +
    +var _, _ I = A(0), B(0)
    +var _, _ J = B(0), C(0)
    +`,
    +			},
    +		},
    +		{
    +			offset: "/go/src/main/0.go:#58", to: "F", // abstract method J.f
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +type I interface {
    +	F()
    +}
    +type J interface {
    +	F()
    +	g()
    +}
    +type A int
    +
    +func (A) F()
    +
    +type B int
    +
    +func (B) F()
    +func (B) g()
    +
    +type C int
    +
    +func (C) F()
    +func (C) g()
    +
    +var _, _ I = A(0), B(0)
    +var _, _ J = B(0), C(0)
    +`,
    +			},
    +		},
    +		{
    +			offset: "/go/src/main/0.go:#63", to: "G", // abstract method J.g
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +type I interface {
    +	f()
    +}
    +type J interface {
    +	f()
    +	G()
    +}
    +type A int
    +
    +func (A) f()
    +
    +type B int
    +
    +func (B) f()
    +func (B) G()
    +
    +type C int
    +
    +func (C) f()
    +func (C) G()
    +
    +var _, _ I = A(0), B(0)
    +var _, _ J = B(0), C(0)
    +`,
    +			},
    +		},
    +		// Indirect coupling of I.f to C.f from D->I assignment and anonymous field of D.
    +		{
    +			ctxt: fakeContext(map[string][]string{
    +				"main": {`
    +package main
    +type I interface { f() }
    +type C int
    +func (C) f()
    +type D struct{C}
    +var _ I = D{}
    +`,
    +				},
    +			}),
    +			offset: "/go/src/main/0.go:#33", to: "F", // abstract method I.f
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +type I interface {
    +	F()
    +}
    +type C int
    +
    +func (C) F()
    +
    +type D struct{ C }
    +
    +var _ I = D{}
    +`,
    +			},
    +		},
    +		// Interface embedded in struct.  No conflict if C need not satisfy I.
    +		{
    +			ctxt: fakeContext(map[string][]string{
    +				"main": {`
    +package main
    +type I interface {f()}
    +type C struct{I}
    +func (C) g() int
    +var _ int = C{}.g()
    +`,
    +				},
    +			}),
    +			offset: "/go/src/main/0.go:#32", to: "g", // abstract method I.f
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +type I interface {
    +	g()
    +}
    +type C struct{ I }
    +
    +func (C) g() int
    +
    +var _ int = C{}.g()
    +`,
    +			},
    +		},
    +		// A type assertion causes method coupling iff signatures match.
    +		{
    +			ctxt: fakeContext(map[string][]string{
    +				"main": {`package main
    +type I interface{f()}
    +type J interface{f()}
    +var _ = I(nil).(J)
    +`,
    +				},
    +			}),
    +			offset: "/go/src/main/0.go:#30", to: "g", // abstract method I.f
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +type I interface {
    +	g()
    +}
    +type J interface {
    +	g()
    +}
    +
    +var _ = I(nil).(J)
    +`,
    +			},
    +		},
    +		// Impossible type assertion: no method coupling.
    +		{
    +			ctxt: fakeContext(map[string][]string{
    +				"main": {`package main
    +type I interface{f()}
    +type J interface{f()int}
    +var _ = I(nil).(J)
    +`,
    +				},
    +			}),
    +			offset: "/go/src/main/0.go:#30", to: "g", // abstract method I.f
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +type I interface {
    +	g()
    +}
    +type J interface {
    +	f() int
    +}
    +
    +var _ = I(nil).(J)
    +`,
    +			},
    +		},
    +		// Impossible type assertion: no method coupling C.f<->J.f.
    +		{
    +			ctxt: fakeContext(map[string][]string{
    +				"main": {`package main
    +type I interface{f()}
    +type C int
    +func (C) f()
    +type J interface{f()int}
    +var _ = I(C(0)).(J)
    +`,
    +				},
    +			}),
    +			offset: "/go/src/main/0.go:#30", to: "g", // abstract method I.f
    +			want: map[string]string{
    +				"/go/src/main/0.go": `package main
    +
    +type I interface {
    +	g()
    +}
    +type C int
    +
    +func (C) g()
    +
    +type J interface {
    +	f() int
    +}
    +
    +var _ = I(C(0)).(J)
    +`,
    +			},
    +		},
    +	} {
    +		if test.ctxt != nil {
    +			ctxt = test.ctxt
    +		}
    +
    +		got := make(map[string]string)
    +		writeFile = func(filename string, content []byte) error {
    +			got[filepath.ToSlash(filename)] = string(content)
    +			return nil
    +		}
    +
    +		err := Main(ctxt, test.offset, test.from, test.to)
    +		var prefix string
    +		if test.offset == "" {
    +			prefix = fmt.Sprintf("-from %q -to %q", test.from, test.to)
    +		} else {
    +			prefix = fmt.Sprintf("-offset %q -to %q", test.offset, test.to)
    +		}
    +		if err != nil {
    +			t.Errorf("%s: unexpected error: %s", prefix, err)
    +			continue
    +		}
    +
    +		for file, wantContent := range test.want {
    +			gotContent, ok := got[file]
    +			delete(got, file)
    +			if !ok {
    +				t.Errorf("%s: file %s not rewritten", prefix, file)
    +				continue
    +			}
    +			if gotContent != wantContent {
    +				t.Errorf("%s: rewritten file %s does not match expectation; got <<<%s>>>\n"+
    +					"want <<<%s>>>", prefix, file, gotContent, wantContent)
    +			}
    +		}
    +		// got should now be empty
    +		for file := range got {
    +			t.Errorf("%s: unexpected rewrite of file %s", prefix, file)
    +		}
    +	}
    +}
    +
    +func TestDiff(t *testing.T) {
    +	if runtime.GOOS == "windows" {
    +		t.Skipf("diff tool non-existent for windows on builders")
    +	}
    +
    +	defer func() {
    +		Diff = false
    +		stdout = os.Stdout
    +	}()
    +	Diff = true
    +	stdout = new(bytes.Buffer)
    +
    +	if err := Main(&build.Default, "", `"golang.org/x/tools/refactor/rename".justHereForTestingDiff`, "Foo"); err != nil {
    +		t.Fatal(err)
    +	}
    +
    +	// NB: there are tabs in the string literal!
    +	if !strings.Contains(stdout.(fmt.Stringer).String(), `
    +-func justHereForTestingDiff() {
    +-	justHereForTestingDiff()
    ++func Foo() {
    ++	Foo()
    + }
    +`) {
    +		t.Errorf("unexpected diff:\n<<%s>>", stdout)
    +	}
    +}
    +
    +func justHereForTestingDiff() {
    +	justHereForTestingDiff()
    +}
    +
    +// ---------------------------------------------------------------------
    +
    +// Simplifying wrapper around buildutil.FakeContext for packages whose
    +// filenames are sequentially numbered (%d.go).  pkgs maps a package
    +// import path to its list of file contents.
    +func fakeContext(pkgs map[string][]string) *build.Context {
    +	pkgs2 := make(map[string]map[string]string)
    +	for path, files := range pkgs {
    +		filemap := make(map[string]string)
    +		for i, contents := range files {
    +			filemap[fmt.Sprintf("%d.go", i)] = contents
    +		}
    +		pkgs2[path] = filemap
    +	}
    +	return buildutil.FakeContext(pkgs2)
    +}
    +
    +// helper for single-file main packages with no imports.
    +func main(content string) *build.Context {
    +	return fakeContext(map[string][]string{"main": {content}})
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/rename/spec.go b/vendor/golang.org/x/tools/refactor/rename/spec.go
    new file mode 100644
    index 0000000000..259404d64a
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/rename/spec.go
    @@ -0,0 +1,568 @@
    +// 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 go1.5
    +
    +package rename
    +
    +// This file contains logic related to specifying a renaming: parsing of
    +// the flags as a form of query, and finding the object(s) it denotes.
    +// See Usage for flag details.
    +
    +import (
    +	"bytes"
    +	"fmt"
    +	"go/ast"
    +	"go/build"
    +	"go/parser"
    +	"go/token"
    +	"go/types"
    +	"log"
    +	"os"
    +	"path/filepath"
    +	"strconv"
    +	"strings"
    +
    +	"golang.org/x/tools/go/buildutil"
    +	"golang.org/x/tools/go/loader"
    +)
    +
    +// A spec specifies an entity to rename.
    +//
    +// It is populated from an -offset flag or -from query;
    +// see Usage for the allowed -from query forms.
    +//
    +type spec struct {
    +	// pkg is the package containing the position
    +	// specified by the -from or -offset flag.
    +	// If filename == "", our search for the 'from' entity
    +	// is restricted to this package.
    +	pkg string
    +
    +	// The original name of the entity being renamed.
    +	// If the query had a ::from component, this is that;
    +	// otherwise it's the last segment, e.g.
    +	//   (encoding/json.Decoder).from
    +	//   encoding/json.from
    +	fromName string
    +
    +	// -- The remaining fields are private to this file.  All are optional. --
    +
    +	// The query's ::x suffix, if any.
    +	searchFor string
    +
    +	// e.g. "Decoder" in "(encoding/json.Decoder).fieldOrMethod"
    +	//                or "encoding/json.Decoder
    +	pkgMember string
    +
    +	// e.g. fieldOrMethod in "(encoding/json.Decoder).fieldOrMethod"
    +	typeMember string
    +
    +	// Restricts the query to this file.
    +	// Implied by -from="file.go::x" and -offset flags.
    +	filename string
    +
    +	// Byte offset of the 'from' identifier within the file named 'filename'.
    +	// -offset mode only.
    +	offset int
    +}
    +
    +// parseFromFlag interprets the "-from" flag value as a renaming specification.
    +// See Usage in rename.go for valid formats.
    +func parseFromFlag(ctxt *build.Context, fromFlag string) (*spec, error) {
    +	var spec spec
    +	var main string // sans "::x" suffix
    +	switch parts := strings.Split(fromFlag, "::"); len(parts) {
    +	case 1:
    +		main = parts[0]
    +	case 2:
    +		main = parts[0]
    +		spec.searchFor = parts[1]
    +		if parts[1] == "" {
    +			// error
    +		}
    +	default:
    +		return nil, fmt.Errorf("-from %q: invalid identifier specification (see -help for formats)", fromFlag)
    +	}
    +
    +	if strings.HasSuffix(main, ".go") {
    +		// main is "filename.go"
    +		if spec.searchFor == "" {
    +			return nil, fmt.Errorf("-from: filename %q must have a ::name suffix", main)
    +		}
    +		spec.filename = main
    +		if !buildutil.FileExists(ctxt, spec.filename) {
    +			return nil, fmt.Errorf("no such file: %s", spec.filename)
    +		}
    +
    +		bp, err := buildutil.ContainingPackage(ctxt, wd, spec.filename)
    +		if err != nil {
    +			return nil, err
    +		}
    +		spec.pkg = bp.ImportPath
    +
    +	} else {
    +		// main is one of:
    +		//  "importpath"
    +		//  "importpath".member
    +		//  (*"importpath".type).fieldormethod           (parens and star optional)
    +		if err := parseObjectSpec(&spec, main); err != nil {
    +			return nil, err
    +		}
    +	}
    +
    +	if spec.searchFor != "" {
    +		spec.fromName = spec.searchFor
    +	}
    +
    +	cwd, err := os.Getwd()
    +	if err != nil {
    +		return nil, err
    +	}
    +
    +	// Sanitize the package.
    +	bp, err := ctxt.Import(spec.pkg, cwd, build.FindOnly)
    +	if err != nil {
    +		return nil, fmt.Errorf("can't find package %q", spec.pkg)
    +	}
    +	spec.pkg = bp.ImportPath
    +
    +	if !isValidIdentifier(spec.fromName) {
    +		return nil, fmt.Errorf("-from: invalid identifier %q", spec.fromName)
    +	}
    +
    +	if Verbose {
    +		log.Printf("-from spec: %+v", spec)
    +	}
    +
    +	return &spec, nil
    +}
    +
    +// parseObjectSpec parses main as one of the non-filename forms of
    +// object specification.
    +func parseObjectSpec(spec *spec, main string) error {
    +	// Parse main as a Go expression, albeit a strange one.
    +	e, _ := parser.ParseExpr(main)
    +
    +	if pkg := parseImportPath(e); pkg != "" {
    +		// e.g. bytes or "encoding/json": a package
    +		spec.pkg = pkg
    +		if spec.searchFor == "" {
    +			return fmt.Errorf("-from %q: package import path %q must have a ::name suffix",
    +				main, main)
    +		}
    +		return nil
    +	}
    +
    +	if e, ok := e.(*ast.SelectorExpr); ok {
    +		x := unparen(e.X)
    +
    +		// Strip off star constructor, if any.
    +		if star, ok := x.(*ast.StarExpr); ok {
    +			x = star.X
    +		}
    +
    +		if pkg := parseImportPath(x); pkg != "" {
    +			// package member e.g. "encoding/json".HTMLEscape
    +			spec.pkg = pkg              // e.g. "encoding/json"
    +			spec.pkgMember = e.Sel.Name // e.g. "HTMLEscape"
    +			spec.fromName = e.Sel.Name
    +			return nil
    +		}
    +
    +		if x, ok := x.(*ast.SelectorExpr); ok {
    +			// field/method of type e.g. ("encoding/json".Decoder).Decode
    +			y := unparen(x.X)
    +			if pkg := parseImportPath(y); pkg != "" {
    +				spec.pkg = pkg               // e.g. "encoding/json"
    +				spec.pkgMember = x.Sel.Name  // e.g. "Decoder"
    +				spec.typeMember = e.Sel.Name // e.g. "Decode"
    +				spec.fromName = e.Sel.Name
    +				return nil
    +			}
    +		}
    +	}
    +
    +	return fmt.Errorf("-from %q: invalid expression", main)
    +}
    +
    +// parseImportPath returns the import path of the package denoted by e.
    +// Any import path may be represented as a string literal;
    +// single-segment import paths (e.g. "bytes") may also be represented as
    +// ast.Ident.  parseImportPath returns "" for all other expressions.
    +func parseImportPath(e ast.Expr) string {
    +	switch e := e.(type) {
    +	case *ast.Ident:
    +		return e.Name // e.g. bytes
    +
    +	case *ast.BasicLit:
    +		if e.Kind == token.STRING {
    +			pkgname, _ := strconv.Unquote(e.Value)
    +			return pkgname // e.g. "encoding/json"
    +		}
    +	}
    +	return ""
    +}
    +
    +// parseOffsetFlag interprets the "-offset" flag value as a renaming specification.
    +func parseOffsetFlag(ctxt *build.Context, offsetFlag string) (*spec, error) {
    +	var spec spec
    +	// Validate -offset, e.g. file.go:#123
    +	parts := strings.Split(offsetFlag, ":#")
    +	if len(parts) != 2 {
    +		return nil, fmt.Errorf("-offset %q: invalid offset specification", offsetFlag)
    +	}
    +
    +	spec.filename = parts[0]
    +	if !buildutil.FileExists(ctxt, spec.filename) {
    +		return nil, fmt.Errorf("no such file: %s", spec.filename)
    +	}
    +
    +	bp, err := buildutil.ContainingPackage(ctxt, wd, spec.filename)
    +	if err != nil {
    +		return nil, err
    +	}
    +	spec.pkg = bp.ImportPath
    +
    +	for _, r := range parts[1] {
    +		if !isDigit(r) {
    +			return nil, fmt.Errorf("-offset %q: non-numeric offset", offsetFlag)
    +		}
    +	}
    +	spec.offset, err = strconv.Atoi(parts[1])
    +	if err != nil {
    +		return nil, fmt.Errorf("-offset %q: non-numeric offset", offsetFlag)
    +	}
    +
    +	// Parse the file and check there's an identifier at that offset.
    +	fset := token.NewFileSet()
    +	f, err := buildutil.ParseFile(fset, ctxt, nil, wd, spec.filename, parser.ParseComments)
    +	if err != nil {
    +		return nil, fmt.Errorf("-offset %q: cannot parse file: %s", offsetFlag, err)
    +	}
    +
    +	id := identAtOffset(fset, f, spec.offset)
    +	if id == nil {
    +		return nil, fmt.Errorf("-offset %q: no identifier at this position", offsetFlag)
    +	}
    +
    +	spec.fromName = id.Name
    +
    +	return &spec, nil
    +}
    +
    +var wd = func() string {
    +	wd, err := os.Getwd()
    +	if err != nil {
    +		panic("cannot get working directory: " + err.Error())
    +	}
    +	return wd
    +}()
    +
    +// For source trees built with 'go build', the -from or -offset
    +// spec identifies exactly one initial 'from' object to rename ,
    +// but certain proprietary build systems allow a single file to
    +// appear in multiple packages (e.g. the test package contains a
    +// copy of its library), so there may be multiple objects for
    +// the same source entity.
    +
    +func findFromObjects(iprog *loader.Program, spec *spec) ([]types.Object, error) {
    +	if spec.filename != "" {
    +		return findFromObjectsInFile(iprog, spec)
    +	}
    +
    +	// Search for objects defined in specified package.
    +
    +	// TODO(adonovan): the iprog.ImportMap has an entry {"main": ...}
    +	// for main packages, even though that's not an import path.
    +	// Seems like a bug.
    +	//
    +	// pkg := iprog.ImportMap[spec.pkg]
    +	// if pkg == nil {
    +	// 	return fmt.Errorf("cannot find package %s", spec.pkg) // can't happen?
    +	// }
    +	// info := iprog.AllPackages[pkg]
    +
    +	// Workaround: lookup by value.
    +	var info *loader.PackageInfo
    +	var pkg *types.Package
    +	for pkg, info = range iprog.AllPackages {
    +		if pkg.Path() == spec.pkg {
    +			break
    +		}
    +	}
    +	if info == nil {
    +		return nil, fmt.Errorf("package %q was not loaded", spec.pkg)
    +	}
    +
    +	objects, err := findObjects(info, spec)
    +	if err != nil {
    +		return nil, err
    +	}
    +	if len(objects) > 1 {
    +		// ambiguous "*" scope query
    +		return nil, ambiguityError(iprog.Fset, objects)
    +	}
    +	return objects, nil
    +}
    +
    +func findFromObjectsInFile(iprog *loader.Program, spec *spec) ([]types.Object, error) {
    +	var fromObjects []types.Object
    +	for _, info := range iprog.AllPackages {
    +		// restrict to specified filename
    +		// NB: under certain proprietary build systems, a given
    +		// filename may appear in multiple packages.
    +		for _, f := range info.Files {
    +			thisFile := iprog.Fset.File(f.Pos())
    +			if !sameFile(thisFile.Name(), spec.filename) {
    +				continue
    +			}
    +			// This package contains the query file.
    +
    +			if spec.offset != 0 {
    +				// Search for a specific ident by file/offset.
    +				id := identAtOffset(iprog.Fset, f, spec.offset)
    +				if id == nil {
    +					// can't happen?
    +					return nil, fmt.Errorf("identifier not found")
    +				}
    +				obj := info.Uses[id]
    +				if obj == nil {
    +					obj = info.Defs[id]
    +					if obj == nil {
    +						// Ident without Object.
    +
    +						// Package clause?
    +						pos := thisFile.Pos(spec.offset)
    +						_, path, _ := iprog.PathEnclosingInterval(pos, pos)
    +						if len(path) == 2 { // [Ident File]
    +							// TODO(adonovan): support this case.
    +							return nil, fmt.Errorf("cannot rename %q: renaming package clauses is not yet supported",
    +								path[1].(*ast.File).Name.Name)
    +						}
    +
    +						// Implicit y in "switch y := x.(type) {"?
    +						if obj := typeSwitchVar(&info.Info, path); obj != nil {
    +							return []types.Object{obj}, nil
    +						}
    +
    +						// Probably a type error.
    +						return nil, fmt.Errorf("cannot find object for %q", id.Name)
    +					}
    +				}
    +				if obj.Pkg() == nil {
    +					return nil, fmt.Errorf("cannot rename predeclared identifiers (%s)", obj)
    +
    +				}
    +
    +				fromObjects = append(fromObjects, obj)
    +			} else {
    +				// do a package-wide query
    +				objects, err := findObjects(info, spec)
    +				if err != nil {
    +					return nil, err
    +				}
    +
    +				// filter results: only objects defined in thisFile
    +				var filtered []types.Object
    +				for _, obj := range objects {
    +					if iprog.Fset.File(obj.Pos()) == thisFile {
    +						filtered = append(filtered, obj)
    +					}
    +				}
    +				if len(filtered) == 0 {
    +					return nil, fmt.Errorf("no object %q declared in file %s",
    +						spec.fromName, spec.filename)
    +				} else if len(filtered) > 1 {
    +					return nil, ambiguityError(iprog.Fset, filtered)
    +				}
    +				fromObjects = append(fromObjects, filtered[0])
    +			}
    +			break
    +		}
    +	}
    +	if len(fromObjects) == 0 {
    +		// can't happen?
    +		return nil, fmt.Errorf("file %s was not part of the loaded program", spec.filename)
    +	}
    +	return fromObjects, nil
    +}
    +
    +func typeSwitchVar(info *types.Info, path []ast.Node) types.Object {
    +	if len(path) > 3 {
    +		// [Ident AssignStmt TypeSwitchStmt...]
    +		if sw, ok := path[2].(*ast.TypeSwitchStmt); ok {
    +			// choose the first case.
    +			if len(sw.Body.List) > 0 {
    +				obj := info.Implicits[sw.Body.List[0].(*ast.CaseClause)]
    +				if obj != nil {
    +					return obj
    +				}
    +			}
    +		}
    +	}
    +	return nil
    +}
    +
    +// On success, findObjects returns the list of objects named
    +// spec.fromName matching the spec.  On success, the result has exactly
    +// one element unless spec.searchFor!="", in which case it has at least one
    +// element.
    +//
    +func findObjects(info *loader.PackageInfo, spec *spec) ([]types.Object, error) {
    +	if spec.pkgMember == "" {
    +		if spec.searchFor == "" {
    +			panic(spec)
    +		}
    +		objects := searchDefs(&info.Info, spec.searchFor)
    +		if objects == nil {
    +			return nil, fmt.Errorf("no object %q declared in package %q",
    +				spec.searchFor, info.Pkg.Path())
    +		}
    +		return objects, nil
    +	}
    +
    +	pkgMember := info.Pkg.Scope().Lookup(spec.pkgMember)
    +	if pkgMember == nil {
    +		return nil, fmt.Errorf("package %q has no member %q",
    +			info.Pkg.Path(), spec.pkgMember)
    +	}
    +
    +	var searchFunc *types.Func
    +	if spec.typeMember == "" {
    +		// package member
    +		if spec.searchFor == "" {
    +			return []types.Object{pkgMember}, nil
    +		}
    +
    +		// Search within pkgMember, which must be a function.
    +		searchFunc, _ = pkgMember.(*types.Func)
    +		if searchFunc == nil {
    +			return nil, fmt.Errorf("cannot search for %q within %s %q",
    +				spec.searchFor, objectKind(pkgMember), pkgMember)
    +		}
    +	} else {
    +		// field/method of type
    +		// e.g. (encoding/json.Decoder).Decode
    +		// or ::x within it.
    +
    +		tName, _ := pkgMember.(*types.TypeName)
    +		if tName == nil {
    +			return nil, fmt.Errorf("%s.%s is a %s, not a type",
    +				info.Pkg.Path(), pkgMember.Name(), objectKind(pkgMember))
    +		}
    +
    +		// search within named type.
    +		obj, _, _ := types.LookupFieldOrMethod(tName.Type(), true, info.Pkg, spec.typeMember)
    +		if obj == nil {
    +			return nil, fmt.Errorf("cannot find field or method %q of %s %s.%s",
    +				spec.typeMember, typeKind(tName.Type()), info.Pkg.Path(), tName.Name())
    +		}
    +
    +		if spec.searchFor == "" {
    +			// If it is an embedded field, return the type of the field.
    +			if v, ok := obj.(*types.Var); ok && v.Anonymous() {
    +				switch t := v.Type().(type) {
    +				case *types.Pointer:
    +					return []types.Object{t.Elem().(*types.Named).Obj()}, nil
    +				case *types.Named:
    +					return []types.Object{t.Obj()}, nil
    +				}
    +			}
    +			return []types.Object{obj}, nil
    +		}
    +
    +		searchFunc, _ = obj.(*types.Func)
    +		if searchFunc == nil {
    +			return nil, fmt.Errorf("cannot search for local name %q within %s (%s.%s).%s; need a function",
    +				spec.searchFor, objectKind(obj), info.Pkg.Path(), tName.Name(),
    +				obj.Name())
    +		}
    +		if isInterface(tName.Type()) {
    +			return nil, fmt.Errorf("cannot search for local name %q within abstract method (%s.%s).%s",
    +				spec.searchFor, info.Pkg.Path(), tName.Name(), searchFunc.Name())
    +		}
    +	}
    +
    +	// -- search within function or method --
    +
    +	decl := funcDecl(info, searchFunc)
    +	if decl == nil {
    +		return nil, fmt.Errorf("cannot find syntax for %s", searchFunc) // can't happen?
    +	}
    +
    +	var objects []types.Object
    +	for _, obj := range searchDefs(&info.Info, spec.searchFor) {
    +		// We use positions, not scopes, to determine whether
    +		// the obj is within searchFunc.  This is clumsy, but the
    +		// alternative, using the types.Scope tree, doesn't
    +		// account for non-lexical objects like fields and
    +		// interface methods.
    +		if decl.Pos() <= obj.Pos() && obj.Pos() < decl.End() && obj != searchFunc {
    +			objects = append(objects, obj)
    +		}
    +	}
    +	if objects == nil {
    +		return nil, fmt.Errorf("no local definition of %q within %s",
    +			spec.searchFor, searchFunc)
    +	}
    +	return objects, nil
    +}
    +
    +func funcDecl(info *loader.PackageInfo, fn *types.Func) *ast.FuncDecl {
    +	for _, f := range info.Files {
    +		for _, d := range f.Decls {
    +			if d, ok := d.(*ast.FuncDecl); ok && info.Defs[d.Name] == fn {
    +				return d
    +			}
    +		}
    +	}
    +	return nil
    +}
    +
    +func searchDefs(info *types.Info, name string) []types.Object {
    +	var objects []types.Object
    +	for id, obj := range info.Defs {
    +		if obj == nil {
    +			// e.g. blank ident.
    +			// TODO(adonovan): but also implicit y in
    +			//    switch y := x.(type)
    +			// Needs some thought.
    +			continue
    +		}
    +		if id.Name == name {
    +			objects = append(objects, obj)
    +		}
    +	}
    +	return objects
    +}
    +
    +func identAtOffset(fset *token.FileSet, f *ast.File, offset int) *ast.Ident {
    +	var found *ast.Ident
    +	ast.Inspect(f, func(n ast.Node) bool {
    +		if id, ok := n.(*ast.Ident); ok {
    +			idpos := fset.Position(id.Pos()).Offset
    +			if idpos <= offset && offset < idpos+len(id.Name) {
    +				found = id
    +			}
    +		}
    +		return found == nil // keep traversing only until found
    +	})
    +	return found
    +}
    +
    +// ambiguityError returns an error describing an ambiguous "*" scope query.
    +func ambiguityError(fset *token.FileSet, objects []types.Object) error {
    +	var buf bytes.Buffer
    +	for i, obj := range objects {
    +		if i > 0 {
    +			buf.WriteString(", ")
    +		}
    +		posn := fset.Position(obj.Pos())
    +		fmt.Fprintf(&buf, "%s at %s:%d",
    +			objectKind(obj), filepath.Base(posn.Filename), posn.Column)
    +	}
    +	return fmt.Errorf("ambiguous specifier %s matches %s",
    +		objects[0].Name(), buf.String())
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/rename/spec14.go b/vendor/golang.org/x/tools/refactor/rename/spec14.go
    new file mode 100644
    index 0000000000..7634ae8fb0
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/rename/spec14.go
    @@ -0,0 +1,568 @@
    +// 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 !go1.5
    +
    +package rename
    +
    +// This file contains logic related to specifying a renaming: parsing of
    +// the flags as a form of query, and finding the object(s) it denotes.
    +// See Usage for flag details.
    +
    +import (
    +	"bytes"
    +	"fmt"
    +	"go/ast"
    +	"go/build"
    +	"go/parser"
    +	"go/token"
    +	"log"
    +	"os"
    +	"path/filepath"
    +	"strconv"
    +	"strings"
    +
    +	"golang.org/x/tools/go/buildutil"
    +	"golang.org/x/tools/go/loader"
    +	"golang.org/x/tools/go/types"
    +)
    +
    +// A spec specifies an entity to rename.
    +//
    +// It is populated from an -offset flag or -from query;
    +// see Usage for the allowed -from query forms.
    +//
    +type spec struct {
    +	// pkg is the package containing the position
    +	// specified by the -from or -offset flag.
    +	// If filename == "", our search for the 'from' entity
    +	// is restricted to this package.
    +	pkg string
    +
    +	// The original name of the entity being renamed.
    +	// If the query had a ::from component, this is that;
    +	// otherwise it's the last segment, e.g.
    +	//   (encoding/json.Decoder).from
    +	//   encoding/json.from
    +	fromName string
    +
    +	// -- The remaining fields are private to this file.  All are optional. --
    +
    +	// The query's ::x suffix, if any.
    +	searchFor string
    +
    +	// e.g. "Decoder" in "(encoding/json.Decoder).fieldOrMethod"
    +	//                or "encoding/json.Decoder
    +	pkgMember string
    +
    +	// e.g. fieldOrMethod in "(encoding/json.Decoder).fieldOrMethod"
    +	typeMember string
    +
    +	// Restricts the query to this file.
    +	// Implied by -from="file.go::x" and -offset flags.
    +	filename string
    +
    +	// Byte offset of the 'from' identifier within the file named 'filename'.
    +	// -offset mode only.
    +	offset int
    +}
    +
    +// parseFromFlag interprets the "-from" flag value as a renaming specification.
    +// See Usage in rename.go for valid formats.
    +func parseFromFlag(ctxt *build.Context, fromFlag string) (*spec, error) {
    +	var spec spec
    +	var main string // sans "::x" suffix
    +	switch parts := strings.Split(fromFlag, "::"); len(parts) {
    +	case 1:
    +		main = parts[0]
    +	case 2:
    +		main = parts[0]
    +		spec.searchFor = parts[1]
    +		if parts[1] == "" {
    +			// error
    +		}
    +	default:
    +		return nil, fmt.Errorf("-from %q: invalid identifier specification (see -help for formats)", fromFlag)
    +	}
    +
    +	if strings.HasSuffix(main, ".go") {
    +		// main is "filename.go"
    +		if spec.searchFor == "" {
    +			return nil, fmt.Errorf("-from: filename %q must have a ::name suffix", main)
    +		}
    +		spec.filename = main
    +		if !buildutil.FileExists(ctxt, spec.filename) {
    +			return nil, fmt.Errorf("no such file: %s", spec.filename)
    +		}
    +
    +		bp, err := buildutil.ContainingPackage(ctxt, wd, spec.filename)
    +		if err != nil {
    +			return nil, err
    +		}
    +		spec.pkg = bp.ImportPath
    +
    +	} else {
    +		// main is one of:
    +		//  "importpath"
    +		//  "importpath".member
    +		//  (*"importpath".type).fieldormethod           (parens and star optional)
    +		if err := parseObjectSpec(&spec, main); err != nil {
    +			return nil, err
    +		}
    +	}
    +
    +	if spec.searchFor != "" {
    +		spec.fromName = spec.searchFor
    +	}
    +
    +	cwd, err := os.Getwd()
    +	if err != nil {
    +		return nil, err
    +	}
    +
    +	// Sanitize the package.
    +	bp, err := ctxt.Import(spec.pkg, cwd, build.FindOnly)
    +	if err != nil {
    +		return nil, fmt.Errorf("can't find package %q", spec.pkg)
    +	}
    +	spec.pkg = bp.ImportPath
    +
    +	if !isValidIdentifier(spec.fromName) {
    +		return nil, fmt.Errorf("-from: invalid identifier %q", spec.fromName)
    +	}
    +
    +	if Verbose {
    +		log.Printf("-from spec: %+v", spec)
    +	}
    +
    +	return &spec, nil
    +}
    +
    +// parseObjectSpec parses main as one of the non-filename forms of
    +// object specification.
    +func parseObjectSpec(spec *spec, main string) error {
    +	// Parse main as a Go expression, albeit a strange one.
    +	e, _ := parser.ParseExpr(main)
    +
    +	if pkg := parseImportPath(e); pkg != "" {
    +		// e.g. bytes or "encoding/json": a package
    +		spec.pkg = pkg
    +		if spec.searchFor == "" {
    +			return fmt.Errorf("-from %q: package import path %q must have a ::name suffix",
    +				main, main)
    +		}
    +		return nil
    +	}
    +
    +	if e, ok := e.(*ast.SelectorExpr); ok {
    +		x := unparen(e.X)
    +
    +		// Strip off star constructor, if any.
    +		if star, ok := x.(*ast.StarExpr); ok {
    +			x = star.X
    +		}
    +
    +		if pkg := parseImportPath(x); pkg != "" {
    +			// package member e.g. "encoding/json".HTMLEscape
    +			spec.pkg = pkg              // e.g. "encoding/json"
    +			spec.pkgMember = e.Sel.Name // e.g. "HTMLEscape"
    +			spec.fromName = e.Sel.Name
    +			return nil
    +		}
    +
    +		if x, ok := x.(*ast.SelectorExpr); ok {
    +			// field/method of type e.g. ("encoding/json".Decoder).Decode
    +			y := unparen(x.X)
    +			if pkg := parseImportPath(y); pkg != "" {
    +				spec.pkg = pkg               // e.g. "encoding/json"
    +				spec.pkgMember = x.Sel.Name  // e.g. "Decoder"
    +				spec.typeMember = e.Sel.Name // e.g. "Decode"
    +				spec.fromName = e.Sel.Name
    +				return nil
    +			}
    +		}
    +	}
    +
    +	return fmt.Errorf("-from %q: invalid expression", main)
    +}
    +
    +// parseImportPath returns the import path of the package denoted by e.
    +// Any import path may be represented as a string literal;
    +// single-segment import paths (e.g. "bytes") may also be represented as
    +// ast.Ident.  parseImportPath returns "" for all other expressions.
    +func parseImportPath(e ast.Expr) string {
    +	switch e := e.(type) {
    +	case *ast.Ident:
    +		return e.Name // e.g. bytes
    +
    +	case *ast.BasicLit:
    +		if e.Kind == token.STRING {
    +			pkgname, _ := strconv.Unquote(e.Value)
    +			return pkgname // e.g. "encoding/json"
    +		}
    +	}
    +	return ""
    +}
    +
    +// parseOffsetFlag interprets the "-offset" flag value as a renaming specification.
    +func parseOffsetFlag(ctxt *build.Context, offsetFlag string) (*spec, error) {
    +	var spec spec
    +	// Validate -offset, e.g. file.go:#123
    +	parts := strings.Split(offsetFlag, ":#")
    +	if len(parts) != 2 {
    +		return nil, fmt.Errorf("-offset %q: invalid offset specification", offsetFlag)
    +	}
    +
    +	spec.filename = parts[0]
    +	if !buildutil.FileExists(ctxt, spec.filename) {
    +		return nil, fmt.Errorf("no such file: %s", spec.filename)
    +	}
    +
    +	bp, err := buildutil.ContainingPackage(ctxt, wd, spec.filename)
    +	if err != nil {
    +		return nil, err
    +	}
    +	spec.pkg = bp.ImportPath
    +
    +	for _, r := range parts[1] {
    +		if !isDigit(r) {
    +			return nil, fmt.Errorf("-offset %q: non-numeric offset", offsetFlag)
    +		}
    +	}
    +	spec.offset, err = strconv.Atoi(parts[1])
    +	if err != nil {
    +		return nil, fmt.Errorf("-offset %q: non-numeric offset", offsetFlag)
    +	}
    +
    +	// Parse the file and check there's an identifier at that offset.
    +	fset := token.NewFileSet()
    +	f, err := buildutil.ParseFile(fset, ctxt, nil, wd, spec.filename, parser.ParseComments)
    +	if err != nil {
    +		return nil, fmt.Errorf("-offset %q: cannot parse file: %s", offsetFlag, err)
    +	}
    +
    +	id := identAtOffset(fset, f, spec.offset)
    +	if id == nil {
    +		return nil, fmt.Errorf("-offset %q: no identifier at this position", offsetFlag)
    +	}
    +
    +	spec.fromName = id.Name
    +
    +	return &spec, nil
    +}
    +
    +var wd = func() string {
    +	wd, err := os.Getwd()
    +	if err != nil {
    +		panic("cannot get working directory: " + err.Error())
    +	}
    +	return wd
    +}()
    +
    +// For source trees built with 'go build', the -from or -offset
    +// spec identifies exactly one initial 'from' object to rename ,
    +// but certain proprietary build systems allow a single file to
    +// appear in multiple packages (e.g. the test package contains a
    +// copy of its library), so there may be multiple objects for
    +// the same source entity.
    +
    +func findFromObjects(iprog *loader.Program, spec *spec) ([]types.Object, error) {
    +	if spec.filename != "" {
    +		return findFromObjectsInFile(iprog, spec)
    +	}
    +
    +	// Search for objects defined in specified package.
    +
    +	// TODO(adonovan): the iprog.ImportMap has an entry {"main": ...}
    +	// for main packages, even though that's not an import path.
    +	// Seems like a bug.
    +	//
    +	// pkg := iprog.ImportMap[spec.pkg]
    +	// if pkg == nil {
    +	// 	return fmt.Errorf("cannot find package %s", spec.pkg) // can't happen?
    +	// }
    +	// info := iprog.AllPackages[pkg]
    +
    +	// Workaround: lookup by value.
    +	var info *loader.PackageInfo
    +	var pkg *types.Package
    +	for pkg, info = range iprog.AllPackages {
    +		if pkg.Path() == spec.pkg {
    +			break
    +		}
    +	}
    +	if info == nil {
    +		return nil, fmt.Errorf("package %q was not loaded", spec.pkg)
    +	}
    +
    +	objects, err := findObjects(info, spec)
    +	if err != nil {
    +		return nil, err
    +	}
    +	if len(objects) > 1 {
    +		// ambiguous "*" scope query
    +		return nil, ambiguityError(iprog.Fset, objects)
    +	}
    +	return objects, nil
    +}
    +
    +func findFromObjectsInFile(iprog *loader.Program, spec *spec) ([]types.Object, error) {
    +	var fromObjects []types.Object
    +	for _, info := range iprog.AllPackages {
    +		// restrict to specified filename
    +		// NB: under certain proprietary build systems, a given
    +		// filename may appear in multiple packages.
    +		for _, f := range info.Files {
    +			thisFile := iprog.Fset.File(f.Pos())
    +			if !sameFile(thisFile.Name(), spec.filename) {
    +				continue
    +			}
    +			// This package contains the query file.
    +
    +			if spec.offset != 0 {
    +				// Search for a specific ident by file/offset.
    +				id := identAtOffset(iprog.Fset, f, spec.offset)
    +				if id == nil {
    +					// can't happen?
    +					return nil, fmt.Errorf("identifier not found")
    +				}
    +				obj := info.Uses[id]
    +				if obj == nil {
    +					obj = info.Defs[id]
    +					if obj == nil {
    +						// Ident without Object.
    +
    +						// Package clause?
    +						pos := thisFile.Pos(spec.offset)
    +						_, path, _ := iprog.PathEnclosingInterval(pos, pos)
    +						if len(path) == 2 { // [Ident File]
    +							// TODO(adonovan): support this case.
    +							return nil, fmt.Errorf("cannot rename %q: renaming package clauses is not yet supported",
    +								path[1].(*ast.File).Name.Name)
    +						}
    +
    +						// Implicit y in "switch y := x.(type) {"?
    +						if obj := typeSwitchVar(&info.Info, path); obj != nil {
    +							return []types.Object{obj}, nil
    +						}
    +
    +						// Probably a type error.
    +						return nil, fmt.Errorf("cannot find object for %q", id.Name)
    +					}
    +				}
    +				if obj.Pkg() == nil {
    +					return nil, fmt.Errorf("cannot rename predeclared identifiers (%s)", obj)
    +
    +				}
    +
    +				fromObjects = append(fromObjects, obj)
    +			} else {
    +				// do a package-wide query
    +				objects, err := findObjects(info, spec)
    +				if err != nil {
    +					return nil, err
    +				}
    +
    +				// filter results: only objects defined in thisFile
    +				var filtered []types.Object
    +				for _, obj := range objects {
    +					if iprog.Fset.File(obj.Pos()) == thisFile {
    +						filtered = append(filtered, obj)
    +					}
    +				}
    +				if len(filtered) == 0 {
    +					return nil, fmt.Errorf("no object %q declared in file %s",
    +						spec.fromName, spec.filename)
    +				} else if len(filtered) > 1 {
    +					return nil, ambiguityError(iprog.Fset, filtered)
    +				}
    +				fromObjects = append(fromObjects, filtered[0])
    +			}
    +			break
    +		}
    +	}
    +	if len(fromObjects) == 0 {
    +		// can't happen?
    +		return nil, fmt.Errorf("file %s was not part of the loaded program", spec.filename)
    +	}
    +	return fromObjects, nil
    +}
    +
    +func typeSwitchVar(info *types.Info, path []ast.Node) types.Object {
    +	if len(path) > 3 {
    +		// [Ident AssignStmt TypeSwitchStmt...]
    +		if sw, ok := path[2].(*ast.TypeSwitchStmt); ok {
    +			// choose the first case.
    +			if len(sw.Body.List) > 0 {
    +				obj := info.Implicits[sw.Body.List[0].(*ast.CaseClause)]
    +				if obj != nil {
    +					return obj
    +				}
    +			}
    +		}
    +	}
    +	return nil
    +}
    +
    +// On success, findObjects returns the list of objects named
    +// spec.fromName matching the spec.  On success, the result has exactly
    +// one element unless spec.searchFor!="", in which case it has at least one
    +// element.
    +//
    +func findObjects(info *loader.PackageInfo, spec *spec) ([]types.Object, error) {
    +	if spec.pkgMember == "" {
    +		if spec.searchFor == "" {
    +			panic(spec)
    +		}
    +		objects := searchDefs(&info.Info, spec.searchFor)
    +		if objects == nil {
    +			return nil, fmt.Errorf("no object %q declared in package %q",
    +				spec.searchFor, info.Pkg.Path())
    +		}
    +		return objects, nil
    +	}
    +
    +	pkgMember := info.Pkg.Scope().Lookup(spec.pkgMember)
    +	if pkgMember == nil {
    +		return nil, fmt.Errorf("package %q has no member %q",
    +			info.Pkg.Path(), spec.pkgMember)
    +	}
    +
    +	var searchFunc *types.Func
    +	if spec.typeMember == "" {
    +		// package member
    +		if spec.searchFor == "" {
    +			return []types.Object{pkgMember}, nil
    +		}
    +
    +		// Search within pkgMember, which must be a function.
    +		searchFunc, _ = pkgMember.(*types.Func)
    +		if searchFunc == nil {
    +			return nil, fmt.Errorf("cannot search for %q within %s %q",
    +				spec.searchFor, objectKind(pkgMember), pkgMember)
    +		}
    +	} else {
    +		// field/method of type
    +		// e.g. (encoding/json.Decoder).Decode
    +		// or ::x within it.
    +
    +		tName, _ := pkgMember.(*types.TypeName)
    +		if tName == nil {
    +			return nil, fmt.Errorf("%s.%s is a %s, not a type",
    +				info.Pkg.Path(), pkgMember.Name(), objectKind(pkgMember))
    +		}
    +
    +		// search within named type.
    +		obj, _, _ := types.LookupFieldOrMethod(tName.Type(), true, info.Pkg, spec.typeMember)
    +		if obj == nil {
    +			return nil, fmt.Errorf("cannot find field or method %q of %s %s.%s",
    +				spec.typeMember, typeKind(tName.Type()), info.Pkg.Path(), tName.Name())
    +		}
    +
    +		if spec.searchFor == "" {
    +			// If it is an embedded field, return the type of the field.
    +			if v, ok := obj.(*types.Var); ok && v.Anonymous() {
    +				switch t := v.Type().(type) {
    +				case *types.Pointer:
    +					return []types.Object{t.Elem().(*types.Named).Obj()}, nil
    +				case *types.Named:
    +					return []types.Object{t.Obj()}, nil
    +				}
    +			}
    +			return []types.Object{obj}, nil
    +		}
    +
    +		searchFunc, _ = obj.(*types.Func)
    +		if searchFunc == nil {
    +			return nil, fmt.Errorf("cannot search for local name %q within %s (%s.%s).%s; need a function",
    +				spec.searchFor, objectKind(obj), info.Pkg.Path(), tName.Name(),
    +				obj.Name())
    +		}
    +		if isInterface(tName.Type()) {
    +			return nil, fmt.Errorf("cannot search for local name %q within abstract method (%s.%s).%s",
    +				spec.searchFor, info.Pkg.Path(), tName.Name(), searchFunc.Name())
    +		}
    +	}
    +
    +	// -- search within function or method --
    +
    +	decl := funcDecl(info, searchFunc)
    +	if decl == nil {
    +		return nil, fmt.Errorf("cannot find syntax for %s", searchFunc) // can't happen?
    +	}
    +
    +	var objects []types.Object
    +	for _, obj := range searchDefs(&info.Info, spec.searchFor) {
    +		// We use positions, not scopes, to determine whether
    +		// the obj is within searchFunc.  This is clumsy, but the
    +		// alternative, using the types.Scope tree, doesn't
    +		// account for non-lexical objects like fields and
    +		// interface methods.
    +		if decl.Pos() <= obj.Pos() && obj.Pos() < decl.End() && obj != searchFunc {
    +			objects = append(objects, obj)
    +		}
    +	}
    +	if objects == nil {
    +		return nil, fmt.Errorf("no local definition of %q within %s",
    +			spec.searchFor, searchFunc)
    +	}
    +	return objects, nil
    +}
    +
    +func funcDecl(info *loader.PackageInfo, fn *types.Func) *ast.FuncDecl {
    +	for _, f := range info.Files {
    +		for _, d := range f.Decls {
    +			if d, ok := d.(*ast.FuncDecl); ok && info.Defs[d.Name] == fn {
    +				return d
    +			}
    +		}
    +	}
    +	return nil
    +}
    +
    +func searchDefs(info *types.Info, name string) []types.Object {
    +	var objects []types.Object
    +	for id, obj := range info.Defs {
    +		if obj == nil {
    +			// e.g. blank ident.
    +			// TODO(adonovan): but also implicit y in
    +			//    switch y := x.(type)
    +			// Needs some thought.
    +			continue
    +		}
    +		if id.Name == name {
    +			objects = append(objects, obj)
    +		}
    +	}
    +	return objects
    +}
    +
    +func identAtOffset(fset *token.FileSet, f *ast.File, offset int) *ast.Ident {
    +	var found *ast.Ident
    +	ast.Inspect(f, func(n ast.Node) bool {
    +		if id, ok := n.(*ast.Ident); ok {
    +			idpos := fset.Position(id.Pos()).Offset
    +			if idpos <= offset && offset < idpos+len(id.Name) {
    +				found = id
    +			}
    +		}
    +		return found == nil // keep traversing only until found
    +	})
    +	return found
    +}
    +
    +// ambiguityError returns an error describing an ambiguous "*" scope query.
    +func ambiguityError(fset *token.FileSet, objects []types.Object) error {
    +	var buf bytes.Buffer
    +	for i, obj := range objects {
    +		if i > 0 {
    +			buf.WriteString(", ")
    +		}
    +		posn := fset.Position(obj.Pos())
    +		fmt.Fprintf(&buf, "%s at %s:%d",
    +			objectKind(obj), filepath.Base(posn.Filename), posn.Column)
    +	}
    +	return fmt.Errorf("ambiguous specifier %s matches %s",
    +		objects[0].Name(), buf.String())
    +}
    diff --git a/vendor/golang.org/x/tools/refactor/rename/util.go b/vendor/golang.org/x/tools/refactor/rename/util.go
    new file mode 100644
    index 0000000000..f0f80f03a7
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/rename/util.go
    @@ -0,0 +1,106 @@
    +// 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 go1.5
    +
    +package rename
    +
    +import (
    +	"go/ast"
    +	"go/types"
    +	"os"
    +	"path/filepath"
    +	"reflect"
    +	"runtime"
    +	"strings"
    +	"unicode"
    +
    +	"golang.org/x/tools/go/ast/astutil"
    +)
    +
    +func objectKind(obj types.Object) string {
    +	switch obj := obj.(type) {
    +	case *types.PkgName:
    +		return "imported package name"
    +	case *types.TypeName:
    +		return "type"
    +	case *types.Var:
    +		if obj.IsField() {
    +			return "field"
    +		}
    +	case *types.Func:
    +		if obj.Type().(*types.Signature).Recv() != nil {
    +			return "method"
    +		}
    +	}
    +	// label, func, var, const
    +	return strings.ToLower(strings.TrimPrefix(reflect.TypeOf(obj).String(), "*types."))
    +}
    +
    +func typeKind(T types.Type) string {
    +	return strings.ToLower(strings.TrimPrefix(reflect.TypeOf(T.Underlying()).String(), "*types."))
    +}
    +
    +// NB: for renamings, blank is not considered valid.
    +func isValidIdentifier(id string) bool {
    +	if id == "" || id == "_" {
    +		return false
    +	}
    +	for i, r := range id {
    +		if !isLetter(r) && (i == 0 || !isDigit(r)) {
    +			return false
    +		}
    +	}
    +	return true
    +}
    +
    +// isLocal reports whether obj is local to some function.
    +// Precondition: not a struct field or interface method.
    +func isLocal(obj types.Object) bool {
    +	// [... 5=stmt 4=func 3=file 2=pkg 1=universe]
    +	var depth int
    +	for scope := obj.Parent(); scope != nil; scope = scope.Parent() {
    +		depth++
    +	}
    +	return depth >= 4
    +}
    +
    +func isPackageLevel(obj types.Object) bool {
    +	return obj.Pkg().Scope().Lookup(obj.Name()) == obj
    +}
    +
    +// -- Plundered from go/scanner: ---------------------------------------
    +
    +func isLetter(ch rune) bool {
    +	return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch)
    +}
    +
    +func isDigit(ch rune) bool {
    +	return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch)
    +}
    +
    +// -- Plundered from golang.org/x/tools/oracle -----------------
    +
    +// sameFile returns true if x and y have the same basename and denote
    +// the same file.
    +//
    +func sameFile(x, y string) bool {
    +	if runtime.GOOS == "windows" {
    +		x = filepath.ToSlash(x)
    +		y = filepath.ToSlash(y)
    +	}
    +	if x == y {
    +		return true
    +	}
    +	if filepath.Base(x) == filepath.Base(y) { // (optimisation)
    +		if xi, err := os.Stat(x); err == nil {
    +			if yi, err := os.Stat(y); err == nil {
    +				return os.SameFile(xi, yi)
    +			}
    +		}
    +	}
    +	return false
    +}
    +
    +func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) }
    diff --git a/vendor/golang.org/x/tools/refactor/rename/util14.go b/vendor/golang.org/x/tools/refactor/rename/util14.go
    new file mode 100644
    index 0000000000..126d3eec13
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/rename/util14.go
    @@ -0,0 +1,106 @@
    +// 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 !go1.5
    +
    +package rename
    +
    +import (
    +	"go/ast"
    +	"os"
    +	"path/filepath"
    +	"reflect"
    +	"runtime"
    +	"strings"
    +	"unicode"
    +
    +	"golang.org/x/tools/go/ast/astutil"
    +	"golang.org/x/tools/go/types"
    +)
    +
    +func objectKind(obj types.Object) string {
    +	switch obj := obj.(type) {
    +	case *types.PkgName:
    +		return "imported package name"
    +	case *types.TypeName:
    +		return "type"
    +	case *types.Var:
    +		if obj.IsField() {
    +			return "field"
    +		}
    +	case *types.Func:
    +		if obj.Type().(*types.Signature).Recv() != nil {
    +			return "method"
    +		}
    +	}
    +	// label, func, var, const
    +	return strings.ToLower(strings.TrimPrefix(reflect.TypeOf(obj).String(), "*types."))
    +}
    +
    +func typeKind(T types.Type) string {
    +	return strings.ToLower(strings.TrimPrefix(reflect.TypeOf(T.Underlying()).String(), "*types."))
    +}
    +
    +// NB: for renamings, blank is not considered valid.
    +func isValidIdentifier(id string) bool {
    +	if id == "" || id == "_" {
    +		return false
    +	}
    +	for i, r := range id {
    +		if !isLetter(r) && (i == 0 || !isDigit(r)) {
    +			return false
    +		}
    +	}
    +	return true
    +}
    +
    +// isLocal reports whether obj is local to some function.
    +// Precondition: not a struct field or interface method.
    +func isLocal(obj types.Object) bool {
    +	// [... 5=stmt 4=func 3=file 2=pkg 1=universe]
    +	var depth int
    +	for scope := obj.Parent(); scope != nil; scope = scope.Parent() {
    +		depth++
    +	}
    +	return depth >= 4
    +}
    +
    +func isPackageLevel(obj types.Object) bool {
    +	return obj.Pkg().Scope().Lookup(obj.Name()) == obj
    +}
    +
    +// -- Plundered from go/scanner: ---------------------------------------
    +
    +func isLetter(ch rune) bool {
    +	return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch)
    +}
    +
    +func isDigit(ch rune) bool {
    +	return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch)
    +}
    +
    +// -- Plundered from golang.org/x/tools/oracle -----------------
    +
    +// sameFile returns true if x and y have the same basename and denote
    +// the same file.
    +//
    +func sameFile(x, y string) bool {
    +	if runtime.GOOS == "windows" {
    +		x = filepath.ToSlash(x)
    +		y = filepath.ToSlash(y)
    +	}
    +	if x == y {
    +		return true
    +	}
    +	if filepath.Base(x) == filepath.Base(y) { // (optimisation)
    +		if xi, err := os.Stat(x); err == nil {
    +			if yi, err := os.Stat(y); err == nil {
    +				return os.SameFile(xi, yi)
    +			}
    +		}
    +	}
    +	return false
    +}
    +
    +func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) }
    diff --git a/vendor/golang.org/x/tools/refactor/satisfy/find.go b/vendor/golang.org/x/tools/refactor/satisfy/find.go
    new file mode 100644
    index 0000000000..a346c1ac72
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/satisfy/find.go
    @@ -0,0 +1,707 @@
    +// 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 go1.5
    +
    +// Package satisfy inspects the type-checked ASTs of Go packages and
    +// reports the set of discovered type constraints of the form (lhs, rhs
    +// Type) where lhs is a non-trivial interface, rhs satisfies this
    +// interface, and this fact is necessary for the package to be
    +// well-typed.
    +//
    +// THIS PACKAGE IS EXPERIMENTAL AND MAY CHANGE AT ANY TIME.
    +//
    +// It is provided only for the gorename tool.  Ideally this
    +// functionality will become part of the type-checker in due course,
    +// since it is computing it anyway, and it is robust for ill-typed
    +// inputs, which this package is not.
    +//
    +package satisfy // import "golang.org/x/tools/refactor/satisfy"
    +
    +// NOTES:
    +//
    +// We don't care about numeric conversions, so we don't descend into
    +// types or constant expressions.  This is unsound because
    +// constant expressions can contain arbitrary statements, e.g.
    +//   const x = len([1]func(){func() {
    +//     ...
    +//   }})
    +//
    +// TODO(adonovan): make this robust against ill-typed input.
    +// Or move it into the type-checker.
    +//
    +// Assignability conversions are possible in the following places:
    +// - in assignments y = x, y := x, var y = x.
    +// - from call argument types to formal parameter types
    +// - in append and delete calls
    +// - from return operands to result parameter types
    +// - in composite literal T{k:v}, from k and v to T's field/element/key type
    +// - in map[key] from key to the map's key type
    +// - in comparisons x==y and switch x { case y: }.
    +// - in explicit conversions T(x)
    +// - in sends ch <- x, from x to the channel element type
    +// - in type assertions x.(T) and switch x.(type) { case T: }
    +//
    +// The results of this pass provide information equivalent to the
    +// ssa.MakeInterface and ssa.ChangeInterface instructions.
    +
    +import (
    +	"fmt"
    +	"go/ast"
    +	"go/token"
    +	"go/types"
    +
    +	"golang.org/x/tools/go/ast/astutil"
    +	"golang.org/x/tools/go/types/typeutil"
    +)
    +
    +// A Constraint records the fact that the RHS type does and must
    +// satisify the LHS type, which is an interface.
    +// The names are suggestive of an assignment statement LHS = RHS.
    +type Constraint struct {
    +	LHS, RHS types.Type
    +}
    +
    +// A Finder inspects the type-checked ASTs of Go packages and
    +// accumulates the set of type constraints (x, y) such that x is
    +// assignable to y, y is an interface, and both x and y have methods.
    +//
    +// In other words, it returns the subset of the "implements" relation
    +// that is checked during compilation of a package.  Refactoring tools
    +// will need to preserve at least this part of the relation to ensure
    +// continued compilation.
    +//
    +type Finder struct {
    +	Result    map[Constraint]bool
    +	msetcache typeutil.MethodSetCache
    +
    +	// per-Find state
    +	info *types.Info
    +	sig  *types.Signature
    +}
    +
    +// Find inspects a single package, populating Result with its pairs of
    +// constrained types.
    +//
    +// The result is non-canonical and thus may contain duplicates (but this
    +// tends to preserves names of interface types better).
    +//
    +// The package must be free of type errors, and
    +// info.{Defs,Uses,Selections,Types} must have been populated by the
    +// type-checker.
    +//
    +func (f *Finder) Find(info *types.Info, files []*ast.File) {
    +	if f.Result == nil {
    +		f.Result = make(map[Constraint]bool)
    +	}
    +
    +	f.info = info
    +	for _, file := range files {
    +		for _, d := range file.Decls {
    +			switch d := d.(type) {
    +			case *ast.GenDecl:
    +				if d.Tok == token.VAR { // ignore consts
    +					for _, spec := range d.Specs {
    +						f.valueSpec(spec.(*ast.ValueSpec))
    +					}
    +				}
    +
    +			case *ast.FuncDecl:
    +				if d.Body != nil {
    +					f.sig = f.info.Defs[d.Name].Type().(*types.Signature)
    +					f.stmt(d.Body)
    +					f.sig = nil
    +				}
    +			}
    +		}
    +	}
    +	f.info = nil
    +}
    +
    +var (
    +	tInvalid     = types.Typ[types.Invalid]
    +	tUntypedBool = types.Typ[types.UntypedBool]
    +	tUntypedNil  = types.Typ[types.UntypedNil]
    +)
    +
    +// exprN visits an expression in a multi-value context.
    +func (f *Finder) exprN(e ast.Expr) types.Type {
    +	typ := f.info.Types[e].Type.(*types.Tuple)
    +	switch e := e.(type) {
    +	case *ast.ParenExpr:
    +		return f.exprN(e.X)
    +
    +	case *ast.CallExpr:
    +		// x, err := f(args)
    +		sig := f.expr(e.Fun).Underlying().(*types.Signature)
    +		f.call(sig, e.Args)
    +
    +	case *ast.IndexExpr:
    +		// y, ok := x[i]
    +		x := f.expr(e.X)
    +		f.assign(f.expr(e.Index), x.Underlying().(*types.Map).Key())
    +
    +	case *ast.TypeAssertExpr:
    +		// y, ok := x.(T)
    +		f.typeAssert(f.expr(e.X), typ.At(0).Type())
    +
    +	case *ast.UnaryExpr: // must be receive <-
    +		// y, ok := <-x
    +		f.expr(e.X)
    +
    +	default:
    +		panic(e)
    +	}
    +	return typ
    +}
    +
    +func (f *Finder) call(sig *types.Signature, args []ast.Expr) {
    +	if len(args) == 0 {
    +		return
    +	}
    +
    +	// Ellipsis call?  e.g. f(x, y, z...)
    +	if _, ok := args[len(args)-1].(*ast.Ellipsis); ok {
    +		for i, arg := range args {
    +			// The final arg is a slice, and so is the final param.
    +			f.assign(sig.Params().At(i).Type(), f.expr(arg))
    +		}
    +		return
    +	}
    +
    +	var argtypes []types.Type
    +
    +	// Gather the effective actual parameter types.
    +	if tuple, ok := f.info.Types[args[0]].Type.(*types.Tuple); ok {
    +		// f(g()) call where g has multiple results?
    +		f.expr(args[0])
    +		// unpack the tuple
    +		for i := 0; i < tuple.Len(); i++ {
    +			argtypes = append(argtypes, tuple.At(i).Type())
    +		}
    +	} else {
    +		for _, arg := range args {
    +			argtypes = append(argtypes, f.expr(arg))
    +		}
    +	}
    +
    +	// Assign the actuals to the formals.
    +	if !sig.Variadic() {
    +		for i, argtype := range argtypes {
    +			f.assign(sig.Params().At(i).Type(), argtype)
    +		}
    +	} else {
    +		// The first n-1 parameters are assigned normally.
    +		nnormals := sig.Params().Len() - 1
    +		for i, argtype := range argtypes[:nnormals] {
    +			f.assign(sig.Params().At(i).Type(), argtype)
    +		}
    +		// Remaining args are assigned to elements of varargs slice.
    +		tElem := sig.Params().At(nnormals).Type().(*types.Slice).Elem()
    +		for i := nnormals; i < len(argtypes); i++ {
    +			f.assign(tElem, argtypes[i])
    +		}
    +	}
    +}
    +
    +func (f *Finder) builtin(obj *types.Builtin, sig *types.Signature, args []ast.Expr, T types.Type) types.Type {
    +	switch obj.Name() {
    +	case "make", "new":
    +		// skip the type operand
    +		for _, arg := range args[1:] {
    +			f.expr(arg)
    +		}
    +
    +	case "append":
    +		s := f.expr(args[0])
    +		if _, ok := args[len(args)-1].(*ast.Ellipsis); ok && len(args) == 2 {
    +			// append(x, y...)   including append([]byte, "foo"...)
    +			f.expr(args[1])
    +		} else {
    +			// append(x, y, z)
    +			tElem := s.Underlying().(*types.Slice).Elem()
    +			for _, arg := range args[1:] {
    +				f.assign(tElem, f.expr(arg))
    +			}
    +		}
    +
    +	case "delete":
    +		m := f.expr(args[0])
    +		k := f.expr(args[1])
    +		f.assign(m.Underlying().(*types.Map).Key(), k)
    +
    +	default:
    +		// ordinary call
    +		f.call(sig, args)
    +	}
    +
    +	return T
    +}
    +
    +func (f *Finder) extract(tuple types.Type, i int) types.Type {
    +	if tuple, ok := tuple.(*types.Tuple); ok && i < tuple.Len() {
    +		return tuple.At(i).Type()
    +	}
    +	return tInvalid
    +}
    +
    +func (f *Finder) valueSpec(spec *ast.ValueSpec) {
    +	var T types.Type
    +	if spec.Type != nil {
    +		T = f.info.Types[spec.Type].Type
    +	}
    +	switch len(spec.Values) {
    +	case len(spec.Names): // e.g. var x, y = f(), g()
    +		for _, value := range spec.Values {
    +			v := f.expr(value)
    +			if T != nil {
    +				f.assign(T, v)
    +			}
    +		}
    +
    +	case 1: // e.g. var x, y = f()
    +		tuple := f.exprN(spec.Values[0])
    +		for i := range spec.Names {
    +			if T != nil {
    +				f.assign(T, f.extract(tuple, i))
    +			}
    +		}
    +	}
    +}
    +
    +// assign records pairs of distinct types that are related by
    +// assignability, where the left-hand side is an interface and both
    +// sides have methods.
    +//
    +// It should be called for all assignability checks, type assertions,
    +// explicit conversions and comparisons between two types, unless the
    +// types are uninteresting (e.g. lhs is a concrete type, or the empty
    +// interface; rhs has no methods).
    +//
    +func (f *Finder) assign(lhs, rhs types.Type) {
    +	if types.Identical(lhs, rhs) {
    +		return
    +	}
    +	if !isInterface(lhs) {
    +		return
    +	}
    +
    +	if f.msetcache.MethodSet(lhs).Len() == 0 {
    +		return
    +	}
    +	if f.msetcache.MethodSet(rhs).Len() == 0 {
    +		return
    +	}
    +	// record the pair
    +	f.Result[Constraint{lhs, rhs}] = true
    +}
    +
    +// typeAssert must be called for each type assertion x.(T) where x has
    +// interface type I.
    +func (f *Finder) typeAssert(I, T types.Type) {
    +	// Type assertions are slightly subtle, because they are allowed
    +	// to be "impossible", e.g.
    +	//
    +	// 	var x interface{f()}
    +	//	_ = x.(interface{f()int}) // legal
    +	//
    +	// (In hindsight, the language spec should probably not have
    +	// allowed this, but it's too late to fix now.)
    +	//
    +	// This means that a type assert from I to T isn't exactly a
    +	// constraint that T is assignable to I, but for a refactoring
    +	// tool it is a conditional constraint that, if T is assignable
    +	// to I before a refactoring, it should remain so after.
    +
    +	if types.AssignableTo(T, I) {
    +		f.assign(I, T)
    +	}
    +}
    +
    +// compare must be called for each comparison x==y.
    +func (f *Finder) compare(x, y types.Type) {
    +	if types.AssignableTo(x, y) {
    +		f.assign(y, x)
    +	} else if types.AssignableTo(y, x) {
    +		f.assign(x, y)
    +	}
    +}
    +
    +// expr visits a true expression (not a type or defining ident)
    +// and returns its type.
    +func (f *Finder) expr(e ast.Expr) types.Type {
    +	tv := f.info.Types[e]
    +	if tv.Value != nil {
    +		return tv.Type // prune the descent for constants
    +	}
    +
    +	// tv.Type may be nil for an ast.Ident.
    +
    +	switch e := e.(type) {
    +	case *ast.BadExpr, *ast.BasicLit:
    +		// no-op
    +
    +	case *ast.Ident:
    +		// (referring idents only)
    +		if obj, ok := f.info.Uses[e]; ok {
    +			return obj.Type()
    +		}
    +		if e.Name == "_" { // e.g. "for _ = range x"
    +			return tInvalid
    +		}
    +		panic("undefined ident: " + e.Name)
    +
    +	case *ast.Ellipsis:
    +		if e.Elt != nil {
    +			f.expr(e.Elt)
    +		}
    +
    +	case *ast.FuncLit:
    +		saved := f.sig
    +		f.sig = tv.Type.(*types.Signature)
    +		f.stmt(e.Body)
    +		f.sig = saved
    +
    +	case *ast.CompositeLit:
    +		switch T := deref(tv.Type).Underlying().(type) {
    +		case *types.Struct:
    +			for i, elem := range e.Elts {
    +				if kv, ok := elem.(*ast.KeyValueExpr); ok {
    +					f.assign(f.info.Uses[kv.Key.(*ast.Ident)].Type(), f.expr(kv.Value))
    +				} else {
    +					f.assign(T.Field(i).Type(), f.expr(elem))
    +				}
    +			}
    +
    +		case *types.Map:
    +			for _, elem := range e.Elts {
    +				elem := elem.(*ast.KeyValueExpr)
    +				f.assign(T.Key(), f.expr(elem.Key))
    +				f.assign(T.Elem(), f.expr(elem.Value))
    +			}
    +
    +		case *types.Array, *types.Slice:
    +			tElem := T.(interface {
    +				Elem() types.Type
    +			}).Elem()
    +			for _, elem := range e.Elts {
    +				if kv, ok := elem.(*ast.KeyValueExpr); ok {
    +					// ignore the key
    +					f.assign(tElem, f.expr(kv.Value))
    +				} else {
    +					f.assign(tElem, f.expr(elem))
    +				}
    +			}
    +
    +		default:
    +			panic("unexpected composite literal type: " + tv.Type.String())
    +		}
    +
    +	case *ast.ParenExpr:
    +		f.expr(e.X)
    +
    +	case *ast.SelectorExpr:
    +		if _, ok := f.info.Selections[e]; ok {
    +			f.expr(e.X) // selection
    +		} else {
    +			return f.info.Uses[e.Sel].Type() // qualified identifier
    +		}
    +
    +	case *ast.IndexExpr:
    +		x := f.expr(e.X)
    +		i := f.expr(e.Index)
    +		if ux, ok := x.Underlying().(*types.Map); ok {
    +			f.assign(ux.Key(), i)
    +		}
    +
    +	case *ast.SliceExpr:
    +		f.expr(e.X)
    +		if e.Low != nil {
    +			f.expr(e.Low)
    +		}
    +		if e.High != nil {
    +			f.expr(e.High)
    +		}
    +		if e.Max != nil {
    +			f.expr(e.Max)
    +		}
    +
    +	case *ast.TypeAssertExpr:
    +		x := f.expr(e.X)
    +		f.typeAssert(x, f.info.Types[e.Type].Type)
    +
    +	case *ast.CallExpr:
    +		if tvFun := f.info.Types[e.Fun]; tvFun.IsType() {
    +			// conversion
    +			arg0 := f.expr(e.Args[0])
    +			f.assign(tvFun.Type, arg0)
    +		} else {
    +			// function call
    +			if id, ok := unparen(e.Fun).(*ast.Ident); ok {
    +				if obj, ok := f.info.Uses[id].(*types.Builtin); ok {
    +					sig := f.info.Types[id].Type.(*types.Signature)
    +					return f.builtin(obj, sig, e.Args, tv.Type)
    +				}
    +			}
    +			// ordinary call
    +			f.call(f.expr(e.Fun).Underlying().(*types.Signature), e.Args)
    +		}
    +
    +	case *ast.StarExpr:
    +		f.expr(e.X)
    +
    +	case *ast.UnaryExpr:
    +		f.expr(e.X)
    +
    +	case *ast.BinaryExpr:
    +		x := f.expr(e.X)
    +		y := f.expr(e.Y)
    +		if e.Op == token.EQL || e.Op == token.NEQ {
    +			f.compare(x, y)
    +		}
    +
    +	case *ast.KeyValueExpr:
    +		f.expr(e.Key)
    +		f.expr(e.Value)
    +
    +	case *ast.ArrayType,
    +		*ast.StructType,
    +		*ast.FuncType,
    +		*ast.InterfaceType,
    +		*ast.MapType,
    +		*ast.ChanType:
    +		panic(e)
    +	}
    +
    +	if tv.Type == nil {
    +		panic(fmt.Sprintf("no type for %T", e))
    +	}
    +
    +	return tv.Type
    +}
    +
    +func (f *Finder) stmt(s ast.Stmt) {
    +	switch s := s.(type) {
    +	case *ast.BadStmt,
    +		*ast.EmptyStmt,
    +		*ast.BranchStmt:
    +		// no-op
    +
    +	case *ast.DeclStmt:
    +		d := s.Decl.(*ast.GenDecl)
    +		if d.Tok == token.VAR { // ignore consts
    +			for _, spec := range d.Specs {
    +				f.valueSpec(spec.(*ast.ValueSpec))
    +			}
    +		}
    +
    +	case *ast.LabeledStmt:
    +		f.stmt(s.Stmt)
    +
    +	case *ast.ExprStmt:
    +		f.expr(s.X)
    +
    +	case *ast.SendStmt:
    +		ch := f.expr(s.Chan)
    +		val := f.expr(s.Value)
    +		f.assign(ch.Underlying().(*types.Chan).Elem(), val)
    +
    +	case *ast.IncDecStmt:
    +		f.expr(s.X)
    +
    +	case *ast.AssignStmt:
    +		switch s.Tok {
    +		case token.ASSIGN, token.DEFINE:
    +			// y := x   or   y = x
    +			var rhsTuple types.Type
    +			if len(s.Lhs) != len(s.Rhs) {
    +				rhsTuple = f.exprN(s.Rhs[0])
    +			}
    +			for i := range s.Lhs {
    +				var lhs, rhs types.Type
    +				if rhsTuple == nil {
    +					rhs = f.expr(s.Rhs[i]) // 1:1 assignment
    +				} else {
    +					rhs = f.extract(rhsTuple, i) // n:1 assignment
    +				}
    +
    +				if id, ok := s.Lhs[i].(*ast.Ident); ok {
    +					if id.Name != "_" {
    +						if obj, ok := f.info.Defs[id]; ok {
    +							lhs = obj.Type() // definition
    +						}
    +					}
    +				}
    +				if lhs == nil {
    +					lhs = f.expr(s.Lhs[i]) // assignment
    +				}
    +				f.assign(lhs, rhs)
    +			}
    +
    +		default:
    +			// y op= x
    +			f.expr(s.Lhs[0])
    +			f.expr(s.Rhs[0])
    +		}
    +
    +	case *ast.GoStmt:
    +		f.expr(s.Call)
    +
    +	case *ast.DeferStmt:
    +		f.expr(s.Call)
    +
    +	case *ast.ReturnStmt:
    +		formals := f.sig.Results()
    +		switch len(s.Results) {
    +		case formals.Len(): // 1:1
    +			for i, result := range s.Results {
    +				f.assign(formals.At(i).Type(), f.expr(result))
    +			}
    +
    +		case 1: // n:1
    +			tuple := f.exprN(s.Results[0])
    +			for i := 0; i < formals.Len(); i++ {
    +				f.assign(formals.At(i).Type(), f.extract(tuple, i))
    +			}
    +		}
    +
    +	case *ast.SelectStmt:
    +		f.stmt(s.Body)
    +
    +	case *ast.BlockStmt:
    +		for _, s := range s.List {
    +			f.stmt(s)
    +		}
    +
    +	case *ast.IfStmt:
    +		if s.Init != nil {
    +			f.stmt(s.Init)
    +		}
    +		f.expr(s.Cond)
    +		f.stmt(s.Body)
    +		if s.Else != nil {
    +			f.stmt(s.Else)
    +		}
    +
    +	case *ast.SwitchStmt:
    +		if s.Init != nil {
    +			f.stmt(s.Init)
    +		}
    +		var tag types.Type = tUntypedBool
    +		if s.Tag != nil {
    +			tag = f.expr(s.Tag)
    +		}
    +		for _, cc := range s.Body.List {
    +			cc := cc.(*ast.CaseClause)
    +			for _, cond := range cc.List {
    +				f.compare(tag, f.info.Types[cond].Type)
    +			}
    +			for _, s := range cc.Body {
    +				f.stmt(s)
    +			}
    +		}
    +
    +	case *ast.TypeSwitchStmt:
    +		if s.Init != nil {
    +			f.stmt(s.Init)
    +		}
    +		var I types.Type
    +		switch ass := s.Assign.(type) {
    +		case *ast.ExprStmt: // x.(type)
    +			I = f.expr(unparen(ass.X).(*ast.TypeAssertExpr).X)
    +		case *ast.AssignStmt: // y := x.(type)
    +			I = f.expr(unparen(ass.Rhs[0]).(*ast.TypeAssertExpr).X)
    +		}
    +		for _, cc := range s.Body.List {
    +			cc := cc.(*ast.CaseClause)
    +			for _, cond := range cc.List {
    +				tCase := f.info.Types[cond].Type
    +				if tCase != tUntypedNil {
    +					f.typeAssert(I, tCase)
    +				}
    +			}
    +			for _, s := range cc.Body {
    +				f.stmt(s)
    +			}
    +		}
    +
    +	case *ast.CommClause:
    +		if s.Comm != nil {
    +			f.stmt(s.Comm)
    +		}
    +		for _, s := range s.Body {
    +			f.stmt(s)
    +		}
    +
    +	case *ast.ForStmt:
    +		if s.Init != nil {
    +			f.stmt(s.Init)
    +		}
    +		if s.Cond != nil {
    +			f.expr(s.Cond)
    +		}
    +		if s.Post != nil {
    +			f.stmt(s.Post)
    +		}
    +		f.stmt(s.Body)
    +
    +	case *ast.RangeStmt:
    +		x := f.expr(s.X)
    +		// No conversions are involved when Tok==DEFINE.
    +		if s.Tok == token.ASSIGN {
    +			if s.Key != nil {
    +				k := f.expr(s.Key)
    +				var xelem types.Type
    +				// keys of array, *array, slice, string aren't interesting
    +				switch ux := x.Underlying().(type) {
    +				case *types.Chan:
    +					xelem = ux.Elem()
    +				case *types.Map:
    +					xelem = ux.Key()
    +				}
    +				if xelem != nil {
    +					f.assign(xelem, k)
    +				}
    +			}
    +			if s.Value != nil {
    +				val := f.expr(s.Value)
    +				var xelem types.Type
    +				// values of strings aren't interesting
    +				switch ux := x.Underlying().(type) {
    +				case *types.Array:
    +					xelem = ux.Elem()
    +				case *types.Chan:
    +					xelem = ux.Elem()
    +				case *types.Map:
    +					xelem = ux.Elem()
    +				case *types.Pointer: // *array
    +					xelem = deref(ux).(*types.Array).Elem()
    +				case *types.Slice:
    +					xelem = ux.Elem()
    +				}
    +				if xelem != nil {
    +					f.assign(xelem, val)
    +				}
    +			}
    +		}
    +		f.stmt(s.Body)
    +
    +	default:
    +		panic(s)
    +	}
    +}
    +
    +// -- Plundered from golang.org/x/tools/go/ssa -----------------
    +
    +// deref returns a pointer's element type; otherwise it returns typ.
    +func deref(typ types.Type) types.Type {
    +	if p, ok := typ.Underlying().(*types.Pointer); ok {
    +		return p.Elem()
    +	}
    +	return typ
    +}
    +
    +func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) }
    +
    +func isInterface(T types.Type) bool { return types.IsInterface(T) }
    diff --git a/vendor/golang.org/x/tools/refactor/satisfy/find14.go b/vendor/golang.org/x/tools/refactor/satisfy/find14.go
    new file mode 100644
    index 0000000000..3b8d1e096a
    --- /dev/null
    +++ b/vendor/golang.org/x/tools/refactor/satisfy/find14.go
    @@ -0,0 +1,707 @@
    +// 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 !go1.5
    +
    +// Package satisfy inspects the type-checked ASTs of Go packages and
    +// reports the set of discovered type constraints of the form (lhs, rhs
    +// Type) where lhs is a non-trivial interface, rhs satisfies this
    +// interface, and this fact is necessary for the package to be
    +// well-typed.
    +//
    +// THIS PACKAGE IS EXPERIMENTAL AND MAY CHANGE AT ANY TIME.
    +//
    +// It is provided only for the gorename tool.  Ideally this
    +// functionality will become part of the type-checker in due course,
    +// since it is computing it anyway, and it is robust for ill-typed
    +// inputs, which this package is not.
    +//
    +package satisfy // import "golang.org/x/tools/refactor/satisfy"
    +
    +// NOTES:
    +//
    +// We don't care about numeric conversions, so we don't descend into
    +// types or constant expressions.  This is unsound because
    +// constant expressions can contain arbitrary statements, e.g.
    +//   const x = len([1]func(){func() {
    +//     ...
    +//   }})
    +//
    +// TODO(adonovan): make this robust against ill-typed input.
    +// Or move it into the type-checker.
    +//
    +// Assignability conversions are possible in the following places:
    +// - in assignments y = x, y := x, var y = x.
    +// - from call argument types to formal parameter types
    +// - in append and delete calls
    +// - from return operands to result parameter types
    +// - in composite literal T{k:v}, from k and v to T's field/element/key type
    +// - in map[key] from key to the map's key type
    +// - in comparisons x==y and switch x { case y: }.
    +// - in explicit conversions T(x)
    +// - in sends ch <- x, from x to the channel element type
    +// - in type assertions x.(T) and switch x.(type) { case T: }
    +//
    +// The results of this pass provide information equivalent to the
    +// ssa.MakeInterface and ssa.ChangeInterface instructions.
    +
    +import (
    +	"fmt"
    +	"go/ast"
    +	"go/token"
    +
    +	"golang.org/x/tools/go/ast/astutil"
    +	"golang.org/x/tools/go/types"
    +	"golang.org/x/tools/go/types/typeutil"
    +)
    +
    +// A Constraint records the fact that the RHS type does and must
    +// satisify the LHS type, which is an interface.
    +// The names are suggestive of an assignment statement LHS = RHS.
    +type Constraint struct {
    +	LHS, RHS types.Type
    +}
    +
    +// A Finder inspects the type-checked ASTs of Go packages and
    +// accumulates the set of type constraints (x, y) such that x is
    +// assignable to y, y is an interface, and both x and y have methods.
    +//
    +// In other words, it returns the subset of the "implements" relation
    +// that is checked during compilation of a package.  Refactoring tools
    +// will need to preserve at least this part of the relation to ensure
    +// continued compilation.
    +//
    +type Finder struct {
    +	Result    map[Constraint]bool
    +	msetcache typeutil.MethodSetCache
    +
    +	// per-Find state
    +	info *types.Info
    +	sig  *types.Signature
    +}
    +
    +// Find inspects a single package, populating Result with its pairs of
    +// constrained types.
    +//
    +// The result is non-canonical and thus may contain duplicates (but this
    +// tends to preserves names of interface types better).
    +//
    +// The package must be free of type errors, and
    +// info.{Defs,Uses,Selections,Types} must have been populated by the
    +// type-checker.
    +//
    +func (f *Finder) Find(info *types.Info, files []*ast.File) {
    +	if f.Result == nil {
    +		f.Result = make(map[Constraint]bool)
    +	}
    +
    +	f.info = info
    +	for _, file := range files {
    +		for _, d := range file.Decls {
    +			switch d := d.(type) {
    +			case *ast.GenDecl:
    +				if d.Tok == token.VAR { // ignore consts
    +					for _, spec := range d.Specs {
    +						f.valueSpec(spec.(*ast.ValueSpec))
    +					}
    +				}
    +
    +			case *ast.FuncDecl:
    +				if d.Body != nil {
    +					f.sig = f.info.Defs[d.Name].Type().(*types.Signature)
    +					f.stmt(d.Body)
    +					f.sig = nil
    +				}
    +			}
    +		}
    +	}
    +	f.info = nil
    +}
    +
    +var (
    +	tInvalid     = types.Typ[types.Invalid]
    +	tUntypedBool = types.Typ[types.UntypedBool]
    +	tUntypedNil  = types.Typ[types.UntypedNil]
    +)
    +
    +// exprN visits an expression in a multi-value context.
    +func (f *Finder) exprN(e ast.Expr) types.Type {
    +	typ := f.info.Types[e].Type.(*types.Tuple)
    +	switch e := e.(type) {
    +	case *ast.ParenExpr:
    +		return f.exprN(e.X)
    +
    +	case *ast.CallExpr:
    +		// x, err := f(args)
    +		sig := f.expr(e.Fun).Underlying().(*types.Signature)
    +		f.call(sig, e.Args)
    +
    +	case *ast.IndexExpr:
    +		// y, ok := x[i]
    +		x := f.expr(e.X)
    +		f.assign(f.expr(e.Index), x.Underlying().(*types.Map).Key())
    +
    +	case *ast.TypeAssertExpr:
    +		// y, ok := x.(T)
    +		f.typeAssert(f.expr(e.X), typ.At(0).Type())
    +
    +	case *ast.UnaryExpr: // must be receive <-
    +		// y, ok := <-x
    +		f.expr(e.X)
    +
    +	default:
    +		panic(e)
    +	}
    +	return typ
    +}
    +
    +func (f *Finder) call(sig *types.Signature, args []ast.Expr) {
    +	if len(args) == 0 {
    +		return
    +	}
    +
    +	// Ellipsis call?  e.g. f(x, y, z...)
    +	if _, ok := args[len(args)-1].(*ast.Ellipsis); ok {
    +		for i, arg := range args {
    +			// The final arg is a slice, and so is the final param.
    +			f.assign(sig.Params().At(i).Type(), f.expr(arg))
    +		}
    +		return
    +	}
    +
    +	var argtypes []types.Type
    +
    +	// Gather the effective actual parameter types.
    +	if tuple, ok := f.info.Types[args[0]].Type.(*types.Tuple); ok {
    +		// f(g()) call where g has multiple results?
    +		f.expr(args[0])
    +		// unpack the tuple
    +		for i := 0; i < tuple.Len(); i++ {
    +			argtypes = append(argtypes, tuple.At(i).Type())
    +		}
    +	} else {
    +		for _, arg := range args {
    +			argtypes = append(argtypes, f.expr(arg))
    +		}
    +	}
    +
    +	// Assign the actuals to the formals.
    +	if !sig.Variadic() {
    +		for i, argtype := range argtypes {
    +			f.assign(sig.Params().At(i).Type(), argtype)
    +		}
    +	} else {
    +		// The first n-1 parameters are assigned normally.
    +		nnormals := sig.Params().Len() - 1
    +		for i, argtype := range argtypes[:nnormals] {
    +			f.assign(sig.Params().At(i).Type(), argtype)
    +		}
    +		// Remaining args are assigned to elements of varargs slice.
    +		tElem := sig.Params().At(nnormals).Type().(*types.Slice).Elem()
    +		for i := nnormals; i < len(argtypes); i++ {
    +			f.assign(tElem, argtypes[i])
    +		}
    +	}
    +}
    +
    +func (f *Finder) builtin(obj *types.Builtin, sig *types.Signature, args []ast.Expr, T types.Type) types.Type {
    +	switch obj.Name() {
    +	case "make", "new":
    +		// skip the type operand
    +		for _, arg := range args[1:] {
    +			f.expr(arg)
    +		}
    +
    +	case "append":
    +		s := f.expr(args[0])
    +		if _, ok := args[len(args)-1].(*ast.Ellipsis); ok && len(args) == 2 {
    +			// append(x, y...)   including append([]byte, "foo"...)
    +			f.expr(args[1])
    +		} else {
    +			// append(x, y, z)
    +			tElem := s.Underlying().(*types.Slice).Elem()
    +			for _, arg := range args[1:] {
    +				f.assign(tElem, f.expr(arg))
    +			}
    +		}
    +
    +	case "delete":
    +		m := f.expr(args[0])
    +		k := f.expr(args[1])
    +		f.assign(m.Underlying().(*types.Map).Key(), k)
    +
    +	default:
    +		// ordinary call
    +		f.call(sig, args)
    +	}
    +
    +	return T
    +}
    +
    +func (f *Finder) extract(tuple types.Type, i int) types.Type {
    +	if tuple, ok := tuple.(*types.Tuple); ok && i < tuple.Len() {
    +		return tuple.At(i).Type()
    +	}
    +	return tInvalid
    +}
    +
    +func (f *Finder) valueSpec(spec *ast.ValueSpec) {
    +	var T types.Type
    +	if spec.Type != nil {
    +		T = f.info.Types[spec.Type].Type
    +	}
    +	switch len(spec.Values) {
    +	case len(spec.Names): // e.g. var x, y = f(), g()
    +		for _, value := range spec.Values {
    +			v := f.expr(value)
    +			if T != nil {
    +				f.assign(T, v)
    +			}
    +		}
    +
    +	case 1: // e.g. var x, y = f()
    +		tuple := f.exprN(spec.Values[0])
    +		for i := range spec.Names {
    +			if T != nil {
    +				f.assign(T, f.extract(tuple, i))
    +			}
    +		}
    +	}
    +}
    +
    +// assign records pairs of distinct types that are related by
    +// assignability, where the left-hand side is an interface and both
    +// sides have methods.
    +//
    +// It should be called for all assignability checks, type assertions,
    +// explicit conversions and comparisons between two types, unless the
    +// types are uninteresting (e.g. lhs is a concrete type, or the empty
    +// interface; rhs has no methods).
    +//
    +func (f *Finder) assign(lhs, rhs types.Type) {
    +	if types.Identical(lhs, rhs) {
    +		return
    +	}
    +	if !isInterface(lhs) {
    +		return
    +	}
    +
    +	if f.msetcache.MethodSet(lhs).Len() == 0 {
    +		return
    +	}
    +	if f.msetcache.MethodSet(rhs).Len() == 0 {
    +		return
    +	}
    +	// record the pair
    +	f.Result[Constraint{lhs, rhs}] = true
    +}
    +
    +// typeAssert must be called for each type assertion x.(T) where x has
    +// interface type I.
    +func (f *Finder) typeAssert(I, T types.Type) {
    +	// Type assertions are slightly subtle, because they are allowed
    +	// to be "impossible", e.g.
    +	//
    +	// 	var x interface{f()}
    +	//	_ = x.(interface{f()int}) // legal
    +	//
    +	// (In hindsight, the language spec should probably not have
    +	// allowed this, but it's too late to fix now.)
    +	//
    +	// This means that a type assert from I to T isn't exactly a
    +	// constraint that T is assignable to I, but for a refactoring
    +	// tool it is a conditional constraint that, if T is assignable
    +	// to I before a refactoring, it should remain so after.
    +
    +	if types.AssignableTo(T, I) {
    +		f.assign(I, T)
    +	}
    +}
    +
    +// compare must be called for each comparison x==y.
    +func (f *Finder) compare(x, y types.Type) {
    +	if types.AssignableTo(x, y) {
    +		f.assign(y, x)
    +	} else if types.AssignableTo(y, x) {
    +		f.assign(x, y)
    +	}
    +}
    +
    +// expr visits a true expression (not a type or defining ident)
    +// and returns its type.
    +func (f *Finder) expr(e ast.Expr) types.Type {
    +	tv := f.info.Types[e]
    +	if tv.Value != nil {
    +		return tv.Type // prune the descent for constants
    +	}
    +
    +	// tv.Type may be nil for an ast.Ident.
    +
    +	switch e := e.(type) {
    +	case *ast.BadExpr, *ast.BasicLit:
    +		// no-op
    +
    +	case *ast.Ident:
    +		// (referring idents only)
    +		if obj, ok := f.info.Uses[e]; ok {
    +			return obj.Type()
    +		}
    +		if e.Name == "_" { // e.g. "for _ = range x"
    +			return tInvalid
    +		}
    +		panic("undefined ident: " + e.Name)
    +
    +	case *ast.Ellipsis:
    +		if e.Elt != nil {
    +			f.expr(e.Elt)
    +		}
    +
    +	case *ast.FuncLit:
    +		saved := f.sig
    +		f.sig = tv.Type.(*types.Signature)
    +		f.stmt(e.Body)
    +		f.sig = saved
    +
    +	case *ast.CompositeLit:
    +		switch T := deref(tv.Type).Underlying().(type) {
    +		case *types.Struct:
    +			for i, elem := range e.Elts {
    +				if kv, ok := elem.(*ast.KeyValueExpr); ok {
    +					f.assign(f.info.Uses[kv.Key.(*ast.Ident)].Type(), f.expr(kv.Value))
    +				} else {
    +					f.assign(T.Field(i).Type(), f.expr(elem))
    +				}
    +			}
    +
    +		case *types.Map:
    +			for _, elem := range e.Elts {
    +				elem := elem.(*ast.KeyValueExpr)
    +				f.assign(T.Key(), f.expr(elem.Key))
    +				f.assign(T.Elem(), f.expr(elem.Value))
    +			}
    +
    +		case *types.Array, *types.Slice:
    +			tElem := T.(interface {
    +				Elem() types.Type
    +			}).Elem()
    +			for _, elem := range e.Elts {
    +				if kv, ok := elem.(*ast.KeyValueExpr); ok {
    +					// ignore the key
    +					f.assign(tElem, f.expr(kv.Value))
    +				} else {
    +					f.assign(tElem, f.expr(elem))
    +				}
    +			}
    +
    +		default:
    +			panic("unexpected composite literal type: " + tv.Type.String())
    +		}
    +
    +	case *ast.ParenExpr:
    +		f.expr(e.X)
    +
    +	case *ast.SelectorExpr:
    +		if _, ok := f.info.Selections[e]; ok {
    +			f.expr(e.X) // selection
    +		} else {
    +			return f.info.Uses[e.Sel].Type() // qualified identifier
    +		}
    +
    +	case *ast.IndexExpr:
    +		x := f.expr(e.X)
    +		i := f.expr(e.Index)
    +		if ux, ok := x.Underlying().(*types.Map); ok {
    +			f.assign(ux.Key(), i)
    +		}
    +
    +	case *ast.SliceExpr:
    +		f.expr(e.X)
    +		if e.Low != nil {
    +			f.expr(e.Low)
    +		}
    +		if e.High != nil {
    +			f.expr(e.High)
    +		}
    +		if e.Max != nil {
    +			f.expr(e.Max)
    +		}
    +
    +	case *ast.TypeAssertExpr:
    +		x := f.expr(e.X)
    +		f.typeAssert(x, f.info.Types[e.Type].Type)
    +
    +	case *ast.CallExpr:
    +		if tvFun := f.info.Types[e.Fun]; tvFun.IsType() {
    +			// conversion
    +			arg0 := f.expr(e.Args[0])
    +			f.assign(tvFun.Type, arg0)
    +		} else {
    +			// function call
    +			if id, ok := unparen(e.Fun).(*ast.Ident); ok {
    +				if obj, ok := f.info.Uses[id].(*types.Builtin); ok {
    +					sig := f.info.Types[id].Type.(*types.Signature)
    +					return f.builtin(obj, sig, e.Args, tv.Type)
    +				}
    +			}
    +			// ordinary call
    +			f.call(f.expr(e.Fun).Underlying().(*types.Signature), e.Args)
    +		}
    +
    +	case *ast.StarExpr:
    +		f.expr(e.X)
    +
    +	case *ast.UnaryExpr:
    +		f.expr(e.X)
    +
    +	case *ast.BinaryExpr:
    +		x := f.expr(e.X)
    +		y := f.expr(e.Y)
    +		if e.Op == token.EQL || e.Op == token.NEQ {
    +			f.compare(x, y)
    +		}
    +
    +	case *ast.KeyValueExpr:
    +		f.expr(e.Key)
    +		f.expr(e.Value)
    +
    +	case *ast.ArrayType,
    +		*ast.StructType,
    +		*ast.FuncType,
    +		*ast.InterfaceType,
    +		*ast.MapType,
    +		*ast.ChanType:
    +		panic(e)
    +	}
    +
    +	if tv.Type == nil {
    +		panic(fmt.Sprintf("no type for %T", e))
    +	}
    +
    +	return tv.Type
    +}
    +
    +func (f *Finder) stmt(s ast.Stmt) {
    +	switch s := s.(type) {
    +	case *ast.BadStmt,
    +		*ast.EmptyStmt,
    +		*ast.BranchStmt:
    +		// no-op
    +
    +	case *ast.DeclStmt:
    +		d := s.Decl.(*ast.GenDecl)
    +		if d.Tok == token.VAR { // ignore consts
    +			for _, spec := range d.Specs {
    +				f.valueSpec(spec.(*ast.ValueSpec))
    +			}
    +		}
    +
    +	case *ast.LabeledStmt:
    +		f.stmt(s.Stmt)
    +
    +	case *ast.ExprStmt:
    +		f.expr(s.X)
    +
    +	case *ast.SendStmt:
    +		ch := f.expr(s.Chan)
    +		val := f.expr(s.Value)
    +		f.assign(ch.Underlying().(*types.Chan).Elem(), val)
    +
    +	case *ast.IncDecStmt:
    +		f.expr(s.X)
    +
    +	case *ast.AssignStmt:
    +		switch s.Tok {
    +		case token.ASSIGN, token.DEFINE:
    +			// y := x   or   y = x
    +			var rhsTuple types.Type
    +			if len(s.Lhs) != len(s.Rhs) {
    +				rhsTuple = f.exprN(s.Rhs[0])
    +			}
    +			for i := range s.Lhs {
    +				var lhs, rhs types.Type
    +				if rhsTuple == nil {
    +					rhs = f.expr(s.Rhs[i]) // 1:1 assignment
    +				} else {
    +					rhs = f.extract(rhsTuple, i) // n:1 assignment
    +				}
    +
    +				if id, ok := s.Lhs[i].(*ast.Ident); ok {
    +					if id.Name != "_" {
    +						if obj, ok := f.info.Defs[id]; ok {
    +							lhs = obj.Type() // definition
    +						}
    +					}
    +				}
    +				if lhs == nil {
    +					lhs = f.expr(s.Lhs[i]) // assignment
    +				}
    +				f.assign(lhs, rhs)
    +			}
    +
    +		default:
    +			// y op= x
    +			f.expr(s.Lhs[0])
    +			f.expr(s.Rhs[0])
    +		}
    +
    +	case *ast.GoStmt:
    +		f.expr(s.Call)
    +
    +	case *ast.DeferStmt:
    +		f.expr(s.Call)
    +
    +	case *ast.ReturnStmt:
    +		formals := f.sig.Results()
    +		switch len(s.Results) {
    +		case formals.Len(): // 1:1
    +			for i, result := range s.Results {
    +				f.assign(formals.At(i).Type(), f.expr(result))
    +			}
    +
    +		case 1: // n:1
    +			tuple := f.exprN(s.Results[0])
    +			for i := 0; i < formals.Len(); i++ {
    +				f.assign(formals.At(i).Type(), f.extract(tuple, i))
    +			}
    +		}
    +
    +	case *ast.SelectStmt:
    +		f.stmt(s.Body)
    +
    +	case *ast.BlockStmt:
    +		for _, s := range s.List {
    +			f.stmt(s)
    +		}
    +
    +	case *ast.IfStmt:
    +		if s.Init != nil {
    +			f.stmt(s.Init)
    +		}
    +		f.expr(s.Cond)
    +		f.stmt(s.Body)
    +		if s.Else != nil {
    +			f.stmt(s.Else)
    +		}
    +
    +	case *ast.SwitchStmt:
    +		if s.Init != nil {
    +			f.stmt(s.Init)
    +		}
    +		var tag types.Type = tUntypedBool
    +		if s.Tag != nil {
    +			tag = f.expr(s.Tag)
    +		}
    +		for _, cc := range s.Body.List {
    +			cc := cc.(*ast.CaseClause)
    +			for _, cond := range cc.List {
    +				f.compare(tag, f.info.Types[cond].Type)
    +			}
    +			for _, s := range cc.Body {
    +				f.stmt(s)
    +			}
    +		}
    +
    +	case *ast.TypeSwitchStmt:
    +		if s.Init != nil {
    +			f.stmt(s.Init)
    +		}
    +		var I types.Type
    +		switch ass := s.Assign.(type) {
    +		case *ast.ExprStmt: // x.(type)
    +			I = f.expr(unparen(ass.X).(*ast.TypeAssertExpr).X)
    +		case *ast.AssignStmt: // y := x.(type)
    +			I = f.expr(unparen(ass.Rhs[0]).(*ast.TypeAssertExpr).X)
    +		}
    +		for _, cc := range s.Body.List {
    +			cc := cc.(*ast.CaseClause)
    +			for _, cond := range cc.List {
    +				tCase := f.info.Types[cond].Type
    +				if tCase != tUntypedNil {
    +					f.typeAssert(I, tCase)
    +				}
    +			}
    +			for _, s := range cc.Body {
    +				f.stmt(s)
    +			}
    +		}
    +
    +	case *ast.CommClause:
    +		if s.Comm != nil {
    +			f.stmt(s.Comm)
    +		}
    +		for _, s := range s.Body {
    +			f.stmt(s)
    +		}
    +
    +	case *ast.ForStmt:
    +		if s.Init != nil {
    +			f.stmt(s.Init)
    +		}
    +		if s.Cond != nil {
    +			f.expr(s.Cond)
    +		}
    +		if s.Post != nil {
    +			f.stmt(s.Post)
    +		}
    +		f.stmt(s.Body)
    +
    +	case *ast.RangeStmt:
    +		x := f.expr(s.X)
    +		// No conversions are involved when Tok==DEFINE.
    +		if s.Tok == token.ASSIGN {
    +			if s.Key != nil {
    +				k := f.expr(s.Key)
    +				var xelem types.Type
    +				// keys of array, *array, slice, string aren't interesting
    +				switch ux := x.Underlying().(type) {
    +				case *types.Chan:
    +					xelem = ux.Elem()
    +				case *types.Map:
    +					xelem = ux.Key()
    +				}
    +				if xelem != nil {
    +					f.assign(xelem, k)
    +				}
    +			}
    +			if s.Value != nil {
    +				val := f.expr(s.Value)
    +				var xelem types.Type
    +				// values of strings aren't interesting
    +				switch ux := x.Underlying().(type) {
    +				case *types.Array:
    +					xelem = ux.Elem()
    +				case *types.Chan:
    +					xelem = ux.Elem()
    +				case *types.Map:
    +					xelem = ux.Elem()
    +				case *types.Pointer: // *array
    +					xelem = deref(ux).(*types.Array).Elem()
    +				case *types.Slice:
    +					xelem = ux.Elem()
    +				}
    +				if xelem != nil {
    +					f.assign(xelem, val)
    +				}
    +			}
    +		}
    +		f.stmt(s.Body)
    +
    +	default:
    +		panic(s)
    +	}
    +}
    +
    +// -- Plundered from golang.org/x/tools/go/ssa -----------------
    +
    +// deref returns a pointer's element type; otherwise it returns typ.
    +func deref(typ types.Type) types.Type {
    +	if p, ok := typ.Underlying().(*types.Pointer); ok {
    +		return p.Elem()
    +	}
    +	return typ
    +}
    +
    +func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) }
    +
    +func isInterface(T types.Type) bool { return types.IsInterface(T) }
    diff --git a/vendor/gopkg.in/fsnotify.v1/.gitignore b/vendor/gopkg.in/fsnotify.v1/.gitignore
    new file mode 100644
    index 0000000000..4cd0cbaf43
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/.gitignore
    @@ -0,0 +1,6 @@
    +# Setup a Global .gitignore for OS and editor generated files:
    +# https://help.github.com/articles/ignoring-files
    +# git config --global core.excludesfile ~/.gitignore_global
    +
    +.vagrant
    +*.sublime-project
    diff --git a/vendor/gopkg.in/fsnotify.v1/.travis.yml b/vendor/gopkg.in/fsnotify.v1/.travis.yml
    new file mode 100644
    index 0000000000..70988769cc
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/.travis.yml
    @@ -0,0 +1,23 @@
    +sudo: false
    +language: go
    +
    +go:
    +  - 1.5.2
    +
    +before_script:
    +  - go get -u github.com/golang/lint/golint
    +
    +script:
    +  - go test -v --race ./...
    +
    +after_script:
    +  - test -z "$(gofmt -s -l -w . | tee /dev/stderr)"
    +  - test -z "$(golint ./...     | tee /dev/stderr)"
    +  - go vet ./...
    +
    +os:
    +  - linux
    +  - osx
    +
    +notifications:
    +  email: false
    diff --git a/vendor/gopkg.in/fsnotify.v1/AUTHORS b/vendor/gopkg.in/fsnotify.v1/AUTHORS
    new file mode 100644
    index 0000000000..2b9d1fdd62
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/AUTHORS
    @@ -0,0 +1,40 @@
    +# Names should be added to this file as
    +#	Name or Organization 
    +# The email address is not required for organizations.
    +
    +# You can update this list using the following command:
    +#
    +#   $ git shortlog -se | awk '{print $2 " " $3 " " $4}'
    +
    +# Please keep the list sorted.
    +
    +Adrien Bustany 
    +Caleb Spare 
    +Case Nelson 
    +Chris Howey  
    +Christoffer Buchholz 
    +Daniel Wagner-Hall 
    +Dave Cheney 
    +Evan Phoenix 
    +Francisco Souza 
    +Hari haran 
    +John C Barstow
    +Kelvin Fo 
    +Ken-ichirou MATSUZAWA 
    +Matt Layher 
    +Nathan Youngman 
    +Paul Hammond 
    +Pawel Knap 
    +Pieter Droogendijk 
    +Pursuit92 
    +Riku Voipio 
    +Rob Figueiredo 
    +Soge Zhang 
    +Tilak Sharma 
    +Travis Cline 
    +Tudor Golubenco 
    +Yukang 
    +bronze1man 
    +debrando 
    +henrikedwards 
    +铁哥 
    diff --git a/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md b/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md
    new file mode 100644
    index 0000000000..44ca62e537
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/CHANGELOG.md
    @@ -0,0 +1,287 @@
    +# Changelog
    +
    +## v1.2.10 / 2016-03-02
    +
    +* Fix golint errors in windows.go [#121](https://github.com/fsnotify/fsnotify/pull/121) (thanks @tiffanyfj)
    +
    +## v1.2.9 / 2016-01-13
    +
    +kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsnotify/pull/111) (thanks @bep)
    +
    +## v1.2.8 / 2015-12-17
    +
    +* kqueue: fix race condition in Close [#105](https://github.com/fsnotify/fsnotify/pull/105) (thanks @djui for reporting the issue and @ppknap for writing a failing test)
    +* inotify: fix race in test
    +* enable race detection for continuous integration (Linux, Mac, Windows)
    +
    +## v1.2.5 / 2015-10-17
    +
    +* inotify: use epoll_create1 for arm64 support (requires Linux 2.6.27 or later) [#100](https://github.com/fsnotify/fsnotify/pull/100) (thanks @suihkulokki)
    +* inotify: fix path leaks [#73](https://github.com/fsnotify/fsnotify/pull/73) (thanks @chamaken)
    +* kqueue: watch for rename events on subdirectories [#83](https://github.com/fsnotify/fsnotify/pull/83) (thanks @guotie)
    +* kqueue: avoid infinite loops from symlinks cycles [#101](https://github.com/fsnotify/fsnotify/pull/101) (thanks @illicitonion)
    +
    +## v1.2.1 / 2015-10-14
    +
    +* kqueue: don't watch named pipes [#98](https://github.com/fsnotify/fsnotify/pull/98) (thanks @evanphx)
    +
    +## v1.2.0 / 2015-02-08
    +
    +* inotify: use epoll to wake up readEvents [#66](https://github.com/fsnotify/fsnotify/pull/66) (thanks @PieterD)
    +* inotify: closing watcher should now always shut down goroutine [#63](https://github.com/fsnotify/fsnotify/pull/63) (thanks @PieterD)
    +* kqueue: close kqueue after removing watches, fixes [#59](https://github.com/fsnotify/fsnotify/issues/59)
    +
    +## v1.1.1 / 2015-02-05
    +
    +* inotify: Retry read on EINTR [#61](https://github.com/fsnotify/fsnotify/issues/61) (thanks @PieterD)
    +
    +## v1.1.0 / 2014-12-12
    +
    +* kqueue: rework internals [#43](https://github.com/fsnotify/fsnotify/pull/43)
    +    * add low-level functions
    +    * only need to store flags on directories
    +    * less mutexes [#13](https://github.com/fsnotify/fsnotify/issues/13)
    +    * done can be an unbuffered channel
    +    * remove calls to os.NewSyscallError
    +* More efficient string concatenation for Event.String() [#52](https://github.com/fsnotify/fsnotify/pull/52) (thanks @mdlayher)
    +* kqueue: fix regression in  rework causing subdirectories to be watched [#48](https://github.com/fsnotify/fsnotify/issues/48)
    +* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51)
    +
    +## v1.0.4 / 2014-09-07
    +
    +* kqueue: add dragonfly to the build tags.
    +* Rename source code files, rearrange code so exported APIs are at the top.
    +* Add done channel to example code. [#37](https://github.com/fsnotify/fsnotify/pull/37) (thanks @chenyukang)
    +
    +## v1.0.3 / 2014-08-19
    +
    +* [Fix] Windows MOVED_TO now translates to Create like on BSD and Linux. [#36](https://github.com/fsnotify/fsnotify/issues/36)
    +
    +## v1.0.2 / 2014-08-17
    +
    +* [Fix] Missing create events on OS X. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso)
    +* [Fix] Make ./path and path equivalent. (thanks @zhsso)
    +
    +## v1.0.0 / 2014-08-15
    +
    +* [API] Remove AddWatch on Windows, use Add.
    +* Improve documentation for exported identifiers. [#30](https://github.com/fsnotify/fsnotify/issues/30)
    +* Minor updates based on feedback from golint.
    +
    +## dev / 2014-07-09
    +
    +* Moved to [github.com/fsnotify/fsnotify](https://github.com/fsnotify/fsnotify).
    +* Use os.NewSyscallError instead of returning errno (thanks @hariharan-uno)
    +
    +## dev / 2014-07-04
    +
    +* kqueue: fix incorrect mutex used in Close()
    +* Update example to demonstrate usage of Op.
    +
    +## dev / 2014-06-28
    +
    +* [API] Don't set the Write Op for attribute notifications [#4](https://github.com/fsnotify/fsnotify/issues/4)
    +* Fix for String() method on Event (thanks Alex Brainman)
    +* Don't build on Plan 9 or Solaris (thanks @4ad)
    +
    +## dev / 2014-06-21
    +
    +* Events channel of type Event rather than *Event.
    +* [internal] use syscall constants directly for inotify and kqueue.
    +* [internal] kqueue: rename events to kevents and fileEvent to event.
    +
    +## dev / 2014-06-19
    +
    +* Go 1.3+ required on Windows (uses syscall.ERROR_MORE_DATA internally).
    +* [internal] remove cookie from Event struct (unused).
    +* [internal] Event struct has the same definition across every OS.
    +* [internal] remove internal watch and removeWatch methods.
    +
    +## dev / 2014-06-12
    +
    +* [API] Renamed Watch() to Add() and RemoveWatch() to Remove().
    +* [API] Pluralized channel names: Events and Errors.
    +* [API] Renamed FileEvent struct to Event.
    +* [API] Op constants replace methods like IsCreate().
    +
    +## dev / 2014-06-12
    +
    +* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98)
    +
    +## dev / 2014-05-23
    +
    +* [API] Remove current implementation of WatchFlags.
    +    * current implementation doesn't take advantage of OS for efficiency
    +    * provides little benefit over filtering events as they are received, but has  extra bookkeeping and mutexes
    +    * no tests for the current implementation
    +    * not fully implemented on Windows [#93](https://github.com/howeyc/fsnotify/issues/93#issuecomment-39285195)
    +
    +## v0.9.3 / 2014-12-31
    +
    +* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51)
    +
    +## v0.9.2 / 2014-08-17
    +
    +* [Backport] Fix missing create events on OS X. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso)
    +
    +## v0.9.1 / 2014-06-12
    +
    +* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98)
    +
    +## v0.9.0 / 2014-01-17
    +
    +* IsAttrib() for events that only concern a file's metadata [#79][] (thanks @abustany)
    +* [Fix] kqueue: fix deadlock [#77][] (thanks @cespare)
    +* [NOTICE] Development has moved to `code.google.com/p/go.exp/fsnotify` in preparation for inclusion in the Go standard library.
    +
    +## v0.8.12 / 2013-11-13
    +
    +* [API] Remove FD_SET and friends from Linux adapter
    +
    +## v0.8.11 / 2013-11-02
    +
    +* [Doc] Add Changelog [#72][] (thanks @nathany)
    +* [Doc] Spotlight and double modify events on OS X [#62][] (reported by @paulhammond)
    +
    +## v0.8.10 / 2013-10-19
    +
    +* [Fix] kqueue: remove file watches when parent directory is removed [#71][] (reported by @mdwhatcott)
    +* [Fix] kqueue: race between Close and readEvents [#70][] (reported by @bernerdschaefer)
    +* [Doc] specify OS-specific limits in README (thanks @debrando)
    +
    +## v0.8.9 / 2013-09-08
    +
    +* [Doc] Contributing (thanks @nathany)
    +* [Doc] update package path in example code [#63][] (thanks @paulhammond)
    +* [Doc] GoCI badge in README (Linux only) [#60][]
    +* [Doc] Cross-platform testing with Vagrant  [#59][] (thanks @nathany)
    +
    +## v0.8.8 / 2013-06-17
    +
    +* [Fix] Windows: handle `ERROR_MORE_DATA` on Windows [#49][] (thanks @jbowtie)
    +
    +## v0.8.7 / 2013-06-03
    +
    +* [API] Make syscall flags internal
    +* [Fix] inotify: ignore event changes
    +* [Fix] race in symlink test [#45][] (reported by @srid)
    +* [Fix] tests on Windows
    +* lower case error messages
    +
    +## v0.8.6 / 2013-05-23
    +
    +* kqueue: Use EVT_ONLY flag on Darwin
    +* [Doc] Update README with full example
    +
    +## v0.8.5 / 2013-05-09
    +
    +* [Fix] inotify: allow monitoring of "broken" symlinks (thanks @tsg)
    +
    +## v0.8.4 / 2013-04-07
    +
    +* [Fix] kqueue: watch all file events [#40][] (thanks @ChrisBuchholz)
    +
    +## v0.8.3 / 2013-03-13
    +
    +* [Fix] inoitfy/kqueue memory leak [#36][] (reported by @nbkolchin)
    +* [Fix] kqueue: use fsnFlags for watching a directory [#33][] (reported by @nbkolchin)
    +
    +## v0.8.2 / 2013-02-07
    +
    +* [Doc] add Authors
    +* [Fix] fix data races for map access [#29][] (thanks @fsouza)
    +
    +## v0.8.1 / 2013-01-09
    +
    +* [Fix] Windows path separators
    +* [Doc] BSD License
    +
    +## v0.8.0 / 2012-11-09
    +
    +* kqueue: directory watching improvements (thanks @vmirage)
    +* inotify: add `IN_MOVED_TO` [#25][] (requested by @cpisto)
    +* [Fix] kqueue: deleting watched directory [#24][] (reported by @jakerr)
    +
    +## v0.7.4 / 2012-10-09
    +
    +* [Fix] inotify: fixes from https://codereview.appspot.com/5418045/ (ugorji)
    +* [Fix] kqueue: preserve watch flags when watching for delete [#21][] (reported by @robfig)
    +* [Fix] kqueue: watch the directory even if it isn't a new watch (thanks @robfig)
    +* [Fix] kqueue: modify after recreation of file
    +
    +## v0.7.3 / 2012-09-27
    +
    +* [Fix] kqueue: watch with an existing folder inside the watched folder (thanks @vmirage)
    +* [Fix] kqueue: no longer get duplicate CREATE events
    +
    +## v0.7.2 / 2012-09-01
    +
    +* kqueue: events for created directories
    +
    +## v0.7.1 / 2012-07-14
    +
    +* [Fix] for renaming files
    +
    +## v0.7.0 / 2012-07-02
    +
    +* [Feature] FSNotify flags
    +* [Fix] inotify: Added file name back to event path
    +
    +## v0.6.0 / 2012-06-06
    +
    +* kqueue: watch files after directory created (thanks @tmc)
    +
    +## v0.5.1 / 2012-05-22
    +
    +* [Fix] inotify: remove all watches before Close()
    +
    +## v0.5.0 / 2012-05-03
    +
    +* [API] kqueue: return errors during watch instead of sending over channel
    +* kqueue: match symlink behavior on Linux
    +* inotify: add `DELETE_SELF` (requested by @taralx)
    +* [Fix] kqueue: handle EINTR (reported by @robfig)
    +* [Doc] Godoc example [#1][] (thanks @davecheney)
    +
    +## v0.4.0 / 2012-03-30
    +
    +* Go 1 released: build with go tool
    +* [Feature] Windows support using winfsnotify
    +* Windows does not have attribute change notifications
    +* Roll attribute notifications into IsModify
    +
    +## v0.3.0 / 2012-02-19
    +
    +* kqueue: add files when watch directory
    +
    +## v0.2.0 / 2011-12-30
    +
    +* update to latest Go weekly code
    +
    +## v0.1.0 / 2011-10-19
    +
    +* kqueue: add watch on file creation to match inotify
    +* kqueue: create file event
    +* inotify: ignore `IN_IGNORED` events
    +* event String()
    +* linux: common FileEvent functions
    +* initial commit
    +
    +[#79]: https://github.com/howeyc/fsnotify/pull/79
    +[#77]: https://github.com/howeyc/fsnotify/pull/77
    +[#72]: https://github.com/howeyc/fsnotify/issues/72
    +[#71]: https://github.com/howeyc/fsnotify/issues/71
    +[#70]: https://github.com/howeyc/fsnotify/issues/70
    +[#63]: https://github.com/howeyc/fsnotify/issues/63
    +[#62]: https://github.com/howeyc/fsnotify/issues/62
    +[#60]: https://github.com/howeyc/fsnotify/issues/60
    +[#59]: https://github.com/howeyc/fsnotify/issues/59
    +[#49]: https://github.com/howeyc/fsnotify/issues/49
    +[#45]: https://github.com/howeyc/fsnotify/issues/45
    +[#40]: https://github.com/howeyc/fsnotify/issues/40
    +[#36]: https://github.com/howeyc/fsnotify/issues/36
    +[#33]: https://github.com/howeyc/fsnotify/issues/33
    +[#29]: https://github.com/howeyc/fsnotify/issues/29
    +[#25]: https://github.com/howeyc/fsnotify/issues/25
    +[#24]: https://github.com/howeyc/fsnotify/issues/24
    +[#21]: https://github.com/howeyc/fsnotify/issues/21
    diff --git a/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md b/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md
    new file mode 100644
    index 0000000000..617e45a06e
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/CONTRIBUTING.md
    @@ -0,0 +1,77 @@
    +# Contributing
    +
    +## Issues
    +
    +* Request features and report bugs using the [GitHub Issue Tracker](https://github.com/fsnotify/fsnotify/issues).
    +* Please indicate the platform you are using fsnotify on.
    +* A code example to reproduce the problem is appreciated.
    +
    +## Pull Requests
    +
    +### Contributor License Agreement
    +
    +fsnotify is derived from code in the [golang.org/x/exp](https://godoc.org/golang.org/x/exp) package and it may be included [in the standard library](https://github.com/fsnotify/fsnotify/issues/1) in the future. Therefore fsnotify carries the same [LICENSE](https://github.com/fsnotify/fsnotify/blob/master/LICENSE) as Go. Contributors retain their copyright, so you need to fill out a short form before we can accept your contribution: [Google Individual Contributor License Agreement](https://developers.google.com/open-source/cla/individual).
    +
    +Please indicate that you have signed the CLA in your pull request.
    +
    +### How fsnotify is Developed
    +
    +* Development is done on feature branches.
    +* Tests are run on BSD, Linux, OS X and Windows.
    +* Pull requests are reviewed and [applied to master][am] using [hub][].
    +  * Maintainers may modify or squash commits rather than asking contributors to.
    +* To issue a new release, the maintainers will:
    +  * Update the CHANGELOG
    +  * Tag a version, which will become available through gopkg.in.
    + 
    +### How to Fork
    +
    +For smooth sailing, always use the original import path. Installing with `go get` makes this easy. 
    +
    +1. Install from GitHub (`go get -u github.com/fsnotify/fsnotify`)
    +2. Create your feature branch (`git checkout -b my-new-feature`)
    +3. Ensure everything works and the tests pass (see below)
    +4. Commit your changes (`git commit -am 'Add some feature'`)
    +
    +Contribute upstream:
    +
    +1. Fork fsnotify on GitHub
    +2. Add your remote (`git remote add fork git@github.com:mycompany/repo.git`)
    +3. Push to the branch (`git push fork my-new-feature`)
    +4. Create a new Pull Request on GitHub
    +
    +This workflow is [thoroughly explained by Katrina Owen](https://blog.splice.com/contributing-open-source-git-repositories-go/).
    +
    +### Testing
    +
    +fsnotify uses build tags to compile different code on Linux, BSD, OS X, and Windows.
    +
    +Before doing a pull request, please do your best to test your changes on multiple platforms, and list which platforms you were able/unable to test on.
    +
    +To aid in cross-platform testing there is a Vagrantfile for Linux and BSD.
    +
    +* Install [Vagrant](http://www.vagrantup.com/) and [VirtualBox](https://www.virtualbox.org/)
    +* Setup [Vagrant Gopher](https://github.com/nathany/vagrant-gopher) in your `src` folder.
    +* Run `vagrant up` from the project folder. You can also setup just one box with `vagrant up linux` or `vagrant up bsd` (note: the BSD box doesn't support Windows hosts at this time, and NFS may prompt for your host OS password)
    +* Once setup, you can run the test suite on a given OS with a single command `vagrant ssh linux -c 'cd fsnotify/fsnotify; go test'`.
    +* When you're done, you will want to halt or destroy the Vagrant boxes.
    +
    +Notice: fsnotify file system events won't trigger in shared folders. The tests get around this limitation by using the /tmp directory.
    +
    +Right now there is no equivalent solution for Windows and OS X, but there are Windows VMs [freely available from Microsoft](http://www.modern.ie/en-us/virtualization-tools#downloads).
    +
    +### Maintainers
    +
    +Help maintaining fsnotify is welcome. To be a maintainer:
    +
    +* Submit a pull request and sign the CLA as above.
    +* You must be able to run the test suite on Mac, Windows, Linux and BSD.
    +
    +To keep master clean, the fsnotify project uses the "apply mail" workflow outlined in Nathaniel Talbott's post ["Merge pull request" Considered Harmful][am]. This requires installing [hub][].
    +
    +All code changes should be internal pull requests.
    +
    +Releases are tagged using [Semantic Versioning](http://semver.org/).
    +
    +[hub]: https://github.com/github/hub
    +[am]: http://blog.spreedly.com/2014/06/24/merge-pull-request-considered-harmful/#.VGa5yZPF_Zs
    diff --git a/vendor/gopkg.in/fsnotify.v1/LICENSE b/vendor/gopkg.in/fsnotify.v1/LICENSE
    new file mode 100644
    index 0000000000..f21e540800
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/LICENSE
    @@ -0,0 +1,28 @@
    +Copyright (c) 2012 The Go Authors. All rights reserved.
    +Copyright (c) 2012 fsnotify Authors. All rights reserved.
    +
    +Redistribution and use in source and binary forms, with or without
    +modification, are permitted provided that the following conditions are
    +met:
    +
    +   * Redistributions of source code must retain the above copyright
    +notice, this list of conditions and the following disclaimer.
    +   * Redistributions in binary form must reproduce the above
    +copyright notice, this list of conditions and the following disclaimer
    +in the documentation and/or other materials provided with the
    +distribution.
    +   * Neither the name of Google Inc. nor the names of its
    +contributors may be used to endorse or promote products derived from
    +this software without specific prior written permission.
    +
    +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    diff --git a/vendor/gopkg.in/fsnotify.v1/README.md b/vendor/gopkg.in/fsnotify.v1/README.md
    new file mode 100644
    index 0000000000..ba184c0639
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/README.md
    @@ -0,0 +1,46 @@
    +# File system notifications for Go
    +
    +[![GoDoc](https://godoc.org/github.com/fsnotify/fsnotify?status.svg)](https://godoc.org/github.com/fsnotify/fsnotify) [![Go Report Card](https://goreportcard.com/badge/github.com/fsnotify/fsnotify)](https://goreportcard.com/report/github.com/fsnotify/fsnotify) [![Coverage](http://gocover.io/_badge/github.com/fsnotify/fsnotify)](http://gocover.io/github.com/fsnotify/fsnotify) 
    +
    +Go 1.3+ required.
    +
    +Cross platform: Windows, Linux, BSD and OS X.
    +
    +|Adapter   |OS        |Status    |
    +|----------|----------|----------|
    +|inotify   |Linux 2.6.27 or later, Android\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)|
    +|kqueue    |BSD, OS X, iOS\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)|
    +|ReadDirectoryChangesW|Windows|Supported [![Build status](https://ci.appveyor.com/api/projects/status/ivwjubaih4r0udeh/branch/master?svg=true)](https://ci.appveyor.com/project/NathanYoungman/fsnotify/branch/master)|
    +|FSEvents  |OS X          |[Planned](https://github.com/fsnotify/fsnotify/issues/11)|
    +|FEN       |Solaris 11    |[Planned](https://github.com/fsnotify/fsnotify/issues/12)|
    +|fanotify  |Linux 2.6.37+ | |
    +|USN Journals |Windows    |[Maybe](https://github.com/fsnotify/fsnotify/issues/53)|
    +|Polling   |*All*         |[Maybe](https://github.com/fsnotify/fsnotify/issues/9)|
    +
    +\* Android and iOS are untested.
    +
    +Please see [the documentation](https://godoc.org/github.com/fsnotify/fsnotify) for usage. Consult the [Wiki](https://github.com/fsnotify/fsnotify/wiki) for the FAQ and further information.
    +
    +## API stability
    +
    +fsnotify is a fork of [howeyc/fsnotify](https://godoc.org/github.com/howeyc/fsnotify) with a new API as of v1.0. The API is based on [this design document](http://goo.gl/MrYxyA). 
    +
    +All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based on [Semantic Versioning](http://semver.org/). Further API changes are [planned](https://github.com/fsnotify/fsnotify/milestones), and will be tagged with a new major revision number.
    +
    +Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project.
    +
    +## Contributing
    +
    +Please refer to [CONTRIBUTING][] before opening an issue or pull request.
    +
    +## Example
    +
    +See [example_test.go](https://github.com/fsnotify/fsnotify/blob/master/example_test.go).
    +
    +[contributing]: https://github.com/fsnotify/fsnotify/blob/master/CONTRIBUTING.md
    +
    +## Related Projects
    +
    +* [notify](https://github.com/rjeczalik/notify)
    +* [fsevents](https://github.com/fsnotify/fsevents)
    +
    diff --git a/vendor/gopkg.in/fsnotify.v1/example_test.go b/vendor/gopkg.in/fsnotify.v1/example_test.go
    new file mode 100644
    index 0000000000..d65cdf3cfe
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/example_test.go
    @@ -0,0 +1,42 @@
    +// Copyright 2012 The Go Authors. All rights reserved.
    +// Use of this source code is governed by a BSD-style
    +// license that can be found in the LICENSE file.
    +
    +// +build !plan9,!solaris
    +
    +package fsnotify_test
    +
    +import (
    +	"log"
    +
    +	"github.com/fsnotify/fsnotify"
    +)
    +
    +func ExampleNewWatcher() {
    +	watcher, err := fsnotify.NewWatcher()
    +	if err != nil {
    +		log.Fatal(err)
    +	}
    +	defer watcher.Close()
    +
    +	done := make(chan bool)
    +	go func() {
    +		for {
    +			select {
    +			case event := <-watcher.Events:
    +				log.Println("event:", event)
    +				if event.Op&fsnotify.Write == fsnotify.Write {
    +					log.Println("modified file:", event.Name)
    +				}
    +			case err := <-watcher.Errors:
    +				log.Println("error:", err)
    +			}
    +		}
    +	}()
    +
    +	err = watcher.Add("/tmp/foo")
    +	if err != nil {
    +		log.Fatal(err)
    +	}
    +	<-done
    +}
    diff --git a/vendor/gopkg.in/fsnotify.v1/fsnotify.go b/vendor/gopkg.in/fsnotify.v1/fsnotify.go
    new file mode 100644
    index 0000000000..c899ee0083
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/fsnotify.go
    @@ -0,0 +1,62 @@
    +// Copyright 2012 The Go Authors. All rights reserved.
    +// Use of this source code is governed by a BSD-style
    +// license that can be found in the LICENSE file.
    +
    +// +build !plan9,!solaris
    +
    +// Package fsnotify provides a platform-independent interface for file system notifications.
    +package fsnotify
    +
    +import (
    +	"bytes"
    +	"fmt"
    +)
    +
    +// Event represents a single file system notification.
    +type Event struct {
    +	Name string // Relative path to the file or directory.
    +	Op   Op     // File operation that triggered the event.
    +}
    +
    +// Op describes a set of file operations.
    +type Op uint32
    +
    +// These are the generalized file operations that can trigger a notification.
    +const (
    +	Create Op = 1 << iota
    +	Write
    +	Remove
    +	Rename
    +	Chmod
    +)
    +
    +// String returns a string representation of the event in the form
    +// "file: REMOVE|WRITE|..."
    +func (e Event) String() string {
    +	// Use a buffer for efficient string concatenation
    +	var buffer bytes.Buffer
    +
    +	if e.Op&Create == Create {
    +		buffer.WriteString("|CREATE")
    +	}
    +	if e.Op&Remove == Remove {
    +		buffer.WriteString("|REMOVE")
    +	}
    +	if e.Op&Write == Write {
    +		buffer.WriteString("|WRITE")
    +	}
    +	if e.Op&Rename == Rename {
    +		buffer.WriteString("|RENAME")
    +	}
    +	if e.Op&Chmod == Chmod {
    +		buffer.WriteString("|CHMOD")
    +	}
    +
    +	// If buffer remains empty, return no event names
    +	if buffer.Len() == 0 {
    +		return fmt.Sprintf("%q: ", e.Name)
    +	}
    +
    +	// Return a list of event names, with leading pipe character stripped
    +	return fmt.Sprintf("%q: %s", e.Name, buffer.String()[1:])
    +}
    diff --git a/vendor/gopkg.in/fsnotify.v1/inotify.go b/vendor/gopkg.in/fsnotify.v1/inotify.go
    new file mode 100644
    index 0000000000..06f4bba88e
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/inotify.go
    @@ -0,0 +1,324 @@
    +// Copyright 2010 The Go Authors. All rights reserved.
    +// Use of this source code is governed by a BSD-style
    +// license that can be found in the LICENSE file.
    +
    +// +build linux
    +
    +package fsnotify
    +
    +import (
    +	"errors"
    +	"fmt"
    +	"io"
    +	"os"
    +	"path/filepath"
    +	"strings"
    +	"sync"
    +	"syscall"
    +	"unsafe"
    +)
    +
    +// Watcher watches a set of files, delivering events to a channel.
    +type Watcher struct {
    +	Events   chan Event
    +	Errors   chan error
    +	mu       sync.Mutex // Map access
    +	cv       *sync.Cond // sync removing on rm_watch with IN_IGNORE
    +	fd       int
    +	poller   *fdPoller
    +	watches  map[string]*watch // Map of inotify watches (key: path)
    +	paths    map[int]string    // Map of watched paths (key: watch descriptor)
    +	done     chan struct{}     // Channel for sending a "quit message" to the reader goroutine
    +	doneResp chan struct{}     // Channel to respond to Close
    +}
    +
    +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events.
    +func NewWatcher() (*Watcher, error) {
    +	// Create inotify fd
    +	fd, errno := syscall.InotifyInit()
    +	if fd == -1 {
    +		return nil, errno
    +	}
    +	// Create epoll
    +	poller, err := newFdPoller(fd)
    +	if err != nil {
    +		syscall.Close(fd)
    +		return nil, err
    +	}
    +	w := &Watcher{
    +		fd:       fd,
    +		poller:   poller,
    +		watches:  make(map[string]*watch),
    +		paths:    make(map[int]string),
    +		Events:   make(chan Event),
    +		Errors:   make(chan error),
    +		done:     make(chan struct{}),
    +		doneResp: make(chan struct{}),
    +	}
    +	w.cv = sync.NewCond(&w.mu)
    +
    +	go w.readEvents()
    +	return w, nil
    +}
    +
    +func (w *Watcher) isClosed() bool {
    +	select {
    +	case <-w.done:
    +		return true
    +	default:
    +		return false
    +	}
    +}
    +
    +// Close removes all watches and closes the events channel.
    +func (w *Watcher) Close() error {
    +	if w.isClosed() {
    +		return nil
    +	}
    +
    +	// Send 'close' signal to goroutine, and set the Watcher to closed.
    +	close(w.done)
    +
    +	// Wake up goroutine
    +	w.poller.wake()
    +
    +	// Wait for goroutine to close
    +	<-w.doneResp
    +
    +	return nil
    +}
    +
    +// Add starts watching the named file or directory (non-recursively).
    +func (w *Watcher) Add(name string) error {
    +	name = filepath.Clean(name)
    +	if w.isClosed() {
    +		return errors.New("inotify instance already closed")
    +	}
    +
    +	const agnosticEvents = syscall.IN_MOVED_TO | syscall.IN_MOVED_FROM |
    +		syscall.IN_CREATE | syscall.IN_ATTRIB | syscall.IN_MODIFY |
    +		syscall.IN_MOVE_SELF | syscall.IN_DELETE | syscall.IN_DELETE_SELF
    +
    +	var flags uint32 = agnosticEvents
    +
    +	w.mu.Lock()
    +	watchEntry, found := w.watches[name]
    +	w.mu.Unlock()
    +	if found {
    +		watchEntry.flags |= flags
    +		flags |= syscall.IN_MASK_ADD
    +	}
    +	wd, errno := syscall.InotifyAddWatch(w.fd, name, flags)
    +	if wd == -1 {
    +		return errno
    +	}
    +
    +	w.mu.Lock()
    +	w.watches[name] = &watch{wd: uint32(wd), flags: flags}
    +	w.paths[wd] = name
    +	w.mu.Unlock()
    +
    +	return nil
    +}
    +
    +// Remove stops watching the named file or directory (non-recursively).
    +func (w *Watcher) Remove(name string) error {
    +	name = filepath.Clean(name)
    +
    +	// Fetch the watch.
    +	w.mu.Lock()
    +	defer w.mu.Unlock()
    +	watch, ok := w.watches[name]
    +
    +	// Remove it from inotify.
    +	if !ok {
    +		return fmt.Errorf("can't remove non-existent inotify watch for: %s", name)
    +	}
    +	// inotify_rm_watch will return EINVAL if the file has been deleted;
    +	// the inotify will already have been removed.
    +	// watches and pathes are deleted in ignoreLinux() implicitly and asynchronously
    +	// by calling inotify_rm_watch() below. e.g. readEvents() goroutine receives IN_IGNORE
    +	// so that EINVAL means that the wd is being rm_watch()ed or its file removed
    +	// by another thread and we have not received IN_IGNORE event.
    +	success, errno := syscall.InotifyRmWatch(w.fd, watch.wd)
    +	if success == -1 {
    +		// TODO: Perhaps it's not helpful to return an error here in every case.
    +		// the only two possible errors are:
    +		// EBADF, which happens when w.fd is not a valid file descriptor of any kind.
    +		// EINVAL, which is when fd is not an inotify descriptor or wd is not a valid watch descriptor.
    +		// Watch descriptors are invalidated when they are removed explicitly or implicitly;
    +		// explicitly by inotify_rm_watch, implicitly when the file they are watching is deleted.
    +		return errno
    +	}
    +
    +	// wait until ignoreLinux() deleting maps
    +	exists := true
    +	for exists {
    +		w.cv.Wait()
    +		_, exists = w.watches[name]
    +	}
    +
    +	return nil
    +}
    +
    +type watch struct {
    +	wd    uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall)
    +	flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags)
    +}
    +
    +// readEvents reads from the inotify file descriptor, converts the
    +// received events into Event objects and sends them via the Events channel
    +func (w *Watcher) readEvents() {
    +	var (
    +		buf   [syscall.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events
    +		n     int                                     // Number of bytes read with read()
    +		errno error                                   // Syscall errno
    +		ok    bool                                    // For poller.wait
    +	)
    +
    +	defer close(w.doneResp)
    +	defer close(w.Errors)
    +	defer close(w.Events)
    +	defer syscall.Close(w.fd)
    +	defer w.poller.close()
    +
    +	for {
    +		// See if we have been closed.
    +		if w.isClosed() {
    +			return
    +		}
    +
    +		ok, errno = w.poller.wait()
    +		if errno != nil {
    +			select {
    +			case w.Errors <- errno:
    +			case <-w.done:
    +				return
    +			}
    +			continue
    +		}
    +
    +		if !ok {
    +			continue
    +		}
    +
    +		n, errno = syscall.Read(w.fd, buf[:])
    +		// If a signal interrupted execution, see if we've been asked to close, and try again.
    +		// http://man7.org/linux/man-pages/man7/signal.7.html :
    +		// "Before Linux 3.8, reads from an inotify(7) file descriptor were not restartable"
    +		if errno == syscall.EINTR {
    +			continue
    +		}
    +
    +		// syscall.Read might have been woken up by Close. If so, we're done.
    +		if w.isClosed() {
    +			return
    +		}
    +
    +		if n < syscall.SizeofInotifyEvent {
    +			var err error
    +			if n == 0 {
    +				// If EOF is received. This should really never happen.
    +				err = io.EOF
    +			} else if n < 0 {
    +				// If an error occured while reading.
    +				err = errno
    +			} else {
    +				// Read was too short.
    +				err = errors.New("notify: short read in readEvents()")
    +			}
    +			select {
    +			case w.Errors <- err:
    +			case <-w.done:
    +				return
    +			}
    +			continue
    +		}
    +
    +		var offset uint32
    +		// We don't know how many events we just read into the buffer
    +		// While the offset points to at least one whole event...
    +		for offset <= uint32(n-syscall.SizeofInotifyEvent) {
    +			// Point "raw" to the event in the buffer
    +			raw := (*syscall.InotifyEvent)(unsafe.Pointer(&buf[offset]))
    +
    +			mask := uint32(raw.Mask)
    +			nameLen := uint32(raw.Len)
    +			// If the event happened to the watched directory or the watched file, the kernel
    +			// doesn't append the filename to the event, but we would like to always fill the
    +			// the "Name" field with a valid filename. We retrieve the path of the watch from
    +			// the "paths" map.
    +			w.mu.Lock()
    +			name := w.paths[int(raw.Wd)]
    +			w.mu.Unlock()
    +			if nameLen > 0 {
    +				// Point "bytes" at the first byte of the filename
    +				bytes := (*[syscall.PathMax]byte)(unsafe.Pointer(&buf[offset+syscall.SizeofInotifyEvent]))
    +				// The filename is padded with NULL bytes. TrimRight() gets rid of those.
    +				name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000")
    +			}
    +
    +			event := newEvent(name, mask)
    +
    +			// Send the events that are not ignored on the events channel
    +			if !event.ignoreLinux(w, raw.Wd, mask) {
    +				select {
    +				case w.Events <- event:
    +				case <-w.done:
    +					return
    +				}
    +			}
    +
    +			// Move to the next event in the buffer
    +			offset += syscall.SizeofInotifyEvent + nameLen
    +		}
    +	}
    +}
    +
    +// Certain types of events can be "ignored" and not sent over the Events
    +// channel. Such as events marked ignore by the kernel, or MODIFY events
    +// against files that do not exist.
    +func (e *Event) ignoreLinux(w *Watcher, wd int32, mask uint32) bool {
    +	// Ignore anything the inotify API says to ignore
    +	if mask&syscall.IN_IGNORED == syscall.IN_IGNORED {
    +		w.mu.Lock()
    +		defer w.mu.Unlock()
    +		name := w.paths[int(wd)]
    +		delete(w.paths, int(wd))
    +		delete(w.watches, name)
    +		w.cv.Broadcast()
    +		return true
    +	}
    +
    +	// If the event is not a DELETE or RENAME, the file must exist.
    +	// Otherwise the event is ignored.
    +	// *Note*: this was put in place because it was seen that a MODIFY
    +	// event was sent after the DELETE. This ignores that MODIFY and
    +	// assumes a DELETE will come or has come if the file doesn't exist.
    +	if !(e.Op&Remove == Remove || e.Op&Rename == Rename) {
    +		_, statErr := os.Lstat(e.Name)
    +		return os.IsNotExist(statErr)
    +	}
    +	return false
    +}
    +
    +// newEvent returns an platform-independent Event based on an inotify mask.
    +func newEvent(name string, mask uint32) Event {
    +	e := Event{Name: name}
    +	if mask&syscall.IN_CREATE == syscall.IN_CREATE || mask&syscall.IN_MOVED_TO == syscall.IN_MOVED_TO {
    +		e.Op |= Create
    +	}
    +	if mask&syscall.IN_DELETE_SELF == syscall.IN_DELETE_SELF || mask&syscall.IN_DELETE == syscall.IN_DELETE {
    +		e.Op |= Remove
    +	}
    +	if mask&syscall.IN_MODIFY == syscall.IN_MODIFY {
    +		e.Op |= Write
    +	}
    +	if mask&syscall.IN_MOVE_SELF == syscall.IN_MOVE_SELF || mask&syscall.IN_MOVED_FROM == syscall.IN_MOVED_FROM {
    +		e.Op |= Rename
    +	}
    +	if mask&syscall.IN_ATTRIB == syscall.IN_ATTRIB {
    +		e.Op |= Chmod
    +	}
    +	return e
    +}
    diff --git a/vendor/gopkg.in/fsnotify.v1/inotify_poller.go b/vendor/gopkg.in/fsnotify.v1/inotify_poller.go
    new file mode 100644
    index 0000000000..23a5ca1460
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/inotify_poller.go
    @@ -0,0 +1,186 @@
    +// 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 linux
    +
    +package fsnotify
    +
    +import (
    +	"errors"
    +	"syscall"
    +)
    +
    +type fdPoller struct {
    +	fd   int    // File descriptor (as returned by the inotify_init() syscall)
    +	epfd int    // Epoll file descriptor
    +	pipe [2]int // Pipe for waking up
    +}
    +
    +func emptyPoller(fd int) *fdPoller {
    +	poller := new(fdPoller)
    +	poller.fd = fd
    +	poller.epfd = -1
    +	poller.pipe[0] = -1
    +	poller.pipe[1] = -1
    +	return poller
    +}
    +
    +// Create a new inotify poller.
    +// This creates an inotify handler, and an epoll handler.
    +func newFdPoller(fd int) (*fdPoller, error) {
    +	var errno error
    +	poller := emptyPoller(fd)
    +	defer func() {
    +		if errno != nil {
    +			poller.close()
    +		}
    +	}()
    +	poller.fd = fd
    +
    +	// Create epoll fd
    +	poller.epfd, errno = syscall.EpollCreate1(0)
    +	if poller.epfd == -1 {
    +		return nil, errno
    +	}
    +	// Create pipe; pipe[0] is the read end, pipe[1] the write end.
    +	errno = syscall.Pipe2(poller.pipe[:], syscall.O_NONBLOCK)
    +	if errno != nil {
    +		return nil, errno
    +	}
    +
    +	// Register inotify fd with epoll
    +	event := syscall.EpollEvent{
    +		Fd:     int32(poller.fd),
    +		Events: syscall.EPOLLIN,
    +	}
    +	errno = syscall.EpollCtl(poller.epfd, syscall.EPOLL_CTL_ADD, poller.fd, &event)
    +	if errno != nil {
    +		return nil, errno
    +	}
    +
    +	// Register pipe fd with epoll
    +	event = syscall.EpollEvent{
    +		Fd:     int32(poller.pipe[0]),
    +		Events: syscall.EPOLLIN,
    +	}
    +	errno = syscall.EpollCtl(poller.epfd, syscall.EPOLL_CTL_ADD, poller.pipe[0], &event)
    +	if errno != nil {
    +		return nil, errno
    +	}
    +
    +	return poller, nil
    +}
    +
    +// Wait using epoll.
    +// Returns true if something is ready to be read,
    +// false if there is not.
    +func (poller *fdPoller) wait() (bool, error) {
    +	// 3 possible events per fd, and 2 fds, makes a maximum of 6 events.
    +	// I don't know whether epoll_wait returns the number of events returned,
    +	// or the total number of events ready.
    +	// I decided to catch both by making the buffer one larger than the maximum.
    +	events := make([]syscall.EpollEvent, 7)
    +	for {
    +		n, errno := syscall.EpollWait(poller.epfd, events, -1)
    +		if n == -1 {
    +			if errno == syscall.EINTR {
    +				continue
    +			}
    +			return false, errno
    +		}
    +		if n == 0 {
    +			// If there are no events, try again.
    +			continue
    +		}
    +		if n > 6 {
    +			// This should never happen. More events were returned than should be possible.
    +			return false, errors.New("epoll_wait returned more events than I know what to do with")
    +		}
    +		ready := events[:n]
    +		epollhup := false
    +		epollerr := false
    +		epollin := false
    +		for _, event := range ready {
    +			if event.Fd == int32(poller.fd) {
    +				if event.Events&syscall.EPOLLHUP != 0 {
    +					// This should not happen, but if it does, treat it as a wakeup.
    +					epollhup = true
    +				}
    +				if event.Events&syscall.EPOLLERR != 0 {
    +					// If an error is waiting on the file descriptor, we should pretend
    +					// something is ready to read, and let syscall.Read pick up the error.
    +					epollerr = true
    +				}
    +				if event.Events&syscall.EPOLLIN != 0 {
    +					// There is data to read.
    +					epollin = true
    +				}
    +			}
    +			if event.Fd == int32(poller.pipe[0]) {
    +				if event.Events&syscall.EPOLLHUP != 0 {
    +					// Write pipe descriptor was closed, by us. This means we're closing down the
    +					// watcher, and we should wake up.
    +				}
    +				if event.Events&syscall.EPOLLERR != 0 {
    +					// If an error is waiting on the pipe file descriptor.
    +					// This is an absolute mystery, and should never ever happen.
    +					return false, errors.New("Error on the pipe descriptor.")
    +				}
    +				if event.Events&syscall.EPOLLIN != 0 {
    +					// This is a regular wakeup, so we have to clear the buffer.
    +					err := poller.clearWake()
    +					if err != nil {
    +						return false, err
    +					}
    +				}
    +			}
    +		}
    +
    +		if epollhup || epollerr || epollin {
    +			return true, nil
    +		}
    +		return false, nil
    +	}
    +}
    +
    +// Close the write end of the poller.
    +func (poller *fdPoller) wake() error {
    +	buf := make([]byte, 1)
    +	n, errno := syscall.Write(poller.pipe[1], buf)
    +	if n == -1 {
    +		if errno == syscall.EAGAIN {
    +			// Buffer is full, poller will wake.
    +			return nil
    +		}
    +		return errno
    +	}
    +	return nil
    +}
    +
    +func (poller *fdPoller) clearWake() error {
    +	// You have to be woken up a LOT in order to get to 100!
    +	buf := make([]byte, 100)
    +	n, errno := syscall.Read(poller.pipe[0], buf)
    +	if n == -1 {
    +		if errno == syscall.EAGAIN {
    +			// Buffer is empty, someone else cleared our wake.
    +			return nil
    +		}
    +		return errno
    +	}
    +	return nil
    +}
    +
    +// Close all poller file descriptors, but not the one passed to it.
    +func (poller *fdPoller) close() {
    +	if poller.pipe[1] != -1 {
    +		syscall.Close(poller.pipe[1])
    +	}
    +	if poller.pipe[0] != -1 {
    +		syscall.Close(poller.pipe[0])
    +	}
    +	if poller.epfd != -1 {
    +		syscall.Close(poller.epfd)
    +	}
    +}
    diff --git a/vendor/gopkg.in/fsnotify.v1/inotify_poller_test.go b/vendor/gopkg.in/fsnotify.v1/inotify_poller_test.go
    new file mode 100644
    index 0000000000..af9f407f8d
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/inotify_poller_test.go
    @@ -0,0 +1,228 @@
    +// 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 linux
    +
    +package fsnotify
    +
    +import (
    +	"syscall"
    +	"testing"
    +	"time"
    +)
    +
    +type testFd [2]int
    +
    +func makeTestFd(t *testing.T) testFd {
    +	var tfd testFd
    +	errno := syscall.Pipe(tfd[:])
    +	if errno != nil {
    +		t.Fatalf("Failed to create pipe: %v", errno)
    +	}
    +	return tfd
    +}
    +
    +func (tfd testFd) fd() int {
    +	return tfd[0]
    +}
    +
    +func (tfd testFd) closeWrite(t *testing.T) {
    +	errno := syscall.Close(tfd[1])
    +	if errno != nil {
    +		t.Fatalf("Failed to close write end of pipe: %v", errno)
    +	}
    +}
    +
    +func (tfd testFd) put(t *testing.T) {
    +	buf := make([]byte, 10)
    +	_, errno := syscall.Write(tfd[1], buf)
    +	if errno != nil {
    +		t.Fatalf("Failed to write to pipe: %v", errno)
    +	}
    +}
    +
    +func (tfd testFd) get(t *testing.T) {
    +	buf := make([]byte, 10)
    +	_, errno := syscall.Read(tfd[0], buf)
    +	if errno != nil {
    +		t.Fatalf("Failed to read from pipe: %v", errno)
    +	}
    +}
    +
    +func (tfd testFd) close() {
    +	syscall.Close(tfd[1])
    +	syscall.Close(tfd[0])
    +}
    +
    +func makePoller(t *testing.T) (testFd, *fdPoller) {
    +	tfd := makeTestFd(t)
    +	poller, err := newFdPoller(tfd.fd())
    +	if err != nil {
    +		t.Fatalf("Failed to create poller: %v", err)
    +	}
    +	return tfd, poller
    +}
    +
    +func TestPollerWithBadFd(t *testing.T) {
    +	_, err := newFdPoller(-1)
    +	if err != syscall.EBADF {
    +		t.Fatalf("Expected EBADF, got: %v", err)
    +	}
    +}
    +
    +func TestPollerWithData(t *testing.T) {
    +	tfd, poller := makePoller(t)
    +	defer tfd.close()
    +	defer poller.close()
    +
    +	tfd.put(t)
    +	ok, err := poller.wait()
    +	if err != nil {
    +		t.Fatalf("poller failed: %v", err)
    +	}
    +	if !ok {
    +		t.Fatalf("expected poller to return true")
    +	}
    +	tfd.get(t)
    +}
    +
    +func TestPollerWithWakeup(t *testing.T) {
    +	tfd, poller := makePoller(t)
    +	defer tfd.close()
    +	defer poller.close()
    +
    +	err := poller.wake()
    +	if err != nil {
    +		t.Fatalf("wake failed: %v", err)
    +	}
    +	ok, err := poller.wait()
    +	if err != nil {
    +		t.Fatalf("poller failed: %v", err)
    +	}
    +	if ok {
    +		t.Fatalf("expected poller to return false")
    +	}
    +}
    +
    +func TestPollerWithClose(t *testing.T) {
    +	tfd, poller := makePoller(t)
    +	defer tfd.close()
    +	defer poller.close()
    +
    +	tfd.closeWrite(t)
    +	ok, err := poller.wait()
    +	if err != nil {
    +		t.Fatalf("poller failed: %v", err)
    +	}
    +	if !ok {
    +		t.Fatalf("expected poller to return true")
    +	}
    +}
    +
    +func TestPollerWithWakeupAndData(t *testing.T) {
    +	tfd, poller := makePoller(t)
    +	defer tfd.close()
    +	defer poller.close()
    +
    +	tfd.put(t)
    +	err := poller.wake()
    +	if err != nil {
    +		t.Fatalf("wake failed: %v", err)
    +	}
    +
    +	// both data and wakeup
    +	ok, err := poller.wait()
    +	if err != nil {
    +		t.Fatalf("poller failed: %v", err)
    +	}
    +	if !ok {
    +		t.Fatalf("expected poller to return true")
    +	}
    +
    +	// data is still in the buffer, wakeup is cleared
    +	ok, err = poller.wait()
    +	if err != nil {
    +		t.Fatalf("poller failed: %v", err)
    +	}
    +	if !ok {
    +		t.Fatalf("expected poller to return true")
    +	}
    +
    +	tfd.get(t)
    +	// data is gone, only wakeup now
    +	err = poller.wake()
    +	if err != nil {
    +		t.Fatalf("wake failed: %v", err)
    +	}
    +	ok, err = poller.wait()
    +	if err != nil {
    +		t.Fatalf("poller failed: %v", err)
    +	}
    +	if ok {
    +		t.Fatalf("expected poller to return false")
    +	}
    +}
    +
    +func TestPollerConcurrent(t *testing.T) {
    +	tfd, poller := makePoller(t)
    +	defer tfd.close()
    +	defer poller.close()
    +
    +	oks := make(chan bool)
    +	live := make(chan bool)
    +	defer close(live)
    +	go func() {
    +		defer close(oks)
    +		for {
    +			ok, err := poller.wait()
    +			if err != nil {
    +				t.Fatalf("poller failed: %v", err)
    +			}
    +			oks <- ok
    +			if !<-live {
    +				return
    +			}
    +		}
    +	}()
    +
    +	// Try a write
    +	select {
    +	case <-time.After(50 * time.Millisecond):
    +	case <-oks:
    +		t.Fatalf("poller did not wait")
    +	}
    +	tfd.put(t)
    +	if !<-oks {
    +		t.Fatalf("expected true")
    +	}
    +	tfd.get(t)
    +	live <- true
    +
    +	// Try a wakeup
    +	select {
    +	case <-time.After(50 * time.Millisecond):
    +	case <-oks:
    +		t.Fatalf("poller did not wait")
    +	}
    +	err := poller.wake()
    +	if err != nil {
    +		t.Fatalf("wake failed: %v", err)
    +	}
    +	if <-oks {
    +		t.Fatalf("expected false")
    +	}
    +	live <- true
    +
    +	// Try a close
    +	select {
    +	case <-time.After(50 * time.Millisecond):
    +	case <-oks:
    +		t.Fatalf("poller did not wait")
    +	}
    +	tfd.closeWrite(t)
    +	if !<-oks {
    +		t.Fatalf("expected true")
    +	}
    +	tfd.get(t)
    +}
    diff --git a/vendor/gopkg.in/fsnotify.v1/inotify_test.go b/vendor/gopkg.in/fsnotify.v1/inotify_test.go
    new file mode 100644
    index 0000000000..31660f8e13
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/inotify_test.go
    @@ -0,0 +1,343 @@
    +// 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 linux
    +
    +package fsnotify
    +
    +import (
    +	"fmt"
    +	"os"
    +	"path/filepath"
    +	"syscall"
    +	"testing"
    +	"time"
    +)
    +
    +func TestInotifyCloseRightAway(t *testing.T) {
    +	w, err := NewWatcher()
    +	if err != nil {
    +		t.Fatalf("Failed to create watcher")
    +	}
    +
    +	// Close immediately; it won't even reach the first syscall.Read.
    +	w.Close()
    +
    +	// Wait for the close to complete.
    +	<-time.After(50 * time.Millisecond)
    +	isWatcherReallyClosed(t, w)
    +}
    +
    +func TestInotifyCloseSlightlyLater(t *testing.T) {
    +	w, err := NewWatcher()
    +	if err != nil {
    +		t.Fatalf("Failed to create watcher")
    +	}
    +
    +	// Wait until readEvents has reached syscall.Read, and Close.
    +	<-time.After(50 * time.Millisecond)
    +	w.Close()
    +
    +	// Wait for the close to complete.
    +	<-time.After(50 * time.Millisecond)
    +	isWatcherReallyClosed(t, w)
    +}
    +
    +func TestInotifyCloseSlightlyLaterWithWatch(t *testing.T) {
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	w, err := NewWatcher()
    +	if err != nil {
    +		t.Fatalf("Failed to create watcher")
    +	}
    +	w.Add(testDir)
    +
    +	// Wait until readEvents has reached syscall.Read, and Close.
    +	<-time.After(50 * time.Millisecond)
    +	w.Close()
    +
    +	// Wait for the close to complete.
    +	<-time.After(50 * time.Millisecond)
    +	isWatcherReallyClosed(t, w)
    +}
    +
    +func TestInotifyCloseAfterRead(t *testing.T) {
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	w, err := NewWatcher()
    +	if err != nil {
    +		t.Fatalf("Failed to create watcher")
    +	}
    +
    +	err = w.Add(testDir)
    +	if err != nil {
    +		t.Fatalf("Failed to add .")
    +	}
    +
    +	// Generate an event.
    +	os.Create(filepath.Join(testDir, "somethingSOMETHINGsomethingSOMETHING"))
    +
    +	// Wait for readEvents to read the event, then close the watcher.
    +	<-time.After(50 * time.Millisecond)
    +	w.Close()
    +
    +	// Wait for the close to complete.
    +	<-time.After(50 * time.Millisecond)
    +	isWatcherReallyClosed(t, w)
    +}
    +
    +func isWatcherReallyClosed(t *testing.T, w *Watcher) {
    +	select {
    +	case err, ok := <-w.Errors:
    +		if ok {
    +			t.Fatalf("w.Errors is not closed; readEvents is still alive after closing (error: %v)", err)
    +		}
    +	default:
    +		t.Fatalf("w.Errors would have blocked; readEvents is still alive!")
    +	}
    +
    +	select {
    +	case _, ok := <-w.Events:
    +		if ok {
    +			t.Fatalf("w.Events is not closed; readEvents is still alive after closing")
    +		}
    +	default:
    +		t.Fatalf("w.Events would have blocked; readEvents is still alive!")
    +	}
    +}
    +
    +func TestInotifyCloseCreate(t *testing.T) {
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	w, err := NewWatcher()
    +	if err != nil {
    +		t.Fatalf("Failed to create watcher: %v", err)
    +	}
    +	defer w.Close()
    +
    +	err = w.Add(testDir)
    +	if err != nil {
    +		t.Fatalf("Failed to add testDir: %v", err)
    +	}
    +	h, err := os.Create(filepath.Join(testDir, "testfile"))
    +	if err != nil {
    +		t.Fatalf("Failed to create file in testdir: %v", err)
    +	}
    +	h.Close()
    +	select {
    +	case _ = <-w.Events:
    +	case err := <-w.Errors:
    +		t.Fatalf("Error from watcher: %v", err)
    +	case <-time.After(50 * time.Millisecond):
    +		t.Fatalf("Took too long to wait for event")
    +	}
    +
    +	// At this point, we've received one event, so the goroutine is ready.
    +	// It's also blocking on syscall.Read.
    +	// Now we try to swap the file descriptor under its nose.
    +	w.Close()
    +	w, err = NewWatcher()
    +	defer w.Close()
    +	if err != nil {
    +		t.Fatalf("Failed to create second watcher: %v", err)
    +	}
    +
    +	<-time.After(50 * time.Millisecond)
    +	err = w.Add(testDir)
    +	if err != nil {
    +		t.Fatalf("Error adding testDir again: %v", err)
    +	}
    +}
    +
    +func TestInotifyStress(t *testing.T) {
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +	testFile := filepath.Join(testDir, "testfile")
    +
    +	w, err := NewWatcher()
    +	if err != nil {
    +		t.Fatalf("Failed to create watcher: %v", err)
    +	}
    +	defer w.Close()
    +
    +	killchan := make(chan struct{})
    +	defer close(killchan)
    +
    +	err = w.Add(testDir)
    +	if err != nil {
    +		t.Fatalf("Failed to add testDir: %v", err)
    +	}
    +
    +	proc, err := os.FindProcess(os.Getpid())
    +	if err != nil {
    +		t.Fatalf("Error finding process: %v", err)
    +	}
    +
    +	go func() {
    +		for {
    +			select {
    +			case <-time.After(5 * time.Millisecond):
    +				err := proc.Signal(syscall.SIGUSR1)
    +				if err != nil {
    +					t.Fatalf("Signal failed: %v", err)
    +				}
    +			case <-killchan:
    +				return
    +			}
    +		}
    +	}()
    +
    +	go func() {
    +		for {
    +			select {
    +			case <-time.After(11 * time.Millisecond):
    +				err := w.poller.wake()
    +				if err != nil {
    +					t.Fatalf("Wake failed: %v", err)
    +				}
    +			case <-killchan:
    +				return
    +			}
    +		}
    +	}()
    +
    +	go func() {
    +		for {
    +			select {
    +			case <-killchan:
    +				return
    +			default:
    +				handle, err := os.Create(testFile)
    +				if err != nil {
    +					t.Fatalf("Create failed: %v", err)
    +				}
    +				handle.Close()
    +				time.Sleep(time.Millisecond)
    +				err = os.Remove(testFile)
    +				if err != nil {
    +					t.Fatalf("Remove failed: %v", err)
    +				}
    +			}
    +		}
    +	}()
    +
    +	creates := 0
    +	removes := 0
    +	after := time.After(5 * time.Second)
    +	for {
    +		select {
    +		case <-after:
    +			if creates-removes > 1 || creates-removes < -1 {
    +				t.Fatalf("Creates and removes should not be off by more than one: %d creates, %d removes", creates, removes)
    +			}
    +			if creates < 50 {
    +				t.Fatalf("Expected at least 50 creates, got %d", creates)
    +			}
    +			return
    +		case err := <-w.Errors:
    +			t.Fatalf("Got an error from watcher: %v", err)
    +		case evt := <-w.Events:
    +			if evt.Name != testFile {
    +				t.Fatalf("Got an event for an unknown file: %s", evt.Name)
    +			}
    +			if evt.Op == Create {
    +				creates++
    +			}
    +			if evt.Op == Remove {
    +				removes++
    +			}
    +		}
    +	}
    +}
    +
    +func TestInotifyRemoveTwice(t *testing.T) {
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +	testFile := filepath.Join(testDir, "testfile")
    +
    +	handle, err := os.Create(testFile)
    +	if err != nil {
    +		t.Fatalf("Create failed: %v", err)
    +	}
    +	handle.Close()
    +
    +	w, err := NewWatcher()
    +	if err != nil {
    +		t.Fatalf("Failed to create watcher: %v", err)
    +	}
    +	defer w.Close()
    +
    +	err = w.Add(testFile)
    +	if err != nil {
    +		t.Fatalf("Failed to add testFile: %v", err)
    +	}
    +
    +	err = os.Remove(testFile)
    +	if err != nil {
    +		t.Fatalf("Failed to remove testFile: %v", err)
    +	}
    +
    +	err = w.Remove(testFile)
    +	if err == nil {
    +		t.Fatalf("no error on removing invalid file")
    +	}
    +	s1 := fmt.Sprintf("%s", err)
    +
    +	err = w.Remove(testFile)
    +	if err == nil {
    +		t.Fatalf("no error on removing invalid file")
    +	}
    +	s2 := fmt.Sprintf("%s", err)
    +
    +	if s1 != s2 {
    +		t.Fatalf("receive different error - %s / %s", s1, s2)
    +	}
    +}
    +
    +func TestInotifyInnerMapLength(t *testing.T) {
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +	testFile := filepath.Join(testDir, "testfile")
    +
    +	handle, err := os.Create(testFile)
    +	if err != nil {
    +		t.Fatalf("Create failed: %v", err)
    +	}
    +	handle.Close()
    +
    +	w, err := NewWatcher()
    +	if err != nil {
    +		t.Fatalf("Failed to create watcher: %v", err)
    +	}
    +	defer w.Close()
    +
    +	err = w.Add(testFile)
    +	if err != nil {
    +		t.Fatalf("Failed to add testFile: %v", err)
    +	}
    +	go func() {
    +		for err := range w.Errors {
    +			t.Fatalf("error received: %s", err)
    +		}
    +	}()
    +
    +	err = os.Remove(testFile)
    +	if err != nil {
    +		t.Fatalf("Failed to remove testFile: %v", err)
    +	}
    +	_ = <-w.Events                      // consume Remove event
    +	<-time.After(50 * time.Millisecond) // wait IN_IGNORE propagated
    +
    +	w.mu.Lock()
    +	defer w.mu.Unlock()
    +	if len(w.watches) != 0 {
    +		t.Fatalf("Expected watches len is 0, but got: %d, %v", len(w.watches), w.watches)
    +	}
    +	if len(w.paths) != 0 {
    +		t.Fatalf("Expected paths len is 0, but got: %d, %v", len(w.paths), w.paths)
    +	}
    +}
    diff --git a/vendor/gopkg.in/fsnotify.v1/integration_darwin_test.go b/vendor/gopkg.in/fsnotify.v1/integration_darwin_test.go
    new file mode 100644
    index 0000000000..1b8982fe1f
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/integration_darwin_test.go
    @@ -0,0 +1,146 @@
    +// Copyright 2016 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 fsnotify
    +
    +import (
    +	"os"
    +	"path/filepath"
    +	"syscall"
    +	"testing"
    +	"time"
    +)
    +
    +// testExchangedataForWatcher tests the watcher with the exchangedata operation on OS X.
    +//
    +// This is widely used for atomic saves on OS X, e.g. TextMate and in Apple's NSDocument.
    +//
    +// See https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/exchangedata.2.html
    +// Also see: https://github.com/textmate/textmate/blob/cd016be29489eba5f3c09b7b70b06da134dda550/Frameworks/io/src/swap_file_data.cc#L20
    +func testExchangedataForWatcher(t *testing.T, watchDir bool) {
    +	// Create directory to watch
    +	testDir1 := tempMkdir(t)
    +
    +	// For the intermediate file
    +	testDir2 := tempMkdir(t)
    +
    +	defer os.RemoveAll(testDir1)
    +	defer os.RemoveAll(testDir2)
    +
    +	resolvedFilename := "TestFsnotifyEvents.file"
    +
    +	// TextMate does:
    +	//
    +	// 1. exchangedata (intermediate, resolved)
    +	// 2. unlink intermediate
    +	//
    +	// Let's try to simulate that:
    +	resolved := filepath.Join(testDir1, resolvedFilename)
    +	intermediate := filepath.Join(testDir2, resolvedFilename+"~")
    +
    +	// Make sure we create the file before we start watching
    +	createAndSyncFile(t, resolved)
    +
    +	watcher := newWatcher(t)
    +
    +	// Test both variants in isolation
    +	if watchDir {
    +		addWatch(t, watcher, testDir1)
    +	} else {
    +		addWatch(t, watcher, resolved)
    +	}
    +
    +	// Receive errors on the error channel on a separate goroutine
    +	go func() {
    +		for err := range watcher.Errors {
    +			t.Fatalf("error received: %s", err)
    +		}
    +	}()
    +
    +	// Receive events on the event channel on a separate goroutine
    +	eventstream := watcher.Events
    +	var removeReceived counter
    +	var createReceived counter
    +
    +	done := make(chan bool)
    +
    +	go func() {
    +		for event := range eventstream {
    +			// Only count relevant events
    +			if event.Name == filepath.Clean(resolved) {
    +				if event.Op&Remove == Remove {
    +					removeReceived.increment()
    +				}
    +				if event.Op&Create == Create {
    +					createReceived.increment()
    +				}
    +			}
    +			t.Logf("event received: %s", event)
    +		}
    +		done <- true
    +	}()
    +
    +	// Repeat to make sure the watched file/directory "survives" the REMOVE/CREATE loop.
    +	for i := 1; i <= 3; i++ {
    +		// The intermediate file is created in a folder outside the watcher
    +		createAndSyncFile(t, intermediate)
    +
    +		// 1. Swap
    +		if err := syscall.Exchangedata(intermediate, resolved, 0); err != nil {
    +			t.Fatalf("[%d] exchangedata failed: %s", i, err)
    +		}
    +
    +		time.Sleep(50 * time.Millisecond)
    +
    +		// 2. Delete the intermediate file
    +		err := os.Remove(intermediate)
    +
    +		if err != nil {
    +			t.Fatalf("[%d] remove %s failed: %s", i, intermediate, err)
    +		}
    +
    +		time.Sleep(50 * time.Millisecond)
    +
    +	}
    +
    +	// We expect this event to be received almost immediately, but let's wait 500 ms to be sure
    +	time.Sleep(500 * time.Millisecond)
    +
    +	// The events will be (CHMOD + REMOVE + CREATE) X 2. Let's focus on the last two:
    +	if removeReceived.value() < 3 {
    +		t.Fatal("fsnotify remove events have not been received after 500 ms")
    +	}
    +
    +	if createReceived.value() < 3 {
    +		t.Fatal("fsnotify create events have not been received after 500 ms")
    +	}
    +
    +	watcher.Close()
    +	t.Log("waiting for the event channel to become closed...")
    +	select {
    +	case <-done:
    +		t.Log("event channel closed")
    +	case <-time.After(2 * time.Second):
    +		t.Fatal("event stream was not closed after 2 seconds")
    +	}
    +}
    +
    +// TestExchangedataInWatchedDir test exchangedata operation on file in watched dir.
    +func TestExchangedataInWatchedDir(t *testing.T) {
    +	testExchangedataForWatcher(t, true)
    +}
    +
    +// TestExchangedataInWatchedDir test exchangedata operation on watched file.
    +func TestExchangedataInWatchedFile(t *testing.T) {
    +	testExchangedataForWatcher(t, false)
    +}
    +
    +func createAndSyncFile(t *testing.T, filepath string) {
    +	f1, err := os.OpenFile(filepath, os.O_WRONLY|os.O_CREATE, 0666)
    +	if err != nil {
    +		t.Fatalf("creating %s failed: %s", filepath, err)
    +	}
    +	f1.Sync()
    +	f1.Close()
    +}
    diff --git a/vendor/gopkg.in/fsnotify.v1/integration_test.go b/vendor/gopkg.in/fsnotify.v1/integration_test.go
    new file mode 100644
    index 0000000000..8b7e9d3ec8
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/integration_test.go
    @@ -0,0 +1,1237 @@
    +// Copyright 2010 The Go Authors. All rights reserved.
    +// Use of this source code is governed by a BSD-style
    +// license that can be found in the LICENSE file.
    +
    +// +build !plan9,!solaris
    +
    +package fsnotify
    +
    +import (
    +	"io/ioutil"
    +	"os"
    +	"os/exec"
    +	"path"
    +	"path/filepath"
    +	"runtime"
    +	"sync/atomic"
    +	"testing"
    +	"time"
    +)
    +
    +// An atomic counter
    +type counter struct {
    +	val int32
    +}
    +
    +func (c *counter) increment() {
    +	atomic.AddInt32(&c.val, 1)
    +}
    +
    +func (c *counter) value() int32 {
    +	return atomic.LoadInt32(&c.val)
    +}
    +
    +func (c *counter) reset() {
    +	atomic.StoreInt32(&c.val, 0)
    +}
    +
    +// tempMkdir makes a temporary directory
    +func tempMkdir(t *testing.T) string {
    +	dir, err := ioutil.TempDir("", "fsnotify")
    +	if err != nil {
    +		t.Fatalf("failed to create test directory: %s", err)
    +	}
    +	return dir
    +}
    +
    +// tempMkFile makes a temporary file.
    +func tempMkFile(t *testing.T, dir string) string {
    +	f, err := ioutil.TempFile(dir, "fsnotify")
    +	if err != nil {
    +		t.Fatalf("failed to create test file: %v", err)
    +	}
    +	defer f.Close()
    +	return f.Name()
    +}
    +
    +// newWatcher initializes an fsnotify Watcher instance.
    +func newWatcher(t *testing.T) *Watcher {
    +	watcher, err := NewWatcher()
    +	if err != nil {
    +		t.Fatalf("NewWatcher() failed: %s", err)
    +	}
    +	return watcher
    +}
    +
    +// addWatch adds a watch for a directory
    +func addWatch(t *testing.T, watcher *Watcher, dir string) {
    +	if err := watcher.Add(dir); err != nil {
    +		t.Fatalf("watcher.Add(%q) failed: %s", dir, err)
    +	}
    +}
    +
    +func TestFsnotifyMultipleOperations(t *testing.T) {
    +	watcher := newWatcher(t)
    +
    +	// Receive errors on the error channel on a separate goroutine
    +	go func() {
    +		for err := range watcher.Errors {
    +			t.Fatalf("error received: %s", err)
    +		}
    +	}()
    +
    +	// Create directory to watch
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	// Create directory that's not watched
    +	testDirToMoveFiles := tempMkdir(t)
    +	defer os.RemoveAll(testDirToMoveFiles)
    +
    +	testFile := filepath.Join(testDir, "TestFsnotifySeq.testfile")
    +	testFileRenamed := filepath.Join(testDirToMoveFiles, "TestFsnotifySeqRename.testfile")
    +
    +	addWatch(t, watcher, testDir)
    +
    +	// Receive events on the event channel on a separate goroutine
    +	eventstream := watcher.Events
    +	var createReceived, modifyReceived, deleteReceived, renameReceived counter
    +	done := make(chan bool)
    +	go func() {
    +		for event := range eventstream {
    +			// Only count relevant events
    +			if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) {
    +				t.Logf("event received: %s", event)
    +				if event.Op&Remove == Remove {
    +					deleteReceived.increment()
    +				}
    +				if event.Op&Write == Write {
    +					modifyReceived.increment()
    +				}
    +				if event.Op&Create == Create {
    +					createReceived.increment()
    +				}
    +				if event.Op&Rename == Rename {
    +					renameReceived.increment()
    +				}
    +			} else {
    +				t.Logf("unexpected event received: %s", event)
    +			}
    +		}
    +		done <- true
    +	}()
    +
    +	// Create a file
    +	// This should add at least one event to the fsnotify event queue
    +	var f *os.File
    +	f, err := os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666)
    +	if err != nil {
    +		t.Fatalf("creating test file failed: %s", err)
    +	}
    +	f.Sync()
    +
    +	time.Sleep(time.Millisecond)
    +	f.WriteString("data")
    +	f.Sync()
    +	f.Close()
    +
    +	time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete
    +
    +	if err := testRename(testFile, testFileRenamed); err != nil {
    +		t.Fatalf("rename failed: %s", err)
    +	}
    +
    +	// Modify the file outside of the watched dir
    +	f, err = os.Open(testFileRenamed)
    +	if err != nil {
    +		t.Fatalf("open test renamed file failed: %s", err)
    +	}
    +	f.WriteString("data")
    +	f.Sync()
    +	f.Close()
    +
    +	time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete
    +
    +	// Recreate the file that was moved
    +	f, err = os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666)
    +	if err != nil {
    +		t.Fatalf("creating test file failed: %s", err)
    +	}
    +	f.Close()
    +	time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete
    +
    +	// We expect this event to be received almost immediately, but let's wait 500 ms to be sure
    +	time.Sleep(500 * time.Millisecond)
    +	cReceived := createReceived.value()
    +	if cReceived != 2 {
    +		t.Fatalf("incorrect number of create events received after 500 ms (%d vs %d)", cReceived, 2)
    +	}
    +	mReceived := modifyReceived.value()
    +	if mReceived != 1 {
    +		t.Fatalf("incorrect number of modify events received after 500 ms (%d vs %d)", mReceived, 1)
    +	}
    +	dReceived := deleteReceived.value()
    +	rReceived := renameReceived.value()
    +	if dReceived+rReceived != 1 {
    +		t.Fatalf("incorrect number of rename+delete events received after 500 ms (%d vs %d)", rReceived+dReceived, 1)
    +	}
    +
    +	// Try closing the fsnotify instance
    +	t.Log("calling Close()")
    +	watcher.Close()
    +	t.Log("waiting for the event channel to become closed...")
    +	select {
    +	case <-done:
    +		t.Log("event channel closed")
    +	case <-time.After(2 * time.Second):
    +		t.Fatal("event stream was not closed after 2 seconds")
    +	}
    +}
    +
    +func TestFsnotifyMultipleCreates(t *testing.T) {
    +	watcher := newWatcher(t)
    +
    +	// Receive errors on the error channel on a separate goroutine
    +	go func() {
    +		for err := range watcher.Errors {
    +			t.Fatalf("error received: %s", err)
    +		}
    +	}()
    +
    +	// Create directory to watch
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	testFile := filepath.Join(testDir, "TestFsnotifySeq.testfile")
    +
    +	addWatch(t, watcher, testDir)
    +
    +	// Receive events on the event channel on a separate goroutine
    +	eventstream := watcher.Events
    +	var createReceived, modifyReceived, deleteReceived counter
    +	done := make(chan bool)
    +	go func() {
    +		for event := range eventstream {
    +			// Only count relevant events
    +			if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) {
    +				t.Logf("event received: %s", event)
    +				if event.Op&Remove == Remove {
    +					deleteReceived.increment()
    +				}
    +				if event.Op&Create == Create {
    +					createReceived.increment()
    +				}
    +				if event.Op&Write == Write {
    +					modifyReceived.increment()
    +				}
    +			} else {
    +				t.Logf("unexpected event received: %s", event)
    +			}
    +		}
    +		done <- true
    +	}()
    +
    +	// Create a file
    +	// This should add at least one event to the fsnotify event queue
    +	var f *os.File
    +	f, err := os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666)
    +	if err != nil {
    +		t.Fatalf("creating test file failed: %s", err)
    +	}
    +	f.Sync()
    +
    +	time.Sleep(time.Millisecond)
    +	f.WriteString("data")
    +	f.Sync()
    +	f.Close()
    +
    +	time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete
    +
    +	os.Remove(testFile)
    +
    +	time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete
    +
    +	// Recreate the file
    +	f, err = os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666)
    +	if err != nil {
    +		t.Fatalf("creating test file failed: %s", err)
    +	}
    +	f.Close()
    +	time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete
    +
    +	// Modify
    +	f, err = os.OpenFile(testFile, os.O_WRONLY, 0666)
    +	if err != nil {
    +		t.Fatalf("creating test file failed: %s", err)
    +	}
    +	f.Sync()
    +
    +	time.Sleep(time.Millisecond)
    +	f.WriteString("data")
    +	f.Sync()
    +	f.Close()
    +
    +	time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete
    +
    +	// Modify
    +	f, err = os.OpenFile(testFile, os.O_WRONLY, 0666)
    +	if err != nil {
    +		t.Fatalf("creating test file failed: %s", err)
    +	}
    +	f.Sync()
    +
    +	time.Sleep(time.Millisecond)
    +	f.WriteString("data")
    +	f.Sync()
    +	f.Close()
    +
    +	time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete
    +
    +	// We expect this event to be received almost immediately, but let's wait 500 ms to be sure
    +	time.Sleep(500 * time.Millisecond)
    +	cReceived := createReceived.value()
    +	if cReceived != 2 {
    +		t.Fatalf("incorrect number of create events received after 500 ms (%d vs %d)", cReceived, 2)
    +	}
    +	mReceived := modifyReceived.value()
    +	if mReceived < 3 {
    +		t.Fatalf("incorrect number of modify events received after 500 ms (%d vs atleast %d)", mReceived, 3)
    +	}
    +	dReceived := deleteReceived.value()
    +	if dReceived != 1 {
    +		t.Fatalf("incorrect number of rename+delete events received after 500 ms (%d vs %d)", dReceived, 1)
    +	}
    +
    +	// Try closing the fsnotify instance
    +	t.Log("calling Close()")
    +	watcher.Close()
    +	t.Log("waiting for the event channel to become closed...")
    +	select {
    +	case <-done:
    +		t.Log("event channel closed")
    +	case <-time.After(2 * time.Second):
    +		t.Fatal("event stream was not closed after 2 seconds")
    +	}
    +}
    +
    +func TestFsnotifyDirOnly(t *testing.T) {
    +	watcher := newWatcher(t)
    +
    +	// Create directory to watch
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	// Create a file before watching directory
    +	// This should NOT add any events to the fsnotify event queue
    +	testFileAlreadyExists := filepath.Join(testDir, "TestFsnotifyEventsExisting.testfile")
    +	{
    +		var f *os.File
    +		f, err := os.OpenFile(testFileAlreadyExists, os.O_WRONLY|os.O_CREATE, 0666)
    +		if err != nil {
    +			t.Fatalf("creating test file failed: %s", err)
    +		}
    +		f.Sync()
    +		f.Close()
    +	}
    +
    +	addWatch(t, watcher, testDir)
    +
    +	// Receive errors on the error channel on a separate goroutine
    +	go func() {
    +		for err := range watcher.Errors {
    +			t.Fatalf("error received: %s", err)
    +		}
    +	}()
    +
    +	testFile := filepath.Join(testDir, "TestFsnotifyDirOnly.testfile")
    +
    +	// Receive events on the event channel on a separate goroutine
    +	eventstream := watcher.Events
    +	var createReceived, modifyReceived, deleteReceived counter
    +	done := make(chan bool)
    +	go func() {
    +		for event := range eventstream {
    +			// Only count relevant events
    +			if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) || event.Name == filepath.Clean(testFileAlreadyExists) {
    +				t.Logf("event received: %s", event)
    +				if event.Op&Remove == Remove {
    +					deleteReceived.increment()
    +				}
    +				if event.Op&Write == Write {
    +					modifyReceived.increment()
    +				}
    +				if event.Op&Create == Create {
    +					createReceived.increment()
    +				}
    +			} else {
    +				t.Logf("unexpected event received: %s", event)
    +			}
    +		}
    +		done <- true
    +	}()
    +
    +	// Create a file
    +	// This should add at least one event to the fsnotify event queue
    +	var f *os.File
    +	f, err := os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666)
    +	if err != nil {
    +		t.Fatalf("creating test file failed: %s", err)
    +	}
    +	f.Sync()
    +
    +	time.Sleep(time.Millisecond)
    +	f.WriteString("data")
    +	f.Sync()
    +	f.Close()
    +
    +	time.Sleep(50 * time.Millisecond) // give system time to sync write change before delete
    +
    +	os.Remove(testFile)
    +	os.Remove(testFileAlreadyExists)
    +
    +	// We expect this event to be received almost immediately, but let's wait 500 ms to be sure
    +	time.Sleep(500 * time.Millisecond)
    +	cReceived := createReceived.value()
    +	if cReceived != 1 {
    +		t.Fatalf("incorrect number of create events received after 500 ms (%d vs %d)", cReceived, 1)
    +	}
    +	mReceived := modifyReceived.value()
    +	if mReceived != 1 {
    +		t.Fatalf("incorrect number of modify events received after 500 ms (%d vs %d)", mReceived, 1)
    +	}
    +	dReceived := deleteReceived.value()
    +	if dReceived != 2 {
    +		t.Fatalf("incorrect number of delete events received after 500 ms (%d vs %d)", dReceived, 2)
    +	}
    +
    +	// Try closing the fsnotify instance
    +	t.Log("calling Close()")
    +	watcher.Close()
    +	t.Log("waiting for the event channel to become closed...")
    +	select {
    +	case <-done:
    +		t.Log("event channel closed")
    +	case <-time.After(2 * time.Second):
    +		t.Fatal("event stream was not closed after 2 seconds")
    +	}
    +}
    +
    +func TestFsnotifyDeleteWatchedDir(t *testing.T) {
    +	watcher := newWatcher(t)
    +	defer watcher.Close()
    +
    +	// Create directory to watch
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	// Create a file before watching directory
    +	testFileAlreadyExists := filepath.Join(testDir, "TestFsnotifyEventsExisting.testfile")
    +	{
    +		var f *os.File
    +		f, err := os.OpenFile(testFileAlreadyExists, os.O_WRONLY|os.O_CREATE, 0666)
    +		if err != nil {
    +			t.Fatalf("creating test file failed: %s", err)
    +		}
    +		f.Sync()
    +		f.Close()
    +	}
    +
    +	addWatch(t, watcher, testDir)
    +
    +	// Add a watch for testFile
    +	addWatch(t, watcher, testFileAlreadyExists)
    +
    +	// Receive errors on the error channel on a separate goroutine
    +	go func() {
    +		for err := range watcher.Errors {
    +			t.Fatalf("error received: %s", err)
    +		}
    +	}()
    +
    +	// Receive events on the event channel on a separate goroutine
    +	eventstream := watcher.Events
    +	var deleteReceived counter
    +	go func() {
    +		for event := range eventstream {
    +			// Only count relevant events
    +			if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFileAlreadyExists) {
    +				t.Logf("event received: %s", event)
    +				if event.Op&Remove == Remove {
    +					deleteReceived.increment()
    +				}
    +			} else {
    +				t.Logf("unexpected event received: %s", event)
    +			}
    +		}
    +	}()
    +
    +	os.RemoveAll(testDir)
    +
    +	// We expect this event to be received almost immediately, but let's wait 500 ms to be sure
    +	time.Sleep(500 * time.Millisecond)
    +	dReceived := deleteReceived.value()
    +	if dReceived < 2 {
    +		t.Fatalf("did not receive at least %d delete events, received %d after 500 ms", 2, dReceived)
    +	}
    +}
    +
    +func TestFsnotifySubDir(t *testing.T) {
    +	watcher := newWatcher(t)
    +
    +	// Create directory to watch
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	testFile1 := filepath.Join(testDir, "TestFsnotifyFile1.testfile")
    +	testSubDir := filepath.Join(testDir, "sub")
    +	testSubDirFile := filepath.Join(testDir, "sub/TestFsnotifyFile1.testfile")
    +
    +	// Receive errors on the error channel on a separate goroutine
    +	go func() {
    +		for err := range watcher.Errors {
    +			t.Fatalf("error received: %s", err)
    +		}
    +	}()
    +
    +	// Receive events on the event channel on a separate goroutine
    +	eventstream := watcher.Events
    +	var createReceived, deleteReceived counter
    +	done := make(chan bool)
    +	go func() {
    +		for event := range eventstream {
    +			// Only count relevant events
    +			if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testSubDir) || event.Name == filepath.Clean(testFile1) {
    +				t.Logf("event received: %s", event)
    +				if event.Op&Create == Create {
    +					createReceived.increment()
    +				}
    +				if event.Op&Remove == Remove {
    +					deleteReceived.increment()
    +				}
    +			} else {
    +				t.Logf("unexpected event received: %s", event)
    +			}
    +		}
    +		done <- true
    +	}()
    +
    +	addWatch(t, watcher, testDir)
    +
    +	// Create sub-directory
    +	if err := os.Mkdir(testSubDir, 0777); err != nil {
    +		t.Fatalf("failed to create test sub-directory: %s", err)
    +	}
    +
    +	// Create a file
    +	var f *os.File
    +	f, err := os.OpenFile(testFile1, os.O_WRONLY|os.O_CREATE, 0666)
    +	if err != nil {
    +		t.Fatalf("creating test file failed: %s", err)
    +	}
    +	f.Sync()
    +	f.Close()
    +
    +	// Create a file (Should not see this! we are not watching subdir)
    +	var fs *os.File
    +	fs, err = os.OpenFile(testSubDirFile, os.O_WRONLY|os.O_CREATE, 0666)
    +	if err != nil {
    +		t.Fatalf("creating test file failed: %s", err)
    +	}
    +	fs.Sync()
    +	fs.Close()
    +
    +	time.Sleep(200 * time.Millisecond)
    +
    +	// Make sure receive deletes for both file and sub-directory
    +	os.RemoveAll(testSubDir)
    +	os.Remove(testFile1)
    +
    +	// We expect this event to be received almost immediately, but let's wait 500 ms to be sure
    +	time.Sleep(500 * time.Millisecond)
    +	cReceived := createReceived.value()
    +	if cReceived != 2 {
    +		t.Fatalf("incorrect number of create events received after 500 ms (%d vs %d)", cReceived, 2)
    +	}
    +	dReceived := deleteReceived.value()
    +	if dReceived != 2 {
    +		t.Fatalf("incorrect number of delete events received after 500 ms (%d vs %d)", dReceived, 2)
    +	}
    +
    +	// Try closing the fsnotify instance
    +	t.Log("calling Close()")
    +	watcher.Close()
    +	t.Log("waiting for the event channel to become closed...")
    +	select {
    +	case <-done:
    +		t.Log("event channel closed")
    +	case <-time.After(2 * time.Second):
    +		t.Fatal("event stream was not closed after 2 seconds")
    +	}
    +}
    +
    +func TestFsnotifyRename(t *testing.T) {
    +	watcher := newWatcher(t)
    +
    +	// Create directory to watch
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	addWatch(t, watcher, testDir)
    +
    +	// Receive errors on the error channel on a separate goroutine
    +	go func() {
    +		for err := range watcher.Errors {
    +			t.Fatalf("error received: %s", err)
    +		}
    +	}()
    +
    +	testFile := filepath.Join(testDir, "TestFsnotifyEvents.testfile")
    +	testFileRenamed := filepath.Join(testDir, "TestFsnotifyEvents.testfileRenamed")
    +
    +	// Receive events on the event channel on a separate goroutine
    +	eventstream := watcher.Events
    +	var renameReceived counter
    +	done := make(chan bool)
    +	go func() {
    +		for event := range eventstream {
    +			// Only count relevant events
    +			if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) || event.Name == filepath.Clean(testFileRenamed) {
    +				if event.Op&Rename == Rename {
    +					renameReceived.increment()
    +				}
    +				t.Logf("event received: %s", event)
    +			} else {
    +				t.Logf("unexpected event received: %s", event)
    +			}
    +		}
    +		done <- true
    +	}()
    +
    +	// Create a file
    +	// This should add at least one event to the fsnotify event queue
    +	var f *os.File
    +	f, err := os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666)
    +	if err != nil {
    +		t.Fatalf("creating test file failed: %s", err)
    +	}
    +	f.Sync()
    +
    +	f.WriteString("data")
    +	f.Sync()
    +	f.Close()
    +
    +	// Add a watch for testFile
    +	addWatch(t, watcher, testFile)
    +
    +	if err := testRename(testFile, testFileRenamed); err != nil {
    +		t.Fatalf("rename failed: %s", err)
    +	}
    +
    +	// We expect this event to be received almost immediately, but let's wait 500 ms to be sure
    +	time.Sleep(500 * time.Millisecond)
    +	if renameReceived.value() == 0 {
    +		t.Fatal("fsnotify rename events have not been received after 500 ms")
    +	}
    +
    +	// Try closing the fsnotify instance
    +	t.Log("calling Close()")
    +	watcher.Close()
    +	t.Log("waiting for the event channel to become closed...")
    +	select {
    +	case <-done:
    +		t.Log("event channel closed")
    +	case <-time.After(2 * time.Second):
    +		t.Fatal("event stream was not closed after 2 seconds")
    +	}
    +
    +	os.Remove(testFileRenamed)
    +}
    +
    +func TestFsnotifyRenameToCreate(t *testing.T) {
    +	watcher := newWatcher(t)
    +
    +	// Create directory to watch
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	// Create directory to get file
    +	testDirFrom := tempMkdir(t)
    +	defer os.RemoveAll(testDirFrom)
    +
    +	addWatch(t, watcher, testDir)
    +
    +	// Receive errors on the error channel on a separate goroutine
    +	go func() {
    +		for err := range watcher.Errors {
    +			t.Fatalf("error received: %s", err)
    +		}
    +	}()
    +
    +	testFile := filepath.Join(testDirFrom, "TestFsnotifyEvents.testfile")
    +	testFileRenamed := filepath.Join(testDir, "TestFsnotifyEvents.testfileRenamed")
    +
    +	// Receive events on the event channel on a separate goroutine
    +	eventstream := watcher.Events
    +	var createReceived counter
    +	done := make(chan bool)
    +	go func() {
    +		for event := range eventstream {
    +			// Only count relevant events
    +			if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) || event.Name == filepath.Clean(testFileRenamed) {
    +				if event.Op&Create == Create {
    +					createReceived.increment()
    +				}
    +				t.Logf("event received: %s", event)
    +			} else {
    +				t.Logf("unexpected event received: %s", event)
    +			}
    +		}
    +		done <- true
    +	}()
    +
    +	// Create a file
    +	// This should add at least one event to the fsnotify event queue
    +	var f *os.File
    +	f, err := os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666)
    +	if err != nil {
    +		t.Fatalf("creating test file failed: %s", err)
    +	}
    +	f.Sync()
    +	f.Close()
    +
    +	if err := testRename(testFile, testFileRenamed); err != nil {
    +		t.Fatalf("rename failed: %s", err)
    +	}
    +
    +	// We expect this event to be received almost immediately, but let's wait 500 ms to be sure
    +	time.Sleep(500 * time.Millisecond)
    +	if createReceived.value() == 0 {
    +		t.Fatal("fsnotify create events have not been received after 500 ms")
    +	}
    +
    +	// Try closing the fsnotify instance
    +	t.Log("calling Close()")
    +	watcher.Close()
    +	t.Log("waiting for the event channel to become closed...")
    +	select {
    +	case <-done:
    +		t.Log("event channel closed")
    +	case <-time.After(2 * time.Second):
    +		t.Fatal("event stream was not closed after 2 seconds")
    +	}
    +
    +	os.Remove(testFileRenamed)
    +}
    +
    +func TestFsnotifyRenameToOverwrite(t *testing.T) {
    +	switch runtime.GOOS {
    +	case "plan9", "windows":
    +		t.Skipf("skipping test on %q (os.Rename over existing file does not create event).", runtime.GOOS)
    +	}
    +
    +	watcher := newWatcher(t)
    +
    +	// Create directory to watch
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	// Create directory to get file
    +	testDirFrom := tempMkdir(t)
    +	defer os.RemoveAll(testDirFrom)
    +
    +	testFile := filepath.Join(testDirFrom, "TestFsnotifyEvents.testfile")
    +	testFileRenamed := filepath.Join(testDir, "TestFsnotifyEvents.testfileRenamed")
    +
    +	// Create a file
    +	var fr *os.File
    +	fr, err := os.OpenFile(testFileRenamed, os.O_WRONLY|os.O_CREATE, 0666)
    +	if err != nil {
    +		t.Fatalf("creating test file failed: %s", err)
    +	}
    +	fr.Sync()
    +	fr.Close()
    +
    +	addWatch(t, watcher, testDir)
    +
    +	// Receive errors on the error channel on a separate goroutine
    +	go func() {
    +		for err := range watcher.Errors {
    +			t.Fatalf("error received: %s", err)
    +		}
    +	}()
    +
    +	// Receive events on the event channel on a separate goroutine
    +	eventstream := watcher.Events
    +	var eventReceived counter
    +	done := make(chan bool)
    +	go func() {
    +		for event := range eventstream {
    +			// Only count relevant events
    +			if event.Name == filepath.Clean(testFileRenamed) {
    +				eventReceived.increment()
    +				t.Logf("event received: %s", event)
    +			} else {
    +				t.Logf("unexpected event received: %s", event)
    +			}
    +		}
    +		done <- true
    +	}()
    +
    +	// Create a file
    +	// This should add at least one event to the fsnotify event queue
    +	var f *os.File
    +	f, err = os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666)
    +	if err != nil {
    +		t.Fatalf("creating test file failed: %s", err)
    +	}
    +	f.Sync()
    +	f.Close()
    +
    +	if err := testRename(testFile, testFileRenamed); err != nil {
    +		t.Fatalf("rename failed: %s", err)
    +	}
    +
    +	// We expect this event to be received almost immediately, but let's wait 500 ms to be sure
    +	time.Sleep(500 * time.Millisecond)
    +	if eventReceived.value() == 0 {
    +		t.Fatal("fsnotify events have not been received after 500 ms")
    +	}
    +
    +	// Try closing the fsnotify instance
    +	t.Log("calling Close()")
    +	watcher.Close()
    +	t.Log("waiting for the event channel to become closed...")
    +	select {
    +	case <-done:
    +		t.Log("event channel closed")
    +	case <-time.After(2 * time.Second):
    +		t.Fatal("event stream was not closed after 2 seconds")
    +	}
    +
    +	os.Remove(testFileRenamed)
    +}
    +
    +func TestRemovalOfWatch(t *testing.T) {
    +	// Create directory to watch
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	// Create a file before watching directory
    +	testFileAlreadyExists := filepath.Join(testDir, "TestFsnotifyEventsExisting.testfile")
    +	{
    +		var f *os.File
    +		f, err := os.OpenFile(testFileAlreadyExists, os.O_WRONLY|os.O_CREATE, 0666)
    +		if err != nil {
    +			t.Fatalf("creating test file failed: %s", err)
    +		}
    +		f.Sync()
    +		f.Close()
    +	}
    +
    +	watcher := newWatcher(t)
    +	defer watcher.Close()
    +
    +	addWatch(t, watcher, testDir)
    +	if err := watcher.Remove(testDir); err != nil {
    +		t.Fatalf("Could not remove the watch: %v\n", err)
    +	}
    +
    +	go func() {
    +		select {
    +		case ev := <-watcher.Events:
    +			t.Fatalf("We received event: %v\n", ev)
    +		case <-time.After(500 * time.Millisecond):
    +			t.Log("No event received, as expected.")
    +		}
    +	}()
    +
    +	time.Sleep(200 * time.Millisecond)
    +	// Modify the file outside of the watched dir
    +	f, err := os.Open(testFileAlreadyExists)
    +	if err != nil {
    +		t.Fatalf("Open test file failed: %s", err)
    +	}
    +	f.WriteString("data")
    +	f.Sync()
    +	f.Close()
    +	if err := os.Chmod(testFileAlreadyExists, 0700); err != nil {
    +		t.Fatalf("chmod failed: %s", err)
    +	}
    +	time.Sleep(400 * time.Millisecond)
    +}
    +
    +func TestFsnotifyAttrib(t *testing.T) {
    +	if runtime.GOOS == "windows" {
    +		t.Skip("attributes don't work on Windows.")
    +	}
    +
    +	watcher := newWatcher(t)
    +
    +	// Create directory to watch
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	// Receive errors on the error channel on a separate goroutine
    +	go func() {
    +		for err := range watcher.Errors {
    +			t.Fatalf("error received: %s", err)
    +		}
    +	}()
    +
    +	testFile := filepath.Join(testDir, "TestFsnotifyAttrib.testfile")
    +
    +	// Receive events on the event channel on a separate goroutine
    +	eventstream := watcher.Events
    +	// The modifyReceived counter counts IsModify events that are not IsAttrib,
    +	// and the attribReceived counts IsAttrib events (which are also IsModify as
    +	// a consequence).
    +	var modifyReceived counter
    +	var attribReceived counter
    +	done := make(chan bool)
    +	go func() {
    +		for event := range eventstream {
    +			// Only count relevant events
    +			if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) {
    +				if event.Op&Write == Write {
    +					modifyReceived.increment()
    +				}
    +				if event.Op&Chmod == Chmod {
    +					attribReceived.increment()
    +				}
    +				t.Logf("event received: %s", event)
    +			} else {
    +				t.Logf("unexpected event received: %s", event)
    +			}
    +		}
    +		done <- true
    +	}()
    +
    +	// Create a file
    +	// This should add at least one event to the fsnotify event queue
    +	var f *os.File
    +	f, err := os.OpenFile(testFile, os.O_WRONLY|os.O_CREATE, 0666)
    +	if err != nil {
    +		t.Fatalf("creating test file failed: %s", err)
    +	}
    +	f.Sync()
    +
    +	f.WriteString("data")
    +	f.Sync()
    +	f.Close()
    +
    +	// Add a watch for testFile
    +	addWatch(t, watcher, testFile)
    +
    +	if err := os.Chmod(testFile, 0700); err != nil {
    +		t.Fatalf("chmod failed: %s", err)
    +	}
    +
    +	// We expect this event to be received almost immediately, but let's wait 500 ms to be sure
    +	// Creating/writing a file changes also the mtime, so IsAttrib should be set to true here
    +	time.Sleep(500 * time.Millisecond)
    +	if modifyReceived.value() != 0 {
    +		t.Fatal("received an unexpected modify event when creating a test file")
    +	}
    +	if attribReceived.value() == 0 {
    +		t.Fatal("fsnotify attribute events have not received after 500 ms")
    +	}
    +
    +	// Modifying the contents of the file does not set the attrib flag (although eg. the mtime
    +	// might have been modified).
    +	modifyReceived.reset()
    +	attribReceived.reset()
    +
    +	f, err = os.OpenFile(testFile, os.O_WRONLY, 0)
    +	if err != nil {
    +		t.Fatalf("reopening test file failed: %s", err)
    +	}
    +
    +	f.WriteString("more data")
    +	f.Sync()
    +	f.Close()
    +
    +	time.Sleep(500 * time.Millisecond)
    +
    +	if modifyReceived.value() != 1 {
    +		t.Fatal("didn't receive a modify event after changing test file contents")
    +	}
    +
    +	if attribReceived.value() != 0 {
    +		t.Fatal("did receive an unexpected attrib event after changing test file contents")
    +	}
    +
    +	modifyReceived.reset()
    +	attribReceived.reset()
    +
    +	// Doing a chmod on the file should trigger an event with the "attrib" flag set (the contents
    +	// of the file are not changed though)
    +	if err := os.Chmod(testFile, 0600); err != nil {
    +		t.Fatalf("chmod failed: %s", err)
    +	}
    +
    +	time.Sleep(500 * time.Millisecond)
    +
    +	if attribReceived.value() != 1 {
    +		t.Fatal("didn't receive an attribute change after 500ms")
    +	}
    +
    +	// Try closing the fsnotify instance
    +	t.Log("calling Close()")
    +	watcher.Close()
    +	t.Log("waiting for the event channel to become closed...")
    +	select {
    +	case <-done:
    +		t.Log("event channel closed")
    +	case <-time.After(1e9):
    +		t.Fatal("event stream was not closed after 1 second")
    +	}
    +
    +	os.Remove(testFile)
    +}
    +
    +func TestFsnotifyClose(t *testing.T) {
    +	watcher := newWatcher(t)
    +	watcher.Close()
    +
    +	var done int32
    +	go func() {
    +		watcher.Close()
    +		atomic.StoreInt32(&done, 1)
    +	}()
    +
    +	time.Sleep(50e6) // 50 ms
    +	if atomic.LoadInt32(&done) == 0 {
    +		t.Fatal("double Close() test failed: second Close() call didn't return")
    +	}
    +
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	if err := watcher.Add(testDir); err == nil {
    +		t.Fatal("expected error on Watch() after Close(), got nil")
    +	}
    +}
    +
    +func TestFsnotifyFakeSymlink(t *testing.T) {
    +	if runtime.GOOS == "windows" {
    +		t.Skip("symlinks don't work on Windows.")
    +	}
    +
    +	watcher := newWatcher(t)
    +
    +	// Create directory to watch
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	var errorsReceived counter
    +	// Receive errors on the error channel on a separate goroutine
    +	go func() {
    +		for errors := range watcher.Errors {
    +			t.Logf("Received error: %s", errors)
    +			errorsReceived.increment()
    +		}
    +	}()
    +
    +	// Count the CREATE events received
    +	var createEventsReceived, otherEventsReceived counter
    +	go func() {
    +		for ev := range watcher.Events {
    +			t.Logf("event received: %s", ev)
    +			if ev.Op&Create == Create {
    +				createEventsReceived.increment()
    +			} else {
    +				otherEventsReceived.increment()
    +			}
    +		}
    +	}()
    +
    +	addWatch(t, watcher, testDir)
    +
    +	if err := os.Symlink(filepath.Join(testDir, "zzz"), filepath.Join(testDir, "zzznew")); err != nil {
    +		t.Fatalf("Failed to create bogus symlink: %s", err)
    +	}
    +	t.Logf("Created bogus symlink")
    +
    +	// We expect this event to be received almost immediately, but let's wait 500 ms to be sure
    +	time.Sleep(500 * time.Millisecond)
    +
    +	// Should not be error, just no events for broken links (watching nothing)
    +	if errorsReceived.value() > 0 {
    +		t.Fatal("fsnotify errors have been received.")
    +	}
    +	if otherEventsReceived.value() > 0 {
    +		t.Fatal("fsnotify other events received on the broken link")
    +	}
    +
    +	// Except for 1 create event (for the link itself)
    +	if createEventsReceived.value() == 0 {
    +		t.Fatal("fsnotify create events were not received after 500 ms")
    +	}
    +	if createEventsReceived.value() > 1 {
    +		t.Fatal("fsnotify more create events received than expected")
    +	}
    +
    +	// Try closing the fsnotify instance
    +	t.Log("calling Close()")
    +	watcher.Close()
    +}
    +
    +func TestCyclicSymlink(t *testing.T) {
    +	if runtime.GOOS == "windows" {
    +		t.Skip("symlinks don't work on Windows.")
    +	}
    +
    +	watcher := newWatcher(t)
    +
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	link := path.Join(testDir, "link")
    +	if err := os.Symlink(".", link); err != nil {
    +		t.Fatalf("could not make symlink: %v", err)
    +	}
    +	addWatch(t, watcher, testDir)
    +
    +	var createEventsReceived counter
    +	go func() {
    +		for ev := range watcher.Events {
    +			if ev.Op&Create == Create {
    +				createEventsReceived.increment()
    +			}
    +		}
    +	}()
    +
    +	if err := os.Remove(link); err != nil {
    +		t.Fatalf("Error removing link: %v", err)
    +	}
    +
    +	// It would be nice to be able to expect a delete event here, but kqueue has
    +	// no way for us to get events on symlinks themselves, because opening them
    +	// opens an fd to the file to which they point.
    +
    +	if err := ioutil.WriteFile(link, []byte("foo"), 0700); err != nil {
    +		t.Fatalf("could not make symlink: %v", err)
    +	}
    +
    +	// We expect this event to be received almost immediately, but let's wait 500 ms to be sure
    +	time.Sleep(500 * time.Millisecond)
    +
    +	if got := createEventsReceived.value(); got == 0 {
    +		t.Errorf("want at least 1 create event got %v", got)
    +	}
    +
    +	watcher.Close()
    +}
    +
    +// TestConcurrentRemovalOfWatch tests that concurrent calls to RemoveWatch do not race.
    +// See https://codereview.appspot.com/103300045/
    +// go test -test.run=TestConcurrentRemovalOfWatch -test.cpu=1,1,1,1,1 -race
    +func TestConcurrentRemovalOfWatch(t *testing.T) {
    +	if runtime.GOOS != "darwin" {
    +		t.Skip("regression test for race only present on darwin")
    +	}
    +
    +	// Create directory to watch
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	// Create a file before watching directory
    +	testFileAlreadyExists := filepath.Join(testDir, "TestFsnotifyEventsExisting.testfile")
    +	{
    +		var f *os.File
    +		f, err := os.OpenFile(testFileAlreadyExists, os.O_WRONLY|os.O_CREATE, 0666)
    +		if err != nil {
    +			t.Fatalf("creating test file failed: %s", err)
    +		}
    +		f.Sync()
    +		f.Close()
    +	}
    +
    +	watcher := newWatcher(t)
    +	defer watcher.Close()
    +
    +	addWatch(t, watcher, testDir)
    +
    +	// Test that RemoveWatch can be invoked concurrently, with no data races.
    +	removed1 := make(chan struct{})
    +	go func() {
    +		defer close(removed1)
    +		watcher.Remove(testDir)
    +	}()
    +	removed2 := make(chan struct{})
    +	go func() {
    +		close(removed2)
    +		watcher.Remove(testDir)
    +	}()
    +	<-removed1
    +	<-removed2
    +}
    +
    +func TestClose(t *testing.T) {
    +	// Regression test for #59 bad file descriptor from Close
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	watcher := newWatcher(t)
    +	if err := watcher.Add(testDir); err != nil {
    +		t.Fatalf("Expected no error on Add, got %v", err)
    +	}
    +	err := watcher.Close()
    +	if err != nil {
    +		t.Fatalf("Expected no error on Close, got %v.", err)
    +	}
    +}
    +
    +// TestRemoveWithClose tests if one can handle Remove events and, at the same
    +// time, close Watcher object without any data races.
    +func TestRemoveWithClose(t *testing.T) {
    +	testDir := tempMkdir(t)
    +	defer os.RemoveAll(testDir)
    +
    +	const fileN = 200
    +	tempFiles := make([]string, 0, fileN)
    +	for i := 0; i < fileN; i++ {
    +		tempFiles = append(tempFiles, tempMkFile(t, testDir))
    +	}
    +	watcher := newWatcher(t)
    +	if err := watcher.Add(testDir); err != nil {
    +		t.Fatalf("Expected no error on Add, got %v", err)
    +	}
    +	startC, stopC := make(chan struct{}), make(chan struct{})
    +	errC := make(chan error)
    +	go func() {
    +		for {
    +			select {
    +			case <-watcher.Errors:
    +			case <-watcher.Events:
    +			case <-stopC:
    +				return
    +			}
    +		}
    +	}()
    +	go func() {
    +		<-startC
    +		for _, fileName := range tempFiles {
    +			os.Remove(fileName)
    +		}
    +	}()
    +	go func() {
    +		<-startC
    +		errC <- watcher.Close()
    +	}()
    +	close(startC)
    +	defer close(stopC)
    +	if err := <-errC; err != nil {
    +		t.Fatalf("Expected no error on Close, got %v.", err)
    +	}
    +}
    +
    +func testRename(file1, file2 string) error {
    +	switch runtime.GOOS {
    +	case "windows", "plan9":
    +		return os.Rename(file1, file2)
    +	default:
    +		cmd := exec.Command("mv", file1, file2)
    +		return cmd.Run()
    +	}
    +}
    diff --git a/vendor/gopkg.in/fsnotify.v1/kqueue.go b/vendor/gopkg.in/fsnotify.v1/kqueue.go
    new file mode 100644
    index 0000000000..b8ea30846d
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/kqueue.go
    @@ -0,0 +1,502 @@
    +// Copyright 2010 The Go Authors. All rights reserved.
    +// Use of this source code is governed by a BSD-style
    +// license that can be found in the LICENSE file.
    +
    +// +build freebsd openbsd netbsd dragonfly darwin
    +
    +package fsnotify
    +
    +import (
    +	"errors"
    +	"fmt"
    +	"io/ioutil"
    +	"os"
    +	"path/filepath"
    +	"sync"
    +	"syscall"
    +	"time"
    +)
    +
    +// Watcher watches a set of files, delivering events to a channel.
    +type Watcher struct {
    +	Events chan Event
    +	Errors chan error
    +	done   chan bool // Channel for sending a "quit message" to the reader goroutine
    +
    +	kq int // File descriptor (as returned by the kqueue() syscall).
    +
    +	mu              sync.Mutex        // Protects access to watcher data
    +	watches         map[string]int    // Map of watched file descriptors (key: path).
    +	externalWatches map[string]bool   // Map of watches added by user of the library.
    +	dirFlags        map[string]uint32 // Map of watched directories to fflags used in kqueue.
    +	paths           map[int]pathInfo  // Map file descriptors to path names for processing kqueue events.
    +	fileExists      map[string]bool   // Keep track of if we know this file exists (to stop duplicate create events).
    +	isClosed        bool              // Set to true when Close() is first called
    +}
    +
    +type pathInfo struct {
    +	name  string
    +	isDir bool
    +}
    +
    +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events.
    +func NewWatcher() (*Watcher, error) {
    +	kq, err := kqueue()
    +	if err != nil {
    +		return nil, err
    +	}
    +
    +	w := &Watcher{
    +		kq:              kq,
    +		watches:         make(map[string]int),
    +		dirFlags:        make(map[string]uint32),
    +		paths:           make(map[int]pathInfo),
    +		fileExists:      make(map[string]bool),
    +		externalWatches: make(map[string]bool),
    +		Events:          make(chan Event),
    +		Errors:          make(chan error),
    +		done:            make(chan bool),
    +	}
    +
    +	go w.readEvents()
    +	return w, nil
    +}
    +
    +// Close removes all watches and closes the events channel.
    +func (w *Watcher) Close() error {
    +	w.mu.Lock()
    +	if w.isClosed {
    +		w.mu.Unlock()
    +		return nil
    +	}
    +	w.isClosed = true
    +	w.mu.Unlock()
    +
    +	// copy paths to remove while locked
    +	w.mu.Lock()
    +	var pathsToRemove = make([]string, 0, len(w.watches))
    +	for name := range w.watches {
    +		pathsToRemove = append(pathsToRemove, name)
    +	}
    +	w.mu.Unlock()
    +	// unlock before calling Remove, which also locks
    +
    +	var err error
    +	for _, name := range pathsToRemove {
    +		if e := w.Remove(name); e != nil && err == nil {
    +			err = e
    +		}
    +	}
    +
    +	// Send "quit" message to the reader goroutine:
    +	w.done <- true
    +
    +	return nil
    +}
    +
    +// Add starts watching the named file or directory (non-recursively).
    +func (w *Watcher) Add(name string) error {
    +	w.mu.Lock()
    +	w.externalWatches[name] = true
    +	w.mu.Unlock()
    +	_, err := w.addWatch(name, noteAllEvents)
    +	return err
    +}
    +
    +// Remove stops watching the the named file or directory (non-recursively).
    +func (w *Watcher) Remove(name string) error {
    +	name = filepath.Clean(name)
    +	w.mu.Lock()
    +	watchfd, ok := w.watches[name]
    +	w.mu.Unlock()
    +	if !ok {
    +		return fmt.Errorf("can't remove non-existent kevent watch for: %s", name)
    +	}
    +
    +	const registerRemove = syscall.EV_DELETE
    +	if err := register(w.kq, []int{watchfd}, registerRemove, 0); err != nil {
    +		return err
    +	}
    +
    +	syscall.Close(watchfd)
    +
    +	w.mu.Lock()
    +	isDir := w.paths[watchfd].isDir
    +	delete(w.watches, name)
    +	delete(w.paths, watchfd)
    +	delete(w.dirFlags, name)
    +	w.mu.Unlock()
    +
    +	// Find all watched paths that are in this directory that are not external.
    +	if isDir {
    +		var pathsToRemove []string
    +		w.mu.Lock()
    +		for _, path := range w.paths {
    +			wdir, _ := filepath.Split(path.name)
    +			if filepath.Clean(wdir) == name {
    +				if !w.externalWatches[path.name] {
    +					pathsToRemove = append(pathsToRemove, path.name)
    +				}
    +			}
    +		}
    +		w.mu.Unlock()
    +		for _, name := range pathsToRemove {
    +			// Since these are internal, not much sense in propagating error
    +			// to the user, as that will just confuse them with an error about
    +			// a path they did not explicitly watch themselves.
    +			w.Remove(name)
    +		}
    +	}
    +
    +	return nil
    +}
    +
    +// Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE)
    +const noteAllEvents = syscall.NOTE_DELETE | syscall.NOTE_WRITE | syscall.NOTE_ATTRIB | syscall.NOTE_RENAME
    +
    +// keventWaitTime to block on each read from kevent
    +var keventWaitTime = durationToTimespec(100 * time.Millisecond)
    +
    +// addWatch adds name to the watched file set.
    +// The flags are interpreted as described in kevent(2).
    +// Returns the real path to the file which was added, if any, which may be different from the one passed in the case of symlinks.
    +func (w *Watcher) addWatch(name string, flags uint32) (string, error) {
    +	var isDir bool
    +	// Make ./name and name equivalent
    +	name = filepath.Clean(name)
    +
    +	w.mu.Lock()
    +	if w.isClosed {
    +		w.mu.Unlock()
    +		return "", errors.New("kevent instance already closed")
    +	}
    +	watchfd, alreadyWatching := w.watches[name]
    +	// We already have a watch, but we can still override flags.
    +	if alreadyWatching {
    +		isDir = w.paths[watchfd].isDir
    +	}
    +	w.mu.Unlock()
    +
    +	if !alreadyWatching {
    +		fi, err := os.Lstat(name)
    +		if err != nil {
    +			return "", err
    +		}
    +
    +		// Don't watch sockets.
    +		if fi.Mode()&os.ModeSocket == os.ModeSocket {
    +			return "", nil
    +		}
    +
    +		// Don't watch named pipes.
    +		if fi.Mode()&os.ModeNamedPipe == os.ModeNamedPipe {
    +			return "", nil
    +		}
    +
    +		// Follow Symlinks
    +		// Unfortunately, Linux can add bogus symlinks to watch list without
    +		// issue, and Windows can't do symlinks period (AFAIK). To  maintain
    +		// consistency, we will act like everything is fine. There will simply
    +		// be no file events for broken symlinks.
    +		// Hence the returns of nil on errors.
    +		if fi.Mode()&os.ModeSymlink == os.ModeSymlink {
    +			name, err = filepath.EvalSymlinks(name)
    +			if err != nil {
    +				return "", nil
    +			}
    +
    +			w.mu.Lock()
    +			_, alreadyWatching = w.watches[name]
    +			w.mu.Unlock()
    +
    +			if alreadyWatching {
    +				return name, nil
    +			}
    +
    +			fi, err = os.Lstat(name)
    +			if err != nil {
    +				return "", nil
    +			}
    +		}
    +
    +		watchfd, err = syscall.Open(name, openMode, 0700)
    +		if watchfd == -1 {
    +			return "", err
    +		}
    +
    +		isDir = fi.IsDir()
    +	}
    +
    +	const registerAdd = syscall.EV_ADD | syscall.EV_CLEAR | syscall.EV_ENABLE
    +	if err := register(w.kq, []int{watchfd}, registerAdd, flags); err != nil {
    +		syscall.Close(watchfd)
    +		return "", err
    +	}
    +
    +	if !alreadyWatching {
    +		w.mu.Lock()
    +		w.watches[name] = watchfd
    +		w.paths[watchfd] = pathInfo{name: name, isDir: isDir}
    +		w.mu.Unlock()
    +	}
    +
    +	if isDir {
    +		// Watch the directory if it has not been watched before,
    +		// or if it was watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles)
    +		w.mu.Lock()
    +
    +		watchDir := (flags&syscall.NOTE_WRITE) == syscall.NOTE_WRITE &&
    +			(!alreadyWatching || (w.dirFlags[name]&syscall.NOTE_WRITE) != syscall.NOTE_WRITE)
    +		// Store flags so this watch can be updated later
    +		w.dirFlags[name] = flags
    +		w.mu.Unlock()
    +
    +		if watchDir {
    +			if err := w.watchDirectoryFiles(name); err != nil {
    +				return "", err
    +			}
    +		}
    +	}
    +	return name, nil
    +}
    +
    +// readEvents reads from kqueue and converts the received kevents into
    +// Event values that it sends down the Events channel.
    +func (w *Watcher) readEvents() {
    +	eventBuffer := make([]syscall.Kevent_t, 10)
    +
    +	for {
    +		// See if there is a message on the "done" channel
    +		select {
    +		case <-w.done:
    +			err := syscall.Close(w.kq)
    +			if err != nil {
    +				w.Errors <- err
    +			}
    +			close(w.Events)
    +			close(w.Errors)
    +			return
    +		default:
    +		}
    +
    +		// Get new events
    +		kevents, err := read(w.kq, eventBuffer, &keventWaitTime)
    +		// EINTR is okay, the syscall was interrupted before timeout expired.
    +		if err != nil && err != syscall.EINTR {
    +			w.Errors <- err
    +			continue
    +		}
    +
    +		// Flush the events we received to the Events channel
    +		for len(kevents) > 0 {
    +			kevent := &kevents[0]
    +			watchfd := int(kevent.Ident)
    +			mask := uint32(kevent.Fflags)
    +			w.mu.Lock()
    +			path := w.paths[watchfd]
    +			w.mu.Unlock()
    +			event := newEvent(path.name, mask)
    +
    +			if path.isDir && !(event.Op&Remove == Remove) {
    +				// Double check to make sure the directory exists. This can happen when
    +				// we do a rm -fr on a recursively watched folders and we receive a
    +				// modification event first but the folder has been deleted and later
    +				// receive the delete event
    +				if _, err := os.Lstat(event.Name); os.IsNotExist(err) {
    +					// mark is as delete event
    +					event.Op |= Remove
    +				}
    +			}
    +
    +			if event.Op&Rename == Rename || event.Op&Remove == Remove {
    +				w.Remove(event.Name)
    +				w.mu.Lock()
    +				delete(w.fileExists, event.Name)
    +				w.mu.Unlock()
    +			}
    +
    +			if path.isDir && event.Op&Write == Write && !(event.Op&Remove == Remove) {
    +				w.sendDirectoryChangeEvents(event.Name)
    +			} else {
    +				// Send the event on the Events channel
    +				w.Events <- event
    +			}
    +
    +			if event.Op&Remove == Remove {
    +				// Look for a file that may have overwritten this.
    +				// For example, mv f1 f2 will delete f2, then create f2.
    +				if path.isDir {
    +					fileDir := filepath.Clean(event.Name)
    +					w.mu.Lock()
    +					_, found := w.watches[fileDir]
    +					w.mu.Unlock()
    +					if found {
    +						// make sure the directory exists before we watch for changes. When we
    +						// do a recursive watch and perform rm -fr, the parent directory might
    +						// have gone missing, ignore the missing directory and let the
    +						// upcoming delete event remove the watch from the parent directory.
    +						if _, err := os.Lstat(fileDir); err == nil {
    +							w.sendDirectoryChangeEvents(fileDir)
    +						}
    +					}
    +				} else {
    +					filePath := filepath.Clean(event.Name)
    +					if fileInfo, err := os.Lstat(filePath); err == nil {
    +						w.sendFileCreatedEventIfNew(filePath, fileInfo)
    +					}
    +				}
    +			}
    +
    +			// Move to next event
    +			kevents = kevents[1:]
    +		}
    +	}
    +}
    +
    +// newEvent returns an platform-independent Event based on kqueue Fflags.
    +func newEvent(name string, mask uint32) Event {
    +	e := Event{Name: name}
    +	if mask&syscall.NOTE_DELETE == syscall.NOTE_DELETE {
    +		e.Op |= Remove
    +	}
    +	if mask&syscall.NOTE_WRITE == syscall.NOTE_WRITE {
    +		e.Op |= Write
    +	}
    +	if mask&syscall.NOTE_RENAME == syscall.NOTE_RENAME {
    +		e.Op |= Rename
    +	}
    +	if mask&syscall.NOTE_ATTRIB == syscall.NOTE_ATTRIB {
    +		e.Op |= Chmod
    +	}
    +	return e
    +}
    +
    +func newCreateEvent(name string) Event {
    +	return Event{Name: name, Op: Create}
    +}
    +
    +// watchDirectoryFiles to mimic inotify when adding a watch on a directory
    +func (w *Watcher) watchDirectoryFiles(dirPath string) error {
    +	// Get all files
    +	files, err := ioutil.ReadDir(dirPath)
    +	if err != nil {
    +		return err
    +	}
    +
    +	for _, fileInfo := range files {
    +		filePath := filepath.Join(dirPath, fileInfo.Name())
    +		filePath, err = w.internalWatch(filePath, fileInfo)
    +		if err != nil {
    +			return err
    +		}
    +
    +		w.mu.Lock()
    +		w.fileExists[filePath] = true
    +		w.mu.Unlock()
    +	}
    +
    +	return nil
    +}
    +
    +// sendDirectoryEvents searches the directory for newly created files
    +// and sends them over the event channel. This functionality is to have
    +// the BSD version of fsnotify match Linux inotify which provides a
    +// create event for files created in a watched directory.
    +func (w *Watcher) sendDirectoryChangeEvents(dirPath string) {
    +	// Get all files
    +	files, err := ioutil.ReadDir(dirPath)
    +	if err != nil {
    +		w.Errors <- err
    +	}
    +
    +	// Search for new files
    +	for _, fileInfo := range files {
    +		filePath := filepath.Join(dirPath, fileInfo.Name())
    +		err := w.sendFileCreatedEventIfNew(filePath, fileInfo)
    +
    +		if err != nil {
    +			return
    +		}
    +	}
    +}
    +
    +// sendFileCreatedEvent sends a create event if the file isn't already being tracked.
    +func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fileInfo os.FileInfo) (err error) {
    +	w.mu.Lock()
    +	_, doesExist := w.fileExists[filePath]
    +	w.mu.Unlock()
    +	if !doesExist {
    +		// Send create event
    +		w.Events <- newCreateEvent(filePath)
    +	}
    +
    +	// like watchDirectoryFiles (but without doing another ReadDir)
    +	filePath, err = w.internalWatch(filePath, fileInfo)
    +	if err != nil {
    +		return err
    +	}
    +
    +	w.mu.Lock()
    +	w.fileExists[filePath] = true
    +	w.mu.Unlock()
    +
    +	return nil
    +}
    +
    +func (w *Watcher) internalWatch(name string, fileInfo os.FileInfo) (string, error) {
    +	if fileInfo.IsDir() {
    +		// mimic Linux providing delete events for subdirectories
    +		// but preserve the flags used if currently watching subdirectory
    +		w.mu.Lock()
    +		flags := w.dirFlags[name]
    +		w.mu.Unlock()
    +
    +		flags |= syscall.NOTE_DELETE | syscall.NOTE_RENAME
    +		return w.addWatch(name, flags)
    +	}
    +
    +	// watch file to mimic Linux inotify
    +	return w.addWatch(name, noteAllEvents)
    +}
    +
    +// kqueue creates a new kernel event queue and returns a descriptor.
    +func kqueue() (kq int, err error) {
    +	kq, err = syscall.Kqueue()
    +	if kq == -1 {
    +		return kq, err
    +	}
    +	return kq, nil
    +}
    +
    +// register events with the queue
    +func register(kq int, fds []int, flags int, fflags uint32) error {
    +	changes := make([]syscall.Kevent_t, len(fds))
    +
    +	for i, fd := range fds {
    +		// SetKevent converts int to the platform-specific types:
    +		syscall.SetKevent(&changes[i], fd, syscall.EVFILT_VNODE, flags)
    +		changes[i].Fflags = fflags
    +	}
    +
    +	// register the events
    +	success, err := syscall.Kevent(kq, changes, nil, nil)
    +	if success == -1 {
    +		return err
    +	}
    +	return nil
    +}
    +
    +// read retrieves pending events, or waits until an event occurs.
    +// A timeout of nil blocks indefinitely, while 0 polls the queue.
    +func read(kq int, events []syscall.Kevent_t, timeout *syscall.Timespec) ([]syscall.Kevent_t, error) {
    +	n, err := syscall.Kevent(kq, nil, events, timeout)
    +	if err != nil {
    +		return nil, err
    +	}
    +	return events[0:n], nil
    +}
    +
    +// durationToTimespec prepares a timeout value
    +func durationToTimespec(d time.Duration) syscall.Timespec {
    +	return syscall.NsecToTimespec(d.Nanoseconds())
    +}
    diff --git a/vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go b/vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go
    new file mode 100644
    index 0000000000..c57ccb427b
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go
    @@ -0,0 +1,11 @@
    +// Copyright 2013 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 openbsd netbsd dragonfly
    +
    +package fsnotify
    +
    +import "syscall"
    +
    +const openMode = syscall.O_NONBLOCK | syscall.O_RDONLY
    diff --git a/vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go b/vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go
    new file mode 100644
    index 0000000000..174b2c331f
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go
    @@ -0,0 +1,12 @@
    +// Copyright 2013 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 darwin
    +
    +package fsnotify
    +
    +import "syscall"
    +
    +// note: this constant is not defined on BSD
    +const openMode = syscall.O_EVTONLY
    diff --git a/vendor/gopkg.in/fsnotify.v1/windows.go b/vendor/gopkg.in/fsnotify.v1/windows.go
    new file mode 100644
    index 0000000000..c836bdb3db
    --- /dev/null
    +++ b/vendor/gopkg.in/fsnotify.v1/windows.go
    @@ -0,0 +1,561 @@
    +// Copyright 2011 The Go Authors. All rights reserved.
    +// Use of this source code is governed by a BSD-style
    +// license that can be found in the LICENSE file.
    +
    +// +build windows
    +
    +package fsnotify
    +
    +import (
    +	"errors"
    +	"fmt"
    +	"os"
    +	"path/filepath"
    +	"runtime"
    +	"sync"
    +	"syscall"
    +	"unsafe"
    +)
    +
    +// Watcher watches a set of files, delivering events to a channel.
    +type Watcher struct {
    +	Events   chan Event
    +	Errors   chan error
    +	isClosed bool           // Set to true when Close() is first called
    +	mu       sync.Mutex     // Map access
    +	port     syscall.Handle // Handle to completion port
    +	watches  watchMap       // Map of watches (key: i-number)
    +	input    chan *input    // Inputs to the reader are sent on this channel
    +	quit     chan chan<- error
    +}
    +
    +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events.
    +func NewWatcher() (*Watcher, error) {
    +	port, e := syscall.CreateIoCompletionPort(syscall.InvalidHandle, 0, 0, 0)
    +	if e != nil {
    +		return nil, os.NewSyscallError("CreateIoCompletionPort", e)
    +	}
    +	w := &Watcher{
    +		port:    port,
    +		watches: make(watchMap),
    +		input:   make(chan *input, 1),
    +		Events:  make(chan Event, 50),
    +		Errors:  make(chan error),
    +		quit:    make(chan chan<- error, 1),
    +	}
    +	go w.readEvents()
    +	return w, nil
    +}
    +
    +// Close removes all watches and closes the events channel.
    +func (w *Watcher) Close() error {
    +	if w.isClosed {
    +		return nil
    +	}
    +	w.isClosed = true
    +
    +	// Send "quit" message to the reader goroutine
    +	ch := make(chan error)
    +	w.quit <- ch
    +	if err := w.wakeupReader(); err != nil {
    +		return err
    +	}
    +	return <-ch
    +}
    +
    +// Add starts watching the named file or directory (non-recursively).
    +func (w *Watcher) Add(name string) error {
    +	if w.isClosed {
    +		return errors.New("watcher already closed")
    +	}
    +	in := &input{
    +		op:    opAddWatch,
    +		path:  filepath.Clean(name),
    +		flags: sysFSALLEVENTS,
    +		reply: make(chan error),
    +	}
    +	w.input <- in
    +	if err := w.wakeupReader(); err != nil {
    +		return err
    +	}
    +	return <-in.reply
    +}
    +
    +// Remove stops watching the the named file or directory (non-recursively).
    +func (w *Watcher) Remove(name string) error {
    +	in := &input{
    +		op:    opRemoveWatch,
    +		path:  filepath.Clean(name),
    +		reply: make(chan error),
    +	}
    +	w.input <- in
    +	if err := w.wakeupReader(); err != nil {
    +		return err
    +	}
    +	return <-in.reply
    +}
    +
    +const (
    +	// Options for AddWatch
    +	sysFSONESHOT = 0x80000000
    +	sysFSONLYDIR = 0x1000000
    +
    +	// Events
    +	sysFSACCESS     = 0x1
    +	sysFSALLEVENTS  = 0xfff
    +	sysFSATTRIB     = 0x4
    +	sysFSCLOSE      = 0x18
    +	sysFSCREATE     = 0x100
    +	sysFSDELETE     = 0x200
    +	sysFSDELETESELF = 0x400
    +	sysFSMODIFY     = 0x2
    +	sysFSMOVE       = 0xc0
    +	sysFSMOVEDFROM  = 0x40
    +	sysFSMOVEDTO    = 0x80
    +	sysFSMOVESELF   = 0x800
    +
    +	// Special events
    +	sysFSIGNORED   = 0x8000
    +	sysFSQOVERFLOW = 0x4000
    +)
    +
    +func newEvent(name string, mask uint32) Event {
    +	e := Event{Name: name}
    +	if mask&sysFSCREATE == sysFSCREATE || mask&sysFSMOVEDTO == sysFSMOVEDTO {
    +		e.Op |= Create
    +	}
    +	if mask&sysFSDELETE == sysFSDELETE || mask&sysFSDELETESELF == sysFSDELETESELF {
    +		e.Op |= Remove
    +	}
    +	if mask&sysFSMODIFY == sysFSMODIFY {
    +		e.Op |= Write
    +	}
    +	if mask&sysFSMOVE == sysFSMOVE || mask&sysFSMOVESELF == sysFSMOVESELF || mask&sysFSMOVEDFROM == sysFSMOVEDFROM {
    +		e.Op |= Rename
    +	}
    +	if mask&sysFSATTRIB == sysFSATTRIB {
    +		e.Op |= Chmod
    +	}
    +	return e
    +}
    +
    +const (
    +	opAddWatch = iota
    +	opRemoveWatch
    +)
    +
    +const (
    +	provisional uint64 = 1 << (32 + iota)
    +)
    +
    +type input struct {
    +	op    int
    +	path  string
    +	flags uint32
    +	reply chan error
    +}
    +
    +type inode struct {
    +	handle syscall.Handle
    +	volume uint32
    +	index  uint64
    +}
    +
    +type watch struct {
    +	ov     syscall.Overlapped
    +	ino    *inode            // i-number
    +	path   string            // Directory path
    +	mask   uint64            // Directory itself is being watched with these notify flags
    +	names  map[string]uint64 // Map of names being watched and their notify flags
    +	rename string            // Remembers the old name while renaming a file
    +	buf    [4096]byte
    +}
    +
    +type indexMap map[uint64]*watch
    +type watchMap map[uint32]indexMap
    +
    +func (w *Watcher) wakeupReader() error {
    +	e := syscall.PostQueuedCompletionStatus(w.port, 0, 0, nil)
    +	if e != nil {
    +		return os.NewSyscallError("PostQueuedCompletionStatus", e)
    +	}
    +	return nil
    +}
    +
    +func getDir(pathname string) (dir string, err error) {
    +	attr, e := syscall.GetFileAttributes(syscall.StringToUTF16Ptr(pathname))
    +	if e != nil {
    +		return "", os.NewSyscallError("GetFileAttributes", e)
    +	}
    +	if attr&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 {
    +		dir = pathname
    +	} else {
    +		dir, _ = filepath.Split(pathname)
    +		dir = filepath.Clean(dir)
    +	}
    +	return
    +}
    +
    +func getIno(path string) (ino *inode, err error) {
    +	h, e := syscall.CreateFile(syscall.StringToUTF16Ptr(path),
    +		syscall.FILE_LIST_DIRECTORY,
    +		syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
    +		nil, syscall.OPEN_EXISTING,
    +		syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OVERLAPPED, 0)
    +	if e != nil {
    +		return nil, os.NewSyscallError("CreateFile", e)
    +	}
    +	var fi syscall.ByHandleFileInformation
    +	if e = syscall.GetFileInformationByHandle(h, &fi); e != nil {
    +		syscall.CloseHandle(h)
    +		return nil, os.NewSyscallError("GetFileInformationByHandle", e)
    +	}
    +	ino = &inode{
    +		handle: h,
    +		volume: fi.VolumeSerialNumber,
    +		index:  uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow),
    +	}
    +	return ino, nil
    +}
    +
    +// Must run within the I/O thread.
    +func (m watchMap) get(ino *inode) *watch {
    +	if i := m[ino.volume]; i != nil {
    +		return i[ino.index]
    +	}
    +	return nil
    +}
    +
    +// Must run within the I/O thread.
    +func (m watchMap) set(ino *inode, watch *watch) {
    +	i := m[ino.volume]
    +	if i == nil {
    +		i = make(indexMap)
    +		m[ino.volume] = i
    +	}
    +	i[ino.index] = watch
    +}
    +
    +// Must run within the I/O thread.
    +func (w *Watcher) addWatch(pathname string, flags uint64) error {
    +	dir, err := getDir(pathname)
    +	if err != nil {
    +		return err
    +	}
    +	if flags&sysFSONLYDIR != 0 && pathname != dir {
    +		return nil
    +	}
    +	ino, err := getIno(dir)
    +	if err != nil {
    +		return err
    +	}
    +	w.mu.Lock()
    +	watchEntry := w.watches.get(ino)
    +	w.mu.Unlock()
    +	if watchEntry == nil {
    +		if _, e := syscall.CreateIoCompletionPort(ino.handle, w.port, 0, 0); e != nil {
    +			syscall.CloseHandle(ino.handle)
    +			return os.NewSyscallError("CreateIoCompletionPort", e)
    +		}
    +		watchEntry = &watch{
    +			ino:   ino,
    +			path:  dir,
    +			names: make(map[string]uint64),
    +		}
    +		w.mu.Lock()
    +		w.watches.set(ino, watchEntry)
    +		w.mu.Unlock()
    +		flags |= provisional
    +	} else {
    +		syscall.CloseHandle(ino.handle)
    +	}
    +	if pathname == dir {
    +		watchEntry.mask |= flags
    +	} else {
    +		watchEntry.names[filepath.Base(pathname)] |= flags
    +	}
    +	if err = w.startRead(watchEntry); err != nil {
    +		return err
    +	}
    +	if pathname == dir {
    +		watchEntry.mask &= ^provisional
    +	} else {
    +		watchEntry.names[filepath.Base(pathname)] &= ^provisional
    +	}
    +	return nil
    +}
    +
    +// Must run within the I/O thread.
    +func (w *Watcher) remWatch(pathname string) error {
    +	dir, err := getDir(pathname)
    +	if err != nil {
    +		return err
    +	}
    +	ino, err := getIno(dir)
    +	if err != nil {
    +		return err
    +	}
    +	w.mu.Lock()
    +	watch := w.watches.get(ino)
    +	w.mu.Unlock()
    +	if watch == nil {
    +		return fmt.Errorf("can't remove non-existent watch for: %s", pathname)
    +	}
    +	if pathname == dir {
    +		w.sendEvent(watch.path, watch.mask&sysFSIGNORED)
    +		watch.mask = 0
    +	} else {
    +		name := filepath.Base(pathname)
    +		w.sendEvent(watch.path+"\\"+name, watch.names[name]&sysFSIGNORED)
    +		delete(watch.names, name)
    +	}
    +	return w.startRead(watch)
    +}
    +
    +// Must run within the I/O thread.
    +func (w *Watcher) deleteWatch(watch *watch) {
    +	for name, mask := range watch.names {
    +		if mask&provisional == 0 {
    +			w.sendEvent(watch.path+"\\"+name, mask&sysFSIGNORED)
    +		}
    +		delete(watch.names, name)
    +	}
    +	if watch.mask != 0 {
    +		if watch.mask&provisional == 0 {
    +			w.sendEvent(watch.path, watch.mask&sysFSIGNORED)
    +		}
    +		watch.mask = 0
    +	}
    +}
    +
    +// Must run within the I/O thread.
    +func (w *Watcher) startRead(watch *watch) error {
    +	if e := syscall.CancelIo(watch.ino.handle); e != nil {
    +		w.Errors <- os.NewSyscallError("CancelIo", e)
    +		w.deleteWatch(watch)
    +	}
    +	mask := toWindowsFlags(watch.mask)
    +	for _, m := range watch.names {
    +		mask |= toWindowsFlags(m)
    +	}
    +	if mask == 0 {
    +		if e := syscall.CloseHandle(watch.ino.handle); e != nil {
    +			w.Errors <- os.NewSyscallError("CloseHandle", e)
    +		}
    +		w.mu.Lock()
    +		delete(w.watches[watch.ino.volume], watch.ino.index)
    +		w.mu.Unlock()
    +		return nil
    +	}
    +	e := syscall.ReadDirectoryChanges(watch.ino.handle, &watch.buf[0],
    +		uint32(unsafe.Sizeof(watch.buf)), false, mask, nil, &watch.ov, 0)
    +	if e != nil {
    +		err := os.NewSyscallError("ReadDirectoryChanges", e)
    +		if e == syscall.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 {
    +			// Watched directory was probably removed
    +			if w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) {
    +				if watch.mask&sysFSONESHOT != 0 {
    +					watch.mask = 0
    +				}
    +			}
    +			err = nil
    +		}
    +		w.deleteWatch(watch)
    +		w.startRead(watch)
    +		return err
    +	}
    +	return nil
    +}
    +
    +// readEvents reads from the I/O completion port, converts the
    +// received events into Event objects and sends them via the Events channel.
    +// Entry point to the I/O thread.
    +func (w *Watcher) readEvents() {
    +	var (
    +		n, key uint32
    +		ov     *syscall.Overlapped
    +	)
    +	runtime.LockOSThread()
    +
    +	for {
    +		e := syscall.GetQueuedCompletionStatus(w.port, &n, &key, &ov, syscall.INFINITE)
    +		watch := (*watch)(unsafe.Pointer(ov))
    +
    +		if watch == nil {
    +			select {
    +			case ch := <-w.quit:
    +				w.mu.Lock()
    +				var indexes []indexMap
    +				for _, index := range w.watches {
    +					indexes = append(indexes, index)
    +				}
    +				w.mu.Unlock()
    +				for _, index := range indexes {
    +					for _, watch := range index {
    +						w.deleteWatch(watch)
    +						w.startRead(watch)
    +					}
    +				}
    +				var err error
    +				if e := syscall.CloseHandle(w.port); e != nil {
    +					err = os.NewSyscallError("CloseHandle", e)
    +				}
    +				close(w.Events)
    +				close(w.Errors)
    +				ch <- err
    +				return
    +			case in := <-w.input:
    +				switch in.op {
    +				case opAddWatch:
    +					in.reply <- w.addWatch(in.path, uint64(in.flags))
    +				case opRemoveWatch:
    +					in.reply <- w.remWatch(in.path)
    +				}
    +			default:
    +			}
    +			continue
    +		}
    +
    +		switch e {
    +		case syscall.ERROR_MORE_DATA:
    +			if watch == nil {
    +				w.Errors <- errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer")
    +			} else {
    +				// The i/o succeeded but the buffer is full.
    +				// In theory we should be building up a full packet.
    +				// In practice we can get away with just carrying on.
    +				n = uint32(unsafe.Sizeof(watch.buf))
    +			}
    +		case syscall.ERROR_ACCESS_DENIED:
    +			// Watched directory was probably removed
    +			w.sendEvent(watch.path, watch.mask&sysFSDELETESELF)
    +			w.deleteWatch(watch)
    +			w.startRead(watch)
    +			continue
    +		case syscall.ERROR_OPERATION_ABORTED:
    +			// CancelIo was called on this handle
    +			continue
    +		default:
    +			w.Errors <- os.NewSyscallError("GetQueuedCompletionPort", e)
    +			continue
    +		case nil:
    +		}
    +
    +		var offset uint32
    +		for {
    +			if n == 0 {
    +				w.Events <- newEvent("", sysFSQOVERFLOW)
    +				w.Errors <- errors.New("short read in readEvents()")
    +				break
    +			}
    +
    +			// Point "raw" to the event in the buffer
    +			raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset]))
    +			buf := (*[syscall.MAX_PATH]uint16)(unsafe.Pointer(&raw.FileName))
    +			name := syscall.UTF16ToString(buf[:raw.FileNameLength/2])
    +			fullname := watch.path + "\\" + name
    +
    +			var mask uint64
    +			switch raw.Action {
    +			case syscall.FILE_ACTION_REMOVED:
    +				mask = sysFSDELETESELF
    +			case syscall.FILE_ACTION_MODIFIED:
    +				mask = sysFSMODIFY
    +			case syscall.FILE_ACTION_RENAMED_OLD_NAME:
    +				watch.rename = name
    +			case syscall.FILE_ACTION_RENAMED_NEW_NAME:
    +				if watch.names[watch.rename] != 0 {
    +					watch.names[name] |= watch.names[watch.rename]
    +					delete(watch.names, watch.rename)
    +					mask = sysFSMOVESELF
    +				}
    +			}
    +
    +			sendNameEvent := func() {
    +				if w.sendEvent(fullname, watch.names[name]&mask) {
    +					if watch.names[name]&sysFSONESHOT != 0 {
    +						delete(watch.names, name)
    +					}
    +				}
    +			}
    +			if raw.Action != syscall.FILE_ACTION_RENAMED_NEW_NAME {
    +				sendNameEvent()
    +			}
    +			if raw.Action == syscall.FILE_ACTION_REMOVED {
    +				w.sendEvent(fullname, watch.names[name]&sysFSIGNORED)
    +				delete(watch.names, name)
    +			}
    +			if w.sendEvent(fullname, watch.mask&toFSnotifyFlags(raw.Action)) {
    +				if watch.mask&sysFSONESHOT != 0 {
    +					watch.mask = 0
    +				}
    +			}
    +			if raw.Action == syscall.FILE_ACTION_RENAMED_NEW_NAME {
    +				fullname = watch.path + "\\" + watch.rename
    +				sendNameEvent()
    +			}
    +
    +			// Move to the next event in the buffer
    +			if raw.NextEntryOffset == 0 {
    +				break
    +			}
    +			offset += raw.NextEntryOffset
    +
    +			// Error!
    +			if offset >= n {
    +				w.Errors <- errors.New("Windows system assumed buffer larger than it is, events have likely been missed.")
    +				break
    +			}
    +		}
    +
    +		if err := w.startRead(watch); err != nil {
    +			w.Errors <- err
    +		}
    +	}
    +}
    +
    +func (w *Watcher) sendEvent(name string, mask uint64) bool {
    +	if mask == 0 {
    +		return false
    +	}
    +	event := newEvent(name, uint32(mask))
    +	select {
    +	case ch := <-w.quit:
    +		w.quit <- ch
    +	case w.Events <- event:
    +	}
    +	return true
    +}
    +
    +func toWindowsFlags(mask uint64) uint32 {
    +	var m uint32
    +	if mask&sysFSACCESS != 0 {
    +		m |= syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS
    +	}
    +	if mask&sysFSMODIFY != 0 {
    +		m |= syscall.FILE_NOTIFY_CHANGE_LAST_WRITE
    +	}
    +	if mask&sysFSATTRIB != 0 {
    +		m |= syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES
    +	}
    +	if mask&(sysFSMOVE|sysFSCREATE|sysFSDELETE) != 0 {
    +		m |= syscall.FILE_NOTIFY_CHANGE_FILE_NAME | syscall.FILE_NOTIFY_CHANGE_DIR_NAME
    +	}
    +	return m
    +}
    +
    +func toFSnotifyFlags(action uint32) uint64 {
    +	switch action {
    +	case syscall.FILE_ACTION_ADDED:
    +		return sysFSCREATE
    +	case syscall.FILE_ACTION_REMOVED:
    +		return sysFSDELETE
    +	case syscall.FILE_ACTION_MODIFIED:
    +		return sysFSMODIFY
    +	case syscall.FILE_ACTION_RENAMED_OLD_NAME:
    +		return sysFSMOVEDFROM
    +	case syscall.FILE_ACTION_RENAMED_NEW_NAME:
    +		return sysFSMOVEDTO
    +	}
    +	return 0
    +}
    diff --git a/vendor/gopkg.in/yaml.v2/.travis.yml b/vendor/gopkg.in/yaml.v2/.travis.yml
    new file mode 100644
    index 0000000000..004172a2e3
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/.travis.yml
    @@ -0,0 +1,9 @@
    +language: go
    +
    +go:
    +    - 1.4
    +    - 1.5
    +    - 1.6
    +    - tip
    +
    +go_import_path: gopkg.in/yaml.v2
    diff --git a/vendor/gopkg.in/yaml.v2/LICENSE b/vendor/gopkg.in/yaml.v2/LICENSE
    new file mode 100644
    index 0000000000..a68e67f01b
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/LICENSE
    @@ -0,0 +1,188 @@
    +
    +Copyright (c) 2011-2014 - Canonical Inc.
    +
    +This software is licensed under the LGPLv3, included below.
    +
    +As a special exception to the GNU Lesser General Public License version 3
    +("LGPL3"), the copyright holders of this Library give you permission to
    +convey to a third party a Combined Work that links statically or dynamically
    +to this Library without providing any Minimal Corresponding Source or
    +Minimal Application Code as set out in 4d or providing the installation
    +information set out in section 4e, provided that you comply with the other
    +provisions of LGPL3 and provided that you meet, for the Application the
    +terms and conditions of the license(s) which apply to the Application.
    +
    +Except as stated in this special exception, the provisions of LGPL3 will
    +continue to comply in full to this Library. If you modify this Library, you
    +may apply this exception to your version of this Library, but you are not
    +obliged to do so. If you do not wish to do so, delete this exception
    +statement from your version. This exception does not (and cannot) modify any
    +license terms which apply to the Application, with which you must still
    +comply.
    +
    +
    +                   GNU LESSER GENERAL PUBLIC LICENSE
    +                       Version 3, 29 June 2007
    +
    + Copyright (C) 2007 Free Software Foundation, Inc. 
    + Everyone is permitted to copy and distribute verbatim copies
    + of this license document, but changing it is not allowed.
    +
    +
    +  This version of the GNU Lesser General Public License incorporates
    +the terms and conditions of version 3 of the GNU General Public
    +License, supplemented by the additional permissions listed below.
    +
    +  0. Additional Definitions.
    +
    +  As used herein, "this License" refers to version 3 of the GNU Lesser
    +General Public License, and the "GNU GPL" refers to version 3 of the GNU
    +General Public License.
    +
    +  "The Library" refers to a covered work governed by this License,
    +other than an Application or a Combined Work as defined below.
    +
    +  An "Application" is any work that makes use of an interface provided
    +by the Library, but which is not otherwise based on the Library.
    +Defining a subclass of a class defined by the Library is deemed a mode
    +of using an interface provided by the Library.
    +
    +  A "Combined Work" is a work produced by combining or linking an
    +Application with the Library.  The particular version of the Library
    +with which the Combined Work was made is also called the "Linked
    +Version".
    +
    +  The "Minimal Corresponding Source" for a Combined Work means the
    +Corresponding Source for the Combined Work, excluding any source code
    +for portions of the Combined Work that, considered in isolation, are
    +based on the Application, and not on the Linked Version.
    +
    +  The "Corresponding Application Code" for a Combined Work means the
    +object code and/or source code for the Application, including any data
    +and utility programs needed for reproducing the Combined Work from the
    +Application, but excluding the System Libraries of the Combined Work.
    +
    +  1. Exception to Section 3 of the GNU GPL.
    +
    +  You may convey a covered work under sections 3 and 4 of this License
    +without being bound by section 3 of the GNU GPL.
    +
    +  2. Conveying Modified Versions.
    +
    +  If you modify a copy of the Library, and, in your modifications, a
    +facility refers to a function or data to be supplied by an Application
    +that uses the facility (other than as an argument passed when the
    +facility is invoked), then you may convey a copy of the modified
    +version:
    +
    +   a) under this License, provided that you make a good faith effort to
    +   ensure that, in the event an Application does not supply the
    +   function or data, the facility still operates, and performs
    +   whatever part of its purpose remains meaningful, or
    +
    +   b) under the GNU GPL, with none of the additional permissions of
    +   this License applicable to that copy.
    +
    +  3. Object Code Incorporating Material from Library Header Files.
    +
    +  The object code form of an Application may incorporate material from
    +a header file that is part of the Library.  You may convey such object
    +code under terms of your choice, provided that, if the incorporated
    +material is not limited to numerical parameters, data structure
    +layouts and accessors, or small macros, inline functions and templates
    +(ten or fewer lines in length), you do both of the following:
    +
    +   a) Give prominent notice with each copy of the object code that the
    +   Library is used in it and that the Library and its use are
    +   covered by this License.
    +
    +   b) Accompany the object code with a copy of the GNU GPL and this license
    +   document.
    +
    +  4. Combined Works.
    +
    +  You may convey a Combined Work under terms of your choice that,
    +taken together, effectively do not restrict modification of the
    +portions of the Library contained in the Combined Work and reverse
    +engineering for debugging such modifications, if you also do each of
    +the following:
    +
    +   a) Give prominent notice with each copy of the Combined Work that
    +   the Library is used in it and that the Library and its use are
    +   covered by this License.
    +
    +   b) Accompany the Combined Work with a copy of the GNU GPL and this license
    +   document.
    +
    +   c) For a Combined Work that displays copyright notices during
    +   execution, include the copyright notice for the Library among
    +   these notices, as well as a reference directing the user to the
    +   copies of the GNU GPL and this license document.
    +
    +   d) Do one of the following:
    +
    +       0) Convey the Minimal Corresponding Source under the terms of this
    +       License, and the Corresponding Application Code in a form
    +       suitable for, and under terms that permit, the user to
    +       recombine or relink the Application with a modified version of
    +       the Linked Version to produce a modified Combined Work, in the
    +       manner specified by section 6 of the GNU GPL for conveying
    +       Corresponding Source.
    +
    +       1) Use a suitable shared library mechanism for linking with the
    +       Library.  A suitable mechanism is one that (a) uses at run time
    +       a copy of the Library already present on the user's computer
    +       system, and (b) will operate properly with a modified version
    +       of the Library that is interface-compatible with the Linked
    +       Version.
    +
    +   e) Provide Installation Information, but only if you would otherwise
    +   be required to provide such information under section 6 of the
    +   GNU GPL, and only to the extent that such information is
    +   necessary to install and execute a modified version of the
    +   Combined Work produced by recombining or relinking the
    +   Application with a modified version of the Linked Version. (If
    +   you use option 4d0, the Installation Information must accompany
    +   the Minimal Corresponding Source and Corresponding Application
    +   Code. If you use option 4d1, you must provide the Installation
    +   Information in the manner specified by section 6 of the GNU GPL
    +   for conveying Corresponding Source.)
    +
    +  5. Combined Libraries.
    +
    +  You may place library facilities that are a work based on the
    +Library side by side in a single library together with other library
    +facilities that are not Applications and are not covered by this
    +License, and convey such a combined library under terms of your
    +choice, if you do both of the following:
    +
    +   a) Accompany the combined library with a copy of the same work based
    +   on the Library, uncombined with any other library facilities,
    +   conveyed under the terms of this License.
    +
    +   b) Give prominent notice with the combined library that part of it
    +   is a work based on the Library, and explaining where to find the
    +   accompanying uncombined form of the same work.
    +
    +  6. Revised Versions of the GNU Lesser General Public License.
    +
    +  The Free Software Foundation may publish revised and/or new versions
    +of the GNU Lesser General Public License from time to time. Such new
    +versions will be similar in spirit to the present version, but may
    +differ in detail to address new problems or concerns.
    +
    +  Each version is given a distinguishing version number. If the
    +Library as you received it specifies that a certain numbered version
    +of the GNU Lesser General Public License "or any later version"
    +applies to it, you have the option of following the terms and
    +conditions either of that published version or of any later version
    +published by the Free Software Foundation. If the Library as you
    +received it does not specify a version number of the GNU Lesser
    +General Public License, you may choose any version of the GNU Lesser
    +General Public License ever published by the Free Software Foundation.
    +
    +  If the Library as you received it specifies that a proxy can decide
    +whether future versions of the GNU Lesser General Public License shall
    +apply, that proxy's public statement of acceptance of any version is
    +permanent authorization for you to choose that version for the
    +Library.
    diff --git a/vendor/gopkg.in/yaml.v2/LICENSE.libyaml b/vendor/gopkg.in/yaml.v2/LICENSE.libyaml
    new file mode 100644
    index 0000000000..8da58fbf6f
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/LICENSE.libyaml
    @@ -0,0 +1,31 @@
    +The following files were ported to Go from C files of libyaml, and thus
    +are still covered by their original copyright and license:
    +
    +    apic.go
    +    emitterc.go
    +    parserc.go
    +    readerc.go
    +    scannerc.go
    +    writerc.go
    +    yamlh.go
    +    yamlprivateh.go
    +
    +Copyright (c) 2006 Kirill Simonov
    +
    +Permission is hereby granted, free of charge, to any person obtaining a copy of
    +this software and associated documentation files (the "Software"), to deal in
    +the Software without restriction, including without limitation the rights to
    +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
    +of the Software, and to permit persons to whom the Software is furnished to do
    +so, subject to the following conditions:
    +
    +The above copyright notice and this permission notice shall be included in all
    +copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    +SOFTWARE.
    diff --git a/vendor/gopkg.in/yaml.v2/README.md b/vendor/gopkg.in/yaml.v2/README.md
    new file mode 100644
    index 0000000000..7b8bd86701
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/README.md
    @@ -0,0 +1,131 @@
    +# YAML support for the Go language
    +
    +Introduction
    +------------
    +
    +The yaml package enables Go programs to comfortably encode and decode YAML
    +values. It was developed within [Canonical](https://www.canonical.com) as
    +part of the [juju](https://juju.ubuntu.com) project, and is based on a
    +pure Go port of the well-known [libyaml](http://pyyaml.org/wiki/LibYAML)
    +C library to parse and generate YAML data quickly and reliably.
    +
    +Compatibility
    +-------------
    +
    +The yaml package supports most of YAML 1.1 and 1.2, including support for
    +anchors, tags, map merging, etc. Multi-document unmarshalling is not yet
    +implemented, and base-60 floats from YAML 1.1 are purposefully not
    +supported since they're a poor design and are gone in YAML 1.2.
    +
    +Installation and usage
    +----------------------
    +
    +The import path for the package is *gopkg.in/yaml.v2*.
    +
    +To install it, run:
    +
    +    go get gopkg.in/yaml.v2
    +
    +API documentation
    +-----------------
    +
    +If opened in a browser, the import path itself leads to the API documentation:
    +
    +  * [https://gopkg.in/yaml.v2](https://gopkg.in/yaml.v2)
    +
    +API stability
    +-------------
    +
    +The package API for yaml v2 will remain stable as described in [gopkg.in](https://gopkg.in).
    +
    +
    +License
    +-------
    +
    +The yaml package is licensed under the LGPL with an exception that allows it to be linked statically. Please see the LICENSE file for details.
    +
    +
    +Example
    +-------
    +
    +```Go
    +package main
    +
    +import (
    +        "fmt"
    +        "log"
    +
    +        "gopkg.in/yaml.v2"
    +)
    +
    +var data = `
    +a: Easy!
    +b:
    +  c: 2
    +  d: [3, 4]
    +`
    +
    +type T struct {
    +        A string
    +        B struct {
    +                RenamedC int   `yaml:"c"`
    +                D        []int `yaml:",flow"`
    +        }
    +}
    +
    +func main() {
    +        t := T{}
    +    
    +        err := yaml.Unmarshal([]byte(data), &t)
    +        if err != nil {
    +                log.Fatalf("error: %v", err)
    +        }
    +        fmt.Printf("--- t:\n%v\n\n", t)
    +    
    +        d, err := yaml.Marshal(&t)
    +        if err != nil {
    +                log.Fatalf("error: %v", err)
    +        }
    +        fmt.Printf("--- t dump:\n%s\n\n", string(d))
    +    
    +        m := make(map[interface{}]interface{})
    +    
    +        err = yaml.Unmarshal([]byte(data), &m)
    +        if err != nil {
    +                log.Fatalf("error: %v", err)
    +        }
    +        fmt.Printf("--- m:\n%v\n\n", m)
    +    
    +        d, err = yaml.Marshal(&m)
    +        if err != nil {
    +                log.Fatalf("error: %v", err)
    +        }
    +        fmt.Printf("--- m dump:\n%s\n\n", string(d))
    +}
    +```
    +
    +This example will generate the following output:
    +
    +```
    +--- t:
    +{Easy! {2 [3 4]}}
    +
    +--- t dump:
    +a: Easy!
    +b:
    +  c: 2
    +  d: [3, 4]
    +
    +
    +--- m:
    +map[a:Easy! b:map[c:2 d:[3 4]]]
    +
    +--- m dump:
    +a: Easy!
    +b:
    +  c: 2
    +  d:
    +  - 3
    +  - 4
    +```
    +
    diff --git a/vendor/gopkg.in/yaml.v2/apic.go b/vendor/gopkg.in/yaml.v2/apic.go
    new file mode 100644
    index 0000000000..95ec014e8c
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/apic.go
    @@ -0,0 +1,742 @@
    +package yaml
    +
    +import (
    +	"io"
    +	"os"
    +)
    +
    +func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) {
    +	//fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens))
    +
    +	// Check if we can move the queue at the beginning of the buffer.
    +	if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) {
    +		if parser.tokens_head != len(parser.tokens) {
    +			copy(parser.tokens, parser.tokens[parser.tokens_head:])
    +		}
    +		parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head]
    +		parser.tokens_head = 0
    +	}
    +	parser.tokens = append(parser.tokens, *token)
    +	if pos < 0 {
    +		return
    +	}
    +	copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:])
    +	parser.tokens[parser.tokens_head+pos] = *token
    +}
    +
    +// Create a new parser object.
    +func yaml_parser_initialize(parser *yaml_parser_t) bool {
    +	*parser = yaml_parser_t{
    +		raw_buffer: make([]byte, 0, input_raw_buffer_size),
    +		buffer:     make([]byte, 0, input_buffer_size),
    +	}
    +	return true
    +}
    +
    +// Destroy a parser object.
    +func yaml_parser_delete(parser *yaml_parser_t) {
    +	*parser = yaml_parser_t{}
    +}
    +
    +// String read handler.
    +func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) {
    +	if parser.input_pos == len(parser.input) {
    +		return 0, io.EOF
    +	}
    +	n = copy(buffer, parser.input[parser.input_pos:])
    +	parser.input_pos += n
    +	return n, nil
    +}
    +
    +// File read handler.
    +func yaml_file_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) {
    +	return parser.input_file.Read(buffer)
    +}
    +
    +// Set a string input.
    +func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) {
    +	if parser.read_handler != nil {
    +		panic("must set the input source only once")
    +	}
    +	parser.read_handler = yaml_string_read_handler
    +	parser.input = input
    +	parser.input_pos = 0
    +}
    +
    +// Set a file input.
    +func yaml_parser_set_input_file(parser *yaml_parser_t, file *os.File) {
    +	if parser.read_handler != nil {
    +		panic("must set the input source only once")
    +	}
    +	parser.read_handler = yaml_file_read_handler
    +	parser.input_file = file
    +}
    +
    +// Set the source encoding.
    +func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) {
    +	if parser.encoding != yaml_ANY_ENCODING {
    +		panic("must set the encoding only once")
    +	}
    +	parser.encoding = encoding
    +}
    +
    +// Create a new emitter object.
    +func yaml_emitter_initialize(emitter *yaml_emitter_t) bool {
    +	*emitter = yaml_emitter_t{
    +		buffer:     make([]byte, output_buffer_size),
    +		raw_buffer: make([]byte, 0, output_raw_buffer_size),
    +		states:     make([]yaml_emitter_state_t, 0, initial_stack_size),
    +		events:     make([]yaml_event_t, 0, initial_queue_size),
    +	}
    +	return true
    +}
    +
    +// Destroy an emitter object.
    +func yaml_emitter_delete(emitter *yaml_emitter_t) {
    +	*emitter = yaml_emitter_t{}
    +}
    +
    +// String write handler.
    +func yaml_string_write_handler(emitter *yaml_emitter_t, buffer []byte) error {
    +	*emitter.output_buffer = append(*emitter.output_buffer, buffer...)
    +	return nil
    +}
    +
    +// File write handler.
    +func yaml_file_write_handler(emitter *yaml_emitter_t, buffer []byte) error {
    +	_, err := emitter.output_file.Write(buffer)
    +	return err
    +}
    +
    +// Set a string output.
    +func yaml_emitter_set_output_string(emitter *yaml_emitter_t, output_buffer *[]byte) {
    +	if emitter.write_handler != nil {
    +		panic("must set the output target only once")
    +	}
    +	emitter.write_handler = yaml_string_write_handler
    +	emitter.output_buffer = output_buffer
    +}
    +
    +// Set a file output.
    +func yaml_emitter_set_output_file(emitter *yaml_emitter_t, file io.Writer) {
    +	if emitter.write_handler != nil {
    +		panic("must set the output target only once")
    +	}
    +	emitter.write_handler = yaml_file_write_handler
    +	emitter.output_file = file
    +}
    +
    +// Set the output encoding.
    +func yaml_emitter_set_encoding(emitter *yaml_emitter_t, encoding yaml_encoding_t) {
    +	if emitter.encoding != yaml_ANY_ENCODING {
    +		panic("must set the output encoding only once")
    +	}
    +	emitter.encoding = encoding
    +}
    +
    +// Set the canonical output style.
    +func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) {
    +	emitter.canonical = canonical
    +}
    +
    +//// Set the indentation increment.
    +func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) {
    +	if indent < 2 || indent > 9 {
    +		indent = 2
    +	}
    +	emitter.best_indent = indent
    +}
    +
    +// Set the preferred line width.
    +func yaml_emitter_set_width(emitter *yaml_emitter_t, width int) {
    +	if width < 0 {
    +		width = -1
    +	}
    +	emitter.best_width = width
    +}
    +
    +// Set if unescaped non-ASCII characters are allowed.
    +func yaml_emitter_set_unicode(emitter *yaml_emitter_t, unicode bool) {
    +	emitter.unicode = unicode
    +}
    +
    +// Set the preferred line break character.
    +func yaml_emitter_set_break(emitter *yaml_emitter_t, line_break yaml_break_t) {
    +	emitter.line_break = line_break
    +}
    +
    +///*
    +// * Destroy a token object.
    +// */
    +//
    +//YAML_DECLARE(void)
    +//yaml_token_delete(yaml_token_t *token)
    +//{
    +//    assert(token);  // Non-NULL token object expected.
    +//
    +//    switch (token.type)
    +//    {
    +//        case YAML_TAG_DIRECTIVE_TOKEN:
    +//            yaml_free(token.data.tag_directive.handle);
    +//            yaml_free(token.data.tag_directive.prefix);
    +//            break;
    +//
    +//        case YAML_ALIAS_TOKEN:
    +//            yaml_free(token.data.alias.value);
    +//            break;
    +//
    +//        case YAML_ANCHOR_TOKEN:
    +//            yaml_free(token.data.anchor.value);
    +//            break;
    +//
    +//        case YAML_TAG_TOKEN:
    +//            yaml_free(token.data.tag.handle);
    +//            yaml_free(token.data.tag.suffix);
    +//            break;
    +//
    +//        case YAML_SCALAR_TOKEN:
    +//            yaml_free(token.data.scalar.value);
    +//            break;
    +//
    +//        default:
    +//            break;
    +//    }
    +//
    +//    memset(token, 0, sizeof(yaml_token_t));
    +//}
    +//
    +///*
    +// * Check if a string is a valid UTF-8 sequence.
    +// *
    +// * Check 'reader.c' for more details on UTF-8 encoding.
    +// */
    +//
    +//static int
    +//yaml_check_utf8(yaml_char_t *start, size_t length)
    +//{
    +//    yaml_char_t *end = start+length;
    +//    yaml_char_t *pointer = start;
    +//
    +//    while (pointer < end) {
    +//        unsigned char octet;
    +//        unsigned int width;
    +//        unsigned int value;
    +//        size_t k;
    +//
    +//        octet = pointer[0];
    +//        width = (octet & 0x80) == 0x00 ? 1 :
    +//                (octet & 0xE0) == 0xC0 ? 2 :
    +//                (octet & 0xF0) == 0xE0 ? 3 :
    +//                (octet & 0xF8) == 0xF0 ? 4 : 0;
    +//        value = (octet & 0x80) == 0x00 ? octet & 0x7F :
    +//                (octet & 0xE0) == 0xC0 ? octet & 0x1F :
    +//                (octet & 0xF0) == 0xE0 ? octet & 0x0F :
    +//                (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0;
    +//        if (!width) return 0;
    +//        if (pointer+width > end) return 0;
    +//        for (k = 1; k < width; k ++) {
    +//            octet = pointer[k];
    +//            if ((octet & 0xC0) != 0x80) return 0;
    +//            value = (value << 6) + (octet & 0x3F);
    +//        }
    +//        if (!((width == 1) ||
    +//            (width == 2 && value >= 0x80) ||
    +//            (width == 3 && value >= 0x800) ||
    +//            (width == 4 && value >= 0x10000))) return 0;
    +//
    +//        pointer += width;
    +//    }
    +//
    +//    return 1;
    +//}
    +//
    +
    +// Create STREAM-START.
    +func yaml_stream_start_event_initialize(event *yaml_event_t, encoding yaml_encoding_t) bool {
    +	*event = yaml_event_t{
    +		typ:      yaml_STREAM_START_EVENT,
    +		encoding: encoding,
    +	}
    +	return true
    +}
    +
    +// Create STREAM-END.
    +func yaml_stream_end_event_initialize(event *yaml_event_t) bool {
    +	*event = yaml_event_t{
    +		typ: yaml_STREAM_END_EVENT,
    +	}
    +	return true
    +}
    +
    +// Create DOCUMENT-START.
    +func yaml_document_start_event_initialize(event *yaml_event_t, version_directive *yaml_version_directive_t,
    +	tag_directives []yaml_tag_directive_t, implicit bool) bool {
    +	*event = yaml_event_t{
    +		typ:               yaml_DOCUMENT_START_EVENT,
    +		version_directive: version_directive,
    +		tag_directives:    tag_directives,
    +		implicit:          implicit,
    +	}
    +	return true
    +}
    +
    +// Create DOCUMENT-END.
    +func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) bool {
    +	*event = yaml_event_t{
    +		typ:      yaml_DOCUMENT_END_EVENT,
    +		implicit: implicit,
    +	}
    +	return true
    +}
    +
    +///*
    +// * Create ALIAS.
    +// */
    +//
    +//YAML_DECLARE(int)
    +//yaml_alias_event_initialize(event *yaml_event_t, anchor *yaml_char_t)
    +//{
    +//    mark yaml_mark_t = { 0, 0, 0 }
    +//    anchor_copy *yaml_char_t = NULL
    +//
    +//    assert(event) // Non-NULL event object is expected.
    +//    assert(anchor) // Non-NULL anchor is expected.
    +//
    +//    if (!yaml_check_utf8(anchor, strlen((char *)anchor))) return 0
    +//
    +//    anchor_copy = yaml_strdup(anchor)
    +//    if (!anchor_copy)
    +//        return 0
    +//
    +//    ALIAS_EVENT_INIT(*event, anchor_copy, mark, mark)
    +//
    +//    return 1
    +//}
    +
    +// Create SCALAR.
    +func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool {
    +	*event = yaml_event_t{
    +		typ:             yaml_SCALAR_EVENT,
    +		anchor:          anchor,
    +		tag:             tag,
    +		value:           value,
    +		implicit:        plain_implicit,
    +		quoted_implicit: quoted_implicit,
    +		style:           yaml_style_t(style),
    +	}
    +	return true
    +}
    +
    +// Create SEQUENCE-START.
    +func yaml_sequence_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_sequence_style_t) bool {
    +	*event = yaml_event_t{
    +		typ:      yaml_SEQUENCE_START_EVENT,
    +		anchor:   anchor,
    +		tag:      tag,
    +		implicit: implicit,
    +		style:    yaml_style_t(style),
    +	}
    +	return true
    +}
    +
    +// Create SEQUENCE-END.
    +func yaml_sequence_end_event_initialize(event *yaml_event_t) bool {
    +	*event = yaml_event_t{
    +		typ: yaml_SEQUENCE_END_EVENT,
    +	}
    +	return true
    +}
    +
    +// Create MAPPING-START.
    +func yaml_mapping_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_mapping_style_t) bool {
    +	*event = yaml_event_t{
    +		typ:      yaml_MAPPING_START_EVENT,
    +		anchor:   anchor,
    +		tag:      tag,
    +		implicit: implicit,
    +		style:    yaml_style_t(style),
    +	}
    +	return true
    +}
    +
    +// Create MAPPING-END.
    +func yaml_mapping_end_event_initialize(event *yaml_event_t) bool {
    +	*event = yaml_event_t{
    +		typ: yaml_MAPPING_END_EVENT,
    +	}
    +	return true
    +}
    +
    +// Destroy an event object.
    +func yaml_event_delete(event *yaml_event_t) {
    +	*event = yaml_event_t{}
    +}
    +
    +///*
    +// * Create a document object.
    +// */
    +//
    +//YAML_DECLARE(int)
    +//yaml_document_initialize(document *yaml_document_t,
    +//        version_directive *yaml_version_directive_t,
    +//        tag_directives_start *yaml_tag_directive_t,
    +//        tag_directives_end *yaml_tag_directive_t,
    +//        start_implicit int, end_implicit int)
    +//{
    +//    struct {
    +//        error yaml_error_type_t
    +//    } context
    +//    struct {
    +//        start *yaml_node_t
    +//        end *yaml_node_t
    +//        top *yaml_node_t
    +//    } nodes = { NULL, NULL, NULL }
    +//    version_directive_copy *yaml_version_directive_t = NULL
    +//    struct {
    +//        start *yaml_tag_directive_t
    +//        end *yaml_tag_directive_t
    +//        top *yaml_tag_directive_t
    +//    } tag_directives_copy = { NULL, NULL, NULL }
    +//    value yaml_tag_directive_t = { NULL, NULL }
    +//    mark yaml_mark_t = { 0, 0, 0 }
    +//
    +//    assert(document) // Non-NULL document object is expected.
    +//    assert((tag_directives_start && tag_directives_end) ||
    +//            (tag_directives_start == tag_directives_end))
    +//                            // Valid tag directives are expected.
    +//
    +//    if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error
    +//
    +//    if (version_directive) {
    +//        version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t))
    +//        if (!version_directive_copy) goto error
    +//        version_directive_copy.major = version_directive.major
    +//        version_directive_copy.minor = version_directive.minor
    +//    }
    +//
    +//    if (tag_directives_start != tag_directives_end) {
    +//        tag_directive *yaml_tag_directive_t
    +//        if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE))
    +//            goto error
    +//        for (tag_directive = tag_directives_start
    +//                tag_directive != tag_directives_end; tag_directive ++) {
    +//            assert(tag_directive.handle)
    +//            assert(tag_directive.prefix)
    +//            if (!yaml_check_utf8(tag_directive.handle,
    +//                        strlen((char *)tag_directive.handle)))
    +//                goto error
    +//            if (!yaml_check_utf8(tag_directive.prefix,
    +//                        strlen((char *)tag_directive.prefix)))
    +//                goto error
    +//            value.handle = yaml_strdup(tag_directive.handle)
    +//            value.prefix = yaml_strdup(tag_directive.prefix)
    +//            if (!value.handle || !value.prefix) goto error
    +//            if (!PUSH(&context, tag_directives_copy, value))
    +//                goto error
    +//            value.handle = NULL
    +//            value.prefix = NULL
    +//        }
    +//    }
    +//
    +//    DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy,
    +//            tag_directives_copy.start, tag_directives_copy.top,
    +//            start_implicit, end_implicit, mark, mark)
    +//
    +//    return 1
    +//
    +//error:
    +//    STACK_DEL(&context, nodes)
    +//    yaml_free(version_directive_copy)
    +//    while (!STACK_EMPTY(&context, tag_directives_copy)) {
    +//        value yaml_tag_directive_t = POP(&context, tag_directives_copy)
    +//        yaml_free(value.handle)
    +//        yaml_free(value.prefix)
    +//    }
    +//    STACK_DEL(&context, tag_directives_copy)
    +//    yaml_free(value.handle)
    +//    yaml_free(value.prefix)
    +//
    +//    return 0
    +//}
    +//
    +///*
    +// * Destroy a document object.
    +// */
    +//
    +//YAML_DECLARE(void)
    +//yaml_document_delete(document *yaml_document_t)
    +//{
    +//    struct {
    +//        error yaml_error_type_t
    +//    } context
    +//    tag_directive *yaml_tag_directive_t
    +//
    +//    context.error = YAML_NO_ERROR // Eliminate a compliler warning.
    +//
    +//    assert(document) // Non-NULL document object is expected.
    +//
    +//    while (!STACK_EMPTY(&context, document.nodes)) {
    +//        node yaml_node_t = POP(&context, document.nodes)
    +//        yaml_free(node.tag)
    +//        switch (node.type) {
    +//            case YAML_SCALAR_NODE:
    +//                yaml_free(node.data.scalar.value)
    +//                break
    +//            case YAML_SEQUENCE_NODE:
    +//                STACK_DEL(&context, node.data.sequence.items)
    +//                break
    +//            case YAML_MAPPING_NODE:
    +//                STACK_DEL(&context, node.data.mapping.pairs)
    +//                break
    +//            default:
    +//                assert(0) // Should not happen.
    +//        }
    +//    }
    +//    STACK_DEL(&context, document.nodes)
    +//
    +//    yaml_free(document.version_directive)
    +//    for (tag_directive = document.tag_directives.start
    +//            tag_directive != document.tag_directives.end
    +//            tag_directive++) {
    +//        yaml_free(tag_directive.handle)
    +//        yaml_free(tag_directive.prefix)
    +//    }
    +//    yaml_free(document.tag_directives.start)
    +//
    +//    memset(document, 0, sizeof(yaml_document_t))
    +//}
    +//
    +///**
    +// * Get a document node.
    +// */
    +//
    +//YAML_DECLARE(yaml_node_t *)
    +//yaml_document_get_node(document *yaml_document_t, index int)
    +//{
    +//    assert(document) // Non-NULL document object is expected.
    +//
    +//    if (index > 0 && document.nodes.start + index <= document.nodes.top) {
    +//        return document.nodes.start + index - 1
    +//    }
    +//    return NULL
    +//}
    +//
    +///**
    +// * Get the root object.
    +// */
    +//
    +//YAML_DECLARE(yaml_node_t *)
    +//yaml_document_get_root_node(document *yaml_document_t)
    +//{
    +//    assert(document) // Non-NULL document object is expected.
    +//
    +//    if (document.nodes.top != document.nodes.start) {
    +//        return document.nodes.start
    +//    }
    +//    return NULL
    +//}
    +//
    +///*
    +// * Add a scalar node to a document.
    +// */
    +//
    +//YAML_DECLARE(int)
    +//yaml_document_add_scalar(document *yaml_document_t,
    +//        tag *yaml_char_t, value *yaml_char_t, length int,
    +//        style yaml_scalar_style_t)
    +//{
    +//    struct {
    +//        error yaml_error_type_t
    +//    } context
    +//    mark yaml_mark_t = { 0, 0, 0 }
    +//    tag_copy *yaml_char_t = NULL
    +//    value_copy *yaml_char_t = NULL
    +//    node yaml_node_t
    +//
    +//    assert(document) // Non-NULL document object is expected.
    +//    assert(value) // Non-NULL value is expected.
    +//
    +//    if (!tag) {
    +//        tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG
    +//    }
    +//
    +//    if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
    +//    tag_copy = yaml_strdup(tag)
    +//    if (!tag_copy) goto error
    +//
    +//    if (length < 0) {
    +//        length = strlen((char *)value)
    +//    }
    +//
    +//    if (!yaml_check_utf8(value, length)) goto error
    +//    value_copy = yaml_malloc(length+1)
    +//    if (!value_copy) goto error
    +//    memcpy(value_copy, value, length)
    +//    value_copy[length] = '\0'
    +//
    +//    SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark)
    +//    if (!PUSH(&context, document.nodes, node)) goto error
    +//
    +//    return document.nodes.top - document.nodes.start
    +//
    +//error:
    +//    yaml_free(tag_copy)
    +//    yaml_free(value_copy)
    +//
    +//    return 0
    +//}
    +//
    +///*
    +// * Add a sequence node to a document.
    +// */
    +//
    +//YAML_DECLARE(int)
    +//yaml_document_add_sequence(document *yaml_document_t,
    +//        tag *yaml_char_t, style yaml_sequence_style_t)
    +//{
    +//    struct {
    +//        error yaml_error_type_t
    +//    } context
    +//    mark yaml_mark_t = { 0, 0, 0 }
    +//    tag_copy *yaml_char_t = NULL
    +//    struct {
    +//        start *yaml_node_item_t
    +//        end *yaml_node_item_t
    +//        top *yaml_node_item_t
    +//    } items = { NULL, NULL, NULL }
    +//    node yaml_node_t
    +//
    +//    assert(document) // Non-NULL document object is expected.
    +//
    +//    if (!tag) {
    +//        tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG
    +//    }
    +//
    +//    if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
    +//    tag_copy = yaml_strdup(tag)
    +//    if (!tag_copy) goto error
    +//
    +//    if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error
    +//
    +//    SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end,
    +//            style, mark, mark)
    +//    if (!PUSH(&context, document.nodes, node)) goto error
    +//
    +//    return document.nodes.top - document.nodes.start
    +//
    +//error:
    +//    STACK_DEL(&context, items)
    +//    yaml_free(tag_copy)
    +//
    +//    return 0
    +//}
    +//
    +///*
    +// * Add a mapping node to a document.
    +// */
    +//
    +//YAML_DECLARE(int)
    +//yaml_document_add_mapping(document *yaml_document_t,
    +//        tag *yaml_char_t, style yaml_mapping_style_t)
    +//{
    +//    struct {
    +//        error yaml_error_type_t
    +//    } context
    +//    mark yaml_mark_t = { 0, 0, 0 }
    +//    tag_copy *yaml_char_t = NULL
    +//    struct {
    +//        start *yaml_node_pair_t
    +//        end *yaml_node_pair_t
    +//        top *yaml_node_pair_t
    +//    } pairs = { NULL, NULL, NULL }
    +//    node yaml_node_t
    +//
    +//    assert(document) // Non-NULL document object is expected.
    +//
    +//    if (!tag) {
    +//        tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG
    +//    }
    +//
    +//    if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error
    +//    tag_copy = yaml_strdup(tag)
    +//    if (!tag_copy) goto error
    +//
    +//    if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error
    +//
    +//    MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end,
    +//            style, mark, mark)
    +//    if (!PUSH(&context, document.nodes, node)) goto error
    +//
    +//    return document.nodes.top - document.nodes.start
    +//
    +//error:
    +//    STACK_DEL(&context, pairs)
    +//    yaml_free(tag_copy)
    +//
    +//    return 0
    +//}
    +//
    +///*
    +// * Append an item to a sequence node.
    +// */
    +//
    +//YAML_DECLARE(int)
    +//yaml_document_append_sequence_item(document *yaml_document_t,
    +//        sequence int, item int)
    +//{
    +//    struct {
    +//        error yaml_error_type_t
    +//    } context
    +//
    +//    assert(document) // Non-NULL document is required.
    +//    assert(sequence > 0
    +//            && document.nodes.start + sequence <= document.nodes.top)
    +//                            // Valid sequence id is required.
    +//    assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE)
    +//                            // A sequence node is required.
    +//    assert(item > 0 && document.nodes.start + item <= document.nodes.top)
    +//                            // Valid item id is required.
    +//
    +//    if (!PUSH(&context,
    +//                document.nodes.start[sequence-1].data.sequence.items, item))
    +//        return 0
    +//
    +//    return 1
    +//}
    +//
    +///*
    +// * Append a pair of a key and a value to a mapping node.
    +// */
    +//
    +//YAML_DECLARE(int)
    +//yaml_document_append_mapping_pair(document *yaml_document_t,
    +//        mapping int, key int, value int)
    +//{
    +//    struct {
    +//        error yaml_error_type_t
    +//    } context
    +//
    +//    pair yaml_node_pair_t
    +//
    +//    assert(document) // Non-NULL document is required.
    +//    assert(mapping > 0
    +//            && document.nodes.start + mapping <= document.nodes.top)
    +//                            // Valid mapping id is required.
    +//    assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE)
    +//                            // A mapping node is required.
    +//    assert(key > 0 && document.nodes.start + key <= document.nodes.top)
    +//                            // Valid key id is required.
    +//    assert(value > 0 && document.nodes.start + value <= document.nodes.top)
    +//                            // Valid value id is required.
    +//
    +//    pair.key = key
    +//    pair.value = value
    +//
    +//    if (!PUSH(&context,
    +//                document.nodes.start[mapping-1].data.mapping.pairs, pair))
    +//        return 0
    +//
    +//    return 1
    +//}
    +//
    +//
    diff --git a/vendor/gopkg.in/yaml.v2/decode.go b/vendor/gopkg.in/yaml.v2/decode.go
    new file mode 100644
    index 0000000000..085cddc44b
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/decode.go
    @@ -0,0 +1,683 @@
    +package yaml
    +
    +import (
    +	"encoding"
    +	"encoding/base64"
    +	"fmt"
    +	"math"
    +	"reflect"
    +	"strconv"
    +	"time"
    +)
    +
    +const (
    +	documentNode = 1 << iota
    +	mappingNode
    +	sequenceNode
    +	scalarNode
    +	aliasNode
    +)
    +
    +type node struct {
    +	kind         int
    +	line, column int
    +	tag          string
    +	value        string
    +	implicit     bool
    +	children     []*node
    +	anchors      map[string]*node
    +}
    +
    +// ----------------------------------------------------------------------------
    +// Parser, produces a node tree out of a libyaml event stream.
    +
    +type parser struct {
    +	parser yaml_parser_t
    +	event  yaml_event_t
    +	doc    *node
    +}
    +
    +func newParser(b []byte) *parser {
    +	p := parser{}
    +	if !yaml_parser_initialize(&p.parser) {
    +		panic("failed to initialize YAML emitter")
    +	}
    +
    +	if len(b) == 0 {
    +		b = []byte{'\n'}
    +	}
    +
    +	yaml_parser_set_input_string(&p.parser, b)
    +
    +	p.skip()
    +	if p.event.typ != yaml_STREAM_START_EVENT {
    +		panic("expected stream start event, got " + strconv.Itoa(int(p.event.typ)))
    +	}
    +	p.skip()
    +	return &p
    +}
    +
    +func (p *parser) destroy() {
    +	if p.event.typ != yaml_NO_EVENT {
    +		yaml_event_delete(&p.event)
    +	}
    +	yaml_parser_delete(&p.parser)
    +}
    +
    +func (p *parser) skip() {
    +	if p.event.typ != yaml_NO_EVENT {
    +		if p.event.typ == yaml_STREAM_END_EVENT {
    +			failf("attempted to go past the end of stream; corrupted value?")
    +		}
    +		yaml_event_delete(&p.event)
    +	}
    +	if !yaml_parser_parse(&p.parser, &p.event) {
    +		p.fail()
    +	}
    +}
    +
    +func (p *parser) fail() {
    +	var where string
    +	var line int
    +	if p.parser.problem_mark.line != 0 {
    +		line = p.parser.problem_mark.line
    +	} else if p.parser.context_mark.line != 0 {
    +		line = p.parser.context_mark.line
    +	}
    +	if line != 0 {
    +		where = "line " + strconv.Itoa(line) + ": "
    +	}
    +	var msg string
    +	if len(p.parser.problem) > 0 {
    +		msg = p.parser.problem
    +	} else {
    +		msg = "unknown problem parsing YAML content"
    +	}
    +	failf("%s%s", where, msg)
    +}
    +
    +func (p *parser) anchor(n *node, anchor []byte) {
    +	if anchor != nil {
    +		p.doc.anchors[string(anchor)] = n
    +	}
    +}
    +
    +func (p *parser) parse() *node {
    +	switch p.event.typ {
    +	case yaml_SCALAR_EVENT:
    +		return p.scalar()
    +	case yaml_ALIAS_EVENT:
    +		return p.alias()
    +	case yaml_MAPPING_START_EVENT:
    +		return p.mapping()
    +	case yaml_SEQUENCE_START_EVENT:
    +		return p.sequence()
    +	case yaml_DOCUMENT_START_EVENT:
    +		return p.document()
    +	case yaml_STREAM_END_EVENT:
    +		// Happens when attempting to decode an empty buffer.
    +		return nil
    +	default:
    +		panic("attempted to parse unknown event: " + strconv.Itoa(int(p.event.typ)))
    +	}
    +	panic("unreachable")
    +}
    +
    +func (p *parser) node(kind int) *node {
    +	return &node{
    +		kind:   kind,
    +		line:   p.event.start_mark.line,
    +		column: p.event.start_mark.column,
    +	}
    +}
    +
    +func (p *parser) document() *node {
    +	n := p.node(documentNode)
    +	n.anchors = make(map[string]*node)
    +	p.doc = n
    +	p.skip()
    +	n.children = append(n.children, p.parse())
    +	if p.event.typ != yaml_DOCUMENT_END_EVENT {
    +		panic("expected end of document event but got " + strconv.Itoa(int(p.event.typ)))
    +	}
    +	p.skip()
    +	return n
    +}
    +
    +func (p *parser) alias() *node {
    +	n := p.node(aliasNode)
    +	n.value = string(p.event.anchor)
    +	p.skip()
    +	return n
    +}
    +
    +func (p *parser) scalar() *node {
    +	n := p.node(scalarNode)
    +	n.value = string(p.event.value)
    +	n.tag = string(p.event.tag)
    +	n.implicit = p.event.implicit
    +	p.anchor(n, p.event.anchor)
    +	p.skip()
    +	return n
    +}
    +
    +func (p *parser) sequence() *node {
    +	n := p.node(sequenceNode)
    +	p.anchor(n, p.event.anchor)
    +	p.skip()
    +	for p.event.typ != yaml_SEQUENCE_END_EVENT {
    +		n.children = append(n.children, p.parse())
    +	}
    +	p.skip()
    +	return n
    +}
    +
    +func (p *parser) mapping() *node {
    +	n := p.node(mappingNode)
    +	p.anchor(n, p.event.anchor)
    +	p.skip()
    +	for p.event.typ != yaml_MAPPING_END_EVENT {
    +		n.children = append(n.children, p.parse(), p.parse())
    +	}
    +	p.skip()
    +	return n
    +}
    +
    +// ----------------------------------------------------------------------------
    +// Decoder, unmarshals a node into a provided value.
    +
    +type decoder struct {
    +	doc     *node
    +	aliases map[string]bool
    +	mapType reflect.Type
    +	terrors []string
    +}
    +
    +var (
    +	mapItemType    = reflect.TypeOf(MapItem{})
    +	durationType   = reflect.TypeOf(time.Duration(0))
    +	defaultMapType = reflect.TypeOf(map[interface{}]interface{}{})
    +	ifaceType      = defaultMapType.Elem()
    +)
    +
    +func newDecoder() *decoder {
    +	d := &decoder{mapType: defaultMapType}
    +	d.aliases = make(map[string]bool)
    +	return d
    +}
    +
    +func (d *decoder) terror(n *node, tag string, out reflect.Value) {
    +	if n.tag != "" {
    +		tag = n.tag
    +	}
    +	value := n.value
    +	if tag != yaml_SEQ_TAG && tag != yaml_MAP_TAG {
    +		if len(value) > 10 {
    +			value = " `" + value[:7] + "...`"
    +		} else {
    +			value = " `" + value + "`"
    +		}
    +	}
    +	d.terrors = append(d.terrors, fmt.Sprintf("line %d: cannot unmarshal %s%s into %s", n.line+1, shortTag(tag), value, out.Type()))
    +}
    +
    +func (d *decoder) callUnmarshaler(n *node, u Unmarshaler) (good bool) {
    +	terrlen := len(d.terrors)
    +	err := u.UnmarshalYAML(func(v interface{}) (err error) {
    +		defer handleErr(&err)
    +		d.unmarshal(n, reflect.ValueOf(v))
    +		if len(d.terrors) > terrlen {
    +			issues := d.terrors[terrlen:]
    +			d.terrors = d.terrors[:terrlen]
    +			return &TypeError{issues}
    +		}
    +		return nil
    +	})
    +	if e, ok := err.(*TypeError); ok {
    +		d.terrors = append(d.terrors, e.Errors...)
    +		return false
    +	}
    +	if err != nil {
    +		fail(err)
    +	}
    +	return true
    +}
    +
    +// d.prepare initializes and dereferences pointers and calls UnmarshalYAML
    +// if a value is found to implement it.
    +// It returns the initialized and dereferenced out value, whether
    +// unmarshalling was already done by UnmarshalYAML, and if so whether
    +// its types unmarshalled appropriately.
    +//
    +// If n holds a null value, prepare returns before doing anything.
    +func (d *decoder) prepare(n *node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) {
    +	if n.tag == yaml_NULL_TAG || n.kind == scalarNode && n.tag == "" && (n.value == "null" || n.value == "") {
    +		return out, false, false
    +	}
    +	again := true
    +	for again {
    +		again = false
    +		if out.Kind() == reflect.Ptr {
    +			if out.IsNil() {
    +				out.Set(reflect.New(out.Type().Elem()))
    +			}
    +			out = out.Elem()
    +			again = true
    +		}
    +		if out.CanAddr() {
    +			if u, ok := out.Addr().Interface().(Unmarshaler); ok {
    +				good = d.callUnmarshaler(n, u)
    +				return out, true, good
    +			}
    +		}
    +	}
    +	return out, false, false
    +}
    +
    +func (d *decoder) unmarshal(n *node, out reflect.Value) (good bool) {
    +	switch n.kind {
    +	case documentNode:
    +		return d.document(n, out)
    +	case aliasNode:
    +		return d.alias(n, out)
    +	}
    +	out, unmarshaled, good := d.prepare(n, out)
    +	if unmarshaled {
    +		return good
    +	}
    +	switch n.kind {
    +	case scalarNode:
    +		good = d.scalar(n, out)
    +	case mappingNode:
    +		good = d.mapping(n, out)
    +	case sequenceNode:
    +		good = d.sequence(n, out)
    +	default:
    +		panic("internal error: unknown node kind: " + strconv.Itoa(n.kind))
    +	}
    +	return good
    +}
    +
    +func (d *decoder) document(n *node, out reflect.Value) (good bool) {
    +	if len(n.children) == 1 {
    +		d.doc = n
    +		d.unmarshal(n.children[0], out)
    +		return true
    +	}
    +	return false
    +}
    +
    +func (d *decoder) alias(n *node, out reflect.Value) (good bool) {
    +	an, ok := d.doc.anchors[n.value]
    +	if !ok {
    +		failf("unknown anchor '%s' referenced", n.value)
    +	}
    +	if d.aliases[n.value] {
    +		failf("anchor '%s' value contains itself", n.value)
    +	}
    +	d.aliases[n.value] = true
    +	good = d.unmarshal(an, out)
    +	delete(d.aliases, n.value)
    +	return good
    +}
    +
    +var zeroValue reflect.Value
    +
    +func resetMap(out reflect.Value) {
    +	for _, k := range out.MapKeys() {
    +		out.SetMapIndex(k, zeroValue)
    +	}
    +}
    +
    +func (d *decoder) scalar(n *node, out reflect.Value) (good bool) {
    +	var tag string
    +	var resolved interface{}
    +	if n.tag == "" && !n.implicit {
    +		tag = yaml_STR_TAG
    +		resolved = n.value
    +	} else {
    +		tag, resolved = resolve(n.tag, n.value)
    +		if tag == yaml_BINARY_TAG {
    +			data, err := base64.StdEncoding.DecodeString(resolved.(string))
    +			if err != nil {
    +				failf("!!binary value contains invalid base64 data")
    +			}
    +			resolved = string(data)
    +		}
    +	}
    +	if resolved == nil {
    +		if out.Kind() == reflect.Map && !out.CanAddr() {
    +			resetMap(out)
    +		} else {
    +			out.Set(reflect.Zero(out.Type()))
    +		}
    +		return true
    +	}
    +	if s, ok := resolved.(string); ok && out.CanAddr() {
    +		if u, ok := out.Addr().Interface().(encoding.TextUnmarshaler); ok {
    +			err := u.UnmarshalText([]byte(s))
    +			if err != nil {
    +				fail(err)
    +			}
    +			return true
    +		}
    +	}
    +	switch out.Kind() {
    +	case reflect.String:
    +		if tag == yaml_BINARY_TAG {
    +			out.SetString(resolved.(string))
    +			good = true
    +		} else if resolved != nil {
    +			out.SetString(n.value)
    +			good = true
    +		}
    +	case reflect.Interface:
    +		if resolved == nil {
    +			out.Set(reflect.Zero(out.Type()))
    +		} else {
    +			out.Set(reflect.ValueOf(resolved))
    +		}
    +		good = true
    +	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
    +		switch resolved := resolved.(type) {
    +		case int:
    +			if !out.OverflowInt(int64(resolved)) {
    +				out.SetInt(int64(resolved))
    +				good = true
    +			}
    +		case int64:
    +			if !out.OverflowInt(resolved) {
    +				out.SetInt(resolved)
    +				good = true
    +			}
    +		case uint64:
    +			if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) {
    +				out.SetInt(int64(resolved))
    +				good = true
    +			}
    +		case float64:
    +			if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) {
    +				out.SetInt(int64(resolved))
    +				good = true
    +			}
    +		case string:
    +			if out.Type() == durationType {
    +				d, err := time.ParseDuration(resolved)
    +				if err == nil {
    +					out.SetInt(int64(d))
    +					good = true
    +				}
    +			}
    +		}
    +	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
    +		switch resolved := resolved.(type) {
    +		case int:
    +			if resolved >= 0 && !out.OverflowUint(uint64(resolved)) {
    +				out.SetUint(uint64(resolved))
    +				good = true
    +			}
    +		case int64:
    +			if resolved >= 0 && !out.OverflowUint(uint64(resolved)) {
    +				out.SetUint(uint64(resolved))
    +				good = true
    +			}
    +		case uint64:
    +			if !out.OverflowUint(uint64(resolved)) {
    +				out.SetUint(uint64(resolved))
    +				good = true
    +			}
    +		case float64:
    +			if resolved <= math.MaxUint64 && !out.OverflowUint(uint64(resolved)) {
    +				out.SetUint(uint64(resolved))
    +				good = true
    +			}
    +		}
    +	case reflect.Bool:
    +		switch resolved := resolved.(type) {
    +		case bool:
    +			out.SetBool(resolved)
    +			good = true
    +		}
    +	case reflect.Float32, reflect.Float64:
    +		switch resolved := resolved.(type) {
    +		case int:
    +			out.SetFloat(float64(resolved))
    +			good = true
    +		case int64:
    +			out.SetFloat(float64(resolved))
    +			good = true
    +		case uint64:
    +			out.SetFloat(float64(resolved))
    +			good = true
    +		case float64:
    +			out.SetFloat(resolved)
    +			good = true
    +		}
    +	case reflect.Ptr:
    +		if out.Type().Elem() == reflect.TypeOf(resolved) {
    +			// TODO DOes this make sense? When is out a Ptr except when decoding a nil value?
    +			elem := reflect.New(out.Type().Elem())
    +			elem.Elem().Set(reflect.ValueOf(resolved))
    +			out.Set(elem)
    +			good = true
    +		}
    +	}
    +	if !good {
    +		d.terror(n, tag, out)
    +	}
    +	return good
    +}
    +
    +func settableValueOf(i interface{}) reflect.Value {
    +	v := reflect.ValueOf(i)
    +	sv := reflect.New(v.Type()).Elem()
    +	sv.Set(v)
    +	return sv
    +}
    +
    +func (d *decoder) sequence(n *node, out reflect.Value) (good bool) {
    +	l := len(n.children)
    +
    +	var iface reflect.Value
    +	switch out.Kind() {
    +	case reflect.Slice:
    +		out.Set(reflect.MakeSlice(out.Type(), l, l))
    +	case reflect.Interface:
    +		// No type hints. Will have to use a generic sequence.
    +		iface = out
    +		out = settableValueOf(make([]interface{}, l))
    +	default:
    +		d.terror(n, yaml_SEQ_TAG, out)
    +		return false
    +	}
    +	et := out.Type().Elem()
    +
    +	j := 0
    +	for i := 0; i < l; i++ {
    +		e := reflect.New(et).Elem()
    +		if ok := d.unmarshal(n.children[i], e); ok {
    +			out.Index(j).Set(e)
    +			j++
    +		}
    +	}
    +	out.Set(out.Slice(0, j))
    +	if iface.IsValid() {
    +		iface.Set(out)
    +	}
    +	return true
    +}
    +
    +func (d *decoder) mapping(n *node, out reflect.Value) (good bool) {
    +	switch out.Kind() {
    +	case reflect.Struct:
    +		return d.mappingStruct(n, out)
    +	case reflect.Slice:
    +		return d.mappingSlice(n, out)
    +	case reflect.Map:
    +		// okay
    +	case reflect.Interface:
    +		if d.mapType.Kind() == reflect.Map {
    +			iface := out
    +			out = reflect.MakeMap(d.mapType)
    +			iface.Set(out)
    +		} else {
    +			slicev := reflect.New(d.mapType).Elem()
    +			if !d.mappingSlice(n, slicev) {
    +				return false
    +			}
    +			out.Set(slicev)
    +			return true
    +		}
    +	default:
    +		d.terror(n, yaml_MAP_TAG, out)
    +		return false
    +	}
    +	outt := out.Type()
    +	kt := outt.Key()
    +	et := outt.Elem()
    +
    +	mapType := d.mapType
    +	if outt.Key() == ifaceType && outt.Elem() == ifaceType {
    +		d.mapType = outt
    +	}
    +
    +	if out.IsNil() {
    +		out.Set(reflect.MakeMap(outt))
    +	}
    +	l := len(n.children)
    +	for i := 0; i < l; i += 2 {
    +		if isMerge(n.children[i]) {
    +			d.merge(n.children[i+1], out)
    +			continue
    +		}
    +		k := reflect.New(kt).Elem()
    +		if d.unmarshal(n.children[i], k) {
    +			kkind := k.Kind()
    +			if kkind == reflect.Interface {
    +				kkind = k.Elem().Kind()
    +			}
    +			if kkind == reflect.Map || kkind == reflect.Slice {
    +				failf("invalid map key: %#v", k.Interface())
    +			}
    +			e := reflect.New(et).Elem()
    +			if d.unmarshal(n.children[i+1], e) {
    +				out.SetMapIndex(k, e)
    +			}
    +		}
    +	}
    +	d.mapType = mapType
    +	return true
    +}
    +
    +func (d *decoder) mappingSlice(n *node, out reflect.Value) (good bool) {
    +	outt := out.Type()
    +	if outt.Elem() != mapItemType {
    +		d.terror(n, yaml_MAP_TAG, out)
    +		return false
    +	}
    +
    +	mapType := d.mapType
    +	d.mapType = outt
    +
    +	var slice []MapItem
    +	var l = len(n.children)
    +	for i := 0; i < l; i += 2 {
    +		if isMerge(n.children[i]) {
    +			d.merge(n.children[i+1], out)
    +			continue
    +		}
    +		item := MapItem{}
    +		k := reflect.ValueOf(&item.Key).Elem()
    +		if d.unmarshal(n.children[i], k) {
    +			v := reflect.ValueOf(&item.Value).Elem()
    +			if d.unmarshal(n.children[i+1], v) {
    +				slice = append(slice, item)
    +			}
    +		}
    +	}
    +	out.Set(reflect.ValueOf(slice))
    +	d.mapType = mapType
    +	return true
    +}
    +
    +func (d *decoder) mappingStruct(n *node, out reflect.Value) (good bool) {
    +	sinfo, err := getStructInfo(out.Type())
    +	if err != nil {
    +		panic(err)
    +	}
    +	name := settableValueOf("")
    +	l := len(n.children)
    +
    +	var inlineMap reflect.Value
    +	var elemType reflect.Type
    +	if sinfo.InlineMap != -1 {
    +		inlineMap = out.Field(sinfo.InlineMap)
    +		inlineMap.Set(reflect.New(inlineMap.Type()).Elem())
    +		elemType = inlineMap.Type().Elem()
    +	}
    +
    +	for i := 0; i < l; i += 2 {
    +		ni := n.children[i]
    +		if isMerge(ni) {
    +			d.merge(n.children[i+1], out)
    +			continue
    +		}
    +		if !d.unmarshal(ni, name) {
    +			continue
    +		}
    +		if info, ok := sinfo.FieldsMap[name.String()]; ok {
    +			var field reflect.Value
    +			if info.Inline == nil {
    +				field = out.Field(info.Num)
    +			} else {
    +				field = out.FieldByIndex(info.Inline)
    +			}
    +			d.unmarshal(n.children[i+1], field)
    +		} else if sinfo.InlineMap != -1 {
    +			if inlineMap.IsNil() {
    +				inlineMap.Set(reflect.MakeMap(inlineMap.Type()))
    +			}
    +			value := reflect.New(elemType).Elem()
    +			d.unmarshal(n.children[i+1], value)
    +			inlineMap.SetMapIndex(name, value)
    +		}
    +	}
    +	return true
    +}
    +
    +func failWantMap() {
    +	failf("map merge requires map or sequence of maps as the value")
    +}
    +
    +func (d *decoder) merge(n *node, out reflect.Value) {
    +	switch n.kind {
    +	case mappingNode:
    +		d.unmarshal(n, out)
    +	case aliasNode:
    +		an, ok := d.doc.anchors[n.value]
    +		if ok && an.kind != mappingNode {
    +			failWantMap()
    +		}
    +		d.unmarshal(n, out)
    +	case sequenceNode:
    +		// Step backwards as earlier nodes take precedence.
    +		for i := len(n.children) - 1; i >= 0; i-- {
    +			ni := n.children[i]
    +			if ni.kind == aliasNode {
    +				an, ok := d.doc.anchors[ni.value]
    +				if ok && an.kind != mappingNode {
    +					failWantMap()
    +				}
    +			} else if ni.kind != mappingNode {
    +				failWantMap()
    +			}
    +			d.unmarshal(ni, out)
    +		}
    +	default:
    +		failWantMap()
    +	}
    +}
    +
    +func isMerge(n *node) bool {
    +	return n.kind == scalarNode && n.value == "<<" && (n.implicit == true || n.tag == yaml_MERGE_TAG)
    +}
    diff --git a/vendor/gopkg.in/yaml.v2/decode_test.go b/vendor/gopkg.in/yaml.v2/decode_test.go
    new file mode 100644
    index 0000000000..c159760b64
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/decode_test.go
    @@ -0,0 +1,988 @@
    +package yaml_test
    +
    +import (
    +	"errors"
    +	. "gopkg.in/check.v1"
    +	"gopkg.in/yaml.v2"
    +	"math"
    +	"net"
    +	"reflect"
    +	"strings"
    +	"time"
    +)
    +
    +var unmarshalIntTest = 123
    +
    +var unmarshalTests = []struct {
    +	data  string
    +	value interface{}
    +}{
    +	{
    +		"",
    +		&struct{}{},
    +	}, {
    +		"{}", &struct{}{},
    +	}, {
    +		"v: hi",
    +		map[string]string{"v": "hi"},
    +	}, {
    +		"v: hi", map[string]interface{}{"v": "hi"},
    +	}, {
    +		"v: true",
    +		map[string]string{"v": "true"},
    +	}, {
    +		"v: true",
    +		map[string]interface{}{"v": true},
    +	}, {
    +		"v: 10",
    +		map[string]interface{}{"v": 10},
    +	}, {
    +		"v: 0b10",
    +		map[string]interface{}{"v": 2},
    +	}, {
    +		"v: 0xA",
    +		map[string]interface{}{"v": 10},
    +	}, {
    +		"v: 4294967296",
    +		map[string]int64{"v": 4294967296},
    +	}, {
    +		"v: 0.1",
    +		map[string]interface{}{"v": 0.1},
    +	}, {
    +		"v: .1",
    +		map[string]interface{}{"v": 0.1},
    +	}, {
    +		"v: .Inf",
    +		map[string]interface{}{"v": math.Inf(+1)},
    +	}, {
    +		"v: -.Inf",
    +		map[string]interface{}{"v": math.Inf(-1)},
    +	}, {
    +		"v: -10",
    +		map[string]interface{}{"v": -10},
    +	}, {
    +		"v: -.1",
    +		map[string]interface{}{"v": -0.1},
    +	},
    +
    +	// Simple values.
    +	{
    +		"123",
    +		&unmarshalIntTest,
    +	},
    +
    +	// Floats from spec
    +	{
    +		"canonical: 6.8523e+5",
    +		map[string]interface{}{"canonical": 6.8523e+5},
    +	}, {
    +		"expo: 685.230_15e+03",
    +		map[string]interface{}{"expo": 685.23015e+03},
    +	}, {
    +		"fixed: 685_230.15",
    +		map[string]interface{}{"fixed": 685230.15},
    +	}, {
    +		"neginf: -.inf",
    +		map[string]interface{}{"neginf": math.Inf(-1)},
    +	}, {
    +		"fixed: 685_230.15",
    +		map[string]float64{"fixed": 685230.15},
    +	},
    +	//{"sexa: 190:20:30.15", map[string]interface{}{"sexa": 0}}, // Unsupported
    +	//{"notanum: .NaN", map[string]interface{}{"notanum": math.NaN()}}, // Equality of NaN fails.
    +
    +	// Bools from spec
    +	{
    +		"canonical: y",
    +		map[string]interface{}{"canonical": true},
    +	}, {
    +		"answer: NO",
    +		map[string]interface{}{"answer": false},
    +	}, {
    +		"logical: True",
    +		map[string]interface{}{"logical": true},
    +	}, {
    +		"option: on",
    +		map[string]interface{}{"option": true},
    +	}, {
    +		"option: on",
    +		map[string]bool{"option": true},
    +	},
    +	// Ints from spec
    +	{
    +		"canonical: 685230",
    +		map[string]interface{}{"canonical": 685230},
    +	}, {
    +		"decimal: +685_230",
    +		map[string]interface{}{"decimal": 685230},
    +	}, {
    +		"octal: 02472256",
    +		map[string]interface{}{"octal": 685230},
    +	}, {
    +		"hexa: 0x_0A_74_AE",
    +		map[string]interface{}{"hexa": 685230},
    +	}, {
    +		"bin: 0b1010_0111_0100_1010_1110",
    +		map[string]interface{}{"bin": 685230},
    +	}, {
    +		"bin: -0b101010",
    +		map[string]interface{}{"bin": -42},
    +	}, {
    +		"decimal: +685_230",
    +		map[string]int{"decimal": 685230},
    +	},
    +
    +	//{"sexa: 190:20:30", map[string]interface{}{"sexa": 0}}, // Unsupported
    +
    +	// Nulls from spec
    +	{
    +		"empty:",
    +		map[string]interface{}{"empty": nil},
    +	}, {
    +		"canonical: ~",
    +		map[string]interface{}{"canonical": nil},
    +	}, {
    +		"english: null",
    +		map[string]interface{}{"english": nil},
    +	}, {
    +		"~: null key",
    +		map[interface{}]string{nil: "null key"},
    +	}, {
    +		"empty:",
    +		map[string]*bool{"empty": nil},
    +	},
    +
    +	// Flow sequence
    +	{
    +		"seq: [A,B]",
    +		map[string]interface{}{"seq": []interface{}{"A", "B"}},
    +	}, {
    +		"seq: [A,B,C,]",
    +		map[string][]string{"seq": []string{"A", "B", "C"}},
    +	}, {
    +		"seq: [A,1,C]",
    +		map[string][]string{"seq": []string{"A", "1", "C"}},
    +	}, {
    +		"seq: [A,1,C]",
    +		map[string][]int{"seq": []int{1}},
    +	}, {
    +		"seq: [A,1,C]",
    +		map[string]interface{}{"seq": []interface{}{"A", 1, "C"}},
    +	},
    +	// Block sequence
    +	{
    +		"seq:\n - A\n - B",
    +		map[string]interface{}{"seq": []interface{}{"A", "B"}},
    +	}, {
    +		"seq:\n - A\n - B\n - C",
    +		map[string][]string{"seq": []string{"A", "B", "C"}},
    +	}, {
    +		"seq:\n - A\n - 1\n - C",
    +		map[string][]string{"seq": []string{"A", "1", "C"}},
    +	}, {
    +		"seq:\n - A\n - 1\n - C",
    +		map[string][]int{"seq": []int{1}},
    +	}, {
    +		"seq:\n - A\n - 1\n - C",
    +		map[string]interface{}{"seq": []interface{}{"A", 1, "C"}},
    +	},
    +
    +	// Literal block scalar
    +	{
    +		"scalar: | # Comment\n\n literal\n\n \ttext\n\n",
    +		map[string]string{"scalar": "\nliteral\n\n\ttext\n"},
    +	},
    +
    +	// Folded block scalar
    +	{
    +		"scalar: > # Comment\n\n folded\n line\n \n next\n line\n  * one\n  * two\n\n last\n line\n\n",
    +		map[string]string{"scalar": "\nfolded line\nnext line\n * one\n * two\n\nlast line\n"},
    +	},
    +
    +	// Map inside interface with no type hints.
    +	{
    +		"a: {b: c}",
    +		map[interface{}]interface{}{"a": map[interface{}]interface{}{"b": "c"}},
    +	},
    +
    +	// Structs and type conversions.
    +	{
    +		"hello: world",
    +		&struct{ Hello string }{"world"},
    +	}, {
    +		"a: {b: c}",
    +		&struct{ A struct{ B string } }{struct{ B string }{"c"}},
    +	}, {
    +		"a: {b: c}",
    +		&struct{ A *struct{ B string } }{&struct{ B string }{"c"}},
    +	}, {
    +		"a: {b: c}",
    +		&struct{ A map[string]string }{map[string]string{"b": "c"}},
    +	}, {
    +		"a: {b: c}",
    +		&struct{ A *map[string]string }{&map[string]string{"b": "c"}},
    +	}, {
    +		"a:",
    +		&struct{ A map[string]string }{},
    +	}, {
    +		"a: 1",
    +		&struct{ A int }{1},
    +	}, {
    +		"a: 1",
    +		&struct{ A float64 }{1},
    +	}, {
    +		"a: 1.0",
    +		&struct{ A int }{1},
    +	}, {
    +		"a: 1.0",
    +		&struct{ A uint }{1},
    +	}, {
    +		"a: [1, 2]",
    +		&struct{ A []int }{[]int{1, 2}},
    +	}, {
    +		"a: 1",
    +		&struct{ B int }{0},
    +	}, {
    +		"a: 1",
    +		&struct {
    +			B int "a"
    +		}{1},
    +	}, {
    +		"a: y",
    +		&struct{ A bool }{true},
    +	},
    +
    +	// Some cross type conversions
    +	{
    +		"v: 42",
    +		map[string]uint{"v": 42},
    +	}, {
    +		"v: -42",
    +		map[string]uint{},
    +	}, {
    +		"v: 4294967296",
    +		map[string]uint64{"v": 4294967296},
    +	}, {
    +		"v: -4294967296",
    +		map[string]uint64{},
    +	},
    +
    +	// int
    +	{
    +		"int_max: 2147483647",
    +		map[string]int{"int_max": math.MaxInt32},
    +	},
    +	{
    +		"int_min: -2147483648",
    +		map[string]int{"int_min": math.MinInt32},
    +	},
    +	{
    +		"int_overflow: 9223372036854775808", // math.MaxInt64 + 1
    +		map[string]int{},
    +	},
    +
    +	// int64
    +	{
    +		"int64_max: 9223372036854775807",
    +		map[string]int64{"int64_max": math.MaxInt64},
    +	},
    +	{
    +		"int64_max_base2: 0b111111111111111111111111111111111111111111111111111111111111111",
    +		map[string]int64{"int64_max_base2": math.MaxInt64},
    +	},
    +	{
    +		"int64_min: -9223372036854775808",
    +		map[string]int64{"int64_min": math.MinInt64},
    +	},
    +	{
    +		"int64_neg_base2: -0b111111111111111111111111111111111111111111111111111111111111111",
    +		map[string]int64{"int64_neg_base2": -math.MaxInt64},
    +	},
    +	{
    +		"int64_overflow: 9223372036854775808", // math.MaxInt64 + 1
    +		map[string]int64{},
    +	},
    +
    +	// uint
    +	{
    +		"uint_min: 0",
    +		map[string]uint{"uint_min": 0},
    +	},
    +	{
    +		"uint_max: 4294967295",
    +		map[string]uint{"uint_max": math.MaxUint32},
    +	},
    +	{
    +		"uint_underflow: -1",
    +		map[string]uint{},
    +	},
    +
    +	// uint64
    +	{
    +		"uint64_min: 0",
    +		map[string]uint{"uint64_min": 0},
    +	},
    +	{
    +		"uint64_max: 18446744073709551615",
    +		map[string]uint64{"uint64_max": math.MaxUint64},
    +	},
    +	{
    +		"uint64_max_base2: 0b1111111111111111111111111111111111111111111111111111111111111111",
    +		map[string]uint64{"uint64_max_base2": math.MaxUint64},
    +	},
    +	{
    +		"uint64_maxint64: 9223372036854775807",
    +		map[string]uint64{"uint64_maxint64": math.MaxInt64},
    +	},
    +	{
    +		"uint64_underflow: -1",
    +		map[string]uint64{},
    +	},
    +
    +	// float32
    +	{
    +		"float32_max: 3.40282346638528859811704183484516925440e+38",
    +		map[string]float32{"float32_max": math.MaxFloat32},
    +	},
    +	{
    +		"float32_nonzero: 1.401298464324817070923729583289916131280e-45",
    +		map[string]float32{"float32_nonzero": math.SmallestNonzeroFloat32},
    +	},
    +	{
    +		"float32_maxuint64: 18446744073709551615",
    +		map[string]float32{"float32_maxuint64": float32(math.MaxUint64)},
    +	},
    +	{
    +		"float32_maxuint64+1: 18446744073709551616",
    +		map[string]float32{"float32_maxuint64+1": float32(math.MaxUint64 + 1)},
    +	},
    +
    +	// float64
    +	{
    +		"float64_max: 1.797693134862315708145274237317043567981e+308",
    +		map[string]float64{"float64_max": math.MaxFloat64},
    +	},
    +	{
    +		"float64_nonzero: 4.940656458412465441765687928682213723651e-324",
    +		map[string]float64{"float64_nonzero": math.SmallestNonzeroFloat64},
    +	},
    +	{
    +		"float64_maxuint64: 18446744073709551615",
    +		map[string]float64{"float64_maxuint64": float64(math.MaxUint64)},
    +	},
    +	{
    +		"float64_maxuint64+1: 18446744073709551616",
    +		map[string]float64{"float64_maxuint64+1": float64(math.MaxUint64 + 1)},
    +	},
    +
    +	// Overflow cases.
    +	{
    +		"v: 4294967297",
    +		map[string]int32{},
    +	}, {
    +		"v: 128",
    +		map[string]int8{},
    +	},
    +
    +	// Quoted values.
    +	{
    +		"'1': '\"2\"'",
    +		map[interface{}]interface{}{"1": "\"2\""},
    +	}, {
    +		"v:\n- A\n- 'B\n\n  C'\n",
    +		map[string][]string{"v": []string{"A", "B\nC"}},
    +	},
    +
    +	// Explicit tags.
    +	{
    +		"v: !!float '1.1'",
    +		map[string]interface{}{"v": 1.1},
    +	}, {
    +		"v: !!null ''",
    +		map[string]interface{}{"v": nil},
    +	}, {
    +		"%TAG !y! tag:yaml.org,2002:\n---\nv: !y!int '1'",
    +		map[string]interface{}{"v": 1},
    +	},
    +
    +	// Anchors and aliases.
    +	{
    +		"a: &x 1\nb: &y 2\nc: *x\nd: *y\n",
    +		&struct{ A, B, C, D int }{1, 2, 1, 2},
    +	}, {
    +		"a: &a {c: 1}\nb: *a",
    +		&struct {
    +			A, B struct {
    +				C int
    +			}
    +		}{struct{ C int }{1}, struct{ C int }{1}},
    +	}, {
    +		"a: &a [1, 2]\nb: *a",
    +		&struct{ B []int }{[]int{1, 2}},
    +	}, {
    +		"b: *a\na: &a {c: 1}",
    +		&struct {
    +			A, B struct {
    +				C int
    +			}
    +		}{struct{ C int }{1}, struct{ C int }{1}},
    +	},
    +
    +	// Bug #1133337
    +	{
    +		"foo: ''",
    +		map[string]*string{"foo": new(string)},
    +	}, {
    +		"foo: null",
    +		map[string]string{"foo": ""},
    +	}, {
    +		"foo: null",
    +		map[string]interface{}{"foo": nil},
    +	},
    +
    +	// Ignored field
    +	{
    +		"a: 1\nb: 2\n",
    +		&struct {
    +			A int
    +			B int "-"
    +		}{1, 0},
    +	},
    +
    +	// Bug #1191981
    +	{
    +		"" +
    +			"%YAML 1.1\n" +
    +			"--- !!str\n" +
    +			`"Generic line break (no glyph)\n\` + "\n" +
    +			` Generic line break (glyphed)\n\` + "\n" +
    +			` Line separator\u2028\` + "\n" +
    +			` Paragraph separator\u2029"` + "\n",
    +		"" +
    +			"Generic line break (no glyph)\n" +
    +			"Generic line break (glyphed)\n" +
    +			"Line separator\u2028Paragraph separator\u2029",
    +	},
    +
    +	// Struct inlining
    +	{
    +		"a: 1\nb: 2\nc: 3\n",
    +		&struct {
    +			A int
    +			C inlineB `yaml:",inline"`
    +		}{1, inlineB{2, inlineC{3}}},
    +	},
    +
    +	// Map inlining
    +	{
    +		"a: 1\nb: 2\nc: 3\n",
    +		&struct {
    +			A int
    +			C map[string]int `yaml:",inline"`
    +		}{1, map[string]int{"b": 2, "c": 3}},
    +	},
    +
    +	// bug 1243827
    +	{
    +		"a: -b_c",
    +		map[string]interface{}{"a": "-b_c"},
    +	},
    +	{
    +		"a: +b_c",
    +		map[string]interface{}{"a": "+b_c"},
    +	},
    +	{
    +		"a: 50cent_of_dollar",
    +		map[string]interface{}{"a": "50cent_of_dollar"},
    +	},
    +
    +	// Duration
    +	{
    +		"a: 3s",
    +		map[string]time.Duration{"a": 3 * time.Second},
    +	},
    +
    +	// Issue #24.
    +	{
    +		"a: ",
    +		map[string]string{"a": ""},
    +	},
    +
    +	// Base 60 floats are obsolete and unsupported.
    +	{
    +		"a: 1:1\n",
    +		map[string]string{"a": "1:1"},
    +	},
    +
    +	// Binary data.
    +	{
    +		"a: !!binary gIGC\n",
    +		map[string]string{"a": "\x80\x81\x82"},
    +	}, {
    +		"a: !!binary |\n  " + strings.Repeat("kJCQ", 17) + "kJ\n  CQ\n",
    +		map[string]string{"a": strings.Repeat("\x90", 54)},
    +	}, {
    +		"a: !!binary |\n  " + strings.Repeat("A", 70) + "\n  ==\n",
    +		map[string]string{"a": strings.Repeat("\x00", 52)},
    +	},
    +
    +	// Ordered maps.
    +	{
    +		"{b: 2, a: 1, d: 4, c: 3, sub: {e: 5}}",
    +		&yaml.MapSlice{{"b", 2}, {"a", 1}, {"d", 4}, {"c", 3}, {"sub", yaml.MapSlice{{"e", 5}}}},
    +	},
    +
    +	// Issue #39.
    +	{
    +		"a:\n b:\n  c: d\n",
    +		map[string]struct{ B interface{} }{"a": {map[interface{}]interface{}{"c": "d"}}},
    +	},
    +
    +	// Custom map type.
    +	{
    +		"a: {b: c}",
    +		M{"a": M{"b": "c"}},
    +	},
    +
    +	// Support encoding.TextUnmarshaler.
    +	{
    +		"a: 1.2.3.4\n",
    +		map[string]net.IP{"a": net.IPv4(1, 2, 3, 4)},
    +	},
    +	{
    +		"a: 2015-02-24T18:19:39Z\n",
    +		map[string]time.Time{"a": time.Unix(1424801979, 0)},
    +	},
    +
    +	// Encode empty lists as zero-length slices.
    +	{
    +		"a: []",
    +		&struct{ A []int }{[]int{}},
    +	},
    +
    +	// UTF-16-LE
    +	{
    +		"\xff\xfe\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00\n\x00",
    +		M{"ñoño": "very yes"},
    +	},
    +	// UTF-16-LE with surrogate.
    +	{
    +		"\xff\xfe\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00 \x00=\xd8\xd4\xdf\n\x00",
    +		M{"ñoño": "very yes 🟔"},
    +	},
    +
    +	// UTF-16-BE
    +	{
    +		"\xfe\xff\x00\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00\n",
    +		M{"ñoño": "very yes"},
    +	},
    +	// UTF-16-BE with surrogate.
    +	{
    +		"\xfe\xff\x00\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00 \xd8=\xdf\xd4\x00\n",
    +		M{"ñoño": "very yes 🟔"},
    +	},
    +}
    +
    +type M map[interface{}]interface{}
    +
    +type inlineB struct {
    +	B       int
    +	inlineC `yaml:",inline"`
    +}
    +
    +type inlineC struct {
    +	C int
    +}
    +
    +func (s *S) TestUnmarshal(c *C) {
    +	for _, item := range unmarshalTests {
    +		t := reflect.ValueOf(item.value).Type()
    +		var value interface{}
    +		switch t.Kind() {
    +		case reflect.Map:
    +			value = reflect.MakeMap(t).Interface()
    +		case reflect.String:
    +			value = reflect.New(t).Interface()
    +		case reflect.Ptr:
    +			value = reflect.New(t.Elem()).Interface()
    +		default:
    +			c.Fatalf("missing case for %s", t)
    +		}
    +		err := yaml.Unmarshal([]byte(item.data), value)
    +		if _, ok := err.(*yaml.TypeError); !ok {
    +			c.Assert(err, IsNil)
    +		}
    +		if t.Kind() == reflect.String {
    +			c.Assert(*value.(*string), Equals, item.value)
    +		} else {
    +			c.Assert(value, DeepEquals, item.value)
    +		}
    +	}
    +}
    +
    +func (s *S) TestUnmarshalNaN(c *C) {
    +	value := map[string]interface{}{}
    +	err := yaml.Unmarshal([]byte("notanum: .NaN"), &value)
    +	c.Assert(err, IsNil)
    +	c.Assert(math.IsNaN(value["notanum"].(float64)), Equals, true)
    +}
    +
    +var unmarshalErrorTests = []struct {
    +	data, error string
    +}{
    +	{"v: !!float 'error'", "yaml: cannot decode !!str `error` as a !!float"},
    +	{"v: [A,", "yaml: line 1: did not find expected node content"},
    +	{"v:\n- [A,", "yaml: line 2: did not find expected node content"},
    +	{"a: *b\n", "yaml: unknown anchor 'b' referenced"},
    +	{"a: &a\n  b: *a\n", "yaml: anchor 'a' value contains itself"},
    +	{"value: -", "yaml: block sequence entries are not allowed in this context"},
    +	{"a: !!binary ==", "yaml: !!binary value contains invalid base64 data"},
    +	{"{[.]}", `yaml: invalid map key: \[\]interface \{\}\{"\."\}`},
    +	{"{{.}}", `yaml: invalid map key: map\[interface\ \{\}\]interface \{\}\{".":interface \{\}\(nil\)\}`},
    +}
    +
    +func (s *S) TestUnmarshalErrors(c *C) {
    +	for _, item := range unmarshalErrorTests {
    +		var value interface{}
    +		err := yaml.Unmarshal([]byte(item.data), &value)
    +		c.Assert(err, ErrorMatches, item.error, Commentf("Partial unmarshal: %#v", value))
    +	}
    +}
    +
    +var unmarshalerTests = []struct {
    +	data, tag string
    +	value     interface{}
    +}{
    +	{"_: {hi: there}", "!!map", map[interface{}]interface{}{"hi": "there"}},
    +	{"_: [1,A]", "!!seq", []interface{}{1, "A"}},
    +	{"_: 10", "!!int", 10},
    +	{"_: null", "!!null", nil},
    +	{`_: BAR!`, "!!str", "BAR!"},
    +	{`_: "BAR!"`, "!!str", "BAR!"},
    +	{"_: !!foo 'BAR!'", "!!foo", "BAR!"},
    +}
    +
    +var unmarshalerResult = map[int]error{}
    +
    +type unmarshalerType struct {
    +	value interface{}
    +}
    +
    +func (o *unmarshalerType) UnmarshalYAML(unmarshal func(v interface{}) error) error {
    +	if err := unmarshal(&o.value); err != nil {
    +		return err
    +	}
    +	if i, ok := o.value.(int); ok {
    +		if result, ok := unmarshalerResult[i]; ok {
    +			return result
    +		}
    +	}
    +	return nil
    +}
    +
    +type unmarshalerPointer struct {
    +	Field *unmarshalerType "_"
    +}
    +
    +type unmarshalerValue struct {
    +	Field unmarshalerType "_"
    +}
    +
    +func (s *S) TestUnmarshalerPointerField(c *C) {
    +	for _, item := range unmarshalerTests {
    +		obj := &unmarshalerPointer{}
    +		err := yaml.Unmarshal([]byte(item.data), obj)
    +		c.Assert(err, IsNil)
    +		if item.value == nil {
    +			c.Assert(obj.Field, IsNil)
    +		} else {
    +			c.Assert(obj.Field, NotNil, Commentf("Pointer not initialized (%#v)", item.value))
    +			c.Assert(obj.Field.value, DeepEquals, item.value)
    +		}
    +	}
    +}
    +
    +func (s *S) TestUnmarshalerValueField(c *C) {
    +	for _, item := range unmarshalerTests {
    +		obj := &unmarshalerValue{}
    +		err := yaml.Unmarshal([]byte(item.data), obj)
    +		c.Assert(err, IsNil)
    +		c.Assert(obj.Field, NotNil, Commentf("Pointer not initialized (%#v)", item.value))
    +		c.Assert(obj.Field.value, DeepEquals, item.value)
    +	}
    +}
    +
    +func (s *S) TestUnmarshalerWholeDocument(c *C) {
    +	obj := &unmarshalerType{}
    +	err := yaml.Unmarshal([]byte(unmarshalerTests[0].data), obj)
    +	c.Assert(err, IsNil)
    +	value, ok := obj.value.(map[interface{}]interface{})
    +	c.Assert(ok, Equals, true, Commentf("value: %#v", obj.value))
    +	c.Assert(value["_"], DeepEquals, unmarshalerTests[0].value)
    +}
    +
    +func (s *S) TestUnmarshalerTypeError(c *C) {
    +	unmarshalerResult[2] = &yaml.TypeError{[]string{"foo"}}
    +	unmarshalerResult[4] = &yaml.TypeError{[]string{"bar"}}
    +	defer func() {
    +		delete(unmarshalerResult, 2)
    +		delete(unmarshalerResult, 4)
    +	}()
    +
    +	type T struct {
    +		Before int
    +		After  int
    +		M      map[string]*unmarshalerType
    +	}
    +	var v T
    +	data := `{before: A, m: {abc: 1, def: 2, ghi: 3, jkl: 4}, after: B}`
    +	err := yaml.Unmarshal([]byte(data), &v)
    +	c.Assert(err, ErrorMatches, ""+
    +		"yaml: unmarshal errors:\n"+
    +		"  line 1: cannot unmarshal !!str `A` into int\n"+
    +		"  foo\n"+
    +		"  bar\n"+
    +		"  line 1: cannot unmarshal !!str `B` into int")
    +	c.Assert(v.M["abc"], NotNil)
    +	c.Assert(v.M["def"], IsNil)
    +	c.Assert(v.M["ghi"], NotNil)
    +	c.Assert(v.M["jkl"], IsNil)
    +
    +	c.Assert(v.M["abc"].value, Equals, 1)
    +	c.Assert(v.M["ghi"].value, Equals, 3)
    +}
    +
    +type proxyTypeError struct{}
    +
    +func (v *proxyTypeError) UnmarshalYAML(unmarshal func(interface{}) error) error {
    +	var s string
    +	var a int32
    +	var b int64
    +	if err := unmarshal(&s); err != nil {
    +		panic(err)
    +	}
    +	if s == "a" {
    +		if err := unmarshal(&b); err == nil {
    +			panic("should have failed")
    +		}
    +		return unmarshal(&a)
    +	}
    +	if err := unmarshal(&a); err == nil {
    +		panic("should have failed")
    +	}
    +	return unmarshal(&b)
    +}
    +
    +func (s *S) TestUnmarshalerTypeErrorProxying(c *C) {
    +	type T struct {
    +		Before int
    +		After  int
    +		M      map[string]*proxyTypeError
    +	}
    +	var v T
    +	data := `{before: A, m: {abc: a, def: b}, after: B}`
    +	err := yaml.Unmarshal([]byte(data), &v)
    +	c.Assert(err, ErrorMatches, ""+
    +		"yaml: unmarshal errors:\n"+
    +		"  line 1: cannot unmarshal !!str `A` into int\n"+
    +		"  line 1: cannot unmarshal !!str `a` into int32\n"+
    +		"  line 1: cannot unmarshal !!str `b` into int64\n"+
    +		"  line 1: cannot unmarshal !!str `B` into int")
    +}
    +
    +type failingUnmarshaler struct{}
    +
    +var failingErr = errors.New("failingErr")
    +
    +func (ft *failingUnmarshaler) UnmarshalYAML(unmarshal func(interface{}) error) error {
    +	return failingErr
    +}
    +
    +func (s *S) TestUnmarshalerError(c *C) {
    +	err := yaml.Unmarshal([]byte("a: b"), &failingUnmarshaler{})
    +	c.Assert(err, Equals, failingErr)
    +}
    +
    +type sliceUnmarshaler []int
    +
    +func (su *sliceUnmarshaler) UnmarshalYAML(unmarshal func(interface{}) error) error {
    +	var slice []int
    +	err := unmarshal(&slice)
    +	if err == nil {
    +		*su = slice
    +		return nil
    +	}
    +
    +	var intVal int
    +	err = unmarshal(&intVal)
    +	if err == nil {
    +		*su = []int{intVal}
    +		return nil
    +	}
    +
    +	return err
    +}
    +
    +func (s *S) TestUnmarshalerRetry(c *C) {
    +	var su sliceUnmarshaler
    +	err := yaml.Unmarshal([]byte("[1, 2, 3]"), &su)
    +	c.Assert(err, IsNil)
    +	c.Assert(su, DeepEquals, sliceUnmarshaler([]int{1, 2, 3}))
    +
    +	err = yaml.Unmarshal([]byte("1"), &su)
    +	c.Assert(err, IsNil)
    +	c.Assert(su, DeepEquals, sliceUnmarshaler([]int{1}))
    +}
    +
    +// From http://yaml.org/type/merge.html
    +var mergeTests = `
    +anchors:
    +  list:
    +    - &CENTER { "x": 1, "y": 2 }
    +    - &LEFT   { "x": 0, "y": 2 }
    +    - &BIG    { "r": 10 }
    +    - &SMALL  { "r": 1 }
    +
    +# All the following maps are equal:
    +
    +plain:
    +  # Explicit keys
    +  "x": 1
    +  "y": 2
    +  "r": 10
    +  label: center/big
    +
    +mergeOne:
    +  # Merge one map
    +  << : *CENTER
    +  "r": 10
    +  label: center/big
    +
    +mergeMultiple:
    +  # Merge multiple maps
    +  << : [ *CENTER, *BIG ]
    +  label: center/big
    +
    +override:
    +  # Override
    +  << : [ *BIG, *LEFT, *SMALL ]
    +  "x": 1
    +  label: center/big
    +
    +shortTag:
    +  # Explicit short merge tag
    +  !!merge "<<" : [ *CENTER, *BIG ]
    +  label: center/big
    +
    +longTag:
    +  # Explicit merge long tag
    +  ! "<<" : [ *CENTER, *BIG ]
    +  label: center/big
    +
    +inlineMap:
    +  # Inlined map 
    +  << : {"x": 1, "y": 2, "r": 10}
    +  label: center/big
    +
    +inlineSequenceMap:
    +  # Inlined map in sequence
    +  << : [ *CENTER, {"r": 10} ]
    +  label: center/big
    +`
    +
    +func (s *S) TestMerge(c *C) {
    +	var want = map[interface{}]interface{}{
    +		"x":     1,
    +		"y":     2,
    +		"r":     10,
    +		"label": "center/big",
    +	}
    +
    +	var m map[interface{}]interface{}
    +	err := yaml.Unmarshal([]byte(mergeTests), &m)
    +	c.Assert(err, IsNil)
    +	for name, test := range m {
    +		if name == "anchors" {
    +			continue
    +		}
    +		c.Assert(test, DeepEquals, want, Commentf("test %q failed", name))
    +	}
    +}
    +
    +func (s *S) TestMergeStruct(c *C) {
    +	type Data struct {
    +		X, Y, R int
    +		Label   string
    +	}
    +	want := Data{1, 2, 10, "center/big"}
    +
    +	var m map[string]Data
    +	err := yaml.Unmarshal([]byte(mergeTests), &m)
    +	c.Assert(err, IsNil)
    +	for name, test := range m {
    +		if name == "anchors" {
    +			continue
    +		}
    +		c.Assert(test, Equals, want, Commentf("test %q failed", name))
    +	}
    +}
    +
    +var unmarshalNullTests = []func() interface{}{
    +	func() interface{} { var v interface{}; v = "v"; return &v },
    +	func() interface{} { var s = "s"; return &s },
    +	func() interface{} { var s = "s"; sptr := &s; return &sptr },
    +	func() interface{} { var i = 1; return &i },
    +	func() interface{} { var i = 1; iptr := &i; return &iptr },
    +	func() interface{} { m := map[string]int{"s": 1}; return &m },
    +	func() interface{} { m := map[string]int{"s": 1}; return m },
    +}
    +
    +func (s *S) TestUnmarshalNull(c *C) {
    +	for _, test := range unmarshalNullTests {
    +		item := test()
    +		zero := reflect.Zero(reflect.TypeOf(item).Elem()).Interface()
    +		err := yaml.Unmarshal([]byte("null"), item)
    +		c.Assert(err, IsNil)
    +		if reflect.TypeOf(item).Kind() == reflect.Map {
    +			c.Assert(reflect.ValueOf(item).Interface(), DeepEquals, reflect.MakeMap(reflect.TypeOf(item)).Interface())
    +		} else {
    +			c.Assert(reflect.ValueOf(item).Elem().Interface(), DeepEquals, zero)
    +		}
    +	}
    +}
    +
    +func (s *S) TestUnmarshalSliceOnPreset(c *C) {
    +	// Issue #48.
    +	v := struct{ A []int }{[]int{1}}
    +	yaml.Unmarshal([]byte("a: [2]"), &v)
    +	c.Assert(v.A, DeepEquals, []int{2})
    +}
    +
    +//var data []byte
    +//func init() {
    +//	var err error
    +//	data, err = ioutil.ReadFile("/tmp/file.yaml")
    +//	if err != nil {
    +//		panic(err)
    +//	}
    +//}
    +//
    +//func (s *S) BenchmarkUnmarshal(c *C) {
    +//	var err error
    +//	for i := 0; i < c.N; i++ {
    +//		var v map[string]interface{}
    +//		err = yaml.Unmarshal(data, &v)
    +//	}
    +//	if err != nil {
    +//		panic(err)
    +//	}
    +//}
    +//
    +//func (s *S) BenchmarkMarshal(c *C) {
    +//	var v map[string]interface{}
    +//	yaml.Unmarshal(data, &v)
    +//	c.ResetTimer()
    +//	for i := 0; i < c.N; i++ {
    +//		yaml.Marshal(&v)
    +//	}
    +//}
    diff --git a/vendor/gopkg.in/yaml.v2/emitterc.go b/vendor/gopkg.in/yaml.v2/emitterc.go
    new file mode 100644
    index 0000000000..2befd553ed
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/emitterc.go
    @@ -0,0 +1,1685 @@
    +package yaml
    +
    +import (
    +	"bytes"
    +)
    +
    +// Flush the buffer if needed.
    +func flush(emitter *yaml_emitter_t) bool {
    +	if emitter.buffer_pos+5 >= len(emitter.buffer) {
    +		return yaml_emitter_flush(emitter)
    +	}
    +	return true
    +}
    +
    +// Put a character to the output buffer.
    +func put(emitter *yaml_emitter_t, value byte) bool {
    +	if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
    +		return false
    +	}
    +	emitter.buffer[emitter.buffer_pos] = value
    +	emitter.buffer_pos++
    +	emitter.column++
    +	return true
    +}
    +
    +// Put a line break to the output buffer.
    +func put_break(emitter *yaml_emitter_t) bool {
    +	if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
    +		return false
    +	}
    +	switch emitter.line_break {
    +	case yaml_CR_BREAK:
    +		emitter.buffer[emitter.buffer_pos] = '\r'
    +		emitter.buffer_pos += 1
    +	case yaml_LN_BREAK:
    +		emitter.buffer[emitter.buffer_pos] = '\n'
    +		emitter.buffer_pos += 1
    +	case yaml_CRLN_BREAK:
    +		emitter.buffer[emitter.buffer_pos+0] = '\r'
    +		emitter.buffer[emitter.buffer_pos+1] = '\n'
    +		emitter.buffer_pos += 2
    +	default:
    +		panic("unknown line break setting")
    +	}
    +	emitter.column = 0
    +	emitter.line++
    +	return true
    +}
    +
    +// Copy a character from a string into buffer.
    +func write(emitter *yaml_emitter_t, s []byte, i *int) bool {
    +	if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) {
    +		return false
    +	}
    +	p := emitter.buffer_pos
    +	w := width(s[*i])
    +	switch w {
    +	case 4:
    +		emitter.buffer[p+3] = s[*i+3]
    +		fallthrough
    +	case 3:
    +		emitter.buffer[p+2] = s[*i+2]
    +		fallthrough
    +	case 2:
    +		emitter.buffer[p+1] = s[*i+1]
    +		fallthrough
    +	case 1:
    +		emitter.buffer[p+0] = s[*i+0]
    +	default:
    +		panic("unknown character width")
    +	}
    +	emitter.column++
    +	emitter.buffer_pos += w
    +	*i += w
    +	return true
    +}
    +
    +// Write a whole string into buffer.
    +func write_all(emitter *yaml_emitter_t, s []byte) bool {
    +	for i := 0; i < len(s); {
    +		if !write(emitter, s, &i) {
    +			return false
    +		}
    +	}
    +	return true
    +}
    +
    +// Copy a line break character from a string into buffer.
    +func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool {
    +	if s[*i] == '\n' {
    +		if !put_break(emitter) {
    +			return false
    +		}
    +		*i++
    +	} else {
    +		if !write(emitter, s, i) {
    +			return false
    +		}
    +		emitter.column = 0
    +		emitter.line++
    +	}
    +	return true
    +}
    +
    +// Set an emitter error and return false.
    +func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool {
    +	emitter.error = yaml_EMITTER_ERROR
    +	emitter.problem = problem
    +	return false
    +}
    +
    +// Emit an event.
    +func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool {
    +	emitter.events = append(emitter.events, *event)
    +	for !yaml_emitter_need_more_events(emitter) {
    +		event := &emitter.events[emitter.events_head]
    +		if !yaml_emitter_analyze_event(emitter, event) {
    +			return false
    +		}
    +		if !yaml_emitter_state_machine(emitter, event) {
    +			return false
    +		}
    +		yaml_event_delete(event)
    +		emitter.events_head++
    +	}
    +	return true
    +}
    +
    +// Check if we need to accumulate more events before emitting.
    +//
    +// We accumulate extra
    +//  - 1 event for DOCUMENT-START
    +//  - 2 events for SEQUENCE-START
    +//  - 3 events for MAPPING-START
    +//
    +func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool {
    +	if emitter.events_head == len(emitter.events) {
    +		return true
    +	}
    +	var accumulate int
    +	switch emitter.events[emitter.events_head].typ {
    +	case yaml_DOCUMENT_START_EVENT:
    +		accumulate = 1
    +		break
    +	case yaml_SEQUENCE_START_EVENT:
    +		accumulate = 2
    +		break
    +	case yaml_MAPPING_START_EVENT:
    +		accumulate = 3
    +		break
    +	default:
    +		return false
    +	}
    +	if len(emitter.events)-emitter.events_head > accumulate {
    +		return false
    +	}
    +	var level int
    +	for i := emitter.events_head; i < len(emitter.events); i++ {
    +		switch emitter.events[i].typ {
    +		case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT:
    +			level++
    +		case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT:
    +			level--
    +		}
    +		if level == 0 {
    +			return false
    +		}
    +	}
    +	return true
    +}
    +
    +// Append a directive to the directives stack.
    +func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool {
    +	for i := 0; i < len(emitter.tag_directives); i++ {
    +		if bytes.Equal(value.handle, emitter.tag_directives[i].handle) {
    +			if allow_duplicates {
    +				return true
    +			}
    +			return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive")
    +		}
    +	}
    +
    +	// [Go] Do we actually need to copy this given garbage collection
    +	// and the lack of deallocating destructors?
    +	tag_copy := yaml_tag_directive_t{
    +		handle: make([]byte, len(value.handle)),
    +		prefix: make([]byte, len(value.prefix)),
    +	}
    +	copy(tag_copy.handle, value.handle)
    +	copy(tag_copy.prefix, value.prefix)
    +	emitter.tag_directives = append(emitter.tag_directives, tag_copy)
    +	return true
    +}
    +
    +// Increase the indentation level.
    +func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool {
    +	emitter.indents = append(emitter.indents, emitter.indent)
    +	if emitter.indent < 0 {
    +		if flow {
    +			emitter.indent = emitter.best_indent
    +		} else {
    +			emitter.indent = 0
    +		}
    +	} else if !indentless {
    +		emitter.indent += emitter.best_indent
    +	}
    +	return true
    +}
    +
    +// State dispatcher.
    +func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool {
    +	switch emitter.state {
    +	default:
    +	case yaml_EMIT_STREAM_START_STATE:
    +		return yaml_emitter_emit_stream_start(emitter, event)
    +
    +	case yaml_EMIT_FIRST_DOCUMENT_START_STATE:
    +		return yaml_emitter_emit_document_start(emitter, event, true)
    +
    +	case yaml_EMIT_DOCUMENT_START_STATE:
    +		return yaml_emitter_emit_document_start(emitter, event, false)
    +
    +	case yaml_EMIT_DOCUMENT_CONTENT_STATE:
    +		return yaml_emitter_emit_document_content(emitter, event)
    +
    +	case yaml_EMIT_DOCUMENT_END_STATE:
    +		return yaml_emitter_emit_document_end(emitter, event)
    +
    +	case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE:
    +		return yaml_emitter_emit_flow_sequence_item(emitter, event, true)
    +
    +	case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE:
    +		return yaml_emitter_emit_flow_sequence_item(emitter, event, false)
    +
    +	case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE:
    +		return yaml_emitter_emit_flow_mapping_key(emitter, event, true)
    +
    +	case yaml_EMIT_FLOW_MAPPING_KEY_STATE:
    +		return yaml_emitter_emit_flow_mapping_key(emitter, event, false)
    +
    +	case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE:
    +		return yaml_emitter_emit_flow_mapping_value(emitter, event, true)
    +
    +	case yaml_EMIT_FLOW_MAPPING_VALUE_STATE:
    +		return yaml_emitter_emit_flow_mapping_value(emitter, event, false)
    +
    +	case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE:
    +		return yaml_emitter_emit_block_sequence_item(emitter, event, true)
    +
    +	case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE:
    +		return yaml_emitter_emit_block_sequence_item(emitter, event, false)
    +
    +	case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE:
    +		return yaml_emitter_emit_block_mapping_key(emitter, event, true)
    +
    +	case yaml_EMIT_BLOCK_MAPPING_KEY_STATE:
    +		return yaml_emitter_emit_block_mapping_key(emitter, event, false)
    +
    +	case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE:
    +		return yaml_emitter_emit_block_mapping_value(emitter, event, true)
    +
    +	case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE:
    +		return yaml_emitter_emit_block_mapping_value(emitter, event, false)
    +
    +	case yaml_EMIT_END_STATE:
    +		return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END")
    +	}
    +	panic("invalid emitter state")
    +}
    +
    +// Expect STREAM-START.
    +func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
    +	if event.typ != yaml_STREAM_START_EVENT {
    +		return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START")
    +	}
    +	if emitter.encoding == yaml_ANY_ENCODING {
    +		emitter.encoding = event.encoding
    +		if emitter.encoding == yaml_ANY_ENCODING {
    +			emitter.encoding = yaml_UTF8_ENCODING
    +		}
    +	}
    +	if emitter.best_indent < 2 || emitter.best_indent > 9 {
    +		emitter.best_indent = 2
    +	}
    +	if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 {
    +		emitter.best_width = 80
    +	}
    +	if emitter.best_width < 0 {
    +		emitter.best_width = 1<<31 - 1
    +	}
    +	if emitter.line_break == yaml_ANY_BREAK {
    +		emitter.line_break = yaml_LN_BREAK
    +	}
    +
    +	emitter.indent = -1
    +	emitter.line = 0
    +	emitter.column = 0
    +	emitter.whitespace = true
    +	emitter.indention = true
    +
    +	if emitter.encoding != yaml_UTF8_ENCODING {
    +		if !yaml_emitter_write_bom(emitter) {
    +			return false
    +		}
    +	}
    +	emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE
    +	return true
    +}
    +
    +// Expect DOCUMENT-START or STREAM-END.
    +func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
    +
    +	if event.typ == yaml_DOCUMENT_START_EVENT {
    +
    +		if event.version_directive != nil {
    +			if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) {
    +				return false
    +			}
    +		}
    +
    +		for i := 0; i < len(event.tag_directives); i++ {
    +			tag_directive := &event.tag_directives[i]
    +			if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) {
    +				return false
    +			}
    +			if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) {
    +				return false
    +			}
    +		}
    +
    +		for i := 0; i < len(default_tag_directives); i++ {
    +			tag_directive := &default_tag_directives[i]
    +			if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) {
    +				return false
    +			}
    +		}
    +
    +		implicit := event.implicit
    +		if !first || emitter.canonical {
    +			implicit = false
    +		}
    +
    +		if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) {
    +			if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
    +				return false
    +			}
    +			if !yaml_emitter_write_indent(emitter) {
    +				return false
    +			}
    +		}
    +
    +		if event.version_directive != nil {
    +			implicit = false
    +			if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) {
    +				return false
    +			}
    +			if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) {
    +				return false
    +			}
    +			if !yaml_emitter_write_indent(emitter) {
    +				return false
    +			}
    +		}
    +
    +		if len(event.tag_directives) > 0 {
    +			implicit = false
    +			for i := 0; i < len(event.tag_directives); i++ {
    +				tag_directive := &event.tag_directives[i]
    +				if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) {
    +					return false
    +				}
    +				if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) {
    +					return false
    +				}
    +				if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) {
    +					return false
    +				}
    +				if !yaml_emitter_write_indent(emitter) {
    +					return false
    +				}
    +			}
    +		}
    +
    +		if yaml_emitter_check_empty_document(emitter) {
    +			implicit = false
    +		}
    +		if !implicit {
    +			if !yaml_emitter_write_indent(emitter) {
    +				return false
    +			}
    +			if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) {
    +				return false
    +			}
    +			if emitter.canonical {
    +				if !yaml_emitter_write_indent(emitter) {
    +					return false
    +				}
    +			}
    +		}
    +
    +		emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE
    +		return true
    +	}
    +
    +	if event.typ == yaml_STREAM_END_EVENT {
    +		if emitter.open_ended {
    +			if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
    +				return false
    +			}
    +			if !yaml_emitter_write_indent(emitter) {
    +				return false
    +			}
    +		}
    +		if !yaml_emitter_flush(emitter) {
    +			return false
    +		}
    +		emitter.state = yaml_EMIT_END_STATE
    +		return true
    +	}
    +
    +	return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END")
    +}
    +
    +// Expect the root node.
    +func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool {
    +	emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE)
    +	return yaml_emitter_emit_node(emitter, event, true, false, false, false)
    +}
    +
    +// Expect DOCUMENT-END.
    +func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool {
    +	if event.typ != yaml_DOCUMENT_END_EVENT {
    +		return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END")
    +	}
    +	if !yaml_emitter_write_indent(emitter) {
    +		return false
    +	}
    +	if !event.implicit {
    +		// [Go] Allocate the slice elsewhere.
    +		if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) {
    +			return false
    +		}
    +		if !yaml_emitter_write_indent(emitter) {
    +			return false
    +		}
    +	}
    +	if !yaml_emitter_flush(emitter) {
    +		return false
    +	}
    +	emitter.state = yaml_EMIT_DOCUMENT_START_STATE
    +	emitter.tag_directives = emitter.tag_directives[:0]
    +	return true
    +}
    +
    +// Expect a flow item node.
    +func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
    +	if first {
    +		if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) {
    +			return false
    +		}
    +		if !yaml_emitter_increase_indent(emitter, true, false) {
    +			return false
    +		}
    +		emitter.flow_level++
    +	}
    +
    +	if event.typ == yaml_SEQUENCE_END_EVENT {
    +		emitter.flow_level--
    +		emitter.indent = emitter.indents[len(emitter.indents)-1]
    +		emitter.indents = emitter.indents[:len(emitter.indents)-1]
    +		if emitter.canonical && !first {
    +			if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
    +				return false
    +			}
    +			if !yaml_emitter_write_indent(emitter) {
    +				return false
    +			}
    +		}
    +		if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) {
    +			return false
    +		}
    +		emitter.state = emitter.states[len(emitter.states)-1]
    +		emitter.states = emitter.states[:len(emitter.states)-1]
    +
    +		return true
    +	}
    +
    +	if !first {
    +		if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
    +			return false
    +		}
    +	}
    +
    +	if emitter.canonical || emitter.column > emitter.best_width {
    +		if !yaml_emitter_write_indent(emitter) {
    +			return false
    +		}
    +	}
    +	emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE)
    +	return yaml_emitter_emit_node(emitter, event, false, true, false, false)
    +}
    +
    +// Expect a flow key node.
    +func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
    +	if first {
    +		if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) {
    +			return false
    +		}
    +		if !yaml_emitter_increase_indent(emitter, true, false) {
    +			return false
    +		}
    +		emitter.flow_level++
    +	}
    +
    +	if event.typ == yaml_MAPPING_END_EVENT {
    +		emitter.flow_level--
    +		emitter.indent = emitter.indents[len(emitter.indents)-1]
    +		emitter.indents = emitter.indents[:len(emitter.indents)-1]
    +		if emitter.canonical && !first {
    +			if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
    +				return false
    +			}
    +			if !yaml_emitter_write_indent(emitter) {
    +				return false
    +			}
    +		}
    +		if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) {
    +			return false
    +		}
    +		emitter.state = emitter.states[len(emitter.states)-1]
    +		emitter.states = emitter.states[:len(emitter.states)-1]
    +		return true
    +	}
    +
    +	if !first {
    +		if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) {
    +			return false
    +		}
    +	}
    +	if emitter.canonical || emitter.column > emitter.best_width {
    +		if !yaml_emitter_write_indent(emitter) {
    +			return false
    +		}
    +	}
    +
    +	if !emitter.canonical && yaml_emitter_check_simple_key(emitter) {
    +		emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE)
    +		return yaml_emitter_emit_node(emitter, event, false, false, true, true)
    +	}
    +	if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) {
    +		return false
    +	}
    +	emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE)
    +	return yaml_emitter_emit_node(emitter, event, false, false, true, false)
    +}
    +
    +// Expect a flow value node.
    +func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool {
    +	if simple {
    +		if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) {
    +			return false
    +		}
    +	} else {
    +		if emitter.canonical || emitter.column > emitter.best_width {
    +			if !yaml_emitter_write_indent(emitter) {
    +				return false
    +			}
    +		}
    +		if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) {
    +			return false
    +		}
    +	}
    +	emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE)
    +	return yaml_emitter_emit_node(emitter, event, false, false, true, false)
    +}
    +
    +// Expect a block item node.
    +func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
    +	if first {
    +		if !yaml_emitter_increase_indent(emitter, false, emitter.mapping_context && !emitter.indention) {
    +			return false
    +		}
    +	}
    +	if event.typ == yaml_SEQUENCE_END_EVENT {
    +		emitter.indent = emitter.indents[len(emitter.indents)-1]
    +		emitter.indents = emitter.indents[:len(emitter.indents)-1]
    +		emitter.state = emitter.states[len(emitter.states)-1]
    +		emitter.states = emitter.states[:len(emitter.states)-1]
    +		return true
    +	}
    +	if !yaml_emitter_write_indent(emitter) {
    +		return false
    +	}
    +	if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) {
    +		return false
    +	}
    +	emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE)
    +	return yaml_emitter_emit_node(emitter, event, false, true, false, false)
    +}
    +
    +// Expect a block key node.
    +func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool {
    +	if first {
    +		if !yaml_emitter_increase_indent(emitter, false, false) {
    +			return false
    +		}
    +	}
    +	if event.typ == yaml_MAPPING_END_EVENT {
    +		emitter.indent = emitter.indents[len(emitter.indents)-1]
    +		emitter.indents = emitter.indents[:len(emitter.indents)-1]
    +		emitter.state = emitter.states[len(emitter.states)-1]
    +		emitter.states = emitter.states[:len(emitter.states)-1]
    +		return true
    +	}
    +	if !yaml_emitter_write_indent(emitter) {
    +		return false
    +	}
    +	if yaml_emitter_check_simple_key(emitter) {
    +		emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE)
    +		return yaml_emitter_emit_node(emitter, event, false, false, true, true)
    +	}
    +	if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) {
    +		return false
    +	}
    +	emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE)
    +	return yaml_emitter_emit_node(emitter, event, false, false, true, false)
    +}
    +
    +// Expect a block value node.
    +func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool {
    +	if simple {
    +		if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) {
    +			return false
    +		}
    +	} else {
    +		if !yaml_emitter_write_indent(emitter) {
    +			return false
    +		}
    +		if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) {
    +			return false
    +		}
    +	}
    +	emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE)
    +	return yaml_emitter_emit_node(emitter, event, false, false, true, false)
    +}
    +
    +// Expect a node.
    +func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t,
    +	root bool, sequence bool, mapping bool, simple_key bool) bool {
    +
    +	emitter.root_context = root
    +	emitter.sequence_context = sequence
    +	emitter.mapping_context = mapping
    +	emitter.simple_key_context = simple_key
    +
    +	switch event.typ {
    +	case yaml_ALIAS_EVENT:
    +		return yaml_emitter_emit_alias(emitter, event)
    +	case yaml_SCALAR_EVENT:
    +		return yaml_emitter_emit_scalar(emitter, event)
    +	case yaml_SEQUENCE_START_EVENT:
    +		return yaml_emitter_emit_sequence_start(emitter, event)
    +	case yaml_MAPPING_START_EVENT:
    +		return yaml_emitter_emit_mapping_start(emitter, event)
    +	default:
    +		return yaml_emitter_set_emitter_error(emitter,
    +			"expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS")
    +	}
    +	return false
    +}
    +
    +// Expect ALIAS.
    +func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool {
    +	if !yaml_emitter_process_anchor(emitter) {
    +		return false
    +	}
    +	emitter.state = emitter.states[len(emitter.states)-1]
    +	emitter.states = emitter.states[:len(emitter.states)-1]
    +	return true
    +}
    +
    +// Expect SCALAR.
    +func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool {
    +	if !yaml_emitter_select_scalar_style(emitter, event) {
    +		return false
    +	}
    +	if !yaml_emitter_process_anchor(emitter) {
    +		return false
    +	}
    +	if !yaml_emitter_process_tag(emitter) {
    +		return false
    +	}
    +	if !yaml_emitter_increase_indent(emitter, true, false) {
    +		return false
    +	}
    +	if !yaml_emitter_process_scalar(emitter) {
    +		return false
    +	}
    +	emitter.indent = emitter.indents[len(emitter.indents)-1]
    +	emitter.indents = emitter.indents[:len(emitter.indents)-1]
    +	emitter.state = emitter.states[len(emitter.states)-1]
    +	emitter.states = emitter.states[:len(emitter.states)-1]
    +	return true
    +}
    +
    +// Expect SEQUENCE-START.
    +func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
    +	if !yaml_emitter_process_anchor(emitter) {
    +		return false
    +	}
    +	if !yaml_emitter_process_tag(emitter) {
    +		return false
    +	}
    +	if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE ||
    +		yaml_emitter_check_empty_sequence(emitter) {
    +		emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE
    +	} else {
    +		emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE
    +	}
    +	return true
    +}
    +
    +// Expect MAPPING-START.
    +func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool {
    +	if !yaml_emitter_process_anchor(emitter) {
    +		return false
    +	}
    +	if !yaml_emitter_process_tag(emitter) {
    +		return false
    +	}
    +	if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE ||
    +		yaml_emitter_check_empty_mapping(emitter) {
    +		emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE
    +	} else {
    +		emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE
    +	}
    +	return true
    +}
    +
    +// Check if the document content is an empty scalar.
    +func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool {
    +	return false // [Go] Huh?
    +}
    +
    +// Check if the next events represent an empty sequence.
    +func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool {
    +	if len(emitter.events)-emitter.events_head < 2 {
    +		return false
    +	}
    +	return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT &&
    +		emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT
    +}
    +
    +// Check if the next events represent an empty mapping.
    +func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool {
    +	if len(emitter.events)-emitter.events_head < 2 {
    +		return false
    +	}
    +	return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT &&
    +		emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT
    +}
    +
    +// Check if the next node can be expressed as a simple key.
    +func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool {
    +	length := 0
    +	switch emitter.events[emitter.events_head].typ {
    +	case yaml_ALIAS_EVENT:
    +		length += len(emitter.anchor_data.anchor)
    +	case yaml_SCALAR_EVENT:
    +		if emitter.scalar_data.multiline {
    +			return false
    +		}
    +		length += len(emitter.anchor_data.anchor) +
    +			len(emitter.tag_data.handle) +
    +			len(emitter.tag_data.suffix) +
    +			len(emitter.scalar_data.value)
    +	case yaml_SEQUENCE_START_EVENT:
    +		if !yaml_emitter_check_empty_sequence(emitter) {
    +			return false
    +		}
    +		length += len(emitter.anchor_data.anchor) +
    +			len(emitter.tag_data.handle) +
    +			len(emitter.tag_data.suffix)
    +	case yaml_MAPPING_START_EVENT:
    +		if !yaml_emitter_check_empty_mapping(emitter) {
    +			return false
    +		}
    +		length += len(emitter.anchor_data.anchor) +
    +			len(emitter.tag_data.handle) +
    +			len(emitter.tag_data.suffix)
    +	default:
    +		return false
    +	}
    +	return length <= 128
    +}
    +
    +// Determine an acceptable scalar style.
    +func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool {
    +
    +	no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0
    +	if no_tag && !event.implicit && !event.quoted_implicit {
    +		return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified")
    +	}
    +
    +	style := event.scalar_style()
    +	if style == yaml_ANY_SCALAR_STYLE {
    +		style = yaml_PLAIN_SCALAR_STYLE
    +	}
    +	if emitter.canonical {
    +		style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
    +	}
    +	if emitter.simple_key_context && emitter.scalar_data.multiline {
    +		style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
    +	}
    +
    +	if style == yaml_PLAIN_SCALAR_STYLE {
    +		if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed ||
    +			emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed {
    +			style = yaml_SINGLE_QUOTED_SCALAR_STYLE
    +		}
    +		if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) {
    +			style = yaml_SINGLE_QUOTED_SCALAR_STYLE
    +		}
    +		if no_tag && !event.implicit {
    +			style = yaml_SINGLE_QUOTED_SCALAR_STYLE
    +		}
    +	}
    +	if style == yaml_SINGLE_QUOTED_SCALAR_STYLE {
    +		if !emitter.scalar_data.single_quoted_allowed {
    +			style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
    +		}
    +	}
    +	if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE {
    +		if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context {
    +			style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
    +		}
    +	}
    +
    +	if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE {
    +		emitter.tag_data.handle = []byte{'!'}
    +	}
    +	emitter.scalar_data.style = style
    +	return true
    +}
    +
    +// Write an achor.
    +func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool {
    +	if emitter.anchor_data.anchor == nil {
    +		return true
    +	}
    +	c := []byte{'&'}
    +	if emitter.anchor_data.alias {
    +		c[0] = '*'
    +	}
    +	if !yaml_emitter_write_indicator(emitter, c, true, false, false) {
    +		return false
    +	}
    +	return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor)
    +}
    +
    +// Write a tag.
    +func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool {
    +	if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 {
    +		return true
    +	}
    +	if len(emitter.tag_data.handle) > 0 {
    +		if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) {
    +			return false
    +		}
    +		if len(emitter.tag_data.suffix) > 0 {
    +			if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) {
    +				return false
    +			}
    +		}
    +	} else {
    +		// [Go] Allocate these slices elsewhere.
    +		if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) {
    +			return false
    +		}
    +		if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) {
    +			return false
    +		}
    +		if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) {
    +			return false
    +		}
    +	}
    +	return true
    +}
    +
    +// Write a scalar.
    +func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool {
    +	switch emitter.scalar_data.style {
    +	case yaml_PLAIN_SCALAR_STYLE:
    +		return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
    +
    +	case yaml_SINGLE_QUOTED_SCALAR_STYLE:
    +		return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
    +
    +	case yaml_DOUBLE_QUOTED_SCALAR_STYLE:
    +		return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context)
    +
    +	case yaml_LITERAL_SCALAR_STYLE:
    +		return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value)
    +
    +	case yaml_FOLDED_SCALAR_STYLE:
    +		return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value)
    +	}
    +	panic("unknown scalar style")
    +}
    +
    +// Check if a %YAML directive is valid.
    +func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool {
    +	if version_directive.major != 1 || version_directive.minor != 1 {
    +		return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive")
    +	}
    +	return true
    +}
    +
    +// Check if a %TAG directive is valid.
    +func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool {
    +	handle := tag_directive.handle
    +	prefix := tag_directive.prefix
    +	if len(handle) == 0 {
    +		return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty")
    +	}
    +	if handle[0] != '!' {
    +		return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'")
    +	}
    +	if handle[len(handle)-1] != '!' {
    +		return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'")
    +	}
    +	for i := 1; i < len(handle)-1; i += width(handle[i]) {
    +		if !is_alpha(handle, i) {
    +			return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only")
    +		}
    +	}
    +	if len(prefix) == 0 {
    +		return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty")
    +	}
    +	return true
    +}
    +
    +// Check if an anchor is valid.
    +func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool {
    +	if len(anchor) == 0 {
    +		problem := "anchor value must not be empty"
    +		if alias {
    +			problem = "alias value must not be empty"
    +		}
    +		return yaml_emitter_set_emitter_error(emitter, problem)
    +	}
    +	for i := 0; i < len(anchor); i += width(anchor[i]) {
    +		if !is_alpha(anchor, i) {
    +			problem := "anchor value must contain alphanumerical characters only"
    +			if alias {
    +				problem = "alias value must contain alphanumerical characters only"
    +			}
    +			return yaml_emitter_set_emitter_error(emitter, problem)
    +		}
    +	}
    +	emitter.anchor_data.anchor = anchor
    +	emitter.anchor_data.alias = alias
    +	return true
    +}
    +
    +// Check if a tag is valid.
    +func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool {
    +	if len(tag) == 0 {
    +		return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty")
    +	}
    +	for i := 0; i < len(emitter.tag_directives); i++ {
    +		tag_directive := &emitter.tag_directives[i]
    +		if bytes.HasPrefix(tag, tag_directive.prefix) {
    +			emitter.tag_data.handle = tag_directive.handle
    +			emitter.tag_data.suffix = tag[len(tag_directive.prefix):]
    +			return true
    +		}
    +	}
    +	emitter.tag_data.suffix = tag
    +	return true
    +}
    +
    +// Check if a scalar is valid.
    +func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool {
    +	var (
    +		block_indicators   = false
    +		flow_indicators    = false
    +		line_breaks        = false
    +		special_characters = false
    +
    +		leading_space  = false
    +		leading_break  = false
    +		trailing_space = false
    +		trailing_break = false
    +		break_space    = false
    +		space_break    = false
    +
    +		preceeded_by_whitespace = false
    +		followed_by_whitespace  = false
    +		previous_space          = false
    +		previous_break          = false
    +	)
    +
    +	emitter.scalar_data.value = value
    +
    +	if len(value) == 0 {
    +		emitter.scalar_data.multiline = false
    +		emitter.scalar_data.flow_plain_allowed = false
    +		emitter.scalar_data.block_plain_allowed = true
    +		emitter.scalar_data.single_quoted_allowed = true
    +		emitter.scalar_data.block_allowed = false
    +		return true
    +	}
    +
    +	if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) {
    +		block_indicators = true
    +		flow_indicators = true
    +	}
    +
    +	preceeded_by_whitespace = true
    +	for i, w := 0, 0; i < len(value); i += w {
    +		w = width(value[i])
    +		followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w)
    +
    +		if i == 0 {
    +			switch value[i] {
    +			case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`':
    +				flow_indicators = true
    +				block_indicators = true
    +			case '?', ':':
    +				flow_indicators = true
    +				if followed_by_whitespace {
    +					block_indicators = true
    +				}
    +			case '-':
    +				if followed_by_whitespace {
    +					flow_indicators = true
    +					block_indicators = true
    +				}
    +			}
    +		} else {
    +			switch value[i] {
    +			case ',', '?', '[', ']', '{', '}':
    +				flow_indicators = true
    +			case ':':
    +				flow_indicators = true
    +				if followed_by_whitespace {
    +					block_indicators = true
    +				}
    +			case '#':
    +				if preceeded_by_whitespace {
    +					flow_indicators = true
    +					block_indicators = true
    +				}
    +			}
    +		}
    +
    +		if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode {
    +			special_characters = true
    +		}
    +		if is_space(value, i) {
    +			if i == 0 {
    +				leading_space = true
    +			}
    +			if i+width(value[i]) == len(value) {
    +				trailing_space = true
    +			}
    +			if previous_break {
    +				break_space = true
    +			}
    +			previous_space = true
    +			previous_break = false
    +		} else if is_break(value, i) {
    +			line_breaks = true
    +			if i == 0 {
    +				leading_break = true
    +			}
    +			if i+width(value[i]) == len(value) {
    +				trailing_break = true
    +			}
    +			if previous_space {
    +				space_break = true
    +			}
    +			previous_space = false
    +			previous_break = true
    +		} else {
    +			previous_space = false
    +			previous_break = false
    +		}
    +
    +		// [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition.
    +		preceeded_by_whitespace = is_blankz(value, i)
    +	}
    +
    +	emitter.scalar_data.multiline = line_breaks
    +	emitter.scalar_data.flow_plain_allowed = true
    +	emitter.scalar_data.block_plain_allowed = true
    +	emitter.scalar_data.single_quoted_allowed = true
    +	emitter.scalar_data.block_allowed = true
    +
    +	if leading_space || leading_break || trailing_space || trailing_break {
    +		emitter.scalar_data.flow_plain_allowed = false
    +		emitter.scalar_data.block_plain_allowed = false
    +	}
    +	if trailing_space {
    +		emitter.scalar_data.block_allowed = false
    +	}
    +	if break_space {
    +		emitter.scalar_data.flow_plain_allowed = false
    +		emitter.scalar_data.block_plain_allowed = false
    +		emitter.scalar_data.single_quoted_allowed = false
    +	}
    +	if space_break || special_characters {
    +		emitter.scalar_data.flow_plain_allowed = false
    +		emitter.scalar_data.block_plain_allowed = false
    +		emitter.scalar_data.single_quoted_allowed = false
    +		emitter.scalar_data.block_allowed = false
    +	}
    +	if line_breaks {
    +		emitter.scalar_data.flow_plain_allowed = false
    +		emitter.scalar_data.block_plain_allowed = false
    +	}
    +	if flow_indicators {
    +		emitter.scalar_data.flow_plain_allowed = false
    +	}
    +	if block_indicators {
    +		emitter.scalar_data.block_plain_allowed = false
    +	}
    +	return true
    +}
    +
    +// Check if the event data is valid.
    +func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool {
    +
    +	emitter.anchor_data.anchor = nil
    +	emitter.tag_data.handle = nil
    +	emitter.tag_data.suffix = nil
    +	emitter.scalar_data.value = nil
    +
    +	switch event.typ {
    +	case yaml_ALIAS_EVENT:
    +		if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) {
    +			return false
    +		}
    +
    +	case yaml_SCALAR_EVENT:
    +		if len(event.anchor) > 0 {
    +			if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
    +				return false
    +			}
    +		}
    +		if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) {
    +			if !yaml_emitter_analyze_tag(emitter, event.tag) {
    +				return false
    +			}
    +		}
    +		if !yaml_emitter_analyze_scalar(emitter, event.value) {
    +			return false
    +		}
    +
    +	case yaml_SEQUENCE_START_EVENT:
    +		if len(event.anchor) > 0 {
    +			if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
    +				return false
    +			}
    +		}
    +		if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
    +			if !yaml_emitter_analyze_tag(emitter, event.tag) {
    +				return false
    +			}
    +		}
    +
    +	case yaml_MAPPING_START_EVENT:
    +		if len(event.anchor) > 0 {
    +			if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) {
    +				return false
    +			}
    +		}
    +		if len(event.tag) > 0 && (emitter.canonical || !event.implicit) {
    +			if !yaml_emitter_analyze_tag(emitter, event.tag) {
    +				return false
    +			}
    +		}
    +	}
    +	return true
    +}
    +
    +// Write the BOM character.
    +func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool {
    +	if !flush(emitter) {
    +		return false
    +	}
    +	pos := emitter.buffer_pos
    +	emitter.buffer[pos+0] = '\xEF'
    +	emitter.buffer[pos+1] = '\xBB'
    +	emitter.buffer[pos+2] = '\xBF'
    +	emitter.buffer_pos += 3
    +	return true
    +}
    +
    +func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool {
    +	indent := emitter.indent
    +	if indent < 0 {
    +		indent = 0
    +	}
    +	if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) {
    +		if !put_break(emitter) {
    +			return false
    +		}
    +	}
    +	for emitter.column < indent {
    +		if !put(emitter, ' ') {
    +			return false
    +		}
    +	}
    +	emitter.whitespace = true
    +	emitter.indention = true
    +	return true
    +}
    +
    +func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool {
    +	if need_whitespace && !emitter.whitespace {
    +		if !put(emitter, ' ') {
    +			return false
    +		}
    +	}
    +	if !write_all(emitter, indicator) {
    +		return false
    +	}
    +	emitter.whitespace = is_whitespace
    +	emitter.indention = (emitter.indention && is_indention)
    +	emitter.open_ended = false
    +	return true
    +}
    +
    +func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool {
    +	if !write_all(emitter, value) {
    +		return false
    +	}
    +	emitter.whitespace = false
    +	emitter.indention = false
    +	return true
    +}
    +
    +func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool {
    +	if !emitter.whitespace {
    +		if !put(emitter, ' ') {
    +			return false
    +		}
    +	}
    +	if !write_all(emitter, value) {
    +		return false
    +	}
    +	emitter.whitespace = false
    +	emitter.indention = false
    +	return true
    +}
    +
    +func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool {
    +	if need_whitespace && !emitter.whitespace {
    +		if !put(emitter, ' ') {
    +			return false
    +		}
    +	}
    +	for i := 0; i < len(value); {
    +		var must_write bool
    +		switch value[i] {
    +		case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']':
    +			must_write = true
    +		default:
    +			must_write = is_alpha(value, i)
    +		}
    +		if must_write {
    +			if !write(emitter, value, &i) {
    +				return false
    +			}
    +		} else {
    +			w := width(value[i])
    +			for k := 0; k < w; k++ {
    +				octet := value[i]
    +				i++
    +				if !put(emitter, '%') {
    +					return false
    +				}
    +
    +				c := octet >> 4
    +				if c < 10 {
    +					c += '0'
    +				} else {
    +					c += 'A' - 10
    +				}
    +				if !put(emitter, c) {
    +					return false
    +				}
    +
    +				c = octet & 0x0f
    +				if c < 10 {
    +					c += '0'
    +				} else {
    +					c += 'A' - 10
    +				}
    +				if !put(emitter, c) {
    +					return false
    +				}
    +			}
    +		}
    +	}
    +	emitter.whitespace = false
    +	emitter.indention = false
    +	return true
    +}
    +
    +func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
    +	if !emitter.whitespace {
    +		if !put(emitter, ' ') {
    +			return false
    +		}
    +	}
    +
    +	spaces := false
    +	breaks := false
    +	for i := 0; i < len(value); {
    +		if is_space(value, i) {
    +			if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) {
    +				if !yaml_emitter_write_indent(emitter) {
    +					return false
    +				}
    +				i += width(value[i])
    +			} else {
    +				if !write(emitter, value, &i) {
    +					return false
    +				}
    +			}
    +			spaces = true
    +		} else if is_break(value, i) {
    +			if !breaks && value[i] == '\n' {
    +				if !put_break(emitter) {
    +					return false
    +				}
    +			}
    +			if !write_break(emitter, value, &i) {
    +				return false
    +			}
    +			emitter.indention = true
    +			breaks = true
    +		} else {
    +			if breaks {
    +				if !yaml_emitter_write_indent(emitter) {
    +					return false
    +				}
    +			}
    +			if !write(emitter, value, &i) {
    +				return false
    +			}
    +			emitter.indention = false
    +			spaces = false
    +			breaks = false
    +		}
    +	}
    +
    +	emitter.whitespace = false
    +	emitter.indention = false
    +	if emitter.root_context {
    +		emitter.open_ended = true
    +	}
    +
    +	return true
    +}
    +
    +func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
    +
    +	if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) {
    +		return false
    +	}
    +
    +	spaces := false
    +	breaks := false
    +	for i := 0; i < len(value); {
    +		if is_space(value, i) {
    +			if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) {
    +				if !yaml_emitter_write_indent(emitter) {
    +					return false
    +				}
    +				i += width(value[i])
    +			} else {
    +				if !write(emitter, value, &i) {
    +					return false
    +				}
    +			}
    +			spaces = true
    +		} else if is_break(value, i) {
    +			if !breaks && value[i] == '\n' {
    +				if !put_break(emitter) {
    +					return false
    +				}
    +			}
    +			if !write_break(emitter, value, &i) {
    +				return false
    +			}
    +			emitter.indention = true
    +			breaks = true
    +		} else {
    +			if breaks {
    +				if !yaml_emitter_write_indent(emitter) {
    +					return false
    +				}
    +			}
    +			if value[i] == '\'' {
    +				if !put(emitter, '\'') {
    +					return false
    +				}
    +			}
    +			if !write(emitter, value, &i) {
    +				return false
    +			}
    +			emitter.indention = false
    +			spaces = false
    +			breaks = false
    +		}
    +	}
    +	if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) {
    +		return false
    +	}
    +	emitter.whitespace = false
    +	emitter.indention = false
    +	return true
    +}
    +
    +func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool {
    +	spaces := false
    +	if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) {
    +		return false
    +	}
    +
    +	for i := 0; i < len(value); {
    +		if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) ||
    +			is_bom(value, i) || is_break(value, i) ||
    +			value[i] == '"' || value[i] == '\\' {
    +
    +			octet := value[i]
    +
    +			var w int
    +			var v rune
    +			switch {
    +			case octet&0x80 == 0x00:
    +				w, v = 1, rune(octet&0x7F)
    +			case octet&0xE0 == 0xC0:
    +				w, v = 2, rune(octet&0x1F)
    +			case octet&0xF0 == 0xE0:
    +				w, v = 3, rune(octet&0x0F)
    +			case octet&0xF8 == 0xF0:
    +				w, v = 4, rune(octet&0x07)
    +			}
    +			for k := 1; k < w; k++ {
    +				octet = value[i+k]
    +				v = (v << 6) + (rune(octet) & 0x3F)
    +			}
    +			i += w
    +
    +			if !put(emitter, '\\') {
    +				return false
    +			}
    +
    +			var ok bool
    +			switch v {
    +			case 0x00:
    +				ok = put(emitter, '0')
    +			case 0x07:
    +				ok = put(emitter, 'a')
    +			case 0x08:
    +				ok = put(emitter, 'b')
    +			case 0x09:
    +				ok = put(emitter, 't')
    +			case 0x0A:
    +				ok = put(emitter, 'n')
    +			case 0x0b:
    +				ok = put(emitter, 'v')
    +			case 0x0c:
    +				ok = put(emitter, 'f')
    +			case 0x0d:
    +				ok = put(emitter, 'r')
    +			case 0x1b:
    +				ok = put(emitter, 'e')
    +			case 0x22:
    +				ok = put(emitter, '"')
    +			case 0x5c:
    +				ok = put(emitter, '\\')
    +			case 0x85:
    +				ok = put(emitter, 'N')
    +			case 0xA0:
    +				ok = put(emitter, '_')
    +			case 0x2028:
    +				ok = put(emitter, 'L')
    +			case 0x2029:
    +				ok = put(emitter, 'P')
    +			default:
    +				if v <= 0xFF {
    +					ok = put(emitter, 'x')
    +					w = 2
    +				} else if v <= 0xFFFF {
    +					ok = put(emitter, 'u')
    +					w = 4
    +				} else {
    +					ok = put(emitter, 'U')
    +					w = 8
    +				}
    +				for k := (w - 1) * 4; ok && k >= 0; k -= 4 {
    +					digit := byte((v >> uint(k)) & 0x0F)
    +					if digit < 10 {
    +						ok = put(emitter, digit+'0')
    +					} else {
    +						ok = put(emitter, digit+'A'-10)
    +					}
    +				}
    +			}
    +			if !ok {
    +				return false
    +			}
    +			spaces = false
    +		} else if is_space(value, i) {
    +			if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 {
    +				if !yaml_emitter_write_indent(emitter) {
    +					return false
    +				}
    +				if is_space(value, i+1) {
    +					if !put(emitter, '\\') {
    +						return false
    +					}
    +				}
    +				i += width(value[i])
    +			} else if !write(emitter, value, &i) {
    +				return false
    +			}
    +			spaces = true
    +		} else {
    +			if !write(emitter, value, &i) {
    +				return false
    +			}
    +			spaces = false
    +		}
    +	}
    +	if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) {
    +		return false
    +	}
    +	emitter.whitespace = false
    +	emitter.indention = false
    +	return true
    +}
    +
    +func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool {
    +	if is_space(value, 0) || is_break(value, 0) {
    +		indent_hint := []byte{'0' + byte(emitter.best_indent)}
    +		if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) {
    +			return false
    +		}
    +	}
    +
    +	emitter.open_ended = false
    +
    +	var chomp_hint [1]byte
    +	if len(value) == 0 {
    +		chomp_hint[0] = '-'
    +	} else {
    +		i := len(value) - 1
    +		for value[i]&0xC0 == 0x80 {
    +			i--
    +		}
    +		if !is_break(value, i) {
    +			chomp_hint[0] = '-'
    +		} else if i == 0 {
    +			chomp_hint[0] = '+'
    +			emitter.open_ended = true
    +		} else {
    +			i--
    +			for value[i]&0xC0 == 0x80 {
    +				i--
    +			}
    +			if is_break(value, i) {
    +				chomp_hint[0] = '+'
    +				emitter.open_ended = true
    +			}
    +		}
    +	}
    +	if chomp_hint[0] != 0 {
    +		if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) {
    +			return false
    +		}
    +	}
    +	return true
    +}
    +
    +func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool {
    +	if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) {
    +		return false
    +	}
    +	if !yaml_emitter_write_block_scalar_hints(emitter, value) {
    +		return false
    +	}
    +	if !put_break(emitter) {
    +		return false
    +	}
    +	emitter.indention = true
    +	emitter.whitespace = true
    +	breaks := true
    +	for i := 0; i < len(value); {
    +		if is_break(value, i) {
    +			if !write_break(emitter, value, &i) {
    +				return false
    +			}
    +			emitter.indention = true
    +			breaks = true
    +		} else {
    +			if breaks {
    +				if !yaml_emitter_write_indent(emitter) {
    +					return false
    +				}
    +			}
    +			if !write(emitter, value, &i) {
    +				return false
    +			}
    +			emitter.indention = false
    +			breaks = false
    +		}
    +	}
    +
    +	return true
    +}
    +
    +func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool {
    +	if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) {
    +		return false
    +	}
    +	if !yaml_emitter_write_block_scalar_hints(emitter, value) {
    +		return false
    +	}
    +
    +	if !put_break(emitter) {
    +		return false
    +	}
    +	emitter.indention = true
    +	emitter.whitespace = true
    +
    +	breaks := true
    +	leading_spaces := true
    +	for i := 0; i < len(value); {
    +		if is_break(value, i) {
    +			if !breaks && !leading_spaces && value[i] == '\n' {
    +				k := 0
    +				for is_break(value, k) {
    +					k += width(value[k])
    +				}
    +				if !is_blankz(value, k) {
    +					if !put_break(emitter) {
    +						return false
    +					}
    +				}
    +			}
    +			if !write_break(emitter, value, &i) {
    +				return false
    +			}
    +			emitter.indention = true
    +			breaks = true
    +		} else {
    +			if breaks {
    +				if !yaml_emitter_write_indent(emitter) {
    +					return false
    +				}
    +				leading_spaces = is_blank(value, i)
    +			}
    +			if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width {
    +				if !yaml_emitter_write_indent(emitter) {
    +					return false
    +				}
    +				i += width(value[i])
    +			} else {
    +				if !write(emitter, value, &i) {
    +					return false
    +				}
    +			}
    +			emitter.indention = false
    +			breaks = false
    +		}
    +	}
    +	return true
    +}
    diff --git a/vendor/gopkg.in/yaml.v2/encode.go b/vendor/gopkg.in/yaml.v2/encode.go
    new file mode 100644
    index 0000000000..84f8499551
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/encode.go
    @@ -0,0 +1,306 @@
    +package yaml
    +
    +import (
    +	"encoding"
    +	"fmt"
    +	"reflect"
    +	"regexp"
    +	"sort"
    +	"strconv"
    +	"strings"
    +	"time"
    +)
    +
    +type encoder struct {
    +	emitter yaml_emitter_t
    +	event   yaml_event_t
    +	out     []byte
    +	flow    bool
    +}
    +
    +func newEncoder() (e *encoder) {
    +	e = &encoder{}
    +	e.must(yaml_emitter_initialize(&e.emitter))
    +	yaml_emitter_set_output_string(&e.emitter, &e.out)
    +	yaml_emitter_set_unicode(&e.emitter, true)
    +	e.must(yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING))
    +	e.emit()
    +	e.must(yaml_document_start_event_initialize(&e.event, nil, nil, true))
    +	e.emit()
    +	return e
    +}
    +
    +func (e *encoder) finish() {
    +	e.must(yaml_document_end_event_initialize(&e.event, true))
    +	e.emit()
    +	e.emitter.open_ended = false
    +	e.must(yaml_stream_end_event_initialize(&e.event))
    +	e.emit()
    +}
    +
    +func (e *encoder) destroy() {
    +	yaml_emitter_delete(&e.emitter)
    +}
    +
    +func (e *encoder) emit() {
    +	// This will internally delete the e.event value.
    +	if !yaml_emitter_emit(&e.emitter, &e.event) && e.event.typ != yaml_DOCUMENT_END_EVENT && e.event.typ != yaml_STREAM_END_EVENT {
    +		e.must(false)
    +	}
    +}
    +
    +func (e *encoder) must(ok bool) {
    +	if !ok {
    +		msg := e.emitter.problem
    +		if msg == "" {
    +			msg = "unknown problem generating YAML content"
    +		}
    +		failf("%s", msg)
    +	}
    +}
    +
    +func (e *encoder) marshal(tag string, in reflect.Value) {
    +	if !in.IsValid() {
    +		e.nilv()
    +		return
    +	}
    +	iface := in.Interface()
    +	if m, ok := iface.(Marshaler); ok {
    +		v, err := m.MarshalYAML()
    +		if err != nil {
    +			fail(err)
    +		}
    +		if v == nil {
    +			e.nilv()
    +			return
    +		}
    +		in = reflect.ValueOf(v)
    +	} else if m, ok := iface.(encoding.TextMarshaler); ok {
    +		text, err := m.MarshalText()
    +		if err != nil {
    +			fail(err)
    +		}
    +		in = reflect.ValueOf(string(text))
    +	}
    +	switch in.Kind() {
    +	case reflect.Interface:
    +		if in.IsNil() {
    +			e.nilv()
    +		} else {
    +			e.marshal(tag, in.Elem())
    +		}
    +	case reflect.Map:
    +		e.mapv(tag, in)
    +	case reflect.Ptr:
    +		if in.IsNil() {
    +			e.nilv()
    +		} else {
    +			e.marshal(tag, in.Elem())
    +		}
    +	case reflect.Struct:
    +		e.structv(tag, in)
    +	case reflect.Slice:
    +		if in.Type().Elem() == mapItemType {
    +			e.itemsv(tag, in)
    +		} else {
    +			e.slicev(tag, in)
    +		}
    +	case reflect.String:
    +		e.stringv(tag, in)
    +	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
    +		if in.Type() == durationType {
    +			e.stringv(tag, reflect.ValueOf(iface.(time.Duration).String()))
    +		} else {
    +			e.intv(tag, in)
    +		}
    +	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
    +		e.uintv(tag, in)
    +	case reflect.Float32, reflect.Float64:
    +		e.floatv(tag, in)
    +	case reflect.Bool:
    +		e.boolv(tag, in)
    +	default:
    +		panic("cannot marshal type: " + in.Type().String())
    +	}
    +}
    +
    +func (e *encoder) mapv(tag string, in reflect.Value) {
    +	e.mappingv(tag, func() {
    +		keys := keyList(in.MapKeys())
    +		sort.Sort(keys)
    +		for _, k := range keys {
    +			e.marshal("", k)
    +			e.marshal("", in.MapIndex(k))
    +		}
    +	})
    +}
    +
    +func (e *encoder) itemsv(tag string, in reflect.Value) {
    +	e.mappingv(tag, func() {
    +		slice := in.Convert(reflect.TypeOf([]MapItem{})).Interface().([]MapItem)
    +		for _, item := range slice {
    +			e.marshal("", reflect.ValueOf(item.Key))
    +			e.marshal("", reflect.ValueOf(item.Value))
    +		}
    +	})
    +}
    +
    +func (e *encoder) structv(tag string, in reflect.Value) {
    +	sinfo, err := getStructInfo(in.Type())
    +	if err != nil {
    +		panic(err)
    +	}
    +	e.mappingv(tag, func() {
    +		for _, info := range sinfo.FieldsList {
    +			var value reflect.Value
    +			if info.Inline == nil {
    +				value = in.Field(info.Num)
    +			} else {
    +				value = in.FieldByIndex(info.Inline)
    +			}
    +			if info.OmitEmpty && isZero(value) {
    +				continue
    +			}
    +			e.marshal("", reflect.ValueOf(info.Key))
    +			e.flow = info.Flow
    +			e.marshal("", value)
    +		}
    +		if sinfo.InlineMap >= 0 {
    +			m := in.Field(sinfo.InlineMap)
    +			if m.Len() > 0 {
    +				e.flow = false
    +				keys := keyList(m.MapKeys())
    +				sort.Sort(keys)
    +				for _, k := range keys {
    +					if _, found := sinfo.FieldsMap[k.String()]; found {
    +						panic(fmt.Sprintf("Can't have key %q in inlined map; conflicts with struct field", k.String()))
    +					}
    +					e.marshal("", k)
    +					e.flow = false
    +					e.marshal("", m.MapIndex(k))
    +				}
    +			}
    +		}
    +	})
    +}
    +
    +func (e *encoder) mappingv(tag string, f func()) {
    +	implicit := tag == ""
    +	style := yaml_BLOCK_MAPPING_STYLE
    +	if e.flow {
    +		e.flow = false
    +		style = yaml_FLOW_MAPPING_STYLE
    +	}
    +	e.must(yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style))
    +	e.emit()
    +	f()
    +	e.must(yaml_mapping_end_event_initialize(&e.event))
    +	e.emit()
    +}
    +
    +func (e *encoder) slicev(tag string, in reflect.Value) {
    +	implicit := tag == ""
    +	style := yaml_BLOCK_SEQUENCE_STYLE
    +	if e.flow {
    +		e.flow = false
    +		style = yaml_FLOW_SEQUENCE_STYLE
    +	}
    +	e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style))
    +	e.emit()
    +	n := in.Len()
    +	for i := 0; i < n; i++ {
    +		e.marshal("", in.Index(i))
    +	}
    +	e.must(yaml_sequence_end_event_initialize(&e.event))
    +	e.emit()
    +}
    +
    +// isBase60 returns whether s is in base 60 notation as defined in YAML 1.1.
    +//
    +// The base 60 float notation in YAML 1.1 is a terrible idea and is unsupported
    +// in YAML 1.2 and by this package, but these should be marshalled quoted for
    +// the time being for compatibility with other parsers.
    +func isBase60Float(s string) (result bool) {
    +	// Fast path.
    +	if s == "" {
    +		return false
    +	}
    +	c := s[0]
    +	if !(c == '+' || c == '-' || c >= '0' && c <= '9') || strings.IndexByte(s, ':') < 0 {
    +		return false
    +	}
    +	// Do the full match.
    +	return base60float.MatchString(s)
    +}
    +
    +// From http://yaml.org/type/float.html, except the regular expression there
    +// is bogus. In practice parsers do not enforce the "\.[0-9_]*" suffix.
    +var base60float = regexp.MustCompile(`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0-9_]*)?$`)
    +
    +func (e *encoder) stringv(tag string, in reflect.Value) {
    +	var style yaml_scalar_style_t
    +	s := in.String()
    +	rtag, rs := resolve("", s)
    +	if rtag == yaml_BINARY_TAG {
    +		if tag == "" || tag == yaml_STR_TAG {
    +			tag = rtag
    +			s = rs.(string)
    +		} else if tag == yaml_BINARY_TAG {
    +			failf("explicitly tagged !!binary data must be base64-encoded")
    +		} else {
    +			failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag))
    +		}
    +	}
    +	if tag == "" && (rtag != yaml_STR_TAG || isBase60Float(s)) {
    +		style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
    +	} else if strings.Contains(s, "\n") {
    +		style = yaml_LITERAL_SCALAR_STYLE
    +	} else {
    +		style = yaml_PLAIN_SCALAR_STYLE
    +	}
    +	e.emitScalar(s, "", tag, style)
    +}
    +
    +func (e *encoder) boolv(tag string, in reflect.Value) {
    +	var s string
    +	if in.Bool() {
    +		s = "true"
    +	} else {
    +		s = "false"
    +	}
    +	e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
    +}
    +
    +func (e *encoder) intv(tag string, in reflect.Value) {
    +	s := strconv.FormatInt(in.Int(), 10)
    +	e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
    +}
    +
    +func (e *encoder) uintv(tag string, in reflect.Value) {
    +	s := strconv.FormatUint(in.Uint(), 10)
    +	e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
    +}
    +
    +func (e *encoder) floatv(tag string, in reflect.Value) {
    +	// FIXME: Handle 64 bits here.
    +	s := strconv.FormatFloat(float64(in.Float()), 'g', -1, 32)
    +	switch s {
    +	case "+Inf":
    +		s = ".inf"
    +	case "-Inf":
    +		s = "-.inf"
    +	case "NaN":
    +		s = ".nan"
    +	}
    +	e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE)
    +}
    +
    +func (e *encoder) nilv() {
    +	e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE)
    +}
    +
    +func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t) {
    +	implicit := tag == ""
    +	e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style))
    +	e.emit()
    +}
    diff --git a/vendor/gopkg.in/yaml.v2/encode_test.go b/vendor/gopkg.in/yaml.v2/encode_test.go
    new file mode 100644
    index 0000000000..84099bd385
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/encode_test.go
    @@ -0,0 +1,501 @@
    +package yaml_test
    +
    +import (
    +	"fmt"
    +	"math"
    +	"strconv"
    +	"strings"
    +	"time"
    +
    +	. "gopkg.in/check.v1"
    +	"gopkg.in/yaml.v2"
    +	"net"
    +	"os"
    +)
    +
    +var marshalIntTest = 123
    +
    +var marshalTests = []struct {
    +	value interface{}
    +	data  string
    +}{
    +	{
    +		nil,
    +		"null\n",
    +	}, {
    +		&struct{}{},
    +		"{}\n",
    +	}, {
    +		map[string]string{"v": "hi"},
    +		"v: hi\n",
    +	}, {
    +		map[string]interface{}{"v": "hi"},
    +		"v: hi\n",
    +	}, {
    +		map[string]string{"v": "true"},
    +		"v: \"true\"\n",
    +	}, {
    +		map[string]string{"v": "false"},
    +		"v: \"false\"\n",
    +	}, {
    +		map[string]interface{}{"v": true},
    +		"v: true\n",
    +	}, {
    +		map[string]interface{}{"v": false},
    +		"v: false\n",
    +	}, {
    +		map[string]interface{}{"v": 10},
    +		"v: 10\n",
    +	}, {
    +		map[string]interface{}{"v": -10},
    +		"v: -10\n",
    +	}, {
    +		map[string]uint{"v": 42},
    +		"v: 42\n",
    +	}, {
    +		map[string]interface{}{"v": int64(4294967296)},
    +		"v: 4294967296\n",
    +	}, {
    +		map[string]int64{"v": int64(4294967296)},
    +		"v: 4294967296\n",
    +	}, {
    +		map[string]uint64{"v": 4294967296},
    +		"v: 4294967296\n",
    +	}, {
    +		map[string]interface{}{"v": "10"},
    +		"v: \"10\"\n",
    +	}, {
    +		map[string]interface{}{"v": 0.1},
    +		"v: 0.1\n",
    +	}, {
    +		map[string]interface{}{"v": float64(0.1)},
    +		"v: 0.1\n",
    +	}, {
    +		map[string]interface{}{"v": -0.1},
    +		"v: -0.1\n",
    +	}, {
    +		map[string]interface{}{"v": math.Inf(+1)},
    +		"v: .inf\n",
    +	}, {
    +		map[string]interface{}{"v": math.Inf(-1)},
    +		"v: -.inf\n",
    +	}, {
    +		map[string]interface{}{"v": math.NaN()},
    +		"v: .nan\n",
    +	}, {
    +		map[string]interface{}{"v": nil},
    +		"v: null\n",
    +	}, {
    +		map[string]interface{}{"v": ""},
    +		"v: \"\"\n",
    +	}, {
    +		map[string][]string{"v": []string{"A", "B"}},
    +		"v:\n- A\n- B\n",
    +	}, {
    +		map[string][]string{"v": []string{"A", "B\nC"}},
    +		"v:\n- A\n- |-\n  B\n  C\n",
    +	}, {
    +		map[string][]interface{}{"v": []interface{}{"A", 1, map[string][]int{"B": []int{2, 3}}}},
    +		"v:\n- A\n- 1\n- B:\n  - 2\n  - 3\n",
    +	}, {
    +		map[string]interface{}{"a": map[interface{}]interface{}{"b": "c"}},
    +		"a:\n  b: c\n",
    +	}, {
    +		map[string]interface{}{"a": "-"},
    +		"a: '-'\n",
    +	},
    +
    +	// Simple values.
    +	{
    +		&marshalIntTest,
    +		"123\n",
    +	},
    +
    +	// Structures
    +	{
    +		&struct{ Hello string }{"world"},
    +		"hello: world\n",
    +	}, {
    +		&struct {
    +			A struct {
    +				B string
    +			}
    +		}{struct{ B string }{"c"}},
    +		"a:\n  b: c\n",
    +	}, {
    +		&struct {
    +			A *struct {
    +				B string
    +			}
    +		}{&struct{ B string }{"c"}},
    +		"a:\n  b: c\n",
    +	}, {
    +		&struct {
    +			A *struct {
    +				B string
    +			}
    +		}{},
    +		"a: null\n",
    +	}, {
    +		&struct{ A int }{1},
    +		"a: 1\n",
    +	}, {
    +		&struct{ A []int }{[]int{1, 2}},
    +		"a:\n- 1\n- 2\n",
    +	}, {
    +		&struct {
    +			B int "a"
    +		}{1},
    +		"a: 1\n",
    +	}, {
    +		&struct{ A bool }{true},
    +		"a: true\n",
    +	},
    +
    +	// Conditional flag
    +	{
    +		&struct {
    +			A int "a,omitempty"
    +			B int "b,omitempty"
    +		}{1, 0},
    +		"a: 1\n",
    +	}, {
    +		&struct {
    +			A int "a,omitempty"
    +			B int "b,omitempty"
    +		}{0, 0},
    +		"{}\n",
    +	}, {
    +		&struct {
    +			A *struct{ X, y int } "a,omitempty,flow"
    +		}{&struct{ X, y int }{1, 2}},
    +		"a: {x: 1}\n",
    +	}, {
    +		&struct {
    +			A *struct{ X, y int } "a,omitempty,flow"
    +		}{nil},
    +		"{}\n",
    +	}, {
    +		&struct {
    +			A *struct{ X, y int } "a,omitempty,flow"
    +		}{&struct{ X, y int }{}},
    +		"a: {x: 0}\n",
    +	}, {
    +		&struct {
    +			A struct{ X, y int } "a,omitempty,flow"
    +		}{struct{ X, y int }{1, 2}},
    +		"a: {x: 1}\n",
    +	}, {
    +		&struct {
    +			A struct{ X, y int } "a,omitempty,flow"
    +		}{struct{ X, y int }{0, 1}},
    +		"{}\n",
    +	}, {
    +		&struct {
    +			A float64 "a,omitempty"
    +			B float64 "b,omitempty"
    +		}{1, 0},
    +		"a: 1\n",
    +	},
    +
    +	// Flow flag
    +	{
    +		&struct {
    +			A []int "a,flow"
    +		}{[]int{1, 2}},
    +		"a: [1, 2]\n",
    +	}, {
    +		&struct {
    +			A map[string]string "a,flow"
    +		}{map[string]string{"b": "c", "d": "e"}},
    +		"a: {b: c, d: e}\n",
    +	}, {
    +		&struct {
    +			A struct {
    +				B, D string
    +			} "a,flow"
    +		}{struct{ B, D string }{"c", "e"}},
    +		"a: {b: c, d: e}\n",
    +	},
    +
    +	// Unexported field
    +	{
    +		&struct {
    +			u int
    +			A int
    +		}{0, 1},
    +		"a: 1\n",
    +	},
    +
    +	// Ignored field
    +	{
    +		&struct {
    +			A int
    +			B int "-"
    +		}{1, 2},
    +		"a: 1\n",
    +	},
    +
    +	// Struct inlining
    +	{
    +		&struct {
    +			A int
    +			C inlineB `yaml:",inline"`
    +		}{1, inlineB{2, inlineC{3}}},
    +		"a: 1\nb: 2\nc: 3\n",
    +	},
    +
    +	// Map inlining
    +	{
    +		&struct {
    +			A int
    +			C map[string]int `yaml:",inline"`
    +		}{1, map[string]int{"b": 2, "c": 3}},
    +		"a: 1\nb: 2\nc: 3\n",
    +	},
    +
    +	// Duration
    +	{
    +		map[string]time.Duration{"a": 3 * time.Second},
    +		"a: 3s\n",
    +	},
    +
    +	// Issue #24: bug in map merging logic.
    +	{
    +		map[string]string{"a": ""},
    +		"a: \n",
    +	},
    +
    +	// Issue #34: marshal unsupported base 60 floats quoted for compatibility
    +	// with old YAML 1.1 parsers.
    +	{
    +		map[string]string{"a": "1:1"},
    +		"a: \"1:1\"\n",
    +	},
    +
    +	// Binary data.
    +	{
    +		map[string]string{"a": "\x00"},
    +		"a: \"\\0\"\n",
    +	}, {
    +		map[string]string{"a": "\x80\x81\x82"},
    +		"a: !!binary gIGC\n",
    +	}, {
    +		map[string]string{"a": strings.Repeat("\x90", 54)},
    +		"a: !!binary |\n  " + strings.Repeat("kJCQ", 17) + "kJ\n  CQ\n",
    +	},
    +
    +	// Ordered maps.
    +	{
    +		&yaml.MapSlice{{"b", 2}, {"a", 1}, {"d", 4}, {"c", 3}, {"sub", yaml.MapSlice{{"e", 5}}}},
    +		"b: 2\na: 1\nd: 4\nc: 3\nsub:\n  e: 5\n",
    +	},
    +
    +	// Encode unicode as utf-8 rather than in escaped form.
    +	{
    +		map[string]string{"a": "你好"},
    +		"a: 你好\n",
    +	},
    +
    +	// Support encoding.TextMarshaler.
    +	{
    +		map[string]net.IP{"a": net.IPv4(1, 2, 3, 4)},
    +		"a: 1.2.3.4\n",
    +	},
    +	{
    +		map[string]time.Time{"a": time.Unix(1424801979, 0)},
    +		"a: 2015-02-24T18:19:39Z\n",
    +	},
    +
    +	// Ensure strings containing ": " are quoted (reported as PR #43, but not reproducible).
    +	{
    +		map[string]string{"a": "b: c"},
    +		"a: 'b: c'\n",
    +	},
    +
    +	// Containing hash mark ('#') in string should be quoted
    +	{
    +		map[string]string{"a": "Hello #comment"},
    +		"a: 'Hello #comment'\n",
    +	},
    +	{
    +		map[string]string{"a": "你好 #comment"},
    +		"a: '你好 #comment'\n",
    +	},
    +}
    +
    +func (s *S) TestMarshal(c *C) {
    +	defer os.Setenv("TZ", os.Getenv("TZ"))
    +	os.Setenv("TZ", "UTC")
    +	for _, item := range marshalTests {
    +		data, err := yaml.Marshal(item.value)
    +		c.Assert(err, IsNil)
    +		c.Assert(string(data), Equals, item.data)
    +	}
    +}
    +
    +var marshalErrorTests = []struct {
    +	value interface{}
    +	error string
    +	panic string
    +}{{
    +	value: &struct {
    +		B       int
    +		inlineB ",inline"
    +	}{1, inlineB{2, inlineC{3}}},
    +	panic: `Duplicated key 'b' in struct struct \{ B int; .*`,
    +}, {
    +	value: &struct {
    +		A int
    +		B map[string]int ",inline"
    +	}{1, map[string]int{"a": 2}},
    +	panic: `Can't have key "a" in inlined map; conflicts with struct field`,
    +}}
    +
    +func (s *S) TestMarshalErrors(c *C) {
    +	for _, item := range marshalErrorTests {
    +		if item.panic != "" {
    +			c.Assert(func() { yaml.Marshal(item.value) }, PanicMatches, item.panic)
    +		} else {
    +			_, err := yaml.Marshal(item.value)
    +			c.Assert(err, ErrorMatches, item.error)
    +		}
    +	}
    +}
    +
    +func (s *S) TestMarshalTypeCache(c *C) {
    +	var data []byte
    +	var err error
    +	func() {
    +		type T struct{ A int }
    +		data, err = yaml.Marshal(&T{})
    +		c.Assert(err, IsNil)
    +	}()
    +	func() {
    +		type T struct{ B int }
    +		data, err = yaml.Marshal(&T{})
    +		c.Assert(err, IsNil)
    +	}()
    +	c.Assert(string(data), Equals, "b: 0\n")
    +}
    +
    +var marshalerTests = []struct {
    +	data  string
    +	value interface{}
    +}{
    +	{"_:\n  hi: there\n", map[interface{}]interface{}{"hi": "there"}},
    +	{"_:\n- 1\n- A\n", []interface{}{1, "A"}},
    +	{"_: 10\n", 10},
    +	{"_: null\n", nil},
    +	{"_: BAR!\n", "BAR!"},
    +}
    +
    +type marshalerType struct {
    +	value interface{}
    +}
    +
    +func (o marshalerType) MarshalText() ([]byte, error) {
    +	panic("MarshalText called on type with MarshalYAML")
    +}
    +
    +func (o marshalerType) MarshalYAML() (interface{}, error) {
    +	return o.value, nil
    +}
    +
    +type marshalerValue struct {
    +	Field marshalerType "_"
    +}
    +
    +func (s *S) TestMarshaler(c *C) {
    +	for _, item := range marshalerTests {
    +		obj := &marshalerValue{}
    +		obj.Field.value = item.value
    +		data, err := yaml.Marshal(obj)
    +		c.Assert(err, IsNil)
    +		c.Assert(string(data), Equals, string(item.data))
    +	}
    +}
    +
    +func (s *S) TestMarshalerWholeDocument(c *C) {
    +	obj := &marshalerType{}
    +	obj.value = map[string]string{"hello": "world!"}
    +	data, err := yaml.Marshal(obj)
    +	c.Assert(err, IsNil)
    +	c.Assert(string(data), Equals, "hello: world!\n")
    +}
    +
    +type failingMarshaler struct{}
    +
    +func (ft *failingMarshaler) MarshalYAML() (interface{}, error) {
    +	return nil, failingErr
    +}
    +
    +func (s *S) TestMarshalerError(c *C) {
    +	_, err := yaml.Marshal(&failingMarshaler{})
    +	c.Assert(err, Equals, failingErr)
    +}
    +
    +func (s *S) TestSortedOutput(c *C) {
    +	order := []interface{}{
    +		false,
    +		true,
    +		1,
    +		uint(1),
    +		1.0,
    +		1.1,
    +		1.2,
    +		2,
    +		uint(2),
    +		2.0,
    +		2.1,
    +		"",
    +		".1",
    +		".2",
    +		".a",
    +		"1",
    +		"2",
    +		"a!10",
    +		"a/2",
    +		"a/10",
    +		"a~10",
    +		"ab/1",
    +		"b/1",
    +		"b/01",
    +		"b/2",
    +		"b/02",
    +		"b/3",
    +		"b/03",
    +		"b1",
    +		"b01",
    +		"b3",
    +		"c2.10",
    +		"c10.2",
    +		"d1",
    +		"d12",
    +		"d12a",
    +	}
    +	m := make(map[interface{}]int)
    +	for _, k := range order {
    +		m[k] = 1
    +	}
    +	data, err := yaml.Marshal(m)
    +	c.Assert(err, IsNil)
    +	out := "\n" + string(data)
    +	last := 0
    +	for i, k := range order {
    +		repr := fmt.Sprint(k)
    +		if s, ok := k.(string); ok {
    +			if _, err = strconv.ParseFloat(repr, 32); s == "" || err == nil {
    +				repr = `"` + repr + `"`
    +			}
    +		}
    +		index := strings.Index(out, "\n"+repr+":")
    +		if index == -1 {
    +			c.Fatalf("%#v is not in the output: %#v", k, out)
    +		}
    +		if index < last {
    +			c.Fatalf("%#v was generated before %#v: %q", k, order[i-1], out)
    +		}
    +		last = index
    +	}
    +}
    diff --git a/vendor/gopkg.in/yaml.v2/parserc.go b/vendor/gopkg.in/yaml.v2/parserc.go
    new file mode 100644
    index 0000000000..0a7037ad1b
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/parserc.go
    @@ -0,0 +1,1096 @@
    +package yaml
    +
    +import (
    +	"bytes"
    +)
    +
    +// The parser implements the following grammar:
    +//
    +// stream               ::= STREAM-START implicit_document? explicit_document* STREAM-END
    +// implicit_document    ::= block_node DOCUMENT-END*
    +// explicit_document    ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
    +// block_node_or_indentless_sequence    ::=
    +//                          ALIAS
    +//                          | properties (block_content | indentless_block_sequence)?
    +//                          | block_content
    +//                          | indentless_block_sequence
    +// block_node           ::= ALIAS
    +//                          | properties block_content?
    +//                          | block_content
    +// flow_node            ::= ALIAS
    +//                          | properties flow_content?
    +//                          | flow_content
    +// properties           ::= TAG ANCHOR? | ANCHOR TAG?
    +// block_content        ::= block_collection | flow_collection | SCALAR
    +// flow_content         ::= flow_collection | SCALAR
    +// block_collection     ::= block_sequence | block_mapping
    +// flow_collection      ::= flow_sequence | flow_mapping
    +// block_sequence       ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
    +// indentless_sequence  ::= (BLOCK-ENTRY block_node?)+
    +// block_mapping        ::= BLOCK-MAPPING_START
    +//                          ((KEY block_node_or_indentless_sequence?)?
    +//                          (VALUE block_node_or_indentless_sequence?)?)*
    +//                          BLOCK-END
    +// flow_sequence        ::= FLOW-SEQUENCE-START
    +//                          (flow_sequence_entry FLOW-ENTRY)*
    +//                          flow_sequence_entry?
    +//                          FLOW-SEQUENCE-END
    +// flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?
    +// flow_mapping         ::= FLOW-MAPPING-START
    +//                          (flow_mapping_entry FLOW-ENTRY)*
    +//                          flow_mapping_entry?
    +//                          FLOW-MAPPING-END
    +// flow_mapping_entry   ::= flow_node | KEY flow_node? (VALUE flow_node?)?
    +
    +// Peek the next token in the token queue.
    +func peek_token(parser *yaml_parser_t) *yaml_token_t {
    +	if parser.token_available || yaml_parser_fetch_more_tokens(parser) {
    +		return &parser.tokens[parser.tokens_head]
    +	}
    +	return nil
    +}
    +
    +// Remove the next token from the queue (must be called after peek_token).
    +func skip_token(parser *yaml_parser_t) {
    +	parser.token_available = false
    +	parser.tokens_parsed++
    +	parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN
    +	parser.tokens_head++
    +}
    +
    +// Get the next event.
    +func yaml_parser_parse(parser *yaml_parser_t, event *yaml_event_t) bool {
    +	// Erase the event object.
    +	*event = yaml_event_t{}
    +
    +	// No events after the end of the stream or error.
    +	if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE {
    +		return true
    +	}
    +
    +	// Generate the next event.
    +	return yaml_parser_state_machine(parser, event)
    +}
    +
    +// Set parser error.
    +func yaml_parser_set_parser_error(parser *yaml_parser_t, problem string, problem_mark yaml_mark_t) bool {
    +	parser.error = yaml_PARSER_ERROR
    +	parser.problem = problem
    +	parser.problem_mark = problem_mark
    +	return false
    +}
    +
    +func yaml_parser_set_parser_error_context(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string, problem_mark yaml_mark_t) bool {
    +	parser.error = yaml_PARSER_ERROR
    +	parser.context = context
    +	parser.context_mark = context_mark
    +	parser.problem = problem
    +	parser.problem_mark = problem_mark
    +	return false
    +}
    +
    +// State dispatcher.
    +func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool {
    +	//trace("yaml_parser_state_machine", "state:", parser.state.String())
    +
    +	switch parser.state {
    +	case yaml_PARSE_STREAM_START_STATE:
    +		return yaml_parser_parse_stream_start(parser, event)
    +
    +	case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE:
    +		return yaml_parser_parse_document_start(parser, event, true)
    +
    +	case yaml_PARSE_DOCUMENT_START_STATE:
    +		return yaml_parser_parse_document_start(parser, event, false)
    +
    +	case yaml_PARSE_DOCUMENT_CONTENT_STATE:
    +		return yaml_parser_parse_document_content(parser, event)
    +
    +	case yaml_PARSE_DOCUMENT_END_STATE:
    +		return yaml_parser_parse_document_end(parser, event)
    +
    +	case yaml_PARSE_BLOCK_NODE_STATE:
    +		return yaml_parser_parse_node(parser, event, true, false)
    +
    +	case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
    +		return yaml_parser_parse_node(parser, event, true, true)
    +
    +	case yaml_PARSE_FLOW_NODE_STATE:
    +		return yaml_parser_parse_node(parser, event, false, false)
    +
    +	case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
    +		return yaml_parser_parse_block_sequence_entry(parser, event, true)
    +
    +	case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
    +		return yaml_parser_parse_block_sequence_entry(parser, event, false)
    +
    +	case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
    +		return yaml_parser_parse_indentless_sequence_entry(parser, event)
    +
    +	case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
    +		return yaml_parser_parse_block_mapping_key(parser, event, true)
    +
    +	case yaml_PARSE_BLOCK_MAPPING_KEY_STATE:
    +		return yaml_parser_parse_block_mapping_key(parser, event, false)
    +
    +	case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE:
    +		return yaml_parser_parse_block_mapping_value(parser, event)
    +
    +	case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
    +		return yaml_parser_parse_flow_sequence_entry(parser, event, true)
    +
    +	case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
    +		return yaml_parser_parse_flow_sequence_entry(parser, event, false)
    +
    +	case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
    +		return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event)
    +
    +	case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
    +		return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event)
    +
    +	case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
    +		return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event)
    +
    +	case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
    +		return yaml_parser_parse_flow_mapping_key(parser, event, true)
    +
    +	case yaml_PARSE_FLOW_MAPPING_KEY_STATE:
    +		return yaml_parser_parse_flow_mapping_key(parser, event, false)
    +
    +	case yaml_PARSE_FLOW_MAPPING_VALUE_STATE:
    +		return yaml_parser_parse_flow_mapping_value(parser, event, false)
    +
    +	case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
    +		return yaml_parser_parse_flow_mapping_value(parser, event, true)
    +
    +	default:
    +		panic("invalid parser state")
    +	}
    +	return false
    +}
    +
    +// Parse the production:
    +// stream   ::= STREAM-START implicit_document? explicit_document* STREAM-END
    +//              ************
    +func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool {
    +	token := peek_token(parser)
    +	if token == nil {
    +		return false
    +	}
    +	if token.typ != yaml_STREAM_START_TOKEN {
    +		return yaml_parser_set_parser_error(parser, "did not find expected ", token.start_mark)
    +	}
    +	parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE
    +	*event = yaml_event_t{
    +		typ:        yaml_STREAM_START_EVENT,
    +		start_mark: token.start_mark,
    +		end_mark:   token.end_mark,
    +		encoding:   token.encoding,
    +	}
    +	skip_token(parser)
    +	return true
    +}
    +
    +// Parse the productions:
    +// implicit_document    ::= block_node DOCUMENT-END*
    +//                          *
    +// explicit_document    ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
    +//                          *************************
    +func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool {
    +
    +	token := peek_token(parser)
    +	if token == nil {
    +		return false
    +	}
    +
    +	// Parse extra document end indicators.
    +	if !implicit {
    +		for token.typ == yaml_DOCUMENT_END_TOKEN {
    +			skip_token(parser)
    +			token = peek_token(parser)
    +			if token == nil {
    +				return false
    +			}
    +		}
    +	}
    +
    +	if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN &&
    +		token.typ != yaml_TAG_DIRECTIVE_TOKEN &&
    +		token.typ != yaml_DOCUMENT_START_TOKEN &&
    +		token.typ != yaml_STREAM_END_TOKEN {
    +		// Parse an implicit document.
    +		if !yaml_parser_process_directives(parser, nil, nil) {
    +			return false
    +		}
    +		parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE)
    +		parser.state = yaml_PARSE_BLOCK_NODE_STATE
    +
    +		*event = yaml_event_t{
    +			typ:        yaml_DOCUMENT_START_EVENT,
    +			start_mark: token.start_mark,
    +			end_mark:   token.end_mark,
    +		}
    +
    +	} else if token.typ != yaml_STREAM_END_TOKEN {
    +		// Parse an explicit document.
    +		var version_directive *yaml_version_directive_t
    +		var tag_directives []yaml_tag_directive_t
    +		start_mark := token.start_mark
    +		if !yaml_parser_process_directives(parser, &version_directive, &tag_directives) {
    +			return false
    +		}
    +		token = peek_token(parser)
    +		if token == nil {
    +			return false
    +		}
    +		if token.typ != yaml_DOCUMENT_START_TOKEN {
    +			yaml_parser_set_parser_error(parser,
    +				"did not find expected ", token.start_mark)
    +			return false
    +		}
    +		parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE)
    +		parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE
    +		end_mark := token.end_mark
    +
    +		*event = yaml_event_t{
    +			typ:               yaml_DOCUMENT_START_EVENT,
    +			start_mark:        start_mark,
    +			end_mark:          end_mark,
    +			version_directive: version_directive,
    +			tag_directives:    tag_directives,
    +			implicit:          false,
    +		}
    +		skip_token(parser)
    +
    +	} else {
    +		// Parse the stream end.
    +		parser.state = yaml_PARSE_END_STATE
    +		*event = yaml_event_t{
    +			typ:        yaml_STREAM_END_EVENT,
    +			start_mark: token.start_mark,
    +			end_mark:   token.end_mark,
    +		}
    +		skip_token(parser)
    +	}
    +
    +	return true
    +}
    +
    +// Parse the productions:
    +// explicit_document    ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
    +//                                                    ***********
    +//
    +func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool {
    +	token := peek_token(parser)
    +	if token == nil {
    +		return false
    +	}
    +	if token.typ == yaml_VERSION_DIRECTIVE_TOKEN ||
    +		token.typ == yaml_TAG_DIRECTIVE_TOKEN ||
    +		token.typ == yaml_DOCUMENT_START_TOKEN ||
    +		token.typ == yaml_DOCUMENT_END_TOKEN ||
    +		token.typ == yaml_STREAM_END_TOKEN {
    +		parser.state = parser.states[len(parser.states)-1]
    +		parser.states = parser.states[:len(parser.states)-1]
    +		return yaml_parser_process_empty_scalar(parser, event,
    +			token.start_mark)
    +	}
    +	return yaml_parser_parse_node(parser, event, true, false)
    +}
    +
    +// Parse the productions:
    +// implicit_document    ::= block_node DOCUMENT-END*
    +//                                     *************
    +// explicit_document    ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
    +//
    +func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool {
    +	token := peek_token(parser)
    +	if token == nil {
    +		return false
    +	}
    +
    +	start_mark := token.start_mark
    +	end_mark := token.start_mark
    +
    +	implicit := true
    +	if token.typ == yaml_DOCUMENT_END_TOKEN {
    +		end_mark = token.end_mark
    +		skip_token(parser)
    +		implicit = false
    +	}
    +
    +	parser.tag_directives = parser.tag_directives[:0]
    +
    +	parser.state = yaml_PARSE_DOCUMENT_START_STATE
    +	*event = yaml_event_t{
    +		typ:        yaml_DOCUMENT_END_EVENT,
    +		start_mark: start_mark,
    +		end_mark:   end_mark,
    +		implicit:   implicit,
    +	}
    +	return true
    +}
    +
    +// Parse the productions:
    +// block_node_or_indentless_sequence    ::=
    +//                          ALIAS
    +//                          *****
    +//                          | properties (block_content | indentless_block_sequence)?
    +//                            **********  *
    +//                          | block_content | indentless_block_sequence
    +//                            *
    +// block_node           ::= ALIAS
    +//                          *****
    +//                          | properties block_content?
    +//                            ********** *
    +//                          | block_content
    +//                            *
    +// flow_node            ::= ALIAS
    +//                          *****
    +//                          | properties flow_content?
    +//                            ********** *
    +//                          | flow_content
    +//                            *
    +// properties           ::= TAG ANCHOR? | ANCHOR TAG?
    +//                          *************************
    +// block_content        ::= block_collection | flow_collection | SCALAR
    +//                                                               ******
    +// flow_content         ::= flow_collection | SCALAR
    +//                                            ******
    +func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool {
    +	//defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)()
    +
    +	token := peek_token(parser)
    +	if token == nil {
    +		return false
    +	}
    +
    +	if token.typ == yaml_ALIAS_TOKEN {
    +		parser.state = parser.states[len(parser.states)-1]
    +		parser.states = parser.states[:len(parser.states)-1]
    +		*event = yaml_event_t{
    +			typ:        yaml_ALIAS_EVENT,
    +			start_mark: token.start_mark,
    +			end_mark:   token.end_mark,
    +			anchor:     token.value,
    +		}
    +		skip_token(parser)
    +		return true
    +	}
    +
    +	start_mark := token.start_mark
    +	end_mark := token.start_mark
    +
    +	var tag_token bool
    +	var tag_handle, tag_suffix, anchor []byte
    +	var tag_mark yaml_mark_t
    +	if token.typ == yaml_ANCHOR_TOKEN {
    +		anchor = token.value
    +		start_mark = token.start_mark
    +		end_mark = token.end_mark
    +		skip_token(parser)
    +		token = peek_token(parser)
    +		if token == nil {
    +			return false
    +		}
    +		if token.typ == yaml_TAG_TOKEN {
    +			tag_token = true
    +			tag_handle = token.value
    +			tag_suffix = token.suffix
    +			tag_mark = token.start_mark
    +			end_mark = token.end_mark
    +			skip_token(parser)
    +			token = peek_token(parser)
    +			if token == nil {
    +				return false
    +			}
    +		}
    +	} else if token.typ == yaml_TAG_TOKEN {
    +		tag_token = true
    +		tag_handle = token.value
    +		tag_suffix = token.suffix
    +		start_mark = token.start_mark
    +		tag_mark = token.start_mark
    +		end_mark = token.end_mark
    +		skip_token(parser)
    +		token = peek_token(parser)
    +		if token == nil {
    +			return false
    +		}
    +		if token.typ == yaml_ANCHOR_TOKEN {
    +			anchor = token.value
    +			end_mark = token.end_mark
    +			skip_token(parser)
    +			token = peek_token(parser)
    +			if token == nil {
    +				return false
    +			}
    +		}
    +	}
    +
    +	var tag []byte
    +	if tag_token {
    +		if len(tag_handle) == 0 {
    +			tag = tag_suffix
    +			tag_suffix = nil
    +		} else {
    +			for i := range parser.tag_directives {
    +				if bytes.Equal(parser.tag_directives[i].handle, tag_handle) {
    +					tag = append([]byte(nil), parser.tag_directives[i].prefix...)
    +					tag = append(tag, tag_suffix...)
    +					break
    +				}
    +			}
    +			if len(tag) == 0 {
    +				yaml_parser_set_parser_error_context(parser,
    +					"while parsing a node", start_mark,
    +					"found undefined tag handle", tag_mark)
    +				return false
    +			}
    +		}
    +	}
    +
    +	implicit := len(tag) == 0
    +	if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN {
    +		end_mark = token.end_mark
    +		parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE
    +		*event = yaml_event_t{
    +			typ:        yaml_SEQUENCE_START_EVENT,
    +			start_mark: start_mark,
    +			end_mark:   end_mark,
    +			anchor:     anchor,
    +			tag:        tag,
    +			implicit:   implicit,
    +			style:      yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE),
    +		}
    +		return true
    +	}
    +	if token.typ == yaml_SCALAR_TOKEN {
    +		var plain_implicit, quoted_implicit bool
    +		end_mark = token.end_mark
    +		if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') {
    +			plain_implicit = true
    +		} else if len(tag) == 0 {
    +			quoted_implicit = true
    +		}
    +		parser.state = parser.states[len(parser.states)-1]
    +		parser.states = parser.states[:len(parser.states)-1]
    +
    +		*event = yaml_event_t{
    +			typ:             yaml_SCALAR_EVENT,
    +			start_mark:      start_mark,
    +			end_mark:        end_mark,
    +			anchor:          anchor,
    +			tag:             tag,
    +			value:           token.value,
    +			implicit:        plain_implicit,
    +			quoted_implicit: quoted_implicit,
    +			style:           yaml_style_t(token.style),
    +		}
    +		skip_token(parser)
    +		return true
    +	}
    +	if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN {
    +		// [Go] Some of the events below can be merged as they differ only on style.
    +		end_mark = token.end_mark
    +		parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE
    +		*event = yaml_event_t{
    +			typ:        yaml_SEQUENCE_START_EVENT,
    +			start_mark: start_mark,
    +			end_mark:   end_mark,
    +			anchor:     anchor,
    +			tag:        tag,
    +			implicit:   implicit,
    +			style:      yaml_style_t(yaml_FLOW_SEQUENCE_STYLE),
    +		}
    +		return true
    +	}
    +	if token.typ == yaml_FLOW_MAPPING_START_TOKEN {
    +		end_mark = token.end_mark
    +		parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE
    +		*event = yaml_event_t{
    +			typ:        yaml_MAPPING_START_EVENT,
    +			start_mark: start_mark,
    +			end_mark:   end_mark,
    +			anchor:     anchor,
    +			tag:        tag,
    +			implicit:   implicit,
    +			style:      yaml_style_t(yaml_FLOW_MAPPING_STYLE),
    +		}
    +		return true
    +	}
    +	if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN {
    +		end_mark = token.end_mark
    +		parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE
    +		*event = yaml_event_t{
    +			typ:        yaml_SEQUENCE_START_EVENT,
    +			start_mark: start_mark,
    +			end_mark:   end_mark,
    +			anchor:     anchor,
    +			tag:        tag,
    +			implicit:   implicit,
    +			style:      yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE),
    +		}
    +		return true
    +	}
    +	if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN {
    +		end_mark = token.end_mark
    +		parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE
    +		*event = yaml_event_t{
    +			typ:        yaml_MAPPING_START_EVENT,
    +			start_mark: start_mark,
    +			end_mark:   end_mark,
    +			anchor:     anchor,
    +			tag:        tag,
    +			implicit:   implicit,
    +			style:      yaml_style_t(yaml_BLOCK_MAPPING_STYLE),
    +		}
    +		return true
    +	}
    +	if len(anchor) > 0 || len(tag) > 0 {
    +		parser.state = parser.states[len(parser.states)-1]
    +		parser.states = parser.states[:len(parser.states)-1]
    +
    +		*event = yaml_event_t{
    +			typ:             yaml_SCALAR_EVENT,
    +			start_mark:      start_mark,
    +			end_mark:        end_mark,
    +			anchor:          anchor,
    +			tag:             tag,
    +			implicit:        implicit,
    +			quoted_implicit: false,
    +			style:           yaml_style_t(yaml_PLAIN_SCALAR_STYLE),
    +		}
    +		return true
    +	}
    +
    +	context := "while parsing a flow node"
    +	if block {
    +		context = "while parsing a block node"
    +	}
    +	yaml_parser_set_parser_error_context(parser, context, start_mark,
    +		"did not find expected node content", token.start_mark)
    +	return false
    +}
    +
    +// Parse the productions:
    +// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
    +//                    ********************  *********** *             *********
    +//
    +func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
    +	if first {
    +		token := peek_token(parser)
    +		parser.marks = append(parser.marks, token.start_mark)
    +		skip_token(parser)
    +	}
    +
    +	token := peek_token(parser)
    +	if token == nil {
    +		return false
    +	}
    +
    +	if token.typ == yaml_BLOCK_ENTRY_TOKEN {
    +		mark := token.end_mark
    +		skip_token(parser)
    +		token = peek_token(parser)
    +		if token == nil {
    +			return false
    +		}
    +		if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN {
    +			parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE)
    +			return yaml_parser_parse_node(parser, event, true, false)
    +		} else {
    +			parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE
    +			return yaml_parser_process_empty_scalar(parser, event, mark)
    +		}
    +	}
    +	if token.typ == yaml_BLOCK_END_TOKEN {
    +		parser.state = parser.states[len(parser.states)-1]
    +		parser.states = parser.states[:len(parser.states)-1]
    +		parser.marks = parser.marks[:len(parser.marks)-1]
    +
    +		*event = yaml_event_t{
    +			typ:        yaml_SEQUENCE_END_EVENT,
    +			start_mark: token.start_mark,
    +			end_mark:   token.end_mark,
    +		}
    +
    +		skip_token(parser)
    +		return true
    +	}
    +
    +	context_mark := parser.marks[len(parser.marks)-1]
    +	parser.marks = parser.marks[:len(parser.marks)-1]
    +	return yaml_parser_set_parser_error_context(parser,
    +		"while parsing a block collection", context_mark,
    +		"did not find expected '-' indicator", token.start_mark)
    +}
    +
    +// Parse the productions:
    +// indentless_sequence  ::= (BLOCK-ENTRY block_node?)+
    +//                           *********** *
    +func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool {
    +	token := peek_token(parser)
    +	if token == nil {
    +		return false
    +	}
    +
    +	if token.typ == yaml_BLOCK_ENTRY_TOKEN {
    +		mark := token.end_mark
    +		skip_token(parser)
    +		token = peek_token(parser)
    +		if token == nil {
    +			return false
    +		}
    +		if token.typ != yaml_BLOCK_ENTRY_TOKEN &&
    +			token.typ != yaml_KEY_TOKEN &&
    +			token.typ != yaml_VALUE_TOKEN &&
    +			token.typ != yaml_BLOCK_END_TOKEN {
    +			parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE)
    +			return yaml_parser_parse_node(parser, event, true, false)
    +		}
    +		parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE
    +		return yaml_parser_process_empty_scalar(parser, event, mark)
    +	}
    +	parser.state = parser.states[len(parser.states)-1]
    +	parser.states = parser.states[:len(parser.states)-1]
    +
    +	*event = yaml_event_t{
    +		typ:        yaml_SEQUENCE_END_EVENT,
    +		start_mark: token.start_mark,
    +		end_mark:   token.start_mark, // [Go] Shouldn't this be token.end_mark?
    +	}
    +	return true
    +}
    +
    +// Parse the productions:
    +// block_mapping        ::= BLOCK-MAPPING_START
    +//                          *******************
    +//                          ((KEY block_node_or_indentless_sequence?)?
    +//                            *** *
    +//                          (VALUE block_node_or_indentless_sequence?)?)*
    +//
    +//                          BLOCK-END
    +//                          *********
    +//
    +func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
    +	if first {
    +		token := peek_token(parser)
    +		parser.marks = append(parser.marks, token.start_mark)
    +		skip_token(parser)
    +	}
    +
    +	token := peek_token(parser)
    +	if token == nil {
    +		return false
    +	}
    +
    +	if token.typ == yaml_KEY_TOKEN {
    +		mark := token.end_mark
    +		skip_token(parser)
    +		token = peek_token(parser)
    +		if token == nil {
    +			return false
    +		}
    +		if token.typ != yaml_KEY_TOKEN &&
    +			token.typ != yaml_VALUE_TOKEN &&
    +			token.typ != yaml_BLOCK_END_TOKEN {
    +			parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE)
    +			return yaml_parser_parse_node(parser, event, true, true)
    +		} else {
    +			parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE
    +			return yaml_parser_process_empty_scalar(parser, event, mark)
    +		}
    +	} else if token.typ == yaml_BLOCK_END_TOKEN {
    +		parser.state = parser.states[len(parser.states)-1]
    +		parser.states = parser.states[:len(parser.states)-1]
    +		parser.marks = parser.marks[:len(parser.marks)-1]
    +		*event = yaml_event_t{
    +			typ:        yaml_MAPPING_END_EVENT,
    +			start_mark: token.start_mark,
    +			end_mark:   token.end_mark,
    +		}
    +		skip_token(parser)
    +		return true
    +	}
    +
    +	context_mark := parser.marks[len(parser.marks)-1]
    +	parser.marks = parser.marks[:len(parser.marks)-1]
    +	return yaml_parser_set_parser_error_context(parser,
    +		"while parsing a block mapping", context_mark,
    +		"did not find expected key", token.start_mark)
    +}
    +
    +// Parse the productions:
    +// block_mapping        ::= BLOCK-MAPPING_START
    +//
    +//                          ((KEY block_node_or_indentless_sequence?)?
    +//
    +//                          (VALUE block_node_or_indentless_sequence?)?)*
    +//                           ***** *
    +//                          BLOCK-END
    +//
    +//
    +func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool {
    +	token := peek_token(parser)
    +	if token == nil {
    +		return false
    +	}
    +	if token.typ == yaml_VALUE_TOKEN {
    +		mark := token.end_mark
    +		skip_token(parser)
    +		token = peek_token(parser)
    +		if token == nil {
    +			return false
    +		}
    +		if token.typ != yaml_KEY_TOKEN &&
    +			token.typ != yaml_VALUE_TOKEN &&
    +			token.typ != yaml_BLOCK_END_TOKEN {
    +			parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE)
    +			return yaml_parser_parse_node(parser, event, true, true)
    +		}
    +		parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE
    +		return yaml_parser_process_empty_scalar(parser, event, mark)
    +	}
    +	parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE
    +	return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
    +}
    +
    +// Parse the productions:
    +// flow_sequence        ::= FLOW-SEQUENCE-START
    +//                          *******************
    +//                          (flow_sequence_entry FLOW-ENTRY)*
    +//                           *                   **********
    +//                          flow_sequence_entry?
    +//                          *
    +//                          FLOW-SEQUENCE-END
    +//                          *****************
    +// flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?
    +//                          *
    +//
    +func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
    +	if first {
    +		token := peek_token(parser)
    +		parser.marks = append(parser.marks, token.start_mark)
    +		skip_token(parser)
    +	}
    +	token := peek_token(parser)
    +	if token == nil {
    +		return false
    +	}
    +	if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
    +		if !first {
    +			if token.typ == yaml_FLOW_ENTRY_TOKEN {
    +				skip_token(parser)
    +				token = peek_token(parser)
    +				if token == nil {
    +					return false
    +				}
    +			} else {
    +				context_mark := parser.marks[len(parser.marks)-1]
    +				parser.marks = parser.marks[:len(parser.marks)-1]
    +				return yaml_parser_set_parser_error_context(parser,
    +					"while parsing a flow sequence", context_mark,
    +					"did not find expected ',' or ']'", token.start_mark)
    +			}
    +		}
    +
    +		if token.typ == yaml_KEY_TOKEN {
    +			parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE
    +			*event = yaml_event_t{
    +				typ:        yaml_MAPPING_START_EVENT,
    +				start_mark: token.start_mark,
    +				end_mark:   token.end_mark,
    +				implicit:   true,
    +				style:      yaml_style_t(yaml_FLOW_MAPPING_STYLE),
    +			}
    +			skip_token(parser)
    +			return true
    +		} else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
    +			parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE)
    +			return yaml_parser_parse_node(parser, event, false, false)
    +		}
    +	}
    +
    +	parser.state = parser.states[len(parser.states)-1]
    +	parser.states = parser.states[:len(parser.states)-1]
    +	parser.marks = parser.marks[:len(parser.marks)-1]
    +
    +	*event = yaml_event_t{
    +		typ:        yaml_SEQUENCE_END_EVENT,
    +		start_mark: token.start_mark,
    +		end_mark:   token.end_mark,
    +	}
    +
    +	skip_token(parser)
    +	return true
    +}
    +
    +//
    +// Parse the productions:
    +// flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?
    +//                                      *** *
    +//
    +func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool {
    +	token := peek_token(parser)
    +	if token == nil {
    +		return false
    +	}
    +	if token.typ != yaml_VALUE_TOKEN &&
    +		token.typ != yaml_FLOW_ENTRY_TOKEN &&
    +		token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
    +		parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE)
    +		return yaml_parser_parse_node(parser, event, false, false)
    +	}
    +	mark := token.end_mark
    +	skip_token(parser)
    +	parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE
    +	return yaml_parser_process_empty_scalar(parser, event, mark)
    +}
    +
    +// Parse the productions:
    +// flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?
    +//                                                      ***** *
    +//
    +func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool {
    +	token := peek_token(parser)
    +	if token == nil {
    +		return false
    +	}
    +	if token.typ == yaml_VALUE_TOKEN {
    +		skip_token(parser)
    +		token := peek_token(parser)
    +		if token == nil {
    +			return false
    +		}
    +		if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN {
    +			parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE)
    +			return yaml_parser_parse_node(parser, event, false, false)
    +		}
    +	}
    +	parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE
    +	return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
    +}
    +
    +// Parse the productions:
    +// flow_sequence_entry  ::= flow_node | KEY flow_node? (VALUE flow_node?)?
    +//                                                                      *
    +//
    +func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool {
    +	token := peek_token(parser)
    +	if token == nil {
    +		return false
    +	}
    +	parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE
    +	*event = yaml_event_t{
    +		typ:        yaml_MAPPING_END_EVENT,
    +		start_mark: token.start_mark,
    +		end_mark:   token.start_mark, // [Go] Shouldn't this be end_mark?
    +	}
    +	return true
    +}
    +
    +// Parse the productions:
    +// flow_mapping         ::= FLOW-MAPPING-START
    +//                          ******************
    +//                          (flow_mapping_entry FLOW-ENTRY)*
    +//                           *                  **********
    +//                          flow_mapping_entry?
    +//                          ******************
    +//                          FLOW-MAPPING-END
    +//                          ****************
    +// flow_mapping_entry   ::= flow_node | KEY flow_node? (VALUE flow_node?)?
    +//                          *           *** *
    +//
    +func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool {
    +	if first {
    +		token := peek_token(parser)
    +		parser.marks = append(parser.marks, token.start_mark)
    +		skip_token(parser)
    +	}
    +
    +	token := peek_token(parser)
    +	if token == nil {
    +		return false
    +	}
    +
    +	if token.typ != yaml_FLOW_MAPPING_END_TOKEN {
    +		if !first {
    +			if token.typ == yaml_FLOW_ENTRY_TOKEN {
    +				skip_token(parser)
    +				token = peek_token(parser)
    +				if token == nil {
    +					return false
    +				}
    +			} else {
    +				context_mark := parser.marks[len(parser.marks)-1]
    +				parser.marks = parser.marks[:len(parser.marks)-1]
    +				return yaml_parser_set_parser_error_context(parser,
    +					"while parsing a flow mapping", context_mark,
    +					"did not find expected ',' or '}'", token.start_mark)
    +			}
    +		}
    +
    +		if token.typ == yaml_KEY_TOKEN {
    +			skip_token(parser)
    +			token = peek_token(parser)
    +			if token == nil {
    +				return false
    +			}
    +			if token.typ != yaml_VALUE_TOKEN &&
    +				token.typ != yaml_FLOW_ENTRY_TOKEN &&
    +				token.typ != yaml_FLOW_MAPPING_END_TOKEN {
    +				parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE)
    +				return yaml_parser_parse_node(parser, event, false, false)
    +			} else {
    +				parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE
    +				return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
    +			}
    +		} else if token.typ != yaml_FLOW_MAPPING_END_TOKEN {
    +			parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE)
    +			return yaml_parser_parse_node(parser, event, false, false)
    +		}
    +	}
    +
    +	parser.state = parser.states[len(parser.states)-1]
    +	parser.states = parser.states[:len(parser.states)-1]
    +	parser.marks = parser.marks[:len(parser.marks)-1]
    +	*event = yaml_event_t{
    +		typ:        yaml_MAPPING_END_EVENT,
    +		start_mark: token.start_mark,
    +		end_mark:   token.end_mark,
    +	}
    +	skip_token(parser)
    +	return true
    +}
    +
    +// Parse the productions:
    +// flow_mapping_entry   ::= flow_node | KEY flow_node? (VALUE flow_node?)?
    +//                                   *                  ***** *
    +//
    +func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool {
    +	token := peek_token(parser)
    +	if token == nil {
    +		return false
    +	}
    +	if empty {
    +		parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE
    +		return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
    +	}
    +	if token.typ == yaml_VALUE_TOKEN {
    +		skip_token(parser)
    +		token = peek_token(parser)
    +		if token == nil {
    +			return false
    +		}
    +		if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN {
    +			parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE)
    +			return yaml_parser_parse_node(parser, event, false, false)
    +		}
    +	}
    +	parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE
    +	return yaml_parser_process_empty_scalar(parser, event, token.start_mark)
    +}
    +
    +// Generate an empty scalar event.
    +func yaml_parser_process_empty_scalar(parser *yaml_parser_t, event *yaml_event_t, mark yaml_mark_t) bool {
    +	*event = yaml_event_t{
    +		typ:        yaml_SCALAR_EVENT,
    +		start_mark: mark,
    +		end_mark:   mark,
    +		value:      nil, // Empty
    +		implicit:   true,
    +		style:      yaml_style_t(yaml_PLAIN_SCALAR_STYLE),
    +	}
    +	return true
    +}
    +
    +var default_tag_directives = []yaml_tag_directive_t{
    +	{[]byte("!"), []byte("!")},
    +	{[]byte("!!"), []byte("tag:yaml.org,2002:")},
    +}
    +
    +// Parse directives.
    +func yaml_parser_process_directives(parser *yaml_parser_t,
    +	version_directive_ref **yaml_version_directive_t,
    +	tag_directives_ref *[]yaml_tag_directive_t) bool {
    +
    +	var version_directive *yaml_version_directive_t
    +	var tag_directives []yaml_tag_directive_t
    +
    +	token := peek_token(parser)
    +	if token == nil {
    +		return false
    +	}
    +
    +	for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN {
    +		if token.typ == yaml_VERSION_DIRECTIVE_TOKEN {
    +			if version_directive != nil {
    +				yaml_parser_set_parser_error(parser,
    +					"found duplicate %YAML directive", token.start_mark)
    +				return false
    +			}
    +			if token.major != 1 || token.minor != 1 {
    +				yaml_parser_set_parser_error(parser,
    +					"found incompatible YAML document", token.start_mark)
    +				return false
    +			}
    +			version_directive = &yaml_version_directive_t{
    +				major: token.major,
    +				minor: token.minor,
    +			}
    +		} else if token.typ == yaml_TAG_DIRECTIVE_TOKEN {
    +			value := yaml_tag_directive_t{
    +				handle: token.value,
    +				prefix: token.prefix,
    +			}
    +			if !yaml_parser_append_tag_directive(parser, value, false, token.start_mark) {
    +				return false
    +			}
    +			tag_directives = append(tag_directives, value)
    +		}
    +
    +		skip_token(parser)
    +		token = peek_token(parser)
    +		if token == nil {
    +			return false
    +		}
    +	}
    +
    +	for i := range default_tag_directives {
    +		if !yaml_parser_append_tag_directive(parser, default_tag_directives[i], true, token.start_mark) {
    +			return false
    +		}
    +	}
    +
    +	if version_directive_ref != nil {
    +		*version_directive_ref = version_directive
    +	}
    +	if tag_directives_ref != nil {
    +		*tag_directives_ref = tag_directives
    +	}
    +	return true
    +}
    +
    +// Append a tag directive to the directives stack.
    +func yaml_parser_append_tag_directive(parser *yaml_parser_t, value yaml_tag_directive_t, allow_duplicates bool, mark yaml_mark_t) bool {
    +	for i := range parser.tag_directives {
    +		if bytes.Equal(value.handle, parser.tag_directives[i].handle) {
    +			if allow_duplicates {
    +				return true
    +			}
    +			return yaml_parser_set_parser_error(parser, "found duplicate %TAG directive", mark)
    +		}
    +	}
    +
    +	// [Go] I suspect the copy is unnecessary. This was likely done
    +	// because there was no way to track ownership of the data.
    +	value_copy := yaml_tag_directive_t{
    +		handle: make([]byte, len(value.handle)),
    +		prefix: make([]byte, len(value.prefix)),
    +	}
    +	copy(value_copy.handle, value.handle)
    +	copy(value_copy.prefix, value.prefix)
    +	parser.tag_directives = append(parser.tag_directives, value_copy)
    +	return true
    +}
    diff --git a/vendor/gopkg.in/yaml.v2/readerc.go b/vendor/gopkg.in/yaml.v2/readerc.go
    new file mode 100644
    index 0000000000..f450791717
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/readerc.go
    @@ -0,0 +1,394 @@
    +package yaml
    +
    +import (
    +	"io"
    +)
    +
    +// Set the reader error and return 0.
    +func yaml_parser_set_reader_error(parser *yaml_parser_t, problem string, offset int, value int) bool {
    +	parser.error = yaml_READER_ERROR
    +	parser.problem = problem
    +	parser.problem_offset = offset
    +	parser.problem_value = value
    +	return false
    +}
    +
    +// Byte order marks.
    +const (
    +	bom_UTF8    = "\xef\xbb\xbf"
    +	bom_UTF16LE = "\xff\xfe"
    +	bom_UTF16BE = "\xfe\xff"
    +)
    +
    +// Determine the input stream encoding by checking the BOM symbol. If no BOM is
    +// found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure.
    +func yaml_parser_determine_encoding(parser *yaml_parser_t) bool {
    +	// Ensure that we had enough bytes in the raw buffer.
    +	for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 {
    +		if !yaml_parser_update_raw_buffer(parser) {
    +			return false
    +		}
    +	}
    +
    +	// Determine the encoding.
    +	buf := parser.raw_buffer
    +	pos := parser.raw_buffer_pos
    +	avail := len(buf) - pos
    +	if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] {
    +		parser.encoding = yaml_UTF16LE_ENCODING
    +		parser.raw_buffer_pos += 2
    +		parser.offset += 2
    +	} else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] {
    +		parser.encoding = yaml_UTF16BE_ENCODING
    +		parser.raw_buffer_pos += 2
    +		parser.offset += 2
    +	} else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] {
    +		parser.encoding = yaml_UTF8_ENCODING
    +		parser.raw_buffer_pos += 3
    +		parser.offset += 3
    +	} else {
    +		parser.encoding = yaml_UTF8_ENCODING
    +	}
    +	return true
    +}
    +
    +// Update the raw buffer.
    +func yaml_parser_update_raw_buffer(parser *yaml_parser_t) bool {
    +	size_read := 0
    +
    +	// Return if the raw buffer is full.
    +	if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) {
    +		return true
    +	}
    +
    +	// Return on EOF.
    +	if parser.eof {
    +		return true
    +	}
    +
    +	// Move the remaining bytes in the raw buffer to the beginning.
    +	if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) {
    +		copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:])
    +	}
    +	parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos]
    +	parser.raw_buffer_pos = 0
    +
    +	// Call the read handler to fill the buffer.
    +	size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)])
    +	parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read]
    +	if err == io.EOF {
    +		parser.eof = true
    +	} else if err != nil {
    +		return yaml_parser_set_reader_error(parser, "input error: "+err.Error(), parser.offset, -1)
    +	}
    +	return true
    +}
    +
    +// Ensure that the buffer contains at least `length` characters.
    +// Return true on success, false on failure.
    +//
    +// The length is supposed to be significantly less that the buffer size.
    +func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool {
    +	if parser.read_handler == nil {
    +		panic("read handler must be set")
    +	}
    +
    +	// If the EOF flag is set and the raw buffer is empty, do nothing.
    +	if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) {
    +		return true
    +	}
    +
    +	// Return if the buffer contains enough characters.
    +	if parser.unread >= length {
    +		return true
    +	}
    +
    +	// Determine the input encoding if it is not known yet.
    +	if parser.encoding == yaml_ANY_ENCODING {
    +		if !yaml_parser_determine_encoding(parser) {
    +			return false
    +		}
    +	}
    +
    +	// Move the unread characters to the beginning of the buffer.
    +	buffer_len := len(parser.buffer)
    +	if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len {
    +		copy(parser.buffer, parser.buffer[parser.buffer_pos:])
    +		buffer_len -= parser.buffer_pos
    +		parser.buffer_pos = 0
    +	} else if parser.buffer_pos == buffer_len {
    +		buffer_len = 0
    +		parser.buffer_pos = 0
    +	}
    +
    +	// Open the whole buffer for writing, and cut it before returning.
    +	parser.buffer = parser.buffer[:cap(parser.buffer)]
    +
    +	// Fill the buffer until it has enough characters.
    +	first := true
    +	for parser.unread < length {
    +
    +		// Fill the raw buffer if necessary.
    +		if !first || parser.raw_buffer_pos == len(parser.raw_buffer) {
    +			if !yaml_parser_update_raw_buffer(parser) {
    +				parser.buffer = parser.buffer[:buffer_len]
    +				return false
    +			}
    +		}
    +		first = false
    +
    +		// Decode the raw buffer.
    +	inner:
    +		for parser.raw_buffer_pos != len(parser.raw_buffer) {
    +			var value rune
    +			var width int
    +
    +			raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos
    +
    +			// Decode the next character.
    +			switch parser.encoding {
    +			case yaml_UTF8_ENCODING:
    +				// Decode a UTF-8 character.  Check RFC 3629
    +				// (http://www.ietf.org/rfc/rfc3629.txt) for more details.
    +				//
    +				// The following table (taken from the RFC) is used for
    +				// decoding.
    +				//
    +				//    Char. number range |        UTF-8 octet sequence
    +				//      (hexadecimal)    |              (binary)
    +				//   --------------------+------------------------------------
    +				//   0000 0000-0000 007F | 0xxxxxxx
    +				//   0000 0080-0000 07FF | 110xxxxx 10xxxxxx
    +				//   0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
    +				//   0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    +				//
    +				// Additionally, the characters in the range 0xD800-0xDFFF
    +				// are prohibited as they are reserved for use with UTF-16
    +				// surrogate pairs.
    +
    +				// Determine the length of the UTF-8 sequence.
    +				octet := parser.raw_buffer[parser.raw_buffer_pos]
    +				switch {
    +				case octet&0x80 == 0x00:
    +					width = 1
    +				case octet&0xE0 == 0xC0:
    +					width = 2
    +				case octet&0xF0 == 0xE0:
    +					width = 3
    +				case octet&0xF8 == 0xF0:
    +					width = 4
    +				default:
    +					// The leading octet is invalid.
    +					return yaml_parser_set_reader_error(parser,
    +						"invalid leading UTF-8 octet",
    +						parser.offset, int(octet))
    +				}
    +
    +				// Check if the raw buffer contains an incomplete character.
    +				if width > raw_unread {
    +					if parser.eof {
    +						return yaml_parser_set_reader_error(parser,
    +							"incomplete UTF-8 octet sequence",
    +							parser.offset, -1)
    +					}
    +					break inner
    +				}
    +
    +				// Decode the leading octet.
    +				switch {
    +				case octet&0x80 == 0x00:
    +					value = rune(octet & 0x7F)
    +				case octet&0xE0 == 0xC0:
    +					value = rune(octet & 0x1F)
    +				case octet&0xF0 == 0xE0:
    +					value = rune(octet & 0x0F)
    +				case octet&0xF8 == 0xF0:
    +					value = rune(octet & 0x07)
    +				default:
    +					value = 0
    +				}
    +
    +				// Check and decode the trailing octets.
    +				for k := 1; k < width; k++ {
    +					octet = parser.raw_buffer[parser.raw_buffer_pos+k]
    +
    +					// Check if the octet is valid.
    +					if (octet & 0xC0) != 0x80 {
    +						return yaml_parser_set_reader_error(parser,
    +							"invalid trailing UTF-8 octet",
    +							parser.offset+k, int(octet))
    +					}
    +
    +					// Decode the octet.
    +					value = (value << 6) + rune(octet&0x3F)
    +				}
    +
    +				// Check the length of the sequence against the value.
    +				switch {
    +				case width == 1:
    +				case width == 2 && value >= 0x80:
    +				case width == 3 && value >= 0x800:
    +				case width == 4 && value >= 0x10000:
    +				default:
    +					return yaml_parser_set_reader_error(parser,
    +						"invalid length of a UTF-8 sequence",
    +						parser.offset, -1)
    +				}
    +
    +				// Check the range of the value.
    +				if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF {
    +					return yaml_parser_set_reader_error(parser,
    +						"invalid Unicode character",
    +						parser.offset, int(value))
    +				}
    +
    +			case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING:
    +				var low, high int
    +				if parser.encoding == yaml_UTF16LE_ENCODING {
    +					low, high = 0, 1
    +				} else {
    +					low, high = 1, 0
    +				}
    +
    +				// The UTF-16 encoding is not as simple as one might
    +				// naively think.  Check RFC 2781
    +				// (http://www.ietf.org/rfc/rfc2781.txt).
    +				//
    +				// Normally, two subsequent bytes describe a Unicode
    +				// character.  However a special technique (called a
    +				// surrogate pair) is used for specifying character
    +				// values larger than 0xFFFF.
    +				//
    +				// A surrogate pair consists of two pseudo-characters:
    +				//      high surrogate area (0xD800-0xDBFF)
    +				//      low surrogate area (0xDC00-0xDFFF)
    +				//
    +				// The following formulas are used for decoding
    +				// and encoding characters using surrogate pairs:
    +				//
    +				//  U  = U' + 0x10000   (0x01 00 00 <= U <= 0x10 FF FF)
    +				//  U' = yyyyyyyyyyxxxxxxxxxx   (0 <= U' <= 0x0F FF FF)
    +				//  W1 = 110110yyyyyyyyyy
    +				//  W2 = 110111xxxxxxxxxx
    +				//
    +				// where U is the character value, W1 is the high surrogate
    +				// area, W2 is the low surrogate area.
    +
    +				// Check for incomplete UTF-16 character.
    +				if raw_unread < 2 {
    +					if parser.eof {
    +						return yaml_parser_set_reader_error(parser,
    +							"incomplete UTF-16 character",
    +							parser.offset, -1)
    +					}
    +					break inner
    +				}
    +
    +				// Get the character.
    +				value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) +
    +					(rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8)
    +
    +				// Check for unexpected low surrogate area.
    +				if value&0xFC00 == 0xDC00 {
    +					return yaml_parser_set_reader_error(parser,
    +						"unexpected low surrogate area",
    +						parser.offset, int(value))
    +				}
    +
    +				// Check for a high surrogate area.
    +				if value&0xFC00 == 0xD800 {
    +					width = 4
    +
    +					// Check for incomplete surrogate pair.
    +					if raw_unread < 4 {
    +						if parser.eof {
    +							return yaml_parser_set_reader_error(parser,
    +								"incomplete UTF-16 surrogate pair",
    +								parser.offset, -1)
    +						}
    +						break inner
    +					}
    +
    +					// Get the next character.
    +					value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) +
    +						(rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8)
    +
    +					// Check for a low surrogate area.
    +					if value2&0xFC00 != 0xDC00 {
    +						return yaml_parser_set_reader_error(parser,
    +							"expected low surrogate area",
    +							parser.offset+2, int(value2))
    +					}
    +
    +					// Generate the value of the surrogate pair.
    +					value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF)
    +				} else {
    +					width = 2
    +				}
    +
    +			default:
    +				panic("impossible")
    +			}
    +
    +			// Check if the character is in the allowed range:
    +			//      #x9 | #xA | #xD | [#x20-#x7E]               (8 bit)
    +			//      | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD]    (16 bit)
    +			//      | [#x10000-#x10FFFF]                        (32 bit)
    +			switch {
    +			case value == 0x09:
    +			case value == 0x0A:
    +			case value == 0x0D:
    +			case value >= 0x20 && value <= 0x7E:
    +			case value == 0x85:
    +			case value >= 0xA0 && value <= 0xD7FF:
    +			case value >= 0xE000 && value <= 0xFFFD:
    +			case value >= 0x10000 && value <= 0x10FFFF:
    +			default:
    +				return yaml_parser_set_reader_error(parser,
    +					"control characters are not allowed",
    +					parser.offset, int(value))
    +			}
    +
    +			// Move the raw pointers.
    +			parser.raw_buffer_pos += width
    +			parser.offset += width
    +
    +			// Finally put the character into the buffer.
    +			if value <= 0x7F {
    +				// 0000 0000-0000 007F . 0xxxxxxx
    +				parser.buffer[buffer_len+0] = byte(value)
    +				buffer_len += 1
    +			} else if value <= 0x7FF {
    +				// 0000 0080-0000 07FF . 110xxxxx 10xxxxxx
    +				parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6))
    +				parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F))
    +				buffer_len += 2
    +			} else if value <= 0xFFFF {
    +				// 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx
    +				parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12))
    +				parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F))
    +				parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F))
    +				buffer_len += 3
    +			} else {
    +				// 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    +				parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18))
    +				parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F))
    +				parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F))
    +				parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F))
    +				buffer_len += 4
    +			}
    +
    +			parser.unread++
    +		}
    +
    +		// On EOF, put NUL into the buffer and return.
    +		if parser.eof {
    +			parser.buffer[buffer_len] = 0
    +			buffer_len++
    +			parser.unread++
    +			break
    +		}
    +	}
    +	parser.buffer = parser.buffer[:buffer_len]
    +	return true
    +}
    diff --git a/vendor/gopkg.in/yaml.v2/resolve.go b/vendor/gopkg.in/yaml.v2/resolve.go
    new file mode 100644
    index 0000000000..93a8632743
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/resolve.go
    @@ -0,0 +1,203 @@
    +package yaml
    +
    +import (
    +	"encoding/base64"
    +	"math"
    +	"strconv"
    +	"strings"
    +	"unicode/utf8"
    +)
    +
    +type resolveMapItem struct {
    +	value interface{}
    +	tag   string
    +}
    +
    +var resolveTable = make([]byte, 256)
    +var resolveMap = make(map[string]resolveMapItem)
    +
    +func init() {
    +	t := resolveTable
    +	t[int('+')] = 'S' // Sign
    +	t[int('-')] = 'S'
    +	for _, c := range "0123456789" {
    +		t[int(c)] = 'D' // Digit
    +	}
    +	for _, c := range "yYnNtTfFoO~" {
    +		t[int(c)] = 'M' // In map
    +	}
    +	t[int('.')] = '.' // Float (potentially in map)
    +
    +	var resolveMapList = []struct {
    +		v   interface{}
    +		tag string
    +		l   []string
    +	}{
    +		{true, yaml_BOOL_TAG, []string{"y", "Y", "yes", "Yes", "YES"}},
    +		{true, yaml_BOOL_TAG, []string{"true", "True", "TRUE"}},
    +		{true, yaml_BOOL_TAG, []string{"on", "On", "ON"}},
    +		{false, yaml_BOOL_TAG, []string{"n", "N", "no", "No", "NO"}},
    +		{false, yaml_BOOL_TAG, []string{"false", "False", "FALSE"}},
    +		{false, yaml_BOOL_TAG, []string{"off", "Off", "OFF"}},
    +		{nil, yaml_NULL_TAG, []string{"", "~", "null", "Null", "NULL"}},
    +		{math.NaN(), yaml_FLOAT_TAG, []string{".nan", ".NaN", ".NAN"}},
    +		{math.Inf(+1), yaml_FLOAT_TAG, []string{".inf", ".Inf", ".INF"}},
    +		{math.Inf(+1), yaml_FLOAT_TAG, []string{"+.inf", "+.Inf", "+.INF"}},
    +		{math.Inf(-1), yaml_FLOAT_TAG, []string{"-.inf", "-.Inf", "-.INF"}},
    +		{"<<", yaml_MERGE_TAG, []string{"<<"}},
    +	}
    +
    +	m := resolveMap
    +	for _, item := range resolveMapList {
    +		for _, s := range item.l {
    +			m[s] = resolveMapItem{item.v, item.tag}
    +		}
    +	}
    +}
    +
    +const longTagPrefix = "tag:yaml.org,2002:"
    +
    +func shortTag(tag string) string {
    +	// TODO This can easily be made faster and produce less garbage.
    +	if strings.HasPrefix(tag, longTagPrefix) {
    +		return "!!" + tag[len(longTagPrefix):]
    +	}
    +	return tag
    +}
    +
    +func longTag(tag string) string {
    +	if strings.HasPrefix(tag, "!!") {
    +		return longTagPrefix + tag[2:]
    +	}
    +	return tag
    +}
    +
    +func resolvableTag(tag string) bool {
    +	switch tag {
    +	case "", yaml_STR_TAG, yaml_BOOL_TAG, yaml_INT_TAG, yaml_FLOAT_TAG, yaml_NULL_TAG:
    +		return true
    +	}
    +	return false
    +}
    +
    +func resolve(tag string, in string) (rtag string, out interface{}) {
    +	if !resolvableTag(tag) {
    +		return tag, in
    +	}
    +
    +	defer func() {
    +		switch tag {
    +		case "", rtag, yaml_STR_TAG, yaml_BINARY_TAG:
    +			return
    +		}
    +		failf("cannot decode %s `%s` as a %s", shortTag(rtag), in, shortTag(tag))
    +	}()
    +
    +	// Any data is accepted as a !!str or !!binary.
    +	// Otherwise, the prefix is enough of a hint about what it might be.
    +	hint := byte('N')
    +	if in != "" {
    +		hint = resolveTable[in[0]]
    +	}
    +	if hint != 0 && tag != yaml_STR_TAG && tag != yaml_BINARY_TAG {
    +		// Handle things we can lookup in a map.
    +		if item, ok := resolveMap[in]; ok {
    +			return item.tag, item.value
    +		}
    +
    +		// Base 60 floats are a bad idea, were dropped in YAML 1.2, and
    +		// are purposefully unsupported here. They're still quoted on
    +		// the way out for compatibility with other parser, though.
    +
    +		switch hint {
    +		case 'M':
    +			// We've already checked the map above.
    +
    +		case '.':
    +			// Not in the map, so maybe a normal float.
    +			floatv, err := strconv.ParseFloat(in, 64)
    +			if err == nil {
    +				return yaml_FLOAT_TAG, floatv
    +			}
    +
    +		case 'D', 'S':
    +			// Int, float, or timestamp.
    +			plain := strings.Replace(in, "_", "", -1)
    +			intv, err := strconv.ParseInt(plain, 0, 64)
    +			if err == nil {
    +				if intv == int64(int(intv)) {
    +					return yaml_INT_TAG, int(intv)
    +				} else {
    +					return yaml_INT_TAG, intv
    +				}
    +			}
    +			uintv, err := strconv.ParseUint(plain, 0, 64)
    +			if err == nil {
    +				return yaml_INT_TAG, uintv
    +			}
    +			floatv, err := strconv.ParseFloat(plain, 64)
    +			if err == nil {
    +				return yaml_FLOAT_TAG, floatv
    +			}
    +			if strings.HasPrefix(plain, "0b") {
    +				intv, err := strconv.ParseInt(plain[2:], 2, 64)
    +				if err == nil {
    +					if intv == int64(int(intv)) {
    +						return yaml_INT_TAG, int(intv)
    +					} else {
    +						return yaml_INT_TAG, intv
    +					}
    +				}
    +				uintv, err := strconv.ParseUint(plain[2:], 2, 64)
    +				if err == nil {
    +					return yaml_INT_TAG, uintv
    +				}
    +			} else if strings.HasPrefix(plain, "-0b") {
    +				intv, err := strconv.ParseInt(plain[3:], 2, 64)
    +				if err == nil {
    +					if intv == int64(int(intv)) {
    +						return yaml_INT_TAG, -int(intv)
    +					} else {
    +						return yaml_INT_TAG, -intv
    +					}
    +				}
    +			}
    +			// XXX Handle timestamps here.
    +
    +		default:
    +			panic("resolveTable item not yet handled: " + string(rune(hint)) + " (with " + in + ")")
    +		}
    +	}
    +	if tag == yaml_BINARY_TAG {
    +		return yaml_BINARY_TAG, in
    +	}
    +	if utf8.ValidString(in) {
    +		return yaml_STR_TAG, in
    +	}
    +	return yaml_BINARY_TAG, encodeBase64(in)
    +}
    +
    +// encodeBase64 encodes s as base64 that is broken up into multiple lines
    +// as appropriate for the resulting length.
    +func encodeBase64(s string) string {
    +	const lineLen = 70
    +	encLen := base64.StdEncoding.EncodedLen(len(s))
    +	lines := encLen/lineLen + 1
    +	buf := make([]byte, encLen*2+lines)
    +	in := buf[0:encLen]
    +	out := buf[encLen:]
    +	base64.StdEncoding.Encode(in, []byte(s))
    +	k := 0
    +	for i := 0; i < len(in); i += lineLen {
    +		j := i + lineLen
    +		if j > len(in) {
    +			j = len(in)
    +		}
    +		k += copy(out[k:], in[i:j])
    +		if lines > 1 {
    +			out[k] = '\n'
    +			k++
    +		}
    +	}
    +	return string(out[:k])
    +}
    diff --git a/vendor/gopkg.in/yaml.v2/scannerc.go b/vendor/gopkg.in/yaml.v2/scannerc.go
    new file mode 100644
    index 0000000000..25808000f2
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/scannerc.go
    @@ -0,0 +1,2710 @@
    +package yaml
    +
    +import (
    +	"bytes"
    +	"fmt"
    +)
    +
    +// Introduction
    +// ************
    +//
    +// The following notes assume that you are familiar with the YAML specification
    +// (http://yaml.org/spec/cvs/current.html).  We mostly follow it, although in
    +// some cases we are less restrictive that it requires.
    +//
    +// The process of transforming a YAML stream into a sequence of events is
    +// divided on two steps: Scanning and Parsing.
    +//
    +// The Scanner transforms the input stream into a sequence of tokens, while the
    +// parser transform the sequence of tokens produced by the Scanner into a
    +// sequence of parsing events.
    +//
    +// The Scanner is rather clever and complicated. The Parser, on the contrary,
    +// is a straightforward implementation of a recursive-descendant parser (or,
    +// LL(1) parser, as it is usually called).
    +//
    +// Actually there are two issues of Scanning that might be called "clever", the
    +// rest is quite straightforward.  The issues are "block collection start" and
    +// "simple keys".  Both issues are explained below in details.
    +//
    +// Here the Scanning step is explained and implemented.  We start with the list
    +// of all the tokens produced by the Scanner together with short descriptions.
    +//
    +// Now, tokens:
    +//
    +//      STREAM-START(encoding)          # The stream start.
    +//      STREAM-END                      # The stream end.
    +//      VERSION-DIRECTIVE(major,minor)  # The '%YAML' directive.
    +//      TAG-DIRECTIVE(handle,prefix)    # The '%TAG' directive.
    +//      DOCUMENT-START                  # '---'
    +//      DOCUMENT-END                    # '...'
    +//      BLOCK-SEQUENCE-START            # Indentation increase denoting a block
    +//      BLOCK-MAPPING-START             # sequence or a block mapping.
    +//      BLOCK-END                       # Indentation decrease.
    +//      FLOW-SEQUENCE-START             # '['
    +//      FLOW-SEQUENCE-END               # ']'
    +//      BLOCK-SEQUENCE-START            # '{'
    +//      BLOCK-SEQUENCE-END              # '}'
    +//      BLOCK-ENTRY                     # '-'
    +//      FLOW-ENTRY                      # ','
    +//      KEY                             # '?' or nothing (simple keys).
    +//      VALUE                           # ':'
    +//      ALIAS(anchor)                   # '*anchor'
    +//      ANCHOR(anchor)                  # '&anchor'
    +//      TAG(handle,suffix)              # '!handle!suffix'
    +//      SCALAR(value,style)             # A scalar.
    +//
    +// The following two tokens are "virtual" tokens denoting the beginning and the
    +// end of the stream:
    +//
    +//      STREAM-START(encoding)
    +//      STREAM-END
    +//
    +// We pass the information about the input stream encoding with the
    +// STREAM-START token.
    +//
    +// The next two tokens are responsible for tags:
    +//
    +//      VERSION-DIRECTIVE(major,minor)
    +//      TAG-DIRECTIVE(handle,prefix)
    +//
    +// Example:
    +//
    +//      %YAML   1.1
    +//      %TAG    !   !foo
    +//      %TAG    !yaml!  tag:yaml.org,2002:
    +//      ---
    +//
    +// The correspoding sequence of tokens:
    +//
    +//      STREAM-START(utf-8)
    +//      VERSION-DIRECTIVE(1,1)
    +//      TAG-DIRECTIVE("!","!foo")
    +//      TAG-DIRECTIVE("!yaml","tag:yaml.org,2002:")
    +//      DOCUMENT-START
    +//      STREAM-END
    +//
    +// Note that the VERSION-DIRECTIVE and TAG-DIRECTIVE tokens occupy a whole
    +// line.
    +//
    +// The document start and end indicators are represented by:
    +//
    +//      DOCUMENT-START
    +//      DOCUMENT-END
    +//
    +// Note that if a YAML stream contains an implicit document (without '---'
    +// and '...' indicators), no DOCUMENT-START and DOCUMENT-END tokens will be
    +// produced.
    +//
    +// In the following examples, we present whole documents together with the
    +// produced tokens.
    +//
    +//      1. An implicit document:
    +//
    +//          'a scalar'
    +//
    +//      Tokens:
    +//
    +//          STREAM-START(utf-8)
    +//          SCALAR("a scalar",single-quoted)
    +//          STREAM-END
    +//
    +//      2. An explicit document:
    +//
    +//          ---
    +//          'a scalar'
    +//          ...
    +//
    +//      Tokens:
    +//
    +//          STREAM-START(utf-8)
    +//          DOCUMENT-START
    +//          SCALAR("a scalar",single-quoted)
    +//          DOCUMENT-END
    +//          STREAM-END
    +//
    +//      3. Several documents in a stream:
    +//
    +//          'a scalar'
    +//          ---
    +//          'another scalar'
    +//          ---
    +//          'yet another scalar'
    +//
    +//      Tokens:
    +//
    +//          STREAM-START(utf-8)
    +//          SCALAR("a scalar",single-quoted)
    +//          DOCUMENT-START
    +//          SCALAR("another scalar",single-quoted)
    +//          DOCUMENT-START
    +//          SCALAR("yet another scalar",single-quoted)
    +//          STREAM-END
    +//
    +// We have already introduced the SCALAR token above.  The following tokens are
    +// used to describe aliases, anchors, tag, and scalars:
    +//
    +//      ALIAS(anchor)
    +//      ANCHOR(anchor)
    +//      TAG(handle,suffix)
    +//      SCALAR(value,style)
    +//
    +// The following series of examples illustrate the usage of these tokens:
    +//
    +//      1. A recursive sequence:
    +//
    +//          &A [ *A ]
    +//
    +//      Tokens:
    +//
    +//          STREAM-START(utf-8)
    +//          ANCHOR("A")
    +//          FLOW-SEQUENCE-START
    +//          ALIAS("A")
    +//          FLOW-SEQUENCE-END
    +//          STREAM-END
    +//
    +//      2. A tagged scalar:
    +//
    +//          !!float "3.14"  # A good approximation.
    +//
    +//      Tokens:
    +//
    +//          STREAM-START(utf-8)
    +//          TAG("!!","float")
    +//          SCALAR("3.14",double-quoted)
    +//          STREAM-END
    +//
    +//      3. Various scalar styles:
    +//
    +//          --- # Implicit empty plain scalars do not produce tokens.
    +//          --- a plain scalar
    +//          --- 'a single-quoted scalar'
    +//          --- "a double-quoted scalar"
    +//          --- |-
    +//            a literal scalar
    +//          --- >-
    +//            a folded
    +//            scalar
    +//
    +//      Tokens:
    +//
    +//          STREAM-START(utf-8)
    +//          DOCUMENT-START
    +//          DOCUMENT-START
    +//          SCALAR("a plain scalar",plain)
    +//          DOCUMENT-START
    +//          SCALAR("a single-quoted scalar",single-quoted)
    +//          DOCUMENT-START
    +//          SCALAR("a double-quoted scalar",double-quoted)
    +//          DOCUMENT-START
    +//          SCALAR("a literal scalar",literal)
    +//          DOCUMENT-START
    +//          SCALAR("a folded scalar",folded)
    +//          STREAM-END
    +//
    +// Now it's time to review collection-related tokens. We will start with
    +// flow collections:
    +//
    +//      FLOW-SEQUENCE-START
    +//      FLOW-SEQUENCE-END
    +//      FLOW-MAPPING-START
    +//      FLOW-MAPPING-END
    +//      FLOW-ENTRY
    +//      KEY
    +//      VALUE
    +//
    +// The tokens FLOW-SEQUENCE-START, FLOW-SEQUENCE-END, FLOW-MAPPING-START, and
    +// FLOW-MAPPING-END represent the indicators '[', ']', '{', and '}'
    +// correspondingly.  FLOW-ENTRY represent the ',' indicator.  Finally the
    +// indicators '?' and ':', which are used for denoting mapping keys and values,
    +// are represented by the KEY and VALUE tokens.
    +//
    +// The following examples show flow collections:
    +//
    +//      1. A flow sequence:
    +//
    +//          [item 1, item 2, item 3]
    +//
    +//      Tokens:
    +//
    +//          STREAM-START(utf-8)
    +//          FLOW-SEQUENCE-START
    +//          SCALAR("item 1",plain)
    +//          FLOW-ENTRY
    +//          SCALAR("item 2",plain)
    +//          FLOW-ENTRY
    +//          SCALAR("item 3",plain)
    +//          FLOW-SEQUENCE-END
    +//          STREAM-END
    +//
    +//      2. A flow mapping:
    +//
    +//          {
    +//              a simple key: a value,  # Note that the KEY token is produced.
    +//              ? a complex key: another value,
    +//          }
    +//
    +//      Tokens:
    +//
    +//          STREAM-START(utf-8)
    +//          FLOW-MAPPING-START
    +//          KEY
    +//          SCALAR("a simple key",plain)
    +//          VALUE
    +//          SCALAR("a value",plain)
    +//          FLOW-ENTRY
    +//          KEY
    +//          SCALAR("a complex key",plain)
    +//          VALUE
    +//          SCALAR("another value",plain)
    +//          FLOW-ENTRY
    +//          FLOW-MAPPING-END
    +//          STREAM-END
    +//
    +// A simple key is a key which is not denoted by the '?' indicator.  Note that
    +// the Scanner still produce the KEY token whenever it encounters a simple key.
    +//
    +// For scanning block collections, the following tokens are used (note that we
    +// repeat KEY and VALUE here):
    +//
    +//      BLOCK-SEQUENCE-START
    +//      BLOCK-MAPPING-START
    +//      BLOCK-END
    +//      BLOCK-ENTRY
    +//      KEY
    +//      VALUE
    +//
    +// The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation
    +// increase that precedes a block collection (cf. the INDENT token in Python).
    +// The token BLOCK-END denote indentation decrease that ends a block collection
    +// (cf. the DEDENT token in Python).  However YAML has some syntax pecularities
    +// that makes detections of these tokens more complex.
    +//
    +// The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators
    +// '-', '?', and ':' correspondingly.
    +//
    +// The following examples show how the tokens BLOCK-SEQUENCE-START,
    +// BLOCK-MAPPING-START, and BLOCK-END are emitted by the Scanner:
    +//
    +//      1. Block sequences:
    +//
    +//          - item 1
    +//          - item 2
    +//          -
    +//            - item 3.1
    +//            - item 3.2
    +//          -
    +//            key 1: value 1
    +//            key 2: value 2
    +//
    +//      Tokens:
    +//
    +//          STREAM-START(utf-8)
    +//          BLOCK-SEQUENCE-START
    +//          BLOCK-ENTRY
    +//          SCALAR("item 1",plain)
    +//          BLOCK-ENTRY
    +//          SCALAR("item 2",plain)
    +//          BLOCK-ENTRY
    +//          BLOCK-SEQUENCE-START
    +//          BLOCK-ENTRY
    +//          SCALAR("item 3.1",plain)
    +//          BLOCK-ENTRY
    +//          SCALAR("item 3.2",plain)
    +//          BLOCK-END
    +//          BLOCK-ENTRY
    +//          BLOCK-MAPPING-START
    +//          KEY
    +//          SCALAR("key 1",plain)
    +//          VALUE
    +//          SCALAR("value 1",plain)
    +//          KEY
    +//          SCALAR("key 2",plain)
    +//          VALUE
    +//          SCALAR("value 2",plain)
    +//          BLOCK-END
    +//          BLOCK-END
    +//          STREAM-END
    +//
    +//      2. Block mappings:
    +//
    +//          a simple key: a value   # The KEY token is produced here.
    +//          ? a complex key
    +//          : another value
    +//          a mapping:
    +//            key 1: value 1
    +//            key 2: value 2
    +//          a sequence:
    +//            - item 1
    +//            - item 2
    +//
    +//      Tokens:
    +//
    +//          STREAM-START(utf-8)
    +//          BLOCK-MAPPING-START
    +//          KEY
    +//          SCALAR("a simple key",plain)
    +//          VALUE
    +//          SCALAR("a value",plain)
    +//          KEY
    +//          SCALAR("a complex key",plain)
    +//          VALUE
    +//          SCALAR("another value",plain)
    +//          KEY
    +//          SCALAR("a mapping",plain)
    +//          BLOCK-MAPPING-START
    +//          KEY
    +//          SCALAR("key 1",plain)
    +//          VALUE
    +//          SCALAR("value 1",plain)
    +//          KEY
    +//          SCALAR("key 2",plain)
    +//          VALUE
    +//          SCALAR("value 2",plain)
    +//          BLOCK-END
    +//          KEY
    +//          SCALAR("a sequence",plain)
    +//          VALUE
    +//          BLOCK-SEQUENCE-START
    +//          BLOCK-ENTRY
    +//          SCALAR("item 1",plain)
    +//          BLOCK-ENTRY
    +//          SCALAR("item 2",plain)
    +//          BLOCK-END
    +//          BLOCK-END
    +//          STREAM-END
    +//
    +// YAML does not always require to start a new block collection from a new
    +// line.  If the current line contains only '-', '?', and ':' indicators, a new
    +// block collection may start at the current line.  The following examples
    +// illustrate this case:
    +//
    +//      1. Collections in a sequence:
    +//
    +//          - - item 1
    +//            - item 2
    +//          - key 1: value 1
    +//            key 2: value 2
    +//          - ? complex key
    +//            : complex value
    +//
    +//      Tokens:
    +//
    +//          STREAM-START(utf-8)
    +//          BLOCK-SEQUENCE-START
    +//          BLOCK-ENTRY
    +//          BLOCK-SEQUENCE-START
    +//          BLOCK-ENTRY
    +//          SCALAR("item 1",plain)
    +//          BLOCK-ENTRY
    +//          SCALAR("item 2",plain)
    +//          BLOCK-END
    +//          BLOCK-ENTRY
    +//          BLOCK-MAPPING-START
    +//          KEY
    +//          SCALAR("key 1",plain)
    +//          VALUE
    +//          SCALAR("value 1",plain)
    +//          KEY
    +//          SCALAR("key 2",plain)
    +//          VALUE
    +//          SCALAR("value 2",plain)
    +//          BLOCK-END
    +//          BLOCK-ENTRY
    +//          BLOCK-MAPPING-START
    +//          KEY
    +//          SCALAR("complex key")
    +//          VALUE
    +//          SCALAR("complex value")
    +//          BLOCK-END
    +//          BLOCK-END
    +//          STREAM-END
    +//
    +//      2. Collections in a mapping:
    +//
    +//          ? a sequence
    +//          : - item 1
    +//            - item 2
    +//          ? a mapping
    +//          : key 1: value 1
    +//            key 2: value 2
    +//
    +//      Tokens:
    +//
    +//          STREAM-START(utf-8)
    +//          BLOCK-MAPPING-START
    +//          KEY
    +//          SCALAR("a sequence",plain)
    +//          VALUE
    +//          BLOCK-SEQUENCE-START
    +//          BLOCK-ENTRY
    +//          SCALAR("item 1",plain)
    +//          BLOCK-ENTRY
    +//          SCALAR("item 2",plain)
    +//          BLOCK-END
    +//          KEY
    +//          SCALAR("a mapping",plain)
    +//          VALUE
    +//          BLOCK-MAPPING-START
    +//          KEY
    +//          SCALAR("key 1",plain)
    +//          VALUE
    +//          SCALAR("value 1",plain)
    +//          KEY
    +//          SCALAR("key 2",plain)
    +//          VALUE
    +//          SCALAR("value 2",plain)
    +//          BLOCK-END
    +//          BLOCK-END
    +//          STREAM-END
    +//
    +// YAML also permits non-indented sequences if they are included into a block
    +// mapping.  In this case, the token BLOCK-SEQUENCE-START is not produced:
    +//
    +//      key:
    +//      - item 1    # BLOCK-SEQUENCE-START is NOT produced here.
    +//      - item 2
    +//
    +// Tokens:
    +//
    +//      STREAM-START(utf-8)
    +//      BLOCK-MAPPING-START
    +//      KEY
    +//      SCALAR("key",plain)
    +//      VALUE
    +//      BLOCK-ENTRY
    +//      SCALAR("item 1",plain)
    +//      BLOCK-ENTRY
    +//      SCALAR("item 2",plain)
    +//      BLOCK-END
    +//
    +
    +// Ensure that the buffer contains the required number of characters.
    +// Return true on success, false on failure (reader error or memory error).
    +func cache(parser *yaml_parser_t, length int) bool {
    +	// [Go] This was inlined: !cache(A, B) -> unread < B && !update(A, B)
    +	return parser.unread >= length || yaml_parser_update_buffer(parser, length)
    +}
    +
    +// Advance the buffer pointer.
    +func skip(parser *yaml_parser_t) {
    +	parser.mark.index++
    +	parser.mark.column++
    +	parser.unread--
    +	parser.buffer_pos += width(parser.buffer[parser.buffer_pos])
    +}
    +
    +func skip_line(parser *yaml_parser_t) {
    +	if is_crlf(parser.buffer, parser.buffer_pos) {
    +		parser.mark.index += 2
    +		parser.mark.column = 0
    +		parser.mark.line++
    +		parser.unread -= 2
    +		parser.buffer_pos += 2
    +	} else if is_break(parser.buffer, parser.buffer_pos) {
    +		parser.mark.index++
    +		parser.mark.column = 0
    +		parser.mark.line++
    +		parser.unread--
    +		parser.buffer_pos += width(parser.buffer[parser.buffer_pos])
    +	}
    +}
    +
    +// Copy a character to a string buffer and advance pointers.
    +func read(parser *yaml_parser_t, s []byte) []byte {
    +	w := width(parser.buffer[parser.buffer_pos])
    +	if w == 0 {
    +		panic("invalid character sequence")
    +	}
    +	if len(s) == 0 {
    +		s = make([]byte, 0, 32)
    +	}
    +	if w == 1 && len(s)+w <= cap(s) {
    +		s = s[:len(s)+1]
    +		s[len(s)-1] = parser.buffer[parser.buffer_pos]
    +		parser.buffer_pos++
    +	} else {
    +		s = append(s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...)
    +		parser.buffer_pos += w
    +	}
    +	parser.mark.index++
    +	parser.mark.column++
    +	parser.unread--
    +	return s
    +}
    +
    +// Copy a line break character to a string buffer and advance pointers.
    +func read_line(parser *yaml_parser_t, s []byte) []byte {
    +	buf := parser.buffer
    +	pos := parser.buffer_pos
    +	switch {
    +	case buf[pos] == '\r' && buf[pos+1] == '\n':
    +		// CR LF . LF
    +		s = append(s, '\n')
    +		parser.buffer_pos += 2
    +		parser.mark.index++
    +		parser.unread--
    +	case buf[pos] == '\r' || buf[pos] == '\n':
    +		// CR|LF . LF
    +		s = append(s, '\n')
    +		parser.buffer_pos += 1
    +	case buf[pos] == '\xC2' && buf[pos+1] == '\x85':
    +		// NEL . LF
    +		s = append(s, '\n')
    +		parser.buffer_pos += 2
    +	case buf[pos] == '\xE2' && buf[pos+1] == '\x80' && (buf[pos+2] == '\xA8' || buf[pos+2] == '\xA9'):
    +		// LS|PS . LS|PS
    +		s = append(s, buf[parser.buffer_pos:pos+3]...)
    +		parser.buffer_pos += 3
    +	default:
    +		return s
    +	}
    +	parser.mark.index++
    +	parser.mark.column = 0
    +	parser.mark.line++
    +	parser.unread--
    +	return s
    +}
    +
    +// Get the next token.
    +func yaml_parser_scan(parser *yaml_parser_t, token *yaml_token_t) bool {
    +	// Erase the token object.
    +	*token = yaml_token_t{} // [Go] Is this necessary?
    +
    +	// No tokens after STREAM-END or error.
    +	if parser.stream_end_produced || parser.error != yaml_NO_ERROR {
    +		return true
    +	}
    +
    +	// Ensure that the tokens queue contains enough tokens.
    +	if !parser.token_available {
    +		if !yaml_parser_fetch_more_tokens(parser) {
    +			return false
    +		}
    +	}
    +
    +	// Fetch the next token from the queue.
    +	*token = parser.tokens[parser.tokens_head]
    +	parser.tokens_head++
    +	parser.tokens_parsed++
    +	parser.token_available = false
    +
    +	if token.typ == yaml_STREAM_END_TOKEN {
    +		parser.stream_end_produced = true
    +	}
    +	return true
    +}
    +
    +// Set the scanner error and return false.
    +func yaml_parser_set_scanner_error(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string) bool {
    +	parser.error = yaml_SCANNER_ERROR
    +	parser.context = context
    +	parser.context_mark = context_mark
    +	parser.problem = problem
    +	parser.problem_mark = parser.mark
    +	return false
    +}
    +
    +func yaml_parser_set_scanner_tag_error(parser *yaml_parser_t, directive bool, context_mark yaml_mark_t, problem string) bool {
    +	context := "while parsing a tag"
    +	if directive {
    +		context = "while parsing a %TAG directive"
    +	}
    +	return yaml_parser_set_scanner_error(parser, context, context_mark, "did not find URI escaped octet")
    +}
    +
    +func trace(args ...interface{}) func() {
    +	pargs := append([]interface{}{"+++"}, args...)
    +	fmt.Println(pargs...)
    +	pargs = append([]interface{}{"---"}, args...)
    +	return func() { fmt.Println(pargs...) }
    +}
    +
    +// Ensure that the tokens queue contains at least one token which can be
    +// returned to the Parser.
    +func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool {
    +	// While we need more tokens to fetch, do it.
    +	for {
    +		// Check if we really need to fetch more tokens.
    +		need_more_tokens := false
    +
    +		if parser.tokens_head == len(parser.tokens) {
    +			// Queue is empty.
    +			need_more_tokens = true
    +		} else {
    +			// Check if any potential simple key may occupy the head position.
    +			if !yaml_parser_stale_simple_keys(parser) {
    +				return false
    +			}
    +
    +			for i := range parser.simple_keys {
    +				simple_key := &parser.simple_keys[i]
    +				if simple_key.possible && simple_key.token_number == parser.tokens_parsed {
    +					need_more_tokens = true
    +					break
    +				}
    +			}
    +		}
    +
    +		// We are finished.
    +		if !need_more_tokens {
    +			break
    +		}
    +		// Fetch the next token.
    +		if !yaml_parser_fetch_next_token(parser) {
    +			return false
    +		}
    +	}
    +
    +	parser.token_available = true
    +	return true
    +}
    +
    +// The dispatcher for token fetchers.
    +func yaml_parser_fetch_next_token(parser *yaml_parser_t) bool {
    +	// Ensure that the buffer is initialized.
    +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +		return false
    +	}
    +
    +	// Check if we just started scanning.  Fetch STREAM-START then.
    +	if !parser.stream_start_produced {
    +		return yaml_parser_fetch_stream_start(parser)
    +	}
    +
    +	// Eat whitespaces and comments until we reach the next token.
    +	if !yaml_parser_scan_to_next_token(parser) {
    +		return false
    +	}
    +
    +	// Remove obsolete potential simple keys.
    +	if !yaml_parser_stale_simple_keys(parser) {
    +		return false
    +	}
    +
    +	// Check the indentation level against the current column.
    +	if !yaml_parser_unroll_indent(parser, parser.mark.column) {
    +		return false
    +	}
    +
    +	// Ensure that the buffer contains at least 4 characters.  4 is the length
    +	// of the longest indicators ('--- ' and '... ').
    +	if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
    +		return false
    +	}
    +
    +	// Is it the end of the stream?
    +	if is_z(parser.buffer, parser.buffer_pos) {
    +		return yaml_parser_fetch_stream_end(parser)
    +	}
    +
    +	// Is it a directive?
    +	if parser.mark.column == 0 && parser.buffer[parser.buffer_pos] == '%' {
    +		return yaml_parser_fetch_directive(parser)
    +	}
    +
    +	buf := parser.buffer
    +	pos := parser.buffer_pos
    +
    +	// Is it the document start indicator?
    +	if parser.mark.column == 0 && buf[pos] == '-' && buf[pos+1] == '-' && buf[pos+2] == '-' && is_blankz(buf, pos+3) {
    +		return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_START_TOKEN)
    +	}
    +
    +	// Is it the document end indicator?
    +	if parser.mark.column == 0 && buf[pos] == '.' && buf[pos+1] == '.' && buf[pos+2] == '.' && is_blankz(buf, pos+3) {
    +		return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_END_TOKEN)
    +	}
    +
    +	// Is it the flow sequence start indicator?
    +	if buf[pos] == '[' {
    +		return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_SEQUENCE_START_TOKEN)
    +	}
    +
    +	// Is it the flow mapping start indicator?
    +	if parser.buffer[parser.buffer_pos] == '{' {
    +		return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_MAPPING_START_TOKEN)
    +	}
    +
    +	// Is it the flow sequence end indicator?
    +	if parser.buffer[parser.buffer_pos] == ']' {
    +		return yaml_parser_fetch_flow_collection_end(parser,
    +			yaml_FLOW_SEQUENCE_END_TOKEN)
    +	}
    +
    +	// Is it the flow mapping end indicator?
    +	if parser.buffer[parser.buffer_pos] == '}' {
    +		return yaml_parser_fetch_flow_collection_end(parser,
    +			yaml_FLOW_MAPPING_END_TOKEN)
    +	}
    +
    +	// Is it the flow entry indicator?
    +	if parser.buffer[parser.buffer_pos] == ',' {
    +		return yaml_parser_fetch_flow_entry(parser)
    +	}
    +
    +	// Is it the block entry indicator?
    +	if parser.buffer[parser.buffer_pos] == '-' && is_blankz(parser.buffer, parser.buffer_pos+1) {
    +		return yaml_parser_fetch_block_entry(parser)
    +	}
    +
    +	// Is it the key indicator?
    +	if parser.buffer[parser.buffer_pos] == '?' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) {
    +		return yaml_parser_fetch_key(parser)
    +	}
    +
    +	// Is it the value indicator?
    +	if parser.buffer[parser.buffer_pos] == ':' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) {
    +		return yaml_parser_fetch_value(parser)
    +	}
    +
    +	// Is it an alias?
    +	if parser.buffer[parser.buffer_pos] == '*' {
    +		return yaml_parser_fetch_anchor(parser, yaml_ALIAS_TOKEN)
    +	}
    +
    +	// Is it an anchor?
    +	if parser.buffer[parser.buffer_pos] == '&' {
    +		return yaml_parser_fetch_anchor(parser, yaml_ANCHOR_TOKEN)
    +	}
    +
    +	// Is it a tag?
    +	if parser.buffer[parser.buffer_pos] == '!' {
    +		return yaml_parser_fetch_tag(parser)
    +	}
    +
    +	// Is it a literal scalar?
    +	if parser.buffer[parser.buffer_pos] == '|' && parser.flow_level == 0 {
    +		return yaml_parser_fetch_block_scalar(parser, true)
    +	}
    +
    +	// Is it a folded scalar?
    +	if parser.buffer[parser.buffer_pos] == '>' && parser.flow_level == 0 {
    +		return yaml_parser_fetch_block_scalar(parser, false)
    +	}
    +
    +	// Is it a single-quoted scalar?
    +	if parser.buffer[parser.buffer_pos] == '\'' {
    +		return yaml_parser_fetch_flow_scalar(parser, true)
    +	}
    +
    +	// Is it a double-quoted scalar?
    +	if parser.buffer[parser.buffer_pos] == '"' {
    +		return yaml_parser_fetch_flow_scalar(parser, false)
    +	}
    +
    +	// Is it a plain scalar?
    +	//
    +	// A plain scalar may start with any non-blank characters except
    +	//
    +	//      '-', '?', ':', ',', '[', ']', '{', '}',
    +	//      '#', '&', '*', '!', '|', '>', '\'', '\"',
    +	//      '%', '@', '`'.
    +	//
    +	// In the block context (and, for the '-' indicator, in the flow context
    +	// too), it may also start with the characters
    +	//
    +	//      '-', '?', ':'
    +	//
    +	// if it is followed by a non-space character.
    +	//
    +	// The last rule is more restrictive than the specification requires.
    +	// [Go] Make this logic more reasonable.
    +	//switch parser.buffer[parser.buffer_pos] {
    +	//case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`':
    +	//}
    +	if !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '-' ||
    +		parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' ||
    +		parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '[' ||
    +		parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' ||
    +		parser.buffer[parser.buffer_pos] == '}' || parser.buffer[parser.buffer_pos] == '#' ||
    +		parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '*' ||
    +		parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '|' ||
    +		parser.buffer[parser.buffer_pos] == '>' || parser.buffer[parser.buffer_pos] == '\'' ||
    +		parser.buffer[parser.buffer_pos] == '"' || parser.buffer[parser.buffer_pos] == '%' ||
    +		parser.buffer[parser.buffer_pos] == '@' || parser.buffer[parser.buffer_pos] == '`') ||
    +		(parser.buffer[parser.buffer_pos] == '-' && !is_blank(parser.buffer, parser.buffer_pos+1)) ||
    +		(parser.flow_level == 0 &&
    +			(parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':') &&
    +			!is_blankz(parser.buffer, parser.buffer_pos+1)) {
    +		return yaml_parser_fetch_plain_scalar(parser)
    +	}
    +
    +	// If we don't determine the token type so far, it is an error.
    +	return yaml_parser_set_scanner_error(parser,
    +		"while scanning for the next token", parser.mark,
    +		"found character that cannot start any token")
    +}
    +
    +// Check the list of potential simple keys and remove the positions that
    +// cannot contain simple keys anymore.
    +func yaml_parser_stale_simple_keys(parser *yaml_parser_t) bool {
    +	// Check for a potential simple key for each flow level.
    +	for i := range parser.simple_keys {
    +		simple_key := &parser.simple_keys[i]
    +
    +		// The specification requires that a simple key
    +		//
    +		//  - is limited to a single line,
    +		//  - is shorter than 1024 characters.
    +		if simple_key.possible && (simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index) {
    +
    +			// Check if the potential simple key to be removed is required.
    +			if simple_key.required {
    +				return yaml_parser_set_scanner_error(parser,
    +					"while scanning a simple key", simple_key.mark,
    +					"could not find expected ':'")
    +			}
    +			simple_key.possible = false
    +		}
    +	}
    +	return true
    +}
    +
    +// Check if a simple key may start at the current position and add it if
    +// needed.
    +func yaml_parser_save_simple_key(parser *yaml_parser_t) bool {
    +	// A simple key is required at the current position if the scanner is in
    +	// the block context and the current column coincides with the indentation
    +	// level.
    +
    +	required := parser.flow_level == 0 && parser.indent == parser.mark.column
    +
    +	// A simple key is required only when it is the first token in the current
    +	// line.  Therefore it is always allowed.  But we add a check anyway.
    +	if required && !parser.simple_key_allowed {
    +		panic("should not happen")
    +	}
    +
    +	//
    +	// If the current position may start a simple key, save it.
    +	//
    +	if parser.simple_key_allowed {
    +		simple_key := yaml_simple_key_t{
    +			possible:     true,
    +			required:     required,
    +			token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head),
    +		}
    +		simple_key.mark = parser.mark
    +
    +		if !yaml_parser_remove_simple_key(parser) {
    +			return false
    +		}
    +		parser.simple_keys[len(parser.simple_keys)-1] = simple_key
    +	}
    +	return true
    +}
    +
    +// Remove a potential simple key at the current flow level.
    +func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool {
    +	i := len(parser.simple_keys) - 1
    +	if parser.simple_keys[i].possible {
    +		// If the key is required, it is an error.
    +		if parser.simple_keys[i].required {
    +			return yaml_parser_set_scanner_error(parser,
    +				"while scanning a simple key", parser.simple_keys[i].mark,
    +				"could not find expected ':'")
    +		}
    +	}
    +	// Remove the key from the stack.
    +	parser.simple_keys[i].possible = false
    +	return true
    +}
    +
    +// Increase the flow level and resize the simple key list if needed.
    +func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool {
    +	// Reset the simple key on the next level.
    +	parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{})
    +
    +	// Increase the flow level.
    +	parser.flow_level++
    +	return true
    +}
    +
    +// Decrease the flow level.
    +func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool {
    +	if parser.flow_level > 0 {
    +		parser.flow_level--
    +		parser.simple_keys = parser.simple_keys[:len(parser.simple_keys)-1]
    +	}
    +	return true
    +}
    +
    +// Push the current indentation level to the stack and set the new level
    +// the current column is greater than the indentation level.  In this case,
    +// append or insert the specified token into the token queue.
    +func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml_token_type_t, mark yaml_mark_t) bool {
    +	// In the flow context, do nothing.
    +	if parser.flow_level > 0 {
    +		return true
    +	}
    +
    +	if parser.indent < column {
    +		// Push the current indentation level to the stack and set the new
    +		// indentation level.
    +		parser.indents = append(parser.indents, parser.indent)
    +		parser.indent = column
    +
    +		// Create a token and insert it into the queue.
    +		token := yaml_token_t{
    +			typ:        typ,
    +			start_mark: mark,
    +			end_mark:   mark,
    +		}
    +		if number > -1 {
    +			number -= parser.tokens_parsed
    +		}
    +		yaml_insert_token(parser, number, &token)
    +	}
    +	return true
    +}
    +
    +// Pop indentation levels from the indents stack until the current level
    +// becomes less or equal to the column.  For each indentation level, append
    +// the BLOCK-END token.
    +func yaml_parser_unroll_indent(parser *yaml_parser_t, column int) bool {
    +	// In the flow context, do nothing.
    +	if parser.flow_level > 0 {
    +		return true
    +	}
    +
    +	// Loop through the indentation levels in the stack.
    +	for parser.indent > column {
    +		// Create a token and append it to the queue.
    +		token := yaml_token_t{
    +			typ:        yaml_BLOCK_END_TOKEN,
    +			start_mark: parser.mark,
    +			end_mark:   parser.mark,
    +		}
    +		yaml_insert_token(parser, -1, &token)
    +
    +		// Pop the indentation level.
    +		parser.indent = parser.indents[len(parser.indents)-1]
    +		parser.indents = parser.indents[:len(parser.indents)-1]
    +	}
    +	return true
    +}
    +
    +// Initialize the scanner and produce the STREAM-START token.
    +func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool {
    +
    +	// Set the initial indentation.
    +	parser.indent = -1
    +
    +	// Initialize the simple key stack.
    +	parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{})
    +
    +	// A simple key is allowed at the beginning of the stream.
    +	parser.simple_key_allowed = true
    +
    +	// We have started.
    +	parser.stream_start_produced = true
    +
    +	// Create the STREAM-START token and append it to the queue.
    +	token := yaml_token_t{
    +		typ:        yaml_STREAM_START_TOKEN,
    +		start_mark: parser.mark,
    +		end_mark:   parser.mark,
    +		encoding:   parser.encoding,
    +	}
    +	yaml_insert_token(parser, -1, &token)
    +	return true
    +}
    +
    +// Produce the STREAM-END token and shut down the scanner.
    +func yaml_parser_fetch_stream_end(parser *yaml_parser_t) bool {
    +
    +	// Force new line.
    +	if parser.mark.column != 0 {
    +		parser.mark.column = 0
    +		parser.mark.line++
    +	}
    +
    +	// Reset the indentation level.
    +	if !yaml_parser_unroll_indent(parser, -1) {
    +		return false
    +	}
    +
    +	// Reset simple keys.
    +	if !yaml_parser_remove_simple_key(parser) {
    +		return false
    +	}
    +
    +	parser.simple_key_allowed = false
    +
    +	// Create the STREAM-END token and append it to the queue.
    +	token := yaml_token_t{
    +		typ:        yaml_STREAM_END_TOKEN,
    +		start_mark: parser.mark,
    +		end_mark:   parser.mark,
    +	}
    +	yaml_insert_token(parser, -1, &token)
    +	return true
    +}
    +
    +// Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token.
    +func yaml_parser_fetch_directive(parser *yaml_parser_t) bool {
    +	// Reset the indentation level.
    +	if !yaml_parser_unroll_indent(parser, -1) {
    +		return false
    +	}
    +
    +	// Reset simple keys.
    +	if !yaml_parser_remove_simple_key(parser) {
    +		return false
    +	}
    +
    +	parser.simple_key_allowed = false
    +
    +	// Create the YAML-DIRECTIVE or TAG-DIRECTIVE token.
    +	token := yaml_token_t{}
    +	if !yaml_parser_scan_directive(parser, &token) {
    +		return false
    +	}
    +	// Append the token to the queue.
    +	yaml_insert_token(parser, -1, &token)
    +	return true
    +}
    +
    +// Produce the DOCUMENT-START or DOCUMENT-END token.
    +func yaml_parser_fetch_document_indicator(parser *yaml_parser_t, typ yaml_token_type_t) bool {
    +	// Reset the indentation level.
    +	if !yaml_parser_unroll_indent(parser, -1) {
    +		return false
    +	}
    +
    +	// Reset simple keys.
    +	if !yaml_parser_remove_simple_key(parser) {
    +		return false
    +	}
    +
    +	parser.simple_key_allowed = false
    +
    +	// Consume the token.
    +	start_mark := parser.mark
    +
    +	skip(parser)
    +	skip(parser)
    +	skip(parser)
    +
    +	end_mark := parser.mark
    +
    +	// Create the DOCUMENT-START or DOCUMENT-END token.
    +	token := yaml_token_t{
    +		typ:        typ,
    +		start_mark: start_mark,
    +		end_mark:   end_mark,
    +	}
    +	// Append the token to the queue.
    +	yaml_insert_token(parser, -1, &token)
    +	return true
    +}
    +
    +// Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token.
    +func yaml_parser_fetch_flow_collection_start(parser *yaml_parser_t, typ yaml_token_type_t) bool {
    +	// The indicators '[' and '{' may start a simple key.
    +	if !yaml_parser_save_simple_key(parser) {
    +		return false
    +	}
    +
    +	// Increase the flow level.
    +	if !yaml_parser_increase_flow_level(parser) {
    +		return false
    +	}
    +
    +	// A simple key may follow the indicators '[' and '{'.
    +	parser.simple_key_allowed = true
    +
    +	// Consume the token.
    +	start_mark := parser.mark
    +	skip(parser)
    +	end_mark := parser.mark
    +
    +	// Create the FLOW-SEQUENCE-START of FLOW-MAPPING-START token.
    +	token := yaml_token_t{
    +		typ:        typ,
    +		start_mark: start_mark,
    +		end_mark:   end_mark,
    +	}
    +	// Append the token to the queue.
    +	yaml_insert_token(parser, -1, &token)
    +	return true
    +}
    +
    +// Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token.
    +func yaml_parser_fetch_flow_collection_end(parser *yaml_parser_t, typ yaml_token_type_t) bool {
    +	// Reset any potential simple key on the current flow level.
    +	if !yaml_parser_remove_simple_key(parser) {
    +		return false
    +	}
    +
    +	// Decrease the flow level.
    +	if !yaml_parser_decrease_flow_level(parser) {
    +		return false
    +	}
    +
    +	// No simple keys after the indicators ']' and '}'.
    +	parser.simple_key_allowed = false
    +
    +	// Consume the token.
    +
    +	start_mark := parser.mark
    +	skip(parser)
    +	end_mark := parser.mark
    +
    +	// Create the FLOW-SEQUENCE-END of FLOW-MAPPING-END token.
    +	token := yaml_token_t{
    +		typ:        typ,
    +		start_mark: start_mark,
    +		end_mark:   end_mark,
    +	}
    +	// Append the token to the queue.
    +	yaml_insert_token(parser, -1, &token)
    +	return true
    +}
    +
    +// Produce the FLOW-ENTRY token.
    +func yaml_parser_fetch_flow_entry(parser *yaml_parser_t) bool {
    +	// Reset any potential simple keys on the current flow level.
    +	if !yaml_parser_remove_simple_key(parser) {
    +		return false
    +	}
    +
    +	// Simple keys are allowed after ','.
    +	parser.simple_key_allowed = true
    +
    +	// Consume the token.
    +	start_mark := parser.mark
    +	skip(parser)
    +	end_mark := parser.mark
    +
    +	// Create the FLOW-ENTRY token and append it to the queue.
    +	token := yaml_token_t{
    +		typ:        yaml_FLOW_ENTRY_TOKEN,
    +		start_mark: start_mark,
    +		end_mark:   end_mark,
    +	}
    +	yaml_insert_token(parser, -1, &token)
    +	return true
    +}
    +
    +// Produce the BLOCK-ENTRY token.
    +func yaml_parser_fetch_block_entry(parser *yaml_parser_t) bool {
    +	// Check if the scanner is in the block context.
    +	if parser.flow_level == 0 {
    +		// Check if we are allowed to start a new entry.
    +		if !parser.simple_key_allowed {
    +			return yaml_parser_set_scanner_error(parser, "", parser.mark,
    +				"block sequence entries are not allowed in this context")
    +		}
    +		// Add the BLOCK-SEQUENCE-START token if needed.
    +		if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_SEQUENCE_START_TOKEN, parser.mark) {
    +			return false
    +		}
    +	} else {
    +		// It is an error for the '-' indicator to occur in the flow context,
    +		// but we let the Parser detect and report about it because the Parser
    +		// is able to point to the context.
    +	}
    +
    +	// Reset any potential simple keys on the current flow level.
    +	if !yaml_parser_remove_simple_key(parser) {
    +		return false
    +	}
    +
    +	// Simple keys are allowed after '-'.
    +	parser.simple_key_allowed = true
    +
    +	// Consume the token.
    +	start_mark := parser.mark
    +	skip(parser)
    +	end_mark := parser.mark
    +
    +	// Create the BLOCK-ENTRY token and append it to the queue.
    +	token := yaml_token_t{
    +		typ:        yaml_BLOCK_ENTRY_TOKEN,
    +		start_mark: start_mark,
    +		end_mark:   end_mark,
    +	}
    +	yaml_insert_token(parser, -1, &token)
    +	return true
    +}
    +
    +// Produce the KEY token.
    +func yaml_parser_fetch_key(parser *yaml_parser_t) bool {
    +
    +	// In the block context, additional checks are required.
    +	if parser.flow_level == 0 {
    +		// Check if we are allowed to start a new key (not nessesary simple).
    +		if !parser.simple_key_allowed {
    +			return yaml_parser_set_scanner_error(parser, "", parser.mark,
    +				"mapping keys are not allowed in this context")
    +		}
    +		// Add the BLOCK-MAPPING-START token if needed.
    +		if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) {
    +			return false
    +		}
    +	}
    +
    +	// Reset any potential simple keys on the current flow level.
    +	if !yaml_parser_remove_simple_key(parser) {
    +		return false
    +	}
    +
    +	// Simple keys are allowed after '?' in the block context.
    +	parser.simple_key_allowed = parser.flow_level == 0
    +
    +	// Consume the token.
    +	start_mark := parser.mark
    +	skip(parser)
    +	end_mark := parser.mark
    +
    +	// Create the KEY token and append it to the queue.
    +	token := yaml_token_t{
    +		typ:        yaml_KEY_TOKEN,
    +		start_mark: start_mark,
    +		end_mark:   end_mark,
    +	}
    +	yaml_insert_token(parser, -1, &token)
    +	return true
    +}
    +
    +// Produce the VALUE token.
    +func yaml_parser_fetch_value(parser *yaml_parser_t) bool {
    +
    +	simple_key := &parser.simple_keys[len(parser.simple_keys)-1]
    +
    +	// Have we found a simple key?
    +	if simple_key.possible {
    +		// Create the KEY token and insert it into the queue.
    +		token := yaml_token_t{
    +			typ:        yaml_KEY_TOKEN,
    +			start_mark: simple_key.mark,
    +			end_mark:   simple_key.mark,
    +		}
    +		yaml_insert_token(parser, simple_key.token_number-parser.tokens_parsed, &token)
    +
    +		// In the block context, we may need to add the BLOCK-MAPPING-START token.
    +		if !yaml_parser_roll_indent(parser, simple_key.mark.column,
    +			simple_key.token_number,
    +			yaml_BLOCK_MAPPING_START_TOKEN, simple_key.mark) {
    +			return false
    +		}
    +
    +		// Remove the simple key.
    +		simple_key.possible = false
    +
    +		// A simple key cannot follow another simple key.
    +		parser.simple_key_allowed = false
    +
    +	} else {
    +		// The ':' indicator follows a complex key.
    +
    +		// In the block context, extra checks are required.
    +		if parser.flow_level == 0 {
    +
    +			// Check if we are allowed to start a complex value.
    +			if !parser.simple_key_allowed {
    +				return yaml_parser_set_scanner_error(parser, "", parser.mark,
    +					"mapping values are not allowed in this context")
    +			}
    +
    +			// Add the BLOCK-MAPPING-START token if needed.
    +			if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) {
    +				return false
    +			}
    +		}
    +
    +		// Simple keys after ':' are allowed in the block context.
    +		parser.simple_key_allowed = parser.flow_level == 0
    +	}
    +
    +	// Consume the token.
    +	start_mark := parser.mark
    +	skip(parser)
    +	end_mark := parser.mark
    +
    +	// Create the VALUE token and append it to the queue.
    +	token := yaml_token_t{
    +		typ:        yaml_VALUE_TOKEN,
    +		start_mark: start_mark,
    +		end_mark:   end_mark,
    +	}
    +	yaml_insert_token(parser, -1, &token)
    +	return true
    +}
    +
    +// Produce the ALIAS or ANCHOR token.
    +func yaml_parser_fetch_anchor(parser *yaml_parser_t, typ yaml_token_type_t) bool {
    +	// An anchor or an alias could be a simple key.
    +	if !yaml_parser_save_simple_key(parser) {
    +		return false
    +	}
    +
    +	// A simple key cannot follow an anchor or an alias.
    +	parser.simple_key_allowed = false
    +
    +	// Create the ALIAS or ANCHOR token and append it to the queue.
    +	var token yaml_token_t
    +	if !yaml_parser_scan_anchor(parser, &token, typ) {
    +		return false
    +	}
    +	yaml_insert_token(parser, -1, &token)
    +	return true
    +}
    +
    +// Produce the TAG token.
    +func yaml_parser_fetch_tag(parser *yaml_parser_t) bool {
    +	// A tag could be a simple key.
    +	if !yaml_parser_save_simple_key(parser) {
    +		return false
    +	}
    +
    +	// A simple key cannot follow a tag.
    +	parser.simple_key_allowed = false
    +
    +	// Create the TAG token and append it to the queue.
    +	var token yaml_token_t
    +	if !yaml_parser_scan_tag(parser, &token) {
    +		return false
    +	}
    +	yaml_insert_token(parser, -1, &token)
    +	return true
    +}
    +
    +// Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens.
    +func yaml_parser_fetch_block_scalar(parser *yaml_parser_t, literal bool) bool {
    +	// Remove any potential simple keys.
    +	if !yaml_parser_remove_simple_key(parser) {
    +		return false
    +	}
    +
    +	// A simple key may follow a block scalar.
    +	parser.simple_key_allowed = true
    +
    +	// Create the SCALAR token and append it to the queue.
    +	var token yaml_token_t
    +	if !yaml_parser_scan_block_scalar(parser, &token, literal) {
    +		return false
    +	}
    +	yaml_insert_token(parser, -1, &token)
    +	return true
    +}
    +
    +// Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens.
    +func yaml_parser_fetch_flow_scalar(parser *yaml_parser_t, single bool) bool {
    +	// A plain scalar could be a simple key.
    +	if !yaml_parser_save_simple_key(parser) {
    +		return false
    +	}
    +
    +	// A simple key cannot follow a flow scalar.
    +	parser.simple_key_allowed = false
    +
    +	// Create the SCALAR token and append it to the queue.
    +	var token yaml_token_t
    +	if !yaml_parser_scan_flow_scalar(parser, &token, single) {
    +		return false
    +	}
    +	yaml_insert_token(parser, -1, &token)
    +	return true
    +}
    +
    +// Produce the SCALAR(...,plain) token.
    +func yaml_parser_fetch_plain_scalar(parser *yaml_parser_t) bool {
    +	// A plain scalar could be a simple key.
    +	if !yaml_parser_save_simple_key(parser) {
    +		return false
    +	}
    +
    +	// A simple key cannot follow a flow scalar.
    +	parser.simple_key_allowed = false
    +
    +	// Create the SCALAR token and append it to the queue.
    +	var token yaml_token_t
    +	if !yaml_parser_scan_plain_scalar(parser, &token) {
    +		return false
    +	}
    +	yaml_insert_token(parser, -1, &token)
    +	return true
    +}
    +
    +// Eat whitespaces and comments until the next token is found.
    +func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool {
    +
    +	// Until the next token is not found.
    +	for {
    +		// Allow the BOM mark to start a line.
    +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +			return false
    +		}
    +		if parser.mark.column == 0 && is_bom(parser.buffer, parser.buffer_pos) {
    +			skip(parser)
    +		}
    +
    +		// Eat whitespaces.
    +		// Tabs are allowed:
    +		//  - in the flow context
    +		//  - in the block context, but not at the beginning of the line or
    +		//  after '-', '?', or ':' (complex value).
    +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +			return false
    +		}
    +
    +		for parser.buffer[parser.buffer_pos] == ' ' || ((parser.flow_level > 0 || !parser.simple_key_allowed) && parser.buffer[parser.buffer_pos] == '\t') {
    +			skip(parser)
    +			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +				return false
    +			}
    +		}
    +
    +		// Eat a comment until a line break.
    +		if parser.buffer[parser.buffer_pos] == '#' {
    +			for !is_breakz(parser.buffer, parser.buffer_pos) {
    +				skip(parser)
    +				if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +					return false
    +				}
    +			}
    +		}
    +
    +		// If it is a line break, eat it.
    +		if is_break(parser.buffer, parser.buffer_pos) {
    +			if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
    +				return false
    +			}
    +			skip_line(parser)
    +
    +			// In the block context, a new line may start a simple key.
    +			if parser.flow_level == 0 {
    +				parser.simple_key_allowed = true
    +			}
    +		} else {
    +			break // We have found a token.
    +		}
    +	}
    +
    +	return true
    +}
    +
    +// Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token.
    +//
    +// Scope:
    +//      %YAML    1.1    # a comment \n
    +//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    +//      %TAG    !yaml!  tag:yaml.org,2002:  \n
    +//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    +//
    +func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool {
    +	// Eat '%'.
    +	start_mark := parser.mark
    +	skip(parser)
    +
    +	// Scan the directive name.
    +	var name []byte
    +	if !yaml_parser_scan_directive_name(parser, start_mark, &name) {
    +		return false
    +	}
    +
    +	// Is it a YAML directive?
    +	if bytes.Equal(name, []byte("YAML")) {
    +		// Scan the VERSION directive value.
    +		var major, minor int8
    +		if !yaml_parser_scan_version_directive_value(parser, start_mark, &major, &minor) {
    +			return false
    +		}
    +		end_mark := parser.mark
    +
    +		// Create a VERSION-DIRECTIVE token.
    +		*token = yaml_token_t{
    +			typ:        yaml_VERSION_DIRECTIVE_TOKEN,
    +			start_mark: start_mark,
    +			end_mark:   end_mark,
    +			major:      major,
    +			minor:      minor,
    +		}
    +
    +		// Is it a TAG directive?
    +	} else if bytes.Equal(name, []byte("TAG")) {
    +		// Scan the TAG directive value.
    +		var handle, prefix []byte
    +		if !yaml_parser_scan_tag_directive_value(parser, start_mark, &handle, &prefix) {
    +			return false
    +		}
    +		end_mark := parser.mark
    +
    +		// Create a TAG-DIRECTIVE token.
    +		*token = yaml_token_t{
    +			typ:        yaml_TAG_DIRECTIVE_TOKEN,
    +			start_mark: start_mark,
    +			end_mark:   end_mark,
    +			value:      handle,
    +			prefix:     prefix,
    +		}
    +
    +		// Unknown directive.
    +	} else {
    +		yaml_parser_set_scanner_error(parser, "while scanning a directive",
    +			start_mark, "found unknown directive name")
    +		return false
    +	}
    +
    +	// Eat the rest of the line including any comments.
    +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +		return false
    +	}
    +
    +	for is_blank(parser.buffer, parser.buffer_pos) {
    +		skip(parser)
    +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +			return false
    +		}
    +	}
    +
    +	if parser.buffer[parser.buffer_pos] == '#' {
    +		for !is_breakz(parser.buffer, parser.buffer_pos) {
    +			skip(parser)
    +			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +				return false
    +			}
    +		}
    +	}
    +
    +	// Check if we are at the end of the line.
    +	if !is_breakz(parser.buffer, parser.buffer_pos) {
    +		yaml_parser_set_scanner_error(parser, "while scanning a directive",
    +			start_mark, "did not find expected comment or line break")
    +		return false
    +	}
    +
    +	// Eat a line break.
    +	if is_break(parser.buffer, parser.buffer_pos) {
    +		if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
    +			return false
    +		}
    +		skip_line(parser)
    +	}
    +
    +	return true
    +}
    +
    +// Scan the directive name.
    +//
    +// Scope:
    +//      %YAML   1.1     # a comment \n
    +//       ^^^^
    +//      %TAG    !yaml!  tag:yaml.org,2002:  \n
    +//       ^^^
    +//
    +func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool {
    +	// Consume the directive name.
    +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +		return false
    +	}
    +
    +	var s []byte
    +	for is_alpha(parser.buffer, parser.buffer_pos) {
    +		s = read(parser, s)
    +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +			return false
    +		}
    +	}
    +
    +	// Check if the name is empty.
    +	if len(s) == 0 {
    +		yaml_parser_set_scanner_error(parser, "while scanning a directive",
    +			start_mark, "could not find expected directive name")
    +		return false
    +	}
    +
    +	// Check for an blank character after the name.
    +	if !is_blankz(parser.buffer, parser.buffer_pos) {
    +		yaml_parser_set_scanner_error(parser, "while scanning a directive",
    +			start_mark, "found unexpected non-alphabetical character")
    +		return false
    +	}
    +	*name = s
    +	return true
    +}
    +
    +// Scan the value of VERSION-DIRECTIVE.
    +//
    +// Scope:
    +//      %YAML   1.1     # a comment \n
    +//           ^^^^^^
    +func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool {
    +	// Eat whitespaces.
    +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +		return false
    +	}
    +	for is_blank(parser.buffer, parser.buffer_pos) {
    +		skip(parser)
    +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +			return false
    +		}
    +	}
    +
    +	// Consume the major version number.
    +	if !yaml_parser_scan_version_directive_number(parser, start_mark, major) {
    +		return false
    +	}
    +
    +	// Eat '.'.
    +	if parser.buffer[parser.buffer_pos] != '.' {
    +		return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
    +			start_mark, "did not find expected digit or '.' character")
    +	}
    +
    +	skip(parser)
    +
    +	// Consume the minor version number.
    +	if !yaml_parser_scan_version_directive_number(parser, start_mark, minor) {
    +		return false
    +	}
    +	return true
    +}
    +
    +const max_number_length = 2
    +
    +// Scan the version number of VERSION-DIRECTIVE.
    +//
    +// Scope:
    +//      %YAML   1.1     # a comment \n
    +//              ^
    +//      %YAML   1.1     # a comment \n
    +//                ^
    +func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool {
    +
    +	// Repeat while the next character is digit.
    +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +		return false
    +	}
    +	var value, length int8
    +	for is_digit(parser.buffer, parser.buffer_pos) {
    +		// Check if the number is too long.
    +		length++
    +		if length > max_number_length {
    +			return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
    +				start_mark, "found extremely long version number")
    +		}
    +		value = value*10 + int8(as_digit(parser.buffer, parser.buffer_pos))
    +		skip(parser)
    +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +			return false
    +		}
    +	}
    +
    +	// Check if the number was present.
    +	if length == 0 {
    +		return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive",
    +			start_mark, "did not find expected version number")
    +	}
    +	*number = value
    +	return true
    +}
    +
    +// Scan the value of a TAG-DIRECTIVE token.
    +//
    +// Scope:
    +//      %TAG    !yaml!  tag:yaml.org,2002:  \n
    +//          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    +//
    +func yaml_parser_scan_tag_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, handle, prefix *[]byte) bool {
    +	var handle_value, prefix_value []byte
    +
    +	// Eat whitespaces.
    +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +		return false
    +	}
    +
    +	for is_blank(parser.buffer, parser.buffer_pos) {
    +		skip(parser)
    +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +			return false
    +		}
    +	}
    +
    +	// Scan a handle.
    +	if !yaml_parser_scan_tag_handle(parser, true, start_mark, &handle_value) {
    +		return false
    +	}
    +
    +	// Expect a whitespace.
    +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +		return false
    +	}
    +	if !is_blank(parser.buffer, parser.buffer_pos) {
    +		yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive",
    +			start_mark, "did not find expected whitespace")
    +		return false
    +	}
    +
    +	// Eat whitespaces.
    +	for is_blank(parser.buffer, parser.buffer_pos) {
    +		skip(parser)
    +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +			return false
    +		}
    +	}
    +
    +	// Scan a prefix.
    +	if !yaml_parser_scan_tag_uri(parser, true, nil, start_mark, &prefix_value) {
    +		return false
    +	}
    +
    +	// Expect a whitespace or line break.
    +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +		return false
    +	}
    +	if !is_blankz(parser.buffer, parser.buffer_pos) {
    +		yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive",
    +			start_mark, "did not find expected whitespace or line break")
    +		return false
    +	}
    +
    +	*handle = handle_value
    +	*prefix = prefix_value
    +	return true
    +}
    +
    +func yaml_parser_scan_anchor(parser *yaml_parser_t, token *yaml_token_t, typ yaml_token_type_t) bool {
    +	var s []byte
    +
    +	// Eat the indicator character.
    +	start_mark := parser.mark
    +	skip(parser)
    +
    +	// Consume the value.
    +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +		return false
    +	}
    +
    +	for is_alpha(parser.buffer, parser.buffer_pos) {
    +		s = read(parser, s)
    +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +			return false
    +		}
    +	}
    +
    +	end_mark := parser.mark
    +
    +	/*
    +	 * Check if length of the anchor is greater than 0 and it is followed by
    +	 * a whitespace character or one of the indicators:
    +	 *
    +	 *      '?', ':', ',', ']', '}', '%', '@', '`'.
    +	 */
    +
    +	if len(s) == 0 ||
    +		!(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '?' ||
    +			parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == ',' ||
    +			parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '}' ||
    +			parser.buffer[parser.buffer_pos] == '%' || parser.buffer[parser.buffer_pos] == '@' ||
    +			parser.buffer[parser.buffer_pos] == '`') {
    +		context := "while scanning an alias"
    +		if typ == yaml_ANCHOR_TOKEN {
    +			context = "while scanning an anchor"
    +		}
    +		yaml_parser_set_scanner_error(parser, context, start_mark,
    +			"did not find expected alphabetic or numeric character")
    +		return false
    +	}
    +
    +	// Create a token.
    +	*token = yaml_token_t{
    +		typ:        typ,
    +		start_mark: start_mark,
    +		end_mark:   end_mark,
    +		value:      s,
    +	}
    +
    +	return true
    +}
    +
    +/*
    + * Scan a TAG token.
    + */
    +
    +func yaml_parser_scan_tag(parser *yaml_parser_t, token *yaml_token_t) bool {
    +	var handle, suffix []byte
    +
    +	start_mark := parser.mark
    +
    +	// Check if the tag is in the canonical form.
    +	if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
    +		return false
    +	}
    +
    +	if parser.buffer[parser.buffer_pos+1] == '<' {
    +		// Keep the handle as ''
    +
    +		// Eat '!<'
    +		skip(parser)
    +		skip(parser)
    +
    +		// Consume the tag value.
    +		if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) {
    +			return false
    +		}
    +
    +		// Check for '>' and eat it.
    +		if parser.buffer[parser.buffer_pos] != '>' {
    +			yaml_parser_set_scanner_error(parser, "while scanning a tag",
    +				start_mark, "did not find the expected '>'")
    +			return false
    +		}
    +
    +		skip(parser)
    +	} else {
    +		// The tag has either the '!suffix' or the '!handle!suffix' form.
    +
    +		// First, try to scan a handle.
    +		if !yaml_parser_scan_tag_handle(parser, false, start_mark, &handle) {
    +			return false
    +		}
    +
    +		// Check if it is, indeed, handle.
    +		if handle[0] == '!' && len(handle) > 1 && handle[len(handle)-1] == '!' {
    +			// Scan the suffix now.
    +			if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) {
    +				return false
    +			}
    +		} else {
    +			// It wasn't a handle after all.  Scan the rest of the tag.
    +			if !yaml_parser_scan_tag_uri(parser, false, handle, start_mark, &suffix) {
    +				return false
    +			}
    +
    +			// Set the handle to '!'.
    +			handle = []byte{'!'}
    +
    +			// A special case: the '!' tag.  Set the handle to '' and the
    +			// suffix to '!'.
    +			if len(suffix) == 0 {
    +				handle, suffix = suffix, handle
    +			}
    +		}
    +	}
    +
    +	// Check the character which ends the tag.
    +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +		return false
    +	}
    +	if !is_blankz(parser.buffer, parser.buffer_pos) {
    +		yaml_parser_set_scanner_error(parser, "while scanning a tag",
    +			start_mark, "did not find expected whitespace or line break")
    +		return false
    +	}
    +
    +	end_mark := parser.mark
    +
    +	// Create a token.
    +	*token = yaml_token_t{
    +		typ:        yaml_TAG_TOKEN,
    +		start_mark: start_mark,
    +		end_mark:   end_mark,
    +		value:      handle,
    +		suffix:     suffix,
    +	}
    +	return true
    +}
    +
    +// Scan a tag handle.
    +func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, handle *[]byte) bool {
    +	// Check the initial '!' character.
    +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +		return false
    +	}
    +	if parser.buffer[parser.buffer_pos] != '!' {
    +		yaml_parser_set_scanner_tag_error(parser, directive,
    +			start_mark, "did not find expected '!'")
    +		return false
    +	}
    +
    +	var s []byte
    +
    +	// Copy the '!' character.
    +	s = read(parser, s)
    +
    +	// Copy all subsequent alphabetical and numerical characters.
    +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +		return false
    +	}
    +	for is_alpha(parser.buffer, parser.buffer_pos) {
    +		s = read(parser, s)
    +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +			return false
    +		}
    +	}
    +
    +	// Check if the trailing character is '!' and copy it.
    +	if parser.buffer[parser.buffer_pos] == '!' {
    +		s = read(parser, s)
    +	} else {
    +		// It's either the '!' tag or not really a tag handle.  If it's a %TAG
    +		// directive, it's an error.  If it's a tag token, it must be a part of URI.
    +		if directive && !(s[0] == '!' && s[1] == 0) {
    +			yaml_parser_set_scanner_tag_error(parser, directive,
    +				start_mark, "did not find expected '!'")
    +			return false
    +		}
    +	}
    +
    +	*handle = s
    +	return true
    +}
    +
    +// Scan a tag.
    +func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte, start_mark yaml_mark_t, uri *[]byte) bool {
    +	//size_t length = head ? strlen((char *)head) : 0
    +	var s []byte
    +
    +	// Copy the head if needed.
    +	//
    +	// Note that we don't copy the leading '!' character.
    +	if len(head) > 1 {
    +		s = append(s, head[1:]...)
    +	}
    +
    +	// Scan the tag.
    +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +		return false
    +	}
    +
    +	// The set of characters that may appear in URI is as follows:
    +	//
    +	//      '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&',
    +	//      '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']',
    +	//      '%'.
    +	// [Go] Convert this into more reasonable logic.
    +	for is_alpha(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == ';' ||
    +		parser.buffer[parser.buffer_pos] == '/' || parser.buffer[parser.buffer_pos] == '?' ||
    +		parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '@' ||
    +		parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '=' ||
    +		parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '$' ||
    +		parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '.' ||
    +		parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '~' ||
    +		parser.buffer[parser.buffer_pos] == '*' || parser.buffer[parser.buffer_pos] == '\'' ||
    +		parser.buffer[parser.buffer_pos] == '(' || parser.buffer[parser.buffer_pos] == ')' ||
    +		parser.buffer[parser.buffer_pos] == '[' || parser.buffer[parser.buffer_pos] == ']' ||
    +		parser.buffer[parser.buffer_pos] == '%' {
    +		// Check if it is a URI-escape sequence.
    +		if parser.buffer[parser.buffer_pos] == '%' {
    +			if !yaml_parser_scan_uri_escapes(parser, directive, start_mark, &s) {
    +				return false
    +			}
    +		} else {
    +			s = read(parser, s)
    +		}
    +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +			return false
    +		}
    +	}
    +
    +	// Check if the tag is non-empty.
    +	if len(s) == 0 {
    +		yaml_parser_set_scanner_tag_error(parser, directive,
    +			start_mark, "did not find expected tag URI")
    +		return false
    +	}
    +	*uri = s
    +	return true
    +}
    +
    +// Decode an URI-escape sequence corresponding to a single UTF-8 character.
    +func yaml_parser_scan_uri_escapes(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, s *[]byte) bool {
    +
    +	// Decode the required number of characters.
    +	w := 1024
    +	for w > 0 {
    +		// Check for a URI-escaped octet.
    +		if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) {
    +			return false
    +		}
    +
    +		if !(parser.buffer[parser.buffer_pos] == '%' &&
    +			is_hex(parser.buffer, parser.buffer_pos+1) &&
    +			is_hex(parser.buffer, parser.buffer_pos+2)) {
    +			return yaml_parser_set_scanner_tag_error(parser, directive,
    +				start_mark, "did not find URI escaped octet")
    +		}
    +
    +		// Get the octet.
    +		octet := byte((as_hex(parser.buffer, parser.buffer_pos+1) << 4) + as_hex(parser.buffer, parser.buffer_pos+2))
    +
    +		// If it is the leading octet, determine the length of the UTF-8 sequence.
    +		if w == 1024 {
    +			w = width(octet)
    +			if w == 0 {
    +				return yaml_parser_set_scanner_tag_error(parser, directive,
    +					start_mark, "found an incorrect leading UTF-8 octet")
    +			}
    +		} else {
    +			// Check if the trailing octet is correct.
    +			if octet&0xC0 != 0x80 {
    +				return yaml_parser_set_scanner_tag_error(parser, directive,
    +					start_mark, "found an incorrect trailing UTF-8 octet")
    +			}
    +		}
    +
    +		// Copy the octet and move the pointers.
    +		*s = append(*s, octet)
    +		skip(parser)
    +		skip(parser)
    +		skip(parser)
    +		w--
    +	}
    +	return true
    +}
    +
    +// Scan a block scalar.
    +func yaml_parser_scan_block_scalar(parser *yaml_parser_t, token *yaml_token_t, literal bool) bool {
    +	// Eat the indicator '|' or '>'.
    +	start_mark := parser.mark
    +	skip(parser)
    +
    +	// Scan the additional block scalar indicators.
    +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +		return false
    +	}
    +
    +	// Check for a chomping indicator.
    +	var chomping, increment int
    +	if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' {
    +		// Set the chomping method and eat the indicator.
    +		if parser.buffer[parser.buffer_pos] == '+' {
    +			chomping = +1
    +		} else {
    +			chomping = -1
    +		}
    +		skip(parser)
    +
    +		// Check for an indentation indicator.
    +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +			return false
    +		}
    +		if is_digit(parser.buffer, parser.buffer_pos) {
    +			// Check that the indentation is greater than 0.
    +			if parser.buffer[parser.buffer_pos] == '0' {
    +				yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
    +					start_mark, "found an indentation indicator equal to 0")
    +				return false
    +			}
    +
    +			// Get the indentation level and eat the indicator.
    +			increment = as_digit(parser.buffer, parser.buffer_pos)
    +			skip(parser)
    +		}
    +
    +	} else if is_digit(parser.buffer, parser.buffer_pos) {
    +		// Do the same as above, but in the opposite order.
    +
    +		if parser.buffer[parser.buffer_pos] == '0' {
    +			yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
    +				start_mark, "found an indentation indicator equal to 0")
    +			return false
    +		}
    +		increment = as_digit(parser.buffer, parser.buffer_pos)
    +		skip(parser)
    +
    +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +			return false
    +		}
    +		if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' {
    +			if parser.buffer[parser.buffer_pos] == '+' {
    +				chomping = +1
    +			} else {
    +				chomping = -1
    +			}
    +			skip(parser)
    +		}
    +	}
    +
    +	// Eat whitespaces and comments to the end of the line.
    +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +		return false
    +	}
    +	for is_blank(parser.buffer, parser.buffer_pos) {
    +		skip(parser)
    +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +			return false
    +		}
    +	}
    +	if parser.buffer[parser.buffer_pos] == '#' {
    +		for !is_breakz(parser.buffer, parser.buffer_pos) {
    +			skip(parser)
    +			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +				return false
    +			}
    +		}
    +	}
    +
    +	// Check if we are at the end of the line.
    +	if !is_breakz(parser.buffer, parser.buffer_pos) {
    +		yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
    +			start_mark, "did not find expected comment or line break")
    +		return false
    +	}
    +
    +	// Eat a line break.
    +	if is_break(parser.buffer, parser.buffer_pos) {
    +		if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
    +			return false
    +		}
    +		skip_line(parser)
    +	}
    +
    +	end_mark := parser.mark
    +
    +	// Set the indentation level if it was specified.
    +	var indent int
    +	if increment > 0 {
    +		if parser.indent >= 0 {
    +			indent = parser.indent + increment
    +		} else {
    +			indent = increment
    +		}
    +	}
    +
    +	// Scan the leading line breaks and determine the indentation level if needed.
    +	var s, leading_break, trailing_breaks []byte
    +	if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) {
    +		return false
    +	}
    +
    +	// Scan the block scalar content.
    +	if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +		return false
    +	}
    +	var leading_blank, trailing_blank bool
    +	for parser.mark.column == indent && !is_z(parser.buffer, parser.buffer_pos) {
    +		// We are at the beginning of a non-empty line.
    +
    +		// Is it a trailing whitespace?
    +		trailing_blank = is_blank(parser.buffer, parser.buffer_pos)
    +
    +		// Check if we need to fold the leading line break.
    +		if !literal && !leading_blank && !trailing_blank && len(leading_break) > 0 && leading_break[0] == '\n' {
    +			// Do we need to join the lines by space?
    +			if len(trailing_breaks) == 0 {
    +				s = append(s, ' ')
    +			}
    +		} else {
    +			s = append(s, leading_break...)
    +		}
    +		leading_break = leading_break[:0]
    +
    +		// Append the remaining line breaks.
    +		s = append(s, trailing_breaks...)
    +		trailing_breaks = trailing_breaks[:0]
    +
    +		// Is it a leading whitespace?
    +		leading_blank = is_blank(parser.buffer, parser.buffer_pos)
    +
    +		// Consume the current line.
    +		for !is_breakz(parser.buffer, parser.buffer_pos) {
    +			s = read(parser, s)
    +			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +				return false
    +			}
    +		}
    +
    +		// Consume the line break.
    +		if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
    +			return false
    +		}
    +
    +		leading_break = read_line(parser, leading_break)
    +
    +		// Eat the following indentation spaces and line breaks.
    +		if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) {
    +			return false
    +		}
    +	}
    +
    +	// Chomp the tail.
    +	if chomping != -1 {
    +		s = append(s, leading_break...)
    +	}
    +	if chomping == 1 {
    +		s = append(s, trailing_breaks...)
    +	}
    +
    +	// Create a token.
    +	*token = yaml_token_t{
    +		typ:        yaml_SCALAR_TOKEN,
    +		start_mark: start_mark,
    +		end_mark:   end_mark,
    +		value:      s,
    +		style:      yaml_LITERAL_SCALAR_STYLE,
    +	}
    +	if !literal {
    +		token.style = yaml_FOLDED_SCALAR_STYLE
    +	}
    +	return true
    +}
    +
    +// Scan indentation spaces and line breaks for a block scalar.  Determine the
    +// indentation level if needed.
    +func yaml_parser_scan_block_scalar_breaks(parser *yaml_parser_t, indent *int, breaks *[]byte, start_mark yaml_mark_t, end_mark *yaml_mark_t) bool {
    +	*end_mark = parser.mark
    +
    +	// Eat the indentation spaces and line breaks.
    +	max_indent := 0
    +	for {
    +		// Eat the indentation spaces.
    +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +			return false
    +		}
    +		for (*indent == 0 || parser.mark.column < *indent) && is_space(parser.buffer, parser.buffer_pos) {
    +			skip(parser)
    +			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +				return false
    +			}
    +		}
    +		if parser.mark.column > max_indent {
    +			max_indent = parser.mark.column
    +		}
    +
    +		// Check for a tab character messing the indentation.
    +		if (*indent == 0 || parser.mark.column < *indent) && is_tab(parser.buffer, parser.buffer_pos) {
    +			return yaml_parser_set_scanner_error(parser, "while scanning a block scalar",
    +				start_mark, "found a tab character where an indentation space is expected")
    +		}
    +
    +		// Have we found a non-empty line?
    +		if !is_break(parser.buffer, parser.buffer_pos) {
    +			break
    +		}
    +
    +		// Consume the line break.
    +		if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
    +			return false
    +		}
    +		// [Go] Should really be returning breaks instead.
    +		*breaks = read_line(parser, *breaks)
    +		*end_mark = parser.mark
    +	}
    +
    +	// Determine the indentation level if needed.
    +	if *indent == 0 {
    +		*indent = max_indent
    +		if *indent < parser.indent+1 {
    +			*indent = parser.indent + 1
    +		}
    +		if *indent < 1 {
    +			*indent = 1
    +		}
    +	}
    +	return true
    +}
    +
    +// Scan a quoted scalar.
    +func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, single bool) bool {
    +	// Eat the left quote.
    +	start_mark := parser.mark
    +	skip(parser)
    +
    +	// Consume the content of the quoted scalar.
    +	var s, leading_break, trailing_breaks, whitespaces []byte
    +	for {
    +		// Check that there are no document indicators at the beginning of the line.
    +		if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
    +			return false
    +		}
    +
    +		if parser.mark.column == 0 &&
    +			((parser.buffer[parser.buffer_pos+0] == '-' &&
    +				parser.buffer[parser.buffer_pos+1] == '-' &&
    +				parser.buffer[parser.buffer_pos+2] == '-') ||
    +				(parser.buffer[parser.buffer_pos+0] == '.' &&
    +					parser.buffer[parser.buffer_pos+1] == '.' &&
    +					parser.buffer[parser.buffer_pos+2] == '.')) &&
    +			is_blankz(parser.buffer, parser.buffer_pos+3) {
    +			yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar",
    +				start_mark, "found unexpected document indicator")
    +			return false
    +		}
    +
    +		// Check for EOF.
    +		if is_z(parser.buffer, parser.buffer_pos) {
    +			yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar",
    +				start_mark, "found unexpected end of stream")
    +			return false
    +		}
    +
    +		// Consume non-blank characters.
    +		leading_blanks := false
    +		for !is_blankz(parser.buffer, parser.buffer_pos) {
    +			if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' {
    +				// Is is an escaped single quote.
    +				s = append(s, '\'')
    +				skip(parser)
    +				skip(parser)
    +
    +			} else if single && parser.buffer[parser.buffer_pos] == '\'' {
    +				// It is a right single quote.
    +				break
    +			} else if !single && parser.buffer[parser.buffer_pos] == '"' {
    +				// It is a right double quote.
    +				break
    +
    +			} else if !single && parser.buffer[parser.buffer_pos] == '\\' && is_break(parser.buffer, parser.buffer_pos+1) {
    +				// It is an escaped line break.
    +				if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) {
    +					return false
    +				}
    +				skip(parser)
    +				skip_line(parser)
    +				leading_blanks = true
    +				break
    +
    +			} else if !single && parser.buffer[parser.buffer_pos] == '\\' {
    +				// It is an escape sequence.
    +				code_length := 0
    +
    +				// Check the escape character.
    +				switch parser.buffer[parser.buffer_pos+1] {
    +				case '0':
    +					s = append(s, 0)
    +				case 'a':
    +					s = append(s, '\x07')
    +				case 'b':
    +					s = append(s, '\x08')
    +				case 't', '\t':
    +					s = append(s, '\x09')
    +				case 'n':
    +					s = append(s, '\x0A')
    +				case 'v':
    +					s = append(s, '\x0B')
    +				case 'f':
    +					s = append(s, '\x0C')
    +				case 'r':
    +					s = append(s, '\x0D')
    +				case 'e':
    +					s = append(s, '\x1B')
    +				case ' ':
    +					s = append(s, '\x20')
    +				case '"':
    +					s = append(s, '"')
    +				case '\'':
    +					s = append(s, '\'')
    +				case '\\':
    +					s = append(s, '\\')
    +				case 'N': // NEL (#x85)
    +					s = append(s, '\xC2')
    +					s = append(s, '\x85')
    +				case '_': // #xA0
    +					s = append(s, '\xC2')
    +					s = append(s, '\xA0')
    +				case 'L': // LS (#x2028)
    +					s = append(s, '\xE2')
    +					s = append(s, '\x80')
    +					s = append(s, '\xA8')
    +				case 'P': // PS (#x2029)
    +					s = append(s, '\xE2')
    +					s = append(s, '\x80')
    +					s = append(s, '\xA9')
    +				case 'x':
    +					code_length = 2
    +				case 'u':
    +					code_length = 4
    +				case 'U':
    +					code_length = 8
    +				default:
    +					yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
    +						start_mark, "found unknown escape character")
    +					return false
    +				}
    +
    +				skip(parser)
    +				skip(parser)
    +
    +				// Consume an arbitrary escape code.
    +				if code_length > 0 {
    +					var value int
    +
    +					// Scan the character value.
    +					if parser.unread < code_length && !yaml_parser_update_buffer(parser, code_length) {
    +						return false
    +					}
    +					for k := 0; k < code_length; k++ {
    +						if !is_hex(parser.buffer, parser.buffer_pos+k) {
    +							yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
    +								start_mark, "did not find expected hexdecimal number")
    +							return false
    +						}
    +						value = (value << 4) + as_hex(parser.buffer, parser.buffer_pos+k)
    +					}
    +
    +					// Check the value and write the character.
    +					if (value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF {
    +						yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar",
    +							start_mark, "found invalid Unicode character escape code")
    +						return false
    +					}
    +					if value <= 0x7F {
    +						s = append(s, byte(value))
    +					} else if value <= 0x7FF {
    +						s = append(s, byte(0xC0+(value>>6)))
    +						s = append(s, byte(0x80+(value&0x3F)))
    +					} else if value <= 0xFFFF {
    +						s = append(s, byte(0xE0+(value>>12)))
    +						s = append(s, byte(0x80+((value>>6)&0x3F)))
    +						s = append(s, byte(0x80+(value&0x3F)))
    +					} else {
    +						s = append(s, byte(0xF0+(value>>18)))
    +						s = append(s, byte(0x80+((value>>12)&0x3F)))
    +						s = append(s, byte(0x80+((value>>6)&0x3F)))
    +						s = append(s, byte(0x80+(value&0x3F)))
    +					}
    +
    +					// Advance the pointer.
    +					for k := 0; k < code_length; k++ {
    +						skip(parser)
    +					}
    +				}
    +			} else {
    +				// It is a non-escaped non-blank character.
    +				s = read(parser, s)
    +			}
    +			if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
    +				return false
    +			}
    +		}
    +
    +		// Check if we are at the end of the scalar.
    +		if single {
    +			if parser.buffer[parser.buffer_pos] == '\'' {
    +				break
    +			}
    +		} else {
    +			if parser.buffer[parser.buffer_pos] == '"' {
    +				break
    +			}
    +		}
    +
    +		// Consume blank characters.
    +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +			return false
    +		}
    +
    +		for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) {
    +			if is_blank(parser.buffer, parser.buffer_pos) {
    +				// Consume a space or a tab character.
    +				if !leading_blanks {
    +					whitespaces = read(parser, whitespaces)
    +				} else {
    +					skip(parser)
    +				}
    +			} else {
    +				if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
    +					return false
    +				}
    +
    +				// Check if it is a first line break.
    +				if !leading_blanks {
    +					whitespaces = whitespaces[:0]
    +					leading_break = read_line(parser, leading_break)
    +					leading_blanks = true
    +				} else {
    +					trailing_breaks = read_line(parser, trailing_breaks)
    +				}
    +			}
    +			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +				return false
    +			}
    +		}
    +
    +		// Join the whitespaces or fold line breaks.
    +		if leading_blanks {
    +			// Do we need to fold line breaks?
    +			if len(leading_break) > 0 && leading_break[0] == '\n' {
    +				if len(trailing_breaks) == 0 {
    +					s = append(s, ' ')
    +				} else {
    +					s = append(s, trailing_breaks...)
    +				}
    +			} else {
    +				s = append(s, leading_break...)
    +				s = append(s, trailing_breaks...)
    +			}
    +			trailing_breaks = trailing_breaks[:0]
    +			leading_break = leading_break[:0]
    +		} else {
    +			s = append(s, whitespaces...)
    +			whitespaces = whitespaces[:0]
    +		}
    +	}
    +
    +	// Eat the right quote.
    +	skip(parser)
    +	end_mark := parser.mark
    +
    +	// Create a token.
    +	*token = yaml_token_t{
    +		typ:        yaml_SCALAR_TOKEN,
    +		start_mark: start_mark,
    +		end_mark:   end_mark,
    +		value:      s,
    +		style:      yaml_SINGLE_QUOTED_SCALAR_STYLE,
    +	}
    +	if !single {
    +		token.style = yaml_DOUBLE_QUOTED_SCALAR_STYLE
    +	}
    +	return true
    +}
    +
    +// Scan a plain scalar.
    +func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) bool {
    +
    +	var s, leading_break, trailing_breaks, whitespaces []byte
    +	var leading_blanks bool
    +	var indent = parser.indent + 1
    +
    +	start_mark := parser.mark
    +	end_mark := parser.mark
    +
    +	// Consume the content of the plain scalar.
    +	for {
    +		// Check for a document indicator.
    +		if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) {
    +			return false
    +		}
    +		if parser.mark.column == 0 &&
    +			((parser.buffer[parser.buffer_pos+0] == '-' &&
    +				parser.buffer[parser.buffer_pos+1] == '-' &&
    +				parser.buffer[parser.buffer_pos+2] == '-') ||
    +				(parser.buffer[parser.buffer_pos+0] == '.' &&
    +					parser.buffer[parser.buffer_pos+1] == '.' &&
    +					parser.buffer[parser.buffer_pos+2] == '.')) &&
    +			is_blankz(parser.buffer, parser.buffer_pos+3) {
    +			break
    +		}
    +
    +		// Check for a comment.
    +		if parser.buffer[parser.buffer_pos] == '#' {
    +			break
    +		}
    +
    +		// Consume non-blank characters.
    +		for !is_blankz(parser.buffer, parser.buffer_pos) {
    +
    +			// Check for 'x:x' in the flow context. TODO: Fix the test "spec-08-13".
    +			if parser.flow_level > 0 &&
    +				parser.buffer[parser.buffer_pos] == ':' &&
    +				!is_blankz(parser.buffer, parser.buffer_pos+1) {
    +				yaml_parser_set_scanner_error(parser, "while scanning a plain scalar",
    +					start_mark, "found unexpected ':'")
    +				return false
    +			}
    +
    +			// Check for indicators that may end a plain scalar.
    +			if (parser.buffer[parser.buffer_pos] == ':' && is_blankz(parser.buffer, parser.buffer_pos+1)) ||
    +				(parser.flow_level > 0 &&
    +					(parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == ':' ||
    +						parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == '[' ||
    +						parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' ||
    +						parser.buffer[parser.buffer_pos] == '}')) {
    +				break
    +			}
    +
    +			// Check if we need to join whitespaces and breaks.
    +			if leading_blanks || len(whitespaces) > 0 {
    +				if leading_blanks {
    +					// Do we need to fold line breaks?
    +					if leading_break[0] == '\n' {
    +						if len(trailing_breaks) == 0 {
    +							s = append(s, ' ')
    +						} else {
    +							s = append(s, trailing_breaks...)
    +						}
    +					} else {
    +						s = append(s, leading_break...)
    +						s = append(s, trailing_breaks...)
    +					}
    +					trailing_breaks = trailing_breaks[:0]
    +					leading_break = leading_break[:0]
    +					leading_blanks = false
    +				} else {
    +					s = append(s, whitespaces...)
    +					whitespaces = whitespaces[:0]
    +				}
    +			}
    +
    +			// Copy the character.
    +			s = read(parser, s)
    +
    +			end_mark = parser.mark
    +			if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
    +				return false
    +			}
    +		}
    +
    +		// Is it the end?
    +		if !(is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos)) {
    +			break
    +		}
    +
    +		// Consume blank characters.
    +		if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +			return false
    +		}
    +
    +		for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) {
    +			if is_blank(parser.buffer, parser.buffer_pos) {
    +
    +				// Check for tab character that abuse indentation.
    +				if leading_blanks && parser.mark.column < indent && is_tab(parser.buffer, parser.buffer_pos) {
    +					yaml_parser_set_scanner_error(parser, "while scanning a plain scalar",
    +						start_mark, "found a tab character that violate indentation")
    +					return false
    +				}
    +
    +				// Consume a space or a tab character.
    +				if !leading_blanks {
    +					whitespaces = read(parser, whitespaces)
    +				} else {
    +					skip(parser)
    +				}
    +			} else {
    +				if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) {
    +					return false
    +				}
    +
    +				// Check if it is a first line break.
    +				if !leading_blanks {
    +					whitespaces = whitespaces[:0]
    +					leading_break = read_line(parser, leading_break)
    +					leading_blanks = true
    +				} else {
    +					trailing_breaks = read_line(parser, trailing_breaks)
    +				}
    +			}
    +			if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
    +				return false
    +			}
    +		}
    +
    +		// Check indentation level.
    +		if parser.flow_level == 0 && parser.mark.column < indent {
    +			break
    +		}
    +	}
    +
    +	// Create a token.
    +	*token = yaml_token_t{
    +		typ:        yaml_SCALAR_TOKEN,
    +		start_mark: start_mark,
    +		end_mark:   end_mark,
    +		value:      s,
    +		style:      yaml_PLAIN_SCALAR_STYLE,
    +	}
    +
    +	// Note that we change the 'simple_key_allowed' flag.
    +	if leading_blanks {
    +		parser.simple_key_allowed = true
    +	}
    +	return true
    +}
    diff --git a/vendor/gopkg.in/yaml.v2/sorter.go b/vendor/gopkg.in/yaml.v2/sorter.go
    new file mode 100644
    index 0000000000..5958822f9c
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/sorter.go
    @@ -0,0 +1,104 @@
    +package yaml
    +
    +import (
    +	"reflect"
    +	"unicode"
    +)
    +
    +type keyList []reflect.Value
    +
    +func (l keyList) Len() int      { return len(l) }
    +func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
    +func (l keyList) Less(i, j int) bool {
    +	a := l[i]
    +	b := l[j]
    +	ak := a.Kind()
    +	bk := b.Kind()
    +	for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() {
    +		a = a.Elem()
    +		ak = a.Kind()
    +	}
    +	for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() {
    +		b = b.Elem()
    +		bk = b.Kind()
    +	}
    +	af, aok := keyFloat(a)
    +	bf, bok := keyFloat(b)
    +	if aok && bok {
    +		if af != bf {
    +			return af < bf
    +		}
    +		if ak != bk {
    +			return ak < bk
    +		}
    +		return numLess(a, b)
    +	}
    +	if ak != reflect.String || bk != reflect.String {
    +		return ak < bk
    +	}
    +	ar, br := []rune(a.String()), []rune(b.String())
    +	for i := 0; i < len(ar) && i < len(br); i++ {
    +		if ar[i] == br[i] {
    +			continue
    +		}
    +		al := unicode.IsLetter(ar[i])
    +		bl := unicode.IsLetter(br[i])
    +		if al && bl {
    +			return ar[i] < br[i]
    +		}
    +		if al || bl {
    +			return bl
    +		}
    +		var ai, bi int
    +		var an, bn int64
    +		for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ {
    +			an = an*10 + int64(ar[ai]-'0')
    +		}
    +		for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ {
    +			bn = bn*10 + int64(br[bi]-'0')
    +		}
    +		if an != bn {
    +			return an < bn
    +		}
    +		if ai != bi {
    +			return ai < bi
    +		}
    +		return ar[i] < br[i]
    +	}
    +	return len(ar) < len(br)
    +}
    +
    +// keyFloat returns a float value for v if it is a number/bool
    +// and whether it is a number/bool or not.
    +func keyFloat(v reflect.Value) (f float64, ok bool) {
    +	switch v.Kind() {
    +	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
    +		return float64(v.Int()), true
    +	case reflect.Float32, reflect.Float64:
    +		return v.Float(), true
    +	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
    +		return float64(v.Uint()), true
    +	case reflect.Bool:
    +		if v.Bool() {
    +			return 1, true
    +		}
    +		return 0, true
    +	}
    +	return 0, false
    +}
    +
    +// numLess returns whether a < b.
    +// a and b must necessarily have the same kind.
    +func numLess(a, b reflect.Value) bool {
    +	switch a.Kind() {
    +	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
    +		return a.Int() < b.Int()
    +	case reflect.Float32, reflect.Float64:
    +		return a.Float() < b.Float()
    +	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
    +		return a.Uint() < b.Uint()
    +	case reflect.Bool:
    +		return !a.Bool() && b.Bool()
    +	}
    +	panic("not a number")
    +}
    diff --git a/vendor/gopkg.in/yaml.v2/suite_test.go b/vendor/gopkg.in/yaml.v2/suite_test.go
    new file mode 100644
    index 0000000000..c5cf1ed4f6
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/suite_test.go
    @@ -0,0 +1,12 @@
    +package yaml_test
    +
    +import (
    +	. "gopkg.in/check.v1"
    +	"testing"
    +)
    +
    +func Test(t *testing.T) { TestingT(t) }
    +
    +type S struct{}
    +
    +var _ = Suite(&S{})
    diff --git a/vendor/gopkg.in/yaml.v2/writerc.go b/vendor/gopkg.in/yaml.v2/writerc.go
    new file mode 100644
    index 0000000000..190362f25d
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/writerc.go
    @@ -0,0 +1,89 @@
    +package yaml
    +
    +// Set the writer error and return false.
    +func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool {
    +	emitter.error = yaml_WRITER_ERROR
    +	emitter.problem = problem
    +	return false
    +}
    +
    +// Flush the output buffer.
    +func yaml_emitter_flush(emitter *yaml_emitter_t) bool {
    +	if emitter.write_handler == nil {
    +		panic("write handler not set")
    +	}
    +
    +	// Check if the buffer is empty.
    +	if emitter.buffer_pos == 0 {
    +		return true
    +	}
    +
    +	// If the output encoding is UTF-8, we don't need to recode the buffer.
    +	if emitter.encoding == yaml_UTF8_ENCODING {
    +		if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil {
    +			return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error())
    +		}
    +		emitter.buffer_pos = 0
    +		return true
    +	}
    +
    +	// Recode the buffer into the raw buffer.
    +	var low, high int
    +	if emitter.encoding == yaml_UTF16LE_ENCODING {
    +		low, high = 0, 1
    +	} else {
    +		high, low = 1, 0
    +	}
    +
    +	pos := 0
    +	for pos < emitter.buffer_pos {
    +		// See the "reader.c" code for more details on UTF-8 encoding.  Note
    +		// that we assume that the buffer contains a valid UTF-8 sequence.
    +
    +		// Read the next UTF-8 character.
    +		octet := emitter.buffer[pos]
    +
    +		var w int
    +		var value rune
    +		switch {
    +		case octet&0x80 == 0x00:
    +			w, value = 1, rune(octet&0x7F)
    +		case octet&0xE0 == 0xC0:
    +			w, value = 2, rune(octet&0x1F)
    +		case octet&0xF0 == 0xE0:
    +			w, value = 3, rune(octet&0x0F)
    +		case octet&0xF8 == 0xF0:
    +			w, value = 4, rune(octet&0x07)
    +		}
    +		for k := 1; k < w; k++ {
    +			octet = emitter.buffer[pos+k]
    +			value = (value << 6) + (rune(octet) & 0x3F)
    +		}
    +		pos += w
    +
    +		// Write the character.
    +		if value < 0x10000 {
    +			var b [2]byte
    +			b[high] = byte(value >> 8)
    +			b[low] = byte(value & 0xFF)
    +			emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1])
    +		} else {
    +			// Write the character using a surrogate pair (check "reader.c").
    +			var b [4]byte
    +			value -= 0x10000
    +			b[high] = byte(0xD8 + (value >> 18))
    +			b[low] = byte((value >> 10) & 0xFF)
    +			b[high+2] = byte(0xDC + ((value >> 8) & 0xFF))
    +			b[low+2] = byte(value & 0xFF)
    +			emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1], b[2], b[3])
    +		}
    +	}
    +
    +	// Write the raw buffer.
    +	if err := emitter.write_handler(emitter, emitter.raw_buffer); err != nil {
    +		return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error())
    +	}
    +	emitter.buffer_pos = 0
    +	emitter.raw_buffer = emitter.raw_buffer[:0]
    +	return true
    +}
    diff --git a/vendor/gopkg.in/yaml.v2/yaml.go b/vendor/gopkg.in/yaml.v2/yaml.go
    new file mode 100644
    index 0000000000..36d6b883a6
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/yaml.go
    @@ -0,0 +1,346 @@
    +// Package yaml implements YAML support for the Go language.
    +//
    +// Source code and other details for the project are available at GitHub:
    +//
    +//   https://github.com/go-yaml/yaml
    +//
    +package yaml
    +
    +import (
    +	"errors"
    +	"fmt"
    +	"reflect"
    +	"strings"
    +	"sync"
    +)
    +
    +// MapSlice encodes and decodes as a YAML map.
    +// The order of keys is preserved when encoding and decoding.
    +type MapSlice []MapItem
    +
    +// MapItem is an item in a MapSlice.
    +type MapItem struct {
    +	Key, Value interface{}
    +}
    +
    +// The Unmarshaler interface may be implemented by types to customize their
    +// behavior when being unmarshaled from a YAML document. The UnmarshalYAML
    +// method receives a function that may be called to unmarshal the original
    +// YAML value into a field or variable. It is safe to call the unmarshal
    +// function parameter more than once if necessary.
    +type Unmarshaler interface {
    +	UnmarshalYAML(unmarshal func(interface{}) error) error
    +}
    +
    +// The Marshaler interface may be implemented by types to customize their
    +// behavior when being marshaled into a YAML document. The returned value
    +// is marshaled in place of the original value implementing Marshaler.
    +//
    +// If an error is returned by MarshalYAML, the marshaling procedure stops
    +// and returns with the provided error.
    +type Marshaler interface {
    +	MarshalYAML() (interface{}, error)
    +}
    +
    +// Unmarshal decodes the first document found within the in byte slice
    +// and assigns decoded values into the out value.
    +//
    +// Maps and pointers (to a struct, string, int, etc) are accepted as out
    +// values. If an internal pointer within a struct is not initialized,
    +// the yaml package will initialize it if necessary for unmarshalling
    +// the provided data. The out parameter must not be nil.
    +//
    +// The type of the decoded values should be compatible with the respective
    +// values in out. If one or more values cannot be decoded due to a type
    +// mismatches, decoding continues partially until the end of the YAML
    +// content, and a *yaml.TypeError is returned with details for all
    +// missed values.
    +//
    +// Struct fields are only unmarshalled if they are exported (have an
    +// upper case first letter), and are unmarshalled using the field name
    +// lowercased as the default key. Custom keys may be defined via the
    +// "yaml" name in the field tag: the content preceding the first comma
    +// is used as the key, and the following comma-separated options are
    +// used to tweak the marshalling process (see Marshal).
    +// Conflicting names result in a runtime error.
    +//
    +// For example:
    +//
    +//     type T struct {
    +//         F int `yaml:"a,omitempty"`
    +//         B int
    +//     }
    +//     var t T
    +//     yaml.Unmarshal([]byte("a: 1\nb: 2"), &t)
    +//
    +// See the documentation of Marshal for the format of tags and a list of
    +// supported tag options.
    +//
    +func Unmarshal(in []byte, out interface{}) (err error) {
    +	defer handleErr(&err)
    +	d := newDecoder()
    +	p := newParser(in)
    +	defer p.destroy()
    +	node := p.parse()
    +	if node != nil {
    +		v := reflect.ValueOf(out)
    +		if v.Kind() == reflect.Ptr && !v.IsNil() {
    +			v = v.Elem()
    +		}
    +		d.unmarshal(node, v)
    +	}
    +	if len(d.terrors) > 0 {
    +		return &TypeError{d.terrors}
    +	}
    +	return nil
    +}
    +
    +// Marshal serializes the value provided into a YAML document. The structure
    +// of the generated document will reflect the structure of the value itself.
    +// Maps and pointers (to struct, string, int, etc) are accepted as the in value.
    +//
    +// Struct fields are only unmarshalled if they are exported (have an upper case
    +// first letter), and are unmarshalled using the field name lowercased as the
    +// default key. Custom keys may be defined via the "yaml" name in the field
    +// tag: the content preceding the first comma is used as the key, and the
    +// following comma-separated options are used to tweak the marshalling process.
    +// Conflicting names result in a runtime error.
    +//
    +// The field tag format accepted is:
    +//
    +//     `(...) yaml:"[][,[,]]" (...)`
    +//
    +// The following flags are currently supported:
    +//
    +//     omitempty    Only include the field if it's not set to the zero
    +//                  value for the type or to empty slices or maps.
    +//                  Does not apply to zero valued structs.
    +//
    +//     flow         Marshal using a flow style (useful for structs,
    +//                  sequences and maps).
    +//
    +//     inline       Inline the field, which must be a struct or a map,
    +//                  causing all of its fields or keys to be processed as if
    +//                  they were part of the outer struct. For maps, keys must
    +//                  not conflict with the yaml keys of other struct fields.
    +//
    +// In addition, if the key is "-", the field is ignored.
    +//
    +// For example:
    +//
    +//     type T struct {
    +//         F int "a,omitempty"
    +//         B int
    +//     }
    +//     yaml.Marshal(&T{B: 2}) // Returns "b: 2\n"
    +//     yaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n"
    +//
    +func Marshal(in interface{}) (out []byte, err error) {
    +	defer handleErr(&err)
    +	e := newEncoder()
    +	defer e.destroy()
    +	e.marshal("", reflect.ValueOf(in))
    +	e.finish()
    +	out = e.out
    +	return
    +}
    +
    +func handleErr(err *error) {
    +	if v := recover(); v != nil {
    +		if e, ok := v.(yamlError); ok {
    +			*err = e.err
    +		} else {
    +			panic(v)
    +		}
    +	}
    +}
    +
    +type yamlError struct {
    +	err error
    +}
    +
    +func fail(err error) {
    +	panic(yamlError{err})
    +}
    +
    +func failf(format string, args ...interface{}) {
    +	panic(yamlError{fmt.Errorf("yaml: "+format, args...)})
    +}
    +
    +// A TypeError is returned by Unmarshal when one or more fields in
    +// the YAML document cannot be properly decoded into the requested
    +// types. When this error is returned, the value is still
    +// unmarshaled partially.
    +type TypeError struct {
    +	Errors []string
    +}
    +
    +func (e *TypeError) Error() string {
    +	return fmt.Sprintf("yaml: unmarshal errors:\n  %s", strings.Join(e.Errors, "\n  "))
    +}
    +
    +// --------------------------------------------------------------------------
    +// Maintain a mapping of keys to structure field indexes
    +
    +// The code in this section was copied from mgo/bson.
    +
    +// structInfo holds details for the serialization of fields of
    +// a given struct.
    +type structInfo struct {
    +	FieldsMap  map[string]fieldInfo
    +	FieldsList []fieldInfo
    +
    +	// InlineMap is the number of the field in the struct that
    +	// contains an ,inline map, or -1 if there's none.
    +	InlineMap int
    +}
    +
    +type fieldInfo struct {
    +	Key       string
    +	Num       int
    +	OmitEmpty bool
    +	Flow      bool
    +
    +	// Inline holds the field index if the field is part of an inlined struct.
    +	Inline []int
    +}
    +
    +var structMap = make(map[reflect.Type]*structInfo)
    +var fieldMapMutex sync.RWMutex
    +
    +func getStructInfo(st reflect.Type) (*structInfo, error) {
    +	fieldMapMutex.RLock()
    +	sinfo, found := structMap[st]
    +	fieldMapMutex.RUnlock()
    +	if found {
    +		return sinfo, nil
    +	}
    +
    +	n := st.NumField()
    +	fieldsMap := make(map[string]fieldInfo)
    +	fieldsList := make([]fieldInfo, 0, n)
    +	inlineMap := -1
    +	for i := 0; i != n; i++ {
    +		field := st.Field(i)
    +		if field.PkgPath != "" && !field.Anonymous {
    +			continue // Private field
    +		}
    +
    +		info := fieldInfo{Num: i}
    +
    +		tag := field.Tag.Get("yaml")
    +		if tag == "" && strings.Index(string(field.Tag), ":") < 0 {
    +			tag = string(field.Tag)
    +		}
    +		if tag == "-" {
    +			continue
    +		}
    +
    +		inline := false
    +		fields := strings.Split(tag, ",")
    +		if len(fields) > 1 {
    +			for _, flag := range fields[1:] {
    +				switch flag {
    +				case "omitempty":
    +					info.OmitEmpty = true
    +				case "flow":
    +					info.Flow = true
    +				case "inline":
    +					inline = true
    +				default:
    +					return nil, errors.New(fmt.Sprintf("Unsupported flag %q in tag %q of type %s", flag, tag, st))
    +				}
    +			}
    +			tag = fields[0]
    +		}
    +
    +		if inline {
    +			switch field.Type.Kind() {
    +			case reflect.Map:
    +				if inlineMap >= 0 {
    +					return nil, errors.New("Multiple ,inline maps in struct " + st.String())
    +				}
    +				if field.Type.Key() != reflect.TypeOf("") {
    +					return nil, errors.New("Option ,inline needs a map with string keys in struct " + st.String())
    +				}
    +				inlineMap = info.Num
    +			case reflect.Struct:
    +				sinfo, err := getStructInfo(field.Type)
    +				if err != nil {
    +					return nil, err
    +				}
    +				for _, finfo := range sinfo.FieldsList {
    +					if _, found := fieldsMap[finfo.Key]; found {
    +						msg := "Duplicated key '" + finfo.Key + "' in struct " + st.String()
    +						return nil, errors.New(msg)
    +					}
    +					if finfo.Inline == nil {
    +						finfo.Inline = []int{i, finfo.Num}
    +					} else {
    +						finfo.Inline = append([]int{i}, finfo.Inline...)
    +					}
    +					fieldsMap[finfo.Key] = finfo
    +					fieldsList = append(fieldsList, finfo)
    +				}
    +			default:
    +				//return nil, errors.New("Option ,inline needs a struct value or map field")
    +				return nil, errors.New("Option ,inline needs a struct value field")
    +			}
    +			continue
    +		}
    +
    +		if tag != "" {
    +			info.Key = tag
    +		} else {
    +			info.Key = strings.ToLower(field.Name)
    +		}
    +
    +		if _, found = fieldsMap[info.Key]; found {
    +			msg := "Duplicated key '" + info.Key + "' in struct " + st.String()
    +			return nil, errors.New(msg)
    +		}
    +
    +		fieldsList = append(fieldsList, info)
    +		fieldsMap[info.Key] = info
    +	}
    +
    +	sinfo = &structInfo{fieldsMap, fieldsList, inlineMap}
    +
    +	fieldMapMutex.Lock()
    +	structMap[st] = sinfo
    +	fieldMapMutex.Unlock()
    +	return sinfo, nil
    +}
    +
    +func isZero(v reflect.Value) bool {
    +	switch v.Kind() {
    +	case reflect.String:
    +		return len(v.String()) == 0
    +	case reflect.Interface, reflect.Ptr:
    +		return v.IsNil()
    +	case reflect.Slice:
    +		return v.Len() == 0
    +	case reflect.Map:
    +		return v.Len() == 0
    +	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
    +		return v.Int() == 0
    +	case reflect.Float32, reflect.Float64:
    +		return v.Float() == 0
    +	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
    +		return v.Uint() == 0
    +	case reflect.Bool:
    +		return !v.Bool()
    +	case reflect.Struct:
    +		vt := v.Type()
    +		for i := v.NumField() - 1; i >= 0; i-- {
    +			if vt.Field(i).PkgPath != "" {
    +				continue // Private field
    +			}
    +			if !isZero(v.Field(i)) {
    +				return false
    +			}
    +		}
    +		return true
    +	}
    +	return false
    +}
    diff --git a/vendor/gopkg.in/yaml.v2/yamlh.go b/vendor/gopkg.in/yaml.v2/yamlh.go
    new file mode 100644
    index 0000000000..d60a6b6b00
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/yamlh.go
    @@ -0,0 +1,716 @@
    +package yaml
    +
    +import (
    +	"io"
    +)
    +
    +// The version directive data.
    +type yaml_version_directive_t struct {
    +	major int8 // The major version number.
    +	minor int8 // The minor version number.
    +}
    +
    +// The tag directive data.
    +type yaml_tag_directive_t struct {
    +	handle []byte // The tag handle.
    +	prefix []byte // The tag prefix.
    +}
    +
    +type yaml_encoding_t int
    +
    +// The stream encoding.
    +const (
    +	// Let the parser choose the encoding.
    +	yaml_ANY_ENCODING yaml_encoding_t = iota
    +
    +	yaml_UTF8_ENCODING    // The default UTF-8 encoding.
    +	yaml_UTF16LE_ENCODING // The UTF-16-LE encoding with BOM.
    +	yaml_UTF16BE_ENCODING // The UTF-16-BE encoding with BOM.
    +)
    +
    +type yaml_break_t int
    +
    +// Line break types.
    +const (
    +	// Let the parser choose the break type.
    +	yaml_ANY_BREAK yaml_break_t = iota
    +
    +	yaml_CR_BREAK   // Use CR for line breaks (Mac style).
    +	yaml_LN_BREAK   // Use LN for line breaks (Unix style).
    +	yaml_CRLN_BREAK // Use CR LN for line breaks (DOS style).
    +)
    +
    +type yaml_error_type_t int
    +
    +// Many bad things could happen with the parser and emitter.
    +const (
    +	// No error is produced.
    +	yaml_NO_ERROR yaml_error_type_t = iota
    +
    +	yaml_MEMORY_ERROR   // Cannot allocate or reallocate a block of memory.
    +	yaml_READER_ERROR   // Cannot read or decode the input stream.
    +	yaml_SCANNER_ERROR  // Cannot scan the input stream.
    +	yaml_PARSER_ERROR   // Cannot parse the input stream.
    +	yaml_COMPOSER_ERROR // Cannot compose a YAML document.
    +	yaml_WRITER_ERROR   // Cannot write to the output stream.
    +	yaml_EMITTER_ERROR  // Cannot emit a YAML stream.
    +)
    +
    +// The pointer position.
    +type yaml_mark_t struct {
    +	index  int // The position index.
    +	line   int // The position line.
    +	column int // The position column.
    +}
    +
    +// Node Styles
    +
    +type yaml_style_t int8
    +
    +type yaml_scalar_style_t yaml_style_t
    +
    +// Scalar styles.
    +const (
    +	// Let the emitter choose the style.
    +	yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = iota
    +
    +	yaml_PLAIN_SCALAR_STYLE         // The plain scalar style.
    +	yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style.
    +	yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style.
    +	yaml_LITERAL_SCALAR_STYLE       // The literal scalar style.
    +	yaml_FOLDED_SCALAR_STYLE        // The folded scalar style.
    +)
    +
    +type yaml_sequence_style_t yaml_style_t
    +
    +// Sequence styles.
    +const (
    +	// Let the emitter choose the style.
    +	yaml_ANY_SEQUENCE_STYLE yaml_sequence_style_t = iota
    +
    +	yaml_BLOCK_SEQUENCE_STYLE // The block sequence style.
    +	yaml_FLOW_SEQUENCE_STYLE  // The flow sequence style.
    +)
    +
    +type yaml_mapping_style_t yaml_style_t
    +
    +// Mapping styles.
    +const (
    +	// Let the emitter choose the style.
    +	yaml_ANY_MAPPING_STYLE yaml_mapping_style_t = iota
    +
    +	yaml_BLOCK_MAPPING_STYLE // The block mapping style.
    +	yaml_FLOW_MAPPING_STYLE  // The flow mapping style.
    +)
    +
    +// Tokens
    +
    +type yaml_token_type_t int
    +
    +// Token types.
    +const (
    +	// An empty token.
    +	yaml_NO_TOKEN yaml_token_type_t = iota
    +
    +	yaml_STREAM_START_TOKEN // A STREAM-START token.
    +	yaml_STREAM_END_TOKEN   // A STREAM-END token.
    +
    +	yaml_VERSION_DIRECTIVE_TOKEN // A VERSION-DIRECTIVE token.
    +	yaml_TAG_DIRECTIVE_TOKEN     // A TAG-DIRECTIVE token.
    +	yaml_DOCUMENT_START_TOKEN    // A DOCUMENT-START token.
    +	yaml_DOCUMENT_END_TOKEN      // A DOCUMENT-END token.
    +
    +	yaml_BLOCK_SEQUENCE_START_TOKEN // A BLOCK-SEQUENCE-START token.
    +	yaml_BLOCK_MAPPING_START_TOKEN  // A BLOCK-SEQUENCE-END token.
    +	yaml_BLOCK_END_TOKEN            // A BLOCK-END token.
    +
    +	yaml_FLOW_SEQUENCE_START_TOKEN // A FLOW-SEQUENCE-START token.
    +	yaml_FLOW_SEQUENCE_END_TOKEN   // A FLOW-SEQUENCE-END token.
    +	yaml_FLOW_MAPPING_START_TOKEN  // A FLOW-MAPPING-START token.
    +	yaml_FLOW_MAPPING_END_TOKEN    // A FLOW-MAPPING-END token.
    +
    +	yaml_BLOCK_ENTRY_TOKEN // A BLOCK-ENTRY token.
    +	yaml_FLOW_ENTRY_TOKEN  // A FLOW-ENTRY token.
    +	yaml_KEY_TOKEN         // A KEY token.
    +	yaml_VALUE_TOKEN       // A VALUE token.
    +
    +	yaml_ALIAS_TOKEN  // An ALIAS token.
    +	yaml_ANCHOR_TOKEN // An ANCHOR token.
    +	yaml_TAG_TOKEN    // A TAG token.
    +	yaml_SCALAR_TOKEN // A SCALAR token.
    +)
    +
    +func (tt yaml_token_type_t) String() string {
    +	switch tt {
    +	case yaml_NO_TOKEN:
    +		return "yaml_NO_TOKEN"
    +	case yaml_STREAM_START_TOKEN:
    +		return "yaml_STREAM_START_TOKEN"
    +	case yaml_STREAM_END_TOKEN:
    +		return "yaml_STREAM_END_TOKEN"
    +	case yaml_VERSION_DIRECTIVE_TOKEN:
    +		return "yaml_VERSION_DIRECTIVE_TOKEN"
    +	case yaml_TAG_DIRECTIVE_TOKEN:
    +		return "yaml_TAG_DIRECTIVE_TOKEN"
    +	case yaml_DOCUMENT_START_TOKEN:
    +		return "yaml_DOCUMENT_START_TOKEN"
    +	case yaml_DOCUMENT_END_TOKEN:
    +		return "yaml_DOCUMENT_END_TOKEN"
    +	case yaml_BLOCK_SEQUENCE_START_TOKEN:
    +		return "yaml_BLOCK_SEQUENCE_START_TOKEN"
    +	case yaml_BLOCK_MAPPING_START_TOKEN:
    +		return "yaml_BLOCK_MAPPING_START_TOKEN"
    +	case yaml_BLOCK_END_TOKEN:
    +		return "yaml_BLOCK_END_TOKEN"
    +	case yaml_FLOW_SEQUENCE_START_TOKEN:
    +		return "yaml_FLOW_SEQUENCE_START_TOKEN"
    +	case yaml_FLOW_SEQUENCE_END_TOKEN:
    +		return "yaml_FLOW_SEQUENCE_END_TOKEN"
    +	case yaml_FLOW_MAPPING_START_TOKEN:
    +		return "yaml_FLOW_MAPPING_START_TOKEN"
    +	case yaml_FLOW_MAPPING_END_TOKEN:
    +		return "yaml_FLOW_MAPPING_END_TOKEN"
    +	case yaml_BLOCK_ENTRY_TOKEN:
    +		return "yaml_BLOCK_ENTRY_TOKEN"
    +	case yaml_FLOW_ENTRY_TOKEN:
    +		return "yaml_FLOW_ENTRY_TOKEN"
    +	case yaml_KEY_TOKEN:
    +		return "yaml_KEY_TOKEN"
    +	case yaml_VALUE_TOKEN:
    +		return "yaml_VALUE_TOKEN"
    +	case yaml_ALIAS_TOKEN:
    +		return "yaml_ALIAS_TOKEN"
    +	case yaml_ANCHOR_TOKEN:
    +		return "yaml_ANCHOR_TOKEN"
    +	case yaml_TAG_TOKEN:
    +		return "yaml_TAG_TOKEN"
    +	case yaml_SCALAR_TOKEN:
    +		return "yaml_SCALAR_TOKEN"
    +	}
    +	return ""
    +}
    +
    +// The token structure.
    +type yaml_token_t struct {
    +	// The token type.
    +	typ yaml_token_type_t
    +
    +	// The start/end of the token.
    +	start_mark, end_mark yaml_mark_t
    +
    +	// The stream encoding (for yaml_STREAM_START_TOKEN).
    +	encoding yaml_encoding_t
    +
    +	// The alias/anchor/scalar value or tag/tag directive handle
    +	// (for yaml_ALIAS_TOKEN, yaml_ANCHOR_TOKEN, yaml_SCALAR_TOKEN, yaml_TAG_TOKEN, yaml_TAG_DIRECTIVE_TOKEN).
    +	value []byte
    +
    +	// The tag suffix (for yaml_TAG_TOKEN).
    +	suffix []byte
    +
    +	// The tag directive prefix (for yaml_TAG_DIRECTIVE_TOKEN).
    +	prefix []byte
    +
    +	// The scalar style (for yaml_SCALAR_TOKEN).
    +	style yaml_scalar_style_t
    +
    +	// The version directive major/minor (for yaml_VERSION_DIRECTIVE_TOKEN).
    +	major, minor int8
    +}
    +
    +// Events
    +
    +type yaml_event_type_t int8
    +
    +// Event types.
    +const (
    +	// An empty event.
    +	yaml_NO_EVENT yaml_event_type_t = iota
    +
    +	yaml_STREAM_START_EVENT   // A STREAM-START event.
    +	yaml_STREAM_END_EVENT     // A STREAM-END event.
    +	yaml_DOCUMENT_START_EVENT // A DOCUMENT-START event.
    +	yaml_DOCUMENT_END_EVENT   // A DOCUMENT-END event.
    +	yaml_ALIAS_EVENT          // An ALIAS event.
    +	yaml_SCALAR_EVENT         // A SCALAR event.
    +	yaml_SEQUENCE_START_EVENT // A SEQUENCE-START event.
    +	yaml_SEQUENCE_END_EVENT   // A SEQUENCE-END event.
    +	yaml_MAPPING_START_EVENT  // A MAPPING-START event.
    +	yaml_MAPPING_END_EVENT    // A MAPPING-END event.
    +)
    +
    +// The event structure.
    +type yaml_event_t struct {
    +
    +	// The event type.
    +	typ yaml_event_type_t
    +
    +	// The start and end of the event.
    +	start_mark, end_mark yaml_mark_t
    +
    +	// The document encoding (for yaml_STREAM_START_EVENT).
    +	encoding yaml_encoding_t
    +
    +	// The version directive (for yaml_DOCUMENT_START_EVENT).
    +	version_directive *yaml_version_directive_t
    +
    +	// The list of tag directives (for yaml_DOCUMENT_START_EVENT).
    +	tag_directives []yaml_tag_directive_t
    +
    +	// The anchor (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_ALIAS_EVENT).
    +	anchor []byte
    +
    +	// The tag (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT).
    +	tag []byte
    +
    +	// The scalar value (for yaml_SCALAR_EVENT).
    +	value []byte
    +
    +	// Is the document start/end indicator implicit, or the tag optional?
    +	// (for yaml_DOCUMENT_START_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_SCALAR_EVENT).
    +	implicit bool
    +
    +	// Is the tag optional for any non-plain style? (for yaml_SCALAR_EVENT).
    +	quoted_implicit bool
    +
    +	// The style (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT).
    +	style yaml_style_t
    +}
    +
    +func (e *yaml_event_t) scalar_style() yaml_scalar_style_t     { return yaml_scalar_style_t(e.style) }
    +func (e *yaml_event_t) sequence_style() yaml_sequence_style_t { return yaml_sequence_style_t(e.style) }
    +func (e *yaml_event_t) mapping_style() yaml_mapping_style_t   { return yaml_mapping_style_t(e.style) }
    +
    +// Nodes
    +
    +const (
    +	yaml_NULL_TAG      = "tag:yaml.org,2002:null"      // The tag !!null with the only possible value: null.
    +	yaml_BOOL_TAG      = "tag:yaml.org,2002:bool"      // The tag !!bool with the values: true and false.
    +	yaml_STR_TAG       = "tag:yaml.org,2002:str"       // The tag !!str for string values.
    +	yaml_INT_TAG       = "tag:yaml.org,2002:int"       // The tag !!int for integer values.
    +	yaml_FLOAT_TAG     = "tag:yaml.org,2002:float"     // The tag !!float for float values.
    +	yaml_TIMESTAMP_TAG = "tag:yaml.org,2002:timestamp" // The tag !!timestamp for date and time values.
    +
    +	yaml_SEQ_TAG = "tag:yaml.org,2002:seq" // The tag !!seq is used to denote sequences.
    +	yaml_MAP_TAG = "tag:yaml.org,2002:map" // The tag !!map is used to denote mapping.
    +
    +	// Not in original libyaml.
    +	yaml_BINARY_TAG = "tag:yaml.org,2002:binary"
    +	yaml_MERGE_TAG  = "tag:yaml.org,2002:merge"
    +
    +	yaml_DEFAULT_SCALAR_TAG   = yaml_STR_TAG // The default scalar tag is !!str.
    +	yaml_DEFAULT_SEQUENCE_TAG = yaml_SEQ_TAG // The default sequence tag is !!seq.
    +	yaml_DEFAULT_MAPPING_TAG  = yaml_MAP_TAG // The default mapping tag is !!map.
    +)
    +
    +type yaml_node_type_t int
    +
    +// Node types.
    +const (
    +	// An empty node.
    +	yaml_NO_NODE yaml_node_type_t = iota
    +
    +	yaml_SCALAR_NODE   // A scalar node.
    +	yaml_SEQUENCE_NODE // A sequence node.
    +	yaml_MAPPING_NODE  // A mapping node.
    +)
    +
    +// An element of a sequence node.
    +type yaml_node_item_t int
    +
    +// An element of a mapping node.
    +type yaml_node_pair_t struct {
    +	key   int // The key of the element.
    +	value int // The value of the element.
    +}
    +
    +// The node structure.
    +type yaml_node_t struct {
    +	typ yaml_node_type_t // The node type.
    +	tag []byte           // The node tag.
    +
    +	// The node data.
    +
    +	// The scalar parameters (for yaml_SCALAR_NODE).
    +	scalar struct {
    +		value  []byte              // The scalar value.
    +		length int                 // The length of the scalar value.
    +		style  yaml_scalar_style_t // The scalar style.
    +	}
    +
    +	// The sequence parameters (for YAML_SEQUENCE_NODE).
    +	sequence struct {
    +		items_data []yaml_node_item_t    // The stack of sequence items.
    +		style      yaml_sequence_style_t // The sequence style.
    +	}
    +
    +	// The mapping parameters (for yaml_MAPPING_NODE).
    +	mapping struct {
    +		pairs_data  []yaml_node_pair_t   // The stack of mapping pairs (key, value).
    +		pairs_start *yaml_node_pair_t    // The beginning of the stack.
    +		pairs_end   *yaml_node_pair_t    // The end of the stack.
    +		pairs_top   *yaml_node_pair_t    // The top of the stack.
    +		style       yaml_mapping_style_t // The mapping style.
    +	}
    +
    +	start_mark yaml_mark_t // The beginning of the node.
    +	end_mark   yaml_mark_t // The end of the node.
    +
    +}
    +
    +// The document structure.
    +type yaml_document_t struct {
    +
    +	// The document nodes.
    +	nodes []yaml_node_t
    +
    +	// The version directive.
    +	version_directive *yaml_version_directive_t
    +
    +	// The list of tag directives.
    +	tag_directives_data  []yaml_tag_directive_t
    +	tag_directives_start int // The beginning of the tag directives list.
    +	tag_directives_end   int // The end of the tag directives list.
    +
    +	start_implicit int // Is the document start indicator implicit?
    +	end_implicit   int // Is the document end indicator implicit?
    +
    +	// The start/end of the document.
    +	start_mark, end_mark yaml_mark_t
    +}
    +
    +// The prototype of a read handler.
    +//
    +// The read handler is called when the parser needs to read more bytes from the
    +// source. The handler should write not more than size bytes to the buffer.
    +// The number of written bytes should be set to the size_read variable.
    +//
    +// [in,out]   data        A pointer to an application data specified by
    +//                        yaml_parser_set_input().
    +// [out]      buffer      The buffer to write the data from the source.
    +// [in]       size        The size of the buffer.
    +// [out]      size_read   The actual number of bytes read from the source.
    +//
    +// On success, the handler should return 1.  If the handler failed,
    +// the returned value should be 0. On EOF, the handler should set the
    +// size_read to 0 and return 1.
    +type yaml_read_handler_t func(parser *yaml_parser_t, buffer []byte) (n int, err error)
    +
    +// This structure holds information about a potential simple key.
    +type yaml_simple_key_t struct {
    +	possible     bool        // Is a simple key possible?
    +	required     bool        // Is a simple key required?
    +	token_number int         // The number of the token.
    +	mark         yaml_mark_t // The position mark.
    +}
    +
    +// The states of the parser.
    +type yaml_parser_state_t int
    +
    +const (
    +	yaml_PARSE_STREAM_START_STATE yaml_parser_state_t = iota
    +
    +	yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE           // Expect the beginning of an implicit document.
    +	yaml_PARSE_DOCUMENT_START_STATE                    // Expect DOCUMENT-START.
    +	yaml_PARSE_DOCUMENT_CONTENT_STATE                  // Expect the content of a document.
    +	yaml_PARSE_DOCUMENT_END_STATE                      // Expect DOCUMENT-END.
    +	yaml_PARSE_BLOCK_NODE_STATE                        // Expect a block node.
    +	yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE // Expect a block node or indentless sequence.
    +	yaml_PARSE_FLOW_NODE_STATE                         // Expect a flow node.
    +	yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE        // Expect the first entry of a block sequence.
    +	yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE              // Expect an entry of a block sequence.
    +	yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE         // Expect an entry of an indentless sequence.
    +	yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE           // Expect the first key of a block mapping.
    +	yaml_PARSE_BLOCK_MAPPING_KEY_STATE                 // Expect a block mapping key.
    +	yaml_PARSE_BLOCK_MAPPING_VALUE_STATE               // Expect a block mapping value.
    +	yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE         // Expect the first entry of a flow sequence.
    +	yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE               // Expect an entry of a flow sequence.
    +	yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE   // Expect a key of an ordered mapping.
    +	yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE // Expect a value of an ordered mapping.
    +	yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE   // Expect the and of an ordered mapping entry.
    +	yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE            // Expect the first key of a flow mapping.
    +	yaml_PARSE_FLOW_MAPPING_KEY_STATE                  // Expect a key of a flow mapping.
    +	yaml_PARSE_FLOW_MAPPING_VALUE_STATE                // Expect a value of a flow mapping.
    +	yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE          // Expect an empty value of a flow mapping.
    +	yaml_PARSE_END_STATE                               // Expect nothing.
    +)
    +
    +func (ps yaml_parser_state_t) String() string {
    +	switch ps {
    +	case yaml_PARSE_STREAM_START_STATE:
    +		return "yaml_PARSE_STREAM_START_STATE"
    +	case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE:
    +		return "yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE"
    +	case yaml_PARSE_DOCUMENT_START_STATE:
    +		return "yaml_PARSE_DOCUMENT_START_STATE"
    +	case yaml_PARSE_DOCUMENT_CONTENT_STATE:
    +		return "yaml_PARSE_DOCUMENT_CONTENT_STATE"
    +	case yaml_PARSE_DOCUMENT_END_STATE:
    +		return "yaml_PARSE_DOCUMENT_END_STATE"
    +	case yaml_PARSE_BLOCK_NODE_STATE:
    +		return "yaml_PARSE_BLOCK_NODE_STATE"
    +	case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE:
    +		return "yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE"
    +	case yaml_PARSE_FLOW_NODE_STATE:
    +		return "yaml_PARSE_FLOW_NODE_STATE"
    +	case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE:
    +		return "yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE"
    +	case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE:
    +		return "yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE"
    +	case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE:
    +		return "yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE"
    +	case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE:
    +		return "yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE"
    +	case yaml_PARSE_BLOCK_MAPPING_KEY_STATE:
    +		return "yaml_PARSE_BLOCK_MAPPING_KEY_STATE"
    +	case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE:
    +		return "yaml_PARSE_BLOCK_MAPPING_VALUE_STATE"
    +	case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE:
    +		return "yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE"
    +	case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE:
    +		return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE"
    +	case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE:
    +		return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE"
    +	case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE:
    +		return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE"
    +	case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE:
    +		return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE"
    +	case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE:
    +		return "yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE"
    +	case yaml_PARSE_FLOW_MAPPING_KEY_STATE:
    +		return "yaml_PARSE_FLOW_MAPPING_KEY_STATE"
    +	case yaml_PARSE_FLOW_MAPPING_VALUE_STATE:
    +		return "yaml_PARSE_FLOW_MAPPING_VALUE_STATE"
    +	case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE:
    +		return "yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE"
    +	case yaml_PARSE_END_STATE:
    +		return "yaml_PARSE_END_STATE"
    +	}
    +	return ""
    +}
    +
    +// This structure holds aliases data.
    +type yaml_alias_data_t struct {
    +	anchor []byte      // The anchor.
    +	index  int         // The node id.
    +	mark   yaml_mark_t // The anchor mark.
    +}
    +
    +// The parser structure.
    +//
    +// All members are internal. Manage the structure using the
    +// yaml_parser_ family of functions.
    +type yaml_parser_t struct {
    +
    +	// Error handling
    +
    +	error yaml_error_type_t // Error type.
    +
    +	problem string // Error description.
    +
    +	// The byte about which the problem occured.
    +	problem_offset int
    +	problem_value  int
    +	problem_mark   yaml_mark_t
    +
    +	// The error context.
    +	context      string
    +	context_mark yaml_mark_t
    +
    +	// Reader stuff
    +
    +	read_handler yaml_read_handler_t // Read handler.
    +
    +	input_file io.Reader // File input data.
    +	input      []byte    // String input data.
    +	input_pos  int
    +
    +	eof bool // EOF flag
    +
    +	buffer     []byte // The working buffer.
    +	buffer_pos int    // The current position of the buffer.
    +
    +	unread int // The number of unread characters in the buffer.
    +
    +	raw_buffer     []byte // The raw buffer.
    +	raw_buffer_pos int    // The current position of the buffer.
    +
    +	encoding yaml_encoding_t // The input encoding.
    +
    +	offset int         // The offset of the current position (in bytes).
    +	mark   yaml_mark_t // The mark of the current position.
    +
    +	// Scanner stuff
    +
    +	stream_start_produced bool // Have we started to scan the input stream?
    +	stream_end_produced   bool // Have we reached the end of the input stream?
    +
    +	flow_level int // The number of unclosed '[' and '{' indicators.
    +
    +	tokens          []yaml_token_t // The tokens queue.
    +	tokens_head     int            // The head of the tokens queue.
    +	tokens_parsed   int            // The number of tokens fetched from the queue.
    +	token_available bool           // Does the tokens queue contain a token ready for dequeueing.
    +
    +	indent  int   // The current indentation level.
    +	indents []int // The indentation levels stack.
    +
    +	simple_key_allowed bool                // May a simple key occur at the current position?
    +	simple_keys        []yaml_simple_key_t // The stack of simple keys.
    +
    +	// Parser stuff
    +
    +	state          yaml_parser_state_t    // The current parser state.
    +	states         []yaml_parser_state_t  // The parser states stack.
    +	marks          []yaml_mark_t          // The stack of marks.
    +	tag_directives []yaml_tag_directive_t // The list of TAG directives.
    +
    +	// Dumper stuff
    +
    +	aliases []yaml_alias_data_t // The alias data.
    +
    +	document *yaml_document_t // The currently parsed document.
    +}
    +
    +// Emitter Definitions
    +
    +// The prototype of a write handler.
    +//
    +// The write handler is called when the emitter needs to flush the accumulated
    +// characters to the output.  The handler should write @a size bytes of the
    +// @a buffer to the output.
    +//
    +// @param[in,out]   data        A pointer to an application data specified by
    +//                              yaml_emitter_set_output().
    +// @param[in]       buffer      The buffer with bytes to be written.
    +// @param[in]       size        The size of the buffer.
    +//
    +// @returns On success, the handler should return @c 1.  If the handler failed,
    +// the returned value should be @c 0.
    +//
    +type yaml_write_handler_t func(emitter *yaml_emitter_t, buffer []byte) error
    +
    +type yaml_emitter_state_t int
    +
    +// The emitter states.
    +const (
    +	// Expect STREAM-START.
    +	yaml_EMIT_STREAM_START_STATE yaml_emitter_state_t = iota
    +
    +	yaml_EMIT_FIRST_DOCUMENT_START_STATE       // Expect the first DOCUMENT-START or STREAM-END.
    +	yaml_EMIT_DOCUMENT_START_STATE             // Expect DOCUMENT-START or STREAM-END.
    +	yaml_EMIT_DOCUMENT_CONTENT_STATE           // Expect the content of a document.
    +	yaml_EMIT_DOCUMENT_END_STATE               // Expect DOCUMENT-END.
    +	yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE   // Expect the first item of a flow sequence.
    +	yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE         // Expect an item of a flow sequence.
    +	yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE     // Expect the first key of a flow mapping.
    +	yaml_EMIT_FLOW_MAPPING_KEY_STATE           // Expect a key of a flow mapping.
    +	yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE  // Expect a value for a simple key of a flow mapping.
    +	yaml_EMIT_FLOW_MAPPING_VALUE_STATE         // Expect a value of a flow mapping.
    +	yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE  // Expect the first item of a block sequence.
    +	yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE        // Expect an item of a block sequence.
    +	yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE    // Expect the first key of a block mapping.
    +	yaml_EMIT_BLOCK_MAPPING_KEY_STATE          // Expect the key of a block mapping.
    +	yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a block mapping.
    +	yaml_EMIT_BLOCK_MAPPING_VALUE_STATE        // Expect a value of a block mapping.
    +	yaml_EMIT_END_STATE                        // Expect nothing.
    +)
    +
    +// The emitter structure.
    +//
    +// All members are internal.  Manage the structure using the @c yaml_emitter_
    +// family of functions.
    +type yaml_emitter_t struct {
    +
    +	// Error handling
    +
    +	error   yaml_error_type_t // Error type.
    +	problem string            // Error description.
    +
    +	// Writer stuff
    +
    +	write_handler yaml_write_handler_t // Write handler.
    +
    +	output_buffer *[]byte   // String output data.
    +	output_file   io.Writer // File output data.
    +
    +	buffer     []byte // The working buffer.
    +	buffer_pos int    // The current position of the buffer.
    +
    +	raw_buffer     []byte // The raw buffer.
    +	raw_buffer_pos int    // The current position of the buffer.
    +
    +	encoding yaml_encoding_t // The stream encoding.
    +
    +	// Emitter stuff
    +
    +	canonical   bool         // If the output is in the canonical style?
    +	best_indent int          // The number of indentation spaces.
    +	best_width  int          // The preferred width of the output lines.
    +	unicode     bool         // Allow unescaped non-ASCII characters?
    +	line_break  yaml_break_t // The preferred line break.
    +
    +	state  yaml_emitter_state_t   // The current emitter state.
    +	states []yaml_emitter_state_t // The stack of states.
    +
    +	events      []yaml_event_t // The event queue.
    +	events_head int            // The head of the event queue.
    +
    +	indents []int // The stack of indentation levels.
    +
    +	tag_directives []yaml_tag_directive_t // The list of tag directives.
    +
    +	indent int // The current indentation level.
    +
    +	flow_level int // The current flow level.
    +
    +	root_context       bool // Is it the document root context?
    +	sequence_context   bool // Is it a sequence context?
    +	mapping_context    bool // Is it a mapping context?
    +	simple_key_context bool // Is it a simple mapping key context?
    +
    +	line       int  // The current line.
    +	column     int  // The current column.
    +	whitespace bool // If the last character was a whitespace?
    +	indention  bool // If the last character was an indentation character (' ', '-', '?', ':')?
    +	open_ended bool // If an explicit document end is required?
    +
    +	// Anchor analysis.
    +	anchor_data struct {
    +		anchor []byte // The anchor value.
    +		alias  bool   // Is it an alias?
    +	}
    +
    +	// Tag analysis.
    +	tag_data struct {
    +		handle []byte // The tag handle.
    +		suffix []byte // The tag suffix.
    +	}
    +
    +	// Scalar analysis.
    +	scalar_data struct {
    +		value                 []byte              // The scalar value.
    +		multiline             bool                // Does the scalar contain line breaks?
    +		flow_plain_allowed    bool                // Can the scalar be expessed in the flow plain style?
    +		block_plain_allowed   bool                // Can the scalar be expressed in the block plain style?
    +		single_quoted_allowed bool                // Can the scalar be expressed in the single quoted style?
    +		block_allowed         bool                // Can the scalar be expressed in the literal or folded styles?
    +		style                 yaml_scalar_style_t // The output style.
    +	}
    +
    +	// Dumper stuff
    +
    +	opened bool // If the stream was already opened?
    +	closed bool // If the stream was already closed?
    +
    +	// The information associated with the document nodes.
    +	anchors *struct {
    +		references int  // The number of references.
    +		anchor     int  // The anchor id.
    +		serialized bool // If the node has been emitted?
    +	}
    +
    +	last_anchor_id int // The last assigned anchor id.
    +
    +	document *yaml_document_t // The currently emitted document.
    +}
    diff --git a/vendor/gopkg.in/yaml.v2/yamlprivateh.go b/vendor/gopkg.in/yaml.v2/yamlprivateh.go
    new file mode 100644
    index 0000000000..8110ce3c37
    --- /dev/null
    +++ b/vendor/gopkg.in/yaml.v2/yamlprivateh.go
    @@ -0,0 +1,173 @@
    +package yaml
    +
    +const (
    +	// The size of the input raw buffer.
    +	input_raw_buffer_size = 512
    +
    +	// The size of the input buffer.
    +	// It should be possible to decode the whole raw buffer.
    +	input_buffer_size = input_raw_buffer_size * 3
    +
    +	// The size of the output buffer.
    +	output_buffer_size = 128
    +
    +	// The size of the output raw buffer.
    +	// It should be possible to encode the whole output buffer.
    +	output_raw_buffer_size = (output_buffer_size*2 + 2)
    +
    +	// The size of other stacks and queues.
    +	initial_stack_size  = 16
    +	initial_queue_size  = 16
    +	initial_string_size = 16
    +)
    +
    +// Check if the character at the specified position is an alphabetical
    +// character, a digit, '_', or '-'.
    +func is_alpha(b []byte, i int) bool {
    +	return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'Z' || b[i] >= 'a' && b[i] <= 'z' || b[i] == '_' || b[i] == '-'
    +}
    +
    +// Check if the character at the specified position is a digit.
    +func is_digit(b []byte, i int) bool {
    +	return b[i] >= '0' && b[i] <= '9'
    +}
    +
    +// Get the value of a digit.
    +func as_digit(b []byte, i int) int {
    +	return int(b[i]) - '0'
    +}
    +
    +// Check if the character at the specified position is a hex-digit.
    +func is_hex(b []byte, i int) bool {
    +	return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'F' || b[i] >= 'a' && b[i] <= 'f'
    +}
    +
    +// Get the value of a hex-digit.
    +func as_hex(b []byte, i int) int {
    +	bi := b[i]
    +	if bi >= 'A' && bi <= 'F' {
    +		return int(bi) - 'A' + 10
    +	}
    +	if bi >= 'a' && bi <= 'f' {
    +		return int(bi) - 'a' + 10
    +	}
    +	return int(bi) - '0'
    +}
    +
    +// Check if the character is ASCII.
    +func is_ascii(b []byte, i int) bool {
    +	return b[i] <= 0x7F
    +}
    +
    +// Check if the character at the start of the buffer can be printed unescaped.
    +func is_printable(b []byte, i int) bool {
    +	return ((b[i] == 0x0A) || // . == #x0A
    +		(b[i] >= 0x20 && b[i] <= 0x7E) || // #x20 <= . <= #x7E
    +		(b[i] == 0xC2 && b[i+1] >= 0xA0) || // #0xA0 <= . <= #xD7FF
    +		(b[i] > 0xC2 && b[i] < 0xED) ||
    +		(b[i] == 0xED && b[i+1] < 0xA0) ||
    +		(b[i] == 0xEE) ||
    +		(b[i] == 0xEF && // #xE000 <= . <= #xFFFD
    +			!(b[i+1] == 0xBB && b[i+2] == 0xBF) && // && . != #xFEFF
    +			!(b[i+1] == 0xBF && (b[i+2] == 0xBE || b[i+2] == 0xBF))))
    +}
    +
    +// Check if the character at the specified position is NUL.
    +func is_z(b []byte, i int) bool {
    +	return b[i] == 0x00
    +}
    +
    +// Check if the beginning of the buffer is a BOM.
    +func is_bom(b []byte, i int) bool {
    +	return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF
    +}
    +
    +// Check if the character at the specified position is space.
    +func is_space(b []byte, i int) bool {
    +	return b[i] == ' '
    +}
    +
    +// Check if the character at the specified position is tab.
    +func is_tab(b []byte, i int) bool {
    +	return b[i] == '\t'
    +}
    +
    +// Check if the character at the specified position is blank (space or tab).
    +func is_blank(b []byte, i int) bool {
    +	//return is_space(b, i) || is_tab(b, i)
    +	return b[i] == ' ' || b[i] == '\t'
    +}
    +
    +// Check if the character at the specified position is a line break.
    +func is_break(b []byte, i int) bool {
    +	return (b[i] == '\r' || // CR (#xD)
    +		b[i] == '\n' || // LF (#xA)
    +		b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
    +		b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
    +		b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9) // PS (#x2029)
    +}
    +
    +func is_crlf(b []byte, i int) bool {
    +	return b[i] == '\r' && b[i+1] == '\n'
    +}
    +
    +// Check if the character is a line break or NUL.
    +func is_breakz(b []byte, i int) bool {
    +	//return is_break(b, i) || is_z(b, i)
    +	return (        // is_break:
    +	b[i] == '\r' || // CR (#xD)
    +		b[i] == '\n' || // LF (#xA)
    +		b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
    +		b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
    +		b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
    +		// is_z:
    +		b[i] == 0)
    +}
    +
    +// Check if the character is a line break, space, or NUL.
    +func is_spacez(b []byte, i int) bool {
    +	//return is_space(b, i) || is_breakz(b, i)
    +	return ( // is_space:
    +	b[i] == ' ' ||
    +		// is_breakz:
    +		b[i] == '\r' || // CR (#xD)
    +		b[i] == '\n' || // LF (#xA)
    +		b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
    +		b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
    +		b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
    +		b[i] == 0)
    +}
    +
    +// Check if the character is a line break, space, tab, or NUL.
    +func is_blankz(b []byte, i int) bool {
    +	//return is_blank(b, i) || is_breakz(b, i)
    +	return ( // is_blank:
    +	b[i] == ' ' || b[i] == '\t' ||
    +		// is_breakz:
    +		b[i] == '\r' || // CR (#xD)
    +		b[i] == '\n' || // LF (#xA)
    +		b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85)
    +		b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028)
    +		b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029)
    +		b[i] == 0)
    +}
    +
    +// Determine the width of the character.
    +func width(b byte) int {
    +	// Don't replace these by a switch without first
    +	// confirming that it is being inlined.
    +	if b&0x80 == 0x00 {
    +		return 1
    +	}
    +	if b&0xE0 == 0xC0 {
    +		return 2
    +	}
    +	if b&0xF0 == 0xE0 {
    +		return 3
    +	}
    +	if b&0xF8 == 0xF0 {
    +		return 4
    +	}
    +	return 0
    +
    +}
    diff --git a/version/version.go b/version/version.go
    new file mode 100644
    index 0000000000..985720b2e9
    --- /dev/null
    +++ b/version/version.go
    @@ -0,0 +1,12 @@
    +// Copyright 2016 The OPA Authors.  All rights reserved.
    +// Use of this source code is governed by an Apache2
    +// license that can be found in the LICENSE file.
    +
    +package version
    +
    +var (
    +	Version   = "0.1.0-dev"
    +	Vcs       = ""
    +	Timestamp = ""
    +	Hostname  = ""
    +)